ZGlmZiAtLWdpdCBhLzEuNS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYuYmFzZS5mZWF0dXJlLy5wcm9qZWN0IGIvMS41L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5iYXNlLmZlYXR1cmUvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhNzk3YWQuLjAwMDAwMDAKLS0tIGEvMS41L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5iYXNlLmZlYXR1cmUvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5lcGYuYmFzZS5mZWF0dXJlPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZU5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5iYXNlLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcyBiLzEuNS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYuYmFzZS5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3ZjRkMmUuLjAwMDAwMDAKLS0tIGEvMS41L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5iYXNlLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotYmluLmluY2x1ZGVzID0gZmVhdHVyZS54bWwsXAotICAgICAgICAgICAgICAgZmVhdHVyZS5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIGVjbGlwc2VfdXBkYXRlXzEyMC5qcGcsXAotICAgICAgICAgICAgICAgbGljZW5zZS5odG1sCmRpZmYgLS1naXQgYS8xLjUvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLmJhc2UuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnIGIvMS41L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5iYXNlLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZkZjcwOC4uMDAwMDAwMAotLS0gYS8xLjUvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLmJhc2UuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5iYXNlLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzIGIvMS41L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5iYXNlLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZGQyYzQyLi4wMDAwMDAwCi0tLSBhLzEuNS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYuYmFzZS5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSCi0KLWZlYXR1cmVOYW1lPUVQRiBCYXNlIEZlYXR1cmUKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotZGVzY3JpcHRpb249RVBGIEJhc2UgRmVhdHVyZS4KLXVwZGF0ZVNpdGVOYW1lPUVQRiBGZWF0dXJlIFVwZGF0ZXMKLWNvcHlyaWdodD0oYykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIGFuZCBvdGhlcnMgMjAwMCwgMjAwOC4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi1saWNlbnNlVVJMPWxpY2Vuc2UuaHRtbAotbGljZW5zZVRleHQ9VXNlIG9mIHRoaXMgZmVhdHVyZSBpcyBzdWJqZWN0IHRvIHRoZSBzYW1lIHRlcm1zIGFuZCBjb25kaXRpb25zIHdoaWNoIGdvdmVybiB0aGUgdXNlIG9mIHRoZSBQcm9kdWN0IHdoaWNoIGluY2x1ZGVkIHRoaXMgZmVhdHVyZS4KZGlmZiAtLWdpdCBhLzEuNS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYuYmFzZS5mZWF0dXJlL2ZlYXR1cmUueG1sIGIvMS41L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5iYXNlLmZlYXR1cmUvZmVhdHVyZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiYjVlYjEuLjAwMDAwMDAKLS0tIGEvMS41L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5iYXNlLmZlYXR1cmUvZmVhdHVyZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMjEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxmZWF0dXJlCi0gICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmJhc2UuZmVhdHVyZSIKLSAgICAgIGxhYmVsPSIlZmVhdHVyZU5hbWUiCi0gICAgICB2ZXJzaW9uPSIxLjUuMC5xdWFsaWZpZXIiCi0gICAgICBwcm92aWRlci1uYW1lPSIlcHJvdmlkZXJOYW1lIgotICAgICAgcGx1Z2luPSJvcmcuZWNsaXBzZS5lcGYuYmFzZSIKLSAgICAgIGltYWdlPSJlY2xpcHNlX3VwZGF0ZV8xMjAuanBnIj4KLQotICAgPGRlc2NyaXB0aW9uPgotICAgICAgJWRlc2NyaXB0aW9uCi0gICA8L2Rlc2NyaXB0aW9uPgotCi0gICA8Y29weXJpZ2h0PgotICAgICAgJWNvcHlyaWdodAotICAgPC9jb3B5cmlnaHQ+Ci0KLSAgIDxsaWNlbnNlIHVybD0iJWxpY2Vuc2VVUkwiPgotICAgICAgJWxpY2Vuc2VUZXh0Ci0gICA8L2xpY2Vuc2U+Ci0KLSAgIDxpbmNsdWRlcwotICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5mZWF0dXJlIgotICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotICAgPHJlcXVpcmVzPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuZHJhdzJkIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuZ2VmIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UudWkuY2hlYXRzaGVldHMiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS51aS5mb3JtcyIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnVpLmludHJvIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS51aS53b3JrYmVuY2gudGV4dGVkaXRvciIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnRlYW0uY3ZzLnVpIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0iY29tLmlibS5pY3UiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS51aSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnN3dCIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5hcGFjaGUuYW50Ii8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51aSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmVtZi5tYXBwaW5nLmVjb3JlMmVjb3JlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuZW1mLm1hcHBpbmcuZWNvcmUyeG1sIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuY29yZS5maWxlYnVmZmVycyIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmpmYWNlLnRleHQiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS51aS5pZGUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5vc2dpIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuaGVscC5iYXNlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmFwYWNoZS5sdWNlbmUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5zZWFyY2giLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuc2RvIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuZW1mLmVkaXQiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5lbWYudmFsaWRhdGlvbiIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmVwZi5jb21tb24iLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpIi8+Ci0gICA8L3JlcXVpcmVzPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmJhc2UiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmV4cG9ydCIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC51aSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuaW1wb3J0IgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYubGlicmFyeSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdCIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS54bWkiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0IgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmciCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLnNlYXJjaCIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuc2VydmljZXMiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYudWkiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYudWkuaW50cm8iCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi51bWEiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0IgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYudmFsaWRhdGlvbiIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi54bWwudW1hIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5lZGl0IgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZCIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYubWlncmF0aW9uLmRpYWdyYW0iCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS51aSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudWkiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnNlcnZpY2UiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLTwvZmVhdHVyZT4KZGlmZiAtLWdpdCBhLzEuNS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYuYmFzZS5mZWF0dXJlL2xpY2Vuc2UuaHRtbCBiLzEuNS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYuYmFzZS5mZWF0dXJlL2xpY2Vuc2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzZhZjk2Ni4uMDAwMDAwMAotLS0gYS8xLjUvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLmJhc2UuZmVhdHVyZS9saWNlbnNlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPHRpdGxlPkVjbGlwc2Uub3JnIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC90aXRsZT4KLTwvaGVhZD4KLQotPGJvZHkgbGFuZz0iRU4tVVMiIGxpbms9Ymx1ZSB2bGluaz1wdXJwbGU+Ci08aDI+RWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9oMj4KLTxwPk1hcmNoIDE3LCAyMDA1PC9wPgotCi08aDM+VXNhZ2UgT2YgQ29udGVudDwvaDM+Ci0KLTxwPlRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1IgT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUwotICAgKENPTExFQ1RJVkVMWSAmcXVvdDtDT05URU5UJnF1b3Q7KS4gIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQKLSAgIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UKLSAgIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SCi0gICBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQKLSAgIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULjwvcD4KLSAgIAotPGgzPkFwcGxpY2FibGUgTGljZW5zZXM8L2gzPiAgIAotICAgCi08cD5Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wCi0gICAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyBDb250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotICAgRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+Q29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsIGRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWUyByZXBvc2l0b3J5ICgmcXVvdDtSZXBvc2l0b3J5JnF1b3Q7KSBpbiBDVlMKLSAgIG1vZHVsZXMgKCZxdW90O01vZHVsZXMmcXVvdDspIGFuZCBtYWRlIGF2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCZxdW90O0Rvd25sb2FkcyZxdW90OykuPC9wPgotICAgCi08dWw+Ci0JPGxpPkNvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoJnF1b3Q7UGx1Zy1pbnMmcXVvdDspLCBwbHVnLWluIGZyYWdtZW50cyAoJnF1b3Q7RnJhZ21lbnRzJnF1b3Q7KSwgYW5kIGZlYXR1cmVzICgmcXVvdDtGZWF0dXJlcyZxdW90OykuPC9saT4KLQk8bGk+RWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhJnRyYWRlOyBBUmNoaXZlKSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtwbHVnaW5zJnF1b3Q7LjwvbGk+Ci0JPGxpPkEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLiAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7ZmVhdHVyZXMmcXVvdDsuICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zCi0gICAgICBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuPC9saT4KLQk8bGk+RmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoJnF1b3Q7SW5jbHVkZWQgRmVhdHVyZXMmcXVvdDspLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuPC9saT4KLTwvdWw+ICAgCi0gCi08cD5UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDthYm91dC5odG1sJnF1b3Q7ICgmcXVvdDtBYm91dHMmcXVvdDspLiBUaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZAotSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDtsaWNlbnNlLmh0bWwmcXVvdDsgKCZxdW90O0ZlYXR1cmUgTGljZW5zZXMmcXVvdDspLiAgQWJvdXRzIGFuZCBGZWF0dXJlIExpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGUKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOjwvcD4KLQotPHVsPgotCTxsaT5UaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3Rvcnk8L2xpPgotCTxsaT5QbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllczwvbGk+Ci0JPGxpPkluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnM8L2xpPgotCTxsaT5TdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtzcmMmcXVvdDsgb2YgY2VydGFpbiBQbHVnLWluczwvbGk+Ci0JPGxpPkZlYXR1cmUgZGlyZWN0b3JpZXM8L2xpPgotPC91bD4KLQkJCi08cD5Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlIEVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoJnF1b3Q7RmVhdHVyZSBVcGRhdGUgTGljZW5zZSZxdW90OykgZHVyaW5nIHRoZQotaW5zdGFsbGF0aW9uIHByb2Nlc3MuICBJZiB0aGUgRmVhdHVyZSBjb250YWlucyBJbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdSB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yCi1pbmZvcm0geW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uICBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlICZxdW90O2xpY2Vuc2UmcXVvdDsgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS5wcm9wZXJ0aWVzJnF1b3Q7IGZvdW5kIHdpdGhpbiBhIEZlYXR1cmUuCi1TdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcywgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4KLXRoYXQgZGlyZWN0b3J5LjwvcD4KLQotPHA+VEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUywgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUiBUTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy4gIFNPTUUgT0YgVEhFU0UKLU9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6PC9wPgotCi08dWw+Ci0JPGxpPkNvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvYT4pPC9saT4KLQk8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFPC9hPik8L2xpPgotCTxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMDwvYT4pPC9saT4KLQk8bGk+SUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sIj5odHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbDwvYT4pPC9saT4JCi0JPGxpPk1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sIj5odHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbDwvYT4pPC9saT4KLQk8bGk+TW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbCI+aHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sPC9hPik8L2xpPgotPC91bD4KLQotPHA+SVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUiBUTyBVU0UgT0YgVEhFIENPTlRFTlQuICBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlLCBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIGlzIHByb3ZpZGVkLCBwbGVhc2UKLWNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuPC9wPgotCi08aDM+Q3J5cHRvZ3JhcGh5PC9oMz4KLQotPHA+Q29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlIGN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSwgYW5kL29yIHJlLWV4cG9ydCB0bwotICAgYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkUgdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsIHJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsCi0gICBwb3NzZXNzaW9uLCBvciB1c2UsIGFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLjwvcD4KLSAgIAotPHNtYWxsPkphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLjwvc21hbGw+ICAgCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS8xLjUvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLmRvYy5mZWF0dXJlLy5wcm9qZWN0IGIvMS41L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5kb2MuZmVhdHVyZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzk5YjUxNC4uMDAwMDAwMAotLS0gYS8xLjUvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLmRvYy5mZWF0dXJlLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuZXBmLmRvYy5mZWF0dXJlPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZU5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5kb2MuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzIGIvMS41L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5kb2MuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmN2Y0ZDJlLi4wMDAwMDAwCi0tLSBhLzEuNS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYuZG9jLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotYmluLmluY2x1ZGVzID0gZmVhdHVyZS54bWwsXAotICAgICAgICAgICAgICAgZmVhdHVyZS5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIGVjbGlwc2VfdXBkYXRlXzEyMC5qcGcsXAotICAgICAgICAgICAgICAgbGljZW5zZS5odG1sCmRpZmYgLS1naXQgYS8xLjUvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLmRvYy5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcgYi8xLjUvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLmRvYy5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmZGY3MDguLjAwMDAwMDAKLS0tIGEvMS41L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5kb2MuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5kb2MuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMgYi8xLjUvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLmRvYy5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzllYTIyMS4uMDAwMDAwMAotLS0gYS8xLjUvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLmRvYy5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSCi0KLWZlYXR1cmVOYW1lPUVQRiBEb2MgRmVhdHVyZQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCi1kZXNjcmlwdGlvbj1FUEYgRG9jdW1lbnRhdGlvbiBGZWF0dXJlLgotdXBkYXRlU2l0ZU5hbWU9RVBGIEZlYXR1cmUgVXBkYXRlcwotY29weXJpZ2h0PShjKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgYW5kIG90aGVycyAyMDAwLCAyMDA4LiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLWxpY2Vuc2VVUkw9bGljZW5zZS5odG1sCi1saWNlbnNlVGV4dD1Vc2Ugb2YgdGhpcyBmZWF0dXJlIGlzIHN1YmplY3QgdG8gdGhlIHNhbWUgdGVybXMgYW5kIGNvbmRpdGlvbnMgd2hpY2ggZ292ZXJuIHRoZSB1c2Ugb2YgdGhlIFByb2R1Y3Qgd2hpY2ggaW5jbHVkZWQgdGhpcyBmZWF0dXJlLgpkaWZmIC0tZ2l0IGEvMS41L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5kb2MuZmVhdHVyZS9mZWF0dXJlLnhtbCBiLzEuNS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYuZG9jLmZlYXR1cmUvZmVhdHVyZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzMzU3YjIuLjAwMDAwMDAKLS0tIGEvMS41L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5kb2MuZmVhdHVyZS9mZWF0dXJlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZmVhdHVyZQotICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5kb2MuZmVhdHVyZSIKLSAgICAgIGxhYmVsPSIlZmVhdHVyZU5hbWUiCi0gICAgICB2ZXJzaW9uPSIxLjIuMC5xdWFsaWZpZXIiCi0gICAgICBwcm92aWRlci1uYW1lPSIlcHJvdmlkZXJOYW1lIgotICAgICAgcGx1Z2luPSJvcmcuZWNsaXBzZS5lcGYuZG9jIgotICAgICAgaW1hZ2U9ImVjbGlwc2VfdXBkYXRlXzEyMC5qcGciPgotCi0gICA8ZGVzY3JpcHRpb24+Ci0gICAgICAlZGVzY3JpcHRpb24KLSAgIDwvZGVzY3JpcHRpb24+Ci0KLSAgIDxjb3B5cmlnaHQ+Ci0gICAgICAlY29weXJpZ2h0Ci0gICA8L2NvcHlyaWdodD4KLQotICAgPGxpY2Vuc2UgdXJsPSIlbGljZW5zZVVSTCI+Ci0gICAgICAlbGljZW5zZVRleHQKLSAgIDwvbGljZW5zZT4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5kb2MiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotPC9mZWF0dXJlPgpkaWZmIC0tZ2l0IGEvMS41L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5kb2MuZmVhdHVyZS9saWNlbnNlLmh0bWwgYi8xLjUvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLmRvYy5mZWF0dXJlL2xpY2Vuc2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzZhZjk2Ni4uMDAwMDAwMAotLS0gYS8xLjUvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLmRvYy5mZWF0dXJlL2xpY2Vuc2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08dGl0bGU+RWNsaXBzZS5vcmcgU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L3RpdGxlPgotPC9oZWFkPgotCi08Ym9keSBsYW5nPSJFTi1VUyIgbGluaz1ibHVlIHZsaW5rPXB1cnBsZT4KLTxoMj5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L2gyPgotPHA+TWFyY2ggMTcsIDIwMDU8L3A+Ci0KLTxoMz5Vc2FnZSBPZiBDb250ZW50PC9oMz4KLQotPHA+VEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTCi0gICAoQ09MTEVDVElWRUxZICZxdW90O0NPTlRFTlQmcXVvdDspLiAgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORAotICAgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1UgQUdSRUUgVEhBVCBZT1VSIFVTRQotICAgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IKLSAgIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORAotICAgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuPC9wPgotICAgCi08aDM+QXBwbGljYWJsZSBMaWNlbnNlczwvaDM+ICAgCi0gICAKLTxwPlVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAKLSAgICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzIENvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi0gICBGb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSwgZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTIHJlcG9zaXRvcnkgKCZxdW90O1JlcG9zaXRvcnkmcXVvdDspIGluIENWUwotICAgbW9kdWxlcyAoJnF1b3Q7TW9kdWxlcyZxdW90OykgYW5kIG1hZGUgYXZhaWxhYmxlIGFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoJnF1b3Q7RG93bmxvYWRzJnF1b3Q7KS48L3A+Ci0gICAKLTx1bD4KLQk8bGk+Q29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZywgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiAgVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgmcXVvdDtQbHVnLWlucyZxdW90OyksIHBsdWctaW4gZnJhZ21lbnRzICgmcXVvdDtGcmFnbWVudHMmcXVvdDspLCBhbmQgZmVhdHVyZXMgKCZxdW90O0ZlYXR1cmVzJnF1b3Q7KS48L2xpPgotCTxsaT5FYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmEmdHJhZGU7IEFSY2hpdmUpIGluIGEgZGlyZWN0b3J5IG5hbWVkICZxdW90O3BsdWdpbnMmcXVvdDsuPC9saT4KLQk8bGk+QSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtmZWF0dXJlcyZxdW90Oy4gIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMKLSAgICAgIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS48L2xpPgotCTxsaT5GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgmcXVvdDtJbmNsdWRlZCBGZWF0dXJlcyZxdW90OykuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy48L2xpPgotPC91bD4gICAKLSAKLTxwPlRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2Fib3V0Lmh0bWwmcXVvdDsgKCZxdW90O0Fib3V0cyZxdW90OykuIFRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kCi1JbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2xpY2Vuc2UuaHRtbCZxdW90OyAoJnF1b3Q7RmVhdHVyZSBMaWNlbnNlcyZxdW90OykuICBBYm91dHMgYW5kIEZlYXR1cmUgTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZQotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6PC9wPgotCi08dWw+Ci0JPGxpPlRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeTwvbGk+Ci0JPGxpPlBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzPC9saT4KLQk8bGk+SW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSczwvbGk+Ci0JPGxpPlN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICZxdW90O3NyYyZxdW90OyBvZiBjZXJ0YWluIFBsdWctaW5zPC9saT4KLQk8bGk+RmVhdHVyZSBkaXJlY3RvcmllczwvbGk+Ci08L3VsPgotCQkKLTxwPk5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGUgRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgmcXVvdDtGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlJnF1b3Q7KSBkdXJpbmcgdGhlCi1pbnN0YWxsYXRpb24gcHJvY2Vzcy4gIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91IHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IKLWluZm9ybSB5b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpbiB0aGUgJnF1b3Q7bGljZW5zZSZxdW90OyBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnByb3BlcnRpZXMmcXVvdDsgZm91bmQgd2l0aGluIGEgRmVhdHVyZS4KLVN1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzLCBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbgotdGhhdCBkaXJlY3RvcnkuPC9wPgotCi08cD5USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTLCBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSIFRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLiAgU09NRSBPRiBUSEVTRQotT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTo8L3A+Ci0KLTx1bD4KLQk8bGk+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sPC9hPik8L2xpPgotCTxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0U8L2E+KTwvbGk+Ci0JPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wPC9hPik8L2xpPgotCTxsaT5JQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwiPmh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sPC9hPik8L2xpPgkKLQk8bGk+TWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwiPmh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sPC9hPik8L2xpPgotCTxsaT5Nb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sIj5odHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWw8L2E+KTwvbGk+Ci08L3VsPgotCi08cD5JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SIFRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2UsIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UgaXMgcHJvdmlkZWQsIHBsZWFzZQotY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC48L3A+Ci0KLTxoMz5DcnlwdG9ncmFwaHk8L2gzPgotCi08cD5Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmUgY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLCBhbmQvb3IgcmUtZXhwb3J0IHRvCi0gICBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRSB1c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywgcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwKLSAgIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuPC9wPgotICAgCi08c21hbGw+SmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguPC9zbWFsbD4gICAKLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhLzEuNS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0uZmVhdHVyZS8ucHJvamVjdCBiLzEuNS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0uZmVhdHVyZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzgxM2QyNi4uMDAwMDAwMAotLS0gYS8xLjUvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtLmZlYXR1cmUvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0uZmVhdHVyZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVOYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0uZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzIGIvMS41L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3ZjRkMmUuLjAwMDAwMDAKLS0tIGEvMS41L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLWJpbi5pbmNsdWRlcyA9IGZlYXR1cmUueG1sLFwKLSAgICAgICAgICAgICAgIGZlYXR1cmUucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBlY2xpcHNlX3VwZGF0ZV8xMjAuanBnLFwKLSAgICAgICAgICAgICAgIGxpY2Vuc2UuaHRtbApkaWZmIC0tZ2l0IGEvMS41L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcgYi8xLjUvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZkZjcwOC4uMDAwMDAwMAotLS0gYS8xLjUvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0uZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMgYi8xLjUvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNzViOTI2Li4wMDAwMDAwCi0tLSBhLzEuNS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0uZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUgotCi1mZWF0dXJlTmFtZT1FUEYgUGxhdGZvcm0gRmVhdHVyZQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCi1kZXNjcmlwdGlvbj1FUEYgUGxhdGZvcm0gRmVhdHVyZS4KLXVwZGF0ZVNpdGVOYW1lPUVQRiBGZWF0dXJlIFVwZGF0ZXMKLWNvcHlyaWdodD0oYykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIGFuZCBvdGhlcnMgMjAwMCwgMjAwOC4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi1saWNlbnNlVVJMPWxpY2Vuc2UuaHRtbAotbGljZW5zZVRleHQ9VXNlIG9mIHRoaXMgZmVhdHVyZSBpcyBzdWJqZWN0IHRvIHRoZSBzYW1lIHRlcm1zIGFuZCBjb25kaXRpb25zIHdoaWNoIGdvdmVybiB0aGUgdXNlIG9mIHRoZSBQcm9kdWN0IHdoaWNoIGluY2x1ZGVkIHRoaXMgZmVhdHVyZS4KZGlmZiAtLWdpdCBhLzEuNS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0uZmVhdHVyZS9mZWF0dXJlLnhtbCBiLzEuNS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0uZmVhdHVyZS9mZWF0dXJlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGEwMDg5OS4uMDAwMDAwMAotLS0gYS8xLjUvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtLmZlYXR1cmUvZmVhdHVyZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMzY0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZmVhdHVyZQotICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS5mZWF0dXJlIgotICAgICAgbGFiZWw9IiVmZWF0dXJlTmFtZSIKLSAgICAgIHZlcnNpb249IjEuMi4wLnF1YWxpZmllciIKLSAgICAgIHByb3ZpZGVyLW5hbWU9IiVwcm92aWRlck5hbWUiCi0gICAgICBwbHVnaW49Im9yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybSIKLSAgICAgIGltYWdlPSJlY2xpcHNlX3VwZGF0ZV8xMjAuanBnIj4KLQotICAgPGRlc2NyaXB0aW9uPgotICAgICAgJWRlc2NyaXB0aW9uCi0gICA8L2Rlc2NyaXB0aW9uPgotCi0gICA8Y29weXJpZ2h0PgotICAgICAgJWNvcHlyaWdodAotICAgPC9jb3B5cmlnaHQ+Ci0KLSAgIDxsaWNlbnNlIHVybD0iJWxpY2Vuc2VVUkwiPgotICAgICAgJWxpY2Vuc2VUZXh0Ci0gICA8L2xpY2Vuc2U+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0iCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJjb20uamNyYWZ0LmpzY2giCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJqYXZheC5zZXJ2bGV0IgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0iamF2YXguc2VydmxldC5qc3AiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuYXBhY2hlLmphc3BlciIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5hcGFjaGUuY29tbW9ucy5lbCIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmFwYWNoZS5hbnQiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5hcGFjaGUubHVjZW5lIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmFwYWNoZS5sdWNlbmUuYW5hbHlzaXMiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5hbnQuY29yZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmNvbXBhcmUiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5jb3JlLmJvb3QiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5jb3JlLmZpbGVidWZmZXJzIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuY29yZS5maWxlc3lzdGVtIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuY29yZS5uZXQiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLmNvbXBhdGliaWxpdHkiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICBmcmFnbWVudD0idHJ1ZSIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb21wYXRpYmlsaXR5IgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlcyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmNvcmUudmFyaWFibGVzIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZGVidWcuY29yZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmRlYnVnLnVpIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXF1aW5veC5odHRwLnJlZ2lzdHJ5IgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXF1aW5veC5odHRwLmpldHR5IgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXF1aW5veC5odHRwLnNlcnZsZXQiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcXVpbm94LmpzcC5qYXNwZXIiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcXVpbm94LmpzcC5qYXNwZXIucmVnaXN0cnkiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5oZWxwLndlYmFwcCIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmhlbHAuYmFzZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmhlbHAudWkiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5oZWxwLmFwcHNlcnZlciIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UubHRrLnVpLnJlZmFjdG9yaW5nIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UucGxhdGZvcm0iCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnNlYXJjaCIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnRlYW0uY29yZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnRlYW0udWkiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS50b21jYXQiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnRleHQiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qZmFjZS50ZXh0IgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanNjaC5jb3JlIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkuY29uc29sZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLmludHJvIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkuY2hlYXRzaGVldHMiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS5icm93c2VyIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkubmF2aWdhdG9yIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnJlc291cmNlcyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLndvcmtiZW5jaC50ZXh0ZWRpdG9yIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkudmlld3MiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS5lZGl0b3JzIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkuZm9ybXMiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS5pZGUiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS5pZGUuYXBwbGljYXRpb24iCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0gICAgICAgICAKLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS5uZXQiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS53aW4zMiIKLSAgICAgICAgIHdzPSJ3aW4zMiIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIGZyYWdtZW50PSJ0cnVlIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51cGRhdGUuc2NoZWR1bGVyIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UudXBkYXRlLnVpIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkud29ya2JlbmNoLmNvbXBhdGliaWxpdHkiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICBmcmFnbWVudD0idHJ1ZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuY29yZS5maWxlc3lzdGVtLmxpbnV4Lng4NiIKLSAgICAgICAgIG9zPSJsaW51eCIKLSAgICAgICAgIGFyY2g9Ing4NiIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIGZyYWdtZW50PSJ0cnVlIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuY29yZS5maWxlc3lzdGVtLndpbjMyLng4NiIKLSAgICAgICAgIG9zPSJ3aW4zMiIKLSAgICAgICAgIGFyY2g9Ing4NiIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIGZyYWdtZW50PSJ0cnVlIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMud2luMzIiCi0gICAgICAgICBvcz0id2luMzIiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICBmcmFnbWVudD0idHJ1ZSIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLmxpbnV4IgotICAgICAgICAgb3M9ImxpbnV4IgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgZnJhZ21lbnQ9InRydWUiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS53aW4zMiIKLSAgICAgICAgIG9zPSJ3aW4zMiIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIGZyYWdtZW50PSJ0cnVlIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29tcGF0aWJpbGl0eS5yZWdpc3RyeSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIGZyYWdtZW50PSJ0cnVlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcubW9ydGJheS5qZXR0eSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9ImNvbS5pYm0uaWN1IgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmNvcmUuZGF0YWJpbmRpbmciCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5jb3JlLmRhdGFiaW5kaW5nLmJlYW5zIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuY29yZS5qb2JzIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuY29yZS5leHByZXNzaW9ucyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb21wYXRpYmlsaXR5LmF1dGgiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5vc2dpIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuaGVscCIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnN3dCIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpmYWNlIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmciCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLndvcmtiZW5jaCIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0b3IiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5zd3Qud2luMzIud2luMzIueDg2IgotICAgICAgICAgb3M9IndpbjMyIgotICAgICAgICAgd3M9IndpbjMyIgotICAgICAgICAgYXJjaD0ieDg2IgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgZnJhZ21lbnQ9InRydWUiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5zd3QuZ3RrLmxpbnV4Lng4NiIKLSAgICAgICAgIG9zPSJsaW51eCIKLSAgICAgICAgIHdzPSJndGsiCi0gICAgICAgICBhcmNoPSJ4ODYiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICBmcmFnbWVudD0idHJ1ZSIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnJjcCIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmNvcmUuY29udGVudHR5cGUiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcXVpbm94LmFwcCIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVxdWlub3guY29tbW9uIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXF1aW5veC5wcmVmZXJlbmNlcyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVxdWlub3gucmVnaXN0cnkiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci5ndGsubGludXgueDg2IgotICAgICAgICAgb3M9ImxpbnV4IgotICAgICAgICAgd3M9Imd0ayIKLSAgICAgICAgIGFyY2g9Ing4NiIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIGZyYWdtZW50PSJ0cnVlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyLndpbjMyLndpbjMyLng4NiIKLSAgICAgICAgIG9zPSJ3aW4zMiIKLSAgICAgICAgIHdzPSJ3aW4zMiIKLSAgICAgICAgIGFyY2g9Ing4NiIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIGZyYWdtZW50PSJ0cnVlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5hbnQudWkiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLm1hbmlwdWxhdGlvbiIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpkdC5kZWJ1ZyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpkdC51aSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmN2cyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnRlYW0uY3ZzLmNvcmUiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS50ZWFtLmN2cy5zc2giCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS50ZWFtLmN2cy5zc2gyIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UudGVhbS5jdnMudWkiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lbWYuY29tbW9uIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51aSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVtZi5lY29yZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5jaGFuZ2UiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLmVkaXQiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lbWYuY29tbW9uai5zZG8iCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuc2RvIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZW1mLmVkaXQiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lbWYuZWRpdC51aSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVtZi5tYXBwaW5nIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZW1mLm1hcHBpbmcuZWNvcmUyZWNvcmUiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lbWYubWFwcGluZy5lY29yZTJ4bWwiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lbWYubWFwcGluZy5lY29yZS5lZGl0b3IiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lbWYub2NsIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZW1mLnF1ZXJ5IgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZW1mLnF1ZXJ5Lm9jbCIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbiIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi51aSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVtZi52YWxpZGF0aW9uIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZW1mLndvcmtzcGFjZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im5ldC5zb3VyY2Vmb3JnZS5scGcubHBnamF2YXJ1bnRpbWUiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5vY2wuZWNvcmUiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5kcmF3MmQiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5nZWYiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5hY3Rpb24iCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuYWN0aW9uLmlkZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5hY3Rpb24iCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMuZG5kIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLmRuZC5pZGUiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucHJvcGVydGllcyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmFjdGlvbnMiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmRuZCIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZ2Vvc2hhcGVzIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wcm9wZXJ0aWVzIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wcm92aWRlcnMiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnByb3ZpZGVycy5pZGUiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlbmRlciIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVzb3VyY2VzLmVkaXRvciIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVzb3VyY2VzLmVkaXRvci5pZGUiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkucmVuZGVyIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLnJlbmRlci5hd3QiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY2xpcGJvYXJkLmNvcmUiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29tbWFuZHMuY29yZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb3JlIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLnVpIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnVpIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnVpLnByb3BlcnRpZXMiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5nZWYudWkiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbiIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLnByb3ZpZGVycyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5wcmludGluZyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5wcmludGluZy53aW4zMiIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIGZyYWdtZW50PSJ0cnVlIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wcmludGluZyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucHJpbnRpbmcucmVuZGVyIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmFwYWNoZS5iYXRpay5kb20uc3ZnIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmFwYWNoZS5iYXRpay5icmlkZ2UiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuYXBhY2hlLmJhdGlrLmRvbSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5hcGFjaGUuYmF0aWsuZXh0LmF3dCIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5hcGFjaGUuYmF0aWsudHJhbnNjb2RlciIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5hcGFjaGUuYmF0aWsuc3ZnZ2VuIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmFwYWNoZS5iYXRpay51dGlsIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLnczYy5kb20uc3ZnIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmFwYWNoZS54ZXJjZXMiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuYXBhY2hlLnhtbC5yZXNvbHZlciIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5hcGFjaGUuYmF0aWsuY3NzIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmFwYWNoZS5iYXRpay51dGlsLmd1aSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5hcGFjaGUuYmF0aWsucGFyc2VyIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmFwYWNoZS5iYXRpay54bWwiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcudzNjLmNzcy5zYWMiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcudzNjLmRvbS5zbWlsIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UudW1sMi5jb21tb24iCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51bWwyLmNvbW1vbi5lZGl0IgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UudW1sMi51bWwiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51bWwyLnVtbC5lZGl0IgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi08L2ZlYXR1cmU+CmRpZmYgLS1naXQgYS8xLjUvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtLmZlYXR1cmUvbGljZW5zZS5odG1sIGIvMS41L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS5mZWF0dXJlL2xpY2Vuc2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzZhZjk2Ni4uMDAwMDAwMAotLS0gYS8xLjUvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtLmZlYXR1cmUvbGljZW5zZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTx0aXRsZT5FY2xpcHNlLm9yZyBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvdGl0bGU+Ci08L2hlYWQ+Ci0KLTxib2R5IGxhbmc9IkVOLVVTIiBsaW5rPWJsdWUgdmxpbms9cHVycGxlPgotPGgyPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvaDI+Ci08cD5NYXJjaCAxNywgMjAwNTwvcD4KLQotPGgzPlVzYWdlIE9mIENvbnRlbnQ8L2gzPgotCi08cD5USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SIE9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMKLSAgIChDT0xMRUNUSVZFTFkgJnF1b3Q7Q09OVEVOVCZxdW90OykuICBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5ECi0gICBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVSBBR1JFRSBUSEFUIFlPVVIgVVNFCi0gICBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUgotICAgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5ECi0gICBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC48L3A+Ci0gICAKLTxoMz5BcHBsaWNhYmxlIExpY2Vuc2VzPC9oMz4gICAKLSAgIAotPHA+VW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMAotICAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXMgQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLSAgIEZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPkNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLCBkb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlMgcmVwb3NpdG9yeSAoJnF1b3Q7UmVwb3NpdG9yeSZxdW90OykgaW4gQ1ZTCi0gICBtb2R1bGVzICgmcXVvdDtNb2R1bGVzJnF1b3Q7KSBhbmQgbWFkZSBhdmFpbGFibGUgYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgmcXVvdDtEb3dubG9hZHMmcXVvdDspLjwvcD4KLSAgIAotPHVsPgotCTxsaT5Db250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLCBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuICBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCZxdW90O1BsdWctaW5zJnF1b3Q7KSwgcGx1Zy1pbiBmcmFnbWVudHMgKCZxdW90O0ZyYWdtZW50cyZxdW90OyksIGFuZCBmZWF0dXJlcyAoJnF1b3Q7RmVhdHVyZXMmcXVvdDspLjwvbGk+Ci0JPGxpPkVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YSZ0cmFkZTsgQVJjaGl2ZSkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7cGx1Z2lucyZxdW90Oy48L2xpPgotCTxsaT5BIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC4gIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICZxdW90O2ZlYXR1cmVzJnF1b3Q7LiAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIHRoZSBQbHVnLWlucwotICAgICAgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLjwvbGk+Ci0JPGxpPkZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCZxdW90O0luY2x1ZGVkIEZlYXR1cmVzJnF1b3Q7KS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLjwvbGk+Ci08L3VsPiAgIAotIAotPHA+VGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7YWJvdXQuaHRtbCZxdW90OyAoJnF1b3Q7QWJvdXRzJnF1b3Q7KS4gVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQKLUluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7bGljZW5zZS5odG1sJnF1b3Q7ICgmcXVvdDtGZWF0dXJlIExpY2Vuc2VzJnF1b3Q7KS4gIEFib3V0cyBhbmQgRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczo8L3A+Ci0KLTx1bD4KLQk8bGk+VGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5PC9saT4KLQk8bGk+UGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXM8L2xpPgotCTxsaT5JbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzPC9saT4KLQk8bGk+U3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7c3JjJnF1b3Q7IG9mIGNlcnRhaW4gUGx1Zy1pbnM8L2xpPgotCTxsaT5GZWF0dXJlIGRpcmVjdG9yaWVzPC9saT4KLTwvdWw+Ci0JCQotPHA+Tm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZSBFY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCZxdW90O0ZlYXR1cmUgVXBkYXRlIExpY2Vuc2UmcXVvdDspIGR1cmluZyB0aGUKLWluc3RhbGxhdGlvbiBwcm9jZXNzLiAgSWYgdGhlIEZlYXR1cmUgY29udGFpbnMgSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3Ugd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvcgotaW5mb3JtIHlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiAgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluIHRoZSAmcXVvdDtsaWNlbnNlJnF1b3Q7IHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUucHJvcGVydGllcyZxdW90OyBmb3VuZCB3aXRoaW4gYSBGZWF0dXJlLgotU3VjaCBBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMsIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluCi10aGF0IGRpcmVjdG9yeS48L3A+Ci0KLTxwPlRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMsIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVIgVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuICBTT01FIE9GIFRIRVNFCi1PVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOjwvcD4KLQotPHVsPgotCTxsaT5Db21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWw8L2E+KTwvbGk+Ci0JPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRTwvYT4pPC9saT4KLQk8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjA8L2E+KTwvbGk+Ci0JPGxpPklCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbCI+aHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWw8L2E+KTwvbGk+CQotCTxsaT5NZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbCI+aHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWw8L2E+KTwvbGk+Ci0JPGxpPk1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwiPmh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbDwvYT4pPC9saT4KLTwvdWw+Ci0KLTxwPklUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1IgVE8gVVNFIE9GIFRIRSBDT05URU5ULiAgSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSwgb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpcyBwcm92aWRlZCwgcGxlYXNlCi1jb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LjwvcD4KLQotPGgzPkNyeXB0b2dyYXBoeTwvaDM+Ci0KLTxwPkNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZSBjdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsIGFuZC9vciByZS1leHBvcnQgdG8KLSAgIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFIHVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLCByZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LAotICAgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC48L3A+Ci0gICAKLTxzbWFsbD5KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC48L3NtYWxsPiAgIAotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvMS41L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5wcm9kdWN0LmZlYXR1cmUvLnByb2plY3QgYi8xLjUvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLnByb2R1Y3QuZmVhdHVyZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWU5NzQwNi4uMDAwMDAwMAotLS0gYS8xLjUvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLnByb2R1Y3QuZmVhdHVyZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmVwZi5wcm9kdWN0LmZlYXR1cmU8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLnByb2R1Y3QuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzIGIvMS41L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5wcm9kdWN0LmZlYXR1cmUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTY5ZGUyOS4uMDAwMDAwMAotLS0gYS8xLjUvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLnByb2R1Y3QuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKZGlmZiAtLWdpdCBhLzEuNS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYucHJvZHVjdC5mZWF0dXJlL2ZlYXR1cmUueG1sIGIvMS41L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5wcm9kdWN0LmZlYXR1cmUvZmVhdHVyZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4YTI3MDcuLjAwMDAwMDAKLS0tIGEvMS41L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5wcm9kdWN0LmZlYXR1cmUvZmVhdHVyZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGZlYXR1cmUKLSAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYucHJvZHVjdC5mZWF0dXJlIgotICAgICAgbGFiZWw9IkVQRiBQcm9kdWN0IGZlYXR1cmUiCi0gICAgICB2ZXJzaW9uPSIxLjUuMC5xdWFsaWZpZXIiPgotCi0gICA8ZGVzY3JpcHRpb24gdXJsPSJodHRwOi8vd3d3LmV4YW1wbGUuY29tL2Rlc2NyaXB0aW9uIj4KLSAgICAgIFtFbnRlciBGZWF0dXJlIERlc2NyaXB0aW9uIGhlcmUuXQotICAgPC9kZXNjcmlwdGlvbj4KLQotICAgPGNvcHlyaWdodCB1cmw9Imh0dHA6Ly93d3cuZXhhbXBsZS5jb20vY29weXJpZ2h0Ij4KLSAgICAgIFtFbnRlciBDb3B5cmlnaHQgRGVzY3JpcHRpb24gaGVyZS5dCi0gICA8L2NvcHlyaWdodD4KLQotICAgPGxpY2Vuc2UgdXJsPSJodHRwOi8vd3d3LmV4YW1wbGUuY29tL2xpY2Vuc2UiPgotICAgICAgW0VudGVyIExpY2Vuc2UgRGVzY3JpcHRpb24gaGVyZS5dCi0gICA8L2xpY2Vuc2U+Ci0KLSAgIDxpbmNsdWRlcwotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS5mZWF0dXJlIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotICAgPGluY2x1ZGVzCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmZlYXR1cmUiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi0gICA8aW5jbHVkZXMKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuYmFzZS5mZWF0dXJlIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotICAgPGluY2x1ZGVzCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLnJjcC5mZWF0dXJlIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotICAgPGluY2x1ZGVzCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmRvYy5mZWF0dXJlIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotICAgPGluY2x1ZGVzCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXF1aW5veC5leGVjdXRhYmxlIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotPC9mZWF0dXJlPgpkaWZmIC0tZ2l0IGEvMS41L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5wcm9kdWN0LndpbjMyLmZlYXR1cmUvLnByb2plY3QgYi8xLjUvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLnByb2R1Y3Qud2luMzIuZmVhdHVyZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTZjNzY0Mi4uMDAwMDAwMAotLS0gYS8xLjUvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLnByb2R1Y3Qud2luMzIuZmVhdHVyZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmVwZi5wcm9kdWN0LmxpbnV4LmZlYXR1cmU8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLnByb2R1Y3Qud2luMzIuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzIGIvMS41L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5wcm9kdWN0LndpbjMyLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTY5ZGUyOS4uMDAwMDAwMAotLS0gYS8xLjUvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLnByb2R1Y3Qud2luMzIuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKZGlmZiAtLWdpdCBhLzEuNS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYucHJvZHVjdC53aW4zMi5mZWF0dXJlL2ZlYXR1cmUueG1sIGIvMS41L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5wcm9kdWN0LndpbjMyLmZlYXR1cmUvZmVhdHVyZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiNGJjMTAuLjAwMDAwMDAKLS0tIGEvMS41L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5wcm9kdWN0LndpbjMyLmZlYXR1cmUvZmVhdHVyZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGZlYXR1cmUKLSAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYucHJvZHVjdC53aW4zMi5mZWF0dXJlIgotICAgICAgbGFiZWw9IkVQRiBQcm9kdWN0IChMaW51eCkgZmVhdHVyZSIKLSAgICAgIHZlcnNpb249IjEuNS4wLnF1YWxpZmllciI+Ci0KLSAgIDxkZXNjcmlwdGlvbiB1cmw9Imh0dHA6Ly93d3cuZXhhbXBsZS5jb20vZGVzY3JpcHRpb24iPgotICAgICAgW0VudGVyIEZlYXR1cmUgRGVzY3JpcHRpb24gaGVyZS5dCi0gICA8L2Rlc2NyaXB0aW9uPgotCi0gICA8Y29weXJpZ2h0IHVybD0iaHR0cDovL3d3dy5leGFtcGxlLmNvbS9jb3B5cmlnaHQiPgotICAgICAgW0VudGVyIENvcHlyaWdodCBEZXNjcmlwdGlvbiBoZXJlLl0KLSAgIDwvY29weXJpZ2h0PgotCi0gICA8bGljZW5zZSB1cmw9Imh0dHA6Ly93d3cuZXhhbXBsZS5jb20vbGljZW5zZSI+Ci0gICAgICBbRW50ZXIgTGljZW5zZSBEZXNjcmlwdGlvbiBoZXJlLl0KLSAgIDwvbGljZW5zZT4KLQotICAgPGluY2x1ZGVzCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtLmZlYXR1cmUiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi0gICA8aW5jbHVkZXMKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuYmFzZS5mZWF0dXJlIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotICAgPGluY2x1ZGVzCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLnJjcC5mZWF0dXJlIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotICAgPGluY2x1ZGVzCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmRvYy5mZWF0dXJlIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotICAgPGluY2x1ZGVzCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXF1aW5veC5leGVjdXRhYmxlIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotICAgPGluY2x1ZGVzCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmZlYXR1cmUiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi0gICA8aW5jbHVkZXMKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYucmljaHRleHQud2luMzIuZmVhdHVyZSIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLTwvZmVhdHVyZT4KZGlmZiAtLWdpdCBhLzEuNS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYucmNwLmZlYXR1cmUvLnByb2plY3QgYi8xLjUvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLnJjcC5mZWF0dXJlLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZjRiNGE5Li4wMDAwMDAwCi0tLSBhLzEuNS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYucmNwLmZlYXR1cmUvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5lcGYucmNwLmZlYXR1cmU8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLnJjcC5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMgYi8xLjUvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLnJjcC5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3ZjRkMmUuLjAwMDAwMDAKLS0tIGEvMS41L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5yY3AuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi1iaW4uaW5jbHVkZXMgPSBmZWF0dXJlLnhtbCxcCi0gICAgICAgICAgICAgICBmZWF0dXJlLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgZWNsaXBzZV91cGRhdGVfMTIwLmpwZyxcCi0gICAgICAgICAgICAgICBsaWNlbnNlLmh0bWwKZGlmZiAtLWdpdCBhLzEuNS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYucmNwLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZyBiLzEuNS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYucmNwLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZkZjcwOC4uMDAwMDAwMAotLS0gYS8xLjUvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLnJjcC5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLnJjcC5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcyBiLzEuNS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYucmNwLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OTYyODFmLi4wMDAwMDAwCi0tLSBhLzEuNS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYucmNwLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLQotZmVhdHVyZU5hbWU9RVBGIFJDUCBGZWF0dXJlCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKLWRlc2NyaXB0aW9uPUVQRiBSQ1AgRmVhdHVyZS4KLXVwZGF0ZVNpdGVOYW1lPUVQRiBSQ1AgVXBkYXRlcwotY29weXJpZ2h0PShjKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgYW5kIG90aGVycyAyMDAwLCAyMDA4LiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLWxpY2Vuc2VVUkw9bGljZW5zZS5odG1sCi1saWNlbnNlVGV4dD1Vc2Ugb2YgdGhpcyBmZWF0dXJlIGlzIHN1YmplY3QgdG8gdGhlIHNhbWUgdGVybXMgYW5kIGNvbmRpdGlvbnMgd2hpY2ggZ292ZXJuIHRoZSB1c2Ugb2YgdGhlIFByb2R1Y3Qgd2hpY2ggaW5jbHVkZWQgdGhpcyBmZWF0dXJlLgpkaWZmIC0tZ2l0IGEvMS41L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5yY3AuZmVhdHVyZS9mZWF0dXJlLnhtbCBiLzEuNS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYucmNwLmZlYXR1cmUvZmVhdHVyZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmNjkzMzQuLjAwMDAwMDAKLS0tIGEvMS41L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5yY3AuZmVhdHVyZS9mZWF0dXJlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZmVhdHVyZQotICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5yY3AuZmVhdHVyZSIKLSAgICAgIGxhYmVsPSIlZmVhdHVyZU5hbWUiCi0gICAgICB2ZXJzaW9uPSIxLjUuMC5xdWFsaWZpZXIiCi0gICAgICBwcm92aWRlci1uYW1lPSIlcHJvdmlkZXJOYW1lIgotICAgICAgcGx1Z2luPSJvcmcuZWNsaXBzZS5lcGYucmNwIgotICAgICAgaW1hZ2U9ImVjbGlwc2VfdXBkYXRlXzEyMC5qcGciPgotCi0gICA8ZGVzY3JpcHRpb24+Ci0gICAgICAlZGVzY3JpcHRpb24KLSAgIDwvZGVzY3JpcHRpb24+Ci0KLSAgIDxjb3B5cmlnaHQ+Ci0gICAgICAlY29weXJpZ2h0Ci0gICA8L2NvcHlyaWdodD4KLQotICAgPGxpY2Vuc2UgdXJsPSIlbGljZW5zZVVSTCI+Ci0gICAgICAlbGljZW5zZVRleHQKLSAgIDwvbGljZW5zZT4KLQotICAgPHJlcXVpcmVzPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuZW1mLmVkaXQiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS51aSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnVpLmlkZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnVpLmludHJvIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuaGVscC51aSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmhlbHAud2ViYXBwIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UudG9tY2F0Ii8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpIi8+Ci0gICA8L3JlcXVpcmVzPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLnJjcC51aSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5yY3AiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLTwvZmVhdHVyZT4KZGlmZiAtLWdpdCBhLzEuNS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYucmNwLmZlYXR1cmUvbGljZW5zZS5odG1sIGIvMS41L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5yY3AuZmVhdHVyZS9saWNlbnNlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2YWY5NjYuLjAwMDAwMDAKLS0tIGEvMS41L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5yY3AuZmVhdHVyZS9saWNlbnNlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPHRpdGxlPkVjbGlwc2Uub3JnIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC90aXRsZT4KLTwvaGVhZD4KLQotPGJvZHkgbGFuZz0iRU4tVVMiIGxpbms9Ymx1ZSB2bGluaz1wdXJwbGU+Ci08aDI+RWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9oMj4KLTxwPk1hcmNoIDE3LCAyMDA1PC9wPgotCi08aDM+VXNhZ2UgT2YgQ29udGVudDwvaDM+Ci0KLTxwPlRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1IgT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUwotICAgKENPTExFQ1RJVkVMWSAmcXVvdDtDT05URU5UJnF1b3Q7KS4gIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQKLSAgIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UKLSAgIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SCi0gICBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQKLSAgIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULjwvcD4KLSAgIAotPGgzPkFwcGxpY2FibGUgTGljZW5zZXM8L2gzPiAgIAotICAgCi08cD5Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wCi0gICAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyBDb250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotICAgRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+Q29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsIGRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWUyByZXBvc2l0b3J5ICgmcXVvdDtSZXBvc2l0b3J5JnF1b3Q7KSBpbiBDVlMKLSAgIG1vZHVsZXMgKCZxdW90O01vZHVsZXMmcXVvdDspIGFuZCBtYWRlIGF2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCZxdW90O0Rvd25sb2FkcyZxdW90OykuPC9wPgotICAgCi08dWw+Ci0JPGxpPkNvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoJnF1b3Q7UGx1Zy1pbnMmcXVvdDspLCBwbHVnLWluIGZyYWdtZW50cyAoJnF1b3Q7RnJhZ21lbnRzJnF1b3Q7KSwgYW5kIGZlYXR1cmVzICgmcXVvdDtGZWF0dXJlcyZxdW90OykuPC9saT4KLQk8bGk+RWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhJnRyYWRlOyBBUmNoaXZlKSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtwbHVnaW5zJnF1b3Q7LjwvbGk+Ci0JPGxpPkEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLiAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7ZmVhdHVyZXMmcXVvdDsuICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zCi0gICAgICBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuPC9saT4KLQk8bGk+RmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoJnF1b3Q7SW5jbHVkZWQgRmVhdHVyZXMmcXVvdDspLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuPC9saT4KLTwvdWw+ICAgCi0gCi08cD5UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDthYm91dC5odG1sJnF1b3Q7ICgmcXVvdDtBYm91dHMmcXVvdDspLiBUaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZAotSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDtsaWNlbnNlLmh0bWwmcXVvdDsgKCZxdW90O0ZlYXR1cmUgTGljZW5zZXMmcXVvdDspLiAgQWJvdXRzIGFuZCBGZWF0dXJlIExpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGUKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOjwvcD4KLQotPHVsPgotCTxsaT5UaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3Rvcnk8L2xpPgotCTxsaT5QbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllczwvbGk+Ci0JPGxpPkluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnM8L2xpPgotCTxsaT5TdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtzcmMmcXVvdDsgb2YgY2VydGFpbiBQbHVnLWluczwvbGk+Ci0JPGxpPkZlYXR1cmUgZGlyZWN0b3JpZXM8L2xpPgotPC91bD4KLQkJCi08cD5Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlIEVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoJnF1b3Q7RmVhdHVyZSBVcGRhdGUgTGljZW5zZSZxdW90OykgZHVyaW5nIHRoZQotaW5zdGFsbGF0aW9uIHByb2Nlc3MuICBJZiB0aGUgRmVhdHVyZSBjb250YWlucyBJbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdSB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yCi1pbmZvcm0geW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uICBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlICZxdW90O2xpY2Vuc2UmcXVvdDsgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS5wcm9wZXJ0aWVzJnF1b3Q7IGZvdW5kIHdpdGhpbiBhIEZlYXR1cmUuCi1TdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcywgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4KLXRoYXQgZGlyZWN0b3J5LjwvcD4KLQotPHA+VEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUywgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUiBUTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy4gIFNPTUUgT0YgVEhFU0UKLU9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6PC9wPgotCi08dWw+Ci0JPGxpPkNvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvYT4pPC9saT4KLQk8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFPC9hPik8L2xpPgotCTxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMDwvYT4pPC9saT4KLQk8bGk+SUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sIj5odHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbDwvYT4pPC9saT4JCi0JPGxpPk1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sIj5odHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbDwvYT4pPC9saT4KLQk8bGk+TW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbCI+aHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sPC9hPik8L2xpPgotPC91bD4KLQotPHA+SVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUiBUTyBVU0UgT0YgVEhFIENPTlRFTlQuICBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlLCBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIGlzIHByb3ZpZGVkLCBwbGVhc2UKLWNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuPC9wPgotCi08aDM+Q3J5cHRvZ3JhcGh5PC9oMz4KLQotPHA+Q29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlIGN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSwgYW5kL29yIHJlLWV4cG9ydCB0bwotICAgYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkUgdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsIHJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsCi0gICBwb3NzZXNzaW9uLCBvciB1c2UsIGFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLjwvcD4KLSAgIAotPHNtYWxsPkphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLjwvc21hbGw+ICAgCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS8xLjUvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmZlYXR1cmUvLnByb2plY3QgYi8xLjUvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmZlYXR1cmUvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlMTUzMjkuLjAwMDAwMDAKLS0tIGEvMS41L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5mZWF0dXJlLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmZlYXR1cmU8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmZlYXR1cmUvYnVpbGQucHJvcGVydGllcyBiLzEuNS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmN2Y0ZDJlLi4wMDAwMDAwCi0tLSBhLzEuNS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi1iaW4uaW5jbHVkZXMgPSBmZWF0dXJlLnhtbCxcCi0gICAgICAgICAgICAgICBmZWF0dXJlLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgZWNsaXBzZV91cGRhdGVfMTIwLmpwZyxcCi0gICAgICAgICAgICAgICBsaWNlbnNlLmh0bWwKZGlmZiAtLWdpdCBhLzEuNS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnIGIvMS41L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmZGY3MDguLjAwMDAwMDAKLS0tIGEvMS41L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzIGIvMS41L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmE4Nzk3MC4uMDAwMDAwMAotLS0gYS8xLjUvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLQotZmVhdHVyZU5hbWU9RVBGIFJpY2h0ZXh0IEZlYXR1cmUKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotZGVzY3JpcHRpb249RVBGIFJpY2h0ZXh0IEZlYXR1cmUuCi11cGRhdGVTaXRlTmFtZT1FUEYgRmVhdHVyZSBVcGRhdGVzCi1jb3B5cmlnaHQ9KGMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyBhbmQgb3RoZXJzIDIwMDAsIDIwMDguICBBbGwgUmlnaHRzIFJlc2VydmVkLgotbGljZW5zZVVSTD1saWNlbnNlLmh0bWwKLWxpY2Vuc2VUZXh0PVVzZSBvZiB0aGlzIGZlYXR1cmUgaXMgc3ViamVjdCB0byB0aGUgc2FtZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyB3aGljaCBnb3Zlcm4gdGhlIHVzZSBvZiB0aGUgUHJvZHVjdCB3aGljaCBpbmNsdWRlZCB0aGlzIGZlYXR1cmUuCmRpZmYgLS1naXQgYS8xLjUvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmZlYXR1cmUvZmVhdHVyZS54bWwgYi8xLjUvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmZlYXR1cmUvZmVhdHVyZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1ZjJmMmIuLjAwMDAwMDAKLS0tIGEvMS41L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5mZWF0dXJlL2ZlYXR1cmUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxmZWF0dXJlCi0gICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmZlYXR1cmUiCi0gICAgICBsYWJlbD0iJWZlYXR1cmVOYW1lIgotICAgICAgdmVyc2lvbj0iMS41LjAucXVhbGlmaWVyIgotICAgICAgcHJvdmlkZXItbmFtZT0iJXByb3ZpZGVyTmFtZSIKLSAgICAgIHBsdWdpbj0ib3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0IgotICAgICAgaW1hZ2U9ImVjbGlwc2VfdXBkYXRlXzEyMC5qcGciPgotCi0gICA8ZGVzY3JpcHRpb24+Ci0gICAgICAlZGVzY3JpcHRpb24KLSAgIDwvZGVzY3JpcHRpb24+Ci0KLSAgIDxjb3B5cmlnaHQ+Ci0gICAgICAlY29weXJpZ2h0Ci0gICA8L2NvcHlyaWdodD4KLQotICAgPGxpY2Vuc2UgdXJsPSIlbGljZW5zZVVSTCI+Ci0gICAgICAlbGljZW5zZVRleHQKLSAgIDwvbGljZW5zZT4KLQotICAgPHJlcXVpcmVzPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnN3dCIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnVpIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UudWkuZm9ybXMiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5qZmFjZS50ZXh0Ii8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UudWkud29ya2JlbmNoLnRleHRlZGl0b3IiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJjb20uaWJtLmljdSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmFwYWNoZS5hbnQiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5vc2dpIi8+Ci0gICA8L3JlcXVpcmVzPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmNvbW1vbi53aW4zMi53aW4zMi54ODYiCi0gICAgICAgICBvcz0id2luMzIiCi0gICAgICAgICB3cz0id2luMzIiCi0gICAgICAgICBhcmNoPSJ4ODYiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYucmljaHRleHQiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5jb21tb24iCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5jb21tb24udWkiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLTwvZmVhdHVyZT4KZGlmZiAtLWdpdCBhLzEuNS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQuZmVhdHVyZS9saWNlbnNlLmh0bWwgYi8xLjUvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmZlYXR1cmUvbGljZW5zZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNmFmOTY2Li4wMDAwMDAwCi0tLSBhLzEuNS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQuZmVhdHVyZS9saWNlbnNlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPHRpdGxlPkVjbGlwc2Uub3JnIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC90aXRsZT4KLTwvaGVhZD4KLQotPGJvZHkgbGFuZz0iRU4tVVMiIGxpbms9Ymx1ZSB2bGluaz1wdXJwbGU+Ci08aDI+RWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9oMj4KLTxwPk1hcmNoIDE3LCAyMDA1PC9wPgotCi08aDM+VXNhZ2UgT2YgQ29udGVudDwvaDM+Ci0KLTxwPlRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1IgT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUwotICAgKENPTExFQ1RJVkVMWSAmcXVvdDtDT05URU5UJnF1b3Q7KS4gIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQKLSAgIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UKLSAgIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SCi0gICBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQKLSAgIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULjwvcD4KLSAgIAotPGgzPkFwcGxpY2FibGUgTGljZW5zZXM8L2gzPiAgIAotICAgCi08cD5Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wCi0gICAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyBDb250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotICAgRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+Q29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsIGRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWUyByZXBvc2l0b3J5ICgmcXVvdDtSZXBvc2l0b3J5JnF1b3Q7KSBpbiBDVlMKLSAgIG1vZHVsZXMgKCZxdW90O01vZHVsZXMmcXVvdDspIGFuZCBtYWRlIGF2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCZxdW90O0Rvd25sb2FkcyZxdW90OykuPC9wPgotICAgCi08dWw+Ci0JPGxpPkNvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoJnF1b3Q7UGx1Zy1pbnMmcXVvdDspLCBwbHVnLWluIGZyYWdtZW50cyAoJnF1b3Q7RnJhZ21lbnRzJnF1b3Q7KSwgYW5kIGZlYXR1cmVzICgmcXVvdDtGZWF0dXJlcyZxdW90OykuPC9saT4KLQk8bGk+RWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhJnRyYWRlOyBBUmNoaXZlKSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtwbHVnaW5zJnF1b3Q7LjwvbGk+Ci0JPGxpPkEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLiAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7ZmVhdHVyZXMmcXVvdDsuICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zCi0gICAgICBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuPC9saT4KLQk8bGk+RmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoJnF1b3Q7SW5jbHVkZWQgRmVhdHVyZXMmcXVvdDspLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuPC9saT4KLTwvdWw+ICAgCi0gCi08cD5UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDthYm91dC5odG1sJnF1b3Q7ICgmcXVvdDtBYm91dHMmcXVvdDspLiBUaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZAotSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDtsaWNlbnNlLmh0bWwmcXVvdDsgKCZxdW90O0ZlYXR1cmUgTGljZW5zZXMmcXVvdDspLiAgQWJvdXRzIGFuZCBGZWF0dXJlIExpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGUKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOjwvcD4KLQotPHVsPgotCTxsaT5UaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3Rvcnk8L2xpPgotCTxsaT5QbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllczwvbGk+Ci0JPGxpPkluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnM8L2xpPgotCTxsaT5TdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtzcmMmcXVvdDsgb2YgY2VydGFpbiBQbHVnLWluczwvbGk+Ci0JPGxpPkZlYXR1cmUgZGlyZWN0b3JpZXM8L2xpPgotPC91bD4KLQkJCi08cD5Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlIEVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoJnF1b3Q7RmVhdHVyZSBVcGRhdGUgTGljZW5zZSZxdW90OykgZHVyaW5nIHRoZQotaW5zdGFsbGF0aW9uIHByb2Nlc3MuICBJZiB0aGUgRmVhdHVyZSBjb250YWlucyBJbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdSB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yCi1pbmZvcm0geW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uICBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlICZxdW90O2xpY2Vuc2UmcXVvdDsgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS5wcm9wZXJ0aWVzJnF1b3Q7IGZvdW5kIHdpdGhpbiBhIEZlYXR1cmUuCi1TdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcywgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4KLXRoYXQgZGlyZWN0b3J5LjwvcD4KLQotPHA+VEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUywgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUiBUTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy4gIFNPTUUgT0YgVEhFU0UKLU9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6PC9wPgotCi08dWw+Ci0JPGxpPkNvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvYT4pPC9saT4KLQk8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFPC9hPik8L2xpPgotCTxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMDwvYT4pPC9saT4KLQk8bGk+SUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sIj5odHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbDwvYT4pPC9saT4JCi0JPGxpPk1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sIj5odHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbDwvYT4pPC9saT4KLQk8bGk+TW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbCI+aHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sPC9hPik8L2xpPgotPC91bD4KLQotPHA+SVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUiBUTyBVU0UgT0YgVEhFIENPTlRFTlQuICBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlLCBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIGlzIHByb3ZpZGVkLCBwbGVhc2UKLWNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuPC9wPgotCi08aDM+Q3J5cHRvZ3JhcGh5PC9oMz4KLQotPHA+Q29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlIGN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSwgYW5kL29yIHJlLWV4cG9ydCB0bwotICAgYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkUgdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsIHJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsCi0gICBwb3NzZXNzaW9uLCBvciB1c2UsIGFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLjwvcD4KLSAgIAotPHNtYWxsPkphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLjwvc21hbGw+ICAgCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS8xLjUvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmxpbnV4LmZlYXR1cmUvLnByb2plY3QgYi8xLjUvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmxpbnV4LmZlYXR1cmUvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiMWEwMGUuLjAwMDAwMDAKLS0tIGEvMS41L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5saW51eC5mZWF0dXJlLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmxpbnV4LmZlYXR1cmU8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmxpbnV4LmZlYXR1cmUvYnVpbGQucHJvcGVydGllcyBiLzEuNS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQubGludXguZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNTNmMTE4Li4wMDAwMDAwCi0tLSBhLzEuNS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQubGludXguZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi1iaW4uaW5jbHVkZXMgPSBmZWF0dXJlLnhtbCxcCi0gICAgICAgICAgICAgICBmZWF0dXJlLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgZWNsaXBzZV91cGRhdGVfMTIwLmpwZyxcCi0gICAgICAgICAgICAgICBsaWNlbnNlX2VuLmh0bWwKZGlmZiAtLWdpdCBhLzEuNS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQubGludXguZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnIGIvMS41L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5saW51eC5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmZGY3MDguLjAwMDAwMDAKLS0tIGEvMS41L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5saW51eC5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmxpbnV4LmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzIGIvMS41L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5saW51eC5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmE4Nzk3MC4uMDAwMDAwMAotLS0gYS8xLjUvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmxpbnV4LmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLQotZmVhdHVyZU5hbWU9RVBGIFJpY2h0ZXh0IEZlYXR1cmUKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotZGVzY3JpcHRpb249RVBGIFJpY2h0ZXh0IEZlYXR1cmUuCi11cGRhdGVTaXRlTmFtZT1FUEYgRmVhdHVyZSBVcGRhdGVzCi1jb3B5cmlnaHQ9KGMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyBhbmQgb3RoZXJzIDIwMDAsIDIwMDguICBBbGwgUmlnaHRzIFJlc2VydmVkLgotbGljZW5zZVVSTD1saWNlbnNlLmh0bWwKLWxpY2Vuc2VUZXh0PVVzZSBvZiB0aGlzIGZlYXR1cmUgaXMgc3ViamVjdCB0byB0aGUgc2FtZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyB3aGljaCBnb3Zlcm4gdGhlIHVzZSBvZiB0aGUgUHJvZHVjdCB3aGljaCBpbmNsdWRlZCB0aGlzIGZlYXR1cmUuCmRpZmYgLS1naXQgYS8xLjUvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmxpbnV4LmZlYXR1cmUvZmVhdHVyZS54bWwgYi8xLjUvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmxpbnV4LmZlYXR1cmUvZmVhdHVyZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxMWZiNDAuLjAwMDAwMDAKLS0tIGEvMS41L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5saW51eC5mZWF0dXJlL2ZlYXR1cmUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxmZWF0dXJlCi0gICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmxpbnV4LmZlYXR1cmUiCi0gICAgICBsYWJlbD0iJWZlYXR1cmVOYW1lIgotICAgICAgdmVyc2lvbj0iMS41LjAucXVhbGlmaWVyIgotICAgICAgcHJvdmlkZXItbmFtZT0iJXByb3ZpZGVyTmFtZSIKLSAgICAgIHBsdWdpbj0ib3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0IgotICAgICAgaW1hZ2U9ImVjbGlwc2VfdXBkYXRlXzEyMC5qcGciPgotCi0gICA8ZGVzY3JpcHRpb24+Ci0gICAgICAlZGVzY3JpcHRpb24KLSAgIDwvZGVzY3JpcHRpb24+Ci0KLSAgIDxjb3B5cmlnaHQ+Ci0gICAgICAlY29weXJpZ2h0Ci0gICA8L2NvcHlyaWdodD4KLQotICAgPGxpY2Vuc2UgdXJsPSIlbGljZW5zZVVSTCI+Ci0gICAgICAlbGljZW5zZVRleHQKLSAgIDwvbGljZW5zZT4KLQotICAgPHJlcXVpcmVzPgotICAgICAgPGltcG9ydCBwbHVnaW49ImNvbS5pYm0uaWN1Ii8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS51aSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5hcGFjaGUuYW50Ii8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2Uuc3d0Ii8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UudWkuZm9ybXMiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5qZmFjZS50ZXh0Ii8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UudWkud29ya2JlbmNoLnRleHRlZGl0b3IiLz4KLSAgIDwvcmVxdWlyZXM+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYucmljaHRleHQiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5jb21tb24iCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5jb21tb24udWkiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLTwvZmVhdHVyZT4KZGlmZiAtLWdpdCBhLzEuNS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQubGludXguZmVhdHVyZS9saWNlbnNlX2VuLmh0bWwgYi8xLjUvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmxpbnV4LmZlYXR1cmUvbGljZW5zZV9lbi5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNmFmOTY2Li4wMDAwMDAwCi0tLSBhLzEuNS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQubGludXguZmVhdHVyZS9saWNlbnNlX2VuLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPHRpdGxlPkVjbGlwc2Uub3JnIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC90aXRsZT4KLTwvaGVhZD4KLQotPGJvZHkgbGFuZz0iRU4tVVMiIGxpbms9Ymx1ZSB2bGluaz1wdXJwbGU+Ci08aDI+RWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9oMj4KLTxwPk1hcmNoIDE3LCAyMDA1PC9wPgotCi08aDM+VXNhZ2UgT2YgQ29udGVudDwvaDM+Ci0KLTxwPlRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1IgT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUwotICAgKENPTExFQ1RJVkVMWSAmcXVvdDtDT05URU5UJnF1b3Q7KS4gIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQKLSAgIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UKLSAgIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SCi0gICBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQKLSAgIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULjwvcD4KLSAgIAotPGgzPkFwcGxpY2FibGUgTGljZW5zZXM8L2gzPiAgIAotICAgCi08cD5Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wCi0gICAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyBDb250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotICAgRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+Q29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsIGRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWUyByZXBvc2l0b3J5ICgmcXVvdDtSZXBvc2l0b3J5JnF1b3Q7KSBpbiBDVlMKLSAgIG1vZHVsZXMgKCZxdW90O01vZHVsZXMmcXVvdDspIGFuZCBtYWRlIGF2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCZxdW90O0Rvd25sb2FkcyZxdW90OykuPC9wPgotICAgCi08dWw+Ci0JPGxpPkNvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoJnF1b3Q7UGx1Zy1pbnMmcXVvdDspLCBwbHVnLWluIGZyYWdtZW50cyAoJnF1b3Q7RnJhZ21lbnRzJnF1b3Q7KSwgYW5kIGZlYXR1cmVzICgmcXVvdDtGZWF0dXJlcyZxdW90OykuPC9saT4KLQk8bGk+RWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhJnRyYWRlOyBBUmNoaXZlKSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtwbHVnaW5zJnF1b3Q7LjwvbGk+Ci0JPGxpPkEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLiAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7ZmVhdHVyZXMmcXVvdDsuICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zCi0gICAgICBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuPC9saT4KLQk8bGk+RmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoJnF1b3Q7SW5jbHVkZWQgRmVhdHVyZXMmcXVvdDspLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuPC9saT4KLTwvdWw+ICAgCi0gCi08cD5UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDthYm91dC5odG1sJnF1b3Q7ICgmcXVvdDtBYm91dHMmcXVvdDspLiBUaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZAotSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDtsaWNlbnNlLmh0bWwmcXVvdDsgKCZxdW90O0ZlYXR1cmUgTGljZW5zZXMmcXVvdDspLiAgQWJvdXRzIGFuZCBGZWF0dXJlIExpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGUKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOjwvcD4KLQotPHVsPgotCTxsaT5UaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3Rvcnk8L2xpPgotCTxsaT5QbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllczwvbGk+Ci0JPGxpPkluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnM8L2xpPgotCTxsaT5TdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtzcmMmcXVvdDsgb2YgY2VydGFpbiBQbHVnLWluczwvbGk+Ci0JPGxpPkZlYXR1cmUgZGlyZWN0b3JpZXM8L2xpPgotPC91bD4KLQkJCi08cD5Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlIEVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoJnF1b3Q7RmVhdHVyZSBVcGRhdGUgTGljZW5zZSZxdW90OykgZHVyaW5nIHRoZQotaW5zdGFsbGF0aW9uIHByb2Nlc3MuICBJZiB0aGUgRmVhdHVyZSBjb250YWlucyBJbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdSB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yCi1pbmZvcm0geW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uICBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlICZxdW90O2xpY2Vuc2UmcXVvdDsgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS5wcm9wZXJ0aWVzJnF1b3Q7IGZvdW5kIHdpdGhpbiBhIEZlYXR1cmUuCi1TdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcywgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4KLXRoYXQgZGlyZWN0b3J5LjwvcD4KLQotPHA+VEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUywgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUiBUTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy4gIFNPTUUgT0YgVEhFU0UKLU9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6PC9wPgotCi08dWw+Ci0JPGxpPkNvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvYT4pPC9saT4KLQk8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFPC9hPik8L2xpPgotCTxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMDwvYT4pPC9saT4KLQk8bGk+SUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sIj5odHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbDwvYT4pPC9saT4JCi0JPGxpPk1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sIj5odHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbDwvYT4pPC9saT4KLQk8bGk+TW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbCI+aHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sPC9hPik8L2xpPgotPC91bD4KLQotPHA+SVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUiBUTyBVU0UgT0YgVEhFIENPTlRFTlQuICBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlLCBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIGlzIHByb3ZpZGVkLCBwbGVhc2UKLWNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuPC9wPgotCi08aDM+Q3J5cHRvZ3JhcGh5PC9oMz4KLQotPHA+Q29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlIGN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSwgYW5kL29yIHJlLWV4cG9ydCB0bwotICAgYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkUgdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsIHJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsCi0gICBwb3NzZXNzaW9uLCBvciB1c2UsIGFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLjwvcD4KLSAgIAotPHNtYWxsPkphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLjwvc21hbGw+ICAgCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS8xLjUvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LndpbjMyLmZlYXR1cmUvLnByb2plY3QgYi8xLjUvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LndpbjMyLmZlYXR1cmUvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2NjM3OGQuLjAwMDAwMDAKLS0tIGEvMS41L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC53aW4zMi5mZWF0dXJlLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LndpbjMyLmZlYXR1cmU8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LndpbjMyLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcyBiLzEuNS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQud2luMzIuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNTNmMTE4Li4wMDAwMDAwCi0tLSBhLzEuNS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQud2luMzIuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi1iaW4uaW5jbHVkZXMgPSBmZWF0dXJlLnhtbCxcCi0gICAgICAgICAgICAgICBmZWF0dXJlLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgZWNsaXBzZV91cGRhdGVfMTIwLmpwZyxcCi0gICAgICAgICAgICAgICBsaWNlbnNlX2VuLmh0bWwKZGlmZiAtLWdpdCBhLzEuNS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQud2luMzIuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnIGIvMS41L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC53aW4zMi5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmZGY3MDguLjAwMDAwMDAKLS0tIGEvMS41L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC53aW4zMi5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LndpbjMyLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzIGIvMS41L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC53aW4zMi5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmE4Nzk3MC4uMDAwMDAwMAotLS0gYS8xLjUvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LndpbjMyLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLQotZmVhdHVyZU5hbWU9RVBGIFJpY2h0ZXh0IEZlYXR1cmUKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotZGVzY3JpcHRpb249RVBGIFJpY2h0ZXh0IEZlYXR1cmUuCi11cGRhdGVTaXRlTmFtZT1FUEYgRmVhdHVyZSBVcGRhdGVzCi1jb3B5cmlnaHQ9KGMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyBhbmQgb3RoZXJzIDIwMDAsIDIwMDguICBBbGwgUmlnaHRzIFJlc2VydmVkLgotbGljZW5zZVVSTD1saWNlbnNlLmh0bWwKLWxpY2Vuc2VUZXh0PVVzZSBvZiB0aGlzIGZlYXR1cmUgaXMgc3ViamVjdCB0byB0aGUgc2FtZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyB3aGljaCBnb3Zlcm4gdGhlIHVzZSBvZiB0aGUgUHJvZHVjdCB3aGljaCBpbmNsdWRlZCB0aGlzIGZlYXR1cmUuCmRpZmYgLS1naXQgYS8xLjUvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LndpbjMyLmZlYXR1cmUvZmVhdHVyZS54bWwgYi8xLjUvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LndpbjMyLmZlYXR1cmUvZmVhdHVyZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhZGU5MTMuLjAwMDAwMDAKLS0tIGEvMS41L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC53aW4zMi5mZWF0dXJlL2ZlYXR1cmUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxmZWF0dXJlCi0gICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LndpbjMyLmZlYXR1cmUiCi0gICAgICBsYWJlbD0iJWZlYXR1cmVOYW1lIgotICAgICAgdmVyc2lvbj0iMS41LjAucXVhbGlmaWVyIgotICAgICAgcHJvdmlkZXItbmFtZT0iJXByb3ZpZGVyTmFtZSIKLSAgICAgIHBsdWdpbj0ib3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0IgotICAgICAgaW1hZ2U9ImVjbGlwc2VfdXBkYXRlXzEyMC5qcGciPgotCi0gICA8ZGVzY3JpcHRpb24+Ci0gICAgICAlZGVzY3JpcHRpb24KLSAgIDwvZGVzY3JpcHRpb24+Ci0KLSAgIDxjb3B5cmlnaHQ+Ci0gICAgICAlY29weXJpZ2h0Ci0gICA8L2NvcHlyaWdodD4KLQotICAgPGxpY2Vuc2UgdXJsPSIlbGljZW5zZVVSTCI+Ci0gICAgICAlbGljZW5zZVRleHQKLSAgIDwvbGljZW5zZT4KLQotICAgPHJlcXVpcmVzPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnN3dCIvPgotICAgPC9yZXF1aXJlcz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5jb21tb24ud2luMzIud2luMzIueDg2IgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi08L2ZlYXR1cmU+CmRpZmYgLS1naXQgYS8xLjUvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LndpbjMyLmZlYXR1cmUvbGljZW5zZV9lbi5odG1sIGIvMS41L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC53aW4zMi5mZWF0dXJlL2xpY2Vuc2VfZW4uaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzZhZjk2Ni4uMDAwMDAwMAotLS0gYS8xLjUvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LndpbjMyLmZlYXR1cmUvbGljZW5zZV9lbi5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTx0aXRsZT5FY2xpcHNlLm9yZyBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvdGl0bGU+Ci08L2hlYWQ+Ci0KLTxib2R5IGxhbmc9IkVOLVVTIiBsaW5rPWJsdWUgdmxpbms9cHVycGxlPgotPGgyPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvaDI+Ci08cD5NYXJjaCAxNywgMjAwNTwvcD4KLQotPGgzPlVzYWdlIE9mIENvbnRlbnQ8L2gzPgotCi08cD5USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SIE9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMKLSAgIChDT0xMRUNUSVZFTFkgJnF1b3Q7Q09OVEVOVCZxdW90OykuICBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5ECi0gICBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVSBBR1JFRSBUSEFUIFlPVVIgVVNFCi0gICBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUgotICAgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5ECi0gICBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC48L3A+Ci0gICAKLTxoMz5BcHBsaWNhYmxlIExpY2Vuc2VzPC9oMz4gICAKLSAgIAotPHA+VW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMAotICAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXMgQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLSAgIEZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPkNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLCBkb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlMgcmVwb3NpdG9yeSAoJnF1b3Q7UmVwb3NpdG9yeSZxdW90OykgaW4gQ1ZTCi0gICBtb2R1bGVzICgmcXVvdDtNb2R1bGVzJnF1b3Q7KSBhbmQgbWFkZSBhdmFpbGFibGUgYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgmcXVvdDtEb3dubG9hZHMmcXVvdDspLjwvcD4KLSAgIAotPHVsPgotCTxsaT5Db250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLCBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuICBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCZxdW90O1BsdWctaW5zJnF1b3Q7KSwgcGx1Zy1pbiBmcmFnbWVudHMgKCZxdW90O0ZyYWdtZW50cyZxdW90OyksIGFuZCBmZWF0dXJlcyAoJnF1b3Q7RmVhdHVyZXMmcXVvdDspLjwvbGk+Ci0JPGxpPkVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YSZ0cmFkZTsgQVJjaGl2ZSkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7cGx1Z2lucyZxdW90Oy48L2xpPgotCTxsaT5BIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC4gIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICZxdW90O2ZlYXR1cmVzJnF1b3Q7LiAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIHRoZSBQbHVnLWlucwotICAgICAgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLjwvbGk+Ci0JPGxpPkZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCZxdW90O0luY2x1ZGVkIEZlYXR1cmVzJnF1b3Q7KS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLjwvbGk+Ci08L3VsPiAgIAotIAotPHA+VGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7YWJvdXQuaHRtbCZxdW90OyAoJnF1b3Q7QWJvdXRzJnF1b3Q7KS4gVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQKLUluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7bGljZW5zZS5odG1sJnF1b3Q7ICgmcXVvdDtGZWF0dXJlIExpY2Vuc2VzJnF1b3Q7KS4gIEFib3V0cyBhbmQgRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczo8L3A+Ci0KLTx1bD4KLQk8bGk+VGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5PC9saT4KLQk8bGk+UGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXM8L2xpPgotCTxsaT5JbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzPC9saT4KLQk8bGk+U3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7c3JjJnF1b3Q7IG9mIGNlcnRhaW4gUGx1Zy1pbnM8L2xpPgotCTxsaT5GZWF0dXJlIGRpcmVjdG9yaWVzPC9saT4KLTwvdWw+Ci0JCQotPHA+Tm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZSBFY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCZxdW90O0ZlYXR1cmUgVXBkYXRlIExpY2Vuc2UmcXVvdDspIGR1cmluZyB0aGUKLWluc3RhbGxhdGlvbiBwcm9jZXNzLiAgSWYgdGhlIEZlYXR1cmUgY29udGFpbnMgSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3Ugd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvcgotaW5mb3JtIHlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiAgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluIHRoZSAmcXVvdDtsaWNlbnNlJnF1b3Q7IHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUucHJvcGVydGllcyZxdW90OyBmb3VuZCB3aXRoaW4gYSBGZWF0dXJlLgotU3VjaCBBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMsIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluCi10aGF0IGRpcmVjdG9yeS48L3A+Ci0KLTxwPlRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMsIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVIgVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuICBTT01FIE9GIFRIRVNFCi1PVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOjwvcD4KLQotPHVsPgotCTxsaT5Db21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWw8L2E+KTwvbGk+Ci0JPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRTwvYT4pPC9saT4KLQk8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjA8L2E+KTwvbGk+Ci0JPGxpPklCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbCI+aHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWw8L2E+KTwvbGk+CQotCTxsaT5NZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbCI+aHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWw8L2E+KTwvbGk+Ci0JPGxpPk1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwiPmh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbDwvYT4pPC9saT4KLTwvdWw+Ci0KLTxwPklUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1IgVE8gVVNFIE9GIFRIRSBDT05URU5ULiAgSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSwgb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpcyBwcm92aWRlZCwgcGxlYXNlCi1jb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LjwvcD4KLQotPGgzPkNyeXB0b2dyYXBoeTwvaDM+Ci0KLTxwPkNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZSBjdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsIGFuZC9vciByZS1leHBvcnQgdG8KLSAgIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFIHVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLCByZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LAotICAgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC48L3A+Ci0gICAKLTxzbWFsbD5KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC48L3NtYWxsPiAgIAotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvMS41L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5ydGUuZmVhdHVyZS8ucHJvamVjdCBiLzEuNS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYucnRlLmZlYXR1cmUvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5MjJiYTAuLjAwMDAwMDAKLS0tIGEvMS41L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5ydGUuZmVhdHVyZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmVwZi5ydGUuZmVhdHVyZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVOYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYucnRlLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcyBiLzEuNS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYucnRlLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjdmNGQyZS4uMDAwMDAwMAotLS0gYS8xLjUvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLnJ0ZS5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLWJpbi5pbmNsdWRlcyA9IGZlYXR1cmUueG1sLFwKLSAgICAgICAgICAgICAgIGZlYXR1cmUucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBlY2xpcHNlX3VwZGF0ZV8xMjAuanBnLFwKLSAgICAgICAgICAgICAgIGxpY2Vuc2UuaHRtbApkaWZmIC0tZ2l0IGEvMS41L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5ydGUuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnIGIvMS41L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5ydGUuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmRmNzA4Li4wMDAwMDAwCi0tLSBhLzEuNS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYucnRlLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYucnRlLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzIGIvMS41L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5ydGUuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhODc5NzAuLjAwMDAwMDAKLS0tIGEvMS41L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5ydGUuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUgotCi1mZWF0dXJlTmFtZT1FUEYgUmljaHRleHQgRmVhdHVyZQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCi1kZXNjcmlwdGlvbj1FUEYgUmljaHRleHQgRmVhdHVyZS4KLXVwZGF0ZVNpdGVOYW1lPUVQRiBGZWF0dXJlIFVwZGF0ZXMKLWNvcHlyaWdodD0oYykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIGFuZCBvdGhlcnMgMjAwMCwgMjAwOC4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi1saWNlbnNlVVJMPWxpY2Vuc2UuaHRtbAotbGljZW5zZVRleHQ9VXNlIG9mIHRoaXMgZmVhdHVyZSBpcyBzdWJqZWN0IHRvIHRoZSBzYW1lIHRlcm1zIGFuZCBjb25kaXRpb25zIHdoaWNoIGdvdmVybiB0aGUgdXNlIG9mIHRoZSBQcm9kdWN0IHdoaWNoIGluY2x1ZGVkIHRoaXMgZmVhdHVyZS4KZGlmZiAtLWdpdCBhLzEuNS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYucnRlLmZlYXR1cmUvZmVhdHVyZS54bWwgYi8xLjUvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLnJ0ZS5mZWF0dXJlL2ZlYXR1cmUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMDVmZjM0Li4wMDAwMDAwCi0tLSBhLzEuNS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYucnRlLmZlYXR1cmUvZmVhdHVyZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGZlYXR1cmUKLSAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYucnRlLmZlYXR1cmUiCi0gICAgICBsYWJlbD0iJWZlYXR1cmVOYW1lIgotICAgICAgdmVyc2lvbj0iMS41LjAucXVhbGlmaWVyIgotICAgICAgcHJvdmlkZXItbmFtZT0iJXByb3ZpZGVyTmFtZSIKLSAgICAgIHBsdWdpbj0ib3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0IgotICAgICAgaW1hZ2U9ImVjbGlwc2VfdXBkYXRlXzEyMC5qcGciPgotCi0gICA8ZGVzY3JpcHRpb24+Ci0gICAgICAlZGVzY3JpcHRpb24KLSAgIDwvZGVzY3JpcHRpb24+Ci0KLSAgIDxjb3B5cmlnaHQ+Ci0gICAgICAlY29weXJpZ2h0Ci0gICA8L2NvcHlyaWdodD4KLQotICAgPGxpY2Vuc2UgdXJsPSIlbGljZW5zZVVSTCI+Ci0gICAgICAlbGljZW5zZVRleHQKLSAgIDwvbGljZW5zZT4KLQotICAgPHJlcXVpcmVzPgotICAgICAgPGltcG9ydCBwbHVnaW49ImNvbS5pYm0uaWN1Ii8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS51aSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5hcGFjaGUuYW50Ii8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2Uuc3d0Ii8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UudWkuZm9ybXMiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5qZmFjZS50ZXh0Ii8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UudWkud29ya2JlbmNoLnRleHRlZGl0b3IiLz4KLSAgIDwvcmVxdWlyZXM+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYucmljaHRleHQiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5jb21tb24iCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5jb21tb24udWkiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuY29tbW9uLndpbjMyLndpbjMyLng4NiIKLQkgb3M9IndpbjMyIgotCSB3cz0id2luMzIiCi0JIGFyY2g9Ing4NiIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotPC9mZWF0dXJlPgpkaWZmIC0tZ2l0IGEvMS41L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5ydGUuZmVhdHVyZS9saWNlbnNlLmh0bWwgYi8xLjUvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLnJ0ZS5mZWF0dXJlL2xpY2Vuc2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzZhZjk2Ni4uMDAwMDAwMAotLS0gYS8xLjUvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLnJ0ZS5mZWF0dXJlL2xpY2Vuc2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08dGl0bGU+RWNsaXBzZS5vcmcgU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L3RpdGxlPgotPC9oZWFkPgotCi08Ym9keSBsYW5nPSJFTi1VUyIgbGluaz1ibHVlIHZsaW5rPXB1cnBsZT4KLTxoMj5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L2gyPgotPHA+TWFyY2ggMTcsIDIwMDU8L3A+Ci0KLTxoMz5Vc2FnZSBPZiBDb250ZW50PC9oMz4KLQotPHA+VEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTCi0gICAoQ09MTEVDVElWRUxZICZxdW90O0NPTlRFTlQmcXVvdDspLiAgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORAotICAgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1UgQUdSRUUgVEhBVCBZT1VSIFVTRQotICAgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IKLSAgIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORAotICAgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuPC9wPgotICAgCi08aDM+QXBwbGljYWJsZSBMaWNlbnNlczwvaDM+ICAgCi0gICAKLTxwPlVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAKLSAgICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzIENvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi0gICBGb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSwgZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTIHJlcG9zaXRvcnkgKCZxdW90O1JlcG9zaXRvcnkmcXVvdDspIGluIENWUwotICAgbW9kdWxlcyAoJnF1b3Q7TW9kdWxlcyZxdW90OykgYW5kIG1hZGUgYXZhaWxhYmxlIGFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoJnF1b3Q7RG93bmxvYWRzJnF1b3Q7KS48L3A+Ci0gICAKLTx1bD4KLQk8bGk+Q29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZywgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiAgVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgmcXVvdDtQbHVnLWlucyZxdW90OyksIHBsdWctaW4gZnJhZ21lbnRzICgmcXVvdDtGcmFnbWVudHMmcXVvdDspLCBhbmQgZmVhdHVyZXMgKCZxdW90O0ZlYXR1cmVzJnF1b3Q7KS48L2xpPgotCTxsaT5FYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmEmdHJhZGU7IEFSY2hpdmUpIGluIGEgZGlyZWN0b3J5IG5hbWVkICZxdW90O3BsdWdpbnMmcXVvdDsuPC9saT4KLQk8bGk+QSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtmZWF0dXJlcyZxdW90Oy4gIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMKLSAgICAgIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS48L2xpPgotCTxsaT5GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgmcXVvdDtJbmNsdWRlZCBGZWF0dXJlcyZxdW90OykuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy48L2xpPgotPC91bD4gICAKLSAKLTxwPlRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2Fib3V0Lmh0bWwmcXVvdDsgKCZxdW90O0Fib3V0cyZxdW90OykuIFRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kCi1JbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2xpY2Vuc2UuaHRtbCZxdW90OyAoJnF1b3Q7RmVhdHVyZSBMaWNlbnNlcyZxdW90OykuICBBYm91dHMgYW5kIEZlYXR1cmUgTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZQotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6PC9wPgotCi08dWw+Ci0JPGxpPlRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeTwvbGk+Ci0JPGxpPlBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzPC9saT4KLQk8bGk+SW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSczwvbGk+Ci0JPGxpPlN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICZxdW90O3NyYyZxdW90OyBvZiBjZXJ0YWluIFBsdWctaW5zPC9saT4KLQk8bGk+RmVhdHVyZSBkaXJlY3RvcmllczwvbGk+Ci08L3VsPgotCQkKLTxwPk5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGUgRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgmcXVvdDtGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlJnF1b3Q7KSBkdXJpbmcgdGhlCi1pbnN0YWxsYXRpb24gcHJvY2Vzcy4gIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91IHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IKLWluZm9ybSB5b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpbiB0aGUgJnF1b3Q7bGljZW5zZSZxdW90OyBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnByb3BlcnRpZXMmcXVvdDsgZm91bmQgd2l0aGluIGEgRmVhdHVyZS4KLVN1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzLCBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbgotdGhhdCBkaXJlY3RvcnkuPC9wPgotCi08cD5USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTLCBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSIFRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLiAgU09NRSBPRiBUSEVTRQotT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTo8L3A+Ci0KLTx1bD4KLQk8bGk+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sPC9hPik8L2xpPgotCTxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0U8L2E+KTwvbGk+Ci0JPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wPC9hPik8L2xpPgotCTxsaT5JQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwiPmh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sPC9hPik8L2xpPgkKLQk8bGk+TWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwiPmh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sPC9hPik8L2xpPgotCTxsaT5Nb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sIj5odHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWw8L2E+KTwvbGk+Ci08L3VsPgotCi08cD5JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SIFRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2UsIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UgaXMgcHJvdmlkZWQsIHBsZWFzZQotY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC48L3A+Ci0KLTxoMz5DcnlwdG9ncmFwaHk8L2gzPgotCi08cD5Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmUgY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLCBhbmQvb3IgcmUtZXhwb3J0IHRvCi0gICBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRSB1c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywgcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwKLSAgIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuPC9wPgotICAgCi08c21hbGw+SmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguPC9zbWFsbD4gICAKLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvLmNsYXNzcGF0aCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODQyMDViMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBleGNsdWRpbmc9ImNvbS9pYm0vdW1hL2F1dGhvcmluZy92aWV3cy9CU0VkaXRvclZpZXcuamF2YXxjb20vaWJtL3VtYS9hdXRob3Jpbmcvdmlld3MvQ29udGVudFBhY2thZ2VUYWIuamF2YXxjb20vaWJtL3VtYS9hdXRob3Jpbmcvdmlld3MvR3VpZGFuY2VUYWIuamF2YXxjb20vaWJtL3VtYS9hdXRob3Jpbmcvdmlld3MvUHJvZHVjdEVkaXRvclZpZXcuamF2YXxjb20vaWJtL3VtYS9hdXRob3Jpbmcvdmlld3MvUHJvZHVjdFZpZXdlci5qYXZhfGNvbS9pYm0vdW1hL2F1dGhvcmluZy92aWV3cy9Sb2xlRG9jdW1lbnRhdGlvblRhYi5qYXZhfGNvbS9pYm0vdW1hL2F1dGhvcmluZy92aWV3cy9Sb2xlVGFza3NUYWIuamF2YXxjb20vaWJtL3VtYS9hdXRob3Jpbmcvdmlld3MvUm9sZVdvcmtQcm9kdWN0c1RhYi5qYXZhfGNvbS9pYm0vdW1hL2F1dGhvcmluZy92aWV3cy9UYXNrRGlzY2lwbGluZVRhYi5qYXZhfGNvbS9pYm0vdW1hL2F1dGhvcmluZy92aWV3cy9UYXNrRG9jdW1lbnRhdGlvblRhYi5qYXZhfGNvbS9pYm0vdW1hL2F1dGhvcmluZy92aWV3cy9UYXNrR3VpZGFuY2VzVGFiLmphdmF8Y29tL2libS91bWEvYXV0aG9yaW5nL3ZpZXdzL1Rhc2tTdGVwVGFiLmphdmF8Y29tL2libS91bWEvYXV0aG9yaW5nL3ZpZXdzL1dvcmtQcm9kdWN0RG9jdW1lbnRhdGlvblRhYi5qYXZhfGNvbS9pYm0vdW1hL2F1dGhvcmluZy92aWV3cy9Xb3JrUHJvZHVjdEd1aWRhbmNlc1RhYi5qYXZhfGNvbS9pYm0vdW1hL2F1dGhvcmluZy92aWV3cy9Xb3JrUHJvZHVjdFRhc2tzVGFiLmphdmEiIGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvLm9wdGlvbnMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLy5vcHRpb25zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OTliMzI4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvLm9wdGlvbnMKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLSMgVHVybiBvbiBkZWJ1ZyB0cmFjZSBmb3IgdGhlIEF1dGhvcmluZyBVSSBwbHVnLWluCi1vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2RlYnVnPXRydWUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvLnByb2plY3QgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MjMzNTJiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODZiYjJhYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNXZWQgTm92IDI5IDE4OjA5OjQ5IFBTVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY3VzdG9tX2NvZGVfdGVtcGxhdGVzPTw/eG1sIHZlcnNpb25cPSIxLjAiIGVuY29kaW5nXD0iVVRGLTgiPz48dGVtcGxhdGVzLz4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDEwNTQ5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aTsgc2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS41LjAucXVhbGlmaWVyCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUGx1Z2luCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWksCi0gb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWk7dmlzaWJpbGl0eTo9cmVleHBvcnQsCi0gb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0O3Zpc2liaWxpdHk6PXJlZXhwb3J0LAotIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLAotIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZSwKLSBvcmcuZWNsaXBzZS5kcmF3MmQsCi0gb3JnLmVjbGlwc2UuZ2VmLAotIG9yZy5lY2xpcHNlLnVpLmNoZWF0c2hlZXRzLAotIG9yZy5lY2xpcHNlLnVpLmZvcm1zLAotIG9yZy5lY2xpcHNlLnVpLmludHJvLAotIG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLAotIG9yZy5lY2xpcHNlLnVpLndvcmtiZW5jaC50ZXh0ZWRpdG9yLAotIG9yZy5lY2xpcHNlLmVwZi52YWxpZGF0aW9uLAotIG9yZy5lY2xpcHNlLnRlYW0uY3ZzLnVpLAotIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLAotIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZCwKLSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLAotIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLnVpO3Zpc2liaWxpdHk6PXJlZXhwb3J0LAotIG9yZy5lY2xpcHNlLnNlYXJjaCwKLSBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkucmVuZGVyLAotIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5yZW5kZXIuYXd0LAotIG9yZy5lY2xpcHNlLmVwZi5jb21tb24udWkKLUVjbGlwc2UtTGF6eVN0YXJ0OiB0cnVlCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuY29tbWFuZHMsCi0gb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZWRpdCwKLSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0LnBvbGljaWVzLAotIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmZpZ3VyZXMsCi0gb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYudXRpbCwKLSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi52aWV3ZXIsCi0gb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aSwKLSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnMsCi0gb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5jZWxsZWRpdG9ycywKLSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmNoZWF0c2hlZXRzLmFjdGlvbnMsCi0gb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5kaWFsb2dzLAotIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZG5kLAotIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycywKLSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZpbHRlcnMsCi0gb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3JtcywKLSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByZWZlcmVuY2VzLAotIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcywKLSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3ZpZGVycywKLSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnJpY2h0ZXh0LAotIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudXRpbCwKLSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnZpZXdzLAotIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkud2l6YXJkcwotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2J1aWxkLnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4YWJiYTAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotc291cmNlLi4gPSBzcmMvCi1vdXRwdXQuLiA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IC4sXAotICAgICAgICAgICAgICAgLm9wdGlvbnMsXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIGhlbHAvLFwKLSAgICAgICAgICAgICAgIGljb25zLyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIHNjaGVtYS8KLQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9oZWxwL2Jvb2sueG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9oZWxwL2Jvb2sueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4N2IwODE4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaGVscC9ib29rLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotPHRvYyBsYWJlbD0iRVBGIENvbXBvc2VyIE1ldGhvZCBBdXRocm9pbmcgSGVscCBQYWdlIiAgdG9waWM9Imh0bWwvYm9vay5odG1sIj4KLQk8dG9waWMgbGFiZWw9Ik10aG9kIEF1dGhvcmluZyBPdmVydmlldyIgaHJlZj0iaHRtbC9vdmVydmlldy5odG1sIi8+Ci0JPHRvcGljIGxhYmVsPSJBdXRob3JpbmcgVHV0b3JpYWwiIGhyZWY9Imh0bWwvdHV0b3JpYWwuaHRtbCIvPgotPC90b2M+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9JdGVyYXRpb24xNi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL0l0ZXJhdGlvbjE2LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDMxMWU0Ni4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL0l0ZXJhdGlvbjE2LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvUGhhc2UxNi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL1BoYXNlMTYuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZDYwYmQ5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvUGhhc2UxNi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL1JvbGVEZXNjcmlwdG9yLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvUm9sZURlc2NyaXB0b3IuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNjhjN2I4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvUm9sZURlc2NyaXB0b3IuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9TeW5jaEJhcjE2LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvU3luY2hCYXIxNi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjOTk0NGEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9TeW5jaEJhcjE2LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvU3luY2hCYXIyNC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL1N5bmNoQmFyMjQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYzk5NDRhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvU3luY2hCYXIyNC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL1Rhc2tEZXNjcmlwdG9yLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvVGFza0Rlc2NyaXB0b3IuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NTRlMjZlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvVGFza0Rlc2NyaXB0b3IuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9UZW1wbGF0ZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL1RlbXBsYXRlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzc2MzI1MS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL1RlbXBsYXRlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvVGVtcGxhdGVEZXNjcmlwdGlvbi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL1RlbXBsYXRlRGVzY3JpcHRpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNzYzMjUxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvVGVtcGxhdGVEZXNjcmlwdGlvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2FjdGl2aXR5LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvYWN0aXZpdHkuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NzM5M2U2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvYWN0aXZpdHkuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9hY3Rpdml0eTE2LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvYWN0aXZpdHkxNi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmMjBkZWIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9hY3Rpdml0eTE2LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvYWN0aXZpdHkyNC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2FjdGl2aXR5MjQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjIwZGViLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvYWN0aXZpdHkyNC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2FkZEFsbERlcGVuZGVudEVsZW0uZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9hZGRBbGxEZXBlbmRlbnRFbGVtLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWNhY2I5Ni4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2FkZEFsbERlcGVuZGVudEVsZW0uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9hZGRyZWZfY28uZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9hZGRyZWZfY28uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ODQwY2Q5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvYWRkcmVmX2NvLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvY2hlY2tlZC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2NoZWNrZWQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNjM0NGRiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvY2hlY2tlZC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Nsb3N1cmVfY28uZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9jbG9zdXJlX2NvLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGI1NTQxYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Nsb3N1cmVfY28uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9jb2xsYXBzZWFsbC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2NvbGxhcHNlYWxsLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTJkODBhOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2NvbGxhcHNlYWxsLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvY29sbGFwc2VkLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvY29sbGFwc2VkLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWY0YzhiYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2NvbGxhcHNlZC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Nvbm5lY3Rpb24xNi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Nvbm5lY3Rpb24xNi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4NmExMjcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9jb25uZWN0aW9uMTYuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9jb25uZWN0aW9uMjQuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9jb25uZWN0aW9uMjQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NmE1ZmU3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvY29ubmVjdGlvbjI0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvY29ud2Fybl9jby5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Nvbndhcm5fY28uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YjUwYzA2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvY29ud2Fybl9jby5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2RlY25vZGVfcGFsMTYuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9kZWNub2RlX3BhbDE2LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzE1YTViNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2RlY25vZGVfcGFsMTYuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9kZWNub2RlX3BhbDI0LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZGVjbm9kZV9wYWwyNC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0NmVhYTEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9kZWNub2RlX3BhbDI0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZW5kbm9kZV9wYWwxNi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2VuZG5vZGVfcGFsMTYuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMDY1MDZkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZW5kbm9kZV9wYWwxNi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2VuZG5vZGVfcGFsMjQuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9lbmRub2RlX3BhbDI0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2IxNzdmZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2VuZG5vZGVfcGFsMjQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9lcnJvci5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Vycm9yLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzVlN2E5NC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Vycm9yLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZXhwYW5kYWxsLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZXhwYW5kYWxsLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDIwNWIyOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2V4cGFuZGFsbC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2V4cGFuZGVkLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZXhwYW5kZWQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZjRkOWM0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZXhwYW5kZWQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mcmVldGV4dF9wYWwxNi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2ZyZWV0ZXh0X3BhbDE2LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmRiODEzZi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2ZyZWV0ZXh0X3BhbDE2LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnJlZXRleHRfcGFsMjQuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mcmVldGV4dF9wYWwyNC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4YjRlMDYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mcmVldGV4dF9wYWwyNC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvZHRvb2wxNi9zaG93X2VtcHR5X3VpX2ZvbGRlcnMuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL2R0b29sMTYvc2hvd19lbXB0eV91aV9mb2xkZXJzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODRlMmFlZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvZHRvb2wxNi9zaG93X2VtcHR5X3VpX2ZvbGRlcnMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL2V0b29sMTYvUHJlc19uYW1lX3RvZ2dsZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9QcmVzX25hbWVfdG9nZ2xlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTcwYWZhZi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9QcmVzX25hbWVfdG9nZ2xlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnVsbC9ldG9vbDE2L1ByaW50LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnVsbC9ldG9vbDE2L1ByaW50LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDQ1ZGU3NS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9QcmludC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9SZWZyZXNoLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnVsbC9ldG9vbDE2L1JlZnJlc2guZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzY2EwNGQwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnVsbC9ldG9vbDE2L1JlZnJlc2guZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL2V0b29sMTYvU3RvcC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9TdG9wLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTIwODIzYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9TdG9wLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnVsbC9ldG9vbDE2L2ZsYXRMYXlvdXQuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL2V0b29sMTYvZmxhdExheW91dC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlZjc0Y2YuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL2V0b29sMTYvZmxhdExheW91dC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9oaWVyYXJjaGljYWxMYXlvdXQuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL2V0b29sMTYvaGllcmFyY2hpY2FsTGF5b3V0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjM0NDg2MS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9oaWVyYXJjaGljYWxMYXlvdXQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL2V0b29sMTYvbW92ZV9kb3duLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnVsbC9ldG9vbDE2L21vdmVfZG93bi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkNDNlMTcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL2V0b29sMTYvbW92ZV9kb3duLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnVsbC9ldG9vbDE2L21vdmVfZG93bl9kaXNhYmxlZC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9tb3ZlX2Rvd25fZGlzYWJsZWQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMGRjZjUxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnVsbC9ldG9vbDE2L21vdmVfZG93bl9kaXNhYmxlZC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9tb3ZlX3VwLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnVsbC9ldG9vbDE2L21vdmVfdXAuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZDc0NzA2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnVsbC9ldG9vbDE2L21vdmVfdXAuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL2V0b29sMTYvbW92ZV91cF9kaXNhYmxlZC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9tb3ZlX3VwX2Rpc2FibGVkLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjYyZGYxOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9tb3ZlX3VwX2Rpc2FibGVkLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnVsbC9ldG9vbDE2L3Nob3dfbGlua2VkX2VsZW1lbnQuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL2V0b29sMTYvc2hvd19saW5rZWRfZWxlbWVudC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2ODRmN2UuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL2V0b29sMTYvc2hvd19saW5rZWRfZWxlbWVudC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9zaG93X2xpbmtlZF9lbGVtZW50X2Rpc2FibGVkLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnVsbC9ldG9vbDE2L3Nob3dfbGlua2VkX2VsZW1lbnRfZGlzYWJsZWQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYTdmOGZjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnVsbC9ldG9vbDE2L3Nob3dfbGlua2VkX2VsZW1lbnRfZGlzYWJsZWQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL2V0b29sMTYvc2hvd191aV9mb2xkZXJzLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnVsbC9ldG9vbDE2L3Nob3dfdWlfZm9sZGVycy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljNTRlMDYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL2V0b29sMTYvc2hvd191aV9mb2xkZXJzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnVsbC9ldG9vbDE2L3N5bmNlZC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9zeW5jZWQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MWE3NjAyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnVsbC9ldG9vbDE2L3N5bmNlZC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi92YWxpZGF0ZV9tZXRob2RfbGliLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnVsbC9ldG9vbDE2L3ZhbGlkYXRlX21ldGhvZF9saWIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNmMyZTNiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnVsbC9ldG9vbDE2L3ZhbGlkYXRlX21ldGhvZF9saWIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL2V0b29sMTYvdmFsaWRhdGVfbWV0aG9kX2xpYl9kaXNhYmxlZC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi92YWxpZGF0ZV9tZXRob2RfbGliX2Rpc2FibGVkLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjQ4NjRlNS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi92YWxpZGF0ZV9tZXRob2RfbGliX2Rpc2FibGVkLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnVsbC9vYmoxNi9BY3Rpdml0eS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvb2JqMTYvQWN0aXZpdHkuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjIwZGViLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnVsbC9vYmoxNi9BY3Rpdml0eS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvb2JqMTYvQ2hlY2suZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL29iajE2L0NoZWNrLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTI4OTcyMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvb2JqMTYvQ2hlY2suZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL29iajE2L0NvbGxhcHNlZC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvb2JqMTYvQ29sbGFwc2VkLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGIzM2MzOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvb2JqMTYvQ29sbGFwc2VkLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnVsbC9vYmoxNi9EaXNhYmxlQ2hlY2suZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL29iajE2L0Rpc2FibGVDaGVjay5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzNjczNzYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL29iajE2L0Rpc2FibGVDaGVjay5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvb2JqMTYvRGlzYWJsZVVuY2hlY2suZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL29iajE2L0Rpc2FibGVVbmNoZWNrLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWUyYTc4ZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvb2JqMTYvRGlzYWJsZVVuY2hlY2suZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL29iajE2L0V4cGFuZGVkLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnVsbC9vYmoxNi9FeHBhbmRlZC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzNTc0NTQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL29iajE2L0V4cGFuZGVkLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnVsbC9vYmoxNi9NZXRob2RDb25maWd1cmF0aW9uLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnVsbC9vYmoxNi9NZXRob2RDb25maWd1cmF0aW9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGU4OTYwMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvb2JqMTYvTWV0aG9kQ29uZmlndXJhdGlvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvb2JqMTYvTWV0aG9kRWxlbWVudC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvb2JqMTYvTWV0aG9kRWxlbWVudC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0ZmIzMGUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL29iajE2L01ldGhvZEVsZW1lbnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL29iajE2L01ldGhvZExpYnJhcnkuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL29iajE2L01ldGhvZExpYnJhcnkuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMGEzMTFlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnVsbC9vYmoxNi9NZXRob2RMaWJyYXJ5LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnVsbC9vYmoxNi9NZXRob2RQbHVnaW4uZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL29iajE2L01ldGhvZFBsdWdpbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiODJjMzkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL29iajE2L01ldGhvZFBsdWdpbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvb2JqMTYvUHJvY2Vzcy5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvb2JqMTYvUHJvY2Vzcy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlYWM1OWYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL29iajE2L1Byb2Nlc3MuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL29iajE2L1VuY2hlY2suZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL29iajE2L1VuY2hlY2suZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNGZhOTYzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnVsbC9vYmoxNi9VbmNoZWNrLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnVsbC9vYmoxNi9Xb3JrUHJvZHVjdERlc2NyaXB0b3IuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL29iajE2L1dvcmtQcm9kdWN0RGVzY3JpcHRvci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyMTgyMjkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL29iajE2L1dvcmtQcm9kdWN0RGVzY3JpcHRvci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvb3ZyMTYvZXJyb3Jfb3ZyLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnVsbC9vdnIxNi9lcnJvcl9vdnIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMTEyNDE2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnVsbC9vdnIxNi9lcnJvcl9vdnIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL3ZpZXcxNi9BdXRob3JpbmdQZXJzcGVjdGl2ZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvdmlldzE2L0F1dGhvcmluZ1BlcnNwZWN0aXZlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDBhMzExZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvdmlldzE2L0F1dGhvcmluZ1BlcnNwZWN0aXZlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnVsbC92aWV3MTYvQnJvd3NpbmdQZXJzcGVjdGl2ZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvdmlldzE2L0Jyb3dzaW5nUGVyc3BlY3RpdmUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZTg5NjAyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnVsbC92aWV3MTYvQnJvd3NpbmdQZXJzcGVjdGl2ZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvdmlldzE2L0NvbmZpZ3VyYXRpb25FcnJvckxvZ1ZpZXcuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL3ZpZXcxNi9Db25maWd1cmF0aW9uRXJyb3JMb2dWaWV3LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTFiNjM3ZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvdmlldzE2L0NvbmZpZ3VyYXRpb25FcnJvckxvZ1ZpZXcuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL3ZpZXcxNi9Db25maWd1cmF0aW9uVmlldy5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvdmlldzE2L0NvbmZpZ3VyYXRpb25WaWV3LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGU4OTYwMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvdmlldzE2L0NvbmZpZ3VyYXRpb25WaWV3LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnVsbC92aWV3MTYvQ29udGVudFZpZXcuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL3ZpZXcxNi9Db250ZW50Vmlldy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwYTMxMWUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL3ZpZXcxNi9Db250ZW50Vmlldy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvdmlldzE2L0xpYnJhcnlWaWV3LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnVsbC92aWV3MTYvTGlicmFyeVZpZXcuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMGEzMTFlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnVsbC92aWV3MTYvTGlicmFyeVZpZXcuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL3ZpZXcxNi9NZXRob2RQbHVnaW4uZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL3ZpZXcxNi9NZXRob2RQbHVnaW4uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYjgyYzM5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnVsbC92aWV3MTYvTWV0aG9kUGx1Z2luLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnVsbC93aXpiYW4vTmV3LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnVsbC93aXpiYW4vTmV3LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTI0OTgzMS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvd2l6YmFuL05ldy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvd2l6YmFuL3N5bmNocm9uaXphdGlvbi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvd2l6YmFuL3N5bmNocm9uaXphdGlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyNGIzNjguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL3dpemJhbi9zeW5jaHJvbml6YXRpb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9oaWRlVW5jaGVja2VkRWxlbS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2hpZGVVbmNoZWNrZWRFbGVtLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODcwOTM0Yi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2hpZGVVbmNoZWNrZWRFbGVtLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvbGlua19wYWwxNi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2xpbmtfcGFsMTYuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOGY0MDhjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvbGlua19wYWwxNi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2xpbmtfcGFsMjQuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9saW5rX3BhbDI0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTQxMzdlMS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2xpbmtfcGFsMjQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9tYXJxX3BhbDE2LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvbWFycV9wYWwxNi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3Zjg3NWIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9tYXJxX3BhbDE2LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvbWFycV9wYWwyNC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL21hcnFfcGFsMjQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NTdkNzg0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvbWFycV9wYWwyNC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL21vdmVfZG93bi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL21vdmVfZG93bi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzMjgzNTcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9tb3ZlX2Rvd24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9tb3ZlX3VwLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvbW92ZV91cC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzMGMyYzkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9tb3ZlX3VwLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2VsZWN0X3BhbDE2LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2VsZWN0X3BhbDE2LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmQ1Y2FmYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NlbGVjdF9wYWwxNi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NlbGVjdF9wYWwyNC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NlbGVjdF9wYWwyNC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViMGZjZmMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zZWxlY3RfcGFsMjQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS9hY3Rpdml0eS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL2FjdGl2aXR5LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzczOTNlNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL2FjdGl2aXR5LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvYXJ0aWZhY3QuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS9hcnRpZmFjdC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwMWQyMTkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS9hcnRpZmFjdC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL2NhcGFiaWxpdHlwYXR0ZXJuLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvY2FwYWJpbGl0eXBhdHRlcm4uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkODBiMWFjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvY2FwYWJpbGl0eXBhdHRlcm4uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS9jaGVja2xpc3QuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS9jaGVja2xpc3QuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMzNhYTNiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvY2hlY2tsaXN0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvY29uY2VwdC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL2NvbmNlcHQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMGU5NWNkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvY29uY2VwdC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL2NvbnRlbnRwYWNrYWdlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvY29udGVudHBhY2thZ2UuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlM2FkOTZhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvY29udGVudHBhY2thZ2UuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS9jdXN0b21jYXQuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS9jdXN0b21jYXQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YmIyZDhmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvY3VzdG9tY2F0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvZGVsaXZlcmFibGUuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS9kZWxpdmVyYWJsZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhMTA1NjMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS9kZWxpdmVyYWJsZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL2RlbGl2ZXJ5cHJvY2Vzcy5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL2RlbGl2ZXJ5cHJvY2Vzcy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyYmE3ODguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS9kZWxpdmVyeXByb2Nlc3MuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS9kaXNjaXBsaW5lLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvZGlzY2lwbGluZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3MTVhOWIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS9kaXNjaXBsaW5lLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvZGlzY2lwbGluZWdyb3VwLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvZGlzY2lwbGluZWdyb3VwLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2I0MzA2OS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL2Rpc2NpcGxpbmVncm91cC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL2RvbWFpbi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL2RvbWFpbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwZTI1N2QuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS9kb21haW4uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS9ndWlkZWxpbmUuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS9ndWlkZWxpbmUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZTkxZTViLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvZ3VpZGVsaW5lLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvaXRlcmF0aW9uLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvaXRlcmF0aW9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjVjOGExNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL2l0ZXJhdGlvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL21ldGhvZGxpYnJhcnkuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS9tZXRob2RsaWJyYXJ5LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGI0Zjk3MC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL21ldGhvZGxpYnJhcnkuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS9tZXRob2RwbHVnaW4uZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS9tZXRob2RwbHVnaW4uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OTFhMjNjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvbWV0aG9kcGx1Z2luLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvbWlsZXN0b25lLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvbWlsZXN0b25lLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTc2ZmY5NC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL21pbGVzdG9uZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL291dGNvbWUuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS9vdXRjb21lLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTcwMzUxOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL291dGNvbWUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS9waGFzZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL3BoYXNlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTVjYjNjZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL3BoYXNlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvcHJvY2Vzcy5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL3Byb2Nlc3MuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZjlhMDg1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvcHJvY2Vzcy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL3Byb2Nlc3Njb21wb25lbnQuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS9wcm9jZXNzY29tcG9uZW50LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGY5YTA4NS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL3Byb2Nlc3Njb21wb25lbnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS9wcm9jZXNzY29udHJpYnV0aW9uLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvcHJvY2Vzc2NvbnRyaWJ1dGlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5NjZiNjAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS9wcm9jZXNzY29udHJpYnV0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvcHJvY2Vzc3BhY2thZ2UuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS9wcm9jZXNzcGFja2FnZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3NTdmYzguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS9wcm9jZXNzcGFja2FnZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL3Byb2Nlc3NwbGFubmluZ3RlbXBsYXRlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvcHJvY2Vzc3BsYW5uaW5ndGVtcGxhdGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZDA2ODA0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvcHJvY2Vzc3BsYW5uaW5ndGVtcGxhdGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS9yb2xlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvcm9sZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5ZWJkZjIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS9yb2xlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvcm9sZWRlc19vYmouZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS9yb2xlZGVzX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1NTI0YWIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS9yb2xlZGVzX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL3JvbGVkZXNjcmlwdG9yLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvcm9sZWRlc2NyaXB0b3IuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNWEyMmIwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvcm9sZWRlc2NyaXB0b3IuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS9yb2xlc2V0LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvcm9sZXNldC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmYjY3YzYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS9yb2xlc2V0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvdGFzay5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL3Rhc2suZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NjMzZDU4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvdGFzay5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL3Rhc2tkZXNfb2JqLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvdGFza2Rlc19vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNDllZmUwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvdGFza2Rlc19vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS90YXNrZGVzY3JpcHRvci5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL3Rhc2tkZXNjcmlwdG9yLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzQ1ZDY1MS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL3Rhc2tkZXNjcmlwdG9yLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvdGFza2Rlc2NyaXB0b3IxLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvdGFza2Rlc2NyaXB0b3IxLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzQ1ZDY1MS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL3Rhc2tkZXNjcmlwdG9yMS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL3RlY2huaXF1ZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL3RlY2huaXF1ZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxNTEzNWMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS90ZWNobmlxdWUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS90ZW1wbGF0ZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL3RlbXBsYXRlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTU3YTdlMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL3RlbXBsYXRlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvdG9vbC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL3Rvb2wuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YzU1YTJjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvdG9vbC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL3Rvb2xtZW50b3IuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS90b29sbWVudG9yLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGM1NWEyYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL3Rvb2xtZW50b3IuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS93aGl0ZXBhcGVyLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvd2hpdGVwYXBlci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyZTQ4ZWYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS93aGl0ZXBhcGVyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvd29ya2Rlc19vYmouZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS93b3JrZGVzX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlZWE4Y2MuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS93b3JrZGVzX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL3dvcmtvcmRlci5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL3dvcmtvcmRlci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwNWViYzAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS93b3Jrb3JkZXIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS93b3JrcHJvZHVjdGRlc2NyaXB0b3IuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS93b3JrcHJvZHVjdGRlc2NyaXB0b3IuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MjE4MjI5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvd29ya3Byb2R1Y3RkZXNjcmlwdG9yLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvd3BndWlkZWxpbmUuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS93cGd1aWRlbGluZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllOTFlNWIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS93cGd1aWRlbGluZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3Nob3dDb25maWdFcnJvci5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3Nob3dDb25maWdFcnJvci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxYjYzN2QuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaG93Q29uZmlnRXJyb3IuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zdG5vZGVfcGFsMTYuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zdG5vZGVfcGFsMTYuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMjIyZjRkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc3Rub2RlX3BhbDE2LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc3Rub2RlX3BhbDI0LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc3Rub2RlX3BhbDI0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTU2YjFmYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3N0bm9kZV9wYWwyNC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3N5bmNiYXJfcGFsMTYuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zeW5jYmFyX3BhbDE2LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmQ5ZDBmZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3N5bmNiYXJfcGFsMTYuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zeW5jYmFyX3BhbDI0LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc3luY2Jhcl9wYWwyNC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwN2QwN2YuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zeW5jYmFyX3BhbDI0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvd2FybmluZy5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3dhcm5pbmcuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZWUyMGFhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvd2FybmluZy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3dmX2VkaXRvcl9pY29uLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvd2ZfZWRpdG9yX2ljb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZGRjMWNjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvd2ZfZWRpdG9yX2ljb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy93aXpiYW4vc3luY2hyb25pemF0aW9uLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvd2l6YmFuL3N5bmNocm9uaXphdGlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyNGIzNjguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy93aXpiYW4vc3luY2hyb25pemF0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvcGx1Z2luLnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZTlhMzI5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjMgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLQotIyBQbHVnLWluCi1wbHVnaW5OYW1lPUVQRiBBdXRob3JpbmcgVUkKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotCi0jIENhdGVnb3J5Ci1tZXRob2RDYXRlZ29yeU5hbWU9TWV0aG9kCi0KLSMgUGVyc3BlY3RpdmUKLWF1dGhvcmluZ1BlcnNwZWN0aXZlTmFtZT1BdXRob3JpbmcKLWJyb3dzaW5nUGVyc3BlY3RpdmVOYW1lPUJyb3dzaW5nCi0KLSMgVmlld3MKLWxpYnJhcnlWaWV3TmFtZT1MaWJyYXJ5Ci1jb25maWd1cmF0aW9uVmlld05hbWU9Q29uZmlndXJhdGlvbgotY29udGVudFZpZXdOYW1lPUNvbnRlbnQKLWNvbmZpZ3VyYXRpb25FcnJvckxvZ1ZpZXdOYW1lPUNvbmZpZ3VyYXRpb24gRXJyb3IgTG9nCi0KLSMgRWRpdG9ycwotbWV0aG9kRWxlbWVudEVkaXRvck5hbWU9TWV0aG9kIEVsZW1lbnQgRWRpdG9yCi1jb25maWd1cmF0aW9uRWRpdG9yTmFtZT1Db25maWd1cmF0aW9uIEVkaXRvcgotcHJvY2Vzc0VkaXRvck5hbWU9UHJvY2VzcyBFZGl0b3IKLWFjdGl2aXR5RGlhZ3JhbUVkaXRvck5hbWU9QWN0aXZpdHkgRGlhZ3JhbSBFZGl0b3IKLWFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvck5hbWU9QWN0aXZpdHkgRGV0YWlsIERpYWdyYW0gRWRpdG9yCi13b3JrUHJvZHVjdERlcGVkZW5jeURpYWdyYW1FZGl0b3JOYW1lPVdvcmsgUHJvZHVjdCBEZXBlbmRlbmN5IERpYWdyYW0gRWRpdG9yCi0KLSMgV2l6YXJkcwotbmV3TWV0aG9kTGlicmFyeVdpemFyZE5hbWU9TWV0aG9kIExpYnJhcnkKLW5ld01ldGhvZExpYnJhcnlXaXphcmREZXNjcmlwdGlvbj1DcmVhdGUgYSBuZXcgbWV0aG9kIGxpYnJhcnkuCi1uZXdNZXRob2RQbHVnaW5XaXphcmROYW1lPU1ldGhvZCBQbHVnLWluCi1uZXdNZXRob2RQbHVnaW5XaXphcmREZXNjcmlwdGlvbj1DcmVhdGUgYSBuZXcgbWV0aG9kIHBsdWctaW4uCi1uZXdDb25maWd1cmF0aW9uV2l6YXJkTmFtZT1NZXRob2QgQ29uZmlndXJhdGlvbgotbmV3Q29uZmlndXJhdGlvbldpemFyZERlc2NyaXB0aW9uPUNyZWF0ZSBhIG5ldyBtZXRob2QgY29uZmlndXJhdGlvbi4KLQotIyBDaGVhdCBTaGVldHMKLW1ldGhvZEF1dGhvcmluZ0NoZWF0U2hlZXRzTmFtZT1NZXRob2QgQXV0aG9yaW5nIENoZWF0IFNoZWV0cwotQ2hlYXRzaGVldEdldHN0YXJ0ZWRDYXRlZ29yeVRleHQ9R2V0dGluZyBTdGFydGVkCi1DaGVhdHNoZWV0UmV1c2FibGVDb250ZW50Q2F0ZWdvcnlUZXh0PUNyZWF0ZSBSZXVzYWJsZSBNZXRob2QgQ29udGVudAotQ2hlYXRzaGVldFdyaXRlQ29udGVudENhdGVnb3J5VGV4dD1Xcml0ZSBNZXRob2QgQ29udGVudAotQ2hlYXRzaGVldFByb2Nlc3Nlc0NhdGVnb3J5VGV4dD1Xb3JrIHdpdGggUHJvY2Vzc2VzCi1DaGVhdHNoZWV0TmF2aWdhdGVNZXRob2RDb250ZW50PU5hdmlnYXRlIE1ldGhvZCBDb250ZW50Ci1DaGVhdHNoZWV0Q3JlYXRlTWV0aG9kQ29uZmlndXJhdGlvbj1DcmVhdGUgeW91ciBvd24gTWV0aG9kIENvbmZpZ3VyYXRpb24KLUNoZWF0c2hlZXRDcmVhdGVNZXRob2RQbHVnaW49Q3JlYXRlIHlvdXIgb3duIE1ldGhvZCBQbHVnLWluCi1DaGVhdHNoZWV0QWRkTWV0aG9kQ29udGVudD1BZGQgbmV3IE1ldGhvZCBDb250ZW50IHN1Y2ggYXMgUm9sZXMsIFRhc2tzLCBXb3JrIFByb2R1Y3RzLCBvciBHdWlkYW5jZQotQ2hlYXRzaGVldFRhaWxvck1ldGhvZEVsZW1lbnRzPVRhaWxvciBleGlzdGluZyBNZXRob2QgRWxlbWVudHMgKFJvbGVzLCBUYXNrcywgV29yayBQcm9kdWN0cyBvciBHdWlkYW5jZSkgVXNpbmcgQ29udHJpYnV0aW9uCi1DaGVhdHNoZWV0UmVwbGFjZU1laHRvZEVsZW1lbnRzPVJlcGxhY2UgZXhpc3RpbmcgTWV0aG9kIEVsZW1lbnRzIChSb2xlcywgVGFza3MsIFdvcmsgUHJvZHVjdHMgb3IgR3VpZGFuY2UpCi1DaGVhdHNoZWV0QWRkTWV0aG9kUmVmT3JIeXBlcmxpbms9QWRkIGEgTWV0aG9kIFJlZmVyZW5jZSBvciBIeXBlcmxpbmsgKFVSTCkKLUNoZWF0c2hlZXRBcHBseUNhcGFiaWxpdHlQYXR0ZXJuPUFwcGx5IGEgQ2FwYWJpbGl0eSBQYXR0ZXJuCi1DaGVhdHNoZWV0Q3JlYXRlUHJvY2Vzcz1DcmVhdGUgYSBQcm9jZXNzIChDYXBhYmlsaXR5IFBhdHRlcm4gb3IgRGVsaXZlcnkgUHJvY2VzcykKLQotIyBBY3Rpb24gU2V0Ci1hdXRob3JpbmdBY3Rpb25TZXQ9QXV0aG9yaW5nCi1jaGVhdFNoZWV0c0FjdGlvblNldD1DaGVhdCBTaGVldHMKLQotIyBHbG9iYWwgQWN0aW9ucwotbmV3TGlicmFyeUFjdGlvbj1NZXRob2QgJkxpYnJhcnkKLW5ld0xpYnJhcnlBY3Rpb25Ub29sdGlwPUNyZWF0ZSBhIG5ldyBNZXRob2QgTGlicmFyeQotbmV3UGx1Z2luQWN0aW9uPU1ldGhvZCAmUGx1Zy1pbgotbmV3UGx1Z2luQWN0aW9uVG9vbHRpcD1DcmVhdGUgYSBuZXcgTWV0aG9kIFBsdWctaW4KLW5ld0NvbmZpZ0FjdGlvbj1NZXRob2QgJkNvbmZpZ3VyYXRpb24KLW5ld0NvbmZpZ0FjdGlvblRvb2x0aXA9Q3JlYXRlIGEgbmV3IE1ldGhvZCBDb25maWd1cmF0aW9uCi1vcGVuTGlicmFyeUFjdGlvbj1NZXRob2QgJkxpYnJhcnkKLW9wZW5MaWJyYXJ5QWN0aW9uVG9vbHRpcD1PcGVuIGFuIGV4aXN0aW5nIE1ldGhvZCBMaWJyYXJ5Ci1vcGVuQ29uZmlnQWN0aW9uPU1ldGhvZCAmQ29uZmlndXJhdGlvbgotb3BlbkNvbmZpZ0FjdGlvblRvb2x0aXA9T3BlbiBhbiBleGlzdGluZyBNZXRob2QgQ29uZmlndXJhdGlvbgotb3BlbkNoZWF0U2hlZXRzPSZDaGVhdCBTaGVldHMuLi4KLQotIyBMaWJyYXJ5IFZpZXcgQWN0aW9ucwotbGlua1dpdGhFZGl0b3I9TGluayB3aXRoIEVkaXRvcgotbGlua1dpdGhFZGl0b3JUb29sdGlwPUxpbmsgd2l0aCBFZGl0b3IKLXNob3dQcmVzZW50YXRpb25OYW1lcz1TaG93IFByZXNlbnRhdGlvbiBOYW1lcwotc2hvd1ByZXNlbnRhdGlvbk5hbWVzVG9vbHRpcD1TaG93IFByZXNlbnRhdGlvbiBOYW1lcwotCi0jIENvbmZpZ3VyYXRpb24gVmlldyBBY3Rpb25zCi1yZWZyZXNoQ29uZmlnPVJlZnJlc2gKLXJlZnJlc2hDb25maWdUb29sdGlwPVJlZnJlc2ggQ29uZmlndXJhdGlvbgotCi0jIFByZWZlcmVuY2UgUGFnZQotYXV0aG9yaW5nUHJlZmVyZW5jZVBhZ2U9QXV0aG9yaW5nCi1wcm9jZXNzRWRpdG9yPVByb2Nlc3MgRWRpdG9yCi1saWJyYXJ5T3B0aW9ucz1MaWJyYXJ5IE9wdGlvbnMKLXN0YXJ0dXBBbmRTaHV0ZG93bj1TdGFydHVwIGFuZCBTaHV0ZG93bgotZGVidWc9RGVidWcKLW1vZGVsaW5nT3B0aW9ucz1Nb2RlbGluZyBPcHRpb25zCi1kaWFncmFtQXBwZWFyYW5jZT1EaWFncmFtIEFwcGVhcmFuY2UKLWJyZWFrZG93bkVsZW1lbnRBdHRyaWJ1dGVzPUJyZWFrZG93biBFbGVtZW50IEF0dHJpYnV0ZXMKLWxpYnJhcnlWaWV3T3B0aW9ucz1MaWJyYXJ5IFZpZXcgT3B0aW9ucwotCi0jIENvbW1hbmQgSGFuZGxlcgotc2VsZWN0QWxsPVNlbGVjdCBBbGwKLQotIyBQcm9wZXJ0aWVzIFZpZXcKLV9VSV9Qcm9jZXNzRWRpdG9yX21lbnU9UHJvY2VzcwotX1VJX0NyZWF0ZUNoaWxkX21lbnVfaXRlbT0mTmV3IENoaWxkCi1fVUlfQ3JlYXRlU2libGluZ19tZW51X2l0ZW09TiZldyBTaWJsaW5nCi1fVUlfU2hvd1Byb3BlcnRpZXNWaWV3X21lbnVfaXRlbT1TaG93IFByb3BlcnRpZXMgJlZpZXcKLV9VSV9SZWZyZXNoVmlld2VyX21lbnVfaXRlbT1SZSZmcmVzaAotX1VJX1Byb3BlcnRpZXNfR2VuZXJhbD1HZW5lcmFsCi1fVUlfUHJvcGVydGllc19Eb2N1bWVudGF0aW9uPURvY3VtZW50YXRpb24KLV9VSV9Qcm9wZXJ0aWVzX0d1aWRhbmNlPUd1aWRhbmNlCi1fVUlfUHJvcGVydGllc19Xb3JrX1JvbGx1cD1Xb3JrIFJvbGx1cAotX1VJX1Byb3BlcnRpZXNfVGVhbV9Sb2xsdXA9VGVhbSBSb2xsdXAKLV9VSV9Qcm9wZXJ0aWVzX1dQX1JvbGx1cD1Xb3JrIFByb2R1Y3QgUm9sbHVwCi1fVUlfUHJvcGVydGllc19Sb2xlcz1Sb2xlcwotX1VJX1Byb3BlcnRpZXNfV29ya1Byb2R1Y3RzPVdvcmsgUHJvZHVjdHMKLV9VSV9Qcm9wZXJ0aWVzX1N0ZXBzPVN0ZXBzCi1fVUlfUHJvcGVydGllc19UZWFtcz1UZWFtcwotCi1SaWNoVGV4dE1hcmtlclR5cGVOYW1lPUhUTUwgUHJvYmxlbXMKLUNvbmZpZ3VyYXRpb25NYXJrZXJUeXBlTmFtZT1Db25maWd1cmF0aW9uIFByb2JsZW1zCi1FeHBsYW5hdGlvblRleHQ9RXhwbGFuYXRpb24KLQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9wbHVnaW4ueG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MmNlODI2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDY4MSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPHBsdWdpbj4KLQotICAgPGV4dGVuc2lvbi1wb2ludAotICAgICAgICAgaWQ9Im5ld1BsdWdpbldpemFyZCIKLSAgICAgICAgIG5hbWU9Ik5ldyBNZXRob2QgUGx1Zy1pbiBXaXphcmQgRXh0ZW5zaW9uIgotICAgICAgICAgc2NoZW1hPSJzY2hlbWEvTmV3UGx1Z2luV2l6YXJkLmV4c2QiIC8+Ci0gICAgICAgICAKLSAgIDxleHRlbnNpb24tcG9pbnQKLSAgICAgICAgIGlkPSJuZXdDb25maWd1cmF0aW9uV2l6YXJkIgotICAgICAgICAgbmFtZT0iTmV3IE1ldGhvZCBDb25maWd1cmF0aW9uIFdpemFyZCBFeHRlbnNpb24iCi0gICAgICAgICBzY2hlbWE9InNjaGVtYS9OZXdDb25maWd1cmF0aW9uV2l6YXJkLmV4c2QiIC8+ICAgICAgICAgCi0gICAKLSAgIDxleHRlbnNpb24tcG9pbnQKLSAgICAgICAgIGlkPSJkZXNjcmlwdGlvblBhZ2VDb2x1bW5Qcm92aWRlciIKLSAgICAgICAgIG5hbWU9IkVkaXRvciBEZXNjcmlwdGlvbiBQYWdlIENvbHVtbiBQcm92aWRlciIKLSAgICAgICAgIHNjaGVtYT0ic2NoZW1hL2Rlc2NyaXB0aW9uUGFnZUNvbHVtblByb3ZpZGVyLmV4c2QiLz4KLSAgICAgICAgIAotICAgPGV4dGVuc2lvbi1wb2ludAotICAgICAgICAgaWQ9ImRlc2NyaXB0aW9uUGFnZVNlY3Rpb25Qcm92aWRlciIKLSAgICAgICAgIG5hbWU9IkVkaXRvciBEZXNjcmlwdGlvbiBQYWdlIFNlY3Rpb24gUHJvdmlkZXIiCi0gICAgICAgICBzY2hlbWE9InNjaGVtYS9kZXNjcmlwdGlvblBhZ2VTZWN0aW9uUHJvdmlkZXIuZXhzZCIvPgotICAgICAgICAgCi0gIDxleHRlbnNpb24tcG9pbnQKLSAgICAgICAgIGlkPSJjb25maWd1cmF0aW9uVmlld01lbnVQcm92aWRlciIKLSAgICAgICAgIG5hbWU9IkNvbmZpZ3VyYXRpb24gVmlldyBNZW51IFByb3ZpZGVyIgotICAgICAgICAgc2NoZW1hPSJzY2hlbWEvY29uZmlndXJhdGlvblZpZXdNZW51UHJvdmlkZXIuZXhzZCIvPgotCi0gICA8ZXh0ZW5zaW9uLXBvaW50Ci0gICAgICAgICBpZD0id2l6YXJkUmVnaXN0cnlQcm92aWRlciIKLSAgICAgICAgIG5hbWU9IldpemFyZCBSZWdpc3RlcnkgUHJvdmlkZXIiCi0gICAgICAgICBzY2hlbWE9InNjaGVtYS93aXphcmRSZWdpc3RyeVByb3ZpZGVyLmV4c2QiLz4KLSAgIDxleHRlbnNpb24tcG9pbnQgaWQ9IkVkaXRvck9wZW5lciIgbmFtZT0iRWRpdG9yIE9wZW5lciIgc2NoZW1hPSJzY2hlbWEvZWRpdG9yT3BlbmVyLmV4c2QiLz4KLSAgIDxleHRlbnNpb24tcG9pbnQgaWQ9IkN1c3RvbWl6ZWRMb2NrZXIiIG5hbWU9IkN1c3RvbWl6ZWQgTG9ja2VyIiBzY2hlbWE9InNjaGVtYS9DdXN0b21pemVkTG9ja2VyLmV4c2QiLz4KLSAgIDxleHRlbnNpb24tcG9pbnQgaWQ9Im1ldGhvZFJpY2hUZXh0IiBuYW1lPSJNZXRob2QgUmljaCBUZXh0IEV4dGVuc2lvbiIgc2NoZW1hPSJzY2hlbWEvbWV0aG9kUmljaFRleHQuZXhzZCIvPgotICAgPGV4dGVuc2lvbi1wb2ludCBpZD0ibWV0aG9kUmljaFRleHRFZGl0b3IiIG5hbWU9Ik1ldGhvZCBSaWNoIFRleHQgRWRpdG9yIEV4dGVuc2lvbiIgc2NoZW1hPSJzY2hlbWEvbWV0aG9kUmljaFRleHRFZGl0b3IuZXhzZCIvPgotICAgPGV4dGVuc2lvbi1wb2ludCBpZD0iY29udGVudFByb3ZpZGVyRmFjdG9yaWVzIiBuYW1lPSJDb250ZW50IFByb3ZpZGVyIEZhY3RvcmllcyIgc2NoZW1hPSJzY2hlbWEvY29udGVudFByb3ZpZGVyRmFjdG9yaWVzLmV4c2QiLz4KLSAgIDxleHRlbnNpb24tcG9pbnQgaWQ9Ik1ldGhvZEVsZW1lbnRFZGl0b3JQYWdlUHJvdmlkZXJzIiBuYW1lPSJNZXRob2QgRWxlbWVudCBFZGl0b3IgUGFnZSBQcm92aWRlcnMiIHNjaGVtYT0ic2NoZW1hL01ldGhvZEVsZW1lbnRFZGl0b3JQYWdlUHJvdmlkZXJzLmV4c2QiLz4KLSAgIAotICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkucGVyc3BlY3RpdmVzIj4KLSAgICAgIDxwZXJzcGVjdGl2ZQotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nUGVyc3BlY3RpdmUiCi0gICAgICAgICAgICBmaXhlZD0iZmFsc2UiCi0gICAgICAgICAgICBpY29uPSJpY29ucy9mdWxsL3ZpZXcxNi9BdXRob3JpbmdQZXJzcGVjdGl2ZS5naWYiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdQZXJzcGVjdGl2ZSIKLSAgICAgICAgICAgIG5hbWU9IiVhdXRob3JpbmdQZXJzcGVjdGl2ZU5hbWUiLz4KLSAgICAgIDxwZXJzcGVjdGl2ZQotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQnJvd3NpbmdQZXJzcGVjdGl2ZSIKLSAgICAgICAgICAgIGZpeGVkPSJmYWxzZSIKLSAgICAgICAgICAgIGljb249Imljb25zL2Z1bGwvdmlldzE2L0Jyb3dzaW5nUGVyc3BlY3RpdmUuZ2lmIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQnJvd3NpbmdQZXJzcGVjdGl2ZSIKLSAgICAgICAgICAgIG5hbWU9IiVicm93c2luZ1BlcnNwZWN0aXZlTmFtZSIvPgotICAgPC9leHRlbnNpb24+Ci0KLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnZpZXdzIj4KLSAgICAgIDx2aWV3Ci0gICAgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2UuZXBmLnVpLnZpZXdzLmNhdGVnb3J5IgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudmlld3MuTGlicmFyeVZpZXciCi0gICAgICAgICAgICBpY29uPSJpY29ucy9mdWxsL3ZpZXcxNi9MaWJyYXJ5Vmlldy5naWYiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS52aWV3cy5MaWJyYXJ5VmlldyIKLSAgICAgICAgICAgIG5hbWU9IiVsaWJyYXJ5Vmlld05hbWUiLz4KLSAgICAgIDx2aWV3Ci0gICAgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2UuZXBmLnVpLnZpZXdzLmNhdGVnb3J5IgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudmlld3MuQ29uZmlndXJhdGlvblZpZXciCi0gICAgICAgICAgICBpY29uPSJpY29ucy9mdWxsL3ZpZXcxNi9Db25maWd1cmF0aW9uVmlldy5naWYiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS52aWV3cy5Db25maWd1cmF0aW9uVmlldyIKLSAgICAgICAgICAgIG5hbWU9IiVjb25maWd1cmF0aW9uVmlld05hbWUiLz4KLSAgICAgIDx2aWV3Ci0gICAgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2UuZXBmLnVpLnZpZXdzLmNhdGVnb3J5IgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudmlld3MuQ29udGVudFZpZXciCi0gICAgICAgICAgICBpY29uPSJpY29ucy9mdWxsL3ZpZXcxNi9Db250ZW50Vmlldy5naWYiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS52aWV3cy5Db250ZW50VmlldyIKLSAgICAgICAgICAgIG5hbWU9IiVjb250ZW50Vmlld05hbWUiLz4KLSAgICA8L2V4dGVuc2lvbj4KLSAgIAotICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkucGVyc3BlY3RpdmVFeHRlbnNpb25zIj4KLSAgICAgIDxwZXJzcGVjdGl2ZUV4dGVuc2lvbgotICAgICAgICAgICAgdGFyZ2V0SUQ9Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nUGVyc3BlY3RpdmUiPgotICAgICAgICAgPHZpZXcKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnZpZXdzLkNvbmZpZ3VyYXRpb25WaWV3IgotICAgICAgICAgICAgICAgbW92ZWFibGU9InRydWUiCi0gICAgICAgICAgICAgICByYXRpbz0iMC41ZiIKLSAgICAgICAgICAgICAgIHJlbGF0aW9uc2hpcD0iYm90dG9tIgotICAgICAgICAgICAgICAgcmVsYXRpdmU9Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudmlld3MuTGlicmFyeVZpZXciLz4KLSAgICAgICAgIDx2aWV3U2hvcnRjdXQKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnZpZXdzLkxpYnJhcnlWaWV3Ii8+Ci0gICAgICAgICA8dmlld1Nob3J0Y3V0Ci0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS52aWV3cy5Db25maWd1cmF0aW9uVmlldyIvPgotICAgICAgICAgPHNob3dJblBhcnQgaWQ9Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudmlld3MuTGlicmFyeVZpZXciLz4KLSAgICAgIDwvcGVyc3BlY3RpdmVFeHRlbnNpb24+Ci0gICAgICAKLSAgICAgIDxwZXJzcGVjdGl2ZUV4dGVuc2lvbgotICAgICAgICAgICAgdGFyZ2V0SUQ9Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQnJvd3NpbmdQZXJzcGVjdGl2ZSI+Ci0gICAgICAgICA8dmlldwotICAgICAgICAgICAgICAgY2xvc2VhYmxlPSJmYWxzZSIKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnZpZXdzLkNvbnRlbnRWaWV3IgotICAgICAgICAgICAgICAgbW92ZWFibGU9InRydWUiCi0gICAgICAgICAgICAgICByYXRpbz0iMC43MGYiCi0gICAgICAgICAgICAgICByZWxhdGlvbnNoaXA9InJpZ2h0IgotICAgICAgICAgICAgICAgcmVsYXRpdmU9Im9yZy5lY2xpcHNlLnVpLmVkaXRvcnNzIi8+Ci0gICAgICA8L3BlcnNwZWN0aXZlRXh0ZW5zaW9uPgotICAgPC9leHRlbnNpb24+Ci0KLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmVkaXRvcnMiPgotICAgICAgPGVkaXRvcgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5NZXRob2RFbGVtZW50RWRpdG9yIgotICAgICAgICAgICAgY29udHJpYnV0b3JDbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zLk1ldGhvZExpYnJhcnlBY3Rpb25CYXJDb250cmlidXRvciIKLSAgICAgICAgICAgIGljb249Imljb25zL2Z1bGwvb2JqMTYvTWV0aG9kRWxlbWVudC5naWYiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLk1ldGhvZEVsZW1lbnRFZGl0b3IiCi0gICAgICAgICAgICBuYW1lPSIlbWV0aG9kRWxlbWVudEVkaXRvck5hbWUiCi0gICAgICAgICAgICBtYXRjaGluZ1N0cmF0ZWd5PSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuTWV0aG9kRWxlbWVudEVkaXRvck1hdGNoaW5nU3RyYXRlZ3kiLz4KLSAgICAgIDxlZGl0b3IKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuQ29uZmlndXJhdGlvbkVkaXRvciIKLSAgICAgICAgICAgIGljb249Imljb25zL2Z1bGwvb2JqMTYvTWV0aG9kQ29uZmlndXJhdGlvbi5naWYiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLkNvbmZpZ3VyYXRpb25FZGl0b3IiCi0gICAgICAgICAgICBuYW1lPSIlY29uZmlndXJhdGlvbkVkaXRvck5hbWUiCi0gICAgICAgICAgICBtYXRjaGluZ1N0cmF0ZWd5PSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuTWV0aG9kRWxlbWVudEVkaXRvck1hdGNoaW5nU3RyYXRlZ3kiLz4KLSAgICAgIDxlZGl0b3IKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuUHJvY2Vzc0VkaXRvciIKLSAgICAgICAgICAgIGNvbnRyaWJ1dG9yQ2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5Qcm9jZXNzRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3IiCi0gICAgICAgICAgICBpY29uPSJpY29ucy9mdWxsL29iajE2L1Byb2Nlc3MuZ2lmIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5Qcm9jZXNzRWRpdG9yIgotICAgICAgICAgICAgbmFtZT0iJXByb2Nlc3NFZGl0b3JOYW1lIi8+Ci0gICAgICA8ZWRpdG9yCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLkdyYXBoaWNhbFdvcmtmbG93RWRpdG9yIgotICAgICAgICAgICAgaWNvbj0iaWNvbnMvZnVsbC9vYmoxNi9BY3Rpdml0eS5naWYiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLkdyYXBoaWNhbFdvcmtmbG93RWRpdG9yIgotICAgICAgICAgICAgbmFtZT0iJWFjdGl2aXR5RGlhZ3JhbUVkaXRvck5hbWUiLz4KLSAgICAgIDxlZGl0b3IKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9yIgotICAgICAgICAgICAgaWNvbj0iaWNvbnMvZnVsbC9vYmoxNi9BY3Rpdml0eS5naWYiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLkFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvciIKLSAgICAgICAgICAgIG5hbWU9IiVhY3Rpdml0eURldGFpbERpYWdyYW1FZGl0b3JOYW1lIi8+Ci0gICAgICA8ZWRpdG9yCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLkdyYXBoaWNhbFdQRGVwZW5kZW5jeUVkaXRvciIKLSAgICAgICAgICAgIGljb249Imljb25zL2Z1bGwvb2JqMTYvV29ya1Byb2R1Y3REZXNjcmlwdG9yLmdpZiIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuR3JhcGhpY2FsV1BEZXBlbmRlbmN5RWRpdG9yIgotICAgICAgICAgICAgbmFtZT0iJXdvcmtQcm9kdWN0RGVwZWRlbmN5RGlhZ3JhbUVkaXRvck5hbWUiLz4KLSAgIDwvZXh0ZW5zaW9uPgotICAgCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkubmV3V2l6YXJkcyI+Ci0gICAgICA8d2l6YXJkCi0gICAgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2UuZXBmLnVpLm5ld1dpemFyZHMuY2F0ZWdvcnkiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS53aXphcmRzLk5ld0xpYnJhcnlXaXphcmQiCi0gICAgICAgICAgICBpY29uPSJpY29ucy9mdWxsL29iajE2L01ldGhvZExpYnJhcnkuZ2lmIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkud2l6YXJkcy5OZXdMaWJyYXJ5V2l6YXJkIgotICAgICAgICAgICAgbmFtZT0iJW5ld01ldGhvZExpYnJhcnlXaXphcmROYW1lIj4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICVuZXdNZXRob2RMaWJyYXJ5V2l6YXJkRGVzY3JpcHRpb24KLSAgICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICA8L3dpemFyZD4gICAgICAgCi0gICAgICA8d2l6YXJkCi0gICAgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2UuZXBmLnVpLm5ld1dpemFyZHMuY2F0ZWdvcnkiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS53aXphcmRzLk5ld1BsdWdpbldpemFyZCIKLSAgICAgICAgICAgIGljb249Imljb25zL2Z1bGwvb2JqMTYvTWV0aG9kUGx1Z2luLmdpZiIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLndpemFyZHMuTmV3UGx1Z2luV2l6YXJkIgotICAgICAgICAgICAgbmFtZT0iJW5ld01ldGhvZFBsdWdpbldpemFyZE5hbWUiPgotICAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgJW5ld01ldGhvZFBsdWdpbldpemFyZERlc2NyaXB0aW9uCi0gICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgPC93aXphcmQ+Ci0gICAgICA8d2l6YXJkCi0gICAgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2UuZXBmLnVpLm5ld1dpemFyZHMuY2F0ZWdvcnkiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS53aXphcmRzLk5ld0NvbmZpZ3VyYXRpb25XaXphcmQiCi0gICAgICAgICAgICBpY29uPSJpY29ucy9mdWxsL29iajE2L01ldGhvZENvbmZpZ3VyYXRpb24uZ2lmIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkud2l6YXJkcy5OZXdDb25maWd1cmF0aW9uV2l6YXJkIgotICAgICAgICAgICAgbmFtZT0iJW5ld0NvbmZpZ3VyYXRpb25XaXphcmROYW1lIj4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICVuZXdDb25maWd1cmF0aW9uV2l6YXJkRGVzY3JpcHRpb24KLSAgICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICA8L3dpemFyZD4KLSAgIDwvZXh0ZW5zaW9uPgotCi0gICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5wcm9wZXJ0eUNvbnRyaWJ1dG9yIj4KLSAgICAgIDxwcm9wZXJ0eUNvbnRyaWJ1dG9yCi0gICAgICAgICAgICB0eXBlTWFwcGVyPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuRWxlbWVudFR5cGVNYXBwZXIiCi0gICAgICAgICAgICBjb250cmlidXRvcklkPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuUHJvY2Vzc0VkaXRvciIKLSAgICAgICAgICAgIGxhYmVsUHJvdmlkZXI9Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5FbGVtZW50TGFiZWxQcm92aWRlciI+Ci0gICAgICAgICA8cHJvcGVydHlDYXRlZ29yeSBjYXRlZ29yeT0iZWxlbWVudCIvPgotICAgICAgICAgPHByb3BlcnR5Q2F0ZWdvcnkgY2F0ZWdvcnk9Im90aGVyIi8+Ci0gICAgICA8L3Byb3BlcnR5Q29udHJpYnV0b3I+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIAotICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQucHJvcGVydHlUYWJzIj4KLSAgICAgIDxwcm9wZXJ0eVRhYnMKLSAgICAgICAgICAgIGNvbnRyaWJ1dG9ySWQ9Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5Qcm9jZXNzRWRpdG9yIj4KLSAgICAgICAgIDwhLS0gU1RBUlQgR0VORVJBTCAtLT4KLSAgICAgICAgIDxwcm9wZXJ0eVRhYgotICAgICAgICAgICAgICAgbGFiZWw9IiVfVUlfUHJvcGVydGllc19HZW5lcmFsIgotICAgICAgICAgICAgICAgY2F0ZWdvcnk9ImVsZW1lbnQiCi0gICAgICAgICAgICAgICBpZD0icHJvcGVydGllcy50YWIuQnJlYWtkb3duRWxlbWVudC5HZW5lcmFsIi8+Ci0gICAgICAgICA8cHJvcGVydHlUYWIKLSAgICAgICAgICAgICAgIGxhYmVsPSIlX1VJX1Byb3BlcnRpZXNfR2VuZXJhbCIKLSAgICAgICAgICAgICAgIGNhdGVnb3J5PSJlbGVtZW50IgotICAgICAgICAgICAgICAgaWQ9InByb3BlcnRpZXMudGFiLldvcmtCcmVha2Rvd25FbGVtZW50LkdlbmVyYWwiLz4KLSAgICAgICAgIDxwcm9wZXJ0eVRhYgotICAgICAgICAgICAgICAgbGFiZWw9IiVfVUlfUHJvcGVydGllc19HZW5lcmFsIgotICAgICAgICAgICAgICAgY2F0ZWdvcnk9ImVsZW1lbnQiCi0gICAgICAgICAgICAgICBpZD0icHJvcGVydGllcy50YWIuQWN0aXZpdHkuR2VuZXJhbCIvPgotICAgICAgICAgPHByb3BlcnR5VGFiCi0gICAgICAgICAgICAgICBsYWJlbD0iJV9VSV9Qcm9wZXJ0aWVzX0dlbmVyYWwiCi0gICAgICAgICAgICAgICBjYXRlZ29yeT0iZWxlbWVudCIKLSAgICAgICAgICAgICAgIGlkPSJwcm9wZXJ0aWVzLnRhYi5UYXNrRGVzY3JpcHRvci5HZW5lcmFsIi8+Ci0gICAgICAgICA8cHJvcGVydHlUYWIKLSAgICAgICAgICAgICAgIGxhYmVsPSIlX1VJX1Byb3BlcnRpZXNfR2VuZXJhbCIKLSAgICAgICAgICAgICAgIGNhdGVnb3J5PSJlbGVtZW50IgotICAgICAgICAgICAgICAgaWQ9InByb3BlcnRpZXMudGFiLlJvbGVEZXNjcmlwdG9yLkdlbmVyYWwiLz4KLSAgICAgICAgIDxwcm9wZXJ0eVRhYgotICAgICAgICAgICAgICAgbGFiZWw9IiVfVUlfUHJvcGVydGllc19HZW5lcmFsIgotICAgICAgICAgICAgICAgY2F0ZWdvcnk9ImVsZW1lbnQiCi0gICAgICAgICAgICAgICBpZD0icHJvcGVydGllcy50YWIuV29ya1Byb2R1Y3REZXNjcmlwdG9yLkdlbmVyYWwiLz4KLQkJIDwhLS0gRU5EIEdFTkVSQUwtLT4KLSAgICAgICAgIAotICAgICAgICAgPCEtLSBTVEFSVCBET0NVTUVOVEFUSU9OIC0tPgotICAgICAgICAgPHByb3BlcnR5VGFiCi0gICAgICAgICAgICAgICBsYWJlbD0iJV9VSV9Qcm9wZXJ0aWVzX0RvY3VtZW50YXRpb24iCi0gICAgICAgICAgICAgICBjYXRlZ29yeT0iZWxlbWVudCIKLSAgICAgICAgICAgICAgIGlkPSJwcm9wZXJ0aWVzLnRhYi5CcmVha2Rvd25FbGVtZW50LkRvY3VtZW50YXRpb24iCi0gICAgICAgICAgICAgICBhZnRlclRhYj0icHJvcGVydGllcy50YWIuQnJlYWtkb3duRWxlbWVudC5HZW5lcmFsIi8+Ci0gICAgICAgICA8cHJvcGVydHlUYWIKLSAgICAgICAgICAgICAgIGxhYmVsPSIlX1VJX1Byb3BlcnRpZXNfRG9jdW1lbnRhdGlvbiIKLSAgICAgICAgICAgICAgIGNhdGVnb3J5PSJlbGVtZW50IgotICAgICAgICAgICAgICAgaWQ9InByb3BlcnRpZXMudGFiLkFjdGl2aXR5LkRvY3VtZW50YXRpb24iCi0gICAgICAgICAgICAgICBhZnRlclRhYj0icHJvcGVydGllcy50YWIuQWN0aXZpdHkuR2VuZXJhbCIvPgotICAgICAgICAgPHByb3BlcnR5VGFiCi0gICAgICAgICAgICAgICBsYWJlbD0iJV9VSV9Qcm9wZXJ0aWVzX0RvY3VtZW50YXRpb24iCi0gICAgICAgICAgICAgICBjYXRlZ29yeT0iZWxlbWVudCIKLSAgICAgICAgICAgICAgIGlkPSJwcm9wZXJ0aWVzLnRhYi5EZXNjcmlwdG9yLkRvY3VtZW50YXRpb24iCi0gICAgICAgICAgICAgICBhZnRlclRhYj0icHJvcGVydGllcy50YWIuVGFza0Rlc2NyaXB0b3IuR2VuZXJhbCIvPgotCQkgPCEtLSBFTkQgRE9DVU1FTlRBVElPTiAtLT4KLQkJCi0JCSA8IS0tIFNUQVJUIEdVSURBTkNFIC0tPgotCQkgIDxwcm9wZXJ0eVRhYgotICAgICAgICAgICAgICAgbGFiZWw9IiVfVUlfUHJvcGVydGllc19HdWlkYW5jZSIKLSAgICAgICAgICAgICAgIGNhdGVnb3J5PSJlbGVtZW50IgotICAgICAgICAgICAgICAgYWZ0ZXJUYWI9InByb3BlcnRpZXMudGFiLkJyZWFrZG93bkVsZW1lbnQuRG9jdW1lbnRhdGlvbiIKLSAgICAgICAgICAgICAgIGlkPSJwcm9wZXJ0aWVzLnRhYi5CcmVha2Rvd25FbGVtZW50Lkd1aWRhbmNlIi8+ICAKLSAgICAgICAgICA8cHJvcGVydHlUYWIKLSAgICAgICAgICAgICAgIGxhYmVsPSIlX1VJX1Byb3BlcnRpZXNfR3VpZGFuY2UiCi0gICAgICAgICAgICAgICBjYXRlZ29yeT0iZWxlbWVudCIKLSAgICAgICAgICAgICAgIGFmdGVyVGFiPSJwcm9wZXJ0aWVzLnRhYi5BY3Rpdml0eS5Eb2N1bWVudGF0aW9uIgotICAgICAgICAgICAgICAgaWQ9InByb3BlcnRpZXMudGFiLkFjdGl2aXR5Lkd1aWRhbmNlIi8+IAotICAgICAgICAgPCEtLSBFTkQgR1VJREFOQ0UtLT4KLSAgICAgICAgIAotCQkgPCEtLSBBQ1RJVklUWSAtLT4gICAgICAgCi0gICAgICAgICA8cHJvcGVydHlUYWIKLSAgICAgICAgICAgICAgIGxhYmVsPSIlX1VJX1Byb3BlcnRpZXNfV29ya19Sb2xsdXAiCi0gICAgICAgICAgICAgICBjYXRlZ29yeT0iZWxlbWVudCIKLSAgICAgICAgICAgICAgIGFmdGVyVGFiPSJwcm9wZXJ0aWVzLnRhYi5BY3Rpdml0eS5HdWlkYW5jZSIKLSAgICAgICAgICAgICAgIGlkPSJwcm9wZXJ0aWVzLnRhYi5BY3Rpdml0eS5Xb3JrUm9sbHVwIi8+Ci0gICAgICAgICA8cHJvcGVydHlUYWIKLSAgICAgICAgICAgICAgIGxhYmVsPSIlX1VJX1Byb3BlcnRpZXNfVGVhbV9Sb2xsdXAiCi0gICAgICAgICAgICAgICBjYXRlZ29yeT0iZWxlbWVudCIKLSAgICAgICAgICAgICAgIGFmdGVyVGFiPSJwcm9wZXJ0aWVzLnRhYi5BY3Rpdml0eS5Xb3JrUm9sbHVwIgotICAgICAgICAgICAgICAgaWQ9InByb3BlcnRpZXMudGFiLkFjdGl2aXR5LlRlYW1Sb2xsdXAiLz4KLSAgICAgICAgIDxwcm9wZXJ0eVRhYgotICAgICAgICAgICAgICAgbGFiZWw9IiVfVUlfUHJvcGVydGllc19XUF9Sb2xsdXAiCi0gICAgICAgICAgICAgICBjYXRlZ29yeT0iZWxlbWVudCIKLSAgICAgICAgICAgICAgIGFmdGVyVGFiPSJwcm9wZXJ0aWVzLnRhYi5BY3Rpdml0eS5UZWFtUm9sbHVwIgotICAgICAgICAgICAgICAgaWQ9InByb3BlcnRpZXMudGFiLkFjdGl2aXR5LldvcmtQcm9kdWN0c1JvbGx1cCIvPgotICAgICAgICAKLSAgICAgICAgIDwhLS0gVEFTSyBERVNDUklQVE9SIC0tPgotICAgICAgICAgPHByb3BlcnR5VGFiCi0gICAgICAgICAgICAgICBsYWJlbD0iJV9VSV9Qcm9wZXJ0aWVzX1JvbGVzIgotICAgICAgICAgICAgICAgY2F0ZWdvcnk9ImVsZW1lbnQiCi0gICAgICAgICAgICAgICBhZnRlclRhYj0icHJvcGVydGllcy50YWIuRGVzY3JpcHRvci5Eb2N1bWVudGF0aW9uIgotICAgICAgICAgICAgICAgaWQ9InByb3BlcnRpZXMudGFiLlRhc2tEZXNjcmlwdG9yLlJvbGUiLz4KLSAgICAgICAgIDxwcm9wZXJ0eVRhYgotICAgICAgICAgICAgICAgbGFiZWw9IiVfVUlfUHJvcGVydGllc19Xb3JrUHJvZHVjdHMiCi0gICAgICAgICAgICAgICBjYXRlZ29yeT0iZWxlbWVudCIKLSAgICAgICAgICAgICAgIGFmdGVyVGFiPSJwcm9wZXJ0aWVzLnRhYi5UYXNrRGVzY3JpcHRvci5Sb2xlIgotICAgICAgICAgICAgICAgaWQ9InByb3BlcnRpZXMudGFiLlRhc2tEZXNjcmlwdG9yLldvcmtQcm9kdWN0Ii8+Ci0gICAgICAgICA8cHJvcGVydHlUYWIKLSAgICAgICAgICAgICAgIGxhYmVsPSIlX1VJX1Byb3BlcnRpZXNfU3RlcHMiCi0gICAgICAgICAgICAgICBjYXRlZ29yeT0iZWxlbWVudCIKLSAgICAgICAgICAgICAgIGFmdGVyVGFiPSJwcm9wZXJ0aWVzLnRhYi5UYXNrRGVzY3JpcHRvciBSZWxhdGlvbiIKLSAgICAgICAgICAgICAgIGlkPSJwcm9wZXJ0aWVzLnRhYi5UYXNrRGVzY3JpcHRvci5TdGVwIi8+Ci0gICAgICAgICAKLSAgICAgICAgIDwhLS0gUk9MRSBERVNDUklQVE9SIC0tPgotICAgICAgICAgPHByb3BlcnR5VGFiCi0gICAgICAgICAgICAgICBsYWJlbD0iJV9VSV9Qcm9wZXJ0aWVzX1dvcmtQcm9kdWN0cyIKLSAgICAgICAgICAgICAgIGNhdGVnb3J5PSJlbGVtZW50IgotICAgICAgICAgICAgICAgYWZ0ZXJUYWI9InByb3BlcnRpZXMudGFiLlJvbGVEZXNjcmlwdG9yLlRhc2siCi0gICAgICAgICAgICAgICBpZD0icHJvcGVydGllcy50YWIuUm9sZURlc2NyaXB0b3IuV29ya1Byb2R1Y3QiLz4KLSAgICAgICAgIDxwcm9wZXJ0eVRhYgotICAgICAgICAgICAgICAgbGFiZWw9IiVfVUlfUHJvcGVydGllc19UZWFtcyIKLSAgICAgICAgICAgICAgIGNhdGVnb3J5PSJlbGVtZW50IgotICAgICAgICAgICAgICAgYWZ0ZXJUYWI9InByb3BlcnRpZXMudGFiLlJvbGVEZXNjcmlwdG9yLldvcmtQcm9kdWN0IgotICAgICAgICAgICAgICAgaWQ9InByb3BlcnRpZXMudGFiLlJvbGVEZXNjcmlwdG9yLlRlYW0iLz4KLSAgICAgICAgIAotICAgICAgICAgPCEtLSBURUFNIFBST0ZJTEUgLS0+Ci0gICAgICAgICA8cHJvcGVydHlUYWIKLSAgICAgICAgICAgICAgIGxhYmVsPSIlX1VJX1Byb3BlcnRpZXNfUm9sZXMiCi0gICAgICAgICAgICAgICBjYXRlZ29yeT0iZWxlbWVudCIKLSAgICAgICAgICAgICAgIGFmdGVyVGFiPSJwcm9wZXJ0aWVzLnRhYi5UZWFtUHJvZmlsZS5Eb2N1bWVudGF0aW9uIgotICAgICAgICAgICAgICAgaWQ9InByb3BlcnRpZXMudGFiLlRlYW1Qcm9maWxlLlJvbGUiLz4KLSAgICAgICAgIAotICAgICAgICAgPCEtLSBDT01QT1NJVEUgUk9MRSAtLT4KLSAgICAgICAgIDxwcm9wZXJ0eVRhYgotICAgICAgICAgICAgICAgbGFiZWw9IiVfVUlfUHJvcGVydGllc19Sb2xlcyIKLSAgICAgICAgICAgICAgIGNhdGVnb3J5PSJlbGVtZW50IgotICAgICAgICAgICAgICAgYWZ0ZXJUYWI9InByb3BlcnRpZXMudGFiLlJvbGVEZXNjcmlwdG9yLlRlYW0iCi0gICAgICAgICAgICAgICBpZD0icHJvcGVydGllcy50YWIuQ29tcG9zaXRlUm9sZS5Sb2xlIi8+Ci0gICAgICA8L3Byb3BlcnR5VGFicz4KLSAgIDwvZXh0ZW5zaW9uPgotICAgCi0gICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5wcm9wZXJ0eVNlY3Rpb25zIj4KLSAgICAgIDxwcm9wZXJ0eVNlY3Rpb25zCi0gICAgICAgICAgICBjb250cmlidXRvcklkPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuUHJvY2Vzc0VkaXRvciI+Ci0gICAgICAgICA8IS0tIFNUQVJUIEdFTkVSQUwgU0VDVElPTiAtLT4KLSAgICAgICAgIDxwcm9wZXJ0eVNlY3Rpb24KLSAgICAgICAgICAgICAgIHRhYj0icHJvcGVydGllcy50YWIuQWN0aXZpdHkuR2VuZXJhbCIKLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuQWN0aXZpdHlHZW5lcmFsU2VjdGlvbiIKLSAgICAgICAgICAgICAgIGlkPSJwcm9wZXJ0aWVzLnNlY3Rpb24uQWN0aXZpdHkuR2VuZXJhbCI+Ci0gICAgICAgICAgICA8aW5wdXQgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eSIvPgotICAgICAgICAgICAgPGlucHV0IHR5cGU9Im9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5BY3Rpdml0eVdyYXBwZXJJdGVtUHJvdmlkZXIiLz4KLSAgICAgICAgIDwvcHJvcGVydHlTZWN0aW9uPgotICAgICAgICAgPHByb3BlcnR5U2VjdGlvbgotICAgICAgICAgICAgICAgdGFiPSJwcm9wZXJ0aWVzLnRhYi5UYXNrRGVzY3JpcHRvci5HZW5lcmFsIgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5UYXNrRGVzY3JpcHRvckdlbmVyYWxTZWN0aW9uIgotICAgICAgICAgICAgICAgaWQ9InByb3BlcnRpZXMuc2VjdGlvbi5UYXNrRGVzY3JpcHRvci5HZW5lcmFsIj4KLSAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdG9yIi8+Ci0gICAgICAgICAgICA8aW5wdXQgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLlRhc2tEZXNjcmlwdG9yV3JhcHBlckl0ZW1Qcm92aWRlciIvPgotICAgICAgICAgPC9wcm9wZXJ0eVNlY3Rpb24+IAotICAgICAgICAgPHByb3BlcnR5U2VjdGlvbgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5Sb2xlRGVzY3JpcHRvckdlbmVyYWxTZWN0aW9uIgotICAgICAgICAgICAgICAgaWQ9InByb3BlcnRpZXMuc2VjdGlvbi5Sb2xlRGVzY3JpcHRvci5HZW5lcmFsIgotICAgICAgICAgICAgICAgdGFiPSJwcm9wZXJ0aWVzLnRhYi5Sb2xlRGVzY3JpcHRvci5HZW5lcmFsIj4KLSAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdG9yIi8+Ci0gICAgICAgICAgICA8aW5wdXQgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLlJvbGVEZXNjcmlwdG9yV3JhcHBlckl0ZW1Qcm92aWRlciIvPgotICAgICAgICAgPC9wcm9wZXJ0eVNlY3Rpb24+Ci0gICAgICAgICA8cHJvcGVydHlTZWN0aW9uCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLldvcmtQcm9kdWN0RGVzY3JpcHRvckdlbmVyYWxTZWN0aW9uIgotICAgICAgICAgICAgICAgaWQ9InByb3BlcnRpZXMuc2VjdGlvbi5Xb3JrUHJvZHVjdERlc2NyaXB0b3IuR2VuZXJhbCIKLSAgICAgICAgICAgICAgIHRhYj0icHJvcGVydGllcy50YWIuV29ya1Byb2R1Y3REZXNjcmlwdG9yLkdlbmVyYWwiPiAgICAgIAotICAgICAgICAgICAgPGlucHV0IHR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yIi8+Ci0gICAgICAgICAgICA8aW5wdXQgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLldvcmtQcm9kdWN0RGVzY3JpcHRvcldyYXBwZXJJdGVtUHJvdmlkZXIiLz4KLSAgICAgICAgIDwvcHJvcGVydHlTZWN0aW9uPiAgICAgICAKLSAgICAgICAgIDxwcm9wZXJ0eVNlY3Rpb24KLSAgICAgICAgICAgICAgIHRhYj0icHJvcGVydGllcy50YWIuV29ya0JyZWFrZG93bkVsZW1lbnQuR2VuZXJhbCIKLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuV29ya0JyZWFrZG93bkVsZW1lbnRHZW5lcmFsU2VjdGlvbiIKLSAgICAgICAgICAgICAgIGlkPSJwcm9wZXJ0aWVzLnNlY3Rpb24uV29ya0JyZWFrZG93bkVsZW1lbnQuR2VuZXJhbCI+Ci0gICAgICAgICAgICA8aW5wdXQgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5NaWxlc3RvbmUiLz4KLSAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuTWlsZXN0b25lV3JhcHBlckl0ZW1Qcm92aWRlciIvPgotICAgICAgICAgPC9wcm9wZXJ0eVNlY3Rpb24+Ci0gICAgICAgICA8cHJvcGVydHlTZWN0aW9uCi0gICAgICAgICAgICAgICB0YWI9InByb3BlcnRpZXMudGFiLkJyZWFrZG93bkVsZW1lbnQuR2VuZXJhbCIKLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuQnJlYWtkb3duRWxlbWVudEdlbmVyYWxTZWN0aW9uIgotICAgICAgICAgICAgICAgaWQ9InByb3BlcnRpZXMuc2VjdGlvbi5CcmVha2Rvd25FbGVtZW50LkdlbmVyYWwiPgotICAgICAgICAgICAgPGlucHV0IHR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuVGVhbVByb2ZpbGUiLz4KLSAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuVGVhbVByb2ZpbGVXcmFwcGVySXRlbVByb3ZpZGVyIi8+Ci0gICAgICAgICA8L3Byb3BlcnR5U2VjdGlvbj4KLSAgICAgICAgIDwhLS0gRU5EIEdFTkVSQUwgU0VDVElPTiAtLT4KLSAgICAgICAgCi0gICAgICAgICA8IS0tIFNUQVJUIERPQ1VNRU5UQVRJT04gU0VDVElPTiAtLT4KLSAgICAgICAgIDxwcm9wZXJ0eVNlY3Rpb24KLSAgICAgICAgICAgICAgIHRhYj0icHJvcGVydGllcy50YWIuQWN0aXZpdHkuRG9jdW1lbnRhdGlvbiIKLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuQWN0aXZpdHlEb2N1bWVudFNlY3Rpb24iCi0gICAgICAgICAgICAgICBpZD0icHJvcGVydGllcy5zZWN0aW9uLkFjdGl2aXR5LkRvY3VtZW50YXRpb24iPgotICAgICAgICAgICAgPGlucHV0IHR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHkiLz4KLSAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuQWN0aXZpdHlXcmFwcGVySXRlbVByb3ZpZGVyIi8+Ci0gICAgICAgICA8L3Byb3BlcnR5U2VjdGlvbj4KLSAgICAgICAgIDxwcm9wZXJ0eVNlY3Rpb24KLSAgICAgICAgICAgICAgIHRhYj0icHJvcGVydGllcy50YWIuRGVzY3JpcHRvci5Eb2N1bWVudGF0aW9uIgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5EZXNjcmlwdG9yRG9jdW1lbnRTZWN0aW9uIgotICAgICAgICAgICAgICAgaWQ9InByb3BlcnRpZXMuc2VjdGlvbi5EZXNjcmlwdG9yLkRvY3VtZW50YXRpb24iPgotICAgICAgICAgICAgPGlucHV0IHR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpcHRvciIvPgotICAgICAgICAgICAgPGlucHV0IHR5cGU9Im9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5UYXNrRGVzY3JpcHRvcldyYXBwZXJJdGVtUHJvdmlkZXIiLz4KLSAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuUm9sZURlc2NyaXB0b3JXcmFwcGVySXRlbVByb3ZpZGVyIi8+Ci0gICAgICAgICAgICA8aW5wdXQgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLldvcmtQcm9kdWN0RGVzY3JpcHRvcldyYXBwZXJJdGVtUHJvdmlkZXIiLz4KLSAgICAgICAgIDwvcHJvcGVydHlTZWN0aW9uPiAKLSAgICAgICAgIDxwcm9wZXJ0eVNlY3Rpb24KLSAgICAgICAgICAgICAgIHRhYj0icHJvcGVydGllcy50YWIuQnJlYWtkb3duRWxlbWVudC5Eb2N1bWVudGF0aW9uIgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5NaWxlc3RvbmVEb2N1bWVudFNlY3Rpb24iCi0gICAgICAgICAgICAgICBpZD0icHJvcGVydGllcy5zZWN0aW9uLkJyZWFrZG93bkVsZW1lbnQuRG9jdW1lbnQiPgotICAgICAgICAgICAgPGlucHV0IHR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuTWlsZXN0b25lIi8+Ci0gICAgICAgICAgICA8aW5wdXQgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5UZWFtUHJvZmlsZSIvPgotICAgICAgICAgICAgPGlucHV0IHR5cGU9Im9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5NaWxlc3RvbmVXcmFwcGVySXRlbVByb3ZpZGVyIi8+Ci0gICAgICAgICAgICA8aW5wdXQgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLlRlYW1Qcm9maWxlV3JhcHBlckl0ZW1Qcm92aWRlciIvPgotICAgICAgICAgPC9wcm9wZXJ0eVNlY3Rpb24+ICAgICAgIAotICAgICAgICAgPCEtLSBFTkQgRE9DVU1FTlRBVElPTiBTRUNUSU9OIC0tPgotICAgICAgCi0gICAgICAgICA8IS0tIFNUQVJUIEdVSURBTkNFIFNFQ1RJT04gLS0+Ci0gICAgICAgICA8cHJvcGVydHlTZWN0aW9uCi0gICAgICAgICAgICAgICB0YWI9InByb3BlcnRpZXMudGFiLkJyZWFrZG93bkVsZW1lbnQuR3VpZGFuY2UiCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLkJyZWFrZG93bkVsZW1lbnRHdWlkYW5jZVNlY3Rpb24iCi0gICAgICAgICAgICAgICBpZD0icHJvcGVydGllcy5zZWN0aW9uLkJyZWFrZG93bkVsZW1lbnQuR3VpZGFuY2UiPgotICAgICAgICAgICAgPGlucHV0IHR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuTWlsZXN0b25lIi8+Ci0gICAgICAgICAgICA8aW5wdXQgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5UZWFtUHJvZmlsZSIvPgotICAgICAgICAgICAgPGlucHV0IHR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpcHRvciIvPgotICAgICAgICAgICAgPGlucHV0IHR5cGU9Im9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5UYXNrRGVzY3JpcHRvcldyYXBwZXJJdGVtUHJvdmlkZXIiLz4KLSAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuUm9sZURlc2NyaXB0b3JXcmFwcGVySXRlbVByb3ZpZGVyIi8+Ci0gICAgICAgICAgICA8aW5wdXQgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLldvcmtQcm9kdWN0RGVzY3JpcHRvcldyYXBwZXJJdGVtUHJvdmlkZXIiLz4KLSAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuTWlsZXN0b25lV3JhcHBlckl0ZW1Qcm92aWRlciIvPgotICAgICAgICAgICAgPGlucHV0IHR5cGU9Im9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5UZWFtUHJvZmlsZVdyYXBwZXJJdGVtUHJvdmlkZXIiLz4KLSAgICAgICAgIDwvcHJvcGVydHlTZWN0aW9uPgotICAgICAgICAgPHByb3BlcnR5U2VjdGlvbgotICAgICAgICAgICAgICAgdGFiPSJwcm9wZXJ0aWVzLnRhYi5BY3Rpdml0eS5HdWlkYW5jZSIKLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuQWN0aXZpdHlHdWlkYW5jZVNlY3Rpb24iCi0gICAgICAgICAgICAgICBpZD0icHJvcGVydGllcy5zZWN0aW9uLkFjdGl2aXR5Lkd1aWRhbmNlIj4KLSAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5Ii8+Ci0gICAgICAgICAgICA8aW5wdXQgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkFjdGl2aXR5V3JhcHBlckl0ZW1Qcm92aWRlciIvPgotICAgICAgICAgPC9wcm9wZXJ0eVNlY3Rpb24+Ci0gICAgICAgICA8IS0tIEVORCBHVUlEQU5DRSBTRUNUSU9OIC0tPgotICAgICAgICAgCi0gICAgICAgICA8IS0tIEFDVElWSVRZIC0tPiAgICAKLSAgICAgICAgIDxwcm9wZXJ0eVNlY3Rpb24KLSAgICAgICAgICAgICAgIHRhYj0icHJvcGVydGllcy50YWIuQWN0aXZpdHkuV29ya1JvbGx1cCIKLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuQWN0aXZpdHlXb3JrUm9sbHVwU2VjdGlvbiIKLSAgICAgICAgICAgICAgIGlkPSJwcm9wZXJ0aWVzLnNlY3Rpb24uQWN0aXZpdHkuV29ya1JvbGx1cCI+Ci0gICAgICAgICAgICA8aW5wdXQgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eSIvPgotICAgICAgICAgICAgPGlucHV0IHR5cGU9Im9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5BY3Rpdml0eVdyYXBwZXJJdGVtUHJvdmlkZXIiLz4KLSAgICAgICAgIDwvcHJvcGVydHlTZWN0aW9uPgotICAgICAgICAgPHByb3BlcnR5U2VjdGlvbgotICAgICAgICAgICAgICAgdGFiPSJwcm9wZXJ0aWVzLnRhYi5BY3Rpdml0eS5UZWFtUm9sbHVwIgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5BY3Rpdml0eVRlYW1Sb2xsdXBTZWN0aW9uIgotICAgICAgICAgICAgICAgaWQ9InByb3BlcnRpZXMuc2VjdGlvbi5BY3Rpdml0eS5UZWFtUm9sbHVwIj4KLSAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5Ii8+Ci0gICAgICAgICAgICA8aW5wdXQgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkFjdGl2aXR5V3JhcHBlckl0ZW1Qcm92aWRlciIvPgotICAgICAgICAgPC9wcm9wZXJ0eVNlY3Rpb24+Ci0gICAgICAgICA8cHJvcGVydHlTZWN0aW9uCi0gICAgICAgICAgICAgICB0YWI9InByb3BlcnRpZXMudGFiLkFjdGl2aXR5LldvcmtQcm9kdWN0c1JvbGx1cCIKLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuQWN0aXZpdHlXb3JrUHJvZHVjdHNSb2xsdXBTZWN0aW9uIgotICAgICAgICAgICAgICAgaWQ9InByb3BlcnRpZXMuc2VjdGlvbi5BY3Rpdml0eS5Xb3JrUHJvZHVjdHNSb2xsdXAiPgotICAgICAgICAgICAgPGlucHV0IHR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHkiLz4KLSAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuQWN0aXZpdHlXcmFwcGVySXRlbVByb3ZpZGVyIi8+Ci0gICAgICAgICA8L3Byb3BlcnR5U2VjdGlvbj4KLSAgICAgICAgIDwhLS0gRU5EIEFDVElWSVRZIC0tPgotICAgICAgICAgCi0gICAgICAgICA8IS0tIFNlY3Rpb25zIGZvciBUYXNrRGVzY3JpcHRvciAtLT4KLSAgICAgICAgIDxwcm9wZXJ0eVNlY3Rpb24KLSAgICAgICAgICAgICAgIHRhYj0icHJvcGVydGllcy50YWIuVGFza0Rlc2NyaXB0b3IuUm9sZSIKLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuVGFza0Rlc2NyaXB0b3JSb2xlU2VjdGlvbiIKLSAgICAgICAgICAgICAgIGlkPSJwcm9wZXJ0aWVzLnNlY3Rpb24uVGFza0Rlc2NyaXB0b3IuUm9sZSI+Ci0gICAgICAgICAgICA8aW5wdXQgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRvciIvPgotICAgICAgICAgICAgPGlucHV0IHR5cGU9Im9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5UYXNrRGVzY3JpcHRvcldyYXBwZXJJdGVtUHJvdmlkZXIiLz4KLSAgICAgICAgIDwvcHJvcGVydHlTZWN0aW9uPiAgCi0gICAgICAgICA8cHJvcGVydHlTZWN0aW9uCi0gICAgICAgICAgICAgICB0YWI9InByb3BlcnRpZXMudGFiLlRhc2tEZXNjcmlwdG9yLldvcmtQcm9kdWN0IgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5UYXNrRGVzY3JpcHRvcldvcmtQcm9kdWN0U2VjdGlvbiIKLSAgICAgICAgICAgICAgIGlkPSJwcm9wZXJ0aWVzLnNlY3Rpb24uVGFza0Rlc2NyaXB0b3IuV29ya1Byb2R1Y3QiPgotICAgICAgICAgICAgPGlucHV0IHR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0b3IiLz4KLSAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuVGFza0Rlc2NyaXB0b3JXcmFwcGVySXRlbVByb3ZpZGVyIi8+Ci0gICAgICAgICA8L3Byb3BlcnR5U2VjdGlvbj4gCi0gICAgICAgICA8cHJvcGVydHlTZWN0aW9uCi0gICAgICAgICAgICAgICB0YWI9InByb3BlcnRpZXMudGFiLlRhc2tEZXNjcmlwdG9yLlN0ZXAiCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLlRhc2tEZXNjcmlwdG9yU3RlcFNlY3Rpb24iCi0gICAgICAgICAgICAgICBpZD0icHJvcGVydGllcy5zZWN0aW9uLlRhc2tEZXNjcmlwdG9yLlN0ZXAiPgotICAgICAgICAgICAgPGlucHV0IHR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0b3IiLz4KLSAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuVGFza0Rlc2NyaXB0b3JXcmFwcGVySXRlbVByb3ZpZGVyIi8+Ci0gICAgICAgICA8L3Byb3BlcnR5U2VjdGlvbj4gCi0gICAgICAgICAKLSAgICAgICAgIDwhLS0gU2VjdGlvbnMgZm9yIFJvbGVEZXNjcmlwdG9yIC0tPgotICAgICAgICAgPHByb3BlcnR5U2VjdGlvbgotICAgICAgICAgICAgICAgdGFiPSJwcm9wZXJ0aWVzLnRhYi5Sb2xlRGVzY3JpcHRvci5Xb3JrUHJvZHVjdCIKLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuUm9sZURlc2NyaXB0b3JXb3JrUHJvZHVjdFNlY3Rpb24iCi0gICAgICAgICAgICAgICBpZD0icHJvcGVydGllcy5zZWN0aW9uLlJvbGVEZXNjcmlwdG9yLldvcmtQcm9kdWN0Ij4KLSAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdG9yIi8+Ci0gICAgICAgICAgICA8aW5wdXQgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLlJvbGVEZXNjcmlwdG9yV3JhcHBlckl0ZW1Qcm92aWRlciIvPgotICAgICAgICAgPC9wcm9wZXJ0eVNlY3Rpb24+ICAKLSAgICAgICAgIDxwcm9wZXJ0eVNlY3Rpb24KLSAgICAgICAgICAgICAgIHRhYj0icHJvcGVydGllcy50YWIuUm9sZURlc2NyaXB0b3IuVGVhbSIKLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuUm9sZURlc2NyaXB0b3JUZWFtU2VjdGlvbiIKLSAgICAgICAgICAgICAgIGlkPSJwcm9wZXJ0aWVzLnNlY3Rpb24uUm9sZURlc2NyaXB0b3IuVGVhbSI+Ci0gICAgICAgICAgICA8aW5wdXQgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRvciIvPgotICAgICAgICAgICAgPGlucHV0IHR5cGU9Im9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5Sb2xlRGVzY3JpcHRvcldyYXBwZXJJdGVtUHJvdmlkZXIiLz4KLSAgICAgICAgIDwvcHJvcGVydHlTZWN0aW9uPiAKLSAgICAgIAotCi0gICAgICAgICA8IS0tIFNlY3Rpb24gZm9yIFRlYW1Qcm9maWxlIC0tPgotICAgICAgICAgPHByb3BlcnR5U2VjdGlvbgotICAgICAgICAgICAgICAgdGFiPSJwcm9wZXJ0aWVzLnRhYi5UZWFtUHJvZmlsZS5Sb2xlIgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5UZWFtUHJvZmlsZVJvbGVTZWN0aW9uIgotICAgICAgICAgICAgICAgaWQ9InByb3BlcnRpZXMuc2VjdGlvbi5UZWFtUHJvZmlsZS5Sb2xlIj4KLSAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLlRlYW1Qcm9maWxlIi8+Ci0gICAgICAgICAgICA8aW5wdXQgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLlRlYW1Qcm9maWxlV3JhcHBlckl0ZW1Qcm92aWRlciIvPgotICAgICAgICAgPC9wcm9wZXJ0eVNlY3Rpb24+IAotICAgICAgICAgCi0gICAgICAgICA8IS0tIFNlY3Rpb24gZm9yIENvbXBvc2l0ZVJvbGUgLS0+Ci0gICAgICAgICA8cHJvcGVydHlTZWN0aW9uCi0gICAgICAgICAgICAgICB0YWI9InByb3BlcnRpZXMudGFiLkNvbXBvc2l0ZVJvbGUuUm9sZSIKLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuQ29tcG9zaXRlUm9sZVJvbGVTZWN0aW9uIgotICAgICAgICAgICAgICAgaWQ9InByb3BlcnRpZXMuc2VjdGlvbi5Db21wb3NpdGVSb2xlLlJvbGUiPgotICAgICAgICAgICAgPGlucHV0IHR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuQ29tcG9zaXRlUm9sZSIvPgotICAgICAgICAgICAgPGlucHV0IHR5cGU9Im9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5Db21wb3NpdGVSb2xlV3JhcHBlckl0ZW1Qcm92aWRlciIvPgotICAgICAgICAgPC9wcm9wZXJ0eVNlY3Rpb24+Ci0gICAgICA8L3Byb3BlcnR5U2VjdGlvbnM+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIAotICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkucHJlZmVyZW5jZVBhZ2VzIj4KLSAgICAgIDxwYWdlCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcmVmZXJlbmNlcy5BdXRob3JpbmdQcmVmZXJlbmNlUGFnZSIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByZWZlcmVuY2VzLkF1dGhvcmluZ1ByZWZlcmVuY2VQYWdlIgotICAgICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLmVwZi51aS5wcmVmZXJlbmNlcy5Sb290UHJlZmVyZW5jZVBhZ2UiCi0gICAgICAgICAgICBuYW1lPSIlYXV0aG9yaW5nUHJlZmVyZW5jZVBhZ2UiLz4KLSAgICAgIDxwYWdlCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcmVmZXJlbmNlcy5Qcm9jZXNzRWRpdG9yUHJlZmVyZW5jZVBhZ2UiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcmVmZXJlbmNlcy5Qcm9jZXNzRWRpdG9yUHJlZmVyZW5jZVBhZ2UiCi0gICAgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcmVmZXJlbmNlcy5BdXRob3JpbmdQcmVmZXJlbmNlUGFnZSIKLSAgICAgICAgICAgIG5hbWU9IiVwcm9jZXNzRWRpdG9yIi8+Ci0gICAgICA8cGFnZQotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJlZmVyZW5jZXMuQnJlYWtkb3duRWxlbWVudFByZWZQYWdlIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJlZmVyZW5jZXMuQnJlYWtkb3duRWxlbWVudFByZWZQYWdlIgotICAgICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJlZmVyZW5jZXMuUHJvY2Vzc0VkaXRvclByZWZlcmVuY2VQYWdlIiAgICAgICAgICAgIAotICAgICAgICAgICAgbmFtZT0iJWJyZWFrZG93bkVsZW1lbnRBdHRyaWJ1dGVzIi8+ICAgICAgICAgICAgCi0gICAgICA8cGFnZQotICAgICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJlZmVyZW5jZXMuQXV0aG9yaW5nUHJlZmVyZW5jZVBhZ2UiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcmVmZXJlbmNlcy5MaWJyYXJ5Vmlld1ByZWZQYWdlIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJlZmVyZW5jZXMuTGlicmFyeVZpZXdQcmVmUGFnZSIKLSAgICAgICAgICAgIG5hbWU9IiVsaWJyYXJ5Vmlld09wdGlvbnMiLz4KLSAgICAgIDwhLS0KLSAgICAgIDxwYWdlCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcmVmZXJlbmNlcy5Sb290UHJlZlBhZ2UiCi0gICAgICAgICAgICBuYW1lPSIlbWV0aG9kQXV0aG9yaW5nUGFnZSIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByZWZlcmVuY2VzLnJvb3RwcmVmcGFnZSIvPgotICAgICAgPHBhZ2UKLSAgICAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByZWZlcmVuY2VzLnJvb3RwcmVmcGFnZSIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByZWZlcmVuY2VzLkxpYnJhcnlQcmVmUGFnZSIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByZWZlcmVuY2VzLmxpYnJhcnlwcmVmcGFnZSIKLSAgICAgICAgICAgIG5hbWU9IiVsaWJyYXJ5T3B0aW9ucyIvPgotICAgICAgPHBhZ2UKLSAgICAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByZWZlcmVuY2VzLnJvb3RwcmVmcGFnZSIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByZWZlcmVuY2VzLkRlYnVnUHJlZlBhZ2UiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcmVmZXJlbmNlcy5EZWJ1Z1ByZWZQYWdlIgotICAgICAgICAgICAgbmFtZT0iJWRlYnVnIi8+Ci0gICAgICA8cGFnZQotICAgICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJlZmVyZW5jZXMucm9vdHByZWZwYWdlIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJlZmVyZW5jZXMuTW9kZWxpbmdPcHRpb25zUHJlZlBhZ2UiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcmVmZXJlbmNlcy5Nb2RlbGluZ09wdGlvbnNQcmVmUGFnZSIKLSAgICAgICAgICAgIG5hbWU9IiVtb2RlbGluZ09wdGlvbnMiLz4KLSAgICAgIC0tPgotCi0gICA8L2V4dGVuc2lvbj4KLSAgIAotICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzIj4KLSAgICAgIDxpbml0aWFsaXplcgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJlZmVyZW5jZXMuTGlicmFyeVByZWZlcmVuY2VJbml0aWFsaXplciIvPgotICAgICAgPGluaXRpYWxpemVyCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcmVmZXJlbmNlcy5BdXRob3JpbmdQcmVmZXJlbmNlSW5pdGlhbGl6ZXIiLz4KLSAgIDwvZXh0ZW5zaW9uPgotICAgCi0gICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS52aWV3QWN0aW9ucyI+Ci0gICAgICA8dmlld0NvbnRyaWJ1dGlvbgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudmlld0NvbnRyaWJ1dGlvbi5yZWZyZXNoQ29uZmlndXJhdGlvbiIKLSAgICAgICAgICAgIHRhcmdldElEPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnZpZXdzLkNvbmZpZ3VyYXRpb25WaWV3Ij4KLSAgICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnMuUmVmcmVzaENvbmZpZ3VyYXRpb24iCi0gICAgICAgICAgICAgICBkaXNhYmxlZEljb249Imljb25zL2Z1bGwvZXRvb2wxNi9SZWZyZXNoLmdpZiIKLSAgICAgICAgICAgICAgIGVuYWJsZXNGb3I9IisiCi0gICAgICAgICAgICAgICBpY29uPSJpY29ucy9mdWxsL2V0b29sMTYvUmVmcmVzaC5naWYiCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zLnJlZnJlc2giCi0gICAgICAgICAgICAgICBsYWJlbD0iJXJlZnJlc2hDb25maWciCi0gICAgICAgICAgICAgICBtZW51YmFyUGF0aD0iYWRkaXRpb25zIgotICAgICAgICAgICAgICAgc3R5bGU9InB1c2giCi0gICAgICAgICAgICAgICB0b29sYmFyUGF0aD0iYWRkaXRpb25zIgotICAgICAgICAgICAgICAgdG9vbHRpcD0iJXJlZnJlc2hDb25maWdUb29sdGlwIi8+Ci0gICAgICA8L3ZpZXdDb250cmlidXRpb24+Ci0gICAgICA8dmlld0NvbnRyaWJ1dGlvbgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudmlld0NvbnRyaWJ1dGlvbi5saW5rV2l0aEVkaXRvciIKLSAgICAgICAgICAgIHRhcmdldElEPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnZpZXdzLkxpYnJhcnlWaWV3Ij4KLSAgICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnMuTGlua1dpdGhFZGl0b3IiCi0gICAgICAgICAgICAgICBkaXNhYmxlZEljb249Imljb25zL2Z1bGwvZXRvb2wxNi9zeW5jZWQuZ2lmIgotICAgICAgICAgICAgICAgaWNvbj0iaWNvbnMvZnVsbC9ldG9vbDE2L3N5bmNlZC5naWYiCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zLmxpbmtXaXRoRWRpdG9yIgotICAgICAgICAgICAgICAgbGFiZWw9IiVsaW5rV2l0aEVkaXRvciIKLSAgICAgICAgICAgICAgIG1lbnViYXJQYXRoPSJhZGRpdGlvbnMiCi0gICAgICAgICAgICAgICBzdHlsZT0idG9nZ2xlIgotICAgICAgICAgICAgICAgdG9vbGJhclBhdGg9ImFkZGl0aW9ucyIKLSAgICAgICAgICAgICAgIHRvb2x0aXA9IiVsaW5rV2l0aEVkaXRvclRvb2x0aXAiLz4KLSAgICAgIDwvdmlld0NvbnRyaWJ1dGlvbj4KLSAgICAgIDx2aWV3Q29udHJpYnV0aW9uCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS52aWV3Q29udHJpYnV0aW9uLnNob3dQcmVzTmFtZXMiCi0gICAgICAgICAgICB0YXJnZXRJRD0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS52aWV3cy5MaWJyYXJ5VmlldyI+Ci0gICAgICAgICA8YWN0aW9uCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zLlNob3dQcmVzZW50YXRpb25OYW1lcyIKLSAgICAgICAgICAgICAgIGRpc2FibGVkSWNvbj0iaWNvbnMvZnVsbC9ldG9vbDE2L1ByZXNfbmFtZV90b2dnbGUuZ2lmIgotICAgICAgICAgICAgICAgaWNvbj0iaWNvbnMvZnVsbC9ldG9vbDE2L1ByZXNfbmFtZV90b2dnbGUuZ2lmIgotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9ucy5zaG93UHJlc05hbWVzIgotICAgICAgICAgICAgICAgbGFiZWw9IiVzaG93UHJlc2VudGF0aW9uTmFtZXMiCi0gICAgICAgICAgICAgICBtZW51YmFyUGF0aD0iYWRkaXRpb25zIgotICAgICAgICAgICAgICAgc3R5bGU9InRvZ2dsZSIKLSAgICAgICAgICAgICAgIHRvb2xiYXJQYXRoPSJhZGRpdGlvbnMiCi0gICAgICAgICAgICAgICB0b29sdGlwPSIlc2hvd1ByZXNlbnRhdGlvbk5hbWVzVG9vbHRpcCIvPgotICAgICAgPC92aWV3Q29udHJpYnV0aW9uPgotICAgPC9leHRlbnNpb24+Ci0gICAKLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmNvbW1hbmRzIj4KLSAgICAgIDxjb21tYW5kCi0gICAgICAgICAgICBjYXRlZ29yeUlkPSJvcmcuZWNsaXBzZS51aS5jYXRlZ29yeS5lZGl0IgotICAgICAgICAgICAgZGVmYXVsdEhhbmRsZXI9Im9yZy5lY2xpcHNlLnVpLmludGVybmFsLmhhbmRsZXJzLlNlbGVjdEFsbEhhbmRsZXIiCi0gICAgICAgICAgICBkZXNjcmlwdGlvbj0iJXNlbGVjdEFsbCIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS5lZGl0LnNlbGVjdEFsbEIiCi0gICAgICAgICAgICBuYW1lPSJzZWxlY3RBbGwiLz4KLSAgIDwvZXh0ZW5zaW9uPgotICAgCi0gICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5iaW5kaW5ncyI+Ci0gICAgICA8a2V5Ci0gICAgICAgICAgICBjb21tYW5kSWQ9Im9yZy5lY2xpcHNlLnVpLmVkaXQuc2VsZWN0QWxsQiIKLSAgICAgICAgICAgIGNvbnRleHRJZD0ib3JnLmVjbGlwc2UudWkuY29udGV4dHMud2luZG93IgotICAgICAgICAgICAgc2NoZW1lSWQ9Im9yZy5lY2xpcHNlLnVpLmRlZmF1bHRBY2NlbGVyYXRvckNvbmZpZ3VyYXRpb24iCi0gICAgICAgICAgICBzZXF1ZW5jZT0iQ3RybCtBIi8+Ci0gICA8L2V4dGVuc2lvbj4KLQotICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkuYWN0aW9uU2V0cyI+Ci0gICAgICA8YWN0aW9uU2V0Ci0gICAgICAgICAgICBsYWJlbD0iJWNoZWF0U2hlZXRzQWN0aW9uU2V0IgotICAgICAgICAgICAgdmlzaWJsZT0idHJ1ZSIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS5jaGVhdHNoZWV0cy5hY3Rpb25TZXQiPgotICAgICAgICAgPGFjdGlvbgotICAgICAgICAgICAgbGFiZWw9IiVvcGVuQ2hlYXRTaGVldHMiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuY2hlYXRzaGVldHMuYWN0aW9ucy5DaGVhdFNoZWV0SGVscE1lbnVBY3Rpb24iCi0gICAgICAgICAgICBtZW51YmFyUGF0aD0iaGVscC9ncm91cC5hc3Npc3QiIGlkPSJvcmcuZWNsaXBzZS51aS5jaGVhdHNoZWV0cy5hY3Rpb25zLkNoZWF0U2hlZXRIZWxwTWVudUFjdGlvbiI+Ci0gICAgICAgICA8L2FjdGlvbj4KLSAgICAgIDwvYWN0aW9uU2V0PgotICAgPC9leHRlbnNpb24+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkuZGVjb3JhdG9ycyI+Ci0gICAgICA8ZGVjb3JhdG9yCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm92aWRlcnMuTWV0aG9kRWxlbWVudExpZ2h0d2VpZ2h0TGFiZWxEZWNvcmF0b3IiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm92aWRlcnMuTWV0aG9kRWxlbWVudExpZ2h0d2VpZ2h0TGFiZWxEZWNvcmF0b3IiCi0gICAgICAgICAgICBsYWJlbD0iTWV0aG9kIEVsZW1lbnQgTGlnaHR3ZWlnaHQgTGFiZWwgRGVjb3JhdG9yIgotICAgICAgICAgICAgbGlnaHR3ZWlnaHQ9InRydWUiCi0gICAgICAgICAgICBsb2NhdGlvbj0iVE9QX0xFRlQiCi0gICAgICAgICAgICBzdGF0ZT0idHJ1ZSIvPgotICAgPC9leHRlbnNpb24+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkuaWRlLm1hcmtlclJlc29sdXRpb24iPgotICAgICAgPG1hcmtlclJlc29sdXRpb25HZW5lcmF0b3IgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudXRpbC5NYXJrZXJSZXNvbHV0aW9uR2VuZXJhdG9yIgotICAgICAgCW1hcmtlclR5cGU9Im9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLnVucmVzb2x2ZWRQcm94eU1hcmtlciIvPgotICAgPC9leHRlbnNpb24+Ci0gICA8ZXh0ZW5zaW9uIGlkPSJtZXRob2RSaWNoVGV4dCIgcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLm1hcmtlcnMiIG5hbWU9IiVSaWNoVGV4dE1hcmtlclR5cGVOYW1lIj4gCi0gICAgICA8cGVyc2lzdGVudCB2YWx1ZT0iZmFsc2UiLz4gCi0gICAgICA8c3VwZXIgdHlwZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJvYmxlbW1hcmtlciIvPiAKLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZ3VpZCIvPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJNZXRob2RGaWVsZE5hbWUiLz4KLSAgIDwvZXh0ZW5zaW9uPgotICAgPGV4dGVuc2lvbiBpZD0iY29uZmlndXJhdGlvbiIgcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLm1hcmtlcnMiIG5hbWU9IiVDb25maWd1cmF0aW9uTWFya2VyVHlwZU5hbWUiPiAKLSAgICAgIDxwZXJzaXN0ZW50IHZhbHVlPSJmYWxzZSIvPiAKLSAgICAgIDxzdXBlciB0eXBlPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcm9ibGVtbWFya2VyIi8+IAotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJlcnJvcklEIi8+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9ImNvbmZpZ0d1aWQiLz4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZWxlbWVudEd1aWQiLz4gCi0gICAgICA8YXR0cmlidXRlIG5hbWU9ImNhdXNlR3VpZCIvPgotICAgPC9leHRlbnNpb24+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkuaWRlLm1hcmtlclJlc29sdXRpb24iPgotICAgICAgPG1hcmtlclJlc29sdXRpb25HZW5lcmF0b3IgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudXRpbC5MaWJyYXJ5UHJvYmxlbU1hcmtlclJlc29sdXRpb25HZW5lcmF0b3IiCi0gICAgICBtYXJrZXJUeXBlPSJvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51bnJlc29sdmVkQmFzZVBsdWdpbnMiLz4KLSAgIDwvZXh0ZW5zaW9uPiAgCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkuaWRlLm1hcmtlclJlc29sdXRpb24iPgotICAgICAgPG1hcmtlclJlc29sdXRpb25HZW5lcmF0b3IgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudXRpbC5MaWJyYXJ5UHJvYmxlbU1hcmtlclJlc29sdXRpb25HZW5lcmF0b3IiCi0gICAgICBtYXJrZXJUeXBlPSJvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5tdWx0aXBsZVJlcGxhY2VycyIvPgotICAgPC9leHRlbnNpb24+ICAKLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5pZGUubWFya2VyUmVzb2x1dGlvbiI+Ci0gICAgICA8bWFya2VyUmVzb2x1dGlvbkdlbmVyYXRvciBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS51dGlsLkNvbmZpZ3VyYXRpb25NYXJrZXJSZXNvbHV0aW9uR2VuZXJhdG9yIgotICAgICAgbWFya2VyVHlwZT0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5jb25maWd1cmF0aW9uIi8+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnVzZXJJbnRlcmFjdGlvbkhhbmRsZXIiPgotICAgICAgPHVzZXJJbnRlcmFjdGlvbkhhbmRsZXIgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9ucy5Vc2VySW50ZXJhY3Rpb25IYW5kbGVyIi8+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLm1ldGhvZFJpY2hUZXh0Ij4KLSAgICAgIDxtZXRob2RSaWNoVGV4dAotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5NZXRob2RSaWNoVGV4dCIKLSAgICAgICAgICAgIHZlcnNpb249IjAiPgotICAgICAgPC9tZXRob2RSaWNoVGV4dD4KLSAgIDwvZXh0ZW5zaW9uPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkubWV0aG9kUmljaFRleHRFZGl0b3IiPgotICAgICAgPG1ldGhvZFJpY2hUZXh0RWRpdG9yCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLk1ldGhvZFJpY2hUZXh0RWRpdG9yIgotICAgICAgICAgICAgdmVyc2lvbj0iMCI+Ci0gICAgICA8L21ldGhvZFJpY2hUZXh0RWRpdG9yPgotICAgPC9leHRlbnNpb24+Ci08L3BsdWdpbj4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc2NoZW1hL0N1c3RvbWl6ZWRMb2NrZXIuZXhzZCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc2NoZW1hL0N1c3RvbWl6ZWRMb2NrZXIuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTBjMDMzMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NjaGVtYS9DdXN0b21pemVkTG9ja2VyLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMDkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aSI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aSIgaWQ9IkN1c3RvbWl6ZWRMb2NrZXIiIG5hbWU9IkN1c3RvbWl6ZWQgTG9ja2VyIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBkZXNjcmlwdGlvbiBvZiB0aGlzIGV4dGVuc2lvbiBwb2ludC5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9IkN1c3RvbWl6ZWRMb2NrZXIiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSB0cmFuc2xhdGFibGU9InRydWUiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0iQ3VzdG9taXplZExvY2tlciI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgdGhlIGZpcnN0IHJlbGVhc2UgaW4gd2hpY2ggdGhpcyBleHRlbnNpb24gcG9pbnQgYXBwZWFycy5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBleHRlbnNpb24gcG9pbnQgdXNhZ2UgZXhhbXBsZSBoZXJlLl0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgQVBJIGluZm9ybWF0aW9uIGhlcmUuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgaW5mb3JtYXRpb24gYWJvdXQgc3VwcGxpZWQgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBleHRlbnNpb24gcG9pbnQuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zY2hlbWEvTWV0aG9kRWxlbWVudEVkaXRvclBhZ2VQcm92aWRlcnMuZXhzZCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc2NoZW1hL01ldGhvZEVsZW1lbnRFZGl0b3JQYWdlUHJvdmlkZXJzLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkYmY3MmEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zY2hlbWEvTWV0aG9kRWxlbWVudEVkaXRvclBhZ2VQcm92aWRlcnMuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDEyMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpIj4KLTxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpIiBpZD0iTWV0aG9kRWxlbWVudEVkaXRvclBhZ2VQcm92aWRlcnMiIG5hbWU9Ik1ldGhvZCBFbGVtZW50IEVkaXRvciBQYWdlIFByb3ZpZGVycyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBUaGlzIGV4dGVuc2lvbiBwb2ludCBlbmFibGVzIGEgcGx1Zy1pbiB0byBhZGQsIHJlbW92ZSwgb3IgcmVwbGFjZSBvbmUgb3IgbW9yZSBwYWdlcyBpbiB0aGUgYXV0aG9yaW5nIGVkaXRvci4KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iZWRpdG9yUGFnZSIgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJlZGl0b3JQYWdlIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJqYXZhIiBiYXNlZE9uPSI6b3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm92aWRlcnMuSU1ldGhvZEVsZW1lbnRFZGl0b3JQYWdlUHJvdmlkZXJFeHRlbnNpb24iLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgMS4wCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICZsdDtwcmUmZ3Q7Ci0gJmx0O2V4dGVuc2lvbgotICBwb2ludD0mcXVvdDtvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkN1c3RvbUNhdGVnb3J5RWRpdG9yUGFnZVByb3ZpZGVyJnF1b3Q7Jmd0OwotICAmbHQ7ZWRpdG9yUGFnZQotICAgaWQ9JnF1b3Q7b3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5DdXN0b21DYXRlZ29yeUVzdGltYXRpb25QYWdlJnF1b3Q7Ci0gICBuYW1lPSZxdW90O0VzdGltYXRpb24mcXVvdDsKLSAgIGNsYXNzPSZxdW90O29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQ3VzdG9tQ2F0ZWdvcnlFc3RpbWF0aW9uUGFnZSZxdW90OyZndDsKLSAgJmx0Oy9lZGl0b3JQYWdlJmd0OwotICZsdDsvZXh0ZW5zaW9uJmd0OwotJmx0Oy9wcmUmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIEFQSSBpbmZvcm1hdGlvbiBoZXJlLl0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIGluZm9ybWF0aW9uIGFib3V0IHN1cHBsaWVkIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgZXh0ZW5zaW9uIHBvaW50Ll0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc2NoZW1hL05ld0NvbmZpZ3VyYXRpb25XaXphcmQuZXhzZCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc2NoZW1hL05ld0NvbmZpZ3VyYXRpb25XaXphcmQuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDM2NGFlMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NjaGVtYS9OZXdDb25maWd1cmF0aW9uV2l6YXJkLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxNTUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aSI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aSIgaWQ9Im5ld1BsdWdpbldpemFyZCIgbmFtZT0iTmV3IE1ldGhvZCBQbHVnaW4gV2l6YXJkIEV4dGVuc2lvbiIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBFbmFibGVzIGEgcGx1Zy1pbiB0byBleHRlbmQgdGhlIE5ldyBNZXRob2QgQ29uZmlndXJhdGlvbiB3aXphcmQgYnkgcmVwbGFjaW5nIGV4aXN0aW5nIHdpemFyZCBwYWdlcyBvciBhZGRpbmcgbmV3IG9uZXMuCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9IndpemFyZEV4dGVuZGVyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgQSBmdWxseSBxdWFsaWZpZWQgaWRlbnRpZmllciBvZiB0aGUgdGFyZ2V0IGV4dGVuc2lvbiBwb2ludC4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBBbiBvcHRpb25hbCBpZGVudGlmaWVyIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBBbiBvcHRpb25hbCBuYW1lIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9IndpemFyZEV4dGVuZGVyIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0id2l6YXJkUGFnZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhlIEphdmEgY2xhc3MgdGhhdCBpbXBsZW1lbnRzIHRoZSB3aXphcmQgZXh0ZW5kZXIuIFRoaXMgY2xhc3MgbXVzdCBpbXBsZW1lbnRzICZsdDtjb2RlJmd0O29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLndpemFyZHMuSVB1Ymxpc2hDb25maWdXaXphcmRFeHRlbmRlciZsdDsvY29kZSZndDsuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9IndpemFyZFBhZ2UiPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgSmF2YSBjbGFzcyB0aGF0IGltcGxlbWVudHMgdGhlIHdpemFyZCBwYWdlLiBUaGlzIGNsYXNzIG11c3QgaW1wbGVtZW50cyAmbHQ7Y29kZSZndDtvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZFBhZ2UmbHQ7L2NvZGUmZ3Q7LgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InR5cGUiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhlIHR5cGUgb2YgZXh0ZW5zaW9uIC0gJnF1b3Q7cmVwbGFjZSZxdW90OyBvciAmcXVvdDtuZXcmcXVvdDsuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idGFyZ2V0IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSBuYW1lIG9mIHRoZSBiYXNlIHdpemFyZCBwYWdlIHRvIGJlIHJlcGxhY2VkIG9yIHVzZWQgYXMgYSByZWZlcmVuY2UgZm9yIGluc2VydGluZyBhIG5ldyB3aXphcmQgcGFnZS4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpbnNlcnQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhlIGluc2VydGlvbiB0eXBlIGZvciBhIG5ldyB3aXphcmQgcGFnZSAtICZxdW90O2JlZm9yZSZxdW90OyBvciAmcXVvdDthZnRlciZxdW90Oy4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgMS4yCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFRoZSBmb2xsb3dpbmcgaXMgYW4gZXhhbXBsZSBvZiBob3cgdGhlIGV4dGVuc2lvbiBwb2ludCBjYW4gYmUgdXNlZDogCi0mbHQ7cCZndDsKLSZsdDtwcmUmZ3Q7Ci0gICAmbHQ7ZXh0ZW5zaW9uIHBvaW50PSZxdW90O29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkubmV3Q29uZmlndXJhdGlvbldpemFyZCZxdW90OyZndDsKLSAgICAgICZsdDt3aXphcmQKLSAgICAgICAgICAgIGNsYXNzPSZxdW90O29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkud2l6YXJkcy5OZXdDb25maWd1cmF0aW9uV2l6YXJkRXh0ZW5kZXImcXVvdDsmZ3Q7Ci0gICAgICAgICAmbHQ7d2l6YXJkUGFnZQotICAgICAgICAgICAgICAgY2xhc3M9JnF1b3Q7b3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS53aXphcmRzLk5ld0NuZmlndXJhdGlvbldpemFyZFBhZ2UmcXVvdDsKLSAgICAgICAgICAgICAgIHR5cGU9JnF1b3Q7cmVwbGFjZSZxdW90OwotICAgICAgICAgICAgICAgdGFyZ2V0PSZxdW90O29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkud2l6YXJkcy5OZXdDb25maWd1cmF0aW9uTWFpblBhZ2UmcXVvdDsvJmd0OwotICAgICAgICAgJmx0O3dpemFyZFBhZ2UKLSAgICAgICAgICAgICAgIGNsYXNzPSZxdW90O29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkud2l6YXJkcy5TZWxlY3RPcHRpb25zUGFnZSZxdW90OwotICAgICAgICAgICAgICAgdHlwZT0mcXVvdDtuZXcmcXVvdDsKLSAgICAgICAgICAgICAgIHRhcmdldD0mcXVvdDtvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLndpemFyZHMuTmV3Q29uZmlndXJhdGlvbk1haW5QYWdlJnF1b3Q7Ci0gICAgICAgICAgICAgICBpbnNlcnQ9JnF1b3Q7YWZ0ZXImcXVvdDsvJmd0OyAgICAgICAgICAgICAgICAgICAgIAotICAgICAgJmx0Oy93aXphcmQmZ3Q7Ci0gICAmbHQ7L2V4dGVuc2lvbiZndDsKLSZsdDsvcHJlJmd0OwotJmx0Oy9wJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4mbHQ7YnImZ3Q7Ci1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAmbHQ7YSAKLWhyZWY9JnF1b3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmcXVvdDsmZ3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmbHQ7L2EmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zY2hlbWEvTmV3UGx1Z2luV2l6YXJkLmV4c2QgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NjaGVtYS9OZXdQbHVnaW5XaXphcmQuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTA1NjI2Ni4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NjaGVtYS9OZXdQbHVnaW5XaXphcmQuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDE1NSArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpIj4KLTxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpIiBpZD0ibmV3UGx1Z2luV2l6YXJkIiBuYW1lPSJOZXcgTWV0aG9kIFBsdWdpbiBXaXphcmQgRXh0ZW5zaW9uIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIEVuYWJsZXMgYSBwbHVnLWluIHRvIGV4dGVuZCB0aGUgTmV3IE1ldGhvZCBQbHVnLWluIHdpemFyZCBieSByZXBsYWNpbmcgZXhpc3Rpbmcgd2l6YXJkIHBhZ2VzIG9yIGFkZGluZyBuZXcgb25lcy4KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0id2l6YXJkRXh0ZW5kZXIiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBBIGZ1bGx5IHF1YWxpZmllZCBpZGVudGlmaWVyIG9mIHRoZSB0YXJnZXQgZXh0ZW5zaW9uIHBvaW50LgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIEFuIG9wdGlvbmFsIGlkZW50aWZpZXIgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZS4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIEFuIG9wdGlvbmFsIG5hbWUgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZS4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0id2l6YXJkRXh0ZW5kZXIiPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJ3aXphcmRQYWdlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgSmF2YSBjbGFzcyB0aGF0IGltcGxlbWVudHMgdGhlIHdpemFyZCBleHRlbmRlci4gVGhpcyBjbGFzcyBtdXN0IGltcGxlbWVudHMgJmx0O2NvZGUmZ3Q7b3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkud2l6YXJkcy5JUHVibGlzaENvbmZpZ1dpemFyZEV4dGVuZGVyJmx0Oy9jb2RlJmd0Oy4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0id2l6YXJkUGFnZSI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSBKYXZhIGNsYXNzIHRoYXQgaW1wbGVtZW50cyB0aGUgd2l6YXJkIHBhZ2UuIFRoaXMgY2xhc3MgbXVzdCBpbXBsZW1lbnRzICZsdDtjb2RlJmd0O29yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkUGFnZSZsdDsvY29kZSZndDsuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idHlwZSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgdHlwZSBvZiBleHRlbnNpb24gLSAmcXVvdDtyZXBsYWNlJnF1b3Q7IG9yICZxdW90O25ldyZxdW90Oy4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ0YXJnZXQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhlIG5hbWUgb2YgdGhlIGJhc2Ugd2l6YXJkIHBhZ2UgdG8gYmUgcmVwbGFjZWQgb3IgdXNlZCBhcyBhIHJlZmVyZW5jZSBmb3IgaW5zZXJ0aW5nIGEgbmV3IHdpemFyZCBwYWdlLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Imluc2VydCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgaW5zZXJ0aW9uIHR5cGUgZm9yIGEgbmV3IHdpemFyZCBwYWdlIC0gJnF1b3Q7YmVmb3JlJnF1b3Q7IG9yICZxdW90O2FmdGVyJnF1b3Q7LgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAxLjIKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgVGhlIGZvbGxvd2luZyBpcyBhbiBleGFtcGxlIG9mIGhvdyB0aGUgZXh0ZW5zaW9uIHBvaW50IGNhbiBiZSB1c2VkOiAKLSZsdDtwJmd0OwotJmx0O3ByZSZndDsKLSAgICZsdDtleHRlbnNpb24gcG9pbnQ9JnF1b3Q7b3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5uZXdQbHVnaW5XaXphcmQmcXVvdDsmZ3Q7Ci0gICAgICAmbHQ7d2l6YXJkCi0gICAgICAgICAgICBjbGFzcz0mcXVvdDtvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLndpemFyZHMuTmV3UGx1Z2luV2l6YXJkRXh0ZW5kZXImcXVvdDsmZ3Q7Ci0gICAgICAgICAmbHQ7d2l6YXJkUGFnZQotICAgICAgICAgICAgICAgY2xhc3M9JnF1b3Q7b3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS53aXphcmRzLk5ld1BsdWdpbldpemFyZFBhZ2UmcXVvdDsKLSAgICAgICAgICAgICAgIHR5cGU9JnF1b3Q7cmVwbGFjZSZxdW90OwotICAgICAgICAgICAgICAgdGFyZ2V0PSZxdW90O29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkud2l6YXJkcy5OZXdQbHVnaW5NYWluUGFnZSZxdW90Oy8mZ3Q7Ci0gICAgICAgICAmbHQ7d2l6YXJkUGFnZQotICAgICAgICAgICAgICAgY2xhc3M9JnF1b3Q7b3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS53aXphcmRzLlNlbGVjdE9wdGlvbnNQYWdlJnF1b3Q7Ci0gICAgICAgICAgICAgICB0eXBlPSZxdW90O25ldyZxdW90OwotICAgICAgICAgICAgICAgdGFyZ2V0PSZxdW90O29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkud2l6YXJkcy5OZXdQbHVnaW5NYWluUGFnZSZxdW90OwotICAgICAgICAgICAgICAgaW5zZXJ0PSZxdW90O2FmdGVyJnF1b3Q7LyZndDsgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICZsdDsvd2l6YXJkJmd0OwotICAgJmx0Oy9leHRlbnNpb24mZ3Q7Ci0mbHQ7L3ByZSZndDsKLSZsdDsvcCZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuJmx0O2JyJmd0OwotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgJmx0O2EgCi1ocmVmPSZxdW90O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJnF1b3Q7Jmd0O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJmx0Oy9hJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc2NoZW1hL2NvbmZpZ3VyYXRpb25WaWV3TWVudVByb3ZpZGVyLmV4c2QgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NjaGVtYS9jb25maWd1cmF0aW9uVmlld01lbnVQcm92aWRlci5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhN2IyZTMxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc2NoZW1hL2NvbmZpZ3VyYXRpb25WaWV3TWVudVByb3ZpZGVyLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMjAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aSI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aSIgaWQ9ImNvbmZpZ3VyYXRpb25WaWV3TWVudVByb3ZpZGVyIiBuYW1lPSJDb25maWd1cmF0aW9uIFZpZXcgTWVudSBQcm92aWRlciIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBUaGlzIGV4dGVuc2lvbiBwb2ludCBlbmFibGVzIGEgcGx1Zy1pbiB0byByZWdpc3RlciBtb3JlIG1lbnUgY29udHJpYnV0aW9ucyBmb3IgY29uZmlndXJhdGlvbiB2aWV3LgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJNZW51QWN0aW9uIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9Ik1lbnVBY3Rpb24iPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIGtpbmQ9ImphdmEiIGJhc2VkT249Im9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb246b3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zLklNZW51QWN0aW9uIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIDEuNQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAmbHQ7cHJlJmd0OwotICZsdDtleHRlbnNpb24KLSAgcG9pbnQ9JnF1b3Q7b3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5jb25maWd1cmF0aW9uVmlld01lbnVQcm92aWRlciZxdW90OyZndDsKLSAgJmx0O3NlY3Rpb24KLSAgIGlkPSZxdW90O29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9ucy5SZWZyZXNoQWN0aW9uJnF1b3Q7Ci0gICBjbGFzcz0mcXVvdDtvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnMuUmVmcmVzaEFjdGlvbiZxdW90OyZndDsKLSAgJmx0Oy9zZWN0aW9uJmd0OwotICZsdDsvZXh0ZW5zaW9uJmd0OwotJmx0Oy9wcmUmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIEFQSSBpbmZvcm1hdGlvbiBoZXJlLl0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIGluZm9ybWF0aW9uIGFib3V0IHN1cHBsaWVkIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgZXh0ZW5zaW9uIHBvaW50Ll0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc2NoZW1hL2NvbnRlbnRQcm92aWRlckZhY3Rvcmllcy5leHNkIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zY2hlbWEvY29udGVudFByb3ZpZGVyRmFjdG9yaWVzLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzYjg2YjYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zY2hlbWEvY29udGVudFByb3ZpZGVyRmFjdG9yaWVzLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMTIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aSI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aSIgaWQ9ImNvbnRlbnRQcm92aWRlckZhY3RvcmllcyIgbmFtZT0iQ29udGVudCBQcm92aWRlciBGYWN0b3JpZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIGRlc2NyaXB0aW9uIG9mIHRoaXMgZXh0ZW5zaW9uIHBvaW50Ll0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iZmFjdG9yeSIgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJmYWN0b3J5Ij4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJqYXZhIiBiYXNlZE9uPSI6b3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm92aWRlcnMuSUNvbnRlbnRQcm92aWRlckZhY3RvcnkiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ2aWV3IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgdGhlIGZpcnN0IHJlbGVhc2UgaW4gd2hpY2ggdGhpcyBleHRlbnNpb24gcG9pbnQgYXBwZWFycy5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBleHRlbnNpb24gcG9pbnQgdXNhZ2UgZXhhbXBsZSBoZXJlLl0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgQVBJIGluZm9ybWF0aW9uIGhlcmUuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgaW5mb3JtYXRpb24gYWJvdXQgc3VwcGxpZWQgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBleHRlbnNpb24gcG9pbnQuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zY2hlbWEvZGVzY3JpcHRpb25QYWdlQ29sdW1uUHJvdmlkZXIuZXhzZCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc2NoZW1hL2Rlc2NyaXB0aW9uUGFnZUNvbHVtblByb3ZpZGVyLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlMmViYmUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zY2hlbWEvZGVzY3JpcHRpb25QYWdlQ29sdW1uUHJvdmlkZXIuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDEzNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpIj4KLTxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpIiBpZD0iZGVzY3JpcHRpb25QYWdlQ29sdW1uUHJvdmlkZXIiIG5hbWU9IkVkaXRvciBEZXNjcmlwdGlvbiBQYWdlIENvbHVtbiBQcm92aWRlciIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBUaGlzIGV4dGVuc2lvbiBwb2ludCBlbmFibGVzIGEgcGx1Zy1pbiB0byByZWdpc3RlciBtb3JlIGNvbHVtbnMgaW4gZGVzY3JpcHRpb24gcGFnZXMgb2YgdGhlIGF1dGhvcmluZyBlZGl0b3IuCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImNvbHVtbiIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJjb2x1bW4iPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ3aWR0aCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJhbGlnbiIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIGtpbmQ9ImphdmEiIGJhc2VkT249Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuSUNvbHVtblByb3ZpZGVyIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIDEuNQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAmbHQ7cHJlJmd0OwotICZsdDtleHRlbnNpb24KLSAgcG9pbnQ9JnF1b3Q7b3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5kZXNjcmlwdGlvblBhZ2VDb2x1bW5Qcm92aWRlciZxdW90OyZndDsKLSAgJmx0O2NvbHVtbgotICAgaWQ9JnF1b3Q7b3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvblRhYkV4dHJhQ29sdW1uJnF1b3Q7Ci0gICB3aWR0aD0mcXVvdDsyMCZxdW90OwotICAgY2xhc3M9JnF1b3Q7b3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvblRhYkV4dHJhQ29sdW1uJnF1b3Q7Jmd0OwotICAmbHQ7L2NvbHVtbiZndDsKLSAmbHQ7L2V4dGVuc2lvbiZndDsKLSZsdDsvcHJlJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBBUEkgaW5mb3JtYXRpb24gaGVyZS5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBpbmZvcm1hdGlvbiBhYm91dCBzdXBwbGllZCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGV4dGVuc2lvbiBwb2ludC5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotPC9zY2hlbWE+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NjaGVtYS9kZXNjcmlwdGlvblBhZ2VTZWN0aW9uUHJvdmlkZXIuZXhzZCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc2NoZW1hL2Rlc2NyaXB0aW9uUGFnZVNlY3Rpb25Qcm92aWRlci5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYzUyM2QxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc2NoZW1hL2Rlc2NyaXB0aW9uUGFnZVNlY3Rpb25Qcm92aWRlci5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTIwICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkiPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkiIGlkPSJkZXNjcmlwdGlvblBhZ2VTZWN0aW9uUHJvdmlkZXIiIG5hbWU9IkVkaXRvciBEZXNjcmlwdGlvbiBQYWdlIFNlY3Rpb24gUHJvdmlkZXIiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgVGhpcyBleHRlbnNpb24gcG9pbnQgZW5hYmxlcyBhIHBsdWctaW4gdG8gcmVnaXN0ZXIgbW9yZSBzZWN0aW9ucyBpbiBkZXNjcmlwdGlvbiBwYWdlcyBvZiB0aGUgYXV0aG9yaW5nIGVkaXRvci4KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0ic2VjdGlvbiIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJzZWN0aW9uIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJqYXZhIiBiYXNlZE9uPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLklTZWN0aW9uUHJvdmlkZXIiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgMS41Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICZsdDtwcmUmZ3Q7Ci0gJmx0O2V4dGVuc2lvbgotICBwb2ludD0mcXVvdDtvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmRlc2NyaXB0aW9uUGFnZVNlY3Rpb25Qcm92aWRlciZxdW90OyZndDsKLSAgJmx0O3NlY3Rpb24KLSAgIGlkPSZxdW90O29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25UYWJFeHRyYVNlY3Rpb24mcXVvdDsKLSAgIGNsYXNzPSZxdW90O29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25UYWJFeHRyYVNlY3Rpb24mcXVvdDsmZ3Q7Ci0gICZsdDsvc2VjdGlvbiZndDsKLSAmbHQ7L2V4dGVuc2lvbiZndDsKLSZsdDsvcHJlJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBBUEkgaW5mb3JtYXRpb24gaGVyZS5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBpbmZvcm1hdGlvbiBhYm91dCBzdXBwbGllZCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGV4dGVuc2lvbiBwb2ludC5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotPC9zY2hlbWE+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NjaGVtYS9lZGl0b3JPcGVuZXIuZXhzZCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc2NoZW1hL2VkaXRvck9wZW5lci5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxY2QxOWRjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc2NoZW1hL2VkaXRvck9wZW5lci5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTA5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkiPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkiIGlkPSJlZGl0b3JPcGVuZXIiIG5hbWU9IkVkaXRvciBPcGVuZXIiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgZXh0ZW5zaW9uIHRvIGRlZmluZSBlZGl0b3Igb3BlbmVkLiBUaGUgb3BlbmVyIGlzIGFzc29jaWF0ZWQgd2l0aCBhbiBJRCB0aGF0IG1hdGNoZXMgd2l0aCB0aGUgTWV0aG9kRWxlbWVudFByb3BlcnR5IG5hbWUuCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9IkVkaXRvck9wZW5lciIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJFZGl0b3JPcGVuZXIiPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIHRoZSBmaXJzdCByZWxlYXNlIGluIHdoaWNoIHRoaXMgZXh0ZW5zaW9uIHBvaW50IGFwcGVhcnMuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgZXh0ZW5zaW9uIHBvaW50IHVzYWdlIGV4YW1wbGUgaGVyZS5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIEFQSSBpbmZvcm1hdGlvbiBoZXJlLl0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIGluZm9ybWF0aW9uIGFib3V0IHN1cHBsaWVkIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgZXh0ZW5zaW9uIHBvaW50Ll0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc2NoZW1hL21ldGhvZFJpY2hUZXh0LmV4c2QgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NjaGVtYS9tZXRob2RSaWNoVGV4dC5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NTk0MTNkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc2NoZW1hL21ldGhvZFJpY2hUZXh0LmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMTIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aSI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aSIgaWQ9Im1ldGhvZFJpY2hUZXh0IiBuYW1lPSJNZXRob2QgUmljaCBUZXh0IEV4dGVuc2lvbiIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBUaGlzIGV4dGVuc2lvbiBwb2ludCBhbGxvd3MgYSBwbHVnLWluIHRvIGRlZmluZSB3aGljaCBjbGFzcyBpcyB1c2VkIGZvciBhIE1ldGhvZCBSaWNoIFRleHQgd2lkZ2V0LiAgVGhlIGNsYXNzIG11c3QgaW1wbGVtZW50IElNZXRob2RSaWNoVGV4dC4KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0ibWV0aG9kUmljaFRleHQiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSB0cmFuc2xhdGFibGU9InRydWUiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0ibWV0aG9kUmljaFRleHQiPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIGtpbmQ9ImphdmEiIGJhc2VkT249IjpvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnJpY2h0ZXh0LklNZXRob2RSaWNoVGV4dCIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InZlcnNpb24iIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVmVyc2lvbiBtdXN0IGJlIGFuIGludC4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgMi4wCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBleHRlbnNpb24gcG9pbnQgdXNhZ2UgZXhhbXBsZSBoZXJlLl0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgQVBJIGluZm9ybWF0aW9uIGhlcmUuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgaW5mb3JtYXRpb24gYWJvdXQgc3VwcGxpZWQgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBleHRlbnNpb24gcG9pbnQuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zY2hlbWEvbWV0aG9kUmljaFRleHRFZGl0b3IuZXhzZCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc2NoZW1hL21ldGhvZFJpY2hUZXh0RWRpdG9yLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlZjYwZjcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zY2hlbWEvbWV0aG9kUmljaFRleHRFZGl0b3IuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDExMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpIj4KLTxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpIiBpZD0ibWV0aG9kUmljaFRleHRFZGl0b3IiIG5hbWU9Ik1ldGhvZCBSaWNoIFRleHQgRWRpdG9yIEV4dGVuc2lvbiIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBUaGlzIGV4dGVuc2lvbiBwb2ludCBhbGxvd3MgYSBwbHVnLWluIHRvIGRlZmluZSB3aGljaCBjbGFzcyBpcyB1c2VkIGZvciBhIE1ldGhvZCBSaWNoIFRleHQgRWRpdG9yIHdpZGdldC4gIFRoZSBjbGFzcyBtdXN0IGltcGxlbWVudCBJTWV0aG9kUmljaFRleHRFZGl0b3IuCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9Im1ldGhvZFJpY2hUZXh0RWRpdG9yIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9Im1ldGhvZFJpY2hUZXh0RWRpdG9yIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJqYXZhIiBiYXNlZE9uPSI6b3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5yaWNodGV4dC5JTWV0aG9kUmljaFRleHRFZGl0b3IiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ2ZXJzaW9uIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFZlcnNpb24gbXVzdCBiZSBhbiBpbnQuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIDIuMAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgZXh0ZW5zaW9uIHBvaW50IHVzYWdlIGV4YW1wbGUgaGVyZS5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIEFQSSBpbmZvcm1hdGlvbiBoZXJlLl0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIGluZm9ybWF0aW9uIGFib3V0IHN1cHBsaWVkIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgZXh0ZW5zaW9uIHBvaW50Ll0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc2NoZW1hL3dpemFyZFJlZ2lzdHJ5UHJvdmlkZXIuZXhzZCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc2NoZW1hL3dpemFyZFJlZ2lzdHJ5UHJvdmlkZXIuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWJlNjhlNS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NjaGVtYS93aXphcmRSZWdpc3RyeVByb3ZpZGVyLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMDUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aSI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aSIgaWQ9IndpemFyZFJlZ2lzdHJ5UHJvdmlkZXIiIG5hbWU9IldpemFyZCBSZWdpc3RlcnkgUHJvdmlkZXIiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIGRlc2NyaXB0aW9uIG9mIHRoaXMgZXh0ZW5zaW9uIHBvaW50Ll0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0id2l6YXJkUmVnaXN0cnkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9IndpemFyZFJlZ2lzdHJ5Ij4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJqYXZhIiBiYXNlZE9uPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLndpemFyZHMuSVdpemFyZFJlZ2lzdHJ5Ii8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciB0aGUgZmlyc3QgcmVsZWFzZSBpbiB3aGljaCB0aGlzIGV4dGVuc2lvbiBwb2ludCBhcHBlYXJzLl0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIGV4dGVuc2lvbiBwb2ludCB1c2FnZSBleGFtcGxlIGhlcmUuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBBUEkgaW5mb3JtYXRpb24gaGVyZS5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBpbmZvcm1hdGlvbiBhYm91dCBzdXBwbGllZCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGV4dGVuc2lvbiBwb2ludC5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotPC9zY2hlbWE+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9jb21tYW5kcy9DaGFuZ2VCb3VuZHNDb21tYW5kLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9jb21tYW5kcy9DaGFuZ2VCb3VuZHNDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4NGMyZWQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvY29tbWFuZHMvQ2hhbmdlQm91bmRzQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuY29tbWFuZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBDaGFuZ2VCb3VuZHNDb21tYW5kIGV4dGVuZHMgQ29tbWFuZCB7Ci0KLQlwcml2YXRlIE5vZGUgbm9kZTsKLQotCXByaXZhdGUgUG9pbnQgbmV3TG9jYXRpb24sIG9sZExvY2F0aW9uOwotCi0JcHJpdmF0ZSBpbnQgbmV3V2lkdGgsIG9sZFdpZHRoOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExBQkVMID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZ2VmX2NoYW5nZUJvdW5kc0NvbW1hbmRfbGFiZWw7IAotCi0JcHVibGljIENoYW5nZUJvdW5kc0NvbW1hbmQoTm9kZSBub2RlLCBQb2ludCBuZXdMb2NhdGlvbiwgaW50IG5ld1dpZHRoKSB7Ci0JCXN1cGVyKENoYW5nZUJvdW5kc0NvbW1hbmQuTEFCRUwpOwotCQlzZXROb2RlKG5vZGUpOwotCQlzZXROZXdMb2NhdGlvbihuZXdMb2NhdGlvbi5nZXRDb3B5KCkpOwotCQl0aGlzLm5ld1dpZHRoID0gbmV3V2lkdGg7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY2FuRXhlY3V0ZSgpIHsKLQkJcmV0dXJuIG5vZGUgIT0gbnVsbAotCQkJCSYmIG5ld0xvY2F0aW9uICE9IG51bGwKLQkJCQkmJiAobmV3V2lkdGggIT0gb2xkV2lkdGggfHwgIShub2RlLmdldExvY2F0aW9uKCkKLQkJCQkJCS5lcXVhbHMobmV3TG9jYXRpb24pKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJb2xkTG9jYXRpb24gPSBub2RlLmdldExvY2F0aW9uKCk7Ci0JCW9sZFdpZHRoID0gbm9kZS5nZXRXaWR0aCgpOwotCQlyZWRvKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVkbygpIHsKLQkJbm9kZS5zZXRMb2NhdGlvbihuZXdMb2NhdGlvbik7Ci0JCW5vZGUuc2V0V2lkdGgobmV3V2lkdGgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE5vZGUoTm9kZSBub2RlKSB7Ci0JCXRoaXMubm9kZSA9IG5vZGU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TmV3TG9jYXRpb24oUG9pbnQgbG9jKSB7Ci0JCW5ld0xvY2F0aW9uID0gbG9jOwotCX0KLQotCXB1YmxpYyB2b2lkIHVuZG8oKSB7Ci0JCW5vZGUuc2V0V2lkdGgob2xkV2lkdGgpOwotCQlub2RlLnNldExvY2F0aW9uKG9sZExvY2F0aW9uKTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9jb21tYW5kcy9DaGFuZ2VIZWlnaHRDb21tYW5kLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9jb21tYW5kcy9DaGFuZ2VIZWlnaHRDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4ZDQ5NTcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvY29tbWFuZHMvQ2hhbmdlSGVpZ2h0Q29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5jb21tYW5kczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotCi0vKioKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQ29tbWFuZCB0byBoYW5kbGUgTm9kZSdzIGhlaWdodCBjaGFuZ2VzLgotICogQ2hhbmdlQm91bmRzQ29tbWFuZCBoYW5kbGVzIE5vZGUncyB3aWR0aCBjaGFuZ2VzLiAKLSAqLwotcHVibGljIGNsYXNzIENoYW5nZUhlaWdodENvbW1hbmQgZXh0ZW5kcyBDb21tYW5kIHsKLQotCXByaXZhdGUgTm9kZSBub2RlOwotCi0JcHJpdmF0ZSBQb2ludCBuZXdMb2NhdGlvbiwgb2xkTG9jYXRpb247Ci0KLQlwcml2YXRlIGludCBuZXdIZWlnaHQsIG9sZEhlaWdodDsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMQUJFTCA9ICJDaGFuZ2UgSGVpZ2h0IENvbW1hbmQiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgQ2hhbmdlSGVpZ2h0Q29tbWFuZChOb2RlIG5vZGUsIFBvaW50IG5ld0xvY2F0aW9uLCBpbnQgbmV3SGVpZ2h0KSB7Ci0JCXN1cGVyKENoYW5nZUhlaWdodENvbW1hbmQuTEFCRUwpOwotCQlzZXROb2RlKG5vZGUpOwotCQlzZXROZXdMb2NhdGlvbihuZXdMb2NhdGlvbi5nZXRDb3B5KCkpOwotCQl0aGlzLm5ld0hlaWdodCA9IG5ld0hlaWdodDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjYW5FeGVjdXRlKCkgewotCQlyZXR1cm4gbm9kZSAhPSBudWxsCi0JCQkJJiYgbmV3TG9jYXRpb24gIT0gbnVsbAotCQkJCSYmIChuZXdIZWlnaHQgIT0gb2xkSGVpZ2h0IHx8ICEobm9kZS5nZXRMb2NhdGlvbigpCi0JCQkJCQkuZXF1YWxzKG5ld0xvY2F0aW9uKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCW9sZExvY2F0aW9uID0gbm9kZS5nZXRMb2NhdGlvbigpOwotCQlvbGRIZWlnaHQgPSBub2RlLmdldEhlaWdodCgpOwotCQlyZWRvKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVkbygpIHsKLQkJbm9kZS5zZXRMb2NhdGlvbihuZXdMb2NhdGlvbik7Ci0JCW5vZGUuc2V0SGVpZ2h0KG5ld0hlaWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Tm9kZShOb2RlIG5vZGUpIHsKLQkJdGhpcy5ub2RlID0gbm9kZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXROZXdMb2NhdGlvbihQb2ludCBsb2MpIHsKLQkJbmV3TG9jYXRpb24gPSBsb2M7Ci0JfQotCi0JcHVibGljIHZvaWQgdW5kbygpIHsKLQkJbm9kZS5zZXRIZWlnaHQob2xkSGVpZ2h0KTsKLQkJbm9kZS5zZXRMb2NhdGlvbihvbGRMb2NhdGlvbik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvY29tbWFuZHMvQ2hhbmdlTmFtZUNvbW1hbmQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2NvbW1hbmRzL0NoYW5nZU5hbWVDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwOTU2ZWUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvY29tbWFuZHMvQ2hhbmdlTmFtZUNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmNvbW1hbmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZWRpdC5OYW1lZE5vZGVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS51dGlsLk1zZ0RpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLlN0clV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTmFtZWROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIENoYW5nZU5hbWVDb21tYW5kIGV4dGVuZHMgQ29tbWFuZCB7Ci0KLQlwcml2YXRlIE5hbWVkTm9kZSBlbGVtZW50OwotCi0JcHJpdmF0ZSBTdHJpbmcgbmV3TmFtZSwgb2xkTmFtZTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMQUJFTCA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmdlZl9jaGFuZ2VOYW1lQ29tbWFuZF9sYWJlbDsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVU5ET19NRVNTQUdFID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZ2VmX2NoYW5nZU5hbWVDb21tYW5kX3VuZG9NZXNzYWdlOwotCi0JcHVibGljIENoYW5nZU5hbWVDb21tYW5kKE5hbWVkTm9kZSBlbGVtLCBTdHJpbmcgbmV3TmFtZSkgewotCQlzdXBlcihMQUJFTCk7Ci0JCWVsZW1lbnQgPSBlbGVtOwotCQlvbGROYW1lID0gZWxlbS5nZXROYW1lKCk7Ci0JCXRoaXMubmV3TmFtZSA9IG5ld05hbWUudHJpbSgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNhbkV4ZWN1dGUoKSB7Ci0JCXJldHVybiBlbGVtZW50ICE9IG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJZWxlbWVudC5zZXROYW1lKG5ld05hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHVuZG8oKSB7Ci0JCWlmICghU3RyVXRpbC5pc0JsYW5rKG9sZE5hbWUpKSB7Ci0JCQllbGVtZW50LnNldE5hbWUob2xkTmFtZSk7Ci0JCX0gZWxzZSB7Ci0JCQlEaXNwbGF5LmdldEN1cnJlbnQoKS5hc3luY0V4ZWMobmV3IFByb21wdEVkaXQobnVsbCwgVU5ET19NRVNTQUdFKSk7Ci0JCX0KLQl9Ci0KLQlzdGF0aWMgY2xhc3MgUHJvbXB0RWRpdCBpbXBsZW1lbnRzIFJ1bm5hYmxlIHsKLQkJCi0JCXByaXZhdGUgU3RyaW5nIG1zZzsKLQotCQlQcm9tcHRFZGl0KE5hbWVkTm9kZUVkaXRQYXJ0IHBhcnQsIFN0cmluZyBtc2cpIHsKLQkJCXRoaXMubXNnID0gbXNnOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBzZWUgamF2YS5sYW5nLlJ1bm5hYmxlI3J1bigpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQlTdHJpbmcgdGl0bGUgPSBBdXRob3JpbmdVSVJlc291cmNlcy53YXJuaW5nRGlhbG9nX3RpdGxlOwotCQkJTXNnRGlhbG9nIGRpYWxvZyA9IEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKTsKLQkJCWRpYWxvZy5kaXNwbGF5RXJyb3IodGl0bGUsIG1zZywgIiIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2NvbW1hbmRzL0NoYW5nZVByb3BlcnR5VmFsdWVDb21tYW5kLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9jb21tYW5kcy9DaGFuZ2VQcm9wZXJ0eVZhbHVlQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNDU0ZDE0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2NvbW1hbmRzL0NoYW5nZVByb3BlcnR5VmFsdWVDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5jb21tYW5kczsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZWRpdC5Ob2RlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvcGVydHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQ2hhbmdlUHJvcGVydHlWYWx1ZUNvbW1hbmQgZXh0ZW5kcyBDb21tYW5kIHsKLQotCXByaXZhdGUgTm9kZSBlbGVtZW50OwotCi0JcHJpdmF0ZSBOb2RlRWRpdFBhcnQgcGFydDsKLQotCXByaXZhdGUgU3RyaW5nIG5ld05hbWUsIG9sZE5hbWU7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEFCRUwgPSBBdXRob3JpbmdVSVJlc291cmNlcy5nZWZfY2hhbmdlUHJvcGVydHlWYWx1ZUNvbW1hbmRfbGFiZWw7IAotCi0JcHVibGljIENoYW5nZVByb3BlcnR5VmFsdWVDb21tYW5kKE5vZGVFZGl0UGFydCBlbGVtLCBTdHJpbmcgbmV3TmFtZSkgewotCQlzdXBlcihMQUJFTCk7Ci0JCXBhcnQgPSBlbGVtOwotCQllbGVtZW50ID0gKE5vZGUpIGVsZW0uZ2V0TW9kZWwoKTsKLQkJR3JhcGhOb2RlIGdyYXBoTm9kZSA9IGVsZW1lbnQuZ2V0R3JhcGhOb2RlKCk7Ci0JCUxpc3QgbGlzdCA9IGdyYXBoTm9kZS5nZXRQcm9wZXJ0eSgpOwotCQlvbGROYW1lID0gKChQcm9wZXJ0eSkgbGlzdC5nZXQoMCkpLmdldFZhbHVlKCk7Ci0JCXRoaXMubmV3TmFtZSA9IG5ld05hbWUudHJpbSgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNhbkV4ZWN1dGUoKSB7Ci0JCXJldHVybiBlbGVtZW50ICE9IG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJKChQcm9wZXJ0eSkgZWxlbWVudC5nZXRHcmFwaE5vZGUoKS5nZXRQcm9wZXJ0eSgpLmdldCgwKSkKLQkJCQkuc2V0VmFsdWUobmV3TmFtZSk7Ci0JCXBhcnQucmVmcmVzaCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHVuZG8oKSB7Ci0JCSgoUHJvcGVydHkpIGVsZW1lbnQuZ2V0R3JhcGhOb2RlKCkuZ2V0UHJvcGVydHkoKS5nZXQoMCkpCi0JCQkJLnNldFZhbHVlKG9sZE5hbWUpOwotCQlwYXJ0LnJlZnJlc2goKTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9jb21tYW5kcy9DcmVhdGVCZW5kcG9pbnRDb21tYW5kLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9jb21tYW5kcy9DcmVhdGVCZW5kcG9pbnRDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0NGMzMmEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvY29tbWFuZHMvQ3JlYXRlQmVuZHBvaW50Q29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuY29tbWFuZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuQWJzb2x1dGVCZW5kcG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQ3JlYXRlQmVuZHBvaW50Q29tbWFuZCBleHRlbmRzIENvbW1hbmQgewotCi0JcHJpdmF0ZSBMaW5rIGxpbms7Ci0KLQlwcml2YXRlIEFic29sdXRlQmVuZHBvaW50IHBvaW50OwotCi0JcHJpdmF0ZSBpbnQgaW5kZXggPSAtMTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMQUJFTCA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmdlZl9jcmVhdGVCZW5kcG9pbnRDb21tYW5kX2xhYmVsOyAKLQotCXB1YmxpYyBDcmVhdGVCZW5kcG9pbnRDb21tYW5kKExpbmsgbGluaywgUG9pbnQgbG9jYXRpb24sIGludCBpbmRleCkgewotCQlzdXBlcihMQUJFTCk7Ci0JCXRoaXMubGluayA9IGxpbms7Ci0JCXBvaW50ID0gbmV3IEFic29sdXRlQmVuZHBvaW50KGxvY2F0aW9uKTsKLQkJdGhpcy5pbmRleCA9IGluZGV4OwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNhbkV4ZWN1dGUoKSB7Ci0JCXJldHVybiBsaW5rICE9IG51bGwgJiYgcG9pbnQgIT0gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQlsaW5rLmdldEJlbmRwb2ludHMoKS5hZGQoaW5kZXgsIHBvaW50KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB1bmRvKCkgewotCQlsaW5rLmdldEJlbmRwb2ludHMoKS5yZW1vdmUoaW5kZXgpOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2NvbW1hbmRzL0NyZWF0ZUxpbmtDb21tYW5kLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9jb21tYW5kcy9DcmVhdGVMaW5rQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNWU0ZDAyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2NvbW1hbmRzL0NyZWF0ZUxpbmtDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuY29tbWFuZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuQWJzb2x1dGVCZW5kcG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLnV0aWwuVmFsaWRhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQ3JlYXRlTGlua0NvbW1hbmQgZXh0ZW5kcyBDb21tYW5kIHsKLQotCXByaXZhdGUgTGluayBsaW5rOwotCi0JcHJpdmF0ZSBOb2RlIHNvdXJjZSwgdGFyZ2V0OwotCi0JcHJpdmF0ZSBQb2ludCB0YXJnZXRFbmRQb2ludDsKLQotCXByaXZhdGUgUG9pbnQgc291cmNlRW5kUG9pbnQ7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEFCRUwgPSBBdXRob3JpbmdVSVJlc291cmNlcy5nZWZfY3JlYXRlTGlua0NvbW1hbmRfbGFiZWw7IAotCi0JcHVibGljIENyZWF0ZUxpbmtDb21tYW5kKExpbmsgbmV3T2JqLCBOb2RlIHNyYykgewotCQlzdXBlcihMQUJFTCk7Ci0JCWxpbmsgPSBuZXdPYmo7Ci0JCXNvdXJjZSA9IHNyYzsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjYW5FeGVjdXRlKCkgewotCQlib29sZWFuIHJlc3VsdCA9IHNvdXJjZSAhPSBudWxsICYmIHRhcmdldCAhPSBudWxsICYmIGxpbmsgIT0gbnVsbDsKLQkJaWYgKCFyZXN1bHQpCi0JCQlyZXR1cm4gcmVzdWx0OwotCi0JCVN0cmluZyBtc2cgPSBWYWxpZGF0aW9uLmNoZWNrQ29ubmVjdChzb3VyY2UsIHRhcmdldCwgbGluayk7Ci0JCWlmIChtc2cgIT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCWlmIChzb3VyY2UgPT0gdGFyZ2V0KSB7Ci0JCQlsaW5rLmdldEJlbmRwb2ludHMoKS5hZGQoCi0JCQkJCW5ldyBBYnNvbHV0ZUJlbmRwb2ludChzb3VyY2UuZ2V0TG9jYXRpb24oKS5nZXRUcmFuc2xhdGVkKAotCQkJCQkJCS0xMCwgMTApKSk7Ci0JCQlsaW5rLmdldEJlbmRwb2ludHMoKS5hZGQoCi0JCQkJCW5ldyBBYnNvbHV0ZUJlbmRwb2ludChzb3VyY2UuZ2V0TG9jYXRpb24oKS5nZXRUcmFuc2xhdGVkKAotCQkJCQkJCS0xMCwgLTEwKSkpOwotCQkJbGluay5nZXRCZW5kcG9pbnRzKCkuYWRkKAotCQkJCQluZXcgQWJzb2x1dGVCZW5kcG9pbnQoc291cmNlLmdldExvY2F0aW9uKCkuZ2V0VHJhbnNsYXRlZCgKLQkJCQkJCQkxMCwgLTEwKSkpOwotCQl9Ci0KLQkJbGluay5zZXRUYXJnZXRFbmRQb2ludCh0YXJnZXRFbmRQb2ludCk7Ci0JCWxpbmsuc2V0U291cmNlRW5kUG9pbnQoc291cmNlRW5kUG9pbnQpOwotCQlsaW5rLnNldFNvdXJjZShzb3VyY2UpOwotCQlsaW5rLnNldFRhcmdldCh0YXJnZXQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFRhcmdldChOb2RlIHRhcmdldCkgewotCQl0aGlzLnRhcmdldCA9IHRhcmdldDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRUYXJnZXRFbmRQb2ludChQb2ludCBwKSB7Ci0JCXRhcmdldEVuZFBvaW50ID0gcDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTb3VyY2VFbmRQb2ludChQb2ludCBwKSB7Ci0JCXNvdXJjZUVuZFBvaW50ID0gcDsKLQl9Ci0KLQlwdWJsaWMgUG9pbnQgZ2V0VGFyZ2V0RW5kUG9pbnQoKSB7Ci0JCXJldHVybiB0YXJnZXRFbmRQb2ludDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIHNvdXJjZUVuZFBvaW50LgotCSAqLwotCXB1YmxpYyBQb2ludCBnZXRTb3VyY2VFbmRQb2ludCgpIHsKLQkJcmV0dXJuIHNvdXJjZUVuZFBvaW50OwotCX0KLQotCXB1YmxpYyB2b2lkIHVuZG8oKSB7Ci0JCWxpbmsuc2V0U291cmNlRW5kUG9pbnQobnVsbCk7Ci0JCWxpbmsuc2V0VGFyZ2V0RW5kUG9pbnQobnVsbCk7Ci0JCWxpbmsuc2V0U291cmNlKG51bGwpOwotCQlsaW5rLnNldFRhcmdldChudWxsKTsKLQkJaWYgKHNvdXJjZSA9PSB0YXJnZXQpIHsKLQkJCWxpbmsuZ2V0QmVuZHBvaW50cygpLmNsZWFyKCk7Ci0JCX0KLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9jb21tYW5kcy9DcmVhdGVOb2RlQ29tbWFuZC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvY29tbWFuZHMvQ3JlYXRlTm9kZUNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjMwNzc4Ni4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9jb21tYW5kcy9DcmVhdGVOb2RlQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuY29tbWFuZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5EaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5hbWVkTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlOwotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBDcmVhdGVOb2RlQ29tbWFuZCBleHRlbmRzIERpYWdyYW1Nb2RpZnlDb21tYW5kIHsKLQotCXByaXZhdGUgUG9pbnQgbG9jOwotCi0JcHJpdmF0ZSBOb2RlIG5vZGU7Ci0KLQlwcml2YXRlIERpYWdyYW0gZGlhZ3JhbTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMQUJFTCA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmdlZl9jcmVhdGVOb2RlQ29tbWFuZF9sYWJlbDsgCi0KLQlwdWJsaWMgQ3JlYXRlTm9kZUNvbW1hbmQoTm9kZSBuZXdPYmplY3QsIERpYWdyYW0gcGFyZW50LCBQb2ludCBsb2NhdGlvbikgewotCQlzdXBlcihMQUJFTCk7Ci0JCW5vZGUgPSBuZXdPYmplY3Q7Ci0JCWRpYWdyYW0gPSBwYXJlbnQ7Ci0JCWxvYyA9IGxvY2F0aW9uLmdldENvcHkoKTsKLQkJc2V0RGlhZ3JhbShwYXJlbnQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHVuZG8oKSB7Ci0JCW5vZGUuc2V0TG9jYXRpb24obnVsbCk7Ci0JCW5vZGUuc2V0RGlhZ3JhbShudWxsKTsKLQkJZGlhZ3JhbS5nZXROb2RlcygpLnJlbW92ZShub2RlKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmNvbW1hbmRzLkRpYWdyYW1Nb2RpZnlDb21tYW5kI2RvRXhlY3V0ZSgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZG9FeGVjdXRlKCkgewotCQlub2RlLnNldExvY2F0aW9uKGxvYyk7Ci0JCW5vZGUuc2V0RGlhZ3JhbShkaWFncmFtKTsKLQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBOYW1lZE5vZGUpIHsKLQkJCWRpYWdyYW0uc2V0RGVmYXVsdE5hbWUoKE5hbWVkTm9kZSkgbm9kZSk7Ci0JCX0KLQkJZGlhZ3JhbS5nZXROb2RlcygpLmFkZChub2RlKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjYW5FeGVjdXRlKCkgewotCQlpZiAoZGlhZ3JhbSBpbnN0YW5jZW9mIERpYWdyYW0pIHsKLQkJCWlmIChkaWFncmFtLmlzUmVhZE9ubHkoKSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXIuY2FuRXhlY3V0ZSgpOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2NvbW1hbmRzL0RlbGV0ZUJlbmRwb2ludENvbW1hbmQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2NvbW1hbmRzL0RlbGV0ZUJlbmRwb2ludENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjgwMTYzNy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9jb21tYW5kcy9EZWxldGVCZW5kcG9pbnRDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5jb21tYW5kczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5BYnNvbHV0ZUJlbmRwb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIERlbGV0ZUJlbmRwb2ludENvbW1hbmQgZXh0ZW5kcyBDb21tYW5kIHsKLQotCXByaXZhdGUgTGluayBsaW5rOwotCi0JcHJpdmF0ZSBBYnNvbHV0ZUJlbmRwb2ludCBiZW5kcG9pbnQ7Ci0KLQlwcml2YXRlIGludCBpbmRleDsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMQUJFTCA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmdlZl9kZWxldGVCZW5kcG9pbnRDb21tYW5kX2xhYmVsOyAKLQotCXB1YmxpYyBEZWxldGVCZW5kcG9pbnRDb21tYW5kKExpbmsgbGluaywgaW50IGluZGV4KSB7Ci0JCXN1cGVyKExBQkVMKTsKLQkJdGhpcy5saW5rID0gbGluazsKLQkJdGhpcy5pbmRleCA9IGluZGV4OwotCQliZW5kcG9pbnQgPSBsaW5rLmdldEJlbmRwb2ludHMoKS5nZXQoaW5kZXgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNhbkV4ZWN1dGUoKSB7Ci0JCXJldHVybiBpbmRleCA+PSAwICYmIGJlbmRwb2ludCAhPSBudWxsICYmIGxpbmsgIT0gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQlsaW5rLmdldEJlbmRwb2ludHMoKS5yZW1vdmUoaW5kZXgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHVuZG8oKSB7Ci0JCWxpbmsuZ2V0QmVuZHBvaW50cygpLmFkZChpbmRleCwgYmVuZHBvaW50KTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9jb21tYW5kcy9EZWxldGVDb21tYW5kLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9jb21tYW5kcy9EZWxldGVDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhMzMzY2EuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvY29tbWFuZHMvRGVsZXRlQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmNvbW1hbmRzOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi51dGlsLlZhbGlkYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5MaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRGVsZXRlQ29tbWFuZCBleHRlbmRzIENvbW1hbmQgewotCi0JcHJpdmF0ZSBDb21tYW5kIGRlbGVnYXRlOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExBQkVMID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZ2VmX2RlbGV0ZUNvbW1hbmRfbGFiZWw7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1BFUk1fREVMRVRFID0gImdlZi5lZGlhZ3JhbS4kcGVybSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBEZWxldGVDb21tYW5kKGJvb2xlYW4gaGFyZERlbGV0ZSkgewotCQlzdXBlcihMQUJFTCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY2FuRXhlY3V0ZSgpIHsKLQkJcmV0dXJuIGRlbGVnYXRlICE9IG51bGwgJiYgZGVsZWdhdGUuY2FuRXhlY3V0ZSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCWRlbGVnYXRlLmV4ZWN1dGUoKTsKLQl9Ci0KLQlwdWJsaWMgQ29tbWFuZCBzZXRQYXJ0VG9CZURlbGV0ZWQoT2JqZWN0IG1vZGVsKSB7Ci0JCWlmIChtb2RlbCBpbnN0YW5jZW9mIE5vZGUpCi0JCQlkZWxlZ2F0ZSA9IG5ldyBEZWxldGVOb2RlQ29tbWFuZChtb2RlbCk7Ci0JCWVsc2UKLQkJCWRlbGVnYXRlID0gbnVsbDsKLQkJcmV0dXJuIHRoaXM7Ci0JfQotCi0JcHVibGljIHZvaWQgdW5kbygpIHsKLQkJZGVsZWdhdGUudW5kbygpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGNsYXNzIERlbGV0ZU5vZGVDb21tYW5kIGV4dGVuZHMgQ29tbWFuZCB7Ci0JCXByb3RlY3RlZCBNYXAgaW5jb21pbmdDb25uZWN0aW9uc1RvU291cmNlOwotCi0JCXByb3RlY3RlZCBNYXAgb3V0Z29pbmdDb25uZWN0aW9uc1RvVGFyZ2V0OwotCi0JCXByb3RlY3RlZCBOb2RlQ29udGFpbmVyIGNvbnRhaW5lcjsKLQotCQlwcm90ZWN0ZWQgTm9kZSBub2RlOwotCi0JCXByb3RlY3RlZCBpbnQgaW5kZXg7Ci0KLQkJcHVibGljIERlbGV0ZU5vZGVDb21tYW5kKE9iamVjdCBub2RlKSB7Ci0JCQl0aGlzLm5vZGUgPSAoTm9kZSkgbm9kZTsKLQkJCWNvbnRhaW5lciA9IChOb2RlQ29udGFpbmVyKSB0aGlzLm5vZGUuZUNvbnRhaW5lcigpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJCWluZGV4ID0gY29udGFpbmVyLmdldE5vZGVzKCkuaW5kZXhPZihub2RlKTsKLQkJCS8vIFRoZXJlJ3MgYWx3YXlzIHRoZSBwb3NzaWJpbGl0eSB0aGF0IHRoaXMgbm9kZSBoYXMgYWxyZWFkeSBiZWVuCi0JCQkvLyBkZWxldGVkIGJ5IHRoZSB0aW1lIHRoaXMgY29tbWFuZCBpcyBleGVjdXRlZCAoZWcuLCB3aGVuIHRoZQotCQkJLy8gcGFja2FnZSBjb250YWluaW5nIHRoaXMgY2xhc3MgaXMgYWxzbyBzZWxlY3RlZCkuIEhlbmNlLCB3ZSBjaGVjawotCQkJLy8gdG8gc2VlIGlmIHRoZSBub2RlIGV4aXN0cyBpbiB0aGUgZGlhZ3JhbS4gSWYgbm90LCBkbyBub3RoaW5nLgotCQkJaWYgKGluZGV4ID09IC0xKQotCQkJCXJldHVybjsKLQkJCWluY29taW5nQ29ubmVjdGlvbnNUb1NvdXJjZSA9IG5ldyBIYXNoTWFwKCk7Ci0JCQlvdXRnb2luZ0Nvbm5lY3Rpb25zVG9UYXJnZXQgPSBuZXcgSGFzaE1hcCgpOwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gbm9kZS5nZXRPdXRnb2luZ0Nvbm5lY3Rpb25zKCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCUxpbmsgbGluayA9IChMaW5rKSBpdGVyLm5leHQoKTsKLQkJCQlvdXRnb2luZ0Nvbm5lY3Rpb25zVG9UYXJnZXQucHV0KGxpbmssIGxpbmsuZ2V0VGFyZ2V0KCkpOwotCQkJCWxpbmsuc2V0VGFyZ2V0KG51bGwpOwotCQkJfQotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gbm9kZS5nZXRJbmNvbWluZ0Nvbm5lY3Rpb25zKCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCUxpbmsgbGluayA9IChMaW5rKSBpdGVyLm5leHQoKTsKLQkJCQlpbmNvbWluZ0Nvbm5lY3Rpb25zVG9Tb3VyY2UucHV0KGxpbmssIGxpbmsuZ2V0U291cmNlKCkpOwotCQkJCWxpbmsuc2V0U291cmNlKG51bGwpOwotCQkJfQotCQkJLy8gQ29tbWVudGluZyBiZWxvdyB0d28gbGluZXMsIExpbmtzIGdldCByZW1vdmVkIGZyb20gdGhlIG1vZGVsCi0JCQkvLyB3aGVuIGxpbmsuc2V0VGFyZ2V0KG51bGwpIG9yIGxpbmsuc2V0U291cmNlKG51bGwpIGlzIGRvbmUuICBGb3IgCi0JCQkvLyBOb2RlIGlmIHdlIGNsZWFyIGluY29taW5nL291dGdvaW5nIGNvbm5lY3Rpb25zLCBVbmRvIGNvbW1hbmQgd2lsbCBub3Qgd29yay4KLQkJCQotCQkJLy9ub2RlLmdldE91dGdvaW5nQ29ubmVjdGlvbnMoKS5jbGVhcigpOwotCQkJLy9ub2RlLmdldEluY29taW5nQ29ubmVjdGlvbnMoKS5jbGVhcigpOwotCQkJY29udGFpbmVyLmdldE5vZGVzKCkucmVtb3ZlKGluZGV4KTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHVuZG8oKSB7Ci0JCQlpZiAoaW5kZXggPT0gLTEpCi0JCQkJcmV0dXJuOwotCQkJY29udGFpbmVyLmdldE5vZGVzKCkuYWRkKGluZGV4LCBub2RlKTsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IG91dGdvaW5nQ29ubmVjdGlvbnNUb1RhcmdldC5rZXlTZXQoKQotCQkJCQkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJTGluayBsaW5rID0gKExpbmspIGl0ZXIubmV4dCgpOwotCQkJCWxpbmsuc2V0VGFyZ2V0KChOb2RlKSBvdXRnb2luZ0Nvbm5lY3Rpb25zVG9UYXJnZXQuZ2V0KGxpbmspKTsKLQkJCQlsaW5rLnNldFNvdXJjZShub2RlKTsKLQkJCX0KLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGluY29taW5nQ29ubmVjdGlvbnNUb1NvdXJjZS5rZXlTZXQoKQotCQkJCQkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJTGluayBsaW5rID0gKExpbmspIGl0ZXIubmV4dCgpOwotCQkJCWxpbmsuc2V0VGFyZ2V0KG5vZGUpOwotCQkJCWxpbmsuc2V0U291cmNlKChOb2RlKSBpbmNvbWluZ0Nvbm5lY3Rpb25zVG9Tb3VyY2UuZ2V0KGxpbmspKTsKLQkJCX0KLQkJCW91dGdvaW5nQ29ubmVjdGlvbnNUb1RhcmdldCA9IG51bGw7Ci0JCQlpbmNvbWluZ0Nvbm5lY3Rpb25zVG9Tb3VyY2UgPSBudWxsOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQjY2FuRXhlY3V0ZSgpCi0JCSAqLwotCQlwdWJsaWMgYm9vbGVhbiBjYW5FeGVjdXRlKCkgewotCQkJaWYgKFZhbGlkYXRpb24uY2hlY2tEZWxldGUobm9kZSkgIT0gbnVsbCkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlyZXR1cm4gc3VwZXIuY2FuRXhlY3V0ZSgpOwotCQl9Ci0JfQotCS8qCi0JICogTm90IGluIHVzZS4gTmVlZCBtb2RpZmljYXRpb24gZm9yIGZ1dHVyZSBmZWF0dXJlIGltcGxlbWVudGF0aW9ucy4gCi0JICogQ29tcG91bmQgQ29tbWFuZCBkZWxldGlvbiBkbyB0aGUgcmVjdXJzaXZlIGRlbGV0aW9uIGFuZCB1bmRvLiAKLQkgKi8KLS8vCXByaXZhdGUgc3RhdGljIGNsYXNzIERlbGV0ZU5vZGVDb21wb3VuZENvbW1hbmQgZXh0ZW5kcyBDb21wb3VuZENvbW1hbmQgewotLy8JCXByb3RlY3RlZCBNYXAgaW5jb21pbmdDb25uZWN0aW9uc1RvU291cmNlOwotLy8KLS8vCQlwcm90ZWN0ZWQgTWFwIG91dGdvaW5nQ29ubmVjdGlvbnNUb1RhcmdldDsKLS8vCi0vLwkJcHJvdGVjdGVkIE5vZGVDb250YWluZXIgY29udGFpbmVyOwotLy8KLS8vCQlwcm90ZWN0ZWQgTm9kZSBub2RlOwotLy8KLS8vCQlwcm90ZWN0ZWQgaW50IGluZGV4OwotLy8KLS8vCQlwdWJsaWMgRGVsZXRlTm9kZUNvbXBvdW5kQ29tbWFuZChPYmplY3Qgbm9kZSkgewotLy8JCQl0aGlzLm5vZGUgPSAoTm9kZSkgbm9kZTsKLS8vCQkJY29udGFpbmVyID0gKE5vZGVDb250YWluZXIpIHRoaXMubm9kZS5lQ29udGFpbmVyKCk7Ci0vLwkJCWluY29taW5nQ29ubmVjdGlvbnNUb1NvdXJjZSA9IG5ldyBIYXNoTWFwKCk7Ci0vLwkJCW91dGdvaW5nQ29ubmVjdGlvbnNUb1RhcmdldCA9IG5ldyBIYXNoTWFwKCk7Ci0vLwkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHRoaXMubm9kZS5nZXRPdXRnb2luZ0Nvbm5lY3Rpb25zKCkuaXRlcmF0b3IoKTsgaXRlcgotLy8JCQkJCS5oYXNOZXh0KCk7KSB7Ci0vLwkJCQlMaW5rIGxpbmsgPSAoTGluaykgaXRlci5uZXh0KCk7Ci0vLwkJCQlvdXRnb2luZ0Nvbm5lY3Rpb25zVG9UYXJnZXQucHV0KGxpbmssIGxpbmsuZ2V0VGFyZ2V0KCkpOwotLy8JCQkJYWRkKG5ldyBEZWxldGVMaW5rQ29tbWFuZCggbGluaywgZmFsc2UpKTsKLS8vCQkJfQotLy8JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB0aGlzLm5vZGUuZ2V0SW5jb21pbmdDb25uZWN0aW9ucygpLml0ZXJhdG9yKCk7IGl0ZXIKLS8vCQkJCQkuaGFzTmV4dCgpOykgewotLy8JCQkJTGluayBsaW5rID0gKExpbmspIGl0ZXIubmV4dCgpOwotLy8JCQkJaW5jb21pbmdDb25uZWN0aW9uc1RvU291cmNlLnB1dChsaW5rLCBsaW5rLmdldFNvdXJjZSgpKTsKLS8vCQkJCWFkZChuZXcgRGVsZXRlTGlua0NvbW1hbmQoIGxpbmssIGZhbHNlKSk7Ci0vLwkJCX0KLS8vCQl9Ci0vLwotLy8JCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0vLwkJCWluZGV4ID0gY29udGFpbmVyLmdldE5vZGVzKCkuaW5kZXhPZihub2RlKTsKLS8vCQkJLy8gVGhlcmUncyBhbHdheXMgdGhlIHBvc3NpYmlsaXR5IHRoYXQgdGhpcyBub2RlIGhhcyBhbHJlYWR5IGJlZW4KLS8vCQkJLy8gZGVsZXRlZCBieSB0aGUgdGltZSB0aGlzIGNvbW1hbmQgaXMgZXhlY3V0ZWQgKGVnLiwgd2hlbiB0aGUKLS8vCQkJLy8gcGFja2FnZSBjb250YWluaW5nIHRoaXMgY2xhc3MgaXMgYWxzbyBzZWxlY3RlZCkuIEhlbmNlLCB3ZSBjaGVjawotLy8JCQkvLyB0byBzZWUgaWYgdGhlIG5vZGUgZXhpc3RzIGluIHRoZSBkaWFncmFtLiBJZiBub3QsIGRvIG5vdGhpbmcuCi0vLwkJCWlmIChpbmRleCA9PSAtMSkKLS8vCQkJCXJldHVybjsKLS8vCi0vLwkJCXN1cGVyLmV4ZWN1dGUoKTsKLS8vCQkJY29udGFpbmVyLmdldE5vZGVzKCkucmVtb3ZlKGluZGV4KTsKLS8vCQkJCi0vLwkJfQotLy8KLS8vCQlwdWJsaWMgdm9pZCB1bmRvKCkgewotLy8JCQlpZiAoaW5kZXggPT0gLTEpCi0vLwkJCQlyZXR1cm47Ci0vLwkJCWNvbnRhaW5lci5nZXROb2RlcygpLmFkZChpbmRleCwgbm9kZSk7Ci0vLwkJCXN1cGVyLnVuZG8oKTsKLS8vCQl9Ci0vLwotLy8JCS8qKgotLy8JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQjY2FuRXhlY3V0ZSgpCi0vLwkJICovCi0vLwkJcHVibGljIGJvb2xlYW4gY2FuRXhlY3V0ZSgpIHsKLS8vCQkJaWYgKFZhbGlkYXRpb24uY2hlY2tEZWxldGUobm9kZSkgIT0gbnVsbCkKLS8vCQkJCXJldHVybiBmYWxzZTsKLS8vCQkJcmV0dXJuIHN1cGVyLmNhbkV4ZWN1dGUoKTsKLS8vCQl9Ci0vLwl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9jb21tYW5kcy9EZWxldGVMaW5rQ29tbWFuZC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvY29tbWFuZHMvRGVsZXRlTGlua0NvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjEwY2ZmYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9jb21tYW5kcy9EZWxldGVMaW5rQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuY29tbWFuZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi51dGlsLlZhbGlkYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5MaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIERlbGV0ZUxpbmtDb21tYW5kIGV4dGVuZHMgQ29tbWFuZCB7Ci0KLQlwcml2YXRlIExpbmsgbGluazsKLQotCXByaXZhdGUgTm9kZSBzcmMsIHRhcmdldDsKLQotCXByaXZhdGUgaW50IHNyY0luZGV4LCB0YXJnZXRJbmRleDsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMQUJFTCA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmdlZl9kZWxldGVMaW5rQ29tbWFuZF9sYWJlbDsgCi0KLQlwdWJsaWMgRGVsZXRlTGlua0NvbW1hbmQoTGluayBsaW5rLCBib29sZWFuIGlzSGFyZERlbGV0ZSkgewotCQlzdXBlcihMQUJFTCk7Ci0JCXRoaXMubGluayA9IGxpbms7Ci0JCXNyYyA9IGxpbmsuZ2V0U291cmNlKCk7Ci0JCXRhcmdldCA9IGxpbmsuZ2V0VGFyZ2V0KCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY2FuRXhlY3V0ZSgpIHsKLQkJaWYgKFZhbGlkYXRpb24uY2hlY2tEZWxldGUobGluaykgIT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIGxpbmsgIT0gbnVsbCAmJiBzcmMgIT0gbnVsbCAmJiB0YXJnZXQgIT0gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIFRoaXMgc2hvdWxkIHdvcmsgZXZlbiBpZiB0aGUgbGluayAodmlldykgd2FzIGRlbGV0ZWQuIEVnLiwgdXNlciBzZWxlY3RzIGEKLQkgKiBjbGFzcyBhbmQgb25lIG9mIGl0cyByZWZlcmVuY2VzLCBhbmQgaGl0cyBDdHJsK0RlbC4gVGhlIGNsYXNzIHdpbGwgYmUKLQkgKiBkZWxldGVkIGZpcnN0IGFuZCBpdCB3aWxsIGRlbGV0ZSBhbGwgaXRzIHJlZmVyZW5jZXMuIFdoZW4gdGhpcyBjb21tYW5kIGlzCi0JICogZXhlY3V0ZWQsIGl0IHNob3VsZCBkbyB0aGUgaGFyZC1kZWxldGUgcGFydC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQlzcmNJbmRleCA9IHNyYy5nZXRPdXRnb2luZ0Nvbm5lY3Rpb25zKCkuaW5kZXhPZihsaW5rKTsKLQkJdGFyZ2V0SW5kZXggPSB0YXJnZXQuZ2V0SW5jb21pbmdDb25uZWN0aW9ucygpLmluZGV4T2YobGluayk7Ci0JCWlmIChzcmNJbmRleCAhPSAtMSAmJiB0YXJnZXRJbmRleCAhPSAtMSkgewotCQkJc3JjLmdldE91dGdvaW5nQ29ubmVjdGlvbnMoKS5yZW1vdmUoc3JjSW5kZXgpOwotCQkJdGFyZ2V0LmdldEluY29taW5nQ29ubmVjdGlvbnMoKS5yZW1vdmUodGFyZ2V0SW5kZXgpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdW5kbygpIHsKLQkJaWYgKHNyY0luZGV4ICE9IC0xICYmIHRhcmdldEluZGV4ICE9IC0xKSB7Ci0JCQlzcmMuZ2V0T3V0Z29pbmdDb25uZWN0aW9ucygpLmFkZChzcmNJbmRleCwgbGluayk7Ci0JCQl0YXJnZXQuZ2V0SW5jb21pbmdDb25uZWN0aW9ucygpLmFkZCh0YXJnZXRJbmRleCwgbGluayk7Ci0JCX0KLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9jb21tYW5kcy9EaWFncmFtTW9kaWZ5Q29tbWFuZC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvY29tbWFuZHMvRGlhZ3JhbU1vZGlmeUNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTVmMTZiZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9jb21tYW5kcy9EaWFncmFtTW9kaWZ5Q29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuY29tbWFuZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi51dGlsLkRpYWdyYW1VSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udWkudXRpbC5Nc2dCb3g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuRGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnVpLlVzZXJJbnRlcmFjdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgRGlhZ3JhbU1vZGlmeUNvbW1hbmQgZXh0ZW5kcyBDb21tYW5kIHsKLQotCXByaXZhdGUgRU9iamVjdCBvYmplY3Q7Ci0KLQlwcml2YXRlIGJvb2xlYW4gY2FuVW5kbyA9IHRydWU7Ci0KLQlwdWJsaWMgRGlhZ3JhbU1vZGlmeUNvbW1hbmQoU3RyaW5nIGxhYmVsKSB7Ci0JCXN1cGVyKGxhYmVsKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXREaWFncmFtKERpYWdyYW0gZGlhZ3JhbSkgewotCQlPYmplY3Qgb2JqID0gZGlhZ3JhbS5nZXRPYmplY3QoKTsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIEVPYmplY3QpIHsKLQkJCW9iamVjdCA9IChFT2JqZWN0KSBvYmo7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBwcmVwYXJlRXhlY3V0ZSgpIHsKLQkJSVN0YXR1cyBzdGF0dXMgPSBVc2VySW50ZXJhY3Rpb25IZWxwZXIuY2hlY2tNb2RpZnkob2JqZWN0LCBNc2dCb3guZ2V0RGVmYXVsdFNoZWxsKCkpOwotCQlpZiAoc3RhdHVzLmlzT0soKSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0gZWxzZSB7Ci0JCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkKLQkJCQkJLmRpc3BsYXlXYXJuaW5nKAotCQkJCQkJCURpYWdyYW1VSVJlc291cmNlcy5lcnJvckRpYWxvZ190aXRsZSwgCi0JCQkJCQkJRGlhZ3JhbVVJUmVzb3VyY2VzLmNvbW1hbmRfY2Fubm90RWRpdCwgCi0JCQkJCQkJc3RhdHVzKTsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQjZXhlY3V0ZSgpCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJaWYgKHByZXBhcmVFeGVjdXRlKCkpIHsKLQkJCWRvRXhlY3V0ZSgpOwotCQkJY2FuVW5kbyA9IHRydWU7Ci0JCX0gZWxzZSB7Ci0JCQljYW5VbmRvID0gZmFsc2U7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kI2NhblVuZG8oKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGNhblVuZG8oKSB7Ci0JCXJldHVybiBjYW5VbmRvOwotCX0KLQotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGRvRXhlY3V0ZSgpOwotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9jb21tYW5kcy9Nb3ZlQmVuZHBvaW50Q29tbWFuZC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvY29tbWFuZHMvTW92ZUJlbmRwb2ludENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTBiNzVjMS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9jb21tYW5kcy9Nb3ZlQmVuZHBvaW50Q29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuY29tbWFuZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuQWJzb2x1dGVCZW5kcG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLQotLyoqCi0gKiBCZW5kcG9pbnQgbWFuaXB1bGF0aW9uIGNvbW1hbmRzIGNhbm5vdCBiZSBjaGFpbmVkIG9yIGNvbXBvdW5kZWQuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBNb3ZlQmVuZHBvaW50Q29tbWFuZCBleHRlbmRzIENvbW1hbmQgewotCi0JcHJpdmF0ZSBMaW5rIGxpbms7Ci0KLQlwcml2YXRlIGludCBpbmRleDsKLQotCXByaXZhdGUgQWJzb2x1dGVCZW5kcG9pbnQgb2xkQmVuZHBvaW50OwotCi0JQWJzb2x1dGVCZW5kcG9pbnQgbmV3QmVuZHBvaW50OwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExBQkVMID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZ2VmX21vdmVCZW5kcG9pbnRDb21tYW5kX2xhYmVsOyAKLQotCXB1YmxpYyBNb3ZlQmVuZHBvaW50Q29tbWFuZChMaW5rIGxpbmssIFBvaW50IGxvY2F0aW9uLCBpbnQgaW5kZXgpIHsKLQkJc3VwZXIoTEFCRUwpOwotCQl0aGlzLmxpbmsgPSBsaW5rOwotCQl0aGlzLmluZGV4ID0gaW5kZXg7Ci0JCW5ld0JlbmRwb2ludCA9IG5ldyBBYnNvbHV0ZUJlbmRwb2ludChsb2NhdGlvbik7Ci0JCW9sZEJlbmRwb2ludCA9IGxpbmsuZ2V0QmVuZHBvaW50cygpLmdldChpbmRleCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY2FuRXhlY3V0ZSgpIHsKLQkJcmV0dXJuIGxpbmsgIT0gbnVsbCAmJiBpbmRleCA+PSAwICYmIG5ld0JlbmRwb2ludCAhPSBudWxsCi0JCQkJJiYgb2xkQmVuZHBvaW50ICE9IG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJbGluay5nZXRCZW5kcG9pbnRzKCkuc2V0KGluZGV4LCBuZXdCZW5kcG9pbnQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHVuZG8oKSB7Ci0JCWxpbmsuZ2V0QmVuZHBvaW50cygpLnNldChpbmRleCwgb2xkQmVuZHBvaW50KTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9jb21tYW5kcy9SZWNvbm5lY3RMaW5rQ29tbWFuZC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvY29tbWFuZHMvUmVjb25uZWN0TGlua0NvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDQ5MzI5Zi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9jb21tYW5kcy9SZWNvbm5lY3RMaW5rQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuY29tbWFuZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYudXRpbC5WYWxpZGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMy4xCi0gKi8KLXB1YmxpYyBjbGFzcyBSZWNvbm5lY3RMaW5rQ29tbWFuZCBleHRlbmRzIENvbW1hbmQgewotCi0JcHJpdmF0ZSBib29sZWFuIGlzU291cmNlOwotCi0JcHJpdmF0ZSBMaW5rIGxpbms7Ci0KLQlwcml2YXRlIE5vZGUgbmV3Tm9kZSwgb2xkTm9kZTsKLQotCXByaXZhdGUgaW50IHZpZXdJbmRleDsKLQotCXByaXZhdGUgUG9pbnQgZW5kUG9pbnQ7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEFCRUwgPSBBdXRob3JpbmdVSVJlc291cmNlcy5nZWZfcmVjb25uZWN0TGlua0NvbW1hbmRfbGFiZWw7IAotCi0JcHVibGljIFJlY29ubmVjdExpbmtDb21tYW5kKExpbmsgbGluaywgTm9kZSBuZXdOb2RlLCBib29sZWFuIGlzU291cmNlKSB7Ci0JCXN1cGVyKExBQkVMKTsKLQkJdGhpcy5saW5rID0gbGluazsKLQkJdGhpcy5uZXdOb2RlID0gbmV3Tm9kZTsKLQkJdGhpcy5pc1NvdXJjZSA9IGlzU291cmNlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEVuZFBvaW50KFBvaW50IHApIHsKLQkJZW5kUG9pbnQgPSBwLmdldENvcHkoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjYW5FeGVjdXRlKCkgewotCQlib29sZWFuIHJlc3VsdCA9IGxpbmsgIT0gbnVsbCAmJiBuZXdOb2RlICE9IG51bGw7Ci0JCWlmICghcmVzdWx0KSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJaWYgKGlzU291cmNlKSB7Ci0JCQlyZXR1cm4gVmFsaWRhdGlvbi5jaGVja1JlY29ubmVjdChuZXdOb2RlLCBsaW5rLmdldFRhcmdldCgpLCBsaW5rKSA9PSBudWxsOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIFZhbGlkYXRpb24uY2hlY2tSZWNvbm5lY3QobGluay5nZXRTb3VyY2UoKSwgbmV3Tm9kZSwgbGluaykgPT0gbnVsbDsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0KLQkJLy8gTGluawotCQlpZiAoaXNTb3VyY2UpIHsKLQkJCW9sZE5vZGUgPSBsaW5rLmdldFNvdXJjZSgpOwotCQkJaWYgKG9sZE5vZGUgIT0gbnVsbCkgeyAvLyBzYWZldHkgY2hlY2sgdG8gaGFuZGxlIGRhbmdsaW5nIGxpbmsKLQkJCQl2aWV3SW5kZXggPSBvbGROb2RlLmdldE91dGdvaW5nQ29ubmVjdGlvbnMoKS5pbmRleE9mKGxpbmspOwotCQkJfQotCQkJbGluay5zZXRTb3VyY2UobmV3Tm9kZSk7Ci0JCQlsaW5rLnNldFNvdXJjZUVuZFBvaW50KGVuZFBvaW50KTsKLQkJfSBlbHNlIHsKLQkJCW9sZE5vZGUgPSBsaW5rLmdldFRhcmdldCgpOwotCQkJaWYgKG9sZE5vZGUgIT0gbnVsbCkgeyAvLyBzYWZldHkgY2hlY2sgdG8gaGFuZGxlIGRhbmdsaW5nIGxpbmsKLQkJCQl2aWV3SW5kZXggPSBvbGROb2RlLmdldEluY29taW5nQ29ubmVjdGlvbnMoKS5pbmRleE9mKGxpbmspOwotCQkJfQotCQkJbGluay5zZXRUYXJnZXQobmV3Tm9kZSk7Ci0JCQlsaW5rLnNldFRhcmdldEVuZFBvaW50KGVuZFBvaW50KTsKLQkJfQotCi0JfQotCi0JcHVibGljIHZvaWQgdW5kbygpIHsKLQkJaWYgKGlzU291cmNlKSB7Ci0JCQluZXdOb2RlLmdldE91dGdvaW5nQ29ubmVjdGlvbnMoKS5yZW1vdmUobGluayk7Ci0JCQlvbGROb2RlLmdldE91dGdvaW5nQ29ubmVjdGlvbnMoKS5hZGQodmlld0luZGV4LCBsaW5rKTsKLQkJfSBlbHNlIHsKLQkJCW5ld05vZGUuZ2V0SW5jb21pbmdDb25uZWN0aW9ucygpLnJlbW92ZShsaW5rKTsKLQkJCW9sZE5vZGUuZ2V0SW5jb21pbmdDb25uZWN0aW9ucygpLmFkZCh2aWV3SW5kZXgsIGxpbmspOwotCQl9Ci0JCW9sZE5vZGUgPSBudWxsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvY29tbWFuZHMvUmVmcmVzaERpYWdyYW1Gcm9tQmFzZUFjdGl2aXR5Q29tbWFuZC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvY29tbWFuZHMvUmVmcmVzaERpYWdyYW1Gcm9tQmFzZUFjdGl2aXR5Q29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZTM1NjUzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2NvbW1hbmRzL1JlZnJlc2hEaWFncmFtRnJvbUJhc2VBY3Rpdml0eUNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmNvbW1hbmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYudXRpbC5EaWFncmFtVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFJlZnJlc2hEaWFncmFtRnJvbUJhc2VBY3Rpdml0eUNvbW1hbmQgZXh0ZW5kcyBDb21tYW5kIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMQUJFTCA9IERpYWdyYW1VSVJlc291cmNlcy5yZWZyZXNoRnJvbUJhc2VDbWRfbGFiZWw7IAotCi0JcHVibGljIFJlZnJlc2hEaWFncmFtRnJvbUJhc2VBY3Rpdml0eUNvbW1hbmQoKSB7Ci0JCXN1cGVyKExBQkVMKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2NvbW1hbmRzL3BhY2thZ2UuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2NvbW1hbmRzL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGNlMmQ3Yi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9jb21tYW5kcy9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyBjb21tYW5kcyBmb3IgZWRpdGluZyB0aGUgYWN0aXZpdHkgZGlhZ3JhbXMuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9BY3Rpdml0eURldGFpbERpYWdyYW1FZGl0UGFydC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9BY3Rpdml0eURldGFpbERpYWdyYW1FZGl0UGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MDUwNDM2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdFBhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyMSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuRGltZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5BY3Rpdml0eURldGFpbERpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5UYXNrTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Xb3JrUHJvZHVjdENvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Xb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5HcmFwaGljYWxFZGl0UGFydDsKLQotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBzaW5jZSAxLjAKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdFBhcnQgZXh0ZW5kcyBEaWFncmFtRWRpdFBhcnQgewotCi0JaW50IHkgPSA2MDsKLQotCWJvb2xlYW4geGF4aXNiZWdpbiA9IGZhbHNlOwotCi0JYm9vbGVhbiBsb2FkaW5nID0gdHJ1ZTsKLQotCWZpbmFsIHN0YXRpYyBpbnQgc3BhY2luZyA9IDQwOwotCi0JZmluYWwgc3RhdGljIGludCB5c3BhY2luZyA9IDIwOwotCi0JYm9vbGVhbiBtaXNjZWxsYW5lb3VzID0gZmFsc2U7Ci0KLQlpbnQgeCA9IDEwOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1VUUFVUUyA9ICJvdXRwdXRzIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5QVVRTID0gImlucHV0cyI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgTGlzdCByZWNlbnRseUFkZGVkUGFydHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkvKiogCi0JICogRWRpdFBhcnQgZm9yIEFjdGl2aXR5RGV0YWlsRGlhZ3JhbS4KLQkgKi8KLQlwdWJsaWMgQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdFBhcnQoQWN0aXZpdHlEZXRhaWxEaWFncmFtIG1vZGVsKSB7Ci0JCXN1cGVyKG1vZGVsKTsKLQl9Ci0KLQkvKioKLQkgKiBPdmVycmlkZSBtZXRob2Qgc3VwZXIucmVzZXRDaGlsZHJlbkxvY2F0aW9ucy4gSW4gdGhpcywgQWxsIHRoZSBUYXNrJ3MKLQkgKiBNYW5kYXRvcnlJbnB1dCB3b3JrcHJvZHVjdHMgcGxhY2VkIG9uIHRvcC4gYW5kIFJvbGVUYXNrIGNvbXBvc2l0ZSBpbiB0aGUKLQkgKiBtaWRkbGUuIGFuZCBUYXNrJ3Mgb3V0cHV0IHdvcmtwcm9kdWN0cyBzb3V0aC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZXNldENoaWxkcmVuTG9jYXRpb25zKCkgewotCQlmaW5hbCBpbnQgeXNwYWNpbmcgPSA0MDsKLQkJTGlzdCByb2xlY29tcG9zaXRlTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJTGlzdCBpbnB1dHdvcmtwcm9kdWN0Q29tcG9zaXRlTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJTGlzdCBvdXRwdXRXb3JrUHJvZHVjdENvbXBvc2l0ZUxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUxpc3QgbWlzY0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUxpc3QgdGFza0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXRoaXMucmVjZW50bHlBZGRlZFBhcnRzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCUhhc2hNYXAgbWFwID0gbmV3IEhhc2hNYXAoKTsKLQotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBnZXRDaGlsZHJlbigpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGNoaWxkID0gaXRlci5uZXh0KCk7Ci0JCQlOb2RlIG4gPSAoTm9kZSkgKChFZGl0UGFydCkgY2hpbGQpLmdldE1vZGVsKCk7Ci0JCQlpZiAobi5nZXRMb2NhdGlvbigpID09IG51bGwgfHwgbi5nZXRMb2NhdGlvbigpLnggPT0gLTEpIHsKLQkJCQl0aGlzLnJlY2VudGx5QWRkZWRQYXJ0cy5hZGQoY2hpbGQpOwotCQkJfQotCQkJaWYgKGNoaWxkIGluc3RhbmNlb2YgUm9sZVRhc2tDb21wb3NpdGVFZGl0UGFydCkgewotCQkJCXJvbGVjb21wb3NpdGVMaXN0LmFkZChjaGlsZCk7Ci0JCQkJTGlzdCBsaXN0ID0gKChSb2xlVGFza0NvbXBvc2l0ZUVkaXRQYXJ0KSBjaGlsZCkuZ2V0Q2hpbGRyZW4oKTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ID0gbGlzdC5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJCU9iamVjdCBvYmogPSBpdC5uZXh0KCk7Ci0JCQkJCU5vZGUgb2JqTm9kZSA9IChOb2RlKSAoKE5vZGVFZGl0UGFydCkgb2JqKS5nZXRNb2RlbCgpOwotCQkJCQlpZiAob2JqTm9kZSBpbnN0YW5jZW9mIFRhc2tOb2RlKSB7Ci0JCQkJCQl0YXNrTGlzdC5hZGQob2JqTm9kZSk7Ci0JCQkJCQlIYXNoTWFwIHRhc2tNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQkJCQkJTGlzdCBpbnB1dExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCQlMaXN0IG91dHB1dExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCQl0YXNrTWFwLnB1dCgiaW5wdXRzIiwgaW5wdXRMaXN0KTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJdGFza01hcC5wdXQoIm91dHB1dHMiLCBvdXRwdXRMaXN0KTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJbWFwLnB1dChvYmpOb2RlLCB0YXNrTWFwKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0gZWxzZSBpZiAoY2hpbGQgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdENvbXBvc2l0ZUVkaXRQYXJ0KSB7Ci0JCQkJR3JhcGhpY2FsRWRpdFBhcnQgcGFydCA9IChHcmFwaGljYWxFZGl0UGFydCkgY2hpbGQ7Ci0JCQkJaWYgKHBhcnQuZ2V0TW9kZWwoKSBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0Q29tcG9zaXRlKSB7Ci0JCQkJCVdvcmtQcm9kdWN0Q29tcG9zaXRlIG5vZGUgPSAoV29ya1Byb2R1Y3RDb21wb3NpdGUpIHBhcnQKLQkJCQkJCQkuZ2V0TW9kZWwoKTsKLQkJCQkJaWYgKG5vZGUuZ2V0VHlwZSgpID09IFdvcmtQcm9kdWN0Q29tcG9zaXRlLklOUFVUUykgewotCQkJCQkJaW5wdXR3b3JrcHJvZHVjdENvbXBvc2l0ZUxpc3QuYWRkKGNoaWxkKTsKLQkJCQkJfSBlbHNlIGlmIChub2RlLmdldFR5cGUoKSA9PSBXb3JrUHJvZHVjdENvbXBvc2l0ZS5PVVRQVVRTKSB7Ci0JCQkJCQlvdXRwdXRXb3JrUHJvZHVjdENvbXBvc2l0ZUxpc3QuYWRkKGNoaWxkKTsKLQkJCQkJfQotCQkJCQljYWxjU2l6ZShjaGlsZCk7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQltaXNjTGlzdC5hZGQoY2hpbGQpOwotCQkJfQotCQl9Ci0KLQkJLy8gU2V0IHNpemUgZm9yIHRoZSByb2xlY29tcG9zaXRlLgotCQlpZiAoIXJvbGVjb21wb3NpdGVMaXN0LmlzRW1wdHkoKSkgewotCQkJZm9yIChJdGVyYXRvciBpdG9yID0gcm9sZWNvbXBvc2l0ZUxpc3QuaXRlcmF0b3IoKTsgaXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IG9iamVjdCA9IGl0b3IubmV4dCgpOwotCQkJCUxpc3QgbGlzdCA9ICgoUm9sZVRhc2tDb21wb3NpdGVFZGl0UGFydCkgb2JqZWN0KS5nZXRDaGlsZHJlbigpOwotCQkJCWZvciAoSXRlcmF0b3IgaXRvcjEgPSBsaXN0Lml0ZXJhdG9yKCk7IGl0b3IxLmhhc05leHQoKTspIHsKLQkJCQkJT2JqZWN0IG9iaiA9IGl0b3IxLm5leHQoKTsKLQkJCQkJaWYgKG9iaiBpbnN0YW5jZW9mIERlc2NyaXB0b3JOb2RlRWRpdFBhcnQpIHsKLQkJCQkJCWlmICgoKERlc2NyaXB0b3JOb2RlRWRpdFBhcnQpIG9iaikuZ2V0TW9kZWwoKSBpbnN0YW5jZW9mIFRhc2tOb2RlKSB7Ci0JCQkJCQkJVGFza05vZGUgdGFza05vZGUgPSAoVGFza05vZGUpICgoRGVzY3JpcHRvck5vZGVFZGl0UGFydCkgb2JqKQotCQkJCQkJCQkJLmdldE1vZGVsKCk7Ci0JCQkJCQkJVGFza0Rlc2NyaXB0b3IgdGFzayA9IChUYXNrRGVzY3JpcHRvcikgdGFza05vZGUKLQkJCQkJCQkJCS5nZXRPYmplY3QoKTsKLQkJCQkJCQlmb3IgKEl0ZXJhdG9yIHdwaXRvciA9IGlucHV0d29ya3Byb2R1Y3RDb21wb3NpdGVMaXN0Ci0JCQkJCQkJCQkuaXRlcmF0b3IoKTsgd3BpdG9yLmhhc05leHQoKTspIHsKLQkJCQkJCQkJV29ya1Byb2R1Y3RDb21wb3NpdGVFZGl0UGFydCB3cEVkaXRQYXJ0ID0gKFdvcmtQcm9kdWN0Q29tcG9zaXRlRWRpdFBhcnQpIHdwaXRvcgotCQkJCQkJCQkJCS5uZXh0KCk7Ci0JCQkJCQkJCVdvcmtQcm9kdWN0Q29tcG9zaXRlIHdwQ29tcG9zaXRlTm9kZSA9IChXb3JrUHJvZHVjdENvbXBvc2l0ZSkgd3BFZGl0UGFydAotCQkJCQkJCQkJCS5nZXRNb2RlbCgpOwotCQkJCQkJCQlPYmplY3Qgd3BPYmplY3QgPSB3cENvbXBvc2l0ZU5vZGUuZ2V0T2JqZWN0KCk7Ci0JCQkJCQkJCWlmICh3cE9iamVjdC5lcXVhbHModGFzaykpIHsKLQkJCQkJCQkJCWludCB3aWR0aCA9IHdwRWRpdFBhcnQuZ2V0RmlndXJlKCkKLQkJCQkJCQkJCQkJLmdldFByZWZlcnJlZFNpemUoKS53aWR0aDsKLQkJCQkJCQkJCWludCBoZWlnaHQgPSAoKERlc2NyaXB0b3JOb2RlRWRpdFBhcnQpIG9iaikKLQkJCQkJCQkJCQkJLmdldEZpZ3VyZSgpLmdldFByZWZlcnJlZFNpemUoKS5oZWlnaHQ7Ci0JCQkJCQkJCQkoKERlc2NyaXB0b3JOb2RlRWRpdFBhcnQpIG9iaikKLQkJCQkJCQkJCQkJLmdldEZpZ3VyZSgpCi0JCQkJCQkJCQkJCS5zZXRQcmVmZXJyZWRTaXplKAotCQkJCQkJCQkJCQkJCW5ldyBEaW1lbnNpb24od2lkdGgsIGhlaWdodCkpOwotCQkJCQkJCQkJaWYgKCgoV29ya1Byb2R1Y3RDb21wb3NpdGUpIHdwRWRpdFBhcnQKLQkJCQkJCQkJCQkJLmdldE1vZGVsKCkpLmdldFR5cGUoKSA9PSBXb3JrUHJvZHVjdENvbXBvc2l0ZS5JTlBVVFMpIHsKLQkJCQkJCQkJCQlMaXN0IGlucHV0TGlzdCA9IChMaXN0KSAoKEhhc2hNYXApIG1hcAotCQkJCQkJCQkJCQkJLmdldCh0YXNrTm9kZSkpLmdldChJTlBVVFMpOwotCQkJCQkJCQkJCWlucHV0TGlzdC5hZGQod3BFZGl0UGFydCk7Ci0JCQkJCQkJCQl9IGVsc2UgaWYgKCgoV29ya1Byb2R1Y3RDb21wb3NpdGUpIHdwRWRpdFBhcnQKLQkJCQkJCQkJCQkJLmdldE1vZGVsKCkpLmdldFR5cGUoKSA9PSBXb3JrUHJvZHVjdENvbXBvc2l0ZS5PVVRQVVRTKSB7Ci0JCQkJCQkJCQkJTGlzdCBvdXRwdXRMaXN0ID0gKExpc3QpICgoSGFzaE1hcCkgbWFwCi0JCQkJCQkJCQkJCQkuZ2V0KHRhc2tOb2RlKSkuZ2V0KE9VVFBVVFMpOwotCQkJCQkJCQkJCW91dHB1dExpc3QuYWRkKHdwRWRpdFBhcnQpOwotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJaWYgKCFyb2xlY29tcG9zaXRlTGlzdC5pc0VtcHR5KCkpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcm9sZWNvbXBvc2l0ZUxpc3Quc2l6ZSgpOyBpKyspIHsKLQkJCQlMaXN0IGNvbmZpcm1lZFNlcUlucHV0TGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQlMaXN0IGNvbmZpcm1lZFNlcU91dHB1dExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJTGlzdCBsaXN0ID0gKChSb2xlVGFza0NvbXBvc2l0ZUVkaXRQYXJ0KSByb2xlY29tcG9zaXRlTGlzdAotCQkJCQkJLmdldChpKSkuZ2V0Q2hpbGRyZW4oKTsKLQkJCQlmb3IgKGludCBqID0gMDsgaiA8IGxpc3Quc2l6ZSgpOyBqKyspIHsKLQkJCQkJRGVzY3JpcHRvck5vZGVFZGl0UGFydCB0YXNrID0gKERlc2NyaXB0b3JOb2RlRWRpdFBhcnQpIGxpc3QKLQkJCQkJCQkuZ2V0KGopOwotCQkJCQlpZiAodGFzay5nZXRNb2RlbCgpIGluc3RhbmNlb2YgVGFza05vZGUpIHsKLQkJCQkJCVRhc2tOb2RlIHRhc2tub2RlID0gKFRhc2tOb2RlKSB0YXNrLmdldE1vZGVsKCk7Ci0JCQkJCQlmb3IgKGludCBrID0gMDsgayA8IGlucHV0d29ya3Byb2R1Y3RDb21wb3NpdGVMaXN0Ci0JCQkJCQkJCS5zaXplKCk7IGsrKykgewotCQkJCQkJCVdvcmtQcm9kdWN0Q29tcG9zaXRlIHdwY29tcCA9ICgoV29ya1Byb2R1Y3RDb21wb3NpdGUpICgoV29ya1Byb2R1Y3RDb21wb3NpdGVFZGl0UGFydCkgaW5wdXR3b3JrcHJvZHVjdENvbXBvc2l0ZUxpc3QKLQkJCQkJCQkJCS5nZXQoaykpLmdldE1vZGVsKCkpOwotCQkJCQkJCWlmICh3cGNvbXAuZ2V0T2JqZWN0KCkuZXF1YWxzKHRhc2tub2RlLmdldE9iamVjdCgpKSkgewotCQkJCQkJCQlpZiAod3Bjb21wLmdldFR5cGUoKSA9PSBXb3JrUHJvZHVjdENvbXBvc2l0ZS5JTlBVVFMpIHsKLQkJCQkJCQkJCWNvbmZpcm1lZFNlcUlucHV0TGlzdAotCQkJCQkJCQkJCQkuYWRkKGlucHV0d29ya3Byb2R1Y3RDb21wb3NpdGVMaXN0Ci0JCQkJCQkJCQkJCQkJLmdldChrKSk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQlmb3IgKGludCBrID0gMDsgayA8IG91dHB1dFdvcmtQcm9kdWN0Q29tcG9zaXRlTGlzdAotCQkJCQkJCQkuc2l6ZSgpOyBrKyspIHsKLQkJCQkJCQlXb3JrUHJvZHVjdENvbXBvc2l0ZSB3cGNvbXAgPSAoKFdvcmtQcm9kdWN0Q29tcG9zaXRlKSAoKFdvcmtQcm9kdWN0Q29tcG9zaXRlRWRpdFBhcnQpIG91dHB1dFdvcmtQcm9kdWN0Q29tcG9zaXRlTGlzdAotCQkJCQkJCQkJLmdldChrKSkuZ2V0TW9kZWwoKSk7Ci0JCQkJCQkJaWYgKHdwY29tcC5nZXRPYmplY3QoKS5lcXVhbHModGFza25vZGUuZ2V0T2JqZWN0KCkpKSB7Ci0JCQkJCQkJCWlmICh3cGNvbXAuZ2V0VHlwZSgpID09IFdvcmtQcm9kdWN0Q29tcG9zaXRlLk9VVFBVVFMpIHsKLQkJCQkJCQkJCWNvbmZpcm1lZFNlcU91dHB1dExpc3QKLQkJCQkJCQkJCQkJLmFkZChvdXRwdXRXb3JrUHJvZHVjdENvbXBvc2l0ZUxpc3QKLQkJCQkJCQkJCQkJCQkuZ2V0KGspKTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAoIWNvbmZpcm1lZFNlcUlucHV0TGlzdC5pc0VtcHR5KCkpIHsKLQkJCQkJc2V0T2JqZWN0c0xvY2F0aW9ucyhjb25maXJtZWRTZXFJbnB1dExpc3QpOwotCQkJCQl5ID0gY2FjaGVkUG9pbnQueSArIGNhY2hlZEhlaWdodCArIHlzcGFjaW5nOwotCQkJCX0KLQkJCQlMaXN0IHJvbGVDID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCXJvbGVDLmFkZChyb2xlY29tcG9zaXRlTGlzdC5nZXQoaSkpOwotCQkJCXNldE9iamVjdHNMb2NhdGlvbnMocm9sZUMpOwotCi0JCQkJeSA9IGNhY2hlZFBvaW50LnkgKyBjYWNoZWRIZWlnaHQgKyB5c3BhY2luZzsKLQkJCQlpZiAoIWNvbmZpcm1lZFNlcU91dHB1dExpc3QuaXNFbXB0eSgpKSB7Ci0JCQkJCXNldE9iamVjdHNMb2NhdGlvbnMoY29uZmlybWVkU2VxT3V0cHV0TGlzdCk7Ci0JCQkJCXkgPSBjYWNoZWRQb2ludC55ICsgY2FjaGVkSGVpZ2h0ICsgeXNwYWNpbmc7Ci0JCQkJfQotCQkJfQotCi0JCX0KLQotCQlpZiAoIW1pc2NMaXN0LmlzRW1wdHkoKSkgewotCQkJaWYgKGRlYnVnKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJQcmludCBTaXplIG9mIG1pc2M6ICIgKyBtaXNjTGlzdC5zaXplKCkpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlpZiAoIWxvYWRpbmcpIHsKLQkJCQltaXNjZWxsYW5lb3VzID0gdHJ1ZTsKLQkJCX0KLQkJCXNldE9iamVjdHNMb2NhdGlvbnMobWlzY0xpc3QpOwotCQkJbWlzY2VsbGFuZW91cyA9IGZhbHNlOwotCQl9Ci0KLQkJbG9hZGluZyA9IGZhbHNlOwotCX0KLQotCXByaXZhdGUgdm9pZCBjYWxjU2l6ZShPYmplY3QgY2hpbGQpIHsKLQkJTGlzdCBsaXN0ID0gKChHcmFwaGljYWxFZGl0UGFydCkgY2hpbGQpLmdldENoaWxkcmVuKCk7Ci0JCWludCBsYXJnZXN0V2lkdGggPSAwOwotCQlpbnQgbGFyZ2VzdEhlaWdodCA9IDA7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSBsaXN0Lml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBvYmogPSBpdC5uZXh0KCk7Ci0JCQlOb2RlIG9iak5vZGUgPSAoTm9kZSkgKChOb2RlRWRpdFBhcnQpIG9iaikuZ2V0TW9kZWwoKTsKLQkJCWlmIChvYmpOb2RlIGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZSkgewotCQkJCWludCBub2RlV2lkdGggPSAoKERlc2NyaXB0b3JOb2RlRWRpdFBhcnQpIG9iaikuZ2V0RmlndXJlKCkKLQkJCQkJCS5nZXRQcmVmZXJyZWRTaXplKCkud2lkdGg7Ci0JCQkJaW50IG5vZGVIZWlnaHQgPSAoKERlc2NyaXB0b3JOb2RlRWRpdFBhcnQpIG9iaikuZ2V0RmlndXJlKCkKLQkJCQkJCS5nZXRQcmVmZXJyZWRTaXplKCkuaGVpZ2h0OwotCQkJCWlmIChub2RlV2lkdGggPiBsYXJnZXN0V2lkdGgpCi0JCQkJCWxhcmdlc3RXaWR0aCA9IG5vZGVXaWR0aDsKLQkJCQlpZiAobm9kZUhlaWdodCA+IGxhcmdlc3RIZWlnaHQpCi0JCQkJCWxhcmdlc3RIZWlnaHQgPSBub2RlSGVpZ2h0OwotCQkJfQotCQl9Ci0JCSgoV29ya1Byb2R1Y3RDb21wb3NpdGVFZGl0UGFydCkgY2hpbGQpLmdldEZpZ3VyZSgpLnNldFByZWZlcnJlZFNpemUoCi0JCQkJbmV3IERpbWVuc2lvbihsYXJnZXN0V2lkdGggKiAyICsgMTAsIDIwICsgbGFyZ2VzdEhlaWdodAotCQkJCQkJKiAobGlzdC5zaXplKCkgLyAyICsgMSkpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0T2JqZWN0c0xvY2F0aW9ucyhMaXN0IGxpc3QpIHsKLQotCQl4YXhpc2JlZ2luID0gdHJ1ZTsKLQkJeCA9IDEwOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBsaXN0Lml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGNoaWxkID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAoY2hpbGQgaW5zdGFuY2VvZiBHcmFwaGljYWxFZGl0UGFydCkgewotCQkJCUdyYXBoaWNhbEVkaXRQYXJ0IHBhcnQgPSAoR3JhcGhpY2FsRWRpdFBhcnQpIGNoaWxkOwotCQkJCWlmIChwYXJ0LmdldE1vZGVsKCkgaW5zdGFuY2VvZiBOb2RlKSB7Ci0JCQkJCU5vZGUgbm9kZSA9IChOb2RlKSBwYXJ0LmdldE1vZGVsKCk7Ci0JCQkJCVBvaW50IHAgPSBub2RlLmdldExvY2F0aW9uKCk7Ci0JCQkJCWlmIChwID09IG51bGwgfHwgcC54ID09IC0xKSB7Ci0JCQkJCQlpbnQgdmlld2VyV2lkdGggPSBwYXJ0LmdldFJvb3QoKS5nZXRWaWV3ZXIoKQotCQkJCQkJCQkuZ2V0Q29udHJvbCgpLmdldEJvdW5kcygpLndpZHRoOwotCQkJCQkJaWYgKCF4YXhpc2JlZ2luKSB7Ci0JCQkJCQkJeCA9IGNhY2hlZFBvaW50LnggKyBjYWNoZWRXaWR0aCArIHNwYWNpbmc7Ci0JCQkJCQl9Ci0JCQkJCQkvLyBjaGVjayBpZiBwIGlzIG51bGwsIGNyZWF0ZSBQb2ludC4KLQkJCQkJCWlmIChwID09IG51bGwpCi0JCQkJCQkJcCA9IG5ldyBQb2ludCgpOwotCi0JCQkJCQlpZiAoIWxvYWRpbmcgJiYgbWlzY2VsbGFuZW91cykgewotCQkJCQkJCXAueCA9IHg7Ci0JCQkJCQkJcC55ID0gMTA7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCXAueCA9IHg7Ci0JCQkJCQkJcC55ID0geTsKLQkJCQkJCX0KLQkJCQkJCW5vZGUuc2V0TG9jYXRpb24ocCk7Ci0JCQkJCQlpZiAoIW1pc2NlbGxhbmVvdXMpCi0JCQkJCQkJY2FjaGVkUG9pbnQgPSBwOwotCQkJCQkJY2FjaGVkV2lkdGggPSBwYXJ0LmdldEZpZ3VyZSgpLmdldFByZWZlcnJlZFNpemUoKS53aWR0aDsKLQkJCQkJCWlmIChwYXJ0LmdldEZpZ3VyZSgpLmdldFByZWZlcnJlZFNpemUoKS5oZWlnaHQgPiBjYWNoZWRIZWlnaHQpCi0JCQkJCQkJY2FjaGVkSGVpZ2h0ID0gcGFydC5nZXRGaWd1cmUoKS5nZXRQcmVmZXJyZWRTaXplKCkuaGVpZ2h0OwotCQkJCQkJeGF4aXNiZWdpbiA9IGZhbHNlOwotCQkJCQkJaWYgKGRlYnVnKSB7Ci0JCQkJCQkJU3lzdGVtLm91dAotCQkJCQkJCQkJLnByaW50bG4oIlBvaW50IDogIiArIG5ldyBQb2ludCh4LCB5KS50b1N0cmluZygpICsgIkFuZCB3aWR0aD0iIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJCQkJCQkrIGNhY2hlZFdpZHRoCi0JCQkJCQkJCQkJCSsgIiwgSGVpZ2h0PSIgKyBjYWNoZWRIZWlnaHQgKyAiLCBXaWR0aCBvZiBWaWV3ZXI6ICIgKyB2aWV3ZXJXaWR0aCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyByZWNlbnRseSBhZGRkZWQgZWRpdHBhcnRzLiBVc3VhbGx5IGNhbGxlZCAKLQkgKiBieSBkaWFncmFtIHNlcnZpY2VzIHRvIGRvIGF1dG9sYXlvdXQgYWRqdXN0bWVudC4KLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRSZWNlbnRseUFkZGVkUGFydHMoKSB7Ci0JCXJldHVybiByZWNlbnRseUFkZGVkUGFydHM7Ci0JfQotCi0JLyoqCi0JICogQ2xlYXIgdGhlIHJlY2VudGx5IGFkZGVkIGVkaXRwYXJ0cyBmcm9tIHRoZSBsaXN0LgotCSAqLwotCXB1YmxpYyB2b2lkIGNsZWFyUmVjZW50bHlBZGRlZFBhcnRzKCkgewotCQlyZWNlbnRseUFkZGVkUGFydHMuY2xlYXIoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdFBhcnRGYWN0b3J5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L0FjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRQYXJ0RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZjQ2ZjU1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdFBhcnRGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuQWN0aXZpdHlEZXRhaWxEaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTmFtZWROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLlJvbGVOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLlJvbGVUYXNrQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLlRhc2tOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLlR5cGVkTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Xb3JrUHJvZHVjdENvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Xb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnRGYWN0b3J5OwotCi0vKioKLSAqIEZhY3RvcnkgZm9yIEFjdGl2aXR5RGV0YWlsRGlhZ3JhbSdzIEVkaXRQYXJ0LiBDcmVhdGVzIGFuIEVkaXRQYXJ0IGZvcgotICogQWN0aXZpdHkgRGV0YWlsIERpYWdyYW0ncyBjaGlsZHJlbi4gIAotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0UGFydEZhY3RvcnkgaW1wbGVtZW50cyBFZGl0UGFydEZhY3RvcnkgewotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBFZGl0UGFydCBmb3IgYSBjaGlsZCB3aXRoIGluIHRoZSBjb250ZXh0LgotCSAqLwotCXB1YmxpYyBFZGl0UGFydCBjcmVhdGVFZGl0UGFydChFZGl0UGFydCBjb250ZXh0LCBPYmplY3QgbW9kZWwpIHsKLQkJaWYgKG1vZGVsIGluc3RhbmNlb2YgQWN0aXZpdHlEZXRhaWxEaWFncmFtKSB7Ci0JCQlyZXR1cm4gbmV3IEFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRQYXJ0KAotCQkJCQkoQWN0aXZpdHlEZXRhaWxEaWFncmFtKSBtb2RlbCk7Ci0JCX0gZWxzZSBpZiAobW9kZWwgaW5zdGFuY2VvZiBSb2xlVGFza0NvbXBvc2l0ZSkgewotCQkJcmV0dXJuIG5ldyBSb2xlVGFza0NvbXBvc2l0ZUVkaXRQYXJ0KChSb2xlVGFza0NvbXBvc2l0ZSkgbW9kZWwpOwotCQl9IGVsc2UgaWYgKG1vZGVsIGluc3RhbmNlb2YgV29ya1Byb2R1Y3RDb21wb3NpdGUpIHsKLQkJCXJldHVybiBuZXcgV29ya1Byb2R1Y3RDb21wb3NpdGVFZGl0UGFydCgKLQkJCQkJKFdvcmtQcm9kdWN0Q29tcG9zaXRlKSBtb2RlbCk7Ci0JCX0gZWxzZSBpZiAobW9kZWwgaW5zdGFuY2VvZiBSb2xlTm9kZSB8fCBtb2RlbCBpbnN0YW5jZW9mIFRhc2tOb2RlCi0JCQkJfHwgbW9kZWwgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlKSB7Ci0JCQlyZXR1cm4gbmV3IERlc2NyaXB0b3JOb2RlRWRpdFBhcnQoKE5hbWVkTm9kZSkgbW9kZWwpOwotCQl9IGVsc2UgaWYgKG1vZGVsIGluc3RhbmNlb2YgTGluaykgewotCQkJcmV0dXJuIG5ldyBMaW5rRWRpdFBhcnQoKExpbmspIG1vZGVsKTsKLQkJfQotCQlpZiAobW9kZWwgaW5zdGFuY2VvZiBUeXBlZE5vZGUpIHsKLQkJCVR5cGVkTm9kZSBub2RlID0gKFR5cGVkTm9kZSkgbW9kZWw7Ci0JCQlzd2l0Y2ggKG5vZGUuZ2V0VHlwZSgpKSB7Ci0JCQljYXNlIFR5cGVkTm9kZS5TVEFSVDoKLQkJCQlyZXR1cm4gbmV3IFN0YXJ0Tm9kZUVkaXRQYXJ0KG5vZGUpOwotCQkJY2FzZSBUeXBlZE5vZGUuRU5EOgotCQkJCXJldHVybiBuZXcgRW5kTm9kZUVkaXRQYXJ0KG5vZGUpOwotCQkJY2FzZSBUeXBlZE5vZGUuREVDSVNJT046Ci0JCQkJcmV0dXJuIG5ldyBEZWNpc2lvbk5vZGVFZGl0UGFydChub2RlKTsKLQkJCWNhc2UgVHlwZWROb2RlLlNZTkNIX0JBUjoKLQkJCQlyZXR1cm4gbmV3IFN5bmNoQmFyTm9kZUVkaXRQYXJ0KG5vZGUpOwotCQkJY2FzZSBUeXBlZE5vZGUuRlJFRV9URVhUOgotCQkJCXJldHVybiBuZXcgRnJlZVRleHROb2RlRWRpdFBhcnQobm9kZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L0FjdGl2aXR5RGlhZ3JhbUVkaXRQYXJ0LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L0FjdGl2aXR5RGlhZ3JhbUVkaXRQYXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwNzlmOTAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9BY3Rpdml0eURpYWdyYW1FZGl0UGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZWRpdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkFjdGl2aXR5RGlhZ3JhbTsKLQotLyoqCi0gKiBFZGl0UGFydCBmb3IgQWN0aXZpdHlEaWFncmFtLgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXR5RGlhZ3JhbUVkaXRQYXJ0IGV4dGVuZHMgRGlhZ3JhbUVkaXRQYXJ0IHsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBlZGl0cGFydCBmb3IgQWN0aXZpdHkgRGlhZ3JhbS4gCi0JICogCi0JICogQHBhcmFtIG1vZGVsIHtAbGluayBBY3Rpdml0eURpYWdyYW19Ci0JICovCi0JcHVibGljIEFjdGl2aXR5RGlhZ3JhbUVkaXRQYXJ0KEFjdGl2aXR5RGlhZ3JhbSBtb2RlbCkgewotCQlzdXBlcihtb2RlbCk7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9BY3Rpdml0eURpYWdyYW1FZGl0UGFydEZhY3RvcnkuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvQWN0aXZpdHlEaWFncmFtRWRpdFBhcnRGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlYzk3NmEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9BY3Rpdml0eURpYWdyYW1FZGl0UGFydEZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5BY3Rpdml0eURpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5OYW1lZE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuVHlwZWROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLldvcmtCcmVha2Rvd25FbGVtZW50Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0RmFjdG9yeTsKLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZpdHlEaWFncmFtRWRpdFBhcnRGYWN0b3J5IGltcGxlbWVudHMgRWRpdFBhcnRGYWN0b3J5IHsKLQotCS8qKgotCSAqIENyZWF0ZXMgZWRpdHBhcnQgZm9yIEFjdGl2aXR5RGlhZ3JhbSdzIGNoaWxkcmVuLiAKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydEZhY3RvcnkjY3JlYXRlRWRpdFBhcnQob3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0LAotCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgRWRpdFBhcnQgY3JlYXRlRWRpdFBhcnQoRWRpdFBhcnQgY29udGV4dCwgT2JqZWN0IG1vZGVsKSB7Ci0JCWlmIChtb2RlbCBpbnN0YW5jZW9mIEFjdGl2aXR5RGlhZ3JhbSkgewotCQkJcmV0dXJuIG5ldyBBY3Rpdml0eURpYWdyYW1FZGl0UGFydCgoQWN0aXZpdHlEaWFncmFtKSBtb2RlbCk7Ci0JCX0gZWxzZSBpZiAobW9kZWwgaW5zdGFuY2VvZiBXb3JrQnJlYWtkb3duRWxlbWVudE5vZGUpIHsKLQkJCXJldHVybiBuZXcgV29ya0JyZWFrZG93bkVsZW1lbnROb2RlRWRpdFBhcnQoKE5hbWVkTm9kZSkgbW9kZWwpOwotCQl9IGVsc2UgaWYgKG1vZGVsIGluc3RhbmNlb2YgTGluaykgewotCQkJcmV0dXJuIG5ldyBMaW5rRWRpdFBhcnQoKExpbmspIG1vZGVsKTsKLQkJfSBlbHNlIGlmIChtb2RlbCBpbnN0YW5jZW9mIFR5cGVkTm9kZSkgewotCQkJVHlwZWROb2RlIG5vZGUgPSAoVHlwZWROb2RlKSBtb2RlbDsKLQkJCXN3aXRjaCAobm9kZS5nZXRUeXBlKCkpIHsKLQkJCWNhc2UgVHlwZWROb2RlLlNUQVJUOgotCQkJCXJldHVybiBuZXcgU3RhcnROb2RlRWRpdFBhcnQobm9kZSk7Ci0JCQljYXNlIFR5cGVkTm9kZS5FTkQ6Ci0JCQkJcmV0dXJuIG5ldyBFbmROb2RlRWRpdFBhcnQobm9kZSk7Ci0JCQljYXNlIFR5cGVkTm9kZS5ERUNJU0lPTjoKLQkJCQlyZXR1cm4gbmV3IERlY2lzaW9uTm9kZUVkaXRQYXJ0KG5vZGUpOwotCQkJY2FzZSBUeXBlZE5vZGUuU1lOQ0hfQkFSOgotCQkJCXJldHVybiBuZXcgU3luY2hCYXJOb2RlRWRpdFBhcnQobm9kZSk7Ci0JCQljYXNlIFR5cGVkTm9kZS5GUkVFX1RFWFQ6Ci0JCQkJcmV0dXJuIG5ldyBGcmVlVGV4dE5vZGVFZGl0UGFydChub2RlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvQmFzZUVkaXRQYXJ0LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L0Jhc2VFZGl0UGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMjE5N2RhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvQmFzZUVkaXRQYXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZWRpdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQudGV4dC5UZXh0RmxvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQucG9saWNpZXMuTGFiZWxTZWxlY3Rpb25FZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmZpZ3VyZXMuU2VsZWN0YWJsZUxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cGFydHMuQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLkRpcmVjdEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnRvb2xzLkRpcmVjdEVkaXRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGV4dENlbGxFZGl0b3I7Ci0KLS8qKgotICogUHJvdmlkZXMgaW5mcmFzdHJ1Y3R1cmUgZm9yIGRlbGV0aW9uLCBkaXJlY3QtZWRpdGluZywgcHJvcGVydHkgc291cmNlIGFuZAotICogbW9kZWwtbGlzdGVuaW5nLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQmFzZUVkaXRQYXJ0IGV4dGVuZHMgQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCB7Ci0KLQlwcm90ZWN0ZWQgRGlyZWN0RWRpdE1hbmFnZXIgbWFuYWdlcjsKLQotCXByb3RlY3RlZCBBZGFwdGVyIG1vZGVsTGlzdGVuZXIgPSBuZXcgQWRhcHRlckltcGwoKSB7Ci0JCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG1zZykgewotCQkJaGFuZGxlUHJvcGVydHlDaGFuZ2VkKG1zZyk7Ci0JCX0KLQl9OwotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgCi0JICogQHBhcmFtIG9iaiB7QGxpbmsgRU9iamVjdH0KLQkgKi8KLQlwdWJsaWMgQmFzZUVkaXRQYXJ0KEVPYmplY3Qgb2JqKSB7Ci0JCXN1cGVyKCk7Ci0JCXNldE1vZGVsKG9iaik7Ci0JfQotCi0JcHVibGljIHZvaWQgYWN0aXZhdGUoKSB7Ci0JCXN1cGVyLmFjdGl2YXRlKCk7Ci0JCSgoRU9iamVjdCkgZ2V0TW9kZWwoKSkuZUFkYXB0ZXJzKCkuYWRkKG1vZGVsTGlzdGVuZXIpOwotCX0KLQotCXByb3RlY3RlZCBhYnN0cmFjdCBEaXJlY3RFZGl0UG9saWN5IGNyZWF0ZURpcmVjdEVkaXRQb2xpY3koKTsKLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUVkaXRQb2xpY2llcygpIHsKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5TRUxFQ1RJT05fRkVFREJBQ0tfUk9MRSwKLQkJCQluZXcgTGFiZWxTZWxlY3Rpb25FZGl0UG9saWN5KCkpOwotCX0KLQotCXByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZUZpZ3VyZSgpIHsKLQkJcmV0dXJuIG5ldyBTZWxlY3RhYmxlTGFiZWwoKTsKLQl9Ci0KLQkvKioKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5nZWYuZWRpdHBhcnRzLkFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQjZGVhY3RpdmF0ZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGVhY3RpdmF0ZSgpIHsKLQkJKChFT2JqZWN0KSBnZXRNb2RlbCgpKS5lQWRhcHRlcnMoKS5yZW1vdmUobW9kZWxMaXN0ZW5lcik7Ci0JCXN1cGVyLmRlYWN0aXZhdGUoKTsKLQl9Ci0KLQlJRmlndXJlIGdldERpcmVjdEVkaXRGaWd1cmUoKSB7Ci0JCXJldHVybiBnZXRGaWd1cmUoKTsKLQl9Ci0KLQlTdHJpbmcgZ2V0RGlyZWN0RWRpdFRleHQoKSB7Ci0JCUlGaWd1cmUgZmlnID0gZ2V0RGlyZWN0RWRpdEZpZ3VyZSgpOwotCQlpZiAoZmlnIGluc3RhbmNlb2YgTGFiZWwpIHsKLQkJCXJldHVybiAoKExhYmVsKSBmaWcpLmdldFRleHQoKTsKLQkJfSBlbHNlIGlmIChmaWcgaW5zdGFuY2VvZiBUZXh0RmxvdykgewotCQkJcmV0dXJuICgoVGV4dEZsb3cpIGZpZykuZ2V0VGV4dCgpOwotCQl9Ci0JCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGhhbmRsZVByb3BlcnR5Q2hhbmdlZChOb3RpZmljYXRpb24gbXNnKTsKLQotCXByb3RlY3RlZCBEaXJlY3RFZGl0TWFuYWdlciBnZXREaXJlY3RFZGl0TWFuYWdlcigpIHsKLQkJaWYgKG1hbmFnZXIgPT0gbnVsbCkgewotCQkJbWFuYWdlciA9IGNyZWF0ZURpcmVjdEVkaXRNYW5hZ2VyKCk7Ci0JCX0KLQkJcmV0dXJuIG1hbmFnZXI7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURpcmVjdEVkaXQoKSB7Ci0JCWdldERpcmVjdEVkaXRNYW5hZ2VyKCk7Ci0KLQkJaWYgKG1hbmFnZXIgIT0gbnVsbCkgewotCQkJbWFuYWdlci5zaG93KCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgRGlyZWN0RWRpdE1hbmFnZXIgY3JlYXRlRGlyZWN0RWRpdE1hbmFnZXIoKSB7Ci0JCXJldHVybiBuZXcgTGFiZWxEaXJlY3RFZGl0TWFuYWdlcih0aGlzLCBUZXh0Q2VsbEVkaXRvci5jbGFzcywKLQkJCQluZXcgTGFiZWxDZWxsRWRpdG9yTG9jYXRvcihnZXREaXJlY3RFZGl0RmlndXJlKCkpKTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L0JvdHRvbUFuY2hvci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9Cb3R0b21BbmNob3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWI3ZjU2YS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L0JvdHRvbUFuY2hvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZWRpdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5BYnN0cmFjdENvbm5lY3Rpb25BbmNob3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5SZWN0YW5nbGU7Ci0KLS8qKgotICogUHJvdmlkZXMgc3VwcG9ydCBmb3IgYm90dG9tIGFuY2hvciBmb3IgYSBmaWd1cmUncyBib3R0b20gbG9jYXRpb24uCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLWNsYXNzIEJvdHRvbUFuY2hvciBleHRlbmRzIEFic3RyYWN0Q29ubmVjdGlvbkFuY2hvciB7Ci0KLQlwcml2YXRlIGludCBvZmZzZXQ7Ci0KLQlCb3R0b21BbmNob3IoSUZpZ3VyZSBzb3VyY2UsIGludCBvZmZzZXQpIHsKLQkJc3VwZXIoc291cmNlKTsKLQkJdGhpcy5vZmZzZXQgPSBvZmZzZXQ7Ci0JfQotCi0JcHVibGljIFBvaW50IGdldExvY2F0aW9uKFBvaW50IHJlZmVyZW5jZSkgewotCQlSZWN0YW5nbGUgciA9IGdldE93bmVyKCkuZ2V0Qm91bmRzKCkuZ2V0Q29weSgpOwotCQlnZXRPd25lcigpLnRyYW5zbGF0ZVRvQWJzb2x1dGUocik7Ci0JCWludCBvZmYgPSBvZmZzZXQ7Ci0JCWlmIChvZmYgPT0gLTEpCi0JCQlvZmYgPSByLndpZHRoIC8gMjsKLQkJaWYgKHIuY29udGFpbnMocmVmZXJlbmNlKSB8fCByLmJvdHRvbSgpID4gcmVmZXJlbmNlLnkpCi0JCQlyZXR1cm4gci5nZXRUb3BMZWZ0KCkudHJhbnNsYXRlKG9mZiwgMCk7Ci0JCWVsc2UKLQkJCXJldHVybiByLmdldEJvdHRvbUxlZnQoKS50cmFuc2xhdGUob2ZmLCAtMSk7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9DbG9zZXN0QW5jaG9yLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L0Nsb3Nlc3RBbmNob3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzYwNGE1ZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L0Nsb3Nlc3RBbmNob3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkFic3RyYWN0Q29ubmVjdGlvbkFuY2hvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuUG9zaXRpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYudXRpbC5BbmNob3JVdGlsOwotCi0vKioKLSAqIFByb3ZpZGVzIHN1cHBvcnQgdG8gZmluZCB0aGUgY2xvc2VzdCBsb2NhdGlvbiBpbiBmaWd1cmUKLSAqIGZvciBhbmNob3IuIAotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQ2xvc2VzdEFuY2hvciBleHRlbmRzIEFic3RyYWN0Q29ubmVjdGlvbkFuY2hvciB7Ci0KLQlwdWJsaWMgQ2xvc2VzdEFuY2hvcihJRmlndXJlIGZpZ3VyZSkgewotCQlzdXBlcihmaWd1cmUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZHJhdzJkLkNvbm5lY3Rpb25BbmNob3IjZ2V0TG9jYXRpb24oUG9pbnQpCi0JICovCi0JcHVibGljIFBvaW50IGdldExvY2F0aW9uKFBvaW50IHJlZmVyZW5jZSkgewotCQlyZXR1cm4gZ2V0TG9jYXRpb24oZ2V0T3duZXIoKSwgcmVmZXJlbmNlKTsKLQl9Ci0KLQkvKioKLQkgKiBGaW5kcyB0aGUgbG9jYXRpb24gaW4gdGhlIGNsb3Nlc3QgbG9jYXRpb24gaW4gZmlndXJlLCBiYXNlZCBvbiAKLQkgKiBmaWd1cmUgYm91bmRzIGFuZCB0aGUgcmVmZXJlbmNlIHBvaW50LiAgIAotCSAqIAotCSAqIEBwYXJhbSBmaWd1cmUge0BsaW5rIElGaWd1cmV9ICBGaWd1cmUgdG8gd2hpY2ggY29ubmVjdGlvbiBpcyBlc3RhYmxpc2hpbmcuCi0JICogQHBhcmFtIHJlZmVyZW5jZSB7QGxpbmsgUG9pbnR9Ci0JICovCi0JcHVibGljIHN0YXRpYyBQb2ludCBnZXRMb2NhdGlvbihJRmlndXJlIGZpZ3VyZSwgUG9pbnQgcmVmZXJlbmNlKSB7Ci0JCVJlY3RhbmdsZSByID0gZmlndXJlLmdldEJvdW5kcygpLmdldENvcHkoKTsKLQkJZmlndXJlLnRyYW5zbGF0ZVRvQWJzb2x1dGUocik7Ci0JCVJlY3RhbmdsZSBhYnNvbHV0ZUJvdW5kcyA9IHIuZ2V0Q29weSgpOwotCQlQb2ludCBwID0gbnVsbDsKLQkJc3dpdGNoIChyLmdldFBvc2l0aW9uKHJlZmVyZW5jZSkpIHsKLQkJY2FzZSBQb3NpdGlvbkNvbnN0YW50cy5OT1JUSDoKLQkJCXAgPSByLmdldFRvcExlZnQoKS50cmFuc2xhdGUocmVmZXJlbmNlLnggLSByLngsIDApOwotCQkJYnJlYWs7Ci0JCWNhc2UgUG9zaXRpb25Db25zdGFudHMuTk9SVEhfRUFTVDoKLQkJCXAgPSByLmdldFRvcFJpZ2h0KCk7Ci0JCQlicmVhazsKLQkJY2FzZSBQb3NpdGlvbkNvbnN0YW50cy5FQVNUOgotCQkJcCA9IHIuZ2V0VG9wUmlnaHQoKS50cmFuc2xhdGUoMCwgcmVmZXJlbmNlLnkgLSByLnkpOwotCQkJYnJlYWs7Ci0JCWNhc2UgUG9zaXRpb25Db25zdGFudHMuU09VVEhfRUFTVDoKLQkJCXAgPSByLmdldEJvdHRvbVJpZ2h0KCk7Ci0JCQlicmVhazsKLQkJY2FzZSBQb3NpdGlvbkNvbnN0YW50cy5TT1VUSDoKLQkJCXAgPSByLmdldEJvdHRvbUxlZnQoKS50cmFuc2xhdGUocmVmZXJlbmNlLnggLSByLngsIDApOwotCQkJYnJlYWs7Ci0JCWNhc2UgUG9zaXRpb25Db25zdGFudHMuU09VVEhfV0VTVDoKLQkJCXAgPSByLmdldEJvdHRvbUxlZnQoKTsKLQkJCWJyZWFrOwotCQljYXNlIFBvc2l0aW9uQ29uc3RhbnRzLldFU1Q6Ci0JCQlwID0gci5nZXRUb3BMZWZ0KCkudHJhbnNsYXRlKDAsIHJlZmVyZW5jZS55IC0gci55KTsKLQkJCWJyZWFrOwotCQljYXNlIFBvc2l0aW9uQ29uc3RhbnRzLk5PUlRIX1dFU1Q6Ci0JCQlwID0gci5nZXRUb3BMZWZ0KCk7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCWludCB0b3BEaXN0YW5jZSA9IHJlZmVyZW5jZS55IC0gci55OwotCQkJaW50IHJpZ2h0RGlzdGFuY2UgPSByLnJpZ2h0KCkgLSByZWZlcmVuY2UueDsKLQkJCWludCBib3R0b21EaXN0YW5jZSA9IHIuYm90dG9tKCkgLSByZWZlcmVuY2UueTsKLQkJCWludCBsZWZ0RGlzdGFuY2UgPSByZWZlcmVuY2UueCAtIHIueDsKLQkJCWludFtdIGRpc3RhbmNlcyA9IHsgdG9wRGlzdGFuY2UsIHJpZ2h0RGlzdGFuY2UsIGJvdHRvbURpc3RhbmNlLAotCQkJCQlsZWZ0RGlzdGFuY2UgfTsKLQkJCWludCBpZCA9IEFuY2hvclV0aWwubWluKGRpc3RhbmNlcyk7Ci0JCQlzd2l0Y2ggKGlkKSB7Ci0JCQljYXNlIDA6Ci0JCQkJcCA9IHIuZ2V0VG9wTGVmdCgpLnRyYW5zbGF0ZShsZWZ0RGlzdGFuY2UsIDApOwotCQkJCWJyZWFrOwotCQkJY2FzZSAxOgotCQkJCXAgPSByLmdldFRvcFJpZ2h0KCkudHJhbnNsYXRlKDAsIHRvcERpc3RhbmNlKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgMjoKLQkJCQlwID0gci5nZXRCb3R0b21MZWZ0KCkudHJhbnNsYXRlKGxlZnREaXN0YW5jZSwgMCk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIDQ6Ci0JCQkJcCA9IHIuZ2V0VG9wTGVmdCgpLnRyYW5zbGF0ZSh0b3BEaXN0YW5jZSwgMCk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJaWYgKHAgIT0gbnVsbCkgewotCQkJcC5wZXJmb3JtVHJhbnNsYXRlKC1hYnNvbHV0ZUJvdW5kcy54LCAtYWJzb2x1dGVCb3VuZHMueSk7Ci0JCX0KLQkJcmV0dXJuIHA7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L0RlY2lzaW9uTm9kZUVkaXRQYXJ0LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L0RlY2lzaW9uTm9kZUVkaXRQYXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5ZTJhYmYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9EZWNpc2lvbk5vZGVFZGl0UGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuQ29ubmVjdGlvbkFuY2hvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5maWd1cmVzLkRpYW1vbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYudXRpbC5BbmNob3JVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLnV0aWwuQ29ubmVjdGlvbkFuY2hvckxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5UeXBlZE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkNvbm5lY3Rpb25FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLkRpcmVjdEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLkNyZWF0ZUNvbm5lY3Rpb25SZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5yZXF1ZXN0cy5Mb2NhdGlvblJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotCi0vKioKLSAqIEVkaXRQYXJ0IGZvciAgRGVjaXNpb25Ob2RlLCB1c2VkIGluIGFjdGl2aXR5IGRpYWdyYW0uCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBEZWNpc2lvbk5vZGVFZGl0UGFydCBleHRlbmRzIE5vZGVFZGl0UGFydCBpbXBsZW1lbnRzCi0JCUNvbm5lY3Rpb25BbmNob3JMb2NhdG9yIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIENvbG9yIEJHX0NPTE9SID0gbmV3IENvbG9yKG51bGwsIDI1NCwgMjA0LCAxNTMpOwotCi0JcHJpdmF0ZSBQb2ludCByZWNlbnRTb3VyY2VFbmRQb2ludDsKLQotCXByaXZhdGUgUG9pbnQgcmVjZW50VGFyZ2V0RW5kUG9pbnQ7Ci0KLQlwdWJsaWMgRGVjaXNpb25Ob2RlRWRpdFBhcnQoVHlwZWROb2RlIG1vZGVsKSB7Ci0JCXN1cGVyKG1vZGVsKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQuQmFzZUVkaXRQYXJ0I2NyZWF0ZURpcmVjdEVkaXRQb2xpY3koKQotCSAqLwotCXByb3RlY3RlZCBEaXJlY3RFZGl0UG9saWN5IGNyZWF0ZURpcmVjdEVkaXRQb2xpY3koKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZWRpdC5CYXNlRWRpdFBhcnQjY3JlYXRlRmlndXJlKCkKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVGaWd1cmUoKSB7Ci0JCURpYW1vbmQgZmlndXJlID0gbmV3IERpYW1vbmQoKTsKLQkJZmlndXJlLnNldEJhY2tncm91bmRDb2xvcihCR19DT0xPUik7Ci0JCWZpZ3VyZS5zZXRTaXplKDQ4LCAyNCk7Ci0JCXJldHVybiBmaWd1cmU7Ci0JfQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZWRpdC5Ob2RlRWRpdFBhcnQjZ2V0U291cmNlQ29ubmVjdGlvbkFuY2hvcihvcmcuZWNsaXBzZS5nZWYuQ29ubmVjdGlvbkVkaXRQYXJ0KQotCSAqLwotCXB1YmxpYyBDb25uZWN0aW9uQW5jaG9yIGdldFNvdXJjZUNvbm5lY3Rpb25BbmNob3IoCi0JCQlDb25uZWN0aW9uRWRpdFBhcnQgY29ubmVjdGlvbikgewotCQlib29sZWFuIGlzUmVsYXRpdmUgPSBmYWxzZTsKLQkJUG9pbnQgc291cmNlRW5kUG9pbnQ7Ci0JCWlmIChyZWNlbnRTb3VyY2VFbmRQb2ludCA9PSBudWxsKSB7Ci0JCQkvLyBnZXQgc291cmNlIGVuZCBwb2ludCBmcm9tIHRoZSBtb2RlbAotCQkJTGluayBsaW5rID0gKExpbmspIGNvbm5lY3Rpb24uZ2V0TW9kZWwoKTsKLQkJCXNvdXJjZUVuZFBvaW50ID0gbGluay5nZXRTb3VyY2VFbmRQb2ludCgpOwotCQkJaXNSZWxhdGl2ZSA9IHRydWU7Ci0JCX0gZWxzZSB7Ci0JCQlzb3VyY2VFbmRQb2ludCA9IHJlY2VudFNvdXJjZUVuZFBvaW50OwotCQl9Ci0JCWlmIChzb3VyY2VFbmRQb2ludCAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gbmV3IFJlbGF0aXZlWFlBbmNob3IoZ2V0RmlndXJlKCksIHNvdXJjZUVuZFBvaW50LCBpc1JlbGF0aXZlKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0U291cmNlQ29ubmVjdGlvbkFuY2hvcihjb25uZWN0aW9uKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQuTm9kZUVkaXRQYXJ0I2dldFNvdXJjZUNvbm5lY3Rpb25BbmNob3Iob3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3QpCi0JICovCi0JcHVibGljIENvbm5lY3Rpb25BbmNob3IgZ2V0U291cmNlQ29ubmVjdGlvbkFuY2hvcihSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJUG9pbnQgcCA9IG51bGw7Ci0JCWlmIChyZXF1ZXN0IGluc3RhbmNlb2YgQ3JlYXRlQ29ubmVjdGlvblJlcXVlc3QpIHsKLQkJCUNyZWF0ZUNvbm5lY3Rpb25SZXF1ZXN0IHJlcSA9IChDcmVhdGVDb25uZWN0aW9uUmVxdWVzdCkgcmVxdWVzdDsKLQkJCXAgPSByZXEuZ2V0TG9jYXRpb24oKTsKLQkJfSBlbHNlIGlmIChyZXF1ZXN0IGluc3RhbmNlb2YgTG9jYXRpb25SZXF1ZXN0KSB7Ci0JCQlwID0gKChMb2NhdGlvblJlcXVlc3QpIHJlcXVlc3QpLmdldExvY2F0aW9uKCk7Ci0JCX0KLQkJaWYgKHAgIT0gbnVsbCkgewotCQkJcmVjZW50U291cmNlRW5kUG9pbnQgPSBnZXRMb2NhdGlvbihwKTsKLQkJCXJldHVybiBuZXcgUmVsYXRpdmVYWUFuY2hvcihnZXRGaWd1cmUoKSwgcmVjZW50U291cmNlRW5kUG9pbnQsIHRydWUpOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRTb3VyY2VDb25uZWN0aW9uQW5jaG9yKHJlcXVlc3QpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZWRpdC5Ob2RlRWRpdFBhcnQjZ2V0VGFyZ2V0Q29ubmVjdGlvbkFuY2hvcihvcmcuZWNsaXBzZS5nZWYuQ29ubmVjdGlvbkVkaXRQYXJ0KQotCSAqLwotCXB1YmxpYyBDb25uZWN0aW9uQW5jaG9yIGdldFRhcmdldENvbm5lY3Rpb25BbmNob3IoCi0JCQlDb25uZWN0aW9uRWRpdFBhcnQgY29ubmVjdGlvbikgewotCQlib29sZWFuIGlzUmVsYXRpdmUgPSBmYWxzZTsKLQkJUG9pbnQgdGFyZ2V0RW5kUG9pbnQ7Ci0JCWlmIChyZWNlbnRUYXJnZXRFbmRQb2ludCA9PSBudWxsKSB7Ci0JCQkvLyBnZXQgdGFyZ2V0IGVuZCBwb2ludCBmcm9tIG1vZGVsCi0JCQlMaW5rIGxpbmsgPSAoTGluaykgY29ubmVjdGlvbi5nZXRNb2RlbCgpOwotCQkJdGFyZ2V0RW5kUG9pbnQgPSBsaW5rLmdldFRhcmdldEVuZFBvaW50KCk7Ci0JCQlpc1JlbGF0aXZlID0gdHJ1ZTsKLQkJfSBlbHNlIHsKLQkJCXRhcmdldEVuZFBvaW50ID0gcmVjZW50VGFyZ2V0RW5kUG9pbnQ7Ci0JCX0KLQkJaWYgKHRhcmdldEVuZFBvaW50ICE9IG51bGwpIHsKLQkJCXJldHVybiBuZXcgUmVsYXRpdmVYWUFuY2hvcihnZXRGaWd1cmUoKSwgdGFyZ2V0RW5kUG9pbnQsIGlzUmVsYXRpdmUpOwotCQl9Ci0KLQkJcmV0dXJuIHN1cGVyLmdldFRhcmdldENvbm5lY3Rpb25BbmNob3IoY29ubmVjdGlvbik7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0Lk5vZGVFZGl0UGFydCNnZXRUYXJnZXRDb25uZWN0aW9uQW5jaG9yKG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0KQotCSAqLwotCXB1YmxpYyBDb25uZWN0aW9uQW5jaG9yIGdldFRhcmdldENvbm5lY3Rpb25BbmNob3IoUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCVBvaW50IHAgPSBudWxsOwotCQlpZiAocmVxdWVzdCBpbnN0YW5jZW9mIENyZWF0ZUNvbm5lY3Rpb25SZXF1ZXN0KSB7Ci0JCQlDcmVhdGVDb25uZWN0aW9uUmVxdWVzdCByZXEgPSAoQ3JlYXRlQ29ubmVjdGlvblJlcXVlc3QpIHJlcXVlc3Q7Ci0JCQlwID0gcmVxLmdldExvY2F0aW9uKCk7Ci0JCX0gZWxzZSBpZiAocmVxdWVzdCBpbnN0YW5jZW9mIExvY2F0aW9uUmVxdWVzdCkgewotCQkJcCA9ICgoTG9jYXRpb25SZXF1ZXN0KSByZXF1ZXN0KS5nZXRMb2NhdGlvbigpOwotCQl9Ci0JCWlmIChwICE9IG51bGwpIHsKLQkJCXJlY2VudFRhcmdldEVuZFBvaW50ID0gZ2V0TG9jYXRpb24ocCk7Ci0JCQlyZXR1cm4gbmV3IFJlbGF0aXZlWFlBbmNob3IoZ2V0RmlndXJlKCksIHJlY2VudFRhcmdldEVuZFBvaW50LCB0cnVlKTsKLQkJfQotCi0JCXJldHVybiBzdXBlci5nZXRUYXJnZXRDb25uZWN0aW9uQW5jaG9yKHJlcXVlc3QpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYudXRpbC5Db25uZWN0aW9uQW5jaG9yTG9jYXRvciNnZXRMb2NhdGlvbihQb2ludCkKLQkgKi8KLQlwdWJsaWMgUG9pbnQgZ2V0TG9jYXRpb24oUG9pbnQgcmVmZXJlbmNlKSB7Ci0JCURpYW1vbmQgZiA9ICgoRGlhbW9uZCkgZ2V0RmlndXJlKCkpOwotCi0JCS8vIHRyYW5zbGF0ZSBwb2ludHMgdG8gYWJzb2x1dGUKLQkJUG9pbnRbXSBwb2ludHMgPSBuZXcgUG9pbnRbZi5nZXRQb2ludHMoKS5zaXplKCldOwotCQlmb3IgKGludCBpID0gZi5nZXRQb2ludHMoKS5zaXplKCkgLSAxOyBpID4gLTE7IGktLSkgewotCQkJUG9pbnQgcCA9IGYuZ2V0UG9pbnRzKCkuZ2V0UG9pbnQoaSk7Ci0JCQlmLnRyYW5zbGF0ZVRvQWJzb2x1dGUocCk7Ci0JCQlwb2ludHNbaV0gPSBwOwotCQl9Ci0KLQkJUG9pbnQgcCA9IEFuY2hvclV0aWwuZ2V0Q2xvc2VzdFBvaW50KHBvaW50cywgcmVmZXJlbmNlKTsKLQkJaWYgKHAgIT0gbnVsbCkgewotCQkJUmVjdGFuZ2xlIHIgPSBmLmdldEJvdW5kcygpLmdldENvcHkoKTsKLQkJCWYudHJhbnNsYXRlVG9BYnNvbHV0ZShyKTsKLQkJCXAucGVyZm9ybVRyYW5zbGF0ZSgtci54LCAtci55KTsKLQkJfQotCQlyZXR1cm4gcDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvRGVzY3JpcHRvck5vZGVFZGl0UGFydC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9EZXNjcmlwdG9yTm9kZUVkaXRQYXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhN2E2NGIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9EZXNjcmlwdG9yTm9kZUVkaXRQYXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZWRpdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5maWd1cmVzLkltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5BY3Rpdml0eURldGFpbERpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTGlua2VkT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5hbWVkTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLlJvbGVOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLlRhc2tOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLldvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BcnRpZmFjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuT3V0Y29tZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi50b29scy5EaXJlY3RFZGl0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRleHRDZWxsRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotCi0vKioKLSAqIEVkaXRQYXJ0IGZvciBXb3JrQnJlYWtkb3duIEVsZW1lbnRzIGluIGFuIEFjdGl2aXR5LgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRGVzY3JpcHRvck5vZGVFZGl0UGFydCBleHRlbmRzIE5hbWVkTm9kZUVkaXRQYXJ0IHsKLQotCXB1YmxpYyBEZXNjcmlwdG9yTm9kZUVkaXRQYXJ0KE5hbWVkTm9kZSBtb2RlbCkgewotCQlzdXBlcihtb2RlbCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0Lk5hbWVkTm9kZUVkaXRQYXJ0I2dldEltYWdlKCkKLQkgKi8KLQlwcm90ZWN0ZWQgSW1hZ2UgZ2V0SW1hZ2UoKSB7Ci0JCU9iamVjdCBtb2RlbCA9IGdldE1vZGVsKCk7Ci0JCWlmIChtb2RlbCBpbnN0YW5jZW9mIFJvbGVOb2RlKSB7Ci0JCQlpZigoKE5vZGUpbW9kZWwpLmdldERpYWdyYW0oKSBpbnN0YW5jZW9mIEFjdGl2aXR5RGV0YWlsRGlhZ3JhbSkKLQkJCQlyZXR1cm4gSW1hZ2VzLlJPTEVfREVTQ1JJUFRPUl8xNjsKLQkJCXJldHVybiBJbWFnZXMuUk9MRTsKLQkJfSBlbHNlIGlmIChtb2RlbCBpbnN0YW5jZW9mIFRhc2tOb2RlKSB7Ci0JCQlpZigoKE5vZGUpbW9kZWwpLmdldERpYWdyYW0oKSBpbnN0YW5jZW9mIEFjdGl2aXR5RGV0YWlsRGlhZ3JhbSkKLQkJCQlyZXR1cm4gSW1hZ2VzLlRBU0tfREVTQ1JJUFRPUl8xNjsKLQkJCXJldHVybiBJbWFnZXMuVEFTS19ERVNDUklQVE9SOwotCQl9IGVsc2UgaWYgKG1vZGVsIGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZSkgewotCQkJaWYoKChOb2RlKW1vZGVsKS5nZXREaWFncmFtKCkgaW5zdGFuY2VvZiBBY3Rpdml0eURldGFpbERpYWdyYW0pCi0JCQkJcmV0dXJuIEltYWdlcy5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl8xNjsKLQkJCVdvcmtQcm9kdWN0RGVzY3JpcHRvciB3cGQgPSAoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSAoKExpbmtlZE9iamVjdCkgbW9kZWwpCi0JCQkJCS5nZXRPYmplY3QoKTsKLQkJCVdvcmtQcm9kdWN0IHdwID0gd3BkLmdldFdvcmtQcm9kdWN0KCk7Ci0JCQlpZiAod3AgaW5zdGFuY2VvZiBBcnRpZmFjdCkgewotCQkJCXJldHVybiBJbWFnZXMuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfMTY7Ci0JCQl9IGVsc2UgaWYgKHdwIGluc3RhbmNlb2YgRGVsaXZlcmFibGUpIHsKLQkJCQlyZXR1cm4gSW1hZ2VzLkRFTElWRVJBQkxFOwotCQkJfSBlbHNlIGlmICh3cCBpbnN0YW5jZW9mIE91dGNvbWUpIHsKLQkJCQlyZXR1cm4gSW1hZ2VzLk9VVENPTUU7Ci0JCQl9Ci0JCQlyZXR1cm4gSW1hZ2VzLldPUktfUFJPRFVDVF9ERVNDUklQVE9SXzE2OwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZWRpdC5OYW1lZE5vZGVFZGl0UGFydCNjcmVhdGVEaXJlY3RFZGl0UG9saWN5KCkgKgotCSAqLwotCXByb3RlY3RlZCBEaXJlY3RFZGl0TWFuYWdlciBjcmVhdGVEaXJlY3RFZGl0TWFuYWdlcigpIHsKLQkJTGFiZWwgbCA9IChMYWJlbCkgZ2V0RmlndXJlKCk7Ci0JCXJldHVybiBuZXcgVmFsaWRhdGluZ0RpcmVjdEVkaXRNYW5hZ2VyKHRoaXMsIFRleHRDZWxsRWRpdG9yLmNsYXNzLAotCQkJCW5ldyBMYWJlbFRleHRDZWxsRWRpdG9yTG9jYXRvcihsKSwgbCkgewotCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIHZhbGlkYXRlKFN0cmluZyB0eHQpIHsKLQkJCQlPYmplY3Qgb2JqID0gZ2V0RWRpdFBhcnQoKS5nZXRNb2RlbCgpOwotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlKSB7Ci0JCQkJCU5vZGUgbm9kZSA9IChOb2RlKSBvYmo7Ci0JCQkJCU9iamVjdCBlID0gbm9kZS5nZXRPYmplY3QoKTsKLQkJCQkJcmV0dXJuIFRuZ1V0aWwuY2hlY2tXb3JrUHJvZHVjdERlc2NyaXB0b3JQcmVzZW50YXRpb25OYW1lKAotCQkJCQkJCWUsIHR4dCwgbm9kZS5nZXREaWFncmFtKCkuZ2V0U3VwcHJlc3Npb24oKSk7Ci0JCQkJfQotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBUYXNrTm9kZSkgewotCQkJCQlOb2RlIG5vZGUgPSAoTm9kZSkgb2JqOwotCQkJCQlPYmplY3QgZSA9IG5vZGUuZ2V0T2JqZWN0KCk7Ci0JCQkJCXJldHVybiBUbmdVdGlsLmNoZWNrV29ya0JyZWFrZG93bkVsZW1lbnRQcmVzZW50YXRpb25OYW1lKGUsCi0JCQkJCQkJdHh0LCBub2RlLmdldERpYWdyYW0oKS5nZXRTdXBwcmVzc2lvbigpKTsKLQkJCQl9Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFJvbGVOb2RlKSB7Ci0JCQkJCU5vZGUgbm9kZSA9IChOb2RlKSBvYmo7Ci0JCQkJCU9iamVjdCBlID0gbm9kZS5nZXRPYmplY3QoKTsKLQkJCQkJcmV0dXJuIFRuZ1V0aWwuY2hlY2tSb2xlRGVzY3JpcHRvclByZXNlbnRhdGlvbk5hbWUoZSwgdHh0LCBub2RlLmdldERpYWdyYW0oKS5nZXRTdXBwcmVzc2lvbigpKTsKLQkJCQl9Ci0KLQkJCQlyZXR1cm4gc3VwZXIudmFsaWRhdGUodHh0KTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoU291cmNlQ29ubmVjdGlvbnMoKSB7Ci0JCXN1cGVyLnJlZnJlc2hTb3VyY2VDb25uZWN0aW9ucygpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUVkaXRQb2xpY2llcygpIHsKLQkJc3VwZXIuY3JlYXRlRWRpdFBvbGljaWVzKCk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuQ09NUE9ORU5UX1JPTEUsIG51bGwpOwotCX0KLQlwcm90ZWN0ZWQgRGlyZWN0RWRpdE1hbmFnZXIgZ2V0RGlyZWN0RWRpdE1hbmFnZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvRGlhZ3JhbUFjdGlvblNlcnZpY2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvRGlhZ3JhbUFjdGlvblNlcnZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmNjNDU3NS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L0RpYWdyYW1BY3Rpb25TZXJ2aWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MTQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZWRpdDsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmNvbW1hbmRzLkNoYW5nZUJvdW5kc0NvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuY29tbWFuZHMuUmVjb25uZWN0TGlua0NvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYudXRpbC5EaWFncmFtVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5EZWZhdWx0RWRpdERvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuR3JhcGhpY2FsVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kU3RhY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwYXJ0cy5BYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi51aS5hY3Rpb25zLkFjdGlvblJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci0KLS8qKgotICogU2VydmljZSBjbGFzcyB0byBhbGxvdyBjcmVhdGUgYW5kIHJlZ2lzdGVyIGNvbW1vbiBhY3Rpb24gdG8gdGhlIGFjdGlvbgotICogcmVnaXN0ZXIuIE1vc3Qgb2YgdGhlIGNvZGUgYXJlIG1vdmVkIGZyb20gdGhlIEVkaXRvciBjbGFzcy4KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIERpYWdyYW1BY3Rpb25TZXJ2aWNlIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFMSUdOX0hPUlpfQVZFUkFHRSA9ICJhbGlnbl9ob3Jpem9udGFsX3RvX2F2ZXJhZ2UiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBTElHTl9IT1JaX0ZJUlNUX1NFTEVDVEVEID0gImFsaWduX2hvcml6b250YWxfdG9fZmlyc3Rfc2VsZWN0aW9uIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUxJR05fVkVSVF9BVkVSQUdFID0gImFsaWduX3ZlcnRpY2FsX3RvX2F2ZXJhZ2UiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBTElHTl9WRVJUX0ZJUlNUX1NFTEVDVEVEID0gImFsaWduX3ZlcnRpY2FsX3RvX2ZpcnN0X3NlbGVjdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgRGVmYXVsdEVkaXREb21haW4gZWRpdERvbWFpbjsKLQotCXByaXZhdGUgR3JhcGhpY2FsVmlld2VyIGdyYXBoaWNhbFZpZXdlcjsKLQotCXByaXZhdGUgQWN0aW9uUmVnaXN0cnkgYWN0aW9uUmVnaXN0cnk7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciAKLQkgKiBAcGFyYW0gZ3JhcGhpY2FsVmlld2VyIHtAbGluayBHcmFwaGljYWxWaWV3ZXJ9Ci0JICogQHBhcmFtIGVkaXREb21haW4gCXtAbGluayBEZWZhdWx0RWRpdERvbWFpbn0KLQkgKiBAcGFyYW0gYWN0aW9uUmVnaXN0cnkgCXtAbGluayBBY3Rpb25SZWdpc3RyeX0KLQkgKi8KLQlwdWJsaWMgRGlhZ3JhbUFjdGlvblNlcnZpY2UoR3JhcGhpY2FsVmlld2VyIGdyYXBoaWNhbFZpZXdlciwKLQkJCURlZmF1bHRFZGl0RG9tYWluIGVkaXREb21haW4sIEFjdGlvblJlZ2lzdHJ5IGFjdGlvblJlZ2lzdHJ5KSB7Ci0JCXRoaXMuZ3JhcGhpY2FsVmlld2VyID0gZ3JhcGhpY2FsVmlld2VyOwotCQl0aGlzLmVkaXREb21haW4gPSBlZGl0RG9tYWluOwotCQl0aGlzLmFjdGlvblJlZ2lzdHJ5ID0gYWN0aW9uUmVnaXN0cnk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgR3JhcGhpY2FsVmlld2VyLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEdyYXBoaWNhbFZpZXdlcihHcmFwaGljYWxWaWV3ZXIgZ3JhcGhpY2FsVmlld2VyKSB7Ci0JCXRoaXMuZ3JhcGhpY2FsVmlld2VyID0gZ3JhcGhpY2FsVmlld2VyOwotCX0KLQotCS8qKgotCSAqIHJldHVybnMgR3JhcGhpY2FsVmlld2VyCi0JICovCi0JcHJpdmF0ZSBHcmFwaGljYWxWaWV3ZXIgZ2V0R3JhcGhpY2FsVmlld2VyKCkgewotCQlyZXR1cm4gZ3JhcGhpY2FsVmlld2VyOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGNvbW1hbmQgc3RhY2suCi0JICogCi0JICogQHJldHVybiB0aGUgY29tbWFuZCBzdGFjawotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kU3RhY2sgZ2V0Q29tbWFuZFN0YWNrKCkgewotCQlyZXR1cm4gZ2V0RWRpdERvbWFpbigpLmdldENvbW1hbmRTdGFjaygpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGVkaXQgZG9tYWluLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGVkaXQgZG9tYWluCi0JICovCi0JcHJvdGVjdGVkIERlZmF1bHRFZGl0RG9tYWluIGdldEVkaXREb21haW4oKSB7Ci0JCXJldHVybiBlZGl0RG9tYWluOwotCX0KLQotCXByb3RlY3RlZCBBY3Rpb25SZWdpc3RyeSBnZXRBY3Rpb25SZWdpc3RyeSgpIHsKLQkJcmV0dXJuIGFjdGlvblJlZ2lzdHJ5OwotCX0KLQotCS8qKgotCSAqIFJlZ2lzdGVyIEhvcml6b250YWxBbGlnbkF2ZXJhZ2VBY3Rpb24gYWN0aW9uLiAKLQkgKiBIb3Jpem9udGFsQWlnbkF2ZXJhZ2UgQWN0aW9uIGFsaWducyBzZWxlY3RlZCBlZGl0cGFydHMgdG8gaG9yaXpvbnRhbCBhdmVyYWdlLiAgCi0JICovCi0JcHVibGljIElBY3Rpb24gcmVnaXN0ZXJIb3Jpem9udGFsQWxpZ25BdmVyYWdlQWN0aW9uKCkgewotCQkvLyBhbGlnbiBob3Jpem9udGFsbHkgdG8gYXZlcmFnZSB5LXZhbHVlIG9mIGFsbCBub2RlcwotCQlJQWN0aW9uIGhBbGlnbkF2ZXJhZ2VBY3Rpb24gPSBuZXcgQWN0aW9uKAotCQkJCURpYWdyYW1VSVJlc291cmNlcy5BYnN0cmFjdERpYWdyYW1FZGl0b3JfaEFsaWduQXZlcmFnZUFjdGlvbl90ZXh0KSB7IAotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCWhvcml6QWxpZ25Ub0F2ZXJhZ2VTZWxlY3RlZCgpOwotCQkJfQotCi0JCQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQkJCXJldHVybiBBTElHTl9IT1JaX0FWRVJBR0U7Ci0JCQl9Ci0JCX07Ci0JCWdldEFjdGlvblJlZ2lzdHJ5KCkucmVnaXN0ZXJBY3Rpb24oaEFsaWduQXZlcmFnZUFjdGlvbik7Ci0KLQkJcmV0dXJuIGhBbGlnbkF2ZXJhZ2VBY3Rpb247Ci0JfQotCQotCS8qKgotCSAqIFJlZ2lzdGVyIEhvcml6b250YWxBbGlnbkZpcnN0U2VsZWN0ZWRBY3Rpb24gYWN0aW9uLiAKLQkgKiBIb3Jpem9udGFsQWxpZ25GaXJzdFNlbGVjdGVkQWN0aW9uIGFsaWducyBzZWxlY3RlZCBlZGl0cGFydHMgd2l0aCAKLQkgKiByZXNwZWN0IHRvIGZpcnN0IHNlbGVjdGVkIGVkaXRwYXJ0LiAKLQkgKi8KLQotCXB1YmxpYyBJQWN0aW9uIHJlZ2lzdGVySG9yaXpvbnRhbEFsaWduRmlyc3RTZWxlY3RlZEFjdGlvbigpIHsKLQkJLy8gYWxpZ24gaG9yaXpvbnRhbGx5IHRvIHktdmFsdWUgb2YgZmlyc3Qgc2VsZWN0ZWQgbm9kZQotCQlJQWN0aW9uIGhBbGlnbkZpcnN0U2VsZWN0ZWRBY3Rpb24gPSBuZXcgQWN0aW9uKAotCQkJCURpYWdyYW1VSVJlc291cmNlcy5BYnN0cmFjdERpYWdyYW1FZGl0b3JfaEFsaWduRmlyc3RTZWxlY3RlZEFjdGlvbl90ZXh0KSB7IAotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCWhvcnpBbGlnblRvRmlyc3RTZWxlY3RlZCgpOwotCQkJfQotCi0JCQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQkJCXJldHVybiBBTElHTl9IT1JaX0ZJUlNUX1NFTEVDVEVEOwotCQkJfQotCQl9OwotCQlnZXRBY3Rpb25SZWdpc3RyeSgpLnJlZ2lzdGVyQWN0aW9uKGhBbGlnbkZpcnN0U2VsZWN0ZWRBY3Rpb24pOwotCi0JCXJldHVybiBoQWxpZ25GaXJzdFNlbGVjdGVkQWN0aW9uOwotCX0KLQkKLQkvKioKLQkgKiBSZWdpc3RlciB2ZXJ0aWFsQWxpZ25BdmVyYWdlQWN0aW9uIGFjdGlvbi4gCi0JICogdmVydGlhbEFsaWduQXZlcmFnZUFjdGlvbiBhbGlnbnMgc2VsZWN0ZWQgZWRpdHBhcnRzIHZlcnRpY2FsbHkgdy5yLnQgYXZlcmFnZS4KLQkgKiAKLQkgKi8KLQkKLQlwdWJsaWMgSUFjdGlvbiByZWdpc3RlclZlcnRpY2FsQWxpZ25BdmVyYWdlQWN0aW9uKCkgewotCQkvLyBhbGlnbiB2ZXJ0aWNhbGx5IHRvIGF2ZXJhZ2UgeC12YWx1ZSBvZiBhbGwgc2VsZWN0ZWQgbm9kZXMKLQkJSUFjdGlvbiB2QWxpZ25BdmVyYWdlQWN0aW9uID0gbmV3IEFjdGlvbigKLQkJCQlEaWFncmFtVUlSZXNvdXJjZXMuQWJzdHJhY3REaWFncmFtRWRpdG9yX3ZBbGlnbkF2ZXJhZ2VBY3Rpb25fdGV4dCkgeyAKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQl2ZXJ0aWNhbEFsaWduVG9BdmVyYWdlU2VsZWN0ZWQoKTsKLQkJCX0KLQotCQkJcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJCQlyZXR1cm4gQUxJR05fVkVSVF9BVkVSQUdFOwotCQkJfQotCQl9OwotCQlnZXRBY3Rpb25SZWdpc3RyeSgpLnJlZ2lzdGVyQWN0aW9uKHZBbGlnbkF2ZXJhZ2VBY3Rpb24pOwotCi0JCXJldHVybiB2QWxpZ25BdmVyYWdlQWN0aW9uOwotCX0KLQotCS8qKgotCSAqIFJlZ2lzdGVyIHZlcnRpYWxBbGlnbkZpcnN0U2VsZWN0ZWRBY3Rpb24gYWN0aW9uLiAKLQkgKiB2ZXJ0aWFsQWxpZ25GaXJzdFNlbGVjdGVkQWN0aW9uIGFsaWducyBzZWxlY3RlZCBlZGl0cGFydHMgdmVydGljYWxseSB3LnIudCBmaXJzdCBzZWxlY3RlZC4KLQkgKiAKLQkgKi8KLQotCXB1YmxpYyBJQWN0aW9uIHJlZ2lzdGVyVmVydGljYWxBbGlnbkZpcnN0U2VsZWN0ZWRBY3Rpb24oKSB7Ci0JCS8vIGFsaWduIHZlcnRpY2FsbHkgdG8geC12YWx1ZSBvZiBmaXJzdCBzZWxlY3RlZCBub2RlCi0JCUlBY3Rpb24gdkFsaWduRmlyc3RTZWxlY3RlZEFjdGlvbiA9IG5ldyBBY3Rpb24oCi0JCQkJRGlhZ3JhbVVJUmVzb3VyY2VzLkFic3RyYWN0RGlhZ3JhbUVkaXRvcl92QWxpZ25GaXJzdFNlbGVjdGVkQWN0aW9uX3RleHQpIHsgCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJdmVydGljYWxBbGlnblRvRmlyc3RTZWxlY3RlZCgpOwotCQkJfQotCi0JCQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQkJCXJldHVybiBBTElHTl9WRVJUX0ZJUlNUX1NFTEVDVEVEOwotCQkJfQotCQl9OwotCQlnZXRBY3Rpb25SZWdpc3RyeSgpLnJlZ2lzdGVyQWN0aW9uKHZBbGlnbkZpcnN0U2VsZWN0ZWRBY3Rpb24pOwotCi0JCXJldHVybiB2QWxpZ25GaXJzdFNlbGVjdGVkQWN0aW9uOwotCX0KLQotCS8vIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQkvLyBhY3Rpb24gbWV0aG9kcwotCS8vIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQkKLQkvKiogCi0JICogQWN0aW9uIGltcGxlbWVudGF0aW9uIG1ldGhvZCBmb3IgaG9yaXpvbnRhbEFsaWduRmlyc3RlU0VsZWN0ZWRBY3Rpb24uCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgaG9yekFsaWduVG9GaXJzdFNlbGVjdGVkKCkgewotCQlMaXN0IGVkaXRQYXJ0cyA9IGdldEdyYXBoaWNhbFZpZXdlcigpLmdldFNlbGVjdGVkRWRpdFBhcnRzKCk7Ci0JCUFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQgZmlyc3RQYXJ0ID0gbnVsbDsKLQkJLy8gbG9vcCB0aHJvdWdoIGFsbCBzZWxlY3RlZCBpdGVtcywgcmVtZW1iZXIgdGhlIHktdmFsdWUgb2YgdGhlCi0JCS8vIGZpcnN0IG5vZGUsCi0JCS8vIHNldCB0aGUgZm9sbG93aW5nIG5vZGVzIHRvIHRoZSBzYW1lIHktdmFsdWUKLQkJZm9yIChpbnQgYSA9IDA7IGEgPCBlZGl0UGFydHMuc2l6ZSgpOyBhKyspIHsKLQkJCWlmIChlZGl0UGFydHMuZ2V0KGEpIGluc3RhbmNlb2YgTm9kZUVkaXRQYXJ0Ci0JCQkJCXx8IGVkaXRQYXJ0cy5nZXQoYSkgaW5zdGFuY2VvZiBOb2RlQ29udGFpbmVyRWRpdFBhcnQpIHsKLQkJCQlBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0IGVwID0gKEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQpIGVkaXRQYXJ0cwotCQkJCQkJLmdldChhKTsKLQkJCQkvLyByZW1lbWJlciB0aGUgZmlyc3QgcGFydCB3ZSBtb3ZlCi0JCQkJaWYgKGZpcnN0UGFydCA9PSBudWxsKSB7Ci0JCQkJCWZpcnN0UGFydCA9IGVwOwotCQkJCX0gZWxzZSB7Ci0JCQkJCS8vIGNhbGN1bGF0ZSB0aGUgb2Zmc2V0IGZvciBjZW50ZXJsaW5lIGFsaWdubWVudAotCQkJCQlSZWN0YW5nbGUgYm91bmRzID0gZXAuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCk7Ci0JCQkJCWludCBvZmZzZXQgPSAoaW50KSAoKGRvdWJsZSkgKGJvdW5kcy5oZWlnaHQgLSBmaXJzdFBhcnQKLQkJCQkJCQkuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCkuaGVpZ2h0KSAvIDIuMCk7Ci0JCQkJCS8vIGlzIHRoaXMgbm9kZSBpbiBhIGNvbnRhaW5lcj8KLQkJCQkJaWYgKCEoZXAuZ2V0UGFyZW50KCkgaW5zdGFuY2VvZiBEaWFncmFtRWRpdFBhcnQpKSB7Ci0JCQkJCQkvLyBuZWVkIHRvIG1vdmUgdGhlIGNvbnRhaW5lciwgYWRqdXN0IHRoZSBvZmZzZXQKLQkJCQkJCWVwID0gKEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQpIGVwLmdldFBhcmVudCgpOwotCQkJCQkJUmVjdGFuZ2xlIHBhcmVudEJvdW5kcyA9IGVwLmdldEZpZ3VyZSgpLmdldEJvdW5kcygpOwotCQkJCQkJb2Zmc2V0ICs9IGJvdW5kcy55IC0gcGFyZW50Qm91bmRzLnk7Ci0JCQkJCQlib3VuZHMgPSBwYXJlbnRCb3VuZHM7Ci0JCQkJCX0KLQkJCQkJLy8gc2VuZCB0aGUgY29tbWFuZCB0byBtb3ZlIHRoZSBub2RlCi0JCQkJCW9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kIGMgPSBuZXcgQ2hhbmdlQm91bmRzQ29tbWFuZCgKLQkJCQkJCQkoTm9kZSkgZXAuZ2V0TW9kZWwoKSwgbmV3IFBvaW50KGJvdW5kcy54LCBmaXJzdFBhcnQKLQkJCQkJCQkJCS5nZXRGaWd1cmUoKS5nZXRCb3VuZHMoKS55Ci0JCQkJCQkJCQktIG9mZnNldCksIGJvdW5kcy53aWR0aCk7Ci0JCQkJCWdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUoYyk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCQotCS8qKiAKLQkgKiBBY3Rpb24gaW1wbGVtZW50YXRpb24gbWV0aG9kIGZvciBob3Jpem9udGFsQWxpZ25BdmVyYWdlQWN0aW9uLgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIGhvcml6QWxpZ25Ub0F2ZXJhZ2VTZWxlY3RlZCgpIHsKLQkJTGlzdCBlZGl0UGFydHMgPSBnZXRHcmFwaGljYWxWaWV3ZXIoKS5nZXRTZWxlY3RlZEVkaXRQYXJ0cygpOwotCQlBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0IGZpcnN0UGFydCA9IG51bGw7Ci0JCWludCB0b3RhbCA9IDA7Ci0JCWludCB5c3VtID0gMDsKLQkJZm9yIChpbnQgYSA9IDA7IGEgPCBlZGl0UGFydHMuc2l6ZSgpOyBhKyspIHsKLQkJCWlmIChlZGl0UGFydHMuZ2V0KGEpIGluc3RhbmNlb2YgTm9kZUVkaXRQYXJ0Ci0JCQkJCXx8IGVkaXRQYXJ0cy5nZXQoYSkgaW5zdGFuY2VvZiBOb2RlQ29udGFpbmVyRWRpdFBhcnQpIHsKLQkJCQlBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0IGVwID0gKEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQpIGVkaXRQYXJ0cwotCQkJCQkJLmdldChhKTsKLQkJCQkvLyByZW1lbWJlciB0aGUgZmlyc3QgcGFydCB3ZSBtb3ZlCi0JCQkJaWYgKGZpcnN0UGFydCA9PSBudWxsKSB7Ci0JCQkJCWZpcnN0UGFydCA9IGVwOwotCQkJCX0KLQkJCQl5c3VtICs9IGVwLmdldEZpZ3VyZSgpLmdldEJvdW5kcygpLnk7Ci0JCQkJdG90YWwrKzsKLQkJCX0KLQkJfQotCQkvLyBjYWxjdWxhdGUgdGhlIGF2ZXJhZ2UgeS12YWx1ZSBmb3IgYWxsIG5vZGVzCi0JCWludCB5YXZlID0gKGludCkgKChkb3VibGUpIHlzdW0gLyAoZG91YmxlKSB0b3RhbCk7Ci0JCS8vIGxvb3AgdGhyb3VnaCBhbGwgdGhlIG5vZGVzIGFnYWluIGFuZCBzZXQgdGhlbQotCQlmb3IgKGludCBhID0gMDsgYSA8IGVkaXRQYXJ0cy5zaXplKCk7IGErKykgewotCQkJaWYgKGVkaXRQYXJ0cy5nZXQoYSkgaW5zdGFuY2VvZiBOb2RlRWRpdFBhcnQKLQkJCQkJfHwgZWRpdFBhcnRzLmdldChhKSBpbnN0YW5jZW9mIE5vZGVDb250YWluZXJFZGl0UGFydCkgewotCQkJCUFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQgZXAgPSAoQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCkgZWRpdFBhcnRzCi0JCQkJCQkuZ2V0KGEpOwotCQkJCS8vIGNhbGN1bGF0ZSB0aGUgaGVpZ2h0IGRpZmZlcmVuY2UsIHNvIHRoYXQgZWxlbWVudHMgYXJlIGFsaWduZWQKLQkJCQkvLyB0aHJvdWdoIHRoZSBjZW50ZXJsaW5lCi0JCQkJUmVjdGFuZ2xlIGJvdW5kcyA9IGVwLmdldEZpZ3VyZSgpLmdldEJvdW5kcygpOwotCQkJCWludCBvZmZzZXQgPSAoaW50KSAoKGRvdWJsZSkgKGJvdW5kcy5oZWlnaHQgLSBmaXJzdFBhcnQKLQkJCQkJCS5nZXRGaWd1cmUoKS5nZXRCb3VuZHMoKS5oZWlnaHQpIC8gMi4wKTsKLQkJCQkvLyBpcyB0aGlzIG5vZGUgaW5zaWRlIGEgY29udGFpbmVyPwotCQkJCWlmICghKGVwLmdldFBhcmVudCgpIGluc3RhbmNlb2YgRGlhZ3JhbUVkaXRQYXJ0KSkgewotCQkJCQkvLyB3ZSBuZWVkIHRvIG1vdmUgdGhlIGNvbnRhaW5lciwgYWRqdXN0IHRoZSBvZmZzZXQKLQkJCQkJZXAgPSAoQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCkgZXAuZ2V0UGFyZW50KCk7Ci0JCQkJCVJlY3RhbmdsZSBwYXJlbnRCb3VuZHMgPSBlcC5nZXRGaWd1cmUoKS5nZXRCb3VuZHMoKTsKLQkJCQkJb2Zmc2V0ICs9IGJvdW5kcy55IC0gcGFyZW50Qm91bmRzLnk7Ci0JCQkJCWJvdW5kcyA9IHBhcmVudEJvdW5kczsKLQkJCQl9Ci0JCQkJLy8gc2VuZCB0aGUgY29tbWFuZCB0byBtb3ZlIHRoZSBub2RlCi0JCQkJb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQgYyA9IG5ldyBDaGFuZ2VCb3VuZHNDb21tYW5kKAotCQkJCQkJKE5vZGUpIGVwLmdldE1vZGVsKCksCi0JCQkJCQluZXcgUG9pbnQoYm91bmRzLngsIHlhdmUgLSBvZmZzZXQpLCBib3VuZHMud2lkdGgpOwotCQkJCWdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUoYyk7Ci0JCQl9Ci0JCX0KLQotCX0KLQkvKiogCi0JICogQWN0aW9uIGltcGxlbWVudGF0aW9uIG1ldGhvZCBmb3IgdmVydGljYWxBbGlnblRvQXZlcmFnZUFjdGlvbi4KLQkgKiAKLQkgKi8KLQotCXB1YmxpYyB2b2lkIHZlcnRpY2FsQWxpZ25Ub0F2ZXJhZ2VTZWxlY3RlZCgpIHsKLQkJTGlzdCBlZGl0UGFydHMgPSBnZXRHcmFwaGljYWxWaWV3ZXIoKS5nZXRTZWxlY3RlZEVkaXRQYXJ0cygpOwotCQlBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0IGZpcnN0UGFydCA9IG51bGw7Ci0JCWludCB0b3RhbCA9IDA7Ci0JCWludCB4c3VtID0gMDsKLQkJLy8gbG9vcCB0aHJvdWdoIHRoZSBzZWxlY3RlZCBwYXJ0cwotCQlmb3IgKGludCBhID0gMDsgYSA8IGVkaXRQYXJ0cy5zaXplKCk7IGErKykgewotCQkJLy8gd2UgYXJlIG9ubHkgaW50ZXJlc3RlZCBpbiBub2RlcyBhbmQgY29udGFpbmVycwotCQkJaWYgKGVkaXRQYXJ0cy5nZXQoYSkgaW5zdGFuY2VvZiBOb2RlRWRpdFBhcnQKLQkJCQkJfHwgZWRpdFBhcnRzLmdldChhKSBpbnN0YW5jZW9mIE5vZGVDb250YWluZXJFZGl0UGFydCkgewotCQkJCUFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQgZXAgPSAoQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCkgZWRpdFBhcnRzCi0JCQkJCQkuZ2V0KGEpOwotCQkJCWlmIChmaXJzdFBhcnQgPT0gbnVsbCkgewotCQkJCQlmaXJzdFBhcnQgPSBlcDsKLQkJCQl9Ci0JCQkJLy8gc3VtIHRoZSB4IGNvb3JkaW5hdGVzIG9mIGVhY2ggZWxlbWVudAotCQkJCXhzdW0gKz0gZXAuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCkueDsKLQkJCQkvLyByZW1lbWJlciBob3cgbWFueSBzZWxlY3RlZCBlbGVtZW50cyBhcHBsaWVkIHRvIHRoaXMgb3BlcmF0aW9uCi0JCQkJdG90YWwrKzsKLQkJCX0KLQkJfQotCQkvLyBjYWxjdWxhdGUgdGhlIGF2ZXJhZ2UgeC12YWx1ZSBmb3IgYWxsIG5vZGVzCi0JCWludCB4YXZlID0gKGludCkgKChkb3VibGUpIHhzdW0gLyAoZG91YmxlKSB0b3RhbCk7Ci0JCS8vIGxvb3AgdGhyb3VnaCBhbGwgdGhlIG5vZGVzIGFnYWluIGFuZCBzZXQgdGhlbQotCQlmb3IgKGludCBhID0gMDsgYSA8IGVkaXRQYXJ0cy5zaXplKCk7IGErKykgewotCQkJaWYgKGVkaXRQYXJ0cy5nZXQoYSkgaW5zdGFuY2VvZiBOb2RlRWRpdFBhcnQKLQkJCQkJfHwgZWRpdFBhcnRzLmdldChhKSBpbnN0YW5jZW9mIE5vZGVDb250YWluZXJFZGl0UGFydCkgewotCQkJCUFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQgZXAgPSAoQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCkgZWRpdFBhcnRzCi0JCQkJCQkuZ2V0KGEpOwotCQkJCS8vIGNhbGN1bGF0ZSB0aGUgb2Zmc2V0IGZvciBjZW50ZXJsaW5lIGFsaWdubWVudAotCQkJCVJlY3RhbmdsZSBib3VuZHMgPSBlcC5nZXRGaWd1cmUoKS5nZXRCb3VuZHMoKTsKLQkJCQlpbnQgb2Zmc2V0ID0gKGludCkgKChkb3VibGUpIChib3VuZHMud2lkdGggLSBmaXJzdFBhcnQKLQkJCQkJCS5nZXRGaWd1cmUoKS5nZXRCb3VuZHMoKS53aWR0aCkgLyAyLjApOwotCQkJCS8vIGFyZSB3ZSBpbnNpZGUgYSBjb250YWluZXI/Ci0JCQkJaWYgKCEoZXAuZ2V0UGFyZW50KCkgaW5zdGFuY2VvZiBEaWFncmFtRWRpdFBhcnQpKSB7Ci0JCQkJCS8vIGFkanVzdCB0aGUgb2Zmc2V0IHNpbmNlIHdlIGhhdmUgdG8gbW92ZSB0aGUgY29udGFpbmVyCi0JCQkJCWVwID0gKEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQpIGVwLmdldFBhcmVudCgpOwotCQkJCQlSZWN0YW5nbGUgcGFyZW50Qm91bmRzID0gZXAuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCk7Ci0JCQkJCW9mZnNldCArPSBib3VuZHMueCAtIHBhcmVudEJvdW5kcy54OwotCQkJCQlib3VuZHMgPSBwYXJlbnRCb3VuZHM7Ci0JCQkJfQotCQkJCS8vIHNlbmQgdGhlIGNvbW1hbmQgdG8gbW92ZSB0aGUgZWxlbWVudAotCQkJCW9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kIGMgPSBuZXcgQ2hhbmdlQm91bmRzQ29tbWFuZCgKLQkJCQkJCShOb2RlKSBlcC5nZXRNb2RlbCgpLAotCQkJCQkJbmV3IFBvaW50KHhhdmUgLSBvZmZzZXQsIGJvdW5kcy55KSwgYm91bmRzLndpZHRoKTsKLQkJCQlnZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKGMpOwotCQkJfQotCQl9Ci0KLQl9Ci0JLyoqIAotCSAqIEFjdGlvbiBpbXBsZW1lbnRhdGlvbiBtZXRob2QgZm9yIHZlcnRpY2FsQWxpZ25Ub0ZpcnN0U2VsZWN0ZWRBY3Rpb24uCi0JICogCi0JICovCi0KLQlwdWJsaWMgdm9pZCB2ZXJ0aWNhbEFsaWduVG9GaXJzdFNlbGVjdGVkKCkgewotCQkvLyBnZXQgdGhlIHNlbGVjdGVkIGl0ZW1zCi0JCUxpc3QgZWRpdFBhcnRzID0gZ2V0R3JhcGhpY2FsVmlld2VyKCkuZ2V0U2VsZWN0ZWRFZGl0UGFydHMoKTsKLQkJQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCBhbGlnblRvUGFydCA9IG51bGw7Ci0JCS8vIGZpbmQgdGhlIGZpcnN0IGRpYWdyYW0gcGFydCB3ZSBjYW4gYWxpZ24gdG8KLQkJZm9yIChpbnQgYSA9IDA7IGEgPCBlZGl0UGFydHMuc2l6ZSgpOyBhKyspIHsKLQkJCWlmIChlZGl0UGFydHMuZ2V0KGEpIGluc3RhbmNlb2YgTm9kZUVkaXRQYXJ0Ci0JCQkJCXx8IGVkaXRQYXJ0cy5nZXQoYSkgaW5zdGFuY2VvZiBOb2RlQ29udGFpbmVyRWRpdFBhcnQpIHsKLQkJCQlBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0IGVwID0gKEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQpIGVkaXRQYXJ0cwotCQkJCQkJLmdldChhKTsKLQkJCQlpZiAoYWxpZ25Ub1BhcnQgPT0gbnVsbCkgewotCQkJCQkvLyByZW1lbWJlciBpdCBhbmQgc3RvcAotCQkJCQlhbGlnblRvUGFydCA9IGVwOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJLy8gbG9vcCB0aHJvdWdoIHRoZSBlbGVtZW50cyBhbmQgc2V0IHRoZWlyIG5ldyBwb3NpdGlvbgotCQlmb3IgKGludCBhID0gMDsgYSA8IGVkaXRQYXJ0cy5zaXplKCk7IGErKykgewotCQkJaWYgKGVkaXRQYXJ0cy5nZXQoYSkgaW5zdGFuY2VvZiBOb2RlRWRpdFBhcnQKLQkJCQkJfHwgZWRpdFBhcnRzLmdldChhKSBpbnN0YW5jZW9mIE5vZGVDb250YWluZXJFZGl0UGFydCkgewotCQkJCUFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQgZXAgPSAoQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCkgZWRpdFBhcnRzCi0JCQkJCQkuZ2V0KGEpOwotCQkJCS8vIHdlIGNhbiBza2lwIHRoZSBmaXJzdCBvbmUgc2luY2UgdGhpcyBpcyBhbiBhbGlnbi10bwotCQkJCWlmIChlcCAhPSBhbGlnblRvUGFydAotCQkJCQkJJiYgIShhbGlnblRvUGFydCBpbnN0YW5jZW9mIFN5bmNoQmFyTm9kZUVkaXRQYXJ0KSkgewotCQkJCQkvLyBjYWxjdWxhdGUgdGhlIG9mZnNldCBmb3IgY2VudGVybGluZSBhbGlnbm1lbnQKLQkJCQkJaWYgKCEoZXAgaW5zdGFuY2VvZiBTeW5jaEJhck5vZGVFZGl0UGFydCkpIHsKLQkJCQkJCVJlY3RhbmdsZSBib3VuZHMgPSBlcC5nZXRGaWd1cmUoKS5nZXRCb3VuZHMoKTsKLQkJCQkJCWludCBvZmZzZXQgPSAoaW50KSAoKGRvdWJsZSkgKGJvdW5kcy53aWR0aCAtIGFsaWduVG9QYXJ0Ci0JCQkJCQkJCS5nZXRGaWd1cmUoKS5nZXRCb3VuZHMoKS53aWR0aCkgLyAyLjApOwotCQkJCQkJLy8gaXMgdGhpcyBpbnNpZGUgYSBjb250YWluZXI/Ci0JCQkJCQlpZiAoIShlcC5nZXRQYXJlbnQoKSBpbnN0YW5jZW9mIERpYWdyYW1FZGl0UGFydCkpIHsKLQkJCQkJCQkvLyBhZGp1c3QgdGhlIG9mZnNldCBzaW5jZSB3ZSBhcmUgbW92aW5nIHRoZQotCQkJCQkJCS8vIGNvbnRhaW5lcgotCQkJCQkJCWVwID0gKEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQpIGVwLmdldFBhcmVudCgpOwotCQkJCQkJCVJlY3RhbmdsZSBwYXJlbnRCb3VuZHMgPSBlcC5nZXRGaWd1cmUoKS5nZXRCb3VuZHMoKTsKLQkJCQkJCQlvZmZzZXQgKz0gYm91bmRzLnggLSBwYXJlbnRCb3VuZHMueDsKLQkJCQkJCQlib3VuZHMgPSBwYXJlbnRCb3VuZHM7Ci0JCQkJCQl9Ci0JCQkJCQkvLyBzZW5kIHRoZSBjb21tYW5kIHRvIG1vdmUgdGhlIGVsZW1lbnQKLQkJCQkJCW9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kIGMgPSBuZXcgQ2hhbmdlQm91bmRzQ29tbWFuZCgKLQkJCQkJCQkJKE5vZGUpIGVwLmdldE1vZGVsKCksIG5ldyBQb2ludChhbGlnblRvUGFydAotCQkJCQkJCQkJCS5nZXRGaWd1cmUoKS5nZXRCb3VuZHMoKS54Ci0JCQkJCQkJCQkJLSBvZmZzZXQsIGJvdW5kcy55KSwgYm91bmRzLndpZHRoKTsKLQkJCQkJCWdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUoYyk7Ci0JCQkJCQllcC5nZXRGaWd1cmUoKS5zZXRMb2NhdGlvbigKLQkJCQkJCQkJbmV3IFBvaW50KGFsaWduVG9QYXJ0LmdldEZpZ3VyZSgpLmdldEJvdW5kcygpLngKLQkJCQkJCQkJCQktIG9mZnNldCwgYm91bmRzLnkpKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCVBvaW50IHRwID0gZXAuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCkuZ2V0TG9jYXRpb24oKTsKLQkJCQkJCWJvb2xlYW4gY29ubmVjdGVkID0gZmFsc2U7Ci0JCQkJCQlib29sZWFuIHNvdXJjZSA9IGZhbHNlOwotCQkJCQkJUG9pbnQgZW5kUG9pbnQgPSBudWxsOwotCQkJCQkJTGlua0VkaXRQYXJ0IGxwID0gbnVsbDsKLQkJCQkJCS8vIGNoZWNrIHRhcmdldCBjb25uZWN0aW9ucwotCQkJCQkJTGlzdCBsaXN0ID0gKChOb2RlRWRpdFBhcnQpIGVwKS5nZXRUYXJnZXRDb25uZWN0aW9ucygpOwotCQkJCQkJZm9yIChJdGVyYXRvciBpdG9yID0gbGlzdC5pdGVyYXRvcigpOyBpdG9yLmhhc05leHQoKTspIHsKLQkJCQkJCQlscCA9IChMaW5rRWRpdFBhcnQpIGl0b3IubmV4dCgpOwotCQkJCQkJCWlmIChscC5nZXRTb3VyY2UoKS5lcXVhbHMoYWxpZ25Ub1BhcnQpKSB7Ci0JCQkJCQkJCWVuZFBvaW50ID0gKChMaW5rKSBscC5nZXRNb2RlbCgpKQotCQkJCQkJCQkJCS5nZXRUYXJnZXRFbmRQb2ludCgpOwotCQkJCQkJCQl0cCA9IHRwLmdldFRyYW5zbGF0ZWQoZW5kUG9pbnQpOwotCQkJCQkJCQljb25uZWN0ZWQgPSB0cnVlOwotCQkJCQkJCQlicmVhazsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQkvLyBjaGVjayBzb3VyY2UgY29ubmVjdGlvbnMgaWYgbm90IGZvdW5kIGluIHRhcmdldCBjb25uZWN0aW9ucwotCQkJCQkJaWYgKCFjb25uZWN0ZWQpIHsKLQkJCQkJCQlsaXN0ID0gKChOb2RlRWRpdFBhcnQpIGVwKS5nZXRTb3VyY2VDb25uZWN0aW9ucygpOwotCQkJCQkJCWZvciAoSXRlcmF0b3IgaXRvciA9IGxpc3QuaXRlcmF0b3IoKTsgaXRvcgotCQkJCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCQkJbHAgPSAoTGlua0VkaXRQYXJ0KSBpdG9yLm5leHQoKTsKLQkJCQkJCQkJaWYgKGxwLmdldFRhcmdldCgpLmVxdWFscyhhbGlnblRvUGFydCkpIHsKLQkJCQkJCQkJCWVuZFBvaW50ID0gKChMaW5rKSBscC5nZXRNb2RlbCgpKQotCQkJCQkJCQkJCQkuZ2V0U291cmNlRW5kUG9pbnQoKTsKLQkJCQkJCQkJCXRwID0gdHAuZ2V0VHJhbnNsYXRlZChlbmRQb2ludCk7Ci0JCQkJCQkJCQljb25uZWN0ZWQgPSB0cnVlOwotCQkJCQkJCQkJc291cmNlID0gdHJ1ZTsKLQkJCQkJCQkJCWJyZWFrOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJaWYgKGNvbm5lY3RlZCAmJiAoYWxpZ25Ub1BhcnQgaW5zdGFuY2VvZiBOb2RlRWRpdFBhcnQpKSB7Ci0JCQkJCQkJCQlQb2ludCBjZW50ZXJQb2ludCA9IGFsaWduVG9QYXJ0LmdldEZpZ3VyZSgpCi0JCQkJCQkJCQkJCS5nZXRCb3VuZHMoKS5nZXRDZW50ZXIoKTsKLQkJCQkJCQkJCWludCBkZWx0YSA9IGNlbnRlclBvaW50LnggLSB0cC54OwotCQkJCQkJCWVuZFBvaW50LnggKz0gZGVsdGE7Ci0JCQkJCQkJCQlSZWNvbm5lY3RMaW5rQ29tbWFuZCBjID0gbmV3IFJlY29ubmVjdExpbmtDb21tYW5kKAotCQkJCQkJCQkJKExpbmspIGxwLmdldE1vZGVsKCksIChOb2RlKSBlcC5nZXRNb2RlbCgpLAotCQkJCQkJCQkJc291cmNlKTsKLQkJCQkJCQljLnNldEVuZFBvaW50KGVuZFBvaW50KTsKLQkJCQkJCQkJCWdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUoYyk7Ci0JCQkJCQl9Ci0KLQkJCQkJfQotCQkJCX0KLQkJCQkvLyBJZiBmaXJzdCBzZWxlY3RlZCBlZGl0IHBhcnQgaXMgc3luY2Jhcm5vZGVlZGl0cGFydCwgbmVlZCB0bwotCQkJCS8vIGhhbmRsZSBkaWZmZXJlbnRseQotCQkJCWlmIChlcCAhPSBhbGlnblRvUGFydAotCQkJCQkJJiYgKGFsaWduVG9QYXJ0IGluc3RhbmNlb2YgU3luY2hCYXJOb2RlRWRpdFBhcnQpKSB7Ci0KLQkJCQkJUG9pbnQgc3AgPSBhbGlnblRvUGFydC5nZXRGaWd1cmUoKS5nZXRCb3VuZHMoKQotCQkJCQkJCS5nZXRMb2NhdGlvbigpOwotCQkJCQlib29sZWFuIGNvbm5lY3RlZCA9IGZhbHNlOwotCQkJCQkvLyBjaGVjayBpZiB0aGUgcGFydCBpcyBjb25uZWN0ZWQgdmlhIHNvdXJjZSBjb25uZWN0aW9ucwotCQkJCQlMaXN0IGxpc3QgPSAoKE5vZGVFZGl0UGFydCkgYWxpZ25Ub1BhcnQpCi0JCQkJCQkJLmdldFNvdXJjZUNvbm5lY3Rpb25zKCk7Ci0JCQkJCWZvciAoSXRlcmF0b3IgaXRvciA9IGxpc3QuaXRlcmF0b3IoKTsgaXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlMaW5rRWRpdFBhcnQgbHAgPSAoTGlua0VkaXRQYXJ0KSBpdG9yLm5leHQoKTsKLQkJCQkJCWlmIChscC5nZXRUYXJnZXQoKS5lcXVhbHMoZXApKSB7Ci0JCQkJCQkJUG9pbnQgc291cmNlRW5kUG9pbnQgPSAoKExpbmspIGxwLmdldE1vZGVsKCkpCi0JCQkJCQkJCQkuZ2V0U291cmNlRW5kUG9pbnQoKTsKLQkJCQkJCQlzcCA9IHNwLmdldFRyYW5zbGF0ZWQoc291cmNlRW5kUG9pbnQpOwotCQkJCQkJCWNvbm5lY3RlZCA9IHRydWU7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJLy8gaWYgbm90IGZvdW5kIGFib3ZlLCBjaGVjayBpZiBpdCBpcyBjb25uZWN0ZWQgdmlhIHRhcmdldCBjb25uZWN0aW9ucwotCQkJCQlpZiAoIWNvbm5lY3RlZCkgewotCQkJCQkJbGlzdCA9ICgoTm9kZUVkaXRQYXJ0KSBhbGlnblRvUGFydCkKLQkJCQkJCQkJLmdldFRhcmdldENvbm5lY3Rpb25zKCk7Ci0JCQkJCQlmb3IgKEl0ZXJhdG9yIGl0b3IgPSBsaXN0Lml0ZXJhdG9yKCk7IGl0b3IuaGFzTmV4dCgpOykgewotCQkJCQkJCUxpbmtFZGl0UGFydCBscCA9IChMaW5rRWRpdFBhcnQpIGl0b3IubmV4dCgpOwotCQkJCQkJCWlmIChscC5nZXRTb3VyY2UoKS5lcXVhbHMoZXApKSB7Ci0JCQkJCQkJCVBvaW50IHRhcmdldEVuZFBvaW50ID0gKChMaW5rKSBscC5nZXRNb2RlbCgpKQotCQkJCQkJCQkJCS5nZXRUYXJnZXRFbmRQb2ludCgpOwotCQkJCQkJCQlzcCA9IHNwLmdldFRyYW5zbGF0ZWQodGFyZ2V0RW5kUG9pbnQpOwotCQkJCQkJCQljb25uZWN0ZWQgPSB0cnVlOwotCQkJCQkJCQlicmVhazsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJaWYgKGVwIGluc3RhbmNlb2YgU3luY2hCYXJOb2RlRWRpdFBhcnQpIHsKLQkJCQkJCVBvaW50IHRwID0gKChOb2RlKSBlcC5nZXRNb2RlbCgpKS5nZXRMb2NhdGlvbigpCi0JCQkJCQkJCS5nZXRDb3B5KCk7Ci0JCQkJCQlQb2ludCBhbGlnblRvQ2VudGVyID0gYWxpZ25Ub1BhcnQuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCkuZ2V0Q2VudGVyKCk7Ci0JCQkJCQlQb2ludCBjZW50ZXJQb2ludCA9IGVwLmdldEZpZ3VyZSgpLmdldEJvdW5kcygpLmdldENlbnRlcigpOwotCQkJCQkJaW50IGRlbHRhID0gYWxpZ25Ub0NlbnRlci54IC0gY2VudGVyUG9pbnQueDsKLQkJCQkJCXRwLnggPSB0cC54ICsgZGVsdGE7Ci0JCQkJCQlvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZCBjID0gbmV3IENoYW5nZUJvdW5kc0NvbW1hbmQoCi0JCQkJCQkJCShOb2RlKSBlcC5nZXRNb2RlbCgpLCB0cCwgZXAuZ2V0RmlndXJlKCkKLQkJCQkJCQkJCQkuZ2V0Qm91bmRzKCkud2lkdGgpOwotCQkJCQkJZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShjKTsKLQkJCQkJCWVwLmdldEZpZ3VyZSgpLnNldExvY2F0aW9uKG5ldyBQb2ludCh0cC54LCB0cC55KSk7Ci0JCQkJCX0gZWxzZSBpZiAoZXAgaW5zdGFuY2VvZiBOb2RlRWRpdFBhcnQpIHsKLQkJCQkJCVBvaW50IHRwID0gKChOb2RlKSBlcC5nZXRNb2RlbCgpKS5nZXRMb2NhdGlvbigpCi0JCQkJCQkJCS5nZXRDb3B5KCk7Ci0JCQkJCQlQb2ludCBjZW50ZXJQb2ludCA9IGVwLmdldEZpZ3VyZSgpLmdldEJvdW5kcygpCi0JCQkJCQkJCS5nZXRDZW50ZXIoKTsKLQkJCQkJCWludCBkZWx0YSA9IHNwLnggLSBjZW50ZXJQb2ludC54OwotCQkJCQkJdHAueCA9IHRwLnggKyBkZWx0YTsKLQkJCQkJCW9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kIGMgPSBuZXcgQ2hhbmdlQm91bmRzQ29tbWFuZCgKLQkJCQkJCQkJKE5vZGUpIGVwLmdldE1vZGVsKCksIHRwLCBlcC5nZXRGaWd1cmUoKQotCQkJCQkJCQkJCS5nZXRCb3VuZHMoKS53aWR0aCk7Ci0JCQkJCQlnZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKGMpOwotCQkJCQkJZXAuZ2V0RmlndXJlKCkuc2V0TG9jYXRpb24obmV3IFBvaW50KHRwLngsIHRwLnkpKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9EaWFncmFtRWRpdFBhcnQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvRGlhZ3JhbUVkaXRQYXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0ZTc0MWMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9EaWFncmFtRWRpdFBhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5GcmVlZm9ybUxheWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5GcmVlZm9ybUxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTWFyZ2luQm9yZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Qb2x5bGluZUNvbm5lY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludExpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5jb21tYW5kcy5DaGFuZ2VCb3VuZHNDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQucG9saWNpZXMuRGlhZ3JhbUxheW91dEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5EaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuR3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5Sb290Q29tcG9uZW50RWRpdFBvbGljeTsKLQotLyoqCi0gKiBQcm92aWRlcyBFZGl0UGFydCBmb3IgRGlhZ3JhbS4gSGFuZGxlcyB0aGUgYmFzaWMgbGF5b3V0IG1lY2hhbmlzbQotICogaWYgdGhlIGNoaWxkcmVuIGxvY2F0aW9uIGlzIG5vdCBzZXQgaW4gdGhlIGRpYWdyYW0uICAKLSAqICAgCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBza2Fubm9vcgotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRGlhZ3JhbUVkaXRQYXJ0IGV4dGVuZHMgTm9kZUNvbnRhaW5lckVkaXRQYXJ0IHsKLQotCVBvaW50IGNhY2hlZFBvaW50ID0gbmV3IFBvaW50KC0xLCAtMSk7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBkZWJ1ZzsKLQotCXByaXZhdGUgYm9vbGVhbiBtYXJrRGlydHkgPSBmYWxzZTsKLQotCXN0YXRpYyBpbnQgY2FjaGVkV2lkdGggPSAxMDsKLQotCXN0YXRpYyBpbnQgY2FjaGVkSGVpZ2h0ID0gMTA7Ci0KLQlwdWJsaWMgRGlhZ3JhbUVkaXRQYXJ0KERpYWdyYW0gbW9kZWwpIHsKLQkJc3VwZXIobW9kZWwpOwotCQlkZWJ1ZyA9IEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5pc0RlYnVnZ2luZygpOwotCX0KLQotCXByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZUZpZ3VyZSgpIHsKLQkJRmlndXJlIGYgPSBuZXcgRnJlZWZvcm1MYXllcigpIHsKLQkJCXByb3RlY3RlZCB2b2lkIGxheW91dCgpIHsKLQkJCQlpZiAoaGFzTWlzcGxhY2VkQ2hpbGRyZW4oKSkgewotCQkJCQlyZXNldENoaWxkcmVuTG9jYXRpb25zKCk7Ci0JCQkJfQotCQkJCXN1cGVyLmxheW91dCgpOwotCQkJfQotCi0JCX07Ci0KLQkJZi5zZXRCb3JkZXIobmV3IE1hcmdpbkJvcmRlcigyMCkpOwotCQlmLnNldExheW91dE1hbmFnZXIobmV3IEZyZWVmb3JtTGF5b3V0KCkpOwotCQlyZXR1cm4gZjsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZXNldENoaWxkcmVuTG9jYXRpb25zKCkgewotCQlpbnQgeSA9IDEwOwotCQlmaW5hbCBpbnQgc3BhY2luZyA9IDQwOwotCQlpbnQgb2NjdXBpZWQgPSAwOwotCQlpbnQgeGVsZW1lbnRzID0gMDsKLQkJaW50IHggPSAxMDsKLQkJYm9vbGVhbiBsb2NrZWQgPSBUbmdVdGlsLmlzTG9ja2VkKChFT2JqZWN0KSgoRGlhZ3JhbSlnZXRNb2RlbCgpKS5nZXRPYmplY3QoKSk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGdldENoaWxkcmVuKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgY2hpbGQgPSBpdGVyLm5leHQoKTsKLQkJCWlmIChjaGlsZCBpbnN0YW5jZW9mIEdyYXBoaWNhbEVkaXRQYXJ0KSB7Ci0JCQkJR3JhcGhpY2FsRWRpdFBhcnQgcGFydCA9IChHcmFwaGljYWxFZGl0UGFydCkgY2hpbGQ7Ci0JCQkJaW50IHdpZHRoID0gcGFydC5nZXRSb290KCkuZ2V0Vmlld2VyKCkuZ2V0Q29udHJvbCgpLmdldEJvdW5kcygpLndpZHRoOwotCQkJCWlmIChwYXJ0LmdldE1vZGVsKCkgaW5zdGFuY2VvZiBOb2RlKSB7Ci0JCQkJCU5vZGUgbm9kZSA9IChOb2RlKSBwYXJ0LmdldE1vZGVsKCk7Ci0JCQkJCVBvaW50IHAgPSBub2RlLmdldExvY2F0aW9uKCkuZ2V0Q29weSgpOwotCQkJCQlpZiAocCA9PSBudWxsIHx8IHAueCA9PSAtMSkgewotCQkJCQkJaWYgKHggKyBwYXJ0LmdldEZpZ3VyZSgpLmdldFByZWZlcnJlZFNpemUoKS53aWR0aCA+IHdpZHRoKSB7Ci0JCQkJCQkJeSA9IGNhY2hlZFBvaW50LnkgKyBjYWNoZWRIZWlnaHQgKyBzcGFjaW5nOwotCQkJCQkJCXhlbGVtZW50cyA9IDA7Ci0JCQkJCQkJeCA9IDEwOwotCQkJCQkJCWNhY2hlZFBvaW50LnggPSAtMTsKLQkJCQkJCQlvY2N1cGllZCA9IDA7Ci0JCQkJCQl9Ci0JCQkJCQlpZiAoY2FjaGVkUG9pbnQueCAhPSAtMSkgewotCQkJCQkJCXggPSBjYWNoZWRQb2ludC54ICsgY2FjaGVkV2lkdGggKyBzcGFjaW5nOwotCQkJCQkJfQotCQkJCQkJKyt4ZWxlbWVudHM7Ci0JCQkJCQlpZiAocCA9PSBudWxsKSB7Ci0JCQkJCQkJcCA9IG5ldyBQb2ludCgtMSwgLTEpOwotCQkJCQkJfQotCQkJCQkJcC54ID0geDsKLQkJCQkJCXAueSA9IHk7Ci0JCQkJCQkvL25vZGUuc2V0TG9jYXRpb24ocCk7Ci0JCQkJCQkvL09uIG9wZW5pbmcgYSBBRCBkaWFncmFtLCBlZGl0b3Igc2hvdWxkIGJlIG1hcmtlZCBkaXJ0eS4KLQkJCQkJCS8vSWYgZGlhZ3JhbSBpcyBub3Qgc2F2ZWQsIGNhbm5vdCBiZSBicm93c2VkLiBGb3JjaW5nIHRvIHNhdmUgdGhlIGRpYWdyYW0gb25jZS4KLQkJCQkJCWlmICghbG9ja2VkICYmICgoRGlhZ3JhbSkgZ2V0TW9kZWwoKSkuaXNOZXcoKQotCQkJCQkJCQkmJiAhKChEaWFncmFtKSBnZXRNb2RlbCgpKS5pc1JlYWRPbmx5KCkKLQkJCQkJCQkJJiYgbWFya0RpcnR5KSB7Ci0JCQkJCQkJQ2hhbmdlQm91bmRzQ29tbWFuZCBjYmMgPSBuZXcgQ2hhbmdlQm91bmRzQ29tbWFuZChub2RlLCBwLCBwYXJ0LmdldEZpZ3VyZSgpCi0JCQkJCQkJCQkJCS5nZXRQcmVmZXJyZWRTaXplKCkud2lkdGgpOwotCQkJCQkJCWdldFZpZXdlcigpLmdldEVkaXREb21haW4oKS5nZXRDb21tYW5kU3RhY2soKQotCQkJCQkJCQkJLmV4ZWN1dGUoY2JjKTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJLy8gSWYgUGx1Z2luIGlzIExvY2tlZDogRG8gYXV0by1sYXlvdXQgYW5kIGRvbm90Ci0JCQkJCQkJLy8gc2F2ZSB0byBtb2RlbC4KLQkJCQkJCQlub2RlLnNldExvY2F0aW9uKHApOwotCQkJCQkJfQotCQkJCQkJCi0JCQkJCQljYWNoZWRQb2ludCA9IHA7Ci0JCQkJCQljYWNoZWRXaWR0aCA9IHBhcnQuZ2V0RmlndXJlKCkuZ2V0UHJlZmVycmVkU2l6ZSgpLndpZHRoOwotCQkJCQkJY2FjaGVkSGVpZ2h0ID0gcGFydC5nZXRGaWd1cmUoKS5nZXRQcmVmZXJyZWRTaXplKCkuaGVpZ2h0OwotCQkJCQkJaWYgKGRlYnVnKSB7Ci0JCQkJCQkJU3lzdGVtLm91dAotCQkJCQkJCQkJLnByaW50bG4oIlBvaW50IDogIiArIG5ldyBQb2ludCh4LCB5KS50b1N0cmluZygpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCVN5c3RlbS5vdXQKLQkJCQkJCQkJCS5wcmludGxuKCJDYWNoZWQgOiB3aWR0aDogIiArIGNhY2hlZFdpZHRoICsgIiBIZWlnaHQgOiAiICsgY2FjaGVkSGVpZ2h0KTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQl9Ci0JCQkJCQlvY2N1cGllZCArPSB4OwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaGFzTWlzcGxhY2VkQ2hpbGRyZW4oKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGdldENoaWxkcmVuKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgY2hpbGQgPSBpdGVyLm5leHQoKTsKLQkJCWlmIChjaGlsZCBpbnN0YW5jZW9mIEVkaXRQYXJ0KSB7Ci0JCQkJT2JqZWN0IG1vZGVsID0gKChFZGl0UGFydCkgY2hpbGQpLmdldE1vZGVsKCk7Ci0JCQkJaWYgKG1vZGVsIGluc3RhbmNlb2YgTm9kZSkgewotCQkJCQlOb2RlIG5vZGUgPSAoTm9kZSkgbW9kZWw7Ci0JCQkJCVBvaW50IHAgPSBub2RlLmdldExvY2F0aW9uKCk7Ci0JCQkJCWlmIChwID09IG51bGwgfHwgcC54ID09IC0xKXsKLQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVFZGl0UG9saWNpZXMoKSB7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuQ09NUE9ORU5UX1JPTEUsCi0JCQkJbmV3IFJvb3RDb21wb25lbnRFZGl0UG9saWN5KCkpOwotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LkNPTlRBSU5FUl9ST0xFLAotCQkJCW5ldyBEaWFncmFtTGF5b3V0RWRpdFBvbGljeSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQuTm9kZUNvbnRhaW5lckVkaXRQYXJ0I2FkZFBhcnRUb0VkaXQoQ29sbGVjdGlvbiwKLQkgKiAgICAgIE9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRQYXJ0VG9FZGl0KENvbGxlY3Rpb24gcGFydHNUb0VkaXQsIE9iamVjdCBub2RlKSB7Ci0JCWlmIChub2RlIGluc3RhbmNlb2YgTm9kZUNvbnRhaW5lcikgewotCQkJTm9kZUNvbnRhaW5lckVkaXRQYXJ0IGVkaXRQYXJ0ID0gKE5vZGVDb250YWluZXJFZGl0UGFydCkgZmluZENoaWxkQnlNb2RlbChub2RlKTsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9ICgoTm9kZUNvbnRhaW5lcikgbm9kZSkuZ2V0Tm9kZXMoKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJZWRpdFBhcnQuYWRkUGFydFRvRWRpdChwYXJ0c1RvRWRpdCwgaXRlci5uZXh0KCkpOwotCQkJfQotCQl9IGVsc2UgewotCQkJc3VwZXIuYWRkUGFydFRvRWRpdChwYXJ0c1RvRWRpdCwgbm9kZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBNb3ZlcyBjb21wbGV0ZSBkaWFncmFtIGNoaWxkcmVuIHRvIGdpdmVuIGRlbHRhLiAKLQkgKiBAcGFyYW0gaW50ICAoWC1heGlzIGRlbHRhKQotCSAqIEBwYXJhbSBpbnQgIChZLWF4aXMgZGVsdGEpCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgbW92ZUZpZ3VyZShpbnQgbW92ZVgsIGludCBtb3ZlWSkgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB0aGlzLmdldENoaWxkcmVuKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgY2hpbGQgPSBpdGVyLm5leHQoKTsKLQkJCWlmIChjaGlsZCBpbnN0YW5jZW9mIEdyYXBoaWNhbEVkaXRQYXJ0KSB7Ci0JCQkJR3JhcGhpY2FsRWRpdFBhcnQgcGFydCA9IChHcmFwaGljYWxFZGl0UGFydCkgY2hpbGQ7Ci0JCQkJUmVjdGFuZ2xlIGJvdW5kcyA9IHBhcnQuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCk7Ci0JCQkJUmVjdGFuZ2xlIHIgPSBuZXcgUmVjdGFuZ2xlKG5ldyBQb2ludChib3VuZHMueCArIG1vdmVYLAotCQkJCQkJYm91bmRzLnkgKyBtb3ZlWSksIGJvdW5kcy5nZXRTaXplKCkpOwotCi0JCQkJLy8gYWxzbyBuZWVkIHRvIG1vdmUgdGhlIGJlbmQgcG9pbnRzCi0JCQkJTGlzdCBsaXN0ID0gcGFydC5nZXRTb3VyY2VDb25uZWN0aW9ucygpOwotCQkJCWZvciAoSXRlcmF0b3IgaXRvciA9IGxpc3QuaXRlcmF0b3IoKTsgaXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJCUxpbmtFZGl0UGFydCBsaW5rcGFydCA9IChMaW5rRWRpdFBhcnQpIGl0b3IubmV4dCgpOwotCQkJCQlMaW5rIGxpbmsgPSAoTGluaykgbGlua3BhcnQuZ2V0TW9kZWwoKTsKLQkJCQkJaWYgKGxpbmsuZ2V0QmVuZHBvaW50cygpLnNpemUoKSA+IDApIHsKLQkJCQkJCVBvaW50TGlzdCBwbGlzdCA9ICgoUG9seWxpbmVDb25uZWN0aW9uKSBsaW5rcGFydAotCQkJCQkJCQkuZ2V0RmlndXJlKCkpLmdldFBvaW50cygpOwotCQkJCQkJTGlzdCBwb2ludHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCQlmb3IgKGludCBpID0gMTsgaSA8IHBsaXN0LnNpemUoKSAtIDE7IGkrKykgewotCQkJCQkJCVBvaW50IHAgPSBwbGlzdC5nZXRQb2ludChpKTsKLQkJCQkJCQlwID0gcC50cmFuc2xhdGUobmV3IFBvaW50KG1vdmVYLCBtb3ZlWSkpOwotCi0JCQkJCQkJb3JnLmVjbGlwc2UuZHJhdzJkLkFic29sdXRlQmVuZHBvaW50IGJwID0gbmV3IG9yZy5lY2xpcHNlLmRyYXcyZC5BYnNvbHV0ZUJlbmRwb2ludCgKLQkJCQkJCQkJCXApOwotCQkJCQkJCXBvaW50cy5hZGQoYnApOwotCQkJCQkJfQotCi0JCQkJCQlsaW5rcGFydC5nZXRDb25uZWN0aW9uRmlndXJlKCkuc2V0Um91dGluZ0NvbnN0cmFpbnQoCi0JCQkJCQkJCXBvaW50cyk7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQl0aGlzLnNldExheW91dENvbnN0cmFpbnQocGFydCwgcGFydC5nZXRGaWd1cmUoKSwgcik7Ci0KLQkJCX0gZWxzZSB7Ci0JCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJQYXJ0IG5vdCBtb3ZlZDogIiArIGNoaWxkKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0KLQl9Ci0JLyoqCi0JICogT24gb3BlbmluZyBhIGRpYWdyYW0sIGVkaXRvciBzaG91bGQgYmUgbWFya2VkIGRpcnR5LgotCSAqIEludm9rZXIgb2YgRGlhZ3JhbUVkaXRQYXJ0IHNob3VsZCBleHBsaWNpdGx5IHNldCB0aGUgZmxhZyB0byBtYXJrIGVkaXRvciBkaXJ0eQotCSAqIG9yIG5vdC4gV2l0aG91IGhhbmRsaW5nIHRoaXMgd2lsbCBjYXVzZSBicm93c2luZyBwZXJzcGVjdGl2ZSBpbiBjb25zaXN0ZW50LiAgICAKLQkgKiBGb3IgZGVmZWN0OiBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTU2MDI5Ci0JICovCi0JcHVibGljIHZvaWQgbWFya0RpcnR5KGJvb2xlYW4gbWFya0RpcnR5KXsKLQkJdGhpcy5tYXJrRGlydHkgID0gbWFya0RpcnR5OwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L0RpYWdyYW1VcGRhdGVTZXJ2aWNlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L0RpYWdyYW1VcGRhdGVTZXJ2aWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwNzhhNDYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9EaWFncmFtVXBkYXRlU2VydmljZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjA3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuUG9zaXRpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlRvb2xiYXJMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LkRpbWVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5jb21tYW5kcy5DaGFuZ2VCb3VuZHNDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkRlZmF1bHRFZGl0RG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5HcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuR3JhcGhpY2FsVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kU3RhY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwYXJ0cy5BYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi51aS5hY3Rpb25zLkFjdGlvblJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLQotLyoqCi0gKiBTZXJ2aWNlIGNsYXNzIHRvIGFsbG93IHVwZGF0aW5nIGRpYWdyYW0gdG8gYSBkZWZhdWx0IGxheW91dC4gTW9zdCBvZiB0aGUgY29kZQotICogYXJlIG1vdmVkIGZyb20gdGhlIEVkaXRvciBjbGFzcy4KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIERpYWdyYW1VcGRhdGVTZXJ2aWNlIHsKLQotCXByaXZhdGUgRGVmYXVsdEVkaXREb21haW4gZWRpdERvbWFpbjsKLQotCXByaXZhdGUgR3JhcGhpY2FsVmlld2VyIGdyYXBoaWNhbFZpZXdlcjsKLQotCXByaXZhdGUgQWN0aW9uUmVnaXN0cnkgYWN0aW9uUmVnaXN0cnk7Ci0KLQlwdWJsaWMgRGlhZ3JhbVVwZGF0ZVNlcnZpY2UoCi0JCQlHcmFwaGljYWxWaWV3ZXIgZ3JhcGhpY2FsVmlld2VyLCBEZWZhdWx0RWRpdERvbWFpbiBlZGl0RG9tYWluLAotCQkJQWN0aW9uUmVnaXN0cnkgYWN0aW9uUmVnaXN0cnkpIHsKLQkJdGhpcy5ncmFwaGljYWxWaWV3ZXIgPSBncmFwaGljYWxWaWV3ZXI7Ci0JCXRoaXMuZWRpdERvbWFpbiA9IGVkaXREb21haW47Ci0JCXRoaXMuYWN0aW9uUmVnaXN0cnkgPSBhY3Rpb25SZWdpc3RyeTsKLQl9Ci0KLQlwcml2YXRlIEdyYXBoaWNhbFZpZXdlciBnZXRHcmFwaGljYWxWaWV3ZXIoKSB7Ci0JCXJldHVybiBncmFwaGljYWxWaWV3ZXI7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY29tbWFuZCBzdGFjay4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBjb21tYW5kIHN0YWNrCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmRTdGFjayBnZXRDb21tYW5kU3RhY2soKSB7Ci0JCXJldHVybiBnZXRFZGl0RG9tYWluKCkuZ2V0Q29tbWFuZFN0YWNrKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZWRpdCBkb21haW4uCi0JICogCi0JICogQHJldHVybiB0aGUgZWRpdCBkb21haW4KLQkgKi8KLQlwcm90ZWN0ZWQgRGVmYXVsdEVkaXREb21haW4gZ2V0RWRpdERvbWFpbigpIHsKLQkJcmV0dXJuIGVkaXREb21haW47Ci0JfQotCi0JLyoqCi0JICogTGF6aWx5IGNyZWF0ZXMgYW5kIHJldHVybnMgdGhlIGFjdGlvbiByZWdpc3RyeS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBhY3Rpb24gcmVnaXN0cnkKLQkgKi8KLQlwcm90ZWN0ZWQgQWN0aW9uUmVnaXN0cnkgZ2V0QWN0aW9uUmVnaXN0cnkoKSB7Ci0JCXJldHVybiBhY3Rpb25SZWdpc3RyeTsKLQl9Ci0KLQkvKioKLQkgKiBNZXRob2QgdXNlZCBvbmx5IGluIEFjdGl2aXR5RGV0YWlsRGlhZ3JhbSBvciBhbnkgZGlhZ3JhbSBuZWVkIGF1dG8tbGF5b3V0LgotCSAqIE1ldGhvZCB3aWxsIHZlcmlmeSByZWNlbnRseSBhZGRlZCBlZGl0cGFydHMgaW4gdGhlIEFjdGl2aXR5ZGV0YWlsZGlhZ3JhbSBlZGl0cGFydAotCSAqIGluZGlyZWN0bHkgZnJvbSBXb3JrQnJlYWtkb3duU3RydWN0dXJlIChtZWFucyBhbnkgZGVzY3JpcHRvcnMgY3JlYXRlZCBpbiB3YnMsIGNvcnJlc3BvbmRpbmcKLQkgKiBFZGl0UGFydCB3aWxsIGdldCBjcmVhdGVkIGluIEFjdGl2aXR5RGV0YWlsRGlhZ3JhbSBWaWV3ZXIpIGFuZCBkb2VzIGF1dG8tbGF5b3V0Ci0JICogYWxsIHRoZSBuZXcgYWRkZWQgZWRpdHBhcnRzIGFuZCBleGlzdGluZyBvbmVzLiAKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBjbGVhblVwRGlhZ3JhbSgpIHsKLQkJaWYgKGdldEdyYXBoaWNhbFZpZXdlcigpLmdldENvbnRlbnRzKCkgaW5zdGFuY2VvZiBBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0UGFydCkgewotCQkJQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdFBhcnQgZGVwID0gKEFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRQYXJ0KSBnZXRHcmFwaGljYWxWaWV3ZXIoKQotCQkJCQkuZ2V0Q29udGVudHMoKTsKLQkJCUxpc3QgY2hpbGRyZW4gPSBkZXAuZ2V0UmVjZW50bHlBZGRlZFBhcnRzKCk7Ci0JCQlpZiAoIWNoaWxkcmVuLmlzRW1wdHkoKSkgewotCQkJCUNvbXBhcmF0b3IgY29tcGFyYXRvciA9IG5ldyBDb21wYXJhdG9yKCkgewotCi0JCQkJCXB1YmxpYyBpbnQgY29tcGFyZShPYmplY3QgYXJnMCwgT2JqZWN0IGFyZzEpIHsKLQkJCQkJCWludCByYyA9IDA7Ci0JCQkJCQlpZiAoYXJnMCBpbnN0YW5jZW9mIFJvbGVUYXNrQ29tcG9zaXRlRWRpdFBhcnQpIHsKLQkJCQkJCQlpZiAoIShhcmcxIGluc3RhbmNlb2YgUm9sZVRhc2tDb21wb3NpdGVFZGl0UGFydCkpCi0JCQkJCQkJCXJjID0gLTE7Ci0JCQkJCQl9IGVsc2UgaWYgKGFyZzEgaW5zdGFuY2VvZiBSb2xlVGFza0NvbXBvc2l0ZUVkaXRQYXJ0KQotCQkJCQkJCXJjID0gMTsKLQkJCQkJCXJldHVybiByYzsKLQkJCQkJfQotCi0JCQkJfTsKLQotCQkJCU9iamVjdFtdIGFycmF5ID0gY2hpbGRyZW4udG9BcnJheSgpOwotCQkJCUFycmF5cy5zb3J0KGFycmF5LCBjb21wYXJhdG9yKTsKLQkJCQlmb3IgKGludCBhID0gMDsgYSA8IGFycmF5Lmxlbmd0aDsgYSsrKSB7Ci0JCQkJCUFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQgZXAgPSAoQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCkgYXJyYXlbYV07Ci0JCQkJCWFkanVzdFNpemUoZXApOwotCQkJCX0KLQkJCQlmb3IgKGludCBiID0gMDsgYiA8IGFycmF5Lmxlbmd0aDsgYisrKSB7Ci0JCQkJCUFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQgZXAgPSAoQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCkgYXJyYXlbYl07Ci0JCQkJCWNsZWFuVXAoZXApOwotCQkJCX0KLQkJCQlmb3IgKGludCBjID0gMDsgYyA8IGFycmF5Lmxlbmd0aDsgYysrKSB7Ci0JCQkJCUFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQgZXAgPSAoQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCkgYXJyYXlbY107Ci0JCQkJCXJlZHVjZUxpbmtMZW5ndGgoZXApOwotCQkJCX0KLS8vCQkJCWZvciAoaW50IGMgPSAwOyBjIDwgYXJyYXkubGVuZ3RoOyBjKyspIHsKLS8vCQkJCQlBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0IGVwID0gKEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQpIGFycmF5W2NdOwotLy8JCQkJCWlmKGVwIGluc3RhbmNlb2YgUm9sZVRhc2tDb21wb3NpdGVFZGl0UGFydCl7Ci0vLwkJCQkJCXJlc2V0U2l6ZXMoZXAsIGVwKTsKLS8vCQkJCQl9Ci0vLwkJCQl9Ci0JCQkJcGFja0RpYWdyYW0oKTsKLQkJCQlkZXAuY2xlYXJSZWNlbnRseUFkZGVkUGFydHMoKTsKLQkJCQlnZXRHcmFwaGljYWxWaWV3ZXIoKS5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKgotCXByaXZhdGUgdm9pZCByZXNldFNpemVzKEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQgZXAsIEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQgcGFyZW50KSB7Ci0JCWlmICghKGVwIGluc3RhbmNlb2YgV29ya1Byb2R1Y3RDb21wb3NpdGVFZGl0UGFydCkpIHsKLQkJCUxpc3Qgc291cmNlTGlua3MgPSBlcC5nZXRTb3VyY2VDb25uZWN0aW9ucygpOwotCQkJaWYgKHNvdXJjZUxpbmtzLnNpemUoKSA+IDApIHsKLQkJCQlmb3IgKGludCBiID0gMDsgYiA8IHNvdXJjZUxpbmtzLnNpemUoKTsgYisrKSB7Ci0JCQkJCUxpbmtFZGl0UGFydCBsaW5rID0gKExpbmtFZGl0UGFydCkgc291cmNlTGlua3MuZ2V0KGIpOwotCQkJCQlBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0IHRhcmdldCA9IChBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0KSBsaW5rCi0JCQkJCQkJLmdldFRhcmdldCgpOwotCQkJCQlpbnQgdyA9IHRhcmdldC5nZXRGaWd1cmUoKS5nZXRCb3VuZHMoKS53aWR0aDsKLQkJCQkJaW50IGV3ID0gZXAuZ2V0RmlndXJlKCkuZ2V0UHJlZmVycmVkU2l6ZSgpLndpZHRoOwotCQkJCQlpZiAodyA+IGV3KSB7Ci0JCQkJCQlQb2ludCBsb2NhdGlvbiA9IGVwLmdldEZpZ3VyZSgpLmdldEJvdW5kcygpCi0JCQkJCQkuZ2V0TG9jYXRpb24oKTsKLQkJCQkJCWxvY2F0aW9uLngrPSh3LWV3KS8yOwotCQkJCQkJQ29tbWFuZCBjID0gbmV3IENoYW5nZUJvdW5kc0NvbW1hbmQoKChOb2RlKSBlcAotCQkJCQkJCQkuZ2V0TW9kZWwoKSksIGVwLmdldEZpZ3VyZSgpLmdldEJvdW5kcygpCi0JCQkJCQkJCS5nZXRMb2NhdGlvbigpLCB3KTsKLQkJCQkJCWdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUoYyk7Ci0JCQkJCQlpbnQgaCA9IGVwLmdldEZpZ3VyZSgpLmdldFByZWZlcnJlZFNpemUoKS5oZWlnaHQ7Ci0JCQkJCQllcC5nZXRGaWd1cmUoKQotCQkJCQkJCQkuc2V0UHJlZmVycmVkU2l6ZShuZXcgRGltZW5zaW9uKHcsIGgpKTsKLQkJCQkJCWVwLmdldEZpZ3VyZSgpLnNldFNpemUobmV3IERpbWVuc2lvbih3LCBoKSk7Ci0JCQkJCX0KLQkJCQkJZ2V0R3JhcGhpY2FsVmlld2VyKCkKLQkJCQkJCQkuc2V0U2VsZWN0aW9uKAotCQkJCQkJCQkJbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24obmV3IE9iamVjdFtdIHsgZXAsCi0JCQkJCQkJCQkJCXRhcmdldCB9KSk7Ci0JCQkJCUlBY3Rpb24gdmFsaWduID0gZ2V0QWN0aW9uUmVnaXN0cnkoKS5nZXRBY3Rpb24oCi0JCQkJCQkJRGlhZ3JhbUFjdGlvblNlcnZpY2UuQUxJR05fVkVSVF9GSVJTVF9TRUxFQ1RFRCk7Ci0JCQkJCXZhbGlnbi5ydW4oKTsKLQkJCQl9Ci0JCQl9Ci0JCQlMaXN0IHRhcmdldExpbmtzID0gZXAuZ2V0VGFyZ2V0Q29ubmVjdGlvbnMoKTsKLQkJCWlmICh0YXJnZXRMaW5rcy5zaXplKCkgPiAwKSB7Ci0JCQkJZm9yIChpbnQgYiA9IDA7IGIgPCB0YXJnZXRMaW5rcy5zaXplKCk7IGIrKykgewotCQkJCQlMaW5rRWRpdFBhcnQgbGluayA9IChMaW5rRWRpdFBhcnQpIHRhcmdldExpbmtzLmdldChiKTsKLQkJCQkJQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCBzb3VyY2UgPSAoQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCkgbGluawotCQkJCQkJCS5nZXRTb3VyY2UoKTsKLQkJCQkJaW50IHcgPSBzb3VyY2UuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCkud2lkdGg7Ci0JCQkJCWludCBldyA9IGVwLmdldEZpZ3VyZSgpLmdldFByZWZlcnJlZFNpemUoKS53aWR0aDsKLQkJCQkJaWYgKHcgPiBldykgewotCQkJCQkJQ29tbWFuZCBjID0gbmV3IENoYW5nZUJvdW5kc0NvbW1hbmQoKChOb2RlKSBlcAotCQkJCQkJCQkuZ2V0TW9kZWwoKSksIGVwLmdldEZpZ3VyZSgpLmdldEJvdW5kcygpCi0JCQkJCQkJCS5nZXRMb2NhdGlvbigpLCB3KTsKLQkJCQkJCWdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUoYyk7Ci0JCQkJCQlpbnQgaCA9IGVwLmdldEZpZ3VyZSgpLmdldFByZWZlcnJlZFNpemUoKS5oZWlnaHQ7Ci0JCQkJCQllcC5nZXRGaWd1cmUoKQotCQkJCQkJCQkuc2V0UHJlZmVycmVkU2l6ZShuZXcgRGltZW5zaW9uKHcsIGgpKTsKLQkJCQkJCWVwLmdldEZpZ3VyZSgpLnNldFNpemUobmV3IERpbWVuc2lvbih3LCBoKSk7Ci0JCQkJCX0KLQkJCQkJZ2V0R3JhcGhpY2FsVmlld2VyKCkKLQkJCQkJCQkuc2V0U2VsZWN0aW9uKAotCQkJCQkJCQkJbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24obmV3IE9iamVjdFtdIHsgZXAsCi0JCQkJCQkJCQkJCXNvdXJjZSB9KSk7Ci0JCQkJCUlBY3Rpb24gdmFsaWduID0gZ2V0QWN0aW9uUmVnaXN0cnkoKS5nZXRBY3Rpb24oCi0JCQkJCQkJRGlhZ3JhbUFjdGlvblNlcnZpY2UuQUxJR05fVkVSVF9GSVJTVF9TRUxFQ1RFRCk7Ci0JCQkJCXZhbGlnbi5ydW4oKTsKLQkJCQl9Ci0JCQl9Ci0JCQlwYXJlbnQuZ2V0RmlndXJlKCkuZ2V0TGF5b3V0TWFuYWdlcigpLmxheW91dChwYXJlbnQuZ2V0RmlndXJlKCkpOwotCQkJaWYgKGVwIGluc3RhbmNlb2YgTm9kZUNvbnRhaW5lckVkaXRQYXJ0KSB7Ci0JCQkJTGlzdCBjaGlsZHJlbiA9IGVwLmdldENoaWxkcmVuKCk7Ci0JCQkJZm9yIChpbnQgZCA9IDA7IGQgPCBjaGlsZHJlbi5zaXplKCk7IGQrKykgewotCQkJCQlBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0IHAgPSAoQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCkgY2hpbGRyZW4KLQkJCQkJCQkuZ2V0KGQpOwotCQkJCQlyZXNldFNpemVzKHAsIGVwKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JKi8KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGRvZXMgYSB2ZXJ0aWNhbCBhbGlnbm1lbnQgb2YgYWxsIG5vZGVzIHdpdGggbGlua3MKLQkgKi8KLQlwcml2YXRlIHZvaWQgY2xlYW5VcChBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0IGVwKSB7Ci0JCWlmICghKGVwIGluc3RhbmNlb2YgV29ya1Byb2R1Y3RDb21wb3NpdGVFZGl0UGFydCkpIHsKLQkJCUxpc3Qgc291cmNlTGlua3MgPSBlcC5nZXRTb3VyY2VDb25uZWN0aW9ucygpOwotCQkJaWYgKHNvdXJjZUxpbmtzLnNpemUoKSA+IDApIHsKLQkJCQlmb3IgKGludCBiID0gMDsgYiA8IHNvdXJjZUxpbmtzLnNpemUoKTsgYisrKSB7Ci0JCQkJCUxpbmtFZGl0UGFydCBsaW5rID0gKExpbmtFZGl0UGFydCkgc291cmNlTGlua3MuZ2V0KGIpOwotCQkJCQlBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0IHRhcmdldCA9IChBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0KSBsaW5rCi0JCQkJCQkJLmdldFRhcmdldCgpOwotCQkJCQlpbnQgdyA9IHRhcmdldC5nZXRGaWd1cmUoKS5nZXRCb3VuZHMoKS53aWR0aDsKLQkJCQkJaW50IGV3ID0gZXAuZ2V0RmlndXJlKCkuZ2V0UHJlZmVycmVkU2l6ZSgpLndpZHRoOwotCQkJCQlpZiAodyA8IGV3KSB7Ci0JCQkJCQlDb21tYW5kIGMgPSBuZXcgQ2hhbmdlQm91bmRzQ29tbWFuZCgoKE5vZGUpIGVwCi0JCQkJCQkJCS5nZXRNb2RlbCgpKSwgdGFyZ2V0LmdldEZpZ3VyZSgpLmdldEJvdW5kcygpCi0JCQkJCQkJCS5nZXRMb2NhdGlvbigpLCB3KTsKLQkJCQkJCWdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUoYyk7Ci0JCQkJCQlpbnQgaCA9IHRhcmdldC5nZXRGaWd1cmUoKS5nZXRQcmVmZXJyZWRTaXplKCkuaGVpZ2h0OwotCQkJCQkJdGFyZ2V0LmdldEZpZ3VyZSgpCi0JCQkJCQkJCS5zZXRQcmVmZXJyZWRTaXplKG5ldyBEaW1lbnNpb24odywgaCkpOwotCQkJCQkJdGFyZ2V0LmdldEZpZ3VyZSgpLnNldFNpemUobmV3IERpbWVuc2lvbih3LCBoKSk7Ci0JCQkJCX0KLQkJCQkJZ2V0R3JhcGhpY2FsVmlld2VyKCkKLQkJCQkJCQkuc2V0U2VsZWN0aW9uKAotCQkJCQkJCQkJbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24obmV3IE9iamVjdFtdIHsgZXAsCi0JCQkJCQkJCQkJCXRhcmdldCB9KSk7Ci0JCQkJCUlBY3Rpb24gdmFsaWduID0gZ2V0QWN0aW9uUmVnaXN0cnkoKS5nZXRBY3Rpb24oCi0JCQkJCQkJRGlhZ3JhbUFjdGlvblNlcnZpY2UuQUxJR05fVkVSVF9GSVJTVF9TRUxFQ1RFRCk7Ci0JCQkJCXZhbGlnbi5ydW4oKTsKLQkJCQl9Ci0JCQl9Ci0JCQlMaXN0IHRhcmdldExpbmtzID0gZXAuZ2V0VGFyZ2V0Q29ubmVjdGlvbnMoKTsKLQkJCWlmICh0YXJnZXRMaW5rcy5zaXplKCkgPiAwKSB7Ci0JCQkJZm9yIChpbnQgYiA9IDA7IGIgPCB0YXJnZXRMaW5rcy5zaXplKCk7IGIrKykgewotCQkJCQlMaW5rRWRpdFBhcnQgbGluayA9IChMaW5rRWRpdFBhcnQpIHRhcmdldExpbmtzLmdldChiKTsKLQkJCQkJQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCBzb3VyY2UgPSAoQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCkgbGluawotCQkJCQkJCS5nZXRTb3VyY2UoKTsKLQkJCQkJaW50IHcgPSBzb3VyY2UuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCkud2lkdGg7Ci0JCQkJCWludCBldyA9IGVwLmdldEZpZ3VyZSgpLmdldFByZWZlcnJlZFNpemUoKS53aWR0aDsKLQkJCQkJaWYgKHcgPCBldykgewotCQkJCQkJQ29tbWFuZCBjID0gbmV3IENoYW5nZUJvdW5kc0NvbW1hbmQoKChOb2RlKSBlcAotCQkJCQkJCQkuZ2V0TW9kZWwoKSksIHNvdXJjZS5nZXRGaWd1cmUoKS5nZXRCb3VuZHMoKQotCQkJCQkJCQkuZ2V0TG9jYXRpb24oKSwgdyk7Ci0JCQkJCQlnZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKGMpOwotCQkJCQkJaW50IGggPSBzb3VyY2UuZ2V0RmlndXJlKCkuZ2V0UHJlZmVycmVkU2l6ZSgpLmhlaWdodDsKLQkJCQkJCXNvdXJjZS5nZXRGaWd1cmUoKQotCQkJCQkJCQkuc2V0UHJlZmVycmVkU2l6ZShuZXcgRGltZW5zaW9uKHcsIGgpKTsKLQkJCQkJCXNvdXJjZS5nZXRGaWd1cmUoKS5zZXRTaXplKG5ldyBEaW1lbnNpb24odywgaCkpOwotCQkJCQl9Ci0JCQkJCWdldEdyYXBoaWNhbFZpZXdlcigpCi0JCQkJCQkJLnNldFNlbGVjdGlvbigKLQkJCQkJCQkJCW5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKG5ldyBPYmplY3RbXSB7IGVwLAotCQkJCQkJCQkJCQlzb3VyY2UgfSkpOwotCQkJCQlJQWN0aW9uIHZhbGlnbiA9IGdldEFjdGlvblJlZ2lzdHJ5KCkuZ2V0QWN0aW9uKAotCQkJCQkJCURpYWdyYW1BY3Rpb25TZXJ2aWNlLkFMSUdOX1ZFUlRfRklSU1RfU0VMRUNURUQpOwotCQkJCQl2YWxpZ24ucnVuKCk7Ci0JCQkJfQotCQkJfQotCQkJaWYgKGVwIGluc3RhbmNlb2YgTm9kZUNvbnRhaW5lckVkaXRQYXJ0KSB7Ci0JCQkJTGlzdCBjaGlsZHJlbiA9IGVwLmdldENoaWxkcmVuKCk7Ci0JCQkJZm9yIChpbnQgZCA9IDA7IGQgPCBjaGlsZHJlbi5zaXplKCk7IGQrKykgewotCQkJCQlBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0IHAgPSAoQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCkgY2hpbGRyZW4KLQkJCQkJCQkuZ2V0KGQpOwotCQkJCQljbGVhblVwKHApOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqICBGb3IgYXV0by1sYXlvdXQsIG5lZWQgdG8gYWRqdXN0IGNvbm5lY3Rpb24ob3IgbGluaykgbGVuZ3RoLCBiYXNlZCBvbgotCSAqICBjb25uZWN0aW5nIGVkaXRwYXJ0cyhmaWd1cmVzKS4KLQkgKiAKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gcmVkdWNlTGlua0xlbmd0aChBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0IHBhcnQpIHsKLQkJYm9vbGVhbiBtb3ZlZCA9IGZhbHNlOwotCQkvLyBvbmx5IG1vdmUgbmV3IFdvcmtQcm9kdWN0Q29tcG9zaXRlIGVsZW1lbnRzCi0JCWlmIChwYXJ0IGluc3RhbmNlb2YgV29ya1Byb2R1Y3RDb21wb3NpdGVFZGl0UGFydCkgewotCQkJQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCBsaW5rZWRQYXJ0ID0gbnVsbDsKLQkJCWludCBwb3NpdGlvbiA9IFBvc2l0aW9uQ29uc3RhbnRzLkNFTlRFUjsKLQkJCS8vIGlzIHRoaXMgZWxlbWVudCBsaW5rZWQgdG8gYW5vdGhlciBpdGVtPwotCQkJaWYgKHBhcnQuZ2V0VGFyZ2V0Q29ubmVjdGlvbnMoKS5zaXplKCkgPiAwKSB7Ci0JCQkJbGlua2VkUGFydCA9IChBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0KSAoKExpbmtFZGl0UGFydCkgcGFydAotCQkJCQkJLmdldFRhcmdldENvbm5lY3Rpb25zKCkuZ2V0KDApKS5nZXRTb3VyY2UoKTsKLQkJCQlwb3NpdGlvbiA9IFBvc2l0aW9uQ29uc3RhbnRzLk5PUlRIOwotCQkJfSBlbHNlIGlmIChwYXJ0LmdldFNvdXJjZUNvbm5lY3Rpb25zKCkuc2l6ZSgpID4gMCkgewotCQkJCWxpbmtlZFBhcnQgPSAoQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCkgKChMaW5rRWRpdFBhcnQpIHBhcnQKLQkJCQkJCS5nZXRTb3VyY2VDb25uZWN0aW9ucygpLmdldCgwKSkuZ2V0VGFyZ2V0KCk7Ci0JCQkJcG9zaXRpb24gPSBQb3NpdGlvbkNvbnN0YW50cy5TT1VUSDsKLQkJCX0KLQkJCWlmIChsaW5rZWRQYXJ0ICE9IG51bGwpIHsKLQkJCQlpZiAoIShsaW5rZWRQYXJ0LmdldFBhcmVudCgpIGluc3RhbmNlb2YgRGlhZ3JhbUVkaXRQYXJ0KSkgewotCQkJCQlsaW5rZWRQYXJ0ID0gKEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQpIGxpbmtlZFBhcnQKLQkJCQkJCQkuZ2V0UGFyZW50KCk7Ci0JCQkJfQotCQkJCS8vIGdldCB0aGUgcGFydCdzIHBvc2l0aW9uCi0JCQkJUmVjdGFuZ2xlIHBhcnRCb3VuZHMgPSBwYXJ0LmdldEZpZ3VyZSgpLmdldEJvdW5kcygpOwotCQkJCS8vIGdldCB0aGUgbGlua2VkIHBhcnQncyBwb3NpdGlvbgotCQkJCVJlY3RhbmdsZSBsaW5rZWRQYXJ0Qm91bmRzID0gbGlua2VkUGFydC5nZXRGaWd1cmUoKS5nZXRCb3VuZHMoKTsKLQkJCQkvLyBkZXRlcm1pbmUgaW4gd2hpY2ggZGlyZWN0aW9uIGlzIHRoZSBsaW5rZWQgcGFydAotCQkJCS8vIGludCBwb3NpdGlvbiA9IHBhcnRCb3VuZHMuZ2V0UG9zaXRpb24obGlua2VkUGFydEJvdW5kcwotCQkJCS8vIC5nZXRMb2NhdGlvbigpKTsKLQkJCQkvLyBhc3N1bWUgaXQgaXMgYmVsb3cgdXMsIHNvIHRoaXMgcGFydCBtb3ZlcyB1cAotCQkJCWludCBkaXJlY3Rpb24gPSAtMTsKLQkJCQlpZiAoKHBvc2l0aW9uICYgUG9zaXRpb25Db25zdGFudHMuTk9SVEgpID09IFBvc2l0aW9uQ29uc3RhbnRzLk5PUlRICi0JCQkJCQl8fCAocG9zaXRpb24gJiBQb3NpdGlvbkNvbnN0YW50cy5DRU5URVIpID09IFBvc2l0aW9uQ29uc3RhbnRzLkNFTlRFUikgewotCQkJCQkvLyBhYm92ZSB1cywgbW92ZSBkb3duCi0JCQkJCWRpcmVjdGlvbiA9IDE7Ci0JCQkJfQotCQkJCS8vIHNldCBuZXcgYm91bmRzIGZvciB0aGUgcGFydCBzbyB0aGF0IGl0IHNpdGVzIGp1c3Qgb3V0c2lkZSBvZgotCQkJCS8vIHRoZSBsaW5rZWQgcGFydAotCQkJCVJlY3RhbmdsZSB0ZXN0Qm91bmRzID0gcGFydEJvdW5kcy5nZXRDb3B5KCk7Ci0JCQkJaWYgKGRpcmVjdGlvbiA9PSAxKSB7Ci0JCQkJCXRlc3RCb3VuZHMueSA9IGxpbmtlZFBhcnRCb3VuZHMueSArIGxpbmtlZFBhcnRCb3VuZHMuaGVpZ2h0Ci0JCQkJCQkJKyBWRVJUX1BJWF9QQURESU5HOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXRlc3RCb3VuZHMueSA9IGxpbmtlZFBhcnRCb3VuZHMueSAtIFZFUlRfUElYX1BBRERJTkcKLQkJCQkJCQktIHBhcnRCb3VuZHMuaGVpZ2h0OwotCQkJCX0KLQkJCQkvLyBzZXQgdGhlIG5ldyBsb2NhdGlvbiBmb3IgdGhlIHBhcnQgaW4gdGhlIG1vZGVsCi0JCQkJUG9pbnQgbnAgPSBuZXcgUG9pbnQodGVzdEJvdW5kcy54LCB0ZXN0Qm91bmRzLnkpOwotCQkJCXBhcnQuZ2V0RmlndXJlKCkuc2V0TG9jYXRpb24obnApOwotCQkJCUNvbW1hbmQgYyA9IG5ldyBDaGFuZ2VCb3VuZHNDb21tYW5kKChOb2RlKSBwYXJ0LmdldE1vZGVsKCksIG5wLAotCQkJCQkJcGFydEJvdW5kcy53aWR0aCk7Ci0JCQkJZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShjKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbW92ZWQ7Ci0JfQotCi0JLyoqCi0JICogTWV0aG9kIHRvIGFkanVzdCB0aGUgc2l6ZSBvZiBlZGl0cGFydC4gIAotCSAqIAotCSAqLwotCXByaXZhdGUgdm9pZCBhZGp1c3RTaXplKEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQgZXApIHsKLQkJaWYgKGVwIGluc3RhbmNlb2YgV29ya1Byb2R1Y3RDb21wb3NpdGVFZGl0UGFydCkgewotCQkJYWRqdXN0U2l6ZSgoTm9kZUNvbnRhaW5lckVkaXRQYXJ0KSBlcCwgMSk7Ci0JCX0KLQkJLy8gQmVsb3cgQ29kZSBnZW5lcmljIE5vZGVDb250YWluZXJFZGl0UGFydCBtb2RpZmljYXRpb24uCi0JCWVsc2UgaWYgKGVwIGluc3RhbmNlb2YgTm9kZUNvbnRhaW5lckVkaXRQYXJ0KSB7Ci0JCQkvLyBUaGlzIGlzIHRvIGFsbG93IHVzZXIgY3VzdG9taXphYmxlIAotLy8JCQlTdHJpbmcgY291bnQgPSBBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkKLS8vCQkJCQkJCS5nZXRTdHJpbmcoVGVtcGxhdGVDb25zdGFudHMuQUREX1JPTEVfVEFTS1NfQ09VTlQpOwotLy8JCQlpZihjb3VudCAhPSBudWxsIHx8IGNvdW50ICE9ICIiKXsKLS8vCQkJCWludCBpID0gSW50ZWdlci5wYXJzZUludChjb3VudCk7Ci0vLwkJCQlpZihpID4gMCl7Ci0vLwkJCQkJYWRqdXN0U2l6ZSgoTm9kZUNvbnRhaW5lckVkaXRQYXJ0KSBlcCwgaSk7Ci0vLwkJCQl9Ci0vLwkJCX1lbHNlewotLy8JCQkJYWRqdXN0U2l6ZSgoTm9kZUNvbnRhaW5lckVkaXRQYXJ0KSBlcCwgNTApOwotLy8JCQl9Ci0JCQlhZGp1c3RTaXplKChOb2RlQ29udGFpbmVyRWRpdFBhcnQpIGVwLCA1MCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgZmluYWwgc3RhdGljIGludCBIT1JJWl9QSVhfUEFERElORyA9IDMwOwotCi0JcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBpbnQgVkVSVF9QSVhfUEFERElORyA9IDIwOwotCi0JLyoqCi0JICogQWRqdXN0cyB0aGUgc2l6ZSBvZiBDb250YWluZXJFZGl0UGFydCB0byBhY2NvbW9kYXRlIG51bWJlciBvZiBlZGl0cGFydHMgaW4gYSByb3csCi0JICogcHVzaCB0aGUgcmVtYWluaW5nIHRoZSBlZGl0cGFydHMgaW4gdHdvIHNlY29uZCByb3cuIAotCSAqIFRoaXMgaXMgdXNlZnVsIGZvciB7QGxpbmsgVG9vbGJhckxheW91dH0KLQkgKiAKLQkgKi8KLQlwcml2YXRlIHZvaWQgYWRqdXN0U2l6ZShOb2RlQ29udGFpbmVyRWRpdFBhcnQgZXAsIGludCBob3JpekNvdW50KSB7Ci0JCWludCByZXF1aXJlZFdpZHRoID0gMDsKLQkJaW50IHJvd01heEhlaWdodCA9IDA7Ci0JCWludCByb3dzID0gMDsKLQkJaW50IHdpZHRoU3VtID0gMDsKLQkJaW50IGhlaWdodFN1bSA9IDA7Ci0JCWludCBjb2x1bW4gPSAwOwotCQkvL2ludCBvcmlnaW5hbFdpZHRoID0gZXAuZ2V0RmlndXJlKCkuZ2V0U2l6ZSgpLndpZHRoOwotCQlMaXN0IGNoaWxkcmVuID0gZXAuZ2V0Q2hpbGRyZW4oKTsKLQkJZm9yIChpbnQgcCA9IDA7IHAgPCBjaGlsZHJlbi5zaXplKCk7KSB7Ci0JCQlpZiAoY29sdW1uID09IDApIHsKLQkJCQlyb3dzKys7Ci0JCQl9Ci0JCQlpZiAoY29sdW1uIDwgaG9yaXpDb3VudCkgewotCQkJCUFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQgY2hpbGQgPSAoQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCkgY2hpbGRyZW4KLQkJCQkJCS5nZXQocCk7Ci0JCQkJRGltZW5zaW9uIGQgPSBjaGlsZC5nZXRGaWd1cmUoKS5nZXRQcmVmZXJyZWRTaXplKCk7Ci0JCQkJd2lkdGhTdW0gKz0gZC53aWR0aDsKLQkJCQlpZiAoZC5oZWlnaHQgPiByb3dNYXhIZWlnaHQpIHsKLQkJCQkJcm93TWF4SGVpZ2h0ID0gZC5oZWlnaHQ7Ci0JCQkJfQotCQkJCXArKzsKLQkJCQljb2x1bW4rKzsKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKHdpZHRoU3VtID4gcmVxdWlyZWRXaWR0aCkgewotCQkJCQlyZXF1aXJlZFdpZHRoID0gd2lkdGhTdW07Ci0JCQkJfQotCQkJCWhlaWdodFN1bSArPSByb3dNYXhIZWlnaHQ7Ci0JCQkJcm93TWF4SGVpZ2h0ID0gMDsKLQkJCQl3aWR0aFN1bSA9IDA7Ci0JCQkJY29sdW1uID0gMDsKLQkJCX0KLQkJfQotCQlpZiAod2lkdGhTdW0gPiByZXF1aXJlZFdpZHRoKSB7Ci0JCQlyZXF1aXJlZFdpZHRoID0gd2lkdGhTdW07Ci0JCX0KLQkJaGVpZ2h0U3VtICs9IHJvd01heEhlaWdodDsKLQkJcmVxdWlyZWRXaWR0aCArPSBIT1JJWl9QSVhfUEFERElORwotCQkJCSogTWF0aC5taW4oaG9yaXpDb3VudCwgY2hpbGRyZW4uc2l6ZSgpKTsKLQkJaW50IHJlcXVpcmVkSGVpZ2h0ID0gaGVpZ2h0U3VtICsgKFZFUlRfUElYX1BBRERJTkcgKiByb3dzKTsKLQkJQ29tbWFuZCBjbWQgPSBuZXcgQ2hhbmdlQm91bmRzQ29tbWFuZCgoKE5vZGUpIGVwLmdldE1vZGVsKCkpLCBlcAotCQkJCS5nZXRGaWd1cmUoKS5nZXRCb3VuZHMoKS5nZXRMb2NhdGlvbigpLCByZXF1aXJlZFdpZHRoKTsKLQkJZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShjbWQpOwotCQllcC5nZXRGaWd1cmUoKS5zZXRQcmVmZXJyZWRTaXplKAotCQkJCW5ldyBEaW1lbnNpb24ocmVxdWlyZWRXaWR0aCwgcmVxdWlyZWRIZWlnaHQpKTsKLQkJKChOb2RlKSBlcC5nZXRNb2RlbCgpKS5zZXRIZWlnaHQocmVxdWlyZWRIZWlnaHQpOwotCQllcC5nZXRGaWd1cmUoKS5zZXRTaXplKG5ldyBEaW1lbnNpb24ocmVxdWlyZWRXaWR0aCwgcmVxdWlyZWRIZWlnaHQpKTsKLQkJCWVwLmdldEZpZ3VyZSgpLmdldExheW91dE1hbmFnZXIoKS5sYXlvdXQoZXAuZ2V0RmlndXJlKCkpOwotCQkvLyBhZnRlciBsYXlvdXQsIGNoZWNrIHRoZSBib3R0b20tbW9zdCBjaGlsZCBmaWd1cmUgYWdhaW5zdCB0aGUgYm90dG9tCi0JCS8vIG9mIHRoZSBjb250YWluZXIsIGFkanVzdCB0aGUgYm90dG9tIG9mIHRoZSBjb250YWluZXIgaXMgbmVjZXNzYXJ5Ci0JCWlmIChlcCBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0Q29tcG9zaXRlRWRpdFBhcnQgJiYgY2hpbGRyZW4uc2l6ZSgpID4gMCkgewotCQkJR3JhcGhpY2FsRWRpdFBhcnQgbGFzdCA9IChHcmFwaGljYWxFZGl0UGFydCkgY2hpbGRyZW4uZ2V0KGNoaWxkcmVuCi0JCQkJCS5zaXplKCkgLSAxKTsKLQkJCVBvaW50IGNoaWxkQm90dG9tID0gbGFzdC5nZXRGaWd1cmUoKS5nZXRCb3VuZHMoKS5nZXRCb3R0b20oKTsKLQkJCVBvaW50IHBhcmVudEJvdHRvbSA9IGVwLmdldEZpZ3VyZSgpLmdldEJvdW5kcygpLmdldEJvdHRvbSgpOwotCQkJaW50IGRlbHRhID0gcGFyZW50Qm90dG9tLnkgLSBjaGlsZEJvdHRvbS55IC0gKFZFUlRfUElYX1BBRERJTkcgLyAyKTsKLQkJCWVwLmdldEZpZ3VyZSgpLnNldFByZWZlcnJlZFNpemUoCi0JCQkJCW5ldyBEaW1lbnNpb24ocmVxdWlyZWRXaWR0aCwgcmVxdWlyZWRIZWlnaHQgLSBkZWx0YSkpOwotCQkJKChOb2RlKSBlcC5nZXRNb2RlbCgpKS5zZXRIZWlnaHQocmVxdWlyZWRIZWlnaHQgLSBkZWx0YSk7Ci0JCQllcC5nZXRGaWd1cmUoKS5zZXRTaXplKAotCQkJCQluZXcgRGltZW5zaW9uKHJlcXVpcmVkV2lkdGgsIHJlcXVpcmVkSGVpZ2h0IC0gZGVsdGEpKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGVudW1lcmF0ZUNvbm5lY3RlZFBhcnRzKEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQgcGFydCwKLQkJCUxpc3QgY29ubmVjdGVkKSB7Ci0JCS8vIG9ubHkgYWRkIHBhcnRzIGRpcmVjdGx5IG9uIHRoZSBkaWFncmFtIHN1cmZhY2UKLQkJaWYgKCFjb25uZWN0ZWQuY29udGFpbnMocGFydCkpIHsKLQkJCWlmICghKHBhcnQuZ2V0UGFyZW50KCkgaW5zdGFuY2VvZiBEaWFncmFtRWRpdFBhcnQpKSB7Ci0JCQkJaWYgKCFjb25uZWN0ZWQuY29udGFpbnMocGFydC5nZXRQYXJlbnQoKSkpIHsKLQkJCQkJY29ubmVjdGVkLmFkZChwYXJ0LmdldFBhcmVudCgpKTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCWNvbm5lY3RlZC5hZGQocGFydCk7Ci0JCQl9Ci0JCQlBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0IGxpbmtlZFBhcnQgPSBudWxsOwotCQkJTGlzdCBjaGlsZHJlbiA9IHBhcnQuZ2V0Q2hpbGRyZW4oKTsKLQkJCWZvciAoaW50IHggPSAwOyB4IDwgY2hpbGRyZW4uc2l6ZSgpOyB4KyspIHsKLQkJCQlBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0IHAgPSAoQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCkgY2hpbGRyZW4KLQkJCQkJCS5nZXQoeCk7Ci0JCQkJZW51bWVyYXRlQ29ubmVjdGVkUGFydHMocCwgY29ubmVjdGVkKTsKLQkJCX0KLQkJCS8vIGlzIHRoaXMgZWxlbWVudCBsaW5rZWQgdG8gYW5vdGhlciBpdGVtPwotCQkJZm9yIChpbnQgeCA9IDA7IHggPCBwYXJ0LmdldFRhcmdldENvbm5lY3Rpb25zKCkuc2l6ZSgpOyB4KyspIHsKLQkJCQlsaW5rZWRQYXJ0ID0gKEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQpICgoTGlua0VkaXRQYXJ0KSBwYXJ0Ci0JCQkJCQkuZ2V0VGFyZ2V0Q29ubmVjdGlvbnMoKS5nZXQoeCkpLmdldFNvdXJjZSgpOwotCQkJCWVudW1lcmF0ZUNvbm5lY3RlZFBhcnRzKGxpbmtlZFBhcnQsIGNvbm5lY3RlZCk7Ci0JCQl9Ci0JCQlmb3IgKGludCB4ID0gMDsgeCA8IHBhcnQuZ2V0U291cmNlQ29ubmVjdGlvbnMoKS5zaXplKCk7IHgrKykgewotCQkJCWxpbmtlZFBhcnQgPSAoQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCkgKChMaW5rRWRpdFBhcnQpIHBhcnQKLQkJCQkJCS5nZXRTb3VyY2VDb25uZWN0aW9ucygpLmdldCh4KSkuZ2V0VGFyZ2V0KCk7Ci0JCQkJZW51bWVyYXRlQ29ubmVjdGVkUGFydHMobGlua2VkUGFydCwgY29ubmVjdGVkKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGZpbmRzIHNpbmdsZSBlbGVtZW50cyBhbmQgZ3JvdXBzIG9mIGVsZW1lbnRzLCBhbmQgcG9zaXRpb25zCi0JICogdGhlbSBzdGFydGluZyBmcm9tIHRoZSB0b3Agb2YgdGhlIGRpYWdyYW0gYW5kIGNvbnRpbnVvdXNseSBkb3duIHRoZSBwYWdlLgotCSAqLwotCXByaXZhdGUgdm9pZCBwYWNrRGlhZ3JhbSgpIHsKLQkJQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdFBhcnQgZGlhZ3JhbSA9IChBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0UGFydCkgZ2V0R3JhcGhpY2FsVmlld2VyKCkKLQkJCQkuZ2V0Q29udGVudHMoKTsKLQkJLy8gc3RhcnQgYXQgdGhlIHRvcCBvZiB0aGUgZGlhZ3JhbQotCQkvLyBEaW1lbnNpb24gZGlhZ3JhbVNpemUgPSBkaWFncmFtLmdldEZpZ3VyZSgpLmdldFNpemUoKTsKLQkJLy8gbm8gbmV3IHNoYXBlcyBjYW4gYmUgbW92ZWQgYWJvdmUgdGhpcyB5LWF4aXMgdmFsdWUKLQkJaW50IHJlc2VydmVkID0gMDsKLQkJLy8gdGhlc2UgYXJlIGVsZW1lbnRzIHdpdGhvdXQgY29ubmVjdGlvbnMKLQkJTGlzdCBzdHJhZ2dsZXJzID0gbmV3IEFycmF5TGlzdCgpOwotCQkvLyB0aGVzZSBhcmUgZ3JvdXBzIG9mIGVsZW1lbnRzIGNvbm5lY3RlZCB3aXRoIGxpbmtzCi0JCUxpc3QgZ3JvdXBzID0gbmV3IEFycmF5TGlzdCgpOwotCQkvLyB0aGVzZSBhcmUgdG9wIGxldmVsIHBhcnRzIG9uIHRoZSBkaWFncmFtIHRoYXQgaGF2ZSBiZWVuIGFkZGVkCi0JCUxpc3QgZGlhZ3JhbVBhcnRzID0gZGlhZ3JhbS5nZXRSZWNlbnRseUFkZGVkUGFydHMoKTsKLQkJZm9yIChpbnQgeCA9IDA7IHggPCBkaWFncmFtUGFydHMuc2l6ZSgpOyB4KyspIHsKLQkJCUFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQgcCA9IChBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0KSBkaWFncmFtUGFydHMKLQkJCQkJLmdldCh4KTsKLQkJCWJvb2xlYW4gZm91bmQgPSBmYWxzZTsKLQkJCWZvciAoaW50IGcgPSAwOyBnIDwgZ3JvdXBzLnNpemUoKSAmJiBmb3VuZCA9PSBmYWxzZTsgZysrKSB7Ci0JCQkJTGlzdCBncm91cCA9IChMaXN0KSBncm91cHMuZ2V0KGcpOwotCQkJCWlmIChncm91cC5jb250YWlucyhwKSkgewotCQkJCQlmb3VuZCA9IHRydWU7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJCWlmICghZm91bmQpIHsKLQkJCQlMaXN0IGNvbm5lY3RlZCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQllbnVtZXJhdGVDb25uZWN0ZWRQYXJ0cyhwLCBjb25uZWN0ZWQpOwotCQkJCWlmIChjb25uZWN0ZWQuc2l6ZSgpID09IDEpIHsKLQkJCQkJc3RyYWdnbGVycy5hZGQocCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJZ3JvdXBzLmFkZChjb25uZWN0ZWQpOwotCQkJCX0KLQkJCX0KLQkJfQotCQkvLyBwcm9jZXNzIGVhY2ggZ3JvdXAgY2xvc2VzdCB0byB0aGUgdG9wIChtaW4geSB2YWx1ZSkKLQkJd2hpbGUgKGdyb3Vwcy5zaXplKCkgPiAwKSB7Ci0JCQlMaXN0IHRvcCA9IChMaXN0KSBncm91cHMuZ2V0KDApOwotCQkJaW50IHRvcFkgPSBnZXRWZXJ0aWNhbE1pblBhcnQodG9wKS5nZXRGaWd1cmUoKS5nZXRCb3VuZHMoKS55OwotCQkJZm9yIChpbnQgeCA9IDA7IHggPCBncm91cHMuc2l6ZSgpOyB4KyspIHsKLQkJCQlMaXN0IGcgPSAoTGlzdCkgZ3JvdXBzLmdldCh4KTsKLQkJCQlpbnQgeSA9IGdldFZlcnRpY2FsTWluUGFydChnKS5nZXRGaWd1cmUoKS5nZXRCb3VuZHMoKS55OwotCQkJCWlmICh5IDwgdG9wWSkgewotCQkJCQl0b3AgPSBnOwotCQkJCQl0b3BZID0geTsKLQkJCQl9Ci0JCQl9Ci0JCQlpbnQgbGltaXQgPSByZXNlcnZlZCArIDE7Ci0JCQlpbnQgdmVydGljYWxEZWx0YSA9IGxpbWl0IC0gdG9wWTsKLQkJCWludCBsZWZ0WCA9IGdldEhvcml6b250YWxNaW5QYXJ0KHRvcCkuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCkueDsKLQkJCWludCBob3Jpem9udGFsRGVsdGEgPSBIT1JJWl9QSVhfUEFERElORyAtIGxlZnRYOwotCQkJZm9yIChpbnQgeCA9IDA7IHggPCB0b3Auc2l6ZSgpOyB4KyspIHsKLQkJCQlBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0IHAgPSAoQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCkgdG9wCi0JCQkJCQkuZ2V0KHgpOwotCQkJCVJlY3RhbmdsZSBib3VuZHMgPSBwLmdldEZpZ3VyZSgpLmdldEJvdW5kcygpOwotCQkJCUNoYW5nZUJvdW5kc0NvbW1hbmQgY2JjID0gbmV3IENoYW5nZUJvdW5kc0NvbW1hbmQoKE5vZGUpIHAKLQkJCQkJCS5nZXRNb2RlbCgpLCBuZXcgUG9pbnQoYm91bmRzLnggKyBob3Jpem9udGFsRGVsdGEsCi0JCQkJCQlib3VuZHMueSArIHZlcnRpY2FsRGVsdGEpLCBib3VuZHMud2lkdGgpOwotCQkJCWdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUoY2JjKTsKLQkJCQlwLmdldEZpZ3VyZSgpLnNldExvY2F0aW9uKAotCQkJCQkJbmV3IFBvaW50KGJvdW5kcy54ICsgaG9yaXpvbnRhbERlbHRhLCBib3VuZHMueQotCQkJCQkJCQkrIHZlcnRpY2FsRGVsdGEpKTsKLQkJCX0KLQkJCWludCBib3R0b21ZID0gZ2V0VmVydGljYWxNYXhQYXJ0KHRvcCkuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCkKLQkJCQkJLmJvdHRvbSgpOwotCQkJcmVzZXJ2ZWQgPSBib3R0b21ZICsgKFZFUlRfUElYX1BBRERJTkcgKiAyKTsKLQkJCWdyb3Vwcy5yZW1vdmUodG9wKTsKLQkJfQotCQlpbnQgbmV4dCA9IEhPUklaX1BJWF9QQURESU5HOwotCQlmb3IgKGludCB4ID0gMDsgeCA8IHN0cmFnZ2xlcnMuc2l6ZSgpOyB4KyspIHsKLQkJCWludCBsaW1pdCA9IHJlc2VydmVkICsgMTsKLQkJCUFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQgcCA9IChBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0KSBzdHJhZ2dsZXJzCi0JCQkJCS5nZXQoeCk7Ci0JCQlSZWN0YW5nbGUgYm91bmRzID0gcC5nZXRGaWd1cmUoKS5nZXRCb3VuZHMoKTsKLQkJCUNoYW5nZUJvdW5kc0NvbW1hbmQgY2JjID0gbmV3IENoYW5nZUJvdW5kc0NvbW1hbmQoKE5vZGUpIHAKLQkJCQkJLmdldE1vZGVsKCksIG5ldyBQb2ludChuZXh0LCBsaW1pdCksIGJvdW5kcy53aWR0aCk7Ci0JCQlnZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKGNiYyk7Ci0JCQlwLmdldEZpZ3VyZSgpLnNldExvY2F0aW9uKG5ldyBQb2ludChuZXh0LCBsaW1pdCkpOwotCQkJbmV4dCArPSBib3VuZHMud2lkdGggKyBIT1JJWl9QSVhfUEFERElORzsKLQkJfQotCX0KLQotCXByaXZhdGUgQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCBnZXRWZXJ0aWNhbE1pblBhcnQoTGlzdCBwYXJ0cykgewotCQlBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0IHJjID0gcGFydHMuc2l6ZSgpID4gMCA/IChBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0KSBwYXJ0cwotCQkJCS5nZXQoMCkKLQkJCQk6IG51bGw7Ci0JCWZvciAoaW50IHggPSAwOyB4IDwgcGFydHMuc2l6ZSgpOyB4KyspIHsKLQkJCUFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQgcCA9IChBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0KSBwYXJ0cwotCQkJCQkuZ2V0KHgpOwotCQkJaWYgKHAuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCkueSA8IHJjLmdldEZpZ3VyZSgpLmdldEJvdW5kcygpLnkpIHsKLQkJCQlyYyA9IHA7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJjOwotCX0KLQotCXByaXZhdGUgQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCBnZXRIb3Jpem9udGFsTWluUGFydChMaXN0IHBhcnRzKSB7Ci0JCUFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQgcmMgPSBwYXJ0cy5zaXplKCkgPiAwID8gKEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQpIHBhcnRzCi0JCQkJLmdldCgwKQotCQkJCTogbnVsbDsKLQkJZm9yIChpbnQgeCA9IDA7IHggPCBwYXJ0cy5zaXplKCk7IHgrKykgewotCQkJQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCBwID0gKEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQpIHBhcnRzCi0JCQkJCS5nZXQoeCk7Ci0JCQlpZiAocC5nZXRGaWd1cmUoKS5nZXRCb3VuZHMoKS54IDwgcmMuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCkueCkgewotCQkJCXJjID0gcDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmM7Ci0JfQotCi0JcHJpdmF0ZSBBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0IGdldFZlcnRpY2FsTWF4UGFydChMaXN0IHBhcnRzKSB7Ci0JCUFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQgcmMgPSBwYXJ0cy5zaXplKCkgPiAwID8gKEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQpIHBhcnRzCi0JCQkJLmdldCgwKQotCQkJCTogbnVsbDsKLQkJZm9yIChpbnQgeCA9IDA7IHggPCBwYXJ0cy5zaXplKCk7IHgrKykgewotCQkJQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCBwID0gKEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQpIHBhcnRzCi0JCQkJCS5nZXQoeCk7Ci0JCQlpZiAocC5nZXRGaWd1cmUoKS5nZXRCb3VuZHMoKS5ib3R0b20oKSA+IHJjLmdldEZpZ3VyZSgpLmdldEJvdW5kcygpCi0JCQkJCS5ib3R0b20oKSkgewotCQkJCXJjID0gcDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmM7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L0VuZE5vZGVFZGl0UGFydC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9FbmROb2RlRWRpdFBhcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTA0YmQ5NS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L0VuZE5vZGVFZGl0UGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZWRpdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Db2xvckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5maWd1cmVzLkVuZE5vZGVGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuVHlwZWROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuRGlyZWN0RWRpdFBvbGljeTsKLQotLyoqCi0gKiBFZGl0UGFydCBmb3IgRmluYWwob3IgRW5kKSBub2RlIAotICoKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBFbmROb2RlRWRpdFBhcnQgZXh0ZW5kcyBOb2RlRWRpdFBhcnQgewotCi0JcHVibGljIEVuZE5vZGVFZGl0UGFydChUeXBlZE5vZGUgbW9kZWwpIHsKLQkJc3VwZXIobW9kZWwpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZWRpdC5CYXNlRWRpdFBhcnQjY3JlYXRlRGlyZWN0RWRpdFBvbGljeSgpCi0JICovCi0JcHJvdGVjdGVkIERpcmVjdEVkaXRQb2xpY3kgY3JlYXRlRGlyZWN0RWRpdFBvbGljeSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0LkJhc2VFZGl0UGFydCNjcmVhdGVGaWd1cmUoKQotCSAqLwotCXByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZUZpZ3VyZSgpIHsKLQkJRW5kTm9kZUZpZ3VyZSBmID0gbmV3IEVuZE5vZGVGaWd1cmUoKTsKLQkJZi5zZXRCYWNrZ3JvdW5kQ29sb3IoQ29sb3JDb25zdGFudHMuYmxhY2spOwotCQlmLnNldEZvcmVncm91bmRDb2xvcihDb2xvckNvbnN0YW50cy5yZWQpOwotCQlmLnNldFNpemUoMjQsIDI0KTsKLQkJcmV0dXJuIGY7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L0ZyZWVUZXh0Q2VsbEVkaXRvckxvY2F0b3IuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvRnJlZVRleHRDZWxsRWRpdG9yTG9jYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMGE5MmUxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvRnJlZVRleHRDZWxsRWRpdG9yTG9jYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZWRpdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZmlndXJlcy5GcmVlVGV4dEZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYudG9vbHMuQ2VsbEVkaXRvckxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DZWxsRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkdDOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotCi0vKioKLSAqIAotICogQ29uc3RyYWludCBmb3IgcGxhY2luZyBGcmVlVGV4dCBDZWxsIEVkaXRvci4KLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICoKLSAqLwotcHVibGljIGNsYXNzIEZyZWVUZXh0Q2VsbEVkaXRvckxvY2F0b3IgaW1wbGVtZW50cyBDZWxsRWRpdG9yTG9jYXRvciB7Ci0KLQlJRmlndXJlIGZpZ3VyZTsKLQkvKgotCSAqIENyZWF0ZXMgYSBuZXcgRnJlZVRleHRDZWxsRWRpdG9yTG9jYXRvciAKLQkgKiAKLQkgKiBAcGFyYW0gbGFiZWwgdGhlIExhYmVsCi0JICovCi0JcHVibGljIEZyZWVUZXh0Q2VsbEVkaXRvckxvY2F0b3IoSUZpZ3VyZSBmaWd1cmUpIHsKLQkJc2V0RmlndXJlKGZpZ3VyZSk7Ci0JfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmdlZi50b29scy5DZWxsRWRpdG9yTG9jYXRvciNyZWxvY2F0ZShvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNlbGxFZGl0b3IpCi0JICovCi0JcHVibGljIHZvaWQgcmVsb2NhdGUoQ2VsbEVkaXRvciBjZSkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCUZyZWVUZXh0RmlndXJlIGZpZyA9IChGcmVlVGV4dEZpZ3VyZSlmaWd1cmU7Ci0JCVRleHQgdGV4dCA9IChUZXh0KSBjZS5nZXRDb250cm9sKCk7Ci0JCVN0cmluZyBuID0gKFN0cmluZykgY2UuZ2V0VmFsdWUoKTsKLQkJR0MgZ2MgPSBuZXcgR0ModGV4dCk7Ci0JCVBvaW50IHNpemUgPSBnYy50ZXh0RXh0ZW50KG4pOwotCQlnYy5kaXNwb3NlKCk7Ci0JCWlmIChzaXplLnggIT0gMCkKLQkJCXNpemUgPSB0ZXh0LmNvbXB1dGVTaXplKHNpemUueCwgU1dULkRFRkFVTFQpOwotCQl0ZXh0LnNldFNpemUoc2l6ZS54LCBzaXplLnkpOwotCQlSZWN0YW5nbGUgdGV4dEJvdW5kcyA9IG5ldyBSZWN0YW5nbGUodGV4dC5nZXRDbGllbnRBcmVhKCkueCwgdGV4dAotCQkJCS5nZXRDbGllbnRBcmVhKCkueSwgdGV4dC5nZXRDbGllbnRBcmVhKCkud2lkdGgsIHRleHQKLQkJCQkuZ2V0Q2xpZW50QXJlYSgpLmhlaWdodCk7Ci0JCVJlY3RhbmdsZSBmaWdCb3VuZHMgPSBmaWcuZ2V0Q2xpZW50QXJlYSgpOwotCQlmaWcudHJhbnNsYXRlVG9BYnNvbHV0ZShmaWdCb3VuZHMpOwotCQlpbnQgZGVsdGEgPSAoZmlnQm91bmRzLndpZHRoIC0gdGV4dEJvdW5kcy53aWR0aCkgLyAyOwotCQlpbnQgeSA9IGZpZy5nZXRUZXh0Rmxvd1BhZ2UoKS5nZXRMb2NhdGlvbigpLnk7Ci0JCXRleHQuc2V0TG9jYXRpb24oZmlnQm91bmRzLnggKyBkZWx0YSwgeSk7Ci0KLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0RmlndXJlKElGaWd1cmUgZmlndXJlKSB7Ci0JCXRoaXMuZmlndXJlID0gZmlndXJlOwotCX0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIGZpZ3VyZS4KLQkgKi8KLQlwdWJsaWMgSUZpZ3VyZSBnZXRGaWd1cmUoKSB7Ci0JCXJldHVybiBmaWd1cmU7Ci0JfQotCQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L0ZyZWVUZXh0RGlyZWN0RWRpdE1hbmFnZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvRnJlZVRleHREaXJlY3RFZGl0TWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MjM1ZDAwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvRnJlZVRleHREaXJlY3RFZGl0TWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuRmlndXJlVXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLnV0aWwuRGlhZ3JhbVVJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLnV0aWwuVGVtcGxhdGVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpLnV0aWwuTXNnRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuVHlwZWROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLldvcmtCcmVha2Rvd25FbGVtZW50Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuUHJvY2Vzc1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuR3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnRvb2xzLkNlbGxFZGl0b3JMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi50b29scy5EaXJlY3RFZGl0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRleHRDZWxsRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5WZXJpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlZlcmlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250TWV0cmljczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuR0M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLQotLyoqCi0gKiBNYW5hZ2VzIHRoZSBkaXJlY3QgZWRpdCBvcGVyYXRpb24gYnkgY3JlYXRpbmcgYW5kIG1haW50YWluaW5nIHRoZSAKLSAqIHtAbGluayBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNlbGxFZGl0b3J9IGFuZCBleGVjdXRpbmcgdGhlIHJlc3VsdGluZyBjb21tYW5kIGlmIAotICogdGhlIGNlbGwgZWRpdG9yIHZhbHVlIGhhcyBjaGFuZ2VkLiBTcGVjaWZpY2FsbHkgZm9yIEZyZWVUZXh0LgotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBGcmVlVGV4dERpcmVjdEVkaXRNYW5hZ2VyIGV4dGVuZHMgRGlyZWN0RWRpdE1hbmFnZXIgewotCQotCS8qCi0JICogCi0JICovCi0JcHJvdGVjdGVkIFZlcmlmeUxpc3RlbmVyIHZlcmlmeUxpc3RlbmVyOwotCXByaXZhdGUgRm9udCBzY2FsZWRGb250OwotCXByb3RlY3RlZCBJRmlndXJlIGZpZ3VyZTsKLQkKLQlwdWJsaWMgRnJlZVRleHREaXJlY3RFZGl0TWFuYWdlcihHcmFwaGljYWxFZGl0UGFydCBzb3VyY2UsIENsYXNzIGVkaXRvclR5cGUsIENlbGxFZGl0b3JMb2NhdG9yIGxvY2F0b3IsIElGaWd1cmUgZmlndXJlKSB7Ci0JCXN1cGVyKHNvdXJjZSwgZWRpdG9yVHlwZSwgbG9jYXRvcik7Ci0JCXRoaXMuZmlndXJlID0gZmlndXJlOwotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNvbnN0cnVjdG9yIHN0dWIKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmdlZi50b29scy5EaXJlY3RFZGl0TWFuYWdlciNicmluZ0Rvd24oKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGJyaW5nRG93bigpIHsKLQkJYnJpbmdEb3duKHRydWUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZ2VmLnRvb2xzLkRpcmVjdEVkaXRNYW5hZ2VyI2JyaW5nRG93bigpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYnJpbmdEb3duKGJvb2xlYW4gY2hlY2spIHsKLQkJLy8gVGhpcyBtZXRob2QgbWlnaHQgYmUgcmUtZW50ZXJlZCB3aGVuIHN1cGVyLmJyaW5nRG93bigpIGlzIGNhbGxlZC4KLQkJRm9udCBkaXNwb3NlRm9udCA9IHNjYWxlZEZvbnQ7Ci0JCXNjYWxlZEZvbnQgPSBudWxsOwotCQlzdXBlci5icmluZ0Rvd24oKTsKLQkJaWYgKGRpc3Bvc2VGb250ICE9IG51bGwpCi0JCQlkaXNwb3NlRm9udC5kaXNwb3NlKCk7Ci0JCWlmIChjaGVjaykgewotCQkJTm9kZSBub2RlID0gKE5vZGUpIGdldEVkaXRQYXJ0KCkuZ2V0TW9kZWwoKTsKLQkJCVN0cmluZyBuYW1lID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCS8vIFRPRE86IFJlbW92ZSB0aGlzIGNoZWNrIAotCQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBXb3JrQnJlYWtkb3duRWxlbWVudE5vZGUpIHsKLQkJCQlPYmplY3Qgd2JlbGVtZW50ID0gbm9kZS5nZXRPYmplY3QoKTsKLQkJCQlpZiAod2JlbGVtZW50IGluc3RhbmNlb2YgQWN0aXZpdHkKLQkJCQkJCSYmIFByb2Nlc3NVdGlsCi0JCQkJCQkJCS5pc0V4dGVuZGluZ09yTG9jYWxseUNvbnRyaWJ1dGluZygoQnJlYWtkb3duRWxlbWVudCkgd2JlbGVtZW50KSkgewotCQkJCQluYW1lID0gUHJvY2Vzc1V0aWwKLQkJCQkJCQkuZ2V0UHJlc2VudGF0aW9uTmFtZSgoQnJlYWtkb3duRWxlbWVudCkgd2JlbGVtZW50KTsKLQkJCQl9Ci0KLQkJCX0KLQkJCWlmKG5vZGUgaW5zdGFuY2VvZiBUeXBlZE5vZGUgJiYgKChUeXBlZE5vZGUpbm9kZSkuZ2V0VHlwZSgpPT1UeXBlZE5vZGUuRlJFRV9URVhUKXsKLQkJCQlHcmFwaE5vZGUgZ25vZGUgPSAoKE5vZGUpIGdldEVkaXRQYXJ0KCkuZ2V0TW9kZWwoKSkuZ2V0R3JhcGhOb2RlKCk7Ci0JCQkJbmFtZSA9ICgoUHJvcGVydHkpIGdub2RlLmdldFByb3BlcnR5KCkuZ2V0KDApKS5nZXRWYWx1ZSgpOwotCQkJfQotCQkJaWYgKG5hbWUgPT0gbnVsbCB8fCBuYW1lLnRyaW0oKS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJRGlzcGxheQotCQkJCQkJLmdldEN1cnJlbnQoKQotCQkJCQkJLmFzeW5jRXhlYygKLQkJCQkJCQkJbmV3IFByb21wdEVkaXQoCi0JCQkJCQkJCQkJKE5vZGVFZGl0UGFydCkgZ2V0RWRpdFBhcnQoKSwKLQkJCQkJCQkJCQlEaWFncmFtVUlSZXNvdXJjZXMuZXJyX25hbWVfZW1wdHkpKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZ2VmLnRvb2xzLkRpcmVjdEVkaXRNYW5hZ2VyI2luaXRDZWxsRWRpdG9yKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0Q2VsbEVkaXRvcigpIHsKLQkJVGV4dENlbGxFZGl0b3IgZWRpdG9yID0gKFRleHRDZWxsRWRpdG9yKSBnZXRDZWxsRWRpdG9yKCk7Ci0JCWVkaXRvci5zZXRTdHlsZShTV1QuTVVMVEkpOwotCQlUZXh0IHQgPSAoVGV4dCkgZWRpdG9yLmdldENvbnRyb2woKTsKLQkJdmVyaWZ5TGlzdGVuZXIgPSBuZXcgVmVyaWZ5TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB2ZXJpZnlUZXh0KFZlcmlmeUV2ZW50IGV2ZW50KSB7Ci0JCQkJVGV4dCB0ZXh0ID0gKFRleHQpIGdldENlbGxFZGl0b3IoKS5nZXRDb250cm9sKCk7Ci0JCQkJU3RyaW5nIG9sZFRleHQgPSB0ZXh0LmdldFRleHQoKTsKLQkJCQlTdHJpbmcgbGVmdFRleHQgPSBvbGRUZXh0LnN1YnN0cmluZygwLCBldmVudC5zdGFydCk7Ci0JCQkJU3RyaW5nIHJpZ2h0VGV4dCA9IG9sZFRleHQuc3Vic3RyaW5nKGV2ZW50LmVuZCwgb2xkVGV4dAotCQkJCQkJLmxlbmd0aCgpKTsKLQkJCQlHQyBnYyA9IG5ldyBHQyh0ZXh0KTsKLQkJCQlQb2ludCBzaXplID0gZ2MudGV4dEV4dGVudChsZWZ0VGV4dCArIGV2ZW50LnRleHQgKyByaWdodFRleHQpOwotCQkJCWdjLmRpc3Bvc2UoKTsKLQkJCQlpZiAoc2l6ZS54ICE9IDApCi0JCQkJCXNpemUgPSB0ZXh0LmNvbXB1dGVTaXplKHNpemUueCwgU1dULkRFRkFVTFQpOwotCQkJCWdldENlbGxFZGl0b3IoKS5nZXRDb250cm9sKCkuc2V0U2l6ZShzaXplLngsIHNpemUueSk7Ci0JCQl9Ci0JCX07Ci0JCXQuYWRkVmVyaWZ5TGlzdGVuZXIodmVyaWZ5TGlzdGVuZXIpOwotCQlTdHJpbmcgaW5pdGlhbExhYmVsVGV4dCA9ICgoTm9kZUVkaXRQYXJ0KSB0aGlzLmdldEVkaXRQYXJ0KCkpCi0JCQkJLmdldERpcmVjdEVkaXRUZXh0KCk7Ci0JCWVkaXRvci5zZXRWYWx1ZShpbml0aWFsTGFiZWxUZXh0KTsKLQkJRm9udCBmID0gZmlndXJlLmdldEZvbnQoKTsKLQkJRm9udE1ldHJpY3MgZm0gPSBGaWd1cmVVdGlsaXRpZXMuZ2V0Rm9udE1ldHJpY3MoZik7Ci0JCWludCBoID0gZm0uZ2V0SGVpZ2h0KCk7Ci0JCWludCB3ID0gZm0uZ2V0QXZlcmFnZUNoYXJXaWR0aCgpOwotCQl0LnNldFNpemUoaW5pdGlhbExhYmVsVGV4dC5sZW5ndGgoKSp3KzEwMCwgaCs1MCk7Ci0JCi0JCWlmKGYgIT0gbnVsbCkKLQkJCXQuc2V0Rm9udChmKTsKLQkJZWxzZQotCQkJdC5zZXRGb250KFRlbXBsYXRlQ29uc3RhbnRzLkRFRkFVTFRfRk9OVCk7Ci0JCXQuc2VsZWN0QWxsKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5nZWYudG9vbHMuRGlyZWN0RWRpdE1hbmFnZXIjdW5ob29rTGlzdGVuZXJzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB1bmhvb2tMaXN0ZW5lcnMoKSB7Ci0JCXN1cGVyLnVuaG9va0xpc3RlbmVycygpOwotCQlpZiAoZ2V0Q2VsbEVkaXRvcigpICE9IG51bGwpIHsKLQkJCVRleHQgdGV4dCA9IChUZXh0KSBnZXRDZWxsRWRpdG9yKCkuZ2V0Q29udHJvbCgpOwotCQkJaWYgKHZlcmlmeUxpc3RlbmVyICE9IG51bGwpCi0JCQkJdGV4dC5yZW1vdmVWZXJpZnlMaXN0ZW5lcih2ZXJpZnlMaXN0ZW5lcik7Ci0JCQl2ZXJpZnlMaXN0ZW5lciA9IG51bGw7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDaGVja3MgaWYgdGhlIGdpdmVuIHRleHQgaXMgdmFsaWQuIFN1YmNsYXNzZXMgY2FuIG92ZXJyaWRlIHRoaXMgbWV0aG9kLgotCSAqIAotCSAqIEBwYXJhbSB0eHQKLQkgKiBAcmV0dXJuIG51bGwgaWYgdGhlIGdpdmVuIHRleHQgaXMgdmFsaWQsIGFuIGVycm9yIG1lc3NhZ2Ugb3RoZXJ3aXNlCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyB2YWxpZGF0ZShTdHJpbmcgdHh0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZ2VmLnRvb2xzLkRpcmVjdEVkaXRNYW5hZ2VyI2NvbW1pdCgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29tbWl0KCkgewotCQlTdHJpbmcgbXNnID0gdmFsaWRhdGUoKFN0cmluZykgZ2V0Q2VsbEVkaXRvcigpLmdldFZhbHVlKCkpOwotCQlpZiAobXNnICE9IG51bGwpIHsKLQkJCWJyaW5nRG93bihmYWxzZSk7Ci0JCQlEaXNwbGF5LmdldEN1cnJlbnQoKS5hc3luY0V4ZWMoCi0JCQkJCW5ldyBQcm9tcHRFZGl0KChOb2RlRWRpdFBhcnQpIGdldEVkaXRQYXJ0KCksIG1zZykpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmNvbW1pdCgpOwotCX0KLQotCXN0YXRpYyBjbGFzcyBQcm9tcHRFZGl0IGltcGxlbWVudHMgUnVubmFibGUgewotCi0JCXByaXZhdGUgTm9kZUVkaXRQYXJ0IHBhcnQ7Ci0KLQkJcHJpdmF0ZSBTdHJpbmcgbXNnOwotCi0JCVByb21wdEVkaXQoTm9kZUVkaXRQYXJ0IHBhcnQsIFN0cmluZyBtc2cpIHsKLQkJCXRoaXMucGFydCA9IHBhcnQ7Ci0JCQl0aGlzLm1zZyA9IG1zZzsKLQkJfQotCi0JCS8qKgotCQkgKiBAc2VlIGphdmEubGFuZy5SdW5uYWJsZSNydW4oKQotCQkgKi8KLQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJU3RyaW5nIHRpdGxlID0gRGlhZ3JhbVVJUmVzb3VyY2VzLmRpYWdyYW1fZXJyb3JEaWFsb2dfdGl0bGVfdGV4dDA7IAotCQkJTXNnRGlhbG9nIGRpYWxvZyA9IEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKTsKLQkJCWRpYWxvZy5kaXNwbGF5RXJyb3IodGl0bGUsIG1zZyk7IAotCQkJcGFydC5wZXJmb3JtRGlyZWN0RWRpdCgpOwotCQl9Ci0KLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L0ZyZWVUZXh0RWRpdFBhcnQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvRnJlZVRleHRFZGl0UGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMjFjMDVkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvRnJlZVRleHRFZGl0UGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlBvc2l0aW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5jb21tYW5kcy5DaGFuZ2VQcm9wZXJ0eVZhbHVlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5maWd1cmVzLlNlbGVjdGFibGVMYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi51dGlsLlRlbXBsYXRlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk1vZGVsUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLnV0aWwuR3JhcGhpY2FsRGF0YUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuRGlyZWN0RWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuRGlyZWN0RWRpdFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnRvb2xzLkRpcmVjdEVkaXRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGV4dENlbGxFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci0KLQotLyoqCi0gKiBQcm92aWRlcyBzdXBwb3J0IGZvciBkaXJlY3QgZWRpdGluZywgZnJlZSB0ZXh0IHByb3BlcnRpZXMgY2hhbmdlcyBsaWtlIGZvbnQsIGNvbG9yIGFuZCB0ZXh0LgotICogCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEZyZWVUZXh0RWRpdFBhcnQgZXh0ZW5kcyBOb2RlRWRpdFBhcnQgewotCi0JcHJpdmF0ZSBGb250IGZvbnQ7Ci0KLQlwcml2YXRlIENvbG9yIGNvbG9yOwotCi0JcHJpdmF0ZSBGb250RGF0YSBmRGF0YTsKLQotCXByaXZhdGUgTm9kZUVkaXRQYXJ0IHBhcnQ7Ci0KLQlwdWJsaWMgRnJlZVRleHRFZGl0UGFydChOb2RlIG1vZGVsKSB7Ci0JCXN1cGVyKG1vZGVsKTsKLQkJcGFydCA9IHRoaXM7Ci0JfQotCi0JcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlRmlndXJlKCkgewotCQlMYWJlbCBsID0gbmV3IFNlbGVjdGFibGVMYWJlbCgpOwotCQlsLnNldExhYmVsQWxpZ25tZW50KFBvc2l0aW9uQ29uc3RhbnRzLkxFRlQpOwotCQlsLnNldFRleHRQbGFjZW1lbnQoUG9zaXRpb25Db25zdGFudHMuU09VVEgpOwotCQlyZXR1cm4gbDsKLQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUVkaXRQb2xpY2llcygpIHsKLQkJc3VwZXIuY3JlYXRlRWRpdFBvbGljaWVzKCk7Ci0JCWlmICghKChOb2RlKSBnZXRNb2RlbCgpKS5pc1JlYWRPbmx5KCkpIHsKLQkJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuRElSRUNUX0VESVRfUk9MRSwKLQkJCQkJY3JlYXRlRGlyZWN0RWRpdFBvbGljeSgpKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBEaXJlY3RFZGl0UG9saWN5IGNyZWF0ZURpcmVjdEVkaXRQb2xpY3koKSB7Ci0JCXJldHVybiBuZXcgRGlyZWN0RWRpdFBvbGljeSgpIHsKLQkJCXByb3RlY3RlZCBDb21tYW5kIGdldERpcmVjdEVkaXRDb21tYW5kKERpcmVjdEVkaXRSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJCQlyZXR1cm4gbmV3IENoYW5nZVByb3BlcnR5VmFsdWVDb21tYW5kKHBhcnQsIChTdHJpbmcpIHJlcXVlc3QKLQkJCQkJCS5nZXRDZWxsRWRpdG9yKCkuZ2V0VmFsdWUoKSk7Ci0JCQl9Ci0KLQkJCXByb3RlY3RlZCB2b2lkIHNob3dDdXJyZW50RWRpdFZhbHVlKERpcmVjdEVkaXRSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJCQlJRmlndXJlIGZpZyA9IGdldERpcmVjdEVkaXRGaWd1cmUoKTsKLQkJCQlpZiAoZmlnIGluc3RhbmNlb2YgTGFiZWwpIHsKLQkJCQkJKChMYWJlbCkgZmlnKS5zZXRUZXh0KChTdHJpbmcpIHJlcXVlc3QuZ2V0Q2VsbEVkaXRvcigpCi0JCQkJCQkJLmdldFZhbHVlKCkpOwotCQkJCQlmaWcuZ2V0VXBkYXRlTWFuYWdlcigpLnBlcmZvcm1VcGRhdGUoKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlUHJvcGVydHlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBtc2cpIHsKLQkJc3dpdGNoIChtc2cuZ2V0RmVhdHVyZUlEKE5vZGUuY2xhc3MpKSB7Ci0JCWNhc2UgTW9kZWxQYWNrYWdlLlRZUEVEX05PREVfX1RZUEU6Ci0JCQlyZWZyZXNoVmlzdWFscygpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmhhbmRsZVByb3BlcnR5Q2hhbmdlZChtc2cpOwotCX0KLQotCXB1YmxpYyB2b2lkIHBlcmZvcm1SZXF1ZXN0KFJlcXVlc3QgcmVxdWVzdCkgewotCQlpZiAocmVxdWVzdC5nZXRUeXBlKCkgPT0gUmVxdWVzdENvbnN0YW50cy5SRVFfRElSRUNUX0VESVQKLQkJCQkmJiAhKChOb2RlKSBnZXRNb2RlbCgpKS5pc1JlYWRPbmx5KCkpIHsKLQkJCXBlcmZvcm1EaXJlY3RFZGl0KCk7Ci0JCX0gZWxzZSB7Ci0JCQlzdXBlci5wZXJmb3JtUmVxdWVzdChyZXF1ZXN0KTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hWaXN1YWxzKCkgewotCQlzdXBlci5yZWZyZXNoVmlzdWFscygpOwotCQlJRmlndXJlIGZpZyA9IGdldERpcmVjdEVkaXRGaWd1cmUoKTsKLQkJaWYgKGZpZyBpbnN0YW5jZW9mIExhYmVsKSB7Ci0JCQlMYWJlbCBsID0gKExhYmVsKSBmaWc7Ci0JCQlMaXN0IGFsaXN0ID0gKChOb2RlKSBnZXRNb2RlbCgpKS5nZXRHcmFwaE5vZGUoKS5nZXRQcm9wZXJ0eSgpOwotCQkJU3RyaW5nIGZvbnROYW1lID0gVGVtcGxhdGVDb25zdGFudHMuREVGQVVMVF9GT05UX05BTUU7Ci0JCQlpbnQgZm9udFN0eWxlID0gU1dULk5PUk1BTDsKLQkJCWludCBmb250SGVpZ2h0ID0gVGVtcGxhdGVDb25zdGFudHMuREVGQVVMVF9GT05UX1NJWkU7Ci0JCQlpbnQgZm9udFJlZCA9IFNXVC5DT0xPUl9SRUQ7Ci0JCQlpbnQgZm9udEJsdWUgPSBTV1QuQ09MT1JfQkxVRTsKLQkJCWludCBmb250R3JlZW4gPSBTV1QuQ09MT1JfR1JFRU47Ci0KLQkJCWlmIChhbGlzdC5zaXplKCkgPiAwKSB7Ci0JCQkJZm9yIChJdGVyYXRvciBpb3IgPSBhbGlzdC5pdGVyYXRvcigpOyBpb3IuaGFzTmV4dCgpOykgewotCQkJCQlQcm9wZXJ0eSBwcm9wID0gKFByb3BlcnR5KSBpb3IubmV4dCgpOwotCQkJCQlpZiAocHJvcC5nZXRLZXkoKS5lcXVhbHMoCi0JCQkJCQkJR3JhcGhpY2FsRGF0YUhlbHBlci5HUkFQSF9OT0RFX0ZSRUVfVEVYVCkpIHsKLQkJCQkJCWwuc2V0VGV4dChwcm9wLmdldFZhbHVlKCkpOwotCQkJCQl9IGVsc2UgaWYgKHByb3AuZ2V0S2V5KCkuZXF1YWxzKAotCQkJCQkJCVRlbXBsYXRlQ29uc3RhbnRzLlBST1BFUlRZX0ZPTlRfTkFNRSkpIHsKLQkJCQkJCWZvbnROYW1lID0gcHJvcC5nZXRWYWx1ZSgpOwotCQkJCQl9IGVsc2UgaWYgKHByb3AuZ2V0S2V5KCkuZXF1YWxzKAotCQkJCQkJCVRlbXBsYXRlQ29uc3RhbnRzLlBST1BFUlRZX0ZPTlRfU1RZTEUpKSB7Ci0JCQkJCQlmb250U3R5bGUgPSBuZXcgSW50ZWdlcihwcm9wLmdldFZhbHVlKCkpLmludFZhbHVlKCk7Ci0JCQkJCX0gZWxzZSBpZiAocHJvcC5nZXRLZXkoKS5lcXVhbHMoCi0JCQkJCQkJVGVtcGxhdGVDb25zdGFudHMuUFJPUEVSVFlfRk9OVF9IRUlHSFQpKSB7Ci0JCQkJCQlmb250SGVpZ2h0ID0gbmV3IEludGVnZXIocHJvcC5nZXRWYWx1ZSgpKS5pbnRWYWx1ZSgpOwotCQkJCQl9IGVsc2UgaWYgKHByb3AuZ2V0S2V5KCkuZXF1YWxzKAotCQkJCQkJCVRlbXBsYXRlQ29uc3RhbnRzLlBST1BFUlRZX0ZPTlRfUkVEKSkgewotCQkJCQkJZm9udFJlZCA9IG5ldyBJbnRlZ2VyKHByb3AuZ2V0VmFsdWUoKSkuaW50VmFsdWUoKTsKLQkJCQkJfSBlbHNlIGlmIChwcm9wLmdldEtleSgpLmVxdWFscygKLQkJCQkJCQlUZW1wbGF0ZUNvbnN0YW50cy5QUk9QRVJUWV9GT05UX0JMVUUpKSB7Ci0JCQkJCQlmb250Qmx1ZSA9IG5ldyBJbnRlZ2VyKHByb3AuZ2V0VmFsdWUoKSkuaW50VmFsdWUoKTsKLQkJCQkJfSBlbHNlIGlmIChwcm9wLmdldEtleSgpLmVxdWFscygKLQkJCQkJCQlUZW1wbGF0ZUNvbnN0YW50cy5QUk9QRVJUWV9GT05UX0dSRUVOKSkgewotCQkJCQkJZm9udEdyZWVuID0gbmV3IEludGVnZXIocHJvcC5nZXRWYWx1ZSgpKS5pbnRWYWx1ZSgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlsLnNldFRleHQoKChOb2RlKSBnZXRNb2RlbCgpKS5nZXRHcmFwaE5vZGUoKS5nZXROYW1lKCkpOwotCQkJfQotCQkJaWYgKGZvbnQgIT0gbnVsbCAmJiAhZm9udC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCQlmb250LmRpc3Bvc2UoKTsKLQkJCX0KLQkJCWlmIChjb2xvciAhPSBudWxsICYmICFjb2xvci5pc0Rpc3Bvc2VkKCkpIHsKLQkJCQljb2xvci5kaXNwb3NlKCk7Ci0JCQl9Ci0JCQlmRGF0YSA9IG5ldyBGb250RGF0YShmb250TmFtZSwgZm9udEhlaWdodCwgZm9udFN0eWxlKTsKLQkJCWZvbnQgPSBuZXcgRm9udChQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldERpc3BsYXkoKSwgZkRhdGEpOwotCQkJY29sb3IgPSBuZXcgQ29sb3IobnVsbCwgZm9udFJlZCwgZm9udEdyZWVuLCBmb250Qmx1ZSk7Ci0JCQlsLnNldEZvbnQoZm9udCk7Ci0KLQkJCWwuc2V0Rm9yZWdyb3VuZENvbG9yKGNvbG9yKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBEaXJlY3RFZGl0TWFuYWdlciBjcmVhdGVEaXJlY3RFZGl0TWFuYWdlcigpIHsKLQkJTGFiZWwgbCA9IChMYWJlbCkgZ2V0RmlndXJlKCk7Ci0JCXJldHVybiBuZXcgVmFsaWRhdGluZ0ZyZWVUZXh0RWRpdE1hbmFnZXIodGhpcywgVGV4dENlbGxFZGl0b3IuY2xhc3MsCi0JCQkJbmV3IExhYmVsVGV4dENlbGxFZGl0b3JMb2NhdG9yKGwpLCBsKSB7Ci0JCQlwcm90ZWN0ZWQgU3RyaW5nIHZhbGlkYXRlKFN0cmluZyB0eHQpIHsKLQkJCQlyZXR1cm4gc3VwZXIudmFsaWRhdGUodHh0KTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlJRmlndXJlIGdldERpcmVjdEVkaXRGaWd1cmUoKSB7Ci0JCXJldHVybiBnZXRGaWd1cmUoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkZWFjdGl2YXRlKCkgewotCQlpZiAoZm9udCAhPSBudWxsICYmICFmb250LmlzRGlzcG9zZWQoKSkgewotCQkJZm9udC5kaXNwb3NlKCk7Ci0JCX0KLQkJaWYgKGNvbG9yICE9IG51bGwgJiYgIWNvbG9yLmlzRGlzcG9zZWQoKSkgewotCQkJY29sb3IuZGlzcG9zZSgpOwotCQl9Ci0JCXN1cGVyLmRlYWN0aXZhdGUoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvRnJlZVRleHROb2RlRWRpdFBhcnQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvRnJlZVRleHROb2RlRWRpdFBhcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGIxOWVmYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L0ZyZWVUZXh0Tm9kZUVkaXRQYXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZWRpdDsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5jb21tYW5kcy5DaGFuZ2VQcm9wZXJ0eVZhbHVlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5maWd1cmVzLkZyZWVUZXh0RmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLnV0aWwuVGVtcGxhdGVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTW9kZWxQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwudXRpbC5HcmFwaGljYWxEYXRhSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvcGVydHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3RDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5EaXJlY3RFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5yZXF1ZXN0cy5EaXJlY3RFZGl0UmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYudG9vbHMuRGlyZWN0RWRpdE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UZXh0Q2VsbEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLQotLyoqCi0gKiBQcm92aWRlcyBzdXBwb3J0IGZvciBkaXJlY3QgZWRpdGluZywgdGV4dCBmb250LCBjb2xvciBhbmQgc2l6ZSBjaGFuZ2VzLiAKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaS4KLSAqLwotCi1wdWJsaWMgY2xhc3MgRnJlZVRleHROb2RlRWRpdFBhcnQgZXh0ZW5kcyBOb2RlRWRpdFBhcnQgewotCXByaXZhdGUgRm9udCBmb250OwotCi0JcHJpdmF0ZSBDb2xvciBjb2xvcjsKLQotCXByaXZhdGUgRm9udERhdGEgZkRhdGE7Ci0KLQlwcml2YXRlIE5vZGVFZGl0UGFydCBwYXJ0OwotCi0JcHVibGljIEZyZWVUZXh0Tm9kZUVkaXRQYXJ0KE5vZGUgbW9kZWwpIHsKLQkJc3VwZXIobW9kZWwpOwotCQlwYXJ0ID0gdGhpczsgCi0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY29uc3RydWN0b3Igc3R1YgotCX0KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVGaWd1cmUoKSB7Ci0JCUZyZWVUZXh0RmlndXJlIGwgPSBuZXcgRnJlZVRleHRGaWd1cmUoKTsKLQkJcmV0dXJuIGw7Ci0KLQl9Ci0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRWRpdFBvbGljaWVzKCkgewotCQlzdXBlci5jcmVhdGVFZGl0UG9saWNpZXMoKTsKLQkJaWYgKCEoKE5vZGUpIGdldE1vZGVsKCkpLmlzUmVhZE9ubHkoKSkgewotCQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5ESVJFQ1RfRURJVF9ST0xFLAotCQkJCQljcmVhdGVEaXJlY3RFZGl0UG9saWN5KCkpOwotCQl9Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZWRpdC5CYXNlRWRpdFBhcnQjY3JlYXRlRGlyZWN0RWRpdFBvbGljeSgpCi0JICovCi0JcHJvdGVjdGVkIERpcmVjdEVkaXRQb2xpY3kgY3JlYXRlRGlyZWN0RWRpdFBvbGljeSgpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gbmV3IERpcmVjdEVkaXRQb2xpY3koKSB7Ci0JCQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXREaXJlY3RFZGl0Q29tbWFuZChEaXJlY3RFZGl0UmVxdWVzdCByZXF1ZXN0KSB7Ci0JCQkJcmV0dXJuIG5ldyBDaGFuZ2VQcm9wZXJ0eVZhbHVlQ29tbWFuZChwYXJ0LCAoU3RyaW5nKSByZXF1ZXN0Ci0JCQkJCQkuZ2V0Q2VsbEVkaXRvcigpLmdldFZhbHVlKCkpOwotCQkJfQotCi0JCQlwcm90ZWN0ZWQgdm9pZCBzaG93Q3VycmVudEVkaXRWYWx1ZShEaXJlY3RFZGl0UmVxdWVzdCByZXF1ZXN0KSB7Ci0JCQkJSUZpZ3VyZSBmaWcgPSBnZXREaXJlY3RFZGl0RmlndXJlKCk7Ci0JCQkJaWYgKGZpZyBpbnN0YW5jZW9mIEZyZWVUZXh0RmlndXJlKSB7Ci0JCQkJCSgoRnJlZVRleHRGaWd1cmUpIGZpZykuc2V0VGV4dCgoU3RyaW5nKSByZXF1ZXN0LmdldENlbGxFZGl0b3IoKQotCQkJCQkJCS5nZXRWYWx1ZSgpKTsKLQkJCQkJZmlnLmdldFVwZGF0ZU1hbmFnZXIoKS5wZXJmb3JtVXBkYXRlKCk7Ci0JCQkJfQotCQkJfQotCQl9OwotCX0KLQkKLQkKLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVQcm9wZXJ0eUNoYW5nZWQoTm90aWZpY2F0aW9uIG1zZykgewotCQlzd2l0Y2ggKG1zZy5nZXRGZWF0dXJlSUQoTm9kZS5jbGFzcykpIHsKLQkJY2FzZSBNb2RlbFBhY2thZ2UuVFlQRURfTk9ERV9fVFlQRToKLQkJCXJlZnJlc2hWaXN1YWxzKCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuaGFuZGxlUHJvcGVydHlDaGFuZ2VkKG1zZyk7Ci0JfQotCi0JcHVibGljIHZvaWQgcGVyZm9ybVJlcXVlc3QoUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCWlmIChyZXF1ZXN0LmdldFR5cGUoKSA9PSBSZXF1ZXN0Q29uc3RhbnRzLlJFUV9ESVJFQ1RfRURJVAotCQkJCSYmICEoKE5vZGUpIGdldE1vZGVsKCkpLmlzUmVhZE9ubHkoKSkgewotCQkJcGVyZm9ybURpcmVjdEVkaXQoKTsKLQkJfSBlbHNlIHsKLQkJCXN1cGVyLnBlcmZvcm1SZXF1ZXN0KHJlcXVlc3QpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFZpc3VhbHMoKSB7Ci0JCXN1cGVyLnJlZnJlc2hWaXN1YWxzKCk7Ci0JCUlGaWd1cmUgZmlnID0gZ2V0RGlyZWN0RWRpdEZpZ3VyZSgpOwotCQlpZiAoZmlnIGluc3RhbmNlb2YgRnJlZVRleHRGaWd1cmUpIHsKLQkJCUZyZWVUZXh0RmlndXJlIGwgPSAoRnJlZVRleHRGaWd1cmUpIGZpZzsKLQkJCUxpc3QgYWxpc3QgPSAoKE5vZGUpIGdldE1vZGVsKCkpLmdldEdyYXBoTm9kZSgpLmdldFByb3BlcnR5KCk7Ci0JCQlTdHJpbmcgZm9udE5hbWUgPSBUZW1wbGF0ZUNvbnN0YW50cy5ERUZBVUxUX0ZPTlRfTkFNRTsKLQkJCWludCBmb250U3R5bGUgPSBTV1QuTk9STUFMOwotCQkJaW50IGZvbnRIZWlnaHQgPSBUZW1wbGF0ZUNvbnN0YW50cy5ERUZBVUxUX0ZPTlRfU0laRTsKLQkJCWludCBmb250UmVkID0gU1dULkNPTE9SX1JFRDsKLQkJCWludCBmb250Qmx1ZSA9IFNXVC5DT0xPUl9CTFVFOwotCQkJaW50IGZvbnRHcmVlbiA9IFNXVC5DT0xPUl9HUkVFTjsKLQotCQkJaWYgKGFsaXN0LnNpemUoKSA+IDApIHsKLQkJCQlmb3IgKEl0ZXJhdG9yIGlvciA9IGFsaXN0Lml0ZXJhdG9yKCk7IGlvci5oYXNOZXh0KCk7KSB7Ci0JCQkJCVByb3BlcnR5IHByb3AgPSAoUHJvcGVydHkpIGlvci5uZXh0KCk7Ci0JCQkJCWlmIChwcm9wLmdldEtleSgpLmVxdWFscygKLQkJCQkJCQlHcmFwaGljYWxEYXRhSGVscGVyLkdSQVBIX05PREVfRlJFRV9URVhUKSkgewotCQkJCQkJbC5zZXRUZXh0KHByb3AuZ2V0VmFsdWUoKSk7Ci0JCQkJCX0gZWxzZSBpZiAocHJvcC5nZXRLZXkoKS5lcXVhbHMoCi0JCQkJCQkJVGVtcGxhdGVDb25zdGFudHMuUFJPUEVSVFlfRk9OVF9OQU1FKSkgewotCQkJCQkJZm9udE5hbWUgPSBwcm9wLmdldFZhbHVlKCk7Ci0JCQkJCX0gZWxzZSBpZiAocHJvcC5nZXRLZXkoKS5lcXVhbHMoCi0JCQkJCQkJVGVtcGxhdGVDb25zdGFudHMuUFJPUEVSVFlfRk9OVF9TVFlMRSkpIHsKLQkJCQkJCWZvbnRTdHlsZSA9IG5ldyBJbnRlZ2VyKHByb3AuZ2V0VmFsdWUoKSkuaW50VmFsdWUoKTsKLQkJCQkJfSBlbHNlIGlmIChwcm9wLmdldEtleSgpLmVxdWFscygKLQkJCQkJCQlUZW1wbGF0ZUNvbnN0YW50cy5QUk9QRVJUWV9GT05UX0hFSUdIVCkpIHsKLQkJCQkJCWZvbnRIZWlnaHQgPSBuZXcgSW50ZWdlcihwcm9wLmdldFZhbHVlKCkpLmludFZhbHVlKCk7Ci0JCQkJCX0gZWxzZSBpZiAocHJvcC5nZXRLZXkoKS5lcXVhbHMoCi0JCQkJCQkJVGVtcGxhdGVDb25zdGFudHMuUFJPUEVSVFlfRk9OVF9SRUQpKSB7Ci0JCQkJCQlmb250UmVkID0gbmV3IEludGVnZXIocHJvcC5nZXRWYWx1ZSgpKS5pbnRWYWx1ZSgpOwotCQkJCQl9IGVsc2UgaWYgKHByb3AuZ2V0S2V5KCkuZXF1YWxzKAotCQkJCQkJCVRlbXBsYXRlQ29uc3RhbnRzLlBST1BFUlRZX0ZPTlRfQkxVRSkpIHsKLQkJCQkJCWZvbnRCbHVlID0gbmV3IEludGVnZXIocHJvcC5nZXRWYWx1ZSgpKS5pbnRWYWx1ZSgpOwotCQkJCQl9IGVsc2UgaWYgKHByb3AuZ2V0S2V5KCkuZXF1YWxzKAotCQkJCQkJCVRlbXBsYXRlQ29uc3RhbnRzLlBST1BFUlRZX0ZPTlRfR1JFRU4pKSB7Ci0JCQkJCQlmb250R3JlZW4gPSBuZXcgSW50ZWdlcihwcm9wLmdldFZhbHVlKCkpLmludFZhbHVlKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCWwuc2V0VGV4dCgoKE5vZGUpIGdldE1vZGVsKCkpLmdldEdyYXBoTm9kZSgpLmdldE5hbWUoKSk7Ci0JCQl9Ci0JCQlpZiAoZm9udCAhPSBudWxsICYmICFmb250LmlzRGlzcG9zZWQoKSkgewotCQkJCWZvbnQuZGlzcG9zZSgpOwotCQkJfQotCQkJaWYgKGNvbG9yICE9IG51bGwgJiYgIWNvbG9yLmlzRGlzcG9zZWQoKSkgewotCQkJCWNvbG9yLmRpc3Bvc2UoKTsKLQkJCX0KLQkJCWZEYXRhID0gbmV3IEZvbnREYXRhKGZvbnROYW1lLCBmb250SGVpZ2h0LCBmb250U3R5bGUpOwotCQkJZm9udCA9IG5ldyBGb250KFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0RGlzcGxheSgpLCBmRGF0YSk7Ci0JCQljb2xvciA9IG5ldyBDb2xvcihudWxsLCBmb250UmVkLCBmb250R3JlZW4sIGZvbnRCbHVlKTsKLQkJCWwuc2V0Rm9udChmb250KTsKLQotCQkJbC5zZXRGb3JlZ3JvdW5kQ29sb3IoY29sb3IpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIERpcmVjdEVkaXRNYW5hZ2VyIGNyZWF0ZURpcmVjdEVkaXRNYW5hZ2VyKCkgewotCQlGcmVlVGV4dEZpZ3VyZSBsID0gKEZyZWVUZXh0RmlndXJlKSBnZXRGaWd1cmUoKTsKLQkJcmV0dXJuIG5ldyBGcmVlVGV4dERpcmVjdEVkaXRNYW5hZ2VyKHRoaXMsIFRleHRDZWxsRWRpdG9yLmNsYXNzLAotCQkJCW5ldyBGcmVlVGV4dENlbGxFZGl0b3JMb2NhdG9yKGwpLCBsKSB7Ci0JCQlwcm90ZWN0ZWQgU3RyaW5nIHZhbGlkYXRlKFN0cmluZyB0eHQpIHsKLQkJCQlyZXR1cm4gc3VwZXIudmFsaWRhdGUodHh0KTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlJRmlndXJlIGdldERpcmVjdEVkaXRGaWd1cmUoKSB7Ci0JCXJldHVybiBnZXRGaWd1cmUoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQuTm9kZUVkaXRQYXJ0I2RlYWN0aXZhdGUoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRlYWN0aXZhdGUoKSB7Ci0JCWlmIChmb250ICE9IG51bGwgJiYgIWZvbnQuaXNEaXNwb3NlZCgpKSB7Ci0JCQlmb250LmRpc3Bvc2UoKTsKLQkJfQotCQlpZiAoY29sb3IgIT0gbnVsbCAmJiAhY29sb3IuaXNEaXNwb3NlZCgpKSB7Ci0JCQljb2xvci5kaXNwb3NlKCk7Ci0JCX0KLQkJc3VwZXIuZGVhY3RpdmF0ZSgpOwotCX0KLQlTdHJpbmcgZ2V0RGlyZWN0RWRpdFRleHQoKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJLy9yZXR1cm4gc3VwZXIuZ2V0RGlyZWN0RWRpdFRleHQoKTsKLQkJSUZpZ3VyZSBmaWcgPSBnZXREaXJlY3RFZGl0RmlndXJlKCk7Ci0JCWlmIChmaWcgaW5zdGFuY2VvZiBGcmVlVGV4dEZpZ3VyZSkgewotCQkJcmV0dXJuICgoRnJlZVRleHRGaWd1cmUpIGZpZykuZ2V0VGV4dCgpOwotCQl9IAotCQlyZXR1cm4gIiI7ICAvLyROT04tTkxTLTEkCi0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L0xhYmVsQ2VsbEVkaXRvckxvY2F0b3IuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvTGFiZWxDZWxsRWRpdG9yTG9jYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YTk4NDE5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvTGFiZWxDZWxsRWRpdG9yTG9jYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZWRpdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi50b29scy5DZWxsRWRpdG9yTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNlbGxFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotCi0vKioKLSAqIENvbnN0cmFpbnQgZm9yIExhYmVsIHBsYWNpbmcuIAotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1maW5hbCBwdWJsaWMgY2xhc3MgTGFiZWxDZWxsRWRpdG9yTG9jYXRvciBpbXBsZW1lbnRzIENlbGxFZGl0b3JMb2NhdG9yIHsKLQotCXByaXZhdGUgSUZpZ3VyZSBmaWc7Ci0KLQlwcml2YXRlIHN0YXRpYyBpbnQgV0lOX1hfT0ZGU0VUID0gLTQ7Ci0KLQlwcml2YXRlIHN0YXRpYyBpbnQgV0lOX1dfT0ZGU0VUID0gNTsKLQotCXByaXZhdGUgc3RhdGljIGludCBHVEtfWF9PRkZTRVQgPSAwOwotCi0JcHJpdmF0ZSBzdGF0aWMgaW50IEdUS19XX09GRlNFVCA9IDA7Ci0KLQlwcml2YXRlIHN0YXRpYyBpbnQgTUFDX1hfT0ZGU0VUID0gLTM7Ci0KLQlwcml2YXRlIHN0YXRpYyBpbnQgTUFDX1dfT0ZGU0VUID0gOTsKLQotCXByaXZhdGUgc3RhdGljIGludCBNQUNfWV9PRkZTRVQgPSAtMzsKLQotCXByaXZhdGUgc3RhdGljIGludCBNQUNfSF9PRkZTRVQgPSA2OwotCi0JcHVibGljIExhYmVsQ2VsbEVkaXRvckxvY2F0b3IoSUZpZ3VyZSBmaWd1cmUpIHsKLQkJZmlnID0gZmlndXJlOwotCX0KLQkKLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmdlZi50b29scy5DZWxsRWRpdG9yTG9jYXRvciNyZWxvY2F0ZShvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNlbGxFZGl0b3IpCi0JICovCi0KLQlwdWJsaWMgdm9pZCByZWxvY2F0ZShDZWxsRWRpdG9yIGNlbGxlZGl0b3IpIHsKLQkJVGV4dCB0ZXh0ID0gKFRleHQpIGNlbGxlZGl0b3IuZ2V0Q29udHJvbCgpOwotCi0JCVJlY3RhbmdsZSByZWN0ID0gbnVsbDsKLQkJaWYgKGZpZyBpbnN0YW5jZW9mIExhYmVsKQotCQkJcmVjdCA9ICgoTGFiZWwpIGZpZykuZ2V0VGV4dEJvdW5kcygpLmludGVyc2VjdChmaWcuZ2V0Q2xpZW50QXJlYSgpKTsKLQkJZWxzZQotCQkJcmVjdCA9IGZpZy5nZXRDbGllbnRBcmVhKFJlY3RhbmdsZS5TSU5HTEVUT04pOwotCQlmaWcudHJhbnNsYXRlVG9BYnNvbHV0ZShyZWN0KTsKLQotCQlpbnQgeE9mZnNldCA9IDA7Ci0JCWludCB3T2Zmc2V0ID0gMDsKLQkJaW50IHlPZmZzZXQgPSAwOwotCQlpbnQgaE9mZnNldCA9IDA7Ci0KLQkJaWYgKFNXVC5nZXRQbGF0Zm9ybSgpLmVxdWFsc0lnbm9yZUNhc2UoImd0ayIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXhPZmZzZXQgPSBHVEtfWF9PRkZTRVQ7Ci0JCQl3T2Zmc2V0ID0gR1RLX1dfT0ZGU0VUOwotCQl9IGVsc2UgaWYgKFNXVC5nZXRQbGF0Zm9ybSgpLmVxdWFsc0lnbm9yZUNhc2UoImNhcmJvbiIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXhPZmZzZXQgPSBNQUNfWF9PRkZTRVQ7Ci0JCQl3T2Zmc2V0ID0gTUFDX1dfT0ZGU0VUOwotCQkJeU9mZnNldCA9IE1BQ19ZX09GRlNFVDsKLQkJCWhPZmZzZXQgPSBNQUNfSF9PRkZTRVQ7Ci0JCX0gZWxzZSB7Ci0JCQl4T2Zmc2V0ID0gV0lOX1hfT0ZGU0VUOwotCQkJd09mZnNldCA9IFdJTl9XX09GRlNFVDsKLQkJfQotCi0JCXRleHQuc2V0Qm91bmRzKHJlY3QueCArIHhPZmZzZXQsIHJlY3QueSArIHlPZmZzZXQsCi0JCQkJcmVjdC53aWR0aCArIHdPZmZzZXQsIHJlY3QuaGVpZ2h0ICsgaE9mZnNldCk7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9MYWJlbERpcmVjdEVkaXRNYW5hZ2VyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L0xhYmVsRGlyZWN0RWRpdE1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWIwZjkyOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L0xhYmVsRGlyZWN0RWRpdE1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5EaW1lbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi50b29scy5DZWxsRWRpdG9yTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYudG9vbHMuRGlyZWN0RWRpdE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DZWxsRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGV4dENlbGxFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci0KLS8qKgotICogTWFuYWdlcyB0aGUgZGlyZWN0IGVkaXQgb3BlcmF0aW9uIGJ5IGNyZWF0aW5nIGFuZCBtYWludGFpbmluZyB0aGUgCi0gKiB7QGxpbmsgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DZWxsRWRpdG9yfSBhbmQgZXhlY3V0aW5nIHRoZSByZXN1bHRpbmcgY29tbWFuZCBpZiAKLSAqIHRoZSBjZWxsIGVkaXRvciB2YWx1ZSBoYXMgY2hhbmdlZC4gRm9yIHtAbGluayBMYWJlbH0uCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTGFiZWxEaXJlY3RFZGl0TWFuYWdlciBleHRlbmRzIERpcmVjdEVkaXRNYW5hZ2VyIHsKLQotCUZvbnQgc2NhbGVkRm9udDsKLQotCXB1YmxpYyBMYWJlbERpcmVjdEVkaXRNYW5hZ2VyKEdyYXBoaWNhbEVkaXRQYXJ0IHNvdXJjZSwgQ2xhc3MgZWRpdG9yVHlwZSwKLQkJCUNlbGxFZGl0b3JMb2NhdG9yIGxvY2F0b3IpIHsKLQkJc3VwZXIoc291cmNlLCBlZGl0b3JUeXBlLCBsb2NhdG9yKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmdlZi50b29scy5EaXJlY3RFZGl0TWFuYWdlciNicmluZ0Rvd24oKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGJyaW5nRG93bigpIHsKLQkJLy8gVGhpcyBtZXRob2QgbWlnaHQgYmUgcmUtZW50ZXJlZCB3aGVuIHN1cGVyLmJyaW5nRG93bigpIGlzIGNhbGxlZC4KLQkJRm9udCBkaXNwb3NlRm9udCA9IHNjYWxlZEZvbnQ7Ci0JCXNjYWxlZEZvbnQgPSBudWxsOwotCQlzdXBlci5icmluZ0Rvd24oKTsKLQkJaWYgKGRpc3Bvc2VGb250ICE9IG51bGwpCi0JCQlkaXNwb3NlRm9udC5kaXNwb3NlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdENlbGxFZGl0b3IoKSB7Ci0JCVRleHQgdGV4dCA9IChUZXh0KSBnZXRDZWxsRWRpdG9yKCkuZ2V0Q29udHJvbCgpOwotCi0JCWdldENlbGxFZGl0b3IoKS5zZXRWYWx1ZShnZXRJbml0aWFsVGV4dCgpKTsKLQkJSUZpZ3VyZSBmaWd1cmUgPSBnZXRFZGl0UGFydCgpLmdldEZpZ3VyZSgpOwotCQlzY2FsZWRGb250ID0gZmlndXJlLmdldEZvbnQoKTsKLQkJRm9udERhdGEgZGF0YSA9IHNjYWxlZEZvbnQuZ2V0Rm9udERhdGEoKVswXTsKLQkJRGltZW5zaW9uIGZvbnRTaXplID0gbmV3IERpbWVuc2lvbigwLCBkYXRhLmdldEhlaWdodCgpKTsKLQkJZ2V0RGlyZWN0RWRpdEZpZ3VyZSgpLnRyYW5zbGF0ZVRvQWJzb2x1dGUoZm9udFNpemUpOwotCQlkYXRhLnNldEhlaWdodChmb250U2l6ZS5oZWlnaHQpOwotCQlzY2FsZWRGb250ID0gbmV3IEZvbnQobnVsbCwgZGF0YSk7Ci0KLQkJdGV4dC5zZXRGb250KHNjYWxlZEZvbnQpOwotCQl0ZXh0LnNlbGVjdEFsbCgpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIGNlbGwgZWRpdG9yIG9uIHRoZSBnaXZlbiBjb21wb3NpdGUuIFRoZSBjZWxsIGVkaXRvciBpcwotCSAqIGNyZWF0ZWQgYnkgaW5zdGFudGlhdGluZyB0aGUgY2VsbCBlZGl0b3IgdHlwZSBwYXNzZWQgaW50byB0aGlzCi0JICogRGlyZWN0RWRpdE1hbmFnZXIncyBjb25zdHVjdG9yLgotCSAqIAotCSAqIEBwYXJhbSBjb21wb3NpdGUKLQkgKiAgICAgICAgICAgIHRoZSBjb21wb3NpdGUgdG8gY3JlYXRlIHRoZSBjZWxsIGVkaXRvciBvbgotCSAqIEByZXR1cm4gdGhlIG5ld2x5IGNyZWF0ZWQgY2VsbCBlZGl0b3IKLQkgKi8KLQlwcm90ZWN0ZWQgQ2VsbEVkaXRvciBjcmVhdGVDZWxsRWRpdG9yT24oQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotCQlyZXR1cm4gbmV3IFRleHRDZWxsRWRpdG9yKGNvbXBvc2l0ZSwgU1dULk1VTFRJIHwgU1dULldSQVApOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gdGhlIGluaXRpYWwgdmFsdWUgb2YgdGhlIHRleHQgc2hvd24gaW4gdGhlIGNlbGwgZWRpdG9yIGZvcgotCSAqICAgICAgICAgZGlyZWN0LWVkaXRpbmc7IGNhbm5vdCByZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEluaXRpYWxUZXh0KCkgewotCQlyZXR1cm4gKChCYXNlRWRpdFBhcnQpIGdldEVkaXRQYXJ0KCkpLmdldERpcmVjdEVkaXRUZXh0KCk7Ci0JfQotCi0JLyoqCi0JICogVXNlZCB0byBkZXRlcm1pbmUgdGhlIGluaXRpYWwgdGV4dCBvZiB0aGUgY2VsbCBlZGl0b3IgYW5kIHRvIGRldGVybWluZQotCSAqIHRoZSBmb250IHNpemUgb2YgdGhlIHRleHQuCi0JICogCi0JICogQHJldHVybiB0aGUgZmlndXJlIGJlaW5nIGVkaXRlZAotCSAqLwotCXByb3RlY3RlZCBJRmlndXJlIGdldERpcmVjdEVkaXRGaWd1cmUoKSB7Ci0JCXJldHVybiAoKEJhc2VFZGl0UGFydCkgZ2V0RWRpdFBhcnQoKSkuZ2V0RGlyZWN0RWRpdEZpZ3VyZSgpOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvTGFiZWxUZXh0Q2VsbEVkaXRvckxvY2F0b3IuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvTGFiZWxUZXh0Q2VsbEVkaXRvckxvY2F0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2YxZWQ0OC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L0xhYmVsVGV4dENlbGxFZGl0b3JMb2NhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnRvb2xzLkNlbGxFZGl0b3JMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2VsbEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLQotLyoqCi0gKiBDb25zdHJhaW50IGZvciBUZXh0IHBsYWNpbmcuIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIExhYmVsVGV4dENlbGxFZGl0b3JMb2NhdG9yIGltcGxlbWVudHMgQ2VsbEVkaXRvckxvY2F0b3IgewotCi0JcHJpdmF0ZSBMYWJlbCBsYWJlbDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgTGFiZWxUZXh0Q2VsbEVkaXRvckxvY2F0b3IgZm9yIHRoZSBnaXZlbiBMYWJlbAotCSAqIAotCSAqIEBwYXJhbSBsYWJlbAotCSAqICAgICAgICAgICAgdGhlIExhYmVsCi0JICovCi0JcHVibGljIExhYmVsVGV4dENlbGxFZGl0b3JMb2NhdG9yKExhYmVsIGxhYmVsKSB7Ci0JCXNldExhYmVsKGxhYmVsKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIENlbGxFZGl0b3JMb2NhdG9yI3JlbG9jYXRlKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2VsbEVkaXRvcikKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWxvY2F0ZShDZWxsRWRpdG9yIGNlbGxlZGl0b3IpIHsKLQkJVGV4dCB0ZXh0ID0gKFRleHQpIGNlbGxlZGl0b3IuZ2V0Q29udHJvbCgpOwotCQlQb2ludCBwcmVmID0gdGV4dC5jb21wdXRlU2l6ZSgtMSwgLTEpOwotCQlSZWN0YW5nbGUgcmVjdCA9IGxhYmVsLmdldFRleHRCb3VuZHMoKS5nZXRDb3B5KCk7Ci0JCWxhYmVsLnRyYW5zbGF0ZVRvQWJzb2x1dGUocmVjdCk7Ci0JCXRleHQuc2V0Qm91bmRzKHJlY3QueCAtIDEsIHJlY3QueSAtIDEsIHByZWYueCArIDEsIHByZWYueSArIDEpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIExhYmVsIGZpZ3VyZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBMYWJlbAotCSAqLwotCXByb3RlY3RlZCBMYWJlbCBnZXRMYWJlbCgpIHsKLQkJcmV0dXJuIGxhYmVsOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGxhYmVsLgotCSAqIAotCSAqIEBwYXJhbSBsYWJlbAotCSAqICAgICAgICAgICAgVGhlIGxhYmVsIHRvIHNldAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldExhYmVsKExhYmVsIGxhYmVsKSB7Ci0JCXRoaXMubGFiZWwgPSBsYWJlbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvTGlua0VkaXRQYXJ0LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L0xpbmtFZGl0UGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNmJjYmRiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvTGlua0VkaXRQYXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZWRpdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Db2xvckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuUG9seWdvbkRlY29yYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlBvbHlsaW5lQ29ubmVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuY29tbWFuZHMuRGVsZXRlTGlua0NvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZWRpdC5wb2xpY2llcy5MaW5rQmVuZHBvaW50RWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0LnBvbGljaWVzLkxpbmtFbmRwb2ludEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZmlndXJlcy5Db2xvcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYudXRpbC5WYWxpZGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTW9kZWxQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cGFydHMuQWJzdHJhY3RDb25uZWN0aW9uRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5Db25uZWN0aW9uRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuR3JvdXBSZXF1ZXN0OwotCi0vKioKLSAqIFByb3ZpZGVzIHN1cHBvcnQgdG8gdXBkYXRlIHRoZSBhcHBlYXJhbmNlLCBhbmQgaW5zdGFsbHMgdGhlIGVkaXRwb2xpY2llcwotICogc3BlY2lmaWMgdGhlIHtAbGluayBMaW5rfSBhbmQgbGlzdGVucyB0byBjaGFuZ2VzIGluIHRoZSBkaWFncmFtIG1vZGVsLgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIExpbmtFZGl0UGFydCBleHRlbmRzIEFic3RyYWN0Q29ubmVjdGlvbkVkaXRQYXJ0IHsKLQotCXByb3RlY3RlZCBBZGFwdGVyIG1vZGVsTGlzdGVuZXIgPSBuZXcgQWRhcHRlckltcGwoKSB7Ci0JCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG1zZykgewotCQkJaGFuZGxlUHJvcGVydHlDaGFuZ2VkKG1zZyk7Ci0JCX0KLQl9OwotCi0JcHVibGljIExpbmtFZGl0UGFydChMaW5rIGNvbm4pIHsKLQkJc3VwZXIoKTsKLQkJc2V0TW9kZWwoY29ubik7Ci0JfQotCi0JcHVibGljIHZvaWQgYWN0aXZhdGUoKSB7Ci0JCXN1cGVyLmFjdGl2YXRlKCk7Ci0JCWdldExpbmsoKS5lQWRhcHRlcnMoKS5hZGQobW9kZWxMaXN0ZW5lcik7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRWRpdFBvbGljaWVzKCkgewotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LkNPTk5FQ1RJT05fRU5EUE9JTlRTX1JPTEUsCi0JCQkJbmV3IExpbmtFbmRwb2ludEVkaXRQb2xpY3koKSk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuQ09OTkVDVElPTl9ST0xFLAotCQkJCW5ldyBDb25uZWN0aW9uRWRpdFBvbGljeSgpIHsKLQkJCQkJcHJvdGVjdGVkIENvbW1hbmQgZ2V0RGVsZXRlQ29tbWFuZChHcm91cFJlcXVlc3QgcmVxdWVzdCkgewotCQkJCQkJQm9vbGVhbiBib29sID0gKEJvb2xlYW4pIHJlcXVlc3QuZ2V0RXh0ZW5kZWREYXRhKCkuZ2V0KAotCQkJCQkJCQlEZWxldGVDb21tYW5kLktFWV9QRVJNX0RFTEVURSk7Ci0JCQkJCQlib29sZWFuIHBlcm1EZWxldGUgPSBib29sID09IG51bGwgPyBmYWxzZSA6IGJvb2wKLQkJCQkJCQkJLmJvb2xlYW5WYWx1ZSgpOwotCQkJCQkJcmV0dXJuIG5ldyBEZWxldGVMaW5rQ29tbWFuZCgoTGluaykgZ2V0SG9zdCgpCi0JCQkJCQkJCS5nZXRNb2RlbCgpLCBwZXJtRGVsZXRlKTsKLQkJCQkJfQotCQkJCX0pOwotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LkNPTk5FQ1RJT05fQkVORFBPSU5UU19ST0xFLAotCQkJCW5ldyBMaW5rQmVuZHBvaW50RWRpdFBvbGljeSgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVGaWd1cmUoKSB7Ci0JCVBvbHlsaW5lQ29ubmVjdGlvbiBjb25uID0gbmV3IFBvbHlsaW5lQ29ubmVjdGlvbigpOwotCQljb25uLnNldFRhcmdldERlY29yYXRpb24obmV3IFBvbHlnb25EZWNvcmF0aW9uKCkpOwotCQl1cGRhdGVBcHBlYXJhbmNlKCk7Ci0JCXJldHVybiBjb25uOwotCX0KLQotCXByaXZhdGUgdm9pZCB1cGRhdGVBcHBlYXJhbmNlKCkgewotCQlpZiAoZmlndXJlID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCUxpbmsgbGluayA9IChMaW5rKSBnZXRNb2RlbCgpOwotCQlpZiAoVmFsaWRhdGlvbi5pc1JlYWRPbmx5KGxpbmspKSB7Ci0JCQlmaWd1cmUuc2V0Rm9yZWdyb3VuZENvbG9yKENvbG9ycy5JTkhFUklURURfRUxFTUVOVF9MQUJFTCk7Ci0JCX0gZWxzZSB7Ci0JCQlmaWd1cmUuc2V0Rm9yZWdyb3VuZENvbG9yKENvbG9yQ29uc3RhbnRzLmJsYWNrKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGRlYWN0aXZhdGUoKSB7Ci0JCWdldExpbmsoKS5lQWRhcHRlcnMoKS5yZW1vdmUobW9kZWxMaXN0ZW5lcik7Ci0JCXN1cGVyLmRlYWN0aXZhdGUoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgTGluayBnZXRMaW5rKCkgewotCQlyZXR1cm4gKExpbmspIGdldE1vZGVsKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlUHJvcGVydHlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBtc2cpIHsKLQkJc3dpdGNoIChtc2cuZ2V0RmVhdHVyZUlEKExpbmsuY2xhc3MpKSB7Ci0JCWNhc2UgTW9kZWxQYWNrYWdlLkxJTktfX0JFTkRQT0lOVFM6Ci0JCQlyZWZyZXNoVmlzdWFscygpOwotCQkJYnJlYWs7Ci0JCWNhc2UgTW9kZWxQYWNrYWdlLkxJTktfX1RBUkdFVF9FTkRfUE9JTlQ6Ci0JCQlyZWZyZXNoVGFyZ2V0QW5jaG9yKCk7Ci0JCQlicmVhazsKLQkJY2FzZSBNb2RlbFBhY2thZ2UuTElOS19fU09VUkNFX0VORF9QT0lOVDoKLQkJCXJlZnJlc2hTb3VyY2VBbmNob3IoKTsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFZpc3VhbHMoKSB7Ci0JCXVwZGF0ZUFwcGVhcmFuY2UoKTsKLQkJZ2V0Q29ubmVjdGlvbkZpZ3VyZSgpLnNldFJvdXRpbmdDb25zdHJhaW50KGdldExpbmsoKS5nZXRCZW5kcG9pbnRzKCkpOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvTmFtZWROb2RlRWRpdFBhcnQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvTmFtZWROb2RlRWRpdFBhcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjFiNTIyMS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L05hbWVkTm9kZUVkaXRQYXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZWRpdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Db2xvckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlBvc2l0aW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5jb21tYW5kcy5DaGFuZ2VOYW1lQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5maWd1cmVzLkNvbG9yczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5maWd1cmVzLlNlbGVjdGFibGVMYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5maWd1cmVzLlRleHRGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYudXRpbC5UZW1wbGF0ZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5BY3Rpdml0eURldGFpbERpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTW9kZWxQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5hbWVkTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLlRhc2tOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLldvcmtCcmVha2Rvd25FbGVtZW50Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Xb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLnV0aWwuR3JhcGhpY2FsRGF0YUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuUHJvY2Vzc1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3RDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5EaXJlY3RFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5yZXF1ZXN0cy5EaXJlY3RFZGl0UmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0KLWltcG9ydCBjb20uaWJtLmljdS50ZXh0LkJyZWFrSXRlcmF0b3I7Ci0KLS8qKgotICogRGlhZ3JhbSBjaGlsZHJlbiBzaG91bGQgZXh0ZW5kIHRoaXMgTmFtZWROb2RlRWRpdFBhcnQgaW4gb3JkZXIgdG8gc3VwcG9ydCBuYW1lIGZvciBmaWd1cmUuCi0gKiBOYW1lZE5vZGVFZGl0UGFydCBwcm92aWRlcyBpbnN0cnVjdHVyZSB0byBoYW5kbGUgdGhlIG5hbWUgd3JhcHBpbmcgYW5kIGNvbG9yLiBTdXBwb3J0IGRpcmVjdCAKLSAqIGVkaXRpbmcgZmVlZGJhY2suICAgCi0gKiAgCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgTmFtZWROb2RlRWRpdFBhcnQgZXh0ZW5kcyBOb2RlRWRpdFBhcnQgewotCi0JcHVibGljIE5hbWVkTm9kZUVkaXRQYXJ0KE5hbWVkTm9kZSBtb2RlbCkgewotCQlzdXBlcihtb2RlbCk7Ci0JfQotCi0JcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlRmlndXJlKCkgewotCQlMYWJlbCBsID0gbmV3IFNlbGVjdGFibGVMYWJlbCgpOwotCQlsLnNldExhYmVsQWxpZ25tZW50KFBvc2l0aW9uQ29uc3RhbnRzLkxFRlQpOwotCQlpZiAoZ2V0SW1hZ2UoKSAhPSBudWxsKSB7Ci0JCQlsLnNldEljb24oZ2V0SW1hZ2UoKSk7Ci0JCX0KLQkJbC5zZXRUZXh0UGxhY2VtZW50KFBvc2l0aW9uQ29uc3RhbnRzLlNPVVRIKTsKLQkJbC5zZXRGb250KFRlbXBsYXRlQ29uc3RhbnRzLkRFRkFVTFRfRk9OVCk7Ci0JCXNldExhYmVsRm9yZWdyb3VuZENvbG9yKGwpOwotCQlyZXR1cm4gbDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0TGFiZWxGb3JlZ3JvdW5kQ29sb3IoTGFiZWwgbCkgewotCQlOYW1lZE5vZGUgbm9kZSA9IChOYW1lZE5vZGUpIGdldE1vZGVsKCk7Ci0JCS8vIE9iamVjdCBlID0gbm9kZS5nZXRPYmplY3QoKTsKLQkJLy8gYm9vbGVhbiBzdXBwcmVzc2VkID0gaXNTdXBwcmVzc2VkKGUpOwotCQlib29sZWFuIHN1cHByZXNzZWQgPSBub2RlLmlzU3VwcHJlc3NlZCgpOwotCQlpZiAobm9kZS5pc1JlYWRPbmx5KCkpIHsKLQkJCWlmICghc3VwcHJlc3NlZCkgewotCQkJCWwuc2V0Rm9yZWdyb3VuZENvbG9yKENvbG9ycy5JTkhFUklURURfRUxFTUVOVF9MQUJFTCk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoIXN1cHByZXNzZWQpIHsKLQkJCQlsLnNldEZvcmVncm91bmRDb2xvcihDb2xvckNvbnN0YW50cy5ibGFjayk7Ci0JCQl9Ci0JCX0KLQkJaWYgKHN1cHByZXNzZWQpIHsKLQkJCWwuc2V0Rm9yZWdyb3VuZENvbG9yKENvbG9ycy5TVVBSRVNTRURfRUxFTUVOVF9MQUJFTCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgSW1hZ2UgZ2V0SW1hZ2UoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUVkaXRQb2xpY2llcygpIHsKLQkJc3VwZXIuY3JlYXRlRWRpdFBvbGljaWVzKCk7Ci0JCWlmICghKChOb2RlKSBnZXRNb2RlbCgpKS5pc1JlYWRPbmx5KCkpIHsKLQkJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuRElSRUNUX0VESVRfUk9MRSwKLQkJCQkJY3JlYXRlRGlyZWN0RWRpdFBvbGljeSgpKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBEaXJlY3RFZGl0UG9saWN5IGNyZWF0ZURpcmVjdEVkaXRQb2xpY3koKSB7Ci0JCXJldHVybiBuZXcgRGlyZWN0RWRpdFBvbGljeSgpIHsKLQkJCXByb3RlY3RlZCBDb21tYW5kIGdldERpcmVjdEVkaXRDb21tYW5kKERpcmVjdEVkaXRSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJCQlyZXR1cm4gbmV3IENoYW5nZU5hbWVDb21tYW5kKChOYW1lZE5vZGUpIGdldE1vZGVsKCksCi0JCQkJCQkoU3RyaW5nKSByZXF1ZXN0LmdldENlbGxFZGl0b3IoKS5nZXRWYWx1ZSgpKTsKLQkJCX0KLQotCQkJcHJvdGVjdGVkIHZvaWQgc2hvd0N1cnJlbnRFZGl0VmFsdWUoRGlyZWN0RWRpdFJlcXVlc3QgcmVxdWVzdCkgewotCQkJCUlGaWd1cmUgZmlnID0gZ2V0RGlyZWN0RWRpdEZpZ3VyZSgpOwotCQkJCVN0cmluZyBzID0gKFN0cmluZykgcmVxdWVzdC5nZXRDZWxsRWRpdG9yKCkuZ2V0VmFsdWUoKTsKLQkJCQlpZiAoZmlnIGluc3RhbmNlb2YgTGFiZWwpIHsKLQkJCQkJKChMYWJlbCkgZmlnKS5zZXRUZXh0KHMpOwotCQkJCX0KLQkJCQllbHNlIGlmIChmaWcgaW5zdGFuY2VvZiBUZXh0RmlndXJlKSB7Ci0JCQkJCSgoVGV4dEZpZ3VyZSkgZmlnKS5zZXRUZXh0KHMpOwotCQkJCX0KLQkJCQlmaWcuZ2V0VXBkYXRlTWFuYWdlcigpLnBlcmZvcm1VcGRhdGUoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVQcm9wZXJ0eUNoYW5nZWQoTm90aWZpY2F0aW9uIG1zZykgewotCQlzd2l0Y2ggKG1zZy5nZXRGZWF0dXJlSUQoTmFtZWROb2RlLmNsYXNzKSkgewotCQljYXNlIE1vZGVsUGFja2FnZS5OQU1FRF9OT0RFX19OQU1FOgotCQkJcmVmcmVzaFZpc3VhbHMoKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5oYW5kbGVQcm9wZXJ0eUNoYW5nZWQobXNnKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBwZXJmb3JtUmVxdWVzdChSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJaWYgKHJlcXVlc3QuZ2V0VHlwZSgpID09IFJlcXVlc3RDb25zdGFudHMuUkVRX0RJUkVDVF9FRElUCi0JCQkJJiYgISgoTm9kZSkgZ2V0TW9kZWwoKSkuaXNSZWFkT25seSgpKSB7Ci0JCQlwZXJmb3JtRGlyZWN0RWRpdCgpOwotCQl9IGVsc2UgewotCQkJc3VwZXIucGVyZm9ybVJlcXVlc3QocmVxdWVzdCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBXUkFQX1dJRFRIID0gMTI7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBXT1JLX1BST0RVQ1RfV1JBUF9XSURUSCA9IDM7Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoVmlzdWFscygpIHsKLQkJc3VwZXIucmVmcmVzaFZpc3VhbHMoKTsKLQkJSUZpZ3VyZSBmaWcgPSBnZXREaXJlY3RFZGl0RmlndXJlKCk7Ci0JCWlmIChmaWcgaW5zdGFuY2VvZiBMYWJlbCkgewotCQkJTGFiZWwgbCA9IChMYWJlbCkgZmlnOwotCQkJc2V0TGFiZWxGb3JlZ3JvdW5kQ29sb3IobCk7Ci0JCQlTdHJpbmcgdGV4dDsKLQkJCS8vIEJlbG93IGNoZWNrIGlzIHJlcXVpcmVkIGZvciBFeHRlbmRlZCBBY3Rpdml0eSBwcmVzZW50YXRpb24gbmFtZQotCQkJLy8gc2hvdWxkIGJlIHVzZWQgZnJvbSBiYXNlLgotCQkJaWYgKGdldE1vZGVsKCkgaW5zdGFuY2VvZiBXb3JrQnJlYWtkb3duRWxlbWVudE5vZGUpIHsKLQkJCQlXb3JrQnJlYWtkb3duRWxlbWVudE5vZGUgbm9kZSA9IChXb3JrQnJlYWtkb3duRWxlbWVudE5vZGUpIGdldE1vZGVsKCk7Ci0JCQkJT2JqZWN0IHdiZWxlbWVudCA9IG5vZGUuZ2V0T2JqZWN0KCk7Ci0JCQkJaWYgKHdiZWxlbWVudCBpbnN0YW5jZW9mIEFjdGl2aXR5Ci0JCQkJCQkmJiBQcm9jZXNzVXRpbAotCQkJCQkJCQkuaXNFeHRlbmRpbmdPckxvY2FsbHlDb250cmlidXRpbmcoKEJyZWFrZG93bkVsZW1lbnQpIHdiZWxlbWVudCkpIHsKLQkJCQkJdGV4dCA9IFByb2Nlc3NVdGlsCi0JCQkJCQkJLmdldFByZXNlbnRhdGlvbk5hbWUoKEJyZWFrZG93bkVsZW1lbnQpIHdiZWxlbWVudCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJdGV4dCA9ICgoTmFtZWROb2RlKSBnZXRNb2RlbCgpKS5nZXROYW1lKCk7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQl0ZXh0ID0gKChOYW1lZE5vZGUpIGdldE1vZGVsKCkpLmdldE5hbWUoKTsKLQkJCX0KLQkJCXRyeSB7Ci0JCQkJaWYgKGdldFBhcmVudCgpIGluc3RhbmNlb2YgQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdFBhcnQKLQkJCQkJCXx8IGdldFBhcmVudCgpLmdldFBhcmVudCgpIGluc3RhbmNlb2YgQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdFBhcnQpIHsKLQkJCQkJaW50IHcgPSBXUkFQX1dJRFRIOwotCQkJCQlpZiAodGhpcy5nZXRNb2RlbCgpIGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZSkKLQkJCQkJCXcgPSBXT1JLX1BST0RVQ1RfV1JBUF9XSURUSDsKLQkJCQkJCi0JCQkJCWlmKHRoaXMuZ2V0TW9kZWwoKSBpbnN0YW5jZW9mIFRhc2tOb2RlICYmIAotCQkJCQkJCUdyYXBoaWNhbERhdGFIZWxwZXIuaXNBdXRvTGF5b3V0KAotCQkJCQkJCShBY3Rpdml0eURldGFpbERpYWdyYW0pZ2V0UGFyZW50KCkuZ2V0UGFyZW50KCkuZ2V0TW9kZWwoKSkpewotCQkJCQkJLy8gVXNlZCAxNiBhcyBtaW4gbGVuZ3RoIGZvciB0YXNrbmFtZSwgZWxzZSBhZGQgc3BhY2VzIHRvIGl0LgotCQkJCQkJLy8gVE9ETzogZmluZCBiZXR0ZXIgc29sdXRpb24gZm9yIHRoaXMuCi0JCQkJCQlpZih0ZXh0Lmxlbmd0aCgpIDwgMTYpewotCQkJCQkJCWludCBnYXAgPSAxNiAtIHRleHQubGVuZ3RoKCk7Ci0JCQkJCQkJZm9yKGludCBpPTA7IGk8Z2FwLzI7IGkrKyl7Ci0JCQkJCQkJCXRleHQrPSIgIjsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCX0KLQkJCQkJCQlmb3IoaW50IGk9MDsgaTxnYXAvMjsgaSsrKXsKLQkJCQkJCQkJdGV4dCA9ICIgIit0ZXh0OyAvLyROT04tTkxTLTEkCi0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCXRleHQgPSB3cmFwKHRleHQsIHcpOwotCQkJCX0KLQkJCX0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIG5wZSkgewotCQkJfQotCQkJbC5zZXRUZXh0KHRleHQpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyB3cmFwKFN0cmluZyBzLCBpbnQgd3JhcFdpZHRoKSB7Ci0JCVN0cmluZyB3cmFwcGVkID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJQnJlYWtJdGVyYXRvciBiaSA9IEJyZWFrSXRlcmF0b3IuZ2V0TGluZUluc3RhbmNlKCk7Ci0JCVN0cmluZyByZW1haW5pbmcgPSBzOwotCQl3aGlsZSAodHJ1ZSkgewotCQkJaWYgKHJlbWFpbmluZy5sZW5ndGgoKSA8PSB3cmFwV2lkdGgpIHsKLQkJCQl3cmFwcGVkICs9IHJlbWFpbmluZzsKLQkJCQlicmVhazsKLQkJCX0gZWxzZSB7Ci0JCQkJYmkuc2V0VGV4dChyZW1haW5pbmcpOwotCQkJCWludCBwb3MgPSBiaS5mb2xsb3dpbmcod3JhcFdpZHRoKTsKLQkJCQlpZiAocG9zID09IEJyZWFrSXRlcmF0b3IuRE9ORSkgewotCQkJCQl3cmFwcGVkICs9IHJlbWFpbmluZzsKLQkJCQkJYnJlYWs7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJaWYgKHBvcyA+PSByZW1haW5pbmcubGVuZ3RoKCkpIHsKLQkJCQkJCXdyYXBwZWQgKz0gcmVtYWluaW5nOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQl3cmFwcGVkICs9IHJlbWFpbmluZy5zdWJzdHJpbmcoMCwgcG9zKSArICJcbiI7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCXJlbWFpbmluZyA9IHJlbWFpbmluZy5zdWJzdHJpbmcocG9zKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gd3JhcHBlZDsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L05vZGVDb250YWluZXJFZGl0UGFydC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9Ob2RlQ29udGFpbmVyRWRpdFBhcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTAyMTg1MS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L05vZGVDb250YWluZXJFZGl0UGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5CZW5kcG9pbnRDb25uZWN0aW9uUm91dGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Db25uZWN0aW9uTGF5ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkZhblJvdXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuRGltZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuY29tbWFuZHMuRGVsZXRlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0LnBvbGljaWVzLk5vZGVDb250YWluZXJFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQucG9saWNpZXMuTm9kZUNvbnRhaW5lckZsb3dMYXlvdXRFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkRpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTW9kZWxQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5hbWVkTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGVDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkRlZmF1bHRFZGl0RG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuR3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkdyYXBoaWNhbFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuTGF5ZXJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwYXJ0cy5BYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuQ29tcG9uZW50RWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuR3JvdXBSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi50b29scy5EaXJlY3RFZGl0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYudWkuYWN0aW9ucy5BY3Rpb25SZWdpc3RyeTsKLQotLyoqCi0gKiBOb2RlQ29udGFpbmVyRWRpdFBhcnQgbWFuYWdlcyB0aGUgY2hpbGQgZWRpdHBhcnRzIGluIGEge0BsaW5rIEdyYXBoaWNhbFZpZXdlcn0uCi0gKiBQcm92aWRlcyBpbnN0cnVjdHVyZSB0byBoYW5kbGUgdGhlIG5vdGlmaWNhdGlvbnMgZnJvbSBtb2RlbC4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIE5vZGVDb250YWluZXJFZGl0UGFydCBleHRlbmRzIEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQKLQkJaW1wbGVtZW50cyBMYXllckNvbnN0YW50cyB7Ci0KLQlwcml2YXRlIEJlbmRwb2ludENvbm5lY3Rpb25Sb3V0ZXIgY1JvdXRlcjsKLQotCXByb3RlY3RlZCBBZGFwdGVyIG1vZGVsTGlzdGVuZXIgPSBuZXcgQWRhcHRlckltcGwoKSB7Ci0JCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG1zZykgewotCQkJaGFuZGxlUHJvcGVydHlDaGFuZ2VkKG1zZyk7Ci0JCX0KLQl9OwotCi0JcHVibGljIE5vZGVDb250YWluZXJFZGl0UGFydChOb2RlQ29udGFpbmVyIG1vZGVsKSB7Ci0JCXN1cGVyKCk7Ci0JCXNldE1vZGVsKG1vZGVsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhY3RpdmF0ZSgpIHsKLQkJc3VwZXIuYWN0aXZhdGUoKTsKLQkJTm9kZUNvbnRhaW5lciBtb2RlbCA9IChOb2RlQ29udGFpbmVyKSAoKEVPYmplY3QpIGdldE1vZGVsKCkpOwotCQltb2RlbC5lQWRhcHRlcnMoKS5hZGQobW9kZWxMaXN0ZW5lcik7Ci0JCW1vZGVsLmFkZENvbnN1bWVyKHRoaXMpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUVkaXRQb2xpY2llcygpIHsKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5DT01QT05FTlRfUk9MRSwgbmV3IENvbXBvbmVudEVkaXRQb2xpY3koKSB7Ci0JCQlwcm90ZWN0ZWQgQ29tbWFuZCBjcmVhdGVEZWxldGVDb21tYW5kKEdyb3VwUmVxdWVzdCBkZWxldGVSZXF1ZXN0KSB7Ci0JCQkJQm9vbGVhbiBib29sID0gKEJvb2xlYW4pIGRlbGV0ZVJlcXVlc3QuZ2V0RXh0ZW5kZWREYXRhKCkuZ2V0KAotCQkJCQkJRGVsZXRlQ29tbWFuZC5LRVlfUEVSTV9ERUxFVEUpOwotCQkJCWJvb2xlYW4gcGVybURlbGV0ZSA9IGJvb2wgPT0gbnVsbCA/IGZhbHNlIDogYm9vbC5ib29sZWFuVmFsdWUoKTsKLQkJCQlEZWxldGVDb21tYW5kIGNtZCA9IG5ldyBEZWxldGVDb21tYW5kKHBlcm1EZWxldGUpOwotCQkJCWNtZC5zZXRQYXJ0VG9CZURlbGV0ZWQoZ2V0SG9zdCgpLmdldE1vZGVsKCkpOwotCQkJCXJldHVybiBjbWQ7Ci0JCQl9Ci0JCX0pOwotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LlNFTEVDVElPTl9GRUVEQkFDS19ST0xFLCBudWxsKTsKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5DT05UQUlORVJfUk9MRSwKLQkJCQluZXcgTm9kZUNvbnRhaW5lckVkaXRQb2xpY3koKSk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuTk9ERV9ST0xFLCBudWxsKTsKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5MQVlPVVRfUk9MRSwKLQkJCQluZXcgTm9kZUNvbnRhaW5lckZsb3dMYXlvdXRFZGl0UG9saWN5KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIGRlYWN0aXZhdGUoKSB7Ci0JCU5vZGVDb250YWluZXIgbW9kZWwgPSAoTm9kZUNvbnRhaW5lcikgKChFT2JqZWN0KSBnZXRNb2RlbCgpKTsKLQkJbW9kZWwuZUFkYXB0ZXJzKCkucmVtb3ZlKG1vZGVsTGlzdGVuZXIpOwotCQltb2RlbC5yZW1vdmVDb25zdW1lcih0aGlzKTsKLQotCQlzdXBlci5kZWFjdGl2YXRlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIEVkaXRQYXJ0IGZpbmRDaGlsZEJ5TW9kZWwoT2JqZWN0IG1vZGVsKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGdldENoaWxkcmVuKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlFZGl0UGFydCBjaGlsZCA9IChFZGl0UGFydCkgaXRlci5uZXh0KCk7Ci0JCQlpZiAoY2hpbGQuZ2V0TW9kZWwoKSA9PSBtb2RlbCkgewotCQkJCXJldHVybiBjaGlsZDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRQYXJ0VG9FZGl0KENvbGxlY3Rpb24gcGFydHNUb0VkaXQsIE9iamVjdCBub2RlKSB7Ci0JCWlmIChub2RlIGluc3RhbmNlb2YgTmFtZWROb2RlKSB7Ci0JCQlFZGl0UGFydCBlZGl0UGFydCA9IGZpbmRDaGlsZEJ5TW9kZWwobm9kZSk7Ci0JCQlpZiAoZWRpdFBhcnQgaW5zdGFuY2VvZiBCYXNlRWRpdFBhcnQpIHsKLQkJCQlEaXJlY3RFZGl0TWFuYWdlciBlZGl0TWFuYWdlciA9ICgoQmFzZUVkaXRQYXJ0KSBlZGl0UGFydCkKLQkJCQkJCS5nZXREaXJlY3RFZGl0TWFuYWdlcigpOwotCQkJCWlmIChlZGl0TWFuYWdlciBpbnN0YW5jZW9mIFZhbGlkYXRpbmdEaXJlY3RFZGl0TWFuYWdlcgotCQkJCQkJJiYgKChWYWxpZGF0aW5nRGlyZWN0RWRpdE1hbmFnZXIpIGVkaXRNYW5hZ2VyKQotCQkJCQkJCQkudmFsaWRhdGUoKChOYW1lZE5vZGUpIG5vZGUpLmdldE5hbWUoKSkgIT0gbnVsbCkgewotCQkJCQlwYXJ0c1RvRWRpdC5hZGQoZWRpdFBhcnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGhhbmRsZVByb3BlcnR5Q2hhbmdlZChOb3RpZmljYXRpb24gbXNnKSB7Ci0JCXN3aXRjaCAobXNnLmdldEZlYXR1cmVJRChOb2RlQ29udGFpbmVyLmNsYXNzKSkgewotCQljYXNlIE1vZGVsUGFja2FnZS5OT0RFX19MT0NBVElPTjoKLQkJY2FzZSBNb2RlbFBhY2thZ2UuTk9ERV9fV0lEVEg6Ci0JCQlyZWZyZXNoVmlzdWFscygpOwotCQkJYnJlYWs7Ci0JCWNhc2UgTW9kZWxQYWNrYWdlLk5PREVfX09VVEdPSU5HX0NPTk5FQ1RJT05TOgotCQkJcmVmcmVzaFNvdXJjZUNvbm5lY3Rpb25zKCk7Ci0JCQlicmVhazsKLQkJY2FzZSBNb2RlbFBhY2thZ2UuTk9ERV9fSU5DT01JTkdfQ09OTkVDVElPTlM6Ci0JCQlyZWZyZXNoVGFyZ2V0Q29ubmVjdGlvbnMoKTsKLQkJCWJyZWFrOwotCQljYXNlIE1vZGVsUGFja2FnZS5OT0RFX0NPTlRBSU5FUl9fTk9ERVM6Ci0JCQlyZWZyZXNoQ2hpbGRyZW4oKTsKLQotCQkJTGlzdCBwYXJ0c1RvRWRpdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCXN3aXRjaCAobXNnLmdldEV2ZW50VHlwZSgpKSB7Ci0JCQljYXNlIE5vdGlmaWNhdGlvbi5BREQ6Ci0JCQkJYWRkUGFydFRvRWRpdChwYXJ0c1RvRWRpdCwgbXNnLmdldE5ld1ZhbHVlKCkpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBOb3RpZmljYXRpb24uQUREX01BTlk6Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gKChDb2xsZWN0aW9uKSBtc2cuZ2V0TmV3VmFsdWUoKSkKLQkJCQkJCS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJYWRkUGFydFRvRWRpdChwYXJ0c1RvRWRpdCwgaXRlci5uZXh0KCkpOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCX0KLQotCQkJaWYgKGdldFZpZXdlcigpLmdldENvbnRyb2woKS5pc0ZvY3VzQ29udHJvbCgpKSB7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gcGFydHNUb0VkaXQuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCUJhc2VFZGl0UGFydCBlZGl0UGFydCA9IChCYXNlRWRpdFBhcnQpIGl0ZXIubmV4dCgpOwotCQkJCQllZGl0UGFydC5wZXJmb3JtRGlyZWN0RWRpdCgpOwotCQkJCX0KLQkJCX0KLQotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoVmlzdWFscygpIHsKLQkJTm9kZSBub2RlID0gKE5vZGUpIGdldE1vZGVsKCk7Ci0JCURpbWVuc2lvbiBzaXplID0gbmV3IERpbWVuc2lvbihub2RlLmdldFdpZHRoKCksIG5vZGUuZ2V0SGVpZ2h0KCkpOwotCQlpZiAoc2l6ZSA9PSBudWxsKSB7Ci0JCQlzaXplID0gbmV3IERpbWVuc2lvbig2MCwgMTAwKTsKLQkJfQotCQlQb2ludCBsb2MgPSBub2RlLmdldExvY2F0aW9uKCk7Ci0JCWlmIChsb2MgPT0gbnVsbCkgewotCQkJbG9jID0gbmV3IFBvaW50KDEwLCAxMCk7Ci0JCX0KLQkJUmVjdGFuZ2xlIHIgPSBuZXcgUmVjdGFuZ2xlKGxvYywgc2l6ZSk7Ci0KLQkJKChHcmFwaGljYWxFZGl0UGFydCkgZ2V0UGFyZW50KCkpLnNldExheW91dENvbnN0cmFpbnQodGhpcywKLQkJCQlnZXRGaWd1cmUoKSwgcik7Ci0KLQkJaWYgKGNSb3V0ZXIgPT0gbnVsbCkgewotCQkJQ29ubmVjdGlvbkxheWVyIGNMYXllciA9IChDb25uZWN0aW9uTGF5ZXIpIGdldExheWVyKENPTk5FQ1RJT05fTEFZRVIpOwotCQkJRmFuUm91dGVyIHJvdXRlciA9IG5ldyBGYW5Sb3V0ZXIoKTsKLQkJCXJvdXRlci5zZXRTZXBhcmF0aW9uKDMwKTsKLQkJCWNSb3V0ZXIgPSBuZXcgQmVuZHBvaW50Q29ubmVjdGlvblJvdXRlcigpOwotCQkJcm91dGVyLnNldE5leHRSb3V0ZXIoY1JvdXRlcik7Ci0JCQljTGF5ZXIuc2V0Q29ubmVjdGlvblJvdXRlcihyb3V0ZXIpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIExpc3QgZ2V0TW9kZWxDaGlsZHJlbigpIHsKLQkJcmV0dXJuICgoTm9kZUNvbnRhaW5lcikgZ2V0TW9kZWwoKSkuZ2V0Tm9kZXMoKTsKLQl9Ci0JCi0JLyoqCi0JICogT25seSB1c2VmdWwgaW4gY2FzZSBvZiBBREQuIFBsYWNlZCBoZXJlIGluIG9yZGVyIHRvIGludm9rZSBpbiBzdWIgY2xhc3Nlcy4KLQkgKiBUT0RPOiAgTW92ZSB0aGlzIG1ldGhvZCB0byB1dGlsaXR5IGNsYXNzLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNsZWFuVXBEaWFncmFtKEVkaXRQYXJ0IHBhcnQpIHsKLQkJRWRpdFBhcnQgZGVwID0gKEVkaXRQYXJ0KSBwYXJ0LmdldFBhcmVudCgpOwotCQlpZihkZXAgaW5zdGFuY2VvZiBBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0UGFydCApewotCQkJCi0JCQlBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0UGFydCBhZGQgPSAoKEFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRQYXJ0KWRlcCk7Ci0JCQlpZighKChEaWFncmFtKWFkZC5nZXRNb2RlbCgpKS5pc1JlYWRPbmx5KCkpewotCQkJCWFkZC5nZXRSZWNlbnRseUFkZGVkUGFydHMoKS5hZGRBbGwoZGVwLmdldENoaWxkcmVuKCkpOwotCQkKLQkJCQkvLyBjbGVhbiB1cCB0aGUgZGlhZ3JhbQotCQkJCURlZmF1bHRFZGl0RG9tYWluIGVkaXRpbmdEb21haW4gPSBuZXcgRGVmYXVsdEVkaXREb21haW4obnVsbCk7Ci0JCQkJQWN0aW9uUmVnaXN0cnkgYWN0aW9uUmVnaXN0cnkgPSBuZXcgQWN0aW9uUmVnaXN0cnkoKTsKLQkJCi0JCQkJRGlhZ3JhbUFjdGlvblNlcnZpY2UgYWN0aW9uU2VydmljZSA9IG5ldyBEaWFncmFtQWN0aW9uU2VydmljZSgKLQkJCQkJCShHcmFwaGljYWxWaWV3ZXIpZ2V0UGFyZW50KCkuZ2V0Vmlld2VyKCksIGVkaXRpbmdEb21haW4sIGFjdGlvblJlZ2lzdHJ5KTsKLQkJCQlhY3Rpb25TZXJ2aWNlLnJlZ2lzdGVyVmVydGljYWxBbGlnbkZpcnN0U2VsZWN0ZWRBY3Rpb24oKTsKLQkJCi0JCQkJRGlhZ3JhbVVwZGF0ZVNlcnZpY2Ugc2VydmljZSA9IG5ldyBEaWFncmFtVXBkYXRlU2VydmljZSgKLQkJCQkJCShHcmFwaGljYWxWaWV3ZXIpZ2V0UGFyZW50KCkuZ2V0Vmlld2VyKCksIGVkaXRpbmdEb21haW4sIGFjdGlvblJlZ2lzdHJ5KTsKLQkJCQlzZXJ2aWNlLmNsZWFuVXBEaWFncmFtKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L05vZGVFZGl0UGFydC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9Ob2RlRWRpdFBhcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDU5ODdmNS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L05vZGVFZGl0UGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQ2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuQ2hvcGJveEFuY2hvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuQ29ubmVjdGlvbkFuY2hvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5jb21tYW5kcy5DcmVhdGVMaW5rQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5jb21tYW5kcy5EZWxldGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmNvbW1hbmRzLlJlY29ubmVjdExpbmtDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLnV0aWwuQ29ubmVjdGlvbkFuY2hvckxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Nb2RlbEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTW9kZWxQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkNvbm5lY3Rpb25FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuQ29tcG9uZW50RWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLkdyYXBoaWNhbE5vZGVFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuTGF5b3V0RWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuQ3JlYXRlQ29ubmVjdGlvblJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLkNyZWF0ZVJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLkdyb3VwUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuUmVjb25uZWN0UmVxdWVzdDsKLQotLyoqCi0gKiBQcm92aWRlcyBzdXBwb3J0IGZvciBjb25uZWN0aW9ucywgYW5kIGluc3RhbGxzIEVkaXRQb2xpY3kgZm9yICgKLSAqIHtAbGluayBFZGl0UG9saWN5LkNPTVBPTkVOVF9ST0xFfSwge0BsaW5rIEVkaXRQb2xpY3kuR1JBUEhJQ0FMX05PREVfUk9MRX0sCi0gKiB7QGxpbmtFZGl0UG9saWN5LlNFTEVDVElPTl9GRUVEQkFDS19ST0xFfSkKLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIE5vZGVFZGl0UGFydCBleHRlbmRzIEJhc2VFZGl0UGFydCBpbXBsZW1lbnRzCi0JCW9yZy5lY2xpcHNlLmdlZi5Ob2RlRWRpdFBhcnQgewotCi0JcHVibGljIE5vZGVFZGl0UGFydChOb2RlIG1vZGVsKSB7Ci0JCXN1cGVyKG1vZGVsKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVFZGl0UG9saWNpZXMoKSB7Ci0JCXN1cGVyLmNyZWF0ZUVkaXRQb2xpY2llcygpOwotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LkNPTVBPTkVOVF9ST0xFLCBuZXcgQ29tcG9uZW50RWRpdFBvbGljeSgpIHsKLQkJCXByb3RlY3RlZCBDb21tYW5kIGNyZWF0ZURlbGV0ZUNvbW1hbmQoR3JvdXBSZXF1ZXN0IGRlbGV0ZVJlcXVlc3QpIHsKLQkJCQlCb29sZWFuIGJvb2wgPSAoQm9vbGVhbikgZGVsZXRlUmVxdWVzdC5nZXRFeHRlbmRlZERhdGEoKS5nZXQoCi0JCQkJCQlEZWxldGVDb21tYW5kLktFWV9QRVJNX0RFTEVURSk7Ci0JCQkJYm9vbGVhbiBwZXJtRGVsZXRlID0gYm9vbCA9PSBudWxsID8gZmFsc2UgOiBib29sLmJvb2xlYW5WYWx1ZSgpOwotCQkJCURlbGV0ZUNvbW1hbmQgY21kID0gbmV3IERlbGV0ZUNvbW1hbmQocGVybURlbGV0ZSk7Ci0JCQkJY21kLnNldFBhcnRUb0JlRGVsZXRlZChnZXRIb3N0KCkuZ2V0TW9kZWwoKSk7Ci0JCQkJcmV0dXJuIGNtZDsKLQkJCX0KLQkJfSk7Ci0KLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5HUkFQSElDQUxfTk9ERV9ST0xFLAotCQkJCW5ldyBHcmFwaGljYWxOb2RlRWRpdFBvbGljeSgpIHsKLQkJCQkJcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q29ubmVjdGlvbkNvbXBsZXRlQ29tbWFuZCgKLQkJCQkJCQlDcmVhdGVDb25uZWN0aW9uUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCQkJCQlDcmVhdGVMaW5rQ29tbWFuZCBjbWQgPSAoQ3JlYXRlTGlua0NvbW1hbmQpIHJlcXVlc3QKLQkJCQkJCQkJLmdldFN0YXJ0Q29tbWFuZCgpOwotCQkJCQkJY21kLnNldFRhcmdldCgoTm9kZSkgZ2V0SG9zdCgpLmdldE1vZGVsKCkpOwotCi0JCQkJCQlpZiAocmVxdWVzdC5nZXRUYXJnZXRFZGl0UGFydCgpIGluc3RhbmNlb2YgQ29ubmVjdGlvbkFuY2hvckxvY2F0b3IpIHsKLQkJCQkJCQlpZiAocmVxdWVzdC5nZXRUYXJnZXRFZGl0UGFydCgpLmVxdWFscygKLQkJCQkJCQkJCXJlcXVlc3QuZ2V0U291cmNlRWRpdFBhcnQoKSkpIHsKLQotCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCWNtZAotCQkJCQkJCQkJCS5zZXRUYXJnZXRFbmRQb2ludCgoKENvbm5lY3Rpb25BbmNob3JMb2NhdG9yKSByZXF1ZXN0Ci0JCQkJCQkJCQkJCQkuZ2V0VGFyZ2V0RWRpdFBhcnQoKSkKLQkJCQkJCQkJCQkJCS5nZXRMb2NhdGlvbihyZXF1ZXN0Ci0JCQkJCQkJCQkJCQkJCS5nZXRMb2NhdGlvbigpKSk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCi0JCQkJCQlyZXR1cm4gY21kOwotCQkJCQl9Ci0KLQkJCQkJcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q29ubmVjdGlvbkNyZWF0ZUNvbW1hbmQoCi0JCQkJCQkJQ3JlYXRlQ29ubmVjdGlvblJlcXVlc3QgcmVxdWVzdCkgewotCQkJCQkJQ3JlYXRlTGlua0NvbW1hbmQgY21kID0gbmV3IENyZWF0ZUxpbmtDb21tYW5kKAotCQkJCQkJCQlNb2RlbEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUxpbmsoKSwKLQkJCQkJCQkJKE5vZGUpIGdldEhvc3QoKS5nZXRNb2RlbCgpKTsKLQkJCQkJCWlmIChyZXF1ZXN0LmdldFRhcmdldEVkaXRQYXJ0KCkgaW5zdGFuY2VvZiBDb25uZWN0aW9uQW5jaG9yTG9jYXRvcikgewotCQkJCQkJCWNtZAotCQkJCQkJCQkJLnNldFNvdXJjZUVuZFBvaW50KCgoQ29ubmVjdGlvbkFuY2hvckxvY2F0b3IpIHJlcXVlc3QKLQkJCQkJCQkJCQkJLmdldFRhcmdldEVkaXRQYXJ0KCkpCi0JCQkJCQkJCQkJCS5nZXRMb2NhdGlvbihyZXF1ZXN0LmdldExvY2F0aW9uKCkpKTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJY21kLnNldFNvdXJjZUVuZFBvaW50KHJlcXVlc3QuZ2V0TG9jYXRpb24oKSk7Ci0JCQkJCQl9Ci0JCQkJCQlyZXF1ZXN0LnNldFN0YXJ0Q29tbWFuZChjbWQpOwotCi0JCQkJCQlyZXR1cm4gY21kOwotCi0JCQkJCX0KLQotCQkJCQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRSZWNvbm5lY3RTb3VyY2VDb21tYW5kKAotCQkJCQkJCVJlY29ubmVjdFJlcXVlc3QgcmVxdWVzdCkgewotCQkJCQkJTGluayBsaW5rID0gKExpbmspIHJlcXVlc3QuZ2V0Q29ubmVjdGlvbkVkaXRQYXJ0KCkKLQkJCQkJCQkJLmdldE1vZGVsKCk7Ci0JCQkJCQlSZWNvbm5lY3RMaW5rQ29tbWFuZCBjbWQgPSBuZXcgUmVjb25uZWN0TGlua0NvbW1hbmQoCi0JCQkJCQkJCWxpbmssIChOb2RlKSBnZXRIb3N0KCkuZ2V0TW9kZWwoKSwgdHJ1ZSk7Ci0JCQkJCQlpZiAocmVxdWVzdC5nZXRUYXJnZXQoKSBpbnN0YW5jZW9mIENvbm5lY3Rpb25BbmNob3JMb2NhdG9yKSB7Ci0JCQkJCQkJY21kLnNldEVuZFBvaW50KCgoQ29ubmVjdGlvbkFuY2hvckxvY2F0b3IpIHJlcXVlc3QKLQkJCQkJCQkJCS5nZXRUYXJnZXQoKSkuZ2V0TG9jYXRpb24ocmVxdWVzdAotCQkJCQkJCQkJLmdldExvY2F0aW9uKCkpKTsKLQkJCQkJCX0KLQotCQkJCQkJcmV0dXJuIGNtZDsKLQkJCQkJfQotCi0JCQkJCXByb3RlY3RlZCBDb21tYW5kIGdldFJlY29ubmVjdFRhcmdldENvbW1hbmQoCi0JCQkJCQkJUmVjb25uZWN0UmVxdWVzdCByZXF1ZXN0KSB7Ci0JCQkJCQlMaW5rIGxpbmsgPSAoTGluaykgcmVxdWVzdC5nZXRDb25uZWN0aW9uRWRpdFBhcnQoKQotCQkJCQkJCQkuZ2V0TW9kZWwoKTsKLQkJCQkJCVJlY29ubmVjdExpbmtDb21tYW5kIGNtZCA9IG5ldyBSZWNvbm5lY3RMaW5rQ29tbWFuZCgKLQkJCQkJCQkJbGluaywgKE5vZGUpIGdldEhvc3QoKS5nZXRNb2RlbCgpLCBmYWxzZSk7Ci0JCQkJCQlpZiAocmVxdWVzdC5nZXRUYXJnZXQoKSBpbnN0YW5jZW9mIENvbm5lY3Rpb25BbmNob3JMb2NhdG9yKSB7Ci0JCQkJCQkJY21kLnNldEVuZFBvaW50KCgoQ29ubmVjdGlvbkFuY2hvckxvY2F0b3IpIHJlcXVlc3QKLQkJCQkJCQkJCS5nZXRUYXJnZXQoKSkuZ2V0TG9jYXRpb24ocmVxdWVzdAotCQkJCQkJCQkJLmdldExvY2F0aW9uKCkpKTsKLQkJCQkJCX0KLQkJCQkJCXJldHVybiBjbWQ7Ci0JCQkJCX0KLQkJCQl9KTsKLQotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LlNFTEVDVElPTl9GRUVEQkFDS19ST0xFLCBudWxsKTsKLQkJLy8gQnkgZGVmYXVsdCwgY2FuJ3QgYWRkIGFueXRoaW5nIHRvIGEgbm9kZQotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LkxBWU9VVF9ST0xFLCBuZXcgTGF5b3V0RWRpdFBvbGljeSgpIHsKLQkJCXByb3RlY3RlZCBFZGl0UG9saWN5IGNyZWF0ZUNoaWxkRWRpdFBvbGljeShFZGl0UGFydCBjaGlsZCkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCi0JCQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVDb21tYW5kKENyZWF0ZVJlcXVlc3QgcmVxdWVzdCkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCi0JCQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXREZWxldGVEZXBlbmRhbnRDb21tYW5kKFJlcXVlc3QgcmVxdWVzdCkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCi0JCQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRNb3ZlQ2hpbGRyZW5Db21tYW5kKFJlcXVlc3QgcmVxdWVzdCkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgTm9kZSBnZXROb2RlKCkgewotCQlyZXR1cm4gKE5vZGUpIGdldE1vZGVsKCk7Ci0JfQotCi0JcHJvdGVjdGVkIExpc3QgZ2V0TW9kZWxTb3VyY2VDb25uZWN0aW9ucygpIHsKLQkJcmV0dXJuIGdldE5vZGUoKS5nZXRPdXRnb2luZ0Nvbm5lY3Rpb25zKCk7Ci0JfQotCi0JcHJvdGVjdGVkIExpc3QgZ2V0TW9kZWxUYXJnZXRDb25uZWN0aW9ucygpIHsKLQkJcmV0dXJuIGdldE5vZGUoKS5nZXRJbmNvbWluZ0Nvbm5lY3Rpb25zKCk7Ci0JfQotCi0JcHVibGljIENvbm5lY3Rpb25BbmNob3IgZ2V0U291cmNlQ29ubmVjdGlvbkFuY2hvcigKLQkJCUNvbm5lY3Rpb25FZGl0UGFydCBjb25uZWN0aW9uKSB7Ci0JCXJldHVybiBuZXcgQ2hvcGJveEFuY2hvcihnZXRGaWd1cmUoKSk7Ci0JfQotCi0JcHVibGljIENvbm5lY3Rpb25BbmNob3IgZ2V0U291cmNlQ29ubmVjdGlvbkFuY2hvcihSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJcmV0dXJuIG5ldyBDaG9wYm94QW5jaG9yKGdldEZpZ3VyZSgpKTsKLQl9Ci0KLQlwdWJsaWMgQ29ubmVjdGlvbkFuY2hvciBnZXRUYXJnZXRDb25uZWN0aW9uQW5jaG9yKAotCQkJQ29ubmVjdGlvbkVkaXRQYXJ0IGNvbm5lY3Rpb24pIHsKLQkJcmV0dXJuIG5ldyBDaG9wYm94QW5jaG9yKGdldEZpZ3VyZSgpKTsKLQl9Ci0KLQlwdWJsaWMgQ29ubmVjdGlvbkFuY2hvciBnZXRUYXJnZXRDb25uZWN0aW9uQW5jaG9yKFJlcXVlc3QgcmVxdWVzdCkgewotCQlyZXR1cm4gbmV3IENob3Bib3hBbmNob3IoZ2V0RmlndXJlKCkpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGhhbmRsZVByb3BlcnR5Q2hhbmdlZChOb3RpZmljYXRpb24gbXNnKSB7Ci0JCXN3aXRjaCAobXNnLmdldEZlYXR1cmVJRChOb2RlLmNsYXNzKSkgewotCQljYXNlIE1vZGVsUGFja2FnZS5OT0RFX19MT0NBVElPTjoKLQkJY2FzZSBNb2RlbFBhY2thZ2UuTk9ERV9fV0lEVEg6Ci0JCWNhc2UgTW9kZWxQYWNrYWdlLk5PREVfX0hFSUdIVDoJCQkKLQkJCXJlZnJlc2hWaXN1YWxzKCk7Ci0JCQlicmVhazsKLQkJY2FzZSBNb2RlbFBhY2thZ2UuTk9ERV9fUkVBRF9PTkxZOgotCQkJcmVmcmVzaFZpc3VhbHMoKTsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGdldFRhcmdldENvbm5lY3Rpb25zKCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCUNvbm5lY3Rpb25FZGl0UGFydCBjb25uID0gKENvbm5lY3Rpb25FZGl0UGFydCkgaXRlci5uZXh0KCk7Ci0JCQkJY29ubi5yZWZyZXNoKCk7Ci0JCQl9Ci0JCQlicmVhazsKLQotCQljYXNlIE1vZGVsUGFja2FnZS5OT0RFX19PVVRHT0lOR19DT05ORUNUSU9OUzoKLQkJCXJlZnJlc2hTb3VyY2VDb25uZWN0aW9ucygpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBNb2RlbFBhY2thZ2UuTk9ERV9fSU5DT01JTkdfQ09OTkVDVElPTlM6Ci0JCQlyZWZyZXNoVGFyZ2V0Q29ubmVjdGlvbnMoKTsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFZpc3VhbHMoKSB7Ci0JCXN1cGVyLnJlZnJlc2hWaXN1YWxzKCk7Ci0JCVJlY3RhbmdsZSBjb25zdHJhaW50ID0gbmV3IFJlY3RhbmdsZSgwLCAwLCAtMSwgLTEpOwotCQlpZiAoZ2V0Tm9kZSgpLmdldExvY2F0aW9uKCkgIT0gbnVsbCkKLQkJCWNvbnN0cmFpbnQuc2V0TG9jYXRpb24oZ2V0Tm9kZSgpLmdldExvY2F0aW9uKCkpOwotCQljb25zdHJhaW50LndpZHRoID0gZ2V0Tm9kZSgpLmdldFdpZHRoKCk7Ci0JCSgoR3JhcGhpY2FsRWRpdFBhcnQpIGdldFBhcmVudCgpKS5zZXRMYXlvdXRDb25zdHJhaW50KHRoaXMsCi0JCQkJZ2V0RmlndXJlKCksIGNvbnN0cmFpbnQpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZWRpdC5CYXNlRWRpdFBhcnQjYWN0aXZhdGUoKQotCSAqLwotCXB1YmxpYyB2b2lkIGFjdGl2YXRlKCkgewotCQlzdXBlci5hY3RpdmF0ZSgpOwotCQkoKE5vZGUpIGdldE1vZGVsKCkpLmFkZENvbnN1bWVyKHRoaXMpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZWRpdC5CYXNlRWRpdFBhcnQjZGVhY3RpdmF0ZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGVhY3RpdmF0ZSgpIHsKLQkJKChOb2RlKSBnZXRNb2RlbCgpKS5yZW1vdmVDb25zdW1lcih0aGlzKTsKLQkJc3VwZXIuZGVhY3RpdmF0ZSgpOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvUmFpc2VkTWFyZ2luQm9yZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L1JhaXNlZE1hcmdpbkJvcmRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NDJkMGE1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvUmFpc2VkTWFyZ2luQm9yZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSAgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZWRpdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Db2xvckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuR3JhcGhpY3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLk1hcmdpbkJvcmRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuSW5zZXRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5SZWN0YW5nbGU7Ci0KLS8qKgotICogIEEgYm9yZGVyIHdpdGggYSByYWlzZWQgbWFyZ2luLgotICogIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBSYWlzZWRNYXJnaW5Cb3JkZXIgZXh0ZW5kcyBNYXJnaW5Cb3JkZXIgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSW5zZXRzIERFRkFVTFRfSU5TRVRTID0gbmV3IEluc2V0cygxMCwgMTAsIDEwLCAxMCk7Ci0KLQlwdWJsaWMgUmFpc2VkTWFyZ2luQm9yZGVyKCkgewotCQl0aGlzKERFRkFVTFRfSU5TRVRTKTsKLQl9Ci0KLQlwdWJsaWMgUmFpc2VkTWFyZ2luQm9yZGVyKEluc2V0cyBpbnNldHMpIHsKLQkJc3VwZXIoaW5zZXRzKTsKLQl9Ci0KLQlwdWJsaWMgUmFpc2VkTWFyZ2luQm9yZGVyKGludCB0LCBpbnQgbCwgaW50IGIsIGludCByKSB7Ci0JCXN1cGVyKHQsIGwsIGIsIHIpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZHJhdzJkLkJvcmRlciNnZXRJbnNldHMoSUZpZ3VyZSkKLQkgKi8KLQlwdWJsaWMgSW5zZXRzIGdldEluc2V0cyhJRmlndXJlIGZpZ3VyZSkgewotCQlyZXR1cm4gaW5zZXRzOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmRyYXcyZC5Cb3JkZXIjaXNPcGFxdWUoKQotCSAqLwkKLQlwdWJsaWMgYm9vbGVhbiBpc09wYXF1ZSgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5kcmF3MmQuQm9yZGVyI3BhaW50KElGaWd1cmUsIEdyYXBoaWNzLCBJbnNldHMpCi0JICovCi0JcHVibGljIHZvaWQgcGFpbnQoSUZpZ3VyZSBmaWd1cmUsIEdyYXBoaWNzIGcsIEluc2V0cyBpbnNldHMpIHsKLQkJZy5zZXRMaW5lU3R5bGUoR3JhcGhpY3MuTElORV9TT0xJRCk7Ci0JCWcuc2V0TGluZVdpZHRoKDEpOwotCQlnLnNldEZvcmVncm91bmRDb2xvcihDb2xvckNvbnN0YW50cy5idXR0b25MaWdodGVzdCk7Ci0JCVJlY3RhbmdsZSByID0gZ2V0UGFpbnRSZWN0YW5nbGUoZmlndXJlLCBpbnNldHMpOwotCQlyLnJlc2l6ZSgtMSwgLTEpOwotCQlnLmRyYXdMaW5lKHIueCwgci55LCByLnJpZ2h0KCksIHIueSk7Ci0JCWcuZHJhd0xpbmUoci54LCByLnksIHIueCwgci5ib3R0b20oKSk7Ci0JCWcuc2V0Rm9yZWdyb3VuZENvbG9yKENvbG9yQ29uc3RhbnRzLmJ1dHRvbkRhcmtlcik7Ci0JCWcuZHJhd0xpbmUoci54LCByLmJvdHRvbSgpLCByLnJpZ2h0KCksIHIuYm90dG9tKCkpOwotCQlnLmRyYXdMaW5lKHIucmlnaHQoKSwgci55LCByLnJpZ2h0KCksIHIuYm90dG9tKCkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9SZWxhdGl2ZVhZQW5jaG9yLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L1JlbGF0aXZlWFlBbmNob3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGRjYjc1Yy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L1JlbGF0aXZlWFlBbmNob3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuQWJzdHJhY3RDb25uZWN0aW9uQW5jaG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUmVjdGFuZ2xlOwotCi0vKioKLSAqIFByb3ZpZGVzIHJlbGF0aXZlIGFuY2hvciBmb3IgYSBmaWd1cmUncyBsb2NhdGlvbi4gCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBSZWxhdGl2ZVhZQW5jaG9yIGV4dGVuZHMgQWJzdHJhY3RDb25uZWN0aW9uQW5jaG9yIHsKLQotCXByaXZhdGUgUG9pbnQgcmVsYXRpdmVMb2NhdGlvbjsKLQotCXB1YmxpYyBSZWxhdGl2ZVhZQW5jaG9yKElGaWd1cmUgZmlndXJlLCBQb2ludCBsb2NhdGlvbiwgYm9vbGVhbiBpc1JlbGF0aXZlKSB7Ci0JCXN1cGVyKGZpZ3VyZSk7Ci0JCXJlbGF0aXZlTG9jYXRpb24gPSBsb2NhdGlvbi5nZXRDb3B5KCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5kcmF3MmQuQ29ubmVjdGlvbkFuY2hvciNnZXRMb2NhdGlvbihQb2ludCkKLQkgKi8KLQlwdWJsaWMgUG9pbnQgZ2V0TG9jYXRpb24oUG9pbnQgcmVmZXJlbmNlKSB7Ci0JCVBvaW50IHAgPSByZWxhdGl2ZUxvY2F0aW9uLmdldENvcHkoKTsKLQkJUmVjdGFuZ2xlIHIgPSBnZXRPd25lcigpLmdldEJvdW5kcygpLmdldENvcHkoKTsKLQkJcC5wZXJmb3JtVHJhbnNsYXRlKHIueCwgci55KTsKLQkJZ2V0T3duZXIoKS50cmFuc2xhdGVUb0Fic29sdXRlKHApOwotCQlyZXR1cm4gcDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmRyYXcyZC5BYnN0cmFjdENvbm5lY3Rpb25BbmNob3IjZ2V0UmVmZXJlbmNlUG9pbnQoKQotCSAqLwotCXB1YmxpYyBQb2ludCBnZXRSZWZlcmVuY2VQb2ludCgpIHsKLQkJcmV0dXJuIGdldExvY2F0aW9uKG51bGwpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9Sb2xlVGFza0NvbXBvc2l0ZUVkaXRQYXJ0LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L1JvbGVUYXNrQ29tcG9zaXRlRWRpdFBhcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjAwODEyOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L1JvbGVUYXNrQ29tcG9zaXRlRWRpdFBhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuRmxvd0xheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZWRpdC5wb2xpY2llcy5Sb2xlVGFza0Zsb3dMYXlvdXRFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLnV0aWwuVGVtcGxhdGVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Nb2RlbFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Sb2xlVGFza0NvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci0KLWltcG9ydCBjb20uaWJtLmljdS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotLyoqCi0gKiBSb2xlVGFza0NvbXBvc2l0ZUVkaXRQYXJ0IGlzIGNvbnRhaW5lciB3aXRoIHtAbGluayBGbG93TGF5b3V0fSwgYW5kIGRvZXMgbm90IHN1cHBvcnQgYWRkaW5nL3JlbW92aW5nIGNoaWxkIGVkaXRwYXJ0LiAKLSAqICAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBSb2xlVGFza0NvbXBvc2l0ZUVkaXRQYXJ0IGV4dGVuZHMgTm9kZUNvbnRhaW5lckVkaXRQYXJ0IHsKLQotLy8JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ29sb3IgQkdfQ09MT1IgPSBuZXcgQ29sb3IoRGlzcGxheS5nZXRDdXJyZW50KCksIDI1NSwKLS8vCQkJMjU1LCAxNTYpOwotCQotCXByaXZhdGUgc3RhdGljICBDb2xvciBCR19DT0xPUjsKLQlwdWJsaWMgUm9sZVRhc2tDb21wb3NpdGVFZGl0UGFydChSb2xlVGFza0NvbXBvc2l0ZSBtb2RlbCkgewotCQlzdXBlcihtb2RlbCk7Ci0JfQotCi0JcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlRmlndXJlKCkgewotCQlGaWd1cmUgZmlndXJlID0gbmV3IEZpZ3VyZSgpOwotCQlGbG93TGF5b3V0IGxheW91dCA9IG5ldyBGbG93TGF5b3V0KCk7Ci0JCWxheW91dC5zZXRNaW5vclNwYWNpbmcoMjApOwotCQlmaWd1cmUuc2V0TGF5b3V0TWFuYWdlcihsYXlvdXQpOwotCQlmaWd1cmUuc2V0Qm9yZGVyKG5ldyBSYWlzZWRNYXJnaW5Cb3JkZXIoKSk7Ci0JCWZpZ3VyZS5zZXRCYWNrZ3JvdW5kQ29sb3IoZ2V0QmFja2dyb3VuZENvbG9yKCkpOwotCQlmaWd1cmUuc2V0T3BhcXVlKHRydWUpOwotCQlyZXR1cm4gZmlndXJlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZWRpdC5Ob2RlQ29udGFpbmVyRWRpdFBhcnQjaGFuZGxlUHJvcGVydHlDaGFuZ2VkKE5vdGlmaWNhdGlvbikKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVQcm9wZXJ0eUNoYW5nZWQoTm90aWZpY2F0aW9uIG1zZykgewotCQlzd2l0Y2ggKG1zZy5nZXRGZWF0dXJlSUQoTm9kZUNvbnRhaW5lci5jbGFzcykpIHsKLQkJY2FzZSBNb2RlbFBhY2thZ2UuTk9ERV9DT05UQUlORVJfX05PREVTOgotCQkJcmVmcmVzaENoaWxkcmVuKCk7Ci0KLQkJCS8vIHJlZnJlc2ggZGlhZ3JhbSdzIGNoaWxkcmVuCi0JCQlFZGl0UGFydCBkaWFncmFtRWRpdFBhcnQgPSBnZXRQYXJlbnQoKTsKLS8vCQkJaWYgKGRpYWdyYW1FZGl0UGFydCBpbnN0YW5jZW9mIEFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRQYXJ0KSB7Ci0vLwkJCQlBY3Rpdml0eURldGFpbERpYWdyYW0gZGlhZ3JhbSA9IChBY3Rpdml0eURldGFpbERpYWdyYW0pIGRpYWdyYW1FZGl0UGFydAotLy8JCQkJCQkuZ2V0TW9kZWwoKTsKLS8vCi0vLwkJCQlpZiAoIUdyYXBoaWNhbERhdGFIZWxwZXIuaXNBdXRvTGF5b3V0KGRpYWdyYW0pKSB7Ci0vLwkJCQkJKChBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0UGFydCkgZGlhZ3JhbUVkaXRQYXJ0KQotLy8JCQkJCQkJLmdldFJlY2VudGx5QWRkZWRQYXJ0cygpLmFkZEFsbCgKLS8vCQkJCQkJCQkJZGlhZ3JhbUVkaXRQYXJ0LmdldENoaWxkcmVuKCkpOwotLy8JCQkJCURlZmF1bHRFZGl0RG9tYWluIGVkID0gKERlZmF1bHRFZGl0RG9tYWluKSBkaWFncmFtRWRpdFBhcnQKLS8vCQkJCQkJCS5nZXRWaWV3ZXIoKS5nZXRFZGl0RG9tYWluKCk7Ci0vLwkJCQkJSUVkaXRvclBhcnQgZWRpdG9yID0gZWQuZ2V0RWRpdG9yUGFydCgpOwotLy8JCQkJCWlmIChlZGl0b3IgIT0gbnVsbCAmJiBlZGl0b3IgaW5zdGFuY2VvZiBBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0b3IpIHsKLS8vCQkJCQkJKChBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0b3IpIGVkaXRvcikuY2xlYW5VcERpYWdyYW0oKTsKLS8vCQkJCQl9Ci0vLwkJCQl9IGVsc2UgewotLy8JCQkJCWRpYWdyYW1FZGl0UGFydC5yZWZyZXNoKCk7Ci0vLwkJCQl9Ci0vLwkJCX0KLQkJCWRpYWdyYW1FZGl0UGFydC5yZWZyZXNoKCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuaGFuZGxlUHJvcGVydHlDaGFuZ2VkKG1zZyk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0Lk5vZGVDb250YWluZXJFZGl0UGFydCNjcmVhdGVFZGl0UG9saWNpZXMoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUVkaXRQb2xpY2llcygpIHsKLQkJc3VwZXIuY3JlYXRlRWRpdFBvbGljaWVzKCk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuTEFZT1VUX1JPTEUsIG5ldyBSb2xlVGFza0Zsb3dMYXlvdXRFZGl0UG9saWN5KCkpOwotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LkNPTVBPTkVOVF9ST0xFLCBudWxsKTsKLQl9Ci0JcHJvdGVjdGVkIENvbG9yIGdldEJhY2tncm91bmRDb2xvcigpewotCQlpZihCR19DT0xPUiAhPSBudWxsKSByZXR1cm4gQkdfQ09MT1I7Ci0JCQotCQlpZihCR19DT0xPUiA9PSBudWxsKXsKLQkJCVN0cmluZyBjb2xvclN0cmluZyA9IEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKS5nZXRTdHJpbmcoCi0JCQkJCVRlbXBsYXRlQ29uc3RhbnRzLkFERF9ST0xFX1RBU0tTX0JPWF9CR19DT0xPUl9SR0IpOwotCQkJaWYoY29sb3JTdHJpbmcgIT0gbnVsbCAmJiBjb2xvclN0cmluZy5sZW5ndGgoKSA+IDApewotCQkJCVN0cmluZ1Rva2VuaXplciB0b2tlbml6ZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGNvbG9yU3RyaW5nLCAiLCIpOyAvLyROT04tTkxTLTEkCi0JCQkJaW50IHIgPSBJbnRlZ2VyLnBhcnNlSW50KHRva2VuaXplci5uZXh0VG9rZW4oKSk7Ci0JCQkJaW50IGcgPSBJbnRlZ2VyLnBhcnNlSW50KHRva2VuaXplci5uZXh0VG9rZW4oKSk7Ci0JCQkJaW50IGIgPSBJbnRlZ2VyLnBhcnNlSW50KHRva2VuaXplci5uZXh0VG9rZW4oKSk7Ci0JCQkJQkdfQ09MT1IgPSBuZXcgQ29sb3IobnVsbCwgcixnLGIpOwotCQkJCXJldHVybiBCR19DT0xPUjsKLQkJCX0KLQkJfQotCQlpZihCR19DT0xPUiA9PSBudWxsKXsKLQkJCUJHX0NPTE9SID0gbmV3IENvbG9yKERpc3BsYXkuZ2V0Q3VycmVudCgpLCAyNTUsCi0JCQkJCQkJMjU1LCAxNTYpOwotCQl9Ci0JCXJldHVybiBCR19DT0xPUjsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L1N0YXJ0Tm9kZUVkaXRQYXJ0LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L1N0YXJ0Tm9kZUVkaXRQYXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhYWJjYjMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9TdGFydE5vZGVFZGl0UGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZWRpdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Db2xvckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuRWxsaXBzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5UeXBlZE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5EaXJlY3RFZGl0UG9saWN5OwotCi0vKioKLSAqIFByb3ZpZGVzIHN1cHBvcnQgZm9yIGNyZWF0aW5nIGZpZ3VyZSBmb3Ige0BsaW5rIFR5cGVkTm9kZS5TVEFSVH0KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFN0YXJ0Tm9kZUVkaXRQYXJ0IGV4dGVuZHMgTm9kZUVkaXRQYXJ0IHsKLQotCXB1YmxpYyBTdGFydE5vZGVFZGl0UGFydChUeXBlZE5vZGUgbW9kZWwpIHsKLQkJc3VwZXIobW9kZWwpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZWRpdC5CYXNlRWRpdFBhcnQjY3JlYXRlRGlyZWN0RWRpdFBvbGljeSgpCi0JICovCi0JcHJvdGVjdGVkIERpcmVjdEVkaXRQb2xpY3kgY3JlYXRlRGlyZWN0RWRpdFBvbGljeSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0LkJhc2VFZGl0UGFydCNjcmVhdGVGaWd1cmUoKQotCSAqLwotCXByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZUZpZ3VyZSgpIHsKLQkJRWxsaXBzZSBmID0gbmV3IEVsbGlwc2UoKTsKLQkJZi5zZXRCYWNrZ3JvdW5kQ29sb3IoQ29sb3JDb25zdGFudHMuYmxhY2spOwotCQlmLnNldEZvcmVncm91bmRDb2xvcihDb2xvckNvbnN0YW50cy5yZWQpOwotCQlmLnNldFNpemUoMjAsIDIwKTsKLQkJcmV0dXJuIGY7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L1N5bmNoQmFyTm9kZUVkaXRQYXJ0LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L1N5bmNoQmFyTm9kZUVkaXRQYXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyZmMwMDMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9TeW5jaEJhck5vZGVFZGl0UGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuQ29ubmVjdGlvbkFuY2hvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi51dGlsLkNvbm5lY3Rpb25BbmNob3JMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuVHlwZWROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5Db25uZWN0aW9uRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5EaXJlY3RFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5yZXF1ZXN0cy5DcmVhdGVDb25uZWN0aW9uUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuTG9jYXRpb25SZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLQotLyoqCi0gKiBQcm92aWRlcyBzdXBwb3J0IGZvciBjcmVhdGluZyBmaWd1cmUgYW5kIGNyZWF0aW5nIHJlbGF0aXZlIGFuY2hvcnMKLSAqIGZvciB7QGxpbmsgVHlwZWROb2RlLlNZTkNfQkFSfQotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFN5bmNoQmFyTm9kZUVkaXRQYXJ0IGV4dGVuZHMgTm9kZUVkaXRQYXJ0IGltcGxlbWVudHMKLQkJQ29ubmVjdGlvbkFuY2hvckxvY2F0b3IgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ29sb3IgQkdfQ09MT1IgPSBuZXcgQ29sb3IobnVsbCwgNTEsIDEwMiwgMTAyKTsKLQotCXByaXZhdGUgUG9pbnQgcmVjZW50VGFyZ2V0RW5kUG9pbnQ7Ci0KLQlwcml2YXRlIFBvaW50IHJlY2VudFNvdXJjZUVuZFBvaW50OwotCi0JcHVibGljIFN5bmNoQmFyTm9kZUVkaXRQYXJ0KFR5cGVkTm9kZSBtb2RlbCkgewotCQlzdXBlcihtb2RlbCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0LkJhc2VFZGl0UGFydCNjcmVhdGVEaXJlY3RFZGl0UG9saWN5KCkKLQkgKi8KLQlwcm90ZWN0ZWQgRGlyZWN0RWRpdFBvbGljeSBjcmVhdGVEaXJlY3RFZGl0UG9saWN5KCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVGaWd1cmUoKSB7Ci0JCVJlY3RhbmdsZUZpZ3VyZSBmID0gbmV3IFJlY3RhbmdsZUZpZ3VyZSgpOwotCQlmLnNldEJhY2tncm91bmRDb2xvcihCR19DT0xPUik7Ci0JCWYuc2V0U2l6ZSgxMDAsIDUpOwotCQlyZXR1cm4gZjsKLQl9Ci0KLQlwdWJsaWMgQ29ubmVjdGlvbkFuY2hvciBnZXRTb3VyY2VDb25uZWN0aW9uQW5jaG9yKAotCQkJQ29ubmVjdGlvbkVkaXRQYXJ0IGNvbm5lY3Rpb24pIHsKLQkJYm9vbGVhbiBpc1JlbGF0aXZlID0gZmFsc2U7Ci0JCVBvaW50IHNvdXJjZUVuZFBvaW50ID0gbnVsbDsKLQkJaWYgKHJlY2VudFNvdXJjZUVuZFBvaW50ID09IG51bGwpIHsKLQkJCS8vIGdldCBzb3VyY2UgZW5kIHBvaW50IGZyb20gdGhlIG1vZGVsCi0JCQlMaW5rIGxpbmsgPSAoTGluaykgY29ubmVjdGlvbi5nZXRNb2RlbCgpOwotCQkJc291cmNlRW5kUG9pbnQgPSBsaW5rLmdldFNvdXJjZUVuZFBvaW50KCk7Ci0JCQlpc1JlbGF0aXZlID0gdHJ1ZTsKLQkJfSBlbHNlIHsKLQkJCXNvdXJjZUVuZFBvaW50ID0gcmVjZW50U291cmNlRW5kUG9pbnQ7Ci0JCX0KLQkJaWYgKHNvdXJjZUVuZFBvaW50ICE9IG51bGwpIHsKLQkJCXJldHVybiBuZXcgUmVsYXRpdmVYWUFuY2hvcihnZXRGaWd1cmUoKSwgc291cmNlRW5kUG9pbnQsIGlzUmVsYXRpdmUpOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRTb3VyY2VDb25uZWN0aW9uQW5jaG9yKGNvbm5lY3Rpb24pOwotCX0KLQotCXB1YmxpYyBDb25uZWN0aW9uQW5jaG9yIGdldFNvdXJjZUNvbm5lY3Rpb25BbmNob3IoUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCVBvaW50IHAgPSBudWxsOwotCQlpZiAocmVxdWVzdCBpbnN0YW5jZW9mIENyZWF0ZUNvbm5lY3Rpb25SZXF1ZXN0KSB7Ci0JCQlDcmVhdGVDb25uZWN0aW9uUmVxdWVzdCByZXEgPSAoQ3JlYXRlQ29ubmVjdGlvblJlcXVlc3QpIHJlcXVlc3Q7Ci0JCQlwID0gcmVxLmdldExvY2F0aW9uKCk7Ci0JCX0gZWxzZSBpZiAocmVxdWVzdCBpbnN0YW5jZW9mIExvY2F0aW9uUmVxdWVzdCkgewotCQkJcCA9ICgoTG9jYXRpb25SZXF1ZXN0KSByZXF1ZXN0KS5nZXRMb2NhdGlvbigpOwotCQl9Ci0JCWlmIChwICE9IG51bGwpIHsKLQkJCXJlY2VudFNvdXJjZUVuZFBvaW50ID0gZ2V0TG9jYXRpb24ocCk7Ci0JCQlyZXR1cm4gbmV3IFJlbGF0aXZlWFlBbmNob3IoZ2V0RmlndXJlKCksIHJlY2VudFNvdXJjZUVuZFBvaW50LCB0cnVlKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0U291cmNlQ29ubmVjdGlvbkFuY2hvcihyZXF1ZXN0KTsKLQl9Ci0KLQlwdWJsaWMgQ29ubmVjdGlvbkFuY2hvciBnZXRUYXJnZXRDb25uZWN0aW9uQW5jaG9yKAotCQkJQ29ubmVjdGlvbkVkaXRQYXJ0IGNvbm5lY3Rpb24pIHsKLQkJYm9vbGVhbiBpc1JlbGF0aXZlID0gZmFsc2U7Ci0JCVBvaW50IHRhcmdldEVuZFBvaW50ID0gbnVsbDsKLQkJaWYgKHJlY2VudFRhcmdldEVuZFBvaW50ID09IG51bGwpIHsKLQkJCUxpbmsgbGluayA9IChMaW5rKSBjb25uZWN0aW9uLmdldE1vZGVsKCk7Ci0JCQl0YXJnZXRFbmRQb2ludCA9IGxpbmsuZ2V0VGFyZ2V0RW5kUG9pbnQoKTsKLQkJCWlzUmVsYXRpdmUgPSB0cnVlOwotCQl9IGVsc2UgewotCQkJdGFyZ2V0RW5kUG9pbnQgPSByZWNlbnRUYXJnZXRFbmRQb2ludDsKLQkJfQotCQlpZiAodGFyZ2V0RW5kUG9pbnQgIT0gbnVsbCkgewotCQkJcmV0dXJuIG5ldyBSZWxhdGl2ZVhZQW5jaG9yKGdldEZpZ3VyZSgpLCB0YXJnZXRFbmRQb2ludCwgaXNSZWxhdGl2ZSk7Ci0JCX0KLQotCQlyZXR1cm4gc3VwZXIuZ2V0VGFyZ2V0Q29ubmVjdGlvbkFuY2hvcihjb25uZWN0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgQ29ubmVjdGlvbkFuY2hvciBnZXRUYXJnZXRDb25uZWN0aW9uQW5jaG9yKFJlcXVlc3QgcmVxdWVzdCkgewotCQlQb2ludCBwID0gbnVsbDsKLQkJaWYgKHJlcXVlc3QgaW5zdGFuY2VvZiBDcmVhdGVDb25uZWN0aW9uUmVxdWVzdCkgewotCQkJQ3JlYXRlQ29ubmVjdGlvblJlcXVlc3QgcmVxID0gKENyZWF0ZUNvbm5lY3Rpb25SZXF1ZXN0KSByZXF1ZXN0OwotCQkJcCA9IHJlcS5nZXRMb2NhdGlvbigpOwotCQl9IGVsc2UgaWYgKHJlcXVlc3QgaW5zdGFuY2VvZiBMb2NhdGlvblJlcXVlc3QpIHsKLQkJCXAgPSAoKExvY2F0aW9uUmVxdWVzdCkgcmVxdWVzdCkuZ2V0TG9jYXRpb24oKTsKLQkJfQotCQlpZiAocCAhPSBudWxsKSB7Ci0JCQlyZWNlbnRUYXJnZXRFbmRQb2ludCA9IGdldExvY2F0aW9uKHApOwotCQkJcmV0dXJuIG5ldyBSZWxhdGl2ZVhZQW5jaG9yKGdldEZpZ3VyZSgpLCByZWNlbnRUYXJnZXRFbmRQb2ludCwgdHJ1ZSk7Ci0JCX0KLQotCQlyZXR1cm4gc3VwZXIuZ2V0VGFyZ2V0Q29ubmVjdGlvbkFuY2hvcihyZXF1ZXN0KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLnV0aWwuQ29ubmVjdGlvbkFuY2hvckxvY2F0b3IjZ2V0TG9jYXRpb24oUG9pbnQpCi0JICovCi0JcHVibGljIFBvaW50IGdldExvY2F0aW9uKFBvaW50IHJlZmVyZW5jZSkgewotCQlyZXR1cm4gQ2xvc2VzdEFuY2hvci5nZXRMb2NhdGlvbihnZXRGaWd1cmUoKSwgcmVmZXJlbmNlKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvVGV4dEZpZ3VyZUNlbGxFZGl0b3JMb2NhdG9yLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L1RleHRGaWd1cmVDZWxsRWRpdG9yTG9jYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NjVlN2RiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvVGV4dEZpZ3VyZUNlbGxFZGl0b3JMb2NhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5maWd1cmVzLlRleHRGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnRvb2xzLkNlbGxFZGl0b3JMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2VsbEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5HQzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLQotLyoqCi0gKiBDb25zdHJhaW50IGZvciBUZXh0RmxvdyBwbGFjaW5nLgotICogQGF1dGhvciBKYW1lcyBUaGFyaW8KLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFRleHRGaWd1cmVDZWxsRWRpdG9yTG9jYXRvciBpbXBsZW1lbnRzIENlbGxFZGl0b3JMb2NhdG9yIHsKLQotCXByaXZhdGUgVGV4dEZpZ3VyZSBmaWd1cmU7Ci0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgTGFiZWxUZXh0Q2VsbEVkaXRvckxvY2F0b3IgZm9yIHRoZSBnaXZlbiB0ZXh0IGZpZ3VyZQotCSAqIEBwYXJhbSB0ZgotCSAqLwotCXB1YmxpYyBUZXh0RmlndXJlQ2VsbEVkaXRvckxvY2F0b3IoVGV4dEZpZ3VyZSB0ZikgewotCQlzZXRGaWd1cmUodGYpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgQ2VsbEVkaXRvckxvY2F0b3IjcmVsb2NhdGUob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DZWxsRWRpdG9yKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlbG9jYXRlKENlbGxFZGl0b3IgY2VsbGVkaXRvcikgewotCQlUZXh0RmlndXJlQ2VsbEVkaXRvckxvY2F0b3IuZG9Mb2NhdGUoY2VsbGVkaXRvciwgZmlndXJlKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgZG9Mb2NhdGUoQ2VsbEVkaXRvciBjZSwgVGV4dEZpZ3VyZSBmaWcpIHsKLQkJVGV4dCB0ZXh0ID0gKFRleHQpIGNlLmdldENvbnRyb2woKTsKLQkJU3RyaW5nIG4gPSAoU3RyaW5nKSBjZS5nZXRWYWx1ZSgpOwotCQlHQyBnYyA9IG5ldyBHQyh0ZXh0KTsKLQkJUG9pbnQgc2l6ZSA9IGdjLnRleHRFeHRlbnQobik7Ci0JCWdjLmRpc3Bvc2UoKTsKLQkJaWYgKHNpemUueCAhPSAwKQotCQkJc2l6ZSA9IHRleHQuY29tcHV0ZVNpemUoc2l6ZS54LCBTV1QuREVGQVVMVCk7Ci0JCXRleHQuc2V0U2l6ZShzaXplLngsIHNpemUueSk7Ci0JCVJlY3RhbmdsZSB0ZXh0Qm91bmRzID0gbmV3IFJlY3RhbmdsZSh0ZXh0LmdldENsaWVudEFyZWEoKS54LCB0ZXh0Ci0JCQkJLmdldENsaWVudEFyZWEoKS55LCB0ZXh0LmdldENsaWVudEFyZWEoKS53aWR0aCwgdGV4dAotCQkJCS5nZXRDbGllbnRBcmVhKCkuaGVpZ2h0KTsKLQkJUmVjdGFuZ2xlIGZpZ0JvdW5kcyA9IGZpZy5nZXRDbGllbnRBcmVhKCk7Ci0JCWZpZy50cmFuc2xhdGVUb0Fic29sdXRlKGZpZ0JvdW5kcyk7Ci0JCWludCBkZWx0YSA9IChmaWdCb3VuZHMud2lkdGggLSB0ZXh0Qm91bmRzLndpZHRoKSAvIDI7Ci0JCWludCB5ID0gZmlnLmdldFRleHRGbG93UGFnZSgpLmdldExvY2F0aW9uKCkueTsKLQkJdGV4dC5zZXRMb2NhdGlvbihmaWdCb3VuZHMueCArIGRlbHRhLCB5KTsKLQl9Ci0KLQlwdWJsaWMgVGV4dEZpZ3VyZSBnZXRGaWd1cmUoKSB7Ci0JCXJldHVybiBmaWd1cmU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RmlndXJlKFRleHRGaWd1cmUgZmlndXJlKSB7Ci0JCXRoaXMuZmlndXJlID0gZmlndXJlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9UZXh0RmlndXJlRGlyZWN0RWRpdE1hbmFnZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvVGV4dEZpZ3VyZURpcmVjdEVkaXRNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3NmIyN2MuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9UZXh0RmlndXJlRGlyZWN0RWRpdE1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5maWd1cmVzLlRleHRGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYudXRpbC5EaWFncmFtVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYudXRpbC5UZW1wbGF0ZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udWkudXRpbC5Nc2dEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTmFtZWROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLldvcmtCcmVha2Rvd25FbGVtZW50Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuUHJvY2Vzc1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi50b29scy5DZWxsRWRpdG9yTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYudG9vbHMuRGlyZWN0RWRpdE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UZXh0Q2VsbEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuVmVyaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5WZXJpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuR0M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLQotLyoqCi0gKiBNYW5hZ2VzIGRpcmVjdCBlZGl0aW5nIGFuZCBjcmVhdGluZyBjZWxsZWRpdG9yIGZvciB7QGxpbmsgVGV4dEZpZ3VyZX0KLSAqIAotICogQGF1dGhvciBKYW1lcyBUaGFyaW8KLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFRleHRGaWd1cmVEaXJlY3RFZGl0TWFuYWdlciBleHRlbmRzIERpcmVjdEVkaXRNYW5hZ2VyIHsKLQotCUZvbnQgc2NhbGVkRm9udDsKLQotCXByb3RlY3RlZCBWZXJpZnlMaXN0ZW5lciB2ZXJpZnlMaXN0ZW5lcjsKLQotCXByb3RlY3RlZCBUZXh0RmlndXJlIGZpZ3VyZSA9IG51bGw7Ci0KLQlwdWJsaWMgVGV4dEZpZ3VyZURpcmVjdEVkaXRNYW5hZ2VyKEdyYXBoaWNhbEVkaXRQYXJ0IHNvdXJjZSwKLQkJCUNsYXNzIGVkaXRvclR5cGUsIENlbGxFZGl0b3JMb2NhdG9yIGxvY2F0b3IsIFRleHRGaWd1cmUgZmlndXJlKSB7Ci0JCXN1cGVyKHNvdXJjZSwgZWRpdG9yVHlwZSwgbG9jYXRvcik7Ci0JCXRoaXMuZmlndXJlID0gZmlndXJlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZ2VmLnRvb2xzLkRpcmVjdEVkaXRNYW5hZ2VyI2JyaW5nRG93bigpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYnJpbmdEb3duKCkgewotCQlicmluZ0Rvd24odHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5nZWYudG9vbHMuRGlyZWN0RWRpdE1hbmFnZXIjYnJpbmdEb3duKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBicmluZ0Rvd24oYm9vbGVhbiBjaGVjaykgewotCQkvLyBUaGlzIG1ldGhvZCBtaWdodCBiZSByZS1lbnRlcmVkIHdoZW4gc3VwZXIuYnJpbmdEb3duKCkgaXMgY2FsbGVkLgotCQlGb250IGRpc3Bvc2VGb250ID0gc2NhbGVkRm9udDsKLQkJc2NhbGVkRm9udCA9IG51bGw7Ci0JCXN1cGVyLmJyaW5nRG93bigpOwotCQlpZiAoZGlzcG9zZUZvbnQgIT0gbnVsbCkKLQkJCWRpc3Bvc2VGb250LmRpc3Bvc2UoKTsKLQkJaWYgKGNoZWNrKSB7Ci0JCQlOYW1lZE5vZGUgbm9kZSA9IChOYW1lZE5vZGUpIGdldEVkaXRQYXJ0KCkuZ2V0TW9kZWwoKTsKLQkJCVN0cmluZyBuYW1lID0gbm9kZS5nZXROYW1lKCk7Ci0JCQlpZiAobm9kZSBpbnN0YW5jZW9mIFdvcmtCcmVha2Rvd25FbGVtZW50Tm9kZSkgewotCQkJCU9iamVjdCB3YmVsZW1lbnQgPSBub2RlLmdldE9iamVjdCgpOwotCQkJCWlmICh3YmVsZW1lbnQgaW5zdGFuY2VvZiBBY3Rpdml0eQotCQkJCQkJJiYgUHJvY2Vzc1V0aWwKLQkJCQkJCQkJLmlzRXh0ZW5kaW5nT3JMb2NhbGx5Q29udHJpYnV0aW5nKChCcmVha2Rvd25FbGVtZW50KSB3YmVsZW1lbnQpKSB7Ci0JCQkJCW5hbWUgPSBQcm9jZXNzVXRpbAotCQkJCQkJCS5nZXRQcmVzZW50YXRpb25OYW1lKChCcmVha2Rvd25FbGVtZW50KSB3YmVsZW1lbnQpOwotCQkJCX0KLQotCQkJfQotCQkJaWYgKG5hbWUgPT0gbnVsbCB8fCBuYW1lLnRyaW0oKS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJRGlzcGxheQotCQkJCQkJLmdldEN1cnJlbnQoKQotCQkJCQkJLmFzeW5jRXhlYygKLQkJCQkJCQkJbmV3IFByb21wdEVkaXQoCi0JCQkJCQkJCQkJKE5hbWVkTm9kZUVkaXRQYXJ0KSBnZXRFZGl0UGFydCgpLAotCQkJCQkJCQkJCURpYWdyYW1VSVJlc291cmNlcy5lcnJfbmFtZV9lbXB0eSkpOyAKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZ2VmLnRvb2xzLkRpcmVjdEVkaXRNYW5hZ2VyI2luaXRDZWxsRWRpdG9yKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0Q2VsbEVkaXRvcigpIHsKLQkJVGV4dENlbGxFZGl0b3IgZWRpdG9yID0gKFRleHRDZWxsRWRpdG9yKSBnZXRDZWxsRWRpdG9yKCk7Ci0JCWVkaXRvci5zZXRTdHlsZShTV1QuTVVMVEkpOwotCQlUZXh0IHQgPSAoVGV4dCkgZWRpdG9yLmdldENvbnRyb2woKTsKLQkJdmVyaWZ5TGlzdGVuZXIgPSBuZXcgVmVyaWZ5TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB2ZXJpZnlUZXh0KFZlcmlmeUV2ZW50IGV2ZW50KSB7Ci0JCQkJVGV4dCB0ZXh0ID0gKFRleHQpIGdldENlbGxFZGl0b3IoKS5nZXRDb250cm9sKCk7Ci0JCQkJU3RyaW5nIG9sZFRleHQgPSB0ZXh0LmdldFRleHQoKTsKLQkJCQlTdHJpbmcgbGVmdFRleHQgPSBvbGRUZXh0LnN1YnN0cmluZygwLCBldmVudC5zdGFydCk7Ci0JCQkJU3RyaW5nIHJpZ2h0VGV4dCA9IG9sZFRleHQuc3Vic3RyaW5nKGV2ZW50LmVuZCwgb2xkVGV4dAotCQkJCQkJLmxlbmd0aCgpKTsKLQkJCQlHQyBnYyA9IG5ldyBHQyh0ZXh0KTsKLQkJCQlQb2ludCBzaXplID0gZ2MudGV4dEV4dGVudChsZWZ0VGV4dCArIGV2ZW50LnRleHQgKyByaWdodFRleHQpOwotCQkJCWdjLmRpc3Bvc2UoKTsKLQkJCQlpZiAoc2l6ZS54ICE9IDApCi0JCQkJCXNpemUgPSB0ZXh0LmNvbXB1dGVTaXplKHNpemUueCwgU1dULkRFRkFVTFQpOwotCQkJCWdldENlbGxFZGl0b3IoKS5nZXRDb250cm9sKCkuc2V0U2l6ZShzaXplLngsIHNpemUueSk7Ci0JCQl9Ci0JCX07Ci0JCXQuYWRkVmVyaWZ5TGlzdGVuZXIodmVyaWZ5TGlzdGVuZXIpOwotCQlTdHJpbmcgaW5pdGlhbExhYmVsVGV4dCA9ICgoTmFtZWROb2RlRWRpdFBhcnQpIHRoaXMuZ2V0RWRpdFBhcnQoKSkKLQkJCQkuZ2V0RGlyZWN0RWRpdFRleHQoKTsKLQkJZWRpdG9yLnNldFZhbHVlKGluaXRpYWxMYWJlbFRleHQpOwotCQl0LnNldEZvbnQoVGVtcGxhdGVDb25zdGFudHMuREVGQVVMVF9GT05UKTsKLQkJdC5zZWxlY3RBbGwoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmdlZi50b29scy5EaXJlY3RFZGl0TWFuYWdlciN1bmhvb2tMaXN0ZW5lcnMoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHVuaG9va0xpc3RlbmVycygpIHsKLQkJc3VwZXIudW5ob29rTGlzdGVuZXJzKCk7Ci0JCWlmIChnZXRDZWxsRWRpdG9yKCkgIT0gbnVsbCkgewotCQkJVGV4dCB0ZXh0ID0gKFRleHQpIGdldENlbGxFZGl0b3IoKS5nZXRDb250cm9sKCk7Ci0JCQlpZiAodmVyaWZ5TGlzdGVuZXIgIT0gbnVsbCkKLQkJCQl0ZXh0LnJlbW92ZVZlcmlmeUxpc3RlbmVyKHZlcmlmeUxpc3RlbmVyKTsKLQkJCXZlcmlmeUxpc3RlbmVyID0gbnVsbDsKLQkJfQotCX0KLQotCS8qKgotCSAqIENoZWNrcyBpZiB0aGUgZ2l2ZW4gdGV4dCBpcyB2YWxpZC4gU3ViY2xhc3NlcyBjYW4gb3ZlcnJpZGUgdGhpcyBtZXRob2QuCi0JICogCi0JICogQHBhcmFtIHR4dAotCSAqIEByZXR1cm4gbnVsbCBpZiB0aGUgZ2l2ZW4gdGV4dCBpcyB2YWxpZCwgYW4gZXJyb3IgbWVzc2FnZSBvdGhlcndpc2UKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHZhbGlkYXRlKFN0cmluZyB0eHQpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5nZWYudG9vbHMuRGlyZWN0RWRpdE1hbmFnZXIjY29tbWl0KCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb21taXQoKSB7Ci0JCVN0cmluZyBtc2cgPSB2YWxpZGF0ZSgoU3RyaW5nKSBnZXRDZWxsRWRpdG9yKCkuZ2V0VmFsdWUoKSk7Ci0JCWlmIChtc2cgIT0gbnVsbCkgewotCQkJYnJpbmdEb3duKGZhbHNlKTsKLQkJCURpc3BsYXkuZ2V0Q3VycmVudCgpLmFzeW5jRXhlYygKLQkJCQkJbmV3IFByb21wdEVkaXQoKE5hbWVkTm9kZUVkaXRQYXJ0KSBnZXRFZGl0UGFydCgpLCBtc2cpKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5jb21taXQoKTsKLQl9Ci0KLQlzdGF0aWMgY2xhc3MgUHJvbXB0RWRpdCBpbXBsZW1lbnRzIFJ1bm5hYmxlIHsKLQotCQlwcml2YXRlIE5hbWVkTm9kZUVkaXRQYXJ0IHBhcnQ7Ci0KLQkJcHJpdmF0ZSBTdHJpbmcgbXNnOwotCi0JCVByb21wdEVkaXQoTmFtZWROb2RlRWRpdFBhcnQgcGFydCwgU3RyaW5nIG1zZykgewotCQkJdGhpcy5wYXJ0ID0gcGFydDsKLQkJCXRoaXMubXNnID0gbXNnOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBzZWUgamF2YS5sYW5nLlJ1bm5hYmxlI3J1bigpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQlTdHJpbmcgdGl0bGUgPSBEaWFncmFtVUlSZXNvdXJjZXMuZGlhZ3JhbV9lcnJvckRpYWxvZ190aXRsZV90ZXh0MDsgCi0JCQlNc2dEaWFsb2cgZGlhbG9nID0gQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpOwotCQkJZGlhbG9nLmRpc3BsYXlFcnJvcih0aXRsZSwgbXNnKTsgCi0JCQlwYXJ0LnBlcmZvcm1EaXJlY3RFZGl0KCk7Ci0JCX0KLQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9Ub3BBbmNob3IuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvVG9wQW5jaG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmODI4MmUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9Ub3BBbmNob3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuQWJzdHJhY3RDb25uZWN0aW9uQW5jaG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUmVjdGFuZ2xlOwotCi0vKioKLSAqIENvbm5lY3Rpb24gYW5jaG9yIGZvciB0b3Agb2YgdGhlIGZpZ3VyZS4gCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLWNsYXNzIFRvcEFuY2hvciBleHRlbmRzIEFic3RyYWN0Q29ubmVjdGlvbkFuY2hvciB7Ci0KLQlwcml2YXRlIGludCBvZmZzZXQ7Ci0KLQlUb3BBbmNob3IoSUZpZ3VyZSBzb3VyY2UsIGludCBvZmZzZXQpIHsKLQkJc3VwZXIoc291cmNlKTsKLQkJdGhpcy5vZmZzZXQgPSBvZmZzZXQ7Ci0JfQotCi0JcHVibGljIFBvaW50IGdldExvY2F0aW9uKFBvaW50IHJlZmVyZW5jZSkgewotCQlSZWN0YW5nbGUgciA9IGdldE93bmVyKCkuZ2V0Qm91bmRzKCkuZ2V0Q29weSgpOwotCQlnZXRPd25lcigpLnRyYW5zbGF0ZVRvQWJzb2x1dGUocik7Ci0JCWludCBvZmYgPSBvZmZzZXQ7Ci0JCWlmIChvZmYgPT0gLTEpCi0JCQlvZmYgPSByLndpZHRoIC8gMjsKLQkJaWYgKHIuY29udGFpbnMocmVmZXJlbmNlKSB8fCByLnkgPCByZWZlcmVuY2UueSkKLQkJCXJldHVybiByLmdldEJvdHRvbUxlZnQoKS50cmFuc2xhdGUob2ZmLCAtMSk7Ci0JCWVsc2UKLQkJCXJldHVybiByLmdldFRvcExlZnQoKS50cmFuc2xhdGUob2ZmLCAwKTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L1ZhbGlkYXRpbmdEaXJlY3RFZGl0TWFuYWdlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9WYWxpZGF0aW5nRGlyZWN0RWRpdE1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzcyZDAwZi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L1ZhbGlkYXRpbmdEaXJlY3RFZGl0TWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LkRpbWVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi51dGlsLkRpYWdyYW1VSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udWkudXRpbC5Nc2dEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTmFtZWROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLldvcmtCcmVha2Rvd25FbGVtZW50Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuUHJvY2Vzc1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi50b29scy5DZWxsRWRpdG9yTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYudG9vbHMuRGlyZWN0RWRpdE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlZlcmlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuVmVyaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5HQzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotCi0KLS8qKgotICogTWFuYWdlcyBkaXJlY3QgZWRpdGluZyBhbmQgY3JlYXRpbmcgY2VsbCBlZGl0b3IgZm9yIHRoZSB7QGxpbmsgTGFiZWx9Ci0gKiBhbmQgdmFsaWRhdGVzIHRoZSBpbnB1dC4gCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgVmFsaWRhdGluZ0RpcmVjdEVkaXRNYW5hZ2VyIGV4dGVuZHMgRGlyZWN0RWRpdE1hbmFnZXIgewotCi0JRm9udCBzY2FsZWRGb250OwotCi0JcHJvdGVjdGVkIFZlcmlmeUxpc3RlbmVyIHZlcmlmeUxpc3RlbmVyOwotCi0JcHJvdGVjdGVkIExhYmVsIGFjdGl2aXR5TGFiZWw7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IEFjdGl2aXR5RGlyZWN0RWRpdE1hbmFnZXIgd2l0aCB0aGUgZ2l2ZW4gYXR0cmlidXRlcy4KLQkgKiAKLQkgKiBAcGFyYW0gc291cmNlCi0JICogICAgICAgICAgICB0aGUgc291cmNlIEVkaXRQYXJ0Ci0JICogQHBhcmFtIGVkaXRvclR5cGUKLQkgKiAgICAgICAgICAgIHR5cGUgb2YgZWRpdG9yCi0JICogQHBhcmFtIGxvY2F0b3IKLQkgKiAgICAgICAgICAgIHRoZSBDZWxsRWRpdG9yTG9jYXRvcgotCSAqLwotCXB1YmxpYyBWYWxpZGF0aW5nRGlyZWN0RWRpdE1hbmFnZXIoR3JhcGhpY2FsRWRpdFBhcnQgc291cmNlLAotCQkJQ2xhc3MgZWRpdG9yVHlwZSwgQ2VsbEVkaXRvckxvY2F0b3IgbG9jYXRvciwgTGFiZWwgbGFiZWwpIHsKLQkJc3VwZXIoc291cmNlLCBlZGl0b3JUeXBlLCBsb2NhdG9yKTsKLQkJYWN0aXZpdHlMYWJlbCA9IGxhYmVsOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZ2VmLnRvb2xzLkRpcmVjdEVkaXRNYW5hZ2VyI2JyaW5nRG93bigpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYnJpbmdEb3duKCkgewotCQlicmluZ0Rvd24odHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5nZWYudG9vbHMuRGlyZWN0RWRpdE1hbmFnZXIjYnJpbmdEb3duKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBicmluZ0Rvd24oYm9vbGVhbiBjaGVjaykgewotCQkvLyBUaGlzIG1ldGhvZCBtaWdodCBiZSByZS1lbnRlcmVkIHdoZW4gc3VwZXIuYnJpbmdEb3duKCkgaXMgY2FsbGVkLgotCQlGb250IGRpc3Bvc2VGb250ID0gc2NhbGVkRm9udDsKLQkJc2NhbGVkRm9udCA9IG51bGw7Ci0JCXN1cGVyLmJyaW5nRG93bigpOwotCQlpZiAoZGlzcG9zZUZvbnQgIT0gbnVsbCkKLQkJCWRpc3Bvc2VGb250LmRpc3Bvc2UoKTsKLQkJaWYgKGNoZWNrKSB7Ci0JCQlOYW1lZE5vZGUgbm9kZSA9IChOYW1lZE5vZGUpIGdldEVkaXRQYXJ0KCkuZ2V0TW9kZWwoKTsKLQkJCVN0cmluZyBuYW1lID0gbm9kZS5nZXROYW1lKCk7Ci0JCQlpZiAobm9kZSBpbnN0YW5jZW9mIFdvcmtCcmVha2Rvd25FbGVtZW50Tm9kZSkgewotCQkJCU9iamVjdCB3YmVsZW1lbnQgPSBub2RlLmdldE9iamVjdCgpOwotCQkJCWlmICh3YmVsZW1lbnQgaW5zdGFuY2VvZiBBY3Rpdml0eQotCQkJCQkJJiYgUHJvY2Vzc1V0aWwKLQkJCQkJCQkJLmlzRXh0ZW5kaW5nT3JMb2NhbGx5Q29udHJpYnV0aW5nKChCcmVha2Rvd25FbGVtZW50KSB3YmVsZW1lbnQpKSB7Ci0JCQkJCW5hbWUgPSBQcm9jZXNzVXRpbAotCQkJCQkJCS5nZXRQcmVzZW50YXRpb25OYW1lKChCcmVha2Rvd25FbGVtZW50KSB3YmVsZW1lbnQpOwotCQkJCX0KLQotCQkJfQotCQkJaWYgKG5hbWUgPT0gbnVsbCB8fCBuYW1lLnRyaW0oKS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJRGlzcGxheQotCQkJCQkJLmdldEN1cnJlbnQoKQotCQkJCQkJLmFzeW5jRXhlYygKLQkJCQkJCQkJbmV3IFByb21wdEVkaXQoCi0JCQkJCQkJCQkJKE5hbWVkTm9kZUVkaXRQYXJ0KSBnZXRFZGl0UGFydCgpLAotCQkJCQkJCQkJCURpYWdyYW1VSVJlc291cmNlcy5lcnJfbmFtZV9lbXB0eSkpOyAKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZ2VmLnRvb2xzLkRpcmVjdEVkaXRNYW5hZ2VyI2luaXRDZWxsRWRpdG9yKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0Q2VsbEVkaXRvcigpIHsKLQkJVGV4dCB0ZXh0ID0gKFRleHQpIGdldENlbGxFZGl0b3IoKS5nZXRDb250cm9sKCk7Ci0JCXZlcmlmeUxpc3RlbmVyID0gbmV3IFZlcmlmeUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgdmVyaWZ5VGV4dChWZXJpZnlFdmVudCBldmVudCkgewotCQkJCVRleHQgdGV4dCA9IChUZXh0KSBnZXRDZWxsRWRpdG9yKCkuZ2V0Q29udHJvbCgpOwotCQkJCVN0cmluZyBvbGRUZXh0ID0gdGV4dC5nZXRUZXh0KCk7Ci0JCQkJU3RyaW5nIGxlZnRUZXh0ID0gb2xkVGV4dC5zdWJzdHJpbmcoMCwgZXZlbnQuc3RhcnQpOwotCQkJCVN0cmluZyByaWdodFRleHQgPSBvbGRUZXh0LnN1YnN0cmluZyhldmVudC5lbmQsIG9sZFRleHQKLQkJCQkJCS5sZW5ndGgoKSk7Ci0JCQkJR0MgZ2MgPSBuZXcgR0ModGV4dCk7Ci0JCQkJUG9pbnQgc2l6ZSA9IGdjLnRleHRFeHRlbnQobGVmdFRleHQgKyBldmVudC50ZXh0ICsgcmlnaHRUZXh0KTsKLQkJCQlnYy5kaXNwb3NlKCk7Ci0JCQkJaWYgKHNpemUueCAhPSAwKQotCQkJCQlzaXplID0gdGV4dC5jb21wdXRlU2l6ZShzaXplLngsIFNXVC5ERUZBVUxUKTsKLQkJCQlnZXRDZWxsRWRpdG9yKCkuZ2V0Q29udHJvbCgpLnNldFNpemUoc2l6ZS54LCBzaXplLnkpOwotCQkJfQotCQl9OwotCQl0ZXh0LmFkZFZlcmlmeUxpc3RlbmVyKHZlcmlmeUxpc3RlbmVyKTsKLQotCQlTdHJpbmcgaW5pdGlhbExhYmVsVGV4dCA9IGFjdGl2aXR5TGFiZWwuZ2V0VGV4dCgpOwotCQlnZXRDZWxsRWRpdG9yKCkuc2V0VmFsdWUoaW5pdGlhbExhYmVsVGV4dCk7Ci0JCUlGaWd1cmUgZmlndXJlID0gKChHcmFwaGljYWxFZGl0UGFydCkgZ2V0RWRpdFBhcnQoKSkuZ2V0RmlndXJlKCk7Ci0JCXNjYWxlZEZvbnQgPSBmaWd1cmUuZ2V0Rm9udCgpOwotCQlGb250RGF0YSBkYXRhID0gc2NhbGVkRm9udC5nZXRGb250RGF0YSgpWzBdOwotCQlEaW1lbnNpb24gZm9udFNpemUgPSBuZXcgRGltZW5zaW9uKDAsIGRhdGEuZ2V0SGVpZ2h0KCkpOwotCQlhY3Rpdml0eUxhYmVsLnRyYW5zbGF0ZVRvQWJzb2x1dGUoZm9udFNpemUpOwotCQlkYXRhLnNldEhlaWdodChmb250U2l6ZS5oZWlnaHQpOwotCQlzY2FsZWRGb250ID0gbmV3IEZvbnQobnVsbCwgZGF0YSk7Ci0KLQkJdGV4dC5zZXRGb250KHNjYWxlZEZvbnQpOwotCQl0ZXh0LnNlbGVjdEFsbCgpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZ2VmLnRvb2xzLkRpcmVjdEVkaXRNYW5hZ2VyI3VuaG9va0xpc3RlbmVycygpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdW5ob29rTGlzdGVuZXJzKCkgewotCQlzdXBlci51bmhvb2tMaXN0ZW5lcnMoKTsKLQkJaWYgKGdldENlbGxFZGl0b3IoKSAhPSBudWxsKSB7Ci0JCQlUZXh0IHRleHQgPSAoVGV4dCkgZ2V0Q2VsbEVkaXRvcigpLmdldENvbnRyb2woKTsKLQkJCXRleHQucmVtb3ZlVmVyaWZ5TGlzdGVuZXIodmVyaWZ5TGlzdGVuZXIpOwotCQkJdmVyaWZ5TGlzdGVuZXIgPSBudWxsOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ2hlY2tzIGlmIHRoZSBnaXZlbiB0ZXh0IGlzIHZhbGlkLiBTdWJjbGFzc2VzIGNhbiBvdmVycmlkZSB0aGlzIG1ldGhvZC4KLQkgKiAKLQkgKiBAcGFyYW0gdHh0Ci0JICogQHJldHVybiBudWxsIGlmIHRoZSBnaXZlbiB0ZXh0IGlzIHZhbGlkLCBhbiBlcnJvciBtZXNzYWdlIG90aGVyd2lzZQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgdmFsaWRhdGUoU3RyaW5nIHR4dCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmdlZi50b29scy5EaXJlY3RFZGl0TWFuYWdlciNjb21taXQoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbW1pdCgpIHsKLQkJU3RyaW5nIG1zZyA9IHZhbGlkYXRlKChTdHJpbmcpIGdldENlbGxFZGl0b3IoKS5nZXRWYWx1ZSgpKTsKLQkJaWYgKG1zZyAhPSBudWxsKSB7Ci0JCQlicmluZ0Rvd24oZmFsc2UpOwotCQkJRGlzcGxheS5nZXRDdXJyZW50KCkuYXN5bmNFeGVjKAotCQkJCQluZXcgUHJvbXB0RWRpdCgoTmFtZWROb2RlRWRpdFBhcnQpIGdldEVkaXRQYXJ0KCksIG1zZykpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmNvbW1pdCgpOwotCX0KLQotCXN0YXRpYyBjbGFzcyBQcm9tcHRFZGl0IGltcGxlbWVudHMgUnVubmFibGUgewotCi0JCXByaXZhdGUgTmFtZWROb2RlRWRpdFBhcnQgcGFydDsKLQotCQlwcml2YXRlIFN0cmluZyBtc2c7Ci0KLQkJUHJvbXB0RWRpdChOYW1lZE5vZGVFZGl0UGFydCBwYXJ0LCBTdHJpbmcgbXNnKSB7Ci0JCQl0aGlzLnBhcnQgPSBwYXJ0OwotCQkJdGhpcy5tc2cgPSBtc2c7Ci0JCX0KLQotCQkvKioKLQkJICogQHNlZSBqYXZhLmxhbmcuUnVubmFibGUjcnVuKCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCVN0cmluZyB0aXRsZSA9IERpYWdyYW1VSVJlc291cmNlcy5kaWFncmFtX2Vycm9yRGlhbG9nX3RpdGxlX3RleHQwOyAKLQkJCU1zZ0RpYWxvZyBkaWFsb2cgPSBBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCk7Ci0JCQlkaWFsb2cuZGlzcGxheUVycm9yKHRpdGxlLCBtc2cpOyAKLQkJCXBhcnQucGVyZm9ybURpcmVjdEVkaXQoKTsKLQkJfQotCi0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L1ZhbGlkYXRpbmdGcmVlVGV4dEVkaXRNYW5hZ2VyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L1ZhbGlkYXRpbmdGcmVlVGV4dEVkaXRNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4MGUzODMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9WYWxpZGF0aW5nRnJlZVRleHRFZGl0TWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LkRpbWVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi51dGlsLkRpYWdyYW1VSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS51dGlsLk1zZ0RpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvcGVydHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi50b29scy5DZWxsRWRpdG9yTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYudG9vbHMuRGlyZWN0RWRpdE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlZlcmlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuVmVyaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5HQzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotCi0KLS8qKgotICogTWFuYWdlcyBkaXJlY3QgZWRpdGluZyBhbmQgY3JlYXRpbmcgY2VsbCBlZGl0b3IgZm9yIHRoZSB7QGxpbmsgTGFiZWx9Ci0gKiBhbmQgdmFsaWRhdGVzIHRoZSBpbnB1dC4gCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFZhbGlkYXRpbmdGcmVlVGV4dEVkaXRNYW5hZ2VyIGV4dGVuZHMgRGlyZWN0RWRpdE1hbmFnZXIgewotCi0JRm9udCBzY2FsZWRGb250OwotCi0JcHJvdGVjdGVkIFZlcmlmeUxpc3RlbmVyIHZlcmlmeUxpc3RlbmVyOwotCi0JcHJvdGVjdGVkIExhYmVsIGFjdGl2aXR5TGFiZWw7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IEFjdGl2aXR5RGlyZWN0RWRpdE1hbmFnZXIgd2l0aCB0aGUgZ2l2ZW4gYXR0cmlidXRlcy4KLQkgKiAKLQkgKiBAcGFyYW0gc291cmNlCi0JICogICAgICAgICAgICB0aGUgc291cmNlIEVkaXRQYXJ0Ci0JICogQHBhcmFtIGVkaXRvclR5cGUKLQkgKiAgICAgICAgICAgIHR5cGUgb2YgZWRpdG9yCi0JICogQHBhcmFtIGxvY2F0b3IKLQkgKiAgICAgICAgICAgIHRoZSBDZWxsRWRpdG9yTG9jYXRvcgotCSAqLwotCXB1YmxpYyBWYWxpZGF0aW5nRnJlZVRleHRFZGl0TWFuYWdlcihHcmFwaGljYWxFZGl0UGFydCBzb3VyY2UsCi0JCQlDbGFzcyBlZGl0b3JUeXBlLCBDZWxsRWRpdG9yTG9jYXRvciBsb2NhdG9yLCBMYWJlbCBsYWJlbCkgewotCQlzdXBlcihzb3VyY2UsIGVkaXRvclR5cGUsIGxvY2F0b3IpOwotCQlhY3Rpdml0eUxhYmVsID0gbGFiZWw7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5nZWYudG9vbHMuRGlyZWN0RWRpdE1hbmFnZXIjYnJpbmdEb3duKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBicmluZ0Rvd24oKSB7Ci0JCWJyaW5nRG93bih0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmdlZi50b29scy5EaXJlY3RFZGl0TWFuYWdlciNicmluZ0Rvd24oKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGJyaW5nRG93bihib29sZWFuIGNoZWNrKSB7Ci0JCS8vIFRoaXMgbWV0aG9kIG1pZ2h0IGJlIHJlLWVudGVyZWQgd2hlbiBzdXBlci5icmluZ0Rvd24oKSBpcyBjYWxsZWQuCi0JCUZvbnQgZGlzcG9zZUZvbnQgPSBzY2FsZWRGb250OwotCQlzY2FsZWRGb250ID0gbnVsbDsKLQkJc3VwZXIuYnJpbmdEb3duKCk7Ci0JCWlmIChkaXNwb3NlRm9udCAhPSBudWxsKQotCQkJZGlzcG9zZUZvbnQuZGlzcG9zZSgpOwotCQlpZiAoY2hlY2spIHsKLQkJCUdyYXBoTm9kZSBub2RlID0gKChOb2RlKSBnZXRFZGl0UGFydCgpLmdldE1vZGVsKCkpLmdldEdyYXBoTm9kZSgpOwotCQkJU3RyaW5nIG5hbWUgPSAoKFByb3BlcnR5KSBub2RlLmdldFByb3BlcnR5KCkuZ2V0KDApKS5nZXRWYWx1ZSgpOwotCQkJaWYgKG5hbWUgPT0gbnVsbCB8fCBuYW1lLnRyaW0oKS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJRGlzcGxheQotCQkJCQkJLmdldEN1cnJlbnQoKQotCQkJCQkJLmFzeW5jRXhlYygKLQkJCQkJCQkJbmV3IFByb21wdEVkaXQoCi0JCQkJCQkJCQkJKE5vZGVFZGl0UGFydCkgZ2V0RWRpdFBhcnQoKSwKLQkJCQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5nZWZfdmFsaWRhdGluZ0ZyZWVUZXh0RWRpdE1hbmFnZXJfYnJpbmdEb3duUHJvbXB0KSk7IAotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5nZWYudG9vbHMuRGlyZWN0RWRpdE1hbmFnZXIjaW5pdENlbGxFZGl0b3IoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRDZWxsRWRpdG9yKCkgewotCQlUZXh0IHRleHQgPSAoVGV4dCkgZ2V0Q2VsbEVkaXRvcigpLmdldENvbnRyb2woKTsKLQkJdmVyaWZ5TGlzdGVuZXIgPSBuZXcgVmVyaWZ5TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB2ZXJpZnlUZXh0KFZlcmlmeUV2ZW50IGV2ZW50KSB7Ci0JCQkJVGV4dCB0ZXh0ID0gKFRleHQpIGdldENlbGxFZGl0b3IoKS5nZXRDb250cm9sKCk7Ci0JCQkJU3RyaW5nIG9sZFRleHQgPSB0ZXh0LmdldFRleHQoKTsKLQkJCQlTdHJpbmcgbGVmdFRleHQgPSBvbGRUZXh0LnN1YnN0cmluZygwLCBldmVudC5zdGFydCk7Ci0JCQkJU3RyaW5nIHJpZ2h0VGV4dCA9IG9sZFRleHQuc3Vic3RyaW5nKGV2ZW50LmVuZCwgb2xkVGV4dAotCQkJCQkJLmxlbmd0aCgpKTsKLQkJCQlHQyBnYyA9IG5ldyBHQyh0ZXh0KTsKLQkJCQlQb2ludCBzaXplID0gZ2MudGV4dEV4dGVudChsZWZ0VGV4dCArIGV2ZW50LnRleHQgKyByaWdodFRleHQpOwotCQkJCWdjLmRpc3Bvc2UoKTsKLQkJCQlpZiAoc2l6ZS54ICE9IDApCi0JCQkJCXNpemUgPSB0ZXh0LmNvbXB1dGVTaXplKHNpemUueCwgU1dULkRFRkFVTFQpOwotCQkJCWdldENlbGxFZGl0b3IoKS5nZXRDb250cm9sKCkuc2V0U2l6ZShzaXplLngsIHNpemUueSk7Ci0JCQl9Ci0JCX07Ci0JCXRleHQuYWRkVmVyaWZ5TGlzdGVuZXIodmVyaWZ5TGlzdGVuZXIpOwotCi0JCVN0cmluZyBpbml0aWFsTGFiZWxUZXh0ID0gYWN0aXZpdHlMYWJlbC5nZXRUZXh0KCk7Ci0JCWdldENlbGxFZGl0b3IoKS5zZXRWYWx1ZShpbml0aWFsTGFiZWxUZXh0KTsKLQkJdGV4dC5zZWxlY3RBbGwoKTsKLQkJSUZpZ3VyZSBmaWd1cmUgPSAoKEdyYXBoaWNhbEVkaXRQYXJ0KSBnZXRFZGl0UGFydCgpKS5nZXRGaWd1cmUoKTsKLQkJc2NhbGVkRm9udCA9IGZpZ3VyZS5nZXRGb250KCk7Ci0JCUZvbnREYXRhIGRhdGEgPSBzY2FsZWRGb250LmdldEZvbnREYXRhKClbMF07Ci0JCURpbWVuc2lvbiBmb250U2l6ZSA9IG5ldyBEaW1lbnNpb24oMCwgZGF0YS5nZXRIZWlnaHQoKSk7Ci0JCWFjdGl2aXR5TGFiZWwudHJhbnNsYXRlVG9BYnNvbHV0ZShmb250U2l6ZSk7Ci0JCWRhdGEuc2V0SGVpZ2h0KGZvbnRTaXplLmhlaWdodCk7Ci0JCXNjYWxlZEZvbnQgPSBuZXcgRm9udChudWxsLCBkYXRhKTsKLQotCQl0ZXh0LnNldEZvbnQoc2NhbGVkRm9udCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5nZWYudG9vbHMuRGlyZWN0RWRpdE1hbmFnZXIjdW5ob29rTGlzdGVuZXJzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB1bmhvb2tMaXN0ZW5lcnMoKSB7Ci0JCXN1cGVyLnVuaG9va0xpc3RlbmVycygpOwotCQlpZiAoZ2V0Q2VsbEVkaXRvcigpICE9IG51bGwpIHsKLQkJCVRleHQgdGV4dCA9IChUZXh0KSBnZXRDZWxsRWRpdG9yKCkuZ2V0Q29udHJvbCgpOwotCQkJdGV4dC5yZW1vdmVWZXJpZnlMaXN0ZW5lcih2ZXJpZnlMaXN0ZW5lcik7Ci0JCQl2ZXJpZnlMaXN0ZW5lciA9IG51bGw7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDaGVja3MgaWYgdGhlIGdpdmVuIHRleHQgaXMgdmFsaWQuIFN1YmNsYXNzZXMgY2FuIG92ZXJyaWRlIHRoaXMgbWV0aG9kLgotCSAqIAotCSAqIEBwYXJhbSB0eHQKLQkgKiBAcmV0dXJuIG51bGwgaWYgdGhlIGdpdmVuIHRleHQgaXMgdmFsaWQsIGFuIGVycm9yIG1lc3NhZ2Ugb3RoZXJ3aXNlCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyB2YWxpZGF0ZShTdHJpbmcgdHh0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZ2VmLnRvb2xzLkRpcmVjdEVkaXRNYW5hZ2VyI2NvbW1pdCgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29tbWl0KCkgewotCQlTdHJpbmcgbXNnID0gdmFsaWRhdGUoKFN0cmluZykgZ2V0Q2VsbEVkaXRvcigpLmdldFZhbHVlKCkpOwotCQlpZiAobXNnICE9IG51bGwpIHsKLQkJCWJyaW5nRG93bihmYWxzZSk7Ci0JCQlEaXNwbGF5LmdldEN1cnJlbnQoKS5hc3luY0V4ZWMoCi0JCQkJCW5ldyBQcm9tcHRFZGl0KChOYW1lZE5vZGVFZGl0UGFydCkgZ2V0RWRpdFBhcnQoKSwgbXNnKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuY29tbWl0KCk7Ci0JfQotCi0Jc3RhdGljIGNsYXNzIFByb21wdEVkaXQgaW1wbGVtZW50cyBSdW5uYWJsZSB7Ci0KLQkJcHJpdmF0ZSBOb2RlRWRpdFBhcnQgcGFydDsKLQotCQlwcml2YXRlIFN0cmluZyBtc2c7Ci0KLQkJUHJvbXB0RWRpdChOb2RlRWRpdFBhcnQgcGFydCwgU3RyaW5nIG1zZykgewotCQkJdGhpcy5wYXJ0ID0gcGFydDsKLQkJCXRoaXMubXNnID0gbXNnOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBzZWUgamF2YS5sYW5nLlJ1bm5hYmxlI3J1bigpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQlTdHJpbmcgdGl0bGUgPSBEaWFncmFtVUlSZXNvdXJjZXMuZGlhZ3JhbV9lcnJvckRpYWxvZ190aXRsZV90ZXh0MDsgCi0JCQlTdHJpbmcgcHJvYmxlbSA9IERpYWdyYW1VSVJlc291cmNlcy5kaWFncmFtX25vZGVfcHJvcGVydHlfdmFsdWVfcHJvYmxlbV9tc2c7IAotCQkJTXNnRGlhbG9nIGRpYWxvZyA9IEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKTsKLQkJCWRpYWxvZy5kaXNwbGF5RXJyb3IodGl0bGUsIHByb2JsZW0sIG1zZyk7IAotCQkJcGFydC5wZXJmb3JtRGlyZWN0RWRpdCgpOwotCQl9Ci0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvV1BEaWFncmFtRWRpdFBhcnRGYWN0b3J5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L1dQRGlhZ3JhbUVkaXRQYXJ0RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYzQ3N2YzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvV1BEaWFncmFtRWRpdFBhcnRGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuRGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5MaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5hbWVkTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5UeXBlZE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuV29ya1Byb2R1Y3ROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnRGYWN0b3J5OwotCi0vKioKLSAqIEZhY3RvcnkgZm9yIFdvcmsgUHJvZHVjdCBEZXBlbmRlbmN5IERpYWdyYW0uIFN1cHBvcnQgY3JlYXRpb24gCi0gKiBvZiBjaGlsZCBlZGl0cGFydCBpbiBXb3JrUFJvZHVjdCBkZXBlbmRlbmN5IGRpYWdyYW0uIAotICogCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFdQRGlhZ3JhbUVkaXRQYXJ0RmFjdG9yeSBpbXBsZW1lbnRzIEVkaXRQYXJ0RmFjdG9yeSB7Ci0KLQlwdWJsaWMgV1BEaWFncmFtRWRpdFBhcnRGYWN0b3J5KCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0RmFjdG9yeSNjcmVhdGVFZGl0UGFydChFZGl0UGFydCwgT2JqZWN0KQotCSAqLwotCXB1YmxpYyBFZGl0UGFydCBjcmVhdGVFZGl0UGFydChFZGl0UGFydCBjb250ZXh0LCBPYmplY3QgbW9kZWwpIHsKLQkJaWYgKG1vZGVsIGluc3RhbmNlb2YgRGlhZ3JhbSkgewotCQkJcmV0dXJuIG5ldyBEaWFncmFtRWRpdFBhcnQoKERpYWdyYW0pIG1vZGVsKTsKLQkJfSBlbHNlIGlmIChtb2RlbCBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0Tm9kZSkgewotCQkJcmV0dXJuIG5ldyBXb3JrUHJvZHVjdE5vZGVFZGl0UGFydCgoTmFtZWROb2RlKSBtb2RlbCk7Ci0JCX0gZWxzZSBpZiAobW9kZWwgaW5zdGFuY2VvZiBMaW5rKSB7Ci0JCQlyZXR1cm4gbmV3IExpbmtFZGl0UGFydCgoTGluaykgbW9kZWwpOwotCQl9Ci0JCS8vIHR5cGVkIG5vZGUgY3JlYXRpb24KLQkJaWYgKG1vZGVsIGluc3RhbmNlb2YgVHlwZWROb2RlKSB7Ci0JCQlUeXBlZE5vZGUgbm9kZSA9IChUeXBlZE5vZGUpIG1vZGVsOwotCQkJc3dpdGNoIChub2RlLmdldFR5cGUoKSkgewotCQkJY2FzZSBUeXBlZE5vZGUuU1RBUlQ6Ci0JCQkJcmV0dXJuIG5ldyBTdGFydE5vZGVFZGl0UGFydChub2RlKTsKLQkJCWNhc2UgVHlwZWROb2RlLkVORDoKLQkJCQlyZXR1cm4gbmV3IEVuZE5vZGVFZGl0UGFydChub2RlKTsKLQkJCWNhc2UgVHlwZWROb2RlLkRFQ0lTSU9OOgotCQkJCXJldHVybiBuZXcgRGVjaXNpb25Ob2RlRWRpdFBhcnQobm9kZSk7Ci0JCQljYXNlIFR5cGVkTm9kZS5TWU5DSF9CQVI6Ci0JCQkJcmV0dXJuIG5ldyBTeW5jaEJhck5vZGVFZGl0UGFydChub2RlKTsKLQkJCWNhc2UgVHlwZWROb2RlLkZSRUVfVEVYVDoKLQkJCQlyZXR1cm4gbmV3IEZyZWVUZXh0Tm9kZUVkaXRQYXJ0KG5vZGUpOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9XUE5vZGVFZGl0UGFydC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9XUE5vZGVFZGl0UGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NzkxZWJmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvV1BOb2RlRWRpdFBhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuQ29sb3JDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Qb3NpdGlvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5maWd1cmVzLkltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5maWd1cmVzLlNlbGVjdGFibGVMYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5maWd1cmVzLldQQ29tcGFydG1lbnRGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTmFtZWROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuV29ya1Byb2R1Y3ROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5TdXBwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYudG9vbHMuRGlyZWN0RWRpdE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UZXh0Q2VsbEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250OwotCi0vKioKLSAqIAotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICogQGRlcHJlY2F0ZWQgCi0gKiBAc2VlIFdvcmtQcm9kdWN0Tm9kZUVkaXRQYXJ0Ci0gKi8KLXB1YmxpYyBjbGFzcyBXUE5vZGVFZGl0UGFydCBleHRlbmRzIE5hbWVkTm9kZUVkaXRQYXJ0IHsKLQotCWludCB0eXBlID0gMTsKLQotCXB1YmxpYyBXUE5vZGVFZGl0UGFydChOYW1lZE5vZGUgbW9kZWwpIHsKLQkJc3VwZXIobW9kZWwpOwotCX0KLQotCXByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZUZpZ3VyZSgpIHsKLQkJaWYgKGdldE1vZGVsKCkgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdE5vZGUpIHsKLQkJCXR5cGUgPSAoKFdvcmtQcm9kdWN0Tm9kZSkgZ2V0TW9kZWwoKSkuZ2V0VHlwZSgpOwotCQl9Ci0JCUxhYmVsIGwgPSBuZXcgU2VsZWN0YWJsZUxhYmVsKCk7Ci0JCWwuc2V0TGFiZWxBbGlnbm1lbnQoUG9zaXRpb25Db25zdGFudHMuTEVGVCk7Ci0JCWwuc2V0VGV4dFBsYWNlbWVudChQb3NpdGlvbkNvbnN0YW50cy5TT1VUSCk7Ci0JCWwuc2V0QmFja2dyb3VuZENvbG9yKENvbG9yQ29uc3RhbnRzLndoaXRlKTsKLQkJRm9udCBmb250ID0gbmV3IEZvbnQobnVsbCwgIkFyaWFsIiwgOSwgU1dULk5PUk1BTCk7IC8vJE5PTi1OTFMtMSQKLQkJbC5zZXRGb250KGZvbnQpOwotCQlpZiAodHlwZSA9PSAxKQotCQkJbC5zZXRJY29uKEltYWdlcy5BUlRJRkFDVCk7Ci0JCWVsc2UgaWYgKHR5cGUgPT0gMikKLQkJCWwuc2V0SWNvbihJbWFnZXMuREVMSVZFUkFCTEUpOwotCQllbHNlIGlmICh0eXBlID09IDMpCi0JCQlsLnNldEljb24oSW1hZ2VzLk9VVENPTUUpOwotCQllbHNlCi0JCQlsLnNldEljb24oSW1hZ2VzLldPUktfUFJPRFVDVF9ERVNDUklQVE9SKTsKLQkJbC5zZXRJY29uVGV4dEdhcCg1KTsKLQotCQlXUENvbXBhcnRtZW50RmlndXJlIHdwZmlndXJlID0gbmV3IFdQQ29tcGFydG1lbnRGaWd1cmUobCwgdHlwZSk7Ci0JCXJldHVybiB3cGZpZ3VyZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQuQmFzZUVkaXRQYXJ0I2NyZWF0ZURpcmVjdEVkaXRNYW5hZ2VyKCkKLQkgKi8KLQlwcm90ZWN0ZWQgRGlyZWN0RWRpdE1hbmFnZXIgY3JlYXRlRGlyZWN0RWRpdE1hbmFnZXIoKSB7Ci0JCUxhYmVsIGwgPSAoTGFiZWwpICgoKFdQQ29tcGFydG1lbnRGaWd1cmUpIGdldEZpZ3VyZSgpKS5nZXRMYWJlbCgpKTsKLQkJcmV0dXJuIG5ldyBWYWxpZGF0aW5nRGlyZWN0RWRpdE1hbmFnZXIodGhpcywgVGV4dENlbGxFZGl0b3IuY2xhc3MsCi0JCQkJbmV3IExhYmVsVGV4dENlbGxFZGl0b3JMb2NhdG9yKGwpLCBsKSB7Ci0JCQlwcm90ZWN0ZWQgU3RyaW5nIHZhbGlkYXRlKFN0cmluZyB0eHQpIHsKLQkJCQlPYmplY3Qgb2JqID0gZ2V0RWRpdFBhcnQoKS5nZXRNb2RlbCgpOwotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBXb3JrUHJvZHVjdE5vZGUpIHsKLQkJCQkJTm9kZSBub2RlID0gKE5vZGUpIG9iajsKLQkJCQkJT2JqZWN0IGUgPSBub2RlLmdldE9iamVjdCgpOwotCQkJCQlTdXBwcmVzc2lvbiBzdXBwcmVzc2lvbiA9IG5vZGUuZ2V0RGlhZ3JhbSgpLmdldFN1cHByZXNzaW9uKCk7Ci0JCQkJCXJldHVybiBUbmdVdGlsLmNoZWNrV29ya1Byb2R1Y3REZXNjcmlwdG9yUHJlc2VudGF0aW9uTmFtZSgKLQkJCQkJCQllLCB0eHQsIHN1cHByZXNzaW9uKTsKLQkJCQl9Ci0KLQkJCQlyZXR1cm4gc3VwZXIudmFsaWRhdGUodHh0KTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlJRmlndXJlIGdldERpcmVjdEVkaXRGaWd1cmUoKSB7Ci0JCXJldHVybiAoKChXUENvbXBhcnRtZW50RmlndXJlKSBnZXRGaWd1cmUoKSkuZ2V0TGFiZWwoKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L1dvcmtCcmVha2Rvd25FbGVtZW50Tm9kZUVkaXRQYXJ0LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L1dvcmtCcmVha2Rvd25FbGVtZW50Tm9kZUVkaXRQYXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxOWJlNzYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9Xb3JrQnJlYWtkb3duRWxlbWVudE5vZGVFZGl0UGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuQ29sb3JDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZmlndXJlcy5BY3Rpdml0eUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5maWd1cmVzLkNvbG9yczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5maWd1cmVzLkltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5maWd1cmVzLlRleHRGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTmFtZWROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuV29ya0JyZWFrZG93bkVsZW1lbnROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLldvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlByb2Nlc3NVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkl0ZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1pbGVzdG9uZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlBoYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi50b29scy5EaXJlY3RFZGl0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRleHRDZWxsRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0KLS8qKgotICogQ29tbW9uIGVkaXRwYXJ0IGZvciBkaWZmZXJlbnQge0BsaW5rIERlc2NyaXB0b3J9Ci0gKiBQcm92aWRlcyBzdXBwb3J0IGZvciB3b3JkLXdyYXAgb2YgZWRpdHBhcnQncyBvYmplY3QgbmFtZS4gCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBXb3JrQnJlYWtkb3duRWxlbWVudE5vZGVFZGl0UGFydCBleHRlbmRzIE5hbWVkTm9kZUVkaXRQYXJ0IHsKLQotCXB1YmxpYyBXb3JrQnJlYWtkb3duRWxlbWVudE5vZGVFZGl0UGFydChOYW1lZE5vZGUgbW9kZWwpIHsKLQkJc3VwZXIobW9kZWwpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZWRpdC5OYW1lZE5vZGVFZGl0UGFydCNnZXRJbWFnZSgpCi0JICovCi0JcHJvdGVjdGVkIEltYWdlIGdldEltYWdlKCkgewotCQlJbWFnZSBpbWcgPSBudWxsOwotCQlOb2RlIG5vZGUgPSAoTm9kZSkgZ2V0TW9kZWwoKTsKLQkJT2JqZWN0IG9iaiA9IG5vZGUuZ2V0T2JqZWN0KCk7Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBQaGFzZSkgewotCQkJaW1nID0gSW1hZ2VzLlBIQVNFOwotCQl9Ci0JCWVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIEl0ZXJhdGlvbikgewotCQkJaW1nID0gSW1hZ2VzLklURVJBVElPTjsKLQkJfQotCQllbHNlIGlmIChvYmogaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJaW1nID0gSW1hZ2VzLkFDVElWSVRZOwotCQl9Ci0JCWVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIFRhc2tEZXNjcmlwdG9yKSB7Ci0JCQlpbWcgPSBJbWFnZXMuVEFTS19ERVNDUklQVE9SOwotCQl9Ci0JCWVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIE1pbGVzdG9uZSkgewotCQkJaW1nID0gSW1hZ2VzLk1JTEVTVE9ORTsKLQkJfQotCQlyZXR1cm4gaW1nOwotCX0KLQotCXByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZUZpZ3VyZSgpIHsKLQkJQWN0aXZpdHlGaWd1cmUgZmlndXJlID0gbmV3IEFjdGl2aXR5RmlndXJlKCk7Ci0JCUltYWdlIGltYWdlID0gZ2V0SW1hZ2UoKTsKLQkJaWYgKGltYWdlICE9IG51bGwpIHsKLQkJCWZpZ3VyZS5hZGQoaW1hZ2UpOwotCQl9Ci0JCXJldHVybiBmaWd1cmU7Ci0JfQotCi0JU3RyaW5nIGdldERpcmVjdEVkaXRUZXh0KCkgewotCQlUZXh0RmlndXJlIG5vdGUgPSAoVGV4dEZpZ3VyZSkgZ2V0RmlndXJlKCk7Ci0JCXJldHVybiBub3RlLmdldFRleHQoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoVmlzdWFscygpIHsKLQkJc3VwZXIucmVmcmVzaFZpc3VhbHMoKTsKLQkJSUZpZ3VyZSBmaWcgPSBnZXREaXJlY3RFZGl0RmlndXJlKCk7Ci0JCWlmIChmaWcgaW5zdGFuY2VvZiBBY3Rpdml0eUZpZ3VyZSkgewotCQkJQWN0aXZpdHlGaWd1cmUgbCA9IChBY3Rpdml0eUZpZ3VyZSkgZmlnOwotCQkJZmlnLnNldEZvcmVncm91bmRDb2xvcihnZXRGb3JlZ3JvdW5kQ29sb3IoKSk7Ci0JCQlTdHJpbmcgdGV4dDsKLQkJCS8vIEJlbG93IGNoZWNrIGlzIHJlcXVpcmVkIGZvciBFeHRlbmRlZCBBY3Rpdml0eSBwcmVzZW50YXRpb24gbmFtZQotCQkJLy8gc2hvdWxkIGJlIHVzZWQgZnJvbSBiYXNlLgotCQkJaWYgKGdldE1vZGVsKCkgaW5zdGFuY2VvZiBXb3JrQnJlYWtkb3duRWxlbWVudE5vZGUpIHsKLQkJCQlXb3JrQnJlYWtkb3duRWxlbWVudE5vZGUgbm9kZSA9IChXb3JrQnJlYWtkb3duRWxlbWVudE5vZGUpIGdldE1vZGVsKCk7Ci0JCQkJT2JqZWN0IHdiZWxlbWVudCA9IG5vZGUuZ2V0T2JqZWN0KCk7Ci0JCQkJaWYgKHdiZWxlbWVudCBpbnN0YW5jZW9mIEFjdGl2aXR5Ci0JCQkJCQkmJiBQcm9jZXNzVXRpbAotCQkJCQkJCQkuaXNFeHRlbmRpbmdPckxvY2FsbHlDb250cmlidXRpbmcoKEJyZWFrZG93bkVsZW1lbnQpIHdiZWxlbWVudCkpIHsKLQkJCQkJdGV4dCA9IFByb2Nlc3NVdGlsCi0JCQkJCQkJLmdldFByZXNlbnRhdGlvbk5hbWUoKEJyZWFrZG93bkVsZW1lbnQpIHdiZWxlbWVudCk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQl0ZXh0ID0gKChOYW1lZE5vZGUpIGdldE1vZGVsKCkpLmdldE5hbWUoKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQl0ZXh0ID0gKChOYW1lZE5vZGUpIGdldE1vZGVsKCkpLmdldE5hbWUoKTsKLQkJCX0KLQkJCXRyeSB7Ci0JCQkJaWYgKGdldFBhcmVudCgpIGluc3RhbmNlb2YgQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdFBhcnQKLQkJCQkJCXx8IGdldFBhcmVudCgpLmdldFBhcmVudCgpIGluc3RhbmNlb2YgQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdFBhcnQpIHsKLQkJCQkJaW50IHcgPSBXUkFQX1dJRFRIOwotCQkJCQlpZiAodGhpcy5nZXRNb2RlbCgpIGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZSkKLQkJCQkJCXcgPSBXT1JLX1BST0RVQ1RfV1JBUF9XSURUSDsKLQkJCQkJdGV4dCA9IHdyYXAodGV4dCwgdyk7Ci0JCQkJfQotCQkJfQotCQkJY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIG5wZSkgewotCQkJfQotCQkJbC5zZXRUZXh0KHRleHQpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBDb2xvciBnZXRGb3JlZ3JvdW5kQ29sb3IoKSB7Ci0JCU5hbWVkTm9kZSBub2RlID0gKE5hbWVkTm9kZSkgZ2V0TW9kZWwoKTsKLQkJaWYgKG5vZGUuaXNTdXBwcmVzc2VkKCkpIHsKLQkJCXJldHVybiBDb2xvcnMuU1VQUkVTU0VEX0VMRU1FTlRfTEFCRUw7Ci0JCX0KLQkJaWYgKG5vZGUuaXNSZWFkT25seSgpKSB7Ci0JCQlyZXR1cm4gQ29sb3JzLklOSEVSSVRFRF9FTEVNRU5UX0xBQkVMOwotCQl9Ci0JCWVsc2UgewotCQkJcmV0dXJuIENvbG9yQ29uc3RhbnRzLmJsYWNrOwotCQl9Ci0JfQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZWRpdC5CYXNlRWRpdFBhcnQjY3JlYXRlRGlyZWN0RWRpdE1hbmFnZXIoKQotCSAqLwotCXByb3RlY3RlZCBEaXJlY3RFZGl0TWFuYWdlciBjcmVhdGVEaXJlY3RFZGl0TWFuYWdlcigpIHsKLQkJcmV0dXJuIG5ldyBUZXh0RmlndXJlRGlyZWN0RWRpdE1hbmFnZXIoKEdyYXBoaWNhbEVkaXRQYXJ0KSB0aGlzLAotCQkJCVRleHRDZWxsRWRpdG9yLmNsYXNzLCBuZXcgVGV4dEZpZ3VyZUNlbGxFZGl0b3JMb2NhdG9yKAotCQkJCQkJKFRleHRGaWd1cmUpIGdldEZpZ3VyZSgpKSwgKFRleHRGaWd1cmUpIGdldEZpZ3VyZSgpKSB7Ci0JCQlwcm90ZWN0ZWQgU3RyaW5nIHZhbGlkYXRlKFN0cmluZyB0eHQpIHsKLQkJCQlPYmplY3Qgb2JqID0gZ2V0RWRpdFBhcnQoKS5nZXRNb2RlbCgpOwotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBXb3JrQnJlYWtkb3duRWxlbWVudE5vZGUpIHsKLQkJCQkJV29ya0JyZWFrZG93bkVsZW1lbnROb2RlIG5vZGUgPSAoV29ya0JyZWFrZG93bkVsZW1lbnROb2RlKSBvYmo7Ci0JCQkJCU9iamVjdCBlID0gbm9kZS5nZXRPYmplY3QoKTsKLQkJCQkJaWYgKGUgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCQkJcmV0dXJuIFRuZ1V0aWwuY2hlY2tXQlNBY3Rpdml0eVByZXNlbnRhdGlvbk5hbWUoZSwgdHh0LCBub2RlLmdldERpYWdyYW0oKS5nZXRTdXBwcmVzc2lvbigpKTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCXJldHVybiBUbmdVdGlsCi0JCQkJCQkJCS5jaGVja1dvcmtCcmVha2Rvd25FbGVtZW50UHJlc2VudGF0aW9uTmFtZShlLAotCQkJCQkJCQkJCXR4dCwgbm9kZS5nZXREaWFncmFtKCkuZ2V0U3VwcHJlc3Npb24oKSk7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQlyZXR1cm4gc3VwZXIudmFsaWRhdGUodHh0KTsKLQkJCX0KLQkJfTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvV29ya1Byb2R1Y3RDb21wb3NpdGVFZGl0UGFydC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9Xb3JrUHJvZHVjdENvbXBvc2l0ZUVkaXRQYXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1MWM2ZmYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9Xb3JrUHJvZHVjdENvbXBvc2l0ZUVkaXRQYXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZWRpdDsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5DaG9wYm94QW5jaG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Db25uZWN0aW9uQW5jaG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5GaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkZsb3dMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmNvbW1hbmRzLkNyZWF0ZUxpbmtDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmNvbW1hbmRzLlJlY29ubmVjdExpbmtDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLnV0aWwuQ29ubmVjdGlvbkFuY2hvckxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYudXRpbC5UZW1wbGF0ZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTW9kZWxGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk1vZGVsUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGVDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuV29ya1Byb2R1Y3RDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkNvbm5lY3Rpb25FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5Ob2RlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5HcmFwaGljYWxOb2RlRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuQ3JlYXRlQ29ubmVjdGlvblJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLlJlY29ubmVjdFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci0KLWltcG9ydCBjb20uaWJtLmljdS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotLyoqCi0gKiBXb3JrUHJvZHVjdENvbXBvc2l0ZUVkaXRQYXJ0IGlzIGNvbnRhaW5lciB3aXRoIHtAbGluayBGbG93TGF5b3V0fSwgYW5kIGRvZXMgbm90IHN1cHBvcnQgYWRkaW5nL3JlbW92aW5nIGNoaWxkIGVkaXRwYXJ0LgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgV29ya1Byb2R1Y3RDb21wb3NpdGVFZGl0UGFydCBleHRlbmRzIE5vZGVDb250YWluZXJFZGl0UGFydAotCQlpbXBsZW1lbnRzIE5vZGVFZGl0UGFydCB7Ci0KLQkvL3ByaXZhdGUgc3RhdGljIGZpbmFsIENvbG9yIEJHX0NPTE9SID0gbmV3IENvbG9yKERpc3BsYXkuZ2V0Q3VycmVudCgpLCAyNTUsCi0JLy8JCTI1NSwgMjA1KTsKLQlwcml2YXRlIHN0YXRpYyBDb2xvciBCR19DT0xPUjsKLQotCS8qKgotCSAqIEBwYXJhbSBtb2RlbAotCSAqLwotCXB1YmxpYyBXb3JrUHJvZHVjdENvbXBvc2l0ZUVkaXRQYXJ0KFdvcmtQcm9kdWN0Q29tcG9zaXRlIG1vZGVsKSB7Ci0JCXN1cGVyKG1vZGVsKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVGaWd1cmUoKSB7Ci0JCUZpZ3VyZSBmaWd1cmUgPSBuZXcgRmlndXJlKCk7Ci0JCUZsb3dMYXlvdXQgbGF5b3V0ID0gbmV3IEZsb3dMYXlvdXQoKTsKLQkJbGF5b3V0LnNldE1pbm9yU3BhY2luZygyMCk7Ci0JCWZpZ3VyZS5zZXRMYXlvdXRNYW5hZ2VyKGxheW91dCk7Ci0JCWZpZ3VyZS5zZXRCb3JkZXIobmV3IFJhaXNlZE1hcmdpbkJvcmRlcigpKTsKLQkJZmlndXJlLnNldEJhY2tncm91bmRDb2xvcihnZXRCYWNrZ3JvdW5kQ29sb3IoKSk7Ci0JCWZpZ3VyZS5zZXRPcGFxdWUodHJ1ZSk7Ci0JCXJldHVybiBmaWd1cmU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0Lk5vZGVDb250YWluZXJFZGl0UGFydCNoYW5kbGVQcm9wZXJ0eUNoYW5nZWQoTm90aWZpY2F0aW9uKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGhhbmRsZVByb3BlcnR5Q2hhbmdlZChOb3RpZmljYXRpb24gbXNnKSB7Ci0JCXN3aXRjaCAobXNnLmdldEZlYXR1cmVJRChOb2RlQ29udGFpbmVyLmNsYXNzKSkgewotCQljYXNlIE1vZGVsUGFja2FnZS5OT0RFX0NPTlRBSU5FUl9fTk9ERVM6Ci0JCQlyZWZyZXNoQ2hpbGRyZW4oKTsKLQkJCQotCQkJYWRqdXN0U2l6ZSgpOwotCQkJCi0JCQkvLyByZWZyZXNoIGRpYWdyYW0ncyBjaGlsZHJlbgotCQkJRWRpdFBhcnQgZGlhZ3JhbUVkaXRQYXJ0ID0gZ2V0UGFyZW50KCk7Ci0JCQlkaWFncmFtRWRpdFBhcnQucmVmcmVzaCgpOwotCi0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuaGFuZGxlUHJvcGVydHlDaGFuZ2VkKG1zZyk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFkanVzdFNpemUoKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJTGlzdCBsaXN0ID0gZ2V0Q2hpbGRyZW4oKTsKLQkJaW50IHRIZWlnaHQgPSAyMDsKLQkJaW50IHRXaWR0aCA9IDIwOwotCQlmb3IoSXRlcmF0b3IgaXRlcmF0b3IgPSBsaXN0Lml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspewotCQkJR3JhcGhpY2FsRWRpdFBhcnQgZWRpdHBhcnQgPSAoR3JhcGhpY2FsRWRpdFBhcnQpaXRlcmF0b3IubmV4dCgpOwotCQkJdEhlaWdodCs9ZWRpdHBhcnQuZ2V0RmlndXJlKCkuZ2V0UHJlZmVycmVkU2l6ZSgpLmhlaWdodDsKLQkJCWlmKHRXaWR0aCA8IGVkaXRwYXJ0LmdldEZpZ3VyZSgpLmdldFByZWZlcnJlZFNpemUoKS53aWR0aCl7Ci0JCQkJdFdpZHRoID0gZWRpdHBhcnQuZ2V0RmlndXJlKCkuZ2V0UHJlZmVycmVkU2l6ZSgpLndpZHRoOwotCQkJfQotCQl9Ci0JCSgoTm9kZSkgdGhpcy5nZXRNb2RlbCgpKS5zZXRIZWlnaHQodEhlaWdodCk7Ci0JCSgoTm9kZSkgdGhpcy5nZXRNb2RlbCgpKS5zZXRXaWR0aCh0V2lkdGgrMjApOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUVkaXRQb2xpY2llcygpIHsKLQkJc3VwZXIuY3JlYXRlRWRpdFBvbGljaWVzKCk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuR1JBUEhJQ0FMX05PREVfUk9MRSwKLQkJCQluZXcgR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3koKSB7Ci0JCQkJCXByb3RlY3RlZCBDb21tYW5kIGdldENvbm5lY3Rpb25Db21wbGV0ZUNvbW1hbmQoCi0JCQkJCQkJQ3JlYXRlQ29ubmVjdGlvblJlcXVlc3QgcmVxdWVzdCkgewotCQkJCQkJQ3JlYXRlTGlua0NvbW1hbmQgY21kID0gKENyZWF0ZUxpbmtDb21tYW5kKSByZXF1ZXN0Ci0JCQkJCQkJCS5nZXRTdGFydENvbW1hbmQoKTsKLQkJCQkJCWNtZC5zZXRUYXJnZXQoKE5vZGUpIGdldEhvc3QoKS5nZXRNb2RlbCgpKTsKLQotCQkJCQkJaWYgKHJlcXVlc3QuZ2V0VGFyZ2V0RWRpdFBhcnQoKSBpbnN0YW5jZW9mIENvbm5lY3Rpb25BbmNob3JMb2NhdG9yKSB7Ci0JCQkJCQkJaWYgKHJlcXVlc3QuZ2V0VGFyZ2V0RWRpdFBhcnQoKS5lcXVhbHMoCi0JCQkJCQkJCQlyZXF1ZXN0LmdldFNvdXJjZUVkaXRQYXJ0KCkpKSB7Ci0KLQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQljbWQKLQkJCQkJCQkJCQkuc2V0VGFyZ2V0RW5kUG9pbnQoKChDb25uZWN0aW9uQW5jaG9yTG9jYXRvcikgcmVxdWVzdAotCQkJCQkJCQkJCQkJLmdldFRhcmdldEVkaXRQYXJ0KCkpCi0JCQkJCQkJCQkJCQkuZ2V0TG9jYXRpb24ocmVxdWVzdAotCQkJCQkJCQkJCQkJCQkuZ2V0TG9jYXRpb24oKSkpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQotCQkJCQkJcmV0dXJuIGNtZDsKLQkJCQkJfQotCi0JCQkJCXByb3RlY3RlZCBDb21tYW5kIGdldENvbm5lY3Rpb25DcmVhdGVDb21tYW5kKAotCQkJCQkJCUNyZWF0ZUNvbm5lY3Rpb25SZXF1ZXN0IHJlcXVlc3QpIHsKLQkJCQkJCUNyZWF0ZUxpbmtDb21tYW5kIGNtZCA9IG5ldyBDcmVhdGVMaW5rQ29tbWFuZCgKLQkJCQkJCQkJTW9kZWxGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVMaW5rKCksCi0JCQkJCQkJCShOb2RlKSBnZXRIb3N0KCkuZ2V0TW9kZWwoKSk7Ci0JCQkJCQlpZiAocmVxdWVzdC5nZXRUYXJnZXRFZGl0UGFydCgpIGluc3RhbmNlb2YgQ29ubmVjdGlvbkFuY2hvckxvY2F0b3IpIHsKLQkJCQkJCQljbWQKLQkJCQkJCQkJCS5zZXRTb3VyY2VFbmRQb2ludCgoKENvbm5lY3Rpb25BbmNob3JMb2NhdG9yKSByZXF1ZXN0Ci0JCQkJCQkJCQkJCS5nZXRUYXJnZXRFZGl0UGFydCgpKQotCQkJCQkJCQkJCQkuZ2V0TG9jYXRpb24ocmVxdWVzdC5nZXRMb2NhdGlvbigpKSk7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCWNtZC5zZXRTb3VyY2VFbmRQb2ludChyZXF1ZXN0LmdldExvY2F0aW9uKCkpOwotCQkJCQkJfQotCQkJCQkJcmVxdWVzdC5zZXRTdGFydENvbW1hbmQoY21kKTsKLQotCQkJCQkJcmV0dXJuIGNtZDsKLQotCQkJCQl9Ci0KLQkJCQkJcHJvdGVjdGVkIENvbW1hbmQgZ2V0UmVjb25uZWN0U291cmNlQ29tbWFuZCgKLQkJCQkJCQlSZWNvbm5lY3RSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJCQkJCUxpbmsgbGluayA9IChMaW5rKSByZXF1ZXN0LmdldENvbm5lY3Rpb25FZGl0UGFydCgpCi0JCQkJCQkJCS5nZXRNb2RlbCgpOwotCQkJCQkJUmVjb25uZWN0TGlua0NvbW1hbmQgY21kID0gbmV3IFJlY29ubmVjdExpbmtDb21tYW5kKAotCQkJCQkJCQlsaW5rLCAoTm9kZSkgZ2V0SG9zdCgpLmdldE1vZGVsKCksIHRydWUpOwotCQkJCQkJaWYgKHJlcXVlc3QuZ2V0VGFyZ2V0KCkgaW5zdGFuY2VvZiBDb25uZWN0aW9uQW5jaG9yTG9jYXRvcikgewotCQkJCQkJCWNtZC5zZXRFbmRQb2ludCgoKENvbm5lY3Rpb25BbmNob3JMb2NhdG9yKSByZXF1ZXN0Ci0JCQkJCQkJCQkuZ2V0VGFyZ2V0KCkpLmdldExvY2F0aW9uKHJlcXVlc3QKLQkJCQkJCQkJCS5nZXRMb2NhdGlvbigpKSk7Ci0JCQkJCQl9Ci0KLQkJCQkJCXJldHVybiBjbWQ7Ci0JCQkJCX0KLQotCQkJCQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRSZWNvbm5lY3RUYXJnZXRDb21tYW5kKAotCQkJCQkJCVJlY29ubmVjdFJlcXVlc3QgcmVxdWVzdCkgewotCQkJCQkJTGluayBsaW5rID0gKExpbmspIHJlcXVlc3QuZ2V0Q29ubmVjdGlvbkVkaXRQYXJ0KCkKLQkJCQkJCQkJLmdldE1vZGVsKCk7Ci0JCQkJCQlSZWNvbm5lY3RMaW5rQ29tbWFuZCBjbWQgPSBuZXcgUmVjb25uZWN0TGlua0NvbW1hbmQoCi0JCQkJCQkJCWxpbmssIChOb2RlKSBnZXRIb3N0KCkuZ2V0TW9kZWwoKSwgZmFsc2UpOwotCQkJCQkJaWYgKHJlcXVlc3QuZ2V0VGFyZ2V0KCkgaW5zdGFuY2VvZiBDb25uZWN0aW9uQW5jaG9yTG9jYXRvcikgewotCQkJCQkJCWNtZC5zZXRFbmRQb2ludCgoKENvbm5lY3Rpb25BbmNob3JMb2NhdG9yKSByZXF1ZXN0Ci0JCQkJCQkJCQkuZ2V0VGFyZ2V0KCkpLmdldExvY2F0aW9uKHJlcXVlc3QKLQkJCQkJCQkJCS5nZXRMb2NhdGlvbigpKSk7Ci0JCQkJCQl9Ci0JCQkJCQlyZXR1cm4gY21kOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuTEFZT1VUX1JPTEUsIG51bGwpOwotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LkNPTVBPTkVOVF9ST0xFLCBudWxsKTsKLQl9Ci0KLQlwdWJsaWMgQ29ubmVjdGlvbkFuY2hvciBnZXRTb3VyY2VDb25uZWN0aW9uQW5jaG9yKAotCQkJQ29ubmVjdGlvbkVkaXRQYXJ0IGNvbm5lY3Rpb24pIHsKLQkJcmV0dXJuIG5ldyBDaG9wYm94QW5jaG9yKGdldEZpZ3VyZSgpKTsKLQl9Ci0KLQlwdWJsaWMgQ29ubmVjdGlvbkFuY2hvciBnZXRTb3VyY2VDb25uZWN0aW9uQW5jaG9yKFJlcXVlc3QgcmVxdWVzdCkgewotCQlyZXR1cm4gbmV3IENob3Bib3hBbmNob3IoZ2V0RmlndXJlKCkpOwotCX0KLQotCXB1YmxpYyBDb25uZWN0aW9uQW5jaG9yIGdldFRhcmdldENvbm5lY3Rpb25BbmNob3IoCi0JCQlDb25uZWN0aW9uRWRpdFBhcnQgY29ubmVjdGlvbikgewotCQlyZXR1cm4gbmV3IENob3Bib3hBbmNob3IoZ2V0RmlndXJlKCkpOwotCX0KLQotCXB1YmxpYyBDb25uZWN0aW9uQW5jaG9yIGdldFRhcmdldENvbm5lY3Rpb25BbmNob3IoUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCXJldHVybiBuZXcgQ2hvcGJveEFuY2hvcihnZXRGaWd1cmUoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIExpc3QgZ2V0TW9kZWxTb3VyY2VDb25uZWN0aW9ucygpIHsKLQkJcmV0dXJuIGdldE5vZGUoKS5nZXRPdXRnb2luZ0Nvbm5lY3Rpb25zKCk7Ci0JfQotCi0JcHJvdGVjdGVkIExpc3QgZ2V0TW9kZWxUYXJnZXRDb25uZWN0aW9ucygpIHsKLQkJcmV0dXJuIGdldE5vZGUoKS5nZXRJbmNvbWluZ0Nvbm5lY3Rpb25zKCk7Ci0JfQotCi0JcHJvdGVjdGVkIE5vZGUgZ2V0Tm9kZSgpIHsKLQkJcmV0dXJuIChOb2RlKSBnZXRNb2RlbCgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgQ29sb3IgZ2V0QmFja2dyb3VuZENvbG9yKCl7Ci0JCWlmKEJHX0NPTE9SICE9IG51bGwpIHJldHVybiBCR19DT0xPUjsKLQkJCi0JCWlmKEJHX0NPTE9SID09IG51bGwpewotCQkJU3RyaW5nIGNvbG9yU3RyaW5nID0gQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpLmdldFN0cmluZygKLQkJCQkJVGVtcGxhdGVDb25zdGFudHMuQUREX1dQX0JPWF9CR19DT0xPUl9SR0IpOwotCQkJaWYoY29sb3JTdHJpbmcgIT0gbnVsbCAmJiBjb2xvclN0cmluZy5sZW5ndGgoKSA+IDApewotCQkJCVN0cmluZ1Rva2VuaXplciB0b2tlbml6ZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGNvbG9yU3RyaW5nLCAiLCIpOyAvLyROT04tTkxTLTEkCi0JCQkJaW50IHIgPSBJbnRlZ2VyLnBhcnNlSW50KHRva2VuaXplci5uZXh0VG9rZW4oKSk7Ci0JCQkJaW50IGcgPSBJbnRlZ2VyLnBhcnNlSW50KHRva2VuaXplci5uZXh0VG9rZW4oKSk7Ci0JCQkJaW50IGIgPSBJbnRlZ2VyLnBhcnNlSW50KHRva2VuaXplci5uZXh0VG9rZW4oKSk7Ci0JCQkJQkdfQ09MT1IgPSBuZXcgQ29sb3IobnVsbCwgcixnLGIpOwotCQkJCXJldHVybiBCR19DT0xPUjsKLQkJCX0KLQkJfQotCQlpZihCR19DT0xPUiA9PSBudWxsKXsKLQkJCUJHX0NPTE9SID0gbmV3IENvbG9yKERpc3BsYXkuZ2V0Q3VycmVudCgpLCAyNTUsCi0JCQkJCQkJMjU1LCAyMDUpOwotCQl9Ci0JCXJldHVybiBCR19DT0xPUjsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L1dvcmtQcm9kdWN0Tm9kZUVkaXRQYXJ0LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L1dvcmtQcm9kdWN0Tm9kZUVkaXRQYXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlNzgxNTcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9Xb3JrUHJvZHVjdE5vZGVFZGl0UGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZWRpdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5maWd1cmVzLkltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5OYW1lZE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Xb3JrUHJvZHVjdE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlN1cHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi50b29scy5EaXJlY3RFZGl0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRleHRDZWxsRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotLyoqCi0gKiBQcm92aWRlcyBzdXBwb3J0IGZvciB7QGxpbmsgV29ya1Byb2R1Y3REZXNjcmlwdG9yfS4KLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgV29ya1Byb2R1Y3ROb2RlRWRpdFBhcnQgZXh0ZW5kcyBOYW1lZE5vZGVFZGl0UGFydCB7Ci0KLQlwdWJsaWMgV29ya1Byb2R1Y3ROb2RlRWRpdFBhcnQoTmFtZWROb2RlIG1vZGVsKSB7Ci0JCXN1cGVyKG1vZGVsKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQuTmFtZWROb2RlRWRpdFBhcnQjZ2V0SW1hZ2UoKQotCSAqLwotCXByb3RlY3RlZCBJbWFnZSBnZXRJbWFnZSgpIHsKLQkJT2JqZWN0IG1vZGVsID0gZ2V0TW9kZWwoKTsKLQkJaWYgKG1vZGVsIGluc3RhbmNlb2YgV29ya1Byb2R1Y3ROb2RlKSB7Ci0JCQlXb3JrUHJvZHVjdE5vZGUgbm9kZSA9IChXb3JrUHJvZHVjdE5vZGUpIG1vZGVsOwotCQkJc3dpdGNoIChub2RlLmdldFR5cGUoKSkgewotCQkJY2FzZSBXb3JrUHJvZHVjdE5vZGUuQVJUSUZBQ1Q6Ci0JCQkJcmV0dXJuIEltYWdlcy5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl8xNjsKLQkJCWNhc2UgV29ya1Byb2R1Y3ROb2RlLkRFTElWRVJBQkxFOgotCQkJCXJldHVybiBJbWFnZXMuREVMSVZFUkFCTEU7Ci0JCQljYXNlIFdvcmtQcm9kdWN0Tm9kZS5PVVRDT01FOgotCQkJCXJldHVybiBJbWFnZXMuT1VUQ09NRTsKLQkJCX0KLQkJCXJldHVybiBJbWFnZXMuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfMTY7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0Lk5hbWVkTm9kZUVkaXRQYXJ0I2NyZWF0ZURpcmVjdEVkaXRQb2xpY3koKQotCSAqLwotCXByb3RlY3RlZCBEaXJlY3RFZGl0TWFuYWdlciBjcmVhdGVEaXJlY3RFZGl0TWFuYWdlcigpIHsKLQkJTGFiZWwgbCA9IChMYWJlbCkgZ2V0RmlndXJlKCk7Ci0JCXJldHVybiBuZXcgVmFsaWRhdGluZ0RpcmVjdEVkaXRNYW5hZ2VyKHRoaXMsIFRleHRDZWxsRWRpdG9yLmNsYXNzLAotCQkJCW5ldyBMYWJlbFRleHRDZWxsRWRpdG9yTG9jYXRvcihsKSwgbCkgewotCQkJcHJvdGVjdGVkIFN0cmluZyB2YWxpZGF0ZShTdHJpbmcgdHh0KSB7Ci0JCQkJT2JqZWN0IG9iaiA9IGdldEVkaXRQYXJ0KCkuZ2V0TW9kZWwoKTsKLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgV29ya1Byb2R1Y3ROb2RlKSB7Ci0JCQkJCU5vZGUgbm9kZSA9IChOb2RlKSBvYmo7Ci0JCQkJCU9iamVjdCBlID0gbm9kZS5nZXRPYmplY3QoKTsKLQkJCQkJU3VwcHJlc3Npb24gc3VwcHJlc3Npb24gPSBub2RlLmdldERpYWdyYW0oKS5nZXRTdXBwcmVzc2lvbigpOwotCQkJCQlyZXR1cm4gVG5nVXRpbC5jaGVja1dvcmtQcm9kdWN0RGVzY3JpcHRvclByZXNlbnRhdGlvbk5hbWUoCi0JCQkJCQkJZSwgdHh0LCBzdXBwcmVzc2lvbik7Ci0JCQkJfQotCQkJCXJldHVybiBzdXBlci52YWxpZGF0ZSh0eHQpOwotCQkJfQotCQl9OwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9wYWNrYWdlLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzExZmYzOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIGRpc3BsYXkgYW5kIGVkaXRpbmcgc3VwcG9ydCBmb3IgdGhlIGFjdGl2aXR5IGRpYWdyYW1zLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvcG9saWNpZXMvRGlhZ3JhbUxheW91dEVkaXRQb2xpY3kuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvcG9saWNpZXMvRGlhZ3JhbUxheW91dEVkaXRQb2xpY3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzM0OWRjOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L3BvbGljaWVzL0RpYWdyYW1MYXlvdXRFZGl0UG9saWN5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZWRpdC5wb2xpY2llczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkFic29sdXRlQmVuZHBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Qb3NpdGlvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuWFlMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmNvbW1hbmRzLkNoYW5nZUJvdW5kc0NvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuY29tbWFuZHMuQ2hhbmdlSGVpZ2h0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5jb21tYW5kcy5DcmVhdGVOb2RlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5jb21tYW5kcy5Nb3ZlQmVuZHBvaW50Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0LkFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQuRGlhZ3JhbUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQuTGlua0VkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQuUm9sZVRhc2tDb21wb3NpdGVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0LldvcmtQcm9kdWN0Q29tcG9zaXRlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuQWN0aXZpdHlEZXRhaWxEaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkRpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLnV0aWwuR3JhcGhpY2FsRGF0YUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21wb3VuZENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLlVuZXhlY3V0YWJsZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5Db25zdHJhaW5lZExheW91dEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5SZXNpemFibGVFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuWFlMYXlvdXRFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5yZXF1ZXN0cy5DaGFuZ2VCb3VuZHNSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5yZXF1ZXN0cy5DcmVhdGVSZXF1ZXN0OwotCi0vKioKLSAqIEFuIEVkaXRQb2xpY3kgZm9yIHVzZSB3aXRoIDxjb2RlPkZpZ3VyZXM8L2NvZGU+IGluIHtAbGluayBYWUxheW91dH0gb2YgZGlhZ3JhbS4gVGhlIGNvbnN0cmFpbnQgZm9yCi0gKiBYWUxheW91dCBpcyBhIHtAbGluayBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUmVjdGFuZ2xlfS4gSW1wbGVtZW50cyB0aGUgY2hhbmdlY29uc3RyYWludCwgZGVsZXRlLAotICogcmVzaXplIGNvbW1hbmRzIG9mIHtAbGluayBDb25zdHJhaW5lZExheW91dEVkaXRQb2xpY3l9Ci0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBEaWFncmFtTGF5b3V0RWRpdFBvbGljeSBleHRlbmRzIFhZTGF5b3V0RWRpdFBvbGljeSB7Ci0KLQlwcm90ZWN0ZWQgQ29tbWFuZCBjcmVhdGVBZGRDb21tYW5kKEVkaXRQYXJ0IGNoaWxkLCBPYmplY3QgY29uc3RyYWludCkgewotCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29tbWFuZCBjcmVhdGVDaGFuZ2VDb25zdHJhaW50Q29tbWFuZChFZGl0UGFydCBjaGlsZCwKLQkJCU9iamVjdCBjb25zdHJhaW50KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCBDb21tYW5kIGNyZWF0ZUNoYW5nZUNvbnN0cmFpbnRDb21tYW5kKAotCQkJQ2hhbmdlQm91bmRzUmVxdWVzdCByZXF1ZXN0LCBFZGl0UGFydCBjaGlsZCwgT2JqZWN0IGNvbnN0cmFpbnQpIHsKLQkJCi0JCS8vIHNwZWNpYWwgZm9yIEFERAotCQlFZGl0UGFydCBwYXJlbnQgPSBjaGlsZC5nZXRQYXJlbnQoKTsKLQkJaWYocGFyZW50IGluc3RhbmNlb2YgQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdFBhcnQpewotCQkJU3RyaW5nIGF1dG9sYXlvdXQgPSBHcmFwaGljYWxEYXRhSGVscGVyLmdldEF1dG9MYXlvdXRGbGFnKChBY3Rpdml0eURldGFpbERpYWdyYW0pKE5vZGUpcGFyZW50LmdldE1vZGVsKCkpOwotCQkJaWYoYXV0b2xheW91dCAhPSBudWxsKXsKLQkJCQlHcmFwaGljYWxEYXRhSGVscGVyLmNyZWF0ZVByb3BlcnR5KCgoTm9kZSlwYXJlbnQuZ2V0TW9kZWwoKSkuZ2V0R3JhcGhOb2RlKCksCi0JCQkJCUdyYXBoaWNhbERhdGFIZWxwZXIuUFJPUF9BVVRPX0xBWU9VVCwgCi0JCQkJCUdyYXBoaWNhbERhdGFIZWxwZXIuUFJPUF9BVVRPX0xBWU9VVF9WQUxVRV9GQUxTRSk7Ci0JCQl9Ci0JCX0KLQkJCi0JCU5vZGUgbm9kZSA9IChOb2RlKSBjaGlsZC5nZXRNb2RlbCgpOwotCQlpbnQgZGlyZWN0aW9ucyA9IHJlcXVlc3QuZ2V0UmVzaXplRGlyZWN0aW9uKCk7Ci0JCQotCQlpZiAoKGRpcmVjdGlvbnMgJiBQb3NpdGlvbkNvbnN0YW50cy5OT1JUSF9TT1VUSCkgCi0JCQkJPT0gUG9zaXRpb25Db25zdGFudHMuU09VVEgpewotCQkJUG9pbnQgbmV3TG9jYXRpb24gPSBub2RlLmdldExvY2F0aW9uKCkuZ2V0VHJhbnNsYXRlZCgKLQkJCQkJcmVxdWVzdC5nZXRNb3ZlRGVsdGEoKSk7Ci0JCQlpbnQgbmV3SGVpZ2h0ID0gcmVxdWVzdC5nZXRTaXplRGVsdGEoKS5oZWlnaHQ7Ci0JCQlpZiAobmV3SGVpZ2h0ICE9IDApIHsKLQkJCQluZXdIZWlnaHQgKz0gKChHcmFwaGljYWxFZGl0UGFydCkgY2hpbGQpLmdldEZpZ3VyZSgpLmdldEJvdW5kcygpLmhlaWdodDsKLQkJCQlpZiAobmV3SGVpZ2h0IDwgMTApCi0JCQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQkJfSBlbHNlCi0JCQkJbmV3SGVpZ2h0ID0gKChHcmFwaGljYWxFZGl0UGFydCkgY2hpbGQpLmdldEZpZ3VyZSgpLmdldEJvdW5kcygpLmhlaWdodDsKLQkJCXJldHVybiBuZXcgQ2hhbmdlSGVpZ2h0Q29tbWFuZChub2RlLCBuZXdMb2NhdGlvbiwgbmV3SGVpZ2h0KTsKLQkJfQotCQllbHNlewotCQkJLy8gT3RoZXIgZGlyZWN0aW9ucyBhcmUgRUFTVCBXRVNULiAKLQkJCVBvaW50IG5ld0xvY2F0aW9uID0gbm9kZS5nZXRMb2NhdGlvbigpLmdldFRyYW5zbGF0ZWQoCi0JCQkJCXJlcXVlc3QuZ2V0TW92ZURlbHRhKCkpOwotCQkJaW50IG5ld1dpZHRoID0gcmVxdWVzdC5nZXRTaXplRGVsdGEoKS53aWR0aDsKLQkJCWlmIChuZXdXaWR0aCAhPSAwKSB7Ci0JCQkJbmV3V2lkdGggKz0gKChHcmFwaGljYWxFZGl0UGFydCkgY2hpbGQpLmdldEZpZ3VyZSgpLmdldEJvdW5kcygpLndpZHRoOwotCQkJCWlmIChuZXdXaWR0aCA8IDEwKQotCQkJCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJCX0gZWxzZQotCQkJCW5ld1dpZHRoID0gKChHcmFwaGljYWxFZGl0UGFydCkgY2hpbGQpLmdldEZpZ3VyZSgpLmdldEJvdW5kcygpLndpZHRoOwotCQkJcmV0dXJuIG5ldyBDaGFuZ2VCb3VuZHNDb21tYW5kKG5vZGUsIG5ld0xvY2F0aW9uLCBuZXdXaWR0aCk7Ci0JCX0gCi0JfQotCi0JcHJvdGVjdGVkIEVkaXRQb2xpY3kgY3JlYXRlQ2hpbGRFZGl0UG9saWN5KEVkaXRQYXJ0IGNoaWxkKSB7Ci0JCVJlc2l6YWJsZUVkaXRQb2xpY3kgY2hpbGRQb2xpY3kgPSBuZXcgUmVzaXphYmxlRWRpdFBvbGljeSgpOwotCQlpZihjaGlsZCBpbnN0YW5jZW9mIFJvbGVUYXNrQ29tcG9zaXRlRWRpdFBhcnQgfHwKLQkJCQljaGlsZCBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0Q29tcG9zaXRlRWRpdFBhcnQpewotCQkJY2hpbGRQb2xpY3kuc2V0UmVzaXplRGlyZWN0aW9ucyhQb3NpdGlvbkNvbnN0YW50cy5OU0VXKTsKLQkJfWVsc2V7Ci0JCQljaGlsZFBvbGljeS5zZXRSZXNpemVEaXJlY3Rpb25zKFBvc2l0aW9uQ29uc3RhbnRzLkVBU1RfV0VTVCk7Ci0JCX0KLQkJcmV0dXJuIGNoaWxkUG9saWN5OwotCX0KLQotCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZUNvbW1hbmQoQ3JlYXRlUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCWlmIChyZXF1ZXN0LmdldE5ld09iamVjdCgpIGluc3RhbmNlb2YgTm9kZSkgewotCQkJUG9pbnQgbG9jID0gcmVxdWVzdC5nZXRMb2NhdGlvbigpOwotCQkJZ2V0SG9zdEZpZ3VyZSgpLnRyYW5zbGF0ZVRvUmVsYXRpdmUobG9jKTsKLQkJCXJldHVybiBuZXcgQ3JlYXRlTm9kZUNvbW1hbmQoKE5vZGUpIHJlcXVlc3QuZ2V0TmV3T2JqZWN0KCksCi0JCQkJCShEaWFncmFtKSBnZXRIb3N0KCkuZ2V0TW9kZWwoKSwgbG9jKTsKLQkJfQotCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXREZWxldGVEZXBlbmRhbnRDb21tYW5kKFJlcXVlc3QgcmVxdWVzdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRSZXNpemVDaGlsZHJlbkNvbW1hbmQoQ2hhbmdlQm91bmRzUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCUNvbXBvdW5kQ29tbWFuZCByZXNpemUgPSBuZXcgQ29tcG91bmRDb21tYW5kKCk7Ci0JCUNvbW1hbmQgYzsKLQkJR3JhcGhpY2FsRWRpdFBhcnQgY2hpbGQ7Ci0JCUxpc3QgY2hpbGRyZW4gPSByZXF1ZXN0LmdldEVkaXRQYXJ0cygpOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4uc2l6ZSgpOyBpKyspIHsKLQkJCWNoaWxkID0gKEdyYXBoaWNhbEVkaXRQYXJ0KSBjaGlsZHJlbi5nZXQoaSk7Ci0JCQljID0gY3JlYXRlQ2hhbmdlQ29uc3RyYWludENvbW1hbmQoCi0JCQkJCXJlcXVlc3QsCi0JCQkJCWNoaWxkLAotCQkJCQl0cmFuc2xhdGVUb01vZGVsQ29uc3RyYWludChnZXRDb25zdHJhaW50Rm9yKHJlcXVlc3QsIGNoaWxkKSkpOwotCQkJcmVzaXplLmFkZChjKTsKLQkJCWlmICghY2hpbGQuZ2V0U291cmNlQ29ubmVjdGlvbnMoKS5pc0VtcHR5KCkpIHsKLQkJCQlMaXN0IGxpc3QgPSBjaGlsZC5nZXRTb3VyY2VDb25uZWN0aW9ucygpOwotCQkJCWZvciAoSXRlcmF0b3IgaXRvciA9IGxpc3QuaXRlcmF0b3IoKTsgaXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJCU9iamVjdCBvYmogPSBpdG9yLm5leHQoKTsKLQkJCQkJaWYgKG9iaiBpbnN0YW5jZW9mIExpbmtFZGl0UGFydCkgewotCQkJCQkJRWRpdFBhcnQgcm9vdGVkaXQgPSBjaGlsZC5nZXRQYXJlbnQoKTsKLQkJCQkJCUxpc3Qgc2VsID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQkJaWYgKHJvb3RlZGl0IGluc3RhbmNlb2YgRGlhZ3JhbUVkaXRQYXJ0KSB7Ci0JCQkJCQkJc2VsID0gKChEaWFncmFtRWRpdFBhcnQpIHJvb3RlZGl0KS5nZXRWaWV3ZXIoKQotCQkJCQkJCQkJLmdldFNlbGVjdGVkRWRpdFBhcnRzKCk7Ci0JCQkJCQl9Ci0JCQkJCQlFZGl0UGFydCBwYXJ0ID0gKChMaW5rRWRpdFBhcnQpIG9iaikuZ2V0VGFyZ2V0KCk7Ci0JCQkJCQlpZiAoc2VsLmNvbnRhaW5zKHBhcnQpKSB7Ci0JCQkJCQkJTGluayBsaW5rID0gKExpbmspICgoTGlua0VkaXRQYXJ0KSBvYmopLmdldE1vZGVsKCk7Ci0JCQkJCQkJKChEaWFncmFtRWRpdFBhcnQpIHJvb3RlZGl0KS5nZXRWaWV3ZXIoKQotCQkJCQkJCQkJLmFwcGVuZFNlbGVjdGlvbigoTGlua0VkaXRQYXJ0KSBvYmopOwotCQkJCQkJCUxpc3QgYmxpc3QgPSBsaW5rLmdldEJlbmRwb2ludHMoKTsKLQkJCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IGJsaXN0LnNpemUoKTsgaisrKSB7Ci0JCQkJCQkJCUFic29sdXRlQmVuZHBvaW50IGFicG9pbnQgPSAoQWJzb2x1dGVCZW5kcG9pbnQpIGJsaXN0Ci0JCQkJCQkJCQkJLmdldChqKTsKLQkJCQkJCQkJUG9pbnQgZGVsdGFQb2ludCA9IHJlcXVlc3QuZ2V0TW92ZURlbHRhKCk7Ci0JCQkJCQkJCSgoTGlua0VkaXRQYXJ0KSBvYmopLmdldEZpZ3VyZSgpCi0JCQkJCQkJCQkJLnRyYW5zbGF0ZVRvQWJzb2x1dGUoZGVsdGFQb2ludCk7Ci0JCQkJCQkJCVBvaW50IHAgPSBhYnBvaW50LmdldFRyYW5zbGF0ZWQocmVxdWVzdAotCQkJCQkJCQkJCS5nZXRNb3ZlRGVsdGEoKSk7Ci0JCQkJCQkJCUNvbW1hbmQgYmVuZGNvbW1hbmQgPSBuZXcgTW92ZUJlbmRwb2ludENvbW1hbmQoCi0JCQkJCQkJCQkJbGluaywgcCwgaik7Ci0JCQkJCQkJCXJlc2l6ZS5hZGQoYmVuZGNvbW1hbmQpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzaXplOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvcG9saWNpZXMvTGFiZWxTZWxlY3Rpb25FZGl0UG9saWN5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L3BvbGljaWVzL0xhYmVsU2VsZWN0aW9uRWRpdFBvbGljeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNjY5M2M1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvcG9saWNpZXMvTGFiZWxTZWxlY3Rpb25FZGl0UG9saWN5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0LnBvbGljaWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZmlndXJlcy5TZWxlY3RhYmxlTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuTm9uUmVzaXphYmxlRWRpdFBvbGljeTsKLQotLyoqCi0gKiBIYW5kbGVzIHNlbGVjdGlvbiBvZiBhY3Rpdml0ZXMuIFByaW1hcnkgc2VsZWN0aW9uIGlzIGRlbm90ZWQgYnkgaGlnaGxpZ2h0IGFuZAotICogYSBmb2N1cyByZWN0YW5nbGUuIE5vcm1hbCBzZWxlY3Rpb24gaXMgZGVub3RlZCBieSBoaWdobGlnaHQgb25seS4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIExhYmVsU2VsZWN0aW9uRWRpdFBvbGljeSBleHRlbmRzIE5vblJlc2l6YWJsZUVkaXRQb2xpY3kgewotCi0JcHJpdmF0ZSBTZWxlY3RhYmxlTGFiZWwgZ2V0TGFiZWwoKSB7Ci0JCUdyYXBoaWNhbEVkaXRQYXJ0IHBhcnQgPSAoR3JhcGhpY2FsRWRpdFBhcnQpIGdldEhvc3QoKTsKLQkJcmV0dXJuICgoU2VsZWN0YWJsZUxhYmVsKSBwYXJ0LmdldEZpZ3VyZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuTm9uUmVzaXphYmxlRWRpdFBvbGljeSNoaWRlRm9jdXMoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGhpZGVGb2N1cygpIHsKLQkJZ2V0TGFiZWwoKS5zZXRGb2N1cyhmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLlNlbGVjdGlvbkhhbmRsZXNFZGl0UG9saWN5I2hpZGVTZWxlY3Rpb24oKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGhpZGVTZWxlY3Rpb24oKSB7Ci0JCWdldExhYmVsKCkuc2V0U2VsZWN0ZWQoZmFsc2UpOwotCQlnZXRMYWJlbCgpLnNldEZvY3VzKGZhbHNlKTsKLQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5Ob25SZXNpemFibGVFZGl0UG9saWN5I3Nob3dGb2N1cygpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2hvd0ZvY3VzKCkgewotCQlnZXRMYWJlbCgpLnNldEZvY3VzKHRydWUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5TZWxlY3Rpb25IYW5kbGVzRWRpdFBvbGljeSNzaG93U2VsZWN0aW9uKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzaG93UHJpbWFyeVNlbGVjdGlvbigpIHsKLQkJZ2V0TGFiZWwoKS5zZXRTZWxlY3RlZCh0cnVlKTsKLQkJZ2V0TGFiZWwoKS5zZXRGb2N1cyh0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuU2VsZWN0aW9uSGFuZGxlc0VkaXRQb2xpY3kjc2hvd1NlbGVjdGlvbigpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2hvd1NlbGVjdGlvbigpIHsKLQkJZ2V0TGFiZWwoKS5zZXRTZWxlY3RlZCh0cnVlKTsKLQkJZ2V0TGFiZWwoKS5zZXRGb2N1cyhmYWxzZSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L3BvbGljaWVzL0xpbmtCZW5kcG9pbnRFZGl0UG9saWN5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L3BvbGljaWVzL0xpbmtCZW5kcG9pbnRFZGl0UG9saWN5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViZGJmODUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9wb2xpY2llcy9MaW5rQmVuZHBvaW50RWRpdFBvbGljeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZWRpdC5wb2xpY2llczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5jb21tYW5kcy5DcmVhdGVCZW5kcG9pbnRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmNvbW1hbmRzLkRlbGV0ZUJlbmRwb2ludENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuY29tbWFuZHMuTW92ZUJlbmRwb2ludENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLkJlbmRwb2ludEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLkJlbmRwb2ludFJlcXVlc3Q7Ci0KLS8qKgotICogQSBFZGl0UG9saWN5IHRvIGhhbmRsZSB0aGUgY3JlYXRlLCBtb3ZlIGFuZCBkZWxldGUgYmVuZHBvaW50cyBhY3Rpdml0aWVzIG9mIExpbmsuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBMaW5rQmVuZHBvaW50RWRpdFBvbGljeSBleHRlbmRzIEJlbmRwb2ludEVkaXRQb2xpY3kgewotCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlQmVuZHBvaW50Q29tbWFuZChCZW5kcG9pbnRSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJUG9pbnQgbG9jID0gcmVxdWVzdC5nZXRMb2NhdGlvbigpOwotCQlnZXRDb25uZWN0aW9uKCkudHJhbnNsYXRlVG9SZWxhdGl2ZShsb2MpOwotCQlyZXR1cm4gbmV3IENyZWF0ZUJlbmRwb2ludENvbW1hbmQoCi0JCQkJKExpbmspIHJlcXVlc3QuZ2V0U291cmNlKCkuZ2V0TW9kZWwoKSwgbG9jLCByZXF1ZXN0LmdldEluZGV4KCkpOwotCX0KLQotCXByb3RlY3RlZCBDb21tYW5kIGdldERlbGV0ZUJlbmRwb2ludENvbW1hbmQoQmVuZHBvaW50UmVxdWVzdCByZXF1ZXN0KSB7Ci0JCXJldHVybiBuZXcgRGVsZXRlQmVuZHBvaW50Q29tbWFuZCgoTGluaykgZ2V0SG9zdCgpLmdldE1vZGVsKCksIHJlcXVlc3QKLQkJCQkuZ2V0SW5kZXgoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0TW92ZUJlbmRwb2ludENvbW1hbmQoQmVuZHBvaW50UmVxdWVzdCByZXF1ZXN0KSB7Ci0JCVBvaW50IGxvYyA9IHJlcXVlc3QuZ2V0TG9jYXRpb24oKTsKLQkJZ2V0Q29ubmVjdGlvbigpLnRyYW5zbGF0ZVRvUmVsYXRpdmUobG9jKTsKLQkJcmV0dXJuIG5ldyBNb3ZlQmVuZHBvaW50Q29tbWFuZCgoTGluaykgcmVxdWVzdC5nZXRTb3VyY2UoKS5nZXRNb2RlbCgpLAotCQkJCWxvYywgcmVxdWVzdC5nZXRJbmRleCgpKTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L3BvbGljaWVzL0xpbmtFbmRwb2ludEVkaXRQb2xpY3kuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvcG9saWNpZXMvTGlua0VuZHBvaW50RWRpdFBvbGljeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOTA1YWQ4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvcG9saWNpZXMvTGlua0VuZHBvaW50RWRpdFBvbGljeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZWRpdC5wb2xpY2llczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Qb2x5bGluZUNvbm5lY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5Db25uZWN0aW9uRW5kcG9pbnRFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnREYXRhOwotCi0vKioKLSAqIEEgRWRpdFBvbGljeSB0byBoYW5kbGUgdGhlIHNlbGVjdGlvbiBoYW5kbGVzIGZvciBjb25uZWN0aW9uLiAKLSAqICAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBMaW5rRW5kcG9pbnRFZGl0UG9saWN5IGV4dGVuZHMgQ29ubmVjdGlvbkVuZHBvaW50RWRpdFBvbGljeSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBGb250IEJPTERfRk9OVDsKLQotCXByb3RlY3RlZCB2b2lkIGFkZFNlbGVjdGlvbkhhbmRsZXMoKSB7Ci0JCXN1cGVyLmFkZFNlbGVjdGlvbkhhbmRsZXMoKTsKLQkJZ2V0Q29ubmVjdGlvbkZpZ3VyZSgpLnNldExpbmVXaWR0aCgyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgUG9seWxpbmVDb25uZWN0aW9uIGdldENvbm5lY3Rpb25GaWd1cmUoKSB7Ci0JCXJldHVybiAoUG9seWxpbmVDb25uZWN0aW9uKSBnZXRIb3N0RmlndXJlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaGlkZVNlbGVjdGlvbigpIHsKLQkJc3VwZXIuaGlkZVNlbGVjdGlvbigpOwotCQlnZXRIb3N0RmlndXJlKCkuc2V0Rm9udChudWxsKTsKLQkJZ2V0SG9zdEZpZ3VyZSgpLmludmFsaWRhdGVUcmVlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlU2VsZWN0aW9uSGFuZGxlcygpIHsKLQkJc3VwZXIucmVtb3ZlU2VsZWN0aW9uSGFuZGxlcygpOwotCQlnZXRDb25uZWN0aW9uRmlndXJlKCkuc2V0TGluZVdpZHRoKDApOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNob3dTZWxlY3Rpb24oKSB7Ci0JCXN1cGVyLnNob3dTZWxlY3Rpb24oKTsKLQkJaWYgKEJPTERfRk9OVCA9PSBudWxsKSB7Ci0JCQlGb250RGF0YVtdIGRhdGEgPSBnZXRDb25uZWN0aW9uRmlndXJlKCkuZ2V0Rm9udCgpLmdldEZvbnREYXRhKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGRhdGEubGVuZ3RoOyBpKyspCi0JCQkJaWYgKChkYXRhW2ldLmdldFN0eWxlKCkgJiBTV1QuQk9MRCkgPT0gMCkKLQkJCQkJZGF0YVtpXS5zZXRTdHlsZShkYXRhW2ldLmdldFN0eWxlKCkgfCBTV1QuQk9MRCk7Ci0JCQlCT0xEX0ZPTlQgPSBuZXcgRm9udChudWxsLCBkYXRhKTsKLQkJfQotCQlnZXRIb3N0RmlndXJlKCkuc2V0Rm9udChCT0xEX0ZPTlQpOwotCQlnZXRIb3N0RmlndXJlKCkuaW52YWxpZGF0ZVRyZWUoKTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L3BvbGljaWVzL05vZGVDb250YWluZXJFZGl0UG9saWN5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L3BvbGljaWVzL05vZGVDb250YWluZXJFZGl0UG9saWN5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlZjA1ZjUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9wb2xpY2llcy9Ob2RlQ29udGFpbmVyRWRpdFBvbGljeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZWRpdC5wb2xpY2llczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQuTm9kZUNvbnRhaW5lckVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuQ29udGFpbmVyRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuQ3JlYXRlUmVxdWVzdDsKLQotLyoqCi0gKiBBIEVkaXRQb2xpY3kgZm9yIHtAbGluayBOb2RlQ29udGFpbmVyRWRpdFBhcnR9IGZvciBkaXNhYmxpbmcgZGlyZWN0IGNoaWxkIGNyZWF0aW9uLgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIE5vZGVDb250YWluZXJFZGl0UG9saWN5IGV4dGVuZHMgQ29udGFpbmVyRWRpdFBvbGljeSB7Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuQ29udGFpbmVyRWRpdFBvbGljeSNnZXRDcmVhdGVDb21tYW5kKENyZWF0ZVJlcXVlc3QpCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlQ29tbWFuZChDcmVhdGVSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L3BvbGljaWVzL05vZGVDb250YWluZXJGbG93TGF5b3V0RWRpdFBvbGljeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9wb2xpY2llcy9Ob2RlQ29udGFpbmVyRmxvd0xheW91dEVkaXRQb2xpY3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmRmNDgxZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L3BvbGljaWVzL05vZGVDb250YWluZXJGbG93TGF5b3V0RWRpdFBvbGljeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZWRpdC5wb2xpY2llczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQuTm9kZUNvbnRhaW5lckVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLkZsb3dMYXlvdXRFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5yZXF1ZXN0cy5DcmVhdGVSZXF1ZXN0OwotCi0vKioKLSAqIEEgRWRpdFBvbGljeSBmb3Ige0BsaW5rIE5vZGVDb250YWluZXJFZGl0UGFydH0gdG8gZGlzYWJsZSB0aGUgYWxsIGVkaXRpbmcgZmVhdHVyZXMuCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTm9kZUNvbnRhaW5lckZsb3dMYXlvdXRFZGl0UG9saWN5IGV4dGVuZHMgRmxvd0xheW91dEVkaXRQb2xpY3kgewotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLk9yZGVyZWRMYXlvdXRFZGl0UG9saWN5I2NyZWF0ZUFkZENvbW1hbmQoRWRpdFBhcnQsCi0JICogICAgICBFZGl0UGFydCkKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBjcmVhdGVBZGRDb21tYW5kKEVkaXRQYXJ0IGNoaWxkLCBFZGl0UGFydCBhZnRlcikgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuT3JkZXJlZExheW91dEVkaXRQb2xpY3kjY3JlYXRlTW92ZUNoaWxkQ29tbWFuZChFZGl0UGFydCwKLQkgKiAgICAgIEVkaXRQYXJ0KQotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGNyZWF0ZU1vdmVDaGlsZENvbW1hbmQoRWRpdFBhcnQgY2hpbGQsIEVkaXRQYXJ0IGFmdGVyKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5MYXlvdXRFZGl0UG9saWN5I2dldENyZWF0ZUNvbW1hbmQoQ3JlYXRlUmVxdWVzdCkKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVDb21tYW5kKENyZWF0ZVJlcXVlc3QgcmVxdWVzdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuTGF5b3V0RWRpdFBvbGljeSNnZXREZWxldGVEZXBlbmRhbnRDb21tYW5kKFJlcXVlc3QpCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0RGVsZXRlRGVwZW5kYW50Q29tbWFuZChSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L3BvbGljaWVzL1JvbGVUYXNrRmxvd0xheW91dEVkaXRQb2xpY3kuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvcG9saWNpZXMvUm9sZVRhc2tGbG93TGF5b3V0RWRpdFBvbGljeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZGZlODdlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvcG9saWNpZXMvUm9sZVRhc2tGbG93TGF5b3V0RWRpdFBvbGljeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoqCi0gKiAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0LnBvbGljaWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkZsb3dMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuRmxvd0xheW91dEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLkNyZWF0ZVJlcXVlc3Q7Ci0KLS8qKgotICogRWRpdFBvbGljeSB0byBkaXNhYmxlIHRoZSBlZGl0aW5nIGZlYXR1cmUgaW4gYSB7QGxpbmsgRmxvd0xheW91dH0KLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICoKLSAqLwotcHVibGljIGNsYXNzIFJvbGVUYXNrRmxvd0xheW91dEVkaXRQb2xpY3kgZXh0ZW5kcyBGbG93TGF5b3V0RWRpdFBvbGljeSB7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgUm9sZVRhc2tGbG93TGF5b3V0RWRpdFBvbGljeSgpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjb25zdHJ1Y3RvciBzdHViCi0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5PcmRlcmVkTGF5b3V0RWRpdFBvbGljeSNjcmVhdGVBZGRDb21tYW5kKG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydCwgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0KQotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGNyZWF0ZUFkZENvbW1hbmQoRWRpdFBhcnQgY2hpbGQsIEVkaXRQYXJ0IGFmdGVyKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5PcmRlcmVkTGF5b3V0RWRpdFBvbGljeSNjcmVhdGVNb3ZlQ2hpbGRDb21tYW5kKG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydCwgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0KQotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGNyZWF0ZU1vdmVDaGlsZENvbW1hbmQoRWRpdFBhcnQgY2hpbGQsIEVkaXRQYXJ0IGFmdGVyKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5MYXlvdXRFZGl0UG9saWN5I2dldENyZWF0ZUNvbW1hbmQob3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLkNyZWF0ZVJlcXVlc3QpCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlQ29tbWFuZChDcmVhdGVSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvcG9saWNpZXMvcGFja2FnZS5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9wb2xpY2llcy9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzZDg1NDkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9wb2xpY2llcy9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyBncmFwaGljYWwgZWRpdCBwb2xpY2llcyBmb3IgdGhlIGFjdGl2aXR5IGRpYWdyYW1zLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2ZpZ3VyZXMvQWN0aXZpdHlGaWd1cmUuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2ZpZ3VyZXMvQWN0aXZpdHlGaWd1cmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTJhNGY3Yi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9maWd1cmVzL0FjdGl2aXR5RmlndXJlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5maWd1cmVzOwotCi0vKioKLSAqIEBhdXRob3IgSmFtZXMgVGhhcmlvCi0gKiBAc2luY2UgIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZpdHlGaWd1cmUgZXh0ZW5kcyBUZXh0RmlndXJlIHsKLQotCXB1YmxpYyBBY3Rpdml0eUZpZ3VyZSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9maWd1cmVzL0NlbnRyZWRMYWJlbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZmlndXJlcy9DZW50cmVkTGFiZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTcwOWY4MC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9maWd1cmVzL0NlbnRyZWRMYWJlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZmlndXJlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Db2xvckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuR3JhcGhpY3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotCi0vKioKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQHNpbmNlIDEuMAotICogQGRlcHJlY2F0ZWQKLSAqLwotcHVibGljIGNsYXNzIENlbnRyZWRMYWJlbCBleHRlbmRzIExhYmVsIHsKLQotCXB1YmxpYyBDZW50cmVkTGFiZWwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIENlbnRyZWRMYWJlbChTdHJpbmcgcykgewotCQlzdXBlcihzKTsKLQl9Ci0KLQlwdWJsaWMgQ2VudHJlZExhYmVsKEltYWdlIGkpIHsKLQkJc3VwZXIoaSk7Ci0JfQotCi0JcHVibGljIENlbnRyZWRMYWJlbChTdHJpbmcgcywgSW1hZ2UgaSkgewotCQlzdXBlcihzLCBpKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmRyYXcyZC5GaWd1cmUjcGFpbnRGaWd1cmUoR3JhcGhpY3MpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcGFpbnRGaWd1cmUoR3JhcGhpY3MgZ3JhcGhpY3MpIHsKLQkJaWYgKGlzT3BhcXVlKCkpCi0JCQlzdXBlci5wYWludEZpZ3VyZShncmFwaGljcyk7Ci0JCVJlY3RhbmdsZSBib3VuZHMgPSBnZXRCb3VuZHMoKTsKLQkJZ3JhcGhpY3Muc2V0Rm9yZWdyb3VuZENvbG9yKENvbG9yQ29uc3RhbnRzLnllbGxvdyk7Ci0JCWdyYXBoaWNzLnRyYW5zbGF0ZShib3VuZHMueCwgYm91bmRzLnkpOwotCQlpZiAoIWlzRW5hYmxlZCgpKSB7Ci0JCQlncmFwaGljcy50cmFuc2xhdGUoMSwgMSk7Ci0JCQlncmFwaGljcy5zZXRCYWNrZ3JvdW5kQ29sb3IoQ29sb3JDb25zdGFudHMueWVsbG93KTsKLQkJCWdyYXBoaWNzLnNldEZvcmVncm91bmRDb2xvcihDb2xvckNvbnN0YW50cy5idXR0b25MaWdodGVzdCk7Ci0JCQlncmFwaGljcy5kcmF3VGV4dChnZXRTdWJTdHJpbmdUZXh0KCksIGdldFRleHRMb2NhdGlvbigpKTsKLQkJCWdyYXBoaWNzLnRyYW5zbGF0ZSgtMSwgLTEpOwotCQkJZ3JhcGhpY3Muc2V0Rm9yZWdyb3VuZENvbG9yKENvbG9yQ29uc3RhbnRzLmJ1dHRvbkRhcmtlcik7Ci0JCX0KLQkJZ3JhcGhpY3MuZHJhd1RleHQoZ2V0U3ViU3RyaW5nVGV4dCgpLCBnZXRUZXh0TG9jYXRpb24oKSk7Ci0JCWdyYXBoaWNzLnNldEJhY2tncm91bmRDb2xvcihDb2xvckNvbnN0YW50cy55ZWxsb3cpOwotCQlncmFwaGljcy50cmFuc2xhdGUoLWJvdW5kcy54LCAtYm91bmRzLnkpOwotCQlncmFwaGljcy5zZXRCYWNrZ3JvdW5kQ29sb3IoQ29sb3JDb25zdGFudHMuYmx1ZSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9maWd1cmVzL0NvbG9ycy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZmlndXJlcy9Db2xvcnMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzM3ZTAyZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9maWd1cmVzL0NvbG9ycy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZmlndXJlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Db2xvckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7Ci0KLS8qKgotICogVGhlIGNvbG9yIGNvbnN0YW50cyByZWZlcmVuY2VkIGJ5IHRoZSBkaWFncmFtIGVkaXRvcnMuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBDb2xvcnMgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDb2xvciBJTkhFUklURURfRUxFTUVOVF9MQUJFTCA9IENvbG9yQ29uc3RhbnRzLmRhcmtHcmVlbjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29sb3IgU1VQUkVTU0VEX0VMRU1FTlRfTEFCRUwgPSBDb2xvckNvbnN0YW50cy5ncmF5OwotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9maWd1cmVzL0NvbXBvc2l0ZUZpZ3VyZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZmlndXJlcy9Db21wb3NpdGVGaWd1cmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODEyZmNjYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9maWd1cmVzL0NvbXBvc2l0ZUZpZ3VyZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZmlndXJlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5GaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkZsb3dMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlRvb2xiYXJMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LkRpbWVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0LlJhaXNlZE1hcmdpbkJvcmRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICogQGRlcHJlY2F0ZWQKLSAqLwotcHVibGljIGNsYXNzIENvbXBvc2l0ZUZpZ3VyZSBleHRlbmRzIEZpZ3VyZSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBDb2xvciBCR19DT0xPUiA9IG5ldyBDb2xvcihEaXNwbGF5LmdldEN1cnJlbnQoKSwgMjU1LAotCQkJMjU1LCAyMDUpOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfTUFYX1dJRFRIID0gNTA7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1BBQ0lORyA9IDEwOwotCi0JcHJpdmF0ZSBpbnQgbWF4V2lkdGggPSBERUZBVUxUX01BWF9XSURUSDsKLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBDb21wb3NpdGVGaWd1cmUoKSB7Ci0JCVRvb2xiYXJMYXlvdXQgbGF5b3V0ID0gbmV3IFRvb2xiYXJMYXlvdXQoKTsKLQkJbGF5b3V0LnNldE1pbm9yQWxpZ25tZW50KEZsb3dMYXlvdXQuQUxJR05fQ0VOVEVSKTsKLQkJbGF5b3V0LnNldFN0cmV0Y2hNaW5vckF4aXMoZmFsc2UpOwotCQlsYXlvdXQuc2V0U3BhY2luZyhTUEFDSU5HKTsKLQkJbGF5b3V0LnNldE9ic2VydmVWaXNpYmlsaXR5KHRydWUpOwotCQlzZXRMYXlvdXRNYW5hZ2VyKGxheW91dCk7Ci0JCXNldEJvcmRlcihuZXcgUmFpc2VkTWFyZ2luQm9yZGVyKCkpOwotCQlzZXRCYWNrZ3JvdW5kQ29sb3IoQkdfQ09MT1IpOwotCQlzZXRPcGFxdWUodHJ1ZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TWF4V2lkdGgoaW50IHcpIHsKLQkJbWF4V2lkdGggPSB3OwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZHJhdzJkLkZpZ3VyZSNnZXRQcmVmZXJyZWRTaXplKGludCwgaW50KQotCSAqLwotCXB1YmxpYyBEaW1lbnNpb24gZ2V0UHJlZmVycmVkU2l6ZShpbnQgd0hpbnQsIGludCBoSGludCkgewotCQlpZiAod0hpbnQgPiBtYXhXaWR0aCkgewotCQkJd0hpbnQgPSBtYXhXaWR0aDsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0UHJlZmVycmVkU2l6ZSh3SGludCwgaEhpbnQpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZmlndXJlcy9EaWFtb25kLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9maWd1cmVzL0RpYW1vbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDZmZTRmZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9maWd1cmVzL0RpYW1vbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmZpZ3VyZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuR3JhcGhpY3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlNoYXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludExpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlJlY3RhbmdsZTsKLQotLyoqCi0gKiBBIGZpZ3VyZSBmb3IgZGlhbW9uZCBzaGFwZS4gIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIERpYW1vbmQgZXh0ZW5kcyBTaGFwZSB7Ci0KLQlwcml2YXRlIFBvaW50TGlzdCBkaWFtb25kID0gbmV3IFBvaW50TGlzdCg0KTsKLQotCS8qKgotCSAqIEBzZWUgU2hhcGUjZmlsbFNoYXBlKEdyYXBoaWNzKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZpbGxTaGFwZShHcmFwaGljcyBnKSB7Ci0JCWcuZmlsbFBvbHlnb24oZGlhbW9uZCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBTaGFwZSNvdXRsaW5lU2hhcGUoR3JhcGhpY3MpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgb3V0bGluZVNoYXBlKEdyYXBoaWNzIGcpIHsKLQkJZy5kcmF3UG9seWdvbihkaWFtb25kKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmRyYXcyZC5GaWd1cmUjdmFsaWRhdGUoKQotCSAqLwotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKCkgewotCQlSZWN0YW5nbGUgciA9IGdldEJvdW5kcygpLmdldENvcHkoKTsKLQkJci5jcm9wKGdldEluc2V0cygpKTsKLQkJci5yZXNpemUoLTEsIC0xKTsKLQkJZGlhbW9uZC5yZW1vdmVBbGxQb2ludHMoKTsKLQkJZGlhbW9uZC5hZGRQb2ludChyLmdldFRvcCgpKTsKLQkJZGlhbW9uZC5hZGRQb2ludChyLmdldFJpZ2h0KCkpOwotCQlkaWFtb25kLmFkZFBvaW50KHIuZ2V0Qm90dG9tKCkpOwotCQlkaWFtb25kLmFkZFBvaW50KHIuZ2V0TGVmdCgpKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmRyYXcyZC5Qb2x5bGluZSNwcmltVHJhbnNsYXRlKGludCwgaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHByaW1UcmFuc2xhdGUoaW50IHgsIGludCB5KSB7Ci0JCXN1cGVyLnByaW1UcmFuc2xhdGUoeCwgeSk7Ci0JCWRpYW1vbmQudHJhbnNsYXRlKHgsIHkpOwotCX0KLQotCXB1YmxpYyBQb2ludExpc3QgZ2V0UG9pbnRzKCkgewotCQlyZXR1cm4gZGlhbW9uZDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2ZpZ3VyZXMvRW5kTm9kZUZpZ3VyZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZmlndXJlcy9FbmROb2RlRmlndXJlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjMDFhMDUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZmlndXJlcy9FbmROb2RlRmlndXJlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5maWd1cmVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkVsbGlwc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkdyYXBoaWNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuVHlwZWROb2RlOwotCi0vKioKLSAqIEZpZ3VyZSBmb3Ige0BsaW5rIFR5cGVkTm9kZX0gZW5kLgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEVuZE5vZGVGaWd1cmUgZXh0ZW5kcyBFbGxpcHNlIHsKLQotCS8qKgotCSAqIEZpbGxzIHRoZSBlbGxpcHNlLgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZHJhdzJkLlNoYXBlI2ZpbGxTaGFwZShvcmcuZWNsaXBzZS5kcmF3MmQuR3JhcGhpY3MpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZmlsbFNoYXBlKEdyYXBoaWNzIGdyYXBoaWNzKSB7Ci0JCVJlY3RhbmdsZSByID0gZ2V0Qm91bmRzKCkuZ2V0Q29weSgpOwotCQlyLnNocmluayhyLndpZHRoIC8gOCwgci5oZWlnaHQgLyA4KTsKLQkJZ3JhcGhpY3MuZmlsbE92YWwocik7Ci0JfQotCi0JLyoqCi0JICogT3V0bGluZXMgdGhlIGVsbGlwc2UuCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5kcmF3MmQuU2hhcGUjb3V0bGluZVNoYXBlKG9yZy5lY2xpcHNlLmRyYXcyZC5HcmFwaGljcykKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBvdXRsaW5lU2hhcGUoR3JhcGhpY3MgZ3JhcGhpY3MpIHsKLQkJc3VwZXIub3V0bGluZVNoYXBlKGdyYXBoaWNzKTsKLQotCQlSZWN0YW5nbGUgciA9IFJlY3RhbmdsZS5TSU5HTEVUT047Ci0JCXIuc2V0Qm91bmRzKGdldEJvdW5kcygpKTsKLQkJci5zaHJpbmsoZ2V0Qm91bmRzKCkud2lkdGggLyA4LCBnZXRCb3VuZHMoKS5oZWlnaHQgLyA4KTsKLQkJci53aWR0aC0tOwotCQlyLmhlaWdodC0tOwotCQlyLnNocmluaygobGluZVdpZHRoIC0gMSkgLyAyLCAobGluZVdpZHRoIC0gMSkgLyAyKTsKLQkJZ3JhcGhpY3MuZHJhd092YWwocik7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9maWd1cmVzL0ZyZWVUZXh0RmlndXJlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9maWd1cmVzL0ZyZWVUZXh0RmlndXJlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2ZDhlNTIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZmlndXJlcy9GcmVlVGV4dEZpZ3VyZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZmlndXJlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5GaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlBvc2l0aW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5SZWxhdGl2ZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlN0YWNrTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC50ZXh0LkZsb3dQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC50ZXh0LlBhcmFncmFwaFRleHRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLnRleHQuVGV4dEZsb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYudXRpbC5UZW1wbGF0ZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnQ7Ci0vKioKLSAqIEZpZ3VyZSB0byBzdXBwb3J0IGZyZWUgdGV4dCBpbiB0aGUgZGlhZ3JhbSwgd2l0aG91dCBhbiBpbWFnZSBhdHRhY2hlZCB0byBpdC4KLSAqIEZyZWVUZXh0RmlndXJlIHdyYXBwZXIgb3ZlciB7QGxpbmsgRmxvd1BhZ2V9IGFuZCB7QGxpbmsgVGV4dEZsb3d9LiAKLSAqIAotICogQGF1dGhvciBTaGFzaGlkaGFyIGthbm5vb3JpCi0gKgotICovCi1wdWJsaWMgY2xhc3MgRnJlZVRleHRGaWd1cmUgZXh0ZW5kcyBGaWd1cmUgewotCi0JcHJpdmF0ZSBGbG93UGFnZSB0ZXh0Rmxvd1BhZ2U7Ci0KLQlwcml2YXRlIFRleHRGbG93IHRleHRGbG93OwotCi0JcHVibGljIEZyZWVUZXh0RmlndXJlKCkgewotCQl0ZXh0Rmxvd1BhZ2UgPSBuZXcgRmxvd1BhZ2UoKTsKLQkJdGV4dEZsb3dQYWdlLnNldEhvcml6b250YWxBbGlnbWVudChQb3NpdGlvbkNvbnN0YW50cy5DRU5URVIpOwotCQlzZXRMYXlvdXRNYW5hZ2VyKG5ldyBTdGFja0xheW91dCgpKTsKLQkJYWRkKHRleHRGbG93UGFnZSwgbmV3IFJlbGF0aXZlTG9jYXRvcih0ZXh0Rmxvd1BhZ2UsCi0JCQkJUG9zaXRpb25Db25zdGFudHMuQUxXQVlTX0xFRlQpKTsKLQl9Ci0JcHVibGljIFN0cmluZyBnZXRUZXh0KCkgewotCQlyZXR1cm4gdGV4dEZsb3cuZ2V0VGV4dCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFRleHQoU3RyaW5nIG5ld1RleHQpIHsKLQkJdGV4dEZsb3dQYWdlLnJlbW92ZUFsbCgpOwotCQl0ZXh0RmxvdyA9IG5ldyBUZXh0RmxvdygpOwotCQl0ZXh0Rmxvdy5zZXRGb250KFRlbXBsYXRlQ29uc3RhbnRzLkRFRkFVTFRfRk9OVCk7Ci0JCXRleHRGbG93LnNldExheW91dE1hbmFnZXIobmV3IFBhcmFncmFwaFRleHRMYXlvdXQodGV4dEZsb3csCi0JCQkJUGFyYWdyYXBoVGV4dExheW91dC5XT1JEX1dSQVBfVFJVTkNBVEUpKTsKLQkJdGV4dEZsb3cuc2V0VGV4dChuZXdUZXh0KTsKLQkJdGV4dEZsb3dQYWdlLmFkZCh0ZXh0Rmxvdyk7Ci0JfQotCi0JcHVibGljIEZsb3dQYWdlIGdldFRleHRGbG93UGFnZSgpIHsKLQkJcmV0dXJuIHRleHRGbG93UGFnZTsKLQl9Ci0JcHVibGljIHZvaWQgc2V0Rm9udChGb250IGYpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlzdXBlci5zZXRGb250KGYpOwotCQl0ZXh0Rmxvdy5zZXRGb250KGYpOwotCX0KLQlwdWJsaWMgdm9pZCBzZXRGb3JlZ3JvdW5kQ29sb3IoQ29sb3IgZmcpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlzdXBlci5zZXRGb3JlZ3JvdW5kQ29sb3IoZmcpOwotCQl0ZXh0Rmxvdy5zZXRGb3JlZ3JvdW5kQ29sb3IoZmcpOwotCX0KLQotCXB1YmxpYyBUZXh0RmxvdyBnZXRUZXh0RmxvdygpIHsKLQkJcmV0dXJuIHRleHRGbG93OwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2ZpZ3VyZXMvSW1hZ2VzLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9maWd1cmVzL0ltYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YjRlMDFmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2ZpZ3VyZXMvSW1hZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5maWd1cmVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0KLS8qKgotICogSW1hZ2UgbG9jYXRpb24gY29uc3RhbnRzIHJlZmVyZW5jZWQgaW4gZGlhZ3JhbS4KLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBJbWFnZXMgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBBQ1RJVklUWSA9IEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKQotCQkJLmdldEltYWdlKCJzaGFwZS9hY3Rpdml0eS5naWYiKTsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBJVEVSQVRJT04gPSBBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCS5nZXRJbWFnZSgic2hhcGUvaXRlcmF0aW9uLmdpZiIpOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIFBIQVNFID0gQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlKAotCQkJInNoYXBlL3BoYXNlLmdpZiIpOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIE1JTEVTVE9ORSA9IEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKQotCQkJLmdldEltYWdlKCJzaGFwZS9taWxlc3RvbmUuZ2lmIik7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgUk9MRSA9IEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZSgKLQkJCSJzaGFwZS9yb2xlLmdpZiIpOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIFRBU0sgPSBBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2UoCi0JCQkic2hhcGUvdGFzay5naWYiKTsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBUQVNLX0RFU0NSSVBUT1IgPSBBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCS5nZXRJbWFnZSgic2hhcGUvdGFza2Rlc2NyaXB0b3IuZ2lmIik7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgV09SS19QUk9EVUNUX0RFU0NSSVBUT1IgPSBBdXRob3JpbmdVSVBsdWdpbgotCQkJLmdldERlZmF1bHQoKS5nZXRJbWFnZSgic2hhcGUvd29ya3Byb2R1Y3RkZXNjcmlwdG9yLmdpZiIpOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIEFSVElGQUNUID0gQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpCi0JCQkuZ2V0SW1hZ2UoInNoYXBlL2FydGlmYWN0LmdpZiIpOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIERFTElWRVJBQkxFID0gQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpCi0JCQkuZ2V0SW1hZ2UoInNoYXBlL2RlbGl2ZXJhYmxlLmdpZiIpOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIE9VVENPTUUgPSBBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCS5nZXRJbWFnZSgic2hhcGUvb3V0Y29tZS5naWYiKTsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBXT1JLX1BST0RVQ1QgPSBBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCS5nZXRJbWFnZSgiV29ya1Byb2R1Y3REZXNjcmlwdG9yLmdpZiIpOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIFRBU0tfREVTQ1JJUFRPUl8xNiA9IEF1dGhvcmluZ1VJUGx1Z2luCi0JCQkuZ2V0RGVmYXVsdCgpLmdldEltYWdlKCJzaGFwZS90YXNrZGVzX29iai5naWYiKTsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBST0xFX0RFU0NSSVBUT1JfMTYgPSBBdXRob3JpbmdVSVBsdWdpbgotCQkJLmdldERlZmF1bHQoKS5nZXRJbWFnZSgic2hhcGUvcm9sZWRlc19vYmouZ2lmIik7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfMTYgPSBBdXRob3JpbmdVSVBsdWdpbgotCQkJLmdldERlZmF1bHQoKS5nZXRJbWFnZSgic2hhcGUvd29ya2Rlc19vYmouZ2lmIik7IC8vJE5PTi1OTFMtMSQKLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZmlndXJlcy9Ob3RlRmlndXJlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9maWd1cmVzL05vdGVGaWd1cmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTdhYjFlYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9maWd1cmVzL05vdGVGaWd1cmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmZpZ3VyZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuQ29sb3JDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkdyYXBoaWNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5NYXJnaW5Cb3JkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50TGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUmVjdGFuZ2xlOwotCi0vKioKLSAqIAotICogQGF1dGhvciBKYW1lcyBUaGFyaW8KLSAqIEBzaW5jZSAgMS4wCi0gKiBAZGVwcmVjYXRlZAotICovCi1wdWJsaWMgY2xhc3MgTm90ZUZpZ3VyZQotICAgICAgICBleHRlbmRzIFRleHRGaWd1cmUgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDT1JORVJfU0laRSA9IDQ7Ci0KLSAgICBwdWJsaWMgTm90ZUZpZ3VyZSgpIHsKLSAgICAgICAgc2V0QmFja2dyb3VuZENvbG9yKENvbG9yQ29uc3RhbnRzLnRvb2x0aXBCYWNrZ3JvdW5kKTsKLSAgICAgICAgc2V0Rm9yZWdyb3VuZENvbG9yKENvbG9yQ29uc3RhbnRzLmJsYWNrKTsKLQotICAgICAgICBzZXRCb3JkZXIobmV3IE1hcmdpbkJvcmRlcihDT1JORVJfU0laRSkpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHBhaW50RmlndXJlKEdyYXBoaWNzIGdyYXBoaWNzKSB7Ci0gICAgICAgIFJlY3RhbmdsZSByZWN0ID0gZ2V0Qm91bmRzKCkuZ2V0Q29weSgpOwotCi0gICAgICAgIGdyYXBoaWNzLnRyYW5zbGF0ZShnZXRMb2NhdGlvbigpKTsKLQotICAgICAgICAvLyBmaWxsIHRoZSBub3RlCi0gICAgICAgIFBvaW50TGlzdCBvdXRsaW5lID0gbmV3IFBvaW50TGlzdCgpOwotCi0gICAgICAgIG91dGxpbmUuYWRkUG9pbnQoMCwgMCk7Ci0gICAgICAgIG91dGxpbmUuYWRkUG9pbnQocmVjdC53aWR0aCAtIENPUk5FUl9TSVpFLCAwKTsKLSAgICAgICAgb3V0bGluZS5hZGRQb2ludChyZWN0LndpZHRoIC0gMSwgQ09STkVSX1NJWkUpOwotICAgICAgICBvdXRsaW5lLmFkZFBvaW50KHJlY3Qud2lkdGggLSAxLCByZWN0LmhlaWdodCAtIDEpOwotICAgICAgICBvdXRsaW5lLmFkZFBvaW50KDAsIHJlY3QuaGVpZ2h0IC0gMSk7Ci0KLSAgICAgICAgZ3JhcGhpY3MuZmlsbFBvbHlnb24ob3V0bGluZSk7Ci0KLSAgICAgICAgLy8gZHJhdyB0aGUgaW5uZXIgb3V0bGluZQotICAgICAgICBQb2ludExpc3QgaW5uZXJMaW5lID0gbmV3IFBvaW50TGlzdCgpOwotCi0gICAgICAgIGlubmVyTGluZS5hZGRQb2ludChyZWN0LndpZHRoIC0gQ09STkVSX1NJWkUgLSAxLCAwKTsKLSAgICAgICAgaW5uZXJMaW5lLmFkZFBvaW50KHJlY3Qud2lkdGggLSBDT1JORVJfU0laRSAtIDEsIENPUk5FUl9TSVpFKTsKLSAgICAgICAgaW5uZXJMaW5lLmFkZFBvaW50KHJlY3Qud2lkdGggLSAxLCBDT1JORVJfU0laRSk7Ci0gICAgICAgIGlubmVyTGluZS5hZGRQb2ludChyZWN0LndpZHRoIC0gQ09STkVSX1NJWkUgLSAxLCAwKTsKLSAgICAgICAgaW5uZXJMaW5lLmFkZFBvaW50KDAsIDApOwotICAgICAgICBpbm5lckxpbmUuYWRkUG9pbnQoMCwgcmVjdC5oZWlnaHQgLSAxKTsKLSAgICAgICAgaW5uZXJMaW5lLmFkZFBvaW50KHJlY3Qud2lkdGggLSAxLCByZWN0LmhlaWdodCAtIDEpOwotICAgICAgICBpbm5lckxpbmUuYWRkUG9pbnQocmVjdC53aWR0aCAtIDEsIENPUk5FUl9TSVpFKTsKLQotICAgICAgICBncmFwaGljcy5kcmF3UG9seWdvbihpbm5lckxpbmUpOwotCi0gICAgICAgIGdyYXBoaWNzLnRyYW5zbGF0ZShnZXRMb2NhdGlvbigpLmdldE5lZ2F0ZWQoKSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZmlndXJlcy9Sb2xlVGFza0NvbXBvc2l0ZUZpZ3VyZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZmlndXJlcy9Sb2xlVGFza0NvbXBvc2l0ZUZpZ3VyZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOWM4YTVjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2ZpZ3VyZXMvUm9sZVRhc2tDb21wb3NpdGVGaWd1cmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmZpZ3VyZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5GbG93TGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5EaW1lbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZWRpdC5SYWlzZWRNYXJnaW5Cb3JkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuUm9sZVRhc2tDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci0KLS8qKgotICogRmlndXJlIGZvciB7QGxpbmsgUm9sZVRhc2tDb21wb3NpdGV9LgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFJvbGVUYXNrQ29tcG9zaXRlRmlndXJlIGV4dGVuZHMgRmlndXJlIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIENvbG9yIEJHX0NPTE9SID0gbmV3IENvbG9yKERpc3BsYXkuZ2V0Q3VycmVudCgpLCAyNTUsCi0JCQkyNTUsIDE1Nik7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUFYX1dJRFRIID0gNTAwOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1JTk9SX1NQQUNJTkcgPSAyMDsKLQotCXByaXZhdGUgRmlndXJlIHRhc2tzRmlndXJlOwotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIFJvbGVUYXNrQ29tcG9zaXRlRmlndXJlKCkgewotCQlGbG93TGF5b3V0IGxheW91dCA9IG5ldyBGbG93TGF5b3V0KHRydWUpOwotCQlsYXlvdXQuc2V0TWlub3JBbGlnbm1lbnQoRmxvd0xheW91dC5BTElHTl9DRU5URVIpOwotCQlsYXlvdXQuc2V0TWFqb3JBbGlnbm1lbnQoRmxvd0xheW91dC5BTElHTl9MRUZUVE9QKTsKLQkJbGF5b3V0LnNldFN0cmV0Y2hNaW5vckF4aXMoZmFsc2UpOwotCQlsYXlvdXQuc2V0TWlub3JTcGFjaW5nKE1JTk9SX1NQQUNJTkcpOwotCQlsYXlvdXQuc2V0T2JzZXJ2ZVZpc2liaWxpdHkodHJ1ZSk7Ci0KLQkJc2V0TGF5b3V0TWFuYWdlcihsYXlvdXQpOwotCQlzZXRCb3JkZXIobmV3IFJhaXNlZE1hcmdpbkJvcmRlcigpKTsKLQkJc2V0QmFja2dyb3VuZENvbG9yKEJHX0NPTE9SKTsKLQkJc2V0T3BhcXVlKHRydWUpOwotCi0JCXRhc2tzRmlndXJlID0gbmV3IEZpZ3VyZSgpIHsKLQkJCS8qKgotCQkJICogQHNlZSBvcmcuZWNsaXBzZS5kcmF3MmQuRmlndXJlI2dldFByZWZlcnJlZFNpemUoaW50LCBpbnQpCi0JCQkgKi8KLQkJCXB1YmxpYyBEaW1lbnNpb24gZ2V0UHJlZmVycmVkU2l6ZShpbnQgd0hpbnQsIGludCBoSGludCkgewotCQkJCUlGaWd1cmUgZmlyc3RDaGlsZCA9IChJRmlndXJlKSBnZXRDaGlsZHJlbigpLmdldCgwKTsKLQkJCQlpZiAoZmlyc3RDaGlsZCAhPSB0aGlzKSB7Ci0JCQkJCWludCBvZmZzZXQgPSBmaXJzdENoaWxkLmdldFNpemUoKS53aWR0aDsgLy8gZmlyc3RDaGlsZC5nZXRTaXplKCkud2lkdGgKLQkJCQkJLy8gKwotCQkJCQkvLyBSb2xlVGFza0NvbXBvc2l0ZUZpZ3VyZS50aGlzLmdldEluc2V0cygpLmdldFdpZHRoKCkKLQkJCQkJLy8gKwotCQkJCQkvLyBNSU5PUl9TUEFDSU5HOwotCQkJCQlpZiAod0hpbnQgPCBvZmZzZXQpIHsKLQotCQkJCQl9Ci0JCQkJCXdIaW50ID0gd0hpbnQgLSBvZmZzZXQ7Ci0JCQkJCWlmICh3SGludCA+IE1BWF9XSURUSCkgewotCQkJCQkJd0hpbnQgPSBNQVhfV0lEVEg7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJRGltZW5zaW9uIGRpbSA9IHN1cGVyLmdldFByZWZlcnJlZFNpemUod0hpbnQsIGhIaW50KTsKLQkJCQlyZXR1cm4gZGltOwotCQkJfQotCQl9OwotCQlGbG93TGF5b3V0IGZsb3dMYXlvdXQgPSBuZXcgRmxvd0xheW91dCgpOwotCQlmbG93TGF5b3V0LnNldE1pbm9yU3BhY2luZygxMCk7Ci0JCWZsb3dMYXlvdXQuc2V0TWlub3JBbGlnbm1lbnQoRmxvd0xheW91dC5BTElHTl9DRU5URVIpOwotCQl0YXNrc0ZpZ3VyZS5zZXRMYXlvdXRNYW5hZ2VyKGZsb3dMYXlvdXQpOwotCQl0YXNrc0ZpZ3VyZS5zZXRPcGFxdWUodHJ1ZSk7Ci0JCXN1cGVyLmFkZCh0YXNrc0ZpZ3VyZSwgbnVsbCwgLTEpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZHJhdzJkLkZpZ3VyZSNhZGQoSUZpZ3VyZSwgT2JqZWN0LCBpbnQpCi0JICovCi0JcHVibGljIHZvaWQgYWRkKElGaWd1cmUgZmlndXJlLCBPYmplY3QgY29uc3RyYWludCwgaW50IGluZGV4KSB7Ci0JCWlmIChnZXRDaGlsZHJlbigpLnNpemUoKSA9PSAxKSB7Ci0JCQlzdXBlci5hZGQoZmlndXJlLCBjb25zdHJhaW50LCAwKTsKLQkJfSBlbHNlIHsKLQkJCXRhc2tzRmlndXJlLmFkZChmaWd1cmUsIGNvbnN0cmFpbnQpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9maWd1cmVzL1JvbGVUYXNrRmxvd0xheW91dC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZmlndXJlcy9Sb2xlVGFza0Zsb3dMYXlvdXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmJkNzg2Mi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9maWd1cmVzL1JvbGVUYXNrRmxvd0xheW91dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE4ICswLDAgQEAKLS8qKgotICogCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZmlndXJlczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5GbG93TGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5EaW1lbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlJlY3RhbmdsZTsKLQotLyoqCi0gKiBAYXV0aG9yIHNrYW5ub29yCi0gKiBAZGVwcmVjYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUm9sZVRhc2tGbG93TGF5b3V0IGV4dGVuZHMgRmxvd0xheW91dCB7Ci0KLQlib29sZWFuIGFkanVzdCA9IGZhbHNlOwotCVdvcmtpbmdEYXRhIGRhdGE7Ci0JLyoqCi0JICogCi0JICovCi0JcHVibGljIFJvbGVUYXNrRmxvd0xheW91dCgpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjb25zdHJ1Y3RvciBzdHViCi0JfQotCi0JLyoqCi0JICogQHBhcmFtIGlzSG9yaXpvbnRhbAotCSAqLwotCXB1YmxpYyBSb2xlVGFza0Zsb3dMYXlvdXQoYm9vbGVhbiBpc0hvcml6b250YWwpIHsKLQkJc3VwZXIoaXNIb3Jpem9udGFsKTsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjb25zdHJ1Y3RvciBzdHViCi0JfQotCQotCXB1YmxpYyB2b2lkIGxheW91dChJRmlndXJlIHBhcmVudCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCWlmKGFkanVzdCl7Ci0JCQlhZGp1c3RMYXlvdXQocGFyZW50KTsKLQkJfWVsc2UKLQkJCXN1cGVyLmxheW91dChwYXJlbnQpOwotCX0KLQljbGFzcyBXb3JraW5nRGF0YSB7Ci0JCWludCByb3dIZWlnaHQsIHJvd1dpZHRoLCByb3dDb3VudCwgcm93WCwgcm93WSwgbWF4V2lkdGg7Ci0JCVJlY3RhbmdsZSBib3VuZHNbXSwgYXJlYTsKLQkJSUZpZ3VyZSByb3dbXTsKLQl9Ci0JLyoqCi0JICogSW5pdGlhbGl6ZXMgdGhlIHN0YXRlIG9mIHJvdyBkYXRhLCB3aGljaCBpcyBpbnRlcm5hbCB0byB0aGUgbGF5b3V0IHByb2Nlc3MuIAotCSAqLwotCXByaXZhdGUgdm9pZCBpbml0Um93KCkgewotCQlkYXRhLnJvd1ggPSAwOwotCQlkYXRhLnJvd0hlaWdodCA9IDA7Ci0JCWRhdGEucm93V2lkdGggPSAwOwotCQlkYXRhLnJvd0NvdW50ID0gMDsKLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplcyBzdGF0ZSBkYXRhIGZvciBsYXlpbmcgb3V0IGNoaWxkcmVuLCBiYXNlZCBvbiB0aGUgRmlndXJlIGdpdmVuIGFzIGlucHV0LgotCSAqCi0JICogQHBhcmFtIHBhcmVudCB0aGUgcGFyZW50IGZpZ3VyZQotCSAqIEBzaW5jZSAyLjAgCi0JICovCi0JcHJpdmF0ZSB2b2lkIGluaXRWYXJpYWJsZXMoSUZpZ3VyZSBwYXJlbnQpIHsKLQkJZGF0YS5yb3cgPSBuZXcgSUZpZ3VyZVtwYXJlbnQuZ2V0Q2hpbGRyZW4oKS5zaXplKCldOwotCQlkYXRhLmJvdW5kcyA9IG5ldyBSZWN0YW5nbGVbZGF0YS5yb3cubGVuZ3RoXTsKLQkJZGF0YS5tYXhXaWR0aCA9IGRhdGEuYXJlYS53aWR0aDsKLQl9Ci0JcHJpdmF0ZSB2b2lkIGFkanVzdExheW91dChJRmlndXJlIHBhcmVudCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCWRhdGEgPSBuZXcgV29ya2luZ0RhdGEoKTsKLQkJUmVjdGFuZ2xlIHJlbGF0aXZlQXJlYSA9IHBhcmVudC5nZXRDbGllbnRBcmVhKCk7Ci0JCWRhdGEuYXJlYSA9IHRyYW5zcG9zZXIudChyZWxhdGl2ZUFyZWEpOwotCi0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gcGFyZW50LmdldENoaWxkcmVuKCkuaXRlcmF0b3IoKTsKLQkJaW50IGR4OwotCi0JCS8vQ2FsY3VsYXRlIHRoZSBoaW50cyB0byBiZSBwYXNzZWQgdG8gY2hpbGRyZW4KLQkJaW50IHdIaW50ID0gLTE7Ci0JCWludCBoSGludCA9IC0xOwotCQlpZiAoaXNIb3Jpem9udGFsKCkpCi0JCQl3SGludCA9IHBhcmVudC5nZXRDbGllbnRBcmVhKCkud2lkdGg7Ci0JCWVsc2UKLQkJCWhIaW50ID0gcGFyZW50LmdldENsaWVudEFyZWEoKS5oZWlnaHQ7Ci0KLQkJaW5pdFZhcmlhYmxlcyhwYXJlbnQpOwotCQlpbml0Um93KCk7Ci0JCWludCBpID0gMDsgCi0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCUlGaWd1cmUgZiA9IChJRmlndXJlKWl0ZXJhdG9yLm5leHQoKTsKLQkJCURpbWVuc2lvbiBwcmVmID0gdHJhbnNwb3Nlci50KGdldENoaWxkU2l6ZShmLCB3SGludCwgaEhpbnQpKTsKLQkJCVJlY3RhbmdsZSByID0gbmV3IFJlY3RhbmdsZSgwLCAwLCBwcmVmLndpZHRoLCBwcmVmLmhlaWdodCk7Ci0KLQkJCWlmIChkYXRhLnJvd0NvdW50ID4gMCkgewotCQkJCWlmIChkYXRhLnJvd1dpZHRoICsgcHJlZi53aWR0aCA+IGRhdGEubWF4V2lkdGgpCi0JCQkJCWxheW91dFJvdyhwYXJlbnQpOwotCQkJfQotCQkJci54ID0gZGF0YS5yb3dYOwotCQkJci55ID0gZGF0YS5yb3dZOwotCQkJZHggPSByLndpZHRoICsgZ2V0TWlub3JTcGFjaW5nKCk7Ci0JCQlkYXRhLnJvd1ggKz0gZHg7Ci0JCQlkYXRhLnJvd1dpZHRoICs9IGR4OwotCQkJZGF0YS5yb3dIZWlnaHQgPSBNYXRoLm1heChkYXRhLnJvd0hlaWdodCwgci5oZWlnaHQpOwotCQkJZGF0YS5yb3cgW2RhdGEucm93Q291bnRdID0gZjsKLQkJCWRhdGEuYm91bmRzW2RhdGEucm93Q291bnRdID0gcjsKLQkJCWRhdGEucm93Q291bnQrKzsKLQkJCWkrKzsKLQkJfQotCQlpZiAoZGF0YS5yb3dDb3VudCAhPSAwKQotCQkJbGF5b3V0Um93KHBhcmVudCk7Ci0JCWRhdGEgPSBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEFkanVzdChib29sZWFuIGFkanVzdCkgewotCQl0aGlzLmFkanVzdCA9IGFkanVzdDsKLQl9CQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9maWd1cmVzL1NlbGVjdGFibGVMYWJlbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZmlndXJlcy9TZWxlY3RhYmxlTGFiZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTk5MjViOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9maWd1cmVzL1NlbGVjdGFibGVMYWJlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZmlndXJlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Db2xvckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuR3JhcGhpY3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5JbnNldHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlJlY3RhbmdsZTsKLQotLyoqCi0gKiBBIGN1c3RvbWl6ZWQgTGFiZWwgZm9yIHNlbGVjdGlvbi4gUHJpbWFyeSBzZWxlY3Rpb24gaXMgZGVub3RlZCBieSBoaWdobGlnaHQKLSAqIGFuZCBmb2N1cyByZWN0YW5nbGUuIE5vcm1hbCBzZWxlY3Rpb24gaXMgZGVub3RlZCBieSBoaWdobGlnaHQgb25seS4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFNlbGVjdGFibGVMYWJlbCBleHRlbmRzIExhYmVsIHsKLQotCXByaXZhdGUgYm9vbGVhbiBzZWxlY3RlZDsKLQotCXByaXZhdGUgYm9vbGVhbiBoYXNGb2N1czsKLQotCXByaXZhdGUgUmVjdGFuZ2xlIGdldFNlbGVjdGlvblJlY3RhbmdsZSgpIHsKLQkJUmVjdGFuZ2xlIGJvdW5kcyA9IGdldFRleHRCb3VuZHMoKTsKLQkJYm91bmRzLmV4cGFuZChuZXcgSW5zZXRzKDIsIDIsIDAsIDApKTsKLQkJdHJhbnNsYXRlVG9QYXJlbnQoYm91bmRzKTsKLQkJYm91bmRzLmludGVyc2VjdChnZXRCb3VuZHMoKSk7Ci0JCXJldHVybiBib3VuZHM7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5kcmF3MmQuTGFiZWwjcGFpbnRGaWd1cmUoR3JhcGhpY3MpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcGFpbnRGaWd1cmUoR3JhcGhpY3MgZ3JhcGhpY3MpIHsKLQkJaWYgKHNlbGVjdGVkKSB7Ci0JCQlncmFwaGljcy5wdXNoU3RhdGUoKTsKLQkJCWdyYXBoaWNzLnNldEJhY2tncm91bmRDb2xvcihDb2xvckNvbnN0YW50cy5tZW51QmFja2dyb3VuZFNlbGVjdGVkKTsKLQkJCWdyYXBoaWNzLmZpbGxSZWN0YW5nbGUoZ2V0U2VsZWN0aW9uUmVjdGFuZ2xlKCkpOwotCQkJZ3JhcGhpY3MucG9wU3RhdGUoKTsKLQkJCWdyYXBoaWNzLnNldEZvcmVncm91bmRDb2xvcihDb2xvckNvbnN0YW50cy53aGl0ZSk7Ci0JCX0KLQkJaWYgKGhhc0ZvY3VzKSB7Ci0JCQlncmFwaGljcy5wdXNoU3RhdGUoKTsKLQkJCWdyYXBoaWNzLnNldFhPUk1vZGUodHJ1ZSk7Ci0JCQlncmFwaGljcy5zZXRGb3JlZ3JvdW5kQ29sb3IoQ29sb3JDb25zdGFudHMubWVudUJhY2tncm91bmRTZWxlY3RlZCk7Ci0JCQlncmFwaGljcy5zZXRCYWNrZ3JvdW5kQ29sb3IoQ29sb3JDb25zdGFudHMud2hpdGUpOwotCQkJZ3JhcGhpY3MuZHJhd0ZvY3VzKGdldFNlbGVjdGlvblJlY3RhbmdsZSgpLnJlc2l6ZSgtMSwgLTEpKTsKLQkJCWdyYXBoaWNzLnBvcFN0YXRlKCk7Ci0JCX0KLQkJc3VwZXIucGFpbnRGaWd1cmUoZ3JhcGhpY3MpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHNlbGVjdGlvbiBzdGF0ZSBvZiB0aGlzIFNpbXBsZUFjdGl2aXR5TGFiZWwKLQkgKiAKLQkgKiBAcGFyYW0gYgotCSAqICAgICAgICAgICAgdHJ1ZSB3aWxsIGNhdXNlIHRoZSBsYWJlbCB0byBhcHBlYXIgc2VsZWN0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTZWxlY3RlZChib29sZWFuIGIpIHsKLQkJc2VsZWN0ZWQgPSBiOwotCQlyZXBhaW50KCk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgZm9jdXMgc3RhdGUgb2YgdGhpcyBTaW1wbGVBY3Rpdml0eUxhYmVsCi0JICogCi0JICogQHBhcmFtIGIKLQkgKiAgICAgICAgICAgIHRydWUgd2lsbCBjYXVzZSBhIGZvY3VzIHJlY3RhbmdsZSB0byBiZSBkcmF3biBhcm91bmQgdGhlIHRleHQKLQkgKiAgICAgICAgICAgIG9mIHRoZSBMYWJlbAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZvY3VzKGJvb2xlYW4gYikgewotCQloYXNGb2N1cyA9IGI7Ci0JCXJlcGFpbnQoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2ZpZ3VyZXMvVGV4dEZpZ3VyZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZmlndXJlcy9UZXh0RmlndXJlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5ZTFhOGEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZmlndXJlcy9UZXh0RmlndXJlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5maWd1cmVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSW1hZ2VGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Qb3NpdGlvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuUmVsYXRpdmVMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Ub29sYmFyTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC50ZXh0LkZsb3dQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC50ZXh0LlBhcmFncmFwaFRleHRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLnRleHQuVGV4dEZsb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYudXRpbC5UZW1wbGF0ZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0KLS8qKgotICogVGV4dEZpZ3VyZSBpcyBjdXN0b21pemFibGUgZmlndXJlIHRvIGFsbG93IHdvcmQtd3JhcGluZyBhbmQgd2l0aCBpbWFnZS4gCi0gKiB7QGxpbmsgTGFiZWx9IGRvIG5vdCBzdXBwb3J0IHdvcmQtd3JhcC4gIFRleHRGaWd1cmUgaXMgd3JhcHBlciBvdmVyIHtAbGluayBUZXh0Rmxvd30KLSAqIGFuZCB7QGxpbmsgRmxvd1BhZ2V9IHRvIHN1cHBvcnQgd29yZC13cmFwIGFuZCBpbWFnZS4gCi0gKiBAYXV0aG9yIEphbWVzIFRoYXJpbwotICogQHNpbmNlICAxLjAKLSAqLwotcHVibGljIGNsYXNzIFRleHRGaWd1cmUgZXh0ZW5kcyBGaWd1cmUgewotCi0JcHJpdmF0ZSBGbG93UGFnZSB0ZXh0Rmxvd1BhZ2U7Ci0KLQlwcml2YXRlIFRleHRGbG93IHRleHRGbG93OwotCi0JcHJpdmF0ZSBJbWFnZUZpZ3VyZSBpbWFnZUZpZ3VyZTsKLQotCXB1YmxpYyBUZXh0RmlndXJlKCkgewotCQl0ZXh0Rmxvd1BhZ2UgPSBuZXcgRmxvd1BhZ2UoKTsKLQkJdGV4dEZsb3dQYWdlLnNldEhvcml6b250YWxBbGlnbWVudChQb3NpdGlvbkNvbnN0YW50cy5DRU5URVIpOwotCQlzZXRMYXlvdXRNYW5hZ2VyKG5ldyBUb29sYmFyTGF5b3V0KCkpOwotCQlpbWFnZUZpZ3VyZSA9IG5ldyBJbWFnZUZpZ3VyZSgpOwotCQlhZGQoaW1hZ2VGaWd1cmUsIG5ldyBSZWxhdGl2ZUxvY2F0b3IoaW1hZ2VGaWd1cmUsCi0JCQkJUG9zaXRpb25Db25zdGFudHMuQ0VOVEVSKSk7Ci0JCWFkZCh0ZXh0Rmxvd1BhZ2UsIG5ldyBSZWxhdGl2ZUxvY2F0b3IodGV4dEZsb3dQYWdlLAotCQkJCVBvc2l0aW9uQ29uc3RhbnRzLkFMV0FZU19MRUZUKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkKEltYWdlIGltYWdlKSB7Ci0JCWltYWdlRmlndXJlLnNldEltYWdlKGltYWdlKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7Ci0JCXJldHVybiB0ZXh0Rmxvdy5nZXRUZXh0KCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VGV4dChTdHJpbmcgbmV3VGV4dCkgewotCQl0ZXh0Rmxvd1BhZ2UucmVtb3ZlQWxsKCk7Ci0JCXRleHRGbG93ID0gbmV3IFRleHRGbG93KCk7Ci0JCXRleHRGbG93LnNldEZvbnQoVGVtcGxhdGVDb25zdGFudHMuREVGQVVMVF9GT05UKTsKLQkJdGV4dEZsb3cuc2V0TGF5b3V0TWFuYWdlcihuZXcgUGFyYWdyYXBoVGV4dExheW91dCh0ZXh0RmxvdywKLQkJCQlQYXJhZ3JhcGhUZXh0TGF5b3V0LldPUkRfV1JBUF9IQVJEKSk7Ci0JCXRleHRGbG93LnNldFRleHQobmV3VGV4dCk7Ci0JCXRleHRGbG93UGFnZS5hZGQodGV4dEZsb3cpOwotCX0KLQotCXB1YmxpYyBGbG93UGFnZSBnZXRUZXh0Rmxvd1BhZ2UoKSB7Ci0JCXJldHVybiB0ZXh0Rmxvd1BhZ2U7Ci0JfQotCi0JcHVibGljIFRleHRGbG93IGdldFRleHRGbG93KCkgewotCQlyZXR1cm4gdGV4dEZsb3c7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZmlndXJlcy9XUENvbXBhcnRtZW50RmlndXJlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9maWd1cmVzL1dQQ29tcGFydG1lbnRGaWd1cmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGQ3ZWQ3My4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9maWd1cmVzL1dQQ29tcGFydG1lbnRGaWd1cmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmZpZ3VyZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuVG9vbGJhckxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0LlJhaXNlZE1hcmdpbkJvcmRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotCi0vKioKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQHNpbmNlIDEuMAotICogQGRlcHJlY2F0ZWQKLSAqLwotcHVibGljIGNsYXNzIFdQQ29tcGFydG1lbnRGaWd1cmUgZXh0ZW5kcyBGaWd1cmUgewotCi0JcHVibGljIGZpbmFsIHN0YXRpYyBDb2xvciB3cENvbG9yID0gbmV3IENvbG9yKERpc3BsYXkuZ2V0Q3VycmVudCgpLCAyNTUsCi0JCQkyNTUsIDE1Nik7Ci0KLQlwdWJsaWMgZmluYWwgc3RhdGljIENvbG9yIGFydGlmYWN0Q29sb3IgPSBuZXcgQ29sb3IoRGlzcGxheS5nZXRDdXJyZW50KCksCi0JCQkyNTUsIDI1NSwgMTU2KTsKLQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgQ29sb3IgZGVsaXZlcmFibGVDb2xvciA9IG5ldyBDb2xvcigKLQkJCURpc3BsYXkuZ2V0Q3VycmVudCgpLCAyMDYsIDI1NSwgMjE2KTsKLQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgQ29sb3Igb3V0Y29tZUNvbG9yID0gbmV3IENvbG9yKERpc3BsYXkuZ2V0Q3VycmVudCgpLAotCQkJMjA2LCAyNTUsIDEwMCk7Ci0KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBuZXdXUE5hbWUgPSBBdXRob3JpbmdVSVJlc291cmNlcy5XUENvbXBhcnRtZW50RmlndXJlXzA7IAotCi0JcHVibGljIExhYmVsIGxhYmVsOwotCi0JV1BGaWd1cmUgZmlndXJlID0gbnVsbDsKLQotCS8qKgotCSAqIFdvcmtQcm9kdWN0IENvbXBhcnRtZW50IC0gV2l0aCBiYWNrZ3JvdW5kIGZpbGxlZCBkZXBlbmRpbmcgb24gVHlwZSBvZiB0aGUKLQkgKiBXb3JrUHJvZHVjdC4KLQkgKi8KLQlwdWJsaWMgV1BDb21wYXJ0bWVudEZpZ3VyZShMYWJlbCBuYW1lLCBpbnQgdHlwZSkgewotCQlsYWJlbCA9IG5hbWU7Ci0JCVRvb2xiYXJMYXlvdXQgbGF5b3V0ID0gbmV3IFRvb2xiYXJMYXlvdXQoKTsKLQkJc2V0TGF5b3V0TWFuYWdlcihsYXlvdXQpOwotCQlzZXRPcGFxdWUodHJ1ZSk7Ci0JCXNldEJvcmRlcihuZXcgUmFpc2VkTWFyZ2luQm9yZGVyKCkpOwotCQlpZiAodHlwZSA9PSAxKQotCQkJc2V0QmFja2dyb3VuZENvbG9yKGFydGlmYWN0Q29sb3IpOwotCQllbHNlIGlmICh0eXBlID09IDIpCi0JCQlzZXRCYWNrZ3JvdW5kQ29sb3IoZGVsaXZlcmFibGVDb2xvcik7Ci0JCWVsc2UgaWYgKHR5cGUgPT0gMykKLQkJCXNldEJhY2tncm91bmRDb2xvcihvdXRjb21lQ29sb3IpOwotCQllbHNlCi0JCQlzZXRCYWNrZ3JvdW5kQ29sb3Iod3BDb2xvcik7Ci0JCWxhYmVsLnNldFRleHQobmV3V1BOYW1lKTsKLQkJYWRkKGxhYmVsKTsKLQl9Ci0KLQlwdWJsaWMgTGFiZWwgZ2V0TGFiZWwoKSB7Ci0JCXJldHVybiBsYWJlbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRMYWJlbE5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJbGFiZWwuc2V0VGV4dChuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRMYWJlbChMYWJlbCBsYWJlbCkgewotCQl0aGlzLmxhYmVsID0gbGFiZWw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9maWd1cmVzL1dQRmlndXJlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9maWd1cmVzL1dQRmlndXJlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyYTEwYzAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZmlndXJlcy9XUEZpZ3VyZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZmlndXJlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5BYnN0cmFjdEJvcmRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuQ29sb3JDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuR3JhcGhpY3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Ub29sYmFyTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5JbnNldHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlJlY3RhbmdsZTsKLQotLyoqCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBzaW5jZSAxLjAKLSAqIEBkZXByZWNhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBXUEZpZ3VyZSBleHRlbmRzIEZpZ3VyZSB7Ci0KLQlwdWJsaWMgTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoKTsKLQotCXB1YmxpYyBXUEZpZ3VyZShMYWJlbCBsKSB7Ci0JCXN1cGVyKCk7Ci0JCWFkZChsKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwYWludEZpZ3VyZShHcmFwaGljcyBnKSB7Ci0JCVJlY3RhbmdsZSBjbGllbnRBcmVhID0gZ2V0Q2xpZW50QXJlYSgpOwotCQlSZWN0YW5nbGUgYmFyID0gY2xpZW50QXJlYS5nZXRDb3B5KCk7Ci0JCWJhci5jcm9wKG5ldyBJbnNldHMoMCwgNSwgNSwgNSkpOwotCQlnLnNldEJhY2tncm91bmRDb2xvcihDb2xvckNvbnN0YW50cy5ncmF5KTsKLQkJZy5maWxsUmVjdGFuZ2xlKGJhci5nZXRUcmFuc2xhdGVkKDYsIDYpKTsKLQkJZy5zZXRCYWNrZ3JvdW5kQ29sb3IoQ29sb3JDb25zdGFudHMueWVsbG93KTsKLQkJZy5maWxsUmVjdGFuZ2xlKGJhcik7Ci0JCWcuc2V0TGluZVN0eWxlKDIpOwotCQlnLnNldExpbmVXaWR0aCgxKTsKLQkJc3VwZXIucGFpbnRGaWd1cmUoZyk7Ci0JfQotCi0JcHVibGljIExhYmVsIGdldEZpZ3VyZSgpIHsKLQkJcmV0dXJuIGxhYmVsOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldExhYmVsTmFtZShTdHJpbmcgbmFtZSkgewotCQlsYWJlbC5zZXRUZXh0KG5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldExhYmVsKExhYmVsIGxhYmVsKSB7Ci0JCXRoaXMubGFiZWwgPSBsYWJlbDsKLQl9Ci0KLQljbGFzcyBCb3ggZXh0ZW5kcyBGaWd1cmUgewotCQlwdWJsaWMgQm94KEluc2V0cyBpbnNldHMpIHsKLQkJCXNldEJvcmRlcihuZXcgQm94Qm9yZGVyKGluc2V0cykpOwotCQkJVG9vbGJhckxheW91dCB0b29sYmFyTGF5b3V0ID0gbmV3IFRvb2xiYXJMYXlvdXQoKTsKLQkJCXRvb2xiYXJMYXlvdXQuc2V0U3RyZXRjaE1pbm9yQXhpcyhmYWxzZSk7Ci0JCQlzZXRMYXlvdXRNYW5hZ2VyKHRvb2xiYXJMYXlvdXQpOwotCQkJc2V0QmFja2dyb3VuZENvbG9yKENvbG9yQ29uc3RhbnRzLnJlZCk7Ci0KLQkJfQotCi0JCXByaXZhdGUgY2xhc3MgQm94Qm9yZGVyIGV4dGVuZHMgQWJzdHJhY3RCb3JkZXIgewotCi0JCQlwdWJsaWMgSW5zZXRzIGluc2V0cyA9IG5ldyBJbnNldHMoMSwgMCwgMCwgMCk7Ci0KLQkJCXB1YmxpYyBCb3hCb3JkZXIoSW5zZXRzIGluc2V0cykgewotCQkJCXRoaXMuaW5zZXRzID0gaW5zZXRzOwotCQkJfQotCi0JCQkvKioKLQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuZHJhdzJkLkJvcmRlciNnZXRJbnNldHMoSUZpZ3VyZSkKLQkJCSAqLwotCQkJcHVibGljIEluc2V0cyBnZXRJbnNldHMoSUZpZ3VyZSBmaWd1cmUpIHsKLQkJCQlyZXR1cm4gaW5zZXRzOwotCQkJfQotCi0JCQkvKioKLQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuZHJhdzJkLkJvcmRlciNwYWludChJRmlndXJlLCBHcmFwaGljcywgSW5zZXRzKQotCQkJICovCi0JCQlwdWJsaWMgdm9pZCBwYWludChJRmlndXJlIGZpZ3VyZSwgR3JhcGhpY3MgZ3JhcGhpY3MsIEluc2V0cyBpbnNldHMpIHsKLQkJCQlSZWN0YW5nbGUgcmVjdCA9IGdldFBhaW50UmVjdGFuZ2xlKGZpZ3VyZSwgaW5zZXRzKTsKLQkJCQlncmFwaGljcy5kcmF3TGluZShyZWN0LmdldFRvcExlZnQoKSwgcmVjdC5nZXRUb3BSaWdodCgpKTsKLQkJCX0KLQotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9maWd1cmVzL1dyYXBMYWJlbG5JbWFnZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZmlndXJlcy9XcmFwTGFiZWxuSW1hZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2Y4MGRmNy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9maWd1cmVzL1dyYXBMYWJlbG5JbWFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZmlndXJlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5GaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkltYWdlRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5NYXJnaW5Cb3JkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlRvb2xiYXJMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLnRleHQuRmxvd1BhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLnRleHQuUGFyYWdyYXBoVGV4dExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQudGV4dC5UZXh0RmxvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0KLS8qKgotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAc2luY2UgMS4wCi0gKiBAZGVwcmVjYXRlZAotICovCi1wdWJsaWMgY2xhc3MgV3JhcExhYmVsbkltYWdlIGV4dGVuZHMgRmlndXJlIHsKLQotCS8vIFRoZSBpbm5lciBUZXh0RmxvdwotCXByaXZhdGUgVGV4dEZsb3cgdGV4dEZsb3c7Ci0KLQlwcml2YXRlIEltYWdlIGltYWdlOwotCi0JcHVibGljIFdyYXBMYWJlbG5JbWFnZShJbWFnZSBpbWFnZSkgewotCQlzZXRCb3JkZXIobmV3IE1hcmdpbkJvcmRlcigzKSk7Ci0JCUltYWdlRmlndXJlIGZpZyA9IG5ldyBJbWFnZUZpZ3VyZSgpOwotCQl0aGlzLmltYWdlID0gaW1hZ2U7Ci0JCWZpZy5zZXRJbWFnZShpbWFnZSk7Ci0JCWFkZChmaWcpOwotCQlGbG93UGFnZSBmbG93UGFnZSA9IG5ldyBGbG93UGFnZSgpOwotCi0JCXRleHRGbG93ID0gbmV3IFRleHRGbG93KCk7Ci0KLQkJdGV4dEZsb3cuc2V0TGF5b3V0TWFuYWdlcihuZXcgUGFyYWdyYXBoVGV4dExheW91dCh0ZXh0RmxvdywKLQkJCQlQYXJhZ3JhcGhUZXh0TGF5b3V0LldPUkRfV1JBUF9TT0ZUKSk7Ci0JCQotCQlmbG93UGFnZS5hZGQodGV4dEZsb3cpOwotCQlmbG93UGFnZS5zZXRTaXplKDQwLDQwKTsKLQotCQlzZXRMYXlvdXRNYW5hZ2VyKG5ldyBUb29sYmFyTGF5b3V0KCkpOwotCQlhZGQoZmxvd1BhZ2UpOwotCi0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdGV4dCBpbnNpZGUgdGhlIFRleHRGbG93LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHRleHQgZmxvdyBpbnNpZGUgdGhlIHRleHQuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KCkgewotCQlyZXR1cm4gdGV4dEZsb3cuZ2V0VGV4dCgpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHRleHQgb2YgdGhlIFRleHRGbG93IHRvIHRoZSBnaXZlbiB2YWx1ZS4KLQkgKiAKLQkgKiBAcGFyYW0gbmV3VGV4dAotCSAqICAgICAgICAgICAgdGhlIG5ldyB0ZXh0IHZhbHVlLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRleHQoU3RyaW5nIG5ld1RleHQpIHsKLQkJdGV4dEZsb3cuc2V0VGV4dChuZXdUZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIGltYWdlLgotCSAqLwotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpIHsKLQkJcmV0dXJuIGltYWdlOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBpbWFnZQotCSAqICAgICAgICAgICAgVGhlIGltYWdlIHRvIHNldC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJbWFnZShJbWFnZSBpbWFnZSkgewotCQl0aGlzLmltYWdlID0gaW1hZ2U7Ci0JfQotCXB1YmxpYyBUZXh0RmxvdyBnZXRUZXh0RmxvdygpewotCQlyZXR1cm4gdGV4dEZsb3c7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9maWd1cmVzL1dyYXBwYWJsZUxhYmVsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9maWd1cmVzL1dyYXBwYWJsZUxhYmVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1ODczYzguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZmlndXJlcy9XcmFwcGFibGVMYWJlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA4OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5maWd1cmVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkNvbG9yQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5GaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkZpZ3VyZVV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuR3JhcGhpY3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlBvc2l0aW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5EaW1lbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5Lkluc2V0czsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udE1ldHJpY3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotCi1pbXBvcnQgY29tLmlibS5pY3UudGV4dC5CcmVha0l0ZXJhdG9yOwotaW1wb3J0IGNvbS5pYm0uaWN1LnV0aWwuU3RyaW5nVG9rZW5pemVyOwotCi0vKioKLSAqIFByb3ZpZGVzIHN1cHBvcnQgZm9yIHRleHQgd3JhcCBpbiBhIGxhYmVsLgotICogCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBzaW5jZSAxLjAKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgV3JhcHBhYmxlTGFiZWwgZXh0ZW5kcyBGaWd1cmUgaW1wbGVtZW50cyBQb3NpdGlvbkNvbnN0YW50cyB7Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgRUxMSVBTSVMgPSAiLi4uIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBJbWFnZSBpY29uOwotCi0JcHJpdmF0ZSBTdHJpbmcgdGV4dCA9ICIiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIFN0cmluZyBzdWJTdHJpbmdUZXh0OwotCi0JcHJpdmF0ZSBEaW1lbnNpb24gdGV4dFNpemU7Ci0KLQlwcml2YXRlIERpbWVuc2lvbiBzdWJTdHJpbmdUZXh0U2l6ZTsKLQotCXByaXZhdGUgRGltZW5zaW9uIGljb25TaXplID0gbmV3IERpbWVuc2lvbigwLCAwKTsKLQotCXByaXZhdGUgUG9pbnQgaWNvbkxvY2F0aW9uOwotCi0JcHJpdmF0ZSBQb2ludCB0ZXh0TG9jYXRpb247Ci0KLQlwcml2YXRlIGludCB0ZXh0QWxpZ25tZW50ID0gQ0VOVEVSOwotCi0JcHJpdmF0ZSBpbnQgaWNvbkFsaWdubWVudCA9IENFTlRFUjsKLQotCXByaXZhdGUgaW50IGxhYmVsQWxpZ25tZW50ID0gQ0VOVEVSOwotCi0JcHJpdmF0ZSBpbnQgdGV4dFBsYWNlbWVudCA9IFNPVVRIOwotCi0JcHJpdmF0ZSBpbnQgaWNvblRleHRHYXAgPSAzOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEZMQUdfU0VMRUNURUQgPSBNQVhfRkxBRyA8PCAxLAotCQkJRkxBR19IQVNGT0NVUyA9IE1BWF9GTEFHIDw8IDIsIEZMQUdfV1JBUCA9IE1BWF9GTEFHIDw8IDUsCi0JCQlGTEFHX1dSQVBfQUxJR04gPSBNQVhfRkxBRyA8PCA2OwotCi0JLy8gVGhlIHByaW1hcnkgZGltZW5zaW9ucyB1c2VkIHRvIGNhbGN1bGF0ZSB0ZXh0IHNpemUuCi0JcHJpdmF0ZSBEaW1lbnNpb24gdGV4dERpbWVuc2lvbiA9IG5ldyBEaW1lbnNpb24oLTEsIC0xKTsKLQotCXByaXZhdGUgRGltZW5zaW9uIHByZWZTaXplRGltZW5zaW9uID0gbmV3IERpbWVuc2lvbigtMSwgLTEpOwotCi0JcHJpdmF0ZSBpbnQgd3JhcFdpZHRoOwotCi0JcHVibGljIFdyYXBwYWJsZUxhYmVsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIExhYmVsIHdpdGggcGFzc2VkIFN0cmluZyBhcyBpdHMgdGV4dC4KLQkgKiAKLQkgKiBAcGFyYW0gcwotCSAqICAgICAgICAgICAgdGhlIGxhYmVsIHRleHQKLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIFdyYXBwYWJsZUxhYmVsKFN0cmluZyBzKSB7Ci0JCXNldFRleHQocyk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgV3JhcHBlZExhYmVsIHdpdGggcGFzc2VkIEltYWdlIGFzIGl0cyBpY29uLgotCSAqIAotCSAqIEBwYXJhbSBpCi0JICogICAgICAgICAgICB0aGUgV3JhcHBlZExhYmVsIGltYWdlCi0JICogQHNpbmNlIDIuMAotCSAqLwotCXB1YmxpYyBXcmFwcGFibGVMYWJlbChJbWFnZSBpKSB7Ci0JCXNldEljb24oaSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgV3JhcHBlZExhYmVsIHdpdGggcGFzc2VkIFN0cmluZyBhcyB0ZXh0IGFuZCBwYXNzZWQgSW1hZ2UgYXMKLQkgKiBpdHMgaWNvbi4KLQkgKiAKLQkgKiBAcGFyYW0gcwotCSAqICAgICAgICAgICAgdGhlIFdyYXBwZWRMYWJlbCB0ZXh0Ci0JICogQHBhcmFtIGkKLQkgKiAgICAgICAgICAgIHRoZSBXcmFwcGVkTGFiZWwgaW1hZ2UKLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIFdyYXBwYWJsZUxhYmVsKFN0cmluZyBzLCBJbWFnZSBpKSB7Ci0JCXNldFRleHQocyk7Ci0JCXNldEljb24oaSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFsaWduT25IZWlnaHQoUG9pbnQgbG9jLCBEaW1lbnNpb24gc2l6ZSwgaW50IGFsaWdubWVudCkgewotCQlJbnNldHMgaW5zZXRzID0gZ2V0SW5zZXRzKCk7Ci0JCXN3aXRjaCAoYWxpZ25tZW50KSB7Ci0JCWNhc2UgVE9QOgotCQkJbG9jLnkgPSBpbnNldHMudG9wOwotCQkJYnJlYWs7Ci0JCWNhc2UgQk9UVE9NOgotCQkJbG9jLnkgPSBib3VuZHMuaGVpZ2h0IC0gc2l6ZS5oZWlnaHQgLSBpbnNldHMuYm90dG9tOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlsb2MueSA9IChib3VuZHMuaGVpZ2h0IC0gc2l6ZS5oZWlnaHQpIC8gMjsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBhbGlnbk9uV2lkdGgoUG9pbnQgbG9jLCBEaW1lbnNpb24gc2l6ZSwgaW50IGFsaWdubWVudCkgewotCQlJbnNldHMgaW5zZXRzID0gZ2V0SW5zZXRzKCk7Ci0JCXN3aXRjaCAoYWxpZ25tZW50KSB7Ci0JCWNhc2UgTEVGVDoKLQkJCWxvYy54ID0gaW5zZXRzLmxlZnQ7Ci0JCQlicmVhazsKLQkJY2FzZSBSSUdIVDoKLQkJCWxvYy54ID0gYm91bmRzLndpZHRoIC0gc2l6ZS53aWR0aCAtIGluc2V0cy5yaWdodDsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJbG9jLnggPSAoYm91bmRzLndpZHRoIC0gc2l6ZS53aWR0aCkgLyAyOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNhbGN1bGF0ZUFsaWdubWVudCgpIHsKLQkJc3dpdGNoICh0ZXh0UGxhY2VtZW50KSB7Ci0JCWNhc2UgRUFTVDoKLQkJY2FzZSBXRVNUOgotCQkJYWxpZ25PbkhlaWdodCh0ZXh0TG9jYXRpb24sIGdldFRleHRTaXplKCksIHRleHRBbGlnbm1lbnQpOwotCQkJYWxpZ25PbkhlaWdodChpY29uTG9jYXRpb24sIGljb25TaXplLCBpY29uQWxpZ25tZW50KTsKLQkJCWJyZWFrOwotCQljYXNlIE5PUlRIOgotCQljYXNlIFNPVVRIOgotCQkJYWxpZ25PbldpZHRoKHRleHRMb2NhdGlvbiwgZ2V0U3ViU3RyaW5nVGV4dFNpemUoKSwgdGV4dEFsaWdubWVudCk7Ci0JCQlhbGlnbk9uV2lkdGgoaWNvbkxvY2F0aW9uLCBpY29uU2l6ZSwgaWNvbkFsaWdubWVudCk7Ci0JCQlicmVhazsKLQkJfQotCX0KLQotCS8qKgotCSAqIENhbGN1bGF0ZXMgdGhlIHNpemUgb2YgdGhlIFdyYXBwZWRMYWJlbCB1c2luZyB0aGUgcGFzc2VkIERpbWVuc2lvbiBhcyB0aGUKLQkgKiBzaXplIG9mIHRoZSBXcmFwcGVkTGFiZWwncyB0ZXh0LgotCSAqIAotCSAqIEBwYXJhbSB0eHRTaXplCi0JICogICAgICAgICAgICB0aGUgcHJlY2FsY3VsYXRlZCBzaXplIG9mIHRoZSBXcmFwcGVkTGFiZWwncyB0ZXh0Ci0JICogQHJldHVybiB0aGUgV3JhcHBlZExhYmVsJ3Mgc2l6ZQotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwcm90ZWN0ZWQgRGltZW5zaW9uIGNhbGN1bGF0ZUxhYmVsU2l6ZShEaW1lbnNpb24gdHh0U2l6ZSkgewotCQlpbnQgZ2FwID0gaWNvblRleHRHYXA7Ci0JCWlmIChnZXRJY29uKCkgPT0gbnVsbCB8fCBnZXRUZXh0KCkuZXF1YWxzKCIiKSkgLy8kTk9OLU5MUy0xJAotCQkJZ2FwID0gMDsKLQkJRGltZW5zaW9uIGQgPSBuZXcgRGltZW5zaW9uKDAsIDApOwotCQlpZiAodGV4dFBsYWNlbWVudCA9PSBXRVNUIHx8IHRleHRQbGFjZW1lbnQgPT0gRUFTVCkgewotCQkJZC53aWR0aCA9IGljb25TaXplLndpZHRoICsgZ2FwICsgdHh0U2l6ZS53aWR0aDsKLQkJCWQuaGVpZ2h0ID0gTWF0aC5tYXgoaWNvblNpemUuaGVpZ2h0LCB0eHRTaXplLmhlaWdodCk7Ci0JCX0gZWxzZSB7Ci0JCQlkLndpZHRoID0gTWF0aC5tYXgoaWNvblNpemUud2lkdGgsIHR4dFNpemUud2lkdGgpOwotCQkJZC5oZWlnaHQgPSBpY29uU2l6ZS5oZWlnaHQgKyBnYXAgKyB0eHRTaXplLmhlaWdodDsKLQkJfQotCQlyZXR1cm4gZDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY2FsY3VsYXRlTG9jYXRpb25zKCkgewotCQl0ZXh0TG9jYXRpb24gPSBuZXcgUG9pbnQoKTsKLQkJaWNvbkxvY2F0aW9uID0gbmV3IFBvaW50KCk7Ci0KLQkJY2FsY3VsYXRlUGxhY2VtZW50KCk7Ci0JCWNhbGN1bGF0ZUFsaWdubWVudCgpOwotCQlEaW1lbnNpb24gb2Zmc2V0ID0gZ2V0U2l6ZSgpLmdldERpZmZlcmVuY2UoZ2V0UHJlZmVycmVkU2l6ZSgpKTsKLQkJb2Zmc2V0LndpZHRoICs9IGdldFRleHRTaXplKCkud2lkdGggLSBnZXRTdWJTdHJpbmdUZXh0U2l6ZSgpLndpZHRoOwotCQlzd2l0Y2ggKGxhYmVsQWxpZ25tZW50KSB7Ci0JCWNhc2UgQ0VOVEVSOgotCQkJb2Zmc2V0LnNjYWxlKDAuNWYpOwotCQkJYnJlYWs7Ci0JCWNhc2UgTEVGVDoKLQkJCW9mZnNldC5zY2FsZSgwLjBmKTsKLQkJCWJyZWFrOwotCQljYXNlIFJJR0hUOgotCQkJb2Zmc2V0LnNjYWxlKDEuMGYpOwotCQkJYnJlYWs7Ci0JCWNhc2UgVE9QOgotCQkJb2Zmc2V0LmhlaWdodCA9IDA7Ci0JCQlvZmZzZXQuc2NhbGUoMC41Zik7Ci0JCQlicmVhazsKLQkJY2FzZSBCT1RUT006Ci0JCQlvZmZzZXQuaGVpZ2h0ID0gb2Zmc2V0LmhlaWdodCAqIDI7Ci0JCQlvZmZzZXQuc2NhbGUoMC41Zik7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCW9mZnNldC5zY2FsZSgwLjVmKTsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJc3dpdGNoICh0ZXh0UGxhY2VtZW50KSB7Ci0JCWNhc2UgRUFTVDoKLQkJY2FzZSBXRVNUOgotCQkJb2Zmc2V0LmhlaWdodCA9IDA7Ci0JCQlicmVhazsKLQkJY2FzZSBOT1JUSDoKLQkJY2FzZSBTT1VUSDoKLQkJCW9mZnNldC53aWR0aCA9IDA7Ci0JCQlicmVhazsKLQkJfQotCi0JCXRleHRMb2NhdGlvbi50cmFuc2xhdGUob2Zmc2V0KTsKLQkJaWNvbkxvY2F0aW9uLnRyYW5zbGF0ZShvZmZzZXQpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjYWxjdWxhdGVQbGFjZW1lbnQoKSB7Ci0JCWludCBnYXAgPSBpY29uVGV4dEdhcDsKLQkJaWYgKGljb24gPT0gbnVsbCB8fCB0ZXh0LmVxdWFscygiIikpIC8vJE5PTi1OTFMtMSQKLQkJCWdhcCA9IDA7Ci0JCUluc2V0cyBpbnNldHMgPSBnZXRJbnNldHMoKTsKLQotCQlzd2l0Y2ggKHRleHRQbGFjZW1lbnQpIHsKLQkJY2FzZSBFQVNUOgotCQkJaWNvbkxvY2F0aW9uLnggPSBpbnNldHMubGVmdDsKLQkJCXRleHRMb2NhdGlvbi54ID0gaWNvblNpemUud2lkdGggKyBnYXAgKyBpbnNldHMubGVmdDsKLQkJCWJyZWFrOwotCQljYXNlIFdFU1Q6Ci0JCQl0ZXh0TG9jYXRpb24ueCA9IGluc2V0cy5sZWZ0OwotCQkJaWNvbkxvY2F0aW9uLnggPSBnZXRTdWJTdHJpbmdUZXh0U2l6ZSgpLndpZHRoICsgZ2FwICsgaW5zZXRzLmxlZnQ7Ci0JCQlicmVhazsKLQkJY2FzZSBOT1JUSDoKLQkJCXRleHRMb2NhdGlvbi55ID0gaW5zZXRzLnRvcDsKLQkJCWljb25Mb2NhdGlvbi55ID0gZ2V0VGV4dFNpemUoKS5oZWlnaHQgKyBnYXAgKyBpbnNldHMudG9wOwotCQkJYnJlYWs7Ci0JCWNhc2UgU09VVEg6Ci0JCQl0ZXh0TG9jYXRpb24ueSA9IGljb25TaXplLmhlaWdodCArIGdhcCArIGluc2V0cy50b3A7Ci0JCQlpY29uTG9jYXRpb24ueSA9IGluc2V0cy50b3A7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDYWxjdWxhdGVzIHRoZSBzaXplIG9mIHRoZSBMYWJlbCdzIHRleHQgc2l6ZS4gVGhlIHRleHQgc2l6ZSBjYWxjdWxhdGVkCi0JICogdGFrZXMgaW50byBjb25zaWRlcmF0aW9uIGlmIHRoZSBMYWJlbCdzIHRleHQgaXMgY3VycmVudGx5IHRydW5jYXRlZC4gSWYKLQkgKiB0ZXh0IHNpemUgd2l0aG91dCBjb25zaWRlcmluZyBjdXJyZW50IHRydW5jYXRpb24gaXMgZGVzaXJlZCwgdXNlCi0JICoge0BsaW5rICNjYWxjdWxhdGVUZXh0U2l6ZSgpfS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBzaXplIG9mIHRoZSBsYWJlbCdzIHRleHQsIHRha2luZyBpbnRvIGFjY291bnQgdHJ1bmNhdGlvbgotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwcm90ZWN0ZWQgRGltZW5zaW9uIGNhbGN1bGF0ZVN1YlN0cmluZ1RleHRTaXplKCkgewotCQlyZXR1cm4gRmlndXJlVXRpbGl0aWVzLmdldFRleHRFeHRlbnRzKGdldFN1YlN0cmluZ1RleHQoKSwgZ2V0Rm9udCgpKTsKLQl9Ci0KLQkvKioKLQkgKiBDYWxjdWxhdGVzIGFuZCByZXR1cm5zIHRoZSBzaXplIG9mIHRoZSBMYWJlbCdzIHRleHQuIE5vdGUgdGhhdCB0aGlzCi0JICogRGltZW5zaW9uIGlzIGNhbGN1bGF0ZWQgdXNpbmcgdGhlIExhYmVsJ3MgZnVsbCB0ZXh0LCByZWdhcmRsZXNzIG9mCi0JICogd2hldGhlciBvciBub3QgaXRzIHRleHQgaXMgY3VycmVudGx5IHRydW5jYXRlZC4gSWYgdGV4dCBzaXplIGNvbnNpZGVyaW5nCi0JICogY3VycmVudCB0cnVuY2F0aW9uIGlzIGRlc2lyZWQsIHVzZSB7QGxpbmsgI2NhbGN1bGF0ZVN1YlN0cmluZ1RleHRTaXplKCl9LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHNpemUgb2YgdGhlIGxhYmVsJ3MgdGV4dCwgaWdub3JpbmcgdHJ1bmNhdGlvbgotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwcm90ZWN0ZWQgRGltZW5zaW9uIGNhbGN1bGF0ZVRleHRTaXplKCkgewotCQkvLyByZXR1cm4gRmlndXJlVXRpbGl0aWVzLmdldFRleHRFeHRlbnRzKGdldFRleHQoKSwgZ2V0Rm9udCgpKTsKLQkJcmV0dXJuIEZpZ3VyZVV0aWxpdGllcy5nZXRUZXh0RXh0ZW50cyhnZXRXcmFwcGVkVGV4dChnZXRTaXplKCkud2lkdGgsCi0JCQkJZ2V0U2l6ZSgpLmhlaWdodCksIGdldEZvbnQoKSk7Ci0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgY2xlYXJMb2NhdGlvbnMoKSB7Ci0JCWljb25Mb2NhdGlvbiA9IHRleHRMb2NhdGlvbiA9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgTGFiZWwncyBpY29uLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGxhYmVsIGljb24KLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIEltYWdlIGdldEljb24oKSB7Ci0JCXJldHVybiBpY29uOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGN1cnJlbnQgYWxpZ25tZW50IG9mIHRoZSBMYWJlbCdzIGljb24uIFRoZSBkZWZhdWx0IGlzCi0JICoge0BsaW5rIFBvc2l0aW9uQ29uc3RhbnRzI0NFTlRFUn0uCi0JICogCi0JICogQHJldHVybiB0aGUgaWNvbiBhbGlnbm1lbnQKLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIGludCBnZXRJY29uQWxpZ25tZW50KCkgewotCQlyZXR1cm4gaWNvbkFsaWdubWVudDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBib3VuZHMgb2YgdGhlIExhYmVsJ3MgaWNvbi4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBpY29uJ3MgYm91bmRzCi0JICogQHNpbmNlIDIuMAotCSAqLwotCXB1YmxpYyBSZWN0YW5nbGUgZ2V0SWNvbkJvdW5kcygpIHsKLQkJUmVjdGFuZ2xlIGJvdW5kcyA9IGdldEJvdW5kcygpOwotCQlyZXR1cm4gbmV3IFJlY3RhbmdsZShib3VuZHMuZ2V0TG9jYXRpb24oKS50cmFuc2xhdGUoZ2V0SWNvbkxvY2F0aW9uKCkpLAotCQkJCWljb25TaXplKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBsb2NhdGlvbiBvZiB0aGUgTGFiZWwncyBpY29uIHJlbGF0aXZlIHRvIHRoZSBMYWJlbC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBpY29uJ3MgbG9jYXRpb24KLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHJvdGVjdGVkIFBvaW50IGdldEljb25Mb2NhdGlvbigpIHsKLQkJaWYgKGljb25Mb2NhdGlvbiA9PSBudWxsKQotCQkJY2FsY3VsYXRlTG9jYXRpb25zKCk7Ci0JCXJldHVybiBpY29uTG9jYXRpb247Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZ2FwIGluIHBpeGVscyBiZXR3ZWVuIHRoZSBMYWJlbCdzIGljb24gYW5kIGl0cyB0ZXh0LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGdhcAotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgaW50IGdldEljb25UZXh0R2FwKCkgewotCQlyZXR1cm4gaWNvblRleHRHYXA7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJRmlndXJlI2dldE1pbmltdW1TaXplKGludCwgaW50KQotCSAqLwotCXB1YmxpYyBEaW1lbnNpb24gZ2V0TWluaW11bVNpemUoaW50IHcsIGludCBoKSB7Ci0JCWlmIChtaW5TaXplICE9IG51bGwpCi0JCQlyZXR1cm4gbWluU2l6ZTsKLQkJbWluU2l6ZSA9IG5ldyBEaW1lbnNpb24oKTsKLQkJaWYgKGdldExheW91dE1hbmFnZXIoKSAhPSBudWxsKQotCQkJbWluU2l6ZS5zZXRTaXplKGdldExheW91dE1hbmFnZXIoKS5nZXRNaW5pbXVtU2l6ZSh0aGlzLCB3LCBoKSk7Ci0KLQkJRGltZW5zaW9uIGxhYmVsU2l6ZSA9IGNhbGN1bGF0ZUxhYmVsU2l6ZShGaWd1cmVVdGlsaXRpZXMKLQkJCQkuZ2V0VGV4dEV4dGVudHMoRUxMSVBTSVMsIGdldEZvbnQoKSkuaW50ZXJzZWN0KAotCQkJCQkJRmlndXJlVXRpbGl0aWVzLmdldFRleHRFeHRlbnRzKGdldFRleHQoKSwgZ2V0Rm9udCgpKSkpOwotCQlJbnNldHMgaW5zZXRzID0gZ2V0SW5zZXRzKCk7Ci0JCWxhYmVsU2l6ZS5leHBhbmQoaW5zZXRzLmdldFdpZHRoKCksIGluc2V0cy5nZXRIZWlnaHQoKSk7Ci0JCW1pblNpemUudW5pb24obGFiZWxTaXplKTsKLQkJcmV0dXJuIG1pblNpemU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJRmlndXJlI2dldFByZWZlcnJlZFNpemUoaW50LCBpbnQpCi0JICovCi0JcHVibGljIERpbWVuc2lvbiBnZXRQcmVmZXJyZWRTaXplKGludCB3SGludCwgaW50IGhIaW50KSB7Ci0JCWlmIChwcmVmU2l6ZSA9PSBudWxsIHx8IHdIaW50ICE9IHByZWZTaXplRGltZW5zaW9uLndpZHRoCi0JCQkJfHwgaEhpbnQgIT0gcHJlZlNpemVEaW1lbnNpb24uaGVpZ2h0KSB7Ci0JCQlwcmVmU2l6ZSA9IGNhbGN1bGF0ZUxhYmVsU2l6ZShnZXRUZXh0U2l6ZSh3SGludCwgaEhpbnQpKTsKLQkJCUluc2V0cyBpbnNldHMgPSBnZXRJbnNldHMoKTsKLQkJCXByZWZTaXplLmV4cGFuZChpbnNldHMuZ2V0V2lkdGgoKSwgaW5zZXRzLmdldEhlaWdodCgpKTsKLQkJCWlmIChnZXRMYXlvdXRNYW5hZ2VyKCkgIT0gbnVsbCkKLQkJCQlwcmVmU2l6ZS51bmlvbihnZXRMYXlvdXRNYW5hZ2VyKCkuZ2V0UHJlZmVycmVkU2l6ZSh0aGlzLCB3SGludCwKLQkJCQkJCWhIaW50KSk7Ci0JCX0KLQkJaWYgKHdIaW50ID49IDAgJiYgd0hpbnQgPCBwcmVmU2l6ZS53aWR0aCkgewotCQkJRGltZW5zaW9uIG1pblNpemUgPSBnZXRNaW5pbXVtU2l6ZSh3SGludCwgaEhpbnQpOwotCQkJRGltZW5zaW9uIHJlc3VsdCA9IHByZWZTaXplLmdldENvcHkoKTsKLQkJCXJlc3VsdC53aWR0aCA9IE1hdGgubWluKHJlc3VsdC53aWR0aCwgd0hpbnQpOwotCQkJcmVzdWx0LndpZHRoID0gTWF0aC5tYXgobWluU2l6ZS53aWR0aCwgcmVzdWx0LndpZHRoKTsKLQkJCXByZWZTaXplRGltZW5zaW9uLndpZHRoID0gcmVzdWx0LndpZHRoOwotCQkJcHJlZlNpemVEaW1lbnNpb24uaGVpZ2h0ID0gcmVzdWx0LndpZHRoOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQlyZXR1cm4gcHJlZlNpemU7Ci0JfQotCi0JLyoqCi0JICogQ2FsY3VsYXRlcyB0aGUgYW1vdW50IG9mIHRoZSBMYWJlbCdzIGN1cnJlbnQgdGV4dCB3aWxsIGZpdCBpbiB0aGUgTGFiZWwsCi0JICogaW5jbHVkaW5nIGFuIGVsaXBzaXMgIi4uLiIgaWYgdHJ1bmNhdGlvbiBpcyByZXF1aXJlZC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBzdWJzdHJpbmcKLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTdWJTdHJpbmdUZXh0KCkgewotCQlpZiAoc3ViU3RyaW5nVGV4dCAhPSBudWxsKQotCQkJcmV0dXJuIHN1YlN0cmluZ1RleHQ7Ci0KLQkJc3ViU3RyaW5nVGV4dCA9IHRleHQ7Ci0JCURpbWVuc2lvbiBzaHJpbmsgPSBnZXRQcmVmZXJyZWRTaXplKGdldFNpemUoKS53aWR0aCwgZ2V0U2l6ZSgpLmhlaWdodCkKLQkJCQkuZ2V0RGlmZmVyZW5jZShnZXRTaXplKCkpOwotCQlEaW1lbnNpb24gZWZmZWN0aXZlU2l6ZSA9IGdldFRleHRTaXplKCkuZ2V0RXhwYW5kZWQoLXNocmluay53aWR0aCwKLQkJCQktc2hyaW5rLmhlaWdodCk7Ci0JCUZvbnQgY3VycmVudEZvbnQgPSBnZXRGb250KCk7Ci0JCWludCBmb250SGVpZ2h0ID0gRmlndXJlVXRpbGl0aWVzLmdldEZvbnRNZXRyaWNzKGN1cnJlbnRGb250KQotCQkJCS5nZXRIZWlnaHQoKTsKLQkJaW50IG1heExpbmVzID0gKGludCkgKGVmZmVjdGl2ZVNpemUuaGVpZ2h0IC8gKGRvdWJsZSkgZm9udEhlaWdodCk7Ci0KLQkJU3RyaW5nQnVmZmVyIGFjY3VtbGF0ZWRUZXh0ID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlTdHJpbmdCdWZmZXIgcmVtYWluaW5nVGV4dCA9IG5ldyBTdHJpbmdCdWZmZXIoZ2V0VGV4dCgpKTsKLQkJaW50IGkgPSAwLCBqID0gMDsKLQotCQl3aGlsZSAocmVtYWluaW5nVGV4dC5sZW5ndGgoKSA+IDAgJiYgaisrIDwgbWF4TGluZXMpIHsKLQkJCWkgPSBnZXRMaW5lV3JhcFBvc2l0aW9uKHJlbWFpbmluZ1RleHQudG9TdHJpbmcoKSwgY3VycmVudEZvbnQsCi0JCQkJCWVmZmVjdGl2ZVNpemUud2lkdGgpOwotCi0JCQlpZiAoYWNjdW1sYXRlZFRleHQubGVuZ3RoKCkgPiAwKQotCQkJCWFjY3VtbGF0ZWRUZXh0LmFwcGVuZCgiXG4iKTsgLy8kTk9OLU5MUy0xJAotCi0JCQlpZiAoaSA9PSAwIHx8IChyZW1haW5pbmdUZXh0Lmxlbmd0aCgpID4gaSAmJiBqID09IG1heExpbmVzKSkgewotCQkJCWludCBkb3RzV2lkdGggPSBGaWd1cmVVdGlsaXRpZXMuZ2V0VGV4dEV4dGVudHMoRUxMSVBTSVMsCi0JCQkJCQljdXJyZW50Rm9udCkud2lkdGg7Ci0JCQkJaSA9IGdldExhcmdlc3RTdWJzdHJpbmdDb25maW5lZFRvKHJlbWFpbmluZ1RleHQudG9TdHJpbmcoKSwKLQkJCQkJCWN1cnJlbnRGb250LCBNYXRoLm1heChlZmZlY3RpdmVTaXplLndpZHRoIC0gZG90c1dpZHRoLAotCQkJCQkJCQkwKSk7Ci0JCQkJYWNjdW1sYXRlZFRleHQuYXBwZW5kKHJlbWFpbmluZ1RleHQuc3Vic3RyaW5nKDAsIGkpKTsKLQkJCQlhY2N1bWxhdGVkVGV4dC5hcHBlbmQoRUxMSVBTSVMpOwotCQkJfSBlbHNlCi0JCQkJYWNjdW1sYXRlZFRleHQuYXBwZW5kKHJlbWFpbmluZ1RleHQuc3Vic3RyaW5nKDAsIGkpKTsKLQkJCXJlbWFpbmluZ1RleHQuZGVsZXRlKDAsIGkpOwotCQl9Ci0JCXJldHVybiBzdWJTdHJpbmdUZXh0ID0gYWNjdW1sYXRlZFRleHQudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaXplIG9mIHRoZSBMYWJlbCdzIGN1cnJlbnQgdGV4dC4gSWYgdGhlIHRleHQgaXMgY3VycmVudGx5Ci0JICogdHJ1bmNhdGVkLCB0aGUgdHJ1bmNhdGVkIHRleHQgd2l0aCBpdHMgZWxsaXBzaXMgaXMgdXNlZCB0byBjYWxjdWxhdGUgdGhlCi0JICogc2l6ZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBzaXplIG9mIHRoaXMgbGFiZWwncyB0ZXh0LCB0YWtpbmcgaW50byBhY2NvdW50IHRydW5jYXRpb24KLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHJvdGVjdGVkIERpbWVuc2lvbiBnZXRTdWJTdHJpbmdUZXh0U2l6ZSgpIHsKLQkJaWYgKHN1YlN0cmluZ1RleHRTaXplID09IG51bGwpCi0JCQlzdWJTdHJpbmdUZXh0U2l6ZSA9IGNhbGN1bGF0ZVN1YlN0cmluZ1RleHRTaXplKCk7Ci0JCXJldHVybiBzdWJTdHJpbmdUZXh0U2l6ZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB0ZXh0IG9mIHRoZSBsYWJlbC4gTm90ZSB0aGF0IHRoaXMgaXMgdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhlCi0JICogbGFiZWwsIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBpdCBpcyBjdXJyZW50bHkgYmVpbmcgdHJ1bmNhdGVkLiBDYWxsCi0JICoge0BsaW5rICNnZXRTdWJTdHJpbmdUZXh0KCl9IHRvIHJldHVybiB0aGUgbGFiZWwncyBjdXJyZW50IHRleHQgY29udGVudHMKLQkgKiB3aXRoIHRydW5jYXRpb24gY29uc2lkZXJlZC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgbGFiZWwKLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KCkgewotCQlyZXR1cm4gdGV4dDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjdXJyZW50IGFsaWdubWVudCBvZiB0aGUgTGFiZWwncyB0ZXh0LiBUaGUgZGVmYXVsdCB0ZXh0Ci0JICogYWxpZ25tZW50IGlzIHtAbGluayBQb3NpdGlvbkNvbnN0YW50cyNDRU5URVJ9LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHRleHQgYWxpZ25tZW50Ci0JICovCi0JcHVibGljIGludCBnZXRUZXh0QWxpZ25tZW50KCkgewotCQlyZXR1cm4gdGV4dEFsaWdubWVudDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBib3VuZHMgb2YgdGhlIGxhYmVsJ3MgdGV4dC4gTm90ZSB0aGF0IHRoZSBib3VuZHMgYXJlCi0JICogY2FsY3VsYXRlZCB1c2luZyB0aGUgbGFiZWwncyBjb21wbGV0ZSB0ZXh0IHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB0aGUKLQkgKiBsYWJlbCdzIHRleHQgaXMgY3VycmVudGx5IHRydW5jYXRlZC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBib3VuZHMgb2YgdGhpcyBsYWJlbCdzIGNvbXBsZXRlIHRleHQKLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIFJlY3RhbmdsZSBnZXRUZXh0Qm91bmRzKCkgewotCQlSZWN0YW5nbGUgYm91bmRzID0gZ2V0Qm91bmRzKCk7Ci0JCXJldHVybiBuZXcgUmVjdGFuZ2xlKGJvdW5kcy5nZXRMb2NhdGlvbigpLnRyYW5zbGF0ZShnZXRUZXh0TG9jYXRpb24oKSksCi0JCQkJdGV4dFNpemUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGxvY2F0aW9uIG9mIHRoZSBsYWJlbCdzIHRleHQgcmVsYXRpdmUgdG8gdGhlIGxhYmVsLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHRleHQgbG9jYXRpb24KLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHJvdGVjdGVkIFBvaW50IGdldFRleHRMb2NhdGlvbigpIHsKLQkJaWYgKHRleHRMb2NhdGlvbiAhPSBudWxsKQotCQkJcmV0dXJuIHRleHRMb2NhdGlvbjsKLQkJY2FsY3VsYXRlTG9jYXRpb25zKCk7Ci0JCXJldHVybiB0ZXh0TG9jYXRpb247Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY3VycmVudCBwbGFjZW1lbnQgb2YgdGhlIGxhYmVsJ3MgdGV4dCByZWxhdGl2ZSB0byBpdHMgaWNvbi4KLQkgKiBUaGUgZGVmYXVsdCB0ZXh0IHBsYWNlbWVudCBpcyB7QGxpbmsgUG9zaXRpb25Db25zdGFudHMjRUFTVH0uCi0JICogCi0JICogQHJldHVybiB0aGUgdGV4dCBwbGFjZW1lbnQKLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIGludCBnZXRUZXh0UGxhY2VtZW50KCkgewotCQlyZXR1cm4gdGV4dFBsYWNlbWVudDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaXplIG9mIHRoZSBsYWJlbCdzIGNvbXBsZXRlIHRleHQuIE5vdGUgdGhhdCB0aGUgdGV4dCB1c2VkIHRvCi0JICogbWFrZSB0aGlzIGNhbGN1bGF0aW9uIGlzIHRoZSBsYWJlbCdzIGZ1bGwgdGV4dCwgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZQotCSAqIGxhYmVsJ3MgdGV4dCBpcyBjdXJyZW50bHkgYmVpbmcgdHJ1bmNhdGVkIGFuZCBpcyBkaXNwbGF5aW5nIGFuIGVsbGlwc2lzLgotCSAqIElmIHRoZSBzaXplIGNvbnNpZGVyaW5nIGN1cnJlbnQgdHJ1bmNhdGlvbiBpcyBkZXNpcmVkLCBjYWxsCi0JICoge0BsaW5rICNnZXRTdWJTdHJpbmdUZXh0U2l6ZSgpfS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBzaXplIG9mIHRoaXMgbGFiZWwncyBjb21wbGV0ZSB0ZXh0Ci0JICogQHNpbmNlIDIuMAotCSAqLwotCXByb3RlY3RlZCBEaW1lbnNpb24gZ2V0VGV4dFNpemUoKSB7Ci0JCWlmICh0ZXh0U2l6ZSA9PSBudWxsKQotCQkJdGV4dFNpemUgPSBjYWxjdWxhdGVUZXh0U2l6ZSgpOwotCQlyZXR1cm4gdGV4dFNpemU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2l6ZSBvZiB0aGUgbGFiZWwncyBjb21wbGV0ZSB0ZXh0LiBOb3RlIHRoYXQgdGhlIHRleHQgdXNlZCB0bwotCSAqIG1ha2UgdGhpcyBjYWxjdWxhdGlvbiBpcyB0aGUgbGFiZWwncyBmdWxsIHRleHQsIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB0aGUKLQkgKiBsYWJlbCdzIHRleHQgaXMgY3VycmVudGx5IGJlaW5nIHRydW5jYXRlZCBhbmQgaXMgZGlzcGxheWluZyBhbiBlbGxpcHNpcy4KLQkgKiBJZiB0aGUgc2l6ZSBjb25zaWRlcmluZyBjdXJyZW50IHRydW5jYXRpb24gaXMgZGVzaXJlZCwgY2FsbAotCSAqIHtAbGluayAjZ2V0U3ViU3RyaW5nVGV4dFNpemUoKX0uCi0JICogCi0JICogQHJldHVybiB0aGUgc2l6ZSBvZiB0aGlzIGxhYmVsJ3MgY29tcGxldGUgdGV4dAotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwcm90ZWN0ZWQgRGltZW5zaW9uIGdldFRleHRTaXplKGludCB3aWR0aCwgaW50IGhlaWdodCkgewotCQlpZiAodGV4dFNpemUgPT0gbnVsbCkgewotCQkJdGV4dFNpemUgPSBjYWxjdWxhdGVUZXh0U2l6ZSh3aWR0aCwgaGVpZ2h0KTsKLQkJCXRleHREaW1lbnNpb24ud2lkdGggPSB3aWR0aDsKLQkJCXRleHREaW1lbnNpb24uaGVpZ2h0ID0gaGVpZ2h0OwotCQl9Ci0JCXJldHVybiB0ZXh0U2l6ZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElGaWd1cmUjaW52YWxpZGF0ZSgpCi0JICovCi0JcHVibGljIHZvaWQgaW52YWxpZGF0ZSgpIHsKLQkJcHJlZlNpemUgPSBudWxsOwotCQltaW5TaXplID0gbnVsbDsKLQkJY2xlYXJMb2NhdGlvbnMoKTsKLQkJdGV4dFNpemUgPSBudWxsOwotCQlzdWJTdHJpbmdUZXh0U2l6ZSA9IG51bGw7Ci0JCXN1YlN0cmluZ1RleHQgPSBudWxsOwotCQlzdXBlci5pbnZhbGlkYXRlKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgbGFiZWwncyB0ZXh0IGlzIGN1cnJlbnRseSB0cnVuY2F0ZWQKLQkgKiBhbmQgaXMgZGlzcGxheWluZyBhbiBlbGxpcHNpcywgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBsYWJlbCdzIHRleHQgaXMgdHJ1bmNhdGVkCi0JICogQHNpbmNlIDIuMAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzVGV4dFRydW5jYXRlZCgpIHsKLQkJcmV0dXJuICFnZXRTdWJTdHJpbmdUZXh0U2l6ZSgpLmVxdWFscyhnZXRUZXh0U2l6ZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIEZpZ3VyZSNwYWludEZpZ3VyZShHcmFwaGljcykKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwYWludEZpZ3VyZShHcmFwaGljcyBncmFwaGljcykgewotCQlpZiAoaXNTZWxlY3RlZCgpKSB7Ci0JCQlncmFwaGljcy5wdXNoU3RhdGUoKTsKLQkJCWdyYXBoaWNzLnNldEJhY2tncm91bmRDb2xvcihDb2xvckNvbnN0YW50cy5tZW51QmFja2dyb3VuZFNlbGVjdGVkKTsKLQkJCWdyYXBoaWNzLmZpbGxSZWN0YW5nbGUoZ2V0U2VsZWN0aW9uUmVjdGFuZ2xlKCkpOwotCQkJZ3JhcGhpY3MucG9wU3RhdGUoKTsKLQkJCWdyYXBoaWNzLnNldEZvcmVncm91bmRDb2xvcihDb2xvckNvbnN0YW50cy53aGl0ZSk7Ci0JCX0KLQkJaWYgKGhhc0ZvY3VzKCkpIHsKLQkJCWdyYXBoaWNzLnB1c2hTdGF0ZSgpOwotCQkJZ3JhcGhpY3Muc2V0WE9STW9kZSh0cnVlKTsKLQkJCWdyYXBoaWNzLnNldEZvcmVncm91bmRDb2xvcihDb2xvckNvbnN0YW50cy5tZW51QmFja2dyb3VuZFNlbGVjdGVkKTsKLQkJCWdyYXBoaWNzLnNldEJhY2tncm91bmRDb2xvcihDb2xvckNvbnN0YW50cy53aGl0ZSk7Ci0JCQlncmFwaGljcy5kcmF3Rm9jdXMoZ2V0U2VsZWN0aW9uUmVjdGFuZ2xlKCkucmVzaXplKC0xLCAtMSkpOwotCQkJZ3JhcGhpY3MucG9wU3RhdGUoKTsKLQkJfQotCQlpZiAoaXNPcGFxdWUoKSkKLQkJCXN1cGVyLnBhaW50RmlndXJlKGdyYXBoaWNzKTsKLQkJUmVjdGFuZ2xlIGJvdW5kcyA9IGdldEJvdW5kcygpOwotCQlncmFwaGljcy50cmFuc2xhdGUoYm91bmRzLngsIGJvdW5kcy55KTsKLQkJaWYgKGljb24gIT0gbnVsbCkKLQkJCWdyYXBoaWNzLmRyYXdJbWFnZShpY29uLCBnZXRJY29uTG9jYXRpb24oKSk7Ci0KLQkJaWYgKCFpc0VuYWJsZWQoKSkgewotCQkJZ3JhcGhpY3MudHJhbnNsYXRlKDEsIDEpOwotCQkJZ3JhcGhpY3Muc2V0Rm9yZWdyb3VuZENvbG9yKENvbG9yQ29uc3RhbnRzLmJ1dHRvbkxpZ2h0ZXN0KTsKLQkJCWdyYXBoaWNzZHJhd1RleHQoZ3JhcGhpY3MpOwotCQkJZ3JhcGhpY3MuZHJhd1RleHQoZ2V0U3ViU3RyaW5nVGV4dCgpLCBnZXRUZXh0TG9jYXRpb24oKSk7Ci0JCQlncmFwaGljcy50cmFuc2xhdGUoLTEsIC0xKTsKLQkJCWdyYXBoaWNzLnNldEZvcmVncm91bmRDb2xvcihDb2xvckNvbnN0YW50cy5idXR0b25EYXJrZXIpOwotCQl9Ci0JCWdyYXBoaWNzZHJhd1RleHQoZ3JhcGhpY3MpOwotCQlncmFwaGljcy50cmFuc2xhdGUoLWJvdW5kcy54LCAtYm91bmRzLnkpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGxhYmVsJ3MgaWNvbiB0byB0aGUgcGFzc2VkIGltYWdlLgotCSAqIAotCSAqIEBwYXJhbSBpbWFnZQotCSAqICAgICAgICAgICAgdGhlIG5ldyBsYWJlbCBpbWFnZQotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJY29uKEltYWdlIGltYWdlKSB7Ci0JCWlmIChpY29uID09IGltYWdlKQotCQkJcmV0dXJuOwotCQlpY29uID0gaW1hZ2U7Ci0JCS8vIENhbGwgcmVwYWludCwgaW4gY2FzZSB0aGUgaW1hZ2UgZGltZW5zaW9ucyBhcmUgdGhlIHNhbWUuCi0JCXJlcGFpbnQoKTsKLQkJaWYgKGljb24gPT0gbnVsbCkKLQkJCXNldEljb25EaW1lbnNpb24obmV3IERpbWVuc2lvbigpKTsKLQkJZWxzZQotCQkJc2V0SWNvbkRpbWVuc2lvbihuZXcgRGltZW5zaW9uKGltYWdlKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2Qgc2V0cyB0aGUgYWxpZ25tZW50IG9mIHRoZSBpY29uIHdpdGhpbiB0aGUgaWNvbiBkaW1lbnNpb24uIFRoZQotCSAqIGRpbWVuc2lvbiBzaG91bGQgYmUgdGhlIHNhbWUgc2l6ZSBhcyB0aGUgSW1hZ2UgaXRzZWxmLCBzbyBjYWxsaW5nIHRoaXMKLQkgKiBtZXRob2Qgc2hvdWxkIGhhdmUgbm8gYWZmZWN0LgotCSAqIAotCSAqIEBwYXJhbSBhbGlnbgotCSAqICAgICAgICAgICAgdGhlIGljb24gYWxpZ25tZW50Ci0JICogQHNpbmNlIDIuMAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEljb25BbGlnbm1lbnQoaW50IGFsaWduKSB7Ci0JCWlmIChpY29uQWxpZ25tZW50ID09IGFsaWduKQotCQkJcmV0dXJuOwotCQlpY29uQWxpZ25tZW50ID0gYWxpZ247Ci0JCWNsZWFyTG9jYXRpb25zKCk7Ci0JCXJlcGFpbnQoKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBsYWJlbCdzIGljb24gc2l6ZSB0byB0aGUgcGFzc2VkIERpbWVuc2lvbi4KLQkgKiAKLQkgKiBAcGFyYW0gZAotCSAqICAgICAgICAgICAgdGhlIG5ldyBpY29uIHNpemUKLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIHZvaWQgc2V0SWNvbkRpbWVuc2lvbihEaW1lbnNpb24gZCkgewotCQlpZiAoZC5lcXVhbHMoaWNvblNpemUpKQotCQkJcmV0dXJuOwotCQlpY29uU2l6ZSA9IGQ7Ci0JCXJldmFsaWRhdGUoKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBnYXAgaW4gcGl4ZWxzIGJldHdlZW4gdGhlIGxhYmVsJ3MgaWNvbiBhbmQgdGV4dCB0byB0aGUgcGFzc2VkCi0JICogdmFsdWUuIFRoZSBkZWZhdWx0IGlzIDQuCi0JICogCi0JICogQHBhcmFtIGdhcAotCSAqICAgICAgICAgICAgdGhlIGdhcAotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJY29uVGV4dEdhcChpbnQgZ2FwKSB7Ci0JCWlmIChpY29uVGV4dEdhcCA9PSBnYXApCi0JCQlyZXR1cm47Ci0JCWljb25UZXh0R2FwID0gZ2FwOwotCQlyZXBhaW50KCk7Ci0JCXJldmFsaWRhdGUoKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBhbGlnbm1lbnQgb2YgdGhlIGVudGlyZSBsYWJlbCAoaWNvbiBhbmQgdGV4dCkuIElmIHRoaXMgZmlndXJlJ3MKLQkgKiBib3VuZHMgYXJlIGxhcmdlciB0aGFuIHRoZSBzaXplIG5lZWRlZCB0byBkaXNwbGF5IHRoZSBsYWJlbCwgdGhlIGxhYmVsCi0JICogd2lsbCBiZSBhbGlnbmVkIGFjY29yZGluZ2x5LiBWYWxpZCB2YWx1ZXMgYXJlOgotCSAqIDxVTD4KLQkgKiA8TEk+PEVNPntAbGluayBQb3NpdGlvbkNvbnN0YW50cyNDRU5URVJ9PC9FTT4KLQkgKiA8TEk+e0BsaW5rIFBvc2l0aW9uQ29uc3RhbnRzI1RPUH0KLQkgKiA8TEk+e0BsaW5rIFBvc2l0aW9uQ29uc3RhbnRzI0JPVFRPTX0KLQkgKiA8TEk+e0BsaW5rIFBvc2l0aW9uQ29uc3RhbnRzI0xFRlR9Ci0JICogPExJPntAbGluayBQb3NpdGlvbkNvbnN0YW50cyNSSUdIVH0KLQkgKiA8L1VMPgotCSAqIAotCSAqIEBwYXJhbSBhbGlnbgotCSAqICAgICAgICAgICAgbGFiZWwgYWxpZ25tZW50Ci0JICovCi0JcHVibGljIHZvaWQgc2V0TGFiZWxBbGlnbm1lbnQoaW50IGFsaWduKSB7Ci0JCWlmIChsYWJlbEFsaWdubWVudCA9PSBhbGlnbikKLQkJCXJldHVybjsKLQkJbGFiZWxBbGlnbm1lbnQgPSBhbGlnbjsKLQkJY2xlYXJMb2NhdGlvbnMoKTsKLQkJcmVwYWludCgpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGxhYmVsJ3MgdGV4dC4KLQkgKiAKLQkgKiBAcGFyYW0gcwotCSAqICAgICAgICAgICAgdGhlIG5ldyBsYWJlbCB0ZXh0Ci0JICogQHNpbmNlIDIuMAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRleHQoU3RyaW5nIHMpIHsKLQkJLy8gInRleHQiIHdpbGwgbmV2ZXIgYmUgbnVsbC4KLQkJaWYgKHMgPT0gbnVsbCkKLQkJCXMgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQlpZiAodGV4dC5lcXVhbHMocykpCi0JCQlyZXR1cm47Ci0JCXRleHQgPSBzOwotCQlyZXZhbGlkYXRlKCk7Ci0JCXJlcGFpbnQoKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBhbGlnbm1lbnQgb2YgdGhlIFRleHQgcmVsYXRpdmUgdG8gdGhlIGljb24uIFRoZSB0ZXh0IGFsaWdubWVudAotCSAqIG11c3QgYmUgb3J0aG9nb25hbCB0byB0aGUgdGV4dCBwbGFjZW1lbnQuIEZvciBleGFtcGxlLCBpZiB0aGUgcGxhY2VtZW50Ci0JICogaXMgRUFTVCwgdGhlbiB0aGUgdGV4dCBjYW4gYmUgYWxpZ25lZCB1c2luZyBUT1AsIENFTlRFUiwgb3IgQk9UVE9NLiBWYWxpZAotCSAqIHZhbHVlcyBhcmU6Ci0JICogPFVMPgotCSAqIDxMST48RU0+e0BsaW5rIFBvc2l0aW9uQ29uc3RhbnRzI0NFTlRFUn08L0VNPgotCSAqIDxMST57QGxpbmsgUG9zaXRpb25Db25zdGFudHMjVE9QfQotCSAqIDxMST57QGxpbmsgUG9zaXRpb25Db25zdGFudHMjQk9UVE9NfQotCSAqIDxMST57QGxpbmsgUG9zaXRpb25Db25zdGFudHMjTEVGVH0KLQkgKiA8TEk+e0BsaW5rIFBvc2l0aW9uQ29uc3RhbnRzI1JJR0hUfQotCSAqIDwvVUw+Ci0JICogCi0JICogQHNlZSAjc2V0TGFiZWxBbGlnbm1lbnQoaW50KQotCSAqIEBwYXJhbSBhbGlnbgotCSAqICAgICAgICAgICAgdGhlIHRleHQgYWxpZ25tZW50Ci0JICogQHNpbmNlIDIuMAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRleHRBbGlnbm1lbnQoaW50IGFsaWduKSB7Ci0JCWlmICh0ZXh0QWxpZ25tZW50ID09IGFsaWduKQotCQkJcmV0dXJuOwotCQl0ZXh0QWxpZ25tZW50ID0gYWxpZ247Ci0JCWNsZWFyTG9jYXRpb25zKCk7Ci0JCXJlcGFpbnQoKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBwbGFjZW1lbnQgb2YgdGV4dCByZWxhdGl2ZSB0byB0aGUgbGFiZWwncyBpY29uLiBWYWxpZCB2YWx1ZXMKLQkgKiBhcmU6Ci0JICogPFVMPgotCSAqIDxMST48RU0+e0BsaW5rIFBvc2l0aW9uQ29uc3RhbnRzI0VBU1R9PC9FTT4KLQkgKiA8TEk+e0BsaW5rIFBvc2l0aW9uQ29uc3RhbnRzI05PUlRIfQotCSAqIDxMST57QGxpbmsgUG9zaXRpb25Db25zdGFudHMjU09VVEh9Ci0JICogPExJPntAbGluayBQb3NpdGlvbkNvbnN0YW50cyNXRVNUfQotCSAqIDwvVUw+Ci0JICogCi0JICogQHBhcmFtIHdoZXJlCi0JICogICAgICAgICAgICB0aGUgdGV4dCBwbGFjZW1lbnQKLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIHZvaWQgc2V0VGV4dFBsYWNlbWVudChpbnQgd2hlcmUpIHsKLQkJaWYgKHRleHRQbGFjZW1lbnQgPT0gd2hlcmUpCi0JCQlyZXR1cm47Ci0JCXRleHRQbGFjZW1lbnQgPSB3aGVyZTsKLQkJcmV2YWxpZGF0ZSgpOwotCQlyZXBhaW50KCk7Ci0JfQotCi0JcHJpdmF0ZSBSZWN0YW5nbGUgZ2V0U2VsZWN0aW9uUmVjdGFuZ2xlKCkgewotCQlSZWN0YW5nbGUgYm91bmRzID0gZ2V0VGV4dEJvdW5kcygpOwotCQlib3VuZHMuZXhwYW5kKG5ldyBJbnNldHMoMiwgMiwgMCwgMCkpOwotCQl0cmFuc2xhdGVUb1BhcmVudChib3VuZHMpOwotCQlib3VuZHMuaW50ZXJzZWN0KGdldEJvdW5kcygpKTsKLQkJcmV0dXJuIGJvdW5kczsKLQl9Ci0KLQkvKioKLQkgKiBDYWxjdWxhdGVzIGFuZCByZXR1cm5zIHRoZSBzaXplIG9mIHRoZSBMYWJlbCdzIHRleHQuIE5vdGUgdGhhdCB0aGlzCi0JICogRGltZW5zaW9uIGlzIGNhbGN1bGF0ZWQgdXNpbmcgdGhlIExhYmVsJ3MgZnVsbCB0ZXh0LCByZWdhcmRsZXNzIG9mCi0JICogd2hldGhlciBvciBub3QgaXRzIHRleHQgaXMgY3VycmVudGx5IHRydW5jYXRlZC4gSWYgdGV4dCBzaXplIGNvbnNpZGVyaW5nCi0JICogY3VycmVudCB0cnVuY2F0aW9uIGlzIGRlc2lyZWQsIHVzZSB7QGxpbmsgI2NhbGN1bGF0ZVN1YlN0cmluZ1RleHRTaXplKCl9LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHNpemUgb2YgdGhlIGxhYmVsJ3MgdGV4dCwgaWdub3JpbmcgdHJ1bmNhdGlvbgotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwcm90ZWN0ZWQgRGltZW5zaW9uIGNhbGN1bGF0ZVRleHRTaXplKGludCB3aWR0aCwgaW50IGhlaWdodCkgewotCQlyZXR1cm4gRmlndXJlVXRpbGl0aWVzLmdldFRleHRFeHRlbnRzKGdldFdyYXBwZWRUZXh0KHdpZHRoLCBoZWlnaHQpLAotCQkJCWdldEZvbnQoKSk7Ci0JfQotCi0JLy8gQ29kZSBmb3IgdGhlIFRleHQgV3JhcC4KLQkvLyBTdGFydHMgaGVyZS4KLQotCXByaXZhdGUgU3RyaW5nIGdldFdyYXBwZWRUZXh0KGludCB3aWR0aCwgaW50IGhlaWdodCkgewotCQlpZiAoIWlzVGV4dFdyYXBwZWQoKSB8fCB3aWR0aCA9PSAtMSkKLQkJCXJldHVybiBnZXRUZXh0KCk7Ci0KLQkJaWYgKGlzSWNvbkV4aXN0KCkpIHsKLQkJCXN3aXRjaCAodGV4dFBsYWNlbWVudCkgewotCQkJY2FzZSBFQVNUOgotCQkJY2FzZSBXRVNUOgotCQkJCXdpZHRoIC09IGljb25TaXplLndpZHRoICsgZ2V0SWNvblRleHRHYXAoKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgTk9SVEg6Ci0JCQljYXNlIFNPVVRIOgotCQkJCWlmIChoZWlnaHQgIT0gLTEpCi0JCQkJCWhlaWdodCAtPSBpY29uU2l6ZS5oZWlnaHQgKyBnZXRJY29uVGV4dEdhcCgpOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0KLQkJRm9udCBmID0gZ2V0Rm9udCgpOwotCQlpbnQgbWF4TGluZXMgPSBJbnRlZ2VyLk1BWF9WQUxVRTsKLQkJaWYgKGhlaWdodCAhPSAtMSkgewotCQkJaW50IGZvbnRIZWlnaHQgPSBGaWd1cmVVdGlsaXRpZXMuZ2V0Rm9udE1ldHJpY3MoZikuZ2V0SGVpZ2h0KCk7Ci0JCQltYXhMaW5lcyA9IChpbnQpIChoZWlnaHQgLyAoZG91YmxlKSBmb250SGVpZ2h0KTsKLQkJfQotCi0JCVN0cmluZ0J1ZmZlciBhY2N1bWxhdGVkVGV4dCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJU3RyaW5nQnVmZmVyIHJlbWFpbmluZ1RleHQgPSBuZXcgU3RyaW5nQnVmZmVyKGdldFRleHQoKSk7Ci0JCWludCBpID0gMCwgaiA9IDA7Ci0KLQkJd2hpbGUgKHJlbWFpbmluZ1RleHQubGVuZ3RoKCkgPiAwICYmIGorKyA8IG1heExpbmVzKSB7Ci0JCQlpZiAoKGkgPSBnZXRMaW5lV3JhcFBvc2l0aW9uKHJlbWFpbmluZ1RleHQudG9TdHJpbmcoKSwgZiwgaGVpZ2h0KSkgPT0gMCkKLQkJCQlicmVhazsKLQotCQkJaWYgKGFjY3VtbGF0ZWRUZXh0Lmxlbmd0aCgpID4gMCkKLQkJCQlhY2N1bWxhdGVkVGV4dC5hcHBlbmQoIlxuIik7IC8vJE5PTi1OTFMtMSQKLQkJCWFjY3VtbGF0ZWRUZXh0LmFwcGVuZChyZW1haW5pbmdUZXh0LnN1YnN0cmluZygwLCBpKSk7Ci0JCQlyZW1haW5pbmdUZXh0LmRlbGV0ZSgwLCBpKTsKLQkJfQotCQlyZXR1cm4gYWNjdW1sYXRlZFRleHQudG9TdHJpbmcoKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNJY29uRXhpc3QoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXByaXZhdGUgaW50IGdldExpbmVXcmFwUG9zaXRpb24oU3RyaW5nIHN0cmluZywgRm9udCBmLCBpbnQgd2lkdGgpIHsKLQkJQnJlYWtJdGVyYXRvciBpdGVyID0gQnJlYWtJdGVyYXRvci5nZXRMaW5lSW5zdGFuY2UoKTsKLQkJaXRlci5zZXRUZXh0KHN0cmluZyk7Ci0JCWludCBzdGFydCA9IGl0ZXIuZmlyc3QoKTsKLQkJaW50IGVuZCA9IGl0ZXIubmV4dCgpOwotCi0JCS8vIGlmIHRoZSBmaXJzdCBsaW5lIHNlZ21lbnQgZG9lcyBub3QgZml0IGluIHRoZSB3aWR0aCwKLQkJLy8gZGV0ZXJtaW5lIHRoZSBwb3NpdGlvbiB3aXRoaW4gaXQgd2hlcmUgd2UgbmVlZCB0byBjdXQKLQkJaWYgKEZpZ3VyZVV0aWxpdGllcy5nZXRUZXh0RXh0ZW50cyhzdHJpbmcuc3Vic3RyaW5nKHN0YXJ0LCBlbmQpLCBmKS53aWR0aCA+IHdpZHRoKSB7Ci0JCQlpdGVyID0gQnJlYWtJdGVyYXRvci5nZXRDaGFyYWN0ZXJJbnN0YW5jZSgpOwotCQkJaXRlci5zZXRUZXh0KHN0cmluZyk7Ci0JCQlzdGFydCA9IGl0ZXIuZmlyc3QoKTsKLQkJfQotCi0JCS8vIGtlZXAgaXRlcmF0aW5nIGFzIGxvbmcgYXMgd2lkdGggcGVybWl0cwotCQlkbwotCQkJZW5kID0gaXRlci5uZXh0KCk7Ci0JCXdoaWxlIChlbmQgIT0gQnJlYWtJdGVyYXRvci5ET05FCi0JCQkJJiYgRmlndXJlVXRpbGl0aWVzLmdldFRleHRFeHRlbnRzKHN0cmluZy5zdWJzdHJpbmcoc3RhcnQsIGVuZCksCi0JCQkJCQlmKS53aWR0aCA8PSB3aWR0aCk7Ci0JCXJldHVybiAoZW5kID09IEJyZWFrSXRlcmF0b3IuRE9ORSkgPyBpdGVyLmxhc3QoKSA6IGl0ZXIucHJldmlvdXMoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBsYXJnZXN0IHN1YnN0cmluZyBvZiA8aT5zPC9pPiBpbiBGb250IDxpPmY8L2k+IHRoYXQgY2FuIGJlCi0JICogY29uZmluZWQgdG8gdGhlIG51bWJlciBvZiBwaXhlbHMgaW4gPGk+YXZhaWxhYmxlV2lkdGg8aT4uCi0JICogCi0JICogQHBhcmFtIHMKLQkgKiAgICAgICAgICAgIHRoZSBvcmlnaW5hbCBzdHJpbmcKLQkgKiBAcGFyYW0gZgotCSAqICAgICAgICAgICAgdGhlIGZvbnQKLQkgKiBAcGFyYW0gYXZhaWxhYmxlV2lkdGgKLQkgKiAgICAgICAgICAgIHRoZSBhdmFpbGFibGUgd2lkdGgKLQkgKiBAcmV0dXJuIHRoZSBsYXJnZXN0IHN1YnN0cmluZyB0aGF0IGZpdHMgaW4gdGhlIGdpdmVuIHdpZHRoCi0JICogQHNpbmNlIDIuMCBDb3BpZWQgZnJvbSA8Y2xhc3M+RmlndXJlVXRpbGl0aWVzPGNsYXNzPiBDbGFzcywgdG8gYXZvaWQKLQkgKiAgICAgICAgY2FsbCBvZiBzdGF0aWMuCi0JICovCi0Jc3RhdGljIGludCBnZXRMYXJnZXN0U3Vic3RyaW5nQ29uZmluZWRUbyhTdHJpbmcgcywgRm9udCBmLAotCQkJaW50IGF2YWlsYWJsZVdpZHRoKSB7Ci0JCUZvbnRNZXRyaWNzIG1ldHJpY3MgPSBGaWd1cmVVdGlsaXRpZXMuZ2V0Rm9udE1ldHJpY3MoZik7Ci0JCWludCBtaW4sIG1heDsKLQkJZmxvYXQgYXZnID0gbWV0cmljcy5nZXRBdmVyYWdlQ2hhcldpZHRoKCk7Ci0JCW1pbiA9IDA7Ci0JCW1heCA9IHMubGVuZ3RoKCkgKyAxOwotCi0JCS8vIFRoZSBzaXplIG9mIHRoZSBjdXJyZW50IGd1ZXNzCi0JCWludCBndWVzcyA9IDAsIGd1ZXNzU2l6ZSA9IDA7Ci0JCXdoaWxlICgobWF4IC0gbWluKSA+IDEpIHsKLQkJCS8vIFBpY2sgYSBuZXcgZ3Vlc3Mgc2l6ZQotCQkJLy8gTmV3IGd1ZXNzIGlzIHRoZSBsYXN0IGd1ZXNzIHBsdXMgdGhlIG1pc3Npbmcgd2lkdGggaW4gcGl4ZWxzCi0JCQkvLyBkaXZpZGVkIGJ5IHRoZSBhdmVyYWdlIGNoYXJhY3RlciBzaXplIGluIHBpeGVscwotCQkJZ3Vlc3MgPSBndWVzcyArIChpbnQpICgoYXZhaWxhYmxlV2lkdGggLSBndWVzc1NpemUpIC8gYXZnKTsKLQotCQkJaWYgKGd1ZXNzID49IG1heCkKLQkJCQlndWVzcyA9IG1heCAtIDE7Ci0JCQlpZiAoZ3Vlc3MgPD0gbWluKQotCQkJCWd1ZXNzID0gbWluICsgMTsKLQotCQkJLy8gTWVhc3VyZSB0aGUgY3VycmVudCBndWVzcwotCQkJZ3Vlc3NTaXplID0gRmlndXJlVXRpbGl0aWVzCi0JCQkJCS5nZXRUZXh0RXh0ZW50cyhzLnN1YnN0cmluZygwLCBndWVzcyksIGYpLndpZHRoOwotCi0JCQlpZiAoZ3Vlc3NTaXplIDwgYXZhaWxhYmxlV2lkdGgpCi0JCQkJLy8gV2UgZGlkIG5vdCB1c2UgdGhlIGF2YWlsYWJsZSB3aWR0aAotCQkJCW1pbiA9IGd1ZXNzOwotCQkJZWxzZQotCQkJCS8vIFdlIGV4Y2VlZGVkIHRoZSBhdmFpbGFibGUgd2lkdGgKLQkJCQltYXggPSBndWVzczsKLQkJfQotCQlyZXR1cm4gbWluOwotCX0KLQotCS8qKgotCSAqIFNldHMgdG8gd3JhcCB0ZXh0IGluIExhYmVsLgotCSAqIAotCSAqIEBwYXJhbSBiCi0JICogICAgICAgICAgICB0cnVlL2ZhbHNlCi0JICovCi0JcHVibGljIHZvaWQgc2V0VGV4dFdyYXAoYm9vbGVhbiBiKSB7Ci0JCWlmIChpc1RleHRXcmFwcGVkKCkgPT0gYikKLQkJCXJldHVybjsKLQkJc2V0RmxhZyhGTEFHX1dSQVAsIGIpOwotCQlyZXZhbGlkYXRlKCk7Ci0JCXJlcGFpbnQoKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHRleHQgd3JhcC4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1RleHRXcmFwcGVkKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGV4dCB3cmFwIHdpZHRoLgotCSAqIAotCSAqIEBwYXJhbSBpCi0JICogICAgICAgICAgICBUaGUgbGFiZWwgdGV4dCB3cmFwIHdpZHRoCi0JICovCi0JcHVibGljIHZvaWQgc2V0VGV4dFdyYXBXaWR0aChpbnQgaSkgewotCQlpZiAodGhpcy53cmFwV2lkdGggPT0gaSkKLQkJCXJldHVybjsKLQkJdGhpcy53cmFwV2lkdGggPSBpOwotCQlyZXZhbGlkYXRlKCk7Ci0JCXJlcGFpbnQoKTsKLQotCX0KLQotCS8qKgotCSAqIFRleHQgV3JhcCBBbGlnbm1lbnQsIHVzZSBvbmx5IGFmdGVyIHVzaW5nIDxtZXRob2Q+c2V0VGV4dFdyYXAoYm9vbGVhbik8L21ldGhvZD4KLQkgKiAKLQkgKiBAcGFyYW0gaQotCSAqICAgICAgICAgICAgVGhlIGxhYmVsIHRleHQgd3JhcHBpbmcgd2lkdGgKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUZXh0V3JhcEFsaWdubWVudChpbnQgaSkgewotCQlpZiAoZ2V0VGV4dFdyYXBBbGlnbm1lbnQoKSA9PSBpKQotCQkJcmV0dXJuOwotCi0JCXNldEFsaWdubWVudEZsYWdzKGksIEZMQUdfV1JBUF9BTElHTik7Ci0JCXJlcGFpbnQoKTsKLQl9Ci0KLQkvKioKLQkgKiBzZXRBbGlnbm1lbnRGbGFncwotCSAqIAotCSAqIEBwYXJhbSBpbnQKLQkgKiAgICAgICAgICAgIGFsaWduCi0JICogQHBhcmFtIGludAotCSAqICAgICAgICAgICAgZmxhZ09mZnNldAotCSAqIAotCSAqIC0tLSBUT0RPIC0gY29waWVkIG5lZWRzIHRvIG1vZGlmeQotCSAqLwotCXByaXZhdGUgdm9pZCBzZXRBbGlnbm1lbnRGbGFncyhpbnQgYWxpZ24sIGludCBmbGFnT2Zmc2V0KSB7Ci0JCWZsYWdzICY9IH4oMHg3ICogZmxhZ09mZnNldCk7Ci0JCXN3aXRjaCAoYWxpZ24pIHsKLQkJY2FzZSBDRU5URVI6Ci0JCQlmbGFncyB8PSAweDEgKiBmbGFnT2Zmc2V0OwotCQkJYnJlYWs7Ci0JCWNhc2UgVE9QOgotCQkJZmxhZ3MgfD0gMHgyICogZmxhZ09mZnNldDsKLQkJCWJyZWFrOwotCQljYXNlIExFRlQ6Ci0JCQlmbGFncyB8PSAweDMgKiBmbGFnT2Zmc2V0OwotCQkJYnJlYWs7Ci0JCWNhc2UgUklHSFQ6Ci0JCQlmbGFncyB8PSAweDQgKiBmbGFnT2Zmc2V0OwotCQkJYnJlYWs7Ci0JCWNhc2UgQk9UVE9NOgotCQkJZmxhZ3MgfD0gMHg1ICogZmxhZ09mZnNldDsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIHdyYXBWYWx1ZQotCSAqIEByZXR1cm4gUG9zaXRpb25Db25zdGFudCByZXByZXNlbnRpbmcgdGhlIGFsaWdubWVudAotCSAqLwotCXByaXZhdGUgaW50IGdldEFsaWdubWVudChpbnQgZmxhZ09mZnNldCkgewotCQlpbnQgd3JhcFZhbHVlID0gZmxhZ3MgJiAoMHg3ICogZmxhZ09mZnNldCk7Ci0JCWlmICh3cmFwVmFsdWUgPT0gMHgxICogZmxhZ09mZnNldCkKLQkJCXJldHVybiBDRU5URVI7Ci0JCWVsc2UgaWYgKHdyYXBWYWx1ZSA9PSAweDIgKiBmbGFnT2Zmc2V0KQotCQkJcmV0dXJuIFRPUDsKLQkJZWxzZSBpZiAod3JhcFZhbHVlID09IDB4MyAqIGZsYWdPZmZzZXQpCi0JCQlyZXR1cm4gTEVGVDsKLQkJZWxzZSBpZiAod3JhcFZhbHVlID09IDB4NCAqIGZsYWdPZmZzZXQpCi0JCQlyZXR1cm4gUklHSFQ7Ci0JCWVsc2UgaWYgKHdyYXBWYWx1ZSA9PSAweDUgKiBmbGFnT2Zmc2V0KQotCQkJcmV0dXJuIEJPVFRPTTsKLQotCQlyZXR1cm4gQ0VOVEVSOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gdGhlIGxhYmVsIHRleHQgd3JhcHBpbmcgd2lkdGgKLQkgKi8KLQlwdWJsaWMgaW50IGdldFRleHRXcmFwQWxpZ25tZW50KCkgewotCQlyZXR1cm4gZ2V0QWxpZ25tZW50KEZMQUdfV1JBUF9BTElHTik7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiB0aGUgZm9jdXMgc3RhdGUgb2YgdGhpcyBsYWJlbAotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc0ZvY3VzKCkgewotCQlyZXR1cm4gKGZsYWdzICYgRkxBR19IQVNGT0NVUykgIT0gMDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHRoZSBzZWxlY3Rpb24gc3RhdGUgb2YgdGhpcyBsYWJlbAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2VsZWN0ZWQoKSB7Ci0JCXJldHVybiAoZmxhZ3MgJiBGTEFHX1NFTEVDVEVEKSAhPSAwOwotCX0KLQotCXByaXZhdGUgdm9pZCBncmFwaGljc2RyYXdUZXh0KEdyYXBoaWNzIGdyYXBoaWNzKSB7Ci0JCVN0cmluZyBzdWJTdHJpbmcgPSBnZXRTdWJTdHJpbmdUZXh0KCk7Ci0JCVN0cmluZ1Rva2VuaXplciB0b2tlbml6ZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHN1YlN0cmluZywgIlxuIik7IC8vJE5PTi1OTFMtMSQKLQotCQlGb250IGYgPSBnZXRGb250KCk7Ci0JCWludCBmb250SGVpZ2h0ID0gRmlndXJlVXRpbGl0aWVzLmdldEZvbnRNZXRyaWNzKGYpLmdldEhlaWdodCgpOwotCQlpbnQgdGV4dFdpZHRoID0gRmlndXJlVXRpbGl0aWVzLmdldFRleHRFeHRlbnRzKHN1YlN0cmluZywgZikud2lkdGg7Ci0JCWludCB5ID0gZ2V0VGV4dExvY2F0aW9uKCkueTsKLQotCQkvLyBJZiB0aGUgZm9udCdzIGxlYWRpbmcgYXJlYSBpcyAwIHRoZW4gd2UgbmVlZCB0byBhZGQgYW4gb2Zmc2V0IHRvCi0JCS8vIGF2b2lkIHRydW5jYXRpbmcgYXQgdGhlIHRvcCAoZS5nLiBLb3JlYW4gZm9udHMpCi0JCWlmICgwID09IEZpZ3VyZVV0aWxpdGllcy5nZXRGb250TWV0cmljcyhmKS5nZXRMZWFkaW5nKCkpIHsKLQkJCWludCBvZmZzZXQgPSAyOyAvLyAyIGlzIHRoZSBsZWFkaW5nIGFyZWEgZm9yIGRlZmF1bHQgRW5nbGlzaAotCQkJeSArPSBvZmZzZXQ7Ci0JCX0KLQotCQl3aGlsZSAodG9rZW5pemVyLmhhc01vcmVUb2tlbnMoKSkgewotCQkJU3RyaW5nIHRva2VuID0gdG9rZW5pemVyLm5leHRUb2tlbigpOwotCQkJU3lzdGVtLm91dC5wcmludGxuKCJUZXh0IGFkZGVkIHRvIGRyYXciICsgdG9rZW4pOyAvLyROT04tTkxTLTEkCi0JCQlpbnQgdG9rZW5XaWR0aCA9IEZpZ3VyZVV0aWxpdGllcy5nZXRUZXh0RXh0ZW50cyh0b2tlbiwgZikud2lkdGg7Ci0JCQlpbnQgeCA9IGdldFRleHRMb2NhdGlvbigpLng7Ci0JCQlzd2l0Y2ggKGdldFRleHRXcmFwQWxpZ25tZW50KCkpIHsKLQkJCWNhc2UgQ0VOVEVSOgotCQkJCXggKz0gKHRleHRXaWR0aCAtIHRva2VuV2lkdGgpIC8gMjsKLQkJCQlicmVhazsKLQkJCWNhc2UgUklHSFQ6Ci0JCQkJeCArPSB0ZXh0V2lkdGggLSB0b2tlbldpZHRoOwotCQkJCWJyZWFrOwotCQkJfQotCQkJZ3JhcGhpY3MuZHJhd1RleHQodG9rZW4sIHgsIHkpOwotCQkJeSArPSBmb250SGVpZ2h0OwotCQl9Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgZm9jdXMgc3RhdGUgb2YgdGhpcyBsYWJlbAotCSAqIAotCSAqIEBwYXJhbSBiCi0JICogICAgICAgICAgICB0cnVlIHdpbGwgY2F1c2UgYSBmb2N1cyByZWN0YW5nbGUgdG8gYmUgZHJhd24gYXJvdW5kIHRoZSB0ZXh0Ci0JICogICAgICAgICAgICBvZiB0aGUgTGFiZWwKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGb2N1cyhib29sZWFuIGIpIHsKLQkJaWYgKGhhc0ZvY3VzKCkgPT0gYikKLQkJCXJldHVybjsKLQkJc2V0RmxhZyhGTEFHX0hBU0ZPQ1VTLCBiKTsKLQkJcmVwYWludCgpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHNlbGVjdGlvbiBzdGF0ZSBvZiB0aGlzIGxhYmVsCi0JICogCi0JICogQHBhcmFtIGIKLQkgKiAgICAgICAgICAgIHRydWUgd2lsbCBjYXVzZSB0aGUgbGFiZWwgdG8gYXBwZWFyIHNlbGVjdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2VsZWN0ZWQoYm9vbGVhbiBiKSB7Ci0JCWlmIChpc1NlbGVjdGVkKCkgPT0gYikKLQkJCXJldHVybjsKLQkJc2V0RmxhZyhGTEFHX1NFTEVDVEVELCBiKTsKLQkJcmVwYWludCgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZmlndXJlcy9wYWNrYWdlLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9maWd1cmVzL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzkwOGRkOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9maWd1cmVzL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIGdyYXBoaWNhbCBmaWd1cmVzIGZvciB0aGUgYWN0aXZpdHkgZGlhZ3JhbXMuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvdXRpbC9BbmNob3JVdGlsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi91dGlsL0FuY2hvclV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmIxMWRiZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi91dGlsL0FuY2hvclV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQ7Ci0KLS8qKgotICogVXRpbGl0eSBjbGFzcyBmb3IgYW5jaG9ycy4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEFuY2hvclV0aWwgewotCi0JcHVibGljIHN0YXRpYyBQb2ludCBnZXRDbG9zZXN0UG9pbnQoUG9pbnRbXSBwb2ludHMsIFBvaW50IHBvaW50KSB7Ci0JCWludCBzaXplID0gcG9pbnRzLmxlbmd0aDsKLQkJZG91YmxlW10gZGlzdGFuY2VzID0gbmV3IGRvdWJsZVtzaXplXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCWRpc3RhbmNlc1tpXSA9IHBvaW50c1tpXS5nZXREaXN0YW5jZShwb2ludCk7Ci0JCX0KLQkJcmV0dXJuIHBvaW50c1ttaW4oZGlzdGFuY2VzKV07Ci0JfQotCi0JcHVibGljIHN0YXRpYyBpbnQgbWluKGRvdWJsZVtdIG51bWJlcnMpIHsKLQkJaWYgKG51bWJlcnMubGVuZ3RoID09IDApCi0JCQlyZXR1cm4gLTE7Ci0JCWRvdWJsZSBtaW4gPSBudW1iZXJzWzBdOwotCQlpbnQgaWQgPSAwOwotCQlmb3IgKGludCBpID0gMTsgaSA8IG51bWJlcnMubGVuZ3RoOyBpKyspIHsKLQkJCWRvdWJsZSBuID0gbnVtYmVyc1tpXTsKLQkJCWlmIChuIDwgbWluKSB7Ci0JCQkJbWluID0gbjsKLQkJCQlpZCA9IGk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGlkOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBudW1iZXJzCi0JICogQHJldHVybgotCSAqIAkJaW5kZXggb2YgdGhlIHNtYWxsZXN0IG51bWJlciBpbiB0aGUgZ2l2ZW4gYXJyYXkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBtaW4oaW50W10gbnVtYmVycykgewotCQlpZiAobnVtYmVycy5sZW5ndGggPT0gMCkKLQkJCXJldHVybiAtMTsKLQkJaW50IG1pbiA9IG51bWJlcnNbMF07Ci0JCWludCBpZCA9IDA7Ci0JCWZvciAoaW50IGkgPSAxOyBpIDwgbnVtYmVycy5sZW5ndGg7IGkrKykgewotCQkJaW50IG4gPSBudW1iZXJzW2ldOwotCQkJaWYgKG4gPCBtaW4pIHsKLQkJCQltaW4gPSBuOwotCQkJCWlkID0gaTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gaWQ7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi91dGlsL0Nvbm5lY3Rpb25BbmNob3JMb2NhdG9yLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi91dGlsL0Nvbm5lY3Rpb25BbmNob3JMb2NhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2MzRmZjcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvdXRpbC9Db25uZWN0aW9uQW5jaG9yTG9jYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsKLQotLyoqCi0gKiBDb25zdHJhaW50IGZvciBwbGFjaW5nIGFuY2hvciBsb2NhdGlvbi4KLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ29ubmVjdGlvbkFuY2hvckxvY2F0b3IgewotCi0JLyoqCi0JICogR2V0cyByZWxhdGl2ZSBsb2NhdGlvbiBiYXNlZCBvbiB0aGUgZ2l2ZW4gcmVmZXJlbmNlIHBvaW50Ci0JICogCi0JICogQHBhcmFtIHJlZmVyZW5jZQotCSAqIEByZXR1cm4gYWJzb2x1dGUgbG9jYXRpb24KLQkgKi8KLQlQb2ludCBnZXRMb2NhdGlvbihQb2ludCByZWZlcmVuY2UpOwotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi91dGlsL0RpYWdyYW1FZGl0b3JVdGlsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi91dGlsL0RpYWdyYW1FZGl0b3JVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5YzMxYTkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvdXRpbC9EaWFncmFtRWRpdG9yVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0udWkuc2VydmljZS5EaWFncmFtRWRpdG9ySGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUNvbW1hbmRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZC5WYXJ5QWN0aXZpdHlDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JSZWZlcmVuY2U7Ci0KLS8qKgotICogUHJvdmlkZXMgaW5zdHJ1Y3R1cmUgdG8gbGlzdGVucyB0byBhY3Rpb25zIGxpa2UgTG9jYWxDb250cmlidXRpb24sIExvY2FsCi0gKiBSZXBsYWNlIGluIFdvcmtCcmVha2Rvd24gU3RydWN0dXJlLiBMb2FkcyBhdCB0aW1lIG9mIHBsdWdpbiBsb2FkLgotICogCi0gKiBAc2VlIFZhcnlBY3Rpdml0eUNvbW1hbmQKLSAqIAotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgRGlhZ3JhbUVkaXRvclV0aWwgewotCi0JcHJpdmF0ZSBzdGF0aWMgRGlhZ3JhbUVkaXRvclV0aWwgaW5zdGFuY2UgPSBudWxsOwotCi0JcHJpdmF0ZSBMaXN0PElDb21tYW5kTGlzdGVuZXI+IGNvbW1hbmRMaXN0ZW5lcnM7Ci0KLQlwcml2YXRlIERpYWdyYW1FZGl0b3JVdGlsKCkgewotCX0KLQotCXB1YmxpYyBzdGF0aWMgRGlhZ3JhbUVkaXRvclV0aWwgZ2V0SW5zdGFuY2UoKSB7Ci0JCWlmIChpbnN0YW5jZSA9PSBudWxsKSB7Ci0JCQlzeW5jaHJvbml6ZWQgKERpYWdyYW1FZGl0b3JVdGlsLmNsYXNzKSB7Ci0JCQkJaWYgKGluc3RhbmNlID09IG51bGwpIHsKLQkJCQkJaW5zdGFuY2UgPSBuZXcgRGlhZ3JhbUVkaXRvclV0aWwoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLQotCXB1YmxpYyBMaXN0PElDb21tYW5kTGlzdGVuZXI+IGdldFZhcnlDb21tYW5kTGlzdGVuZXJzKCkgewotCQlpZiAoY29tbWFuZExpc3RlbmVycyA9PSBudWxsKSB7Ci0JCQljb21tYW5kTGlzdGVuZXJzID0gbmV3IEFycmF5TGlzdDxJQ29tbWFuZExpc3RlbmVyPigpOwotCQl9Ci0KLQkJY29tbWFuZExpc3RlbmVycy5hZGQobmV3IElDb21tYW5kTGlzdGVuZXIoKSB7Ci0KLQkJCXB1YmxpYyB2b2lkIG5vdGlmeUV4ZWN1dGVkKENvbW1hbmQgY29tbWFuZCkgewotCQkJCS8vIEdldCBjb250cmlidXRvci9yZXBsYWNlciBvZiB0aGUgYWN0aXZpdHkuCi0JCQkJT2JqZWN0IHdyYXBwZXIgPSAoKFZhcnlBY3Rpdml0eUNvbW1hbmQpIGNvbW1hbmQpLmdldFdyYXBwZXIoKTsKLQkJCQlEaWFncmFtRWRpdG9ySGVscGVyLmNsb3NlRGlhZ3JhbUVkaXRvcnMod3JhcHBlciwgCi0JCQkJCQluZXcgQXJyYXlMaXN0PElFZGl0b3JSZWZlcmVuY2U+KCkpOwotCQkJCURpYWdyYW1FZGl0b3JIZWxwZXIucmVmcmVzaFBhcmVudERpYWdyYW1FZGl0b3JzKHdyYXBwZXIsCi0JCQkJCQluZXcgQXJyYXlMaXN0PElFZGl0b3JSZWZlcmVuY2U+KCksIHRydWUpOwotCQkJfQotCi0JCQlwdWJsaWMgQ2xhc3MgZ2V0Q29tbWFuZFR5cGUoKSB7Ci0JCQkJcmV0dXJuIFZhcnlBY3Rpdml0eUNvbW1hbmQuY2xhc3M7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHByZVVuZG8oQ29tbWFuZCBjb21tYW5kKSB7Ci0JCQkJLy8gR2V0IG9sZCBjb250cmlidXRvci9yZXBsYWNlciBvZiB0aGUgYWN0aXZpdHkuCi0JCQkJQ29sbGVjdGlvbiBsaXN0ID0gKChWYXJ5QWN0aXZpdHlDb21tYW5kKSBjb21tYW5kKS5nZXRSZXN1bHQoKTsKLQotCQkJCUxpc3QgbGlzdHggPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGxpc3QuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJCQlPYmplY3Qgd3JhcHBlciA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJRGlhZ3JhbUVkaXRvckhlbHBlci5jbG9zZURpYWdyYW1FZGl0b3JzKHdyYXBwZXIsIAotCQkJCQkJCW5ldyBBcnJheUxpc3Q8SUVkaXRvclJlZmVyZW5jZT4oKSk7Ci0JCQkJCWxpc3R4LmNsZWFyKCk7Ci0JCQkJfQotCi0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBwcmVFeGVjdXRlKENvbW1hbmQgY29tbWFuZCkgewotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBwb3N0VW5kbyhDb21tYW5kIGNvbW1hbmQpIHsKLQkJCQlEaWFncmFtRWRpdG9ySGVscGVyLnJlZnJlc2hQYXJlbnREaWFncmFtRWRpdG9ycygoKFZhcnlBY3Rpdml0eUNvbW1hbmQpIGNvbW1hbmQpLnN1cGVyQWN0aXZpdHksCi0JCQkJCQkJbmV3IEFycmF5TGlzdDxJRWRpdG9yUmVmZXJlbmNlPigpLCBmYWxzZSk7Ci0JCQl9Ci0JCX0pOwotCi0JCXJldHVybiBjb21tYW5kTGlzdGVuZXJzOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL3V0aWwvRGlhZ3JhbVVJUmVzb3VyY2VzLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi91dGlsL0RpYWdyYW1VSVJlc291cmNlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmM2RmOTM5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL3V0aWwvRGlhZ3JhbVVJUmVzb3VyY2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi0vKioKLSAqIFJlc291cmNlIENsYXNzIGZvciB0aGUgQXV0aG9yaW5nIERpYWdyYW0gKEdFRikgcGFja2FnZXMuCi0gKiAKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIERpYWdyYW1VSVJlc291cmNlcyBleHRlbmRzIE5MUyB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYudXRpbC5SZXNvdXJjZXMiOy8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgRGlhZ3JhbVVJUmVzb3VyY2VzKCkgewotCQkvLyBEbyBub3QgaW5zdGFudGlhdGUKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwcmV2aW91c19uYW1lX251bGwxOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVycl9uYW1lX2VtcHR5OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG1vdmVBY3Rpb25fbGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWJzdHJhY3REaWFncmFtX1NlbGVjdF90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFic3RyYWN0RGlhZ3JhbV9TZWxlY3RfdG9vbHRpcDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBYnN0cmFjdERpYWdyYW1fQWRkTm9kZV90aXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBYnN0cmFjdERpYWdyYW1fQWRkTm9kZV9lcnJfbXNnOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFic3RyYWN0RGlhZ3JhbV9MaW5rX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWJzdHJhY3REaWFncmFtX0xpbmtfc2VsZWN0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFic3RyYWN0RGlhZ3JhbV9MaW5rX3Rvb2x0aXA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWN0aXZpdHlEaWFncmFtX1N0YXJ0Tm9kZV90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdGl2aXR5RGlhZ3JhbV9TdGFydE5vZGVfdG9vbHRpcDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBYnN0cmFjdERpYWdyYW1fRnJlZVRleHRfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBYnN0cmFjdERpYWdyYW1fRnJlZVRleHRfdG9vbHRpcDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3Rpdml0eURpYWdyYW1fU3luY0Jhcl90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdGl2aXR5RGlhZ3JhbV9TeW5jQmFyX3Rvb2x0aXA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWN0aXZpdHlEaWFncmFtX0RlY2lzaW9uTm9kZV90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdGl2aXR5RGlhZ3JhbV9EZWNpc2lvbk5vZGVfdG9vbHRpcDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3Rpdml0eURpYWdyYW1fRW5kTm9kZV90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdGl2aXR5RGV0YWlsRGlhZ3JhbV9wcmVmaXg7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWN0aXZpdHlEaWFncmFtX0VuZE5vZGVfdG9vbHRpcDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3Rpdml0eURpYWdyYW1fQWN0aXZpdHlfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3Rpdml0eURpYWdyYW1fQWN0aXZpdHlfdG9vbHRpcDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3Rpdml0eURpYWdyYW1fSXRlcmF0aW9uX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWN0aXZpdHlEaWFncmFtX0l0ZXJhdGlvbl90b29sdGlwOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdGl2aXR5RGlhZ3JhbV9QaGFzZV90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdGl2aXR5RGlhZ3JhbV9QaGFzZV90b29sdGlwOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFic3RyYWN0RGlhZ3JhbV9UYXNrRGVzY3JpcHRvcl90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFic3RyYWN0RGlhZ3JhbV9Sb2xlRGVzY3JpcHRvcl90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW1fcHJlZml4OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFic3RyYWN0RGlhZ3JhbV9Sb2xlRGVzY3JpcHRvcl90b29sdGlwOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFic3RyYWN0RGlhZ3JhbV9UYXNrRGVzY3JpcHRvcl90b29sdGlwOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdHZpdGl2aXR5RGlhZ3JhbV9EZWxpdmVyeVByb2Nlc3NfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3R2aXRpdml0eURpYWdyYW1fQ2FwYWJpbGl0eVBhdHRlcm5fdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3R2aXRpdml0eURpYWdyYW1fUGhhc2VfdGV4OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdHZpdGl2aXR5RGlhZ3JhbV9JdGVyYXRpb25fdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3R2aXRpdml0eURpYWdyYW1fQWN0aXZpdHlfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBYnN0cmFjdERpYWdyYW1fV29ya1Byb2R1Y3REZXNjcmlwdG9yX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWJzdHJhY3REaWFncmFtX1dvcmtQcm9kdWN0RGVzY3JpcHRvcl90b29sdGlwOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFic3RyYWN0RGlhZ3JhbUVkaXRvcl9hbGlnbk1lbnVfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBYnN0cmFjdERpYWdyYW1FZGl0b3JfcmVmcmVzaEZyb21CYXNlQWN0aXZpdHlfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBYnN0cmFjdERpYWdyYW1FZGl0b3JfZm9ybWF0VGV4dEJveEFjdGl2aXR5X3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWJzdHJhY3REaWFncmFtRWRpdG9yX2hBbGlnbkF2ZXJhZ2VBY3Rpb25fdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBYnN0cmFjdERpYWdyYW1FZGl0b3JfaEFsaWduRmlyc3RTZWxlY3RlZEFjdGlvbl90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFic3RyYWN0RGlhZ3JhbUVkaXRvcl92QWxpZ25BdmVyYWdlQWN0aW9uX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWJzdHJhY3REaWFncmFtRWRpdG9yX3ZBbGlnbkZpcnN0U2VsZWN0ZWRBY3Rpb25fdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBYnN0cmFjdERpYWdyYW1FZGl0b3JfU2F2ZV90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFic3RyYWN0RGlhZ3JhbUVkaXRvcl9TYXZlX21lc3NhZ2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWJzdHJhY3REaWFncmFtRWRpdG9yX01vdmVOb2RlX2xhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFic3RyYWN0RGlhZ3JhbUVkaXRvcnJlZnJlc2hmcm9tYmFzZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBYnN0cmFjdERpYWdyYW1fQmVuZFBvaW50X2NyZWF0ZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3Rpdml0eURpYWdyYW1fb3BlbkFjdGl2aXR5RGV0YWlsRGlhZ3JhbV90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlZnJlc2hBY3Rpb25fbGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVmcmVzaEZyb21CYXNlQ21kX2xhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRpYWdyYW1fc2F2ZUVycm9yOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERlbGV0ZURpYWdyYW1fdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEZWxldGVEaWFncmFtX3Byb21wdDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhbGlnbl9iZW5kX3BvaW50X3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29uZmlndXJhdGlvbkVkaXRvcklucHV0X2NvbmZpZ2VkaXRvcjA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGlhZ3JhbV9ub2RlX3Byb3BlcnR5X3ZhbHVlX3Byb2JsZW1fbXNnOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRpYWdyYW1fZXJyb3JEaWFsb2dfdGl0bGVfdGV4dDA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9yX1Jlc2V0RGlhZ3JhbUxheW91dF90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVycm9yRGlhbG9nX3RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbW1hbmRfY2Fubm90RWRpdDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBYnN0cmFjdERpYWdyYW1FZGl0b3JfUGFyZW50RWRpdG9yQ2xvc2VfdGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWJzdHJhY3REaWFncmFtRWRpdG9yX1BhcmVudEVkaXRvckNsb3NlX3RleHQ7Ci0KLQlzdGF0aWMgewotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBEaWFncmFtVUlSZXNvdXJjZXMuY2xhc3MpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBsb2NhbGl6ZWQgc3RyaW5nIGFzc29jaWF0ZWQgd2l0aCBhIHJlc291cmNlIGtleSBhbmQgZm9ybWF0dGVkCi0JICogd2l0aCBhIGdpdmVuIG9iamVjdC4KLQkgKiAKLQkgKiBAcGFyYW0ga2V5Ci0JICogICAgICAgICAgICBBIHJlc291cmNlIGtleS4KLQkgKiBAcGFyYW0gZGF0YQotCSAqICAgICAgICAgICAgQW4gb2JqZWN0LgotCSAqIEByZXR1cm4gQSBmb3JtYXR0ZWQgbG9jYWxpemVkIHN0cmluZy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBiaW5kKFN0cmluZyBrZXksIE9iamVjdCBkYXRhKSB7Ci0JCXJldHVybiBOTFMuYmluZChrZXksIG5ldyBPYmplY3RbXSB7IGRhdGEgfSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL3V0aWwvUmVzb3VyY2VzLnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi91dGlsL1Jlc291cmNlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNmJjZTU0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL3V0aWwvUmVzb3VyY2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUgotCi1wcmV2aW91c19uYW1lX251bGwxPVVuZG8gb2YgYSBuYW1lIGNoYW5nZSBpcyBub3QgYWxsb3dlZCBpZiB0aGUgcHJldmlvdXMgbmFtZSBpcyBudWxsLgotZXJyX25hbWVfZW1wdHk9VGhlIG5hbWUgY2Fubm90IGJlIGVtcHR5LiBQbGVhc2Ugc3BlY2lmeSBhIHZhbGlkIG5hbWUuCi1tb3ZlQWN0aW9uX2xhYmVsPU1vdmUKLQotQWJzdHJhY3REaWFncmFtX1NlbGVjdF90ZXh0PVNlbGVjdAotQWJzdHJhY3REaWFncmFtX1NlbGVjdF90b29sdGlwPVNlbGVjdCBub2RlIG9yIGxpbmsKLUFic3RyYWN0RGlhZ3JhbV9BZGROb2RlX3RpdGxlPUFkZCBOb2RlCi1BYnN0cmFjdERpYWdyYW1fQWRkTm9kZV9lcnJfbXNnPUlYUkQwMDAyVzogQWRkaW5nIGEgbm9kZSB0byBkaWFncmFtIGZhaWxlZAotQWJzdHJhY3REaWFncmFtX0xpbmtfdGV4dD1MaW5rCi1BYnN0cmFjdERpYWdyYW1fTGlua19zZWxlY3Q9U2VsZWN0IExpbmsKLUFic3RyYWN0RGlhZ3JhbV9MaW5rX3Rvb2x0aXA9Q3JlYXRlIG5ldyBsaW5rCi1BY3Rpdml0eURpYWdyYW1fU3RhcnROb2RlX3RleHQ9U3RhcnQgTm9kZQotQWN0aXZpdHlEaWFncmFtX1N0YXJ0Tm9kZV90b29sdGlwPUNyZWF0ZSBuZXcgc3RhcnQgbm9kZQotQWJzdHJhY3REaWFncmFtX0ZyZWVUZXh0X3RleHQ9RnJlZSBUZXh0Ci1BYnN0cmFjdERpYWdyYW1fRnJlZVRleHRfdG9vbHRpcD1DcmVhdGUgbmV3IGZyZWUgdGV4dAotQWN0aXZpdHlEaWFncmFtX1N5bmNCYXJfdGV4dD1TeW5jaHJvbml6YXRpb24gQmFyCi1BY3Rpdml0eURpYWdyYW1fU3luY0Jhcl90b29sdGlwPUNyZWF0ZSBuZXcgc3luY2hyb25pemF0aW9uIGJhcgotQWN0aXZpdHlEaWFncmFtX0RlY2lzaW9uTm9kZV90ZXh0PURlY2lzaW9uIE5vZGUKLUFjdGl2aXR5RGlhZ3JhbV9EZWNpc2lvbk5vZGVfdG9vbHRpcD1DcmVhdGUgbmV3IGRlY2lzaW9uIG5vZGUKLUFjdGl2aXR5RGlhZ3JhbV9FbmROb2RlX3RleHQ9RW5kIE5vZGUKLUFjdGl2aXR5RGV0YWlsRGlhZ3JhbV9wcmVmaXg9QWN0aXZpdHkgRGV0YWlsOgotQWN0aXZpdHlEaWFncmFtX0VuZE5vZGVfdG9vbHRpcD1DcmVhdGUgbmV3IGVuZCBub2RlCi1BY3Rpdml0eURpYWdyYW1fQWN0aXZpdHlfdGV4dD1BY3Rpdml0eQotQWN0aXZpdHlEaWFncmFtX0FjdGl2aXR5X3Rvb2x0aXA9Q3JlYXRlIG5ldyBhY3Rpdml0eQotQWN0aXZpdHlEaWFncmFtX0l0ZXJhdGlvbl90ZXh0PUl0ZXJhdGlvbgotQWN0aXZpdHlEaWFncmFtX0l0ZXJhdGlvbl90b29sdGlwPUNyZWF0ZSBuZXcgaXRlcmF0aW9uCi1BY3Rpdml0eURpYWdyYW1fUGhhc2VfdGV4dD1QaGFzZQotQWN0aXZpdHlEaWFncmFtX1BoYXNlX3Rvb2x0aXA9Q3JlYXRlIG5ldyBwaGFzZQotQWJzdHJhY3REaWFncmFtX1Rhc2tEZXNjcmlwdG9yX3RleHQ9VGFzayBEZXNjcmlwdG9yCi1BYnN0cmFjdERpYWdyYW1fUm9sZURlc2NyaXB0b3JfdGV4dD1Sb2xlIERlc2NyaXB0b3IKLVdvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW1fcHJlZml4PVdvcmsgUHJvZHVjdCBEZXBlbmRlbmN5IERpYWdyYW06Ci1BYnN0cmFjdERpYWdyYW1fUm9sZURlc2NyaXB0b3JfdG9vbHRpcD1DcmVhdGUgbmV3IHJvbGUgZGVzY3JpcHRvcgotQWJzdHJhY3REaWFncmFtX1Rhc2tEZXNjcmlwdG9yX3Rvb2x0aXA9Q3JlYXRlIG5ldyB0YXNrIGRlc2NyaXB0b3IKLUFjdHZpdGl2aXR5RGlhZ3JhbV9EZWxpdmVyeVByb2Nlc3NfdGV4dD1EZWxpdmVyeSBQcm9jZXNzCi1BY3R2aXRpdml0eURpYWdyYW1fQ2FwYWJpbGl0eVBhdHRlcm5fdGV4dD1DYXBhYmlsaXR5IFBhdHRlcm4KLUFjdHZpdGl2aXR5RGlhZ3JhbV9QaGFzZV90ZXg9UGhhc2UKLUFjdHZpdGl2aXR5RGlhZ3JhbV9JdGVyYXRpb25fdGV4dD1JdGVyYXRpb24KLUFjdHZpdGl2aXR5RGlhZ3JhbV9BY3Rpdml0eV90ZXh0PUFjdGl2aXR5Ci1BYnN0cmFjdERpYWdyYW1fV29ya1Byb2R1Y3REZXNjcmlwdG9yX3RleHQ9V29yayBQcm9kdWN0IERlc2NyaXB0b3IKLUFic3RyYWN0RGlhZ3JhbV9Xb3JrUHJvZHVjdERlc2NyaXB0b3JfdG9vbHRpcD1DcmVhdGUgbmV3IHdvcmsgcHJvZHVjdCBkZXNjcmlwdG9yCi0KLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl9hbGlnbk1lbnVfdGV4dD1BbGlnbgotQWJzdHJhY3REaWFncmFtRWRpdG9yX3JlZnJlc2hGcm9tQmFzZUFjdGl2aXR5X3RleHQ9UmVmcmVzaCBmcm9tIEJhc2UgQWN0aXZpdHkKLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl9mb3JtYXRUZXh0Qm94QWN0aXZpdHlfdGV4dD1Gb3JtYXQgVGV4dCBCb3guLi4KLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl9oQWxpZ25BdmVyYWdlQWN0aW9uX3RleHQ9SG9yaXpvbnRhbGx5IHRvIEF2ZXJhZ2UKLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl9oQWxpZ25GaXJzdFNlbGVjdGVkQWN0aW9uX3RleHQ9SG9yaXpvbnRhbGx5IHRvIEZpcnN0IFNlbGVjdGVkCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfdkFsaWduQXZlcmFnZUFjdGlvbl90ZXh0PVZlcnRpY2FsbHkgdG8gQXZlcmFnZQotQWJzdHJhY3REaWFncmFtRWRpdG9yX3ZBbGlnbkZpcnN0U2VsZWN0ZWRBY3Rpb25fdGV4dD1WZXJ0aWNhbGx5IHRvIEZpcnN0IFNlbGVjdGVkCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfU2F2ZV90ZXh0PVNhdmUKLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl9TYXZlX21lc3NhZ2U9U2F2aW5nIHswfQotQWJzdHJhY3REaWFncmFtRWRpdG9yX01vdmVOb2RlX2xhYmVsPU1vdmUgTm9kZQotQWJzdHJhY3REaWFncmFtRWRpdG9ycmVmcmVzaGZyb21iYXNlPVJlZnJlc2ggRnJvbSBCYXNlCi1BYnN0cmFjdERpYWdyYW1fQmVuZFBvaW50X2NyZWF0ZT1DcmVhdGUgQmVuZHBvaW50Ci0KLUFjdGl2aXR5RGlhZ3JhbV9vcGVuQWN0aXZpdHlEZXRhaWxEaWFncmFtX3RleHQ9T3BlbiBBY3Rpdml0eSBEZXRhaWwgRGlhZ3JhbQotcmVmcmVzaEFjdGlvbl9sYWJlbD1SZWZyZXNoCi1yZWZyZXNoRnJvbUJhc2VDbWRfbGFiZWw9UmVmcmVzaCBGcm9tIEJhc2UKLWRpYWdyYW1fc2F2ZUVycm9yPUlVUEQwMDAxVzogU2F2aW5nIGRpYWdyYW0gZmFpbGVkCi0KLURlbGV0ZURpYWdyYW1fdGV4dD1EZWxldGUgRGlhZ3JhbQotRGVsZXRlRGlhZ3JhbV9wcm9tcHQ9QXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGNsb3NlIGFuZCBkZWxldGUgdGhpcyBkaWFncmFtP1xuVGhpcyBjaGFuZ2UgaXMgcGVybWFuZW50IGFuZCBjYW5ub3QgYmUgdW5kb25lLgotYWxpZ25fYmVuZF9wb2ludF90ZXh0PUFsaWduIEJlbmQgUG9pbnQKLUNvbmZpZ3VyYXRpb25FZGl0b3JJbnB1dF9jb25maWdlZGl0b3IwPUNvbmZpZ3VyYXRpb24gRWRpdG9yCi1kaWFncmFtX25vZGVfcHJvcGVydHlfdmFsdWVfcHJvYmxlbV9tc2c9RXJyb3IgaW4gdGhlIG5vZGUncyBwcm9wZXJ0eSB2YWx1ZS4KLWRpYWdyYW1fZXJyb3JEaWFsb2dfdGl0bGVfdGV4dDA9RXJyb3IKLQotQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9yX1Jlc2V0RGlhZ3JhbUxheW91dF90ZXh0PVJlc2V0IERpYWdyYW0gTGF5b3V0Ci1lcnJvckRpYWxvZ190aXRsZT1FcnJvcgotY29tbWFuZF9jYW5ub3RFZGl0PUlVUEQwMDAzRTogQ2Fubm90IGVkaXQgZGlhZ3JhbQotCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfUGFyZW50RWRpdG9yQ2xvc2VfdGl0bGU9UGFyZW50IEVkaXRvciBDbG9zZWQKLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl9QYXJlbnRFZGl0b3JDbG9zZV90ZXh0PXswfSBoYXMgY2xvc2VkLiBXb3VsZCB5b3UgYWxzbyBsaWtlIHRvIGNsb3NlIHsxfT8KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL3V0aWwvVGVtcGxhdGVDb25zdGFudHMuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL3V0aWwvVGVtcGxhdGVDb25zdGFudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODQ4ZjMxOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi91dGlsL1RlbXBsYXRlQ29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250OwotCi0vKioKLSAqIENvbnN0YW50cyB1c2VkIGluIGF1dGhvcmluZyBkaWFncmFtCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgVGVtcGxhdGVDb25zdGFudHMgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNUSVZJVFkgPSAiYWN0aXZpdHkgdGVtcGxhdGUiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJVEVSQVRJT04gPSAiaXRlcmF0aW9uIHRlbXBsYXRlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEhBU0UgPSAicGhhc2UgdGVtcGxhdGUiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTWU5DSF9CQVIgPSAic3luY2hvbml6YXRpb24gYmFyIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVDSVNJT05fTk9ERSA9ICJkZWNpc2lvbiBub2RlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RBUlRfTk9ERSA9ICJzdGFydCBub2RlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5EX05PREUgPSAiZW5kIG5vZGUiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXT1JLX1BST0RVQ1QgPSAid29yayBwcm9kdWN0IHRlbXBsYXRlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUk9MRV9ERVNDUklQVE9SID0gInJvbGUgZGVzY3JpcHRvciB0ZW1wbGF0ZSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBU0tfREVTQ1JJUFRPUiA9ICJ0YXNrIGRlc2NyaXB0b3IgdGVtcGxhdGUiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUiA9ICJ3b3JrIHByb2R1Y3QgZGVzY3JpcHRvciB0ZW1wbGF0ZSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZSRUVfVEVYVCA9ICJmcmVlIHRleHQiOyAvLyROT04tTkxTLTEkCi0KLQkvLyBUT0RPOiBtb3ZlIHRoZXNlIGNvbnN0YW50cyB0byBvdGhlciBmaWxlLiBUaGlzIGNsYXNzIGRlZmluZSBvbmx5IHRlbXBsYXRlCi0JLy8gY29uc3RhbnRzCi0JLy8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9GT05UX05BTUUgPSAicHJvcGVydHlfZm9udF9uYW1lIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfRk9OVF9TVFlMRSA9ICJwcm9wZXJ0eV9mb250X3N0eWxlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfRk9OVF9IRUlHSFQgPSAicHJvcGVydHlfZm9udF9oZWlnaHQiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9GT05UX1JFRCA9ICJwcm9wZXJ0eV9mb250X3JlZCI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX0ZPTlRfQkxVRSA9ICJwcm9wZXJ0eV9mb250X2JsdWUiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9GT05UX0dSRUVOID0gInByb3BlcnR5X2ZvbnRfZ3JlZW4iOyAvLyROT04tTkxTLTEkCi0KLQkvLyBGb3IgZGVmYXVsdCBmb250cy4KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0ZPTlRfTkFNRSA9IGdldEZvbnROYW1lKCk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX0ZPTlRfU0laRSA9IDg7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEZvbnQgREVGQVVMVF9GT05UID0gbmV3IEZvbnQobnVsbCwgREVGQVVMVF9GT05UX05BTUUsCi0JCQlERUZBVUxUX0ZPTlRfU0laRSwgamF2YS5hd3QuRm9udC5QTEFJTik7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEZvbnQgREVGQVVMVF9GT05UX0lUQUxJQyA9IG5ldyBGb250KG51bGwsCi0JCQlERUZBVUxUX0ZPTlRfTkFNRSwgREVGQVVMVF9GT05UX1NJWkUsIGphdmEuYXd0LkZvbnQuSVRBTElDKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdJTl8ySyA9ICJXaW5kb3dzIDIwMDAiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBnZXRGb250TmFtZSgpIHsKLQkJU3RyaW5nIG5hbWUgPSAiQXJpYWwiOyAvLyROT04tTkxTLTEkCi0KLQkJLy8gQ29ycnVwdGVkIEphcGFuZXNlIGNoYXJhY3RlcnMgaW4gQWN0aXZpdHkgRGlhZ3JhbXMKLQkJU3RyaW5nIGN1cnJlbnRMb2NhbGUgPSBQbGF0Zm9ybS5nZXROTCgpOwotCQlpZiAoY3VycmVudExvY2FsZSAhPSBudWxsCi0JCQkJJiYgY3VycmVudExvY2FsZS5zdGFydHNXaXRoKExvY2FsZS5KQVBBTkVTRS5nZXRMYW5ndWFnZSgpKSkgewotCQkJaWYgKFdJTl8ySy5lcXVhbHNJZ25vcmVDYXNlKFN5c3RlbS5nZXRQcm9wZXJ0eSgib3MubmFtZSIpKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJbmFtZSA9IExpYnJhcnlSZXNvdXJjZXMucm9sZURpYWdyYW1Gb250X25hbWVfd2luMzI7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG5hbWU7Ci0JfQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFERF9ST0xFX1RBU0tTX0JPWF9CR19DT0xPUl9SR0IgPSAiQUREX1JPTEVfVEFTS1NfQk9YX0JHX0NPTE9SX1JHQiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBRERfV1BfQk9YX0JHX0NPTE9SX1JHQiA9ICJBRERfV1BfQk9YX0JHX0NPTE9SX1JHQiI7IC8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL3V0aWwvVmFsaWRhdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvdXRpbC9WYWxpZGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkYjE5ZDcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvdXRpbC9WYWxpZGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MzMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlUcmVlSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuQWN0aXZpdHlEZXRhaWxEaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkFjdGl2aXR5RGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5EaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Sb2xlTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5UYXNrTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5UeXBlZE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuV29ya0JyZWFrZG93bkVsZW1lbnROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLldvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwudXRpbC5HcmFwaGljYWxEYXRhSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLklCU0l0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuUHJvY2Vzc1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvcjsKLQotLyoqCi0gKiBWYWxpZGF0aW5nIHJvdXRpbmVzIGZvciBkaWFncmFtIGVkaXRpbmcKLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgVmFsaWRhdGlvbiB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgZXJyTXNnX0Nhbk5vdENvbm5lY3QgPSBBdXRob3JpbmdVSVJlc291cmNlcy5EaWFncmFtVmFsaWRhdGlvbl9lcnJfY2Fubm90X2Nvbm5lY3RfdGV4dDsgCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgZXJyTXNnX1NhbWVQcmVkQW5kU3VjYyA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLkRpYWdyYW1WYWxpZGF0aW9uX2Vycl9zYW1lcHJlZGFuZHN1Y190ZXh0OyAKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBlcnJNc2dfQ2FuTm90RGVsZXRlID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuRGlhZ3JhbVZhbGlkYXRpb25fZXJyX2Nhbm5vdF9kZWxldGVfdGV4dDsgCi0KLQkvKioKLQkgKiBDaGVja3MgaWYgdXNlciBjYW4gY29ubmVjdCB0aGUgZ2l2ZW4gbm9kZXMuCi0JICogCi0JICogQHBhcmFtIHNvdXJjZQotCSAqIEBwYXJhbSB0YXJnZXQKLQkgKiBAcmV0dXJuIG51bGwgaWYgY29ubmVjdGlvbiBpcyBhbGxvd2VkLCBlcnJvciBtZXNzYWdlIG90aGVyd2lzZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjaGVja0Nvbm5lY3QoTm9kZSBzb3VyY2UsIE5vZGUgdGFyZ2V0KSB7Ci0JCWlmIChzb3VyY2UuZ2V0RGlhZ3JhbSgpICE9IHRhcmdldC5nZXREaWFncmFtKCkpCi0JCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMuRGlhZ3JhbVZhbGlkYXRpb25fZXJyX2Nhbm5vdF9jb25uZWN0X3RleHQ7Ci0KLQkJaWYgKHNvdXJjZS5nZXREaWFncmFtKCkgaW5zdGFuY2VvZiBBY3Rpdml0eURpYWdyYW0pIHsKLQkJCUFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5ID0gVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJLmdldFdCU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCk7Ci0JCQlPYmplY3QgYWRhcHRlciA9IGFkYXB0ZXJGYWN0b3J5LmFkYXB0KHNvdXJjZS5nZXREaWFncmFtKCkKLQkJCQkJLmdldE9iamVjdCgpLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkJT2JqZWN0IHByb2MgPSBudWxsOwotCQkJaWYgKGFkYXB0ZXIgaW5zdGFuY2VvZiBJQlNJdGVtUHJvdmlkZXIpIHsKLQkJCQlwcm9jID0gKChJQlNJdGVtUHJvdmlkZXIpIGFkYXB0ZXIpLmdldFRvcEl0ZW0oKTsKLQkJCX0KLQkJCS8vIGdldCBhbGwgYnJlYWtkb3duIGVsZW1lbnRzIGluIHRoaXMgcHJvY2VzcwotCQkJTGlzdDxPYmplY3Q+IGFsbEVsZW1lbnRzID0gbmV3IEFycmF5TGlzdDxPYmplY3Q+KCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBuZXcgQWRhcHRlckZhY3RvcnlUcmVlSXRlcmF0b3IoYWRhcHRlckZhY3RvcnksCi0JCQkJCXByb2MpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3Qgb2JqID0gaXRlci5uZXh0KCk7Ci0JCQkJYWxsRWxlbWVudHMuYWRkKFRuZ1V0aWwudW53cmFwKG9iaikpOwotCQkJfQotCQkJaWYgKHByb2MgIT0gbnVsbCkgewotCQkJCS8vIElmIHRhcmdldCBpcyBSZWFkT25seSAobWVhbnMgZXh0ZW5kcykgYW5kIGFsbG93IHRoZSBsaW5rIGlmCi0JCQkJLy8gaXRzIHBhcmVudCBhY3Rpdml0eSBpcyBhIENvbnRyaWJ1dG9yCi0JCQkJaWYgKHRhcmdldC5nZXREaWFncmFtKCkuaXNSZWFkT25seSgpKQotCQkJCQlyZXR1cm4gZXJyTXNnX0Nhbk5vdENvbm5lY3Q7Ci0JCQkJaWYgKHNvdXJjZS5nZXRPYmplY3QoKSBpbnN0YW5jZW9mIFdvcmtCcmVha2Rvd25FbGVtZW50KSB7Ci0JCQkJCWlmICh0YXJnZXQuZ2V0T2JqZWN0KCkgaW5zdGFuY2VvZiBXb3JrQnJlYWtkb3duRWxlbWVudCkgewotCQkJCQkJaWYgKFByb2Nlc3NVdGlsLmNoZWNrQ2lyY3VsYXIoCi0JCQkJCQkJCShXb3JrQnJlYWtkb3duRWxlbWVudCkgdGFyZ2V0LmdldE9iamVjdCgpLAotCQkJCQkJCQkoV29ya0JyZWFrZG93bkVsZW1lbnQpIHNvdXJjZS5nZXRPYmplY3QoKSwKLQkJCQkJCQkJYWxsRWxlbWVudHMpKSB7Ci0JCQkJCQkJcmV0dXJuIGVyck1zZ19TYW1lUHJlZEFuZFN1Y2M7Ci0JCQkJCQl9Ci0JCQkJCQlpZiAodGFyZ2V0LmlzUmVhZE9ubHkoKSkKLQkJCQkJCQlyZXR1cm4gZXJyTXNnX0Nhbk5vdENvbm5lY3Q7Ci0JCQkJCX0gZWxzZSBpZiAodGFyZ2V0IGluc3RhbmNlb2YgVHlwZWROb2RlKSB7Ci0JCQkJCQkvLyBzaG91bGQgbm90IGFsbG93IGluY29taW5nIGNvbm5lY3Rpb24gdG8gc3RhcnQgbm9kZQotCQkJCQkJLy8gYW5kIEZyZWVUZXh0LgotCQkJCQkJaWYgKCgoVHlwZWROb2RlKSB0YXJnZXQpLmdldFR5cGUoKSA9PSBUeXBlZE5vZGUuU1RBUlQKLQkJCQkJCQkJfHwgKChUeXBlZE5vZGUpIHRhcmdldCkuZ2V0VHlwZSgpID09IFR5cGVkTm9kZS5GUkVFX1RFWFQpIHsKLQkJCQkJCQlyZXR1cm4gZXJyTXNnX0Nhbk5vdENvbm5lY3Q7Ci0JCQkJCQl9Ci0KLQkJCQkJCUNvbGxlY3Rpb24gdGFyZ2V0Tm9kZXMgPSBHcmFwaGljYWxEYXRhSGVscGVyCi0JCQkJCQkJCS5nZXRUYXJnZXROb2RlcygoVHlwZWROb2RlKSB0YXJnZXQsCi0JCQkJCQkJCQkJV29ya0JyZWFrZG93bkVsZW1lbnROb2RlLmNsYXNzKTsKLQkJCQkJCVdvcmtCcmVha2Rvd25FbGVtZW50IHByZWQgPSAoV29ya0JyZWFrZG93bkVsZW1lbnQpIHNvdXJjZQotCQkJCQkJCQkuZ2V0T2JqZWN0KCk7Ci0JCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB0YXJnZXROb2Rlcy5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJTm9kZSBub2RlID0gKChOb2RlKSBpdGVyLm5leHQoKSk7Ci0JCQkJCQkJaWYgKG5vZGUuaXNSZWFkT25seSgpKQotCQkJCQkJCQlyZXR1cm4gZXJyTXNnX0Nhbk5vdENvbm5lY3Q7Ci0JCQkJCQkJaWYgKFByb2Nlc3NVdGlsLmNoZWNrQ2lyY3VsYXIoCi0JCQkJCQkJCQkoV29ya0JyZWFrZG93bkVsZW1lbnQpIG5vZGUuZ2V0T2JqZWN0KCksCi0JCQkJCQkJCQlwcmVkLCBhbGxFbGVtZW50cykpIHsKLQkJCQkJCQkJcmV0dXJuIGVyck1zZ19TYW1lUHJlZEFuZFN1Y2M7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfSBlbHNlIGlmIChzb3VyY2UgaW5zdGFuY2VvZiBUeXBlZE5vZGUpIHsKLQkJCQkJaWYgKHRhcmdldCA9PSBzb3VyY2UpIHsKLQkJCQkJCXJldHVybiBlcnJNc2dfQ2FuTm90Q29ubmVjdDsKLQkJCQkJfQotCQkJCQkvLyBzaG91bGQgbm90IGFsbG93IG91dGdvaW5nIGNvbm5lY3Rpb24gZnJvbSBFbmQgTm9kZSBhbmQKLQkJCQkJLy8gRnJlZSBUZXh0Ci0JCQkJCWlmICgoKFR5cGVkTm9kZSkgc291cmNlKS5nZXRUeXBlKCkgPT0gVHlwZWROb2RlLkVORAotCQkJCQkJCXx8ICgoVHlwZWROb2RlKSBzb3VyY2UpLmdldFR5cGUoKSA9PSBUeXBlZE5vZGUuRlJFRV9URVhUKSB7Ci0JCQkJCQlyZXR1cm4gZXJyTXNnX0Nhbk5vdENvbm5lY3Q7Ci0JCQkJCX0KLQotCQkJCQlpZiAodGFyZ2V0IGluc3RhbmNlb2YgVHlwZWROb2RlKSB7Ci0KLQkJCQkJCS8qCi0JCQkJCQkgKiBJZiBzb3VyY2UgYW5kIHRhcmdldCBhcmUgVHlwZWROb2RlcywgYXZvaWQgY2lyY3VsYXIKLQkJCQkJCSAqIGxvb3AgY29ubmVjdGlvbi4KLQkJCQkJCSAqLwotCQkJCQkJaWYgKGNoZWNrU3luY0JhckNpcmN1bGFyTG9vb3AoKFR5cGVkTm9kZSkgc291cmNlLAotCQkJCQkJCQkoVHlwZWROb2RlKSB0YXJnZXQpICE9IG51bGwpIHsKLQkJCQkJCQlyZXR1cm4gZXJyTXNnX0Nhbk5vdENvbm5lY3Q7Ci0JCQkJCQl9Ci0KLQkJCQkJCS8vIHNob3VsZCBub3QgYWxsb3cgaW5jb21pbmcgY29ubmVjdGlvbiB0byBzdGFydCBub2RlCi0JCQkJCQkvLyBhbmQgRnJlZVRleHQuCi0JCQkJCQlpZiAoKChUeXBlZE5vZGUpIHRhcmdldCkuZ2V0VHlwZSgpID09IFR5cGVkTm9kZS5TVEFSVAotCQkJCQkJCQl8fCAoKFR5cGVkTm9kZSkgdGFyZ2V0KS5nZXRUeXBlKCkgPT0gVHlwZWROb2RlLkZSRUVfVEVYVCkgewotCQkJCQkJCXJldHVybiBlcnJNc2dfQ2FuTm90Q29ubmVjdDsKLQkJCQkJCX0KLQotCQkJCQkJQ29sbGVjdGlvbiBzcmNOb2RlcyA9IEdyYXBoaWNhbERhdGFIZWxwZXIKLQkJCQkJCQkJLmdldFNvdXJjZU5vZGVzKChUeXBlZE5vZGUpIHNvdXJjZSwKLQkJCQkJCQkJCQlXb3JrQnJlYWtkb3duRWxlbWVudE5vZGUuY2xhc3MpOwotCQkJCQkJaWYgKCFzcmNOb2Rlcy5pc0VtcHR5KCkpIHsKLQkJCQkJCQlDb2xsZWN0aW9uIHRhcmdldE5vZGVzID0gR3JhcGhpY2FsRGF0YUhlbHBlcgotCQkJCQkJCQkJLmdldFRhcmdldE5vZGVzKChUeXBlZE5vZGUpIHRhcmdldCwKLQkJCQkJCQkJCQkJV29ya0JyZWFrZG93bkVsZW1lbnROb2RlLmNsYXNzKTsKLQkJCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB0YXJnZXROb2Rlcy5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJCQlOb2RlIG5vZGUgPSAoKE5vZGUpIGl0ZXIubmV4dCgpKTsKLQkJCQkJCQkJaWYgKG5vZGUuaXNSZWFkT25seSgpKQotCQkJCQkJCQkJcmV0dXJuIGVyck1zZ19DYW5Ob3RDb25uZWN0OwotCQkJCQkJCQlXb3JrQnJlYWtkb3duRWxlbWVudCBzdWNjID0gKFdvcmtCcmVha2Rvd25FbGVtZW50KSBub2RlCi0JCQkJCQkJCQkJLmdldE9iamVjdCgpOwotCQkJCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gc3JjTm9kZXMuaXRlcmF0b3IoKTsgaXRlcmF0b3IKLQkJCQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJCQkJV29ya0JyZWFrZG93bkVsZW1lbnQgcHJlZCA9IChXb3JrQnJlYWtkb3duRWxlbWVudCkgKChOb2RlKSBpdGVyYXRvcgotCQkJCQkJCQkJCQkubmV4dCgpKS5nZXRPYmplY3QoKTsKLQkJCQkJCQkJCWlmIChQcm9jZXNzVXRpbC5jaGVja0NpcmN1bGFyKHN1Y2MsIHByZWQsCi0JCQkJCQkJCQkJCWFsbEVsZW1lbnRzKSkgewotCQkJCQkJCQkJCXJldHVybiBlcnJNc2dfU2FtZVByZWRBbmRTdWNjOwotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9IGVsc2UgaWYgKHRhcmdldCBpbnN0YW5jZW9mIFdvcmtCcmVha2Rvd25FbGVtZW50Tm9kZSkgewotCi0JCQkJCQlpZiAodGFyZ2V0LmlzUmVhZE9ubHkoKSkKLQkJCQkJCQlyZXR1cm4gZXJyTXNnX0Nhbk5vdENvbm5lY3Q7Ci0KLQkJCQkJCUNvbGxlY3Rpb24gc3JjTm9kZXMgPSBHcmFwaGljYWxEYXRhSGVscGVyCi0JCQkJCQkJCS5nZXRTb3VyY2VOb2RlcygoVHlwZWROb2RlKSBzb3VyY2UsCi0JCQkJCQkJCQkJV29ya0JyZWFrZG93bkVsZW1lbnROb2RlLmNsYXNzKTsKLQkJCQkJCVdvcmtCcmVha2Rvd25FbGVtZW50IHN1Y2MgPSAoV29ya0JyZWFrZG93bkVsZW1lbnQpICgoTm9kZSkgdGFyZ2V0KQotCQkJCQkJCQkuZ2V0T2JqZWN0KCk7Ci0JCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gc3JjTm9kZXMuaXRlcmF0b3IoKTsgaXRlcmF0b3IKLQkJCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCQlXb3JrQnJlYWtkb3duRWxlbWVudCBwcmVkID0gKFdvcmtCcmVha2Rvd25FbGVtZW50KSAoKE5vZGUpIGl0ZXJhdG9yCi0JCQkJCQkJCQkubmV4dCgpKS5nZXRPYmplY3QoKTsKLQkJCQkJCQlpZiAoUHJvY2Vzc1V0aWwuY2hlY2tDaXJjdWxhcihzdWNjLCBwcmVkLAotCQkJCQkJCQkJYWxsRWxlbWVudHMpKSB7Ci0JCQkJCQkJCXJldHVybiBlcnJNc2dfU2FtZVByZWRBbmRTdWNjOwotCQkJCQkJCX0KLQkJCQkJCX0KLQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9IGVsc2UgaWYgKHNvdXJjZS5nZXREaWFncmFtKCkgaW5zdGFuY2VvZiBBY3Rpdml0eURldGFpbERpYWdyYW0pIHsKLQkJCWlmIChzb3VyY2UuaXNSZWFkT25seSgpIHx8IHRhcmdldC5pc1JlYWRPbmx5KCkpIHsKLQkJCQlyZXR1cm4gZXJyTXNnX0Nhbk5vdENvbm5lY3Q7Ci0JCQl9Ci0KLQkJCWlmICgoc291cmNlLmdldE9iamVjdCgpIGluc3RhbmNlb2YgUm9sZURlc2NyaXB0b3IgfHwgdGFyZ2V0Ci0JCQkJCS5nZXRPYmplY3QoKSBpbnN0YW5jZW9mIFJvbGVEZXNjcmlwdG9yKQotCQkJCQl8fCAoc291cmNlLmdldE9iamVjdCgpIGluc3RhbmNlb2YgVGFza0Rlc2NyaXB0b3IgJiYgdGFyZ2V0Ci0JCQkJCQkJLmdldE9iamVjdCgpIGluc3RhbmNlb2YgVGFza0Rlc2NyaXB0b3IpCi0JCQkJCXx8IChzb3VyY2UuZ2V0T2JqZWN0KCkgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3IgJiYgdGFyZ2V0Ci0JCQkJCQkJLmdldE9iamVjdCgpIGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yKSkgewotCQkJCXJldHVybiBlcnJNc2dfQ2FuTm90Q29ubmVjdDsKLQkJCX0gZWxzZSB7Ci0JCQkJLy8gY2hlY2sgZm9yIGR1cGxpY2F0ZSBjb25uZWN0aW9uCi0JCQkJLy8KLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBzb3VyY2UuZ2V0T3V0Z29pbmdDb25uZWN0aW9ucygpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCUxpbmsgbGluayA9IChMaW5rKSBpdGVyLm5leHQoKTsKLQkJCQkJaWYgKGxpbmsuZ2V0VGFyZ2V0KCkgPT0gdGFyZ2V0KSB7Ci0JCQkJCQlyZXR1cm4gZXJyTXNnX0Nhbk5vdENvbm5lY3Q7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCX0KLQkJfSBlbHNlIGlmIChzb3VyY2UuZ2V0RGlhZ3JhbSgpIGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbSkgewotCQkJaWYgKHNvdXJjZS5pc1JlYWRPbmx5KCkgfHwgdGFyZ2V0LmlzUmVhZE9ubHkoKSkgewotCQkJCXJldHVybiBlcnJNc2dfQ2FuTm90Q29ubmVjdDsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNoZWNrRGVsZXRlKExpbmsgbGluaykgewotCi0JCS8vIGlmIChsaW5rLmdldFRhcmdldCgpICE9IG51bGwKLQkJLy8gJiYgbGluay5nZXRUYXJnZXQoKS5nZXREaWFncmFtKCkgaW5zdGFuY2VvZiBBY3Rpdml0eURpYWdyYW0pIHsKLQkJLy8gaWYgKGxpbmsuZ2V0VGFyZ2V0KCkuaXNSZWFkT25seSgpKXsKLQkJLy8gaWYobGluay5nZXRTb3VyY2UoKSBpbnN0YW5jZW9mIFR5cGVkTm9kZSl7Ci0JCS8vIGlmKCgoVHlwZWROb2RlKWxpbmsuZ2V0U291cmNlKCkpLmdldFR5cGUoKSA9PSBUeXBlZE5vZGUuREVDSVNJT04pewotCQkvLyByZXR1cm4gbnVsbDsKLQkJLy8gfQotCQkvLyB9Ci0JCS8vIHJldHVybiBlcnJNc2dfQ2FuTm90RGVsZXRlOwotCQkvLyB9Ci0JCS8vIGlmIChsaW5rLmdldFRhcmdldCgpIGluc3RhbmNlb2YgVHlwZWROb2RlKSB7Ci0JCS8vCQkJCQotCQkvLyBUeXBlZE5vZGUgdHlwZWRub2RlID0gKFR5cGVkTm9kZSlsaW5rLmdldFRhcmdldCgpOwotCQkvLyBpZih0eXBlZG5vZGUuZ2V0VHlwZSgpID09IFR5cGVkTm9kZS5ERUNJU0lPTil7Ci0JCS8vIHJldHVybiBudWxsOwotCQkvLyB9Ci0JCS8vIGlmKGxpbmsuZ2V0U291cmNlKCkgaW5zdGFuY2VvZiBUeXBlZE5vZGUpewotCQkvLyB0eXBlZG5vZGUgPSAoVHlwZWROb2RlKWxpbmsuZ2V0U291cmNlKCk7Ci0JCS8vIGlmKHR5cGVkbm9kZS5nZXRUeXBlKCkgPT0gVHlwZWROb2RlLkRFQ0lTSU9OKXsKLQkJLy8gcmV0dXJuIG51bGw7Ci0JCS8vIH0KLQkJLy8gfQotCQkvLwkJCQkKLQkJLy8gaWYgKGxpbmsuZ2V0U291cmNlKCkuaXNSZWFkT25seSgpKQotCQkvLyByZXR1cm4gZXJyTXNnX0Nhbk5vdERlbGV0ZTsKLQkJLy8JCQkJCi0JCS8vIGlmIChsaW5rLmdldFNvdXJjZSgpLmdldE9iamVjdCgpIGluc3RhbmNlb2YgV29ya0JyZWFrZG93bkVsZW1lbnQKLQkJLy8gfHwgKGxpbmsuZ2V0U291cmNlKCkgaW5zdGFuY2VvZiBUeXBlZE5vZGUgJiYgIUdyYXBoaWNhbERhdGFIZWxwZXIKLQkJLy8gLmdldFNvdXJjZU5vZGVzKChUeXBlZE5vZGUpIGxpbmsuZ2V0U291cmNlKCksCi0JCS8vIFdvcmtCcmVha2Rvd25FbGVtZW50Tm9kZS5jbGFzcykKLQkJLy8gLmlzRW1wdHkoKSkpIHsKLQkJLy8JCQkJCQotCQkvLyBDb2xsZWN0aW9uIHRhcmdldE5vZGVzID0KLQkJLy8gR3JhcGhpY2FsRGF0YUhlbHBlci5nZXRUYXJnZXROb2RlcygoVHlwZWROb2RlKSBsaW5rLmdldFRhcmdldCgpLAotCQkvLyBXb3JrQnJlYWtkb3duRWxlbWVudE5vZGUuY2xhc3MpOwotCQkvLyBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB0YXJnZXROb2Rlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJLy8gTm9kZSBub2RlID0gKE5vZGUpIGl0ZXIubmV4dCgpOwotCQkvLyBpZiAobm9kZS5pc1JlYWRPbmx5KCkpIHsKLQkJLy8gcmV0dXJuIGVyck1zZ19DYW5Ob3REZWxldGU7Ci0JCS8vIH0KLQkJLy8gfQotCQkvLyB9Ci0JCS8vCi0JCS8vIH0KLQkJLy8gaWYgKGxpbmsuZ2V0U291cmNlKCkgaW5zdGFuY2VvZiBUeXBlZE5vZGUpIHsKLQkJLy8gVHlwZWROb2RlIHR5cGVkbm9kZSA9IChUeXBlZE5vZGUpbGluay5nZXRTb3VyY2UoKTsKLQkJLy8gaWYodHlwZWRub2RlLmdldFR5cGUoKSA9PSBUeXBlZE5vZGUuREVDSVNJT04pewotCQkvLyByZXR1cm4gbnVsbDsKLQkJLy8gfQotCQkvLyBpZiAobGluay5nZXRUYXJnZXQoKS5pc1JlYWRPbmx5KCkpCi0JCS8vIHJldHVybiBlcnJNc2dfQ2FuTm90RGVsZXRlOwotCQkvLyB9Ci0JCS8vIH0gZWxzZSBpZiAoKGxpbmsuZ2V0VGFyZ2V0KCkgIT0gbnVsbCAmJgotCQkvLyBsaW5rLmdldFRhcmdldCgpLmlzUmVhZE9ubHkoKSkKLQkJLy8gfHwgKGxpbmsuZ2V0U291cmNlKCkgIT0gbnVsbCAmJiBsaW5rLmdldFNvdXJjZSgpLmlzUmVhZE9ubHkoKSkpIHsKLQkJLy8gcmV0dXJuIGVyck1zZ19DYW5Ob3REZWxldGU7Ci0JCS8vIH0KLQkJLy8gcmV0dXJuIG51bGw7Ci0KLQkJTm9kZSBzb3VyY2UgPSBsaW5rLmdldFNvdXJjZSgpOwotCQlOb2RlIHRhcmdldCA9IGxpbmsuZ2V0VGFyZ2V0KCk7Ci0KLQkJLy8gU3BlY2lhbCBoYW5kbGUgZm9yIEFjdGl2aXR5IERldGFpbCBEaWFncmFtIGxpbmtzIGNhbm5vdCBiZSBkZWxldGVkLgotCQlpZiAodGFyZ2V0ICE9IG51bGwKLQkJCQkmJiB0YXJnZXQuZ2V0RGlhZ3JhbSgpIGluc3RhbmNlb2YgQWN0aXZpdHlEZXRhaWxEaWFncmFtKSB7Ci0JCQlyZXR1cm4gZXJyTXNnX0Nhbk5vdERlbGV0ZTsKLQkJfQotCi0JCWlmICh0YXJnZXQgIT0gbnVsbCAmJiB0YXJnZXQuZ2V0RGlhZ3JhbSgpIGluc3RhbmNlb2YgQWN0aXZpdHlEaWFncmFtKSB7Ci0KLQkJCS8vIFRhcmdldCA9IGJyZWFrZG93bmVsZW1lbnQKLQkJCWlmICh0YXJnZXQgaW5zdGFuY2VvZiBXb3JrQnJlYWtkb3duRWxlbWVudE5vZGUpIHsKLQkJCQkvLyBTb3VyY2UgPSBCcmVha2Rvd24gZWxlbWVudAotCQkJCWlmIChzb3VyY2UgaW5zdGFuY2VvZiBXb3JrQnJlYWtkb3duRWxlbWVudE5vZGUpIHsKLQkJCQkJaWYgKGxpbmsuZ2V0VGFyZ2V0KCkuaXNSZWFkT25seSgpKQotCQkJCQkJcmV0dXJuIGVyck1zZ19DYW5Ob3REZWxldGU7Ci0JCQkJCWVsc2UKLQkJCQkJCXJldHVybiBudWxsOwotCQkJCX0KLQkJCQkvLyBTb3VyY2UgPSBUeXBlZE5vZGUKLQkJCQlpZiAoc291cmNlIGluc3RhbmNlb2YgVHlwZWROb2RlKSB7Ci0JCQkJCS8vIFNvdXJjZSA9IERlY2lzaW9uIE5vZGUKLQkJCQkJVHlwZWROb2RlIHNvdXJjZU5vZGUgPSAoVHlwZWROb2RlKSBzb3VyY2U7Ci0JCQkJCWlmICghdGFyZ2V0LmlzUmVhZE9ubHkoKSkgewotCQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJCX0gZWxzZSBpZiAoc291cmNlTm9kZS5nZXRUeXBlKCkgPT0gVHlwZWROb2RlLkRFQ0lTSU9OKSB7Ci0JCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQkJfSBlbHNlIGlmIChzb3VyY2VOb2RlLmdldFR5cGUoKSA9PSBUeXBlZE5vZGUuU1lOQ0hfQkFSKSB7Ci0JCQkJCQlyZXR1cm4gY2hlY2tTeW5jQmFySW5jb21pbmdMaW5rcyhzb3VyY2VOb2RlKTsKLQkJCQkJfSBlbHNlIGlmIChzb3VyY2VOb2RlLmlzUmVhZE9ubHkoKSkgewotCQkJCQkJcmV0dXJuIGVyck1zZ19DYW5Ob3REZWxldGU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ly8gVGFyZ2V0IGlzIFR5cGVkTm9kZQotCQkJZWxzZSBpZiAodGFyZ2V0IGluc3RhbmNlb2YgVHlwZWROb2RlKSB7Ci0KLQkJCQlUeXBlZE5vZGUgdHlwZWROb2RlID0gKFR5cGVkTm9kZSkgdGFyZ2V0OwotCQkJCS8vIGlmIFRhcmdldCBpcyBUeXBlZE5vZGUgYW5kIGl0cyBhIERlY2lzaW9uUG9pbnQgLSBzaG91bGQgYmUKLQkJCQkvLyBibGFjay4KLQkJCQlpZiAodHlwZWROb2RlLmdldFR5cGUoKSA9PSBUeXBlZE5vZGUuREVDSVNJT04pIHsKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCQkJCS8vIElmIFRhcmdldCBpcyBUeXBlZE5vZGUgYW5kIGFuZCBTb3VyY2UgaXMgV29ya0JyZWFrZG93bkVsZW1lbnQKLQkJCQkvLyBhbmQgcmVhZG9ubHkKLQkJCQkvLyBMaW5rIHNob3VsZCBiZSBncmVlbi4KLQkJCQlpZiAoc291cmNlIGluc3RhbmNlb2YgV29ya0JyZWFrZG93bkVsZW1lbnROb2RlKSB7Ci0JCQkJCS8vIENoZWNrIFRhcmdldCAtIGlzIGhhdmluZyBhbnkgaW5kaXJlY3Qob3V0Z29pbmcKLQkJCQkJLy8gY29ubm5lY3Rpb24pIGNvbnRhaW5zIGRlY2lzaW9uIHBvaW50cy4KLQkJCQkJaWYgKGNoZWNrU3luY0Jhck91dGdvaW5nTGlua3MoKFR5cGVkTm9kZSkgdGFyZ2V0KSA9PSBudWxsKQotCQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJCWlmIChzb3VyY2UuaXNSZWFkT25seSgpKQotCQkJCQkJcmV0dXJuIGVyck1zZ19DYW5Ob3REZWxldGU7Ci0JCQkJfQotCQkJCWlmIChzb3VyY2UgaW5zdGFuY2VvZiBUeXBlZE5vZGUpIHsKLQkJCQkJVHlwZWROb2RlIHNvdXJjZVR5cGVkTm9kZSA9IChUeXBlZE5vZGUpIHNvdXJjZTsKLQkJCQkJLy8gU291cmNlIGlzIFR5cGVkIE5vZGUgYW5kIGl0cyBhIGRlY2lzaW9uIHBvaW50IHJldHVybgotCQkJCQkvLyBudWxsLgotCQkJCQlpZiAoc291cmNlVHlwZWROb2RlLmdldFR5cGUoKSA9PSBUeXBlZE5vZGUuREVDSVNJT04pIHsKLQkJCQkJCXJldHVybiBudWxsOwotCQkJCQl9Ci0JCQkJCS8vIGlmIHNvdXJjZSBpcyBTeW5jQmFyIGFuZCBjaGVjayBhbGwgaXRzIGluY29taW5nCi0JCQkJCS8vIGNvbm5lY3Rpb25zLgotCQkJCQlpZiAoc291cmNlVHlwZWROb2RlLmdldFR5cGUoKSA9PSBUeXBlZE5vZGUuU1lOQ0hfQkFSKSB7Ci0JCQkJCQlyZXR1cm4gY2hlY2tTeW5jQmFySW5jb21pbmdMaW5rcyhzb3VyY2VUeXBlZE5vZGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNoZWNrRGVsZXRlKE5vZGUgbm9kZSkgewotCQlpZiAobm9kZS5pc1JlYWRPbmx5KCkpCi0JCQlyZXR1cm4gZXJyTXNnX0Nhbk5vdERlbGV0ZTsKLQkJRGlhZ3JhbSBkaWFncmFtID0gbm9kZS5nZXREaWFncmFtKCk7Ci0JCWlmIChkaWFncmFtIGluc3RhbmNlb2YgQWN0aXZpdHlEaWFncmFtKSB7Ci0JCQlpZiAobm9kZSBpbnN0YW5jZW9mIFR5cGVkTm9kZSkgewotCQkJCUNvbGxlY3Rpb24gdGFyZ2V0Tm9kZXMgPSBHcmFwaGljYWxEYXRhSGVscGVyLmdldFRhcmdldE5vZGVzKAotCQkJCQkJKFR5cGVkTm9kZSkgbm9kZSwgV29ya0JyZWFrZG93bkVsZW1lbnROb2RlLmNsYXNzKTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB0YXJnZXROb2Rlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJTm9kZSB0YXJnZXQgPSAoTm9kZSkgaXRlci5uZXh0KCk7Ci0JCQkJCWlmICh0YXJnZXQuaXNSZWFkT25seSgpKSB7Ci0JCQkJCQlyZXR1cm4gZXJyTXNnX0Nhbk5vdERlbGV0ZTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSBlbHNlIGlmIChkaWFncmFtIGluc3RhbmNlb2YgQWN0aXZpdHlEZXRhaWxEaWFncmFtKSB7Ci0JCQlpZiAobm9kZSBpbnN0YW5jZW9mIFJvbGVOb2RlKSB7Ci0JCQkJcmV0dXJuIGVyck1zZ19DYW5Ob3REZWxldGU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2hlY2tSZWNvbm5lY3QoTm9kZSBzb3VyY2UsIE5vZGUgdGFyZ2V0LCBMaW5rIGxpbmspIHsKLQkJaWYgKHNvdXJjZS5nZXREaWFncmFtKCkgaW5zdGFuY2VvZiBBY3Rpdml0eURpYWdyYW0pIHsKLQkJCWlmIChsaW5rLmdldFRhcmdldCgpICE9IG51bGwpIHsKLQkJCQlpZiAobGluay5nZXRUYXJnZXQoKS5pc1JlYWRPbmx5KCkpIHsKLQkJCQkJcmV0dXJuIGVyck1zZ19DYW5Ob3RDb25uZWN0OwotCQkJCX0gZWxzZSB7Ci0JCQkJCWlmIChsaW5rLmdldFRhcmdldCgpIGluc3RhbmNlb2YgVHlwZWROb2RlKSB7Ci0JCQkJCQlDb2xsZWN0aW9uIHRhcmdldE5vZGVzID0gR3JhcGhpY2FsRGF0YUhlbHBlcgotCQkJCQkJCQkuZ2V0VGFyZ2V0Tm9kZXMoKFR5cGVkTm9kZSkgbGluay5nZXRUYXJnZXQoKSwKLQkJCQkJCQkJCQlXb3JrQnJlYWtkb3duRWxlbWVudE5vZGUuY2xhc3MpOwotCQkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gdGFyZ2V0Tm9kZXMuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJCU5vZGUgbm9kZSA9IChOb2RlKSBpdGVyLm5leHQoKTsKLQkJCQkJCQlpZiAobm9kZS5pc1JlYWRPbmx5KCkpIHsKLQkJCQkJCQkJcmV0dXJuIGVyck1zZ19DYW5Ob3RDb25uZWN0OwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiBjaGVja0Nvbm5lY3Qoc291cmNlLCB0YXJnZXQsIGxpbmspOwotCX0KLQotCS8qCi0JICogTWV0aG9kIHdpbGwgbm90IGFsbG93IG11bHRpcGxlIGxpbmsgYmV0d2VlbiB0d28gbm9kZXMuIE5lZWRzIHRvIGNhbGwKLQkgKiBDcmVha0xpbmtDb21tYW5kIGFuZCBSZWNvbm5lY3RMaW5rQ29tbWFuZC4gQW55IGFjdGlvbiBvbiBhIExpbmsgc2hvdWxkCi0JICogY2FsbCB0aGlzIGNoZWNrQ29ubmVjdChOb2RlIHNvdXJjZSwgTm9kZSB0YXJnZXQsIExpbmsgbGluaykgYmVmb3JlIGFsbG93Ci0JICogdG8gY29ubmVjdC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjaGVja0Nvbm5lY3QoTm9kZSBzb3VyY2UsIE5vZGUgdGFyZ2V0LCBMaW5rIGxpbmspIHsKLQotCQlpZiAoc291cmNlID09IHRhcmdldCAmJiAhKHNvdXJjZS5nZXRPYmplY3QoKSBpbnN0YW5jZW9mIEFjdGl2aXR5KSkgewotCQkJcmV0dXJuIGVyck1zZ19DYW5Ob3RDb25uZWN0OwotCQl9Ci0KLQkJTGlzdCBsaW5rcyA9IHNvdXJjZS5nZXRPdXRnb2luZ0Nvbm5lY3Rpb25zKCk7Ci0JCWlmIChsaW5rcyAhPSBudWxsKSB7Ci0JCQkvLyBUaGlzIGlzIG5lZWQgZm9yIHJlY29ubmVjdCB0byBzYW1lIHRhcmdldCBub2RlLgotCQkJaWYgKGxpbmtzLmNvbnRhaW5zKGxpbmspKSB7Ci0JCQkJaWYgKGxpbmsuZ2V0VGFyZ2V0KCkuZXF1YWxzKHRhcmdldCkpIHsKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCQkJfQotCQkJLy8gVGhpcyBpcyBuZWVkIGZvciBuZXcgY29ubmVjdCBhbmQgcmVjb25uZWN0IHRvIGRpZmZlcmVudCB0YXJnZXQKLQkJCS8vIG5vZGUuCi0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBsaW5rcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlMaW5rIGxpbmt4ID0gKExpbmspIGl0ZXIubmV4dCgpOwotCQkJCU9iamVjdCBsaW5reHRhcmdldCA9IGxpbmt4LmdldFRhcmdldCgpOwotCQkJCWlmIChsaW5reHRhcmdldCAhPSBudWxsICYmIGxpbmt4dGFyZ2V0LmVxdWFscyh0YXJnZXQpKSB7Ci0JCQkJCXJldHVybiBlcnJNc2dfQ2FuTm90Q29ubmVjdDsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGNoZWNrQ29ubmVjdChzb3VyY2UsIHRhcmdldCk7Ci0JfQotCi0JLyoKLQkgKiBUbyBhdm9pZCBjaXJjdWxhciBsb29waW5nIGJldHdlZW4gc3luY2hyb25pemF0aW9uIGJhcnMuIElmIFN5Y25CYXIxIC0+Ci0JICogU3luY0JhcjIgKGNvbm5lY3RlZCkgdGhlbiBTeW5jQmFyMiAtPiBTeW5jQmFyMSBjYW5ub3QgY29ubmVjdC4gaWYKLQkgKiBzeW5jYmFyMSAtPiBzeW5jYmFyMi0+c3luY2JhcjMgdGhlbiBzeW5jYmFyMyAtPiBzeW5jYmFyMSBkaXNhbGxvd2VkLgotCSAqIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNoZWNrU3luY0JhckNpcmN1bGFyTG9vb3AoVHlwZWROb2RlIHNOb2RlLAotCQkJVHlwZWROb2RlIHROb2RlKSB7Ci0JCUxpc3QgbGlzdCA9IHROb2RlLmdldE91dGdvaW5nQ29ubmVjdGlvbnMoKTsKLQkJaWYgKCFsaXN0LmlzRW1wdHkoKSAmJiBsaXN0LnNpemUoKSA+IDApIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBsaXN0Lml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCQlMaW5rIGxpbmsgPSAoTGluaykgaXRlcmF0b3IubmV4dCgpOwotCQkJCU5vZGUgdHlwZWRub2RlID0gbGluay5nZXRUYXJnZXQoKTsKLQkJCQlpZiAoc05vZGUuZXF1YWxzKHR5cGVkbm9kZSkpCi0JCQkJCXJldHVybiBlcnJNc2dfQ2FuTm90Q29ubmVjdDsKLQkJCQlpZiAodHlwZWRub2RlIGluc3RhbmNlb2YgVHlwZWROb2RlKSB7Ci0JCQkJCXJldHVybiBjaGVja1N5bmNCYXJDaXJjdWxhckxvb29wKHNOb2RlLAotCQkJCQkJCShUeXBlZE5vZGUpIHR5cGVkbm9kZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogTWV0aG9kIHRvIENoZWNrIGlmIFN5bmNCYXIgaW5Db21taW5nIGNvbm5lY3Rpb25zIGhhdmUgYW55IHNvdXJjZSBpcyBhCi0JICogcmVhZG9ubHkuIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjaGVja1N5bmNCYXJJbmNvbWluZ0xpbmtzKFR5cGVkTm9kZSB0eXBlZE5vZGUpIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gdHlwZWROb2RlLmdldEluY29taW5nQ29ubmVjdGlvbnMoKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCUxpbmsgbGluayA9IChMaW5rKSBpdGVyLm5leHQoKTsKLQkJCU5vZGUgc291cmNlID0gbGluay5nZXRTb3VyY2UoKTsKLQkJCWlmIChzb3VyY2UgaW5zdGFuY2VvZiBXb3JrQnJlYWtkb3duRWxlbWVudE5vZGUpIHsKLQkJCQlpZiAoc291cmNlLmlzUmVhZE9ubHkoKSkKLQkJCQkJcmV0dXJuIGVyck1zZ19DYW5Ob3REZWxldGU7Ci0JCQl9IGVsc2UgaWYgKHNvdXJjZSBpbnN0YW5jZW9mIFR5cGVkTm9kZSkgewotCQkJCWlmICgoKFR5cGVkTm9kZSkgc291cmNlKS5nZXRUeXBlKCkgPT0gVHlwZWROb2RlLlNZTkNIX0JBUikKLQkJCQkJaWYgKGNoZWNrU3luY0JhckluY29taW5nTGlua3MoKFR5cGVkTm9kZSkgc291cmNlKSAhPSBudWxsKQotCQkJCQkJcmV0dXJuIGVyck1zZ19DYW5Ob3REZWxldGU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiBNZXRob2QgdG8gY2hlY2sgaWYgc3luY2hyb25pemF0aW9uIGJhciBvdXRnb2luZyBjb25uZWN0aW9uIGhhcyBhbnkgdGFyZ2V0Ci0JICogaXMgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2hlY2tTeW5jQmFyT3V0Z29pbmdMaW5rcyhUeXBlZE5vZGUgdHlwZWROb2RlKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHR5cGVkTm9kZS5nZXRPdXRnb2luZ0Nvbm5lY3Rpb25zKCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQlMaW5rIGxpbmsgPSAoTGluaykgaXRlci5uZXh0KCk7Ci0JCQlOb2RlIHRhcmdldCA9IGxpbmsuZ2V0VGFyZ2V0KCk7Ci0JCQlpZiAodGFyZ2V0IGluc3RhbmNlb2YgV29ya0JyZWFrZG93bkVsZW1lbnROb2RlKSB7Ci0JCQkJaWYgKHRhcmdldC5pc1JlYWRPbmx5KCkpCi0JCQkJCXJldHVybiBlcnJNc2dfQ2FuTm90RGVsZXRlOwotCQkJfSBlbHNlIGlmICh0YXJnZXQgaW5zdGFuY2VvZiBUeXBlZE5vZGUpIHsKLQkJCQlpZiAoKChUeXBlZE5vZGUpIHRhcmdldCkuZ2V0VHlwZSgpID09IFR5cGVkTm9kZS5TWU5DSF9CQVIpCi0JCQkJCWlmIChjaGVja1N5bmNCYXJPdXRnb2luZ0xpbmtzKChUeXBlZE5vZGUpIHRhcmdldCkgIT0gbnVsbCkKLQkJCQkJCXJldHVybiBlcnJNc2dfQ2FuTm90RGVsZXRlOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENoZWNrIHRvIHNlZSBsaW5rIGlzIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1JlYWRPbmx5KExpbmsgbGluaykgewotCQlOb2RlIHRhcmdldCA9IGxpbmsuZ2V0VGFyZ2V0KCk7Ci0JCU5vZGUgc291cmNlID0gbGluay5nZXRTb3VyY2UoKTsKLQkJaWYgKHRhcmdldCAhPSBudWxsICYmIHRhcmdldC5nZXREaWFncmFtKCkgaW5zdGFuY2VvZiBBY3Rpdml0eURpYWdyYW0pIHsKLQkJCXJldHVybiBjaGVja0RlbGV0ZShsaW5rKSAhPSBudWxsOwotCQl9IGVsc2UgaWYgKHRhcmdldCAhPSBudWxsCi0JCQkJJiYgdGFyZ2V0LmdldERpYWdyYW0oKSBpbnN0YW5jZW9mIEFjdGl2aXR5RGV0YWlsRGlhZ3JhbSkgewotCQkJaWYgKChzb3VyY2UgIT0gbnVsbCAmJiBzb3VyY2UgaW5zdGFuY2VvZiBUYXNrTm9kZSAmJiBzb3VyY2UKLQkJCQkJLmlzUmVhZE9ubHkoKSkKLQkJCQkJfHwgKHRhcmdldCBpbnN0YW5jZW9mIFRhc2tOb2RlICYmIHRhcmdldC5pc1JlYWRPbmx5KCkpKQotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL3V0aWwvcGFja2FnZS5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvdXRpbC9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhOThhNmIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvdXRpbC9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyBpbXBsZW1lbnRhdGlvbiBzdXBwb3J0IGZvciB0aGUgYWN0aXZpdHkgZGlhZ3JhbXMuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvdmlld2VyL0Fic3RyYWN0RGlhZ3JhbUdyYXBoaWNhbFZpZXdlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvdmlld2VyL0Fic3RyYWN0RGlhZ3JhbUdyYXBoaWNhbFZpZXdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYWZiODZiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL3ZpZXdlci9BYnN0cmFjdERpYWdyYW1HcmFwaGljYWxWaWV3ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwNiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi52aWV3ZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuQ29sb3JDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlNXVEdyYXBoaWNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZWRpdC5EaWFncmFtRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZWRpdC5Ob2RlQ29udGFpbmVyRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZmlndXJlcy5TZWxlY3RhYmxlTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuRGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5MaW5rZWRPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTmFtZWROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuU3VwcHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LmRpYWdyYW0uRGlhZ3JhbUluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5SZXNvdXJjZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW1FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5HcmFwaGljYWxWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkxheWVyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cGFydHMuTGF5ZXJNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cGFydHMuU2NhbGFibGVGcmVlZm9ybVJvb3RFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYudWkucGFydHMuU2Nyb2xsaW5nR3JhcGhpY2FsVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5HQzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLQotCi0vKioKLSAqIFRoZSBhYnN0cmFjdCBiYXNlIGNsYXNzIGZvciBhIGdyYXBoaWNhbCB2aWV3ZXIgb2YgdGhlIGVsZW1lbnQgZGlhZ3JhbS4KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0RGlhZ3JhbUdyYXBoaWNhbFZpZXdlciB7Ci0KLQlwcm90ZWN0ZWQgQ29tcG9zaXRlIHBhcmVudDsKLQotCXByb3RlY3RlZCBHcmFwaGljYWxWaWV3ZXIgZ3JhcGhpY2FsVmlld2VyOwotCi0JcHJvdGVjdGVkIE9iamVjdCB3cmFwcGVyOwotCi0JcHVibGljIEFic3RyYWN0RGlhZ3JhbUdyYXBoaWNhbFZpZXdlcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXRoaXMucGFyZW50ID0gcGFyZW50OwotCQljcmVhdGVHcmFwaGljYWxWaWV3ZXIoKTsKLQl9Ci0KLQlwdWJsaWMgQWJzdHJhY3REaWFncmFtR3JhcGhpY2FsVmlld2VyKENvbXBvc2l0ZSBwYXJlbnQsIE9iamVjdCB3cmFwcGVyKSB7Ci0JCXRoaXMucGFyZW50ID0gcGFyZW50OwotCQl0aGlzLndyYXBwZXIgPSB3cmFwcGVyOwotCQljcmVhdGVHcmFwaGljYWxWaWV3ZXIoKTsKLQl9Ci0JLyoqCi0JICogQ3JlYXRlcyB0aGUgR3JhcGhpY2FsVmlld2VyIG9uIHRoZSBzcGVjaWZpZWQgPGNvZGU+Q29tcG9zaXRlPC9jb2RlPgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUdyYXBoaWNhbFZpZXdlcigpIHsKLQkJdGhpcy5ncmFwaGljYWxWaWV3ZXIgPSBuZXcgU2Nyb2xsaW5nR3JhcGhpY2FsVmlld2VyKCk7Ci0JCXRoaXMuZ3JhcGhpY2FsVmlld2VyLmNyZWF0ZUNvbnRyb2wocGFyZW50KTsKLQkJY29uZmlndXJlR3JhcGhpY2FsVmlld2VyKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZ3JhcGhpY2FsIHZpZXdlci4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBncmFwaGljYWwgdmlld2VyCi0JICovCi0JcHJvdGVjdGVkIEdyYXBoaWNhbFZpZXdlciBnZXRHcmFwaGljYWxWaWV3ZXIoKSB7Ci0JCXJldHVybiBncmFwaGljYWxWaWV3ZXI7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlR3JhcGhpY2FsVmlld2VyKCkgewotCQlnZXRHcmFwaGljYWxWaWV3ZXIoKS5nZXRDb250cm9sKCkuc2V0QmFja2dyb3VuZCgKLQkJCQlDb2xvckNvbnN0YW50cy5saXN0QmFja2dyb3VuZCk7Ci0JCVNjcm9sbGluZ0dyYXBoaWNhbFZpZXdlciB2aWV3ZXIgPSAoU2Nyb2xsaW5nR3JhcGhpY2FsVmlld2VyKSBnZXRHcmFwaGljYWxWaWV3ZXIoKTsKLQotCQlTY2FsYWJsZUZyZWVmb3JtUm9vdEVkaXRQYXJ0IHJvb3QgPSBuZXcgU2NhbGFibGVGcmVlZm9ybVJvb3RFZGl0UGFydCgpOwotCQl2aWV3ZXIuc2V0Um9vdEVkaXRQYXJ0KHJvb3QpOwotCQl2aWV3ZXIuc2V0RWRpdFBhcnRGYWN0b3J5KGNyZWF0ZUVkaXRQYXJ0RmFjdG9yeSgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBnZXRGaWd1cmUoKSB7Ci0JCUdyYXBoaWNhbFZpZXdlciB2aWV3ZXIgPSBnZXRHcmFwaGljYWxWaWV3ZXIoKTsKLQotCQkvLyBmaW5kIHRoZSBmaWd1cmUgdG8gYmUgc2F2ZWQKLQkJTGF5ZXJNYW5hZ2VyIGxtID0gKExheWVyTWFuYWdlcikgdmlld2VyLmdldEVkaXRQYXJ0UmVnaXN0cnkoKS5nZXQoCi0JCQkJTGF5ZXJNYW5hZ2VyLklEKTsKLQkJSUZpZ3VyZSBmaWd1cmUgPSBsbS5nZXRMYXllcihMYXllckNvbnN0YW50cy5QUklOVEFCTEVfTEFZRVJTKTsKLQkJcmV0dXJuIGZpZ3VyZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRTdXBwcmVzc2lvblRvRGlhZ3JhbShEaWFncmFtIGRpYWdyYW0pIHsKLQkJT2JqZWN0IGUgPSBkaWFncmFtLmdldE9iamVjdCgpOwotCQlpZiAoZSBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnQpIHsKLQkJCVByb2Nlc3MgcHJvYyA9IFRuZ1V0aWwuZ2V0T3duaW5nUHJvY2VzcygoQnJlYWtkb3duRWxlbWVudCkgZSk7Ci0JCQlpZiAocHJvYyAhPSBudWxsKSB7Ci0JCQkJZGlhZ3JhbS5zZXRTdXBwcmVzc2lvbihTdXBwcmVzc2lvbi5nZXRTdXBwcmVzc2lvbihwcm9jKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGRpYWdyYW0gZm9yIGdpdmVuIG9iamVjdCAob25seSBmb3Ige0BsaW5rIEFjdGl2aXR5fSBhbmQgcGFja3MgdGhlIGJvdW5kcy4KLQkgKiAKLQkgKiBAcGFyYW0gd3JhcHBlciAJe0BsaW5rIE9iamVjdH0gCQotCSAqIEBwYXJhbSBuZWVkUmVzZXQgYm9vbGVhbgotCSAqIEBwYXJhbSBmaWx0ZXIgCXtAbGluayBJRmlsdGVyfQotCSAqIEBwYXJhbSBzdXAJCXtAbGluayBTdXBwcmVzc2lvbn0KLQkgKi8KLQlwdWJsaWMgRWRpdFBhcnQgbG9hZERpYWdyYW0oT2JqZWN0IHdyYXBwZXIsIGJvb2xlYW4gbmVlZFJlc2V0LAotCQkJSUZpbHRlciBmaWx0ZXIsIFN1cHByZXNzaW9uIHN1cCkgewotCQkvLyBpbml0aWFsaXplIHRoZSB2aWV3ZXIgd2l0aCB0aGUgZWRpdCBwYXJ0Ci0JCUVkaXRQYXJ0IGVkaXRQYXJ0ID0gY3JlYXRlRWRpdFBhcnQod3JhcHBlciwgZmlsdGVyLCBzdXApOwotCQl0aGlzLmdyYXBoaWNhbFZpZXdlci5zZXRDb250ZW50cyhlZGl0UGFydCk7Ci0KLQkJLy8gYXNrIGZvciBpbW1lZGlhdGUgdXBkYXRlIG9mIHRoZSBjb250cm9sIHNvIHRoYXQgdGhlIGRpYWdyYW0gZmlndXJlCi0JCS8vIHdpbGwgYmUgY29tcHV0ZWQKLQkJcGFyZW50LnBhY2sodHJ1ZSk7Ci0KLQkJLy8gVGhpcyBjaGVjayBpcyBuZWVkZWQgZm9yIGJyb3dzaW5nLCBpbiBvcmRlciB0byByZW5kZXIgYWN0aXZpdHkgY29udHJpYnV0aW5nJ3MKLQkJLy8gY2hpbGRyZW4uICBJbiBwcm9jZXNzQXV0aG9yaW5nIHdlIGRvbid0IGRvIHJlYWxpemF0aW9uLCBpbiBvcmRlciB0byBkaXNwbGF5ZWQgCi0JCS8vIHJlYWxpemVkIGVsZW1lbnRzLCB3ZSBoYXZlIHRvIGNsZWFudXAgQUREIGRpYWdyYW0gYW5kIHJlY3JlYXRlLiBuZWVkdG9SZXNldCBvciBjbGVhbnVwZGlhZ3JhbS4KLQkJLy8gT25seSBmb3IgYWN0aXZpdHkgZGV0YWlsIGRpYWdyYW0uCi0JCU9iamVjdCBvID0gVG5nVXRpbC51bndyYXAod3JhcHBlcik7Ci0JCWlmKG8gaW5zdGFuY2VvZiBWYXJpYWJpbGl0eUVsZW1lbnQgJiYgZ2V0RGlhZ3JhbVR5cGUoKSAhPSBudWxsICYmIAotCQkJCWdldERpYWdyYW1UeXBlKCkuZXF1YWxzSWdub3JlQ2FzZShSZXNvdXJjZUhlbHBlci5ESUFHUkFNX1RZUEVfQUNUSVZJVFlfREVUQUlMKSl7Ci0JCQlpZihUbmdVdGlsLmhhc0NvbnRyaWJ1dG9yKChWYXJpYWJpbGl0eUVsZW1lbnQpbykpewotCQkJCW5lZWRSZXNldCA9IHRydWU7Ci0JCQl9Ci0JCX0KLQkJCi0JCWlmIChuZWVkUmVzZXQpIHsKLQkJCWNsZWFuVXBEaWFncmFtKCk7Ci0JCX0KLQotCQlJRmlndXJlIGZpZ3VyZSA9IGdldEZpZ3VyZSgpOwotCQlpZiAoZmlndXJlICE9IG51bGwpIHsKLQkJCVJlY3RhbmdsZSBib3VuZHMgPSBmaWd1cmUuZ2V0Qm91bmRzKCk7Ci0KLQkJCS8vU3lzdGVtLm91dC5wcmludGxuKCJCZWZvcmUgdXBkYXRlOiBEaWFncmFtIEJvdW5kcyA9ICIgKyBib3VuZHMpOyAvLyROT04tTkxTLTEkCi0JCQlpZiAoYm91bmRzLnggPCAwIHx8IGJvdW5kcy55IDwgMCkgewotCQkJCSgoRGlhZ3JhbUVkaXRQYXJ0KSBlZGl0UGFydCkubW92ZUZpZ3VyZSgtYm91bmRzLngsIC1ib3VuZHMueSk7Ci0KLQkJCQlwYXJlbnQucGFjayh0cnVlKTsKLQotCQkJCWJvdW5kcyA9IGZpZ3VyZS5nZXRCb3VuZHMoKTsKLQkJCQkvL1N5c3RlbS5vdXQucHJpbnRsbigiQWZ0ZXIgdXBkYXRlOiBEaWFncmFtIEJvdW5kcyA9ICIgKyBib3VuZHMpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVkaXRQYXJ0OwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGxvYWREaWFncmFtSW5mbyhHcmFwaGljYWxFZGl0UGFydCBwYXJ0LCBEaWFncmFtSW5mbyBkaWFncmFtSW5mbykgewotCQlMaXN0IGNoaWxkcmVuID0gcGFydC5nZXRDaGlsZHJlbigpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gY2hpbGRyZW4uaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IG8gPSBpdC5uZXh0KCk7Ci0JCQlpZiAobyBpbnN0YW5jZW9mIE5vZGVDb250YWluZXJFZGl0UGFydCkgewotCQkJCWxvYWREaWFncmFtSW5mbygoR3JhcGhpY2FsRWRpdFBhcnQpIG8sIGRpYWdyYW1JbmZvKTsKLQkJCX0gZWxzZSBpZiAobyBpbnN0YW5jZW9mIEdyYXBoaWNhbEVkaXRQYXJ0KSB7Ci0JCQkJcGFydCA9IChHcmFwaGljYWxFZGl0UGFydCkgbzsKLQkJCQlPYmplY3QgbW9kZWwgPSBwYXJ0LmdldE1vZGVsKCk7Ci0JCQkJT2JqZWN0IGUgPSBtb2RlbDsKLQkJCQlpZiAoZSBpbnN0YW5jZW9mIExpbmtlZE9iamVjdCkgewotCQkJCQllID0gKChMaW5rZWRPYmplY3QpIGUpLmdldE9iamVjdCgpOwotCQkJCX0KLQotCQkJCWlmIChlIGluc3RhbmNlb2YgRGlhZ3JhbUVsZW1lbnQpIHsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCi0JCQkJaWYgKGUgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQkJCWJvb2xlYW4gc3VwcHJlc3NlZDsKLQkJCQkJaWYgKG1vZGVsIGluc3RhbmNlb2YgTmFtZWROb2RlKSB7Ci0JCQkJCQlzdXBwcmVzc2VkID0gKChOYW1lZE5vZGUpIG1vZGVsKS5pc1N1cHByZXNzZWQoKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCXN1cHByZXNzZWQgPSAoKE1ldGhvZEVsZW1lbnQpIGUpLmdldFN1cHByZXNzZWQoKQotCQkJCQkJCQkuYm9vbGVhblZhbHVlKCk7Ci0JCQkJCX0KLQotCQkJCQkJSUZpZ3VyZSBmID0gcGFydC5nZXRGaWd1cmUoKTsKLQkJCQkJCVJlY3RhbmdsZSBib3VuZHMgPSBmLmdldEJvdW5kcygpOwotCi0JCQkJCQlTdHJpbmcgYWx0VGFnID0gbnVsbDsKLQkJCQkJCWlmIChmIGluc3RhbmNlb2YgU2VsZWN0YWJsZUxhYmVsKSB7Ci0JCQkJCQkJYWx0VGFnID0gKChTZWxlY3RhYmxlTGFiZWwpIGYpLmdldFRleHQoKTsKLQkJCQkJCX0KLQkJCQkJCWRpYWdyYW1JbmZvLmFkZEFyZWEoKE1ldGhvZEVsZW1lbnQpIGUsIGJvdW5kcy54LAotCQkJCQkJCWJvdW5kcy55LCBib3VuZHMud2lkdGgsIGJvdW5kcy5oZWlnaHQsIGFsdFRhZywgc3VwcHJlc3NlZCk7Ci0KLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiRWRpdFBhcnQgbm90IGhhbmRsZWQ6ICIgKyBvKTsKLQkJCQkvLyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiByZXR1cm5zIHtAbGluayBEaWFncmFtSW5mb30KLQkgKiAKLQkgKi8KLQlwdWJsaWMgRGlhZ3JhbUluZm8gZ2V0RGlhZ3JhbUluZm8oKSB7Ci0JCURpYWdyYW1JbmZvIGRpYWdyYW1JbmZvID0gbnVsbDsKLQotCQlHcmFwaGljYWxFZGl0UGFydCBwYXJ0ID0gKEdyYXBoaWNhbEVkaXRQYXJ0KSB0aGlzLmdyYXBoaWNhbFZpZXdlcgotCQkJCS5nZXRDb250ZW50cygpOwotCQlPYmplY3QgZWxlbWVudCA9IHBhcnQuZ2V0TW9kZWwoKTsKLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBMaW5rZWRPYmplY3QpIHsKLQkJCWVsZW1lbnQgPSAoKExpbmtlZE9iamVjdCkgZWxlbWVudCkuZ2V0T2JqZWN0KCk7Ci0JCX0KLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQlkaWFncmFtSW5mbyA9IG5ldyBEaWFncmFtSW5mbyhnZXREaWFncmFtVHlwZSgpLAotCQkJCQkoTWV0aG9kRWxlbWVudCkgZWxlbWVudCk7Ci0JCQlsb2FkRGlhZ3JhbUluZm8ocGFydCwgZGlhZ3JhbUluZm8pOwotCQl9Ci0KLQkJcmV0dXJuIGRpYWdyYW1JbmZvOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgZGlhZ3JhbSBpbWFnZSBmcm9tIGZpZ3VyZSBjcmVhdGVkIGluIGxvYWREaWFncmFtIG1ldGhvZC4KLQkgKiAKLQkgKi8KLQlwdWJsaWMgSW1hZ2UgY3JlYXRlRGlhZ3JhbUltYWdlKCkgewotCQlJRmlndXJlIGZpZ3VyZSA9IGdldEZpZ3VyZSgpOwotCi0JCVNXVEdyYXBoaWNzIGdyYXBoaWNzID0gbnVsbDsKLQkJR0MgZ2MgPSBudWxsOwotCQlJbWFnZSBpbWFnZSA9IG51bGw7Ci0KLQkJdHJ5IHsKLQkJCVJlY3RhbmdsZSBib3VuZHMgPSBmaWd1cmUuZ2V0Qm91bmRzKCk7Ci0JCQlpbnQgaGVpZ2h0ID0gYm91bmRzLmhlaWdodDsKLQkJCWludCB3aWR0aCA9IGJvdW5kcy53aWR0aDsKLQotCQkJLy8gY3JlYXRlIGEgbmV3IGltYWdlIGFuZCByZXBhaW50IHRoZSBncmFwaAotCQkJZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gRGlzcGxheS5nZXREZWZhdWx0KCk7Ci0JCQlpbWFnZSA9IG5ldyBJbWFnZShkaXNwbGF5LCB3aWR0aCwgaGVpZ2h0KTsKLQkJCWdjID0gbmV3IEdDKGltYWdlKTsKLQkJCWdyYXBoaWNzID0gbmV3IFNXVEdyYXBoaWNzKGdjKTsKLQkJCWZpZ3VyZS5wYWludChncmFwaGljcyk7Ci0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQlleC5wcmludFN0YWNrVHJhY2UoKTsKLQkJfSBmaW5hbGx5IHsKLQkJCS8vIHJlbGVhc2UgcmVzb3VyY2VzCi0JCQlpZiAoZ3JhcGhpY3MgIT0gbnVsbCkKLQkJCQlncmFwaGljcy5kaXNwb3NlKCk7Ci0JCQlpZiAoZ2MgIT0gbnVsbCkKLQkJCQlnYy5kaXNwb3NlKCk7Ci0JCX0KLQotCQlyZXR1cm4gaW1hZ2U7Ci0JfQotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJdHJ5IHsKLQkJCWlmIChncmFwaGljYWxWaWV3ZXIgIT0gbnVsbCkgewotCQkJCUNvbnRyb2wgY3RybCA9IGdyYXBoaWNhbFZpZXdlci5nZXRDb250cm9sKCk7Ci0JCQkJaWYgKGN0cmwgIT0gbnVsbCkgewotCQkJCQljdHJsLmRpc3Bvc2UoKTsKLQkJCQl9Ci0KLQkJCQlncmFwaGljYWxWaWV3ZXIgPSBudWxsOwotCQkJfQotCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQotCX0KLQotCXByb3RlY3RlZCBhYnN0cmFjdCBFZGl0UGFydEZhY3RvcnkgY3JlYXRlRWRpdFBhcnRGYWN0b3J5KCk7Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgRWRpdFBhcnQgY3JlYXRlRWRpdFBhcnQoT2JqZWN0IGUsIElGaWx0ZXIgZmlsdGVyLAotCQkJU3VwcHJlc3Npb24gc3VwKTsKLQotCXByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0RGlhZ3JhbVR5cGUoKTsKLQotCXByb3RlY3RlZCB2b2lkIGNsZWFuVXBEaWFncmFtKCkgewotCQkvLyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGRvZXMgbm90aGluZwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvdmlld2VyL0FjdGl2aXR5RGV0YWlsRGlhZ3JhbVZpZXdlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvdmlld2VyL0FjdGl2aXR5RGV0YWlsRGlhZ3JhbVZpZXdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNzA4MTVkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL3ZpZXdlci9BY3Rpdml0eURldGFpbERpYWdyYW1WaWV3ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLnZpZXdlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQuQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZWRpdC5BY3Rpdml0eURldGFpbERpYWdyYW1FZGl0UGFydEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZWRpdC5EaWFncmFtQWN0aW9uU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0LkRpYWdyYW1VcGRhdGVTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkFjdGl2aXR5RGV0YWlsRGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Nb2RlbEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5TdXBwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLlJlc291cmNlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5EZWZhdWx0RWRpdERvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYudWkuYWN0aW9ucy5BY3Rpb25SZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogVGhlIGdyYXBoaWNhbCB2aWV3ZXIgZm9yIHRoZSBBY3Rpdml0eURldGFpbCBkaWFncmFtLgotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZpdHlEZXRhaWxEaWFncmFtVmlld2VyIGV4dGVuZHMgQWJzdHJhY3REaWFncmFtR3JhcGhpY2FsVmlld2VyIHsKLQotCXB1YmxpYyBBY3Rpdml0eURldGFpbERpYWdyYW1WaWV3ZXIoQ29tcG9zaXRlIHBhcmVudCkgewotCQlzdXBlcihwYXJlbnQpOwotCX0KLQotCXByb3RlY3RlZCBFZGl0UGFydEZhY3RvcnkgY3JlYXRlRWRpdFBhcnRGYWN0b3J5KCkgewotCQlyZXR1cm4gbmV3IEFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRQYXJ0RmFjdG9yeSgpOwotCX0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLnZpZXdlci5BYnN0cmFjdERpYWdyYW1HcmFwaGljYWxWaWV3ZXIjY3JlYXRlRWRpdFBhcnQoamF2YS5sYW5nLk9iamVjdCwgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyLCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuU3VwcHJlc3Npb24pCi0JICovCi0KLQlwcm90ZWN0ZWQgRWRpdFBhcnQgY3JlYXRlRWRpdFBhcnQoT2JqZWN0IGUsIElGaWx0ZXIgZmlsdGVyLCBTdXBwcmVzc2lvbiBzdXApIHsKLQkJQWN0aXZpdHlEZXRhaWxEaWFncmFtIGRpYWdyYW0gPSBNb2RlbEZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJLmNyZWF0ZUFjdGl2aXR5RGV0YWlsRGlhZ3JhbSgpOy8vCi0JCWRpYWdyYW0uc2V0RmlsdGVyKGZpbHRlcik7Ci0JCWlmIChzdXAgIT0gbnVsbCkgewotCQkJZGlhZ3JhbS5zZXRTdXBwcmVzc2lvbihzdXApOwotCQl9Ci0KLQkJZGlhZ3JhbS5zZXRPYmplY3QoZSk7Ci0JCUVkaXRQYXJ0IHBhcnQgPSBuZXcgQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdFBhcnQoCi0JCQkJKEFjdGl2aXR5RGV0YWlsRGlhZ3JhbSkgZGlhZ3JhbSk7Ci0JCXBhcnQuc2V0TW9kZWwoZGlhZ3JhbSk7Ci0JCXJldHVybiBwYXJ0OwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGlhZ3JhbVR5cGUoKSB7Ci0JCXJldHVybiBSZXNvdXJjZUhlbHBlci5ESUFHUkFNX1RZUEVfQUNUSVZJVFlfREVUQUlMOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYudmlld2VyLkFic3RyYWN0RGlhZ3JhbUdyYXBoaWNhbFZpZXdlciNjbGVhblVwRGlhZ3JhbSgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY2xlYW5VcERpYWdyYW0oKSB7Ci0JCUFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRQYXJ0IGRlcCA9IChBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0UGFydCkgZ2V0R3JhcGhpY2FsVmlld2VyKCkKLQkJCQkuZ2V0Q29udGVudHMoKTsKLQkJZGVwLmdldFJlY2VudGx5QWRkZWRQYXJ0cygpLmFkZEFsbChkZXAuZ2V0Q2hpbGRyZW4oKSk7Ci0KLQkJLy8gY2xlYW4gdXAgdGhlIGRpYWdyYW0KLQkJRGVmYXVsdEVkaXREb21haW4gZWRpdGluZ0RvbWFpbiA9IG5ldyBEZWZhdWx0RWRpdERvbWFpbihudWxsKTsKLQkJQWN0aW9uUmVnaXN0cnkgYWN0aW9uUmVnaXN0cnkgPSBuZXcgQWN0aW9uUmVnaXN0cnkoKTsKLQotCQlEaWFncmFtQWN0aW9uU2VydmljZSBhY3Rpb25TZXJ2aWNlID0gbmV3IERpYWdyYW1BY3Rpb25TZXJ2aWNlKAotCQkJCWdldEdyYXBoaWNhbFZpZXdlcigpLCBlZGl0aW5nRG9tYWluLCBhY3Rpb25SZWdpc3RyeSk7Ci0JCWFjdGlvblNlcnZpY2UucmVnaXN0ZXJWZXJ0aWNhbEFsaWduRmlyc3RTZWxlY3RlZEFjdGlvbigpOwotCi0JCURpYWdyYW1VcGRhdGVTZXJ2aWNlIHNlcnZpY2UgPSBuZXcgRGlhZ3JhbVVwZGF0ZVNlcnZpY2UoCi0JCQkJZ2V0R3JhcGhpY2FsVmlld2VyKCksIGVkaXRpbmdEb21haW4sIGFjdGlvblJlZ2lzdHJ5KTsKLQkJc2VydmljZS5jbGVhblVwRGlhZ3JhbSgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvdmlld2VyL0FjdGl2aXR5RGlhZ3JhbVNlcnZpY2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL3ZpZXdlci9BY3Rpdml0eURpYWdyYW1TZXJ2aWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0ZWFlODkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvdmlld2VyL0FjdGl2aXR5RGlhZ3JhbVNlcnZpY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxNiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi52aWV3ZXI7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLnV0aWwuR3JhcGhpY2FsRGF0YUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC51dGlsLkdyYXBoaWNhbERhdGFNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5WYXJpYWJpbGl0eUluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLklEaWFncmFtTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuU3VwcHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LlByb2Nlc3NBZGFwdGVyRmFjdG9yeUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuZGlhZ3JhbS5EaWFncmFtSW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuZGlhZ3JhbS5JQWN0aXZpdHlEaWFncmFtU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5zZXJ2aWNlcy5TYWZlVXBkYXRlQ29udHJvbGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLlJlc291cmNlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZURhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlTG9hZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotCi0KLS8qKgotICogUHJvdmlkZXMgc2VydmljZSBtZXRob2RzIGZvciBjcmVhdGluZyBkaWFncmFtIGltYWdlcyBmb3IgYWN0aXZpdHkgZWxlbWVudHMKLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXR5RGlhZ3JhbVNlcnZpY2UgaW1wbGVtZW50cyBJQWN0aXZpdHlEaWFncmFtU2VydmljZSB7Ci0KLQlwcml2YXRlIENvbXBvc2l0ZSBwYXJlbnQgPSBudWxsOwotCi0JcHJpdmF0ZSBDb21wb3NpdGUgaG9sZGVyID0gbnVsbDsKLQotCXByaXZhdGUgRmlsZSBwdWJEaXI7Ci0KLQlwcml2YXRlIHN0YXRpYyBNYXAgdHlwZU1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0KLQlwcml2YXRlIERpYWdyYW1JbmZvIGRpYWdyYW1JbmZvID0gbnVsbDsKLQotCXByaXZhdGUgYm9vbGVhbiBwdWJsaXNoVW5jcmVhdGVkQUREID0gdHJ1ZTsKLQkKLQlwcml2YXRlIGJvb2xlYW4gcHVibGlzaEFERm9yQWN0aXZpdHlFeHRlbnNpb24gPSB0cnVlOwotCi0Jc3RhdGljIHsKLQkJdHlwZU1hcC5wdXQoUmVzb3VyY2VIZWxwZXIuRElBR1JBTV9UWVBFX1dPUktGTE9XLCBuZXcgSW50ZWdlcigKLQkJCQlJRGlhZ3JhbU1hbmFnZXIuQUNUSVZJVFlfRElBR1JBTSkpOwotCQl0eXBlTWFwLnB1dChSZXNvdXJjZUhlbHBlci5ESUFHUkFNX1RZUEVfQUNUSVZJVFlfREVUQUlMLCBuZXcgSW50ZWdlcigKLQkJCQlJRGlhZ3JhbU1hbmFnZXIuQUNUSVZJVFlfREVUQUlMX0RJQUdSQU0pKTsKLQkJdHlwZU1hcC5wdXQoUmVzb3VyY2VIZWxwZXIuRElBR1JBTV9UWVBFX1dQX0RFUEVOREVOQ1ksIG5ldyBJbnRlZ2VyKAotCQkJCUlEaWFncmFtTWFuYWdlci5XT1JLX1BST0RVQ1RfREVQRU5ERU5DWV9ESUFHUkFNKSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBpbnQgZ2V0SW50VHlwZShTdHJpbmcgZGlhZ3JhbVR5cGUpIHsKLQkJSW50ZWdlciB0eXBlID0gKEludGVnZXIpIHR5cGVNYXAuZ2V0KGRpYWdyYW1UeXBlKTsKLQkJaWYgKHR5cGUgIT0gbnVsbCkgewotCQkJcmV0dXJuIHR5cGUuaW50VmFsdWUoKTsKLQkJfQotCi0JCXJldHVybiAtMTsKLQl9Ci0KLQlTaGVsbCBzaGVsbCA9IG51bGw7Ci0KLQlwdWJsaWMgQWN0aXZpdHlEaWFncmFtU2VydmljZSgpIHsKLQkJdGhpcyhudWxsLCBuZXcgRmlsZShMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5TG9jYXRpb24oKSkpOwotCX0KLQotCXB1YmxpYyBBY3Rpdml0eURpYWdyYW1TZXJ2aWNlKEZpbGUgcHViRGlyKSB7Ci0JCXRoaXMobnVsbCwgcHViRGlyKTsKLQl9Ci0KLQlwdWJsaWMgQWN0aXZpdHlEaWFncmFtU2VydmljZShDb21wb3NpdGUgcGFyZW50LCBGaWxlIHB1YkRpcikgewotCQl0aGlzLnBhcmVudCA9IHBhcmVudDsKLQkJdGhpcy5wdWJEaXIgPSBwdWJEaXI7Ci0JfQotCi0JcHJpdmF0ZSBBYnN0cmFjdERpYWdyYW1HcmFwaGljYWxWaWV3ZXIgZ2V0RGlhZ3JhbVZpZXdlcihpbnQgZGlhZ3JhbVR5cGUpIHsKLQkJLy8gaWYgdGhlIHNoZWxsIHdpbmRvdyBpcyBkaXN0cm95ZWQsIHJlY3JlYXRlIGl0Ci0JCWlmICgodGhpcy5zaGVsbCAhPSBudWxsKSAmJiB0aGlzLnNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQkJdGhpcy5wYXJlbnQgPSBudWxsOwotCQkJdGhpcy5zaGVsbCA9IG51bGw7Ci0JCX0KLQotCQlnZXRWaWV3ZXJIb2xkZXIocGFyZW50KTsKLQotCQlzd2l0Y2ggKGRpYWdyYW1UeXBlKSB7Ci0JCWNhc2UgSURpYWdyYW1NYW5hZ2VyLkFDVElWSVRZX0RJQUdSQU06Ci0JCQlyZXR1cm4gbmV3IEFjdGl2aXR5RGlhZ3JhbVZpZXdlcihob2xkZXIpOwotCi0JCWNhc2UgSURpYWdyYW1NYW5hZ2VyLkFDVElWSVRZX0RFVEFJTF9ESUFHUkFNOgotCQkJcmV0dXJuIG5ldyBBY3Rpdml0eURldGFpbERpYWdyYW1WaWV3ZXIoaG9sZGVyKTsKLQotCQljYXNlIElEaWFncmFtTWFuYWdlci5XT1JLX1BST0RVQ1RfREVQRU5ERU5DWV9ESUFHUkFNOgotCQkJcmV0dXJuIG5ldyBXUERlcGVuZGVuY3lEaWFncmFtVmlld2VyKGhvbGRlcik7Ci0JCQkKLQkJZGVmYXVsdDoKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGdldFZpZXdlckhvbGRlcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCWlmIChwYXJlbnQgPT0gbnVsbCkgewotCQkJaWYgKHNoZWxsID09IG51bGwgfHwgc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCQkJc2hlbGwgPSBjcmVhdGVTaGVsbCgpOwotCQkJfQotCQkJc2hlbGwub3BlbigpOwotCQkJcGFyZW50ID0gc2hlbGw7Ci0JCX0KLQotCQlpZiAoaG9sZGVyICE9IG51bGwpIHsKLQkJCWhvbGRlci5kaXNwb3NlKCk7Ci0JCX0KLQotCQlob2xkZXIgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlob2xkZXIuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoMSwgMSkpOyAvLyBzaXplIGNhbid0IGJlIDAsMAotCQkvLyBvdGhlcndpc2UgdGhlIGRpYWdyYW0KLQkJLy8gd2lsbCBub3QgYmUgcGFpbnRlZAotCQlob2xkZXIuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQlob2xkZXIuc2V0VmlzaWJsZShmYWxzZSk7Ci0JfQotCi0JcHJpdmF0ZSBTaGVsbCBjcmVhdGVTaGVsbCgpIHsKLQkJU2hlbGwgc2hlbGwgPSBudWxsOwotCQlEaXNwbGF5IGQgPSBEaXNwbGF5LmdldERlZmF1bHQoKTsKLQkJc2hlbGwgPSBuZXcgU2hlbGwoZCk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCXNoZWxsLnNldExheW91dChsYXlvdXQpOwotCQlzaGVsbC5zZXRCb3VuZHMoMCwgMCwgMCwgMCk7Ci0JCXNoZWxsLnNldFZpc2libGUoZmFsc2UpOwotCQlyZXR1cm4gc2hlbGw7Ci0JfQotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJaWYgKChzaGVsbCAhPSBudWxsKSAmJiAoIXNoZWxsLmlzRGlzcG9zZWQoKSkpIHsKLQkJCXNoZWxsLmNsb3NlKCk7Ci0JCQlzaGVsbC5kaXNwb3NlKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBzYXZlIHRoZSBlbGVtZW50IGRpYWdyYW0gaW1hZ2UgYW5kIHJldHVybnMgdGhlIGltYWdlIGZpbGUgdXJsLgotCSAqIAotCSAqIEBwYXJhbSB3cmFwcGVyCi0JICogQHBhcmFtIGltZ1BhdGgKLQkgKiBAcGFyYW0gZGlhZ3JhbVR5cGUKLQkgKiBAcGFyYW0gZmlsdGVyCi0JICogICAgICAgICAgICBJRmlsdGVyCi0JICogQHBhcmFtIHN1cAotCSAqICAgICAgICAgICAgU3VwcHJlc3Npb24KLQkgKiBAcmV0dXJuIFN0cmluZyB0aGUgaW1hZ2UgcGF0aCByZWxhdGl2ZSB0byB0aGUgcHVibGlzaGluZyBkaXIKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5kaWFncmFtLklBY3Rpdml0eURpYWdyYW1TZXJ2aWNlI3NhdmVEaWFncmFtKGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcsIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlciwgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlN1cHByZXNzaW9uKQotCSAqLwotCXB1YmxpYyBEaWFncmFtSW5mbyBzYXZlRGlhZ3JhbShmaW5hbCBPYmplY3Qgd3JhcHBlciwgZmluYWwgU3RyaW5nIGltZ1BhdGgsIAotCQkJZmluYWwgU3RyaW5nIGRpYWdyYW1UeXBlLCBmaW5hbCBJRmlsdGVyIGZpbHRlciwKLQkJCWZpbmFsIFN1cHByZXNzaW9uIHN1cCkgewotCQkvLyBpbml0aWFsaXplIHRoZSBkaWFncmFtSW5mbwotCQlkaWFncmFtSW5mbyA9IG51bGw7Ci0KLQkJLy8gZ3JhYiB0aGUgVUkgdGhyZWFkIHRvIGF2b2lkIHRocmVhZCBhY2Nlc3MgZXJyb3IKLQkJU2FmZVVwZGF0ZUNvbnRyb2xsZXIuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCV9faW50ZXJuYWxfc2F2ZURpYWdyYW0od3JhcHBlciwgaW1nUGF0aCwgZGlhZ3JhbVR5cGUsIGZpbHRlciwgc3VwKTsKLQkJCX0KLQkJfSk7Ci0KLQkJcmV0dXJuIGRpYWdyYW1JbmZvOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBoYXNVc2VyRGVmaW5lZERpYWdyYW0oQWN0aXZpdHkgZSwgU3RyaW5nIGltZ1BhdGgsIFN0cmluZyBkaWFncmFtVHlwZSkgdGhyb3dzIEV4Y2VwdGlvbgotCXsJCQotCQkvLyBpZiB0aGVyZSBpcyBhIHVzZXIgZGVmaW5lZCBkaWFncmFtLCB1c2UgaXQKLQkJb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwudXRpbC5EaWFncmFtSW5mbyBpbmZvID0gbmV3IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLnV0aWwuRGlhZ3JhbUluZm8oKEFjdGl2aXR5KWUpOwotCQlzd2l0Y2ggKGdldEludFR5cGUoZGlhZ3JhbVR5cGUpKQotCQl7Ci0JCQljYXNlIElEaWFncmFtTWFuYWdlci5BQ1RJVklUWV9ESUFHUkFNOgotCQkJCWlmICggaW5mby5jYW5QdWJsaXNoQURJbWFnZSgpICkKLQkJCQl7Ci0JCQkJCXJldHVybiAoaW5mby5nZXRBY3Rpdml0eURpYWdyYW0oKSAhPSBudWxsKSAmJiBpbmZvLmNhblB1Ymxpc2hBREltYWdlKCk7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQotCQkJY2FzZSBJRGlhZ3JhbU1hbmFnZXIuQUNUSVZJVFlfREVUQUlMX0RJQUdSQU06Ci0JCQkJaWYgKCBpbmZvLmNhblB1Ymxpc2hBRERJbWFnZSgpICkKLQkJCQl7Ci0JCQkJCXJldHVybiAoaW5mby5nZXRBY3Rpdml0eURldGFpbERpYWdyYW0oKSAhPSBudWxsKSAmJiBpbmZvLmNhblB1Ymxpc2hBRERJbWFnZSgpOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCQkJCQkKLQkJCWNhc2UgSURpYWdyYW1NYW5hZ2VyLldPUktfUFJPRFVDVF9ERVBFTkRFTkNZX0RJQUdSQU06Ci0JCQkJaWYgKCBpbmZvLmNhblB1Ymxpc2hXUERJbWFnZSgpICkKLQkJCQl7Ci0JCQkJCXJldHVybiAoaW5mby5nZXRXUEREaWFncmFtKCkgIT0gbnVsbCApICYmIGluZm8uY2FuUHVibGlzaFdQREltYWdlKCk7Ci0JCQkJfQotCQkJCWJyZWFrOwotCi0JCQlkZWZhdWx0OgotCQkJCWJyZWFrOwotCQl9Ci0JCQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBfX2ludGVybmFsX3NhdmVEaWFncmFtKE9iamVjdCB3cmFwcGVyLCBmaW5hbCBTdHJpbmcgaW1nUGF0aCwgU3RyaW5nIGRpYWdyYW1UeXBlLAotCQkJSUZpbHRlciBmaWx0ZXIsIFN1cHByZXNzaW9uIHN1cCkgewotCQkKLQkJaWYgKCBzdXAuaXNTdXBwcmVzc2VkKHdyYXBwZXIpICkgewotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlPYmplY3QgbyA9IFRuZ1V0aWwudW53cmFwKHdyYXBwZXIpOwotCQlpZiAoIShvIGluc3RhbmNlb2YgQWN0aXZpdHkpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQkvL01ldGhvZEVsZW1lbnQgZSA9IChNZXRob2RFbGVtZW50KW87Ci0JCUFjdGl2aXR5IGUgPSAoQWN0aXZpdHkpbzsKLQkJLy8gRGlhZ3JhbUluZm8gZGlhZ3JhbUluZm8gPSBudWxsOwotCQlJbWFnZSBpbWFnZSA9IG51bGw7Ci0JCWludCB0eXBlID0gZ2V0SW50VHlwZShkaWFncmFtVHlwZSk7Ci0JCWlmICh0eXBlIDwgMCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJQWJzdHJhY3REaWFncmFtR3JhcGhpY2FsVmlld2VyIHZpZXdlciA9IG51bGw7Ci0KLQkJLy8ga2VlcCB0aGUgZGlydHkgZmxhZyBhbmQgcmVzZXQgYmFjayB0byBhdm9pZCBtYWtlIHRoZSBsaWJyYXJ5IGRpcnR5Ci0JCWJvb2xlYW4gZGlydHlGbGFnID0gZS5lUmVzb3VyY2UoKS5pc01vZGlmaWVkKCk7Ci0KLQkJdHJ5IHsKLQkJCWlmICggaGFzVXNlckRlZmluZWREaWFncmFtKChBY3Rpdml0eSllLCBpbWdQYXRoLCBkaWFncmFtVHlwZSkgKQotCQkJewotCQkJCXJldHVybjsKLQkJCX0KLQotCi0JCQkvLyBmaXJzdCBjaGVjayBpZiB3ZSBuZWVkIHRvIGdlbmVyYXRlIHRoZSBkaWFncmFtIG9yIG5vdAotCQkJLy8gaWYgdGhlIGRpYWdyYW0gaXMgc3VwcmVzc2VkLCBkb24ndCBnZW5lcmF0ZSBkaWFncmFtCi0JCQkvLyBkb24ndCBjcmVhdGUgdGhlIGRpYWdyYW0gaWYgaXQncyBub3QgdGhlcmUsCi0JCQkvLyBpZCB0aGUgZGlhZ3JhbSBkb2VzIG5vdCBleGlzdCwgaXQncyBzdXByZXNzZWQKLQkJCW9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbSBkID0gR3JhcGhpY2FsRGF0YU1hbmFnZXIuZ2V0SW5zdGFuY2UoKQotCQkJCQkuZ2V0VU1BRGlhZ3JhbSgoQWN0aXZpdHkpIGUsIHR5cGUsIGZhbHNlKTsKLQotCQkJLy8gQWxsb3cgdGhlIG9wdGlvbiB0byBwdWJsaXNoICd1bmNyZWF0ZWQnIGRpYWdyYW1zCi0JCQkvLyBieSBkZWZhdWx0LCB1bmNyZWF0ZWQgYWN0aXZpdHkgZGV0YWlsIGRpYWdyYW1zIHdpbGwgYmUgcHVibGlzaGVkLAotCQkJLy8gdW5jcmVhdGVkIGRpYWdyYW1zIG9mIG90aGVyIHR5cGVzIHdpbGwgbm90IGJlIHB1Ymxpc2hlZAotCQkJYm9vbGVhbiBleGlzdCA9IChkICE9IG51bGwpOwotCQkJaWYgKGV4aXN0KSB7Ci0JCQkJaWYgKGQuZ2V0U3VwcHJlc3NlZCgpLmJvb2xlYW5WYWx1ZSgpID09IHRydWUpCi0JCQkJCXJldHVybjsKLQkJCQkKLQkJCQkvLyBJZiBhbiBleHRlbnNpb24gaGFzIGl0cyBvd24gZGlhZ3JhbS4gQmFzZSBpcyByZXBsYWNlZCBvciBjb250cmlidXRlZC4gCi0JCQkJLy8gZXh0ZW5zaW9uIGRpYWdyYW0gc2hvd3MgcmVhbGl6ZWQgZWxlbWVudCBpbiB1bmRlZmluZWQgbG9jYXRpb24uIAotCQkJCS8vIEluIHB1Ymxpc2hpbmcgZG9uJ3QgZGlzcGxheSBleHRlbnNpb24gZGlhZ3JhbSBldmVuIGlmIGl0IGhhcyBpdHMgb3duCi0JCQkJLy8gZGlhZ3JhbSBpZiByZWFsaXplZCBlbGVtZW50cyBhcmUgY29taW5nIGluIHRocm91Z2ggdmFyaWFiaWxpdHkuCi0JCQkJaWYodHlwZSA9PSBHcmFwaGljYWxEYXRhSGVscGVyLkFDVElWSVRZX0RJQUdSQU0gJiYKLQkJCQkJCWNoZWNrVmFyaWFiaWxpdHkoZSwgZmlsdGVyLHR5cGUpICE9IG51bGwpewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCQkKLQkJCX1lbHNlewotCQkJCQotCQkJCWlmKCh0eXBlID09IEdyYXBoaWNhbERhdGFIZWxwZXIuV09SS19QUk9EVUNUX0RFUEVOREVOQ1lfRElBR1JBTSkpCi0JCQkJCXJldHVybjsKLQotCQkJCS8vIEZvciBBY3Rpdml0eSBEaWFncmFtIHVuIG9wZW5lZCBleHRlbnNpb24gcHVibGlzaC4KLQkJCQlpZih0eXBlID09IEdyYXBoaWNhbERhdGFIZWxwZXIuQUNUSVZJVFlfRElBR1JBTSl7Ci0JCQkJCS8vIElmIG9wdGlvbiBpcyBub3QgY2hlY2tlZCwgZG9uJ3QgZ2VuZXJhdGUgYSBkaWFncmFtCi0JCQkJCWlmKCFwdWJsaXNoQURGb3JBY3Rpdml0eUV4dGVuc2lvbikgcmV0dXJuOwotCQkJCQkKLQkJCQkJLy9JZiBleHRlbnNpb24gaXMgbW9kaWZpZWQgZG9uJ3QgZ2VuZXJhdGUgaXQuCi0JCQkJCWlmKCFlLmdldEJyZWFrZG93bkVsZW1lbnRzKCkuaXNFbXB0eSgpKQotCQkJCQkJcmV0dXJuOwotCQkJCQlWYXJpYWJpbGl0eUVsZW1lbnQgY2FsY3VsYXRlZEJhc2UgPSBjaGVja1ZhcmlhYmlsaXR5KGUsIGZpbHRlciwgdHlwZSk7Ci0JCQkJCWlmKGNhbGN1bGF0ZWRCYXNlID09IG51bGwpIHsKLQkJCQkJCXJldHVybjsKLQkJCQkJfQkKLQkJCQkJCi0JCQkJCXdyYXBwZXIgPSBjYWxjdWxhdGVkQmFzZTsKLQkJCQkJZSA9IChBY3Rpdml0eSljYWxjdWxhdGVkQmFzZTsKLQkJCQkJZXhpc3QgPSB0cnVlOwotCQkJCX0KLQkJCQkKLQkJCQlpZiAocHVibGlzaFVuY3JlYXRlZEFERCA9PSBmYWxzZSAmJiB0eXBlID09IEdyYXBoaWNhbERhdGFIZWxwZXIuQUNUSVZJVFlfREVUQUlMX0RJQUdSQU0pewotCQkJCQlib29sZWFuIGNvbnRyaWJ1dG9yZXhpc3QgPSBmYWxzZTsKLQkJCQkJLy8gVGhpcyBpcyBuZWVkLCBpZiBjb250cmlidXRvciBoYXMgYSBBREQgZGlhZ3JhLCBiYXNlIGRvbid0IAotCQkJCQkvLyBiYXNlIHNob3VsZCBnZW5lcmF0ZSBBREQgaW4gYnJvd3NpbmcuCi0JCQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gbnVsbDsKLQkJCQkJaWYgKGZpbHRlciBpbnN0YW5jZW9mIFByb2Nlc3NBZGFwdGVyRmFjdG9yeUZpbHRlcikgewotCQkJCQkJY29uZmlnID0gKChQcm9jZXNzQWRhcHRlckZhY3RvcnlGaWx0ZXIpIGZpbHRlcikKLQkJCQkJCQkJLmdldE1ldGhvZENvbmZpZ3VyYXRpb24oKTsKLQkJCQkJfQotCQkJCQlpZiAoY29uZmlnID09IG51bGwpCi0JCQkJCQlyZXR1cm47Ci0KLQkJCQkJLy8gR2V0IGltbWVkaWF0ZSBjb250cmlidXRvcnMgZmlyc3QsIGFuZCBjaGVjayBpbW1lZGlhdGUgY29udHJpYnV0b3JzCi0JCQkJCS8vIGhhdmUgYW55dGhpbmcgZXh0cmEgYnJlYWtkb3duIGVsZW1lbnRzLgotCQkJCQlMaXN0IGxpc3QgPSBDb25maWd1cmF0aW9uSGVscGVyLmdldENvbnRyaWJ1dG9ycyhlLCBjb25maWcpOwotCQkJCQlpZihlIGluc3RhbmNlb2YgQWN0aXZpdHkpewotCQkJCQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBsaXN0Lml0ZXJhdG9yKCk7Ci0JCQkJCQlpZihpdGVyYXRvciAhPSBudWxsKXsKLQkJCQkJCQl3aGlsZShpdGVyYXRvci5oYXNOZXh0KCkpewotCQkJCQkJCQlPYmplY3QgYWN0ID0gaXRlcmF0b3IubmV4dCgpOwotCQkJCQkJCQlpZihhY3QgIT0gbnVsbCl7Ci0JCQkJCQkJCQlvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW0gZHggPSBHcmFwaGljYWxEYXRhTWFuYWdlci5nZXRJbnN0YW5jZSgpCi0JCQkJCQkJCQkuZ2V0VU1BRGlhZ3JhbSgoQWN0aXZpdHkpIGFjdCwgdHlwZSwgZmFsc2UpOwotCQkJCQkJCQkJaWYoZHggIT0gbnVsbCl7ICAgCi0JCQkJCQkJCQkJY29udHJpYnV0b3JleGlzdCA9IHRydWU7Ci0JCQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJaWYoIWNvbnRyaWJ1dG9yZXhpc3QpCi0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCXRyeSB7Ci0JCQkJdmlld2VyID0gZ2V0RGlhZ3JhbVZpZXdlcih0eXBlKTsKLQkJCQl2aWV3ZXIubG9hZERpYWdyYW0od3JhcHBlciwgIWV4aXN0LCBmaWx0ZXIsIHN1cCk7Ci0JCQkJZGlhZ3JhbUluZm8gPSB2aWV3ZXIuZ2V0RGlhZ3JhbUluZm8oKTsKLQkJCQlpZiAoZGlhZ3JhbUluZm8gIT0gbnVsbCAmJiAhZGlhZ3JhbUluZm8uaXNFbXB0eSgpKSB7Ci0JCQkJCWltYWdlID0gdmlld2VyLmNyZWF0ZURpYWdyYW1JbWFnZSgpOwotCQkJCQlpZiAoaW1hZ2UgIT0gbnVsbCkgewotCQkJCQkJLy8gc2F2ZSB0aGUgaW1hZ2UKLQkJCQkJCUZpbGUgZiA9IG5ldyBGaWxlKHB1YkRpciwgaW1nUGF0aCk7Ci0KLQkJCQkJCS8vIG1ha2Ugc3VyZSB0aGUgZmlsZSBpcyBjcmVhdGVkIG90aGVyd2lzZSBleGNlcHRpb24KLQkJCQkJCUZpbGUgcGFyZW50ID0gZi5nZXRQYXJlbnRGaWxlKCk7Ci0JCQkJCQlpZiAoIXBhcmVudC5leGlzdHMoKSkgewotCQkJCQkJCXBhcmVudC5ta2RpcnMoKTsKLQkJCQkJCX0KLQotCQkJCQkJaWYgKCFmLmV4aXN0cygpKSB7Ci0JCQkJCQkJZi5jcmVhdGVOZXdGaWxlKCk7Ci0JCQkJCQl9Ci0JCQkJCQlPdXRwdXRTdHJlYW0gb3MgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShmKTsKLQkJCQkJCUltYWdlTG9hZGVyIGxvYWRlciA9IG5ldyBJbWFnZUxvYWRlcigpOwotCQkJCQkJbG9hZGVyLmRhdGEgPSBuZXcgSW1hZ2VEYXRhW10geyBpbWFnZS5nZXRJbWFnZURhdGEoKSB9OwotCQkJCQkJbG9hZGVyLnNhdmUob3MsIFNXVC5JTUFHRV9KUEVHKTsKLQotCQkJCQkJZGlhZ3JhbUluZm8uc2V0SW1hZ2VGaWxlUGF0aChpbWdQYXRoKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiVW5hYmxlIHRvIGNyZWF0ZSBkaWFncmFtIGltYWdlIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCX0KLQkJCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZTEpIHsKLQkJCQllMS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQotCQkJLy8gZGVsZXRlIHRoZSBuZXdseSBjcmVhdGVkIGRpYWdyYW0gZnJvbSB0aGUgbGlicmFyeQotCQkJaWYgKCFleGlzdCkgewotCQkJCWQgPSBHcmFwaGljYWxEYXRhTWFuYWdlci5nZXRJbnN0YW5jZSgpLmdldFVNQURpYWdyYW0oCi0JCQkJCQkoQWN0aXZpdHkpIGUsIHR5cGUsIGZhbHNlKTsKLQkJCQlpZiAoZCAhPSBudWxsKSB7Ci0JCQkJCUVjb3JlVXRpbC5yZW1vdmUoZCk7Ci0JCQkJfQotCQkJfQotCi0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJZXgucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0gZmluYWxseSB7Ci0JCQl0cnkgewotCi0JCQkJLy8gcmVzdG9yZSB0aGUgZGlydHkgZmxhZwotCQkJCWUuZVJlc291cmNlKCkuc2V0TW9kaWZpZWQoZGlydHlGbGFnKTsKLQotCQkJCWlmICh2aWV3ZXIgIT0gbnVsbCkgewotCQkJCQl2aWV3ZXIuZGlzcG9zZSgpOwotCQkJCX0KLQkJCQlpZiAoaW1hZ2UgIT0gbnVsbCkgewotCQkJCQlpbWFnZS5kaXNwb3NlKCk7Ci0JCQkJfQotCQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlMSkgewotCQkJCWUxLnByaW50U3RhY2tUcmFjZSgpOwotCQkJfQotCQl9Ci0KLQl9Ci0KLQotCXByaXZhdGUgVmFyaWFiaWxpdHlFbGVtZW50IGNoZWNrVmFyaWFiaWxpdHkoVmFyaWFiaWxpdHlFbGVtZW50IGUsIElGaWx0ZXIgZmlsdGVyLAotCQkJaW50IHR5cGUpIHsKLQotCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IG51bGw7Ci0JCWlmIChmaWx0ZXIgaW5zdGFuY2VvZiBQcm9jZXNzQWRhcHRlckZhY3RvcnlGaWx0ZXIpIHsKLQkJCWNvbmZpZyA9ICgoUHJvY2Vzc0FkYXB0ZXJGYWN0b3J5RmlsdGVyKSBmaWx0ZXIpCi0JCQkJCS5nZXRNZXRob2RDb25maWd1cmF0aW9uKCk7Ci0JCX0KLQkJaWYgKGNvbmZpZyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJLy8gR2V0IGltbWVkaWF0ZSBjb250cmlidXRvcnMgZmlyc3QsIGFuZCBjaGVjayBpbW1lZGlhdGUgY29udHJpYnV0b3JzCi0JCS8vIGhhdmUgYW55dGhpbmcgZXh0cmEgYnJlYWtkb3duIGVsZW1lbnRzLgotCQlMaXN0IGxpc3QgPSBDb25maWd1cmF0aW9uSGVscGVyLmdldENvbnRyaWJ1dG9ycyhlLCBjb25maWcpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gbGlzdC5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgbmV4dCA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmIChuZXh0IGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQlpZiAoISgoQWN0aXZpdHkpIG5leHQpLmdldEJyZWFrZG93bkVsZW1lbnRzKCkuaXNFbXB0eSgpKQotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJfQotCi0JCS8vIEdldCBhbGwgQ29udHJpYnV0b3JzIGZyb20gcGFyZW50IGNoYWluIGFuZCBjb250cmlidXRvciBjaGFpbiBmb3IgdGhlCi0JCS8vIGVsZW1lbnQgZS4KLQkJVmFyaWFiaWxpdHlJbmZvIGVJbmZvID0gKChQcm9jZXNzQWRhcHRlckZhY3RvcnlGaWx0ZXIpIGZpbHRlcikKLQkJCQkuZ2V0VmFyaWFiaWxpdHlJbmZvKChWYXJpYWJpbGl0eUVsZW1lbnQpIGUpOwotCQlMaXN0IGNvbnRyaWJ1dG9ycyA9IGVJbmZvLmdldENvbnRyaWJ1dG9ycygpOwotCi0JCVZhcmlhYmlsaXR5RWxlbWVudCB2ZSA9IGUuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpOwotCQlpZiAodmUgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJCi0JCUFjdGl2aXR5IHJlcGxhY2VyID0gKEFjdGl2aXR5KSBDb25maWd1cmF0aW9uSGVscGVyLmdldFJlcGxhY2VyKHZlLAotCQkJCWNvbmZpZyk7Ci0JCWlmIChyZXBsYWNlciAhPSBudWxsKSB7Ci0JCQl2ZSA9IHJlcGxhY2VyOwotCQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtIHJlcGxhY2VyRGlhZ3JhbSA9IEdyYXBoaWNhbERhdGFNYW5hZ2VyCi0JCQkJCS5nZXRJbnN0YW5jZSgpLmdldFVNQURpYWdyYW0ocmVwbGFjZXIsIHR5cGUsIGZhbHNlKTsKLQkJCWlmIChyZXBsYWNlckRpYWdyYW0gIT0gbnVsbCkgewotCQkJCS8vYW55UmVwbGFjZXIuYWRkKHJlcGxhY2VyKTsKLQkJCQlyZXR1cm4gcmVwbGFjZXI7Ci0JCQl9IGVsc2UgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9IGVsc2UgewotCQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtIGJhc2VEaWFncmFtID0gR3JhcGhpY2FsRGF0YU1hbmFnZXIKLQkJCQkJLmdldEluc3RhbmNlKCkKLQkJCQkJLmdldFVNQURpYWdyYW0oKEFjdGl2aXR5KSB2ZSwgdHlwZSwgZmFsc2UpOwotCQkJaWYgKGJhc2VEaWFncmFtICE9IG51bGwpIHsKLQkJCQkKLQkJCQkvLyBDaGVjayBmaXJzdCBpZiBiYXNlRGlhZ3JhbSBpcyBzdXBwcmVzc2VkLgotCQkJCWlmIChiYXNlRGlhZ3JhbS5nZXRTdXBwcmVzc2VkKCkuYm9vbGVhblZhbHVlKCkgPT0gdHJ1ZSkKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJCi0JCQkJLy8gRmluZCB0aGUgY29udHJpYnV0b3JzIG9mIEJhc2UKLQkJCQlWYXJpYWJpbGl0eUluZm8gdmVJbmZvID0gKChQcm9jZXNzQWRhcHRlckZhY3RvcnlGaWx0ZXIpIGZpbHRlcikKLQkJCQkJCS5nZXRWYXJpYWJpbGl0eUluZm8oKFZhcmlhYmlsaXR5RWxlbWVudCkgdmUpOwotCQkJCUxpc3QgdmVDb250cmlidXRvcnMgPSB2ZUluZm8uZ2V0Q29udHJpYnV0b3JzKCk7Ci0JCQkJaWYgKGNvbnRyaWJ1dG9ycy5zaXplKCkgIT0gdmVDb250cmlidXRvcnMuc2l6ZSgpKSB7Ci0JCQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBjb250cmlidXRvcnMuaXRlcmF0b3IoKTsgaXRlcmF0b3IKLQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJT2JqZWN0IG5leHQgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCQlpZiAoIXZlQ29udHJpYnV0b3JzLmNvbnRhaW5zKG5leHQpKSB7Ci0JCQkJCQkJaWYgKCEoKEFjdGl2aXR5KSBuZXh0KS5nZXRCcmVha2Rvd25FbGVtZW50cygpCi0JCQkJCQkJCQkuaXNFbXB0eSgpKSB7Ci0JCQkJCQkJCXJldHVybiBudWxsOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQkKLQkJCQlyZXR1cm4gdmU7Ci0JCQkJCi0JCQl9ZWxzZXsKLQkJCQkvLyBJZiBubyBiYXNlIGRpYWdyYW0sIGNoZWNrIGJhc2Ugb2YgYmFzZSBoYWQgYW55IGRpYWdyYW0uCi0JCQkJcmV0dXJuIGNoZWNrVmFyaWFiaWxpdHkodmUsIGZpbHRlciwgdHlwZSk7Ci0JCQl9Ci0JCX0KLQkJCi0JfQotCi0JLyoqCi0JICogU2V0IHRoZSB3aW5kb3cncyBwcmVmZXJlbmNlIGF0dHJpYnV0ZSBmb3IgQWN0aXZpdHkgRGV0YWlsIERpYWdyYW0uCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHVibGlzaGVkVW5DcmVhdGVkQUREKGJvb2xlYW4gZmxhZykgewotCQl0aGlzLnB1Ymxpc2hVbmNyZWF0ZWRBREQgPSBmbGFnOwotCX0KLQkvKioKLQkgKiBTZXQgdGhlIHdpbmRvdydzIHByZWZlcmVuY2UgYXR0cmlidXRlIGZvciBBY2l0aXZ5dCBEaWFncmFtCi0JICogCi0JICovCi0JCi0JcHVibGljIHZvaWQgc2V0UHVibGlzaEFERm9yQWN0aXZpdHlFeHRlbnNpb24oYm9vbGVhbiBmbGFnKXsKLQkJdGhpcy5wdWJsaXNoQURGb3JBY3Rpdml0eUV4dGVuc2lvbiA9IGZsYWc7Ci0JfQotCi0JcHVibGljIEFjdGl2aXR5IGdldFJlYWxpemVkRm9yVW5tb2RpZmllZChPYmplY3QgYWN0aXZpdHksIElGaWx0ZXIgZmlsdGVyLCBTdXBwcmVzc2lvbiBzdXBwcmVzc2lvbikgewotCQkvLyBEb2VzIG5vdGhpbmcsIGp1c3QgaW50ZXJmYWNlIGltcGxlbWVudGF0aW9uLgotCQlyZXR1cm4gbnVsbDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvdmlld2VyL0FjdGl2aXR5RGlhZ3JhbVZpZXdlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvdmlld2VyL0FjdGl2aXR5RGlhZ3JhbVZpZXdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZmExNWU4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL3ZpZXdlci9BY3Rpdml0eURpYWdyYW1WaWV3ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLnZpZXdlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQuQWN0aXZpdHlEaWFncmFtRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZWRpdC5BY3Rpdml0eURpYWdyYW1FZGl0UGFydEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuQWN0aXZpdHlEaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk1vZGVsRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlN1cHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuUmVzb3VyY2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIFRoZSBncmFwaGljYWwgdmlld2VyIGZvciB0aGUgQWN0aXZpdHkgZGlhZ3JhbS4KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXR5RGlhZ3JhbVZpZXdlciBleHRlbmRzIEFic3RyYWN0RGlhZ3JhbUdyYXBoaWNhbFZpZXdlciB7Ci0KLQlwdWJsaWMgQWN0aXZpdHlEaWFncmFtVmlld2VyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgRWRpdFBhcnRGYWN0b3J5IGNyZWF0ZUVkaXRQYXJ0RmFjdG9yeSgpIHsKLQkJcmV0dXJuIG5ldyBBY3Rpdml0eURpYWdyYW1FZGl0UGFydEZhY3RvcnkoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgRWRpdFBhcnQgY3JlYXRlRWRpdFBhcnQoT2JqZWN0IGUsIElGaWx0ZXIgZmlsdGVyLCBTdXBwcmVzc2lvbiBzdXApIHsKLQkJQWN0aXZpdHlEaWFncmFtIGRpYWdyYW0gPSBNb2RlbEZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJLmNyZWF0ZUFjdGl2aXR5RGlhZ3JhbSgpOwotCQlkaWFncmFtLnNldEZpbHRlcihmaWx0ZXIpOwotCQlpZiAoc3VwICE9IG51bGwpIHsKLQkJCWRpYWdyYW0uc2V0U3VwcHJlc3Npb24oc3VwKTsKLQkJfQotCi0JCWRpYWdyYW0uc2V0T2JqZWN0KGUpOwotCQlFZGl0UGFydCBwYXJ0ID0gbmV3IEFjdGl2aXR5RGlhZ3JhbUVkaXRQYXJ0KGRpYWdyYW0pOwotCQlwYXJ0LnNldE1vZGVsKGRpYWdyYW0pOwotCQlyZXR1cm4gcGFydDsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERpYWdyYW1UeXBlKCkgewotCQlyZXR1cm4gUmVzb3VyY2VIZWxwZXIuRElBR1JBTV9UWVBFX1dPUktGTE9XOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvdmlld2VyL1dQRGVwZW5kZW5jeURpYWdyYW1WaWV3ZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL3ZpZXdlci9XUERlcGVuZGVuY3lEaWFncmFtVmlld2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkN2E5OGEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvdmlld2VyL1dQRGVwZW5kZW5jeURpYWdyYW1WaWV3ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLnZpZXdlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQuRGlhZ3JhbUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQuV1BEaWFncmFtRWRpdFBhcnRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk1vZGVsRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Xb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuU3VwcHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5SZXNvdXJjZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogVGhlIGdyYXBoaWNhbCB2aWV3ZXIgZm9yIHRoZSBXUCBEZXBlbmRlbmN5IGRpYWdyYW0uCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBXUERlcGVuZGVuY3lEaWFncmFtVmlld2VyIGV4dGVuZHMgQWJzdHJhY3REaWFncmFtR3JhcGhpY2FsVmlld2VyIHsKLQotCXB1YmxpYyBXUERlcGVuZGVuY3lEaWFncmFtVmlld2VyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQotCX0KLQotCXByb3RlY3RlZCBFZGl0UGFydEZhY3RvcnkgY3JlYXRlRWRpdFBhcnRGYWN0b3J5KCkgewotCQlyZXR1cm4gbmV3IFdQRGlhZ3JhbUVkaXRQYXJ0RmFjdG9yeSgpOwotCX0KLQotCXByb3RlY3RlZCBFZGl0UGFydCBjcmVhdGVFZGl0UGFydChPYmplY3QgZSwgSUZpbHRlciBmaWx0ZXIsIFN1cHByZXNzaW9uIHN1cCkgewotCQlXb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtIGRpYWdyYW0gPSBNb2RlbEZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJLmNyZWF0ZVdvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW0oKTsKLQkJZGlhZ3JhbS5zZXRGaWx0ZXIoZmlsdGVyKTsKLQkJaWYgKHN1cCAhPSBudWxsKSB7Ci0JCQlkaWFncmFtLnNldFN1cHByZXNzaW9uKHN1cCk7Ci0JCX0KLQotCQlkaWFncmFtLnNldE9iamVjdChlKTsKLQkJRWRpdFBhcnQgcGFydCA9IG5ldyBEaWFncmFtRWRpdFBhcnQoZGlhZ3JhbSk7Ci0JCXBhcnQuc2V0TW9kZWwoZGlhZ3JhbSk7Ci0JCXJldHVybiBwYXJ0OwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGlhZ3JhbVR5cGUoKSB7Ci0JCXJldHVybiBSZXNvdXJjZUhlbHBlci5ESUFHUkFNX1RZUEVfV1BfREVQRU5ERU5DWTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL3ZpZXdlci9wYWNrYWdlLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi92aWV3ZXIvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YTJlMzI0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL3ZpZXdlci9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyBncmFwaGljYWwgdmlld2VycyBmb3IgdGhlIGFjdGl2aXR5IGRpYWdyYW1zLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvQXV0aG9yaW5nUGVyc3BlY3RpdmUuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvQXV0aG9yaW5nUGVyc3BlY3RpdmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWY0M2RjMS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL0F1dGhvcmluZ1BlcnNwZWN0aXZlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnZpZXdzLkNvbmZpZ3VyYXRpb25WaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudmlld3MuTGlicmFyeVZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS53aXphcmRzLk5ld0NvbmZpZ3VyYXRpb25XaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS53aXphcmRzLk5ld0xpYnJhcnlXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS53aXphcmRzLk5ld1BsdWdpbldpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudWkud2l6YXJkcy5XaXphcmRDYXRlZ29yaWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnNlYXJjaC51aS5OZXdTZWFyY2hVSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRm9sZGVyTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklQYWdlTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklQZXJzcGVjdGl2ZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVBlcnNwZWN0aXZlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JUGVyc3BlY3RpdmVSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JUGxhY2Vob2xkZXJGb2xkZXJMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5jb25zb2xlLklDb25zb2xlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnByb2dyZXNzLklQcm9ncmVzc0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS53aXphcmRzLklXaXphcmRDYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS53aXphcmRzLklXaXphcmREZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLndpemFyZHMuSVdpemFyZFJlZ2lzdHJ5OwotCi0vKioKLSAqIFRoZSBNZXRob2QgQXV0aG9yaW5nIHBlcnNwZWN0aXZlLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBBdXRob3JpbmdQZXJzcGVjdGl2ZSBpbXBsZW1lbnRzIElQZXJzcGVjdGl2ZUZhY3RvcnkgewotCi0JLyoqCi0JICogVGhlIEF1dGhvcmluZyBwZXJzcGVjdGl2ZSBJRC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQRVJTUEVDVElWRV9JRCA9IEF1dGhvcmluZ1BlcnNwZWN0aXZlLmNsYXNzCi0JCQkuZ2V0TmFtZSgpOwotCi0JcHJpdmF0ZSBzdGF0aWMgTGlzdDxTdHJpbmc+IG5ld1dpemFyZFNob3J0Y3V0cyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCi0Jc3RhdGljIHsKLQkJbmV3V2l6YXJkU2hvcnRjdXRzLmFkZChOZXdMaWJyYXJ5V2l6YXJkLldJWkFSRF9JRCk7Ci0JCW5ld1dpemFyZFNob3J0Y3V0cy5hZGQoTmV3UGx1Z2luV2l6YXJkLldJWkFSRF9JRCk7Ci0JCW5ld1dpemFyZFNob3J0Y3V0cy5hZGQoTmV3Q29uZmlndXJhdGlvbldpemFyZC5XSVpBUkRfSUQpOwotCX0KLQotCS8qKgotCSAqIE9wZW5zIHRoaXMgcGVyc3BlY3RpdmUuCi0JICogCi0JICogQHJldHVybiB0aGUgcHJldmlvdXNseSBhY3RpdmUgcGVyc3BlY3RpdmUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElQZXJzcGVjdGl2ZURlc2NyaXB0b3Igb3BlbigpIHsKLQkJSVdvcmtiZW5jaFBhZ2UgYWN0aXZlUGFnZSA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkKLQkJCQkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0QWN0aXZlUGFnZSgpOwotCQlpZiAoYWN0aXZlUGFnZSAhPSBudWxsKSB7Ci0JCQlJUGVyc3BlY3RpdmVSZWdpc3RyeSByZWdpc3RyeSA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkKLQkJCQkJLmdldFBlcnNwZWN0aXZlUmVnaXN0cnkoKTsKLQkJCUlQZXJzcGVjdGl2ZURlc2NyaXB0b3Igb2xkUGVyc3BlY3RpdmUgPSBhY3RpdmVQYWdlLmdldFBlcnNwZWN0aXZlKCk7Ci0JCQlpZiAoIW9sZFBlcnNwZWN0aXZlLmdldElkKCkuZXF1YWxzKFBFUlNQRUNUSVZFX0lEKSkgewotCQkJCUlQZXJzcGVjdGl2ZURlc2NyaXB0b3IgcGVyc3BlY3RpdmUgPSByZWdpc3RyeQotCQkJCQkJLmZpbmRQZXJzcGVjdGl2ZVdpdGhJZChQRVJTUEVDVElWRV9JRCk7Ci0JCQkJYWN0aXZlUGFnZS5zZXRQZXJzcGVjdGl2ZShwZXJzcGVjdGl2ZSk7Ci0JCQl9Ci0JCQlyZXR1cm4gb2xkUGVyc3BlY3RpdmU7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JUGVyc3BlY3RpdmVGYWN0b3J5I2NyZWF0ZUluaXRpYWxMYXlvdXQoSVBhZ2VMYXlvdXQpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlSW5pdGlhbExheW91dChJUGFnZUxheW91dCBsYXlvdXQpIHsKLQkJbGF5b3V0LnNldEVkaXRvckFyZWFWaXNpYmxlKHRydWUpOwotCQlTdHJpbmcgZWRpdG9yQXJlYSA9IGxheW91dC5nZXRFZGl0b3JBcmVhKCk7Ci0JCUlGb2xkZXJMYXlvdXQgdG9wTGVmdEZvbGRlciA9IGxheW91dC5jcmVhdGVGb2xkZXIoInRvcExlZnQiLCAvLyROT04tTkxTLTEkCi0JCQkJSVBhZ2VMYXlvdXQuTEVGVCwgMC4zMGYsIGVkaXRvckFyZWEpOwotCi0JCUlGb2xkZXJMYXlvdXQgYm90dG9tTGVmdEZvbGRlciA9IGxheW91dC5jcmVhdGVGb2xkZXIoImJvdHRvbUxlZnQiLCAvLyROT04tTkxTLTEkCi0JCQkJSVBhZ2VMYXlvdXQuQk9UVE9NLCAwLjUwZiwgInRvcExlZnQiKTsgLy8kTk9OLU5MUy0xJAotCi0JCXRvcExlZnRGb2xkZXIuYWRkVmlldyhMaWJyYXJ5Vmlldy5WSUVXX0lEKTsKLQkJYm90dG9tTGVmdEZvbGRlci5hZGRWaWV3KENvbmZpZ3VyYXRpb25WaWV3LlZJRVdfSUQpOwotCi0JCUlQbGFjZWhvbGRlckZvbGRlckxheW91dCBvdXRwdXRGb2xkZXIgPSBsYXlvdXQuY3JlYXRlUGxhY2Vob2xkZXJGb2xkZXIoCi0JCQkJImJvdHRvbSIsIElQYWdlTGF5b3V0LkJPVFRPTSwgMC42NWYsIGVkaXRvckFyZWEpOyAvLyROT04tTkxTLTEkCi0JCW91dHB1dEZvbGRlci5hZGRQbGFjZWhvbGRlcihJUGFnZUxheW91dC5JRF9QUk9QX1NIRUVUKTsKLQkJb3V0cHV0Rm9sZGVyLmFkZFBsYWNlaG9sZGVyKElQYWdlTGF5b3V0LklEX1BST0JMRU1fVklFVyk7Ci0JCW91dHB1dEZvbGRlci5hZGRQbGFjZWhvbGRlcihOZXdTZWFyY2hVSS5TRUFSQ0hfVklFV19JRCk7Ci0JCW91dHB1dEZvbGRlci5hZGRQbGFjZWhvbGRlcihJQ29uc29sZUNvbnN0YW50cy5JRF9DT05TT0xFX1ZJRVcpOwotCQlvdXRwdXRGb2xkZXIuYWRkUGxhY2Vob2xkZXIoSVBhZ2VMYXlvdXQuSURfQk9PS01BUktTKTsKLQkJb3V0cHV0Rm9sZGVyLmFkZFBsYWNlaG9sZGVyKElQcm9ncmVzc0NvbnN0YW50cy5QUk9HUkVTU19WSUVXX0lEKTsKLQotCQlsYXlvdXQuYWRkTmV3V2l6YXJkU2hvcnRjdXQoTmV3TGlicmFyeVdpemFyZC5XSVpBUkRfSUQpOwotCQlsYXlvdXQuYWRkTmV3V2l6YXJkU2hvcnRjdXQoTmV3UGx1Z2luV2l6YXJkLldJWkFSRF9JRCk7Ci0JCWxheW91dC5hZGROZXdXaXphcmRTaG9ydGN1dChOZXdDb25maWd1cmF0aW9uV2l6YXJkLldJWkFSRF9JRCk7Ci0KLQkJSVdpemFyZFJlZ2lzdHJ5IG5ld1dpemFyZFJlZ2lzdHJ5ID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKQotCQkJCS5nZXROZXdXaXphcmRSZWdpc3RyeSgpOwotCQlJV2l6YXJkQ2F0ZWdvcnkgbmV3V2l6YXJkQ2F0ZWdvcnkgPSBuZXdXaXphcmRSZWdpc3RyeQotCQkJCS5maW5kQ2F0ZWdvcnkoV2l6YXJkQ2F0ZWdvcmllcy5ORVdfV0laQVJEU19DQVRFR09SWSk7Ci0JCUlXaXphcmREZXNjcmlwdG9yW10gd2l6YXJkRGVzY3JpcHRvcnMgPSBuZXdXaXphcmRDYXRlZ29yeS5nZXRXaXphcmRzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgd2l6YXJkRGVzY3JpcHRvcnMubGVuZ3RoOyBpKyspIHsKLQkJCUlXaXphcmREZXNjcmlwdG9yIHdpemFyZERlc2NyaXB0b3IgPSB3aXphcmREZXNjcmlwdG9yc1tpXTsKLQkJCVN0cmluZyB3aXphcmRJZCA9IHdpemFyZERlc2NyaXB0b3IuZ2V0SWQoKTsKLQkJCWlmICghbmV3V2l6YXJkU2hvcnRjdXRzLmNvbnRhaW5zKHdpemFyZElkKSkgewotCQkJCWxheW91dC5hZGROZXdXaXphcmRTaG9ydGN1dCh3aXphcmRJZCk7Ci0JCQl9Ci0JCX0KLQotCQlQZXJzcGVjdGl2ZUxpc3RVdGlsLmFkZFBlcnNwZWN0aXZlU2hvcnRMaXN0KGxheW91dCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL0F1dGhvcmluZ1VJSGVscENvbnRleHRzLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL0F1dGhvcmluZ1VJSGVscENvbnRleHRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmNDNkNGUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9BdXRob3JpbmdVSUhlbHBDb250ZXh0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLyAKLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWk7Ci0KLS8qKgotICogQXV0aG9yaW5nIFVJIGhlbHAgY29udGV4dHMKLSAqIAotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjAKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBBdXRob3JpbmdVSUhlbHBDb250ZXh0cyB7Ci0KLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgUk9PVF9DT05URVhUID0gQXV0aG9yaW5nVUlIZWxwQ29udGV4dHMuY2xhc3MuZ2V0UGFja2FnZSgpLmdldE5hbWUoKSArICIuIjsgIC8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyAgRklMRV9ORVdfTElCUkFSWV9DT05URVhUID0gUk9PVF9DT05URVhUICsgICJmaWxlX25ld19saWJyYXJ5X2NvbnRleHQiOyAvLyROT04tTkxTLTEkIAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nCUZJTEVfTkVXX1BMVUdJTl9DT05URVhUID0gUk9PVF9DT05URVhUICsgICJmaWxlX25ld19wbHVnaW5fY29udGV4dCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZwlGSUxFX05FV19DT05GSUdVUkFUSU9OX0NPTlRFWFQgPSBST09UX0NPTlRFWFQgKyAgImZpbGVfbmV3X2NvbmZpZ3VyYXRpb25fY29udGV4dCI7IC8vJE5PTi1OTFMtMSQgIAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nICBGSUxFX09QRU5fTElCUkFSWV9DT05URVhUID0gUk9PVF9DT05URVhUICsgICJmaWxlX29wZW5fbGlicmFyeV9jb250ZXh0IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nICBGSUxFX09QRU5fQ09ORklHVVJBVElPTl9DT05URVhUID0gUk9PVF9DT05URVhUICsgICJmaWxlX29wZW5fY29uZmlndXJhdGlvbl9jb250ZXh0IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nICBGSUxFX0lNUE9SVF9DT05URVhUID0gUk9PVF9DT05URVhUICsgImZpbGVfaW1wb3J0X2NvbnRleHQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgIEZJTEVfRVhQT1JUX0NPTlRFWFQgPSBST09UX0NPTlRFWFQgKyAiZmlsZV9leHBvcnRfY29udGV4dCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyAgTElCUkFSWV9OQVZJR0FUT1JfVklFV19DT05URVhUID0gUk9PVF9DT05URVhUICsgICJsaWJyYXJ5X25hdmlnYXRvcl92aWV3X2NvbnRleHQiOyAvLyROT04tTkxTLTEkICAKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyAgQ09ORklHVVJBVElPTl9WSUVXX0NPTlRFWFQgPSBST09UX0NPTlRFWFQgKyAgImNvbmZpZ3VyYXRpb25fdmlld19jb250ZXh0IjsgLy8kTk9OLU5MUy0xJCAgCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgIFBMVUdJTl9FRElUT1JfREVTQ1JJUFRJT05fQUxMX0NPTlRFWFQgPSBST09UX0NPTlRFWFQgKyAgInBsdWdpbl9lZGl0b3JfZGVzY3JpcHRpb25fYWxsX2NvbnRleHQiOyAvLyROT04tTkxTLTEkICAKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyAgQ09ORklHVVJBVElPTl9FRElUT1JfQUxMX0NPTlRFWFQgPSBST09UX0NPTlRFWFQgKyAgImNvbmZpZ3VyYXRpb25fZWRpdG9yX2FsbF9jb250ZXh0IjsgLy8kTk9OLU5MUy0xJCAgCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgIENPTlRFTlRfUEFDS0FHRV9FRElUT1JfQUxMX0NPTlRFWFQgPSBST09UX0NPTlRFWFQgKyAgImNvbnRlbnRfcGFja2FnZV9lZGl0b3JfYWxsX2NvbnRleHQiOyAvLyROT04tTkxTLTEkICAKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyAgRURJVE9SX1JPTEVfQ09OVEVYVF9IRUxQX0lEID0gUk9PVF9DT05URVhUICsgICJlZGl0b3Jfcm9sZV9jb250ZXh0X2hlbHBfSUQiOyAvLyROT04tTkxTLTEkICAKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyAgRURJVE9SX1RBU0tfQ09OVEVYVF9IRUxQX0lEID0gUk9PVF9DT05URVhUICsgICJlZGl0b3JfdGFza19jb250ZXh0X2hlbHBfSUQiOyAvLyROT04tTkxTLTEkICAKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyAgRURJVE9SX1dPUktfUFJPRFVDVF9DT05URVhUX0hFTFBfSUQgPSBST09UX0NPTlRFWFQgKyAgImVkaXRvcl93b3JrX3Byb2R1Y3RfY29udGV4dF9oZWxwX0lEIjsgLy8kTk9OLU5MUy0xJCAgCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgIEVESVRPUl9HVUlEQU5DRV9DT05URVhUX0hFTFBfSUQgPSBST09UX0NPTlRFWFQgKyAgImVkaXRvcl9ndWlkYW5jZV9jb250ZXh0X2hlbHBfSUQiOyAvLyROT04tTkxTLTEkICAKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyAgRURJVE9SX0RJU0NJUExJTkVfQ09OVEVYVF9IRUxQX0lEID0gUk9PVF9DT05URVhUICsgICJlZGl0b3JfZGlzY2lwbGluZV9jb250ZXh0X2hlbHBfSUQiOyAvLyROT04tTkxTLTEkICAKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyAgRURJVE9SX0RJU0NJUExJTkVfR1JPVVBJTkdfQ09OVEVYVF9IRUxQX0lEID0gUk9PVF9DT05URVhUICsgICJlZGl0b3JfZGlzY2lwbGluZV9ncm91cGluZ19jb250ZXh0X2hlbHBfSUQiOyAvLyROT04tTkxTLTEkICAKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyAgRURJVE9SX0RPTUFJTl9DT05URVhUX0hFTFBfSUQgPSBST09UX0NPTlRFWFQgKyAgImVkaXRvcl9kb21haW5fY29udGV4dF9oZWxwX0lEIjsgLy8kTk9OLU5MUy0xJCAgCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgIEVESVRPUl9XT1JLX1BST0RVQ1RfVFlQRV9DT05URVhUX0hFTFBfSUQgPSBST09UX0NPTlRFWFQgKyAgImVkaXRvcl93b3JrX3Byb2R1Y3RfdHlwZV9jb250ZXh0X2hlbHBfSUQiOyAvLyROT04tTkxTLTEkICAKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyAgRURJVE9SX1JPTEVfU0VUX0NPTlRFWFRfSEVMUF9JRCA9IFJPT1RfQ09OVEVYVCArICAiZWRpdG9yX3JvbGVfc2V0X2NvbnRleHRfaGVscF9JRCI7IC8vJE5PTi1OTFMtMSQgIAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nICBFRElUT1JfUk9MU0VfU0VUX0dST1VQSU5HX0NPTlRFWFRfSEVMUF9JRCA9IFJPT1RfQ09OVEVYVCArICAiZWRpdG9yX3JvbHNlX3NldF9ncm91cGluZ19jb250ZXh0X2hlbHBfSUQiOyAvLyROT04tTkxTLTEkICAKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyAgRURJVE9SX1RPT0xfQ09OVEVYVF9IRUxQX0lEID0gUk9PVF9DT05URVhUICsgICJlZGl0b3JfdG9vbF9jb250ZXh0X2hlbHBfSUQiOyAvLyROT04tTkxTLTEkIAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nICBFRElUT1JfQ1VTVE9NX0NBVEVHT1JZX0NPTlRFWFRfSEVMUF9JRCA9IFJPT1RfQ09OVEVYVCArICAiZWRpdG9yX2N1c3RvbV9jYXRlZ29yeV9jb250ZXh0X2hlbHBfSUQiIDsgLy8kTk9OLU5MUy0xJCAKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyAgRk9STV9FRElUT1JfREVTQ1JJUFRJT05fR0VORVJBTF9DT05URVhUID0gUk9PVF9DT05URVhUICsgICJmb3JtX2VkaXRvcl9kZXNjcmlwdGlvbl9nZW5lcmFsX2NvbnRleHQiIDsgLy8kTk9OLU5MUy0xJCAKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyAgRk9STV9FRElUT1JfREVTQ1JJUFRJT05fREVUQUlMX0NPTlRFWFQgPSBST09UX0NPTlRFWFQgKyAgImZvcm1fZWRpdG9yX2Rlc2NyaXB0aW9uX2RldGFpbF9jb250ZXh0IiAgOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgIEZPUk1fRURJVE9SX0RFU0NSSVBUSU9OX05PVEFUSU9OX0NPTlRFWFQgPSBST09UX0NPTlRFWFQgKyAgImZvcm1fZWRpdG9yX2Rlc2NyaXB0aW9uX25vdGF0aW9uX2NvbnRleHQiICA7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyAgRk9STV9FRElUT1JfREVTQ1JJUFRJT05fVEFJTE9SSU5HX0NPTlRFWFQgPSBST09UX0NPTlRFWFQgKyAgImZvcm1fZWRpdG9yX2Rlc2NyaXB0aW9uX3RhaWxvcmluZ19jb250ZXh0IiA7IC8vJE5PTi1OTFMtMSQgCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgIEZPUk1fRURJVE9SX0RFU0NSSVBUSU9OX1ZFUlNJT05fQ09OVEVYVCA9IFJPT1RfQ09OVEVYVCArICAiZm9ybV9lZGl0b3JfZGVzY3JpcHRpb25fdmVyc2lvbl9jb250ZXh0IiA7IC8vJE5PTi1OTFMtMSQgCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgIEZPUk1fRURJVE9SX0RFU0NSSVBUSU9OX0VMRU1FTlRfQ09OVEVYVCA9IFJPT1RfQ09OVEVYVCArICAiZm9ybV9lZGl0b3JfZGVzY3JpcHRpb25fZWxlbWVudF9jb250ZXh0IiA7IC8vJE5PTi1OTFMtMSQgCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgIEZPUk1fRURJVE9SX0RFU0NSSVBUSU9OX0lDT05fQ09OVEVYVCA9IFJPT1RfQ09OVEVYVCArICAiZm9ybV9lZGl0b3JfZGVzY3JpcHRpb25faWNvbl9jb250ZXh0IiA7IC8vJE5PTi1OTFMtMSQgCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgIEVESVRPUl9DUF9ERVNDUklQVElPTl9DT05URVhUX0hFTFBfSUQgPSBST09UX0NPTlRFWFQgKyAgImVkaXRvcl9jcF9kZXNjcmlwdGlvbl9jb250ZXh0X2hlbHBfSUQiIDsgLy8kTk9OLU5MUy0xJCAKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyAgRURJVE9SX0RQX0RFU0NSSVBUSU9OX0NPTlRFWFRfSEVMUF9JRCA9IFJPT1RfQ09OVEVYVCArICAiZWRpdG9yX2RwX2Rlc2NyaXB0aW9uX2NvbnRleHRfaGVscF9JRCIgOyAvLyROT04tTkxTLTEkIAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nICBGT1JNX0VESVRPUl9QUk9DRVNTX1dCU19DT05URVhUID0gUk9PVF9DT05URVhUICsgICJmb3JtX2VkaXRvcl9wcm9jZXNzX3dic19jb250ZXh0IiAgOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgIEZPUk1fRURJVE9SX1BST0NFU1NfT0JTX0NPTlRFWFQgPSBST09UX0NPTlRFWFQgKyAgImZvcm1fZWRpdG9yX3Byb2Nlc3Nfb2JzX2NvbnRleHQiIDsgLy8kTk9OLU5MUy0xJCAKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyAgRk9STV9FRElUT1JfUFJPQ0VTU19QQlNfQ09OVEVYVCA9IFJPT1RfQ09OVEVYVCArICAiZm9ybV9lZGl0b3JfcHJvY2Vzc19wYnNfY29udGV4dCIgIDsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nICBGT1JNX0VESVRPUl9QUk9DRVNTX0FMTEJTX0NPTlRFWFQgPSBST09UX0NPTlRFWFQgKyAiZm9ybV9lZGl0b3JfcHJvY2Vzc19hbGxic19jb250ZXh0IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nICBDT05GSUdVUkFUSU9OX1BVQkxJU0hfV0laQVJEX0FMTF9QQUdFU19DT05URVhUID0gUk9PVF9DT05URVhUICsgICJjb25maWd1cmF0aW9uX3B1Ymxpc2hfd2l6YXJkX2FsbF9wYWdlc19jb250ZXh0IiA7IC8vJE5PTi1OTFMtMSQgCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgIFJJQ0hfVEVYVF9FRElUT1JfQ09OVEVYVF9JRCA9IFJPT1RfQ09OVEVYVCArICAicmljaF90ZXh0X2VkaXRvcl9jb250ZXh0X0lEIiAgOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgIEZPUk1fRURJVE9SX0FDVElWSVRZX0RJQUdSQU1fQ09OVEVYVCA9IFJPT1RfQ09OVEVYVCArICJmb3JtX2VkaXRvcl9hY3Rpdml0eV9kaWFncmFtX2NvbnRleHQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgIEZPUk1fRURJVE9SX0FDVElWSVRZX0RFVEFJTF9ESUFHUkFNX0NPTlRFWFQgPSBST09UX0NPTlRFWFQgKyJmb3JtX2VkaXRvcl9hY3Rpdml0eV9kZXRhaWxfZGlhZ3JhbV9jb250ZXh0IjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgIEZPUk1fRURJVE9SX1dQX0RFUEVOREVOQ1lfRElBR1JBTV9DT05URVhUID0gUk9PVF9DT05URVhUICsgImZvcm1fZWRpdG9yX3dwX2RlcGVuZGVuY3lfZGlhZ3JhbV9jb250ZXh0IjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgIExJQlJBUllfVklFV19OT0RFX0NPTlRFWFRfTk9UX0lNUExFTUVOVEVEID0gUk9PVF9DT05URVhUICsgImxpYnJhcnlfdmlld19ub2RlX2NvbnRleHRfbm90X2ltcGxlbWVudGVkIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nICBMQVlPVVRfRkxBVF9BQ1RJT04gPSBST09UX0NPTlRFWFQgKyAibGF5b3V0X2ZsYXRfYWN0aW9uIjsgCSAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgIExBWU9VVF9ISUVSQVJDSElDQUxfQUNUSU9OID0gUk9PVF9DT05URVhUICsgImxheW91dF9oaWVyYXJjaGljYWxfYWN0aW9uIjsgCSAvLyROT04tTkxTLTEkCQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL0F1dGhvcmluZ1VJSW1hZ2VzLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL0F1dGhvcmluZ1VJSW1hZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkYmJiOWYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9BdXRob3JpbmdVSUltYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVNoYXJlZEltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotCi0vKioKLSAqIFNoYXJlZCBpbWFnZXMgdXNlZCBpbiB0aGUgQXV0aG9yaW5nIFVJLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEF1dGhvcmluZ1VJSW1hZ2VzIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19OQU1FX0NPTExBUFNFRCA9ICJmdWxsL29iajE2L0NvbGxhcHNlZC5naWYiOyAvLyROT04tTkxTLTEkIAkKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19OQU1FX0VYUEFOREVEID0gImZ1bGwvb2JqMTYvRXhwYW5kZWQuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX05BTUVfUkVGUkVTSCA9ICJmdWxsL2V0b29sMTYvUmVmcmVzaC5naWYiOyAvLyROT04tTkxTLTEkIAkKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19OQU1FX1NUT1AgPSAiZnVsbC9ldG9vbDE2L1N0b3AuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX05BTUVfUFJJTlQgPSAiZnVsbC9ldG9vbDE2L1ByaW50LmdpZiI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfTkFNRV9PVlJfRVJST1IgPSAiZnVsbC9vdnIxNi9lcnJvcl9vdnIuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19OQU1FX0xBWU9VVF9GTEFUID0gImZ1bGwvZXRvb2wxNi9mbGF0TGF5b3V0LmdpZiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19OQU1FX0xBWU9VVF9ISUVSQVJDSElDQUwgPSAiZnVsbC9ldG9vbDE2L2hpZXJhcmNoaWNhbExheW91dC5naWYiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBJTUdfREVTQ19DT0xMQVBTRUQgPSBBdXRob3JpbmdVSVBsdWdpbgotCQkJLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoSU1HX05BTUVfQ09MTEFQU0VEKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIElNR19ERVNDX0VYUEFOREVEID0gQXV0aG9yaW5nVUlQbHVnaW4KLQkJCS5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKElNR19OQU1FX0VYUEFOREVEKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIElNR19ERVNDX1JFRlJFU0ggPSBBdXRob3JpbmdVSVBsdWdpbgotCQkJLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoSU1HX05BTUVfUkVGUkVTSCk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBJTUdfREVTQ19TVE9QID0gQXV0aG9yaW5nVUlQbHVnaW4KLQkJCS5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKElNR19OQU1FX1NUT1ApOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgSU1HX0RFU0NfUFJJTlQgPSBBdXRob3JpbmdVSVBsdWdpbgotCQkJLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoSU1HX05BTUVfUFJJTlQpOwotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIElNR19ERVNDX09WUl9FUlJPUiA9IEF1dGhvcmluZ1VJUGx1Z2luCi0JCQkuZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcihJTUdfTkFNRV9PVlJfRVJST1IpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgSU1HX0RFU0NfTEFZT1VUX0ZMQVQgPSBBdXRob3JpbmdVSVBsdWdpbgotCQkJLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoSU1HX05BTUVfTEFZT1VUX0ZMQVQpOwotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIElNR19ERVNDX0xBWU9VVF9ISUVSQVJDSElDQUwgPSBBdXRob3JpbmdVSVBsdWdpbgotCQkJLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoSU1HX05BTUVfTEFZT1VUX0hJRVJBUkNISUNBTCk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIElNR19CQUNLID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKQotCQkJLmdldFNoYXJlZEltYWdlcygpLmdldEltYWdlKElTaGFyZWRJbWFnZXMuSU1HX1RPT0xfQkFDSyk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIElNR19DT0xMQVBTRUQgPSBBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCS5nZXRTaGFyZWRJbWFnZShJTUdfTkFNRV9DT0xMQVBTRUQpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBJTUdfRVhQQU5ERUQgPSBBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCS5nZXRTaGFyZWRJbWFnZShJTUdfTkFNRV9FWFBBTkRFRCk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIElNR19GT1JXQVJEID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKQotCQkJLmdldFNoYXJlZEltYWdlcygpLmdldEltYWdlKElTaGFyZWRJbWFnZXMuSU1HX1RPT0xfRk9SV0FSRCk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIElNR19SRUZSRVNIID0gQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpCi0JCQkuZ2V0U2hhcmVkSW1hZ2UoSU1HX05BTUVfUkVGUkVTSCk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIElNR19TVE9QID0gQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpCi0JCQkuZ2V0U2hhcmVkSW1hZ2UoSU1HX05BTUVfU1RPUCk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIElNR19QUklOVCA9IEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKQotCQkJLmdldFNoYXJlZEltYWdlKElNR19OQU1FX1BSSU5UKTsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIElNR19PVlJfRVJST1IgPSBBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCS5nZXRTaGFyZWRJbWFnZShJTUdfTkFNRV9PVlJfRVJST1IpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBJTUdfTEFZT1VUX0ZMQVQgPSBBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCS5nZXRTaGFyZWRJbWFnZShJTUdfTkFNRV9MQVlPVVRfRkxBVCk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIElNR19MQVlPVVRfSElFUkFSQ0hJQ0FMID0gQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpCi0JCQkuZ2V0U2hhcmVkSW1hZ2UoSU1HX05BTUVfTEFZT1VUX0hJRVJBUkNISUNBTCk7Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvQXV0aG9yaW5nVUlQbHVnaW4uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvQXV0aG9yaW5nVUlQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWExMWNmMS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL0F1dGhvcmluZ1VJUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5pbnRlcm5hbC5JbWFnZURlc2NyaXB0b3JSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmludGVybmFsLlByb2JsZW1NYXJrZXJNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJlZmVyZW5jZXMuTGlicmFyeVZpZXdQcmVmUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpLkFic3RyYWN0UGx1Z2luOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotCi0vKioKLSAqIFRoZSBBdXRob3JpbmcgVUkgcGx1Zy1pbiBjbGFzcy4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQXV0aG9yaW5nVUlQbHVnaW4gZXh0ZW5kcyBBYnN0cmFjdFBsdWdpbiB7Ci0KLQkvLyBUaGUgc2hhcmVkIHBsdWctaW4gaW5zdGFuY2UuCi0JcHJpdmF0ZSBzdGF0aWMgQXV0aG9yaW5nVUlQbHVnaW4gcGx1Z2luOwotCi0JcHJpdmF0ZSBQcm9ibGVtTWFya2VyTWFuYWdlciBmUHJvYmxlbU1hcmtlck1hbmFnZXI7Ci0JcHJpdmF0ZSBJbWFnZURlc2NyaXB0b3JSZWdpc3RyeSBmSW1hZ2VEZXNjcmlwdG9yUmVnaXN0cnk7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBBdXRob3JpbmdVSVBsdWdpbigpIHsKLQkJc3VwZXIoKTsKLQkJcGx1Z2luID0gdGhpczsKLQl9Ci0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5jb21tb24udWkuQWJzdHJhY3RQbHVnaW4jc3RhcnQob3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQpCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RhcnQoY29udGV4dCk7Ci0JCQotCQkvLyBJbml0aWFsaXplIHRoZSBBdXRob3JpbmcgVUkgc2VydmljZS4KLQkJQXV0aG9yaW5nVUlTZXJ2aWNlLmdldEluc3RhbmNlKCkuc3RhcnQoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5jb21tb24udWkuQWJzdHJhY3RQbHVnaW4jc3RvcChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0b3AoY29udGV4dCk7Ci0JCXBsdWdpbiA9IG51bGw7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuaW5pdChjb250ZXh0KTsKLQkJCi0JCUxpYnJhcnlWaWV3UHJlZlBhZ2UuaW5pdERlZmF1bHRzKGdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2hhcmVkIHBsdWctaW4gaW5zdGFuY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBBdXRob3JpbmdVSVBsdWdpbiBnZXREZWZhdWx0KCkgewotCQlyZXR1cm4gcGx1Z2luOwotCX0KLQkKLQlwdWJsaWMgc3luY2hyb25pemVkIFByb2JsZW1NYXJrZXJNYW5hZ2VyIGdldFByb2JsZW1NYXJrZXJNYW5hZ2VyKCkgewotCQlpZiAoZlByb2JsZW1NYXJrZXJNYW5hZ2VyID09IG51bGwpCi0JCQlmUHJvYmxlbU1hcmtlck1hbmFnZXI9IG5ldyBQcm9ibGVtTWFya2VyTWFuYWdlcigpOwotCQlyZXR1cm4gZlByb2JsZW1NYXJrZXJNYW5hZ2VyOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIEltYWdlRGVzY3JpcHRvclJlZ2lzdHJ5IGdldEltYWdlRGVzY3JpcHRvclJlZ2lzdHJ5KCkgewotCQlyZXR1cm4gZ2V0RGVmYXVsdCgpLmludGVybmFsR2V0SW1hZ2VEZXNjcmlwdG9yUmVnaXN0cnkoKTsKLQl9Ci0KLQlwcml2YXRlIHN5bmNocm9uaXplZCBJbWFnZURlc2NyaXB0b3JSZWdpc3RyeSBpbnRlcm5hbEdldEltYWdlRGVzY3JpcHRvclJlZ2lzdHJ5KCkgewotCQlpZiAoZkltYWdlRGVzY3JpcHRvclJlZ2lzdHJ5ID09IG51bGwpCi0JCQlmSW1hZ2VEZXNjcmlwdG9yUmVnaXN0cnk9IG5ldyBJbWFnZURlc2NyaXB0b3JSZWdpc3RyeSgpOwotCQlyZXR1cm4gZkltYWdlRGVzY3JpcHRvclJlZ2lzdHJ5OwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nKFRocm93YWJsZSB0KSB7Ci0JCWdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcih0KTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL0F1dGhvcmluZ1VJUmVzb3VyY2VzLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL0F1dGhvcmluZ1VJUmVzb3VyY2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiM2NkMmMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9BdXRob3JpbmdVSVJlc291cmNlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA1MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotLyoqCi0gKiBBdXRob2luZyBVSSByZXNvdXJjZXMKLSAqIAotICogQGF1dGhvciBMb2thbmF0aCBKYWdnYQotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEF1dGhvcmluZ1VJUmVzb3VyY2VzIGV4dGVuZHMgTkxTIHsKLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBCVU5ETEVfTkFNRSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmNsYXNzLmdldFBhY2thZ2UoKQotCQkJLmdldE5hbWUoKQotCQkJKyAiLlJlc291cmNlcyI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgQXV0aG9yaW5nVUlSZXNvdXJjZXMoKSB7Ci0JCS8vIERvIG5vdCBpbnN0YW50aWF0ZS4KLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgYXNzaWduQWN0aW9uX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDdXN0b21DYXRlZ29yeUFzc2lnblBhZ2VfaW5jbHVkZUVsZW1lbnRzT2ZUeXBlOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHVuYXNzaWduQWN0aW9uX3RleHQ7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVhc3NpZ25BY3Rpb25fdGV4dDsKLQkJCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGVlcENvcHlBY3Rpb25fdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbmZpZ3VyYXRpb25PcmRlckRpYWxvZ19kZXNjcmlwdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbmZpZ3VyYXRpb25PcmRlckRpYWxvZ19OYXZpZ2F0aW9uVmlld3M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlZGl0b3JfZXJyb3JfYWN0aXZhdGVkX291dG9mc3luY190aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVkaXRvcl9lcnJvcl9hY3RpdmF0ZWRfb3V0b2ZzeW5jX21lc3NhZ2U7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhc3NpZ25QYWdlX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2F0ZWdvcmllc1BhZ2VfdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkZWxpdmVyYWJsZVBhcnRzUGFnZV90aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRlc2NyaXB0aW9uUGFnZV90aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRpc2NpcGxpbmVzUGFnZV90aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRpc2NhcmR1bnJlc29sdmVkcmVmOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ3VpZGFuY2VQYWdlX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgSXRlbXNGaWx0ZXJEaWFsb2dfVXBkYXRlVHJlZUpvYl9uYW1lOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29uZmlndXJhdGlvbl9Qcm9ibGVtX1JlZnJlc2g7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvYmxlbUV4cGxhbmF0aW9uVGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5ld0RpYWdyYW1GaWxlX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHJldmlld1BhZ2VfdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwcm9tcHRDcmVhdGVOZXdEaWFncmFtRmlsZV9tc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwcm9tcHREZWxldGVDdXN0b21DYXRlZ29yeUJlZm9yZVJlbW92ZUxhc3RSZWZUb0l0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVmZXJlbmNlc1BhZ2VfdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZWZlcmVuY2VfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlZmVyZW5jZVdvcmtmbG93UGFnZV90aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJvbGVzUGFnZV90aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJvbGVTZXRzUGFnZV90aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHN0ZXBzUGFnZV90aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRhc2tzUGFnZV90aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRvb2xNZW50b3JzUGFnZV90aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdvcmtQcm9kdWN0c1BhZ2VfdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjaGVja0l0ZW1zU2VjdGlvbl9uYW1lOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2hlY2tJdGVtc1NlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRlcGVuZGVuY2llc1NlY3Rpb25fbmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRlcGVuZGVuY2llc1NlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRldGFpbFNlY3Rpb25fbmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRldGFpbFNlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdlbmVyYWxJbmZvU2VjdGlvbl9uYW1lOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBpY29uU2VjdGlvbl9uYW1lOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgaWNvblNlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG5vdGF0aW9uU2VjdGlvbl9uYW1lOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbm90YXRpb25TZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZWZlcmVuY2VkUGx1Z2luc1NlY3Rpb25fbmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlZmVyZW5jZWRQbHVnaW5zU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc3RhZmZpbmdTZWN0aW9uX25hbWU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzdGFmZmluZ1NlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHN0ZXBzU2VjdGlvbl9uYW1lOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc3RlcHNTZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0YWlsb3JpbmdTZWN0aW9uX25hbWU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0YWlsb3JpbmdTZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB2YXJpYWJpbGl0eVNlY3Rpb25fbmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdmVyc2lvbkluZm9TZWN0aW9uX25hbWU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB2ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGFkZGl0aW9uYWxJbmZvX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhcHBsaWNhdGlvbl90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHByYWN0aWNlX2FwcGxpY2F0aW9uX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhY3Rpb25MYWJlbF9lZGl0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgYWN0aW9uTGFiZWxfZmluZEVsZW1lbnRJbkxpYk5hdjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGFsdGVybmF0aXZlc190ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgYXNzaWdubWVudEFwcHJvYWNoZXNfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGF1dGhvcnNfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGJhY2tncm91bmRfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGJhc2VFbGVtZW50X3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBiYXNlR3VpZGFuY2VfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGJyaWVmRGVzY3JpcHRpb25fdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRlc2NyaXB0aW9uX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBiYWNrdXBiZWZvcmVzYXZlX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBicmllZk91dGxpbmVfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNoYW5nZURhdGVfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNoYW5nZURlc2NyaXB0aW9uX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjaGVja0l0ZW1zX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb250cmlidXRlc190ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbG9jYWxDb250cmlidXRlc190ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29udHJpYnV0ZXNfdG9fdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvcHlyaWdodF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZWRpdG9yX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBleHRlbmRzX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBleHRlbmRfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGV4dGVybmFsRGVzY3JpcHRpb25fdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGV4dGVybmFsSWRfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdvYWxzX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBpbXBhY3RPZk5vdEhhdmluZ190ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcga2V5Q29uc2lkZXJhdGlvbnNfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGxldmVsc09mQWRvcHRpb25fdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG1haW5EZXNjcmlwdGlvbl90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbmV3RWxlbWVudF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbmFtZV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbm90QXBwbGljYWJsZV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbm90YXRpb25fdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHBhY2thZ2luZ0d1aWRhbmNlX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwcmVzZW50YXRpb25OYW1lX3RleHQ7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbG9uZ19wcmVzZW50YXRpb25OYW1lX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwcm9tcHRmb3JsaWJhcnlfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVuYWJsZUhlYWx0aENoZWNrX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwcm9ibGVtX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwdXJwb3NlX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZWFzb25Gb3JOb3ROZWVkaW5nX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZXBsYWNlc190ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbG9jYWxSZXBsYWNlc190ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXh0ZW5kc1JlcGxhY2VzX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZXByZXNlbnRhdGlvbk9wdGlvbnNfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlcHJlc2VudGF0aW9uX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhdHRhY2hlZEZpbGVfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNraWxsc190ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc3RlcHNfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHN0ZXBzX25hbWVfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHN0b3BfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHByaW50X3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzeW5vbnltc190ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdHlwZV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29weV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGVlcENvcHlfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGJhY2tfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG5ld19wbHVnaW47Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBtb3ZlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdW5pcXVlSWRfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHZhcmlhYmlsaXR5VHlwZV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdmVyc2lvbl90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgYWRkQnV0dG9uX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhdHRhY2hCdXR0b25fdGV4dDsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhdHRhY2hVcmxCdXR0b25fdGV4dDsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBicm93c2VCdXR0b25fdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNoYW5nZVR5cGVCdXR0b25fdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNsZWFyQnV0dG9uX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkZWxldGVCdXR0b25fdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRldGFjaEJ1dHRvbl90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGlhZ3JhbV9zYXZlRXJyb3I7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkb3duQnV0dG9uX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkaXJlY3RvcnlfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG9yZGVyQnV0dG9uX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlZGl0QnV0dG9uX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZW1vdmVCdXR0b25fdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlbmFtZUFjdGlvbl90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVtb3ZlX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZW5hbWVfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNhdmVBc190ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VsZWN0QnV0dG9uX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkZXNlbGVjdEJ1dHRvbl90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdXBCdXR0b25fdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG1ha2VEZWZhdWx0QnV0dG9uX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB2aWV3SGlzdG9yeUJ1dHRvbl90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcm9sZVRhc2tzUGFnZV9zZWN0aW9uTmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJvbGVUYXNrc1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcm9sZVRhc2tzUGFnZV9hdmFpbGFibGVMYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJvbGVUYXNrc1BhZ2Vfc2VsZWN0ZWRMYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJvbGVUYXNrc1BhZ2Vfc2VsZWN0ZWRMYWJlbDI7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByb2xlVGFza3NQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByb2xlV29ya1Byb2R1Y3RzUGFnZV9zZWN0aW9uTmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJvbGVXb3JrUHJvZHVjdHNQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJvbGVXb3JrUHJvZHVjdHNQYWdlX2F2YWlsYWJsZUxhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcm9sZVdvcmtQcm9kdWN0c1BhZ2Vfc2VsZWN0ZWRMYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJvbGVXb3JrUHJvZHVjdHNQYWdlX3NlbGVjdGVkTGFiZWwyOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcm9sZVdvcmtQcm9kdWN0c1BhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJvbGVHdWlkYW5jZVBhZ2Vfc2VjdGlvbk5hbWU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByb2xlR3VpZGFuY2VQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJvbGVHdWlkYW5jZVBhZ2VfYXZhaWxhYmxlTGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByb2xlR3VpZGFuY2VQYWdlX3NlbGVjdGVkTGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByb2xlR3VpZGFuY2VQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByb2xlQ2F0ZWdvcmllc1BhZ2Vfc2VjdGlvbk5hbWU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByb2xlQ2F0ZWdvcmllc1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcm9sZUNhdGVnb3JpZXNQYWdlX2F2YWlsYWJsZUxhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcm9sZUNhdGVnb3JpZXNQYWdlX2F2YWlsYWJsZUxhYmVsMjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJvbGVDYXRlZ29yaWVzUGFnZV9zZWxlY3RlZExhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcm9sZUNhdGVnb3JpZXNQYWdlX3NlbGVjdGVkTGFiZWwyOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdGFza1JvbGVzUGFnZV9zZWN0aW9uTmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRhc2tSb2xlc1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdGFza1JvbGVzUGFnZV9hdmFpbGFibGVMYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRhc2tSb2xlc1BhZ2Vfc2VsZWN0ZWRMYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRhc2tSb2xlc1BhZ2Vfc2VsZWN0ZWRMYWJlbDI7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0YXNrUm9sZXNQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0YXNrUm9sZXNQYWdlX3ByaW1hcnlQZXJmb3JtZXJfbW9kaWZ5X21lc3NhZ2U7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0YXNrUm9sZXNQYWdlX2NvbmZpcm1fdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0YXNrV29ya1Byb2R1Y3RzUGFnZV9zZWN0aW9uTmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRhc2tXb3JrUHJvZHVjdHNQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRhc2tXb3JrUHJvZHVjdHNQYWdlX2F2YWlsYWJsZUxhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdGFza1dvcmtQcm9kdWN0c1BhZ2Vfc2VsZWN0ZWRMYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRhc2tXb3JrUHJvZHVjdHNQYWdlX3NlbGVjdGVkTGFiZWwyOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdGFza1dvcmtQcm9kdWN0c1BhZ2Vfc2VsZWN0ZWRMYWJlbDM7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0YXNrV29ya1Byb2R1Y3RzUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdGFza0d1aWRhbmNlUGFnZV9zZWN0aW9uTmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRhc2tHdWlkYW5jZVBhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdGFza0d1aWRhbmNlUGFnZV9hdmFpbGFibGVMYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRhc2tHdWlkYW5jZVBhZ2Vfc2VsZWN0ZWRMYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRhc2tHdWlkYW5jZVBhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRhc2tDYXRlZ29yaWVzUGFnZV9zZWN0aW9uTmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRhc2tDYXRlZ29yaWVzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0YXNrQ2F0ZWdvcmllc1BhZ2VfYXZhaWxhYmxlTGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0YXNrQ2F0ZWdvcmllc1BhZ2VfYXZhaWxhYmxlTGFiZWwyOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdGFza0NhdGVnb3JpZXNQYWdlX3NlbGVjdGVkTGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0YXNrQ2F0ZWdvcmllc1BhZ2Vfc2VsZWN0ZWRMYWJlbDI7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNYXJrZXJSZXNvbHV0aW9uR2VuZXJhdG9yX3JlbW92ZVVucmVzb2x2ZWRSZWZlcmVuY2U7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgTHBtUmVzb2x1dGlvbkdlbmVyYXRvcl9yZW1vdmVVbnJlc29sdmVkQmFzZVBsdWdpbnM7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgTHBtUmVzb2x1dGlvbkdlbmVyYXRvcl9yZW1vdmVNdWx0aXBsZVJlcGFjZXJzOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgTWFya2VyUmVzb2x1dGlvbkdlbmVyYXRvcl9zaG93T3duZXJJbkxpYnJhcnlWaWV3OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29uZmlndXJhdGlvbk1hcmtlclJlc29sdXRpb25HZW5lcmF0b3JfcmVzb2x2ZU1pc3NpbmdSZWZlcmVuY2U7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXb3JrUHJvZHVjdF9UYXNrc19TZWN0aW9uTmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdvcmtQcm9kdWN0X1Rhc2tzX1NlY3Rpb25EZXNjcmlwdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdvcmtQcm9kdWN0X1Rhc2tzX0F2YWlsYWJsZUxhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgV29ya1Byb2R1Y3RfVGFza3NfU2VsZWN0ZWRMYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdvcmtQcm9kdWN0X1Rhc2tzX1NlbGVjdGVkTGFiZWwyOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgV29ya1Byb2R1Y3RfVGFza3NfU2VsZWN0ZWRMYWJlbDM7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXb3JrUHJvZHVjdF9UYXNrc19NdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgd29ya1Byb2R1Y3RSb2xlc1BhZ2Vfc2VjdGlvbk5hbWU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3b3JrUHJvZHVjdFJvbGVzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3b3JrUHJvZHVjdFJvbGVzUGFnZV9hdmFpbGFibGVMYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdvcmtQcm9kdWN0Um9sZXNQYWdlX3NlbGVjdGVkTGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3b3JrUHJvZHVjdFJvbGVzUGFnZV9zZWxlY3RlZExhYmVsMjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdvcmtQcm9kdWN0Um9sZXNQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3b3JrUHJvZHVjdERlbGl2ZXJhYmxlUGFydHNQYWdlX3NlY3Rpb25OYW1lOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgd29ya1Byb2R1Y3REZWxpdmVyYWJsZVBhcnRzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3b3JrUHJvZHVjdERlbGl2ZXJhYmxlUGFydHNQYWdlX2F2YWlsYWJsZUxhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgd29ya1Byb2R1Y3REZWxpdmVyYWJsZVBhcnRzUGFnZV9zZWxlY3RlZExhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgd29ya1Byb2R1Y3REZWxpdmVyYWJsZVBhcnRzUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgd29ya1Byb2R1Y3RHdWlkYW5jZVBhZ2Vfc2VjdGlvbk5hbWU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3b3JrUHJvZHVjdEd1aWRhbmNlUGFnZV9zZWN0aW9uRGVzY3JpcHRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3b3JrUHJvZHVjdEd1aWRhbmNlUGFnZV9hdmFpbGFibGVMYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdvcmtQcm9kdWN0R3VpZGFuY2VQYWdlX3NlbGVjdGVkTGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3b3JrUHJvZHVjdEd1aWRhbmNlUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgd29ya1Byb2R1Y3RDYXRlZ29yaWVzUGFnZV9zZWN0aW9uTmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdvcmtQcm9kdWN0Q2F0ZWdvcmllc1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgd29ya1Byb2R1Y3RDYXRlZ29yaWVzUGFnZV9hdmFpbGFibGVMYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdvcmtQcm9kdWN0Q2F0ZWdvcmllc1BhZ2VfYXZhaWxhYmxlTGFiZWwyOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgd29ya1Byb2R1Y3RDYXRlZ29yaWVzUGFnZV9hdmFpbGFibGVMYWJlbDM7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3b3JrUHJvZHVjdENhdGVnb3JpZXNQYWdlX3NlbGVjdGVkTGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3b3JrUHJvZHVjdENhdGVnb3JpZXNQYWdlX3NlbGVjdGVkTGFiZWwyOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgd29ya1Byb2R1Y3RDYXRlZ29yaWVzUGFnZV9zZWxlY3RlZExhYmVsMzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHByYWN0aWNlUmVmZXJlbmNlc1BhZ2Vfc2VjdGlvbk5hbWU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwcmFjdGljZVJlZmVyZW5jZXNQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHByYWN0aWNlUmVmZXJlbmNlc1BhZ2VfYXZhaWxhYmxlTGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwcmFjdGljZVJlZmVyZW5jZXNQYWdlX3NlbGVjdGVkTGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwcmFjdGljZVJlZmVyZW5jZXNQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHJhY3RpY2VSZWZlcmVuY2VzUGFnZV9zb3J0T3JkZXJCdXR0b25fdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwcmFjdGljZVJlZmVyZW5jZXNQYWdlX3NvcnRUeXBlQnV0dG9uX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjYXRlZ29yeUd1aWRhbmNlc1BhZ2Vfc2VjdGlvbk5hbWU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjYXRlZ29yeUd1aWRhbmNlc1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2F0ZWdvcnlHdWlkYW5jZXNQYWdlX2F2YWlsYWJsZUxhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2F0ZWdvcnlHdWlkYW5jZXNQYWdlX3NlbGVjdGVkTGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjYXRlZ29yeUd1aWRhbmNlc1BhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRpc2NpcGxpbmVHcm91cGluZ0Rpc2NpcGxpbmVzUGFnZV9zZWN0aW9uTmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRpc2NpcGxpbmVHcm91cGluZ0Rpc2NpcGxpbmVzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkaXNjaXBsaW5lR3JvdXBpbmdEaXNjaXBsaW5lc1BhZ2VfYXZhaWxhYmxlTGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkaXNjaXBsaW5lR3JvdXBpbmdEaXNjaXBsaW5lc1BhZ2Vfc2VsZWN0ZWRMYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRpc2NpcGxpbmVHcm91cGluZ0Rpc2NpcGxpbmVzUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQXV0aG9yaW5nVUlQbHVnaW5fQWJzdHJhY3ROZXdMaWJyYXJ5UGFnZV9Vc2VEZWZhdWx0RGlyZWN0b3J5QnV0dG9uTGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkaXNjaXBsaW5lVGFza3NQYWdlX3NlY3Rpb25OYW1lOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGlzY2lwbGluZVRhc2tzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkaXNjaXBsaW5lVGFza3NQYWdlX2F2YWlsYWJsZUxhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGlzY2lwbGluZVRhc2tzUGFnZV9zZWxlY3RlZExhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGlzY2lwbGluZVRhc2tzUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGlzY2lwbGluZVJlZmVyZW5jZVdvcmtmbG93UGFnZV9zZWN0aW9uTmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRpc2NpcGxpbmVSZWZlcmVuY2VXb3JrZmxvd1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGlzY2lwbGluZVJlZmVyZW5jZVdvcmtmbG93UGFnZV9hdmFpbGFibGVMYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRpc2NpcGxpbmVSZWZlcmVuY2VXb3JrZmxvd1BhZ2Vfc2VsZWN0ZWRMYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRpc2NpcGxpbmVSZWZlcmVuY2VXb3JrZmxvd1BhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRvbWFpbldvcmtQcm9kdWN0c1BhZ2Vfc2VjdGlvbk5hbWU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkb21haW5Xb3JrUHJvZHVjdHNQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRvbWFpbldvcmtQcm9kdWN0c1BhZ2VfYXZhaWxhYmxlTGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkb21haW5Xb3JrUHJvZHVjdHNQYWdlX3NlbGVjdGVkTGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkb21haW5Xb3JrUHJvZHVjdHNQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3b3JrUHJvZHVjdFR5cGVXb3JrUHJvZHVjdHNQYWdlX3NlY3Rpb25OYW1lOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgd29ya1Byb2R1Y3RUeXBlV29ya1Byb2R1Y3RzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3b3JrUHJvZHVjdFR5cGVXb3JrUHJvZHVjdHNQYWdlX2F2YWlsYWJsZUxhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgd29ya1Byb2R1Y3RUeXBlV29ya1Byb2R1Y3RzUGFnZV9zZWxlY3RlZExhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgd29ya1Byb2R1Y3RUeXBlV29ya1Byb2R1Y3RzUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcm9sZVNldEdyb3VwaW5nUm9sZVNldHNQYWdlX3NlY3Rpb25OYW1lOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcm9sZVNldEdyb3VwaW5nUm9sZVNldHNQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJvbGVTZXRHcm91cGluZ1JvbGVTZXRzUGFnZV9hdmFpbGFibGVMYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJvbGVTZXRHcm91cGluZ1JvbGVTZXRzUGFnZV9zZWxlY3RlZExhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcm9sZVNldEdyb3VwaW5nUm9sZVNldHNQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByb2xlU2V0Um9sZXNQYWdlX3NlY3Rpb25OYW1lOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcm9sZVNldFJvbGVzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByb2xlU2V0Um9sZXNQYWdlX2F2YWlsYWJsZUxhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcm9sZVNldFJvbGVzUGFnZV9zZWxlY3RlZExhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcm9sZVNldFJvbGVzUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdG9vbFRvb2xNZW50b3JzUGFnZV9zZWN0aW9uTmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRvb2xUb29sTWVudG9yc1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdG9vbFRvb2xNZW50b3JzUGFnZV9hdmFpbGFibGVMYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRvb2xUb29sTWVudG9yc1BhZ2Vfc2VsZWN0ZWRMYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRvb2xUb29sTWVudG9yc1BhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGN1c3RvbUNhdGVnb3J5QXNzaWduUGFnZV9zZWN0aW9uTmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGN1c3RvbUNhdGVnb3J5QXNzaWduUGFnZV9zZWN0aW9uRGVzY3JpcHRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjdXN0b21DYXRlZ29yeUFzc2lnblBhZ2VfYXZhaWxhYmxlTGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjdXN0b21DYXRlZ29yeUFzc2lnblBhZ2Vfc2VsZWN0ZWRMYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGN1c3RvbUNhdGVnb3J5QXNzaWduUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbmV3UGx1Z2luV2l6YXJkX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbmV3UGx1Z2luV2l6YXJkUGFnZV90aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG5ld1BsdWdpbldpemFyZFBhZ2VfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG5ld1BsdWdpbkVycm9yX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG5ld1BsdWdpbkVycm9yX3JlYXNvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG1ldGhvZExpYnJhcnlHcm91cF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGVmYXVsdFBhdGhMYWJlbF90ZXh0OwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG1vZGVsaW5nR3JvdXBfdGV4dDsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyB1c2VySW50ZXJmYWNlR3JvdXBfdGV4dDsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkZWJ1Z0dyb3VwX3RleHQ7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZW5hYmxlTGlicmFyeVZhbGlkYXRpb25DaGVja2JveF90ZXh0OwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVkaXRvckdyb3VwX3RleHQ7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2hvd0xvbmdQcmVzZW50YXRpb25OYW1lQ2hlY2tib3hfdGV4dDsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzaG93TG9uZ1ByZXNlbnRhdGlvbk5hbWVDaGFuZ2VfbWVzc2FnZTsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBpbnZhbGlkUHJlZmVyZW5jZUhpc3RvcnlTaXplRXJyb3JfbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY3JlYXRlRGlhbG9nX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGVsZXRlRGlhbG9nX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZWRpdERpYWxvZ190aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVycm9yRGlhbG9nX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbW92ZURpYWxvZ190aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlbmFtZURpYWxvZ190aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdhcm5pbmdEaWFsb2dfdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhZGRDb25maWdFcnJvckRpYWxvZ190aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNldERlZmF1bHRDb25maWdFcnJvckRpYWxvZ190aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVkaXRQcm9jZXNzRWxlbWVudEVycm9yRGlhbG9nX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgb3BlbkxpYnJhcnlEaWFsb2dfdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBvcGVuTGlicmFyeURpYWxvZ190ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2F2ZUxpYnJhcnlEaWFsb2dfdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzYXZlTGlicmFyeURpYWxvZ190ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdXBncmFkZUxpYnJhcnlEaWFsb2dfdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkZWxldGVBc3NvY2lhdGlvbkRpYWxvZ190ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbm9PcGVuTGlicmFyeUVycm9yX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVtcHR5RWxlbWVudE5hbWVFcnJvcl9tc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkdXBsaWNhdGVFbGVtZW50TmFtZUVycm9yX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNyZWF0ZUNvbmZpZ0Vycm9yX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRlbGV0ZUNvbmZpZ0Vycm9yX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGludGVybmFsRXJyb3JfbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgaW52YWxpZFByZXNlbnRhdGlvbk5hbWVFcnJvcl9tc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBpbnZhbGlkQ29uZmlnRXJyb3JfbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2V0RGVmYXVsdENvbmZpZ0Vycm9yX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG9wZW5MaWJyYXJ5RXJyb3JfbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2F2ZUxpYnJhcnlFcnJvcl9tc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzYXZlTGlicmFyeVRvRXJyb3JfbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZWxlbWVudEFscmVhZHlEZWxldGVkRXJyb3JfbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdXBncmFkZUxpYnJhcnlFcnJvcl9tc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBvcGVuQ29uZmlnV2l6YXJkRXJyb3JfbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JfcmVhc29uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgaW50ZXJuYWxFcnJvcl9yZWFzb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB1cGdyYWRlTGlicmFyeUVycm9yX3JlYXNvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNhdmVVcGdyYWRlZExpYnJhcnlFcnJvcl9yZWFzb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBvcGVuaW5nTGlicmFyeVRhc2tfbmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNhdmluZ0xpYnJhcnlUYXNrX25hbWU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB1cGdyYWRpbmdMaWJyYXJ5VGFza19uYW1lOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbG9hZGluZ0xpYnJhcnlFbGVtZW50c1Rhc2tfbmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNhdmluZ1VwZ3JhZGVkRWxlbWVudHNUYXNrX25hbWU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzYXZpbmdUYXNrX25hbWU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzYXZpbmdGaWxlc1Rhc2tfbmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGZpeGluZ0NvbnRlbnREZXNjcmlwdGlvbkdVSURzVGFza19uYW1lOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGVsZXRpbmdJbnZhbGlkUmVmZXJlbmNlc1Rhc2tfbmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGFkZEVkaXRvclRvUGVyc3BlY3RpdmVXYXJuaW5nX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENoYW5nZUhpc3RvcnlEaWFsb2dfdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDaGFuZ2VIaXN0b3J5RGlhbG9nX2xhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29uZmlybURlbGV0ZURpYWxvZ190aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbmZpcm1EZWxldGVEaWFsb2dfbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29uZmlybURlbGV0ZURpYWxvZ19tc2dXaXRoUmVmZXJlbmNlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JEaWFsb2dfbWVzc2FnZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVycm9yRGlhbG9nX2Vycm9yOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyX25vb3BlbmxpYnJhcnk7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJfbG9hZGluZ2xpYnJhcnk7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBtc2dfcmVsb2FkTGlicmFyeTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlbG9hZERpYWxvZ19tZXNzYWdlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVsb2FkRGlhbG9nX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGlhbG9nc19Nb3ZlRGlhbG9nX2Vycm9yVGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkaWFsb2dzX01vdmVEaWFsb2dfZXJyb3JNZXNzYWdlOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRpYWxvZ3NfQXNzaWduRGlhbG9nX2Vycm9yTWVzc2FnZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHByb2Nlc3NGb3JtRWRpdG9yU2F2ZURpYWxvZ190aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHByb2Nlc3NGb3JtRWRpdG9yU2F2ZURpYWxvZ19tZXNzYWdlMTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHByb2Nlc3NGb3JtRWRpdG9yU2F2ZURpYWxvZ19tZXNzYWdlMjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbmZpZ1ZpZXdQYWdlUmVtb3ZlVmlld0RpYWxvZ190aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbmZpZ1ZpZXdQYWdlUmVtb3ZlVmlld0RpYWxvZ19tZXNzYWdlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29uZmlnVmlld1BhZ2VWaWV3RXhpc3RzRGlhbG9nX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29uZmlnVmlld1BhZ2VfY29uZmlndXJhdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbmZpZ1ZpZXdQYWdlX2NvbmZpZ3VyYXRpb25WaWV3czsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbmZpZ1ZpZXdQYWdlX3ZpZXdzOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29sdW1uc2VsZWN0aW9uX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb25maWdWaWV3UGFnZV9hZGRWaWV3QnV0dG9uVGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbmZpZ1ZpZXdQYWdlX3JlbW92ZVZpZXdCdXR0b25UZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29uZmlnVmlld1BhZ2VfbWFrZURlZmF1bHRCdXR0b25UZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29uZmlnVmlld1BhZ2VWaWV3RXhpc3RzRGlhbG9nX21lc3NhZ2U7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb25maWdWaWV3UGFnZV9jb25maWd1cmF0aW9uVmlld1NlY3Rpb25UaXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbmZpZ1ZpZXdQYWdlX2NvbmZpZ3VyYXRpb25WaWV3U2VjdGlvbk1lc3NhZ2U7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkZXNjcmlwdGlvblRhYkd1aWRhbmNlV2FybmluZ0RpYWxvZ190aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRlc2NyaXB0aW9uVGFiR3VpZGFuY2VXYXJuaW5nRGlhbG9nX21lc3NhZ2UxOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGVzY3JpcHRpb25UYWJHdWlkYW5jZVdhcm5pbmdEaWFsb2dfbWVzc2FnZTI7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjaGFuZ2VBY3Rpdml0eVR5cGVXYXJuaW5nRGlhbG9nX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQXNzb2NpYXRpb25Gb3JtUGFnZV9CcmllZkRlc2NyaXB0aW9uTGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBtZXRob2RFbGVtZW50RGVzY3JpcHRpb25FbXB0eU5hbWVEaWFsb2dfdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBtZXRob2RFbGVtZW50RGVzY3JpcHRpb25FbXB0eU5hbWVEaWFsb2dfbWVzc2FnZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG1ldGhvZFBsdWdpbkRlc2NyaXB0aW9uUmVtb3ZlUmVmQ29uZmlybV9tZXNzYWdlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbWV0aG9kUGx1Z2luRGVzY3JpcHRpb25QYWdlX2NvbmZpcm1SZW5hbWU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBtZXRob2RQbHVnaW5EZXNjcmlwdGlvblBhZ2VfY29uZmlybVJlbmFtZV90aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG1ldGhvZFBsdWdpbkRlc2NyaXB0aW9uUGFnZV9jYW5ub3RSZW5hbWVQbHVnaW5Gb2xkZXI7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBtZXRob2RQbHVnaW5EZXNjcmlwdGlvblBhZ2VfbG9ja1BsdWdpbkxhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG1ldGhvZFBsdWdpbkRlc2NyaXB0aW9uUGFnZV9zdXBwb3J0aW5nUGx1Z2luTGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBtZXRob2RQbHVnaW5EZXNjcmlwdGlvblBhZ2VfbG9ja1BsdWdpbl9tZXNzYWdlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHJvY2Vzc0Rlc2NyaXB0aW9uTmFtZUNoYW5nZUNvbmZpcm1fdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwcm9jZXNzRGVzY3JpcHRpb25OYW1lQ2hhbmdlQ29uZmlybV9tZXNzYWdlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHJvY2Vzc0Rlc2NyaXB0aW9uX2NvbmZpZ3VyYXRpb25EZXNjcmlwdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHByb2Nlc3NEZXNjcmlwdGlvbl9jb25maWd1cmF0aW9uU2VjdGlvblRpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHJvY2Vzc0Rlc2NyaXB0aW9uX2NvbmZpZ3VyYXRpb25TZWN0aW9uTWVzc2FnZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHByb2Nlc3NEZXNjcmlwdGlvbl9jb25maWd1cmF0aW9uczsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHByb2Nlc3NEZXNjcmlwdGlvbl9kZWZhdWx0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc0Rlc2NyaXB0aW9uX3NlbGVjdENvbmZpZ3VyYXRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzRGVsZXRlQWN0aW9uX2RlbGV0ZWNvZmlybV90ZXh0MDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NEZWxldGVBY3Rpb25fc2VsZWN0RGVzY3JpcHRvcnNUb0RlbGV0ZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHZpZXdIZWxwZXJIZWFsdGhDaGVja0RpYWxvZ190aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHZpZXdIZWxwZXJfcGVyZm9ybUhlYWx0aENoZWNrOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdmlld0hlbHBlckhlYWx0aENoZWNrRGlhbG9nX21lc3NhZ2U7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhdHRhY2hHdWlkYW5jZUZpbGVEaWFsb2dfdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjcmVhdGVFbGVtZW50RGlhbG9nX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY3JlYXRlTmV3RWxlbWVudEVycm9yX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRsZ1RpdGxlX3JlbG9hZExpYnJhcnk7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjcmVhdGVFbGVtZW50RXJyb3JfcmVhc29uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGVsZXRlQ29uZmlnRXJyb3JfcmVhc29uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2VmX2NoYW5nZUJvdW5kc0NvbW1hbmRfbGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZWZfY2hhbmdlTmFtZUNvbW1hbmRfbGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZWZfY2hhbmdlTmFtZUNvbW1hbmRfdW5kb01lc3NhZ2U7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZWZfY2hhbmdlUHJvcGVydHlWYWx1ZUNvbW1hbmRfbGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZWZfY3JlYXRlQmVuZHBvaW50Q29tbWFuZF9sYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdlZl9jcmVhdGVMaW5rQ29tbWFuZF9sYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdlZl9jcmVhdGVOb2RlQ29tbWFuZF9sYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdlZl9kZWxldGVCZW5kcG9pbnRDb21tYW5kX2xhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2VmX2RlbGV0ZUNvbW1hbmRfbGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZWZfZGVsZXRlTGlua0NvbW1hbmRfbGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZWZfbW92ZUJlbmRwb2ludENvbW1hbmRfbGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZWZfcmVjb25uZWN0TGlua0NvbW1hbmRfbGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZWZfdmFsaWRhdGluZ0RpcmVjdEVkaXRNYW5hZ2VyX2JyaW5nRG93blByb21wdDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdlZl92YWxpZGF0aW5nRnJlZVRleHRFZGl0TWFuYWdlcl9icmluZ0Rvd25Qcm9tcHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZWZfd29ya1Byb2R1Y3ROb2RlRWRpdFBhcnRfdmFsaWRhdGVNZXNzYWdlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgYWN0aW9uc19FbGVtZW50c1ZpZXdEZWxldGVBY3Rpb25fbWVzc2FnZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGFjdGlvbnNfTGlicmFyeUFjdGlvbkJhckNvbnRyaWJ1dG9yX2RlbGV0ZUVycm9yVGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhY3Rpb25zX0xpYnJhcnlBY3Rpb25CYXJDb250cmlidXRvcl9kZWxldGVFcnJvck1lc3NhZ2U7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhY3Rpb25zX0xpYnJhcnlBY3Rpb25CYXJDb250cmlidXRvcl9kZWxldGVFcnJvclJlYXNvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVkaXRvcnNfTWV0aG9kRWxlbWVudEVkaXRvcl9zYXZlRXJyb3JUaXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVkaXRvcnNfTWV0aG9kRWxlbWVudEVkaXRvcl9zYXZlRXJyb3JNZXNzYWdlMTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVkaXRvcnNfTWV0aG9kRWxlbWVudEVkaXRvcl9zYXZlRXJyb3JNZXNzYWdlMjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVkaXRvcnNfTWV0aG9kRWxlbWVudEVkaXRvcl9zYXZlRXJyb3JSZWFzb24xOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZWRpdG9yc19NZXRob2RFbGVtZW50RWRpdG9yX3NhdmVFcnJvclJlYXNvbjI7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlZGl0b3JzX01ldGhvZEVsZW1lbnRFZGl0b3JfcmVuYW1lRXJyb3JUaXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVkaXRvcnNfTWV0aG9kRWxlbWVudEVkaXRvcl9pbnZhbGlkRWRpdG9yTXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZWRpdG9yc19NZXRob2RFbGVtZW50RWRpdG9yX2ludmFsaWRFZGl0b3JUaXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVkaXRvcnNfTWV0aG9kRWxlbWVudEVkaXRvcl9yZW5hbWVFcnJvck1lc3NhZ2UxOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVuYW1lRXJyb3JfdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZW5hbWVFcnJvcl9tc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTZWxlY3RFbGVtZW50RGlhbG9nX3NlbGVjdGVsZW1lbnRfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVkaXRvcnNfRWRpdG9yQ2hvb3Nlcl9zeXN0ZW1FcnJvckRpYWxvZ190aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEF1dGhvcmluZ1VJUGx1Z2luX0Fic3RyYWN0TmV3TGlicmFyeVBhZ2VfRGVzY3JpcHRpb25MYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEF1dGhvcmluZ1VJUGx1Z2luX1NhdmVBbGxFZGl0b3JzUGFnZV9TZWxlY3RBbGxCdXR0b25MYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE9wZW5FbGVtZW50V29ya2JlbmNoQWN0aW9uRGVsZWdhdGVfZWRpdF90ZXh0MDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVkaXRvcnNfRWRpdG9yQ2hvb3Nlcl9zeXN0ZW1FcnJvckRpYWxvZ19tZXNzYWdlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGVzY3JpcHRpb25Gb3JtUGFnZV9JY29uRmlsZUNob29zZXJEaWFsb2dfdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBdXRob3JpbmdVSVBsdWdpbl9BYnN0cmFjdE5ld0xpYnJhcnlQYWdlX0RlZmF1bHRMaWJyYXJ5TmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEF1dGhvcmluZ1VJUGx1Z2luX05ld0NvbmZpZ3VyYXRpb25NYWluUGFnZV9EZXNjcmlwdGlvbkxhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQXV0aG9yaW5nVUlQbHVnaW5fT3BlbkNvbmZpZ3VyYXRpb25NYWluUGFnZV9wYWdlRGVzY3JpcHRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBdXRob3JpbmdVSVBsdWdpbl9TYXZlQWxsRWRpdG9yc1BhZ2VfRGVzZWxlY3RBbGxCdXR0b25MYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVsZW1lbnRzVmlld19taWdyYXRpb25fZGlyX2RsZ19kZXNjcmlwdGlvbl90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZWRpdG9yc19FZGl0b3JDaG9vc2VyX3N5c3RlbUVycm9yRGlhbG9nX3JlYXNvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGZvcm1zX0Rlc2NyaXB0aW9uRm9ybVBhZ2VfaW1hZ2VUb29CaWdEaWFsb2dfdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBmb3Jtc19EZXNjcmlwdGlvbkZvcm1QYWdlX2ltYWdlVG9vQmlnRGlhbG9nX3RlbXBsYXRlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZm9ybXNfRGVzY3JpcHRpb25Gb3JtUGFnZV9pbWFnZU5vdEZvdW5kRGlhbG9nX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZm9ybXNfRGVzY3JpcHRpb25Gb3JtUGFnZV9pbWFnZU5vdEZvdW5kRGlhbG9nX3RlbXBsYXRlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGVzY3JpcHRpb25Gb3JtUGFnZV9TaGFwZUljb25QcmV2aWV3X1NlbGVjdEJ1dHRvbkxhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQXV0aG9yaW5nVUlQbHVnaW5fQWJzdHJhY3ROZXdMaWJyYXJ5UGFnZV9EZWZhdWx0TGlicmFyeURlc2NyaXB0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQXV0aG9yaW5nVUlQbHVnaW5fTmV3Q29uZmlndXJhdGlvbk1haW5QYWdlX0RlZmF1bHRCcmllZkRlc2NyaXB0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQXV0aG9yaW5nVUlQbHVnaW5fU2F2ZUFsbEVkaXRvcnNQYWdlX3NhdmVBbmRDbG9zZVBhZ2VEZXNjcmlwdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGZvcm1zX0d1aWRhbmNlV2l0aEF0dGFjaG1lbnRzRGVzY3JpcHRpb25QYWdlX2FscmVhZHlBdHRhY2hlZF9tc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBuZXdMaWJyYXJ5RXJyb3JfbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbmV3TGlicmFyeUludGVybmxFcnJvcl9yZWFzb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBuZXdMaWJyYXJ5RXJyb3JfcmVhc29uMTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG5ld0xpYnJhcnlFcnJvcl9yZWFzb24yOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbmV3TGlicmFyeUVycm9yX3JlYXNvbjM7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBuZXdMaWJyYXJ5RXJyb3JfYWR2aWNlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc19FeHRlcm5hbElEOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc19QdXJwb3NlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc19TY29wZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NfVXNhZ2VOb3RlczsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NfQWx0ZXJuYXRpdmVzOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc19Ib3dUb1N0YWZmOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc19LZXlDb25zaWRlcmF0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc19TY2FsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NfUHJvamVjdENoYXJhY3RlcmlzdGljczsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NfUmlza0xldmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc19Fc3RpbWF0aW5nVGVjaG5pcXVlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc19Qcm9qZWN0TWVtYmVyRXhwZXJ0aXNlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc19UeXBlT2ZDb250cmFjdDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGJhY2tCdXR0b25fdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGZvcndhcmRCdXR0b25fdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGZvcndhcmRfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHN0b3BCdXR0b25fdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlZnJlc2hCdXR0b25fdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlZnJlc2hfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG5ld25hbWVfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHByaW50QnV0dG9uX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfUmVmcmVzaFZpZXdlcl9tZW51X2l0ZW07Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfU2hvd1Byb3BlcnRpZXNWaWV3X21lbnVfaXRlbTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9NZXRob2RFZGl0b3JfbWVudTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9DcmVhdGVDaGlsZF9tZW51X2l0ZW07Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfQ3JlYXRlU2libGluZ19tZW51X2l0ZW07Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfU2VsZWN0aW9uUGFnZV9sYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9QYXJlbnRQYWdlX2xhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xpc3RQYWdlX2xhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1RyZWVQYWdlX2xhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1RhYmxlUGFnZV9sYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9UYWJsZVRyZWVQYWdlX2xhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX09iamVjdENvbHVtbl9sYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9TZWxmQ29sdW1uX2xhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX05vT2JqZWN0U2VsZWN0ZWQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfU2luZ2xlT2JqZWN0U2VsZWN0ZWQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTXVsdGlPYmplY3RTZWxlY3RlZDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9PcGVuRWRpdG9yRXJyb3JfbGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfV2l6YXJkX2NhdGVnb3J5OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX01ldGhvZE1vZGVsV2l6YXJkX2xhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX01ldGhvZE1vZGVsV2l6YXJkX2Rlc2NyaXB0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX01ldGhvZEVkaXRvcl9sYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9NZXRob2RFZGl0b3JGaWxlbmFtZURlZmF1bHRCYXNlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX01ldGhvZEVkaXRvckZpbGVuYW1lRXh0ZW5zaW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1dpemFyZF9sYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9XQVJOX0ZpbGVuYW1lRXh0ZW5zaW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX01vZGVsT2JqZWN0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1hNTEVuY29kaW5nOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1hNTEVuY29kaW5nQ2hvaWNlczsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9XaXphcmRfaW5pdGlhbF9vYmplY3RfZGVzY3JpcHRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfRmlsZUNvbmZsaWN0X2xhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1dBUk5fRmlsZUNvbmZsaWN0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgYWRkTGlua0RpYWxvZ19saW5rVHlwZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG9wZW5MaW5rQ2hlY2tib3hfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGhlaWdodExhYmVsX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3aWR0aExhYmVsX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFbGVtZW50c1ZpZXdfMjA7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFbGVtZW50c1ZpZXdfMjE7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFbGVtZW50c1ZpZXdfMjI7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFbGVtZW50c1ZpZXdfMzU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFbGVtZW50c1ZpZXdfMzY7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhbHRUYWdMYWJlbF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgaW1hZ2VTaXplTGFiZWxfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NFZGl0b3I7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzRWRpdG9yX05hbWU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzRWRpdG9yX1ByZXNlbnRhdGlvbk5hbWU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzRWRpdG9yX0luZGV4OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc0VkaXRvcl9QcmVkZWNlc3NvcnM7Ci0KLQkvLyBwdWJsaWMgc3RhdGljIFN0cmluZyBDb25maWd1cmF0aW9uUGFnZV9TZWxlY3RlZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDaGVja2xpc3RPcmRlcl9kZXNjcmlwdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVsZW1lbnRzVmlld19yZW5hbWluZ190ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc0VkaXRvcl9Nb2RlbEluZm87Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzRWRpdG9yX1ByZWZpeDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1vdmVEaWFsb2dfbW92ZV90ZXh0OwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFzc2lnbkRpYWxvZ19hc3NpZ25fdGV4dDsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBc3NpZ25EaWFsb2dfcmVhc3NpZ25fdGV4dDsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBc3NpZ25EaWFsb2dfZGVlcGNvcHB5X3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDaGVja2xpc3RPcmRlcl90aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NFZGl0b3JfUmVwZXRhYmxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc0VkaXRvcl9PbmdvaW5nOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc0VkaXRvcl9BY3Rpb25fU3luY2hyb25pemF0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc0VkaXRvcl9FdmVudERyaXZlbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NFZGl0b3JfRGVsaXZlcmFibGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzRWRpdG9yX09wdGlvbmFsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRmlsdGVyRGlhbG9nX1R5cGVfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZpbHRlckRpYWxvZ19FeHBhbmRBbGw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNb3ZlRGlhbG9nX21vdmluZ190ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGVzY3JpcHRpb25Gb3JtUGFnZV9Mb2FkU2hhcGVJY29uV2FybmluZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERlc2NyaXB0aW9uRm9ybVBhZ2VfTG9hZFNoYXBlSWNvbkVycm9yOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQXV0aG9yaW5nVUlQbHVnaW5fQWJzdHJhY3ROZXdMaWJyYXJ5UGFnZV9OYW1lTGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBdXRob3JpbmdVSVBsdWdpbl9OZXdDb25maWd1cmF0aW9uTWFpblBhZ2VfcGFnZVRpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQXV0aG9yaW5nVUlQbHVnaW5fTmV3Q29uZmlndXJhdGlvbk1haW5QYWdlX05hbWVMYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEF1dGhvcmluZ1VJUGx1Z2luX25ld0NvbmZpZ3VyYXRpb25XaXphcmRfdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBuZXdDb25maWd1cmF0aW9uV2l6YXJkX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbmV3TGlicmFyeVdpemFyZF90aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG5ld0xpYnJhcnlXaXphcmRNYWluUGFnZV90aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG5ld0xpYnJhcnlXaXphcmRNYWluUGFnZV9kZXNjcmlwdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGxpYnJhcnlQYXRoTGFiZWxfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGxpYnJhcnlUeXBlTGFiZWxfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEF1dGhvcmluZ1VJUGx1Z2luX1NhdmVBbGxFZGl0b3JzUGFnZV9zYXZlVGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBdXRob3JpbmdVSVBsdWdpbl9TYXZlQWxsRWRpdG9yc1BhZ2Vfc2F2ZURlc2NyaXB0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQXV0aG9yaW5nVUlQbHVnaW5fT3BlbkNvbmZpZ3VyYXRpb25NYWluUGFnZV9wYWdlVGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBdXRob3JpbmdVSVBsdWdpbl9PcGVuQ29uZmlndXJhdGlvbldpemFyZF93aW5kb3dUaXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVsZW1lbnRzVmlld19yZXBsYWNlaW5nd2l0aGZvcm1hdF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGVzY3JpcHRpb25Gb3JtUGFnZV9Mb2FkTm9kZUljb25XYXJuaW5nOwotCi0JLy8gcHVibGljIHN0YXRpYyBTdHJpbmcgTWVzc2FnZUxhYmVsUHJvdmlkZXJfdW5zZWxlY3RlZHBhY2thZ2VzOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGVzY3JpcHRpb25Gb3JtUGFnZV9Mb2FkTm9kZUljb25FcnJvcjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFN0ZXBzT3JkZXJEaWFsb2dfc3RlcHM7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTdGVwc09yZGVyRGlhbG9nX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc0VkaXRvcl9QbGFubmVkOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc3BlY2lmeWRpcmVjdG9yeV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc0VkaXRvcl9NdWx0aXBsZU9jY3VycmVuY2VzOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc0VkaXRvcl9FbnRyeVN0YXRlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc0VkaXRvcl9FeGl0U3RhdGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzZWxlY3RDb2x1bW5zdG9BZGRfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NFZGl0b3JfVHlwZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NFZGl0b3JfVGVhbTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZpbHRlckRpYWxvZ190aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NFZGl0b3JfQWN0aW9uX0FkZDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZpbHRlckRpYWxvZ19Db2xsYXBzZUFsbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE9wZW5DaGVhdHNoZWV0Vmlld190aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NFZGl0b3JfQWN0aW9uX1JvbGxVcDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NFZGl0b3JfQWN0aW9uX1JvbGxEb3duOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc0VkaXRvcl9BY3Rpb25fTW92ZVVwOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc0VkaXRvcl9BY3Rpb25fTW92ZURvd247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzRWRpdG9yX0FjdGlvbl9JbmRlbnQ7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc0VkaXRvcl9BY3Rpb25fT3V0ZGVudDsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzRWRpdG9yX0FjdGlvbl9SZXZlYWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzRWRpdG9yX1JldmVhbF9UaXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NFZGl0b3JfQWN0aW9uX0NvcHk7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGaWx0ZXJEaWFsb2dfUGF0dGVybl90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgTWV0aG9kTGlicmFyeUVkaXRvcl90aXRsZTsKLQotCS8vIHB1YmxpYyBzdGF0aWMgU3RyaW5nIE1lc3NhZ2VWaWV3X3NlbGVjdGVkX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTWVzc2FnZVZpZXdfZXJybXNnX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFbGVtZW50c1ZpZXdfZXJyX3NhdmluZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVycl9jb3B5aW5nX2ZpbGVfdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJfY29weWluZ19maWxlX2Vycm9yOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyX2NvcHlpbmdfZmlsZV9yZWFzb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJfcHJvY2Vzc2luZ19maWxlX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZWRpdENvbmZpZ3VyYXRpb25fdG9vbHRpcDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVkaXREaWFsb2dfbXNnQ2Fubm90RWRpdDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNhdmVUaGlzQWN0aW9uX3NhdmVvYmplY3Q7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFbGVtZW50c1ZpZXdfcmVwbGFjZV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc0VkaXRvcl9BY3Rpb25fRXh0ZW5kOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgTW92ZURpYWxvZ19kZXN0aW5hdGlvbl90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2hvb3NlRGVmYXVsdERpcmVjdG9yeV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc0VkaXRvcl9BY3Rpb25fU3VwcHJlc3M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzRWRpdG9yX0FjdGlvbl9TdXBwcmVzczI7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzRWRpdG9yX0FjdGlvbl9Bc3NpZ25Vc2VyRGlhZ3JhbTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVzZXJEZWZpbmVkRGlhZ3JhbURpYWxvZ190aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVzZXJEZWZpbmVkRGlhZ3JhbURpYWxvZ19hZEltYWdlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgVXNlckRlZmluZWREaWFncmFtRGlhbG9nX2FkZEltYWdlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgVXNlckRlZmluZWREaWFncmFtRGlhbG9nX3dwZEltYWdlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgVXNlckRlZmluZWREaWFncmFtRGlhbG9nX25vdGFGaWxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgVXNlckRlZmluZWREaWFncmFtRGlhbG9nX2Fzc2lnbkJ1dHRvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVzZXJEZWZpbmVkRGlhZ3JhbURpYWxvZ19lbnRlcmVkSW1hZ2VOb3RGb3VuZDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVzZXJEZWZpbmVkRGlhZ3JhbURpYWxvZ19zZWxlY3RlZEltYWdlTm90Rm91bmQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVc2VyRGVmaW5lZERpYWdyYW1EaWFsb2dfdXNlQURJbWFnZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVzZXJEZWZpbmVkRGlhZ3JhbURpYWxvZ191c2VBRERJbWFnZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVzZXJEZWZpbmVkRGlhZ3JhbURpYWxvZ191c2VXUERJbWFnZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NFZGl0b3JfQWN0aW9uX0NvbnRyaWJ1dGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzRWRpdG9yX0FjdGlvbl9SZXBsYWNlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc0VkaXRvcl9BY3Rpb25fRGlhZ3JhbXM7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzRWRpdG9yX2FjdGlvbl9kZWVwQ29weTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZpbHRlckRpYWxvZ19CcmllZkRlc2NyaXB0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29uZmlndXJhdGlvblBhZ2VfaGlkZVRvb2xUaXA7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb25maWd1cmF0aW9uUGFnZV9EZXNjcmlwdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NFZGl0b3JfQWN0aW9uX1N1cHByZXNzQWxsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRmlsdGVyRGlhbG9nX1BhdHRlcm5fZGVzY3JpcHRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb25maWd1cmF0aW9uUGFnZV9UcmVlVGl0bGVMYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbmZpZ3VyYXRpb25QYWdlX0FkZENhdGVnb3JpZXNUaXRsZUxhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29uZmlndXJhdGlvblBhZ2VfU3ViQ2F0ZWdvcmllc1RpdGxlTGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb25maWd1cmF0aW9uUGFnZV9Mb2FkaW5nTWVzc2FnZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbmZpZ3VyYXRpb25QYWdlX3VwZGF0ZU9uQ2xpY2s7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29uZmlndXJhdGlvblBhZ2VfdXBkYXRlT25DbGlja1Rvb2xUaXA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29uZmlndXJhdGlvblBhZ2Vfbm9VcGRhdGVPbkNsaWNrOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbmZpZ3VyYXRpb25QYWdlX25vVXBkYXRlT25DbGlja1Rvb2xUaXA7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgTW92ZURpYWxvZ192YWxpZGRlc3RpbmF0aW9uX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNb3ZlRGlhbG9nX2Nhbm5vdE1vZGlmeURlc3RpbmF0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc0VkaXRvcl9BY3Rpb25fUmV2ZWFsQWxsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc0VkaXRvcl9BY3Rpb25fT3BlbkJhc2VBY3Rpdml0eTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NGb3JtRWRpdG9yX2V4cGFuQWxsQWN0aW9uTGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzRm9ybUVkaXRvcl9jb2xsYXBzZUFsbEFjdGlvbkxhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc0VkaXRvcl9BY3Rpb25fT3BlbkFjdGl2aXR5RGlhZ3JhbTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NFZGl0b3JfcHJvbXB0VG9EZWxldGVCZWZvcmVSZXZlYWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzRWRpdG9yUHJlZmVyZW5jZVBhZ2VfU2VsZWN0Q29sdW1uczsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NFZGl0b3JfQWN0aW9uX09wZW5BY3Rpdml0eURldGFpbERpYWdyYW07Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzRWRpdG9yUHJlZmVyZW5jZVBhZ2VfQ29sdW1uU2VsZWN0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc0VkaXRvclByZWZlcmVuY2VQYWdlX3N3aXRjaENvbmZpZ3VyYXRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzRWRpdG9yUHJlZmVyZW5jZVBhZ2Vfc3VwcHJlc3Npb25Hcm91cFRpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc0VkaXRvclByZWZlcmVuY2VQYWdlX2luaGVyaXRTdXBwcmVzc2lvblN0YXRlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc0VkaXRvcl9BY3Rpb25fT3BlbldvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW07Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEZXNjcmlwdGlvbkZvcm1QYWdlX1NoYXBlSWNvblByZXZpZXdfQ2xlYXJCdXR0b25MYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERlc2NyaXB0aW9uRm9ybVBhZ2VfTm9kZUljb25QcmV2aWV3X1NlbGVjdEJ1dHRvbkxhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc0VkaXRvcl9BY3Rpb25fSW5zZXJ0TmV3UGhhc2U7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBWaWV3SGVscGVyX3JlbG9hZExpYk9uUm9sbGJhY2tFcnJvcjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFZpZXdIZWxwZXJfYWxyZWFkeWRlbGV0ZWRfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFZpZXdIZWxwZXJfYWxyZWFkeWRlbGV0ZWRjb25maXJtX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb25maWd1cmF0aW9uUGFnZV9BZGRNaXNzaW5nVG9vbFRpcDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbmZpZ3VyYXRpb25EZXNjcmlwdGlvbkRlc2NyaXB0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29uZmlndXJhdGlvbkRlc2NyaXB0aW9uR2VuZXJhbEluZm87Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzRWRpdG9yX0FjdGlvbl9BcHBseVBhdHRlcm47Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNb3ZlRGlhbG9nX3NlbGVjdGRlc3RpbmF0aW9uX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNb3ZlRGlhbG9nX25vbW92ZV9kZXN0aW5hdGlvbl9wcm9ibGVtX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1ldGhvZExpYnJhcnlFZGl0b3JfdHJvdWJsZW9iamVjdDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1lc3NhZ2VMYWJlbFByb3ZpZGVyX2VycmNoaWxkcGtnczsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NFZGl0b3JfU3VwcHJlc3NEaWFsb2dfVGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzRWRpdG9yX1N1cHByZXNzRGlhbG9nX01lc3NhZ2U7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzRWRpdG9yX1RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2F2ZUFzd2l0aGRvdHNfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NFZGl0b3JfV29ya0JyZWFrZG93blN0cnVjdHVyZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NFZGl0b3JfVGVhbUFsbG9jYXRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzRWRpdG9yX1dvcmtQcm9kdWN0VXNhZ2U7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzRWRpdG9yX0NvbnNvbGlkYXRlZFZpZXc7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzRWRpdG9yX2NvbmZpcm1BdXRvU3luY2g7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzRWRpdG9yX2RlZmF1bHRTeW5jaHJvbml6YXRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb25maWd1cmF0aW9uUGFnZV9EZXNjcmlwdGlvbjE7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb25maWd1cmF0aW9uUGFnZV9EZXNjcmlwdGlvbjI7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBOZXdMaWJyYXJ5RGlhbG9nX25ld2xpYnJhcnlfYXM7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBOZXdQbHVnaW5EaWFsb2dfbmV3cGx1Z2luX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTZWxlY3RFbGVtZW50RGlhbG9nX3RpdGxlX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBPcGVuQ29uZmlnRGlhbG9nbmV3Y29uZmlnX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwcm9jZXNzQnJlYWtkb3duU3RydWN0dXJlRm9ybVBhZ2VfQlNFZGl0b3I7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBYnN0cmFjdERpYWdyYW1FZGl0b3JfYWxpZ25NZW51X3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBYnN0cmFjdERpYWdyYW1FZGl0b3JfcmVmcmVzaEZyb21CYXNlQWN0aXZpdHlfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFic3RyYWN0RGlhZ3JhbUVkaXRvcl9mb3JtYXRUZXh0Qm94QWN0aXZpdHlfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFic3RyYWN0RGlhZ3JhbUVkaXRvcl9oQWxpZ25BdmVyYWdlQWN0aW9uX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBYnN0cmFjdERpYWdyYW1FZGl0b3JfaEFsaWduRmlyc3RTZWxlY3RlZEFjdGlvbl90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWJzdHJhY3REaWFncmFtRWRpdG9yX3ZBbGlnbkF2ZXJhZ2VBY3Rpb25fdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1ldGhvZExpYnJhcnlEZXNjcmlwdGlvbkZvcm1QYWdlX3NlY3Rpb25fdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNb3ZlRGlhbG9nX2ludmFsaWRfbW92ZV9kZXN0aW5hdGlvbl9wcm9ibGVtX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1ldGhvZExpYnJhcnlFZGl0b3Jfc2F2ZW1vZGVsbGlicmFyeTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1ldGhvZExpYnJhcnlFZGl0b3JfZXJyb3JfZGlhbG9nX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgTWV0aG9kTGlicmFyeUVkaXRvcl9zYXZlX2xpYnJhcnlfcHJvYmxlbV9tc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNZXRob2RFbGVtZW50RGVsZXRlQWN0aW9uX2RlbGV0ZWNvbmZpcm1fdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbnRlbnRFbGVtZW50c09yZGVyRGlhbG9nX0NvbnRlbnRFbGVtZW50X3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBdXRob3JpbmdVSVBsdWdpbl9BYnN0cmFjdE5ld0xpYnJhcnlQYWdlX0Jyb3dzZUJ1dHRvbkxhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQXV0aG9yaW5nVUlQbHVnaW5fTmV3Q29uZmlndXJhdGlvbk1haW5QYWdlX3BhZ2VEZXNjcmlwdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEF1dGhvcmluZ1VJUGx1Z2luX1NhdmVBbGxFZGl0b3JzUGFnZV9zYXZlQW5kQ2xvc2VQYWdlVGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBYnN0cmFjdERpYWdyYW1FZGl0b3JfdkFsaWduRmlyc3RTZWxlY3RlZEFjdGlvbl90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWJzdHJhY3REaWFncmFtRWRpdG9yX1NhdmVfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEF0dGFjaG1lbnREaWFsb2dhdHRhY2hGaWxlX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb25maWd1cmF0aW9uUGFnZV9Db25maWdDb250ZW50OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgT3BlbkNvbmZpZ0RpYWxvZ29wZW5jb25maWdfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVsZW1lbnRzVmlld19yZXBsYWNlQWN0aW9uX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBYnN0cmFjdERpYWdyYW1FZGl0b3JfU2F2ZV9tZXNzYWdlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29uZmlndXJhdGlvblBhZ2VfU2hvd0Vycm9yVG9vbFRpcDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbmZpZ3VyYXRpb25EZXNjcmlwdGlvbkZvcm1QcmVmaXg7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDaGVja2xpc3RPcmRlcl9jaGVja2xpc3RpdGVtc190ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWJzdHJhY3REaWFncmFtRWRpdG9yX01vdmVOb2RlX2xhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29uZmlndXJhdGlvblBhZ2VfTWFrZUNsb3N1cmVUb29sVGlwOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgTmV3UGx1Z2luRGlhbG9nX3JlZmVyZW5jZXBsdWdpbl90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWJzdHJhY3REaWFncmFtRWRpdG9yX2NyZWF0ZUZyZWVUZXh0X3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEZXNjcmlwdGlvbkZvcm1QYWdlX05vZGVJY29uUHJldmlld19MYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERpYWdyYW1WYWxpZGF0aW9uX2Vycl9jYW5ub3RfY29ubmVjdF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGlhZ3JhbVZhbGlkYXRpb25fZXJyX3NhbWVwcmVkYW5kc3VjX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFZGl0b3JDaG9vc2VyX2xvYWRkRXJyb3JEbGdUaXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVkaXRvckNob29zZXJfUmVzb3VyY2VzRXJyb3I7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb25maWd1cmF0aW9uUGFnZV9Gb3JtUHJlZml4OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29uZmlndXJhdGlvbkRlc2NyaXB0aW9uTmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEF0dGFjaG1lbnREaWFsb2dGaWxlVVJMX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTdGVwc09yZGVyRGlhbG9nX2Rlc2NyaXB0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgTWV0aG9kTGlicmFyeUVkaXRvcl9lcnJfc2F2ZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1lc3NhZ2VWaWV3X2VycmVsZW1lbnRfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1lc3NhZ2VWaWV3X3JlZmVsZW1lbnRfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdGl2aXR5RGlhZ3JhbUVkaXRvcl9jcmVhdGVTdGFydE5vZGVfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbmZpZ3VyYXRpb25QYWdlX0NvbmZpZ0NvbnRlbnREZXNjcmlwdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbnRlbnRFbGVtZW50c09yZGVyRGlhbG9nX2Rlc2NyaXB0aW9uX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBdXRob3JpbmdVSVBsdWdpbl9BYnN0cmFjdE5ld0xpYnJhcnlQYWdlX0RpcmVjdG9yeUxhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUm9vdFByZWZQYWdlX2VuYWJsZXByb2Nlc3Njb250cmlidXRpb25fdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbmZpZ3VyYXRpb25EZXNjcmlwdGlvbkRlc2NyaXB0aW9uX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb25maWd1cmF0aW9uRGVzY3JpcHRpb25EZXNjcmlwdGlvbkxhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29udHJpYnV0aW9uU2VsZWN0aW9uX2ZpbHRlcmRpYWxvZ190aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVsZW1lbnRzVmlld19vcGVuVmFyaWFiaWxpdHlEaWFsb2dBY3Rpb25fdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFZhcmlhYmlsaXR5U2VsZWN0aW9uX2ZpbHRlcmRpYWxvZ190aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFZhcmlhYmlsaXR5U2VsZWN0aW9uX2ZpbHRlcmRpYWxvZ192aWV3ZXJMYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERlc2NyaXB0aW9uRm9ybVBhZ2VfU2hhcGVJY29uUHJldmlld19MYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERpYWdyYW1WYWxpZGF0aW9uX2Vycl9jYW5ub3RfZGVsZXRlX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3Rpdml0eURpYWdyYW1FZGl0b3Jfb3BlbkFjdGl2aXR5RGV0YWlsRGlhZ3JhbV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgTWV0aG9kTGlicmFyeURlc2NyaXB0aW9uRm9ybVBhZ2Vfc2VjdGlvbl9kZXNjcmlwdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERlc2NyaXB0aW9uRm9ybVBhZ2VfTm9kZUljb25QcmV2aWV3X0NsZWFyQnV0dG9uTGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXUENvbXBhcnRtZW50RmlndXJlXzA7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwcm9tcHRmb3JfcHVibGlzaF91bm9wZW5fYWN0aXZpdHlkZF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHJvbXB0X2Zvcl9wdWJsaXNoX2V4dGVuZF9hY3Rpdml0eV9kaWFncmFtOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29uZmlnUHJvY2Vzc1ZpZXdEaWFsb2dfTmFtZVBhdHRlcm47Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzaG93SW5SZXNvdXJjZU5hdmlnYXRvckFjdGlvbl9sYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbmZpZ1Byb2Nlc3NWaWV3RGlhbG9nX1BhdHRlcm47Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJfcHJvY2Vzc2luZ19maWxlX2Rlc2NyaXB0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29uZmlnUHJvY2Vzc1ZpZXdEaWFsb2dfQ2F0ZWdvcnlUeXBlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29uZmlnUHJvY2Vzc1ZpZXdEaWFsb2dfQnJpZWZEZXNjcmlwdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbmZpZ1Byb2Nlc3NWaWV3RGlhbG9nX1NlbGVjdENhdGVnb3JpZXM7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjaGVhdHNoZWV0X2xvYWRfZmFpbHVyZV9sb2dfbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbmV3Q29uZmlndXJhdGlvbldpcmF6ZF9jcmVhdGVFcnJvcjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG5ld1BsdWdpbldpemFyZF9jcmVhdGVFcnJvcjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVycm9yRGlhbG9nX21vdmVFcnJvcjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlbmFtZURpYWxvZ19yZW5hbWVFcnJvcjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVycm9yRGlhbG9nX2NyZWF0ZUVycm9yOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZHVwbGljYXRlUGx1Z2luTmFtZUVycm9yX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NFZGl0b3JfQWN0aW9uX0FkZEFESW1hZ2U7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzRWRpdG9yX3JlZnJlc2hFcnJvclRpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc0VkaXRvcl9yZWZyZXNoRXJyb3JNc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzRWRpdG9yX0FjdGlvbl9BZGRBRERJbWFnZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NFZGl0b3JfQWN0aW9uX0FkZFdQREltYWdlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc0VkaXRvcl9BY3Rpb25fVXNlQURJbWFnZUluUHVibGlzaGluZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NFZGl0b3JfcHJvbXB0VG9EZWxldGVCZWZvcmVTdXBwcmVzczsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NFZGl0b3JfQWN0aW9uX1VzZUFEREltYWdlSW5QdWJsaXNoaW5nOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc0VkaXRvcl9BY3Rpb25fVXNlV1BESW1hZ2VJblB1Ymxpc2hpbmc7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzRWRpdG9yX0RpYWdyYW1JbWFnZV9JbnB1dERpYWxvZ19pbml0aWFsVmFsdWU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzRWRpdG9yX0FjdGlvbl9TaG93TGlua2VkRWxlbWVudGluTGlicmFyeVZpZXc7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzRWRpdG9yX3VwZGF0ZVN1cHByZXNzaW9uRnJvbUJhc2VBY3Rpb25fbGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzRWRpdG9yX0NvbnRleHRNZW51X0RpYWdyYW1JbWFnZXM7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzeW5jaHJvbml6YXRpb25XaXphcmRfZGVzY3JpcHRpb25QYWdlX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc3luY2hyb25pemF0aW9uV2l6YXJkX2Rlc2NyaXB0aW9uUGFnZV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdENvbmZpZ1BhZ2VfdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0Q29uZmlnUGFnZV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdENvbmZpZ1BhZ2VfY29uZmlnTGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0RGV0YWlsc1BhZ2VfdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0RGV0YWlsc1BhZ2VfcHJvcGVydGllc19sYWJsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3REZXRhaWxzUGFnZV9uYW1lX2xhYmxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdERldGFpbHNQYWdlX3ByZXNlbnRhdGlvbk5hbWVfbGFibGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0RGV0YWlsc1BhZ2VfYnJpZWZEZXNjX2xhYmxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdERldGFpbHNQYWdlX29wdGlvbmFsSW5vdXRzX2xhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdERldGFpbHNQYWdlX21hbmRhdG9yeUlucHV0c19sYWJsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3REZXRhaWxzUGFnZV9vdXRwdXRzX2xhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdERldGFpbHNQYWdlX3ByaW1hcnlQZXJmb3JtZXJfbGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0RGV0YWlsc1BhZ2VfYWRkblBlcmZvcm1lcnNfbGFibGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0RGV0YWlsc1BhZ2VfcmVzcG9uc2libGVSb2xlc19sYWJsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3REZXRhaWxzUGFnZV9jb250bkFydGlmYWN0c19sYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3REZXRhaWxzUGFnZV9kaWx2ZWRQYXJ0c19sYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3REZXRhaWxzUGFnZV9zZWxTdGVwc19sYWJlbDsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0RGV0YWlsc1BhZ2Vfc2VsR3VpZGFuY2VfbGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0RGV0YWlsc1BhZ2VfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHN5bmNocm9uaXphdGlvbldpemFyZF9wcmV2aWV3UGFnZV90aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHN5bmNocm9uaXphdGlvbldpemFyZF9wcmV2aWV3UGFnZV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VsZWN0RWRpdG9yc1RvRGlzY2FyZENvbmZsaWN0Q2hhbmdlczsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHN5bmNocm9uaXphdGlvbldpemFyZF90aXRsZV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc3luY2hyb25pemF0aW9uV2l6YXJkX2Rlc2NyaXB0aW9uUGFnZV9leHBsYWluVGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG9wZW5SVEU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjbG9zZVJURTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENoYW5nZUhpc3RvcnlEaWFsb2dfZGVsaW1pdGVyOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcm9sZXNldHNfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRpc2NpcGxpbmVzX2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3b3JrcHJvZHVjdHR5cGVzX2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkb21haW5zX2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0b29sc19ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY3VzdG9tY2F0ZWdvcnlfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbmNlcHRfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNoZWNrbGlzdF9ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXhhbXBsZV9ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ3VpZGVsaW5lX2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByb2FkbWFwX2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZXVzYWJsZWFzc2V0X2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzdXBwb3J0aW5nbWF0ZXJpYWxfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlcG9ydF9ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHJhY3RpY2VfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRlbXBsYXRlX2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0ZXJtZGVmaW5pdGlvbl9ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdG9vbG1lbnRvcl9ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgd2hpdGVwYXBlcl9ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXN0aW1hdGlvbmNvbnNpZGVyYXRpb25fZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbjsKLQotCS8vIE5ldyBTdHJpbmcgU2VjdGlvbiBEZXNjcmlwdGlvbgotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJvbGVfZGV0YWlsU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcm9sZV9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJvbGVfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByb2xlX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdGFza19kZXRhaWxTZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0YXNrX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdGFza192YXJpYWJpbGl0eVNlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRhc2tfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhcnRpZmFjdF9kZXRhaWxTZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhcnRpZmFjdF9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGFydGlmYWN0X2ljb25TZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhcnRpZmFjdF9ub3RhdGlvblNlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGFydGlmYWN0X3RhaWxvcmluZ1NlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGFydGlmYWN0X3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgYXJ0aWZhY3RfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBvdXRjb21lX2RldGFpbFNlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG91dGNvbWVfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBvdXRjb21lX2ljb25TZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBvdXRjb21lX25vdGF0aW9uU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgb3V0Y29tZV90YWlsb3JpbmdTZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBvdXRjb21lX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgb3V0Y29tZV92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRlbGl2ZXJhYmxlX2RldGFpbFNlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRlbGl2ZXJhYmxlX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGVsaXZlcmFibGVfaWNvblNlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRlbGl2ZXJhYmxlX25vdGF0aW9uU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGVsaXZlcmFibGVfdGFpbG9yaW5nU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGVsaXZlcmFibGVfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkZWxpdmVyYWJsZV92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRpc2NpcGxpbmVfZGV0YWlsU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGlzY2lwbGluZV9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRpc2NpcGxpbmVfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkaXNjaXBsaW5lX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZG9tYWluX2RldGFpbFNlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRvbWFpbl9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRvbWFpbl92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRvbWFpbl92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdvcmtwcm9kdWN0dHlwZV9kZXRhaWxTZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3b3JrcHJvZHVjdHR5cGVfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3b3JrcHJvZHVjdHR5cGVfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3b3JrcHJvZHVjdHR5cGVfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByb2xlc2V0X2RldGFpbFNlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJvbGVzZXRfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByb2xlc2V0X3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcm9sZXNldF92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRvb2xfZGV0YWlsU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdG9vbF9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRvb2xfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0b29sX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29uY2VwdF9kZXRhaWxTZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb25jZXB0X2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29uY2VwdF92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbmNlcHRfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjaGVja2xpc3RfZGV0YWlsU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2hlY2tsaXN0X2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2hlY2tsaXN0X3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2hlY2tsaXN0X3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXhhbXBsZV9kZXRhaWxTZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBleGFtcGxlX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXhhbXBsZV92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGV4YW1wbGVfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBndWlkZWxpbmVfZGV0YWlsU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ3VpZGVsaW5lX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ3VpZGVsaW5lX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ3VpZGVsaW5lX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXN0aW1hdGlvbmNvbnNpZGVyYXRpb25fZGV0YWlsU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXN0aW1hdGlvbmNvbnNpZGVyYXRpb25fZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlc3RpbWF0aW9uY29uc2lkZXJhdGlvbl92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVzdGltYXRpb25jb25zaWRlcmF0aW9uX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHJhY3RpY2VfZGV0YWlsU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHJhY3RpY2VfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwcmFjdGljZV92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHByYWN0aWNlX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVwb3J0X2RldGFpbFNlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlcG9ydF9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlcG9ydF92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlcG9ydF92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlc3VhYmxlYXNzZXRfZGV0YWlsU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVzdWFibGVhc3NldF9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlc3VhYmxlYXNzZXRfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZXN1YWJsZWFzc2V0X3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcm9hZG1hcF9kZXRhaWxTZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByb2FkbWFwX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcm9hZG1hcF92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJvYWRtYXBfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzdXBwb3J0aW5nbWF0ZXJpYWxfZGV0YWlsU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc3VwcG9ydGluZ21hdGVyaWFsX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc3VwcG9ydGluZ21hdGVyaWFsX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc3VwcG9ydGluZ21hdGVyaWFsX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdGVtcGxhdGVfZGV0YWlsU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdGVtcGxhdGVfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0ZW1wbGF0ZV92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRlbXBsYXRlX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdGVybWRlZmluaXRpb25fZGV0YWlsU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdGVybWRlZmluaXRpb25fZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0ZXJtZGVmaW5pdGlvbl92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRlcm1kZWZpbml0aW9uX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdG9vbG1lbnRvcl9kZXRhaWxTZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0b29sbWVudG9yX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdG9vbG1lbnRvcl92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRvb2xtZW50b3JfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3aGl0ZXBhcGVyX2RldGFpbFNlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdoaXRlcGFwZXJfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3aGl0ZXBhcGVyX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgd2hpdGVwYXBlcl92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRpc2NpcGxpbmVncm91cGluZ19kZXRhaWxTZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkaXNjaXBsaW5lZ3JvdXBpbmdfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkaXNjaXBsaW5lZ3JvdXBpbmdfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkaXNjaXBsaW5lZ3JvdXBpbmdfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByb2xlc2V0Z3JvdXBpbmdfZGV0YWlsU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcm9sZXNldGdyb3VwaW5nX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcm9sZXNldGdyb3VwaW5nX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcm9sZXNldGdyb3VwaW5nX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY3VzdG9tY2F0ZWdvcnlfZGV0YWlsU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY3VzdG9tY2F0ZWdvcnlfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjdXN0b21jYXRlZ29yeV92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGN1c3RvbWNhdGVnb3J5X3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY3VzdG9tY2F0ZWdvcnlfSWNvblNlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbmNlcHRfaWNvblNlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNoZWNrbGlzdF9pY29uU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdG9vbG1lbnRvcl9pY29uU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgd2hpdGVwYXBlcl9pY29uU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXN0aW1hdGlvbmNvbnNpZGVyYXRpb25faWNvblNlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRlcm1kZWZpbml0aW9uX2ljb25TZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0ZW1wbGF0ZV9pY29uU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmV1c2FibGVhc3NldF9pY29uU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVwb3J0X2ljb25TZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwcmFjdGljZV9pY29uU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXhhbXBsZV9pY29uU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ3VpZGVsaW5lX2ljb25TZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByb2FkbWFwX2ljb25TZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzdXBwb3J0aW5nbWF0ZXJpYWxfaWNvblNlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGFjdGl2aXR5X3ZhcmlhYmlsaXR5X2Vycm9yX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdmFyaWFiaWxpdHlfZXJyb3JfdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjaXJjdWxhcl9kZXBlbmRlbmN5X2Vycm9yX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgYXBwbHlfcGF0dGVybl9lcnJvcl9tc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhcHBseV9wYXR0ZXJuX2Vycm9yX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZWRpdG9yX3RpdGxlX2NvbG9uX3dpdGhfc3BhY2VzOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHVibGlzaF9jYXRlZ29yaWVzX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkZWZhdWx0X2xpc3RfbGVuZ3RoX2xhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXh0ZW5kX3NlbWFudGljc19idXR0b25fdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGV4dGVuZF9zZW1hbnRpY3NfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NFZGl0b3JfQWN0aW9uX1ByZWZlcmVuY2VzOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc0VkaXRvcl9BY3Rpb25fU3VwcHJlc3NfVGFzazsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NFZGl0b3JfQWN0aW9uX1JldmVhbF9UYXNrOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgTGF5b3V0QWN0aW9uR3JvdXBfbGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBMYXlvdXRBY3Rpb25Hcm91cF9mbGF0TGF5b3V0QWN0aW9uX2xhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgTGF5b3V0QWN0aW9uR3JvdXBfaGllcmFyY2hpY2FsTGF5b3V0QWN0aW9uX2xhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHJlZmVyZW5jZV9Xb3JrQnJlYWtkb3duRWxlbWVudHM7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwcmVmZXJlbmNlX0Rlc2NyaXB0b3JFbGVtZW50czsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHByZWZlcmVuY2VfYnJlYWtEb3duRWxlbWVudF9EZXNjcmlwdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHByZWZlcmVuY2VfQWN0aXZpdHlfRGlhZ3JhbTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHByZWZlcmVuY2VfQWN0aXZpdHlfRGV0YWlsX0RpYWdyYW07Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHJlZmVyZW5jZV9EZXNjcmlwdG9yczsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwcmVmZXJlbmNlX2luY2x1ZGVEZXNjcmlwdG9yQnV0dG9uX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb25maWd1cmF0aW9uUGFnZV9RdWlja2ZpeEVycm9yX3JlYXNvbjE7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb25maWd1cmF0aW9uUGFnZV9xdWlja2ZpeEVycm9yX3RpdGxlOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRlZmF1bHRMaW5rVHlwZVByZWZMYWJlbDsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBmb3Jtc19HdWlkYW5jZVdpdGhVcmxBdHRhY2htZW50c0Rlc2NyaXB0aW9uUGFnZV9hbHJlYWR5QXR0YWNoZWRfbXNnOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEF0dGFjaG1lbnREaWFsb2dhdHRhY2hVcmxfdGV4dDsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBWYWxpZGF0ZV9tZXRob2RfbGlicmFyeTsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyByb2xlQ2F0ZWdvcmllc1BhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRhc2tDYXRlZ29yaWVzUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdvcmtQcm9kdWN0Q2F0ZWdvcmllc1BhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbjsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwbHVnaW5fZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwbHVnaW5fdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgd29ya3Byb2R1Y3REZXNjcmlwdGlvblBhZ2Vfc2xvdF90ZXh0OwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNsb3RTZWN0aW9uX25hbWU7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2xvdFNlY3Rpb25fZGVzYzsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzbG90c0xhYmVsX3RleHQ7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgYXJ0aWZhY3Rfc2xvdFNlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRlbGl2ZXJhYmxlX3Nsb3RTZWN0aW9uX2Rlc2M7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgb3V0Y29tZV9zbG90U2VjdGlvbl9kZXNjOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNsb3RDb25maXJtRGlhbG9nX3RpdGxlOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdwRnVsRmlsbHNDb25maXJtRGlhbG9nX21lc3NhZ2U7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgd3BTbG90RnVsRmlsbHNDb25maXJtRGlhbG9nX21lc3NhZ2U7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29uZmlnUHJvYmxlbVZpZXdPcHRpb25zVGV4dDsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBoaWRlRXJyb3NUZXh0OwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGhpZGVXYXJuaW5nc1RleHQ7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgaGlkZUluZm9zVGV4dDsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhZGRfVGFza3NwZXJSb3c7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgaW52YWxpZFRhc2twZXJSb3dfbXNnOwotCi0Jc3RhdGljIHsKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgQXV0aG9yaW5nVUlSZXNvdXJjZXMuY2xhc3MpOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvQXV0aG9yaW5nVUlTZXJ2aWNlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL0F1dGhvcmluZ1VJU2VydmljZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NDcwNTA5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvQXV0aG9yaW5nVUlTZXJ2aWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLnV0aWwuRGlhZ3JhbUVkaXRvclV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLkVkaXRvckNob29zZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm92aWRlcnMuRGVzY3JpcHRpb25QYWdlQ29sdW1uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS5QcmVmZXJlbmNlU3RvcmVXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLnV0aWwuR3JhcGhpY2FsRGF0YU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuSUxpYnJhcnlTZXJ2aWNlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb25BcHBsaWNhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uUHJvY2Vzc0F1dGhvcmluZ0NvbmZpZ3VyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLlByb2Nlc3NDb25maWd1cmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JQ29tbWFuZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklDb25maWd1cmF0b3JGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuUHJvdmlkZXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLk1ldGhvZEVsZW1lbnRBZGRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Db25maWd1cmFibGVDb21wb3NlZEFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLkxpYnJhcnlVSVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkucHJlZmVyZW5jZXMuTGlicmFyeVVJUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5Db3B5QXR0YWNobWVudHNUb05ld0xvY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5yZWZyZXNoLlJlZnJlc2hKb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLQotLyoqCi0gKiBUaGUgQXV0aG9yaW5nIFVJIHNlcnZpY2UuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEF1dGhvcmluZ1VJU2VydmljZSB7Ci0KLQkvLyBUaGUgc2hhcmVkIGluc3RhbmNlLgotCXByaXZhdGUgc3RhdGljIEF1dGhvcmluZ1VJU2VydmljZSBpbnN0YW5jZSA9IG5ldyBBdXRob3JpbmdVSVNlcnZpY2UoKTsKLQotCS8vIFRoZSBzdGF0dXMgZmxhZy4KLQlwcml2YXRlIGJvb2xlYW4gc3RhcnRlZCA9IGZhbHNlOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwcml2YXRlIEF1dGhvcmluZ1VJU2VydmljZSgpIHsKLQkJTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5hZGRMaXN0ZW5lcihuZXcgSUxpYnJhcnlTZXJ2aWNlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBsaWJyYXJ5Q3JlYXRlZChNZXRob2RMaWJyYXJ5IGxpYnJhcnkpIHsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgbGlicmFyeU9wZW5lZChNZXRob2RMaWJyYXJ5IGxpYnJhcnkpIHsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgbGlicmFyeVJlb3BlbmVkKE1ldGhvZExpYnJhcnkgbGlicmFyeSkgewotCQkJfQotCQkJCi0JCQlwdWJsaWMgdm9pZCBsaWJyYXJ5Q2xvc2VkKE1ldGhvZExpYnJhcnkgbGlicmFyeSkgewotCQkJfQkJCQotCi0JCQlwdWJsaWMgdm9pZCBsaWJyYXJ5U2V0KE1ldGhvZExpYnJhcnkgbGlicmFyeSkgewotCQkJCWlmIChsaWJyYXJ5ICE9IG51bGwpIHsKLQkJCQkJc3RhcnQoKTsKLQkJCQl9Ci0JCQkJTGlicmFyeVVJVXRpbC51cGRhdGVTaGVsbFRpdGxlKCk7Ci0JCQl9Ci0JCQkKLQkJCXB1YmxpYyB2b2lkIGNvbmZpZ3VyYXRpb25TZXQoTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLQkJCX0JCQkKLQkJfSk7CQkKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaGFyZWQgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBBdXRob3JpbmdVSVNlcnZpY2UgZ2V0SW5zdGFuY2UoKSB7Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci0KLQkvKioKLQkgKiBTdGFydHMgdGhlIEF1dGhvcmluZyBVSSBzZXJ2aWNlLgotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzdGFydCgpIHsKLQkJaWYgKCFzdGFydGVkKSB7CQotCQkJTGlicmFyeVVJUHJlZmVyZW5jZXMuYXBwbHlEZWZhdWx0VmFsdWVzRm9yQnJlYWtkb3duRWxlbWVudEF0dHJpYnV0ZXMoKTsKLQotCQkJLy8gSW5pdGlhbGl6ZSBQcm9jZXNzQXV0aG9yaW5nQ29uZmlndXJhdG9yCi0JCQlQcm9jZXNzQXV0aG9yaW5nQ29uZmlndXJhdG9yLklOU1RBTkNFLmdldENsYXNzKCk7Ci0JCQkKLQkJCS8vIFNldCBjb25maWd1cmF0b3IgZm9yIFdCUyBhZGFwdGVyIGZhY3RvcnkgaWYgaXQncyBub3Qgc2V0IHlldAotCQkJaWYoVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UuZ2V0V0JTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSBpbnN0YW5jZW9mIENvbmZpZ3VyYWJsZUNvbXBvc2VkQWRhcHRlckZhY3RvcnkpIHsKLQkJCQlDb25maWd1cmFibGVDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5ID0gKENvbmZpZ3VyYWJsZUNvbXBvc2VkQWRhcHRlckZhY3RvcnkpIFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFLmdldFdCU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCk7Ci0JCQkJaWYoYWRhcHRlckZhY3RvcnkuZ2V0RmlsdGVyKCkgPT0gbnVsbCkgewotCQkJCQlhZGFwdGVyRmFjdG9yeS5zZXRGaWx0ZXIoUHJvY2Vzc0F1dGhvcmluZ0NvbmZpZ3VyYXRvci5JTlNUQU5DRSk7Ci0JCQkJfQotCQkJfQotCi0JCQkvLyBJbml0aWFsaXplIHRoZSBtb3ZlL3Bhc3RlIGNvbW1hbmQuCi0JCQlNZXRob2RFbGVtZW50QWRkQ29tbWFuZAotCQkJCQkuc2V0UmVzb3VyY2VNYW5hZ2VyKG5ldyBDb3B5QXR0YWNobWVudHNUb05ld0xvY2F0aW9uKCkpOwotCi0JCQkvLyBJbml0aWFsaXplIHRoZSBFZGl0b3JDaG9vc2VyLgotCQkJRWRpdG9yQ2hvb3Nlci5nZXRJbnN0YW5jZSgpOwotCi0JCQkvLyBMb2FkIEVkaXRvclBhZ2UgUHJvdmlkZXJzCi0JCQlEZXNjcmlwdGlvblBhZ2VDb2x1bW5Qcm92aWRlci5nZXRJbnN0YW5jZSgpLmxvYWRQcm92aWRlcnMoKTsKLQotCQkJLy8gU2V0IHByb3ZpZGVycyBmb3IgbGlicmFyeSBlZGl0LgotCQkJUHJvdmlkZXJzLnNldENvbmZpZ3VyYXRvckZhY3RvcnkobmV3IElDb25maWd1cmF0b3JGYWN0b3J5KCkgewotCQkJCXB1YmxpYyBJQ29uZmlndXJhdG9yIGNyZWF0ZUNvbmZpZ3VyYXRvcigKLQkJCQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0JCQkJCXJldHVybiBuZXcgUHJvY2Vzc0NvbmZpZ3VyYXRvcihjb25maWcsIHRydWUpOwotCQkJCX0KLQkJCX0pOwotCi0JCQlQcm92aWRlcnMKLQkJCQkJLnNldENvbmZpZ3VyYXRpb25BcHBsaWNhdG9yKG5ldyBDb25maWd1cmF0aW9uQXBwbGljYXRvcigpKTsKLQotCQkJUHJvdmlkZXJzLnNldFByZWZlcmVuY2VTdG9yZShMaWJyYXJ5UGx1Z2luLmdldERlZmF1bHQoKQotCQkJCQkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkpOwotCi0JCQlQcmVmZXJlbmNlU3RvcmVXcmFwcGVyIHN0b3JlID0gbmV3IFByZWZlcmVuY2VTdG9yZVdyYXBwZXIoQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpKTsKLQkJCVByb3ZpZGVycy5zZXRBdXRob3JpbmdQbHVnaW5QcmVmZXJlbmNlU3RvcmUoc3RvcmUpOwotCi0JCQlMaXN0PElDb21tYW5kTGlzdGVuZXI+IGNtZExpc3RlbmVycyA9IEdyYXBoaWNhbERhdGFNYW5hZ2VyLmdldEluc3RhbmNlKCkKLQkJCQkJLmdldENvbW1hbmRMaXN0ZW5lcnMoKTsKLQkJCWNtZExpc3RlbmVycy5hZGRBbGwoRGlhZ3JhbUVkaXRvclV0aWwuZ2V0SW5zdGFuY2UoKQotCQkJCQkuZ2V0VmFyeUNvbW1hbmRMaXN0ZW5lcnMoKSk7Ci0JCQlmb3IgKEl0ZXJhdG9yPElDb21tYW5kTGlzdGVuZXI+IGl0ZXIgPSBjbWRMaXN0ZW5lcnMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJSUNvbW1hbmRMaXN0ZW5lciBsaXN0ZW5lciA9IGl0ZXIubmV4dCgpOwotCQkJCVByb3ZpZGVycy5yZWdpc3RlckNvbW1hbmRMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCQl9Ci0KLQkJCVJlZnJlc2hKb2IuZ2V0SW5zdGFuY2UoKS5zdGFydCgpOwotCQkJCi0JCQlzdGFydGVkID0gdHJ1ZTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFN0b3BzIHRoZSBBdXRob3JpbmcgVUkgc2VydmljZS4KLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc3RvcCgpIHsKLQkJaWYgKHN0YXJ0ZWQpIHsKLQkJCVJlZnJlc2hKb2IuZ2V0SW5zdGFuY2UoKS5zdG9wKCk7CQkJCi0JCQlzdGFydGVkID0gZmFsc2U7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvQXV0aG9yaW5nVUlUZXh0LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL0F1dGhvcmluZ1VJVGV4dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyODJjNGNjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvQXV0aG9yaW5nVUlUZXh0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZ1dpdGhUb2dnbGU7Ci0KLS8qKgotICogRGVmaW5lcyBhbmQgY2FjaGVzIHRoZSBjb21tb25seSByZWZlcmVuY2VkIHRleHQgaW4gdGhlIEF1dGhvcmluZyBVSS4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBBdXRob3JpbmdVSVRleHQgewotCi0JLyoqCi0JICogRWRpdG9yIGZvcm0gcGFnZSB0aXRsZXMuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVNTSUdOX1BBR0VfVElUTEUgPSBBdXRob3JpbmdVSVJlc291cmNlcy5hc3NpZ25QYWdlX3RpdGxlOyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENBVEVHT1JJRVNfUEFHRV9USVRMRSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmNhdGVnb3JpZXNQYWdlX3RpdGxlOyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFTElWRVJBQkxFX1BBUlRTX1BBR0VfVElUTEUgPSBBdXRob3JpbmdVSVJlc291cmNlcy5kZWxpdmVyYWJsZVBhcnRzUGFnZV90aXRsZTsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERVNDUklQVElPTl9QQUdFX1RJVExFID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZGVzY3JpcHRpb25QYWdlX3RpdGxlOyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERJU0NJUExJTkVTX1BBR0VfVElUTEUgPSBBdXRob3JpbmdVSVJlc291cmNlcy5kaXNjaXBsaW5lc1BhZ2VfdGl0bGU7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgR1VJREFOQ0VfUEFHRV9USVRMRSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmd1aWRhbmNlUGFnZV90aXRsZTsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVWSUVXX1BBR0VfVElUTEUgPSBBdXRob3JpbmdVSVJlc291cmNlcy5wcmV2aWV3UGFnZV90aXRsZTsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRUZFUkVOQ0VTX1BBR0VfVElUTEUgPSBBdXRob3JpbmdVSVJlc291cmNlcy5yZWZlcmVuY2VzUGFnZV90aXRsZTsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRUZFUkVOQ0VfV09SS0ZMT1dfUEFHRV9USVRMRSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLnJlZmVyZW5jZVdvcmtmbG93UGFnZV90aXRsZTsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBST0xFU19QQUdFX1RJVExFID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMucm9sZXNQYWdlX3RpdGxlOyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJPTEVfU0VUU19QQUdFX1RJVExFID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMucm9sZVNldHNQYWdlX3RpdGxlOyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNURVBTX1BBR0VfVElUTEUgPSBBdXRob3JpbmdVSVJlc291cmNlcy5zdGVwc1BhZ2VfdGl0bGU7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFTS1NfUEFHRV9USVRMRSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLnRhc2tzUGFnZV90aXRsZTsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUT09MX01FTlRPUlNfUEFHRV9USVRMRSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLnRvb2xNZW50b3JzUGFnZV90aXRsZTsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXT1JLX1BST0RVQ1RTX1BBR0VfVElUTEUgPSBBdXRob3JpbmdVSVJlc291cmNlcy53b3JrUHJvZHVjdHNQYWdlX3RpdGxlOyAKLQotCS8qKgotCSAqIEVkaXRvciBzZWN0aW9uIG5hbWVzIGFuZCBkZXNjcmlwdGlvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDSEVDS19JVEVNU19TRUNUSU9OX05BTUUgPSBBdXRob3JpbmdVSVJlc291cmNlcy5jaGVja0l0ZW1zU2VjdGlvbl9uYW1lOyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENIRUNLX0lURU1TX1NFQ1RJT05fREVTQyA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmNoZWNrSXRlbXNTZWN0aW9uX2Rlc2M7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVQRU5ERU5DSUVTX1NFQ1RJT05fTkFNRSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmRlcGVuZGVuY2llc1NlY3Rpb25fbmFtZTsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERVBFTkRFTkNJRVNfU0VDVElPTl9ERVNDID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZGVwZW5kZW5jaWVzU2VjdGlvbl9kZXNjOyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFVEFJTF9TRUNUSU9OX05BTUUgPSBBdXRob3JpbmdVSVJlc291cmNlcy5kZXRhaWxTZWN0aW9uX25hbWU7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVUQUlMX1NFQ1RJT05fREVTQyA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmRldGFpbFNlY3Rpb25fZGVzYzsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHRU5FUkFMX0lORk9fU0VDVElPTl9OQU1FID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZ2VuZXJhbEluZm9TZWN0aW9uX25hbWU7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgR0VORVJBTF9JTkZPX1NFQ1RJT05fREVTQyA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmdlbmVyYWxJbmZvU2VjdGlvbl9kZXNjOyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElDT05fU0VDVElPTl9OQU1FID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuaWNvblNlY3Rpb25fbmFtZTsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJQ09OX1NFQ1RJT05fREVTQyA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmljb25TZWN0aW9uX2Rlc2M7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9UQVRJT05fU0VDVElPTl9OQU1FID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMubm90YXRpb25TZWN0aW9uX25hbWU7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9UQVRJT05fU0VDVElPTl9ERVNDID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMubm90YXRpb25TZWN0aW9uX2Rlc2M7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVGRVJFTkNFRF9QTFVHSU5TX1NFQ1RJT05fTkFNRSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLnJlZmVyZW5jZWRQbHVnaW5zU2VjdGlvbl9uYW1lOyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFRkVSRU5DRURfUExVR0lOU19TRUNUSU9OX0RFU0MgPSBBdXRob3JpbmdVSVJlc291cmNlcy5yZWZlcmVuY2VkUGx1Z2luc1NlY3Rpb25fZGVzYzsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVEFGRklOR19TRUNUSU9OX05BTUUgPSBBdXRob3JpbmdVSVJlc291cmNlcy5zdGFmZmluZ1NlY3Rpb25fbmFtZTsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVEFGRklOR19TRUNUSU9OX0RFU0MgPSBBdXRob3JpbmdVSVJlc291cmNlcy5zdGFmZmluZ1NlY3Rpb25fZGVzYzsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVEVQU19TRUNUSU9OX05BTUUgPSBBdXRob3JpbmdVSVJlc291cmNlcy5zdGVwc1NlY3Rpb25fbmFtZTsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVEVQU19TRUNUSU9OX0RFU0MgPSBBdXRob3JpbmdVSVJlc291cmNlcy5zdGVwc1NlY3Rpb25fZGVzYzsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUlMT1JJTkdfU0VDVElPTl9OQU1FID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMudGFpbG9yaW5nU2VjdGlvbl9uYW1lOyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBSUxPUklOR19TRUNUSU9OX0RFU0MgPSBBdXRob3JpbmdVSVJlc291cmNlcy50YWlsb3JpbmdTZWN0aW9uX2Rlc2M7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFSSUFCSUxJVFlfU0VDVElPTl9OQU1FID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMudmFyaWFiaWxpdHlTZWN0aW9uX25hbWU7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFSSUFCSUxJVFlfU0VDVElPTl9ERVNDID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMudmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkVSU0lPTl9JTkZPX1NFQ1RJT05fTkFNRSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLnZlcnNpb25JbmZvU2VjdGlvbl9uYW1lOyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZFUlNJT05fSU5GT19TRUNUSU9OX0RFU0MgPSBBdXRob3JpbmdVSVJlc291cmNlcy52ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYzsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTTE9UX1NFQ1RJT05fTkFNRSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLnNsb3RTZWN0aW9uX25hbWU7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTTE9UX1NFQ1RJT05fREVTQyA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLnNsb3RTZWN0aW9uX2Rlc2M7Ci0JLyoqCi0JICogVUkgYW5kIGVsZW1lbnQgYXR0cmlidXRlIGxhYmVscy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBRERJVElPTkFMX0lORk9fVEVYVCA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmFkZGl0aW9uYWxJbmZvX3RleHQ7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVBQTElDQVRJT05fVEVYVCA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmFwcGxpY2F0aW9uX3RleHQ7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUxURVJOQVRJVkVTX1RFWFQgPSBBdXRob3JpbmdVSVJlc291cmNlcy5hbHRlcm5hdGl2ZXNfdGV4dDsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBU1NJR05NRU5UX0FQUFJPQUNIRVNfVEVYVCA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmFzc2lnbm1lbnRBcHByb2FjaGVzX3RleHQ7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVVUSE9SU19URVhUID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuYXV0aG9yc190ZXh0OyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJBQ0tHUk9VTkRfVEVYVCA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmJhY2tncm91bmRfdGV4dDsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCQVNFX0VMRU1FTlRfVEVYVCA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmJhc2VFbGVtZW50X3RleHQ7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkFTRV9HVUlEQU5DRV9URVhUID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuYmFzZUd1aWRhbmNlX3RleHQ7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlJJRUZfREVTQ1JJUFRJT05fVEVYVCA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmJyaWVmRGVzY3JpcHRpb25fdGV4dDsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCUklFRl9PVVRMSU5FX1RFWFQgPSBBdXRob3JpbmdVSVJlc291cmNlcy5icmllZk91dGxpbmVfdGV4dDsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDSEFOR0VfREFURV9URVhUID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuY2hhbmdlRGF0ZV90ZXh0OyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENIQU5HRV9ERVNDUklQVElPTl9URVhUID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuY2hhbmdlRGVzY3JpcHRpb25fdGV4dDsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDSEVDS19JVEVNU19URVhUID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuY2hlY2tJdGVtc190ZXh0OyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlRSSUJVVEVTX1RFWFQgPSBBdXRob3JpbmdVSVJlc291cmNlcy5jb250cmlidXRlc190ZXh0OyAKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMT0NBTF9DT05UUklCVVRFU19URVhUID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMubG9jYWxDb250cmlidXRlc190ZXh0OyAgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT1BZUklHSFRfVEVYVCA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmNvcHlyaWdodF90ZXh0OyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFU0NSSVBUSU9OX1RFWFQgPSBBdXRob3JpbmdVSVJlc291cmNlcy5kZXNjcmlwdGlvbl90ZXh0OyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVESVRPUl9URVhUID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZWRpdG9yX3RleHQ7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhURU5EU19URVhUID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZXh0ZW5kc190ZXh0OyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVEVSTkFMX0RFU0NSSVBUSU9OX1RFWFQgPSBBdXRob3JpbmdVSVJlc291cmNlcy5leHRlcm5hbERlc2NyaXB0aW9uX3RleHQ7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhURVJOQUxfSURfVEVYVCA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmV4dGVybmFsSWRfdGV4dDsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHT0FMU19URVhUID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZ29hbHNfdGV4dDsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTVBBQ1RfT0ZfTk9UX0hBVklOR19URVhUID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuaW1wYWN0T2ZOb3RIYXZpbmdfdGV4dDsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfQ09OU0lERVJBVElPTlNfVEVYVCA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmtleUNvbnNpZGVyYXRpb25zX3RleHQ7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEVWRUxfT0ZfQURPUFRJT05fVEVYVCA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmxldmVsc09mQWRvcHRpb25fdGV4dDsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNQUlOX0RFU0NSSVBUSU9OX1RFWFQgPSBBdXRob3JpbmdVSVJlc291cmNlcy5tYWluRGVzY3JpcHRpb25fdGV4dDsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX1RFWFQgPSBBdXRob3JpbmdVSVJlc291cmNlcy5uYW1lX3RleHQ7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVXX0VMRU1FTlRfVEVYVCA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLm5ld0VsZW1lbnRfdGV4dDsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOT1RfQVBQTElDQUJMRV9URVhUID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMubm90QXBwbGljYWJsZV90ZXh0OyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5PVEFUSU9OX1RFWFQgPSBBdXRob3JpbmdVSVJlc291cmNlcy5ub3RhdGlvbl90ZXh0OyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBQ0tBR0lOR19HVUlEQU5DRV9URVhUID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMucGFja2FnaW5nR3VpZGFuY2VfdGV4dDsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVTRU5UQVRJT05fTkFNRV9URVhUID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMucHJlc2VudGF0aW9uTmFtZV90ZXh0OyAKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMT05HX1BSRVNFTlRBVElPTl9OQU1FX1RFWFQgPSBBdXRob3JpbmdVSVJlc291cmNlcy5sb25nX3ByZXNlbnRhdGlvbk5hbWVfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0JMRU1fVEVYVCA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLnByb2JsZW1fdGV4dDsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQVVJQT1NFX1RFWFQgPSBBdXRob3JpbmdVSVJlc291cmNlcy5wdXJwb3NlX3RleHQ7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVBU09OX0ZPUl9OT1RfTkVFRElOR19URVhUID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMucmVhc29uRm9yTm90TmVlZGluZ190ZXh0OyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFUExBQ0VTX1RFWFQgPSBBdXRob3JpbmdVSVJlc291cmNlcy5yZXBsYWNlc190ZXh0OyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFUFJFU0VOVEFUSU9OX1RFWFQgPSBBdXRob3JpbmdVSVJlc291cmNlcy5yZXByZXNlbnRhdGlvbl90ZXh0OyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFUFJFU0VOVEFUSU9OX09QVElPTlNfVEVYVCA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLnJlcHJlc2VudGF0aW9uT3B0aW9uc190ZXh0OyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNLSUxMU19URVhUID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuc2tpbGxzX3RleHQ7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RFUFNfVEVYVCA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLnN0ZXBzX3RleHQ7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RFUF9OQU1FX1RFWFQgPSBBdXRob3JpbmdVSVJlc291cmNlcy5zdGVwc19uYW1lX3RleHQ7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1lOT05ZTVNfVEVYVCA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLnN5bm9ueW1zX3RleHQ7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUQUNIRURfRklMRV9URVhUID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuYXR0YWNoZWRGaWxlX3RleHQ7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQRV9URVhUID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMudHlwZV90ZXh0OyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVOSVFVRV9JRF9URVhUID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMudW5pcXVlSWRfdGV4dDsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWQVJJQUJJTElUWV9UWVBFX1RFWFQgPSBBdXRob3JpbmdVSVJlc291cmNlcy52YXJpYWJpbGl0eVR5cGVfdGV4dDsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWRVJTSU9OX1RFWFQgPSBBdXRob3JpbmdVSVJlc291cmNlcy52ZXJzaW9uX3RleHQ7IAotCi0JLyoqCi0JICogQnV0dG9uIGxhYmVscy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBRERfQlVUVE9OX1RFWFQgPSBBdXRob3JpbmdVSVJlc291cmNlcy5hZGRCdXR0b25fdGV4dDsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRBQ0hfQlVUVE9OX1RFWFQgPSBBdXRob3JpbmdVSVJlc291cmNlcy5hdHRhY2hCdXR0b25fdGV4dDsgCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUQUNIX1VSTF9CVVRUT05fVEVYVCA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmF0dGFjaFVybEJ1dHRvbl90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlJPV1NFX0JVVFRPTl9URVhUID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuYnJvd3NlQnV0dG9uX3RleHQ7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hBTkdFX1RZUEVfQlVUVE9OX1RFWFQgPSBBdXRob3JpbmdVSVJlc291cmNlcy5jaGFuZ2VUeXBlQnV0dG9uX3RleHQ7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xFQVJfQlVUVE9OX1RFWFQgPSBBdXRob3JpbmdVSVJlc291cmNlcy5jbGVhckJ1dHRvbl90ZXh0OyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFTEVURV9CVVRUT05fVEVYVCA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmRlbGV0ZUJ1dHRvbl90ZXh0OyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFU0VMRUNUX0JVVFRPTl9URVhUID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZGVzZWxlY3RCdXR0b25fdGV4dDsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERVRBQ0hfQlVUVE9OX1RFWFQgPSBBdXRob3JpbmdVSVJlc291cmNlcy5kZXRhY2hCdXR0b25fdGV4dDsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBET1dOX0JVVFRPTl9URVhUID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZG93bkJ1dHRvbl90ZXh0OyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9SREVSX0JVVFRPTl9URVhUID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMub3JkZXJCdXR0b25fdGV4dDsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFRElUX0JVVFRPTl9URVhUID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZWRpdEJ1dHRvbl90ZXh0OyAKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRU1PVkVfQlVUVE9OX1RFWFQgPSBBdXRob3JpbmdVSVJlc291cmNlcy5yZW1vdmVCdXR0b25fdGV4dDsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRUxFQ1RfQlVUVE9OX1RFWFQgPSBBdXRob3JpbmdVSVJlc291cmNlcy5zZWxlY3RCdXR0b25fdGV4dDsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVUF9CVVRUT05fVEVYVCA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLnVwQnV0dG9uX3RleHQ7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVklFV19ISVNUT1JZX0JVVFRPTl9URVhUID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMudmlld0hpc3RvcnlCdXR0b25fdGV4dDsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBTFdBWVNfQlVUVE9OX1RFWFQgPSBNZXNzYWdlRGlhbG9nV2l0aFRvZ2dsZS5BTFdBWVM7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBORVZFUl9CVVRUT05fVEVYVCA9IE1lc3NhZ2VEaWFsb2dXaXRoVG9nZ2xlLk5FVkVSOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPTVBUX0JVVFRPTl9URVhUID0gTWVzc2FnZURpYWxvZ1dpdGhUb2dnbGUuUFJPTVBUOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFVCTElTSF9DQVRFR09SSUVTX1RFWFQgPSBBdXRob3JpbmdVSVJlc291cmNlcy5wdWJsaXNoX2NhdGVnb3JpZXNfdGV4dDsKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvQnJvd3NpbmdQZXJzcGVjdGl2ZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9Ccm93c2luZ1BlcnNwZWN0aXZlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4M2FhMzEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9Ccm93c2luZ1BlcnNwZWN0aXZlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS52aWV3cy5Db25maWd1cmF0aW9uVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnZpZXdzLkNvbnRlbnRWaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklQYWdlTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklQZXJzcGVjdGl2ZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotCi0vKioKLSAqIFRoZSBNZXRob2QgQnJvd3NpbmcgcGVyc3BlY3RpdmUuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQnJvd3NpbmdQZXJzcGVjdGl2ZSBpbXBsZW1lbnRzIElQZXJzcGVjdGl2ZUZhY3RvcnkgewotCi0JLyoqCi0JICogVGhlIHBlcnNwZWN0aXZlIElELgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBFUlNQRUNUSVZFX0lEID0gQnJvd3NpbmdQZXJzcGVjdGl2ZS5jbGFzcwotCQkJLmdldE5hbWUoKTsKLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVBlcnNwZWN0aXZlRmFjdG9yeSNjcmVhdGVJbml0aWFsTGF5b3V0KElQYWdlTGF5b3V0KQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUluaXRpYWxMYXlvdXQoSVBhZ2VMYXlvdXQgbGF5b3V0KSB7Ci0JCWxheW91dC5zZXRFZGl0b3JBcmVhVmlzaWJsZShmYWxzZSk7Ci0JCVN0cmluZyBlZGl0b3JBcmVhID0gbGF5b3V0LmdldEVkaXRvckFyZWEoKTsKLQkJbGF5b3V0LmFkZFZpZXcoQ29uZmlndXJhdGlvblZpZXcuVklFV19JRCwgSVBhZ2VMYXlvdXQuTEVGVCwgMC4zMGYsCi0JCQkJZWRpdG9yQXJlYSk7Ci0JCVBlcnNwZWN0aXZlTGlzdFV0aWwuYWRkUGVyc3BlY3RpdmVTaG9ydExpc3QobGF5b3V0KTsKLQkJbGF5b3V0LmFkZFZpZXcoQ29udGVudFZpZXcuVklFV19JRCwgSVBhZ2VMYXlvdXQuUklHSFQsIDAuNzBmLCBlZGl0b3JBcmVhKTsKLQl9Ci0KLQkvKioKLQkgKiBPcGVucyB0aGlzIHBlcnNwZWN0aXZlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBvcGVuKCkgewotCQl0cnkgewotCQkJSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpCi0JCQkJCS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKLQkJCWlmICh3aW5kb3cgPT0gbnVsbCkgewotCQkJCUlXb3JrYmVuY2hXaW5kb3dbXSB3aW5kb3dzID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKQotCQkJCQkJLmdldFdvcmtiZW5jaFdpbmRvd3MoKTsKLQkJCQlpZiAod2luZG93cyAhPSBudWxsICYmIHdpbmRvd3MubGVuZ3RoID4gMCkgewotCQkJCQl3aW5kb3cgPSB3aW5kb3dzWzBdOwotCQkJCX0KLQkJCX0KLQotCQkJaWYgKHdpbmRvdyAhPSBudWxsKSB7Ci0JCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5zaG93UGVyc3BlY3RpdmUoUEVSU1BFQ1RJVkVfSUQsCi0JCQkJCQl3aW5kb3cpOwotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKAotCQkJCQkiRmFpbGVkIHRvIG9wZW4gYnJvd3NpbmcgcGVyc3BlY3RpdmUiLCBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL1BlcnNwZWN0aXZlTGlzdFV0aWwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvUGVyc3BlY3RpdmVMaXN0VXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Zjg4MGJlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvUGVyc3BlY3RpdmVMaXN0VXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udWkudXRpbC5QZXJzcGVjdGl2ZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVBhZ2VMYXlvdXQ7Ci0KLS8qKgotICogSGVscGVyIGNsYXNzIGZvciB0aGUgQXV0aG9yaW5nIGFuZCBCcm93c2luZyBwZXJzcGVjdGl2ZXMuCi0gKiAKLSAqIEBhdXRob3IgQmluZ3h1ZSBYdQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUGVyc3BlY3RpdmVMaXN0VXRpbCB7Ci0KLQkvKioKLQkgKiBBZGQgdGhlIEJyb3dzaW5nIGFuZCBBdXRob3JpbmcgcGVyc3BlY3RpdmUgc2hvcnRjdXRzIHRvIHRoZSBnaXZlbiBwYWdlCi0JICogbGF5b3V0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBhZGRQZXJzcGVjdGl2ZVNob3J0TGlzdChJUGFnZUxheW91dCBsYXlvdXQpIHsKLQkJbGF5b3V0LmFkZFBlcnNwZWN0aXZlU2hvcnRjdXQoQnJvd3NpbmdQZXJzcGVjdGl2ZS5QRVJTUEVDVElWRV9JRCk7Ci0JCWxheW91dC5hZGRQZXJzcGVjdGl2ZVNob3J0Y3V0KEF1dGhvcmluZ1BlcnNwZWN0aXZlLlBFUlNQRUNUSVZFX0lEKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBjdXJyZW50IHBlcnNwZWN0aXZlIGlzIHRoZSBBdXRob3JpbmcKLQkgKiBwZXJzcGVjdGl2ZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNBdXRob3JpbmdQZXJzcGVjdGl2ZSgpIHsKLQkJU3RyaW5nIGFjdGl2ZVBlcnNwZWN0aXZlSWQgPSBQZXJzcGVjdGl2ZVV0aWwuZ2V0QWN0aXZlUGVyc3BlY3RpdmVJZCgpOwotCQlpZiAoYWN0aXZlUGVyc3BlY3RpdmVJZCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gYWN0aXZlUGVyc3BlY3RpdmVJZAotCQkJCQkuZXF1YWxzSWdub3JlQ2FzZShBdXRob3JpbmdQZXJzcGVjdGl2ZS5QRVJTUEVDVElWRV9JRCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBjdXJyZW50IHBlcnNwZWN0aXZlIGlzIHRoZSBCcm93c2luZwotCSAqIHBlcnNwZWN0aXZlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0Jyb3dzaW5nUGVyc3BlY3RpdmUoKSB7Ci0JCVN0cmluZyBhY3RpdmVQZXJzcGVjdGl2ZUlkID0gUGVyc3BlY3RpdmVVdGlsLmdldEFjdGl2ZVBlcnNwZWN0aXZlSWQoKTsKLQkJaWYgKGFjdGl2ZVBlcnNwZWN0aXZlSWQgPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIGFjdGl2ZVBlcnNwZWN0aXZlSWQKLQkJCQkJLmVxdWFsc0lnbm9yZUNhc2UoQnJvd3NpbmdQZXJzcGVjdGl2ZS5QRVJTUEVDVElWRV9JRCk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvUmVzb3VyY2VzLnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL1Jlc291cmNlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZjJkMjU1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvUmVzb3VyY2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjk0ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgU1RBUlQgTk8gVFJBTlNMQVRJT04KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jICEhIERPIE5PVCBUUkFOU0xBVEUgVEhFIEZPTExPV0lORyBMSU5FICEhCi1DaGFuZ2VIaXN0b3J5RGlhbG9nX2RlbGltaXRlcj18Ci0KLSNCZWxvdyBwcm9wZXJ0eSAiZWRpdG9yX3RpdGxlX2NvbG9uX3dpdGhfc3BhY2VzIiBzaG91bGQgbm90IGJlIHRyYW5zbGF0ZWQKLSNEb24ndCBkZWxldGUgYSBzcGFjZSBhZnRlciAiOiAiCi0jICEhIERPIE5PVCBUUkFOU0xBVEUgVEhFIEZPTExPV0lORyBMSU5FICEhCi1lZGl0b3JfdGl0bGVfY29sb25fd2l0aF9zcGFjZXM9OiAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIEVORCBOTyBUUkFOU0xBVElPTgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyBGb3JtIFBhZ2UgVGl0bGVzCi1hc3NpZ25QYWdlX3RpdGxlPUFzc2lnbgotY2F0ZWdvcmllc1BhZ2VfdGl0bGU9Q2F0ZWdvcmllcwotZGVsaXZlcmFibGVQYXJ0c1BhZ2VfdGl0bGU9RGVsaXZlcmFibGUgUGFydHMKLWRlc2NyaXB0aW9uUGFnZV90aXRsZT1EZXNjcmlwdGlvbgotZGlzY2lwbGluZXNQYWdlX3RpdGxlPURpc2NpcGxpbmVzCi1kaXNjYXJkdW5yZXNvbHZlZHJlZj1EaXNjYXJkIHVucmVzb2x2ZWQgcmVmZXJlbmNlcwotZ3VpZGFuY2VQYWdlX3RpdGxlPUd1aWRhbmNlCi1wcmV2aWV3UGFnZV90aXRsZT1QcmV2aWV3Ci1yZWZlcmVuY2VzUGFnZV90aXRsZT1SZWZlcmVuY2VzCi1yZWZlcmVuY2VfdGV4dD1SZWZlcmVuY2VzOgotcmVmZXJlbmNlV29ya2Zsb3dQYWdlX3RpdGxlPVJlZmVyZW5jZSBXb3JrZmxvdwotcm9sZXNQYWdlX3RpdGxlPVJvbGVzCi1yb2xlU2V0c1BhZ2VfdGl0bGU9Um9sZSBTZXRzCi1zdGVwc1BhZ2VfdGl0bGU9U3RlcHMKLXRhc2tzUGFnZV90aXRsZT1UYXNrcwotdG9vbE1lbnRvcnNQYWdlX3RpdGxlPVRvb2wgTWVudG9ycwotd29ya1Byb2R1Y3RzUGFnZV90aXRsZT1Xb3JrIFByb2R1Y3RzCi0KLSMgU2VjdGlvbiBOYW1lcyAmIERlc2NyaXB0aW9uCi1jaGVja0l0ZW1zU2VjdGlvbl9uYW1lPUNoZWNrIEl0ZW1zCi1jaGVja0l0ZW1zU2VjdGlvbl9kZXNjPVNwZWNpZnkgdGhlIGNoZWNrIGl0ZW1zIHRoYXQgY29uc3RpdHV0ZSB0aGlzIGNoZWNrbGlzdC4KLWRlcGVuZGVuY2llc1NlY3Rpb25fbmFtZT1EZXBlbmRlbmNpZXMKLWRlcGVuZGVuY2llc1NlY3Rpb25fZGVzYz1UaGlzIHNlY3Rpb24gZGlzcGxheXMgZGVwZW5kZW5jaWVzIG9mIHRoaXMgY29udGVudCBwYWNrYWdlIHRvIG90aGVyIGNvbnRlbnQgcGFja2FnZXMuCi1kZXRhaWxTZWN0aW9uX25hbWU9RGV0YWlsIEluZm9ybWF0aW9uCi1kZXRhaWxTZWN0aW9uX2Rlc2M9UHJvdmlkZSBkZXRhaWxlZCBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIHswfS4KLWdlbmVyYWxJbmZvU2VjdGlvbl9uYW1lPUdlbmVyYWwgSW5mb3JtYXRpb24KLWdlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPVByb3ZpZGUgZ2VuZXJhbCBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIHswfS4KLWljb25TZWN0aW9uX25hbWU9SWNvbgotaWNvblNlY3Rpb25fZGVzYz1DdXN0b21pemUgdGhlIGljb25zIGZvciB0aGlzIHswfS4KLW5vdGF0aW9uU2VjdGlvbl9uYW1lPURlbGl2ZXJ5IEluZm9ybWF0aW9uCi1ub3RhdGlvblNlY3Rpb25fZGVzYz1Qcm92aWRlIGRlbGl2ZXJ5IGluZm9ybWF0aW9uIGFib3V0IHRoaXMgezB9LgotcmVmZXJlbmNlZFBsdWdpbnNTZWN0aW9uX25hbWU9UmVmZXJlbmNlZCBQbHVnLWluczoKLXJlZmVyZW5jZWRQbHVnaW5zU2VjdGlvbl9kZXNjPVRoaXMgc2VjdGlvbiBkaXNwbGF5cyBwbHVnLWlucyByZWZlcmVuY2VkIGJ5IHRoaXMgbWV0aG9kIHBsdWctaW4uCi1zdGFmZmluZ1NlY3Rpb25fbmFtZT1TdGFmZmluZyBJbmZvcm1hdGlvbgotc3RhZmZpbmdTZWN0aW9uX2Rlc2M9UHJvdmlkZSBzdGFmZmluZyBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIHJvbGUuCi1zdGVwc1NlY3Rpb25fbmFtZT1TdGVwcwotc3RlcHNTZWN0aW9uX2Rlc2M9U3BlY2lmeSB0aGUgc3RlcHMgdG8gcGVyZm9ybSB0aGlzIHRhc2suCi10YWlsb3JpbmdTZWN0aW9uX25hbWU9VGFpbG9yaW5nCi10YWlsb3JpbmdTZWN0aW9uX2Rlc2M9UHJvdmlkZSB0YWlsb3JpbmcgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyB7MH0uCi12YXJpYWJpbGl0eVNlY3Rpb25fbmFtZT1Db250ZW50IFZhcmlhYmlsaXR5Ci12YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1TcGVjaWZ5IGhvdyB0aGlzIHswfSByZWxhdGVzIHRvIGFub3RoZXIgezB9LgotdmVyc2lvbkluZm9TZWN0aW9uX25hbWU9VmVyc2lvbiBJbmZvcm1hdGlvbgotdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9UHJvdmlkZSB2ZXJzaW9uIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgezB9LgotCi0jIFVJICYgRWxlbWVudCBBdHRyaWJ1dGUgTGFiZWxzCi1hZGRpdGlvbmFsSW5mb190ZXh0PUFkZGl0aW9uYWwgaW5mb3JtYXRpb246Ci1hcHBsaWNhdGlvbl90ZXh0PUFwcGxpY2F0aW9uOgotcHJhY3RpY2VfYXBwbGljYXRpb25fdGV4dD1Ib3cgdG8gcmVhZCB0aGlzIHByYWN0aWNlOgotYWN0aW9uTGFiZWxfZWRpdD0mRWRpdAotYWN0aW9uTGFiZWxfZmluZEVsZW1lbnRJbkxpYk5hdj0mU2hvdyBpbiBMaWJyYXJ5IFZpZXcKLWFsdGVybmF0aXZlc190ZXh0PUFsdGVybmF0aXZlczoKLWFzc2lnbm1lbnRBcHByb2FjaGVzX3RleHQ9QXNzaWdubWVudCBhcHByb2FjaGVzOgotYXV0aG9yc190ZXh0PUF1dGhvcnM6Ci1iYWNrZ3JvdW5kX3RleHQ9QmFja2dyb3VuZDoKLWJhc2VFbGVtZW50X3RleHQ9QmFzZToKLWJhc2VHdWlkYW5jZV90ZXh0PUJhc2UgZ3VpZGFuY2U6Ci1icmllZkRlc2NyaXB0aW9uX3RleHQ9QnJpZWYgZGVzY3JpcHRpb246Ci1kZXNjcmlwdGlvbl90ZXh0PURlc2NyaXB0aW9uOgotYmFja3VwYmVmb3Jlc2F2ZV90ZXh0PUJhY2sgdXAgYmVmb3JlIHNhdmUKLWJyaWVmT3V0bGluZV90ZXh0PUJyaWVmIG91dGxpbmU6Ci1jaGFuZ2VEYXRlX3RleHQ9Q2hhbmdlIGRhdGU6Ci1jaGFuZ2VEZXNjcmlwdGlvbl90ZXh0PUNoYW5nZSBkZXNjcmlwdGlvbjoKLWNoZWNrSXRlbXNfdGV4dD1DaGVjayBJdGVtcwotY29udHJpYnV0ZXNfdGV4dD1Db250cmlidXRlcwotbG9jYWxDb250cmlidXRlc190ZXh0PUxvY2FsQ29udHJpYnV0ZXMKLWNvbnRyaWJ1dGVzX3RvX3RleHQ9Q29udHJpYnV0ZXMgdG8KLWNvcHlyaWdodF90ZXh0PUNvcHlyaWdodDoKLWVkaXRvcl90ZXh0PUVkaXRvcgotZXh0ZW5kc190ZXh0PUV4dGVuZHMKLWV4dGVuZF90ZXh0PUV4dGVuZAotZXh0ZXJuYWxEZXNjcmlwdGlvbl90ZXh0PUV4dGVybmFsIGRlc2NyaXB0aW9uOgotZXh0ZXJuYWxJZF90ZXh0PUV4dGVybmFsIElEOgotZ29hbHNfdGV4dD1Hb2FsczoKLWltcGFjdE9mTm90SGF2aW5nX3RleHQ9SW1wYWN0IG9mIG5vdCBoYXZpbmc6Ci1rZXlDb25zaWRlcmF0aW9uc190ZXh0PUtleSBjb25zaWRlcmF0aW9uczoKLWxldmVsc09mQWRvcHRpb25fdGV4dD1MZXZlbCBvZiBhZG9wdGlvbjoKLW1haW5EZXNjcmlwdGlvbl90ZXh0PU1haW4gZGVzY3JpcHRpb246Ci1uZXdFbGVtZW50X3RleHQ9TmV3IHswfQotbmFtZV90ZXh0PU5hbWU6Ci1ub3RBcHBsaWNhYmxlX3RleHQ9Tm90IGFwcGxpY2FibGUKLXBhY2thZ2luZ0d1aWRhbmNlX3RleHQ9UGFja2FnaW5nIGd1aWRhbmNlOgotcHJlc2VudGF0aW9uTmFtZV90ZXh0PVByZXNlbnRhdGlvbiBuYW1lOgotbG9uZ19wcmVzZW50YXRpb25OYW1lX3RleHQ9TG9uZyBQcmVzZW50YXRpb24gbmFtZToKLXByb21wdGZvcmxpYmFyeV90ZXh0PVByb21wdCBmb3IgbWV0aG9kIGxpYnJhcnkgb24gc3RhcnR1cAotZW5hYmxlSGVhbHRoQ2hlY2tfdGV4dD1FbmFibGUgaW50ZXJuYWwgZGVidWcgdG9vbHMKLW5vdGF0aW9uX3RleHQ9Tm90YXRpb246Ci1wcm9ibGVtX3RleHQ9UHJvYmxlbToKLXB1cnBvc2VfdGV4dD1QdXJwb3NlOgotcmVhc29uRm9yTm90TmVlZGluZ190ZXh0PVJlYXNvbiBmb3Igbm90IG5lZWRpbmc6Ci1yZXBsYWNlc190ZXh0PVJlcGxhY2VzCi1sb2NhbFJlcGxhY2VzX3RleHQ9TG9jYWxSZXBsYWNlcwotZXh0ZW5kc1JlcGxhY2VzX3RleHQ9RXh0ZW5kcyBhbmQgUmVwbGFjZXMKLXJlcHJlc2VudGF0aW9uT3B0aW9uc190ZXh0PVJlcHJlc2VudGF0aW9uIG9wdGlvbnM6Ci1yZXByZXNlbnRhdGlvbl90ZXh0PVNlbGVjdGVkIHJlcHJlc2VudGF0aW9uOgotYXR0YWNoZWRGaWxlX3RleHQ9QXR0YWNoZWQgZmlsZShzKS9VUkwocyk6Ci1za2lsbHNfdGV4dD1Ta2lsbHM6Ci1zdGVwc190ZXh0PVN0ZXBzOgotc3RlcHNfbmFtZV90ZXh0PU5hbWU6Ci1zdG9wX3RleHQ9U3RvcAotcHJpbnRfdGV4dD1QcmludAotc3lub255bXNfdGV4dD1TeW5vbnltczoKLXR5cGVfdGV4dD1UeXBlOgotY29weV90ZXh0PUNvcHkKLWRlZXBDb3B5X3RleHQ9RGVlcCBDb3B5Ci1iYWNrX3RleHQ9QmFjawotbmV3X3BsdWdpbj1OZSZ3IE1ldGhvZCBQbHVnLWluCi1tb3ZlPSZNb3ZlLi4uCi11bmlxdWVJZF90ZXh0PVVuaXF1ZSBJRDoKLXZhcmlhYmlsaXR5VHlwZV90ZXh0PVZhcmlhYmlsaXR5IHR5cGU6Ci12ZXJzaW9uX3RleHQ9VmVyc2lvbjoKLQotIyBCdXR0b24gTGFiZWxzCi1hZGRCdXR0b25fdGV4dD1BZGQuLi4KLWF0dGFjaEJ1dHRvbl90ZXh0PUF0dGFjaCBGaWxlLi4uCi1hdHRhY2hVcmxCdXR0b25fdGV4dD1BdHRhY2ggVXJsLi4uCi1icm93c2VCdXR0b25fdGV4dD1Ccm93c2UuLi4KLWNoYW5nZVR5cGVCdXR0b25fdGV4dD1DaGFuZ2UgVHlwZS4uLgotY2xlYXJCdXR0b25fdGV4dD1DbGVhcgotZGVsZXRlQnV0dG9uX3RleHQ9RGVsZXRlCi1kZXRhY2hCdXR0b25fdGV4dD1EZXRhY2gKLWRpYWdyYW1fc2F2ZUVycm9yPUVycm9yIHNhdmluZyBkaWFncmFtCi1kb3duQnV0dG9uX3RleHQ9RG93bgotZGlyZWN0b3J5X3RleHQ9RGlyZWN0b3J5Ogotb3JkZXJCdXR0b25fdGV4dD1PcmRlcgotZWRpdEJ1dHRvbl90ZXh0PUVkaXQuLi4KLXJlbW92ZUJ1dHRvbl90ZXh0PVJlbW92ZQotcmVuYW1lQWN0aW9uX3RleHQ9UmVuJmFtZS4uLgotYXNzaWduQWN0aW9uX3RleHQ9QXNzaWduLi4uCi11bmFzc2lnbkFjdGlvbl90ZXh0PVVuYXNzaWduCi1yZWFzc2lnbkFjdGlvbl90ZXh0PVJlYXNzaWduLi4uCi1kZWVwQ29weUFjdGlvbl90ZXh0PURlZXAgQ29weS4uLgotcmVtb3ZlX3RleHQ9UmVtb3ZlCi1yZW5hbWVfdGV4dD1SZW5hbWUKLVNhdmVBc190ZXh0PVNhdmUgQXMKLXNlbGVjdEJ1dHRvbl90ZXh0PVNlbGVjdC4uLgotZGVzZWxlY3RCdXR0b25fdGV4dD1EZXNlbGVjdAotdXBCdXR0b25fdGV4dD1VcAotbWFrZURlZmF1bHRCdXR0b25fdGV4dD1NYWtlIERlZmF1bHQKLXZpZXdIaXN0b3J5QnV0dG9uX3RleHQ9VmlldyBIaXN0b3J5Li4uCi0KLSMgUm9sZSBFZGl0b3IgVGFza3MgUGFnZQotcm9sZVRhc2tzUGFnZV9zZWN0aW9uTmFtZT1UYXNrcwotcm9sZVRhc2tzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb249VGhpcyByb2xlIGlzIHRoZSBwZXJmb3JtZXIgb2YgdGhlIGZvbGxvd2luZyB0YXNrcy4KLXJvbGVUYXNrc1BhZ2VfYXZhaWxhYmxlTGFiZWw9QXZhaWxhYmxlIHRhc2tzCi1yb2xlVGFza3NQYWdlX3NlbGVjdGVkTGFiZWw9UHJpbWFyeSBwZXJmb3JtZXI6Ci1yb2xlVGFza3NQYWdlX3NlbGVjdGVkTGFiZWwyPUFkZGl0aW9uYWwgcGVyZm9ybWVyOgotcm9sZVRhc2tzUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uPXswfSB0YXNrcyBoYXZlIGJlZW4gc2VsZWN0ZWQuCi0KLSMgUm9sZSBFZGl0b3IgV29yayBQcm9kdWN0cyBQYWdlCi1yb2xlV29ya1Byb2R1Y3RzUGFnZV9zZWN0aW9uTmFtZT1Xb3JrIFByb2R1Y3RzOgotcm9sZVdvcmtQcm9kdWN0c1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uPVNwZWNpZnkgd29yayBwcm9kdWN0cyB0aGF0IHRoaXMgcm9sZSBpcyByZXNwb25zaWJsZSBmb3IuCi1yb2xlV29ya1Byb2R1Y3RzUGFnZV9hdmFpbGFibGVMYWJlbD1BdmFpbGFibGUgd29yayBwcm9kdWN0czoKLXJvbGVXb3JrUHJvZHVjdHNQYWdlX3NlbGVjdGVkTGFiZWw9UmVzcG9uc2libGUgZm9yOgotcm9sZVdvcmtQcm9kdWN0c1BhZ2Vfc2VsZWN0ZWRMYWJlbDI9V29yayBwcm9kdWN0cyB0aGF0IGFyZSBvdXRwdXQgb2YgdGFza3MgdGhhdCB0aGlzIHJvbGUgcGVyZm9ybXM6Ci1yb2xlV29ya1Byb2R1Y3RzUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uPXswfSB3b3JrIHByb2R1Y3RzIGhhdmUgYmVlbiBzZWxlY3RlZC4KLQotIyBSb2xlIEVkaXRvciBHdWlkYW5jZSBQYWdlCi1yb2xlR3VpZGFuY2VQYWdlX3NlY3Rpb25OYW1lPUd1aWRhbmNlCi1yb2xlR3VpZGFuY2VQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1Qcm92aWRlIGxpbmtzIHRvIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gaW4gdGhlIGZvcm0gb2YgZ3VpZGFuY2UuCi1yb2xlR3VpZGFuY2VQYWdlX2F2YWlsYWJsZUxhYmVsPUF2YWlsYWJsZSBHdWlkYW5jZToKLXJvbGVHdWlkYW5jZVBhZ2Vfc2VsZWN0ZWRMYWJlbD1HdWlkYW5jZToKLXJvbGVHdWlkYW5jZVBhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbj17MH0gZ3VpZGFuY2UgaGF2ZSBiZWVuIHNlbGVjdGVkLgotCi0jIFJvbGUgRWRpdG9yIENhdGVnb3JpZXMgUGFnZQotcm9sZUNhdGVnb3JpZXNQYWdlX3NlY3Rpb25OYW1lPUNhdGVnb3JpZXM6Ci1yb2xlQ2F0ZWdvcmllc1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uPU1hbmFnZSB0aGUgY2F0ZWdvcmllcyB0byB3aGljaCB0aGlzIHJvbGUgYmVsb25ncy4KLXJvbGVDYXRlZ29yaWVzUGFnZV9hdmFpbGFibGVMYWJlbD1Sb2xlIFNldHM6Ci1yb2xlQ2F0ZWdvcmllc1BhZ2VfYXZhaWxhYmxlTGFiZWwyPUN1c3RvbSBDYXRlZ29yaWVzOgotcm9sZUNhdGVnb3JpZXNQYWdlX3NlbGVjdGVkTGFiZWw9Um9sZSBzZXRzOgotcm9sZUNhdGVnb3JpZXNQYWdlX3NlbGVjdGVkTGFiZWwyPUN1c3RvbSBjYXRlZ29yaWVzOgotcm9sZUNhdGVnb3JpZXNQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb249ezB9IGNhdGVnb3JpZXMgaGF2ZSBiZWVuIHNlbGVjdGVkLgotCi0jIFRhc2sgRWRpdG9yIFJvbGVzIFBhZ2UKLXRhc2tSb2xlc1BhZ2Vfc2VjdGlvbk5hbWU9Um9sZXMKLXRhc2tSb2xlc1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uPUFzc2lnbiB0aGUgcm9sZXMgdG8gcGVyZm9ybSB0aGlzIHRhc2suCi10YXNrUm9sZXNQYWdlX2F2YWlsYWJsZUxhYmVsPUF2YWlsYWJsZSByb2xlczoKLXRhc2tSb2xlc1BhZ2Vfc2VsZWN0ZWRMYWJlbD1QcmltYXJ5IHBlcmZvcm1lcnM6Ci10YXNrUm9sZXNQYWdlX3NlbGVjdGVkTGFiZWwyPUFkZGl0aW9uYWwgcGVyZm9ybWVyczoKLXRhc2tSb2xlc1BhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbj17MH0gcm9sZXMgaGF2ZSBiZWVuIHNlbGVjdGVkLgotdGFza1JvbGVzUGFnZV9wcmltYXJ5UGVyZm9ybWVyX21vZGlmeV9tZXNzYWdlPUlVUEEwMDA0NVc6IERvIHlvdSB3YW50IHRvIGNoYW5nZSB0aGUgcHJpbWFyeSBwZXJmb3JtZXIgdG8gJyd7MH0nJz8KLXRhc2tSb2xlc1BhZ2VfY29uZmlybV90aXRsZT1Db25maXJtIHByaW1hcnkgcm9sZSBjaGFuZ2UKLQotIyBUYXNrIEVkaXRvciBXb3JrIFByb2R1Y3RzIFBhZ2UKLXRhc2tXb3JrUHJvZHVjdHNQYWdlX3NlY3Rpb25OYW1lPVdvcmsgUHJvZHVjdHMKLXRhc2tXb3JrUHJvZHVjdHNQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1TcGVjaWZ5IHRoZSBpbnB1dCBhbmQgb3V0cHV0IHdvcmsgcHJvZHVjdHMgZm9yIHRoaXMgdGFzay4KLXRhc2tXb3JrUHJvZHVjdHNQYWdlX2F2YWlsYWJsZUxhYmVsPUF2YWlsYWJsZSBXb3JrIFByb2R1Y3RzCi10YXNrV29ya1Byb2R1Y3RzUGFnZV9zZWxlY3RlZExhYmVsPU1hbmRhdG9yeSBpbnB1dHM6Ci10YXNrV29ya1Byb2R1Y3RzUGFnZV9zZWxlY3RlZExhYmVsMj1PcHRpb25hbCBpbnB1dHM6Ci10YXNrV29ya1Byb2R1Y3RzUGFnZV9zZWxlY3RlZExhYmVsMz1PdXRwdXRzOgotdGFza1dvcmtQcm9kdWN0c1BhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbj17MH0gd29yayBwcm9kdWN0cyBoYXZlIGJlZW4gc2VsZWN0ZWQuCi0KLSMgVGFzayBFZGl0b3IgR3VpZGFuY2UgUGFnZQotdGFza0d1aWRhbmNlUGFnZV9zZWN0aW9uTmFtZT1HdWlkYW5jZQotdGFza0d1aWRhbmNlUGFnZV9zZWN0aW9uRGVzY3JpcHRpb249UHJvdmlkZSBsaW5rcyB0byBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGluIHRoZSBmb3JtIG9mIGd1aWRhbmNlLgotdGFza0d1aWRhbmNlUGFnZV9hdmFpbGFibGVMYWJlbD1BdmFpbGFibGUgR3VpZGFuY2U6Ci10YXNrR3VpZGFuY2VQYWdlX3NlbGVjdGVkTGFiZWw9R3VpZGFuY2U6Ci10YXNrR3VpZGFuY2VQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb249ezB9IGd1aWRhbmNlcyBoYXZlIGJlZW4gc2VsZWN0ZWQuCi0KLSMgVGFzayBFZGl0b3IgQ2F0ZWdvcmllcyBQYWdlCi10YXNrQ2F0ZWdvcmllc1BhZ2Vfc2VjdGlvbk5hbWU9Q2F0ZWdvcmllcwotdGFza0NhdGVnb3JpZXNQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1NYW5hZ2UgdGhlIGNhdGVnb3JpZXMgdG8gd2hpY2ggdGhpcyB0YXNrIGJlbG9uZ3MuCi10YXNrQ2F0ZWdvcmllc1BhZ2VfYXZhaWxhYmxlTGFiZWw9RGlzY2lwbGluZXMKLXRhc2tDYXRlZ29yaWVzUGFnZV9hdmFpbGFibGVMYWJlbDI9Q3VzdG9tIENhdGVnb3JpZXMKLXRhc2tDYXRlZ29yaWVzUGFnZV9zZWxlY3RlZExhYmVsPURpc2NpcGxpbmVzOgotdGFza0NhdGVnb3JpZXNQYWdlX3NlbGVjdGVkTGFiZWwyPUN1c3RvbSBjYXRlZ29yaWVzOgotdGFza0NhdGVnb3JpZXNQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb249ezB9IGNhdGVnb3JpZXMgaGF2ZSBiZWVuIHNlbGVjdGVkLgotCi0jIFdvcmsgUHJvZHVjdCBFZGl0b3IgVGFza3MgUGFnZQotV29ya1Byb2R1Y3RfVGFza3NfU2VjdGlvbk5hbWU9VGFza3MKLVdvcmtQcm9kdWN0X1Rhc2tzX1NlY3Rpb25EZXNjcmlwdGlvbj1UaGlzIHdvcmsgcHJvZHVjdCBpcyBhbiBpbnB1dCBvciBvdXRwdXQgZm9yIHRoZSBmb2xsb3dpbmcgdGFza3MuCi1Xb3JrUHJvZHVjdF9UYXNrc19BdmFpbGFibGVMYWJlbD1BdmFpbGFibGUgdGFza3MKLVdvcmtQcm9kdWN0X1Rhc2tzX1NlbGVjdGVkTGFiZWw9TWFuZGF0b3J5IGlucHV0OgotV29ya1Byb2R1Y3RfVGFza3NfU2VsZWN0ZWRMYWJlbDI9T3B0aW9uYWwgaW5wdXQ6Ci1Xb3JrUHJvZHVjdF9UYXNrc19TZWxlY3RlZExhYmVsMz1PdXRwdXQ6Ci1Xb3JrUHJvZHVjdF9UYXNrc19NdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uPXswfSB0YXNrcyBoYXZlIGJlZW4gc2VsZWN0ZWQuCi0KLSMgV29yayBQcm9kdWN0IEVkaXRvciBSb2xlcyBQYWdlCi13b3JrUHJvZHVjdFJvbGVzUGFnZV9zZWN0aW9uTmFtZT1Sb2xlcwotd29ya1Byb2R1Y3RSb2xlc1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uPVRoZSBmb2xsb3dpbmcgcm9sZXMgYXJlIHJlc3BvbnNpYmxlIGZvciBvciBtb2RpZnkgdGhpcyB3b3JrIHByb2R1Y3QuCi13b3JrUHJvZHVjdFJvbGVzUGFnZV9hdmFpbGFibGVMYWJlbD1BdmFpbGFibGUgcm9sZXMKLXdvcmtQcm9kdWN0Um9sZXNQYWdlX3NlbGVjdGVkTGFiZWw9UmVzcG9uc2libGUgcm9sZToKLXdvcmtQcm9kdWN0Um9sZXNQYWdlX3NlbGVjdGVkTGFiZWwyPU1vZGlmeWluZyByb2xlczoKLXdvcmtQcm9kdWN0Um9sZXNQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb249ezB9IHJvbGVzIGhhdmUgYmVlbiBzZWxlY3RlZC4KLQotIyMgV29yayBQcm9kdWN0IEVkaXRvciBEZWxpdmVyYWJsZSBQYXJ0cyBQYWdlCi13b3JrUHJvZHVjdERlbGl2ZXJhYmxlUGFydHNQYWdlX3NlY3Rpb25OYW1lPURlbGl2ZXJhYmxlIFBhcnRzCi13b3JrUHJvZHVjdERlbGl2ZXJhYmxlUGFydHNQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1TcGVjaWZ5IHRoZSB3b3JrIHByb2R1Y3RzIHRoYXQgY29uc3RpdHV0ZSB0aGlzIGRlbGl2ZXJhYmxlLgotd29ya1Byb2R1Y3REZWxpdmVyYWJsZVBhcnRzUGFnZV9hdmFpbGFibGVMYWJlbD1BdmFpbGFibGUgd29yayBwcm9kdWN0cyBhcyBkZWxpdmVyYWJsZSBwYXJ0czoKLXdvcmtQcm9kdWN0RGVsaXZlcmFibGVQYXJ0c1BhZ2Vfc2VsZWN0ZWRMYWJlbD1Xb3JrIHByb2R1Y3RzIGFzIGRlbGl2ZXJhYmxlIHBhcnRzOgotd29ya1Byb2R1Y3REZWxpdmVyYWJsZVBhcnRzUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uPXswfSB3b3JrIHByb2R1Y3RzIGhhdmUgYmVlbiBzZWxlY3RlZC4KLQotIyBXb3JrIFByb2R1Y3QgRWRpdG9yIEd1aWRhbmNlIFBhZ2UKLXdvcmtQcm9kdWN0R3VpZGFuY2VQYWdlX3NlY3Rpb25OYW1lPUd1aWRhbmNlCi13b3JrUHJvZHVjdEd1aWRhbmNlUGFnZV9zZWN0aW9uRGVzY3JpcHRpb249UHJvdmlkZSBsaW5rcyB0byBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGluIHRoZSBmb3JtIG9mIGd1aWRhbmNlLgotd29ya1Byb2R1Y3RHdWlkYW5jZVBhZ2VfYXZhaWxhYmxlTGFiZWw9QXZhaWxhYmxlIEd1aWRhbmNlOgotd29ya1Byb2R1Y3RHdWlkYW5jZVBhZ2Vfc2VsZWN0ZWRMYWJlbD1HdWlkYW5jZToKLXdvcmtQcm9kdWN0R3VpZGFuY2VQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb249ezB9IGd1aWRhbmNlcyBoYXZlIGJlZW4gc2VsZWN0ZWQuCi0KLSMgV29yayBQcm9kdWN0IEVkaXRvciBDYXRlZ29yaWVzIFBhZ2UKLXdvcmtQcm9kdWN0Q2F0ZWdvcmllc1BhZ2Vfc2VjdGlvbk5hbWU9Q2F0ZWdvcmllcwotd29ya1Byb2R1Y3RDYXRlZ29yaWVzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb249TWFuYWdlIHRoZSBjYXRlZ29yaWVzIHRvIHdoaWNoIHRoaXMgd29yayBwcm9kdWN0IGJlbG9uZ3MuCi13b3JrUHJvZHVjdENhdGVnb3JpZXNQYWdlX2F2YWlsYWJsZUxhYmVsPURvbWFpbnMKLXdvcmtQcm9kdWN0Q2F0ZWdvcmllc1BhZ2VfYXZhaWxhYmxlTGFiZWwyPVdvcmsgUHJvZHVjdCBLaW5kczoKLXdvcmtQcm9kdWN0Q2F0ZWdvcmllc1BhZ2VfYXZhaWxhYmxlTGFiZWwzPUN1c3RvbSBDYXRlZ29yaWVzOgotd29ya1Byb2R1Y3RDYXRlZ29yaWVzUGFnZV9zZWxlY3RlZExhYmVsPURvbWFpbjoKLXdvcmtQcm9kdWN0Q2F0ZWdvcmllc1BhZ2Vfc2VsZWN0ZWRMYWJlbDI9V29yayBwcm9kdWN0IGtpbmRzOgotd29ya1Byb2R1Y3RDYXRlZ29yaWVzUGFnZV9zZWxlY3RlZExhYmVsMz1DdXN0b20gY2F0ZWdvcmllczoKLXdvcmtQcm9kdWN0Q2F0ZWdvcmllc1BhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbj17MH0gY2F0ZWdvcmllcyBoYXZlIGJlZW4gc2VsZWN0ZWQuCi0KLSMgUHJhY3RpY2UgRWRpdG9yIFJlZmVyZW5jZXMgUGFnZQotcHJhY3RpY2VSZWZlcmVuY2VzUGFnZV9zZWN0aW9uTmFtZT1Db250ZW50IEVsZW1lbnRzCi1wcmFjdGljZVJlZmVyZW5jZXNQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1TcGVjaWZ5IHRoZSBjb250ZW50IGVsZW1lbnRzIHJlZmVyZW5jZWQgYnkgdGhpcyBwcmFjdGljZS4KLXByYWN0aWNlUmVmZXJlbmNlc1BhZ2VfYXZhaWxhYmxlTGFiZWw9QXZhaWxhYmxlIGNvbnRlbnQgZWxlbWVudHM6Ci1wcmFjdGljZVJlZmVyZW5jZXNQYWdlX3NlbGVjdGVkTGFiZWw9Q29udGVudCBlbGVtZW50czoKLXByYWN0aWNlUmVmZXJlbmNlc1BhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbj17MH0gQ29udGVudCBlbGVtZW50cyBoYXZlIGJlZW4gc2VsZWN0ZWQuCi1wcmFjdGljZVJlZmVyZW5jZXNQYWdlX3NvcnRPcmRlckJ1dHRvbl90ZXh0PU1hbnVhbCBvcmRlciB3aXRoaW4gdHlwZQotcHJhY3RpY2VSZWZlcmVuY2VzUGFnZV9zb3J0VHlwZUJ1dHRvbl90ZXh0PVNvcnQgYnkgVHlwZQotCi0KLSMgQ2F0ZWdvcnkgRWRpdG9yIEd1aWRhbmNlIFBhZ2UKLWNhdGVnb3J5R3VpZGFuY2VzUGFnZV9zZWN0aW9uTmFtZT1HdWlkYW5jZQotY2F0ZWdvcnlHdWlkYW5jZXNQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1NYW5hZ2UgdGhlIGd1aWRhbmNlcyB0aGF0IGJlbG9uZyB0byB0aGlzIHswfS4KLWNhdGVnb3J5R3VpZGFuY2VzUGFnZV9hdmFpbGFibGVMYWJlbD1BdmFpbGFibGUgZ3VpZGFuY2U6Ci1jYXRlZ29yeUd1aWRhbmNlc1BhZ2Vfc2VsZWN0ZWRMYWJlbD1HdWlkYW5jZToKLWNhdGVnb3J5R3VpZGFuY2VzUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uPXswfSBndWlkYW5jZXMgaGF2ZSBiZWVuIHNlbGVjdGVkLgotCi0jIERpc2NpcGxpbmUgR3JvdXBpbmcgRWRpdG9yIERpc2NpcGxpbmVzIFBhZ2UKLWRpc2NpcGxpbmVHcm91cGluZ0Rpc2NpcGxpbmVzUGFnZV9zZWN0aW9uTmFtZT1EaXNjaXBsaW5lcwotZGlzY2lwbGluZUdyb3VwaW5nRGlzY2lwbGluZXNQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1NYW5hZ2UgdGhlIGRpc2NpcGxpbmVzIHRoYXQgYmVsb25nIHRvIHRoaXMgZGlzY2lwbGluZSBncm91cGluZy4KLWRpc2NpcGxpbmVHcm91cGluZ0Rpc2NpcGxpbmVzUGFnZV9hdmFpbGFibGVMYWJlbD1BdmFpbGFibGUgRGlzY2lwbGluZXM6Ci1kaXNjaXBsaW5lR3JvdXBpbmdEaXNjaXBsaW5lc1BhZ2Vfc2VsZWN0ZWRMYWJlbD1EaXNjaXBsaW5lczoKLWRpc2NpcGxpbmVHcm91cGluZ0Rpc2NpcGxpbmVzUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uPXswfSBEaXNjaXBsaW5lcyBoYXZlIGJlZW4gc2VsZWN0ZWQuCi1BdXRob3JpbmdVSVBsdWdpbl9BYnN0cmFjdE5ld0xpYnJhcnlQYWdlX1VzZURlZmF1bHREaXJlY3RvcnlCdXR0b25MYWJlbD1Vc2UgZGVmYXVsdCBkaXJlY3RvcnkKLQotIyBEaXNjaXBsaW5lIEVkaXRvciBUYXNrcyBQYWdlCi1kaXNjaXBsaW5lVGFza3NQYWdlX3NlY3Rpb25OYW1lPVRhc2tzCi1kaXNjaXBsaW5lVGFza3NQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1NYW5hZ2UgdGhlIHRhc2tzIHRoYXQgYmVsb25nIHRvIHRoaXMgZGlzY2lwbGluZS4KLWRpc2NpcGxpbmVUYXNrc1BhZ2VfYXZhaWxhYmxlTGFiZWw9QXZhaWxhYmxlIHRhc2tzOgotZGlzY2lwbGluZVRhc2tzUGFnZV9zZWxlY3RlZExhYmVsPVRhc2tzOgotZGlzY2lwbGluZVRhc2tzUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uPXswfSB0YXNrcyBoYXZlIGJlZW4gc2VsZWN0ZWQuCi0KLSMgRGlzY2lwbGluZSBFZGl0b3IgUmVmZXJlbmNlIFdvcmtmbG93IFBhZ2UKLWRpc2NpcGxpbmVSZWZlcmVuY2VXb3JrZmxvd1BhZ2Vfc2VjdGlvbk5hbWU9UmVmZXJlbmNlIFdvcmtmbG93cwotZGlzY2lwbGluZVJlZmVyZW5jZVdvcmtmbG93UGFnZV9zZWN0aW9uRGVzY3JpcHRpb249TWFuYWdlIHRoZSByZWZlcmVuY2Ugd29ya2Zsb3dzIHRoYXQgYmVsb25nIHRvIHRoaXMgZGlzY2lwbGluZS4KLWRpc2NpcGxpbmVSZWZlcmVuY2VXb3JrZmxvd1BhZ2VfYXZhaWxhYmxlTGFiZWw9QXZhaWxhYmxlIFJlZmVyZW5jZSBXb3JrZmxvd3M6Ci1kaXNjaXBsaW5lUmVmZXJlbmNlV29ya2Zsb3dQYWdlX3NlbGVjdGVkTGFiZWw9UmVmZXJlbmNlIHdvcmtmbG93czoKLWRpc2NpcGxpbmVSZWZlcmVuY2VXb3JrZmxvd1BhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbj17MH0gUmVmZXJlbmNlIHdvcmtmbG93cyBoYXZlIGJlZW4gc2VsZWN0ZWQuCi0KLSMgRG9tYWluIEVkaXRvciBXb3JrIFByb2R1Y3RzIFBhZ2UKLWRvbWFpbldvcmtQcm9kdWN0c1BhZ2Vfc2VjdGlvbk5hbWU9V29yayBQcm9kdWN0cwotZG9tYWluV29ya1Byb2R1Y3RzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb249TWFuYWdlIHRoZSB3b3JrIHByb2R1Y3RzIHRoYXQgYmVsb25nIHRvIHRoaXMgZG9tYWluLgotZG9tYWluV29ya1Byb2R1Y3RzUGFnZV9hdmFpbGFibGVMYWJlbD1BdmFpbGFibGUgd29yayBwcm9kdWN0czoKLWRvbWFpbldvcmtQcm9kdWN0c1BhZ2Vfc2VsZWN0ZWRMYWJlbD1Xb3JrIHByb2R1Y3RzOgotZG9tYWluV29ya1Byb2R1Y3RzUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uPXswfSB3b3JrIHByb2R1Y3RzIGhhdmUgYmVlbiBzZWxlY3RlZC4KLQotIyBXb3JrIFByb2R1Y3QgS2luZCBFZGl0b3IgV29yayBQcm9kdWN0cyBQYWdlCi13b3JrUHJvZHVjdFR5cGVXb3JrUHJvZHVjdHNQYWdlX3NlY3Rpb25OYW1lPVdvcmsgUHJvZHVjdHMKLXdvcmtQcm9kdWN0VHlwZVdvcmtQcm9kdWN0c1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uPU1hbmFnZSB0aGUgd29yayBwcm9kdWN0cyB0aGF0IGJlbG9uZyB0byB0aGlzIHdvcmsgcHJvZHVjdCBraW5kLgotd29ya1Byb2R1Y3RUeXBlV29ya1Byb2R1Y3RzUGFnZV9hdmFpbGFibGVMYWJlbD1BdmFpbGFibGUgd29yayBwcm9kdWN0czoKLXdvcmtQcm9kdWN0VHlwZVdvcmtQcm9kdWN0c1BhZ2Vfc2VsZWN0ZWRMYWJlbD1Xb3JrIHByb2R1Y3RzOgotd29ya1Byb2R1Y3RUeXBlV29ya1Byb2R1Y3RzUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uPXswfSB3b3JrIHByb2R1Y3RzIGhhdmUgYmVlbiBzZWxlY3RlZC4KLQotIyBSb2xlIFNldCBHcm91cGluZyBFZGl0b3IgUm9sZSBTZXRzIFBhZ2UKLXJvbGVTZXRHcm91cGluZ1JvbGVTZXRzUGFnZV9zZWN0aW9uTmFtZT1Sb2xlIFNldHMKLXJvbGVTZXRHcm91cGluZ1JvbGVTZXRzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb249TWFuYWdlIHRoZSByb2xlIHNldHMgdGhhdCBiZWxvbmcgdG8gdGhpcyByb2xlIHNldCBncm91cGluZy4KLXJvbGVTZXRHcm91cGluZ1JvbGVTZXRzUGFnZV9hdmFpbGFibGVMYWJlbD1BdmFpbGFibGUgUm9sZSBTZXRzOgotcm9sZVNldEdyb3VwaW5nUm9sZVNldHNQYWdlX3NlbGVjdGVkTGFiZWw9Um9sZSBzZXRzOgotcm9sZVNldEdyb3VwaW5nUm9sZVNldHNQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb249ezB9IFJvbGUgU2V0cyBoYXZlIGJlZW4gc2VsZWN0ZWQuCi0KLSMgUm9sZSBTZXQgRWRpdG9yIFJvbGVzIFBhZ2UKLXJvbGVTZXRSb2xlc1BhZ2Vfc2VjdGlvbk5hbWU9Um9sZXMKLXJvbGVTZXRSb2xlc1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uPU1hbmFnZSB0aGUgcm9sZXMgdGhhdCBiZWxvbmcgdG8gdGhpcyByb2xlIHNldC4KLXJvbGVTZXRSb2xlc1BhZ2VfYXZhaWxhYmxlTGFiZWw9QXZhaWxhYmxlIHJvbGVzOgotcm9sZVNldFJvbGVzUGFnZV9zZWxlY3RlZExhYmVsPVJvbGVzOgotcm9sZVNldFJvbGVzUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uPXswfSByb2xlcyBoYXZlIGJlZW4gc2VsZWN0ZWQuCi0KLSMgVG9vbCBFZGl0b3IgVG9vbCBNZW50b3JzIFBhZ2UKLXRvb2xUb29sTWVudG9yc1BhZ2Vfc2VjdGlvbk5hbWU9VG9vbCBNZW50b3JzCi10b29sVG9vbE1lbnRvcnNQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1NYW5hZ2UgdGhlIHRvb2wgbWVudG9ycyB0aGF0IGJlbG9uZyB0byB0aGlzIHRvb2wuCi10b29sVG9vbE1lbnRvcnNQYWdlX2F2YWlsYWJsZUxhYmVsPUF2YWlsYWJsZSB0b29sIG1lbnRvcnM6Ci10b29sVG9vbE1lbnRvcnNQYWdlX3NlbGVjdGVkTGFiZWw9VG9vbCBtZW50b3JzOgotdG9vbFRvb2xNZW50b3JzUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uPXswfSBUb29sIE1lbnRvcnMgaGF2ZSBiZWVuIHNlbGVjdGVkLgotCi0jIEN1c3RvbSBDYXRlZ29yeSBFZGl0b3IgQXNzaWduIFBhZ2UKLWN1c3RvbUNhdGVnb3J5QXNzaWduUGFnZV9zZWN0aW9uTmFtZT1Db250ZW50IEVsZW1lbnRzCi1jdXN0b21DYXRlZ29yeUFzc2lnblBhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uPU1hbmFnZSB0aGUgY29udGVudCBlbGVtZW50cyB0aGF0IGNvbnN0aXR1dGUgdGhpcyBjdXN0b20gY2F0ZWdvcnkuCi1jdXN0b21DYXRlZ29yeUFzc2lnblBhZ2VfYXZhaWxhYmxlTGFiZWw9QXZhaWxhYmxlIENvbnRlbnQgRWxlbWVudHM6Ci1jdXN0b21DYXRlZ29yeUFzc2lnblBhZ2Vfc2VsZWN0ZWRMYWJlbD1Db250ZW50IGVsZW1lbnRzOgotY3VzdG9tQ2F0ZWdvcnlBc3NpZ25QYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb249ezB9IENvbnRlbnQgRWxlbWVudHMgaGF2ZSBiZWVuIHNlbGVjdGVkLgotCi0jIE5ldyBNZXRob2QgUGx1Zy1pbiBXaXphcmQKLW5ld1BsdWdpbldpemFyZF90aXRsZT1OZXcgTWV0aG9kIFBsdWctaW4KLW5ld1BsdWdpbldpemFyZFBhZ2VfdGl0bGU9Q3JlYXRlIGEgbmV3IG1ldGhvZCBwbHVnLWluCi1uZXdQbHVnaW5XaXphcmRQYWdlX3RleHQ9U3BlY2lmeSBhIG5hbWUgYW5kIHByb3ZpZGUgZ2VuZXJhbCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgbmV3IG1ldGhvZCBwbHVnLWluLgotbmV3UGx1Z2luRXJyb3JfbXNnPUlVUEEwMDIxRTogRmFpbGVkIHRvIGNyZWF0ZSB0aGUgbWV0aG9kIHBsdWctaW4uCi1uZXdQbHVnaW5FcnJvcl9yZWFzb249SW50ZXJuYWwgZXJyb3IuXG5cbkNsaWNrIERldGFpbHMgZm9yIG1vcmUgaW5mb3JtYXRpb24uCi0KLSMgUHJlZmVyZW5jZSBQYWdlcwotbWV0aG9kTGlicmFyeUdyb3VwX3RleHQ9TWV0aG9kIGxpYnJhcnkKLWRlZmF1bHRQYXRoTGFiZWxfdGV4dD1EZWZhdWx0IHBhdGg6Ci1tb2RlbGluZ0dyb3VwX3RleHQ9TW9kZWxpbmcKLXVzZXJJbnRlcmZhY2VHcm91cF90ZXh0PVVzZXIgaW50ZXJmYWNlCi1kZWJ1Z0dyb3VwX3RleHQ9RGVidWcKLWVuYWJsZUxpYnJhcnlWYWxpZGF0aW9uQ2hlY2tib3hfdGV4dD1FbmFibGUgbWV0aG9kIGxpYnJhcnkgdmFsaWRhdGlvbgotZWRpdG9yR3JvdXBfdGV4dD1FZGl0b3IKLXNob3dMb25nUHJlc2VudGF0aW9uTmFtZUNoZWNrYm94X3RleHQ9U2hvdyBsb25nIHByZXNlbnRhdGlvbiBuYW1lIGluIGVkaXRvcnMKLWludmFsaWRQcmVmZXJlbmNlSGlzdG9yeVNpemVFcnJvcl9tc2c9UHJlZmVyZW5jZSBoaXN0b3J5IHNpemUgbXVzdCBiZSBhbiBpbnRlZ2VyIHdpdGggdmFsdWUgcmFuZ2luZyBmcm9tIHswfSB0byB7MX0uCi1zaG93TG9uZ1ByZXNlbnRhdGlvbk5hbWVDaGFuZ2VfbWVzc2FnZT1DaGFuZ2luZyB0aGlzIHByZWZlcmVuY2Ugd2lsbCBzYXZlIGFuZCBjbG9zZSBhbnkgb3BlbiBlZGl0b3JzLiBEbyB5b3Ugd2FudCBwcm9jZWVkIHdpdGggdGhpcyBjaGFuZ2U/Ci0KLSMgR2VuZXJpYyBkaWFsb2cgdGl0bGVzCi1jcmVhdGVEaWFsb2dfdGl0bGU9Q3JlYXRlIEVsZW1lbnQKLWRlbGV0ZURpYWxvZ190aXRsZT1EZWxldGUgRWxlbWVudAotZWRpdERpYWxvZ190aXRsZT1FZGl0IEVsZW1lbnQKLWVycm9yRGlhbG9nX3RpdGxlPUVycm9yCi1tb3ZlRGlhbG9nX3RpdGxlPU1vdmUgRWxlbWVudAotcmVuYW1lRGlhbG9nX3RpdGxlPVJlbmFtZSBFbGVtZW50Ci13YXJuaW5nRGlhbG9nX3RpdGxlPVdhcm5pbmcKLQotIyBBZGQgQ29uZmlndXJhdGlvbiB0byBQcm9jZXNzIEVycm9yIERpYWxvZwotYWRkQ29uZmlnRXJyb3JEaWFsb2dfdGl0bGU9QWRkIENvbmZpZ3VyYXRpb24gdG8gUHJvY2VzcwotCi0jIFNldCBEZWZhdWx0IENvbmZpZ3VyYXRpb24gRXJyb3IgRGlhbG9nCi1zZXREZWZhdWx0Q29uZmlnRXJyb3JEaWFsb2dfdGl0bGU9U2V0IERlZmF1bHQgQ29uZmlndXJhdGlvbiBmb3IgUHJvY2VzcwotCi0jIEVkaXQgUHJvY2VzcyBFcnJvciBEaWFsb2cKLWVkaXRQcm9jZXNzRWxlbWVudEVycm9yRGlhbG9nX3RpdGxlPUVkaXQgUHJvY2VzcyBFbGVtZW50Ci0KLSMgT3BlbiBMaWJyYXJ5IERpYWxvZwotb3BlbkxpYnJhcnlEaWFsb2dfdGl0bGU9T3BlbiBNZXRob2QgTGlicmFyeQotb3BlbkxpYnJhcnlEaWFsb2dfdGV4dD1UaGUgY3VycmVudCBtZXRob2QgbGlicmFyeSB3YXMgbm90IHNhdmVkIHByb3Blcmx5LiBEbyB5b3Ugd2FudCB0byBpZ25vcmUgdGhlIGVycm9yIGFuZCBwcm9jZWVkIHRvIG9wZW4gYW5vdGhlciBsaWJyYXJ5PwotCi0jIFNhdmUgTGlicmFyeSBEaWFsb2cKLXNhdmVMaWJyYXJ5RGlhbG9nX3RpdGxlPVNhdmUgTWV0aG9kIExpYnJhcnkKLXNhdmVMaWJyYXJ5RGlhbG9nX3RleHQ9VGhlIGN1cnJlbnQgbWV0aG9kIGxpYnJhcnkgaGFzIGJlZW4gbW9kaWZpZWQuIERvIHlvdSB3YW50IHRvIHNhdmUgdGhlIGNoYW5nZXM/Ci0KLSMgVXBncmFkZSBMaWJyYXJ5IERpYWxvZwotdXBncmFkZUxpYnJhcnlEaWFsb2dfdGl0bGU9VXBncmFkZSBNZXRob2QgTGlicmFyeQotCi0jIERlbGV0ZSBFbGVtZW50IFJlZmVyZW5jZSBEaWFsb2cKLWRlbGV0ZUFzc29jaWF0aW9uRGlhbG9nX3RleHQ9VGhlIGVsZW1lbnQgJyd7MH0nJyBoYXMgYWxyZWFkeSBiZWVuIGRlbGV0ZWQuIERvIHlvdSB3YW50IHRvIHJlbW92ZSBpdCBmcm9tICcnezF9Jyc/Ci0KLSMgRXJyb3IgTWVzc2FnZXMKLW5vT3BlbkxpYnJhcnlFcnJvcl9tc2c9SVVQQTAwMDBFOiBObyBvcGVuIG1ldGhvZCBsaWJyYXJ5LlxuXG5BIG1ldGhvZCBsaWJyYXJ5IG11c3QgYmUgb3BlbmVkIGJlZm9yZSBhIG5ldyBtZXRob2QgZWxlbWVudCBjYW4gYmUgYWRkZWQuXG5cbkNyZWF0ZSBhIG5ldyBtZXRob2QgbGlicmFyeSBvciBvcGVuIGFuIGV4aXN0aW5nIG9uZSBhbmQgdHJ5IGFnYWluLgotZW1wdHlFbGVtZW50TmFtZUVycm9yX21zZz1JVVBBMDAwMUU6IFRoZSB7MH0gbmFtZSBpcyBtaXNzaW5nLlxuXG5BbGwgbWV0aG9kIGFuZCBwcm9jZXNzIGVsZW1lbnRzIG11c3QgaGF2ZSBhIG5hbWUuXG5cbkNsaWNrIE9LIGFuZCBlbnRlciBhIHZhbGlkIG5hbWUgZm9yIHRoZSBlbGVtZW50LgotZHVwbGljYXRlRWxlbWVudE5hbWVFcnJvcl9tc2c9SVVQQTAwMDJFOiBUaGUgbmFtZSAnJ3swfScnIGFscmVhZHkgZXhpc3RzLlxuXG5BIG1ldGhvZCBlbGVtZW50IG11c3QgaGF2ZSBhIHVuaXF1ZSBuYW1lLlxuXG5DbGljayBPSyBhbmQgZW50ZXIgYSBkaWZmZXJlbnQgbmFtZSBmb3IgdGhlIGVsZW1lbnQuCi1jcmVhdGVDb25maWdFcnJvcl9tc2c9SVVQQTAwMDNFOiBUaGUgbWV0aG9kIGNvbmZpZ3VyYXRpb24gY2Fubm90IGJlIGNyZWF0ZWQuCi1kZWxldGVDb25maWdFcnJvcl9tc2c9SVVQQTAwMDRXOiBUaGUgbWV0aG9kIGNvbmZpZ3VyYXRpb24gY2Fubm90IGJlIGRlbGV0ZWQuCi1pbnRlcm5hbEVycm9yX21zZz1JVVBBMDAwNUU6IEFuIGludGVybmFsIGVycm9yIGhhcyBvY2N1cnJlZC5cblxuQ2xpY2sgRGV0YWlscyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLWludmFsaWRQcmVzZW50YXRpb25OYW1lRXJyb3JfbXNnPUlVUEEwMDA2RTogVGhlIHNwZWNpZmllZCBwcmVzZW50YXRpb24gbmFtZSBpcyBpbnZhbGlkLlxuXG5DbGljayBPSyBhbmQgZW50ZXIgYSBkaWZmZXJlbnQgbmFtZS4KLWludmFsaWRDb25maWdFcnJvcl9tc2c9SVVQQTAwMDdFOiBUaGUgc2VsZWN0ZWQgbWV0aG9kIGNvbmZpZ3VyYXRpb24gJyd7MH0nJyBpcyBub3QgYSBzdWJzZXQgb2YgdGhlIHByb2Nlc3MnJ3MgZGVmYXVsdCBjb25maWd1cmF0aW9uLlxuXG5JbiBvcmRlciB0byBtYWludGFpbiB0aGUgaW50ZWdyaXR5IG9mIGEgcHJvY2VzcywgaXRzIGRlZmF1bHQgY29uZmlndXJhdGlvbiBtdXN0IGJlIGEgc3VwZXJzZXQgb2YgYWxsIG90aGVyIGNvbmZpZ3VyYXRpb25zIGFzc29jaWF0ZWQgd2l0aCB0aGUgcHJvY2Vzcy5cblxuU2VsZWN0IGFub3RoZXIgY29uZmlndXJhdGlvbiBvciBtb2RpZnkgdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbiB0byBpbmNsdWRlIHRoZSBjb250ZW50IG9mIHRoZSBzZWxlY3RlZCBjb25maWd1cmF0aW9uIGFuZCB0cnkgYWdhaW4uCi1zZXREZWZhdWx0Q29uZmlnRXJyb3JfbXNnPUlVUEEwMDA4RTogVGhlIHNlbGVjdGVkIG1ldGhvZCBjb25maWd1cmF0aW9uICcnezB9JycgaXMgbm90IGEgc3VwZXJzZXQgb2YgdGhlIG90aGVyIGNvbmZpZ3VyYXRpb25zIHJlZmVyZW5jZWQgYnkgdGhlIHByb2Nlc3MuXG5cbkluIG9yZGVyIHRvIG1haW50YWluIHRoZSBpbnRlZ3JpdHkgb2YgYSBwcm9jZXNzLCBpdHMgZGVmYXVsdCBjb25maWd1cmF0aW9uIG11c3QgYmUgYSBzdXBlcnNldCBvZiBhbGwgb3RoZXIgY29uZmlndXJhdGlvbnMgYXNzb2NpYXRlZCB3aXRoIHRoZSBwcm9jZXNzLlxuXG5TZWxlY3QgYW5vdGhlciBjb25maWd1cmF0aW9uIG9yIG1vZGlmeSB0aGUgY29udGVudCBvZiB0aGUgc2VsZWN0ZWQgY29uZmlndXJhdGlvbiBhbmQgdHJ5IGFnYWluLgotb3BlbkxpYnJhcnlFcnJvcl9tc2c9SVVQQTAwMDlFOiBUaGUgbWV0aG9kIGxpYnJhcnkgY2Fubm90IGJlIGxvYWRlZC5cblxuQ2xpY2sgRGV0YWlscyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLXNhdmVMaWJyYXJ5RXJyb3JfbXNnPUlVUEEwMDEwRTogVGhlIG1ldGhvZCBsaWJyYXJ5IGNhbm5vdCBiZSBzYXZlZC4KLXNhdmVMaWJyYXJ5VG9FcnJvcl9tc2c9SVVQQTAwMTBFOiBUaGUgbWV0aG9kIGxpYnJhcnkgY2Fubm90IGJlIHNhdmVkIHRvICcnezB9JycuCi1lbGVtZW50QWxyZWFkeURlbGV0ZWRFcnJvcl9tc2c9SVVQQTAwMTFFOiBUaGUgZWxlbWVudCAnJ3swfScnIGhhcyBhbHJlYWR5IGJlZW4gZGVsZXRlZC4KLXVwZ3JhZGVMaWJyYXJ5RXJyb3JfbXNnPUlVUEEwMDEyRTogVGhlIG1ldGhvZCBsaWJyYXJ5IGNhbm5vdCBiZSB1cGdyYWRlZC4KLW9wZW5Db25maWdXaXphcmRFcnJvcl9tc2c9SVVQQTAwMTZFOiBUaGUgTmV3IE1ldGhvZCBDb25maWd1cmF0aW9uIHdpemFyZCBjYW5ub3QgYmUgb3BlbmVkLgotCi0jIEVycm9yIFJlYXNvbnMKLWVycm9yX3JlYXNvbj1BbiBlcnJvciBoYXMgb2NjdXJyZWQuXG5cbkNsaWNrIERldGFpbHMgZm9yIG1vcmUgaW5mb3JtYXRpb24uCi1pbnRlcm5hbEVycm9yX3JlYXNvbj1BbiBpbnRlcm5hbCBlcnJvciBoYXMgb2NjdXJyZWQuXG5cbkNsaWNrIERldGFpbHMgZm9yIG1vcmUgaW5mb3JtYXRpb24uCi11cGdyYWRlTGlicmFyeUVycm9yX3JlYXNvbj1JVVBBMDAxOEU6IEFuIGVycm9yIGhhcyBvY2N1cnJlZCB3aGlsZSBsb2FkaW5nIHRoZSBtZXRob2QgbGlicmFyeSBlbGVtZW50cy5cblxuQ2xpY2sgRGV0YWlscyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLXNhdmVVcGdyYWRlZExpYnJhcnlFcnJvcl9yZWFzb249SVVQQTAwMTlFOiBBbiBlcnJvciBoYXMgb2NjdXJyZWQgd2hpbGUgc2F2aW5nIHRoZSB1cGdyYWRlZCBtZXRob2QgbGlicmFyeS5cblxuQ2xpY2sgRGV0YWlscyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLQotY29uZmlndXJhdGlvblBhZ2VfUXVpY2tmaXhFcnJvcl9yZWFzb24xPUlVUEEwMDIwVzpVbmFibGUgdG8gZml4IHRoZSBwcm9ibGVtIGZvciBlbGVtZW50ICcnezB9Jycgc2luY2UgaXQgaXMgaW4gYSBzdWJ0cmFjdGVkIGNhdGVnb3J5LiBcblxuIFlvdSBuZWVkIHRvIG1hbnVhbGx5IHJlbW92ZSB0aGUgZWxlbWVudCBmcm9tIHRoZSBzdWJ0cmFjdGVkIGNhdGVnb3J5LgotY29uZmlndXJhdGlvblBhZ2VfcXVpY2tmaXhFcnJvcl90aXRsZT1RdWljayBGaXgKLQotIyBQcm9ncmVzcyBNZXNzYWdlcwotb3BlbmluZ0xpYnJhcnlUYXNrX25hbWU9T3BlbmluZyBtZXRob2QgbGlicmFyeS4uLgotc2F2aW5nTGlicmFyeVRhc2tfbmFtZT1TYXZpbmcgbWV0aG9kIGxpYnJhcnkgLi4uCi11cGdyYWRpbmdMaWJyYXJ5VGFza19uYW1lPVVwZ3JhZGluZyBtZXRob2QgbGlicmFyeS4uLgotbG9hZGluZ0xpYnJhcnlFbGVtZW50c1Rhc2tfbmFtZT1Mb2FkaW5nIG1ldGhvZCBsaWJyYXJ5IGVsZW1lbnRzLi4uCi1zYXZpbmdVcGdyYWRlZEVsZW1lbnRzVGFza19uYW1lPVNhdmluZyBtZXRob2QgbGlicmFyeSBlbGVtZW50cyBpbiBuZXcgZmlsZSBmb3JtYXQuLi4KLXNhdmluZ1Rhc2tfbmFtZT1TYXZpbmcgJyd7MH0nJy4uLgotc2F2aW5nRmlsZXNUYXNrX25hbWU9U2F2aW5nIGZpbGVzLi4uCi1maXhpbmdDb250ZW50RGVzY3JpcHRpb25HVUlEc1Rhc2tfbmFtZT1GaXhpbmcgY29udGVudCBkZXNjcmlwdGlvbiBHVUlEcy4uLgotZGVsZXRpbmdJbnZhbGlkUmVmZXJlbmNlc1Rhc2tfbmFtZT1EZWxldGluZyBpbnZhbGlkIHJlZmVyZW5jZXMuLi4KLQotCi0jIEFkZCBFZGl0b3IgVG8gQnJvd3NpbmcgUGVyc3BlY3RpdmUgV2FybmluZyBEaWFsb2cKLWFkZEVkaXRvclRvUGVyc3BlY3RpdmVXYXJuaW5nX21zZz1JVVBBMDA0Nlc6IFRoaXMgcGVyc3BlY3RpdmUgaGFzIGJlZW4gc3BlY2lhbGx5IGRlc2lnbmVkIHRvIG1heGltaXplIHlvdXIgdXNlciBleHBlcmllbmNlIG9mIGJyb3dzaW5nIHRoZSBIVE1MIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtZXRob2QgbGlicmFyeSBlbGVtZW50cy4gTm8gZWRpdG9yIGNhbiBiZSBhZGRlZCBvciBkaXNwbGF5ZWQgaGVyZS4KLQotIyBDaGFuZ2UgSGlzdG9yeSBEaWFsb2cKLUNoYW5nZUhpc3RvcnlEaWFsb2dfdGl0bGU9Q2hhbmdlIERlc2NyaXB0aW9uIEhpc3RvcnkKLUNoYW5nZUhpc3RvcnlEaWFsb2dfbGFiZWw9Q2hhbmdlIGhpc3Rvcnk6Ci0KLSMgTWV0aG9kIEVsZW1lbnQgRGVsZXRlIEFjdGlvbgotY29uZmlybURlbGV0ZURpYWxvZ190aXRsZT1Db25maXJtIERlbGV0aW9uCi1jb25maXJtRGVsZXRlRGlhbG9nX21zZz1BcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gZGVsZXRlICcnezB9Jyc/Ci1jb25maXJtRGVsZXRlRGlhbG9nX21zZ1dpdGhSZWZlcmVuY2U9QXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGRlbGV0ZSAnJ3swfScnP1xuXG5UaGUgZm9sbG93aW5nIGVsZW1lbnQocykgY29udGFpbiByZWZlcmVuY2VzIHRvIHRoZSBpdGVtKHMpIHRvIGJlIGRlbGV0ZWQ6IHsxfQotCi0jIE5ldyBMaWJyYXJ5IERpYWxvZwotZXJyb3JEaWFsb2dfbWVzc2FnZT1JVVBBMDAyMkU6IFRoZSAgbWV0aG9kIGxpYnJhcnkgJyd7MH0nJyBjYW5ub3QgYmUgY3JlYXRlZC4KLWVycm9yRGlhbG9nX2Vycm9yPUNhbm5vdCBjcmVhdGUgYSBtZXRob2QgbGlicmFyeSB3aXRoaW4gYW5vdGhlciBtZXRob2QgbGlicmFyeS4KLWVycl9ub29wZW5saWJyYXJ5PUlVUEEwMDQwRTogTm8gb3BlbiBtZXRob2QgbGlicmFyeS5cblxuQSBtZXRob2QgbGlicmFyeSBtdXN0IGJlIG9wZW5lZCBiZWZvcmUgYSBuZXcgbWV0aG9kIHBsdWctaW4gY2FuIGJlIGFkZGVkLlxuXG5DcmVhdGUgYSBuZXcgbWV0aG9kIGxpYnJhcnkgb3Igb3BlbiBhbiBleGlzdGluZyBvbmUgYW5kIHRyeSBhZ2Fpbi4KLWVycl9sb2FkaW5nbGlicmFyeT1FcnJvciBsb2FkaW5nIGxpYnJhcnkKLW1zZ19yZWxvYWRMaWJyYXJ5PUVycm9yIHVuZG9pbmcgdGhlIGZhaWxlZCBkZWxldGlvbi4gVGhlIGN1cnJlbnQgbWV0aG9kIGxpYnJhcnkgbmVlZHMgdG8gYmUgcmVsb2FkZWQuCi0KLSMgUmVsb2FkIExpYnJhcnkgRGlhbG9nCi1yZWxvYWREaWFsb2dfbWVzc2FnZT1UaGUgbGlicmFyeSBuZWVkcyB0byBiZSByZWxvYWRlZCB0byByZXN0b3JlIGl0cyBvcmlnaW5hbCBzdGF0ZS4KLXJlbG9hZERpYWxvZ190aXRsZT1SZWxvYWQgTGlicmFyeQotZGlhbG9nc19Nb3ZlRGlhbG9nX2Vycm9yVGl0bGU9TW92ZSBFcnJvcgotZGlhbG9nc19Nb3ZlRGlhbG9nX2Vycm9yTWVzc2FnZT1FcnJvciBkdXJpbmcgbW92ZQotZGlhbG9nc19Bc3NpZ25EaWFsb2dfZXJyb3JNZXNzYWdlPUVycm9yIGR1cmluZyBhc3NpZ24KLQotIyBQcm9jZXNzIEZvcm0gRWRpdG9yCi1wcm9jZXNzRm9ybUVkaXRvclNhdmVEaWFsb2dfdGl0bGU9U2F2ZQotcHJvY2Vzc0Zvcm1FZGl0b3JTYXZlRGlhbG9nX21lc3NhZ2UxPVRoaXMgY2hhbmdlIHdpbGwgYWZmZWN0IGFsbCBkaWFncmFtcyBpbiB5b3VyIHByb2Nlc3MuIFRoZSBlZGl0b3Igd2lsbCBiZSBzYXZlZCBhZnRlciB5b3VyIGNoYW5nZS4gRG8geW91IHdhbnQgdG8gY29udGludWU/Ci1wcm9jZXNzRm9ybUVkaXRvclNhdmVEaWFsb2dfbWVzc2FnZTI9VGhlIGVkaXRvciB3aWxsIGJlIHNhdmVkIGFmdGVyIHlvdXIgY2hhbmdlLiBEbyB5b3Ugd2FudCB0byBjb250aW51ZT8KLQotIyBDb25maWd1cmF0aW9uIFZpZXcgUGFnZQotY29uZmlnVmlld1BhZ2VSZW1vdmVWaWV3RGlhbG9nX3RpdGxlPUNvbmZpcm0gUmVtb3ZpbmcKLWNvbmZpZ1ZpZXdQYWdlUmVtb3ZlVmlld0RpYWxvZ19tZXNzYWdlPUFyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byByZW1vdmUgdmlldyAnJ3swfScnPwotY29uZmlnVmlld1BhZ2VWaWV3RXhpc3RzRGlhbG9nX3RpdGxlPVdhcm5pbmcKLWNvbmZpZ1ZpZXdQYWdlX2NvbmZpZ3VyYXRpb249Q29uZmlndXJhdGlvbjoKLWNvbmZpZ1ZpZXdQYWdlX2NvbmZpZ3VyYXRpb25WaWV3cz1Db25maWd1cmF0aW9uIFZpZXdzCi1jb25maWdWaWV3UGFnZV92aWV3cz1WaWV3cwotY29sdW1uc2VsZWN0aW9uX3RleHQ9Q29sdW1uIHNlbGVjdGlvbjoKLWNvbmZpZ1ZpZXdQYWdlX2FkZFZpZXdCdXR0b25UZXh0PUFkZCBWaWV3Li4uCi1jb25maWdWaWV3UGFnZV9yZW1vdmVWaWV3QnV0dG9uVGV4dD1SZW1vdmUgVmlldwotY29uZmlnVmlld1BhZ2VfbWFrZURlZmF1bHRCdXR0b25UZXh0PU1ha2UgRGVmYXVsdAotY29uZmlnVmlld1BhZ2VWaWV3RXhpc3RzRGlhbG9nX21lc3NhZ2U9SVVQQTAwMjNXOiBWaWV3IHdpdGggbmFtZSAnJ3swfScnIGFscmVhZHkgZXhpc3RzLgotY29uZmlnVmlld1BhZ2VfY29uZmlndXJhdGlvblZpZXdTZWN0aW9uVGl0bGU9UHVibGlzaGVkIE5hdmlnYXRpb24gVmlld3MKLWNvbmZpZ1ZpZXdQYWdlX2NvbmZpZ3VyYXRpb25WaWV3U2VjdGlvbk1lc3NhZ2U9U3BlY2lmeSB0aGUgdmlld3MgdGhhdCB3aWxsIGJlIGluY2x1ZGVkIHdoZW4gdGhpcyBjb25maWd1cmF0aW9uIGlzIHB1Ymxpc2hlZC4gVG8gY3JlYXRlIGEgdmlldywgY2xpY2sgQWRkIFZpZXcgdG8gc2VsZWN0IGFueSBzdGFuZGFyZCBvciBjdXN0b20gY2F0ZWdvcnkgd2l0aGluIHRoZSBjb25maWd1cmF0aW9uLiAgVGhlIHNlbGVjdGVkIGNhdGVnb3J5IHdpbGwgcmVwcmVzZW50IHRoZSB2aWV3IGFuZCB0aGUgY2F0ZWdvcnkncyBzdWItY2F0ZWdvcmllcyBhbmQgY29udGVudCBlbGVtZW50cyB3aWxsIHJlcHJlc2VudCB0aGUgdmlldydzIHRyZWUgZWxlbWVudHMuCi0KLSMgRGVzY3JpcHRpb24gVGFiCi1kZXNjcmlwdGlvblRhYkd1aWRhbmNlV2FybmluZ0RpYWxvZ190aXRsZT1Db252ZXJ0IEd1aWRhbmNlCi1kZXNjcmlwdGlvblRhYkd1aWRhbmNlV2FybmluZ0RpYWxvZ19tZXNzYWdlMT1JVVBBMDA0MFc6ICBQbGVhc2Ugc2F2ZSB0aGUgZWRpdG9yIGZpcnN0LgotZGVzY3JpcHRpb25UYWJHdWlkYW5jZVdhcm5pbmdEaWFsb2dfbWVzc2FnZTI9VGhlcmUgYXJlIG5vIGNvbXBhdGlibGUgZ3VpZGFuY2UgZm9yIHRoaXMgdHlwZS4KLQotY2hhbmdlQWN0aXZpdHlUeXBlV2FybmluZ0RpYWxvZ190aXRsZT1Db252ZXJ0IEFjdGl2aXR5Ci0jIEFzc29jaWF0aW9uIEZvcm0gUGFnZQotQXNzb2NpYXRpb25Gb3JtUGFnZV9CcmllZkRlc2NyaXB0aW9uTGFiZWw9QnJpZWYgZGVzY3JpcHRpb24gb2Ygc2VsZWN0ZWQgZWxlbWVudDoKLQotIyBNZXRob2QgRWxlbWVudCBEZXNjcmlwdGlvbgotbWV0aG9kRWxlbWVudERlc2NyaXB0aW9uRW1wdHlOYW1lRGlhbG9nX3RpdGxlPUVudGVyIEVsZW1lbnQgTmFtZQotbWV0aG9kRWxlbWVudERlc2NyaXB0aW9uRW1wdHlOYW1lRGlhbG9nX21lc3NhZ2U9VGhlIG5hbWUgZmllbGQgY2Fubm90IGJlIGVtcHR5LgotCi0jIE1ldGhvZCBQbHVnLWluIERlc2NyaXB0aW9uCi1tZXRob2RQbHVnaW5EZXNjcmlwdGlvblJlbW92ZVJlZkNvbmZpcm1fbWVzc2FnZT1EZXNlbGVjdGluZyB0aGUgcmVmZXJlbmNlZCBwbHVnLWluKHMpIGFzc29jaWF0ZWQgd2l0aCBwbHVnLWluICcnezB9Jycgd2lsbCBwcm9kdWNlIGludmFsaWQgcmVsYXRpb25zaGlwcyB0aGF0IHdpbGwgYmUgZGVsZXRlZC5cblxuVGhpcyBhY3Rpb24gY2Fubm90IGJlIHVuZG9uZS4gRG8geW91IHdhbnQgdG8gcHJvY2VlZCB3aXRoIHRoaXMgY2hhbmdlPwotbWV0aG9kUGx1Z2luRGVzY3JpcHRpb25QYWdlX2NvbmZpcm1SZW5hbWU9WW91IGFyZSBhYm91dCB0byBjaGFuZ2UgdGhlIG5hbWUgb2YgdGhpcyBtZXRob2QgcGx1Zy1pbiBmcm9tICcnezB9JycgdG8gJyd7MX0nJy4gVGhpcyBhY3Rpb24gd2lsbCBzYXZlIGFuZCBjbG9zZSBhbnkgb3BlbiBlZGl0b3JzIG9mIGVsZW1lbnRzIGJlbG9uZ2luZyB0byB0aGlzIHBsdWctaW4gYW5kIHJlbmFtZSB0aGUgcGx1Zy1pbiBmb2xkZXIgdG8gdGhlIG5ldyBuYW1lLiBEbyB5b3Ugd2FudCB0byBjb250aW51ZT8KLW1ldGhvZFBsdWdpbkRlc2NyaXB0aW9uUGFnZV9jb25maXJtUmVuYW1lX3RpdGxlPVJlbmFtZSBNZXRob2QgUGx1Zy1pbgotbWV0aG9kUGx1Z2luRGVzY3JpcHRpb25QYWdlX2Nhbm5vdFJlbmFtZVBsdWdpbkZvbGRlcj1Db3VsZCBub3QgcmVuYW1lIHBsdWctaW4gZm9sZGVyIHRvIG5ldyBuYW1lCi1tZXRob2RQbHVnaW5EZXNjcmlwdGlvblBhZ2VfbG9ja1BsdWdpbkxhYmVsPUxvY2sgcGx1Zy1pbgotbWV0aG9kUGx1Z2luRGVzY3JpcHRpb25QYWdlX2xvY2tQbHVnaW5fbWVzc2FnZT1DaGFuZ2luZyB0aGUgbG9jayBzdGF0ZSBvZiB0aGlzIHBsdWctaW4gJyd7MH0nJyB3aWxsIHNhdmUgYW5kIGNsb3NlIGFueSBvcGVuIGVkaXRvcnMgb2YgZWxlbWVudHMgYmVsb25naW5nIHRvIGl0LiBEbyB5b3Ugd2FudCBwcm9jZWVkIHdpdGggdGhpcyBjaGFuZ2U/Ci1tZXRob2RQbHVnaW5EZXNjcmlwdGlvblBhZ2Vfc3VwcG9ydGluZ1BsdWdpbkxhYmVsPVN1cHBvcnRpbmcgcGx1Zy1pbgotCi0jIFByb2Nlc3MgRGVzY3JpcHRpb24KLXByb2Nlc3NEZXNjcmlwdGlvbk5hbWVDaGFuZ2VDb25maXJtX3RpdGxlPVJlbmFtZQotcHJvY2Vzc0Rlc2NyaXB0aW9uTmFtZUNoYW5nZUNvbmZpcm1fbWVzc2FnZT1Zb3UgYXJlIGFib3V0IHRvIGNoYW5nZSB0aGUgbmFtZSBvZiB0aGlzIHByb2Nlc3MuIFRoaXMgd2lsbCBzYXZlIHRoaXMgZWRpdG9yIGFuZCByZW5hbWUgdGhlIHByb2Nlc3MgZm9sZGVyIHRvIHRoZSBuZXcgbmFtZS4gRG8geW91IHdhbnQgdG8gY29udGludWU/Ci1wcm9jZXNzRGVzY3JpcHRpb25fY29uZmlndXJhdGlvbkRlc2NyaXB0aW9uPURlc2NyaXB0aW9uOgotcHJvY2Vzc0Rlc2NyaXB0aW9uX2NvbmZpZ3VyYXRpb25TZWN0aW9uVGl0bGU9Q29uZmlndXJhdGlvbgotcHJvY2Vzc0Rlc2NyaXB0aW9uX2NvbmZpZ3VyYXRpb25TZWN0aW9uTWVzc2FnZT1TcGVjaWZ5IGFsbCB0aGUgY29uZmlndXJhdGlvbnMgdmFsaWQgZm9yIHRoaXMgcHJvY2Vzcy4gU2VsZWN0IG9uZSBjb25maWd1cmF0aW9uIGFzIHRoZSBkZWZhdWx0IGFuZCBpdCBuZWVkcyB0byBiZSBhIHN1cGVyLXNldCBvZiBhbGwgdGhlIG90aGVyIGNvbmZpZ3VyYXRpb25zLgotcHJvY2Vzc0Rlc2NyaXB0aW9uX2NvbmZpZ3VyYXRpb25zPUNvbmZpZ3VyYXRpb25zOgotcHJvY2Vzc0Rlc2NyaXB0aW9uX2RlZmF1bHQ9KGRlZmF1bHQpCi1Qcm9jZXNzRGVzY3JpcHRpb25fc2VsZWN0Q29uZmlndXJhdGlvbj1TZWxlY3QgdGhlIGNvbmZpZ3VyYXRpb25zIHRvIGFkZAotUHJvY2Vzc0RlbGV0ZUFjdGlvbl9kZWxldGVjb2Zpcm1fdGV4dDA9VGhpcyB3aWxsIHNhdmUgdGhlIGN1cnJlbnQgZWRpdG9yIGFuZCB0aGUgY2hhbmdlIHdpbGwgYmUgcGVybWFuZW50LiBBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gZGVsZXRlICcnezB9Jyc/Ci1Qcm9jZXNzRGVsZXRlQWN0aW9uX3NlbGVjdERlc2NyaXB0b3JzVG9EZWxldGU9VGhlIGZvbGxvd2luZyBkZXNjcmlwdG9ycyBhcmUgbm90IHVzZWQgYW55d2hlcmUgYWZ0ZXIgZGVsZXRpb24gb2YgdGhlIHNlbGVjdGVkIGVsZW1lbnRzLlxuU2VsZWN0IGRlc2NyaXB0b3JzIHlvdSB3YW50IHRvIGRlbGV0ZS4KLQotIyBWaWV3IEhlbHBlcgotdmlld0hlbHBlckhlYWx0aENoZWNrRGlhbG9nX3RpdGxlPUxpYnJhcnkgSGVhbHRoIENoZWNrCi12aWV3SGVscGVyX3BlcmZvcm1IZWFsdGhDaGVjaz1QZXJmb3JtaW5nIGhlYWx0aCBjaGVjayBvbiBsaWJyYXJ5Li4uCi12aWV3SGVscGVySGVhbHRoQ2hlY2tEaWFsb2dfbWVzc2FnZT1UaGUgaGVhbHRoIGNoZWNrIG9uIG9wZW4gbGlicmFyeSBpcyBzdWNjZXNzZnVsbHkgY29tcGxldGVkLiBTZWUgdGhlIHJlcG9ydCBpbiB0aGUgbG9nIGZpbGUuCi0KLSMgQXR0YWNoIEd1aWRhbmNlIEZpbGUgRGlhbG9nCi1hdHRhY2hHdWlkYW5jZUZpbGVEaWFsb2dfdGl0bGU9QXR0YWNoIEZpbGUKLQotIyBDcmVhdGUgRWxlbWVudCBFcnJvciBEaWFsb2cKLWNyZWF0ZUVsZW1lbnREaWFsb2dfdGl0bGU9Q3JlYXRlIE5ldyB7MH0KLWNyZWF0ZU5ld0VsZW1lbnRFcnJvcl9tc2c9RXJyb3IgY3JlYXRpbmcgbmV3IHswfS4KLQotZGxnVGl0bGVfcmVsb2FkTGlicmFyeT1SZWxvYWQgTGlicmFyeQotY3JlYXRlRWxlbWVudEVycm9yX3JlYXNvbj1UaGUgezB9IG5hbWUgY2Fubm90IGJlIGVtcHR5LlxuXG5TcGVjaWZ5IGEgdmFsaWQgbmFtZSBhbmQgdHJ5IGFnYWluLgotZGVsZXRlQ29uZmlnRXJyb3JfcmVhc29uPVRoZSBjb25maWd1cmF0aW9uIGlzIHJlZmVyZW5jZWQgYnkgcHJvY2VzcyAnJ3swfScnCi0KLSMgQ2hhbmdlQm91bmRzQ29tbWFuZAotZ2VmX2NoYW5nZUJvdW5kc0NvbW1hbmRfbGFiZWw9Q2hhbmdlIEJvdW5kcwotIyBDaGFuZ2VOYW1lQ29tbWFuZAotZ2VmX2NoYW5nZU5hbWVDb21tYW5kX2xhYmVsPUNoYW5nZSBOYW1lCi1nZWZfY2hhbmdlTmFtZUNvbW1hbmRfdW5kb01lc3NhZ2U9Q2Fubm90IHVuZG8gdGhlIG5hbWUgY2hhbmdlLlxuXG5VbmRvIG5hbWUgY2hhbmdlIGlzIG5vdCBhbGxvd2VkIGlmIHByZXZpb3VzIG5hbWUgaXMgbnVsbC4KLSMgQ2hhbmdlUHJvcGVydHlWYWx1ZUNvbW1hbmQKLWdlZl9jaGFuZ2VQcm9wZXJ0eVZhbHVlQ29tbWFuZF9sYWJlbD1DaGFuZ2UgUHJvcGVydHkgVmFsdWUKLSMgQ3JlYXRlQmVuZHBvaW50Q29tbWFuZAotZ2VmX2NyZWF0ZUJlbmRwb2ludENvbW1hbmRfbGFiZWw9Q3JlYXRlIEJlbmRwb2ludAotIyBDcmVhdGVMaW5rQ29tbWFuZAotZ2VmX2NyZWF0ZUxpbmtDb21tYW5kX2xhYmVsPUxpbmsgQ3JlYXRpb24KLSMgQ3JlYXRlTm9kZUNvbW1hbmQKLWdlZl9jcmVhdGVOb2RlQ29tbWFuZF9sYWJlbD1DcmVhdGUgTmV3IE5vZGUKLSMgRGVsZXRlQmVuZHBvaW50Q29tbWFuZAotZ2VmX2RlbGV0ZUJlbmRwb2ludENvbW1hbmRfbGFiZWw9RGVsZXRlIEJlbmRwb2ludAotIyBEZWxldGVDb21tYW5kCi1nZWZfZGVsZXRlQ29tbWFuZF9sYWJlbD1EZWxldGUKLSMgRGVsZXRlTGlua0NvbW1hbmQKLWdlZl9kZWxldGVMaW5rQ29tbWFuZF9sYWJlbD1EZWxldGUgQ29ubmVjdGlvbgotIyBNb3ZlQmVuZHBvaW50Q29tbWFuZAotZ2VmX21vdmVCZW5kcG9pbnRDb21tYW5kX2xhYmVsPU1vdmUgQmVuZHBvaW50Ci0jIFJlY29ubmVjdExpbmtDb21tYW5kCi1nZWZfcmVjb25uZWN0TGlua0NvbW1hbmRfbGFiZWw9UmVjb25uZWN0IExpbmsKLQotIyBWYWxpZGF0aW5nRGlyZWN0RWRpdE1hbmFnZXIKLWdlZl92YWxpZGF0aW5nRGlyZWN0RWRpdE1hbmFnZXJfYnJpbmdEb3duUHJvbXB0PVRoZSBuYW1lIGNhbm5vdCBiZSBlbXB0eS4gUGxlYXNlIHNwZWNpZnkgYSB2YWxpZCBuYW1lLgotIyBWYWxpZGF0aW5nRnJlZVRleHRFZGl0TWFuYWdlcgotZ2VmX3ZhbGlkYXRpbmdGcmVlVGV4dEVkaXRNYW5hZ2VyX2JyaW5nRG93blByb21wdD1UaGUgbmFtZSBjYW5ub3QgYmUgZW1wdHkuIFBsZWFzZSBzcGVjaWZ5IGEgdmFsaWQgbmFtZS4KLSMgV29ya1Byb2R1Y3ROb2RlRWRpdFBhcnQKLWdlZl93b3JrUHJvZHVjdE5vZGVFZGl0UGFydF92YWxpZGF0ZU1lc3NhZ2U9VGhlIG5hbWUgY2Fubm90IGJlIGVtcHR5LiBQbGVhc2Ugc3BlY2lmeSBhIHZhbGlkIG5hbWUuCi0KLSMgRWxlbWVudHNWaWV3RGVsZXRlQWN0aW9uCi1hY3Rpb25zX0VsZW1lbnRzVmlld0RlbGV0ZUFjdGlvbl9tZXNzYWdlPVRoZSBjb25maWd1cmF0aW9uICcnezB9JycgY2Fubm90IGJlIGRlbGV0ZWQgc2luY2UgaXQgaXMgc3RpbGwgaW4gdXNlIGJ5IHByb2Nlc3MgJyd7MX0nJy4KLQotIyBMaWJyYXJ5QWN0aW9uQmFyQ29udHJpYnV0b3IKLWFjdGlvbnNfTGlicmFyeUFjdGlvbkJhckNvbnRyaWJ1dG9yX2RlbGV0ZUVycm9yVGl0bGU9RGVsZXRlIEVycm9yCi1hY3Rpb25zX0xpYnJhcnlBY3Rpb25CYXJDb250cmlidXRvcl9kZWxldGVFcnJvck1lc3NhZ2U9VW5oYW5kbGVkIGV4Y2VwdGlvbgotYWN0aW9uc19MaWJyYXJ5QWN0aW9uQmFyQ29udHJpYnV0b3JfZGVsZXRlRXJyb3JSZWFzb249U2VlIGRldGFpbHMKLQotIyBNZXRob2RFbGVtZW50RWRpdG9yCi1lZGl0b3JzX01ldGhvZEVsZW1lbnRFZGl0b3Jfc2F2ZUVycm9yVGl0bGU9U2F2ZSBFcnJvcgotZWRpdG9yc19NZXRob2RFbGVtZW50RWRpdG9yX3NhdmVFcnJvck1lc3NhZ2UxPUlVUEEwMDIwRTogRXJyb3Igc2F2aW5nIGZpbGUKLWVkaXRvcnNfTWV0aG9kRWxlbWVudEVkaXRvcl9zYXZlRXJyb3JNZXNzYWdlMj1Db21taXQgRXJyb3IKLWVkaXRvcnNfTWV0aG9kRWxlbWVudEVkaXRvcl9zYXZlRXJyb3JSZWFzb24xPVNlZSBsb2cgZmlsZSBmb3IgbW9yZSBkZXRhaWxzCi1lZGl0b3JzX01ldGhvZEVsZW1lbnRFZGl0b3Jfc2F2ZUVycm9yUmVhc29uMj1TZWUgZGV0YWlscwotZWRpdG9yc19NZXRob2RFbGVtZW50RWRpdG9yX3JlbmFtZUVycm9yVGl0bGU9UmVuYW1lIEVycm9yCi1lZGl0b3JzX01ldGhvZEVsZW1lbnRFZGl0b3JfaW52YWxpZEVkaXRvck1zZz1PbmUgb3IgbWFueSBmaWxlcyBvZiB0aGlzIGVkaXRvciBoYXZlIGJlZW4gcmVtb3ZlZC4gVGhlIGVkaXRvciBpcyBubyBsb25nZXIgdmFsaWQgYW5kIGhhcyB0byBjbG9zZS4KLWVkaXRvcnNfTWV0aG9kRWxlbWVudEVkaXRvcl9pbnZhbGlkRWRpdG9yVGl0bGU9SW52YWxpZCBFZGl0b3IKLWVkaXRvcnNfTWV0aG9kRWxlbWVudEVkaXRvcl9yZW5hbWVFcnJvck1lc3NhZ2UxPUVycm9yIHJlbmFtaW5nIGZpbGUocykgJyd7MH0nJwotCi0jIERlc2NyaXB0aW9uRm9ybVBhZ2UKLXJlbmFtZUVycm9yX3RpdGxlPVJlbmFtZSBFbGVtZW50Ci1yZW5hbWVFcnJvcl9tc2c9SVVQQTAwMTNFOiBUaGUgcmVuYW1lIG9wZXJhdGlvbiBjYW5ub3QgYmUgY29tcGxldGVkLgotU2VsZWN0RWxlbWVudERpYWxvZ19zZWxlY3RlbGVtZW50X3RleHQ9U2VsZWN0IEVsZW1lbnQKLQotIyBFZGl0b3JDaG9vc2VyCi1lZGl0b3JzX0VkaXRvckNob29zZXJfc3lzdGVtRXJyb3JEaWFsb2dfdGl0bGU9T3BlbiBNZXRob2QgRWRpdG9yCi1BdXRob3JpbmdVSVBsdWdpbl9BYnN0cmFjdE5ld0xpYnJhcnlQYWdlX0Rlc2NyaXB0aW9uTGFiZWw9RGVzY3JpcHRpb246Ci1BdXRob3JpbmdVSVBsdWdpbl9TYXZlQWxsRWRpdG9yc1BhZ2VfU2VsZWN0QWxsQnV0dG9uTGFiZWw9U2VsZWN0IEFsbAotT3BlbkVsZW1lbnRXb3JrYmVuY2hBY3Rpb25EZWxlZ2F0ZV9lZGl0X3RleHQwPUVkaXQgRWxlbWVudAotZWRpdG9yc19FZGl0b3JDaG9vc2VyX3N5c3RlbUVycm9yRGlhbG9nX21lc3NhZ2U9SVVQQTAwMjNFOiBDYW5ub3Qgb3BlbiB0aGUgZWRpdG9yIGFzc29jaWF0ZWQgd2l0aCB0aGUgc2VsZWN0ZWQgTWV0aG9kIGVsZW1lbnQuCi1EZXNjcmlwdGlvbkZvcm1QYWdlX0ljb25GaWxlQ2hvb3NlckRpYWxvZ190aXRsZT1TZWxlY3QgSW1hZ2UgRmlsZQotQXV0aG9yaW5nVUlQbHVnaW5fQWJzdHJhY3ROZXdMaWJyYXJ5UGFnZV9EZWZhdWx0TGlicmFyeU5hbWU9TmV3IExpYnJhcnkKLUF1dGhvcmluZ1VJUGx1Z2luX05ld0NvbmZpZ3VyYXRpb25NYWluUGFnZV9EZXNjcmlwdGlvbkxhYmVsPURlc2NyaXB0aW9uOgotQXV0aG9yaW5nVUlQbHVnaW5fT3BlbkNvbmZpZ3VyYXRpb25NYWluUGFnZV9wYWdlRGVzY3JpcHRpb249U2VsZWN0IG9uZSBvciBtb3JlIG1ldGhvZCBjb25maWd1cmF0aW9ucyBhbmQgY2xpY2sgRmluaXNoIHRvIG9wZW4gdGhlbS4KLUF1dGhvcmluZ1VJUGx1Z2luX1NhdmVBbGxFZGl0b3JzUGFnZV9EZXNlbGVjdEFsbEJ1dHRvbkxhYmVsPURlc2VsZWN0IEFsbAotRWxlbWVudHNWaWV3X21pZ3JhdGlvbl9kaXJfZGxnX2Rlc2NyaXB0aW9uX3RleHQ9U3BlY2lmeSB0aGUgZGlyZWN0b3J5IG9mIG5ld2x5IG1pZ3JhdGVkIHswfSB0byByZXBsYWNlIHRoZSBzZWxlY3RlZCB7MH0KLWVkaXRvcnNfRWRpdG9yQ2hvb3Nlcl9zeXN0ZW1FcnJvckRpYWxvZ19yZWFzb249QSBzeXN0ZW0gZXJyb3IgaGFzIG9jY3VycmVkLiBDbGljayBEZXRhaWxzIGZvciBtb3JlIGluZm9ybWF0aW9uLlxuXG5DbG9zZSBzb21lIG9mIHRoZSBvcGVuZWQgZWRpdG9ycyBhbmQgdHJ5IGFnYWluLgotCi0jIERlc2NyaXB0aW9uRm9ybVBhZ2UKLWZvcm1zX0Rlc2NyaXB0aW9uRm9ybVBhZ2VfaW1hZ2VUb29CaWdEaWFsb2dfdGl0bGU9SW1hZ2UgaXMgaW52YWxpZAotZm9ybXNfRGVzY3JpcHRpb25Gb3JtUGFnZV9pbWFnZVRvb0JpZ0RpYWxvZ190ZW1wbGF0ZT1JVVBBMDAzMUU6IFRoZSBzZWxlY3RlZCBpbWFnZSAnJ3swfScnIGlzIGxhcmdlciB0aGFuIHRoZSBhbGxvd2VkIHNpemUgKHsxfSBieSB7Mn0pLiBQbGVhc2Ugc2VsZWN0IGFub3RoZXIgaW1hZ2UuCi1mb3Jtc19EZXNjcmlwdGlvbkZvcm1QYWdlX2ltYWdlTm90Rm91bmREaWFsb2dfdGl0bGU9SW1hZ2UgaXMgaW52YWxpZAotZm9ybXNfRGVzY3JpcHRpb25Gb3JtUGFnZV9pbWFnZU5vdEZvdW5kRGlhbG9nX3RlbXBsYXRlPUlVUEEwMDMyRTogVGhlIHNlbGVjdGVkIGZpbGUgJyd7MH0nJyBkb2VzIG5vdCBleGlzdC4gUGxlYXNlIHNlbGVjdCBhbm90aGVyIGltYWdlLgotRGVzY3JpcHRpb25Gb3JtUGFnZV9TaGFwZUljb25QcmV2aWV3X1NlbGVjdEJ1dHRvbkxhYmVsPVNlbGVjdC4uLgotQXV0aG9yaW5nVUlQbHVnaW5fQWJzdHJhY3ROZXdMaWJyYXJ5UGFnZV9EZWZhdWx0TGlicmFyeURlc2NyaXB0aW9uPU1ldGhvZCBsaWJyYXJ5IGRlc2NyaXB0aW9uCi1BdXRob3JpbmdVSVBsdWdpbl9OZXdDb25maWd1cmF0aW9uTWFpblBhZ2VfRGVmYXVsdEJyaWVmRGVzY3JpcHRpb249TWV0aG9kIGNvbmZpZ3VyYXRpb24gZGVzY3JpcHRpb24KLUF1dGhvcmluZ1VJUGx1Z2luX1NhdmVBbGxFZGl0b3JzUGFnZV9zYXZlQW5kQ2xvc2VQYWdlRGVzY3JpcHRpb249QWxsIGVkaXRvcnMgbXVzdCBiZSBjbG9zZWQuIFNlbGVjdCB0aGUgb25lcyB0aGF0IG5lZWQgdG8gYmUgc2F2ZWQgZmlyc3QsIGlmIGFwcGxpY2FibGUuCi0KLSMgVGVtcGxhdGVEZXNjcmlwdGlvblBhZ2UKLWZvcm1zX0d1aWRhbmNlV2l0aEF0dGFjaG1lbnRzRGVzY3JpcHRpb25QYWdlX2FscmVhZHlBdHRhY2hlZF9tc2c9VGhlIHNlbGVjdGVkIGZpbGUgaXMgYWxyZWFkeSBhbiBhdHRhY2htZW50IHRvIHRoaXMgR3VpZGFuY2UuCi1mb3Jtc19HdWlkYW5jZVdpdGhVcmxBdHRhY2htZW50c0Rlc2NyaXB0aW9uUGFnZV9hbHJlYWR5QXR0YWNoZWRfbXNnPVRoZSBzZWxlY3RlZCBVUkwgaXMgYWxyZWFkeSBhbiBhdHRhY2htZW50IHRvIHRoaXMgR3VpZGFuY2UuCi0KLSMgTmV3IExpYnJhcnkgRXJyb3IgRGlhbG9nCi1uZXdMaWJyYXJ5RXJyb3JfbXNnPUlVUEEwMDE0RTogVW5hYmxlIHRvIGNyZWF0ZSB0aGUgbWV0aG9kIGxpYnJhcnkuCi1uZXdMaWJyYXJ5SW50ZXJubEVycm9yX3JlYXNvbj1BbiBpbnRlcm5hbCBlcnJvciBoYXMgb2NjdXJyZWQuCi1uZXdMaWJyYXJ5RXJyb3JfcmVhc29uMT1UaGUgc3BlY2lmaWVkIG1ldGhvZCBsaWJyYXJ5IHBhdGggJyd7MH0nJyBpcyBpbnZhbGlkLgotbmV3TGlicmFyeUVycm9yX3JlYXNvbjI9QSBtZXRob2QgbGlicmFyeSBhbHJlYWR5IGV4aXN0cyBpbiAnJ3swfScnLgotbmV3TGlicmFyeUVycm9yX3JlYXNvbjM9VGhlIHNwZWNpZmllZCBtZXRob2QgbGlicmFyeSBmb2xkZXIgJyd7MH0nJyBjYW5ub3QgYmUgY3JlYXRlZC4KLW5ld0xpYnJhcnlFcnJvcl9hZHZpY2U9U2VsZWN0IE9LIHRvIHNwZWNpZnkgYW5vdGhlciBtZXRob2QgbGlicmFyeSBwYXRoLgotCi0jUHJvY2VzcyBsaXRlcmFscwotUHJvY2Vzc19FeHRlcm5hbElEPUV4dGVybmFsIElEOgotUHJvY2Vzc19QdXJwb3NlPVB1cnBvc2U6Ci1Qcm9jZXNzX1Njb3BlPVNjb3BlOgotUHJvY2Vzc19Vc2FnZU5vdGVzPVVzYWdlIE5vdGVzOgotUHJvY2Vzc19BbHRlcm5hdGl2ZXM9QWx0ZXJuYXRpdmVzOgotUHJvY2Vzc19Ib3dUb1N0YWZmPUhvdyB0byBTdGFmZjoKLVByb2Nlc3NfS2V5Q29uc2lkZXJhdGlvbj1LZXkgQ29uc2lkZXJhdGlvbnM6Ci1Qcm9jZXNzX1NjYWxlPVNjYWxlOgotUHJvY2Vzc19Qcm9qZWN0Q2hhcmFjdGVyaXN0aWNzPVByb2plY3QgQ2hhcmFjdGVyaXN0aWNzOgotUHJvY2Vzc19SaXNrTGV2ZWw9UmlzayBMZXZlbDoKLVByb2Nlc3NfRXN0aW1hdGluZ1RlY2huaXF1ZT1Fc3RpbWF0aW5nIFRlY2huaXF1ZXM6Ci1Qcm9jZXNzX1Byb2plY3RNZW1iZXJFeHBlcnRpc2U9UHJvamVjdCBNZW1iZXIgRXhwZXJ0aXNlOgotUHJvY2Vzc19UeXBlT2ZDb250cmFjdD1UeXBlIE9mIENvbnRyYWN0OgotCi0jIEVkaXRvciBQcmV2aWV3IE5hdmlnYXRpb24gQnV0dG9ucwotYmFja0J1dHRvbl90ZXh0PUJhY2sKLWZvcndhcmRCdXR0b25fdGV4dD1Gb3J3YXJkCi1mb3J3YXJkX3RleHQ9Rm9yd2FyZAotc3RvcEJ1dHRvbl90ZXh0PVN0b3AKLXJlZnJlc2hCdXR0b25fdGV4dD1SZWZyZXNoCi1yZWZyZXNoX3RleHQ9UmVmcmVzaAotbmV3bmFtZV90ZXh0PU5ldyBuYW1lOgotcHJpbnRCdXR0b25fdGV4dD1QcmludAotCi0jIENvbnRleHQgbWVudXMKLV9VSV9SZWZyZXNoVmlld2VyX21lbnVfaXRlbT0mUmVmcmVzaAotX1VJX1Nob3dQcm9wZXJ0aWVzVmlld19tZW51X2l0ZW09JlNob3cgUHJvcGVydGllcwotCi1fVUlfTWV0aG9kRWRpdG9yX21lbnU9Jk1ldGhvZCBFZGl0b3IKLV9VSV9DcmVhdGVDaGlsZF9tZW51X2l0ZW09Jk5ldwotX1VJX0NyZWF0ZVNpYmxpbmdfbWVudV9pdGVtPU4mZXcgU2libGluZwotCi1fVUlfU2VsZWN0aW9uUGFnZV9sYWJlbD1TZWxlY3Rpb24KLV9VSV9QYXJlbnRQYWdlX2xhYmVsPVBhcmVudAotX1VJX0xpc3RQYWdlX2xhYmVsPUxpc3QKLV9VSV9UcmVlUGFnZV9sYWJlbD1UcmVlCi1fVUlfVGFibGVQYWdlX2xhYmVsPVRhYmxlCi1fVUlfVGFibGVUcmVlUGFnZV9sYWJlbD1UYWJsZVRyZWUKLV9VSV9PYmplY3RDb2x1bW5fbGFiZWw9T2JqZWN0Ci1fVUlfU2VsZkNvbHVtbl9sYWJlbD1TZWxmCi0KLV9VSV9Ob09iamVjdFNlbGVjdGVkPVNlbGVjdGVkIE5vdGhpbmcKLV9VSV9TaW5nbGVPYmplY3RTZWxlY3RlZD1TZWxlY3RlZCBPYmplY3Q6IHswfQotX1VJX011bHRpT2JqZWN0U2VsZWN0ZWQ9U2VsZWN0ZWQgezB9IE9iamVjdHMKLQotX1VJX09wZW5FZGl0b3JFcnJvcl9sYWJlbD1PcGVuIEVkaXRvcgotCi1fVUlfV2l6YXJkX2NhdGVnb3J5PUV4YW1wbGUgRU1GIE1vZGVsIENyZWF0aW9uIFdpemFyZHMKLQotX1VJX01ldGhvZE1vZGVsV2l6YXJkX2xhYmVsPU1ldGhvZCBNb2RlbAotX1VJX01ldGhvZE1vZGVsV2l6YXJkX2Rlc2NyaXB0aW9uPUNyZWF0ZSBhIG5ldyBNZXRob2QgbW9kZWwKLQotX1VJX01ldGhvZEVkaXRvcl9sYWJlbD1NZXRob2QgTW9kZWwgRWRpdG9yCi0KLV9VSV9NZXRob2RFZGl0b3JGaWxlbmFtZURlZmF1bHRCYXNlPU15Ci1fVUlfTWV0aG9kRWRpdG9yRmlsZW5hbWVFeHRlbnNpb249bWV0aG9kCi0KLV9VSV9XaXphcmRfbGFiZWw9TmV3Ci0KLV9XQVJOX0ZpbGVuYW1lRXh0ZW5zaW9uPVRoZSBmaWxlbmFtZSBtdXN0IGVuZCBpbiAnJy57MH0nJwotCi1fVUlfTW9kZWxPYmplY3Q9TW9kZWwgT2JqZWN0Ci1fVUlfWE1MRW5jb2Rpbmc9WE1MIEVuY29kaW5nCi1fVUlfWE1MRW5jb2RpbmdDaG9pY2VzPVVURi04IEFTQ0lJIFVURi0xNiBVVEYtMTZCRSBVVEYtMTZMRSBJU08tODg1OS0xCi1fVUlfV2l6YXJkX2luaXRpYWxfb2JqZWN0X2Rlc2NyaXB0aW9uPVNlbGVjdCBhIG1vZGVsIG9iamVjdCB0byBjcmVhdGUKLQotX1VJX0ZpbGVDb25mbGljdF9sYWJlbD1GaWxlIENvbmZsaWN0Ci1fV0FSTl9GaWxlQ29uZmxpY3Q9VGhlcmUgYXJlIHVuc2F2ZWQgY2hhbmdlcyB0aGF0IGNvbmZsaWN0IHdpdGggY2hhbmdlcyBtYWRlIG91dHNpZGUgdGhlIGVkaXRvci4gRG8geW91IHdpc2ggdG8gZGlzY2FyZCB0aGlzIGVkaXRvcidzIGNoYW5nZXM/Ci0KLSMgQWRkIExpbmsgRGlhbG9nCi1hZGRMaW5rRGlhbG9nX2xpbmtUeXBlPVR5cGU6Ci1vcGVuTGlua0NoZWNrYm94X3RleHQ9T3BlbiBsaW5rIGluIGEgc2VwYXJhdGUgYnJvd3NlciB3aW5kb3cKLQotIyBBZGQgSW1hZ2UgRGlhbG9nCi1oZWlnaHRMYWJlbF90ZXh0PUhlaWdodDoKLXdpZHRoTGFiZWxfdGV4dD1XaWR0aDoKLUVsZW1lbnRzVmlld18yMD1jYXBhYmlsaXR5IHBhdHRlcm4KLUVsZW1lbnRzVmlld18yMT1kZWxpdmVyeSBwcm9jZXNzCi1FbGVtZW50c1ZpZXdfMjI9cHJvY2VzcwotRWxlbWVudHNWaWV3XzM1PXswfSBpcyByZWFkLW9ubHkuIE1ha2UgaXQgd3JpdGFibGUgYmVmb3JlIGNvbnRpbnVpbmcuCi1FbGVtZW50c1ZpZXdfMzY9RXJyb3IgbG9hZGluZyBsaWJyYXJ5Ci1hbHRUYWdMYWJlbF90ZXh0PUFMVCB0YWc6Ci1pbWFnZVNpemVMYWJlbF90ZXh0PUhlaWdodCBhbmQgd2lkdGggb2YgaW1hZ2UgbXVzdCBiZSBhdCBsZWFzdCAxMCBhbmQgbm8gbW9yZSB0aGFuIDYwMC4gSW52YWxpZCBoZWlnaHQgYW5kIHdpZHRoIHdpbGwgYmUgY29udmVydGVkIHRvIGEgc3VpdGFibGUgc2l6ZS4KLQotIyBQcm9jZXNzIEVkaXRvcgotUHJvY2Vzc0VkaXRvcj1Qcm9jZXNzRWRpdG9yCi1Qcm9jZXNzRWRpdG9yX05hbWU9TmFtZQotUHJvY2Vzc0VkaXRvcl9QcmVzZW50YXRpb25OYW1lPVByZXNlbnRhdGlvbiBOYW1lCi1Qcm9jZXNzRWRpdG9yX0luZGV4PUluZGV4Ci1Qcm9jZXNzRWRpdG9yX1ByZWRlY2Vzc29ycz1QcmVkZWNlc3NvcnMKLSNDb25maWd1cmF0aW9uUGFnZV9TZWxlY3RlZD1TZWxlY3RlZDogCi1DaGVja2xpc3RPcmRlcl9kZXNjcmlwdGlvbj1TZWxlY3QgYSBjaGVjayBpdGVtIGFuZCBjbGljayBVcCBvciBEb3duIHRvIGNoYW5nZSBpdHMgb3JkZXIuCi1FbGVtZW50c1ZpZXdfcmVuYW1pbmdfdGV4dD1SZW5hbWluZy4uLgotUHJvY2Vzc0VkaXRvcl9Nb2RlbEluZm89TW9kZWwgSW5mbwotUHJvY2Vzc0VkaXRvcl9QcmVmaXg9UHJlZml4Ci1Nb3ZlRGlhbG9nX21vdmVfdGV4dD1Nb3ZlCi1Bc3NpZ25EaWFsb2dfYXNzaWduX3RleHQ9QXNzaWduCi1Bc3NpZ25EaWFsb2dfcmVhc3NpZ25fdGV4dD1SZWFzc2lnbgotQ2hlY2tsaXN0T3JkZXJfdGl0bGU9T3JkZXIgQ2hlY2sgSXRlbXMKLVByb2Nlc3NFZGl0b3JfUmVwZXRhYmxlPVJlcGVhdGFibGUKLVByb2Nlc3NFZGl0b3JfT25nb2luZz1PbmdvaW5nCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9TeW5jaHJvbml6YXRpb249U3luY2hyb25pemUuLi4KLVByb2Nlc3NFZGl0b3JfRXZlbnREcml2ZW49RXZlbnQtRHJpdmVuCi1Qcm9jZXNzRWRpdG9yX0RlbGl2ZXJhYmxlPURlbGl2ZXJhYmxlCi1Qcm9jZXNzRWRpdG9yX09wdGlvbmFsPU9wdGlvbmFsCi1GaWx0ZXJEaWFsb2dfVHlwZV90ZXh0PU1ldGhvZCBFbGVtZW50IFR5cGU6Ci1GaWx0ZXJEaWFsb2dfRXhwYW5kQWxsPUV4cGFuZCBBbGwKLU1vdmVEaWFsb2dfbW92aW5nX3RleHQ9TW92aW5nLi4uCi1EZXNjcmlwdGlvbkZvcm1QYWdlX0xvYWRTaGFwZUljb25XYXJuaW5nPUlVUEEwMDI1VzogU2hhcGUgaWNvbiBmb3IgezB9IGlzIG5vdCBmb3VuZCBpbiBwYXRoOiB7MX0KLURlc2NyaXB0aW9uRm9ybVBhZ2VfTG9hZFNoYXBlSWNvbkVycm9yPUlVUEEwMDI1RTogRXJyb3I6IFNoYXBlIGljb24gc2VjdGlvbjogezB9Ci1BdXRob3JpbmdVSVBsdWdpbl9BYnN0cmFjdE5ld0xpYnJhcnlQYWdlX05hbWVMYWJlbD1OYW1lOgotQXV0aG9yaW5nVUlQbHVnaW5fTmV3Q29uZmlndXJhdGlvbk1haW5QYWdlX3BhZ2VUaXRsZT1DcmVhdGUgYSBuZXcgbWV0aG9kIGNvbmZpZ3VyYXRpb24KLUF1dGhvcmluZ1VJUGx1Z2luX05ld0NvbmZpZ3VyYXRpb25NYWluUGFnZV9OYW1lTGFiZWw9TmFtZToKLUF1dGhvcmluZ1VJUGx1Z2luX25ld0NvbmZpZ3VyYXRpb25XaXphcmRfdGl0bGU9TmV3IE1ldGhvZCBDb25maWd1cmF0aW9uCi1uZXdDb25maWd1cmF0aW9uV2l6YXJkX3RpdGxlPU5ldyBNZXRob2QgQ29uZmlndXJhdGlvbgotcHJlZmVyZW5jZV9Xb3JrQnJlYWtkb3duRWxlbWVudHM9UGhhc2UsIEl0ZXJhdGlvbiwgQWN0aXZpdHkgYW5kIE1pbGVzdG9uZQotcHJlZmVyZW5jZV9EZXNjcmlwdG9yRWxlbWVudHM9Um9sZSwgVGFzayBhbmQgV29yayBQcm9kdWN0IERlc2NyaXB0b3IKLXByZWZlcmVuY2VfYnJlYWtEb3duRWxlbWVudF9EZXNjcmlwdGlvbj1UaGUgZm9sbG93aW5nIGF0dHJpYnV0ZXMgd2lsbCBiZSBzZWxlY3RlZCBieSBkZWZhdWx0IGluIHRoZSBwcm9jZXNzIGVkaXRvcjoKLXByZWZlcmVuY2VfQWN0aXZpdHlfRGlhZ3JhbT1BY3Rpdml0eSBEaWFncmFtIAotcHJlZmVyZW5jZV9BY3Rpdml0eV9EZXRhaWxfRGlhZ3JhbT1BY3Rpdml0eSBEZXRhaWwgRGlhZ3JhbQotcHJlZmVyZW5jZV9EZXNjcmlwdG9ycz1EZXNjcmlwdG9ycwotcHJlZmVyZW5jZV9pbmNsdWRlRGVzY3JpcHRvckJ1dHRvbl90ZXh0PUluY2x1ZGUgZGVzY3JpcHRvciByZWxhdGlvbnNoaXBzIHRvIGxpbmtlZCBlbGVtZW50cyBpbiBzdXBwb3J0aW5nIHBsdWdpbnMKLQotIyBOZXcgTWV0aG9kIExpYnJhcnkgV2l6YXJkCi1uZXdMaWJyYXJ5V2l6YXJkX3RpdGxlPU5ldyBNZXRob2QgTGlicmFyeQotbmV3TGlicmFyeVdpemFyZE1haW5QYWdlX3RpdGxlPUNyZWF0ZSBhIG5ldyBtZXRob2QgbGlicmFyeS4KLW5ld0xpYnJhcnlXaXphcmRNYWluUGFnZV9kZXNjcmlwdGlvbj1TcGVjaWZ5IGEgcGF0aCBhbmQgZGVzY3JpcHRpb24gZm9yIHRoZSBuZXcgbWV0aG9kIGxpYnJhcnkuCi0jbmV3TGlicmFyeVdpemFyZE1haW5QYWdlX2Rlc2NyaXB0aW9uXzE9U3BlY2lmeSBhIG5hbWUsIGRlc2NyaXB0aW9uIGFuZCBzdG9yYWdlIHR5cGUgZm9yIHRoZSBuZXcgbWV0aG9kIGxpYnJhcnkuCi1saWJyYXJ5UGF0aExhYmVsX3RleHQ9UGF0aDoKLWxpYnJhcnlUeXBlTGFiZWxfdGV4dD1UeXBlOgotCi1BdXRob3JpbmdVSVBsdWdpbl9TYXZlQWxsRWRpdG9yc1BhZ2Vfc2F2ZVRpdGxlPVNhdmUgY2hhbmdlcwotQXV0aG9yaW5nVUlQbHVnaW5fU2F2ZUFsbEVkaXRvcnNQYWdlX3NhdmVEZXNjcmlwdGlvbj1PbmUgb3IgbW9yZSBtZXRob2QgZWxlbWVudHMgaGF2ZSBiZWVuIG1vZGlmaWVkLiBTZWxlY3QgdGhlIG9uZXMgdGhhdCBuZWVkIHRvIGJlIHNhdmVkLgotQXV0aG9yaW5nVUlQbHVnaW5fT3BlbkNvbmZpZ3VyYXRpb25NYWluUGFnZV9wYWdlVGl0bGU9T3BlbiBNZXRob2QgQ29uZmlndXJhdGlvbnMKLUF1dGhvcmluZ1VJUGx1Z2luX09wZW5Db25maWd1cmF0aW9uV2l6YXJkX3dpbmRvd1RpdGxlPU9wZW4gTWV0aG9kIENvbmZpZ3VyYXRpb25zCi1FbGVtZW50c1ZpZXdfcmVwbGFjZWluZ3dpdGhmb3JtYXRfdGV4dD1SZXBsYWNpbmcgezB9Li4uCi1EZXNjcmlwdGlvbkZvcm1QYWdlX0xvYWROb2RlSWNvbldhcm5pbmc9SVVQQTAwMjZXOiBOb2RlIGljb24gZm9yIHswfSBpcyBub3QgZm91bmQgaW4gcGF0aDogezF9Ci0jTWVzc2FnZUxhYmVsUHJvdmlkZXJfdW5zZWxlY3RlZHBhY2thZ2VzPScnezB9JycgY29udGFpbnMgZWxlbWVudHMgdGhhdCByZWZlcmVuY2UgZWxlbWVudHMgaW4gdW5zZWxlY3RlZCBwYWNrYWdlcwotRGVzY3JpcHRpb25Gb3JtUGFnZV9Mb2FkTm9kZUljb25FcnJvcj1JVVBBMDAyNkU6IEVycm9yOiBOb2RlIGljb24gc2VjdGlvbjogezB9Ci1TdGVwc09yZGVyRGlhbG9nX3N0ZXBzPVN0ZXBzOiAKLVN0ZXBzT3JkZXJEaWFsb2dfdGl0bGU9T3JkZXIgVGFzayBTdGVwcwotUHJvY2Vzc0VkaXRvcl9QbGFubmVkPVBsYW5uZWQKLXNwZWNpZnlkaXJlY3RvcnlfdGV4dD1QbGVhc2Ugc3BlY2lmeSBhIGRpcmVjdG9yeSB0byBzYXZlIHRoZSBtZXRob2QgbGlicmFyeSB0bwotUHJvY2Vzc0VkaXRvcl9NdWx0aXBsZU9jY3VycmVuY2VzPU11bHRpcGxlIE9jY3VycmVuY2VzCi1Qcm9jZXNzRWRpdG9yX0VudHJ5U3RhdGU9RW50cnkgU3RhdGUKLVByb2Nlc3NFZGl0b3JfRXhpdFN0YXRlPUV4aXQgU3RhdGUKLXNlbGVjdENvbHVtbnN0b0FkZF90ZXh0PVNlbGVjdCB0aGUgY29sdW1ucyB0byBhZGQKLVByb2Nlc3NFZGl0b3JfVHlwZT1UeXBlCi1Qcm9jZXNzRWRpdG9yX1RlYW09VGVhbQotRmlsdGVyRGlhbG9nX3RpdGxlPVNlbGVjdCBEaWFsb2c6IAotCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9BZGQ9JkFkZCBmcm9tIE1ldGhvZCBDb250ZW50Li4uCi1GaWx0ZXJEaWFsb2dfQ29sbGFwc2VBbGw9Q29sbGFwc2UgQWxsCi1PcGVuQ2hlYXRzaGVldFZpZXdfdGl0bGU9T3BlbiBDaGVhdFNoZWV0IFZpZXcKLVByb2Nlc3NFZGl0b3JfQWN0aW9uX1JvbGxVcD1SJm9sbCBVcAotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fUm9sbERvd249UiZvbGwgRG93bgotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fTW92ZVVwPSZNb3ZlIFVwCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9Nb3ZlRG93bj1Nb3ZlIERvJnduCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9JbmRlbnQ9JkluZGVudAotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fT3V0ZGVudD0mT3V0ZGVudAotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fUmV2ZWFsPVJldmUmYWwKLVByb2Nlc3NFZGl0b3JfUmV2ZWFsX1RpdGxlPVJldmVhbAotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fQ29weT0mQ29weS4uLgotRmlsdGVyRGlhbG9nX1BhdHRlcm5fdGV4dD1OYW1lIHBhdHRlcm5zIChtYXRjaGluZyBuYW1lcyB3aWxsIGJlIHNob3duKTogCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9QcmVmZXJlbmNlcz1QcmVmZXJlbmNlJnMuLi4KLU1ldGhvZExpYnJhcnlFZGl0b3JfdGl0bGU9TWV0aG9kIExpYnJhcnk6IAotI01lc3NhZ2VWaWV3X3NlbGVjdGVkX3RleHQ9U2VsZWN0ZWQ6IAotTWVzc2FnZVZpZXdfZXJybXNnX3RleHQ9RGVzY3JpcHRpb24KLUVsZW1lbnRzVmlld19lcnJfc2F2aW5nPUlVUEEwMDI3RTogRXJyb3Igc2F2aW5nICcnezB9Jyd7MX0KLQotZXJyX2NvcHlpbmdfZmlsZV90aXRsZT1FcnJvciBjb3B5aW5nIGZpbGUKLWVycl9jb3B5aW5nX2ZpbGVfZXJyb3I9SVVQQTAwMjhFOiBUaGUgaWNvbiBjb3VsZCBub3QgYmUgYXNzaWduZWQuIAotZXJyX2NvcHlpbmdfZmlsZV9yZWFzb249QW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgY29weWluZyB0aGUgc2VsZWN0ZWQgZmlsZS4gQ2xpY2sgRGV0YWlscyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLWVycl9wcm9jZXNzaW5nX2ZpbGVfdGl0bGU9RXJyb3IgcHJvY2Vzc2luZyBmaWxlCi1lZGl0Q29uZmlndXJhdGlvbl90b29sdGlwPUVkaXQgY29uZmlndXJhdGlvbgotZWRpdERpYWxvZ19tc2dDYW5ub3RFZGl0PUlVUEEwMDE1RTogQ2Fubm90IGVkaXQgZWxlbWVudAotU2F2ZVRoaXNBY3Rpb25fc2F2ZW9iamVjdD1TYXZlIFRoaXMgT2JqZWN0Li4uCi1FbGVtZW50c1ZpZXdfcmVwbGFjZV90ZXh0PVJlcGxhY2UKLVByb2Nlc3NFZGl0b3JfQWN0aW9uX0V4dGVuZD0mRXh0ZW5kLi4uCi1Nb3ZlRGlhbG9nX2Rlc3RpbmF0aW9uX3RleHQ9Q2hvb3NlIGRlc3RpbmF0aW9uIGZvciBzZWxlY3RlZCBlbGVtZW50KHMpOgotY2hvb3NlRGVmYXVsdERpcmVjdG9yeV90ZXh0PUNob29zZSBhIGRlZmF1bHQgZGlyZWN0b3J5IGZvciBsaWJyYXJpZXM6Ci1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9TdXBwcmVzcz0mU3VwcHJlc3MKLVByb2Nlc3NFZGl0b3JfQWN0aW9uX1N1cHByZXNzMj0mUHVibGlzaGluZyBPcHRpb25zLi4uCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9Bc3NpZ25Vc2VyRGlhZ3JhbT0mVXNlciBEZWZpbmVkIERpYWdyYW1zLi4uCi1Vc2VyRGVmaW5lZERpYWdyYW1EaWFsb2dfdGl0bGU9QXNzaWduIHVzZXIgZGVmaW5lZCBkaWFncmFtcwotVXNlckRlZmluZWREaWFncmFtRGlhbG9nX2FkSW1hZ2U9QWN0aXZpdHkgRGlhZ3JhbToKLVVzZXJEZWZpbmVkRGlhZ3JhbURpYWxvZ19hZGRJbWFnZT1BY3Rpdml0eSBEZXRhaWwgRGlhZ3JhbToKLVVzZXJEZWZpbmVkRGlhZ3JhbURpYWxvZ193cGRJbWFnZT1Xb3JrIFByb2R1Y3QgRGVwZW5kZW5jeSBEaWFncmFtOgotVXNlckRlZmluZWREaWFncmFtRGlhbG9nX25vdGFGaWxlPUlVUEEwMDA0RTogVGhlIHNwZWNpZmllZCBwYXRoIGlzIG5vdCBhIGZpbGUuCi1Vc2VyRGVmaW5lZERpYWdyYW1EaWFsb2dfYXNzaWduQnV0dG9uPVNlbGVjdC4uLgotVXNlckRlZmluZWREaWFncmFtRGlhbG9nX2VudGVyZWRJbWFnZU5vdEZvdW5kPUlVUEEwMDI0RTogVGhlIHNwZWNpZmllZCBpbWFnZSBkb2VzIG5vdCBleGlzdCBpbiB0aGUgbGlicmFyeS4gTWFrZSBzdXJlIHlvdSBlbnRlciB0aGUgcGF0aCByZWxhdGl2ZSB0byB0aGUgbGlicmFyeSdzIHJvb3QgZGlyZWN0b3J5LgotVXNlckRlZmluZWREaWFncmFtRGlhbG9nX3NlbGVjdGVkSW1hZ2VOb3RGb3VuZD1JVVBBMDAzMEU6IFRoZSBpbWFnZSB5b3Ugc2VsZWN0ZWQgaXMgbm90IGluIHRoZSBsaWJyYXJ5LgotVXNlckRlZmluZWREaWFncmFtRGlhbG9nX3VzZUFESW1hZ2U9VXNlIEFjdGl2aXR5IGRpYWdyYW0gaW1hZ2UgZm9yIGJyb3dzaW5nIGFuZCBwdWJsaXNoaW5nCi1Vc2VyRGVmaW5lZERpYWdyYW1EaWFsb2dfdXNlQURESW1hZ2U9VXNlIEFjdGl2aXR5IGRldGFpbCBkaWFncmFtIGltYWdlIGZvciBicm93c2luZyBhbmQgcHVibGlzaGluZwotVXNlckRlZmluZWREaWFncmFtRGlhbG9nX3VzZVdQREltYWdlPVVzZSBXb3JrIHByb2R1Y3QgZGVwZW5kZW5jeSBkaWFncmFtIGltYWdlIGZvciBicm93c2luZyBhbmQgcHVibGlzaGluZwotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fQ29udHJpYnV0ZT0mTG9jYWwgQ29udHJpYnV0aW9uCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9SZXBsYWNlPUxvY2FsIFJlcGxhY2VtZW4mdAotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fRGlhZ3JhbXM9RGlhJmdyYW1zCi1Qcm9jZXNzRWRpdG9yX2FjdGlvbl9kZWVwQ29weT0mRGVlcCBDb3B5Li4uCi1GaWx0ZXJEaWFsb2dfQnJpZWZEZXNjcmlwdGlvbj1CcmllZiBEZXNjcmlwdGlvbjoKLUNvbmZpZ3VyYXRpb25QYWdlX2hpZGVUb29sVGlwPVNob3cvSGlkZSBVbmNoZWNrZWQgRWxlbWVudHMKLUNvbmZpZ3VyYXRpb25QYWdlX0Rlc2NyaXB0aW9uPURlc2NyaXB0aW9uOgotQ29uZmlndXJhdGlvblBhZ2VfdXBkYXRlT25DbGljaz1SZS1jYWxjdWxhdGUgZXJyb3JzIHdoZW5ldmVyIGNvbmZpZ3VyYXRpb24gaXMgY2hhbmdlZAotQ29uZmlndXJhdGlvblBhZ2VfdXBkYXRlT25DbGlja1Rvb2xUaXA9UmUtY2FsY3VsYXRlIGVycm9ycyB3aGVuZXZlciBjb25maWd1cmF0aW9uIGlzIGNoYW5nZWQKLUNvbmZpZ3VyYXRpb25QYWdlX25vVXBkYXRlT25DbGljaz1SZS1jYWxjdWxhdGUgZXJyb3JzIG9ubHkgd2hlbiBSZWZyZXNoIGJ1dHRvbiBpcyBjbGlja2VkIGFuZCB3aGVuIHNhdmluZwotQ29uZmlndXJhdGlvblBhZ2Vfbm9VcGRhdGVPbkNsaWNrVG9vbFRpcD1SZS1jYWxjdWxhdGUgZXJyb3JzIG9ubHkgd2hlbiBSZWZyZXNoIGJ1dHRvbiBpcyBjbGlja2VkIGFuZCB3aGVuIHNhdmluZwotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fU3VwcHJlc3NBbGw9UHVibGlzaCAmTm9uZQotRmlsdGVyRGlhbG9nX1BhdHRlcm5fZGVzY3JpcHRpb249UGF0dGVybnMgYXJlIHNlcGFyYXRlZCBieSBjb21tYSwgd2hlcmUgKj1hbnkgc3RyaW5nLCA/PWFueSBjaGFyYWN0ZXIKLUNvbmZpZ3VyYXRpb25QYWdlX1RyZWVUaXRsZUxhYmVsPUNvbnRlbnQ6Ci1Db25maWd1cmF0aW9uUGFnZV9Mb2FkaW5nTWVzc2FnZT1Mb2FkaW5nIGNvbmZpZ3VyYXRpb24sIHBsZWFzZSB3YWl0IC4uLgotQ29uZmlndXJhdGlvblBhZ2VfQWRkQ2F0ZWdvcmllc1RpdGxlTGFiZWw9QWRkIHRoZXNlIENhdGVnb3JpZXM6Ci1Db25maWd1cmF0aW9uUGFnZV9TdWJDYXRlZ29yaWVzVGl0bGVMYWJlbD1TdWJ0cmFjdCB0aGVzZSBDYXRlZ29yaWVzOgotTW92ZURpYWxvZ192YWxpZGRlc3RpbmF0aW9uX3RleHQ9VGhlIHNwZWNpZmllZCBtb3ZlIGRlc3RpbmF0aW9uIGlzIGludmFsaWQuCi1Nb3ZlRGlhbG9nX2Nhbm5vdE1vZGlmeURlc3RpbmF0aW9uPUlVUEEwMDM0RTogVGhlIHNlbGVjdGVkIGRlc3RpbmF0aW9uIGNhbm5vdCBiZSBtb2RpZmllZC4KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX1JldmVhbEFsbD1QdWJsaXNoIEEmbGwKLVByb2Nlc3NFZGl0b3JfQWN0aW9uX09wZW5CYXNlQWN0aXZpdHk9T3BlbiAmQmFzZSBBY3Rpdml0eQotUHJvY2Vzc0Zvcm1FZGl0b3JfZXhwYW5BbGxBY3Rpb25MYWJlbD1FJnhwYW5kIEFsbAotUHJvY2Vzc0Zvcm1FZGl0b3JfY29sbGFwc2VBbGxBY3Rpb25MYWJlbD1DbyZsbGFwc2UgQWxsCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9PcGVuQWN0aXZpdHlEaWFncmFtPU9wZW4gJkFjdGl2aXR5IERpYWdyYW0KLVByb2Nlc3NFZGl0b3JfcHJvbXB0VG9EZWxldGVCZWZvcmVSZXZlYWw9VGhlIHVuc3VwcHJlc3NlZCBkZXNjcmlwdG9ycyBsaXN0ZWQgaW4gRGV0YWlscyBtdXN0IGJlIGRlbGV0ZWQgdG8gYXZvaWQgZHVwbGljYXRpb24gYWZ0ZXIgcmV2ZWFsaW5nIHRoZSBzZWxlY3RlZCBlbGVtZW50cy4gQ2xpY2sgT0sgaWYgeW91IHdhbnQgdG8gZGVsZXRlIHRoZW0gYW5kIGNvbnRpbnVlLgotUHJvY2Vzc0VkaXRvclByZWZlcmVuY2VQYWdlX1NlbGVjdENvbHVtbnM9U2VsZWN0IHRoZSBjb2x1bW5zIHRvIGFkZAotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fT3BlbkFjdGl2aXR5RGV0YWlsRGlhZ3JhbT1PcGVuIEFjdGl2aXR5ICZEZXRhaWwgRGlhZ3JhbQotUHJvY2Vzc0VkaXRvclByZWZlcmVuY2VQYWdlX0NvbHVtblNlbGVjdGlvbj1Db2x1bW4gc2VsZWN0aW9uOgotUHJvY2Vzc0VkaXRvclByZWZlcmVuY2VQYWdlX3N3aXRjaENvbmZpZ3VyYXRpb249U3dpdGNoIHRvIHRoZSBQcm9jZXNzJyBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gd2hlbiBhY3RpdmF0aW5nIGEgUHJvY2VzcyBlZGl0b3IKLVByb2Nlc3NFZGl0b3JQcmVmZXJlbmNlUGFnZV9zdXBwcmVzc2lvbkdyb3VwVGl0bGU9U3VwcHJlc3Npb24KLVByb2Nlc3NFZGl0b3JQcmVmZXJlbmNlUGFnZV9pbmhlcml0U3VwcHJlc3Npb25TdGF0ZT1Jbmhlcml0IHN1cHByZXNzaW9uIHN0YXRlcwotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fT3BlbldvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW09T3BlbiAmV29yayBQcm9kdWN0IERlcGVuZGVuY3kgRGlhZ3JhbQotRGVzY3JpcHRpb25Gb3JtUGFnZV9TaGFwZUljb25QcmV2aWV3X0NsZWFyQnV0dG9uTGFiZWw9Q2xlYXIKLURlc2NyaXB0aW9uRm9ybVBhZ2VfTm9kZUljb25QcmV2aWV3X1NlbGVjdEJ1dHRvbkxhYmVsPVNlbGVjdC4uLgotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fSW5zZXJ0TmV3UGhhc2U9SW5zZXJ0IE5ldyBQaGFzZQotVmlld0hlbHBlcl9yZWxvYWRMaWJPblJvbGxiYWNrRXJyb3I9Q291bGQgbm90IHJlY292ZXIgZnJvbSBhIHBlcnNpc3RlbmNlIGVycm9yLiBUaGUgbGlicmFyeSBuZWVkcyB0byBiZSByZWxvYWRlZCB0byByZXN0b3JlIGl0cyBvcmlnaW5hbCBzdGF0ZS4KLVZpZXdIZWxwZXJfYWxyZWFkeWRlbGV0ZWRfdGV4dD1UaGUgZWxlbWVudCAnJ3swfScnIGlzIGFscmVhZHkgZGVsZXRlZC4KLVZpZXdIZWxwZXJfYWxyZWFkeWRlbGV0ZWRjb25maXJtX3RleHQ9VGhlIGVsZW1lbnQgJyd7MH0nJyBpcyBhbHJlYWR5IGRlbGV0ZWQuIERvIHlvdSB3YW50IHRvIHJlbW92ZSBpdCBmcm9tICcnezF9Jyc/Ci1Db25maWd1cmF0aW9uUGFnZV9BZGRNaXNzaW5nVG9vbFRpcD1GaXggZXJyb3JzIGFuZCB3YXJuaW5ncwotQ29uZmlndXJhdGlvbkRlc2NyaXB0aW9uRGVzY3JpcHRpb249RGVzY3JpcHRpb24KLUNvbmZpZ3VyYXRpb25EZXNjcmlwdGlvbkdlbmVyYWxJbmZvPUdlbmVyYWwgSW5mb3JtYXRpb24gCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9BcHBseVBhdHRlcm49QXBwbHkgUGEmdHRlcm4KLU1vdmVEaWFsb2dfc2VsZWN0ZGVzdGluYXRpb25fdGV4dD1QbGVhc2Ugc2VsZWN0IGEgZGVzdGluYXRpb24uCi1Nb3ZlRGlhbG9nX25vbW92ZV9kZXN0aW5hdGlvbl9wcm9ibGVtX21zZz1ObyBtb3ZlIGRlc3RpbmF0aW9uIHNwZWNpZmllZC4KLU1ldGhvZExpYnJhcnlFZGl0b3JfdHJvdWJsZW9iamVjdD0uIFRyb3VibGUgb2JqZWN0OiAKLU1lc3NhZ2VMYWJlbFByb3ZpZGVyX2VycmNoaWxkcGtncz1BIGNoaWxkIGNvbnRlbnQgcGFja2FnZSBvciBwcm9jZXNzIGNvbnRhaW5zIGVsZW1lbnRzIHdpdGggbWlzc2luZyByZWZlcmVuY2VzCi1Qcm9jZXNzRWRpdG9yX1N1cHByZXNzRGlhbG9nX1RpdGxlPURpYWdyYW0gUHVibGlzaGluZyBPcHRpb25zCi1Qcm9jZXNzRWRpdG9yX1N1cHByZXNzRGlhbG9nX01lc3NhZ2U9UGxlYXNlIHNlbGVjdCB0aGUgZGlhZ3JhbShzKSB0byBwdWJsaXNoIG9yIGRlc2VsZWN0IHRvIG5vdCBwdWJsaXNoCi1Qcm9jZXNzRWRpdG9yX1RpdGxlPVByb2Nlc3MgRWRpdG9yOiAKLVNhdmVBc3dpdGhkb3RzX3RleHQ9U2F2ZSBBcy4uLgotUHJvY2Vzc0VkaXRvcl9Xb3JrQnJlYWtkb3duU3RydWN0dXJlPVdvcmsgQnJlYWtkb3duIFN0cnVjdHVyZQotUHJvY2Vzc0VkaXRvcl9UZWFtQWxsb2NhdGlvbj1UZWFtIEFsbG9jYXRpb24KLVByb2Nlc3NFZGl0b3JfV29ya1Byb2R1Y3RVc2FnZT1Xb3JrIFByb2R1Y3QgVXNhZ2UKLVByb2Nlc3NFZGl0b3JfQ29uc29saWRhdGVkVmlldz1Db25zb2xpZGF0ZWQgVmlldwotUHJvY2Vzc0VkaXRvcl9jb25maXJtQXV0b1N5bmNoPVRoaXMgb3BlcmF0aW9uIHJlZnJlc2hlcyB0aGUgc2VsZWN0ZWQgZGVzY3JpcHRvcnMgb3IgYWxsIGRlc2NyaXB0b3JzIGJlbG93IHRoZSBzZWxlY3RlZCBhY3Rpdml0aWVzIHRoYXQgaGF2ZSBiZWVuIG1hcmtlZCBhcyAiU3luY2hyb25pemVkIHdpdGggc291cmNlIiBpbiB0aGUgR2VuZXJhbCB0YWIgb2YgdGhlaXIgUHJvcGVydGllcyB2aWV3LiAgSXQgcmVmcmVzaGVzIHRoZXNlIGRlc2NyaXB0b3JzIHdpdGggdGhlIG9yaWdpbmFsIHByb3BlcnRpZXMgb2YgdGhlIGxpbmtlZCBtZXRob2QgY29udGVudCBlbGVtZW50cyB1bmRlciB0aGUgcHJvY2VzcycgZGVmYXVsdCBjb25maWd1cmF0aW9uLiAgTm90ZSB0aGF0IGl0IHdpbGwgbm90IHVwZGF0ZSBhbnkgZHluYW1pY2FsbHkgbGlua2VkIChncmVlbiBpdGFsaWMpIGRlc2NyaXB0b3JzLiAgRG8geW91IHdhbnQgdG8gcHJvY2VlZD8KLVByb2Nlc3NFZGl0b3JfZGVmYXVsdFN5bmNocm9uaXphdGlvbj1EZWZhdWx0IFN5bmNocm9uaXphdGlvbiBmcm9tIG1ldGhvZCBjb250ZW50Ci1Db25maWd1cmF0aW9uUGFnZV9EZXNjcmlwdGlvbjE9Q29uZmlndXJhdGlvbgotQ29uZmlndXJhdGlvblBhZ2VfRGVzY3JpcHRpb24yPVBsdWctaW4gYW5kIFBhY2thZ2UgU2VsZWN0aW9uCi1OZXdMaWJyYXJ5RGlhbG9nX25ld2xpYnJhcnlfYXM9Q3JlYXRlIE5ldyBMaWJyYXJ5IEFzCi1OZXdQbHVnaW5EaWFsb2dfbmV3cGx1Z2luX3RleHQ9TmV3IE1ldGhvZCBQbHVnLWluCi1TZWxlY3RFbGVtZW50RGlhbG9nX3RpdGxlX3RleHQ9U2VsZWN0IHRoZSBlbGVtZW50IG9yIG9uZSBvZiBpdHMgY29udHJpYnV0b3JzOgotT3BlbkNvbmZpZ0RpYWxvZ25ld2NvbmZpZ190ZXh0PU5ldyBDb25maWd1cmF0aW9uOgotcHJvY2Vzc0JyZWFrZG93blN0cnVjdHVyZUZvcm1QYWdlX0JTRWRpdG9yPVByb2Nlc3MgRWRpdG9yCi0KLSMgQWJzdHJhY3REaWFncmFtRWRpdG9yCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfYWxpZ25NZW51X3RleHQ9QWxpZ24KLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl9yZWZyZXNoRnJvbUJhc2VBY3Rpdml0eV90ZXh0PVJlZnJlc2ggZnJvbSBCYXNlIEFjdGl2aXR5Ci1BYnN0cmFjdERpYWdyYW1FZGl0b3JfZm9ybWF0VGV4dEJveEFjdGl2aXR5X3RleHQ9Rm9ybWF0IFRleHQgQm94Li4uCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfaEFsaWduQXZlcmFnZUFjdGlvbl90ZXh0PUhvcml6b250YWxseSB0byBBdmVyYWdlCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfaEFsaWduRmlyc3RTZWxlY3RlZEFjdGlvbl90ZXh0PUhvcml6b250YWxseSB0byBGaXJzdCBTZWxlY3RlZAotQWJzdHJhY3REaWFncmFtRWRpdG9yX3ZBbGlnbkF2ZXJhZ2VBY3Rpb25fdGV4dD1WZXJ0aWNhbGx5IHRvIEF2ZXJhZ2UKLU1ldGhvZExpYnJhcnlEZXNjcmlwdGlvbkZvcm1QYWdlX3NlY3Rpb25fdGl0bGU9R2VuZXJhbCBJbmZvcm1hdGlvbgotTW92ZURpYWxvZ19pbnZhbGlkX21vdmVfZGVzdGluYXRpb25fcHJvYmxlbV9tc2c9SVVQQTAwNDFFOiBUaGUgc2VsZWN0ZWQgZWxlbWVudChzKSBjYW5ub3QgYmUgbW92ZWQgdG8gdGhlIHNwZWNpZmllZCBkZXN0aW5hdGlvbi4KLU1ldGhvZExpYnJhcnlFZGl0b3Jfc2F2ZW1vZGVsbGlicmFyeT1TYXZpbmcgbW9kZWwgbGlicmFyeSAuLi4KLU1ldGhvZExpYnJhcnlFZGl0b3JfZXJyb3JfZGlhbG9nX3RpdGxlPUVycm9yCi1NZXRob2RMaWJyYXJ5RWRpdG9yX3NhdmVfbGlicmFyeV9wcm9ibGVtX21zZz1JVVBBMDAzM0U6IFByb2JsZW0gZW5jb3VudGVyZWQgaW4gc2F2aW5nIGxpYnJhcnkuCi1NZXRob2RFbGVtZW50RGVsZXRlQWN0aW9uX2RlbGV0ZWNvbmZpcm1fdGV4dD1BcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gZGVsZXRlICcnezB9Jyc/Ci1Db250ZW50RWxlbWVudHNPcmRlckRpYWxvZ19Db250ZW50RWxlbWVudF90ZXh0PUNvbnRlbnQgRWxlbWVudHM6IAotQXV0aG9yaW5nVUlQbHVnaW5fQWJzdHJhY3ROZXdMaWJyYXJ5UGFnZV9Ccm93c2VCdXR0b25MYWJlbD1Ccm93c2UuLi4KLUF1dGhvcmluZ1VJUGx1Z2luX05ld0NvbmZpZ3VyYXRpb25NYWluUGFnZV9wYWdlRGVzY3JpcHRpb249U3BlY2lmeSBhIG5hbWUgYW5kIGRlc2NyaXB0aW9uIGZvciB0aGUgbmV3IG1ldGhvZCBjb25maWd1cmF0aW9uLgotQXV0aG9yaW5nVUlQbHVnaW5fU2F2ZUFsbEVkaXRvcnNQYWdlX3NhdmVBbmRDbG9zZVBhZ2VUaXRsZT1TYXZlIGNoYW5nZXMgYW5kIGNsb3NlIGFsbCBlZGl0b3JzCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfdkFsaWduRmlyc3RTZWxlY3RlZEFjdGlvbl90ZXh0PVZlcnRpY2FsbHkgdG8gRmlyc3QgU2VsZWN0ZWQKLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl9TYXZlX3RleHQ9U2F2ZQotQXR0YWNobWVudERpYWxvZ2F0dGFjaEZpbGVfdGV4dD1BdHRhY2ggRmlsZQotQXR0YWNobWVudERpYWxvZ2F0dGFjaFVybF90ZXh0PUF0dGFjaCBVcmwKLUNvbmZpZ3VyYXRpb25QYWdlX0NvbmZpZ0NvbnRlbnQ9Q29uZmlndXJhdGlvbiBDb250ZW50Ci1PcGVuQ29uZmlnRGlhbG9nb3BlbmNvbmZpZ190ZXh0PU9wZW4gQ29uZmlndXJhdGlvbgotRWxlbWVudHNWaWV3X3JlcGxhY2VBY3Rpb25fdGV4dD1SZXBsYWNlLi4uCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfU2F2ZV9tZXNzYWdlPVNhdmluZyB7MH0KLUNvbmZpZ3VyYXRpb25QYWdlX1Nob3dFcnJvclRvb2xUaXA9U2hvdyBjb25maWd1cmF0aW9uIGVycm9ycwotQ29uZmlndXJhdGlvbkRlc2NyaXB0aW9uRm9ybVByZWZpeD1Db25maWd1cmF0aW9uOiAKLUNoZWNrbGlzdE9yZGVyX2NoZWNrbGlzdGl0ZW1zX3RleHQ9Q2hlY2sgSXRlbXM6IAotQWJzdHJhY3REaWFncmFtRWRpdG9yX01vdmVOb2RlX2xhYmVsPU1vdmUgTm9kZQotQ29uZmlndXJhdGlvblBhZ2VfTWFrZUNsb3N1cmVUb29sVGlwPUZpeCBlcnJvcnMKLUNvbmZpZ3VyYXRpb25PcmRlckRpYWxvZ19kZXNjcmlwdGlvbj1PcmRlciBOYXZpZ2F0aW9uIFZpZXdzCi1OZXdQbHVnaW5EaWFsb2dfcmVmZXJlbmNlcGx1Z2luX3RleHQ9UmVmZXJlbmNlIFBsdWctaW5zOgotQWJzdHJhY3REaWFncmFtRWRpdG9yX2NyZWF0ZUZyZWVUZXh0X3RleHQ9Q3JlYXRlIGEgRnJlZSBUZXh0Ci1EZXNjcmlwdGlvbkZvcm1QYWdlX05vZGVJY29uUHJldmlld19MYWJlbD1Ob2RlIEljb24gUHJldmlldzoKLURpYWdyYW1WYWxpZGF0aW9uX2Vycl9jYW5ub3RfY29ubmVjdF90ZXh0PUlVUEEwMDMyVzogQ2Fubm90IGNvbm5lY3QKLURpYWdyYW1WYWxpZGF0aW9uX2Vycl9zYW1lcHJlZGFuZHN1Y190ZXh0PUlVUEEwMDMzVzogQ2Fubm90IGhhdmUgdGhlIHNhbWUgYnJlYWtkb3duIGVsZW1lbnQgYXMgcHJlZGVjZXNzb3IgYW5kIHN1Y2Nlc3NvcgotCi0jIEVkaXRvckNob29zZXIKLUVkaXRvckNob29zZXJfbG9hZGRFcnJvckRsZ1RpdGxlPU9wZW4gRWRpdG9yCi1FZGl0b3JDaG9vc2VyX1Jlc291cmNlc0Vycm9yPVRoaXMgZWxlbWVudCBoYXMgZXJyb3JzLiBJdCBpcyByZWNvbW1lbmRlZCB0byBmaXggdGhlc2UgZXJyb3JzIGJlZm9yZSBjb250aW51aW5nIChzZWUgZGV0YWlscykuXG5cbkNsaWNrIE9LIHRvIGNvbnRpbnVlIHdpdGhvdXQgb3BlbmluZyB0aGUgZWRpdG9yLiBDbG9zZSB0aGlzIGRpYWxvZyB0byBvcGVuIHRoZSBlZGl0b3IuCi1Db25maWd1cmF0aW9uUGFnZV9Gb3JtUHJlZml4PUNvbmZpZ3VyYXRpb246IAotQ29uZmlndXJhdGlvbkRlc2NyaXB0aW9uTmFtZT1OYW1lOgotQXR0YWNobWVudERpYWxvZ0ZpbGVVUkxfdGV4dD1GaWxlIFVSTDoKLVN0ZXBzT3JkZXJEaWFsb2dfZGVzY3JpcHRpb249U2VsZWN0IGEgc3RlcCBhbmQgY2xpY2sgVXAgb3IgRG93biB0byBjaGFuZ2UgaXRzIG9yZGVyLgotTWV0aG9kTGlicmFyeUVkaXRvcl9lcnJfc2F2ZT1FcnJvciBkdXJpbmcgc2F2aW5nCi1NZXNzYWdlVmlld19lcnJlbGVtZW50X3RleHQ9UmVmZXJlbmNpbmcgRWxlbWVudAotTWVzc2FnZVZpZXdfcmVmZWxlbWVudF90ZXh0PVJlZmVyZW5jZWQgRWxlbWVudAotCi0jQWN0aXZpdHkgRGlhZ3JhbQotQWN0aXZpdHlEaWFncmFtRWRpdG9yX2NyZWF0ZVN0YXJ0Tm9kZV90ZXh0PUNyZWF0ZSBhIFN0YXJ0IE5vZGUKLUNvbmZpZ3VyYXRpb25QYWdlX0NvbmZpZ0NvbnRlbnREZXNjcmlwdGlvbj1TZWxlY3QgdGhlIG1ldGhvZCBwbHVnLWlucywgY29udGVudCBwYWNrYWdlcyBhbmQgcHJvY2Vzc2VzIHRoYXQgd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGlzIGNvbmZpZ3VyYXRpb24uCi1Db250ZW50RWxlbWVudHNPcmRlckRpYWxvZ19kZXNjcmlwdGlvbl90ZXh0PU9yZGVyIGRpYWxvZwotQXV0aG9yaW5nVUlQbHVnaW5fQWJzdHJhY3ROZXdMaWJyYXJ5UGFnZV9EaXJlY3RvcnlMYWJlbD1EaXJlY3Rvcnk6Ci1Sb290UHJlZlBhZ2VfZW5hYmxlcHJvY2Vzc2NvbnRyaWJ1dGlvbl90ZXh0PUVuYWJsZSBQcm9jZXNzIENvbnRyaWJ1dGlvbgotQ29uZmlndXJhdGlvbkRlc2NyaXB0aW9uRGVzY3JpcHRpb25fdGV4dD1Qcm92aWRlIGdlbmVyYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBtZXRob2QgY29uZmlndXJhdGlvbi4KLUNvbmZpZ3VyYXRpb25EZXNjcmlwdGlvbkRlc2NyaXB0aW9uTGFiZWw9RGVzY3JpcHRpb246Ci1Db25maWd1cmF0aW9uT3JkZXJEaWFsb2dfTmF2aWdhdGlvblZpZXdzPU5hdmlnYXRpb24gVmlld3M6IAotQ29udHJpYnV0aW9uU2VsZWN0aW9uX2ZpbHRlcmRpYWxvZ190aXRsZT1DaG9vc2luZyBDb250cmlidXRvcnMgZm9yICcnezB9JycKLUVsZW1lbnRzVmlld19vcGVuVmFyaWFiaWxpdHlEaWFsb2dBY3Rpb25fdGV4dD0mT3BlbiB2aWEgdmFyaWFiaWxpdHkgZWxlbWVudHMKLVZhcmlhYmlsaXR5U2VsZWN0aW9uX2ZpbHRlcmRpYWxvZ190aXRsZT1jaG9vc2luZyB2YXJpYWJpbGl0eSBlbGVtZW50cyBmb3IgJyd7MH0nJwotVmFyaWFiaWxpdHlTZWxlY3Rpb25fZmlsdGVyZGlhbG9nX3ZpZXdlckxhYmVsPVZhcmlhYmlsaXR5IGVsZW1lbnRzIGZvciAnJ3swfScnCi1EZXNjcmlwdGlvbkZvcm1QYWdlX1NoYXBlSWNvblByZXZpZXdfTGFiZWw9U2hhcGUgSWNvbiBQcmV2aWV3OgotRGlhZ3JhbVZhbGlkYXRpb25fZXJyX2Nhbm5vdF9kZWxldGVfdGV4dD1DYW5ub3QgZGVsZXRlCi1BY3Rpdml0eURpYWdyYW1FZGl0b3Jfb3BlbkFjdGl2aXR5RGV0YWlsRGlhZ3JhbV90ZXh0PU9wZW4gQWN0aXZpdHkgRGV0YWlsIERpYWdyYW0gCi1NZXRob2RMaWJyYXJ5RGVzY3JpcHRpb25Gb3JtUGFnZV9zZWN0aW9uX2Rlc2NyaXB0aW9uPVByb3ZpZGUgZ2VuZXJhbCBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIG1ldGhvZCBsaWJyYXJ5LgotRGVzY3JpcHRpb25Gb3JtUGFnZV9Ob2RlSWNvblByZXZpZXdfQ2xlYXJCdXR0b25MYWJlbD1DbGVhcgotV1BDb21wYXJ0bWVudEZpZ3VyZV8wPU5ldyBXb3JrUHJvZHVjdCBEZXNjcmlwdG9yCi1wcm9tcHRmb3JfcHVibGlzaF91bm9wZW5fYWN0aXZpdHlkZF90ZXh0PVB1Ymxpc2ggYWN0aXZpdHkgZGV0YWlsIGRpYWdyYW1zIHRoYXQgaGF2ZSBub3QgYmVlbiBjcmVhdGVkIGluIHByb2Nlc3MgZWRpdG9yCi1wcm9tcHRfZm9yX3B1Ymxpc2hfZXh0ZW5kX2FjdGl2aXR5X2RpYWdyYW09UHVibGlzaCBhY3Rpdml0eSBkaWFncmFtcyBmb3IgdW5tb2RpZmllZCBhY3Rpdml0eSBleHRlbnNpb25zCi0KLSNDb25maWdQcm9jZXNzVmlld0RpYWxvZwotQ29uZmlnUHJvY2Vzc1ZpZXdEaWFsb2dfTmFtZVBhdHRlcm49TmFtZSBwYXR0ZXJucyAobWF0Y2hpbmcgbmFtZXMgd2lsbCBiZSBzaG93bik6Ci1zaG93SW5SZXNvdXJjZU5hdmlnYXRvckFjdGlvbl9sYWJlbD0mU2hvdyBpbiBSZXNvdXJjZSBOYXZpZ2F0b3IKLUNvbmZpZ1Byb2Nlc3NWaWV3RGlhbG9nX1BhdHRlcm49UGF0dGVybnMgYXJlIHNlcGFyYXRlZCBieSBjb21tYSwgd2hlcmUgKj1hbnkgc3RyaW5nLCA/PWFueSBjaGFyYWN0ZXIKLWVycl9wcm9jZXNzaW5nX2ZpbGVfZGVzY3JpcHRpb249SVVQQTAwMjlFOiBBbiBlcnJvciBvY2N1cnJlZCB3aGlsZSBwcm9jZXNzaW5nIHRoZSBzZWxlY3RlZCBmaWxlLiBDbGljayBEZXRhaWxzIGZvciBtb3JlIGluZm9ybWF0aW9uLgotQ29uZmlnUHJvY2Vzc1ZpZXdEaWFsb2dfQ2F0ZWdvcnlUeXBlPUNhdGVnb3J5IFR5cGUgOgotQ29uZmlnUHJvY2Vzc1ZpZXdEaWFsb2dfQnJpZWZEZXNjcmlwdGlvbj1CcmllZiBEZXNjcmlwdGlvbjoKLUNvbmZpZ1Byb2Nlc3NWaWV3RGlhbG9nX1NlbGVjdENhdGVnb3JpZXM9U2VsZWN0IENhdGVnb3JpZXMKLQotI2xvZyBtZXNzYWdlcwotY2hlYXRzaGVldF9sb2FkX2ZhaWx1cmVfbG9nX21zZz1GYWlsZWQgdG8gb3BlbiB0aGUgcmVxdWVzdGVkIGNoZWF0c2hlZXQ6IAotCi1uZXdDb25maWd1cmF0aW9uV2lyYXpkX2NyZWF0ZUVycm9yPUlVUEEwMDM1RTogVGhlIGNvbmZpZ3VyYXRpb24gY2Fubm90IGJlIGNyZWF0ZWQgc3VjY2Vzc2Z1bGx5Ci1uZXdQbHVnaW5XaXphcmRfY3JlYXRlRXJyb3I9SVVQQTAwMzZFOiBUaGUgcGx1Zy1pbiBjYW5ub3QgYmUgY3JlYXRlZCBzdWNjZXNzZnVsbHkKLWVycm9yRGlhbG9nX21vdmVFcnJvcj1JVVBBMDAzN0U6IFRoZSBlbGVtZW50IGNhbm5vdCBiZSBtb3ZlZCBzdWNjZXNzZnVsbHkKLXJlbmFtZURpYWxvZ19yZW5hbWVFcnJvcj1JVVBBMDAzOEU6IFRoZSBlbGVtZW50IGNhbm5vdCBiZSByZW5hbWVkIHN1Y2Nlc3NmdWxseQotZXJyb3JEaWFsb2dfY3JlYXRlRXJyb3I9SVVQQTAwMzlFOiBUaGUgZWxlbWVudCBjYW5ub3QgYmUgY3JlYXRlZCBzdWNjZXNzZnVsbHkKLWR1cGxpY2F0ZVBsdWdpbk5hbWVFcnJvcl9tc2c9SVVQQTAxMDFFOiBUaGUgbmFtZSAnJ3swfScnIGFscmVhZHkgZXhpc3RzLiBFbnRlciBhIGRpZmZlcmVudCBuYW1lIGFuZCB0cnkgYWdhaW4uCi0KLSNOZXcgU3RyaW5ncyBmb3IgUHJvY2Vzc0VkaXRvciBDb250ZXh0IG1lbnUgZGlhZ3JhbSBpbWFnZXMKLVByb2Nlc3NFZGl0b3JfQWN0aW9uX0FkZEFESW1hZ2U9QXNzaWduIEFEIEltYWdlLi4uCi1Qcm9jZXNzRWRpdG9yX3JlZnJlc2hFcnJvclRpdGxlPVJlZnJlc2ggRXJyb3IKLVByb2Nlc3NFZGl0b3JfcmVmcmVzaEVycm9yTXNnPUVycm9yIHJlZnJlc2hpbmcgZWRpdG9yCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9BZGRBRERJbWFnZT1Bc3NpZ24gQUREIEltYWdlLi4uCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9BZGRXUERJbWFnZT1Bc3NpZ24gV1BEIEltYWdlLi4uCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9Vc2VBREltYWdlSW5QdWJsaXNoaW5nPVVzZSBBRCBJbWFnZSBpbiBQdWJsaXNoaW5nCi1Qcm9jZXNzRWRpdG9yX3Byb21wdFRvRGVsZXRlQmVmb3JlU3VwcHJlc3M9VGhlIHN1cHByZXNzZWQgZGVzY3JpcHRvcnMgbGlzdGVkIGluIERldGFpbHMgbXVzdCBiZSBkZWxldGVkIHRvIGF2b2lkIGR1cGxpY2F0aW9uIGFmdGVyIHN1cHByZXNzaW5nIHRoZSBzZWxlY3RlZCBlbGVtZW50cy4gQ2xpY2sgT0sgaWYgeW91IHdhbnQgdG8gZGVsZXRlIHRoZW0gYW5kIGNvbnRpbnVlLgotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fVXNlQURESW1hZ2VJblB1Ymxpc2hpbmc9VXNlIEFERCBJbWFnZSBpbiBQdWJsaXNoaW5nCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9Vc2VXUERJbWFnZUluUHVibGlzaGluZz1Vc2UgV1BEIEltYWdlIGluIFB1Ymxpc2hpbmcKLVByb2Nlc3NFZGl0b3JfRGlhZ3JhbUltYWdlX0lucHV0RGlhbG9nX2luaXRpYWxWYWx1ZT1JbWFnZSBQYXRoCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9TaG93TGlua2VkRWxlbWVudGluTGlicmFyeVZpZXc9UyZob3cgTGlua2VkIEVsZW1lbnQgaW4gTGlicmFyeSBWaWV3Ci1Qcm9jZXNzRWRpdG9yX3VwZGF0ZVN1cHByZXNzaW9uRnJvbUJhc2VBY3Rpb25fbGFiZWw9VXBkYXRlIFN1cHByZXNzaW9uIGZyb20gJkJhc2UKLVByb2Nlc3NFZGl0b3JfQ29udGV4dE1lbnVfRGlhZ3JhbUltYWdlcz1EaWFncmFtIEltYWdlcwotCi0jU3RyaW5ncyBmb3Igc3luY2hyb25pemF0aW9uIHdpemFyZCBvbiBwcm9jZXNzIGVkaXRvcidzIEJTCi1zeW5jaHJvbml6YXRpb25XaXphcmRfZGVzY3JpcHRpb25QYWdlX3RpdGxlPVN5bmNocm9uaXphdGlvbiBEZXNjcmlwdGlvbgotc3luY2hyb25pemF0aW9uV2l6YXJkX2Rlc2NyaXB0aW9uUGFnZV90ZXh0PVJlYWQgdGhlIGluZm9ybWF0aW9uIGJlbG93IFwKLXRoYXQgZXhwbGFpbnMgd2hhdCBjdXN0b20gc3luY2hyb25pemF0aW9uIHdpbGwgYWNjb21wbGlzaC4KLXN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3RDb25maWdQYWdlX3RpdGxlPVNlbGVjdCBDb25maWd1cmF0aW9uCi1zeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0Q29uZmlnUGFnZV90ZXh0PVNlbGVjdCB0aGUgY29uZmlndXJhdGlvbiBcCi10aGF0IHlvdSB3YW50IHRvIHVzZSBmb3IgdGhlIHN5bmNocm9uaXphdGlvbi4gIFlvdXIgc2VsZWN0aW9uIGRldGVybWluZXMgd2hpY2ggY29udHJpYnV0aW9ucyBhbmQgcmVwbGFjZW1lbnRzIHdpbGwgYmUgdXNlZCBmb3IgdGhlIHN5bmNocm9uaXphdGlvbi4KLXN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3RDb25maWdQYWdlX2NvbmZpZ0xhYmVsPUNvbmZpZ3VyYXRpb246Ci1zeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0RGV0YWlsc1BhZ2VfdGl0bGU9U2VsZWN0IFByb3BlcnRpZXMgdG8gU3luY2hyb25pemUKLXN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3REZXRhaWxzUGFnZV9wcm9wZXJ0aWVzX2xhYmxlPVByb3BlcnRpZXMKLXN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3REZXRhaWxzUGFnZV9uYW1lX2xhYmxlPU5hbWUKLXN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3REZXRhaWxzUGFnZV9wcmVzZW50YXRpb25OYW1lX2xhYmxlPVByZXNlbnRhdGlvbiBOYW1lCi1zeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0RGV0YWlsc1BhZ2VfYnJpZWZEZXNjX2xhYmxlPUJyaWVmIERlc2NyaXB0aW9uCi1zeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0RGV0YWlsc1BhZ2Vfb3B0aW9uYWxJbm91dHNfbGFiZWw9T3B0aW9uYWwgSW5wdXRzCi1zeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0RGV0YWlsc1BhZ2VfbWFuZGF0b3J5SW5wdXRzX2xhYmxlPU1hbmRhdG9yeSBJbnB1dHMKLXN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3REZXRhaWxzUGFnZV9vdXRwdXRzX2xhYmVsPU91dHB1dHMKLXN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3REZXRhaWxzUGFnZV9wcmltYXJ5UGVyZm9ybWVyX2xhYmVsPVByaW1hcnkgUGVyZm9ybWVyCi1zeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0RGV0YWlsc1BhZ2VfYWRkblBlcmZvcm1lcnNfbGFibGU9QWRkaXRpb25hbCBQZXJmb3JtZXJzCi1zeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0RGV0YWlsc1BhZ2VfcmVzcG9uc2libGVSb2xlc19sYWJsZT1SZXNwb25zaWJsZSBSb2xlcwotc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdERldGFpbHNQYWdlX2NvbnRuQXJ0aWZhY3RzX2xhYmVsPUNvbnRhaW5lZCBBcnRpZmFjdHMKLXN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3REZXRhaWxzUGFnZV9kaWx2ZWRQYXJ0c19sYWJlbD1EZWxpdmVyYWJsZSBQYXJ0cwotc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdERldGFpbHNQYWdlX3NlbFN0ZXBzX2xhYmVsPVN0ZXBzIFNlbGVjdGlvbgotc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdERldGFpbHNQYWdlX3NlbEd1aWRhbmNlX2xhYmVsPUd1aWRhbmNlCi1zeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0RGV0YWlsc1BhZ2VfdGV4dD1DaG9vc2UgdGhlIHByb3BlcnRpZXMgb2YgXAotdGhlIG1ldGhvZCBjb250ZW50IHRoYXQgeW91IHdhbnQgdG8gYmUgY29uc2lkZXJlZCBmb3Igc3luY2hyb25pemF0aW9uLgotc3luY2hyb25pemF0aW9uV2l6YXJkX3ByZXZpZXdQYWdlX3RpdGxlPVN5bmNocm9uaXphdGlvbiBQcmV2aWV3Ci1zeW5jaHJvbml6YXRpb25XaXphcmRfcHJldmlld1BhZ2VfdGV4dD1SZXZpZXcgdGhlIHByb3Bvc2VkIHN5bmNocm9uaXphdGlvbiBkZXRhaWxzIGJlbG93Lgotc2VsZWN0RWRpdG9yc1RvRGlzY2FyZENvbmZsaWN0Q2hhbmdlcz1UaGVyZSBhcmUgdW5zYXZlZCBjaGFuZ2VzIHRoYXQgY29uZmxpY3Qgd2l0aCBjaGFuZ2VzIG1hZGUgb3V0c2lkZSB0aGUgZWRpdG9ycy5cblNlbGVjdCB0aGUgZWRpdG9ycyB5b3Ugd2lzaCB0byBkaXNjYXJkIHRoZWlyIGNoYW5nZXMuCi1zeW5jaHJvbml6YXRpb25XaXphcmRfdGl0bGVfdGV4dD1TeW5jaHJvbml6YXRpb24gV2l6YXJkCi1zeW5jaHJvbml6YXRpb25XaXphcmRfZGVzY3JpcHRpb25QYWdlX2V4cGxhaW5UZXh0PVRoaXMgd2l6YXJkIHN1cHBvcnRzIHlvdSBpbiByZWZyZXNoaW5nIFwKLXRoZSBzZWxlY3RlZCBkZXNjcmlwdG9ycyBvciBhbGwgZGVzY3JpcHRvcnMgYmVsb3cgdGhlIHNlbGVjdGVkIGFjdGl2aXRpZXMgdGhhdCBoYXZlIGJlZW4gbWFya2VkIGFzIFwKLSJTeW5jaHJvbml6ZSB3aXRoIFNvdXJjZSIgaW4gdGhlIEdlbmVyYWwgdGFiIG9mIHRoZWlyIFByb3BlcnRpZXMgdmlldy4gIE9ubHkgdGhlIHByb3BlcnRpZXMgdGhhdCB5b3UgXAotc2VsZWN0IGluIHRoaXMgd2l6YXJkIGFyZSByZWZyZXNoZWQgaW4gdGhlIGRlc2NyaXB0b3JzLiAgWW91IGNhbiBhbHNvIHNlbGVjdCBhbnkgdmFsaWQgY29uZmlndXJhdGlvbiBcCi1mb3IgeW91ciBwcm9jZXNzIHRvIGJlIHVzZWQgd2hlbiBjb21wdXRpbmcgdGhlIHJlZnJlc2guICBOb3RlIHRoYXQgdGhlIHdpemFyZCB3aWxsIG5vdCB1cGRhdGUgYW55IFwKLWR5bmFtaWNhbGx5IGxpbmtlZCAoZ3JlZW4gaXRhbGljKSBkZXNjcmlwdG9ycy4KLQotb3BlblJURT1PcGVuIHJpY2ggdGV4dCBlZGl0b3IKLWNsb3NlUlRFPUNsb3NlIHJpY2ggdGV4dCBlZGl0b3IKLQotI05ldyBTdHJpbmdzCi1yb2xlc2V0c19ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uPU1hbmFnZSB0aGUgZ3VpZGFuY2VzIHRoYXQgYmVsb25nIHRvIHRoaXMgcm9sZSBzZXQuCi1kaXNjaXBsaW5lc19ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uPU1hbmFnZSB0aGUgZ3VpZGFuY2VzIHRoYXQgYmVsb25nIHRvIHRoaXMgZGlzY2lwbGluZS4KLXdvcmtwcm9kdWN0dHlwZXNfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbj1NYW5hZ2UgdGhlIGd1aWRhbmNlcyB0aGF0IGJlbG9uZyB0byB0aGlzIHdvcmsgcHJvZHVjdCBraW5kLgotZG9tYWluc19ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uPU1hbmFnZSB0aGUgZ3VpZGFuY2VzIHRoYXQgYmVsb25nIHRvIHRoaXMgZG9tYWluLgotdG9vbHNfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbj1NYW5hZ2UgdGhlIGd1aWRhbmNlcyB0aGF0IGJlbG9uZyB0byB0aGlzIHRvb2wuCi1jdXN0b21jYXRlZ29yeV9ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uPU1hbmFnZSB0aGUgZ3VpZGFuY2VzIHRoYXQgYmVsb25nIHRvIHRoaXMgY3VzdG9tIGNhdGVnb3J5LgotCi1jb25jZXB0X2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb249TWFuYWdlIHRoZSBndWlkYW5jZXMgdGhhdCBiZWxvbmcgdG8gdGhpcyBjb25jZXB0LgotY2hlY2tsaXN0X2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb249TWFuYWdlIHRoZSBndWlkYW5jZXMgdGhhdCBiZWxvbmcgdG8gdGhpcyBjaGVja2xpc3QuCi1leGFtcGxlX2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb249TWFuYWdlIHRoZSBndWlkYW5jZXMgdGhhdCBiZWxvbmcgdG8gdGhpcyBleGFtcGxlLgotZ3VpZGVsaW5lX2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb249TWFuYWdlIHRoZSBndWlkYW5jZXMgdGhhdCBiZWxvbmcgdG8gdGhpcyBndWlkZWxpbmUuCi1yb2FkbWFwX2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb249TWFuYWdlIHRoZSBndWlkYW5jZXMgdGhhdCBiZWxvbmcgdG8gdGhpcyByb2FkbWFwLgotcmV1c2FibGVhc3NldF9ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uPU1hbmFnZSB0aGUgZ3VpZGFuY2VzIHRoYXQgYmVsb25nIHRvIHRoaXMgcmV1c2FibGUgYXNzZXQuCi1zdXBwb3J0aW5nbWF0ZXJpYWxfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbj1NYW5hZ2UgdGhlIGd1aWRhbmNlcyB0aGF0IGJlbG9uZyB0byB0aGlzIHN1cHBvcnRpbmcgbWF0ZXJpYWwuCi1yZXBvcnRfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbj1NYW5hZ2UgdGhlIGd1aWRhbmNlcyB0aGF0IGJlbG9uZyB0byB0aGlzIHJlcG9ydC4KLXByYWN0aWNlX2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb249TWFuYWdlIHRoZSBndWlkYW5jZXMgdGhhdCBiZWxvbmcgdG8gdGhpcyBwcmFjdGljZS4KLXRlbXBsYXRlX2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb249TWFuYWdlIHRoZSBndWlkYW5jZXMgdGhhdCBiZWxvbmcgdG8gdGhpcyB0ZW1wbGF0ZS4KLXRlcm1kZWZpbml0aW9uX2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb249TWFuYWdlIHRoZSBndWlkYW5jZXMgdGhhdCBiZWxvbmcgdG8gdGhpcyB0ZXJtIGRlZmluaXRpb24uCi10b29sbWVudG9yX2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb249TWFuYWdlIHRoZSBndWlkYW5jZXMgdGhhdCBiZWxvbmcgdG8gdGhpcyB0b29sIG1lbnRvci4KLXdoaXRlcGFwZXJfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbj1NYW5hZ2UgdGhlIGd1aWRhbmNlcyB0aGF0IGJlbG9uZyB0byB0aGlzIHdoaXRlcGFwZXIuCi1lc3RpbWF0aW9uY29uc2lkZXJhdGlvbl9ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uPU1hbmFnZSB0aGUgZ3VpZGFuY2VzIHRoYXQgYmVsb25nIHRvIHRoaXMgZXN0aW1hdGlvbiBjb25zaWRlcmF0aW9uLgotCi0jTmV3IFN0cmluZyBTZWN0aW9uIERlc2NyaXB0aW9uCi1yb2xlX2RldGFpbFNlY3Rpb25fZGVzYz1Qcm92aWRlIGRldGFpbGVkIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgcm9sZS4KLXJvbGVfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9UHJvdmlkZSBnZW5lcmFsIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgcm9sZS4KLXJvbGVfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9U3BlY2lmeSBob3cgdGhpcyByb2xlIHJlbGF0ZXMgdG8gYW5vdGhlciByb2xlLgotcm9sZV92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYz1Qcm92aWRlIHZlcnNpb24gaW5mb3JtYXRpb24gYWJvdXQgdGhpcyByb2xlLgotCi10YXNrX2RldGFpbFNlY3Rpb25fZGVzYz1Qcm92aWRlIGRldGFpbGVkIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgdGFzay4KLXRhc2tfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9UHJvdmlkZSBnZW5lcmFsIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgdGFzay4KLXRhc2tfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9U3BlY2lmeSBob3cgdGhpcyB0YXNrIHJlbGF0ZXMgdG8gYW5vdGhlciB0YXNrLgotdGFza192ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYz1Qcm92aWRlIHZlcnNpb24gaW5mb3JtYXRpb24gYWJvdXQgdGhpcyB0YXNrLgotCi1hcnRpZmFjdF9kZXRhaWxTZWN0aW9uX2Rlc2M9UHJvdmlkZSBkZXRhaWxlZCBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGFydGlmYWN0LgotYXJ0aWZhY3RfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9UHJvdmlkZSBnZW5lcmFsIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgYXJ0aWZhY3QuCi1hcnRpZmFjdF9pY29uU2VjdGlvbl9kZXNjPUN1c3RvbWl6ZSB0aGUgaWNvbnMgZm9yIHRoaXMgYXJ0aWZhY3QuCi1hcnRpZmFjdF9ub3RhdGlvblNlY3Rpb25fZGVzYz1Qcm92aWRlIGRlbGl2ZXJ5IGluZm9ybWF0aW9uIGFib3V0IHRoaXMgYXJ0aWZhY3QuCi1hcnRpZmFjdF90YWlsb3JpbmdTZWN0aW9uX2Rlc2M9UHJvdmlkZSB0YWlsb3JpbmcgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBhcnRpZmFjdC4KLWFydGlmYWN0X3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPVNwZWNpZnkgaG93IHRoaXMgYXJ0aWZhY3QgcmVsYXRlcyB0byBhbm90aGVyIGFydGlmYWN0LgotYXJ0aWZhY3RfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9UHJvdmlkZSB2ZXJzaW9uIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgYXJ0aWZhY3QuCi0KLW91dGNvbWVfZGV0YWlsU2VjdGlvbl9kZXNjPVByb3ZpZGUgZGV0YWlsZWQgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBvdXRjb21lLgotb3V0Y29tZV9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1Qcm92aWRlIGdlbmVyYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBvdXRjb21lLgotb3V0Y29tZV9pY29uU2VjdGlvbl9kZXNjPUN1c3RvbWl6ZSB0aGUgaWNvbnMgZm9yIHRoaXMgb3V0Y29tZS4KLW91dGNvbWVfbm90YXRpb25TZWN0aW9uX2Rlc2M9UHJvdmlkZSBkZWxpdmVyeSBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIG91dGNvbWUuCi1vdXRjb21lX3RhaWxvcmluZ1NlY3Rpb25fZGVzYz1Qcm92aWRlIHRhaWxvcmluZyBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIG91dGNvbWUuCi1vdXRjb21lX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPVNwZWNpZnkgaG93IHRoaXMgb3V0Y29tZSByZWxhdGVzIHRvIGFub3RoZXIgb3V0Y29tZS4KLW91dGNvbWVfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9UHJvdmlkZSB2ZXJzaW9uIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgb3V0Y29tZS4KLQotZGVsaXZlcmFibGVfZGV0YWlsU2VjdGlvbl9kZXNjPVByb3ZpZGUgZGV0YWlsZWQgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBkZWxpdmVyYWJsZS4KLWRlbGl2ZXJhYmxlX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPVByb3ZpZGUgZ2VuZXJhbCBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGRlbGl2ZXJhYmxlLgotZGVsaXZlcmFibGVfaWNvblNlY3Rpb25fZGVzYz1DdXN0b21pemUgdGhlIGljb25zIGZvciB0aGlzIGRlbGl2ZXJhYmxlLgotZGVsaXZlcmFibGVfbm90YXRpb25TZWN0aW9uX2Rlc2M9UHJvdmlkZSBkZWxpdmVyeSBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGRlbGl2ZXJhYmxlLgotZGVsaXZlcmFibGVfdGFpbG9yaW5nU2VjdGlvbl9kZXNjPVByb3ZpZGUgdGFpbG9yaW5nIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgZGVsaXZlcmFibGUuCi1kZWxpdmVyYWJsZV92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1TcGVjaWZ5IGhvdyB0aGlzIGRlbGl2ZXJhYmxlIHJlbGF0ZXMgdG8gYW5vdGhlciBkZWxpdmVyYWJsZS4KLWRlbGl2ZXJhYmxlX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPVByb3ZpZGUgdmVyc2lvbiBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGRlbGl2ZXJhYmxlLgotCi1kaXNjaXBsaW5lX2RldGFpbFNlY3Rpb25fZGVzYz1Qcm92aWRlIGRldGFpbGVkIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgZGlzY2lwbGluZS4KLWRpc2NpcGxpbmVfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9UHJvdmlkZSBnZW5lcmFsIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgZGlzY2lwbGluZS4KLWRpc2NpcGxpbmVfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9U3BlY2lmeSBob3cgdGhpcyBkaXNjaXBsaW5lIHJlbGF0ZXMgdG8gYW5vdGhlciBkaXNjaXBsaW5lLgotZGlzY2lwbGluZV92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYz1Qcm92aWRlIHZlcnNpb24gaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBkaXNjaXBsaW5lLgotCi1kb21haW5fZGV0YWlsU2VjdGlvbl9kZXNjPVByb3ZpZGUgZGV0YWlsZWQgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBkb21haW4uCi1kb21haW5fZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9UHJvdmlkZSBnZW5lcmFsIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgZG9tYWluLgotZG9tYWluX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPVNwZWNpZnkgaG93IHRoaXMgZG9tYWluIHJlbGF0ZXMgdG8gYW5vdGhlciBkb21haW4uCi1kb21haW5fdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9UHJvdmlkZSB2ZXJzaW9uIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgZG9tYWluLgotCi13b3JrcHJvZHVjdHR5cGVfZGV0YWlsU2VjdGlvbl9kZXNjPVByb3ZpZGUgZGV0YWlsZWQgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyB3b3JrIHByb2R1Y3Qga2luZC4KLXdvcmtwcm9kdWN0dHlwZV9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1Qcm92aWRlIGdlbmVyYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyB3b3JrIHByb2R1Y3Qga2luZC4KLXdvcmtwcm9kdWN0dHlwZV92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1TcGVjaWZ5IGhvdyB0aGlzIHdvcmsgcHJvZHVjdCBraW5kIHJlbGF0ZXMgdG8gYW5vdGhlciB3b3JrIHByb2R1Y3Qga2luZC4KLXdvcmtwcm9kdWN0dHlwZV92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYz1Qcm92aWRlIHZlcnNpb24gaW5mb3JtYXRpb24gYWJvdXQgdGhpcyB3b3JrIHByb2R1Y3Qga2luZC4KLQotcm9sZXNldF9kZXRhaWxTZWN0aW9uX2Rlc2M9UHJvdmlkZSBkZXRhaWxlZCBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIHJvbGUgc2V0Lgotcm9sZXNldF9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1Qcm92aWRlIGdlbmVyYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyByb2xlIHNldC4KLXJvbGVzZXRfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9U3BlY2lmeSBob3cgdGhpcyByb2xlIHNldCByZWxhdGVzIHRvIGFub3RoZXIgcm9sZSBzZXQuCi1yb2xlc2V0X3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPVByb3ZpZGUgdmVyc2lvbiBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIHJvbGUgc2V0LgotCi10b29sX2RldGFpbFNlY3Rpb25fZGVzYz1Qcm92aWRlIGRldGFpbGVkIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgdG9vbC4KLXRvb2xfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9UHJvdmlkZSBnZW5lcmFsIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgdG9vbC4KLXRvb2xfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9U3BlY2lmeSBob3cgdGhpcyB0b29sIHJlbGF0ZXMgdG8gYW5vdGhlciB0b29sLgotdG9vbF92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYz1Qcm92aWRlIHZlcnNpb24gaW5mb3JtYXRpb24gYWJvdXQgdGhpcyB0b29sLgotCi1jb25jZXB0X2RldGFpbFNlY3Rpb25fZGVzYz1Qcm92aWRlIGRldGFpbGVkIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgY29uY2VwdC4KLWNvbmNlcHRfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9UHJvdmlkZSBnZW5lcmFsIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgY29uY2VwdC4KLWNvbmNlcHRfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9U3BlY2lmeSBob3cgdGhpcyBjb25jZXB0IHJlbGF0ZXMgdG8gYW5vdGhlciBjb25jZXB0LgotY29uY2VwdF92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYz1Qcm92aWRlIHZlcnNpb24gaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBjb25jZXB0LgotCi1jaGVja2xpc3RfZGV0YWlsU2VjdGlvbl9kZXNjPVByb3ZpZGUgZGV0YWlsZWQgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBjaGVja2xpc3QuCi1jaGVja2xpc3RfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9UHJvdmlkZSBnZW5lcmFsIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgY2hlY2tsaXN0LgotY2hlY2tsaXN0X3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPVNwZWNpZnkgaG93IHRoaXMgY2hlY2tsaXN0IHJlbGF0ZXMgdG8gYW5vdGhlciBjaGVja2xpc3QuCi1jaGVja2xpc3RfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9UHJvdmlkZSB2ZXJzaW9uIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgY2hlY2tsaXN0LgotCi1leGFtcGxlX2RldGFpbFNlY3Rpb25fZGVzYz1Qcm92aWRlIGRldGFpbGVkIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgZXhhbXBsZS4KLWV4YW1wbGVfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9UHJvdmlkZSBnZW5lcmFsIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgZXhhbXBsZS4KLWV4YW1wbGVfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9U3BlY2lmeSBob3cgdGhpcyBleGFtcGxlIHJlbGF0ZXMgdG8gYW5vdGhlciBleGFtcGxlLgotZXhhbXBsZV92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYz1Qcm92aWRlIHZlcnNpb24gaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBleGFtcGxlLgotCi1ndWlkZWxpbmVfZGV0YWlsU2VjdGlvbl9kZXNjPVByb3ZpZGUgZGV0YWlsZWQgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBndWlkZWxpbmUuCi1ndWlkZWxpbmVfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9UHJvdmlkZSBnZW5lcmFsIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgZ3VpZGVsaW5lLgotZ3VpZGVsaW5lX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPVNwZWNpZnkgaG93IHRoaXMgZ3VpZGVsaW5lIHJlbGF0ZXMgdG8gYW5vdGhlciBndWlkZWxpbmUuCi1ndWlkZWxpbmVfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9UHJvdmlkZSB2ZXJzaW9uIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgZ3VpZGVsaW5lLgotCi1lc3RpbWF0aW9uY29uc2lkZXJhdGlvbl9kZXRhaWxTZWN0aW9uX2Rlc2M9UHJvdmlkZSBkZXRhaWxlZCBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGVzdGltYXRpb24gY29uc2lkZXJhdGlvbi4KLWVzdGltYXRpb25jb25zaWRlcmF0aW9uX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPVByb3ZpZGUgZ2VuZXJhbCBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGVzdGltYXRpb24gY29uc2lkZXJhdGlvbi4KLWVzdGltYXRpb25jb25zaWRlcmF0aW9uX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPVNwZWNpZnkgaG93IHRoaXMgZXN0aW1hdGlvbiBjb25zaWRlcmF0aW9uIHJlbGF0ZXMgdG8gYW5vdGhlciBlc3RpbWF0aW9uIGNvbnNpZGVyYXRpb24uCi1lc3RpbWF0aW9uY29uc2lkZXJhdGlvbl92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYz1Qcm92aWRlIHZlcnNpb24gaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBlc3RpbWF0aW9uIGNvbnNpZGVyYXRpb24uCi0KLXByYWN0aWNlX2RldGFpbFNlY3Rpb25fZGVzYz1Qcm92aWRlIGRldGFpbGVkIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgcHJhY3RpY2UuCi1wcmFjdGljZV9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1Qcm92aWRlIGdlbmVyYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBwcmFjdGljZS4KLXByYWN0aWNlX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPVNwZWNpZnkgaG93IHRoaXMgcHJhY3RpY2UgcmVsYXRlcyB0byBhbm90aGVyIHByYWN0aWNlLgotcHJhY3RpY2VfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9UHJvdmlkZSB2ZXJzaW9uIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgcHJhY3RpY2UuCi0KLXJlcG9ydF9kZXRhaWxTZWN0aW9uX2Rlc2M9UHJvdmlkZSBkZXRhaWxlZCBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIHJlcG9ydC4KLXJlcG9ydF9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1Qcm92aWRlIGdlbmVyYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyByZXBvcnQuCi1yZXBvcnRfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9U3BlY2lmeSBob3cgdGhpcyByZXBvcnQgcmVsYXRlcyB0byBhbm90aGVyIHJlcG9ydC4KLXJlcG9ydF92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYz1Qcm92aWRlIHZlcnNpb24gaW5mb3JtYXRpb24gYWJvdXQgdGhpcyByZXBvcnQuCi0KLXJlc3VhYmxlYXNzZXRfZGV0YWlsU2VjdGlvbl9kZXNjPVByb3ZpZGUgZGV0YWlsZWQgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyByZXVzYWJsZSBhc3NldC4KLXJlc3VhYmxlYXNzZXRfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9UHJvdmlkZSBnZW5lcmFsIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgcmV1c2FibGUgYXNzZXQuCi1yZXN1YWJsZWFzc2V0X3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPVNwZWNpZnkgaG93IHRoaXMgcmV1c2FibGUgYXNzZXQgcmVsYXRlcyB0byBhbm90aGVyIHJldXNhYmxlIGFzc2V0LgotcmVzdWFibGVhc3NldF92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYz1Qcm92aWRlIHZlcnNpb24gaW5mb3JtYXRpb24gYWJvdXQgdGhpcyByZXVzYWJsZSBhc3NldC4KLQotcm9hZG1hcF9kZXRhaWxTZWN0aW9uX2Rlc2M9UHJvdmlkZSBkZXRhaWxlZCBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIHJvYWRtYXAuCi1yb2FkbWFwX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPVByb3ZpZGUgZ2VuZXJhbCBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIHJvYWRtYXAuCi1yb2FkbWFwX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPVNwZWNpZnkgaG93IHRoaXMgcm9hZG1hcCByZWxhdGVzIHRvIGFub3RoZXIgcm9hZG1hcC4KLXJvYWRtYXBfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9UHJvdmlkZSB2ZXJzaW9uIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgcm9hZG1hcC4KLQotc3VwcG9ydGluZ21hdGVyaWFsX2RldGFpbFNlY3Rpb25fZGVzYz1Qcm92aWRlIGRldGFpbGVkIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgc3VwcG9ydGluZyBtYXRlcmlhbC4KLXN1cHBvcnRpbmdtYXRlcmlhbF9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1Qcm92aWRlIGdlbmVyYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBzdXBwb3J0aW5nIG1hdGVyaWFsLgotc3VwcG9ydGluZ21hdGVyaWFsX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPVNwZWNpZnkgaG93IHRoaXMgc3VwcG9ydGluZyBtYXRlcmlhbCByZWxhdGVzIHRvIGFub3RoZXIgc3VwcG9ydGluZyBtYXRlcmlhbC4KLXN1cHBvcnRpbmdtYXRlcmlhbF92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYz1Qcm92aWRlIHZlcnNpb24gaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBzdXBwb3J0aW5nIG1hdGVyaWFsLgotCi10ZW1wbGF0ZV9kZXRhaWxTZWN0aW9uX2Rlc2M9UHJvdmlkZSBkZXRhaWxlZCBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIHRlbXBsYXRlLgotdGVtcGxhdGVfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9UHJvdmlkZSBnZW5lcmFsIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgdGVtcGxhdGUuCi10ZW1wbGF0ZV92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1TcGVjaWZ5IGhvdyB0aGlzIHRlbXBsYXRlIHJlbGF0ZXMgdG8gYW5vdGhlciB0ZW1wbGF0ZS4KLXRlbXBsYXRlX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPVByb3ZpZGUgdmVyc2lvbiBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIHRlbXBsYXRlLgotCi10ZXJtZGVmaW5pdGlvbl9kZXRhaWxTZWN0aW9uX2Rlc2M9UHJvdmlkZSBkZXRhaWxlZCBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIHRlcm0gZGVmaW5pdGlvbi4KLXRlcm1kZWZpbml0aW9uX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPVByb3ZpZGUgZ2VuZXJhbCBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIHRlcm0gZGVmaW5pdGlvbi4KLXRlcm1kZWZpbml0aW9uX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPVNwZWNpZnkgaG93IHRoaXMgdGVybSBkZWZpbml0aW9uIHJlbGF0ZXMgdG8gYW5vdGhlciB0ZXJtIGRlZmluaXRpb24uCi10ZXJtZGVmaW5pdGlvbl92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYz1Qcm92aWRlIHZlcnNpb24gaW5mb3JtYXRpb24gYWJvdXQgdGhpcyB0ZXJtIGRlZmluaXRpb24uCi0KLXRvb2xtZW50b3JfZGV0YWlsU2VjdGlvbl9kZXNjPVByb3ZpZGUgZGV0YWlsZWQgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyB0b29sIG1lbnRvci4KLXRvb2xtZW50b3JfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9UHJvdmlkZSBnZW5lcmFsIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgdG9vbCBtZW50b3IuCi10b29sbWVudG9yX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPVNwZWNpZnkgaG93IHRoaXMgdG9vbCBtZW50b3IgcmVsYXRlcyB0byBhbm90aGVyIHRvb2wgbWVudG9yLgotdG9vbG1lbnRvcl92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYz1Qcm92aWRlIHZlcnNpb24gaW5mb3JtYXRpb24gYWJvdXQgdGhpcyB0b29sIG1lbnRvci4KLQotd2hpdGVwYXBlcl9kZXRhaWxTZWN0aW9uX2Rlc2M9UHJvdmlkZSBkZXRhaWxlZCBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIHdoaXRlcGFwZXIuCi13aGl0ZXBhcGVyX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPVByb3ZpZGUgZ2VuZXJhbCBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIHdoaXRlcGFwZXIuCi13aGl0ZXBhcGVyX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPVNwZWNpZnkgaG93IHRoaXMgd2hpdGVwYXBlciByZWxhdGVzIHRvIGFub3RoZXIgd2hpdGVwYXBlci4KLXdoaXRlcGFwZXJfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9UHJvdmlkZSB2ZXJzaW9uIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgd2hpdGVwYXBlci4KLQotZGlzY2lwbGluZWdyb3VwaW5nX2RldGFpbFNlY3Rpb25fZGVzYz1Qcm92aWRlIGRldGFpbGVkIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgZGlzY2lwbGluZSBncm91cGluZy4KLWRpc2NpcGxpbmVncm91cGluZ19nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1Qcm92aWRlIGdlbmVyYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBkaXNjaXBsaW5lIGdyb3VwaW5nLgotZGlzY2lwbGluZWdyb3VwaW5nX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPVNwZWNpZnkgaG93IHRoaXMgZGlzY2lwbGluZSBncm91cGluZyByZWxhdGVzIHRvIGFub3RoZXIgZGlzY2lwbGluZSBncm91cGluZy4KLWRpc2NpcGxpbmVncm91cGluZ192ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYz1Qcm92aWRlIHZlcnNpb24gaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBkaXNjaXBsaW5lIGdyb3VwaW5nLgotCi1yb2xlc2V0Z3JvdXBpbmdfZGV0YWlsU2VjdGlvbl9kZXNjPVByb3ZpZGUgZGV0YWlsZWQgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyByb2xlc2V0IGdyb3VwaW5nLgotcm9sZXNldGdyb3VwaW5nX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPVByb3ZpZGUgZ2VuZXJhbCBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIHJvbGVzZXQgZ3JvdXBpbmcuCi1yb2xlc2V0Z3JvdXBpbmdfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9U3BlY2lmeSBob3cgdGhpcyByb2xlc2V0IGdyb3VwaW5nIHJlbGF0ZXMgdG8gYW5vdGhlciByb2xlc2V0IGdyb3VwaW5nLgotcm9sZXNldGdyb3VwaW5nX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPVByb3ZpZGUgdmVyc2lvbiBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIHJvbGVzZXQgZ3JvdXBpbmcuCi0KLWN1c3RvbWNhdGVnb3J5X2RldGFpbFNlY3Rpb25fZGVzYz1Qcm92aWRlIGRldGFpbGVkIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgY3VzdG9tIGNhdGVnb3J5LgotY3VzdG9tY2F0ZWdvcnlfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9UHJvdmlkZSBnZW5lcmFsIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgY3VzdG9tIGNhdGVnb3J5LgotY3VzdG9tY2F0ZWdvcnlfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9U3BlY2lmeSBob3cgdGhpcyBjdXN0b20gY2F0ZWdvcnkgcmVsYXRlcyB0byBhbm90aGVyIGN1c3RvbSBjYXRlZ29yeS4KLWN1c3RvbWNhdGVnb3J5X3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPVByb3ZpZGUgdmVyc2lvbiBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGN1c3RvbSBjYXRlZ29yeS4KLWN1c3RvbWNhdGVnb3J5X0ljb25TZWN0aW9uX2Rlc2M9Q3VzdG9taXplIHRoZSBpY29ucyBmb3IgdGhpcyBjdXN0b20gY2F0ZWdvcnkuCi0KLXBsdWdpbl9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1Qcm92aWRlIGdlbmVyYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBtZXRob2QgcGx1Zy1pbi4KLXBsdWdpbl92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYz1Qcm92aWRlIHZlcnNpb24gaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBtZXRob2QgcGx1Zy1pbi4KLQotY29uY2VwdF9pY29uU2VjdGlvbl9kZXNjPUN1c3RvbWl6ZSB0aGUgaWNvbnMgZm9yIHRoaXMgY29uY2VwdC4KLWNoZWNrbGlzdF9pY29uU2VjdGlvbl9kZXNjPUN1c3RvbWl6ZSB0aGUgaWNvbnMgZm9yIHRoaXMgY2hlY2tsaXN0LgotdG9vbG1lbnRvcl9pY29uU2VjdGlvbl9kZXNjPUN1c3RvbWl6ZSB0aGUgaWNvbnMgZm9yIHRoaXMgdG9vbCBtZW50b3IuCi13aGl0ZXBhcGVyX2ljb25TZWN0aW9uX2Rlc2M9Q3VzdG9taXplIHRoZSBpY29ucyBmb3IgdGhpcyB3aGl0ZXBhcGVyLgotZXN0aW1hdGlvbmNvbnNpZGVyYXRpb25faWNvblNlY3Rpb25fZGVzYz1DdXN0b21pemUgdGhlIGljb25zIGZvciB0aGlzIGVzdGltYXRpb24gY29uc2lkZXJhdGlvbi4KLXRlcm1kZWZpbml0aW9uX2ljb25TZWN0aW9uX2Rlc2M9Q3VzdG9taXplIHRoZSBpY29ucyBmb3IgdGhpcyB0ZXJtIGRlZmluaXRpb24uCi10ZW1wbGF0ZV9pY29uU2VjdGlvbl9kZXNjPUN1c3RvbWl6ZSB0aGUgaWNvbnMgZm9yIHRoaXMgdGVtcGxhdGUuCi1yZXVzYWJsZWFzc2V0X2ljb25TZWN0aW9uX2Rlc2M9Q3VzdG9taXplIHRoZSBpY29ucyBmb3IgdGhpcyByZXVzYWJsZSBhc3NldC4KLXJlcG9ydF9pY29uU2VjdGlvbl9kZXNjPUN1c3RvbWl6ZSB0aGUgaWNvbnMgZm9yIHRoaXMgcmVwb3J0LgotcHJhY3RpY2VfaWNvblNlY3Rpb25fZGVzYz1DdXN0b21pemUgdGhlIGljb25zIGZvciB0aGlzIHByYWN0aWNlLgotZXhhbXBsZV9pY29uU2VjdGlvbl9kZXNjPUN1c3RvbWl6ZSB0aGUgaWNvbnMgZm9yIHRoaXMgZXhhbXBsZS4KLWd1aWRlbGluZV9pY29uU2VjdGlvbl9kZXNjPUN1c3RvbWl6ZSB0aGUgaWNvbnMgZm9yIHRoaXMgZ3VpZGVsaW5lLgotcm9hZG1hcF9pY29uU2VjdGlvbl9kZXNjPUN1c3RvbWl6ZSB0aGUgaWNvbnMgZm9yIHRoaXMgcm9hZG1hcC4KLXN1cHBvcnRpbmdtYXRlcmlhbF9pY29uU2VjdGlvbl9kZXNjPUN1c3RvbWl6ZSB0aGUgaWNvbnMgZm9yIHRoaXMgc3VwcG9ydGluZyBtYXRlcmlhbC4KLQotcHVibGlzaF9jYXRlZ29yaWVzX3RleHQ9UHVibGlzaCB0aGlzIGNhdGVnb3J5IHdpdGggdGhlIGNhdGVnb3JpemVkIG1ldGhvZCBlbGVtZW50cy4KLWVkaXRvcl9lcnJvcl9hY3RpdmF0ZWRfb3V0b2ZzeW5jX3RpdGxlPUZpbGUgQ2hhbmdlZAotZWRpdG9yX2Vycm9yX2FjdGl2YXRlZF9vdXRvZnN5bmNfbWVzc2FnZT1UaGUgZmlsZSBoYXMgYmVlbiBjaGFuZ2VkIG9uIHRoZSBmaWxlIHN5c3RlbS4gRG8geW91IHdhbnQgdG8gbG9hZCB0aGUgY2hhbmdlcz8KLQotYWN0aXZpdHlfdmFyaWFiaWxpdHlfZXJyb3JfdGl0bGU9QWN0aXZpdHkgVmFyaWFiaWxpdHkKLQotdmFyaWFiaWxpdHlfZXJyb3JfdGl0bGU9VmFyaWFiaWxpdHkKLQotY2lyY3VsYXJfZGVwZW5kZW5jeV9lcnJvcl90aXRsZT1DaXJjdWxhciBkZXBlbmRlbmN5Ci0KLWFwcGx5X3BhdHRlcm5fZXJyb3JfdGl0bGU9QXBwbHkgUGF0dGVybgotYXBwbHlfcGF0dGVybl9lcnJvcl9tc2c9QWN0aXZpdHkgJyd7MH0nJyBjYW5ub3QgYXBwbHkgcGF0dGVybiB3aXRoICcnezF9Jycgc2luY2UgaXQgd2lsbCByZXN1bHQgaW4gY2lyY3VsYXIgZGVwZW5kZW5jeS4KLQotI3NldCBkZWZhdWx0IGhpc3Rvcnkgc2l6ZQotZGVmYXVsdF9saXN0X2xlbmd0aF9sYWJlbD1QcmVmZXJlbmNlIGhpc3Rvcnkgc2l6ZToKLQotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fU3VwcHJlc3NfVGFzaz1TdXBwcmVzcyAmVGFza3MKLVByb2Nlc3NFZGl0b3JfQWN0aW9uX1JldmVhbF9UYXNrPVJldmVhbCAmVGFza3MKLQotI0V4dGVuZCBTZW1hbnRpY3MgcHJlZmVyZW5jZSBjaGVjawotZXh0ZW5kX3NlbWFudGljc19idXR0b25fdGV4dD1Vc2UgbmV3ICZFeHRlbmRzIHNlbWFudGljcwotZXh0ZW5kX3NlbWFudGljc190ZXh0PUV4dGVuZGluZyBlbGVtZW50cyBvdmVycmlkZSB0by1tYW55IHJlbGF0aW9uc2hpcHMgaW5zdGVhZCBvZiBhZGRpbmcgdG8gdGhlIGluaGVyaXRlZCBlbGVtZW50cy4KLQotIyBXb3JrIFByb2R1Y3Qgc2xvdHMKLXdvcmtwcm9kdWN0RGVzY3JpcHRpb25QYWdlX3Nsb3RfdGV4dD1JcyBXb3JrIFByb2R1Y3QgU2xvdAotc2xvdFNlY3Rpb25fbmFtZT1TbG90cyBJbmZvcm1hdGlvbgotc2xvdFNlY3Rpb25fZGVzYz1TZWxlY3QgdGhlIHNsb3RzIHRoYXQgdGhpcyB3b3JrIHByb2R1Y3QgZnVsZmlsbHMuCi1zbG90c0xhYmVsX3RleHQ9U2xvdHM6Ci1hcnRpZmFjdF9zbG90U2VjdGlvbl9kZXNjPVNlbGVjdCB0aGUgc2xvdHMgdGhhdCB0aGlzIGFydGlmYWN0IGZ1bGZpbGxzLgotb3V0Y29tZV9zbG90U2VjdGlvbl9kZXNjPVNlbGVjdCB0aGUgc2xvdHMgdGhhdCB0aGlzIG91dGNvbWUgZnVsZmlsbHMuCi1kZWxpdmVyYWJsZV9zbG90U2VjdGlvbl9kZXNjPVNlbGVjdCB0aGUgc2xvdHMgdGhhdCB0aGlzIGRlbGl2ZXJhYmxlIGZ1bGZpbGxzLgotc2xvdENvbmZpcm1EaWFsb2dfdGl0bGU9V29yayBQcm9kdWN0IFNsb3RzCi13cEZ1bEZpbGxzQ29uZmlybURpYWxvZ19tZXNzYWdlPVRoZXJlIGFyZSBzbG90cyBwcmVzZW50IHdoaWNoIHRoaXMgV29yayBwcm9kdWN0IGZ1bGZpbGxzLiBUaG9zZSByZWZlcmVuY2VzIHdpbGwgYmUgcmVtb3ZlZC4gRG8geW91IHdhbnQgdG8gY29udGludWU/Ci13cFNsb3RGdWxGaWxsc0NvbmZpcm1EaWFsb2dfbWVzc2FnZT1UaGlzIFdvcmsgUHJvZHVjdCBzbG90IGZ1bGZpbGxzIG90aGVyIHdvcmsgcHJvZHVjdC4gVGhvc2UgcmVmZXJlbmNlcyB3aWxsIGJlIHJlbW92ZWQuIERvIHlvdSB3YW50IHRvIGNvbnRpbnVlPwotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBFUEYgMS4yIE5MIHN0cmluZ3MuCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jIExheW91dCBBY3Rpb24gZ3JvdXAKLSMgTm90ZTogTW5lbW9uaWNzIGRvIG5vdCB3b3JrIG9uIHRoZXNlCi1MYXlvdXRBY3Rpb25Hcm91cF9sYWJlbD1NZXRob2QgUGx1Zy1pbiBQcmVzZW50YXRpb24KLUxheW91dEFjdGlvbkdyb3VwX2ZsYXRMYXlvdXRBY3Rpb25fbGFiZWw9RmxhdAotTGF5b3V0QWN0aW9uR3JvdXBfaGllcmFyY2hpY2FsTGF5b3V0QWN0aW9uX2xhYmVsPUhpZXJhcmNoaWNhbAotCi1WYWxpZGF0ZV9tZXRob2RfbGlicmFyeT1WYWxpZGF0ZSBNZXRob2QgTGlicmFyeQotCi1NYXJrZXJSZXNvbHV0aW9uR2VuZXJhdG9yX3Nob3dPd25lckluTGlicmFyeVZpZXc9U2hvdyBvd25lciBvZiB0aGlzIHVucmVzb2x2ZWQgcmVmZXJlbmNlIGluIExpYnJhcnkgdmlldwotTWFya2VyUmVzb2x1dGlvbkdlbmVyYXRvcl9yZW1vdmVVbnJlc29sdmVkUmVmZXJlbmNlPVJlbW92ZSB0aGlzIHVucmVzb2x2ZWQgcmVmZXJlbmNlCi1wcm9tcHREZWxldGVDdXN0b21DYXRlZ29yeUJlZm9yZVJlbW92ZUxhc3RSZWZUb0l0PVlvdSBhcmUgYWJvdXQgdG8gcmVtb3ZlIHRoZSBsYXN0IHJlZmVyZW5jZSB0byB7MH0gaW4gdGhlIHBsdWctaW4uIFRoZSBlbGVtZW50KHMpIHdpbGwgYmUgZGVsZXRlZC4gRG8geW91IHdhbnQgdG8gY29udGludWU/Ci0KLUNvbmZpZ3VyYXRpb25NYXJrZXJSZXNvbHV0aW9uR2VuZXJhdG9yX3Jlc29sdmVNaXNzaW5nUmVmZXJlbmNlPUFkZCByZWZlcmVuY2UKLUxwbVJlc29sdXRpb25HZW5lcmF0b3JfcmVtb3ZlVW5yZXNvbHZlZEJhc2VQbHVnaW5zPVJlbW92ZSB1bnJlc29sdmVkIGJhc2UgcGx1Z2luIHJlZmVyZW5jZXMKLUxwbVJlc29sdXRpb25HZW5lcmF0b3JfcmVtb3ZlTXVsdGlwbGVSZXBhY2Vycz1SZW1vdmUgbXVsdGlwbGUgcmVwbGFjZXJzCi0KLWRlZmF1bHRMaW5rVHlwZVByZWZMYWJlbD1DaG9vc2UgdGhlIGRlZmF1bHQgZWxlbWVudCBsaW5rIHR5cGUgd2hlbiBkcmFnZ2luZyBmcm9tIHRoZSBMaWJyYXJ5IHZpZXcuCi1wcm9tcHRDcmVhdGVOZXdEaWFncmFtRmlsZV9tc2c9Tm8gZGlhZ3JhbSBmaWxlIGV4aXN0cyBmb3IgdGhpcyBwcm9jZXNzLiBEbyB5b3Ugd2FudCB0byBjcmVhdGUgYSBuZXcgb25lPwotTmV3RGlhZ3JhbUZpbGVfdGl0bGU9TmV3IERpYWdyYW0gRmlsZQotSXRlbXNGaWx0ZXJEaWFsb2dfVXBkYXRlVHJlZUpvYl9uYW1lPVVwZGF0ZSBmaWx0ZXIgdHJlZQotQ29uZmlndXJhdGlvbl9Qcm9ibGVtX1JlZnJlc2g9UmVmcmVzaCBjb25maWd1cmF0aW9uIHByb2JsZW1zCi0KLVByb2JsZW1FeHBsYW5hdGlvblRleHQ9UHJvYmxlbSBFeHBsYW5hdGlvbgotY29uZmlnUHJvYmxlbVZpZXdPcHRpb25zVGV4dD1Db25maWd1cmF0aW9uIHByb2JsZW0gdmlldyBvcHRpb25zCi1oaWRlRXJyb3NUZXh0PUhpZGUgZXJyb3JzCi1oaWRlV2FybmluZ3NUZXh0PUhpZGUgd2FybmluZ3MKLWhpZGVJbmZvc1RleHQ9SGlkZSBpbmZvcwotCi1hZGRfVGFza3NwZXJSb3c9TnVtYmVyIG9mIHRhc2tzIHBlciByb3c6Ci1pbnZhbGlkVGFza3BlclJvd19tc2c9VGFza3MgcGVyIHJvdyBpbiBBY3Rpdml0eSBkZXRhaWwgZGlhZ3JhbXMgbXVzdCBiZSBhbiBpbnRlZ2VyIHdpdGggdmFsdWUgcmFuZ2luZyBmcm9tIHswfSB0byB7MX0uCi0KLUN1c3RvbUNhdGVnb3J5QXNzaWduUGFnZV9pbmNsdWRlRWxlbWVudHNPZlR5cGU9SW5jbHVkZSBlbGVtZW50cyBvZiB0eXBlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL1VJQWN0aW9uRGlzcGF0Y2hlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9VSUFjdGlvbkRpc3BhdGNoZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2QxYzY2Ni4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL1VJQWN0aW9uRGlzcGF0Y2hlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzA0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5kaWFsb2dzLkNvbnRyaWJ1dGlvblNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuRWRpdG9yQ2hvb3NlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnZpZXdzLkNvbmZpZ3VyYXRpb25WaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudmlld3MuTGlicmFyeVZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS51dGlsLlBlcnNwZWN0aXZlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkRvdWJsZUNsaWNrRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JRG91YmxlQ2xpY2tMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklQZXJzcGVjdGl2ZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVBlcnNwZWN0aXZlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVZpZXdQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0U2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci0KLS8qKgotICogSGFuZGxlcyBVSSBhY3Rpb25zIGluIHRoZSB3b3JrYmVuY2guCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBVSUFjdGlvbkRpc3BhdGNoZXIgaW1wbGVtZW50cyBJU2VsZWN0aW9uUHJvdmlkZXIgewotCi0JcHJpdmF0ZSBzdGF0aWMgVUlBY3Rpb25EaXNwYXRjaGVyIGluc3RhbmNlID0gbnVsbDsKLQotCXByb3RlY3RlZCBMaXN0PElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI+IHNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcnMgPSBuZXcgQXJyYXlMaXN0PElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI+KCk7Ci0KLQlwcm90ZWN0ZWQgTGlzdDxJRG91YmxlQ2xpY2tMaXN0ZW5lcj4gZG91YmxlQ2xpY2tMaXN0ZW5lcnMgPSBuZXcgQXJyYXlMaXN0PElEb3VibGVDbGlja0xpc3RlbmVyPigpOwotCi0JcHJpdmF0ZSBDdXJyZW50U2VsZWN0aW9uIGN1cnJlbnRTZWxlY3Rpb24gPSBuZXcgQ3VycmVudFNlbGVjdGlvbigpOwotCi0JcHJpdmF0ZSBJRG91YmxlQ2xpY2tMaXN0ZW5lciBkb3VibGVDbGlja0xpc3RlbmVyID0gbnVsbDsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNpbmdsZXRvbiBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFVJQWN0aW9uRGlzcGF0Y2hlciBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKGluc3RhbmNlID09IG51bGwpIHsKLQkJCXN5bmNocm9uaXplZCAoVUlBY3Rpb25EaXNwYXRjaGVyLmNsYXNzKSB7Ci0JCQkJaWYgKGluc3RhbmNlID09IG51bGwpIHsKLQkJCQkJaW5zdGFuY2UgPSBuZXcgVUlBY3Rpb25EaXNwYXRjaGVyKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci0KLQkvKioKLQkgKiBQcml2YXRlIGRlZmF1bHQgY29uc3RydWN0b3IuCi0JICovCi0JcHJpdmF0ZSBVSUFjdGlvbkRpc3BhdGNoZXIoKSB7Ci0JCXRoaXMobnVsbCk7Ci0JfQotCi0JLyoqCi0JICogY3JlYXRlIGFuIGFjdGlvbiBkaXNwYXRjaGVyIG9mIG15IG93bgotCSAqIAotCSAqIEBwYXJhbSBvd25lcgotCSAqLwotCXB1YmxpYyBVSUFjdGlvbkRpc3BhdGNoZXIoT2JqZWN0IG93bmVyKSB7Ci0JCS8vIENyZWF0ZSB0aGUgZG91YmxlIGNsaWNrIGxpc3RlbmVyIHVzZWQgZm9yIGxhdW5jaGluZyB0aGUgTWV0aG9kCi0JCS8vIGVkaXRvcnMuCi0JCWRvdWJsZUNsaWNrTGlzdGVuZXIgPSBuZXcgSURvdWJsZUNsaWNrTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBkb3VibGVDbGljayhEb3VibGVDbGlja0V2ZW50IGUpIHsKLQkJCQlJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IGUuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJaWYgKHNlbGVjdGlvbiAhPSBudWxsKSB7Ci0JCQkJCUlXb3JrYmVuY2hXaW5kb3cgd2luZG93ID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKQotCQkJCQkJCS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKLQkJCQkJSVdvcmtiZW5jaFBhcnRTaXRlIHNpdGUgPSB3aW5kb3cuZ2V0QWN0aXZlUGFnZSgpCi0JCQkJCQkJLmdldEFjdGl2ZVBhcnQoKS5nZXRTaXRlKCk7Ci0KLQkJCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb247Ci0JCQkJCU9iamVjdFtdIHNlbE9ianMgPSBzZWwudG9BcnJheSgpOwotCQkJCQlPYmplY3Qgc2VsZWN0ZWRPYmplY3QgPSBudWxsOwotCi0JCQkJCWlmICgoc2VsT2JqcyAhPSBudWxsKSAmJiAoc2VsT2Jqcy5sZW5ndGggPiAwKSkgewotCQkJCQkJLy8gT3BlbiB0aGUgQXV0aG9yaW5nIHBlcnNlcGVjdGl2ZS4KLQkJCQkJCVVJQWN0aW9uRGlzcGF0Y2hlci5vcGVuQXV0aG9yaW5nUGVyc3BlY3RpdmUoKTsKLQotCQkJCQkJLy8gTG9jYXRlIHRoZSBzZWxlY3RlZCBNZXRob2QgZWxlbWVudC4KLQkJCQkJCU9iamVjdCBvYmogPSBUbmdVdGlsLnVud3JhcChzZWxPYmpzWzBdKTsKLQkJCQkJCUNvbmZpZ3VyYXRpb25WaWV3IHZpZXcgPSBDb25maWd1cmF0aW9uVmlldy5nZXRWaWV3KCk7CQkJCQkJCi0JCQkJCQlpZiAoKHZpZXcgIT0gbnVsbCApICYmIHNpdGUuZXF1YWxzKHZpZXcuZ2V0U2l0ZSgpKSApIHsKLQkJCQkJCQkvLyBEb3VibGUtY2xpY2sgb3JnaW5hdGVkIGZyb20gdGhlIENvbmZpZ3VyYXRpb24KLQkJCQkJCQkvLyB2aWV3LgotCQkJCQkJCWlmIChvYmogaW5zdGFuY2VvZiBWYXJpYWJpbGl0eUVsZW1lbnQpIHsKLQkJCQkJCQkJVmFyaWFiaWxpdHlFbGVtZW50IGVsZW1lbnQgPSAoVmFyaWFiaWxpdHlFbGVtZW50KSBvYmo7Ci0JCQkJCQkJCUNvbnRyaWJ1dGlvblNlbGVjdGlvbiBjb250cmliU2VsZWN0aW9uID0gbmV3IENvbnRyaWJ1dGlvblNlbGVjdGlvbigpOwotCQkJCQkJCQlzZWxlY3RlZE9iamVjdCA9IGNvbnRyaWJTZWxlY3Rpb24KLQkJCQkJCQkJCQkuZ2V0U2VsZWN0ZWRDb250cmlidXRvcihlbGVtZW50KTsKLQkJCQkJCQl9Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCXNlbGVjdGVkT2JqZWN0ID0gb2JqOwotCQkJCQkJfQotCi0JCQkJCQlpZiAoc2VsZWN0ZWRPYmplY3QgIT0gbnVsbCkgewotCQkJCQkJCUVkaXRvckNob29zZXIuZ2V0SW5zdGFuY2UoKS5vcGVuRWRpdG9yKAotCQkJCQkJCQkJc2VsZWN0ZWRPYmplY3QpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9OwotCi0JCS8vIEFkZCBhIHBlcnNwZWN0aXZlIGxpc3RlbmVyIHRvIGVuYWJsZS9kaXNhYmxlIGRvdWJsZS1jbGljayBsaXN0ZW5pbmcuCi0JCUlXb3JrYmVuY2hXaW5kb3cgYWN0aXZlV29ya2JlbmNoV2luZG93ID0gQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpCi0JCQkJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpOwotCQlpZiAoYWN0aXZlV29ya2JlbmNoV2luZG93ICE9IG51bGwpIHsKLQkJCWFjdGl2ZVdvcmtiZW5jaFdpbmRvdwotCQkJCQkuYWRkUGVyc3BlY3RpdmVMaXN0ZW5lcihuZXcgSVBlcnNwZWN0aXZlTGlzdGVuZXIoKSB7Ci0JCQkJCQlwdWJsaWMgdm9pZCBwZXJzcGVjdGl2ZUFjdGl2YXRlZChJV29ya2JlbmNoUGFnZSBwYWdlLAotCQkJCQkJCQlJUGVyc3BlY3RpdmVEZXNjcmlwdG9yIGRlc2MpIHsKLQkJCQkJCQlpZiAoZGVzYy5nZXRJZCgpLmVxdWFscygKLQkJCQkJCQkJCUF1dGhvcmluZ1BlcnNwZWN0aXZlLlBFUlNQRUNUSVZFX0lEKSkgewotCQkJCQkJCQlhZGREb3VibGVDbGlja0xpc3RlbmVyKGRvdWJsZUNsaWNrTGlzdGVuZXIpOwotCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCXJlbW92ZURvdWJsZUNsaWNrTGlzdGVuZXIoZG91YmxlQ2xpY2tMaXN0ZW5lcik7Ci0JCQkJCQkJfQotCQkJCQkJfQotCi0JCQkJCQlwdWJsaWMgdm9pZCBwZXJzcGVjdGl2ZUNoYW5nZWQoSVdvcmtiZW5jaFBhZ2UgcGFnZSwKLQkJCQkJCQkJSVBlcnNwZWN0aXZlRGVzY3JpcHRvciBkZXNjLCBTdHJpbmcgaWQpIHsKLQkJCQkJCX0KLQkJCQkJfSk7Ci0JCX0KLQotCQlpZiAoUGVyc3BlY3RpdmVVdGlsCi0JCQkJLmlzQWN0aXZlUGVyc3BlY3RpdmUoQXV0aG9yaW5nUGVyc3BlY3RpdmUuUEVSU1BFQ1RJVkVfSUQpKSB7Ci0JCQlhZGREb3VibGVDbGlja0xpc3RlbmVyKGRvdWJsZUNsaWNrTGlzdGVuZXIpOwotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGVkaXRDb25maWd1cmF0aW9uKFN0cmluZyBjb25maWdOYW1lKSB7Ci0JfQotCi0JLyoqCi0JICogT3BlbiBsaWJyYXJ5IHBlcnNwZWN0aXZlCi0JICogCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIG9wZW5MaWJyYXJ5UGVyc3BlY3RpdmUoKSB7Ci0JCVBlcnNwZWN0aXZlVXRpbC5vcGVuUGVyc3BlY3RpdmUoQnJvd3NpbmdQZXJzcGVjdGl2ZS5QRVJTUEVDVElWRV9JRCk7Ci0JCUlXb3JrYmVuY2hQYWdlIHdrYlBhZ2UgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpCi0JCQkJLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKTsKLQkJSVZpZXdQYXJ0IHZpZXdQYXJ0ID0gd2tiUGFnZS5maW5kVmlldyhMaWJyYXJ5Vmlldy5WSUVXX0lEKTsKLQkJaWYgKHZpZXdQYXJ0ICE9IG51bGwpCi0JCQl3a2JQYWdlLmhpZGVWaWV3KHZpZXdQYXJ0KTsKLQkJdmlld1BhcnQgPSB3a2JQYWdlLmZpbmRWaWV3KENvbmZpZ3VyYXRpb25WaWV3LlZJRVdfSUQpOwotCQl3a2JQYWdlLmFjdGl2YXRlKHZpZXdQYXJ0KTsKLQl9Ci0KLQkvKioKLQkgKiBPcGVuIGF1dGhvcmluZyBwZXJzcGVjdGl2ZQotCSAqIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBvcGVuQXV0aG9yaW5nUGVyc3BlY3RpdmUoKSB7Ci0JCVBlcnNwZWN0aXZlVXRpbC5vcGVuUGVyc3BlY3RpdmUoQXV0aG9yaW5nUGVyc3BlY3RpdmUuUEVSU1BFQ1RJVkVfSUQpOwotCQlJV29ya2JlbmNoUGFnZSB3a2JQYWdlID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKQotCQkJCS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRBY3RpdmVQYWdlKCk7Ci0JCUlWaWV3UGFydCB2aWV3UGFydCA9IHdrYlBhZ2UuZmluZFZpZXcoTGlicmFyeVZpZXcuVklFV19JRCk7Ci0JCXdrYlBhZ2UuYWN0aXZhdGUodmlld1BhcnQpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXIjYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlpZiAoIXNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcnMuY29udGFpbnMobGlzdGVuZXIpKSB7Ci0JCQlzZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyI3JlbW92ZVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIpCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKAotCQkJSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlzZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXJzLnJlbW92ZShsaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGN1cnJlbnQgc2VsZWN0aW9uCi0JICovCi0JcHVibGljIElTZWxlY3Rpb24gZ2V0U2VsZWN0aW9uKCkgewotCQlyZXR1cm4gY3VycmVudFNlbGVjdGlvbi5zZWxlY3Rpb247Ci0JfQotCi0JcHVibGljIElTZWxlY3Rpb25Qcm92aWRlciBnZXRTZWxlY3Rpb25Tb3VyY2UoKSB7Ci0JCXJldHVybiBjdXJyZW50U2VsZWN0aW9uLnNvdXJjZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIGN1cnJlbnQgc2VsZWN0aW9uCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2VsZWN0aW9uKElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCXNldFNlbGVjdGlvbih0aGlzLCBzZWxlY3Rpb24pOwotCX0KLQotCS8qKgotCSAqIFNldHMgY3VycmVudCBzZWxlY3Rpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTZWxlY3Rpb24oSVNlbGVjdGlvblByb3ZpZGVyIHNvdXJjZSwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJc3luY2hyb25pemVkICh0aGlzKSB7Ci0JCQljdXJyZW50U2VsZWN0aW9uLnNlbGVjdGlvbiA9IHNlbGVjdGlvbjsKLQkJCWN1cnJlbnRTZWxlY3Rpb24uc291cmNlID0gc291cmNlOwotCi0JCQlTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQgPSBuZXcgU2VsZWN0aW9uQ2hhbmdlZEV2ZW50KHNvdXJjZSwKLQkJCQkJc2VsZWN0aW9uKTsKLQotCQkJLy8gQXZvaWQgY29uY3VycmVudCBlcnJvci4KLQkJCUxpc3Q8SVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcj4gcHJvY2Vzc2VkSXRlbXMgPSBuZXcgQXJyYXlMaXN0PElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI+KCk7Ci0JCQl3aGlsZSAoc2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVycy5zaXplKCkgPiAwKSB7Ci0JCQkJSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lciA9IChJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKSBzZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXJzCi0JCQkJCQkucmVtb3ZlKDApOwotCQkJCWlmIChsaXN0ZW5lciAhPSBudWxsKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlsaXN0ZW5lci5zZWxlY3Rpb25DaGFuZ2VkKGV2ZW50KTsKLQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCQkJfQotCQkJCQlwcm9jZXNzZWRJdGVtcy5hZGQobGlzdGVuZXIpOwotCQkJCX0KLQkJCX0KLQotCQkJc2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVycy5hZGRBbGwocHJvY2Vzc2VkSXRlbXMpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQWRkIGRvdWJsZSBjbGljayBsaXN0ZW5lcgotCSAqIAotCSAqIEBwYXJhbSBsaXN0ZW5lcgotCSAqLwotCXB1YmxpYyB2b2lkIGFkZERvdWJsZUNsaWNrTGlzdGVuZXIoSURvdWJsZUNsaWNrTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJaWYgKCFkb3VibGVDbGlja0xpc3RlbmVycy5jb250YWlucyhsaXN0ZW5lcikpIHsKLQkJCWRvdWJsZUNsaWNrTGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgZG91YmxlIGNsaWNrIGxpc3RlbmVyCi0JICogCi0JICogQHBhcmFtIGxpc3RlbmVyCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlRG91YmxlQ2xpY2tMaXN0ZW5lcihJRG91YmxlQ2xpY2tMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlkb3VibGVDbGlja0xpc3RlbmVycy5yZW1vdmUobGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIEhhbmRsZSBkb3VibGUgY2xpY2sgZXZlbnQKLQkgKiAKLQkgKiBAcGFyYW0gZXZlbnQKLQkgKi8KLQlwdWJsaWMgdm9pZCBoYW5kbGVEb3VibGVDbGlja0V2ZW50KERvdWJsZUNsaWNrRXZlbnQgZXZlbnQpIHsKLQkJc3luY2hyb25pemVkICh0aGlzKSB7Ci0JCQkvLyBBdm9pZCBjb25jdXJyZW50IGVycm9yLgotCQkJTGlzdDxJRG91YmxlQ2xpY2tMaXN0ZW5lcj4gcHJvY2Vzc2VkSXRlbXMgPSBuZXcgQXJyYXlMaXN0PElEb3VibGVDbGlja0xpc3RlbmVyPigpOwotCQkJd2hpbGUgKGRvdWJsZUNsaWNrTGlzdGVuZXJzLnNpemUoKSA+IDApIHsKLQkJCQlJRG91YmxlQ2xpY2tMaXN0ZW5lciBsaXN0ZW5lciA9IChJRG91YmxlQ2xpY2tMaXN0ZW5lcikgZG91YmxlQ2xpY2tMaXN0ZW5lcnMKLQkJCQkJCS5yZW1vdmUoMCk7Ci0JCQkJdHJ5IHsKLQkJCQkJbGlzdGVuZXIuZG91YmxlQ2xpY2soZXZlbnQpOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCQl9Ci0JCQkJcHJvY2Vzc2VkSXRlbXMuYWRkKGxpc3RlbmVyKTsKLQkJCX0KLQkJCWRvdWJsZUNsaWNrTGlzdGVuZXJzLmFkZEFsbChwcm9jZXNzZWRJdGVtcyk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgY2xhc3MgQ3VycmVudFNlbGVjdGlvbiB7Ci0KLQkJcHVibGljIElTZWxlY3Rpb25Qcm92aWRlciBzb3VyY2UgPSBudWxsOwotCi0JCXB1YmxpYyBJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IFN0cnVjdHVyZWRTZWxlY3Rpb24uRU1QVFk7Ci0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9BYnN0cmFjdE1vdmVBY3Rpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9BYnN0cmFjdE1vdmVBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGQ1ZGUxZi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvQWJzdHJhY3RNb3ZlQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuVW5leGVjdXRhYmxlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5BZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLklFZGl0aW5nRG9tYWluUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5Db21tYW5kQWN0aW9uSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuUHJvY2Vzc0VkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuSUJTSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5CdXN5SW5kaWNhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotCi0vKioKLSAqIE1vdmVzIGJyZWFrZG93biBlbGVtZW50IGluIGEgcHJvY2VzcyB0cmVlLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlICAxLjIKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0TW92ZUFjdGlvbiBleHRlbmRzCi0JCUNvbW1hbmRBY3Rpb25IYW5kbGVyIGltcGxlbWVudHMgSVdvcmtiZW5jaFBhcnRBY3Rpb24sIElNb2RpZnlpbmdBY3Rpb24gewotCi0JcHJvdGVjdGVkIFByb2Nlc3NFZGl0b3IgZWRpdG9yOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZQotCSAqIEBwYXJhbSB0ZXh0Ci0JICovCi0JcHVibGljIEFic3RyYWN0TW92ZUFjdGlvbihTdHJpbmcgdGV4dCkgewotCQlzdXBlcihudWxsLCB0ZXh0KTsKLQl9Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0KElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQkvLyBzdXBwb3J0IG1vdmUgb25seSBvbmUgYWN0aXZpdHkgZm9yIG5vdwotCQkvLwotCQlpZihzZWxlY3Rpb24uc2l6ZSgpID09IDEpIHsKLQkJCU9iamVjdCBlID0gc2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOwotCQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyIGlwID0gKElUcmVlSXRlbUNvbnRlbnRQcm92aWRlcikgZ2V0SXRlbVByb3ZpZGVyKGUpOwotCQkJcmV0dXJuIGUgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50ICYmIGlwICE9IG51bGwgJiYgaXAuZ2V0UGFyZW50KGUpIGluc3RhbmNlb2YgQWN0aXZpdHk7Ci0JCX0KLQkJCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkNvbW1hbmRBY3Rpb25IYW5kbGVyI3VwZGF0ZVNlbGVjdGlvbihvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHVwZGF0ZVNlbGVjdGlvbihJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJLy8gc3VwcG9ydCBtb3ZlIG9ubHkgb25lIGFjdGl2aXR5IGZvciBub3cKLQkJLy8KLQkJaWYoYWNjZXB0KHNlbGVjdGlvbikpIHsKLQkJCXJldHVybiBzdXBlci51cGRhdGVTZWxlY3Rpb24oc2VsZWN0aW9uKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCXByb3RlY3RlZCBJQlNJdGVtUHJvdmlkZXIgZ2V0SXRlbVByb3ZpZGVyKE9iamVjdCBlbGVtZW50KSB7Ci0JCWlmKGRvbWFpbiBpbnN0YW5jZW9mIEFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbikgewotCQkJQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkgPSAoKEFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbilkb21haW4pLmdldEFkYXB0ZXJGYWN0b3J5KCk7Ci0JCQlPYmplY3QgaXAgPSBhZGFwdGVyRmFjdG9yeS5hZGFwdChlbGVtZW50LCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkJaWYoaXAgaW5zdGFuY2VvZiBJQlNJdGVtUHJvdmlkZXIpIHsKLQkJCQlyZXR1cm4gKElCU0l0ZW1Qcm92aWRlcikgaXA7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkNvbW1hbmRBY3Rpb25IYW5kbGVyI2NyZWF0ZUNvbW1hbmQoamF2YS51dGlsLkNvbGxlY3Rpb24pCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHVibGljIENvbW1hbmQgY3JlYXRlQ29tbWFuZChDb2xsZWN0aW9uPD8+IHNlbGVjdGlvbikgewotCQlPYmplY3QgZWxlbWVudCA9IHNlbGVjdGlvbi5pdGVyYXRvcigpLm5leHQoKTsKLQkJSUJTSXRlbVByb3ZpZGVyIGlwID0gZ2V0SXRlbVByb3ZpZGVyKGVsZW1lbnQpOwotCQlpZihpcCAhPSBudWxsKSB7Ci0JCQlPYmplY3QgcGFyZW50ID0gKChJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIpaXApLmdldFBhcmVudChlbGVtZW50KTsKLQkJCWlmICgocGFyZW50ICE9IG51bGwpICYmIChwYXJlbnQgaW5zdGFuY2VvZiBBY3Rpdml0eSkpIHsKLQkJCQlyZXR1cm4gY3JlYXRlTW92ZUNvbW1hbmQoKEFjdGl2aXR5KXBhcmVudCwgZWxlbWVudCwgaXAuZ2V0RUNsYXNzZXMoKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCQotCX0KLQkKLQlwcm90ZWN0ZWQgYWJzdHJhY3QgQ29tbWFuZCBjcmVhdGVNb3ZlQ29tbWFuZChBY3Rpdml0eSBhY3QsIE9iamVjdCBlbGVtZW50LCBDb2xsZWN0aW9uPEVDbGFzcz4gZUNsYXNzZXMpOwotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnMuSVdvcmtiZW5jaFBhcnRBY3Rpb24jc2V0QWN0aXZlV29ya2JlbmNoUGFydChvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBY3RpdmVXb3JrYmVuY2hQYXJ0KElXb3JrYmVuY2hQYXJ0IHdvcmtiZW5jaFBhcnQpIHsKLQkJaWYod29ya2JlbmNoUGFydCBpbnN0YW5jZW9mIElFZGl0aW5nRG9tYWluUHJvdmlkZXIpIHsKLQkJCWRvbWFpbiA9ICgoSUVkaXRpbmdEb21haW5Qcm92aWRlcil3b3JrYmVuY2hQYXJ0KS5nZXRFZGl0aW5nRG9tYWluKCk7Ci0JCX0KLQkJaWYod29ya2JlbmNoUGFydCBpbnN0YW5jZW9mIFByb2Nlc3NFZGl0b3IpIHsKLQkJCWVkaXRvciA9IChQcm9jZXNzRWRpdG9yKSB3b3JrYmVuY2hQYXJ0OwotCQl9CQkKLQkJZWxzZSBpZih3b3JrYmVuY2hQYXJ0ID09IG51bGwpIHsKLQkJCWVkaXRvciA9IG51bGw7Ci0JCX0KLQl9CQotCQotCXByaXZhdGUgdm9pZCBzdXBlclJ1bigpIHsKLQkJc3VwZXIucnVuKCk7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkNvbW1hbmRBY3Rpb25IYW5kbGVyI3J1bigpCi0JICovCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQlCdXN5SW5kaWNhdG9yLnNob3dXaGlsZShlZGl0b3IuZ2V0RWRpdG9yU2l0ZSgpCi0JCQkJLmdldFNoZWxsKCkuZ2V0RGlzcGxheSgpLCBuZXcgUnVubmFibGUoKSB7Ci0KLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJc3VwZXJSdW4oKTsKLQkJCQkJfQotCQkJCi0JCX0pOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9BY3Rpdml0eURldGFpbERpYWdyYW1JbmZvQWN0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvQWN0aXZpdHlEZXRhaWxEaWFncmFtSW5mb0FjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYjI2MjJiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9BY3Rpdml0eURldGFpbERpYWdyYW1JbmZvQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZGlhbG9ncy5BRERJbmZvRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5BYnN0cmFjdERpYWdyYW1FZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLkFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZpbHRlcnMuRGVzY3JpcHRvckNvbmZpZ3VyYXRpb25GaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwudXRpbC5HcmFwaGljYWxEYXRhSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLnV0aWwuR3JhcGhpY2FsRGF0YU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5TdXBwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ2FwYWJpbGl0eVBhdHRlcm47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotCi0vKioKLSAqIEFjdGlvbiB0byBzaG93IHRoZSBBRERJbmZvRGlhbG9nLCB0byBzaG93IHRoZSBBY3Rpdml0eURldGFpbERpYWdyYW1zCi0gKiBpbiB0aGUgcHJvY2Vzcy4gTm90IGluIHVzZS4KLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZpdHlEZXRhaWxEaWFncmFtSW5mb0FjdGlvbiBleHRlbmRzIEFjdGlvbiB7Ci0KLQlwcm90ZWN0ZWQgT2JqZWN0IHNlbGVjdGVkOwotCQotCXB1YmxpYyBBY3Rpdml0eURldGFpbERpYWdyYW1JbmZvQWN0aW9uKCkgewotCQlzdXBlcigiQWN0aXZpdHkgRGV0YWlsIERpYWdyYW0gSW5mbyIpOyAvLyROT04tTkxTLTEkCi0JfQotCQotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCi0JCUlGaWx0ZXIgZmlsdGVyID0gbmV3IEFEREZpbHRlcihudWxsLCBudWxsLCBudWxsKTsKLQkJCi0JCUFEREluZm9EaWFsb2cgZmQgPSBuZXcgQURESW5mb0RpYWxvZyhQbGF0Zm9ybVVJCi0JCQkJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpCi0JCQkJLmdldFNoZWxsKCksIGZpbHRlciwgZ2V0T2JqZWN0KCksICJBY3Rpdml0eSIsIC8vJE5PTi1OTFMtMSQKLQkJCQludWxsKTsKLQotCQlmZC5zZXRCbG9ja09uT3Blbih0cnVlKTsKLQkJZmQuc2V0VGl0bGUoIkFjdGl2aXR5Iik7IC8vJE5PTi1OTFMtMSQKLQkJZmQub3BlbigpOwotCQlMaXN0IGxpc3QgPSBmZC5nZXRTZWxlY3RlZEl0ZW1zKCk7Ci0JCQotCQl0cnkgewotCQkJSUVkaXRvclBhcnQgcGFyZW50ID0gZ2V0UGFnZXgoKS5nZXRBY3RpdmVFZGl0b3IoKTsKLQkJCUlFZGl0b3JJbnB1dCBpbnB1dCA9IG5ldyBBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0b3IuRWRpdG9ySW5wdXQoCi0JCQkJCWxpc3QuZ2V0KDApLCBTdXBwcmVzc2lvbi5nZXRTdXBwcmVzc2lvbigoUHJvY2VzcylnZXRPYmplY3QoKSkpOwotCQkJSUVkaXRvclBhcnQgcGFydCA9IGdldFBhZ2V4KCkub3BlbkVkaXRvcihpbnB1dCwKLQkJCQkJQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9yLmNsYXNzCi0JCQkJCS5nZXROYW1lKCkpOwotCQkJaWYgKHBhcnQgaW5zdGFuY2VvZiBBYnN0cmFjdERpYWdyYW1FZGl0b3IpIHsKLQkJCQlBYnN0cmFjdERpYWdyYW1FZGl0b3IgZWRpdG9yID0gKEFic3RyYWN0RGlhZ3JhbUVkaXRvcikgcGFydDsKLQkJCQllZGl0b3Iuc2V0UGFyZW50RWRpdG9yKHBhcmVudCk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIGV4Y2VwdGlvbikgewotCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKAotCQkJCQlleGNlcHRpb24pOwotCQl9Ci0JCS8vIG9wZW4gZWRpdG9yCi0KLQkJc3VwZXIucnVuKCk7Ci0JfQotCQotCXB1YmxpYyBPYmplY3QgZ2V0T2JqZWN0KCl7Ci0JCXJldHVybiBzZWxlY3RlZDsKLQl9Ci0JCi0JcHVibGljIElXb3JrYmVuY2hQYWdlIGdldFBhZ2V4KCl7Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWQoKSB7Ci0JCXJldHVybiBzdXBlci5pc0VuYWJsZWQoKTsKLQl9Ci0JcHVibGljIGNsYXNzIEFEREZpbHRlciBleHRlbmRzIERlc2NyaXB0b3JDb25maWd1cmF0aW9uRmlsdGVyIHsKLQkJcHVibGljIEFEREZpbHRlcihNZXRob2RDb25maWd1cmF0aW9uIG1ldGhvZENvbmZpZywgVmlld2VyIHZpZXdlciwgU3RyaW5nIGZpbHRlclN0cikgewotCQkJc3VwZXIobWV0aG9kQ29uZmlnLCB2aWV3ZXIsIGZpbHRlclN0cik7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoT2JqZWN0IG9iaikgewotCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQkJaWYob2JqIGluc3RhbmNlb2YgQ2FwYWJpbGl0eVBhdHRlcm4pIHJldHVybiB0cnVlOwotCQkJaWYob2JqIGluc3RhbmNlb2YgQWN0aXZpdHkpewotCQkJCW9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbSBkID0gR3JhcGhpY2FsRGF0YU1hbmFnZXIuZ2V0SW5zdGFuY2UoKQotCQkJCS5nZXRVTUFEaWFncmFtKChBY3Rpdml0eSkgb2JqLCBHcmFwaGljYWxEYXRhSGVscGVyLkFDVElWSVRZX0RFVEFJTF9ESUFHUkFNLCBmYWxzZSk7Ci0JCQkJaWYoZCAhPSBudWxsICkgcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvQXNzaWduQWN0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvQXNzaWduQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4ODE5YTIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL0Fzc2lnbkFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9ucy5MaWJyYXJ5Vmlld1NpbXBsZUFjdGlvbi5DdXN0b21lQ2F0ZWdvcnlBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5kaWFsb2dzLkFzc2lnbkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnZpZXdzLkxpYnJhcnlWaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ3VzdG9tQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci0KLS8qKgotICogQXNzaWduIG1ldGhvZCBlbGVtZW50LgotICogCi0gKiBAYXV0aG9yIFdlaXBpbmcgTHUKLSAqIEBzaW5jZSAgMS41Ci0gKi8KLXB1YmxpYyBjbGFzcyBBc3NpZ25BY3Rpb24gZXh0ZW5kcyBDdXN0b21lQ2F0ZWdvcnlBY3Rpb24gewotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZQotCSAqIEBwYXJhbSB0ZXh0Ci0JICovCi0JcHVibGljIEFzc2lnbkFjdGlvbihMaWJyYXJ5VmlldyBsaWJWaWV3KSB7Ci0JCXN1cGVyKGxpYlZpZXcsIEF1dGhvcmluZ1VJUmVzb3VyY2VzLmFzc2lnbkFjdGlvbl90ZXh0KTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgZG9SdW4oKSB7CQkKLQkJQ29sbGVjdGlvbiBlbGVtZW50c1RvQXNzaWduID0gbmV3IEFycmF5TGlzdCgpOwotCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGdldExpYnJhcnlWaWV3KCkuZ2V0U2VsZWN0aW9uKCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHNlbGVjdGlvbi5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQKLQkJCQkJfHwgKGVsZW1lbnQgPSBUbmdVdGlsLnVud3JhcChlbGVtZW50KSkgaW5zdGFuY2VvZiBDdXN0b21DYXRlZ29yeSkgewotCQkJCWVsZW1lbnRzVG9Bc3NpZ24uYWRkKGVsZW1lbnQpOwotCQkJfQotCQl9Ci0JCQotCQlBc3NpZ25EaWFsb2cgZGxnID0gZ2V0RGlhbG9nKGVsZW1lbnRzVG9Bc3NpZ24pOwotCQlkbGcub3BlbigpOwotCX0KLQkKLQlwcm90ZWN0ZWQgQXNzaWduRGlhbG9nIGdldERpYWxvZyhDb2xsZWN0aW9uIGVsZW1lbnRzKSB7Ci0JCXJldHVybiBBc3NpZ25EaWFsb2cubmV3QXNzaWduRGlhbG9nKGdldExpYnJhcnlWaWV3KCkuZ2V0U2l0ZSgpLmdldFNoZWxsKCksIGVsZW1lbnRzKTsKLQl9Ci0JCi0JLyoqCi0JICogQHBhcmFtIHNlbGVjdGlvbgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB1cGRhdGVTZWxlY3Rpb24oSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCS8vcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gY2FuQXNzaWduKHNlbGVjdGlvbik7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHNlbGVjdGVkIG1ldGhvZCBlbGVtZW50cyBjYW4gYmUgYXNzaWduZWQuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGNhbkFzc2lnbihJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJaWYgKHNlbGVjdGlvbi5zaXplKCkgPiAxKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJT2JqZWN0IGVsZW1lbnQgPSBUbmdVdGlsLnVud3JhcChzZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCkpOwotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEN1c3RvbUNhdGVnb3J5KSB7Ci0JCQlyZXR1cm4gZ2V0U2VsZWN0aW9uUGFyZW50T2JqZWN0KCkgaW5zdGFuY2VvZiBDdXN0b21DYXRlZ29yeTsKLQkJfQotCQkKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL0NvbmZpZ3VyYXRpb25WaWV3RWRpdEFjdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL0NvbmZpZ3VyYXRpb25WaWV3RWRpdEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZDcwZWFmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9Db25maWd1cmF0aW9uVmlld0VkaXRBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuUGVyc3BlY3RpdmVMaXN0VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLlVJQWN0aW9uRGlzcGF0Y2hlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmRpYWxvZ3MuQ29udHJpYnV0aW9uU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5FZGl0b3JDaG9vc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DYXBhYmlsaXR5UGF0dGVybjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJ5UHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5QaGFzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5CYXNlU2VsZWN0aW9uTGlzdGVuZXJBY3Rpb247Ci0KLQotLyoqCi0gKiBFZGl0cyBhbiBlbGVtZW50IGluIHRoZSBDb25maWd1cmF0aW9uIHZpZXcuCi0gKiAKLSAqIEBhdXRob3IgQmluZ3h1ZSBYdQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBDb25maWd1cmF0aW9uVmlld0VkaXRBY3Rpb24gZXh0ZW5kcyBCYXNlU2VsZWN0aW9uTGlzdGVuZXJBY3Rpb24gewotCi0JLyoqCi0JICogVGhlIElEIGZvciB0aGlzIGFjdGlvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT05fSUQgPSBDb25maWd1cmF0aW9uVmlld0VkaXRBY3Rpb24uY2xhc3MKLQkJCS5nZXROYW1lKCk7Ci0KLQlwcml2YXRlIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGVkOwotCi0JcHJpdmF0ZSBDb250cmlidXRpb25TZWxlY3Rpb24gY29udHJpYnV0b3JTZWxlY3RvcjsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIENvbmZpZ3VyYXRpb25WaWV3RWRpdEFjdGlvbihTdHJpbmcgdGV4dCkgewotCQlzdXBlcih0ZXh0KTsKLQkJY29udHJpYnV0b3JTZWxlY3RvciA9IG5ldyBDb250cmlidXRpb25TZWxlY3Rpb24oKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb24jcnVuKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCUFycmF5TGlzdCBlbGVtZW50TGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChJdGVyYXRvciBvYmplY3RzID0gc2VsZWN0ZWQuaXRlcmF0b3IoKTsgb2JqZWN0cy5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZWxlbWVudCA9IFRuZ1V0aWwudW53cmFwKG9iamVjdHMubmV4dCgpKTsKLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgVmFyaWFiaWxpdHlFbGVtZW50KSB7Ci0JCQkJT2JqZWN0IG9iaiA9IGNvbnRyaWJ1dG9yU2VsZWN0b3IKLQkJCQkJCS5nZXRTZWxlY3RlZENvbnRyaWJ1dG9yKChWYXJpYWJpbGl0eUVsZW1lbnQpIGVsZW1lbnQpOwotCQkJCWlmIChvYmogIT0gbnVsbCkKLQkJCQkJZWxlbWVudExpc3QuYWRkKG9iaik7Ci0JCQl9IGVsc2UgewotCQkJCWVsZW1lbnRMaXN0LmFkZChlbGVtZW50KTsKLQkJCX0KLQkJfQotCi0JCWlmIChlbGVtZW50TGlzdC5zaXplKCkgPCAxKQotCQkJcmV0dXJuOwotCi0JCWlmIChQZXJzcGVjdGl2ZUxpc3RVdGlsLmlzQnJvd3NpbmdQZXJzcGVjdGl2ZSgpKSB7Ci0JCQlVSUFjdGlvbkRpc3BhdGNoZXIub3BlbkF1dGhvcmluZ1BlcnNwZWN0aXZlKCk7Ci0JCX0KLQotCQlmb3IgKEl0ZXJhdG9yIG9iamVjdHMgPSBlbGVtZW50TGlzdC5pdGVyYXRvcigpOyBvYmplY3RzLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gb2JqZWN0cy5uZXh0KCk7Ci0JCQlFZGl0b3JDaG9vc2VyLmdldEluc3RhbmNlKCkub3BlbkVkaXRvcihlbGVtZW50KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFVwZGF0ZXMgdGhpcyBhY3Rpb24gaW4gcmVzcG9uc2UgdG8gdGhlIGdpdmVuIHNlbGVjdGlvbiBjaGFuZ2VzLgotCSAqLwotCXB1YmxpYyBib29sZWFuIHVwZGF0ZVNlbGVjdGlvbihJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJc2VsZWN0ZWQgPSBzZWxlY3Rpb247Ci0KLQkJYm9vbGVhbiBlbmFibGVUaGVNZW51ID0gdHJ1ZTsKLQotCQlmb3IgKEl0ZXJhdG9yIG9iamVjdHMgPSBzZWxlY3Rpb24uaXRlcmF0b3IoKTsgb2JqZWN0cy5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZWxlbWVudCA9IG9iamVjdHMubmV4dCgpOwotCQkJT2JqZWN0IHJlYWxPYmogPSBUbmdVdGlsLnVud3JhcChlbGVtZW50KTsKLQkJCWlmICghKHJlYWxPYmogaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSkgewotCQkJCWVuYWJsZVRoZU1lbnUgPSBmYWxzZTsKLQkJCQlicmVhazsKLQkJCX0gZWxzZSBpZiAoKHJlYWxPYmogaW5zdGFuY2VvZiBEZWxpdmVyeVByb2Nlc3MpCi0JCQkJCXx8IChyZWFsT2JqIGluc3RhbmNlb2YgQ2FwYWJpbGl0eVBhdHRlcm4pKSB7Ci0JCQkJYnJlYWs7Ci0JCQl9IGVsc2UgaWYgKChyZWFsT2JqIGluc3RhbmNlb2YgUGhhc2UpCi0JCQkJCXx8IChyZWFsT2JqIGluc3RhbmNlb2YgQWN0aXZpdHkpCi0JCQkJCXx8IChyZWFsT2JqIGluc3RhbmNlb2YgUHJvY2Vzc1BhY2thZ2UpKSB7Ci0JCQkJZW5hYmxlVGhlTWVudSA9IGZhbHNlOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGVuYWJsZVRoZU1lbnU7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvQ3JlYXRlTWV0aG9kRWxlbWVudENvbW1hbmQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9DcmVhdGVNZXRob2RFbGVtZW50Q29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYTgxZTYyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9DcmVhdGVNZXRob2RFbGVtZW50Q29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmRXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZEFjdGlvbkRlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuSUVkaXRvcktlZXBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnZpZXdzLlZpZXdIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS51dGlsLk1zZ0JveDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuQ29tbWFuZFN0YXR1c0NoZWNrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLk1ldGhvZEVsZW1lbnRBZGRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kLkNyZWF0ZVByb2Nlc3NDb21wb25lbnRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci0KLS8qKgotICogQ3JlYXRlcyBhIG5ldyBNZXRob2QgZWxlbWVudC4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQ3JlYXRlTWV0aG9kRWxlbWVudENvbW1hbmQgZXh0ZW5kcyBDb21tYW5kV3JhcHBlciBpbXBsZW1lbnRzCi0JCUNvbW1hbmRBY3Rpb25EZWxlZ2F0ZSB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBDcmVhdGVNZXRob2RFbGVtZW50Q29tbWFuZChDb21tYW5kIGNvbW1hbmQpIHsKLQkJc3VwZXIoY29tbWFuZCk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCByZWxvYWRDdXJyZW50TGlicmFyeU9uUm9sbGJhY2tFcnJvcigpIHsKLQkJVmlld0hlbHBlci5yZWxvYWRDdXJyZW50TGliYXJ5T25Sb2xsYmFja0Vycm9yKG51bGwpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmRXcmFwcGVyI2V4ZWN1dGUoKQotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCUNvbW1hbmQgY21kID0gVG5nVXRpbC51bndyYXAodGhpcyk7Ci0KLQkJc3VwZXIuZXhlY3V0ZSgpOwotCi0JCWlmIChjb21tYW5kIGluc3RhbmNlb2YgQ3JlYXRlUHJvY2Vzc0NvbXBvbmVudENvbW1hbmQpIHsKLQkJCUlTdGF0dXMgc3RhdHVzID0gKChDcmVhdGVQcm9jZXNzQ29tcG9uZW50Q29tbWFuZCkgY29tbWFuZCkKLQkJCQkJLmdldFN0YXR1cygpOwotCQkJaWYgKHN0YXR1cyAhPSBudWxsICYmICFzdGF0dXMuaXNPSygpKSB7Ci0JCQkJaWYgKENvbW1hbmRTdGF0dXNDaGVja2VyLmhhc1JvbGxiYWNrRXJyb3Ioc3RhdHVzKSkgewkJCQkJCi0JCQkJCXJlbG9hZEN1cnJlbnRMaWJyYXJ5T25Sb2xsYmFja0Vycm9yKCk7Ci0JCQkJfSBlbHNlIGlmICghQ29tbWFuZFN0YXR1c0NoZWNrZXIuaGFzU2F2ZUVycm9yKHN0YXR1cykpIHsKLQkJCQkJZGlzcGxheUVycm9yKHN0YXR1cyk7Ci0JCQkJfQotCQkJCXJldHVybjsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWNtZCA9IHRoaXM7Ci0KLQkJCXdoaWxlIChjbWQgaW5zdGFuY2VvZiBDb21tYW5kV3JhcHBlcgotCQkJCQkmJiAhKGNtZCBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnRBZGRDb21tYW5kKSkgewotCQkJCWNtZCA9ICgoQ29tbWFuZFdyYXBwZXIpIGNtZCkuZ2V0Q29tbWFuZCgpOwotCQkJfQotCi0JCQlpZiAoY21kIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudEFkZENvbW1hbmQpIHsKLQkJCQlNZXRob2RFbGVtZW50QWRkQ29tbWFuZCBhZGRDbWQgPSAoKE1ldGhvZEVsZW1lbnRBZGRDb21tYW5kKSBjbWQpOwotCQkJCUlTdGF0dXMgc3RhdHVzID0gYWRkQ21kLmdldFN0YXR1cygpOwotCQkJCWlmIChzdGF0dXMgIT0gbnVsbCAmJiAhc3RhdHVzLmlzT0soKSkgewotCQkJCQlpZiAoQ29tbWFuZFN0YXR1c0NoZWNrZXIuaGFzUm9sbGJhY2tFcnJvcihzdGF0dXMpKSB7Ci0JCQkJCQlyZWxvYWRDdXJyZW50TGlicmFyeU9uUm9sbGJhY2tFcnJvcigpOwotCQkJCQl9IGVsc2UgaWYgKCFDb21tYW5kU3RhdHVzQ2hlY2tlci5oYXNTYXZlRXJyb3Ioc3RhdHVzKSkgewotCQkJCQkJZGlzcGxheUVycm9yKHN0YXR1cyk7Ci0JCQkJCX0KLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCUNvbGxlY3Rpb248Pz4gcmVzdWx0ID0gZ2V0Q29tbWFuZCgpLmdldFJlc3VsdCgpOwotCQlmb3IgKE9iamVjdCBvIDogcmVzdWx0KSB7Ci0JCQlPYmplY3Qgb2JqID0gVG5nVXRpbC51bndyYXAobyk7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgRU9iamVjdCAmJiAoKEVPYmplY3QpIG9iaikuZUNvbnRhaW5lcigpICE9IG51bGwpIHsKLQkJCQkvLyBPcGVuIHRoZSBlZGl0b3IgZm9yIHRoZSBuZXdseSBjcmVhdGVkIGVsZW1lbnQuCi0JCQkJSUVkaXRvcktlZXBlci5SRUZFUkVOQ0UuZ2V0RWRpdG9yS2VlcGVyKCkub3BlbkVkaXRvcihvYmopOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZFdyYXBwZXIjY2FuVW5kbygpCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2FuVW5kbygpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kQWN0aW9uRGVsZWdhdGUjZ2V0SW1hZ2UoKQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoKSB7Ci0JCUNvbW1hbmRBY3Rpb25EZWxlZ2F0ZSBjbWQgPSAoQ29tbWFuZEFjdGlvbkRlbGVnYXRlKSBnZXRDb21tYW5kKCk7Ci0JCXJldHVybiBjbWQuZ2V0SW1hZ2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZEFjdGlvbkRlbGVnYXRlI2dldFRleHQoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpIHsKLQkJQ29tbWFuZEFjdGlvbkRlbGVnYXRlIGNtZCA9IChDb21tYW5kQWN0aW9uRGVsZWdhdGUpIGdldENvbW1hbmQoKTsKLQkJcmV0dXJuIGNtZC5nZXRUZXh0KCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRBY3Rpb25EZWxlZ2F0ZSNnZXRUb29sVGlwVGV4dCgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUb29sVGlwVGV4dCgpIHsKLQkJQ29tbWFuZEFjdGlvbkRlbGVnYXRlIGNtZCA9IChDb21tYW5kQWN0aW9uRGVsZWdhdGUpIGdldENvbW1hbmQoKTsKLQkJcmV0dXJuIGNtZC5nZXRUb29sVGlwVGV4dCgpOwotCX0KLQotCS8qKgotCSAqIERpc3BsYXkgYW4gZXJyb3IgZGlhbG9nLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRpc3BsYXlFcnJvcihJU3RhdHVzIHN0YXR1cykgewotCQlpbnQgc2V2ZXJpdHkgPSBzdGF0dXMuZ2V0U2V2ZXJpdHkoKTsKLQkJaWYgKHNldmVyaXR5ID09IElTdGF0dXMuRVJST1IgfHwgc2V2ZXJpdHkgPT0gSVN0YXR1cy5XQVJOSU5HKSB7Ci0JCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkuZGlzcGxheSgKLQkJCQkJZ2V0TGFiZWwoKSwKLQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuZXJyb3JEaWFsb2dfY3JlYXRlRXJyb3IKLQkJCQkJLCBzdGF0dXMpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvQ3VzdG9tQ2F0ZWdvcnlEZWVwQ29weUFjdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL0N1c3RvbUNhdGVnb3J5RGVlcENvcHlBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjJlNzBlOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvQ3VzdG9tQ2F0ZWdvcnlEZWVwQ29weUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZGlhbG9ncy5Bc3NpZ25EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS52aWV3cy5MaWJyYXJ5VmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci0KLS8qKgotICogRGVlcCBjb3B5IGN1c3RvbWUgY2F0ZWdvcnkgYWN0aW9uCi0gKiAKLSAqIEBhdXRob3IgV2VpcGluZyBMdQotICogQHNpbmNlICAxLjUKLSAqLwotcHVibGljIGNsYXNzIEN1c3RvbUNhdGVnb3J5RGVlcENvcHlBY3Rpb24gZXh0ZW5kcyBBc3NpZ25BY3Rpb24gewotCi0JLyoqCi0JICogQHBhcmFtIGxpYlZpZXcKLQkgKi8KLQlwdWJsaWMgQ3VzdG9tQ2F0ZWdvcnlEZWVwQ29weUFjdGlvbihMaWJyYXJ5VmlldyBsaWJWaWV3KSB7Ci0JCXN1cGVyKGxpYlZpZXcpOwotCQlzZXRUZXh0KEF1dGhvcmluZ1VJUmVzb3VyY2VzLmRlZXBDb3B5QWN0aW9uX3RleHQpOwotCX0KLQkKLQlwcm90ZWN0ZWQgQXNzaWduRGlhbG9nIGdldERpYWxvZyhDb2xsZWN0aW9uIGVsZW1lbnRzKSB7Ci0JCXJldHVybiBBc3NpZ25EaWFsb2cubmV3RGVlcENvcHlEaWFsb2coZ2V0TGlicmFyeVZpZXcoKS5nZXRTaXRlKCkuZ2V0U2hlbGwoKSwgZWxlbWVudHMpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL0RpYWdyYW1QcmludEFjdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL0RpYWdyYW1QcmludEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NjQ4ZDRmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9EaWFncmFtUHJpbnRBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5HcmFwaGljYWxWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnByaW50LlByaW50R3JhcGhpY2FsVmlld2VyT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi51aS5hY3Rpb25zLlByaW50QWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LnByaW50aW5nLlByaW50RGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5wcmludGluZy5QcmludGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5wcmludGluZy5QcmludGVyRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLQotLyoqCi0gKiAKLSAqIFByaW50IGRpYWdyYW0KLSAqIAotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAc2luY2UgMS4wCi0gKgotICovCi1wdWJsaWMgY2xhc3MgRGlhZ3JhbVByaW50QWN0aW9uIGV4dGVuZHMgUHJpbnRBY3Rpb24gewotCi0JR3JhcGhpY2FsVmlld2VyIHZpZXdlcjsKLQkvKioKLQkgKiBAcGFyYW0gcGFydAotCSAqLwotCXB1YmxpYyBEaWFncmFtUHJpbnRBY3Rpb24oSVdvcmtiZW5jaFBhcnQgcGFydCwgR3JhcGhpY2FsVmlld2VyIHZpZXdlcikgewotCQlzdXBlcihwYXJ0KTsKLQkJdGhpcy52aWV3ZXIgPSB2aWV3ZXI7Ci0JfQotCQotCS8qIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZ2VmLnVpLmFjdGlvbnMuUHJpbnRBY3Rpb24jcnVuKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCS8vR3JhcGhpY2FsVmlld2VyIHZpZXdlcjsKLQkJUHJpbnREaWFsb2cgZGlhbG9nID0gbmV3IFByaW50RGlhbG9nKHZpZXdlci5nZXRDb250cm9sKCkuZ2V0U2hlbGwoKSwgU1dULk5VTEwpOwotCQlQcmludGVyRGF0YSBkYXRhID0gZGlhbG9nLm9wZW4oKTsKLQkJCi0JCWlmIChkYXRhICE9IG51bGwpIHsKLQkJCVByaW50R3JhcGhpY2FsVmlld2VyT3BlcmF0aW9uIG9wID0gCi0JCQkJCQluZXcgUHJpbnRHcmFwaGljYWxWaWV3ZXJPcGVyYXRpb24obmV3IFByaW50ZXIoZGF0YSksIHZpZXdlcik7Ci0JCQlvcC5ydW4oZ2V0V29ya2JlbmNoUGFydCgpLmdldFRpdGxlKCkpOwotCQl9Ci0JCXN1cGVyLnJ1bigpOwotCX0KLQkKLQkvKioKLQkgKiBTZXQgZ3JhcGhpY2FsIHZpZXdlcgotCSAqIEBwYXJhbSB2aWV3ZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWaWV3ZXIoR3JhcGhpY2FsVmlld2VyIHZpZXdlcikgewotCQl0aGlzLnZpZXdlciA9IHZpZXdlcjsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIGdyYXBoaWNhbCB2aWV3ZXIKLQkgKiBAcmV0dXJuIHZpZXdlcgotCSAqLwotCXB1YmxpYyBHcmFwaGljYWxWaWV3ZXIgZ2V0Vmlld2VyKCkgewotCQlyZXR1cm4gdmlld2VyOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL0lMaWJyYXJ5QWN0aW9uQmFyQ29udHJpYnV0b3IuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9JTGlicmFyeUFjdGlvbkJhckNvbnRyaWJ1dG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4ZGE1NDguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL0lMaWJyYXJ5QWN0aW9uQmFyQ29udHJpYnV0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkJhcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklWaWV3UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LklQYWdlOwotCi0vKioKLSAqIFRoZSBpbnRlcmZhY2UgZm9yIHRoZSBMaWJyYXJ5IHZpZXcgYWN0aW9uIGJhciBjb250cmlidXRvci4KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJTGlicmFyeUFjdGlvbkJhckNvbnRyaWJ1dG9yIGV4dGVuZHMKLQkJSUVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yIHsKLQotCXB1YmxpYyBJVmlld1BhcnQgZ2V0QWN0aXZlVmlldygpOwotCi0JcHVibGljIHZvaWQgc2V0QWN0aXZlVmlldyhJVmlld1BhcnQgcGFydCk7Ci0KLQlwdWJsaWMgdm9pZCBzaGFyZUdsb2JhbEFjdGlvbnMoSVBhZ2UgcGFnZSwgSUFjdGlvbkJhcnMgYWN0aW9uQmFycyk7Ci0KLQlwdWJsaWMgdm9pZCBtZW51QWJvdXRUb1Nob3coSU1lbnVNYW5hZ2VyIG1lbnVNYW5hZ2VyKTsKLQotCXB1YmxpYyB2b2lkIGRlYWN0aXZhdGUoKTsKLQotCXB1YmxpYyB2b2lkIGRpc2FibGVHbG9iYWxFZGl0TWVudSgpOwotCi0JcHVibGljIHZvaWQgZW5hYmxlR2xvYmFsRWRpdE1lbnUoKTsKLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL0lNZW51QWN0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvSU1lbnVBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTAyZDk5ZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvSU1lbnVBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklWaWV3UGFydDsKLQotCi0vKioKLSAqIEludGVyZmFjZSB0byBiZSB1c2VkIHRvIGFkZCBtZW51cyBmb3IgY29uZmlndXJhdGlvbiB2aWV3Ci0gKiAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS41Ci0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSU1lbnVBY3Rpb24gIHsKLQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZSBjb25maWcgdmlldyBtZW51IGFjdGlvbiBwcm92aWRlcgotCSAqIEBwYXJhbSB0b29sa2l0Ci0JICogQHBhcmFtIHBhcmVudAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSVZpZXdQYXJ0IHZpZXcpOwotCQotCQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL0lNb2RpZnlpbmdBY3Rpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9JTW9kaWZ5aW5nQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3MTM0NWQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL0lNb2RpZnlpbmdBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luZSAxLjIKLSAqLwotcHVibGljIGludGVyZmFjZSBJTW9kaWZ5aW5nQWN0aW9uIGV4dGVuZHMgSUFjdGlvbiB7Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9JV29ya2JlbmNoUGFydEFjdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL0lXb3JrYmVuY2hQYXJ0QWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExY2IwMmIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL0lXb3JrYmVuY2hQYXJ0QWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLQotLyoqCi0gKiBJbnRlcmZhY2UgZm9yIHdvcmtiZW5jaCBwYXJ0Ci0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlIAotICogQHNpbmNlICAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJV29ya2JlbmNoUGFydEFjdGlvbiB7Ci0Jdm9pZCBzZXRBY3RpdmVXb3JrYmVuY2hQYXJ0KElXb3JrYmVuY2hQYXJ0IHdvcmtiZW5jaFBhcnQpOwotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL0luZGVudEFjdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL0luZGVudEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZTM0NGJkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9JbmRlbnRBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5BYnN0cmFjdENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLlVuZXhlY3V0YWJsZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5BZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLklFZGl0aW5nRG9tYWluUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5Db21tYW5kQWN0aW9uSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5Qcm9jZXNzRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JUmVzb3VyY2VBd2FyZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLkRlcGVuZGVuY3lDaGVja2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dEltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc1BhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtPcmRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQnVzeUluZGljYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLQotLyoqCi0gKiBJbmRlbnRzIGJyZWFrZG93biBlbGVtZW50cyBpbiBhIHByb2Nlc3MgdHJlZS4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAgMS4yCi0gKi8KLXB1YmxpYyBjbGFzcyBJbmRlbnRBY3Rpb24gZXh0ZW5kcwotCQlDb21tYW5kQWN0aW9uSGFuZGxlciBpbXBsZW1lbnRzIElXb3JrYmVuY2hQYXJ0QWN0aW9uLCBJTW9kaWZ5aW5nQWN0aW9uIHsKLQotCXB1YmxpYyBzdGF0aWMgY2xhc3MgSW5kZW50Q29tbWFuZCBleHRlbmRzIEFic3RyYWN0Q29tbWFuZCBpbXBsZW1lbnRzIElSZXNvdXJjZUF3YXJlQ29tbWFuZCB7Ci0JCQotCQlwcml2YXRlIENvbGxlY3Rpb248QnJlYWtkb3duRWxlbWVudD4gZWxlbWVudHM7Ci0JCXByaXZhdGUgQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3Rvcnk7Ci0JCXByaXZhdGUgU2V0IG1vZGlmaWVkUmVzb3VyY2VzOwotCQlwcml2YXRlIEJyZWFrZG93bkVsZW1lbnQgZWxlbWVudDsKLQkJcHJpdmF0ZSBBY3Rpdml0eSBvbGRQYXJlbnQ7Ci0JCXByaXZhdGUgQWN0aXZpdHkgbmV3UGFyZW50OwotCQlwcml2YXRlIGludCBvbGRJbmRleDsKLQkJcHJpdmF0ZSBNYXA8V29ya0JyZWFrZG93bkVsZW1lbnQsIFdvcmtPcmRlcj4gY2lyY3VsYXJXb3JrT3JkZXJzOwotCi0JCXB1YmxpYyBJbmRlbnRDb21tYW5kKENvbGxlY3Rpb248QnJlYWtkb3duRWxlbWVudD4gY29sbGVjdGlvbiwgQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJCXRoaXMuZWxlbWVudHMgPSBjb2xsZWN0aW9uOwotCQkJdGhpcy5hZGFwdGVyRmFjdG9yeSA9IGFkYXB0ZXJGYWN0b3J5OwotCQkJc2V0TGFiZWwoTEFCRUwpOwotCQl9Ci0KLQkJcHVibGljIENvbGxlY3Rpb24gZ2V0TW9kaWZpZWRSZXNvdXJjZXMoKSB7Ci0JCQlpZihtb2RpZmllZFJlc291cmNlcyA9PSBudWxsKSB7Ci0JCQkJUHJvY2VzcyBwcm9jID0gbnVsbDsKLQkJCQlmb3IgKEl0ZXJhdG9yPEJyZWFrZG93bkVsZW1lbnQ+IGl0ZXIgPSBlbGVtZW50cy5pdGVyYXRvcigpOyBwcm9jID09IG51bGwgJiYgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCUJyZWFrZG93bkVsZW1lbnQgZSA9IGl0ZXIubmV4dCgpOwotCQkJCQlwcm9jID0gVG5nVXRpbC5nZXRPd25pbmdQcm9jZXNzKGUpOwotCQkJCX0KLQkJCQlpZihwcm9jICE9IG51bGwpIHsKLQkJCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSBwcm9jLmVSZXNvdXJjZSgpOwotCQkJCQlpZihyZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQkJCQltb2RpZmllZFJlc291cmNlcyA9IENvbGxlY3Rpb25zLnNpbmdsZXRvbihwcm9jLmVSZXNvdXJjZSgpKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlpZihtb2RpZmllZFJlc291cmNlcyA9PSBudWxsKSB7Ci0JCQkJCW1vZGlmaWVkUmVzb3VyY2VzID0gQ29sbGVjdGlvbnMuRU1QVFlfU0VUOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBtb2RpZmllZFJlc291cmNlczsKLQkJfQotCQkKLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBib29sZWFuIHByZXBhcmUoKSB7Ci0JCQllbGVtZW50ID0gZWxlbWVudHMuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCQlvbGRQYXJlbnQgPSBlbGVtZW50LmdldFN1cGVyQWN0aXZpdGllcygpOwotCQkJaWYob2xkUGFyZW50ID09IG51bGwpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQlvbGRJbmRleCA9IG9sZFBhcmVudC5nZXRCcmVha2Rvd25FbGVtZW50cygpLmluZGV4T2YoZWxlbWVudCk7Ci0JCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIgaXAgPSAoSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyKSBhZGFwdGVyRmFjdG9yeS5hZGFwdChvbGRQYXJlbnQsIAotCQkJCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkJTGlzdDxPYmplY3Q+IGNoaWxkcmVuID0gbmV3IExpbmtlZExpc3Q8T2JqZWN0PihpcC5nZXRDaGlsZHJlbihvbGRQYXJlbnQpKTsKLQkJCWludCBpbmRleCA9IGNoaWxkcmVuLmluZGV4T2YoZWxlbWVudCk7Ci0JCQlpZihpbmRleCA+IDApIHsKLQkJCQlPYmplY3QgcHJldiA9IGNoaWxkcmVuLmdldChpbmRleCAtIDEpOwotCQkJCWlmKHByZXYgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCQluZXdQYXJlbnQgPSAoQWN0aXZpdHkpIHByZXY7Ci0JCQkJCXJldHVybiBEZXBlbmRlbmN5Q2hlY2tlci5jaGVja0NpcmN1bGFyRm9yTW92aW5nVmFyaWFiaWxpdHlFbGVtZW50KG5ld1BhcmVudCwgQ29sbGVjdGlvbnMuc2luZ2xldG9uKGVsZW1lbnQpLCB0cnVlKTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQkJbmV3UGFyZW50LmdldEJyZWFrZG93bkVsZW1lbnRzKCkuYWRkKGVsZW1lbnQpOwotCQkJCi0JCQkvLyByZW1vdmUgY2lyY3VsYXIgd29yayBvcmRlcnMKLQkJCS8vCi0JCQlpZihlbGVtZW50IGluc3RhbmNlb2YgV29ya0JyZWFrZG93bkVsZW1lbnQpIHsKLQkJCQlpZihjaXJjdWxhcldvcmtPcmRlcnMgPT0gbnVsbCkgewotCQkJCQljaXJjdWxhcldvcmtPcmRlcnMgPSBuZXcgSGFzaE1hcDxXb3JrQnJlYWtkb3duRWxlbWVudCwgV29ya09yZGVyPigpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJY2lyY3VsYXJXb3JrT3JkZXJzLmNsZWFyKCk7Ci0JCQkJfQotCQkJCVdvcmtPcmRlciB3byA9IFVtYVV0aWwuZmluZFdvcmtPcmRlcihuZXdQYXJlbnQsIGVsZW1lbnQpOwotCQkJCWlmKHdvICE9IG51bGwpIHsJCi0JCQkJCW5ld1BhcmVudC5nZXRMaW5rVG9QcmVkZWNlc3NvcigpLnJlbW92ZSh3byk7Ci0JCQkJCWNpcmN1bGFyV29ya09yZGVycy5wdXQobmV3UGFyZW50LCB3byk7Ci0JCQkJfQotCQkJCVdvcmtCcmVha2Rvd25FbGVtZW50IHdiZSA9IChXb3JrQnJlYWtkb3duRWxlbWVudCkgZWxlbWVudDsKLQkJCQl3byA9IFVtYVV0aWwuZmluZFdvcmtPcmRlcih3YmUsIG5ld1BhcmVudCk7Ci0JCQkJaWYod28gIT0gbnVsbCkgewotCQkJCQl3YmUuZ2V0TGlua1RvUHJlZGVjZXNzb3IoKS5yZW1vdmUod28pOwotCQkJCQljaXJjdWxhcldvcmtPcmRlcnMucHV0KHdiZSwgd28pOwotCQkJCX0KLQkJCX0JCQkKLQkJCQotCQkJLy8gbW92ZSB0aGUgcHJvY2VzcyBwYWNha2dlIG9mIHRoZSBhY3Rpdml0eSB0byBuZXcgcGFyZW50IHBhY2thZ2UKLQkJCS8vCi0JCQlpZihlbGVtZW50IGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQlQcm9jZXNzUGFja2FnZSBwYXJlbnRQa2cgPSAoUHJvY2Vzc1BhY2thZ2UpIG5ld1BhcmVudC5lQ29udGFpbmVyKCk7Ci0JCQkJcGFyZW50UGtnLmdldENoaWxkUGFja2FnZXMoKS5hZGQoKE1ldGhvZFBhY2thZ2UpIGVsZW1lbnQuZUNvbnRhaW5lcigpKTsKLQkJCX0KLQkJfQotCi0JCXB1YmxpYyB2b2lkIHJlZG8oKSB7Ci0JCQlleGVjdXRlKCk7Ci0JCX0KLQkJCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgdm9pZCB1bmRvKCkgewotCQkJaWYoY2lyY3VsYXJXb3JrT3JkZXJzICE9IG51bGwgJiYgIWNpcmN1bGFyV29ya09yZGVycy5pc0VtcHR5KCkpIHsKLQkJCQlmb3IgKE1hcC5FbnRyeTxXb3JrQnJlYWtkb3duRWxlbWVudCwgV29ya09yZGVyPiBlbnRyeSA6IGNpcmN1bGFyV29ya09yZGVycy5lbnRyeVNldCgpKSB7Ci0JCQkJCWVudHJ5LmdldEtleSgpLmdldExpbmtUb1ByZWRlY2Vzc29yKCkuYWRkKGVudHJ5LmdldFZhbHVlKCkpOwotCQkJCX0KLQkJCQljaXJjdWxhcldvcmtPcmRlcnMuY2xlYXIoKTsKLQkJCX0KLQkJCW9sZFBhcmVudC5nZXRCcmVha2Rvd25FbGVtZW50cygpLmFkZChvbGRJbmRleCwgZWxlbWVudCk7CQkJCi0JCQlpZihlbGVtZW50IGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQlQcm9jZXNzUGFja2FnZSBwYXJlbnRQa2cgPSAoUHJvY2Vzc1BhY2thZ2UpIG9sZFBhcmVudC5lQ29udGFpbmVyKCk7Ci0JCQkJcGFyZW50UGtnLmdldENoaWxkUGFja2FnZXMoKS5hZGQoKE1ldGhvZFBhY2thZ2UpIGVsZW1lbnQuZUNvbnRhaW5lcigpKTsKLQkJCX0KLQkJfQotCQkKLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBDb2xsZWN0aW9uIGdldEFmZmVjdGVkT2JqZWN0cygpIHsKLQkJCXJldHVybiBlbGVtZW50czsKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMQUJFTCA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLlByb2Nlc3NFZGl0b3JfQWN0aW9uX0luZGVudDsKLQotCXByaXZhdGUgUHJvY2Vzc0VkaXRvciBlZGl0b3I7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlCi0JICogQHBhcmFtIHRleHQKLQkgKi8KLQlwdWJsaWMgSW5kZW50QWN0aW9uKFN0cmluZyB0ZXh0KSB7Ci0JCXN1cGVyKG51bGwsIHRleHQpOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlCi0JICoKLQkgKi8KLQlwdWJsaWMgSW5kZW50QWN0aW9uKCkgewotCQl0aGlzKExBQkVMKTsKLQkJc2V0SW1hZ2VEZXNjcmlwdG9yKFJpY2hUZXh0SW1hZ2VzLklNR19ERVNDX0lOREVOVCk7Ci0JCXNldERpc2FibGVkSW1hZ2VEZXNjcmlwdG9yKFJpY2hUZXh0SW1hZ2VzLkRJU0FCTEVEX0lNR19ERVNDX0lOREVOVCk7Ci0JCXNldFRvb2xUaXBUZXh0KExBQkVMKTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uQ29tbWFuZEFjdGlvbkhhbmRsZXIjdXBkYXRlU2VsZWN0aW9uKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb24pCi0JICovCi0JcHVibGljIGJvb2xlYW4gdXBkYXRlU2VsZWN0aW9uKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQkvLyBzdXBwb3J0IGluZGVudCBvbmx5IG9uZSBhY3Rpdml0eSBmb3Igbm93Ci0JCS8vCi0JCWJvb2xlYW4gcmV0ID0gZmFsc2U7Ci0JCWlmKHNlbGVjdGlvbi5zaXplKCkgPT0gMSkgewotCQkJT2JqZWN0IGUgPSBzZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCQlpZihlIGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQlyZXQgPSBzdXBlci51cGRhdGVTZWxlY3Rpb24oc2VsZWN0aW9uKTsJCQkJCi0JCQl9Ci0JCX0KLQkJc2V0RW5hYmxlZChyZXQpOwotCQlyZXR1cm4gcmV0OwotCQkKLQkJLy9UT0RPOiBzdXBwb3J0IGluZGVudCBtdWx0aXBsZSBhY3Rpdml0aWVzIGluIHNlbGVjdGlvbgotLy8JCUFycmF5TGlzdDxBY3Rpdml0eT4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8QWN0aXZpdHk+KCk7Ci0vLwkJZm9yIChJdGVyYXRvciBpdGVyID0gc2VsZWN0aW9uLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotLy8JCQlPYmplY3QgZWxlbWVudCA9IGl0ZXIubmV4dCgpOwotLy8JCQlpZihlbGVtZW50IGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLS8vCQkJCWxpc3QuYWRkKChBY3Rpdml0eSkgZWxlbWVudCk7Ci0vLwkJCX0KLS8vCQl9Ci0vLwkJaWYobGlzdC5pc0VtcHR5KCkpIHsKLS8vCQkJcmV0dXJuIGZhbHNlOwotLy8JCX0KLS8vCQlyZXR1cm4gc3VwZXIudXBkYXRlU2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKGxpc3QpKTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uQ29tbWFuZEFjdGlvbkhhbmRsZXIjY3JlYXRlQ29tbWFuZChqYXZhLnV0aWwuQ29sbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgQ29tbWFuZCBjcmVhdGVDb21tYW5kKENvbGxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCWlmKGRvbWFpbiBpbnN0YW5jZW9mIEFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbikgewotCQkJcmV0dXJuIG5ldyBJbmRlbnRDb21tYW5kKHNlbGVjdGlvbiwgKChBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW4pZG9tYWluKS5nZXRBZGFwdGVyRmFjdG9yeSgpKTsKLQkJfQotCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQl9CQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnMuSVdvcmtiZW5jaFBhcnRBY3Rpb24jc2V0QWN0aXZlV29ya2JlbmNoUGFydChvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBY3RpdmVXb3JrYmVuY2hQYXJ0KElXb3JrYmVuY2hQYXJ0IHdvcmtiZW5jaFBhcnQpIHsKLQkJaWYod29ya2JlbmNoUGFydCBpbnN0YW5jZW9mIElFZGl0aW5nRG9tYWluUHJvdmlkZXIpIHsKLQkJCWRvbWFpbiA9ICgoSUVkaXRpbmdEb21haW5Qcm92aWRlcil3b3JrYmVuY2hQYXJ0KS5nZXRFZGl0aW5nRG9tYWluKCk7Ci0JCX0KLQkJaWYod29ya2JlbmNoUGFydCBpbnN0YW5jZW9mIFByb2Nlc3NFZGl0b3IpIHsKLQkJCWVkaXRvciA9IChQcm9jZXNzRWRpdG9yKSB3b3JrYmVuY2hQYXJ0OwotCQl9CQkKLQkJZWxzZSBpZih3b3JrYmVuY2hQYXJ0ID09IG51bGwpIHsKLQkJCWVkaXRvciA9IG51bGw7Ci0JCX0KLQl9CQotCQotCXByaXZhdGUgdm9pZCBzdXBlclJ1bigpIHsKLQkJc3VwZXIucnVuKCk7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkNvbW1hbmRBY3Rpb25IYW5kbGVyI3J1bigpCi0JICovCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQlCdXN5SW5kaWNhdG9yLnNob3dXaGlsZShlZGl0b3IuZ2V0RWRpdG9yU2l0ZSgpCi0JCQkJLmdldFNoZWxsKCkuZ2V0RGlzcGxheSgpLCBuZXcgUnVubmFibGUoKSB7Ci0KLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJc3VwZXJSdW4oKTsKLQkJCQkJfQotCQkJCi0JCX0pOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9MYXlvdXRBY3Rpb25Hcm91cC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL0xheW91dEFjdGlvbkdyb3VwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzNjdiYWYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL0xheW91dEFjdGlvbkdyb3VwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSUhlbHBDb250ZXh0czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJSW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcmVmZXJlbmNlcy5BcHBsaWNhdGlvblByZWZlcmVuY2VDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS52aWV3cy5MaWJyYXJ5VmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlBsdWdpblVJUGFja2FnZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5NZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uU2VwYXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklBY3Rpb25CYXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hBY3Rpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLQotLyoqCi0gKiAKLSAqIENvZGUgdGFrZW4gZnJvbSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwudWkucGFja2FnZXZpZXcuTGF5b3V0QWN0aW9uR3JvdXAKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBMYXlvdXRBY3Rpb25Hcm91cCBleHRlbmRzIE11bHRpQWN0aW9uR3JvdXAgewotCi0JcHVibGljIExheW91dEFjdGlvbkdyb3VwKExpYnJhcnlWaWV3IGxpYlZpZXcpIHsKLQkJc3VwZXIoY3JlYXRlQWN0aW9ucyhsaWJWaWV3KSwgZ2V0U2VsZWN0ZWRTdGF0ZShsaWJWaWV3KSk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgQWN0aW9uR3JvdXAjZmlsbEFjdGlvbkJhcnMoSUFjdGlvbkJhcnMpCi0JICovCi0JcHVibGljIHZvaWQgZmlsbEFjdGlvbkJhcnMoSUFjdGlvbkJhcnMgYWN0aW9uQmFycykgewotCQlzdXBlci5maWxsQWN0aW9uQmFycyhhY3Rpb25CYXJzKTsKLQkJY29udHJpYnV0ZVRvVmlld01lbnUoYWN0aW9uQmFycy5nZXRNZW51TWFuYWdlcigpKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNvbnRyaWJ1dGVUb1ZpZXdNZW51KElNZW51TWFuYWdlciB2aWV3TWVudSkgewotCQl2aWV3TWVudS5hZGQobmV3IFNlcGFyYXRvcigpKTsKLQotCQkvLyBDcmVhdGUgbGF5b3V0IHN1YiBtZW51Ci0JCQotCQlJTWVudU1hbmFnZXIgbGF5b3V0U3ViTWVudT0gbmV3IE1lbnVNYW5hZ2VyKEF1dGhvcmluZ1VJUmVzb3VyY2VzLkxheW91dEFjdGlvbkdyb3VwX2xhYmVsKTsgCi0JCWZpbmFsIFN0cmluZyBsYXlvdXRHcm91cE5hbWU9ICJsYXlvdXQiOyAvLyROT04tTkxTLTEkCi0JCVNlcGFyYXRvciBtYXJrZXI9IG5ldyBTZXBhcmF0b3IobGF5b3V0R3JvdXBOYW1lKTsKLQotCQl2aWV3TWVudS5hZGQobmV3IFNlcGFyYXRvcihJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLk1CX0FERElUSU9OUykpOwotCQl2aWV3TWVudS5hZGQobWFya2VyKTsKLQkJdmlld01lbnUuYXBwZW5kVG9Hcm91cChsYXlvdXRHcm91cE5hbWUsIGxheW91dFN1Yk1lbnUpOwotCQl2aWV3TWVudS5hZGQobmV3IFNlcGFyYXRvcihJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLk1CX0FERElUSU9OUysiLWVuZCIpKTsvLyROT04tTkxTLTEkCQkKLQkJYWRkQWN0aW9ucyhsYXlvdXRTdWJNZW51KTsKLQl9Ci0KLQlzdGF0aWMgaW50IGdldFNlbGVjdGVkU3RhdGUoTGlicmFyeVZpZXcgbGliVmlldykgewotCQlpZiAoUGx1Z2luVUlQYWNrYWdlQ29udGV4dC5JTlNUQU5DRS5pc0ZsYXRMYXlvdXQoKSkKLQkJCXJldHVybiAwOwotCQllbHNlCi0JCQlyZXR1cm4gMTsKLQl9Ci0JCi0Jc3RhdGljIElBY3Rpb25bXSBjcmVhdGVBY3Rpb25zKExpYnJhcnlWaWV3IGxpYlZpZXcpIHsKLQkJSUFjdGlvbiBmbGF0TGF5b3V0QWN0aW9uPSBuZXcgTGF5b3V0QWN0aW9uKGxpYlZpZXcsIHRydWUpOwotCQlmbGF0TGF5b3V0QWN0aW9uLnNldFRleHQoQXV0aG9yaW5nVUlSZXNvdXJjZXMuTGF5b3V0QWN0aW9uR3JvdXBfZmxhdExheW91dEFjdGlvbl9sYWJlbCk7IAotCQlmbGF0TGF5b3V0QWN0aW9uLnNldEltYWdlRGVzY3JpcHRvcihBdXRob3JpbmdVSUltYWdlcy5JTUdfREVTQ19MQVlPVVRfRkxBVCk7Ci0JCUlBY3Rpb24gaGllcmFyY2hpY2FsTGF5b3V0PSBuZXcgTGF5b3V0QWN0aW9uKGxpYlZpZXcsIGZhbHNlKTsKLQkJaGllcmFyY2hpY2FsTGF5b3V0LnNldFRleHQoQXV0aG9yaW5nVUlSZXNvdXJjZXMuTGF5b3V0QWN0aW9uR3JvdXBfaGllcmFyY2hpY2FsTGF5b3V0QWN0aW9uX2xhYmVsKTsKLQkJaGllcmFyY2hpY2FsTGF5b3V0LnNldEltYWdlRGVzY3JpcHRvcihBdXRob3JpbmdVSUltYWdlcy5JTUdfREVTQ19MQVlPVVRfSElFUkFSQ0hJQ0FMKTsKLQkJCi0JCXJldHVybiBuZXcgSUFjdGlvbltde2ZsYXRMYXlvdXRBY3Rpb24sIGhpZXJhcmNoaWNhbExheW91dH07Ci0JfQotfQotCi1jbGFzcyBMYXlvdXRBY3Rpb24gZXh0ZW5kcyBBY3Rpb24gaW1wbGVtZW50cyBJQWN0aW9uIHsKLQotCXByaXZhdGUgYm9vbGVhbiBmSXNGbGF0TGF5b3V0OwotCXByaXZhdGUgTGlicmFyeVZpZXcgZmxpYlZpZXc7Ci0KLQlwdWJsaWMgTGF5b3V0QWN0aW9uKExpYnJhcnlWaWV3IGxpYlZpZXcsIGJvb2xlYW4gZmxhdCkgewotCQlzdXBlcigiIiwgQVNfUkFESU9fQlVUVE9OKTsgLy8kTk9OLU5MUy0xJAotCi0JCWZJc0ZsYXRMYXlvdXQ9IGZsYXQ7Ci0JCWZsaWJWaWV3PSBsaWJWaWV3OwotCQlpZiAoZklzRmxhdExheW91dCkKLQkJCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAodGhpcywgQXV0aG9yaW5nVUlIZWxwQ29udGV4dHMuTEFZT1VUX0ZMQVRfQUNUSU9OKTsKLQkJZWxzZQotCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscCh0aGlzLCBBdXRob3JpbmdVSUhlbHBDb250ZXh0cy5MQVlPVVRfSElFUkFSQ0hJQ0FMX0FDVElPTik7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uI3J1bigpCi0JICovCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQlpZiAoUGx1Z2luVUlQYWNrYWdlQ29udGV4dC5JTlNUQU5DRS5pc0ZsYXRMYXlvdXQoKSAhPSBmSXNGbGF0TGF5b3V0KSB7Ci0JCQlQbHVnaW5VSVBhY2thZ2VDb250ZXh0LklOU1RBTkNFLnRvZ2dsZUxheW91dCgpOwotCQkJLy8gc2F2ZSBzdGF0ZQotCQkJQXBwbGljYXRpb25QcmVmZXJlbmNlQ29uc3RhbnRzLnNldExheW91dChQbHVnaW5VSVBhY2thZ2VDb250ZXh0LklOU1RBTkNFLmdldExheW91dEFzU3RyaW5nKCkpOwotCQl9Ci0JCWZsaWJWaWV3LmdldFZpZXdlcigpLmdldENvbnRyb2woKS5zZXRSZWRyYXcoZmFsc2UpOwotCQlmbGliVmlldy5nZXRWaWV3ZXIoKS5yZWZyZXNoKCk7Ci0JCWZsaWJWaWV3LmdldFZpZXdlcigpLmdldENvbnRyb2woKS5zZXRSZWRyYXcodHJ1ZSk7Ci0KLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvTGlicmFyeUFjdGlvbkJhckNvbnRyaWJ1dG9yLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvTGlicmFyeUFjdGlvbkJhckNvbnRyaWJ1dG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1NTNmOTguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL0xpYnJhcnlBY3Rpb25CYXJDb250cmlidXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51aS52aWV3ZXIuSVZpZXdlclByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5JRWRpdGluZ0RvbWFpblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5Db3B5QWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5DdXRBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkRlbGV0ZUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uRWRpdGluZ0RvbWFpbkFjdGlvbkJhckNvbnRyaWJ1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5QYXN0ZUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uUmVkb0FjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uVW5kb0FjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLlByb2Nlc3NFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnZhbGlkYXRpb24uTGlicmFyeUVWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uQ29udHJpYnV0aW9uSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUNvbnRyaWJ1dGlvbkl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklDb250cmlidXRpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklUb29sQmFyTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uTWVudU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLlNlcGFyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uU3ViQ29udHJpYnV0aW9uSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklBY3Rpb25CYXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklTaGFyZWRJbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVZpZXdQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBhcnRJbml0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5BY3Rpb25GYWN0b3J5OwotCi0vKioKLSAqIFRoZSBMaWJyYXJ5IHZpZXcgYWN0aW9uIGJhciBjb250cmlidXRvci4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIExpYnJhcnlBY3Rpb25CYXJDb250cmlidXRvciBleHRlbmRzCi0JCUVkaXRpbmdEb21haW5BY3Rpb25CYXJDb250cmlidXRvciBpbXBsZW1lbnRzCi0JCUlMaWJyYXJ5QWN0aW9uQmFyQ29udHJpYnV0b3IsIElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgewotCi0JLy8gS2VlcCB0cmFjayBvZiB0aGUgYWN0aXZlIGVkaXRvci4KLQlwcm90ZWN0ZWQgSVZpZXdQYXJ0IGFjdGl2ZVZpZXdQYXJ0OwotCi0JLy8gS2VlcCB0cmFjayBvZiB0aGUgY3VycmVudCBzZWxlY3Rpb24gcHJvdmlkZXIuCi0JcHJvdGVjdGVkIElTZWxlY3Rpb25Qcm92aWRlciBzZWxlY3Rpb25Qcm92aWRlcjsKLQotCXByb3RlY3RlZCBJQWN0aW9uQmFycyB2aWV3QWN0aW9uQmFyczsKLQotCS8vIExpYnJhcnkgdmlldyBlZGl0IGFjdGlvbgotCXByb3RlY3RlZCBMaWJyYXJ5Vmlld0VkaXRBY3Rpb24gbGlicmFyeVZpZXdFZGl0QWN0aW9uOwotCi0JLy8gQ29uZmlndXJhdGlvbiB2aWV3IGVkaXQgYWN0aW9uCi0JcHJvdGVjdGVkIENvbmZpZ3VyYXRpb25WaWV3RWRpdEFjdGlvbiBjb25maWdWaWV3RWRpdEFjdGlvbjsKLQotCXByaXZhdGUgRWRpdGluZ0RvbWFpbiBlZGl0aW5nRG9tYWluOwotCQotCS8qKgotCSAqIERpc3BsYXlzIHRoZSBQcm9wZXJ0aWVzIHZpZXcuCi0JICovCi0JcHJvdGVjdGVkIElBY3Rpb24gc2hvd1Byb3BlcnRpZXNWaWV3QWN0aW9uID0gbmV3IEFjdGlvbigKLQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLl9VSV9TaG93UHJvcGVydGllc1ZpZXdfbWVudV9pdGVtKSB7IAotCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQl0cnkgewotCQkJCXRyeSB7Ci0JCQkJCWdldFBhZ2UoKS5zaG93Vmlldygib3JnLmVjbGlwc2UudWkudmlld3MuUHJvcGVydHlTaGVldCIpOyAvLyROT04tTkxTLTEkCi0JCQkJfSBjYXRjaCAoUGFydEluaXRFeGNlcHRpb24gZXhjZXB0aW9uKSB7Ci0JCQkJCWV4Y2VwdGlvbi5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQl9Ci0JCX0KLQl9OwotCi0JLyoqCi0JICogUmVmcmVzaGVzIHRoZSB2aWV3ZXIgb2YgdGhlIGN1cnJlbnQgZWRpdG9yIGlmIHRoZSBlZGl0b3IgaW1wbGVtZW50cwotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnVpLnZpZXdlci5JVmlld2VyUHJvdmlkZXJ9LgotCSAqLwotCXByb3RlY3RlZCBJQWN0aW9uIHJlZnJlc2hWaWV3ZXJBY3Rpb24gPSBuZXcgQWN0aW9uKAotCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuX1VJX1JlZnJlc2hWaWV3ZXJfbWVudV9pdGVtKSB7IAotCQlwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWQoKSB7Ci0JCQlyZXR1cm4gYWN0aXZlVmlld1BhcnQgaW5zdGFuY2VvZiBJVmlld2VyUHJvdmlkZXI7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQlpZiAoYWN0aXZlVmlld1BhcnQgaW5zdGFuY2VvZiBJVmlld2VyUHJvdmlkZXIpIHsKLQkJCQlWaWV3ZXIgdmlld2VyID0gKChJVmlld2VyUHJvdmlkZXIpIGFjdGl2ZVZpZXdQYXJ0KS5nZXRWaWV3ZXIoKTsKLQkJCQlpZiAodmlld2VyICE9IG51bGwpIHsKLQkJCQkJcmVmcmVzaFZpZXdlcih2aWV3ZXIpOwotCQkJCX0KLQkJCX0KLQkJfQotCX07Ci0KLQkvKioKLQkgKiBUaGlzIHdpbGwgY29udGFpbiBvbmUKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkNyZWF0ZUNoaWxkQWN0aW9ufSBjb3JyZXNwb25kaW5nIHRvCi0JICogZWFjaCBkZXNjcmlwdG9yIGdlbmVyYXRlZCBmb3IgdGhlIGN1cnJlbnQgc2VsZWN0aW9uIGJ5IHRoZSBpdGVtIHByb3ZpZGVyLgotCSAqLwotCXByb3RlY3RlZCBDb2xsZWN0aW9uIGNyZWF0ZUNoaWxkQWN0aW9uczsKLQotCS8qKgotCSAqIFRoZSBtZW51IG1hbmFnZXIgaW50byB3aGljaCBtZW51IGNvbnRyaWJ1dGlvbiBpdGVtcyBzaG91bGQgYmUgYWRkZWQgZm9yCi0JICogQ3JlYXRlQ2hpbGQgYWN0aW9ucy4KLQkgKi8KLQlwcm90ZWN0ZWQgSU1lbnVNYW5hZ2VyIGNyZWF0ZUNoaWxkTWVudU1hbmFnZXI7Ci0KLQkvKioKLQkgKiBUaGlzIHdpbGwgY29udGFpbiBvbmUKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkNyZWF0ZVNpYmxpbmdBY3Rpb259IGNvcnJlc3BvbmRpbmcKLQkgKiB0byBlYWNoIGRlc2NyaXB0b3IgZ2VuZXJhdGVkIGZvciB0aGUgY3VycmVudCBzZWxlY3Rpb24gYnkgdGhlIGl0ZW0KLQkgKiBwcm92aWRlci4KLQkgKi8KLQlwcm90ZWN0ZWQgQ29sbGVjdGlvbiBjcmVhdGVTaWJsaW5nQWN0aW9uczsKLQotCS8qKgotCSAqIFRoaXMgaXMgdGhlIG1lbnUgbWFuYWdlciBpbnRvIHdoaWNoIG1lbnUgY29udHJpYnV0aW9uIGl0ZW1zIHNob3VsZCBiZQotCSAqIGFkZGVkIGZvciBDcmVhdGVTaWJsaW5nIGFjdGlvbnMuCi0JICovCi0JcHJvdGVjdGVkIElNZW51TWFuYWdlciBjcmVhdGVTaWJsaW5nTWVudU1hbmFnZXI7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBMaWJyYXJ5QWN0aW9uQmFyQ29udHJpYnV0b3IoRWRpdGluZ0RvbWFpbiBlZGl0aW5nRG9tYWluKSB7Ci0JCXRoaXMuZWRpdGluZ0RvbWFpbiA9IGVkaXRpbmdEb21haW47Ci0JCQotCQl2YWxpZGF0ZUFjdGlvbiA9IG5ldyBMaWJyYXJ5VmFsaWRhdGVBY3Rpb24oKTsKLQkJKChMaWJyYXJ5VmFsaWRhdGVBY3Rpb24pdmFsaWRhdGVBY3Rpb24pLnB1dENvbnRleHREYXRhKExpYnJhcnlFVmFsaWRhdG9yLkNUWF9BREFQVEVSX0ZBQ1RPUllfUFJPVklERVIsCi0JCQkJUHJvY2Vzc0VkaXRvci5hZGFwdGVyRmFjdG9yeVByb3ZpZGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gdmlld2VyCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFZpZXdlcihWaWV3ZXIgdmlld2VyKSB7Ci0JCXZpZXdlci5yZWZyZXNoKCk7Ci0JfQotCi0JLyoqCi0JICogQWRkcyBTZXBhcmF0b3JzIGZvciBlZGl0b3IgYWRkaXRpb25zIHRvIHRoZSB0b29sIGJhci4KLQkgKi8KLQlwdWJsaWMgdm9pZCBjb250cmlidXRlVG9Ub29sQmFyKElUb29sQmFyTWFuYWdlciB0b29sQmFyTWFuYWdlcikgewotCQl0b29sQmFyTWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcigibWV0aG9kLXNldHRpbmdzIikpOyAvLyROT04tTkxTLTEkCi0JCXRvb2xCYXJNYW5hZ2VyLmFkZChuZXcgU2VwYXJhdG9yKCJtZXRob2QtYWRkaXRpb25zIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQWRkcyB0byB0aGUgbWVudSBiYXIgYSBtZW51IGFuZCBzb21lIHNlcGFyYXRvcnMgZm9yIGVkaXRvcgotCSAqIGFkZGl0aW9ucywgYXMgd2VsbCBhcyB0aGUgc3ViLW1lbnVzIGZvciBvYmplY3QgY3JlYXRpb24gaXRlbXMuCi0JICovCi0JcHVibGljIHZvaWQgY29udHJpYnV0ZVRvTWVudShJTWVudU1hbmFnZXIgbWVudU1hbmFnZXIpIHsKLQkJc3VwZXIuY29udHJpYnV0ZVRvTWVudShtZW51TWFuYWdlcik7Ci0KLQkJSU1lbnVNYW5hZ2VyIHN1Ym1lbnVNYW5hZ2VyID0gbmV3IE1lbnVNYW5hZ2VyKAotCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLl9VSV9NZXRob2RFZGl0b3JfbWVudSwgImNvbS5pYm0ubWV0aG9kTWVudUlEIik7IC8vJE5PTi1OTFMtMSQgIAotCQltZW51TWFuYWdlci5pbnNlcnRBZnRlcigiYWRkaXRpb25zIiwgc3VibWVudU1hbmFnZXIpOyAvLyROT04tTkxTLTEkCi0JCXN1Ym1lbnVNYW5hZ2VyLmFkZChuZXcgU2VwYXJhdG9yKCJzZXR0aW5ncyIpKTsgLy8kTk9OLU5MUy0xJAotCQlzdWJtZW51TWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcigiYWN0aW9ucyIpKTsgLy8kTk9OLU5MUy0xJAotCQlzdWJtZW51TWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcigiYWRkaXRpb25zIikpOyAvLyROT04tTkxTLTEkCi0JCXN1Ym1lbnVNYW5hZ2VyLmFkZChuZXcgU2VwYXJhdG9yKCJhZGRpdGlvbnMtZW5kIikpOyAvLyROT04tTkxTLTEkCi0KLQkJLy8gUHJlcGFyZSBmb3IgQ3JlYXRlQ2hpbGQgaXRlbSBhZGRpdGlvbiBvciByZW1vdmFsLgotCQljcmVhdGVDaGlsZE1lbnVNYW5hZ2VyID0gbmV3IE1lbnVNYW5hZ2VyKAotCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLl9VSV9DcmVhdGVDaGlsZF9tZW51X2l0ZW0pOyAKLQkJc3VibWVudU1hbmFnZXIuaW5zZXJ0QmVmb3JlKCJhZGRpdGlvbnMiLCBjcmVhdGVDaGlsZE1lbnVNYW5hZ2VyKTsgLy8kTk9OLU5MUy0xJAotCi0JCS8vIFByZXBhcmUgZm9yIENyZWF0ZVNpYmxpbmcgaXRlbSBhZGRpdGlvbiBvciByZW1vdmFsLgotCQljcmVhdGVTaWJsaW5nTWVudU1hbmFnZXIgPSBuZXcgTWVudU1hbmFnZXIoCi0JCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuX1VJX0NyZWF0ZVNpYmxpbmdfbWVudV9pdGVtKTsgCi0JCXN1Ym1lbnVNYW5hZ2VyLmluc2VydEJlZm9yZSgiYWRkaXRpb25zIiwgY3JlYXRlU2libGluZ01lbnVNYW5hZ2VyKTsgLy8kTk9OLU5MUy0xJAotCi0JCS8vIEZvcmNlIGFuIHVwZGF0ZSBiZWNhdXNlIEVjbGlwc2UgaGlkZXMgZW1wdHkgbWVudXMgbm93LgotCQlzdWJtZW51TWFuYWdlci5hZGRNZW51TGlzdGVuZXIobmV3IElNZW51TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBtZW51QWJvdXRUb1Nob3coSU1lbnVNYW5hZ2VyIG1lbnVNYW5hZ2VyKSB7Ci0JCQkJbWVudU1hbmFnZXIudXBkYXRlQWxsKHRydWUpOwotCQkJfQotCQl9KTsKLQotCQlhZGRHbG9iYWxBY3Rpb25zKHN1Ym1lbnVNYW5hZ2VyKTsKLQl9Ci0KLQlwdWJsaWMgSVZpZXdQYXJ0IGdldEFjdGl2ZVZpZXcoKSB7Ci0JCXJldHVybiBhY3RpdmVWaWV3UGFydDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRBY3RpdmVWaWV3KElWaWV3UGFydCBwYXJ0KSB7Ci0JCS8vIFRPRE8gLSBtYXkgbmVlZCB0byBjaGVjayBvdGhlciBtZXRob2QKLQkJaWYgKHBhcnQgIT0gbnVsbCkKLQkJCXN1cGVyLnNldEFjdGl2ZVZpZXcocGFydCk7Ci0JCWlmIChwYXJ0ID09IGFjdGl2ZVZpZXdQYXJ0KQotCQkJcmV0dXJuOwotCQlpZiAoYWN0aXZlVmlld1BhcnQgIT0gbnVsbCkgewotCQkJZGVhY3RpdmF0ZSgpOwotCQl9Ci0JCWlmIChwYXJ0ID09IG51bGwpIHsKLQkJCXNlbGVjdGlvblByb3ZpZGVyID0gbnVsbDsKLQkJfQotCQlpZiAoIShwYXJ0IGluc3RhbmNlb2YgSUVkaXRpbmdEb21haW5Qcm92aWRlcikpCi0JCQlyZXR1cm47Ci0JCWFjdGl2ZVZpZXdQYXJ0ID0gcGFydDsKLQkJZWRpdGluZ0RvbWFpbiA9ICgoSUVkaXRpbmdEb21haW5Qcm92aWRlcikgcGFydCkuZ2V0RWRpdGluZ0RvbWFpbigpOwotCi0JCS8vIFN3aXRjaCB0byB0aGUgbmV3IHNlbGVjdGlvbiBwcm92aWRlci4KLQkJaWYgKHNlbGVjdGlvblByb3ZpZGVyICE9IG51bGwpIHsKLQkJCXNlbGVjdGlvblByb3ZpZGVyLnJlbW92ZVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcih0aGlzKTsKLQkJfSBlbHNlIHsKLQkJCXNlbGVjdGlvblByb3ZpZGVyID0gcGFydC5nZXRTaXRlKCkuZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKTsKLQkJCXNlbGVjdGlvblByb3ZpZGVyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcih0aGlzKTsKLQotCQkJLy8gRmFrZSBhIHNlbGVjdGlvbiBjaGFuZ2VkIGV2ZW50IHRvIHVwZGF0ZSB0aGUgbWVudXMuCi0JCQlpZiAoc2VsZWN0aW9uUHJvdmlkZXIuZ2V0U2VsZWN0aW9uKCkgIT0gbnVsbCkgewotCQkJCXNlbGVjdGlvbkNoYW5nZWQobmV3IFNlbGVjdGlvbkNoYW5nZWRFdmVudChzZWxlY3Rpb25Qcm92aWRlciwKLQkJCQkJCXNlbGVjdGlvblByb3ZpZGVyLmdldFNlbGVjdGlvbigpKSk7Ci0JCQl9Ci0JCX0KLQotCQlhY3RpdmF0ZSgpOwotCi0JfQotCi0JcHVibGljIHZvaWQgZGVhY3RpdmF0ZSgpIHsKLQkJYWN0aXZlVmlld1BhcnQucmVtb3ZlUHJvcGVydHlMaXN0ZW5lcih0aGlzKTsKLQotCQlkZWxldGVBY3Rpb24uc2V0RWRpdGluZ0RvbWFpbihudWxsKTsKLQkJY3V0QWN0aW9uLnNldEVkaXRpbmdEb21haW4obnVsbCk7Ci0JCWNvcHlBY3Rpb24uc2V0RWRpdGluZ0RvbWFpbihudWxsKTsKLQkJcGFzdGVBY3Rpb24uc2V0RWRpdGluZ0RvbWFpbihudWxsKTsKLQkJdW5kb0FjdGlvbi5zZXRFZGl0aW5nRG9tYWluKG51bGwpOwotCQlyZWRvQWN0aW9uLnNldEVkaXRpbmdEb21haW4obnVsbCk7Ci0KLQkJaWYgKGxvYWRSZXNvdXJjZUFjdGlvbiAhPSBudWxsKSB7Ci0JCQlsb2FkUmVzb3VyY2VBY3Rpb24uc2V0RWRpdGluZ0RvbWFpbihudWxsKTsKLQkJfQotCi0JCUlTZWxlY3Rpb25Qcm92aWRlciBzZWxlY3Rpb25Qcm92aWRlciA9IGFjdGl2ZVZpZXdQYXJ0IGluc3RhbmNlb2YgSVNlbGVjdGlvblByb3ZpZGVyID8gKElTZWxlY3Rpb25Qcm92aWRlcikgYWN0aXZlVmlld1BhcnQKLQkJCQk6IGFjdGl2ZVZpZXdQYXJ0LmdldFNpdGUoKS5nZXRTZWxlY3Rpb25Qcm92aWRlcigpOwotCQlzZWxlY3Rpb25Qcm92aWRlci5yZW1vdmVTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoZGVsZXRlQWN0aW9uKTsKLQkJc2VsZWN0aW9uUHJvdmlkZXIucmVtb3ZlU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKGxpYnJhcnlWaWV3RWRpdEFjdGlvbik7Ci0JCXNlbGVjdGlvblByb3ZpZGVyLnJlbW92ZVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihjdXRBY3Rpb24pOwotCQlzZWxlY3Rpb25Qcm92aWRlci5yZW1vdmVTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoY29weUFjdGlvbik7Ci0JCXNlbGVjdGlvblByb3ZpZGVyLnJlbW92ZVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihwYXN0ZUFjdGlvbik7Ci0JfQotCi0JcHVibGljIHZvaWQgZGlzYWJsZUdsb2JhbEVkaXRNZW51KCkgewotCQlkZWxldGVBY3Rpb24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCWlmIChsaWJyYXJ5Vmlld0VkaXRBY3Rpb24gIT0gbnVsbCkKLQkJCWxpYnJhcnlWaWV3RWRpdEFjdGlvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJaWYgKGNvbmZpZ1ZpZXdFZGl0QWN0aW9uICE9IG51bGwpCi0JCQljb25maWdWaWV3RWRpdEFjdGlvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJY3V0QWN0aW9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQljb3B5QWN0aW9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQlwYXN0ZUFjdGlvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJdW5kb0FjdGlvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJcmVkb0FjdGlvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBlbmFibGVHbG9iYWxFZGl0TWVudSgpIHsKLQkJZGVsZXRlQWN0aW9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCWlmIChsaWJyYXJ5Vmlld0VkaXRBY3Rpb24gIT0gbnVsbCkKLQkJCWxpYnJhcnlWaWV3RWRpdEFjdGlvbi5zZXRFbmFibGVkKHRydWUpOwotCQlpZiAoY29uZmlnVmlld0VkaXRBY3Rpb24gIT0gbnVsbCkKLQkJCWNvbmZpZ1ZpZXdFZGl0QWN0aW9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCWN1dEFjdGlvbi5zZXRFbmFibGVkKHRydWUpOwotCQljb3B5QWN0aW9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCXBhc3RlQWN0aW9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCXVuZG9BY3Rpb24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJcmVkb0FjdGlvbi5zZXRFbmFibGVkKHRydWUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkVkaXRpbmdEb21haW5BY3Rpb25CYXJDb250cmlidXRvciNhY3RpdmF0ZSgpCi0JICovCi0JcHVibGljIHZvaWQgYWN0aXZhdGUoKSB7Ci0JCWFjdGl2ZVZpZXdQYXJ0LmFkZFByb3BlcnR5TGlzdGVuZXIodGhpcyk7Ci0JCQotCQlkZWxldGVBY3Rpb24uc2V0RWRpdGluZ0RvbWFpbihlZGl0aW5nRG9tYWluKTsKLQkJY3V0QWN0aW9uLnNldEVkaXRpbmdEb21haW4oZWRpdGluZ0RvbWFpbik7Ci0JCWNvcHlBY3Rpb24uc2V0RWRpdGluZ0RvbWFpbihlZGl0aW5nRG9tYWluKTsKLQkJcGFzdGVBY3Rpb24uc2V0RWRpdGluZ0RvbWFpbihlZGl0aW5nRG9tYWluKTsKLQkJdW5kb0FjdGlvbi5zZXRFZGl0aW5nRG9tYWluKGVkaXRpbmdEb21haW4pOwotCQlyZWRvQWN0aW9uLnNldEVkaXRpbmdEb21haW4oZWRpdGluZ0RvbWFpbik7Ci0KLQkJaWYgKGxvYWRSZXNvdXJjZUFjdGlvbiAhPSBudWxsKSB7Ci0JCQlsb2FkUmVzb3VyY2VBY3Rpb24uc2V0RWRpdGluZ0RvbWFpbihlZGl0aW5nRG9tYWluKTsKLQkJfQotCi0JCUlTZWxlY3Rpb25Qcm92aWRlciBzZWxlY3Rpb25Qcm92aWRlciA9IGFjdGl2ZVZpZXdQYXJ0IGluc3RhbmNlb2YgSVNlbGVjdGlvblByb3ZpZGVyID8gKElTZWxlY3Rpb25Qcm92aWRlcikgYWN0aXZlVmlld1BhcnQKLQkJCQk6IGFjdGl2ZVZpZXdQYXJ0LmdldFNpdGUoKS5nZXRTZWxlY3Rpb25Qcm92aWRlcigpOwotCQlzZWxlY3Rpb25Qcm92aWRlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoZGVsZXRlQWN0aW9uKTsKLQkJc2VsZWN0aW9uUHJvdmlkZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKGxpYnJhcnlWaWV3RWRpdEFjdGlvbik7Ci0JCXNlbGVjdGlvblByb3ZpZGVyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihjdXRBY3Rpb24pOwotCQlzZWxlY3Rpb25Qcm92aWRlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoY29weUFjdGlvbik7Ci0JCXNlbGVjdGlvblByb3ZpZGVyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihwYXN0ZUFjdGlvbik7Ci0JCWlmICh2YWxpZGF0ZUFjdGlvbiAhPSBudWxsKSB7Ci0JCQlzZWxlY3Rpb25Qcm92aWRlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIodmFsaWRhdGVBY3Rpb24pOwotCQl9Ci0KLQkJaWYgKGNvbnRyb2xBY3Rpb24gIT0gbnVsbCkgewotCQkJc2VsZWN0aW9uUHJvdmlkZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKGNvbnRyb2xBY3Rpb24pOwotCQl9ICAgICAgCQkKLQotCQl1cGRhdGUoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5FZGl0aW5nRG9tYWluQWN0aW9uQmFyQ29udHJpYnV0b3IjdXBkYXRlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0JCWlmIChhY3RpdmVWaWV3UGFydCA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCUlTZWxlY3Rpb25Qcm92aWRlciBzZWxlY3Rpb25Qcm92aWRlciA9IGFjdGl2ZVZpZXdQYXJ0IGluc3RhbmNlb2YgSVNlbGVjdGlvblByb3ZpZGVyID8gKElTZWxlY3Rpb25Qcm92aWRlcikgYWN0aXZlVmlld1BhcnQKLQkJCQk6IGFjdGl2ZVZpZXdQYXJ0LmdldFNpdGUoKS5nZXRTZWxlY3Rpb25Qcm92aWRlcigpOwotCQlJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IHNlbGVjdGlvblByb3ZpZGVyLmdldFNlbGVjdGlvbigpOwotCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzdHJ1Y3R1cmVkU2VsZWN0aW9uID0gc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24gPyAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbgotCQkJCTogU3RydWN0dXJlZFNlbGVjdGlvbi5FTVBUWTsKLQotCQlkZWxldGVBY3Rpb24udXBkYXRlU2VsZWN0aW9uKHN0cnVjdHVyZWRTZWxlY3Rpb24pOwotCQlsaWJyYXJ5Vmlld0VkaXRBY3Rpb24udXBkYXRlU2VsZWN0aW9uKHN0cnVjdHVyZWRTZWxlY3Rpb24pOwotCQljdXRBY3Rpb24udXBkYXRlU2VsZWN0aW9uKHN0cnVjdHVyZWRTZWxlY3Rpb24pOwotCQljb3B5QWN0aW9uLnVwZGF0ZVNlbGVjdGlvbihzdHJ1Y3R1cmVkU2VsZWN0aW9uKTsKLQkJcGFzdGVBY3Rpb24udXBkYXRlU2VsZWN0aW9uKHN0cnVjdHVyZWRTZWxlY3Rpb24pOwotCQl1bmRvQWN0aW9uLnVwZGF0ZSgpOwotCQlyZWRvQWN0aW9uLnVwZGF0ZSgpOwotCi0JCWlmIChsb2FkUmVzb3VyY2VBY3Rpb24gIT0gbnVsbCkgewotCQkJbG9hZFJlc291cmNlQWN0aW9uLnVwZGF0ZSgpOwotCQl9Ci0KLQkJaWYgKHZhbGlkYXRlQWN0aW9uICE9IG51bGwpIHsKLQkJCXZhbGlkYXRlQWN0aW9uLnVwZGF0ZVNlbGVjdGlvbihzdHJ1Y3R1cmVkU2VsZWN0aW9uKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFRoaXMgaW1wbGVtZW50cwotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXJ9LCBoYW5kbGluZwotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudH0gYnkgcXVlcnlpbmcgZm9yCi0JICogdGhlIGNoaWxkcmVuIGFuZCBzaWJsaW5ncyB0aGF0IGNhbiBiZSBhZGRlZCB0byB0aGUgc2VsZWN0ZWQgb2JqZWN0IGFuZAotCSAqIHVwZGF0aW5nIHRoZSBtZW51cyBhY2NvcmRpbmdseS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQkvLyBSZW1vdmUgYW55IG1lbnUgaXRlbXMgZm9yIG9sZCBzZWxlY3Rpb24uCi0JCWlmIChjcmVhdGVDaGlsZE1lbnVNYW5hZ2VyICE9IG51bGwpIHsKLQkJCWRlcG9wdWxhdGVNYW5hZ2VyKGNyZWF0ZUNoaWxkTWVudU1hbmFnZXIsIGNyZWF0ZUNoaWxkQWN0aW9ucyk7Ci0JCX0KLQkJaWYgKGNyZWF0ZVNpYmxpbmdNZW51TWFuYWdlciAhPSBudWxsKSB7Ci0JCQlkZXBvcHVsYXRlTWFuYWdlcihjcmVhdGVTaWJsaW5nTWVudU1hbmFnZXIsIGNyZWF0ZVNpYmxpbmdBY3Rpb25zKTsKLQkJfQotCi0JCS8vIFF1ZXJ5IHRoZSBuZXcgc2VsZWN0aW9uIGZvciBhcHByb3ByaWF0ZSBuZXcgY2hpbGQvc2libGluZyBkZXNjcmlwdG9ycwotCQlDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMgPSBudWxsOwotCi0JCUlTZWxlY3Rpb24gc2VsZWN0aW9uID0gZXZlbnQuZ2V0U2VsZWN0aW9uKCk7Ci0JCWlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbgotCQkJCSYmICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbikuc2l6ZSgpID09IDEpIHsKLQkJCU9iamVjdCBvYmplY3QgPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb24pCi0JCQkJCS5nZXRGaXJzdEVsZW1lbnQoKTsKLQotCQkJRWRpdGluZ0RvbWFpbiBkb21haW4gPSAoKElFZGl0aW5nRG9tYWluUHJvdmlkZXIpIGFjdGl2ZVZpZXdQYXJ0KQotCQkJCQkuZ2V0RWRpdGluZ0RvbWFpbigpOwotCi0JCQluZXdDaGlsZERlc2NyaXB0b3JzID0gZG9tYWluLmdldE5ld0NoaWxkRGVzY3JpcHRvcnMob2JqZWN0LCBudWxsKTsKLQkJfQotCi0JCS8vIEdlbmVyYXRlIGFjdGlvbnMgZm9yIHNlbGVjdGlvbjsgcG9wdWxhdGUgYW5kIHJlZHJhdyB0aGUgbWVudXMuCi0JCWNyZWF0ZUNoaWxkQWN0aW9ucyA9IGdlbmVyYXRlQ3JlYXRlQ2hpbGRBY3Rpb25zKG5ld0NoaWxkRGVzY3JpcHRvcnMsCi0JCQkJc2VsZWN0aW9uKTsKLQotCQlpZiAoY3JlYXRlQ2hpbGRNZW51TWFuYWdlciAhPSBudWxsKSB7Ci0JCQlwb3B1bGF0ZU1hbmFnZXIoY3JlYXRlQ2hpbGRNZW51TWFuYWdlciwgY3JlYXRlQ2hpbGRBY3Rpb25zLCBudWxsKTsKLQkJCWNyZWF0ZUNoaWxkTWVudU1hbmFnZXIudXBkYXRlKHRydWUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhpcyBnZW5lcmF0ZXMgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkNyZWF0ZUNoaWxkQWN0aW9ufQotCSAqIGZvciBlYWNoIG9iamVjdCBpbiA8Y29kZT5kZXNjcmlwdG9yczwvY29kZT4sIGFuZCByZXR1cm5zIHRoZQotCSAqIGNvbGxlY3Rpb24gb2YgdGhlc2UgYWN0aW9ucy4KLQkgKi8KLQlwcm90ZWN0ZWQgQ29sbGVjdGlvbiBnZW5lcmF0ZUNyZWF0ZUNoaWxkQWN0aW9ucyhDb2xsZWN0aW9uIGRlc2NyaXB0b3JzLAotCQkJSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJQ29sbGVjdGlvbiBhY3Rpb25zID0gbmV3IEFycmF5TGlzdCgpOwotCQlpZiAoZGVzY3JpcHRvcnMgIT0gbnVsbCkgewotCQkJZm9yIChJdGVyYXRvciBpID0gZGVzY3JpcHRvcnMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQkJYWN0aW9ucy5hZGQobmV3IE1ldGhvZENyZWF0ZUNoaWxkQWN0aW9uKGVkaXRpbmdEb21haW4sCi0JCQkJCQlzZWxlY3Rpb24sIGkubmV4dCgpKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGFjdGlvbnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBnZW5lcmF0ZXMgYQotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uQ3JlYXRlU2libGluZ0FjdGlvbn0gZm9yIGVhY2gKLQkgKiBvYmplY3QgaW4gPGNvZGU+ZGVzY3JpcHRvcnM8L2NvZGU+LCBhbmQgcmV0dXJucyB0aGUgY29sbGVjdGlvbiBvZgotCSAqIHRoZXNlIGFjdGlvbnMuCi0JICovCi0JcHJvdGVjdGVkIENvbGxlY3Rpb24gZ2VuZXJhdGVDcmVhdGVTaWJsaW5nQWN0aW9ucyhDb2xsZWN0aW9uIGRlc2NyaXB0b3JzLAotCQkJSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJQ29sbGVjdGlvbiBhY3Rpb25zID0gbmV3IEFycmF5TGlzdCgpOwotCQlpZiAoZGVzY3JpcHRvcnMgIT0gbnVsbCkgewotCQkJZm9yIChJdGVyYXRvciBpID0gZGVzY3JpcHRvcnMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQkJYWN0aW9ucy5hZGQobmV3IE1ldGhvZENyZWF0ZVNpYmxpbmdBY3Rpb24oYWN0aXZlVmlld1BhcnQsCi0JCQkJCQlzZWxlY3Rpb24sIGkubmV4dCgpKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGFjdGlvbnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBwb3B1bGF0ZXMgdGhlIHNwZWNpZmllZCA8Y29kZT5tYW5hZ2VyPC9jb2RlPiB3aXRoCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb25Db250cmlidXRpb25JdGVtfXMgYmFzZWQgb24gdGhlCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9ufXMgY29udGFpbmVkIGluIHRoZQotCSAqIDxjb2RlPmFjdGlvbnM8L2NvZGU+IGNvbGxlY3Rpb24sIGJ5IGluc2VydGluZyB0aGVtIGJlZm9yZSB0aGUgc3BlY2lmaWVkCi0JICogY29udHJpYnV0aW9uIGl0ZW0gPGNvZGU+Y29udHJpYnV0aW9uSUQ8L2NvZGU+LiBJZiA8Y29kZT5JRDwvY29kZT4gaXMKLQkgKiA8Y29kZT5udWxsPC9jb2RlPiwgdGhleSBhcmUgc2ltcGx5IGFkZGVkLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBvcHVsYXRlTWFuYWdlcihJQ29udHJpYnV0aW9uTWFuYWdlciBtYW5hZ2VyLAotCQkJQ29sbGVjdGlvbiBhY3Rpb25zLCBTdHJpbmcgY29udHJpYnV0aW9uSUQpIHsKLQkJaWYgKGFjdGlvbnMgIT0gbnVsbCkgewotCQkJZm9yIChJdGVyYXRvciBpID0gYWN0aW9ucy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLQkJCQlJQWN0aW9uIGFjdGlvbiA9IChJQWN0aW9uKSBpLm5leHQoKTsKLQkJCQlpZiAoY29udHJpYnV0aW9uSUQgIT0gbnVsbCkgewotCQkJCQltYW5hZ2VyLmluc2VydEJlZm9yZShjb250cmlidXRpb25JRCwgYWN0aW9uKTsKLQkJCQl9IGVsc2UgewotCQkJCQltYW5hZ2VyLmFkZChhY3Rpb24pOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFRoaXMgcmVtb3ZlcyBmcm9tIHRoZSBzcGVjaWZpZWQgPGNvZGU+bWFuYWdlcjwvY29kZT4gYWxsCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb25Db250cmlidXRpb25JdGVtfXMgYmFzZWQgb24gdGhlCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9ufXMgY29udGFpbmVkIGluIHRoZQotCSAqIDxjb2RlPmFjdGlvbnM8L2NvZGU+IGNvbGxlY3Rpb24uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZGVwb3B1bGF0ZU1hbmFnZXIoSUNvbnRyaWJ1dGlvbk1hbmFnZXIgbWFuYWdlciwKLQkJCUNvbGxlY3Rpb24gYWN0aW9ucykgewotCQlpZiAoYWN0aW9ucyAhPSBudWxsKSB7Ci0JCQlJQ29udHJpYnV0aW9uSXRlbVtdIGl0ZW1zID0gbWFuYWdlci5nZXRJdGVtcygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykgewotCQkJCS8vIExvb2sgaW50byBTdWJDb250cmlidXRpb25JdGVtcwotCQkJCUlDb250cmlidXRpb25JdGVtIGNvbnRyaWJ1dGlvbkl0ZW0gPSBpdGVtc1tpXTsKLQkJCQl3aGlsZSAoY29udHJpYnV0aW9uSXRlbSBpbnN0YW5jZW9mIFN1YkNvbnRyaWJ1dGlvbkl0ZW0pIHsKLQkJCQkJY29udHJpYnV0aW9uSXRlbSA9ICgoU3ViQ29udHJpYnV0aW9uSXRlbSkgY29udHJpYnV0aW9uSXRlbSkKLQkJCQkJCQkuZ2V0SW5uZXJJdGVtKCk7Ci0JCQkJfQotCi0JCQkJLy8gRGVsZXRlIHRoZSBBY3Rpb25Db250cmlidXRpb25JdGVtcyB3aXRoIG1hdGNoaW5nIGFjdGlvbi4KLQkJCQlpZiAoY29udHJpYnV0aW9uSXRlbSBpbnN0YW5jZW9mIEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0pIHsKLQkJCQkJSUFjdGlvbiBhY3Rpb24gPSAoKEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0pIGNvbnRyaWJ1dGlvbkl0ZW0pCi0JCQkJCQkJLmdldEFjdGlvbigpOwotCQkJCQlpZiAoYWN0aW9ucy5jb250YWlucyhhY3Rpb24pKSB7Ci0JCQkJCQltYW5hZ2VyLnJlbW92ZShjb250cmlidXRpb25JdGVtKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFRoaXMgcG9wdWxhdGVzIHRoZSBwb3AtdXAgbWVudSBiZWZvcmUgaXQgYXBwZWFycy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBtZW51QWJvdXRUb1Nob3coSU1lbnVNYW5hZ2VyIG1lbnVNYW5hZ2VyKSB7Ci0JCXN1cGVyLm1lbnVBYm91dFRvU2hvdyhtZW51TWFuYWdlcik7Ci0JCU1lbnVNYW5hZ2VyIHN1Ym1lbnVNYW5hZ2VyID0gbnVsbDsKLQotCQlzdWJtZW51TWFuYWdlciA9IG5ldyBNZW51TWFuYWdlcihBdXRob3JpbmdVSVJlc291cmNlcy5fVUlfQ3JlYXRlQ2hpbGRfbWVudV9pdGVtKTsgCi0JCXBvcHVsYXRlTWFuYWdlcihzdWJtZW51TWFuYWdlciwgY3JlYXRlQ2hpbGRBY3Rpb25zLCBudWxsKTsKLQkJbWVudU1hbmFnZXIuaW5zZXJ0QmVmb3JlKCJhZGRpdGlvbnMiLCBzdWJtZW51TWFuYWdlcik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnRzIGdsb2JhbCBhY3Rpb25zIGJlZm9yZSB0aGUgImFkZGl0aW9ucy1lbmQiIHNlcGFyYXRvci4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRHbG9iYWxBY3Rpb25zKElNZW51TWFuYWdlciBtZW51TWFuYWdlcikgewotCQltZW51TWFuYWdlci5pbnNlcnRBZnRlcigiYWRkaXRpb25zLWVuZCIsIG5ldyBTZXBhcmF0b3IoInVpLWFjdGlvbnMiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JCXJlZnJlc2hWaWV3ZXJBY3Rpb24uc2V0RW5hYmxlZChyZWZyZXNoVmlld2VyQWN0aW9uLmlzRW5hYmxlZCgpKTsKLQkJbWVudU1hbmFnZXIuaW5zZXJ0QWZ0ZXIoInVpLWFjdGlvbnMiLCByZWZyZXNoVmlld2VyQWN0aW9uKTsgLy8kTk9OLU5MUy0xJAotCi0JCW1lbnVNYW5hZ2VyLmluc2VydEJlZm9yZSgiYWRkaXRpb25zLWVuZCIsIG5ldyBTZXBhcmF0b3IoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCi0JICAgIFN0cmluZyBrZXkgPSAoc3R5bGUgJiBBRERJVElPTlNfTEFTVF9TVFlMRSkgPT0gMCA/ICJhZGRpdGlvbnMtZW5kIiA6ICJhZGRpdGlvbnMiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkgICAgaWYgKHZhbGlkYXRlQWN0aW9uICE9IG51bGwpCi0JICAgIHsKLQkgICAgICBtZW51TWFuYWdlci5pbnNlcnRCZWZvcmUoa2V5LCBuZXcgQWN0aW9uQ29udHJpYnV0aW9uSXRlbSh2YWxpZGF0ZUFjdGlvbikpOwotCSAgICB9Ci0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBhcnQuRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3IjaW5pdChJQWN0aW9uQmFycywKLQkgKiAgICAgIElXb3JrYmVuY2hQYWdlKQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSUFjdGlvbkJhcnMgYWN0aW9uQmFycywgSVdvcmtiZW5jaFBhZ2UgcGFnZSkgewotCQlzdXBlci5pbml0KGFjdGlvbkJhcnMsIHBhZ2UpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGFydC5FZGl0b3JBY3Rpb25CYXJDb250cmlidXRvciNpbml0KElBY3Rpb25CYXJzKQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSUFjdGlvbkJhcnMgYWN0aW9uQmFycykgewotCQl2aWV3QWN0aW9uQmFycyA9IGFjdGlvbkJhcnM7Ci0KLQkJSVNoYXJlZEltYWdlcyBzaGFyZWRJbWFnZXMgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpCi0JCQkJLmdldFNoYXJlZEltYWdlcygpOwotCi0JCWxpYnJhcnlWaWV3RWRpdEFjdGlvbiA9IG5ldyBMaWJyYXJ5Vmlld0VkaXRBY3Rpb24oQXV0aG9yaW5nVUlSZXNvdXJjZXMuYWN0aW9uTGFiZWxfZWRpdCk7IAotCQlhY3Rpb25CYXJzLnNldEdsb2JhbEFjdGlvbkhhbmRsZXIoTGlicmFyeVZpZXdFZGl0QWN0aW9uLkFDVElPTl9JRCwKLQkJCQlsaWJyYXJ5Vmlld0VkaXRBY3Rpb24pOwotCi0JCWN1dEFjdGlvbiA9IGNyZWF0ZUN1dEFjdGlvbigpOwotCQljdXRBY3Rpb24uc2V0SW1hZ2VEZXNjcmlwdG9yKHNoYXJlZEltYWdlcwotCQkJCS5nZXRJbWFnZURlc2NyaXB0b3IoSVNoYXJlZEltYWdlcy5JTUdfVE9PTF9DVVQpKTsKLQkJYWN0aW9uQmFycy5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKEFjdGlvbkZhY3RvcnkuQ1VULmdldElkKCksIGN1dEFjdGlvbik7Ci0KLQkJY29weUFjdGlvbiA9IGNyZWF0ZUNvcHlBY3Rpb24oKTsKLQkJY29weUFjdGlvbi5zZXRJbWFnZURlc2NyaXB0b3Ioc2hhcmVkSW1hZ2VzCi0JCQkJLmdldEltYWdlRGVzY3JpcHRvcihJU2hhcmVkSW1hZ2VzLklNR19UT09MX0NPUFkpKTsKLQkJYWN0aW9uQmFycy5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKEFjdGlvbkZhY3RvcnkuQ09QWS5nZXRJZCgpLAotCQkJCWNvcHlBY3Rpb24pOwotCi0JCXBhc3RlQWN0aW9uID0gY3JlYXRlUGFzdGVBY3Rpb24oKTsKLQkJcGFzdGVBY3Rpb24uc2V0SW1hZ2VEZXNjcmlwdG9yKHNoYXJlZEltYWdlcwotCQkJCS5nZXRJbWFnZURlc2NyaXB0b3IoSVNoYXJlZEltYWdlcy5JTUdfVE9PTF9QQVNURSkpOwotCQlhY3Rpb25CYXJzLnNldEdsb2JhbEFjdGlvbkhhbmRsZXIoQWN0aW9uRmFjdG9yeS5QQVNURS5nZXRJZCgpLAotCQkJCXBhc3RlQWN0aW9uKTsKLQotCQlkZWxldGVBY3Rpb24gPSBjcmVhdGVEZWxldGVBY3Rpb24oKTsKLQkJZGVsZXRlQWN0aW9uLnNldEltYWdlRGVzY3JpcHRvcihzaGFyZWRJbWFnZXMKLQkJCQkuZ2V0SW1hZ2VEZXNjcmlwdG9yKElTaGFyZWRJbWFnZXMuSU1HX1RPT0xfREVMRVRFKSk7Ci0JCWFjdGlvbkJhcnMuc2V0R2xvYmFsQWN0aW9uSGFuZGxlcihBY3Rpb25GYWN0b3J5LkRFTEVURS5nZXRJZCgpLAotCQkJCWRlbGV0ZUFjdGlvbik7Ci0JCQotCQl1bmRvQWN0aW9uID0gbmV3IFVuZG9BY3Rpb24oKTsKLQkJdW5kb0FjdGlvbi5zZXRJbWFnZURlc2NyaXB0b3Ioc2hhcmVkSW1hZ2VzCi0JCQkJLmdldEltYWdlRGVzY3JpcHRvcihJU2hhcmVkSW1hZ2VzLklNR19UT09MX1VORE8pKTsKLQkJYWN0aW9uQmFycy5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKEFjdGlvbkZhY3RvcnkuVU5ETy5nZXRJZCgpLAotCQkJCXVuZG9BY3Rpb24pOwotCi0JCXJlZG9BY3Rpb24gPSBuZXcgUmVkb0FjdGlvbigpOwotCQlyZWRvQWN0aW9uLnNldEltYWdlRGVzY3JpcHRvcihzaGFyZWRJbWFnZXMKLQkJCQkuZ2V0SW1hZ2VEZXNjcmlwdG9yKElTaGFyZWRJbWFnZXMuSU1HX1RPT0xfUkVETykpOwotCQlhY3Rpb25CYXJzLnNldEdsb2JhbEFjdGlvbkhhbmRsZXIoQWN0aW9uRmFjdG9yeS5SRURPLmdldElkKCksCi0JCQkJcmVkb0FjdGlvbik7Ci0KLQkJbGlicmFyeVZpZXdFZGl0QWN0aW9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQkKLQkJY29udHJpYnV0ZVRvVG9vbEJhcihhY3Rpb25CYXJzLmdldFRvb2xCYXJNYW5hZ2VyKCkpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgY3V0IGFjdGlvbgotCSAqIEByZXR1cm4gYWN0aW9uCi0JICovCi0JcHJvdGVjdGVkIEN1dEFjdGlvbiBjcmVhdGVDdXRBY3Rpb24oKSB7Ci0JCXJldHVybiBuZXcgQ3V0QWN0aW9uKCk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgcGFzdGUgYWN0aW9uCi0JICogQHJldHVybiBhY3Rpb24KLQkgKi8KLQlwcm90ZWN0ZWQgUGFzdGVBY3Rpb24gY3JlYXRlUGFzdGVBY3Rpb24oKSB7Ci0JCXJldHVybiBuZXcgUGFzdGVBY3Rpb24oKTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyBjb3B5IGFjdGlvbgotCSAqIEByZXR1cm4gYWN0aW9uCi0JICovCi0JcHJvdGVjdGVkIENvcHlBY3Rpb24gY3JlYXRlQ29weUFjdGlvbigpIHsKLQkJcmV0dXJuIG5ldyBDb3B5QWN0aW9uKCk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgZGVsZXRlIGFjdGlvbgotCSAqIEByZXR1cm4gYWN0aW9uCi0JICovCi0JcHJvdGVjdGVkIERlbGV0ZUFjdGlvbiBjcmVhdGVEZWxldGVBY3Rpb24oKSB7Ci0JCXJldHVybiBuZXcgRGVsZXRlQWN0aW9uKCk7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGFydC5FZGl0b3JBY3Rpb25CYXJDb250cmlidXRvciNnZXRBY3Rpb25CYXJzKCkKLQkgKi8KLQlwdWJsaWMgSUFjdGlvbkJhcnMgZ2V0QWN0aW9uQmFycygpIHsKLQkJcmV0dXJuIHZpZXdBY3Rpb25CYXJzOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvTGlicmFyeVZhbGlkYXRlQWN0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvTGlicmFyeVZhbGlkYXRlQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4YTVkZWUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL0xpYnJhcnlWYWxpZGF0ZUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjk4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcC5FbnRyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udWkudmlld2VyLklWaWV3ZXJQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQmFzaWNEaWFnbm9zdGljOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5EaWFnbm9zdGljOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5EaWFnbm9zdGljQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucGx1Z2luLkVjb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5EaWFnbm9zdGljaWFuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuRU1GRWRpdFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5WYWxpZGF0ZUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3ZpZGVycy5NZXRob2RFbGVtZW50TGFiZWxEZWNvcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS51dGlsLkxpYnJhcnlWYWxpZGF0aW9uTWFya2VySGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbi5EZXBlbmRlbmN5VmFsaWRhdGlvbk1ncjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTmFtZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5VbWFVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi52YWxpZGF0aW9uLkxpYnJhcnlFVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi52YWxpZGF0aW9uLmNvbnN0cmFpbnRzLkxpYnJhcnlUcmF2ZXJzYWxTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudmFsaWRhdGlvbi5jb25zdHJhaW50cy5MaWJyYXJ5VHJhdmVyc2FsU3RyYXRlZ3kuTGlicmFyeUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuSVNldFNlbGVjdGlvblRhcmdldDsKLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlICAxLjAKLSAqLwotcHVibGljIGNsYXNzIExpYnJhcnlWYWxpZGF0ZUFjdGlvbiBleHRlbmRzIFZhbGlkYXRlQWN0aW9uIHsKLQlwcml2YXRlIEhhc2hTZXQgcmVzb3VyY2VzOwotCXByaXZhdGUgYm9vbGVhbiBzdWNjZXNzOwotCXByaXZhdGUgYm9vbGVhbiBzaG93U3VjY2VzcyA9IHRydWU7Ci0JcHJpdmF0ZSBNYXAgY29udGV4dERhdGEgPSBuZXcgSGFzaE1hcCgpOwotCi0JcHVibGljIExpYnJhcnlWYWxpZGF0ZUFjdGlvbigpIHsKLQkJc3VwZXIoKTsKLQkJZWNsaXBzZVJlc291cmNlc1V0aWwgPSBuZXcgTGlicmFyeVZhbGlkYXRpb25NYXJrZXJIZWxwZXIoKTsKLQl9Ci0JCi0JcHVibGljIExpYnJhcnlWYWxpZGF0ZUFjdGlvbihib29sZWFuIHNob3dTdWNjZXNzKSB7Ci0JCXRoaXMoKTsKLQkJdGhpcy5zaG93U3VjY2VzcyAgPSBzaG93U3VjY2VzczsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcHV0Q29udGV4dERhdGEoT2JqZWN0IGtleSwgT2JqZWN0IHZhbHVlKSB7Ci0JCWNvbnRleHREYXRhLnB1dChrZXksIHZhbHVlKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uVmFsaWRhdGVBY3Rpb24jdmFsaWRhdGUob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHJvdGVjdGVkIERpYWdub3N0aWMgdmFsaWRhdGUoZmluYWwgSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzc01vbml0b3IpIHsKLQkgICAgaWYocmVzb3VyY2VzID09IG51bGwpIHsKLQkgICAgCXJlc291cmNlcyA9IG5ldyBIYXNoU2V0KCk7Ci0JICAgIH0KLQkgICAgZWxzZSB7Ci0JICAgIAlyZXNvdXJjZXMuY2xlYXIoKTsKLQkgICAgfQotCSAgICBib29sZWFuIGRlcGVuZGVuY3lJbmZvTWdyU2V0ID0gZmFsc2U7Ci0JCUNvbGxlY3Rpb24gZU9iamVjdHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHNlbGVjdGVkT2JqZWN0cy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gVG5nVXRpbC51bndyYXAoaXRlci5uZXh0KCkpOwotCQkJaWYoZWxlbWVudCBpbnN0YW5jZW9mIEVPYmplY3QpIHsKLQkJCQllT2JqZWN0cy5hZGQoZWxlbWVudCk7Ci0JCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSAoKEVPYmplY3QpZWxlbWVudCkuZVJlc291cmNlKCk7Ci0JCQkJaWYocmVzb3VyY2UgIT0gbnVsbCkgewotCQkJCQlyZXNvdXJjZXMuYWRkKHJlc291cmNlKTsKLQkJCQl9Ci0JCQkJaWYgKCEgZGVwZW5kZW5jeUluZm9NZ3JTZXQgJiYgZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCQkJTWV0aG9kTGlicmFyeSBsaWIgPSBVbWFVdGlsLmdldE1ldGhvZExpYnJhcnkoKE1ldGhvZEVsZW1lbnQpIGVsZW1lbnQpOwkKLQkJCQkJcHV0Q29udGV4dERhdGEoTGlicmFyeUVWYWxpZGF0b3IuQ1RYX0RFUEVOREVOQ1lfVkFMSURBVElPTl9NR1IsIG5ldyBEZXBlbmRlbmN5VmFsaWRhdGlvbk1ncihsaWIpKTsKLQkJCQkJZGVwZW5kZW5jeUluZm9NZ3JTZXQgPSB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQkgICAgaW50IGNvdW50ID0gZU9iamVjdHMuc2l6ZSgpOwotCSAgICBlT2JqZWN0cyA9IExpYnJhcnlUcmF2ZXJzYWxTdHJhdGVneS5tYWtlVGFyZ2V0c0Rpc2pvaW50KGVPYmplY3RzKTsKLQkJTGlicmFyeUl0ZXJhdG9yIGxpYkl0ZXIgPSBuZXcgTGlicmFyeUl0ZXJhdG9yKGVPYmplY3RzLCB0cnVlLCBMaWJyYXJ5VHJhdmVyc2FsU3RyYXRlZ3kuREVFUCwgdHJ1ZSk7Ci0JCXdoaWxlKGxpYkl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlPYmplY3QgbyA9IGxpYkl0ZXIubmV4dCgpOwotCQkJY291bnQrKzsKLQkJCWlmKG8gaW5zdGFuY2VvZiBFT2JqZWN0KSB7Ci0JCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSAoKEVPYmplY3QpbykuZVJlc291cmNlKCk7Ci0JCQkJaWYocmVzb3VyY2UgIT0gbnVsbCkgewotCQkJCQlyZXNvdXJjZXMuYWRkKHJlc291cmNlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JICAgIHByb2dyZXNzTW9uaXRvci5iZWdpblRhc2soIiIsIGNvdW50KTsgLy8kTk9OLU5MUy0xJAotCi0vLwkgICAgZmluYWwgQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkgPSAKLS8vCSAgICAgIGRvbWFpbiBpbnN0YW5jZW9mIEFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbiA/ICgoQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluKWRvbWFpbikuZ2V0QWRhcHRlckZhY3RvcnkoKSA6IG51bGw7Ci0KLQkgICAgRGlhZ25vc3RpY2lhbiBkaWFnbm9zdGljaWFuID0gCi0JICAgICAgbmV3IERpYWdub3N0aWNpYW4oKQotCSAgICAgIHsKLQkgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0T2JqZWN0TGFiZWwoRU9iamVjdCBlT2JqZWN0KQotCSAgICAgICAgewotLy8JICAgICAgICAgIGlmIChhZGFwdGVyRmFjdG9yeSAhPSBudWxsICYmICFlT2JqZWN0LmVJc1Byb3h5KCkpCi0vLwkgICAgICAgICAgewotLy8JICAgICAgICAgICAgSUl0ZW1MYWJlbFByb3ZpZGVyIGl0ZW1MYWJlbFByb3ZpZGVyID0gKElJdGVtTGFiZWxQcm92aWRlcilhZGFwdGVyRmFjdG9yeS5hZGFwdChlT2JqZWN0LCBJSXRlbUxhYmVsUHJvdmlkZXIuY2xhc3MpOwotLy8JICAgICAgICAgICAgaWYgKGl0ZW1MYWJlbFByb3ZpZGVyICE9IG51bGwpCi0vLwkgICAgICAgICAgICB7Ci0vLwkgICAgICAgICAgICAgIHJldHVybiBpdGVtTGFiZWxQcm92aWRlci5nZXRUZXh0KGVPYmplY3QpOwotLy8JICAgICAgICAgICAgfQotLy8JICAgICAgICAgIH0KLS8vCSAgCi0vLwkgICAgICAgICAgcmV0dXJuIHN1cGVyLmdldE9iamVjdExhYmVsKGVPYmplY3QpOwotCSAgICAgICAgCQotCSAgICAgICAgCXJldHVybiBUbmdVdGlsLmdldExhYmVsV2l0aFBhdGgoZU9iamVjdCk7Ci0JICAgICAgICB9Ci0KLQkgICAgICAgIHB1YmxpYyBib29sZWFuIHZhbGlkYXRlKEVDbGFzcyBlQ2xhc3MsIEVPYmplY3QgZU9iamVjdCwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkKLQkgICAgICAgIHsKLQkgICAgICAgICAgcHJvZ3Jlc3NNb25pdG9yLndvcmtlZCgxKTsKLQkgICAgICAgICAgaWYoY29udGV4dCA9PSBudWxsKSB7Ci0JICAgICAgICAJICBjb250ZXh0ID0gY29udGV4dERhdGE7CSAgICAgICAgCSAgCi0JICAgICAgICAgIH0KLQkgICAgICAgICAgZWxzZSB7Ci0JICAgICAgICAJICBjb250ZXh0LnB1dEFsbChjb250ZXh0RGF0YSk7Ci0JICAgICAgICAgIH0KLQkgICAgICAgICAgcmV0dXJuIHN1cGVyLnZhbGlkYXRlKGVDbGFzcywgZU9iamVjdCwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCSAgICAgICAgfQkgICAgICAgIAotCSAgICAgICAgCi0JICAgICAgfTsKLQkgICAgICAKLQkgICAgICBMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KGVPYmplY3RzKTsKLQkgICAgICBpbnQgbWF4ID0gbGlzdC5zaXplKCkgLSAxOwotCSAgICAgIFN0cmluZ0J1ZmZlciBzdHJCdWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtYXg7IGkrKykgewotCSAgICAJICBPYmplY3QgZSA9IGxpc3QuZ2V0KGkpOwotCSAgICAJICBpZihlIGluc3RhbmNlb2YgTmFtZWRFbGVtZW50KSB7Ci0JICAgIAkJICBzdHJCdWYuYXBwZW5kKCgoTmFtZWRFbGVtZW50KWUpLmdldE5hbWUoKSkuYXBwZW5kKCIsICIpOyAvLyROT04tTkxTLTEkCi0JICAgIAkgIH0KLQkgICAgICB9Ci0JICAgICAgT2JqZWN0IGUgPSBtYXggPCAwID8gbnVsbCA6IGxpc3QuZ2V0KG1heCk7Ci0JICAgICAgaWYoZSBpbnN0YW5jZW9mIE5hbWVkRWxlbWVudCkgewotICAgIAkJICBzdHJCdWYuYXBwZW5kKCgoTmFtZWRFbGVtZW50KWUpLmdldE5hbWUoKSk7Ci0gICAgCSAgfQotCSAgICAgIEJhc2ljRGlhZ25vc3RpYyBkaWFnbm9zdGljcyA9IAotCSAgICAgICAgICBuZXcgQmFzaWNEaWFnbm9zdGljCi0JICAgICAgICAgICAgKEVPYmplY3RWYWxpZGF0b3IuRElBR05PU1RJQ19TT1VSQ0UsCi0JICAgICAgICAgICAgIDAsCi0JICAgICAgICAgICAgIEVjb3JlUGx1Z2luLklOU1RBTkNFLmdldFN0cmluZwotCSAgICAgICAgICAgICAgICgiX1VJX0RpYWdub3N0aWNSb290X2RpYWdub3N0aWMiLCAvLyROT04tTkxTLTEkIAotCSAgICAgICAgICAgICAgICBuZXcgT2JqZWN0IFtdIHsgc3RyQnVmLnRvU3RyaW5nKCkgfSksIAotCSAgICAgICAgICAgICBsaXN0LnRvQXJyYXkoKSk7Ci0JICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gZU9iamVjdHMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JICAgIAkgIEVPYmplY3QgZU9iamVjdCA9IChFT2JqZWN0KSBpdGVyLm5leHQoKTsKLQkgICAgCSAgcHJvZ3Jlc3NNb25pdG9yLnNldFRhc2tOYW1lCi0JICAgIAkgIChFTUZFZGl0VUlQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfVmFsaWRhdGluZ19tZXNzYWdlIiwgbmV3IE9iamVjdCBbXSB7ZGlhZ25vc3RpY2lhbi5nZXRPYmplY3RMYWJlbChlT2JqZWN0KX0pKTsgLy8kTk9OLU5MUy0xJAotCSAgICAJICBkaWFnbm9zdGljaWFuLnZhbGlkYXRlKGVPYmplY3QsIGRpYWdub3N0aWNzKTsKLQkgICAgICB9Ci0JICAgICAgc3VjY2VzcyA9IGRpYWdub3N0aWNzLmdldFNldmVyaXR5KCkgPT0gRGlhZ25vc3RpYy5PSzsKLQkgICAgICByZXR1cm4gZGlhZ25vc3RpY3M7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5WYWxpZGF0ZUFjdGlvbiNoYW5kbGVEaWFnbm9zdGljKG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5EaWFnbm9zdGljKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGhhbmRsZURpYWdub3N0aWMoRGlhZ25vc3RpYyBkaWFnbm9zdGljKSB7Ci0JCWlmKGRpYWdub3N0aWMgIT0gbnVsbCkgewotCQkJaWYoc2hvd1N1Y2Nlc3MgfHwgIWlzU3VjY2Vzc2Z1bCgpKSB7Ci0JCQkJLy8gc2F2ZSB0aGUgcmVmZXJlbmNlIHRvIEVjbGlwc2VSZXNvdXJjZXNVdGlsIGFuZCBzZXQgZWNsaXBzZVJlc291cmNlc1V0aWwgdG8gbnVsbAotCQkJCS8vIHNvIHN1cGVyIG1ldGhvZCB3aWxsIG5vdCB0cnkgdG8gZGVhbCB3aXRoIHRoZSBtYXJrZXJzCi0JCQkJLy8KLQkJCQlFY2xpcHNlUmVzb3VyY2VzVXRpbCBzYXZlZFJlZiA9IGVjbGlwc2VSZXNvdXJjZXNVdGlsOwotCQkJCWVjbGlwc2VSZXNvdXJjZXNVdGlsID0gbnVsbDsKLQkJCQl0cnkgewotCQkJCQlzdXBlci5oYW5kbGVEaWFnbm9zdGljKGRpYWdub3N0aWMpOwotCQkJCX0KLQkJCQlmaW5hbGx5IHsKLQkJCQkJZWNsaXBzZVJlc291cmNlc1V0aWwgPSBzYXZlZFJlZjsKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCS8vIGRlYWxpbmcgd2l0aCBtYXJrZXJzCi0JCQkvLwotCQkJaWYgKGVjbGlwc2VSZXNvdXJjZXNVdGlsICE9IG51bGwpCQkJCQotCQkJewotCQkJCS8vIGRlbGV0ZSBvbGQgbWFya2VycwotCQkJCS8vCQkJCQkKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSByZXNvdXJjZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCWVjbGlwc2VSZXNvdXJjZXNVdGlsLmRlbGV0ZU1hcmtlcnMoKFJlc291cmNlKSBpdGVyLm5leHQoKSk7Ci0JCQkJfQotCQkJCQotCQkJCVZpZXdlciB2aWV3ZXIgPSBudWxsOwotCQkJCWlmICghZGlhZ25vc3RpYy5nZXRDaGlsZHJlbigpLmlzRW1wdHkoKSkKLQkJCQl7Ci0JCQkJCU1hcCBkaWFnbm9zdGljVG9SZXNvdXJjZU1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCQkJCWZvciAoSXRlcmF0b3IgaSA9IGRpYWdub3N0aWMuZ2V0Q2hpbGRyZW4oKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotCQkJCQl7Ci0JCQkJCQlEaWFnbm9zdGljIGNoaWxkRGlhZ25vc3RpYyA9IChEaWFnbm9zdGljKWkubmV4dCgpOwotCQkJCQkJTGlzdCBkYXRhID0gY2hpbGREaWFnbm9zdGljLmdldERhdGEoKTsKLQkJCQkJCWlmICghZGF0YS5pc0VtcHR5KCkpIHsKLQkJCQkJCQlPYmplY3QgbyA9IGRhdGEuZ2V0KDApOwotCQkJCQkJCWlmKG8gaW5zdGFuY2VvZiBFT2JqZWN0KSB7Ci0JCQkJCQkJCVJlc291cmNlIHJlc291cmNlID0gKChFT2JqZWN0KW8pLmVSZXNvdXJjZSgpOwotCQkJCQkJCQlpZihyZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQkJCQkJCQlkaWFnbm9zdGljVG9SZXNvdXJjZU1hcC5wdXQoY2hpbGREaWFnbm9zdGljLCByZXNvdXJjZSk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJCQkJCQkKLQkJCQkJLy8gY3JlYXRlIG1hcmtlcnMKLQkJCQkJLy8KLQkJCQkJZm9yIChJdGVyYXRvciBpID0gZGlhZ25vc3RpY1RvUmVzb3VyY2VNYXAuZW50cnlTZXQoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotCQkJCQl7Ci0JCQkJCQlNYXAuRW50cnkgZW50cnkgPSAoRW50cnkpIGkubmV4dCgpOwotCQkJCQkJRGlhZ25vc3RpYyBjaGlsZERpYWdub3N0aWMgPSAoRGlhZ25vc3RpYyllbnRyeS5nZXRLZXkoKTsKLQkJCQkJCVJlc291cmNlIHJlc291cmNlID0gKFJlc291cmNlKSBlbnRyeS5nZXRWYWx1ZSgpOwotCQkJCQkJZWNsaXBzZVJlc291cmNlc1V0aWwuY3JlYXRlTWFya2VycyhyZXNvdXJjZSwgY2hpbGREaWFnbm9zdGljKTsKLQkJCQkJfQotCQkJCQkKLQkJCQkJLy8gc2VsZWN0IHRoZSBmaXJzdCBvYmplY3Qgd2l0aCBwcm9ibGVtIGluIHRoZSB2aWV3ZXIgaWYgcG9zc2libGUKLQkJCQkJLy8KLQkJCQkJTGlzdCBkYXRhID0gKChEaWFnbm9zdGljKWRpYWdub3N0aWMuZ2V0Q2hpbGRyZW4oKS5nZXQoMCkpLmdldERhdGEoKTsKLQkJCQkJaWYgKCFkYXRhLmlzRW1wdHkoKSkKLQkJCQkJewotCQkJCQkJT2JqZWN0IHBhcnQgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKS5nZXRBY3RpdmVQYXJ0KCk7CQkJCQkJCi0JCQkJCQlPYmplY3QgZSA9IGRhdGEuZ2V0KDApOwotCQkJCQkJaWYgKHBhcnQgaW5zdGFuY2VvZiBJU2V0U2VsZWN0aW9uVGFyZ2V0KQotCQkJCQkJewotCQkJCQkJCSgoSVNldFNlbGVjdGlvblRhcmdldClwYXJ0KS5zZWxlY3RSZXZlYWwobmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oZSkpOwotCQkJCQkJfQotCQkJCQkJZWxzZSBpZiAocGFydCBpbnN0YW5jZW9mIElWaWV3ZXJQcm92aWRlcikKLQkJCQkJCXsKLQkJCQkJCQl2aWV3ZXIgPSAoKElWaWV3ZXJQcm92aWRlcilwYXJ0KS5nZXRWaWV3ZXIoKTsKLQkJCQkJCQlpZiAodmlld2VyICE9IG51bGwpCi0JCQkJCQkJewotCQkJCQkJCQl2aWV3ZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKGRhdGEuZ2V0KDApKSwgdHJ1ZSk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9CQkJCQkKLQkJCQl9Ci0JCQkJaWYodmlld2VyID09IG51bGwpIHsKLQkJCQkJT2JqZWN0IHBhcnQgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKS5nZXRBY3RpdmVQYXJ0KCk7Ci0JCQkJCWlmIChwYXJ0IGluc3RhbmNlb2YgSVZpZXdlclByb3ZpZGVyKQotCQkJCQl7Ci0JCQkJCQl2aWV3ZXIgPSAoKElWaWV3ZXJQcm92aWRlcilwYXJ0KS5nZXRWaWV3ZXIoKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlpZih2aWV3ZXIgIT0gbnVsbCkgewotCQkJCQkvLyBjbGVhciBkZWNvcmF0aW9uIGNhY2hlCi0JCQkJCS8vCi0JCQkJCU1ldGhvZEVsZW1lbnRMYWJlbERlY29yYXRvci5jbGVhckRlY29yYXRpb25DYWNoZSgpOwotCQkJCQl2aWV3ZXIucmVmcmVzaCgpOwotCQkJCX0KLQkJCQkKLQkJCQl0cnkgewotCQkJCQlyZWZyZXNoVmlld3MoKTsKLQkJCQl9Ci0JCQkJY2F0Y2goRXhjZXB0aW9uIGUpIHsKLQkJCQkJCi0JCQkJfQotCQkJfQotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hWaWV3cygpIHsKLQkJLy8gbm8gZXJyb3IgbWFya2VycyBmb3IgY29uZmlndXJhdGlvbiB2aWV3Ci0JCS8vCi0vLwkJQ29uZmlndXJhdGlvblZpZXcuZ2V0VmlldygpLmdldFZpZXdlcigpLnJlZnJlc2goKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1N1Y2Nlc3NmdWwoKSB7Ci0JCXJldHVybiBzdWNjZXNzOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9MaWJyYXJ5Vmlld0NvcHlBY3Rpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9MaWJyYXJ5Vmlld0NvcHlBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGNhN2IzOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvTGlicmFyeVZpZXdDb3B5QWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvcHlUb0NsaXBib2FyZENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkNvcHlBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS51dGlsLkNsaXBib2FyZFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5TdHJVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuUmVzb3VyY2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC5kb21haW4uVHJhY2VhYmxlQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci0KLQotLyoqCi0gKiBDb3BpZXMgYW4gZWxlbWVudCBpbiB0aGUgTGlicmFyeSB2aWV3LgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTGlicmFyeVZpZXdDb3B5QWN0aW9uIGV4dGVuZHMgQ29weUFjdGlvbiB7Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5Db21tYW5kQWN0aW9uSGFuZGxlciNydW4oKQotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJaWYgKGNvbW1hbmQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJZWxzZSB7Ci0JCQlpZiAoZG9tYWluIGluc3RhbmNlb2YgVHJhY2VhYmxlQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluKSB7Ci0JCQkJKChUcmFjZWFibGVBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW4pIGRvbWFpbikucmVzZXRDb3B5TWFwcygpOwotCQkJfQotCQkJaWYgKGNvbW1hbmQgaW5zdGFuY2VvZiBDb3B5VG9DbGlwYm9hcmRDb21tYW5kKSB7Ci0JCQkJU3RyaW5nIGxpbmtzID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSAoKENvcHlUb0NsaXBib2FyZENvbW1hbmQpY29tbWFuZCkuZ2V0U291cmNlT2JqZWN0cygpLml0ZXJhdG9yKCk7aXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCU9iamVjdCBpdGVtID0gVG5nVXRpbC51bndyYXAoaXRlci5uZXh0KCkpOwotCQkJCQlpZiAoaXRlbSBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCQkJCU1ldGhvZEVsZW1lbnQgZSA9IChNZXRob2RFbGVtZW50KWl0ZW07Ci0JCQkJCQlTdHJpbmcgaHJlZiA9IFJlc291cmNlSGVscGVyLmdldFVybChlLAotCQkJCQkJCQludWxsLCAiaHRtbCIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQlpZiAobGlua3MubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJCQkJbGlua3MgKz0gU3RyVXRpbC5MSU5FX0ZFRUQ7Ci0JCQkJCQl9Ci0JCQkJCQlsaW5rcyArPSBSZXNvdXJjZUhlbHBlci5nZXRFbGVtZW50TGluayhlLCB0cnVlLAotCQkJCQkJCQkiZmlsZTovLyIgKyBocmVmKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJfQotCQkJCWlmIChsaW5rcy5sZW5ndGgoKSA+IDApIHsKLQkJCQkJaGFuZGxlQ29weVRleHRIVE1MVG9DbGlwYm9hcmQobGlua3MpOwotCQkJCX0KLQkJCX0KLQkJCXN1cGVyLnJ1bigpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogSGFuZGxlcyBjb3B5aW5nIHRoZSBsaW5rcyB0byB0aGUgY2xpcGJvYXJkIGFzIFRleHQgYW5kIEhUTUwKLQkgKiBAcGFyYW0gbGlua3MKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVDb3B5VGV4dEhUTUxUb0NsaXBib2FyZChTdHJpbmcgbGlua3MpIHsKLQkJQ2xpcGJvYXJkVXRpbC5jb3B5VGV4dEhUTUxUb0NsaXBib2FyZChsaW5rcyk7Ci0JfQotCi0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uQ29tbWFuZEFjdGlvbkhhbmRsZXIjdXBkYXRlU2VsZWN0aW9uKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb24pCi0JICovCi0JcHVibGljIGJvb2xlYW4gdXBkYXRlU2VsZWN0aW9uKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlpZiAoc2VsZWN0aW9uID09IG51bGwgfHwgc2VsZWN0aW9uLmlzRW1wdHkoKSkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlDb2xsZWN0aW9uIGNvbGxlY3Rpb24gPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoSXRlcmF0b3Igb2JqZWN0cyA9IHNlbGVjdGlvbi5pdGVyYXRvcigpOyBvYmplY3RzLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gVG5nVXRpbC51bndyYXAob2JqZWN0cy5uZXh0KCkpOwotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50Ci0JCQkJCSYmICEoZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikKLQkJCQkJJiYgIVRuZ1V0aWwuaXNQcmVkZWZpbmVkKChNZXRob2RFbGVtZW50KSBlbGVtZW50KSkgewotCQkJCWNvbGxlY3Rpb24uYWRkKGVsZW1lbnQpOwotCQkJfQotCi0JCX0KLQotCQljb21tYW5kID0gY3JlYXRlQ29tbWFuZChjb2xsZWN0aW9uKTsKLQotCQlyZXR1cm4gY29tbWFuZC5jYW5FeGVjdXRlKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvTGlicmFyeVZpZXdDdXRBY3Rpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9MaWJyYXJ5Vmlld0N1dEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MmNjZGUyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9MaWJyYXJ5Vmlld0N1dEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkN1dEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotCi0vKioKLSAqIEN1dHMgYW4gZWxlbWVudCBpbiB0aGUgTGlicmFyeSB2aWV3IHRvIHRoZSBjbGlwYm9hcmQuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBMaWJyYXJ5Vmlld0N1dEFjdGlvbiBleHRlbmRzIEN1dEFjdGlvbiB7Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5Db21tYW5kQWN0aW9uSGFuZGxlciNydW4oKQotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJaWYgKGNvbW1hbmQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJZWxzZQotCQkJc3VwZXIucnVuKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uQ29tbWFuZEFjdGlvbkhhbmRsZXIjdXBkYXRlU2VsZWN0aW9uKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb24pCi0JICovCi0JcHVibGljIGJvb2xlYW4gdXBkYXRlU2VsZWN0aW9uKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL0xpYnJhcnlWaWV3RGVsZXRlQWN0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvTGlicmFyeVZpZXdEZWxldGVBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDdmNDRmYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvTGlicmFyeVZpZXdEZWxldGVBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5EZWxlZ2F0aW5nV3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JV3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuSUVkaXRvcktlZXBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnZpZXdzLkxpYnJhcnlWaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkZlYXR1cmVWYWx1ZVdyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuRGVsZXRlTWV0aG9kRWxlbWVudENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51aS5Vc2VySW50ZXJhY3Rpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UuSUxpYnJhcnlSZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5hY3Rpb25zLk1ldGhvZEVsZW1lbnREZWxldGVBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuYWN0aW9ucy5Qcm9jZXNzRGVsZXRlQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy5JTGlicmFyeVBlcnNpc3RlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkN1c3RvbUNhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQXNzb2NpYXRpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlVmlld2VyOwotCi0vKioKLSAqIERlbGV0ZXMgYW4gZWxlbWVudCBpbiB0aGUgTGlicmFyeSB2aWV3LgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBMaWJyYXJ5Vmlld0RlbGV0ZUFjdGlvbiBleHRlbmRzIE1ldGhvZEVsZW1lbnREZWxldGVBY3Rpb24gewotCQotCS8qKiAKLQkgKiBEZWxldHMgYW4gZWxlbWVudCBpbiBsaWJyYXJ5IHZpZXcKLQkgKiAKLQkgKi8KLQlwdWJsaWMgTGlicmFyeVZpZXdEZWxldGVBY3Rpb24oKSB7Ci0JCXRoaXModHJ1ZSk7Ci0JfQotCQotCS8qKgotCSAqIERlbGV0ZXMgYW4gZWxlbWVudCBpbiBsaWJyYXJ5IHZpZXcgYWZ0ZXIgY29uZmlybWluZyB3aXRoIHVzZXIKLQkgKiBAcGFyYW0gY29uZmlybQotCSAqLwotCXB1YmxpYyBMaWJyYXJ5Vmlld0RlbGV0ZUFjdGlvbihib29sZWFuIGNvbmZpcm0pIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5jb25maXJtID0gY29uZmlybTsgCi0JfQotCi0JLyoqCi0JICogQHNlZSBNZXRob2RFbGVtZW50RGVsZXRlQWN0aW9uI2RpZERlbGV0ZShDb2xsZWN0aW9uKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRpZERlbGV0ZShDb2xsZWN0aW9uIGRlbGV0ZWRFbGVtZW50cykgewotCQlzdXBlci5kaWREZWxldGUoZGVsZXRlZEVsZW1lbnRzKTsKLQkJCi0JCS8vIENsb3NlIGFsbCBvcGVuIGVkaXRvcnMgYXNzb2NpYXRlZCB3aXRoIHRoZSBkZWxldGVkIGVsZW1lbnRzLgotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBkZWxldGVkRWxlbWVudHMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZWxlbWVudCA9IFRuZ1V0aWwudW53cmFwKGl0ZXIubmV4dCgpKTsKLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudAotCQkJCQkmJiAoKE1ldGhvZEVsZW1lbnQpIGVsZW1lbnQpLmVDb250YWluZXIoKSA9PSBudWxsKSB7Ci0JCQkJSUVkaXRvcktlZXBlci5SRUZFUkVOQ0UuZ2V0RWRpdG9yS2VlcGVyKCkKLQkJCQkJCS5jbG9zZUVkaXRvcnNPbkRlbGV0aW9uKChNZXRob2RFbGVtZW50KSBlbGVtZW50KTsKLQkJCX0KLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIEN1c3RvbUNhdGVnb3J5IGdldFJvb3RDdXN0b21DYXRlZ29yeShPYmplY3Qgb2JqZWN0KSB7Ci0JCWZvcig7IG9iamVjdCBpbnN0YW5jZW9mIElXcmFwcGVySXRlbVByb3ZpZGVyOyBvYmplY3QgPSAoKElXcmFwcGVySXRlbVByb3ZpZGVyKW9iamVjdCkuZ2V0T3duZXIoKSk7Ci0JCW9iamVjdCA9IFRuZ1V0aWwudW53cmFwKG9iamVjdCk7Ci0JCXJldHVybiBvYmplY3QgaW5zdGFuY2VvZiBDdXN0b21DYXRlZ29yeSAmJiBUbmdVdGlsLmlzUm9vdEN1c3RvbUNhdGVnb3J5KChDdXN0b21DYXRlZ29yeSkgb2JqZWN0KSA/Ci0JCQkoQ3VzdG9tQ2F0ZWdvcnkpIG9iamVjdCA6IG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uQ29tbWFuZEFjdGlvbkhhbmRsZXIjdXBkYXRlU2VsZWN0aW9uKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb24pCi0JICovCi0JcHVibGljIGJvb2xlYW4gdXBkYXRlU2VsZWN0aW9uKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlBcnJheUxpc3QgZmlsdGVyZWRTZWxlY3Rpb24gPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJZm9yIChJdGVyYXRvciBpdGVyID0gc2VsZWN0aW9uLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGUgPSBpdGVyLm5leHQoKTsKLQkJCWlmKGUgaW5zdGFuY2VvZiBDdXN0b21DYXRlZ29yeSkgewotCQkJCWZpbHRlcmVkU2VsZWN0aW9uLmFkZChlKTsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCU9iamVjdCBlbGVtZW50ID0gVG5nVXRpbC51bndyYXAoZSk7Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEl0ZW1Qcm92aWRlckFkYXB0ZXIKLQkJCQkJfHwgKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50ICYmIFRuZ1V0aWwKLQkJCQkJCQkuaXNQcmVkZWZpbmVkKChNZXRob2RFbGVtZW50KSBlbGVtZW50KSkpIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgQ3VzdG9tQ2F0ZWdvcnkpIHsKLQkJCQlDdXN0b21DYXRlZ29yeSByb290Q3VzdG9tQ2F0ZWdvcnkgPSBnZXRSb290Q3VzdG9tQ2F0ZWdvcnkoZSk7Ci0JCQkJQ3VzdG9tQ2F0ZWdvcnkgY2MgPSAoQ3VzdG9tQ2F0ZWdvcnkpIGVsZW1lbnQ7Ci0JCQkJaWYgKHJvb3RDdXN0b21DYXRlZ29yeSAhPSBudWxsICYmIAotCQkJCQkJVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4ocm9vdEN1c3RvbUNhdGVnb3J5KSA9PSBVbWFVdGlsLmdldE1ldGhvZFBsdWdpbihjYykpIHsKLQkJCQkJLy8gc2VsZWN0ZWQgY3VzdG9tZSBjYXRlZ29yeSBpcyBpbiB0aGUgY3VycmVudCBwbHVnaW4uCi0JCQkJCS8vIGFkZCB0aGUgZWxlbWVudCB0byB0aGUgc2VsZWN0aW9uIGluc3RlYWQgb2YgaXRzCi0JCQkJCS8vIHdyYXBwZXIgc28gdGhlIGVsZW1lbnQKLQkJCQkJLy8gd2lsbCBiZSBkZWxldGVkIHBlcm1hbmVudGx5IGZyb20gdGhlIGxpYnJhcnkKLQkJCQkJLy8KLQkJCQkJZmlsdGVyZWRTZWxlY3Rpb24uYWRkKGVsZW1lbnQpOwkJCQkJCi0JCQkJfQotCQkJfSBlbHNlIHsJCQkJCi0JCQkJaWYoZSBpbnN0YW5jZW9mIElXcmFwcGVySXRlbVByb3ZpZGVyKSB7Ci0JCQkJCUlXcmFwcGVySXRlbVByb3ZpZGVyIHdyYXBwZXIgPSAoSVdyYXBwZXJJdGVtUHJvdmlkZXIpIGU7Ci0vLwkJCQkJaWYod3JhcHBlci5nZXRWYWx1ZSgpIGluc3RhbmNlb2YgSVdyYXBwZXJJdGVtUHJvdmlkZXIgJiYKLS8vCQkJCQkJCSEoVG5nVXRpbC51bndyYXAod3JhcHBlci5nZXRPd25lcigpKSBpbnN0YW5jZW9mIEN1c3RvbUNhdGVnb3J5KSkgewotLy8JCQkJCQkvLyBkaXNhbGxvdyBkZWxldGluZyBlbGVtZW50IHdoZW4gaXRzIHJlZmVyZW5jZSBpbgotLy8JCQkJCQkvLyBDdXN0b21DYXRlZ29yeSB0cmVlCi0vLwkJCQkJCS8vIHRoYXQgaXMgbm90IGRpcmVjdGx5IHVuZGVyIGEgQ3VzdG9tQ2F0ZWdvcnkgaXMKLS8vCQkJCQkJLy8gc2VsZWN0ZWQKLS8vCQkJCQkJLy8KLS8vCQkJCQkJY29udGludWU7Ci0vLwkJCQkJfQotCQkJCQkKLQkJCQkJaWYgKFRuZ1V0aWwuaXNVbmRlckN1c3RvbUNhdGVnb3J5VHJlZSh3cmFwcGVyKSkgewotCQkJCQkJLy8gZGlzYWxsb3cgZGVsZXRpbmcgZWxlbWVudCB1bmRlciBhIGN1c3RvbSBjYXRlZ29yeSB0aGF0IGlzIG5vdCBhIGN1c3RvbSBjYXRlZ29yeQotCQkJCQkJLy8KLQkJCQkJCWNvbnRpbnVlOwotCQkJCQl9Ci0JCQkJCWVsc2UgaWYgKHdyYXBwZXIuZ2V0RmVhdHVyZSgpID09IFVtYVBhY2thZ2UuTGl0ZXJhbHMuRElTQ0lQTElORV9HUk9VUElOR19fRElTQ0lQTElORVMgCi0JCQkJCQkJfHwgd3JhcHBlci5nZXRGZWF0dXJlKCkgPT0gVW1hUGFja2FnZS5MaXRlcmFscy5ST0xFX1NFVF9HUk9VUElOR19fUk9MRV9TRVRTKSAKLQkJCQkJewotCQkJCQkJT2JqZWN0IG93bmVyID0gd3JhcHBlci5nZXRPd25lcigpOwotCQkJCQkJaWYob3duZXIgaW5zdGFuY2VvZiBFT2JqZWN0ICYmIGVsZW1lbnQgaW5zdGFuY2VvZiBFT2JqZWN0ICYmIAotCQkJCQkJCQlVbWFVdGlsLmdldE1ldGhvZFBsdWdpbigoRU9iamVjdCkgb3duZXIpID09IFVtYVV0aWwuZ2V0TWV0aG9kUGx1Z2luKChFT2JqZWN0KSBlbGVtZW50KSkgewotCQkJCQkJCS8vIGNhdGVnb3J5IGdyb3VwaW5nIGFuZCBjYXRlZ29yeSBhcmUgaW4gdGhlIHNhbWUgcGx1Z2luCi0JCQkJCQkJLy8gYWRkIHRoZSBlbGVtZW50IHRvIHRoZSBzZWxlY3Rpb24gaW5zdGVhZCBvZiBpdHMgd3JhcHBlciBzbyB0aGUgZWxlbWVudCAKLQkJCQkJCQkvLyB3aWxsIGJlIGRlbGV0ZWQgcGVybWFuZW50bHkgZnJvbSB0aGUgbGlicmFyeQotCQkJCQkJCS8vCi0JCQkJCQkJZmlsdGVyZWRTZWxlY3Rpb24uYWRkKGVsZW1lbnQpOwotCQkJCQkJCWNvbnRpbnVlOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQljb250aW51ZTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQlmaWx0ZXJlZFNlbGVjdGlvbi5hZGQoZSk7Ci0JCQl9Ci0JCX0KLQotCQlpZiAoZmlsdGVyZWRTZWxlY3Rpb24uaXNFbXB0eSgpKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCXJldHVybiBzdXBlcgotCQkJCS51cGRhdGVTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oZmlsdGVyZWRTZWxlY3Rpb24pKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLmFjdGlvbnMuTWV0aG9kRWxlbWVudERlbGV0ZUFjdGlvbiNwZXJmb3JtRGVsZXRlKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGVsZXRlKCkgewotCQlIYXNoU2V0IGNvbmZpZ3NUb0RlbGV0ZSA9IG5ldyBIYXNoU2V0KCk7Ci0JCUhhc2hTZXQgbW9kaWZpZWRSZXNvdXJjZXMgPSBuZXcgSGFzaFNldCgpOwotCQlJTGlicmFyeVBlcnNpc3RlciBwZXJzaXN0ZXIgPSBMaWJyYXJ5U2VydmljZVV0aWwuZ2V0Q3VycmVudFBlcnNpc3RlcigpOwotCQlpZiAoc2VsZWN0aW9uICE9IG51bGwgJiYgc2VsZWN0aW9uLnNpemUoKSA+IDApIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHNlbGVjdGlvbi5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3Qgb2JqZWN0ID0gVG5nVXRpbC51bndyYXAoaXRlci5uZXh0KCkpOwotCQkJCWlmIChvYmplY3QgaW5zdGFuY2VvZiBNZXRob2RDb25maWd1cmF0aW9uKSB7Ci0JCQkJCWNvbmZpZ3NUb0RlbGV0ZS5hZGQob2JqZWN0KTsKLQkJCQl9Ci0JCQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIEVPYmplY3QgJiYgIXBlcnNpc3Rlci5oYXNPd25SZXNvdXJjZVdpdGhvdXRSZWZlcnJlcihvYmplY3QpKSB7Ci0JCQkJCUVPYmplY3QgY29udGFpbmVyID0gKChFT2JqZWN0KSBvYmplY3QpLmVDb250YWluZXIoKTsKLQkJCQkJaWYgKGNvbnRhaW5lciAhPSBudWxsICYmIGNvbnRhaW5lci5lUmVzb3VyY2UoKSAhPSBudWxsKSB7Ci0JCQkJCQltb2RpZmllZFJlc291cmNlcy5hZGQoY29udGFpbmVyLmVSZXNvdXJjZSgpKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCS8vIEF2b2lkIGRlbGV0aW5nIHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gb2YgYSBwcm9jZXNzLgotCQlpZiAoIWNvbmZpZ3NUb0RlbGV0ZS5pc0VtcHR5KCkpIHsKLQkJCUhhc2hTZXQgY29uZmlnR1VJRHNUb0RlbGV0ZSA9IG5ldyBIYXNoU2V0KCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjb25maWdzVG9EZWxldGUuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSAoTWV0aG9kQ29uZmlndXJhdGlvbikgaXRlci5uZXh0KCk7Ci0JCQkJY29uZmlnR1VJRHNUb0RlbGV0ZS5hZGQoY29uZmlnLmdldEd1aWQoKSk7Ci0JCQl9Ci0JCQlJTGlicmFyeVJlc291cmNlU2V0IHJlc291cmNlU2V0ID0gKElMaWJyYXJ5UmVzb3VyY2VTZXQpIExpYnJhcnlTZXJ2aWNlCi0JCQkJCS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCkuZVJlc291cmNlKCkKLQkJCQkJLmdldFJlc291cmNlU2V0KCk7Ci0JCQlyZXNvdXJjZVNldAotCQkJCQkubG9hZE9wcG9zaXRlRmVhdHVyZXMoCi0JCQkJCQkJQ29sbGVjdGlvbnMKLQkJCQkJCQkJCS5zaW5nbGV0b25MaXN0KEFzc29jaWF0aW9uSGVscGVyLk1ldGhvZENvbmZpZ3VyYXRpb25fRGVwZW5kZW50UHJvY2Vzc2VzKSwKLQkJCQkJCQljb25maWdHVUlEc1RvRGVsZXRlKTsKLQotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gY29uZmlnc1RvRGVsZXRlLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gKE1ldGhvZENvbmZpZ3VyYXRpb24pIGl0ZXIubmV4dCgpOwotCi0JCQkJTGlzdCByZWZlcmVuY2VzID0gQXNzb2NpYXRpb25IZWxwZXIKLQkJCQkJCS5nZXREZXBlbmRlbnRQcm9jZXNzZXMoY29uZmlnKTsKLQkJCQlpZiAocmVmZXJlbmNlcyAhPSBudWxsICYmIHJlZmVyZW5jZXMuc2l6ZSgpID4gMCkgewotCQkJCQlTdHJpbmcgcHJvY2Vzc05hbWUgPSAoKG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzcykgcmVmZXJlbmNlcwotCQkJCQkJCS5nZXQoMCkpLmdldE5hbWUoKTsKLQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4KLQkJCQkJCQkuZ2V0RGVmYXVsdCgpCi0JCQkJCQkJLmdldE1zZ0RpYWxvZygpCi0JCQkJCQkJLmRpc3BsYXlXYXJuaW5nKAotCQkJCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuZGVsZXRlRGlhbG9nX3RpdGxlLCAKLQkJCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLmRlbGV0ZUNvbmZpZ0Vycm9yX21zZywgCi0JCQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcwotCQkJCQkJCQkJCQkuYmluZCgKLQkJCQkJCQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5kZWxldGVDb25maWdFcnJvcl9yZWFzb24sCi0JCQkJCQkJCQkJCQkJcHJvY2Vzc05hbWUpKTsgCi0JCQkJCXJldHVybjsKLQkJCQl9Ci0KLQkJCX0KLQotCQl9Ci0KLQkJSVN0YXR1cyBzdGF0dXMgPSBVc2VySW50ZXJhY3Rpb25IZWxwZXIuY2hlY2tNb2RpZnkobW9kaWZpZWRSZXNvdXJjZXMsCi0JCQkJTGlicmFyeUVkaXRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldENvbnRleHQoKSk7Ci0JCWlmICghc3RhdHVzLmlzT0soKSkgewotCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpLmRpc3BsYXkoCi0JCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLmRlbGV0ZURpYWxvZ190aXRsZSwgCi0JCQkJCXN0YXR1cyk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlpZiAoY29uZmlybURlbGV0ZSgpKSB7Ci0JCQkvLyBDb2xsZWN0IHRoZSBpbmZvcm1hdGlvbiBvZiBSZWZyZXNoYWJsZSBPYmplY3RzCi0JCQkvLyAoIFJlZmVyZW5jZSBPYmplY3RzIHNob3VsZCBiZSByZWZyZXNoZWQgaW4gbmF2aWdhdGlvbiB0cmVlKSAtCi0JCQlBcnJheUxpc3QgcmVmcmVzaExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBzZWxlY3Rpb24uaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IGRlbGV0aW5nT2JqZWN0ID0gVG5nVXRpbC51bndyYXAoaXRlci5uZXh0KCkpOwotCQkJCWlmIChkZWxldGluZ09iamVjdCBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCQkJLy8gY2hlY2sgZm9yIHZhcmlhYmlsaXR5Ci0JCQkJCWlmIChkZWxldGluZ09iamVjdCBpbnN0YW5jZW9mIFZhcmlhYmlsaXR5RWxlbWVudCkgewotCQkJCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IFRuZ1V0aWwKLQkJCQkJCQkJLmdldEdlbmVyYWxpemVycygoVmFyaWFiaWxpdHlFbGVtZW50KSBkZWxldGluZ09iamVjdCk7IGl0ZXJhdG9yCi0JCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJT2JqZWN0IGFSZWZlcmVuY2UgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCQkJcmVmcmVzaExpc3QuYWRkKGFSZWZlcmVuY2UpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQlEZWxldGVNZXRob2RFbGVtZW50Q29tbWFuZCBjbWQgPSAoRGVsZXRlTWV0aG9kRWxlbWVudENvbW1hbmQpIChjb21tYW5kIGluc3RhbmNlb2YgRGVsZXRlTWV0aG9kRWxlbWVudENvbW1hbmQgPyBjb21tYW5kIDogbnVsbCk7Ci0JCQkKLQkJCS8vIGV4ZWN1dGUgYWN0dWFsIGRlbGV0ZSBjb21tYW5kLgotCQkJY29tbWFuZC5leGVjdXRlKCk7Ci0KLQkJCS8vIGRlbGV0ZSB0aGUgcmVmZXJlbmNpbmcgZGVzY3JpcHRvcnMgaWYgdGhlcmUgaXMgYW55Ci0JCQkvLwotCQkJaWYoY21kICE9IG51bGwpIHsKLQkJCQlDb2xsZWN0aW9uPERlc2NyaXB0b3I+IGRlc2NyaXB0b3JzVG9EZWxldGUgPSBjbWQuZ2V0RGVzY3JpcHRvcnNUb0RlbGV0ZSgpOwotCQkJCWlmKGRlc2NyaXB0b3JzVG9EZWxldGUgIT0gbnVsbCAmJiAhZGVzY3JpcHRvcnNUb0RlbGV0ZS5pc0VtcHR5KCkpIHsKLQkJCQkJUHJvY2Vzc0RlbGV0ZUFjdGlvbi5kZWxldGUoZGVzY3JpcHRvcnNUb0RlbGV0ZSk7Ci0JCQkJfQotCQkJfQotCi0JCQkvLyBSZWZyZXNoIHRoZSByZWZyZXNobGlzdCBvYmplY3RzIGluIG5hdmlnYXRpb24gdHJlZS4KLQkJCWlmIChyZWZyZXNoTGlzdC5zaXplKCkgPiAwKSB7Ci0JCQkJVHJlZVZpZXdlciB2aWV3ZXIgPSAoKFRyZWVWaWV3ZXIpIChMaWJyYXJ5Vmlldy5nZXRWaWV3KCkKLQkJCQkJCS5nZXRWaWV3ZXIoKSkpOwotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHJlZnJlc2hMaXN0Lml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQl2aWV3ZXIucmVmcmVzaChpdGVyLm5leHQoKSk7Ci0JCQkJfQotCQkJfQkJCQotCQl9Ci0JfQotCi0JLyoqCi0JICogTm90aWZ5IHByb3BlcnkgY2hhbmdlIHdpdGggb2xkIGFuZCBuZXcgdmFsdWUKLQkgKiAKLQkgKiBAcGFyYW0gcHJvcGVydHlOYW1lCi0JICogCQkJcHJvcGVydHkgbmFtZSBmb3Igd2hpY2ggdmFsdWUgaXMgZ29pbmcgdG8gY2hhbmdlCi0JICogQHBhcmFtIG9sZFZhbHVlCi0JICogCQkJT2xkIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eQotCSAqIEBwYXJhbSBuZXdWYWx1ZQotCSAqIAkJCU5ldyB2YWx1ZSBvZiB0aGUgcHJvcGVydHkKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlQcm9wZXJ0eUNoYW5nZShTdHJpbmcgcHJvcGVydHlOYW1lLCBPYmplY3Qgb2xkVmFsdWUsCi0JCQlPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3VwZXIuZmlyZVByb3BlcnR5Q2hhbmdlKHByb3BlcnR5TmFtZSwgb2xkVmFsdWUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBIYW5kbGUgdGhlIHNwZWNpYWwgY2FzZSBvZiBjdXN0b21jYXRlZ29yeSBDb3B5L0RlbGV0ZSBhY3Rpb24gSWYgcGFyZW50IG9mCi0JICogY3VzdG9tY2F0ZWdvcnkgc2VsZWN0ZWQsIGlnbm9yZSB0aGUgY3VzdG9tY2F0ZWdvcnksIG90aGVyd2lzZSBjb21wb3VuZAotCSAqIGNvbW1hbmQgY3JlYXRlcyBhIGNvbW1hbmQgZm9yIHBhcmVudCBhbmQgYSBjb21tYW5kIGZvciBjaGlsZCwKLQkgKiBDb21wb3VuZENvbW1hbmQgd2lsbCBleGVjdXRlIGJvdGggY29tbWFuZHMsIGNvbW1hbmQgZm9yIHBhcmVudCB3aWxsCi0JICogcmVtb3ZlIHBhcmVudCBpdHNlbGYgYW5kIHJlbW92ZXMgY2hpbGQgdG9vLCBuZXh0IGl0IHRyeSB0byBleGVjdXRlCi0JICogY29tbWFuZCBmb3IgY2hpbGQsIGNvbW1hbmQgd2lsbCBmYWlsIGJlY2F1c2UgY2hpbGQgZ290IHJlbW92ZSBpbiBjb21tYW5kCi0JICogZm9yIHBhcmVudC4gCi0JICogVE9ETzogaGFuZGxlIHByb3Blcmx5IGluIFJlbW92ZUNvbW1hbmQgZm9yIHRoaXMgY2FzZSBpbnN0ZWFkIGhlcmUuCi0JICovCi0JcHVibGljIHZvaWQgZmlsdGVyQ3VzdG9tQ2F0ZWdvcnlTZWxlY3Rpb24oT2JqZWN0IGUsIExpc3QgZmlsdGVyZWRTZWxlY3Rpb24pIHsKLQkJaWYgKGUgaW5zdGFuY2VvZiBGZWF0dXJlVmFsdWVXcmFwcGVySXRlbVByb3ZpZGVyKSB7Ci0JCQlmaWx0ZXJlZFNlbGVjdGlvbi5hZGQoZSk7Ci0JCX0gZWxzZSB7Ci0JCQlPYmplY3Qgb3duZXIgPSAoKERlbGVnYXRpbmdXcmFwcGVySXRlbVByb3ZpZGVyKSBlKS5nZXRPd25lcigpOwotCQkJd2hpbGUgKG93bmVyIGluc3RhbmNlb2YgRGVsZWdhdGluZ1dyYXBwZXJJdGVtUHJvdmlkZXIpIHsKLQkJCQlpZiAob3duZXIgaW5zdGFuY2VvZiBGZWF0dXJlVmFsdWVXcmFwcGVySXRlbVByb3ZpZGVyKSB7Ci0JCQkJCWlmICghZmlsdGVyZWRTZWxlY3Rpb24uY29udGFpbnMob3duZXIpKSB7Ci0JCQkJCQlmaWx0ZXJlZFNlbGVjdGlvbi5hZGQoZSk7Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJaWYgKGZpbHRlcmVkU2VsZWN0aW9uLmNvbnRhaW5zKG93bmVyKSkKLQkJCQkJCWJyZWFrOwotCQkJCQlvd25lciA9ICgoRGVsZWdhdGluZ1dyYXBwZXJJdGVtUHJvdmlkZXIpIG93bmVyKS5nZXRPd25lcigpOwotCQkJCQlpZiAoIShvd25lciBpbnN0YW5jZW9mIEZlYXR1cmVWYWx1ZVdyYXBwZXJJdGVtUHJvdmlkZXIpKSB7Ci0JCQkJCQlpZiAoIWZpbHRlcmVkU2VsZWN0aW9uLmNvbnRhaW5zKG93bmVyKSkgewotCQkJCQkJCWZpbHRlcmVkU2VsZWN0aW9uLmFkZChlKTsKLQkJCQkJCQlicmVhazsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9MaWJyYXJ5Vmlld0VkaXRBY3Rpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9MaWJyYXJ5Vmlld0VkaXRBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmI2MGRkMy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvTGlicmFyeVZpZXdFZGl0QWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuRWRpdG9yQ2hvb3NlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc1BhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLkJhc2VTZWxlY3Rpb25MaXN0ZW5lckFjdGlvbjsKLQotCi0vKioKLSAqIEVkaXRzIGFuIGVsZW1lbnQgaW4gdGhlIExpYnJhcnkgdmlldy4KLSAqIAotICogQGF1dGhvciBCaW5neHVlIFh1Ci0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIExpYnJhcnlWaWV3RWRpdEFjdGlvbiBleHRlbmRzIEJhc2VTZWxlY3Rpb25MaXN0ZW5lckFjdGlvbiB7Ci0KLQkvKioKLQkgKiBUaGUgSUQgZm9yIHRoaXMgYWN0aW9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElPTl9JRCA9IExpYnJhcnlWaWV3RWRpdEFjdGlvbi5jbGFzcy5nZXROYW1lKCk7Ci0JCi0JcHJpdmF0ZSBDb2xsZWN0aW9uIHNlbGVjdGVkOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgTGlicmFyeVZpZXdFZGl0QWN0aW9uKFN0cmluZyB0ZXh0KSB7Ci0JCXN1cGVyKHRleHQpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbiNydW4oKQotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJZm9yIChJdGVyYXRvciBvYmplY3RzID0gc2VsZWN0ZWQuaXRlcmF0b3IoKTsgb2JqZWN0cy5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZWxlbWVudCA9IG9iamVjdHMubmV4dCgpOwotCQkJRWRpdG9yQ2hvb3Nlci5nZXRJbnN0YW5jZSgpLm9wZW5FZGl0b3IoZWxlbWVudCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBVcGRhdGVzIHRoaXMgYWN0aW9uIGluIHJlc3BvbnNlIHRvIHRoZSBnaXZlbiBzZWxlY3Rpb24gY2hhbmdlcy4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB1cGRhdGVTZWxlY3Rpb24oSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCWlmIChzZWxlY3Rpb24uaXNFbXB0eSgpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlzZWxlY3RlZCA9IG5ldyBIYXNoU2V0KCk7Ci0KLQkJZm9yIChJdGVyYXRvciBvYmplY3RzID0gc2VsZWN0aW9uLml0ZXJhdG9yKCk7IG9iamVjdHMuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGVsZW1lbnQgPSBvYmplY3RzLm5leHQoKTsKLQkJCU9iamVjdCByZWFsT2JqID0gVG5nVXRpbC51bndyYXAoZWxlbWVudCk7Ci0JCQlpZiAocmVhbE9iaiBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQKLQkJCQkJJiYgIVRuZ1V0aWwuaXNQcmVkZWZpbmVkKChNZXRob2RFbGVtZW50KSByZWFsT2JqKQotCQkJCQkmJiAhKHJlYWxPYmogaW5zdGFuY2VvZiBQcm9jZXNzUGFja2FnZSAmJiAhKHJlYWxPYmogaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50KSkpIHsKLQkJCQlzZWxlY3RlZC5hZGQocmVhbE9iaik7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gIXNlbGVjdGVkLmlzRW1wdHkoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9MaWJyYXJ5Vmlld0ZpbmRFbGVtZW50QWN0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvTGlicmFyeVZpZXdGaW5kRWxlbWVudEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYmU5M2JkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9MaWJyYXJ5Vmlld0ZpbmRFbGVtZW50QWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudmlld3MuTGlicmFyeVZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLkJhc2VTZWxlY3Rpb25MaXN0ZW5lckFjdGlvbjsKLQotLyoqCi0gKiAKLSAqIEZpbmRzIGFuIGVsZW1lbnQgaW4gbGlicmFyeSB2aWV3Ci0gKiAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4wCi0gKgotICovCi1wdWJsaWMgY2xhc3MgTGlicmFyeVZpZXdGaW5kRWxlbWVudEFjdGlvbiBleHRlbmRzIEJhc2VTZWxlY3Rpb25MaXN0ZW5lckFjdGlvbiB7Ci0KLQkvKioKLQkgKiBUaGUgSUQgZm9yIHRoaXMgYWN0aW9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElPTl9JRCA9IExpYnJhcnlWaWV3RmluZEVsZW1lbnRBY3Rpb24uY2xhc3MKLQkJCS5nZXROYW1lKCk7Ci0JCi0JcHJpdmF0ZSBMaWJyYXJ5VmlldyB0YXJnZXRWaWV3OwotCXByaXZhdGUgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0ZWQ7Ci0KLQkKLQlwdWJsaWMgTGlicmFyeVZpZXdGaW5kRWxlbWVudEFjdGlvbihTdHJpbmcgdGV4dCkgewotCQlzdXBlcih0ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb24jcnVuKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCWlmICh0YXJnZXRWaWV3ID09IG51bGwpCi0JCQl0YXJnZXRWaWV3ID0gTGlicmFyeVZpZXcuZ2V0VmlldygpOwotCi0JCS8vIHNlbGVjdCBjdXJyZW50U2VsZWN0aW9uIGluIExpYiBWaWV3Ci0JCWlmICh0YXJnZXRWaWV3ICE9IG51bGwgJiYgc2VsZWN0ZWQgIT0gbnVsbCAmJiAhc2VsZWN0ZWQuaXNFbXB0eSgpKSB7Ci0KLQkJCXRyeSB7Ci0JCQkJdGFyZ2V0Vmlldy5nZXRTaXRlKCkuZ2V0UGFnZSgpLnNob3dWaWV3KExpYnJhcnlWaWV3LlZJRVdfSUQpOwotCQkJfSBjYXRjaCAoUGFydEluaXRFeGNlcHRpb24gcGUpIHsKLQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IocGUpOwotCQkJfQotCi0JCQlmaW5hbCBPYmplY3Qgc2VsZWN0ZWRPYmplY3QgPSBzZWxlY3RlZC5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCWlmIChzZWxlY3RlZE9iamVjdCAhPSBudWxsKSB7Ci0JCQkJRGlzcGxheS5nZXRDdXJyZW50KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJTGlicmFyeVZpZXcuZ2V0VmlldygpLnNldFNlbGVjdGlvblRvVmlld2VyKAotCQkJCQkJCQlzZWxlY3RlZE9iamVjdCk7Ci0JCQkJCX0KLQotCQkJCX0pOwotCi0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuQmFzZVNlbGVjdGlvbkxpc3RlbmVyQWN0aW9uI3VwZGF0ZVNlbGVjdGlvbihvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uKQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHVwZGF0ZVNlbGVjdGlvbihJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJc2VsZWN0ZWQgPSBzZWxlY3Rpb247Ci0JCWlmIChzZWxlY3Rpb24gIT0gbnVsbCAmJiAhc2VsZWN0aW9uLmlzRW1wdHkoKSkgewotCQkJT2JqZWN0IGVsZW1lbnQgPSBzZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCQlPYmplY3QgcmVhbE9iaiA9IFRuZ1V0aWwudW53cmFwKGVsZW1lbnQpOwotCQkJaWYgKHJlYWxPYmogaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9MaWJyYXJ5Vmlld1Bhc3RlQWN0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvTGlicmFyeVZpZXdQYXN0ZUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNzU4OGE0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9MaWJyYXJ5Vmlld1Bhc3RlQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5QYXN0ZUZyb21DbGlwYm9hcmRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5QYXN0ZUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udWkudXRpbC5Nc2dCb3g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jYXRlZ29yeS5TdGFuZGFyZENhdGVnb3JpZXNJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51aS5Vc2VySW50ZXJhY3Rpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuYWN0aW9ucy5JTGlicmFyeUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5hY3Rpb25zLkxpYnJhcnlMb2NraW5nT3BlcmF0aW9uUnVubmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVXaXRoUHJvZ3Jlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLQotCi0vKioKLSAqIFBhc3RlcyBhbiBlbGVtZW50IGZyb20gdGhlIGNsaXBib2FyZCB0byB0aGUgTGlicmFyeSB2aWV3LgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICogaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE4MTU1OQotICovCi1wdWJsaWMgY2xhc3MgTGlicmFyeVZpZXdQYXN0ZUFjdGlvbiBleHRlbmRzIFBhc3RlQWN0aW9uIGltcGxlbWVudHMKLQkJSUxpYnJhcnlBY3Rpb24gewotCi0JcHJpdmF0ZSBJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzTW9uaXRvcjsKLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkNvbW1hbmRBY3Rpb25IYW5kbGVyI3J1bigpCi0JICovCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQlMaWJyYXJ5TG9ja2luZ09wZXJhdGlvblJ1bm5lciBydW5uZXIgPSBuZXcgTGlicmFyeUxvY2tpbmdPcGVyYXRpb25SdW5uZXIoKTsKLQkJcnVubmVyLnNldFByb2dyZXNzTW9uaXRvcihnZXRQcm9ncmVzc01vbml0b3IoKSk7Ci0JCXJ1bm5lci5ydW4obmV3IElSdW5uYWJsZVdpdGhQcm9ncmVzcygpIHsKLQotCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJCQlwZXJmb3JtUGFzdGUoKTsKLQkJCX0KLQkJCQotCQl9KTsKLQl9Ci0JCi0JLyoqCi0JICogUGVyZm9ybSBwYXN0ZSBvcGVyYXRpb24KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtUGFzdGUoKSB7Ci0JCWlmKGNvbW1hbmQgaW5zdGFuY2VvZiBQYXN0ZUZyb21DbGlwYm9hcmRDb21tYW5kKSB7Ci0JCQlQYXN0ZUZyb21DbGlwYm9hcmRDb21tYW5kIGNtZCA9ICgoUGFzdGVGcm9tQ2xpcGJvYXJkQ29tbWFuZCljb21tYW5kKTsKLQkJCU9iamVjdCBvd25lciA9IGNtZC5nZXRPd25lcigpOwotCQkJaWYob3duZXIgaW5zdGFuY2VvZiBBZGFwdGVyKSB7Ci0JCQkJb3duZXIgPSAoKEFkYXB0ZXIpb3duZXIpLmdldFRhcmdldCgpOwotCQkJfQotCQkJCi0JCQkvLyBjaGVjayB0YXJnZXQgZm9yIG1vZGlmaWFibGUKLQkJCS8vCi0JCQlpZihvd25lciBpbnN0YW5jZW9mIEVPYmplY3QpIHsKLQkJCQlJU3RhdHVzIHN0YXR1cyA9IFVzZXJJbnRlcmFjdGlvbkhlbHBlci5jaGVja01vZGlmeSgoRU9iamVjdCkgb3duZXIsIE1zZ0JveC5nZXREZWZhdWx0U2hlbGwoKSk7Ci0JCQkJaWYgKCFzdGF0dXMuaXNPSygpKSB7Ci0JCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKS5kaXNwbGF5RXJyb3IoCi0JCQkJCQkJZ2V0VGV4dCgpLCBudWxsLCBzdGF0dXMpOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJfQkJCQotCQl9Ci0JCQotCQlpZiAoY29tbWFuZCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQllbHNlCi0JCQlzdXBlci5ydW4oKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5Db21tYW5kQWN0aW9uSGFuZGxlciN1cGRhdGVTZWxlY3Rpb24ob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB1cGRhdGVTZWxlY3Rpb24oSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCWlmKHNlbGVjdGlvbiA9PSBudWxsIHx8IHNlbGVjdGlvbi5pc0VtcHR5KCkgfHwgc2VsZWN0aW9uLnNpemUoKSAhPSAxKQotCQkJcmV0dXJuIGZhbHNlOwotCQllbHNlewotCQkJT2JqZWN0IG9iamVjdCA9IHNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCWlmKG9iamVjdCBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlpZihvYmplY3QgaW5zdGFuY2VvZiBTdGFuZGFyZENhdGVnb3JpZXNJdGVtUHJvdmlkZXIpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCQotCQlyZXR1cm4gc3VwZXIudXBkYXRlU2VsZWN0aW9uKHNlbGVjdGlvbik7Ci0JfQotCQotCS8qKgotCSAqIE5vdGlmeSBwcm9wZXJ5IGNoYW5nZSB3aXRoIG9sZCBhbmQgbmV3IHZhbHVlCi0JICogCi0JICogQHBhcmFtIHByb3BlcnR5TmFtZQotCSAqIAkJCXByb3BlcnR5IG5hbWUgZm9yIHdoaWNoIHZhbHVlIGlzIGdvaW5nIHRvIGNoYW5nZQotCSAqIEBwYXJhbSBvbGRWYWx1ZQotCSAqIAkJCU9sZCB2YWx1ZSBvZiB0aGUgcHJvcGVydHkKLQkgKiBAcGFyYW0gbmV3VmFsdWUKLQkgKiAJCQlOZXcgdmFsdWUgb2YgdGhlIHByb3BlcnR5Ci0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5UHJvcGVydHlDaGFuZ2UoU3RyaW5nIHByb3BlcnR5TmFtZSwgT2JqZWN0IG9sZFZhbHVlLAotCQkJT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN1cGVyLmZpcmVQcm9wZXJ0eUNoYW5nZShwcm9wZXJ0eU5hbWUsIG9sZFZhbHVlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5hY3Rpb25zLklMaWJyYXJ5QWN0aW9uI3NldFByb2dyZXNzTW9uaXRvcihvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQcm9ncmVzc01vbml0b3IoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCXByb2dyZXNzTW9uaXRvciA9IG1vbml0b3I7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBwcm9ncmVzcyBtb25pdG9yCi0JICogQHJldHVybiB0aGUgcHJvZ3Jlc3NNb25pdG9yCi0JICovCi0JcHJvdGVjdGVkIElQcm9ncmVzc01vbml0b3IgZ2V0UHJvZ3Jlc3NNb25pdG9yKCkgewotCQlpZihwcm9ncmVzc01vbml0b3IgPT0gbnVsbCkgewotCQkJcHJvZ3Jlc3NNb25pdG9yID0gbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKTsKLQkJfQotCQlyZXR1cm4gcHJvZ3Jlc3NNb25pdG9yOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9MaWJyYXJ5Vmlld1NpbXBsZUFjdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL0xpYnJhcnlWaWV3U2ltcGxlQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3M2RkMGEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL0xpYnJhcnlWaWV3U2ltcGxlQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudmlld3MuTGlicmFyeVZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2VVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudWkuVXNlckludGVyYWN0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLmFjdGlvbnMuTGlicmFyeUxvY2tpbmdPcGVyYXRpb25SdW5uZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLk11bHRpRmlsZVhNSVJlc291cmNlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VydmljZXMuSUxpYnJhcnlQZXJzaXN0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DdXN0b21DYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uSVJ1bm5hYmxlV2l0aFByb2dyZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVHJlZUl0ZW07Ci0KLS8qKgotICogQmFzZSBmb3Igc2ltcGxlIGxpYnJhcnkgYWN0aW9uIGNsYXNzZXMKLSAqIEBhdXRob3IgV2VpcGluZyBMdQotICogQHNpbmNlICAxLjUKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIExpYnJhcnlWaWV3U2ltcGxlQWN0aW9uIGV4dGVuZHMgQWN0aW9uIHsKLQotCXByaXZhdGUgTGlicmFyeVZpZXcgbGlicmFyeVZpZXc7Ci0JCi0JLyoqCi0JICogQHBhcmFtIGxpYlZpZXcKLQkgKiBAcGFyYW0gdGV4dAotCSAqLwotCXB1YmxpYyBMaWJyYXJ5Vmlld1NpbXBsZUFjdGlvbihMaWJyYXJ5VmlldyBsaWJWaWV3LCBTdHJpbmcgdGV4dCkgewotCQlzdXBlcih0ZXh0KTsKLQkJbGlicmFyeVZpZXcgPSBsaWJWaWV3OwotCX0KLQkKLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBkb1J1bigpOwotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbiNydW4oKQotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJTGlicmFyeUxvY2tpbmdPcGVyYXRpb25SdW5uZXIgcnVubmVyID0gbmV3IExpYnJhcnlMb2NraW5nT3BlcmF0aW9uUnVubmVyKCk7Ci0JCXJ1bm5lci5ydW4obmV3IElSdW5uYWJsZVdpdGhQcm9ncmVzcygpIHsKLQotCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLQkJCQkJdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sCi0JCQkJCUludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJCQlkb1J1bigpOwotCQkJfQotCi0JCX0pOwotCX0KLQkKLQkvKioKLQkgKiBAcGFyYW0gc2VsZWN0aW9uCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBib29sZWFuIHVwZGF0ZVNlbGVjdGlvbihJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHJvdGVjdGVkIExpYnJhcnlWaWV3IGdldExpYnJhcnlWaWV3KCkgewotCQlyZXR1cm4gbGlicmFyeVZpZXc7Ci0JfQotCQotCXByb3RlY3RlZCBPYmplY3QgZ2V0U2VsZWN0aW9uUGFyZW50T2JqZWN0KCkgewotCQlUcmVlSXRlbVtdIHNlbGVjdGVkSXRlbXMgPSBnZXRMaWJyYXJ5VmlldygpLmdldFRyZWVWaWV3ZXIoKS5nZXRUcmVlKCkuZ2V0U2VsZWN0aW9uKCk7Ci0JCWlmIChzZWxlY3RlZEl0ZW1zID09IG51bGwgfHwgc2VsZWN0ZWRJdGVtcy5sZW5ndGggPT0gMCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJVHJlZUl0ZW0gaXRlbSA9IHNlbGVjdGVkSXRlbXNbMF0uZ2V0UGFyZW50SXRlbSgpOwotCQlyZXR1cm4gVG5nVXRpbC51bndyYXAoaXRlbS5nZXREYXRhKCkpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gc2F2ZShDb2xsZWN0aW9uPFJlc291cmNlPiByZXNvdXJlc1RvU2F2ZSkgewotCQlJTGlicmFyeVBlcnNpc3Rlci5GYWlsU2FmZU1ldGhvZExpYnJhcnlQZXJzaXN0ZXIgcGVyc2lzdGVyID0gTGlicmFyeVNlcnZpY2VVdGlsCi0JCQkJLmdldEN1cnJlbnRQZXJzaXN0ZXIoKS5nZXRGYWlsU2FmZVBlcnNpc3RlcigpOwotCQl0cnkgewotCQkJSGFzaFNldDxSZXNvdXJjZT4gc2VlbnMgPSBuZXcgSGFzaFNldDxSZXNvdXJjZT4oKTsKLQkJCWZvciAoSXRlcmF0b3I8UmVzb3VyY2U+IGl0ID0gcmVzb3VyZXNUb1NhdmUuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCU11bHRpRmlsZVhNSVJlc291cmNlSW1wbCByZXMgPSAoTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsKSBpdC5uZXh0KCk7Ci0JCQkJaWYgKCEgc2VlbnMuY29udGFpbnMocmVzKSkgewotCQkJCQlwZXJzaXN0ZXIuc2F2ZShyZXMpOwotCQkJCQlzZWVucy5hZGQocmVzKTsKLQkJCQl9Ci0JCQl9Ci0JCQlwZXJzaXN0ZXIuY29tbWl0KCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlwZXJzaXN0ZXIucm9sbGJhY2soKTsKLQkJCXJldHVybiBmYWxzZTsKLQkJfSBmaW5hbGx5IHsKLQkJfQotCQkKLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgYWJzdHJhY3QgY2xhc3MgQ3VzdG9tZUNhdGVnb3J5QWN0aW9uIGV4dGVuZHMgTGlicmFyeVZpZXdTaW1wbGVBY3Rpb24gewotCQlwdWJsaWMgQ3VzdG9tZUNhdGVnb3J5QWN0aW9uKExpYnJhcnlWaWV3IGxpYlZpZXcsIFN0cmluZyB0ZXh0KSB7Ci0JCQlzdXBlcihsaWJWaWV3LCB0ZXh0KTsKLQkJfQotCQkKLQkJcHJvdGVjdGVkIGJvb2xlYW4gY2hlY2tNb2RpZnkoKSB7Ci0JCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGdldExpYnJhcnlWaWV3KCkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBzZWxlY3Rpb24uaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyLm5leHQoKTsKLQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQKLQkJCQkJCXx8IChlbGVtZW50ID0gVG5nVXRpbC51bndyYXAoZWxlbWVudCkpIGluc3RhbmNlb2YgQ3VzdG9tQ2F0ZWdvcnkpIHsKLQkJCQkJaWYgKCEgY2hlY2tNb2RpZnkoZWxlbWVudCkpIHsKLQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCQotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJCQkKLQkJcHJvdGVjdGVkIGJvb2xlYW4gY2hlY2tNb2RpZnkoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudAotCQkJCQl8fCAoZWxlbWVudCA9IFRuZ1V0aWwudW53cmFwKGVsZW1lbnQpKSBpbnN0YW5jZW9mIEN1c3RvbUNhdGVnb3J5KSB7Ci0JCQkJLy8gSGFuZGxlIEN1c3RvbUNhdGVnb3J5IHNwZWNpYWxseS4KLQkJCQlFT2JqZWN0IGNvbnRhaW5lciA9ICgoRU9iamVjdCkgZWxlbWVudCkuZUNvbnRhaW5lcigpOwotCQkJCUlTdGF0dXMgc3RhdHVzID0gVXNlckludGVyYWN0aW9uSGVscGVyLmNoZWNrTW9kaWZ5KAotCQkJCQkJY29udGFpbmVyLCBnZXRMaWJyYXJ5VmlldygpLmdldFNpdGUoKS5nZXRTaGVsbCgpKTsKLQkJCQlpZiAoY29udGFpbmVyICE9IG51bGwgJiYgIXN0YXR1cy5pc09LKCkpIHsKLQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4KLQkJCQkJCQkuZ2V0RGVmYXVsdCgpCi0JCQkJCQkJLmdldE1zZ0RpYWxvZygpCi0JCQkJCQkJLmRpc3BsYXlFcnJvcigKLQkJCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLmVycm9yRGlhbG9nX3RpdGxlLAotCQkJCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuZXJyb3JEaWFsb2dfbW92ZUVycm9yLAotCQkJCQkJCQkJc3RhdHVzKTsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCX0KLQkJCQotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJCi0JfQotCQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL0xpbmtXaXRoRWRpdG9yLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvTGlua1dpdGhFZGl0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWE2MzQ2Mi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvTGlua1dpdGhFZGl0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuRWRpdG9yQ2hvb3NlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnZpZXdzLkxpYnJhcnlWaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklQYXJ0TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVZpZXdBY3Rpb25EZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JVmlld1BhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci0KLS8qKgotICogTGlua3MgZWRpdG9yIHdpdGggYW4gZWxlbWVudCBpbiBsaWJyYXJ5IHZpZXcKLSAqIEBhdXRob3IgSmVmZiBIYXJkeQotICogQHNpbmNlIDEuMAotICoKLSAqLwotcHVibGljIGNsYXNzIExpbmtXaXRoRWRpdG9yIGltcGxlbWVudHMgSVZpZXdBY3Rpb25EZWxlZ2F0ZSB7Ci0KLQlwcml2YXRlIExpYnJhcnlWaWV3IHRhcmdldFZpZXc7Ci0KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGVuYWJsZWQgPSBmYWxzZTsKLQotCXByaXZhdGUgSVBhcnRMaXN0ZW5lciBlZGl0b3JQYXJ0TGlzdGVuZXIgPSBuZXcgSVBhcnRMaXN0ZW5lcigpIHsKLQotCQlwdWJsaWMgdm9pZCBwYXJ0T3BlbmVkKElXb3JrYmVuY2hQYXJ0IHBhcnQpIHsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHBhcnREZWFjdGl2YXRlZChJV29ya2JlbmNoUGFydCBwYXJ0KSB7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBwYXJ0Q2xvc2VkKElXb3JrYmVuY2hQYXJ0IHBhcnQpIHsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHBhcnRCcm91Z2h0VG9Ub3AoSVdvcmtiZW5jaFBhcnQgcGFydCkgewotCQl9Ci0KLQkJcHVibGljIHZvaWQgcGFydEFjdGl2YXRlZChJV29ya2JlbmNoUGFydCBwYXJ0KSB7Ci0JCQlpZiAocGFydCBpbnN0YW5jZW9mIElFZGl0b3JQYXJ0KSB7Ci0JCQkJLy8gU2VsZWN0IHRoZSBtZXRob2QgZWxlbWVudCBhc3NvY2lhdGVkIHdpdGggdGhlIGN1cnJlbnRseQotCQkJCS8vIHNlbGVjdGVkIGVkaXRvci4KLQkJCQlPYmplY3RbXSBvYmplY3RzID0gbmV3IE9iamVjdFsxXTsKLQkJCQlvYmplY3RzWzBdID0gRWRpdG9yQ2hvb3Nlci5nZXRJbnN0YW5jZSgpCi0JCQkJCQkuZ2V0QWN0aXZlTWV0aG9kRWRpdG9ySW5wdXQoKTsKLQkJCQlpZiAob2JqZWN0c1swXSAhPSBudWxsKSB7Ci0JCQkJCS8vIGRpc2FibGUgdGhlIHNlbGVjdGlvbkNoYW5nZWQgbWV0aG9kIGZyb20gZmlyaW5nIGZyb20gdGhpcyBzZWxlY3Rpb24gY2hhbmdlCi0JCQkJCWVuYWJsZWQgPSBmYWxzZTsKLQkJCQkJdGFyZ2V0Vmlldy5zZXRTZWxlY3Rpb25Ub1ZpZXdlcihvYmplY3RzWzBdKTsKLQkJCQkJZW5hYmxlZCA9IHRydWU7Ci0JCQkJfQotCQkJfQotCi0JCX0KLQl9OwotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JVmlld0FjdGlvbkRlbGVnYXRlI2luaXQob3JnLmVjbGlwc2UudWkuSVZpZXdQYXJ0KQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSVZpZXdQYXJ0IHZpZXcpIHsKLQkJdGFyZ2V0VmlldyA9IChMaWJyYXJ5VmlldykgdmlldzsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklBY3Rpb25EZWxlZ2F0ZSNydW4ob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24pCi0JICovCi0JcHVibGljIHZvaWQgcnVuKElBY3Rpb24gYWN0aW9uKSB7Ci0JCWlmIChlbmFibGVkKSB7Ci0JCQkvLyByZW1vdmUgbGlzdGVuZXJzIGZyb20gZWRpdG9ycGFydAotCQkJdGFyZ2V0Vmlldy5nZXRTaXRlKCkuZ2V0UGFnZSgpLnJlbW92ZVBhcnRMaXN0ZW5lcigKLQkJCQkJZWRpdG9yUGFydExpc3RlbmVyKTsKLQotCQkJZW5hYmxlZCA9IGZhbHNlOwotCQl9IGVsc2UgewotCQkJLy8gc2VsZWN0IGVsZW1lbnQgb2YgY3VycmVudGx5IHNlbGVjdGVkIGVkaXRvcgotCQkJT2JqZWN0W10gb2JqZWN0cyA9IG5ldyBPYmplY3RbMV07Ci0JCQlvYmplY3RzWzBdID0gRWRpdG9yQ2hvb3Nlci5nZXRJbnN0YW5jZSgpLmdldEFjdGl2ZU1ldGhvZEVkaXRvcklucHV0KCk7Ci0JCQlpZiAob2JqZWN0c1swXSAhPSBudWxsKSB7Ci0JCQkJdGFyZ2V0Vmlldy5zZXRTZWxlY3Rpb25Ub1ZpZXdlcihvYmplY3RzWzBdKTsKLQkJCX0KLQotCQkJLy8gYWRkIGxpc3RlbmVycyB0byBlZGl0b3JwYXJ0Ci0JCQl0YXJnZXRWaWV3LmdldFNpdGUoKS5nZXRQYWdlKCkuYWRkUGFydExpc3RlbmVyKGVkaXRvclBhcnRMaXN0ZW5lcik7Ci0KLQkJCWVuYWJsZWQgPSB0cnVlOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JQWN0aW9uRGVsZWdhdGUjc2VsZWN0aW9uQ2hhbmdlZChvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiwgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoSUFjdGlvbiBhY3Rpb24sIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiTGlua1dpdGhFZGl0b3Igc2VsZWN0aW9uIGlzICIgKyBzZWxlY3Rpb24pOwotCQlpZiAoZW5hYmxlZCkgewotCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb247Ci0JCQlFZGl0b3JDaG9vc2VyLmdldEluc3RhbmNlKCkuc2VsZWN0RWRpdG9yKHNlbC5nZXRGaXJzdEVsZW1lbnQoKSk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvTWV0aG9kQWRkSW1hZ2VBY3Rpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9NZXRob2RBZGRJbWFnZUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NTQ4OTk2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9NZXRob2RBZGRJbWFnZUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5kaWFsb2dzLk1ldGhvZEFkZEltYWdlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucmljaHRleHQuSU1ldGhvZFJpY2hUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuTmV0VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5MaWJyYXJ5VUlVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5JUmljaFRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0SW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuYWN0aW9ucy5SaWNoVGV4dEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci0KLQotLyoqCi0gKiBEaXNwbGF5cyB0aGUgQWRkIEltYWdlIGRpYWxvZy4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAYXV0aG9yIEplZmYgSGFyZHkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIE1ldGhvZEFkZEltYWdlQWN0aW9uIGV4dGVuZHMgUmljaFRleHRBY3Rpb24gewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgTWV0aG9kQWRkSW1hZ2VBY3Rpb24oSVJpY2hUZXh0IHJpY2hUZXh0KSB7Ci0JCXN1cGVyKHJpY2hUZXh0LCBJQWN0aW9uLkFTX1BVU0hfQlVUVE9OKTsKLQkJc2V0SW1hZ2VEZXNjcmlwdG9yKFJpY2hUZXh0SW1hZ2VzLklNR19ERVNDX0FERF9JTUFHRSk7Ci0JCXNldFRvb2xUaXBUZXh0KFJpY2hUZXh0UmVzb3VyY2VzLmFkZEltYWdlQWN0aW9uX3Rvb2xUaXBUZXh0KTsgCi0JCXNldEVuYWJsZWQodHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogRXhlY3V0ZXMgdGhlIGFjdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gcmljaFRleHQKLQkgKiAgICAgICAgICAgIEEgUmljaCBUZXh0IGNvbnRyb2wuCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZShJUmljaFRleHQgcmljaFRleHQpIHsKLQkJaWYgKHJpY2hUZXh0ICE9IG51bGwgJiYgcmljaFRleHQgaW5zdGFuY2VvZiBJTWV0aG9kUmljaFRleHQpIHsKLQkJCU1ldGhvZEFkZEltYWdlRGlhbG9nIGRpYWxvZyA9IG5ldyBNZXRob2RBZGRJbWFnZURpYWxvZyhEaXNwbGF5Ci0JCQkJCS5nZXRDdXJyZW50KCkuZ2V0QWN0aXZlU2hlbGwoKSwKLQkJCQkJKChJTWV0aG9kUmljaFRleHQpIHJpY2hUZXh0KS5nZXRNZXRob2RFbGVtZW50KCkpOwotCQkJZGlhbG9nLm9wZW4oKTsKLQkJCWlmIChkaWFsb2cuZ2V0UmV0dXJuQ29kZSgpID09IFdpbmRvdy5PSykgewotCQkJCWlmIChkaWFsb2cuZ2V0RmlsZVRvQ29weSgpICE9IG51bGwpIHsKLQkJCQkJLy8gQ29weSB0aGUgaW1hZ2UgdG8gdGhlIHJlc291cmNlIGZvbGRlciBpZiBuZWNlc3NhcnkuCi0JCQkJCXRyeSB7Ci0JCQkJCQlTdHJpbmcgaW1hZ2VMaW5rID0gTmV0VXRpbC5kZWNvZGVkRmlsZVVybChMaWJyYXJ5VUlVdGlsLmdldFVSTEZvckF0dGFjaG1lbnQoRGlzcGxheQotCQkJCQkJCQkuZ2V0Q3VycmVudCgpLmdldEFjdGl2ZVNoZWxsKCksIGRpYWxvZwotCQkJCQkJCQkuZ2V0RmlsZVRvQ29weSgpLAotCQkJCQkJCQkoKElNZXRob2RSaWNoVGV4dCkgcmljaFRleHQpCi0JCQkJCQkJCQkJLmdldE1ldGhvZEVsZW1lbnQoKSwgdHJ1ZSkpOwotCQkJCQkJaWYgKGltYWdlTGluayA9PSBudWxsKSB7Ci0JCQkJCQkJLy8gdXNlciBoaXQgY2FuY2VsIG9uIFJlbmFtZUZpbGVDb25mbGljdERpYWxvZwotCQkJCQkJCXJldHVybjsKLQkJCQkJCX0KLQkJCQkJCWlmIChyaWNoVGV4dCBpbnN0YW5jZW9mIFJpY2hUZXh0RWRpdG9yKSB7Ci0JCQkJCQkJKChSaWNoVGV4dEVkaXRvcikgcmljaFRleHQpLnNldEZvY3VzKCk7Ci0JCQkJCQkJKChSaWNoVGV4dEVkaXRvcikgcmljaFRleHQpLmFkZEltYWdlKGltYWdlTGluaywgIiIgKyBkaWFsb2cuZ2V0SGVpZ2h0KCksICIiICsgZGlhbG9nLmdldFdpZHRoKCksIGRpYWxvZy5nZXRBbHRUYWcoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlyaWNoVGV4dAotCQkJCQkJCS5leGVjdXRlQ29tbWFuZCgKLQkJCQkJCQkJCVJpY2hUZXh0Q29tbWFuZC5BRERfSU1BR0UsCi0JCQkJCQkJCQluZXcgU3RyaW5nW10gewotCQkJCQkJCQkJCQlpbWFnZUxpbmssCi0JCQkJCQkJCQkJCSIiICsgZGlhbG9nLmdldEhlaWdodCgpLCAiIiArIGRpYWxvZy5nZXRXaWR0aCgpLCBkaWFsb2cuZ2V0QWx0VGFnKCkgfSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJfQotCQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgewotCQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGV4KTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBkaXNhYmxlSW5Tb3VyY2VNb2RlKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvTWV0aG9kQWRkTGlua0FjdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL01ldGhvZEFkZExpbmtBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmQwZWFmYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvTWV0aG9kQWRkTGlua0FjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9uczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZGlhbG9ncy5NZXRob2RBZGRMaW5rRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucmljaHRleHQuSU1ldGhvZFJpY2hUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuTmV0VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5MaWJyYXJ5VUlVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5JUmljaFRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmFjdGlvbnMuQWRkTGlua0FjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci0KLS8qKgotICogQWRkcyBhIGxpbmsgdG8gYSBSaWNoIFRleHQgZWRpdG9yLgotICogCi0gKiBAYXV0aG9yIEplZmYgSGFyZHkKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTWV0aG9kQWRkTGlua0FjdGlvbiBleHRlbmRzIEFkZExpbmtBY3Rpb24gewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgTWV0aG9kQWRkTGlua0FjdGlvbihJUmljaFRleHQgcmljaFRleHQpIHsKLQkJc3VwZXIocmljaFRleHQpOwotCX0KLQotCS8qKgotCSAqIEV4ZWN1dGVzIHRoZSBhY3Rpb24uCi0JICogCi0JICogQHBhcmFtIHJpY2hUZXh0Ci0JICogICAgICAgICAgICBBIFJpY2ggVGV4dCBjb250cm9sLgotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoSVJpY2hUZXh0IHJpY2hUZXh0KSB7Ci0JCWlmIChyaWNoVGV4dCAhPSBudWxsKSB7Ci0JCQlpZiAocmljaFRleHQgaW5zdGFuY2VvZiBJTWV0aG9kUmljaFRleHQpIHsKLQkJCQlNZXRob2RBZGRMaW5rRGlhbG9nIGRpYWxvZyA9IG5ldyBNZXRob2RBZGRMaW5rRGlhbG9nKERpc3BsYXkKLQkJCQkJCS5nZXRDdXJyZW50KCkuZ2V0QWN0aXZlU2hlbGwoKSwKLQkJCQkJCShJTWV0aG9kUmljaFRleHQpIHJpY2hUZXh0KTsKLQkJCQlkaWFsb2cub3BlbigpOwotCQkJCWlmIChkaWFsb2cuZ2V0UmV0dXJuQ29kZSgpID09IFdpbmRvdy5PSykgewotCQkJCQlTdHJpbmcgbGlua1VSTCA9IGRpYWxvZy5nZXRMaW5rKCkuZ2V0VVJMKCk7Ci0JCQkJCWlmIChsaW5rVVJMLmxlbmd0aCgpID4gMCkgewotCQkJCQkJaWYgKGRpYWxvZy5nZXRGaWxlVG9Db3B5KCkgIT0gbnVsbCkgewotCQkJCQkJCS8vIGxpbmsgdG8gYSBmaWxlLCBjcmVhdGUgdGhlIFVSTAotCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCWxpbmtVUkwgPSBMaWJyYXJ5VUlVdGlsLmdldFVSTEZvckF0dGFjaG1lbnQoRGlzcGxheQotCQkJCQkJCQkJCS5nZXRDdXJyZW50KCkuZ2V0QWN0aXZlU2hlbGwoKSwgZGlhbG9nCi0JCQkJCQkJCQkJLmdldEZpbGVUb0NvcHkoKSwKLQkJCQkJCQkJCQkoKElNZXRob2RSaWNoVGV4dCkgcmljaFRleHQpCi0JCQkJCQkJCQkJCQkuZ2V0TWV0aG9kRWxlbWVudCgpLCB0cnVlKTsKLQkJCQkJCQkJaWYgKGxpbmtVUkwgPT0gbnVsbCkgewotCQkJCQkJCQkJLy8gdXNlciBoaXQgY2FuY2VsIG9uIFJlbmFtZUZpbGVDb25mbGljdERpYWxvZwotCQkJCQkJCQkJcmV0dXJuOwotCQkJCQkJCQl9Ci0JCQkJCQkJCVN0cmluZyB1cmwgPSAiPGEgaHJlZj1cIiI7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJaWYgKFBsYXRmb3JtLmdldE9TKCkuZXF1YWxzKFBsYXRmb3JtLldTX1dJTjMyKSkgewotCQkJCQkJCQkJdXJsICs9IE5ldFV0aWwKLQkJCQkJCQkJCQkJLmVuY29kZUZpbGVVUkwoTmV0VXRpbC5GSUxFX1VSSV9QUkVGSVgKLQkJCQkJCQkJCQkJCQkrIGxpbmtVUkwpOwotCQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQkJdXJsICs9IE5ldFV0aWwuZW5jb2RlRmlsZVVSTCgiLi8iICsgbGlua1VSTCk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJfQotCQkJCQkJCQl1cmwgKz0gIlwiIiArIChkaWFsb2cuZ2V0T3BlbkxpbmtJbk5ld1dpbmRvdygpID8gIiAiICsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQkJCQkJTWV0aG9kQWRkTGlua0RpYWxvZy5PUEVOX0xJTktfSU5fTkVXX1dJTkRPV19BVFRSSUJVVEUgOiAiIikgKyAgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJCSI+IiArIG5ldyBGaWxlKGxpbmtVUkwpLmdldE5hbWUoKSArICI8L2E+IjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQkJCWxpbmtVUkwgPSB1cmw7Ci0KLQkJCQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgewotCQkJCQkJCQlleC5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQlpZiAocmljaFRleHQgaW5zdGFuY2VvZiBSaWNoVGV4dEVkaXRvcikgewotCQkJCQkJCSgoUmljaFRleHRFZGl0b3IpIHJpY2hUZXh0KS5hZGRIVE1MKGxpbmtVUkwpOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlyaWNoVGV4dC5leGVjdXRlQ29tbWFuZChSaWNoVGV4dENvbW1hbmQuQUREX0hUTUwsCi0JCQkJCQkJCQlsaW5rVVJMKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJc3VwZXIuZXhlY3V0ZShyaWNoVGV4dCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9NZXRob2RDcmVhdGVDaGlsZEFjdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL01ldGhvZENyZWF0ZUNoaWxkQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlOTUxNjIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL01ldGhvZENyZWF0ZUNoaWxkQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5VbmV4ZWN1dGFibGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNyZWF0ZUNoaWxkQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNyZWF0ZUNoaWxkQ29tbWFuZC5IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uU3RhdGljU2VsZWN0aW9uQ29tbWFuZEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZC5DcmVhdGVQcm9jZXNzQ29tcG9uZW50Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5hY3Rpb25zLkxpYnJhcnlMb2NraW5nT3BlcmF0aW9uUnVubmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uSVJ1bm5hYmxlV2l0aFByb2dyZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLQotCi0vKioKLSAqIE1ldGhvZCBDcmVhdGUgQ2hpbGQgYWN0aW9uLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgTWV0aG9kQ3JlYXRlQ2hpbGRBY3Rpb24gZXh0ZW5kcyBTdGF0aWNTZWxlY3Rpb25Db21tYW5kQWN0aW9uIHsKLQkvKioKLQkgKiBUaGlzIGRlc2NyaWJlcyB0aGUgY2hpbGQgdG8gYmUgY3JlYXRlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGRlc2NyaXB0b3I7Ci0KLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2Ugb2YgYW4gYWN0aW9uIHRoYXQgY3JlYXRlcyBhIGNoaWxkIHNwZWNpZmllZAotCSAqIGJ5IDxjb2RlPmRlc2NyaXB0b3I8L2NvZGU+IGZvciB0aGUgc2luZ2xlIG9iamVjdCBpbiB0aGUKLQkgKiA8Y29kZT5zZWxlY3Rpb248L2NvZGU+LgotCSAqLwotCXB1YmxpYyBNZXRob2RDcmVhdGVDaGlsZEFjdGlvbihFZGl0aW5nRG9tYWluIGVkaXRpbmdEb21haW4sCi0JCQlJU2VsZWN0aW9uIHNlbGVjdGlvbiwgT2JqZWN0IGRlc2NyaXB0b3IpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5lZGl0aW5nRG9tYWluID0gZWRpdGluZ0RvbWFpbjsKLQkJdGhpcy5kZXNjcmlwdG9yID0gZGVzY3JpcHRvcjsKLQkJY29uZmlndXJlQWN0aW9uKHNlbGVjdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIHRoZSBjb21tYW5kIGZvciB7QGxpbmsKLQkgKiBTdGF0aWNTZWxlY3Rpb25Db21tYW5kQWN0aW9uI2NyZWF0ZUFjdGlvbkNvbW1hbmR9LgotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGNyZWF0ZUFjdGlvbkNvbW1hbmQoRWRpdGluZ0RvbWFpbiBlZGl0aW5nRG9tYWluLAotCQkJQ29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCWlmIChjb2xsZWN0aW9uLnNpemUoKSA9PSAxKSB7Ci0JCQlPYmplY3Qgb3duZXIgPSBjb2xsZWN0aW9uLml0ZXJhdG9yKCkubmV4dCgpOwotCQkJQ29tbWFuZCBjbWQgPSBudWxsOwotCi0JCQlpZiAoZGVzY3JpcHRvciBpbnN0YW5jZW9mIENvbW1hbmRQYXJhbWV0ZXIKLQkJCQkJJiYgKChDb21tYW5kUGFyYW1ldGVyKSBkZXNjcmlwdG9yKS5nZXRWYWx1ZSgpIGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkgewotCQkJCUNvbW1hbmRQYXJhbWV0ZXIgbmV3Q2hpbGRQYXJhbWV0ZXIgPSAoQ29tbWFuZFBhcmFtZXRlcikgZGVzY3JpcHRvcjsKLQkJCQlDcmVhdGVDaGlsZENvbW1hbmQuSGVscGVyIGhlbHBlciA9IChIZWxwZXIpICgoQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluKWVkaXRpbmdEb21haW4pLmdldEFkYXB0ZXJGYWN0b3J5KCkuYWRhcHQob3duZXIsIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLmNsYXNzKTsKLS8vCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9ICgoRU9iamVjdCkgb3duZXIpLmVBZGFwdGVycygpLml0ZXJhdG9yKCk7IGl0ZXIKLS8vCQkJCQkJLmhhc05leHQoKTspIHsKLS8vCQkJCQlPYmplY3QgbyA9IGl0ZXIubmV4dCgpOwotLy8JCQkJCWlmIChvIGluc3RhbmNlb2YgUHJvY2Vzc1BhY2thZ2VJdGVtUHJvdmlkZXIpIHsKLS8vCQkJCQkJaGVscGVyID0gKFByb2Nlc3NQYWNrYWdlSXRlbVByb3ZpZGVyKSBvOwotLy8JCQkJCQlicmVhazsKLS8vCQkJCQl9Ci0vLwkJCQl9Ci0JCQkJY21kID0gbmV3IENyZWF0ZVByb2Nlc3NDb21wb25lbnRDb21tYW5kKGVkaXRpbmdEb21haW4sCi0JCQkJCQkoRU9iamVjdCkgb3duZXIsIG5ld0NoaWxkUGFyYW1ldGVyCi0JCQkJCQkJCS5nZXRFU3RydWN0dXJhbEZlYXR1cmUoKSwgbmV3Q2hpbGRQYXJhbWV0ZXIKLQkJCQkJCQkJLmdldFZhbHVlKCksIG5ld0NoaWxkUGFyYW1ldGVyLmdldEluZGV4KCksCi0JCQkJCQljb2xsZWN0aW9uLCBoZWxwZXIpIHsKLQkJCQl9OwotCQkJfSBlbHNlIHsKLQkJCQljbWQgPSBDcmVhdGVDaGlsZENvbW1hbmQuY3JlYXRlKGVkaXRpbmdEb21haW4sIG93bmVyLAotCQkJCQkJZGVzY3JpcHRvciwgY29sbGVjdGlvbik7Ci0JCQl9Ci0KLQkJCXJldHVybiBuZXcgQ3JlYXRlTWV0aG9kRWxlbWVudENvbW1hbmQoY21kKTsKLQkJfQotCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHN1cGVyUnVuKCkgewotCQlzdXBlci5ydW4oKTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uU3RhdGljU2VsZWN0aW9uQ29tbWFuZEFjdGlvbiNydW4oKQotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJTGlicmFyeUxvY2tpbmdPcGVyYXRpb25SdW5uZXIgcnVubmVyID0gbmV3IExpYnJhcnlMb2NraW5nT3BlcmF0aW9uUnVubmVyKCk7Ci0JCXJ1bm5lci5ydW4obmV3IElSdW5uYWJsZVdpdGhQcm9ncmVzcygpIHsKLQotCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJCQlzdXBlclJ1bigpOwotCQkJfQotCQkJCi0JCX0pOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9NZXRob2RDcmVhdGVTaWJsaW5nQWN0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvTWV0aG9kQ3JlYXRlU2libGluZ0FjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YWY0ZjI5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9NZXRob2RDcmVhdGVTaWJsaW5nQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5VbmV4ZWN1dGFibGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ3JlYXRlQ2hpbGRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5JRWRpdGluZ0RvbWFpblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5TdGF0aWNTZWxlY3Rpb25Db21tYW5kQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JVmlld1BhcnQ7Ci0KLS8qKgotICogTWV0aG9kIENyZWF0ZSBTaWJpbGluZyBhY3Rpb24uCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBNZXRob2RDcmVhdGVTaWJsaW5nQWN0aW9uIGV4dGVuZHMKLQkJU3RhdGljU2VsZWN0aW9uQ29tbWFuZEFjdGlvbiB7Ci0KLQkvKioKLQkgKiBUaGlzIGRlc2NyaWJlcyB0aGUgc2libGluZyB0byBiZSBjcmVhdGVkLgotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZGVzY3JpcHRvcjsKLQotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBvZiBhbiBhY3Rpb24gdGhhdCBjcmVhdGVzIGEgc2libGluZyBzcGVjaWZpZWQKLQkgKiBieSA8Y29kZT5kZXNjcmlwdG9yPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgTWV0aG9kQ3JlYXRlU2libGluZ0FjdGlvbihJVmlld1BhcnQgdmlld1BhcnQsIElTZWxlY3Rpb24gc2VsZWN0aW9uLAotCQkJT2JqZWN0IGRlc2NyaXB0b3IpIHsKLQkJc3VwZXIoKTsKLQkJaWYgKHZpZXdQYXJ0IGluc3RhbmNlb2YgSUVkaXRpbmdEb21haW5Qcm92aWRlcikgewotCQkJZWRpdGluZ0RvbWFpbiA9ICgoSUVkaXRpbmdEb21haW5Qcm92aWRlcikgdmlld1BhcnQpCi0JCQkJCS5nZXRFZGl0aW5nRG9tYWluKCk7Ci0JCX0KLQkJdGhpcy5kZXNjcmlwdG9yID0gZGVzY3JpcHRvcjsKLQkJY29uZmlndXJlQWN0aW9uKHNlbGVjdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIHRoZSBjb21tYW5kIGZvciB7QGxpbmsKLQkgKiBTdGF0aWNTZWxlY3Rpb25Db21tYW5kQWN0aW9uI2NyZWF0ZUFjdGlvbkNvbW1hbmR9LgotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGNyZWF0ZUFjdGlvbkNvbW1hbmQoRWRpdGluZ0RvbWFpbiBlZGl0aW5nRG9tYWluLAotCQkJQ29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCWlmIChjb2xsZWN0aW9uLnNpemUoKSA9PSAxKSB7Ci0JCQlDb21tYW5kIGNtZCA9IENyZWF0ZUNoaWxkQ29tbWFuZC5jcmVhdGUoZWRpdGluZ0RvbWFpbiwgbnVsbCwKLQkJCQkJZGVzY3JpcHRvciwgY29sbGVjdGlvbik7Ci0JCQlyZXR1cm4gbmV3IENyZWF0ZU1ldGhvZEVsZW1lbnRDb21tYW5kKGNtZCk7Ci0JCX0KLQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvTWV0aG9kTGlicmFyeUFjdGlvbkJhckNvbnRyaWJ1dG9yLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvTWV0aG9kTGlicmFyeUFjdGlvbkJhckNvbnRyaWJ1dG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1ZDQ3YWQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL01ldGhvZExpYnJhcnlBY3Rpb25CYXJDb250cmlidXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTc4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51aS52aWV3ZXIuSVZpZXdlclByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5JRWRpdGluZ0RvbWFpblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5Db3B5QWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5DcmVhdGVDaGlsZEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uQ3JlYXRlU2libGluZ0FjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uQ3V0QWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5EZWxldGVBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkVkaXRpbmdEb21haW5BY3Rpb25CYXJDb250cmlidXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uTG9hZFJlc291cmNlQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5QYXN0ZUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uUmVkb0FjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uVW5kb0FjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklDb250cmlidXRpb25JdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQ29udHJpYnV0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JVG9vbEJhck1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLk1lbnVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5TZXBhcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLlN1YkNvbnRyaWJ1dGlvbkl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklBY3Rpb25CYXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklTaGFyZWRJbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGFydEluaXRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLkFjdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuZWRpdG9yLkZvcm1FZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuZWRpdG9yLklGb3JtUGFnZTsKLQotLyoqCi0gKiBUaGUgY29udHJpYnV0b3IgZm9yIGEgTWV0aG9kIGVkaXRvci4KLSAqICAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXRob2RMaWJyYXJ5QWN0aW9uQmFyQ29udHJpYnV0b3IgZXh0ZW5kcwotCQlFZGl0aW5nRG9tYWluQWN0aW9uQmFyQ29udHJpYnV0b3IgaW1wbGVtZW50cyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIHsKLQotCS8vIEtlZXAgdHJhY2sgb2YgdGhlIGN1cnJlbnQgc2VsZWN0aW9uIHByb3ZpZGVyLgotCXByb3RlY3RlZCBJU2VsZWN0aW9uUHJvdmlkZXIgc2VsZWN0aW9uUHJvdmlkZXI7Ci0KLQkvLyBIYW5kbGUgdGhlIFNob3cgUHJvcGVydGllcyB2aWV3IGFjdGlvbi4KLQlwcm90ZWN0ZWQgSUFjdGlvbiBzaG93UHJvcGVydGllc1ZpZXdBY3Rpb24gPSBuZXcgQWN0aW9uKAotCQkJZ2V0U3RyaW5nKCJfVUlfU2hvd1Byb3BlcnRpZXNWaWV3X21lbnVfaXRlbSIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJdHJ5IHsKLQkJCQlnZXRQYWdlKCkuc2hvd1ZpZXcoIm9yZy5lY2xpcHNlLnVpLnZpZXdzLlByb3BlcnR5U2hlZXQiKTsgLy8kTk9OLU5MUy0xJAotCQkJfSBjYXRjaCAoUGFydEluaXRFeGNlcHRpb24gZXhjZXB0aW9uKSB7Ci0JCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGV4Y2VwdGlvbik7Ci0JCQl9Ci0JCX0KLQl9OwotCi0JLyoqCi0JICogVGhpcyBhY3Rpb24gcmVmcmVzaGVzIHRoZSB2aWV3ZXIgb2YgdGhlIGN1cnJlbnQgZWRpdG9yIGlmIHRoZSBlZGl0b3IKLQkgKiBpbXBsZW1lbnRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnVpLnZpZXdlci5JVmlld2VyUHJvdmlkZXJ9LgotCSAqLwotCXByb3RlY3RlZCBJQWN0aW9uIHJlZnJlc2hWaWV3ZXJBY3Rpb24gPSBuZXcgQWN0aW9uKAotCQkJZ2V0U3RyaW5nKCJfVUlfUmVmcmVzaFZpZXdlcl9tZW51X2l0ZW0iKSkgeyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBib29sZWFuIGlzRW5hYmxlZCgpIHsKLQkJCXJldHVybiBhY3RpdmVFZGl0b3IgaW5zdGFuY2VvZiBJVmlld2VyUHJvdmlkZXI7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQlkb1JlZnJlc2goKTsKLQkJfQotCX07Ci0KLQkvKioKLQkgKiBUaGlzIHdpbGwgY29udGFpbiBvbmUKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkNyZWF0ZUNoaWxkQWN0aW9ufSBjb3JyZXNwb25kaW5nIHRvCi0JICogZWFjaCBkZXNjcmlwdG9yIGdlbmVyYXRlZCBmb3IgdGhlIGN1cnJlbnQgc2VsZWN0aW9uIGJ5IHRoZSBpdGVtIHByb3ZpZGVyLgotCSAqLwotCXByb3RlY3RlZCBDb2xsZWN0aW9uIGNyZWF0ZUNoaWxkQWN0aW9uczsKLQotCS8qKgotCSAqIFRoaXMgaXMgdGhlIG1lbnUgbWFuYWdlciBpbnRvIHdoaWNoIG1lbnUgY29udHJpYnV0aW9uIGl0ZW1zIHNob3VsZCBiZQotCSAqIGFkZGVkIGZvciBDcmVhdGVDaGlsZCBhY3Rpb25zLgotCSAqLwotCXByb3RlY3RlZCBJTWVudU1hbmFnZXIgY3JlYXRlQ2hpbGRNZW51TWFuYWdlcjsKLQotCS8qKgotCSAqIFRoaXMgd2lsbCBjb250YWluIG9uZQotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uQ3JlYXRlU2libGluZ0FjdGlvbn0gY29ycmVzcG9uZGluZwotCSAqIHRvIGVhY2ggZGVzY3JpcHRvciBnZW5lcmF0ZWQgZm9yIHRoZSBjdXJyZW50IHNlbGVjdGlvbiBieSB0aGUgaXRlbQotCSAqIHByb3ZpZGVyLgotCSAqLwotCXByb3RlY3RlZCBDb2xsZWN0aW9uIGNyZWF0ZVNpYmxpbmdBY3Rpb25zOwotCi0JLyoqCi0JICogVGhpcyBpcyB0aGUgbWVudSBtYW5hZ2VyIGludG8gd2hpY2ggbWVudSBjb250cmlidXRpb24gaXRlbXMgc2hvdWxkIGJlCi0JICogYWRkZWQgZm9yIENyZWF0ZVNpYmxpbmcgYWN0aW9ucy4KLQkgKi8KLQlwcm90ZWN0ZWQgSU1lbnVNYW5hZ2VyIGNyZWF0ZVNpYmxpbmdNZW51TWFuYWdlcjsKLQotCXByb3RlY3RlZCBTdHJpbmcgbmFtZTsKLQotCXByb3RlY3RlZCBib29sZWFuIGVuYWJsZWQgPSB0cnVlOwotCi0JcHVibGljIE1ldGhvZExpYnJhcnlBY3Rpb25CYXJDb250cmlidXRvcigpIHsKLQkJbG9hZFJlc291cmNlQWN0aW9uID0gbmV3IExvYWRSZXNvdXJjZUFjdGlvbigpOwotCQl2YWxpZGF0ZUFjdGlvbiA9IG5ldyBMaWJyYXJ5VmFsaWRhdGVBY3Rpb24oKTsKLQkJdGhpcy5uYW1lID0gIk1ldGhvZEVsZW1lbnRFZGl0b3IiOyAgCS8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBjb250cmlidXRvci4KLQkgKi8KLQlwdWJsaWMgTWV0aG9kTGlicmFyeUFjdGlvbkJhckNvbnRyaWJ1dG9yKFN0cmluZyBuYW1lKSB7Ci0JCWxvYWRSZXNvdXJjZUFjdGlvbiA9IG5ldyBMb2FkUmVzb3VyY2VBY3Rpb24oKTsKLQkJdmFsaWRhdGVBY3Rpb24gPSBuZXcgTGlicmFyeVZhbGlkYXRlQWN0aW9uKCk7Ci0JCXRoaXMubmFtZSA9IG5hbWU7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBkZWxldGUgYWN0aW9uCi0JICogQHJldHVybiBBY3Rpb24KLQkgKi8KLQlwcm90ZWN0ZWQgRGVsZXRlQWN0aW9uIGNyZWF0ZURlbGV0ZUFjdGlvbigpIHsKLQkJcmV0dXJuIG5ldyBEZWxldGVBY3Rpb24ocmVtb3ZlQWxsUmVmZXJlbmNlc09uRGVsZXRlKCkpOwotCX0KLQotCSAvKioKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5FZGl0aW5nRG9tYWluQWN0aW9uQmFyQ29udHJpYnV0b3IjaW5pdChvcmcuZWNsaXBzZS51aS5JQWN0aW9uQmFycykKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElBY3Rpb25CYXJzIGFjdGlvbkJhcnMpIHsKLQkJc3VwZXIuaW5pdChhY3Rpb25CYXJzKTsKLQkJCi0JCUlTaGFyZWRJbWFnZXMgc2hhcmVkSW1hZ2VzID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKQotCQkJCS5nZXRTaGFyZWRJbWFnZXMoKTsKLQotCQlkZWxldGVBY3Rpb24gPSBjcmVhdGVEZWxldGVBY3Rpb24oKTsKLQkJZGVsZXRlQWN0aW9uLnNldEltYWdlRGVzY3JpcHRvcihzaGFyZWRJbWFnZXMKLQkJCQkuZ2V0SW1hZ2VEZXNjcmlwdG9yKElTaGFyZWRJbWFnZXMuSU1HX1RPT0xfREVMRVRFKSk7Ci0JCWFjdGlvbkJhcnMuc2V0R2xvYmFsQWN0aW9uSGFuZGxlcihBY3Rpb25GYWN0b3J5LkRFTEVURS5nZXRJZCgpLAotCQkJCWRlbGV0ZUFjdGlvbik7Ci0KLQkJY3V0QWN0aW9uID0gY3JlYXRlQ3V0QWN0aW9uKCk7Ci0JCWN1dEFjdGlvbi5zZXRJbWFnZURlc2NyaXB0b3Ioc2hhcmVkSW1hZ2VzCi0JCQkJLmdldEltYWdlRGVzY3JpcHRvcihJU2hhcmVkSW1hZ2VzLklNR19UT09MX0NVVCkpOwotCQlhY3Rpb25CYXJzLnNldEdsb2JhbEFjdGlvbkhhbmRsZXIoQWN0aW9uRmFjdG9yeS5DVVQuZ2V0SWQoKSwgY3V0QWN0aW9uKTsKLQotCQljb3B5QWN0aW9uID0gY3JlYXRlQ29weUFjdGlvbigpOwotCQljb3B5QWN0aW9uLnNldEltYWdlRGVzY3JpcHRvcihzaGFyZWRJbWFnZXMKLQkJCQkuZ2V0SW1hZ2VEZXNjcmlwdG9yKElTaGFyZWRJbWFnZXMuSU1HX1RPT0xfQ09QWSkpOwotCQlhY3Rpb25CYXJzLnNldEdsb2JhbEFjdGlvbkhhbmRsZXIoQWN0aW9uRmFjdG9yeS5DT1BZLmdldElkKCksCi0JCQkJY29weUFjdGlvbik7Ci0KLQkJcGFzdGVBY3Rpb24gPSBjcmVhdGVQYXN0ZUFjdGlvbigpOwotCQlwYXN0ZUFjdGlvbi5zZXRJbWFnZURlc2NyaXB0b3Ioc2hhcmVkSW1hZ2VzCi0JCQkJLmdldEltYWdlRGVzY3JpcHRvcihJU2hhcmVkSW1hZ2VzLklNR19UT09MX1BBU1RFKSk7Ci0JCWFjdGlvbkJhcnMuc2V0R2xvYmFsQWN0aW9uSGFuZGxlcihBY3Rpb25GYWN0b3J5LlBBU1RFLmdldElkKCksCi0JCQkJcGFzdGVBY3Rpb24pOwotCi0JCXVuZG9BY3Rpb24gPSBuZXcgVW5kb0FjdGlvbigpOwotCQl1bmRvQWN0aW9uLnNldEltYWdlRGVzY3JpcHRvcihzaGFyZWRJbWFnZXMKLQkJCQkuZ2V0SW1hZ2VEZXNjcmlwdG9yKElTaGFyZWRJbWFnZXMuSU1HX1RPT0xfVU5ETykpOwotCQlhY3Rpb25CYXJzLnNldEdsb2JhbEFjdGlvbkhhbmRsZXIoQWN0aW9uRmFjdG9yeS5VTkRPLmdldElkKCksCi0JCQkJdW5kb0FjdGlvbik7Ci0KLQkJcmVkb0FjdGlvbiA9IG5ldyBSZWRvQWN0aW9uKCk7Ci0JCXJlZG9BY3Rpb24uc2V0SW1hZ2VEZXNjcmlwdG9yKHNoYXJlZEltYWdlcwotCQkJCS5nZXRJbWFnZURlc2NyaXB0b3IoSVNoYXJlZEltYWdlcy5JTUdfVE9PTF9SRURPKSk7Ci0JCWFjdGlvbkJhcnMuc2V0R2xvYmFsQWN0aW9uSGFuZGxlcihBY3Rpb25GYWN0b3J5LlJFRE8uZ2V0SWQoKSwKLQkJCQlyZWRvQWN0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGNvcHkgYWN0aW9uCi0JICogQHJldHVybiBBY3Rpb24KLQkgKi8KLQlwcm90ZWN0ZWQgQ29weUFjdGlvbiBjcmVhdGVDb3B5QWN0aW9uKCkgewotCQlyZXR1cm4gbmV3IENvcHlBY3Rpb24oKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHBhc3RlIGFjdGlvbgotCSAqIEByZXR1cm4gQWN0aW9uCi0JICovCi0JcHJvdGVjdGVkIFBhc3RlQWN0aW9uIGNyZWF0ZVBhc3RlQWN0aW9uKCkgewotCQlyZXR1cm4gbmV3IFBhc3RlQWN0aW9uKCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBjdXQgYWN0aW9uCi0JICogQHJldHVybiBBY3Rpb24KLQkgKi8KLQlwcm90ZWN0ZWQgQ3V0QWN0aW9uIGNyZWF0ZUN1dEFjdGlvbigpIHsKLQkJcmV0dXJuIG5ldyBDdXRBY3Rpb24oKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgU2VwYXJhdG9ycyBmb3IgZWRpdG9yIGFkZGl0aW9ucyB0byB0aGUgdG9vbCBiYXIuCi0JICovCi0JcHVibGljIHZvaWQgY29udHJpYnV0ZVRvVG9vbEJhcihJVG9vbEJhck1hbmFnZXIgdG9vbEJhck1hbmFnZXIpIHsKLQkJdG9vbEJhck1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IobmFtZSArICItc2V0dGluZ3MiKSk7IC8vJE5PTi1OTFMtMSQKLQkJdG9vbEJhck1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IobmFtZSArICItYWRkaXRpb25zIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogU2V0cyBlbmFibGVkIGZsYWcKLQkgKiBAcGFyYW0gZW5hYmxlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVuYWJsZWQoYm9vbGVhbiBlbmFibGVkKSB7Ci0JCXRoaXMuZW5hYmxlZCA9IGVuYWJsZWQ7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHRvIHRoZSBtZW51IGJhciBhIG1lbnUgYW5kIHNvbWUgc2VwYXJhdG9ycyBmb3IgZWRpdG9yCi0JICogYWRkaXRpb25zLCBhcyB3ZWxsIGFzIHRoZSBzdWItbWVudXMgZm9yIG9iamVjdCBjcmVhdGlvbiBpdGVtcy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBjb250cmlidXRlVG9NZW51KElNZW51TWFuYWdlciBtZW51TWFuYWdlcikgewotLy8JCXN1cGVyLmNvbnRyaWJ1dGVUb01lbnUobWVudU1hbmFnZXIpOwotLy8JCUlNZW51TWFuYWdlciBzdWJtZW51TWFuYWdlciA9IG5ldyBNZW51TWFuYWdlcigKLS8vCQkJCWdldFN0cmluZygiX1VJXyIgKyBuYW1lICsgIl9tZW51IiksICJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLiIgKyBuYW1lICsgIk1lbnVJRCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0vLwkJbWVudU1hbmFnZXIuaW5zZXJ0QWZ0ZXIoImFkZGl0aW9ucyIsIHN1Ym1lbnVNYW5hZ2VyKTsgLy8kTk9OLU5MUy0xJAotLy8JCXN1Ym1lbnVNYW5hZ2VyLmFkZChuZXcgU2VwYXJhdG9yKCJzZXR0aW5ncyIpKTsgLy8kTk9OLU5MUy0xJAotLy8JCXN1Ym1lbnVNYW5hZ2VyLmFkZChuZXcgU2VwYXJhdG9yKCJhY3Rpb25zIikpOyAvLyROT04tTkxTLTEkCi0vLwkJc3VibWVudU1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoImFkZGl0aW9ucyIpKTsgLy8kTk9OLU5MUy0xJAotLy8JCXN1Ym1lbnVNYW5hZ2VyLmFkZChuZXcgU2VwYXJhdG9yKCJhZGRpdGlvbnMtZW5kIikpOyAvLyROT04tTkxTLTEkCi0vLwotLy8JCS8vIFByZXBhcmUgZm9yIENyZWF0ZUNoaWxkIGl0ZW0gYWRkaXRpb24gb3IgcmVtb3ZhbC4KLS8vCQljcmVhdGVDaGlsZE1lbnVNYW5hZ2VyID0gbmV3IE1lbnVNYW5hZ2VyKAotLy8JCQkJZ2V0U3RyaW5nKCJfVUlfQ3JlYXRlQ2hpbGRfbWVudV9pdGVtIikpOyAvLyROT04tTkxTLTEkCi0vLwkJc3VibWVudU1hbmFnZXIuaW5zZXJ0QmVmb3JlKCJhZGRpdGlvbnMiLCBjcmVhdGVDaGlsZE1lbnVNYW5hZ2VyKTsgLy8kTk9OLU5MUy0xJAotLy8KLS8vCQkvLyBQcmVwYXJlIGZvciBDcmVhdGVTaWJsaW5nIGl0ZW0gYWRkaXRpb24gb3IgcmVtb3ZhbC4KLS8vCQljcmVhdGVTaWJsaW5nTWVudU1hbmFnZXIgPSBuZXcgTWVudU1hbmFnZXIoCi0vLwkJCQlnZXRTdHJpbmcoIl9VSV9DcmVhdGVTaWJsaW5nX21lbnVfaXRlbSIpKTsgLy8kTk9OLU5MUy0xJAotLy8JCXN1Ym1lbnVNYW5hZ2VyLmluc2VydEJlZm9yZSgiYWRkaXRpb25zIiwgY3JlYXRlU2libGluZ01lbnVNYW5hZ2VyKTsgLy8kTk9OLU5MUy0xJAotLy8KLS8vCQkvLyBGb3JjZSBhbiB1cGRhdGUgYmVjYXVzZSBFY2xpcHNlIGhpZGVzIGVtcHR5IG1lbnVzIG5vdy4KLS8vCQlzdWJtZW51TWFuYWdlci5hZGRNZW51TGlzdGVuZXIobmV3IElNZW51TGlzdGVuZXIoKSB7Ci0vLwkJCXB1YmxpYyB2b2lkIG1lbnVBYm91dFRvU2hvdyhJTWVudU1hbmFnZXIgbWVudU1hbmFnZXIpIHsKLS8vCQkJCW1lbnVNYW5hZ2VyLnVwZGF0ZUFsbCh0cnVlKTsKLS8vCQkJfQotLy8JCX0pOwotLy8KLS8vCQlhZGRHbG9iYWxBY3Rpb25zKHN1Ym1lbnVNYW5hZ2VyKTsKLQl9Ci0KLQkvKioKLQkgKiBXaGVuIHRoZSBhY3RpdmUgZWRpdG9yIGNoYW5nZXMsIHRoaXMgcmVtZW1iZXJzIHRoZSBjaGFuZ2UgYW5kIHJlZ2lzdGVycwotCSAqIHdpdGggaXQgYXMgYSBzZWxlY3Rpb24gcHJvdmlkZXIuCi0JICovCi0JcHVibGljIHZvaWQgc2V0QWN0aXZlRWRpdG9yKElFZGl0b3JQYXJ0IHBhcnQpIHsKLQkJc3VwZXIuc2V0QWN0aXZlRWRpdG9yKHBhcnQpOwotCi0JCS8vIFN3aXRjaCB0byB0aGUgbmV3IHNlbGVjdGlvbiBwcm92aWRlci4KLQkJaWYgKHNlbGVjdGlvblByb3ZpZGVyICE9IG51bGwpIHsKLQkJCXNlbGVjdGlvblByb3ZpZGVyLnJlbW92ZVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcih0aGlzKTsKLQkJfQotCQlpZiAocGFydCA9PSBudWxsKSB7Ci0JCQlzZWxlY3Rpb25Qcm92aWRlciA9IG51bGw7Ci0JCX0gZWxzZSB7Ci0JCQlzZWxlY3Rpb25Qcm92aWRlciA9IHBhcnQuZ2V0U2l0ZSgpLmdldFNlbGVjdGlvblByb3ZpZGVyKCk7Ci0JCQlzZWxlY3Rpb25Qcm92aWRlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIodGhpcyk7Ci0KLQkJCS8vIEZha2UgYSBzZWxlY3Rpb24gY2hhbmdlZCBldmVudCB0byB1cGRhdGUgdGhlIG1lbnVzLgotCQkJaWYgKHNlbGVjdGlvblByb3ZpZGVyLmdldFNlbGVjdGlvbigpICE9IG51bGwpIHsKLQkJCQlzZWxlY3Rpb25DaGFuZ2VkKG5ldyBTZWxlY3Rpb25DaGFuZ2VkRXZlbnQoc2VsZWN0aW9uUHJvdmlkZXIsCi0JCQkJCQlzZWxlY3Rpb25Qcm92aWRlci5nZXRTZWxlY3Rpb24oKSkpOwotCQkJfQotCQl9Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHNldEFjdGl2ZVBhZ2UoSUVkaXRvclBhcnQgcGFydCkgewotCQlpZiAocGFydCAhPSBudWxsKSB7Ci0JCQlzZXRBY3RpdmVFZGl0b3IocGFydCk7Ci0JCX0KLQkJCi0JCS8vIFN3aXRjaCB0byB0aGUgbmV3IHNlbGVjdGlvbiBwcm92aWRlci4KLQkJaWYgKHNlbGVjdGlvblByb3ZpZGVyICE9IG51bGwpIHsKLQkJCXNlbGVjdGlvblByb3ZpZGVyLnJlbW92ZVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcih0aGlzKTsKLQkJfQotCQlpZiAocGFydCA9PSBudWxsKSB7Ci0JCQlzZWxlY3Rpb25Qcm92aWRlciA9IG51bGw7Ci0JCX0gZWxzZSB7Ci0JCQlzZWxlY3Rpb25Qcm92aWRlciA9IHBhcnQuZ2V0U2l0ZSgpLmdldFNlbGVjdGlvblByb3ZpZGVyKCk7Ci0JCQlzZWxlY3Rpb25Qcm92aWRlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIodGhpcyk7Ci0KLQkJCS8vIEZha2UgYSBzZWxlY3Rpb24gY2hhbmdlZCBldmVudCB0byB1cGRhdGUgdGhlIG1lbnVzLgotCQkJaWYgKHNlbGVjdGlvblByb3ZpZGVyLmdldFNlbGVjdGlvbigpICE9IG51bGwpIHsKLQkJCQlzZWxlY3Rpb25DaGFuZ2VkKG5ldyBTZWxlY3Rpb25DaGFuZ2VkRXZlbnQoc2VsZWN0aW9uUHJvdmlkZXIsCi0JCQkJCQlzZWxlY3Rpb25Qcm92aWRlci5nZXRTZWxlY3Rpb24oKSkpOwotCQkJfQotCQl9Ci0JfQotCQotCS8qKgotCSAqIFRoaXMgaW1wbGVtZW50cwotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXJ9LCBoYW5kbGluZwotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudH0gYnkgcXVlcnlpbmcgZm9yCi0JICogdGhlIGNoaWxkcmVuIGFuZCBzaWJsaW5ncyB0aGF0IGNhbiBiZSBhZGRlZCB0byB0aGUgc2VsZWN0ZWQgb2JqZWN0IGFuZAotCSAqIHVwZGF0aW5nIHRoZSBtZW51cyBhY2NvcmRpbmdseS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQkvLyBSZW1vdmUgYW55IG1lbnUgaXRlbXMgZm9yIG9sZCBzZWxlY3Rpb24uCi0JCWlmIChjcmVhdGVDaGlsZE1lbnVNYW5hZ2VyICE9IG51bGwpIHsKLQkJCWRlcG9wdWxhdGVNYW5hZ2VyKGNyZWF0ZUNoaWxkTWVudU1hbmFnZXIsIGNyZWF0ZUNoaWxkQWN0aW9ucyk7Ci0JCX0KLQkJaWYgKGNyZWF0ZVNpYmxpbmdNZW51TWFuYWdlciAhPSBudWxsKSB7Ci0JCQlkZXBvcHVsYXRlTWFuYWdlcihjcmVhdGVTaWJsaW5nTWVudU1hbmFnZXIsIGNyZWF0ZVNpYmxpbmdBY3Rpb25zKTsKLQkJfQotCi0JCS8vIFF1ZXJ5IHRoZSBuZXcgc2VsZWN0aW9uIGZvciBhcHByb3ByaWF0ZSBuZXcgY2hpbGQvc2libGluZwotCQkvLyBkZXNjcmlwdG9ycy4KLQkJQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzID0gbnVsbDsKLQkJQ29sbGVjdGlvbiBuZXdTaWJsaW5nRGVzY3JpcHRvcnMgPSBudWxsOwotCi0JCUlTZWxlY3Rpb24gc2VsZWN0aW9uID0gZXZlbnQuZ2V0U2VsZWN0aW9uKCk7Ci0JCWlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbgotCQkJCSYmICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbikuc2l6ZSgpID09IDEpIHsKLQkJCU9iamVjdCBvYmplY3QgPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb24pCi0JCQkJCS5nZXRGaXJzdEVsZW1lbnQoKTsKLQotCQkJRWRpdGluZ0RvbWFpbiBkb21haW4gPSAoKElFZGl0aW5nRG9tYWluUHJvdmlkZXIpIGFjdGl2ZUVkaXRvcikKLQkJCQkJLmdldEVkaXRpbmdEb21haW4oKTsKLQotCQkJbmV3Q2hpbGREZXNjcmlwdG9ycyA9IGRvbWFpbi5nZXROZXdDaGlsZERlc2NyaXB0b3JzKG9iamVjdCwgbnVsbCk7Ci0JCQluZXdTaWJsaW5nRGVzY3JpcHRvcnMgPSBkb21haW4uZ2V0TmV3Q2hpbGREZXNjcmlwdG9ycyhudWxsLCBvYmplY3QpOwotCQl9Ci0KLQkJLy8gR2VuZXJhdGUgYWN0aW9ucyBmb3Igc2VsZWN0aW9uOyBwb3B1bGF0ZSBhbmQgcmVkcmF3IHRoZSBtZW51cy4KLQkJY3JlYXRlQ2hpbGRBY3Rpb25zID0gZ2VuZXJhdGVDcmVhdGVDaGlsZEFjdGlvbnMobmV3Q2hpbGREZXNjcmlwdG9ycywKLQkJCQlzZWxlY3Rpb24pOwotCQljcmVhdGVTaWJsaW5nQWN0aW9ucyA9IGdlbmVyYXRlQ3JlYXRlU2libGluZ0FjdGlvbnMoCi0JCQkJbmV3U2libGluZ0Rlc2NyaXB0b3JzLCBzZWxlY3Rpb24pOwotCi0JCWlmIChjcmVhdGVDaGlsZE1lbnVNYW5hZ2VyICE9IG51bGwpIHsKLQkJCXBvcHVsYXRlTWFuYWdlcihjcmVhdGVDaGlsZE1lbnVNYW5hZ2VyLCBjcmVhdGVDaGlsZEFjdGlvbnMsIG51bGwpOwotCQkJY3JlYXRlQ2hpbGRNZW51TWFuYWdlci51cGRhdGUodHJ1ZSk7Ci0JCX0KLQkJaWYgKGNyZWF0ZVNpYmxpbmdNZW51TWFuYWdlciAhPSBudWxsKSB7Ci0JCQlwb3B1bGF0ZU1hbmFnZXIoY3JlYXRlU2libGluZ01lbnVNYW5hZ2VyLCBjcmVhdGVTaWJsaW5nQWN0aW9ucywKLQkJCQkJbnVsbCk7Ci0JCQljcmVhdGVTaWJsaW5nTWVudU1hbmFnZXIudXBkYXRlKHRydWUpOwotCQl9Ci0JCWlmICghKGFjdGl2ZUVkaXRvciBpbnN0YW5jZW9mIEZvcm1FZGl0b3IpKSB7Ci0JCQl1cGRhdGUoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFRoaXMgZ2VuZXJhdGVzIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5DcmVhdGVDaGlsZEFjdGlvbn0KLQkgKiBmb3IgZWFjaCBvYmplY3QgaW4gPGNvZGU+ZGVzY3JpcHRvcnM8L2NvZGU+LCBhbmQgcmV0dXJucyB0aGUKLQkgKiBjb2xsZWN0aW9uIG9mIHRoZXNlIGFjdGlvbnMuCi0JICovCi0JcHJvdGVjdGVkIENvbGxlY3Rpb24gZ2VuZXJhdGVDcmVhdGVDaGlsZEFjdGlvbnMoQ29sbGVjdGlvbiBkZXNjcmlwdG9ycywKLQkJCUlTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCUNvbGxlY3Rpb24gYWN0aW9ucyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJaWYgKGRlc2NyaXB0b3JzICE9IG51bGwpIHsKLQkJCWZvciAoSXRlcmF0b3IgaSA9IGRlc2NyaXB0b3JzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgewotCQkJCWFjdGlvbnMuYWRkKG5ldyBDcmVhdGVDaGlsZEFjdGlvbihhY3RpdmVFZGl0b3IsIHNlbGVjdGlvbiwKLQkJCQkJCWkubmV4dCgpKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGFjdGlvbnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBnZW5lcmF0ZXMgYQotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uQ3JlYXRlU2libGluZ0FjdGlvbn0gZm9yIGVhY2gKLQkgKiBvYmplY3QgaW4gPGNvZGU+ZGVzY3JpcHRvcnM8L2NvZGU+LCBhbmQgcmV0dXJucyB0aGUgY29sbGVjdGlvbiBvZgotCSAqIHRoZXNlIGFjdGlvbnMuCi0JICovCi0JcHJvdGVjdGVkIENvbGxlY3Rpb24gZ2VuZXJhdGVDcmVhdGVTaWJsaW5nQWN0aW9ucyhDb2xsZWN0aW9uIGRlc2NyaXB0b3JzLAotCQkJSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJQ29sbGVjdGlvbiBhY3Rpb25zID0gbmV3IEFycmF5TGlzdCgpOwotCQlpZiAoZGVzY3JpcHRvcnMgIT0gbnVsbCkgewotCQkJZm9yIChJdGVyYXRvciBpID0gZGVzY3JpcHRvcnMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQkJYWN0aW9ucy5hZGQobmV3IENyZWF0ZVNpYmxpbmdBY3Rpb24oYWN0aXZlRWRpdG9yLAotCQkJCQkJc2VsZWN0aW9uLCBpLm5leHQoKSkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBhY3Rpb25zOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcG9wdWxhdGVzIHRoZSBzcGVjaWZpZWQgPGNvZGU+bWFuYWdlcjwvY29kZT4gd2l0aAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uQ29udHJpYnV0aW9uSXRlbX1zIGJhc2VkIG9uIHRoZQotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbn1zIGNvbnRhaW5lZCBpbiB0aGUKLQkgKiA8Y29kZT5hY3Rpb25zPC9jb2RlPiBjb2xsZWN0aW9uLCBieSBpbnNlcnRpbmcgdGhlbSBiZWZvcmUgdGhlIHNwZWNpZmllZAotCSAqIGNvbnRyaWJ1dGlvbiBpdGVtIDxjb2RlPmNvbnRyaWJ1dGlvbklEPC9jb2RlPi4gSWYgPGNvZGU+SUQ8L2NvZGU+IGlzCi0JICogPGNvZGU+bnVsbDwvY29kZT4sIHRoZXkgYXJlIHNpbXBseSBhZGRlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwb3B1bGF0ZU1hbmFnZXIoSUNvbnRyaWJ1dGlvbk1hbmFnZXIgbWFuYWdlciwKLQkJCUNvbGxlY3Rpb24gYWN0aW9ucywgU3RyaW5nIGNvbnRyaWJ1dGlvbklEKSB7Ci0JCWlmIChhY3Rpb25zICE9IG51bGwpIHsKLQkJCWZvciAoSXRlcmF0b3IgaSA9IGFjdGlvbnMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQkJSUFjdGlvbiBhY3Rpb24gPSAoSUFjdGlvbikgaS5uZXh0KCk7Ci0JCQkJaWYgKGNvbnRyaWJ1dGlvbklEICE9IG51bGwpIHsKLQkJCQkJbWFuYWdlci5pbnNlcnRCZWZvcmUoY29udHJpYnV0aW9uSUQsIGFjdGlvbik7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJbWFuYWdlci5hZGQoYWN0aW9uKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJlbW92ZXMgZnJvbSB0aGUgc3BlY2lmaWVkIDxjb2RlPm1hbmFnZXI8L2NvZGU+IGFsbAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uQ29udHJpYnV0aW9uSXRlbX1zIGJhc2VkIG9uIHRoZQotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbn1zIGNvbnRhaW5lZCBpbiB0aGUKLQkgKiA8Y29kZT5hY3Rpb25zPC9jb2RlPiBjb2xsZWN0aW9uLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRlcG9wdWxhdGVNYW5hZ2VyKElDb250cmlidXRpb25NYW5hZ2VyIG1hbmFnZXIsCi0JCQlDb2xsZWN0aW9uIGFjdGlvbnMpIHsKLQkJaWYgKGFjdGlvbnMgIT0gbnVsbCkgewotCQkJSUNvbnRyaWJ1dGlvbkl0ZW1bXSBpdGVtcyA9IG1hbmFnZXIuZ2V0SXRlbXMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHsKLQkJCQkvLyBMb29rIGludG8gU3ViQ29udHJpYnV0aW9uSXRlbXMKLQkJCQlJQ29udHJpYnV0aW9uSXRlbSBjb250cmlidXRpb25JdGVtID0gaXRlbXNbaV07Ci0JCQkJd2hpbGUgKGNvbnRyaWJ1dGlvbkl0ZW0gaW5zdGFuY2VvZiBTdWJDb250cmlidXRpb25JdGVtKSB7Ci0JCQkJCWNvbnRyaWJ1dGlvbkl0ZW0gPSAoKFN1YkNvbnRyaWJ1dGlvbkl0ZW0pIGNvbnRyaWJ1dGlvbkl0ZW0pCi0JCQkJCQkJLmdldElubmVySXRlbSgpOwotCQkJCX0KLQotCQkJCS8vIERlbGV0ZSB0aGUgQWN0aW9uQ29udHJpYnV0aW9uSXRlbXMgd2l0aCBtYXRjaGluZyBhY3Rpb24uCi0JCQkJaWYgKGNvbnRyaWJ1dGlvbkl0ZW0gaW5zdGFuY2VvZiBBY3Rpb25Db250cmlidXRpb25JdGVtKSB7Ci0JCQkJCUlBY3Rpb24gYWN0aW9uID0gKChBY3Rpb25Db250cmlidXRpb25JdGVtKSBjb250cmlidXRpb25JdGVtKQotCQkJCQkJCS5nZXRBY3Rpb24oKTsKLQkJCQkJaWYgKGFjdGlvbnMuY29udGFpbnMoYWN0aW9uKSkgewotCQkJCQkJbWFuYWdlci5yZW1vdmUoY29udHJpYnV0aW9uSXRlbSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHBvcHVsYXRlcyB0aGUgcG9wLXVwIG1lbnUgYmVmb3JlIGl0IGFwcGVhcnMuCi0JICovCi0JcHVibGljIHZvaWQgbWVudUFib3V0VG9TaG93KElNZW51TWFuYWdlciBtZW51TWFuYWdlcikgewotCQkvLyBBZGQgb3VyIHN0YW5kYXJkIG1hcmtlci4KLQkJbWVudU1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoImFkZGl0aW9ucyIpKTsgLy8kTk9OLU5MUy0xJAotCQltZW51TWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcigiZWRpdCIpKTsgLy8kTk9OLU5MUy0xJAotCi0JCS8vIEFkZCB0aGUgZWRpdCBtZW51IGFjdGlvbnMuCi0JCW1lbnVNYW5hZ2VyLmFkZChuZXcgQWN0aW9uQ29udHJpYnV0aW9uSXRlbSh1bmRvQWN0aW9uKSk7Ci0JCW1lbnVNYW5hZ2VyLmFkZChuZXcgQWN0aW9uQ29udHJpYnV0aW9uSXRlbShyZWRvQWN0aW9uKSk7Ci0JCW1lbnVNYW5hZ2VyLmFkZChuZXcgU2VwYXJhdG9yKCkpOwotCQkvLyBtZW51TWFuYWdlci5hZGQobmV3IEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0oY3V0QWN0aW9uKSk7Ci0JCW1lbnVNYW5hZ2VyLmFkZChuZXcgQWN0aW9uQ29udHJpYnV0aW9uSXRlbShjb3B5QWN0aW9uKSk7Ci0JCW1lbnVNYW5hZ2VyLmFkZChuZXcgQWN0aW9uQ29udHJpYnV0aW9uSXRlbShwYXN0ZUFjdGlvbikpOwotCQltZW51TWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcigpKTsKLQkJbWVudU1hbmFnZXIuYWRkKG5ldyBBY3Rpb25Db250cmlidXRpb25JdGVtKGRlbGV0ZUFjdGlvbikpOwotCQltZW51TWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcigpKTsKLQotCQkvLyBBZGQgb3VyIG90aGVyIHN0YW5kYXJkIG1hcmtlci4KLQkJbWVudU1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoImFkZGl0aW9ucy1lbmQiKSk7IC8vJE5PTi1OTFMtMSQKLQotCQlhZGRHbG9iYWxBY3Rpb25zKG1lbnVNYW5hZ2VyKTsKLQotCQlpZiAoZW5hYmxlZCkgewotCQkJTWVudU1hbmFnZXIgc3VibWVudU1hbmFnZXIgPSBudWxsOwotCQkJc3VibWVudU1hbmFnZXIgPSBuZXcgTWVudU1hbmFnZXIoCi0JCQkJCWdldFN0cmluZygiX1VJX0NyZWF0ZUNoaWxkX21lbnVfaXRlbSIpKTsgLy8kTk9OLU5MUy0xJAotCQkJcG9wdWxhdGVNYW5hZ2VyKHN1Ym1lbnVNYW5hZ2VyLCBjcmVhdGVDaGlsZEFjdGlvbnMsIG51bGwpOwotCQkJbWVudU1hbmFnZXIuaW5zZXJ0QmVmb3JlKCJhZGRpdGlvbnMiLCBzdWJtZW51TWFuYWdlcik7IC8vJE5PTi1OTFMtMSQKLQotCQkJc3VibWVudU1hbmFnZXIgPSBuZXcgTWVudU1hbmFnZXIoCi0JCQkJCWdldFN0cmluZygiX1VJX0NyZWF0ZVNpYmxpbmdfbWVudV9pdGVtIikpOyAvLyROT04tTkxTLTEkCi0JCQlwb3B1bGF0ZU1hbmFnZXIoc3VibWVudU1hbmFnZXIsIGNyZWF0ZVNpYmxpbmdBY3Rpb25zLCBudWxsKTsKLQkJCW1lbnVNYW5hZ2VyLmluc2VydEJlZm9yZSgiYWRkaXRpb25zIiwgc3VibWVudU1hbmFnZXIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGluc2VydHMgZ2xvYmFsIGFjdGlvbnMgYmVmb3JlIHRoZSAiYWRkaXRpb25zLWVuZCIgc2VwYXJhdG9yLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEdsb2JhbEFjdGlvbnMoSU1lbnVNYW5hZ2VyIG1lbnVNYW5hZ2VyKSB7Ci0JCW1lbnVNYW5hZ2VyLmluc2VydEFmdGVyKCJhZGRpdGlvbnMtZW5kIiwgbmV3IFNlcGFyYXRvcigidWktYWN0aW9ucyIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCW1lbnVNYW5hZ2VyLmluc2VydEFmdGVyKCJ1aS1hY3Rpb25zIiwgc2hvd1Byb3BlcnRpZXNWaWV3QWN0aW9uKTsgLy8kTk9OLU5MUy0xJAotCi0JCXJlZnJlc2hWaWV3ZXJBY3Rpb24uc2V0RW5hYmxlZChyZWZyZXNoVmlld2VyQWN0aW9uLmlzRW5hYmxlZCgpKTsKLQkJbWVudU1hbmFnZXIuaW5zZXJ0QWZ0ZXIoInVpLWFjdGlvbnMiLCByZWZyZXNoVmlld2VyQWN0aW9uKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkgICAgU3RyaW5nIGtleSA9IChzdHlsZSAmIEFERElUSU9OU19MQVNUX1NUWUxFKSA9PSAwID8gImFkZGl0aW9ucy1lbmQiIDogImFkZGl0aW9ucyI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCSAgICBpZiAodmFsaWRhdGVBY3Rpb24gIT0gbnVsbCkKLQkgICAgewotCSAgICAgIG1lbnVNYW5hZ2VyLmluc2VydEJlZm9yZShrZXksIG5ldyBBY3Rpb25Db250cmlidXRpb25JdGVtKHZhbGlkYXRlQWN0aW9uKSk7Ci0JICAgIH0KLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5KSB7Ci0JCXJldHVybiBBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0U3RyaW5nKGtleSk7Ci0JfQotCi0JLyoqCi0JICogUmVmcmVzaCB0aGUgdmlld2VyCi0JICoKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkb1JlZnJlc2goKSB7Ci0JCWlmIChhY3RpdmVFZGl0b3IgaW5zdGFuY2VvZiBJVmlld2VyUHJvdmlkZXIpIHsKLQkJCVZpZXdlciB2aWV3ZXIgPSAoKElWaWV3ZXJQcm92aWRlcikgYWN0aXZlRWRpdG9yKS5nZXRWaWV3ZXIoKTsKLQkJCWlmICh2aWV3ZXIgIT0gbnVsbCkgewotCQkJCXZpZXdlci5yZWZyZXNoKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiByZW1vdmVBbGxSZWZlcmVuY2VzT25EZWxldGUoKQotCXsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBhY3RpdmF0ZSgpIHsKLQkJLy8gZml4IGFjdGlvbnMgLS0gaWYgbmV3IHBhZ2UgaXMgYW4gSUZvcm1QYWdlLCB3ZSBkb24ndCB3YW50IEVNRiBhY3Rpb25zCi0JCWlmIChhY3RpdmVFZGl0b3IgIT0gbnVsbCkgewotCQkJSUFjdGlvbkJhcnMgYWN0aW9uQmFycyA9IGFjdGl2ZUVkaXRvci5nZXRFZGl0b3JTaXRlKCkKLQkJCQkuZ2V0QWN0aW9uQmFycygpOwotCQkJaWYgKGFjdGl2ZUVkaXRvciBpbnN0YW5jZW9mIEZvcm1FZGl0b3IpIHsKLQkJCQlJRm9ybVBhZ2UgcGFnZSA9ICgoRm9ybUVkaXRvcilhY3RpdmVFZGl0b3IpLmdldEFjdGl2ZVBhZ2VJbnN0YW5jZSgpOyAKLQkJCQlpZiAocGFnZSBpbnN0YW5jZW9mIElGb3JtUGFnZSkgewkJCQotCQkJCQlhY3Rpb25CYXJzLnNldEdsb2JhbEFjdGlvbkhhbmRsZXIoQWN0aW9uRmFjdG9yeS5ERUxFVEUuZ2V0SWQoKSwKLQkJCQkJCQludWxsKTsKLQkJCQkJYWN0aW9uQmFycy5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKEFjdGlvbkZhY3RvcnkuQ1VULmdldElkKCksCi0JCQkJCQkJbnVsbCk7Ci0JCQkJCWFjdGlvbkJhcnMuc2V0R2xvYmFsQWN0aW9uSGFuZGxlcihBY3Rpb25GYWN0b3J5LkNPUFkuZ2V0SWQoKSwKLQkJCQkJCQludWxsKTsKLQkJCQkJYWN0aW9uQmFycy5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKEFjdGlvbkZhY3RvcnkuUEFTVEUuZ2V0SWQoKSwKLQkJCQkJCQludWxsKTsKLQkJCQkJYWN0aW9uQmFycy5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKEFjdGlvbkZhY3RvcnkuVU5ETy5nZXRJZCgpLAotCQkJCQkJCW51bGwpOwotCQkJCQlhY3Rpb25CYXJzLnNldEdsb2JhbEFjdGlvbkhhbmRsZXIoQWN0aW9uRmFjdG9yeS5SRURPLmdldElkKCksCi0JCQkJCQkJbnVsbCk7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlhY3Rpb25CYXJzLnNldEdsb2JhbEFjdGlvbkhhbmRsZXIoQWN0aW9uRmFjdG9yeS5ERUxFVEUuZ2V0SWQoKSwKLQkJCQkJCWRlbGV0ZUFjdGlvbik7Ci0JCQkJYWN0aW9uQmFycy5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKEFjdGlvbkZhY3RvcnkuQ1VULmdldElkKCksCi0JCQkJCQljdXRBY3Rpb24pOwotCQkJCWFjdGlvbkJhcnMuc2V0R2xvYmFsQWN0aW9uSGFuZGxlcihBY3Rpb25GYWN0b3J5LkNPUFkuZ2V0SWQoKSwKLQkJCQkJCWNvcHlBY3Rpb24pOwotCQkJCWFjdGlvbkJhcnMuc2V0R2xvYmFsQWN0aW9uSGFuZGxlcihBY3Rpb25GYWN0b3J5LlBBU1RFLmdldElkKCksCi0JCQkJCQlwYXN0ZUFjdGlvbik7Ci0JCQkJYWN0aW9uQmFycy5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKEFjdGlvbkZhY3RvcnkuVU5ETy5nZXRJZCgpLAotCQkJCQkJdW5kb0FjdGlvbik7Ci0JCQkJYWN0aW9uQmFycy5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKEFjdGlvbkZhY3RvcnkuUkVETy5nZXRJZCgpLAotCQkJCQkJcmVkb0FjdGlvbik7Ci0JCQl9Ci0JCQlhY3Rpb25CYXJzLnVwZGF0ZUFjdGlvbkJhcnMoKTsKLQkJfQotCQlzdXBlci5hY3RpdmF0ZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9Nb3ZlRG93bkFjdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL01vdmVEb3duQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiYWEwZGUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL01vdmVEb3duQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5JQlNJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQuTW92ZURvd25Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci0KLS8qKgotICogTW92ZXMgdXAgYnJlYWtkb3duIGVsZW1lbnQgaW4gYSBwcm9jZXNzIHRyZWUuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgIDEuMgotICovCi1wdWJsaWMgY2xhc3MgTW92ZURvd25BY3Rpb24gZXh0ZW5kcyBBYnN0cmFjdE1vdmVBY3Rpb24gewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExBQkVMID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuUHJvY2Vzc0VkaXRvcl9BY3Rpb25fTW92ZURvd247Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIElNR19ERVNDID0gQXV0aG9yaW5nVUlQbHVnaW4KLQkJCS5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKCJmdWxsL2V0b29sMTYvbW92ZV9kb3duLmdpZiIpOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIERJU0FCTEVEX0lNR19ERVNDID0gQXV0aG9yaW5nVUlQbHVnaW4KLQkJCS5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKAotCQkJCQkiZnVsbC9ldG9vbDE2L21vdmVfZG93bl9kaXNhYmxlZC5naWYiKTsgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2UKLQkgKgotCSAqLwotCXB1YmxpYyBNb3ZlRG93bkFjdGlvbigpIHsKLQkJc3VwZXIoTEFCRUwpOwotCQlzZXRJbWFnZURlc2NyaXB0b3IoSU1HX0RFU0MpOwotCQlzZXREaXNhYmxlZEltYWdlRGVzY3JpcHRvcihESVNBQkxFRF9JTUdfREVTQyk7Ci0JCXNldFRvb2xUaXBUZXh0KExBQkVMKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQ29tbWFuZCBjcmVhdGVNb3ZlQ29tbWFuZChBY3Rpdml0eSBhY3QsIE9iamVjdCBlbGVtZW50LAotCQkJQ29sbGVjdGlvbjxFQ2xhc3M+IGNsYXNzZXMpIHsKLQkJcmV0dXJuIG5ldyBNb3ZlRG93bkNvbW1hbmQoYWN0LCBlbGVtZW50LCBjbGFzc2VzKTsKLQl9CQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBib29sZWFuIGFjY2VwdChJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsJCQotCQlpZihzdXBlci5hY2NlcHQoc2VsZWN0aW9uKSkgewotCQkJT2JqZWN0IGVsZW1lbnQgPSBzZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCQlJQlNJdGVtUHJvdmlkZXIgaXAgPSBnZXRJdGVtUHJvdmlkZXIoZWxlbWVudCk7Ci0JCQlpZihpcCAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuICFpcC5pc0xhc3RFbGVtZW50KGVsZW1lbnQpOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvTW92ZVVwQWN0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvTW92ZVVwQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1OTYxMTAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL01vdmVVcEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuSUJTSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kLk1vdmVVcENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLQotLyoqCi0gKiBNb3ZlcyB1cCBicmVha2Rvd24gZWxlbWVudCBpbiBhIHByb2Nlc3MgdHJlZS4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAgMS4yCi0gKi8KLXB1YmxpYyBjbGFzcyBNb3ZlVXBBY3Rpb24gZXh0ZW5kcyBBYnN0cmFjdE1vdmVBY3Rpb24gewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExBQkVMID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuUHJvY2Vzc0VkaXRvcl9BY3Rpb25fTW92ZVVwOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBJTUdfREVTQyA9IEF1dGhvcmluZ1VJUGx1Z2luCi0JCQkuZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcigiZnVsbC9ldG9vbDE2L21vdmVfdXAuZ2lmIik7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgRElTQUJMRURfSU1HX0RFU0MgPSBBdXRob3JpbmdVSVBsdWdpbgotCQkJLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoImZ1bGwvZXRvb2wxNi9tb3ZlX3VwX2Rpc2FibGVkLmdpZiIpOyAvLyROT04tTkxTLTEkIAotCQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2UKLQkgKgotCSAqLwotCXB1YmxpYyBNb3ZlVXBBY3Rpb24oKSB7Ci0JCXN1cGVyKExBQkVMKTsKLQkJc2V0SW1hZ2VEZXNjcmlwdG9yKElNR19ERVNDKTsKLQkJc2V0RGlzYWJsZWRJbWFnZURlc2NyaXB0b3IoRElTQUJMRURfSU1HX0RFU0MpOwotCQlzZXRUb29sVGlwVGV4dChMQUJFTCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIENvbW1hbmQgY3JlYXRlTW92ZUNvbW1hbmQoQWN0aXZpdHkgYWN0LCBPYmplY3QgZWxlbWVudCwKLQkJCUNvbGxlY3Rpb248RUNsYXNzPiBjbGFzc2VzKSB7Ci0JCXJldHVybiBuZXcgTW92ZVVwQ29tbWFuZChhY3QsIGVsZW1lbnQsIGNsYXNzZXMpOwotCX0JCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0KElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewkJCi0JCWlmKHN1cGVyLmFjY2VwdChzZWxlY3Rpb24pKSB7Ci0JCQlPYmplY3QgZWxlbWVudCA9IHNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCUlCU0l0ZW1Qcm92aWRlciBpcCA9IGdldEl0ZW1Qcm92aWRlcihlbGVtZW50KTsKLQkJCWlmKGlwICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gIWlwLmlzRmlyc3RFbGVtZW50KGVsZW1lbnQpOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvTXVsdGlBY3Rpb25Hcm91cC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL011bHRpQWN0aW9uR3JvdXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODgwZGFkYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvTXVsdGlBY3Rpb25Hcm91cC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkNvbnRyaWJ1dGlvbkl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uU2VwYXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLk1lbnU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTWVudUl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5BY3Rpb25Hcm91cDsKLQotLyoqCi0gKiBBIE11bHRpQWN0aW9uR3JvdXAgd2lsbCBkaXNwbGF5IGEgbGlzdCBvZiBJQWN0aW9ucyBpbiBhIG1lbnUgYnkgdHJhbnNmb3JtaW5nIHRoZW0KLSAqIGludG8gTWVudUl0ZW1zLiBUaGUgbGlzdCBvZiBsYWJlbHMgZ2l2ZW4gd2lsbCBiZSB3aGF0IGlzIGRpc3BsYXllZCBpbiB0aGUgVmlld01lbnUgZm9yIAotICogdGhlIGNvcnJlc3BvbmRpbmcgYWN0aW9uICh0aGUgYWN0aW9uIGF0IHRoZSBzYW1lIHBvc2l0aW9uIGluIHRoZSBhY3Rpb24gYXJyYXkpLgotICogVGhlIGFjdGlvbnMgYXJlIGN1cnJlbnRseSBpbXBsZW1lbnRlZCBhcyBzdGF0ZSBiYXNlZAotICogc28gdGhhdCBhZnRlciBhbiBhY3Rpb24gaXMgZXhlY3V0ZWQgdGhlIGxhYmVsIHdpbGwgaGF2ZSBhIHNlbGVjdGlvbiBjaGVjay4KLSAqIAotICogQ29kZSB0YWtlbiBmcm9tIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC51aS5hY3Rpb25zLk11bHRpQWN0aW9uR3JvdXAuY2xhc3MKLSAqLwotcHVibGljIGNsYXNzIE11bHRpQWN0aW9uR3JvdXAgZXh0ZW5kcyBBY3Rpb25Hcm91cCB7Ci0JCi0JcHVibGljIElBY3Rpb25bXSBOT19BQ1RJT05TID0gbmV3IElBY3Rpb25bMF07Ci0JCi0JcHJpdmF0ZSBJQWN0aW9uW10gZkFjdGlvbnM7IAotCQotCXByaXZhdGUgaW50IGZDdXJyZW50U2VsZWN0aW9uOwotCXByaXZhdGUgTWVudUl0ZW1bXSBmSXRlbXM7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFjdGlvbiBncm91cCB3aXRoIGEgZ2l2ZW4gc2V0IG9mIGFjdGlvbnMuCi0JICogCi0JICogQHBhcmFtIGFjdGlvbnMJCQl0aGUgYWN0aW9ucyBmb3IgdGhpcyBtdWx0aSBncm91cAotCSAqIEBwYXJhbSBjdXJyZW50U2VsZWN0aW9uCWRlY2lkZXMgd2hpY2ggYWN0aW9uIGlzIHNlbGVjdGVkIGluIHRoZSBtZW51IG9uIHN0YXJ0IHVwLgotCSAqIAkJCQkJCQlEZW5vdGVzIHRoZSBsb2NhdGlvbiBpbiB0aGUgYWN0aW9ucyBhcnJheSBvZiB0aGUgY3VycmVudAotCSAqIAkJCQkJCQlzZWxlY3RlZCBzdGF0ZS4gSXQgY2Fubm90IGJlIG51bGwuCi0JICovCi0JcHVibGljIE11bHRpQWN0aW9uR3JvdXAoSUFjdGlvbltdIGFjdGlvbnMsIGludCBjdXJyZW50U2VsZWN0aW9uKSB7Ci0JCXN1cGVyKCk7Ci0JCXNldEFjdGlvbnMoYWN0aW9ucywgY3VycmVudFNlbGVjdGlvbik7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWN0aW9uIGdyb3VwLiBDbGllbnRzIHVzaW5nIHRoaXMgY29uc3RydWN0b3IgbXVzdCBzZXQgdGhlIGFjdGlvbnMKLQkgKiBpbW1lZGlhdGVseSBhZnRlciBjcmVhdGluZyB0aGUgbXVsdGkgYWN0aW9uIGdyb3VwIGJ5IGNhbGxpbmcge0BsaW5rICNzZXRBY3Rpb25zKElBY3Rpb25bXSwgaW50KX0uCi0JICovCi0JcHJvdGVjdGVkIE11bHRpQWN0aW9uR3JvdXAoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCS8qKgotCSAqIFNldHMgdGhlIGdpdmVuIGFjdGlvbnMuCi0JICogCi0JICogQHBhcmFtIGFjdGlvbnMJCQl0aGUgYWN0aW9ucyBmb3IgdGhpcyBtdWx0aSBncm91cCwgYXQgbGVhc3Qgb25lCi0JICogQHBhcmFtIGN1cnJlbnRTZWxlY3Rpb24JZGVjaWRlcyB3aGljaCBhY3Rpb24gaXMgc2VsZWN0ZWQgaW4gdGhlIG1lbnUgb24gc3RhcnQgdXAuCi0JICogCQkJCQkJCURlbm90ZXMgdGhlIGxvY2F0aW9uIGluIHRoZSBhY3Rpb25zIGFycmF5IG9mIHRoZSBjdXJyZW50Ci0JICogCQkJCQkJCXNlbGVjdGVkIHN0YXRlLiBJdCBjYW5ub3QgYmUgbnVsbC4KLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBzZXRBY3Rpb25zKElBY3Rpb25bXSBhY3Rpb25zLCBpbnQgY3VycmVudFNlbGVjdGlvbikgewotCQlmQ3VycmVudFNlbGVjdGlvbj0gY3VycmVudFNlbGVjdGlvbjsKLQkJZkFjdGlvbnMgPSBhY3Rpb25zOwotCX0KLQotCS8qKgotCSAqIEFkZHMgdGhlIGFjdGlvbnMgdG8gdGhlIGdpdmVuIG1lbnUgbWFuYWdlci4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRBY3Rpb25zKElNZW51TWFuYWdlciB2aWV3TWVudSkgewotCi0JCXZpZXdNZW51LmFkZChuZXcgU2VwYXJhdG9yKCkpOwotCQlmSXRlbXM9IG5ldyBNZW51SXRlbVtmQWN0aW9ucy5sZW5ndGhdOwotCi0JCWZvciAoaW50IGk9IDA7IGkgPCBmQWN0aW9ucy5sZW5ndGg7IGkrKykgewotCQkJZmluYWwgaW50IGo9IGk7Ci0KLQkJCXZpZXdNZW51LmFkZChuZXcgQ29udHJpYnV0aW9uSXRlbSgpIHsKLQotCQkJCXB1YmxpYyB2b2lkIGZpbGwoTWVudSBtZW51LCBpbnQgaW5kZXgpIHsKLQkJCQkJCi0JCQkJCWludCBzdHlsZT0gU1dULkNIRUNLOwotCQkJCQlpZiAoKGZBY3Rpb25zW2pdLmdldFN0eWxlKCkgJiBJQWN0aW9uLkFTX1JBRElPX0JVVFRPTikgIT0gMCkKLQkJCQkJCXN0eWxlPSBTV1QuUkFESU87Ci0JCQkJCQotCQkJCQlNZW51SXRlbSBtaT0gbmV3IE1lbnVJdGVtKG1lbnUsIHN0eWxlLCBpbmRleCk7Ci0JCQkJCUltYWdlRGVzY3JpcHRvciBkPSBmQWN0aW9uc1tqXS5nZXRJbWFnZURlc2NyaXB0b3IoKTsKLQkJCQkJbWkuc2V0SW1hZ2UoQXV0aG9yaW5nVUlQbHVnaW4uZ2V0SW1hZ2VEZXNjcmlwdG9yUmVnaXN0cnkoKS5nZXQoZCkpOwotCQkJCQlmSXRlbXNbal09IG1pOwotCQkJCQltaS5zZXRUZXh0KGZBY3Rpb25zW2pdLmdldFRleHQoKSk7Ci0JCQkJCW1pLnNldFNlbGVjdGlvbihmQ3VycmVudFNlbGVjdGlvbiA9PSBqKTsKLQkJCQkJbWkuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0KLQkJCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJCQlpZiAoZkN1cnJlbnRTZWxlY3Rpb24gPT0gaikgewotCQkJCQkJCQlmSXRlbXNbZkN1cnJlbnRTZWxlY3Rpb25dLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJCQkJCQkJcmV0dXJuOwotCQkJCQkJCX0KLQkJCQkJCQlmQWN0aW9uc1tqXS5ydW4oKTsKLQotCQkJCQkJCS8vIFVwZGF0ZSBjaGVja2VkIHN0YXRlCi0JCQkJCQkJZkl0ZW1zW2ZDdXJyZW50U2VsZWN0aW9uXS5zZXRTZWxlY3Rpb24oZmFsc2UpOwotCQkJCQkJCWZDdXJyZW50U2VsZWN0aW9uPSBqOwotCQkJCQkJCWZJdGVtc1tmQ3VycmVudFNlbGVjdGlvbl0uc2V0U2VsZWN0aW9uKHRydWUpOwotCQkJCQkJfQotCi0JCQkJCX0pOwotCQkJCX0KLQkJCQlwdWJsaWMgYm9vbGVhbiBpc0R5bmFtaWMoKSB7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQl9KTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9OZXdDb25maWd1cmF0aW9uQWN0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvTmV3Q29uZmlndXJhdGlvbkFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYTZlNDM5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9OZXdDb25maWd1cmF0aW9uQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkud2l6YXJkcy5OZXdDb25maWd1cmF0aW9uV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZERpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93QWN0aW9uRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLQotLyoqCi0gKiBEaXNwbGF5cyB0aGUgTmV3IE1ldGhvZCBDb25maWd1cmF0aW9uIHdpemFyZC4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4yCi0gKi8KLXB1YmxpYyBjbGFzcyBOZXdDb25maWd1cmF0aW9uQWN0aW9uIGV4dGVuZHMgQWN0aW9uIGltcGxlbWVudHMKLQkJSVdvcmtiZW5jaFdpbmRvd0FjdGlvbkRlbGVnYXRlIHsKLQotCS8vIFRoZSBjdXJyZW50IHdvcmtiZW5jaCB3aW5kb3cuCi0JcHJpdmF0ZSBJV29ya2JlbmNoV2luZG93IHdpbmRvdzsKLQotCS8vIFRoZSBjdXJyZW50IHNlbGVjdGlvbiBvYmplY3QuCi0JcHJpdmF0ZSBJU2VsZWN0aW9uIHNlbGVjdGlvbjsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIE5ld0NvbmZpZ3VyYXRpb25BY3Rpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgTmV3Q29uZmlndXJhdGlvbkFjdGlvbihTdHJpbmcgdGV4dCkgewotCQlzdXBlcih0ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3dBY3Rpb25EZWxlZ2F0ZSNpbml0KElXb3JrYmVuY2hXaW5kb3cpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoV2luZG93IHdpbmRvdykgewotCQl0aGlzLndpbmRvdyA9IHdpbmRvdzsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElXb3JrYmVuY2hXaW5kb3dBY3Rpb25EZWxlZ2F0ZSNzZWxlY3Rpb25DaGFuZ2VkKElBY3Rpb24sIElTZWxlY3Rpb24pCi0JICovCi0JcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChJQWN0aW9uIGFjdGlvbiwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJdGhpcy5zZWxlY3Rpb24gPSBzZWxlY3Rpb247Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JQWN0aW9uRGVsZWdhdGUjcnVuKElBY3Rpb24pCi0JICovCi0JcHVibGljIHZvaWQgcnVuKElBY3Rpb24gYWN0aW9uKSB7Ci0JCXJ1bigpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbiNydW4oKQotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJSVdvcmtiZW5jaCB3b3JrYmVuY2ggPSBudWxsOwotCQlpZiAod2luZG93ICE9IG51bGwpIHsKLQkJCXdvcmtiZW5jaCA9IHdpbmRvdy5nZXRXb3JrYmVuY2goKTsKLQkJfQotCQlpZiAod29ya2JlbmNoID09IG51bGwpIHsKLQkJCXdvcmtiZW5jaCA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCk7Ci0JCX0KLQotCQl0cnkgewotCQkJTmV3Q29uZmlndXJhdGlvbldpemFyZCB3aXphcmQgPSBuZXcgTmV3Q29uZmlndXJhdGlvbldpemFyZCgpOwotCQkJaWYgKHNlbGVjdGlvbiAhPSBudWxsICYmIHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7Ci0JCQkJd2l6YXJkLmluaXQod29ya2JlbmNoLCAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbik7Ci0JCQl9IGVsc2UgewotCQkJCXdpemFyZC5pbml0KHdvcmtiZW5jaCwgbnVsbCk7Ci0JCQl9Ci0JCQlXaXphcmREaWFsb2cgZGlhbG9nID0gbmV3IFdpemFyZERpYWxvZyhEaXNwbGF5LmdldEN1cnJlbnQoKQotCQkJCQkuZ2V0QWN0aXZlU2hlbGwoKSwgd2l6YXJkKTsKLQkJCWRpYWxvZy5jcmVhdGUoKTsKLQkJCWRpYWxvZy5vcGVuKCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkuZGlzcGxheUVycm9yKAotCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5uZXdDb25maWd1cmF0aW9uV2l6YXJkX3RpdGxlLAotCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5vcGVuQ29uZmlnV2l6YXJkRXJyb3JfbXNnLAotCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5pbnRlcm5hbEVycm9yX3JlYXNvbiwgIiIsIGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3dBY3Rpb25EZWxlZ2F0ZSNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9OZXdQbHVnaW5BY3Rpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9OZXdQbHVnaW5BY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmU1Njc5Yi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvTmV3UGx1Z2luQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nUGVyc3BlY3RpdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuUGVyc3BlY3RpdmVMaXN0VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLndpemFyZHMuTmV3UGx1Z2luV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udWkudXRpbC5QZXJzcGVjdGl2ZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51aS5Vc2VySW50ZXJhY3Rpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuYWN0aW9ucy5MaWJyYXJ5TG9ja2luZ09wZXJhdGlvblJ1bm5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uSVJ1bm5hYmxlV2l0aFByb2dyZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmREaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvd0FjdGlvbkRlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci0KLS8qKgotICogRGlzcGxheXMgdGhlIE5ldyBNZXRob2QgUGx1Zy1pbiB3aXphcmQgYW5kIGNyZWF0ZXMgYSBuZXcgcGx1Zy1pbiB3aGVuIHRoZQotICogdXNlciBzZWxlY3RzIHRoZSBGaW5pc2ggYnV0dG9uLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBOZXdQbHVnaW5BY3Rpb24gZXh0ZW5kcyBBY3Rpb24gaW1wbGVtZW50cwotCQlJV29ya2JlbmNoV2luZG93QWN0aW9uRGVsZWdhdGUgewotCi0JLy8gVGhlIGNhY2hlZCB3aW5kb3cgb2JqZWN0LgotCXByaXZhdGUgSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3c7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBOZXdQbHVnaW5BY3Rpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgTmV3UGx1Z2luQWN0aW9uKFN0cmluZyB0ZXh0KSB7Ci0JCXN1cGVyKHRleHQpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvd0FjdGlvbkRlbGVnYXRlI2luaXQoSVdvcmtiZW5jaFdpbmRvdykKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2hXaW5kb3cgd2luZG93KSB7Ci0JCXRoaXMud2luZG93ID0gd2luZG93OwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkRlbGVnYXRlI3J1bihJQWN0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bihJQWN0aW9uIGFjdGlvbikgewotCQlydW4oKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb24jcnVuKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCU1ldGhvZExpYnJhcnkgdGFyZ2V0TGliID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKQotCQkJCS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpOwotCQlpZiAodGFyZ2V0TGliID09IG51bGwpIHsKLQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKS5kaXNwbGF5RXJyb3IoCi0JCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLm5ld1BsdWdpbldpemFyZF90aXRsZSwgCi0JCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLm5vT3BlbkxpYnJhcnlFcnJvcl9tc2cpOyAKLQkJCXJldHVybjsKLQkJfQotCi0JCVNoZWxsIHNoZWxsID0gRGlzcGxheS5nZXRDdXJyZW50KCkuZ2V0QWN0aXZlU2hlbGwoKTsKLQkJSVN0YXR1cyBzdGF0dXMgPSBVc2VySW50ZXJhY3Rpb25IZWxwZXIuY2hlY2tNb2RpZnkodGFyZ2V0TGliLCBzaGVsbCk7Ci0JCWlmICghc3RhdHVzLmlzT0soKSkgewotCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpLmRpc3BsYXkoCi0JCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLm5ld1BsdWdpbldpemFyZF90aXRsZSwgCi0JCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLm5ld1BsdWdpbldpemFyZF9jcmVhdGVFcnJvciwgCi0JCQkJCXN0YXR1cyk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlmaW5hbCBJV29ya2JlbmNoIHdvcmtiZW5jaCA9IHdpbmRvdyAhPSBudWxsID8gKHdpbmRvdy5nZXRXb3JrYmVuY2goKSA9PSBudWxsID8gUGxhdGZvcm1VSQotCQkJCS5nZXRXb3JrYmVuY2goKQotCQkJCTogd2luZG93LmdldFdvcmtiZW5jaCgpKQotCQkJCTogUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKTsKLQkJTGlicmFyeUxvY2tpbmdPcGVyYXRpb25SdW5uZXIgcnVubmVyID0gbmV3IExpYnJhcnlMb2NraW5nT3BlcmF0aW9uUnVubmVyKCk7Ci0JCXJ1bm5lci5ydW4obmV3IElSdW5uYWJsZVdpdGhQcm9ncmVzcygpIHsKLQotCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLQkJCQkJdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJCQlleGVjdXRlKHdvcmtiZW5jaCwgbnVsbCk7Ci0JCQl9Ci0KLQkJfSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJV29ya2JlbmNoV2luZG93QWN0aW9uRGVsZWdhdGUjc2VsZWN0aW9uQ2hhbmdlZChJQWN0aW9uLCBJU2VsZWN0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoSUFjdGlvbiBhY3Rpb24sIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93QWN0aW9uRGVsZWdhdGUjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQl9Ci0KLQkvKioKLQkgKiBFeGVjdXRlcyB0aGUgYWN0aW9uLgotCSAqIAotCSAqIEBwYXJhbSB3b3JrYmVuY2gKLQkgKiAgICAgICAgICAgIFRoZSBhY3RpdmUgd29ya2JlbmNoLgotCSAqIEBwYXJhbSBzZWxlY3Rpb24KLQkgKiAgICAgICAgICAgIFRoZSBhY3RpdmUgc2VsZWN0aW9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBleGVjdXRlKElXb3JrYmVuY2ggd29ya2JlbmNoLCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlOZXdQbHVnaW5XaXphcmQgd2l6YXJkID0gbmV3IE5ld1BsdWdpbldpemFyZCgpOwotCi0JCWlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbiB8fCBzZWxlY3Rpb24gPT0gbnVsbCkgewotCQkJd2l6YXJkLmluaXQod29ya2JlbmNoLCAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbik7Ci0JCX0KLQotCQlXaXphcmREaWFsb2cgZGlhbG9nID0gbmV3IFdpemFyZERpYWxvZyhEaXNwbGF5LmdldEN1cnJlbnQoKQotCQkJCS5nZXRBY3RpdmVTaGVsbCgpLCB3aXphcmQpOwotCQlkaWFsb2cuY3JlYXRlKCk7Ci0JCWRpYWxvZy5vcGVuKCk7Ci0KLQkJaWYgKCFQZXJzcGVjdGl2ZUxpc3RVdGlsLmlzQXV0aG9yaW5nUGVyc3BlY3RpdmUoKSkgewotCQkJUGVyc3BlY3RpdmVVdGlsCi0JCQkJCS5vcGVuUGVyc3BlY3RpdmUoQXV0aG9yaW5nUGVyc3BlY3RpdmUuUEVSU1BFQ1RJVkVfSUQpOwotCQl9Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL09wZW5DaGVhdHNoZWV0Vmlldy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL09wZW5DaGVhdHNoZWV0Vmlldy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMjA1MzZhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9PcGVuQ2hlYXRzaGVldFZpZXcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0UmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGFydEluaXRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5Xb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmNoZWF0c2hlZXRzLnZpZXdzLkNoZWF0U2hlZXRWaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludHJvLklJbnRyb1NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50cm8uY29uZmlnLklJbnRyb0FjdGlvbjsKLQotLyoqCi0gKiBPcGVuIGNoZWF0IHNoZWV0IHZpZXcKLSAqIAotICogQGF1dGhvciBCaW5neHVlIFh1Ci0gKiBAc2luY2UgMS4wCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIE9wZW5DaGVhdHNoZWV0VmlldyBleHRlbmRzIEFjdGlvbiBpbXBsZW1lbnRzIElJbnRyb0FjdGlvbiB7Ci0KLQkvKioKLQkgKiBDcmVhdGUgYW4gaW5zdGFuY2UKLQkgKgotCSAqLwotCXB1YmxpYyBPcGVuQ2hlYXRzaGVldFZpZXcoKSB7Ci0JCXN1cGVyKEF1dGhvcmluZ1VJUmVzb3VyY2VzLk9wZW5DaGVhdHNoZWV0Vmlld190aXRsZSk7IAotCX0KLQotCS8qIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuaW50cm8uY29uZmlnLklJbnRyb0FjdGlvbiNydW4ob3JnLmVjbGlwc2UudWkuaW50cm8uSUludHJvU2l0ZSwgamF2YS51dGlsLlByb3BlcnRpZXMpCi0JICovCi0JcHVibGljIHZvaWQgcnVuKElJbnRyb1NpdGUgc2l0ZSwgUHJvcGVydGllcyBwYXJhbXMpIHsKLQkJU3RyaW5nIGNoZWF0c2hlZXRfaWQgPSBwYXJhbXMuZ2V0UHJvcGVydHkoImlucHV0Iik7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIHRvZ2dsZV9zdHIgPSBwYXJhbXMuZ2V0UHJvcGVydHkoInRvZ2dsZSIpOyAvLyROT04tTkxTLTEkCi0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiJCQkIElORk86IGNoZWF0c2hlZXQgaWQgPSAiICsgY2hlYXRzaGVldF9pZCk7Ci0KLQkJSVdvcmtiZW5jaFdpbmRvdyBhY3RpdmVXaW5kb3cgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpCi0JCQkJLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpOwotCi0JCS8vIGRlLW1heGltYWl6ZSB0aGUgd2VsY29tZSwgaS5lLiB0aGUgaW50cm8gdmlldyB3aW5kb3cKLQkJaWYgKHRvZ2dsZV9zdHIgIT0gbnVsbCAmJiB0b2dnbGVfc3RyLmVxdWFsc0lnbm9yZUNhc2UoInRydWUiKSkgeyAvLyROT04tTkxTLTEkCi0JCQl0b2dnbGVBY3RpdmVWaWV3KCk7Ci0JCX0KLQotCQl0cnkgewotCQkJLy8gQ2hlYXRTaGVldFZpZXcgb2JqID0gbmV3IENoZWF0U2hlZXRWaWV3KCk7Ci0JCQlhY3RpdmVXaW5kb3cuZ2V0QWN0aXZlUGFnZSgpLnNob3dWaWV3KAotCQkJCQkib3JnLmVjbGlwc2UudWkuY2hlYXRzaGVldHMudmlld3MuQ2hlYXRTaGVldFZpZXciKTsgLy8kTk9OLU5MUy0xJAotCQkJQ2hlYXRTaGVldFZpZXcgY3NWaWV3ID0gKENoZWF0U2hlZXRWaWV3KSBhY3RpdmVXaW5kb3cKLQkJCQkJLmdldEFjdGl2ZVBhZ2UoKS5nZXRBY3RpdmVQYXJ0KCk7Ci0JCQljc1ZpZXcuc2V0SW5wdXQoY2hlYXRzaGVldF9pZCk7Ci0KLQkJfSBjYXRjaCAoUGFydEluaXRFeGNlcHRpb24gZXhwKSB7Ci0JCQkvLyAkJCQgZXJyb3IgaGFuZGxpbmcgaGVyZS4KLQkJfQotCi0JfQotCi0JLyoqCi0JICogVG9nZ2xlIGFjdGl2ZSB2aWV3Ci0JICoKLQkgKi8KLQlwcml2YXRlIHZvaWQgdG9nZ2xlQWN0aXZlVmlldygpIHsKLQkJSVdvcmtiZW5jaFdpbmRvdyBhY3RpdmVXaW5kb3cgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpCi0JCQkJLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpOwotCi0JCS8vIGRlLW1heGltYWl6ZSB0aGUgd2VsY29tZSwgaS5lLiB0aGUgaW50cm8gdmlldyB3aW5kb3cgb3IgYW55IGFjdGl2ZQotCQkvLyB2aWV3Ci0JCUlXb3JrYmVuY2hQYWdlIHBhZ2UgPSBhY3RpdmVXaW5kb3cuZ2V0QWN0aXZlUGFnZSgpOwotCQlpZiAocGFnZSAhPSBudWxsKSB7Ci0JCQlpZiAocGFnZSBpbnN0YW5jZW9mIFdvcmtiZW5jaFBhZ2UpIHsKLQkJCQkvL1dvcmtiZW5jaFBhZ2UgcmVhbFBhZ2UgPSAoV29ya2JlbmNoUGFnZSkgcGFnZTsKLQotCQkJCUlXb3JrYmVuY2hQYXJ0UmVmZXJlbmNlIHBhcnRSZWYgPSBwYWdlLmdldEFjdGl2ZVBhcnRSZWZlcmVuY2UoKTsKLQotCQkJCWlmIChwYXJ0UmVmICE9IG51bGwpIHsKLQkJCQkJKChXb3JrYmVuY2hQYWdlKSBwYWdlKS50b2dnbGVab29tKHBhcnRSZWYpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL09wZW5FbGVtZW50QWN0aW9uRGVsZWdhdGUuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9PcGVuRWxlbWVudEFjdGlvbkRlbGVnYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2MmI0ZWEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL09wZW5FbGVtZW50QWN0aW9uRGVsZWdhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuUGVyc3BlY3RpdmVMaXN0VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLlVJQWN0aW9uRGlzcGF0Y2hlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmRpYWxvZ3MuQ29udHJpYnV0aW9uU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5FZGl0b3JDaG9vc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudmlld3MuQ29uZmlndXJhdGlvblZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklPYmplY3RBY3Rpb25EZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLQotCi0vKioKLSAqIE9wZW4gYSBtZXRob2QgZWxlbWVudCBlZGl0b3IgZGVsZWdhdGlvbiBhY3Rpb24KLSAqIAotICogQGF1dGhvciBCaW5nWHVlIFh1Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBPcGVuRWxlbWVudEFjdGlvbkRlbGVnYXRlIGltcGxlbWVudHMgSU9iamVjdEFjdGlvbkRlbGVnYXRlIHsKLQotCXByaXZhdGUgSVdvcmtiZW5jaFBhcnQgdGFyZ2V0UGFydDsKLQotCXByaXZhdGUgSVNlbGVjdGlvbiBzZWxlY3Rpb247Ci0KLQlwcml2YXRlIENvbnRyaWJ1dGlvblNlbGVjdGlvbiBjb250cmlidXRvclNlbGVjdG9yOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZQotCSAqCi0JICovCi0JcHVibGljIE9wZW5FbGVtZW50QWN0aW9uRGVsZWdhdGUoKSB7Ci0JCXN1cGVyKCk7Ci0JCWNvbnRyaWJ1dG9yU2VsZWN0b3IgPSBuZXcgQ29udHJpYnV0aW9uU2VsZWN0aW9uKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JT2JqZWN0QWN0aW9uRGVsZWdhdGUjc2V0QWN0aXZlUGFydChvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiwgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQpCi0JICovCi0JcHVibGljIHZvaWQgc2V0QWN0aXZlUGFydChJQWN0aW9uIGFjdGlvbiwgSVdvcmtiZW5jaFBhcnQgdGFyZ2V0UGFydCkgewotCQl0aGlzLnRhcmdldFBhcnQgPSB0YXJnZXRQYXJ0OwotCX0KLQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkRlbGVnYXRlI3NlbGVjdGlvbkNoYW5nZWQob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24sIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElBY3Rpb24gYWN0aW9uLCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQl0aGlzLnNlbGVjdGlvbiA9IHNlbGVjdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklBY3Rpb25EZWxlZ2F0ZSNydW4ob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24pCi0JICovCi0JcHVibGljIHZvaWQgcnVuKElBY3Rpb24gYWN0aW9uKSB7Ci0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiJCQkIE9wZW4gZWxlbWVudCBhY3Rpb24hIik7Ci0KLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCIkJCQgNTogIiArIHNlbGVjdGlvbik7Ci0JCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGVkID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb247Ci0KLQkJQXJyYXlMaXN0IGVsZW1lbnRMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiJCQkIHRhcmdldFBhcnQgPSAiICsgdGFyZ2V0UGFydCk7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKHRhcmdldFBhcnQgaW5zdGFuY2VvZiBDb25maWd1cmF0aW9uVmlldykgewotCQkJZm9yIChJdGVyYXRvciBvYmplY3RzID0gc2VsZWN0ZWQuaXRlcmF0b3IoKTsgb2JqZWN0cy5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IGVsZW1lbnQgPSBUbmdVdGlsLnVud3JhcChvYmplY3RzLm5leHQoKSk7Ci0JCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBWYXJpYWJpbGl0eUVsZW1lbnQpIHsKLQkJCQkJT2JqZWN0IG9iaiA9IGNvbnRyaWJ1dG9yU2VsZWN0b3IKLQkJCQkJCQkuZ2V0U2VsZWN0ZWRDb250cmlidXRvcigoVmFyaWFiaWxpdHlFbGVtZW50KSBlbGVtZW50KTsKLQkJCQkJaWYgKG9iaiAhPSBudWxsKQotCQkJCQkJZWxlbWVudExpc3QuYWRkKG9iaik7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJZWxlbWVudExpc3QuYWRkKGVsZW1lbnQpOwotCQkJCX0KLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWZvciAoSXRlcmF0b3Igb2JqZWN0cyA9IHNlbGVjdGVkLml0ZXJhdG9yKCk7IG9iamVjdHMuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBlbGVtZW50ID0gVG5nVXRpbC51bndyYXAob2JqZWN0cy5uZXh0KCkpOwotCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJCQllbGVtZW50TGlzdC5hZGQoZWxlbWVudCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJaWYgKGVsZW1lbnRMaXN0LnNpemUoKSA8IDEpCi0JCQlyZXR1cm47Ci0KLQkJaWYgKFBlcnNwZWN0aXZlTGlzdFV0aWwuaXNCcm93c2luZ1BlcnNwZWN0aXZlKCkpIHsKLQkJCVVJQWN0aW9uRGlzcGF0Y2hlci5vcGVuQXV0aG9yaW5nUGVyc3BlY3RpdmUoKTsKLQkJfQotCi0JCWZvciAoSXRlcmF0b3Igb2JqZWN0cyA9IGVsZW1lbnRMaXN0Lml0ZXJhdG9yKCk7IG9iamVjdHMuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGVsZW1lbnQgPSBvYmplY3RzLm5leHQoKTsKLQkJCUVkaXRvckNob29zZXIuZ2V0SW5zdGFuY2UoKS5vcGVuRWRpdG9yKGVsZW1lbnQpOwotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBEaXNwb3NlIAotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0KLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvT3BlbkVsZW1lbnRXb3JrYmVuY2hBY3Rpb25EZWxlZ2F0ZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL09wZW5FbGVtZW50V29ya2JlbmNoQWN0aW9uRGVsZWdhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzcyYzRiYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvT3BlbkVsZW1lbnRXb3JrYmVuY2hBY3Rpb25EZWxlZ2F0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5QZXJzcGVjdGl2ZUxpc3RVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuVUlBY3Rpb25EaXNwYXRjaGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5FZGl0b3JDaG9vc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3dBY3Rpb25EZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLkJhc2VTZWxlY3Rpb25MaXN0ZW5lckFjdGlvbjsKLQotCi0vKioKLSAqIE9wZW4gbWV0aG9kIGVsZW1lbnQgZWRpdG9yIGRlbGVnYXRpb24gYWN0aW9uIAotICogCi0gKiBAYXV0aG9yIEJpbmdYdWUgWHUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIE9wZW5FbGVtZW50V29ya2JlbmNoQWN0aW9uRGVsZWdhdGUgZXh0ZW5kcwotCQlCYXNlU2VsZWN0aW9uTGlzdGVuZXJBY3Rpb24gaW1wbGVtZW50cyBJV29ya2JlbmNoV2luZG93QWN0aW9uRGVsZWdhdGUgewotCi0JLy8gcHJpdmF0ZSBJV29ya2JlbmNoV2luZG93IHdpbmRvdzsKLQotCXByaXZhdGUgSVNlbGVjdGlvbiBzZWxlY3Rpb247Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlCi0JICoKLQkgKi8KLQlwdWJsaWMgT3BlbkVsZW1lbnRXb3JrYmVuY2hBY3Rpb25EZWxlZ2F0ZSgpIHsKLQkJdGhpcygKLQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5PcGVuRWxlbWVudFdvcmtiZW5jaEFjdGlvbkRlbGVnYXRlX2VkaXRfdGV4dDApOyAKLQl9Ci0KLQlwcm90ZWN0ZWQgT3BlbkVsZW1lbnRXb3JrYmVuY2hBY3Rpb25EZWxlZ2F0ZShTdHJpbmcgdGV4dCkgewotCQlzdXBlcih0ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3dBY3Rpb25EZWxlZ2F0ZSNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCi0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93QWN0aW9uRGVsZWdhdGUjaW5pdChvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93KQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cpIHsKLQkJLy8gdGhpcy53aW5kb3cgPSB3aW5kb3c7Ci0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklBY3Rpb25EZWxlZ2F0ZSNydW4ob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24pCi0JICovCi0JcHVibGljIHZvaWQgcnVuKElBY3Rpb24gYWN0aW9uKSB7Ci0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiJCQkIE9wZW4gZWxlbWVudCBhY3Rpb24hIik7Ci0KLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCIkJCQgNTogIiArIHNlbGVjdGlvbik7Ci0JCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGVkID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb247Ci0KLQkJaWYgKFBlcnNwZWN0aXZlTGlzdFV0aWwuaXNCcm93c2luZ1BlcnNwZWN0aXZlKCkpIHsKLQkJCVVJQWN0aW9uRGlzcGF0Y2hlci5vcGVuQXV0aG9yaW5nUGVyc3BlY3RpdmUoKTsKLQkJfQotCi0JCWZvciAoSXRlcmF0b3Igb2JqZWN0cyA9IHNlbGVjdGVkLml0ZXJhdG9yKCk7IG9iamVjdHMuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGVsZW1lbnQgPSBUbmdVdGlsLnVud3JhcChvYmplY3RzLm5leHQoKSk7Ci0JCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIiQkJCA2OiAiICsgZWxlbWVudCk7Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCQlFZGl0b3JDaG9vc2VyLmdldEluc3RhbmNlKCkub3BlbkVkaXRvcihlbGVtZW50KTsKLQkJCX0KLQkJfQotCi0JCWFjdGlvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQl9Ci0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkRlbGVnYXRlI3NlbGVjdGlvbkNoYW5nZWQob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24sIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElBY3Rpb24gYWN0aW9uLCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQl0aGlzLnNlbGVjdGlvbiA9IHNlbGVjdGlvbjsKLQotCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3RlZCA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uOwotCi0JCS8vIGlmICghUGVyc3BlY3RpdmVMaXN0VWl0bC5pc0F1dGhvcmluZ1BlcnNwZWN0aXZlKCkgfHwKLQkJLy8gc2VsZWN0ZWQuaXNFbXB0eSgpKSB7Ci0JCWlmIChzZWxlY3RlZC5pc0VtcHR5KCkpIHsKLQkJCWFjdGlvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCWJvb2xlYW4gZW5hYmxlTWVudSA9IHRydWU7Ci0JCWZvciAoSXRlcmF0b3Igb2JqZWN0cyA9IHNlbGVjdGVkLml0ZXJhdG9yKCk7IG9iamVjdHMuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGVsZW1lbnQgPSBUbmdVdGlsLnVud3JhcChvYmplY3RzLm5leHQoKSk7Ci0JCQlpZiAoIShlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkpIHsKLQkJCQllbmFibGVNZW51ID0gZmFsc2U7Ci0JCQl9Ci0JCX0KLQotCQlhY3Rpb24uc2V0RW5hYmxlZChlbmFibGVNZW51KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9PdXRkZW50QWN0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvT3V0ZGVudEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NTRmNjJmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9PdXRkZW50QWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMTkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5BYnN0cmFjdENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLlVuZXhlY3V0YWJsZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVuaXF1ZUVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5JRWRpdGluZ0RvbWFpblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uQ29tbWFuZEFjdGlvbkhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuUHJvY2Vzc0VkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JUmVzb3VyY2VBd2FyZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlByb2Nlc3NVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbi5EZXBlbmRlbmN5Q2hlY2tlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRJbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc1BhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkJ1c3lJbmRpY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci0KLS8qKgotICogVXBkYXRlIHN1cHByZXNzaW9uIGluZm9ybWF0aW9uIGZyb20gYmFzZSBlbGVtZW50cwotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlICAxLjIKLSAqLwotcHVibGljIGNsYXNzIE91dGRlbnRBY3Rpb24gZXh0ZW5kcwotCQlDb21tYW5kQWN0aW9uSGFuZGxlciBpbXBsZW1lbnRzIElXb3JrYmVuY2hQYXJ0QWN0aW9uLCBJTW9kaWZ5aW5nQWN0aW9uIHsKLQlwdWJsaWMgc3RhdGljIGNsYXNzIE91dGRlbnRDb21tYW5kIGV4dGVuZHMgQWJzdHJhY3RDb21tYW5kIGltcGxlbWVudHMgSVJlc291cmNlQXdhcmVDb21tYW5kIHsKLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgQWRhcHRlckZhY3RvcnlbXSBBREFQVEVSX0ZBQ1RPUklFUyA9IHsKLQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFLmdldFdCU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCksCi0JCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRS5nZXRPQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpLAotCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UuZ2V0V0JTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKQotCQl9OwotCQkKLQkJcHJpdmF0ZSBDb2xsZWN0aW9uPEJyZWFrZG93bkVsZW1lbnQ+IGVsZW1lbnRzOwotCQlwcml2YXRlIFNldCBtb2RpZmllZFJlc291cmNlczsKLQkJcHJpdmF0ZSBCcmVha2Rvd25FbGVtZW50IGVsZW1lbnQ7Ci0JCXByaXZhdGUgQWN0aXZpdHkgb2xkUGFyZW50OwotCQlwcml2YXRlIEFjdGl2aXR5IG5ld1BhcmVudDsKLQkJcHJpdmF0ZSBpbnQgb2xkSW5kZXg7Ci0JCXByaXZhdGUgaW50IG5ld0luZGV4OwotCQlwcml2YXRlIExpc3Q8T2JqZWN0PiBuZXdDaGlsZHJlbjsKLQotCQlwcml2YXRlIEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5OwotCi0JCXB1YmxpYyBPdXRkZW50Q29tbWFuZChDb2xsZWN0aW9uPEJyZWFrZG93bkVsZW1lbnQ+IGNvbGxlY3Rpb24sIEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCQl0aGlzLmVsZW1lbnRzID0gY29sbGVjdGlvbjsKLQkJCXRoaXMuYWRhcHRlckZhY3RvcnkgPSBhZGFwdGVyRmFjdG9yeTsKLQkJCXNldExhYmVsKExBQkVMKTsKLQkJfQotCQkKLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCQlpZihuZXdDaGlsZHJlbiAhPSBudWxsKSB7Ci0JCQkJbmV3Q2hpbGRyZW4uY2xlYXIoKTsKLQkJCQluZXdDaGlsZHJlbiA9IG51bGw7Ci0JCQl9Ci0JCQkKLQkJCXN1cGVyLmRpc3Bvc2UoKTsKLQkJfQotCi0JCXB1YmxpYyBDb2xsZWN0aW9uIGdldE1vZGlmaWVkUmVzb3VyY2VzKCkgewotCQkJaWYobW9kaWZpZWRSZXNvdXJjZXMgPT0gbnVsbCkgewotCQkJCVByb2Nlc3MgcHJvYyA9IG51bGw7Ci0JCQkJZm9yIChJdGVyYXRvcjxCcmVha2Rvd25FbGVtZW50PiBpdGVyID0gZWxlbWVudHMuaXRlcmF0b3IoKTsgcHJvYyA9PSBudWxsICYmIGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQlCcmVha2Rvd25FbGVtZW50IGUgPSBpdGVyLm5leHQoKTsKLQkJCQkJcHJvYyA9IFRuZ1V0aWwuZ2V0T3duaW5nUHJvY2VzcyhlKTsKLQkJCQl9Ci0JCQkJaWYocHJvYyAhPSBudWxsKSB7Ci0JCQkJCVJlc291cmNlIHJlc291cmNlID0gcHJvYy5lUmVzb3VyY2UoKTsKLQkJCQkJaWYocmVzb3VyY2UgIT0gbnVsbCkgewotCQkJCQkJbW9kaWZpZWRSZXNvdXJjZXMgPSBDb2xsZWN0aW9ucy5zaW5nbGV0b24ocHJvYy5lUmVzb3VyY2UoKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYobW9kaWZpZWRSZXNvdXJjZXMgPT0gbnVsbCkgewotCQkJCQltb2RpZmllZFJlc291cmNlcyA9IENvbGxlY3Rpb25zLkVNUFRZX1NFVDsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gbW9kaWZpZWRSZXNvdXJjZXM7Ci0JCX0KLQkJCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgYm9vbGVhbiBwcmVwYXJlKCkgewotCQkJZWxlbWVudCA9IGVsZW1lbnRzLml0ZXJhdG9yKCkubmV4dCgpOwotCQkJb2xkUGFyZW50ID0gZWxlbWVudC5nZXRTdXBlckFjdGl2aXRpZXMoKTsKLQkJCWlmKG9sZFBhcmVudCA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJb2xkSW5kZXggPSBvbGRQYXJlbnQuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5pbmRleE9mKGVsZW1lbnQpOwotCQkJTWFwPExpc3Q8T2JqZWN0PiwgSW50ZWdlcj4gY2hpbGRyZW5Ub1N0YXJ0SW5kZXhNYXAgPSBuZXcgSGFzaE1hcDxMaXN0PE9iamVjdD4sIEludGVnZXI+KCk7Ci0JCQlBZGFwdGVyRmFjdG9yeVtdIGFkYXB0ZXJGYWN0b3JpZXM7Ci0JCQlpZihlbGVtZW50IGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQlhZGFwdGVyRmFjdG9yaWVzID0gQURBUFRFUl9GQUNUT1JJRVM7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlhZGFwdGVyRmFjdG9yaWVzID0gbmV3IEFkYXB0ZXJGYWN0b3J5W10gewotCQkJCQlhZGFwdGVyRmFjdG9yeQkKLQkJCQl9OwotCQkJfQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhZGFwdGVyRmFjdG9yaWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkgPSBhZGFwdGVyRmFjdG9yaWVzW2ldOwotCQkJCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciBpcCA9IChJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIpIGFkYXB0ZXJGYWN0b3J5LmFkYXB0KG9sZFBhcmVudCwgCi0JCQkJCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkJCUxpc3Q8T2JqZWN0PiBjaGlsZHJlbiA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PihpcC5nZXRDaGlsZHJlbihvbGRQYXJlbnQpKTsKLQkJCQlpbnQgaW5kZXggPSBjaGlsZHJlbi5pbmRleE9mKGVsZW1lbnQpOwotCQkJCWludCBzaXplID0gY2hpbGRyZW4uc2l6ZSgpOwotCQkJCWludCBuZXdDaGlsZHJlbkZyb21JbmRleCA9IGluZGV4ICsgMTsKLQkJCQlpZihuZXdDaGlsZHJlbkZyb21JbmRleCA8IHNpemUpIHsKLQkJCQkJZm9yKGludCBqID0gbmV3Q2hpbGRyZW5Gcm9tSW5kZXg7IGogPCBzaXplOyBqKyspIHsKLQkJCQkJCU9iamVjdCBjaGlsZCA9IGNoaWxkcmVuLmdldChqKTsKLQkJCQkJCWlmKFByb2Nlc3NVdGlsLmlzSW5oZXJpdGVkKGNoaWxkKSkgewotCQkJCQkJCS8vIGNhbm5vdCBvdXRkZW50IGFjdGl2aXR5IHRoYXQgaGF2ZSBpbmhlcml0ZWQgc2libGluZyBiZWxvdyBpdAotCQkJCQkJCS8vCi0JCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWNoaWxkcmVuVG9TdGFydEluZGV4TWFwLnB1dChjaGlsZHJlbiwgSW50ZWdlci52YWx1ZU9mKG5ld0NoaWxkcmVuRnJvbUluZGV4KSk7Ci0JCQkJfQotCQkJfQotCQkJaWYoIShlbGVtZW50IGluc3RhbmNlb2YgQWN0aXZpdHkpICYmICFjaGlsZHJlblRvU3RhcnRJbmRleE1hcC5pc0VtcHR5KCkpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQluZXdQYXJlbnQgPSBvbGRQYXJlbnQuZ2V0U3VwZXJBY3Rpdml0aWVzKCk7Ci0JCQlpZihuZXdQYXJlbnQgIT0gbnVsbCkgewotCQkJCW5ld0luZGV4ID0gbmV3UGFyZW50LmdldEJyZWFrZG93bkVsZW1lbnRzKCkuaW5kZXhPZihvbGRQYXJlbnQpICsgMTsKLQkJCQlpZighY2hpbGRyZW5Ub1N0YXJ0SW5kZXhNYXAuaXNFbXB0eSgpKSB7Ci0JCQkJCW5ld0NoaWxkcmVuID0gbmV3IFVuaXF1ZUVMaXN0KCk7Ci0JCQkJCWZvciAoSXRlcmF0b3I8TWFwLkVudHJ5PExpc3Q8T2JqZWN0PiwgSW50ZWdlcj4+IGl0ZXIgPSBjaGlsZHJlblRvU3RhcnRJbmRleE1hcC5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQkJTWFwLkVudHJ5PExpc3Q8T2JqZWN0PiwgSW50ZWdlcj4gZW50cnkgPSBpdGVyLm5leHQoKTsKLQkJCQkJCUxpc3QgY2hpbGRyZW4gPSBlbnRyeS5nZXRLZXkoKTsKLQkJCQkJCW5ld0NoaWxkcmVuLmFkZEFsbChjaGlsZHJlbi5zdWJMaXN0KGVudHJ5LmdldFZhbHVlKCkuaW50VmFsdWUoKSwgY2hpbGRyZW4uc2l6ZSgpKSk7Ci0JCQkJCX0KLQkJCQkJaWYoIURlcGVuZGVuY3lDaGVja2VyLmNoZWNrQ2lyY3VsYXJGb3JNb3ZpbmdWYXJpYWJpbGl0eUVsZW1lbnQoKFZhcmlhYmlsaXR5RWxlbWVudCkgZWxlbWVudCwgbmV3Q2hpbGRyZW4sIHRydWUpKSB7Ci0JCQkJCQlyZXR1cm4gZmFsc2U7CQkJCQkJCi0JCQkJCX0KLQkJCQl9Ci0JCQkJcmV0dXJuIERlcGVuZGVuY3lDaGVja2VyLmNoZWNrQ2lyY3VsYXJGb3JNb3ZpbmdWYXJpYWJpbGl0eUVsZW1lbnQobmV3UGFyZW50LCBDb2xsZWN0aW9ucy5zaW5nbGV0b24oZWxlbWVudCksIHRydWUpOwotCQkJfQotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJCW5ld1BhcmVudC5nZXRCcmVha2Rvd25FbGVtZW50cygpLmFkZChuZXdJbmRleCwgZWxlbWVudCk7Ci0JCQlpZihlbGVtZW50IGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQlQcm9jZXNzUGFja2FnZSBwYXJlbnRQa2cgPSAoUHJvY2Vzc1BhY2thZ2UpIG5ld1BhcmVudC5lQ29udGFpbmVyKCk7Ci0JCQkJcGFyZW50UGtnLmdldENoaWxkUGFja2FnZXMoKS5hZGQoKE1ldGhvZFBhY2thZ2UpZWxlbWVudC5lQ29udGFpbmVyKCkpOwotCi0JCQkJaWYobmV3Q2hpbGRyZW4gIT0gbnVsbCkgewotLy8JCQkJCSgoQWN0aXZpdHkpZWxlbWVudCkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5hZGRBbGwobmV3Q2hpbGRyZW4pOwkJCQotCQkJCQkvLyBtb3ZlIHRoZSBwcm9jZXNzIHBhY2FrZ2Ugb2YgdGhlIGFjdGl2aXR5IHRvIG5ldyBwYXJlbnQgcGFja2FnZQotCQkJCQkvLwotCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBuZXdDaGlsZHJlbi5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJCU9iamVjdCBjaGlsZCA9IGl0ZXIubmV4dCgpOwotCQkJCQkJaWYgKGNoaWxkIGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudCkKLQkJCQkJCQkoKEFjdGl2aXR5KWVsZW1lbnQpLmdldEJyZWFrZG93bkVsZW1lbnRzKCkuYWRkKChCcmVha2Rvd25FbGVtZW50KSBjaGlsZCk7Ci0JCQkJCQlpZihjaGlsZCBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJCQkJcGFyZW50UGtnLmdldENoaWxkUGFja2FnZXMoKS5hZGQoKE1ldGhvZFBhY2thZ2UpKChBY3Rpdml0eSljaGlsZCkuZUNvbnRhaW5lcigpKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXB1YmxpYyB2b2lkIHJlZG8oKSB7Ci0JCQlleGVjdXRlKCk7Ci0JCX0KLQkJCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgdm9pZCB1bmRvKCkgewotCQkJb2xkUGFyZW50LmdldEJyZWFrZG93bkVsZW1lbnRzKCkuYWRkKG9sZEluZGV4LCBlbGVtZW50KTsKLQkJCWlmKGVsZW1lbnQgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCVByb2Nlc3NQYWNrYWdlIHBhcmVudFBrZyA9IChQcm9jZXNzUGFja2FnZSkgb2xkUGFyZW50LmVDb250YWluZXIoKTsKLQkJCQlwYXJlbnRQa2cuZ2V0Q2hpbGRQYWNrYWdlcygpLmFkZCgoTWV0aG9kUGFja2FnZSllbGVtZW50LmVDb250YWluZXIoKSk7Ci0JCQkJaWYobmV3Q2hpbGRyZW4gIT0gbnVsbCkgewotCQkJCQkoKEFjdGl2aXR5KSBlbGVtZW50KS5nZXRCcmVha2Rvd25FbGVtZW50cygpLnJlbW92ZUFsbChuZXdDaGlsZHJlbik7Ci0JCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IG5ld0NoaWxkcmVuLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQkJT2JqZWN0IGNoaWxkID0gaXRlci5uZXh0KCk7Ci0JCQkJCQlpZihjaGlsZCBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJCQkJcGFyZW50UGtnLmdldENoaWxkUGFja2FnZXMoKS5hZGQoKE1ldGhvZFBhY2thZ2UpKChBY3Rpdml0eSljaGlsZCkuZUNvbnRhaW5lcigpKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBDb2xsZWN0aW9uIGdldEFmZmVjdGVkT2JqZWN0cygpIHsKLQkJCXJldHVybiBlbGVtZW50czsKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMQUJFTCA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLlByb2Nlc3NFZGl0b3JfQWN0aW9uX091dGRlbnQ7Ci0KLQlwcml2YXRlIFByb2Nlc3NFZGl0b3IgZWRpdG9yOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZQotCSAqIEBwYXJhbSB0ZXh0Ci0JICovCi0JcHVibGljIE91dGRlbnRBY3Rpb24oU3RyaW5nIHRleHQpIHsKLQkJc3VwZXIobnVsbCwgdGV4dCk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2UKLQkgKgotCSAqLwotCXB1YmxpYyBPdXRkZW50QWN0aW9uKCkgewotCQl0aGlzKExBQkVMKTsKLQkJc2V0SW1hZ2VEZXNjcmlwdG9yKFJpY2hUZXh0SW1hZ2VzLklNR19ERVNDX09VVERFTlQpOwotCQlzZXREaXNhYmxlZEltYWdlRGVzY3JpcHRvcihSaWNoVGV4dEltYWdlcy5ESVNBQkxFRF9JTUdfREVTQ19PVVRERU5UKTsKLQkJc2V0VG9vbFRpcFRleHQoTEFCRUwpOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5Db21tYW5kQWN0aW9uSGFuZGxlciN1cGRhdGVTZWxlY3Rpb24ob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB1cGRhdGVTZWxlY3Rpb24oSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCS8vIHN1cHBvcnQgaW5kZW50IG9ubHkgb25lIGFjdGl2aXR5IGZvciBub3cKLQkJLy8KLQkJYm9vbGVhbiByZXQgPSBmYWxzZTsKLQkJaWYoc2VsZWN0aW9uLnNpemUoKSA9PSAxKSB7Ci0JCQlPYmplY3QgZSA9IHNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCWlmKGUgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCXJldCA9IHN1cGVyLnVwZGF0ZVNlbGVjdGlvbihzZWxlY3Rpb24pOwotCQkJfQotCQl9Ci0JCXNldEVuYWJsZWQocmV0KTsKLQkJcmV0dXJuIHJldDsKLQkJCi0JCS8vVE9ETzogc3VwcG9ydCBpbmRlbnQgbXVsdGlwbGUgYWN0aXZpdGllcyBpbiBzZWxlY3Rpb24KLS8vCQlBcnJheUxpc3Q8QWN0aXZpdHk+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PEFjdGl2aXR5PigpOwotLy8JCWZvciAoSXRlcmF0b3IgaXRlciA9IHNlbGVjdGlvbi5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLS8vCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyLm5leHQoKTsKLS8vCQkJaWYoZWxlbWVudCBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0vLwkJCQlsaXN0LmFkZCgoQWN0aXZpdHkpIGVsZW1lbnQpOwotLy8JCQl9Ci0vLwkJfQotLy8JCWlmKGxpc3QuaXNFbXB0eSgpKSB7Ci0vLwkJCXJldHVybiBmYWxzZTsKLS8vCQl9Ci0vLwkJcmV0dXJuIHN1cGVyLnVwZGF0ZVNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihsaXN0KSk7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkNvbW1hbmRBY3Rpb25IYW5kbGVyI2NyZWF0ZUNvbW1hbmQoamF2YS51dGlsLkNvbGxlY3Rpb24pCi0JICovCi0JcHVibGljIENvbW1hbmQgY3JlYXRlQ29tbWFuZChDb2xsZWN0aW9uIHNlbGVjdGlvbikgewotCQlpZihkb21haW4gaW5zdGFuY2VvZiBBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW4pIHsKLQkJCXJldHVybiBuZXcgT3V0ZGVudENvbW1hbmQoc2VsZWN0aW9uLCAoKEFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbilkb21haW4pLmdldEFkYXB0ZXJGYWN0b3J5KCkpOwotCQl9Ci0JCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCX0JCi0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9ucy5JV29ya2JlbmNoUGFydEFjdGlvbiNzZXRBY3RpdmVXb3JrYmVuY2hQYXJ0KG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFjdGl2ZVdvcmtiZW5jaFBhcnQoSVdvcmtiZW5jaFBhcnQgd29ya2JlbmNoUGFydCkgewotCQlpZih3b3JrYmVuY2hQYXJ0IGluc3RhbmNlb2YgSUVkaXRpbmdEb21haW5Qcm92aWRlcikgewotCQkJZG9tYWluID0gKChJRWRpdGluZ0RvbWFpblByb3ZpZGVyKXdvcmtiZW5jaFBhcnQpLmdldEVkaXRpbmdEb21haW4oKTsKLQkJfQotCQlpZih3b3JrYmVuY2hQYXJ0IGluc3RhbmNlb2YgUHJvY2Vzc0VkaXRvcikgewotCQkJZWRpdG9yID0gKFByb2Nlc3NFZGl0b3IpIHdvcmtiZW5jaFBhcnQ7Ci0JCX0JCQotCQllbHNlIGlmKHdvcmtiZW5jaFBhcnQgPT0gbnVsbCkgewotCQkJZWRpdG9yID0gbnVsbDsKLQkJfQotCX0JCi0JCi0JcHJpdmF0ZSB2b2lkIHN1cGVyUnVuKCkgewotCQlzdXBlci5ydW4oKTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uQ29tbWFuZEFjdGlvbkhhbmRsZXIjcnVuKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCUJ1c3lJbmRpY2F0b3Iuc2hvd1doaWxlKGVkaXRvci5nZXRFZGl0b3JTaXRlKCkKLQkJCQkuZ2V0U2hlbGwoKS5nZXREaXNwbGF5KCksIG5ldyBSdW5uYWJsZSgpIHsKLQotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQlzdXBlclJ1bigpOwotCQkJCQl9Ci0JCQkKLQkJfSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL1Byb2Nlc3NBdXRvU3luY2hyb25pemVBY3Rpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9Qcm9jZXNzQXV0b1N5bmNocm9uaXplQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxMDg1NTkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL1Byb2Nlc3NBdXRvU3luY2hyb25pemVBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwNyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5JRWRpdGluZ0RvbWFpblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5Db21tYW5kQWN0aW9uSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5NZXRob2RFbGVtZW50RWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQuU3luY2hyb25pemVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudWkuVXNlckludGVyYWN0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Qcm9jZXNzVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5hY3Rpb25zLlByb2Nlc3NEZWxldGVBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGVhbVByb2ZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotCi0KLS8qKgotICogRGVmYXVsdCBTeW5jaHJvbml6ZSBhY3Rpb24gZm9yIHByb2Nlc3MgZWxlbWVudHMuCi0gKiBTeW5jaHJvbml6YXRpb24gdGFrZXMgcGxhY2UgZnJvbSBtZXRob2QgdG8gcHJvY2VzcyBlbGVtZW50cy4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFByb2Nlc3NBdXRvU3luY2hyb25pemVBY3Rpb24gZXh0ZW5kcyBDb21tYW5kQWN0aW9uSGFuZGxlciAKLWltcGxlbWVudHMgSVdvcmtiZW5jaFBhcnRBY3Rpb24sIElNb2RpZnlpbmdBY3Rpb24KLXsKLQlwcm90ZWN0ZWQgSVdvcmtiZW5jaFBhcnQgYWN0aXZlV29ya2JlbmNoUGFydDsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBjYW5SdW47Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlCi0JICovCi0JcHVibGljIFByb2Nlc3NBdXRvU3luY2hyb25pemVBY3Rpb24oKSB7Ci0JCXN1cGVyKG51bGwsIExpYnJhcnlFZGl0UmVzb3VyY2VzLkF1dG9TeW5jaHJvbml6ZUNvbW1hbmRfbGFiZWwpOyAKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIHdpdGggbGFiZWwgdGV4dAotCSAqLwotCXB1YmxpYyBQcm9jZXNzQXV0b1N5bmNocm9uaXplQWN0aW9uKFN0cmluZyBsYWJlbFRleHQpIHsKLQkJc3VwZXIobnVsbCwgbGFiZWxUZXh0KTsgCi0JfQotCQotCS8qKgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zLklXb3JrYmVuY2hQYXJ0QWN0aW9uI3NldEFjdGl2ZVdvcmtiZW5jaFBhcnQob3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQpCi0JICovCi0JcHVibGljIHZvaWQgc2V0QWN0aXZlV29ya2JlbmNoUGFydChJV29ya2JlbmNoUGFydCB3b3JrYmVuY2hQYXJ0KSB7Ci0JCWFjdGl2ZVdvcmtiZW5jaFBhcnQgPSB3b3JrYmVuY2hQYXJ0OwotCQlpZiAod29ya2JlbmNoUGFydCBpbnN0YW5jZW9mIElFZGl0aW5nRG9tYWluUHJvdmlkZXIpIHsKLQkJCWRvbWFpbiA9ICgoSUVkaXRpbmdEb21haW5Qcm92aWRlcikgd29ya2JlbmNoUGFydCkKLQkJCQkJLmdldEVkaXRpbmdEb21haW4oKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkNvbW1hbmRBY3Rpb25IYW5kbGVyI2NyZWF0ZUNvbW1hbmQoamF2YS51dGlsLkNvbGxlY3Rpb24pCi0JICovCi0JcHVibGljIENvbW1hbmQgY3JlYXRlQ29tbWFuZChDb2xsZWN0aW9uIHNlbGVjdGlvbikgewotCQlyZXR1cm4gbmV3IFN5bmNocm9uaXplQ29tbWFuZChnZXRUZXh0KCksIHNlbGVjdGlvbikgewotCQkJLyoKLQkJCSAqIAotCQkJICogCi0JCQkgKiBAc2VlIEF1dG9TeW5jaHJvbml6ZUNvbW1hbmQjZGVsZXRlKGphdmEudXRpbC5Db2xsZWN0aW9uKQotCQkJICovCi0JCQlwcm90ZWN0ZWQgQ29tbWFuZCBkZWxldGUoTGlzdCBlbGVtZW50cykgewotCQkJCXRyeSB7Ci0JCQkJCXJldHVybiBQcm9jZXNzRGVsZXRlQWN0aW9uLmRlbGV0ZShlbGVtZW50cyk7Ci0JCQkJfQotCQkJCWNhdGNoKE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uIGUpIHsKLQkJCQkJYWJvcnRlZCA9IHRydWU7Ci0JCQkJCXJldHVybiBudWxsOwotCQkJCX0KLQkJCX0KLQkJfTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBwcm9jZXNzIAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcm90ZWN0ZWQgUHJvY2VzcyBnZXRQcm9jZXNzKCkgewotCQlpZihhY3RpdmVXb3JrYmVuY2hQYXJ0IGluc3RhbmNlb2YgSUVkaXRvclBhcnQpIHsKLQkJCUlFZGl0b3JJbnB1dCBpbnB1dCA9ICgoSUVkaXRvclBhcnQpYWN0aXZlV29ya2JlbmNoUGFydCkuZ2V0RWRpdG9ySW5wdXQoKTsKLQkJCWlmKGlucHV0IGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudEVkaXRvcklucHV0KSB7Ci0JCQkJTWV0aG9kRWxlbWVudCBlID0gKChNZXRob2RFbGVtZW50RWRpdG9ySW5wdXQpaW5wdXQpLmdldE1ldGhvZEVsZW1lbnQoKTsKLQkJCQlpZihlIGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkgewotCQkJCQlyZXR1cm4gKChQcm9jZXNzQ29tcG9uZW50KWUpLmdldFByb2Nlc3MoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkNvbW1hbmRBY3Rpb25IYW5kbGVyI3VwZGF0ZVNlbGVjdGlvbihvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHVwZGF0ZVNlbGVjdGlvbihJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJQXJyYXlMaXN0IHNlbGVjdGVkID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBzZWxlY3Rpb24uaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZWxlbWVudCA9IGl0ZXIubmV4dCgpOwotCQkJCi0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyIAotCQkJCQkmJiAhKChCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgZWxlbWVudCkuaXNSZWFkT25seSgpKSB7Ci0JCQkJZWxlbWVudCA9IFRuZ1V0aWwudW53cmFwKGVsZW1lbnQpOwotCQkJfQotCQkJCi0JCQlib29sZWFuIHZhbGlkID0gZmFsc2U7Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnQpIHsKLQkJCQlpZihlbGVtZW50IGluc3RhbmNlb2YgRGVzY3JpcHRvcikgewotCQkJCQlEZXNjcmlwdG9yIGRlc2MgPSAoRGVzY3JpcHRvcikgZWxlbWVudDsKLQkJCQkJCi0JCQkJCS8vIGRlc2NyaXB0b3IgbXVzdCBiZSBsaW5rZWQgYW5kIGlzIG5vdCBzdXBwcmVzc2VkCi0JCQkJCS8vCi0JCQkJCXZhbGlkID0gUHJvY2Vzc1V0aWwuZ2V0QXNzb2NpYXRlZEVsZW1lbnQoZGVzYykgIT0gbnVsbCAmJiAhZGVzYy5nZXRTdXBwcmVzc2VkKCkuYm9vbGVhblZhbHVlKCk7CQkJCQkKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCS8vIGV4Y2x1ZGUgYnJlYWtkb3duIGVsZW1lbnQgd2l0aG91dCBhIHN1cGVyIGFjdGl2aXR5IGxpa2UgVGVhbVByb2ZpbGUncyBvd24gUm9sZURlc2NyaXB0b3IKLQkJCQkJLy8KLQkJCQkJaWYgKCgoQnJlYWtkb3duRWxlbWVudCllbGVtZW50KS5nZXRTdXBlckFjdGl2aXRpZXMoKSA9PSBudWxsKSAKLQkJCQkJewotCQkJCQkJaWYoZWxlbWVudCBpbnN0YW5jZW9mIFByb2Nlc3MgJiYgKChQcm9jZXNzKWVsZW1lbnQpLmVDb250YWluZXIoKSBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpIHsKLQkJCQkJCQl2YWxpZCA9IHRydWU7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQl2YWxpZCA9IGVsZW1lbnQgaW5zdGFuY2VvZiBBY3Rpdml0eSB8fCBlbGVtZW50IGluc3RhbmNlb2YgVGVhbVByb2ZpbGU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlpZih2YWxpZCkgewotCQkJCXNlbGVjdGVkLmFkZChlbGVtZW50KTsKLQkJCX0KLQkJfQotCQlpZiAoc2VsZWN0ZWQuaXNFbXB0eSgpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLnVwZGF0ZVNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihzZWxlY3RlZCkpOwotCX0KLQotCi0gICAvKioKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5Db21tYW5kQWN0aW9uSGFuZGxlciNydW4oKQotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLklSdW5uYWJsZVdpdGhQcm9ncmVzcyBydW5uYWJsZSA9IG5ldyBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuSVJ1bm5hYmxlV2l0aFByb2dyZXNzKCkgewotCQkJLyoKLQkJCSAqIChub24tSmF2YWRvYykKLQkJCSAqIAotCQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uSVJ1bm5hYmxlV2l0aFByb2dyZXNzI3J1bihvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKLQkJCSAqLwotCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLQkJCQkJdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJCQljYW5SdW4gPSAoKFN5bmNocm9uaXplQ29tbWFuZCkgY29tbWFuZCkuaW5pdGlsaXplKCk7Ci0JCQl9Ci0JCX07Ci0JCVVzZXJJbnRlcmFjdGlvbkhlbHBlci5ydW5XaXRoUHJvZ3Jlc3MocnVubmFibGUsIExpYnJhcnlFZGl0UmVzb3VyY2VzLlByb2Nlc3NBdXRvU3luY2hyb25pemVBY3Rpb25fcHJlcGFyZSk7IAotCi0JCWlmIChjYW5SdW4pIHsKLQkJCXN1cGVyLnJ1bigpOwotCQkJLy8gaWYoKChBdXRvU3luY2hyb25pemVDb21tYW5kKWNvbW1hbmQpLmlzU3VjZXNzZnVsKCkpIHsKLQkJCS8vIEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKS5kaXNwbGF5SW5mbyhnZXRUZXh0KCksCi0JCQkvLyAiU3luY2hyb25pemF0aW9uIGhhcyBiZWVuIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkuIik7Ci0JCQkvLwkJCQkKLQkJCS8vIH0KLQkJfSBlbHNlIHsKLQkJCUF1dGhvcmluZ1VJUGx1Z2luCi0JCQkJCS5nZXREZWZhdWx0KCkKLQkJCQkJLmdldE1zZ0RpYWxvZygpCi0JCQkJCS5kaXNwbGF5SW5mbygKLQkJCQkJCQlnZXRUZXh0KCksCi0JCQkJCQkJTGlicmFyeUVkaXRSZXNvdXJjZXMuUHJvY2Vzc0F1dG9TeW5jaHJvbml6ZUFjdGlvbl9ub0Rlc2NyaXB0b3JUb1N5bmNoKTsgCi0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9SZWFzc2lnbkFjdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL1JlYXNzaWduQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkODlmN2QuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL1JlYXNzaWduQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5kaWFsb2dzLkFzc2lnbkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnZpZXdzLkxpYnJhcnlWaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLQotLyoqCi0gKiBSZWFzc2lnbiBtZXRob2QgZWxlbWVudC4KLSAqIAotICogQGF1dGhvciBXZWlwaW5nIEx1Ci0gKiBAc2luY2UgIDEuNQotICovCi1wdWJsaWMgY2xhc3MgUmVhc3NpZ25BY3Rpb24gZXh0ZW5kcyBBc3NpZ25BY3Rpb24gewotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZQotCSAqIEBwYXJhbSB0ZXh0Ci0JICovCi0JcHVibGljIFJlYXNzaWduQWN0aW9uKExpYnJhcnlWaWV3IGxpYlZpZXcpIHsKLQkJc3VwZXIobGliVmlldyk7Ci0JCXNldFRleHQoQXV0aG9yaW5nVUlSZXNvdXJjZXMucmVhc3NpZ25BY3Rpb25fdGV4dCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGRvUnVuKCkgewkJCi0JCWlmICghY2hlY2tNb2RpZnkoKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmRvUnVuKCk7Ci0JfQotCQotCXByb3RlY3RlZCBBc3NpZ25EaWFsb2cgZ2V0RGlhbG9nKENvbGxlY3Rpb24gZWxlbWVudHMpIHsKLQkJcmV0dXJuIEFzc2lnbkRpYWxvZy5uZXdSZWFzc2lnbkRpYWxvZyhnZXRMaWJyYXJ5VmlldygpLmdldFNpdGUoKS5nZXRTaGVsbCgpLCBlbGVtZW50cywKLQkJCQkoTWV0aG9kRWxlbWVudCkgZ2V0U2VsZWN0aW9uUGFyZW50T2JqZWN0KCkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL1JlZnJlc2hDb25maWd1cmF0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvUmVmcmVzaENvbmZpZ3VyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzViZDUxYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvUmVmcmVzaENvbmZpZ3VyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudmlld3MuQ29uZmlndXJhdGlvblZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklWaWV3QWN0aW9uRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVZpZXdQYXJ0OwotCi0vKioKLSAqIFJlZnJlc2ggQ29uZmlndXJhdGlvbiBhY3Rpb24KLSAqIAotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjAKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBSZWZyZXNoQ29uZmlndXJhdGlvbiBpbXBsZW1lbnRzIElWaWV3QWN0aW9uRGVsZWdhdGUgewotCi0JcHJpdmF0ZSBDb25maWd1cmF0aW9uVmlldyB0YXJnZXRWaWV3OwotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JVmlld0FjdGlvbkRlbGVnYXRlI2luaXQob3JnLmVjbGlwc2UudWkuSVZpZXdQYXJ0KQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSVZpZXdQYXJ0IHZpZXcpIHsKLQkJdGFyZ2V0VmlldyA9IChDb25maWd1cmF0aW9uVmlldykgdmlldzsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklBY3Rpb25EZWxlZ2F0ZSNydW4ob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24pCi0JICovCi0JcHVibGljIHZvaWQgcnVuKElBY3Rpb24gYWN0aW9uKSB7Ci0JCXRhcmdldFZpZXcucmVmcmVzaCgpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkRlbGVnYXRlI3NlbGVjdGlvbkNoYW5nZWQob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24sIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElBY3Rpb24gYWN0aW9uLCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlhY3Rpb24uc2V0RW5hYmxlZCh0cnVlKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9SZW5hbWVBY3Rpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9SZW5hbWVBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2JjZDUzZi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvUmVuYW1lQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MDggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQWJzdHJhY3RDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5VbmV4ZWN1dGFibGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLldyYXBwZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5BZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLklFZGl0aW5nRG9tYWluUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkNvbW1hbmRBY3Rpb25IYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuRWRpdG9yQ2hvb3NlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpLnV0aWwuTXNnQm94OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuU3RyVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnNlcnZpY2VzLkRpYWdyYW1NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnVpLlVzZXJJbnRlcmFjdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb24uSVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb24uSVZhbGlkYXRvckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuYWN0aW9ucy5MaWJyYXJ5TG9ja2luZ09wZXJhdGlvblJ1bm5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VydmljZXMuSUxpYnJhcnlQZXJzaXN0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzLklMaWJyYXJ5UGVyc2lzdGVyLkZhaWxTYWZlTWV0aG9kTGlicmFyeVBlcnNpc3RlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5OYW1lZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQ29udGVudERlc2NyaXB0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuTWVzc2FnZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklJbnB1dFZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklucHV0RGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uSVJ1bm5hYmxlV2l0aFByb2dyZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkJ1c3lJbmRpY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLQotLyoqCi0gKiBSZW5hbWVzIG1ldGhvZCBlbGVtZW50LgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlICAxLjIKLSAqLwotcHVibGljIGNsYXNzIFJlbmFtZUFjdGlvbiBleHRlbmRzCi0JCUNvbW1hbmRBY3Rpb25IYW5kbGVyIGltcGxlbWVudHMgSVdvcmtiZW5jaFBhcnRBY3Rpb24sIElNb2RpZnlpbmdBY3Rpb24gewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExBQkVMID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMucmVuYW1lQWN0aW9uX3RleHQ7Ci0KLQlwcml2YXRlIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbjsKLQotCXByaXZhdGUgSVdvcmtiZW5jaFBhcnQgYWN0aXZlUGFydDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2UKLQkgKiBAcGFyYW0gdGV4dAotCSAqLwotCXB1YmxpYyBSZW5hbWVBY3Rpb24oU3RyaW5nIHRleHQpIHsKLQkJc3VwZXIobnVsbCwgdGV4dCk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2UKLQkgKgotCSAqLwotCXB1YmxpYyBSZW5hbWVBY3Rpb24oKSB7Ci0JCXRoaXMoTEFCRUwpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBzZWxlY3RlZCBtZXRob2QgZWxlbWVudHMgY2FuIGJlCi0JICogcmVuYW1lZC4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gY2FuUmVuYW1lKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlpZiAoIShkb21haW4gaW5zdGFuY2VvZiBBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW4pIHx8IHNlbGVjdGlvbi5zaXplKCkgPiAxKQotCQkJcmV0dXJuIGZhbHNlOwotCQlPYmplY3QgZWxlbWVudCA9IFRuZ1V0aWwudW53cmFwKHNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKSk7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgTmFtZWRFbGVtZW50Ci0JCQkJJiYgIVRuZ1V0aWwuaXNQcmVkZWZpbmVkKChNZXRob2RFbGVtZW50KSBlbGVtZW50KSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkNvbW1hbmRBY3Rpb25IYW5kbGVyI3VwZGF0ZVNlbGVjdGlvbihvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHVwZGF0ZVNlbGVjdGlvbihJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJYm9vbGVhbiByZXQgPSBmYWxzZTsKLQkJaWYoY2FuUmVuYW1lKHNlbGVjdGlvbikpIHsKLQkJCXRoaXMuc2VsZWN0aW9uID0gc2VsZWN0aW9uOwotCQkJcmV0ID0gc3VwZXIudXBkYXRlU2VsZWN0aW9uKHNlbGVjdGlvbik7Ci0JCX0KLQkJc2V0RW5hYmxlZChyZXQpOwotCQlyZXR1cm4gcmV0OwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQ29tbWFuZCBjcmVhdGVDb21tYW5kKENvbGxlY3Rpb248Pz4gc2VsZWN0aW9uKSB7Ci0JCWlmKHNlbGVjdGlvbi5pc0VtcHR5KCkpIHsKLQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQl9Ci0JCU9iamVjdCBvID0gVG5nVXRpbC51bndyYXAoc2VsZWN0aW9uLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJaWYobyBpbnN0YW5jZW9mIE5hbWVkRWxlbWVudCkgewotCQkJcmV0dXJuIG5ldyBSZW5hbWVDb21tYW5kKChOYW1lZEVsZW1lbnQpIG8sIG51bGwpOwotCQl9Ci0JCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9ucy5JV29ya2JlbmNoUGFydEFjdGlvbiNzZXRBY3RpdmVXb3JrYmVuY2hQYXJ0KG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFjdGl2ZVdvcmtiZW5jaFBhcnQoSVdvcmtiZW5jaFBhcnQgd29ya2JlbmNoUGFydCkgewotCQlpZih3b3JrYmVuY2hQYXJ0IGluc3RhbmNlb2YgSUVkaXRpbmdEb21haW5Qcm92aWRlcikgewotCQkJZG9tYWluID0gKChJRWRpdGluZ0RvbWFpblByb3ZpZGVyKXdvcmtiZW5jaFBhcnQpLmdldEVkaXRpbmdEb21haW4oKTsKLQkJfQotCQlhY3RpdmVQYXJ0ID0gd29ya2JlbmNoUGFydDsKLQl9CQotCQotCXByaXZhdGUgdm9pZCBzdXBlclJ1bigpIHsKLQkJZmluYWwgTmFtZWRFbGVtZW50IGUgPSAoTmFtZWRFbGVtZW50KSBUbmdVdGlsLnVud3JhcChzZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCkpOwotLy8JCVJlc291cmNlIHJlc291cmNlID0gZS5lUmVzb3VyY2UoKTsKLS8vCQlpZihyZXNvdXJjZSAhPSBudWxsKSB7Ci0vLwkJCW9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlIGZpbGUgPSBXb3Jrc3BhY2VTeW5jaHJvbml6ZXIuZ2V0RmlsZShlLmVSZXNvdXJjZSgpKTsKLS8vCQkJaWYoZmlsZSAhPSBudWxsKSB7Ci0vLwkJCQlSZXBvc2l0b3J5UHJvdmlkZXIgcHJvdmlkZXIgPSBSZXBvc2l0b3J5UHJvdmlkZXIuZ2V0UHJvdmlkZXIoZmlsZS5nZXRQcm9qZWN0KCkpOwotLy8JCQkJaWYocHJvdmlkZXIgIT0gbnVsbCkgewotLy8JCQkJCUlGaWxlSGlzdG9yeVByb3ZpZGVyIGhpc3RvcnlQcm92aWRlciA9IHByb3ZpZGVyLmdldEZpbGVIaXN0b3J5UHJvdmlkZXIoKTsKLS8vCQkJCQlGaWxlTW9kaWZpY2F0aW9uVmFsaWRhdG9yIG1vZFZhbGlkYXRvciA9IHByb3ZpZGVyLmdldEZpbGVNb2RpZmljYXRpb25WYWxpZGF0b3IyKCk7Ci0vLwkJCQkJU3RyaW5nIGlkID0gcHJvdmlkZXIuZ2V0SUQoKTsKLS8vCQkJCQlTdWJzY3JpYmVyIHN1YnNjcmliZXIgPSBwcm92aWRlci5nZXRTdWJzY3JpYmVyKCk7Ci0vLwkJCQkJU3lzdGVtLm91dC5wcmludGxuKGlkKTsKLS8vCQkJCX0KLS8vCQkJfQotLy8JCX0KLQotCQlTaGVsbCBzaGVsbCA9IGFjdGl2ZVBhcnQuZ2V0U2l0ZSgpLmdldFNoZWxsKCk7Ci0JCQotCQkvLyBjaGVjayBpZiBjb250YWluZXIncyByZXNvdXJjZSBjYW4gYmUgbW9kaWZpZWQKLQkJLy8KLQkJaWYgKGUuZUNvbnRhaW5lcigpICE9IG51bGwKLQkJCQkmJiBlLmVDb250YWluZXIoKS5lUmVzb3VyY2UoKSAhPSBlLmVSZXNvdXJjZSgpKSB7Ci0JCQlJU3RhdHVzIHN0YXR1cyA9IFVzZXJJbnRlcmFjdGlvbkhlbHBlci5jaGVja01vZGlmeShlLmVDb250YWluZXIoKSwgc2hlbGwpOwotCQkJaWYgKCFzdGF0dXMuaXNPSygpKSB7Ci0JCQkJQXV0aG9yaW5nVUlQbHVnaW4KLQkJCQkuZ2V0RGVmYXVsdCgpCi0JCQkJLmdldE1zZ0RpYWxvZygpCi0JCQkJLmRpc3BsYXlFcnJvcigKLQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLnJlbmFtZURpYWxvZ190aXRsZSwKLQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLnJlbmFtZURpYWxvZ19yZW5hbWVFcnJvciwKLQkJCQkJCXN0YXR1cyk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0KLQkJZmluYWwgSVZhbGlkYXRvciB2YWxpZGF0b3IgPSBJVmFsaWRhdG9yRmFjdG9yeS5JTlNUQU5DRQotCQkuY3JlYXRlTmFtZVZhbGlkYXRvcihlLCAoKEFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbilkb21haW4pLmdldEFkYXB0ZXJGYWN0b3J5KCkpOwotCQlJSW5wdXRWYWxpZGF0b3IgaW5wdXRWYWxpZGF0b3IgPSBuZXcgSUlucHV0VmFsaWRhdG9yKCkgewotCQkJcHVibGljIFN0cmluZyBpc1ZhbGlkKFN0cmluZyBuZXdUZXh0KSB7Ci0JCQkJaWYgKHZhbGlkYXRvciAhPSBudWxsKSB7Ci0JCQkJCXJldHVybiBVc2VySW50ZXJhY3Rpb25IZWxwZXIKLQkJCQkJLmdldFNpbXBsZUVycm9yTWVzc2FnZSh2YWxpZGF0b3IKLQkJCQkJCQkuaXNWYWxpZChuZXdUZXh0KSk7Ci0JCQkJfQotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9OwotCi0JCWJvb2xlYW4gZ2V0SW5wdXQgPSB0cnVlOwotCQlJbnB1dERpYWxvZyBpbnB1dERsZyA9IG5ldyBJbnB1dERpYWxvZyhEaXNwbGF5LmdldEN1cnJlbnQoKQotCQkJCS5nZXRBY3RpdmVTaGVsbCgpLCBBdXRob3JpbmdVSVJlc291cmNlcy5yZW5hbWVfdGV4dCwKLQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5uZXduYW1lX3RleHQsIGUuZ2V0TmFtZSgpLAotCQkJCWlucHV0VmFsaWRhdG9yKTsKLQkJd2hpbGUgKGdldElucHV0KSB7Ci0JCQlnZXRJbnB1dCA9IGZhbHNlOwotCQkJaWYgKGlucHV0RGxnLm9wZW4oKSA9PSBXaW5kb3cuT0spIHsKLQkJCQlTdHJpbmcgbmV3TmFtZSA9IGlucHV0RGxnLmdldFZhbHVlKCkudHJpbSgpOwotCQkJCWlmKGUgaW5zdGFuY2VvZiBDb250ZW50RWxlbWVudCkgewotCQkJCQluZXdOYW1lID0gU3RyVXRpbC5tYWtlVmFsaWRGaWxlTmFtZShuZXdOYW1lKTsKLQkJCQl9Ci0JCQkJaWYgKCFuZXdOYW1lLmVxdWFscyhlLmdldE5hbWUoKSkpIHsKLQkJCQkJaWYgKGUgaW5zdGFuY2VvZiBNZXRob2RDb25maWd1cmF0aW9uKSB7Ci0JCQkJCQlTdHJpbmdbXSBjb25maWdOYW1lcyA9IExpYnJhcnlTZXJ2aWNlVXRpbAotCQkJCQkJLmdldE1ldGhvZENvbmZpZ3VyYXRpb25OYW1lcyhMaWJyYXJ5U2VydmljZQotCQkJCQkJCQkuZ2V0SW5zdGFuY2UoKQotCQkJCQkJCQkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKSk7Ci0JCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbmZpZ05hbWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQkJaWYgKG5ld05hbWUuZXF1YWxzKGNvbmZpZ05hbWVzW2ldKSkgewotCQkJCQkJCQlBdXRob3JpbmdVSVBsdWdpbgotCQkJCQkJCQkuZ2V0RGVmYXVsdCgpCi0JCQkJCQkJCS5nZXRNc2dEaWFsb2coKQotCQkJCQkJCQkuZGlzcGxheUVycm9yKAotCQkJCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLnJlbmFtZURpYWxvZ190aXRsZSwKLQkJCQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcwotCQkJCQkJCQkJCS5iaW5kKAotCQkJCQkJCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuZHVwbGljYXRlRWxlbWVudE5hbWVFcnJvcl9tc2csCi0JCQkJCQkJCQkJCQluZXdOYW1lKSk7Ci0JCQkJCQkJCWdldElucHV0ID0gdHJ1ZTsKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWlmIChnZXRJbnB1dCA9PSB0cnVlKSB7Ci0JCQkJCQlpbnB1dERsZyA9IG5ldyBJbnB1dERpYWxvZyhEaXNwbGF5LmdldEN1cnJlbnQoKQotCQkJCQkJCQkuZ2V0QWN0aXZlU2hlbGwoKSwKLQkJCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMucmVuYW1lX3RleHQsCi0JCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLm5ld25hbWVfdGV4dCwgZQotCQkJCQkJCQkuZ2V0TmFtZSgpLCBpbnB1dFZhbGlkYXRvcik7Ci0JCQkJCQljb250aW51ZTsKLQkJCQkJfQotCi0JCQkJCWlmIChlIGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luKSB7Ci0JCQkJCQlTdHJpbmcgbXNnID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuYmluZChBdXRob3JpbmdVSVJlc291cmNlcy5tZXRob2RQbHVnaW5EZXNjcmlwdGlvblBhZ2VfY29uZmlybVJlbmFtZSwgKG5ldyBPYmplY3RbXSB7IGUuZ2V0TmFtZSgpLCBuZXdOYW1lIH0pKTsgCi0JCQkJCQlTdHJpbmcgdGl0bGUgPSBBdXRob3JpbmdVSVJlc291cmNlcy5tZXRob2RQbHVnaW5EZXNjcmlwdGlvblBhZ2VfY29uZmlybVJlbmFtZV90aXRsZTsgCi0JCQkJCQlpZiAoIU1lc3NhZ2VEaWFsb2cub3BlbkNvbmZpcm0oc2hlbGwsIHRpdGxlLCBtc2cpKSB7Ci0JCQkJCQkJcmV0dXJuOwotCQkJCQkJfQotCi0JCQkJCQlFZGl0b3JDaG9vc2VyLmdldEluc3RhbmNlKCkuY2xvc2VNZXRob2RFZGl0b3JzRm9yUGx1Z2luRWxlbWVudHMoKE1ldGhvZFBsdWdpbillKTsKLQkJCQkJfQotCQkJCQkKLQkJCQkJUmVuYW1lQ29tbWFuZCByZW5hbWVDbWQgPSAoUmVuYW1lQ29tbWFuZCkgY29tbWFuZDsKLQkJCQkJcmVuYW1lQ21kLnNldE5ld05hbWUobmV3TmFtZSk7Ci0JCQkJCXJlbmFtZUNtZC5zZXRTaGVsbChzaGVsbCk7Ci0JCQkJCXN1cGVyLnJ1bigpOwkJCQkJCi0JCQkJfQotCQkJfQotCQl9Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkNvbW1hbmRBY3Rpb25IYW5kbGVyI3J1bigpCi0JICovCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQlCdXN5SW5kaWNhdG9yLnNob3dXaGlsZShhY3RpdmVQYXJ0LmdldFNpdGUoKQotCQkJCS5nZXRTaGVsbCgpLmdldERpc3BsYXkoKSwgbmV3IFJ1bm5hYmxlKCkgewotCi0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCUxpYnJhcnlMb2NraW5nT3BlcmF0aW9uUnVubmVyIHJ1bm5lciA9IG5ldyBMaWJyYXJ5TG9ja2luZ09wZXJhdGlvblJ1bm5lcigpOwotCQkJCQkJcnVubmVyLnJ1bihuZXcgSVJ1bm5hYmxlV2l0aFByb2dyZXNzKCkgewotCi0JCQkJCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLQkJCQkJCQkJCXRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLAotCQkJCQkJCQkJSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQkJCQkJCQlzdXBlclJ1bigpOwotCQkJCQkJCX0KLQkJCQkJCQkKLQkJCQkJCX0pOwotCQkJCQl9Ci0JCQkKLQkJfSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGRvUmVuYW1lKGZpbmFsIE5hbWVkRWxlbWVudCBlLCBmaW5hbCBTdHJpbmcgbmV3TmFtZSkgewotCQluZXcgUmVuYW1lQ29tbWFuZChlLCBuZXdOYW1lKS5leGVjdXRlKCk7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIGNsYXNzIFJlbmFtZUNvbW1hbmQgZXh0ZW5kcyBBYnN0cmFjdENvbW1hbmQgewkJCi0JCXByaXZhdGUgTmFtZWRFbGVtZW50IGU7Ci0JCXByaXZhdGUgU3RyaW5nIG5ld05hbWU7Ci0JCXByaXZhdGUgU3RyaW5nIG9sZE5hbWU7Ci0JCXByaXZhdGUgU2hlbGwgc2hlbGw7Ci0JCUNvbGxlY3Rpb248UmVzb3VyY2U+IHJlbmFtZWRSZXNvdXJjZXM7Ci0JCQotCQlwdWJsaWMgUmVuYW1lQ29tbWFuZChOYW1lZEVsZW1lbnQgZSwgU3RyaW5nIG5ld05hbWUpIHsKLQkJCXRoaXMuZSA9IGU7Ci0JCQl0aGlzLm5ld05hbWUgPSBuZXdOYW1lOwotCQl9CQkKLQkJCi0JCXB1YmxpYyB2b2lkIHNldE5ld05hbWUoU3RyaW5nIG5ld05hbWUpIHsKLQkJCXRoaXMubmV3TmFtZSA9IG5ld05hbWU7Ci0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIHNldFNoZWxsKFNoZWxsIHNoZWxsKSB7Ci0JCQl0aGlzLnNoZWxsID0gc2hlbGw7Ci0JCX0KLQkJCi0JCXByaXZhdGUgdm9pZCByb2xsYmFjaygpIHsKLQkJCS8vIHJlc3RvcmUgb2xkIG5hbWUKLQkJCS8vCi0JCQlzZXROYW1lKG9sZE5hbWUpOwotCQkJCi0JCQkvLyByZXN0b3JlIG9sZCBsb2NhdGlvbgotCQkJLy8KLQkJCWlmKCFyZW5hbWVkUmVzb3VyY2VzLmlzRW1wdHkoKSkgewotCQkJCWFkanVzdExvY2F0aW9uKHJlbmFtZWRSZXNvdXJjZXMsIG5ldyBBcnJheUxpc3Q8UmVzb3VyY2U+KCkpOwotCQkJfQotCQl9Ci0JCQotCQlwcml2YXRlIHZvaWQgaGFuZGxlUGVyc2lzdGVuY2VFeGNlcHRpb24oRXhjZXB0aW9uIGUxKSB7Ci0JCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZTEpOwotCi0JCQlTdHJpbmcgZGV0YWlscyA9IGUxLmdldE1lc3NhZ2UoKSAhPSBudWxsID8gTWVzc2FnZUZvcm1hdAotCQkJCQkuZm9ybWF0KCI6IHswfSIsIG5ldyBPYmplY3RbXSB7IGUxLmdldE1lc3NhZ2UoKSB9KSA6ICIiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCVN0cmluZyBtc2cgPSBNZXNzYWdlRm9ybWF0LmZvcm1hdCgKLQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuRWxlbWVudHNWaWV3X2Vycl9zYXZpbmcsCi0JCQkJCW5ldyBPYmplY3RbXSB7Ci0JCQkJCQkJZS5lUmVzb3VyY2UoKS5nZXRVUkkoKS50b0ZpbGVTdHJpbmcoKSwKLQkJCQkJCQlkZXRhaWxzIH0pOwotCQkJdGhyb3cgbmV3IE1lc3NhZ2VFeGNlcHRpb24obXNnKTsKLQkJfQotCQkKLQkJcHJpdmF0ZSBJTGlicmFyeVBlcnNpc3Rlci5GYWlsU2FmZU1ldGhvZExpYnJhcnlQZXJzaXN0ZXIgZ2V0UGVyc2lzdGVyKCkgewotCQkJcmV0dXJuIExpYnJhcnlTZXJ2aWNlVXRpbC5nZXRQZXJzaXN0ZXJGb3IoZS5lUmVzb3VyY2UoKSkKLQkJCQkJCS5nZXRGYWlsU2FmZVBlcnNpc3RlcigpOwotCQl9Ci0JCQotCQkvKioKLQkJICogQWRqdXN0cyBsb2NhdGlvbiBvZiBhbGwgYWZmZWN0ZWQgcmVzb3VyY2VzLgotCQkgKiAKLQkJICogQHJldHVybiByZXNvdXJjZXMgd2hvc2UgbG9jYXRpb24gaGFzIGJlZW4gYWRqdXN0ZWQKLQkJICovCi0JCXByaXZhdGUgSVN0YXR1cyBhZGp1c3RMb2NhdGlvbihDb2xsZWN0aW9uPFJlc291cmNlPiByZW5hbWVkUmVzb3VyY2VzKSB7Ci0JCQlDb2xsZWN0aW9uPFJlc291cmNlPiByZXNvdXJjZXNUb1JlbmFtZSA9IG5ldyBBcnJheUxpc3Q8UmVzb3VyY2U+KCk7Ci0JCQlpZiAoZSBpbnN0YW5jZW9mIENvbnRlbnRFbGVtZW50Ci0JCQkJCSYmIENvbnRlbnREZXNjcmlwdGlvbkZhY3RvcnkKLQkJCQkJCQkuaGFzUHJlc2VudGF0aW9uKChNZXRob2RFbGVtZW50KSBlKSkgewotCQkJCXJlc291cmNlc1RvUmVuYW1lLmFkZCgoKENvbnRlbnRFbGVtZW50KSBlKS5nZXRQcmVzZW50YXRpb24oKQotCQkJCQkJLmVSZXNvdXJjZSgpKTsKLQkJCX0KLQkJCXJlc291cmNlc1RvUmVuYW1lLmFkZChlLmVSZXNvdXJjZSgpKTsKLQkJCXJldHVybiBhZGp1c3RMb2NhdGlvbihyZXNvdXJjZXNUb1JlbmFtZSwgcmVuYW1lZFJlc291cmNlcyk7Ci0JCX0KLQkJCi0JCS8qKgotCQkgKiBBZGp1c3RzIGxvY2F0aW9uIG9mIHRoZSBzcGVjaWZpZWQgcmVzb3VyY2VzLgotCQkgKiAKLQkJICogQHJldHVybiByZXNvdXJjZXMgd2hvc2UgbG9jYXRpb24gaGFzIGJlZW4gYWRqdXN0ZWQKLQkJICovCi0JCXByaXZhdGUgSVN0YXR1cyBhZGp1c3RMb2NhdGlvbihDb2xsZWN0aW9uPFJlc291cmNlPiByZXNvdXJjZXNUb1JlbmFtZSwgQ29sbGVjdGlvbjxSZXNvdXJjZT4gcmVuYW1lZFJlc291cmNlcykgewotCQkJRmFpbFNhZmVNZXRob2RMaWJyYXJ5UGVyc2lzdGVyIHBlcnNpc3RlciA9IGdldFBlcnNpc3RlcigpOwotCQkJdHJ5IHsKLQkJCQlmb3IgKFJlc291cmNlIHJlc291cmNlIDogcmVzb3VyY2VzVG9SZW5hbWUpIHsKLQkJCQkJVVJJIG9sZFVSSSA9IHJlc291cmNlLmdldFVSSSgpOwotCQkJCQlwZXJzaXN0ZXIuYWRqdXN0TG9jYXRpb24ocmVzb3VyY2UpOwotCQkJCQlpZighcmVzb3VyY2UuZ2V0VVJJKCkuZXF1YWxzKG9sZFVSSSkpIHsKLQkJCQkJCXJlbmFtZWRSZXNvdXJjZXMuYWRkKHJlc291cmNlKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCXRyeSB7Ci0JCQkJCXBlcnNpc3Rlci5yb2xsYmFjaygpOwotCQkJCX0KLQkJCQljYXRjaChFeGNlcHRpb24gZXgpIHsKLQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCX0KLQkJCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SWQoKSwKLQkJCQkJCWUuZ2V0TWVzc2FnZSgpLCBlKTsKLQkJCX0KLQkJfQkJCi0JCQotCQlwcml2YXRlIHZvaWQgc2V0TmFtZShTdHJpbmcgbmV3TmFtZSkgewotCQkJZS5zZXROYW1lKG5ld05hbWUpOwotCQkJCi0JCQkvLyBTcGVjaWFsIGhhbmRsaW5nIGZvciBQcm9jZXNzQ29tcG9uZW50IHRvIGtlZXAgaXRzCi0JCQkvLyBuYW1lIGFuZCB0aGUgbmFtZSBvZiBpdHMgcHJvY2VzcyBpbiBzeW5jLgotCQkJaWYgKGUgaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50KSB7Ci0JCQkJUHJvY2VzcyBwcm9jID0gKChQcm9jZXNzQ29tcG9uZW50KSBlKS5nZXRQcm9jZXNzKCk7Ci0JCQkJcHJvYy5zZXROYW1lKG5ld05hbWUpOwotCQkJfQotCQl9Ci0KLQkJcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJCW9sZE5hbWUgPSBlLmdldE5hbWUoKTsJCQkKLQkJCXNldE5hbWUobmV3TmFtZSk7Ci0JCQkKLQkJCXJlbmFtZWRSZXNvdXJjZXMgPSBuZXcgQXJyYXlMaXN0PFJlc291cmNlPigpOwotCi0JCQkvLyByZW5hbWUgZmlsZShzKQotCQkJLy8KLQkJCVJ1bm5hYmxlIHJ1bm5hYmxlID0gbmV3IFJ1bm5hYmxlKCkgewotCQkKLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCUlTdGF0dXMgc3RhdHVzID0gYWRqdXN0TG9jYXRpb24ocmVuYW1lZFJlc291cmNlcyk7Ci0JCQkJCWlmKCFzdGF0dXMuaXNPSygpKSB7Ci0JCQkJCQlyb2xsYmFjaygpOwotCQkJCQkJRXhjZXB0aW9uIGV4ID0gKEV4Y2VwdGlvbikgc3RhdHVzLmdldEV4Y2VwdGlvbigpOwotCQkJCQkJdGhyb3cgZXggaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uID8gKFJ1bnRpbWVFeGNlcHRpb24pIGV4IDogbmV3IFdyYXBwZWRFeGNlcHRpb24oZXgpOwotCQkJCQl9Ci0JCQkJCQotCQkJCX0KLQkJCi0JCQl9OwotCQkKLQkJCWJvb2xlYW4gcmVzdWx0ID0gVXNlckludGVyYWN0aW9uSGVscGVyLnJ1bldpdGhQcm9ncmVzcyhydW5uYWJsZSwKLQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuRWxlbWVudHNWaWV3X3JlbmFtaW5nX3RleHQpOwotCQkJaWYoIXJlc3VsdCkgewotCQkJCXJldHVybjsKLQkJCX0KLQkJCQotCQkJSVN0YXR1cyBzdGF0dXMgPSBVc2VySW50ZXJhY3Rpb25IZWxwZXIuY2hlY2tNb2RpZnkoZSwgCi0JCQkJCXNoZWxsID09IG51bGwgPyBNc2dCb3guZ2V0RGVmYXVsdFNoZWxsKCkgOiBzaGVsbCk7Ci0JCQlpZiAoIXN0YXR1cy5pc09LKCkpIHsKLQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkuZGlzcGxheUVycm9yKAotCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMucmVuYW1lRGlhbG9nX3RpdGxlLAotCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMucmVuYW1lRGlhbG9nX3JlbmFtZUVycm9yLAotCQkJCQkJc3RhdHVzKTsKLQkJCQlVc2VySW50ZXJhY3Rpb25IZWxwZXIucnVuV2l0aFByb2dyZXNzKG5ldyBSdW5uYWJsZSgpIHsKLQotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQlyb2xsYmFjaygpOwotCQkJCQl9Ci0JCQkJCQotCQkJCX0sICIiKTsgLy8kTk9OLU5MUy0xJAotCQkJCXJldHVybjsKLQkJCX0KLQkJCQotCQkJLy8gU2F2ZSB0aGUgbW9kaWZpZWQgZmlsZShzKS4KLQkJCS8vCi0JCQlydW5uYWJsZSA9IG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkKLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCS8vIFNhdmUgdGhlIG1vZGlmaWVkIGZpbGUocykuCi0JCQkJCS8vCi0JCQkJCUlMaWJyYXJ5UGVyc2lzdGVyLkZhaWxTYWZlTWV0aG9kTGlicmFyeVBlcnNpc3RlciBwZXJzaXN0ZXIgPSBnZXRQZXJzaXN0ZXIoKTsKLQkJCQkJdHJ5IHsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJcGVyc2lzdGVyLnNhdmUoZS5lUmVzb3VyY2UoKSk7Ci0JCQkJCQkJcGVyc2lzdGVyLmNvbW1pdCgpOwkJCi0JCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZTEpIHsJCQotCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCXBlcnNpc3Rlci5yb2xsYmFjaygpOwotCQkJCQkJCX0KLQkJCQkJCQljYXRjaChFeGNlcHRpb24gZSkgewotCQkJCQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkJCQkJfQotCQkJCQkJCWhhbmRsZVBlcnNpc3RlbmNlRXhjZXB0aW9uKGUxKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQljYXRjaChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCQkJCXJvbGxiYWNrKCk7CQkJCQkJCi0JCQkJCQl0aHJvdyBlOwotCQkJCQl9Ci0JCQkJCQotCQkJCQkvLyBjaGFuZ2UgZGlhZ3JhbSByZXNvdXJjZSBhcyB3ZWxsCi0JCQkJCWlmIChlIGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkgewotCQkJCQkJUHJvY2VzcyBwcm9jID0gKChQcm9jZXNzQ29tcG9uZW50KSBlKS5nZXRQcm9jZXNzKCk7CQotCQkJCQkJRGlhZ3JhbU1hbmFnZXIgbWdyID0gRGlhZ3JhbU1hbmFnZXIuZ2V0SW5zdGFuY2UocHJvYywgdGhpcyk7Ci0JCQkJCQlpZihtZ3IgIT0gbnVsbCkgewotCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCW1nci51cGRhdGVSZXNvdXJjZVVSSSgpOwotCQkJCQkJCX0KLQkJCQkJCQljYXRjaChFeGNlcHRpb24gZSkgewotCQkJCQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkJCQkJfQotCQkJCQkJCWZpbmFsbHkgewotCQkJCQkJCQl0cnkgeyAKLQkJCQkJCQkJCW1nci5yZW1vdmVDb25zdW1lcih0aGlzKTsKLQkJCQkJCQkJfQotCQkJCQkJCQljYXRjaChFeGNlcHRpb24gZSkgewotCQkJCQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJCi0JCQkJCX0KLQkJCQl9Ci0JCQotCQkJfTsKLQkJCVVzZXJJbnRlcmFjdGlvbkhlbHBlci5ydW5XaXRoUHJvZ3Jlc3MocnVubmFibGUsCi0JCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLkVsZW1lbnRzVmlld19yZW5hbWluZ190ZXh0KTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHJlZG8oKSB7Ci0JCQlleGVjdXRlKCk7Ci0JCX0KLQkJCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgYm9vbGVhbiBwcmVwYXJlKCkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkJZSA9IG51bGw7Ci0JCQlzdXBlci5kaXNwb3NlKCk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvU2F2ZVRoaXNBY3Rpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9TYXZlVGhpc0FjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZjZmMDlkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9TYXZlVGhpc0FjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLmltcGwuWE1JUmVzb3VyY2VGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5GaWxlRGlhbG9nOwotCi0vKioKLSAqIEFjdGlvbiBmb3Igc2F2aW5nIHJlc291cmNlcwotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgU2F2ZVRoaXNBY3Rpb24gZXh0ZW5kcyBBY3Rpb24gewotCi0JcHJpdmF0ZSBBcnJheUxpc3Qgc2VsZWN0ZWRPYmplY3RzOwotCi0JcHVibGljIFNhdmVUaGlzQWN0aW9uKCkgewotCQlzdXBlcihBdXRob3JpbmdVSVJlc291cmNlcy5TYXZlVGhpc0FjdGlvbl9zYXZlb2JqZWN0KTsgCi0JfQotCi0JLyoqCi0JICogVXBkYXRlIHNlbGVjdGlvbgotCSAqIEBwYXJhbSBzZWxlY3Rpb24KLQkgKiAJCQlTZWxlY3Rpb24KLQkgKiBAcmV0dXJuIAotCSAqIAkJCWJvb2xlYW4gdmFsdWUgdG8gaW5kaWNhdGUgd2hldGhlciB1cGRhdGUgd2FzIGRvbmUKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB1cGRhdGVTZWxlY3Rpb24oSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCXNlbGVjdGVkT2JqZWN0cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChJdGVyYXRvciBvYmplY3RzID0gc2VsZWN0aW9uLml0ZXJhdG9yKCk7IG9iamVjdHMuaGFzTmV4dCgpOykgewotCQkJc2VsZWN0ZWRPYmplY3RzLmFkZChBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW4udW53cmFwKG9iamVjdHMKLQkJCQkJLm5leHQoKSkpOwotCQl9Ci0KLQkJcmV0dXJuIHNlbGVjdGVkT2JqZWN0cy5zaXplKCkgPT0gMQotCQkJCSYmIHNlbGVjdGVkT2JqZWN0cy5nZXQoMCkgaW5zdGFuY2VvZiBFT2JqZWN0OwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24jcnVuKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCWlmIChzZWxlY3RlZE9iamVjdHMgPT0gbnVsbCB8fCBzZWxlY3RlZE9iamVjdHMuaXNFbXB0eSgpKQotCQkJcmV0dXJuOwotCQlGaWxlRGlhbG9nIGZkID0gbmV3IEZpbGVEaWFsb2coRGlzcGxheS5nZXRDdXJyZW50KCkuZ2V0QWN0aXZlU2hlbGwoKSwKLQkJCQlTV1QuU0FWRSk7Ci0JCVN0cmluZyBwYXRoID0gZmQub3BlbigpOwotCQlpZiAocGF0aCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlVUkkgZmlsZVVSSSA9IFVSSS5jcmVhdGVGaWxlVVJJKHBhdGgpOwotCQkvLyBDcmVhdGUgdGhlIHJlc291cmNlIHRvIHBlcnNpc3QgdGhlIG1vZGVsLgotCQlSZXNvdXJjZSByZXMgPSBuZXcgWE1JUmVzb3VyY2VGYWN0b3J5SW1wbCgpLmNyZWF0ZVJlc291cmNlKGZpbGVVUkkpOwotCQlPYmplY3Qgb2JqID0gc2VsZWN0ZWRPYmplY3RzLmdldCgwKTsKLQkJcmVzLmdldENvbnRlbnRzKCkuYWRkKChFT2JqZWN0KSBvYmopOwotCQl0cnkgewotCQkJcmVzLnNhdmUoQ29sbGVjdGlvbnMuRU1QVFlfTUFQKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL1Nob3dQcmVzZW50YXRpb25OYW1lcy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL1Nob3dQcmVzZW50YXRpb25OYW1lcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZGNmNTE3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9TaG93UHJlc2VudGF0aW9uTmFtZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudmlld3MuTGlicmFyeVZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5QcmVzZW50YXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JVmlld0FjdGlvbkRlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklWaWV3UGFydDsKLQotLyoqCi0gKiBTaG93IFByZXNlbnRhdGlvbiBuYW1lcyBpbiBsaWJyYXJ5IHZpZXcKLSAqIAotICogQGF1dGhvciBKZWZmIEhhcmR5Ci0gKiBAc2luY2UgMS4wCi0gKgotICovCi1wdWJsaWMgY2xhc3MgU2hvd1ByZXNlbnRhdGlvbk5hbWVzIGltcGxlbWVudHMgSVZpZXdBY3Rpb25EZWxlZ2F0ZSB7Ci0KLQlwcml2YXRlIExpYnJhcnlWaWV3IHRhcmdldFZpZXc7Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklWaWV3QWN0aW9uRGVsZWdhdGUjaW5pdChvcmcuZWNsaXBzZS51aS5JVmlld1BhcnQpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJVmlld1BhcnQgdmlldykgewotCQl0YXJnZXRWaWV3ID0gKExpYnJhcnlWaWV3KSB2aWV3OwotCi0JfQotCi0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklBY3Rpb25EZWxlZ2F0ZSNydW4ob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24pCi0JICovCi0JcHVibGljIHZvaWQgcnVuKElBY3Rpb24gYWN0aW9uKSB7Ci0JCVByZXNlbnRhdGlvbkNvbnRleHQuSU5TVEFOQ0Uuc2V0U2hvd1ByZXNlbnRhdGlvbk5hbWVzKCFQcmVzZW50YXRpb25Db250ZXh0LklOU1RBTkNFLmlzU2hvd1ByZXNlbnRhdGlvbk5hbWVzKCkpOwotCQl0YXJnZXRWaWV3LmdldFZpZXdlcigpLnJlZnJlc2goKTsKLQl9Ci0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklBY3Rpb25EZWxlZ2F0ZSNzZWxlY3Rpb25DaGFuZ2VkKG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uLCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb24pCi0JICovCi0JcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChJQWN0aW9uIGFjdGlvbiwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9TeW5jaHJvbml6YXRpb25BY3Rpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9TeW5jaHJvbml6YXRpb25BY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjQ2NTViZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvU3luY2hyb25pemF0aW9uQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkud2l6YXJkcy5TeW5jaHJvbml6YXRpb25DaG9pY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkud2l6YXJkcy5TeW5jaHJvbml6YXRpb25XaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZC5TeW5jaHJvbml6ZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuYWN0aW9ucy5MaWJyYXJ5TG9ja2luZ09wZXJhdGlvblJ1bm5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVXaXRoUHJvZ3Jlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZERpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotCi0vKioKLSAqIFN5bmNocm9uaXphaXRvbiBhY3Rpb24gZm9yIHByb2Nlc3MgZWxlbWVudHMuIFN5bmNocm9uaXphdGlvbiB0YWtlcyBwbGFjZSBmcm9tIG1ldGhvZAotICogZWxlbWVudCB0byBwcm9jZXNzIGVsZW1lbnRzCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTGUKLSAqIEBzaW5jZSAxLjAKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBTeW5jaHJvbml6YXRpb25BY3Rpb24gZXh0ZW5kcyBQcm9jZXNzQXV0b1N5bmNocm9uaXplQWN0aW9uIAotaW1wbGVtZW50cyBJV29ya2JlbmNoUGFydEFjdGlvbgotewotCi0JcHJpdmF0ZSBQcm9jZXNzIHNlbGVjdGVkUHJvY2VzczsKLQkKLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlCi0JICoKLQkgKi8KLQlwdWJsaWMgU3luY2hyb25pemF0aW9uQWN0aW9uKCkgewotCQlzdXBlcihMaWJyYXJ5RWRpdFJlc291cmNlcy5NYW51YWxTeW5jaHJvbml6ZUNvbW1hbmRfbGFiZWwpOyAKLQl9Ci0JCi0JLyoKLQkgKiBTZXQgUHJvY2VzcwotCSAqLwotCXB1YmxpYyB2b2lkIHNldFByb2Nlc3MoUHJvY2VzcyBhUHJvY2VzcykgewotCQl0aGlzLnNlbGVjdGVkUHJvY2VzcyA9IGFQcm9jZXNzOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgc3VwZXJSdW4oKSB7Ci0JCXN1cGVyLnJ1bigpOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5Db21tYW5kQWN0aW9uSGFuZGxlciNydW4oKQotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJTGlicmFyeUxvY2tpbmdPcGVyYXRpb25SdW5uZXIgcnVubmVyID0gbmV3IExpYnJhcnlMb2NraW5nT3BlcmF0aW9uUnVubmVyKCk7Ci0JCXJ1bm5lci5ydW4obmV3IElSdW5uYWJsZVdpdGhQcm9ncmVzcygpIHsKLQotCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJCQlTeW5jaHJvbml6YXRpb25DaG9pY2VzIGNob2ljZXMgPSBuZXcgU3luY2hyb25pemF0aW9uQ2hvaWNlcygpOwotCQkJCWNob2ljZXMuc2V0U2VsZWN0ZWRQcm9jZXNzKHNlbGVjdGVkUHJvY2Vzcyk7Ci0JCQkJCi0JCQkJLy8gSW5zdGFudGlhdGUgYW5kIGluaXRpYWxpemUgdGhlIHdpemFyZC4KLQkJCQlTeW5jaHJvbml6YXRpb25XaXphcmQgd2l6YXJkID0gbmV3IFN5bmNocm9uaXphdGlvbldpemFyZChjaG9pY2VzKTsKLQotCQkJCS8vIEluc3RhbnRpYXRlIHRoZSB3aXphcmQgY29udGFpbmVyIHdpdGggdGhlIHdpemFyZCBhbmQgb3BlbiBpdC4KLQkJCQlXaXphcmREaWFsb2cgZGlhbG9nID0gbmV3IFdpemFyZERpYWxvZyhEaXNwbGF5LmdldEN1cnJlbnQoKS5nZXRBY3RpdmVTaGVsbCgpLCAKLQkJCQkJCQkJCQkJd2l6YXJkKTsKLQkJCQlkaWFsb2cuY3JlYXRlKCk7Ci0JCQkJZGlhbG9nLm9wZW4oKTsJCi0vLwkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIiQkJCBERUJVRzogIiArIGNob2ljZXMpOyAvLyROT04tTkxTLTEkCi0JCQkJCi0JCQkJaWYgKCFjaG9pY2VzLmlzRmluaXNoUHJlc3NlZCgpKQotCQkJCQlyZXR1cm47Ci0JCQkJCi0JCQkJLy8gU2V0IHN5bmNoRmVhdHVyZXMgJ3N5bmNGZWF0dXJlU2V0JwotCQkJCUhhc2hTZXQgc3luY0ZlYXR1cmVTZXQgPSBuZXcgSGFzaFNldCgpOwotCQkJCWFkZENob2ljZXNUb1NldChzeW5jRmVhdHVyZVNldCwgY2hvaWNlcyk7Ci0JCQkJLy8gTWV0aG9kIGNvbmZpZyBjYW4gYmUgb2J0YWluZWQgYnkgJ2Nob2ljZXMuZ2V0U2VsZWN0ZWRDb25maWcoKScKLQkJCQkKLQkJCQlTeW5jaHJvbml6ZUNvbW1hbmQgY21kID0gKFN5bmNocm9uaXplQ29tbWFuZCljb21tYW5kOwotCQkJCWNtZC5zZXRNZXRob2RDb25maWd1cmF0aW9uKGNob2ljZXMuZ2V0U2VsZWN0ZWRDb25maWcoKSk7Ci0JCQkJY21kLnNldFN5bmNocm9uaXphdGlvbkZlYXR1cmVzKHN5bmNGZWF0dXJlU2V0KTsKLQkJCQkKLQkJCQlzdXBlclJ1bigpOwotCQkJfQotCQl9KTsKLQkJCi0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZENob2ljZXNUb1NldChIYXNoU2V0IHN5bmNTZXQsIFN5bmNocm9uaXphdGlvbkNob2ljZXMgY2hvaWNlcykgewotCQlpZiAoY2hvaWNlcy5nZXRTeW5jTmFtZSgpID09IFN5bmNocm9uaXphdGlvbkNob2ljZXMuU1lOQ19GUk9NX0NPTlRFTlQpewotCQkJc3luY1NldC5hZGQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TmFtZWRFbGVtZW50X05hbWUoKSk7Ci0JCX0KLQkJaWYgKGNob2ljZXMuZ2V0U3luY1ByZXNOYW1lKCkgPT0gU3luY2hyb25pemF0aW9uQ2hvaWNlcy5TWU5DX0ZST01fQ09OVEVOVCl7Ci0JCQlzeW5jU2V0LmFkZChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRNZXRob2RFbGVtZW50X1ByZXNlbnRhdGlvbk5hbWUoKSk7Ci0JCX0KLQkJaWYgKGNob2ljZXMuZ2V0U3luY0JyaWVmRGVzYygpID09IFN5bmNocm9uaXphdGlvbkNob2ljZXMuU1lOQ19GUk9NX0NPTlRFTlQpewotCQkJc3luY1NldC5hZGQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWV0aG9kRWxlbWVudF9CcmllZkRlc2NyaXB0aW9uKCkpOwotCQl9Ci0JCWlmIChjaG9pY2VzLmdldFN5bmNPcHRJbnB1dCgpID09IFN5bmNocm9uaXphdGlvbkNob2ljZXMuU1lOQ19GUk9NX0NPTlRFTlQpewotCQkJc3luY1NldC5hZGQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza19PcHRpb25hbElucHV0KCkpOwotCQl9Ci0JCWlmIChjaG9pY2VzLmdldFN5bmNNYW5JbnB1dCgpID09IFN5bmNocm9uaXphdGlvbkNob2ljZXMuU1lOQ19GUk9NX0NPTlRFTlQpewotCQkJc3luY1NldC5hZGQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza19NYW5kYXRvcnlJbnB1dCgpKTsKLQkJfQotCQlpZiAoY2hvaWNlcy5nZXRTeW5jT3V0cHV0KCkgPT0gU3luY2hyb25pemF0aW9uQ2hvaWNlcy5TWU5DX0ZST01fQ09OVEVOVCl7Ci0JCQlzeW5jU2V0LmFkZChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrX091dHB1dCgpKTsKLQkJfQotCQlpZiAoY2hvaWNlcy5nZXRTeW5jUHJpbVBlcmZvcm1lcigpID09IFN5bmNocm9uaXphdGlvbkNob2ljZXMuU1lOQ19GUk9NX0NPTlRFTlQpewotCQkJc3luY1NldC5hZGQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza19QZXJmb3JtZWRCeSgpKTsKLQkJfQotCQlpZiAoY2hvaWNlcy5nZXRTeW5jQWRkblBlcmZvcm1lcigpID09IFN5bmNocm9uaXphdGlvbkNob2ljZXMuU1lOQ19GUk9NX0NPTlRFTlQpewotCQkJc3luY1NldC5hZGQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza19BZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSgpKTsKLQkJfQotCQlpZiAoY2hvaWNlcy5nZXRTeW5jUmVzcFJvbGUoKSA9PSBTeW5jaHJvbml6YXRpb25DaG9pY2VzLlNZTkNfRlJPTV9DT05URU5UKXsKLQkJCXN5bmNTZXQuYWRkKFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFJvbGVfUmVzcG9uc2libGVGb3IoKSk7Ci0JCX0KLQkJaWYgKGNob2ljZXMuZ2V0U3luY0NvbnRBcnRpZmFjdCgpID09IFN5bmNocm9uaXphdGlvbkNob2ljZXMuU1lOQ19GUk9NX0NPTlRFTlQpewotCQkJc3luY1NldC5hZGQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QXJ0aWZhY3RfQ29udGFpbmVkQXJ0aWZhY3RzKCkpOwotCQl9Ci0JCWlmIChjaG9pY2VzLmdldFN5bmNEZWxpdlBhcnQoKSA9PSBTeW5jaHJvbml6YXRpb25DaG9pY2VzLlNZTkNfRlJPTV9DT05URU5UKXsKLQkJCXN5bmNTZXQuYWRkKFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldERlbGl2ZXJhYmxlX0RlbGl2ZXJlZFdvcmtQcm9kdWN0cygpKTsKLQkJfQotCQlpZiAoY2hvaWNlcy5nZXRTeW5jU2VsU3RlcCgpID09IFN5bmNocm9uaXphdGlvbkNob2ljZXMuU1lOQ19GUk9NX0NPTlRFTlQpewotCQkJc3luY1NldC5hZGQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza19TdGVwcygpKTsKLQkJfQotCQlpZiAoY2hvaWNlcy5nZXRTeW5jR3VpZGFuY2UoKSA9PSBTeW5jaHJvbml6YXRpb25DaG9pY2VzLlNZTkNfRlJPTV9DT05URU5UKSB7Ci0JCQlzeW5jU2V0LmFkZChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb250ZW50RWxlbWVudF9DaGVja2xpc3RzKCkpOwotCQkJc3luY1NldC5hZGQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29udGVudEVsZW1lbnRfQ29uY2VwdHNBbmRQYXBlcnMoKSk7Ci0JCQlzeW5jU2V0LmFkZChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb250ZW50RWxlbWVudF9FeGFtcGxlcygpKTsKLQkJCXN5bmNTZXQuYWRkKFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbnRlbnRFbGVtZW50X0d1aWRlbGluZXMoKSk7Ci0JCQlzeW5jU2V0LmFkZChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb250ZW50RWxlbWVudF9Bc3NldHMoKSk7Ci0JCQlzeW5jU2V0LmFkZChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb250ZW50RWxlbWVudF9TdXBwb3J0aW5nTWF0ZXJpYWxzKCkpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL1VuYXNzaWduQWN0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvVW5hc3NpZ25BY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGZkOWQ3Yi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvVW5hc3NpZ25BY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zLkxpYnJhcnlWaWV3U2ltcGxlQWN0aW9uLkN1c3RvbWVDYXRlZ29yeUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkN1c3RvbUNhdGVnb3J5QXNzaWduUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnZpZXdzLkxpYnJhcnlWaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudWkuVXNlckludGVyYWN0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnNlcnZpY2VzLkxpYnJhcnlNb2RpZmljYXRpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DdXN0b21DYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotCi0vKioKLSAqIFVuYXNzaWduIG1ldGhvZCBlbGVtZW50LgotICogCi0gKiBAYXV0aG9yIFdlaXBpbmcgTHUKLSAqIEBzaW5jZSAgMS41Ci0gKi8KLXB1YmxpYyBjbGFzcyBVbmFzc2lnbkFjdGlvbiBleHRlbmRzIEN1c3RvbWVDYXRlZ29yeUFjdGlvbiB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlCi0JICogQHBhcmFtIHRleHQKLQkgKi8KLQlwdWJsaWMgVW5hc3NpZ25BY3Rpb24oTGlicmFyeVZpZXcgbGliVmlldykgewotCQlzdXBlcihsaWJWaWV3LCBBdXRob3JpbmdVSVJlc291cmNlcy51bmFzc2lnbkFjdGlvbl90ZXh0KTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgZG9SdW4oKSB7Ci0JCWlmICghIGNoZWNrTW9kaWZ5KCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQlDb2xsZWN0aW9uPFJlc291cmNlPiByZXNvdWNlVG9TYXZlID0gZG9SdW5CZWZvcmVTYXZlKCk7Ci0JCXNhdmUocmVzb3VjZVRvU2F2ZSk7Ci0JfQotCQotCS8qKgotCSAqIEByZXR1cm4gcmVzb3VyY2VzIHRvIHNhdmUKLQkgKi8KLQlwcml2YXRlIENvbGxlY3Rpb248UmVzb3VyY2U+IGRvUnVuQmVmb3JlU2F2ZSgpIHsKLQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBnZXRMaWJyYXJ5VmlldygpLmdldFNlbGVjdGlvbigpOwotCQlPYmplY3QgZWxlbWVudCA9IHNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJZWxlbWVudCA9IFRuZ1V0aWwudW53cmFwKGVsZW1lbnQpOwotCi0JCWlmICghKGVsZW1lbnQgaW5zdGFuY2VvZiBDdXN0b21DYXRlZ29yeSkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJQ3VzdG9tQ2F0ZWdvcnkgY2F0ZWdvcnkgPSAoQ3VzdG9tQ2F0ZWdvcnkpIGVsZW1lbnQ7Ci0KLQkJRU9iamVjdCBjb250YWluZXIgPSBjYXRlZ29yeS5lQ29udGFpbmVyKCk7Ci0JCUlTdGF0dXMgc3RhdHVzID0gVXNlckludGVyYWN0aW9uSGVscGVyLmNoZWNrTW9kaWZ5KGNvbnRhaW5lciwKLQkJCQlnZXRMaWJyYXJ5VmlldygpLmdldFNpdGUoKS5nZXRTaGVsbCgpKTsKLQkJaWYgKGNvbnRhaW5lciAhPSBudWxsICYmICFzdGF0dXMuaXNPSygpKSB7Ci0JCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkuZGlzcGxheUVycm9yKAotCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5lcnJvckRpYWxvZ190aXRsZSwKLQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuZXJyb3JEaWFsb2dfbW92ZUVycm9yLCBzdGF0dXMpOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJCi0JCU9iamVjdCBwYXJlbnQgPSBnZXRTZWxlY3Rpb25QYXJlbnRPYmplY3QoKTsKLQkJaWYgKCEgKHBhcmVudCBpbnN0YW5jZW9mIEN1c3RvbUNhdGVnb3J5KSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJQ3VzdG9tQ2F0ZWdvcnkgcGFyZW50Q2MgPSAoQ3VzdG9tQ2F0ZWdvcnkpIHBhcmVudDsJCQkJCQkKLQkJdW5hc3NpZ24oZ2V0TGlicmFyeVZpZXcoKS5nZXRTaXRlKCkuZ2V0U2hlbGwoKSwgZWxlbWVudCwgcGFyZW50Q2MsIG5ldyBBcnJheUxpc3QoKSk7Ci0JCQotCQlyZXR1cm4gQ29sbGVjdGlvbnMuc2luZ2xldG9uKHBhcmVudENjLmVSZXNvdXJjZSgpKTsKLQkJCi0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHVuYXNzaWduKFNoZWxsIHNoZWxsLCBmaW5hbCBPYmplY3QgZWxlbWVudCwgZmluYWwgQ3VzdG9tQ2F0ZWdvcnkgcGFyZW50Q2MsIGZpbmFsIEFycmF5TGlzdCB1c2VkQ2F0ZWdvcmllcykgewotCQlmaW5hbCBMaWJyYXJ5TW9kaWZpY2F0aW9uSGVscGVyIGhlbHBlciA9IG5ldyBMaWJyYXJ5TW9kaWZpY2F0aW9uSGVscGVyKCk7Ci0JCWZpbmFsIEFycmF5TGlzdCBlbGVtZW50cyAgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWVsZW1lbnRzLmFkZChlbGVtZW50KTsKLQkJCi0JCXNoZWxsLmdldERpc3BsYXkoKS5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJQ3VzdG9tQ2F0ZWdvcnlBc3NpZ25QYWdlLnJlbW92ZUl0ZW1zRnJvbU1vZGVsMShlbGVtZW50cywgcGFyZW50Q2MsIHVzZWRDYXRlZ29yaWVzLAotCQkJCQkJaGVscGVyLmdldEFjdGlvbk1hbmFnZXIoKSwgQ3VzdG9tQ2F0ZWdvcnlBc3NpZ25QYWdlLmdldEFuY2VzdG9ycyhwYXJlbnRDYykpOwotCQkJfQotCQl9KTsKLQotCQkKLQkJCi0JfQotCQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvVXBkYXRlU3VwcHJlc3Npb25Gcm9tQmFzZUFjdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL1VwZGF0ZVN1cHByZXNzaW9uRnJvbUJhc2VBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzQ2OTQ4YS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvVXBkYXRlU3VwcHJlc3Npb25Gcm9tQmFzZUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uSUVkaXRpbmdEb21haW5Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uQ29tbWFuZEFjdGlvbkhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuUHJvY2Vzc0VkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZC5VcGRhdGVTdXBwcmVzc2lvbkZyb21CYXNlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuUHJvY2Vzc1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlN1cHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQnVzeUluZGljYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLQotLyoqCi0gKiBVcGRhdGUgc3VwcHJlc3Npb24gaW5mb3JtYXRpb24gZnJvbSBiYXNlIGVsZW1lbnRzCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgIDEuMAotICovCi1wdWJsaWMgY2xhc3MgVXBkYXRlU3VwcHJlc3Npb25Gcm9tQmFzZUFjdGlvbiBleHRlbmRzCi0JCUNvbW1hbmRBY3Rpb25IYW5kbGVyIGltcGxlbWVudHMgSVdvcmtiZW5jaFBhcnRBY3Rpb24sIElNb2RpZnlpbmdBY3Rpb24gewotCi0JcHJpdmF0ZSBQcm9jZXNzRWRpdG9yIGVkaXRvcjsKLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2UKLQkgKiBAcGFyYW0gdGV4dAotCSAqLwotCXB1YmxpYyBVcGRhdGVTdXBwcmVzc2lvbkZyb21CYXNlQWN0aW9uKFN0cmluZyB0ZXh0KSB7Ci0JCXN1cGVyKG51bGwsIHRleHQpOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlCi0JICoKLQkgKi8KLQlwdWJsaWMgVXBkYXRlU3VwcHJlc3Npb25Gcm9tQmFzZUFjdGlvbigpIHsKLQkJdGhpcyhBdXRob3JpbmdVSVJlc291cmNlcy5Qcm9jZXNzRWRpdG9yX3VwZGF0ZVN1cHByZXNzaW9uRnJvbUJhc2VBY3Rpb25fbGFiZWwpOyAKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uQ29tbWFuZEFjdGlvbkhhbmRsZXIjdXBkYXRlU2VsZWN0aW9uKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb24pCi0JICovCi0JcHVibGljIGJvb2xlYW4gdXBkYXRlU2VsZWN0aW9uKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlBcnJheUxpc3Q8T2JqZWN0PiBsaXN0ID0gbmV3IEFycmF5TGlzdDxPYmplY3Q+KCk7Ci0JCWZvciAoSXRlcmF0b3I8Pz4gaXRlciA9IHNlbGVjdGlvbi5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gaXRlci5uZXh0KCk7Ci0JCQlpZihTdXBwcmVzc2lvbi5pc1ZhbGlkKGVsZW1lbnQpKSB7Ci0JCQkJbGlzdC5hZGQoZWxlbWVudCk7Ci0JCQl9Ci0JCX0KLQkJaWYobGlzdC5pc0VtcHR5KCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlpZihsaXN0LnNpemUoKSA9PSAxICYmIAotCQkJCVByb2Nlc3NVdGlsLmlzUm9sbGVkVXBEZXNjcmlwdG9yKGxpc3QuZ2V0KDApLCAoKEFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbilkb21haW4pLmdldEFkYXB0ZXJGYWN0b3J5KCkpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLnVwZGF0ZVNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihsaXN0KSk7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkNvbW1hbmRBY3Rpb25IYW5kbGVyI2NyZWF0ZUNvbW1hbmQoamF2YS51dGlsLkNvbGxlY3Rpb24pCi0JICovCi0JcHVibGljIENvbW1hbmQgY3JlYXRlQ29tbWFuZChDb2xsZWN0aW9uPD8+IHNlbGVjdGlvbikgewotCQlyZXR1cm4gbmV3IFVwZGF0ZVN1cHByZXNzaW9uRnJvbUJhc2VDb21tYW5kKGdldFRleHQoKSwgc2VsZWN0aW9uLCBlZGl0b3IuZ2V0QWRhcHRlckZhY3RvcnkoKSwgZWRpdG9yLmdldFN1cHByZXNzaW9uKCkpIHsKLQkJCS8qIChub24tSmF2YWRvYykKLQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQuVXBkYXRlU3VwcHJlc3Npb25Gcm9tQmFzZUNvbW1hbmQjZXhlY3V0ZSgpCi0JCQkgKi8KLQkJCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCQkJc3VwZXIuZXhlY3V0ZSgpOwotCQkJCQotCQkJCWlmKCFnZXRBZmZlY3RlZE9iamVjdHMoKS5pc0VtcHR5KCkpIHsKLQkJCQkJZWRpdG9yLnJlZnJlc2hBbGxQcm9jZXNzRWRpdG9ycygpOwotCQkJCX0KLQkJCX0KLQkJCQotCQkJLyogKG5vbi1KYXZhZG9jKQotCQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZC5VcGRhdGVTdXBwcmVzc2lvbkZyb21CYXNlQ29tbWFuZCN1bmRvKCkKLQkJCSAqLwotCQkJcHVibGljIHZvaWQgdW5kbygpIHsKLQkJCQlzdXBlci51bmRvKCk7Ci0JCQkJCi0JCQkJaWYoIWdldEFmZmVjdGVkT2JqZWN0cygpLmlzRW1wdHkoKSkgewotCQkJCQllZGl0b3IucmVmcmVzaEFsbFByb2Nlc3NFZGl0b3JzKCk7Ci0JCQkJfQotCQkJfQotCQl9OwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zLklXb3JrYmVuY2hQYXJ0QWN0aW9uI3NldEFjdGl2ZVdvcmtiZW5jaFBhcnQob3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQpCi0JICovCi0JcHVibGljIHZvaWQgc2V0QWN0aXZlV29ya2JlbmNoUGFydChJV29ya2JlbmNoUGFydCB3b3JrYmVuY2hQYXJ0KSB7Ci0JCWlmKHdvcmtiZW5jaFBhcnQgaW5zdGFuY2VvZiBJRWRpdGluZ0RvbWFpblByb3ZpZGVyKSB7Ci0JCQlkb21haW4gPSAoKElFZGl0aW5nRG9tYWluUHJvdmlkZXIpd29ya2JlbmNoUGFydCkuZ2V0RWRpdGluZ0RvbWFpbigpOwotCQl9Ci0JCWlmKHdvcmtiZW5jaFBhcnQgaW5zdGFuY2VvZiBQcm9jZXNzRWRpdG9yKSB7Ci0JCQllZGl0b3IgPSAoUHJvY2Vzc0VkaXRvcikgd29ya2JlbmNoUGFydDsKLQkJfQkJCi0JCWVsc2UgaWYod29ya2JlbmNoUGFydCA9PSBudWxsKSB7Ci0JCQllZGl0b3IgPSBudWxsOwotCQl9Ci0JfQkKLQkKLQlwcml2YXRlIHZvaWQgc3VwZXJSdW4oKSB7Ci0JCXN1cGVyLnJ1bigpOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5Db21tYW5kQWN0aW9uSGFuZGxlciNydW4oKQotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJQnVzeUluZGljYXRvci5zaG93V2hpbGUoZWRpdG9yLmdldEVkaXRvclNpdGUoKQotCQkJCS5nZXRTaGVsbCgpLmdldERpc3BsYXkoKSwgbmV3IFJ1bm5hYmxlKCkgewotCi0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCXN1cGVyUnVuKCk7Ci0JCQkJCX0KLQkJCQotCQl9KTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvVXNlckludGVyYWN0aW9uSGFuZGxlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL1VzZXJJbnRlcmFjdGlvbkhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzQxNzk2NS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvVXNlckludGVyYWN0aW9uSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkud2l6YXJkcy5OZXdDb25maWd1cmF0aW9uV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udWkudXRpbC5FcnJvckRpYWxvZ05vUmVhc29uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udWkudXRpbC5Nc2dCb3g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklVc2VySW50ZXJhY3Rpb25IYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5NZXRob2RFbGVtZW50Q3JlYXRlQ2hpbGRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5Vc2VySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuTGlicmFyeVVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLmRpYWxvZ3MuVW5jYW5jZWxhYmxlTGlzdFNlbGVjdGlvbkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5kaWFsb2dzLlVzZXJJbnB1dHNEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkucHJvdmlkZXJzLkRlbGVnYXRlTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklJbnB1dFZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklucHV0RGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLlByb2dyZXNzTW9uaXRvckRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uSVJ1bm5hYmxlQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkFycmF5Q29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmREaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5FbGVtZW50TGlzdFNlbGVjdGlvbkRpYWxvZzsKLQotLyoqCi0gKiBJbXBsZW1lbnRzIGhhbmRsaW5nIG9mIHVzZXIgaW50ZXJhY3Rpb24gZHVyaW5nIGNvbW1hbmQgZXhlY3V0aW9uCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBVc2VySW50ZXJhY3Rpb25IYW5kbGVyIGltcGxlbWVudHMgSVVzZXJJbnRlcmFjdGlvbkhhbmRsZXIgewotCi0JcHJpdmF0ZSBTaGVsbCBzaGVsbDsKLQotCXByaXZhdGUgSU1lc3NlbmdlciBtZXNzZW5nZXIgPSBuZXcgSU1lc3NlbmdlcigpIHsKLQotCQkvKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JVXNlckludGVyYWN0aW9uSGFuZGxlci5JTWVzc2VuZ2VyI3Nob3dXYXJuaW5nKGphdmEubGFuZy5TdHJpbmcsCi0JCSAqICAgICAgamF2YS5sYW5nLlN0cmluZykKLQkJICovCi0JCXB1YmxpYyB2b2lkIHNob3dXYXJuaW5nKGZpbmFsIFN0cmluZyB0aXRsZSwgZmluYWwgU3RyaW5nIG1zZykgewotCQkJaWYgKERpc3BsYXkuZ2V0Q3VycmVudCgpID09IG51bGwpIHsKLQkJCQkvLyBjdXJyZW50IHRocmVhZCBpcyBub3QgYSB1c2VyLWludGVyZmFjZSB0aHJlYWQKLQkJCQkvLwotCQkJCURpc3BsYXkuZ2V0RGVmYXVsdCgpLnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQlMaWJyYXJ5VUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpCi0JCQkJCQkJCS5kaXNwbGF5V2FybmluZyh0aXRsZSwgbXNnKTsKLQkJCQkJfQotCi0JCQkJfSk7Ci0JCQl9IGVsc2UgewotCQkJCUxpYnJhcnlVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkuZGlzcGxheVdhcm5pbmcoCi0JCQkJCQl0aXRsZSwgbXNnKTsKLQkJCX0KLQkJfQotCi0JCS8qCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklVc2VySW50ZXJhY3Rpb25IYW5kbGVyLklNZXNzZW5nZXIjc2hvd0Vycm9yKGphdmEubGFuZy5TdHJpbmcsCi0JCSAqICAgICAgamF2YS5sYW5nLlN0cmluZywgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXMpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBzaG93RXJyb3IoZmluYWwgU3RyaW5nIHRpdGxlLCBmaW5hbCBTdHJpbmcgbXNnLAotCQkJCWZpbmFsIElTdGF0dXMgc3RhdHVzKSB7Ci0JCQlpZiAoc3RhdHVzID09IG51bGwpIHsKLQkJCQlzaG93RXJyb3IodGl0bGUsIG1zZyk7Ci0JCQl9IGVsc2UgewotCQkJCWlmIChEaXNwbGF5LmdldEN1cnJlbnQoKSA9PSBudWxsKSB7Ci0JCQkJCS8vIGN1cnJlbnQgdGhyZWFkIGlzIG5vdCBhIHVzZXItaW50ZXJmYWNlIHRocmVhZAotCQkJCQkvLwotCQkJCQlEaXNwbGF5LmdldERlZmF1bHQoKS5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0KLQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQlMaWJyYXJ5VUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpCi0JCQkJCQkJCQkuZGlzcGxheUVycm9yKHRpdGxlLCBtc2csIHN0YXR1cyk7Ci0JCQkJCQl9Ci0KLQkJCQkJfSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJTGlicmFyeVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKS5kaXNwbGF5RXJyb3IoCi0JCQkJCQkJdGl0bGUsIG1zZywgc3RhdHVzKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQkvKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JVXNlckludGVyYWN0aW9uSGFuZGxlci5JTWVzc2VuZ2VyI3Nob3dFcnJvcihqYXZhLmxhbmcuU3RyaW5nLAotCQkgKiAgICAgIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5FeGNlcHRpb24pCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBzaG93RXJyb3IoZmluYWwgU3RyaW5nIHRpdGxlLCBmaW5hbCBTdHJpbmcgbXNnLAotCQkJCWZpbmFsIFN0cmluZyByZWFzb24sIGZpbmFsIEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLQkJCWlmIChEaXNwbGF5LmdldEN1cnJlbnQoKSA9PSBudWxsKSB7Ci0JCQkJLy8gY3VycmVudCB0aHJlYWQgaXMgbm90IGEgdXNlci1pbnRlcmZhY2UgdGhyZWFkCi0JCQkJLy8KLQkJCQlEaXNwbGF5LmdldERlZmF1bHQoKS5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0KLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJTGlicmFyeVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKQotCQkJCQkJCQkuZGlzcGxheUVycm9yKHRpdGxlLCBtc2csIHJlYXNvbiwgZXhjZXB0aW9uKTsKLQkJCQkJfQotCi0JCQkJfSk7Ci0JCQl9IGVsc2UgewotCQkJCUxpYnJhcnlVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkuZGlzcGxheUVycm9yKHRpdGxlLAotCQkJCQkJbXNnLCByZWFzb24sIGV4Y2VwdGlvbik7Ci0JCQl9Ci0JCX0KLQotCQkvKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JVXNlckludGVyYWN0aW9uSGFuZGxlci5JTWVzc2VuZ2VyI3Nob3dXYXJuaW5nKGphdmEubGFuZy5TdHJpbmcsCi0JCSAqICAgICAgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZykKLQkJICovCi0JCXB1YmxpYyB2b2lkIHNob3dXYXJuaW5nKGZpbmFsIFN0cmluZyB0aXRsZSwgZmluYWwgU3RyaW5nIG1zZywKLQkJCQlmaW5hbCBTdHJpbmcgcmVhc29uKSB7Ci0JCQlpZiAoRGlzcGxheS5nZXRDdXJyZW50KCkgPT0gbnVsbCkgewotCQkJCS8vIGN1cnJlbnQgdGhyZWFkIGlzIG5vdCBhIHVzZXItaW50ZXJmYWNlIHRocmVhZAotCQkJCS8vCi0JCQkJRGlzcGxheS5nZXREZWZhdWx0KCkuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCi0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCUxpYnJhcnlVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkKLQkJCQkJCQkJLmRpc3BsYXlXYXJuaW5nKHRpdGxlLCBtc2csIHJlYXNvbik7Ci0JCQkJCX0KLQotCQkJCX0pOwotCQkJfSBlbHNlIHsKLQkJCQlMaWJyYXJ5VUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpLmRpc3BsYXlXYXJuaW5nKAotCQkJCQkJdGl0bGUsIG1zZywgcmVhc29uKTsKLQkJCX0KLQkJfQotCi0JCS8qCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklVc2VySW50ZXJhY3Rpb25IYW5kbGVyLklNZXNzZW5nZXIjc2hvd0Vycm9yKGphdmEubGFuZy5TdHJpbmcsCi0JCSAqICAgICAgamF2YS5sYW5nLlN0cmluZykKLQkJICovCi0JCXB1YmxpYyB2b2lkIHNob3dFcnJvcihmaW5hbCBTdHJpbmcgdGl0bGUsIGZpbmFsIFN0cmluZyBtc2cpIHsKLQkJCWlmIChEaXNwbGF5LmdldEN1cnJlbnQoKSA9PSBudWxsKSB7Ci0JCQkJLy8gY3VycmVudCB0aHJlYWQgaXMgbm90IGEgdXNlci1pbnRlcmZhY2UgdGhyZWFkCi0JCQkJLy8KLQkJCQlEaXNwbGF5LmdldERlZmF1bHQoKS5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0KLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJTGlicmFyeVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKQotCQkJCQkJCQkuZGlzcGxheUVycm9yKHRpdGxlLCBtc2cpOwotCQkJCQl9Ci0KLQkJCQl9KTsKLQkJCX0gZWxzZSB7Ci0JCQkJTGlicmFyeVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKS5kaXNwbGF5RXJyb3IodGl0bGUsCi0JCQkJCQltc2cpOwotCQkJfQotCQl9Ci0KLQkJLyoKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSVVzZXJJbnRlcmFjdGlvbkhhbmRsZXIuSU1lc3NlbmdlciNzaG93SW5mbyhqYXZhLmxhbmcuU3RyaW5nLAotCQkgKiAgICAgIGphdmEubGFuZy5TdHJpbmcpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBzaG93SW5mbyhmaW5hbCBTdHJpbmcgdGl0bGUsIGZpbmFsIFN0cmluZyBtc2cpIHsKLQkJCWlmIChEaXNwbGF5LmdldEN1cnJlbnQoKSA9PSBudWxsKSB7Ci0JCQkJLy8gY3VycmVudCB0aHJlYWQgaXMgbm90IGEgdXNlci1pbnRlcmZhY2UgdGhyZWFkCi0JCQkJLy8KLQkJCQlEaXNwbGF5LmdldERlZmF1bHQoKS5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0KLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJTGlicmFyeVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKQotCQkJCQkJCQkuZGlzcGxheUluZm8odGl0bGUsIG1zZyk7Ci0JCQkJCX0KLQotCQkJCX0pOwotCQkJfSBlbHNlIHsKLQkJCQlMaWJyYXJ5VUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpLmRpc3BsYXlJbmZvKHRpdGxlLAotCQkJCQkJbXNnKTsKLQkJCX0KLQkJfQotCi0JCS8qCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklVc2VySW50ZXJhY3Rpb25IYW5kbGVyLklNZXNzZW5nZXIjc2hvd0Vycm9yKGphdmEubGFuZy5TdHJpbmcsCi0JCSAqICAgICAgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZywKLQkJICogICAgICBqYXZhLmxhbmcuRXhjZXB0aW9uKQotCQkgKi8KLQkJcHVibGljIHZvaWQgc2hvd0Vycm9yKGZpbmFsIFN0cmluZyB0aXRsZSwgZmluYWwgU3RyaW5nIG1zZywKLQkJCQlmaW5hbCBTdHJpbmcgcmVhc29uLCBmaW5hbCBTdHJpbmcgZGV0YWlscywKLQkJCQlmaW5hbCBFeGNlcHRpb24gZXhjZXB0aW9uKSB7Ci0JCQlpZiAoRGlzcGxheS5nZXRDdXJyZW50KCkgPT0gbnVsbCkgewotCQkJCS8vIGN1cnJlbnQgdGhyZWFkIGlzIG5vdCBhIHVzZXItaW50ZXJmYWNlIHRocmVhZAotCQkJCS8vCi0JCQkJRGlzcGxheS5nZXREZWZhdWx0KCkuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCi0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCUxpYnJhcnlVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkKLQkJCQkJCQkJLmRpc3BsYXlFcnJvcih0aXRsZSwgbXNnLCByZWFzb24sIGRldGFpbHMsCi0JCQkJCQkJCQkJZXhjZXB0aW9uKTsKLQkJCQkJfQotCi0JCQkJfSk7Ci0JCQl9IGVsc2UgewotCQkJCUxpYnJhcnlVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkuZGlzcGxheUVycm9yKHRpdGxlLAotCQkJCQkJbXNnLCByZWFzb24sIGRldGFpbHMsIGV4Y2VwdGlvbik7Ci0JCQl9Ci0JCX0KLQotCX07Ci0KLQlwdWJsaWMgVXNlckludGVyYWN0aW9uSGFuZGxlcigpIHsKLQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBzaGVsbAotCSAqICAgICAgICAgICAgdGhlIHNoZWxsIHRvIHNldAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNoZWxsKFNoZWxsIHNoZWxsKSB7Ci0JCXRoaXMuc2hlbGwgPSBzaGVsbDsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklVc2VySW50ZXJhY3Rpb25IYW5kbGVyI2dldFVJQ29udGV4dCgpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRVSUNvbnRleHQoKSB7Ci0JCWlmIChzaGVsbCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gTXNnQm94LmdldERlZmF1bHRTaGVsbCgpOwotCQl9Ci0JCXJldHVybiBzaGVsbDsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklVc2VySW50ZXJhY3Rpb25IYW5kbGVyI3NlbGVjdChqYXZhLnV0aWwuTGlzdCwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXIsIGJvb2xlYW4sIGphdmEudXRpbC5MaXN0LAotCSAqICAgICAgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgTGlzdCBzZWxlY3QoTGlzdCBvYmplY3RzVG9TZWxlY3QsIGZpbmFsIElJdGVtTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyLAotCQkJYm9vbGVhbiBtdWx0aXBsZSwgTGlzdCBpbnRpdGlhbFNlbGVjdGlvbiwgU3RyaW5nIHRpdGxlLCBTdHJpbmcgbXNnKSB7Ci0JCUlMYWJlbFByb3ZpZGVyIGxwID0gbmV3IERlbGVnYXRlTGFiZWxQcm92aWRlcihsYWJlbFByb3ZpZGVyKTsKLQkJaWYgKG11bHRpcGxlKSB7Ci0JCQlJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciBjb250ZW50UHJvdmlkZXIgPSBuZXcgQXJyYXlDb250ZW50UHJvdmlkZXIoKTsKLQkJCVVuY2FuY2VsYWJsZUxpc3RTZWxlY3Rpb25EaWFsb2cgZGxnID0gbmV3IFVuY2FuY2VsYWJsZUxpc3RTZWxlY3Rpb25EaWFsb2coCi0JCQkJCXNoZWxsLCBvYmplY3RzVG9TZWxlY3QsIGNvbnRlbnRQcm92aWRlciwgbHAsIG1zZyk7Ci0JCQlkbGcuc2V0VGl0bGUodGl0bGUpOwotCQkJZGxnLnNldEJsb2NrT25PcGVuKHRydWUpOwotCQkJZGxnLm9wZW4oKTsKLQkJCU9iamVjdCBvYmpzW10gPSBkbGcuZ2V0UmVzdWx0KCk7Ci0JCQlpZiAob2JqcyA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9IGVsc2UgewotCQkJCWlmIChvYmpzLmxlbmd0aCA9PSAwKSB7Ci0JCQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCQkJCX0KLQkJCQlyZXR1cm4gQXJyYXlzLmFzTGlzdChvYmpzKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCUVsZW1lbnRMaXN0U2VsZWN0aW9uRGlhbG9nIGRsZyA9IG5ldyBFbGVtZW50TGlzdFNlbGVjdGlvbkRpYWxvZygKLQkJCQkJc2hlbGwsIGxwKTsKLQotCQkJZGxnLnNldEJsb2NrT25PcGVuKHRydWUpOwotCQkJZGxnLnNldEVsZW1lbnRzKG9iamVjdHNUb1NlbGVjdC50b0FycmF5KCkpOwotCQkJZGxnLnNldE11bHRpcGxlU2VsZWN0aW9uKGZhbHNlKTsKLQkJCWRsZy5zZXRNZXNzYWdlKG1zZyk7Ci0JCQlkbGcuc2V0VGl0bGUodGl0bGUpOwotCQkJZGxnLnNldEZpbHRlcihudWxsKTsKLQkJCWlmIChkbGcub3BlbigpID09IERpYWxvZy5DQU5DRUwpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJCU9iamVjdCBvYmogPSBkbGcuZ2V0Rmlyc3RSZXN1bHQoKTsKLQkJCXJldHVybiBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KG9iaik7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklVc2VySW50ZXJhY3Rpb25IYW5kbGVyI3NlbGVjdE9uZShpbnRbXSwKLQkgKiAgICAgIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIGludCBzZWxlY3RPbmUoaW50W10gYWN0aW9ucywgU3RyaW5nIHRpdGxlLCBTdHJpbmcgbXNnLCBJU3RhdHVzIHN0YXR1cykgewotCQlmaW5hbCBTdHJpbmdbXSBidXR0b25MYWJlbHMgPSBuZXcgU3RyaW5nW2FjdGlvbnMubGVuZ3RoXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhY3Rpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQlidXR0b25MYWJlbHNbaV0gPSBnZXRBY3Rpb25UZXh0KGFjdGlvbnNbaV0pOwotCQl9Ci0JCUltYWdlIGltYWdlID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXNoZWxsID0gTGlicmFyeVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRXb3JrYmVuY2goKS5nZXREaXNwbGF5KCkKLQkJCQkJLmdldEFjdGl2ZVNoZWxsKCk7Ci0JCQlpbWFnZSA9IHNoZWxsLmdldEltYWdlKCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJaWYgKHN0YXR1cyA9PSBudWxsKSB7Ci0JCQlNZXNzYWdlRGlhbG9nIG1zZ0RsZyA9IG5ldyBNZXNzYWdlRGlhbG9nKHNoZWxsLCB0aXRsZSwgaW1hZ2UsIG1zZywKLQkJCQkJTWVzc2FnZURpYWxvZy5RVUVTVElPTiwgYnV0dG9uTGFiZWxzLCAwKTsKLQkJCWludCBpZCA9IG1zZ0RsZy5vcGVuKCk7Ci0JCQlyZXR1cm4gYWN0aW9uc1tpZF07Ci0JCX0gZWxzZSB7Ci0JCQlFcnJvckRpYWxvZ05vUmVhc29uIGRsZyA9IG5ldyBFcnJvckRpYWxvZ05vUmVhc29uKHNoZWxsLCB0aXRsZSwKLQkJCQkJbXNnLCBzdGF0dXMsIElTdGF0dXMuT0sgfCBJU3RhdHVzLklORk8gfCBJU3RhdHVzLldBUk5JTkcKLQkJCQkJCQl8IElTdGF0dXMuRVJST1IpIHsKLQotCQkJCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUJ1dHRvbnNGb3JCdXR0b25CYXIoQ29tcG9zaXRlIHBhcmVudCkgewotCQkJCQkvLyBjcmVhdGUgT0sgYW5kIERldGFpbHMgYnV0dG9ucwotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGJ1dHRvbkxhYmVscy5sZW5ndGg7IGkrKykgewotCQkJCQkJU3RyaW5nIGxhYmVsID0gYnV0dG9uTGFiZWxzW2ldOwotCQkJCQkJY3JlYXRlQnV0dG9uKHBhcmVudCwgaSwgbGFiZWwsIGkgPT0gMCk7Ci0JCQkJCX0KLQkJCQkJaWYgKHNob3VsZFNob3dEZXRhaWxzQnV0dG9uKCkpIHsKLQkJCQkJCWRldGFpbHNCdXR0b24gPSBjcmVhdGVCdXR0b24ocGFyZW50LAotCQkJCQkJCQlJRGlhbG9nQ29uc3RhbnRzLkRFVEFJTFNfSUQsCi0JCQkJCQkJCUlEaWFsb2dDb25zdGFudHMuU0hPV19ERVRBSUxTX0xBQkVMLCBmYWxzZSk7Ci0JCQkJCX0KLQotCQkJCX0KLQotCQkJCS8qCi0JCQkJICogKG5vbi1KYXZhZG9jKQotCQkJCSAqIAotCQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5zZXJ2aWNlYWJpbGl0eS5FcnJvckRpYWxvZ05vUmVhc29uI2J1dHRvblByZXNzZWQoaW50KQotCQkJCSAqLwotCQkJCXByb3RlY3RlZCB2b2lkIGJ1dHRvblByZXNzZWQoaW50IGlkKSB7Ci0JCQkJCWlmIChpZCA9PSBJRGlhbG9nQ29uc3RhbnRzLkRFVEFJTFNfSUQpIHsKLQkJCQkJCXN1cGVyLmJ1dHRvblByZXNzZWQoaWQpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJc2V0UmV0dXJuQ29kZShpZCk7Ci0JCQkJCQljbG9zZSgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfTsKLQkJCWludCBpZCA9IGRsZy5vcGVuKCk7Ci0JCQlyZXR1cm4gYWN0aW9uc1tpZF07Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYWN0aW9uIHRleHQKLQkgKiAKLQkgKiBAcGFyYW0gYWN0aW9uCi0JICogQHJldHVybiBBY3Rpb24gdGV4dCAtIGVpdGhlciBBQk9SVCwgQ0FOQ0VMLCBPSywgUkVUUlkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRBY3Rpb25UZXh0KGludCBhY3Rpb24pIHsKLQkJc3dpdGNoIChhY3Rpb24pIHsKLQkJY2FzZSBJVXNlckludGVyYWN0aW9uSGFuZGxlci5BQ1RJT05fQUJPUlQ6Ci0JCQlyZXR1cm4gSURpYWxvZ0NvbnN0YW50cy5BQk9SVF9MQUJFTDsKLQkJY2FzZSBJVXNlckludGVyYWN0aW9uSGFuZGxlci5BQ1RJT05fQ0FOQ0VMOgotCQkJcmV0dXJuIElEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0xBQkVMOwotCQljYXNlIElVc2VySW50ZXJhY3Rpb25IYW5kbGVyLkFDVElPTl9PSzoKLQkJCXJldHVybiBJRGlhbG9nQ29uc3RhbnRzLk9LX0xBQkVMOwotCQljYXNlIElVc2VySW50ZXJhY3Rpb25IYW5kbGVyLkFDVElPTl9SRVRSWToKLQkJCXJldHVybiBJRGlhbG9nQ29uc3RhbnRzLlJFVFJZX0xBQkVMOwotCQljYXNlIElVc2VySW50ZXJhY3Rpb25IYW5kbGVyLkFDVElPTl9ZRVM6Ci0JCQlyZXR1cm4gSURpYWxvZ0NvbnN0YW50cy5ZRVNfTEFCRUw7Ci0JCWNhc2UgSVVzZXJJbnRlcmFjdGlvbkhhbmRsZXIuQUNUSU9OX05POgotCQkJcmV0dXJuIElEaWFsb2dDb25zdGFudHMuTk9fTEFCRUw7Ci0JCWRlZmF1bHQ6Ci0JCQlicmVhazsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklVc2VySW50ZXJhY3Rpb25IYW5kbGVyI2dldE1lc3NlbmdlcigpCi0JICovCi0JcHVibGljIElNZXNzZW5nZXIgZ2V0TWVzc2VuZ2VyKCkgewotCQlyZXR1cm4gbWVzc2VuZ2VyOwotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSVVzZXJJbnRlcmFjdGlvbkhhbmRsZXIjcmVxdWVzdElucHV0KGphdmEubGFuZy5TdHJpbmcsCi0JICogICAgICBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLnV0aWwuTGlzdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiByZXF1ZXN0SW5wdXQoZmluYWwgU3RyaW5nIHRpdGxlLCBmaW5hbCBTdHJpbmcgbXNnLCBmaW5hbCBMaXN0IHVzZXJJbnB1dHMpIHsKLQkJaWYgKHVzZXJJbnB1dHMgPT0gbnVsbCB8fCB1c2VySW5wdXRzLnNpemUoKSA9PSAwKQotCQkJcmV0dXJuIGZhbHNlOwotCQkKLQkJaWYgKERpc3BsYXkuZ2V0Q3VycmVudCgpID09IG51bGwpIHsKLQkJCS8vIGN1cnJlbnQgdGhyZWFkIGlzIG5vdCBhIHVzZXItaW50ZXJmYWNlIHRocmVhZAotCQkJLy8KLQkJCWZpbmFsIGJvb2xlYW4gcmV0SG9sZGVyW10gPSBuZXcgYm9vbGVhblsxXTsKLQkJCURpc3BsYXkuZ2V0RGVmYXVsdCgpLnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJcmV0SG9sZGVyWzBdID0gZG9SZXF1ZXN0SW5wdXQodGl0bGUsIG1zZywgdXNlcklucHV0cyk7Ci0JCQkJfQotCi0JCQl9KTsKLQkJCXJldHVybiByZXRIb2xkZXJbMF07Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gZG9SZXF1ZXN0SW5wdXQodGl0bGUsIG1zZywgdXNlcklucHV0cyk7Ci0JCX0KLQkJCi0JfQotCQotCXByaXZhdGUgYm9vbGVhbiBkb1JlcXVlc3RJbnB1dChTdHJpbmcgdGl0bGUsIFN0cmluZyBtc2csIExpc3QgdXNlcklucHV0cykgewotCQlmaW5hbCBVc2VySW5wdXQgdXNlcklucHV0ID0gKFVzZXJJbnB1dCkgdXNlcklucHV0cy5nZXQoMCk7Ci0JCWlmICh1c2VySW5wdXQuZ2V0Q29udGV4dCgpIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudENyZWF0ZUNoaWxkQ29tbWFuZCkgewotCQkJTWV0aG9kRWxlbWVudENyZWF0ZUNoaWxkQ29tbWFuZCBjbWQgPSAoTWV0aG9kRWxlbWVudENyZWF0ZUNoaWxkQ29tbWFuZCkgdXNlcklucHV0Ci0JCQkJCS5nZXRDb250ZXh0KCk7Ci0JCQlpZiAoY21kLmdldEZlYXR1cmUoKSA9PSBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkuZ2V0TWV0aG9kTGlicmFyeV9QcmVkZWZpbmVkQ29uZmlndXJhdGlvbnMoKSkgewotCQkJCU5ld0NvbmZpZ3VyYXRpb25XaXphcmQgd2l6YXJkID0gbmV3IE5ld0NvbmZpZ3VyYXRpb25XaXphcmQoKTsKLQkJCQl3aXphcmQuaW5pdChQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLCBudWxsKTsKLQkJCQl3aXphcmQuc2V0TWV0aG9kQ29uZmlndXJhdGlvbigoTWV0aG9kQ29uZmlndXJhdGlvbikgY21kLmdldENoaWxkKCkpOwotCQkJCVdpemFyZERpYWxvZyBkaWFsb2cgPSBuZXcgV2l6YXJkRGlhbG9nKERpc3BsYXkuZ2V0Q3VycmVudCgpCi0JCQkJCQkuZ2V0QWN0aXZlU2hlbGwoKSwgd2l6YXJkKTsKLQkJCQlkaWFsb2cuY3JlYXRlKCk7Ci0JCQkJaWYgKGRpYWxvZy5vcGVuKCkgPT0gV2luZG93Lk9LKSB7Ci0JCQkJCXVzZXJJbnB1dC5zZXRJbnB1dCh3aXphcmQuZ2V0TWV0aG9kQ29uZmlndXJhdGlvbigpLmdldE5hbWUoKSk7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQkJaWYodXNlcklucHV0cy5zaXplKCkgPT0gMSAmJiB1c2VySW5wdXQuZ2V0VHlwZSgpID09IFVzZXJJbnB1dC5URVhUICYmIHVzZXJJbnB1dC5nZXRMYWJlbCgpID09IG51bGwpIHsKLQkJCS8vIHVzZXIgSW5wdXREaWFsb2cgZm9yIHRoaXMgY2FzZSB1bnRpbCB3ZSBmaXggdGhpcyBkaWFsb2cgYm94Ci0JCQkvLwotCQkJSUlucHV0VmFsaWRhdG9yIHZhbGlkYXRvciA9IHVzZXJJbnB1dC5nZXRWYWxpZGF0b3IoKSAhPSBudWxsID8gbmV3IElJbnB1dFZhbGlkYXRvcigpIHsKLQotCQkJCXB1YmxpYyBTdHJpbmcgaXNWYWxpZChTdHJpbmcgbmV3VGV4dCkgewotCQkJCQlyZXR1cm4gdXNlcklucHV0LmdldFZhbGlkYXRvcigpLmlzVmFsaWQobmV3VGV4dCk7Ci0JCQkJfQotCQkJCi0JCQl9IDogbnVsbDsKLQkJCUlucHV0RGlhbG9nIGRsZyA9IG5ldyBJbnB1dERpYWxvZyhQbGF0Zm9ybVVJCi0JCQkJLmdldFdvcmtiZW5jaCgpLmdldERpc3BsYXkoKS5nZXRBY3RpdmVTaGVsbCgpLAotCQkJCXRpdGxlLCBtc2csIChTdHJpbmcpdXNlcklucHV0LmdldElucHV0KCksIHZhbGlkYXRvcik7Ci0JCQlpZihkbGcub3BlbigpID09IFdpbmRvdy5PSykgewotCQkJCXVzZXJJbnB1dC5zZXRJbnB1dChkbGcuZ2V0VmFsdWUoKSk7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJCi0JCVVzZXJJbnB1dHNEaWFsb2cgZGlhbG9nID0gbmV3IFVzZXJJbnB1dHNEaWFsb2coUGxhdGZvcm1VSQotCQkJCS5nZXRXb3JrYmVuY2goKS5nZXREaXNwbGF5KCkuZ2V0QWN0aXZlU2hlbGwoKSwgdXNlcklucHV0cywKLQkJCQl0aXRsZSwgbXNnKTsKLQkJZGlhbG9nLnNldEJsb2NrT25PcGVuKHRydWUpOwotCQlkaWFsb2cub3BlbigpOwotCQlyZXR1cm4gZGlhbG9nLmdldFJlc3VsdCgpOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9wYWNrYWdlLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNDE3ZGQ1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyBlZGl0aW5nIGFjdGlvbnMgZm9yIHRoZSBBdXRob3JpbmcgVUkuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9jZWxsZWRpdG9ycy9BYnN0cmFjdENoZWNrQm94Q2VsbEVkaXRvci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9jZWxsZWRpdG9ycy9BYnN0cmFjdENoZWNrQm94Q2VsbEVkaXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNTdiYjI4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvY2VsbGVkaXRvcnMvQWJzdHJhY3RDaGVja0JveENlbGxFZGl0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmNlbGxlZGl0b3JzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ2VsbE1vZGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5UcmVlRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UcmVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRyZWVJdGVtOwotCi0vKioKLSAqIEFuIGFic3RyYWN0IGNsYXNzIGZvciBjaGVjayBib3ggY2VsbCBlZGl0b3IKLSAqIEBhdXRob3IgQW4gTWluZwotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjIKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0Q2hlY2tCb3hDZWxsRWRpdG9yIHsKLQotCS8vIHRoZSBjZWxsIG1vZGlmaWVyCi0JcHJpdmF0ZSBJQ2VsbE1vZGlmaWVyIG1vZGlmaWVyID0gbnVsbDsKLQotCS8vIHRyZWUgZWRpdG9yCi0JcHJpdmF0ZSBUcmVlRWRpdG9yIHRyZWVFZGl0b3IgPSBudWxsOwotCi0JLy8gdGhlIHRyZWUKLQlwcml2YXRlIFRyZWUgdHJlZSA9IG51bGw7Ci0KLQkvLyB0aGUgY29udHJvbCBlZGl0b3IKLQlwcml2YXRlIENvbnRyb2wgY29udHJvbCA9IG51bGw7Ci0KLQkvLyB0aGUgY29sdW1uIGluZGV4Ci0JcHJpdmF0ZSBpbnQgY29sdW1uSW5kZXg7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gaW5zdGFuY2UKLQkgKiBAcGFyYW0gdHJlZQotCSAqLwotCXB1YmxpYyBBYnN0cmFjdENoZWNrQm94Q2VsbEVkaXRvcihDb21wb3NpdGUgdHJlZSkgewotCQl0aGlzLnRyZWUgPSAoVHJlZSkgdHJlZTsKLQkJdGhpcy50cmVlRWRpdG9yID0gbmV3IFRyZWVFZGl0b3IodGhpcy50cmVlKTsKLQl9Ci0KLQotCS8qKgotCSAqIFNldCBjZWxsIG1vZGlmaWVyCi0JICogQHBhcmFtIG1vZGlmaWVyCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q2VsbE1vZGlmaWVyKElDZWxsTW9kaWZpZXIgbW9kaWZpZXIpIHsKLQkJdGhpcy5tb2RpZmllciA9IG1vZGlmaWVyOwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgY2VsbCBtb2RpZmllcgotCSAqIAotCSAqIEByZXR1cm4KLQkgKiAJCUNlbGxNb2RpZmllcgotCSAqLwotCXByb3RlY3RlZCBJQ2VsbE1vZGlmaWVyIGdldENlbGxNb2RpZmllcigpIHsKLQkJcmV0dXJuIHRoaXMubW9kaWZpZXI7Ci0JfQotCi0JcHVibGljIGFic3RyYWN0IEltYWdlIGdldEltYWdlKFRyZWVJdGVtIGl0ZW0sIFN0cmluZyBjb2x1bW5wcm9wZXJ0eSk7Ci0KLQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBtb2RpZnkoVHJlZUl0ZW0gaXRlbSwgU3RyaW5nIGNvbHVtbnByb3BlcnR5KTsKLQotCS8qCi0JICogPT09PT09PWluIGZhY3QgYmVsb3cgY29kZXMgYXJlIGZvciB0aGUgZHluYW1pYyBjZWxsIGVkaXRvciAocmVhbCBjb250cm9sCi0JICogImJ1dHRvbiIpPT09PT0KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFZGl0b3JUbyhUcmVlSXRlbSBpdGVtLCBTdHJpbmcgY29sdW1ucHJvcGVydHkpIHsKLQkJaWYgKHRyZWVFZGl0b3IuZ2V0SXRlbSgpICE9IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlmIChjb250cm9sID09IG51bGwpCi0JCQljb250cm9sID0gY3JlYXRlQ29udHJvbCh0cmVlKTsKLQkJaG9va0NvbnRyb2woY29udHJvbCwgaXRlbSwgY29sdW1ucHJvcGVydHkpOwotCi0JCXRyZWVFZGl0b3IubWluaW11bVdpZHRoID0gY29udHJvbC5nZXRTaXplKCkueDsKLQkJdHJlZUVkaXRvci5ob3Jpem9udGFsQWxpZ25tZW50ID0gU1dULkNFTlRFUjsKLQkJdHJlZUVkaXRvci5zZXRFZGl0b3IoY29udHJvbCwgaXRlbSwgY29sdW1uSW5kZXgpOwotCi0JfQotCi0JcHVibGljIHZvaWQgZGVsZXRlRWRpdG9yRnJvbShUcmVlSXRlbSBpdGVtLCBTdHJpbmcgY29sdW1ucHJvcGVydHkpIHsKLQkJY29udHJvbC5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJdHJlZUVkaXRvci5zZXRFZGl0b3IobnVsbCwgbnVsbCwgY29sdW1uSW5kZXgpOwotCX0KLQotCXByb3RlY3RlZCBhYnN0cmFjdCBDb250cm9sIGNyZWF0ZUNvbnRyb2woVHJlZSBwYXJlbnQpOwotCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgaG9va0NvbnRyb2woQ29udHJvbCBjb250cm9sLCBUcmVlSXRlbSBpdGVtLAotCQkJU3RyaW5nIGNvbHVtbnByb3BlcnR5KTsKLQotCS8qKgotCSAqIEdldCBjb2x1bW4gaW5kZXgKLQkgKiBAcmV0dXJuCi0JICogCQlpbmRleAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0Q29sdW1uSW5kZXgoKSB7Ci0JCXJldHVybiBjb2x1bW5JbmRleDsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgaW5kZXggZm9yIGNvbHVtbgotCSAqIEBwYXJhbSBjb2x1bW5JbmRleAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvbHVtbkluZGV4KGludCBjb2x1bW5JbmRleCkgewotCQl0aGlzLmNvbHVtbkluZGV4ID0gY29sdW1uSW5kZXg7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9jZWxsZWRpdG9ycy9Qcm9jZXNzQ2hlY2tCb3hDZWxsRWRpdG9yLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2NlbGxlZGl0b3JzL1Byb2Nlc3NDaGVja0JveENlbGxFZGl0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmVjZDQzZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2NlbGxlZGl0b3JzL1Byb2Nlc3NDaGVja0JveENlbGxFZGl0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyOCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmNlbGxlZGl0b3JzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDZWxsTW9kaWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVHJlZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UcmVlSXRlbTsKLQotLyoqCi0gKiBDaGVjayBCb3ggY2VsbCBlZGl0b3IgZm9yIHByb2Nlc3MgZm9ybSBwYWdlLCBXQlMsIFRBLCBXUFUKLSAqIAotICogQGF1dGhvciBBbiBNaW5nCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMgotICovCi1wdWJsaWMgY2xhc3MgUHJvY2Vzc0NoZWNrQm94Q2VsbEVkaXRvciBleHRlbmRzIEFic3RyYWN0Q2hlY2tCb3hDZWxsRWRpdG9yIHsKLQkKLQkvLyBjaGVja2JveCBpbWFnZXMKLQlwcml2YXRlIGZpbmFsIEltYWdlIGNoZWNrSW1hZ2UgPSBBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0U2hhcmVkSW1hZ2UoCi0JCQkiZnVsbC9vYmoxNi9DaGVjay5naWYiKTsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBmaW5hbCBJbWFnZSB1bmNoZWNrSW1hZ2UgPSBBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0U2hhcmVkSW1hZ2UoCi0JCQkiZnVsbC9vYmoxNi9VbmNoZWNrLmdpZiIpOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIGZpbmFsIEltYWdlIGRpc2FibGVDaGVja0ltYWdlID0gQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFNoYXJlZEltYWdlKAotCQkiZnVsbC9vYmoxNi9EaXNhYmxlQ2hlY2suZ2lmIik7IC8vJE5PTi1OTFMtMSQKLQkKLQlwcml2YXRlIGZpbmFsIEltYWdlIGRpc2FibGVVbmNoZWNrSW1hZ2UgPSBBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0U2hhcmVkSW1hZ2UoCi0JCSJmdWxsL29iajE2L0Rpc2FibGVVbmNoZWNrLmdpZiIpOyAvLyROT04tTkxTLTEkCi0JCi0JcHJpdmF0ZSBTZWxlY3Rpb25MaXN0ZW5lciBsaXN0ZW5lcjsKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yCi0JICogQHBhcmFtIHRyZWUKLQkgKi8KLQlwdWJsaWMgUHJvY2Vzc0NoZWNrQm94Q2VsbEVkaXRvcihDb21wb3NpdGUgdHJlZSkgewotCQlzdXBlcih0cmVlKTsKLQl9Ci0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuY2VsbGVkaXRvcnMuQWJzdHJhY3RDaGVja0JveENlbGxFZGl0b3IjZ2V0SW1hZ2Uob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVHJlZUl0ZW0sIGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIEltYWdlIGdldEltYWdlKFRyZWVJdGVtIGl0ZW0sIFN0cmluZyBjb2x1bW5wcm9wZXJ0eSkgewotCQlmaW5hbCBJQ2VsbE1vZGlmaWVyIG1vZGlmaWVyID0gZ2V0Q2VsbE1vZGlmaWVyKCk7Ci0JCU9iamVjdCBlbGVtZW50ID0gaXRlbS5nZXREYXRhKCk7Ci0JCWlmIChlbGVtZW50ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLS8vCQlpZiAoY29sdW1ucHJvcGVydHkgPT0gSUJTSXRlbVByb3ZpZGVyLkNPTF9JU19PTkdPSU5HCi0vLwkJCQl8fCBjb2x1bW5wcm9wZXJ0eSA9PSBJQlNJdGVtUHJvdmlkZXIuQ09MX0lTX1JFUEVBVEFCTEUKLS8vCQkJCXx8IGNvbHVtbnByb3BlcnR5ID09IElCU0l0ZW1Qcm92aWRlci5DT0xfSVNfRVZFTlRfRFJJVkVOKSB7Ci0vLwkJCWlmICghKFRuZ1V0aWwudW53cmFwKGVsZW1lbnQpIGluc3RhbmNlb2YgV29ya0JyZWFrZG93bkVsZW1lbnQpKSB7Ci0vLwkJCQlyZXR1cm4gbnVsbDsKLS8vCQkJfQotLy8JCX0KLQkJT2JqZWN0IHZhbHVlID0gbW9kaWZpZXIuZ2V0VmFsdWUoZWxlbWVudCwgY29sdW1ucHJvcGVydHkpOwotCQlpZiAodmFsdWUgPT0gbnVsbCB8fCAhKHZhbHVlIGluc3RhbmNlb2YgQm9vbGVhbikpCi0JCQlyZXR1cm4gbnVsbDsKLQkJYm9vbGVhbiBjYW5Nb2RpZnkgPSBtb2RpZmllci5jYW5Nb2RpZnkoZWxlbWVudCwgY29sdW1ucHJvcGVydHkpOwotCi0JCWlmICgoKEJvb2xlYW4pIHZhbHVlKS5ib29sZWFuVmFsdWUoKSkgewotCQkJcmV0dXJuIGNhbk1vZGlmeSA/IGNoZWNrSW1hZ2UgOiBkaXNhYmxlQ2hlY2tJbWFnZTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBjYW5Nb2RpZnkgPyB1bmNoZWNrSW1hZ2UgOiBkaXNhYmxlVW5jaGVja0ltYWdlOwotCQl9Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5jZWxsZWRpdG9ycy5BYnN0cmFjdENoZWNrQm94Q2VsbEVkaXRvciNtb2RpZnkob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVHJlZUl0ZW0sIGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgbW9kaWZ5KFRyZWVJdGVtIGl0ZW0sIFN0cmluZyBjb2x1bW5wcm9wZXJ0eSkgewotCQlmaW5hbCBJQ2VsbE1vZGlmaWVyIG1vZGlmaWVyID0gZ2V0Q2VsbE1vZGlmaWVyKCk7Ci0JCWlmICghbW9kaWZpZXIuY2FuTW9kaWZ5KGl0ZW0uZ2V0RGF0YSgpLCBjb2x1bW5wcm9wZXJ0eSkpCi0JCQlyZXR1cm47Ci0JCW1vZGlmaWVyLm1vZGlmeShpdGVtLCBjb2x1bW5wcm9wZXJ0eSwgbmV3IEJvb2xlYW4oISgoQm9vbGVhbikgbW9kaWZpZXIKLQkJCQkuZ2V0VmFsdWUoaXRlbS5nZXREYXRhKCksIGNvbHVtbnByb3BlcnR5KSkuYm9vbGVhblZhbHVlKCkpKTsKLQl9Ci0KLQkvKgotCSAqID09PT09PT1pbiBmYWN0IGJlbG93IGNvZGVzIGFyZSBmb3IgdGhlIGR5bmFtaWMgY2VsbCBlZGl0b3IgKHJlYWwgY29udHJvbAotCSAqICJidXR0b24iKT09PT09Ci0JICovCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5jZWxsZWRpdG9ycy5BYnN0cmFjdENoZWNrQm94Q2VsbEVkaXRvciNjcmVhdGVDb250cm9sKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRyZWUpCi0JICovCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udHJvbChUcmVlIHBhcmVudCkgewotCQlCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5DSEVDSyk7Ci0JCWJ1dHRvbi5wYWNrKCk7Ci0JCXJldHVybiBidXR0b247Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5jZWxsZWRpdG9ycy5BYnN0cmFjdENoZWNrQm94Q2VsbEVkaXRvciNob29rQ29udHJvbChvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sLCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UcmVlSXRlbSwgamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBob29rQ29udHJvbChDb250cm9sIGNvbnRyb2wsIFRyZWVJdGVtIGl0ZW0sCi0JCQlmaW5hbCBTdHJpbmcgY29sdW1ucHJvcGVydHkpIHsKLQkJZmluYWwgSUNlbGxNb2RpZmllciBtb2RpZmllciA9IGdldENlbGxNb2RpZmllcigpOwotCQlmaW5hbCBPYmplY3QgZWxlbWVudCA9IGl0ZW07Ci0JCWZpbmFsIEJ1dHRvbiBjaGVja2JveCA9IChCdXR0b24pIGNvbnRyb2w7Ci0JCWlmIChsaXN0ZW5lciAhPSBudWxsKQotCQkJY2hlY2tib3gucmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCQlsaXN0ZW5lciA9IG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCW1vZGlmaWVyLm1vZGlmeShlbGVtZW50LCBjb2x1bW5wcm9wZXJ0eSwgbmV3IEJvb2xlYW4oY2hlY2tib3gKLQkJCQkJCS5nZXRTZWxlY3Rpb24oKSkpOwotCQkJfQotCQl9OwotCQljaGVja2JveC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9jaGVhdHNoZWV0cy9hY3Rpb25zL0NoZWF0c2hlZXRTd2l0Y2hKb2IuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvY2hlYXRzaGVldHMvYWN0aW9ucy9DaGVhdHNoZWV0U3dpdGNoSm9iLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2MTk4ZjYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9jaGVhdHNoZWV0cy9hY3Rpb25zL0NoZWF0c2hlZXRTd2l0Y2hKb2IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuY2hlYXRzaGVldHMuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuY2hlYXRzaGVldHMuT3BlbkNoZWF0U2hlZXRBY3Rpb247Ci0KLS8qKgotICogU3dpdGNocyBjaGVhdCBzaGVldCBhbmQgb3BlbnMgaXQuCi0gKiAKLSAqIEBhdXRob3IgQmluZ1h1ZSBYdQotICogQHNpbmNlIDEuMAotICoKLSAqLwotcHVibGljIGNsYXNzIENoZWF0c2hlZXRTd2l0Y2hKb2IgZXh0ZW5kcyBKb2IgewotCXByaXZhdGUgU3RyaW5nIGNoZWF0c2hlZXRJZDsKLQotCS8qKgotCSAqIENyZWF0ZSBhbiBpbnN0YW5jZSB3aXRoIGNoZWF0IHNoZWV0IG5hbWUgYW5kIElkCi0JICogQHBhcmFtIG5hbWUKLQkgKiBAcGFyYW0gY2hlYXRzaGVldElkCi0JICovCi0JcHVibGljIENoZWF0c2hlZXRTd2l0Y2hKb2IoU3RyaW5nIG5hbWUsIFN0cmluZyBjaGVhdHNoZWV0SWQpIHsKLQkJc3VwZXIobmFtZSk7Ci0JCXRoaXMuY2hlYXRzaGVldElkID0gY2hlYXRzaGVldElkOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iI3J1bihvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwcm90ZWN0ZWQgSVN0YXR1cyBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0RGlzcGxheSgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJbmV3IE9wZW5DaGVhdFNoZWV0QWN0aW9uKGNoZWF0c2hlZXRJZCkucnVuKCk7Ci0JCQl9Ci0JCX0pOwotCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2NoZWF0c2hlZXRzL2FjdGlvbnMvQ3JlYXRlUGx1Z2luQWN0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2NoZWF0c2hlZXRzL2FjdGlvbnMvQ3JlYXRlUGx1Z2luQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2Nzg3OGEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9jaGVhdHNoZWV0cy9hY3Rpb25zL0NyZWF0ZVBsdWdpbkFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5jaGVhdHNoZWV0cy5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zLk5ld1BsdWdpbkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuY2hlYXRzaGVldHMuSUNoZWF0U2hlZXRBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuY2hlYXRzaGVldHMuSUNoZWF0U2hlZXRNYW5hZ2VyOwotCi0vKioKLSAqIENyZWF0ZSBNZXRob2QgUGx1Zy1pbiBjaGVhdCBzaGVldCBhY3Rpb24uCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQ3JlYXRlUGx1Z2luQWN0aW9uIGV4dGVuZHMgQWN0aW9uIGltcGxlbWVudHMgSUNoZWF0U2hlZXRBY3Rpb24gewotCi0JLyoqCi0JICogQHNlZSBJQ2hlYXRTaGVldEFjdGlvbiNydW4oU3RyaW5nW10sIElDaGVhdFNoZWV0TWFuYWdlcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBydW4oU3RyaW5nW10gcGFyYW1zLCBJQ2hlYXRTaGVldE1hbmFnZXIgbWFuYWdlcikgewotCQlOZXdQbHVnaW5BY3Rpb24uZXhlY3V0ZShQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLCBudWxsKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvY2hlYXRzaGVldHMvYWN0aW9ucy9Td2l0Y2hDaGVhdHNoZWV0VG8uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvY2hlYXRzaGVldHMvYWN0aW9ucy9Td2l0Y2hDaGVhdHNoZWV0VG8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjQxMzVlYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2NoZWF0c2hlZXRzL2FjdGlvbnMvU3dpdGNoQ2hlYXRzaGVldFRvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmNoZWF0c2hlZXRzLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmNoZWF0c2hlZXRzLklDaGVhdFNoZWV0QWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmNoZWF0c2hlZXRzLklDaGVhdFNoZWV0TWFuYWdlcjsKLQotLyoqCi0gKiBDcmVhdGUgc3dpdGNoIGNoZWF0IHNoZWV0IGFjdGlvbgotICogCi0gKiBAYXV0aG9yIEJpbmdYdWUgWHUKLSAqIEBzaW5jZSAxLjAKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBTd2l0Y2hDaGVhdHNoZWV0VG8gZXh0ZW5kcyBBY3Rpb24gaW1wbGVtZW50cyBJQ2hlYXRTaGVldEFjdGlvbiB7Ci0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLmNoZWF0c2hlZXRzLklDaGVhdFNoZWV0QWN0aW9uI3J1bihqYXZhLmxhbmcuU3RyaW5nW10sIG9yZy5lY2xpcHNlLnVpLmNoZWF0c2hlZXRzLklDaGVhdFNoZWV0TWFuYWdlcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBydW4oU3RyaW5nW10gcGFyYW1zLCBJQ2hlYXRTaGVldE1hbmFnZXIgbWFuYWdlcikgewotCi0JCWlmIChwYXJhbXMubGVuZ3RoIDw9IDApCi0JCQlyZXR1cm47Ci0KLQkJU3RyaW5nIGNzX2lkID0gcGFyYW1zWzBdOwotCi0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiJCQkIERFQlVHOiBpbiBTd2l0Y2hDaGVhdHNoZWV0VG8ucnVuKC4uLikgY3NfSUQgPQotCQkvLyAiICsgY3NfaWQpOyAvLyROT04tTkxTLTEkCi0KLQkJQ2hlYXRzaGVldFN3aXRjaEpvYiBzd2l0Y2hKb2IgPSBuZXcgQ2hlYXRzaGVldFN3aXRjaEpvYigKLQkJCQkiU3dpdGNoIENoZWF0c2hlZXQiLCBjc19pZCk7IC8vJE5PTi1OTFMtMSQKLQkJc3dpdGNoSm9iLnNjaGVkdWxlKDUwKTsKLQotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvY2hlYXRzaGVldHMvYWN0aW9ucy9wYWNrYWdlLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2NoZWF0c2hlZXRzL2FjdGlvbnMvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MmU5YWZhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvY2hlYXRzaGVldHMvYWN0aW9ucy9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyBhY3Rpb25zIGZvciB0aGUgQXV0aG9yaW5nIGNoZWF0c2hlZXRzLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZGlhbG9ncy9BRERJbmZvRGlhbG9nLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2RpYWxvZ3MvQURESW5mb0RpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZTAyMTc3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZGlhbG9ncy9BRERJbmZvRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NDAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5kaWFsb2dzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VkQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuQWJzdHJhY3REaWFncmFtRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5BY3Rpdml0eURldGFpbERpYWdyYW1FZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5maWx0ZXJzLkRlc2NyaXB0b3JDb25maWd1cmF0aW9uRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZmlsdGVycy5FeFByb2Nlc3NBdXRob3JpbmdDb25maWd1cmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS51dGlsLkF1dGhvcmluZ0FjY2Vzc2libGVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLkZpbHRlckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLkZpbHRlckhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLklDYXRlZ29yeUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLklQcm9jZXNzRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CcmVha2Rvd25FbGVtZW50SXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuTWV0aG9kRWxlbWVudFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlN1cHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuTGlicmFyeVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5VbWFVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkRvdWJsZUNsaWNrRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JRG91YmxlQ2xpY2tMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVHJlZUl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotCi0vKioKLSAqIEZpbHRlciBEaWFsb2cgLSBhbGxvdyB0aGUgdXNlciB0byBmaWx0ZXIgdGhlIGNvbnRlbnQgZWxlbWVudCwgY29udGVudAotICogY2F0ZWdvcmllcywgY3VzdG9tIGNhdGVnb3JpZXMsIEFsbCB0eXBlcyBvZiBjb250ZW50ZWxlbWVudHMgYmFzZWQgb24gbG9jYXRpb24gb2YgdGhlIHVzZSBvZiB0aGUgZmlsdGVyCi0gKiBkaWFsb2cuCi0gKiAKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICovCi1wdWJsaWMgY2xhc3MgQURESW5mb0RpYWxvZyBleHRlbmRzIERpYWxvZyBpbXBsZW1lbnRzCi0JCUlTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIsIElEb3VibGVDbGlja0xpc3RlbmVyIHsKLQotCXByb3RlY3RlZCBCdXR0b24gb2tCdXR0b24sIGNhbmNlbEJ1dHRvbjsKLQotCXByb3RlY3RlZCBUZXh0IGN0cmxfYnJpZWZfZGVzYzsKLQotCS8vcHJpdmF0ZSBTdHJpbmcgcGF0dGVybiwgZmlsdGVyVHlwZVN0cjsKLQotCS8vcHJvdGVjdGVkIENvbWJvIGZpbHRlclR5cGU7Ci0KLQlwcml2YXRlIFN0cmluZyBkaWFsb2dUaXRsZSwgdGFiU3RyOwotCi0JcHJpdmF0ZSBPYmplY3QgY29udGVudEVsZW1lbnQ7Ci0KLQlwcml2YXRlIEFycmF5TGlzdCBzZWxlY3RlZExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQlwcml2YXRlIGJvb2xlYW4gdmlld2VyU2VsZWN0aW9uU2luZ2xlID0gZmFsc2U7Ci0JcHJpdmF0ZSBTdHJpbmcgdmlld2VyTGFiZWwgPSBudWxsOwotCQotCS8qCi0JICogVHJlZXZpZXdlciBmb3IgQ29udGVudEVsZW1lbnRzIHRvIGRpc3BsYXkuCi0JICovCi0JcHJpdmF0ZSBUcmVlVmlld2VyIHRyZWVWaWV3ZXI7Ci0KLQlwcm90ZWN0ZWQgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIgY29udGVudFByb3ZpZGVyOwotCi0JcHJvdGVjdGVkIElMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIgPSBuZXcgQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyKAotCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJLmdldE5hdmlnYXRvclZpZXdfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKSB7Ci0JCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCQkvLyByZXR1cm4gc3VwZXIuZ2V0VGV4dChvYmplY3QpOwotCQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIFZhcmlhYmlsaXR5RWxlbWVudCkgewotCQkJCXJldHVybiBUbmdVdGlsLmdldExhYmVsKChWYXJpYWJpbGl0eUVsZW1lbnQpIG9iamVjdCwgIiIsIHRydWUpOyAvLyROT04tTkxTLTEkCi0JCQl9IGVsc2UgewotCQkJCXJldHVybiBzdXBlci5nZXRUZXh0KG9iamVjdCk7Ci0JCQl9Ci0JCX0KLQl9OwotCi0JcHJpdmF0ZSBBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeTsKLQlwcml2YXRlIENvbXBvc2VkQWRhcHRlckZhY3RvcnkgY29tcG9zZWRBZGFwdGVyRmFjdG9yeTsKLQotCS8qCi0JICogRGlhbG9nIEF0dHJpYnV0ZXMKLQkgKi8KLQkvLyBwcml2YXRlIGJvb2xlYW4gYW55Q2hpbGRzID0gdHJ1ZTsKLQlwcml2YXRlIExpc3QgYWxyZWFkeVNlbGVjdGVkTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQotCXByaXZhdGUgSUZpbHRlciBmaWx0ZXI7Ci0KLQlQYXR0ZXJuIHJlZ2V4UGF0dGVybjsKLQotCS8vIHByaXZhdGUgTWV0aG9kQ29uZmlndXJhdGlvbiBtZXRob2RDb25maWd1cmF0aW9uOwotCXByb3RlY3RlZCBGaWx0ZXJIZWxwZXIgaGVscGVyOwotCi0JcHJpdmF0ZSBCdXR0b24gZXhwYW5kQnV0dG9uOwotCi0JcHJpdmF0ZSBCdXR0b24gY29sbGFwc2VCdXR0b247Ci0KLQlwcml2YXRlIE9iamVjdCBpbnB1dDsKLQotCS8vcHJpdmF0ZSBTdHJpbmdbXSB0eXBlczsKLQotCS8qKgotCSAqIENvbnN0cnVjdHMgYSBuZXcgRmlsdGVyRGlhbG9nLiBUaGlzIGNvbnN0cnVjdG9yIHdpbGwgdXNlIGZpbHRlciBiYXNlZCBvbgotCSAqIHRhYlN0ciwgZmlsdGVycyBvdXQgdGhlIGxpc3Qgb2YgZWxlbWVudHMgYmFzZWQgb24gYWxyZWFkeSBleGlzdGluZwotCSAqIHNlbGVjdGVkIGVsZW1lbnQgaW4gdGhlIHNlbGVjdGVkIHRhYmxlLiBJbml0aWFsaXplcyB0aGUgQ29udGVudFByb3ZpZGVyCi0JICogZm9yIHRoZSB0cmVldmlld2VyLgotCSAqIAotCSAqLwotCXB1YmxpYyBBRERJbmZvRGlhbG9nKFNoZWxsIHBhcmVudFNoZWxsLCBPYmplY3QgY29udGVudEVsZW1lbnQsCi0JCQlTdHJpbmcgdGFiU3RyLCBMaXN0IGFscmVhZHlFeGlzdHMpIHsKLQkJc3VwZXIocGFyZW50U2hlbGwpOwotCQl0aGlzLmNvbnRlbnRFbGVtZW50ID0gY29udGVudEVsZW1lbnQ7Ci0JCXRoaXMudGFiU3RyID0gdGFiU3RyOwotCQl0aGlzLmZpbHRlciA9IG51bGw7Ci0JCXRoaXMuYWxyZWFkeVNlbGVjdGVkTGlzdCA9IGFscmVhZHlFeGlzdHM7Ci0JCWhlbHBlciA9IG5ldyBGaWx0ZXJIZWxwZXIoY29udGVudEVsZW1lbnQsIHRhYlN0ciwgbnVsbCwgbnVsbCwKLQkJCQl0aGlzLmFscmVhZHlTZWxlY3RlZExpc3QpOwotCQlpbml0UHJvdmlkZXJGb3JUYWJzKCk7Ci0JfQotCi0JcHVibGljIEFEREluZm9EaWFsb2coU2hlbGwgcGFyZW50U2hlbGwsIElGaWx0ZXIgZmlsdGVyLCBTdHJpbmcgdGFiU3RyLAotCQkJTGlzdCBhbHJlYWR5RXhpc3RzLCBPYmplY3QgaW5wdXQpIHsKLQkJdGhpcyhwYXJlbnRTaGVsbCwgZmlsdGVyLCBudWxsLCB0YWJTdHIsIGFscmVhZHlFeGlzdHMpOwotCQl0aGlzLmlucHV0ID0gaW5wdXQ7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0cyBhIG5ldyBGaWx0ZXJEaWFsb2cuIFRoaXMgY29uc3RydWN0b3Igd2lsbCB1c2UgcGFzc2VkIGZpbHRlci4KLQkgKiB0YWJTdHIgaXMgdXNlZCBmb3IgdGhlIHNlYXJjaHR5cGUgb25seS4gSW5pdGlhbGl6ZXMgdGhlIENvbnRlbnRQcm92aWRlcgotCSAqIGZvciB0aGUgdHJlZXZpZXdlci4KLQkgKiAKLQkgKi8KLQlwdWJsaWMgQURESW5mb0RpYWxvZyhTaGVsbCBwYXJlbnRTaGVsbCwgSUZpbHRlciBmaWx0ZXIsCi0JCQlPYmplY3QgY29udGVudEVsZW1lbnQsIFN0cmluZyB0YWJTdHIpIHsKLQkJc3VwZXIocGFyZW50U2hlbGwpOwotCQl0aGlzLmZpbHRlciA9IGZpbHRlcjsKLQkJdGhpcy50YWJTdHIgPSB0YWJTdHI7Ci0KLQkJaGVscGVyID0gbmV3IEZpbHRlckhlbHBlcihjb250ZW50RWxlbWVudCwgdGFiU3RyLCBudWxsLCBudWxsLCBudWxsKTsKLQkJaW5pdFByb3ZpZGVyRm9yVGFicygpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdHMgYSBuZXcgRmlsdGVyRGlhbG9nLiBUaGlzIGNvbnN0cnVjdG9yIHdpbGwgdXNlIHBhc3NlZCBmaWx0ZXIuCi0JICogdGFiU3RyIGlzIHVzZWQgZm9yIHRoZSBzZWFyY2h0eXBlIG9ubHkuIEluaXRpYWxpemVzIHRoZSBDb250ZW50UHJvdmlkZXIKLQkgKiBmb3IgdGhlIHRyZWV2aWV3ZXIuCi0JICogCi0JICovCi0JcHVibGljIEFEREluZm9EaWFsb2coU2hlbGwgcGFyZW50U2hlbGwsIElGaWx0ZXIgZmlsdGVyLAotCQkJT2JqZWN0IGNvbnRlbnRFbGVtZW50LCBTdHJpbmcgdGFiU3RyLCBMaXN0IGFscmVhZHlFeGlzdHMpIHsKLQkJc3VwZXIocGFyZW50U2hlbGwpOwotCQl0aGlzLmZpbHRlciA9IGZpbHRlcjsKLQkJdGhpcy50YWJTdHIgPSB0YWJTdHI7Ci0JCXRoaXMuYWxyZWFkeVNlbGVjdGVkTGlzdCA9IGFscmVhZHlFeGlzdHM7Ci0JCWhlbHBlciA9IG5ldyBGaWx0ZXJIZWxwZXIoY29udGVudEVsZW1lbnQsIHRhYlN0ciwgbnVsbCwgbnVsbCwKLQkJCQlhbHJlYWR5RXhpc3RzKTsKLQkJdGhpcy5jb250ZW50RWxlbWVudCA9IGNvbnRlbnRFbGVtZW50OwotCQlpbml0UHJvdmlkZXJGb3JUYWJzKCk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0cyBhIG5ldyBGaWx0ZXJEaWFsb2cuIE9ubHkgZm9yIG1ldGhvZGNvbmZpZ3VyYXRpb24uIFRoaXMKLQkgKiBjb25zdHJ1Y3RvciB3aWxsIHVzZSBwYXNzZWQgZmlsdGVyLiBJbml0aWFsaXplcyB0aGUgQ29udGVudFByb3ZpZGVyIGZvcgotCSAqIHRoZSB0cmVldmlld2VyLgotCSAqIAotCSAqLwotCS8vIHB1YmxpYyBJdGVtc0ZpbHRlckRpYWxvZyhTaGVsbCBwYXJlbnRTaGVsbCwgT2JqZWN0IGNvbnRlbnRFbGVtZW50LAotCS8vIE1ldGhvZENvbmZpZ3VyYXRpb24gbWV0aG9kQ29uZmlndXJhdGlvbiwgU3RyaW5nIHRhYlN0cikgewotCS8vIHN1cGVyKHBhcmVudFNoZWxsKTsKLQkvLyB0aGlzLmNvbnRlbnRFbGVtZW50ID0gY29udGVudEVsZW1lbnQ7Ci0JLy8gdGhpcy50YWJTdHIgPSB0YWJTdHI7Ci0JLy8gdGhpcy5maWx0ZXIgPSBudWxsOwotCS8vIHRoaXMubWV0aG9kQ29uZmlndXJhdGlvbiA9IG1ldGhvZENvbmZpZ3VyYXRpb247Ci0JLy8gaGVscGVyID0gbmV3IEZpbHRlckhlbHBlcihjb250ZW50RWxlbWVudCwgdGFiU3RyLCBudWxsLCBudWxsLCBudWxsKTsKLQkvLyBpbml0UHJvdmlkZXJGb3JUYWJzKCk7Ci0JLy8gfQotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0b3IgaXMgdmVyeSBnZW5lcmljLCBpbiBvcmRlciB0byBpbml0aWFsaXplIGZpbHRlciwgaW5wdXQKLQkgKiBhbmQgY29udGVudHByb3ZpZGVyIHNob3VsZCBiZSBoYW5kbGVkIGV4cGxpY2l0bHkgYnkgY2FsbGluZyBiZWxvdyBtZXRob2QuCi0JICogc2V0RmlsdGVyKElGaWx0ZXIpIHNldElucHV0KE9iamVjdCkKLQkgKiBzZXRDb250ZW50UHJvdmlkZXIoSVN0cnVjdHVyZWRQcm92aWRlcikKLQkgKiAKLQkgKi8KLQlwdWJsaWMgQURESW5mb0RpYWxvZyhTaGVsbCBwYXJlbnRTaGVsbCkgewotCQlzdXBlcihwYXJlbnRTaGVsbCk7Ci0JCWhlbHBlciA9IG5ldyBGaWx0ZXJIZWxwZXIobnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGlmIGEgYnV0dG9uIGhhcyBiZWVuIHByZXNzZWQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYnV0dG9uUHJlc3NlZChpbnQgYnV0dG9uSWQpIHsKLQkJaWYgKGJ1dHRvbklkID09IElEaWFsb2dDb25zdGFudHMuT0tfSUQpCi0JCQlzYXZlVmFsdWVzKCk7Ci0JCXN1cGVyLmJ1dHRvblByZXNzZWQoYnV0dG9uSWQpOwotCQlpZihjb21wb3NlZEFkYXB0ZXJGYWN0b3J5ICE9IG51bGwpewotCQkJY29tcG9zZWRBZGFwdGVyRmFjdG9yeS5kaXNwb3NlKCk7Ci0JCX0KLQkJY2xvc2UoKTsKLQotCX0KLQotCXB1YmxpYyB2b2lkIHNhdmVWYWx1ZXMoKXsKLQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB0cmVlVmlld2VyCi0JCS5nZXRTZWxlY3Rpb24oKTsKLQkJaWYgKHNlbGVjdGlvbi5zaXplKCkgPiAwKSB7Ci0JCQlPYmplY3RbXSBvYmplY3RBcnIgPSBzZWxlY3Rpb24udG9BcnJheSgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBvYmplY3RBcnIubGVuZ3RoOyBpKyspIHsKLQkJCQlPYmplY3Qgb2JqID0gTGlicmFyeVV0aWwudW53cmFwKG9iamVjdEFycltpXSk7Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJCXNlbGVjdGVkTGlzdC5hZGQob2JqKTsKLQkJCQl9IAotCQkJfQotCQl9Ci0JfQotCQkKLQkvKioKLQkgKiBOb3RpZmllcyB0aGF0IHRoZSBjYW5jZWwgYnV0dG9uIG9mIHRoaXMgZGlhbG9nIGhhcyBiZWVuIHByZXNzZWQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY2FuY2VsUHJlc3NlZCgpIHsKLQkJaWYoY29tcG9zZWRBZGFwdGVyRmFjdG9yeSAhPSBudWxsKXsKLQkJCWNvbXBvc2VkQWRhcHRlckZhY3RvcnkuZGlzcG9zZSgpOwotCQl9Ci0JCXN1cGVyLmNhbmNlbFByZXNzZWQoKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGl0bGUgZm9yIGRpYWxvZyBib3ggZWc6IFNlbGVjdCBEaWFsb2cgRm9yIFJvbGUsIGRpYWxvZ1RpdGxlIG5lZWRzIHRvCi0JICogIlJvbGUiCi0JICovCi0JcHVibGljIHZvaWQgc2V0VGl0bGUoU3RyaW5nIGRpYWxvZ1RpdGxlKSB7Ci0JCXRoaXMuZGlhbG9nVGl0bGUgPSBkaWFsb2dUaXRsZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3cjY29uZmlndXJlU2hlbGwob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGwpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlU2hlbGwoU2hlbGwgc2hlbGwpIHsKLQkJc3VwZXIuY29uZmlndXJlU2hlbGwoc2hlbGwpOwotCQlpZiAoZGlhbG9nVGl0bGUgPT0gbnVsbCkKLQkJCWRpYWxvZ1RpdGxlID0gdGFiU3RyOwotCQlzaGVsbC5zZXRUZXh0KCJBY3Rpdml0eSBEZXRhaWwgRGlhZ3JhbSBJbmZvOiAiICsgZGlhbG9nVGl0bGUpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogKG5vbi1KYXZhZG9jKSBBZGRzIGJ1dHRvbnMgdG8gdGhpcyBkaWFsb2cncyBidXR0b24gYmFyLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBidXR0b24gYmFyIGNvbXBvc2l0ZQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2cjY3JlYXRlQnV0dG9uc0ZvckJ1dHRvbkJhcihvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQnV0dG9uc0ZvckJ1dHRvbkJhcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXN1cGVyLmNyZWF0ZUJ1dHRvbnNGb3JCdXR0b25CYXIocGFyZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGRpYWxvZyBhcmVhIGFuZCBjb250cm9scyBhbmQgdmlld2VyLgotCSAqIAotCSAqIEBwYXJhbSB0aGUKLQkgKiAgICAgICAgICAgIHBhcmVudCBjb21wb3NpdGUgdG8gY29udGFpbiB0aGUgZGlhbG9nIGFyZWEKLQkgKiBAcmV0dXJuIHRoZSBkaWFsb2cgYXJlYSBjb250cm9sCi0JICovCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IChDb21wb3NpdGUpIHN1cGVyLmNyZWF0ZURpYWxvZ0FyZWEocGFyZW50KTsKLQkJY29tcG9zaXRlLnNldEZvbnQocGFyZW50LmdldEZvbnQoKSk7Ci0KLQkJR3JpZExheW91dCBsYXlvdXQgPSAoR3JpZExheW91dCkgY29tcG9zaXRlLmdldExheW91dCgpOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSAxMDsKLQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDEwOwotCQkvL0dyaWREYXRhIGdEID0gKEdyaWREYXRhKSBjb21wb3NpdGUuZ2V0TGF5b3V0RGF0YSgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDM7Ci0KLQkJTGFiZWwgdHlwZUxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQl7Ci0JCQl0eXBlTGFiZWwuc2V0VGV4dCgiU2VsZWN0IHRoZSBhY3Rpdml0eSB0byBtb2RpZnkgQUREIik7IC8vJE5PTi1OTFMtMSQKLQkJCUdyaWREYXRhIGdEMSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5CRUdJTk5JTkcpOwotCQkJdHlwZUxhYmVsLnNldExheW91dERhdGEoZ0QxKTsKLQotCQl9Ci0vLwkJZmlsdGVyVHlwZSA9IG5ldyBDb21ibyhjb21wb3NpdGUsIFNXVC5TSU5HTEUgfCBTV1QuUkVBRF9PTkxZKTsKLS8vCQl7Ci0vLwkJCUdyaWREYXRhIGdEMSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5CRUdJTk5JTkcpOwotLy8JCQlnRDEuaG9yaXpvbnRhbFNwYW4gPSAyOwotLy8JCQlnRDEud2lkdGhIaW50ID0gMzkwOwotLy8JCQlmaWx0ZXJUeXBlLnNldExheW91dERhdGEoZ0QxKTsKLS8vCQl9Ci0vLwotLy8JCWlmICh0eXBlcyA9PSBudWxsKSB7Ci0vLwkJCWZpbGxGaWx0ZXJUeXBlQ29tYm8oKTsKLS8vCQl9IGVsc2UgewotLy8JCQlmaWx0ZXJUeXBlLnNldEl0ZW1zKHR5cGVzKTsKLS8vCQkJaWYgKGhlbHBlciAhPSBudWxsKSB7Ci0vLwkJCQlmaWx0ZXJUeXBlU3RyID0gZmlsdGVyVHlwZS5nZXRJdGVtKDApOwotLy8JCQkJaGVscGVyLnNldEZpbHRlclR5cGVTdHIoZmlsdGVyVHlwZS5nZXRJdGVtKDApKTsKLS8vCQkJCWlmICh0YWJTdHIgPT0gbnVsbCkgewotLy8JCQkJCXRhYlN0ciA9IGZpbHRlclR5cGVTdHI7Ci0vLwkJCQkJaGVscGVyLnNldFRhYlN0cih0YWJTdHIpOwotLy8JCQkJfQotLy8JCQl9Ci0vLwkJfQotLy8JCWZpbHRlclR5cGUuc2VsZWN0KDApOwotCi0vLwkJTGFiZWwgY3RybF9wYXR0ZXJuTGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0vLwkJewotLy8JCQljdHJsX3BhdHRlcm5MYWJlbC5zZXRUZXh0KEF1dGhvcmluZ1VJUmVzb3VyY2VzLkZpbHRlckRpYWxvZ19QYXR0ZXJuX3RleHQpOyAvLyROT04tTkxTLTEkCi0vLwkJCWdELmhvcml6b250YWxTcGFuID0gMzsKLS8vCQkJY3RybF9wYXR0ZXJuTGFiZWwuc2V0TGF5b3V0RGF0YShnRCk7Ci0vLwkJfQotCi0vLwkJY3RybF9wYXR0ZXJuID0gbmV3IFRleHQoY29tcG9zaXRlLCBTV1QuQk9SREVSKTsKLS8vCQl7Ci0vLwkJCUdyaWREYXRhIGdEMSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotLy8JCQlnRDEuaG9yaXpvbnRhbFNwYW4gPSAzOwotLy8JCQljdHJsX3BhdHRlcm4uc2V0TGF5b3V0RGF0YShnRDEpOwotLy8JCQljdHJsX3BhdHRlcm4uZ2V0QWNjZXNzaWJsZSgpLmFkZEFjY2Vzc2libGVMaXN0ZW5lcigKLS8vCQkJCQluZXcgQXV0aG9yaW5nQWNjZXNzaWJsZUxpc3RlbmVyKAotLy8JCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuRmlsdGVyRGlhbG9nX1BhdHRlcm5fdGV4dCArICAKLS8vCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLkZpbHRlckRpYWxvZ19QYXR0ZXJuX2Rlc2NyaXB0aW9uKSk7Ci0vLwkJfQotLy8JCUxhYmVsIGN0cmxfcGF0dGVybkxhYmVsMSA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLS8vCQl7Ci0vLwkJCWN0cmxfcGF0dGVybkxhYmVsMS5zZXRUZXh0KEF1dGhvcmluZ1VJUmVzb3VyY2VzLkZpbHRlckRpYWxvZ19QYXR0ZXJuX2Rlc2NyaXB0aW9uKTsgLy8kTk9OLU5MUy0xJAotLy8JCQljdHJsX3BhdHRlcm5MYWJlbDEuc2V0TGF5b3V0RGF0YShnRCk7Ci0vLwkJfQotCQkKLQkJQ29tcG9zaXRlIGJ1dHRvbnNDb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwkJCi0JCQotCQlHcmlkRGF0YSBnZDIgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMCi0JCQl8IEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRU5EKTsKLQkJZ2QyLmhvcml6b250YWxTcGFuID0gMjsKLQkJYnV0dG9uc0NvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGdkMik7Ci0JCUdyaWRMYXlvdXQgYnV0dG9uc0xheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWJ1dHRvbnNMYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0JCWJ1dHRvbnNMYXlvdXQubWFyZ2luUmlnaHQgPSAwOwotCQlidXR0b25zQ29tcG9zaXRlLnNldExheW91dChidXR0b25zTGF5b3V0KTsKLQkJCi0JCWV4cGFuZEJ1dHRvbiA9IG5ldyBCdXR0b24oYnV0dG9uc0NvbXBvc2l0ZSwgU1dULkJVVFRPTjEpOwotCi0JCWV4cGFuZEJ1dHRvbi5zZXRJbWFnZShBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0U2hhcmVkSW1hZ2UoCi0JCQkJImV4cGFuZGFsbC5naWYiKSk7IC8vJE5PTi1OTFMtMSQKLQkJZXhwYW5kQnV0dG9uLnNldFRvb2xUaXBUZXh0KEF1dGhvcmluZ1VJUmVzb3VyY2VzLkZpbHRlckRpYWxvZ19FeHBhbmRBbGwpOyAKLQkJCi0JCWV4cGFuZEJ1dHRvbi5nZXRBY2Nlc3NpYmxlKCkuYWRkQWNjZXNzaWJsZUxpc3RlbmVyKG5ldyBBdXRob3JpbmdBY2Nlc3NpYmxlTGlzdGVuZXIoCi0JCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5GaWx0ZXJEaWFsb2dfRXhwYW5kQWxsKSk7CQkKLQotCQlnZDIgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9CRUdJTk5JTkcKLQkJCQl8IEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTCk7Ci0KLQkJZXhwYW5kQnV0dG9uLnNldExheW91dERhdGEoZ2QyKTsKLQotCQljb2xsYXBzZUJ1dHRvbiA9IG5ldyBCdXR0b24oYnV0dG9uc0NvbXBvc2l0ZSwgU1dULlBVU0gpOwotCQljb2xsYXBzZUJ1dHRvbi5zZXRJbWFnZShBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0U2hhcmVkSW1hZ2UoCi0JCQkJImNvbGxhcHNlYWxsLmdpZiIpKTsgLy8kTk9OLU5MUy0xJAotCi0JCWNvbGxhcHNlQnV0dG9uLnNldFRvb2xUaXBUZXh0KEF1dGhvcmluZ1VJUmVzb3VyY2VzLkZpbHRlckRpYWxvZ19Db2xsYXBzZUFsbCk7IAotCQljb2xsYXBzZUJ1dHRvbi5nZXRBY2Nlc3NpYmxlKCkuYWRkQWNjZXNzaWJsZUxpc3RlbmVyKG5ldyBBdXRob3JpbmdBY2Nlc3NpYmxlTGlzdGVuZXIoCi0JCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuRmlsdGVyRGlhbG9nX0NvbGxhcHNlQWxsKSk7Ci0JCQotCQlnZDIgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9FTkQpOwotCi0JCWNvbGxhcHNlQnV0dG9uLnNldExheW91dERhdGEoZ2QyKTsKLQkJCi0JCWNyZWF0ZUxpbmUoY29tcG9zaXRlLCAzKTsKLQkJY3JlYXRlVmlld2VyTGFiZWwoY29tcG9zaXRlKTsKLQkJLy8gY3JlYXRlIGEgdHJlZXZpZXdlciBhcmVhLgotCQljcmVhdGVWaWV3ZXIoY29tcG9zaXRlKTsKLQotCi0JCW5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKS5zZXRUZXh0KEF1dGhvcmluZ1VJUmVzb3VyY2VzLkZpbHRlckRpYWxvZ19CcmllZkRlc2NyaXB0aW9uKTsgCi0JCWN0cmxfYnJpZWZfZGVzYyA9IG5ldyBUZXh0KGNvbXBvc2l0ZSwgU1dULkJPUkRFUiB8IFNXVC5NVUxUSSB8IFNXVC5XUkFQCi0JCQkJfCBTV1QuVl9TQ1JPTEwgfCBTV1QuUkVBRF9PTkxZKTsKLQkJewotCQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJCWdkLmhvcml6b250YWxTcGFuID0gMzsKLQkJCWdkLmhlaWdodEhpbnQgPSA2MDsKLQkJCWN0cmxfYnJpZWZfZGVzYy5zZXRMYXlvdXREYXRhKGdkKTsKLQkJfQotCQkvLyBSZXN0b3JlIHRoZSBsYXN0IHN0YXRlCi0JCWNyZWF0ZUxpbmUoY29tcG9zaXRlLCAzKTsKLQotCQkvLyBSZXR1cm4gcmVzdWx0cy4KLQkJYWRkTGlzdGVuZXIoKTsKLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCIkJCQgY3JlYXRlRGlhbG9nQXJlYS5maWx0ZXJUeXBlU3RyID0gIiArCi0JCS8vIGZpbHRlclR5cGVTdHIpOwotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhIG5ldyB2aWV3ZXIgaW4gdGhlIHBhcmVudC4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IDxjb2RlPkNvbXBvc2l0ZTwvY29kZT4uCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVZpZXdlcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCWlmICh2aWV3ZXJTZWxlY3Rpb25TaW5nbGUpIHsKLQkJCXRyZWVWaWV3ZXIgPSBuZXcgVHJlZVZpZXdlcihwYXJlbnQsIFNXVC5TSU5HTEUgfCBTV1QuSF9TQ1JPTEwKLQkJCQkJfCBTV1QuVl9TQ1JPTEwgfCBTV1QuQk9SREVSKTsKLQkJfSBlbHNlIHsKLQkJCXRyZWVWaWV3ZXIgPSBuZXcgVHJlZVZpZXdlcihwYXJlbnQsIFNXVC5NVUxUSSB8IFNXVC5IX1NDUk9MTAotCQkJCQl8IFNXVC5WX1NDUk9MTCB8IFNXVC5CT1JERVIpOwotCQl9Ci0JCXRyZWVWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihsYWJlbFByb3ZpZGVyKTsKLQkJdHJlZVZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIoY29udGVudFByb3ZpZGVyKTsKLQkJdHJlZVZpZXdlci5zZXRVc2VIYXNobG9va3VwKHRydWUpOwotCi0JCWlmIChpbnB1dCAhPSBudWxsKSB7Ci0JCQl0cmVlVmlld2VyLnNldElucHV0KGlucHV0KTsKLQkJfSBlbHNlIHsKLQkJCS8vIFBob25nOiB0aGlzIGlzIHRvbyBtZXNzeS4gSWYgeW91IHJlbGllcyBvbiB0aGUgY29udGVudEVsZW1lbnQgdG8KLQkJCS8vIGRldGVybWluZSB0aGUgaW5wdXQgZm9yIHRoZSB2aWV3ZXIKLQkJCS8vIHRoZW4geW91IHNob3VsZCBkZWNsYXJlIGEgaW5wdXQgZmllbGQgaW5zdGVhZCBhbmQgbW92ZSB0aGlzIGNvZGUKLQkJCS8vIHRvIGNvbnN0cnVjdG9yCi0JCQkvLwotCQkJLy8gc29ydGVyIG5lZWRzIG9yIG5vdC4gVE9ETwotCQkJaWYgKGNvbnRlbnRFbGVtZW50ICE9IG51bGwpIHsKLQkJCQlpZiAoY29udGVudEVsZW1lbnQgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCQlpZiAoY29udGVudEVsZW1lbnQgaW5zdGFuY2VvZiBQcm9jZXNzKSB7Ci0JCQkJCQlpZiAoKChQcm9jZXNzKSBjb250ZW50RWxlbWVudCkuZUNvbnRhaW5lcigpIGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkgewotCQkJCQkJCWlmICh0YWJTdHIuZXF1YWxzKEZpbHRlckNvbnN0YW50cy5HVUlEQU5DRSkKLQkJCQkJCQkJCXx8IHRhYlN0ci5lcXVhbHMoRmlsdGVyQ29uc3RhbnRzLlJPQURNQVApIAotCQkJCQkJCQkJfHwgdGFiU3RyLmVxdWFscyhGaWx0ZXJDb25zdGFudHMuU1VQUE9SVElOR19NQVRFUklBTFMpKSB7Ci0JCQkJCQkJCXRyZWVWaWV3ZXIKLQkJCQkJCQkJCQkuc2V0SW5wdXQoVW1hVXRpbAotCQkJCQkJCQkJCQkJLmdldE1ldGhvZExpYnJhcnkoKEVPYmplY3QpIGNvbnRlbnRFbGVtZW50KSk7Ci0JCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJdHJlZVZpZXdlci5zZXRJbnB1dCgoKFByb2Nlc3MpIGNvbnRlbnRFbGVtZW50KQotCQkJCQkJCQkJCS5lQ29udGFpbmVyKCkpOwotCQkJCQkJCX0KLQkJCQkJCX0gZWxzZQotCQkJCQkJCXRyZWVWaWV3ZXIuc2V0SW5wdXQoY29udGVudEVsZW1lbnQpOwotCQkJCQl9IGVsc2UKLQkJCQkJCXRyZWVWaWV3ZXIuc2V0SW5wdXQoVW1hVXRpbAotCQkJCQkJCQkuZ2V0TWV0aG9kTGlicmFyeSgoRU9iamVjdCkgY29udGVudEVsZW1lbnQpKTsKLQkJCQl9IGVsc2UgewotCQkJCQl0cmVlVmlld2VyLnNldElucHV0KFVtYVV0aWwKLQkJCQkJCQkuZ2V0TWV0aG9kTGlicmFyeSgoRU9iamVjdCkgY29udGVudEVsZW1lbnQpKTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCXRyZWVWaWV3ZXIKLQkJCQkJCS5zZXRJbnB1dChMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCkpOwotCQkJfQotCQl9Ci0KLQkJdHJlZVZpZXdlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIodGhpcyk7Ci0JCXRyZWVWaWV3ZXIuYWRkRG91YmxlQ2xpY2tMaXN0ZW5lcih0aGlzKTsKLQkJdHJlZVZpZXdlci5nZXRUcmVlKCkuc2V0Rm9udChwYXJlbnQuZ2V0Rm9udCgpKTsKLQotCQlpZiAodGFiU3RyLmVxdWFsc0lnbm9yZUNhc2UoRmlsdGVyQ29uc3RhbnRzLkFMTF9FTEVNRU5UUykpIHsgCi0JCQl0cmVlVmlld2VyLnNldFNvcnRlcihuZXcgRmlsdGVyU29ydGVyRm9yQWxsKCkpOwotCQl9IGVsc2UgewotCQkJdHJlZVZpZXdlci5zZXRTb3J0ZXIobmV3IEZpbHRlclNvcnRlcigpKTsKLQkJfQotCi0JCS8vIHRyZWVWaWV3ZXIuZXhwYW5kVG9MZXZlbCgzKTsKLQkJLy8gdHJlZVZpZXdlci5leHBhbmRBbGwoKTsKLQotCQlHcmlkRGF0YSBzcGVjID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCXsKLQkJCXNwZWMud2lkdGhIaW50ID0gMzAwOwotCQkJc3BlYy5oZWlnaHRIaW50ID0gMzAwOwotCQkJc3BlYy5ob3Jpem9udGFsU3BhbiA9IDM7Ci0JCQl0cmVlVmlld2VyLmdldENvbnRyb2woKS5zZXRMYXlvdXREYXRhKHNwZWMpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUxpbmUoQ29tcG9zaXRlIHBhcmVudCwgaW50IG5jb2wpIHsKLQkJTGFiZWwgbGluZSA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5TRVBBUkFUT1IgfCBTV1QuSE9SSVpPTlRBTAotCQkJCXwgU1dULkJPTEQpOwotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IG5jb2w7Ci0JCWxpbmUuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVZpZXdlckxhYmVsKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgIAkJaWYgKHZpZXdlckxhYmVsICE9IG51bGwpIHsKLSAgIAkJCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5PTkUpOwotCQkJbGFiZWwuc2V0VGV4dCh2aWV3ZXJMYWJlbCk7Ci0gICAJCX0KLSAgIAl9Ci0JCi0JcHVibGljIHZvaWQgc2V0Vmlld2VyU2VsZWN0aW9uU2luZ2xlKGJvb2xlYW4gc2luZ2xlKSB7Ci0JCXZpZXdlclNlbGVjdGlvblNpbmdsZSA9IHNpbmdsZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSURvdWJsZUNsaWNrTGlzdGVuZXIjZG91YmxlQ2xpY2sob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5Eb3VibGVDbGlja0V2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGRvdWJsZUNsaWNrKERvdWJsZUNsaWNrRXZlbnQgZXZlbnQpIHsKLQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gcyA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgZXZlbnQuZ2V0U2VsZWN0aW9uKCk7Ci0JCU9iamVjdCBlbGVtZW50ID0gcy5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJZWxlbWVudCA9IExpYnJhcnlVdGlsLnVud3JhcChlbGVtZW50KTsKLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBDb250ZW50RWxlbWVudCB8fCBlbGVtZW50IGluc3RhbmNlb2YgUHJvY2VzcykgewotCQkJc2VsZWN0ZWRMaXN0LmFkZChlbGVtZW50KTsKLQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkgewotCQkJc2VsZWN0ZWRMaXN0LmFkZChlbGVtZW50KTsKLQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudCkgewotCQkJLy8gaWYoIShlbGVtZW50IGluc3RhbmNlb2YgQWN0aXZpdHkpKQotCQkJc2VsZWN0ZWRMaXN0LmFkZChlbGVtZW50KTsKLQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgUHJvY2Vzc1BhY2thZ2UpIHsKLQkJCS8vIGlmKCEoZWxlbWVudCBpbnN0YW5jZW9mIEFjdGl2aXR5KSkKLQkJCXNlbGVjdGVkTGlzdC5hZGQoZWxlbWVudCk7Ci0JCX0KLQkJY2xvc2UoKTsKLQkJaWYoY29tcG9zZWRBZGFwdGVyRmFjdG9yeSAhPSBudWxsKXsKLQkJCWNvbXBvc2VkQWRhcHRlckZhY3RvcnkuZGlzcG9zZSgpOwotCQl9Ci0JfQotCi0JCi0JcHVibGljIHZvaWQgdHJhdmVyc2VUcmVlKFRyZWVJdGVtW10gaXRlbXMsIExpc3QgbGlzdCkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7Ci0JCQlUcmVlSXRlbVtdIGl0ZW1zeCA9IGl0ZW1zW2ldLmdldEl0ZW1zKCk7Ci0JCQlpZiAoaXRlbXN4Lmxlbmd0aCA+IDEpIHsKLQkJCQlsaXN0LmFkZChpdGVtc1tpXS5nZXREYXRhKCkpOwotCQkJCXRyYXZlcnNlVHJlZShpdGVtc3gsIGxpc3QpOwotCQkJfSBlbHNlIHsKLQkJCQlsaXN0LmFkZChpdGVtc1tpXS5nZXREYXRhKCkpOwotCQkJfQotCQl9Ci0JfQotCi0JCi0KLQotCS8qKgotCSAqIE5vdGlmaWVzIHRoYXQgdGhlIHNlbGVjdGlvbiBoYXMgY2hhbmdlZC4KLQkgKiAKLQkgKiBAcGFyYW0gZXZlbnQKLQkgKiAgICAgICAgICAgIGV2ZW50IG9iamVjdCBkZXNjcmliaW5nIHRoZSBjaGFuZ2UKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQl1cGRhdGVTZWxlY3Rpb24oZXZlbnQpOwotCQl1cGRhdGVCdXR0b25zKCk7Ci0JfQotCi0JLyoqCi0JICogVXBkYXRlIHRoZSBidXR0b24gZW5hYmxlbWVudCBzdGF0ZS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVCdXR0b25zKCkgewotCQkvLyBva0J1dHRvbi5zZXRFbmFibGVkKGdldFNlbGVjdGlvbigpLmxlbmd0aCA+IDApOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50T2JqZWN0KE9iamVjdCBjb250ZW50RWxlbWVudCkgewotCQlyZXR1cm4gTWV0aG9kRWxlbWVudFV0aWwuZ2V0TWV0aG9kTW9kZWwoY29udGVudEVsZW1lbnQpOwotCX0KLQotCS8qKgotCSAqIFVwZGF0ZSB0aGUgc2VsZWN0aW9uIG9iamVjdC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVTZWxlY3Rpb24oU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCS8vIEFycmF5TGlzdCBkZXNjcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBldmVudC5nZXRTZWxlY3Rpb24oKTsKLQkJT2JqZWN0IHNlbGVjdGVkID0gc2VsLmdldEZpcnN0RWxlbWVudCgpOwotCQlpZiAoc2VsZWN0ZWQgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlciB8fAotCQkJCXNlbGVjdGVkIGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudEl0ZW1Qcm92aWRlcil7Ci0JCQlPYmplY3QgdW53cmFwID0gIFRuZ1V0aWwudW53cmFwKHNlbGVjdGVkKTsKLQkJCXNldEJyaWVmRGVzY3JpcHRpb24odW53cmFwKTsKLQkJfWVsc2UgewotCQkJc2V0QnJpZWZEZXNjcmlwdGlvbihzZWxlY3RlZCk7Ci0JCX0KLQl9Ci0JLyoqCi0JICogU2V0IHRoZSBicmllZiBkZXNjcmlwdGlvbiB0byBjb250cm9sCi0JICovCi0JcHJpdmF0ZSB2b2lkIHNldEJyaWVmRGVzY3JpcHRpb24oT2JqZWN0IGVsZW1lbnQpIHsKLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQlTdHJpbmcgZGVzYyA9ICgoTWV0aG9kRWxlbWVudCkgZWxlbWVudCkuZ2V0QnJpZWZEZXNjcmlwdGlvbigpOwotCQkJaWYgKGRlc2MgIT0gbnVsbCkgewotCQkJCWN0cmxfYnJpZWZfZGVzYy5zZXRUZXh0KGRlc2MpOwotCQkJfQotCQl9Ci0JfQotCi0JCi0KLQlwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcigpIHsKLQotCQlleHBhbmRCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJdHJlZVZpZXdlci5leHBhbmRBbGwoKTsKLQotCQkJfQotCQl9KTsKLQkJY29sbGFwc2VCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJdHJlZVZpZXdlci5jb2xsYXBzZUFsbCgpOwotCi0JCQl9Ci0JCX0pOwotCi0JfQotCi0JcHVibGljIEFycmF5TGlzdCBnZXRTZWxlY3RlZEl0ZW1zKCkgewotCQlyZXR1cm4gc2VsZWN0ZWRMaXN0OwotCX0KLQotCXByaXZhdGUgdm9pZCBpbml0UHJvdmlkZXJGb3JUYWJzKCkgewotCi0JCWlmIChmaWx0ZXIgIT0gbnVsbCkgewotCQkJaWYgKGZpbHRlciBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuSUZpbHRlcikgewotCQkJCWlmKGZpbHRlciBpbnN0YW5jZW9mIElDYXRlZ29yeUZpbHRlcil7Ci0JCQkJCS8vIHNwZWNpYWwgaGFuZGxpbmcgZm9yIGNvbnRlbnRjYXRlZ29yeS4KLQkJCQkJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE1NzQ1MgotCQkJCQloZWxwZXIuc2V0Q29udGVudENhdGVnb3J5VGFiU3RyKHRhYlN0cik7Ci0JCQkJfQotCQkJCSgob3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5JRmlsdGVyKSBmaWx0ZXIpCi0JCQkJCQkuc2V0SGVscGVyKGhlbHBlcik7Ci0JCQl9IGVsc2UgaWYgKGZpbHRlciBpbnN0YW5jZW9mIERlc2NyaXB0b3JDb25maWd1cmF0aW9uRmlsdGVyKSB7Ci0JCQkJKChEZXNjcmlwdG9yQ29uZmlndXJhdGlvbkZpbHRlcikgZmlsdGVyKS5zZXRIZWxwZXIoaGVscGVyKTsKLQkJCX1lbHNlIGlmIChmaWx0ZXIgaW5zdGFuY2VvZiBFeFByb2Nlc3NBdXRob3JpbmdDb25maWd1cmF0b3IpIHsKLQkJCQkoKEV4UHJvY2Vzc0F1dGhvcmluZ0NvbmZpZ3VyYXRvcikgZmlsdGVyKS5zZXRIZWxwZXIoaGVscGVyKTsKLQkJCX0KLQkJfQotCQlpZiAoZmlsdGVyIGluc3RhbmNlb2YgSVByb2Nlc3NGaWx0ZXIpIHsKLQkJCWlmICh0YWJTdHIKLQkJCQkJLmVxdWFsc0lnbm9yZUNhc2UoRmlsdGVyQ29uc3RhbnRzLldPUktfUFJPRFVDVF9ERVNDUklQVE9SUykpIHsKLQkJCQlhZGFwdGVyRmFjdG9yeSA9VG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UuZ2V0UEJTRmlsdGVyX0FkYXB0ZXJGYWN0b3J5KGZpbHRlcik7Ci0JCQkJY29udGVudFByb3ZpZGVyID0gbmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKAotCQkJCQkJYWRhcHRlckZhY3RvcnkpOwotCQkJCWNvbXBvc2VkQWRhcHRlckZhY3RvcnkgPSBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRS5nZXRQQlNGaWx0ZXJfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpOwotCQkJCWxhYmVsUHJvdmlkZXIgPSBuZXcgQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyKAotCQkJCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJCQkJLmdldFBCU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpOwotCQkJfSBlbHNlIGlmICh0YWJTdHIKLQkJCQkJLmVxdWFsc0lnbm9yZUNhc2UoRmlsdGVyQ29uc3RhbnRzLlJPTEVfREVTQ1JJUFRPUlMpKSB7Ci0JCQkJYWRhcHRlckZhY3RvcnkgPSBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCS5nZXRPQlNGaWx0ZXJfQWRhcHRlckZhY3RvcnkoZmlsdGVyKTsgCi0JCQkJY29udGVudFByb3ZpZGVyID0gbmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQkJCQljb21wb3NlZEFkYXB0ZXJGYWN0b3J5ID0gVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UuZ2V0T0JTRmlsdGVyX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKTsKLQkJCQlsYWJlbFByb3ZpZGVyID0gbmV3IEFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcigKLQkJCQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkJCS5nZXRPQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWFkYXB0ZXJGYWN0b3J5ID0gVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJCS5nZXRJdGVtc0ZpbHRlcl9BZGFwdGVyRmFjdG9yeShmaWx0ZXIpOyAKLQkJCWNvbnRlbnRQcm92aWRlciA9IG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcihhZGFwdGVyRmFjdG9yeSk7Ci0JCQljb21wb3NlZEFkYXB0ZXJGYWN0b3J5ID0gVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UuZ2V0SXRlbXNGaWx0ZXJfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RXhpc3RpbmdFbGVtZW50cyhMaXN0IGxpc3QpIHsKLQkJdGhpcy5hbHJlYWR5U2VsZWN0ZWRMaXN0ID0gbGlzdDsKLQkJaWYgKGhlbHBlciAhPSBudWxsKSB7Ci0JCQloZWxwZXIuc2V0QWxyZWFkeVNlbGVjdGVkTGlzdChsaXN0KTsKLQkJfQotCX0KLQotCXB1YmxpYyBGaWx0ZXJIZWxwZXIgZ2V0SGVscGVyKCkgewotCQlyZXR1cm4gdGhpcy5oZWxwZXI7Ci0JfQotCi0JcHVibGljIFN0cmluZ1tdIGdldEZpbHRlclR5cGVBcnJheSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiBzZXRzIHRoZSBDb250ZW50UHJvdmlkZXIgdXNlZCBieSBUcmVlVmlld2VyLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvbnRlbnRQcm92aWRlcihJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciBjb250ZW50UHJvdmlkZXIsCi0JCQlDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IGNvbXBvc2VkQWRhcHRlckZhY3RvcnkpIHsKLQkJdGhpcy5jb250ZW50UHJvdmlkZXIgPSBjb250ZW50UHJvdmlkZXI7Ci0JCXRoaXMuY29tcG9zZWRBZGFwdGVyRmFjdG9yeSA9IGNvbXBvc2VkQWRhcHRlckZhY3Rvcnk7Ci0JfQotCi0JLyoKLQkgKiBzZXQgdGhlIEZpbHRlci4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGaWx0ZXIoSUZpbHRlciBmaWx0ZXIpIHsKLQkJdGhpcy5maWx0ZXIgPSBmaWx0ZXI7Ci0JCWlmIChoZWxwZXIgIT0gbnVsbCkgewotCQkJaWYgKHRoaXMuZmlsdGVyIGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5JRmlsdGVyKSB7Ci0JCQkJKChvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLklGaWx0ZXIpIHRoaXMuZmlsdGVyKQotCQkJCQkJLnNldEhlbHBlcihoZWxwZXIpOwotCQkJfSBlbHNlIGlmICh0aGlzLmZpbHRlciBpbnN0YW5jZW9mIERlc2NyaXB0b3JDb25maWd1cmF0aW9uRmlsdGVyKSB7Ci0JCQkJKChEZXNjcmlwdG9yQ29uZmlndXJhdGlvbkZpbHRlcikgdGhpcy5maWx0ZXIpLnNldEhlbHBlcihoZWxwZXIpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0SW5wdXQoT2JqZWN0IGlucHV0KSB7Ci0JCWlmIChpbnB1dCAhPSBudWxsKSB7Ci0JCQl0aGlzLmlucHV0ID0gaW5wdXQ7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRWaWV3ZXJMYWJlbChTdHJpbmcgdmlld2VyTGFiZWwpIHsKLQkJdGhpcy52aWV3ZXJMYWJlbCA9IHZpZXdlckxhYmVsOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2RpYWxvZ3MvQXNzaWduRGlhbG9nLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2RpYWxvZ3MvQXNzaWduRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhZmI3YWMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9kaWFsb2dzL0Fzc2lnbkRpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTk5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZGlhbG9nczsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJJOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnMuTGlicmFyeVZpZXdTaW1wbGVBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zLlVuYXNzaWduQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQ3VzdG9tQ2F0ZWdvcnlBc3NpZ25QYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udWkudXRpbC5Nc2dEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnVpLlVzZXJJbnRlcmFjdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuSVJ1bm5hYmxlV2l0aFByb2dyZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Nb2RlbFN0cnVjdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb24uVW5pcXVlTmFtZVBOYW1lSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5zZXJ2aWNlcy5MaWJyYXJ5TW9kaWZpY2F0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuTGlicmFyeVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5SZXNvdXJjZVNjYW5uZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkN1c3RvbUNhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5VbWFVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLlByb2dyZXNzTW9uaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ3Vyc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotCi0KLS8qKgotICogRGlhbG9nIGZvciBhc3NpZ2luZyBNZXRob2RFbGVtZW50IHdpdGhpbiBNZXRob2RMaWJyYXJ5LgotICogCi0gKiBAYXV0aG9yIFdlaXBpbmcgTHUKLSAqIEBzaW5jZSAxLjUKLSAqLwotcHVibGljIGNsYXNzIEFzc2lnbkRpYWxvZyBleHRlbmRzIERpYWxvZyBpbXBsZW1lbnRzIElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgewotCi0JQXJyYXlMaXN0IHVzZWRDYXRlZ29yaWVzID0gbmV3IEFycmF5TGlzdCgpOwotCQotCXByaXZhdGUgVHJlZVZpZXdlciB0cmVlVmlld2VyOwotCi0JcHJpdmF0ZSBBcnJheUxpc3QgZWxlbWVudHM7Ci0KLQlwcml2YXRlIE9iamVjdCBkZXN0aW5hdGlvbjsKLQkKLQlwcml2YXRlIGJvb2xlYW4gYXNzaWduaW5nID0gZmFsc2U7Ci0KLQlwcml2YXRlIFByb2dyZXNzTW9uaXRvclBhcnQgcHJvZ3Jlc3NNb25pdG9yUGFydDsKLQotCXByaXZhdGUgQ3Vyc29yIHdhaXRDdXJzb3I7Ci0JCi0JcHJpdmF0ZSBib29sZWFuIGxvY2tlZFVJID0gZmFsc2U7Ci0KLQlwdWJsaWMgc3RhdGljIEFzc2lnbkRpYWxvZyBuZXdBc3NpZ25EaWFsb2coU2hlbGwgcGFyZW50U2hlbGwsIENvbGxlY3Rpb24gZWxlbWVudHMpIHsKLQkJcmV0dXJuIG5ldyBBc3NpZ25EaWFsb2cocGFyZW50U2hlbGwsIGVsZW1lbnRzKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBBc3NpZ25EaWFsb2cgbmV3UmVhc3NpZ25EaWFsb2coU2hlbGwgcGFyZW50U2hlbGwsCi0JCQlDb2xsZWN0aW9uIGVsZW1lbnRzLCBNZXRob2RFbGVtZW50IHBhcmVudEVsZW1lbnQpIHsKLQkJcmV0dXJuIG5ldyBSZWFzc2lnbkRpYWxvZyhwYXJlbnRTaGVsbCwgZWxlbWVudHMsIHBhcmVudEVsZW1lbnQpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIEFzc2lnbkRpYWxvZyBuZXdEZWVwQ29weURpYWxvZyhTaGVsbCBwYXJlbnRTaGVsbCwgQ29sbGVjdGlvbiBlbGVtZW50cykgewotCQlyZXR1cm4gbmV3IEN1c3RvbUNhdGVnb3J5RGVlcENvcHlEaWFsb2cocGFyZW50U2hlbGwsIGVsZW1lbnRzKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIEFzc2lnbkRpYWxvZyhTaGVsbCBwYXJlbnRTaGVsbCwgQ29sbGVjdGlvbiBlbGVtZW50c1RvQXNzaWduKSB7Ci0JCXN1cGVyKHBhcmVudFNoZWxsKTsKLQotCQllbGVtZW50cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZWxlbWVudHMuYWRkQWxsKGVsZW1lbnRzVG9Bc3NpZ24pOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2cjY3JlYXRlRGlhbG9nQXJlYShvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCi0JICovCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSAoQ29tcG9zaXRlKSBzdXBlci5jcmVhdGVEaWFsb2dBcmVhKHBhcmVudCk7Ci0KLQkJR3JpZExheW91dCBsYXlvdXQgPSAoR3JpZExheW91dCkgY29tcG9zaXRlLmdldExheW91dCgpOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSAxMDsKLQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDEwOwotCi0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlsYWJlbC5zZXRUZXh0KEF1dGhvcmluZ1VJUmVzb3VyY2VzLk1vdmVEaWFsb2dfZGVzdGluYXRpb25fdGV4dCk7IAotCQlHcmlkRGF0YSBsYXlvdXREYXRhID0gbmV3IEdyaWREYXRhKFNXVC5CRUdJTk5JTkcpOwotCQlsYWJlbC5zZXRMYXlvdXREYXRhKGxheW91dERhdGEpOwotCi0JCXRyZWVWaWV3ZXIgPSBuZXcgVHJlZVZpZXdlcihjb21wb3NpdGUsIFNXVC5TSU5HTEUgfCBTV1QuSF9TQ1JPTEwKLQkJCQl8IFNXVC5WX1NDUk9MTCB8IFNXVC5CT1JERVIpOwotCQlBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSA9IFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJLmdldE5hdmlnYXRvclZpZXdfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpOwotCQl0cmVlVmlld2VyLnNldExhYmVsUHJvdmlkZXIobmV3IEFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcigKLQkJCQlhZGFwdGVyRmFjdG9yeSkpOwotCQl0cmVlVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoCi0JCQkJYWRhcHRlckZhY3RvcnkpKTsKLQkJdHJlZVZpZXdlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIodGhpcyk7Ci0JCS8vIHRyZWVWaWV3ZXIuYWRkRG91YmxlQ2xpY2tMaXN0ZW5lcih0aGlzKTsKLQotCQlHcmlkRGF0YSBzcGVjID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCXsKLQkJCXNwZWMud2lkdGhIaW50ID0gMzAwOwotCQkJc3BlYy5oZWlnaHRIaW50ID0gMzAwOwotCQkJdHJlZVZpZXdlci5nZXRDb250cm9sKCkuc2V0TGF5b3V0RGF0YShzcGVjKTsKLQkJfQotCi0JCXRyZWVWaWV3ZXIuc2V0SW5wdXQoTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpKTsKLQotCQlHcmlkTGF5b3V0IHBtbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJcG1sYXlvdXQubnVtQ29sdW1ucyA9IDE7Ci0JCXByb2dyZXNzTW9uaXRvclBhcnQgPSBjcmVhdGVQcm9ncmVzc01vbml0b3JQYXJ0KGNvbXBvc2l0ZSwgcG1sYXlvdXQpOwotCQlwcm9ncmVzc01vbml0b3JQYXJ0Ci0JCQkJLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQlwcm9ncmVzc01vbml0b3JQYXJ0LnNldFZpc2libGUoZmFsc2UpOwotCi0JCXdhaXRDdXJzb3IgPSBwYXJlbnQuZ2V0U2hlbGwoKS5nZXREaXNwbGF5KCkuZ2V0U3lzdGVtQ3Vyc29yKAotCQkJCVNXVC5DVVJTT1JfV0FJVCk7Ci0JCQotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdyNjb25maWd1cmVTaGVsbChvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVTaGVsbChTaGVsbCBuZXdTaGVsbCkgewotCQlzdXBlci5jb25maWd1cmVTaGVsbChuZXdTaGVsbCk7Ci0JCW5ld1NoZWxsLnNldFRleHQoQXV0aG9yaW5nVUlSZXNvdXJjZXMuQXNzaWduRGlhbG9nX2Fzc2lnbl90ZXh0KTsgCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIjc2VsZWN0aW9uQ2hhbmdlZChvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQlkZXN0aW5hdGlvbiA9IFRuZ1V0aWwudW53cmFwKCgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGV2ZW50Ci0JCQkJLmdldFNlbGVjdGlvbigpKS5nZXRGaXJzdEVsZW1lbnQoKSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZyNva1ByZXNzZWQoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIG9rUHJlc3NlZCgpIHsKLQkJaWYgKGRvQXNzaWduKCkpIHsKLQkJCXN1cGVyLm9rUHJlc3NlZCgpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzVmFsaWREZXN0aW5hdGlvbigpIHsKLQkJaWYgKCEgKGRlc3RpbmF0aW9uIGluc3RhbmNlb2YgQ3VzdG9tQ2F0ZWdvcnkpICkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWlmIChlbGVtZW50cyA9PSBudWxsIHx8IGVsZW1lbnRzLmlzRW1wdHkoKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCU1ldGhvZFBsdWdpbiB0YXJnZXRQbHVnaW4gPSBMaWJyYXJ5VXRpbC5nZXRNZXRob2RQbHVnaW4oKEN1c3RvbUNhdGVnb3J5KSBkZXN0aW5hdGlvbik7Ci0JCWlmICh0YXJnZXRQbHVnaW4gPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCQotCQlpZiAoZWxlbWVudHMuZ2V0KDApIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJTWV0aG9kUGx1Z2luIHNvdXJjZVBsdWdpbiA9IExpYnJhcnlVdGlsLmdldE1ldGhvZFBsdWdpbigoTWV0aG9kRWxlbWVudCkgZWxlbWVudHMuZ2V0KDApKTsKLQkJCWlmIChzb3VyY2VQbHVnaW4gPT0gdGFyZ2V0UGx1Z2luKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCQlpZiAodGFyZ2V0UGx1Z2luLmdldEJhc2VzKCkuY29udGFpbnMoc291cmNlUGx1Z2luKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBkb0Fzc2lnbigpIHsKLQkJLy9UbyBkbzogCi0JCS8vKDEpIEltcGxlbWVudCBjaXJjdWxhciBkZXBlbmRlbmN5IGNoZWNrIGZvciBpc1ZhbGlkRGVzdGluYXRpb24gKG5pY2UgdG8gaGF2ZSB0aGUgY2hlY2sKLQkJLy8gICAgYXQgdGhpcyBwb2ludCwgYWx0aG91Z2ggdGhlIGNpcmN1bGF0IGNoZWNrIHdvdWxkIGJlIGRvbmUgZHVyaW5nICJydW4iIGFjdGlvbiB0b28gCi0JCS8vKDIpIENoYW5nZSAibW92ZSIgdG8gImFzc2lnbiIgc3RyaW5ncwotCQlpZiAoZGVzdGluYXRpb24gPT0gbnVsbCkgewotCQkJU3RyaW5nIHRpdGxlID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZXJyb3JEaWFsb2dfdGl0bGU7IAotCQkJU3RyaW5nIHByb2JsZW0gPSBBdXRob3JpbmdVSVJlc291cmNlcy5Nb3ZlRGlhbG9nX25vbW92ZV9kZXN0aW5hdGlvbl9wcm9ibGVtX21zZzsgCi0JCQlTdHJpbmcgbXNnID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuTW92ZURpYWxvZ19zZWxlY3RkZXN0aW5hdGlvbl90ZXh0OyAKLQkJCU1zZ0RpYWxvZyBkaWFsb2cgPSBBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCk7Ci0JCQlkaWFsb2cuZGlzcGxheUVycm9yKHRpdGxlLCBwcm9ibGVtLCBtc2cpOyAKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlpZiAoIWlzVmFsaWREZXN0aW5hdGlvbigpKSB7Ci0JCQlTdHJpbmcgdGl0bGUgPSBBdXRob3JpbmdVSVJlc291cmNlcy5lcnJvckRpYWxvZ190aXRsZTsgCi0JCQlTdHJpbmcgcHJvYmxlbSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLk1vdmVEaWFsb2dfaW52YWxpZF9tb3ZlX2Rlc3RpbmF0aW9uX3Byb2JsZW1fbXNnOyAKLQkJCVN0cmluZyBtc2cgPSBBdXRob3JpbmdVSVJlc291cmNlcy5Nb3ZlRGlhbG9nX3ZhbGlkZGVzdGluYXRpb25fdGV4dDsgCi0JCQlNc2dEaWFsb2cgZGlhbG9nID0gQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpOwotCQkJZGlhbG9nLmRpc3BsYXlFcnJvcih0aXRsZSwgcHJvYmxlbSwgbXNnKTsgCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0gZWxzZSB7Ci0JCQlJU3RhdHVzIHN0YXR1cyA9IFVzZXJJbnRlcmFjdGlvbkhlbHBlci5jaGVja01vZGlmeSgKLQkJCQkJKEVPYmplY3QpIGRlc3RpbmF0aW9uLCBnZXRTaGVsbCgpKTsKLQkJCWlmICghc3RhdHVzLmlzT0soKSkgewotCQkJCVN0cmluZyB0aXRsZSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmVycm9yRGlhbG9nX3RpdGxlOyAKLQkJCQlTdHJpbmcgbXNnID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuTW92ZURpYWxvZ19jYW5ub3RNb2RpZnlEZXN0aW5hdGlvbjsgCi0JCQkJTXNnRGlhbG9nIGRpYWxvZyA9IEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKQotCQkJCQkJLmdldE1zZ0RpYWxvZygpOwotCQkJCWRpYWxvZy5kaXNwbGF5RXJyb3IodGl0bGUsIG1zZywgc3RhdHVzKTsgCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0KLQkJYXNzaWduaW5nID0gdHJ1ZTsJCQotCQkKLQkJSVJ1bm5hYmxlV2l0aFByb2dyZXNzIHJ1bm5hYmxlID0gbmV3IElSdW5uYWJsZVdpdGhQcm9ncmVzcygpIHsKLQotCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLQkJCQkJdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJCQltb25pdG9yLnN1YlRhc2soQXV0aG9yaW5nVUlSZXNvdXJjZXMuYXNzaWduQWN0aW9uX3RleHQpOwotCQkJCXRyeSB7Ci0JCQkJCUNvbGxlY3Rpb248UmVzb3VyY2U+IHJlc291cmVzVG9TYXZlID0gZG9Xb3JrQmVmb3JlU2F2ZSgpOwotCQkJCQlMaWJyYXJ5Vmlld1NpbXBsZUFjdGlvbi5zYXZlKHJlc291cmVzVG9TYXZlKTsKLQkJCQl9IGZpbmFsbHkgewotCQkJCQlhc3NpZ25pbmcgPSBmYWxzZTsKLQkJCQl9Ci0JCQl9Ci0KLQkJfTsKLQkJCi0JCWZpbmFsIFNoZWxsIHNoZWxsID0gZ2V0U2hlbGwoKTsKLQkJc2hlbGwuc2V0Q3Vyc29yKHdhaXRDdXJzb3IpOwotCi0JCWdldEJ1dHRvbihJRGlhbG9nQ29uc3RhbnRzLk9LX0lEKS5zZXRFbmFibGVkKGZhbHNlKTsKLQkJZ2V0QnV0dG9uKElEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0lEKS5zZXRFbmFibGVkKGZhbHNlKTsKLQkJdHJlZVZpZXdlci5nZXRDb250cm9sKCkuc2V0RW5hYmxlZChmYWxzZSk7Ci0KLQkJcHJvZ3Jlc3NNb25pdG9yUGFydC5zZXRWaXNpYmxlKHRydWUpOwotCQlJU3RhdHVzIHN0YXQgPSBudWxsOwotCQl0cnkgewotCQkJc3RhdCA9IFVzZXJJbnRlcmFjdGlvbkhlbHBlci5nZXRVSUhlbHBlcigpLnJ1bkluTW9kYWxDb250ZXh0KHJ1bm5hYmxlLCB0cnVlLCBwcm9ncmVzc01vbml0b3JQYXJ0LCBzaGVsbCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfSBmaW5hbGx5IHsKLQkJCXByb2dyZXNzTW9uaXRvclBhcnQuZG9uZSgpOwotCQl9Ci0JCQotCQlpZihzdGF0ICE9IG51bGwgJiYgIXN0YXQuaXNPSygpKSB7Ci0JCQkJU3RyaW5nIHRpdGxlID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZXJyb3JEaWFsb2dfdGl0bGU7IAotCQkJCVN0cmluZyBtc2cgPSBBdXRob3JpbmdVSVJlc291cmNlcy5kaWFsb2dzX0Fzc2lnbkRpYWxvZ19lcnJvck1lc3NhZ2U7IAotCQkJCU1zZ0RpYWxvZyBkaWFsb2cgPSBBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCQkJCS5nZXRNc2dEaWFsb2coKTsKLQkJCQlkaWFsb2cuZGlzcGxheUVycm9yKHRpdGxlLCBtc2csIHN0YXQpOwotCQl9Ci0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHJvdGVjdGVkIENvbGxlY3Rpb248UmVzb3VyY2U+IGRvV29ya0JlZm9yZVNhdmUoKSB7Ci0JCWZpbmFsIExpYnJhcnlNb2RpZmljYXRpb25IZWxwZXIgaGVscGVyID0gbmV3IExpYnJhcnlNb2RpZmljYXRpb25IZWxwZXIoKTsKLQkJZmluYWwgQ3VzdG9tQ2F0ZWdvcnkgY2F0ZWdvcnkgPSAoQ3VzdG9tQ2F0ZWdvcnkpIGRlc3RpbmF0aW9uOwotCQlmaW5hbCBDb2xsZWN0aW9uPFJlc291cmNlPiByZXNvdXJlc1RvU2F2ZSA9IG5ldyBIYXNoU2V0PFJlc291cmNlPigpOwotCQkKLQkJZ2V0U2hlbGwoKS5nZXREaXNwbGF5KCkuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCUN1c3RvbUNhdGVnb3J5QXNzaWduUGFnZS5hZGRJdGVtc1RvTW9kZWwxKGVsZW1lbnRzLCBjYXRlZ29yeSwKLQkJCQkJCXVzZWRDYXRlZ29yaWVzLCBoZWxwZXIuZ2V0QWN0aW9uTWFuYWdlcigpLAotCQkJCQkJQ3VzdG9tQ2F0ZWdvcnlBc3NpZ25QYWdlLmdldEFuY2VzdG9ycyhjYXRlZ29yeSkpOwotCQkJCXJlc291cmVzVG9TYXZlLmFkZChjYXRlZ29yeS5lUmVzb3VyY2UoKSk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJcmV0dXJuIHJlc291cmVzVG9TYXZlOwotCX0KLQkJCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZyNjbG9zZSgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2xvc2UoKSB7Ci0JCWlmIChhc3NpZ25pbmcpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiBzdXBlci5jbG9zZSgpOwotCX0KLQkKLQotCXByb3RlY3RlZCBQcm9ncmVzc01vbml0b3JQYXJ0IGNyZWF0ZVByb2dyZXNzTW9uaXRvclBhcnQoCi0JCQlDb21wb3NpdGUgY29tcG9zaXRlLCBHcmlkTGF5b3V0IHBtbGF5b3V0KSB7Ci0JCXJldHVybiBuZXcgUHJvZ3Jlc3NNb25pdG9yUGFydChjb21wb3NpdGUsIHBtbGF5b3V0LCBTV1QuREVGQVVMVCkgewotCQkJU3RyaW5nIGN1cnJlbnRUYXNrID0gbnVsbDsKLQotCQkJLyoKLQkJCSAqIChub24tSmF2YWRvYykKLQkJCSAqIAotCQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuUHJvZ3Jlc3NNb25pdG9yUGFydCNzZXRCbG9ja2VkKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzKQotCQkJICovCi0JCQlwdWJsaWMgdm9pZCBzZXRCbG9ja2VkKElTdGF0dXMgcmVhc29uKSB7Ci0JCQkJc3VwZXIuc2V0QmxvY2tlZChyZWFzb24pOwotCQkJCWlmICghbG9ja2VkVUkpLy8gRG8gbm90IHNob3cgYmxvY2tlZCBpZiB3ZSBhcmUgbG9ja2luZyB0aGUgVUkKLQkJCQkJZ2V0QmxvY2tlZEhhbmRsZXIoKS5zaG93QmxvY2tlZChnZXRTaGVsbCgpLCB0aGlzLCByZWFzb24sCi0JCQkJCQkJY3VycmVudFRhc2spOwotCQkJfQotCi0JCQkvKgotCQkJICogKG5vbi1KYXZhZG9jKQotCQkJICogCi0JCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5Qcm9ncmVzc01vbml0b3JQYXJ0I2NsZWFyQmxvY2tlZCgpCi0JCQkgKi8KLQkJCXB1YmxpYyB2b2lkIGNsZWFyQmxvY2tlZCgpIHsKLQkJCQlzdXBlci5jbGVhckJsb2NrZWQoKTsKLQkJCQlpZiAoIWxvY2tlZFVJKS8vIERvIG5vdCB2bGVhciBpZiB3ZSBuZXZlciBzZXQgaXQKLQkJCQkJZ2V0QmxvY2tlZEhhbmRsZXIoKS5jbGVhckJsb2NrZWQoKTsKLQkJCX0KLQotCQkJLyoKLQkJCSAqIChub24tSmF2YWRvYykKLQkJCSAqIAotCQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuUHJvZ3Jlc3NNb25pdG9yUGFydCNiZWdpblRhc2soamF2YS5sYW5nLlN0cmluZywKLQkJCSAqICAgICAgaW50KQotCQkJICovCi0JCQlwdWJsaWMgdm9pZCBiZWdpblRhc2soU3RyaW5nIG5hbWUsIGludCB0b3RhbFdvcmspIHsKLQkJCQlzdXBlci5iZWdpblRhc2sobmFtZSwgdG90YWxXb3JrKTsKLQkJCQljdXJyZW50VGFzayA9IG5hbWU7Ci0JCQl9Ci0KLQkJCS8qCi0JCQkgKiAobm9uLUphdmFkb2MpCi0JCQkgKiAKLQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLlByb2dyZXNzTW9uaXRvclBhcnQjc2V0VGFza05hbWUoamF2YS5sYW5nLlN0cmluZykKLQkJCSAqLwotCQkJcHVibGljIHZvaWQgc2V0VGFza05hbWUoU3RyaW5nIG5hbWUpIHsKLQkJCQlzdXBlci5zZXRUYXNrTmFtZShuYW1lKTsKLQkJCQljdXJyZW50VGFzayA9IG5hbWU7Ci0JCQl9Ci0KLQkJCS8qCi0JCQkgKiAobm9uLUphdmFkb2MpCi0JCQkgKiAKLQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLlByb2dyZXNzTW9uaXRvclBhcnQjc3ViVGFzayhqYXZhLmxhbmcuU3RyaW5nKQotCQkJICovCi0JCQlwdWJsaWMgdm9pZCBzdWJUYXNrKFN0cmluZyBuYW1lKSB7Ci0JCQkJc3VwZXIuc3ViVGFzayhuYW1lKTsKLQkJCQkvLyBJZiB3ZSBoYXZlbid0IGdvdCBhbnl0aGluZyB5ZXQgdXNlIHRoaXMgdmFsdWUgZm9yIG1vcmUKLQkJCQkvLyBjb250ZXh0Ci0JCQkJaWYgKGN1cnJlbnRUYXNrID09IG51bGwpCi0JCQkJCWN1cnJlbnRUYXNrID0gbmFtZTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JcHJvdGVjdGVkIEFycmF5TGlzdCBnZXRFbGVtZW50cygpIHsKLQkJcmV0dXJuIGVsZW1lbnRzOwotCX0KLQkKLQlwcm90ZWN0ZWQgT2JqZWN0IGdldERlc3RpbmF0aW9uKCkgewotCQlyZXR1cm4gZGVzdGluYXRpb247Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUmVhc3NpZ25EaWFsb2cgZXh0ZW5kcyBBc3NpZ25EaWFsb2cgewotCQkKLQkJcHJpdmF0ZSBDdXN0b21DYXRlZ29yeSBwYXJlbnRFbGVtZW50OwotCQkKLQkJcHJvdGVjdGVkIFJlYXNzaWduRGlhbG9nKFNoZWxsIHBhcmVudFNoZWxsLCAKLQkJCQlDb2xsZWN0aW9uIGVsZW1lbnRzLCBNZXRob2RFbGVtZW50IHBhcmVudEVsZW1lbnQpIHsKLQkJCXN1cGVyKHBhcmVudFNoZWxsLCBlbGVtZW50cyk7Ci0JCQl0aGlzLnBhcmVudEVsZW1lbnQgPSAoQ3VzdG9tQ2F0ZWdvcnkpIHBhcmVudEVsZW1lbnQ7Ci0JCX0KLQkJCi0JCXByb3RlY3RlZCBDb2xsZWN0aW9uPFJlc291cmNlPiBkb1dvcmtCZWZvcmVTYXZlKCkgewotCQkJQ29sbGVjdGlvbjxSZXNvdXJjZT4gcmVzb3VyZXNUb1NhdmUgPSBzdXBlci5kb1dvcmtCZWZvcmVTYXZlKCk7Ci0JCQlyZXNvdXJlc1RvU2F2ZS5hZGQocGFyZW50RWxlbWVudC5lUmVzb3VyY2UoKSk7CQkJCi0JCQlVbmFzc2lnbkFjdGlvbi51bmFzc2lnbihnZXRTaGVsbCgpLCBnZXRFbGVtZW50cygpLmdldCgwKSwgcGFyZW50RWxlbWVudCwgbmV3IEFycmF5TGlzdCgpKTsKLQkJCXJldHVybiByZXNvdXJlc1RvU2F2ZTsKLQkJfQotCQkKLQkJcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlU2hlbGwoU2hlbGwgbmV3U2hlbGwpIHsKLQkJCXN1cGVyLmNvbmZpZ3VyZVNoZWxsKG5ld1NoZWxsKTsKLQkJCW5ld1NoZWxsLnNldFRleHQoQXV0aG9yaW5nVUlSZXNvdXJjZXMuQXNzaWduRGlhbG9nX3JlYXNzaWduX3RleHQpOyAKLQkJfQotCQkKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQ3VzdG9tQ2F0ZWdvcnlEZWVwQ29weURpYWxvZyBleHRlbmRzIEFzc2lnbkRpYWxvZyB7Ci0JCUNvbnRlbnRQYWNrYWdlIGN1c3RvbUNhdGVnb3J5UGtnOwotCQlwcml2YXRlIFVuaXF1ZU5hbWVQTmFtZUhhbmRsZXIgbmFtZUhhbmRsZXI7Ci0JCXByaXZhdGUgUmVzb3VyY2VTY2FubmVyIHNjYW5uZXI7Ci0JCQotCQlwcm90ZWN0ZWQgQ3VzdG9tQ2F0ZWdvcnlEZWVwQ29weURpYWxvZyhTaGVsbCBwYXJlbnRTaGVsbCwgCi0JCQkJQ29sbGVjdGlvbiBlbGVtZW50cykgewotCQkJc3VwZXIocGFyZW50U2hlbGwsIGVsZW1lbnRzKTsKLQkJfQotCQkKLQkJcHJvdGVjdGVkIENvbGxlY3Rpb248UmVzb3VyY2U+IGRvV29ya0JlZm9yZVNhdmUoKSB7Ci0JCQlpZiAoZ2V0RWxlbWVudHMoKSA9PSBudWxsCi0JCQkJCXx8ICEoZ2V0RWxlbWVudHMoKS5nZXQoMCkgaW5zdGFuY2VvZiBDdXN0b21DYXRlZ29yeSkKLQkJCQkJfHwgIShnZXREZXN0aW5hdGlvbigpIGluc3RhbmNlb2YgQ3VzdG9tQ2F0ZWdvcnkpKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCQkJCQotCQkJQ3VzdG9tQ2F0ZWdvcnkgc291cmNlID0gKEN1c3RvbUNhdGVnb3J5KSBnZXRFbGVtZW50cygpLmdldCgwKTsKLQkJCUN1c3RvbUNhdGVnb3J5IHRhcmdldFBhcmVudCA9IChDdXN0b21DYXRlZ29yeSkgZ2V0RGVzdGluYXRpb24oKTsKLQkJCQotCQkJaW5pdERlZXBDb3B5KHNvdXJjZSwgdGFyZ2V0UGFyZW50KTsgCi0JCQlDdXN0b21DYXRlZ29yeSBjb3B5ID0gKEN1c3RvbUNhdGVnb3J5KSBkZWVwQ29weShzb3VyY2UpOwkJCQotCQkJCi0JCQkvL0lUZXh0UmVmZXJlbmNlUmVwbGFjZXIgdHh0UmVmUmVwbGFjZXIgPSBFeHRlbnNpb25NYW5hZ2VyLmdldFRleHRSZWZlcmVuY2VSZXBsYWNlcigpOwotCQkJY3VzdG9tQ2F0ZWdvcnlQa2cuZ2V0Q29udGVudEVsZW1lbnRzKCkuYWRkKGNvcHkpOwotCQkJdGFyZ2V0UGFyZW50LmdldENhdGVnb3JpemVkRWxlbWVudHMoKS5hZGQoY29weSk7Ci0JCQkKLQkJCUNvbGxlY3Rpb248UmVzb3VyY2U+IHJlc291cmVzVG9TYXZlID0gbmV3IEFycmF5TGlzdCgpOwkJCQkKLQkJCXJlc291cmVzVG9TYXZlLmFkZCh0YXJnZXRQYXJlbnQuZVJlc291cmNlKCkpOwotCQkJCi0JCQlpZiAoc2Nhbm5lciAhPSBudWxsKSB7Ci0JCQkJc2Nhbm5lci5jb3B5RmlsZXMoKTsKLQkJCX0KLQkJCQotCQkJcmV0dXJuIHJlc291cmVzVG9TYXZlOwotCQl9CQkKLQkJCi0JCXByaXZhdGUgRU9iamVjdCBkZWVwQ29weShFT2JqZWN0IHNvdXJjZSkgewkJCQotCQkJRU9iamVjdCBjb3B5ID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlKHNvdXJjZS5lQ2xhc3MoKSk7Ci0JCQloYW5kbGVOYW1lcyhzb3VyY2UsIGNvcHkpOwotCQkKLQkJCUxpc3QgZmVhdHVyZXMgPSBzb3VyY2UuZUNsYXNzKCkuZ2V0RUFsbFN0cnVjdHVyYWxGZWF0dXJlcygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmZWF0dXJlcy5zaXplKCk7IGkrKykgewotCQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgZmVhdHVyZXMuZ2V0KGkpOwkJCQkKLQkJCQkvL1N5c3RlbS5vdXQucHJpbnRsbigiTEQ+IGZlYXR1cmU6ICIgKyBmZWF0dXJlLmdldE5hbWUoKSk7Ci0JCQkJY29weUZlYXR1cmVWYWx1ZShzb3VyY2UsIGNvcHksIGZlYXR1cmUpOwotCQkJfQotCQkJcmV0dXJuIGNvcHk7Ci0JCX0KLQotCQlwcml2YXRlIHZvaWQgaGFuZGxlTmFtZXMoRU9iamVjdCBzb3VyY2UsIEVPYmplY3QgY29weSkgewotCQkJaWYgKGNvcHkgaW5zdGFuY2VvZiBDdXN0b21DYXRlZ29yeSkgewotCQkJCU9iamVjdCBuYW1lID0gc291cmNlLmVHZXQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TmFtZWRFbGVtZW50X05hbWUoKSk7Ci0JCQkJT2JqZWN0IHBuYW1lID0gc291cmNlLmVHZXQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWV0aG9kRWxlbWVudF9QcmVzZW50YXRpb25OYW1lKCkpOwotCQkJCQotCQkJCWNvcHkuZVNldChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXROYW1lZEVsZW1lbnRfTmFtZSgpLCBuYW1lKTsKLQkJCQljb3B5LmVTZXQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWV0aG9kRWxlbWVudF9QcmVzZW50YXRpb25OYW1lKCksIHBuYW1lKTsKLQotCQkJCW5hbWVIYW5kbGVyLmVuc3VyZVVuaXF1ZSgoQ3VzdG9tQ2F0ZWdvcnkpIGNvcHkpOwotCQkJfQotCQl9Ci0JCQotCQlwcml2YXRlIHZvaWQgY29weUZlYXR1cmVWYWx1ZShFT2JqZWN0IHNvdXJjZU9iaiwgRU9iamVjdCBjb3BpZWRPYmosIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKSB7Ci0JCQkJCi0JCQlpZiAoZmVhdHVyZSBpbnN0YW5jZW9mIEVBdHRyaWJ1dGUpIHsKLQkJCQljb3B5QXR0cmlidXRlRmVhdHVyZVZhbHVlKHNvdXJjZU9iaiwgY29waWVkT2JqLCAoRUF0dHJpYnV0ZSkgZmVhdHVyZSk7CQkJCQotCQkJfSBlbHNlIGlmIChmZWF0dXJlIGluc3RhbmNlb2YgRVJlZmVyZW5jZSkgewotCQkJCWNvcHlSZWZlcmVuY2VGZWF0dXJlVmFsdWUoc291cmNlT2JqLCBjb3BpZWRPYmosIChFUmVmZXJlbmNlKSBmZWF0dXJlKTsKLQkJCX0KLQkJCQotCQl9Ci0JCQotCQlwcml2YXRlIHZvaWQgY29weUF0dHJpYnV0ZUZlYXR1cmVWYWx1ZShFT2JqZWN0IHNvdXJjZU9iaiwKLQkJCQlFT2JqZWN0IGNvcGllZE9iaiwgRUF0dHJpYnV0ZSBmZWF0dXJlKSB7Ci0JCQlPYmplY3Qgc291cmNlVmFsdWUgPSBzb3VyY2VPYmouZUdldChmZWF0dXJlKTsKLQkJCWlmIChzb3VyY2VWYWx1ZSA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJT2JqZWN0IGNvcGllZFZhbHVlID0gc291cmNlVmFsdWU7Ci0KLQkJCWlmIChzb3VyY2VPYmogaW5zdGFuY2VvZiBDdXN0b21DYXRlZ29yeSkgewotCQkJCWlmIChmZWF0dXJlID09IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE1ldGhvZEVsZW1lbnRfR3VpZCgpKSB7Ci0JCQkJCWNvcGllZFZhbHVlID0gRWNvcmVVdGlsLmdlbmVyYXRlVVVJRCgpOwotCQkJCX0gZWxzZSBpZiAoZmVhdHVyZSA9PSBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXROYW1lZEVsZW1lbnRfTmFtZSgpKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9IGVsc2UgaWYgKGZlYXR1cmUgPT0gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWV0aG9kRWxlbWVudF9QcmVzZW50YXRpb25OYW1lKCkpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCX0KLQkJCWlmIChzY2FubmVyICE9IG51bGwpIHsKLQkJCQlpZiAoc291cmNlVmFsdWUgaW5zdGFuY2VvZiBVUkkpIHsKLQkJCQkJVVJJIHVyaSA9IChVUkkpIHNvdXJjZVZhbHVlOwotCQkJCQlTdHJpbmcgdXJsU3RyID0gc2Nhbm5lci5yZWdpc3RlckZpbGVDb3B5KHVyaS50b1N0cmluZygpKTsKLQkJCQkJdHJ5IHsKLQkJCQkJCWNvcGllZFZhbHVlID0gbmV3IFVSSSh1cmxTdHIpOwotCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJY29waWVkVmFsdWUgPSBzb3VyY2VWYWx1ZTsKLQkJCQkJfQotCQkJCX0gZWxzZSBpZiAoc291cmNlVmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpIHsKLQkJCQkJaWYgKHNvdXJjZU9iaiBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQKLQkJCQkJCQkmJiBjb3BpZWRPYmogaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQkJCQljb3BpZWRWYWx1ZSA9IHNjYW5uZXIKLQkJCQkJCQkJLnNjYW4oKE1ldGhvZEVsZW1lbnQpIHNvdXJjZU9iaiwKLQkJCQkJCQkJCQkoTWV0aG9kRWxlbWVudCkgY29waWVkT2JqLAotCQkJCQkJCQkJCShTdHJpbmcpIHNvdXJjZVZhbHVlLCBmZWF0dXJlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJY29waWVkT2JqLmVTZXQoZmVhdHVyZSwgY29waWVkVmFsdWUpOwotCQl9Ci0KLQkJcHJpdmF0ZSB2b2lkIGNvcHlSZWZlcmVuY2VGZWF0dXJlVmFsdWUoRU9iamVjdCBzb3VyY2VPYmosIEVPYmplY3QgY29waWVkT2JqLCBFUmVmZXJlbmNlIGZlYXR1cmUpIHsKLQkJCU9iamVjdCBzb3VyY2VWYWx1ZSA9IHNvdXJjZU9iai5lR2V0KGZlYXR1cmUpOwotCQkJaWYgKHNvdXJjZVZhbHVlID09IG51bGwpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlPYmplY3QgY29waWVkVmFsdWUgPSBzb3VyY2VWYWx1ZTsKLQotCQkJaWYgKGZlYXR1cmUuaXNDb250YWlubWVudCgpKSB7Ci0JCQkJaWYgKGZlYXR1cmUuaXNNYW55KCkpIHsKLQkJCQkJTGlzdDxFT2JqZWN0PiBzb3VyY2VMaXN0ID0gKExpc3Q8RU9iamVjdD4pIHNvdXJjZVZhbHVlOwotCQkJCQlMaXN0PEVPYmplY3Q+IGNvcGllZExpc3QgPSAoTGlzdDxFT2JqZWN0PikgY29waWVkT2JqCi0JCQkJCQkJLmVHZXQoZmVhdHVyZSk7Ci0JCQkJCWZvciAoRU9iamVjdCBzb2JqIDogc291cmNlTGlzdCkgewotCQkJCQkJRU9iamVjdCBjb2JqID0gZGVlcENvcHkoc29iaik7Ci0JCQkJCQljb3BpZWRMaXN0LmFkZChjb2JqKTsKLQkJCQkJfQotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCWNvcGllZFZhbHVlID0gZGVlcENvcHkoKEVPYmplY3QpIHNvdXJjZVZhbHVlKTsKLQotCQkJfSBlbHNlIGlmIChmZWF0dXJlLmlzTWFueSgpKSB7Ci0JCQkJTGlzdCBzb3VyY2VMaXN0ID0gKExpc3QpIHNvdXJjZVZhbHVlOwotCQkJCUxpc3QgY29waWVkTGlzdCA9IChMaXN0KSBjb3BpZWRPYmouZUdldChmZWF0dXJlKTsKLQkJCQlmb3IgKE9iamVjdCBzb2JqIDogc291cmNlTGlzdCkgewotCQkJCQlPYmplY3QgY29iaiA9IHNvYmo7Ci0JCQkJCWlmIChzb2JqIGluc3RhbmNlb2YgQ3VzdG9tQ2F0ZWdvcnkpIHsKLQkJCQkJCWNvYmogPSAoQ3VzdG9tQ2F0ZWdvcnkpIGRlZXBDb3B5KChDdXN0b21DYXRlZ29yeSkgc29iaik7Ci0JCQkJCQlDdXN0b21DYXRlZ29yeSBjY29iaiA9IChDdXN0b21DYXRlZ29yeSkgY29iajsKLQkJCQkJCWN1c3RvbUNhdGVnb3J5UGtnLmdldENvbnRlbnRFbGVtZW50cygpLmFkZChjY29iaik7Ci0JCQkJCX0KLQkJCQkJY29waWVkTGlzdC5hZGQoY29iaik7Ci0JCQkJfQotCQkJCXJldHVybjsKLQkJCX0KLQotCQkJY29waWVkT2JqLmVTZXQoZmVhdHVyZSwgY29waWVkVmFsdWUpOwotCQl9Ci0KLQkJcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlU2hlbGwoU2hlbGwgbmV3U2hlbGwpIHsKLQkJCXN1cGVyLmNvbmZpZ3VyZVNoZWxsKG5ld1NoZWxsKTsKLQkJCW5ld1NoZWxsLnNldFRleHQoQXV0aG9yaW5nVUlSZXNvdXJjZXMuZGVlcENvcHlfdGV4dCk7IAotCQl9Ci0JCQotCQlwcml2YXRlIHZvaWQgaW5pdERlZXBDb3B5KEN1c3RvbUNhdGVnb3J5IHNvdXJjZSwgQ3VzdG9tQ2F0ZWdvcnkgdGFyZ2V0UGFyZW50KSB7Ci0JCQlNZXRob2RQbHVnaW4gc3JjUGx1Z2luID0gVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4oc291cmNlKTsKLQkJCU1ldGhvZFBsdWdpbiB0Z3RQbHVnaW4gPSBVbWFVdGlsLmdldE1ldGhvZFBsdWdpbih0YXJnZXRQYXJlbnQpOwotCQkJY3VzdG9tQ2F0ZWdvcnlQa2cgPSBVbWFVdGlsLmZpbmRDb250ZW50UGFja2FnZSh0Z3RQbHVnaW4sIE1vZGVsU3RydWN0dXJlLkRFRkFVTFQuY3VzdG9tQ2F0ZWdvcnlQYXRoKTsKLQkJCW5hbWVIYW5kbGVyID0gbmV3IFVuaXF1ZU5hbWVQTmFtZUhhbmRsZXIoY3VzdG9tQ2F0ZWdvcnlQa2cuZ2V0Q29udGVudEVsZW1lbnRzKCkpOwotCQkJaWYgKHNyY1BsdWdpbiAhPSB0Z3RQbHVnaW4pIHsKLQkJCQlzY2FubmVyID0gbmV3IFJlc291cmNlU2Nhbm5lcihzcmNQbHVnaW4sIHRndFBsdWdpbik7Ci0JCQl9Ci0JCX0KLQkJCQotCX0KLQotCi0KLQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2RpYWxvZ3MvQXR0YWNobWVudERpYWxvZy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9kaWFsb2dzL0F0dGFjaG1lbnREaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTM1MDcwYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2RpYWxvZ3MvQXR0YWNobWVudERpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZGlhbG9nczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5GaWxlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci0KLS8qKgotICogT3BlbnMgZGlhbG9nIHRvIGF0dGFjaCBhdHRhY2htZW50cwotICogCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEF0dGFjaG1lbnREaWFsb2cgZXh0ZW5kcyBEaWFsb2cgewotCi0JLyoqCi0JICogVGhlIE9LIGJ1dHRvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgQnV0dG9uIG9rQnV0dG9uOwotCi0JLyoqCi0JICogVGhlIENhbmNlbCBidXR0b24uCi0JICovCi0JcHJvdGVjdGVkIEJ1dHRvbiBjYW5jZWxCdXR0b247Ci0KLQkvKioKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICovCi0KLQlwcml2YXRlIFRleHQgYXR0YWNobWVudDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2UKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICovCi0JcHVibGljIEF0dGFjaG1lbnREaWFsb2coU2hlbGwgcGFyZW50KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBEaWFsb2cjY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KQotCSAqLwotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCUNvbXBvc2l0ZSBkaWFsb2dBcmVhID0gKENvbXBvc2l0ZSkgc3VwZXIuY3JlYXRlRGlhbG9nQXJlYShwYXJlbnQpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IChHcmlkTGF5b3V0KSBkaWFsb2dBcmVhLmdldExheW91dCgpOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSAxMDsKLQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDEwOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0JCUdyaWREYXRhIGdyaWREYXRhID0gKEdyaWREYXRhKSBkaWFsb2dBcmVhLmdldExheW91dERhdGEoKTsKLQkJZ3JpZERhdGEudmVydGljYWxJbmRlbnQgPSAxMDsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAzOwotCi0JCUxhYmVsIHVybExhYmVsID0gbmV3IExhYmVsKGRpYWxvZ0FyZWEsIFNXVC5OT05FKTsKLQkJdXJsTGFiZWwuc2V0VGV4dChBdXRob3JpbmdVSVJlc291cmNlcy5BdHRhY2htZW50RGlhbG9nRmlsZVVSTF90ZXh0KTsgCi0JCWF0dGFjaG1lbnQgPSBuZXcgVGV4dChkaWFsb2dBcmVhLCBTV1QuQk9SREVSKTsKLQkJZ3JpZERhdGEud2lkdGhIaW50ID0gMzAwOwotCQlhdHRhY2htZW50LnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQlhdHRhY2htZW50LmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotCQkJCWlmIChva0J1dHRvbiAhPSBudWxsKSB7Ci0JCQkJCW9rQnV0dG9uCi0JCQkJCQkJLnNldEVuYWJsZWQoYXR0YWNobWVudC5nZXRUZXh0KCkudHJpbSgpLmxlbmd0aCgpID4gMCk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQotCQlCdXR0b24gYnJvd3NlQnV0dG9uID0gbmV3IEJ1dHRvbihkaWFsb2dBcmVhLCBTV1QuTk9ORSk7Ci0JCWJyb3dzZUJ1dHRvbi5zZXRUZXh0KEF1dGhvcmluZ1VJVGV4dC5CUk9XU0VfQlVUVE9OX1RFWFQpOwotCQlicm93c2VCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlGaWxlRGlhbG9nIGRpYWxvZyA9IG5ldyBGaWxlRGlhbG9nKERpc3BsYXkuZ2V0Q3VycmVudCgpCi0JCQkJCQkuZ2V0QWN0aXZlU2hlbGwoKSwgU1dULk9QRU4pOwotCQkJCVN0cmluZyBpbWFnZUZpbGUgPSBkaWFsb2cub3BlbigpOwotCQkJCWlmIChpbWFnZUZpbGUgIT0gbnVsbCAmJiBpbWFnZUZpbGUubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJCUZpbGUgZmlsZSA9IG5ldyBGaWxlKGltYWdlRmlsZSk7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlTdHJpbmcgdXJsID0gZmlsZS50b1VSTCgpLnRvRXh0ZXJuYWxGb3JtKCk7Ci0JCQkJCQlhdHRhY2htZW50LnNldFRleHQodXJsKTsKLQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCX0KLQkJfSk7Ci0KLQkJc3VwZXIKLQkJCQkuZ2V0U2hlbGwoKQotCQkJCS5zZXRUZXh0KAotCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuQXR0YWNobWVudERpYWxvZ2F0dGFjaEZpbGVfdGV4dCk7IAotCi0JCXJldHVybiBkaWFsb2dBcmVhOwotCi0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgZGlhbG9nIGJ1dHRvbnMuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQnV0dG9uc0ZvckJ1dHRvbkJhcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCS8vIENyZWF0ZSB0aGUgT0sgYnV0dG9uLgotCQljcmVhdGVCdXR0b24ocGFyZW50LCBJRGlhbG9nQ29uc3RhbnRzLk9LX0lELCBJRGlhbG9nQ29uc3RhbnRzLk9LX0xBQkVMLAotCQkJCXRydWUpOwotCi0JCS8vIENyZWF0ZSB0aGUgQ2FuY2VsIGJ1dHRvbi4KLQkJY3JlYXRlQnV0dG9uKHBhcmVudCwgSURpYWxvZ0NvbnN0YW50cy5DQU5DRUxfSUQsCi0JCQkJSURpYWxvZ0NvbnN0YW50cy5DQU5DRUxfTEFCRUwsIGZhbHNlKTsKLQotCQkvLyBTZXQgaGVscCBjb250ZXh0IGZvciB0aGUgT0sgYnV0dG9uLgotCQlva0J1dHRvbiA9IHN1cGVyLmdldEJ1dHRvbihJRGlhbG9nQ29uc3RhbnRzLk9LX0lEKTsKLQotCQkvLyBTZXQgaGVscCBjb250ZXh0IGZvciB0aGUgQ2FuY2VsIGJ1dHRvbi4KLQkJY2FuY2VsQnV0dG9uID0gc3VwZXIuZ2V0QnV0dG9uKElEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0lEKTsKLQotCQlva0J1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQl9Ci0KLQkvKioKLQkgKiBDYWxsZWQgd2hlbiB0aGUgT0sgYnV0dG9uIGlzIHNlbGVjdGVkLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIG9rUHJlc3NlZCgpIHsKLQkJLy8gU3RyaW5nIHVybCA9IGF0dGFjaG1lbnQuZ2V0VGV4dCgpOwotCQkvLyBpZiAodXJsICE9IG51bGwgJiYgdXJsLmxlbmd0aCgpID4gMCkgewotCQkvLwkJCQotCQkvLyB9Ci0JCXN1cGVyLm9rUHJlc3NlZCgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIEZpbGUgTmFtZQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0YWNobWVudFBhdGgoKSB7Ci0JCXJldHVybiBhdHRhY2htZW50LmdldFRleHQoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2RpYWxvZ3MvQ2hhbmdlSGlzdG9yeURpYWxvZy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9kaWFsb2dzL0NoYW5nZUhpc3RvcnlEaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDJhNDMwZi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2RpYWxvZ3MvQ2hhbmdlSGlzdG9yeURpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vKioKLSAqIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZGlhbG9nczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUl0ZW07Ci0KLWltcG9ydCBjb20uaWJtLmljdS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotCi0vKioKLSAqIERpYWxvZyB0byBzaG93IGNoYW5nZSBoaXN0b3J5IG9mIGFuIGVsZW1lbnQKLSAqIAotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIENoYW5nZUhpc3RvcnlEaWFsb2cgZXh0ZW5kcyBEaWFsb2cgewotCi0JLyoqCi0JICogVGhlIE9LIGJ1dHRvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgQnV0dG9uIG9rQnV0dG9uOwotCi0JLyoqCi0JICogVGhlIENhbmNlbCBidXR0b24uCi0JICovCi0JcHJvdGVjdGVkIEJ1dHRvbiBjYW5jZWxCdXR0b247Ci0KLQkvKioKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICovCi0KLQlwcml2YXRlIE1ldGhvZEVsZW1lbnQgZWxlbWVudDsKLQotCXByaXZhdGUgVGFibGUgdGFibGU7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICovCi0JcHVibGljIENoYW5nZUhpc3RvcnlEaWFsb2coU2hlbGwgcGFyZW50LCBNZXRob2RFbGVtZW50IGVsZW1lbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQotCQl0aGlzLmVsZW1lbnQgPSBlbGVtZW50OwotCX0KLQotCS8qKgotCSAqIEBzZWUgRGlhbG9nI2NyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkKLQkgKi8KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlDb21wb3NpdGUgZGlhbG9nQXJlYSA9IChDb21wb3NpdGUpIHN1cGVyLmNyZWF0ZURpYWxvZ0FyZWEocGFyZW50KTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSAoR3JpZExheW91dCkgZGlhbG9nQXJlYS5nZXRMYXlvdXQoKTsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMTA7Ci0JCWxheW91dC5tYXJnaW5IZWlnaHQgPSAxMDsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAxOwotCQlHcmlkRGF0YSBnZCA9IChHcmlkRGF0YSkgZGlhbG9nQXJlYS5nZXRMYXlvdXREYXRhKCk7Ci0JCWdkLnZlcnRpY2FsSW5kZW50ID0gMTA7Ci0KLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoZGlhbG9nQXJlYSwgU1dULk5PTkUpOwotCQlsYWJlbC5zZXRUZXh0KEF1dGhvcmluZ1VJUmVzb3VyY2VzLkNoYW5nZUhpc3RvcnlEaWFsb2dfbGFiZWwpOyAKLQotCQl0YWJsZSA9IG5ldyBUYWJsZShkaWFsb2dBcmVhLCBTV1QuQk9SREVSIHwgU1dULk1VTFRJKTsKLQkJewotCQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJCWdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJCWdyaWREYXRhLndpZHRoSGludCA9IDQwMDsKLQkJCWdyaWREYXRhLmhlaWdodEhpbnQgPSAzMDA7Ci0JCQl0YWJsZS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJCXRhYmxlLnNldExpbmVzVmlzaWJsZSh0cnVlKTsKLQotCQl9Ci0KLQkJaW5pdENoYW5nZUhpc3RvcnlUYWJsZSgpOwotCQlzdXBlci5nZXRTaGVsbCgpLnNldFRleHQoCi0JCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuQ2hhbmdlSGlzdG9yeURpYWxvZ190aXRsZSk7IAotCi0JCXJldHVybiBkaWFsb2dBcmVhOwotCi0JfQotCi0JcHJpdmF0ZSB2b2lkIGluaXRDaGFuZ2VIaXN0b3J5VGFibGUoKSB7Ci0JCVN0cmluZyBjaGFuZ2VEZXNjID0gbnVsbDsKLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBDb250ZW50RWxlbWVudCkgewotCQkJQ29udGVudERlc2NyaXB0aW9uIGNvbnRlbnREZXNjcmlwdGlvbiA9ICgoQ29udGVudEVsZW1lbnQpIGVsZW1lbnQpCi0JCQkJCS5nZXRQcmVzZW50YXRpb24oKTsKLQkJCWNoYW5nZURlc2MgPSBjb250ZW50RGVzY3JpcHRpb24uZ2V0Q2hhbmdlRGVzY3JpcHRpb24oKTsKLQkJfQotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikgewotCQkJY2hhbmdlRGVzYyA9ICgoTWV0aG9kUGx1Z2luKSBlbGVtZW50KS5nZXRDaGFuZ2VEZXNjcmlwdGlvbigpOwotCQl9Ci0KLQkJaWYgKGNoYW5nZURlc2MgIT0gbnVsbCkgewotCQkJU3RyaW5nVG9rZW5pemVyIHRvayA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoCi0JCQkJCWNoYW5nZURlc2MsCi0JCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLkNoYW5nZUhpc3RvcnlEaWFsb2dfZGVsaW1pdGVyKTsgCi0JCQlMaXN0IHN0ckxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJCXdoaWxlICh0b2suaGFzTW9yZVRva2VucygpKSB7Ci0JCQkJc3RyTGlzdC5hZGQodG9rLm5leHRUb2tlbigpKTsKLQkJCX0KLQotCQkJZm9yIChpbnQgaSA9IHN0ckxpc3Quc2l6ZSgpIC0gMTsgaSA+PSAwOyBpLS0pIHsKLQkJCQlUYWJsZUl0ZW0gaXRlbSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIFNXVC5OT05FKTsKLQkJCQlpdGVtLnNldFRleHQoKFN0cmluZykgc3RyTGlzdC5nZXQoaSkpOwotCQkJfQotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBkaWFsb2cgYnV0dG9ucy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVCdXR0b25zRm9yQnV0dG9uQmFyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJLy8gQ3JlYXRlIHRoZSBPSyBidXR0b24uCi0JCWNyZWF0ZUJ1dHRvbihwYXJlbnQsIElEaWFsb2dDb25zdGFudHMuT0tfSUQsIElEaWFsb2dDb25zdGFudHMuT0tfTEFCRUwsCi0JCQkJdHJ1ZSk7Ci0KLQkJLy8gU2V0IGhlbHAgY29udGV4dCBmb3IgdGhlIE9LIGJ1dHRvbi4KLQkJb2tCdXR0b24gPSBzdXBlci5nZXRCdXR0b24oSURpYWxvZ0NvbnN0YW50cy5PS19JRCk7Ci0JfQotCi0JLyoqCi0JICogQ2FsbGVkIHdoZW4gdGhlIE9LIGJ1dHRvbiBpcyBzZWxlY3RlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBva1ByZXNzZWQoKSB7Ci0KLQkJc3VwZXIub2tQcmVzc2VkKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2RpYWxvZ3MvQ29uZmlndXJhdGlvbkFkZFZpZXdzRGlhbG9nLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2RpYWxvZ3MvQ29uZmlndXJhdGlvbkFkZFZpZXdzRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4NWYyZTIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9kaWFsb2dzL0NvbmZpZ3VyYXRpb25BZGRWaWV3c0RpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5kaWFsb2dzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmliYWJsZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci0KLQotLyoqCi0gKiBPcGVuIGFuIGRpYWxvZyB0byBhZGQgdmlld3MgaW50byBjb25maWd1cmF0aW9uCi0gKiAKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQ29uZmlndXJhdGlvbkFkZFZpZXdzRGlhbG9nIGV4dGVuZHMgSXRlbXNGaWx0ZXJEaWFsb2cgewotCi0JLyoqCi0JICogQHBhcmFtIHBhcmVudFNoZWxsCi0JICovCi0JcHVibGljIENvbmZpZ3VyYXRpb25BZGRWaWV3c0RpYWxvZyhTaGVsbCBwYXJlbnRTaGVsbCkgewotCQlzdXBlcihwYXJlbnRTaGVsbCk7Ci0JfQotCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCWxhYmVsUHJvdmlkZXIgPSBuZXcgQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyKAotCQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpIHsKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJU3RyaW5nIHByZXNlbnRhdGlvbk5hbWUgPSBudWxsOwotCQkJCWlmIChvYmplY3QgaW5zdGFuY2VvZiBEZXNjcmliYWJsZUVsZW1lbnQpIHsKLQkJCQkJcHJlc2VudGF0aW9uTmFtZSA9ICgoRGVzY3JpYmFibGVFbGVtZW50KSBvYmplY3QpCi0JCQkJCQkJLmdldFByZXNlbnRhdGlvbk5hbWUoKTsKLQkJCQl9Ci0JCQkJaWYgKHByZXNlbnRhdGlvbk5hbWUgPT0gbnVsbCB8fCAiIi5lcXVhbHMocHJlc2VudGF0aW9uTmFtZSkpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQlwcmVzZW50YXRpb25OYW1lID0gc3VwZXIuZ2V0VGV4dChvYmplY3QpOwotCQkJCX0KLQkJCQlyZXR1cm4gcHJlc2VudGF0aW9uTmFtZTsKLQkJCX0KLQkJfTsKLQkJaGVscGVyLnNldFNob3dQcmVzZW50YXRpb25OYW1lKHRydWUpOwotCQlyZXR1cm4gc3VwZXIuY3JlYXRlRGlhbG9nQXJlYShwYXJlbnQpOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZGlhbG9ncy9Db25maWd1cmF0aW9uT3JkZXJEaWFsb2cuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZGlhbG9ncy9Db25maWd1cmF0aW9uT3JkZXJEaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTA4MTlmNy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2RpYWxvZ3MvQ29uZmlndXJhdGlvbk9yZGVyRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMDEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5kaWFsb2dzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3ZpZGVycy5WYXJpYWJpbGl0eUVsZW1lbnRMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklBY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5Nb3ZlSW5Db25maWd1cmF0aW9uQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotCi0vKioKLSAqIE9wZW4gYSBkaWFsb2cgdG8gb3JkZXIgY29uZmlndXJhdGlvbiB2aWV3cwotICogQGF1dGhvciBYaWFuZyBEb25nIEh1Ci0gKiBAc2luY2UgMS4yCi0gKiAgZml4IGZvciBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTczODI3Ci0gKi8KLXB1YmxpYyBjbGFzcyBDb25maWd1cmF0aW9uT3JkZXJEaWFsb2cgZXh0ZW5kcyBEaWFsb2cgewotCi0JcHJpdmF0ZSBDb21wb3NpdGUgYmFzZUNvbXBvc2l0ZTsKLQotCXByaXZhdGUgQnV0dG9uIGN0cmxfdXAsIGN0cmxfZG93bjsKLQotCXByaXZhdGUgVGFibGUgY3RybF92aWV3czsKLQotCXByaXZhdGUgVGFibGVWaWV3ZXIgdmlld3NUYWJsZVZpZXdlcjsKLQotLy8JcHJpdmF0ZSBDb250ZW50RWxlbWVudE9yZGVyTGlzdCBhbGxTdGVwczsKLQotCXByaXZhdGUgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIgdmlld3NWaWV3ZXJDb250ZW50UHJvdmlkZXI7Ci0KLQlwcml2YXRlIElMYWJlbFByb3ZpZGVyIHZpZXdzVmlld2VyTGFiZWxQcm92aWRlcjsKLQkKLQlwcml2YXRlIE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnOwotCi0JcHJpdmF0ZSBJQWN0aW9uTWFuYWdlciBhY3Rpb25NYW5hZ2VyOwotCQotCXByaXZhdGUgQXJyYXlMaXN0IGNvbW1hbmRzID0gbmV3IEFycmF5TGlzdCgpOwotCQotCXB1YmxpYyBDb25maWd1cmF0aW9uT3JkZXJEaWFsb2coU2hlbGwgcGFyZW50LCAKLQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnLCBJQWN0aW9uTWFuYWdlciBhY3Rpb25NYW5hZ2VyKSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JCXRoaXMuY29uZmlnID0gY29uZmlnOwotCQl0aGlzLmFjdGlvbk1hbmFnZXIgPSBhY3Rpb25NYW5hZ2VyOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIERpYWxvZyNjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpCi0JICovCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCWJhc2VDb21wb3NpdGUgPSAoQ29tcG9zaXRlKSBzdXBlci5jcmVhdGVEaWFsb2dBcmVhKHBhcmVudCk7Ci0JCWZpbmFsIEdyaWRMYXlvdXQgZ3JpZExheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWdyaWRMYXlvdXQubnVtQ29sdW1ucyA9IDQ7Ci0JCWJhc2VDb21wb3NpdGUuc2V0TGF5b3V0KGdyaWRMYXlvdXQpOwotCQliYXNlQ29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKCkpOwotCi0JCS8vIEVtcHR5IGxpbmUKLQkJY3JlYXRlTGFiZWwoYmFzZUNvbXBvc2l0ZSwgIiAiLCA0KTsgLy8kTk9OLU5MUy0xJAotCi0JCWNyZWF0ZUxhYmVsKGJhc2VDb21wb3NpdGUsICIgIiwgMSk7IC8vJE5PTi1OTFMtMSQKLQkJY3JlYXRlTGFiZWwoCi0JCQkJYmFzZUNvbXBvc2l0ZSwKLQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5Db25maWd1cmF0aW9uT3JkZXJEaWFsb2dfTmF2aWdhdGlvblZpZXdzLCAzKTsKLQotCQljcmVhdGVMYWJlbChiYXNlQ29tcG9zaXRlLCAiICIsIDEpOyAvLyROT04tTkxTLTEkCi0JCWN0cmxfdmlld3MgPSBuZXcgVGFibGUoYmFzZUNvbXBvc2l0ZSwgU1dULk1VTFRJIHwgU1dULkJPUkRFUik7Ci0JCXsKLQkJCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCQlncmlkRGF0YS53aWR0aEhpbnQgPSAzMDA7Ci0JCQlncmlkRGF0YS5oZWlnaHRIaW50ID0gNDAwOwotCQkJY3RybF92aWV3cy5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJfQotCi0JCWluaXRQcm92aWRlcnMoKTsKLQotCQl2aWV3c1RhYmxlVmlld2VyID0gbmV3IFRhYmxlVmlld2VyKGN0cmxfdmlld3MpOwotCQl2aWV3c1RhYmxlVmlld2VyLnNldENvbnRlbnRQcm92aWRlcih2aWV3c1ZpZXdlckNvbnRlbnRQcm92aWRlcik7Ci0JCXZpZXdzVGFibGVWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcih2aWV3c1ZpZXdlckxhYmVsUHJvdmlkZXIpOwotCi0JCUNvbXBvc2l0ZSBvcmRlckJ1dHRvblBhbmUgPSBuZXcgQ29tcG9zaXRlKGJhc2VDb21wb3NpdGUsIFNXVC5OVUxMKTsKLQkJewotCQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQ0VOVEVSCi0JCQkJCXwgR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9DRU5URVIpOwotCQkJZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAxOwotCQkJb3JkZXJCdXR0b25QYW5lLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQkJb3JkZXJCdXR0b25QYW5lLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQkJfQotCi0JCWN0cmxfdXAgPSBjcmVhdGVCdXR0b24ob3JkZXJCdXR0b25QYW5lLCBBdXRob3JpbmdVSVRleHQuVVBfQlVUVE9OX1RFWFQpOwotCQljdHJsX3VwLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCi0JCWN0cmxfZG93biA9IGNyZWF0ZUJ1dHRvbihvcmRlckJ1dHRvblBhbmUsCi0JCQkJQXV0aG9yaW5nVUlUZXh0LkRPV05fQlVUVE9OX1RFWFQpOwotCQljdHJsX2Rvd24uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLQkJY3RybF91cC5zZXRFbmFibGVkKGZhbHNlKTsKLQkJY3RybF9kb3duLnNldEVuYWJsZWQoZmFsc2UpOwotCQkvLyBFbXB0eSBsaW5lCi0JCWNyZWF0ZUxhYmVsKGJhc2VDb21wb3NpdGUsICIgIiwgNCk7IC8vJE5PTi1OTFMtMSQKLQotCQljcmVhdGVMaW5lKGJhc2VDb21wb3NpdGUsIDQpOwotCi0JCXN1cGVyCi0JCQkJLmdldFNoZWxsKCkKLQkJCQkuc2V0VGV4dCgKLQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLkNvbmZpZ3VyYXRpb25PcmRlckRpYWxvZ19kZXNjcmlwdGlvbik7Ci0KLQkJYWRkTGlzdGVuZXJzKCk7Ci0JCWxvYWREYXRhKCk7Ci0KLQkJcmV0dXJuIGJhc2VDb21wb3NpdGU7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVMaW5lKENvbXBvc2l0ZSBwYXJlbnQsIGludCBuY29sKSB7Ci0JCUxhYmVsIGxpbmUgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuU0VQQVJBVE9SIHwgU1dULkhPUklaT05UQUwKLQkJCQl8IFNXVC5CT0xEKTsKLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSBuY29sOwotCQlsaW5lLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCX0KLQkKLQlwcml2YXRlIExhYmVsIGNyZWF0ZUxhYmVsKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyB0ZXh0LCBpbnQgbkNvbCkgewotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OT05FKTsKLQkJbGFiZWwuc2V0VGV4dCh0ZXh0KTsKLQkJewotCQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJCWdyaWREYXRhLmhvcml6b250YWxTcGFuID0gbkNvbDsKLQkJCWxhYmVsLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQl9Ci0KLQkJcmV0dXJuIGxhYmVsOwotCX0KLQotCXByaXZhdGUgQnV0dG9uIGNyZWF0ZUJ1dHRvbihDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgbGFiZWwpIHsKLQkJQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuTk9ORSk7Ci0JCWJ1dHRvbi5zZXRUZXh0KGxhYmVsKTsKLQkJcmV0dXJuIGJ1dHRvbjsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGluaXRQcm92aWRlcnMoKSB7Ci0JCXZpZXdzVmlld2VyQ29udGVudFByb3ZpZGVyID0gbmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKAotCQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpIHsKLQkJCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNvbmZpZy5nZXRQcm9jZXNzVmlld3MoKS50b0FycmF5KCk7Ci0JCQl9Ci0JCX07Ci0KLQkJdmlld3NWaWV3ZXJMYWJlbFByb3ZpZGVyID0gbmV3IFZhcmlhYmlsaXR5RWxlbWVudExhYmVsUHJvdmlkZXIoCi0JCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJCS5nZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSkgewotCi0JCQlwdWJsaWMgYm9vbGVhbiBpc0V4dGVybmFsKE9iamVjdCBlbGVtZW50KSB7Ci0JCQkJcmV0dXJuICFjb25maWcuZ2V0UHJvY2Vzc1ZpZXdzKCkuY29udGFpbnMoZWxlbWVudCk7Ci0JCQl9Ci0KLQkJfTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgYWRkTGlzdGVuZXJzKCkgewotCQl2aWV3c1RhYmxlVmlld2VyCi0JCS5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0KLQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB2aWV3c1RhYmxlVmlld2VyCi0JCQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJaWYgKHNlbGVjdGlvbi5zaXplKCkgPiAwKSB7Ci0JCQkJCWlmICh2aWV3c1RhYmxlVmlld2VyLmdldFRhYmxlKCkuZ2V0U2VsZWN0aW9uSW5kZXgoKSA+IDAKLQkJCQkJCQkmJiBzZWxlY3Rpb24uc2l6ZSgpID09IDEpIHsKLQkJCQkJCWN0cmxfdXAuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQkJfSBlbHNlCi0JCQkJCQljdHJsX3VwLnNldEVuYWJsZWQoZmFsc2UpOwotCi0JCQkJCWlmICh2aWV3c1RhYmxlVmlld2VyLmdldFRhYmxlKCkuZ2V0U2VsZWN0aW9uSW5kZXgoKSA8IHZpZXdzVGFibGVWaWV3ZXIKLQkJCQkJCQkuZ2V0VGFibGUoKS5nZXRJdGVtQ291bnQoKSAtIDEKLQkJCQkJCQkmJiBzZWxlY3Rpb24uc2l6ZSgpID09IDEpIHsKLQkJCQkJCWN0cmxfZG93bi5zZXRFbmFibGVkKHRydWUpOwotCQkJCQl9IGVsc2UKLQkJCQkJCWN0cmxfZG93bi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJfSk7Ci0JCQotCQljdHJsX3VwLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgdmlld3NUYWJsZVZpZXdlcgotCQkJCQkJLmdldFNlbGVjdGlvbigpOwotCi0JCQkJQXJyYXlMaXN0IG1vdmVVcEl0ZW1zID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCW1vdmVVcEl0ZW1zLmFkZEFsbChzZWxlY3Rpb24udG9MaXN0KCkpOwotCQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCS5nZXRNZXRob2RDb25maWd1cmF0aW9uX1Byb2Nlc3NWaWV3cygpOwotCQkJCU1vdmVJbkNvbmZpZ3VyYXRpb25Db21tYW5kIGNtZCA9IG5ldyBNb3ZlSW5Db25maWd1cmF0aW9uQ29tbWFuZCgKLQkJCQkJCWNvbmZpZywgbW92ZVVwSXRlbXMsIGZlYXR1cmUsMSk7Ci0JCQkJYWN0aW9uTWFuYWdlci5leGVjdXRlKGNtZCk7Ci0JCQkJY29tbWFuZHMuYWRkKGNtZCk7Ci0KLQkJCQl2aWV3c1RhYmxlVmlld2VyLnJlZnJlc2goKTsKLQotCQkJCWlmICh2aWV3c1RhYmxlVmlld2VyLmdldFRhYmxlKCkuZ2V0U2VsZWN0aW9uSW5kZXgoKSA+IDApIHsKLQkJCQkJY3RybF91cC5zZXRFbmFibGVkKHRydWUpOwotCQkJCX0gZWxzZQotCQkJCQljdHJsX3VwLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCWlmICh2aWV3c1RhYmxlVmlld2VyLmdldFRhYmxlKCkuZ2V0U2VsZWN0aW9uSW5kZXgoKSA8IHZpZXdzVGFibGVWaWV3ZXIKLQkJCQkJCS5nZXRUYWJsZSgpLmdldEl0ZW1Db3VudCgpIC0gMSkgewotCQkJCQljdHJsX2Rvd24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQl9IGVsc2UKLQkJCQkJY3RybF9kb3duLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJfQotCQl9KTsKLQkJCi0JCWN0cmxfZG93bi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHZpZXdzVGFibGVWaWV3ZXIKLQkJCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQkJCQlBcnJheUxpc3QgbW92ZURvd25JdGVtcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQltb3ZlRG93bkl0ZW1zLmFkZEFsbChzZWxlY3Rpb24udG9MaXN0KCkpOwotCQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCS5nZXRNZXRob2RDb25maWd1cmF0aW9uX1Byb2Nlc3NWaWV3cygpOwotCQkJCU1vdmVJbkNvbmZpZ3VyYXRpb25Db21tYW5kIGNtZCA9IG5ldyBNb3ZlSW5Db25maWd1cmF0aW9uQ29tbWFuZCgKLQkJCQkJCWNvbmZpZywgbW92ZURvd25JdGVtcywgZmVhdHVyZSwwKTsKLQkJCQlhY3Rpb25NYW5hZ2VyLmV4ZWN1dGUoY21kKTsKLQkJCQljb21tYW5kcy5hZGQoY21kKTsKLQotCQkJCXZpZXdzVGFibGVWaWV3ZXIucmVmcmVzaCgpOwotCi0JCQkJaWYgKHZpZXdzVGFibGVWaWV3ZXIuZ2V0VGFibGUoKS5nZXRTZWxlY3Rpb25JbmRleCgpID4gMCkgewotCQkJCQljdHJsX3VwLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJfSBlbHNlCi0JCQkJCWN0cmxfdXAuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJaWYgKHZpZXdzVGFibGVWaWV3ZXIuZ2V0VGFibGUoKS5nZXRTZWxlY3Rpb25JbmRleCgpIDwgdmlld3NUYWJsZVZpZXdlcgotCQkJCQkJLmdldFRhYmxlKCkuZ2V0SXRlbUNvdW50KCkgLSAxKSB7Ci0JCQkJCWN0cmxfZG93bi5zZXRFbmFibGVkKHRydWUpOwotCQkJCX0gZWxzZQotCQkJCQljdHJsX2Rvd24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQkvKioKLQkgKiBMb2FkIGluaXRpYWwgZGF0YSBmcm9tIG1vZGVsCi0JICovCi0JcHJpdmF0ZSB2b2lkIGxvYWREYXRhKCkgewotCQl2aWV3c1RhYmxlVmlld2VyLnNldElucHV0KGNvbmZpZyk7Ci0JfQotCQotCS8qKgotCSAqIENhbGxlZCB3aGVuIHRoZSBPSyBidXR0b24gaXMgc2VsZWN0ZWQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgb2tQcmVzc2VkKCkgewotLy8JCWFsbFN0ZXBzLmFwcGx5KCk7Ci0JCXN1cGVyLm9rUHJlc3NlZCgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNhbmNlbFByZXNzZWQoKSB7Ci0JCWlmICghY29tbWFuZHMuaXNFbXB0eSgpKSB7Ci0JCQlmb3IgKGludCBpID0gY29tbWFuZHMuc2l6ZSgpIC0gMTsgaSA+IC0xOyBpLS0pIHsKLQkJCQlPYmplY3QgY21kID0gY29tbWFuZHMuZ2V0KGkpOwotCQkJCWlmIChjbWQgaW5zdGFuY2VvZiBNb3ZlSW5Db25maWd1cmF0aW9uQ29tbWFuZCkgewotCQkJCQkoKE1vdmVJbkNvbmZpZ3VyYXRpb25Db21tYW5kKSBjbWQpLnVuZG8oKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJc3VwZXIuY2FuY2VsUHJlc3NlZCgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9kaWFsb2dzL0NvbnRlbnRFbGVtZW50c09yZGVyRGlhbG9nLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2RpYWxvZ3MvQ29udGVudEVsZW1lbnRzT3JkZXJEaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzRlYmE0Yy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2RpYWxvZ3MvQ29udGVudEVsZW1lbnRzT3JkZXJEaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmRpYWxvZ3M7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3ZpZGVycy5WYXJpYWJpbGl0eUVsZW1lbnRMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSUFjdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLk1vdmVJbkxpc3RDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5DYXRlZ29yeVNvcnRIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkNvbnRlbnRFbGVtZW50T3JkZXJMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Nb2RlbFN0cnVjdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRDYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnRQcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ29tYm9WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotCi0vKioKLSAqIE9wZW4gYW4gZGlhbG9nIHRvIG9yZGVyIGNvbnRlbnQgZWxlbWVudHMKLSAqIAotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAc2luY2UgMS4wCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIENvbnRlbnRFbGVtZW50c09yZGVyRGlhbG9nIGV4dGVuZHMgRGlhbG9nIHsKLQotCXByaXZhdGUgQ29tcG9zaXRlIGJhc2VDb21wb3NpdGU7Ci0KLQlwcml2YXRlIEJ1dHRvbiBjdHJsX3VwLCBjdHJsX2Rvd247Ci0KLQlwcml2YXRlIFRhYmxlIGN0cmxfc3RlcHM7Ci0KLQlwcml2YXRlIFRhYmxlVmlld2VyIHN0ZXBzVGFibGVWaWV3ZXI7Ci0KLQkvLyBwcml2YXRlIENvbnRlbnRFbGVtZW50T3JkZXJMaXN0IGFsbFN0ZXBzOwotCXByaXZhdGUgQ29udGVudEVsZW1lbnRPcmRlckxpc3QgYWxsU3RlcHM7Ci0KLQlwcml2YXRlIElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyIHN0ZXBzVmlld2VyQ29udGVudFByb3ZpZGVyOwotCi0JcHJpdmF0ZSBJTGFiZWxQcm92aWRlciBzdGVwc1ZpZXdlckxhYmVsUHJvdmlkZXI7Ci0KLQkvLyBwcml2YXRlIFRhc2sgY29udGVudEVsZW1lbnQ7Ci0JcHJpdmF0ZSBDb250ZW50RWxlbWVudCBjb250ZW50RWxlbWVudDsKLQotCS8vIHRoZSBFbGVtZW50IHRvIHVzZSBmb3Igc29ydGluZwotCXByaXZhdGUgTWV0aG9kRWxlbWVudCBzb3J0RWxlbWVudDsKLQotCXByaXZhdGUgSUFjdGlvbk1hbmFnZXIgYWN0aW9uTWFuYWdlcjsKLQotCXByaXZhdGUgQXJyYXlMaXN0IGNvbW1hbmRzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JcHJvdGVjdGVkIENvbWJvVmlld2VyIHZpZXdlcl9zb3J0OwotCi0JcHJvdGVjdGVkIElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyIGNvbnRlbnRQcm92aWRlclNvcnQgPSBuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoCi0JCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpIHsKLQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBvYmplY3QpIHsKLQkJCUxpc3Q8U3RyaW5nPiBzb3J0VHlwZXNMaXN0ID0gQ2F0ZWdvcnlTb3J0SGVscGVyCi0JCQkJCS5nZXRDYXRlZ29yeVNvcnRUeXBlcygpOwotCQkJcmV0dXJuIHNvcnRUeXBlc0xpc3QudG9BcnJheSgpOwotCQl9Ci0JfTsKLQotCXByb3RlY3RlZCBJTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyU29ydCA9IG5ldyBBZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIoCi0JCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpIHsKLQkJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJCWlmIChvYmplY3QgaW5zdGFuY2VvZiBTdHJpbmcpIHsKLQkJCQlTdHJpbmcgc3RyID0gKChTdHJpbmcpIG9iamVjdCk7Ci0JCQkJcmV0dXJuIENhdGVnb3J5U29ydEhlbHBlci5nZXRTb3J0VHlwZURpc3BsYXlOYW1lKHN0cik7Ci0JCQl9Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX07Ci0KLQlwcml2YXRlIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIDxjb2RlPkFkdmFuY2VkU2VhcmNoRGlhbG9nPC9jb2RlPiBnaXZlYiB0aGUgcGFyZW50IGNvbnRyb2wuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb250cm9sLgotCSAqLwotCXB1YmxpYyBDb250ZW50RWxlbWVudHNPcmRlckRpYWxvZyhTaGVsbCBwYXJlbnQsCi0JCQlDb250ZW50RWxlbWVudCBjb250ZW50RWxlbWVudCwgSUFjdGlvbk1hbmFnZXIgYWN0aW9uTWFuYWdlcikgewotCQlzdXBlcihwYXJlbnQpOwotCQl0aGlzLmNvbnRlbnRFbGVtZW50ID0gY29udGVudEVsZW1lbnQ7Ci0JCWlmIChUbmdVdGlsLmlzQ29udHJpYnV0b3IoY29udGVudEVsZW1lbnQpKSB7Ci0JCQl0aGlzLnNvcnRFbGVtZW50ID0gY29udGVudEVsZW1lbnQuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpOwotCQl9IGVsc2UgewotCQkJdGhpcy5zb3J0RWxlbWVudCA9IGNvbnRlbnRFbGVtZW50OwotCQl9Ci0JCXRoaXMuYWN0aW9uTWFuYWdlciA9IGFjdGlvbk1hbmFnZXI7Ci0JCXRoaXMuYWxsU3RlcHMgPSBudWxsOwotCi0JfQotCi0JLyoqCi0JICogQHNlZSBEaWFsb2cjY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KQotCSAqLwotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkgewotCQliYXNlQ29tcG9zaXRlID0gKENvbXBvc2l0ZSkgc3VwZXIuY3JlYXRlRGlhbG9nQXJlYShwYXJlbnQpOwotCQlmaW5hbCBHcmlkTGF5b3V0IGdyaWRMYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlncmlkTGF5b3V0Lm51bUNvbHVtbnMgPSA0OwotCQliYXNlQ29tcG9zaXRlLnNldExheW91dChncmlkTGF5b3V0KTsKLQkJYmFzZUNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YSgpKTsKLQotCQkvLyBFbXB0eSBsaW5lCi0JCWNyZWF0ZUxhYmVsKGJhc2VDb21wb3NpdGUsICIgIiwgNCk7IC8vJE5PTi1OTFMtMSQKLQotCQljcmVhdGVMYWJlbChiYXNlQ29tcG9zaXRlLCAiICIsIDEpOyAvLyROT04tTkxTLTEkCi0JCWNyZWF0ZUxhYmVsKAotCQkJCWJhc2VDb21wb3NpdGUsCi0JCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuQ29udGVudEVsZW1lbnRzT3JkZXJEaWFsb2dfQ29udGVudEVsZW1lbnRfdGV4dCwKLQkJCQkzKTsgCi0KLQkJY3JlYXRlTGFiZWwoYmFzZUNvbXBvc2l0ZSwgIiAiLCAxKTsgLy8kTk9OLU5MUy0xJAotCQljdHJsX3N0ZXBzID0gbmV3IFRhYmxlKGJhc2VDb21wb3NpdGUsIFNXVC5NVUxUSSB8IFNXVC5CT1JERVIpOwotCQl7Ci0JCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQkJZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQkJZ3JpZERhdGEud2lkdGhIaW50ID0gMzAwOwotCQkJZ3JpZERhdGEuaGVpZ2h0SGludCA9IDQwMDsKLQkJCWN0cmxfc3RlcHMuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCX0KLQotCQlpbml0UHJvdmlkZXJzKCk7Ci0KLQkJc3RlcHNUYWJsZVZpZXdlciA9IG5ldyBUYWJsZVZpZXdlcihjdHJsX3N0ZXBzKTsKLQkJc3RlcHNUYWJsZVZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIoc3RlcHNWaWV3ZXJDb250ZW50UHJvdmlkZXIpOwotCQlzdGVwc1RhYmxlVmlld2VyLnNldExhYmVsUHJvdmlkZXIoc3RlcHNWaWV3ZXJMYWJlbFByb3ZpZGVyKTsKLQotCQlDb21wb3NpdGUgb3JkZXJCdXR0b25QYW5lID0gbmV3IENvbXBvc2l0ZShiYXNlQ29tcG9zaXRlLCBTV1QuTlVMTCk7Ci0JCXsKLQkJCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0NFTlRFUgotCQkJCQl8IEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQ0VOVEVSKTsKLQkJCWdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMTsKLQkJCW9yZGVyQnV0dG9uUGFuZS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJCW9yZGVyQnV0dG9uUGFuZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JCX0KLQotCQljdHJsX3VwID0gY3JlYXRlQnV0dG9uKG9yZGVyQnV0dG9uUGFuZSwgQXV0aG9yaW5nVUlUZXh0LlVQX0JVVFRPTl9URVhUKTsKLQkJY3RybF91cC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQotCQljdHJsX2Rvd24gPSBjcmVhdGVCdXR0b24ob3JkZXJCdXR0b25QYW5lLAotCQkJCUF1dGhvcmluZ1VJVGV4dC5ET1dOX0JVVFRPTl9URVhUKTsKLQkJY3RybF9kb3duLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCi0JCWN0cmxfdXAuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCWN0cmxfZG93bi5zZXRFbmFibGVkKGZhbHNlKTsKLQotCQljcmVhdGVMYWJlbChvcmRlckJ1dHRvblBhbmUsIExpYnJhcnlFZGl0UmVzb3VyY2VzLlNvcnRUeXBlX0xhYmVsLCAxKTsKLQkJQ29tYm8gY3RybF9zb3J0ID0gbmV3IENvbWJvKG9yZGVyQnV0dG9uUGFuZSwgU1dULlNJTkdMRSB8IFNXVC5GTEFUCi0JCQkJfCBTV1QuUkVBRF9PTkxZKTsKLQkJdmlld2VyX3NvcnQgPSBuZXcgQ29tYm9WaWV3ZXIoY3RybF9zb3J0KTsKLQkJdmlld2VyX3NvcnQuc2V0Q29udGVudFByb3ZpZGVyKGNvbnRlbnRQcm92aWRlclNvcnQpOwotCQl2aWV3ZXJfc29ydC5zZXRMYWJlbFByb3ZpZGVyKGxhYmVsUHJvdmlkZXJTb3J0KTsKLQkJdmlld2VyX3NvcnQuc2V0SW5wdXQoY29udGVudEVsZW1lbnQpOwotCQkvLyBzZXQgaW5pdGlhbCBzZWxlY3Rpb24KLQkJU3RyaW5nIHNvcnRUeXBlID0gQ2F0ZWdvcnlTb3J0SGVscGVyLmdldENhdGVnb3J5U29ydFZhbHVlKHNvcnRFbGVtZW50KTsKLQkJdmlld2VyX3NvcnQuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKHNvcnRUeXBlKSwgdHJ1ZSk7Ci0JCWVuYWJsZUJ1dHRvbnMoKTsKLQotCQkvLyBFbXB0eSBsaW5lCi0JCWNyZWF0ZUxhYmVsKGJhc2VDb21wb3NpdGUsICIgIiwgNCk7IC8vJE5PTi1OTFMtMSQKLQotCQljcmVhdGVMaW5lKGJhc2VDb21wb3NpdGUsIDQpOwotCi0JCXN1cGVyCi0JCQkJLmdldFNoZWxsKCkKLQkJCQkuc2V0VGV4dCgKLQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLkNvbnRlbnRFbGVtZW50c09yZGVyRGlhbG9nX2Rlc2NyaXB0aW9uX3RleHQpOyAKLQotCQlhZGRMaXN0ZW5lcnMoKTsKLQkJbG9hZERhdGEoKTsKLQotCQkvLyBjb250cmlidXRvcnMgY2Fubm90IGNoYW5nZSB0aGUgc29ydCB0eXBlIC0gdGhlIGJhc2UgZWxlbWVudCdzIHNvcnQgaXMKLQkJLy8gdXNlZAotCQlpZiAoVG5nVXRpbC5pc0xvY2tlZChjb250ZW50RWxlbWVudCkgfHwgVG5nVXRpbC5pc0NvbnRyaWJ1dG9yKGNvbnRlbnRFbGVtZW50KSkgewotCQkJdmlld2VyX3NvcnQuZ2V0Q29tYm8oKS5zZXRFbmFibGVkKGZhbHNlKTsKLQkJfSBlbHNlIHsKLQkJCXZpZXdlcl9zb3J0LmdldENvbWJvKCkuc2V0RW5hYmxlZCh0cnVlKTsKLQkJfQotCi0JCXJldHVybiBiYXNlQ29tcG9zaXRlOwotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVMaW5lKENvbXBvc2l0ZSBwYXJlbnQsIGludCBuY29sKSB7Ci0JCUxhYmVsIGxpbmUgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuU0VQQVJBVE9SIHwgU1dULkhPUklaT05UQUwKLQkJCQl8IFNXVC5CT0xEKTsKLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSBuY29sOwotCQlsaW5lLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCX0KLQotCXByaXZhdGUgTGFiZWwgY3JlYXRlTGFiZWwoQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIHRleHQsIGludCBuQ29sKSB7Ci0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5PTkUpOwotCQlsYWJlbC5zZXRUZXh0KHRleHQpOwotCQl7Ci0JCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQkJZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSBuQ29sOwotCQkJbGFiZWwuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCX0KLQotCQlyZXR1cm4gbGFiZWw7Ci0JfQotCi0JcHJpdmF0ZSBCdXR0b24gY3JlYXRlQnV0dG9uKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyBsYWJlbCkgewotCQlCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5OT05FKTsKLQkJYnV0dG9uLnNldFRleHQobGFiZWwpOwotCQlyZXR1cm4gYnV0dG9uOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIGRpYWxvZyBidXR0b25zLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUJ1dHRvbnNGb3JCdXR0b25CYXIoQ29tcG9zaXRlIHBhcmVudCkgewotCQkvLyBDcmVhdGUgdGhlIE9LIGJ1dHRvbi4KLQkJY3JlYXRlQnV0dG9uKHBhcmVudCwgSURpYWxvZ0NvbnN0YW50cy5PS19JRCwgSURpYWxvZ0NvbnN0YW50cy5PS19MQUJFTCwKLQkJCQl0cnVlKTsKLQotCQkvLyBDcmVhdGUgdGhlIENhbmNlbCBidXR0b24uCi0JCWNyZWF0ZUJ1dHRvbihwYXJlbnQsIElEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0lELAotCQkJCUlEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0xBQkVMLCBmYWxzZSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGluaXRQcm92aWRlcnMoKSB7Ci0JCXN0ZXBzVmlld2VyQ29udGVudFByb3ZpZGVyID0gbmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKAotCQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpIHsKLQkJCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3Qgb2JqZWN0KSB7Ci0KLQkJCQkvLyBpZiAoYWxsU3RlcHMgPT0gbnVsbCkgewotCQkJCS8vIGFsbFN0ZXBzID0gbmV3IENvbnRlbnRFbGVtZW50T3JkZXJMaXN0KAotCQkJCS8vIGNvbnRlbnRFbGVtZW50LAotCQkJCS8vIENvbnRlbnRFbGVtZW50T3JkZXJMaXN0LkNPTlRFTlRfRUxFTUVOVFNfX0ZPUl9FTEVNRU5UX0FORF9QQVJFTlRTKTsKLQkJCQkvLyB9Ci0JCQkJLy8gTGlzdCByZXR1cm5MaXN0ID0KLQkJCQkvLyBDYXRlZ29yeVNvcnRIZWxwZXIuc29ydENhdGVnb3J5RWxlbWVudHMoc29ydEVsZW1lbnQsCi0JCQkJLy8gYWxsU3RlcHMudG9BcnJheSgpKTsKLQkJCQkvLyByZXR1cm4gcmV0dXJuTGlzdC50b0FycmF5KCk7Ci0KLQkJCQlpZiAoYWxsU3RlcHMgPT0gbnVsbCkgewotCQkJCQlhbGxTdGVwcyA9IG5ldyBDb250ZW50RWxlbWVudE9yZGVyTGlzdCgKLQkJCQkJCQljb250ZW50RWxlbWVudCwKLQkJCQkJCQlDb250ZW50RWxlbWVudE9yZGVyTGlzdC5DT05URU5UX0VMRU1FTlRTX19GT1JfRUxFTUVOVF9BTkRfUEFSRU5UUywKLQkJCQkJCQlmZWF0dXJlKTsKLQkJCQl9Ci0JCQkJTGlzdCByZXR1cm5MaXN0ID0gQ2F0ZWdvcnlTb3J0SGVscGVyLnNvcnRDYXRlZ29yeUVsZW1lbnRzKAotCQkJCQkJc29ydEVsZW1lbnQsIGFsbFN0ZXBzLnRvQXJyYXkoKSk7Ci0JCQkJcmV0dXJuIHJldHVybkxpc3QudG9BcnJheSgpOwotCQkJfQotCQl9OwotCi0JCXN0ZXBzVmlld2VyTGFiZWxQcm92aWRlciA9IG5ldyBWYXJpYWJpbGl0eUVsZW1lbnRMYWJlbFByb3ZpZGVyKAotCQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpIHsKLQotCQkJcHVibGljIGJvb2xlYW4gaXNFeHRlcm5hbChPYmplY3QgZWxlbWVudCkgewotCQkJCXJldHVybiAhKChMaXN0KSAoKENvbnRlbnRDYXRlZ29yeSkgY29udGVudEVsZW1lbnQpCi0JCQkJCQkuZUdldChmZWF0dXJlKSkuY29udGFpbnMoZWxlbWVudCk7Ci0JCQl9Ci0KLQkJfTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcnMoKSB7Ci0KLQkJc3RlcHNUYWJsZVZpZXdlcgotCQkJCS5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0KLQkJCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQkJCWVuYWJsZUJ1dHRvbnMoKTsKLQkJCQkJfQotCi0JCQkJfSk7Ci0KLQkJY3RybF91cC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHN0ZXBzVGFibGVWaWV3ZXIKLQkJCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQotCQkJCUFycmF5TGlzdCBtb3ZlVXBJdGVtcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQltb3ZlVXBJdGVtcy5hZGRBbGwoc2VsZWN0aW9uLnRvTGlzdCgpKTsKLQkJCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkuZ2V0Q3VzdG9tQ2F0ZWdvcnlfQ2F0ZWdvcml6ZWRFbGVtZW50cygpOwotCQkJCU1vdmVJbkxpc3RDb21tYW5kIGNtZCA9IG5ldyBNb3ZlSW5MaXN0Q29tbWFuZCgKLQkJCQkJCShDb250ZW50Q2F0ZWdvcnkpIGNvbnRlbnRFbGVtZW50LCBtb3ZlVXBJdGVtcywKLQkJCQkJCWFsbFN0ZXBzLCBmZWF0dXJlLCBNb3ZlSW5MaXN0Q29tbWFuZC5VUCk7Ci0KLQkJCQlhY3Rpb25NYW5hZ2VyLmV4ZWN1dGUoY21kKTsKLQkJCQljb21tYW5kcy5hZGQoY21kKTsKLQotCQkJCXJlZnJlc2hWaWV3ZXJzKCk7Ci0KLQkJCQllbmFibGVCdXR0b25zKCk7Ci0JCQl9Ci0JCX0pOwotCi0JCWN0cmxfZG93bi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHN0ZXBzVGFibGVWaWV3ZXIKLQkJCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQkJCQlBcnJheUxpc3QgbW92ZURvd25JdGVtcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQltb3ZlRG93bkl0ZW1zLmFkZEFsbChzZWxlY3Rpb24udG9MaXN0KCkpOwotCQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCS5nZXRDdXN0b21DYXRlZ29yeV9DYXRlZ29yaXplZEVsZW1lbnRzKCk7Ci0JCQkJTW92ZUluTGlzdENvbW1hbmQgY21kID0gbmV3IE1vdmVJbkxpc3RDb21tYW5kKAotCQkJCQkJKENvbnRlbnRDYXRlZ29yeSkgY29udGVudEVsZW1lbnQsIG1vdmVEb3duSXRlbXMsCi0JCQkJCQlhbGxTdGVwcywgZmVhdHVyZSwgTW92ZUluTGlzdENvbW1hbmQuRE9XTik7Ci0JCQkJYWN0aW9uTWFuYWdlci5leGVjdXRlKGNtZCk7Ci0JCQkJY29tbWFuZHMuYWRkKGNtZCk7Ci0KLQkJCQlyZWZyZXNoVmlld2VycygpOwotCi0JCQkJZW5hYmxlQnV0dG9ucygpOwotCQkJfQotCQl9KTsKLQotCQl2aWV3ZXJfc29ydAotCQkJCS5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHZpZXdlcl9zb3J0Ci0JCQkJCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQkJCQkJCVN0cmluZyBzb3J0VHlwZSA9IChTdHJpbmcpIHNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCQkJCU1ldGhvZEVsZW1lbnRQcm9wZXJ0eSBwcm9wID0gQ2F0ZWdvcnlTb3J0SGVscGVyCi0JCQkJCQkJCS5nZXRDYXRlZ29yeVNvcnRQcm9wZXJ0eShjb250ZW50RWxlbWVudCk7Ci0KLQkJCQkJCWlmIChwcm9wID09IG51bGwpIHsKLQkJCQkJCQlwcm9wID0gQ2F0ZWdvcnlTb3J0SGVscGVyCi0JCQkJCQkJCQkuY3JlYXRlTmV3U29ydFByb3BlcnR5KHNvcnRUeXBlKTsKLQkJCQkJCQlhY3Rpb25NYW5hZ2VyCi0JCQkJCQkJCQkuZG9BY3Rpb24oCi0JCQkJCQkJCQkJCUlBY3Rpb25NYW5hZ2VyLkFERCwKLQkJCQkJCQkJCQkJY29udGVudEVsZW1lbnQsCi0JCQkJCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJCQkJLmdldE1ldGhvZEVsZW1lbnRfTWV0aG9kRWxlbWVudFByb3BlcnR5KCksCi0JCQkJCQkJCQkJCXByb3AsIC0xKTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJYWN0aW9uTWFuYWdlci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5TRVQsIHByb3AsCi0JCQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJCQkuZ2V0TWV0aG9kRWxlbWVudFByb3BlcnR5X1ZhbHVlKCksCi0JCQkJCQkJCQlzb3J0VHlwZSwgLTEpOwotCQkJCQkJfQotCQkJCQkJcmVmcmVzaFZpZXdlcnMoKTsKLQkJCQkJCWVuYWJsZUJ1dHRvbnMoKTsKLQkJCQkJfQotCQkJCX0pOwotCi0JfQotCi0JcHJpdmF0ZSB2b2lkIHJlZnJlc2hWaWV3ZXJzKCkgewotCQlzdGVwc1RhYmxlVmlld2VyLnJlZnJlc2goKTsKLQl9Ci0KLQkvKioKLQkgKiBMb2FkIGluaXRpYWwgZGF0YSBmcm9tIG1vZGVsCi0JICovCi0JcHJpdmF0ZSB2b2lkIGxvYWREYXRhKCkgewotCQlzdGVwc1RhYmxlVmlld2VyLnNldElucHV0KGNvbnRlbnRFbGVtZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBDYWxsZWQgd2hlbiB0aGUgT0sgYnV0dG9uIGlzIHNlbGVjdGVkLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIG9rUHJlc3NlZCgpIHsKLQkJYWxsU3RlcHMuYXBwbHkoKTsKLQotCQlzdXBlci5va1ByZXNzZWQoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjYW5jZWxQcmVzc2VkKCkgewotCQlpZiAoIWNvbW1hbmRzLmlzRW1wdHkoKSkgewotCQkJZm9yIChpbnQgaSA9IGNvbW1hbmRzLnNpemUoKSAtIDE7IGkgPiAtMTsgaS0tKSB7Ci0JCQkJT2JqZWN0IGNtZCA9IGNvbW1hbmRzLmdldChpKTsKLQkJCQlpZiAoY21kIGluc3RhbmNlb2YgTW92ZUluTGlzdENvbW1hbmQpIHsKLQkJCQkJKChNb3ZlSW5MaXN0Q29tbWFuZCkgY21kKS51bmRvKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXN1cGVyLmNhbmNlbFByZXNzZWQoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRGZWF0dXJlKEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKSB7Ci0JCXRoaXMuZmVhdHVyZSA9IGZlYXR1cmU7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGVuYWJsZUJ1dHRvbnMoKSB7Ci0JCWlmIChpc1Nob3VsZEVuYWJsZVVwKCkpIHsKLQkJCWN0cmxfdXAuc2V0RW5hYmxlZCh0cnVlKTsKLQkJfSBlbHNlCi0JCQljdHJsX3VwLnNldEVuYWJsZWQoZmFsc2UpOwotCi0JCWlmIChpc1Nob3VsZEVuYWJsZURvd24oKSkgewotCQkJY3RybF9kb3duLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCX0gZWxzZQotCQkJY3RybF9kb3duLnNldEVuYWJsZWQoZmFsc2UpOwotCX0KLQkKLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1Nob3VsZEVuYWJsZVVwKCkgewotCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHN0ZXBzVGFibGVWaWV3ZXIKLQkJCS5nZXRTZWxlY3Rpb24oKTsKLQkJaWYgKHNlbGVjdGlvbi5zaXplKCkgPT0gMSAmJgotCQkJCXN0ZXBzVGFibGVWaWV3ZXIuZ2V0VGFibGUoKS5nZXRTZWxlY3Rpb25JbmRleCgpID4gMCAmJgotCQkJCSFUbmdVdGlsLmlzTG9ja2VkKGNvbnRlbnRFbGVtZW50KSAmJiAKLQkJCQlDYXRlZ29yeVNvcnRIZWxwZXIuaXNNYW51YWxDYXRlZ29yeVNvcnQoc29ydEVsZW1lbnQpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1Nob3VsZEVuYWJsZURvd24oKSB7Ci0JCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgc3RlcHNUYWJsZVZpZXdlcgotCQkJLmdldFNlbGVjdGlvbigpOwotCQlpZiAoc2VsZWN0aW9uLnNpemUoKSA9PSAxICYmCi0JCQkJKHN0ZXBzVGFibGVWaWV3ZXIuZ2V0VGFibGUoKS5nZXRTZWxlY3Rpb25JbmRleCgpIDwgc3RlcHNUYWJsZVZpZXdlcgotCQkJCQkuZ2V0VGFibGUoKS5nZXRJdGVtQ291bnQoKSAtIDEpICYmCi0JCQkJIVRuZ1V0aWwuaXNMb2NrZWQoY29udGVudEVsZW1lbnQpICYmCi0JCQkJQ2F0ZWdvcnlTb3J0SGVscGVyLmlzTWFudWFsQ2F0ZWdvcnlTb3J0KHNvcnRFbGVtZW50KSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2RpYWxvZ3MvQ29udHJpYnV0aW9uU2VsZWN0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2RpYWxvZ3MvQ29udHJpYnV0aW9uU2VsZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyZGZiNzkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9kaWFsb2dzL0NvbnRyaWJ1dGlvblNlbGVjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZGlhbG9nczsKLQotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZpbHRlcnMuQWxsRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLkNhdGVnb3JpemVkUHJvY2Vzc2VzSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuQ29udGVudENhdGVnb3JpZXNHcm91cEl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLkZpbHRlckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLlByb2Nlc3Nlc0l0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuTWV0aG9kRWxlbWVudFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkN1c3RvbUNhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGlzY2lwbGluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQXNzb2NpYXRpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLQotLyoqCi0gKiBUaGUgZGlhbG9nIGZvciBzZWxlY3RpbmcgZWxlbWVudCB0byBkZXRldG1pbmUgd2hpY2ggZWxlbWVudCBlZGl0b3IgdG8gb3BlbiBpbgotICogY2FzZSBvZiB2YXJpYWJpbGl0eSByZWxhdGlvbnNoaXAuIFRoaXMgd2lsbCBvbmx5IHRha2UgZWZmZWN0IGlmIHVzZXIKLSAqIGRvdWJsZS1jbGlja3MgZnJvbSBjb25maWd1cmF0aW9uIHZpZXcuCi0gKiAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBDb250cmlidXRpb25TZWxlY3Rpb24gewotCi0JcHJpdmF0ZSBIYXNoU2V0IGZpbHRlckVsZW1lbnRMaXN0ID0gbmV3IEhhc2hTZXQoKTsKLQotCXByaXZhdGUgY2xhc3MgQ29udHJpYnV0aW9uRmlsdGVyIGV4dGVuZHMgQWxsRmlsdGVyIHsKLQkJcHVibGljIGJvb2xlYW4gYWNjZXB0KE9iamVjdCBvYmopIHsKLQkJCU9iamVjdCBjb250ZW50RWxlbWVudCA9IGhlbHBlci5nZXRDb250ZW50RWxlbWVudCgpOwotCQkJaWYgKGNvbnRlbnRFbGVtZW50ICE9IG51bGwpIHsKLQkJCQlpZiAob2JqLmVxdWFscyhoZWxwZXIuZ2V0Q29udGVudEVsZW1lbnQoKSkpCi0JCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQotCQkJaWYgKGhlbHBlci5nZXRBbHJlYWR5U2VsZWN0ZWRMaXN0KCkgIT0gbnVsbCkgewotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50KSB7Ci0JCQkJCWlmIChoZWxwZXIuZ2V0QWxyZWFkeVNlbGVjdGVkTGlzdCgpLmNvbnRhaW5zKAotCQkJCQkJCSgoUHJvY2Vzc0NvbXBvbmVudCkgb2JqKS5nZXRQcm9jZXNzKCkpKQotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWlmIChoZWxwZXIuZ2V0QWxyZWFkeVNlbGVjdGVkTGlzdCgpLmNvbnRhaW5zKG9iaikpCi0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJfQotCi0JCQlpZiAob2JqIGluc3RhbmNlb2YgQ3VzdG9tQ2F0ZWdvcnkpIHsKLQkJCQlpZiAoVG5nVXRpbC5pc1Jvb3RDdXN0b21DYXRlZ29yeSgoQ3VzdG9tQ2F0ZWdvcnkpIG9iaikpIHsKLQkJCQkJaWYgKCgoQ3VzdG9tQ2F0ZWdvcnkpIG9iaikuZ2V0Q2F0ZWdvcml6ZWRFbGVtZW50cygpCi0JCQkJCQkJLmlzRW1wdHkoKSkKLQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoIWhlbHBlci5tYXRjaFBhdHRlcm4ob2JqKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0KLQkJCS8vIGlmKG9iaiBpbnN0YW5jZW9mIFRlcm1EZWZpbml0aW9uKSByZXR1cm4gZmFsc2U7Ci0KLQkJCWlmIChvYmogaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pIHsKLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luKSB7Ci0JCQkJCWlmIChjb250ZW50RWxlbWVudCAhPSBudWxsKSB7Ci0JCQkJCQlpZiAoTWV0aG9kRWxlbWVudFV0aWwuZ2V0QWxsTW9kZWxzKGNvbnRlbnRFbGVtZW50KQotCQkJCQkJCQkuY29udGFpbnMob2JqKSkKLQkJCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJCWVsc2UKLQkJCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWlmIChvYmogaW5zdGFuY2VvZiBDb250ZW50UGFja2FnZSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBDb250ZW50Q2F0ZWdvcmllc0dyb3VwSXRlbVByb3ZpZGVyKSB7Ci0JCQkJQ29sbGVjdGlvbiBsaXN0ID0gKChDb250ZW50Q2F0ZWdvcmllc0dyb3VwSXRlbVByb3ZpZGVyKSBvYmopCi0JCQkJCQkuZ2V0Q2hpbGRyZW4ob2JqKTsKLQkJCQlpZiAobGlzdC5pc0VtcHR5KCkpCi0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQllbHNlCi0JCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFByb2Nlc3Nlc0l0ZW1Qcm92aWRlcikgewotCQkJCUNvbGxlY3Rpb24gbGlzdCA9ICgoUHJvY2Vzc2VzSXRlbVByb3ZpZGVyKSBvYmopCi0JCQkJCQkuZ2V0Q2hpbGRyZW4ob2JqKTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGlvciA9IGxpc3QuaXRlcmF0b3IoKTsgaW9yLmhhc05leHQoKTspIHsKLQkJCQkJT2JqZWN0IG9iamVjdCA9IGlvci5uZXh0KCk7Ci0JCQkJCWlmICgoKENhdGVnb3JpemVkUHJvY2Vzc2VzSXRlbVByb3ZpZGVyKSBvYmplY3QpCi0JCQkJCQkJLmdldENoaWxkcmVuKG9iamVjdCkuaXNFbXB0eSgpKQotCQkJCQkJaW9yLnJlbW92ZSgpOwotCQkJCX0KLQkJCQlpZiAobGlzdC5pc0VtcHR5KCkpCi0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQllbHNlCi0JCQkJCXJldHVybiB0cnVlOwotCQkJfQotCi0JCQlpZiAoY2hpbGRBY2NlcHQob2JqKSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGNoaWxkQWNjZXB0KE9iamVjdCBvYmopIHsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBDdXN0b21DYXRlZ29yeSkgewotCQkJCXJldHVybiBhbnlDYXRlZ29yaXplZEVsZW1lbnRBY2NlcHRlZCgoQ3VzdG9tQ2F0ZWdvcnkpIG9iaiwKLQkJCQkJCWZpbHRlckVsZW1lbnRMaXN0KTsKLQkJCX0KLQkJCWlmICgob2JqIGluc3RhbmNlb2YgQ29udGVudEVsZW1lbnQpCi0JCQkJCSYmIGZpbHRlckVsZW1lbnRMaXN0LmNvbnRhaW5zKG9iaikpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJCWlmKG9iaiBpbnN0YW5jZW9mIFByb2Nlc3MpeyAKLQkJCQlpZihmaWx0ZXJFbGVtZW50TGlzdC5jb250YWlucyhvYmopKXsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQotCQkJaWYob2JqIGluc3RhbmNlb2YgUHJvY2Vzc1BhY2thZ2UpIHsKLQkJCQlyZXR1cm4gY2hlY2tQcm9jZXNzUGtnKG9iaik7Ci0JCQl9Ci0JCQlpZihvYmogaW5zdGFuY2VvZiBQcm9jZXNzKSB7Ci0JCQkJcmV0dXJuIGNoZWNrUHJvY2Vzc0VsZW1lbnRzKG9iaik7Ci0JCQl9Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9OwotCQotCXB1YmxpYyBib29sZWFuIGNoZWNrUHJvY2Vzc1BrZyhPYmplY3Qgb2JqKXsKLQkJCi0JCUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJaWYob2JqIGluc3RhbmNlb2YgUHJvY2Vzc1BhY2thZ2UpewotCQkJaWYoZmlsdGVyRWxlbWVudExpc3QuY29udGFpbnMob2JqKSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCWlmKG9iaiBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpewotCQkJCWlmKGZpbHRlckVsZW1lbnRMaXN0LmNvbnRhaW5zKCgoUHJvY2Vzc0NvbXBvbmVudClvYmopLmdldFByb2Nlc3MoKSkpCi0JCQkJCXJldHVybiB0cnVlOwotCQkJCWxpc3QgPSAoKFByb2Nlc3NDb21wb25lbnQpb2JqKS5nZXRQcm9jZXNzKCkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKTsKLQkJCX1lbHNlewotCQkJCWxpc3QgPSAoKFByb2Nlc3NQYWNrYWdlKW9iaikuZ2V0Q2hpbGRQYWNrYWdlcygpOwotCQkJfQotCQkJCi0JCX0KLQkJZm9yKEl0ZXJhdG9yIGl0ZXJhdG9yID0gbGlzdC5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KQotCQl7Ci0JCQlPYmplY3QgY2hpbGQgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZihjaGlsZCBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpewotCQkJCWlmKGNoZWNrUHJvY2Vzc1BrZyhjaGlsZCkpIHJldHVybiB0cnVlOwotCQkJfQotCQkJaWYoY2hpbGQgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50KXsKLQkJCQlpZihmaWx0ZXJFbGVtZW50TGlzdC5jb250YWlucyhjaGlsZCkpIHJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JLyoqCi0JICogQ2hlY2sgYW55IHByb2Nlc3MgZWxlbWVudHMKLQkgKiBAcGFyYW0gb2JqCi0JICogQHJldHVybgotCSAqIAkJCUJvb2xlYW4gdmFsdWUgCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2hlY2tQcm9jZXNzRWxlbWVudHMoT2JqZWN0IG9iail7Ci0JCUxpc3QgbGlzdCA9ICgoUHJvY2VzcylvYmopLmdldEJyZWFrZG93bkVsZW1lbnRzKCk7Ci0JCWZvcihJdGVyYXRvciBpdGVyYXRvciA9IGxpc3QuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykKLQkJewotCQkJT2JqZWN0IGNoaWxkID0gaXRlcmF0b3IubmV4dCgpOwotCQkJaWYoY2hpbGQgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50KXsKLQkJCQlpZihmaWx0ZXJFbGVtZW50TGlzdC5jb250YWlucygoKEJyZWFrZG93bkVsZW1lbnQpY2hpbGQpKSkKLQkJCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBDaGVja3Mgd2hldGhlciBhbnkgY2F0ZWdvcml6ZWQgZWxlbWVudHMgdG8gYmUgYWNjZXB0ZWQuCi0JICogQHBhcmFtIG9iagotCSAqIEBwYXJhbSBsaXN0Ci0JICogQHJldHVybgotCSAqIAkJQm9vbGVhbiB2YWx1ZSB3aGljaCBpbmRpY2F0ZXMgd2hldGhlciBhbnkgY2F0ZWdvcmllemVkIGVsZW1lbnRzIHRvIGJlIGFjY2VwdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gYW55Q2F0ZWdvcml6ZWRFbGVtZW50QWNjZXB0ZWQoQ3VzdG9tQ2F0ZWdvcnkgb2JqLAotCQkJSGFzaFNldCBsaXN0KSB7Ci0JCWlmIChsaXN0LmNvbnRhaW5zKG9iaikpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJTGlzdCBlbGVtZW50cyA9IG9iai5nZXRDYXRlZ29yaXplZEVsZW1lbnRzKCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBlbGVtZW50cy5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3Qgb2JqZWN0ID0gaXRlcmF0b3IubmV4dCgpOwotCQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIEN1c3RvbUNhdGVnb3J5KSB7Ci0JCQkJaWYgKGxpc3QuY29udGFpbnMob2JqZWN0KSkKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJYW55Q2F0ZWdvcml6ZWRFbGVtZW50QWNjZXB0ZWQoKEN1c3RvbUNhdGVnb3J5KSBvYmplY3QsIGxpc3QpOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQotCS8qKgotCSAqIERpc3BsYXkgY29udHJpYnV0aW9uIHNlbGVjdGlvbiBkaWFsb2cgd2hpY2ggbGlzdHMgZWxlbWVudHMgYW5kIGl0J3MKLQkgKiBjb250cmlidXRvcnMuCi0JICovCi0JcHVibGljIENvbnRyaWJ1dGlvblNlbGVjdGlvbigpIHsKLQl9Ci0KLQkvKioKLQkgKiBJdCBzaG93cyBkaWFsb2cgYm94IGZvciBhbGwgdGhlIGNvbnRyaWJ1dG9ycy4gVXNlciBpcyBleHBlY3RlZCB0byBzZWxlY3QKLQkgKiBvbmUuCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiAJCQlFbGVtZW50IGZvciB3aGljaCBjb250cmlidXRvciBhcmUgc2hvd24KLQkgKiBAcmV0dXJuCi0JICogCQkJU2VsZWN0ZWQgY29udHJpYnV0b3IKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFNlbGVjdGVkQ29udHJpYnV0b3IoVmFyaWFiaWxpdHlFbGVtZW50IGVsZW1lbnQpIHsKLQkJZmlsdGVyRWxlbWVudExpc3QgPSBuZXcgSGFzaFNldCgpOwotCQkvLyBHZXQgdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbi4KLQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJLmdldEN1cnJlbnRNZXRob2RDb25maWd1cmF0aW9uKCk7Ci0KLQkJLy8gZ2V0IGxpc3Qgb2YgY29udHJpYnV0b3JzCi0JCUxpc3QgY29udHJpYnV0b3JzID0gQ29uZmlndXJhdGlvbkhlbHBlcgotCQkJCS5nZXRDb250cmlidXRvcnMoZWxlbWVudCwgY29uZmlnKTsKLQkJaWYgKChjb250cmlidXRvcnMgIT0gbnVsbCkgJiYgKCFjb250cmlidXRvcnMuaXNFbXB0eSgpKSkgewotCQkJLy8gY2xlYXIgdGhlIGFycmF5Ci0JCQlMaXN0IGVsZW1lbnRMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCQkvLyBhZGQgZWxlbWVudCBhbmQgaXQncyBjb250cmlidXRvcnMKLQkJCWVsZW1lbnRMaXN0LmFkZChlbGVtZW50KTsKLQkJCWVsZW1lbnRMaXN0LmFkZEFsbChjb250cmlidXRvcnMpOwotCQkJZmlsdGVyRWxlbWVudExpc3QuYWRkQWxsKGVsZW1lbnRMaXN0KTsKLQkJCWZvciAoSXRlcmF0b3IgaXRvciA9IGVsZW1lbnRMaXN0Lml0ZXJhdG9yKCk7IGl0b3IuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBlID0gaXRvci5uZXh0KCk7Ci0JCQkJTGlzdCBncm91cGluZ3MgPSBudWxsOwotCQkJCWlmIChlIGluc3RhbmNlb2YgRGlzY2lwbGluZSkgewotCQkJCQlncm91cGluZ3MgPSBBc3NvY2lhdGlvbkhlbHBlcgotCQkJCQkJCS5nZXREaXNjaXBsaW5lR3JvdXBzKChEaXNjaXBsaW5lKSBlKTsKLQotCQkJCX0KLQkJCQlpZiAoZSBpbnN0YW5jZW9mIFJvbGVTZXQpIHsKLQkJCQkJZ3JvdXBpbmdzID0gQXNzb2NpYXRpb25IZWxwZXIKLQkJCQkJCQkuZ2V0Um9sZVNldEdyb3VwcygoUm9sZVNldCkgZSk7Ci0JCQkJfQotCi0JCQkJaWYgKChncm91cGluZ3MgIT0gbnVsbCkgJiYgKCFncm91cGluZ3MuaXNFbXB0eSgpKSkKLQkJCQkJZmlsdGVyRWxlbWVudExpc3QuYWRkQWxsKGdyb3VwaW5ncyk7Ci0KLQkJCX0KLQotCQkJSUZpbHRlciBmaWx0ZXIgPSBuZXcgQ29udHJpYnV0aW9uRmlsdGVyKCk7Ci0JCQkvLyBJdGVtc0ZpbHRlckRpYWxvZyBkbGcgPSBuZXcgSXRlbXNGaWx0ZXJEaWFsb2coUGxhdGZvcm1VSQotCQkJLy8gLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldFNoZWxsKCksCi0JCQkvLyBmaWx0ZXIsIG51bGwsIEZpbHRlckNvbnN0YW50cy5DT05GSUdfQ09OVEVOVF9FTEVNRU5UKTsKLQkJCS8vIGRsZy5zZXRWaWV3ZXJTZWxlY3Rpb25TaW5nbGUodHJ1ZSk7Ci0JCQlTdHJpbmdbXSBzdHIgPSBuZXcgU3RyaW5nW10geyBGaWx0ZXJDb25zdGFudHMuQ09ORklHX0NPTlRFTlRfRUxFTUVOVCB9OwotCQkJQ29uZmlndXJhdGlvbkFkZFZpZXdzRGlhbG9nIGRsZyA9IG5ldyBDb25maWd1cmF0aW9uQWRkVmlld3NEaWFsb2coCi0JCQkJCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkKLQkJCQkJCQkuZ2V0U2hlbGwoKSk7Ci0JCQlkbGcuc2V0RmlsdGVyKGZpbHRlcik7Ci0JCQlkbGcuc2V0VGl0bGUoRmlsdGVyQ29uc3RhbnRzLkNPTkZJR19DT05URU5UX0VMRU1FTlQpOwotCQkJZGxnLnNldFZpZXdlclNlbGVjdGlvblNpbmdsZSh0cnVlKTsKLQkJCWRsZy5zZXRUeXBlcyhzdHIpOwotCQkJZGxnLnNldElucHV0KFVtYVV0aWwuZ2V0TWV0aG9kTGlicmFyeSgoRU9iamVjdCkgZWxlbWVudCkpOwotCQkJZGxnLnNldENvbnRlbnRQcm92aWRlcihuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoCi0JCQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkJLmdldEl0ZW1zRmlsdGVyX0FkYXB0ZXJGYWN0b3J5KGZpbHRlcikpLAotCQkJCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkJCS5nZXRJdGVtc0ZpbHRlcl9Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpOwotCQkJZGxnLnNldEJsb2NrT25PcGVuKHRydWUpOwotCi0JCQlTdHJpbmcgdGl0bGUgPSBNZXNzYWdlRm9ybWF0Ci0JCQkJCS5mb3JtYXQoCi0JCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuQ29udHJpYnV0aW9uU2VsZWN0aW9uX2ZpbHRlcmRpYWxvZ190aXRsZSwgCi0JCQkJCQkJbmV3IFN0cmluZ1tdIHsgZWxlbWVudC5nZXROYW1lKCkgfSk7Ci0KLQkJCWRsZy5zZXRUaXRsZSh0aXRsZSk7Ci0JCQlkbGcuc2V0QmxvY2tPbk9wZW4odHJ1ZSk7Ci0JCQlkbGcub3BlbigpOwotCi0JCQlMaXN0IHJlc3VsdCA9IGRsZy5nZXRTZWxlY3RlZEl0ZW1zKCk7Ci0JCQlpZiAoKHJlc3VsdCA9PSBudWxsKSB8fCAocmVzdWx0LmlzRW1wdHkoKSkpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQllbHNlCi0JCQkJcmV0dXJuIHJlc3VsdC5nZXQoMCk7Ci0JCX0KLQkJcmV0dXJuIGVsZW1lbnQ7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2RpYWxvZ3MvRGlhbG9nSGVscGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2RpYWxvZ3MvRGlhbG9nSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhOTFkNDAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9kaWFsb2dzL0RpYWxvZ0hlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZGlhbG9nczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZmlsdGVycy5Qcm9jZXNzQWN0aXZpdHlGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5maWx0ZXJzLlByb2Nlc3NSb2xlRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZmlsdGVycy5WYXJpYWJpbGl0eVByb2Nlc3NSb2xlRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZmlsdGVycy5WYXJpYWJpbGl0eVByb2Nlc3NUYXNrRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZmlsdGVycy5WYXJpYWJpbGl0eVByb2Nlc3NXb3JrUHJvZHVjdEZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLkZpbHRlckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRlYW1Qcm9maWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci0KLQotLyoqCi0gKiBIZWxwZXIgY2xhc3MgdG8gY29sbGVjdCBpbnB1dCBkYXRhIGZyb20gdXNlcnMgdXNpbmcgZGlhbG9nIGJveGVzCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRGlhbG9nSGVscGVyIHsKLQotCXB1YmxpYyBzdGF0aWMgTGlzdCBzZWxlY3RFbGVtZW50c0ZvcihCcmVha2Rvd25FbGVtZW50IGUsIElGaWx0ZXIgZmlsdGVyLAotCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcsIFN0cmluZyB0YWJOYW1lKSB7Ci0JCUl0ZW1zRmlsdGVyRGlhbG9nIGZkID0gbmV3IEl0ZW1zRmlsdGVyRGlhbG9nKFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkKLQkJCQkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0U2hlbGwoKSwgZmlsdGVyLCB0YWJOYW1lLCBudWxsLAotCQkJCWNvbmZpZyk7Ci0JCWZkLnNldEJsb2NrT25PcGVuKHRydWUpOwotCQlmZC5zZXRWaWV3ZXJTZWxlY3Rpb25TaW5nbGUoZmFsc2UpOwotCQlmZC5zZXRUaXRsZSh0YWJOYW1lKTsKLQkJZmQub3BlbigpOwotCQlyZXR1cm4gZmQuZ2V0U2VsZWN0ZWRJdGVtcygpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgTGlzdCBzZWxlY3RUYXNrc0ZvcihBY3Rpdml0eSBhY3QsIE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0JCVN0cmluZyB0YWJOYW1lID0gRmlsdGVyQ29uc3RhbnRzLlRBU0tTOwotCQlJRmlsdGVyIGZpbHRlciA9IG5ldyBWYXJpYWJpbGl0eVByb2Nlc3NUYXNrRmlsdGVyKGNvbmZpZywgbnVsbCwKLQkJCQlGaWx0ZXJDb25zdGFudHMuVEFTS1MsIGFjdCk7Ci0KLQkJcmV0dXJuIHNlbGVjdEVsZW1lbnRzRm9yKGFjdCwgZmlsdGVyLCBjb25maWcsIHRhYk5hbWUpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgTGlzdCBzZWxlY3RFbGVtZW50c0ZvcihPYmplY3Qgb2JqZWN0LAotCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcsIEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJaWYgKGFkYXB0ZXJGYWN0b3J5ID09IFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCS5nZXRXQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKSB7Ci0JCQkJcmV0dXJuIHNlbGVjdFRhc2tzRm9yKChBY3Rpdml0eSkgb2JqZWN0LCBjb25maWcpOwotCQkJfSBlbHNlIGlmIChhZGFwdGVyRmFjdG9yeSA9PSBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkuZ2V0T0JTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSkgewotCQkJCVN0cmluZyB0YWJOYW1lID0gRmlsdGVyQ29uc3RhbnRzLlJPTEVTOwotCQkJCUlGaWx0ZXIgZmlsdGVyID0gbmV3IFZhcmlhYmlsaXR5UHJvY2Vzc1JvbGVGaWx0ZXIoY29uZmlnLCBudWxsLAotCQkJCQkJRmlsdGVyQ29uc3RhbnRzLlJPTEVTLCAoQWN0aXZpdHkpIG9iamVjdCk7Ci0JCQkJcmV0dXJuIHNlbGVjdEVsZW1lbnRzRm9yKChCcmVha2Rvd25FbGVtZW50KSBvYmplY3QsIGZpbHRlciwKLQkJCQkJCWNvbmZpZywgdGFiTmFtZSk7Ci0JCQl9IGVsc2UgaWYgKGFkYXB0ZXJGYWN0b3J5ID09IFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCS5nZXRQQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKSB7Ci0JCQkJU3RyaW5nIHRhYk5hbWUgPSBGaWx0ZXJDb25zdGFudHMuV09SS1BST0RVQ1RTOwotCQkJCUlGaWx0ZXIgZmlsdGVyID0gbmV3IFZhcmlhYmlsaXR5UHJvY2Vzc1dvcmtQcm9kdWN0RmlsdGVyKAotCQkJCQkJY29uZmlnLCBudWxsLCBGaWx0ZXJDb25zdGFudHMuV09SS1BST0RVQ1RTLAotCQkJCQkJKEFjdGl2aXR5KSBvYmplY3QpOwotCQkJCXJldHVybiBzZWxlY3RFbGVtZW50c0ZvcigoQnJlYWtkb3duRWxlbWVudCkgb2JqZWN0LCBmaWx0ZXIsCi0JCQkJCQljb25maWcsIHRhYk5hbWUpOwotCQkJfQotCQl9Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBUZWFtUHJvZmlsZSkgewotCQkJaWYgKGFkYXB0ZXJGYWN0b3J5ID09IFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCS5nZXRPQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKSB7Ci0JCQkJU3RyaW5nIHRhYk5hbWUgPSBGaWx0ZXJDb25zdGFudHMuUk9MRVM7Ci0JCQkJSUZpbHRlciBmaWx0ZXIgPSBuZXcgUHJvY2Vzc1JvbGVGaWx0ZXIoY29uZmlnLCBudWxsLAotCQkJCQkJRmlsdGVyQ29uc3RhbnRzLlJPTEVTKTsKLQkJCQlyZXR1cm4gc2VsZWN0RWxlbWVudHNGb3IoKEJyZWFrZG93bkVsZW1lbnQpIG9iamVjdCwgZmlsdGVyLAotCQkJCQkJY29uZmlnLCB0YWJOYW1lKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgTGlzdCBzZWxlY3RBY3Rpdml0aWVzRm9yKEFjdGl2aXR5IGFjdCwKLQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnLCBpbnQgY29tbWFuZCkgewotCQkvLyByZXR1cm4gbnVsbDsKLQkJU3RyaW5nIHRhYk5hbWUgPSBGaWx0ZXJDb25zdGFudHMuUFJPQ0VTU0VTOwotCQlJRmlsdGVyIGZpbHRlciA9IG5ldyBQcm9jZXNzQWN0aXZpdHlGaWx0ZXIoY29uZmlnLCBudWxsLAotCQkJCUZpbHRlckNvbnN0YW50cy5QUk9DRVNTRVMsIGFjdCwgY29tbWFuZCk7Ci0JCUxpc3Qgc2VsZWN0aW9uID0gc2VsZWN0RWxlbWVudHNGb3IoYWN0LCBmaWx0ZXIsIGNvbmZpZywgdGFiTmFtZSk7Ci0JCUFycmF5TGlzdCBhY3Rpdml0aWVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBzZWxlY3Rpb24uaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZWxlbWVudCA9IGl0ZXIubmV4dCgpOwotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCWFjdGl2aXRpZXMuYWRkKGVsZW1lbnQpOwotCQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkgewotCQkJCVByb2Nlc3MgcHJvYyA9ICgoUHJvY2Vzc0NvbXBvbmVudCkgZWxlbWVudCkuZ2V0UHJvY2VzcygpOwotCQkJCWlmIChwcm9jICE9IG51bGwpIHsKLQkJCQkJYWN0aXZpdGllcy5hZGQocHJvYyk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBhY3Rpdml0aWVzOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZGlhbG9ncy9GaWx0ZXJTb3J0ZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZGlhbG9ncy9GaWx0ZXJTb3J0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjIyMTNkNy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2RpYWxvZ3MvRmlsdGVyU29ydGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5kaWFsb2dzOwotCi1pbXBvcnQgamF2YS50ZXh0LkNvbGxhdG9yOwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ29udGVudFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklCYXNlTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyU29ydGVyOwotCi0KLQotLyoqCi0gKiBBIHtAbGluayBJdGVtc0ZpbHRlckRpYWxvZ30gZGlhbG9nIHZpZXdlciBzb3J0ZXIgdG8gb3JkZXIgdGhlIGRpc3BsYXkgZm9yIGNlcnRhaW4gZWxlbWVudCBhbmQgcGFja2FnZXMuCi0gKiAKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRmlsdGVyU29ydGVyIGV4dGVuZHMgVmlld2VyU29ydGVyIHsKLQotCXB1YmxpYyBGaWx0ZXJTb3J0ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIGludCBjYXRlZ29yeShPYmplY3QgZWxlbWVudCkgewotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIENvbnRlbnRQYWNrYWdlKQotCQkJcmV0dXJuIDA7Ci0JCWVsc2UKLQkJCXJldHVybiAxOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBjb2xsYXRvcgotCSAqLwotCXB1YmxpYyBGaWx0ZXJTb3J0ZXIoQ29sbGF0b3IgY29sbGF0b3IpIHsKLQkJc3VwZXIoY29sbGF0b3IpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXJDb21wYXJhdG9yI2NvbXBhcmUob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXIsIGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIGludCBjb21wYXJlKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBlMSwgT2JqZWN0IGUyKSB7Ci0KLQkJaWYgKCEoZTEgaW5zdGFuY2VvZiBDb250ZW50UGFja2FnZSkgfHwgIShlMiBpbnN0YW5jZW9mIENvbnRlbnRQYWNrYWdlKSkgewotCQkJaW50IGNhdDEgPSBjYXRlZ29yeShlMSk7Ci0JCQlpbnQgY2F0MiA9IGNhdGVnb3J5KGUyKTsKLQotCQkJaWYgKGNhdDEgIT0gY2F0MikKLQkJCQlyZXR1cm4gY2F0MSAtIGNhdDI7Ci0JCX0KLQotCQlpZiAoZTEgaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4gJiYgZTIgaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pIHsKLQkJCXJldHVybiAwOwotCQl9Ci0KLQkJU3RyaW5nIG5hbWUxOwotCQlTdHJpbmcgbmFtZTI7Ci0KLQkJaWYgKHZpZXdlciA9PSBudWxsIHx8ICEodmlld2VyIGluc3RhbmNlb2YgQ29udGVudFZpZXdlcikpIHsKLQkJCW5hbWUxID0gZTEudG9TdHJpbmcoKTsKLQkJCW5hbWUyID0gZTIudG9TdHJpbmcoKTsKLQkJfSBlbHNlIHsKLQkJCUlCYXNlTGFiZWxQcm92aWRlciBwcm92ID0gKChDb250ZW50Vmlld2VyKSB2aWV3ZXIpCi0JCQkJCS5nZXRMYWJlbFByb3ZpZGVyKCk7Ci0JCQlpZiAocHJvdiBpbnN0YW5jZW9mIElMYWJlbFByb3ZpZGVyKSB7Ci0JCQkJSUxhYmVsUHJvdmlkZXIgbHByb3YgPSAoSUxhYmVsUHJvdmlkZXIpIHByb3Y7Ci0JCQkJbmFtZTEgPSBscHJvdi5nZXRUZXh0KGUxKTsKLQkJCQluYW1lMiA9IGxwcm92LmdldFRleHQoZTIpOwotCQkJfSBlbHNlIHsKLQkJCQluYW1lMSA9IGUxLnRvU3RyaW5nKCk7Ci0JCQkJbmFtZTIgPSBlMi50b1N0cmluZygpOwotCQkJfQotCQl9Ci0JCWlmIChuYW1lMSA9PSBudWxsKQotCQkJbmFtZTEgPSAiIjsvLyROT04tTkxTLTEkCi0JCWlmIChuYW1lMiA9PSBudWxsKQotCQkJbmFtZTIgPSAiIjsvLyROT04tTkxTLTEkCi0JCXJldHVybiBjb2xsYXRvci5jb21wYXJlKG5hbWUxLCBuYW1lMik7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlckNvbXBhcmF0b3Ijc29ydChvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlciwgamF2YS5sYW5nLk9iamVjdFtdKQotCSAqLwotCXB1YmxpYyB2b2lkIHNvcnQoZmluYWwgVmlld2VyIHZpZXdlciwgT2JqZWN0W10gZWxlbWVudHMpIHsKLQkJQXJyYXlzLnNvcnQoZWxlbWVudHMsIG5ldyBDb21wYXJhdG9yKCkgewotCQkJcHVibGljIGludCBjb21wYXJlKE9iamVjdCBhLCBPYmplY3QgYikgewotCQkJCXJldHVybiBGaWx0ZXJTb3J0ZXIudGhpcy5jb21wYXJlKHZpZXdlciwgYSwgYik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9kaWFsb2dzL0ZpbHRlclNvcnRlckZvckFsbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9kaWFsb2dzL0ZpbHRlclNvcnRlckZvckFsbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NGEyYTY5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZGlhbG9ncy9GaWx0ZXJTb3J0ZXJGb3JBbGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmRpYWxvZ3M7Ci0KLWltcG9ydCBqYXZhLnRleHQuQ29sbGF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZmlsdGVycy5BbGxGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ29udGVudFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklCYXNlTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyU29ydGVyOwotCi0KLS8qKgotICogQSBGaWx0ZXIgc29ydGVyIGZvciB7QGxpbmsgSXRlbXNGaWx0ZXJEaWFsb2d9IHVzaW5nIHtAbGluayBBbGxGaWx0ZXJ9Ci0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEZpbHRlclNvcnRlckZvckFsbCBleHRlbmRzIFZpZXdlclNvcnRlciB7Ci0KLQlwdWJsaWMgRmlsdGVyU29ydGVyRm9yQWxsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBjb2xsYXRvcgotCSAqLwotCXB1YmxpYyBGaWx0ZXJTb3J0ZXJGb3JBbGwoQ29sbGF0b3IgY29sbGF0b3IpIHsKLQkJc3VwZXIoY29sbGF0b3IpOwotCX0KLQotCXB1YmxpYyBpbnQgY2F0ZWdvcnkoT2JqZWN0IGVsZW1lbnQpIHsKLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBDb250ZW50UGFja2FnZSkKLQkJCXJldHVybiAwOwotCQllbHNlCi0JCQlyZXR1cm4gMTsKLQl9Ci0KLQlwdWJsaWMgaW50IGNvbXBhcmUoVmlld2VyIHZpZXdlciwgT2JqZWN0IGUxLCBPYmplY3QgZTIpIHsKLQotCQlpZiAoIShlMSBpbnN0YW5jZW9mIENvbnRlbnRQYWNrYWdlKSB8fCAhKGUyIGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UpKSB7Ci0JCQlpbnQgY2F0MSA9IGNhdGVnb3J5KGUxKTsKLQkJCWludCBjYXQyID0gY2F0ZWdvcnkoZTIpOwotCi0JCQlpZiAoY2F0MSAhPSBjYXQyKQotCQkJCXJldHVybiBjYXQxIC0gY2F0MjsKLQkJfQotCi0JCWlmIChlMSBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbiAmJiBlMiBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikgewotCQkJcmV0dXJuIDA7Ci0JCX0KLQkJaWYgKCEoZTEgaW5zdGFuY2VvZiBDb250ZW50RWxlbWVudCkgfHwgIShlMiBpbnN0YW5jZW9mIENvbnRlbnRFbGVtZW50KSkgewotCQkJcmV0dXJuIDA7Ci0JCX0KLQotCQlTdHJpbmcgbmFtZTE7Ci0JCVN0cmluZyBuYW1lMjsKLQotCQlpZiAodmlld2VyID09IG51bGwgfHwgISh2aWV3ZXIgaW5zdGFuY2VvZiBDb250ZW50Vmlld2VyKSkgewotCQkJbmFtZTEgPSBlMS50b1N0cmluZygpOwotCQkJbmFtZTIgPSBlMi50b1N0cmluZygpOwotCQl9IGVsc2UgewotCQkJSUJhc2VMYWJlbFByb3ZpZGVyIHByb3YgPSAoKENvbnRlbnRWaWV3ZXIpIHZpZXdlcikKLQkJCQkJLmdldExhYmVsUHJvdmlkZXIoKTsKLQkJCWlmIChwcm92IGluc3RhbmNlb2YgSUxhYmVsUHJvdmlkZXIpIHsKLQkJCQlJTGFiZWxQcm92aWRlciBscHJvdiA9IChJTGFiZWxQcm92aWRlcikgcHJvdjsKLQkJCQluYW1lMSA9IGxwcm92LmdldFRleHQoZTEpOwotCQkJCW5hbWUyID0gbHByb3YuZ2V0VGV4dChlMik7Ci0JCQl9IGVsc2UgewotCQkJCW5hbWUxID0gZTEudG9TdHJpbmcoKTsKLQkJCQluYW1lMiA9IGUyLnRvU3RyaW5nKCk7Ci0JCQl9Ci0JCX0KLQkJaWYgKG5hbWUxID09IG51bGwpCi0JCQluYW1lMSA9ICIiOy8vJE5PTi1OTFMtMSQKLQkJaWYgKG5hbWUyID09IG51bGwpCi0JCQluYW1lMiA9ICIiOy8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIGNvbGxhdG9yLmNvbXBhcmUobmFtZTEsIG5hbWUyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzb3J0KGZpbmFsIFZpZXdlciB2aWV3ZXIsIE9iamVjdFtdIGVsZW1lbnRzKSB7Ci0JCUFycmF5cy5zb3J0KGVsZW1lbnRzLCBuZXcgQ29tcGFyYXRvcigpIHsKLQkJCXB1YmxpYyBpbnQgY29tcGFyZShPYmplY3QgYSwgT2JqZWN0IGIpIHsKLQkJCQlyZXR1cm4gRmlsdGVyU29ydGVyRm9yQWxsLnRoaXMuY29tcGFyZSh2aWV3ZXIsIGEsIGIpOwotCQkJfQotCQl9KTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2RpYWxvZ3MvSXRlbXNGaWx0ZXJEaWFsb2cuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZGlhbG9ncy9JdGVtc0ZpbHRlckRpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMjFmZGIwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZGlhbG9ncy9JdGVtc0ZpbHRlckRpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEzOSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmRpYWxvZ3M7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWRBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZmlsdGVycy5EZXNjcmlwdG9yQ29uZmlndXJhdGlvbkZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZpbHRlcnMuRXhQcm9jZXNzQXV0aG9yaW5nQ29uZmlndXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudXRpbC5BdXRob3JpbmdBY2Nlc3NpYmxlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuRmlsdGVyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuRmlsdGVySGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuSUNhdGVnb3J5RmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuSVByb2Nlc3NGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5uYXZpZ2F0b3IuTWV0aG9kUGx1Z2luSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CcmVha2Rvd25FbGVtZW50SXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuTWV0aG9kRWxlbWVudFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5MaWJyYXJ5VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5OYW1lZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5VbWFVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nU2V0dGluZ3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ1NldHRpbmdzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuRG91YmxlQ2xpY2tFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklEb3VibGVDbGlja0xpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc2VhcmNoLmludGVybmFsLmNvcmUudGV4dC5QYXR0ZXJuQ29uc3RydWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVHJlZUl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLQotLyoqCi0gKiBGaWx0ZXIgRGlhbG9nIC0gYWxsb3cgdGhlIHVzZXIgdG8gZmlsdGVyIHRoZSBjb250ZW50IGVsZW1lbnQsIGNvbnRlbnQKLSAqIGNhdGVnb3JpZXMsIGN1c3RvbSBjYXRlZ29yaWVzLCBBbGwgdHlwZXMgb2YgY29udGVudGVsZW1lbnRzIGJhc2VkIG9uIGxvY2F0aW9uIG9mIHRoZSB1c2Ugb2YgdGhlIGZpbHRlcgotICogZGlhbG9nLgotICogCi0gKiBAYXV0aG9yIExva2FuYXRoIEphZ2dhCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqLwotcHVibGljIGNsYXNzIEl0ZW1zRmlsdGVyRGlhbG9nIGV4dGVuZHMgRGlhbG9nIGltcGxlbWVudHMKLQkJSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciwgSURvdWJsZUNsaWNrTGlzdGVuZXIgewotCi0JcHJvdGVjdGVkIEJ1dHRvbiBva0J1dHRvbiwgY2FuY2VsQnV0dG9uOwotCi0JcHJvdGVjdGVkIFRleHQgY3RybF9wYXR0ZXJuLCBjdHJsX2JyaWVmX2Rlc2M7Ci0KLQlwcml2YXRlIFN0cmluZyBwYXR0ZXJuLCBmaWx0ZXJUeXBlU3RyOwotCi0JcHJvdGVjdGVkIENvbWJvIGZpbHRlclR5cGU7Ci0KLQlwcml2YXRlIFN0cmluZyBkaWFsb2dUaXRsZSwgdGFiU3RyOwotCi0JcHJpdmF0ZSBPYmplY3QgY29udGVudEVsZW1lbnQ7Ci0KLQlwcml2YXRlIEFycmF5TGlzdCBzZWxlY3RlZExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQlwcml2YXRlIGJvb2xlYW4gdmlld2VyU2VsZWN0aW9uU2luZ2xlID0gZmFsc2U7Ci0JcHJpdmF0ZSBTdHJpbmcgdmlld2VyTGFiZWwgPSBudWxsOwotCQotCS8qCi0JICogVHJlZXZpZXdlciBmb3IgQ29udGVudEVsZW1lbnRzIHRvIGRpc3BsYXkuCi0JICovCi0JcHJpdmF0ZSBUcmVlVmlld2VyIHRyZWVWaWV3ZXI7Ci0KLQlwcm90ZWN0ZWQgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIgY29udGVudFByb3ZpZGVyOwotCi0JcHJvdGVjdGVkIElMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIgPSBuZXcgQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyKAotCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJLmdldE5hdmlnYXRvclZpZXdfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKSB7Ci0JCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCQkvLyByZXR1cm4gc3VwZXIuZ2V0VGV4dChvYmplY3QpOwotCQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIFZhcmlhYmlsaXR5RWxlbWVudCkgewotCQkJCXJldHVybiBUbmdVdGlsLmdldExhYmVsKChWYXJpYWJpbGl0eUVsZW1lbnQpIG9iamVjdCwgIiIsIHRydWUpOyAvLyROT04tTkxTLTEkCi0JCQl9IGVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikgewotCQkJCU1ldGhvZFBsdWdpbkl0ZW1Qcm92aWRlciBtZXRob2RQbHVnaW5JdGVtUHJvdmlkZXIgPSAoTWV0aG9kUGx1Z2luSXRlbVByb3ZpZGVyKVRuZ1V0aWwuZ2V0QWRhcHRlcigoTWV0aG9kUGx1Z2luKW9iamVjdCwgTWV0aG9kUGx1Z2luSXRlbVByb3ZpZGVyLmNsYXNzKTsKLQkJCQlpZiAobWV0aG9kUGx1Z2luSXRlbVByb3ZpZGVyICE9IG51bGwpIHsKLQkJCQkJcmV0dXJuIG1ldGhvZFBsdWdpbkl0ZW1Qcm92aWRlci5nZXRGdWxsTmFtZShvYmplY3QpOwotCQkJCX0KLQkJCX0gCi0JCQlyZXR1cm4gc3VwZXIuZ2V0VGV4dChvYmplY3QpOwotCQl9Ci0JCQotCQkKLQkJcHVibGljIFN0cmluZyBnZXRDb2x1bW5UZXh0KE9iamVjdCBvYmplY3QsIGludCBpbmRleCkgewotCQkJcmV0dXJuIGdldFRleHQob2JqZWN0KTsKLQkJfQotCQkKLQkJcHVibGljIEltYWdlIGdldENvbHVtbkltYWdlKE9iamVjdCBvYmplY3QsIGludCBpbmRleCkgewotCQkJcmV0dXJuIHN1cGVyLmdldEltYWdlKG9iamVjdCk7Ci0JCX0KLQl9OwotCi0JcHJpdmF0ZSBBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeTsKLQlwcml2YXRlIENvbXBvc2VkQWRhcHRlckZhY3RvcnkgY29tcG9zZWRBZGFwdGVyRmFjdG9yeTsKLQotCS8qCi0JICogRGlhbG9nIEF0dHJpYnV0ZXMKLQkgKi8KLQkvLyBwcml2YXRlIGJvb2xlYW4gYW55Q2hpbGRzID0gdHJ1ZTsKLQlwcml2YXRlIExpc3QgYWxyZWFkeVNlbGVjdGVkTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQotCXByaXZhdGUgSUZpbHRlciBmaWx0ZXI7Ci0KLQlQYXR0ZXJuIHJlZ2V4UGF0dGVybjsKLQotCS8vIHByaXZhdGUgTWV0aG9kQ29uZmlndXJhdGlvbiBtZXRob2RDb25maWd1cmF0aW9uOwotCXByb3RlY3RlZCBGaWx0ZXJIZWxwZXIgaGVscGVyOwotCi0JcHJpdmF0ZSBTdHJpbmcgU1RPUkVfRVhQQU5ERURfTEVWRUxfSUQgPSAiLkxFVkVMX0lEIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgU3RyaW5nIFBBVFRFUk5fSUQgPSAiLlBhdHRlcm4iOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBTdHJpbmcgVFlQRV9JRCA9ICIuVHlwZSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgU3RyaW5nIERJQUxPR19OQU1FOwotCi0JcHJpdmF0ZSBCdXR0b24gZXhwYW5kQnV0dG9uOwotCi0JcHJpdmF0ZSBCdXR0b24gY29sbGFwc2VCdXR0b247Ci0KLQlwcml2YXRlIE9iamVjdCBpbnB1dDsKLQotCXByaXZhdGUgU3RyaW5nW10gdHlwZXM7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RzIGEgbmV3IEZpbHRlckRpYWxvZy4gVGhpcyBjb25zdHJ1Y3RvciB3aWxsIHVzZSBmaWx0ZXIgYmFzZWQgb24KLQkgKiB0YWJTdHIsIGZpbHRlcnMgb3V0IHRoZSBsaXN0IG9mIGVsZW1lbnRzIGJhc2VkIG9uIGFscmVhZHkgZXhpc3RpbmcKLQkgKiBzZWxlY3RlZCBlbGVtZW50IGluIHRoZSBzZWxlY3RlZCB0YWJsZS4gSW5pdGlhbGl6ZXMgdGhlIENvbnRlbnRQcm92aWRlcgotCSAqIGZvciB0aGUgdHJlZXZpZXdlci4KLQkgKiAKLQkgKi8KLQlwdWJsaWMgSXRlbXNGaWx0ZXJEaWFsb2coU2hlbGwgcGFyZW50U2hlbGwsIE9iamVjdCBjb250ZW50RWxlbWVudCwKLQkJCVN0cmluZyB0YWJTdHIsIExpc3QgYWxyZWFkeUV4aXN0cykgewotCQlzdXBlcihwYXJlbnRTaGVsbCk7Ci0JCXRoaXMuY29udGVudEVsZW1lbnQgPSBjb250ZW50RWxlbWVudDsKLQkJdGhpcy50YWJTdHIgPSB0YWJTdHI7Ci0JCXRoaXMuZmlsdGVyID0gbnVsbDsKLQkJdGhpcy5hbHJlYWR5U2VsZWN0ZWRMaXN0ID0gYWxyZWFkeUV4aXN0czsKLQkJaGVscGVyID0gbmV3IEZpbHRlckhlbHBlcihjb250ZW50RWxlbWVudCwgdGFiU3RyLCBudWxsLCBudWxsLAotCQkJCXRoaXMuYWxyZWFkeVNlbGVjdGVkTGlzdCk7Ci0JCWluaXRQcm92aWRlckZvclRhYnMoKTsKLQl9Ci0KLQlwdWJsaWMgSXRlbXNGaWx0ZXJEaWFsb2coU2hlbGwgcGFyZW50U2hlbGwsIElGaWx0ZXIgZmlsdGVyLCBTdHJpbmcgdGFiU3RyLAotCQkJTGlzdCBhbHJlYWR5RXhpc3RzLCBPYmplY3QgaW5wdXQpIHsKLQkJdGhpcyhwYXJlbnRTaGVsbCwgZmlsdGVyLCBudWxsLCB0YWJTdHIsIGFscmVhZHlFeGlzdHMpOwotCQl0aGlzLmlucHV0ID0gaW5wdXQ7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0cyBhIG5ldyBGaWx0ZXJEaWFsb2cuIFRoaXMgY29uc3RydWN0b3Igd2lsbCB1c2UgcGFzc2VkIGZpbHRlci4KLQkgKiB0YWJTdHIgaXMgdXNlZCBmb3IgdGhlIHNlYXJjaHR5cGUgb25seS4gSW5pdGlhbGl6ZXMgdGhlIENvbnRlbnRQcm92aWRlcgotCSAqIGZvciB0aGUgdHJlZXZpZXdlci4KLQkgKiAKLQkgKi8KLQlwdWJsaWMgSXRlbXNGaWx0ZXJEaWFsb2coU2hlbGwgcGFyZW50U2hlbGwsIElGaWx0ZXIgZmlsdGVyLAotCQkJT2JqZWN0IGNvbnRlbnRFbGVtZW50LCBTdHJpbmcgdGFiU3RyKSB7Ci0JCXN1cGVyKHBhcmVudFNoZWxsKTsKLQkJdGhpcy5maWx0ZXIgPSBmaWx0ZXI7Ci0JCXRoaXMudGFiU3RyID0gdGFiU3RyOwotCi0JCWhlbHBlciA9IG5ldyBGaWx0ZXJIZWxwZXIoY29udGVudEVsZW1lbnQsIHRhYlN0ciwgbnVsbCwgbnVsbCwgbnVsbCk7Ci0JCWluaXRQcm92aWRlckZvclRhYnMoKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RzIGEgbmV3IEZpbHRlckRpYWxvZy4gVGhpcyBjb25zdHJ1Y3RvciB3aWxsIHVzZSBwYXNzZWQgZmlsdGVyLgotCSAqIHRhYlN0ciBpcyB1c2VkIGZvciB0aGUgc2VhcmNodHlwZSBvbmx5LiBJbml0aWFsaXplcyB0aGUgQ29udGVudFByb3ZpZGVyCi0JICogZm9yIHRoZSB0cmVldmlld2VyLgotCSAqIAotCSAqLwotCXB1YmxpYyBJdGVtc0ZpbHRlckRpYWxvZyhTaGVsbCBwYXJlbnRTaGVsbCwgSUZpbHRlciBmaWx0ZXIsCi0JCQlPYmplY3QgY29udGVudEVsZW1lbnQsIFN0cmluZyB0YWJTdHIsIExpc3QgYWxyZWFkeUV4aXN0cykgewotCQlzdXBlcihwYXJlbnRTaGVsbCk7Ci0JCXRoaXMuZmlsdGVyID0gZmlsdGVyOwotCQl0aGlzLnRhYlN0ciA9IHRhYlN0cjsKLQkJdGhpcy5hbHJlYWR5U2VsZWN0ZWRMaXN0ID0gYWxyZWFkeUV4aXN0czsKLQkJaGVscGVyID0gbmV3IEZpbHRlckhlbHBlcihjb250ZW50RWxlbWVudCwgdGFiU3RyLCBudWxsLCBudWxsLAotCQkJCWFscmVhZHlFeGlzdHMpOwotCQl0aGlzLmNvbnRlbnRFbGVtZW50ID0gY29udGVudEVsZW1lbnQ7Ci0JCWluaXRQcm92aWRlckZvclRhYnMoKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RzIGEgbmV3IEZpbHRlckRpYWxvZy4gT25seSBmb3IgbWV0aG9kY29uZmlndXJhdGlvbi4gVGhpcwotCSAqIGNvbnN0cnVjdG9yIHdpbGwgdXNlIHBhc3NlZCBmaWx0ZXIuIEluaXRpYWxpemVzIHRoZSBDb250ZW50UHJvdmlkZXIgZm9yCi0JICogdGhlIHRyZWV2aWV3ZXIuCi0JICogCi0JICovCi0JLy8gcHVibGljIEl0ZW1zRmlsdGVyRGlhbG9nKFNoZWxsIHBhcmVudFNoZWxsLCBPYmplY3QgY29udGVudEVsZW1lbnQsCi0JLy8gTWV0aG9kQ29uZmlndXJhdGlvbiBtZXRob2RDb25maWd1cmF0aW9uLCBTdHJpbmcgdGFiU3RyKSB7Ci0JLy8gc3VwZXIocGFyZW50U2hlbGwpOwotCS8vIHRoaXMuY29udGVudEVsZW1lbnQgPSBjb250ZW50RWxlbWVudDsKLQkvLyB0aGlzLnRhYlN0ciA9IHRhYlN0cjsKLQkvLyB0aGlzLmZpbHRlciA9IG51bGw7Ci0JLy8gdGhpcy5tZXRob2RDb25maWd1cmF0aW9uID0gbWV0aG9kQ29uZmlndXJhdGlvbjsKLQkvLyBoZWxwZXIgPSBuZXcgRmlsdGVySGVscGVyKGNvbnRlbnRFbGVtZW50LCB0YWJTdHIsIG51bGwsIG51bGwsIG51bGwpOwotCS8vIGluaXRQcm92aWRlckZvclRhYnMoKTsKLQkvLyB9Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RvciBpcyB2ZXJ5IGdlbmVyaWMsIGluIG9yZGVyIHRvIGluaXRpYWxpemUgZmlsdGVyLCBpbnB1dAotCSAqIGFuZCBjb250ZW50cHJvdmlkZXIgc2hvdWxkIGJlIGhhbmRsZWQgZXhwbGljaXRseSBieSBjYWxsaW5nIGJlbG93IG1ldGhvZC4KLQkgKiBzZXRGaWx0ZXIoSUZpbHRlcikgc2V0SW5wdXQoT2JqZWN0KQotCSAqIHNldENvbnRlbnRQcm92aWRlcihJU3RydWN0dXJlZFByb3ZpZGVyKQotCSAqIAotCSAqLwotCXB1YmxpYyBJdGVtc0ZpbHRlckRpYWxvZyhTaGVsbCBwYXJlbnRTaGVsbCkgewotCQlzdXBlcihwYXJlbnRTaGVsbCk7Ci0JCWhlbHBlciA9IG5ldyBGaWx0ZXJIZWxwZXIobnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGlmIGEgYnV0dG9uIGhhcyBiZWVuIHByZXNzZWQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYnV0dG9uUHJlc3NlZChpbnQgYnV0dG9uSWQpIHsKLQkJaWYgKGJ1dHRvbklkID09IElEaWFsb2dDb25zdGFudHMuT0tfSUQpCi0JCQlzYXZlVmFsdWVzKCk7Ci0JCXN1cGVyLmJ1dHRvblByZXNzZWQoYnV0dG9uSWQpOwotCQlpZihjb21wb3NlZEFkYXB0ZXJGYWN0b3J5ICE9IG51bGwpewotCQkJY29tcG9zZWRBZGFwdGVyRmFjdG9yeS5kaXNwb3NlKCk7Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIE5vdGlmaWVzIHRoYXQgdGhlIGNhbmNlbCBidXR0b24gb2YgdGhpcyBkaWFsb2cgaGFzIGJlZW4gcHJlc3NlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjYW5jZWxQcmVzc2VkKCkgewotCSAgICBpZiAodHJlZUpvYiAhPSBudWxsKSB7Ci0JICAgIAl0cmVlSm9iLmNhbmNlbCgpOwotCSAgICB9Ci0JCXN1cGVyLmNhbmNlbFByZXNzZWQoKTsKLQkJaWYoY29tcG9zZWRBZGFwdGVyRmFjdG9yeSAhPSBudWxsKXsKLQkJCWNvbXBvc2VkQWRhcHRlckZhY3RvcnkuZGlzcG9zZSgpOwotCQl9Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIG9rUHJlc3NlZCgpIHsKLQkgICAgaWYgKHRyZWVKb2IgIT0gbnVsbCkgewotCSAgICAJdHJlZUpvYi5jYW5jZWwoKTsKLQkgICAgfQotCQlzdXBlci5va1ByZXNzZWQoKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGl0bGUgZm9yIGRpYWxvZyBib3ggZWc6IFNlbGVjdCBEaWFsb2cgRm9yIFJvbGUsIGRpYWxvZ1RpdGxlIG5lZWRzIHRvCi0JICogIlJvbGUiCi0JICovCi0JcHVibGljIHZvaWQgc2V0VGl0bGUoU3RyaW5nIGRpYWxvZ1RpdGxlKSB7Ci0JCXRoaXMuZGlhbG9nVGl0bGUgPSBkaWFsb2dUaXRsZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3cjY29uZmlndXJlU2hlbGwob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGwpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlU2hlbGwoU2hlbGwgc2hlbGwpIHsKLQkJc3VwZXIuY29uZmlndXJlU2hlbGwoc2hlbGwpOwotCQlpZiAoZGlhbG9nVGl0bGUgPT0gbnVsbCkKLQkJCWRpYWxvZ1RpdGxlID0gdGFiU3RyOwotCQlzaGVsbC5zZXRUZXh0KEF1dGhvcmluZ1VJUmVzb3VyY2VzLkZpbHRlckRpYWxvZ190aXRsZSArIGRpYWxvZ1RpdGxlKTsgCi0JfQotCi0JLyoqCi0JICogKG5vbi1KYXZhZG9jKSBBZGRzIGJ1dHRvbnMgdG8gdGhpcyBkaWFsb2cncyBidXR0b24gYmFyLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBidXR0b24gYmFyIGNvbXBvc2l0ZQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2cjY3JlYXRlQnV0dG9uc0ZvckJ1dHRvbkJhcihvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQnV0dG9uc0ZvckJ1dHRvbkJhcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXN1cGVyLmNyZWF0ZUJ1dHRvbnNGb3JCdXR0b25CYXIocGFyZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGRpYWxvZyBhcmVhIGFuZCBjb250cm9scyBhbmQgdmlld2VyLgotCSAqIAotCSAqIEBwYXJhbSB0aGUKLQkgKiAgICAgICAgICAgIHBhcmVudCBjb21wb3NpdGUgdG8gY29udGFpbiB0aGUgZGlhbG9nIGFyZWEKLQkgKiBAcmV0dXJuIHRoZSBkaWFsb2cgYXJlYSBjb250cm9sCi0JICovCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IChDb21wb3NpdGUpIHN1cGVyLmNyZWF0ZURpYWxvZ0FyZWEocGFyZW50KTsKLQkJY29tcG9zaXRlLnNldEZvbnQocGFyZW50LmdldEZvbnQoKSk7Ci0KLQkJR3JpZExheW91dCBsYXlvdXQgPSAoR3JpZExheW91dCkgY29tcG9zaXRlLmdldExheW91dCgpOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSAxMDsKLQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDEwOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDM7Ci0KLQkJTGFiZWwgdHlwZUxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQl7Ci0JCQl0eXBlTGFiZWwuc2V0VGV4dChBdXRob3JpbmdVSVJlc291cmNlcy5GaWx0ZXJEaWFsb2dfVHlwZV90ZXh0KTsgCi0JCQlHcmlkRGF0YSBnRDEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuQkVHSU5OSU5HKTsKLQkJCXR5cGVMYWJlbC5zZXRMYXlvdXREYXRhKGdEMSk7Ci0KLQkJfQotCQlmaWx0ZXJUeXBlID0gbmV3IENvbWJvKGNvbXBvc2l0ZSwgU1dULlNJTkdMRSB8IFNXVC5SRUFEX09OTFkpOwotCQl7Ci0JCQlHcmlkRGF0YSBnRDEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuQkVHSU5OSU5HKTsKLQkJCWdEMS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCQlnRDEud2lkdGhIaW50ID0gMzkwOwotCQkJZmlsdGVyVHlwZS5zZXRMYXlvdXREYXRhKGdEMSk7Ci0JCX0KLQotCQlpZiAodHlwZXMgPT0gbnVsbCkgewotCQkJZmlsbEZpbHRlclR5cGVDb21ibygpOwotCQl9IGVsc2UgewotCQkJZmlsdGVyVHlwZS5zZXRJdGVtcyh0eXBlcyk7Ci0JCQlpZiAoaGVscGVyICE9IG51bGwpIHsKLQkJCQlmaWx0ZXJUeXBlU3RyID0gZmlsdGVyVHlwZS5nZXRJdGVtKDApOwotCQkJCWhlbHBlci5zZXRGaWx0ZXJUeXBlU3RyKGZpbHRlclR5cGUuZ2V0SXRlbSgwKSk7Ci0JCQkJaWYgKHRhYlN0ciA9PSBudWxsKSB7Ci0JCQkJCXRhYlN0ciA9IGZpbHRlclR5cGVTdHI7Ci0JCQkJCWhlbHBlci5zZXRUYWJTdHIodGFiU3RyKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZmlsdGVyVHlwZS5zZWxlY3QoMCk7Ci0KLQkJTGFiZWwgY3RybF9wYXR0ZXJuTGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCXsKLQkJCWN0cmxfcGF0dGVybkxhYmVsLnNldFRleHQoQXV0aG9yaW5nVUlSZXNvdXJjZXMuRmlsdGVyRGlhbG9nX1BhdHRlcm5fdGV4dCk7IAotCQkJR3JpZERhdGEgZ0QgPSBuZXcgR3JpZERhdGEoKTsKLQkJCWdELmhvcml6b250YWxTcGFuID0gMzsKLQkJCWN0cmxfcGF0dGVybkxhYmVsLnNldExheW91dERhdGEoZ0QpOwotCQl9Ci0KLQkJY3RybF9wYXR0ZXJuID0gbmV3IFRleHQoY29tcG9zaXRlLCBTV1QuQk9SREVSKTsKLQkJewotCQkJR3JpZERhdGEgZ0QxID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCk7Ci0JCQlnRDEuaG9yaXpvbnRhbFNwYW4gPSAzOwotCQkJY3RybF9wYXR0ZXJuLnNldExheW91dERhdGEoZ0QxKTsKLQkJCWN0cmxfcGF0dGVybi5nZXRBY2Nlc3NpYmxlKCkuYWRkQWNjZXNzaWJsZUxpc3RlbmVyKAotCQkJCQluZXcgQXV0aG9yaW5nQWNjZXNzaWJsZUxpc3RlbmVyKAotCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLkZpbHRlckRpYWxvZ19QYXR0ZXJuX3RleHQgKyAgCi0JCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuRmlsdGVyRGlhbG9nX1BhdHRlcm5fZGVzY3JpcHRpb24pKTsKLQkJfQotCQlMYWJlbCBjdHJsX3BhdHRlcm5MYWJlbDEgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuV1JBUCk7Ci0JCXsKLQkJCWN0cmxfcGF0dGVybkxhYmVsMS5zZXRUZXh0KEF1dGhvcmluZ1VJUmVzb3VyY2VzLkZpbHRlckRpYWxvZ19QYXR0ZXJuX2Rlc2NyaXB0aW9uKTsgCi0JCQlHcmlkRGF0YSBnRCA9IG5ldyBHcmlkRGF0YShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQsIGZhbHNlLCBmYWxzZSwgMywgMSk7Ci0JCQlnRC53aWR0aEhpbnQgPSA1NTA7Ci0JCQljdHJsX3BhdHRlcm5MYWJlbDEuc2V0TGF5b3V0RGF0YShnRCk7Ci0JCX0KLQkJCi0JCUNvbXBvc2l0ZSBidXR0b25zQ29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShjb21wb3NpdGUsIFNXVC5OT05FKTsJCQotCQkKLQkJR3JpZERhdGEgZ2QyID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTAotCQkJfCBHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0VORCk7Ci0JCWdkMi5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCWJ1dHRvbnNDb21wb3NpdGUuc2V0TGF5b3V0RGF0YShnZDIpOwotCQlHcmlkTGF5b3V0IGJ1dHRvbnNMYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlidXR0b25zTGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotCQlidXR0b25zTGF5b3V0Lm1hcmdpblJpZ2h0ID0gMDsKLQkJYnV0dG9uc0NvbXBvc2l0ZS5zZXRMYXlvdXQoYnV0dG9uc0xheW91dCk7Ci0JCQotCQlleHBhbmRCdXR0b24gPSBuZXcgQnV0dG9uKGJ1dHRvbnNDb21wb3NpdGUsIFNXVC5CVVRUT04xKTsKLQotCQlleHBhbmRCdXR0b24uc2V0SW1hZ2UoQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFNoYXJlZEltYWdlKAotCQkJCSJleHBhbmRhbGwuZ2lmIikpOyAvLyROT04tTkxTLTEkCi0JCWV4cGFuZEJ1dHRvbi5zZXRUb29sVGlwVGV4dChBdXRob3JpbmdVSVJlc291cmNlcy5GaWx0ZXJEaWFsb2dfRXhwYW5kQWxsKTsgCi0JCQotCQlleHBhbmRCdXR0b24uZ2V0QWNjZXNzaWJsZSgpLmFkZEFjY2Vzc2libGVMaXN0ZW5lcihuZXcgQXV0aG9yaW5nQWNjZXNzaWJsZUxpc3RlbmVyKAotCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuRmlsdGVyRGlhbG9nX0V4cGFuZEFsbCkpOwkJCi0KLQkJZ2QyID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQkVHSU5OSU5HCi0JCQkJfCBHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwpOwotCi0JCWV4cGFuZEJ1dHRvbi5zZXRMYXlvdXREYXRhKGdkMik7Ci0KLQkJY29sbGFwc2VCdXR0b24gPSBuZXcgQnV0dG9uKGJ1dHRvbnNDb21wb3NpdGUsIFNXVC5QVVNIKTsKLQkJY29sbGFwc2VCdXR0b24uc2V0SW1hZ2UoQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFNoYXJlZEltYWdlKAotCQkJCSJjb2xsYXBzZWFsbC5naWYiKSk7IC8vJE5PTi1OTFMtMSQKLQotCQljb2xsYXBzZUJ1dHRvbi5zZXRUb29sVGlwVGV4dChBdXRob3JpbmdVSVJlc291cmNlcy5GaWx0ZXJEaWFsb2dfQ29sbGFwc2VBbGwpOyAKLQkJY29sbGFwc2VCdXR0b24uZ2V0QWNjZXNzaWJsZSgpLmFkZEFjY2Vzc2libGVMaXN0ZW5lcihuZXcgQXV0aG9yaW5nQWNjZXNzaWJsZUxpc3RlbmVyKAotCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLkZpbHRlckRpYWxvZ19Db2xsYXBzZUFsbCkpOwotCQkKLQkJZ2QyID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRU5EKTsKLQotCQljb2xsYXBzZUJ1dHRvbi5zZXRMYXlvdXREYXRhKGdkMik7Ci0JCQotCQljcmVhdGVMaW5lKGNvbXBvc2l0ZSwgMyk7Ci0JCWNyZWF0ZVZpZXdlckxhYmVsKGNvbXBvc2l0ZSk7Ci0JCS8vIGNyZWF0ZSBhIHRyZWV2aWV3ZXIgYXJlYS4KLQkJY3JlYXRlVmlld2VyKGNvbXBvc2l0ZSk7Ci0KLQkJcmVzdG9yZUxhc3RTZXR0aW5ncygpOwotCi0JCW5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKS5zZXRUZXh0KEF1dGhvcmluZ1VJUmVzb3VyY2VzLkZpbHRlckRpYWxvZ19CcmllZkRlc2NyaXB0aW9uKTsgCi0JCWN0cmxfYnJpZWZfZGVzYyA9IG5ldyBUZXh0KGNvbXBvc2l0ZSwgU1dULkJPUkRFUiB8IFNXVC5NVUxUSSB8IFNXVC5XUkFQCi0JCQkJfCBTV1QuVl9TQ1JPTEwgfCBTV1QuUkVBRF9PTkxZKTsKLQkJewotCQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJCWdkLmhvcml6b250YWxTcGFuID0gMzsKLQkJCWdkLmhlaWdodEhpbnQgPSA2MDsKLQkJCWN0cmxfYnJpZWZfZGVzYy5zZXRMYXlvdXREYXRhKGdkKTsKLQkJfQotCQkvLyBSZXN0b3JlIHRoZSBsYXN0IHN0YXRlCi0JCWNyZWF0ZUxpbmUoY29tcG9zaXRlLCAzKTsKLQotCQkvLyBSZXR1cm4gcmVzdWx0cy4KLQkJYWRkTGlzdGVuZXIoKTsKLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBuZXcgdmlld2VyIGluIHRoZSBwYXJlbnQuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCA8Y29kZT5Db21wb3NpdGU8L2NvZGU+LgotCSAqLwotCXByaXZhdGUgdm9pZCBjcmVhdGVWaWV3ZXIoQ29tcG9zaXRlIHBhcmVudCkgewotCQlpZiAodmlld2VyU2VsZWN0aW9uU2luZ2xlKSB7Ci0JCQl0cmVlVmlld2VyID0gbmV3IFRyZWVWaWV3ZXIocGFyZW50LCBTV1QuU0lOR0xFIHwgU1dULkhfU0NST0xMCi0JCQkJCXwgU1dULlZfU0NST0xMIHwgU1dULkJPUkRFUik7Ci0JCX0gZWxzZSB7Ci0JCQl0cmVlVmlld2VyID0gbmV3IFRyZWVWaWV3ZXIocGFyZW50LCBTV1QuTVVMVEkgfCBTV1QuSF9TQ1JPTEwKLQkJCQkJfCBTV1QuVl9TQ1JPTEwgfCBTV1QuQk9SREVSKTsKLQkJfQotCQl0cmVlVmlld2VyLnNldExhYmVsUHJvdmlkZXIobGFiZWxQcm92aWRlcik7Ci0JCXRyZWVWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKGNvbnRlbnRQcm92aWRlcik7Ci0JCXRyZWVWaWV3ZXIuc2V0VXNlSGFzaGxvb2t1cCh0cnVlKTsKLQotCQkvLyBTZXQgdGhlIGlucHV0IHRvIHRyZWVWaWV3ZXIKLQkJdHJlZVZpZXdlci5zZXRJbnB1dChnZXRJbnB1dCgpKTsKLQotCQl0cmVlVmlld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcih0aGlzKTsKLQkJdHJlZVZpZXdlci5hZGREb3VibGVDbGlja0xpc3RlbmVyKHRoaXMpOwotCQl0cmVlVmlld2VyLmdldFRyZWUoKS5zZXRGb250KHBhcmVudC5nZXRGb250KCkpOwotCi0JCWlmICh0YWJTdHIuZXF1YWxzSWdub3JlQ2FzZShGaWx0ZXJDb25zdGFudHMuQUxMX0VMRU1FTlRTKSkgeyAKLQkJCXRyZWVWaWV3ZXIuc2V0U29ydGVyKG5ldyBGaWx0ZXJTb3J0ZXJGb3JBbGwoKSk7Ci0JCX0gZWxzZSB7Ci0JCQl0cmVlVmlld2VyLnNldFNvcnRlcihuZXcgRmlsdGVyU29ydGVyKCkpOwotCQl9Ci0KLQkJR3JpZERhdGEgc3BlYyA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQl7Ci0JCQlzcGVjLndpZHRoSGludCA9IDMwMDsKLQkJCXNwZWMuaGVpZ2h0SGludCA9IDMwMDsKLQkJCXNwZWMuaG9yaXpvbnRhbFNwYW4gPSAzOwotCQkJdHJlZVZpZXdlci5nZXRDb250cm9sKCkuc2V0TGF5b3V0RGF0YShzcGVjKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgaW5wdXQgaWYgZXh0ZXJuYWxseSBzZXQgYnkgc2V0SW5wdXQgaW52b2tlci4KLQkgKiBFbHNlLCBjYWxjdWxhdGVzIHRoZSBpbnB1dCBiYXNlZCBvbiB0aGUgT2JqZWN0IHNldCB0byB0aGUgZGlhbG9nLgotCSAqLwotCXByaXZhdGUgT2JqZWN0IGdldElucHV0KCl7Ci0JCWlmKGlucHV0ICE9IG51bGwpewotCQkJcmV0dXJuIGlucHV0OwotCQl9ZWxzZXsKLQkJCWlmIChjb250ZW50RWxlbWVudCAhPSBudWxsKSB7Ci0JCQkJaWYgKGNvbnRlbnRFbGVtZW50IGluc3RhbmNlb2YgUHJvY2VzcykgewotCQkJCQkJUHJvY2VzcyBwcm9jZXNzID0gKFByb2Nlc3MpY29udGVudEVsZW1lbnQ7Ci0JCQkJCQlpZiAocHJvY2Vzcy5lQ29udGFpbmVyKCkgaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50KSB7Ci0JCQkJCQkJaWYgKCEodGFiU3RyLmVxdWFscyhGaWx0ZXJDb25zdGFudHMuR1VJREFOQ0UpCi0JCQkJCQkJCQl8fCB0YWJTdHIuZXF1YWxzKEZpbHRlckNvbnN0YW50cy5ST0FETUFQKSAKLQkJCQkJCQkJCXx8IHRhYlN0ci5lcXVhbHMoRmlsdGVyQ29uc3RhbnRzLlNVUFBPUlRJTkdfTUFURVJJQUxTKSkpIHsKLQkJCQkJCQlyZXR1cm4gcHJvY2Vzcy5lQ29udGFpbmVyKCk7Ci0JCQkJCQl9IGVsc2UKLQkJCQkJCQlyZXR1cm4gcHJvY2VzczsKLQkJCQkJCX0KLQkJCQl9IAotCQkJCXJldHVybiBVbWFVdGlsLmdldE1ldGhvZExpYnJhcnkoKEVPYmplY3QpIGNvbnRlbnRFbGVtZW50KTsKLQkJCX0gCi0JCQlyZXR1cm4gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVMaW5lKENvbXBvc2l0ZSBwYXJlbnQsIGludCBuY29sKSB7Ci0JCUxhYmVsIGxpbmUgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuU0VQQVJBVE9SIHwgU1dULkhPUklaT05UQUwKLQkJCQl8IFNXVC5CT0xEKTsKLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSBuY29sOwotCQlsaW5lLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVWaWV3ZXJMYWJlbChDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAJCWlmICh2aWV3ZXJMYWJlbCAhPSBudWxsKSB7Ci0gICAJCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OT05FKTsKLQkJCWxhYmVsLnNldFRleHQodmlld2VyTGFiZWwpOwotICAgCQl9Ci0gICAJfQotCQotCXB1YmxpYyB2b2lkIHNldFZpZXdlclNlbGVjdGlvblNpbmdsZShib29sZWFuIHNpbmdsZSkgewotCQl2aWV3ZXJTZWxlY3Rpb25TaW5nbGUgPSBzaW5nbGU7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklEb3VibGVDbGlja0xpc3RlbmVyI2RvdWJsZUNsaWNrKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuRG91YmxlQ2xpY2tFdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkb3VibGVDbGljayhEb3VibGVDbGlja0V2ZW50IGV2ZW50KSB7Ci0JCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHMgPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGV2ZW50LmdldFNlbGVjdGlvbigpOwotCQlPYmplY3QgZWxlbWVudCA9IHMuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCWVsZW1lbnQgPSBMaWJyYXJ5VXRpbC51bndyYXAoZWxlbWVudCk7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgQ29udGVudEVsZW1lbnQgfHwgZWxlbWVudCBpbnN0YW5jZW9mIFByb2Nlc3MKLQkJCQl8fCBlbGVtZW50IGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudAotCQkJCXx8IGVsZW1lbnQgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50Ci0JCQkJfHwgZWxlbWVudCBpbnN0YW5jZW9mIFByb2Nlc3NQYWNrYWdlKSB7Ci0JCQlzZWxlY3RlZExpc3QuYWRkKGVsZW1lbnQpOwotCQl9IAotCQlzYXZlTGFzdFNldHRpbmdzKCk7Ci0JCWNsb3NlKCk7Ci0JCWlmKGNvbXBvc2VkQWRhcHRlckZhY3RvcnkgIT0gbnVsbCl7Ci0JCQljb21wb3NlZEFkYXB0ZXJGYWN0b3J5LmRpc3Bvc2UoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgZGlhbG9nIHN0b3JlIHRvIGNhY2hlIHZhbHVlcyBpbnRvCi0JICovCi0JcHJvdGVjdGVkIElEaWFsb2dTZXR0aW5ncyBnZXREaWFsb2dTZXR0aW5ncygpIHsKLQkJRGlhbG9nU2V0dGluZ3MgZGlhbG9nU2V0dGluZ3MgPSAoRGlhbG9nU2V0dGluZ3MpIEF1dGhvcmluZ1VJUGx1Z2luCi0JCQkJLmdldERlZmF1bHQoKS5nZXREaWFsb2dTZXR0aW5ncygpOwotCQlEaWFsb2dTZXR0aW5ncyBzZWN0aW9uID0gKERpYWxvZ1NldHRpbmdzKSBkaWFsb2dTZXR0aW5ncwotCQkJCS5nZXRTZWN0aW9uKERJQUxPR19OQU1FICsgU1RPUkVfRVhQQU5ERURfTEVWRUxfSUQpOwotCQlpZiAoc2VjdGlvbiA9PSBudWxsKQotCQkJc2VjdGlvbiA9IChEaWFsb2dTZXR0aW5ncykgZGlhbG9nU2V0dGluZ3MuYWRkTmV3U2VjdGlvbihESUFMT0dfTkFNRQotCQkJCQkrIFNUT1JFX0VYUEFOREVEX0xFVkVMX0lEKTsKLQkJcmV0dXJuIHNlY3Rpb247Ci0JfQotCi0JLyoqCi0JICogVXNlIHRoZSBkaWFsb2cgc2V0dGluZ3MgdG8gcmVzdG9yZSB3aWRnZXQgdmFsdWVzIHRvIHRoZSB2YWx1ZXMgdGhhdCB0aGV5Ci0JICogaGVsZCBsYXN0IHRpbWUgdGhpcyBkaWFsb2cgd2FzIHVzZWQgdG8gY29tcGxldGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZXN0b3JlTGFzdFNldHRpbmdzKCkgewotCQlESUFMT0dfTkFNRSA9IHRhYlN0cjsKLQkJRGlhbG9nU2V0dGluZ3MgZGlhbG9nU2V0dGluZ3MgPSAoRGlhbG9nU2V0dGluZ3MpIGdldERpYWxvZ1NldHRpbmdzKCk7Ci0JCVN0cmluZyB0ZW1wID0gZGlhbG9nU2V0dGluZ3MuZ2V0KERJQUxPR19OQU1FICsgUEFUVEVSTl9JRCk7IAotCQlpZiAodGVtcCAhPSBudWxsICYmIHRlbXAubGVuZ3RoKCkgPiAwKSB7IAotCQkJcGF0dGVybiA9IGRpYWxvZ1NldHRpbmdzLmdldChESUFMT0dfTkFNRSArIFBBVFRFUk5fSUQpOyAKLQkJCWZpbHRlclR5cGVTdHIgPSBkaWFsb2dTZXR0aW5ncy5nZXQoRElBTE9HX05BTUUgKyBUWVBFX0lEKTsgCi0JCQlmaWx0ZXJUeXBlLnNldFRleHQoZmlsdGVyVHlwZVN0cik7Ci0JCQlyZWdleFBhdHRlcm4gPSBnZXRSZWdFeChwYXR0ZXJuKTsKLQkJCQotCQkJLy9UcmltICIqIiBmcm9tIHBhdHRlcm4gc3RyaW5nIGJlZm9yZSBkaXNwbGF5LiBUaGlzIGFjdGlvbiBpcyBqdXN0IGZvciBkaXNwbGF5LgotLy8JCQlpZihwYXR0ZXJuICE9IG51bGwpewotLy8JCQkJaWYocGF0dGVybi5sYXN0SW5kZXhPZihGaWx0ZXJDb25zdGFudHMuQU5ZX1NUUklORykgCi0vLwkJCQkJCT09IHBhdHRlcm4ubGVuZ3RoKCktMSl7Ci0vLwkJCQkJcGF0dGVybiA9IHBhdHRlcm4uc3Vic3RyaW5nKDAsIHBhdHRlcm4ubGVuZ3RoKCktMSk7Ci0vLwkJCQl9Ci0vLwkJCX0KLQkJCWN0cmxfcGF0dGVybi5zZXRUZXh0KHBhdHRlcm4pOwotCQkJCi0JCQlpZiAoaGVscGVyICE9IG51bGwpIHsKLQkJCQloZWxwZXIuc2V0UGF0dGVybihwYXR0ZXJuKTsKLQkJCQloZWxwZXIuc2V0UmVnZXhQYXR0ZXJuKHJlZ2V4UGF0dGVybik7Ci0JCQkJaGVscGVyLnNldEZpbHRlclR5cGVTdHIoZmlsdGVyVHlwZVN0cik7Ci0JCQl9Ci0JCQlpbml0UHJvdmlkZXJGb3JUYWJzKCk7Ci0KLQkJfQotCQlMaXN0IGVsZW1lbnRzID0gKExpc3QpIEZpbHRlckNvbnN0YW50cy5oYXNoTWFwLmdldChESUFMT0dfTkFNRQotCQkJCSsgU1RPUkVfRVhQQU5ERURfTEVWRUxfSUQpOwotCQlpZiAoZWxlbWVudHMgPT0gbnVsbCB8fCBlbGVtZW50cy5pc0VtcHR5KCkpIHsKLQkJCXRyZWVWaWV3ZXIuZXhwYW5kQWxsKCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlpZiAoZWxlbWVudHMgIT0gbnVsbCAmJiAhZWxlbWVudHMuaXNFbXB0eSgpKSB7Ci0JCQl0cnkgewotCQkJCXRyZWVWaWV3ZXIuc2V0RXhwYW5kZWRFbGVtZW50cyhlbGVtZW50cy50b0FycmF5KCkpOwotCQkJCXRyZWVWaWV3ZXIucmVmcmVzaCgpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQl0cmVlVmlld2VyLmV4cGFuZEFsbCgpOwotCQkJfQotCQl9Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0cmF2ZXJzZVRyZWUoVHJlZUl0ZW1bXSBpdGVtcywgTGlzdCBsaXN0KSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHsKLQkJCVRyZWVJdGVtW10gaXRlbXN4ID0gaXRlbXNbaV0uZ2V0SXRlbXMoKTsKLQkJCWlmIChpdGVtc3gubGVuZ3RoID4gMSkgewotCQkJCWxpc3QuYWRkKGl0ZW1zW2ldLmdldERhdGEoKSk7Ci0JCQkJdHJhdmVyc2VUcmVlKGl0ZW1zeCwgbGlzdCk7Ci0JCQl9IGVsc2UgewotCQkJCWxpc3QuYWRkKGl0ZW1zW2ldLmdldERhdGEoKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTaW5jZSBPSyB3YXMgcHJlc3NlZCwgd3JpdGUgd2lkZ2V0IHZhbHVlcyB0byB0aGUgZGlhbG9nIHN0b3JlIHNvIHRoYXQKLQkgKiB0aGV5IHdpbGwgcGVyc2lzdCBpbnRvIHRoZSBuZXh0IGludm9jYXRpb24gb2YgdGhpcyBkaWFsb2cKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzYXZlVmFsdWVzKCkgewotCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHRyZWVWaWV3ZXIKLQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCWlmIChzZWxlY3Rpb24uc2l6ZSgpID4gMCkgewotCQkJT2JqZWN0W10gb2JqZWN0QXJyID0gc2VsZWN0aW9uLnRvQXJyYXkoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgb2JqZWN0QXJyLmxlbmd0aDsgaSsrKSB7Ci0JCQkJT2JqZWN0IG9iaiA9IExpYnJhcnlVdGlsLnVud3JhcChvYmplY3RBcnJbaV0pOwotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBDb250ZW50RWxlbWVudCAKLQkJCQkJCXx8IG9iaiBpbnN0YW5jZW9mIFByb2Nlc3MgCi0JCQkJCQl8fCBvYmogaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50Ci0JCQkJCQl8fCBvYmogaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50Ci0JCQkJCQl8fCBvYmogaW5zdGFuY2VvZiBQcm9jZXNzUGFja2FnZSkgewotCQkJCQlzZWxlY3RlZExpc3QuYWRkKG9iaik7Ci0JCQkJfSAKLQkJCX0KLQkJfQotCQlzYXZlTGFzdFNldHRpbmdzKCk7Ci0JfQotCi0JLyoqCi0JICogU2F2ZXMgdGhlIGxhc3Qgc2V0dGluZ3Mgb2YgZGlhbG9nLgotCSAqLwotCXB1YmxpYyB2b2lkIHNhdmVMYXN0U2V0dGluZ3MoKSB7Ci0KLQkJLy8gZWNsaXBzZSBkb2NzIGZvcklEaWFsb2dTZXR0aW5ncyBmb3IgdW5kZXJzdGFuZGluZy4KLQkJSURpYWxvZ1NldHRpbmdzIHNldHRpbmdzID0gZ2V0RGlhbG9nU2V0dGluZ3MoKTsKLQkJRElBTE9HX05BTUUgPSB0YWJTdHI7Ci0JCU9iamVjdFtdIGV4cGFuZGVkRWxlbWVudHMgPSB0cmVlVmlld2VyLmdldEV4cGFuZGVkRWxlbWVudHMoKTsKLQkJTGlzdCBleHBhbmRMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkvLyBTdHJpbmdbXSBleHBhbmRlZENhdGVnb3J5SWRzID0gbmV3IFN0cmluZ1tleHBhbmRlZEVsZW1lbnRzLmxlbmd0aF07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZXhwYW5kZWRFbGVtZW50cy5sZW5ndGg7IGkrKykgewotCQkJT2JqZWN0IG9iaiA9IGV4cGFuZGVkRWxlbWVudHNbaV07Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgTmFtZWRFbGVtZW50KSB7Ci0JCQkJZXhwYW5kTGlzdC5hZGQoZXhwYW5kZWRFbGVtZW50c1tpXSk7Ci0JCQl9Ci0JCX0KLQkJc2V0dGluZ3MucHV0KERJQUxPR19OQU1FICsgUEFUVEVSTl9JRCwgcGF0dGVybik7Ci0JCXNldHRpbmdzLnB1dChESUFMT0dfTkFNRSArIFRZUEVfSUQsIGZpbHRlclR5cGVTdHIpOwotCQlGaWx0ZXJDb25zdGFudHMuaGFzaE1hcC5wdXQoRElBTE9HX05BTUUgKyBTVE9SRV9FWFBBTkRFRF9MRVZFTF9JRCwKLQkJCQlleHBhbmRMaXN0KTsKLQl9Ci0KLQkvKioKLQkgKiBOb3RpZmllcyB0aGF0IHRoZSBzZWxlY3Rpb24gaGFzIGNoYW5nZWQuCi0JICogCi0JICogQHBhcmFtIGV2ZW50Ci0JICogICAgICAgICAgICBldmVudCBvYmplY3QgZGVzY3JpYmluZyB0aGUgY2hhbmdlCi0JICovCi0JcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJdXBkYXRlU2VsZWN0aW9uKGV2ZW50KTsKLQkJdXBkYXRlQnV0dG9ucygpOwotCX0KLQotCS8qKgotCSAqIFVwZGF0ZSB0aGUgYnV0dG9uIGVuYWJsZW1lbnQgc3RhdGUuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlQnV0dG9ucygpIHsKLQkJLy8gb2tCdXR0b24uc2V0RW5hYmxlZChnZXRTZWxlY3Rpb24oKS5sZW5ndGggPiAwKTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudE9iamVjdChPYmplY3QgY29udGVudEVsZW1lbnQpIHsKLQkJcmV0dXJuIE1ldGhvZEVsZW1lbnRVdGlsLmdldE1ldGhvZE1vZGVsKGNvbnRlbnRFbGVtZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBVcGRhdGUgdGhlIHNlbGVjdGlvbiBvYmplY3QuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlU2VsZWN0aW9uKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQkvLyBBcnJheUxpc3QgZGVzY3MgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbCA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgZXZlbnQuZ2V0U2VsZWN0aW9uKCk7Ci0JCU9iamVjdCBzZWxlY3RlZCA9IHNlbC5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJaWYgKHNlbGVjdGVkIGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIgfHwKLQkJCQlzZWxlY3RlZCBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnRJdGVtUHJvdmlkZXIpewotCQkJT2JqZWN0IHVud3JhcCA9ICBUbmdVdGlsLnVud3JhcChzZWxlY3RlZCk7Ci0JCQlzZXRCcmllZkRlc2NyaXB0aW9uKHVud3JhcCk7Ci0JCX1lbHNlIHsKLQkJCXNldEJyaWVmRGVzY3JpcHRpb24oc2VsZWN0ZWQpOwotCQl9Ci0JfQotCS8qKgotCSAqIFNldCB0aGUgYnJpZWYgZGVzY3JpcHRpb24gdG8gY29udHJvbAotCSAqLwotCXByaXZhdGUgdm9pZCBzZXRCcmllZkRlc2NyaXB0aW9uKE9iamVjdCBlbGVtZW50KSB7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJU3RyaW5nIGRlc2MgPSAoKE1ldGhvZEVsZW1lbnQpIGVsZW1lbnQpLmdldEJyaWVmRGVzY3JpcHRpb24oKTsKLQkJCWlmIChkZXNjICE9IG51bGwpIHsKLQkJCQljdHJsX2JyaWVmX2Rlc2Muc2V0VGV4dChkZXNjKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGZpbGxGaWx0ZXJUeXBlQ29tYm8oKSB7Ci0JCWlmIChmaWx0ZXIgaW5zdGFuY2VvZiBDb25maWd1cmF0aW9uRmlsdGVyKSB7Ci0JCQlTdHJpbmdbXSBzdHIgPSBuZXcgU3RyaW5nWzFdOwotCQkJc3RyWzBdID0gKFN0cmluZykgdGFiU3RyOwotCQkJZmlsdGVyVHlwZS5zZXRJdGVtcyhzdHIpOwotCQkJZmlsdGVyVHlwZVN0ciA9IHN0clswXTsKLQkJfSBlbHNlIGlmIChGaWx0ZXJDb25zdGFudHMuT05MWV9DT05URU5UX0VMRU1FTlRTLmVxdWFscyh0YWJTdHIpKSB7Ci0JCQlTdHJpbmcgc3BhY2UgPSAiLSI7IC8vJE5PTi1OTFMtMSQKLQkJCVN0cmluZ1tdIHN0ciA9IG5ldyBTdHJpbmdbMjZdOwotCQkJaW50IGkgPSAwOwotCQkJc3RyW2krK10gPSBGaWx0ZXJDb25zdGFudHMuQUxMX0VMRU1FTlRTOwotCQkJc3RyW2krK10gPSBGaWx0ZXJDb25zdGFudHMuQ09OVEVOVF9QQUNLQUdFUzsKLQkJCXN0cltpKytdID0gc3BhY2UgKyBGaWx0ZXJDb25zdGFudHMuUk9MRVM7Ci0JCQlzdHJbaSsrXSA9IHNwYWNlICsgRmlsdGVyQ29uc3RhbnRzLlRBU0tTOwotCQkJc3RyW2krK10gPSBzcGFjZSArIEZpbHRlckNvbnN0YW50cy5XT1JLUFJPRFVDVFM7Ci0JCQlzdHJbaSsrXSA9IHNwYWNlICsgRmlsdGVyQ29uc3RhbnRzLkdVSURBTkNFOwotCQkJc3RyW2krK10gPSBGaWx0ZXJDb25zdGFudHMuc3BhY2UgKyBGaWx0ZXJDb25zdGFudHMuc3BhY2UKLQkJCQkJKyBGaWx0ZXJDb25zdGFudHMuQ0hFQ0tMSVNUUzsKLQkJCXN0cltpKytdID0gRmlsdGVyQ29uc3RhbnRzLnNwYWNlICsgRmlsdGVyQ29uc3RhbnRzLnNwYWNlCi0JCQkJCSsgRmlsdGVyQ29uc3RhbnRzLkNPTkNFUFRTOwotCQkJc3RyW2krK10gPSBGaWx0ZXJDb25zdGFudHMuc3BhY2UgKyBGaWx0ZXJDb25zdGFudHMuc3BhY2UKLQkJCQkJKyBGaWx0ZXJDb25zdGFudHMuRVNUSU1BVEVfQ09OU0lERVJBVElPTlM7Ci0JCQlzdHJbaSsrXSA9IEZpbHRlckNvbnN0YW50cy5zcGFjZSArIEZpbHRlckNvbnN0YW50cy5zcGFjZQotCQkJCQkrIEZpbHRlckNvbnN0YW50cy5FWEFNUExFUzsKLQkJCXN0cltpKytdID0gRmlsdGVyQ29uc3RhbnRzLnNwYWNlICsgRmlsdGVyQ29uc3RhbnRzLnNwYWNlCi0JCQkJCSsgRmlsdGVyQ29uc3RhbnRzLkdVSURFTElORVM7Ci0JCQlzdHJbaSsrXSA9IEZpbHRlckNvbnN0YW50cy5zcGFjZSArIEZpbHRlckNvbnN0YW50cy5zcGFjZQotCQkJCQkrIEZpbHRlckNvbnN0YW50cy5QUkFDVElDRVM7Ci0JCQlzdHJbaSsrXSA9IEZpbHRlckNvbnN0YW50cy5zcGFjZSArIEZpbHRlckNvbnN0YW50cy5zcGFjZQotCQkJCQkrIEZpbHRlckNvbnN0YW50cy5SRVBPUlRTOwotCQkJc3RyW2krK10gPSBGaWx0ZXJDb25zdGFudHMuc3BhY2UgKyBGaWx0ZXJDb25zdGFudHMuc3BhY2UKLQkJCQkJKyBGaWx0ZXJDb25zdGFudHMuUkVVU0FCTEVfQVNTRVRTOwotCQkJc3RyW2krK10gPSBGaWx0ZXJDb25zdGFudHMuc3BhY2UgKyBGaWx0ZXJDb25zdGFudHMuc3BhY2UKLQkJCQkJKyBGaWx0ZXJDb25zdGFudHMuUk9BRE1BUDsKLQkJCXN0cltpKytdID0gRmlsdGVyQ29uc3RhbnRzLnNwYWNlICsgRmlsdGVyQ29uc3RhbnRzLnNwYWNlCi0JCQkJCSsgRmlsdGVyQ29uc3RhbnRzLlNVUFBPUlRJTkdfTUFURVJJQUxTOwotCQkJc3RyW2krK10gPSBGaWx0ZXJDb25zdGFudHMuc3BhY2UgKyBGaWx0ZXJDb25zdGFudHMuc3BhY2UKLQkJCQkJKyBGaWx0ZXJDb25zdGFudHMuVEVNUExBVEVTOwotCQkJc3RyW2krK10gPSBGaWx0ZXJDb25zdGFudHMuc3BhY2UgKyBGaWx0ZXJDb25zdGFudHMuc3BhY2UKLQkJCQkJKyBGaWx0ZXJDb25zdGFudHMuVEVSTV9ERUZJTklUSU9OUzsKLQkJCXN0cltpKytdID0gRmlsdGVyQ29uc3RhbnRzLnNwYWNlICsgRmlsdGVyQ29uc3RhbnRzLnNwYWNlCi0JCQkJCSsgRmlsdGVyQ29uc3RhbnRzLlRPT0xfTUVOVE9SUzsKLQkJCXN0cltpKytdID0gRmlsdGVyQ29uc3RhbnRzLnNwYWNlICsgRmlsdGVyQ29uc3RhbnRzLnNwYWNlCi0JCQkJCSsgRmlsdGVyQ29uc3RhbnRzLldISVRFX1BBUEVSUzsKLQkJCXN0cltpKytdID0gRmlsdGVyQ29uc3RhbnRzLkRJU0NJUExJTkVTOwotCQkJc3RyW2krK10gPSBGaWx0ZXJDb25zdGFudHMuUk9MRVNFVFM7Ci0JCQlzdHJbaSsrXSA9IEZpbHRlckNvbnN0YW50cy5XT1JLUFJPRFVDVFRZUEVTOwotCQkJc3RyW2krK10gPSBGaWx0ZXJDb25zdGFudHMuRE9NQUlOUzsKLQkJCXN0cltpKytdID0gRmlsdGVyQ29uc3RhbnRzLlRPT0xTOwotCQkJc3RyW2krK10gPSBGaWx0ZXJDb25zdGFudHMuQ1VTVE9NX0NBVEVHT1JJRVM7Ci0JCQlmaWx0ZXJUeXBlLnNldEl0ZW1zKHN0cik7Ci0JCQlmaWx0ZXJUeXBlU3RyID0gc3RyWzBdOwotCQl9IGVsc2UgaWYgKEZpbHRlckNvbnN0YW50cy5jYXRlZ29yeVN0cnMuY29udGFpbnModGFiU3RyKSkgewotCQkJU3RyaW5nW10gc3RyID0gbmV3IFN0cmluZ1syXTsKLQkJCXN0clswXSA9IChTdHJpbmcpIHRhYlN0cjsKLQkJCXN0clsxXSA9IEZpbHRlckNvbnN0YW50cy5NRVRIT19QTFVHSU5TOwotCQkJZmlsdGVyVHlwZS5zZXRJdGVtcyhzdHIpOwotCQkJZmlsdGVyVHlwZVN0ciA9IHN0clswXTsKLQkJfSBlbHNlIGlmIChGaWx0ZXJDb25zdGFudHMuQ1VTVE9NX0NBVEVHT1JJRVMuZXF1YWxzSWdub3JlQ2FzZSh0YWJTdHIpKSB7Ci0JCQlTdHJpbmdbXSBzdHIgPSBuZXcgU3RyaW5nWzJdOwotCQkJc3RyWzBdID0gKFN0cmluZykgdGFiU3RyOwotCQkJc3RyWzFdID0gRmlsdGVyQ29uc3RhbnRzLk1FVEhPX1BMVUdJTlM7Ci0JCQlmaWx0ZXJUeXBlLnNldEl0ZW1zKHN0cik7Ci0JCQlmaWx0ZXJUeXBlU3RyID0gc3RyWzBdOwotCQl9IGVsc2UgaWYgKEZpbHRlckNvbnN0YW50cy5icmVha2Rvd25FbGVtZW50cy5jb250YWlucyh0YWJTdHIpKSB7Ci0JCQlTdHJpbmdbXSBzdHIgPSBuZXcgU3RyaW5nWzFdOwotCQkJc3RyWzBdID0gKFN0cmluZykgdGFiU3RyOwotCQkJZmlsdGVyVHlwZS5zZXRJdGVtcyhzdHIpOwotCQkJZmlsdGVyVHlwZVN0ciA9IHN0clswXTsKLQkJfSBlbHNlIGlmIChGaWx0ZXJDb25zdGFudHMuY29udGVudEVsZW1lbnRTdHJzLmNvbnRhaW5zKHRhYlN0cikpIHsKLQkJCVN0cmluZ1tdIHN0ciA9IG5ldyBTdHJpbmdbM107Ci0JCQlzdHJbMF0gPSB0YWJTdHI7Ci0JCQlzdHJbMV0gPSBGaWx0ZXJDb25zdGFudHMuQ09OVEVOVF9QQUNLQUdFUzsKLQkJCXN0clsyXSA9IEZpbHRlckNvbnN0YW50cy5NRVRIT19QTFVHSU5TOwotCQkJZmlsdGVyVHlwZS5zZXRJdGVtcyhzdHIpOwotCQkJZmlsdGVyVHlwZVN0ciA9IHN0clswXTsKLQkJfSBlbHNlIGlmIChGaWx0ZXJDb25zdGFudHMuQUxMX0VMRU1FTlRTLmVxdWFscyh0YWJTdHIpKSB7IC8vIDE3Mjk1NgotCQkJU3RyaW5nIHNwYWNlID0gIi0iOyAvLyROT04tTkxTLTEkCi0JCQlTdHJpbmdbXSBzdHIgPSBuZXcgU3RyaW5nWzI4XTsKLQkJCWludCBpID0gMDsKLQkJCXN0cltpKytdID0gRmlsdGVyQ29uc3RhbnRzLkFMTF9FTEVNRU5UUzsKLQkJCXN0cltpKytdID0gRmlsdGVyQ29uc3RhbnRzLkNPTlRFTlRfUEFDS0FHRVM7Ci0JCQlzdHJbaSsrXSA9IHNwYWNlICsgRmlsdGVyQ29uc3RhbnRzLlJPTEVTOwotCQkJc3RyW2krK10gPSBzcGFjZSArIEZpbHRlckNvbnN0YW50cy5UQVNLUzsKLQkJCXN0cltpKytdID0gc3BhY2UgKyBGaWx0ZXJDb25zdGFudHMuV09SS1BST0RVQ1RTOwotCQkJc3RyW2krK10gPSBzcGFjZSArIEZpbHRlckNvbnN0YW50cy5HVUlEQU5DRTsKLQkJCXN0cltpKytdID0gRmlsdGVyQ29uc3RhbnRzLnNwYWNlICsgRmlsdGVyQ29uc3RhbnRzLnNwYWNlCi0JCQkJCSsgRmlsdGVyQ29uc3RhbnRzLkNIRUNLTElTVFM7Ci0JCQlzdHJbaSsrXSA9IEZpbHRlckNvbnN0YW50cy5zcGFjZSArIEZpbHRlckNvbnN0YW50cy5zcGFjZQotCQkJCQkrIEZpbHRlckNvbnN0YW50cy5DT05DRVBUUzsKLQkJCXN0cltpKytdID0gRmlsdGVyQ29uc3RhbnRzLnNwYWNlICsgRmlsdGVyQ29uc3RhbnRzLnNwYWNlCi0JCQkJCSsgRmlsdGVyQ29uc3RhbnRzLkVTVElNQVRFX0NPTlNJREVSQVRJT05TOwotCQkJc3RyW2krK10gPSBGaWx0ZXJDb25zdGFudHMuc3BhY2UgKyBGaWx0ZXJDb25zdGFudHMuc3BhY2UKLQkJCQkJKyBGaWx0ZXJDb25zdGFudHMuRVhBTVBMRVM7Ci0JCQlzdHJbaSsrXSA9IEZpbHRlckNvbnN0YW50cy5zcGFjZSArIEZpbHRlckNvbnN0YW50cy5zcGFjZQotCQkJCQkrIEZpbHRlckNvbnN0YW50cy5HVUlERUxJTkVTOwotCQkJc3RyW2krK10gPSBGaWx0ZXJDb25zdGFudHMuc3BhY2UgKyBGaWx0ZXJDb25zdGFudHMuc3BhY2UKLQkJCQkJKyBGaWx0ZXJDb25zdGFudHMuUFJBQ1RJQ0VTOwotCQkJc3RyW2krK10gPSBGaWx0ZXJDb25zdGFudHMuc3BhY2UgKyBGaWx0ZXJDb25zdGFudHMuc3BhY2UKLQkJCQkJKyBGaWx0ZXJDb25zdGFudHMuUkVQT1JUUzsKLQkJCXN0cltpKytdID0gRmlsdGVyQ29uc3RhbnRzLnNwYWNlICsgRmlsdGVyQ29uc3RhbnRzLnNwYWNlCi0JCQkJCSsgRmlsdGVyQ29uc3RhbnRzLlJFVVNBQkxFX0FTU0VUUzsKLQkJCXN0cltpKytdID0gRmlsdGVyQ29uc3RhbnRzLnNwYWNlICsgRmlsdGVyQ29uc3RhbnRzLnNwYWNlCi0JCQkJCSsgRmlsdGVyQ29uc3RhbnRzLlJPQURNQVA7Ci0JCQlzdHJbaSsrXSA9IEZpbHRlckNvbnN0YW50cy5zcGFjZSArIEZpbHRlckNvbnN0YW50cy5zcGFjZQotCQkJCQkrIEZpbHRlckNvbnN0YW50cy5TVVBQT1JUSU5HX01BVEVSSUFMUzsKLQkJCXN0cltpKytdID0gRmlsdGVyQ29uc3RhbnRzLnNwYWNlICsgRmlsdGVyQ29uc3RhbnRzLnNwYWNlCi0JCQkJCSsgRmlsdGVyQ29uc3RhbnRzLlRFTVBMQVRFUzsKLQkJCXN0cltpKytdID0gRmlsdGVyQ29uc3RhbnRzLnNwYWNlICsgRmlsdGVyQ29uc3RhbnRzLnNwYWNlCi0JCQkJCSsgRmlsdGVyQ29uc3RhbnRzLlRFUk1fREVGSU5JVElPTlM7Ci0JCQlzdHJbaSsrXSA9IEZpbHRlckNvbnN0YW50cy5zcGFjZSArIEZpbHRlckNvbnN0YW50cy5zcGFjZQotCQkJCQkrIEZpbHRlckNvbnN0YW50cy5UT09MX01FTlRPUlM7Ci0JCQlzdHJbaSsrXSA9IEZpbHRlckNvbnN0YW50cy5zcGFjZSArIEZpbHRlckNvbnN0YW50cy5zcGFjZQotCQkJCQkrIEZpbHRlckNvbnN0YW50cy5XSElURV9QQVBFUlM7Ci0JCQlzdHJbaSsrXSA9IEZpbHRlckNvbnN0YW50cy5ESVNDSVBMSU5FUzsKLQkJCXN0cltpKytdID0gRmlsdGVyQ29uc3RhbnRzLlJPTEVTRVRTOwotCQkJc3RyW2krK10gPSBGaWx0ZXJDb25zdGFudHMuV09SS1BST0RVQ1RUWVBFUzsKLQkJCXN0cltpKytdID0gRmlsdGVyQ29uc3RhbnRzLkRPTUFJTlM7Ci0JCQlzdHJbaSsrXSA9IEZpbHRlckNvbnN0YW50cy5UT09MUzsKLQkJCXN0cltpKytdID0gRmlsdGVyQ29uc3RhbnRzLkNVU1RPTV9DQVRFR09SSUVTOwotCQkJc3RyW2krK10gPSBGaWx0ZXJDb25zdGFudHMuUFJPQ0VTU0VTOwotCQkJc3RyW2krK10gPSBGaWx0ZXJDb25zdGFudHMuTUVUSE9fUExVR0lOUzsKLQkJCWZpbHRlclR5cGUuc2V0SXRlbXMoc3RyKTsKLQkJCWZpbHRlclR5cGVTdHIgPSBzdHJbMF07Ci0JCX0gZWxzZSBpZiAoRmlsdGVyQ29uc3RhbnRzLkNPTkZJR19DT05URU5UX0VMRU1FTlQuZXF1YWxzKHRhYlN0cikpIHsKLQkJCVN0cmluZ1tdIHN0ciA9IG5ldyBTdHJpbmdbMV07Ci0JCQlzdHJbMF0gPSAoU3RyaW5nKSB0YWJTdHI7Ci0JCQlmaWx0ZXJUeXBlLnNldEl0ZW1zKHN0cik7Ci0JCQlmaWx0ZXJUeXBlU3RyID0gc3RyWzBdOwotCQl9IGVsc2UgewotCQkJU3RyaW5nW10gc3RyID0gbmV3IFN0cmluZ1sxXTsKLQkJCXN0clswXSA9IChTdHJpbmcpIHRhYlN0cjsKLQkJCWZpbHRlclR5cGUuc2V0SXRlbXMoc3RyKTsKLQkJCWZpbHRlclR5cGVTdHIgPSBzdHJbMF07Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgbG9uZyBkZWxheSA9IDgwMDsKLQkKLQlwcml2YXRlIGNsYXNzIFVwZGF0ZVRyZWVKb2IgZXh0ZW5kcyBKb2IgewotCi0JCXB1YmxpYyBVcGRhdGVUcmVlSm9iKFN0cmluZyBuYW1lKSB7Ci0JCQlzdXBlcihuYW1lKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgSVN0YXR1cyBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0KLQkJCS8vIG5lZWQgdG8gcnVuIHRoaXMgaW4gVUkgdGhyZWFkCi0JCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldERpc3BsYXkoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCi0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQlpZiAodHJlZVZpZXdlciA9PSBudWxsIHx8IAotCQkJCQkJCXRyZWVWaWV3ZXIuZ2V0Q29udHJvbCgpID09IG51bGwgfHwKLQkJCQkJCQl0cmVlVmlld2VyLmdldENvbnRyb2woKS5pc0Rpc3Bvc2VkKCkpIHsKLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCQl0cmVlVmlld2VyLmdldFRyZWUoKS5jbGVhckFsbCh0cnVlKTsKLQkJCQkJaWYgKGN0cmxfcGF0dGVybi5nZXRUZXh0KCkgIT0gbnVsbAotCQkJCQkJCSYmIGN0cmxfcGF0dGVybi5nZXRUZXh0KCkudHJpbSgpLmxlbmd0aCgpID4gMCkgewotCQkJCQkJcGF0dGVybiA9IGN0cmxfcGF0dGVybi5nZXRUZXh0KCkudHJpbSgpOwotCQkJCQkJLy8gaWYocGF0dGVybi5pbmRleE9mKEZpbHRlckNvbnN0YW50cy5BTllfU1RSSU5HKT4gLTEKLQkJCQkJCS8vIHx8IHBhdHRlcm4uaW5kZXhPZihGaWx0ZXJDb25zdGFudHMuQU5ZX0NIQVJBQ1RFUikgPgotCQkJCQkJLy8gLTEpewotCQkJCQkJLy8gICAgICAgICAgICAgIAotCQkJCQkJLy8gfWVsc2V7Ci0JCQkJCQkvLyBwYXR0ZXJuID0gcGF0dGVybitGaWx0ZXJDb25zdGFudHMuQU5ZX1NUUklORzsKLQkJCQkJCS8vIH0KLQkJCQkJfSBlbHNlIHsKLQkJCQkJCXBhdHRlcm4gPSBGaWx0ZXJDb25zdGFudHMuQU5ZX1NUUklORzsKLQkJCQkJCS8vIHJldHVybjsKLQkJCQkJfQotCQkJCQlyZWdleFBhdHRlcm4gPSBnZXRSZWdFeChwYXR0ZXJuKTsKLQkJCQkJaWYgKGhlbHBlciAhPSBudWxsKSB7Ci0JCQkJCQloZWxwZXIuc2V0UGF0dGVybihwYXR0ZXJuKTsKLQkJCQkJCWhlbHBlci5zZXRSZWdleFBhdHRlcm4ocmVnZXhQYXR0ZXJuKTsKLQkJCQkJCWhlbHBlci5zZXRGaWx0ZXJUeXBlU3RyKGZpbHRlclR5cGVTdHIpOwotCQkJCQkJaGVscGVyLnNldFRhYlN0cihmaWx0ZXJUeXBlU3RyKTsKLQkJCQkJfQotCQkJCQlyZWZyZXNoVHJlZVZpZXdlcigpOwotCQkJCX0KLQotCQkJfSk7Ci0JCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQkJfQotCi0JfQotCQotCXByaXZhdGUgVXBkYXRlVHJlZUpvYiB0cmVlSm9iID0gbmV3IFVwZGF0ZVRyZWVKb2IoQXV0aG9yaW5nVUlSZXNvdXJjZXMuSXRlbXNGaWx0ZXJEaWFsb2dfVXBkYXRlVHJlZUpvYl9uYW1lKTsKLQkKLQlwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcigpIHsKLQkJY3RybF9wYXR0ZXJuLmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotCQkJCQotCQkJICBpZiAodHJlZUpvYi5nZXRTdGF0ZSgpID09IEpvYi5OT05FKSB7Ci0JCQkgICAgLy8gV2Ugc2hvdWxkIHNjaGVkdWxlIHRoZSBqb2IgdG8gcnVuCi0JCQkgICAgdHJlZUpvYi5zY2hlZHVsZShkZWxheSk7Ci0JCQkgIH0gZWxzZSBpZiAodHJlZUpvYi5nZXRTdGF0ZSgpID09IEpvYi5XQUlUSU5HIHx8Ci0JCQkJCSAgdHJlZUpvYi5nZXRTdGF0ZSgpID09IEpvYi5TTEVFUElORyl7Ci0JCQkgICAgLy8gQ2FuY2VsIHRoZSBwcmV2aW91cyBqb2IsIGFuZCByZXNjaGVkdWxlCi0JCQkgICAgdHJlZUpvYi5jYW5jZWwoKTsKLQkJCSAgICB0cmVlSm9iLnNjaGVkdWxlKGRlbGF5KTsKLQkJCSAgfQotCQkJfQotCQl9KTsKLQotCQlmaWx0ZXJUeXBlLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkvLyB1cGRhdGVGb250TGlzdCgpOwotCQkJCWlmIChmaWx0ZXJUeXBlLmdldFNlbGVjdGlvbkluZGV4KCkgPiAtMSkgewotCQkJCQlmaWx0ZXJUeXBlU3RyID0gZmlsdGVyVHlwZS5nZXRJdGVtKGZpbHRlclR5cGUKLQkJCQkJCQkuZ2V0U2VsZWN0aW9uSW5kZXgoKSk7Ci0JCQkJfQotCQkJCWZpbHRlclR5cGVTdHIudHJpbSgpOwotCQkJCWlmIChoZWxwZXIgIT0gbnVsbCkgewotCQkJCQloZWxwZXIuc2V0UGF0dGVybihwYXR0ZXJuKTsKLQkJCQkJaGVscGVyLnNldFJlZ2V4UGF0dGVybihyZWdleFBhdHRlcm4pOwotCQkJCQloZWxwZXIuc2V0RmlsdGVyVHlwZVN0cihmaWx0ZXJUeXBlU3RyKTsKLQkJCQkJaGVscGVyLnNldFRhYlN0cihmaWx0ZXJUeXBlU3RyKTsKLQkJCQl9Ci0JCQkJLy8gaW5pdFByb3ZpZGVyRm9yVGFicygpOwotCQkJCXJlZnJlc2hUcmVlVmlld2VyKCk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBzZWxlY3Rpb25ldmVudCkgewotCQkJfQotCQl9KTsKLQkJZXhwYW5kQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewkJCQkKLQkJCQlleHBhbmRPckNvbGxhcHNlKHRydWUpOwotCQkJfQotCQl9KTsKLQkJY29sbGFwc2VCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJZXhwYW5kT3JDb2xsYXBzZShmYWxzZSk7Ci0JCQl9Ci0JCX0pOwotCi0JfQotCi0JcHVibGljIEFycmF5TGlzdCBnZXRTZWxlY3RlZEl0ZW1zKCkgewotCQlyZXR1cm4gc2VsZWN0ZWRMaXN0OwotCX0KLQotCXByaXZhdGUgdm9pZCBpbml0UHJvdmlkZXJGb3JUYWJzKCkgewotCi0JCWlmIChmaWx0ZXIgIT0gbnVsbCkgewotCQkJaWYgKGZpbHRlciBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuSUZpbHRlcikgewotCQkJCWlmKGZpbHRlciBpbnN0YW5jZW9mIElDYXRlZ29yeUZpbHRlcil7Ci0JCQkJCS8vIHNwZWNpYWwgaGFuZGxpbmcgZm9yIGNvbnRlbnRjYXRlZ29yeS4KLQkJCQkJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE1NzQ1MgotCQkJCQloZWxwZXIuc2V0Q29udGVudENhdGVnb3J5VGFiU3RyKHRhYlN0cik7Ci0JCQkJfQotCQkJCSgob3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5JRmlsdGVyKSBmaWx0ZXIpCi0JCQkJCQkuc2V0SGVscGVyKGhlbHBlcik7Ci0JCQl9IGVsc2UgaWYgKGZpbHRlciBpbnN0YW5jZW9mIERlc2NyaXB0b3JDb25maWd1cmF0aW9uRmlsdGVyKSB7Ci0JCQkJKChEZXNjcmlwdG9yQ29uZmlndXJhdGlvbkZpbHRlcikgZmlsdGVyKS5zZXRIZWxwZXIoaGVscGVyKTsKLQkJCX1lbHNlIGlmIChmaWx0ZXIgaW5zdGFuY2VvZiBFeFByb2Nlc3NBdXRob3JpbmdDb25maWd1cmF0b3IpIHsKLQkJCQkoKEV4UHJvY2Vzc0F1dGhvcmluZ0NvbmZpZ3VyYXRvcikgZmlsdGVyKS5zZXRIZWxwZXIoaGVscGVyKTsKLQkJCX0KLQkJfQotCQlpZiAoZmlsdGVyIGluc3RhbmNlb2YgSVByb2Nlc3NGaWx0ZXIpIHsKLQkJCWlmICh0YWJTdHIKLQkJCQkJLmVxdWFsc0lnbm9yZUNhc2UoRmlsdGVyQ29uc3RhbnRzLldPUktfUFJPRFVDVF9ERVNDUklQVE9SUykpIHsKLQkJCQlhZGFwdGVyRmFjdG9yeSA9VG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UuZ2V0UEJTRmlsdGVyX0FkYXB0ZXJGYWN0b3J5KGZpbHRlcik7Ci0JCQkJY29udGVudFByb3ZpZGVyID0gbmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKAotCQkJCQkJYWRhcHRlckZhY3RvcnkpOwotCQkJCWNvbXBvc2VkQWRhcHRlckZhY3RvcnkgPSBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRS5nZXRQQlNGaWx0ZXJfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpOwotCQkJCWxhYmVsUHJvdmlkZXIgPSBuZXcgQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyKAotCQkJCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJCQkJLmdldFBCU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpIHsKLQkJCQkJcHVibGljIFN0cmluZyBnZXRDb2x1bW5UZXh0KE9iamVjdCBvYmplY3QsIGludCBpbmRleCkgewotCQkJCQkJcmV0dXJuIHN1cGVyLmdldFRleHQob2JqZWN0KTsKLQkJCQkJfQotCQkJCQkKLQkJCQkJcHVibGljIEltYWdlIGdldENvbHVtbkltYWdlKE9iamVjdCBvYmplY3QsIGludCBpbmRleCkgewotCQkJCQkJcmV0dXJuIHN1cGVyLmdldEltYWdlKG9iamVjdCk7Ci0JCQkJCX0KLQkJCQl9OwotCQkJfSBlbHNlIGlmICh0YWJTdHIKLQkJCQkJLmVxdWFsc0lnbm9yZUNhc2UoRmlsdGVyQ29uc3RhbnRzLlJPTEVfREVTQ1JJUFRPUlMpKSB7Ci0JCQkJYWRhcHRlckZhY3RvcnkgPSBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCS5nZXRPQlNGaWx0ZXJfQWRhcHRlckZhY3RvcnkoZmlsdGVyKTsgCi0JCQkJY29udGVudFByb3ZpZGVyID0gbmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQkJCQljb21wb3NlZEFkYXB0ZXJGYWN0b3J5ID0gVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UuZ2V0T0JTRmlsdGVyX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKTsKLQkJCQlsYWJlbFByb3ZpZGVyID0gbmV3IEFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcigKLQkJCQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkJCS5nZXRPQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKXsKLQkJCQkJcHVibGljIFN0cmluZyBnZXRDb2x1bW5UZXh0KE9iamVjdCBvYmplY3QsIGludCBpbmRleCkgewotCQkJCQkJcmV0dXJuIHN1cGVyLmdldFRleHQob2JqZWN0KTsKLQkJCQkJfQotCQkJCQkKLQkJCQkJcHVibGljIEltYWdlIGdldENvbHVtbkltYWdlKE9iamVjdCBvYmplY3QsIGludCBpbmRleCkgewotCQkJCQkJcmV0dXJuIHN1cGVyLmdldEltYWdlKG9iamVjdCk7Ci0JCQkJCX0KLQkJCQl9OwotCQkJfQotCQl9IGVsc2UgewotCQkJYWRhcHRlckZhY3RvcnkgPSBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkJLmdldEl0ZW1zRmlsdGVyX0FkYXB0ZXJGYWN0b3J5KGZpbHRlcik7IAotCQkJY29udGVudFByb3ZpZGVyID0gbmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQkJCWNvbXBvc2VkQWRhcHRlckZhY3RvcnkgPSBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRS5nZXRJdGVtc0ZpbHRlcl9Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRFeGlzdGluZ0VsZW1lbnRzKExpc3QgbGlzdCkgewotCQl0aGlzLmFscmVhZHlTZWxlY3RlZExpc3QgPSBsaXN0OwotCQlpZiAoaGVscGVyICE9IG51bGwpIHsKLQkJCWhlbHBlci5zZXRBbHJlYWR5U2VsZWN0ZWRMaXN0KGxpc3QpOwotCQl9Ci0JfQotCi0JcHVibGljIEZpbHRlckhlbHBlciBnZXRIZWxwZXIoKSB7Ci0JCXJldHVybiB0aGlzLmhlbHBlcjsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nW10gZ2V0RmlsdGVyVHlwZUFycmF5KCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIHNldHMgdGhlIENvbnRlbnRQcm92aWRlciB1c2VkIGJ5IFRyZWVWaWV3ZXIuCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29udGVudFByb3ZpZGVyKElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyIGNvbnRlbnRQcm92aWRlciwKLQkJCUNvbXBvc2VkQWRhcHRlckZhY3RvcnkgY29tcG9zZWRBZGFwdGVyRmFjdG9yeSkgewotCQl0aGlzLmNvbnRlbnRQcm92aWRlciA9IGNvbnRlbnRQcm92aWRlcjsKLQkJdGhpcy5jb21wb3NlZEFkYXB0ZXJGYWN0b3J5ID0gY29tcG9zZWRBZGFwdGVyRmFjdG9yeTsKLQl9Ci0KLQkvKgotCSAqIFBhc3NpbmcgU3RyaW5nW10gYXJyYXkgZmlsbHMgdGhlIEZpbHRlclR5cGUgbGlzdCBpbiBkcm9wZG93biBjb21ibyBib3guCi0JICovCi0JcHVibGljIHZvaWQgc2V0VHlwZXMoU3RyaW5nW10gc3RyKSB7Ci0JCXRoaXMudHlwZXMgPSBzdHI7Ci0JfQotCi0JLyoKLQkgKiBzZXQgdGhlIEZpbHRlci4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGaWx0ZXIoSUZpbHRlciBmaWx0ZXIpIHsKLQkJdGhpcy5maWx0ZXIgPSBmaWx0ZXI7Ci0JCWlmIChoZWxwZXIgIT0gbnVsbCkgewotCQkJaWYgKHRoaXMuZmlsdGVyIGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5JRmlsdGVyKSB7Ci0JCQkJKChvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLklGaWx0ZXIpIHRoaXMuZmlsdGVyKQotCQkJCQkJLnNldEhlbHBlcihoZWxwZXIpOwotCQkJfSBlbHNlIGlmICh0aGlzLmZpbHRlciBpbnN0YW5jZW9mIERlc2NyaXB0b3JDb25maWd1cmF0aW9uRmlsdGVyKSB7Ci0JCQkJKChEZXNjcmlwdG9yQ29uZmlndXJhdGlvbkZpbHRlcikgdGhpcy5maWx0ZXIpLnNldEhlbHBlcihoZWxwZXIpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0SW5wdXQoT2JqZWN0IGlucHV0KSB7Ci0JCWlmIChpbnB1dCAhPSBudWxsKSB7Ci0JCQl0aGlzLmlucHV0ID0gaW5wdXQ7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRWaWV3ZXJMYWJlbChTdHJpbmcgdmlld2VyTGFiZWwpIHsKLQkJdGhpcy52aWV3ZXJMYWJlbCA9IHZpZXdlckxhYmVsOwotCX0KLQkvKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHJlZnJlc2hUcmVlVmlld2VyKCl7Ci0JCXRyeSB7Ci0JCQkvLyBUbyBpbXByb3ZlIHBlcmZvcm1hbmNlIG9mIGZpbHRlciwgZmlsdGVyIGZpcnN0IGFuZCByZXNldCB2aXNpYmxlIHRvCi0JCQkvLyB0cnVlLlRoaXMgd2lsbCBhdm9pZCB0aGUgZmxpY2tlcmluZyBpbiBVSSBhdCB0aW1lIG9mIGZpbHRlcmluZwotCQkJLy8gZWxlbWVudHMgaW4gdGhlIHRyZWUgc3RydWN0dXJlCi0JCQkKLQkJCXRyZWVWaWV3ZXIuZ2V0VHJlZSgpLmNsZWFyQWxsKHRydWUpOwotCQkJdHJlZVZpZXdlci5nZXRUcmVlKCkuc2V0VmlzaWJsZShmYWxzZSk7Ci0JCQl0cmVlVmlld2VyLnJlZnJlc2goKTsKLQkJCXRyZWVWaWV3ZXIuZXhwYW5kQWxsKCk7Ci0JCQl0cmVlVmlld2VyLmdldFRyZWUoKS5zZXRWaXNpYmxlKHRydWUpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQl9Ci0JfQotCS8qCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgZXhwYW5kT3JDb2xsYXBzZShib29sZWFuIGV4cGFuZCl7Ci0JCXRyZWVWaWV3ZXIuZ2V0VHJlZSgpLnNldFZpc2libGUoZmFsc2UpOwotCQlpZihleHBhbmQpewotCQkJdHJlZVZpZXdlci5leHBhbmRBbGwoKTsKLQkJfWVsc2V7Ci0JCQl0cmVlVmlld2VyLmNvbGxhcHNlQWxsKCk7Ci0JCX0KLQkJdHJlZVZpZXdlci5nZXRUcmVlKCkuc2V0VmlzaWJsZSh0cnVlKTsKLQl9Ci0JCi0JcHJpdmF0ZSBQYXR0ZXJuIGdldFJlZ0V4KFN0cmluZyBwYXR0ZXJuKXsKLQkJdHJ5ewotCQkJcmV0dXJuIFBhdHRlcm5Db25zdHJ1Y3Rvci5jcmVhdGVQYXR0ZXJuKHBhdHRlcm4sIGZhbHNlLCBmYWxzZSk7Ci0JCX1jYXRjaChFeGNlcHRpb24gZSl7Ci0JCQlyZXR1cm4gUGF0dGVybkNvbnN0cnVjdG9yLmNyZWF0ZVBhdHRlcm4oRmlsdGVyQ29uc3RhbnRzLkFOWV9TVFJJTkcsIGZhbHNlLCBmYWxzZSk7IAotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZGlhbG9ncy9NZXRob2RBZGRJbWFnZURpYWxvZy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9kaWFsb2dzL01ldGhvZEFkZEltYWdlRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhNTgwNmIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9kaWFsb2dzL01ldGhvZEFkZEltYWdlRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5kaWFsb2dzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLk5ldFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5SZXNvdXJjZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuZGlhbG9ncy5BZGRJbWFnZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkZpbGVEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLQotCi0vKioKLSAqIFByb21wdHMgdGhlIHVzZXIgdG8gc3BlY2lmeSB0aGUgaW1hZ2UgdGhhdCB3aWxsIGJlIHVzZWQgdG8gY3JlYXRlIGEgSFRNTAotICogPGltZz4gdGFnIGluIHRoZSBSaWNoIFRleHQgRWRpdG9yLgotICogCi0gKiBAYXV0aG9yIEplZmYgSGFyZHkKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTWV0aG9kQWRkSW1hZ2VEaWFsb2cgZXh0ZW5kcyBBZGRJbWFnZURpYWxvZyB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUFYX0hFSUdIVCA9IDYwMDsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNQVhfV0lEVEggPSA2MDA7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9IRUlHSFQgPSAyMDA7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9XSURUSCA9IDIwMDsKLQotCXByaXZhdGUgTWV0aG9kRWxlbWVudCBtZXRob2RFbGVtZW50OwotCi0JcHJpdmF0ZSBGaWxlIGZpbGVUb0NvcHk7Ci0KLQlwcml2YXRlIFN0cmluZyBlbGVtZW50TG9jOwotCi0JcHJpdmF0ZSBpbnQgaGVpZ2h0ID0gREVGQVVMVF9IRUlHSFQ7Ci0KLQlwcml2YXRlIGludCB3aWR0aCA9IERFRkFVTFRfV0lEVEg7Ci0KLQlwcml2YXRlIFN0cmluZyBhbHRUYWcgPSAiIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBUZXh0IGhlaWdodFRleHQ7Ci0KLQlwcml2YXRlIFRleHQgd2lkdGhUZXh0OwotCi0JcHJpdmF0ZSBUZXh0IGFsdFRhZ1RleHQ7Ci0KLQlwcml2YXRlIE1vZGlmeUxpc3RlbmVyIG1vZGlmeUxpc3RlbmVyID0gbmV3IE1vZGlmeUxpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGV2ZW50KSB7Ci0JCQlpZiAob2tCdXR0b24gIT0gbnVsbCkgewotCQkJCXRyeSB7Ci0JCQkJCWlmIChldmVudC53aWRnZXQgPT0gdXJsVGV4dCkgewotCQkJCQkJRmlsZSB1cmxGaWxlID0gbmV3IEZpbGUodXJsVGV4dC5nZXRUZXh0KCkudHJpbSgpKTsKLQkJCQkJCWlmICh1cmxGaWxlLmlzQWJzb2x1dGUoKSkgewotCQkJCQkJCWZpbGVUb0NvcHkgPSB1cmxGaWxlOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlmaWxlVG9Db3B5ID0gbmV3IEZpbGUoZWxlbWVudExvYywgdXJsVGV4dC5nZXRUZXh0KCkudHJpbSgpKTsKLQkJCQkJCX0KLQkJCQkJCWlmIChmaWxlVG9Db3B5LmlzRmlsZSgpICYmIGZpbGVUb0NvcHkuY2FuUmVhZCgpKSB7Ci0JCQkJCQkJLy8gVHJ5IHRvIGdldCB0aGUgaW1hZ2UgaW5mby4KLQkJCQkJCQlzZXRJbWFnZUluZm8oZmlsZVRvQ29weS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJaGVpZ2h0ID0gSW50ZWdlci5wYXJzZUludChoZWlnaHRUZXh0LmdldFRleHQoKS50cmltKCkpOwotCQkJCQl3aWR0aCA9IEludGVnZXIucGFyc2VJbnQod2lkdGhUZXh0LmdldFRleHQoKS50cmltKCkpOwotCQkJCQlva0J1dHRvbi5zZXRFbmFibGVkKGZpbGVUb0NvcHkuaXNGaWxlKCkgJiYgZmlsZVRvQ29weS5jYW5SZWFkKCkgJiYgaGVpZ2h0ID4gMAotCQkJCQkJCSYmIHdpZHRoID4gMCk7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJLy8gaWYgdGhlIGFib3ZlIGZhaWxzLCBsZXQgdGhlIHVzZXIgY2xpY2sgb2sgaWYgdGhlIGZpbGUgaXMgcmVhZGFibGUKLQkJCQkJb2tCdXR0b24uc2V0RW5hYmxlZChmaWxlVG9Db3B5LmlzRmlsZSgpICYmIGZpbGVUb0NvcHkuY2FuUmVhZCgpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9OwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICBUaGUgcGFyZW50IHNoZWxsLgotCSAqIEBwYXJhbSBtZXRob2RFbGVtZW50Ci0JICogICAgICAgICAgICBBIG1ldGhvZCBlbGVtZW50LgotCSAqLwotCXB1YmxpYyBNZXRob2RBZGRJbWFnZURpYWxvZyhTaGVsbCBwYXJlbnQsIE1ldGhvZEVsZW1lbnQgbWV0aG9kRWxlbWVudCkgewotCQlzdXBlcihwYXJlbnQpOwotCQl0aGlzLm1ldGhvZEVsZW1lbnQgPSBtZXRob2RFbGVtZW50OwotCQllbGVtZW50TG9jID0gUmVzb3VyY2VIZWxwZXIuZ2V0Rm9sZGVyQWJzb2x1dGVQYXRoKG1ldGhvZEVsZW1lbnQpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmRpYWxvZ3MuQmFzZURpYWxvZyNjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZQotCSAqICAgICAgcGFyZW50KQotCSAqLwotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gKENvbXBvc2l0ZSkgc3VwZXIuY3JlYXRlRGlhbG9nQXJlYShwYXJlbnQpOwotCi0JCSgoR3JpZExheW91dCkgY29tcG9zaXRlLmdldExheW91dCgpKS5udW1Db2x1bW5zID0gNDsKLQkJKChHcmlkRGF0YSkgdXJsVGV4dC5nZXRMYXlvdXREYXRhKCkpLmhvcml6b250YWxTcGFuID0gMjsKLQotCQl1cmxUZXh0LnJlbW92ZU1vZGlmeUxpc3RlbmVyKHVybFRleHRMaXN0ZW5lcik7Ci0JCXVybFRleHQuYWRkTW9kaWZ5TGlzdGVuZXIobW9kaWZ5TGlzdGVuZXIpOwotCi0JCWJyb3dzZUJ1dHRvbi5yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lcihicm93c2VTZWxlY3Rpb25BZGFwdGVyKTsKLQkJYnJvd3NlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlGaWxlRGlhbG9nIGRpYWxvZyA9IG5ldyBGaWxlRGlhbG9nKERpc3BsYXkuZ2V0Q3VycmVudCgpCi0JCQkJCQkuZ2V0QWN0aXZlU2hlbGwoKSwgU1dULk9QRU4pOwotCQkJCWRpYWxvZy5zZXRGaWx0ZXJQYXRoKFJlc291cmNlSGVscGVyLmdldEZvbGRlckFic29sdXRlUGF0aChtZXRob2RFbGVtZW50KSk7Ci0JCQkJU3RyaW5nIGF0dGFjaEZpbGUgPSBkaWFsb2cub3BlbigpOwotCQkJCWlmIChhdHRhY2hGaWxlICE9IG51bGwgJiYgYXR0YWNoRmlsZS5sZW5ndGgoKSA+IDApIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCUZpbGUgZmlsZSA9IG5ldyBGaWxlKGRpYWxvZy5nZXRGaWx0ZXJQYXRoKCksIGRpYWxvZwotCQkJCQkJCQkuZ2V0RmlsZU5hbWUoKSk7Ci0JCQkJCQl1cmxUZXh0LnNldFRleHQoZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0JCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlsb2dnZXIubG9nRXJyb3IoZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JCUxhYmVsIGhlaWdodExhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQloZWlnaHRMYWJlbC5zZXRUZXh0KEF1dGhvcmluZ1VJUmVzb3VyY2VzLmhlaWdodExhYmVsX3RleHQpOyAKLQotCQloZWlnaHRUZXh0ID0gbmV3IFRleHQoY29tcG9zaXRlLCBTV1QuQk9SREVSKTsKLQkJaGVpZ2h0VGV4dC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YSgpKTsKLQkJaGVpZ2h0VGV4dC5zZXRUZXh0KCIiICsgREVGQVVMVF9IRUlHSFQpOyAvLyROT04tTkxTLTEkCi0JCWhlaWdodFRleHQuYWRkTW9kaWZ5TGlzdGVuZXIobW9kaWZ5TGlzdGVuZXIpOwotCi0JCUxhYmVsIGltYWdlU2l6ZUxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULldSQVApOwotCQl7Ci0JCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQkJZ2Qud2lkdGhIaW50ID0gMzAwOwotCQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQkJZ2QudmVydGljYWxTcGFuID0gMjsKLQkJCWdkLmhvcml6b250YWxJbmRlbnQgPSAxMDsKLQkJCWltYWdlU2l6ZUxhYmVsLnNldExheW91dERhdGEoZ2QpOwotCQl9Ci0JCWltYWdlU2l6ZUxhYmVsLnNldFRleHQoQXV0aG9yaW5nVUlSZXNvdXJjZXMuaW1hZ2VTaXplTGFiZWxfdGV4dCk7IAotCi0JCUxhYmVsIHdpZHRoTGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCXdpZHRoTGFiZWwuc2V0VGV4dChBdXRob3JpbmdVSVJlc291cmNlcy53aWR0aExhYmVsX3RleHQpOyAKLQotCQl3aWR0aFRleHQgPSBuZXcgVGV4dChjb21wb3NpdGUsIFNXVC5CT1JERVIpOwotCQl3aWR0aFRleHQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoKSk7Ci0JCXdpZHRoVGV4dC5zZXRUZXh0KCIiICsgREVGQVVMVF9XSURUSCk7IC8vJE5PTi1OTFMtMSQKLQkJd2lkdGhUZXh0LmFkZE1vZGlmeUxpc3RlbmVyKG1vZGlmeUxpc3RlbmVyKTsKLQotCQlMYWJlbCBhbHRMYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJYWx0TGFiZWwuc2V0VGV4dChBdXRob3JpbmdVSVJlc291cmNlcy5hbHRUYWdMYWJlbF90ZXh0KTsgCi0JCWFsdFRhZ1RleHQgPSBuZXcgVGV4dChjb21wb3NpdGUsIFNXVC5CT1JERVIpOwotCQl7Ci0JCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSAzOwotCQkJYWx0VGFnVGV4dC5zZXRMYXlvdXREYXRhKGdkKTsKLQkJfQotCQlhbHRUYWdUZXh0LmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZXZlbnQpIHsKLQkJCQlhbHRUYWcgPSBhbHRUYWdUZXh0LmdldFRleHQoKS50cmltKCk7Ci0JCQl9Ci0JCX0pOwotCi0JCXJldHVybiBjb21wb3NpdGU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZmlsZSB0byBiZSBjb3BpZWQgdG8gYSByZXNvdXJjZSBmb2xkZXIuCi0JICovCi0JcHVibGljIEZpbGUgZ2V0RmlsZVRvQ29weSgpIHsKLQkJcmV0dXJuIGZpbGVUb0NvcHk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldEltYWdlSW5mbyhTdHJpbmcgaW1hZ2VOYW1lKSB7Ci0JCUZpbGUgaW1hZ2VGaWxlID0gbmV3IEZpbGUoaW1hZ2VOYW1lKTsKLQkJaWYgKGltYWdlRmlsZS5leGlzdHMoKSkgewotCQkJdHJ5IHsKLQkJCQlJbWFnZURhdGEgaW1hZ2VEYXRhID0gbmV3IEltYWdlRGF0YShpbWFnZU5hbWUpOwotCQkJCWhlaWdodFRleHQuc2V0VGV4dChTdHJpbmcudmFsdWVPZihpbWFnZURhdGEuaGVpZ2h0KSk7Ci0JCQkJd2lkdGhUZXh0LnNldFRleHQoU3RyaW5nLnZhbHVlT2YoaW1hZ2VEYXRhLndpZHRoKSk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCS8vIHNldCBkZWZhdWx0IGhlaWdodC93aWR0aCBpZiB3ZSBjYW4ndCBvYnRhaW4gSW1hZ2VEYXRhCi0JCQkJaGVpZ2h0VGV4dC5zZXRUZXh0KFN0cmluZy52YWx1ZU9mKERFRkFVTFRfSEVJR0hUKSk7Ci0JCQkJd2lkdGhUZXh0LnNldFRleHQoU3RyaW5nLnZhbHVlT2YoREVGQVVMVF9XSURUSCkpOwotCQkJfQotCQl9IGVsc2UgewotCQkJaGVpZ2h0VGV4dC5zZXRUZXh0KFN0cmluZy52YWx1ZU9mKERFRkFVTFRfSEVJR0hUKSk7Ci0JCQl3aWR0aFRleHQuc2V0VGV4dChTdHJpbmcudmFsdWVPZihERUZBVUxUX1dJRFRIKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBpbWFnZSBoZWlnaHQuCi0JICovCi0JcHVibGljIGludCBnZXRIZWlnaHQoKSB7Ci0JCXJldHVybiBNYXRoLm1pbihNQVhfSEVJR0hULCBNYXRoLm1heCgxMCwgaGVpZ2h0KSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgaW1hZ2Ugd2lkdGguCi0JICovCi0JcHVibGljIGludCBnZXRXaWR0aCgpIHsKLQkJcmV0dXJuIE1hdGgubWluKE1BWF9XSURUSCwgTWF0aC5tYXgoMTAsIHdpZHRoKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgaW1hZ2UgQUxUIHRhZy4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEFsdFRhZygpIHsKLQkJcmV0dXJuIGFsdFRhZzsKLQl9Ci0KLQkvKioKLQkgKiBDYWxsZWQgd2hlbiB0aGUgT0sgYnV0dG9uIGlzIHNlbGVjdGVkLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIG9rUHJlc3NlZCgpIHsKLQkJc3VwZXIub2tQcmVzc2VkKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2RpYWxvZ3MvTWV0aG9kQWRkTGlua0RpYWxvZy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9kaWFsb2dzL01ldGhvZEFkZExpbmtEaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzY3YjI1Yi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2RpYWxvZ3MvTWV0aG9kQWRkTGlua0RpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzE0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZGlhbG9nczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5maWx0ZXJzLkFkZExpbmtGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5yaWNodGV4dC5JTWV0aG9kUmljaFRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5OZXRVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLkZpbHRlckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5MaWJyYXJ5VUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5SZXNvdXJjZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmRpYWxvZ3MuQWRkTGlua0RpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWlsZXN0b25lOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRmlsZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotCi0vKioKLSAqIFByb21wdHMgdGhlIHVzZXIgdG8gc2VsZWN0IGEgbGluayB0eXBlIHRoYXQgd2lsbCBiZSB1c2VkIHRvIGNyZWF0ZSBhIEhUTUwgPGE+Ci0gKiB0YWcgaW4gdGhlIFJpY2ggVGV4dCBFZGl0b3IuCi0gKiAKLSAqIEBhdXRob3IgSmVmZiBIYXJkeQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXRob2RBZGRMaW5rRGlhbG9nIGV4dGVuZHMgQWRkTGlua0RpYWxvZyB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTElOS19VUkwgPSAwOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IExJTktfRklMRSA9IExJTktfVVJMICsgMTsKLQotCS8vIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBMSU5LX0VMRU1FTlRfTElOSyA9IExJTktfVVJMICsgMjsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBMSU5LX0VMRU1FTlRfTElOS19XSVRIX1RZUEUgPSBMSU5LX1VSTCArIDM7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTElOS19FTEVNRU5UX0xJTktfV0lUSF9VU0VSX1RFWFQgPSBMSU5LX1VSTCArIDQ7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBFTEVNRU5UX1RZUEVfTEFCRUxTID0gewotCQkJTGlicmFyeVVJUmVzb3VyY2VzLmxpbmtUb1VSTF9uYW1lLAotCQkJTGlicmFyeVVJUmVzb3VyY2VzLmxpbmtUb0ZpbGVfbmFtZSwKLQkJCUxpYnJhcnlVSVJlc291cmNlcy5lbGVtZW50TGlua19uYW1lLAotCQkJTGlicmFyeVVJUmVzb3VyY2VzLmVsZW1lbnRMaW5rV2l0aFR5cGVfbmFtZSwKLQkJCUxpYnJhcnlVSVJlc291cmNlcy5lbGVtZW50TGlua1dpdGhVc2VyVGV4dF9uYW1lIH07Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPUEVOX0xJTktfSU5fTkVXX1dJTkRPV19BVFRSSUJVVEUgPSAidGFyZ2V0PVwiX2JsYW5rXCIiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIElNZXRob2RSaWNoVGV4dCByaWNoVGV4dDsKLQotCXByaXZhdGUgTWV0aG9kRWxlbWVudCBtZXRob2RFbGVtZW50OwotCQotCXByaXZhdGUgU3RyaW5nIGVsZW1lbnRMb2M7Ci0KLQlwcml2YXRlIENvbWJvIGxpbmtUeXBlQ29tYm87Ci0KLQlwcml2YXRlIEJ1dHRvbiBicm93c2VCdXR0b247Ci0KLQlwcml2YXRlIEJ1dHRvbiBvcGVuTGlua0NoZWNrYm94OwotCi0JcHJpdmF0ZSBpbnQgbGlua1R5cGU7Ci0KLQlwcml2YXRlIGJvb2xlYW4gb3BlbkxpbmtJbk5ld1dpbmRvdyA9IHRydWU7Ci0KLQlwcml2YXRlIEZpbGUgZmlsZVRvQ29weTsKLQkKLQlwcml2YXRlIE1vZGlmeUxpc3RlbmVyIG1vZGlmeUxpc3RlbmVyID0gbmV3IE1vZGlmeUxpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGV2ZW50KSB7Ci0JCQlpZiAob2tCdXR0b24gIT0gbnVsbCkgewotCQkJCXRyeSB7Ci0JCQkJCWlmIChsaW5rVHlwZSA9PSBMSU5LX0ZJTEUgJiYgZXZlbnQud2lkZ2V0ID09IHVybFRleHQpIHsKLQkJCQkJCUZpbGUgdXJsRmlsZSA9IG5ldyBGaWxlKHVybFRleHQuZ2V0VGV4dCgpLnRyaW0oKSk7Ci0JCQkJCQlpZiAodXJsRmlsZS5pc0Fic29sdXRlKCkpIHsKLQkJCQkJCQlmaWxlVG9Db3B5ID0gdXJsRmlsZTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJZmlsZVRvQ29weSA9IG5ldyBGaWxlKGVsZW1lbnRMb2MsIHVybFRleHQuZ2V0VGV4dCgpLnRyaW0oKSk7Ci0JCQkJCQl9Ci0JCQkJCQlva0J1dHRvbi5zZXRFbmFibGVkKGZpbGVUb0NvcHkuaXNGaWxlKCkgJiYgZmlsZVRvQ29weS5jYW5SZWFkKCkpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJb2tCdXR0b24uc2V0RW5hYmxlZCh1cmxUZXh0LmdldFRleHQoKS50cmltKCkubGVuZ3RoKCkgPiAwKTsKLQkJCQkJfQotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCW9rQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCX0KLQkJCX0KLQkJfQotCX07Ci0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBzaGVsbC4KLQkgKiBAcGFyYW0gcmljaFRleHQKLQkgKiAgICAgICAgICAgIEEgcmljaCB0ZXh0IGNvbnRyb2wuCi0JICovCi0JcHVibGljIE1ldGhvZEFkZExpbmtEaWFsb2coU2hlbGwgcGFyZW50LCBJTWV0aG9kUmljaFRleHQgcmljaFRleHQpIHsKLQkJc3VwZXIocGFyZW50LCByaWNoVGV4dC5nZXRCYXNlUGF0aCgpKTsKLQkJdGhpcy5yaWNoVGV4dCA9IHJpY2hUZXh0OwotCQl0aGlzLm1ldGhvZEVsZW1lbnQgPSByaWNoVGV4dC5nZXRNZXRob2RFbGVtZW50KCk7Ci0JCWVsZW1lbnRMb2MgPSBSZXNvdXJjZUhlbHBlci5nZXRGb2xkZXJBYnNvbHV0ZVBhdGgobWV0aG9kRWxlbWVudCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuZGlhbG9ncy5CYXNlRGlhbG9nI2NyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlCi0JICogICAgICBwYXJlbnQpCi0JICovCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSAoQ29tcG9zaXRlKSBzdXBlci5jcmVhdGVEaWFsb2dBcmVhKHBhcmVudCk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gKEdyaWRMYXlvdXQpIGNvbXBvc2l0ZS5nZXRMYXlvdXQoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAzOwotCi0JCUxhYmVsIGxpbmtUeXBlTGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWxpbmtUeXBlTGFiZWwuc2V0VGV4dChBdXRob3JpbmdVSVJlc291cmNlcy5hZGRMaW5rRGlhbG9nX2xpbmtUeXBlKTsKLQkJbGlua1R5cGVMYWJlbC5tb3ZlQWJvdmUodXJsTGFiZWwpOwotCQkKLQkJdXJsVGV4dC5yZW1vdmVNb2RpZnlMaXN0ZW5lcih1cmxUZXh0TW9kaWZ5TGlzdGVuZXIpOwotCQl1cmxUZXh0LmFkZE1vZGlmeUxpc3RlbmVyKG1vZGlmeUxpc3RlbmVyKTsKLQotCi0JCWxpbmtUeXBlQ29tYm8gPSBuZXcgQ29tYm8oY29tcG9zaXRlLCBTV1QuQk9SREVSIHwgU1dULlJFQURfT05MWSk7Ci0JCUdyaWREYXRhIGNvbWJvR3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJY29tYm9HcmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCWxpbmtUeXBlQ29tYm8uc2V0TGF5b3V0RGF0YShjb21ib0dyaWREYXRhKTsKLQkJbGlua1R5cGVDb21iby5zZXRJdGVtcyhFTEVNRU5UX1RZUEVfTEFCRUxTKTsKLQkJbGlua1R5cGVDb21iby5zZXRUZXh0KEVMRU1FTlRfVFlQRV9MQUJFTFNbMF0pOwotCQlsaW5rVHlwZUNvbWJvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJbGlua1R5cGUgPSBsaW5rVHlwZUNvbWJvLmdldFNlbGVjdGlvbkluZGV4KCk7Ci0JCQkJYnJvd3NlQnV0dG9uLnNldEVuYWJsZWQobGlua1R5cGUgIT0gTElOS19VUkwpOwotCQkJCXVybERpc3BsYXlOYW1lTGFiZWwuc2V0RW5hYmxlZChsaW5rVHlwZSA9PSBMSU5LX1VSTCk7Ci0JCQkJdXJsRGlzcGxheU5hbWVUZXh0LnNldEVuYWJsZWQobGlua1R5cGUgPT0gTElOS19VUkwpOwotCQkJCWlmIChsaW5rVHlwZSA9PSBMSU5LX1VSTCkgewotCQkJCQl1cmxEaXNwbGF5TmFtZVRleHQKLQkJCQkJCQkuc2V0VGV4dChyaWNoVGV4dC5nZXRTZWxlY3RlZCgpLmdldFRleHQoKSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJdXJsRGlzcGxheU5hbWVUZXh0LnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJCW9wZW5MaW5rQ2hlY2tib3guc2V0RW5hYmxlZChsaW5rVHlwZSA9PSBMSU5LX1VSTAotCQkJCQkJfHwgbGlua1R5cGUgPT0gTElOS19GSUxFKTsKLQkJCQl1cmxUZXh0LnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0JCQkJaWYgKGxpbmtUeXBlICE9IExJTktfRklMRSkgewotCQkJCQlmaWxlVG9Db3B5ID0gbnVsbDsKLQkJCQl9Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJfQotCQl9KTsKLQkJbGlua1R5cGVDb21iby5tb3ZlQWJvdmUodXJsTGFiZWwpOwotCi0JCWJyb3dzZUJ1dHRvbiA9IG5ldyBCdXR0b24oY29tcG9zaXRlLCBTV1QuUFVTSCk7Ci0JCWJyb3dzZUJ1dHRvbi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YSgpKTsKLQkJYnJvd3NlQnV0dG9uLnNldFRleHQoQXV0aG9yaW5nVUlUZXh0LkJST1dTRV9CVVRUT05fVEVYVCk7Ci0JCWJyb3dzZUJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJYnJvd3NlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlpZiAobGlua1R5cGUgPT0gTElOS19GSUxFKSB7Ci0JCQkJCUZpbGVEaWFsb2cgZGlhbG9nID0gbmV3IEZpbGVEaWFsb2coRGlzcGxheS5nZXRDdXJyZW50KCkKLQkJCQkJCQkuZ2V0QWN0aXZlU2hlbGwoKSwgU1dULk9QRU4pOwotCQkJCQlkaWFsb2cuc2V0RmlsdGVyUGF0aChiYXNlUGF0aCk7Ci0JCQkJCVN0cmluZyBhdHRhY2hGaWxlID0gZGlhbG9nLm9wZW4oKTsKLQkJCQkJaWYgKGF0dGFjaEZpbGUgIT0gbnVsbCAmJiBhdHRhY2hGaWxlLmxlbmd0aCgpID4gMCkgewotCQkJCQkJdHJ5IHsKLQkJCQkJCQlGaWxlIGZpbGUgPSBuZXcgRmlsZShkaWFsb2cuZ2V0RmlsdGVyUGF0aCgpLCBkaWFsb2cKLQkJCQkJCQkJCS5nZXRGaWxlTmFtZSgpKTsKLQkJCQkJCQl1cmxUZXh0LnNldFRleHQoZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0JCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJCWxvZ2dlci5sb2dFcnJvcihlKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQkvLyBNZXRob2RFbGVtZW50IGxpbmsKLQkJCQllbHNlIHsKLQkJCQkJSUZpbHRlciBmaWx0ZXIgPSBuZXcgQWRkTGlua0ZpbHRlcigpIHsKLQkJCQkJCXByb3RlY3RlZCBib29sZWFuIGNoaWxkQWNjZXB0KE9iamVjdCBvYmopIHsKLQkJCQkJCQlpZiAob2JqIGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luKQotCQkJCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJCQlpZiAob2JqIGluc3RhbmNlb2YgTWV0aG9kQ29uZmlndXJhdGlvbikKLQkJCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQkJCWlmKG9iaiBpbnN0YW5jZW9mIE1pbGVzdG9uZSkgcmV0dXJuIGZhbHNlOwotCQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQkJfQotCQkJCQl9OwotCQkJCQlJdGVtc0ZpbHRlckRpYWxvZyBmZCA9IG5ldyBJdGVtc0ZpbHRlckRpYWxvZyhQbGF0Zm9ybVVJCi0JCQkJCQkJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpCi0JCQkJCQkJLmdldFNoZWxsKCksIGZpbHRlciwgbWV0aG9kRWxlbWVudCwKLQkJCQkJCQlGaWx0ZXJDb25zdGFudHMuQUxMX0VMRU1FTlRTKTsKLQkJCQkJZmQuc2V0QmxvY2tPbk9wZW4odHJ1ZSk7Ci0JCQkJCWZkLnNldFRpdGxlKEZpbHRlckNvbnN0YW50cy5BTExfRUxFTUVOVFMpOwotCQkJCQlmZC5vcGVuKCk7Ci0JCQkJCUFycmF5TGlzdCBzZWwgPSBmZC5nZXRTZWxlY3RlZEl0ZW1zKCk7Ci0JCQkJCWlmIChzZWwuc2l6ZSgpID4gMCkgewotCQkJCQkJTWV0aG9kRWxlbWVudCBzZWxlY3RlZEVsZW1lbnQgPSAoTWV0aG9kRWxlbWVudCkgc2VsCi0JCQkJCQkJCS5nZXQoMCk7Ci0JCQkJCQlTdHJpbmcgdXJsID0gbnVsbDsKLQkJCQkJCVN0cmluZyBocmVmID0gUmVzb3VyY2VIZWxwZXIuZ2V0VXJsKHNlbGVjdGVkRWxlbWVudCwKLQkJCQkJCQkJbWV0aG9kRWxlbWVudCwgImh0bWwiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJaWYgKGxpbmtUeXBlID09IExJTktfRUxFTUVOVF9MSU5LX1dJVEhfVVNFUl9URVhUKSB7Ci0JCQkJCQkJU3RyaW5nIGxpbmtOYW1lID0gKChSaWNoVGV4dEVkaXRvcikgcmljaFRleHQpCi0JCQkJCQkJCQkuZ2V0U2VsZWN0ZWQoKS5nZXRUZXh0KCk7Ci0JCQkJCQkJaWYgKGxpbmtOYW1lLnRyaW0oKS5sZW5ndGgoKSA9PSAwKQotCQkJCQkJCQlsaW5rTmFtZSA9IHNlbGVjdGVkRWxlbWVudC5nZXROYW1lKCk7Ci0JCQkJCQkJdXJsID0gUmVzb3VyY2VIZWxwZXIKLQkJCQkJCQkJCS5nZXRFbGVtZW50TGluayhzZWxlY3RlZEVsZW1lbnQsIGxpbmtOYW1lLAotCQkJCQkJCQkJCQkiZmlsZTovLyIgKyBocmVmKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlib29sZWFuIHdpdGhUeXBlID0gKGxpbmtUeXBlID09IExJTktfRUxFTUVOVF9MSU5LX1dJVEhfVFlQRSkgPyB0cnVlCi0JCQkJCQkJCQk6IGZhbHNlOwotCQkJCQkJCXVybCA9IFJlc291cmNlSGVscGVyCi0JCQkJCQkJCQkuZ2V0RWxlbWVudExpbmsoc2VsZWN0ZWRFbGVtZW50LCB3aXRoVHlwZSwKLQkJCQkJCQkJCQkJImZpbGU6Ly8iICsgaHJlZik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCX0KLQkJCQkJCXVybFRleHQuc2V0VGV4dCh1cmwpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9KTsKLQkJYnJvd3NlQnV0dG9uLm1vdmVBYm92ZSh1cmxEaXNwbGF5TmFtZUxhYmVsKTsKLQotCQlvcGVuTGlua0NoZWNrYm94ID0gbmV3IEJ1dHRvbihjb21wb3NpdGUsIFNXVC5DSEVDSyk7Ci0JCUdyaWREYXRhIGNoZWNrQm94R3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJY2hlY2tCb3hHcmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCW9wZW5MaW5rQ2hlY2tib3guc2V0TGF5b3V0RGF0YShjaGVja0JveEdyaWREYXRhKTsKLQkJb3BlbkxpbmtDaGVja2JveC5zZXRUZXh0KEF1dGhvcmluZ1VJUmVzb3VyY2VzLm9wZW5MaW5rQ2hlY2tib3hfdGV4dCk7Ci0JCW9wZW5MaW5rQ2hlY2tib3guc2V0U2VsZWN0aW9uKHRydWUpOwotCQlvcGVuTGlua0NoZWNrYm94LmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCW9wZW5MaW5rSW5OZXdXaW5kb3cgPSBvcGVuTGlua0NoZWNrYm94LmdldFNlbGVjdGlvbigpOwotCQkJfQotCQl9KTsKLQotCQl1cmxEaXNwbGF5TmFtZVRleHQuc2V0VGV4dChyaWNoVGV4dC5nZXRTZWxlY3RlZCgpLmdldFRleHQoKSk7Ci0KLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBmaWxlIHRvIGJlIGNvcGllZCB0byBhIHJlc291cmNlIGZvbGRlci4KLQkgKi8KLQlwdWJsaWMgRmlsZSBnZXRGaWxlVG9Db3B5KCkgewotCQlyZXR1cm4gZmlsZVRvQ29weTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBsaW5rIHNob3VsZCBiZSBvcGVuZWQgaW4gYSBuZXcgYnJvd3NlcgotCSAqIHdpbmRvdy4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBnZXRPcGVuTGlua0luTmV3V2luZG93KCkgewotCQlyZXR1cm4gb3BlbkxpbmtJbk5ld1dpbmRvdzsKLQl9Ci0KLQkvKioKLQkgKiBDYWxsZWQgd2hlbiB0aGUgT0sgYnV0dG9uIGlzIHNlbGVjdGVkLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIG9rUHJlc3NlZCgpIHsKLQkJU3RyaW5nIHVybCA9IHVybFRleHQuZ2V0VGV4dCgpOwotCQlpZiAodXJsICE9IG51bGwgJiYgdXJsLmxlbmd0aCgpID4gMCkgewotCQkJaWYgKGxpbmtUeXBlID09IExJTktfVVJMKSB7Ci0JCQkJU3RyaW5nIHVybERpc3BsYXlOYW1lID0gdXJsRGlzcGxheU5hbWVUZXh0LmdldFRleHQoKTsKLQkJCQlpZiAodXJsRGlzcGxheU5hbWUudHJpbSgpLmxlbmd0aCgpID09IDApIHsKLQkJCQkJdXJsRGlzcGxheU5hbWUgPSB1cmw7Ci0JCQkJfQotCQkJCVN0cmluZyBmdWxsVVJMID0gIjxhIGhyZWY9XCIiICsgLy8kTk9OLU5MUy0xJAotCQkJCQkJdXJsCi0JCQkJCQkrICJcIiIgKyAvLyROT04tTkxTLTEkCi0JCQkJCQkob3BlbkxpbmtJbk5ld1dpbmRvdyA/ICIgIiArIE9QRU5fTElOS19JTl9ORVdfV0lORE9XX0FUVFJJQlVURSA6ICIiKSArIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJIj4iICsgdXJsRGlzcGxheU5hbWUgKyAiPC9hPiI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCWxpbmsuc2V0VVJMKGZ1bGxVUkwpOwotCQkJfSBlbHNlIHsKLQkJCQlsaW5rLnNldFVSTCh1cmwpOwotCQkJfQotCQl9Ci0KLQkJLy8gU2V0IHdpZGdldCB0ZXh0IHRvIGJsYW5rIHNvIHN1cGVyLm9rUHJlc3NlZCBkb2Vzbid0IG92ZXJ3cml0ZSB0aGUKLQkJLy8gYWJvdmUuCi0JCXVybFRleHQucmVtb3ZlTW9kaWZ5TGlzdGVuZXIobW9kaWZ5TGlzdGVuZXIpOwotCQl1cmxUZXh0LnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0JCXN1cGVyLm9rUHJlc3NlZCgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9kaWFsb2dzL01ldGhvZEVsZW1lbnRGaWx0ZXJzUHJvYmxlbVZpZXdEaWFsb2cuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZGlhbG9ncy9NZXRob2RFbGVtZW50RmlsdGVyc1Byb2JsZW1WaWV3RGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyMWJiMDQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9kaWFsb2dzL01ldGhvZEVsZW1lbnRGaWx0ZXJzUHJvYmxlbVZpZXdEaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZGlhbG9nczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51aS51dGlsLlNXVFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLQotCi0vKioKLSAqIERpYWxvZyBmb3Igc2hvd2luZyBkZXRhaWxzIGluIFByb2JsZW0gVmlldwotICogCi0gKiBAYXV0aG9yIFdlaXBpbmcgTHUKLSAqIEBzaW5jZSAxLjUKLSAqLwotcHVibGljIGNsYXNzIE1ldGhvZEVsZW1lbnRGaWx0ZXJzUHJvYmxlbVZpZXdEaWFsb2cgZXh0ZW5kcyBEaWFsb2cgewotCQotCXB1YmxpYyBNZXRob2RFbGVtZW50RmlsdGVyc1Byb2JsZW1WaWV3RGlhbG9nKFNoZWxsIHBhcmVudFNoZWxsKSB7Ci0JCXN1cGVyKHBhcmVudFNoZWxsKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nI2NyZWF0ZURpYWxvZ0FyZWEob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlKQotCSAqLwotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gKENvbXBvc2l0ZSkgc3VwZXIuY3JlYXRlRGlhbG9nQXJlYShwYXJlbnQpOwotCQkJCQotCQlHcm91cCBvcHRpb25Hcm91cCA9IG5ldyBHcm91cChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJb3B0aW9uR3JvdXAuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDEsIGZhbHNlKSk7Ci0JCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMzsKLQkJb3B0aW9uR3JvdXAuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCW9wdGlvbkdyb3VwLnNldFRleHQoIk9wdGlvbnMiKTsKLQotCQlmb3IgKGludCBpID0gMTsgaSA8PSAxMDsgaSsrKSB7Ci0JCQlCdXR0b24gYnV0dG9uID0gU1dUVXRpbC5jcmVhdGVDaGVja2JveChvcHRpb25Hcm91cCwKLQkJCQkJIk9wdGlvbiAiICsgaSwgMSk7Ci0JCX0KLQotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdyNjb25maWd1cmVTaGVsbChvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVTaGVsbChTaGVsbCBuZXdTaGVsbCkgewotCQlzdXBlci5jb25maWd1cmVTaGVsbChuZXdTaGVsbCk7Ci0JCW5ld1NoZWxsLnNldFRleHQoIk1ldGhvZCBFbGVtZW50IEZpbHRlciBPcHRpb25zIik7IAotCX0JCi0JCi0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZGlhbG9ncy9Nb3ZlRGlhbG9nLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2RpYWxvZ3MvTW92ZURpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOWVmNTlkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZGlhbG9ncy9Nb3ZlRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MzQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5kaWFsb2dzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkFkZENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnZpZXdzLlZpZXdIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS51dGlsLk1zZ0RpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVHJhbnNpZW50R3JvdXBJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jYXRlZ29yeS5TdGFuZGFyZENhdGVnb3JpZXNJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLk1ldGhvZEVsZW1lbnRBZGRDb21tYW5kLk1vdmVPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51aS5Vc2VySW50ZXJhY3Rpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLkRlcGVuZGVuY3lDaGVja2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQXJ0aWZhY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50Q2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLlByb2dyZXNzTW9uaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ3Vyc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotCi0KLS8qKgotICogRGlhbG9nIGZvciBtb3ZpbmcgTWV0aG9kRWxlbWVudCB3aXRoaW4gTWV0aG9kTGlicmFyeS4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIE1vdmVEaWFsb2cgZXh0ZW5kcyBEaWFsb2cgaW1wbGVtZW50cyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIHsKLQotCXByaXZhdGUgVHJlZVZpZXdlciB0cmVlVmlld2VyOwotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uIGVsZW1lbnRzOwotCi0JLy8gcHJpdmF0ZSBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb247Ci0KLQlwcml2YXRlIGJvb2xlYW4gbG9ja2VkVUkgPSBmYWxzZTsKLQotCS8vIFRoZSBwcm9ncmVzcyBtb25pdG9yCi0JcHJpdmF0ZSBQcm9ncmVzc01vbml0b3JQYXJ0IHByb2dyZXNzTW9uaXRvclBhcnQ7Ci0KLQlwcml2YXRlIEVkaXRpbmdEb21haW4gZWRpdGluZ0RvbWFpbjsKLQotCXByaXZhdGUgT2JqZWN0IGRlc3RpbmF0aW9uOwotCi0JcHJpdmF0ZSBDdXJzb3Igd2FpdEN1cnNvcjsKLQotCXByaXZhdGUgYm9vbGVhbiBtb3Zpbmc7Ci0KLQlwdWJsaWMgTW92ZURpYWxvZyhTaGVsbCBwYXJlbnRTaGVsbCwgQ29sbGVjdGlvbiBlbGVtZW50c1RvTW92ZSwKLQkJCUVkaXRpbmdEb21haW4gZWRpdGluZ0RvbWFpbikgewotCQlzdXBlcihwYXJlbnRTaGVsbCk7Ci0JCXRoaXMuZWRpdGluZ0RvbWFpbiA9IGVkaXRpbmdEb21haW47Ci0KLQkJLy8gZmlsdGVyIG91dCB0aGUgcHJlZGVmaW5lZCBlbGVtZW50cyB0byBwcmV2ZW50IHRoZW0gZnJvbSBnZXR0aW5nIG1vdmVkCi0JCS8vCi0JCWVsZW1lbnRzID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBlbGVtZW50c1RvTW92ZS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gaXRlci5uZXh0KCk7Ci0JCQlPYmplY3QgZSA9IFRuZ1V0aWwudW53cmFwKGVsZW1lbnQpOwotCQkJaWYgKGUgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50Ci0JCQkJCSYmIFRuZ1V0aWwuaXNQcmVkZWZpbmVkKChNZXRob2RFbGVtZW50KSBlKSkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJZWxlbWVudHMuYWRkKGVsZW1lbnQpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZyNjcmVhdGVEaWFsb2dBcmVhKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKLQkgKi8KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IChDb21wb3NpdGUpIHN1cGVyLmNyZWF0ZURpYWxvZ0FyZWEocGFyZW50KTsKLQotCQlHcmlkTGF5b3V0IGxheW91dCA9IChHcmlkTGF5b3V0KSBjb21wb3NpdGUuZ2V0TGF5b3V0KCk7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDEwOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMTA7Ci0KLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWxhYmVsLnNldFRleHQoQXV0aG9yaW5nVUlSZXNvdXJjZXMuTW92ZURpYWxvZ19kZXN0aW5hdGlvbl90ZXh0KTsgCi0JCUdyaWREYXRhIGxheW91dERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkJFR0lOTklORyk7Ci0JCWxhYmVsLnNldExheW91dERhdGEobGF5b3V0RGF0YSk7Ci0KLQkJdHJlZVZpZXdlciA9IG5ldyBUcmVlVmlld2VyKGNvbXBvc2l0ZSwgU1dULlNJTkdMRSB8IFNXVC5IX1NDUk9MTAotCQkJCXwgU1dULlZfU0NST0xMIHwgU1dULkJPUkRFUik7Ci0JCUFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5ID0gVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCk7Ci0JCXRyZWVWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihuZXcgQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyKAotCQkJCWFkYXB0ZXJGYWN0b3J5KSk7Ci0JCXRyZWVWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcigKLQkJCQlhZGFwdGVyRmFjdG9yeSkpOwotCQl0cmVlVmlld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcih0aGlzKTsKLQkJLy8gdHJlZVZpZXdlci5hZGREb3VibGVDbGlja0xpc3RlbmVyKHRoaXMpOwotCi0JCUdyaWREYXRhIHNwZWMgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJewotCQkJc3BlYy53aWR0aEhpbnQgPSAzMDA7Ci0JCQlzcGVjLmhlaWdodEhpbnQgPSAzMDA7Ci0JCQl0cmVlVmlld2VyLmdldENvbnRyb2woKS5zZXRMYXlvdXREYXRhKHNwZWMpOwotCQl9Ci0KLQkJdHJlZVZpZXdlci5zZXRJbnB1dChMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCkpOwotCi0JCS8vIEluc2VydCBhIHByb2dyZXNzIG1vbml0b3IKLQkJR3JpZExheW91dCBwbWxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCXBtbGF5b3V0Lm51bUNvbHVtbnMgPSAxOwotCQlwcm9ncmVzc01vbml0b3JQYXJ0ID0gY3JlYXRlUHJvZ3Jlc3NNb25pdG9yUGFydChjb21wb3NpdGUsIHBtbGF5b3V0KTsKLQkJcHJvZ3Jlc3NNb25pdG9yUGFydAotCQkJCS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJcHJvZ3Jlc3NNb25pdG9yUGFydC5zZXRWaXNpYmxlKGZhbHNlKTsKLQotCQl3YWl0Q3Vyc29yID0gcGFyZW50LmdldFNoZWxsKCkuZ2V0RGlzcGxheSgpLmdldFN5c3RlbUN1cnNvcigKLQkJCQlTV1QuQ1VSU09SX1dBSVQpOwotCi0JCXJldHVybiBjb21wb3NpdGU7Ci0JfQotCi0JcHJvdGVjdGVkIFByb2dyZXNzTW9uaXRvclBhcnQgY3JlYXRlUHJvZ3Jlc3NNb25pdG9yUGFydCgKLQkJCUNvbXBvc2l0ZSBjb21wb3NpdGUsIEdyaWRMYXlvdXQgcG1sYXlvdXQpIHsKLQkJcmV0dXJuIG5ldyBQcm9ncmVzc01vbml0b3JQYXJ0KGNvbXBvc2l0ZSwgcG1sYXlvdXQsIFNXVC5ERUZBVUxUKSB7Ci0JCQlTdHJpbmcgY3VycmVudFRhc2sgPSBudWxsOwotCi0JCQkvKgotCQkJICogKG5vbi1KYXZhZG9jKQotCQkJICogCi0JCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5Qcm9ncmVzc01vbml0b3JQYXJ0I3NldEJsb2NrZWQob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXMpCi0JCQkgKi8KLQkJCXB1YmxpYyB2b2lkIHNldEJsb2NrZWQoSVN0YXR1cyByZWFzb24pIHsKLQkJCQlzdXBlci5zZXRCbG9ja2VkKHJlYXNvbik7Ci0JCQkJaWYgKCFsb2NrZWRVSSkvLyBEbyBub3Qgc2hvdyBibG9ja2VkIGlmIHdlIGFyZSBsb2NraW5nIHRoZSBVSQotCQkJCQlnZXRCbG9ja2VkSGFuZGxlcigpLnNob3dCbG9ja2VkKGdldFNoZWxsKCksIHRoaXMsIHJlYXNvbiwKLQkJCQkJCQljdXJyZW50VGFzayk7Ci0JCQl9Ci0KLQkJCS8qCi0JCQkgKiAobm9uLUphdmFkb2MpCi0JCQkgKiAKLQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLlByb2dyZXNzTW9uaXRvclBhcnQjY2xlYXJCbG9ja2VkKCkKLQkJCSAqLwotCQkJcHVibGljIHZvaWQgY2xlYXJCbG9ja2VkKCkgewotCQkJCXN1cGVyLmNsZWFyQmxvY2tlZCgpOwotCQkJCWlmICghbG9ja2VkVUkpLy8gRG8gbm90IHZsZWFyIGlmIHdlIG5ldmVyIHNldCBpdAotCQkJCQlnZXRCbG9ja2VkSGFuZGxlcigpLmNsZWFyQmxvY2tlZCgpOwotCQkJfQotCi0JCQkvKgotCQkJICogKG5vbi1KYXZhZG9jKQotCQkJICogCi0JCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5Qcm9ncmVzc01vbml0b3JQYXJ0I2JlZ2luVGFzayhqYXZhLmxhbmcuU3RyaW5nLAotCQkJICogICAgICBpbnQpCi0JCQkgKi8KLQkJCXB1YmxpYyB2b2lkIGJlZ2luVGFzayhTdHJpbmcgbmFtZSwgaW50IHRvdGFsV29yaykgewotCQkJCXN1cGVyLmJlZ2luVGFzayhuYW1lLCB0b3RhbFdvcmspOwotCQkJCWN1cnJlbnRUYXNrID0gbmFtZTsKLQkJCX0KLQotCQkJLyoKLQkJCSAqIChub24tSmF2YWRvYykKLQkJCSAqIAotCQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuUHJvZ3Jlc3NNb25pdG9yUGFydCNzZXRUYXNrTmFtZShqYXZhLmxhbmcuU3RyaW5nKQotCQkJICovCi0JCQlwdWJsaWMgdm9pZCBzZXRUYXNrTmFtZShTdHJpbmcgbmFtZSkgewotCQkJCXN1cGVyLnNldFRhc2tOYW1lKG5hbWUpOwotCQkJCWN1cnJlbnRUYXNrID0gbmFtZTsKLQkJCX0KLQotCQkJLyoKLQkJCSAqIChub24tSmF2YWRvYykKLQkJCSAqIAotCQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuUHJvZ3Jlc3NNb25pdG9yUGFydCNzdWJUYXNrKGphdmEubGFuZy5TdHJpbmcpCi0JCQkgKi8KLQkJCXB1YmxpYyB2b2lkIHN1YlRhc2soU3RyaW5nIG5hbWUpIHsKLQkJCQlzdXBlci5zdWJUYXNrKG5hbWUpOwotCQkJCS8vIElmIHdlIGhhdmVuJ3QgZ290IGFueXRoaW5nIHlldCB1c2UgdGhpcyB2YWx1ZSBmb3IgbW9yZQotCQkJCS8vIGNvbnRleHQKLQkJCQlpZiAoY3VycmVudFRhc2sgPT0gbnVsbCkKLQkJCQkJY3VycmVudFRhc2sgPSBuYW1lOwotCQkJfQotCQl9OwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdyNjb25maWd1cmVTaGVsbChvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVTaGVsbChTaGVsbCBuZXdTaGVsbCkgewotCQlzdXBlci5jb25maWd1cmVTaGVsbChuZXdTaGVsbCk7Ci0JCW5ld1NoZWxsLnNldFRleHQoQXV0aG9yaW5nVUlSZXNvdXJjZXMuTW92ZURpYWxvZ19tb3ZlX3RleHQpOyAKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciNzZWxlY3Rpb25DaGFuZ2VkKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCWRlc3RpbmF0aW9uID0gVG5nVXRpbC51bndyYXAoKChJU3RydWN0dXJlZFNlbGVjdGlvbikgZXZlbnQKLQkJCQkuZ2V0U2VsZWN0aW9uKCkpLmdldEZpcnN0RWxlbWVudCgpKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nI29rUHJlc3NlZCgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgb2tQcmVzc2VkKCkgewotCQlpZiAoZG9Nb3ZlKCkpIHsKLQkJCXN1cGVyLm9rUHJlc3NlZCgpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzVmFsaWREZXN0aW5hdGlvbigpIHsKLQkJLy8gcHJldmVudGluZyBtb3ZpbmcgZWxlbWVudHMgdG8gY2F0ZWdvcnkKLQkJLy8KLQkJaWYgKGRlc3RpbmF0aW9uIGluc3RhbmNlb2YgQ29udGVudENhdGVnb3J5KSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQkvLyBkbyBub3QgYWxsb3cgbW92aW5nIGludG8gU3RhbmRhcmQgQ2F0ZWdvcmllcwotCQlpZiAoZGVzdGluYXRpb24gaW5zdGFuY2VvZiBTdGFuZGFyZENhdGVnb3JpZXNJdGVtUHJvdmlkZXIpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCS8vIGNoZWNrIGNvbnRhaW5lcnMgZm9yIGNvbXBhdGlibGUgdHlwZXMgd2lsbCBub3Qgd29yayBpZiB3ZSB3YW50IHRvIG1vdmUgYSBzdWItYXJ0aWZhY3QKLQkJLy8gdG8gYSBjb250ZW50IHBhY2thZ2UKLQkJLy8KLQkJCi0vLwkJLy8gZG8gbm90IGFsbG93IG1vdmUgaWYgZGVzdGluYXRpb24gaXMgbm90IHRoZSBzYW1lIHR5cGUgYXMgZXZlcnkKLS8vCQkvLyBlbGVtZW50cycgZUNvbnRhaW5lcgotLy8JCU9iamVjdCByZWFsRGVzdCA9IGRlc3RpbmF0aW9uOwotLy8JCWlmIChkZXN0aW5hdGlvbiBpbnN0YW5jZW9mIFRyYW5zaWVudENvbnRlbnRQYWNrYWdlSXRlbVByb3ZpZGVyKSB7Ci0vLwkJCXJlYWxEZXN0ID0gKChUcmFuc2llbnRDb250ZW50UGFja2FnZUl0ZW1Qcm92aWRlcikgZGVzdGluYXRpb24pCi0vLwkJCQkJLmdldFRhcmdldCgpOwotLy8JCX0KLS8vCQlpZiAoZGVzdGluYXRpb24gaW5zdGFuY2VvZiBUcmFuc2llbnRHcm91cEl0ZW1Qcm92aWRlcikgewotLy8JCQlyZWFsRGVzdCA9ICgoVHJhbnNpZW50R3JvdXBJdGVtUHJvdmlkZXIpIGRlc3RpbmF0aW9uKS5nZXRUYXJnZXQoKTsKLS8vCQl9CQkKLS8vCQl0cnkgewotLy8JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBlbGVtZW50cy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLS8vCQkJCU9iamVjdCBlID0gaXRlci5uZXh0KCk7Ci0vLwkJCQlpZiAoZSBpbnN0YW5jZW9mIEVPYmplY3QpIHsKLS8vCQkJCQlpZiAoIXJlYWxEZXN0LmdldENsYXNzKCkuaXNJbnN0YW5jZSgKLS8vCQkJCQkJCSgoRU9iamVjdCkgZSkuZUNvbnRhaW5lcigpKSkKLS8vCQkJCQkJcmV0dXJuIGZhbHNlOwotLy8JCQkJfQotLy8JCQl9Ci0vLwkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0vLwkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihleCk7Ci0vLwkJCXJldHVybiBmYWxzZTsKLS8vCQl9Ci0JCQotCQkvL0RvIG5vdCBhbGxvdyBtb3ZpbmcgaW50byBhIGRlc3RpbmF0aW9uIHdoaWNoIGlzIAotCQkvL2xvY2tlZCB0aHJvdWdoIGV4dGVuZGVkIGxvY2tlci4KLQkJaWYoVmlld0hlbHBlci5pc0V4dGVuZGVkTG9ja2VkKGRlc3RpbmF0aW9uKSl7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0JCi0JCWlmIChEZXBlbmRlbmN5Q2hlY2tlci5uZXdDaGVjaykgewotCQkJaWYgKGRlc3RpbmF0aW9uIGluc3RhbmNlb2YgVmFyaWFiaWxpdHlFbGVtZW50KSB7Ci0JCQkJaWYgKCEgRGVwZW5kZW5jeUNoZWNrZXIuY2hlY2tDaXJjdWxhckZvck1vdmluZ1ZhcmlhYmlsaXR5RWxlbWVudAotCQkJCQkJKChWYXJpYWJpbGl0eUVsZW1lbnQpIGRlc3RpbmF0aW9uLCBlbGVtZW50cykpIHsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCX0JCQkKLQkJfQotCQkvLyBTdWIgQXJ0aWZhY3QgY2lyY3VsYXIgY2hlY2sgY29kZQotCQllbHNlIGlmKGRlc3RpbmF0aW9uIGluc3RhbmNlb2YgQXJ0aWZhY3QpewotCQkJcmV0dXJuIERlcGVuZGVuY3lDaGVja2VyLmNoZWNrQ2lyY3VsYXJGb3JBcnRpZmFjdHMoKEFydGlmYWN0KWRlc3RpbmF0aW9uLCAKLQkJCQkJZWxlbWVudHMpOwotCQl9CQkKLQkJCi0JCUNvbW1hbmQgYWRkQ29tbWFuZCA9IEFkZENvbW1hbmQuY3JlYXRlKGVkaXRpbmdEb21haW4sIGRlc3RpbmF0aW9uLAotCQkJCW51bGwsIGVsZW1lbnRzKTsKLQkJYm9vbGVhbiByZXN1bHQ7Ci0JCXRyeSB7Ci0JCQlyZXN1bHQgPSBhZGRDb21tYW5kLmNhbkV4ZWN1dGUoKTsKLQkJfQotCQlmaW5hbGx5IHsKLQkJCWFkZENvbW1hbmQuZGlzcG9zZSgpOwotCQl9Ci0JCWlmICghcmVzdWx0KSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlpZiAoZGVzdGluYXRpb24gaW5zdGFuY2VvZiBUcmFuc2llbnRHcm91cEl0ZW1Qcm92aWRlcikgewotCQkJZGVzdGluYXRpb24gPSAoKFRyYW5zaWVudEdyb3VwSXRlbVByb3ZpZGVyKSBkZXN0aW5hdGlvbikKLQkJCQkJLmdldFRhcmdldCgpOwotCQl9Ci0KLQkJLy8gSVN0YXR1cyBzdGF0dXMgPSBVc2VySW50ZXJhY3Rpb25IZWxwZXIuY2hlY2tNb2RpZnkoKEVPYmplY3QpCi0JCS8vIGRlc3RpbmF0aW9uLCBnZXRTaGVsbCgpKTsKLQkJLy8gaWYgKHN0YXR1cy5pc09LKCkpIHsKLQkJLy8gcmV0dXJuIHRydWU7Ci0JCS8vIH0KLQkJLy8gZWxzZSB7Ci0JCS8vIEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKS5kaXNwbGF5KAotCQkvLyBBdXRob3JpbmdVSVJlc291cmNlcy5nZXRTdHJpbmcoIkF1dGhvcmluZ1VJUGx1Z2luLm1vdmVEaWFsb2cudGl0bGUiKSwKLQkJLy8gLy8kTk9OLU5MUy0xJAotCQkvLyBzdGF0dXMpOwotCQkvLyByZXR1cm4gZmFsc2U7Ci0JCS8vIH0KLQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGRvTW92ZSgpIHsKLQkJaWYgKGRlc3RpbmF0aW9uID09IG51bGwpIHsKLQkJCVN0cmluZyB0aXRsZSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmVycm9yRGlhbG9nX3RpdGxlOyAKLQkJCVN0cmluZyBwcm9ibGVtID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuTW92ZURpYWxvZ19ub21vdmVfZGVzdGluYXRpb25fcHJvYmxlbV9tc2c7IAotCQkJU3RyaW5nIG1zZyA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLk1vdmVEaWFsb2dfc2VsZWN0ZGVzdGluYXRpb25fdGV4dDsgCi0JCQlNc2dEaWFsb2cgZGlhbG9nID0gQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpOwotCQkJZGlhbG9nLmRpc3BsYXlFcnJvcih0aXRsZSwgcHJvYmxlbSwgbXNnKTsgCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJaWYgKCFpc1ZhbGlkRGVzdGluYXRpb24oKSkgewotCQkJU3RyaW5nIHRpdGxlID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZXJyb3JEaWFsb2dfdGl0bGU7IAotCQkJU3RyaW5nIHByb2JsZW0gPSBBdXRob3JpbmdVSVJlc291cmNlcy5Nb3ZlRGlhbG9nX2ludmFsaWRfbW92ZV9kZXN0aW5hdGlvbl9wcm9ibGVtX21zZzsgCi0JCQlTdHJpbmcgbXNnID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuTW92ZURpYWxvZ192YWxpZGRlc3RpbmF0aW9uX3RleHQ7IAotCQkJTXNnRGlhbG9nIGRpYWxvZyA9IEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKTsKLQkJCWRpYWxvZy5kaXNwbGF5RXJyb3IodGl0bGUsIHByb2JsZW0sIG1zZyk7IAotCQkJcmV0dXJuIGZhbHNlOwotCQl9IGVsc2UgewotCQkJSVN0YXR1cyBzdGF0dXMgPSBVc2VySW50ZXJhY3Rpb25IZWxwZXIuY2hlY2tNb2RpZnkoCi0JCQkJCShFT2JqZWN0KSBkZXN0aW5hdGlvbiwgZ2V0U2hlbGwoKSk7Ci0JCQlpZiAoIXN0YXR1cy5pc09LKCkpIHsKLQkJCQlTdHJpbmcgdGl0bGUgPSBBdXRob3JpbmdVSVJlc291cmNlcy5lcnJvckRpYWxvZ190aXRsZTsgCi0JCQkJU3RyaW5nIG1zZyA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLk1vdmVEaWFsb2dfY2Fubm90TW9kaWZ5RGVzdGluYXRpb247IAotCQkJCU1zZ0RpYWxvZyBkaWFsb2cgPSBBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCQkJCS5nZXRNc2dEaWFsb2coKTsKLQkJCQlkaWFsb2cuZGlzcGxheUVycm9yKHRpdGxlLCBtc2csIHN0YXR1cyk7IAotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCi0JCW1vdmluZyA9IHRydWU7Ci0JCWZpbmFsIFNoZWxsIHNoZWxsID0gZ2V0U2hlbGwoKTsKLQkJc2hlbGwuc2V0Q3Vyc29yKHdhaXRDdXJzb3IpOwotCi0JCWdldEJ1dHRvbihJRGlhbG9nQ29uc3RhbnRzLk9LX0lEKS5zZXRFbmFibGVkKGZhbHNlKTsKLQkJZ2V0QnV0dG9uKElEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0lEKS5zZXRFbmFibGVkKGZhbHNlKTsKLQkJdHJlZVZpZXdlci5nZXRDb250cm9sKCkuc2V0RW5hYmxlZChmYWxzZSk7Ci0KLQkJcHJvZ3Jlc3NNb25pdG9yUGFydC5zZXRWaXNpYmxlKHRydWUpOwotCQlwcm9ncmVzc01vbml0b3JQYXJ0Ci0JCQkJLmJlZ2luVGFzaygKLQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLk1vdmVEaWFsb2dfbW92aW5nX3RleHQsIElQcm9ncmVzc01vbml0b3IuVU5LTk9XTik7IAotCQlNb3ZlT3BlcmF0aW9uIG1vdmVPcCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQkvLyBjcmVhdGUgY29tbWFuZAotCQkJLy8KLQkJCUNvbW1hbmQgY29tbWFuZCA9IEFkZENvbW1hbmQuY3JlYXRlKGVkaXRpbmdEb21haW4sIGRlc3RpbmF0aW9uLAotCQkJCQludWxsLCBlbGVtZW50cyk7Ci0KLQkJCW1vdmVPcCA9IG5ldyBNb3ZlT3BlcmF0aW9uKGNvbW1hbmQsIHByb2dyZXNzTW9uaXRvclBhcnQsIHNoZWxsKTsKLQkJCW1vdmVPcC5ydW4oKTsKLQkJfSBmaW5hbGx5IHsKLQkJCW1vdmluZyA9IGZhbHNlOwotCQkJcHJvZ3Jlc3NNb25pdG9yUGFydC5kb25lKCk7Ci0KLQkJCS8vIGNsZWFyIGN1cnNvcgotCQkJaWYgKHNoZWxsICE9IG51bGwgJiYgIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQkJCXNoZWxsLnNldEN1cnNvcihudWxsKTsKLQkJCX0KLQkJfQotCi0JCWlmIChtb3ZlT3AgIT0gbnVsbCkgewotCQkJSVN0YXR1cyBzdGF0dXMgPSBtb3ZlT3AuZ2V0U3RhdHVzKCk7Ci0JCQlpZiAoIXN0YXR1cy5pc09LKCkpIHsKLQkJCQlTdHJpbmcgdGl0bGUgPSBBdXRob3JpbmdVSVJlc291cmNlcy5kaWFsb2dzX01vdmVEaWFsb2dfZXJyb3JUaXRsZTsgCi0JCQkJU3RyaW5nIG1lc3NhZ2UgPSBBdXRob3JpbmdVSVJlc291cmNlcy5kaWFsb2dzX01vdmVEaWFsb2dfZXJyb3JNZXNzYWdlOyAKLQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkuZGlzcGxheUVycm9yKAotCQkJCQkJdGl0bGUsIG1lc3NhZ2UsIHN0YXR1cyk7Ci0JCQkJaWYgKG1vdmVPcC5yZWxvYWROZWVkZWQoKSkgewotCQkJCQlWaWV3SGVscGVyLnJlbG9hZEN1cnJlbnRMaWJyYXJ5KHNoZWxsLCBudWxsKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nI2Nsb3NlKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjbG9zZSgpIHsKLQkJaWYgKG1vdmluZykKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIHN1cGVyLmNsb3NlKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2RpYWxvZ3MvT3BlbkNvbmZpZ0RpYWxvZy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9kaWFsb2dzL09wZW5Db25maWdEaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2VjMzg4OS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2RpYWxvZ3MvT3BlbkNvbmZpZ0RpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZGlhbG9nczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2VVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci0KLS8qKgotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqIEBkZXByZWNhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBPcGVuQ29uZmlnRGlhbG9nIGV4dGVuZHMgRGlhbG9nIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVXX0NPTkZJR19URVhUID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuT3BlbkNvbmZpZ0RpYWxvZ25ld2NvbmZpZ190ZXh0OyAKLQotCS8vIENvbWJvIGNvbWJvX2NvbmZpZ3M7Ci0JU3RyaW5nIHNlZWxjdGVkTmFtZTsKLQotCUJ1dHRvbltdIGN0cmxfY29uZmlncyA9IG51bGw7Ci0KLQlUZXh0IGN0cmxfbmV3X2NvbmZpZyA9IG51bGw7Ci0KLQlwdWJsaWMgT3BlbkNvbmZpZ0RpYWxvZyhTaGVsbCBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGFyZWEgPSAoQ29tcG9zaXRlKSBzdXBlci5jcmVhdGVEaWFsb2dBcmVhKHBhcmVudCk7Ci0JCWZpbmFsIEdyaWRMYXlvdXQgZ3JpZExheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWFyZWEuc2V0TGF5b3V0KGdyaWRMYXlvdXQpOwotCQl7Ci0JCQlHcm91cCBnID0gbmV3IEdyb3VwKGFyZWEsIFNXVC5OT05FKTsKLQkJCXsKLQkJCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQkJCWcuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQkJCWcuc2V0TGF5b3V0KGxheW91dCk7Ci0JCQl9Ci0KLQkJCVN0cmluZ1tdIG5hbWVzID0gTGlicmFyeVNlcnZpY2VVdGlsLmdldE1ldGhvZENvbmZpZ3VyYXRpb25OYW1lcygKLQkJCQkJTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpKTsKLQkJCWlmIChuYW1lcyAhPSBudWxsKSB7Ci0JCQkJY3RybF9jb25maWdzID0gbmV3IEJ1dHRvbltuYW1lcy5sZW5ndGggKyAxXTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGN0cmxfY29uZmlncy5sZW5ndGg7IGkrKykgewotCQkJCQlTdHJpbmcgbmFtZSA9IE5FV19DT05GSUdfVEVYVDsKLQkJCQkJaWYgKGkgPCBuYW1lcy5sZW5ndGgpIHsKLQkJCQkJCW5hbWUgPSBuYW1lc1tpXTsKLQkJCQkJfQotCQkJCQljdHJsX2NvbmZpZ3NbaV0gPSBuZXcgQnV0dG9uKGcsIFNXVC5SQURJTyk7Ci0JCQkJCWN0cmxfY29uZmlnc1tpXS5zZXRUZXh0KG5hbWUpOwotCQkJCQl7Ci0JCQkJCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgKLQkJCQkJCQkJR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJCQkJCWN0cmxfY29uZmlnc1tpXS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJY3RybF9uZXdfY29uZmlnID0gbmV3IFRleHQoZywgU1dULkJPUkRFUik7Ci0JCQl7Ci0JCQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJCQlncmlkRGF0YS5ob3Jpem9udGFsSW5kZW50ID0gMTA7Ci0JCQkJY3RybF9uZXdfY29uZmlnLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQkJfQotCi0JCQkvLyBzZXQgaW1hZ2UgYW5kIHRpdGxlCi0JCQlzdXBlcgotCQkJCQkuZ2V0U2hlbGwoKQotCQkJCQkuc2V0VGV4dCgKLQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5PcGVuQ29uZmlnRGlhbG9nb3BlbmNvbmZpZ190ZXh0KTsgCi0JCX0KLQotCQlyZXR1cm4gYXJlYTsKLQl9Ci0KLQkvKioKLQkgKiBDYWxsZWQgd2hlbiB0aGUgT0sgYnV0dG9uIGlzIHNlbGVjdGVkLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIG9rUHJlc3NlZCgpIHsKLQkJc2VlbGN0ZWROYW1lID0gbnVsbDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjdHJsX2NvbmZpZ3MubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChjdHJsX2NvbmZpZ3NbaV0uZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCQlzZWVsY3RlZE5hbWUgPSBjdHJsX2NvbmZpZ3NbaV0uZ2V0VGV4dCgpOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0KLQkJaWYgKHNlZWxjdGVkTmFtZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlpZiAoc2VlbGN0ZWROYW1lLmVxdWFscyhORVdfQ09ORklHX1RFWFQpKSB7Ci0JCQlzZWVsY3RlZE5hbWUgPSBjdHJsX25ld19jb25maWcuZ2V0VGV4dCgpOwotCQl9Ci0KLQkJaWYgKHNlZWxjdGVkTmFtZSA9PSBudWxsIHx8IHNlZWxjdGVkTmFtZS5lcXVhbHMoIiIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybjsKLQkJfQotCi0JCXN1cGVyLm9rUHJlc3NlZCgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0U2VsZWN0aW9uKCkgewotCQlpZiAoc3VwZXIub3BlbigpID09IERpYWxvZy5PSykgewotCQkJcmV0dXJuIHNlZWxjdGVkTmFtZTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2RpYWxvZ3MvU2VjdGlvbnNPcmRlckRpYWxvZy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9kaWFsb2dzL1NlY3Rpb25zT3JkZXJEaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWY0ZDYwNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2RpYWxvZ3MvU2VjdGlvbnNPcmRlckRpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzM2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZGlhbG9nczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3ZpZGVycy5WYXJpYWJpbGl0eUVsZW1lbnRMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklBY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5Nb3ZlSW5TZWN0aW9uTGlzdENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlNlY3Rpb25MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5TdGVwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLQotCi0vKioKLSAqIERpYWxvZyB0byBvcmRlciB0aGUge0BsaW5rIFN0ZXB9cy4KLSAqIAotICovCi1wdWJsaWMgY2xhc3MgU2VjdGlvbnNPcmRlckRpYWxvZyBleHRlbmRzIERpYWxvZyB7Ci0KLQlwcml2YXRlIENvbXBvc2l0ZSBiYXNlQ29tcG9zaXRlOwotCi0JcHJpdmF0ZSBCdXR0b24gY3RybF91cCwgY3RybF9kb3duOwotCi0JcHJpdmF0ZSBUYWJsZSBjdHJsX3N0ZXBzOwotCi0JcHJpdmF0ZSBUYWJsZVZpZXdlciBzdGVwc1RhYmxlVmlld2VyOwotCi0JcHJpdmF0ZSBTZWN0aW9uTGlzdCBhbGxTZWN0aW9uczsKLQotCXByaXZhdGUgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIgc3RlcHNWaWV3ZXJDb250ZW50UHJvdmlkZXI7Ci0KLQlwcml2YXRlIElMYWJlbFByb3ZpZGVyIHN0ZXBzVmlld2VyTGFiZWxQcm92aWRlcjsKLQotCS8vIHByaXZhdGUgVGFzayBjb250ZW50RWxlbWVudDsKLQlwcml2YXRlIENvbnRlbnRFbGVtZW50IGNvbnRlbnRFbGVtZW50OwotCi0JcHJpdmF0ZSBJQWN0aW9uTWFuYWdlciBhY3Rpb25NYW5hZ2VyOwotCi0JcHJpdmF0ZSBTdHJpbmcgdGl0bGU7Ci0KLQlwcml2YXRlIFN0cmluZyBtZXNzYWdlOwotCi0JcHJpdmF0ZSBTdHJpbmcgbGFiZWw7Ci0KLQlwcml2YXRlIEFycmF5TGlzdCBjb21tYW5kcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSA8Y29kZT5BZHZhbmNlZFNlYXJjaERpYWxvZzwvY29kZT4gZ2l2ZWIgdGhlIHBhcmVudCBjb250cm9sLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29udHJvbC4KLQkgKi8KLQlwdWJsaWMgU2VjdGlvbnNPcmRlckRpYWxvZyhTaGVsbCBwYXJlbnQsIENvbnRlbnRFbGVtZW50IGNvbnRlbnRFbGVtZW50LAotCQkJSUFjdGlvbk1hbmFnZXIgYWN0aW9uTWFuYWdlciwgU3RyaW5nIHRpdGxlLCBTdHJpbmcgbWVzc2FnZSwKLQkJCVN0cmluZyBsYWJlbCkgewotCQlzdXBlcihwYXJlbnQpOwotCQl0aGlzLmNvbnRlbnRFbGVtZW50ID0gY29udGVudEVsZW1lbnQ7Ci0JCXRoaXMuYWN0aW9uTWFuYWdlciA9IGFjdGlvbk1hbmFnZXI7Ci0JCXRoaXMudGl0bGUgPSB0aXRsZTsKLQkJdGhpcy5tZXNzYWdlID0gbWVzc2FnZTsKLQkJdGhpcy5sYWJlbCA9IGxhYmVsOwotCQlhbGxTZWN0aW9ucyA9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBEaWFsb2cjY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KQotCSAqLwotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkgewotCQliYXNlQ29tcG9zaXRlID0gKENvbXBvc2l0ZSkgc3VwZXIuY3JlYXRlRGlhbG9nQXJlYShwYXJlbnQpOwotCQlmaW5hbCBHcmlkTGF5b3V0IGdyaWRMYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlncmlkTGF5b3V0Lm51bUNvbHVtbnMgPSA0OwotCQliYXNlQ29tcG9zaXRlLnNldExheW91dChncmlkTGF5b3V0KTsKLQkJYmFzZUNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YSgpKTsKLQotCQljcmVhdGVMYWJlbChiYXNlQ29tcG9zaXRlLCBtZXNzYWdlLCA0KTsKLQotCQkvLyBFbXB0eSBsaW5lCi0JCWNyZWF0ZUxhYmVsKGJhc2VDb21wb3NpdGUsICIgIiwgNCk7IC8vJE5PTi1OTFMtMSQKLQotCQljcmVhdGVMYWJlbChiYXNlQ29tcG9zaXRlLCAiICIsIDEpOyAvLyROT04tTkxTLTEkCi0JCWNyZWF0ZUxhYmVsKGJhc2VDb21wb3NpdGUsIGxhYmVsLCAzKTsKLQotCQljcmVhdGVMYWJlbChiYXNlQ29tcG9zaXRlLCAiICIsIDEpOyAvLyROT04tTkxTLTEkCi0JCWN0cmxfc3RlcHMgPSBuZXcgVGFibGUoYmFzZUNvbXBvc2l0ZSwgU1dULkJPUkRFUiB8IFNXVC5NVUxUSSk7Ci0JCXsKLQkJCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCQlncmlkRGF0YS53aWR0aEhpbnQgPSAzMDA7Ci0JCQlncmlkRGF0YS5oZWlnaHRIaW50ID0gNDAwOwotCQkJY3RybF9zdGVwcy5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJfQotCi0JCWluaXRQcm92aWRlcnMoKTsKLQotCQlzdGVwc1RhYmxlVmlld2VyID0gbmV3IFRhYmxlVmlld2VyKGN0cmxfc3RlcHMpOwotCQlzdGVwc1RhYmxlVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihzdGVwc1ZpZXdlckNvbnRlbnRQcm92aWRlcik7Ci0JCXN0ZXBzVGFibGVWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihzdGVwc1ZpZXdlckxhYmVsUHJvdmlkZXIpOwotCi0JCUNvbXBvc2l0ZSBvcmRlckJ1dHRvblBhbmUgPSBuZXcgQ29tcG9zaXRlKGJhc2VDb21wb3NpdGUsIFNXVC5OVUxMKTsKLQkJewotCQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQ0VOVEVSCi0JCQkJCXwgR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9DRU5URVIpOwotCQkJZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAxOwotCQkJb3JkZXJCdXR0b25QYW5lLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQkJb3JkZXJCdXR0b25QYW5lLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQkJfQotCi0JCWN0cmxfdXAgPSBjcmVhdGVCdXR0b24ob3JkZXJCdXR0b25QYW5lLCBBdXRob3JpbmdVSVRleHQuVVBfQlVUVE9OX1RFWFQpOwotCQljdHJsX3VwLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCi0JCWN0cmxfZG93biA9IGNyZWF0ZUJ1dHRvbihvcmRlckJ1dHRvblBhbmUsCi0JCQkJQXV0aG9yaW5nVUlUZXh0LkRPV05fQlVUVE9OX1RFWFQpOwotCQljdHJsX2Rvd24uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLQkJY3RybF91cC5zZXRFbmFibGVkKGZhbHNlKTsKLQkJY3RybF9kb3duLnNldEVuYWJsZWQoZmFsc2UpOwotCi0JCS8vIEVtcHR5IGxpbmUKLQkJY3JlYXRlTGFiZWwoYmFzZUNvbXBvc2l0ZSwgIiAiLCA0KTsgLy8kTk9OLU5MUy0xJAotCi0JCWNyZWF0ZUxpbmUoYmFzZUNvbXBvc2l0ZSwgNCk7Ci0KLQkJc3VwZXIuZ2V0U2hlbGwoKS5zZXRUZXh0KHRpdGxlKTsKLQotCQlhZGRMaXN0ZW5lcnMoKTsKLQkJbG9hZERhdGEoKTsKLQotCQlyZXR1cm4gYmFzZUNvbXBvc2l0ZTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlTGluZShDb21wb3NpdGUgcGFyZW50LCBpbnQgbmNvbCkgewotCQlMYWJlbCBsaW5lID0gbmV3IExhYmVsKHBhcmVudCwgU1dULlNFUEFSQVRPUiB8IFNXVC5IT1JJWk9OVEFMCi0JCQkJfCBTV1QuQk9MRCk7Ci0JCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWdyaWREYXRhLmhvcml6b250YWxTcGFuID0gbmNvbDsKLQkJbGluZS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQl9Ci0KLQlwcml2YXRlIExhYmVsIGNyZWF0ZUxhYmVsKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyB0ZXh0LCBpbnQgbkNvbCkgewotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OT05FKTsKLQkJbGFiZWwuc2V0VGV4dCh0ZXh0KTsKLQkJewotCQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJCWdyaWREYXRhLmhvcml6b250YWxTcGFuID0gbkNvbDsKLQkJCWxhYmVsLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQl9Ci0KLQkJcmV0dXJuIGxhYmVsOwotCX0KLQotCXByaXZhdGUgQnV0dG9uIGNyZWF0ZUJ1dHRvbihDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgbGFiZWwpIHsKLQkJQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuTk9ORSk7Ci0JCWJ1dHRvbi5zZXRUZXh0KGxhYmVsKTsKLQkJcmV0dXJuIGJ1dHRvbjsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBkaWFsb2cgYnV0dG9ucy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVCdXR0b25zRm9yQnV0dG9uQmFyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJLy8gQ3JlYXRlIHRoZSBPSyBidXR0b24uCi0JCWNyZWF0ZUJ1dHRvbihwYXJlbnQsIElEaWFsb2dDb25zdGFudHMuT0tfSUQsIElEaWFsb2dDb25zdGFudHMuT0tfTEFCRUwsCi0JCQkJdHJ1ZSk7Ci0KLQkJLy8gQ3JlYXRlIHRoZSBDYW5jZWwgYnV0dG9uLgotCQljcmVhdGVCdXR0b24ocGFyZW50LCBJRGlhbG9nQ29uc3RhbnRzLkNBTkNFTF9JRCwKLQkJCQlJRGlhbG9nQ29uc3RhbnRzLkNBTkNFTF9MQUJFTCwgZmFsc2UpOwotCX0KLQotCXByaXZhdGUgdm9pZCBpbml0UHJvdmlkZXJzKCkgewotCQlzdGVwc1ZpZXdlckNvbnRlbnRQcm92aWRlciA9IG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcigKLQkJCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkJLmdldE5hdmlnYXRvclZpZXdfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKSB7Ci0JCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IG9iamVjdCkgewotCQkJCWlmIChhbGxTZWN0aW9ucyA9PSBudWxsKSB7Ci0JCQkJCWFsbFNlY3Rpb25zID0gbmV3IFNlY3Rpb25MaXN0KGNvbnRlbnRFbGVtZW50LAotCQkJCQkJCVNlY3Rpb25MaXN0LlNURVBTX0ZPUl9FTEVNRU5UX0FORF9QQVJFTlRTKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIGFsbFNlY3Rpb25zLnRvQXJyYXkoKTsKLQkJCX0KLQkJfTsKLQotCQlzdGVwc1ZpZXdlckxhYmVsUHJvdmlkZXIgPSBuZXcgVmFyaWFiaWxpdHlFbGVtZW50TGFiZWxQcm92aWRlcigKLQkJCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkJLmdldE5hdmlnYXRvclZpZXdfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKSB7Ci0KLQkJCXB1YmxpYyBib29sZWFuIGlzRXh0ZXJuYWwoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCQlyZXR1cm4gIWNvbnRlbnRFbGVtZW50LmdldFByZXNlbnRhdGlvbigpLmdldFNlY3Rpb25zKCkKLQkJCQkJCS5jb250YWlucyhlbGVtZW50KTsKLQkJCX0KLQotCQl9OwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZExpc3RlbmVycygpIHsKLQkJc3RlcHNUYWJsZVZpZXdlcgotCQkJCS5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0KLQkJCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgc3RlcHNUYWJsZVZpZXdlcgotCQkJCQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJCQlpZiAoc2VsZWN0aW9uLnNpemUoKSA+IDAKLQkJCQkJCQkJJiYgIVRuZ1V0aWwuaXNMb2NrZWQoY29udGVudEVsZW1lbnQpKSB7Ci0JCQkJCQkJaWYgKHN0ZXBzVGFibGVWaWV3ZXIuZ2V0VGFibGUoKS5nZXRTZWxlY3Rpb25JbmRleCgpID4gMAotCQkJCQkJCQkJJiYgIVRuZ1V0aWwuaXNMb2NrZWQoY29udGVudEVsZW1lbnQpCi0JCQkJCQkJCQkmJiBzZWxlY3Rpb24uc2l6ZSgpID09IDEpIHsKLQkJCQkJCQkJY3RybF91cC5zZXRFbmFibGVkKHRydWUpOwotCQkJCQkJCX0gZWxzZQotCQkJCQkJCQljdHJsX3VwLnNldEVuYWJsZWQoZmFsc2UpOwotCi0JCQkJCQkJaWYgKHN0ZXBzVGFibGVWaWV3ZXIuZ2V0VGFibGUoKS5nZXRTZWxlY3Rpb25JbmRleCgpIDwgc3RlcHNUYWJsZVZpZXdlcgotCQkJCQkJCQkJLmdldFRhYmxlKCkuZ2V0SXRlbUNvdW50KCkgLSAxCi0JCQkJCQkJCQkmJiAhVG5nVXRpbC5pc0xvY2tlZChjb250ZW50RWxlbWVudCkKLQkJCQkJCQkJCSYmIHNlbGVjdGlvbi5zaXplKCkgPT0gMSkgewotCQkJCQkJCQljdHJsX2Rvd24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQkJCQl9IGVsc2UKLQkJCQkJCQkJY3RybF9kb3duLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfSk7Ci0KLQkJY3RybF91cC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHN0ZXBzVGFibGVWaWV3ZXIKLQkJCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQotCQkJCUFycmF5TGlzdCBtb3ZlVXBJdGVtcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQltb3ZlVXBJdGVtcy5hZGRBbGwoc2VsZWN0aW9uLnRvTGlzdCgpKTsKLQkJCQlNb3ZlSW5TZWN0aW9uTGlzdENvbW1hbmQgY21kID0gbmV3IE1vdmVJblNlY3Rpb25MaXN0Q29tbWFuZCgKLQkJCQkJCWNvbnRlbnRFbGVtZW50LCBtb3ZlVXBJdGVtcywgYWxsU2VjdGlvbnMsIDEpOwotCQkJCWFjdGlvbk1hbmFnZXIuZXhlY3V0ZShjbWQpOwotCQkJCWNvbW1hbmRzLmFkZChjbWQpOwotCi0JCQkJc3RlcHNUYWJsZVZpZXdlci5yZWZyZXNoKCk7Ci0KLQkJCQlpZiAoc3RlcHNUYWJsZVZpZXdlci5nZXRUYWJsZSgpLmdldFNlbGVjdGlvbkluZGV4KCkgPiAwCi0JCQkJCQkmJiAhVG5nVXRpbC5pc0xvY2tlZChjb250ZW50RWxlbWVudCkpIHsKLQkJCQkJY3RybF91cC5zZXRFbmFibGVkKHRydWUpOwotCQkJCX0gZWxzZQotCQkJCQljdHJsX3VwLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCWlmIChzdGVwc1RhYmxlVmlld2VyLmdldFRhYmxlKCkuZ2V0U2VsZWN0aW9uSW5kZXgoKSA8IHN0ZXBzVGFibGVWaWV3ZXIKLQkJCQkJCS5nZXRUYWJsZSgpLmdldEl0ZW1Db3VudCgpIC0gMQotCQkJCQkJJiYgIVRuZ1V0aWwuaXNMb2NrZWQoY29udGVudEVsZW1lbnQpKSB7Ci0JCQkJCWN0cmxfZG93bi5zZXRFbmFibGVkKHRydWUpOwotCQkJCX0gZWxzZQotCQkJCQljdHJsX2Rvd24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQl9Ci0JCX0pOwotCi0JCWN0cmxfZG93bi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHN0ZXBzVGFibGVWaWV3ZXIKLQkJCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQkJCQlBcnJheUxpc3QgbW92ZURvd25JdGVtcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQltb3ZlRG93bkl0ZW1zLmFkZEFsbChzZWxlY3Rpb24udG9MaXN0KCkpOwotCQkJCU1vdmVJblNlY3Rpb25MaXN0Q29tbWFuZCBjbWQgPSBuZXcgTW92ZUluU2VjdGlvbkxpc3RDb21tYW5kKAotCQkJCQkJY29udGVudEVsZW1lbnQsIG1vdmVEb3duSXRlbXMsIGFsbFNlY3Rpb25zLCAwKTsKLQkJCQlhY3Rpb25NYW5hZ2VyLmV4ZWN1dGUoY21kKTsKLQkJCQljb21tYW5kcy5hZGQoY21kKTsKLQotCQkJCXN0ZXBzVGFibGVWaWV3ZXIucmVmcmVzaCgpOwotCi0JCQkJaWYgKHN0ZXBzVGFibGVWaWV3ZXIuZ2V0VGFibGUoKS5nZXRTZWxlY3Rpb25JbmRleCgpID4gMAotCQkJCQkJJiYgIVRuZ1V0aWwuaXNMb2NrZWQoY29udGVudEVsZW1lbnQpKSB7Ci0JCQkJCWN0cmxfdXAuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQl9IGVsc2UKLQkJCQkJY3RybF91cC5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQlpZiAoc3RlcHNUYWJsZVZpZXdlci5nZXRUYWJsZSgpLmdldFNlbGVjdGlvbkluZGV4KCkgPCBzdGVwc1RhYmxlVmlld2VyCi0JCQkJCQkuZ2V0VGFibGUoKS5nZXRJdGVtQ291bnQoKSAtIDEKLQkJCQkJCSYmICFUbmdVdGlsLmlzTG9ja2VkKGNvbnRlbnRFbGVtZW50KSkgewotCQkJCQljdHJsX2Rvd24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQl9IGVsc2UKLQkJCQkJY3RybF9kb3duLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQkvKioKLQkgKiBMb2FkIGluaXRpYWwgZGF0YSBmcm9tIG1vZGVsCi0JICovCi0JcHJpdmF0ZSB2b2lkIGxvYWREYXRhKCkgewotCQlzdGVwc1RhYmxlVmlld2VyLnNldElucHV0KGNvbnRlbnRFbGVtZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBDYWxsZWQgd2hlbiB0aGUgT0sgYnV0dG9uIGlzIHNlbGVjdGVkLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIG9rUHJlc3NlZCgpIHsKLQkJYWxsU2VjdGlvbnMuYXBwbHkoKTsKLQkJc3VwZXIub2tQcmVzc2VkKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY2FuY2VsUHJlc3NlZCgpIHsKLQkJaWYgKCFjb21tYW5kcy5pc0VtcHR5KCkpIHsKLQkJCWZvciAoaW50IGkgPSBjb21tYW5kcy5zaXplKCkgLSAxOyBpID4gLTE7IGktLSkgewotCQkJCU9iamVjdCBjbWQgPSBjb21tYW5kcy5nZXQoaSk7Ci0JCQkJaWYgKGNtZCBpbnN0YW5jZW9mIE1vdmVJblNlY3Rpb25MaXN0Q29tbWFuZCkgewotCQkJCQkoKE1vdmVJblNlY3Rpb25MaXN0Q29tbWFuZCkgY21kKS51bmRvKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXN1cGVyLmNhbmNlbFByZXNzZWQoKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9kaWFsb2dzL1N3aXRjaENvbmZpZ0RpYWxvZy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9kaWFsb2dzL1N3aXRjaENvbmZpZ0RpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZGRhOGE0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZGlhbG9ncy9Td2l0Y2hDb25maWdEaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmRpYWxvZ3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuQWJzdHJhY3REaWFncmFtRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5CcmVha2Rvd25FbGVtZW50RWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLkVkaXRvckNob29zZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLlByb2Nlc3NFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS51dGlsLk1zZ0JveDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuTGlicmFyeVVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLkxpYnJhcnlVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5wcmVmZXJlbmNlcy5MaWJyYXJ5VUlQcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2dXaXRoVG9nZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci0KLS8qKgotICogUHJvbXB0cyB0aGUgdXNlciB0byBzd2l0Y2ggdGhlIGN1cnJlbnQgQ29uZmlndXJhdGlvbiB0byBhIHJlY29tbWVuZGVkCi0gKiBDb25maWd1cmF0aW9uLgotICogCi0gKiBAYXV0aG9yIEplZmYgSGFyZHkKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgU3dpdGNoQ29uZmlnRGlhbG9nIHsKLQotCXByaXZhdGUgU2hlbGwgc2hlbGw7Ci0JCi0JcHJpdmF0ZSBJRWRpdG9yUGFydCBwYXJ0OwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gc2hlbGwKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgc2hlbGwuCi0JICogQHBhcmFtIHJlY29tbWVuZGVkQ29uZmlnCi0JICogICAgICAgICAgICBUaGUgcmVjb21tZW5kZWQgY29uZmlndXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgU3dpdGNoQ29uZmlnRGlhbG9nKFNoZWxsIHNoZWxsLCBJRWRpdG9yUGFydCBwYXJ0KSB7Ci0JCXRoaXMuc2hlbGwgPSBzaGVsbDsKLQkJdGhpcy5wYXJ0ID0gcGFydDsKLQl9Ci0KLQkvKioKLQkgKiBEaXNwbGF5cyB0aGUgZGlhbG9nIGlmZiB0aGUgZ2l2ZW4gcmVjb21tZW5kZWRDb25maWcgaXMgZGlmZmVyZW50IHRoYW4gdGhlCi0JICogY3VycmVudGx5IHNlbGVjdGVkIGNvbmZpZwotCSAqIAotCSAqIHJldHVybnMgSURpYWxvZ0NvbnN0YW50cy5PS19JRCBpZiBkaWFsb2cgd2Fzbid0IHNob3duLCBvciBpZiBjb25maWcgd2FzCi0JICogc3dpdGNoZWQgcmV0dXJucyBJRGlhbG9nQ29uc3RhbnRzLkNBTkNFTF9JRCBpZiBkaWFsb2cgd2FzIHNob3duIGFuZCB1c2VyCi0JICogZGlkIG5vdCBjbGljayBZZXMKLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQlEaXNwbGF5IGRpc3BsYXkgPSBzaGVsbCAhPSBudWxsID8gc2hlbGwuZ2V0RGlzcGxheSgpIDogbnVsbDsKLQkJaWYgKGRpc3BsYXkgPT0gbnVsbCkgewotCQkJZGlzcGxheSA9IE1zZ0JveC5nZXREaXNwbGF5KCk7Ci0JCX0KLQkJaWYgKGRpc3BsYXkgPT0gbnVsbCkgewotCQkJLy8gY291bGQgbm90IGdldCBkaXNwbGF5Ci0JCQlyZXR1cm47Ci0JCX0KLQkJZGlzcGxheS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCU9iamVjdCBvYmogPSBudWxsOwotCQkJCWlmIChwYXJ0IGluc3RhbmNlb2YgQWJzdHJhY3REaWFncmFtRWRpdG9yKSB7Ci0JCQkJCWlmICgoKEFic3RyYWN0RGlhZ3JhbUVkaXRvcilwYXJ0KS5pc0Rpc3Bvc2VkKCkpIHsKLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCQlCcmVha2Rvd25FbGVtZW50RWRpdG9ySW5wdXQgaW5wdXQgPSAoQnJlYWtkb3duRWxlbWVudEVkaXRvcklucHV0KSAoKElFZGl0b3JQYXJ0KSBwYXJ0KQotCQkJCQkJCS5nZXRFZGl0b3JJbnB1dCgpOwotCQkJCQlpZiAoaW5wdXQuZ2V0U3VwcHJlc3Npb24oKS5nZXRQcm9jZXNzKCkgIT0gbnVsbCkgewotCQkJCQkJb2JqID0gaW5wdXQuZ2V0U3VwcHJlc3Npb24oKS5nZXRQcm9jZXNzKCkuZUNvbnRhaW5lcigpOwotCQkJCQl9Ci0JCQkJfSBlbHNlIGlmIChwYXJ0IGluc3RhbmNlb2YgUHJvY2Vzc0VkaXRvcikgewotCQkJCQlpZiAoKChQcm9jZXNzRWRpdG9yKXBhcnQpLmlzRGlzcG9zZWQoKSkgewotCQkJCQkJcmV0dXJuOwotCQkJCQl9Ci0JCQkJCW9iaiA9IEVkaXRvckNob29zZXIuZ2V0SW5zdGFuY2UoKS5nZXRNZXRob2RFZGl0b3JJbnB1dChwYXJ0KTsKLQkJCQl9Ci0JCQkJaWYgKG9iaiAhPSBudWxsICYmIG9iaiBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpIHsKLQkJCQkJTWV0aG9kQ29uZmlndXJhdGlvbiByZWNvbW1lbmRlZENvbmZpZyA9ICgoUHJvY2Vzc0NvbXBvbmVudCkgb2JqKS5nZXRQcm9jZXNzKCkuZ2V0RGVmYXVsdENvbnRleHQoKTsKLQkJCQkJU3RyaW5nIHN3aXRjaENvbmZpZ1ByZWYgPSBMaWJyYXJ5VUlQcmVmZXJlbmNlcy5nZXRTd2l0Y2hDb25maWcoKTsKLQkJCQkJaWYgKE1lc3NhZ2VEaWFsb2dXaXRoVG9nZ2xlLk5FVkVSLmVxdWFscyhzd2l0Y2hDb25maWdQcmVmKSkgewotCQkJCQkJLy8gQ2FsbCB0aGlzIHRvIHJlZnJlc2ggYWN0aXZlIHBhcnQgaWYgbmVlZGVkLgotCQkJCQkJLy8gVE9ETzogUmV2aWV3IGltcGxlbWVudGF0aW9uLgotLy8JCQkJCQlMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLnNldEN1cnJlbnRNZXRob2RDb25maWd1cmF0aW9uKAotLy8JCQkJCQkJCUxpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLS8vCQkJCQkJCQkJCS5nZXRDdXJyZW50TWV0aG9kQ29uZmlndXJhdGlvbigpKTsKLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCQlpZiAoTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TWV0aG9kQ29uZmlndXJhdGlvbigpICE9IHJlY29tbWVuZGVkQ29uZmlnKSB7Ci0JCQkJCQlmaW5hbCBTdHJpbmcgY29uZmlnTmFtZSA9IHJlY29tbWVuZGVkQ29uZmlnLmdldE5hbWUoKTsKLQkJCQkJCWlmIChNZXNzYWdlRGlhbG9nV2l0aFRvZ2dsZS5QUk9NUFQuZXF1YWxzKHN3aXRjaENvbmZpZ1ByZWYpKSB7Ci0JCQkJCQkJTWVzc2FnZURpYWxvZ1dpdGhUb2dnbGUgZGlhbG9nID0gTWVzc2FnZURpYWxvZ1dpdGhUb2dnbGUKLQkJCQkJCQkub3Blblllc05vUXVlc3Rpb24oc2hlbGwsCi0JCQkJCQkJCQlMaWJyYXJ5VUlSZXNvdXJjZXMuc3dpdGNoQ29uZmlnRGlhbG9nX3RpdGxlLAotCQkJCQkJCQkJTGlicmFyeVVJUmVzb3VyY2VzCi0JCQkJCQkJCQkuYmluZCgKLQkJCQkJCQkJCQkJTGlicmFyeVVJUmVzb3VyY2VzLnN3aXRjaENvbmZpZ0RpYWxvZ190ZXh0LAotCQkJCQkJCQkJCQljb25maWdOYW1lKSwKLQkJCQkJCQkJCW51bGwsIGZhbHNlLCBMaWJyYXJ5VUlQbHVnaW4uZ2V0RGVmYXVsdCgpCi0JCQkJCQkJCQkJCS5nZXRQcmVmZXJlbmNlU3RvcmUoKSwKLQkJCQkJCQkJCUxpYnJhcnlVSVByZWZlcmVuY2VzLmdldFN3aXRjaENvbmZpZ1ByZWZlcmVuY2VLZXkoKSk7Ci0JCQkJCQkJaWYgKGRpYWxvZy5nZXRSZXR1cm5Db2RlKCkgPT0gSURpYWxvZ0NvbnN0YW50cy5ZRVNfSUQpIHsKLQkJCQkJCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSBMaWJyYXJ5U2VydmljZVV0aWwKLQkJCQkJCQkJCQkuZ2V0TWV0aG9kQ29uZmlndXJhdGlvbihMaWJyYXJ5U2VydmljZQotCQkJCQkJCQkJCQkJLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKSwKLQkJCQkJCQkJCQkJCWNvbmZpZ05hbWUpOwotCQkJCQkJCQlMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLnNldEN1cnJlbnRNZXRob2RDb25maWd1cmF0aW9uKAotCQkJCQkJCQkJCWNvbmZpZyk7Ci0JCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJLy8gQ2FsbCB0aGlzIHRvIHJlZnJlc2ggYWN0aXZlIHBhcnQgaWYgbmVlZGVkLgotCQkJCQkJCQkvLyBUT0RPOiBSZXZpZXcgaW1wbGVtZW50YXRpb24uCi0JCQkJCQkJCUxpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuc2V0Q3VycmVudE1ldGhvZENvbmZpZ3VyYXRpb24oCi0JCQkJCQkJCQkJTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKQotCQkJCQkJCQkJCQkJLmdldEN1cnJlbnRNZXRob2RDb25maWd1cmF0aW9uKCkpOwotCQkJCQkJCX0KLQkJCQkJCQkKLQkJCQkJCX0gZWxzZSBpZiAoTWVzc2FnZURpYWxvZ1dpdGhUb2dnbGUuQUxXQVlTLmVxdWFscyhzd2l0Y2hDb25maWdQcmVmKSkgewotCQkJCQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gTGlicmFyeVNlcnZpY2VVdGlsCi0JCQkJCQkJCQkuZ2V0TWV0aG9kQ29uZmlndXJhdGlvbihMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJCQkJCQkJCS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpLCBjb25maWdOYW1lKTsKLQkJCQkJCQlMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLnNldEN1cnJlbnRNZXRob2RDb25maWd1cmF0aW9uKAotCQkJCQkJCQkJY29uZmlnKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBydW4oU2hlbGwgc2hlbGwsIElFZGl0b3JQYXJ0IHBhcnQpIHsKLQkJU3dpdGNoQ29uZmlnRGlhbG9nIGRpYWxvZyA9IG5ldyBTd2l0Y2hDb25maWdEaWFsb2coRGlzcGxheQotCQkJCS5nZXRDdXJyZW50KCkuZ2V0QWN0aXZlU2hlbGwoKSwgKElFZGl0b3JQYXJ0KXBhcnQpOwotCQlkaWFsb2cuZXhlY3V0ZSgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9kaWFsb2dzL1VzZXJEZWZpbmVkRGlhZ3JhbURpYWxvZy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9kaWFsb2dzL1VzZXJEZWZpbmVkRGlhZ3JhbURpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkODE4ZWUxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZGlhbG9ncy9Vc2VyRGVmaW5lZERpYWdyYW1EaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmRpYWxvZ3M7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLk1ldGhvZEVsZW1lbnRFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuUHJvY2Vzc0VkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZpbHRlcnMuUHJvY2Vzc0d1aWRhbmNlRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLnV0aWwuRGlhZ3JhbUluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29uZmlndXJhdGlvbi5HdWlkYW5jZUl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLkZpbHRlckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5TdXBwb3J0aW5nTWF0ZXJpYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkJ1c3lJbmRpY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLQotCi0vKioKLSAqIERpYWxvZyB0byBhc3NpZ24gdXNlciBkZWZpbmVkIGRpYWdyYW0gdG8gcHJvY2VzcyBlbGVtZW50cwotICogCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFVzZXJEZWZpbmVkRGlhZ3JhbURpYWxvZyBleHRlbmRzIERpYWxvZyB7Ci0KLQlwcml2YXRlIEJ1dHRvbiBhc3NpZ25BREltYWdlQnV0dG9uLCBhc3NpZ25BRERJbWFnZUJ1dHRvbiwKLQkJCWFzc2lnbldQREltYWdlQnV0dG9uOwotCi0JcHJpdmF0ZSBCdXR0b24gY2xlYXJBREltYWdlQnV0dG9uLCBjbGVhckFEREltYWdlQnV0dG9uLAotCQkJY2xlYXJXUERJbWFnZUJ1dHRvbjsKLQotCXByaXZhdGUgQnV0dG9uIHVzZUFESW1hZ2VCdXR0b24sIHVzZUFEREltYWdlQnV0dG9uLCB1c2VXUERJbWFnZUJ1dHRvbjsKLQotCXByaXZhdGUgVGV4dCBhZEltYWdlVGV4dCwgYWRkSW1hZ2VUZXh0LCB3cGRJbWFnZVRleHQ7Ci0KLQlwcml2YXRlIElFZGl0b3JQYXJ0IGVkaXRvcjsKLQotCXByaXZhdGUgQWN0aXZpdHkgYWN0aXZpdHk7Ci0KLQlwcml2YXRlIENvbXBvc2l0ZSBhcmVhOwotCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgdGFiTmFtZSA9IEZpbHRlckNvbnN0YW50cy5HVUlEQU5DRTsKLQotCXByaXZhdGUgSUZpbHRlciBmaWx0ZXI7Ci0KLQlwcml2YXRlIFN1cHBvcnRpbmdNYXRlcmlhbCBhY3Rpdml0eURpYWdyYW0sIGFjdGl2aXR5RGV0YWlsRGlhZ3JhbSwKLQkJCXdwZERpYWdyYW07Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgYnV0dG9uV2lkdGhIaW50ID0gNjA7Ci0JCi0JcHJpdmF0ZSBTZXQgZXhpc3RpbmdMaXN0OwotCQotCXByaXZhdGUgYm9vbGVhbiBpc1dyYXBwZWQgPSBmYWxzZTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2UKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogQHBhcmFtIGVkaXRvcgotCSAqIEBwYXJhbSBhY3Rpdml0eQotCSAqIEBwYXJhbSBjb25maWcKLQkgKiBAcGFyYW0gaXNXcmFwcGVkCi0JICovCi0JcHVibGljIFVzZXJEZWZpbmVkRGlhZ3JhbURpYWxvZyhTaGVsbCBwYXJlbnQsIElFZGl0b3JQYXJ0IGVkaXRvciwKLQkJCUFjdGl2aXR5IGFjdGl2aXR5LCBNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZywgYm9vbGVhbiBpc1dyYXBwZWQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQotCQl0aGlzLmVkaXRvciA9IGVkaXRvcjsKLQkJdGhpcy5pc1dyYXBwZWQgPSBpc1dyYXBwZWQ7Ci0JCQotCQl0aGlzLmFjdGl2aXR5ID0gYWN0aXZpdHk7Ci0JCXRoaXMuZmlsdGVyID0gbmV3IFByb2Nlc3NHdWlkYW5jZUZpbHRlcihjb25maWcsIG51bGwsIHRhYk5hbWUpIHsKLQkJCXB1YmxpYyBib29sZWFuIGNoaWxkQWNjZXB0KE9iamVjdCBvYmopIHsKLQkJCQlpZiAoc3VwZXIuY2hpbGRBY2NlcHQob2JqKSkKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIEd1aWRhbmNlSXRlbVByb3ZpZGVyKSB7Ci0JCQkJCVN0cmluZyBuYW1lID0gKChHdWlkYW5jZUl0ZW1Qcm92aWRlcikgb2JqKS5nZXRUZXh0KG9iaik7Ci0JCQkJCWlmIChuYW1lCi0JCQkJCQkJLmVxdWFsc0lnbm9yZUNhc2UoRmlsdGVyQ29uc3RhbnRzLlNVUFBPUlRJTkdfTUFURVJJQUxTKQotCQkJCQkJCSYmIAotCQkJCQkJCSEoKEd1aWRhbmNlSXRlbVByb3ZpZGVyKSBvYmopLmdldENoaWxkcmVuKG9iaikKLQkJCQkJCQkJCS5pc0VtcHR5KCkpCi0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJZWxzZQotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCQlpZiAoKG9iaiBpbnN0YW5jZW9mIFN1cHBvcnRpbmdNYXRlcmlhbCkpCi0JCQkJCXJldHVybiB0cnVlOwotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfTsKLQkJCi0JCWV4aXN0aW5nTGlzdCA9IG5ldyBIYXNoU2V0KCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZyNjcmVhdGVEaWFsb2dBcmVhKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKLQkgKi8KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJYXJlYSA9IChDb21wb3NpdGUpIHN1cGVyLmNyZWF0ZURpYWxvZ0FyZWEocGFyZW50KTsKLQkJZmluYWwgR3JpZExheW91dCBncmlkTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoNCwgZmFsc2UpOwotCQlhcmVhLnNldExheW91dChncmlkTGF5b3V0KTsKLQotCQkvLyBVc2UgQUQgSW1hZ2UgZm9yIHB1Ymxpc2hpbmcKLQkJTGFiZWwgYmxhbmtMYWJlbCA9IG5ldyBMYWJlbChhcmVhLCBTV1QuTk9ORSk7Ci0JCWJsYW5rTGFiZWwuc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLQotCQl1c2VBREltYWdlQnV0dG9uID0gbmV3IEJ1dHRvbihhcmVhLCBTV1QuQ0hFQ0spOwotCQl1c2VBREltYWdlQnV0dG9uLnNldFRleHQoQXV0aG9yaW5nVUlSZXNvdXJjZXMuVXNlckRlZmluZWREaWFncmFtRGlhbG9nX3VzZUFESW1hZ2UpOyAKLQkJR3JpZERhdGEgYnV0dG9uR0QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuQkVHSU5OSU5HKTsKLQkJYnV0dG9uR0QuaG9yaXpvbnRhbFNwYW4gPSAzOwotCQl1c2VBREltYWdlQnV0dG9uLnNldExheW91dERhdGEoYnV0dG9uR0QpOwotCi0JCS8vIEFzc2lnbiBhY3Rpdml0eSBkaWFncmFtIGltYWdlCi0JCUxhYmVsIGFMYWJlbCA9IG5ldyBMYWJlbChhcmVhLCBTV1QuTk9ORSk7Ci0JCWFMYWJlbC5zZXRUZXh0KEF1dGhvcmluZ1VJUmVzb3VyY2VzLlVzZXJEZWZpbmVkRGlhZ3JhbURpYWxvZ19hZEltYWdlKTsgCi0KLQkJYWRJbWFnZVRleHQgPSBuZXcgVGV4dChhcmVhLCBTV1QuQk9SREVSIHwgU1dULlJFQURfT05MWSk7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkJFR0lOTklORwotCQkJCXwgR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZ2Qud2lkdGhIaW50ID0gMzAwOwotCQlhZEltYWdlVGV4dC5zZXRMYXlvdXREYXRhKGdkKTsKLQotCQlhc3NpZ25BREltYWdlQnV0dG9uID0gbmV3IEJ1dHRvbihhcmVhLCBTV1QuTk9ORSk7Ci0JCWFzc2lnbkFESW1hZ2VCdXR0b24KLQkJCQkuc2V0VGV4dChBdXRob3JpbmdVSVJlc291cmNlcy5Vc2VyRGVmaW5lZERpYWdyYW1EaWFsb2dfYXNzaWduQnV0dG9uKTsgCi0JCUdyaWREYXRhIGJ1dHRvbkdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkJFR0lOTklORwotCQkJCXwgR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJYnV0dG9uR3JpZERhdGEud2lkdGhIaW50ID0gYnV0dG9uV2lkdGhIaW50OwotCQlhc3NpZ25BREltYWdlQnV0dG9uLnNldExheW91dERhdGEoYnV0dG9uR3JpZERhdGEpOwotCi0JCWNsZWFyQURJbWFnZUJ1dHRvbiA9IG5ldyBCdXR0b24oYXJlYSwgU1dULk5PTkUpOwotCQljbGVhckFESW1hZ2VCdXR0b24uc2V0VGV4dChBdXRob3JpbmdVSVJlc291cmNlcy5jbGVhckJ1dHRvbl90ZXh0KTsgCi0JCWNsZWFyQURJbWFnZUJ1dHRvbi5zZXRMYXlvdXREYXRhKGJ1dHRvbkdyaWREYXRhKTsKLQotCQkvLyBVc2UgQUREIEltYWdlIGZvciBwdWJsaXNoaW5nCi0JCWJsYW5rTGFiZWwgPSBuZXcgTGFiZWwoYXJlYSwgU1dULk5PTkUpOwotCQlibGFua0xhYmVsLnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0KLQkJdXNlQURESW1hZ2VCdXR0b24gPSBuZXcgQnV0dG9uKGFyZWEsIFNXVC5DSEVDSyk7Ci0JCXVzZUFEREltYWdlQnV0dG9uLnNldFRleHQoQXV0aG9yaW5nVUlSZXNvdXJjZXMuVXNlckRlZmluZWREaWFncmFtRGlhbG9nX3VzZUFEREltYWdlKTsgCi0JCWJ1dHRvbkdEID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkJFR0lOTklORyk7Ci0JCWJ1dHRvbkdELmhvcml6b250YWxTcGFuID0gMzsKLQkJdXNlQURESW1hZ2VCdXR0b24uc2V0TGF5b3V0RGF0YShidXR0b25HRCk7Ci0KLQkJLy8gQXNzaWduIGFjdGl2aXR5IGRldGFpbCBkaWFncmFtIGltYWdlCi0JCWFMYWJlbCA9IG5ldyBMYWJlbChhcmVhLCBTV1QuTk9ORSk7Ci0JCWFMYWJlbC5zZXRUZXh0KEF1dGhvcmluZ1VJUmVzb3VyY2VzLlVzZXJEZWZpbmVkRGlhZ3JhbURpYWxvZ19hZGRJbWFnZSk7IAotCi0JCWFkZEltYWdlVGV4dCA9IG5ldyBUZXh0KGFyZWEsIFNXVC5CT1JERVIgfCBTV1QuUkVBRF9PTkxZKTsKLQkJYWRkSW1hZ2VUZXh0LnNldExheW91dERhdGEoZ2QpOwotCi0JCWFzc2lnbkFEREltYWdlQnV0dG9uID0gbmV3IEJ1dHRvbihhcmVhLCBTV1QuTk9ORSk7Ci0JCWFzc2lnbkFEREltYWdlQnV0dG9uCi0JCQkJLnNldFRleHQoQXV0aG9yaW5nVUlSZXNvdXJjZXMuVXNlckRlZmluZWREaWFncmFtRGlhbG9nX2Fzc2lnbkJ1dHRvbik7IAotCQlhc3NpZ25BRERJbWFnZUJ1dHRvbi5zZXRMYXlvdXREYXRhKGJ1dHRvbkdyaWREYXRhKTsKLQotCQljbGVhckFEREltYWdlQnV0dG9uID0gbmV3IEJ1dHRvbihhcmVhLCBTV1QuTk9ORSk7Ci0JCWNsZWFyQURESW1hZ2VCdXR0b24uc2V0VGV4dChBdXRob3JpbmdVSVJlc291cmNlcy5jbGVhckJ1dHRvbl90ZXh0KTsgCi0JCWNsZWFyQURESW1hZ2VCdXR0b24uc2V0TGF5b3V0RGF0YShidXR0b25HcmlkRGF0YSk7Ci0KLQkJLy8gVXNlIFdQRCBJbWFnZSBmb3IgcHVibGlzaGluZwotCQlibGFua0xhYmVsID0gbmV3IExhYmVsKGFyZWEsIFNXVC5OT05FKTsKLQkJYmxhbmtMYWJlbC5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotCi0JCXVzZVdQREltYWdlQnV0dG9uID0gbmV3IEJ1dHRvbihhcmVhLCBTV1QuQ0hFQ0spOwotCQl1c2VXUERJbWFnZUJ1dHRvbi5zZXRUZXh0KEF1dGhvcmluZ1VJUmVzb3VyY2VzLlVzZXJEZWZpbmVkRGlhZ3JhbURpYWxvZ191c2VXUERJbWFnZSk7IAotCQlidXR0b25HRCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5CRUdJTk5JTkcgKTsKLQkJYnV0dG9uR0QuaG9yaXpvbnRhbFNwYW4gPSAzOwotCQl1c2VXUERJbWFnZUJ1dHRvbi5zZXRMYXlvdXREYXRhKGJ1dHRvbkdEKTsKLQotCQkvLyBBc3NpZ24gd29yayBwcm9kdWN0IGRlcGVuZGVuY3kgZGlhZ3JhbSBpbWFnZQotCQlhTGFiZWwgPSBuZXcgTGFiZWwoYXJlYSwgU1dULk5PTkUpOwotCQlhTGFiZWwuc2V0VGV4dChBdXRob3JpbmdVSVJlc291cmNlcy5Vc2VyRGVmaW5lZERpYWdyYW1EaWFsb2dfd3BkSW1hZ2UpOyAKLQotCQl3cGRJbWFnZVRleHQgPSBuZXcgVGV4dChhcmVhLCBTV1QuQk9SREVSIHwgU1dULlJFQURfT05MWSk7Ci0JCXdwZEltYWdlVGV4dC5zZXRMYXlvdXREYXRhKGdkKTsKLQotCQlhc3NpZ25XUERJbWFnZUJ1dHRvbiA9IG5ldyBCdXR0b24oYXJlYSwgU1dULk5PTkUpOwotCQlhc3NpZ25XUERJbWFnZUJ1dHRvbgotCQkJCS5zZXRUZXh0KEF1dGhvcmluZ1VJUmVzb3VyY2VzLlVzZXJEZWZpbmVkRGlhZ3JhbURpYWxvZ19hc3NpZ25CdXR0b24pOyAKLQkJYXNzaWduV1BESW1hZ2VCdXR0b24uc2V0TGF5b3V0RGF0YShidXR0b25HcmlkRGF0YSk7Ci0KLQkJY2xlYXJXUERJbWFnZUJ1dHRvbiA9IG5ldyBCdXR0b24oYXJlYSwgU1dULk5PTkUpOwotCQljbGVhcldQREltYWdlQnV0dG9uLnNldFRleHQoQXV0aG9yaW5nVUlSZXNvdXJjZXMuY2xlYXJCdXR0b25fdGV4dCk7IAotCQljbGVhcldQREltYWdlQnV0dG9uLnNldExheW91dERhdGEoYnV0dG9uR3JpZERhdGEpOwotCi0JCS8vIGxvYWREYXRhCi0JCWxvYWREYXRhKCk7Ci0JCQotCQkvLyBkaXNhYmxlQ29udHJvbHMKLQkJaWYgKFRuZ1V0aWwuaXNMb2NrZWQoYWN0aXZpdHkpIHx8IGlzV3JhcHBlZCl7Ci0JCQlkaXNhYmxlQ29udHJvbHMoKTsKLQkJfQotCi0JCS8vIGFkZCBsaXN0ZW5lcnMKLQkJYWRkTGlzdGVuZXJzKCk7Ci0KLQkJLy8gc2V0IGltYWdlIGFuZCB0aXRsZQotCQlzdXBlcgotCQkJCS5nZXRTaGVsbCgpCi0JCQkJLnNldFRleHQoCi0JCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5Vc2VyRGVmaW5lZERpYWdyYW1EaWFsb2dfdGl0bGUpOyAKLQotCQlyZXR1cm4gYXJlYTsKLQl9Ci0KLQkvKioKLQkgKiBEaXNhYmxlIGNvbnRyb2xzCi0JICoKLQkgKi8KLQlwcml2YXRlIHZvaWQgZGlzYWJsZUNvbnRyb2xzKCkKLQl7Ci0JCXVzZUFESW1hZ2VCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCXVzZUFEREltYWdlQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQl1c2VXUERJbWFnZUJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCi0JCWFzc2lnbkFESW1hZ2VCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCWFzc2lnbkFEREltYWdlQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQlhc3NpZ25XUERJbWFnZUJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCi0JCWNsZWFyQURJbWFnZUJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJY2xlYXJBRERJbWFnZUJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJY2xlYXJXUERJbWFnZUJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQl9Ci0JCi0JLyoqCi0JICogTG9hZHMgaW5pdGlhbCBkYXRhCi0JICoKLQkgKi8KLQlwcml2YXRlIHZvaWQgbG9hZERhdGEoKSB7CQkKLQkJLy8JIGxvYWQgZXhpc3Rpbmcgc3VwcG9ydGluZyBtYXRlcmlhbHMgbGlzdAotCQlleGlzdGluZ0xpc3QuYWRkQWxsKGFjdGl2aXR5LmdldFN1cHBvcnRpbmdNYXRlcmlhbHMoKSk7Ci0KLQkJCi0JCURpYWdyYW1JbmZvIGluZm8gPSBuZXcgRGlhZ3JhbUluZm8oYWN0aXZpdHkpOwotCQlpZiAoaW5mby5nZXRBY3Rpdml0eURpYWdyYW0oKSAhPSBudWxsKSB7Ci0JCQlhZEltYWdlVGV4dC5zZXRUZXh0KFRuZ1V0aWwuZ2V0TGFiZWxXaXRoUGF0aChpbmZvCi0JCQkJCS5nZXRBY3Rpdml0eURpYWdyYW0oKSkpOwotCQkJYWN0aXZpdHlEaWFncmFtID0gaW5mby5nZXRBY3Rpdml0eURpYWdyYW0oKTsKLQkJCQotCQkJZXhpc3RpbmdMaXN0LmFkZChhY3Rpdml0eURpYWdyYW0pOwotCQl9Ci0JCWlmIChpbmZvLmdldEFjdGl2aXR5RGV0YWlsRGlhZ3JhbSgpICE9IG51bGwpIHsKLQkJCWFkZEltYWdlVGV4dC5zZXRUZXh0KFRuZ1V0aWwuZ2V0TGFiZWxXaXRoUGF0aChpbmZvCi0JCQkJCS5nZXRBY3Rpdml0eURldGFpbERpYWdyYW0oKSkpOwotCQkJYWN0aXZpdHlEZXRhaWxEaWFncmFtID0gaW5mby5nZXRBY3Rpdml0eURldGFpbERpYWdyYW0oKTsKLQkJCQotCQkJZXhpc3RpbmdMaXN0LmFkZChhY3Rpdml0eURldGFpbERpYWdyYW0pOwotCQl9Ci0JCWlmIChpbmZvLmdldFdQRERpYWdyYW0oKSAhPSBudWxsKSB7Ci0JCQl3cGRJbWFnZVRleHQKLQkJCQkJLnNldFRleHQoVG5nVXRpbC5nZXRMYWJlbFdpdGhQYXRoKGluZm8uZ2V0V1BERGlhZ3JhbSgpKSk7Ci0JCQl3cGREaWFncmFtID0gaW5mby5nZXRXUEREaWFncmFtKCk7Ci0JCQkKLQkJCWV4aXN0aW5nTGlzdC5hZGQod3BkRGlhZ3JhbSk7Ci0JCX0KLQotCQl1c2VBREltYWdlQnV0dG9uLnNldFNlbGVjdGlvbihpbmZvLmNhblB1Ymxpc2hBREltYWdlKCkpOwotCQl1c2VBRERJbWFnZUJ1dHRvbi5zZXRTZWxlY3Rpb24oaW5mby5jYW5QdWJsaXNoQURESW1hZ2UoKSk7Ci0JCXVzZVdQREltYWdlQnV0dG9uLnNldFNlbGVjdGlvbihpbmZvLmNhblB1Ymxpc2hXUERJbWFnZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGQgbGlzdGVuZXJzCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZExpc3RlbmVycygpIHsKLQkJYXNzaWduQURJbWFnZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQl0cnkgewotCQkJCQlTdXBwb3J0aW5nTWF0ZXJpYWwgc20gPSBvcGVuRmlsdGVyRGlhbG9nKCk7Ci0JCQkJCWlmIChzbSAhPSBudWxsKSB7Ci0JCQkJCQlhY3Rpdml0eURpYWdyYW0gPSBzbTsKLQkJCQkJCWFkSW1hZ2VUZXh0LnNldFRleHQoVG5nVXRpbC5nZXRMYWJlbFdpdGhQYXRoKHNtKSk7Ci0JCQkJCQlleGlzdGluZ0xpc3QuYWRkKGFjdGl2aXR5RGlhZ3JhbSk7Ci0JCQkJCX0KLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCQkJZXgucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQotCQlhc3NpZ25BRERJbWFnZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQl0cnkgewotCQkJCQlTdXBwb3J0aW5nTWF0ZXJpYWwgc20gPSBvcGVuRmlsdGVyRGlhbG9nKCk7Ci0JCQkJCWlmIChzbSAhPSBudWxsKSB7Ci0JCQkJCQlhY3Rpdml0eURldGFpbERpYWdyYW0gPSBzbTsKLQkJCQkJCWFkZEltYWdlVGV4dC5zZXRUZXh0KFRuZ1V0aWwuZ2V0TGFiZWxXaXRoUGF0aChzbSkpOwotCQkJCQkJZXhpc3RpbmdMaXN0LmFkZChhY3Rpdml0eURldGFpbERpYWdyYW0pOwotCQkJCQl9Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCWV4LnByaW50U3RhY2tUcmFjZSgpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJYXNzaWduV1BESW1hZ2VCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJU3VwcG9ydGluZ01hdGVyaWFsIHNtID0gb3BlbkZpbHRlckRpYWxvZygpOwotCQkJCQlpZiAoc20gIT0gbnVsbCkgewotCQkJCQkJd3BkRGlhZ3JhbSA9IHNtOwotCQkJCQkJd3BkSW1hZ2VUZXh0LnNldFRleHQoVG5nVXRpbC5nZXRMYWJlbFdpdGhQYXRoKHNtKSk7Ci0JCQkJCQlleGlzdGluZ0xpc3QuYWRkKHdwZERpYWdyYW0pOwotCQkJCQl9Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCWV4LnByaW50U3RhY2tUcmFjZSgpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJY2xlYXJBREltYWdlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWV4aXN0aW5nTGlzdC5yZW1vdmUoYWN0aXZpdHlEaWFncmFtKTsKLQkJCQlhZEltYWdlVGV4dC5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWFjdGl2aXR5RGlhZ3JhbSA9IG51bGw7Ci0JCQl9Ci0JCX0pOwotCi0JCWNsZWFyQURESW1hZ2VCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJZXhpc3RpbmdMaXN0LnJlbW92ZShhY3Rpdml0eURldGFpbERpYWdyYW0pOwotCQkJCWFkZEltYWdlVGV4dC5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWFjdGl2aXR5RGV0YWlsRGlhZ3JhbSA9IG51bGw7Ci0JCQl9Ci0JCX0pOwotCi0JCWNsZWFyV1BESW1hZ2VCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJZXhpc3RpbmdMaXN0LnJlbW92ZSh3cGREaWFncmFtKTsKLQkJCQl3cGRJbWFnZVRleHQuc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLQkJCQl3cGREaWFncmFtID0gbnVsbDsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JLyoqCi0JICogT3BlbiBhIGZpbHRlciBkaWFsb2cKLQkgKi8KLQlwcml2YXRlIFN1cHBvcnRpbmdNYXRlcmlhbCBvcGVuRmlsdGVyRGlhbG9nKCkgewotCQotCQlJdGVtc0ZpbHRlckRpYWxvZyBmZCA9IG5ldyBJdGVtc0ZpbHRlckRpYWxvZyhQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpCi0JCQkJLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldFNoZWxsKCksIGZpbHRlciwgYWN0aXZpdHksCi0JCQkJRmlsdGVyQ29uc3RhbnRzLlNVUFBPUlRJTkdfTUFURVJJQUxTLCBBcnJheXMuYXNMaXN0KGV4aXN0aW5nTGlzdC50b0FycmF5KCkpKTsKLQkJCi0JCWZkLnNldFRpdGxlKEZpbHRlckNvbnN0YW50cy5TVVBQT1JUSU5HX01BVEVSSUFMUyk7Ci0JCWZkLnNldFZpZXdlclNlbGVjdGlvblNpbmdsZSh0cnVlKTsKLQkJZmQuc2V0SW5wdXQoVW1hVXRpbC5nZXRNZXRob2RMaWJyYXJ5KChFT2JqZWN0KSBhY3Rpdml0eSkpOwotCQlmZC5zZXRCbG9ja09uT3Blbih0cnVlKTsKLQkJZmQub3BlbigpOwotCi0JCUxpc3QgbGlzdCA9IGZkLmdldFNlbGVjdGVkSXRlbXMoKTsKLQkJaWYgKChsaXN0ICE9IG51bGwpICYmICghbGlzdC5pc0VtcHR5KCkpKSB7Ci0JCQlPYmplY3Qgb2JqID0gbGlzdC5nZXQoMCk7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgU3VwcG9ydGluZ01hdGVyaWFsKSB7Ci0JCQkJcmV0dXJuIChTdXBwb3J0aW5nTWF0ZXJpYWwpIG9iajsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENhbGxlZCB3aGVuIHRoZSBPSyBidXR0b24gaXMgc2VsZWN0ZWQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgb2tQcmVzc2VkKCkgewotCQlpZiAoVG5nVXRpbC5pc0xvY2tlZChhY3Rpdml0eSkgfHwgaXNXcmFwcGVkKXsKLQkJCS8vIHRoZW4gZG9uJ3QgbmVlZCB0byBkbyBhbnl0aGluZy4uIGp1c3QgcmV0dXJuCi0JCQlzdXBlci5va1ByZXNzZWQoKTsKLQkJfQotCQlib29sZWFuIGVkaXRvckRpcnR5ID0gZmFsc2U7Ci0JCURpYWdyYW1JbmZvIGluZm8gPSBuZXcgRGlhZ3JhbUluZm8oYWN0aXZpdHkpOwotCi0JCS8vIHNldCBhY3Rpdml0eSBkaWFncmFtCi0JCWlmIChhY3Rpdml0eURpYWdyYW0gIT0gaW5mby5nZXRBY3Rpdml0eURpYWdyYW0oKSkgewotCQkJZWRpdG9yRGlydHkgPSB0cnVlOwotCQl9Ci0JCWluZm8uc2V0QWN0aXZpdHlEaWFncmFtKGFjdGl2aXR5RGlhZ3JhbSk7Ci0KLQkJLy8gc2V0IGFjdGl2aXR5IGRldGFpbCBkaWFncmFtCi0JCWlmICghZWRpdG9yRGlydHkpIHsKLQkJCWlmIChhY3Rpdml0eURldGFpbERpYWdyYW0gIT0gaW5mby5nZXRBY3Rpdml0eURldGFpbERpYWdyYW0oKSkKLQkJCQllZGl0b3JEaXJ0eSA9IHRydWU7Ci0JCX0KLQkJaW5mby5zZXRBY3Rpdml0eURldGFpbERpYWdyYW0oYWN0aXZpdHlEZXRhaWxEaWFncmFtKTsKLQotCQkvLyBzZXQgd29yayBwcm9kdWN0IGRlcGVuZGVuY3kgZGlhZ3JhbQotCQlpZiAoIWVkaXRvckRpcnR5KSB7Ci0JCQlpZiAod3BkRGlhZ3JhbSAhPSBpbmZvLmdldFdQRERpYWdyYW0oKSkKLQkJCQllZGl0b3JEaXJ0eSA9IHRydWU7Ci0JCX0KLQkJaW5mby5zZXRXUEREaWFncmFtKHdwZERpYWdyYW0pOwotCi0JCS8vIHNldCBjYW4gcHVibGlzaCBmbGFnIGZvciBhY3Rpdml0eSBkaWFncmFtCi0JCWJvb2xlYW4gb2xkQ2FuUHVibGlzaEZsYWcgPSBpbmZvLmNhblB1Ymxpc2hBREltYWdlKCk7Ci0JCWJvb2xlYW4gbmV3Q2FuUHVibGlzaEZsYWcgPSB1c2VBREltYWdlQnV0dG9uLmdldFNlbGVjdGlvbigpOwotCQlpZiAoKCFlZGl0b3JEaXJ0eSkgJiYgKG9sZENhblB1Ymxpc2hGbGFnICE9IG5ld0NhblB1Ymxpc2hGbGFnKSkKLQkJCWVkaXRvckRpcnR5ID0gdHJ1ZTsKLQkJaW5mby5zZXRQdWJsaXNoQURJbWFnZSh1c2VBREltYWdlQnV0dG9uLmdldFNlbGVjdGlvbigpKTsKLQotCQkvLyBzZXQgY2FuIHB1Ymxpc2ggZmxhZyBmb3IgYWN0aXZpdHkgZGV0YWlsIGRpYWdyYW0KLQkJb2xkQ2FuUHVibGlzaEZsYWcgPSBpbmZvLmNhblB1Ymxpc2hBRERJbWFnZSgpOwotCQluZXdDYW5QdWJsaXNoRmxhZyA9IHVzZUFEREltYWdlQnV0dG9uLmdldFNlbGVjdGlvbigpOwotCQlpZiAoKCFlZGl0b3JEaXJ0eSkgJiYgKG9sZENhblB1Ymxpc2hGbGFnICE9IG5ld0NhblB1Ymxpc2hGbGFnKSkKLQkJCWVkaXRvckRpcnR5ID0gdHJ1ZTsKLQkJaW5mby5zZXRQdWJsaXNoQURESW1hZ2UodXNlQURESW1hZ2VCdXR0b24uZ2V0U2VsZWN0aW9uKCkpOwotCi0JCS8vIHNldCBjYW4gcHVibGlzaCBmbGFnIGZvciB3b3JrIHByb2R1Y3QgZGVwZW5kZW5jeSBkaWFncmFtCi0JCW9sZENhblB1Ymxpc2hGbGFnID0gaW5mby5jYW5QdWJsaXNoV1BESW1hZ2UoKTsKLQkJbmV3Q2FuUHVibGlzaEZsYWcgPSB1c2VXUERJbWFnZUJ1dHRvbi5nZXRTZWxlY3Rpb24oKTsKLQkJaWYgKCghZWRpdG9yRGlydHkpICYmIChvbGRDYW5QdWJsaXNoRmxhZyAhPSBuZXdDYW5QdWJsaXNoRmxhZykpCi0JCQllZGl0b3JEaXJ0eSA9IHRydWU7Ci0JCWluZm8uc2V0UHVibGlzaFdQREltYWdlKHVzZVdQREltYWdlQnV0dG9uLmdldFNlbGVjdGlvbigpKTsKLQotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkVEaXRvciBkaXJ0eT0iICsgZWRpdG9yRGlydHkpOwotCQlpZiAoZWRpdG9yRGlydHkpIHsKLQotCQkJaWYgKCFwcm9tcHRTYXZlQWN0aXZlRWRpdG9yKCkpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQotCQlzYXZlQWN0aXZlRWRpdG9yKCk7Ci0JCXN1cGVyLm9rUHJlc3NlZCgpOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBwcm9tcHRTYXZlQWN0aXZlRWRpdG9yKCkgewotCQlTdHJpbmcgdGl0bGUgPSBBdXRob3JpbmdVSVJlc291cmNlcy5wcm9jZXNzRm9ybUVkaXRvclNhdmVEaWFsb2dfdGl0bGU7IAotCQlTdHJpbmcgbWVzc2FnZSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLnByb2Nlc3NGb3JtRWRpdG9yU2F2ZURpYWxvZ19tZXNzYWdlMjsgCi0JCS8vIGlmIChlZGl0b3IuaXNEaXJ0eSgpKSB7Ci0JCXJldHVybiBBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkKLQkJCQkuZGlzcGxheUNvbmZpcm1hdGlvbih0aXRsZSwgbWVzc2FnZSk7Ci0JCS8vIH0KLQkJLy8gcmV0dXJuIHRydWU7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNhdmVBY3RpdmVFZGl0b3IoKSB7Ci0JCS8vIHNhdmUgdGhlIGVkaXRvcgotCQlCdXN5SW5kaWNhdG9yLnNob3dXaGlsZShlZGl0b3IuZ2V0RWRpdG9yU2l0ZSgpLmdldFNoZWxsKCkuZ2V0RGlzcGxheSgpLAotCQkJCW5ldyBSdW5uYWJsZSgpIHsKLQotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkoKFByb2Nlc3NFZGl0b3IpIGVkaXRvcikucmVzb3VyY2VzVG9TYXZlCi0JCQkJCQkJCS5hZGQoKChQcm9jZXNzQ29tcG9uZW50KSAoKE1ldGhvZEVsZW1lbnRFZGl0b3JJbnB1dCkgZWRpdG9yCi0JCQkJCQkJCQkJLmdldEVkaXRvcklucHV0KCkpLmdldE1ldGhvZEVsZW1lbnQoKSkKLQkJCQkJCQkJCQkuZ2V0UHJvY2VzcygpLmVSZXNvdXJjZSgpKTsKLQkJCQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigic2F2aW5nLi4uIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCWVkaXRvci5kb1NhdmUobmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCQkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oInNhdmluZyBkb25lIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCi0JCQkJfSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2RpYWxvZ3MvVmFyaWFiaWxpdHlTZWxlY3Rpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZGlhbG9ncy9WYXJpYWJpbGl0eVNlbGVjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZmNiZTA0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZGlhbG9ncy9WYXJpYWJpbGl0eVNlbGVjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjY3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZGlhbG9nczsKLQotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZmlsdGVycy5BbGxGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuUHJlc2VudGF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuQ2F0ZWdvcml6ZWRQcm9jZXNzZXNJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5Db250ZW50Q2F0ZWdvcmllc0dyb3VwSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuRmlsdGVyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuUHJvY2Vzc2VzSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5NZXRob2RFbGVtZW50VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DdXN0b21DYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaWJhYmxlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpc2NpcGxpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQXNzb2NpYXRpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLQotCi0vKioKLSAqIFRoZSBkaWFsb2cgZm9yIHNob3dpbmcgYW5kIHBvc3NpYmx5IHNlbGVjdGluZyBhbnkgdmFyaWFiaWxpdHkgcmVsYXRlZCB0byB0aGUKLSAqIGdpdmVuIGVsZW1lbnQuCi0gKiAKLSAqIEBhdXRob3IgSmVmZiBIYXJkeQotICogQHNpbmNlIDEuMQotICovCi1wdWJsaWMgY2xhc3MgVmFyaWFiaWxpdHlTZWxlY3Rpb24gewotCi0JcHJpdmF0ZSBIYXNoU2V0IGZpbHRlckVsZW1lbnRMaXN0ID0gbmV3IEhhc2hTZXQoKTsKLQotCXByaXZhdGUgY2xhc3MgVmFyaWFiaWxpdHlGaWx0ZXIgZXh0ZW5kcyBBbGxGaWx0ZXIgewotCQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoT2JqZWN0IG9iaikgewotCQkJT2JqZWN0IGNvbnRlbnRFbGVtZW50ID0gaGVscGVyLmdldENvbnRlbnRFbGVtZW50KCk7Ci0JCQlpZiAoY29udGVudEVsZW1lbnQgIT0gbnVsbCkgewotCQkJCWlmIChvYmouZXF1YWxzKGhlbHBlci5nZXRDb250ZW50RWxlbWVudCgpKSkKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCi0JCQlpZiAoaGVscGVyLmdldEFscmVhZHlTZWxlY3RlZExpc3QoKSAhPSBudWxsKSB7Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpIHsKLQkJCQkJaWYgKGhlbHBlci5nZXRBbHJlYWR5U2VsZWN0ZWRMaXN0KCkuY29udGFpbnMoCi0JCQkJCQkJKChQcm9jZXNzQ29tcG9uZW50KSBvYmopLmdldFByb2Nlc3MoKSkpCi0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJaWYgKGhlbHBlci5nZXRBbHJlYWR5U2VsZWN0ZWRMaXN0KCkuY29udGFpbnMob2JqKSkKLQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmIChvYmogaW5zdGFuY2VvZiBDdXN0b21DYXRlZ29yeSkgewotCQkJCWlmIChUbmdVdGlsLmlzUm9vdEN1c3RvbUNhdGVnb3J5KChDdXN0b21DYXRlZ29yeSkgb2JqKSkgewotCQkJCQlpZiAoKChDdXN0b21DYXRlZ29yeSkgb2JqKS5nZXRDYXRlZ29yaXplZEVsZW1lbnRzKCkKLQkJCQkJCQkuaXNFbXB0eSgpKQotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCX0KLQkJCWlmICghaGVscGVyLm1hdGNoUGF0dGVybihvYmopKQotCQkJCXJldHVybiBmYWxzZTsKLQotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikgewotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pIHsKLQkJCQkJaWYgKGNvbnRlbnRFbGVtZW50ICE9IG51bGwpIHsKLQkJCQkJCWlmIChNZXRob2RFbGVtZW50VXRpbC5nZXRBbGxNb2RlbHMoY29udGVudEVsZW1lbnQpCi0JCQkJCQkJCS5jb250YWlucyhvYmopKQotCQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQkJZWxzZQotCQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIENvbnRlbnRQYWNrYWdlKQotCQkJCXJldHVybiB0cnVlOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIENvbnRlbnRDYXRlZ29yaWVzR3JvdXBJdGVtUHJvdmlkZXIpIHsKLQkJCQlDb2xsZWN0aW9uIGxpc3QgPSAoKENvbnRlbnRDYXRlZ29yaWVzR3JvdXBJdGVtUHJvdmlkZXIpIG9iaikKLQkJCQkJCS5nZXRDaGlsZHJlbihvYmopOwotCQkJCWlmIChsaXN0LmlzRW1wdHkoKSkKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCWVsc2UKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgUHJvY2Vzc2VzSXRlbVByb3ZpZGVyKSB7Ci0JCQkJQ29sbGVjdGlvbiBsaXN0ID0gKChQcm9jZXNzZXNJdGVtUHJvdmlkZXIpIG9iaikKLQkJCQkJCS5nZXRDaGlsZHJlbihvYmopOwotCQkJCWZvciAoSXRlcmF0b3IgaW9yID0gbGlzdC5pdGVyYXRvcigpOyBpb3IuaGFzTmV4dCgpOykgewotCQkJCQlPYmplY3Qgb2JqZWN0ID0gaW9yLm5leHQoKTsKLQkJCQkJaWYgKCgoQ2F0ZWdvcml6ZWRQcm9jZXNzZXNJdGVtUHJvdmlkZXIpIG9iamVjdCkKLQkJCQkJCQkuZ2V0Q2hpbGRyZW4ob2JqZWN0KS5pc0VtcHR5KCkpCi0JCQkJCQlpb3IucmVtb3ZlKCk7Ci0JCQkJfQotCQkJCWlmIChsaXN0LmlzRW1wdHkoKSkKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCWVsc2UKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0KLQkJCWlmIChjaGlsZEFjY2VwdChvYmopKQotCQkJCXJldHVybiB0cnVlOwotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gY2hpbGRBY2NlcHQoT2JqZWN0IG9iaikgewotCQkJaWYgKChvYmogaW5zdGFuY2VvZiBDb250ZW50RWxlbWVudCkKLQkJCQkJJiYgZmlsdGVyRWxlbWVudExpc3QuY29udGFpbnMob2JqKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfTsKLQotCS8qKgotCSAqIERpc3BsYXkgdmFyaWFiaWxpdHkgc2VsZWN0aW9uIGRpYWxvZyB3aGljaCBsaXN0cyBlbGVtZW50cyBhbmQgaXQncwotCSAqIHZhcmlhYmlsaXRpZXMuCi0JICogCi0JICovCi0JcHVibGljIFZhcmlhYmlsaXR5U2VsZWN0aW9uKCkgewotCX0KLQotCS8qKgotCSAqIEl0IHNob3dzIGRpYWxvZyBib3ggZm9yIGFsbCB0aGUgY29udHJpYnV0b3JzLiBVc2VyIGlzIGV4cGVjdGVkIHRvIHNlbGVjdAotCSAqIG9uZS4KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqIEByZXR1cm4KLQkgKiAJCU9iamVjdCBzZWxlY3RlZCBieSB1c2VyCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRTZWxlY3RlZFZhcmlhYmlsaXR5KFZhcmlhYmlsaXR5RWxlbWVudCBlbGVtZW50KSB7Ci0JCVNldCBlbGVtZW50U2V0ID0gbmV3IEhhc2hTZXQoKTsKLQkJZWxlbWVudFNldC5hZGQoZWxlbWVudCk7Ci0JCWVsZW1lbnRTZXQgPSBBc3NvY2lhdGlvbkhlbHBlci5nZXRWYXJpYWJpbGl0eUVsZW1lbnRzKGVsZW1lbnRTZXQsIHRydWUsIHRydWUpOwotCi0JCWZpbHRlckVsZW1lbnRMaXN0LmFkZEFsbChlbGVtZW50U2V0KTsKLQkJaWYgKCFlbGVtZW50U2V0LmlzRW1wdHkoKSkgewotCi0JCQlmb3IgKEl0ZXJhdG9yIGl0b3IgPSBlbGVtZW50U2V0Lml0ZXJhdG9yKCk7IGl0b3IuaGFzTmV4dCgpOykgewotCQkJCUNvbnRlbnRFbGVtZW50IGNvbnRlbnRFbGVtZW50ID0gKENvbnRlbnRFbGVtZW50KSBpdG9yLm5leHQoKTsKLQkJCQlMaXN0IGdyb3VwaW5ncyA9IG51bGw7Ci0JCQkJaWYgKGNvbnRlbnRFbGVtZW50IGluc3RhbmNlb2YgRGlzY2lwbGluZSkgewotCQkJCQlncm91cGluZ3MgPSBBc3NvY2lhdGlvbkhlbHBlcgotCQkJCQkJCS5nZXREaXNjaXBsaW5lR3JvdXBzKChEaXNjaXBsaW5lKSBjb250ZW50RWxlbWVudCk7Ci0KLQkJCQl9Ci0JCQkJaWYgKGNvbnRlbnRFbGVtZW50IGluc3RhbmNlb2YgUm9sZVNldCkgewotCQkJCQlncm91cGluZ3MgPSBBc3NvY2lhdGlvbkhlbHBlcgotCQkJCQkJCS5nZXRSb2xlU2V0R3JvdXBzKChSb2xlU2V0KSBjb250ZW50RWxlbWVudCk7Ci0JCQkJfQotCQkJCQotCQkJCWlmIChjb250ZW50RWxlbWVudCBpbnN0YW5jZW9mIEN1c3RvbUNhdGVnb3J5KSB7Ci0JCQkJCWdyb3VwaW5ncyA9IGdldEFuY2VzdG9ycygoQ3VzdG9tQ2F0ZWdvcnkpY29udGVudEVsZW1lbnQpOwotCQkJCX0KLQotCQkJCWlmICgoZ3JvdXBpbmdzICE9IG51bGwpICYmICghZ3JvdXBpbmdzLmlzRW1wdHkoKSkpCi0JCQkJCWZpbHRlckVsZW1lbnRMaXN0LmFkZEFsbChncm91cGluZ3MpOwotCi0JCQl9Ci0KLQkJCUlGaWx0ZXIgZmlsdGVyID0gbmV3IFZhcmlhYmlsaXR5RmlsdGVyKCk7Ci0JCQlTdHJpbmdbXSBzdHIgPSBuZXcgU3RyaW5nW10geyBGaWx0ZXJDb25zdGFudHMuQ09ORklHX0NPTlRFTlRfRUxFTUVOVCB9OwotCQkJSXRlbXNGaWx0ZXJEaWFsb2cgZGxnID0gbmV3IEl0ZW1zRmlsdGVyRGlhbG9nKFBsYXRmb3JtVUkKLQkJCQkJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldFNoZWxsKCkpOwotCQkJZGxnLnNldEZpbHRlcihmaWx0ZXIpOwotCQkJZGxnLnNldFRpdGxlKEZpbHRlckNvbnN0YW50cy5DT05GSUdfQ09OVEVOVF9FTEVNRU5UKTsKLQkJCWRsZy5zZXRWaWV3ZXJTZWxlY3Rpb25TaW5nbGUodHJ1ZSk7Ci0JCQlkbGcuc2V0VHlwZXMoc3RyKTsKLQkJCWRsZy5zZXRJbnB1dChVbWFVdGlsLmdldE1ldGhvZExpYnJhcnkoKEVPYmplY3QpIGVsZW1lbnQpKTsKLQkJCWRsZy5zZXRDb250ZW50UHJvdmlkZXIobmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKAotCQkJCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkJCS5nZXRJdGVtc0ZpbHRlcl9BZGFwdGVyRmFjdG9yeShmaWx0ZXIpKSwKLQkJCQkJCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRS5nZXRJdGVtc0ZpbHRlcl9Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpOwotCQkJZGxnLnNldEJsb2NrT25PcGVuKHRydWUpOwotCi0JCQlTdHJpbmcgZWxlbWVudE5hbWUgPSBlbGVtZW50LmdldE5hbWUoKTsKLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgRGVzY3JpYmFibGVFbGVtZW50Ci0JCQkJCSYmIFByZXNlbnRhdGlvbkNvbnRleHQuSU5TVEFOQ0UuaXNTaG93UHJlc2VudGF0aW9uTmFtZXMoKSkgewotCQkJCWlmICgoKERlc2NyaWJhYmxlRWxlbWVudCkgZWxlbWVudCkuZ2V0UHJlc2VudGF0aW9uTmFtZSgpLnRyaW0oKQotCQkJCQkJLmxlbmd0aCgpID4gMCkKLQkJCQkJZWxlbWVudE5hbWUgPSAoKERlc2NyaWJhYmxlRWxlbWVudCkgZWxlbWVudCkKLQkJCQkJCQkuZ2V0UHJlc2VudGF0aW9uTmFtZSgpOwotCQkJfQotCQkJZGxnCi0JCQkJCS5zZXRWaWV3ZXJMYWJlbChBdXRob3JpbmdVSVJlc291cmNlcy5iaW5kKEF1dGhvcmluZ1VJUmVzb3VyY2VzLlZhcmlhYmlsaXR5U2VsZWN0aW9uX2ZpbHRlcmRpYWxvZ192aWV3ZXJMYWJlbCwgKG5ldyBTdHJpbmdbXSB7IGVsZW1lbnROYW1lIH0pKSk7Ci0KLQkJCVN0cmluZyB0aXRsZSA9IE1lc3NhZ2VGb3JtYXQKLQkJCQkJLmZvcm1hdCgKLQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5WYXJpYWJpbGl0eVNlbGVjdGlvbl9maWx0ZXJkaWFsb2dfdGl0bGUsIAotCQkJCQkJCW5ldyBTdHJpbmdbXSB7IGVsZW1lbnROYW1lIH0pOwotCi0JCQlkbGcuc2V0VGl0bGUodGl0bGUpOwotCQkJZGxnLnNldEJsb2NrT25PcGVuKHRydWUpOwotCQkJZGxnLm9wZW4oKTsKLQotCQkJTGlzdCByZXN1bHQgPSBkbGcuZ2V0U2VsZWN0ZWRJdGVtcygpOwotCQkJaWYgKChyZXN1bHQgPT0gbnVsbCkgfHwgKHJlc3VsdC5pc0VtcHR5KCkpKQotCQkJCXJldHVybiBudWxsOwotCQkJZWxzZQotCQkJCXJldHVybiByZXN1bHQuZ2V0KDApOwotCQl9Ci0JCXJldHVybiBlbGVtZW50OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGFuY2VzdG9ycyBmb3IgdGhlIGdpdmVuIEN1c3RvbSBDYXRlZ29yeS4KLQkgKiB0YWtlbiBmcm9tIGF1dGhvcmluZy51aS5DdXN0b21DYXRlZ29yeUFzc2lnblBhZ2UKLQkgKi8KLQlwcml2YXRlIExpc3QgZ2V0QW5jZXN0b3JzKEN1c3RvbUNhdGVnb3J5IG1ldGhvZE9iamVjdCkgewotCQlMaXN0IGFuY2VzdG9yTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJTGlzdCBvYmpMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlvYmpMaXN0LmFkZChtZXRob2RPYmplY3QpOwotCQlnZXRBbmNlc3RvcnMoYW5jZXN0b3JMaXN0LCBvYmpMaXN0KTsKLQkJcmV0dXJuIGFuY2VzdG9yTGlzdDsKLQl9Ci0KLQlwcml2YXRlIExpc3QgZ2V0QW5jZXN0b3JzKExpc3QgYW5jZXN0b3JMaXN0LCBMaXN0IG1ldGhvZE9iamVjdExpc3QpIHsKLQkJaWYgKG1ldGhvZE9iamVjdExpc3QuaXNFbXB0eSgpKQotCQkJcmV0dXJuIGFuY2VzdG9yTGlzdDsKLQotCQlMaXN0IGFsbFBhcmVudEN1c3RDYXRzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCWZvciAoSXRlcmF0b3IgaXRlciA9IG1ldGhvZE9iamVjdExpc3QuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlDdXN0b21DYXRlZ29yeSBlbGVtZW50ID0gKEN1c3RvbUNhdGVnb3J5KSBpdGVyLm5leHQoKTsKLQkJCUxpc3QgcGFyZW50TGlzdCA9IEFzc29jaWF0aW9uSGVscGVyLmdldEN1c3RvbUNhdGVnb3JpZXMoZWxlbWVudCk7Ci0JCQlhbGxQYXJlbnRDdXN0Q2F0cy5hZGRBbGwocGFyZW50TGlzdCk7Ci0JCX0KLQotCQlhbmNlc3Rvckxpc3QuYWRkQWxsKG1ldGhvZE9iamVjdExpc3QpOwotCQlMaXN0IG5leHRDaGVja0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGFsbFBhcmVudEN1c3RDYXRzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyLm5leHQoKTsKLQkJCWlmICghYW5jZXN0b3JMaXN0LmNvbnRhaW5zKGVsZW1lbnQpKSB7Ci0JCQkJbmV4dENoZWNrTGlzdC5hZGQoZWxlbWVudCk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gZ2V0QW5jZXN0b3JzKGFuY2VzdG9yTGlzdCwgbmV4dENoZWNrTGlzdCk7Ci0JfQotCi0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZGlhbG9ncy9wYWNrYWdlLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2RpYWxvZ3MvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNDM3MTE5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZGlhbG9ncy9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyBkaWFsb2dzIGZvciB0aGUgQXV0aG9yaW5nIFVJLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZG5kL0VkaXRpbmdEb21haW5UYWJsZVRyZWVWaWV3ZXJEcm9wQWRhcHRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9kbmQvRWRpdGluZ0RvbWFpblRhYmxlVHJlZVZpZXdlckRyb3BBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2OGQ1NzUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9kbmQvRWRpdGluZ0RvbWFpblRhYmxlVHJlZVZpZXdlckRyb3BBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5kbmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkRyYWdBbmREcm9wQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkRyYWdBbmREcm9wRmVlZGJhY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuZG5kLkVkaXRpbmdEb21haW5WaWV3ZXJEcm9wQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlVHJlZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLkRORDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLkRyb3BUYXJnZXRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuV2lkZ2V0OwotCi0vKioKLSAqIERyb3AgYWRhcHRlciBmb3IgZHJhZyBhbmQgZHJvcAotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRWRpdGluZ0RvbWFpblRhYmxlVHJlZVZpZXdlckRyb3BBZGFwdGVyIGV4dGVuZHMKLQkJRWRpdGluZ0RvbWFpblZpZXdlckRyb3BBZGFwdGVyIHsKLQotCXB1YmxpYyBFZGl0aW5nRG9tYWluVGFibGVUcmVlVmlld2VyRHJvcEFkYXB0ZXIoRWRpdGluZ0RvbWFpbiBkb21haW4sCi0JCQlWaWV3ZXIgdmlld2VyKSB7Ci0JCXN1cGVyKGRvbWFpbiwgdmlld2VyKTsKLQl9Ci0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuZG5kLkVkaXRpbmdEb21haW5WaWV3ZXJEcm9wQWRhcHRlciNkcmFnRW50ZXIob3JnLmVjbGlwc2Uuc3d0LmRuZC5Ecm9wVGFyZ2V0RXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgZHJhZ0VudGVyKERyb3BUYXJnZXRFdmVudCBldmVudCkgewotCQlpZiAoZXZlbnQuZGV0YWlsID09IERORC5EUk9QX05PTkUpIHsKLQkJCWV2ZW50LmRldGFpbCA9IERORC5EUk9QX0NPUFk7Ci0JCX0KLQkJc3VwZXIuZHJhZ0VudGVyKGV2ZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmRuZC5FZGl0aW5nRG9tYWluVmlld2VyRHJvcEFkYXB0ZXIjZHJhZ092ZXIob3JnLmVjbGlwc2Uuc3d0LmRuZC5Ecm9wVGFyZ2V0RXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgZHJhZ092ZXIoRHJvcFRhcmdldEV2ZW50IGV2ZW50KSB7Ci0JCWlmIChldmVudC5kZXRhaWwgPT0gRE5ELkRST1BfTk9ORSkgewotCQkJZXZlbnQuZGV0YWlsID0gRE5ELkRST1BfQ09QWTsKLQkJfQotCi0JCXN1cGVyLmRyYWdPdmVyKGV2ZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmRuZC5FZGl0aW5nRG9tYWluVmlld2VyRHJvcEFkYXB0ZXIjZHJvcEFjY2VwdChvcmcuZWNsaXBzZS5zd3QuZG5kLkRyb3BUYXJnZXRFdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkcm9wQWNjZXB0KERyb3BUYXJnZXRFdmVudCBldmVudCkgewotCQlpZiAoZXZlbnQuZGV0YWlsID09IERORC5EUk9QX05PTkUpIHsKLQkJCWV2ZW50LmRldGFpbCA9IERORC5EUk9QX0NPUFk7Ci0JCX0KLQotCQlzdXBlci5kcm9wQWNjZXB0KGV2ZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmRuZC5FZGl0aW5nRG9tYWluVmlld2VyRHJvcEFkYXB0ZXIjaGVscGVyKG9yZy5lY2xpcHNlLnN3dC5kbmQuRHJvcFRhcmdldEV2ZW50KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGhlbHBlcihEcm9wVGFyZ2V0RXZlbnQgZXZlbnQpIHsKLQkJVGFibGUgdGFibGUgPSBudWxsOwotCQlUYWJsZUl0ZW0gaXRlbSA9IG51bGw7Ci0JCWlmICh2aWV3ZXIgaW5zdGFuY2VvZiBUYWJsZVRyZWVWaWV3ZXIpIHsKLQkJCXRhYmxlID0gKChUYWJsZVRyZWVWaWV3ZXIpIHZpZXdlcikuZ2V0VGFibGVUcmVlKCkuZ2V0VGFibGUoKTsKLQkJCWl0ZW0gPSB0YWJsZS5nZXRJdGVtKHRhYmxlLnRvQ29udHJvbChldmVudC54LCBldmVudC55KSk7Ci0JCQlldmVudC5pdGVtID0gaXRlbTsKLQkJfQotCi0JCXN1cGVySGVscGVyKGV2ZW50KTsKLQotCQlpZiAoaXRlbSAhPSBudWxsICYmIChldmVudC5mZWVkYmFjayAmIERORC5GRUVEQkFDS19TRUxFQ1QpICE9IDApIHsKLQkJCXRhYmxlLnNldFNlbGVjdGlvbihuZXcgVGFibGVJdGVtW10geyBpdGVtIH0pOwotCQl9Ci0JfQotCi0JLyoqCi0JICogR2V0IGRyb3AgdGFyZ2V0Ci0JICogCi0JICogQHBhcmFtIGl0ZW0KLQkgKiBAcmV0dXJuIGRyb3AgdGFyZ2V0IG9iamVjdAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZ2V0RHJvcFRhcmdldChXaWRnZXQgaXRlbSkgewotCQlyZXR1cm4gZXh0cmFjdERyb3BUYXJnZXQoaXRlbSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBpcyBjYWxsZWQgdG8gaW5kaWNhdGUgdGhhdCB0aGUgZHJvcCBhY3Rpb24gc2hvdWxkIGJlIGludm9rZWQuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5kbmQuRWRpdGluZ0RvbWFpblZpZXdlckRyb3BBZGFwdGVyI2Ryb3Aob3JnLmVjbGlwc2Uuc3d0LmRuZC5Ecm9wVGFyZ2V0RXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgZHJvcChEcm9wVGFyZ2V0RXZlbnQgZXZlbnQpIHsKLQkJLy8gQSBjb21tYW5kIHdhcyBjcmVhdGVkIGlmIHRoZSBzb3VyY2Ugd2FzIGF2YWlsYWJsZSBlYXJseSwgYW5kIHRoZQotCQkvLyBpbmZvcm1hdGlvbiB1c2VkIHRvIGNyZWF0ZSBpdCB3YXMgY2FjaGVkLi4uCi0JCWlmIChkcmFnQW5kRHJvcENvbW1hbmRJbmZvcm1hdGlvbiAhPSBudWxsKSB7Ci0JCQkvLyBSZWNyZWF0ZSB0aGUgY29tbWFuZC4KLQkJCWNvbW1hbmQgPSBkcmFnQW5kRHJvcENvbW1hbmRJbmZvcm1hdGlvbi5jcmVhdGVDb21tYW5kKCk7Ci0JCX0gZWxzZSB7Ci0JCQkvLyBPdGhlcndpc2UsIHRoZSBzb3VyY2Ugc2hvdWxkIGJlIGF2YWlsYWJsZSBub3cgYXMgZXZlbnQuZGF0YSwgYW5kCi0JCQkvLyB3ZSBjYW4gY3JlYXRlIHRoZSBjb21tYW5kLgotCQkJc291cmNlID0gZXh0cmFjdERyYWdTb3VyY2UoZXZlbnQuZGF0YSk7Ci0JCQlPYmplY3QgdGFyZ2V0ID0gZ2V0RHJvcFRhcmdldChldmVudC5pdGVtKTsKLQkJCWNvbW1hbmQgPSBEcmFnQW5kRHJvcENvbW1hbmQuY3JlYXRlKGRvbWFpbiwgdGFyZ2V0LAotCQkJCQlnZXRMb2NhdGlvbihldmVudCksIGV2ZW50Lm9wZXJhdGlvbnMsIG9yaWdpbmFsT3BlcmF0aW9uLAotCQkJCQlzb3VyY2UpOwotCQl9Ci0KLQkJLy8gSWYgdGhlIGNvbW1hbmQgY2FuIGV4ZWN1dGUuLi4KLQkJaWYgKGNvbW1hbmQuY2FuRXhlY3V0ZSgpKSB7Ci0JCQkvLyBFeGVjdXRlIGl0LgotCQkJZG9tYWluLmdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUoY29tbWFuZCk7Ci0JCX0gZWxzZSB7Ci0JCQkvLyBPdGhlcndpc2UsIGxldCdzIGNhbGwgdGhlIHdob2xlIHRoaW5nIG9mZi4KLQkJCWV2ZW50LmRldGFpbCA9IERORC5EUk9QX05PTkU7Ci0JCQljb21tYW5kLmRpc3Bvc2UoKTsKLQkJfQotCi0JCS8vIENsZWFuIHVwIHRoZSBzdGF0ZS4KLQkJY29tbWFuZCA9IG51bGw7Ci0JCWNvbW1hbmRUYXJnZXQgPSBudWxsOwotCQlzb3VyY2UgPSBudWxsOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB0aGUgc2FtZSB3YXkgZm9yIGVhY2ggb2YgdGhlCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLnN3dC5kbmQuRHJvcFRhcmdldExpc3RlbmVyfSBtZXRob2RzLCBleGNlcHQgZm9yIGxlYXZlCi0JICogYW5kIGRyb3AuIElmIHRoZSBzb3VyY2UgaXMgYXZhaWxhYmxlIGVhcmx5LCBpdCBjcmVhdGVzIG9yIHJldmFsaWRhdGVzIHRoZQotCSAqIHtAbGluayBEcmFnQW5kRHJvcENvbW1hbmR9LCBhbmQgdXBkYXRlcyB0aGUgZXZlbnQncyBkZXRhaWwgKG9wZXJhdGlvbikKLQkgKiBhbmQgZmVlZGJhY2sgKGRyYWcgdW5kZXIgZWZmZWN0KSwgYXBwcm9wcmlhdGVseS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzdXBlckhlbHBlcihEcm9wVGFyZ2V0RXZlbnQgZXZlbnQpIHsKLQkJLy8gSWYgd2UgY2FuJ3QgZG8gYW55dGhpbmcgZWxzZSwgd2UnbGwgcHJvdmlkZSB0aGUgZGVmYXVsdCBzZWxlY3QKLQkJLy8gZmVlZGJhY2sgYW5kIGVuYWJsZSBhdXRvLXNjcm9sbCBhbmQgYXV0by1leHBhbmQgZWZmZWN0cy4KLQkJZXZlbnQuZmVlZGJhY2sgPSBETkQuRkVFREJBQ0tfU0VMRUNUIHwgZ2V0QXV0b0ZlZWRiYWNrKCk7Ci0KLQkJLy8gSWYgd2UgZG9uJ3QgYWxyZWFkeSBoYXZlIGl0LCB0cnkgdG8gZ2V0IHRoZSBzb3VyY2UgZWFybHkuIFdlIGNhbid0Ci0JCS8vIGdpdmUgZmVlZGJhY2sgaWYgaXQncyBub3QgYXZhaWxhYmxlIHlldCAodGhpcyBpcyBwbGF0Zm9ybS1kZXBlbmRlbnQpLgotCQlpZiAoc291cmNlID09IG51bGwpIHsKLQkJCXNvdXJjZSA9IGdldERyYWdTb3VyY2UoZXZlbnQpOwotCQkJaWYgKHNvdXJjZSA9PSBudWxsKQotCQkJCXJldHVybjsKLQkJfQotCi0JCS8vIEdldCB0aGUgdGFyZ2V0IG9iamVjdCBmcm9tIHRoZSBpdGVtIHdpZGdldCBhbmQgdGhlIG1vdXNlIGxvY2F0aW9uIGluCi0JCS8vIGl0LgotCQlPYmplY3QgdGFyZ2V0ID0gZ2V0RHJvcFRhcmdldChldmVudC5pdGVtKTsKLQkJZmxvYXQgbG9jYXRpb24gPSBnZXRMb2NhdGlvbihldmVudCk7Ci0KLQkJLy8gRGV0ZXJtaW5lIGlmIHdlIGNhbiBjcmVhdGUgYSB2YWxpZCBjb21tYW5kIGF0IHRoZSBjdXJyZW50IGxvY2F0aW9uLgotCQlib29sZWFuIHZhbGlkID0gZmFsc2U7Ci0KLQkJLy8gSWYgd2UgZG9uJ3QgaGF2ZSBhIHByZXZpb3VzIGNhY2hlZCBjb21tYW5kLi4uCi0JCWlmIChjb21tYW5kID09IG51bGwpIHsKLQkJCS8vIFdlJ2xsIG5lZWQgdG8ga2VlcCB0cmFjayBvZiB0aGUgaW5mb3JtYXRpb24gd2UgdXNlIHRvIGNyZWF0ZSB0aGUKLQkJCS8vIGNvbW1hbmQsIHNvIHRoYXQgd2UgY2FuIHJlY3JlYXRlIGl0IGluIGRyb3AuCi0JCQlkcmFnQW5kRHJvcENvbW1hbmRJbmZvcm1hdGlvbiA9IG5ldyBEcmFnQW5kRHJvcENvbW1hbmRJbmZvcm1hdGlvbigKLQkJCQkJZG9tYWluLCB0YXJnZXQsIGxvY2F0aW9uLCBldmVudC5vcGVyYXRpb25zLAotCQkJCQlvcmlnaW5hbE9wZXJhdGlvbiwgc291cmNlKTsKLQotCQkJLy8gUmVtZW1iZXIgdGhlIHRhcmdldDsgY3JlYXRlIHRoZSBjb21tYW5kIGFuZCB0ZXN0IGlmIGl0IGlzCi0JCQkvLyBleGVjdXRhYmxlLgotCQkJY29tbWFuZFRhcmdldCA9IHRhcmdldDsKLQkJCWNvbW1hbmQgPSBkcmFnQW5kRHJvcENvbW1hbmRJbmZvcm1hdGlvbi5jcmVhdGVDb21tYW5kKCk7Ci0JCQl2YWxpZCA9IGNvbW1hbmQuY2FuRXhlY3V0ZSgpOwotCQl9IGVsc2UgewotCQkJLy8gQ2hlY2sgaWYgdGhlIGNhY2hlZCBjb21tYW5kIGNhbiBwcm92aWRlIERORAotCQkJLy8gZmVlZGJhY2svcmV2YWxpZGF0aW9uLgotCQkJaWYgKHRhcmdldCA9PSBjb21tYW5kVGFyZ2V0Ci0JCQkJCSYmIGNvbW1hbmQgaW5zdGFuY2VvZiBEcmFnQW5kRHJvcEZlZWRiYWNrKSB7Ci0JCQkJLy8gSWYgc28sIHJldmFsaWRhdGUgdGhlIGNvbW1hbmQuCi0JCQkJdmFsaWQgPSAoKERyYWdBbmREcm9wRmVlZGJhY2spIGNvbW1hbmQpLnZhbGlkYXRlKHRhcmdldCwKLQkJCQkJCWxvY2F0aW9uLCBldmVudC5vcGVyYXRpb25zLCBvcmlnaW5hbE9wZXJhdGlvbiwgc291cmNlKTsKLQotCQkJCS8vIEtlZXAgdHJhY2sgb2YgYW55IGNoYW5nZXMgdG8gdGhlIGNvbW1hbmQgaW5mb3JtYXRpb24uCi0JCQkJZHJhZ0FuZERyb3BDb21tYW5kSW5mb3JtYXRpb24gPSBuZXcgRHJhZ0FuZERyb3BDb21tYW5kSW5mb3JtYXRpb24oCi0JCQkJCQlkb21haW4sIHRhcmdldCwgbG9jYXRpb24sIGV2ZW50Lm9wZXJhdGlvbnMsCi0JCQkJCQlvcmlnaW5hbE9wZXJhdGlvbiwgc291cmNlKTsKLQkJCX0gZWxzZSB7Ci0JCQkJLy8gSWYgbm90LCBkaXNwb3NlIHRoZSBjdXJyZW50IGNvbW1hbmQgYW5kIGNyZWF0ZSBhIG5ldyBvbmUuCi0JCQkJZHJhZ0FuZERyb3BDb21tYW5kSW5mb3JtYXRpb24gPSBuZXcgRHJhZ0FuZERyb3BDb21tYW5kSW5mb3JtYXRpb24oCi0JCQkJCQlkb21haW4sIHRhcmdldCwgbG9jYXRpb24sIGV2ZW50Lm9wZXJhdGlvbnMsCi0JCQkJCQlvcmlnaW5hbE9wZXJhdGlvbiwgc291cmNlKTsKLQkJCQljb21tYW5kVGFyZ2V0ID0gdGFyZ2V0OwotCQkJCWNvbW1hbmQuZGlzcG9zZSgpOwotCQkJCWNvbW1hbmQgPSBkcmFnQW5kRHJvcENvbW1hbmRJbmZvcm1hdGlvbi5jcmVhdGVDb21tYW5kKCk7Ci0JCQkJdmFsaWQgPSBjb21tYW5kLmNhbkV4ZWN1dGUoKTsKLQkJCX0KLQkJfQotCi0JCS8vIElmIHRoaXMgY29tbWFuZCBjYW4gcHJvdmlkZSBkZXRhaWxlZCBkcmFnIGFuZCBkcm9wIGZlZWRiYWNrLi4uCi0JCWlmIChjb21tYW5kIGluc3RhbmNlb2YgRHJhZ0FuZERyb3BGZWVkYmFjaykgewotCQkJLy8gVXNlIGl0IGZvciB0aGUgb3BlcmF0aW9uIGFuZCBkcmFnIHVuZGVyIGVmZmVjdC4KLQkJCURyYWdBbmREcm9wRmVlZGJhY2sgZHJhZ0FuZERyb3BGZWVkYmFjayA9IChEcmFnQW5kRHJvcEZlZWRiYWNrKSBjb21tYW5kOwotCQkJZXZlbnQuZGV0YWlsID0gZHJhZ0FuZERyb3BGZWVkYmFjay5nZXRPcGVyYXRpb24oKTsKLQkJCWV2ZW50LmZlZWRiYWNrID0gZHJhZ0FuZERyb3BGZWVkYmFjay5nZXRGZWVkYmFjaygpCi0JCQkJCXwgZ2V0QXV0b0ZlZWRiYWNrKCk7Ci0JCX0gZWxzZSBpZiAoIXZhbGlkKSB7Ci0JCQkvLyBUaGVyZSBpcyBubyBleGVjdXRhYmxlIGNvbW1hbmQsIHNvIHdlJ2QgYmV0dGVyIG5peCB0aGUgd2hvbGUKLQkJCS8vIGRlYWwuCi0JCQlldmVudC5kZXRhaWwgPSBETkQuRFJPUF9OT05FOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2RuZC9MaWJyYXJ5Vmlld2VyRHJhZ0FkYXB0ZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZG5kL0xpYnJhcnlWaWV3ZXJEcmFnQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTI3YmMyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZG5kL0xpYnJhcnlWaWV3ZXJEcmFnQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZG5kOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmRuZC5WaWV3ZXJEcmFnQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5NZXRob2RFbGVtZW50RWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcmVmZXJlbmNlcy5BcHBsaWNhdGlvblByZWZlcmVuY2VDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5TdHJVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuUmVzb3VyY2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuRHJhZ1NvdXJjZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuSFRNTFRyYW5zZmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuVGV4dFRyYW5zZmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotCi0vKioKLSAqIFRoZSBkcmFnIGFkYXB0ZXIgZm9yIHRoZSBMaWJyYXJ5IFZpZXdlci4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBMaWJyYXJ5Vmlld2VyRHJhZ0FkYXB0ZXIgZXh0ZW5kcyBWaWV3ZXJEcmFnQWRhcHRlciB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkVkaXRvckRyYWdBZGFwdGVyPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgTGlicmFyeVZpZXdlckRyYWdBZGFwdGVyKFZpZXdlciB2aWV3ZXIpIHsKLQkJc3VwZXIodmlld2VyKTsKLQl9Ci0KLQkvKioKLQkgKiBDYWxsZWQgd2hlbiBkcmFnZ2luZyBpcyBpbml0aWF0ZWQuCi0JICovCi0JcHVibGljIHZvaWQgZHJhZ1N0YXJ0KERyYWdTb3VyY2VFdmVudCBldmVudCkgewotCQlzdXBlci5kcmFnU3RhcnQoZXZlbnQpOwotCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHZpZXdlcgotCQkJLmdldFNlbGVjdGlvbigpOwotCQlldmVudC5kb2l0ID0gZmFsc2U7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHNlbGVjdGlvbi50b0xpc3QoKS5pdGVyYXRvcigpO2l0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IHNlbGVjdGVkRWxlbWVudCA9IFRuZ1V0aWwudW53cmFwKGl0ZXIubmV4dCgpKTsKLQkJCWlmIChzZWxlY3RlZEVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50ICYmCi0JCQkJCSEoc2VsZWN0ZWRFbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kQ29uZmlndXJhdGlvbikgJiYKLQkJCQkJIShzZWxlY3RlZEVsZW1lbnQgaW5zdGFuY2VvZiBDb250ZW50UGFja2FnZSkpIHsKLQkJCQlldmVudC5kb2l0ID0gdHJ1ZTsKLQkJCX0KLQkJfQkJCi0JfQotCi0JLyoqCi0JICogQ2FsbGVkIHRvIHRyYW5zZmVyIHRoZSBkYXRhLgotCSAqLwotCXB1YmxpYyB2b2lkIGRyYWdTZXREYXRhKERyYWdTb3VyY2VFdmVudCBldmVudCkgewotCQlpZiAoSFRNTFRyYW5zZmVyLmdldEluc3RhbmNlKCkuaXNTdXBwb3J0ZWRUeXBlKGV2ZW50LmRhdGFUeXBlKSB8fAotCQkJCVRleHRUcmFuc2Zlci5nZXRJbnN0YW5jZSgpLmlzU3VwcG9ydGVkVHlwZShldmVudC5kYXRhVHlwZSkpIHsKLQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgdmlld2VyCi0JCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQkJCQotCQkJU3RyaW5nIGxpbmtzID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHNlbGVjdGlvbi50b0xpc3QoKS5pdGVyYXRvcigpO2l0ZXIuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBzZWxlY3RlZEVsZW1lbnQgPSBUbmdVdGlsLnVud3JhcChpdGVyLm5leHQoKSk7Ci0JCQkJaWYgKHNlbGVjdGVkRWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCQkJU3RyaW5nIGxpbmtUZXh0ID0gZ2V0SHlwZXJsaW5rKChNZXRob2RFbGVtZW50KSBzZWxlY3RlZEVsZW1lbnQpOwkJCQkJCi0JCQkJCWlmIChQbGF0Zm9ybS5nZXRPUygpLmVxdWFscyhQbGF0Zm9ybS5XU19XSU4zMikpIHsKLQkJCQkJCWlmIChsaW5rcy5sZW5ndGgoKSA+IDApIHsKLQkJCQkJCQlsaW5rcyArPSBTdHJVdGlsLkxJTkVfRkVFRDsKLQkJCQkJCX0KLQkJCQkJCWxpbmtzICs9IG5ldyBTdHJpbmcoU3RyVXRpbC5nZXRVVEY4Qnl0ZXMobGlua1RleHQpKTsJCQkJCQkKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCWlmIChsaW5rcy5sZW5ndGgoKSA+IDApIHsKLQkJCQkJCQlsaW5rcyArPSBTdHJVdGlsLkxJTkVfRkVFRDsKLQkJCQkJCX0KLQkJCQkJCWxpbmtzICs9IGxpbmtUZXh0OwotCQkJCQl9Ci0JCQkJfQotCQkJCQotCQkJfQotCQkJaWYgKGxpbmtzLmxlbmd0aCgpID4gMCkgewotCQkJCWV2ZW50LmRhdGEgPSBsaW5rczsKLQkJCX0KLQkJfQotCQlzdXBlci5kcmFnU2V0RGF0YShldmVudCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgaHlwZXJsaW5rIGZvciB0aGUgZ2l2ZW4gTWV0aG9kIGVsZW1lbnQuCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRIeXBlcmxpbmsoTWV0aG9kRWxlbWVudCBkcmFnRWxlbWVudCkgewotCQlNZXRob2RFbGVtZW50IGRyb3BFbGVtZW50ID0gbnVsbDsKLQkJSVdvcmtiZW5jaFBhZ2UgYWN0aXZlUGFnZSA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkKLQkJCQkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0QWN0aXZlUGFnZSgpOwotCQlJRWRpdG9yUGFydCBhY3RpdmVFZGl0b3IgPSBhY3RpdmVQYWdlLmdldEFjdGl2ZUVkaXRvcigpOwotCQlpZiAoYWN0aXZlRWRpdG9yICE9IG51bGwpIHsKLQkJCUlFZGl0b3JJbnB1dCBlZGl0b3JJbnB1dCA9IGFjdGl2ZUVkaXRvci5nZXRFZGl0b3JJbnB1dCgpOwotCQkJaWYgKGVkaXRvcklucHV0IGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudEVkaXRvcklucHV0KSB7Ci0JCQkJZHJvcEVsZW1lbnQgPSAoKE1ldGhvZEVsZW1lbnRFZGl0b3JJbnB1dCkgZWRpdG9ySW5wdXQpCi0JCQkJCQkuZ2V0TWV0aG9kRWxlbWVudCgpOwotCQkJfQotCQl9Ci0JCQotCQlpZihkcmFnRWxlbWVudCBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpewotCQkJZHJhZ0VsZW1lbnQgPSAoKFByb2Nlc3NDb21wb25lbnQpZHJhZ0VsZW1lbnQpLmdldFByb2Nlc3MoKTsKLQkJfQotCi0JCVN0cmluZyBocmVmID0gUmVzb3VyY2VIZWxwZXIuZ2V0VXJsKGRyYWdFbGVtZW50LCBkcm9wRWxlbWVudCwgIi5odG1sIik7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCS8vIG9iZXkgTGlicmFyeVZpZXdQcmVmUGFnZQotCQlTdHJpbmcgZGVmYXVsdExpbmtUeXBlID0gQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpLmdldFN0cmluZyhBcHBsaWNhdGlvblByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9MSUJfVklFV19ETkRfREVGQVVMVF9MSU5LVFlQRSk7Ci0JCVN0cmluZyB0ZXh0ID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKFJlc291cmNlSGVscGVyLkVMRU1FTlRfTElOS19DTEFTU19lbGVtZW50TGlua1dpdGhUeXBlLmVxdWFscyhkZWZhdWx0TGlua1R5cGUpKSB7Ci0JCQl0ZXh0ID0gUmVzb3VyY2VIZWxwZXIuZ2V0RWxlbWVudExpbmtUZXh0KGRyYWdFbGVtZW50LCB0cnVlKTsKLQkJfSBlbHNlIHsKLQkJCXRleHQgPSBSZXNvdXJjZUhlbHBlci5nZXRFbGVtZW50TGlua1RleHQoZHJhZ0VsZW1lbnQsIGZhbHNlKTsKLQkJfQotCQkKLQkJcmV0dXJuIFJlc291cmNlSGVscGVyLmdldEVsZW1lbnRMaW5rKGRyYWdFbGVtZW50LCB0ZXh0LAotCQkJCSJmaWxlOi8vIiArIGhyZWYsIGRlZmF1bHRMaW5rVHlwZSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZG5kL3BhY2thZ2UuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZG5kL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzg1N2Y1OC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2RuZC9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyBkcmFnIGFuZCBkcm9wIHN1cHBvcnQgZm9yIHRoZSBBdXRob3JpbmcgVUkuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9lZGl0b3JzL0Fic3RyYWN0QmFzZUZvcm1FZGl0b3IuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZWRpdG9ycy9BYnN0cmFjdEJhc2VGb3JtRWRpdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1ZWZkYTkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9lZGl0b3JzL0Fic3RyYWN0QmFzZUZvcm1FZGl0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5JTGlicmFyeU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVpLmVkaXRvcnMuSU1ldGhvZEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuRm9ybUVkaXRvcjsKLQotLyoqCi0gKiBUaGUgYWJzdHJhY3QgYmFzZSBjbGFzcyBmb3IgYWxsIG1ldGhvZCBlZGl0b3JzLgotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RCYXNlRm9ybUVkaXRvciBleHRlbmRzIEZvcm1FZGl0b3IgaW1wbGVtZW50cyBJTWV0aG9kRWRpdG9yIHsKLQotCS8vIEdsb2JhbCBtYXAgdXNlZCB0byByZWNvcmQgd2hpY2ggZWRpdG9yIG1vZGlmaWVzIHRoZSBzaGFyZWQgcmVzb3VyY2UKLQkvLyBmaXJzdC4KLQkvLyBUaGlzIGVuYWJsZXMgdGhlIGFwcHJvcHJpYXRlIGVkaXRvcnMgdG8gYmUgZmxhZ2dlZCBhcyBkaXJ0eS4KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIE1hcCBTSEFSRURfUkVTT1VSQ0VfVE9fRURJVE9SU19NQVAgPSBuZXcgSGFzaE1hcCgpOwotCi0JLy8gSWYgdHJ1ZSwgZGVidWcgdHJhY2luZyBpcyBlbmFibGVkLgotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyA9IEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKQotCQkJLmlzRGVidWdnaW5nKCk7Ci0KLQkvLyBDb2xsZWN0aW9uIG9mIHJlc291cmNlcyBhc3NvY2lhdGVkIHdpdGggdGhlIG1vZGVsIGRhdGEgYmVpbmcgZWRpdGVkIGJ5Ci0JLy8gdGhpcyBlZGl0b3IuCi0JcHJvdGVjdGVkIENvbGxlY3Rpb24gcmVzb3VyY2VzOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgQWJzdHJhY3RCYXNlRm9ybUVkaXRvcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLmZvcm1zLmVkaXRvci5Gb3JtRWRpdG9yI2FkZFBhZ2VzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBhZGRQYWdlcygpOwotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JU2F2ZWFibGVQYXJ0I2RvU2F2ZShJUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCXB1YmxpYyB2b2lkIGRvU2F2ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJdHJ5IHsKLQkJCUxpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuc2F2ZUN1cnJlbnRNZXRob2RMaWJyYXJ5KCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoCi0JCQkJCSJFcnJvciBzYXZpbmcgbGlicmFyeToiLCBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JU2F2ZWFibGVQYXJ0I2RvU2F2ZUFzKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkb1NhdmVBcygpIHsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklTYXZlYWJsZVBhcnQjaXNTYXZlQXNBbGxvd2VkKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NhdmVBc0FsbG93ZWQoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBhcnQuTXVsdGlQYWdlRWRpdG9yUGFydCNpc0RpcnR5KCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0RpcnR5KCkgewotCQlJTGlicmFyeU1hbmFnZXIgbWFuYWdlciA9IChJTGlicmFyeU1hbmFnZXIpIExpYnJhcnlTZXJ2aWNlCi0JCQkJLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudExpYnJhcnlNYW5hZ2VyKCk7Ci0JCXJldHVybiBtYW5hZ2VyICE9IG51bGwgPyBtYW5hZ2VyLmlzTWV0aG9kTGlicmFyeU1vZGlmaWVkKCkgOiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBEaXNwb3NlcyB0aGUgb3BlcmF0aW5nIHN5c3RlbSByZXNvdXJjZXMgYWxsb2NhdGVkIGJ5IHRoaXMgZWRpdG9yLgotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBVcGRhdGVzIHRoZSBlZGl0b3IncyBkaXJ0eSBzdGF0ZSBieSBhZGRpbmcgYSAiKiIgdG8gdGhlIGVkaXRvciB0YWIgYW5kCi0JICogZW5hYmxpbmcgdGhlIFNhdmUgYnV0dG9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHVwZGF0ZURpcnR5U3RhdHVzKCkgewotCQlzdXBlci5lZGl0b3JEaXJ0eVN0YXRlQ2hhbmdlZCgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9lZGl0b3JzL0Fic3RyYWN0RGlhZ3JhbUVkaXRvci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9lZGl0b3JzL0Fic3RyYWN0RGlhZ3JhbUVkaXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMDRkODYzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZWRpdG9ycy9BYnN0cmFjdERpYWdyYW1FZGl0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzMTggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuQWJzb2x1dGVCZW5kcG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlBvc2l0aW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLkNvbW1vblBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQmFzaWNDb21tYW5kU3RhY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmNvbW1hbmRzLkNoYW5nZUJvdW5kc0NvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuY29tbWFuZHMuQ3JlYXRlQmVuZHBvaW50Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5jb21tYW5kcy5DcmVhdGVMaW5rQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5jb21tYW5kcy5DcmVhdGVOb2RlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5jb21tYW5kcy5Nb3ZlQmVuZHBvaW50Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0LkRlY2lzaW9uTm9kZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQuRGlhZ3JhbUFjdGlvblNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZWRpdC5GcmVlVGV4dE5vZGVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0LkxpbmtFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0Lk5vZGVDb250YWluZXJFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0Lk5vZGVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0LlN5bmNoQmFyTm9kZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmZpZ3VyZXMuRnJlZVRleHRGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYudXRpbC5EaWFncmFtVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYudXRpbC5UZW1wbGF0ZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJSGVscENvbnRleHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zLkRpYWdyYW1QcmludEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnZpZXdzLlZpZXdIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuRGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5MaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk1vZGVsRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5OYW1lZE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5UeXBlZE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwudXRpbC5HcmFwaGljYWxEYXRhSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LklMaWJyYXJ5TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5JTGlicmFyeVNlcnZpY2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5Qcm9jZXNzQXV0aG9yaW5nQ29uZmlndXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZXZlbnRzLklMaWJyYXJ5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuYWN0aW9ucy5Qcm9jZXNzRGVsZXRlQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuUmVzb3VyY2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzLklMaWJyYXJ5UGVyc2lzdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51aS5lZGl0b3JzLklNZXRob2RFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5VbWFVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5Db250ZXh0TWVudVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5EZWZhdWx0RWRpdERvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5HcmFwaGljYWxWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLktleUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLktleVN0cm9rZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZFN0YWNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kU3RhY2tFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZFN0YWNrRXZlbnRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZG5kLlRlbXBsYXRlVHJhbnNmZXJEcmFnU291cmNlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmRuZC5UZW1wbGF0ZVRyYW5zZmVyRHJvcFRhcmdldExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cGFydHMuU2NhbGFibGVGcmVlZm9ybVJvb3RFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucGFsZXR0ZS5QYWxldHRlQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5wYWxldHRlLlBhbGV0dGVFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucGFsZXR0ZS5QYWxldHRlUm9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuQ3JlYXRlUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuQ3JlYXRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi51aS5hY3Rpb25zLkFjdGlvblJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi51aS5hY3Rpb25zLkNvcHlUZW1wbGF0ZUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYudWkuYWN0aW9ucy5EZWxldGVBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnVpLmFjdGlvbnMuR0VGQWN0aW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi51aS5wYWxldHRlLlBhbGV0dGVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnVpLnBhbGV0dGUuUGFsZXR0ZVZpZXdlclByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi51aS5wYWxldHRlLkZseW91dFBhbGV0dGVDb21wb3NpdGUuRmx5b3V0UHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnVpLnBhcnRzLkdyYXBoaWNhbEVkaXRvcldpdGhGbHlvdXRQYWxldHRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi51aS5wYXJ0cy5HcmFwaGljYWxWaWV3ZXJLZXlIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi51aS5wYXJ0cy5TY3JvbGxpbmdHcmFwaGljYWxWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUNvbnRyaWJ1dGlvbkl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uTWVudU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLlNlcGFyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5TYWZlUnVubmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5UcmFuc2ZlckRyb3BUYXJnZXRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5CdXN5SW5kaWNhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuS2V5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250RGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUkdCOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRm9udERpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVBhcnRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLkFjdGlvbkZhY3Rvcnk7Ci0KLS8qKgotICogQWJzdHJhY3QgYmFzZSBjbGFzcyBmb3IgYWxsIGRpYWdyYW0gZWRpdG9ycwotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBKaW0gVGhhcmlvCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3REaWFncmFtRWRpdG9yIGV4dGVuZHMKLQkJR3JhcGhpY2FsRWRpdG9yV2l0aEZseW91dFBhbGV0dGUgaW1wbGVtZW50cyBJTWV0aG9kRWRpdG9yIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRUZSRVNIX0ZST01fQkFTRV9BQ1RJVklUWSA9ICJyZWZyZXNoX2Zyb21fYmFzZV9hY3Rpdml0eSI7IC8vJE5PTi1OTFMtMSQKLQkvLyBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBBTElHTl9IT1JaX0FWRVJBR0UgPQotCS8vICJhbGlnbl9ob3Jpem9udGFsX3RvX2F2ZXJhZ2UiOyAvLyROT04tTkxTLTEkCi0JLy8gcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUxJR05fSE9SWl9GSVJTVF9TRUxFQ1RFRCA9Ci0JLy8gImFsaWduX2hvcml6b250YWxfdG9fZmlyc3Rfc2VsZWN0aW9uIjsgLy8kTk9OLU5MUy0xJAotCS8vIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEFMSUdOX1ZFUlRfQVZFUkFHRSA9Ci0JLy8gImFsaWduX3ZlcnRpY2FsX3RvX2F2ZXJhZ2UiOyAvLyROT04tTkxTLTEkCi0JLy8gcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUxJR05fVkVSVF9GSVJTVF9TRUxFQ1RFRCA9Ci0JLy8gImFsaWduX3ZlcnRpY2FsX3RvX2ZpcnN0X3NlbGVjdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGT05UX0RJQUxPRyA9ICJmb250X2RpYWxvZyI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDUkVBVEVfTElOSyA9ICJjcmVhdGVfbGluayI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTRUxFQ1RfTElOSyA9ICJzZWxlY3RfbGluayI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDUkVBVEVfQkVORF9QT0lOVCA9ICJjcmVhdGVfYmVuZF9wb2ludCI7IC8vJE5PTi1OTFMtMSQJCi0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBDUkVBVEVfRlJFRV9URVhUID0gImNyZWF0ZV9mcmVlX3RleHQiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNT1ZFID0gIm1vdmUiOyAvLyROT04tTkxTLTEkCi0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBSRUZSRVNIID0gInJlZnJlc2giOyAvLyROT04tTkxTLTEkCi0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBBTElHTl9CRU5EX1BPSU5UID0gImFsaWduX2JlbmRfcG9pbnQiOyAvLyROT04tTkxTLTEkCi0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQQUxFVFRFX0RPQ0tfTE9DQVRJT04gPSAiRG9jayBsb2NhdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBBTEVUVEVfU0laRSA9ICJQYWxldHRlIFNpemUiOyAvLyROT04tTkxTLTEkCi0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQQUxFVFRFX1NUQVRFID0gIlBhbGV0dGUgc3RhdGUiOyAvLyROT04tTkxTLTEkCi0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX1BBTEVUVEVfU0laRSA9IDEzMDsKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIERFTEVURV9ESUFHUkFNID0gImRlbGV0ZV9hY3R2aXR5X2RldGFpbF9kaWFncmFtIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBLZXlIYW5kbGVyIHNoYXJlZEtleUhhbmRsZXI7Ci0KLQlwcml2YXRlIFBhbGV0dGVSb290IHBhbGV0dGVSb290OwotCi0JcHJvdGVjdGVkIEVkaXRQYXJ0IGVkaXRQYXJ0OwotCi0JcHJpdmF0ZSBDb21tYW5kU3RhY2tFdmVudExpc3RlbmVyIGNtZFN0YWNrRXZlbnRMaXN0ZW5lcjsKLQotCXByb3RlY3RlZCBDcmVhdGlvbkZhY3RvcnkgZnJlZVR4dE5vZGVDcmVhdGlvbkZhY3Rvcnk7Ci0KLQlwcm90ZWN0ZWQgRGlhZ3JhbUFjdGlvblNlcnZpY2UgYWN0aW9uU2VydmljZSA9IG51bGw7Ci0KLQlwcml2YXRlIGJvb2xlYW4gZGlzcG9zZWQ7Ci0KLQkvKioKLQkgKiBUaGUgcGFyZW50IGlzIHRoZSBlZGl0b3IgZnJvbSB3aGVyZSB0aGUgdXNlciBvcGVuZWQgdGhpcyBlZGl0b3IuCi0JICovCi0JcHJvdGVjdGVkIElFZGl0b3JQYXJ0IHBhcmVudEVkaXRvciA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHVzZWQgdG8gbGlzdGVuIGZvciBvdXIgcGFyZW50IGVkaXRvciBhbmQgb3VyIG93biBjbG9zaW5nLiBXaGVuIGl0Ci0JICogZG9lcywgd2UgYXNrIHRoZSB1c2VyIGlmIHRoZXkgd2FudCB0byBjbG9zZSB0aGlzIGRpYWdyYW0gYXMgd2VsbC4KLQkgKi8KLQlwcm90ZWN0ZWQgSVBhcnRMaXN0ZW5lciBwYXJ0TGlzdGVuZXIgPSBuZXcgSVBhcnRMaXN0ZW5lcigpIHsKLQkJSUVkaXRvclBhcnQgbWUgPSBBYnN0cmFjdERpYWdyYW1FZGl0b3IudGhpczsKLQotCQlwdWJsaWMgdm9pZCBwYXJ0T3BlbmVkKElXb3JrYmVuY2hQYXJ0IHBhcnQpIHsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHBhcnREZWFjdGl2YXRlZChJV29ya2JlbmNoUGFydCBwYXJ0KSB7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBwYXJ0Q2xvc2VkKElXb3JrYmVuY2hQYXJ0IHBhcnQpIHsKLQkJCS8vIGNoZWNrIGlmIHRoZSBlZGl0b3IgY2xvc2VkIGFzIGEgcmVzdWx0IG9mIHVzZXIgYWN0aW9uIG9yIHRoZQotCQkJLy8gd29ya2JlbmNoIGNsb3NpbmcKLQkJCS8vIElXb3JrYmVuY2ggd2IgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpOwotCQkJaWYgKHBhcnQgPT0gbWUpIHsKLQkJCQlzZXRQYXJlbnRFZGl0b3IobnVsbCk7Ci0JCQkJSVdvcmtiZW5jaFBhZ2UgcGFnZSA9IGdldFNpdGUoKS5nZXRQYWdlKCk7Ci0JCQkJcGFnZS5yZW1vdmVQYXJ0TGlzdGVuZXIocGFydExpc3RlbmVyKTsKLQkJCQkvLyByZW1vdmUgdGhpcyBkaWFncmFtIGlmIGl0IGlzIG5ldwotCQkJCURpYWdyYW0gZGlhZ3JhbSA9IChEaWFncmFtKSAoKEVkaXRQYXJ0KSBnZXRHcmFwaGljYWxWaWV3ZXIoKQotCQkJCQkJLmdldENvbnRlbnRzKCkpLmdldE1vZGVsKCk7Ci0JCQkJLy8gbWFrZSBzdXJlIHdlIHJlbW92ZSB0aGUgVU1BIGRpYWdyYW0gZnJvbSB0aGUgbW9kZWwgaWYgaXQgaXMKLQkJCQkvLyBuZXcgKG5ldmVyIHNhdmVkKQotCQkJCWlmIChkaWFncmFtLmlzTmV3KCkpIHsKLQkJCQkJaWYgKGRpYWdyYW0uZ2V0VU1BRGlhZ3JhbSgpICE9IG51bGwpIHsKLQkJCQkJRWNvcmVVdGlsLnJlbW92ZShkaWFncmFtLmdldFVNQURpYWdyYW0oKSk7Ci0JCQkJCX0KLQkJCQkJaWYoaXNSZXNvdXJjZUNoYW5nZWRCeU90aGVyKCkpIHsKLQkJCQkJZG9TYXZlKG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJLy8gZWxzZSBpZiAoIXdiLmlzQ2xvc2luZygpKSB7Ci0JCQkvLyAvLyBhcmUgd2UgYmVpbmcgbm90aWZpZWQgYWJvdXQgb3VyIHBhcmVudCBlZGl0b3Igb2JqZWN0PwotCQkJLy8gaWYgKGdldFBhcmVudEVkaXRvcigpICE9IG51bGwpIHsKLQkJCS8vIGlmIChwYXJ0ID09IGdldFBhcmVudEVkaXRvcigpKSB7Ci0JCQkvLyBJV29ya2JlbmNoUGFnZSBwYWdlID0gZ2V0U2l0ZSgpLmdldFBhZ2UoKTsKLQkJCS8vIC8vIHllcywgYXNrIHRoZSB1c2VyIGlmIHRoZXkgd2FudCB0byBjbG9zZSB0aGlzCi0JCQkvLyAvLyBlZGl0b3IKLQkJCS8vIGlmIChBdXRob3JpbmdVSVBsdWdpbgotCQkJLy8gLmdldERlZmF1bHQoKQotCQkJLy8gLmdldE1zZ0RpYWxvZygpCi0JCQkvLyAuZGlzcGxheVByb21wdCgKLQkJCS8vIERpYWdyYW1VSVJlc291cmNlcwotCQkJLy8gLmdldFN0cmluZygiRGlhZ3JhbVVJLkFic3RyYWN0RGlhZ3JhbUVkaXRvci5QYXJlbnRFZGl0b3JDbG9zZS50aXRsZSIpLAotCQkJLy8gLy8kTk9OLU5MUy0xJAotCQkJLy8gRGlhZ3JhbVVJUmVzb3VyY2VzCi0JCQkvLyAuZm9ybWF0U3RyaW5nKAotCQkJLy8gIkRpYWdyYW1VSS5BYnN0cmFjdERpYWdyYW1FZGl0b3IuUGFyZW50RWRpdG9yQ2xvc2UudGV4dCIsCi0JCQkvLyBnZXRQYXJlbnRFZGl0b3IoKS5nZXRUaXRsZSgpLCBtZS5nZXRUaXRsZSgpKSkpIHsgLy8kTk9OLU5MUy0xJAotCQkJLy8gLy8geWVzLCBjbG9zZSB0aGlzIGRpYWdyYW0sIGFzayB0byBzYXZlIGNoYW5nZXMKLQkJCS8vIHBhZ2UuY2xvc2VFZGl0b3IobWUsIHRydWUpOwotCQkJLy8gfQotCQkJLy8gLy8gZWl0aGVyIHdheSwgb3VyIHBhcmVudCBpcyBjbG9zZWQgYW5kIHdlIGNhbiBzdG9wCi0JCQkvLyAvLyBsaXN0ZW5pbmcKLQkJCS8vIHBhZ2UucmVtb3ZlUGFydExpc3RlbmVyKHBhcnRMaXN0ZW5lcik7Ci0JCQkvLyB9Ci0JCQkvLyB9Ci0JCQkvLyB9Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBwYXJ0QnJvdWdodFRvVG9wKElXb3JrYmVuY2hQYXJ0IHBhcnQpIHsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHBhcnRBY3RpdmF0ZWQoSVdvcmtiZW5jaFBhcnQgcGFydCkgewotCQl9Ci0JfTsKLQotCXByaXZhdGUgRm9udCBmb250OwotCi0JcHJpdmF0ZSBDb2xvciBjb2xvcjsKLQotCXByaXZhdGUgQ29tbWFuZCByZWZyZXNoRnJvbUJhc2VDb21tYW5kID0gbmV3IENvbW1hbmQoRGlhZ3JhbVVJUmVzb3VyY2VzLkFic3RyYWN0RGlhZ3JhbUVkaXRvcnJlZnJlc2hmcm9tYmFzZSkgeyAKLQkJcHJpdmF0ZSBBcnJheUxpc3Qgb2xkQ29udGVudCA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQkJRGlhZ3JhbSBkaWFncmFtID0gKERpYWdyYW0pIGVkaXRQYXJ0LmdldE1vZGVsKCk7Ci0KLQkJCS8vIGJhY2sgdXAgb2xkIGRpYWdyYW0gY29udGVudAotCQkJLy8KLQkJCW9sZENvbnRlbnQuY2xlYXIoKTsKLQkJCW9sZENvbnRlbnQuYWRkQWxsKGRpYWdyYW0uZ2V0VU1BRGlhZ3JhbSgpLmdldENvbnRhaW5lZCgpKTsKLQotCQkJR3JhcGhpY2FsRGF0YUhlbHBlci5yZWZyZXNoRnJvbUJhc2UoZGlhZ3JhbS5nZXRVTUFEaWFncmFtKCkpOwotCQkJaWYgKGVkaXRQYXJ0LmlzQWN0aXZlKCkpIHsKLQkJCQllZGl0UGFydC5kZWFjdGl2YXRlKCk7Ci0JCQl9Ci0JCQlkaWFncmFtLnJlbW92ZUNvbnN1bWVyKHRoaXMpOwotCQkJY3JlYXRlRWRpdFBhcnQoKTsKLQkJCWdldEdyYXBoaWNhbFZpZXdlcigpLnNldENvbnRlbnRzKGVkaXRQYXJ0KTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHVuZG8oKSB7Ci0JCQlEaWFncmFtIGRpYWdyYW0gPSAoRGlhZ3JhbSkgZWRpdFBhcnQuZ2V0TW9kZWwoKTsKLQkJCWRpYWdyYW0uZ2V0VU1BRGlhZ3JhbSgpLmdldENvbnRhaW5lZCgpLmNsZWFyKCk7Ci0JCQlkaWFncmFtLmdldFVNQURpYWdyYW0oKS5nZXRDb250YWluZWQoKS5hZGRBbGwob2xkQ29udGVudCk7Ci0JCQlpZiAoZWRpdFBhcnQuaXNBY3RpdmUoKSkgewotCQkJCWVkaXRQYXJ0LmRlYWN0aXZhdGUoKTsKLQkJCX0KLQkJCWRpYWdyYW0ucmVtb3ZlQ29uc3VtZXIodGhpcyk7Ci0JCQljcmVhdGVFZGl0UGFydCgpOwotCQkJZ2V0R3JhcGhpY2FsVmlld2VyKCkuc2V0Q29udGVudHMoZWRpdFBhcnQpOwotCQl9Ci0JfTsKLQotCXByb3RlY3RlZCBNYXAgdGVtcGxhdGVOYW1lVG9DcmVhdGlvbkZhY3RvcnlNYXA7Ci0JLyoqCi0JICogUmVjb3JkcyB0aW1lIHdoZW4gdGhlIG1vZGVsIGZpcnN0IGhhcyBiZWVuIGNoYW5nZWQgYnkgdGhpcyBlZGl0b3IuIFRoaXMgd2lsbCBiZSB1c2VkIGxhdGVyCi0JICogdG8gZGV0ZXJtaW5lIGlmIHNhdmUgaXMgbmVlZGVkIHRvIHJldmVyc2UgdGhlIGNoYW5nZXMuCi0JICovCi0JcHJvdGVjdGVkIGxvbmcgY2hhbmdlVGltZSA9IC0xOwotCXByb3RlY3RlZCBNZXRob2RDb25maWd1cmF0aW9uIGN1cnJlbnRDb25maWc7Ci0KLQljbGFzcyBEaWFncmFtQ29udGV4dE1lbnVQcm92aWRlciBleHRlbmRzIENvbnRleHRNZW51UHJvdmlkZXIgewotCi0JCXByaXZhdGUgQWN0aW9uUmVnaXN0cnkgYWN0aW9uUmVnaXN0cnk7Ci0KLQkJLyoqCi0JCSAqIENyZWF0ZXMgYSBuZXcgV29ya2Zsb3dDb250ZXh0TWVudVByb3ZpZGVyIGFzc29pY2F0ZWQgd2l0aCB0aGUgZ2l2ZW4KLQkJICogdmlld2VyIGFuZCBhY3Rpb24gcmVnaXN0cnkuCi0JCSAqIAotCQkgKiBAcGFyYW0gdmlld2VyCi0JCSAqICAgICAgICAgICAgdGhlIHZpZXdlcgotCQkgKiBAcGFyYW0gcmVnaXN0cnkKLQkJICogICAgICAgICAgICB0aGUgYWN0aW9uIHJlZ2lzdHJ5Ci0JCSAqLwotCQlwdWJsaWMgRGlhZ3JhbUNvbnRleHRNZW51UHJvdmlkZXIoRWRpdFBhcnRWaWV3ZXIgdmlld2VyLAotCQkJCUFjdGlvblJlZ2lzdHJ5IHJlZ2lzdHJ5KSB7Ci0JCQlzdXBlcih2aWV3ZXIpOwotCQkJc2V0QWN0aW9uUmVnaXN0cnkocmVnaXN0cnkpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBzZWUgQ29udGV4dE1lbnVQcm92aWRlciNidWlsZENvbnRleHRNZW51KG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudU1hbmFnZXIpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBidWlsZENvbnRleHRNZW51KElNZW51TWFuYWdlciBtZW51KSB7Ci0JCQlHRUZBY3Rpb25Db25zdGFudHMuYWRkU3RhbmRhcmRBY3Rpb25Hcm91cHMobWVudSk7Ci0KLQkJCUlBY3Rpb24gYWN0aW9uOwotCQkJYWN0aW9uID0gZ2V0QWN0aW9uUmVnaXN0cnkoKS5nZXRBY3Rpb24oQWN0aW9uRmFjdG9yeS5VTkRPLmdldElkKCkpOwotCQkJbWVudS5hcHBlbmRUb0dyb3VwKEdFRkFjdGlvbkNvbnN0YW50cy5HUk9VUF9VTkRPLCBhY3Rpb24pOwotCi0JCQlhY3Rpb24gPSBnZXRBY3Rpb25SZWdpc3RyeSgpLmdldEFjdGlvbihBY3Rpb25GYWN0b3J5LlJFRE8uZ2V0SWQoKSk7Ci0JCQltZW51LmFwcGVuZFRvR3JvdXAoR0VGQWN0aW9uQ29uc3RhbnRzLkdST1VQX1VORE8sIGFjdGlvbik7Ci0KLQkJCWJvb2xlYW4gY2FuTW9kaWZ5ID0gIWlzUmVhZE9ubHkoKTsKLQotCQkJYWN0aW9uID0gZ2V0QWN0aW9uUmVnaXN0cnkoKQotCQkJCQkuZ2V0QWN0aW9uKEFjdGlvbkZhY3RvcnkuREVMRVRFLmdldElkKCkpOwotCQkJaWYgKGFjdGlvbi5pc0VuYWJsZWQoKSAmJiBjYW5Nb2RpZnkpIHsKLQkJCQlpZiAoIVRuZ1V0aWwuaXNMb2NrZWQoZ2V0TWV0aG9kRWxlbWVudEZyb21JbnB1dCgpKSkgewotCQkJCQltZW51LmFwcGVuZFRvR3JvdXAoR0VGQWN0aW9uQ29uc3RhbnRzLkdST1VQX0VESVQsIGFjdGlvbik7Ci0JCQkJfQotCQkJfQotCi0JCQlhY3Rpb24gPSBnZXRBY3Rpb25SZWdpc3RyeSgpLmdldEFjdGlvbihSRUZSRVNIKTsKLQkJCW1lbnUuYXBwZW5kVG9Hcm91cChHRUZBY3Rpb25Db25zdGFudHMuR1JPVVBfVklFVywgYWN0aW9uKTsKLQotCQkJYWN0aW9uID0gZ2V0QWN0aW9uUmVnaXN0cnkoKS5nZXRBY3Rpb24oRk9OVF9ESUFMT0cpOwotCQkJaWYgKGFjdGlvbi5pc0VuYWJsZWQoKSAmJiBjYW5Nb2RpZnkpIHsKLQkJCQltZW51LmFwcGVuZFRvR3JvdXAoR0VGQWN0aW9uQ29uc3RhbnRzLk1CX0FERElUSU9OUywgYWN0aW9uKTsKLQkJCX0KLQotCQkJSUFjdGlvbiBjcmVhdGVGcmVlVGV4dEFjdGlvbiA9IGdldEFjdGlvblJlZ2lzdHJ5KCkuZ2V0QWN0aW9uKAotCQkJCQlDUkVBVEVfRlJFRV9URVhUKTsKLQkJCWlmIChjcmVhdGVGcmVlVGV4dEFjdGlvbi5pc0VuYWJsZWQoKSAmJiBjYW5Nb2RpZnkpIHsKLQkJCQltZW51LmFwcGVuZFRvR3JvdXAoR0VGQWN0aW9uQ29uc3RhbnRzLk1CX0FERElUSU9OUywKLQkJCQkJCWNyZWF0ZUZyZWVUZXh0QWN0aW9uKTsKLQkJCX0KLQotCQkJLy8gSUFjdGlvbiBtb3ZlQWN0aW9uID0gZ2V0QWN0aW9uUmVnaXN0cnkoKS5nZXRBY3Rpb24oTU9WRSk7Ci0JCQkvLyBpZihtb3ZlQWN0aW9uLmlzRW5hYmxlZCgpKXsKLQkJCS8vIG1lbnUuYXBwZW5kVG9Hcm91cChHRUZBY3Rpb25Db25zdGFudHMuTUJfQURESVRJT05TLG1vdmVBY3Rpb24pOwotCQkJLy8gfQotCQkJSUFjdGlvbiBsaW5rQWN0aW9uID0gZ2V0QWN0aW9uUmVnaXN0cnkoKS5nZXRBY3Rpb24oQ1JFQVRFX0xJTkspOwotCQkJaWYgKGxpbmtBY3Rpb24uaXNFbmFibGVkKCkgJiYgY2FuTW9kaWZ5KSB7Ci0JCQkJbWVudS5hcHBlbmRUb0dyb3VwKEdFRkFjdGlvbkNvbnN0YW50cy5NQl9BRERJVElPTlMsIGxpbmtBY3Rpb24pOwotCQkJfQotCQkJSUFjdGlvbiBzZWxlY3RsaW5rQWN0aW9uID0gZ2V0QWN0aW9uUmVnaXN0cnkoKS5nZXRBY3Rpb24oCi0JCQkJCVNFTEVDVF9MSU5LKTsKLQkJCWlmIChzZWxlY3RsaW5rQWN0aW9uLmlzRW5hYmxlZCgpKSB7Ci0JCQkJbWVudS5hcHBlbmRUb0dyb3VwKEdFRkFjdGlvbkNvbnN0YW50cy5NQl9BRERJVElPTlMsCi0JCQkJCQlzZWxlY3RsaW5rQWN0aW9uKTsKLQkJCX0KLQkJCUlBY3Rpb24gYmVuZHBvaW50QWN0aW9uID0gZ2V0QWN0aW9uUmVnaXN0cnkoKS5nZXRBY3Rpb24oCi0JCQkJCUNSRUFURV9CRU5EX1BPSU5UKTsKLQkJCWlmIChiZW5kcG9pbnRBY3Rpb24uaXNFbmFibGVkKCkgJiYgY2FuTW9kaWZ5KSB7Ci0JCQkJbWVudS5hcHBlbmRUb0dyb3VwKEdFRkFjdGlvbkNvbnN0YW50cy5NQl9BRERJVElPTlMsCi0JCQkJCQliZW5kcG9pbnRBY3Rpb24pOwotCQkJfQotCQkJSUFjdGlvbiBhbGlnbmJlbmRwb2ludGFjdGlvbiA9IGdldEFjdGlvblJlZ2lzdHJ5KCkuZ2V0QWN0aW9uKAotCQkJCQlBTElHTl9CRU5EX1BPSU5UKTsKLQkJCWlmIChhbGlnbmJlbmRwb2ludGFjdGlvbi5pc0VuYWJsZWQoKSAmJiBjYW5Nb2RpZnkpIHsKLQkJCQltZW51LmFwcGVuZFRvR3JvdXAoR0VGQWN0aW9uQ29uc3RhbnRzLk1CX0FERElUSU9OUywKLQkJCQkJCWFsaWduYmVuZHBvaW50YWN0aW9uKTsKLQkJCX0KLQkJCQotCQkJLy9QcmludCBBY3Rpb24gZm9yIGRpYWdyYW0gdGhyb3VnaCBDb250ZXh0IE1lbnUuCi0JCQkvLyBFbmFibGUgdGhpcyBjb2RlIHdoZW4gcHJpbnQgcmVxdWlyZWQgZm9yIGRpYWdyYW0uCi0vLwkJCWFjdGlvbiA9IGdldEFjdGlvblJlZ2lzdHJ5KCkuZ2V0QWN0aW9uKEFjdGlvbkZhY3RvcnkuUFJJTlQuZ2V0SWQoKSk7Ci0vLwkJCWlmKGFjdGlvbi5pc0VuYWJsZWQoKSl7Ci0vLwkJCQltZW51LmFwcGVuZFRvR3JvdXAoR0VGQWN0aW9uQ29uc3RhbnRzLkdST1VQX1BSSU5ULCBhY3Rpb24pOwotLy8JCQl9Ci0JCQkKLQkJCWNvbnRyaWJ1dGVUb0NvbnRleHRNZW51KG1lbnUpOwotCQl9Ci0KLQkJcHJpdmF0ZSBBY3Rpb25SZWdpc3RyeSBnZXRBY3Rpb25SZWdpc3RyeSgpIHsKLQkJCXJldHVybiBhY3Rpb25SZWdpc3RyeTsKLQkJfQotCi0JCS8qKgotCQkgKiBTZXRzIHRoZSBhY3Rpb24gcmVnaXN0cnkKLQkJICogCi0JCSAqIEBwYXJhbSByZWdpc3RyeQotCQkgKiAgICAgICAgICAgIHRoZSBhY3Rpb24gcmVnaXN0cnkKLQkJICovCi0JCXB1YmxpYyB2b2lkIHNldEFjdGlvblJlZ2lzdHJ5KEFjdGlvblJlZ2lzdHJ5IHJlZ2lzdHJ5KSB7Ci0JCQlhY3Rpb25SZWdpc3RyeSA9IHJlZ2lzdHJ5OwotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlCi0JICoKLQkgKi8KLQlwdWJsaWMgQWJzdHJhY3REaWFncmFtRWRpdG9yKCkgewotCQlzdXBlcigpOwotCQlzZXRFZGl0RG9tYWluKG5ldyBEZWZhdWx0RWRpdERvbWFpbih0aGlzKSk7Ci0JCWdldEVkaXREb21haW4oKS5zZXRDb21tYW5kU3RhY2sobmV3IENvbW1hbmRTdGFjaygpIHsKLQkJCXB1YmxpYyBib29sZWFuIGlzRGlydHkoKSB7Ci0JCQkJQ29tbWFuZCBjbWQgPSBnZXRVbmRvQ29tbWFuZCgpOwotCQkJCWlmIChjbWQgIT0gbnVsbCAmJiAhY21kLmNhblVuZG8oKSkgewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJCXJldHVybiBzdXBlci5pc0RpcnR5KCk7Ci0JCQl9Ci0JCQkKLQkJCS8qIChub24tSmF2YWRvYykKLQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmRTdGFjayNleGVjdXRlKG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kKQotCQkJICovCi0JCQlwdWJsaWMgdm9pZCBleGVjdXRlKENvbW1hbmQgY29tbWFuZCkgewotCQkJCWlmKGNvbW1hbmQgPT0gbnVsbCB8fCAhY29tbWFuZC5jYW5FeGVjdXRlKCkpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlpZihjaGFuZ2VUaW1lID09IC0xKSB7Ci0JCQkJCWNoYW5nZVRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCQl9Ci0JCQkJc3VwZXIuZXhlY3V0ZShjb21tYW5kKTsKLQkJCX0KLQkJfSk7Ci0KLQkJLy8gYWRkIENvbW1hbmRTdGFja0V2ZW50TGlzdGVuZXIKLQkJLy8KLQkJY21kU3RhY2tFdmVudExpc3RlbmVyID0gbmV3IENvbW1hbmRTdGFja0V2ZW50TGlzdGVuZXIoKSB7Ci0KLQkJCXB1YmxpYyB2b2lkIHN0YWNrQ2hhbmdlZChDb21tYW5kU3RhY2tFdmVudCBldmVudCkgewotCQkJCWlmIChldmVudC5nZXREZXRhaWwoKSA9PSBDb21tYW5kU3RhY2suUE9TVF9FWEVDVVRFKSB7Ci0JCQkJCWZpcmVQcm9wZXJ0eUNoYW5nZShQUk9QX0RJUlRZKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJfTsKLQkJZ2V0RWRpdERvbWFpbigpLmdldENvbW1hbmRTdGFjaygpLmFkZENvbW1hbmRTdGFja0V2ZW50TGlzdGVuZXIoCi0JCQkJY21kU3RhY2tFdmVudExpc3RlbmVyKTsKLQkJLy8gYWRkIG91ciBwYXJ0IGxpc3RlbmVyIGlmIGVpdGhlciBwYXJlbnQgb3IgdGhpcyBjbG9zZXMKLQkJSVdvcmtiZW5jaCB3YiA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCk7Ci0JCUlXb3JrYmVuY2hXaW5kb3cgd2luID0gd2IuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0JCUlXb3JrYmVuY2hQYWdlIHBhZ2UgPSB3aW4uZ2V0QWN0aXZlUGFnZSgpOwotCQlwYWdlLmFkZFBhcnRMaXN0ZW5lcihwYXJ0TGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZ2VmLnVpLnBhcnRzLkdyYXBoaWNhbEVkaXRvciNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlnZXRDb21tYW5kU3RhY2soKQotCQkJCS5yZW1vdmVDb21tYW5kU3RhY2tFdmVudExpc3RlbmVyKGNtZFN0YWNrRXZlbnRMaXN0ZW5lcik7Ci0KLQkJaWYgKGlzRGlydHkoKSkgewotCQkJLy8gY2hhbmdlcyBkaXNjYXJkZWQsIHJldmVyc2UgdG8gc2F2ZWQKLQkJCS8vCi0JCQlyZXZlcnNlVG9TYXZlZCgpOwotCQl9Ci0KLQkJaWYgKGVkaXRQYXJ0ICE9IG51bGwpIHsKLQkJCURpYWdyYW0gZGlhZ3JhbSA9IChEaWFncmFtKSBlZGl0UGFydC5nZXRNb2RlbCgpOwotCQkJaWYgKGRpYWdyYW0gIT0gbnVsbCkgewotCQkJCWRpYWdyYW0ucmVtb3ZlQ29uc3VtZXIodGhpcyk7Ci0JCQl9Ci0JCX0KLQotCQlpZiAoZm9udCAhPSBudWxsICYmICFmb250LmlzRGlzcG9zZWQoKSkgewotCQkJZm9udC5kaXNwb3NlKCk7Ci0JCX0KLQkJaWYgKGNvbG9yICE9IG51bGwgJiYgIWNvbG9yLmlzRGlzcG9zZWQoKSkgewotCQkJY29sb3IuZGlzcG9zZSgpOwotCQl9Ci0JCQotCQlJTGlicmFyeU1hbmFnZXIgbWFuYWdlciA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudExpYnJhcnlNYW5hZ2VyKCk7Ci0JCWlmIChtYW5hZ2VyICE9IG51bGwpIHsKLQkJCW1hbmFnZXIucmVtb3ZlTGlzdGVuZXIobGlicmFyeUxpc3RlbmVyKTsKLQkJfQotCQlMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLnJlbW92ZUxpc3RlbmVyKGxpYlN2Y0xpc3RlbmVyKTsKLQkJCi0JCXN1cGVyLmRpc3Bvc2UoKTsKLQkJZGlzcG9zZWQgPSB0cnVlOwotCX0KLQkKLQlwcml2YXRlIGJvb2xlYW4gaXNSZXNvdXJjZUNoYW5nZWRCeU90aGVyKCkgewotCQlSZXNvdXJjZSByZXNvdXJjZSA9IGdldE1ldGhvZEVsZW1lbnRGcm9tSW5wdXQoKS5lUmVzb3VyY2UoKTsKLQkJaWYocmVzb3VyY2UgIT0gbnVsbCAmJiByZXNvdXJjZS5nZXRVUkkoKS5pc0ZpbGUoKSl7Ci0JCQlGaWxlIGZpbGUgPSBuZXcgRmlsZShyZXNvdXJjZS5nZXRVUkkoKS50b0ZpbGVTdHJpbmcoKSk7Ci0JCQlyZXR1cm4gZmlsZS5sYXN0TW9kaWZpZWQoKSA+IGNoYW5nZVRpbWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgdm9pZCByZXZlcnNlVG9TYXZlZCgpIHsKLQkJLy8gc2F2ZSB0aGUgdW5kb25lIGNoYW5nZXMgb25seSBpZiB0aGUgcmVzb3VyY2UgaGFzIGJlZW4gY2hhbmdlZCBvdXRzaWRlIHRoaXMgZWRpdG9yCi0JCS8vCi0JCWJvb2xlYW4gc2F2ZU5lZWRlZCA9IGdldENvbW1hbmRTdGFjaygpLmlzRGlydHkoKSAmJiBpc1Jlc291cmNlQ2hhbmdlZEJ5T3RoZXIoKTsKLQkJY2hhbmdlVGltZSA9IC0xOwotCQl3aGlsZSAoZ2V0Q29tbWFuZFN0YWNrKCkuaXNEaXJ0eSgpKSB7Ci0JCQlnZXRDb21tYW5kU3RhY2soKS51bmRvKCk7Ci0JCX0KLQkJaWYgKHNhdmVOZWVkZWQpIHsKLQkJCUlMaWJyYXJ5UGVyc2lzdGVyLkZhaWxTYWZlTWV0aG9kTGlicmFyeVBlcnNpc3RlciBwZXJzaXN0ZXIgPSBMaWJyYXJ5U2VydmljZVV0aWwuZ2V0Q3VycmVudFBlcnNpc3RlcigpLmdldEZhaWxTYWZlUGVyc2lzdGVyKCk7Ci0JCQl0cnkgewotCQkJCXBlcnNpc3Rlci5zYXZlKGdldE1ldGhvZEVsZW1lbnRGcm9tSW5wdXQoKS5lUmVzb3VyY2UoKSk7Ci0JCQkJcGVyc2lzdGVyLmNvbW1pdCgpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlDb21tb25QbHVnaW4uSU5TVEFOQ0UubG9nKGUpOwotCQkJCXRyeSB7Ci0JCQkJCXBlcnNpc3Rlci5yb2xsYmFjaygpOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJCQlWaWV3SGVscGVyLnJlbG9hZEN1cnJlbnRMaWJyYXJ5KGdldFNpdGUoKS5nZXRTaGVsbCgpLCBudWxsKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjb250cmlidXRlVG9Db250ZXh0TWVudShJTWVudU1hbmFnZXIgbWVudSkgewotCQlib29sZWFuIGNhbk1vZGlmeSA9ICFpc1JlYWRPbmx5KCk7Ci0JCUlBY3Rpb24gYWN0aW9uID0gZ2V0QWN0aW9uUmVnaXN0cnkoKS5nZXRBY3Rpb24oCi0JCQkJUkVGUkVTSF9GUk9NX0JBU0VfQUNUSVZJVFkpOwotCQlpZiAoYWN0aW9uLmlzRW5hYmxlZCgpICYmIGNhbk1vZGlmeSkgewotCQkJbWVudS5hcHBlbmRUb0dyb3VwKEdFRkFjdGlvbkNvbnN0YW50cy5NQl9BRERJVElPTlMsIGFjdGlvbik7Ci0JCX0KLQkJLy8gdGhlIGFsaWduIG1lbnUgaXMgYSBjYXNjYWRpbmcgbWVudQotCQlJQ29udHJpYnV0aW9uSXRlbSBjaSA9IGNyZWF0ZUFsaWduTWVudSgpOwotCQlpZiAoY2kuaXNFbmFibGVkKCkgJiYgY2FuTW9kaWZ5KSB7Ci0JCQltZW51Ci0JCQkJCS5hcHBlbmRUb0dyb3VwKEdFRkFjdGlvbkNvbnN0YW50cy5NQl9BRERJVElPTlMsCi0JCQkJCQkJbmV3IFNlcGFyYXRvcigpKTsKLQkJCW1lbnUuYXBwZW5kVG9Hcm91cChHRUZBY3Rpb25Db25zdGFudHMuTUJfQURESVRJT05TLCBjaSk7Ci0JCQltZW51Ci0JCQkJCS5hcHBlbmRUb0dyb3VwKEdFRkFjdGlvbkNvbnN0YW50cy5NQl9BRERJVElPTlMsCi0JCQkJCQkJbmV3IFNlcGFyYXRvcigpKTsKLQkJfQotCQlhY3Rpb24gPSBnZXRBY3Rpb25SZWdpc3RyeSgpLmdldEFjdGlvbihERUxFVEVfRElBR1JBTSk7Ci0JCWlmIChhY3Rpb24uaXNFbmFibGVkKCkgJiYgY2FuTW9kaWZ5KSB7Ci0JCQltZW51Ci0JCQkJCS5hcHBlbmRUb0dyb3VwKEdFRkFjdGlvbkNvbnN0YW50cy5NQl9BRERJVElPTlMsCi0JCQkJCQkJbmV3IFNlcGFyYXRvcigpKTsKLQkJCW1lbnUuYXBwZW5kVG9Hcm91cChHRUZBY3Rpb25Db25zdGFudHMuTUJfQURESVRJT05TLCBhY3Rpb24pOwotCQkJbWVudQotCQkJCQkuYXBwZW5kVG9Hcm91cChHRUZBY3Rpb25Db25zdGFudHMuTUJfQURESVRJT05TLAotCQkJCQkJCW5ldyBTZXBhcmF0b3IoKSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgSUNvbnRyaWJ1dGlvbkl0ZW0gY3JlYXRlQWxpZ25NZW51KCkgewotCQkvLyBjcmVhdGUgYSBuZXcgbWVudSBtYW5hZ2VyIGZvciB0aGUgY2FzY2FkaW5nIG1lbnUKLQkJTWVudU1hbmFnZXIgYWxpZ25NZW51TWFuYWdlciA9IG5ldyBNZW51TWFuYWdlcihEaWFncmFtVUlSZXNvdXJjZXMuQWJzdHJhY3REaWFncmFtRWRpdG9yX2FsaWduTWVudV90ZXh0KSB7IAotCi0JCQlwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWQoKSB7Ci0JCQkJaW50IHRvdGFsID0gMDsKLQkJCQkvLyBlbmFibGUgdGhlIG1lbnUgb25seSBpZiAyIG9yIG1vcmUgbm9kZXMgb3Igbm9kZSBjb250YWluZXJzCi0JCQkJLy8gYXJlIHNlbGVjdGVkCi0JCQkJTGlzdCBlZGl0UGFydHMgPSBnZXRHcmFwaGljYWxWaWV3ZXIoKS5nZXRTZWxlY3RlZEVkaXRQYXJ0cygpOwotCQkJCS8vIG5lZWQgYXQgbGVhc3QgdHdvIHRoaW5ncyBzZWxlY3RlZCB0byBhbGlnbgotCQkJCWlmIChlZGl0UGFydHMuc2l6ZSgpID4gMSkgewotCQkJCQlmb3IgKGludCBhID0gMDsgYSA8IGVkaXRQYXJ0cy5zaXplKCk7IGErKykgewotCQkJCQkJRWRpdFBhcnQgZWRpdFBhcnQgPSAoRWRpdFBhcnQpIGVkaXRQYXJ0cy5nZXQoYSk7Ci0JCQkJCQkvLyB3ZSBjYW4gYWxpZ24gbm9kZXMgYW5kIGNvbnRhaW5lcnMKLQkJCQkJCWlmIChlZGl0UGFydCBpbnN0YW5jZW9mIE5vZGVFZGl0UGFydAotCQkJCQkJCQl8fCBlZGl0UGFydCBpbnN0YW5jZW9mIE5vZGVDb250YWluZXJFZGl0UGFydCkgewotCQkJCQkJCS8vIGFkZCB1cCB0aGUgZWxlbWVudHMgd2UgbmVlZCwgdGhlcmUgbWF5IGJlIG1vcmUKLQkJCQkJCQkvLyBlbGVtZW50cyBzZWxlY3RlZCAobGlua3MsIGV0Yy4pCi0JCQkJCQkJdG90YWwrKzsKLQkJCQkJCQlpZiAodG90YWwgPiAxKSB7Ci0JCQkJCQkJCS8vIHdlIG9ubHkgbmVlZCB0byBrbm93IHRoZXJlIGlzIG1vcmUgdGhhbiAxLCBzbwotCQkJCQkJCQkvLyB3ZSBjYW4gc3RvcCBoZXJlCi0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQlyZXR1cm4gdG90YWwgPiAxOwotCQkJfQotCQl9OwotCQkvLyBhZGQgdGhlIGFjdGlvbnMgdG8gdGhpcyBtZW51Ci0JCWFsaWduTWVudU1hbmFnZXIuYWRkKGdldEFjdGlvblJlZ2lzdHJ5KCkuZ2V0QWN0aW9uKAotCQkJCURpYWdyYW1BY3Rpb25TZXJ2aWNlLkFMSUdOX0hPUlpfQVZFUkFHRSkpOwotCQlhbGlnbk1lbnVNYW5hZ2VyLmFkZChnZXRBY3Rpb25SZWdpc3RyeSgpLmdldEFjdGlvbigKLQkJCQlEaWFncmFtQWN0aW9uU2VydmljZS5BTElHTl9IT1JaX0ZJUlNUX1NFTEVDVEVEKSk7Ci0JCWFsaWduTWVudU1hbmFnZXIuYWRkKGdldEFjdGlvblJlZ2lzdHJ5KCkuZ2V0QWN0aW9uKAotCQkJCURpYWdyYW1BY3Rpb25TZXJ2aWNlLkFMSUdOX1ZFUlRfQVZFUkFHRSkpOwotCQlhbGlnbk1lbnVNYW5hZ2VyLmFkZChnZXRBY3Rpb25SZWdpc3RyeSgpLmdldEFjdGlvbigKLQkJCQlEaWFncmFtQWN0aW9uU2VydmljZS5BTElHTl9WRVJUX0ZJUlNUX1NFTEVDVEVEKSk7Ci0JCXJldHVybiBhbGlnbk1lbnVNYW5hZ2VyOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hGcm9tQmFzZSgpIHsKLQkJZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShyZWZyZXNoRnJvbUJhc2VDb21tYW5kKTsKLQotCQkvLyBEaWFncmFtIGRpYWdyYW0gPSAoRGlhZ3JhbSkgZWRpdFBhcnQuZ2V0TW9kZWwoKTsKLQkJLy8gR3JhcGhpY2FsRGF0YUhlbHBlci5yZWZyZXNoRnJvbUJhc2UoZGlhZ3JhbS5nZXRVTUFEaWFncmFtKCkpOwotCQkvLyBPYmplY3QgYWN0ID0gZGlhZ3JhbS5nZXRPYmplY3QoKTsKLQkJLy8gaWYoZWRpdFBhcnQuaXNBY3RpdmUoKSkgewotCQkvLyBlZGl0UGFydC5kZWFjdGl2YXRlKCk7Ci0JCS8vIH0KLQkJLy8gZGlhZ3JhbS5yZW1vdmVDb25zdW1lcih0aGlzKTsKLQkJLy8gZWRpdFBhcnQgPSBjcmVhdGVFZGl0UGFydChhY3QpOwotCQkvLyBnZXRHcmFwaGljYWxWaWV3ZXIoKS5zZXRDb250ZW50cyhlZGl0UGFydCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQWN0aW9ucygpIHsKLQkJc3VwZXIuY3JlYXRlQWN0aW9ucygpOwotCi0JCUFjdGlvblJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gZ2V0QWN0aW9uUmVnaXN0cnkoKTsKLQkJSUFjdGlvbiBhY3Rpb247Ci0KLQkJLy8gcmVwbGFjZSBkZWZhdWx0IGRlbGV0ZSBhY3Rpb24gd2l0aCBhIGN1c3RvbSBvbmUKLQkJLy8KLQkJYWN0aW9uID0gcmVnaXN0cnkuZ2V0QWN0aW9uKEFjdGlvbkZhY3RvcnkuREVMRVRFLmdldElkKCkpOwotCQlpZiAoYWN0aW9uICE9IG51bGwpIHsKLQkJCXJlZ2lzdHJ5LnJlbW92ZUFjdGlvbihhY3Rpb24pOwotCQkJZ2V0U2VsZWN0aW9uQWN0aW9ucygpLnJlbW92ZShhY3Rpb24pOwotCQl9Ci0JCWFjdGlvbiA9IG5ldyBEZWxldGVBY3Rpb24oKElXb3JrYmVuY2hQYXJ0KSB0aGlzKSB7Ci0KLQkJCS8qCi0JCQkgKiAobm9uLUphdmFkb2MpCi0JCQkgKiAKLQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuZ2VmLnVpLmFjdGlvbnMuV29ya2JlbmNoUGFydEFjdGlvbiNpc0VuYWJsZWQoKQotCQkJICovCi0JCQlwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWQoKSB7Ci0JCQkJcmV0dXJuIHN1cGVyLmlzRW5hYmxlZCgpOwotCQkJfQotCi0JCQkvKgotCQkJICogKG5vbi1KYXZhZG9jKQotCQkJICogCi0JCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmdlZi51aS5hY3Rpb25zLkRlbGV0ZUFjdGlvbiNjYWxjdWxhdGVFbmFibGVkKCkKLQkJCSAqLwotCQkJLy8gcHJvdGVjdGVkIGJvb2xlYW4gY2FsY3VsYXRlRW5hYmxlZCgpIHsKLQkJCS8vIGZvciAoSXRlcmF0b3IgaXRlciA9IGdldFNlbGVjdGVkT2JqZWN0cygpLml0ZXJhdG9yKCk7Ci0JCQkvLyBpdGVyLmhhc05leHQoKTspIHsKLQkJCS8vIE9iamVjdCBlZGl0UGFydCA9IGl0ZXIubmV4dCgpOwotCQkJLy8gaWYoZWRpdFBhcnQgaW5zdGFuY2VvZiBFZGl0UGFydCkgewotCQkJLy8gT2JqZWN0IG9iaiA9ICgoRWRpdFBhcnQpZWRpdFBhcnQpLmdldE1vZGVsKCk7Ci0JCQkvLyBpZihvYmogaW5zdGFuY2VvZiBOYW1lZE5vZGUpIHsKLQkJCS8vIE9iamVjdCBlbGVtZW50ID0gKChOYW1lZE5vZGUpb2JqKS5nZXRPYmplY3QoKTsKLQkJCS8vIGlmKGVsZW1lbnQgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50KSB7Ci0JCQkvLyByZXR1cm4gZmFsc2U7Ci0JCQkvLyB9Ci0JCQkvLyB9Ci0JCQkvLyB9Ci0JCQkvLyB9Ci0JCQkvLyByZXR1cm4gc3VwZXIuY2FsY3VsYXRlRW5hYmxlZCgpOwotCQkJLy8gfQotCQkJLy8gVE9ETzogdW5jb21tZW50IHRoaXMgY29kZSBpZiB3ZSBhcmUgcmVhZHkgdG8gdGVzdCBkZWxldGluZwotCQkJLy8gQnJlYWtkb3duRWxlbWVudCBub2RlCi0JCQkvLwotCQkJLy8gLyogKG5vbi1KYXZhZG9jKQotCQkJLy8gKiBAc2VlIG9yZy5lY2xpcHNlLmdlZi51aS5hY3Rpb25zLkRlbGV0ZUFjdGlvbiNydW4oKQotCQkJLy8gKi8KLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlMaXN0IGVsZW1lbnRzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGdldFNlbGVjdGVkT2JqZWN0cygpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCU9iamVjdCBlZGl0UGFydCA9IGl0ZXIubmV4dCgpOwotCQkJCQlpZiAoZWRpdFBhcnQgaW5zdGFuY2VvZiBFZGl0UGFydCkgewotCQkJCQkJT2JqZWN0IG9iaiA9ICgoRWRpdFBhcnQpIGVkaXRQYXJ0KS5nZXRNb2RlbCgpOwotCQkJCQkJaWYgKG9iaiBpbnN0YW5jZW9mIE5hbWVkTm9kZSkgewotCQkJCQkJCU9iamVjdCBlbGVtZW50ID0gKChOYW1lZE5vZGUpIG9iaikuZ2V0T2JqZWN0KCk7Ci0JCQkJCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50KSB7Ci0JCQkJCQkJCWVsZW1lbnRzLmFkZChlbGVtZW50KTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKCFlbGVtZW50cy5pc0VtcHR5KCkpIHsKLQkJCQkJUHJvY2Vzc0RlbGV0ZUFjdGlvbiBkZWxldGVBY3Rpb24gPSBuZXcgUHJvY2Vzc0RlbGV0ZUFjdGlvbigpIHsKLQkJCQkJCS8qCi0JCQkJCQkgKiAobm9uLUphdmFkb2MpCi0JCQkJCQkgKiAKLQkJCQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zLk1ldGhvZEVsZW1lbnREZWxldGVBY3Rpb24jY3JlYXRlQ29tbWFuZChqYXZhLnV0aWwuQ29sbGVjdGlvbikKLQkJCQkJCSAqLwotCQkJCQkJcHVibGljIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kIGNyZWF0ZUNvbW1hbmQoCi0JCQkJCQkJCUNvbGxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCQkJCQkJZG9tYWluID0gbnVsbDsKLQkJCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBzZWxlY3Rpb24uaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyLm5leHQoKTsKLQkJCQkJCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3IpIHsKLQkJCQkJCQkJCWRvbWFpbiA9IG5ldyBBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW4oCi0JCQkJCQkJCQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkJCQkJCQkJLmdldFBCU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQkJCQkJCW5ldyBCYXNpY0NvbW1hbmRTdGFjaygpKTsKLQkJCQkJCQkJCWJyZWFrOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJCWlmIChkb21haW4gPT0gbnVsbCkgewotCQkJCQkJCQlkb21haW4gPSBuZXcgQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluKAotCQkJCQkJCQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkJCQkJCQkuZ2V0V0JTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCQkJCQluZXcgQmFzaWNDb21tYW5kU3RhY2soKSk7Ci0JCQkJCQkJfQotCQkJCQkJCXJldHVybiBzdXBlci5jcmVhdGVDb21tYW5kKHNlbGVjdGlvbik7Ci0JCQkJCQl9Ci0KLQkJCQkJfTsKLQkJCQkJZGVsZXRlQWN0aW9uLnVwZGF0ZVNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbigKLQkJCQkJCQllbGVtZW50cykpOwotCQkJCQlkZWxldGVBY3Rpb24ucnVuKCk7Ci0JCQkJCWlmIChkZWxldGVBY3Rpb24uaXNEZWxldGlvbkNvbmZpcm1lZCgpKSB7Ci0JCQkJCQlzdXBlci5ydW4oKTsKLQotCQkJCQkJLy8gc2F2ZSB0aGUgZWRpdG9yCi0JCQkJCQkvLyAKLQkJCQkJCUJ1c3lJbmRpY2F0b3Iuc2hvd1doaWxlKGdldEVkaXRvclNpdGUoKS5nZXRTaGVsbCgpCi0JCQkJCQkJCS5nZXREaXNwbGF5KCksIG5ldyBSdW5uYWJsZSgpIHsKLQotCQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQkJZG9TYXZlKG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQkJCQkJCX0KLQkJCQkJCX0pOwotCQkJCQl9Ci0KLQkJCQl9IGVsc2UgewotCQkJCQlzdXBlci5ydW4oKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JCXJlZ2lzdHJ5LnJlZ2lzdGVyQWN0aW9uKGFjdGlvbik7Ci0JCWdldFNlbGVjdGlvbkFjdGlvbnMoKS5hZGQoYWN0aW9uLmdldElkKCkpOwotCi0JCWFjdGlvbiA9IG5ldyBDb3B5VGVtcGxhdGVBY3Rpb24odGhpcyk7Ci0JCXJlZ2lzdHJ5LnJlZ2lzdGVyQWN0aW9uKGFjdGlvbik7Ci0KLQkJLy8gcmVmcmVzaCBkaWFncmFtIGZyb20gYmFzZSBhY3Rpb24KLQkJLy8KLQkJYWN0aW9uID0gbmV3IEFjdGlvbigKLQkJCQlEaWFncmFtVUlSZXNvdXJjZXMuQWJzdHJhY3REaWFncmFtRWRpdG9yX3JlZnJlc2hGcm9tQmFzZUFjdGl2aXR5X3RleHQpIHsgCi0JCQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQkJCXJldHVybiBSRUZSRVNIX0ZST01fQkFTRV9BQ1RJVklUWTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCXJlZnJlc2hGcm9tQmFzZSgpOwotCQkJfQotCi0JCQlwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWQoKSB7Ci0JCQkJQWN0aXZpdHkgYWN0ID0gKEFjdGl2aXR5KSBnZXRNZXRob2RFbGVtZW50RnJvbUlucHV0KCk7Ci0JCQkJcmV0dXJuIGFjdC5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkgIT0gbnVsbDsKLQkJCX0KLQkJfTsKLQkJcmVnaXN0cnkucmVnaXN0ZXJBY3Rpb24oYWN0aW9uKTsKLQotCQkvLyBhY3Rpb24gPSBuZXcgTWF0Y2hXaWR0aEFjdGlvbih0aGlzKTsKLQkJLy8gcmVnaXN0cnkucmVnaXN0ZXJBY3Rpb24oYWN0aW9uKTsKLQkJLy8gZ2V0U2VsZWN0aW9uQWN0aW9ucygpLmFkZChhY3Rpb24uZ2V0SWQoKSk7Ci0KLQkJLy8gYWN0aW9uID0gbmV3IE1hdGNoSGVpZ2h0QWN0aW9uKHRoaXMpOwotCQkvLyByZWdpc3RyeS5yZWdpc3RlckFjdGlvbihhY3Rpb24pOwotCQkvLyBnZXRTZWxlY3Rpb25BY3Rpb25zKCkuYWRkKGFjdGlvbi5nZXRJZCgpKTsKLQotCQkvLyBhY3Rpb24gPSBuZXcgTG9naWNQYXN0ZVRlbXBsYXRlQWN0aW9uKHRoaXMpOwotCQkvLyByZWdpc3RyeS5yZWdpc3RlckFjdGlvbihhY3Rpb24pOwotCQkvLyBnZXRTZWxlY3Rpb25BY3Rpb25zKCkuYWRkKGFjdGlvbi5nZXRJZCgpKTsKLQotCQkvLyBhY3Rpb24gPSBuZXcgSW5jcmVtZW50RGVjcmVtZW50QWN0aW9uKHRoaXMsIHRydWUpOwotCQkvLyByZWdpc3RyeS5yZWdpc3RlckFjdGlvbihhY3Rpb24pOwotCQkvLyBnZXRTZWxlY3Rpb25BY3Rpb25zKCkuYWRkKGFjdGlvbi5nZXRJZCgpKTsKLQkJLy8KLQkJLy8gYWN0aW9uID0gbmV3IEluY3JlbWVudERlY3JlbWVudEFjdGlvbih0aGlzLCBmYWxzZSk7Ci0JCS8vIHJlZ2lzdHJ5LnJlZ2lzdGVyQWN0aW9uKGFjdGlvbik7Ci0JCS8vIGdldFNlbGVjdGlvbkFjdGlvbnMoKS5hZGQoYWN0aW9uLmdldElkKCkpOwotCQkvLwotCQkvLyBhY3Rpb24gPSBuZXcgRGlyZWN0RWRpdEFjdGlvbigoSVdvcmtiZW5jaFBhcnQpdGhpcyk7Ci0JCS8vIHJlZ2lzdHJ5LnJlZ2lzdGVyQWN0aW9uKGFjdGlvbik7Ci0JCS8vIGdldFNlbGVjdGlvbkFjdGlvbnMoKS5hZGQoYWN0aW9uLmdldElkKCkpOwotCQkvLwotCQkvLyBhY3Rpb24gPSBuZXcgQWxpZ25tZW50QWN0aW9uKChJV29ya2JlbmNoUGFydCl0aGlzLAotCQkvLyBQb3NpdGlvbkNvbnN0YW50cy5MRUZUKTsKLQkJLy8gcmVnaXN0cnkucmVnaXN0ZXJBY3Rpb24oYWN0aW9uKTsKLQkJLy8gZ2V0U2VsZWN0aW9uQWN0aW9ucygpLmFkZChhY3Rpb24uZ2V0SWQoKSk7Ci0JCS8vCi0JCS8vIGFjdGlvbiA9IG5ldyBBbGlnbm1lbnRBY3Rpb24oKElXb3JrYmVuY2hQYXJ0KXRoaXMsCi0JCS8vIFBvc2l0aW9uQ29uc3RhbnRzLlJJR0hUKTsKLQkJLy8gcmVnaXN0cnkucmVnaXN0ZXJBY3Rpb24oYWN0aW9uKTsKLQkJLy8gZ2V0U2VsZWN0aW9uQWN0aW9ucygpLmFkZChhY3Rpb24uZ2V0SWQoKSk7Ci0JCS8vCi0JCS8vIGFjdGlvbiA9IG5ldyBBbGlnbm1lbnRBY3Rpb24oKElXb3JrYmVuY2hQYXJ0KXRoaXMsCi0JCS8vIFBvc2l0aW9uQ29uc3RhbnRzLlRPUCk7Ci0JCS8vIHJlZ2lzdHJ5LnJlZ2lzdGVyQWN0aW9uKGFjdGlvbik7Ci0JCS8vIGdldFNlbGVjdGlvbkFjdGlvbnMoKS5hZGQoYWN0aW9uLmdldElkKCkpOwotCQkvLwotCQkvLyBhY3Rpb24gPSBuZXcgQWxpZ25tZW50QWN0aW9uKChJV29ya2JlbmNoUGFydCl0aGlzLAotCQkvLyBQb3NpdGlvbkNvbnN0YW50cy5CT1RUT00pOwotCQkvLyByZWdpc3RyeS5yZWdpc3RlckFjdGlvbihhY3Rpb24pOwotCQkvLyBnZXRTZWxlY3Rpb25BY3Rpb25zKCkuYWRkKGFjdGlvbi5nZXRJZCgpKTsKLQkJLy8KLQkJLy8gYWN0aW9uID0gbmV3IEFsaWdubWVudEFjdGlvbigoSVdvcmtiZW5jaFBhcnQpdGhpcywKLQkJLy8gUG9zaXRpb25Db25zdGFudHMuQ0VOVEVSKTsKLQkJLy8gcmVnaXN0cnkucmVnaXN0ZXJBY3Rpb24oYWN0aW9uKTsKLQkJLy8gZ2V0U2VsZWN0aW9uQWN0aW9ucygpLmFkZChhY3Rpb24uZ2V0SWQoKSk7Ci0JCS8vCi0JCS8vIGFjdGlvbiA9IG5ldyBBbGlnbm1lbnRBY3Rpb24oKElXb3JrYmVuY2hQYXJ0KXRoaXMsCi0JCS8vIFBvc2l0aW9uQ29uc3RhbnRzLk1JRERMRSk7Ci0JCS8vIHJlZ2lzdHJ5LnJlZ2lzdGVyQWN0aW9uKGFjdGlvbik7Ci0JCS8vIGdldFNlbGVjdGlvbkFjdGlvbnMoKS5hZGQoYWN0aW9uLmdldElkKCkpOwotCi0JCUlBY3Rpb24gYWN0aW9uMSA9IG5ldyBBY3Rpb24oCi0JCQkJRGlhZ3JhbVVJUmVzb3VyY2VzLkFic3RyYWN0RGlhZ3JhbUVkaXRvcl9mb3JtYXRUZXh0Qm94QWN0aXZpdHlfdGV4dCkgeyAKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCQkJcmV0dXJuIEZPTlRfRElBTE9HOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJdHJ5IHsKLQkJCQkJCUVkaXRQYXJ0IHNlbGVjdGVkRWRpdFBhcnQgPSAoRWRpdFBhcnQpIGdldEdyYXBoaWNhbFZpZXdlcigpCi0JCQkJCQkJCS5nZXRTZWxlY3RlZEVkaXRQYXJ0cygpLmdldCgwKTsKLQkJCQkJCQotCQkJCQkJRm9udERpYWxvZyBmZCA9IG5ldyBGb250RGlhbG9nKFBsYXRmb3JtVUkKLQkJCQkJCQkJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpCi0JCQkJCQkJCS5nZXRTaGVsbCgpKTsKLQkJCQkJCS8vIFJlc3RvcmluZyBvbGQgdmFsdWVzLgotCQkJCQkJaWYoc2VsZWN0ZWRFZGl0UGFydCAhPSBudWxsKXsKLQkJCQkJCQlyZXN0b3JlRm9udERhdGEoc2VsZWN0ZWRFZGl0UGFydCwgZmQpOwotCQkJCQkJfQotCQkJCQkJCi0JCQkJCQlmZC5vcGVuKCk7Ci0JCQkJCQlpZiAoc2VsZWN0ZWRFZGl0UGFydCBpbnN0YW5jZW9mIEZyZWVUZXh0Tm9kZUVkaXRQYXJ0KSB7Ci0JCQkJCQkJaWYgKGZkLmdldEZvbnRMaXN0KCkgIT0gbnVsbCkgewotCQkJCQkJCQlGb250RGF0YSBmRGF0YSA9IGZkLmdldEZvbnRMaXN0KClbMF07Ci0JCQkJCQkJCWlmIChmRGF0YSAhPSBudWxsKSB7Ci0JCQkJCQkJCQlpZiAoZm9udCAhPSBudWxsICYmICFmb250LmlzRGlzcG9zZWQoKSkgewotCQkJCQkJCQkJCWZvbnQuZGlzcG9zZSgpOwotCQkJCQkJCQkJfQotCQkJCQkJCQkJLy8gaWYoY29sb3IgIT0gbnVsbCAmJiAhZm9udC5pc0Rpc3Bvc2VkKCkpewotCQkJCQkJCQkJLy8gY29sb3IuZGlzcG9zZSgpOwotCQkJCQkJCQkJLy8gfQotCQkJCQkJCQkJZm9udCA9IG5ldyBGb250KFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkKLQkJCQkJCQkJCQkJLmdldERpc3BsYXkoKSwgZkRhdGEpOwotCQkJCQkJCQkJCi0JCQkJCQkJCQlpZihmZC5nZXRSR0IoKSAhPSBudWxsKQotCQkJCQkJCQkJY29sb3IgPSBuZXcgQ29sb3IobnVsbCwgZmQuZ2V0UkdCKCkpOwotCQkJCQkJCQkJCi0JCQkJCQkJCQkoKEZyZWVUZXh0RmlndXJlKSAoKEZyZWVUZXh0Tm9kZUVkaXRQYXJ0KSBzZWxlY3RlZEVkaXRQYXJ0KQotCQkJCQkJCQkJCQkuZ2V0RmlndXJlKCkpLnNldEZvbnQoZm9udCk7Ci0JCQkJCQkJCQkKLQkJCQkJCQkJCWlmKGNvbG9yICE9IG51bGwpCi0JCQkJCQkJCQkoKEZyZWVUZXh0RmlndXJlKSAoKEZyZWVUZXh0Tm9kZUVkaXRQYXJ0KSBzZWxlY3RlZEVkaXRQYXJ0KQotCQkJCQkJCQkJCQkuZ2V0RmlndXJlKCkpCi0JCQkJCQkJCQkJCS5zZXRGb3JlZ3JvdW5kQ29sb3IoY29sb3IpOwotCi0JCQkJCQkJCQlHcmFwaE5vZGUgZ3JhcGhOb2RlID0gKChOb2RlKSBzZWxlY3RlZEVkaXRQYXJ0Ci0JCQkJCQkJCQkJCS5nZXRNb2RlbCgpKS5nZXRHcmFwaE5vZGUoKTsKLQkJCQkJCQkJCUxpc3QgbGlzdCA9IGdyYXBoTm9kZQotCQkJCQkJCQkJCQkuZ2V0TGlzdChVbWFQYWNrYWdlLkdSQVBIX05PREVfX1BST1BFUlRZKTsKLQotCQkJCQkJCQkJU3RyaW5nIHRleHQgPSAoKEZyZWVUZXh0RmlndXJlKSAoKEZyZWVUZXh0Tm9kZUVkaXRQYXJ0KSBzZWxlY3RlZEVkaXRQYXJ0KQotCQkJCQkJCQkJCQkuZ2V0RmlndXJlKCkpLmdldFRleHQoKTsKLQkJCQkJCQkJCVByb3BlcnR5IHByb3BlcnR5ID0gZ2V0UHJvcGVydHlCeUtleSgKLQkJCQkJCQkJCQkJbGlzdCwKLQkJCQkJCQkJCQkJR3JhcGhpY2FsRGF0YUhlbHBlci5HUkFQSF9OT0RFX0ZSRUVfVEVYVCk7Ci0JCQkJCQkJCQlpZiAocHJvcGVydHkgIT0gbnVsbCkgewotCQkJCQkJCQkJCXByb3BlcnR5LnNldFZhbHVlKHRleHQpOwotCQkJCQkJCQkJCWxpc3QuYWRkKHByb3BlcnR5KTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJCXNldFByb3BlcnR5KAotCQkJCQkJCQkJCQlsaXN0LAotCQkJCQkJCQkJCQlUZW1wbGF0ZUNvbnN0YW50cy5QUk9QRVJUWV9GT05UX05BTUUsCi0JCQkJCQkJCQkJCWZEYXRhLmdldE5hbWUoKSk7Ci0JCQkJCQkJCQlzZXRQcm9wZXJ0eSgKLQkJCQkJCQkJCQkJbGlzdCwKLQkJCQkJCQkJCQkJVGVtcGxhdGVDb25zdGFudHMuUFJPUEVSVFlfRk9OVF9TVFlMRSwKLQkJCQkJCQkJCQkJbmV3IEludGVnZXIoZkRhdGEuZ2V0U3R5bGUoKSkKLQkJCQkJCQkJCQkJCQkudG9TdHJpbmcoKSk7Ci0JCQkJCQkJCQlzZXRQcm9wZXJ0eSgKLQkJCQkJCQkJCQkJbGlzdCwKLQkJCQkJCQkJCQkJVGVtcGxhdGVDb25zdGFudHMuUFJPUEVSVFlfRk9OVF9IRUlHSFQsCi0JCQkJCQkJCQkJCW5ldyBJbnRlZ2VyKGZEYXRhLmdldEhlaWdodCgpKQotCQkJCQkJCQkJCQkJCS50b1N0cmluZygpKTsKLQkJCQkJCQkJCWlmKGZkLmdldFJHQigpICE9IG51bGwpewotCQkJCQkJCQkJc2V0UHJvcGVydHkoCi0JCQkJCQkJCQkJCWxpc3QsCi0JCQkJCQkJCQkJCVRlbXBsYXRlQ29uc3RhbnRzLlBST1BFUlRZX0ZPTlRfUkVELAotCQkJCQkJCQkJCQluZXcgSW50ZWdlcihmZC5nZXRSR0IoKS5yZWQpCi0JCQkJCQkJCQkJCQkJLnRvU3RyaW5nKCkpOwotCQkJCQkJCQkJc2V0UHJvcGVydHkoCi0JCQkJCQkJCQkJCWxpc3QsCi0JCQkJCQkJCQkJCVRlbXBsYXRlQ29uc3RhbnRzLlBST1BFUlRZX0ZPTlRfQkxVRSwKLQkJCQkJCQkJCQkJbmV3IEludGVnZXIoZmQuZ2V0UkdCKCkuYmx1ZSkKLQkJCQkJCQkJCQkJCQkudG9TdHJpbmcoKSk7Ci0JCQkJCQkJCQlzZXRQcm9wZXJ0eSgKLQkJCQkJCQkJCQkJbGlzdCwKLQkJCQkJCQkJCQkJVGVtcGxhdGVDb25zdGFudHMuUFJPUEVSVFlfRk9OVF9HUkVFTiwKLQkJCQkJCQkJCQkJbmV3IEludGVnZXIoZmQuZ2V0UkdCKCkuZ3JlZW4pCi0JCQkJCQkJCQkJCQkJLnRvU3RyaW5nKCkpOwotCQkJCQkJCQkJfQotCQkJCQkJCQkJc2VsZWN0ZWRFZGl0UGFydC5yZWZyZXNoKCk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0KLQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4Y2VwdGlvbikgewotCQkJCQkJZXhjZXB0aW9uLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCQl9Ci0JCQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJfQotCi0JCQl9Ci0KLQkJCXB1YmxpYyBib29sZWFuIGlzRW5hYmxlZCgpIHsKLQkJCQlMaXN0IGVkaXRQYXJ0cyA9IGdldEdyYXBoaWNhbFZpZXdlcigpLmdldFNlbGVjdGVkRWRpdFBhcnRzKCk7Ci0JCQkJaWYgKGVkaXRQYXJ0cy5zaXplKCkgIT0gMSkKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCUVkaXRQYXJ0IGVkaXRQYXJ0ID0gKEVkaXRQYXJ0KSBlZGl0UGFydHMuZ2V0KDApOwotCQkJCWlmIChlZGl0UGFydC5nZXRNb2RlbCgpIGluc3RhbmNlb2YgVHlwZWROb2RlKSB7Ci0JCQkJCXJldHVybiAoKChUeXBlZE5vZGUpIGVkaXRQYXJ0LmdldE1vZGVsKCkpLmdldFR5cGUoKSA9PSBUeXBlZE5vZGUuRlJFRV9URVhUKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCi0JCQlwdWJsaWMgUHJvcGVydHkgZ2V0UHJvcGVydHlCeUtleShMaXN0IGxpc3QsIFN0cmluZyBrZXkpIHsKLQkJCQlpZiAoIWxpc3QuaXNFbXB0eSgpKSB7Ci0JCQkJCWZvciAoSXRlcmF0b3IgaXJvciA9IGxpc3QuaXRlcmF0b3IoKTsgaXJvci5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlQcm9wZXJ0eSBwcm9wZXJ0eSA9IChQcm9wZXJ0eSkgaXJvci5uZXh0KCk7Ci0JCQkJCQlpZiAocHJvcGVydHkgIT0gbnVsbCkgewotCQkJCQkJCWlmIChwcm9wZXJ0eS5nZXRLZXkoKS5lcXVhbHMoa2V5KSkgewotCQkJCQkJCQlyZXR1cm4gcHJvcGVydHk7Ci0JCQkJCQkJfSAKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgc2V0UHJvcGVydHkoTGlzdCBsaXN0LCBTdHJpbmcga2V5LCBTdHJpbmcgdmFsdWUpIHsKLQotCQkJCVByb3BlcnR5IHByb3BlcnR5ID0gZ2V0UHJvcGVydHlCeUtleShsaXN0LCBrZXkpOwotCQkJCWlmIChwcm9wZXJ0eSAhPSBudWxsKSB7Ci0JCQkJCXByb3BlcnR5LnNldFZhbHVlKHZhbHVlKTsKLQotCQkJCX0gZWxzZSB7Ci0JCQkJCXByb3BlcnR5ID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUHJvcGVydHkoKTsKLQkJCQkJcHJvcGVydHkuc2V0S2V5KGtleSk7Ci0JCQkJCXByb3BlcnR5LnNldFZhbHVlKHZhbHVlKTsKLQkJCQl9Ci0JCQkJbGlzdC5hZGQocHJvcGVydHkpOwotCQkJfQotCQkJcHVibGljIHZvaWQgcmVzdG9yZUZvbnREYXRhKEVkaXRQYXJ0IHNlbGVjdGVkRWRpdFBhcnQsIEZvbnREaWFsb2cgZmQpewotCQkJCUdyYXBoTm9kZSBncmFwaE5vZGUgPSAoKE5vZGUpIHNlbGVjdGVkRWRpdFBhcnQKLQkJCQkJCS5nZXRNb2RlbCgpKS5nZXRHcmFwaE5vZGUoKTsKLQkJCQkJTGlzdCBsaXN0ID0gZ3JhcGhOb2RlCi0JCQkJCQkuZ2V0TGlzdChVbWFQYWNrYWdlLkdSQVBIX05PREVfX1BST1BFUlRZKTsKLQkJCQkJaWYobGlzdCAhPSBudWxsICYmICFsaXN0LmlzRW1wdHkoKSl7Ci0JCQkJCQlQcm9wZXJ0eSBwcm9wZXJ0eSA9IG51bGw7Ci0JCQkJCQlTdHJpbmcgZm9udG5hbWUgPSBudWxsLCBmb250U3R5bGUgPSBudWxsLCBmb250SGVpZ2h0ID0gbnVsbCwgcmVkID0gbnVsbCwgYmx1ZSA9IG51bGwsIGdyZWVuID0gbnVsbDsKLQotCQkJCQkJcHJvcGVydHkgPSBnZXRQcm9wZXJ0eUJ5S2V5KGxpc3QsIFRlbXBsYXRlQ29uc3RhbnRzLlBST1BFUlRZX0ZPTlRfTkFNRSk7Ci0JCQkJCQlpZihwcm9wZXJ0eSAhPSBudWxsICl7Ci0JCQkJCQkJZm9udG5hbWUgPSBwcm9wZXJ0eS5nZXRWYWx1ZSgpOwotCQkJCQkJfWVsc2V7Ci0JCQkJCQkJcmV0dXJuOwotCQkJCQkJfQotCQkJCQkJCi0JCQkJCQlwcm9wZXJ0eSA9IGdldFByb3BlcnR5QnlLZXkobGlzdCwgVGVtcGxhdGVDb25zdGFudHMuUFJPUEVSVFlfRk9OVF9TVFlMRSk7Ci0JCQkJCQlpZihwcm9wZXJ0eSAhPSBudWxsICl7Ci0JCQkJCQkJZm9udFN0eWxlID0gcHJvcGVydHkuZ2V0VmFsdWUoKTsKLQkJCQkJCX0KLQkJCQkJCXByb3BlcnR5ID0gZ2V0UHJvcGVydHlCeUtleShsaXN0LCBUZW1wbGF0ZUNvbnN0YW50cy5QUk9QRVJUWV9GT05UX0hFSUdIVCk7Ci0JCQkJCQlpZihwcm9wZXJ0eSAhPSBudWxsKXsKLQkJCQkJCQlmb250SGVpZ2h0ID0gcHJvcGVydHkuZ2V0VmFsdWUoKTsKLQkJCQkJCX0KLQkJCQkJCXByb3BlcnR5ID0gZ2V0UHJvcGVydHlCeUtleShsaXN0LCBUZW1wbGF0ZUNvbnN0YW50cy5QUk9QRVJUWV9GT05UX1JFRCk7Ci0JCQkJCQlpZihwcm9wZXJ0eSAhPSBudWxsKXsKLQkJCQkJCQlyZWQgPSBwcm9wZXJ0eS5nZXRWYWx1ZSgpOwotCQkJCQkJfQotCQkJCQkJcHJvcGVydHkgPSBnZXRQcm9wZXJ0eUJ5S2V5KGxpc3QsIFRlbXBsYXRlQ29uc3RhbnRzLlBST1BFUlRZX0ZPTlRfQkxVRSk7Ci0JCQkJCQlpZihwcm9wZXJ0eSAhPSBudWxsKXsKLQkJCQkJCQlibHVlID0gcHJvcGVydHkuZ2V0VmFsdWUoKTsKLQkJCQkJCX0KLQkJCQkJCXByb3BlcnR5ID0gZ2V0UHJvcGVydHlCeUtleShsaXN0LCBUZW1wbGF0ZUNvbnN0YW50cy5QUk9QRVJUWV9GT05UX0dSRUVOKTsKLQkJCQkJCWlmKHByb3BlcnR5ICE9IG51bGwpewotCQkJCQkJCWdyZWVuID0gcHJvcGVydHkuZ2V0VmFsdWUoKTsKLQkJCQkJCX0KLQkJCQkJCQotCQkJCQkJRm9udERhdGEgZkRhdGEgPSBuZXcgRm9udERhdGEoKTsKLQkJCQkJCWZEYXRhLnNldE5hbWUoZm9udG5hbWUpOwotCQkJCQkJZkRhdGEuc2V0SGVpZ2h0KChuZXcgSW50ZWdlcihmb250SGVpZ2h0KSkuaW50VmFsdWUoKSk7Ci0JCQkJCQlmRGF0YS5zZXRTdHlsZSgobmV3IEludGVnZXIoZm9udFN0eWxlKSkuaW50VmFsdWUoKSk7Ci0JCQkJCQkKLQkJCQkJCS8vLCAobmV3IEludGVnZXIoZm9udFN0eWxlKSkuaW50VmFsdWUoKSwgKG5ldyBJbnRlZ2VyKGZvbnRIZWlnaHQpKS5pbnRWYWx1ZSgpKTsKLQkJCQkJCWlmKCByZWQgIT0gbnVsbCAmJiBibHVlICE9IG51bGwgJiYgZ3JlZW4gIT0gbnVsbCl7Ci0JCQkJCQkJUkdCIHJnYiA9IG5ldyBSR0IobmV3IEludGVnZXIocmVkKS5pbnRWYWx1ZSgpLAotCQkJCQkJCQkJbmV3IEludGVnZXIoZ3JlZW4pLmludFZhbHVlKCksCi0JCQkJCQkJCQkgbmV3IEludGVnZXIoYmx1ZSkuaW50VmFsdWUoKQotCQkJCQkJCQkJICk7Ci0JCQkJCQkJZmQuc2V0UkdCKHJnYik7Ci0vLwkJCQkJCQlpZihyZ2IgIT0gbnVsbCl7Ci0vLwkJCQkJCQkJcmdiLnJlZCA9IG5ldyBJbnRlZ2VyKHJlZCkuaW50VmFsdWUoKTsKLS8vCQkJCQkJCQlyZ2IuYmx1ZSA9IG5ldyBJbnRlZ2VyKGJsdWUpLmludFZhbHVlKCk7Ci0vLwkJCQkJCQkJcmdiLmdyZWVuID0gbmV3IEludGVnZXIoZ3JlZW4pLmludFZhbHVlKCk7Ci0vLwkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQlmZC5zZXRGb250TGlzdChuZXcgRm9udERhdGFbXXtmRGF0YX0pOwotCQkJCQl9Ci0JCQl9Ci0JCX07Ci0JCWdldEFjdGlvblJlZ2lzdHJ5KCkucmVnaXN0ZXJBY3Rpb24oYWN0aW9uMSk7Ci0KLQkJLy8gSmluaHVhIFhpCi0JCS8vIGFkZGVkIHRoaXMgdG8gY29uc29saWRhdGUgY29tbW9uIGFjdGlvbnMgaW50byBhIHNlcnZpY2UgY2xhc3MKLQkJYWN0aW9uU2VydmljZSA9IG5ldyBEaWFncmFtQWN0aW9uU2VydmljZShnZXRHcmFwaGljYWxWaWV3ZXIoKSwKLQkJCQlnZXRFZGl0RG9tYWluKCksIHJlZ2lzdHJ5KTsKLQkJYWN0aW9uU2VydmljZS5yZWdpc3Rlckhvcml6b250YWxBbGlnbkF2ZXJhZ2VBY3Rpb24oKTsKLQkJYWN0aW9uU2VydmljZS5yZWdpc3Rlckhvcml6b250YWxBbGlnbkZpcnN0U2VsZWN0ZWRBY3Rpb24oKTsKLQkJYWN0aW9uU2VydmljZS5yZWdpc3RlclZlcnRpY2FsQWxpZ25BdmVyYWdlQWN0aW9uKCk7Ci0JCWFjdGlvblNlcnZpY2UucmVnaXN0ZXJWZXJ0aWNhbEFsaWduRmlyc3RTZWxlY3RlZEFjdGlvbigpOwotCi0JCS8vIC8vIGFsaWduIGhvcml6b250YWxseSB0byBhdmVyYWdlIHktdmFsdWUgb2YgYWxsIG5vZGVzCi0JCS8vIElBY3Rpb24gaEFsaWduQXZlcmFnZUFjdGlvbiA9IG5ldyBBY3Rpb24oCi0JCS8vIERpYWdyYW1VSVJlc291cmNlcwotCQkvLyAuZ2V0U3RyaW5nKCJEaWFncmFtVUkuQWJzdHJhY3REaWFncmFtRWRpdG9yLmhBbGlnbkF2ZXJhZ2VBY3Rpb24udGV4dCIpKQotCQkvLyB7IC8vJE5PTi1OTFMtMSQKLQkJLy8gcHVibGljIHZvaWQgcnVuKCkgewotCQkvLyBob3JpekFsaWduVG9BdmVyYWdlU2VsZWN0ZWQoKTsKLQkJLy8gfQotCQkvLwotCQkvLyBwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQkvLyByZXR1cm4gQUxJR05fSE9SWl9BVkVSQUdFOwotCQkvLyB9Ci0JCS8vIH07Ci0JCS8vIGdldEFjdGlvblJlZ2lzdHJ5KCkucmVnaXN0ZXJBY3Rpb24oaEFsaWduQXZlcmFnZUFjdGlvbik7Ci0JCS8vCi0JCS8vIC8vIGFsaWduIGhvcml6b250YWxseSB0byB5LXZhbHVlIG9mIGZpcnN0IHNlbGVjdGVkIG5vZGUKLQkJLy8gSUFjdGlvbiBoQWxpZ25GaXJzdFNlbGVjdGVkQWN0aW9uID0gbmV3IEFjdGlvbigKLQkJLy8gRGlhZ3JhbVVJUmVzb3VyY2VzCi0JCS8vIC5nZXRTdHJpbmcoIkRpYWdyYW1VSS5BYnN0cmFjdERpYWdyYW1FZGl0b3IuaEFsaWduRmlyc3RTZWxlY3RlZEFjdGlvbi50ZXh0IikpCi0JCS8vIHsgLy8kTk9OLU5MUy0xJAotCQkvLyBwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCS8vIGhvcnpBbGlnblRvRmlyc3RTZWxlY3RlZCgpOwotCQkvLyB9Ci0JCS8vCi0JCS8vIHB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCS8vIHJldHVybiBBTElHTl9IT1JaX0ZJUlNUX1NFTEVDVEVEOwotCQkvLyB9Ci0JCS8vIH07Ci0JCS8vIGdldEFjdGlvblJlZ2lzdHJ5KCkucmVnaXN0ZXJBY3Rpb24oaEFsaWduRmlyc3RTZWxlY3RlZEFjdGlvbik7Ci0JCS8vCi0JCS8vIC8vIGFsaWduIHZlcnRpY2FsbHkgdG8gYXZlcmFnZSB4LXZhbHVlIG9mIGFsbCBzZWxlY3RlZCBub2RlcwotCQkvLyBJQWN0aW9uIHZBbGlnbkF2ZXJhZ2VBY3Rpb24gPSBuZXcgQWN0aW9uKAotCQkvLyBEaWFncmFtVUlSZXNvdXJjZXMKLQkJLy8gLmdldFN0cmluZygiRGlhZ3JhbVVJLkFic3RyYWN0RGlhZ3JhbUVkaXRvci52QWxpZ25BdmVyYWdlQWN0aW9uLnRleHQiKSkKLQkJLy8geyAvLyROT04tTkxTLTEkCi0JCS8vIHB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJLy8gdmVydGljYWxBbGlnblRvQXZlcmFnZVNlbGVjdGVkKCk7Ci0JCS8vIH0KLQkJLy8KLQkJLy8gcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJLy8gcmV0dXJuIEFMSUdOX1ZFUlRfQVZFUkFHRTsKLQkJLy8gfQotCQkvLyB9OwotCQkvLyBnZXRBY3Rpb25SZWdpc3RyeSgpLnJlZ2lzdGVyQWN0aW9uKHZBbGlnbkF2ZXJhZ2VBY3Rpb24pOwotCQkvLwotCQkvLyAvLyBhbGlnbiB2ZXJ0aWNhbGx5IHRvIHgtdmFsdWUgb2YgZmlyc3Qgc2VsZWN0ZWQgbm9kZQotCQkvLyBJQWN0aW9uIHZBbGlnbkZpcnN0U2VsZWN0ZWRBY3Rpb24gPSBuZXcgQWN0aW9uKAotCQkvLyBEaWFncmFtVUlSZXNvdXJjZXMKLQkJLy8gLmdldFN0cmluZygiRGlhZ3JhbVVJLkFic3RyYWN0RGlhZ3JhbUVkaXRvci52QWxpZ25GaXJzdFNlbGVjdGVkQWN0aW9uLnRleHQiKSkKLQkJLy8geyAvLyROT04tTkxTLTEkCi0JCS8vIHB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJLy8gdmVydGljYWxBbGlnblRvRmlyc3RTZWxlY3RlZCgpOwotCQkvLyB9Ci0JCS8vCi0JCS8vIHB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCS8vIHJldHVybiBBTElHTl9WRVJUX0ZJUlNUX1NFTEVDVEVEOwotCQkvLyB9Ci0JCS8vIH07Ci0JCS8vIGdldEFjdGlvblJlZ2lzdHJ5KCkucmVnaXN0ZXJBY3Rpb24odkFsaWduRmlyc3RTZWxlY3RlZEFjdGlvbik7Ci0KLQkJYWN0aW9uID0gY3JlYXRlQW5BY3Rpb24oCi0JCQkJRGlhZ3JhbVVJUmVzb3VyY2VzLkFic3RyYWN0RGlhZ3JhbV9GcmVlVGV4dF90ZXh0LCBmcmVlVHh0Tm9kZUNyZWF0aW9uRmFjdG9yeSwgCi0JCQkJQ1JFQVRFX0ZSRUVfVEVYVCwKLQkJCQlEaWFncmFtVUlSZXNvdXJjZXMuQWJzdHJhY3REaWFncmFtX0ZyZWVUZXh0X3Rvb2x0aXAsIAotCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoCi0JCQkJCQkiZnJlZXRleHRfcGFsMTYuZ2lmIikpOyAvLyROT04tTkxTLTEkCi0JCWdldEFjdGlvblJlZ2lzdHJ5KCkucmVnaXN0ZXJBY3Rpb24oYWN0aW9uKTsKLQotCQlhY3Rpb24gPSBuZXcgQWN0aW9uKERpYWdyYW1VSVJlc291cmNlcy5tb3ZlQWN0aW9uX2xhYmVsKSB7IAotCi0JCQlwdWJsaWMgdm9pZCBzZXRJbWFnZURlc2NyaXB0b3IoSW1hZ2VEZXNjcmlwdG9yIG5ld0ltYWdlKSB7Ci0JCQkJc3VwZXIuc2V0SW1hZ2VEZXNjcmlwdG9yKG5ld0ltYWdlKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgcnVuV2l0aEV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQkJc3VwZXIucnVuV2l0aEV2ZW50KGV2ZW50KTsKLQotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJc3VwZXIucnVuKCk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBib29sZWFuIGlzRW5hYmxlZCgpIHsKLQkJCQlMaXN0IGVkaXRQYXJ0cyA9IGdldEdyYXBoaWNhbFZpZXdlcigpLmdldFNlbGVjdGVkRWRpdFBhcnRzKCk7Ci0JCQkJaWYgKGVkaXRQYXJ0cy5zaXplKCkgPiAwKQotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCQkJcmV0dXJuIE1PVkU7Ci0JCQl9Ci0KLQkJfTsKLQkJZ2V0QWN0aW9uUmVnaXN0cnkoKS5yZWdpc3RlckFjdGlvbihhY3Rpb24pOwotCi0JCUlBY3Rpb24gbGlua0FjdGlvbiA9IG5ldyBBY3Rpb24oRGlhZ3JhbVVJUmVzb3VyY2VzLkFic3RyYWN0RGlhZ3JhbV9MaW5rX3RleHQpIHsgCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJTGlzdCBlZGl0UGFydHMgPSBnZXRHcmFwaGljYWxWaWV3ZXIoKS5nZXRTZWxlY3RlZEVkaXRQYXJ0cygpOwotCQkJCWlmIChlZGl0UGFydHMuc2l6ZSgpID09IDIpIHsKLQkJCQkJRWRpdFBhcnQgc291cmNlRWRpdFBhcnQgPSAoRWRpdFBhcnQpIGVkaXRQYXJ0cy5nZXQoMCk7Ci0JCQkJCUVkaXRQYXJ0IHRhcmdldEVkaXRQYXJ0ID0gKEVkaXRQYXJ0KSBlZGl0UGFydHMuZ2V0KDEpOwotCQkJCQlMaXN0IHRhcmdldExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCWlmIChzb3VyY2VFZGl0UGFydCBpbnN0YW5jZW9mIEZyZWVUZXh0Tm9kZUVkaXRQYXJ0Ci0JCQkJCQkJfHwgdGFyZ2V0RWRpdFBhcnQgaW5zdGFuY2VvZiBGcmVlVGV4dE5vZGVFZGl0UGFydCkKLQkJCQkJCXJldHVybjsKLQkJCQkJaWYgKHNvdXJjZUVkaXRQYXJ0IGluc3RhbmNlb2YgTm9kZUVkaXRQYXJ0KSB7Ci0JCQkJCQl0YXJnZXRMaXN0ID0gKChOb2RlRWRpdFBhcnQpIHNvdXJjZUVkaXRQYXJ0KQotCQkJCQkJCQkuZ2V0U291cmNlQ29ubmVjdGlvbnMoKTsKLQkJCQkJCWlmICghdGFyZ2V0TGlzdC5pc0VtcHR5KCkpIHsKLQkJCQkJCQlmb3IgKEl0ZXJhdG9yIGl0b3IgPSB0YXJnZXRMaXN0Lml0ZXJhdG9yKCk7IGl0b3IKLQkJCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJCUxpbmtFZGl0UGFydCBvYmogPSAoTGlua0VkaXRQYXJ0KSBpdG9yLm5leHQoKTsKLQkJCQkJCQkJaWYgKHRhcmdldEVkaXRQYXJ0LmVxdWFscyhvYmouZ2V0U291cmNlKCkpKQotCQkJCQkJCQkJcmV0dXJuOwotCQkJCQkJCQlpZiAodGFyZ2V0RWRpdFBhcnQuZXF1YWxzKG9iai5nZXRUYXJnZXQoKSkpCi0JCQkJCQkJCQlyZXR1cm47Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJdGFyZ2V0TGlzdCA9ICgoTm9kZUVkaXRQYXJ0KSBzb3VyY2VFZGl0UGFydCkKLQkJCQkJCQkJLmdldFRhcmdldENvbm5lY3Rpb25zKCk7Ci0JCQkJCQlpZiAoIXRhcmdldExpc3QuaXNFbXB0eSgpKSB7Ci0JCQkJCQkJZm9yIChJdGVyYXRvciBpdG9yID0gdGFyZ2V0TGlzdC5pdGVyYXRvcigpOyBpdG9yCi0JCQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJCQlMaW5rRWRpdFBhcnQgb2JqID0gKExpbmtFZGl0UGFydCkgaXRvci5uZXh0KCk7Ci0JCQkJCQkJCWlmICh0YXJnZXRFZGl0UGFydC5lcXVhbHMob2JqLmdldFNvdXJjZSgpKSkKLQkJCQkJCQkJCXJldHVybjsKLQkJCQkJCQkJaWYgKHRhcmdldEVkaXRQYXJ0LmVxdWFscyhvYmouZ2V0VGFyZ2V0KCkpKQotCQkJCQkJCQkJcmV0dXJuOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlMaW5rIGxpbmsgPSBNb2RlbEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUxpbmsoKTsKLQkJCQkJaWYgKHNvdXJjZUVkaXRQYXJ0LmdldE1vZGVsKCkgaW5zdGFuY2VvZiBOb2RlKQotCQkJCQkJbGluay5zZXRTb3VyY2UoKE5vZGUpIHNvdXJjZUVkaXRQYXJ0LmdldE1vZGVsKCkpOwotCQkJCQlpZiAodGFyZ2V0RWRpdFBhcnQuZ2V0TW9kZWwoKSBpbnN0YW5jZW9mIE5vZGUpCi0JCQkJCQlsaW5rLnNldFRhcmdldCgoTm9kZSkgdGFyZ2V0RWRpdFBhcnQuZ2V0TW9kZWwoKSk7Ci0JCQkJCW9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kIGMgPSBuZXcgQ3JlYXRlTGlua0NvbW1hbmQoCi0JCQkJCQkJbGluaywgKE5vZGUpIHNvdXJjZUVkaXRQYXJ0LmdldE1vZGVsKCkpOwotCQkJCQlnZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKGMpOwotCQkJCX0KLQkJCX0KLQotCQkJcHVibGljIGJvb2xlYW4gaXNFbmFibGVkKCkgewotCQkJCUxpc3QgZWRpdFBhcnRzID0gZ2V0R3JhcGhpY2FsVmlld2VyKCkuZ2V0U2VsZWN0ZWRFZGl0UGFydHMoKTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0b3IgPSBlZGl0UGFydHMuaXRlcmF0b3IoKTsgaXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJCU9iamVjdCBwYXJ0ID0gaXRvci5uZXh0KCk7Ci0JCQkJCWlmIChwYXJ0IGluc3RhbmNlb2YgRnJlZVRleHROb2RlRWRpdFBhcnQpCi0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJCWlmIChlZGl0UGFydHMuc2l6ZSgpID09IDIpCi0JCQkJCXJldHVybiB0cnVlOwotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQotCQkJcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJCQlyZXR1cm4gQ1JFQVRFX0xJTks7Ci0JCQl9Ci0JCX07Ci0JCWdldEFjdGlvblJlZ2lzdHJ5KCkucmVnaXN0ZXJBY3Rpb24obGlua0FjdGlvbik7Ci0KLQkJSUFjdGlvbiBzZWxlY3RMaW5rQWN0aW9uID0gbmV3IEFjdGlvbihEaWFncmFtVUlSZXNvdXJjZXMuQWJzdHJhY3REaWFncmFtX0xpbmtfc2VsZWN0KSB7IAotCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJTGlzdCBlZGl0UGFydHMgPSBnZXRHcmFwaGljYWxWaWV3ZXIoKS5nZXRTZWxlY3RlZEVkaXRQYXJ0cygpOwotCQkJCWlmIChlZGl0UGFydHMuc2l6ZSgpID09IDEpIHsKLQkJCQkJRWRpdFBhcnQgcGFydCA9IChFZGl0UGFydCkgZWRpdFBhcnRzLmdldCgwKTsKLQkJCQkJaWYgKHBhcnQgaW5zdGFuY2VvZiBOb2RlRWRpdFBhcnQpIHsKLQkJCQkJCUxpc3QgbGlzdCA9ICgoTm9kZUVkaXRQYXJ0KSBwYXJ0KQotCQkJCQkJCQkuZ2V0U291cmNlQ29ubmVjdGlvbnMoKTsKLQkJCQkJCWlmIChsaXN0ICE9IG51bGwgJiYgIWxpc3QuaXNFbXB0eSgpKSB7Ci0JCQkJCQkJTGlua0VkaXRQYXJ0IGxpbmtwYXJ0ID0gKExpbmtFZGl0UGFydCkgbGlzdC5nZXQoMCk7Ci0JCQkJCQkJbGlua3BhcnQuc2V0U2VsZWN0ZWQoMSk7Ci0JCQkJCQkJZ2V0R3JhcGhpY2FsVmlld2VyKCkuc2VsZWN0KGxpbmtwYXJ0KTsKLQkJCQkJCQkvLyBwYXJ0LnNldFNlbGVjdGVkKDApOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQlwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWQoKSB7Ci0JCQkJTGlzdCBlZGl0UGFydHMgPSBnZXRHcmFwaGljYWxWaWV3ZXIoKS5nZXRTZWxlY3RlZEVkaXRQYXJ0cygpOwotCQkJCWlmIChlZGl0UGFydHMuc2l6ZSgpID09IDEpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQotCQkJcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJCQlyZXR1cm4gU0VMRUNUX0xJTks7Ci0JCQl9Ci0KLQkJfTsKLQkJZ2V0QWN0aW9uUmVnaXN0cnkoKS5yZWdpc3RlckFjdGlvbihzZWxlY3RMaW5rQWN0aW9uKTsKLQotCQlJQWN0aW9uIGNyZWF0ZUJlbmRQb2ludEFjdGlvbiA9IG5ldyBBY3Rpb24oRGlhZ3JhbVVJUmVzb3VyY2VzLkFic3RyYWN0RGlhZ3JhbV9CZW5kUG9pbnRfY3JlYXRlKSB7IAotCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJTGlzdCBlZGl0UGFydHMgPSBnZXRHcmFwaGljYWxWaWV3ZXIoKS5nZXRTZWxlY3RlZEVkaXRQYXJ0cygpOwotCQkJCWlmIChlZGl0UGFydHMuc2l6ZSgpID09IDEpIHsKLQkJCQkJRWRpdFBhcnQgcGFydCA9IChFZGl0UGFydCkgZWRpdFBhcnRzLmdldCgwKTsKLQkJCQkJaWYgKHBhcnQgaW5zdGFuY2VvZiBMaW5rRWRpdFBhcnQpIHsKLQkJCQkJCS8vIHJldHVybiB0cnVlOwotCQkJCQkJTGluayBsaW5rID0gKExpbmspICgoTGlua0VkaXRQYXJ0KSBwYXJ0KS5nZXRNb2RlbCgpOwotCQkJCQkJTGlzdCBiZW5kcG9pbnRzID0gbGluay5nZXRCZW5kcG9pbnRzKCk7Ci0JCQkJCQlpZiAoYmVuZHBvaW50cyA9PSBudWxsIHx8IGJlbmRwb2ludHMuc2l6ZSgpIDwgMSkgewotCQkJCQkJCVBvaW50IHNwID0gbGluay5nZXRTb3VyY2VFbmRQb2ludCgpOwotCQkJCQkJCVBvaW50IHRwID0gbGluay5nZXRUYXJnZXRFbmRQb2ludCgpOwotCQkJCQkJCWlmIChzcCA9PSBudWxsKSB7Ci0JCQkJCQkJCWlmIChsaW5rLmdldFNvdXJjZSgpID09IG51bGwpIHsKLQkJCQkJCQkJCXNwID0gKChOb2RlKSBsaW5rLmVDb250YWluZXIoKSkKLQkJCQkJCQkJCQkJLmdldExvY2F0aW9uKCk7Ci0JCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCQlzcCA9IGxpbmsuZ2V0U291cmNlKCkuZ2V0TG9jYXRpb24oKTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCQlpZiAodHAgPT0gbnVsbCkgewotCQkJCQkJCQl0cCA9IGxpbmsuZ2V0VGFyZ2V0KCkuZ2V0TG9jYXRpb24oKTsKLQkJCQkJCQl9Ci0JCQkJCQkJUG9pbnQgYlBvaW50ID0gbmV3IFBvaW50KCk7Ci0JCQkJCQkJYlBvaW50LnggPSAoc3AueCArIHRwLngpIC8gMjsKLQkJCQkJCQliUG9pbnQueSA9IChzcC55ICsgdHAueSkgLyAyOwotCQkJCQkJCW9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kIGMgPSBuZXcgQ3JlYXRlQmVuZHBvaW50Q29tbWFuZCgKLQkJCQkJCQkJCWxpbmssIGJQb2ludCwgMCk7Ci0JCQkJCQkJZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShjKTsKLQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQlwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWQoKSB7Ci0JCQkJTGlzdCBlZGl0UGFydHMgPSBnZXRHcmFwaGljYWxWaWV3ZXIoKS5nZXRTZWxlY3RlZEVkaXRQYXJ0cygpOwotCQkJCWlmIChlZGl0UGFydHMuc2l6ZSgpID09IDEpIHsKLQkJCQkJRWRpdFBhcnQgcGFydCA9IChFZGl0UGFydCkgZWRpdFBhcnRzLmdldCgwKTsKLQkJCQkJaWYgKHBhcnQgaW5zdGFuY2VvZiBMaW5rRWRpdFBhcnQpIHsKLQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQl9Ci0JCQkJfQotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQotCQkJcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJCQlyZXR1cm4gQ1JFQVRFX0JFTkRfUE9JTlQ7Ci0JCQl9Ci0JCX07Ci0JCWdldEFjdGlvblJlZ2lzdHJ5KCkucmVnaXN0ZXJBY3Rpb24oY3JlYXRlQmVuZFBvaW50QWN0aW9uKTsKLQotCQlJQWN0aW9uIHJlZnJlc2hBY3Rpb24gPSBuZXcgQWN0aW9uKERpYWdyYW1VSVJlc291cmNlcy5yZWZyZXNoQWN0aW9uX2xhYmVsKSB7IAotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCURpYWdyYW0gZGlhZ3JhbSA9IChEaWFncmFtKSBlZGl0UGFydC5nZXRNb2RlbCgpOwotCQkJCWlmIChlZGl0UGFydC5pc0FjdGl2ZSgpKSB7Ci0JCQkJCWVkaXRQYXJ0LmRlYWN0aXZhdGUoKTsKLQkJCQl9Ci0JCQkJZGlhZ3JhbS5yZW1vdmVDb25zdW1lcihBYnN0cmFjdERpYWdyYW1FZGl0b3IudGhpcyk7Ci0JCQkJY3JlYXRlRWRpdFBhcnQoKTsKLQkJCQlnZXRHcmFwaGljYWxWaWV3ZXIoKS5zZXRDb250ZW50cyhlZGl0UGFydCk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCQkJcmV0dXJuIFJFRlJFU0g7Ci0JCQl9Ci0JCX07Ci0JCWdldEFjdGlvblJlZ2lzdHJ5KCkucmVnaXN0ZXJBY3Rpb24ocmVmcmVzaEFjdGlvbik7Ci0JCUlBY3Rpb24gZGVsZXRlRGlhZ3JhbUFjdGlvbiA9IG5ldyBBY3Rpb24oRGlhZ3JhbVVJUmVzb3VyY2VzLkRlbGV0ZURpYWdyYW1fdGV4dCkgeyAKLQotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCWlmIChBdXRob3JpbmdVSVBsdWdpbgotCQkJCQkJLmdldERlZmF1bHQoKQotCQkJCQkJLmdldE1zZ0RpYWxvZygpCi0JCQkJCQkuZGlzcGxheVByb21wdCgKLQkJCQkJCQkJRGlhZ3JhbVVJUmVzb3VyY2VzLkRlbGV0ZURpYWdyYW1fdGV4dCwgCi0JCQkJCQkJCURpYWdyYW1VSVJlc291cmNlcy5EZWxldGVEaWFncmFtX3Byb21wdCkpIHsgCi0JCQkJCURpYWdyYW0gZGlhZ3JhbSA9IChEaWFncmFtKSAoKEVkaXRQYXJ0KSBnZXRHcmFwaGljYWxWaWV3ZXIoKQotCQkJCQkJCS5nZXRDb250ZW50cygpKS5nZXRNb2RlbCgpOwotCQkJCQlFY29yZVV0aWwucmVtb3ZlKGRpYWdyYW0uZ2V0VU1BRGlhZ3JhbSgpKTsKLQkJCQkJZG9TYXZlKG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQkJCQlnZXRTaXRlKCkuZ2V0UGFnZSgpLmNsb3NlRWRpdG9yKAotCQkJCQkJCWdldFNpdGUoKS5nZXRQYWdlKCkuZ2V0QWN0aXZlRWRpdG9yKCksIGZhbHNlKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCXB1YmxpYyBib29sZWFuIGlzRW5hYmxlZCgpIHsKLQkJCQlyZXR1cm4gZ2V0R3JhcGhpY2FsVmlld2VyKCkuZ2V0U2VsZWN0ZWRFZGl0UGFydHMoKS5zaXplKCkgPT0gMDsKLQkJCX0KLQotCQkJcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJCQlyZXR1cm4gREVMRVRFX0RJQUdSQU07Ci0JCQl9Ci0KLQkJfTsKLQkJZ2V0QWN0aW9uUmVnaXN0cnkoKS5yZWdpc3RlckFjdGlvbihkZWxldGVEaWFncmFtQWN0aW9uKTsKLQkJSUFjdGlvbiBhbGlnbkJlbmRQb2ludEFjdGlvbiA9IG5ldyBBY3Rpb24oRGlhZ3JhbVVJUmVzb3VyY2VzLmFsaWduX2JlbmRfcG9pbnRfdGV4dCkgeyAKLQotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCUVkaXRQYXJ0IHBhcnQgPSAoRWRpdFBhcnQpIGdldEdyYXBoaWNhbFZpZXdlcigpCi0JCQkJCQkuZ2V0U2VsZWN0ZWRFZGl0UGFydHMoKS5nZXQoMCk7Ci0JCQkJaWYgKHBhcnQgaW5zdGFuY2VvZiBMaW5rRWRpdFBhcnQpIHsKLQkJCQkJTGlua0VkaXRQYXJ0IGxpbmtwYXJ0ID0gKChMaW5rRWRpdFBhcnQpIHBhcnQpOwotCQkJCQlMaW5rIGxpbmsgPSAoTGluaykgbGlua3BhcnQuZ2V0TW9kZWwoKTsKLQkJCQkJaWYgKGxpbmsuZ2V0QmVuZHBvaW50cygpLnNpemUoKSA+IDApIHsKLQotCQkJCQkJR3JhcGhpY2FsRWRpdFBhcnQgc3BhcnQgPSAoKEdyYXBoaWNhbEVkaXRQYXJ0KSBsaW5rcGFydAotCQkJCQkJCQkuZ2V0U291cmNlKCkpOwotCQkJCQkJR3JhcGhpY2FsRWRpdFBhcnQgdHBhcnQgPSAoKEdyYXBoaWNhbEVkaXRQYXJ0KSBsaW5rcGFydAotCQkJCQkJCQkuZ2V0VGFyZ2V0KCkpOwotCi0JCQkJCQlQb2ludCBzcCA9IHNwYXJ0LmdldEZpZ3VyZSgpLmdldEJvdW5kcygpLmdldENlbnRlcigpOwotCQkJCQkJUG9pbnQgdHAgPSB0cGFydC5nZXRGaWd1cmUoKS5nZXRCb3VuZHMoKS5nZXRDZW50ZXIoKTsKLQotCQkJCQkJaWYgKHNwYXJ0IGluc3RhbmNlb2YgRGVjaXNpb25Ob2RlRWRpdFBhcnQKLQkJCQkJCQkJfHwgc3BhcnQgaW5zdGFuY2VvZiBTeW5jaEJhck5vZGVFZGl0UGFydCkgewotCQkJCQkJCXNwID0gKChUeXBlZE5vZGUpIHNwYXJ0LmdldE1vZGVsKCkpLmdldExvY2F0aW9uKCk7Ci0JCQkJCQkJTGlzdCBsaXN0ID0gKChOb2RlRWRpdFBhcnQpIHNwYXJ0KQotCQkJCQkJCQkJLmdldFNvdXJjZUNvbm5lY3Rpb25zKCk7Ci0JCQkJCQkJZm9yIChJdGVyYXRvciBpdG9yID0gbGlzdC5pdGVyYXRvcigpOyBpdG9yCi0JCQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJCQlMaW5rRWRpdFBhcnQgbHAgPSAoTGlua0VkaXRQYXJ0KSBpdG9yLm5leHQoKTsKLQkJCQkJCQkJaWYgKGxwLmdldFRhcmdldCgpLmVxdWFscyh0cGFydCkpIHsKLQkJCQkJCQkJCVBvaW50IHNvdXJjZUVuZFBvaW50ID0gKChMaW5rKSBscAotCQkJCQkJCQkJCQkuZ2V0TW9kZWwoKSkuZ2V0U291cmNlRW5kUG9pbnQoKTsKLQkJCQkJCQkJCXNwID0gc3AuZ2V0VHJhbnNsYXRlZChzb3VyY2VFbmRQb2ludCk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0KLQkJCQkJCWlmICh0cGFydCBpbnN0YW5jZW9mIERlY2lzaW9uTm9kZUVkaXRQYXJ0Ci0JCQkJCQkJCXx8IHRwYXJ0IGluc3RhbmNlb2YgU3luY2hCYXJOb2RlRWRpdFBhcnQpIHsKLQkJCQkJCQl0cCA9ICgoVHlwZWROb2RlKSB0cGFydC5nZXRNb2RlbCgpKS5nZXRMb2NhdGlvbigpOwotCQkJCQkJCUxpc3QgbGlzdCA9ICgoTm9kZUVkaXRQYXJ0KSB0cGFydCkKLQkJCQkJCQkJCS5nZXRUYXJnZXRDb25uZWN0aW9ucygpOwotCQkJCQkJCWZvciAoSXRlcmF0b3IgaXRvciA9IGxpc3QuaXRlcmF0b3IoKTsgaXRvcgotCQkJCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCQkJTGlua0VkaXRQYXJ0IGxwID0gKExpbmtFZGl0UGFydCkgaXRvci5uZXh0KCk7Ci0JCQkJCQkJCWlmIChscC5nZXRTb3VyY2UoKS5lcXVhbHMoc3BhcnQpKSB7Ci0JCQkJCQkJCQlQb2ludCB0YXJnZXRFbmRQb2ludCA9ICgoTGluaykgbHAKLQkJCQkJCQkJCQkJLmdldE1vZGVsKCkpLmdldFRhcmdldEVuZFBvaW50KCk7Ci0JCQkJCQkJCQl0cCA9IHRwLmdldFRyYW5zbGF0ZWQodGFyZ2V0RW5kUG9pbnQpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaW5rLmdldEJlbmRwb2ludHMoKS5zaXplKCk7IGkrKykgewotCQkJCQkJCUFic29sdXRlQmVuZHBvaW50IG9sZGJwID0gKEFic29sdXRlQmVuZHBvaW50KSBsaW5rCi0JCQkJCQkJCQkuZ2V0QmVuZHBvaW50cygpLmdldChpKTsKLQkJCQkJCQlBYnNvbHV0ZUJlbmRwb2ludCBicCA9IG5ldyBBYnNvbHV0ZUJlbmRwb2ludCgKLQkJCQkJCQkJCW5ldyBQb2ludCgtMSwgLTEpKTsKLQkJCQkJCQlBYnNvbHV0ZUJlbmRwb2ludCBwcmV2aW91c2JwID0gbnVsbDsKLQkJCQkJCQlpbnQgZGVsdGEgPSA0MDsKLQkJCQkJCQlpbnQgcG9zaXRpb24gPSAwOwotCi0JCQkJCQkJaWYgKGkgPT0gMCkgewotCQkJCQkJCQlwb3NpdGlvbiA9IHNwLmdldFBvc2l0aW9uKG9sZGJwKTsKLQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQlwcmV2aW91c2JwID0gKEFic29sdXRlQmVuZHBvaW50KSBsaW5rCi0JCQkJCQkJCQkJLmdldEJlbmRwb2ludHMoKS5nZXQoaSAtIDEpOwotCQkJCQkJCQlwb3NpdGlvbiA9IHByZXZpb3VzYnAuZ2V0UG9zaXRpb24ob2xkYnApOwotCQkJCQkJCX0KLQotCQkJCQkJCWlmIChwb3NpdGlvbiA9PSBQb3NpdGlvbkNvbnN0YW50cy5TT1VUSAotCQkJCQkJCQkJfHwgcG9zaXRpb24gPT0gUG9zaXRpb25Db25zdGFudHMuTk9SVEgpIHsKLQkJCQkJCQkJaWYgKGkgPT0gMCkgewotCQkJCQkJCQkJaWYgKHNwLnggLSBkZWx0YSA8IG9sZGJwLngKLQkJCQkJCQkJCQkJJiYgc3AueCArIGRlbHRhID4gb2xkYnAueAotCQkJCQkJCQkJCQkmJiAhKHNwLnggPT0gb2xkYnAueCkpIHsKLQkJCQkJCQkJCQlicC54ID0gc3AueDsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJCWlmIChwcmV2aW91c2JwLnggLSBkZWx0YSA8IG9sZGJwLngKLQkJCQkJCQkJCQkJJiYgcHJldmlvdXNicC54ICsgZGVsdGEgPiBvbGRicC54Ci0JCQkJCQkJCQkJCSYmICEocHJldmlvdXNicC54ID09IG9sZGJwLngpKSB7Ci0JCQkJCQkJCQkJYnAueCA9IHByZXZpb3VzYnAueDsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCQkJCQkJCQlpZiAobGluay5nZXRCZW5kcG9pbnRzKCkuc2l6ZSgpIC0gMSA9PSBpKSB7Ci0JCQkJCQkJCQlpZiAodHAueSAtIGRlbHRhIDwgb2xkYnAueQotCQkJCQkJCQkJCQkmJiB0cC55ICsgZGVsdGEgPiBvbGRicC55Ci0JCQkJCQkJCQkJCSYmICEodHAueSA9PSBvbGRicC55KSkgewotCQkJCQkJCQkJCWJwLnkgPSB0cC55OwotCQkJCQkJCQkJfQotCQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQkJYnAueSA9IG9sZGJwLnk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQkJaWYgKHBvc2l0aW9uID09IFBvc2l0aW9uQ29uc3RhbnRzLkVBU1QKLQkJCQkJCQkJCXx8IHBvc2l0aW9uID09IFBvc2l0aW9uQ29uc3RhbnRzLldFU1QpIHsKLQotCQkJCQkJCQlpZiAoaSA9PSAwKSB7Ci0JCQkJCQkJCQlpZiAoc3AueSAtIGRlbHRhIDwgb2xkYnAueQotCQkJCQkJCQkJCQkmJiBzcC55ICsgZGVsdGEgPiBvbGRicC55Ci0JCQkJCQkJCQkJCSYmICEoc3AueSA9PSBvbGRicC55KSkgewotCQkJCQkJCQkJCWJwLnkgPSBzcC55OwotCQkJCQkJCQkJfQotCQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQkJaWYgKHByZXZpb3VzYnAueSAtIGRlbHRhIDwgb2xkYnAueQotCQkJCQkJCQkJCQkmJiBwcmV2aW91c2JwLnkgKyBkZWx0YSA+IG9sZGJwLnkKLQkJCQkJCQkJCQkJJiYgIShwcmV2aW91c2JwLnkgPT0gb2xkYnAueSkpIHsKLQkJCQkJCQkJCQlicC55ID0gcHJldmlvdXNicC55OwotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJCWlmIChsaW5rLmdldEJlbmRwb2ludHMoKS5zaXplKCkgLSAxID09IGkpIHsKLQkJCQkJCQkJCWlmICh0cC54IC0gZGVsdGEgPCBvbGRicC54Ci0JCQkJCQkJCQkJCSYmIHRwLnggKyBkZWx0YSA+IG9sZGJwLngKLQkJCQkJCQkJCQkJJiYgISh0cC54ID09IG9sZGJwLngpKSB7Ci0JCQkJCQkJCQkJYnAueCA9IHRwLng7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCQlicC54ID0gb2xkYnAueDsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCQlpZiAoYnAueCA9PSAtMSAmJiBicC55ICE9IC0xKSB7Ci0JCQkJCQkJCW9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kIGMgPSBuZXcgTW92ZUJlbmRwb2ludENvbW1hbmQoCi0JCQkJCQkJCQkJbGluaywgbmV3IFBvaW50KG9sZGJwLngsIGJwLnkpLCBpKTsKLQkJCQkJCQkJLy8gKChSb290RWRpdFBhcnQpZ2V0Um9vdCgpKS5nZXRWaWV3ZXIoKS5nZXRFZGl0RG9tYWluKCkuZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShjKTsKLQkJCQkJCQkJZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShjKTsKLQkJCQkJCQl9Ci0JCQkJCQkJaWYgKGJwLnggIT0gLTEgJiYgYnAueSA9PSAtMSkgewotCQkJCQkJCQlvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZCBjID0gbmV3IE1vdmVCZW5kcG9pbnRDb21tYW5kKAotCQkJCQkJCQkJCWxpbmssIG5ldyBQb2ludChicC54LCBvbGRicC55KSwgaSk7Ci0JCQkJCQkJCWdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUoYyk7Ci0JCQkJCQkJfQotCQkJCQkJCWlmIChicC54ICE9IC0xICYmIGJwLnkgIT0gLTEpIHsKLQkJCQkJCQkJb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQgYyA9IG5ldyBNb3ZlQmVuZHBvaW50Q29tbWFuZCgKLQkJCQkJCQkJCQlsaW5rLCBuZXcgUG9pbnQoYnAueCwgYnAueSksIGkpOwotCQkJCQkJCQlnZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKGMpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJcHVibGljIGJvb2xlYW4gaXNFbmFibGVkKCkgewotCQkJCUxpc3QgbGlzdCA9IGdldEdyYXBoaWNhbFZpZXdlcigpLmdldFNlbGVjdGVkRWRpdFBhcnRzKCk7Ci0JCQkJaWYgKGxpc3Quc2l6ZSgpID09IDEpIHsKLQkJCQkJaWYgKGxpc3QuZ2V0KDApIGluc3RhbmNlb2YgTGlua0VkaXRQYXJ0KSB7Ci0JCQkJCQlMaW5rRWRpdFBhcnQgcGFydCA9IChMaW5rRWRpdFBhcnQpIGxpc3QuZ2V0KDApOwotCQkJCQkJTGluayBsaW5rID0gKExpbmspIHBhcnQuZ2V0TW9kZWwoKTsKLQkJCQkJCWlmIChsaW5rLmdldEJlbmRwb2ludHMoKS5zaXplKCkgPiAwKQotCQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQl9Ci0JCQkJfQotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQotCQkJcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJCQlyZXR1cm4gQUxJR05fQkVORF9QT0lOVDsKLQkJCX0KLQotCQl9OwotCQkKLQkJLy8gVmlld2VyIFByaW50IEFjdGlvbgotCQlhY3Rpb24gPSBuZXcgRGlhZ3JhbVByaW50QWN0aW9uKHRoaXMsIGdldEdyYXBoaWNhbFZpZXdlcigpKTsKLQkJcmVnaXN0cnkucmVnaXN0ZXJBY3Rpb24oYWN0aW9uKTsKLQkJZ2V0QWN0aW9uUmVnaXN0cnkoKS5yZWdpc3RlckFjdGlvbihhbGlnbkJlbmRQb2ludEFjdGlvbik7Ci0JfQotCi0JcHJvdGVjdGVkIElBY3Rpb24gY3JlYXRlQW5BY3Rpb24oU3RyaW5nIGFjdGlvbk5hbWUsCi0JCQlDcmVhdGlvbkZhY3RvcnkgY3JlYXRpb25GYWN0b3J5LCBTdHJpbmcgYWN0aW9uSWQsCi0JCQlTdHJpbmcgdG9vbHRpcFN0cmluZywgSW1hZ2VEZXNjcmlwdG9yIGltYWdlZGVzYykgewotCQlmaW5hbCBDcmVhdGlvbkZhY3RvcnkgZmFjdG9yeSA9IGNyZWF0aW9uRmFjdG9yeTsKLQkJZmluYWwgU3RyaW5nIGlkID0gYWN0aW9uSWQ7Ci0JCWZpbmFsIFN0cmluZyB0b29sdGlwID0gdG9vbHRpcFN0cmluZzsKLQkJZmluYWwgSW1hZ2VEZXNjcmlwdG9yIGltYWdlZGVzY3JpcHRvciA9IGltYWdlZGVzYzsKLQkJcmV0dXJuIG5ldyBBY3Rpb24oYWN0aW9uTmFtZSkgeyAKLQotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCUNyZWF0ZVJlcXVlc3QgcmVxdWVzdCA9IG5ldyBDcmVhdGVSZXF1ZXN0KCk7Ci0JCQkJLy8gQ3JlYXRpb25GYWN0b3J5IGZhY3RvcnkgPSBnZXRGYWN0b3J5KHRlbXBsYXRlKTsKLQkJCQlpZiAoZmFjdG9yeSA9PSBudWxsKQotCQkJCQlyZXR1cm47Ci0JCQkJcmVxdWVzdC5zZXRGYWN0b3J5KGZhY3RvcnkpOwotCQkJCXJlcXVlc3Quc2V0TG9jYXRpb24obmV3IFBvaW50KDEwLCAxMCkpOwotCi0JCQkJaWYgKHJlcXVlc3QuZ2V0TmV3T2JqZWN0KCkgaW5zdGFuY2VvZiBOb2RlKSB7Ci0JCQkJCVBvaW50IGxvYyA9IHJlcXVlc3QuZ2V0TG9jYXRpb24oKTsKLQkJCQkJRGlhZ3JhbSBwYXJlbnQgPSAoRGlhZ3JhbSkgZWRpdFBhcnQuZ2V0TW9kZWwoKTsKLQkJCQkJb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQgYyA9IG5ldyBDcmVhdGVOb2RlQ29tbWFuZCgKLQkJCQkJCQkoTm9kZSkgcmVxdWVzdC5nZXROZXdPYmplY3QoKSwgcGFyZW50LCBsb2MpOwotCQkJCQlnZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKGMpOwotCQkJCX0KLQkJCX0KLQotCQkJcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJCQlyZXR1cm4gaWQ7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBib29sZWFuIGlzRW5hYmxlZCgpIHsKLQkJCQlpZiAoVG5nVXRpbC5pc0xvY2tlZChnZXRNZXRob2RFbGVtZW50RnJvbUlucHV0KCkpKSB7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9IGVsc2UKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBTdHJpbmcgZ2V0VG9vbFRpcFRleHQoKSB7Ci0JCQkJcmV0dXJuIHRvb2x0aXA7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHNldEltYWdlRGVzY3JpcHRvcigKLQkJCQkJb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yIG5ld0ltYWdlKSB7Ci0JCQkJc3VwZXIuc2V0SW1hZ2VEZXNjcmlwdG9yKGltYWdlZGVzY3JpcHRvcik7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBJbWFnZURlc2NyaXB0b3IgZ2V0SW1hZ2VEZXNjcmlwdG9yKCkgewotCQkJCXJldHVybiBpbWFnZWRlc2NyaXB0b3I7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJvdGVjdGVkIFBhbGV0dGVWaWV3ZXJQcm92aWRlciBjcmVhdGVQYWxldHRlVmlld2VyUHJvdmlkZXIoKSB7Ci0JCXJldHVybiBuZXcgUGFsZXR0ZVZpZXdlclByb3ZpZGVyKGdldEVkaXREb21haW4oKSkgewotCQkJcHJpdmF0ZSBJTWVudUxpc3RlbmVyIG1lbnVMaXN0ZW5lcjsKLQotCQkJcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlUGFsZXR0ZVZpZXdlcihQYWxldHRlVmlld2VyIHZpZXdlcikgewotCQkJCXN1cGVyLmNvbmZpZ3VyZVBhbGV0dGVWaWV3ZXIodmlld2VyKTsKLQkJCQkvLyBUT0RPIHZpZXdlci5zZXRDdXN0b21pemVyKG5ldyBMb2dpY1BhbGV0dGVDdXN0b21pemVyKCkpOwotCQkJCXZpZXdlcgotCQkJCQkJLmFkZERyYWdTb3VyY2VMaXN0ZW5lcihuZXcgVGVtcGxhdGVUcmFuc2ZlckRyYWdTb3VyY2VMaXN0ZW5lcigKLQkJCQkJCQkJdmlld2VyKSk7Ci0JCQl9Ci0KLQkJCXByb3RlY3RlZCB2b2lkIGhvb2tQYWxldHRlVmlld2VyKFBhbGV0dGVWaWV3ZXIgdmlld2VyKSB7Ci0JCQkJc3VwZXIuaG9va1BhbGV0dGVWaWV3ZXIodmlld2VyKTsKLQkJCQlmaW5hbCBDb3B5VGVtcGxhdGVBY3Rpb24gY29weSA9IChDb3B5VGVtcGxhdGVBY3Rpb24pIGdldEFjdGlvblJlZ2lzdHJ5KCkKLQkJCQkJCS5nZXRBY3Rpb24oQWN0aW9uRmFjdG9yeS5DT1BZLmdldElkKCkpOwotCQkJCXZpZXdlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoY29weSk7Ci0JCQkJaWYgKG1lbnVMaXN0ZW5lciA9PSBudWxsKQotCQkJCQltZW51TGlzdGVuZXIgPSBuZXcgSU1lbnVMaXN0ZW5lcigpIHsKLQkJCQkJCXB1YmxpYyB2b2lkIG1lbnVBYm91dFRvU2hvdyhJTWVudU1hbmFnZXIgbWFuYWdlcikgewotCQkJCQkJCW1hbmFnZXIuYXBwZW5kVG9Hcm91cCgKLQkJCQkJCQkJCUdFRkFjdGlvbkNvbnN0YW50cy5HUk9VUF9DT1BZLCBjb3B5KTsKLQkJCQkJCX0KLQkJCQkJfTsKLQkJCQl2aWV3ZXIuZ2V0Q29udGV4dE1lbnUoKS5hZGRNZW51TGlzdGVuZXIobWVudUxpc3RlbmVyKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmdlZi51aS5wYXJ0cy5HcmFwaGljYWxFZGl0b3JXaXRoRmx5b3V0UGFsZXR0ZSNnZXRQYWxldHRlUHJlZmVyZW5jZXMoKQotCSAqLwotCXByb3RlY3RlZCBGbHlvdXRQcmVmZXJlbmNlcyBnZXRQYWxldHRlUHJlZmVyZW5jZXMoKSB7Ci0JCXJldHVybiBuZXcgRmx5b3V0UHJlZmVyZW5jZXMoKSB7Ci0JCQlwdWJsaWMgaW50IGdldERvY2tMb2NhdGlvbigpIHsKLQkJCQlyZXR1cm4gQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpCi0JCQkJCQkuZ2V0SW50KFBBTEVUVEVfRE9DS19MT0NBVElPTik7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBpbnQgZ2V0UGFsZXR0ZVN0YXRlKCkgewotCQkJCXJldHVybiBBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkKLQkJCQkJCS5nZXRJbnQoUEFMRVRURV9TVEFURSk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBpbnQgZ2V0UGFsZXR0ZVdpZHRoKCkgewotCQkJCXJldHVybiBBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkKLQkJCQkJCS5nZXRJbnQoUEFMRVRURV9TSVpFKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgc2V0RG9ja0xvY2F0aW9uKGludCBsb2NhdGlvbikgewotCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKS5zZXRWYWx1ZSgKLQkJCQkJCVBBTEVUVEVfRE9DS19MT0NBVElPTiwgbG9jYXRpb24pOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBzZXRQYWxldHRlU3RhdGUoaW50IHN0YXRlKSB7Ci0JCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpLnNldFZhbHVlKAotCQkJCQkJUEFMRVRURV9TVEFURSwgc3RhdGUpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBzZXRQYWxldHRlV2lkdGgoaW50IHdpZHRoKSB7Ci0JCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpLnNldFZhbHVlKAotCQkJCQkJUEFMRVRURV9TSVpFLCB3aWR0aCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJvdGVjdGVkIEtleUhhbmRsZXIgZ2V0Q29tbW9uS2V5SGFuZGxlcigpIHsKLQkJaWYgKHNoYXJlZEtleUhhbmRsZXIgPT0gbnVsbCkgewotCQkJc2hhcmVkS2V5SGFuZGxlciA9IG5ldyBLZXlIYW5kbGVyKCkgewotCi0JCQkJcHVibGljIGJvb2xlYW4ga2V5UHJlc3NlZChLZXlFdmVudCBldmVudCkgewotCQkJCQlpZiAoKGV2ZW50LnN0YXRlTWFzayA9PSBTV1QuQ1RSTCkKLQkJCQkJCQkmJiAoZXZlbnQua2V5Q29kZSA9PSBTV1QuQVJST1dfUklHSFQpKSB7Ci0JCQkJCQltb3ZlKDEpOwotCQkJCQl9Ci0JCQkJCWlmICgoZXZlbnQuc3RhdGVNYXNrID09IFNXVC5DVFJMKQotCQkJCQkJCSYmIChldmVudC5rZXlDb2RlID09IFNXVC5BUlJPV19ET1dOKSkgewotCQkJCQkJbW92ZSgyKTsKLQotCQkJCQl9Ci0JCQkJCWlmICgoZXZlbnQuc3RhdGVNYXNrID09IFNXVC5DVFJMKQotCQkJCQkJCSYmIChldmVudC5rZXlDb2RlID09IFNXVC5BUlJPV19VUCkpIHsKLQkJCQkJCW1vdmUoMyk7Ci0JCQkJCX0KLQkJCQkJaWYgKChldmVudC5zdGF0ZU1hc2sgPT0gU1dULkNUUkwpCi0JCQkJCQkJJiYgKGV2ZW50LmtleUNvZGUgPT0gU1dULkFSUk9XX0xFRlQpKSB7Ci0JCQkJCQltb3ZlKDQpOwotCQkJCQl9Ci0KLQkJCQkJcmV0dXJuIHN1cGVyLmtleVByZXNzZWQoZXZlbnQpOwotCQkJCX0KLQotCQkJCXB1YmxpYyBib29sZWFuIG1vdmUoaW50IGRpcmVjdGlvbikgewotCQkJCQlMaXN0IGxpc3QgPSBnZXRHcmFwaGljYWxWaWV3ZXIoKS5nZXRTZWxlY3RlZEVkaXRQYXJ0cygpOwotCQkJCQlHcmFwaGljYWxFZGl0UGFydCBwYXJ0ID0gKEdyYXBoaWNhbEVkaXRQYXJ0KSBsaXN0LmdldCgwKTsKLQkJCQkJaWYgKHBhcnQuZ2V0TW9kZWwoKSBpbnN0YW5jZW9mIE5vZGUpIHsKLQkJCQkJCU5vZGUgbm9kZSA9IChOb2RlKSBwYXJ0LmdldE1vZGVsKCk7Ci0JCQkJCQlQb2ludCBwb2ludCA9IG5vZGUuZ2V0TG9jYXRpb24oKTsKLQkJCQkJCWludCBuZXd4ID0gcG9pbnQueDsKLQkJCQkJCWludCBuZXd5ID0gcG9pbnQueTsKLQkJCQkJCWludCBwcmVzc2xlbmd0aCA9IDE7Ci0JCQkJCQlzd2l0Y2ggKGRpcmVjdGlvbikgewotCQkJCQkJY2FzZSAxOgotCQkJCQkJCS8vIG5vZGUuc2V0TG9jYXRpb24obmV3IFBvaW50KHBvaW50LngrMTAscG9pbnQueSkpOwotCQkJCQkJCW5ld3ggPSBwb2ludC54ICsgcHJlc3NsZW5ndGg7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQljYXNlIDI6Ci0JCQkJCQkJLy8gbm9kZS5zZXRMb2NhdGlvbihuZXcgUG9pbnQocG9pbnQueCxwb2ludC55KzEwKSk7Ci0JCQkJCQkJbmV3eSArPSBwcmVzc2xlbmd0aDsKLQkJCQkJCQlicmVhazsKLQkJCQkJCWNhc2UgMzoKLQkJCQkJCQkvLyBub2RlLnNldExvY2F0aW9uKG5ldyBQb2ludChwb2ludC54LHBvaW50LnktMTApKTsKLQkJCQkJCQluZXd5IC09IHByZXNzbGVuZ3RoOwotCQkJCQkJCWJyZWFrOwotCQkJCQkJY2FzZSA0OgotCQkJCQkJCS8vIG5vZGUuc2V0TG9jYXRpb24obmV3IFBvaW50KHBvaW50LngtMTAscG9pbnQueSkpOwotCQkJCQkJCW5ld3ggLT0gcHJlc3NsZW5ndGg7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQlkZWZhdWx0OgotCQkJCQkJCWJyZWFrOwotCQkJCQkJfQotCQkJCQkJb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQgYyA9IG5ldyBDaGFuZ2VCb3VuZHNDb21tYW5kKAotCQkJCQkJCQlub2RlLCBuZXcgUG9pbnQobmV3eCwgbmV3eSksIG5vZGUuZ2V0V2lkdGgoKSk7Ci0JCQkJCQlnZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKGMpOwotCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCX0KLQkJCQkJLy8gVE9ETy0gY2hlY2sgYWRkaW5nIG1vcmUgYmVuZHBvaW50LCBjYXB0dXJlIGJlbmRwb2ludAotCQkJCQkvLyBpbmRleCBvbiBmbHkKLQkJCQkJaWYgKHBhcnQuZ2V0TW9kZWwoKSBpbnN0YW5jZW9mIExpbmspIHsKLQkJCQkJCUxpbmsgbGluayA9IChMaW5rKSBwYXJ0LmdldE1vZGVsKCk7Ci0JCQkJCQlMaXN0IGJsaXN0ID0gbGluay5nZXRCZW5kcG9pbnRzKCk7Ci0JCQkJCQlpbnQgaW5kZXggPSAwOwotCQkJCQkJaWYgKGJsaXN0ICE9IG51bGwgJiYgYmxpc3Quc2l6ZSgpID4gMCkgewotCQkJCQkJCUFic29sdXRlQmVuZHBvaW50IHBvaW50ID0gKEFic29sdXRlQmVuZHBvaW50KSBibGlzdAotCQkJCQkJCQkJLmdldChpbmRleCk7Ci0JCQkJCQkJaW50IG5ld3ggPSBwb2ludC54OwotCQkJCQkJCWludCBuZXd5ID0gcG9pbnQueTsKLQkJCQkJCQlpbnQgcHJlc3NsZW5ndGggPSA1OwotCQkJCQkJCXN3aXRjaCAoZGlyZWN0aW9uKSB7Ci0JCQkJCQkJY2FzZSAxOgotCQkJCQkJCQkvLyBub2RlLnNldExvY2F0aW9uKG5ldwotCQkJCQkJCQkvLyBQb2ludChwb2ludC54KzEwLHBvaW50LnkpKTsKLQkJCQkJCQkJbmV3eCA9IHBvaW50LnggKyBwcmVzc2xlbmd0aDsKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJY2FzZSAyOgotCQkJCQkJCQkvLyBub2RlLnNldExvY2F0aW9uKG5ldwotCQkJCQkJCQkvLyBQb2ludChwb2ludC54LHBvaW50LnkrMTApKTsKLQkJCQkJCQkJbmV3eSArPSBwcmVzc2xlbmd0aDsKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJY2FzZSAzOgotCQkJCQkJCQkvLyBub2RlLnNldExvY2F0aW9uKG5ldwotCQkJCQkJCQkvLyBQb2ludChwb2ludC54LHBvaW50LnktMTApKTsKLQkJCQkJCQkJbmV3eSAtPSBwcmVzc2xlbmd0aDsKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJY2FzZSA0OgotCQkJCQkJCQkvLyBub2RlLnNldExvY2F0aW9uKG5ldwotCQkJCQkJCQkvLyBQb2ludChwb2ludC54LTEwLHBvaW50LnkpKTsKLQkJCQkJCQkJbmV3eCAtPSBwcmVzc2xlbmd0aDsKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJZGVmYXVsdDoKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJfQotCQkJCQkJCW9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kIGMgPSBuZXcgTW92ZUJlbmRwb2ludENvbW1hbmQoCi0JCQkJCQkJCQlsaW5rLCBuZXcgUG9pbnQobmV3eCwgbmV3eSksIGluZGV4KTsKLQkJCQkJCQlnZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKGMpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQotCQkJfTsKLQkJCXNoYXJlZEtleUhhbmRsZXIKLQkJCQkJLnB1dChLZXlTdHJva2UuZ2V0UHJlc3NlZChTV1QuREVMLCAxMjcsIDApLAotCQkJCQkJCWdldEFjdGlvblJlZ2lzdHJ5KCkuZ2V0QWN0aW9uKAotCQkJCQkJCQkJQWN0aW9uRmFjdG9yeS5ERUxFVEUuZ2V0SWQoKSkpOwotCQkJc2hhcmVkS2V5SGFuZGxlci5wdXQoS2V5U3Ryb2tlLmdldFByZXNzZWQoU1dULkYyLCAwKSwKLQkJCQkJZ2V0QWN0aW9uUmVnaXN0cnkoKS5nZXRBY3Rpb24oCi0JCQkJCQkJR0VGQWN0aW9uQ29uc3RhbnRzLkRJUkVDVF9FRElUKSk7Ci0KLQkJfQotCQlyZXR1cm4gc2hhcmVkS2V5SGFuZGxlcjsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBncmFwaGljYWxWaWV3ZXIgZm9yIHRoaXMgRWRpdG9yUGFydC4KLQkgKiAKLQkgKiBAcGFyYW0gdmlld2VyCi0JICogICAgICAgICAgICB0aGUgZ3JhcGhpY2FsIHZpZXdlcgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldEdyYXBoaWNhbFZpZXdlcihHcmFwaGljYWxWaWV3ZXIgdmlld2VyKSB7Ci0JCXN1cGVyLnNldEdyYXBoaWNhbFZpZXdlcih2aWV3ZXIpOwotCQlpZiAoYWN0aW9uU2VydmljZSAhPSBudWxsKSB7Ci0JCQlhY3Rpb25TZXJ2aWNlLnNldEdyYXBoaWNhbFZpZXdlcih2aWV3ZXIpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlR3JhcGhpY2FsVmlld2VyKCkgewotCQlzdXBlci5jb25maWd1cmVHcmFwaGljYWxWaWV3ZXIoKTsKLQkJU2Nyb2xsaW5nR3JhcGhpY2FsVmlld2VyIHZpZXdlciA9IChTY3JvbGxpbmdHcmFwaGljYWxWaWV3ZXIpIGdldEdyYXBoaWNhbFZpZXdlcigpOwotCi0JCVNjYWxhYmxlRnJlZWZvcm1Sb290RWRpdFBhcnQgcm9vdCA9IG5ldyBTY2FsYWJsZUZyZWVmb3JtUm9vdEVkaXRQYXJ0KCk7Ci0KLQkJLy8gTGlzdCB6b29tTGV2ZWxzID0gbmV3IEFycmF5TGlzdCgzKTsKLQkJLy8gem9vbUxldmVscy5hZGQoWm9vbU1hbmFnZXIuRklUX0FMTCk7Ci0JCS8vIHpvb21MZXZlbHMuYWRkKFpvb21NYW5hZ2VyLkZJVF9XSURUSCk7Ci0JCS8vIHpvb21MZXZlbHMuYWRkKFpvb21NYW5hZ2VyLkZJVF9IRUlHSFQpOwotCQkvLyByb290LmdldFpvb21NYW5hZ2VyKCkuc2V0Wm9vbUxldmVsQ29udHJpYnV0aW9ucyh6b29tTGV2ZWxzKTsKLQkJLy8KLQkJLy8gSUFjdGlvbiB6b29tSW4gPSBuZXcgWm9vbUluQWN0aW9uKHJvb3QuZ2V0Wm9vbU1hbmFnZXIoKSk7Ci0JCS8vIElBY3Rpb24gem9vbU91dCA9IG5ldyBab29tT3V0QWN0aW9uKHJvb3QuZ2V0Wm9vbU1hbmFnZXIoKSk7Ci0JCS8vIGdldEFjdGlvblJlZ2lzdHJ5KCkucmVnaXN0ZXJBY3Rpb24oem9vbUluKTsKLQkJLy8gZ2V0QWN0aW9uUmVnaXN0cnkoKS5yZWdpc3RlckFjdGlvbih6b29tT3V0KTsKLQkJLy8gZ2V0U2l0ZSgpLmdldEtleUJpbmRpbmdTZXJ2aWNlKCkucmVnaXN0ZXJBY3Rpb24oem9vbUluKTsKLQkJLy8gZ2V0U2l0ZSgpLmdldEtleUJpbmRpbmdTZXJ2aWNlKCkucmVnaXN0ZXJBY3Rpb24oem9vbU91dCk7Ci0KLQkJdmlld2VyLnNldFJvb3RFZGl0UGFydChyb290KTsKLQotCQkvLyB2aWV3ZXIuc2V0RWRpdFBhcnRGYWN0b3J5KG5ldyBNZXRob2RFbGVtZW50RWRpdFBhcnRGYWN0b3J5KCkpOwotCQl2aWV3ZXIuc2V0RWRpdFBhcnRGYWN0b3J5KGNyZWF0ZUVkaXRQYXJ0RmFjdG9yeSgpKTsKLQotCQlDb250ZXh0TWVudVByb3ZpZGVyIHByb3ZpZGVyID0gbmV3IERpYWdyYW1Db250ZXh0TWVudVByb3ZpZGVyKAotCQkJCWdldEdyYXBoaWNhbFZpZXdlcigpLCBnZXRBY3Rpb25SZWdpc3RyeSgpKTsKLQkJZ2V0R3JhcGhpY2FsVmlld2VyKCkuc2V0Q29udGV4dE1lbnUocHJvdmlkZXIpOwotCQlnZXRTaXRlKCkucmVnaXN0ZXJDb250ZXh0TWVudSgKLQkJCQkib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLndvcmtmbG93LmNvbnRleHRtZW51IiwgLy8kTk9OLU5MUy0xJAotCQkJCXByb3ZpZGVyLCBnZXRHcmFwaGljYWxWaWV3ZXIoKSk7Ci0KLQkJdmlld2VyLnNldEtleUhhbmRsZXIobmV3IEdyYXBoaWNhbFZpZXdlcktleUhhbmRsZXIodmlld2VyKQotCQkJCS5zZXRQYXJlbnQoZ2V0Q29tbW9uS2V5SGFuZGxlcigpKSk7Ci0KLQkJLy8gbG9hZFByb3BlcnRpZXMoKTsKLQotCQkvLyBBY3Rpb25zCi0JCS8vIElBY3Rpb24gc2hvd1J1bGVycyA9IG5ldwotCQkvLyBUb2dnbGVSdWxlclZpc2liaWxpdHlBY3Rpb24oZ2V0R3JhcGhpY2FsVmlld2VyKCkpOwotCQkvLyBnZXRBY3Rpb25SZWdpc3RyeSgpLnJlZ2lzdGVyQWN0aW9uKHNob3dSdWxlcnMpOwotCQkvLyAgICAJCi0JCS8vIElBY3Rpb24gc25hcEFjdGlvbiA9IG5ldwotCQkvLyBUb2dnbGVTbmFwVG9HZW9tZXRyeUFjdGlvbihnZXRHcmFwaGljYWxWaWV3ZXIoKSk7Ci0JCS8vIGdldEFjdGlvblJlZ2lzdHJ5KCkucmVnaXN0ZXJBY3Rpb24oc25hcEFjdGlvbik7Ci0JCS8vCi0JCS8vIElBY3Rpb24gc2hvd0dyaWQgPSBuZXcgVG9nZ2xlR3JpZEFjdGlvbihnZXRHcmFwaGljYWxWaWV3ZXIoKSk7Ci0JCS8vIGdldEFjdGlvblJlZ2lzdHJ5KCkucmVnaXN0ZXJBY3Rpb24oc2hvd0dyaWQpOwotCi0JCUxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCQloYW5kbGVBY3RpdmF0aW9uQ2hhbmdlZChldmVudCk7Ci0JCQl9Ci0JCX07Ci0KLQkJZ2V0R3JhcGhpY2FsQ29udHJvbCgpLmFkZExpc3RlbmVyKFNXVC5BY3RpdmF0ZSwgbGlzdGVuZXIpOwotCQlnZXRHcmFwaGljYWxDb250cm9sKCkuYWRkTGlzdGVuZXIoU1dULkRlYWN0aXZhdGUsIGxpc3RlbmVyKTsKLQotCQlnZXRHcmFwaGljYWxDb250cm9sKCkuYWRkTGlzdGVuZXIoU1dULk1vdXNlRG91YmxlQ2xpY2ssIG5ldyBMaXN0ZW5lcigpIHsKLQotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCQloYW5kbGVEb3VibGVDbGljayhldmVudCk7Ci0JCQl9Ci0KLQkJfSk7Ci0JCWlmIChnZXREaWFncmFtVHlwZSgpLmVxdWFsc0lnbm9yZUNhc2UoCi0JCQkJUmVzb3VyY2VIZWxwZXIuRElBR1JBTV9UWVBFX0FDVElWSVRZX0RFVEFJTCkpCi0JCQlQbGF0Zm9ybVVJCi0JCQkJCS5nZXRXb3JrYmVuY2goKQotCQkJCQkuZ2V0SGVscFN5c3RlbSgpCi0JCQkJCS5zZXRIZWxwKAotCQkJCQkJCWdldEdyYXBoaWNhbENvbnRyb2woKSwKLQkJCQkJCQlBdXRob3JpbmdVSUhlbHBDb250ZXh0cy5GT1JNX0VESVRPUl9BQ1RJVklUWV9ERVRBSUxfRElBR1JBTV9DT05URVhUKTsKLQkJZWxzZSBpZiAoZ2V0RGlhZ3JhbVR5cGUoKS5lcXVhbHNJZ25vcmVDYXNlKAotCQkJCVJlc291cmNlSGVscGVyLkRJQUdSQU1fVFlQRV9XT1JLRkxPVykpCi0JCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKAotCQkJCQlnZXRHcmFwaGljYWxDb250cm9sKCksIEF1dGhvcmluZ1VJSGVscENvbnRleHRzLkZPUk1fRURJVE9SX0FDVElWSVRZX0RJQUdSQU1fQ09OVEVYVCk7IAotCQllbHNlIGlmIChnZXREaWFncmFtVHlwZSgpLmVxdWFsc0lnbm9yZUNhc2UoCi0JCQkJUmVzb3VyY2VIZWxwZXIuRElBR1JBTV9UWVBFX1dQX0RFUEVOREVOQ1kpKQotCQkJUGxhdGZvcm1VSQotCQkJCQkuZ2V0V29ya2JlbmNoKCkKLQkJCQkJLmdldEhlbHBTeXN0ZW0oKQotCQkJCQkuc2V0SGVscChnZXRHcmFwaGljYWxDb250cm9sKCksIEF1dGhvcmluZ1VJSGVscENvbnRleHRzLkZPUk1fRURJVE9SX1dQX0RFUEVOREVOQ1lfRElBR1JBTV9DT05URVhUKTsKLQotCQlEaXNwbGF5IGRpc3BsYXkgPSBnZXRHcmFwaGljYWxDb250cm9sKCkuZ2V0RGlzcGxheSgpOwotCQlpZiAoIShkaXNwbGF5ID09IG51bGwgfHwgZGlzcGxheS5pc0Rpc3Bvc2VkKCkpKSB7Ci0JCQlkaXNwbGF5LmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQlpZiAoZ2V0UGFsZXR0ZVJvb3QoKSAhPSBudWxsKSB7Ci0JCQkJCQlPYmplY3Qgb2JqID0gZ2V0TWV0aG9kRWxlbWVudEZyb21JbnB1dCgpOwotCQkJCQkJaWYgKFRuZ1V0aWwuaXNMb2NrZWQoKEVPYmplY3QpIG9iaikpIHsKLQkJCQkJCQlMaXN0IGxpc3QgPSBnZXRQYWxldHRlUm9vdCgpLmdldENoaWxkcmVuKCk7Ci0JCQkJCQkJZm9yIChJdGVyYXRvciBpdG9yID0gbGlzdC5pdGVyYXRvcigpOyBpdG9yCi0JCQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJCQlQYWxldHRlRW50cnkgZW50cnkgPSAoUGFsZXR0ZUVudHJ5KSBpdG9yLm5leHQoKTsKLQkJCQkJCQkJZW50cnkuc2V0VmlzaWJsZShmYWxzZSk7Ci0JCQkJCQkJfQotCi0JCQkJCQl9IGVsc2UgewotCQkJCQkJCUxpc3QgbGlzdCA9IGdldFBhbGV0dGVSb290KCkuZ2V0Q2hpbGRyZW4oKTsKLQkJCQkJCQlmb3IgKEl0ZXJhdG9yIGl0b3IgPSBsaXN0Lml0ZXJhdG9yKCk7IGl0b3IKLQkJCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJCVBhbGV0dGVFbnRyeSBlbnRyeSA9IChQYWxldHRlRW50cnkpIGl0b3IubmV4dCgpOwotCQkJCQkJCQllbnRyeS5zZXRWaXNpYmxlKHRydWUpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0pOwotCQl9Ci0JCQotCQljdXJyZW50Q29uZmlnID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TWV0aG9kQ29uZmlndXJhdGlvbigpOwotCQkKLQkJLy8gbGlzdGVuIHRvIGNoYW5nZSBmb3IgY3VycmVudCBzZWxlY3Rpb24gb2YgTWV0aG9kQ29uZmlndXJhdGlvbiBvciBjaGFuZ2VzIGluIAotCQkvLyBjdXJyZW50IGNvbmZpZ3VyYXRpb24uCi0JCS8vCi0JCUxpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuYWRkTGlzdGVuZXIobGliU3ZjTGlzdGVuZXIpOwotCQlJTGlicmFyeU1hbmFnZXIgbWFuYWdlciA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudExpYnJhcnlNYW5hZ2VyKCk7Ci0JCWlmIChtYW5hZ2VyICE9IG51bGwpIHsKLQkJCW1hbmFnZXIuYWRkTGlzdGVuZXIobGlicmFyeUxpc3RlbmVyKTsKLQkJfQotCQkKLQkJSUFjdGlvbiBhY3Rpb24gPSBnZXRBY3Rpb25SZWdpc3RyeSgpLmdldEFjdGlvbihBY3Rpb25GYWN0b3J5LlBSSU5ULmdldElkKCkpOwotCQlpZihhY3Rpb24gaW5zdGFuY2VvZiBEaWFncmFtUHJpbnRBY3Rpb24pewotCQkJKChEaWFncmFtUHJpbnRBY3Rpb24pYWN0aW9uKS5zZXRWaWV3ZXIodmlld2VyKTsKLQkJfQotCi0JfQotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCBFZGl0UGFydEZhY3RvcnkgY3JlYXRlRWRpdFBhcnRGYWN0b3J5KCk7Ci0KLQkvKioKLQkgKiBAcGFyYW0gZXZlbnQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVEb3VibGVDbGljayhFdmVudCBldmVudCkgewotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVHcmFwaGljYWxWaWV3ZXIoKSB7Ci0JCXN1cGVyLmluaXRpYWxpemVHcmFwaGljYWxWaWV3ZXIoKTsKLQkJZ2V0R3JhcGhpY2FsVmlld2VyKCkuc2V0Q29udGVudHMoZWRpdFBhcnQpOwotCi0JCVRyYW5zZmVyRHJvcFRhcmdldExpc3RlbmVyIGxpc3RlbmVyID0gY3JlYXRlRHJvcFRhcmdldExpc3RlbmVyKCk7Ci0JCWlmIChsaXN0ZW5lciAhPSBudWxsKSB7Ci0JCQlnZXRHcmFwaGljYWxWaWV3ZXIoKS5hZGREcm9wVGFyZ2V0TGlzdGVuZXIobGlzdGVuZXIpOwotCQl9Ci0KLQkJLy8gQWJzdHJhY3RFZGl0UGFydFZpZXdlcgotCQkvLyBnZXRHcmFwaGljYWxWaWV3ZXIoKS5hZGREcm9wVGFyZ2V0TGlzdGVuZXIoCi0JCS8vIG5ldyBUZXh0VHJhbnNmZXJEcm9wVGFyZ2V0TGlzdGVuZXIoZ2V0R3JhcGhpY2FsVmlld2VyKCksCi0JCS8vIFRleHRUcmFuc2Zlci5nZXRJbnN0YW5jZSgpKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUNyZWF0aW9uRmFjdG9yaWVzKCkgewotCQl0ZW1wbGF0ZU5hbWVUb0NyZWF0aW9uRmFjdG9yeU1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0KLQkJaWYgKGZyZWVUeHROb2RlQ3JlYXRpb25GYWN0b3J5ID09IG51bGwpCi0JCQlmcmVlVHh0Tm9kZUNyZWF0aW9uRmFjdG9yeSA9IG5ldyBDcmVhdGlvbkZhY3RvcnkoKSB7Ci0KLQkJCQlwdWJsaWMgT2JqZWN0IGdldE5ld09iamVjdCgpIHsKLQkJCQkJVHlwZWROb2RlIG5vZGUgPSBNb2RlbEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVR5cGVkTm9kZSgpOwotCQkJCQlub2RlLnNldFR5cGUoVHlwZWROb2RlLkZSRUVfVEVYVCk7Ci0JCQkJCW5vZGUuc2V0T2JqZWN0KEdyYXBoaWNhbERhdGFIZWxwZXIKLQkJCQkJCQkubmV3VHlwZWRHcmFwaE5vZGUoVHlwZWROb2RlLkZSRUVfVEVYVCkpOwotCQkJCQlyZXR1cm4gbm9kZTsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgT2JqZWN0IGdldE9iamVjdFR5cGUoKSB7Ci0JCQkJCXJldHVybiBUZW1wbGF0ZUNvbnN0YW50cy5GUkVFX1RFWFQ7Ci0JCQkJfQotCi0JCQl9OwotCQlDcmVhdGlvbkZhY3RvcnkgY3JlYXRpb25GYWN0b3J5ID0gZnJlZVR4dE5vZGVDcmVhdGlvbkZhY3Rvcnk7Ci0JCXRlbXBsYXRlTmFtZVRvQ3JlYXRpb25GYWN0b3J5TWFwLnB1dChjcmVhdGlvbkZhY3RvcnkuZ2V0T2JqZWN0VHlwZSgpLAotCQkJCWNyZWF0aW9uRmFjdG9yeSk7Ci0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5BYnN0cmFjdERpYWdyYW1FZGl0b3IjY3JlYXRlRHJvcFRhcmdldExpc3RlbmVyKCkKLQkgKi8KLQlwcm90ZWN0ZWQgVHJhbnNmZXJEcm9wVGFyZ2V0TGlzdGVuZXIgY3JlYXRlRHJvcFRhcmdldExpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFRlbXBsYXRlVHJhbnNmZXJEcm9wVGFyZ2V0TGlzdGVuZXIoZ2V0R3JhcGhpY2FsVmlld2VyKCkpIHsKLQotCQkJcHJvdGVjdGVkIENyZWF0aW9uRmFjdG9yeSBnZXRGYWN0b3J5KE9iamVjdCB0ZW1wbGF0ZSkgewotCQkJCXJldHVybiAoQ3JlYXRpb25GYWN0b3J5KSB0ZW1wbGF0ZU5hbWVUb0NyZWF0aW9uRmFjdG9yeU1hcAotCQkJCQkJLmdldCh0ZW1wbGF0ZSk7Ci0JCQl9Ci0KLQkJfTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVBY3RpdmF0aW9uQ2hhbmdlZChFdmVudCBldmVudCkgewotCQlJQWN0aW9uIGNvcHkgPSBudWxsOwotCQlpZiAoZXZlbnQudHlwZSA9PSBTV1QuRGVhY3RpdmF0ZSkKLQkJCWNvcHkgPSBnZXRBY3Rpb25SZWdpc3RyeSgpLmdldEFjdGlvbihBY3Rpb25GYWN0b3J5LkNPUFkuZ2V0SWQoKSk7Ci0JCWlmIChnZXRFZGl0b3JTaXRlKCkuZ2V0QWN0aW9uQmFycygpLmdldEdsb2JhbEFjdGlvbkhhbmRsZXIoCi0JCQkJQWN0aW9uRmFjdG9yeS5DT1BZLmdldElkKCkpICE9IGNvcHkpIHsKLQkJCWdldEVkaXRvclNpdGUoKS5nZXRBY3Rpb25CYXJzKCkuc2V0R2xvYmFsQWN0aW9uSGFuZGxlcigKLQkJCQkJQWN0aW9uRmFjdG9yeS5DT1BZLmdldElkKCksIGNvcHkpOwotCQkJZ2V0RWRpdG9yU2l0ZSgpLmdldEFjdGlvbkJhcnMoKS51cGRhdGVBY3Rpb25CYXJzKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmdlZi51aS5wYXJ0cy5HcmFwaGljYWxFZGl0b3JXaXRoRmx5b3V0UGFsZXR0ZSNnZXRQYWxldHRlUm9vdCgpCi0JICovCi0JcHJvdGVjdGVkIFBhbGV0dGVSb290IGdldFBhbGV0dGVSb290KCkgewotCQlpZiAocGFsZXR0ZVJvb3QgPT0gbnVsbCkgewotCQkJY3JlYXRlUGFsZXR0ZVJvb3QoKTsKLQkJfQotCQlyZXR1cm4gcGFsZXR0ZVJvb3Q7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVBhbGV0dGVSb290KCkgewotCQlwYWxldHRlUm9vdCA9IG5ldyBQYWxldHRlUm9vdCgpOwotCQlwYWxldHRlUm9vdC5hZGRBbGwoY3JlYXRlQ2F0ZWdvcmllcyhwYWxldHRlUm9vdCkpOwotCX0KLQotCXByaXZhdGUgTGlzdCBjcmVhdGVDYXRlZ29yaWVzKFBhbGV0dGVSb290IHJvb3QpIHsKLQkJTGlzdCBjYXRlZ29yaWVzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCVBhbGV0dGVDb250YWluZXIgcGFsZXR0ZUNvbnRhaW5lciA9IGNyZWF0ZUNvbnRyb2xHcm91cChyb290KTsKLQkJaWYgKHBhbGV0dGVDb250YWluZXIgIT0gbnVsbCkgewotCQkJY2F0ZWdvcmllcy5hZGQocGFsZXR0ZUNvbnRhaW5lcik7Ci0JCX0KLQotCQlyZXR1cm4gY2F0ZWdvcmllczsKLQl9Ci0KLQlwcm90ZWN0ZWQgUGFsZXR0ZUNvbnRhaW5lciBjcmVhdGVDb250cm9sR3JvdXAoUGFsZXR0ZVJvb3Qgcm9vdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgTWV0aG9kRWxlbWVudCBnZXRNZXRob2RFbGVtZW50RnJvbUlucHV0KCkgewotCQlJRWRpdG9ySW5wdXQgaW5wdXQgPSBnZXRFZGl0b3JJbnB1dCgpOwotCQlpZiAoaW5wdXQgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50RWRpdG9ySW5wdXQpIHsKLQkJCXJldHVybiAoKE1ldGhvZEVsZW1lbnRFZGl0b3JJbnB1dCkgaW5wdXQpLmdldE1ldGhvZEVsZW1lbnQoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklTYXZlYWJsZVBhcnQjZG9TYXZlKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCXB1YmxpYyB2b2lkIGRvU2F2ZShmaW5hbCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQotCQkvLyBzYXZlRGlhZ3JhbSgpOwotCQkvLyBzYXZlU2NyZWVuKCk7Ci0KLQkJZmluYWwgTWV0aG9kRWxlbWVudCBlID0gZ2V0TWV0aG9kRWxlbWVudEZyb21JbnB1dCgpOwotCQlpZiAoZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlTYWZlUnVubmFibGUucnVuKG5ldyBTYWZlUnVubmFibGUoKSB7Ci0KLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHRocm93cyBFeGNlcHRpb24gewotCQkJCXRyeSB7Ci0JCQkJCW1vbml0b3IKLQkJCQkJCQkuYmVnaW5UYXNrKAotCQkJCQkJCQkJRGlhZ3JhbVVJUmVzb3VyY2VzLkFic3RyYWN0RGlhZ3JhbUVkaXRvcl9TYXZlX3RleHQsIElQcm9ncmVzc01vbml0b3IuVU5LTk9XTik7IAotCQkJCQltb25pdG9yCi0JCQkJCQkJLnNldFRhc2tOYW1lKERpYWdyYW1VSVJlc291cmNlcy5iaW5kKERpYWdyYW1VSVJlc291cmNlcy5BYnN0cmFjdERpYWdyYW1FZGl0b3JfU2F2ZV9tZXNzYWdlCi0JCQkJCQkJCQksIGUuZVJlc291cmNlKCkuZ2V0VVJJKCkuaXNGaWxlKCkgPyBlLmVSZXNvdXJjZSgpLmdldFVSSSgpLnRvRmlsZVN0cmluZygpIDogZS5nZXROYW1lKCkpKTsgCi0JCQkJCUlMaWJyYXJ5UGVyc2lzdGVyLkZhaWxTYWZlTWV0aG9kTGlicmFyeVBlcnNpc3RlciBwZXJzaXN0ZXIgPSBMaWJyYXJ5U2VydmljZVV0aWwuZ2V0Q3VycmVudFBlcnNpc3RlcigpLmdldEZhaWxTYWZlUGVyc2lzdGVyKCk7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlwZXJzaXN0ZXIuc2F2ZShlLmVSZXNvdXJjZSgpKTsKLQkJCQkJCXBlcnNpc3Rlci5jb21taXQoKTsKLQkJCQkJCURpYWdyYW0gZGlhZ3JhbSA9IChEaWFncmFtKSAoKEVkaXRQYXJ0KSBnZXRHcmFwaGljYWxWaWV3ZXIoKQotCQkJCQkJCQkuZ2V0Q29udGVudHMoKSkuZ2V0TW9kZWwoKTsKLQkJCQkJCWRpYWdyYW0uc2V0TmV3KGZhbHNlKTsKLQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJcGVyc2lzdGVyLnJvbGxiYWNrKCk7Ci0JCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkKLQkJCQkJCQkJCS5sb2dFcnJvcihleCk7Ci0JCQkJCQkJVmlld0hlbHBlcgotCQkJCQkJCQkJLnJlbG9hZEN1cnJlbnRMaWJhcnlPblJvbGxiYWNrRXJyb3IoZ2V0U2l0ZSgpCi0JCQkJCQkJCQkJCS5nZXRTaGVsbCgpKTsKLQkJCQkJCQlyZXR1cm47Ci0JCQkJCQl9Ci0JCQkJCQlBdXRob3JpbmdVSVBsdWdpbgotCQkJCQkJCQkuZ2V0RGVmYXVsdCgpCi0JCQkJCQkJCS5nZXRNc2dEaWFsb2coKQotCQkJCQkJCQkuZGlzcGxheVdhcm5pbmcoCi0JCQkJCQkJCQkJZ2V0U2l0ZSgpLmdldFNoZWxsKCkuZ2V0VGV4dCgpLAotCQkJCQkJCQkJCURpYWdyYW1VSVJlc291cmNlcy5kaWFncmFtX3NhdmVFcnJvcgotCQkJCQkJCQkJCSwgZS5nZXRNZXNzYWdlKCksIGUpOwotCQkJCQkJcmV0dXJuOwotCQkJCQl9Ci0KLQkJCQkJLy8gUmVmcmVzaCB0aGUgbmVjZXNzYXJ5IHN0YXRlLgotCQkJCQkvLwotCQkJCQkvL2dldEVkaXREb21haW4oKS5nZXRDb21tYW5kU3RhY2soKS5tYXJrU2F2ZUxvY2F0aW9uKCk7Ci0JCQkJCWdldEVkaXREb21haW4oKS5nZXRDb21tYW5kU3RhY2soKS5mbHVzaCgpOwotCQkJCQljaGFuZ2VUaW1lID0gLTE7Ci0JCQkJCWZpcmVQcm9wZXJ0eUNoYW5nZShJRWRpdG9yUGFydC5QUk9QX0RJUlRZKTsKLQotCQkJCX0gZmluYWxseSB7Ci0JCQkJCW1vbml0b3IuZG9uZSgpOwotCQkJCX0KLQkJCX0KLQotCQl9KTsKLQl9Ci0KLQkvKiogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JU2F2ZWFibGVQYXJ0I2RvU2F2ZUFzKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkb1NhdmVBcygpIHsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklTYXZlYWJsZVBhcnQjaXNEaXJ0eSgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNEaXJ0eSgpIHsKLQkJcmV0dXJuIGdldEVkaXREb21haW4oKS5nZXRDb21tYW5kU3RhY2soKS5pc0RpcnR5KCk7Ci0JfQotCi0JLyoqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVNhdmVhYmxlUGFydCNpc1NhdmVBc0FsbG93ZWQoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2F2ZUFzQWxsb3dlZCgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzUmVhZE9ubHkoKSB7Ci0JCWlmIChlZGl0UGFydCAhPSBudWxsKSB7Ci0JCQlEaWFncmFtIGRpYWdyYW0gPSAoRGlhZ3JhbSkgZWRpdFBhcnQuZ2V0TW9kZWwoKTsKLQkJCXJldHVybiBkaWFncmFtICE9IG51bGwgJiYgZGlhZ3JhbS5pc1JlYWRPbmx5KCk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVFZGl0UGFydCgpIHsKLQkJQnJlYWtkb3duRWxlbWVudEVkaXRvcklucHV0IGVkaXRvcklucHV0ID0gKEJyZWFrZG93bkVsZW1lbnRFZGl0b3JJbnB1dCkgZ2V0RWRpdG9ySW5wdXQoKTsKLQkJT2JqZWN0IG9iamVjdDsKLQkJaWYgKGVkaXRvcklucHV0LmdldFdyYXBwZXIoKSAhPSBudWxsKSB7Ci0JCQlvYmplY3QgPSBlZGl0b3JJbnB1dC5nZXRXcmFwcGVyKCk7Ci0JCX0gZWxzZSB7Ci0JCQlvYmplY3QgPSBlZGl0b3JJbnB1dC5nZXRNZXRob2RFbGVtZW50KCk7Ci0JCX0KLQkJCi0JCWNoYW5nZVRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJZWRpdFBhcnQgPSBjcmVhdGVEaWFncmFtRWRpdFBhcnQoKTsKLQkJRGlhZ3JhbSBkaWFncmFtID0gKERpYWdyYW0pIGVkaXRQYXJ0LmdldE1vZGVsKCk7Ci0JCS8vIHBhc3MgYWxvbmcgdGhlIFN1cHByZXNzaW9uIGluc3RhbmNlIGZyb20gaW5wdXQgdG8gZGlhZ3JhbSBtb2RlbAotCQkvLwotCQlkaWFncmFtLnNldFN1cHByZXNzaW9uKGVkaXRvcklucHV0LmdldFN1cHByZXNzaW9uKCkpOwotCQlkaWFncmFtLnNldE9iamVjdChvYmplY3QpOwotCQlkaWFncmFtLmFkZENvbnN1bWVyKHRoaXMpOwotCQkKLQkJaWYoIWRpYWdyYW0uaXNOZXcoKSkgewotCQkJY2hhbmdlVGltZSA9IC0xOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5wYXJ0LkVkaXRvclBhcnQjc2V0SW5wdXQob3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldElucHV0KElFZGl0b3JJbnB1dCBpbnB1dCkgewotCQlzdXBlci5zZXRJbnB1dChpbnB1dCk7Ci0KLQkJTWV0aG9kRWxlbWVudCBlID0gZ2V0TWV0aG9kRWxlbWVudEZyb21JbnB1dCgpOwotCQlpZiAoZSAhPSBudWxsKSB7Ci0JCQljcmVhdGVFZGl0UGFydCgpOwotCi0JCQlCcmVha2Rvd25FbGVtZW50RWRpdG9ySW5wdXQgZWRpdG9ySW5wdXQgPSAoQnJlYWtkb3duRWxlbWVudEVkaXRvcklucHV0KSBnZXRFZGl0b3JJbnB1dCgpOwotCQkJc2V0UGFydE5hbWUoZ2V0UGFydE5hbWVQcmVmaXgoKQotCQkJCQkrIGUuZ2V0TmFtZSgpCi0JCQkJCSsgIiwgIiArIGVkaXRvcklucHV0LmdldFN1cHByZXNzaW9uKCkuZ2V0UHJvY2VzcygpLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCS8vIHNldFRpdGxlSW1hZ2UoZ2V0VHlwZUltYWdlKGUpKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBhYnN0cmFjdCBFZGl0UGFydCBjcmVhdGVEaWFncmFtRWRpdFBhcnQoKTsKLQotCXByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0UGFydE5hbWVQcmVmaXgoKTsKLQotCXByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0RGlhZ3JhbVR5cGUoKTsKLQotCS8qKgotCSAqIEdldCBwYXJlbnQgZWRpdG9yCi0JICogQHJldHVybiBlZGl0b3IKLQkgKi8KLQlwdWJsaWMgSUVkaXRvclBhcnQgZ2V0UGFyZW50RWRpdG9yKCkgewotCQlyZXR1cm4gcGFyZW50RWRpdG9yOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFBhcmVudEVkaXRvcihJRWRpdG9yUGFydCBwYXJlbnRFZGl0b3IpIHsKLQkJdGhpcy5wYXJlbnRFZGl0b3IgPSBwYXJlbnRFZGl0b3I7Ci0JfQotCQotCS8vQWRkaW5nIGxpYnJhcnljaG5hZ2VkIGxpc3RlbmVyLCBpZiBjb25maWd1cmF0aW9uIGdvdCBjaGFuZ2VkIGRpYWdyYW0gbmVlZHMgdG8gcmVmcmVzaAotCXByaXZhdGUgSUxpYnJhcnlDaGFuZ2VMaXN0ZW5lciBsaWJyYXJ5TGlzdGVuZXIgPSBuZXcgSUxpYnJhcnlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgbGlicmFyeUNoYW5nZWQoaW50IG9wdGlvbiwgQ29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCQlzd2l0Y2ggKG9wdGlvbikgewotCQkJY2FzZSBJTGlicmFyeUNoYW5nZUxpc3RlbmVyLk9QVElPTl9DSEFOR0VEOiB7Ci0JCQkJaWYgKGNvbGxlY3Rpb24gIT0gbnVsbCAmJiBjb2xsZWN0aW9uLmNvbnRhaW5zKGN1cnJlbnRDb25maWcpKSB7Ci0JCQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gUHJvY2Vzc0F1dGhvcmluZ0NvbmZpZ3VyYXRvci5JTlNUQU5DRS5nZXRNZXRob2RDb25maWd1cmF0aW9uKCk7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlQcm9jZXNzQXV0aG9yaW5nQ29uZmlndXJhdG9yLklOU1RBTkNFLnNldE1ldGhvZENvbmZpZ3VyYXRpb24oY3VycmVudENvbmZpZyk7CQkJCQkKLQkJCQkJCUlBY3Rpb24gYWN0aW9uID0gZ2V0QWN0aW9uUmVnaXN0cnkoKS5nZXRBY3Rpb24oUkVGUkVTSCk7Ci0JCQkJCQlhY3Rpb24ucnVuKCk7Ci0JCQkJCX0KLQkJCQkJZmluYWxseSB7Ci0JCQkJCQlQcm9jZXNzQXV0aG9yaW5nQ29uZmlndXJhdG9yLklOU1RBTkNFLnNldE1ldGhvZENvbmZpZ3VyYXRpb24oY29uZmlnKTsKLQkJCQkJfQotCQkJCX0JCQotCQkJCWJyZWFrOwotCQkJfQotCQkJLy8gaGFuZGxlZCBieSBsaWJTdmNMaXN0ZW5lcgotCQkJLy8KLS8vCQkJY2FzZSBJTGlicmFyeUNoYW5nZUxpc3RlbmVyLk9QVElPTl9DT05GSUdVUkFUSU9OX1NFTEVDVEVEOiB7Ci0vLwkJCQljb25maWdDaGFuZ2VkKCk7Ci0vLwkJCQlicmVhazsKLS8vCQkJfQotCQkJfQotCQl9Ci0JfTsKLQkKLQlwcml2YXRlIElMaWJyYXJ5U2VydmljZUxpc3RlbmVyIGxpYlN2Y0xpc3RlbmVyID0gbmV3IElMaWJyYXJ5U2VydmljZUxpc3RlbmVyKCkgewotCi0JCXB1YmxpYyB2b2lkIGNvbmZpZ3VyYXRpb25TZXQoTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLQkJCWNvbmZpZ0NoYW5nZWQoKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGxpYnJhcnlDbG9zZWQoTWV0aG9kTGlicmFyeSBsaWJyYXJ5KSB7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBsaWJyYXJ5Q3JlYXRlZChNZXRob2RMaWJyYXJ5IGxpYnJhcnkpIHsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGxpYnJhcnlPcGVuZWQoTWV0aG9kTGlicmFyeSBsaWJyYXJ5KSB7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBsaWJyYXJ5UmVvcGVuZWQoTWV0aG9kTGlicmFyeSBsaWJyYXJ5KSB7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBsaWJyYXJ5U2V0KE1ldGhvZExpYnJhcnkgbGlicmFyeSkgewotCQl9CQkKLQl9OwotCQotCXByaXZhdGUgdm9pZCBjb25maWdDaGFuZ2VkKCkgewotCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudE1ldGhvZENvbmZpZ3VyYXRpb24oKTsKLQkJaWYoY3VycmVudENvbmZpZyAhPSBjb25maWcpIHsKLQkJCS8vIHJlZnJlc2ggb25seSBpZiB0aGUgYWN0aXZlIHBhcnQgaXMgdGhpcyBkaWFncmFtIGVkaXRvciBvciBwcm9jZXNzIGVkaXRvciBvZiB0aGUgcHJvY2VzcwotCQkJLy8gdGhhdCBvd25zIHRoaXMgZGlhZ3JhbQotCQkJLy8KLQkJCUlXb3JrYmVuY2hQYXJ0IGFjdGl2ZVBhcnQgPSBnZXRTaXRlKCkuZ2V0V29ya2JlbmNoV2luZG93KCkuZ2V0UGFydFNlcnZpY2UoKS5nZXRBY3RpdmVQYXJ0KCk7Ci0JCQlib29sZWFuIHJlZnJlc2ggPSAgYWN0aXZlUGFydCA9PSB0aGlzOwotCQkJaWYoIXJlZnJlc2gpIHsKLQkJCQlpZihhY3RpdmVQYXJ0IGluc3RhbmNlb2YgUHJvY2Vzc0VkaXRvcikgewotCQkJCQlNZXRob2RFbGVtZW50RWRpdG9ySW5wdXQgaW5wdXQgPSAoTWV0aG9kRWxlbWVudEVkaXRvcklucHV0KSAoKFByb2Nlc3NFZGl0b3IpYWN0aXZlUGFydCkuZ2V0RWRpdG9ySW5wdXQoKTsKLQkJCQkJT2JqZWN0IHByb2NDb21wID0gaW5wdXQuZ2V0TWV0aG9kRWxlbWVudCgpOwotCQkJCQlFT2JqZWN0IGRpYWdyYW0gPSAoKERpYWdyYW0pZWRpdFBhcnQuZ2V0TW9kZWwoKSkuZ2V0VU1BRGlhZ3JhbSgpOwotCQkJCQlyZWZyZXNoID0gVW1hVXRpbC5pc0NvbnRhaW5lZEJ5KGRpYWdyYW0sIHByb2NDb21wKTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZihyZWZyZXNoKSB7Ci0JCQkJY3VycmVudENvbmZpZyA9IGNvbmZpZzsKLQkJCQlJQWN0aW9uIGFjdGlvbiA9IGdldEFjdGlvblJlZ2lzdHJ5KCkuZ2V0QWN0aW9uKFJFRlJFU0gpOwotCQkJCWFjdGlvbi5ydW4oKTsKLQkJCX0KLQkJfQotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklTZWxlY3Rpb25MaXN0ZW5lciNzZWxlY3Rpb25DaGFuZ2VkKG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0LCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb24pCi0JICogb3ZlcnJpZGUgdG8gZG9ub3QgYWxsb3cgYW55IG5vZGUgc2VsZWN0aW9uIGluIEFjdGl2aXR5IERldGFpbCBEaWFncmFtIAotCSAqIGlmIGFjdGl2aXR5IGlzIGV4dGVuZHMuCi0JICovCi0JcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChJV29ya2JlbmNoUGFydCBwYXJ0LCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXN1cGVyLnNlbGVjdGlvbkNoYW5nZWQocGFydCwgc2VsZWN0aW9uKTsKLQkJaWYoZWRpdFBhcnQgIT0gbnVsbCl7Ci0JCQlEaWFncmFtIGRpYWdyYW0gPSAoRGlhZ3JhbSllZGl0UGFydC5nZXRNb2RlbCgpOwotCQkJaWYoZGlhZ3JhbS5pc1JlYWRPbmx5KCkgfHwgVG5nVXRpbC5pc0xvY2tlZChnZXRNZXRob2RFbGVtZW50RnJvbUlucHV0KCkpKXsKLQkJCQlnZXRHcmFwaGljYWxWaWV3ZXIoKS5zZWxlY3QoZWRpdFBhcnQpOwotCQkJfQotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJlZnJlc2hEaWFncmFtKCl7Ci0JCWdldEFjdGlvblJlZ2lzdHJ5KCkuZ2V0QWN0aW9uKFJFRlJFU0gpLnJ1bigpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzRGlzcG9zZWQoKSB7Ci0JCXJldHVybiBkaXNwb3NlZDsKLQl9Ci0KLQkKLS8vCS8qCi0vLwkgKiBNZXRob2Qgc2V0cyB0aGUgY29udGV4dCBtZW51IGNvbnRyaWJ1dGluZyBpdGVtcyBzdGF0ZS4KLS8vCSAqIFRoaXMgaXMgZWZmaWNpZW50IHdheSBpbnN0ZWFkIG9mIGRvaW5nIGF0IGVhY2ggYWN0aW9uLiAKLS8vCSAqIFVuY29tbWVudCB0aGlzIGNvZGUsIG9uY2UgYWxsIHRoZSBwbGFjZSBpc0VuYWJsZWQgQ29kZSBpcyByZW1vdmVkLgotLy8JICovCi0vLwlwdWJsaWMgdm9pZCBzZXRTdGF0ZU1lbnVDb250cmlidXRlSXRlbXMoKXsKLS8vCQkKLS8vCQlMaXN0IGVkaXRQYXJ0cyA9IGdldEdyYXBoaWNhbFZpZXdlcigpLmdldFNlbGVjdGVkRWRpdFBhcnRzKCk7Ci0vLwkJaWYoZWRpdFBhcnRzLnNpemUoKSA9PSAwKXsKLS8vCQkJZ2V0QWN0aW9uUmVnaXN0cnkoKS5nZXRBY3Rpb24oREVMRVRFX0RJQUdSQU0pLnNldEVuYWJsZWQodHJ1ZSk7Ci0vLwkJfQotLy8JCWlmKGVkaXRQYXJ0cy5zaXplKCkgPT0gMSl7Ci0vLwkJCUVkaXRQYXJ0IGVkaXRQYXJ0ID0gKEVkaXRQYXJ0KWVkaXRQYXJ0cy5nZXQoMCk7Ci0vLwkJCWdldEFjdGlvblJlZ2lzdHJ5KCkuZ2V0QWN0aW9uKFNFTEVDVF9MSU5LKS5zZXRFbmFibGVkKHRydWUpOwotLy8JCQlpZiAoZWRpdFBhcnQuZ2V0TW9kZWwoKSBpbnN0YW5jZW9mIFR5cGVkTm9kZSkgewotLy8JCQkJaWYoKChUeXBlZE5vZGUpIGVkaXRQYXJ0LmdldE1vZGVsKCkpLmdldFR5cGUoKSA9PSBUeXBlZE5vZGUuRlJFRV9URVhUKQotLy8JCQkJZ2V0QWN0aW9uUmVnaXN0cnkoKS5nZXRBY3Rpb24oRk9OVF9ESUFMT0cpLnNldEVuYWJsZWQodHJ1ZSk7Ci0vLwkJCQlnZXRBY3Rpb25SZWdpc3RyeSgpLmdldEFjdGlvbihTRUxFQ1RfTElOSykuc2V0RW5hYmxlZChmYWxzZSk7Ci0vLwkJCX0KLS8vCQkJaWYoZWRpdFBhcnQgaW5zdGFuY2VvZiBMaW5rRWRpdFBhcnQpewotLy8JCQkJZ2V0QWN0aW9uUmVnaXN0cnkoKS5nZXRBY3Rpb24oQ1JFQVRFX0JFTkRfUE9JTlQpLnNldEVuYWJsZWQodHJ1ZSk7Ci0vLwkJCQlMaW5rIGxpbmsgPSAoTGluayllZGl0UGFydC5nZXRNb2RlbCgpOwotLy8JCQkJaWYobGluay5nZXRCZW5kcG9pbnRzKCkuc2l6ZSgpID4gMCl7Ci0vLwkJCQkJZ2V0QWN0aW9uUmVnaXN0cnkoKS5nZXRBY3Rpb24oQUxJR05fQkVORF9QT0lOVCkuc2V0RW5hYmxlZCh0cnVlKTsKLS8vCQkJCX0KLS8vCQkJfQotLy8JCQkKLS8vCQl9Ci0vLwkJaWYoZWRpdFBhcnRzLnNpemUoKSA9PSAyKXsKLS8vCQkJZ2V0QWN0aW9uUmVnaXN0cnkoKS5nZXRBY3Rpb24oQ1JFQVRFX0xJTkspLnNldEVuYWJsZWQodHJ1ZSk7IAotLy8JCQlmb3IgKEl0ZXJhdG9yIGl0b3IgPSBlZGl0UGFydHMuaXRlcmF0b3IoKTsgaXRvci5oYXNOZXh0KCk7KSB7Ci0vLwkJCQlPYmplY3QgcGFydCA9IGl0b3IubmV4dCgpOwotLy8JCQkJaWYgKHBhcnQgaW5zdGFuY2VvZiBGcmVlVGV4dEVkaXRQYXJ0KQotLy8JCQkJCWdldEFjdGlvblJlZ2lzdHJ5KCkuZ2V0QWN0aW9uKENSRUFURV9MSU5LKS5zZXRFbmFibGVkKGZhbHNlKTsKLS8vCQkJfQotLy8JCX0KLS8vCX0KLQkKLS8vCXB1YmxpYyB2b2lkIHNldEZvY3VzKCkgewotLy8JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLS8vCQlzdXBlci5zZXRGb2N1cygpOwotLy8JCS8vIFJlZnJlc2ggaXMgZXhwZW5zaXZlIG9wZXJhdGlvbi4KLS8vCQkvLyBUT0RPIC0gZmluZCBwcm9jZXNzIHNvbHV0aW9uIGZvciBub3RpZmljYXRpb24gYmV0d2VlbiAKLS8vCQkvLyBiYXNlIGRpYWdyYW0gYW5kIGV4dGVuZCBkaWFncmFtLiAgICAgCi0vLwkJTWV0aG9kRWxlbWVudCBlbGVtZW50ID0gZ2V0TWV0aG9kRWxlbWVudEZyb21JbnB1dCgpOwotLy8JCWlmKCgoRGlhZ3JhbSllZGl0UGFydC5nZXRNb2RlbCgpKS5pc1JlYWRPbmx5KCkpewotLy8JCQlnZXRBY3Rpb25SZWdpc3RyeSgpLmdldEFjdGlvbihSRUZSRVNIKS5ydW4oKTsKLS8vCQl9Ci0vLwkJZWxzZSBpZihlbGVtZW50IGluc3RhbmNlb2YgVmFyaWFiaWxpdHlFbGVtZW50KXsKLS8vCQkJaWYoKChWYXJpYWJpbGl0eUVsZW1lbnQpZWxlbWVudCkuZ2V0VmFyaWFiaWxpdHlUeXBlKCkgIT0gbnVsbCl7Ci0vLwkJCQlpZighKChWYXJpYWJpbGl0eUVsZW1lbnQpZWxlbWVudCkuZ2V0VmFyaWFiaWxpdHlUeXBlKCkuZXF1YWxzKFZhcmlhYmlsaXR5VHlwZS5OQV9MSVRFUkFMKSl7Ci0vLwkJCQkJZ2V0QWN0aW9uUmVnaXN0cnkoKS5nZXRBY3Rpb24oUkVGUkVTSCkucnVuKCk7Ci0vLwkJCQl9Ci0vLwkJCX0KLS8vCQkJCQotLy8JCX0KLS8vCX0KLQkKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2VkaXRvcnMvQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9yLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2VkaXRvcnMvQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmY2FjYTQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9lZGl0b3JzL0FjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9yczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZWRpdC5BY3Rpdml0eURldGFpbERpYWdyYW1FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0LkFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRQYXJ0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0LkRpYWdyYW1VcGRhdGVTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQuRnJlZVRleHROb2RlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYudXRpbC5EaWFncmFtVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYudXRpbC5UZW1wbGF0ZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkRpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTW9kZWxGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5hbWVkTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Sb2xlVGFza0NvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC51dGlsLklBZGFwdGVyRmFjdG9yeUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLlByb2Nlc3NDb25maWd1cmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuQ29uZmlndXJhYmxlQ29tcG9zZWRBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuU3VwcHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5SZXNvdXJjZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5wYWxldHRlLkNvbWJpbmVkVGVtcGxhdGVDcmVhdGlvbkVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5wYWxldHRlLk1hcnF1ZWVUb29sRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnBhbGV0dGUuUGFsZXR0ZUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucGFsZXR0ZS5QYWxldHRlR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnBhbGV0dGUuUGFsZXR0ZVJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnBhbGV0dGUuUGFubmluZ1NlbGVjdGlvblRvb2xFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucGFsZXR0ZS5Ub29sRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLkNyZWF0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudU1hbmFnZXI7Ci0KLQotLyoqCi0gKiBBbiBlZGl0b3IgZm9yIGFjdGl2aXR5IGRldGFpbCBkaWFncmFtCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0b3IgZXh0ZW5kcyBBYnN0cmFjdERpYWdyYW1FZGl0b3IgewotCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVTRVRfRElBR1JBTV9MQVlPVVQgPSAicmVzZXRfZGlhZ3JhbV9sYXlvdXQiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIENyZWF0aW9uRmFjdG9yeSByb2xlTm9kZUNyZWF0aW9uRmFjdG9yeTsKLQotCXByaXZhdGUgQ3JlYXRpb25GYWN0b3J5IHRhc2tOb2RlQ3JlYXRpb25GYWN0b3J5OwotCi0JcHJpdmF0ZSBDcmVhdGlvbkZhY3Rvcnkgd3BkTm9kZUNyZWF0aW9uRmFjdG9yeTsKLQotCXByaXZhdGUgYm9vbGVhbiBpbml0aWFsQ2xlYW5VcCA9IGZhbHNlOwotCXByaXZhdGUgQnJlYWtkb3duQWRhcHRlckZhY3RvcnkgZmFjdG9yeSA9IG51bGw7Ci0KLQkvLyBhIGhhY2sKLQkvKioKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5BYnN0cmFjdERpYWdyYW1FZGl0b3IjY3JlYXRlRWRpdFBhcnRGYWN0b3J5KCkKLQkgKi8KLQlwcm90ZWN0ZWQgRWRpdFBhcnRGYWN0b3J5IGNyZWF0ZUVkaXRQYXJ0RmFjdG9yeSgpIHsKLQkJcmV0dXJuIG5ldyBBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0UGFydEZhY3RvcnkoKTsKLQkJLy8gcmV0dXJuIG5ldyBFZGl0UGFydEZhY3RvcnkoKSB7Ci0JCS8vCi0JCS8vIHB1YmxpYyBFZGl0UGFydCBjcmVhdGVFZGl0UGFydChFZGl0UGFydCBjb250ZXh0LCBPYmplY3QgbW9kZWwpIHsKLQkJLy8gaWYobW9kZWwgaW5zdGFuY2VvZiBBY3Rpdml0eURldGFpbERpYWdyYW0pIHsKLQkJLy8gcmV0dXJuIG5ldyBBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0UGFydCgoQWN0aXZpdHlEZXRhaWxEaWFncmFtKQotCQkvLyBtb2RlbCk7Ci0JCS8vIH0KLQkJLy8gZWxzZSBpZihtb2RlbCBpbnN0YW5jZW9mIFJvbGVUYXNrQ29tcG9zaXRlKSB7Ci0JCS8vIHJldHVybiBuZXcgUm9sZVRhc2tDb21wb3NpdGVFZGl0UGFydCgoUm9sZVRhc2tDb21wb3NpdGUpIG1vZGVsKTsKLQkJLy8gfQotCQkvLyBlbHNlIGlmKG1vZGVsIGluc3RhbmNlb2YgV29ya1Byb2R1Y3RDb21wb3NpdGUpewotCQkvLyByZXR1cm4gbmV3IFdvcmtQcm9kdWN0Q29tcG9zaXRlRWRpdFBhcnQoKFdvcmtQcm9kdWN0Q29tcG9zaXRlKQotCQkvLyBtb2RlbCk7Ci0JCS8vIH0KLQkJLy8gZWxzZSBpZihtb2RlbCBpbnN0YW5jZW9mIFJvbGVOb2RlCi0JCS8vIHx8IG1vZGVsIGluc3RhbmNlb2YgVGFza05vZGUKLQkJLy8gfHwgbW9kZWwgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlCi0JCS8vICkKLQkJLy8gewotCQkvLyByZXR1cm4gbmV3IERlc2NyaXB0b3JOb2RlRWRpdFBhcnQoKE5hbWVkTm9kZSkgbW9kZWwpOwotCQkvLyB9Ci0JCS8vIGVsc2UgaWYobW9kZWwgaW5zdGFuY2VvZiBMaW5rKSB7Ci0JCS8vIHJldHVybiBuZXcgTGlua0VkaXRQYXJ0KChMaW5rKSBtb2RlbCk7Ci0JCS8vIH0KLQkJLy8gaWYobW9kZWwgaW5zdGFuY2VvZiBUeXBlZE5vZGUpIHsKLQkJLy8gVHlwZWROb2RlIG5vZGUgPSAoVHlwZWROb2RlKSBtb2RlbDsKLQkJLy8gc3dpdGNoKG5vZGUuZ2V0VHlwZSgpKSB7Ci0JCS8vIGNhc2UgVHlwZWROb2RlLlNUQVJUOiByZXR1cm4gbmV3IFN0YXJ0Tm9kZUVkaXRQYXJ0KG5vZGUpOwotCQkvLyBjYXNlIFR5cGVkTm9kZS5FTkQ6IHJldHVybiBuZXcgRW5kTm9kZUVkaXRQYXJ0KG5vZGUpOwotCQkvLyBjYXNlIFR5cGVkTm9kZS5ERUNJU0lPTjogcmV0dXJuIG5ldyBEZWNpc2lvbk5vZGVFZGl0UGFydChub2RlKTsKLQkJLy8gY2FzZSBUeXBlZE5vZGUuU1lOQ0hfQkFSOiByZXR1cm4gbmV3IFN5bmNoQmFyTm9kZUVkaXRQYXJ0KG5vZGUpOwotCQkvLyBjYXNlIFR5cGVkTm9kZS5GUkVFX1RFWFQ6IHJldHVybiBuZXcgRnJlZVRleHRFZGl0UGFydChub2RlKTsKLQkJLy8gfQotCQkvLyB9Ci0JCS8vIHJldHVybiBudWxsOwotCQkvLyB9Ci0JCS8vCQkJCi0JCS8vIH07Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLkFic3RyYWN0RGlhZ3JhbUVkaXRvciNjcmVhdGVEaWFncmFtRWRpdFBhcnQoKQotCSAqLwotCXByb3RlY3RlZCBFZGl0UGFydCBjcmVhdGVEaWFncmFtRWRpdFBhcnQoKSB7Ci0JCXJldHVybiBuZXcgQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdFBhcnQoTW9kZWxGYWN0b3J5LmVJTlNUQU5DRQotCQkJCS5jcmVhdGVBY3Rpdml0eURldGFpbERpYWdyYW0oKSk7Ci0JfQotCi0vLwkvKgotLy8JICogKG5vbi1KYXZhZG9jKQotLy8JICogCi0vLwkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5BYnN0cmFjdERpYWdyYW1FZGl0b3IjY3JlYXRlRWRpdFBhcnQoamF2YS5sYW5nLk9iamVjdCkKLS8vCSAqLwotLy8JcHJvdGVjdGVkIEVkaXRQYXJ0IGNyZWF0ZUVkaXRQYXJ0KE9iamVjdCBlKSB7Ci0vLwkJQWN0aXZpdHlEZXRhaWxEaWFncmFtIGRpYWdyYW0gPSBNb2RlbEZhY3RvcnkuZUlOU1RBTkNFCi0vLwkJCQkuY3JlYXRlQWN0aXZpdHlEZXRhaWxEaWFncmFtKCk7Ci0vLwkJZGlhZ3JhbS5zZXRPYmplY3QoZSk7Ci0vLwkJRWRpdFBhcnQgcGFydCA9IG5ldyBBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0UGFydChkaWFncmFtKTsKLS8vCQlwYXJ0LnNldE1vZGVsKGRpYWdyYW0pOwotLy8JCWRpYWdyYW0uYWRkQ29uc3VtZXIodGhpcyk7Ci0vLwkJcmV0dXJuIHBhcnQ7Ci0vLwl9Ci0JCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLkFic3RyYWN0RGlhZ3JhbUVkaXRvciNnZXRQYXJ0TmFtZVByZWZpeCgpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRQYXJ0TmFtZVByZWZpeCgpIHsKLQkJcmV0dXJuIERpYWdyYW1VSVJlc291cmNlcy5BY3Rpdml0eURldGFpbERpYWdyYW1fcHJlZml4OyAKLQl9Ci0KLQlwcm90ZWN0ZWQgUGFsZXR0ZUNvbnRhaW5lciBjcmVhdGVDb250cm9sR3JvdXAoUGFsZXR0ZVJvb3Qgcm9vdCkgewotCQlpbml0aWFsaXplQ3JlYXRpb25GYWN0b3JpZXMoKTsKLQotCQlQYWxldHRlR3JvdXAgY29udHJvbEdyb3VwID0gbmV3IFBhbGV0dGVHcm91cCgiQ29udHJvbCBHcm91cCIpOyAvLyROT04tTkxTLTEkCi0KLQkJTGlzdCBlbnRyaWVzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCVRvb2xFbnRyeSB0b29sID0gbmV3IFBhbm5pbmdTZWxlY3Rpb25Ub29sRW50cnkoRGlhZ3JhbVVJUmVzb3VyY2VzLkFic3RyYWN0RGlhZ3JhbV9TZWxlY3RfdGV4dCwgCi0JCQkJRGlhZ3JhbVVJUmVzb3VyY2VzLkFic3RyYWN0RGlhZ3JhbV9TZWxlY3RfdG9vbHRpcAotCQkpOwotCQl0b29sLnNldFNtYWxsSWNvbihBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKAotCQkJCSJzZWxlY3RfcGFsMTYuZ2lmIikpOyAvLyROT04tTkxTLTEkCi0JCXRvb2wuc2V0TGFyZ2VJY29uKEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoCi0JCQkJInNlbGVjdF9wYWwyNC5naWYiKSk7IC8vJE5PTi1OTFMtMSQKLQkJZW50cmllcy5hZGQodG9vbCk7Ci0JCXJvb3Quc2V0RGVmYXVsdEVudHJ5KHRvb2wpOwotCi0JCXRvb2wgPSBuZXcgTWFycXVlZVRvb2xFbnRyeSgpOwotCQl0b29sLnNldFNtYWxsSWNvbihBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKAotCQkJCSJtYXJxX3BhbDE2LmdpZiIpKTsgLy8kTk9OLU5MUy0xJAotCQl0b29sLnNldExhcmdlSWNvbihBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKAotCQkJCSJtYXJxX3BhbDI0LmdpZiIpKTsgLy8kTk9OLU5MUy0xJAotCQllbnRyaWVzLmFkZCh0b29sKTsKLQotCQlDb21iaW5lZFRlbXBsYXRlQ3JlYXRpb25FbnRyeSBjb21iaW5lZCA9IG5ldyBDb21iaW5lZFRlbXBsYXRlQ3JlYXRpb25FbnRyeSgKLQkJCQlEaWFncmFtVUlSZXNvdXJjZXMuQWJzdHJhY3REaWFncmFtX0ZyZWVUZXh0X3RleHQsIAotCQkJCURpYWdyYW1VSVJlc291cmNlcy5BYnN0cmFjdERpYWdyYW1fRnJlZVRleHRfdG9vbHRpcCwgCi0JCQkJVGVtcGxhdGVDb25zdGFudHMuRlJFRV9URVhULCBmcmVlVHh0Tm9kZUNyZWF0aW9uRmFjdG9yeSwKLQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKAotCQkJCQkJImZyZWV0ZXh0X3BhbDE2LmdpZiIpLCAvLyROT04tTkxTLTEkCi0JCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcigKLQkJCQkJCSJmcmVldGV4dF9wYWwyNC5naWYiKS8vJE5PTi1OTFMtMSQKLQkJKTsKLQkJZW50cmllcy5hZGQoY29tYmluZWQpOwotCi0JCWNvbnRyb2xHcm91cC5hZGRBbGwoZW50cmllcyk7Ci0JCXJldHVybiBjb250cm9sR3JvdXA7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUNyZWF0aW9uRmFjdG9yaWVzKCkgewotCQlzdXBlci5pbml0aWFsaXplQ3JlYXRpb25GYWN0b3JpZXMoKTsKLQotCQlpZiAocm9sZU5vZGVDcmVhdGlvbkZhY3RvcnkgPT0gbnVsbCkgewotCQkJcm9sZU5vZGVDcmVhdGlvbkZhY3RvcnkgPSBuZXcgQ3JlYXRpb25GYWN0b3J5KCkgewotCi0JCQkJcHVibGljIE9iamVjdCBnZXROZXdPYmplY3QoKSB7Ci0JCQkJCVJvbGVUYXNrQ29tcG9zaXRlIG5vZGUgPSBNb2RlbEZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJCQkJLmNyZWF0ZVJvbGVUYXNrQ29tcG9zaXRlKCk7Ci0JCQkJCURpYWdyYW0gZGlhZ3JhbSA9IChEaWFncmFtKSBlZGl0UGFydC5nZXRNb2RlbCgpOwotCQkJCQlub2RlLnNldFVNQURpYWdyYW0oZGlhZ3JhbS5nZXRVTUFEaWFncmFtKCkpOwotCQkJCQlub2RlLnNldE9iamVjdChVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVSb2xlRGVzY3JpcHRvcigpKTsKLQkJCQkJcmV0dXJuIG5vZGU7Ci0JCQkJfQotCi0JCQkJcHVibGljIE9iamVjdCBnZXRPYmplY3RUeXBlKCkgewotCQkJCQlyZXR1cm4gVGVtcGxhdGVDb25zdGFudHMuUk9MRV9ERVNDUklQVE9SOwotCQkJCX0KLQotCQkJfTsKLQkJfQotCQlDcmVhdGlvbkZhY3RvcnkgY3JlYXRpb25GYWN0b3J5ID0gcm9sZU5vZGVDcmVhdGlvbkZhY3Rvcnk7Ci0JCXRlbXBsYXRlTmFtZVRvQ3JlYXRpb25GYWN0b3J5TWFwLnB1dChjcmVhdGlvbkZhY3RvcnkuZ2V0T2JqZWN0VHlwZSgpLAotCQkJCWNyZWF0aW9uRmFjdG9yeSk7Ci0KLQkJaWYgKHRhc2tOb2RlQ3JlYXRpb25GYWN0b3J5ID09IG51bGwpIHsKLQkJCXRhc2tOb2RlQ3JlYXRpb25GYWN0b3J5ID0gbmV3IENyZWF0aW9uRmFjdG9yeSgpIHsKLQotCQkJCXB1YmxpYyBPYmplY3QgZ2V0TmV3T2JqZWN0KCkgewotCQkJCQlOYW1lZE5vZGUgbm9kZSA9IE1vZGVsRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlVGFza05vZGUoKTsKLQkJCQkJRGlhZ3JhbSBkaWFncmFtID0gKERpYWdyYW0pIGVkaXRQYXJ0LmdldE1vZGVsKCk7Ci0JCQkJCW5vZGUuc2V0VU1BRGlhZ3JhbShkaWFncmFtLmdldFVNQURpYWdyYW0oKSk7Ci0JCQkJCW5vZGUuc2V0T2JqZWN0KFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVRhc2tEZXNjcmlwdG9yKCkpOwotCQkJCQlyZXR1cm4gbm9kZTsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgT2JqZWN0IGdldE9iamVjdFR5cGUoKSB7Ci0JCQkJCXJldHVybiBUZW1wbGF0ZUNvbnN0YW50cy5UQVNLX0RFU0NSSVBUT1I7Ci0JCQkJfQotCi0JCQl9OwotCQl9Ci0JCWNyZWF0aW9uRmFjdG9yeSA9IHRhc2tOb2RlQ3JlYXRpb25GYWN0b3J5OwotCQl0ZW1wbGF0ZU5hbWVUb0NyZWF0aW9uRmFjdG9yeU1hcC5wdXQoY3JlYXRpb25GYWN0b3J5LmdldE9iamVjdFR5cGUoKSwKLQkJCQljcmVhdGlvbkZhY3RvcnkpOwotCi0JCWlmICh3cGROb2RlQ3JlYXRpb25GYWN0b3J5ID09IG51bGwpIHsKLQkJCXdwZE5vZGVDcmVhdGlvbkZhY3RvcnkgPSBuZXcgQ3JlYXRpb25GYWN0b3J5KCkgewotCi0JCQkJcHVibGljIE9iamVjdCBnZXROZXdPYmplY3QoKSB7Ci0JCQkJCU5hbWVkTm9kZSBub2RlID0gTW9kZWxGYWN0b3J5LmVJTlNUQU5DRQotCQkJCQkJCS5jcmVhdGVXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlKCk7Ci0JCQkJCURpYWdyYW0gZGlhZ3JhbSA9IChEaWFncmFtKSBlZGl0UGFydC5nZXRNb2RlbCgpOwotCQkJCQlub2RlLnNldFVNQURpYWdyYW0oZGlhZ3JhbS5nZXRVTUFEaWFncmFtKCkpOwotCQkJCQlub2RlLnNldE9iamVjdChVbWFGYWN0b3J5LmVJTlNUQU5DRQotCQkJCQkJCS5jcmVhdGVXb3JrUHJvZHVjdERlc2NyaXB0b3IoKSk7Ci0JCQkJCXJldHVybiBub2RlOwotCQkJCX0KLQotCQkJCXB1YmxpYyBPYmplY3QgZ2V0T2JqZWN0VHlwZSgpIHsKLQkJCQkJcmV0dXJuIFRlbXBsYXRlQ29uc3RhbnRzLlRBU0tfREVTQ1JJUFRPUjsKLQkJCQl9Ci0KLQkJCX07Ci0JCX0KLQkJY3JlYXRpb25GYWN0b3J5ID0gd3BkTm9kZUNyZWF0aW9uRmFjdG9yeTsKLQkJdGVtcGxhdGVOYW1lVG9DcmVhdGlvbkZhY3RvcnlNYXAucHV0KGNyZWF0aW9uRmFjdG9yeS5nZXRPYmplY3RUeXBlKCksCi0JCQkJY3JlYXRpb25GYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBFZGl0b3IgSW5wdXQKLQkgKgotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2xhc3MgRWRpdG9ySW5wdXQgZXh0ZW5kcyBCcmVha2Rvd25FbGVtZW50RWRpdG9ySW5wdXQgewotCi0JCS8qKgotCQkgKiBAcGFyYW0gZQotCQkgKi8KLQkJcHVibGljIEVkaXRvcklucHV0KE9iamVjdCBlLCBTdXBwcmVzc2lvbiBzdXBwcmVzc2lvbikgewotCQkJc3VwZXIoZSwgc3VwcHJlc3Npb24pOwotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBTZXQgZm9jdXMgb24gdGhlIGVkaXRvcgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZ2VmLnVpLnBhcnRzLkdyYXBoaWNhbEVkaXRvciNzZXRGb2N1cygpCi0JICovCi0JcHVibGljIHZvaWQgc2V0Rm9jdXMoKSB7Ci0JCXN1cGVyLnNldEZvY3VzKCk7Ci0JCWdldEdyYXBoaWNhbFZpZXdlcigpLmdldENvbnRlbnRzKCkucmVmcmVzaCgpOwotCQlpZiAoIWluaXRpYWxDbGVhblVwKSB7Ci0JCQljbGVhblVwRGlhZ3JhbSgpOwotCQkJaW5pdGlhbENsZWFuVXAgPSB0cnVlOwotCQkJLy8gTG9ja2VkIFBsdWdpbiBjYXNlOiBEaXNwbGF5IGdlbmVyYXRlZCBBREQgZGlhZ3JhbSwgUGVybWlzc2lvbiBkZW5pZWQgdG8gc2F2ZSwgIAotCQkJLy8gYW5kIE5vIGRpcnR5IGZsYWcgb24gZWRpdG9yLiAKLQkJCWlmKFRuZ1V0aWwuaXNMb2NrZWQoZ2V0TWV0aG9kRWxlbWVudEZyb21JbnB1dCgpKSl7Ci0JCQkJLy8gRmx1c2ggYWxsIGNvbW1hbmRzLCBtZWFucyB3aWxsIG5vdCBzYXZlLgotCQkJCWdldENvbW1hbmRTdGFjaygpLmZsdXNoKCk7Ci0JCQkJLy8gRmlyZSBkaXJ0eSBmbGFnIHByb3BlcnR5IGNoYW5nZSwgbm8gZGlydHkgZmxhZyBvbiBlZGl0b3IuCi0JCQkJZmlyZVByb3BlcnR5Q2hhbmdlKFBST1BfRElSVFkpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREaWFncmFtVHlwZSgpIHsKLQkJcmV0dXJuIFJlc291cmNlSGVscGVyLkRJQUdSQU1fVFlQRV9BQ1RJVklUWV9ERVRBSUw7Ci0JfQotCi0JLyoqCi0JICogQ2xlYW4gZGlhZ3JhbQotCSAqCi0JICovCi0JcHVibGljIHZvaWQgY2xlYW5VcERpYWdyYW0oKSB7Ci0vLwkJTWV0aG9kRWxlbWVudCBvYmogPSAoKE1ldGhvZEVsZW1lbnRFZGl0b3JJbnB1dCkgZ2V0RWRpdG9ySW5wdXQoKSkKLS8vCQkJCS5nZXRNZXRob2RFbGVtZW50KCk7Ci0JCURpYWdyYW1VcGRhdGVTZXJ2aWNlIHNlcnZpY2UgPSBuZXcgRGlhZ3JhbVVwZGF0ZVNlcnZpY2UoCi0JCQkJZ2V0R3JhcGhpY2FsVmlld2VyKCksIGdldEVkaXREb21haW4oKSwgZ2V0QWN0aW9uUmVnaXN0cnkoKSk7Ci0JCXNlcnZpY2UuY2xlYW5VcERpYWdyYW0oKTsKLQkJLy8gaWYgKFRuZ1V0aWwuaXNHZW5lcmFsaXplcihvYmosCi0JCS8vIGdldEV4dGVuZEFuZENvbnRyaWJ1dGVWYXJpYWJpbGl0eVR5cGVzKCkpCi0JCS8vICYmICFpbml0aWFsQ2xlYW5VcCkgewotCQkvLyBpbml0aWFsQ2xlYW5VcCA9IHRydWU7Ci0JCS8vIElBY3Rpb24gcmVzZXQgPSBnZXRBY3Rpb25SZWdpc3RyeSgpLmdldEFjdGlvbigKLQkJLy8gQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9yLlJFU0VUX0RJQUdSQU1fTEFZT1VUKTsKLQkJLy8gcmVzZXQucnVuKCk7Ci0JCS8vIGRvU2F2ZShuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJLy8gfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLkFic3RyYWN0RGlhZ3JhbUVkaXRvciNjb250cmlidXRlVG9Db250ZXh0TWVudShvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVNYW5hZ2VyKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbnRyaWJ1dGVUb0NvbnRleHRNZW51KElNZW51TWFuYWdlciBtZW51KSB7Ci0JCXN1cGVyLmNvbnRyaWJ1dGVUb0NvbnRleHRNZW51KG1lbnUpOwotCi0JCWJvb2xlYW4gY2FuTW9kaWZ5ID0gIWlzUmVhZE9ubHkoKTsKLQotCQlJQWN0aW9uIGFjdGlvbiA9IGdldEFjdGlvblJlZ2lzdHJ5KCkuZ2V0QWN0aW9uKFJFU0VUX0RJQUdSQU1fTEFZT1VUKTsKLQkJaWYgKGFjdGlvbi5pc0VuYWJsZWQoKSAmJiBjYW5Nb2RpZnkpIHsKLQkJCW1lbnUuaW5zZXJ0QmVmb3JlKERFTEVURV9ESUFHUkFNLCBhY3Rpb24pOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuQWJzdHJhY3REaWFncmFtRWRpdG9yI2NyZWF0ZUFjdGlvbnMoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUFjdGlvbnMoKSB7Ci0JCXN1cGVyLmNyZWF0ZUFjdGlvbnMoKTsKLQkJQWN0aW9uIHJlc2V0TGF5b3V0QWN0aW9uID0gbmV3IEFjdGlvbigKLQkJCQlEaWFncmFtVUlSZXNvdXJjZXMuQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9yX1Jlc2V0RGlhZ3JhbUxheW91dF90ZXh0KSB7IAotCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJZ2V0QWN0aW9uUmVnaXN0cnkoKS5nZXRBY3Rpb24oUkVGUkVTSCkucnVuKCk7Ci0JCQkJaWYgKGdldEdyYXBoaWNhbFZpZXdlcigpLmdldENvbnRlbnRzKCkgaW5zdGFuY2VvZiBBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0UGFydCkgewotCQkJCQlBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0UGFydCBkZXAgPSAoQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdFBhcnQpIGdldEdyYXBoaWNhbFZpZXdlcigpCi0JCQkJCQkJLmdldENvbnRlbnRzKCk7Ci0JCQkJCUxpc3QgbG9jYWwgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCWlmKGRlcC5nZXRDaGlsZHJlbigpICE9IG51bGwgJiYgIWRlcC5nZXRDaGlsZHJlbigpLmlzRW1wdHkoKSl7Ci0JCQkJCQlmb3IoSXRlcmF0b3IgaXRlcmF0b3IgPSBkZXAuZ2V0Q2hpbGRyZW4oKS5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KXsKLQkJCQkJCQlPYmplY3QgbmV4dCA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJCQlpZighKG5leHQgaW5zdGFuY2VvZiBGcmVlVGV4dE5vZGVFZGl0UGFydCkpewotCQkJCQkJCQlsb2NhbC5hZGQobmV4dCk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWRlcC5nZXRSZWNlbnRseUFkZGVkUGFydHMoKS5hZGRBbGwobG9jYWwpOwotCQkJCQljbGVhblVwRGlhZ3JhbSgpOwotCQkJCX0KLQkJCX0KLQotCQkJcHVibGljIGJvb2xlYW4gaXNFbmFibGVkKCkgewotCQkJCXJldHVybiBnZXRHcmFwaGljYWxWaWV3ZXIoKS5nZXRTZWxlY3RlZEVkaXRQYXJ0cygpLnNpemUoKSA9PSAwOwotCQkJfQotCi0JCQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQkJCXJldHVybiBSRVNFVF9ESUFHUkFNX0xBWU9VVDsKLQkJCX0KLQotCQl9OwotCQlnZXRBY3Rpb25SZWdpc3RyeSgpLnJlZ2lzdGVyQWN0aW9uKHJlc2V0TGF5b3V0QWN0aW9uKTsKLQl9Ci0KLS8vCXByaXZhdGUgc3RhdGljIENvbGxlY3Rpb24gZXh0ZW5kQW5kQ29udHJpYnV0ZVZhcmlhYmlsaXR5VHlwZXMgPSBudWxsOwotCi0vLwlwcml2YXRlIHN0YXRpYyBDb2xsZWN0aW9uIGdldEV4dGVuZEFuZENvbnRyaWJ1dGVWYXJpYWJpbGl0eVR5cGVzKCkgewotLy8JCWlmIChleHRlbmRBbmRDb250cmlidXRlVmFyaWFiaWxpdHlUeXBlcyA9PSBudWxsKSB7Ci0vLwkJCWV4dGVuZEFuZENvbnRyaWJ1dGVWYXJpYWJpbGl0eVR5cGVzID0gbmV3IEFycmF5TGlzdCgpOwotLy8JCQlleHRlbmRBbmRDb250cmlidXRlVmFyaWFiaWxpdHlUeXBlcwotLy8JCQkJCS5hZGQoVmFyaWFiaWxpdHlUeXBlLkVYVEVORFNfTElURVJBTCk7Ci0vLwkJCWV4dGVuZEFuZENvbnRyaWJ1dGVWYXJpYWJpbGl0eVR5cGVzCi0vLwkJCQkJLmFkZChWYXJpYWJpbGl0eVR5cGUuQ09OVFJJQlVURVNfTElURVJBTCk7Ci0vLwkJfQotLy8JCXJldHVybiBleHRlbmRBbmRDb250cmlidXRlVmFyaWFiaWxpdHlUeXBlczsKLS8vCX0KLQkKLQkvKioKLQkgKiBCcmVhayBkb3duIGFkYXB0ZXIgZmFjdG9yeSBjbGFzcwotCSAqLwotCXB1YmxpYyBjbGFzcyBCcmVha2Rvd25BZGFwdGVyRmFjdG9yeQotCXsKLQkJcHVibGljIENvbmZpZ3VyYWJsZUNvbXBvc2VkQWRhcHRlckZhY3Rvcnkgd2JzQWRhcHRlckZhY3RvcnkgPSBudWxsOwotCQlwdWJsaWMgQ29uZmlndXJhYmxlQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSB0YnNBZGFwdGVyRmFjdG9yeSA9IG51bGw7Ci0JCXB1YmxpYyBDb25maWd1cmFibGVDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IHdwYnNBZGFwdGVyRmFjdG9yeSA9IG51bGw7Ci0JCXB1YmxpYyBDb25maWd1cmFibGVDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IGNic0FkYXB0ZXJGYWN0b3J5ID0gbnVsbDsKLQotCQlwdWJsaWMgQnJlYWtkb3duQWRhcHRlckZhY3RvcnkoTWV0aG9kQ29uZmlndXJhdGlvbiBtZXRob2RDb25maWcpCi0JCXsKLQkJCS8vIGNyZWF0ZSBhZGFwdCBmYWN0b3JpZXMKLQkJCXdic0FkYXB0ZXJGYWN0b3J5ID0gKENvbmZpZ3VyYWJsZUNvbXBvc2VkQWRhcHRlckZhY3RvcnkpIFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCS5jcmVhdGVXQlNDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KCk7Ci0JCQl0YnNBZGFwdGVyRmFjdG9yeSA9IChDb25maWd1cmFibGVDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KSBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkuY3JlYXRlVEJTQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpOwotCQkJd3Bic0FkYXB0ZXJGYWN0b3J5ID0gKENvbmZpZ3VyYWJsZUNvbXBvc2VkQWRhcHRlckZhY3RvcnkpIFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCS5jcmVhdGVXUEJTQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpOwotCQkJY2JzQWRhcHRlckZhY3RvcnkgPSAoQ29uZmlndXJhYmxlQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSkgVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJLmNyZWF0ZVByb2Nlc3NDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KCk7Ci0KLQkJCS8vIHNldCBjb25maWd1cmF0aW9uIGZpbHRlcgotCQkJRGlhZ3JhbUFkYXB0ZXJGYWN0b3J5RmlsdGVyIGNvbmZpZ3VyYXRvciA9IG5ldyBEaWFncmFtQWRhcHRlckZhY3RvcnlGaWx0ZXIoCi0JCQkJCW1ldGhvZENvbmZpZywgdGhpcyk7Ci0KLQkJCXdic0FkYXB0ZXJGYWN0b3J5LnNldEZpbHRlcihjb25maWd1cmF0b3IpOwotCQkJdGJzQWRhcHRlckZhY3Rvcnkuc2V0RmlsdGVyKGNvbmZpZ3VyYXRvcik7Ci0JCQl3cGJzQWRhcHRlckZhY3Rvcnkuc2V0RmlsdGVyKGNvbmZpZ3VyYXRvcik7Ci0JCQljYnNBZGFwdGVyRmFjdG9yeS5zZXRGaWx0ZXIoY29uZmlndXJhdG9yKTsJCX0KLQkJCi0JCXB1YmxpYyB2b2lkIGNsZWFyKCkKLQkJewotCQkJaWYgKHdic0FkYXB0ZXJGYWN0b3J5ICE9IG51bGwpIHsKLQkJCQl3YnNBZGFwdGVyRmFjdG9yeS5kaXNwb3NlKCk7Ci0JCQkJd2JzQWRhcHRlckZhY3RvcnkgPSBudWxsOwotCQkJfQotCi0JCQlpZiAodGJzQWRhcHRlckZhY3RvcnkgIT0gbnVsbCkgewotCQkJCXRic0FkYXB0ZXJGYWN0b3J5LmRpc3Bvc2UoKTsKLQkJCQl0YnNBZGFwdGVyRmFjdG9yeSA9IG51bGw7Ci0JCQl9Ci0KLQkJCWlmICh3cGJzQWRhcHRlckZhY3RvcnkgIT0gbnVsbCkgewotCQkJCXdwYnNBZGFwdGVyRmFjdG9yeS5kaXNwb3NlKCk7Ci0JCQkJd3Bic0FkYXB0ZXJGYWN0b3J5ID0gbnVsbDsKLQkJCX0KLQotCQkJaWYgKGNic0FkYXB0ZXJGYWN0b3J5ICE9IG51bGwpIHsKLQkJCQljYnNBZGFwdGVyRmFjdG9yeS5kaXNwb3NlKCk7Ci0JCQkJY2JzQWRhcHRlckZhY3RvcnkgPSBudWxsOwotCQkJfQotCQl9Ci0JfQotCQotCS8qKgotCSAqIERpYWdyYW0gQWRhcHRlciBmYWN0b3J5IGZpbHRlcgotCSAqCi0JICovCi0JcHVibGljIGNsYXNzIERpYWdyYW1BZGFwdGVyRmFjdG9yeUZpbHRlciBleHRlbmRzIFByb2Nlc3NDb25maWd1cmF0b3IKLQkJCWltcGxlbWVudHMgSUFkYXB0ZXJGYWN0b3J5RmlsdGVyIHsKLQotCQlwcml2YXRlIEFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvci5CcmVha2Rvd25BZGFwdGVyRmFjdG9yeSBmYWN0b3J5OwotCi0JCS8qCi0JCSAqIENyZWF0ZSBhbiBpbnN0YW5jZQotCQkgKi8KLQkJcHVibGljIERpYWdyYW1BZGFwdGVyRmFjdG9yeUZpbHRlcihNZXRob2RDb25maWd1cmF0aW9uIG1ldGhvZENvbmZpZywKLQkJCQlBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0b3IuQnJlYWtkb3duQWRhcHRlckZhY3RvcnkgZmFjdG9yeSkgewotCQkJc3VwZXIobWV0aG9kQ29uZmlnKTsKLQkJCXRoaXMuZmFjdG9yeSA9IGZhY3Rvcnk7Ci0JCX0KLQotCQkvKioKLQkJICogUmV0dXJuIFdCUyBBZGFwdGVyIEZhY3RvcnkKLQkJICovCi0JCXB1YmxpYyBBZGFwdGVyRmFjdG9yeSBnZXRXQlNBZGFwdGVyRmFjdG9yeSgpIHsKLQkJCXJldHVybiBmYWN0b3J5Lndic0FkYXB0ZXJGYWN0b3J5OwotCQl9Ci0KLQkJLyoqCi0JCSAqIFJldHVybiBUZWFtIEFsbG9jYXRpb24gQWRhcHRlciBGYWN0b3J5Ci0JCSAqLwotCQlwdWJsaWMgQWRhcHRlckZhY3RvcnkgZ2V0VEJTQWRhcHRlckZhY3RvcnkoKSB7Ci0JCQlyZXR1cm4gZmFjdG9yeS50YnNBZGFwdGVyRmFjdG9yeTsKLQkJfQotCi0JCS8qKgotCQkgKiBSZXR1cm4gV1AgVXNhZ2UgQWRhcHRlciBGYWN0b3J5Ci0JCSAqLwotCQlwdWJsaWMgQWRhcHRlckZhY3RvcnkgZ2V0V1BCU0FkYXB0ZXJGYWN0b3J5KCkgewotCQkJcmV0dXJuIGZhY3Rvcnkud3Bic0FkYXB0ZXJGYWN0b3J5OwotCQl9Ci0KLQkJLyoqCi0JCSAqIFJldHVybiBjb25zb2xpZGF0ZWQgdmlldyBhZGFwdGVyIGZhY3RvcnkKLQkJICovCi0JCXB1YmxpYyBBZGFwdGVyRmFjdG9yeSBnZXRDQlNBZGFwdGVyRmFjdG9yeSgpIHsKLQkJCXJldHVybiBmYWN0b3J5LmNic0FkYXB0ZXJGYWN0b3J5OwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gYWNjZXB0KE9iamVjdCBvYmopIHsKLQkJCXJldHVybiBzdXBlci5hY2NlcHQob2JqKTsKLQkJfQotCX0KLQkKLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLkFic3RyYWN0RGlhZ3JhbUVkaXRvciNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlpZihmYWN0b3J5ICE9IG51bGwpewotCQkJZmFjdG9yeS5jbGVhcigpOwotCQl9Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZWRpdG9ycy9CcmVha2Rvd25FbGVtZW50RWRpdG9ySW5wdXQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZWRpdG9ycy9CcmVha2Rvd25FbGVtZW50RWRpdG9ySW5wdXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDMzMGU5OC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2VkaXRvcnMvQnJlYWtkb3duRWxlbWVudEVkaXRvcklucHV0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlN1cHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLQotCi0vKioKLSAqIEJyZWFrZG93biBFbGVtZW50IGlucHV0IGZvciBhbiBlZGl0b3IKLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUgLSBPY3QgNywgMjAwNQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQnJlYWtkb3duRWxlbWVudEVkaXRvcklucHV0IGV4dGVuZHMgTWV0aG9kRWxlbWVudEVkaXRvcklucHV0IHsKLQotCXByaXZhdGUgU3VwcHJlc3Npb24gc3VwcHJlc3Npb247Ci0KLQlwcml2YXRlIEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyIHdyYXBwZXI7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlCi0JICogQHBhcmFtIG9iamVjdAotCSAqLwotCXB1YmxpYyBCcmVha2Rvd25FbGVtZW50RWRpdG9ySW5wdXQoT2JqZWN0IG9iamVjdCwgU3VwcHJlc3Npb24gc3VwcHJlc3Npb24pIHsKLQkJc3VwZXIoKE1ldGhvZEVsZW1lbnQpIFRuZ1V0aWwudW53cmFwKG9iamVjdCkpOwotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIHsKLQkJCXdyYXBwZXIgPSAoQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIG9iamVjdDsKLQkJfQotCQl0aGlzLnN1cHByZXNzaW9uID0gc3VwcHJlc3Npb247Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBzdXBwcmVzc2lvbi4KLQkgKi8KLQlwdWJsaWMgU3VwcHJlc3Npb24gZ2V0U3VwcHJlc3Npb24oKSB7Ci0JCXJldHVybiBzdXBwcmVzc2lvbjsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIHdyYXBwZXIuCi0JICovCi0JcHVibGljIEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyIGdldFdyYXBwZXIoKSB7Ci0JCXJldHVybiB3cmFwcGVyOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLk1ldGhvZEVsZW1lbnRFZGl0b3JJbnB1dCNlcXVhbHMoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotCQlpZiAodGhpcyA9PSBvYmopCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJaWYgKGdldENsYXNzKCkuaXNJbnN0YW5jZShvYmopKSB7Ci0JCQlCcmVha2Rvd25FbGVtZW50RWRpdG9ySW5wdXQgb3RoZXIgPSAoQnJlYWtkb3duRWxlbWVudEVkaXRvcklucHV0KSBvYmo7Ci0JCQlyZXR1cm4gZ2V0TWV0aG9kRWxlbWVudCgpID09IG90aGVyLmdldE1ldGhvZEVsZW1lbnQoKQotCQkJCQkmJiBzdXBwcmVzc2lvbi5nZXRQcm9jZXNzKCkgPT0gb3RoZXIuZ2V0U3VwcHJlc3Npb24oKQotCQkJCQkJCS5nZXRQcm9jZXNzKCk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCQlpbnQgcmVzdWx0ID0gc3VwZXIuaGFzaENvZGUoKTsKLQkJcmVzdWx0IF49IHN1cHByZXNzaW9uLmdldFByb2Nlc3MoKS5oYXNoQ29kZSgpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZWRpdG9ycy9Db2x1bW5EZXNjcmlwdG9yLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2VkaXRvcnMvQ29sdW1uRGVzY3JpcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMGIzMmMzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZWRpdG9ycy9Db2x1bW5EZXNjcmlwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnM7Ci0KLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci0KLS8qKgotICogQ29sdW1uIGRlc2NyaXB0b3JzIHVzZWQgZm9yIHByb2Nlc3MgZWRpdG9ycwotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQ29sdW1uRGVzY3JpcHRvciBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAzMjU2NzE4NDc2OTg1OTcwOTk3TDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENFTExfRURJVE9SX1RZUEVfTk9ORSA9IDA7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDRUxMX0VESVRPUl9UWVBFX1RFWFQgPSAxOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0VMTF9FRElUT1JfVFlQRV9DT01CT19CT09MRUFOID0gMjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENFTExfRURJVE9SX1RZUEVfQ0hFQ0tfQk9PTEVBTiA9IDM7Ci0KLQlwdWJsaWMgU3RyaW5nIGlkOwotCi0JcHVibGljIFN0cmluZyBsYWJlbDsKLQotCXB1YmxpYyBpbnQgd2lkdGg7Ci0KLQlwdWJsaWMgYm9vbGVhbiByZXNpemFibGU7Ci0KLQlwdWJsaWMgaW50IGNlbGxFZGl0b3JUeXBlOwotCi0JcHVibGljIGludCB3ZWlnaHQ7Ci0KLQlwdWJsaWMgaW50IGFsaWdubWVudDsKLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBpZAotCSAqIAkJCUlEIG9mIHRoZSBjb2x1bW4KLQkgKiBAcGFyYW0gbGFiZWwKLQkgKiAJCQlDb2x1bW4gTmFtZQotCSAqIEBwYXJhbSB3ZWlnaHQKLQkgKiAJCQlDb2x1bW4gd2VpZ2h0Ci0JICogQHBhcmFtIHdpZHRoCi0JICogCQkJQ29sdW1uIFdpZHRoCi0JICogQHBhcmFtIHJlc2l6YWJsZQotCSAqIAkJCUZsYWcgdG8gaW5kaWNhdGUgd2hldGhlciBjb2x1bW4gaXMgcmVzaXphYmxlIG9yIG5vdAotCSAqIEBwYXJhbSBjZWxsRWRpdG9yVHlwZQotCSAqIAkJCUNvbHVtbiBjZWxsIGVkaXRvciB0eXBlCi0JICovCi0JcHVibGljIENvbHVtbkRlc2NyaXB0b3IoU3RyaW5nIGlkLCBTdHJpbmcgbGFiZWwsIGludCB3ZWlnaHQsIGludCB3aWR0aCwKLQkJCWJvb2xlYW4gcmVzaXphYmxlLCBpbnQgY2VsbEVkaXRvclR5cGUpIHsKLQkJdGhpcyhpZCwgbGFiZWwsIHdlaWdodCwgd2lkdGgsIHJlc2l6YWJsZSwgY2VsbEVkaXRvclR5cGUsIFNXVC5MRUZUKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlCi0JICogCi0JICogQHBhcmFtIGlkCi0JICogCQkJSUQgb2YgdGhlIGNvbHVtbgotCSAqIEBwYXJhbSBsYWJlbAotCSAqIAkJCUNvbHVtbiBOYW1lCi0JICogQHBhcmFtIHdlaWdodAotCSAqIAkJCUNvbHVtbiB3ZWlnaHQKLQkgKiBAcGFyYW0gd2lkdGgKLQkgKiAJCQlDb2x1bW4gV2lkdGgKLQkgKiBAcGFyYW0gcmVzaWFibGUKLQkgKiAJCQlGbGFnIHRvIGluZGljYXRlIHdoZXRoZXIgY29sdW1uIGlzIHJlc2l6YWJsZSBvciBub3QKLQkgKiBAcGFyYW0gY2VsbEVkaXRvclR5cGUKLQkgKiAJCQlDb2x1bW4gY2VsbCBlZGl0b3IgdHlwZQotCSAqIEBwYXJhbSBhbGlnbm1lbnQKLQkgKiAJCQlDb2x1bW4gYWxpZ25tZW50Ci0JICovCi0JcHVibGljIENvbHVtbkRlc2NyaXB0b3IoU3RyaW5nIGlkLCBTdHJpbmcgbGFiZWwsIGludCB3ZWlnaHQsIGludCB3aWR0aCwKLQkJCWJvb2xlYW4gcmVzaWFibGUsIGludCBjZWxsRWRpdG9yVHlwZSwgaW50IGFsaWdubWVudCkgewotCQl0aGlzLmlkID0gaWQ7Ci0JCXRoaXMubGFiZWwgPSBsYWJlbDsKLQkJdGhpcy5yZXNpemFibGUgPSByZXNpYWJsZTsKLQkJdGhpcy53ZWlnaHQgPSB3ZWlnaHQ7Ci0JCXRoaXMud2lkdGggPSB3aWR0aDsKLQkJdGhpcy5jZWxsRWRpdG9yVHlwZSA9IGNlbGxFZGl0b3JUeXBlOwotCQl0aGlzLmFsaWdubWVudCA9IGFsaWdubWVudDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZWRpdG9ycy9Db25maWd1cmF0aW9uRWRpdG9yLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2VkaXRvcnMvQ29uZmlndXJhdGlvbkVkaXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNjY5MGVjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZWRpdG9ycy9Db25maWd1cmF0aW9uRWRpdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkNvbmZpZ3VyYXRpb25QYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvdmlkZXJzLkNvbmZpZ3VyYXRpb25FZGl0b3JEZWZhdWx0UGFnZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvdmlkZXJzLklNZXRob2RFbGVtZW50RWRpdG9yUGFnZVByb3ZpZGVyRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5yZWZyZXNoLlJlZnJlc2hKb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLnV0aWwuUGVyc2lzdGVuY2VVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGFydEluaXRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuZWRpdG9yLklGb3JtUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pZGUuSUdvdG9NYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5GaWxlRWRpdG9ySW5wdXQ7Ci0KLQotLyoqCi0gKiBUaGUgTWV0aG9kIENvbmZpZ3VyYXRpb24gZWRpdG9yLgotICogCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBDb25maWd1cmF0aW9uRWRpdG9yIGV4dGVuZHMgTWV0aG9kRWxlbWVudEVkaXRvciBpbXBsZW1lbnRzIElHb3RvTWFya2VyIHsKLQotCS8qKgotCSAqIFRoZSBlZGl0b3IgSUQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRURJVE9SX0lEID0gQ29uZmlndXJhdGlvbkVkaXRvci5jbGFzcy5nZXROYW1lKCk7Ci0JcHJvdGVjdGVkIHN0YXRpYyBJTWV0aG9kRWxlbWVudEVkaXRvclBhZ2VQcm92aWRlckV4dGVuc2lvbiBkZWZhdWx0Q29uZmlnUGFnZVByb3ZpZGVyOwotCi0JQ29uZmlndXJhdGlvblBhZ2UgY29uZmlnUGFnZSA9IG51bGw7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBDb25maWd1cmF0aW9uRWRpdG9yKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGhvZCBjb25maWd1cmF0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGVkaXRvci4KLQkgKi8KLQlwdWJsaWMgTWV0aG9kQ29uZmlndXJhdGlvbiBnZXRDb25maWd1cmF0aW9uKCkgewotCQlyZXR1cm4gKChDb25maWd1cmF0aW9uRWRpdG9ySW5wdXQpIHN1cGVyLmdldEVkaXRvcklucHV0KCkpCi0JCQkJLmdldENvbmZpZ3VyYXRpb24oKTsKLQl9Ci0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBpbml0KElFZGl0b3JTaXRlIHNpdGUsIElFZGl0b3JJbnB1dCBpbnB1dCkgdGhyb3dzIFBhcnRJbml0RXhjZXB0aW9uIHsKLQkJaWYgKGlucHV0IGluc3RhbmNlb2YgRmlsZUVkaXRvcklucHV0KSB7Ci0JCQkvLyBwcm9iYWJseSBvcGVuZWQgZnJvbSBQcm9ibGVtcyBWaWV3Ci0JCQkvLyBjcmVhdGUgYSBDb25maWd1cmF0aW9uRWRpdG9ySW5wdXQKLQkJCVJlc291cmNlIHJlc291cmNlID0gUmVmcmVzaEpvYi5nZXRJbnN0YW5jZSgpLmdldFJlc291cmNlKCgoRmlsZUVkaXRvcklucHV0KWlucHV0KS5nZXRGaWxlKCkpOwotCQkJTWV0aG9kRWxlbWVudCBlbGVtZW50ID0gUGVyc2lzdGVuY2VVdGlsLmdldE1ldGhvZEVsZW1lbnQocmVzb3VyY2UpOwotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RDb25maWd1cmF0aW9uKSB7Ci0JCQkJaW5wdXQgPSBuZXcgQ29uZmlndXJhdGlvbkVkaXRvcklucHV0KChNZXRob2RDb25maWd1cmF0aW9uKWVsZW1lbnQpOwotCQkJfQotCQl9Ci0KLQkJc3VwZXIuaW5pdChzaXRlLCBpbnB1dCk7Ci0JfQotCQotCQotCXByb3RlY3RlZCBJTWV0aG9kRWxlbWVudEVkaXRvclBhZ2VQcm92aWRlckV4dGVuc2lvbiBnZXREZWZhdWx0UGFnZVByb3ZpZGVyKCkgewotCQlpZiAoZGVmYXVsdENvbmZpZ1BhZ2VQcm92aWRlciA9PSBudWxsKSB7Ci0JCQlkZWZhdWx0Q29uZmlnUGFnZVByb3ZpZGVyID0gbmV3IENvbmZpZ3VyYXRpb25FZGl0b3JEZWZhdWx0UGFnZVByb3ZpZGVyKCk7Ci0JCX0KLQkJcmV0dXJuIGRlZmF1bHRDb25maWdQYWdlUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuRm9ybUVkaXRvciNhZGRQYWdlcygpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkUGFnZXMoKSB7Ci0JCS8vIGZpcnN0IGdldCBvcmlnaW5hbCBsaXN0Ci0JCU1hcDxPYmplY3QsU3RyaW5nPiBwYWdlTWFwID0gZ2V0RGVmYXVsdFBhZ2VQcm92aWRlcigpLmdldFBhZ2VzKG5ldyBMaW5rZWRIYXNoTWFwPE9iamVjdCxTdHJpbmc+KCksIHRoaXMsIGVsZW1lbnRPYmopOwotCQkKLQkJLy8gbGV0IGV4dGVuc2lvbnMgbW9kaWZ5Ci0JCUxpc3Q8SU1ldGhvZEVsZW1lbnRFZGl0b3JQYWdlUHJvdmlkZXJFeHRlbnNpb24+IHBhZ2VQcm92aWRlcnMgPSBnZXRBbGxQYWdlUHJvdmlkZXJzKCk7Ci0JCWlmIChwYWdlUHJvdmlkZXJzICE9IG51bGwgJiYgcGFnZVByb3ZpZGVycy5zaXplKCkgPiAwKSB7Ci0JCQlmb3IgKElNZXRob2RFbGVtZW50RWRpdG9yUGFnZVByb3ZpZGVyRXh0ZW5zaW9uIGV4dGVuc2lvbiA6IHBhZ2VQcm92aWRlcnMpIHsKLQkJCQlwYWdlTWFwID0gZXh0ZW5zaW9uLmdldFBhZ2VzKHBhZ2VNYXAsIHRoaXMsIGVsZW1lbnRPYmopOwotCQkJfQotCQl9Ci0JCS8vIG5vdyBhZGQgcGFnZXMKLQkJdHJ5IHsKLQkJCWZvciAoTWFwLkVudHJ5PE9iamVjdCwgU3RyaW5nPiBwYWdlRW50cnkgOiBwYWdlTWFwLmVudHJ5U2V0KCkpIHsKLQkJCQlPYmplY3QgcGFnZSA9IHBhZ2VFbnRyeS5nZXRLZXkoKTsKLQkJCQlTdHJpbmcgbmFtZSA9IHBhZ2VFbnRyeS5nZXRWYWx1ZSgpOwotCQkJCWludCBpbmRleCA9IC0xOwotCQkJCWlmIChwYWdlIGluc3RhbmNlb2YgQ29udHJvbCkgewotCQkJCQlpbmRleCA9IGFkZFBhZ2UoKENvbnRyb2wpcGFnZSk7Ci0JCQkJfSBlbHNlIGlmIChwYWdlIGluc3RhbmNlb2YgSUZvcm1QYWdlKSB7Ci0JCQkJCWluZGV4ID0gYWRkUGFnZSgoSUZvcm1QYWdlKXBhZ2UpOwotCQkJCX0gZWxzZSBpZiAocGFnZSBpbnN0YW5jZW9mIElFZGl0b3JQYXJ0KSB7Ci0JCQkJCWluZGV4ID0gYWRkUGFnZSgoSUVkaXRvclBhcnQpcGFnZSwgZ2V0RWRpdG9ySW5wdXQoKSk7Ci0JCQkJfQotCQkJCWlmIChuYW1lICE9IG51bGwpIHsKLQkJCQkJc2V0UGFnZVRleHQoaW5kZXgsIG5hbWUpOwotCQkJCX0KLQkJCQkKLQkJCQlpZiAocGFnZSBpbnN0YW5jZW9mIENvbmZpZ3VyYXRpb25QYWdlKSB7Ci0JCQkJCWNvbmZpZ1BhZ2UgPSAoQ29uZmlndXJhdGlvblBhZ2UpcGFnZTsKLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIGUpIHsKLQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLk1ldGhvZEVsZW1lbnRFZGl0b3IjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLk1ldGhvZEVsZW1lbnRFZGl0b3IjY3JlYXRlSW5wdXQob3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50KQotCSAqLwotCXByb3RlY3RlZCBJRWRpdG9ySW5wdXQgY3JlYXRlSW5wdXQoTWV0aG9kRWxlbWVudCBlKSB7Ci0JCWlmKGUgaW5zdGFuY2VvZiBNZXRob2RDb25maWd1cmF0aW9uKSB7Ci0JCQlyZXR1cm4gbmV3IENvbmZpZ3VyYXRpb25FZGl0b3JJbnB1dCgoTWV0aG9kQ29uZmlndXJhdGlvbikgZSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXByaXZhdGUgTGlzdDxMaXN0ZW5lcj4gc2V0Rm9jdXNMaXN0ZW5lcnMgPSBuZXcgQXJyYXlMaXN0PExpc3RlbmVyPigpOwotCQotCQotCS8qKgotCSAqIEFkZCBnaXZlbiBsaXN0ZW5lciB0byBsaXN0IG9mIGZvY3VzIGxpc3RlbmVycwotCSAqIEBwYXJhbSBsaXMKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRUb1NldEZvY3VzTGlzZW5lcnMoTGlzdGVuZXIgbGlzKSB7Ci0JCXNldEZvY3VzTGlzdGVuZXJzLmFkZChsaXMpOwotCX0KLQkKLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBhcnQuTXVsdGlQYWdlRWRpdG9yUGFydCNzZXRGb2N1cygpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Rm9jdXMoKSB7ICAgIAkKLSAgICAJRXZlbnQgZSA9IG5ldyBFdmVudCgpOwotICAgIAllLmRhdGEgPSBnZXRBY3RpdmVQYWdlSW5zdGFuY2UoKTsgICAJCi0gICAgCWZvciAoaW50IGk9MDsgaTxzZXRGb2N1c0xpc3RlbmVycy5zaXplKCk7IGkrKykgewotICAgIAkJTGlzdGVuZXIgbGlzID0gKExpc3RlbmVyKSBzZXRGb2N1c0xpc3RlbmVycy5nZXQoaSk7Ci0gICAgCQlsaXMuaGFuZGxlRXZlbnQoZSk7Ci0gICAgCX0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBnb3RvTWFya2VyKElNYXJrZXIgbWFya2VyKSB7Ci0gICAgCS8vIGFjdGl2YXRlIGNvbmZpZyBwYWdlCi0gICAgCXNldEFjdGl2ZVBhZ2UoMSk7Ci0gICAgCWlmIChjb25maWdQYWdlICE9IG51bGwpIHsKLSAgICAJCWNvbmZpZ1BhZ2UuZ290b01hcmtlcihtYXJrZXIpOwotICAgIAl9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIGRvUXVpY2tGaXgoSU1hcmtlciBtYXJrZXIpIHsKLSAgICAJY29uZmlnUGFnZS5kb1F1aWNrRml4KG1hcmtlcik7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9lZGl0b3JzL0NvbmZpZ3VyYXRpb25FZGl0b3JJbnB1dC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9lZGl0b3JzL0NvbmZpZ3VyYXRpb25FZGl0b3JJbnB1dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYjdhZjM3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZWRpdG9ycy9Db25maWd1cmF0aW9uRWRpdG9ySW5wdXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9yczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLnV0aWwuRGlhZ3JhbVVJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLQotCi0vKioKLSAqIEFuIGVkaXRvciBpbnB1dCBmb3IgdGhlIGNvbmZpZ3VyYXRpb24gZWRpdG9yCi0gKiAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBDb25maWd1cmF0aW9uRWRpdG9ySW5wdXQgZXh0ZW5kcyBNZXRob2RFbGVtZW50RWRpdG9ySW5wdXQgewotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZQotCSAqIEBwYXJhbSBjb25maWcKLQkgKi8KLQlwdWJsaWMgQ29uZmlndXJhdGlvbkVkaXRvcklucHV0KE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0JCS8vIG1ldGhvZENvbmZpZ3VyYXRpb24gPSBjb25maWc7Ci0JCXN1cGVyKGNvbmZpZyk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBtZXRob2QgY29uZmlndXJhdGlvbgotCSAqLwotCXB1YmxpYyBNZXRob2RDb25maWd1cmF0aW9uIGdldENvbmZpZ3VyYXRpb24oKSB7Ci0JCS8vIHJldHVybiBtZXRob2RDb25maWd1cmF0aW9uOwotCQlyZXR1cm4gKE1ldGhvZENvbmZpZ3VyYXRpb24pIHN1cGVyLmdldE1ldGhvZEVsZW1lbnQoKTsKLQl9Ci0KLQotCS8qKgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0I2dldFRvb2xUaXBUZXh0KCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRvb2xUaXBUZXh0KCkgewotCQlyZXR1cm4gRGlhZ3JhbVVJUmVzb3VyY2VzLkNvbmZpZ3VyYXRpb25FZGl0b3JJbnB1dF9jb25maWdlZGl0b3IwOyAKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2VkaXRvcnMvRWRpdG9yQ2hvb3Nlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9lZGl0b3JzL0VkaXRvckNob29zZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTA5YjQ2NS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2VkaXRvcnMvRWRpdG9yQ2hvb3Nlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9yczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk11bHRpU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZS5EaWFnbm9zdGljOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnZpZXdzLlZpZXdIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS51dGlsLk1zZ0RpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnBhcnQuRGlhZ3JhbUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUucGFydC5EaWFncmFtRWRpdG9ySW5wdXRQcm94eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuTGlicmFyeVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVpLmVkaXRvcnMuSU1ldGhvZEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkN1c3RvbUNhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpYmFibGVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGlzY2lwbGluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpc2NpcGxpbmVHcm91cGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkd1aWRhbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVTZXRHcm91cGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Ub29sOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBhcnRJbml0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci0KLS8qKgotICogTGF1bmNoZXMgYSBNZXRob2QgZWRpdG9yIHRoYXQgaXMgYXBwcm9wcmlhdGUgZm9yIGEgZ2l2ZW4gbWV0aG9kIGVsZW1lbnQuCi0gKiAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEVkaXRvckNob29zZXIgaW1wbGVtZW50cyBJRWRpdG9yS2VlcGVyIHsKLQotCXByaXZhdGUgc3RhdGljIEVkaXRvckNob29zZXIgc2luZ2xldG9uID0gbnVsbDsKLQotCS8qKgotCSAqIFJldHVybnMgYSBzaW5nbGV0b24gaW5zdGFuY2UKLQkgKiAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEVkaXRvckNob29zZXIgZ2V0SW5zdGFuY2UoKSB7Ci0JCWlmIChzaW5nbGV0b24gPT0gbnVsbCkgewotCQkJc3luY2hyb25pemVkIChFZGl0b3JDaG9vc2VyLmNsYXNzKSB7Ci0JCQkJaWYgKHNpbmdsZXRvbiA9PSBudWxsKSB7Ci0JCQkJCXNpbmdsZXRvbiA9IG5ldyBFZGl0b3JDaG9vc2VyKCk7Ci0JCQkJCUlFZGl0b3JLZWVwZXIuUkVGRVJFTkNFLnNldEVkaXRvcktlZXBlcihzaW5nbGV0b24pOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gc2luZ2xldG9uOwotCX0KLQotCXB1YmxpYyBFZGl0b3JDaG9vc2VyKCkgewotCQkKLQl9Ci0JCi0JCi0JLyoqCi0JICogT3BlbnMgdGhlIHJlc3BlY3RpdmUgZWRpdG9yIGRlcGVuZGluZyBvbiB0aGUgZ2l2ZW4gTWV0aG9kIGVsZW1lbnQgb2JqZWN0LgotCSAqIAotCSAqIEBwYXJhbSBvYmoKLQkgKiAgICAgICAgICAgIEEgTWV0aG9kIGVsZW1lbnQuCi0JICovCi0JcHVibGljIHZvaWQgb3BlbkVkaXRvcihPYmplY3Qgb2JqKSB7Ci0JCXRyeSB7Ci0JCQlvYmogPSBWaWV3SGVscGVyLmhhbmRsZURhbmdsaW5nKG9iaik7Ci0JCQlpZiAob2JqID09IG51bGwpCi0JCQkJcmV0dXJuOwotCi0JCQlvYmogPSBMaWJyYXJ5VXRpbC51bndyYXAob2JqKTsKLQotCQkJQXJyYXlMaXN0IGVycm9ycyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBFT2JqZWN0KSB7Ci0JCQkJUmVzb3VyY2UgcmVzID0gKChFT2JqZWN0KSBvYmopLmVSZXNvdXJjZSgpOwotCQkJCWlmIChyZXMgIT0gbnVsbCAmJiAhcmVzLmdldEVycm9ycygpLmlzRW1wdHkoKSkgewotCQkJCQllcnJvcnMuYWRkQWxsKHJlcy5nZXRFcnJvcnMoKSk7Ci0JCQkJfQotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBEZXNjcmliYWJsZUVsZW1lbnQpIHsKLQkJCQkJUmVzb3VyY2UgcHJlc1JlcyA9ICgoRGVzY3JpYmFibGVFbGVtZW50KSBvYmopCi0JCQkJCQkJLmdldFByZXNlbnRhdGlvbigpLmVSZXNvdXJjZSgpOwotCQkJCQlpZiAocHJlc1JlcyAhPSBudWxsICYmICFwcmVzUmVzLmdldEVycm9ycygpLmlzRW1wdHkoKSkgewotCQkJCQkJZXJyb3JzLmFkZEFsbChwcmVzUmVzLmdldEVycm9ycygpKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAoIWVycm9ycy5pc0VtcHR5KCkpIHsKLQkJCQkJZmluYWwgTXVsdGlTdGF0dXMgbXVsdGlTdGF0dXMgPSBuZXcgTXVsdGlTdGF0dXMoCi0JCQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldElkKCksCi0JCQkJCQkJMCwKLQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5FZGl0b3JDaG9vc2VyX1Jlc291cmNlc0Vycm9yLCBudWxsKTsgCi0JCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGVycm9ycy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJCURpYWdub3N0aWMgZSA9IChEaWFnbm9zdGljKSBpdGVyLm5leHQoKTsKLQkJCQkJCUlTdGF0dXMgc3RhdHVzID0gbmV3IFN0YXR1cyhJU3RhdHVzLldBUk5JTkcsCi0JCQkJCQkJCUxpYnJhcnlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldElkKCksIDAsIGUKLQkJCQkJCQkJCQkuZ2V0TWVzc2FnZSgpLCBudWxsKTsKLQkJCQkJCW11bHRpU3RhdHVzLmFkZChzdGF0dXMpOwotCQkJCQl9Ci0JCQkJCXRyeSB7Ci0JCQkJCQlpZiAoQXV0aG9yaW5nVUlQbHVnaW4KLQkJCQkJCQkJLmdldERlZmF1bHQoKQotCQkJCQkJCQkuZ2V0TXNnRGlhbG9nKCkKLQkJCQkJCQkJLmRpc3BsYXlDb25maXJtYXRpb24oCi0JCQkJCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuRWRpdG9yQ2hvb3Nlcl9sb2FkZEVycm9yRGxnVGl0bGUsCi0JCQkJCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuRWRpdG9yQ2hvb3Nlcl9SZXNvdXJjZXNFcnJvciwgCi0JCQkJCQkJCQkJbXVsdGlTdGF0dXMpID09IERpYWxvZy5DQU5DRUwpIHsKLQkJCQkJCQlyZXR1cm47Ci0JCQkJCQl9Ci0KLQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJRWRpdG9yT3BlbmVyIG9wZW5lciA9IEVkaXRvck9wZW5lckZhY3RvcnkuZ2V0SW5zdGFuY2UoKS5nZXRPcGVuZXIob2JqKTsKLQkJCWlmICggb3BlbmVyICE9IG51bGwgJiYgb3BlbmVyLmNhbk9wZW4ob2JqKSApIHsKLQkJCQlvcGVuZXIub3BlbkVkaXRvcihvYmopOwotCQkJfSBlbHNlIGlmICgob2JqIGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luKQotCQkJCQl8fCAob2JqIGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UpIHx8IChvYmogaW5zdGFuY2VvZiBSb2xlKQotCQkJCQl8fCAob2JqIGluc3RhbmNlb2YgVGFzaykgfHwgKG9iaiBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0KQotCQkJCQl8fCAob2JqIGluc3RhbmNlb2YgR3VpZGFuY2UpIHx8IChvYmogaW5zdGFuY2VvZiBEaXNjaXBsaW5lKQotCQkJCQl8fCAob2JqIGluc3RhbmNlb2YgRGlzY2lwbGluZUdyb3VwaW5nKQotCQkJCQl8fCAob2JqIGluc3RhbmNlb2YgRG9tYWluKQotCQkJCQl8fCAob2JqIGluc3RhbmNlb2YgV29ya1Byb2R1Y3RUeXBlKQotCQkJCQl8fCAob2JqIGluc3RhbmNlb2YgUm9sZVNldCkgfHwgKG9iaiBpbnN0YW5jZW9mIFRvb2wpCi0JCQkJCXx8IChvYmogaW5zdGFuY2VvZiBSb2xlU2V0R3JvdXBpbmcpCi0JCQkJCXx8IChvYmogaW5zdGFuY2VvZiBNZXRob2RMaWJyYXJ5KSkgewotCQkJCW9wZW5FZGl0b3IoKE1ldGhvZEVsZW1lbnQpIG9iaiwgTWV0aG9kRWxlbWVudEVkaXRvci5FRElUT1JfSUQpOwotCQkJfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBDdXN0b21DYXRlZ29yeSkgewotCQkJCUN1c3RvbUNhdGVnb3J5IGN1c3RDYXQgPSAoQ3VzdG9tQ2F0ZWdvcnkpIG9iajsKLQkJCQlpZihUbmdVdGlsLmlzUm9vdEN1c3RvbUNhdGVnb3J5KGN1c3RDYXQpKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJb3BlbkVkaXRvcigoTWV0aG9kRWxlbWVudCkgb2JqLCBNZXRob2RFbGVtZW50RWRpdG9yLkVESVRPUl9JRCk7Ci0JCQl9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpIHsKLQkJCQlvcGVuRWRpdG9yKChNZXRob2RFbGVtZW50KSBvYmosIFByb2Nlc3NFZGl0b3IuRURJVE9SX0lEKTsKLQotCQkJCS8vIG9wZW4gcHJvcGVydGllcyB2aWV3IGJ5IGRlZmF1bHQgd2hlbiB3ZSBvcGVuIFByb2Nlc3MgRWRpdG9yCi0JCQkJdHJ5IHsKLQkJCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKQotCQkJCQkJCS5nZXRBY3RpdmVQYWdlKCkuc2hvd1ZpZXcoCi0JCQkJCQkJCQkib3JnLmVjbGlwc2UudWkudmlld3MuUHJvcGVydHlTaGVldCIsIG51bGwsIElXb3JrYmVuY2hQYWdlLlZJRVdfVklTSUJMRSk7IC8vJE5PTi1OTFMtMSQKLQkJCQl9IGNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKAotCQkJCQkJCWV4Y2VwdGlvbik7Ci0JCQkJfQotCQkJfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBQcm9jZXNzKSB7Ci0JCQkJT2JqZWN0IGNvbnRhaW5lciA9ICgoUHJvY2Vzcykgb2JqKS5lQ29udGFpbmVyKCk7Ci0JCQkJaWYgKGNvbnRhaW5lciBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpIHsKLQkJCQkJb3BlbkVkaXRvcigoTWV0aG9kRWxlbWVudCkgY29udGFpbmVyLAotCQkJCQkJCVByb2Nlc3NFZGl0b3IuRURJVE9SX0lEKTsKLQkJCQl9Ci0JCQl9ZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgTWV0aG9kQ29uZmlndXJhdGlvbikgewotCQkJCW9wZW5FZGl0b3IoKE1ldGhvZENvbmZpZ3VyYXRpb24pIG9iaiwKLQkJCQkJCUNvbmZpZ3VyYXRpb25FZGl0b3IuRURJVE9SX0lEKTsKLQkJCX1lbHNlIGlmKG9iaiBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnQpewotCQkJCVByb2Nlc3MgcHJvY2VzcyA9IFRuZ1V0aWwuZ2V0T3duaW5nUHJvY2VzcygoQnJlYWtkb3duRWxlbWVudClvYmopOwotCQkJCU9iamVjdCBjb250YWluZXIgPSBwcm9jZXNzLmVDb250YWluZXIoKTsKLQkJCQlpZiAoY29udGFpbmVyIGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkgewotCQkJCQlvcGVuRWRpdG9yKChNZXRob2RFbGVtZW50KSBjb250YWluZXIsCi0JCQkJCQkJUHJvY2Vzc0VkaXRvci5FRElUT1JfSUQpOwotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKLQkJCXQucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQlTdHJpbmcgdGl0bGUgPSBBdXRob3JpbmdVSVJlc291cmNlcy5lZGl0b3JzX0VkaXRvckNob29zZXJfc3lzdGVtRXJyb3JEaWFsb2dfdGl0bGU7IAotCQkJU3RyaW5nIG1lc3NhZ2UgPSBBdXRob3JpbmdVSVJlc291cmNlcy5lZGl0b3JzX0VkaXRvckNob29zZXJfc3lzdGVtRXJyb3JEaWFsb2dfbWVzc2FnZTsgCi0JCQlTdHJpbmcgcmVhc29uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZWRpdG9yc19FZGl0b3JDaG9vc2VyX3N5c3RlbUVycm9yRGlhbG9nX3JlYXNvbjsgCi0JCQlNc2dEaWFsb2cgZGlhbG9nID0gQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpOwotCQkJZGlhbG9nLmRpc3BsYXlFcnJvcih0aXRsZSwgbWVzc2FnZSwgcmVhc29uLCB0KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIE9wZW5zIHRoZSBDb25maWd1cmF0aW9uIGVkaXRvci4KLQkgKiAKLQkgKiBAcGFyYW0gY29uZmlnCi0JICogQHBhcmFtIGVkaXRvcklkCi0JICovCi0JcHJpdmF0ZSB2b2lkIG9wZW5FZGl0b3IoTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcsIFN0cmluZyBlZGl0b3JJZCkKLQkJCXRocm93cyBQYXJ0SW5pdEV4Y2VwdGlvbiB7Ci0JCUNvbmZpZ3VyYXRpb25FZGl0b3JJbnB1dCBlZGl0b3JJbnB1dCA9IG5ldyBDb25maWd1cmF0aW9uRWRpdG9ySW5wdXQoCi0JCQkJY29uZmlnKTsKLQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFdvcmtiZW5jaCgpCi0JCQkJLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKS5vcGVuRWRpdG9yKAotCQkJCQkJZWRpdG9ySW5wdXQsIGVkaXRvcklkKTsKLQl9Ci0KLQkvKioKLQkgKiBPcGVucyB0aGUgTWV0aG9kIGVkaXRvciBmb3IgdGhlIGdpdmVuIG1ldGhvZCBlbGVtZW50LgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogICAgICAgICAgICBBIE1ldGhvZCBlbGVtZW50LgotCSAqIEBwYXJhbSBlZGl0b3JJZAotCSAqICAgICAgICAgICAgVGhlIGVkaXRvciBJRC4KLQkgKi8KLQlwcml2YXRlIHZvaWQgb3BlbkVkaXRvcihNZXRob2RFbGVtZW50IGVsZW1lbnQsIFN0cmluZyBlZGl0b3JJZCkKLQkJCXRocm93cyBQYXJ0SW5pdEV4Y2VwdGlvbiB7Ci0JCU1ldGhvZEVsZW1lbnRFZGl0b3JJbnB1dCBlZGl0b3JJbnB1dCA9IG5ldyBNZXRob2RFbGVtZW50RWRpdG9ySW5wdXQoCi0JCQkJZWxlbWVudCk7Ci0JCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRXb3JrYmVuY2goKQotCQkJCS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRBY3RpdmVQYWdlKCkub3BlbkVkaXRvcigKLQkJCQkJCWVkaXRvcklucHV0LCBlZGl0b3JJZCk7Ci0JfQotCi0JLyoqCi0JICogU2VsZWN0cyAoYnJpbmdzIHRvIGZyb250LCBidXQgZG9lcyBub3QgZ2l2ZSBmb2N1cykgdGhlIE1ldGhvZCBlZGl0b3IgZm9yCi0JICogdGhlIGdpdmVuIG9iamVjdC4gSWYgdGhlcmUgaXMgbm8gb3BlbiBlZGl0b3IgZm9yIHRoZSBvYmplY3QsIGRvZXMKLQkgKiBub3RoaW5nLgotCSAqIAotCSAqIEBwYXJhbSBvYmoKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZWxlY3RFZGl0b3IoT2JqZWN0IG9iaikgewotCQl0cnkgewotCQkJb2JqID0gVmlld0hlbHBlci5oYW5kbGVEYW5nbGluZyhvYmopOwotCQkJaWYgKG9iaiA9PSBudWxsKQotCQkJCXJldHVybjsKLQkJCW9iaiA9IExpYnJhcnlVdGlsLnVud3JhcChvYmopOwotCQl9IGNhdGNoIChUaHJvd2FibGUgdCkgewotCQkJdC5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCQlJRWRpdG9ySW5wdXQgZWRpdG9ySW5wdXQgPSBudWxsOwotCQlpZiAob2JqIGluc3RhbmNlb2YgTWV0aG9kQ29uZmlndXJhdGlvbikKLQkJCWVkaXRvcklucHV0ID0gbmV3IENvbmZpZ3VyYXRpb25FZGl0b3JJbnB1dCgKLQkJCQkJKE1ldGhvZENvbmZpZ3VyYXRpb24pIG9iaik7Ci0JCWVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpCi0JCQllZGl0b3JJbnB1dCA9IG5ldyBNZXRob2RFbGVtZW50RWRpdG9ySW5wdXQoKE1ldGhvZEVsZW1lbnQpIG9iaik7Ci0JCWlmIChlZGl0b3JJbnB1dCAhPSBudWxsKSB7Ci0JCQlJV29ya2JlbmNoUGFnZSBwYWdlID0gQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFdvcmtiZW5jaCgpCi0JCQkJCS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRBY3RpdmVQYWdlKCk7Ci0JCQlJRWRpdG9yUGFydCBlZGl0b3JQYXJ0ID0gcGFnZS5maW5kRWRpdG9yKGVkaXRvcklucHV0KTsKLQkJCWlmIChlZGl0b3JQYXJ0ICE9IG51bGwpCi0JCQkJcGFnZS5icmluZ1RvVG9wKGVkaXRvclBhcnQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICogUmV0dXJucyBzZWxlY3RlZCBlZGl0b3IgaW5wdXQKLQkgKiBAcmV0dXJuIFRoZSBvYmplY3Qgd2hpY2ggdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBNZXRob2QgZWRpdG9yIGlzIGVkaXRpbmcgKG9yCi0JICogICAgICAgICBudWxsIGlmIHRoZXJlIGlzIG5vIGVkaXRvciBvciBpZiB0aGUgZWRpdG9yIGlzIG5vdCBhIE1ldGhvZCBlZGl0b3IpLgotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0QWN0aXZlTWV0aG9kRWRpdG9ySW5wdXQoKSB7Ci0JCUlFZGl0b3JQYXJ0IGVkaXRvclBhcnQgPSBBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0V29ya2JlbmNoKCkKLQkJCQkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0QWN0aXZlUGFnZSgpLmdldEFjdGl2ZUVkaXRvcigpOwotCQlyZXR1cm4gZ2V0TWV0aG9kRWRpdG9ySW5wdXQoZWRpdG9yUGFydCk7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRNZXRob2RFZGl0b3JJbnB1dChJRWRpdG9yUGFydCBlZGl0b3JQYXJ0KSB7Ci0JCWlmIChlZGl0b3JQYXJ0ICE9IG51bGwpIHsKLQkJCUlFZGl0b3JJbnB1dCBlZGl0b3JJbnB1dCA9IGVkaXRvclBhcnQuZ2V0RWRpdG9ySW5wdXQoKTsKLQkJCWlmIChlZGl0b3JJbnB1dCBpbnN0YW5jZW9mIENvbmZpZ3VyYXRpb25FZGl0b3JJbnB1dCkKLQkJCQlyZXR1cm4gKChDb25maWd1cmF0aW9uRWRpdG9ySW5wdXQpIGVkaXRvcklucHV0KQotCQkJCQkJLmdldENvbmZpZ3VyYXRpb24oKTsKLQkJCWlmIChlZGl0b3JJbnB1dCBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnRFZGl0b3JJbnB1dCkKLQkJCQlyZXR1cm4gKChNZXRob2RFbGVtZW50RWRpdG9ySW5wdXQpIGVkaXRvcklucHV0KQotCQkJCQkJLmdldE1ldGhvZEVsZW1lbnQoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDbG9zZXMgdGhlIE1ldGhvZCBlZGl0b3IgZm9yIHRoZSBnaXZlbiBNZXRob2QgZWxlbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gb2JqCi0JICogICAgICAgICAgICBBIE1ldGhvZCBlbGVtZW50LgotCSAqLwotCXB1YmxpYyB2b2lkIGNsb3NlRWRpdG9yKE9iamVjdCBvYmopIHsKLQkJdHJ5IHsKLQkJCUlFZGl0b3JQYXJ0IGVkaXRvciA9IGZpbmRFZGl0b3Iob2JqKTsKLQkJCWlmIChlZGl0b3IgIT0gbnVsbCkgewotCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRXb3JrYmVuY2goKQotCQkJCQkJLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKQotCQkJCQkJLmNsb3NlRWRpdG9yKGVkaXRvciwgZmFsc2UpOwotCQkJfQotCQl9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7Ci0JCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIElFZGl0b3JQYXJ0IGZpbmRFZGl0b3IoT2JqZWN0IG9iaikgewotCQl0cnkgewotCQkJTWV0aG9kRWxlbWVudEVkaXRvcklucHV0IGVkaXRvcklucHV0ID0gbmV3IE1ldGhvZEVsZW1lbnRFZGl0b3JJbnB1dCgKLQkJCQkJKE1ldGhvZEVsZW1lbnQpIG9iaik7Ci0JCQlJRWRpdG9yUGFydCBlZGl0b3IgPSBBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0V29ya2JlbmNoKCkKLQkJCQkJLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKS5maW5kRWRpdG9yKAotCQkJCQkJCWVkaXRvcklucHV0KTsKLQkJCXJldHVybiBlZGl0b3I7Ci0JCX0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKLQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGxpc3Qgb2YgZGlydHkgZWRpdG9ycyBmb3IgdGhlIGdpdmVuIGVsZW1lbnRzCi0JICogQHBhcmFtIGVsZW1lbnRzCi0JICogQHJldHVybglMaXN0IG9mIGRpcnR5IGVkaXRvcgotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldEVsZW1lbnRzV2l0aERpcnR5RWRpdG9yKENvbGxlY3Rpb24gZWxlbWVudHMpIHsKLQkJQXJyYXlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQlJV29ya2JlbmNoUGFnZSB3b3JrYmVuY2hQYWdlID0gQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpCi0JCQkJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKTsKLQkJSUVkaXRvclJlZmVyZW5jZVtdIGVkaXRvclJlZmVyZW5jZXMgPSB3b3JrYmVuY2hQYWdlCi0JCQkJLmdldEVkaXRvclJlZmVyZW5jZXMoKTsKLQkJLy8gQXJyYXlMaXN0IGNsb3NlRWRpdG9yUmVmcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlZGl0b3JSZWZlcmVuY2VzLmxlbmd0aDsgaSsrKSB7Ci0JCQlJRWRpdG9yUmVmZXJlbmNlIHJlZmVyZW5jZSA9IGVkaXRvclJlZmVyZW5jZXNbaV07Ci0JCQlJRWRpdG9yUGFydCBlZGl0b3IgPSByZWZlcmVuY2UuZ2V0RWRpdG9yKHRydWUpOwotCQkJaWYgKGVkaXRvciAhPSBudWxsICYmIGVkaXRvci5pc0RpcnR5KCkpIHsKLQkJCQlJRWRpdG9ySW5wdXQgaW5wdXQgPSBlZGl0b3IuZ2V0RWRpdG9ySW5wdXQoKTsKLQkJCQlNZXRob2RFbGVtZW50IGVsZW1lbnQgPSBudWxsOwotCQkJCWlmIChpbnB1dCBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnRFZGl0b3JJbnB1dCkgewotCQkJCQllbGVtZW50ID0gKChNZXRob2RFbGVtZW50RWRpdG9ySW5wdXQpIGlucHV0KQotCQkJCQkJCS5nZXRNZXRob2RFbGVtZW50KCk7Ci0JCQkJfSBlbHNlIGlmIChpbnB1dCBpbnN0YW5jZW9mIENvbmZpZ3VyYXRpb25FZGl0b3JJbnB1dCkgewotCQkJCQllbGVtZW50ID0gKChDb25maWd1cmF0aW9uRWRpdG9ySW5wdXQpIGlucHV0KQotCQkJCQkJCS5nZXRDb25maWd1cmF0aW9uKCk7Ci0JCQkJfQotCQkJCWlmIChlbGVtZW50ICE9IG51bGwpIHsKLQkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gZWxlbWVudHMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlPYmplY3QgZSA9IGl0ZXIubmV4dCgpOwotCQkJCQkJaWYgKGUgPT0gZWxlbWVudCB8fCBVbWFVdGlsLmlzQ29udGFpbmVkQnkoZWxlbWVudCwgZSkpIHsKLQkJCQkJCQlyZXN1bHQuYWRkKGVsZW1lbnQpOwotCQkJCQkJCWl0ZXIucmVtb3ZlKCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIENsb3NlcyB0aGUgYWxsIG9wZW4gTWV0aG9kIGVkaXRvcnMgb2ZvciB0aGUgZ2l2ZW4gKGRlbGV0ZWQpIGVsZW1lbnQgYW5kCi0JICogYWxsIG9mIGl0cyBjaGlsZHJlbiBhbmQgZ3JhbmQgY2hpbGRyZW4uCi0JICogCi0JICogQHBhcmFtIGUKLQkgKiAgICAgICAgICAgIHRoZSBkZWxldGVkIE1ldGhvZEVsZW1lbnQKLQkgKi8KLQlwdWJsaWMgdm9pZCBjbG9zZUVkaXRvcnNPbkRlbGV0aW9uKE9iamVjdCBlKSB7Ci0JCUlXb3JrYmVuY2hQYWdlIHdvcmtiZW5jaFBhZ2UgPSBBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCQkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0QWN0aXZlUGFnZSgpOwotCQlJRWRpdG9yUmVmZXJlbmNlW10gZWRpdG9yUmVmZXJlbmNlcyA9IHdvcmtiZW5jaFBhZ2UKLQkJCQkuZ2V0RWRpdG9yUmVmZXJlbmNlcygpOwotCQlBcnJheUxpc3QgY2xvc2VFZGl0b3JSZWZzID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGVkaXRvclJlZmVyZW5jZXMubGVuZ3RoOyBpKyspIHsKLQkJCUlFZGl0b3JSZWZlcmVuY2UgcmVmZXJlbmNlID0gZWRpdG9yUmVmZXJlbmNlc1tpXTsKLQkJCUlFZGl0b3JQYXJ0IGVkaXRvciA9IHJlZmVyZW5jZS5nZXRFZGl0b3IodHJ1ZSk7Ci0JCQlpZiAoZWRpdG9yICE9IG51bGwpIHsKLQkJCQlJRWRpdG9ySW5wdXQgaW5wdXQgPSBlZGl0b3IuZ2V0RWRpdG9ySW5wdXQoKTsKLQkJCQlNZXRob2RFbGVtZW50IGVsZW1lbnQgPSBudWxsOwotCQkJCWlmIChpbnB1dCBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnRFZGl0b3JJbnB1dCkgewotCQkJCQllbGVtZW50ID0gKChNZXRob2RFbGVtZW50RWRpdG9ySW5wdXQpIGlucHV0KQotCQkJCQkJCS5nZXRNZXRob2RFbGVtZW50KCk7Ci0JCQkJfSBlbHNlIGlmIChpbnB1dCBpbnN0YW5jZW9mIENvbmZpZ3VyYXRpb25FZGl0b3JJbnB1dCkgewotCQkJCQllbGVtZW50ID0gKChDb25maWd1cmF0aW9uRWRpdG9ySW5wdXQpIGlucHV0KQotCQkJCQkJCS5nZXRDb25maWd1cmF0aW9uKCk7Ci0JCQkJfQotCQkJCWlmIChlbGVtZW50ICE9IG51bGwKLQkJCQkJCSYmIChlbGVtZW50LmVDb250YWluZXIoKSA9PSBudWxsIHx8IFVtYVV0aWwKLQkJCQkJCQkJLmlzQ29udGFpbmVkQnkoZWxlbWVudCwgZSkpKSB7Ci0JCQkJCWNsb3NlRWRpdG9yUmVmcy5hZGQocmVmZXJlbmNlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaW50IHNpemUgPSBjbG9zZUVkaXRvclJlZnMuc2l6ZSgpOwotCQlJRWRpdG9yUmVmZXJlbmNlW10gcmVmZXJlbmNlcyA9IG5ldyBJRWRpdG9yUmVmZXJlbmNlW3NpemVdOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJcmVmZXJlbmNlc1tpXSA9IChJRWRpdG9yUmVmZXJlbmNlKSBjbG9zZUVkaXRvclJlZnMuZ2V0KGkpOwotCQl9Ci0JCXdvcmtiZW5jaFBhZ2UuY2xvc2VFZGl0b3JzKHJlZmVyZW5jZXMsIGZhbHNlKTsKLQl9Ci0JCi0JLyoqCi0JICogQ2xvc2VzIGFsbCBNZXRob2QgRWRpdG9ycyB3aXRob3V0IHNhdmluZy4KLQkgKgotCSAqLwotCXB1YmxpYyB2b2lkIGNsb3NlQWxsTWV0aG9kRWRpdG9ycygpIHsKLQkJY2xvc2VBbGxNZXRob2RFZGl0b3JzKGZhbHNlKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgY2xvc2VBbGxNZXRob2RFZGl0b3JzKGJvb2xlYW4gc2F2ZUZsYWcpIHsKLQkJZmluYWwgSVdvcmtiZW5jaCB3b3JrYmVuY2ggPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpOwotCQlmaW5hbCBib29sZWFuIHNhdmUgPSBzYXZlRmxhZzsKLQkJd29ya2JlbmNoLmdldERpc3BsYXkoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCUlXb3JrYmVuY2hXaW5kb3cgd2luZG93ID0gd29ya2JlbmNoLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpOwotCQkJCWlmICh3aW5kb3cgIT0gbnVsbCkgewotCQkJCQlJV29ya2JlbmNoUGFnZSB3b3JrYmVuY2hQYWdlID0gd2luZG93LmdldEFjdGl2ZVBhZ2UoKTsKLQkJCQkJTGlzdDxJRWRpdG9yUmVmZXJlbmNlPiBjbG9zZUVkaXRvclJlZnMgPSBnZXRPcGVuTWV0aG9kRWRpdG9ycygpOwotCQkJCQl3b3JrYmVuY2hQYWdlLmNsb3NlRWRpdG9ycyhjbG9zZUVkaXRvclJlZnMudG9BcnJheShuZXcgSUVkaXRvclJlZmVyZW5jZVtjbG9zZUVkaXRvclJlZnMuc2l6ZSgpXSksIHNhdmUpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JfQotCQotCS8qKgotCSAqIENsb3NlcyBhbGwgTWV0aG9kIEVkaXRvcnMgd2l0aCBzYXZpbmcuCi0JICoKLQkgKi8KLQlwdWJsaWMgdm9pZCBjbG9zZUFsbE1ldGhvZEVkaXRvcnNXaXRoU2F2aW5nKCkgewotCQljbG9zZUFsbE1ldGhvZEVkaXRvcnModHJ1ZSk7Ci0JfQotCQotCS8qKgotCSAqIEByZXR1cm4gYSBsaXN0IG9mIGFsbCBvcGVuIE1ldGhvZCBFZGl0b3JzCi0JICovCi0JcHVibGljIExpc3Q8SUVkaXRvclJlZmVyZW5jZT4gZ2V0T3Blbk1ldGhvZEVkaXRvcnMoKSB7Ci0JCWZpbmFsIElXb3JrYmVuY2ggd29ya2JlbmNoID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKTsKLQkJZmluYWwgTGlzdDxJRWRpdG9yUmVmZXJlbmNlPiBtZXRob2RFZGl0b3JSZWZzID0gbmV3IEFycmF5TGlzdDxJRWRpdG9yUmVmZXJlbmNlPigpOwotCQl3b3JrYmVuY2guZ2V0RGlzcGxheSgpLnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlJV29ya2JlbmNoV2luZG93IHdpbmRvdyA9IHdvcmtiZW5jaC5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKLQkJCQlpZiAod2luZG93ICE9IG51bGwpIHsKLQkJCQkJSVdvcmtiZW5jaFBhZ2Ugd29ya2JlbmNoUGFnZSA9IHdpbmRvdy5nZXRBY3RpdmVQYWdlKCk7Ci0JCQkJCUlFZGl0b3JSZWZlcmVuY2VbXSBlZGl0b3JSZWZlcmVuY2VzID0gd29ya2JlbmNoUGFnZS5nZXRFZGl0b3JSZWZlcmVuY2VzKCk7Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZWRpdG9yUmVmZXJlbmNlcy5sZW5ndGg7IGkrKykgewotCQkJCQkJSUVkaXRvclJlZmVyZW5jZSByZWZlcmVuY2UgPSBlZGl0b3JSZWZlcmVuY2VzW2ldOwotCQkJCQkJSUVkaXRvclBhcnQgZWRpdG9yUGFydCA9IHJlZmVyZW5jZS5nZXRFZGl0b3IoZmFsc2UpOwotCQkJCQkJU3RyaW5nIGVkaXRvcklkID0gcmVmZXJlbmNlLmdldElkKCk7Ci0JCQkJCQlpZiAoZWRpdG9ySWQuc3RhcnRzV2l0aCgib3JnLmVjbGlwc2UuZXBmIikgfHwgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQllZGl0b3JQYXJ0IGluc3RhbmNlb2YgSU1ldGhvZEVkaXRvcikgewotCQkJCQkJCW1ldGhvZEVkaXRvclJlZnMuYWRkKHJlZmVyZW5jZSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCQlyZXR1cm4gbWV0aG9kRWRpdG9yUmVmczsKLQl9Ci0JCi0KLQkvKioKLQkgKiBDbG9zZSBhbGwgTWV0aG9kRWRpdG9ycyBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIFBsdWdpbi4KLQkgKiBXaWxsIGNhdXNlIGEgdXNlci1wcm9tcHQgZm9yIGVhY2ggZGlydHkgZWRpdG9yCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgY2xvc2VNZXRob2RFZGl0b3JzRm9yUGx1Z2luRWxlbWVudHMoTWV0aG9kUGx1Z2luIG1ldGhvZHBsdWdpbikgewotCQlpZiAoQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFdvcmtiZW5jaCgpCi0JCQkJLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpICE9IG51bGwKLQkJCQkmJiBBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0V29ya2JlbmNoKCkKLQkJCQkJCS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRBY3RpdmVQYWdlKCkgIT0gbnVsbCkgewotCQkJSVdvcmtiZW5jaFBhZ2Ugd29ya2JlbmNoUGFnZSA9IEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKQotCQkJCS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRBY3RpdmVQYWdlKCk7Ci0JCQlMaXN0PElFZGl0b3JSZWZlcmVuY2U+IGxpc3QgPSBnZXRPcGVuTWV0aG9kRWRpdG9ycygpOwotCQkJTGlzdDxJRWRpdG9yUmVmZXJlbmNlPiBlZGl0b3JSZWZzVG9DbG9zZSA9IG5ldyBBcnJheUxpc3Q8SUVkaXRvclJlZmVyZW5jZT4oKTsKLQkJCWZvciAoSUVkaXRvclJlZmVyZW5jZSBlZGl0b3JSZWZlcmVuY2UgOiBsaXN0KSB7Ci0JCQkJSUVkaXRvclBhcnQgZWRpdG9yID0gZWRpdG9yUmVmZXJlbmNlLmdldEVkaXRvcih0cnVlKTsKLQkJCQlpZiAoZWRpdG9yICE9IG51bGwpIHsKLQkJCQkJSUVkaXRvcklucHV0IGlucHV0ID0gZWRpdG9yLmdldEVkaXRvcklucHV0KCk7Ci0JCQkJCU1ldGhvZEVsZW1lbnQgZWxlbWVudCA9IG51bGw7Ci0JCQkJCWlmIChpbnB1dCBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnRFZGl0b3JJbnB1dCkgewotCQkJCQkJZWxlbWVudCA9ICgoTWV0aG9kRWxlbWVudEVkaXRvcklucHV0KSBpbnB1dCkKLQkJCQkJCQkJLmdldE1ldGhvZEVsZW1lbnQoKTsKLQkJCQkJfSBlbHNlIGlmIChpbnB1dCBpbnN0YW5jZW9mIENvbmZpZ3VyYXRpb25FZGl0b3JJbnB1dCkgewotCQkJCQkJZWxlbWVudCA9ICgoQ29uZmlndXJhdGlvbkVkaXRvcklucHV0KSBpbnB1dCkKLQkJCQkJCQkJLmdldENvbmZpZ3VyYXRpb24oKTsKLQkJCQkJfSBlbHNlIGlmKGlucHV0IGluc3RhbmNlb2YgRGlhZ3JhbUVkaXRvcklucHV0UHJveHkpewotCQkJCQkJRGlhZ3JhbUVkaXRvcklucHV0IGVJbnB1dCA9ICgoRGlhZ3JhbUVkaXRvcklucHV0UHJveHkpaW5wdXQpLmdldERpYWdyYW1FZGl0b3JJbnB1dCgpOwotCQkJCQkJZWxlbWVudCA9IGVJbnB1dC5nZXRNZXRob2RFbGVtZW50KCk7Ci0JCQkJCQlpZihlbGVtZW50ID09IG51bGwpewotCQkJCQkJCWlmKGVJbnB1dC5nZXRXcmFwcGVyKCkgIT0gbnVsbCl7Ci0JCQkJCQkJCWVsZW1lbnQgPSAoTWV0aG9kRWxlbWVudClUbmdVdGlsLnVud3JhcChlSW5wdXQuZ2V0V3JhcHBlcigpKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJaWYgKGVsZW1lbnQgIT0gbnVsbAotCQkJCQkJCSYmIChlbGVtZW50LmVDb250YWluZXIoKSA9PSBudWxsIHx8IFVtYVV0aWwKLQkJCQkJCQkJCS5pc0NvbnRhaW5lZEJ5KGVsZW1lbnQsIG1ldGhvZHBsdWdpbikpKSB7Ci0JCQkJCQlpZiAoIWVsZW1lbnQuZXF1YWxzKG1ldGhvZHBsdWdpbikpCi0JCQkJCQkJZWRpdG9yUmVmc1RvQ2xvc2UuYWRkKGVkaXRvclJlZmVyZW5jZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQl3b3JrYmVuY2hQYWdlLmNsb3NlRWRpdG9ycyhlZGl0b3JSZWZzVG9DbG9zZS50b0FycmF5KG5ldyBJRWRpdG9yUmVmZXJlbmNlW2VkaXRvclJlZnNUb0Nsb3NlLnNpemUoKV0pLCB0cnVlKTsKLQkJfQotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZWRpdG9ycy9FZGl0b3JPcGVuZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZWRpdG9ycy9FZGl0b3JPcGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGJjZDRmMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2VkaXRvcnMvRWRpdG9yT3BlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnM7Ci0KLS8qKgotICogYWJzdHJhY3QgY2xhc3MgZm9yIGVkaXRvciBvcGVuZW5yIGV4dGVuc2lvbgotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICoKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEVkaXRvck9wZW5lciB7Ci0KLQlwdWJsaWMgRWRpdG9yT3BlbmVyKCkgewotCQkKLQl9Ci0JCi0JcHVibGljIGFic3RyYWN0IGJvb2xlYW4gY2FuT3BlbihPYmplY3Qgb2JqKTsKLQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBvcGVuRWRpdG9yKE9iamVjdCBvYmopIHRocm93cyBFeGNlcHRpb24gOwotCQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9lZGl0b3JzL0VkaXRvck9wZW5lckZhY3RvcnkuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZWRpdG9ycy9FZGl0b3JPcGVuZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmMWFmOGIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9lZGl0b3JzL0VkaXRvck9wZW5lckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuTGlicmFyeVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudFByb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci0KLS8qKgotICogTWFuYWdlcyB0aGUgRWRpdG9yIE9wZW5lbnIgRXh0ZW5zaW9ucwotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRWRpdG9yT3BlbmVyRmFjdG9yeSB7Ci0KLQkvKioKLQkgKiBUaGUgZXh0ZW5zaW9uIHBvaW50IG5hbWVzcGFjZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRFTlNJT05fUE9JTlRfTkFNRVNQQUNFID0gIm9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgZXh0ZW5zaW9uIHBvaW50IG5hbWUuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhURU5TSU9OX1BPSU5UX05BTUUgPSAiRWRpdG9yT3BlbmVyIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlICJjbGFzcyIgYXR0cmlidXRlIG5hbWUuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xBU1NfQVRUUklCX05BTUUgPSAiY2xhc3MiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgImlkIiBhdHRyaWJ1dGUgbmFtZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJRF9BVFRSSUJfTkFNRSA9ICJpZCI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIFRoZSBzaGFyZWQgaW5zdGFuY2UuCi0JcHJpdmF0ZSBzdGF0aWMgRWRpdG9yT3BlbmVyRmFjdG9yeSBpbnN0YW5jZSA9IG51bGw7Ci0KLQkvLyBBIG1hcCBvZiBsaWJyYXJ5IG1hbmFnZXIgY29uZmlndXJhdGlvbiBlbGVtZW50cy4KLQlwcml2YXRlIE1hcDxTdHJpbmcsIEVkaXRvck9wZW5lckVsZW1lbnQ+IG9wZW5lckVsZW1lbnRzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBFZGl0b3JPcGVuZXJFbGVtZW50PigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2hhcmVkIGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgc3luY2hyb25pemVkIEVkaXRvck9wZW5lckZhY3RvcnkgZ2V0SW5zdGFuY2UoKSB7Ci0JCWlmIChpbnN0YW5jZSA9PSBudWxsKSB7Ci0JCQlpbnN0YW5jZSA9IG5ldyBFZGl0b3JPcGVuZXJGYWN0b3J5KCk7Ci0JCX0KLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHJpdmF0ZSBFZGl0b3JPcGVuZXJGYWN0b3J5KCkgewotCQlpbml0KCk7Ci0JfQotCi0JLyoqCi0JICogUGVyZm9ybXMgdGhlIG5lY2Vzc2FyeSBpbml0aWFsaXphdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0KCkgewotCQkvLyBQcm9jZXNzIHRoZSAib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGlicmFyeU1hbmFnZXJzIiBleHRlbnNpb24gcG9pbnQKLQkJLy8gY29udHJpYnV0b3JzLgotCQlJRXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpOwotCQlJRXh0ZW5zaW9uUG9pbnQgZXh0ZW5zaW9uUG9pbnQgPSBleHRlbnNpb25SZWdpc3RyeS5nZXRFeHRlbnNpb25Qb2ludCgKLQkJCQlFWFRFTlNJT05fUE9JTlRfTkFNRVNQQUNFLCBFWFRFTlNJT05fUE9JTlRfTkFNRSk7Ci0JCWlmIChleHRlbnNpb25Qb2ludCAhPSBudWxsKSB7Ci0JCQlJRXh0ZW5zaW9uW10gZXh0ZW5zaW9ucyA9IGV4dGVuc2lvblBvaW50LmdldEV4dGVuc2lvbnMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZXh0ZW5zaW9ucy5sZW5ndGg7IGkrKykgewotCQkJCUlFeHRlbnNpb24gZXh0ZW5zaW9uID0gZXh0ZW5zaW9uc1tpXTsKLQkJCQlTdHJpbmcgcGx1Z2luSWQgPSBleHRlbnNpb24uZ2V0TmFtZXNwYWNlSWRlbnRpZmllcigpOwotCQkJCUJ1bmRsZSBidW5kbGUgPSBQbGF0Zm9ybS5nZXRCdW5kbGUocGx1Z2luSWQpOwotCQkJCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGNvbmZpZ0VsZW1lbnRzID0gZXh0ZW5zaW9uCi0JCQkJCQkuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzKCk7Ci0JCQkJZm9yIChpbnQgaiA9IDA7IGogPCBjb25maWdFbGVtZW50cy5sZW5ndGg7IGorKykgewotCQkJCQlJQ29uZmlndXJhdGlvbkVsZW1lbnQgY29uZmlnRWxlbWVudCA9IGNvbmZpZ0VsZW1lbnRzW2pdOwotCQkJCQl0cnkgewotCQkJCQkJU3RyaW5nIGNsYXNzTmFtZSA9IGNvbmZpZ0VsZW1lbnQKLQkJCQkJCQkJLmdldEF0dHJpYnV0ZShDTEFTU19BVFRSSUJfTkFNRSk7Ci0JCQkJCQlTdHJpbmcgaWQgPSBjb25maWdFbGVtZW50Ci0JCQkJCQkJCS5nZXRBdHRyaWJ1dGUoSURfQVRUUklCX05BTUUpOwotCQkJCQkJaWYgKGNsYXNzTmFtZSAhPSBudWxsICYmIGNsYXNzTmFtZS50cmltKCkubGVuZ3RoKCkgPiAwCi0JCQkJCQkJCSYmIGlkICE9IG51bGwgJiYgaWQudHJpbSgpLmxlbmd0aCgpID4gMCkgewkJCQkJCQkKLQkJCQkJCQlFZGl0b3JPcGVuZXJFbGVtZW50IHByb3ZpZGVyID0gb3BlbmVyRWxlbWVudHMuZ2V0KGlkKTsKLQkJCQkJCQlpZihwcm92aWRlciA9PSBudWxsICkgewotCQkJCQkJCQlwcm92aWRlciA9IG5ldyBFZGl0b3JPcGVuZXJFbGVtZW50KAotCQkJCQkJCQkJCWJ1bmRsZSwgY2xhc3NOYW1lLCBpZCk7Ci0JCQkJCQkJCW9wZW5lckVsZW1lbnRzLnB1dChpZCwgcHJvdmlkZXIpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCUxpYnJhcnlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIEVkaXRvck9wZW5lciBnZXRPcGVuZXIoT2JqZWN0IG9iaikgewotCQlpZiAoIG9iaiBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQgKSB7Ci0JCQlNZXRob2RFbGVtZW50IGUgPSAoKE1ldGhvZEVsZW1lbnQpb2JqKTsKLQkJCQotCQkJd2hpbGUgKGUgIT0gbnVsbCApIHsKLQkJCQlMaXN0IHByb3BzID0gZS5nZXRNZXRob2RFbGVtZW50UHJvcGVydHkoKTsKLQkJCQlpZiAoIHByb3BzICE9IG51bGwgJiYgcHJvcHMuc2l6ZSgpID4gMCApIHsKLQkJCQkJZm9yIChJdGVyYXRvciBpdHAgPSBwcm9wcy5pdGVyYXRvcigpOyBpdHAuaGFzTmV4dCgpOyApIHsKLQkJCQkJCU1ldGhvZEVsZW1lbnRQcm9wZXJ0eSBwcm9wID0gKE1ldGhvZEVsZW1lbnRQcm9wZXJ0eSlpdHAubmV4dCgpOwotCQkJCQkJU3RyaW5nIGlkID0gcHJvcC5nZXROYW1lKCk7Ci0JCQkJCQlFZGl0b3JPcGVuZXIgb3BlbmVyPSBjcmVhdGVFeHRlbnNpb24oaWQpOwotCQkJCQkJaWYgKCBvcGVuZXIgIT0gbnVsbCApIHsJCQkJCQkKLQkJCQkJCQlyZXR1cm4gb3BlbmVyOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQkKLQkJCQkKLQkJCQlpZiAoIGUgaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pIHsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCQotCQkJCS8vIHRyeSBpZiB0aGUgaWQgaXMgZGVmaW5lZCBpbiB0aGUgcGx1Z2luCi0JCQkJZSA9IExpYnJhcnlVdGlsLmdldE1ldGhvZFBsdWdpbihlKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBoYXNFeHRlbnNpb24oU3RyaW5nIGlkKSB7Ci0JCXJldHVybiBvcGVuZXJFbGVtZW50cy5jb250YWluc0tleShpZCk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgbGF5b3V0IGV4dGVuc2lvbi4KLQkgKiAKLQkgKiBAcGFyYW0gaWQgdGhlIGV4dGVuc2lvbiBpZAotCSAqIEByZXR1cm4gTGF5b3V0RXh0ZW5zaW9uCi0JICovCi0JcHJpdmF0ZSBFZGl0b3JPcGVuZXIgY3JlYXRlRXh0ZW5zaW9uKFN0cmluZyBpZCkgewotCQkKLQkJaWYgKCAhaGFzRXh0ZW5zaW9uKGlkKSApIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCQotCQlFZGl0b3JPcGVuZXJFbGVtZW50IHByb3ZpZGVyID0gKEVkaXRvck9wZW5lckVsZW1lbnQpIG9wZW5lckVsZW1lbnRzLmdldChpZCk7Ci0JCXRyeSB7Ci0JCQlDbGFzcyBjbGF6eiA9IHByb3ZpZGVyLmJ1bmRsZS5sb2FkQ2xhc3MocHJvdmlkZXIuY2xhc3NOYW1lKTsKLQkJCXJldHVybiAoRWRpdG9yT3BlbmVyKSBjbGF6ei5uZXdJbnN0YW5jZSgpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCX0KLQkJCi0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgY2xhc3MgRWRpdG9yT3BlbmVyRWxlbWVudCB7Ci0JCUJ1bmRsZSBidW5kbGU7Ci0JCVN0cmluZyBjbGFzc05hbWU7Ci0JCVN0cmluZyBpZDsKLQkJcHJpdmF0ZSBFZGl0b3JPcGVuZXJFbGVtZW50KEJ1bmRsZSBidW5kbGUsIFN0cmluZyBjbGFzc05hbWUsIFN0cmluZyBpZCkgewotCQkJdGhpcy5idW5kbGUgPSBidW5kbGU7Ci0JCQl0aGlzLmNsYXNzTmFtZSA9IGNsYXNzTmFtZTsKLQkJCXRoaXMuaWQgPSBpZDsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZWRpdG9ycy9HcmFwaGljYWxXUERlcGVuZGVuY3lFZGl0b3IuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZWRpdG9ycy9HcmFwaGljYWxXUERlcGVuZGVuY3lFZGl0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjU5MWIyMS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2VkaXRvcnMvR3JhcGhpY2FsV1BEZXBlbmRlbmN5RWRpdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMjkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQuRGlhZ3JhbUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQuV1BEaWFncmFtRWRpdFBhcnRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLnV0aWwuRGlhZ3JhbVVJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLnV0aWwuVGVtcGxhdGVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5EaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk1vZGVsRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Xb3JrUHJvZHVjdE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5SZXNvdXJjZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5wYWxldHRlLkNvbWJpbmVkVGVtcGxhdGVDcmVhdGlvbkVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5wYWxldHRlLkNvbm5lY3Rpb25DcmVhdGlvblRvb2xFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucGFsZXR0ZS5NYXJxdWVlVG9vbEVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5wYWxldHRlLlBhbGV0dGVDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnBhbGV0dGUuUGFsZXR0ZUVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5wYWxldHRlLlBhbGV0dGVHcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucGFsZXR0ZS5QYWxldHRlUm9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucGFsZXR0ZS5QYWxldHRlU2VwYXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5wYWxldHRlLlBhbm5pbmdTZWxlY3Rpb25Ub29sRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnBhbGV0dGUuVG9vbEVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5yZXF1ZXN0cy5DcmVhdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnVpLmFjdGlvbnMuR0VGQWN0aW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JUGVyc2lzdGFibGVFbGVtZW50OwotCi0KLS8qKgotICogQW4gZWRpdG9yIGZvciBncmFwaGljYWwgd29yayBwcm9kdWN0IGRlcGVuZWRlbmN5IGRpYWdyYW0KLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBzaW5jZSAxLjAgCi0gKi8KLXB1YmxpYyBjbGFzcyBHcmFwaGljYWxXUERlcGVuZGVuY3lFZGl0b3IgZXh0ZW5kcyBBYnN0cmFjdERpYWdyYW1FZGl0b3IgewotCi0JcHJpdmF0ZSBDcmVhdGlvbkZhY3Rvcnkgd3BOb2RlQ3JlYXRpb25GYWN0b3J5OwotCi0vLwlwcml2YXRlIElQcm9wZXJ0eVNoZWV0RW50cnkgcm9vdEVudHJ5OwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENSRUFURV9XUF9OT0RFID0gImNyZWF0ZV93b3JrcHJvZHVjdF9kZXNjcmlwdG9yX25vZGUiOyAvLyROT04tTkxTLTEkCi0KLQkvKgotCSAqIENyZWF0ZSBhbiBpbnN0YW5jZQotCSAqLwotCXB1YmxpYyBHcmFwaGljYWxXUERlcGVuZGVuY3lFZGl0b3IoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUNyZWF0aW9uRmFjdG9yaWVzKCkgewotCQlzdXBlci5pbml0aWFsaXplQ3JlYXRpb25GYWN0b3JpZXMoKTsKLQotCQlpZiAod3BOb2RlQ3JlYXRpb25GYWN0b3J5ID09IG51bGwpIHsKLQkJCXdwTm9kZUNyZWF0aW9uRmFjdG9yeSA9IG5ldyBDcmVhdGlvbkZhY3RvcnkoKSB7Ci0JCQkJcHVibGljIE9iamVjdCBnZXROZXdPYmplY3QoKSB7Ci0JCQkJCVdvcmtQcm9kdWN0Tm9kZSBub2RlID0gTW9kZWxGYWN0b3J5LmVJTlNUQU5DRQotCQkJCQkJCS5jcmVhdGVXb3JrUHJvZHVjdE5vZGUoKTsKLQkJCQkJRGlhZ3JhbSBkaWFncmFtID0gKERpYWdyYW0pIGVkaXRQYXJ0LmdldE1vZGVsKCk7Ci0JCQkJCW5vZGUuc2V0VU1BRGlhZ3JhbShkaWFncmFtLmdldFVNQURpYWdyYW0oKSk7Ci0JCQkJCVdvcmtQcm9kdWN0RGVzY3JpcHRvciB3cGQgPSBVbWFGYWN0b3J5LmVJTlNUQU5DRQotCQkJCQkJCS5jcmVhdGVXb3JrUHJvZHVjdERlc2NyaXB0b3IoKTsKLQkJCQkJbm9kZS5zZXREaWFncmFtKGRpYWdyYW0pOwotCQkJCQlub2RlLnNldE9iamVjdCh3cGQpOwotCQkJCQlyZXR1cm4gbm9kZTsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgT2JqZWN0IGdldE9iamVjdFR5cGUoKSB7Ci0KLQkJCQkJcmV0dXJuIFRlbXBsYXRlQ29uc3RhbnRzLldPUktfUFJPRFVDVDsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0JCUNyZWF0aW9uRmFjdG9yeSBjcmVhdGlvbkZhY3RvcnkgPSB3cE5vZGVDcmVhdGlvbkZhY3Rvcnk7Ci0JCXRlbXBsYXRlTmFtZVRvQ3JlYXRpb25GYWN0b3J5TWFwLnB1dChjcmVhdGlvbkZhY3RvcnkuZ2V0T2JqZWN0VHlwZSgpLAotCQkJCWNyZWF0aW9uRmFjdG9yeSk7Ci0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb250cmlidXRlVG9Db250ZXh0TWVudShJTWVudU1hbmFnZXIgbWVudSkgewotCQlzdXBlci5jb250cmlidXRlVG9Db250ZXh0TWVudShtZW51KTsKLQotCQlib29sZWFuIGNhbk1vZGlmeSA9ICFpc1JlYWRPbmx5KCk7Ci0KLQkJLy8gSUFjdGlvbiBhY3Rpb24gPSBnZXRBY3Rpb25SZWdpc3RyeSgpLmdldEFjdGlvbihQUk9QRVJUSUVTX1BBR0UpOwotCQkvLyBpZihhY3Rpb24uaXNFbmFibGVkKCkpIHsKLQkJLy8gbWVudS5hcHBlbmRUb0dyb3VwKEdFRkFjdGlvbkNvbnN0YW50cy5NQl9BRERJVElPTlMsIGFjdGlvbik7Ci0JCS8vIH0KLQkJSUFjdGlvbiBhY3Rpb24gPSBnZXRBY3Rpb25SZWdpc3RyeSgpLmdldEFjdGlvbihDUkVBVEVfV1BfTk9ERSk7Ci0JCWlmIChhY3Rpb24uaXNFbmFibGVkKCkgJiYgY2FuTW9kaWZ5KSB7Ci0JCQltZW51LmFwcGVuZFRvR3JvdXAoR0VGQWN0aW9uQ29uc3RhbnRzLk1CX0FERElUSU9OUywgYWN0aW9uKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUFjdGlvbnMoKSB7Ci0JCXN1cGVyLmNyZWF0ZUFjdGlvbnMoKTsKLQkJLy8gQWN0aW9uUmVnaXN0cnkgcmVnaXN0cnkgPSBnZXRBY3Rpb25SZWdpc3RyeSgpOwotCQkvLyBJQWN0aW9uIGFjdGlvbjsKLQkJLy8KLQkJLy8gYWN0aW9uID0gbmV3IEFjdGlvbigiU2hvdyAmUHJvcGVydGllcyBWaWV3IikgewotCQkvLyBwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQkvLyByZXR1cm4gUFJPUEVSVElFU19QQUdFOwotCQkvLyB9Ci0JCS8vIHB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJLy8gdHJ5IHsKLQkJLy8KLQkJLy8gZ2V0U2l0ZSgpLmdldFBhZ2UoKS5zaG93VmlldygKLQkJLy8gIm9yZy5lY2xpcHNlLnVpLnZpZXdzLlByb3BlcnR5U2hlZXQiKTsKLQkJLy8gLy8gc2V0SWQoIlNob3dfUHJvcGVydGllcyIpOwotCQkvLyB9Ci0JCS8vIGNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLQkJLy8gLy9BdXRob3JpbmdQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGV4Y2VwdGlvbik7Ci0JCS8vIH0KLQkJLy8gfQotCQkvLyBwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWQoKSB7Ci0JCS8vIExpc3QgZWRpdFBhcnRzID0gZ2V0R3JhcGhpY2FsVmlld2VyKCkuZ2V0U2VsZWN0ZWRFZGl0UGFydHMoKTsKLQkJLy8gcmV0dXJuIChlZGl0UGFydHMuc2l6ZSgpID09IDEgJiYgZWRpdFBhcnRzLmdldCgwKSBpbnN0YW5jZW9mCi0JCS8vIEVkaXRQYXJ0KTsKLQkJLy8gfQotCQkvLyB9OwotCQkvLwkJCi0JCS8vIHJlZ2lzdHJ5LnJlZ2lzdGVyQWN0aW9uKGFjdGlvbik7Ci0KLQkJSUFjdGlvbiBhY3Rpb24gPSBjcmVhdGVBbkFjdGlvbigKLQkJCQlEaWFncmFtVUlSZXNvdXJjZXMuQWJzdHJhY3REaWFncmFtX1dvcmtQcm9kdWN0RGVzY3JpcHRvcl90ZXh0LCB3cE5vZGVDcmVhdGlvbkZhY3RvcnksIAotCQkJCUNSRUFURV9XUF9OT0RFLAotCQkJCURpYWdyYW1VSVJlc291cmNlcy5BYnN0cmFjdERpYWdyYW1fV29ya1Byb2R1Y3REZXNjcmlwdG9yX3Rvb2x0aXAsIAotCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoCi0JCQkJCQkiZnVsbC9vYmoxNi9Xb3JrUHJvZHVjdERlc2NyaXB0b3IuZ2lmIikpOyAvLyROT04tTkxTLTEkCi0JCWdldEFjdGlvblJlZ2lzdHJ5KCkucmVnaXN0ZXJBY3Rpb24oYWN0aW9uKTsKLQotCX0KLQotCXByb3RlY3RlZCBQYWxldHRlQ29udGFpbmVyIGNyZWF0ZUNvbnRyb2xHcm91cChQYWxldHRlUm9vdCByb290KSB7Ci0JCWluaXRpYWxpemVDcmVhdGlvbkZhY3RvcmllcygpOwotCQlQYWxldHRlR3JvdXAgY29udHJvbEdyb3VwID0gbmV3IFBhbGV0dGVHcm91cCgiQ29udHJvbCBHcm91cCIpOyAvLyROT04tTkxTLTEkCi0KLQkJTGlzdCBlbnRyaWVzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCVRvb2xFbnRyeSB0b29sID0gbmV3IFBhbm5pbmdTZWxlY3Rpb25Ub29sRW50cnkoRGlhZ3JhbVVJUmVzb3VyY2VzLkFic3RyYWN0RGlhZ3JhbV9TZWxlY3RfdGV4dCwgCi0JCQkJRGlhZ3JhbVVJUmVzb3VyY2VzLkFic3RyYWN0RGlhZ3JhbV9TZWxlY3RfdG9vbHRpcAotCQkpOwotCQl0b29sLnNldFNtYWxsSWNvbihBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKAotCQkJCSJzZWxlY3RfcGFsMTYuZ2lmIikpOyAvLyROT04tTkxTLTEkCi0JCXRvb2wuc2V0TGFyZ2VJY29uKEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoCi0JCQkJInNlbGVjdF9wYWwyNC5naWYiKSk7IC8vJE5PTi1OTFMtMSQKLQkJZW50cmllcy5hZGQodG9vbCk7Ci0JCXJvb3Quc2V0RGVmYXVsdEVudHJ5KHRvb2wpOwotCi0JCXRvb2wgPSBuZXcgTWFycXVlZVRvb2xFbnRyeSgpOwotCQl0b29sLnNldFNtYWxsSWNvbihBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKAotCQkJCSJtYXJxX3BhbDE2LmdpZiIpKTsgLy8kTk9OLU5MUy0xJAotCQl0b29sLnNldExhcmdlSWNvbihBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKAotCQkJCSJtYXJxX3BhbDI0LmdpZiIpKTsgLy8kTk9OLU5MUy0xJAotCQllbnRyaWVzLmFkZCh0b29sKTsKLQotCQl0b29sID0gbmV3IENvbm5lY3Rpb25DcmVhdGlvblRvb2xFbnRyeSgKLQkJCQlEaWFncmFtVUlSZXNvdXJjZXMuQWJzdHJhY3REaWFncmFtX0xpbmtfdGV4dCwgRGlhZ3JhbVVJUmVzb3VyY2VzLkFic3RyYWN0RGlhZ3JhbV9MaW5rX3Rvb2x0aXAsIAotCQkJCW51bGwsIEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoCi0JCQkJCQkibGlua19wYWwxNi5naWYiKSwgLy8kTk9OLU5MUy0xJAotCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoCi0JCQkJCQkibGlua19wYWwyNC5naWYiKS8vJE5PTi1OTFMtMSQKLQkJKTsKLQkJZW50cmllcy5hZGQodG9vbCk7Ci0JCUNvbWJpbmVkVGVtcGxhdGVDcmVhdGlvbkVudHJ5IGNvbWJpbmVkID0gbmV3IENvbWJpbmVkVGVtcGxhdGVDcmVhdGlvbkVudHJ5KAotCQkJCURpYWdyYW1VSVJlc291cmNlcy5BYnN0cmFjdERpYWdyYW1fRnJlZVRleHRfdGV4dCwgCi0JCQkJRGlhZ3JhbVVJUmVzb3VyY2VzLkFic3RyYWN0RGlhZ3JhbV9GcmVlVGV4dF90b29sdGlwLCAKLQkJCQlUZW1wbGF0ZUNvbnN0YW50cy5GUkVFX1RFWFQsIGZyZWVUeHROb2RlQ3JlYXRpb25GYWN0b3J5LAotCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoCi0JCQkJCQkiZnJlZXRleHRfcGFsMTYuZ2lmIiksIC8vJE5PTi1OTFMtMSQKLQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKAotCQkJCQkJImZyZWV0ZXh0X3BhbDI0LmdpZiIpLy8kTk9OLU5MUy0xJAotCQkpOwotCQllbnRyaWVzLmFkZChjb21iaW5lZCk7Ci0KLQkJUGFsZXR0ZVNlcGFyYXRvciBzZXAgPSBuZXcgUGFsZXR0ZVNlcGFyYXRvcigKLQkJCQlHcmFwaGljYWxXUERlcGVuZGVuY3lFZGl0b3IuY2xhc3MuZ2V0TmFtZSgpICsgInNlcDEiKTsgLy8kTk9OLU5MUy0xJAotCQlzZXAKLQkJCQkuc2V0VXNlck1vZGlmaWNhdGlvblBlcm1pc3Npb24oUGFsZXR0ZUVudHJ5LlBFUk1JU1NJT05fTk9fTU9ESUZJQ0FUSU9OKTsKLQkJZW50cmllcy5hZGQoc2VwKTsgCi0KLQkJY29tYmluZWQgPSBuZXcgQ29tYmluZWRUZW1wbGF0ZUNyZWF0aW9uRW50cnkoCi0JCQkJRGlhZ3JhbVVJUmVzb3VyY2VzLkFic3RyYWN0RGlhZ3JhbV9Xb3JrUHJvZHVjdERlc2NyaXB0b3JfdGV4dCwgCi0JCQkJRGlhZ3JhbVVJUmVzb3VyY2VzLkFic3RyYWN0RGlhZ3JhbV9Xb3JrUHJvZHVjdERlc2NyaXB0b3JfdG9vbHRpcCwgCi0JCQkJVGVtcGxhdGVDb25zdGFudHMuV09SS19QUk9EVUNULCB3cE5vZGVDcmVhdGlvbkZhY3RvcnksCi0JCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcigKLQkJCQkJCSJmdWxsL29iajE2L1dvcmtQcm9kdWN0RGVzY3JpcHRvci5naWYiKSwgLy8kTk9OLU5MUy0xJAotCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoCi0JCQkJCQkiZnVsbC9vYmoxNi9Xb3JrUHJvZHVjdERlc2NyaXB0b3IuZ2lmIikvLyROT04tTkxTLTEkCi0JCSk7Ci0JCWVudHJpZXMuYWRkKGNvbWJpbmVkKTsKLQkJY29udHJvbEdyb3VwLmFkZEFsbChlbnRyaWVzKTsKLQkJcmV0dXJuIGNvbnRyb2xHcm91cDsKLQl9Ci0KLQlwcm90ZWN0ZWQgRWRpdFBhcnRGYWN0b3J5IGNyZWF0ZUVkaXRQYXJ0RmFjdG9yeSgpIHsKLQkJcmV0dXJuIG5ldyBXUERpYWdyYW1FZGl0UGFydEZhY3RvcnkoKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuQWJzdHJhY3REaWFncmFtRWRpdG9yI2NyZWF0ZURpYWdyYW1FZGl0UGFydCgpCi0JICovCi0JcHJvdGVjdGVkIEVkaXRQYXJ0IGNyZWF0ZURpYWdyYW1FZGl0UGFydCgpIHsKLQkJIERpYWdyYW1FZGl0UGFydCBlZGl0UGFydCA9IG5ldyBEaWFncmFtRWRpdFBhcnQoTW9kZWxGYWN0b3J5LmVJTlNUQU5DRQotCQkJCS5jcmVhdGVXb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtKCkpOwotCQkgZWRpdFBhcnQubWFya0RpcnR5KHRydWUpOwotCQkgcmV0dXJuIGVkaXRQYXJ0OwotCX0KLQkKLS8vCXByb3RlY3RlZCBFZGl0UGFydCBjcmVhdGVFZGl0UGFydChPYmplY3QgZSkgewotLy8JCVdvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW0gZGlhZ3JhbSA9IE1vZGVsRmFjdG9yeS5lSU5TVEFOQ0UKLS8vCQkJCS5jcmVhdGVXb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtKCk7Ci0vLwkJZGlhZ3JhbS5zZXRPYmplY3QoZSk7Ci0vLwkJRWRpdFBhcnQgcGFydCA9IG5ldyBEaWFncmFtRWRpdFBhcnQoZGlhZ3JhbSk7Ci0vLwkJcGFydC5zZXRNb2RlbChkaWFncmFtKTsKLS8vCQlkaWFncmFtLmFkZENvbnN1bWVyKHRoaXMpOwotLy8JCXJldHVybiBwYXJ0OwotLy8JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRQYXJ0TmFtZVByZWZpeCgpIHsKLQkJcmV0dXJuIERpYWdyYW1VSVJlc291cmNlcy5Xb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtX3ByZWZpeDsgCi0JfQotCi0JLyoqCi0JICogQW4gZWRpdG9yIGlucHV0IAotCSAqCi0JICoKLQkgKi8KLQkvKioKLQkgKiBAYXV0aG9yIHNoaWxwYXQKLQkgKgotCSAqLwotCXB1YmxpYyBjbGFzcyBFZGl0b3JJbnB1dCBpbXBsZW1lbnRzIElFZGl0b3JJbnB1dCB7Ci0KLQkJLyoqCi0JCSAqIEBwYXJhbSBlCi0JCSAqLwotCQlwdWJsaWMgRWRpdG9ySW5wdXQoTWV0aG9kRWxlbWVudCBlKSB7Ci0JCX0KLQotCQkvKioKLQkJICogQHNlZSBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQjZXhpc3RzKCkKLQkJICovCi0JCXB1YmxpYyBib29sZWFuIGV4aXN0cygpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCS8qKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dCNnZXRJbWFnZURlc2NyaXB0b3IoKQotCQkgKi8KLQkJcHVibGljIEltYWdlRGVzY3JpcHRvciBnZXRJbWFnZURlc2NyaXB0b3IoKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCS8qKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dCNnZXROYW1lKCkKLQkJICovCi0JCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0I2dldFBlcnNpc3RhYmxlKCkKLQkJICovCi0JCXB1YmxpYyBJUGVyc2lzdGFibGVFbGVtZW50IGdldFBlcnNpc3RhYmxlKCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQkvKioKLQkJICogQHNlZSBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQjZ2V0VG9vbFRpcFRleHQoKQotCQkgKi8KLQkJcHVibGljIFN0cmluZyBnZXRUb29sVGlwVGV4dCgpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGUjZ2V0QWRhcHRlcihqYXZhLmxhbmcuQ2xhc3MpCi0JCSAqLwotCQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgdHlwZSkgewotCQkJLy8gaWYgKHR5cGUuZXF1YWxzKElQcm9wZXJ0eVNoZWV0UGFnZS5jbGFzcykpIHsKLQkJCS8vIHJldHVybiBnZXRQcm9wZXJ0eVNoZWV0UGFnZSgpOwotCQkJLy8gfWVsc2UKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLS8vCQlwcml2YXRlIE9iamVjdCBnZXRQcm9wZXJ0eVNoZWV0UGFnZSgpIHsKLS8vCi0vLwkJCWlmIChyb290RW50cnkgPT0gbnVsbCkgewotLy8JCQkJLy8gY3JlYXRlIGEgbmV3IHJvb3QKLS8vCQkJCVByb3BlcnR5U2hlZXRFbnRyeSByb290ID0gbmV3IFByb3BlcnR5U2hlZXRFbnRyeSgpOwotLy8JCQkJcm9vdEVudHJ5ID0gcm9vdDsKLS8vCQkJfQotLy8JCQlpZiAocm9vdEVudHJ5IGluc3RhbmNlb2YgUHJvcGVydHlTaGVldEVudHJ5KSB7Ci0vLwkJCQkvLyA9IHdwRWRpdFBhcnQuZ2V0Vmlld2VyKCk7Ci0vLwkJCQkvLyBJU2VsZWN0aW9uUHJvdmlkZXIgcHJvdmlkZXIgPSBuZXcKLS8vCQkJCS8vIEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKFdQKTsKLS8vCQkJCS8vICgoUHJvcGVydHlTaGVldEVudHJ5KSByb290RW50cnkpLnNldFByb3BlcnR5U291cmNlUHJvdmlkZXIoKTsKLS8vCQkJfQotLy8JCQlyZXR1cm4gcm9vdEVudHJ5OwotLy8JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERpYWdyYW1UeXBlKCkgewotCQlyZXR1cm4gUmVzb3VyY2VIZWxwZXIuRElBR1JBTV9UWVBFX1dQX0RFUEVOREVOQ1k7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9lZGl0b3JzL0dyYXBoaWNhbFdvcmtmbG93RWRpdG9yLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2VkaXRvcnMvR3JhcGhpY2FsV29ya2Zsb3dFZGl0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTY4YTM1MS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2VkaXRvcnMvR3JhcGhpY2FsV29ya2Zsb3dFZGl0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg3MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZWRpdC5BY3Rpdml0eURpYWdyYW1FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0LkFjdGl2aXR5RGlhZ3JhbUVkaXRQYXJ0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi51dGlsLkRpYWdyYW1VSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi51dGlsLlRlbXBsYXRlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuRGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5MaW5rZWRPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTW9kZWxGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuVHlwZWROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLldvcmtCcmVha2Rvd25FbGVtZW50Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC51dGlsLkdyYXBoaWNhbERhdGFIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlN1cHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuUmVzb3VyY2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNhcGFiaWxpdHlQYXR0ZXJuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcnlQcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuSXRlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlBoYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucGFsZXR0ZS5Db21iaW5lZFRlbXBsYXRlQ3JlYXRpb25FbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucGFsZXR0ZS5Db25uZWN0aW9uQ3JlYXRpb25Ub29sRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnBhbGV0dGUuTWFycXVlZVRvb2xFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucGFsZXR0ZS5QYWxldHRlQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5wYWxldHRlLlBhbGV0dGVFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucGFsZXR0ZS5QYWxldHRlR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnBhbGV0dGUuUGFsZXR0ZVJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnBhbGV0dGUuUGFsZXR0ZVNlcGFyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucGFsZXR0ZS5QYW5uaW5nU2VsZWN0aW9uVG9vbEVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5wYWxldHRlLlRvb2xFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuQ3JlYXRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi51aS5hY3Rpb25zLkdFRkFjdGlvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLlNlcGFyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGFydEluaXRFeGNlcHRpb247Ci0KLQotLyoqCi0gKiBBbiBlZGl0b3IgZm9yIGdyYXBoaWNhbCB3b3JrZmxvdwotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgR3JhcGhpY2FsV29ya2Zsb3dFZGl0b3IgZXh0ZW5kcyBBYnN0cmFjdERpYWdyYW1FZGl0b3IgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE9QRU5fV09SS0ZMT1dfREVUQUlMX0RJQUdSQU0gPSAib3Blbl93b3JrZmxvd19kZXRhaWxfZGlhZ3JhbSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDUkVBVEVfU1RBUlRfTk9ERSA9ICJjcmVhdGVfc3RhcnRfbm9kZSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDUkVBVEVfRU5EX05PREUgPSAiY3JlYXRlX2VuZF9ub2RlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENSRUFURV9TWU5DX0JBUiA9ICJjcmVhdGVfc3luY19iYXIiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1JFQVRFX0RFQ0lTSU9OX0JBUiA9ICJjcmVhdGVfZGVjaXNpb25fYmFyIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENSRUFURV9BQ1RJVklUWSA9ICJjcmVhdGVfYWN0aXZpdHkiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1JFQVRFX1BIQVNFID0gImNyZWF0ZV9waGFzZSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDUkVBVEVfSVRFUkFUSU9OID0gImNyZWF0ZV9pdGVyYXRpb24iOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1JFQVRFX1RBU0tfREVTQ1JJUFRPUiA9ICJjcmVhdGVfdGFza19kZXNjcmlwdG9yIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBDcmVhdGlvbkZhY3RvcnkgYWN0aXZpdHlOb2RlQ3JlYXRpb25GYWN0b3J5OwotCi0JcHJpdmF0ZSBDcmVhdGlvbkZhY3RvcnkgcGhhc2VOb2RlQ3JlYXRpb25GYWN0b3J5OwotCi0JcHJpdmF0ZSBDcmVhdGlvbkZhY3RvcnkgaXRlcmF0aW9uTm9kZUNyZWF0aW9uRmFjdG9yeTsKLQotCXByaXZhdGUgQ3JlYXRpb25GYWN0b3J5IHN5bmNoQmFyQ3JlYXRpb25GYWN0b3J5OwotCi0JcHJpdmF0ZSBDcmVhdGlvbkZhY3RvcnkgZGVjaXNpb25Ob2RlQ3JlYXRpb25GYWN0b3J5OwotCi0JcHJpdmF0ZSBDcmVhdGlvbkZhY3Rvcnkgc3RhcnROb2RlQ3JlYXRpb25GYWN0b3J5OwotCi0JcHJpdmF0ZSBDcmVhdGlvbkZhY3RvcnkgZW5kTm9kZUNyZWF0aW9uRmFjdG9yeTsKLQotCXByaXZhdGUgQ3JlYXRpb25GYWN0b3J5IHRhc2tEZXNjcmlwdG9yTm9kZUNyZWF0aW9uRmFjdG9yeTsKLQotCS8qKgotCSAqIENyZWF0ZSBhbiBpbnN0YW5jZQotCSAqLwotCXB1YmxpYyBHcmFwaGljYWxXb3JrZmxvd0VkaXRvcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplQ3JlYXRpb25GYWN0b3JpZXMoKSB7Ci0JCXN1cGVyLmluaXRpYWxpemVDcmVhdGlvbkZhY3RvcmllcygpOwotCi0JCWlmIChhY3Rpdml0eU5vZGVDcmVhdGlvbkZhY3RvcnkgPT0gbnVsbCkKLQkJCWFjdGl2aXR5Tm9kZUNyZWF0aW9uRmFjdG9yeSA9IG5ldyBDcmVhdGlvbkZhY3RvcnkoKSB7Ci0KLQkJCQlwdWJsaWMgT2JqZWN0IGdldE5ld09iamVjdCgpIHsKLQkJCQkJLy8gQWN0aXZpdHlOb2RlIG5vZGUgPQotCQkJCQkvLyBNb2RlbEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUFjdGl2aXR5Tm9kZSgpOwotCQkJCQlXb3JrQnJlYWtkb3duRWxlbWVudE5vZGUgbm9kZSA9IE1vZGVsRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkJCQkuY3JlYXRlV29ya0JyZWFrZG93bkVsZW1lbnROb2RlKCk7Ci0JCQkJCURpYWdyYW0gZGlhZ3JhbSA9IChEaWFncmFtKSBlZGl0UGFydC5nZXRNb2RlbCgpOwotCQkJCQlub2RlLnNldFVNQURpYWdyYW0oZGlhZ3JhbS5nZXRVTUFEaWFncmFtKCkpOwotCQkJCQlub2RlLnNldERpYWdyYW0oZGlhZ3JhbSk7Ci0JCQkJCW5vZGUuc2V0T2JqZWN0KFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUFjdGl2aXR5KCkpOwotCQkJCQlyZXR1cm4gbm9kZTsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgT2JqZWN0IGdldE9iamVjdFR5cGUoKSB7Ci0JCQkJCXJldHVybiBUZW1wbGF0ZUNvbnN0YW50cy5BQ1RJVklUWTsKLQkJCQl9Ci0KLQkJCX07Ci0JCUNyZWF0aW9uRmFjdG9yeSBjcmVhdGlvbkZhY3RvcnkgPSBhY3Rpdml0eU5vZGVDcmVhdGlvbkZhY3Rvcnk7Ci0JCXRlbXBsYXRlTmFtZVRvQ3JlYXRpb25GYWN0b3J5TWFwLnB1dChjcmVhdGlvbkZhY3RvcnkuZ2V0T2JqZWN0VHlwZSgpLAotCQkJCWNyZWF0aW9uRmFjdG9yeSk7Ci0KLQkJaWYgKHBoYXNlTm9kZUNyZWF0aW9uRmFjdG9yeSA9PSBudWxsKQotCQkJcGhhc2VOb2RlQ3JlYXRpb25GYWN0b3J5ID0gbmV3IENyZWF0aW9uRmFjdG9yeSgpIHsKLQotCQkJCXB1YmxpYyBPYmplY3QgZ2V0TmV3T2JqZWN0KCkgewotCQkJCQkvLyBBY3Rpdml0eU5vZGUgbm9kZSA9Ci0JCQkJCS8vIE1vZGVsRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQWN0aXZpdHlOb2RlKCk7Ci0JCQkJCVdvcmtCcmVha2Rvd25FbGVtZW50Tm9kZSBub2RlID0gTW9kZWxGYWN0b3J5LmVJTlNUQU5DRQotCQkJCQkJCS5jcmVhdGVXb3JrQnJlYWtkb3duRWxlbWVudE5vZGUoKTsKLQkJCQkJRGlhZ3JhbSBkaWFncmFtID0gKERpYWdyYW0pIGVkaXRQYXJ0LmdldE1vZGVsKCk7Ci0JCQkJCW5vZGUuc2V0VU1BRGlhZ3JhbShkaWFncmFtLmdldFVNQURpYWdyYW0oKSk7Ci0JCQkJCW5vZGUuc2V0RGlhZ3JhbShkaWFncmFtKTsKLQkJCQkJbm9kZS5zZXRPYmplY3QoVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUGhhc2UoKSk7Ci0JCQkJCXJldHVybiBub2RlOwotCQkJCX0KLQotCQkJCXB1YmxpYyBPYmplY3QgZ2V0T2JqZWN0VHlwZSgpIHsKLQkJCQkJcmV0dXJuIFRlbXBsYXRlQ29uc3RhbnRzLlBIQVNFOwotCQkJCX0KLQotCQkJfTsKLQkJY3JlYXRpb25GYWN0b3J5ID0gcGhhc2VOb2RlQ3JlYXRpb25GYWN0b3J5OwotCQl0ZW1wbGF0ZU5hbWVUb0NyZWF0aW9uRmFjdG9yeU1hcC5wdXQoY3JlYXRpb25GYWN0b3J5LmdldE9iamVjdFR5cGUoKSwKLQkJCQljcmVhdGlvbkZhY3RvcnkpOwotCi0JCWlmIChpdGVyYXRpb25Ob2RlQ3JlYXRpb25GYWN0b3J5ID09IG51bGwpCi0JCQlpdGVyYXRpb25Ob2RlQ3JlYXRpb25GYWN0b3J5ID0gbmV3IENyZWF0aW9uRmFjdG9yeSgpIHsKLQotCQkJCXB1YmxpYyBPYmplY3QgZ2V0TmV3T2JqZWN0KCkgewotCQkJCQkvLyBBY3Rpdml0eU5vZGUgbm9kZSA9Ci0JCQkJCS8vIE1vZGVsRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQWN0aXZpdHlOb2RlKCk7Ci0JCQkJCVdvcmtCcmVha2Rvd25FbGVtZW50Tm9kZSBub2RlID0gTW9kZWxGYWN0b3J5LmVJTlNUQU5DRQotCQkJCQkJCS5jcmVhdGVXb3JrQnJlYWtkb3duRWxlbWVudE5vZGUoKTsKLQkJCQkJRGlhZ3JhbSBkaWFncmFtID0gKERpYWdyYW0pIGVkaXRQYXJ0LmdldE1vZGVsKCk7Ci0JCQkJCW5vZGUuc2V0VU1BRGlhZ3JhbShkaWFncmFtLmdldFVNQURpYWdyYW0oKSk7Ci0JCQkJCW5vZGUuc2V0RGlhZ3JhbShkaWFncmFtKTsKLQkJCQkJbm9kZS5zZXRPYmplY3QoVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlSXRlcmF0aW9uKCkpOwotCQkJCQlyZXR1cm4gbm9kZTsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgT2JqZWN0IGdldE9iamVjdFR5cGUoKSB7Ci0JCQkJCXJldHVybiBUZW1wbGF0ZUNvbnN0YW50cy5JVEVSQVRJT047Ci0JCQkJfQotCi0JCQl9OwotCQljcmVhdGlvbkZhY3RvcnkgPSBpdGVyYXRpb25Ob2RlQ3JlYXRpb25GYWN0b3J5OwotCQl0ZW1wbGF0ZU5hbWVUb0NyZWF0aW9uRmFjdG9yeU1hcC5wdXQoY3JlYXRpb25GYWN0b3J5LmdldE9iamVjdFR5cGUoKSwKLQkJCQljcmVhdGlvbkZhY3RvcnkpOwotCi0JCWlmIChzeW5jaEJhckNyZWF0aW9uRmFjdG9yeSA9PSBudWxsKQotCQkJc3luY2hCYXJDcmVhdGlvbkZhY3RvcnkgPSBuZXcgQ3JlYXRpb25GYWN0b3J5KCkgewotCi0JCQkJcHVibGljIE9iamVjdCBnZXROZXdPYmplY3QoKSB7Ci0JCQkJCVR5cGVkTm9kZSBub2RlID0gTW9kZWxGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVUeXBlZE5vZGUoKTsKLQkJCQkJbm9kZS5zZXRUeXBlKFR5cGVkTm9kZS5TWU5DSF9CQVIpOwotCQkJCQlub2RlLnNldE9iamVjdChHcmFwaGljYWxEYXRhSGVscGVyCi0JCQkJCQkJLm5ld1R5cGVkR3JhcGhOb2RlKFR5cGVkTm9kZS5TWU5DSF9CQVIpKTsKLQkJCQkJcmV0dXJuIG5vZGU7Ci0JCQkJfQotCi0JCQkJcHVibGljIE9iamVjdCBnZXRPYmplY3RUeXBlKCkgewotCQkJCQlyZXR1cm4gVGVtcGxhdGVDb25zdGFudHMuU1lOQ0hfQkFSOwotCQkJCX0KLQotCQkJfTsKLQkJY3JlYXRpb25GYWN0b3J5ID0gc3luY2hCYXJDcmVhdGlvbkZhY3Rvcnk7Ci0JCXRlbXBsYXRlTmFtZVRvQ3JlYXRpb25GYWN0b3J5TWFwLnB1dChjcmVhdGlvbkZhY3RvcnkuZ2V0T2JqZWN0VHlwZSgpLAotCQkJCWNyZWF0aW9uRmFjdG9yeSk7Ci0KLQkJaWYgKGRlY2lzaW9uTm9kZUNyZWF0aW9uRmFjdG9yeSA9PSBudWxsKQotCQkJZGVjaXNpb25Ob2RlQ3JlYXRpb25GYWN0b3J5ID0gbmV3IENyZWF0aW9uRmFjdG9yeSgpIHsKLQotCQkJCXB1YmxpYyBPYmplY3QgZ2V0TmV3T2JqZWN0KCkgewotCQkJCQlUeXBlZE5vZGUgbm9kZSA9IE1vZGVsRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlVHlwZWROb2RlKCk7Ci0JCQkJCW5vZGUuc2V0VHlwZShUeXBlZE5vZGUuREVDSVNJT04pOwotCQkJCQlub2RlLnNldE9iamVjdChHcmFwaGljYWxEYXRhSGVscGVyCi0JCQkJCQkJLm5ld1R5cGVkR3JhcGhOb2RlKFR5cGVkTm9kZS5ERUNJU0lPTikpOwotCQkJCQlyZXR1cm4gbm9kZTsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgT2JqZWN0IGdldE9iamVjdFR5cGUoKSB7Ci0JCQkJCXJldHVybiBUZW1wbGF0ZUNvbnN0YW50cy5ERUNJU0lPTl9OT0RFOwotCQkJCX0KLQotCQkJfTsKLQkJY3JlYXRpb25GYWN0b3J5ID0gZGVjaXNpb25Ob2RlQ3JlYXRpb25GYWN0b3J5OwotCQl0ZW1wbGF0ZU5hbWVUb0NyZWF0aW9uRmFjdG9yeU1hcC5wdXQoY3JlYXRpb25GYWN0b3J5LmdldE9iamVjdFR5cGUoKSwKLQkJCQljcmVhdGlvbkZhY3RvcnkpOwotCi0JCWlmIChzdGFydE5vZGVDcmVhdGlvbkZhY3RvcnkgPT0gbnVsbCkKLQkJCXN0YXJ0Tm9kZUNyZWF0aW9uRmFjdG9yeSA9IG5ldyBDcmVhdGlvbkZhY3RvcnkoKSB7Ci0KLQkJCQlwdWJsaWMgT2JqZWN0IGdldE5ld09iamVjdCgpIHsKLQkJCQkJVHlwZWROb2RlIG5vZGUgPSBNb2RlbEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVR5cGVkTm9kZSgpOwotCQkJCQlub2RlLnNldFR5cGUoVHlwZWROb2RlLlNUQVJUKTsKLQkJCQkJbm9kZS5zZXRPYmplY3QoR3JhcGhpY2FsRGF0YUhlbHBlcgotCQkJCQkJCS5uZXdUeXBlZEdyYXBoTm9kZShUeXBlZE5vZGUuU1RBUlQpKTsKLQkJCQkJcmV0dXJuIG5vZGU7Ci0JCQkJfQotCi0JCQkJcHVibGljIE9iamVjdCBnZXRPYmplY3RUeXBlKCkgewotCQkJCQlyZXR1cm4gVGVtcGxhdGVDb25zdGFudHMuU1RBUlRfTk9ERTsKLQkJCQl9Ci0KLQkJCX07Ci0JCWNyZWF0aW9uRmFjdG9yeSA9IHN0YXJ0Tm9kZUNyZWF0aW9uRmFjdG9yeTsKLQkJdGVtcGxhdGVOYW1lVG9DcmVhdGlvbkZhY3RvcnlNYXAucHV0KGNyZWF0aW9uRmFjdG9yeS5nZXRPYmplY3RUeXBlKCksCi0JCQkJY3JlYXRpb25GYWN0b3J5KTsKLQotCQlpZiAoZW5kTm9kZUNyZWF0aW9uRmFjdG9yeSA9PSBudWxsKQotCQkJZW5kTm9kZUNyZWF0aW9uRmFjdG9yeSA9IG5ldyBDcmVhdGlvbkZhY3RvcnkoKSB7Ci0KLQkJCQlwdWJsaWMgT2JqZWN0IGdldE5ld09iamVjdCgpIHsKLQkJCQkJVHlwZWROb2RlIG5vZGUgPSBNb2RlbEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVR5cGVkTm9kZSgpOwotCQkJCQlub2RlLnNldFR5cGUoVHlwZWROb2RlLkVORCk7Ci0JCQkJCW5vZGUuc2V0T2JqZWN0KEdyYXBoaWNhbERhdGFIZWxwZXIKLQkJCQkJCQkubmV3VHlwZWRHcmFwaE5vZGUoVHlwZWROb2RlLkVORCkpOwotCQkJCQlyZXR1cm4gbm9kZTsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgT2JqZWN0IGdldE9iamVjdFR5cGUoKSB7Ci0JCQkJCXJldHVybiBUZW1wbGF0ZUNvbnN0YW50cy5FTkRfTk9ERTsKLQkJCQl9Ci0KLQkJCX07Ci0JCWNyZWF0aW9uRmFjdG9yeSA9IGVuZE5vZGVDcmVhdGlvbkZhY3Rvcnk7Ci0JCXRlbXBsYXRlTmFtZVRvQ3JlYXRpb25GYWN0b3J5TWFwLnB1dChjcmVhdGlvbkZhY3RvcnkuZ2V0T2JqZWN0VHlwZSgpLAotCQkJCWNyZWF0aW9uRmFjdG9yeSk7Ci0KLQkJaWYgKHRhc2tEZXNjcmlwdG9yTm9kZUNyZWF0aW9uRmFjdG9yeSA9PSBudWxsKQotCQkJdGFza0Rlc2NyaXB0b3JOb2RlQ3JlYXRpb25GYWN0b3J5ID0gbmV3IENyZWF0aW9uRmFjdG9yeSgpIHsKLQotCQkJCXB1YmxpYyBPYmplY3QgZ2V0TmV3T2JqZWN0KCkgewotCQkJCQlXb3JrQnJlYWtkb3duRWxlbWVudE5vZGUgbm9kZSA9IE1vZGVsRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkJCQkuY3JlYXRlV29ya0JyZWFrZG93bkVsZW1lbnROb2RlKCk7Ci0JCQkJCURpYWdyYW0gZGlhZ3JhbSA9IChEaWFncmFtKSBlZGl0UGFydC5nZXRNb2RlbCgpOwotCQkJCQlub2RlLnNldFVNQURpYWdyYW0oZGlhZ3JhbS5nZXRVTUFEaWFncmFtKCkpOwotCQkJCQlub2RlLnNldERpYWdyYW0oZGlhZ3JhbSk7Ci0JCQkJCW5vZGUuc2V0T2JqZWN0KFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVRhc2tEZXNjcmlwdG9yKCkpOwotCQkJCQlyZXR1cm4gbm9kZTsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgT2JqZWN0IGdldE9iamVjdFR5cGUoKSB7Ci0JCQkJCXJldHVybiBUZW1wbGF0ZUNvbnN0YW50cy5UQVNLX0RFU0NSSVBUT1I7Ci0JCQkJfQotCi0JCQl9OwotCQljcmVhdGlvbkZhY3RvcnkgPSB0YXNrRGVzY3JpcHRvck5vZGVDcmVhdGlvbkZhY3Rvcnk7Ci0JCXRlbXBsYXRlTmFtZVRvQ3JlYXRpb25GYWN0b3J5TWFwLnB1dChjcmVhdGlvbkZhY3RvcnkuZ2V0T2JqZWN0VHlwZSgpLAotCQkJCWNyZWF0aW9uRmFjdG9yeSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY29udHJpYnV0ZVRvQ29udGV4dE1lbnUoSU1lbnVNYW5hZ2VyIG1lbnUpIHsKLQkJc3VwZXIuY29udHJpYnV0ZVRvQ29udGV4dE1lbnUobWVudSk7Ci0KLQkJYm9vbGVhbiBjYW5Nb2RpZnkgPSAhaXNSZWFkT25seSgpOwotCi0JCW1lbnUuaW5zZXJ0QWZ0ZXIoR0VGQWN0aW9uQ29uc3RhbnRzLk1CX0FERElUSU9OUywgbmV3IFNlcGFyYXRvcigKLQkJCQlHRUZBY3Rpb25Db25zdGFudHMuTUJfQURESVRJT05TKSk7Ci0KLQkJSUFjdGlvbiBhY3Rpb24gPSBnZXRBY3Rpb25SZWdpc3RyeSgpLmdldEFjdGlvbigKLQkJCQlPUEVOX1dPUktGTE9XX0RFVEFJTF9ESUFHUkFNKTsKLQkJaWYgKGFjdGlvbi5pc0VuYWJsZWQoKSkgewotCQkJbWVudS5hcHBlbmRUb0dyb3VwKEdFRkFjdGlvbkNvbnN0YW50cy5NQl9BRERJVElPTlMsIGFjdGlvbik7Ci0JCX0KLQkJbWVudS5pbnNlcnRBZnRlcihHRUZBY3Rpb25Db25zdGFudHMuTUJfQURESVRJT05TLCBuZXcgU2VwYXJhdG9yKAotCQkJCUdFRkFjdGlvbkNvbnN0YW50cy5NQl9BRERJVElPTlMpKTsKLQotCQlhY3Rpb24gPSBnZXRBY3Rpb25SZWdpc3RyeSgpLmdldEFjdGlvbihDUkVBVEVfU1RBUlRfTk9ERSk7Ci0JCWlmIChhY3Rpb24uaXNFbmFibGVkKCkgJiYgY2FuTW9kaWZ5KSB7Ci0JCQltZW51LmFwcGVuZFRvR3JvdXAoR0VGQWN0aW9uQ29uc3RhbnRzLk1CX0FERElUSU9OUywgYWN0aW9uKTsKLQkJfQotCi0JCS8vIGFjdGlvbiA9IGdldEFjdGlvblJlZ2lzdHJ5KCkuZ2V0QWN0aW9uKENSRUFURV9GUkVFX1RFWFQpOwotCQkvLyBpZihhY3Rpb24uaXNFbmFibGVkKCkpIHsKLQkJLy8gbWVudS5hcHBlbmRUb0dyb3VwKEdFRkFjdGlvbkNvbnN0YW50cy5NQl9BRERJVElPTlMsIGFjdGlvbik7Ci0JCS8vIH0KLQotCQlhY3Rpb24gPSBnZXRBY3Rpb25SZWdpc3RyeSgpLmdldEFjdGlvbihDUkVBVEVfU1lOQ19CQVIpOwotCQlpZiAoYWN0aW9uLmlzRW5hYmxlZCgpICYmIGNhbk1vZGlmeSkgewotCQkJbWVudS5hcHBlbmRUb0dyb3VwKEdFRkFjdGlvbkNvbnN0YW50cy5NQl9BRERJVElPTlMsIGFjdGlvbik7Ci0JCX0KLQotCQlhY3Rpb24gPSBnZXRBY3Rpb25SZWdpc3RyeSgpLmdldEFjdGlvbihDUkVBVEVfREVDSVNJT05fQkFSKTsKLQkJaWYgKGFjdGlvbi5pc0VuYWJsZWQoKSAmJiBjYW5Nb2RpZnkpIHsKLQkJCW1lbnUuYXBwZW5kVG9Hcm91cChHRUZBY3Rpb25Db25zdGFudHMuTUJfQURESVRJT05TLCBhY3Rpb24pOwotCQl9Ci0KLQkJYWN0aW9uID0gZ2V0QWN0aW9uUmVnaXN0cnkoKS5nZXRBY3Rpb24oQ1JFQVRFX0VORF9OT0RFKTsKLQkJaWYgKGFjdGlvbi5pc0VuYWJsZWQoKSAmJiBjYW5Nb2RpZnkpIHsKLQkJCW1lbnUuYXBwZW5kVG9Hcm91cChHRUZBY3Rpb25Db25zdGFudHMuTUJfQURESVRJT05TLCBhY3Rpb24pOwotCQl9Ci0JCW1lbnUuaW5zZXJ0QWZ0ZXIoR0VGQWN0aW9uQ29uc3RhbnRzLk1CX0FERElUSU9OUywgbmV3IFNlcGFyYXRvcigKLQkJCQlHRUZBY3Rpb25Db25zdGFudHMuTUJfQURESVRJT05TKSk7Ci0KLQkJYWN0aW9uID0gZ2V0QWN0aW9uUmVnaXN0cnkoKS5nZXRBY3Rpb24oQ1JFQVRFX0FDVElWSVRZKTsKLQkJaWYgKGFjdGlvbi5pc0VuYWJsZWQoKSAmJiBjYW5Nb2RpZnkpIHsKLQkJCW1lbnUuYXBwZW5kVG9Hcm91cChHRUZBY3Rpb25Db25zdGFudHMuTUJfQURESVRJT05TLCBhY3Rpb24pOwotCQl9Ci0JCWFjdGlvbiA9IGdldEFjdGlvblJlZ2lzdHJ5KCkuZ2V0QWN0aW9uKENSRUFURV9JVEVSQVRJT04pOwotCQlpZiAoYWN0aW9uLmlzRW5hYmxlZCgpICYmIGNhbk1vZGlmeSkgewotCQkJbWVudS5hcHBlbmRUb0dyb3VwKEdFRkFjdGlvbkNvbnN0YW50cy5NQl9BRERJVElPTlMsIGFjdGlvbik7Ci0JCX0KLQotCQlhY3Rpb24gPSBnZXRBY3Rpb25SZWdpc3RyeSgpLmdldEFjdGlvbihDUkVBVEVfUEhBU0UpOwotCQlpZiAoYWN0aW9uLmlzRW5hYmxlZCgpICYmIGNhbk1vZGlmeSkgewotCQkJbWVudS5hcHBlbmRUb0dyb3VwKEdFRkFjdGlvbkNvbnN0YW50cy5NQl9BRERJVElPTlMsIGFjdGlvbik7Ci0JCX0KLQotCQlhY3Rpb24gPSBnZXRBY3Rpb25SZWdpc3RyeSgpLmdldEFjdGlvbihDUkVBVEVfVEFTS19ERVNDUklQVE9SKTsKLQkJaWYgKGFjdGlvbi5pc0VuYWJsZWQoKSAmJiBjYW5Nb2RpZnkpIHsKLQkJCW1lbnUuYXBwZW5kVG9Hcm91cChHRUZBY3Rpb25Db25zdGFudHMuTUJfQURESVRJT05TLCBhY3Rpb24pOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQWN0aW9ucygpIHsKLQkJc3VwZXIuY3JlYXRlQWN0aW9ucygpOwotCi0JCS8vIE9wZW4gd29ya2Zsb3cgZGV0YWlsIGFjdGlvbgotCQkvLwotCQlJQWN0aW9uIGFjdGlvbiA9IG5ldyBBY3Rpb24oCi0JCQkJRGlhZ3JhbVVJUmVzb3VyY2VzLkFjdGl2aXR5RGlhZ3JhbV9vcGVuQWN0aXZpdHlEZXRhaWxEaWFncmFtX3RleHQpIHsgCi0JCQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQkJCXJldHVybiBPUEVOX1dPUktGTE9XX0RFVEFJTF9ESUFHUkFNOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJdHJ5IHsKLQkJCQkJCUVkaXRQYXJ0IHNlbGVjdGVkRWRpdFBhcnQgPSAoRWRpdFBhcnQpIGdldEdyYXBoaWNhbFZpZXdlcigpCi0JCQkJCQkJCS5nZXRTZWxlY3RlZEVkaXRQYXJ0cygpLmdldCgwKTsKLQkJCQkJCUlFZGl0b3JQYXJ0IHBhcmVudCA9IGdldFNpdGUoKS5nZXRQYWdlKCkKLQkJCQkJCQkJLmdldEFjdGl2ZUVkaXRvcigpOwotCQkJCQkJSUVkaXRvcklucHV0IGlucHV0ID0gbmV3IEFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvci5FZGl0b3JJbnB1dCgKLQkJCQkJCQkJKE1ldGhvZEVsZW1lbnQpICgoTm9kZSkgc2VsZWN0ZWRFZGl0UGFydAotCQkJCQkJCQkJCS5nZXRNb2RlbCgpKS5nZXRPYmplY3QoKSwKLQkJCQkJCQkJKChEaWFncmFtKSBlZGl0UGFydC5nZXRNb2RlbCgpKQotCQkJCQkJCQkJCS5nZXRTdXBwcmVzc2lvbigpKTsKLQkJCQkJCUlFZGl0b3JQYXJ0IHBhcnQgPSBnZXRTaXRlKCkKLQkJCQkJCQkJLmdldFBhZ2UoKQotCQkJCQkJCQkub3BlbkVkaXRvcigKLQkJCQkJCQkJCQlpbnB1dCwKLQkJCQkJCQkJCQlQcm9jZXNzRWRpdG9yLkFDVElWSVRZX0RFVEFJTF9ESUFHUkFNX0VESVRPUl9JRCk7Ci0JCQkJCQlpZiAocGFydCBpbnN0YW5jZW9mIEFic3RyYWN0RGlhZ3JhbUVkaXRvcikgewotCQkJCQkJCUFic3RyYWN0RGlhZ3JhbUVkaXRvciBlZGl0b3IgPSAoQWJzdHJhY3REaWFncmFtRWRpdG9yKSBwYXJ0OwotCQkJCQkJCWVkaXRvci5zZXRQYXJlbnRFZGl0b3IocGFyZW50KTsKLQkJCQkJCX0KLQkJCQkJfSBjYXRjaCAoUGFydEluaXRFeGNlcHRpb24gZXhjZXB0aW9uKSB7Ci0JCQkJCQlleGNlcHRpb24ucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJCX0KLQkJCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCXB1YmxpYyBib29sZWFuIGlzRW5hYmxlZCgpIHsKLQkJCQlMaXN0IGVkaXRQYXJ0cyA9IGdldEdyYXBoaWNhbFZpZXdlcigpLmdldFNlbGVjdGVkRWRpdFBhcnRzKCk7Ci0JCQkJaWYgKGVkaXRQYXJ0cy5zaXplKCkgIT0gMSkKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCUVkaXRQYXJ0IGVkaXRQYXJ0ID0gKEVkaXRQYXJ0KSBlZGl0UGFydHMuZ2V0KDApOwotCQkJCXJldHVybiAoZWRpdFBhcnQuZ2V0TW9kZWwoKSBpbnN0YW5jZW9mIFdvcmtCcmVha2Rvd25FbGVtZW50Tm9kZSAmJiAoKExpbmtlZE9iamVjdCkgZWRpdFBhcnQKLQkJCQkJCS5nZXRNb2RlbCgpKS5nZXRPYmplY3QoKSBpbnN0YW5jZW9mIEFjdGl2aXR5KTsKLQkJCX0KLQkJfTsKLQkJZ2V0QWN0aW9uUmVnaXN0cnkoKS5yZWdpc3RlckFjdGlvbihhY3Rpb24pOwotCi0JCS8vIElBY3Rpb24gc3RhcnROb2RlQWN0aW9uID0gbmV3IEFjdGlvbihEaWFncmFtVUlSZXNvdXJjZXMuCi0JCS8vIGdldFN0cmluZygiRGlhZ3JhbVVJLkFjdGl2aXR5RGlhZ3JhbS5TdGFydE5vZGUudGV4dCIpKXsgLy8kTk9OLU5MUy0xJAotCQkvLwkJCQotCQkvLyBwdWJsaWMgdm9pZCBydW4oKXsKLQkJLy8gQ3JlYXRlUmVxdWVzdCByZXF1ZXN0ID0gbmV3IENyZWF0ZVJlcXVlc3QoKTsKLQkJLy8gLy9DcmVhdGlvbkZhY3RvcnkgZmFjdG9yeSA9IGdldEZhY3RvcnkodGVtcGxhdGUpOwotCQkvLyBpZiAoc3RhcnROb2RlQ3JlYXRpb25GYWN0b3J5ID09IG51bGwpCi0JCS8vIHJldHVybjsKLQkJLy8gcmVxdWVzdC5zZXRGYWN0b3J5KHN0YXJ0Tm9kZUNyZWF0aW9uRmFjdG9yeSk7Ci0JCS8vIHJlcXVlc3Quc2V0TG9jYXRpb24obmV3IFBvaW50KDEwLDEwKSk7Ci0JCS8vCQkJCQotCQkvLyBpZiAocmVxdWVzdC5nZXROZXdPYmplY3QoKSBpbnN0YW5jZW9mIE5vZGUpIHsKLQkJLy8gUG9pbnQgbG9jID0gcmVxdWVzdC5nZXRMb2NhdGlvbigpOwotCQkvLyAvLygoR3JhcGhpY2FsRWRpdFBhcnQpZ2V0SG9zdCgpKS5nZXRGaWd1cmUoKS50cmFuc2xhdGVUb1JlbGF0aXZlKGxvYyk7Ci0JCS8vIERpYWdyYW0gcGFyZW50ID0gKERpYWdyYW0pZWRpdFBhcnQuZ2V0TW9kZWwoKTsKLQkJLy8gb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQgYyA9IG5ldwotCQkvLyBDcmVhdGVOb2RlQ29tbWFuZCgoTm9kZSlyZXF1ZXN0LmdldE5ld09iamVjdCgpLAotCQkvLyBwYXJlbnQsIGxvYyk7Ci0JCS8vIGdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUoYyk7Ci0JCS8vIH0KLQkJLy8gfQotCQkvLyBwdWJsaWMgU3RyaW5nIGdldElkKCl7Ci0JCS8vIHJldHVybiBDUkVBVEVfU1RBUlRfTk9ERTsKLQkJLy8gfQotCQkvLyBwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWQoKXsKLQkJLy8gcmV0dXJuIHRydWU7Ci0JCS8vIH0KLQkJLy8gcHVibGljIFN0cmluZyBnZXRUb29sVGlwVGV4dCgpIHsKLQkJLy8gcmV0dXJuCi0JCS8vIERpYWdyYW1VSVJlc291cmNlcy5nZXRTdHJpbmcoIkRpYWdyYW1VSS5BY3Rpdml0eURpYWdyYW0uU3RhcnROb2RlLnRvb2x0aXAiKTsKLQkJLy8gfQotCQkvLwkJCQotCQkvLyB9OwotCQkvLyBnZXRBY3Rpb25SZWdpc3RyeSgpLnJlZ2lzdGVyQWN0aW9uKHN0YXJ0Tm9kZUFjdGlvbik7Ci0JCS8vCQkKLQkJLy8JCQotCQkvLyBJQWN0aW9uIGVuZE5vZGVBY3Rpb24gPSBuZXcgQWN0aW9uKERpYWdyYW1VSVJlc291cmNlcy4KLQkJLy8gZ2V0U3RyaW5nKCJEaWFncmFtVUkuQWN0aXZpdHlEaWFncmFtLkVuZE5vZGUudGV4dCIpKXsgLy8kTk9OLU5MUy0xJAotCQkvLwkJCQotCQkvLyBwdWJsaWMgdm9pZCBydW4oKXsKLQkJLy8gQ3JlYXRlUmVxdWVzdCByZXF1ZXN0ID0gbmV3IENyZWF0ZVJlcXVlc3QoKTsKLQkJLy8gaWYgKGVuZE5vZGVDcmVhdGlvbkZhY3RvcnkgPT0gbnVsbCkKLQkJLy8gcmV0dXJuOwotCQkvLyByZXF1ZXN0LnNldEZhY3RvcnkoZW5kTm9kZUNyZWF0aW9uRmFjdG9yeSk7Ci0JCS8vIHJlcXVlc3Quc2V0TG9jYXRpb24obmV3IFBvaW50KDEwLDEwKSk7Ci0JCS8vCQkJCQotCQkvLyBpZiAocmVxdWVzdC5nZXROZXdPYmplY3QoKSBpbnN0YW5jZW9mIE5vZGUpIHsKLQkJLy8gUG9pbnQgbG9jID0gcmVxdWVzdC5nZXRMb2NhdGlvbigpOwotCQkvLyBEaWFncmFtIHBhcmVudCA9IChEaWFncmFtKWVkaXRQYXJ0LmdldE1vZGVsKCk7Ci0JCS8vIG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kIGMgPSBuZXcKLQkJLy8gQ3JlYXRlTm9kZUNvbW1hbmQoKE5vZGUpcmVxdWVzdC5nZXROZXdPYmplY3QoKSwKLQkJLy8gcGFyZW50LCBsb2MpOwotCQkvLyBnZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKGMpOwotCQkvLyB9Ci0JCS8vIH0KLQkJLy8gcHVibGljIFN0cmluZyBnZXRJZCgpewotCQkvLyByZXR1cm4gQ1JFQVRFX0VORF9OT0RFOwotCQkvLyB9Ci0JCS8vIHB1YmxpYyBib29sZWFuIGlzRW5hYmxlZCgpewotCQkvLyByZXR1cm4gdHJ1ZTsKLQkJLy8gfQotCQkvLyBwdWJsaWMgU3RyaW5nIGdldFRvb2xUaXBUZXh0KCkgewotCQkvLyByZXR1cm4KLQkJLy8gRGlhZ3JhbVVJUmVzb3VyY2VzLmdldFN0cmluZygiRGlhZ3JhbVVJLkFjdGl2aXR5RGlhZ3JhbS5FbmROb2RlLnRvb2x0aXAiKTsKLQkJLy8gfQotCQkvLyB9OwotCQkvLyBnZXRBY3Rpb25SZWdpc3RyeSgpLnJlZ2lzdGVyQWN0aW9uKGVuZE5vZGVBY3Rpb24pOwotCQkvLwkJCi0JCS8vIElBY3Rpb24gc3luY0JhckFjdGlvbiA9IG5ldyBBY3Rpb24oRGlhZ3JhbVVJUmVzb3VyY2VzLgotCQkvLyBnZXRTdHJpbmcoIkRpYWdyYW1VSS5BY3Rpdml0eURpYWdyYW0uU3luY0Jhci50ZXh0IikpeyAvLyROT04tTkxTLTEkCi0JCS8vCQkJCi0JCS8vIHB1YmxpYyB2b2lkIHJ1bigpewotCQkvLyBDcmVhdGVSZXF1ZXN0IHJlcXVlc3QgPSBuZXcgQ3JlYXRlUmVxdWVzdCgpOwotCQkvLyAvL0NyZWF0aW9uRmFjdG9yeSBmYWN0b3J5ID0gZ2V0RmFjdG9yeSh0ZW1wbGF0ZSk7Ci0JCS8vIGlmIChzeW5jaEJhckNyZWF0aW9uRmFjdG9yeSA9PSBudWxsKQotCQkvLyByZXR1cm47Ci0JCS8vIHJlcXVlc3Quc2V0RmFjdG9yeShzeW5jaEJhckNyZWF0aW9uRmFjdG9yeSk7Ci0JCS8vIHJlcXVlc3Quc2V0TG9jYXRpb24obmV3IFBvaW50KDEwLDEwKSk7Ci0JCS8vCQkJCQotCQkvLyBpZiAocmVxdWVzdC5nZXROZXdPYmplY3QoKSBpbnN0YW5jZW9mIE5vZGUpIHsKLQkJLy8gUG9pbnQgbG9jID0gcmVxdWVzdC5nZXRMb2NhdGlvbigpOwotCQkvLyAvLygoR3JhcGhpY2FsRWRpdFBhcnQpZ2V0SG9zdCgpKS5nZXRGaWd1cmUoKS50cmFuc2xhdGVUb1JlbGF0aXZlKGxvYyk7Ci0JCS8vIERpYWdyYW0gcGFyZW50ID0gKERpYWdyYW0pZWRpdFBhcnQuZ2V0TW9kZWwoKTsKLQkJLy8gb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQgYyA9IG5ldwotCQkvLyBDcmVhdGVOb2RlQ29tbWFuZCgoTm9kZSlyZXF1ZXN0LmdldE5ld09iamVjdCgpLAotCQkvLyBwYXJlbnQsIGxvYyk7Ci0JCS8vIGdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUoYyk7Ci0JCS8vIH0KLQkJLy8gfQotCQkvLyBwdWJsaWMgU3RyaW5nIGdldElkKCl7Ci0JCS8vIHJldHVybiBDUkVBVEVfU1lOQ19CQVI7Ci0JCS8vIH0KLQkJLy8gcHVibGljIGJvb2xlYW4gaXNFbmFibGVkKCl7Ci0JCS8vIHJldHVybiB0cnVlOwotCQkvLyB9Ci0JCS8vIHB1YmxpYyBTdHJpbmcgZ2V0VG9vbFRpcFRleHQoKSB7Ci0JCS8vIHJldHVybgotCQkvLyBEaWFncmFtVUlSZXNvdXJjZXMuZ2V0U3RyaW5nKCJEaWFncmFtVUkuQWN0aXZpdHlEaWFncmFtLlN5bmNCYXIudG9vbHRpcCIpOwotCQkvLyB9Ci0JCS8vCQkJCi0JCS8vIH07Ci0JCS8vIGdldEFjdGlvblJlZ2lzdHJ5KCkucmVnaXN0ZXJBY3Rpb24oc3luY0JhckFjdGlvbik7Ci0JCS8vCQkKLQkJLy8JCQotCQkvLyBJQWN0aW9uIGRlY2lzaW9uQmFyQWN0aW9uID0gbmV3IEFjdGlvbihEaWFncmFtVUlSZXNvdXJjZXMuCi0JCS8vIGdldFN0cmluZygiRGlhZ3JhbVVJLkFjdGl2aXR5RGlhZ3JhbS5EZWNpc2lvbkJhci50ZXh0IikpewotCQkvLyAvLyROT04tTkxTLTEkCi0JCS8vCQkJCi0JCS8vIHB1YmxpYyB2b2lkIHJ1bigpewotCQkvLyBDcmVhdGVSZXF1ZXN0IHJlcXVlc3QgPSBuZXcgQ3JlYXRlUmVxdWVzdCgpOwotCQkvLyAvL0NyZWF0aW9uRmFjdG9yeSBmYWN0b3J5ID0gZ2V0RmFjdG9yeSh0ZW1wbGF0ZSk7Ci0JCS8vIGlmIChkZWNpc2lvbk5vZGVDcmVhdGlvbkZhY3RvcnkgPT0gbnVsbCkKLQkJLy8gcmV0dXJuOwotCQkvLyByZXF1ZXN0LnNldEZhY3RvcnkoZGVjaXNpb25Ob2RlQ3JlYXRpb25GYWN0b3J5KTsKLQkJLy8gcmVxdWVzdC5zZXRMb2NhdGlvbihuZXcgUG9pbnQoMTAsMTApKTsKLQkJLy8JCQkJCi0JCS8vIGlmIChyZXF1ZXN0LmdldE5ld09iamVjdCgpIGluc3RhbmNlb2YgTm9kZSkgewotCQkvLyBQb2ludCBsb2MgPSByZXF1ZXN0LmdldExvY2F0aW9uKCk7Ci0JCS8vIC8vKChHcmFwaGljYWxFZGl0UGFydClnZXRIb3N0KCkpLmdldEZpZ3VyZSgpLnRyYW5zbGF0ZVRvUmVsYXRpdmUobG9jKTsKLQkJLy8gRGlhZ3JhbSBwYXJlbnQgPSAoRGlhZ3JhbSllZGl0UGFydC5nZXRNb2RlbCgpOwotCQkvLyBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZCBjID0gbmV3Ci0JCS8vIENyZWF0ZU5vZGVDb21tYW5kKChOb2RlKXJlcXVlc3QuZ2V0TmV3T2JqZWN0KCksCi0JCS8vIHBhcmVudCwgbG9jKTsKLQkJLy8gZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShjKTsKLQkJLy8gfQotCQkvLyB9Ci0JCS8vIHB1YmxpYyBTdHJpbmcgZ2V0SWQoKXsKLQkJLy8gcmV0dXJuIENSRUFURV9ERUNJU0lPTl9CQVI7Ci0JCS8vIH0KLQkJLy8gcHVibGljIGJvb2xlYW4gaXNFbmFibGVkKCl7Ci0JCS8vIHJldHVybiB0cnVlOwotCQkvLyB9Ci0JCS8vIHB1YmxpYyBTdHJpbmcgZ2V0VG9vbFRpcFRleHQoKSB7Ci0JCS8vIHJldHVybgotCQkvLyBEaWFncmFtVUlSZXNvdXJjZXMuZ2V0U3RyaW5nKCJEaWFncmFtVUkuQWN0aXZpdHlEaWFncmFtLkRlY2lzaW9uQmFyLnRvb2x0aXAiKTsKLQkJLy8gfQotCQkvLwkJCQotCQkvLyB9OwotCQkvLyBnZXRBY3Rpb25SZWdpc3RyeSgpLnJlZ2lzdGVyQWN0aW9uKGRlY2lzaW9uQmFyQWN0aW9uKTsKLQotCQlhY3Rpb24gPSBjcmVhdGVBbkFjdGlvbigKLQkJCQlEaWFncmFtVUlSZXNvdXJjZXMuQWN0aXZpdHlEaWFncmFtX1N0YXJ0Tm9kZV90ZXh0LCBzdGFydE5vZGVDcmVhdGlvbkZhY3RvcnksIAotCQkJCUNSRUFURV9TVEFSVF9OT0RFLAotCQkJCURpYWdyYW1VSVJlc291cmNlcy5BY3Rpdml0eURpYWdyYW1fU3RhcnROb2RlX3Rvb2x0aXAsIAotCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoCi0JCQkJCQkic3Rub2RlX3BhbDE2LmdpZiIpKTsgLy8kTk9OLU5MUy0xJAotCQlnZXRBY3Rpb25SZWdpc3RyeSgpLnJlZ2lzdGVyQWN0aW9uKGFjdGlvbik7Ci0KLQkJYWN0aW9uID0gY3JlYXRlQW5BY3Rpb24oCi0JCQkJRGlhZ3JhbVVJUmVzb3VyY2VzLkFic3RyYWN0RGlhZ3JhbV9GcmVlVGV4dF90ZXh0LCBmcmVlVHh0Tm9kZUNyZWF0aW9uRmFjdG9yeSwgCi0JCQkJQ1JFQVRFX0ZSRUVfVEVYVCwKLQkJCQlEaWFncmFtVUlSZXNvdXJjZXMuQWJzdHJhY3REaWFncmFtX0ZyZWVUZXh0X3Rvb2x0aXAsIAotCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoCi0JCQkJCQkiZnJlZXRleHRfcGFsMTYuZ2lmIikpOyAvLyROT04tTkxTLTEkCi0JCWdldEFjdGlvblJlZ2lzdHJ5KCkucmVnaXN0ZXJBY3Rpb24oYWN0aW9uKTsKLQotCQlhY3Rpb24gPSBjcmVhdGVBbkFjdGlvbigKLQkJCQlEaWFncmFtVUlSZXNvdXJjZXMuQWN0aXZpdHlEaWFncmFtX1N5bmNCYXJfdGV4dCwgc3luY2hCYXJDcmVhdGlvbkZhY3RvcnksIAotCQkJCUNSRUFURV9TWU5DX0JBUiwgRGlhZ3JhbVVJUmVzb3VyY2VzLkFjdGl2aXR5RGlhZ3JhbV9TeW5jQmFyX3Rvb2x0aXAKLQkJCQksIEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoCi0JCQkJCQkic3luY2Jhcl9wYWwxNi5naWYiKSk7IC8vJE5PTi1OTFMtMSQKLQkJZ2V0QWN0aW9uUmVnaXN0cnkoKS5yZWdpc3RlckFjdGlvbihhY3Rpb24pOwotCi0JCWFjdGlvbiA9IGNyZWF0ZUFuQWN0aW9uKAotCQkJCURpYWdyYW1VSVJlc291cmNlcy5BY3Rpdml0eURpYWdyYW1fRGVjaXNpb25Ob2RlX3RleHQsIGRlY2lzaW9uTm9kZUNyZWF0aW9uRmFjdG9yeSwgCi0JCQkJQ1JFQVRFX0RFQ0lTSU9OX0JBUiwKLQkJCQlEaWFncmFtVUlSZXNvdXJjZXMuQWN0aXZpdHlEaWFncmFtX0RlY2lzaW9uTm9kZV90b29sdGlwCi0JCQkJLCBBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKAotCQkJCQkJImRlY25vZGVfcGFsMTYuZ2lmIikpOyAvLyROT04tTkxTLTEkCi0JCWdldEFjdGlvblJlZ2lzdHJ5KCkucmVnaXN0ZXJBY3Rpb24oYWN0aW9uKTsKLQotCQlhY3Rpb24gPSBjcmVhdGVBbkFjdGlvbigKLQkJCQlEaWFncmFtVUlSZXNvdXJjZXMuQWN0aXZpdHlEaWFncmFtX0VuZE5vZGVfdGV4dCwgZW5kTm9kZUNyZWF0aW9uRmFjdG9yeSwgCi0JCQkJQ1JFQVRFX0VORF9OT0RFLCBEaWFncmFtVUlSZXNvdXJjZXMuQWN0aXZpdHlEaWFncmFtX0VuZE5vZGVfdG9vbHRpcAotCQkJCSwgQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcigKLQkJCQkJCSJlbmRub2RlX3BhbDE2LmdpZiIpKTsgLy8kTk9OLU5MUy0xJAotCQlnZXRBY3Rpb25SZWdpc3RyeSgpLnJlZ2lzdGVyQWN0aW9uKGFjdGlvbik7Ci0KLQkJYWN0aW9uID0gY3JlYXRlQW5BY3Rpb24oCi0JCQkJRGlhZ3JhbVVJUmVzb3VyY2VzLkFjdGl2aXR5RGlhZ3JhbV9BY3Rpdml0eV90ZXh0LCBhY3Rpdml0eU5vZGVDcmVhdGlvbkZhY3RvcnksIAotCQkJCUNSRUFURV9BQ1RJVklUWSwKLQkJCQlEaWFncmFtVUlSZXNvdXJjZXMuQWN0aXZpdHlEaWFncmFtX0FjdGl2aXR5X3Rvb2x0aXAKLQkJCQksIEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoCi0JCQkJCQkiYWN0aXZpdHkxNi5naWYiKSk7IC8vJE5PTi1OTFMtMSQKLQkJZ2V0QWN0aW9uUmVnaXN0cnkoKS5yZWdpc3RlckFjdGlvbihhY3Rpb24pOwotCi0JCWFjdGlvbiA9IGNyZWF0ZUFuQWN0aW9uKAotCQkJCURpYWdyYW1VSVJlc291cmNlcy5BY3Rpdml0eURpYWdyYW1fSXRlcmF0aW9uX3RleHQsIGl0ZXJhdGlvbk5vZGVDcmVhdGlvbkZhY3RvcnksIAotCQkJCUNSRUFURV9JVEVSQVRJT04sCi0JCQkJRGlhZ3JhbVVJUmVzb3VyY2VzLkFjdGl2aXR5RGlhZ3JhbV9JdGVyYXRpb25fdG9vbHRpcAotCQkJCSwgQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcigKLQkJCQkJCSJJdGVyYXRpb24xNi5naWYiKSk7IC8vJE5PTi1OTFMtMSQKLQkJZ2V0QWN0aW9uUmVnaXN0cnkoKS5yZWdpc3RlckFjdGlvbihhY3Rpb24pOwotCi0JCWFjdGlvbiA9IGNyZWF0ZUFuQWN0aW9uKAotCQkJCURpYWdyYW1VSVJlc291cmNlcy5BY3Rpdml0eURpYWdyYW1fUGhhc2VfdGV4dCwgcGhhc2VOb2RlQ3JlYXRpb25GYWN0b3J5LCAKLQkJCQlDUkVBVEVfUEhBU0UsIERpYWdyYW1VSVJlc291cmNlcy5BY3Rpdml0eURpYWdyYW1fUGhhc2VfdG9vbHRpcAotCQkJCSwgQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcigKLQkJCQkJCSJQaGFzZTE2LmdpZiIpKTsgLy8kTk9OLU5MUy0xJAotCQlnZXRBY3Rpb25SZWdpc3RyeSgpLnJlZ2lzdGVyQWN0aW9uKGFjdGlvbik7Ci0KLQkJYWN0aW9uID0gY3JlYXRlQW5BY3Rpb24oCi0JCQkJRGlhZ3JhbVVJUmVzb3VyY2VzLkFic3RyYWN0RGlhZ3JhbV9UYXNrRGVzY3JpcHRvcl90ZXh0LCB0YXNrRGVzY3JpcHRvck5vZGVDcmVhdGlvbkZhY3RvcnksIAotCQkJCUNSRUFURV9UQVNLX0RFU0NSSVBUT1IsCi0JCQkJRGlhZ3JhbVVJUmVzb3VyY2VzLkFic3RyYWN0RGlhZ3JhbV9UYXNrRGVzY3JpcHRvcl90b29sdGlwCi0JCQkJLCBBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKAotCQkJCQkJIlRhc2tEZXNjcmlwdG9yLmdpZiIpKTsgLy8kTk9OLU5MUy0xJAotCQlnZXRBY3Rpb25SZWdpc3RyeSgpLnJlZ2lzdGVyQWN0aW9uKGFjdGlvbik7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGV2ZW50Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlRG91YmxlQ2xpY2soRXZlbnQgZXZlbnQpIHsKLQkJTGlzdCBlZGl0UGFydHMgPSBnZXRHcmFwaGljYWxWaWV3ZXIoKS5nZXRTZWxlY3RlZEVkaXRQYXJ0cygpOwotCi0JCS8vIGRvIG5vdGhpbmcgaWYgMCBvciBtb3JlIHRoYW4gMSBlZGl0IHBhcnRzIGFyZSBzZWxlY3RlZAotCQkvLwotCQlpZiAoZWRpdFBhcnRzLnNpemUoKSAhPSAxKQotCQkJcmV0dXJuOwotCi0JCUVkaXRQYXJ0IGVkaXRQYXJ0ID0gKEVkaXRQYXJ0KSBlZGl0UGFydHMuZ2V0KDApOwotCQlXb3JrQnJlYWtkb3duRWxlbWVudE5vZGUgbm9kZSA9IG51bGw7Ci0JCWlmIChlZGl0UGFydC5nZXRNb2RlbCgpIGluc3RhbmNlb2YgV29ya0JyZWFrZG93bkVsZW1lbnROb2RlCi0JCQkJJiYgKG5vZGUgPSAoV29ya0JyZWFrZG93bkVsZW1lbnROb2RlKSBlZGl0UGFydC5nZXRNb2RlbCgpKS5nZXRPYmplY3QoKSBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkvLyBvcGVuIGFjdGl2aXR5IGRpYWdyYW0gb2YgdGhlIHNlbGVjdGVkIGFjdGl2aXR5IGluIGEgbmV3IGVkaXRvcgotCQkJLy8KLQkJCXRyeSB7Ci0JCQkJdHJ5IHsKLQkJCQkJQnJlYWtkb3duRWxlbWVudEVkaXRvcklucHV0IGVkaXRvcklucHV0ID0gKEJyZWFrZG93bkVsZW1lbnRFZGl0b3JJbnB1dCkgZ2V0RWRpdG9ySW5wdXQoKTsKLQkJCQkJT2JqZWN0IG9iamVjdCA9IG5vZGUuaXNSZWFkT25seSgpID8gbm9kZS5nZXRXcmFwcGVyKCkgOiBub2RlLmdldE9iamVjdCgpOwotCQkJCQlJRWRpdG9ySW5wdXQgaW5wdXQgPSBuZXcgRWRpdG9ySW5wdXQob2JqZWN0LCBlZGl0b3JJbnB1dC5nZXRTdXBwcmVzc2lvbigpKTsKLQkJCQkJSUVkaXRvclBhcnQgcGFyZW50ID0gZ2V0U2l0ZSgpLmdldFBhZ2UoKS5nZXRBY3RpdmVFZGl0b3IoKTsKLQkJCQkJSUVkaXRvclBhcnQgcGFydCA9IGdldFNpdGUoKS5nZXRQYWdlKCkub3BlbkVkaXRvcihpbnB1dCwKLQkJCQkJCQlQcm9jZXNzRWRpdG9yLldPUktGTE9XX0VESVRPUl9JRCk7Ci0JCQkJCWlmIChwYXJ0IGluc3RhbmNlb2YgQWJzdHJhY3REaWFncmFtRWRpdG9yKSB7Ci0JCQkJCQlBYnN0cmFjdERpYWdyYW1FZGl0b3IgZWRpdG9yID0gKEFic3RyYWN0RGlhZ3JhbUVkaXRvcikgcGFydDsKLQkJCQkJCWVkaXRvci5zZXRQYXJlbnRFZGl0b3IocGFyZW50KTsKLQkJCQkJfQotCQkJCX0gY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIGV4Y2VwdGlvbikgewotCQkJCQlleGNlcHRpb24ucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJfQotCQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCBQYWxldHRlQ29udGFpbmVyIGNyZWF0ZUNvbnRyb2xHcm91cChQYWxldHRlUm9vdCByb290KSB7Ci0JCWluaXRpYWxpemVDcmVhdGlvbkZhY3RvcmllcygpOwotCi0JCVBhbGV0dGVHcm91cCBjb250cm9sR3JvdXAgPSBuZXcgUGFsZXR0ZUdyb3VwKCJDb250cm9sIEdyb3VwIik7IC8vJE5PTi1OTFMtMSQKLQotCQlMaXN0IGVudHJpZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJVG9vbEVudHJ5IHRvb2wgPSBuZXcgUGFubmluZ1NlbGVjdGlvblRvb2xFbnRyeShEaWFncmFtVUlSZXNvdXJjZXMuQWJzdHJhY3REaWFncmFtX1NlbGVjdF90ZXh0LCAKLQkJCQlEaWFncmFtVUlSZXNvdXJjZXMuQWJzdHJhY3REaWFncmFtX1NlbGVjdF90b29sdGlwCi0JCSk7Ci0JCXRvb2wuc2V0U21hbGxJY29uKEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoCi0JCQkJInNlbGVjdF9wYWwxNi5naWYiKSk7IC8vJE5PTi1OTFMtMSQKLQkJdG9vbC5zZXRMYXJnZUljb24oQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcigKLQkJCQkic2VsZWN0X3BhbDI0LmdpZiIpKTsgLy8kTk9OLU5MUy0xJAotCQllbnRyaWVzLmFkZCh0b29sKTsKLQkJcm9vdC5zZXREZWZhdWx0RW50cnkodG9vbCk7Ci0KLQkJdG9vbCA9IG5ldyBNYXJxdWVlVG9vbEVudHJ5KCk7Ci0JCXRvb2wuc2V0U21hbGxJY29uKEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoCi0JCQkJIm1hcnFfcGFsMTYuZ2lmIikpOyAvLyROT04tTkxTLTEkCi0JCXRvb2wuc2V0TGFyZ2VJY29uKEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoCi0JCQkJIm1hcnFfcGFsMjQuZ2lmIikpOyAvLyROT04tTkxTLTEkCi0JCWVudHJpZXMuYWRkKHRvb2wpOwotCi0JCXRvb2wgPSBuZXcgQ29ubmVjdGlvbkNyZWF0aW9uVG9vbEVudHJ5KERpYWdyYW1VSVJlc291cmNlcy5BYnN0cmFjdERpYWdyYW1fTGlua190ZXh0LCAKLQkJCQlEaWFncmFtVUlSZXNvdXJjZXMuQWJzdHJhY3REaWFncmFtX0xpbmtfdG9vbHRpcCwgCi0JCQkJbnVsbCwgQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcigKLQkJCQkJCSJsaW5rX3BhbDE2LmdpZiIpLCAvLyROT04tTkxTLTEkCi0JCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcigKLQkJCQkJCSJsaW5rX3BhbDI0LmdpZiIpLy8kTk9OLU5MUy0xJAotCQkpOwotCQllbnRyaWVzLmFkZCh0b29sKTsKLQotCQlDb21iaW5lZFRlbXBsYXRlQ3JlYXRpb25FbnRyeSBjb21iaW5lZCA9IG5ldyBDb21iaW5lZFRlbXBsYXRlQ3JlYXRpb25FbnRyeSgKLQkJCQlEaWFncmFtVUlSZXNvdXJjZXMuQWN0aXZpdHlEaWFncmFtX1N0YXJ0Tm9kZV90ZXh0LCAKLQkJCQlEaWFncmFtVUlSZXNvdXJjZXMuQWN0aXZpdHlEaWFncmFtX1N0YXJ0Tm9kZV90b29sdGlwLCAKLQkJCQlUZW1wbGF0ZUNvbnN0YW50cy5TVEFSVF9OT0RFLCBzdGFydE5vZGVDcmVhdGlvbkZhY3RvcnksCi0JCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcigKLQkJCQkJCSJzdG5vZGVfcGFsMTYuZ2lmIiksIC8vJE5PTi1OTFMtMSQKLQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKAotCQkJCQkJInN0bm9kZV9wYWwyNC5naWYiKS8vJE5PTi1OTFMtMSQKLQkJKTsKLQkJZW50cmllcy5hZGQoY29tYmluZWQpOwotCi0JCWNvbWJpbmVkID0gbmV3IENvbWJpbmVkVGVtcGxhdGVDcmVhdGlvbkVudHJ5KAotCQkJCURpYWdyYW1VSVJlc291cmNlcy5BYnN0cmFjdERpYWdyYW1fRnJlZVRleHRfdGV4dCwgCi0JCQkJRGlhZ3JhbVVJUmVzb3VyY2VzLkFic3RyYWN0RGlhZ3JhbV9GcmVlVGV4dF90b29sdGlwLCAKLQkJCQlUZW1wbGF0ZUNvbnN0YW50cy5GUkVFX1RFWFQsIGZyZWVUeHROb2RlQ3JlYXRpb25GYWN0b3J5LAotCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoCi0JCQkJCQkiZnJlZXRleHRfcGFsMTYuZ2lmIiksIC8vJE5PTi1OTFMtMSQKLQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKAotCQkJCQkJImZyZWV0ZXh0X3BhbDI0LmdpZiIpLy8kTk9OLU5MUy0xJAotCQkpOwotCQllbnRyaWVzLmFkZChjb21iaW5lZCk7Ci0KLQkJY29tYmluZWQgPSBuZXcgQ29tYmluZWRUZW1wbGF0ZUNyZWF0aW9uRW50cnkoCi0JCQkJRGlhZ3JhbVVJUmVzb3VyY2VzLkFjdGl2aXR5RGlhZ3JhbV9TeW5jQmFyX3RleHQsIAotCQkJCURpYWdyYW1VSVJlc291cmNlcy5BY3Rpdml0eURpYWdyYW1fU3luY0Jhcl90b29sdGlwLCAKLQkJCQlUZW1wbGF0ZUNvbnN0YW50cy5TWU5DSF9CQVIsIHN5bmNoQmFyQ3JlYXRpb25GYWN0b3J5LAotCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoCi0JCQkJCQkic3luY2Jhcl9wYWwxNi5naWYiKSwgLy8kTk9OLU5MUy0xJAotCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoCi0JCQkJCQkic3luY2Jhcl9wYWwyNC5naWYiKS8vJE5PTi1OTFMtMSQKLQkJKTsKLQkJZW50cmllcy5hZGQoY29tYmluZWQpOwotCi0JCWNvbWJpbmVkID0gbmV3IENvbWJpbmVkVGVtcGxhdGVDcmVhdGlvbkVudHJ5KAotCQkJCURpYWdyYW1VSVJlc291cmNlcy5BY3Rpdml0eURpYWdyYW1fRGVjaXNpb25Ob2RlX3RleHQsIAotCQkJCURpYWdyYW1VSVJlc291cmNlcy5BY3Rpdml0eURpYWdyYW1fRGVjaXNpb25Ob2RlX3Rvb2x0aXAsIAotCQkJCVRlbXBsYXRlQ29uc3RhbnRzLkRFQ0lTSU9OX05PREUsIGRlY2lzaW9uTm9kZUNyZWF0aW9uRmFjdG9yeSwKLQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKAotCQkJCQkJImRlY25vZGVfcGFsMTYuZ2lmIiksIC8vJE5PTi1OTFMtMSQKLQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKAotCQkJCQkJImRlY25vZGVfcGFsMjQuZ2lmIikvLyROT04tTkxTLTEkCi0JCSk7Ci0JCWVudHJpZXMuYWRkKGNvbWJpbmVkKTsKLQotCQljb21iaW5lZCA9IG5ldyBDb21iaW5lZFRlbXBsYXRlQ3JlYXRpb25FbnRyeSgKLQkJCQlEaWFncmFtVUlSZXNvdXJjZXMuQWN0aXZpdHlEaWFncmFtX0VuZE5vZGVfdGV4dCwgCi0JCQkJRGlhZ3JhbVVJUmVzb3VyY2VzLkFjdGl2aXR5RGlhZ3JhbV9FbmROb2RlX3Rvb2x0aXAsIAotCQkJCVRlbXBsYXRlQ29uc3RhbnRzLkVORF9OT0RFLCBlbmROb2RlQ3JlYXRpb25GYWN0b3J5LAotCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoCi0JCQkJCQkiZW5kbm9kZV9wYWwxNi5naWYiKSwgLy8kTk9OLU5MUy0xJAotCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoCi0JCQkJCQkiZW5kbm9kZV9wYWwyNC5naWYiKS8vJE5PTi1OTFMtMSQKLQkJKTsKLQkJZW50cmllcy5hZGQoY29tYmluZWQpOwotCi0JCVBhbGV0dGVTZXBhcmF0b3Igc2VwID0gbmV3IFBhbGV0dGVTZXBhcmF0b3IoCi0JCQkJR3JhcGhpY2FsV29ya2Zsb3dFZGl0b3IuY2xhc3MuZ2V0TmFtZSgpICsgInNlcDEiKTsgLy8kTk9OLU5MUy0xJAotCQlzZXAKLQkJCQkuc2V0VXNlck1vZGlmaWNhdGlvblBlcm1pc3Npb24oUGFsZXR0ZUVudHJ5LlBFUk1JU1NJT05fTk9fTU9ESUZJQ0FUSU9OKTsKLQkJZW50cmllcy5hZGQoc2VwKTsgCi0KLQkJY29tYmluZWQgPSBuZXcgQ29tYmluZWRUZW1wbGF0ZUNyZWF0aW9uRW50cnkoCi0JCQkJRGlhZ3JhbVVJUmVzb3VyY2VzLkFjdGl2aXR5RGlhZ3JhbV9BY3Rpdml0eV90ZXh0LCAKLQkJCQlEaWFncmFtVUlSZXNvdXJjZXMuQWN0aXZpdHlEaWFncmFtX0FjdGl2aXR5X3Rvb2x0aXAsIAotCQkJCVRlbXBsYXRlQ29uc3RhbnRzLkFDVElWSVRZLCBhY3Rpdml0eU5vZGVDcmVhdGlvbkZhY3RvcnksCi0JCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcigKLQkJCQkJCSJhY3Rpdml0eTE2LmdpZiIpLCAvLyROT04tTkxTLTEkCi0JCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcigKLQkJCQkJCSJhY3Rpdml0eTI0LmdpZiIpLy8kTk9OLU5MUy0xJAotCQkpOwotCQllbnRyaWVzLmFkZChjb21iaW5lZCk7Ci0KLQkJY29tYmluZWQgPSBuZXcgQ29tYmluZWRUZW1wbGF0ZUNyZWF0aW9uRW50cnkoCi0JCQkJRGlhZ3JhbVVJUmVzb3VyY2VzLkFjdGl2aXR5RGlhZ3JhbV9JdGVyYXRpb25fdGV4dCwgCi0JCQkJRGlhZ3JhbVVJUmVzb3VyY2VzLkFjdGl2aXR5RGlhZ3JhbV9JdGVyYXRpb25fdG9vbHRpcCwgCi0JCQkJVGVtcGxhdGVDb25zdGFudHMuSVRFUkFUSU9OLCBpdGVyYXRpb25Ob2RlQ3JlYXRpb25GYWN0b3J5LAotCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoCi0JCQkJCQkiSXRlcmF0aW9uMTYuZ2lmIiksIC8vJE5PTi1OTFMtMSQKLQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKAotCQkJCQkJImFjdGl2aXR5MjQuZ2lmIikvLyROT04tTkxTLTEkCi0JCSk7Ci0JCWVudHJpZXMuYWRkKGNvbWJpbmVkKTsKLQotCQljb21iaW5lZCA9IG5ldyBDb21iaW5lZFRlbXBsYXRlQ3JlYXRpb25FbnRyeShEaWFncmFtVUlSZXNvdXJjZXMuQWN0aXZpdHlEaWFncmFtX1BoYXNlX3RleHQsIAotCQkJCURpYWdyYW1VSVJlc291cmNlcy5BY3Rpdml0eURpYWdyYW1fUGhhc2VfdG9vbHRpcCwgCi0JCQkJVGVtcGxhdGVDb25zdGFudHMuUEhBU0UsIHBoYXNlTm9kZUNyZWF0aW9uRmFjdG9yeSwKLQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCQkJCS5nZXRJbWFnZURlc2NyaXB0b3IoIlBoYXNlMTYuZ2lmIiksIC8vJE5PTi1OTFMtMSQKLQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKAotCQkJCQkJImFjdGl2aXR5MjQuZ2lmIikvLyROT04tTkxTLTEkCi0JCSk7Ci0JCWVudHJpZXMuYWRkKGNvbWJpbmVkKTsKLQotCQljb21iaW5lZCA9IG5ldyBDb21iaW5lZFRlbXBsYXRlQ3JlYXRpb25FbnRyeSgKLQkJCQlEaWFncmFtVUlSZXNvdXJjZXMuQWJzdHJhY3REaWFncmFtX1Rhc2tEZXNjcmlwdG9yX3RleHQsIAotCQkJCURpYWdyYW1VSVJlc291cmNlcy5BYnN0cmFjdERpYWdyYW1fVGFza0Rlc2NyaXB0b3JfdG9vbHRpcCwgCi0JCQkJVGVtcGxhdGVDb25zdGFudHMuVEFTS19ERVNDUklQVE9SLAotCQkJCXRhc2tEZXNjcmlwdG9yTm9kZUNyZWF0aW9uRmFjdG9yeSwgQXV0aG9yaW5nVUlQbHVnaW4KLQkJCQkJCS5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKCJUYXNrRGVzY3JpcHRvci5naWYiKSwgLy8kTk9OLU5MUy0xJAotCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoCi0JCQkJCQkiYWN0aXZpdHkyNC5naWYiKS8vJE5PTi1OTFMtMSQKLQkJKTsKLQkJZW50cmllcy5hZGQoY29tYmluZWQpOwotCi0JCWNvbnRyb2xHcm91cC5hZGRBbGwoZW50cmllcyk7Ci0JCXJldHVybiBjb250cm9sR3JvdXA7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRQYXJ0TmFtZVByZWZpeCgpIHsKLQkJTWV0aG9kRWxlbWVudCBlID0gKChNZXRob2RFbGVtZW50RWRpdG9ySW5wdXQpIGdldEVkaXRvcklucHV0KCkpCi0JCQkJLmdldE1ldGhvZEVsZW1lbnQoKTsKLQkJaWYgKGUgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJcmV0dXJuIGdldFR5cGVOYW1lKChBY3Rpdml0eSkgZSkgKyAiOiAiOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5BYnN0cmFjdERpYWdyYW1FZGl0b3IjY3JlYXRlRGlhZ3JhbUVkaXRQYXJ0KCkKLQkgKi8KLQlwcm90ZWN0ZWQgRWRpdFBhcnQgY3JlYXRlRGlhZ3JhbUVkaXRQYXJ0KCkgewotCQlBY3Rpdml0eURpYWdyYW1FZGl0UGFydCBhZEVkaXRQYXJ0ID0gbmV3IEFjdGl2aXR5RGlhZ3JhbUVkaXRQYXJ0KE1vZGVsRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkuY3JlYXRlQWN0aXZpdHlEaWFncmFtKCkpOwotCQlhZEVkaXRQYXJ0Lm1hcmtEaXJ0eSh0cnVlKTsKLQkJcmV0dXJuIGFkRWRpdFBhcnQ7Ci0JfQotCi0vLwlwcm90ZWN0ZWQgRWRpdFBhcnQgY3JlYXRlRWRpdFBhcnQoT2JqZWN0IGUpIHsKLS8vCQlBY3Rpdml0eURpYWdyYW0gZGlhZ3JhbSA9IE1vZGVsRmFjdG9yeS5lSU5TVEFOQ0UKLS8vCQkJCS5jcmVhdGVBY3Rpdml0eURpYWdyYW0oKTsKLS8vCQlkaWFncmFtLnNldE9iamVjdChlKTsKLS8vCQlFZGl0UGFydCBwYXJ0ID0gbmV3IEFjdGl2aXR5RGlhZ3JhbUVkaXRQYXJ0KGRpYWdyYW0pOwotLy8JCXBhcnQuc2V0TW9kZWwoZGlhZ3JhbSk7Ci0vLwkJZGlhZ3JhbS5hZGRDb25zdW1lcih0aGlzKTsKLS8vCQlyZXR1cm4gcGFydDsKLS8vCX0KLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRUeXBlTmFtZShBY3Rpdml0eSBhY3QpIHsKLQkJaWYgKGFjdCBpbnN0YW5jZW9mIERlbGl2ZXJ5UHJvY2VzcykgewotCQkJcmV0dXJuIERpYWdyYW1VSVJlc291cmNlcy5BY3R2aXRpdml0eURpYWdyYW1fRGVsaXZlcnlQcm9jZXNzX3RleHQ7IAotCQl9IGVsc2UgaWYgKGFjdCBpbnN0YW5jZW9mIENhcGFiaWxpdHlQYXR0ZXJuKSB7Ci0JCQlyZXR1cm4gRGlhZ3JhbVVJUmVzb3VyY2VzLkFjdHZpdGl2aXR5RGlhZ3JhbV9DYXBhYmlsaXR5UGF0dGVybl90ZXh0OyAKLQkJfSBlbHNlIGlmIChhY3QgaW5zdGFuY2VvZiBQaGFzZSkgewotCQkJcmV0dXJuIERpYWdyYW1VSVJlc291cmNlcy5BY3R2aXRpdml0eURpYWdyYW1fUGhhc2VfdGV4OyAKLQkJfSBlbHNlIGlmIChhY3QgaW5zdGFuY2VvZiBJdGVyYXRpb24pIHsKLQkJCXJldHVybiBEaWFncmFtVUlSZXNvdXJjZXMuQWN0dml0aXZpdHlEaWFncmFtX0l0ZXJhdGlvbl90ZXh0OyAKLQkJfQotCQlyZXR1cm4gRGlhZ3JhbVVJUmVzb3VyY2VzLkFjdHZpdGl2aXR5RGlhZ3JhbV9BY3Rpdml0eV90ZXh0OyAKLQl9Ci0KLS8vCXByaXZhdGUgc3RhdGljIEltYWdlIGdldFR5cGVJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0vLwkJSUl0ZW1MYWJlbFByb3ZpZGVyIGFkYXB0ZXIgPSAoSUl0ZW1MYWJlbFByb3ZpZGVyKSBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotLy8JCQkJLmdldFdCU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkuYWRhcHQob2JqZWN0LAotLy8JCQkJCQlJSXRlbUxhYmVsUHJvdmlkZXIuY2xhc3MpOwotLy8JCWlmIChhZGFwdGVyICE9IG51bGwpIHsKLS8vCQkJLy8gcmV0dXJuIG5ldyBJbWFnZShEaXNwbGF5LmdldEN1cnJlbnQoKSwKLS8vCQkJLy8gKChVUkwpYWRhcHRlci5nZXRJbWFnZShvYmplY3QpKS5nZXRDb250ZW50KCkpOwotLy8JCX0KLS8vCQlyZXR1cm4gbnVsbDsKLS8vCX0KLQotCS8qKgotCSAqIEFuIGVkaXRvciBpbnB1dCBmb3IgZ3JhaGljYWwgd29ya2Zsb3cgZWRpdG9yCi0JICovCi0JcHVibGljIHN0YXRpYyBjbGFzcyBFZGl0b3JJbnB1dCBleHRlbmRzIEJyZWFrZG93bkVsZW1lbnRFZGl0b3JJbnB1dCB7Ci0KLQkJLyoqCi0JCSAqIEBwYXJhbSBlCi0JCSAqLwotCQlwdWJsaWMgRWRpdG9ySW5wdXQoT2JqZWN0IGUsIFN1cHByZXNzaW9uIHN1cHByZXNzaW9uKSB7Ci0JCQlzdXBlcihlLCBzdXBwcmVzc2lvbik7Ci0JCX0KLQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLkFic3RyYWN0RGlhZ3JhbUVkaXRvciNjcmVhdGVFZGl0UGFydEZhY3RvcnkoKQotCSAqLwotCXByb3RlY3RlZCBFZGl0UGFydEZhY3RvcnkgY3JlYXRlRWRpdFBhcnRGYWN0b3J5KCkgewotCQlyZXR1cm4gbmV3IEFjdGl2aXR5RGlhZ3JhbUVkaXRQYXJ0RmFjdG9yeSgpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGlhZ3JhbVR5cGUoKSB7Ci0JCXJldHVybiBSZXNvdXJjZUhlbHBlci5ESUFHUkFNX1RZUEVfV09SS0ZMT1c7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2VkaXRvcnMvSUVkaXRvcktlZXBlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9lZGl0b3JzL0lFZGl0b3JLZWVwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDY5NzY4NS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2VkaXRvcnMvSUVkaXRvcktlZXBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzOwotCi0vKioKLSAqIEFuIGludGVyZmFjZSB3aGljaCBtYW5hZ2VzIG9wZW5pbmcvY2xvc2luZyBvZiBhbiBlZGl0b3IKLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJRWRpdG9yS2VlcGVyIHsKLQotCS8qKgotCSAqIFJlZmVyZW5jZSBjbGFzcyBmb3IgZWRpdG9yIGtlZXBlcgotCSAqCi0JICovCi0JcHVibGljIHN0YXRpYyBjbGFzcyBSZWZlcmVuY2UgewotCQlwcml2YXRlIElFZGl0b3JLZWVwZXIgZWRpdG9yS2VlcGVyOwotCi0JCXByaXZhdGUgUmVmZXJlbmNlKCkgewotCi0JCX0KLQotCQlwdWJsaWMgdm9pZCBzZXRFZGl0b3JLZWVwZXIoSUVkaXRvcktlZXBlciBlZGl0b3JLZWVwZXIpIHsKLQkJCXRoaXMuZWRpdG9yS2VlcGVyID0gZWRpdG9yS2VlcGVyOwotCQl9Ci0KLQkJcHVibGljIElFZGl0b3JLZWVwZXIgZ2V0RWRpdG9yS2VlcGVyKCkgewotCQkJcmV0dXJuIGVkaXRvcktlZXBlcjsKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgUmVmZXJlbmNlIFJFRkVSRU5DRSA9IG5ldyBSZWZlcmVuY2UoKTsKLQotCS8qKgotCSAqIE9wZW4gYW4gZWRpdG9yIGZvciB0aGUgZ2l2ZW4gZWxlbWVudAotCSAqIEBwYXJhbSBvYmplY3QKLQkgKi8KLQl2b2lkIG9wZW5FZGl0b3IoT2JqZWN0IG9iamVjdCk7Ci0KLQkvKioKLQkgKiBDbG9zZXMgYW4gb3BlbiBlZGl0b3IgaWYgZWxlbWVudCBpcyBkZWxldGVkCi0JICogQHBhcmFtIG9iamVjdAotCSAqLwotCXZvaWQgY2xvc2VFZGl0b3JzT25EZWxldGlvbihPYmplY3Qgb2JqZWN0KTsKLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9lZGl0b3JzL01ldGhvZEVsZW1lbnRFZGl0b3IuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZWRpdG9ycy9NZXRob2RFbGVtZW50RWRpdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzMzRkMmMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9lZGl0b3JzL01ldGhvZEVsZW1lbnRFZGl0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwNzQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5TdHJpbmdXcml0ZXI7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuRXZlbnRPYmplY3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRIYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YVZpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZFN0YWNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kU3RhY2tMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uSUVkaXRpbmdEb21haW5Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdQZXJzcGVjdGl2ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zLkxpYnJhcnlWYWxpZGF0ZUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLklSZWZyZXNoYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmludGVybmFsLk1ldGhvZEVsZW1lbnRFZGl0b3JFcnJvclRpY2tVcGRhdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvdmlkZXJzLklNZXRob2RFbGVtZW50RWRpdG9yUGFnZVByb3ZpZGVyRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvdmlkZXJzLk1ldGhvZEVsZW1lbnRFZGl0b3JEZWZhdWx0UGFnZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvdmlkZXJzLk1ldGhvZEVsZW1lbnRMYWJlbERlY29yYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnJpY2h0ZXh0LklNZXRob2RSaWNoVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnV0aWwuTGlicmFyeVZhbGlkYXRpb25NYXJrZXJIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS52aWV3cy5FbGVtZW50SFRNTFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnZpZXdzLkxpYnJhcnlWaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudmlld3MuVmlld0hlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpLnV0aWwuUGVyc3BlY3RpdmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuU3RyVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5JTGlicmFyeU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2VVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuQWN0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuRnVsbHlSZXZlcnRpYmxlQ29tbWFuZFN0YWNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JQWN0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSVJlc291cmNlQXdhcmVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudWkuVXNlckludGVyYWN0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5FeHRlbnNpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLklMaWJyYXJ5UmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UuSUxpYnJhcnlSZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS5zeW5jaC5JU3luY2hyb25pemF0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnNlcnZpY2VzLlNhZmVVcGRhdGVDb250cm9sbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuUmVzb3VyY2VVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS5YTUlMaWJyYXJ5VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UuRmlsZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLk11bHRpRmlsZVhNSVJlc291cmNlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UucmVmcmVzaC5SZWZyZXNoSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS51dGlsLkxpYnJhcnlTY2hlZHVsaW5nUnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UudXRpbC5QZXJzaXN0ZW5jZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LklSaWNoVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VydmljZXMuSUxpYnJhcnlQZXJzaXN0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzLlNlcnZpY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy5JTGlicmFyeVBlcnNpc3Rlci5GYWlsU2FmZU1ldGhvZExpYnJhcnlQZXJzaXN0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLlByb2dyZXNzTW9uaXRvckRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uSVJ1bm5hYmxlV2l0aFByb2dyZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYnJvd3Nlci5Ccm93c2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQnVzeUluZGljYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JUGFydExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklQYXJ0U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JVmlld1BhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdpbmRvd0xpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGFydEluaXRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuSUZvcm1QYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmlkZS5JR290b01hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LkZpbGVFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0Lk11bHRpUGFnZUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5NdWx0aVBhZ2VTZWxlY3Rpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLlByb3BlcnR5U2hlZXQ7Ci0KLS8qKgotICogVGhlIE1ldGhvZCBFbGVtZW50IGVkaXRvci4KLSAqIAotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIE1ldGhvZEVsZW1lbnRFZGl0b3IgZXh0ZW5kcyBBYnN0cmFjdEJhc2VGb3JtRWRpdG9yIGltcGxlbWVudHMKLQkJSUdvdG9NYXJrZXIsIElFZGl0aW5nRG9tYWluUHJvdmlkZXIgewotCi0JcHJvdGVjdGVkIHN0YXRpYyBjbGFzcyBSZXNvdXJjZUluZm8gewotCQlsb25nIG1vZGlmaWNhdGlvblN0YW1wOwotCQlsb25nIGxvYWRTdGFtcDsJCQotCQlib29sZWFuIG92ZXJ3cml0ZTsKLQkJYm9vbGVhbiBhZGp1c3RMb2NhdGlvbjsgCi0JCQotCQlwcml2YXRlIFJlc291cmNlIHJlc291cmNlOwkJCi0JCQotCQlSZXNvdXJjZUluZm8oUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJCXRoaXMucmVzb3VyY2UgPSByZXNvdXJjZTsKLQkJCXJlZnJlc2goKTsKLQkJfQotCQkKLQkJcHVibGljIHZvaWQgcmVmcmVzaCgpIHsKLQkJCW1vZGlmaWNhdGlvblN0YW1wID0gSVN5bmNocm9uaXphdGlvbkhlbHBlci5JTlNUQU5DRS5nZXRNb2RpZmljYXRpb25TdGFtcChyZXNvdXJjZSk7Ci0JCQlpZihyZXNvdXJjZSBpbnN0YW5jZW9mIElMaWJyYXJ5UmVzb3VyY2UpIHsKLQkJCQlsb2FkU3RhbXAgPSAoKElMaWJyYXJ5UmVzb3VyY2UpcmVzb3VyY2UpLmdldExvYWRTdGFtcCgpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJbG9hZFN0YW1wID0gSVJlc291cmNlLk5VTExfU1RBTVA7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogVGhlIGVkaXRvciBJRC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFRElUT1JfSUQgPSBNZXRob2RFbGVtZW50RWRpdG9yLmNsYXNzLmdldE5hbWUoKTsKLQotCXByb3RlY3RlZCBpbnQgcHJldmlld19wYWdlX2luZGV4ID0gLTE7Ci0KLQlwcm90ZWN0ZWQgRWxlbWVudEhUTUxWaWV3ZXIgcHJldmlld2VyID0gbnVsbDsKLQotCXByb3RlY3RlZCBNZXRob2RFbGVtZW50IGVsZW1lbnRPYmogPSBudWxsOwotCQotCXByb3RlY3RlZCBBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW4gZWRpdGluZ0RvbWFpbjsKLQotCS8vIFRoZSByaWNoIHRleHQgY29udHJvbCBvciBlZGl0b3Igd2hvc2UgY29udGVudCB3YXMgbGFzdCBtb2RpZmllZCBiZWZvcmUKLQkvLyB0aGUgU2F2ZSBvciBTYXZlIEFsbCBidXR0b24ga2V5IGlzIHNlbGVjdGVkLgotCXByb3RlY3RlZCBJTWV0aG9kUmljaFRleHQgbW9kaWZpZWRSaWNoVGV4dCA9IG51bGw7Ci0KLQlwcm90ZWN0ZWQgQWRhcHRlciBuYW1lQ2hhbmdlZExpc3RlbmVyID0gbmV3IEFkYXB0ZXJJbXBsKCkgewotCQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbiBtc2cpIHsKLQkJCXN3aXRjaCAobXNnLmdldEZlYXR1cmVJRChNZXRob2RFbGVtZW50LmNsYXNzKSkgewotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19OQU1FOgotCQkJCW5hbWVDaGFuZ2VkKCk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQl9OwotCi0JcHJvdGVjdGVkIENvbGxlY3Rpb248SVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcj4gc2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVycyA9IG5ldyBBcnJheUxpc3Q8SVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcj4oKTsKLQotCXByb3RlY3RlZCBJU2VsZWN0aW9uIGN1cnJlbnRTZWxlY3Rpb24gPSBTdHJ1Y3R1cmVkU2VsZWN0aW9uLkVNUFRZOwotCi0JcHJvdGVjdGVkIEFjdGlvbk1hbmFnZXIgYWN0aW9uTWdyOwotCi0JcHJpdmF0ZSBib29sZWFuIGRpcnR5OwotCi0JcHJpdmF0ZSBGYWlsU2FmZU1ldGhvZExpYnJhcnlQZXJzaXN0ZXIgcGVyc2lzdGVyOwotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uPE9iamVjdD4gd2lkZ2V0c1RvUmVzdG9yZVZhbHVlID0gbmV3IEhhc2hTZXQ8T2JqZWN0PigpOwotCi0JcHJpdmF0ZSBsb25nIGNoYW5nZVRpbWUgPSAtMTsKLQotCXB1YmxpYyBPYmplY3Qgd2lkZ2V0VG9DaGVjazsKLQotCXByaXZhdGUgT2JqZWN0IGN1cnJlbnRGZWF0dXJlRWRpdG9yOwotCi0JcHJpdmF0ZSBFU3RydWN0dXJhbEZlYXR1cmUgY3VycmVudEVkaXRlZEZlYXR1cmU7Ci0KLQlwcm90ZWN0ZWQgQXJyYXlMaXN0PFJlc291cmNlPiByZW1vdmVkUmVzb3VyY2VzID0gbmV3IEFycmF5TGlzdDxSZXNvdXJjZT4oKTsKLQotCXByb3RlY3RlZCBBcnJheUxpc3Q8UmVzb3VyY2U+IGNoYW5nZWRSZXNvdXJjZXMgPSBuZXcgQXJyYXlMaXN0PFJlc291cmNlPigpOwotCQotCXByb3RlY3RlZCBNZXRob2RFbGVtZW50RWRpdG9yRXJyb3JUaWNrVXBkYXRlciBmTWV0aG9kRWxlbWVudEVkaXRvckVycm9yVGlja1VwZGF0ZXIgPSBudWxsOwotCQotCS8qKgotCSAqIEV4dGVuc2lvbiBuYW1lCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVUSE9EX1BBR0VfUFJPVklERVJTX0VYVEVOU0lPTl9OQU1FID0gIk1ldGhvZEVsZW1lbnRFZGl0b3JQYWdlUHJvdmlkZXJzIjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBzdGF0aWMgTGlzdDxJTWV0aG9kRWxlbWVudEVkaXRvclBhZ2VQcm92aWRlckV4dGVuc2lvbj4gYWxsUGFnZVByb3ZpZGVyczsKLQlwcm90ZWN0ZWQgc3RhdGljIElNZXRob2RFbGVtZW50RWRpdG9yUGFnZVByb3ZpZGVyRXh0ZW5zaW9uIGRlZmF1bHRQYWdlUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBMaXN0ZW5zIGZvciB3b3Jrc3BhY2UgY2hhbmdlcy4KLQkgKi8KLQlwcm90ZWN0ZWQgSVJlc291cmNlQ2hhbmdlTGlzdGVuZXIgcmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciA9IG5ldyBJUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgcmVzb3VyY2VDaGFuZ2VkKElSZXNvdXJjZUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQlTeXN0ZW0ub3V0Ci0JCQkJCS5wcmludGxuKCJNZXRob2RFbGVtZW50RWRpdG9yLnJlc291cmNlQ2hhbmdlZCgpOiBldmVudCA9ICIgKyBldmVudCk7IC8vJE5PTi1OTFMtMSQKLQotCQkJaWYgKGVsZW1lbnRPYmouZUlzUHJveHkoKSkgewotCQkJCXJldHVybjsKLQkJCX0KLQotCQkJSVJlc291cmNlRGVsdGEgZGVsdGEgPSBldmVudC5nZXREZWx0YSgpOwotCQkJdHJ5IHsKLQkJCQljbGFzcyBSZXNvdXJjZURlbHRhVmlzaXRvciBpbXBsZW1lbnRzIElSZXNvdXJjZURlbHRhVmlzaXRvciB7Ci0JCQkJCXByb3RlY3RlZCBNYXAgVVJJVG9Vc2VkUmVzb3VyY2VNYXAgPSBnZXRVUklUb1VzZWRSZXNvdXJjZU1hcCgpOwotCi0JCQkJCXByb3RlY3RlZCBDb2xsZWN0aW9uPFJlc291cmNlPiBjaGFuZ2VkUmVzb3VyY2VzID0gbmV3IEFycmF5TGlzdDxSZXNvdXJjZT4oKTsKLQotCQkJCQlwcm90ZWN0ZWQgQ29sbGVjdGlvbjxSZXNvdXJjZT4gcmVtb3ZlZFJlc291cmNlcyA9IG5ldyBBcnJheUxpc3Q8UmVzb3VyY2U+KCk7Ci0KLQkJCQkJcHVibGljIGJvb2xlYW4gdmlzaXQoSVJlc291cmNlRGVsdGEgZGVsdGEpIHsKLQkJCQkJCWlmIChkZWx0YS5nZXRGbGFncygpICE9IElSZXNvdXJjZURlbHRhLk1BUktFUlMKLQkJCQkJCQkJJiYgZGVsdGEuZ2V0UmVzb3VyY2UoKS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLkZJTEUpIHsKLQkJCQkJCQlpZiAoKGRlbHRhLmdldEtpbmQoKSAmIChJUmVzb3VyY2VEZWx0YS5DSEFOR0VEIHwgSVJlc291cmNlRGVsdGEuUkVNT1ZFRCkpICE9IDApIHsKLQkJCQkJCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSAoUmVzb3VyY2UpIFVSSVRvVXNlZFJlc291cmNlTWFwCi0JCQkJCQkJCQkJLmdldChVUkkuY3JlYXRlRmlsZVVSSShkZWx0YQotCQkJCQkJCQkJCQkJLmdldFJlc291cmNlKCkuZ2V0TG9jYXRpb24oKQotCQkJCQkJCQkJCQkJLnRvU3RyaW5nKCkpKTsKLQkJCQkJCQkJaWYgKHJlc291cmNlICE9IG51bGwpIHsKLQkJCQkJCQkJCWlmICgoZGVsdGEuZ2V0S2luZCgpICYgSVJlc291cmNlRGVsdGEuUkVNT1ZFRCkgIT0gMCkgewotCQkJCQkJCQkJCXJlbW92ZWRSZXNvdXJjZXMuYWRkKHJlc291cmNlKTsKLQkJCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCQkJY2hhbmdlZFJlc291cmNlcy5hZGQocmVzb3VyY2UpOwotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCi0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJfQotCi0JCQkJCXB1YmxpYyBDb2xsZWN0aW9uPFJlc291cmNlPiBnZXRDaGFuZ2VkUmVzb3VyY2VzKCkgewotCQkJCQkJcmV0dXJuIGNoYW5nZWRSZXNvdXJjZXM7Ci0JCQkJCX0KLQotCQkJCQlwdWJsaWMgQ29sbGVjdGlvbjxSZXNvdXJjZT4gZ2V0UmVtb3ZlZFJlc291cmNlcygpIHsKLQkJCQkJCXJldHVybiByZW1vdmVkUmVzb3VyY2VzOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJUmVzb3VyY2VEZWx0YVZpc2l0b3IgdmlzaXRvciA9IG5ldyBSZXNvdXJjZURlbHRhVmlzaXRvcigpOwotCQkJCWRlbHRhLmFjY2VwdCh2aXNpdG9yKTsKLQotCQkJCXJlbW92ZWRSZXNvdXJjZXMuYWRkQWxsKHZpc2l0b3IuZ2V0UmVtb3ZlZFJlc291cmNlcygpKTsKLQkJCQlpZiAoIXZpc2l0b3IuZ2V0UmVtb3ZlZFJlc291cmNlcygpLmlzRW1wdHkoKSAmJiAhaXNEaXJ0eSgpKSB7Ci0JCQkJCWdldFNpdGUoKS5nZXRTaGVsbCgpLmdldERpc3BsYXkoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCU1ldGhvZEVsZW1lbnRFZGl0b3IudGhpcy5kaXNwb3NlKCk7Ci0JCQkJCQl9Ci0JCQkJCX0pOwotCQkJCX0KLQotCQkJCWNoYW5nZWRSZXNvdXJjZXMuYWRkQWxsKHZpc2l0b3IuZ2V0Q2hhbmdlZFJlc291cmNlcygpKTsKLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCX0KLQkJfQotCX07Ci0KLQljbGFzcyBBY3RpdmF0aW9uTGlzdGVuZXIgaW1wbGVtZW50cyBJUGFydExpc3RlbmVyLCBJV2luZG93TGlzdGVuZXIgewotCi0JCS8qKiBDYWNoZSBvZiB0aGUgYWN0aXZlIHdvcmtiZW5jaCBwYXJ0LiAqLwotCQlwcml2YXRlIElXb3JrYmVuY2hQYXJ0IGZBY3RpdmVQYXJ0OwotCi0JCS8qKiBJbmRpY2F0ZXMgd2hldGhlciBhY3RpdmF0aW9uIGhhbmRsaW5nIGlzIGN1cnJlbnRseSBiZSBkb25lLiAqLwotCQlwcml2YXRlIGJvb2xlYW4gZklzSGFuZGxpbmdBY3RpdmF0aW9uID0gZmFsc2U7Ci0KLQkJLyoqCi0JCSAqIFRoZSBwYXJ0IHNlcnZpY2UuCi0JCSAqIAotCQkgKiBAc2luY2UgMy4xCi0JCSAqLwotCQlwcml2YXRlIElQYXJ0U2VydmljZSBmUGFydFNlcnZpY2U7Ci0KLQkJLyoqCi0JCSAqIENyZWF0ZXMgdGhpcyBhY3RpdmF0aW9uIGxpc3RlbmVyLgotCQkgKiAKLQkJICogQHBhcmFtIHBhcnRTZXJ2aWNlCi0JCSAqICAgICAgICAgICAgdGhlIHBhcnQgc2VydmljZSBvbiB3aGljaCB0byBhZGQgdGhlIHBhcnQgbGlzdGVuZXIKLQkJICogQHNpbmNlIDMuMQotCQkgKi8KLQkJcHVibGljIEFjdGl2YXRpb25MaXN0ZW5lcihJUGFydFNlcnZpY2UgcGFydFNlcnZpY2UpIHsKLQkJCWZQYXJ0U2VydmljZSA9IHBhcnRTZXJ2aWNlOwotCQkJZlBhcnRTZXJ2aWNlLmFkZFBhcnRMaXN0ZW5lcih0aGlzKTsKLQkJCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuYWRkV2luZG93TGlzdGVuZXIodGhpcyk7Ci0JCX0KLQotCQkvKioKLQkJICogRGlzcG9zZXMgdGhpcyBhY3RpdmF0aW9uIGxpc3RlbmVyLgotCQkgKiAKLQkJICogQHNpbmNlIDMuMQotCQkgKi8KLQkJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJCWZQYXJ0U2VydmljZS5yZW1vdmVQYXJ0TGlzdGVuZXIodGhpcyk7Ci0JCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLnJlbW92ZVdpbmRvd0xpc3RlbmVyKHRoaXMpOwotCQkJZlBhcnRTZXJ2aWNlID0gbnVsbDsKLQkJfQotCi0JCS8qCi0JCSAqIEBzZWUgSVBhcnRMaXN0ZW5lciNwYXJ0QWN0aXZhdGVkKG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0KQotCQkgKi8KLQkJcHVibGljIHZvaWQgcGFydEFjdGl2YXRlZChJV29ya2JlbmNoUGFydCBwYXJ0KSB7Ci0JCQlmQWN0aXZlUGFydCA9IHBhcnQ7Ci0JCQloYW5kbGVBY3RpdmF0aW9uKCk7Ci0JCX0KLQotCQkvKgotCQkgKiBAc2VlIElQYXJ0TGlzdGVuZXIjcGFydEJyb3VnaHRUb1RvcChvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIHBhcnRCcm91Z2h0VG9Ub3AoSVdvcmtiZW5jaFBhcnQgcGFydCkgewotCQl9Ci0KLQkJLyoKLQkJICogQHNlZSBJUGFydExpc3RlbmVyI3BhcnRDbG9zZWQob3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBwYXJ0Q2xvc2VkKElXb3JrYmVuY2hQYXJ0IHBhcnQpIHsKLQkJfQotCi0JCS8qCi0JCSAqIEBzZWUgSVBhcnRMaXN0ZW5lciNwYXJ0RGVhY3RpdmF0ZWQob3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBwYXJ0RGVhY3RpdmF0ZWQoSVdvcmtiZW5jaFBhcnQgcGFydCkgewotCQkJZkFjdGl2ZVBhcnQgPSBudWxsOwotCQl9Ci0KLQkJLyoKLQkJICogQHNlZSBJUGFydExpc3RlbmVyI3BhcnRPcGVuZWQob3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBwYXJ0T3BlbmVkKElXb3JrYmVuY2hQYXJ0IHBhcnQpIHsKLQkJCWlmIChwYXJ0ID09IE1ldGhvZEVsZW1lbnRFZGl0b3IudGhpcykgewotCQkJCWlmICghaXNJbnB1dFZhbGlkKCkpIHsKLQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4KLQkJCQkJCQkuZ2V0RGVmYXVsdCgpCi0JCQkJCQkJLmdldE1zZ0RpYWxvZygpCi0JCQkJCQkJLmRpc3BsYXlJbmZvKAotCQkJCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuZWRpdG9yc19NZXRob2RFbGVtZW50RWRpdG9yX2ludmFsaWRFZGl0b3JUaXRsZSwgCi0JCQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5lZGl0b3JzX01ldGhvZEVsZW1lbnRFZGl0b3JfaW52YWxpZEVkaXRvck1zZyk7IAotCQkJCQlNZXRob2RFbGVtZW50RWRpdG9yLnRoaXMuY2xvc2UoZmFsc2UpOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCUNvbGxlY3Rpb248UmVzb3VyY2U+IHVzZWRSZXNvdXJjZXMgPSBnZXRVc2VkUmVzb3VyY2VzKCk7Ci0JCQkJaWYgKFJlc291cmNlVXRpbC5oYXNPdXRPZlN5bmNoKHVzZWRSZXNvdXJjZXMpKSB7Ci0JCQkJCWhhbmRsZUZpbGVDaGFuZ2VkKHVzZWRSZXNvdXJjZXMpOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCXNldFJlc291cmNlSW5mb3ModXNlZFJlc291cmNlcyk7Ci0JCQl9Ci0JCX0KLQotCQkvKioKLQkJICogSGFuZGxlcyB0aGUgYWN0aXZhdGlvbiB0cmlnZ2VyaW5nIGEgZWxlbWVudCBzdGF0ZSBjaGVjayBpbiB0aGUKLQkJICogZWRpdG9yLgotCQkgKi8KLQkJcHJpdmF0ZSB2b2lkIGhhbmRsZUFjdGl2YXRpb24oKSB7Ci0JCQlpZiAoZklzSGFuZGxpbmdBY3RpdmF0aW9uIHx8IE1ldGhvZEVsZW1lbnRFZGl0b3IudGhpcy5kaXNwb3NlZCkKLQkJCQlyZXR1cm47Ci0KLQkJCWlmIChmQWN0aXZlUGFydCA9PSBNZXRob2RFbGVtZW50RWRpdG9yLnRoaXMpIHsKLQkJCQlmSXNIYW5kbGluZ0FjdGl2YXRpb24gPSB0cnVlOwotCQkJCXRyeSB7Ci0JCQkJCWhhbmRsZUFjdGl2YXRlKGZBY3RpdmVQYXJ0KTsKLQkJCQl9IGZpbmFsbHkgewotCQkJCQlmSXNIYW5kbGluZ0FjdGl2YXRpb24gPSBmYWxzZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQkvKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklXaW5kb3dMaXN0ZW5lciN3aW5kb3dBY3RpdmF0ZWQob3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdykKLQkJICogQHNpbmNlIDMuMQotCQkgKi8KLQkJcHVibGljIHZvaWQgd2luZG93QWN0aXZhdGVkKElXb3JrYmVuY2hXaW5kb3cgd2luZG93KSB7Ci0JCQlpZiAod2luZG93ID09IGdldEVkaXRvclNpdGUoKS5nZXRXb3JrYmVuY2hXaW5kb3coKSkgewotCQkJCS8qCi0JCQkJICogV29ya2Fyb3VuZCBmb3IgcHJvYmxlbSBkZXNjcmliZWQgaW4KLQkJCQkgKiBodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTExNzMxIFdpbGwgYmUKLQkJCQkgKiByZW1vdmVkIHdoZW4gU1dUIGhhcyBzb2x2ZWQgdGhlIHByb2JsZW0uCi0JCQkJICovCi0JCQkJd2luZG93LmdldFNoZWxsKCkuZ2V0RGlzcGxheSgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCWhhbmRsZUFjdGl2YXRpb24oKTsKLQkJCQkJfQotCQkJCX0pOwotCQkJfQotCQl9Ci0KLQkJLyoKLQkJICogQHNlZSBvcmcuZWNsaXBzZS51aS5JV2luZG93TGlzdGVuZXIjd2luZG93RGVhY3RpdmF0ZWQob3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdykKLQkJICogQHNpbmNlIDMuMQotCQkgKi8KLQkJcHVibGljIHZvaWQgd2luZG93RGVhY3RpdmF0ZWQoSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cpIHsKLQkJfQotCi0JCS8qCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVdpbmRvd0xpc3RlbmVyI3dpbmRvd0Nsb3NlZChvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93KQotCQkgKiBAc2luY2UgMy4xCi0JCSAqLwotCQlwdWJsaWMgdm9pZCB3aW5kb3dDbG9zZWQoSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cpIHsKLQkJfQotCi0JCS8qCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVdpbmRvd0xpc3RlbmVyI3dpbmRvd09wZW5lZChvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93KQotCQkgKiBAc2luY2UgMy4xCi0JCSAqLwotCQlwdWJsaWMgdm9pZCB3aW5kb3dPcGVuZWQoSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cpIHsKLQkJfQotCX0KLQotCXByaXZhdGUgQWN0aXZhdGlvbkxpc3RlbmVyIGFjdGl2YXRpb25MaXN0ZW5lcjsKLQotCXByaXZhdGUgYm9vbGVhbiBjaGVja0ZpbGVDaGFuZ2VkUmVxdWlyZWQgPSBmYWxzZTsKLQotCXByb3RlY3RlZCBIYXNoU2V0PFJlc291cmNlPiBsYXN0VXNlZFJlc291cmNlczsKLQotCXByaXZhdGUgYm9vbGVhbiBkaXNwb3NlZDsKLQotCXByb3RlY3RlZCBIYXNoTWFwPFJlc291cmNlLCBSZXNvdXJjZUluZm8+IHJlc291cmNlSW5mb01hcDsKLQotCXByaXZhdGUgSUZpbGUgZWxlbWVudEZpbGU7Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgTWV0aG9kRWxlbWVudEVkaXRvcigpIHsKLQkJc3VwZXIoKTsKLQkJCi0JCS8vIG1vdmVkIHRoZSBkZXRhaWxzIG91dCBzbyB0aGF0IHVzZXIgY2FuIG92ZXJyaWRlIHRoZSB0aWNrIHVwZGF0b3IKLQkJLy8gSmluaHVhIFhpIDMvMTUvMjAwNwotCQljcmVhdGVFZGl0b3JFcnJvclRpY2tVcGRhdGVyKCk7Ci0JCWNyZWF0ZUFjdGlvbk1hbmFnZXIoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRWRpdG9yRXJyb3JUaWNrVXBkYXRlcigpIHsKLQkJCi0JCXRoaXMuZk1ldGhvZEVsZW1lbnRFZGl0b3JFcnJvclRpY2tVcGRhdGVyID0gbmV3IE1ldGhvZEVsZW1lbnRFZGl0b3JFcnJvclRpY2tVcGRhdGVyKHRoaXMpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBY3Rpb25NYW5hZ2VyKCkgewotCQlhY3Rpb25NZ3IgPSBuZXcgQWN0aW9uTWFuYWdlcigpIHsKLQotCQkJcHJvdGVjdGVkIEZ1bGx5UmV2ZXJ0aWJsZUNvbW1hbmRTdGFjayBjcmVhdGVDb21tYW5kU3RhY2soKSB7Ci0JCQkJcmV0dXJuIG5ldyBGdWxseVJldmVydGlibGVDb21tYW5kU3RhY2sodGhpcykgewotCQkJCQlwdWJsaWMgYm9vbGVhbiBkb0V4ZWN1dGUoQ29tbWFuZCBjb21tYW5kKSB7Ci0JCQkJCQkvLyBDaGVjayBtb2RpZnkgZmlyc3QuCi0JCQkJCQlpZiAoY29tbWFuZCBpbnN0YW5jZW9mIElSZXNvdXJjZUF3YXJlQ29tbWFuZCkgewotCQkJCQkJCUNvbGxlY3Rpb24gbW9kaWZpZWRSZXNvdXJjZXMgPSAoKElSZXNvdXJjZUF3YXJlQ29tbWFuZCkgY29tbWFuZCkKLQkJCQkJCQkJCS5nZXRNb2RpZmllZFJlc291cmNlcygpOwotCQkJCQkJCWlmIChtb2RpZmllZFJlc291cmNlcyAhPSBudWxsCi0JCQkJCQkJCQkmJiAhKG1vZGlmaWVkUmVzb3VyY2VzLmlzRW1wdHkoKSkpIHsKLQkJCQkJCQkJSVN0YXR1cyBzdGF0dXMgPSBVc2VySW50ZXJhY3Rpb25IZWxwZXIKLQkJCQkJCQkJCQkuY2hlY2tNb2RpZnkobW9kaWZpZWRSZXNvdXJjZXMsCi0JCQkJCQkJCQkJCQlnZXRTaXRlKCkuZ2V0U2hlbGwoKSk7Ci0JCQkJCQkJCWlmICghc3RhdHVzLmlzT0soKSkgewotCQkJCQkJCQkJTWV0aG9kRWxlbWVudEVkaXRvci50aGlzCi0JCQkJCQkJCQkJCS5oYW5kbGVFcnJvcihzdGF0dXMpOwotCQkJCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlFT2JqZWN0IG93bmVyID0gVG5nVXRpbC5nZXRPd25lcihjb21tYW5kKTsKLQkJCQkJCQlpZiAob3duZXIgIT0gbnVsbCkgewotCQkJCQkJCQlJU3RhdHVzIHN0YXR1cyA9IFRuZ1V0aWwuY2hlY2tFZGl0KG93bmVyLAotCQkJCQkJCQkJCWdldFNpdGUoKS5nZXRTaGVsbCgpKTsKLQkJCQkJCQkJaWYgKCFzdGF0dXMuaXNPSygpKSB7Ci0JCQkJCQkJCQlBdXRob3JpbmdVSVBsdWdpbgotCQkJCQkJCQkJCQkuZ2V0RGVmYXVsdCgpCi0JCQkJCQkJCQkJCS5nZXRNc2dEaWFsb2coKQotCQkJCQkJCQkJCQkuZGlzcGxheSgKLQkJCQkJCQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5lcnJvckRpYWxvZ190aXRsZSwgCi0JCQkJCQkJCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuZWRpdERpYWxvZ19tc2dDYW5ub3RFZGl0LCAKLQkJCQkJCQkJCQkJCQlzdGF0dXMpOwotCQkJCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCi0JCQkJCQlpZiAoY2hhbmdlVGltZSA9PSAtMSkgewotCQkJCQkJCWNoYW5nZVRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCQkJCX0KLQkJCQkJCWJvb2xlYW4gcmV0ID0gc3VwZXIuZG9FeGVjdXRlKGNvbW1hbmQpOwotCQkJCQkJaWYgKCFyZXQgJiYgY2hhbmdlVGltZSAhPSAtMSkgewotCQkJCQkJCWNoYW5nZVRpbWUgPSAtMTsKLQkJCQkJCX0KLQkJCQkJCXJldHVybiByZXQ7Ci0JCQkJCX0KLQotCQkJCX07Ci0JCQl9Ci0KLQkJCXB1YmxpYyBib29sZWFuIGRvQWN0aW9uKGludCBhY3Rpb25UeXBlLCBFT2JqZWN0IG9iamVjdCwKLQkJCQkJb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLAotCQkJCQlPYmplY3QgdmFsdWUsIGludCBpbmRleCkgewotCQkJCWZpbmFsIElTdGF0dXMgc3RhdHVzID0gVG5nVXRpbAotCQkJCQkJLmNoZWNrRWRpdChvYmplY3QsIGdldFNpdGUoKS5nZXRTaGVsbCgpKTsKLQkJCQlpZiAoc3RhdHVzLmlzT0soKSkgewotCQkJCQlyZXR1cm4gc3VwZXIuZG9BY3Rpb24oYWN0aW9uVHlwZSwgb2JqZWN0LCBmZWF0dXJlLCB2YWx1ZSwKLQkJCQkJCQlpbmRleCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJLy8gdGhpcyBtaWdodCBiZSBjYWxsZWQgZnJvbSBhIG5vbi1VSSB0aHJlYWQKLQkJCQkJLy8gc28gbWFrZSBzdXJlIHRoZSBtZXNzYWdlIGRpYWxvZyB3aWxsIGJlIHNob3duIGluIGEgVUkgdGhyZWFkCi0JCQkJCS8vCi0JCQkJCVNhZmVVcGRhdGVDb250cm9sbGVyLnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQotCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKS5kaXNwbGF5RXJyb3IoCi0JCQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5lZGl0RGlhbG9nX3RpdGxlLCAKLQkJCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLmVkaXREaWFsb2dfbXNnQ2Fubm90RWRpdCwgCi0JCQkJCQkJCQlzdGF0dXMpOwotCQkJCQkJfQotCQkJCQkJCi0JCQkJCX0pOwotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJfQotCi0JCQlwcm90ZWN0ZWQgdm9pZCBzYXZlKFJlc291cmNlIHJlc291cmNlKSB7Ci0JCQkJLy8gZG9uJ3Qgc2F2ZSByZXNvdXJjZSB0aGF0IGlzIGNoYW5nZWQgb3V0c2lkZSBvZiB0aGlzIGVkaXRvcgotCQkJCS8vCi0JCQkJaWYgKGNoYW5nZWRSZXNvdXJjZXMuY29udGFpbnMocmVzb3VyY2UpKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJCi0JCQkJYm9vbGVhbiBjYW5TYXZlOwotCQkJCWlmKHJlc291cmNlLmdldFVSSSgpLmlzRmlsZSgpKSB7Ci0JCQkJCUZpbGUgZmlsZSA9IG5ldyBGaWxlKHJlc291cmNlLmdldFVSSSgpLnRvRmlsZVN0cmluZygpKTsKLQkJCQkJY2FuU2F2ZSA9IGZpbGUubGFzdE1vZGlmaWVkKCkgPiBjaGFuZ2VUaW1lOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJY2FuU2F2ZSA9IHRydWU7Ci0JCQkJfQkJCQkKLQkJCQl0cnkgewotCQkJCQlpZihjYW5TYXZlKSB7Ci0JCQkJCQlJTGlicmFyeVBlcnNpc3Rlci5GYWlsU2FmZU1ldGhvZExpYnJhcnlQZXJzaXN0ZXIgcGVyc2lzdGVyID0gZ2V0UGVyc2lzdGVyKCk7Ci0JCQkJCQl0cnkgewotCQkJCQkJCXBlcnNpc3Rlci5zYXZlKHJlc291cmNlKTsKLQkJCQkJCQlwZXJzaXN0ZXIuY29tbWl0KCk7Ci0JCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKQotCQkJCQkJCS5sb2dFcnJvcihlKTsKLQkJCQkJCQl0cnkgewotCQkJCQkJCQlwZXJzaXN0ZXIucm9sbGJhY2soKTsKLQkJCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCQkJCQkJVmlld0hlbHBlcgotCQkJCQkJCQkucmVsb2FkQ3VycmVudExpYmFyeU9uUm9sbGJhY2tFcnJvcihnZXRFZGl0b3JTaXRlKCkKLQkJCQkJCQkJCQkuZ2V0U2hlbGwoKSk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfSBmaW5hbGx5IHsKLQkJCQkJY2hhbmdlVGltZSA9IC0xOwotCQkJCX0KLQkJCX0KLQkJfTsKLQotCQlhY3Rpb25NZ3IuZ2V0Q29tbWFuZFN0YWNrKCkuYWRkQ29tbWFuZFN0YWNrTGlzdGVuZXIoCi0JCQkJbmV3IENvbW1hbmRTdGFja0xpc3RlbmVyKCkgewotCQkJCQlwdWJsaWMgdm9pZCBjb21tYW5kU3RhY2tDaGFuZ2VkKEV2ZW50T2JqZWN0IGV2ZW50KSB7Ci0JCQkJCQlEaXNwbGF5LmdldERlZmF1bHQoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQkJZmlyZVByb3BlcnR5Q2hhbmdlKElFZGl0b3JQYXJ0LlBST1BfRElSVFkpOwotCQkJCQkJCX0KLQkJCQkJCX0pOwotCQkJCQl9Ci0JCQkJfSk7Ci0KLQkJSUxpYnJhcnlNYW5hZ2VyIG1hbmFnZXIgPSAoSUxpYnJhcnlNYW5hZ2VyKSBMaWJyYXJ5U2VydmljZQotCQkJCS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRMaWJyYXJ5TWFuYWdlcigpOwotCQlpZiAobWFuYWdlciAhPSBudWxsKSB7Ci0JCQltYW5hZ2VyLnN0YXJ0TGlzdGVuaW5nVG8oYWN0aW9uTWdyLmdldENvbW1hbmRTdGFjaygpKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBuYW1lQ2hhbmdlZCgpIHsKLQkJU2FmZVVwZGF0ZUNvbnRyb2xsZXIuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCXNldFBhcnROYW1lKCk7Ci0JCQkJaWYgKHBhZ2VzICE9IG51bGwpIHsKLQkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gcGFnZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlPYmplY3QgcGFnZSA9IGl0ZXIubmV4dCgpOwotCi0JCQkJCQlpZiAocGFnZSBpbnN0YW5jZW9mIElSZWZyZXNoYWJsZSkgewotCQkJCQkJCSgoSVJlZnJlc2hhYmxlKSBwYWdlKS5yZWZyZXNoTmFtZShlbGVtZW50T2JqCi0JCQkJCQkJCQkuZ2V0TmFtZSgpKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCQotCQl9KTsKLQl9Ci0JCi0JcHVibGljIElBY3Rpb25NYW5hZ2VyIGdldEFjdGlvbk1hbmFnZXIoKSB7Ci0JCXJldHVybiBhY3Rpb25NZ3I7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuRm9ybUVkaXRvciNpbml0KElFZGl0b3JTaXRlLAotCSAqICAgICAgSUVkaXRvcklucHV0KQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSUVkaXRvclNpdGUgc2l0ZSwgSUVkaXRvcklucHV0IGlucHV0KQotCQkJdGhyb3dzIFBhcnRJbml0RXhjZXB0aW9uIHsKLQkJc2V0U2l0ZShzaXRlKTsKLQkJaWYgKGlucHV0IGluc3RhbmNlb2YgRmlsZUVkaXRvcklucHV0KSB7Ci0JCQkvLyBwcm9iYWJseSBvcGVuZWQgZnJvbSBQcm9ibGVtcyBWaWV3Ci0JCQkvLyBjcmVhdGUgYSBNZXRob2RFbGVtZW50RWRpdG9ySW5wdXQKLQkJCWVsZW1lbnRGaWxlID0gKChGaWxlRWRpdG9ySW5wdXQpaW5wdXQpLmdldEZpbGUoKTsKLQkJCU1ldGhvZEVsZW1lbnQgZWxlbWVudCA9IFBlcnNpc3RlbmNlVXRpbC5nZXRNZXRob2RFbGVtZW50KAotCQkJCQllbGVtZW50RmlsZSwKLQkJCQkJTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TGlicmFyeU1hbmFnZXIoKS4KLQkJCQkJCWdldEVkaXRpbmdEb21haW4oKS5nZXRSZXNvdXJjZVNldCgpKTsKLQkJCWlmIChlbGVtZW50ICE9IG51bGwpIHsKLQkJCQlpbnB1dCA9IG5ldyBNZXRob2RFbGVtZW50RWRpdG9ySW5wdXQoCi0JCQkJCWVsZW1lbnQpOwotCQkJfQotCQl9Ci0JCXNldElucHV0KGlucHV0KTsKLQkJc2l0ZS5zZXRTZWxlY3Rpb25Qcm92aWRlcihuZXcgTXVsdGlQYWdlU2VsZWN0aW9uUHJvdmlkZXIodGhpcykpOwotCQlhY3RpdmF0aW9uTGlzdGVuZXIgPSBuZXcgQWN0aXZhdGlvbkxpc3RlbmVyKHNpdGUuZ2V0V29ya2JlbmNoV2luZG93KCkKLQkJCQkuZ2V0UGFydFNlcnZpY2UoKSk7Ci0KLQkJSUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlciA9IG5ldyBBZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIoCi0JCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJCS5nZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSk7Ci0JCUltYWdlIHRpdGxlSW1hZ2UgPSBsYWJlbFByb3ZpZGVyLmdldEltYWdlKGVsZW1lbnRPYmopOwotCQlsYWJlbFByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJc2V0VGl0bGVJbWFnZSh0aXRsZUltYWdlKTsKLQotCQlDb21tYW5kU3RhY2sgY29tbWFuZFN0YWNrID0gYWN0aW9uTWdyLmdldENvbW1hbmRTdGFjaygpOwotCQllZGl0aW5nRG9tYWluID0gbmV3IEFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbihUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCS5nZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSwgY29tbWFuZFN0YWNrKTsKLQotCX0KLQotCS8qKgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGFydC5FZGl0b3JQYXJ0I3NldElucHV0KG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRJbnB1dChJRWRpdG9ySW5wdXQgaW5wdXQpIHsKLQkJc3VwZXIuc2V0SW5wdXQoaW5wdXQpOwotCi0JCS8vIEdldCBtZXRob2QgZWxlbWVudCBvYmplY3QgZnJvbSBFZGl0b3IgaW5wdXQuCi0JCS8vCi0JCU1ldGhvZEVsZW1lbnRFZGl0b3JJbnB1dCBtZXRob2RFbGVtZW50SW5wdXQgPSAoTWV0aG9kRWxlbWVudEVkaXRvcklucHV0KSBpbnB1dDsKLQkJZWxlbWVudE9iaiA9IG1ldGhvZEVsZW1lbnRJbnB1dC5nZXRNZXRob2RFbGVtZW50KCk7Ci0KLQkJc2V0UGFydE5hbWUoKTsKLQkJZWxlbWVudE9iai5lQWRhcHRlcnMoKS5hZGQobmFtZUNoYW5nZWRMaXN0ZW5lcik7Ci0JCQotCQlpZiAoZk1ldGhvZEVsZW1lbnRFZGl0b3JFcnJvclRpY2tVcGRhdGVyICE9IG51bGwpCi0JCQlmTWV0aG9kRWxlbWVudEVkaXRvckVycm9yVGlja1VwZGF0ZXIudXBkYXRlRWRpdG9ySW1hZ2UoZWxlbWVudE9iaik7Ci0KLQl9Ci0KLQlwdWJsaWMgTWV0aG9kRWxlbWVudCBnZXRNZXRob2RFbGVtZW50KCkKLQl7Ci0JCXJldHVybiBlbGVtZW50T2JqOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB1cGRhdGVSZXNvdXJjZUluZm9zKENvbGxlY3Rpb248UmVzb3VyY2U+IHJlc291cmNlcykgewotCQlpZihyZXNvdXJjZUluZm9NYXAgPT0gbnVsbCkgewotCQkJcmVzb3VyY2VJbmZvTWFwID0gbmV3IEhhc2hNYXA8UmVzb3VyY2UsIFJlc291cmNlSW5mbz4oKTsKLQkJfQotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSByZXNvdXJjZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlSZXNvdXJjZSByZXNvdXJjZSA9IChSZXNvdXJjZSkgaXRlci5uZXh0KCk7Ci0JCQlSZXNvdXJjZUluZm8gaW5mbyA9IHJlc291cmNlSW5mb01hcC5nZXQocmVzb3VyY2UpOwotCQkJaWYoaW5mbyA9PSBudWxsKSB7Ci0JCQkJaW5mbyA9IG5ldyBSZXNvdXJjZUluZm8ocmVzb3VyY2UpOwotCQkJCXJlc291cmNlSW5mb01hcC5wdXQocmVzb3VyY2UsIGluZm8pOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJaW5mby5yZWZyZXNoKCk7Ci0JCQl9Ci0JCX0KLQkJY2hlY2tGaWxlQ2hhbmdlZFJlcXVpcmVkID0gdHJ1ZTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgb3Zld3JpdGVSZXNvdXJjZXMoQ29sbGVjdGlvbjxSZXNvdXJjZT4gcmVzb3VyY2VzKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHJlc291cmNlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCVJlc291cmNlIHJlc291cmNlID0gKFJlc291cmNlKSBpdGVyLm5leHQoKTsKLQkJCVJlc291cmNlSW5mbyBpbmZvID0gcmVzb3VyY2VJbmZvTWFwLmdldChyZXNvdXJjZSk7Ci0JCQlpZihpbmZvICE9IG51bGwpIHsKLQkJCQlpbmZvLm92ZXJ3cml0ZSA9IHRydWU7Ci0JCQl9Ci0JCX0JCQotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRSZXNvdXJjZUluZm9zKENvbGxlY3Rpb248UmVzb3VyY2U+IHJlc291cmNlcykgewotCQlpZihyZXNvdXJjZUluZm9NYXAgIT0gbnVsbCAmJiAhcmVzb3VyY2VJbmZvTWFwLmlzRW1wdHkoKSkgewotCQkJcmVzb3VyY2VJbmZvTWFwLmNsZWFyKCk7Ci0JCX0KLQkJdXBkYXRlUmVzb3VyY2VJbmZvcyhyZXNvdXJjZXMpOwotCX0KLQkKLQlwcml2YXRlIGxvbmcgZ2V0TG9hZFN0YW1wKFJlc291cmNlIHJlc291cmNlKSB7Ci0JCVJlc291cmNlSW5mbyBpbmZvID0gcmVzb3VyY2VJbmZvTWFwLmdldChyZXNvdXJjZSk7Ci0JCXJldHVybiBpbmZvICE9IG51bGwgPyBpbmZvLmxvYWRTdGFtcCA6IElSZXNvdXJjZS5OVUxMX1NUQU1QOwotCX0KLQotCS8qKgotCSAqIENoZWNrcyBpZiB0aGVyZSBpcyBhbnkgcmVzb3VyY2UgaW4gdGhlIGdpdmVuIDxjb2RlPnVzZWRSZXNvdXJjZXM8L2NvZGU+Ci0JICogdGhhdCBoYXMgYmVlbiByZWxvYWRlZCBzaW5jZSBsYXN0IHVwZGF0ZSBvZiBsb2FkIHRpbWUgc3RhbXBzIGJ5IHRoaXMKLQkgKiBlZGl0b3IKLQkgKiAKLQkgKiBAcGFyYW0gdXNlZFJlc291cmNlCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBjaGVja1JlbG9hZGVkKENvbGxlY3Rpb24gdXNlZFJlc291cmNlcykgewotCQlSZXNvdXJjZVNldCByZXNvdXJjZVNldCA9IGdldFJlc291cmNlU2V0KHVzZWRSZXNvdXJjZXMpOwotCQlib29sZWFuIHhtaSA9IHJlc291cmNlU2V0IGluc3RhbmNlb2YgSUxpYnJhcnlSZXNvdXJjZVNldCAKLQkJCSYmICgoSUxpYnJhcnlSZXNvdXJjZVNldClyZXNvdXJjZVNldCkuZ2V0UGVyc2lzdGVuY2VUeXBlKCkuZXF1YWxzKFNlcnZpY2VzLlhNSV9QRVJTSVNURU5DRV9UWVBFKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gdXNlZFJlc291cmNlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCVJlc291cmNlIHJlc291cmNlID0gKFJlc291cmNlKSBpdGVyLm5leHQoKTsKLQkJCWlmKHJlc291cmNlIGluc3RhbmNlb2YgSUxpYnJhcnlSZXNvdXJjZSkgewotCQkJCWxvbmcgb2xkU3RhbXAgPSBnZXRMb2FkU3RhbXAocmVzb3VyY2UpOwotCQkJCWxvbmcgY3VycmVudFN0YW1wID0gKChJTGlicmFyeVJlc291cmNlKXJlc291cmNlKS5nZXRMb2FkU3RhbXAoKTsKLQkJCQlpZiAob2xkU3RhbXAgIT0gY3VycmVudFN0YW1wKSB7Ci0JCQkJCWlmKHhtaSkgewotCQkJCQkJSVJlc291cmNlIHdzUmVzID0gRmlsZU1hbmFnZXIuZ2V0UmVzb3VyY2VGb3JMb2NhdGlvbihyZXNvdXJjZQotCQkJCQkJCQkuZ2V0VVJJKCkudG9GaWxlU3RyaW5nKCkpOwotCQkJCQkJaWYgKHdzUmVzICE9IG51bGwpIHsKLQkJCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgUmVzb3VyY2VTZXQgZ2V0UmVzb3VyY2VTZXQoQ29sbGVjdGlvbiByZXNvdXJjZXMpIHsKLQkJUmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQgPSBudWxsOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSByZXNvdXJjZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlSZXNvdXJjZSByZXNvdXJjZSA9IChSZXNvdXJjZSkgaXRlci5uZXh0KCk7Ci0JCQlyZXNvdXJjZVNldCA9IHJlc291cmNlLmdldFJlc291cmNlU2V0KCk7Ci0JCQlpZiAocmVzb3VyY2VTZXQgIT0gbnVsbCkgewotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXNvdXJjZVNldDsKLQl9Ci0JCi0JcHJpdmF0ZSBDb2xsZWN0aW9uPFJlc291cmNlPiBnZXRPdXRPZlN5bmNSZXNvdXJjZXMoQ29sbGVjdGlvbjxSZXNvdXJjZT4gdXNlZFJlc291cmNlcykgewotCQlDb2xsZWN0aW9uPFJlc291cmNlPiBvdXRPZlN5bmNSZXNvdXJjZXMgPSBuZXcgQXJyYXlMaXN0PFJlc291cmNlPigpOwotCQlmb3IgKFJlc291cmNlIHJlc291cmNlIDogdXNlZFJlc291cmNlcykgewotCQkJaWYoaXNPdXRPZlN5bmMocmVzb3VyY2UpKSB7Ci0JCQkJb3V0T2ZTeW5jUmVzb3VyY2VzLmFkZChyZXNvdXJjZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG91dE9mU3luY1Jlc291cmNlczsKLQl9Ci0KLQkKLQlwcml2YXRlIGJvb2xlYW4gaXNPdXRPZlN5bmMoUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJUmVzb3VyY2VJbmZvIGluZm8gPSByZXNvdXJjZUluZm9NYXAuZ2V0KHJlc291cmNlKTsKLQkJbG9uZyBzdGFtcCA9IElTeW5jaHJvbml6YXRpb25IZWxwZXIuSU5TVEFOQ0UuZ2V0TW9kaWZpY2F0aW9uU3RhbXAocmVzb3VyY2UpOwotCQlpZihzdGFtcCAhPSBJUmVzb3VyY2UuTlVMTF9TVEFNUCkgewotCQkJaWYoaW5mbyA9PSBudWxsIHx8IGluZm8ubW9kaWZpY2F0aW9uU3RhbXAgIT0gc3RhbXApIHsKLQkJCQlpZihJU3luY2hyb25pemF0aW9uSGVscGVyLklOU1RBTkNFLmlzU3luY2hyb25pemVkKHJlc291cmNlKSkgewotCQkJCQkvLyByZWZyZXNoIHRoZSBjYWNoZWQgc3RhbXAKLQkJCQkJLy8KLQkJCQkJaWYoaW5mbyA9PSBudWxsKSB7Ci0JCQkJCQlyZXNvdXJjZUluZm9NYXAucHV0KHJlc291cmNlLCBuZXcgUmVzb3VyY2VJbmZvKHJlc291cmNlKSk7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQlpbmZvLm1vZGlmaWNhdGlvblN0YW1wID0gSVN5bmNocm9uaXphdGlvbkhlbHBlci5JTlNUQU5DRS5nZXRNb2RpZmljYXRpb25TdGFtcChyZXNvdXJjZSk7IAotCQkJCQl9CQkJCQkJCi0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXR1cm4gIUlTeW5jaHJvbml6YXRpb25IZWxwZXIuSU5TVEFOQ0UuaXNTeW5jaHJvbml6ZWQocmVzb3VyY2UpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGNoZWNrRmlsZUNoYW5nZWQoQ29sbGVjdGlvbiB1c2VkUmVzb3VyY2VzKSB7Ci0JCS8vIGNoZWNrIHJlc291cmNlIHNldCB0eXBlIGFuZCBjb250aW51ZSB0byBjaGVjayBmb3IgY2hhbmdlZCBmaWxlIGlmIHRoZQotCQkvLyB0eXBlIGlzIFhNSQotCQkvLwotCQlSZXNvdXJjZVNldCByZXNvdXJjZVNldCA9IGdldFJlc291cmNlU2V0KHVzZWRSZXNvdXJjZXMpOwotCQlpZiAocmVzb3VyY2VTZXQgaW5zdGFuY2VvZiBJTGlicmFyeVJlc291cmNlU2V0Ci0JCQkJJiYgKChJTGlicmFyeVJlc291cmNlU2V0KSByZXNvdXJjZVNldCkuZ2V0UGVyc2lzdGVuY2VUeXBlKCkuZXF1YWxzKFNlcnZpY2VzLlhNSV9QRVJTSVNURU5DRV9UWVBFKSkgewotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gdXNlZFJlc291cmNlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlSZXNvdXJjZSByZXNvdXJjZSA9IChSZXNvdXJjZSkgaXRlci5uZXh0KCk7Ci0JCQkJaWYoaXNPdXRPZlN5bmMocmVzb3VyY2UpKSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gcHJvbXB0UmVsb2FkRmlsZXMoKSB7Ci0JCVN0cmluZyB0aXRsZSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmVkaXRvcl9lcnJvcl9hY3RpdmF0ZWRfb3V0b2ZzeW5jX3RpdGxlOwotCQlTdHJpbmcgbXNnID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZWRpdG9yX2Vycm9yX2FjdGl2YXRlZF9vdXRvZnN5bmNfbWVzc2FnZTsKLQkJcmV0dXJuIEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKS5kaXNwbGF5UHJvbXB0KAotCQkJCXRpdGxlLCBtc2cpOwotCX0KLQkKLQlwcml2YXRlIGJvb2xlYW4gaGFuZGxlRmlsZUNoYW5nZWQoZmluYWwgQ29sbGVjdGlvbjxSZXNvdXJjZT4gdXNlZFJlc291cmNlcykgewotCQlib29sZWFuIHJldCA9IHByb21wdFJlbG9hZEZpbGVzKCk7Ci0JCWlmIChyZXQpIHsKLQkJCUlSdW5uYWJsZVdpdGhQcm9ncmVzcyBydW5uYWJsZSA9IG5ldyBJUnVubmFibGVXaXRoUHJvZ3Jlc3MoKSB7Ci0KLQkJCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQotCQkJCQkJdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJCQkJbW9uaXRvci5iZWdpblRhc2soIiIsIDEwKTsgLy8kTk9OLU5MUy0xJAotCQkJCQltb25pdG9yLnN1YlRhc2soQXV0aG9yaW5nVUlSZXNvdXJjZXMucmVmcmVzaF90ZXh0KTsgCi0JCQkJCW1vbml0b3Iud29ya2VkKDEpOwotCQkJCQl0cnkgewotCi0JCQkJCQlDb2xsZWN0aW9uPFJlc291cmNlPiByZW1vdmVkUmVzb3VyY2VzID0gbmV3IEFycmF5TGlzdDxSZXNvdXJjZT4oKTsKLQkJCQkJCWZvciAoUmVzb3VyY2UgcmVzb3VyY2UgOiB1c2VkUmVzb3VyY2VzKSB7Ci0JCQkJCQkJaWYgKCFuZXcgRmlsZShyZXNvdXJjZS5nZXRVUkkoKS50b0ZpbGVTdHJpbmcoKSkKLQkJCQkJCQkJCS5leGlzdHMoKSkgewotCQkJCQkJCQlyZW1vdmVkUmVzb3VyY2VzLmFkZChyZXNvdXJjZSk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJQ29sbGVjdGlvbjxSZXNvdXJjZT4gY2hhbmdlZFJlc291cmNlcyA9IHJlc291cmNlSW5mb01hcCAhPSBudWxsID8gCi0JCQkJCQkJCWdldE91dE9mU3luY1Jlc291cmNlcyh1c2VkUmVzb3VyY2VzKSA6Ci0JCQkJCQkJCVJlc291cmNlVXRpbC5nZXRPdXRPZlN5bmNSZXNvdXJjZXModXNlZFJlc291cmNlcyk7Ci0JCQkJCQltb25pdG9yLndvcmtlZCgyKTsKLQotCQkJCQkJLy8gdW5sb2FkIHRoZSByZW1vdmVkIHJlc291cmNlcwotCQkJCQkJLy8KLQkJCQkJCVBlcnNpc3RlbmNlVXRpbC51bmxvYWQocmVtb3ZlZFJlc291cmNlcyk7Ci0JCQkJCQltb25pdG9yLndvcmtlZCgyKTsKLQotCQkJCQkJLy8gUmVsb2FkIHRoZSBjaGFuZ2VkIHJlc291cmNlcy4KLQkJCQkJCUlMaWJyYXJ5TWFuYWdlciBtYW5hZ2VyID0gKElMaWJyYXJ5TWFuYWdlcikgTGlicmFyeVNlcnZpY2UKLQkJCQkJCQkJLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudExpYnJhcnlNYW5hZ2VyKCk7Ci0JCQkJCQlpZiAobWFuYWdlciAhPSBudWxsKSB7Ci0JCQkJCQkJQ29sbGVjdGlvbjxSZXNvdXJjZT4gcmVsb2FkZWRSZXNvdXJjZXMgPSBtYW5hZ2VyCi0JCQkJCQkJCQkucmVsb2FkUmVzb3VyY2VzKGNoYW5nZWRSZXNvdXJjZXMpOwotCQkJCQkJCWlmICghcmVsb2FkZWRSZXNvdXJjZXMuaXNFbXB0eSgpKSB7Ci0JCQkJCQkJCVJlZnJlc2hKb2IuZ2V0SW5zdGFuY2UoKQotCQkJCQkJCQkJCS5nZXRSZWxvYWRlZEJlZm9yZVJlZnJlc2hSZXNvdXJjZXMoKQotCQkJCQkJCQkJCS5hZGRBbGwocmVsb2FkZWRSZXNvdXJjZXMpOwotCQkJCQkJCX0KLQotCQkJCQkJCWlmICghcmVtb3ZlZFJlc291cmNlcy5pc0VtcHR5KCkKLQkJCQkJCQkJCXx8ICFyZWxvYWRlZFJlc291cmNlcy5pc0VtcHR5KCkpIHsKLQkJCQkJCQkJLy8gc2F2ZSBjaGFuZ2VkIHJlc291cmNlcyBiZWZvcmUgcmVmcmVzaCBzbwotCQkJCQkJCQkvLyBhY3Rpb24KLQkJCQkJCQkJLy8gbWFuYWdlciB3aWxsIG5vdCB0cnkgdG8gc2F2ZSB0aGVzZSBjaGFuZ2VkCi0JCQkJCQkJCS8vIHJlc291cmNlcwotCQkJCQkJCQkvLwotCQkJCQkJCQlNZXRob2RFbGVtZW50RWRpdG9yLnRoaXMuY2hhbmdlZFJlc291cmNlcwotCQkJCQkJCQkJCS5hZGRBbGwocmVsb2FkZWRSZXNvdXJjZXMpOwotCQkJCQkJCQlNZXRob2RFbGVtZW50RWRpdG9yLnRoaXMubGFzdFVzZWRSZXNvdXJjZXMKLQkJCQkJCQkJCQkucmVtb3ZlQWxsKHJlbW92ZWRSZXNvdXJjZXMpOwotCQkJCQkJCQlyZWZyZXNoKHRydWUpOwotCQkJCQkJCQlNZXRob2RFbGVtZW50RWRpdG9yLnRoaXMuY2hhbmdlZFJlc291cmNlcwotCQkJCQkJCQkJCS5jbGVhcigpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCW1vbml0b3Iud29ya2VkKDQpOwotCi0JCQkJCQkvLyByZWZyZXNoIG91dC1vZi1zeW5jaCByZXNvdXJjZXMKLQkJCQkJCS8vCi0JCQkJCQlmb3IgKFJlc291cmNlIHJlc291cmNlIDogY2hhbmdlZFJlc291cmNlcykgewotCQkJCQkJCUZpbGVNYW5hZ2VyLmdldEluc3RhbmNlKCkucmVmcmVzaChyZXNvdXJjZSk7Ci0JCQkJCQl9Ci0JCQkJCQltb25pdG9yLndvcmtlZCgxKTsKLQkJCQkJfSBmaW5hbGx5IHsKLQkJCQkJCW1vbml0b3IuZG9uZSgpOwotCQkJCQl9Ci0JCQkJfQotCi0JCQl9OwotCi0JCQl0cnkgewotCQkJCWdldFNpdGUoKQotCQkJCQkJLmdldFdvcmtiZW5jaFdpbmRvdygpCi0JCQkJCQkuZ2V0V29ya2JlbmNoKCkKLQkJCQkJCS5nZXRQcm9ncmVzc1NlcnZpY2UoKQotCQkJCQkJLnJ1bkluVUkoCi0JCQkJCQkJCW5ldyBQcm9ncmVzc01vbml0b3JEaWFsb2coZ2V0U2l0ZSgpLmdldFNoZWxsKCkpLAotCQkJCQkJCQlydW5uYWJsZSwgbmV3IExpYnJhcnlTY2hlZHVsaW5nUnVsZShMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCkpKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCVN0cmluZyB0aXRsZSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLlByb2Nlc3NFZGl0b3JfcmVmcmVzaEVycm9yVGl0bGU7IAotCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKS5kaXNwbGF5RXJyb3IoCi0JCQkJCQl0aXRsZSwgZS50b1N0cmluZygpLCBlKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWNoZWNrRmlsZUNoYW5nZWRSZXF1aXJlZCA9IGZhbHNlOwotCQl9Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UGFydE5hbWUoKSB7Ci0JCVN0cmluZyBwYXJ0TmFtZSA9IGVsZW1lbnRPYmouZ2V0TmFtZSgpOwotCQlpZiAocGFydE5hbWUgPT0gbnVsbCkgewotCQkJcGFydE5hbWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXNldFBhcnROYW1lKHBhcnROYW1lKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIExpc3Q8SU1ldGhvZEVsZW1lbnRFZGl0b3JQYWdlUHJvdmlkZXJFeHRlbnNpb24+IGdldEFsbFBhZ2VQcm92aWRlcnMoKSB7Ci0JCWlmIChhbGxQYWdlUHJvdmlkZXJzID09IG51bGwpIHsKLQkJCWFsbFBhZ2VQcm92aWRlcnMgPSBFeHRlbnNpb25NYW5hZ2VyLmdldEV4dGVuc2lvbnMoQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldElkKCksIE1FVEhPRF9QQUdFX1BST1ZJREVSU19FWFRFTlNJT05fTkFNRSwgSU1ldGhvZEVsZW1lbnRFZGl0b3JQYWdlUHJvdmlkZXJFeHRlbnNpb24uY2xhc3MpOwotCQl9Ci0JCXJldHVybiBhbGxQYWdlUHJvdmlkZXJzOwotCX0KLQotCi0JcHJvdGVjdGVkIElNZXRob2RFbGVtZW50RWRpdG9yUGFnZVByb3ZpZGVyRXh0ZW5zaW9uIGdldERlZmF1bHRQYWdlUHJvdmlkZXIoKSB7Ci0JCWlmIChkZWZhdWx0UGFnZVByb3ZpZGVyID09IG51bGwpIHsKLQkJCWRlZmF1bHRQYWdlUHJvdmlkZXIgPSBuZXcgTWV0aG9kRWxlbWVudEVkaXRvckRlZmF1bHRQYWdlUHJvdmlkZXIoKTsKLQkJfQotCQlyZXR1cm4gZGVmYXVsdFBhZ2VQcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLmZvcm1zLmVkaXRvci5Gb3JtRWRpdG9yI2FkZFBhZ2VzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRQYWdlcygpIHsKLQkJLy8gZmlyc3QgZ2V0IG9yaWdpbmFsIGxpc3QKLQkJTWFwPE9iamVjdCxTdHJpbmc+IHBhZ2VNYXAgPSBnZXREZWZhdWx0UGFnZVByb3ZpZGVyKCkuZ2V0UGFnZXMobmV3IExpbmtlZEhhc2hNYXA8T2JqZWN0LFN0cmluZz4oKSwgdGhpcywgZWxlbWVudE9iaik7Ci0JCQotCQkvLyBsZXQgZXh0ZW5zaW9ucyBtb2RpZnkKLQkJTGlzdDxJTWV0aG9kRWxlbWVudEVkaXRvclBhZ2VQcm92aWRlckV4dGVuc2lvbj4gcGFnZVByb3ZpZGVycyA9IGdldEFsbFBhZ2VQcm92aWRlcnMoKTsKLQkJaWYgKHBhZ2VQcm92aWRlcnMgIT0gbnVsbCAmJiBwYWdlUHJvdmlkZXJzLnNpemUoKSA+IDApIHsKLQkJCWZvciAoSU1ldGhvZEVsZW1lbnRFZGl0b3JQYWdlUHJvdmlkZXJFeHRlbnNpb24gZXh0ZW5zaW9uIDogcGFnZVByb3ZpZGVycykgewotCQkJCXBhZ2VNYXAgPSBleHRlbnNpb24uZ2V0UGFnZXMocGFnZU1hcCwgdGhpcywgZWxlbWVudE9iaik7Ci0JCQl9Ci0JCX0KLQkJLy8gbm93IGFkZCBwYWdlcwotCQl0cnkgewotCQkJZm9yIChNYXAuRW50cnk8T2JqZWN0LCBTdHJpbmc+IHBhZ2VFbnRyeSA6IHBhZ2VNYXAuZW50cnlTZXQoKSkgewotCQkJCU9iamVjdCBwYWdlID0gcGFnZUVudHJ5LmdldEtleSgpOwotCQkJCVN0cmluZyBuYW1lID0gcGFnZUVudHJ5LmdldFZhbHVlKCk7Ci0JCQkJaW50IGluZGV4ID0gLTE7Ci0JCQkJaWYgKHBhZ2UgaW5zdGFuY2VvZiBDb250cm9sKSB7Ci0JCQkJCWluZGV4ID0gYWRkUGFnZSgoQ29udHJvbClwYWdlKTsKLQkJCQl9IGVsc2UgaWYgKHBhZ2UgaW5zdGFuY2VvZiBJRm9ybVBhZ2UpIHsKLQkJCQkJaW5kZXggPSBhZGRQYWdlKChJRm9ybVBhZ2UpcGFnZSk7Ci0JCQkJfSBlbHNlIGlmIChwYWdlIGluc3RhbmNlb2YgSUVkaXRvclBhcnQpIHsKLQkJCQkJaW5kZXggPSBhZGRQYWdlKChJRWRpdG9yUGFydClwYWdlLCBnZXRFZGl0b3JJbnB1dCgpKTsKLQkJCQl9Ci0JCQkJaWYgKG5hbWUgIT0gbnVsbCkgewotCQkJCQlzZXRQYWdlVGV4dChpbmRleCwgbmFtZSk7Ci0JCQkJfQotCQkJfQotCi0JCQlzZXRQYXJ0TmFtZShlbGVtZW50T2JqLmdldE5hbWUoKSk7Ci0KLQkJCWlmICghKGVsZW1lbnRPYmogaW5zdGFuY2VvZiBDb250ZW50UGFja2FnZSB8fCBlbGVtZW50T2JqIGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luKSkKLQkJCQljcmVhdGVQcmV2aWV3UGFnZSgpOwotCi0JCQotCQl9IGNhdGNoIChUaHJvd2FibGUgdCkgewotCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKHQpOwotCQkJZGlzcG9zZSgpOwotCQkJaWYodCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsKLQkJCQl0aHJvdyAoUnVudGltZUV4Y2VwdGlvbil0OwotCQkJfQotCQkJaWYodCBpbnN0YW5jZW9mIEVycm9yKSB7Ci0JCQkJdGhyb3cgKEVycm9yKSB0OwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuQWJzdHJhY3RCYXNlRm9ybUVkaXRvciNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQl0cnkgewotCQkJLy8gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLnJlbW92ZVJlc291cmNlQ2hhbmdlTGlzdGVuZXIoCi0JCQkvLyByZXNvdXJjZUNoYW5nZUxpc3RlbmVyKTsKLQotCQkJaWYgKGFjdGl2YXRpb25MaXN0ZW5lciAhPSBudWxsKSB7Ci0JCQkJYWN0aXZhdGlvbkxpc3RlbmVyLmRpc3Bvc2UoKTsKLQkJCX0KLQotCQkJbW9kaWZpZWRSaWNoVGV4dCA9IG51bGw7Ci0KLQkJCWRpc3Bvc2VFZGl0b3JFcnJvclRpY2tVcGRhdGVyKCk7Ci0JCQkKLQkJCUlMaWJyYXJ5TWFuYWdlciBtYW5hZ2VyID0gKElMaWJyYXJ5TWFuYWdlcikgTGlicmFyeVNlcnZpY2UKLQkJCQkJLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudExpYnJhcnlNYW5hZ2VyKCk7Ci0JCQlpZiAobWFuYWdlciAhPSBudWxsKSB7Ci0JCQkJbWFuYWdlci5zdG9wTGlzdGVuaW5nVG8oYWN0aW9uTWdyLmdldENvbW1hbmRTdGFjaygpKTsKLQkJCX0KLQotCQkJaWYgKGlzRGlydHkoKSkgewotCQkJCWFjdGlvbk1nci51bmRvQWxsKCk7Ci0JCQl9Ci0JCQlhY3Rpb25NZ3IuZGlzcG9zZSgpOwotCQkJZWxlbWVudE9iai5lQWRhcHRlcnMoKS5yZW1vdmUobmFtZUNoYW5nZWRMaXN0ZW5lcik7Ci0JCQkKLQkJCWlmKHJlc291cmNlSW5mb01hcCAhPSBudWxsKSB7Ci0JCQkJcmVzb3VyY2VJbmZvTWFwLmNsZWFyKCk7Ci0JCQkJcmVzb3VyY2VJbmZvTWFwID0gbnVsbDsJCQkJCi0JCQl9Ci0JCQkKLQkJCWlmKGNoYW5nZWRSZXNvdXJjZXMgIT0gbnVsbCkgewotCQkJCWNoYW5nZWRSZXNvdXJjZXMuY2xlYXIoKTsKLQkJCQljaGFuZ2VkUmVzb3VyY2VzID0gbnVsbDsKLQkJCX0KLQkJCQotCQkJaWYoc2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQkJc2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVycy5jbGVhcigpOwotCQkJCXNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcnMgPSBudWxsOwotCQkJfQotCQkJCi0JCQlpZihQZXJzcGVjdGl2ZVV0aWwuaXNBY3RpdmVQZXJzcGVjdGl2ZShBdXRob3JpbmdQZXJzcGVjdGl2ZS5QRVJTUEVDVElWRV9JRCkpIHsKLQkJCQkvLyB1bmxvYWQgYWxsIHJlc291cmNlcyBvZiBjb250ZW50IGRlc2NyaXB0aW9uIHRoYXQgYXJlIG5vdCB1c2VkIGJ5IAotCQkJfQotCQkJCi0JCQlpZihsYXN0VXNlZFJlc291cmNlcyAhPSBudWxsKSB7Ci0JCQkJbGFzdFVzZWRSZXNvdXJjZXMuY2xlYXIoKTsKLQkJCQlsYXN0VXNlZFJlc291cmNlcyA9IG51bGw7Ci0JCQl9CQkJCQkJIAotCQl9IGZpbmFsbHkgewotCQkJc3VwZXIuZGlzcG9zZSgpOwotCQkJZGlzcG9zZWQgPSB0cnVlOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZGlzcG9zZUVkaXRvckVycm9yVGlja1VwZGF0ZXIoKQotCXsKLQkJaWYgKCBmTWV0aG9kRWxlbWVudEVkaXRvckVycm9yVGlja1VwZGF0ZXIgIT0gbnVsbCApIHsKLQkJCWZNZXRob2RFbGVtZW50RWRpdG9yRXJyb3JUaWNrVXBkYXRlci5kaXNwb3NlKCk7Ci0JCQlmTWV0aG9kRWxlbWVudEVkaXRvckVycm9yVGlja1VwZGF0ZXIgPSBudWxsOwotCQl9Ci0JfQotCi0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuQWJzdHJhY3RCYXNlRm9ybUVkaXRvciNpc0RpcnR5KCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0RpcnR5KCkgewotCQlpZiAoZGlydHkpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJZGlydHkgPSBhY3Rpb25NZ3IuaXNTYXZlTmVlZGVkKCk7Ci0JCXJldHVybiBkaXJ0eTsKLQl9Ci0KLQlwdWJsaWMgRmFpbFNhZmVNZXRob2RMaWJyYXJ5UGVyc2lzdGVyIGdldFBlcnNpc3RlcigpIHsKLQkJaWYgKHBlcnNpc3RlciA9PSBudWxsKSB7Ci0JCQlwZXJzaXN0ZXIgPSBMaWJyYXJ5U2VydmljZVV0aWwuZ2V0Q3VycmVudFBlcnNpc3RlcigpLmdldEZhaWxTYWZlUGVyc2lzdGVyKCk7Ci0JCX0KLQkJcmV0dXJuIHBlcnNpc3RlcjsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29sbGVjdGlvbjxSZXNvdXJjZT4gZ2V0TW9kaWZpZWRSZXNvdXJjZXMoKSB7Ci0JCXJldHVybiBhY3Rpb25NZ3IuZ2V0TW9kaWZpZWRSZXNvdXJjZXMoKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgbW9kaWZpZWQgcmljaCB0ZXh0IGZpZWxkCi0JICogQHBhcmFtIG1vZGlmaWVkUmljaFRleHQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNb2RpZmllZFJpY2hUZXh0KElNZXRob2RSaWNoVGV4dCBtb2RpZmllZFJpY2hUZXh0KSB7Ci0JCXRoaXMubW9kaWZpZWRSaWNoVGV4dCA9IG1vZGlmaWVkUmljaFRleHQ7Ci0JfQotCi0JLyoqCi0JICogU2F2ZSBtb2RpZmllZCByaWNoIHRleHQgCi0JICogQHBhcmFtIHJpY2hUZXh0Ci0JICovCi0JcHVibGljIHZvaWQgc2F2ZU1vZGlmaWVkUmljaFRleHQoSU1ldGhvZFJpY2hUZXh0IHJpY2hUZXh0KSB7Ci0JCWlmIChyaWNoVGV4dCAhPSBudWxsICYmICFyaWNoVGV4dC5pc0Rpc3Bvc2VkKCkKLQkJCQkmJiByaWNoVGV4dC5nZXRNb2RpZmllZCgpKSB7Ci0JCQlFT2JqZWN0IG1vZGFsT2JqZWN0ID0gcmljaFRleHQuZ2V0TW9kYWxPYmplY3QoKTsKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBtb2RhbE9iamVjdEZlYXR1cmUgPSByaWNoVGV4dAotCQkJCQkuZ2V0TW9kYWxPYmplY3RGZWF0dXJlKCk7Ci0JCQlpZiAobW9kYWxPYmplY3QgIT0gbnVsbCAmJiBtb2RhbE9iamVjdEZlYXR1cmUgIT0gbnVsbCkgewotCQkJCU9iamVjdCBvbGRDb250ZW50ID0gbW9kYWxPYmplY3QuZUdldChtb2RhbE9iamVjdEZlYXR1cmUpOwotCQkJCWlmICghbXVzdFJlc3RvcmVWYWx1ZShyaWNoVGV4dCwgb2xkQ29udGVudCkpIHsKLQkJCQkJT2JqZWN0IG5ld0NvbnRlbnQgPSByaWNoVGV4dC5nZXRUZXh0KCk7Ci0JCQkJCXJpY2hUZXh0LnNldEluaXRpYWxUZXh0KChTdHJpbmcpbmV3Q29udGVudCk7Ci0JCQkJCWlmICghbmV3Q29udGVudC5lcXVhbHMob2xkQ29udGVudCkpIHsKLQkJCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5TRVQsIG1vZGFsT2JqZWN0LAotCQkJCQkJCQltb2RhbE9iamVjdEZlYXR1cmUsIG5ld0NvbnRlbnQsIC0xKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFNhdmUgbGFzdCBtb2RpZmllZCByaWNoIHRleHQgCi0JICovCi0JcHVibGljIHZvaWQgc2F2ZU1vZGlmaWVkUmljaFRleHQoKSB7Ci0JCXNhdmVNb2RpZmllZFJpY2hUZXh0KG1vZGlmaWVkUmljaFRleHQpOwotCX0KLQkKLQlwcm90ZWN0ZWQgTGlicmFyeVZhbGlkYXRlQWN0aW9uIGNyZWF0ZVZhbGlkYXRlUmVzb3VyY2VBY3Rpb24oKSB7Ci0JCXJldHVybiBuZXcgTGlicmFyeVZhbGlkYXRlQWN0aW9uKGZhbHNlKSB7Ci0JCQkvKiAobm9uLUphdmFkb2MpCi0JCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9ucy5MaWJyYXJ5VmFsaWRhdGVBY3Rpb24jcmVmcmVzaFZpZXdzKCkKLQkJCSAqLwotCQkJcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFZpZXdzKCkgewotCQkJCUxpYnJhcnlWaWV3LmdldFZpZXcoKS5yZWZyZXNoVmlld3MoKTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVSZXNvdXJjZXMoQ29sbGVjdGlvbiBtb2RpZmllZFJlc291cmNlcykgewotCQlBcnJheUxpc3Q8RU9iamVjdD4gZWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0PEVPYmplY3Q+KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IG1vZGlmaWVkUmVzb3VyY2VzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSAoUmVzb3VyY2UpIGl0ZXIubmV4dCgpOwotCQkJaWYgKHJlc291cmNlIGluc3RhbmNlb2YgTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsKSB7Ci0JCQkJZWxlbWVudHMuYWRkQWxsKHJlc291cmNlLmdldENvbnRlbnRzKCkpOwotCQkJfQotCQl9Ci0JCUxpYnJhcnlWYWxpZGF0ZUFjdGlvbiB2YWxpZGF0ZUFjdGlvbiA9IGNyZWF0ZVZhbGlkYXRlUmVzb3VyY2VBY3Rpb24oKTsKLQkJdmFsaWRhdGVBY3Rpb24udXBkYXRlU2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKGVsZW1lbnRzKSk7Ci0JCXZhbGlkYXRlQWN0aW9uLnJ1bigpOwotCQlyZXR1cm4gdmFsaWRhdGVBY3Rpb24uaXNTdWNjZXNzZnVsKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuQWJzdHJhY3RCYXNlRm9ybUVkaXRvciNkb1NhdmUob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHVibGljIHZvaWQgZG9TYXZlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlpZiAoREVCVUcpIHsKLQkJCVN5c3RlbS5vdXQKLQkJCQkJLnByaW50bG4oIk1ldGhvZEVsZW1lbnRFZGl0b3IuZG9TYXZlOiBzYXZpbmcgY2hhbmdlcyB0byBtZXRob2QgbGlicmFyeSIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlzYXZlTW9kaWZpZWRSaWNoVGV4dChtb2RpZmllZFJpY2hUZXh0KTsKLQotCQlnZXRQZXJzaXN0ZXIoKTsKLQkJdHJ5IHsKLQkJCS8vIGNoZWNrIGZvciBtb2RpZmlhYmxlCi0JCQkvLwotCQkJQ29sbGVjdGlvbjxSZXNvdXJjZT4gbW9kaWZpZWRSZXNvdXJjZXMgPSBnZXRNb2RpZmllZFJlc291cmNlcygpOwotCQkJCi0JCQlBcnJheUxpc3Q8UmVzb3VyY2U+IHJlc291cmNlc1RvU2F2ZSA9IG5ldyBBcnJheUxpc3Q8UmVzb3VyY2U+KG1vZGlmaWVkUmVzb3VyY2VzKTsKLQotCQkJLy8gdXBkYXRlIHZlcnNpb24gaW5mbyBpbiBsaWJyYXJ5IHJlc291cmNlIGlmIG5lZWRlZCBieSBhZGRpbmcKLQkJCS8vIGxpYnJhcnkgcmVzb3VyY2UgdG8gY29sbGVjdGlvbgotCQkJLy8gb2YgbW9kaWZpZWQgcmVzb3VyY2VzCi0JCQkvLwotCQkJSGFzaFNldDxSZXNvdXJjZT4gcmVzb3VyY2VzVG9VcGRhdGVWZXJzaW9uSW5mbyA9IG5ldyBIYXNoU2V0PFJlc291cmNlPigpOwotCQkJaWYgKCFtb2RpZmllZFJlc291cmNlcy5pc0VtcHR5KCkpIHsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBtb2RpZmllZFJlc291cmNlcy5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQlSZXNvdXJjZSByZXNvdXJjZSA9IChSZXNvdXJjZSkgaXRlci5uZXh0KCk7Ci0JCQkJCU1ldGhvZEVsZW1lbnQgbWUgPSBQZXJzaXN0ZW5jZVV0aWwKLQkJCQkJCQkuZ2V0TWV0aG9kRWxlbWVudChyZXNvdXJjZSk7Ci0JCQkJCWlmIChtZSAhPSBudWxsKSB7Ci0JCQkJCQlNZXRob2RMaWJyYXJ5IGxpYiA9IFVtYVV0aWwuZ2V0TWV0aG9kTGlicmFyeShtZSk7Ci0JCQkJCQlpZiAobGliICE9IG51bGwpIHsKLQkJCQkJCQlSZXNvdXJjZSBsaWJSZXNvdXJjZSA9IGxpYi5lUmVzb3VyY2UoKTsKLQkJCQkJCQlpZiAobGliUmVzb3VyY2UgIT0gbnVsbAotCQkJCQkJCQkJJiYgIW1vZGlmaWVkUmVzb3VyY2VzLmNvbnRhaW5zKGxpYlJlc291cmNlKQotCQkJCQkJCQkJJiYgIXJlc291cmNlc1RvVXBkYXRlVmVyc2lvbkluZm8KLQkJCQkJCQkJCQkJLmNvbnRhaW5zKGxpYlJlc291cmNlKQotCQkJCQkJCQkJJiYgUGVyc2lzdGVuY2VVdGlsCi0JCQkJCQkJCQkJCS5jaGVja1Rvb2xWZXJzaW9uKGxpYlJlc291cmNlKSAhPSAwKSB7Ci0JCQkJCQkJCXJlc291cmNlc1RvVXBkYXRlVmVyc2lvbkluZm8uYWRkKGxpYlJlc291cmNlKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJcmVzb3VyY2VzVG9TYXZlLmFkZEFsbChyZXNvdXJjZXNUb1VwZGF0ZVZlcnNpb25JbmZvKTsKLQkJCX0KLQotCQkJSVN0YXR1cyBzdGF0dXMgPSBVc2VySW50ZXJhY3Rpb25IZWxwZXIuY2hlY2tNb2RpZnkoCi0JCQkJCXJlc291cmNlc1RvU2F2ZSwgZ2V0U2l0ZSgpLmdldFNoZWxsKCkpOwotCQkJaWYgKCFzdGF0dXMuaXNPSygpKSB7Ci0JCQkJaGFuZGxlRXJyb3Ioc3RhdHVzKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0KLQkJCS8vIGNoZWNrIGZvciBvdXQtb2Ytc3luY2gKLQkJCS8vCi0JCQlpZiAoY2hlY2tGaWxlQ2hhbmdlZChyZXNvdXJjZXNUb1NhdmUpKSB7Ci0JCQkJU3RyaW5nIHRpdGxlID0gTGlicmFyeUVkaXRSZXNvdXJjZXMudXBkYXRlX291dG9mc3luY2hfdGl0bGU7Ci0JCQkJU3RyaW5nIG1zZyA9IExpYnJhcnlFZGl0UmVzb3VyY2VzLnVwZGF0ZV9vdXRvZnN5bmNoX21zZzsKLQkJCQlpZiAoIUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKQotCQkJCQkJLmRpc3BsYXlQcm9tcHQodGl0bGUsIG1zZykpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCX0KLQotCQkJLy8gZmxhZyB0aGUgcmVzb3VyY2VzIHRvIHVwZGF0ZSB2ZXJzaW9uIGluZm8gYXMgbW9kaWZpZWQgc28gdGhleQotCQkJLy8gd2lsbCBiZSBzYXZlZAotCQkJLy8KLQkJCWlmICghcmVzb3VyY2VzVG9VcGRhdGVWZXJzaW9uSW5mby5pc0VtcHR5KCkpIHsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSByZXNvdXJjZXNUb1VwZGF0ZVZlcnNpb25JbmZvLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCVJlc291cmNlIHJlc291cmNlID0gKFJlc291cmNlKSBpdGVyLm5leHQoKTsKLQkJCQkJcmVzb3VyY2Uuc2V0TW9kaWZpZWQodHJ1ZSk7Ci0JCQkJfQotCQkJfQotCQkJCi0JCQlpZihpc1ZhbGlkYXRlUmVzb3VyY2VzQmVmb3JlU2F2ZVJlcXVpcmVkKCkpIHsKLQkJCQkvLyB2YWxpZGF0ZQotCQkJCS8vCi0JCQkJaWYoIXZhbGlkYXRlUmVzb3VyY2VzKG1vZGlmaWVkUmVzb3VyY2VzKSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJLy8gbm8gdmFsaWRhdGlvbiBiZWZvcmUgc2F2ZQotCQkJCS8vIHJlbW92ZSBhbGwgdmFsaWRhdGlvbiBlcnJvcnMgbWFya2VycyBhc3NvY2lhdGVkIHdpdGggY3VycmVudCBtZXRob2QgZWxlbWVudAotCQkJCS8vCi0JCQkJaWYoTGlicmFyeVZhbGlkYXRpb25NYXJrZXJIZWxwZXIuSU5TVEFOQ0UuaGFzTWFya2VycyhlbGVtZW50T2JqKSkgewotCQkJCQlMaWJyYXJ5VmFsaWRhdGlvbk1hcmtlckhlbHBlci5JTlNUQU5DRS5kZWxldGVNYXJrZXJzKGVsZW1lbnRPYmopOwotCQkJCQkKLQkJCQkJLy8gcmVmcmVzaCBsaWJyYXJ5IHZpZXcKLQkJCQkJLy8KLQkJCQkJTGlicmFyeVZpZXcgdmlldyA9IExpYnJhcnlWaWV3LmdldFZpZXcoKTsKLQkJCQkJaWYodmlldyAhPSBudWxsKSB7Ci0JCQkJCQlNZXRob2RFbGVtZW50TGFiZWxEZWNvcmF0b3IuY2xlYXJEZWNvcmF0aW9uQ2FjaGUoKTsKLQkJCQkJCXZpZXcuZ2V0Vmlld2VyKCkucmVmcmVzaCgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQkKLQkJCS8vIFNhdmUuCi0JCQkvLwotCQkJT2JqZWN0IG9sZFZhbHVlID0gcGVyc2lzdGVyLmdldFNhdmVPcHRpb25zKCkuZ2V0KAotCQkJCQlJTGlicmFyeVBlcnNpc3Rlci5GYWlsU2FmZU1ldGhvZExpYnJhcnlQZXJzaXN0ZXIuT1BUSU9OU19PVkVSV1JJVEFCTEVfUkVTT1VSQ0VTKTsgCi0KLQkJCUNvbGxlY3Rpb248UmVzb3VyY2U+IHJlc291cmNlc1RvQWRqdXN0TG9jYXRpb24gPSBudWxsOwotCQkJCi0JCQl0cnkgewotCQkJCXBlcnNpc3Rlci5nZXRTYXZlT3B0aW9ucygpLnB1dCgKLQkJCQkJCUlMaWJyYXJ5UGVyc2lzdGVyLkZhaWxTYWZlTWV0aG9kTGlicmFyeVBlcnNpc3Rlci5PUFRJT05TX09WRVJXUklUQUJMRV9SRVNPVVJDRVMsIAotCQkJCQkJZ2V0T3ZlcndyaXRhYmxlUmVzb3VyY2VzKCkpOwotCQkJCi0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gcmVzb3VyY2VzVG9TYXZlLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQlSZXNvdXJjZSByZXNvdXJjZSA9IChSZXNvdXJjZSkgaXRlci5uZXh0KCk7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlwZXJzaXN0ZXIuc2F2ZShyZXNvdXJjZSk7Ci0JCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlTdHJpbmcgdGl0bGUgPSBBdXRob3JpbmdVSVJlc291cmNlcy5lZGl0b3JzX01ldGhvZEVsZW1lbnRFZGl0b3Jfc2F2ZUVycm9yVGl0bGU7IAotCQkJCQkJU3RyaW5nIG1zZyA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmVkaXRvcnNfTWV0aG9kRWxlbWVudEVkaXRvcl9zYXZlRXJyb3JNZXNzYWdlMTsgCi0JCQkJCQlTdHJpbmcgcmVhc29uID0gZS5nZXRNZXNzYWdlKCkgPT0gbnVsbCA/IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmVkaXRvcnNfTWV0aG9kRWxlbWVudEVkaXRvcl9zYXZlRXJyb3JSZWFzb24xCi0JCQkJCQkJCTogZS5nZXRNZXNzYWdlKCk7IAotCQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpLmRpc3BsYXlFcnJvcigKLQkJCQkJCQkJdGl0bGUsIG1zZywgcmVhc29uLCBlKTsKLQkJCQkJCXRocm93IGU7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQl0cnkgewotCQkJCQlwZXJzaXN0ZXIuY29tbWl0KCk7Ci0JCQkJCWRpcnR5ID0gZmFsc2U7Ci0JCQkJCWFjdGlvbk1nci5zYXZlSXNEb25lKCk7Ci0JCQkJCWNoYW5nZVRpbWUgPSAtMTsKLQkJCQkJcmVzb3VyY2VzVG9BZGp1c3RMb2NhdGlvbiA9IGdldFJlc291cmNlVG9BZGp1c3RMb2NhdGlvbigpOwkKLQkJCQkJc2V0UmVzb3VyY2VJbmZvcyhnZXRVc2VkUmVzb3VyY2VzKCkpOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCVN0cmluZyByZWFzb24gPSBlLmdldE1lc3NhZ2UoKTsKLQkJCQkJaWYgKFN0clV0aWwuaXNCbGFuayhyZWFzb24pKSB7Ci0JCQkJCQlyZWFzb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy5lZGl0b3JzX01ldGhvZEVsZW1lbnRFZGl0b3Jfc2F2ZUVycm9yUmVhc29uMjsgCi0JCQkJCX0KLQkJCQkJU3RyaW5nV3JpdGVyIGRldGFpbHMgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0JCQkJCWUucHJpbnRTdGFja1RyYWNlKG5ldyBQcmludFdyaXRlcihkZXRhaWxzKSk7Ci0JCQkJCVN0cmluZyB0aXRsZSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmVkaXRvcnNfTWV0aG9kRWxlbWVudEVkaXRvcl9zYXZlRXJyb3JUaXRsZTsgCi0JCQkJCVN0cmluZyBtZXNzYWdlID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZWRpdG9yc19NZXRob2RFbGVtZW50RWRpdG9yX3NhdmVFcnJvck1lc3NhZ2UyOyAKLQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpLmRpc3BsYXlFcnJvcigKLQkJCQkJCQl0aXRsZSwgbWVzc2FnZSwgcmVhc29uLCBkZXRhaWxzLnRvU3RyaW5nKCksIGUpOwotCQkJCQl0aHJvdyBlOwotCQkJCX0KLQkJCX0KLQkJCWZpbmFsbHkgewotCQkJCXBlcnNpc3Rlci5nZXRTYXZlT3B0aW9ucygpLnB1dCgKLQkJCQkJCUlMaWJyYXJ5UGVyc2lzdGVyLkZhaWxTYWZlTWV0aG9kTGlicmFyeVBlcnNpc3Rlci5PUFRJT05TX09WRVJXUklUQUJMRV9SRVNPVVJDRVMsCi0JCQkJCQlvbGRWYWx1ZSk7Ci0JCQl9Ci0KLQkJCS8vIFJlbmFtZQotCQkJLy8KLQkJCS8vQ29sbGVjdGlvbjxSZXNvdXJjZT4gcmVzb3VyY2VzVG9BZGp1c3RMb2NhdGlvbiA9IGdldFJlc291cmNlVG9BZGp1c3RMb2NhdGlvbigpOwkJCQkJCQotCQkJaWYgKHJlc291cmNlc1RvQWRqdXN0TG9jYXRpb24gIT0gbnVsbCAmJiAhcmVzb3VyY2VzVG9BZGp1c3RMb2NhdGlvbi5pc0VtcHR5KCkpIHsKLQkJCQl0cnkgewotCQkJCQlwZXJzaXN0ZXIuYWRqdXN0TG9jYXRpb24ocmVzb3VyY2VzVG9BZGp1c3RMb2NhdGlvbik7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJU3RyaW5nIHRpdGxlID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZWRpdG9yc19NZXRob2RFbGVtZW50RWRpdG9yX3JlbmFtZUVycm9yVGl0bGU7IAotCQkJCQlTdHJpbmcgdGVtcGxhdGUgPSBBdXRob3JpbmdVSVJlc291cmNlcy5lZGl0b3JzX01ldGhvZEVsZW1lbnRFZGl0b3JfcmVuYW1lRXJyb3JNZXNzYWdlMTsgCi0JCQkJCVN0cmluZ0J1ZmZlciBmaWxlTGlzdCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gcmVzb3VyY2VzVG9BZGp1c3RMb2NhdGlvbi5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCVJlc291cmNlIHJlc291cmNlID0gKFJlc291cmNlKSBpdGVyLm5leHQoKTsKLQkJCQkJCU9iamVjdCBvYmogPSBGaWxlTWFuYWdlci50b0ZpbGVTdHJpbmcocmVzb3VyY2UuZ2V0VVJJKCkpOwotCQkJCQkJaWYob2JqID09IG51bGwpIHsKLQkJCQkJCQlvYmogPSByZXNvdXJjZTsKLQkJCQkJCX0KLQkJCQkJCWZpbGVMaXN0LmFwcGVuZChvYmopLmFwcGVuZCgiLCAiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJCVN0cmluZyBtc2cgPSBNZXNzYWdlRm9ybWF0LmZvcm1hdCh0ZW1wbGF0ZSwKLQkJCQkJCQluZXcgT2JqZWN0W10geyBmaWxlTGlzdCB9KTsKLQkJCQkJU3RyaW5nIHJlYXNvbiA9IGUuZ2V0TWVzc2FnZSgpID09IG51bGwgPyBBdXRob3JpbmdVSVJlc291cmNlcy5lZGl0b3JzX01ldGhvZEVsZW1lbnRFZGl0b3Jfc2F2ZUVycm9yUmVhc29uMQotCQkJCQkJCTogZS5nZXRNZXNzYWdlKCk7IAotCQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkuZGlzcGxheUVycm9yKAotCQkJCQkJCXRpdGxlLCBtc2csIHJlYXNvbiwgZSk7Ci0JCQkJCXRocm93IGU7Ci0JCQkJfQotCi0JCQkJdHJ5IHsKLQkJCQkJcGVyc2lzdGVyLmNvbW1pdCgpOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCVN0cmluZyByZWFzb24gPSBlLmdldE1lc3NhZ2UoKTsKLQkJCQkJaWYgKFN0clV0aWwuaXNCbGFuayhyZWFzb24pKSB7Ci0JCQkJCQlyZWFzb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy5lZGl0b3JzX01ldGhvZEVsZW1lbnRFZGl0b3Jfc2F2ZUVycm9yUmVhc29uMjsgCi0JCQkJCX0KLQkJCQkJU3RyaW5nV3JpdGVyIGRldGFpbHMgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0JCQkJCWUucHJpbnRTdGFja1RyYWNlKG5ldyBQcmludFdyaXRlcihkZXRhaWxzKSk7Ci0JCQkJCVN0cmluZyB0aXRsZSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmVkaXRvcnNfTWV0aG9kRWxlbWVudEVkaXRvcl9yZW5hbWVFcnJvclRpdGxlOyAKLQkJCQkJU3RyaW5nIG1lc3NhZ2UgPSBBdXRob3JpbmdVSVJlc291cmNlcy5lZGl0b3JzX01ldGhvZEVsZW1lbnRFZGl0b3Jfc2F2ZUVycm9yTWVzc2FnZTI7IAotCQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkuZGlzcGxheUVycm9yKAotCQkJCQkJCXRpdGxlLCBtZXNzYWdlLCByZWFzb24sIGRldGFpbHMudG9TdHJpbmcoKSwgZSk7Ci0JCQkJCXRocm93IGU7Ci0JCQkJfQotCi0JCQkJcmVzb3VyY2VzVG9BZGp1c3RMb2NhdGlvbi5jbGVhcigpOwotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJdHJ5IHsKLQkJCQlwZXJzaXN0ZXIucm9sbGJhY2soKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihleCk7Ci0JCQkJVmlld0hlbHBlci5yZWxvYWRDdXJyZW50TGliYXJ5T25Sb2xsYmFja0Vycm9yKGdldFNpdGUoKQotCQkJCQkJLmdldFNoZWxsKCkpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uPFJlc291cmNlPiBnZXRPdmVyd3JpdGFibGVSZXNvdXJjZXMoKSB7Ci0JCWlmKHJlc291cmNlSW5mb01hcCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQkJfQotCQlBcnJheUxpc3Q8UmVzb3VyY2U+IHJlc291cmNlcyA9IG5ldyBBcnJheUxpc3Q8UmVzb3VyY2U+KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHJlc291cmNlSW5mb01hcC52YWx1ZXMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCVJlc291cmNlSW5mbyBpbmZvID0gKFJlc291cmNlSW5mbykgaXRlci5uZXh0KCk7Ci0JCQlpZihpbmZvLm92ZXJ3cml0ZSkgewotCQkJCXJlc291cmNlcy5hZGQoaW5mby5yZXNvdXJjZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc291cmNlczsKLQl9Ci0KLQlwcml2YXRlIENvbGxlY3Rpb248UmVzb3VyY2U+IGdldFJlc291cmNlVG9BZGp1c3RMb2NhdGlvbigpIHsKLQkJaWYocmVzb3VyY2VJbmZvTWFwID09IG51bGwpIHsKLQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCQl9Ci0JCUFycmF5TGlzdDxSZXNvdXJjZT4gcmVzb3VyY2VzID0gbmV3IEFycmF5TGlzdDxSZXNvdXJjZT4oKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gcmVzb3VyY2VJbmZvTWFwLnZhbHVlcygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJUmVzb3VyY2VJbmZvIGluZm8gPSAoUmVzb3VyY2VJbmZvKSBpdGVyLm5leHQoKTsKLQkJCWlmKGluZm8uYWRqdXN0TG9jYXRpb24pIHsKLQkJCQlyZXNvdXJjZXMuYWRkKGluZm8ucmVzb3VyY2UpOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXNvdXJjZXM7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzVmFsaWRhdGVSZXNvdXJjZXNCZWZvcmVTYXZlUmVxdWlyZWQoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzYXZlUmVzb3VyY2UoUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJaWYgKHJlc291cmNlICE9IG51bGwgJiYgcmVzb3VyY2UuaXNNb2RpZmllZCgpKSB7Ci0JCQl0cnkgewotCQkJCWdldFBlcnNpc3RlcigpLnNhdmUocmVzb3VyY2UpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlTdHJpbmcgdGl0bGUgPSBBdXRob3JpbmdVSVJlc291cmNlcy5lZGl0b3JzX01ldGhvZEVsZW1lbnRFZGl0b3Jfc2F2ZUVycm9yVGl0bGU7IAotCQkJCVN0cmluZyB0ZW1wbGF0ZSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmVkaXRvcnNfTWV0aG9kRWxlbWVudEVkaXRvcl9zYXZlRXJyb3JNZXNzYWdlMTsgCi0JCQkJU3RyaW5nIG1zZyA9IE1lc3NhZ2VGb3JtYXQuZm9ybWF0KHRlbXBsYXRlLAotCQkJCQkJbmV3IE9iamVjdFtdIHsgcmVzb3VyY2UuZ2V0VVJJKCkudG9GaWxlU3RyaW5nKCkgfSk7Ci0JCQkJU3RyaW5nIHJlYXNvbiA9IGUuZ2V0TWVzc2FnZSgpID09IG51bGwgPyBBdXRob3JpbmdVSVJlc291cmNlcy5lZGl0b3JzX01ldGhvZEVsZW1lbnRFZGl0b3Jfc2F2ZUVycm9yUmVhc29uMQotCQkJCQkJOiBlLmdldE1lc3NhZ2UoKTsgCi0JCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpLmRpc3BsYXlFcnJvcigKLQkJCQkJCXRpdGxlLCBtc2csIHJlYXNvbiwgZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVQcmV2aWV3UGFnZSgpIHsKLQkJQ29tcG9zaXRlIHBhcmVudCA9IGdldENvbnRhaW5lcigpOwotCQlDb21wb3NpdGUgcHJldmlld0NvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCXByZXZpZXdDb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCi0JCVByZXZpZXdQYWdlIHBhZ2UgPSBuZXcgUHJldmlld1BhZ2UocHJldmlld0NvbXBvc2l0ZSk7Ci0JCXByZXZpZXdlciA9IHBhZ2UuZ2V0UHJldmlld1ZpZXdlcigpOwotCi0JCXByZXZpZXdfcGFnZV9pbmRleCA9IGFkZFBhZ2UocHJldmlld0NvbXBvc2l0ZSk7Ci0JCXNldFBhZ2VUZXh0KHByZXZpZXdfcGFnZV9pbmRleCwgQXV0aG9yaW5nVUlSZXNvdXJjZXMucHJldmlld1BhZ2VfdGl0bGUpOyAKLQl9Ci0KLQkvKioKLQkgKiBPdmVycmlkZSB0aGlzIG1ldGhvZCB0byBsaXN0ZW4gdG8gdGhlIHRhYiBjaGFuZ2UuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcGFnZUNoYW5nZShpbnQgbmV3UGFnZUluZGV4KSB7Ci0JCXN1cGVyLnBhZ2VDaGFuZ2UobmV3UGFnZUluZGV4KTsKLQotCQlpZiAocHJldmlld19wYWdlX2luZGV4ID09IG5ld1BhZ2VJbmRleCAmJiBwcmV2aWV3ZXIgIT0gbnVsbCkgewotCQkJLy8gVXNlIHRoZSBkZWZhdWx0IGxheW91dCBtYW5hZ2VyLgotCQkJLy9wcmV2aWV3ZXIuc2V0TGF5b3V0TWFuYWdlcihudWxsKTsKLQkJCXByZXZpZXdlci5zaG93RWxlbWVudENvbnRlbnQoZWxlbWVudE9iaik7Ci0JCX0KLQkJT2JqZWN0IHBhZ2UgPSBwYWdlcy5nZXQobmV3UGFnZUluZGV4KTsKLQkJaWYgKHBhZ2UgaW5zdGFuY2VvZiBNdWx0aVBhZ2VFZGl0b3JQYXJ0KSB7Ci0JCQlJVmlld1BhcnQgcHJvcGVydGllc1ZpZXcgPSBnZXRFZGl0b3JTaXRlKCkuZ2V0UGFnZSgpLmZpbmRWaWV3KCJvcmcuZWNsaXBzZS51aS52aWV3cy5Qcm9wZXJ0eVNoZWV0Iik7IC8vJE5PTi1OTFMtMSQKLQkJCWlmIChwcm9wZXJ0aWVzVmlldyBpbnN0YW5jZW9mIFByb3BlcnR5U2hlZXQpIHsKLQkJCQkoKFByb3BlcnR5U2hlZXQpcHJvcGVydGllc1ZpZXcpLnBhcnRBY3RpdmF0ZWQodGhpcyk7Ci0JCQl9Ci0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHNldERpcnR5KCkgewotCQlkaXJ0eSA9IHRydWU7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZShQUk9QX0RJUlRZKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXN0b3JlIHZhbHVlIG9mIHRoZSBjb250cm9sCi0JICogQHBhcmFtIGNvbnRyb2wKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiBAcmV0dXJuCi0JICogCQlib29sZWFuIHZhbHVlIHRvIGluZGljYXRlIHdoZXRoZXIgY29udHJvbCB3YXMgcmVzdG9yZWQgb3Igbm90Ci0JICovCi0JcHVibGljIGJvb2xlYW4gbXVzdFJlc3RvcmVWYWx1ZShPYmplY3QgY29udHJvbCwgT2JqZWN0IHZhbHVlKSB7Ci0JCWlmICh3aWRnZXRUb0NoZWNrID09IGNvbnRyb2wpIHsKLQkJCS8vIHRoZSBjb250cm9sIGlzIGN1cnJlbnRseSBiZWluZyBjaGVja2VkIGZvciBlZGl0YWJsZSwgYnV0IHRoZXJlIGlzCi0JCQkvLyBzdGlsbCBmb2N1cyBsb3N0Ci0JCQkvLyBldmVudCBpcyBiZWluZyBzZW50IG91dCBldmVuIHRoZSBjaGVjayBpcyBub3QgY29tcGxldGVkIHlldC4KLQkJCS8vIHJldHVybiB0cnVlIHNvIHRoZSBmb2N1c0xvc3QoKSB3aWxsIG5vdCBtYWtlIGFueSBjaGFuZ2UgdG8gdGhlCi0JCQkvLyBjb250cm9sLgotCQkJLy8KLQkJCXJldHVybiB0cnVlOwotCQl9Ci0KLQkJT2JqZWN0IGVkaXRDb250cm9sID0gY29udHJvbDsKLQkJaWYgKGVkaXRDb250cm9sIGluc3RhbmNlb2YgTWV0aG9kUmljaFRleHRFZGl0b3IpIHsKLQkJCWVkaXRDb250cm9sID0gKChNZXRob2RSaWNoVGV4dEVkaXRvcikgY29udHJvbCkuZ2V0UmljaFRleHRDb250cm9sKCk7Ci0JCX0KLQkJYm9vbGVhbiByZXN0b3JlID0gd2lkZ2V0c1RvUmVzdG9yZVZhbHVlLmNvbnRhaW5zKGVkaXRDb250cm9sKTsKLQkJaWYgKCFyZXN0b3JlKSB7Ci0JCQlzeW5jaHJvbml6ZWQgKHdpZGdldHNUb1Jlc3RvcmVWYWx1ZSkgewotCQkJCXJlc3RvcmUgPSB3aWRnZXRzVG9SZXN0b3JlVmFsdWUuY29udGFpbnMoZWRpdENvbnRyb2wpOwotCQkJfQotCQl9Ci0JCWlmIChyZXN0b3JlKSB7Ci0JCQlpZiAoZWRpdENvbnRyb2wgaW5zdGFuY2VvZiBUZXh0KSB7Ci0JCQkJVGV4dCB0ZXh0ID0gKChUZXh0KSBlZGl0Q29udHJvbCk7Ci0JCQkJdGV4dC5zZXRUZXh0KChTdHJpbmcpIHZhbHVlKTsKLQkJCX0gZWxzZSBpZiAoZWRpdENvbnRyb2wgaW5zdGFuY2VvZiBJTWV0aG9kUmljaFRleHQpIHsKLQkJCQlJTWV0aG9kUmljaFRleHQgcmljaFRleHQgPSAoSU1ldGhvZFJpY2hUZXh0KSBlZGl0Q29udHJvbDsKLQkJCQlyaWNoVGV4dC5zZXRUZXh0KChTdHJpbmcpIHZhbHVlKTsKLQkJCX0KLQkJCXdpZGdldHNUb1Jlc3RvcmVWYWx1ZS5yZW1vdmUoZWRpdENvbnRyb2wpOwotCQl9Ci0JCXJldHVybiByZXN0b3JlOwotCX0KLQotCS8qKgotCSAqIE1vZGlmeSBMaXN0ZW5lciAKLQkgKgotCSAqLwotCXB1YmxpYyBjbGFzcyBNb2RpZnlMaXN0ZW5lciBpbXBsZW1lbnRzCi0JCQlvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyIHsKLQotCQlwcml2YXRlIEVPYmplY3QgZWxlbWVudDsKLQotCQlwcml2YXRlIGJvb2xlYW4gY2hlY2tDb250YWluZXJSZXNvdXJjZTsKLQotCQlwcml2YXRlIGJvb2xlYW4gZGlzYWJsZWQgPSBmYWxzZTsKLQotCQkvKioKLQkJICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkJICovCi0JCXB1YmxpYyBNb2RpZnlMaXN0ZW5lcihFT2JqZWN0IGVsZW1lbnQsIGJvb2xlYW4gY2hlY2tDb250YWluZXIpIHsKLQkJCXN1cGVyKCk7Ci0JCQljaGVja0NvbnRhaW5lclJlc291cmNlID0gY2hlY2tDb250YWluZXI7Ci0JCQl0aGlzLmVsZW1lbnQgPSBlbGVtZW50OwotCQl9Ci0KLQkJcHJpdmF0ZSB2b2lkIHJlc3RvcmVUZXh0KE9iamVjdCBjb250cm9sLCBTdHJpbmcgdHh0KSB7Ci0JCQlib29sZWFuIG9sZCA9IGRpc2FibGVkOwotCQkJdHJ5IHsKLQkJCQlkaXNhYmxlZCA9IHRydWU7Ci0JCQkJT2JqZWN0IGVkaXRDb250cm9sID0gY29udHJvbDsKLQkJCQlpZiAoZWRpdENvbnRyb2wgaW5zdGFuY2VvZiBNZXRob2RSaWNoVGV4dEVkaXRvcikgewotCQkJCQllZGl0Q29udHJvbCA9ICgoTWV0aG9kUmljaFRleHRFZGl0b3IpIGNvbnRyb2wpCi0JCQkJCQkJLmdldFJpY2hUZXh0Q29udHJvbCgpOwotCQkJCX0KLQkJCQlpZiAoZWRpdENvbnRyb2wgaW5zdGFuY2VvZiBUZXh0KSB7Ci0JCQkJCVRleHQgdGV4dCA9ICgoVGV4dCkgZWRpdENvbnRyb2wpOwotCQkJCQl0ZXh0LnNldFRleHQodHh0KTsKLQkJCQl9IGVsc2UgaWYgKGVkaXRDb250cm9sIGluc3RhbmNlb2YgSU1ldGhvZFJpY2hUZXh0KSB7Ci0JCQkJCUlNZXRob2RSaWNoVGV4dCByaWNoVGV4dCA9IChJTWV0aG9kUmljaFRleHQpIGVkaXRDb250cm9sOwotCQkJCQlyaWNoVGV4dC5zZXRUZXh0KHR4dCk7Ci0JCQkJfQotCQkJfSBmaW5hbGx5IHsKLQkJCQlkaXNhYmxlZCA9IG9sZDsKLQkJCX0KLQkJfQotCi0JCXByaXZhdGUgYm9vbGVhbiBjaGVja0VkaXQoRU9iamVjdCBlbGVtZW50LCBPYmplY3QgY29udHJvbCwKLQkJCQlib29sZWFuIGNoZWNrQ29udGFpbmVyUmVzb3VyY2UpIHsKLQkJCS8vIGtlZXAgYSByZWZlcmVuY2UgdG8gdGhlIGN1cnJlbnQgd2lkZ2V0IHNvIG11c3RSZXN0b3JlVmFsdWUoKSBjYW4KLQkJCS8vIHVzZSBpdCB0byBjaGVjawotCQkJLy8gd2hldGhlciBhIGZvY3VzIGxvc3QgZXZlbnQgaXMgdHJpZ2dlcmVkIGR1cmluZyBhIGNoZWNrRWRpdC4KLQkJCS8vIG11c3RSZXN0b3JlVmFsdWUoKSB0aGVuCi0JCQkvLyByZXR1cm5zIHRydWUgc28gZm9jdXNMb3N0KCkgd2lsbCBub3QgdHJ5IHRvIG1ha2UgY2hhbmdlIHRvIHRoZQotCQkJLy8gdmFsdWUgYm91bmQgdG8gdGhlIHdpZGdldAotCQkJLy8KLQkJCXdpZGdldFRvQ2hlY2sgPSBjb250cm9sOwotCQkJdHJ5IHsKLQkJCQlpZiAoREVCVUcpIHsKLQkJCQkJU3lzdGVtLm91dAotCQkJCQkJCS5wcmludGxuKCJNZXRob2RFbGVtZW50RWRpdG9yLmNoZWNrRWRpdDogZW50ZXIsIGNvbnRyb2w9IiArIGNvbnRyb2wpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJCUlTdGF0dXMgc3RhdHVzID0gbnVsbDsKLQkJCQlpZiAod2lkZ2V0c1RvUmVzdG9yZVZhbHVlLmNvbnRhaW5zKGNvbnRyb2wpKSB7Ci0JCQkJCWlmIChERUJVRykgewotCQkJCQkJU3lzdGVtLm91dAotCQkJCQkJCQkucHJpbnRsbigiTWV0aG9kRWxlbWVudEVkaXRvci5jaGVja0VkaXQ6IHdpZGdldCBmb3VuZCBpbiB3aWRnZXRzVG9SZXN0b3JlVmFsdWUsIGV4aXQiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0KLQkJCQlzeW5jaHJvbml6ZWQgKHdpZGdldHNUb1Jlc3RvcmVWYWx1ZSkgewotCQkJCQlpZiAod2lkZ2V0c1RvUmVzdG9yZVZhbHVlLmNvbnRhaW5zKGNvbnRyb2wpKSB7Ci0JCQkJCQlpZiAoREVCVUcpIHsKLQkJCQkJCQlTeXN0ZW0ub3V0Ci0JCQkJCQkJCQkucHJpbnRsbigiTWV0aG9kRWxlbWVudEVkaXRvci5jaGVja0VkaXQ6IHdpZGdldCBmb3VuZCBpbiB3aWRnZXRzVG9SZXN0b3JlVmFsdWUsIGV4aXQiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJfQotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQl9Ci0KLQkJCQkJc3RhdHVzID0gVG5nVXRpbC5jaGVja0VkaXQoZWxlbWVudCwgZ2V0U2l0ZSgpLmdldFNoZWxsKCkpOwotCi0JCQkJCWlmICghc3RhdHVzLmlzT0soKSkgewotCQkJCQkJaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBJUmljaFRleHQpIHsKLQkJCQkJCQkoKElSaWNoVGV4dCkgY29udHJvbCkucmVzdG9yZVRleHQoKTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJaWYgKGNvbnRyb2wgPT0gY3VycmVudEZlYXR1cmVFZGl0b3IpIHsKLQkJCQkJCQkJcmVzdG9yZVRleHQoY29udHJvbCwgKFN0cmluZykgZWxlbWVudAotCQkJCQkJCQkJCS5lR2V0KGN1cnJlbnRFZGl0ZWRGZWF0dXJlKSk7Ci0JCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJLy8gQWRkIHRoZSBjb250cm9sIHRvIHRoZSBsaXN0IG9mIHdpZGdldHMgd2hvc2UKLQkJCQkJCQkJLy8gdmFsdWUgbmVlZHMKLQkJCQkJCQkJLy8gdG8gYmUgcmVzdG9yZWQgdG8gdGhlIG9yaWdpbmFsIG9uZS4uCi0JCQkJCQkJCXdpZGdldHNUb1Jlc3RvcmVWYWx1ZS5hZGQoY29udHJvbCk7Ci0JCQkJCQkJCWlmIChERUJVRykgewotCQkJCQkJCQkJU3lzdGVtLm91dAotCQkJCQkJCQkJCQkucHJpbnRsbigiTWV0aG9kRWxlbWVudEVkaXRvci5jaGVja0VkaXQ6IGFkZGVkIHdpZGdldCB0byB3aWRnZXRzVG9SZXN0b3JlVmFsdWUiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9IGVsc2UgaWYgKGNoZWNrQ29udGFpbmVyUmVzb3VyY2UpIHsKLQkJCQkJCWlmIChlbGVtZW50LmVDb250YWluZXIoKSAhPSBudWxsCi0JCQkJCQkJCSYmIGVsZW1lbnQuZUNvbnRhaW5lcigpLmVSZXNvdXJjZSgpICE9IGVsZW1lbnQKLQkJCQkJCQkJCQkuZVJlc291cmNlKCkpIHsKLQkJCQkJCQlzdGF0dXMgPSBUbmdVdGlsLmNoZWNrRWRpdChlbGVtZW50LmVDb250YWluZXIoKSwKLQkJCQkJCQkJCWdldFNpdGUoKS5nZXRTaGVsbCgpKTsKLQkJCQkJCQlpZiAoIXN0YXR1cy5pc09LKCkpIHsKLQkJCQkJCQkJLy8gLy8gQWRkIHRoZSBjb250cm9sIHRvIHRoZSBsaXN0IG9mIHdpZGdldHMKLQkJCQkJCQkJLy8gd2hvc2UgdmFsdWUKLQkJCQkJCQkJLy8gLy8gbmVlZHMgdG8gYmUgcmVzdG9yZWQgdG8gdGhlIG9yaWdpbmFsIG9uZS4KLQkJCQkJCQkJLy8gaWYgKGRlYnVnKSB7Ci0JCQkJCQkJCS8vIFN5c3RlbS5vdXQKLQkJCQkJCQkJLy8gLnByaW50bG4oIk1ldGhvZEVsZW1lbnRFZGl0b3IuY2hlY2tFZGl0OgotCQkJCQkJCQkvLyBhZGRlZCB3aWRnZXQgdG8gd2lkZ2V0c1RvUmVzdG9yZVZhbHVlIik7Ci0JCQkJCQkJCS8vIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJLy8gfQotCQkJCQkJCQlpZiAoY29udHJvbCBpbnN0YW5jZW9mIElSaWNoVGV4dCkgewotCQkJCQkJCQkJKChJUmljaFRleHQpIGNvbnRyb2wpLnJlc3RvcmVUZXh0KCk7Ci0JCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCQlpZiAoY29udHJvbCA9PSBjdXJyZW50RmVhdHVyZUVkaXRvcikgewotCQkJCQkJCQkJCXJlc3RvcmVUZXh0KGNvbnRyb2wsIChTdHJpbmcpIGVsZW1lbnQKLQkJCQkJCQkJCQkJCS5lR2V0KGN1cnJlbnRFZGl0ZWRGZWF0dXJlKSk7Ci0JCQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQkJCXdpZGdldHNUb1Jlc3RvcmVWYWx1ZS5hZGQoY29udHJvbCk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQlpZiAoc3RhdHVzICE9IG51bGwgJiYgIXN0YXR1cy5pc09LKCkpIHsKLQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpLmRpc3BsYXlFcnJvcigKLQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5lZGl0RGlhbG9nX3RpdGxlLCAKLQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5lZGl0RGlhbG9nX21zZ0Nhbm5vdEVkaXQsIAotCQkJCQkJCXN0YXR1cyk7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0KLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0gZmluYWxseSB7Ci0JCQkJLy8gY2xlYXIgdGhlIHJlZmVyZW5jZSB3aGVuIHRoZSBjaGVjayBpcyBkb25lCi0JCQkJLy8KLQkJCQl3aWRnZXRUb0NoZWNrID0gbnVsbDsKLQkJCX0KLQkJfQotCi0JCS8qKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXIjbW9kaWZ5VGV4dChNb2RpZnlFdmVudCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotCQkJaWYgKERFQlVHKSB7Ci0JCQkJU3lzdGVtLm91dAotCQkJCQkJLnByaW50bG4oIk1ldGhvZEVsZW1lbnRFZGl0b3IuTW9kaWZ5TGlzdGVuZXIubW9kaWZ5VGV4dDogZW50ZXIsIGRpc2FibGVkPSIgKyBkaXNhYmxlZCk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWlmICghZGlzYWJsZWQgJiYgZWxlbWVudCAhPSBudWxsKSB7Ci0JCQkJaWYgKGUud2lkZ2V0ID09IG51bGwpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQotCQkJCU9iamVjdCB3aWRnZXQgPSBlLndpZGdldDsKLQkJCQlpZiAod2lkZ2V0IGluc3RhbmNlb2YgQnJvd3NlcikgewotCQkJCQl3aWRnZXQgPSAoKEJyb3dzZXIpIHdpZGdldCkKLQkJCQkJCQkuZ2V0RGF0YShJTWV0aG9kUmljaFRleHQuUFJPUEVSVFlfTkFNRSk7Ci0JCQkJCWlmICh3aWRnZXQgPT0gbnVsbCkgewotCQkJCQkJd2lkZ2V0ID0gZS53aWRnZXQ7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKERFQlVHKSB7Ci0JCQkJCVN5c3RlbS5vdXQKLQkJCQkJCQkucHJpbnRsbigiTWV0aG9kRWxlbWVudEVkaXRvci5Nb2RpZnlMaXN0ZW5lci5tb2RpZnlUZXh0OiB3aWRnZXQ9IiArIHdpZGdldCk7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0KLQkJCQlpZiAod2lkZ2V0c1RvUmVzdG9yZVZhbHVlLmNvbnRhaW5zKHdpZGdldCkpIHsKLQkJCQkJaWYgKERFQlVHKSB7Ci0JCQkJCQlTeXN0ZW0ub3V0Ci0JCQkJCQkJCS5wcmludGxuKCJNZXRob2RFbGVtZW50RWRpdG9yLk1vZGlmeUxpc3RlbmVyLm1vZGlmeVRleHQ6IHdpZGdldCBmb3VuZCBpbiB3aWRnZXRzVG9SZXN0b3JlVmFsdWUsIGV4aXQiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0KLQkJCQlpZiAoIWNoZWNrRWRpdChlbGVtZW50LCB3aWRnZXQsIGNoZWNrQ29udGFpbmVyUmVzb3VyY2UpKSB7Ci0JCQkJCWlmIChERUJVRykgewotCQkJCQkJU3lzdGVtLm91dAotCQkJCQkJCQkucHJpbnRsbigiTWV0aG9kRWxlbWVudEVkaXRvci5Nb2RpZnlMaXN0ZW5lci5tb2RpZnlUZXh0OiBjaGVja0VkaXQgZmFpbGVkLCBleGl0Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCQlyZXR1cm47Ci0JCQkJfQotCi0JCQkJaWYgKHdpZGdldCBpbnN0YW5jZW9mIElNZXRob2RSaWNoVGV4dCkgewotCQkJCQlJTWV0aG9kUmljaFRleHQgcmljaFRleHQgPSAoSU1ldGhvZFJpY2hUZXh0KSB3aWRnZXQ7Ci0JCQkJCXNldE1vZGlmaWVkUmljaFRleHQocmljaFRleHQpOwotCQkJCQlpZiAoREVCVUcpIHsKLQkJCQkJCVN5c3RlbS5vdXQKLQkJCQkJCQkJLnByaW50bG4oIk1ldGhvZEVsZW1lbnRFZGl0b3IuTW9kaWZ5TGlzdGVuZXIubW9kaWZ5VGV4dDogYWRkaW5nIHRvIG1vZGlmaWVkUmljaFRleHRzIGxpc3QiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJfQotCi0JCQkJaWYgKERFQlVHKSB7Ci0JCQkJCVN5c3RlbS5vdXQKLQkJCQkJCQkucHJpbnRsbigiTWV0aG9kRWxlbWVudEVkaXRvci5Nb2RpZnlMaXN0ZW5lci5tb2RpZnlUZXh0OiBtYXJraW5nIGVkaXRvciBhcyBkaXJ0eSIpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJCXNldERpcnR5KCk7Ci0JCQl9Ci0KLQkJCWlmIChERUJVRykgewotCQkJCVN5c3RlbS5vdXQKLQkJCQkJCS5wcmludGxuKCJNZXRob2RFbGVtZW50RWRpdG9yLk1vZGlmeUxpc3RlbmVyLm1vZGlmeVRleHQ6IGV4aXQiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0KLQkJLyoqCi0JCSAqIFNldHMgdGhlIHVuZGVybHlpbmcgbW9kZWwgZWxlbWVudC4KLQkJICogCi0JCSAqIEBwYXJhbSBlbGVtZW50Ci0JCSAqICAgICAgICAgICAgQSBtZXRob2QgZWxlbWVudC4KLQkJICovCi0JCXB1YmxpYyB2b2lkIHNldEVsZW1lbnQoRU9iamVjdCBlbGVtZW50KSB7Ci0JCQl0aGlzLmVsZW1lbnQgPSBlbGVtZW50OwotCQl9Ci0KLQkJLyoqCi0JCSAqIFNldHMgdGhlIGRpc2FibGUgZmxhZy4KLQkJICogCi0JCSAqIEBwYXJhbSBkaXNhYmxlZAotCQkgKiAgICAgICAgICAgIElmIDxjb2RlPnRydWU8L2NvZGU+LCBpZ25vcmUgdGhlIG1vZGlmeSBldmVudHMuCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBzZXREaXNhYmxlKGJvb2xlYW4gZGlzYWJsZWQpIHsKLQkJCXRoaXMuZGlzYWJsZWQgPSBkaXNhYmxlZDsKLQkJfQotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gbmV3IGluc3RhbmNlIG9mIE1vZGlmeUxpc3RlbmVyIHRoYXQgc3VwcG9ydHMgdGVhbSBhbmQgQ00KLQkgKiBpbnRlZ3JhdGlvbiBBbnkgY29udHJvbCBpbiB0aGUgZWRpdG9yLCBpZiBpdCBuZWVkcyBhIE1vZGlmeUxpc3RlbmVyLCBtdXN0Ci0JICogdXNlIG9uZSBjcmVhdGVkIGJ5IHRoaXMgbWV0aG9kCi0JICogCi0JICogQHBhcmFtIGVPYmoKLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIE1vZGlmeUxpc3RlbmVyIGNyZWF0ZU1vZGlmeUxpc3RlbmVyKEVPYmplY3QgZU9iaikgewotCQlyZXR1cm4gY3JlYXRlTW9kaWZ5TGlzdGVuZXIoZU9iaiwgZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gbmV3IGluc3RhbmNlIG9mIE1vZGlmeUxpc3RlbmVyIHRoYXQgc3VwcG9ydHMgdGVhbSBhbmQgQ00KLQkgKiBpbnRlZ3JhdGlvbiBBbnkgY29udHJvbCBpbiB0aGUgZWRpdG9yLCBpZiBpdCBuZWVkcyBhIE1vZGlmeUxpc3RlbmVyLCBtdXN0Ci0JICogdXNlIG9uZSBjcmVhdGVkIGJ5IHRoaXMgbWV0aG9kCi0JICogCi0JICogQHBhcmFtIGVPYmoKLQkgKiBAcGFyYW0gY2hlY2tDb250YWluZXIKLQkgKiAgICAgICAgICAgIGlmIHRydWUgd2lsbCBjaGVjayB0aGUgY29udGFpbmVyIG9mIHRoZSBnaXZlbiBvYmplY3QgZm9yCi0JICogICAgICAgICAgICBlZGl0YWJsZSBhcyB3ZWxsIHdoZW4gY2hlY2tpbmcgdGhlIGdpdmVuIG9iamVjdCBmb3IgZWRpdGFibGUKLQkgKiAKLQkgKiBAcmV0dXJuCi0JICogCQlNb2RpZnkgTGlzdGVuZXIKLQkgKi8KLQlwdWJsaWMgTW9kaWZ5TGlzdGVuZXIgY3JlYXRlTW9kaWZ5TGlzdGVuZXIoRU9iamVjdCBlT2JqLAotCQkJYm9vbGVhbiBjaGVja0NvbnRhaW5lcikgewotCQlyZXR1cm4gbmV3IE1vZGlmeUxpc3RlbmVyKGVPYmosIGNoZWNrQ29udGFpbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBzcGVjaWZpZWQgY29udHJvbCB0byBiZSB0aGUgY3VycmVudCBlZGl0b3Igb2YgdGhlIHNwZWNpZmllZAotCSAqIGZlYXR1cmUuCi0JICogCi0JICogQHBhcmFtIGNvbnRyb2wKLQkgKiBAcGFyYW0gZmVhdHVyZQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEN1cnJlbnRGZWF0dXJlRWRpdG9yKE9iamVjdCBjb250cm9sLAotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUpIHsKLQkJY3VycmVudEZlYXR1cmVFZGl0b3IgPSBjb250cm9sOwotCQljdXJyZW50RWRpdGVkRmVhdHVyZSA9IGZlYXR1cmU7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgbW9uaXRvckNoYW5nZSgpIHsKLQkJSUV4dGVuc2lvblJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKTsKLQkJSUV4dGVuc2lvblBvaW50IHBvaW50ID0gcmVnaXN0cnkKLQkJCQkuZ2V0RXh0ZW5zaW9uUG9pbnQoIm9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnJlZnJlc2hQcm92aWRlcnMiKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAocG9pbnQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJSUV4dGVuc2lvbltdIGV4dGVuc2lvbnMgPSBwb2ludC5nZXRFeHRlbnNpb25zKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZXh0ZW5zaW9ucy5sZW5ndGg7IGkrKykgewotCQkJSUV4dGVuc2lvbiBleHRlbnNpb24gPSBleHRlbnNpb25zW2ldOwotCQkJaWYgKERFQlVHKSB7Ci0JCQkJU3lzdGVtLm91dAotCQkJCQkJLnByaW50bG4oImV4dGVuc2lvbjogVUlEPSIgKyBleHRlbnNpb24uZ2V0VW5pcXVlSWRlbnRpZmllcigpICsgIiwgIiArIGV4dGVuc2lvbik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJfQotCQl9Ci0JfQotCQotCXByaXZhdGUgTWFwPFJlc291cmNlLCBSZXNvdXJjZUluZm8+IGdldFJlc291cmNlSW5mb01hcCgpIHsKLQkJaWYocmVzb3VyY2VJbmZvTWFwID09IG51bGwpIHsKLQkJCXJlc291cmNlSW5mb01hcCA9IG5ldyBIYXNoTWFwPFJlc291cmNlLCBSZXNvdXJjZUluZm8+KCk7Ci0JCX0KLQkJcmV0dXJuIHJlc291cmNlSW5mb01hcDsKLQl9Ci0KLQkvKioKLQkgKiBBZGQgcmVzb3VyY2UgdG8gYWRqdXN0IGxvY2F0aW9uCi0JICogQHBhcmFtIHJlc291cmNlCi0JICovCi0JcHVibGljIHZvaWQgYWRkUmVzb3VyY2VUb0FkanVzdExvY2F0aW9uKFJlc291cmNlIHJlc291cmNlKSB7Ci0JCVJlc291cmNlSW5mbyBpbmZvID0gZ2V0UmVzb3VyY2VJbmZvTWFwKCkuZ2V0KHJlc291cmNlKTsKLQkJaWYoaW5mbyA9PSBudWxsKSB7Ci0JCQlpbmZvID0gbmV3IFJlc291cmNlSW5mbyhyZXNvdXJjZSk7Ci0JCQlnZXRSZXNvdXJjZUluZm9NYXAoKS5wdXQocmVzb3VyY2UsIGluZm8pOwotCQl9Ci0JCWluZm8uYWRqdXN0TG9jYXRpb24gPSB0cnVlOwotCX0KLQotCXByb3RlY3RlZCBMaXN0IGdldFVzZWRGZWF0dXJlcygpIHsKLQkJcmV0dXJuIGVsZW1lbnRPYmouZUNsYXNzKCkuZ2V0RUFsbFN0cnVjdHVyYWxGZWF0dXJlcygpOwotCX0KLQotCS8qKgotCSAqIEdldHMgcmVzb3VyY2VzIHRoYXQgYXJlIGN1cnJlbnRseSBiZWluZyB1c2VkIGJ5IHRoaXMgZWRpdG9ycwotCSAqIAotCSAqIEByZXR1cm4KLQkgKiAJCWxpc3Qgb2YgdXNlZCByZXNvdXJjZXMKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbjxSZXNvdXJjZT4gZ2V0VXNlZFJlc291cmNlcygpIHsKLQkJSGFzaFNldDxSZXNvdXJjZT4gcmVzb3VyY2VzID0gbmV3IEhhc2hTZXQ8UmVzb3VyY2U+KCk7Ci0JCVJlc291cmNlIHJlc291cmNlID0gZWxlbWVudE9iai5lUmVzb3VyY2UoKTsKLQkJaWYgKHJlc291cmNlICE9IG51bGwpIHsKLQkJCXJlc291cmNlcy5hZGQocmVzb3VyY2UpOwotCQl9Ci0JCUxpc3QgYWxsRmVhdHVyZXMgPSBnZXRVc2VkRmVhdHVyZXMoKTsKLQkJZm9yIChpbnQgaSA9IGFsbEZlYXR1cmVzLnNpemUoKSAtIDE7IGkgPiAtMTsgaS0tKSB7Ci0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IChFU3RydWN0dXJhbEZlYXR1cmUpIGFsbEZlYXR1cmVzCi0JCQkJCS5nZXQoaSk7Ci0JCQlpZiAoZmVhdHVyZS5pc01hbnkoKSkgewotCQkJCUxpc3QgdmFsdWVzID0gKExpc3QpIGVsZW1lbnRPYmouZUdldChmZWF0dXJlKTsKLQkJCQlmb3IgKGludCBqID0gdmFsdWVzLnNpemUoKSAtIDE7IGogPiAtMTsgai0tKSB7Ci0JCQkJCUVPYmplY3QgdmFsdWUgPSAoRU9iamVjdCkgdmFsdWVzLmdldChqKTsKLQkJCQkJaWYgKHZhbHVlLmVSZXNvdXJjZSgpICE9IG51bGwpIHsKLQkJCQkJCXJlc291cmNlcy5hZGQodmFsdWUuZVJlc291cmNlKCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlPYmplY3QgdmFsdWUgPSBlbGVtZW50T2JqLmVHZXQoZmVhdHVyZSk7Ci0JCQkJaWYgKHZhbHVlIGluc3RhbmNlb2YgRU9iamVjdAotCQkJCQkJJiYgKHJlc291cmNlID0gKChFT2JqZWN0KSB2YWx1ZSkuZVJlc291cmNlKCkpICE9IG51bGwpIHsKLQkJCQkJcmVzb3VyY2VzLmFkZChyZXNvdXJjZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWxhc3RVc2VkUmVzb3VyY2VzID0gcmVzb3VyY2VzOwotCQlyZXR1cm4gcmVzb3VyY2VzOwotCX0KLQotCXByaXZhdGUgTWFwIGdldFVSSVRvVXNlZFJlc291cmNlTWFwKCkgewotCQlIYXNoTWFwPFVSSSwgUmVzb3VyY2U+IG1hcCA9IG5ldyBIYXNoTWFwPFVSSSwgUmVzb3VyY2U+KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGdldFVzZWRSZXNvdXJjZXMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCVJlc291cmNlIHJlc291cmNlID0gKFJlc291cmNlKSBpdGVyLm5leHQoKTsKLQkJCW1hcC5wdXQocmVzb3VyY2UuZ2V0VVJJKCksIHJlc291cmNlKTsKLQkJfQotCQlyZXR1cm4gbWFwOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGhhbmRsZUVycm9yKElTdGF0dXMgc3RhdHVzKSB7Ci0JCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKS5kaXNwbGF5KAotCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLmVycm9yRGlhbG9nX3RpdGxlLCAKLQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5lZGl0RGlhbG9nX21zZ0Nhbm5vdEVkaXQsIAotCQkJCXN0YXR1cyk7Ci0JfQotCi0JLyoqCi0JICogSGFuZGxlcyB0aGUgYWN0aXZhdGlvbiBvZiB0aGlzIHZpZXcuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlQWN0aXZhdGUoSVdvcmtiZW5jaFBhcnQgcGFydCkgewotCQkvLyBUT0RPOiBSZXZpZXcgaW1wbGVtZW50YXRpb24uCi0JCS8vIE1ha2Ugc3VyZSB0aGF0IHRoZSBtZXRob2QgbGlicmFyeSBvcGVuIGlzIG5vdCBjbG9zZWQuCi0JCVhNSUxpYnJhcnlVdGlsLm9wZW5NZXRob2RMaWJyYXJ5UHJvamVjdChMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCksIGdldEVkaXRvclNpdGUoKS5nZXRBY3Rpb25CYXJzKCkKLQkJCQkuZ2V0U3RhdHVzTGluZU1hbmFnZXIoKS5nZXRQcm9ncmVzc01vbml0b3IoKSk7Ci0KLQkJaWYgKGNoZWNrRmlsZUNoYW5nZWRSZXF1aXJlZCkgewotCQkJQ29sbGVjdGlvbjxSZXNvdXJjZT4gdXNlZFJlc291cmNlcyA9IGdldFVzZWRSZXNvdXJjZXMoKTsKLQkJCWlmIChjaGVja0ZpbGVDaGFuZ2VkKHVzZWRSZXNvdXJjZXMpKSB7Ci0JCQkJaGFuZGxlRmlsZUNoYW5nZWQodXNlZFJlc291cmNlcyk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBEaXNwbGF5cyBhIGRpYWxvZyB0aGF0IGFza3MgaWYgY29uZmxpY3RpbmcgY2hhbmdlcyBzaG91bGQgYmUgZGlzY2FyZGVkLgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGhhbmRsZURpcnR5Q29uZmxpY3QoKSB7Ci0JCVN0cmluZyB0aXRsZSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLl9VSV9GaWxlQ29uZmxpY3RfbGFiZWw7Ci0JCVN0cmluZyBtc2cgPSBBdXRob3JpbmdVSVJlc291cmNlcy5fV0FSTl9GaWxlQ29uZmxpY3Q7Ci0JCXJldHVybiBBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkuZGlzcGxheVByb21wdCgKLQkJCQl0aXRsZSwgbXNnKTsKLQl9Ci0KLQkvKioKLQkgKiBIYW5kbGVzIGNoYW5nZWQgcmVzb3VyY2VzIHdoZW4gdGhpcyB2aWV3IGlzIGFjdGl2YXRlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVDaGFuZ2VkUmVzb3VyY2VzKCkgewotCQlpZiAoKGVsZW1lbnRPYmouZUlzUHJveHkoKSB8fCAhY2hhbmdlZFJlc291cmNlcy5pc0VtcHR5KCkpCi0JCQkJJiYgKCFpc0RpcnR5KCkgfHwgaGFuZGxlRGlydHlDb25mbGljdCgpKSkgewotCQkJLy8gZWRpdGluZ0RvbWFpbi5nZXRDb21tYW5kU3RhY2soKS5mbHVzaCgpOwotCi0JCQkvLyBmb3IgKEl0ZXJhdG9yIGkgPSBjaGFuZ2VkUmVzb3VyY2VzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgewotCQkJLy8gUmVzb3VyY2UgcmVzb3VyY2UgPSAoUmVzb3VyY2UpIGkubmV4dCgpOwotCQkJLy8gaWYgKHJlc291cmNlLmlzTG9hZGVkKCkpIHsKLQkJCS8vIGlmKHJlc291cmNlIGluc3RhbmNlb2YgTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsKSB7Ci0JCQkvLyB0cnkgewotCQkJLy8gKChNdWx0aUZpbGVYTUlSZXNvdXJjZUltcGwpcmVzb3VyY2UpLnJlbG9hZChudWxsKTsKLQkJCS8vIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCS8vIEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCS8vIH0KLQkJCS8vIH0KLQkJCS8vIGVsc2UgewotCQkJLy8gcmVzb3VyY2UudW5sb2FkKCk7Ci0JCQkvLyB0cnkgewotCQkJLy8gcmVzb3VyY2UubG9hZChDb2xsZWN0aW9ucy5FTVBUWV9NQVApOwotCQkJLy8gfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJLy8gQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJLy8gfQotCQkJLy8gfQotCQkJLy8gfQotCQkJLy8gfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQ2hlY2tzIHdoZXRoZXIgaW5wdXQgaXMgdmFsaWQgb3Igbm90Ci0JICogQHJldHVybiBib29sZWFuIHZhbHVlCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNJbnB1dFZhbGlkKCkgewotCQlpZiAoZWxlbWVudE9iaiAhPSBudWxsICYmIGVsZW1lbnRPYmouZUlzUHJveHkoKSkgewotCQkJRU9iamVjdCBlID0gUmVmcmVzaEpvYi5nZXRJbnN0YW5jZSgpLnJlc29sdmUoZWxlbWVudE9iaik7Ci0JCQlyZXR1cm4gKGUgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50ICYmICFlLmVJc1Byb3h5KCkgJiYgVW1hVXRpbAotCQkJCQkuZ2V0TWV0aG9kTGlicmFyeShlKSA9PSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJCS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpKTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVQYWdlcygpIHsKLQkJd2hpbGUgKGdldFBhZ2VDb3VudCgpID4gMCkgewotCQkJcmVtb3ZlUGFnZSgwKTsKLQkJfQotCQlhZGRQYWdlcygpOwotCX0KLQotCXByb3RlY3RlZCBJRWRpdG9ySW5wdXQgY3JlYXRlSW5wdXQoTWV0aG9kRWxlbWVudCBlKSB7Ci0JCXJldHVybiBuZXcgTWV0aG9kRWxlbWVudEVkaXRvcklucHV0KGUpOwotCX0KLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCByZWZyZXNoKGZpbmFsIGJvb2xlYW4gZm9yY2UpIHsKLQkJQnVzeUluZGljYXRvci5zaG93V2hpbGUoZ2V0U2l0ZSgpLmdldFNoZWxsKCkuZ2V0RGlzcGxheSgpLAotCQkJCW5ldyBSdW5uYWJsZSgpIHsKLQotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQlDb2xsZWN0aW9uPFJlc291cmNlPiB1c2VkUmVzb3VyY2VzID0gbGFzdFVzZWRSZXNvdXJjZXM7Ci0JCQkJCQlpZiAoIWZvcmNlICYmICFlbGVtZW50T2JqLmVJc1Byb3h5KCkKLQkJCQkJCQkJJiYgIWNoZWNrUmVsb2FkZWQodXNlZFJlc291cmNlcykpIHsKLQkJCQkJCQkvLyBubyByZXNvdXJjZSByZWxvYWRlZCwgbm8gbmVlZCB0byByZWZyZXNoCi0JCQkJCQkJLy8KLQkJCQkJCQlyZXR1cm47Ci0JCQkJCQl9Ci0JCQkJCQlpbnQgYWN0aXZlUGFnZUluZGV4ID0gZ2V0QWN0aXZlUGFnZSgpOwotCQkJCQkJbW9kaWZpZWRSaWNoVGV4dCA9IG51bGw7Ci0JCQkJCQlpZiAoaXNEaXJ0eSgpKSB7Ci0JCQkJCQkJYWN0aW9uTWdyLnVuZG9BbGwoKTsKLQkJCQkJCQlkaXJ0eSA9IGZhbHNlOwotCQkJCQkJfQotCQkJCQkJaWYgKGVsZW1lbnRPYmouZUlzUHJveHkoKSkgewotCQkJCQkJCWVsZW1lbnRPYmouZUFkYXB0ZXJzKCkucmVtb3ZlKG5hbWVDaGFuZ2VkTGlzdGVuZXIpOwotCQkJCQkJCUVPYmplY3QgZSA9IFJlZnJlc2hKb2IuZ2V0SW5zdGFuY2UoKS5yZXNvbHZlKAotCQkJCQkJCQkJZWxlbWVudE9iaik7Ci0JCQkJCQkJaWYgKGUgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50Ci0JCQkJCQkJCQkmJiAhZS5lSXNQcm94eSgpCi0JCQkJCQkJCQkmJiBVbWFVdGlsLmdldE1ldGhvZExpYnJhcnkoZSkgPT0gTGlicmFyeVNlcnZpY2UKLQkJCQkJCQkJCQkJLmdldEluc3RhbmNlKCkKLQkJCQkJCQkJCQkJLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCkpIHsKLQkJCQkJCQkJc2V0SW5wdXQoY3JlYXRlSW5wdXQoKE1ldGhvZEVsZW1lbnQpIGUpKTsKLQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQkvLyBpbnB1dCBlbGVtZW50IGlzIGludmFsaWQsIGNsb3NlIHRoZSBlZGl0b3IKLQkJCQkJCQkJLy8KLQkJCQkJCQkJY2xvc2UoZmFsc2UpOwotCQkJCQkJCQlyZXR1cm47Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJc2V0UmVzb3VyY2VJbmZvcyh1c2VkUmVzb3VyY2VzKTsKLQkJCQkJCXVwZGF0ZVBhZ2VzKCk7Ci0JCQkJCQlpZiAoYWN0aXZlUGFnZUluZGV4ICE9IC0xKSB7Ci0JCQkJCQkJc2V0QWN0aXZlUGFnZShhY3RpdmVQYWdlSW5kZXgpOwotCQkJCQkJfQotCQkJCQkJZmlyZVByb3BlcnR5Q2hhbmdlKElFZGl0b3JQYXJ0LlBST1BfRElSVFkpOwotCQkJCQl9Ci0KLQkJCQl9KTsKLQotCX0KLQotCS8qKgotCSAqIFJlZnJlc2hlcyB0aGUgZWRpdG9yCi0JICovCi0JcHVibGljIHZvaWQgcmVmcmVzaCgpIHsKLQkJcmVmcmVzaChSZWZyZXNoSm9iLmdldEluc3RhbmNlKCkuZ2V0Q2hhbmdlZFJlc291cmNlcygpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaChDb2xsZWN0aW9uPFJlc291cmNlPiBjaGFuZ2VkUmVzb3VyY2VzKSB7Ci0JCS8vIHNhdmUgY2hhbmdlZCByZXNvdXJjZXMgYmVmb3JlIHJlZnJlc2ggc28gYWN0aW9uIG1hbmFnZXIgd2lsbCBub3QgdHJ5Ci0JCS8vIHRvIHNhdmUgdGhlc2UgY2hhbmdlZCByZXNvdXJjZXMKLQkJLy8KLQkJdGhpcy5jaGFuZ2VkUmVzb3VyY2VzLmFkZEFsbChjaGFuZ2VkUmVzb3VyY2VzKTsKLQkJcmVmcmVzaChmYWxzZSk7Ci0JCXRoaXMuY2hhbmdlZFJlc291cmNlcy5jbGVhcigpOwkJCi0JfQotCi0KLQkvKioKLQkgKiBQdWJsaWMgbWV0aG9kIHRvIHJlZnJlc2ggZWRpdG9yIHRpdGxlIGltYWdlIG9uIGNlcnRhaW4gYWN0aW9uLgotCSAqIGUuZy4gSWYgbWV0aG9kUGx1Z2luIGlzIGxvY2tlZCwgZWRpdG9yIHRpdGxlIGltYWdlIHNob3VsZCBiZSBncmV5LWVkIG91dC4KLQkgKiAKLQkgKiBAcGFyYW0gbWV0aG9kRWxlbWVudAotCSAqLwotCXB1YmxpYyB2b2lkIHJlZnJlc2hUaXRsZUltYWdlKCkgewotCQlpZiAoZk1ldGhvZEVsZW1lbnRFZGl0b3JFcnJvclRpY2tVcGRhdGVyICE9IG51bGwpCi0JCQlmTWV0aG9kRWxlbWVudEVkaXRvckVycm9yVGlja1VwZGF0ZXIudXBkYXRlRWRpdG9ySW1hZ2UoZWxlbWVudE9iaik7Ci0JfQotCi0JcHVibGljIHZvaWQgdXBkYXRlZFRpdGxlSW1hZ2UoSW1hZ2UgaW1hZ2UpIHsKLQkJc2V0VGl0bGVJbWFnZShpbWFnZSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGdvdG9NYXJrZXIoSU1hcmtlciBtYXJrZXIpIHsKLQkJaWYobWFya2VyLmdldFJlc291cmNlKCkgPT0gZWxlbWVudEZpbGUpIHsKLQkJCXRyeSB7Ci0JCQkJT2JqZWN0IHZhbCA9IG1hcmtlci5nZXRBdHRyaWJ1dGUoTGlicmFyeVZhbGlkYXRpb25NYXJrZXJIZWxwZXIuR1VJRCk7Ci0JCQkJaWYodmFsIGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0JCQkJCVN0cmluZyBndWlkID0gKFN0cmluZykgdmFsOwotCQkJCQlNZXRob2RFbGVtZW50IGUgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRMaWJyYXJ5TWFuYWdlcigpLmdldE1ldGhvZEVsZW1lbnQoZ3VpZCk7Ci0JCQkJCWlmKGUgIT0gZWxlbWVudE9iaikgewotCQkJCQkJLy8gd3JvbmcgZWxlbWVudCBpcyBvcGVuZWQgYmVjYXVzZSBlbGVtZW50IGZyb20gdGhlCi0JCQkJCQkvLyBtYXJrZXIgaXMgbm90IHRoZSB0b3AgZWxlbWVudCBpbiBpdHMgcmVzb3VyY2UKLQkJCQkJCS8vIGNsb3NlIHRoaXMgZWRpdG9yIGFuZCBvcGVuIHRoZSByaWdodCBvbmUKLQkJCQkJCS8vCi0JCQkJCQljbG9zZShmYWxzZSk7Ci0JCQkJCQlJRWRpdG9yS2VlcGVyLlJFRkVSRU5DRS5nZXRFZGl0b3JLZWVwZXIoKS5vcGVuRWRpdG9yKGUpOwotCQkJCQkJcmV0dXJuOwotCQkJCQl9Ci0JCQkJfQotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0KLQkJCX0KLQkJfQotCQkKLQkJLy8gb3BlbiBkZXNjcmlwdGlvbiBwYWdlCi0JCXNldEFjdGl2ZVBhZ2UoMCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNEaXNwb3NlZCgpIHsKLQkJcmV0dXJuIGRpc3Bvc2VkOwotCX0KLQotCXB1YmxpYyBFZGl0aW5nRG9tYWluIGdldEVkaXRpbmdEb21haW4oKSB7Ci0JCXJldHVybiBlZGl0aW5nRG9tYWluOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2VkaXRvcnMvTWV0aG9kRWxlbWVudEVkaXRvcklucHV0LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2VkaXRvcnMvTWV0aG9kRWxlbWVudEVkaXRvcklucHV0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxOTUyZjEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9lZGl0b3JzL01ldGhvZEVsZW1lbnRFZGl0b3JJbnB1dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9yczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuSU1ldGhvZEVsZW1lbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JUGVyc2lzdGFibGVFbGVtZW50OwotCi0KLS8qKgotICogQW4gZWRpdG9yIGlucHV0IGZvciBtZXRob2QgZWxlbWVudCBlZGl0b3IKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXRob2RFbGVtZW50RWRpdG9ySW5wdXQgaW1wbGVtZW50cyBJRWRpdG9ySW5wdXQsIElNZXRob2RFbGVtZW50UHJvdmlkZXIgewotCi0JcHJpdmF0ZSBNZXRob2RFbGVtZW50IG1ldGhvZEVsZW1lbnQ7Ci0KLQlwcml2YXRlIEltYWdlRGVzY3JpcHRvciBpbWFnZURlc2NyaXB0b3IgPSBudWxsOwotCi0JLy8gdGhlIGN1cnJlbnQgb2JqZWN0IGJlaW5nIGVkaXRlZCBieSB0aGUgUlRFCi0JcHJpdmF0ZSBFT2JqZWN0IGZNb2RhbE9iamVjdDsKLQotCS8vIHRoZSBjdXJyZW50IGZlYXR1cmUgYmVpbmcgZWRpdGVkIGJ5IHRoZSBSVEUKLQlwcml2YXRlIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmTW9kYWxPYmplY3RGZWF0dXJlOwotCi0JcHVibGljIE1ldGhvZEVsZW1lbnRFZGl0b3JJbnB1dChNZXRob2RFbGVtZW50IGUpIHsKLQkJbWV0aG9kRWxlbWVudCA9IGU7Ci0JfQotCi0JcHVibGljIE1ldGhvZEVsZW1lbnQgZ2V0TWV0aG9kRWxlbWVudCgpIHsKLQkJcmV0dXJuIG1ldGhvZEVsZW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQjZXhpc3RzKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBleGlzdHMoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dCNnZXRJbWFnZURlc2NyaXB0b3IoKQotCSAqLwotCXB1YmxpYyBJbWFnZURlc2NyaXB0b3IgZ2V0SW1hZ2VEZXNjcmlwdG9yKCkgewotCQlyZXR1cm4gaW1hZ2VEZXNjcmlwdG9yOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0I2dldE5hbWUoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIG1ldGhvZEVsZW1lbnQuZ2V0TmFtZSgpOwotCX0KLQkKLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIE5hbWUgb2YgbWV0aG9kIGVsZW1lbnQgKyAiLiIgKyBuYW1lIG9mIGZlYXR1cmUgYmVpbmcgZWRpdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRGdWxsTmFtZSgpIHsKLQkJU3RyaW5nIHJlc3VsdCA9IGdldE5hbWUoKTsKLQkJaWYgKGZNb2RhbE9iamVjdEZlYXR1cmUgIT0gbnVsbCkgewotCQkJcmVzdWx0ICs9ICIuIjsJLy8kTk9OLU5MUy0xJAotCQkJcmVzdWx0ICs9IGZNb2RhbE9iamVjdEZlYXR1cmUuZ2V0TmFtZSgpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQjZ2V0UGVyc2lzdGFibGUoKQotCSAqLwotCXB1YmxpYyBJUGVyc2lzdGFibGVFbGVtZW50IGdldFBlcnNpc3RhYmxlKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dCNnZXRUb29sVGlwVGV4dCgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUb29sVGlwVGV4dCgpIHsKLQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZSNnZXRBZGFwdGVyKGphdmEubGFuZy5DbGFzcykKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgYWRhcHRlcikgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjZXF1YWxzKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLQkJaWYgKHRoaXMgPT0gb2JqKQotCQkJcmV0dXJuIHRydWU7Ci0JCWlmIChnZXRDbGFzcygpLmlzSW5zdGFuY2Uob2JqKSkgewotCQkJcmV0dXJuIG1ldGhvZEVsZW1lbnQgPT0gKChNZXRob2RFbGVtZW50RWRpdG9ySW5wdXQpIG9iaikuZ2V0TWV0aG9kRWxlbWVudCgpICYmCi0JCQlmTW9kYWxPYmplY3QgPT0gKChNZXRob2RFbGVtZW50RWRpdG9ySW5wdXQpIG9iaikuZ2V0TW9kYWxPYmplY3QoKSAmJgotCQkJZk1vZGFsT2JqZWN0RmVhdHVyZSA9PSAoKE1ldGhvZEVsZW1lbnRFZGl0b3JJbnB1dCkgb2JqKS5nZXRNb2RhbE9iamVjdEZlYXR1cmUoKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0JCWludCByZXN1bHQgPSBtZXRob2RFbGVtZW50Lmhhc2hDb2RlKCk7Ci0JCWlmIChmTW9kYWxPYmplY3QgIT0gbnVsbCkgewotCQkJcmVzdWx0IF49IGZNb2RhbE9iamVjdC5oYXNoQ29kZSgpOwotCQl9Ci0JCWlmIChmTW9kYWxPYmplY3RGZWF0dXJlICE9IG51bGwpIHsKLQkJCXJlc3VsdCBePSBmTW9kYWxPYmplY3RGZWF0dXJlLmhhc2hDb2RlKCk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgRU9iamVjdCBnZXRNb2RhbE9iamVjdCgpIHsKLQkJcmV0dXJuIGZNb2RhbE9iamVjdDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRNb2RhbE9iamVjdChFT2JqZWN0IG9iamVjdCkgewotCQlmTW9kYWxPYmplY3QgPSBvYmplY3Q7Ci0JfQotCi0JCi0JcHVibGljIEVTdHJ1Y3R1cmFsRmVhdHVyZSBnZXRNb2RhbE9iamVjdEZlYXR1cmUoKSB7Ci0JCXJldHVybiBmTW9kYWxPYmplY3RGZWF0dXJlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE1vZGFsT2JqZWN0RmVhdHVyZShFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSkgewotCQlmTW9kYWxPYmplY3RGZWF0dXJlID0gZmVhdHVyZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZWRpdG9ycy9NZXRob2RFbGVtZW50RWRpdG9yTWF0Y2hpbmdTdHJhdGVneS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9lZGl0b3JzL01ldGhvZEVsZW1lbnRFZGl0b3JNYXRjaGluZ1N0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyNWI4YTUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9lZGl0b3JzL01ldGhvZEVsZW1lbnRFZGl0b3JNYXRjaGluZ1N0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UudXRpbC5QZXJzaXN0ZW5jZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yTWF0Y2hpbmdTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBhcnRJbml0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuRmlsZUVkaXRvcklucHV0OwotCi0vKioKLSAqIGltcGxlbWVudHMgSUVkaXRvck1hdGNoaW5nU3RyYXRlZ3kgZm9yIE1ldGhvZEVsZW1lbnRFZGl0b3IKLSAqIEBhdXRob3IgSmVmZiBIYXJkeQotICoKLSAqLwotcHVibGljIGNsYXNzIE1ldGhvZEVsZW1lbnRFZGl0b3JNYXRjaGluZ1N0cmF0ZWd5IGltcGxlbWVudHMgSUVkaXRvck1hdGNoaW5nU3RyYXRlZ3kgewotCi0JcHVibGljIGJvb2xlYW4gbWF0Y2hlcyhJRWRpdG9yUmVmZXJlbmNlIGVkaXRvclJlZiwgSUVkaXRvcklucHV0IGlucHV0KSB7Ci0JCS8vIGluc3BlY3QgaW5wdXQKLQkJTWV0aG9kRWxlbWVudCBpbnB1dEVsZW1lbnQgPSBnZXRNZXRob2RFbGVtZW50RnJvbUlucHV0KGlucHV0KTsKLQkJaWYgKGlucHV0RWxlbWVudCA9PSBudWxsKSB7Ci0JCQkvLyBubyBNZXRob2RFbGVtZW50IGluIGluY29taW5nIGlucHV0Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJCi0gICAgICAgIElFZGl0b3JJbnB1dCBleGlzdGluZ0VkaXRvcklucHV0OwotICAgICAgICBJRWRpdG9yUGFydCBlZGl0b3IgPSBlZGl0b3JSZWYuZ2V0RWRpdG9yKGZhbHNlKTsKLSAgICAgICAgCi0gICAgICAgIGlmICghKGVkaXRvciBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnRFZGl0b3IpKSB7Ci0gICAgICAgIAkvLyBleGlzdGluZyBlZGl0b3IgaXMgbm90IGEgTWV0aG9kRWxlbWVudEVkaXRvcgotICAgICAgICAJcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGV4aXN0aW5nRWRpdG9ySW5wdXQgPSBlZGl0b3JSZWYuZ2V0RWRpdG9ySW5wdXQoKTsKLSAgICAgICAgfSBjYXRjaCAoUGFydEluaXRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBNZXRob2RFbGVtZW50IGV4aXN0aW5nRWRpdG9ySW5wdXRFbGVtZW50ID0gZ2V0TWV0aG9kRWxlbWVudEZyb21JbnB1dChleGlzdGluZ0VkaXRvcklucHV0KTsKLQkJaWYgKGV4aXN0aW5nRWRpdG9ySW5wdXRFbGVtZW50ID09IG51bGwpIHsKLQkJCS8vIG5vIE1ldGhvZEVsZW1lbnQgaW4gZXhpc3RpbmcgZWRpdG9yCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLSAgICAgICAgCi0gICAgICAgIGlmIChleGlzdGluZ0VkaXRvcklucHV0RWxlbWVudC5lcXVhbHMoaW5wdXRFbGVtZW50KSkgewotICAgICAgICAJLy8gZWRpdG9yIGlzIGVkaXRpbmcgdGhlIE1ldGhvZEVsZW1lbnQgcmVwcmVzZW50ZWQgYnkgdGhlIGlucHV0Ci0gICAgICAgIAlyZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlwcml2YXRlIE1ldGhvZEVsZW1lbnQgZ2V0TWV0aG9kRWxlbWVudEZyb21JbnB1dChJRWRpdG9ySW5wdXQgaW5wdXQpIHsKLQkJTWV0aG9kRWxlbWVudCBpbnB1dEVsZW1lbnQgPSBudWxsOwotCQlpZiAoaW5wdXQgaW5zdGFuY2VvZiBGaWxlRWRpdG9ySW5wdXQpIHsKLQkJCS8vIHByb2JhYmx5IG9wZW5lZCBmcm9tIFByb2JsZW1zIFZpZXcKLQkJCWlucHV0RWxlbWVudCA9IFBlcnNpc3RlbmNlVXRpbC5nZXRNZXRob2RFbGVtZW50KCgoRmlsZUVkaXRvcklucHV0KWlucHV0KS5nZXRGaWxlKCksCi0JCQkJCUxpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudExpYnJhcnlNYW5hZ2VyKCkuCi0JCQkJCWdldEVkaXRpbmdEb21haW4oKS5nZXRSZXNvdXJjZVNldCgpKTsKLQkJfQotCQlpZiAoaW5wdXQgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50RWRpdG9ySW5wdXQpIHsKLQkJCWlucHV0RWxlbWVudCA9ICgoTWV0aG9kRWxlbWVudEVkaXRvcklucHV0KWlucHV0KS5nZXRNZXRob2RFbGVtZW50KCk7Ci0JCX0KLQkJcmV0dXJuIGlucHV0RWxlbWVudDsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2VkaXRvcnMvTWV0aG9kTGlicmFyeUVkaXRvci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9lZGl0b3JzL01ldGhvZExpYnJhcnlFZGl0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQ1ZDg0NS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2VkaXRvcnMvTWV0aG9kTGlicmFyeUVkaXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9yczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLk1ldGhvZExpYnJhcnlEZXNjcmlwdGlvbkZvcm1QYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudmlld3MuTGlicmFyeVZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS51dGlsLk1zZ0RpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5JTGlicmFyeU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLk11bHRpRmlsZUlPRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5NdWx0aUZpbGVTYXZlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGFydEluaXRFeGNlcHRpb247Ci0KLS8qKgotICogVGhlIG1ldGhvZCBsaWJyYXJ5IGVkaXRvci4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTWV0aG9kTGlicmFyeUVkaXRvciBleHRlbmRzIE1ldGhvZEVsZW1lbnRFZGl0b3IgewotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLk1ldGhvZEVsZW1lbnRFZGl0b3Ijc2V0UGFydE5hbWUoKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBhcnROYW1lKCkgewotCQlTdHJpbmcgcGFydE5hbWUgPSBBdXRob3JpbmdVSVJlc291cmNlcy5NZXRob2RMaWJyYXJ5RWRpdG9yX3RpdGxlOyAKLQkJaWYgKGVsZW1lbnRPYmouZ2V0TmFtZSgpICE9IG51bGwpIHsKLQkJCXBhcnROYW1lICs9IGVsZW1lbnRPYmouZ2V0TmFtZSgpOwotCQkJOwotCQl9Ci0JCXNldFBhcnROYW1lKHBhcnROYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5NZXRob2RFbGVtZW50RWRpdG9yI2FkZFBhZ2VzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRQYWdlcygpIHsKLQkJdHJ5IHsKLQkJCWFkZFBhZ2UobmV3IE1ldGhvZExpYnJhcnlEZXNjcmlwdGlvbkZvcm1QYWdlKHRoaXMpKTsKLQkJCWNyZWF0ZVByZXZpZXdQYWdlKCk7Ci0JCX0gY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5NZXRob2RFbGVtZW50RWRpdG9yI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCS8vIENsb3NlIGFsbCB0aGUgZWRpdG9ycy4KLQkJZ2V0U2l0ZSgpLmdldFBhZ2UoKS5jbG9zZUFsbEVkaXRvcnMoZmFsc2UpOwotCi0JCS8vIENsZWFyIHRoZSBMaWJyYXJ5IFZpZXcuCi0JCUxpYnJhcnlWaWV3LmdldFZpZXcoKS5zZXRJbnB1dEZvclZpZXdlcihudWxsKTsKLQotCQl0cnkgewotCQkJLy8gQ2xvc2UgdGhlIGN1cnJlbnQgbWV0aG9kIGxpYnJhcnkuCi0JCQlMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmNsb3NlQ3VycmVudE1ldGhvZExpYnJhcnkoKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJfQotCi0JCXN1cGVyLmRpc3Bvc2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5NZXRob2RFbGVtZW50RWRpdG9yI2RvU2F2ZShvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBkb1NhdmUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCWlmIChtb25pdG9yICE9IG51bGwpIHsKLQkJCW1vbml0b3IKLQkJCQkJLmJlZ2luVGFzaygKLQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5NZXRob2RMaWJyYXJ5RWRpdG9yX3NhdmVtb2RlbGxpYnJhcnksIElQcm9ncmVzc01vbml0b3IuVU5LTk9XTik7IAotCi0JCQl0cnkgewotCQkJCUxpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuc2F2ZUN1cnJlbnRNZXRob2RMaWJyYXJ5KCk7Ci0JCQkJZmlyZVByb3BlcnR5Q2hhbmdlKElFZGl0b3JQYXJ0LlBST1BfRElSVFkpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQkJZXgucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJU3RyaW5nIGVyck1zZyA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLk1ldGhvZExpYnJhcnlFZGl0b3JfZXJyX3NhdmU7IAotCQkJCVN0cmluZyBlcnJEZXRhaWxzID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCQlpZiAoZXguZ2V0TWVzc2FnZSgpICE9IG51bGwpIHsKLQkJCQkJZXJyRGV0YWlscyA9IGV4LmdldE1lc3NhZ2UoKTsgCi0JCQkJfQotCQkJCWlmIChleCBpbnN0YW5jZW9mIE11bHRpRmlsZUlPRXhjZXB0aW9uKSB7Ci0JCQkJCU9iamVjdCB0cm91YmxlT2JqID0gKChNdWx0aUZpbGVJT0V4Y2VwdGlvbikgZXgpCi0JCQkJCQkJLmdldFRyb3VibGVPYmplY3QoKTsKLQkJCQkJaWYgKHRyb3VibGVPYmogaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQkJCQllcnJEZXRhaWxzID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuTWV0aG9kTGlicmFyeUVkaXRvcl90cm91Ymxlb2JqZWN0ICsgTXVsdGlGaWxlU2F2ZVV0aWwuZ2V0UGF0aCgoTWV0aG9kRWxlbWVudCkgdHJvdWJsZU9iaik7IAotCQkJCQl9Ci0JCQkJfQotCi0JCQkJU3RyaW5nIHRpdGxlID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuTWV0aG9kTGlicmFyeUVkaXRvcl9lcnJvcl9kaWFsb2dfdGl0bGU7IAotCQkJCVN0cmluZyBwcm9ibGVtID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuTWV0aG9kTGlicmFyeUVkaXRvcl9zYXZlX2xpYnJhcnlfcHJvYmxlbV9tc2c7IAotCQkJCU1zZ0RpYWxvZyBkaWFsb2cgPSBBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCQkJCS5nZXRNc2dEaWFsb2coKTsKLQkJCQlkaWFsb2cuZGlzcGxheUVycm9yKHRpdGxlLCBwcm9ibGVtLCBlcnJNc2csIGVyckRldGFpbHMpOyAKLQkJCX0gZmluYWxseSB7Ci0JCQkJbW9uaXRvci5kb25lKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5NZXRob2RFbGVtZW50RWRpdG9yI2lzRGlydHkoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRGlydHkoKSB7Ci0JCUlMaWJyYXJ5TWFuYWdlciBtYW5hZ2VyID0gKElMaWJyYXJ5TWFuYWdlcikgTGlicmFyeVNlcnZpY2UKLQkJCQkuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TGlicmFyeU1hbmFnZXIoKTsKLQkJcmV0dXJuIG1hbmFnZXIgIT0gbnVsbCA/IG1hbmFnZXIuaXNNZXRob2RMaWJyYXJ5TW9kaWZpZWQoKSA6IGZhbHNlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9lZGl0b3JzL01ldGhvZFJpY2hUZXh0LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2VkaXRvcnMvTWV0aG9kUmljaFRleHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzg2Y2JjYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2VkaXRvcnMvTWV0aG9kUmljaFRleHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyMSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnM7Ci0KLWltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLnJlZ2V4Lk1hdGNoZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQmFzaWNEaWFnbm9zdGljOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5EaWFnbm9zdGljOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQmFzZUZvcm1QYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucmljaHRleHQuSU1ldGhvZFJpY2hUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucmljaHRleHQuTWV0aG9kUmljaFRleHRDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudXRpbC5NZXRob2RSaWNoVGV4dE1hcmtlckhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLmh0bWwuSFRNTEZvcm1hdHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuUmljaFRleHRDb250ZW50VmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuUmVzb3VyY2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpYmFibGVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZmllbGRhc3Npc3QuQ29udHJvbERlY29yYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZmllbGRhc3Npc3QuRmllbGREZWNvcmF0aW9uUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLQotLyoqCi0gKiBBIE1ldGhvZCBFZGl0b3IgUmljaCBUZXh0IGNvbnRyb2wuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQGF1dGhvciBKZWZmIEhhcmR5Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXRob2RSaWNoVGV4dCBleHRlbmRzIFJpY2hUZXh0IGltcGxlbWVudHMgSU1ldGhvZFJpY2hUZXh0IHsKLQotCS8vIFRoZSBtZXRob2QgZWxlbWVudCBhc3NvY2lhdGVkIHdpdGggdGhpcyByaWNoIHRleHQgY29udHJvbC4KLQlwcml2YXRlIE1ldGhvZEVsZW1lbnQgbWV0aG9kRWxlbWVudDsKLQkKLQkvLyB0aGUgTWV0aG9kRWxlbWVudCdzIENvbnRlbnREZXNjcmlwdGlvbgotCXByaXZhdGUgQ29udGVudERlc2NyaXB0aW9uIGNvbnRlbnREZXNjcmlwdGlvbjsKLQotCS8vIFRoZSBtb2RhbCBvYmplY3QgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcmljaCB0ZXh0IGNvbnRyb2wuCi0JcHJpdmF0ZSBFT2JqZWN0IG1vZGFsT2JqZWN0OwotCi0JLy8gVGhlIG1vZGFsIG9iamVjdCBmZWF0dXJlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHJpY2ggdGV4dCBjb250cm9sLgotCXByaXZhdGUgRVN0cnVjdHVyYWxGZWF0dXJlIG1vZGFsT2JqZWN0RmVhdHVyZTsKLQotCS8vIFRoZSByZXNvdXJjZSBiZWluZyBlZGl0ZWQgICAgICAgCi0JcHJvdGVjdGVkIFJlc291cmNlIHJlc291cmNlOwotCQotCS8vIHRoZSBkZWNvcmF0ZWRGaWVsZCBsYWJlbAotCXByb3RlY3RlZCBMYWJlbCBsYWJlbDsKLQkKLQlwcm90ZWN0ZWQgQ29udHJvbERlY29yYXRpb24gY29udHJvbERlY29yYXRpb247Ci0JCi0JcHJvdGVjdGVkIGZpbmFsIEltYWdlIGVycm9yRmllbGREZWNvcmF0aW9uSW1hZ2UgPSBGaWVsZERlY29yYXRpb25SZWdpc3RyeS5nZXREZWZhdWx0KCkuZ2V0RmllbGREZWNvcmF0aW9uKEZpZWxkRGVjb3JhdGlvblJlZ2lzdHJ5LkRFQ19FUlJPUikuZ2V0SW1hZ2UoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JLy8gRmllbGQgbmFtZSBiZWluZyBlZGl0ZWQKLQlwcm90ZWN0ZWQgU3RyaW5nIGZpZWxkTmFtZSA9ICIiOyAvLyROT04tTkxTLTEkCi0KLQkvLyBGaWVsZCBuYW1lIGJlaW5nIGVkaXRlZCB3aXRoIHRoZSB0cmFpbGluZyA6IHJlbW92ZWQgICAgIAotCXByb3RlY3RlZCBTdHJpbmcgZmllbGROYW1lVHJpbTsKLQkKLQkvLyBtYXJrZXIgaGVscGVyCi0JcHJvdGVjdGVkIE1ldGhvZFJpY2hUZXh0TWFya2VySGVscGVyIG1hcmtlckhlbHBlcjsKLQkKLS8vCS8vIG1hcmtlciBhdHRyaWJ1dGUKLS8vCXByaXZhdGUgc3RhdGljIFN0cmluZyBNRVRIT0RfRklFTEROQU1FID0gIk1ldGhvZEZpZWxkTmFtZSI7Ci0KLS8vCS8vIG1hcmtlciBJRAotLy8JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFSS0VSX0lEID0gIm9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkubWV0aG9kUmljaFRleHQiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29udHJvbC4KLQkgKiBAcGFyYW0gc3R5bGUKLQkgKiAgICAgICAgICAgIFRoZSBpbml0aWFsIHN0eWxlIGZvciB0aGUgZWRpdG9yLgotCSAqIEBwYXJhbSBiYXNlUGF0aAotCSAqICAgICAgICAgICAgVGhlIGJhc2UgcGF0aCB1c2VkIGZvciByZXNvbHZpbmcgaHJlZnMuCi0JICovCi0JcHVibGljIE1ldGhvZFJpY2hUZXh0KENvbXBvc2l0ZSBwYXJlbnQsIGludCBzdHlsZSwgU3RyaW5nIGJhc2VQYXRoKSB7Ci0JCXN1cGVyKHBhcmVudCwgc3R5bGUsIGJhc2VQYXRoKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqIAotCSAqIEBwYXJhbSBjb250ZXh0Ci0JICogICAgICAgICAgICBUaGUgY29udGV4dAotCSAqLwotCXB1YmxpYyBNZXRob2RSaWNoVGV4dChNZXRob2RSaWNoVGV4dENvbnRleHQgY29udGV4dCkgewotCQl0aGlzKGNvbnRleHQuZ2V0UGFyZW50KCksIGNvbnRleHQuZ2V0U3R5bGUoKSwgY29udGV4dC5nZXRCYXNlUGF0aCgpKTsKLQl9Ci0KLQkvKioKLQkgKiBVcGRhdGVzIHRoZSBwcmVzZW50YXRpb24gbmFtZXMgb2YgYWxsIGVsZW1lbnQgbGlua3MuCi0JICogCi0JICogQHBhcmFtIHRleHQKLQkgKiAgICAgICAgICAgIFJpY2ggdGV4dCBlbmNvZGVkIGluIEhUTUwgZm9ybWF0LgotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgdGlkeVRleHQoU3RyaW5nIHRleHQpIHsKLQkJLyoKLQkJICogIHRoaXMgd2lsbCBkbyB0aGUgZm9sbG93aW5nIHRvIHRoZSBIVE1MOgotCQkgKiAgMS4gIHVwZGF0ZSBFbGVtZW50IExpbmtzCi0JCSAqICAyLiAgY2hhbmdlIDxBIC4uPiB0byA8YSAuLj4KLQkJICogIDMuICBjaGFuZ2UgPC9BPiB0byA8L2E+Ci0JCSAqICA0LiAgYWRkIGRvdWJsZS1xdW90ZXMgKCIpIGFyb3VuZCBhbGwgYXR0cmlidXRlIHZhbHVlcyBpZiB0aGV5IGFyZSBtaXNzaW5nCi0JCSAqLwotCQkKLQkJcmV0dXJuIFJlc291cmNlSGVscGVyLnZhbGlkYXRlUmljaFRleHRDb250ZW50KG1ldGhvZEVsZW1lbnQsIHRleHQsCi0JCQkJbmV3IFJpY2hUZXh0Q29udGVudFZhbGlkYXRvcigpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBtZXRob2QgZWxlbWVudCBhc3NvY2lhdGVkIHdpdGggdGhpcyByaWNoIHRleHQgY29udHJvbC4KLQkgKiAKLQkgKiBAcGFyYW0gbWV0aG9kRWxlbWVudAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1ldGhvZEVsZW1lbnQoTWV0aG9kRWxlbWVudCBtZXRob2RFbGVtZW50KSB7Ci0JCXRoaXMubWV0aG9kRWxlbWVudCA9IG1ldGhvZEVsZW1lbnQ7Ci0JCWlmICh0aGlzLm1ldGhvZEVsZW1lbnQgaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50KSB7Ci0JCQl0aGlzLm1ldGhvZEVsZW1lbnQgPSAoKFByb2Nlc3NDb21wb25lbnQpIHRoaXMubWV0aG9kRWxlbWVudCkuZ2V0UHJvY2VzcygpOwotCQl9Ci0JCWlmICh0aGlzLm1ldGhvZEVsZW1lbnQgaW5zdGFuY2VvZiBEZXNjcmliYWJsZUVsZW1lbnQpIHsgCi0JCQl0aGlzLmNvbnRlbnREZXNjcmlwdGlvbiA9ICgoRGVzY3JpYmFibGVFbGVtZW50KXRoaXMubWV0aG9kRWxlbWVudCkuZ2V0UHJlc2VudGF0aW9uKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRob2QgZWxlbWVudCBhc3NvY2lhdGVkIHdpdGggdGhpcyByaWNoIHRleHQgY29udHJvbC4KLQkgKi8KLQlwdWJsaWMgTWV0aG9kRWxlbWVudCBnZXRNZXRob2RFbGVtZW50KCkgewotCQlyZXR1cm4gbWV0aG9kRWxlbWVudDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtb2RhbCBvYmplY3QgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcmljaCB0ZXh0IGNvbnRyb2wuCi0JICovCi0JcHVibGljIEVPYmplY3QgZ2V0TW9kYWxPYmplY3QoKSB7Ci0JCXJldHVybiBtb2RhbE9iamVjdDsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBtb2RhbCBvYmplY3QgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcmljaCB0ZXh0IGNvbnRyb2wuCi0JICovCi0JcHVibGljIHZvaWQgc2V0TW9kYWxPYmplY3QoRU9iamVjdCBtb2RhbE9iamVjdCkgewotCQl0aGlzLm1vZGFsT2JqZWN0ID0gbW9kYWxPYmplY3Q7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBtb2RhbCBvYmplY3QgZmVhdHVyZSBhc3NvY2lhdGVkIHdpdGggdGhpcyByaWNoIHRleHQgY29udHJvbC4KLQkgKi8KLQlwdWJsaWMgRVN0cnVjdHVyYWxGZWF0dXJlIGdldE1vZGFsT2JqZWN0RmVhdHVyZSgpIHsKLQkJcmV0dXJuIG1vZGFsT2JqZWN0RmVhdHVyZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBtb2RhbCBvYmplY3QgZmVhdHVyZSBhc3NvY2lhdGVkIHdpdGggdGhpcyByaWNoIHRleHQgY29udHJvbC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNb2RhbE9iamVjdEZlYXR1cmUoRVN0cnVjdHVyYWxGZWF0dXJlIG1vZGFsT2JqZWN0RmVhdHVyZSkgewotCQl0aGlzLm1vZGFsT2JqZWN0RmVhdHVyZSA9IG1vZGFsT2JqZWN0RmVhdHVyZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEZpZWxkTmFtZSgpIHsKLQkJcmV0dXJuIGZpZWxkTmFtZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXREZWNvcmF0ZWRGaWVsZExhYmVsKExhYmVsIGxhYmVsKSB7Ci0JCXRoaXMubGFiZWwgPSBsYWJlbDsKLQkJaWYgKGxhYmVsICE9IG51bGwpIHsKLQkJCU9iamVjdCBkYXRhID0gbGFiZWwuZ2V0RGF0YShCYXNlRm9ybVBhZ2UuTEFCRUxfREVDT1JBVE9SX0tFWSk7Ci0JCQlpZiAoZGF0YSBpbnN0YW5jZW9mIENvbnRyb2xEZWNvcmF0aW9uKSB7Ci0JCQkJY29udHJvbERlY29yYXRpb24gPSAoQ29udHJvbERlY29yYXRpb24pZGF0YTsKLQkJCQljb250cm9sRGVjb3JhdGlvbi5zZXRJbWFnZShlcnJvckZpZWxkRGVjb3JhdGlvbkltYWdlKTsKLQkJCQljb250cm9sRGVjb3JhdGlvbi5oaWRlKCk7Ci0JCQl9Ci0JCQl1cGRhdGVGaWVsZE5hbWVGcm9tTGFiZWwobGFiZWwpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIHVwZGF0ZUZpZWxkTmFtZUZyb21MYWJlbChMYWJlbCBsYWJlbCkgewotCQlpZiAobGFiZWwgIT0gbnVsbCkgewotCQkJU3RyaW5nIGZpZWxkTmFtZSA9IGxhYmVsLmdldFRleHQoKTsKLQkJCWlmICghdGhpcy5maWVsZE5hbWUuZXF1YWxzKGZpZWxkTmFtZSkpIHsKLQkJCQl0aGlzLmZpZWxkTmFtZSA9IGZpZWxkTmFtZTsKLQkJCQlpbnQgY29sb25JbmRleCA9IGZpZWxkTmFtZS5pbmRleE9mKCc6Jyk7Ci0JCQkJaWYgKGNvbG9uSW5kZXggPT0gLTEpCi0JCQkJCWNvbG9uSW5kZXggPSBmaWVsZE5hbWUubGVuZ3RoKCk7Ci0JCQkJdGhpcy5maWVsZE5hbWVUcmltID0gZmllbGROYW1lLnN1YnN0cmluZygwLCBjb2xvbkluZGV4KS50cmltKCk7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBpbml0KE1ldGhvZEVsZW1lbnQgZWxlbWVudCwgTGFiZWwgbGFiZWwpIHsKLQkJc2V0TWV0aG9kRWxlbWVudChlbGVtZW50KTsKLQkJc2V0RGVjb3JhdGVkRmllbGRMYWJlbChsYWJlbCk7Ci0JCW1hcmtlckhlbHBlciA9IE1ldGhvZFJpY2hUZXh0TWFya2VySGVscGVyLklOU1RBTkNFOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGZvcm1hdEhUTUwoU3RyaW5nIHRleHQpIHsKLQkJU3RyaW5nIGZvcm1hdHRlZFRleHQ7Ci0JCXRyeSB7Ci0JCQkvLyBjbGVhciBtYXJrZXJzIGZpcnN0Ci0JCQljbGVhck1hcmtlcnMoKTsKLQkJCS8vIENhbGwgSlRpZHkgdG8gZm9ybWF0IHRoZSBzb3VyY2UgdG8gWEhUTUwuCi0JCQlmb3JtYXR0ZWRUZXh0ID0gaHRtbEZvcm1hdHRlci5mb3JtYXRIVE1MKHRleHQpOwotCQkJaWYgKGh0bWxGb3JtYXR0ZXIuZ2V0TGFzdEVycm9yU3RyKCkgIT0gbnVsbCkgewotCQkJCVN0cmluZyBlcnJvclN0cmluZyA9IGh0bWxGb3JtYXR0ZXIuZ2V0TGFzdEVycm9yU3RyKCk7Ci0JCQkJLy8gY3JlYXRlIG1hcmtlcnMKLQkJCQl0cnkgewotCQkJCQljcmVhdGVNYXJrZXIoZXJyb3JTdHJpbmcpOwotCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2V4KSB7Ci0JCQkJCWxvZ2dlci5sb2dFcnJvcihjZXgpOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBmb3JtYXR0ZWRUZXh0OwotCQl9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUpIHsKLQkJCWxvZ2dlci5sb2dFcnJvcihlKTsKLQkJfQotCQlyZXR1cm4gdGV4dDsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgY2xlYXJNYXJrZXJzKCkgewotCQltYXJrZXJIZWxwZXIuZGVsZXRlTWFya2Vycyhjb250ZW50RGVzY3JpcHRpb24sIGZpZWxkTmFtZVRyaW0pOwotCQlzZXRFcnJvckRlc2NyaXB0aW9uKCIiKTsgLy8kTk9OLU5MUy0xJAotCQloaWRlRXJyb3JEZWNvcmF0aW9uKCk7Ci0JCXJlZnJlc2hEZWNvcmF0b3JzKCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHNldEVycm9yRGVzY3JpcHRpb24oU3RyaW5nIHRleHQpIHsKLQkJaWYgKGNvbnRyb2xEZWNvcmF0aW9uICE9IG51bGwpIHsKLQkJCWNvbnRyb2xEZWNvcmF0aW9uLnNldERlc2NyaXB0aW9uVGV4dCh0ZXh0KTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoRGVjb3JhdG9ycygpIHsKLQkJLy8gcmVmcmVzaAotLy8JCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0RGVjb3JhdG9yTWFuYWdlcigpLnVwZGF0ZShNZXRob2RFbGVtZW50TGlnaHR3ZWlnaHRMYWJlbERlY29yYXRvci5ERUNPUkFUT1JfSUQpOwotCX0KLQkKLQkKLQkvKgotCSAqIFRPRE86Ci0JICogaGFkIHRvIHVuZG8gY2hhbmdlIGluIERlc2NyaWJhYmxlRWxlbWVudEltcGwgdG8gc2V0IHByZXNlbnRhdGlvbiBvbiBhbnkgbmV3IG9iagotCSAqIHNvIGVkaXRvciB3aWxsIG5lZWQgdG8gYXNzaWduIHByZXNlbnRhdGlvbiB3aGVuIGZpZWxkIGlzIGVkaXRlZCBzbyB0aGF0IHRoZSBtYXJrZXIKLQkgKiBjYW4gYmUgYWRkZWQgdG8gdGhlIHByZXNlbnRhdGlvbidzIHJlc291cmNlCi0JICovCi0JCi0JCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlTWFya2VyKFN0cmluZyBmdWxsRXJyTXNnKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmIChjb250ZW50RGVzY3JpcHRpb24uZUNvbnRhaW5lcigpIGluc3RhbmNlb2YgRGVzY3JpYmFibGVFbGVtZW50KSB7Ci0JCQlNYXRjaGVyIG0gPSBIVE1MRm9ybWF0dGVyLmpUaWR5RXJyb3JQYXJzZXIubWF0Y2hlcihmdWxsRXJyTXNnKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCQkJaWYgKG0uZmluZCgpKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkJCQlTdHJpbmcgbG9jYXRpb24gPSBtLmdyb3VwKDEpOwotCQkJCVN0cmluZyBlcnJvck1zZyA9IG0uZ3JvdXAoNCk7Ci0JCQkJQmFzaWNEaWFnbm9zdGljIGRpYWdub3N0aWNzID0gCi0JCQkgICAgICAgICAgbmV3IEJhc2ljRGlhZ25vc3RpYwotCQkJICAgICAgICAgICAgKEhUTUxGb3JtYXR0ZXIuRElBR05PU1RJQ19TT1VSQ0UsCi0JCQkgICAgICAgICAgICAgMCwgIiIsIC8vJE5PTi1OTFMtMSQKLQkJCSAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W10geyBjb250ZW50RGVzY3JpcHRpb24sIGZpZWxkTmFtZVRyaW0gfSk7Ci0JCi0JCQkJZGlhZ25vc3RpY3MuYWRkKCAKLQkJCQkJbmV3IEJhc2ljRGlhZ25vc3RpYyhEaWFnbm9zdGljLkVSUk9SLAotCQkJCQkJbG9jYXRpb24sIDAsIGVycm9yTXNnLAotCQkJCQkJbmV3IE9iamVjdFtdIHsgY29udGVudERlc2NyaXB0aW9uLCBmaWVsZE5hbWVUcmltIH0pKTsKLQkKLQkJICAgICAgICBtYXJrZXJIZWxwZXIuY3JlYXRlTWFya2VycyhkaWFnbm9zdGljcyk7Ci0JCSAgICAgICAgc2V0RXJyb3JEZXNjcmlwdGlvbihlcnJvck1zZyk7Ci0JCSAgICAgICAgc2hvd0Vycm9yRGVjb3JhdGlvbigpOwotCQkJCXJlZnJlc2hEZWNvcmF0b3JzKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlzdXBlci5kaXNwb3NlKCk7Ci0JCWNsZWFyTWFya2VycygpOwotCQlyZWZyZXNoRGVjb3JhdG9ycygpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzaG93RXJyb3JEZWNvcmF0aW9uKCkgewotICAgICAgICBpZiAoY29udHJvbERlY29yYXRpb24gIT0gbnVsbCkgewotICAgICAgICAJY29udHJvbERlY29yYXRpb24uc2hvdygpOwotICAgICAgICB9Ci0JfQotCi0JcHVibGljIHZvaWQgaGlkZUVycm9yRGVjb3JhdGlvbigpIHsKLSAgICAgICAgaWYgKGNvbnRyb2xEZWNvcmF0aW9uICE9IG51bGwpIHsKLSAgICAgICAgCWNvbnRyb2xEZWNvcmF0aW9uLmhpZGUoKTsKLSAgICAgICAgfQotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzZXRUZXh0KFN0cmluZyB0ZXh0KSB7Ci0JCS8vIGNoZWNrIGlmIGxhYmVsIHRleHQgd2FzIGNoYW5nZWQgKHRoaXMgaGFwcGVucyB3aGVuIFJURSBpcyBleHBhbmRlZCkKLQkJLy8gdGhpcyBpcyBjYWxsZWQgd2hlbiBSVEUgaXMgdG9nZ2xlZCBpbiBlZGl0b3IgLSByZWFkIG5ldyBmaWVsZE5hbWUKLQkJaWYgKHVwZGF0ZUZpZWxkTmFtZUZyb21MYWJlbChsYWJlbCkpCi0JCQloaWRlRXJyb3JEZWNvcmF0aW9uKCk7Ci0JCXN1cGVyLnNldFRleHQodGV4dCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9lZGl0b3JzL01ldGhvZFJpY2hUZXh0RWRpdG9yLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2VkaXRvcnMvTWV0aG9kUmljaFRleHRFZGl0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmMzYzdhMS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2VkaXRvcnMvTWV0aG9kUmljaFRleHRFZGl0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9ucy5NZXRob2RBZGRJbWFnZUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnMuTWV0aG9kQWRkTGlua0FjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLk1ldGhvZEZvcm1Ub29sa2l0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucmljaHRleHQuSU1ldGhvZFJpY2hUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucmljaHRleHQuSU1ldGhvZFJpY2hUZXh0RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucmljaHRleHQuTWV0aG9kUmljaFRleHRFZGl0b3JDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5JUmljaFRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LklSaWNoVGV4dFRvb2xCYXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5hY3Rpb25zLkFkZE9yZGVyZWRMaXN0QWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5hY3Rpb25zLkFkZFRhYmxlQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5hY3Rpb25zLkFkZFVub3JkZXJlZExpc3RBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmFjdGlvbnMuQm9sZEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuYWN0aW9ucy5DbGVhckNvbnRlbnRBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmFjdGlvbnMuQ29weUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuYWN0aW9ucy5DdXRBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmFjdGlvbnMuRmluZFJlcGxhY2VBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmFjdGlvbnMuRm9udE5hbWVBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmFjdGlvbnMuRm9udFNpemVBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmFjdGlvbnMuRm9udFN0eWxlQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5hY3Rpb25zLkluZGVudEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuYWN0aW9ucy5JdGFsaWNBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmFjdGlvbnMuT3V0ZGVudEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuYWN0aW9ucy5QYXN0ZUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuYWN0aW9ucy5TdWJzY3JpcHRBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmFjdGlvbnMuU3VwZXJzY3JpcHRBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmFjdGlvbnMuVGlkeUFjdGlvbkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5hY3Rpb25zLlVuZGVybGluZUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlOwotCi0vKioKLSAqIEEgUmljaCBUZXh0IGVkaXRvciB3aXRoIGFkZGVkIGV4dGVuc2lvbnMgdG8gc3VwcG9ydCBNZXRob2QgYnJvd3NpbmcgYW5kCi0gKiBhdXRob3JpbmcuIEluY2x1ZGVzIGEgdG9vbCBiYXIgYW5kIGFuIGludGVncmF0ZWQgSFRNTCBzb3VyY2UgZWRpdG9yLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBhdXRob3IgSmVmZiBIYXJkeQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTWV0aG9kUmljaFRleHRFZGl0b3IgZXh0ZW5kcyBSaWNoVGV4dEVkaXRvciBpbXBsZW1lbnRzCi0JCUlNZXRob2RSaWNoVGV4dEVkaXRvciB7Ci0KLQkvLyBUaGUgbWV0aG9kIGVsZW1lbnQgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcmljaCB0ZXh0IGNvbnRyb2wuCi0JcHJpdmF0ZSBNZXRob2RFbGVtZW50IG1ldGhvZEVsZW1lbnQ7Ci0KLQkvLyBUaGUgbW9kYWwgb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGlzIHJpY2ggdGV4dCBjb250cm9sLgotCXByaXZhdGUgRU9iamVjdCBtb2RhbE9iamVjdDsKLQotCS8vIFRoZSBtb2RhbCBvYmplY3QgZmVhdHVyZSBhc3NvY2lhdGVkIHdpdGggdGhpcyByaWNoIHRleHQgY29udHJvbC4KLQlwcml2YXRlIEVTdHJ1Y3R1cmFsRmVhdHVyZSBtb2RhbE9iamVjdEZlYXR1cmU7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29udHJvbC4KLQkgKiBAcGFyYW0gc3R5bGUKLQkgKiAgICAgICAgICAgIFRoZSBpbml0aWFsIHN0eWxlIGZvciB0aGUgZWRpdG9yLgotCSAqIEBwYXJhbSBiYXNlUGF0aAotCSAqICAgICAgICAgICAgVGhlIGJhc2UgcGF0aCB1c2VkIGZvciByZXNvbHZpbmcgaHJlZnMuCi0JICovCi0JcHVibGljIE1ldGhvZFJpY2hUZXh0RWRpdG9yKENvbXBvc2l0ZSBwYXJlbnQsIGludCBzdHlsZSwgU3RyaW5nIGJhc2VQYXRoLAotCQkJTWV0aG9kRWxlbWVudCBtZXRob2RFbGVtZW50LCBMYWJlbCBsYWJlbCwgSUVkaXRvclNpdGUgZWRpdG9yU2l0ZSkgewotCQlzdXBlcihwYXJlbnQsIHN0eWxlLCBlZGl0b3JTaXRlLCBiYXNlUGF0aCk7Ci0JCXRoaXMubWV0aG9kRWxlbWVudCA9IG1ldGhvZEVsZW1lbnQ7Ci0JCWluaXQobWV0aG9kRWxlbWVudCwgbGFiZWwpOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqIAotCSAqIEBwYXJhbSBjb250ZXh0Ci0JICogICAgICAgICAgICBUaGUgY29udGV4dAotCSAqLwotCXB1YmxpYyBNZXRob2RSaWNoVGV4dEVkaXRvcihNZXRob2RSaWNoVGV4dEVkaXRvckNvbnRleHQgY29udGV4dCkgewotCQl0aGlzKGNvbnRleHQuZ2V0UGFyZW50KCksIGNvbnRleHQuZ2V0U3R5bGUoKSwgY29udGV4dC5nZXRCYXNlUGF0aCgpLAotCQkJCWNvbnRleHQuZ2V0TWV0aG9kRWxlbWVudCgpLCBjb250ZXh0LmdldExhYmVsKCksIGNvbnRleHQuZ2V0RWRpdG9yU2l0ZSgpKTsKLQl9Ci0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIHVuZGVybHlpbmcgcmljaCB0ZXh0IGNvbnRyb2wuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb21wb3NpdGUuCi0JICogQHBhcmFtIHN0eWxlCi0JICogICAgICAgICAgICBUaGUgc3R5bGUgZm9yIHRoaXMgY29udHJvbC4KLQkgKiBAcGFyYW0gYmFzZVBhdGgKLQkgKiAgICAgICAgICAgIFRoZSBwYXRoIHVzZWQgZm9yIHJlc29sdmluZyBsaW5rcy4KLQkgKi8KLQlwcm90ZWN0ZWQgSVJpY2hUZXh0IGNyZWF0ZVJpY2hUZXh0Q29udHJvbChDb21wb3NpdGUgcGFyZW50LCBpbnQgc3R5bGUsCi0JCQlTdHJpbmcgYmFzZVBhdGgpIHsKLQkJcmV0dXJuIE1ldGhvZEZvcm1Ub29sa2l0LmNyZWF0ZU1ldGhvZFJpY2hUZXh0KHBhcmVudCwgc3R5bGUsIGJhc2VQYXRoKTsKLQl9Ci0KLQkvKioKLQkgKiBGaWxscyB0aGUgUmljaCBUZXh0IGVkaXRvciB0b29sIGJhciB3aXRoIGFjdGlvbiBpdGVtcy4KLQkgKiAKLQkgKiBAcGFyYW0gdG9vbEJhcgotCSAqICAgICAgICAgICAgVGhlIFJpY2ggdGV4dCBlZGl0b3IgdG9vbCBiYXIuCi0JICovCi0JcHVibGljIHZvaWQgZmlsbFRvb2xCYXIoSVJpY2hUZXh0VG9vbEJhciB0b29sQmFyKSB7Ci0JCXRvb2xCYXIuYWRkQWN0aW9uKG5ldyBGb250U3R5bGVBY3Rpb24odGhpcykpOwotCQl0b29sQmFyLmFkZEFjdGlvbihuZXcgRm9udE5hbWVBY3Rpb24odGhpcykpOwotCQl0b29sQmFyLmFkZEFjdGlvbihuZXcgRm9udFNpemVBY3Rpb24odGhpcykpOwotCQl0b29sQmFyLmFkZFNlcGFyYXRvcigpOwkJCi0JCXRvb2xCYXIuYWRkQWN0aW9uKG5ldyBDdXRBY3Rpb24odGhpcykpOwotCQl0b29sQmFyLmFkZEFjdGlvbihuZXcgQ29weUFjdGlvbih0aGlzKSk7Ci0JCXRvb2xCYXIuYWRkQWN0aW9uKG5ldyBQYXN0ZUFjdGlvbih0aGlzKSk7Ci0JCXRvb2xCYXIuYWRkU2VwYXJhdG9yKCk7Ci0JCXRvb2xCYXIuYWRkQWN0aW9uKG5ldyBDbGVhckNvbnRlbnRBY3Rpb24odGhpcykpOwotCQl0b29sQmFyLmFkZFNlcGFyYXRvcigpOwotCQl0b29sQmFyLmFkZEFjdGlvbihuZXcgQm9sZEFjdGlvbih0aGlzKSk7Ci0JCXRvb2xCYXIuYWRkQWN0aW9uKG5ldyBJdGFsaWNBY3Rpb24odGhpcykpOwotCQl0b29sQmFyLmFkZEFjdGlvbihuZXcgVW5kZXJsaW5lQWN0aW9uKHRoaXMpKTsKLQkJdG9vbEJhci5hZGRTZXBhcmF0b3IoKTsKLQkJdG9vbEJhci5hZGRBY3Rpb24obmV3IFN1YnNjcmlwdEFjdGlvbih0aGlzKSk7Ci0JCXRvb2xCYXIuYWRkQWN0aW9uKG5ldyBTdXBlcnNjcmlwdEFjdGlvbih0aGlzKSk7Ci0JCXRvb2xCYXIuYWRkU2VwYXJhdG9yKCk7Ci0JCXRvb2xCYXIuYWRkQWN0aW9uKG5ldyBUaWR5QWN0aW9uR3JvdXAodGhpcykpOwotCQl0b29sQmFyLmFkZFNlcGFyYXRvcigpOwotCQl0b29sQmFyLmFkZEFjdGlvbihuZXcgQWRkT3JkZXJlZExpc3RBY3Rpb24odGhpcykpOwotCQl0b29sQmFyLmFkZEFjdGlvbihuZXcgQWRkVW5vcmRlcmVkTGlzdEFjdGlvbih0aGlzKSk7Ci0JCXRvb2xCYXIuYWRkU2VwYXJhdG9yKCk7Ci0JCXRvb2xCYXIuYWRkQWN0aW9uKG5ldyBPdXRkZW50QWN0aW9uKHRoaXMpKTsKLQkJdG9vbEJhci5hZGRBY3Rpb24obmV3IEluZGVudEFjdGlvbih0aGlzKSk7Ci0JCXRvb2xCYXIuYWRkU2VwYXJhdG9yKCk7Ci0JCXRvb2xCYXIuYWRkQWN0aW9uKG5ldyBGaW5kUmVwbGFjZUFjdGlvbih0aGlzKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGV4ZWN1dGUoSVJpY2hUZXh0IHJpY2hUZXh0KSB7Ci0JCQkJcmljaFRleHQuZ2V0RmluZFJlcGxhY2VBY3Rpb24oKS5leGVjdXRlKHJpY2hUZXh0KTsKLQkJCX0KLQkJfSk7Ci0JCXRvb2xCYXIuYWRkU2VwYXJhdG9yKCk7Ci0JCXRvb2xCYXIuYWRkQWN0aW9uKG5ldyBNZXRob2RBZGRMaW5rQWN0aW9uKHRoaXMpKTsKLQkJdG9vbEJhci5hZGRBY3Rpb24obmV3IE1ldGhvZEFkZEltYWdlQWN0aW9uKHRoaXMpKTsKLQkJdG9vbEJhci5hZGRBY3Rpb24obmV3IEFkZFRhYmxlQWN0aW9uKHRoaXMpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRob2QgZWxlbWVudCBhc3NvY2lhdGVkIHdpdGggdGhpcyByaWNoIHRleHQgY29udHJvbC4KLQkgKi8KLQlwdWJsaWMgTWV0aG9kRWxlbWVudCBnZXRNZXRob2RFbGVtZW50KCkgewotCQlyZXR1cm4gbWV0aG9kRWxlbWVudDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtb2RhbCBvYmplY3QgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcmljaCB0ZXh0IGNvbnRyb2wuCi0JICovCi0JcHVibGljIEVPYmplY3QgZ2V0TW9kYWxPYmplY3QoKSB7Ci0JCXJldHVybiBtb2RhbE9iamVjdDsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBtb2RhbCBvYmplY3QgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcmljaCB0ZXh0IGNvbnRyb2wuCi0JICovCi0JcHVibGljIHZvaWQgc2V0TW9kYWxPYmplY3QoRU9iamVjdCBtb2RhbE9iamVjdCkgewotCQl0aGlzLm1vZGFsT2JqZWN0ID0gbW9kYWxPYmplY3Q7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBtb2RhbCBvYmplY3QgZmVhdHVyZSBhc3NvY2lhdGVkIHdpdGggdGhpcyByaWNoIHRleHQgY29udHJvbC4KLQkgKi8KLQlwdWJsaWMgRVN0cnVjdHVyYWxGZWF0dXJlIGdldE1vZGFsT2JqZWN0RmVhdHVyZSgpIHsKLQkJcmV0dXJuIG1vZGFsT2JqZWN0RmVhdHVyZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBtb2RhbCBvYmplY3QgZmVhdHVyZSBhc3NvY2lhdGVkIHdpdGggdGhpcyByaWNoIHRleHQgY29udHJvbC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNb2RhbE9iamVjdEZlYXR1cmUoRVN0cnVjdHVyYWxGZWF0dXJlIG1vZGFsT2JqZWN0RmVhdHVyZSkgewotCQl0aGlzLm1vZGFsT2JqZWN0RmVhdHVyZSA9IG1vZGFsT2JqZWN0RmVhdHVyZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0KE1ldGhvZEVsZW1lbnQgZWxlbWVudCwgTGFiZWwgbGFiZWwpIHsKLQkJaWYgKHJpY2hUZXh0IGluc3RhbmNlb2YgSU1ldGhvZFJpY2hUZXh0KQotCQkJKChJTWV0aG9kUmljaFRleHQpcmljaFRleHQpLmluaXQobWV0aG9kRWxlbWVudCwgbGFiZWwpOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZWRpdG9ycy9QcmV2aWV3UGFnZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9lZGl0b3JzL1ByZXZpZXdQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlZWY1N2YuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9lZGl0b3JzL1ByZXZpZXdQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSUltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudmlld3MuRWxlbWVudEhUTUxWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYnJvd3Nlci5Ccm93c2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uVmlld0Zvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVG9vbEJhcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Ub29sSXRlbTsKLQotLyoqCi0gKiBUaGUgUHJldmlldyBwYWdlIGluIHRoZSBNZXRob2QgRWRpdG9yLgotICogCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBQcmV2aWV3UGFnZSB7Ci0KLQlwcml2YXRlIEVsZW1lbnRIVE1MVmlld2VyIHByZXZpZXdlciA9IG51bGw7Ci0KLQkvKioKLQkgKiBDcmVhdGUgYW4gaW5zdGFuY2UKLQkgKiAKLQkgKiBAcGFyYW0gY29tcG9zaXRlCi0JICovCi0JcHVibGljIFByZXZpZXdQYWdlKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQkJLy8gVXNlIHRoZSBWaWV3Rm9ybSBjb250cm9sIHRvIGdpdmUgaXQgdGhlIEVjbGlwc2UgV29ya2JlbmNoIHdpbmRvdwotCQkvLyBsb29rICYgZmVlbC4KLQkJVmlld0Zvcm0gdmlld0Zvcm0gPSBuZXcgVmlld0Zvcm0oY29tcG9zaXRlLCBTV1QuREVGQVVMVCk7Ci0JCXZpZXdGb3JtLm1hcmdpbkhlaWdodCA9IDA7Ci0JCXZpZXdGb3JtLm1hcmdpbldpZHRoID0gMDsKLQkJdmlld0Zvcm0uc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQl2aWV3Rm9ybS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQotCQkvLyBTZXQgdG9vbGJhcgotCQlDb250cm9sIHRvb2xiYXIgPSBjcmVhdGVUb29sYmFyKHZpZXdGb3JtKTsKLQkJdmlld0Zvcm0uc2V0VG9wUmlnaHQodG9vbGJhcik7Ci0KLQkJLy8gU2V0IGNvbnRlbnQKLQkJQ29udHJvbCBjb250ZW50ID0gY3JlYXRlQ29udGVudCh2aWV3Rm9ybSk7Ci0JCXZpZXdGb3JtLnNldENvbnRlbnQoY29udGVudCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIHByZXZpZXcgY29udGVudAotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBDb250cm9sIGNyZWF0ZUNvbnRlbnQoVmlld0Zvcm0gcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBjb250ZW50ID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJbGF5b3V0Lmhvcml6b250YWxTcGFjaW5nID0gMDsKLQkJbGF5b3V0LnZlcnRpY2FsU3BhY2luZyA9IDA7Ci0JCWNvbnRlbnQuc2V0TGF5b3V0KGxheW91dCk7Ci0JCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCWNvbnRlbnQuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLQkJcHJldmlld2VyID0gbmV3IEVsZW1lbnRIVE1MVmlld2VyKGNvbnRlbnQpOwotCQlyZXR1cm4gKENvbnRyb2wpIGNvbnRlbnQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIEVsZW1lbnRWaWV3ZXIKLQkgKiAKLQkgKiBAcmV0dXJuCi0JICogCQkJVmlld2VyCi0JICovCi0JcHVibGljIEVsZW1lbnRIVE1MVmlld2VyIGdldFByZXZpZXdWaWV3ZXIoKSB7Ci0JCXJldHVybiBwcmV2aWV3ZXI7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIFRvb2xiYXIgSXQgaGFzIEdvIGJhY2ssIEdvIGZvcndhcmQsIFN0b3AgYW5kIHJlZnJlc2ggYnV0dG9ucwotCSAqIAotCSAqIEBwYXJhbSBWaWV3Rm9ybQotCSAqICAgICAgICAgICAgcGFyZW50Ci0JICogQHJldHVybiBUb29sYmFyCi0JICovCi0JcHJpdmF0ZSBUb29sQmFyIGNyZWF0ZVRvb2xiYXIoVmlld0Zvcm0gcGFyZW50KSB7Ci0JCS8vIENyZWF0ZSB0aGUgYnJvd3NlciBuYXZpZ2F0aW9uIHRvb2xiYXIuCi0JCVRvb2xCYXIgdG9vbGJhciA9IG5ldyBUb29sQmFyKHBhcmVudCwgU1dULkZMQVQpOwotCi0JCS8vIEFkZCB0aGUgQmFjayBidXR0b24uCi0JCVRvb2xJdGVtIGJhY2tCdXR0b24gPSBuZXcgVG9vbEl0ZW0odG9vbGJhciwgU1dULk5PTkUpOwotCQliYWNrQnV0dG9uLnNldEltYWdlKEF1dGhvcmluZ1VJSW1hZ2VzLklNR19CQUNLKTsKLQkJYmFja0J1dHRvbi5zZXRUb29sVGlwVGV4dChBdXRob3JpbmdVSVJlc291cmNlcy5iYWNrQnV0dG9uX3RleHQpOyAKLQkJYmFja0J1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJQnJvd3NlciBicm93c2VyID0gcHJldmlld2VyLmdldEJyb3dzZXIoKTsKLQkJCQlpZiAoYnJvd3NlciAhPSBudWxsKSB7Ci0JCQkJCWJyb3dzZXIuYmFjaygpOwotCQkJCX0KLQkJCX07Ci0JCX0pOwotCi0JCS8vIEFkZCB0aGUgRm93YXJkIGJ1dHRvbi4KLQkJVG9vbEl0ZW0gZm9yd2FyZEJ1dHRvbiA9IG5ldyBUb29sSXRlbSh0b29sYmFyLCBTV1QuTk9ORSk7Ci0JCWZvcndhcmRCdXR0b24uc2V0SW1hZ2UoQXV0aG9yaW5nVUlJbWFnZXMuSU1HX0ZPUldBUkQpOwotCQlmb3J3YXJkQnV0dG9uLnNldFRvb2xUaXBUZXh0KEF1dGhvcmluZ1VJUmVzb3VyY2VzLmZvcndhcmRCdXR0b25fdGV4dCk7IAotCQlmb3J3YXJkQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlCcm93c2VyIGJyb3dzZXIgPSBwcmV2aWV3ZXIuZ2V0QnJvd3NlcigpOwotCQkJCWlmIChicm93c2VyICE9IG51bGwpIHsKLQkJCQkJYnJvd3Nlci5mb3J3YXJkKCk7Ci0JCQkJfQotCQkJfTsKLQkJfSk7Ci0KLQkJLy8gQWRkIHRoZSBTdG9wIGJ1dHRvbi4KLQkJVG9vbEl0ZW0gc3RvcEJ1dHRvbiA9IG5ldyBUb29sSXRlbSh0b29sYmFyLCBTV1QuTk9ORSk7Ci0JCXN0b3BCdXR0b24uc2V0SW1hZ2UoQXV0aG9yaW5nVUlJbWFnZXMuSU1HX1NUT1ApOwotCQlzdG9wQnV0dG9uLnNldFRvb2xUaXBUZXh0KEF1dGhvcmluZ1VJUmVzb3VyY2VzLnN0b3BCdXR0b25fdGV4dCk7IAotCQlzdG9wQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlCcm93c2VyIGJyb3dzZXIgPSBwcmV2aWV3ZXIuZ2V0QnJvd3NlcigpOwotCQkJCWlmIChicm93c2VyICE9IG51bGwpIHsKLQkJCQkJYnJvd3Nlci5zdG9wKCk7Ci0JCQkJfQotCQkJfTsKLQkJfSk7Ci0KLQkJLy8gQWRkIHRoZSBSZWZyZXNoIGJ1dHRvbi4KLQkJVG9vbEl0ZW0gcmVmcmVzaEJ1dHRvbiA9IG5ldyBUb29sSXRlbSh0b29sYmFyLCBTV1QuTk9ORSk7Ci0JCXJlZnJlc2hCdXR0b24uc2V0SW1hZ2UoQXV0aG9yaW5nVUlJbWFnZXMuSU1HX1JFRlJFU0gpOwotCQlyZWZyZXNoQnV0dG9uLnNldFRvb2xUaXBUZXh0KEF1dGhvcmluZ1VJUmVzb3VyY2VzLnJlZnJlc2hCdXR0b25fdGV4dCk7IAotCQlyZWZyZXNoQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQkvLyBCcm93c2VyIGJyb3dzZXIgPSBwcmV2aWV3ZXIuZ2V0QnJvd3NlcigpOwotCQkJCS8vIGlmIChicm93c2VyICE9IG51bGwpIHsKLQkJCQkvLyBicm93c2VyLnJlZnJlc2goKTsKLQkJCQkvLyB9Ci0KLQkJCQlwcmV2aWV3ZXIucmVmcmVzaCgpOwotCQkJfTsKLQkJfSk7Ci0KLQkJLy8gQWRkIHRoZSBQcmludCBidXR0b24uCi0JCVRvb2xJdGVtIHByaW50QnV0dG9uID0gbmV3IFRvb2xJdGVtKHRvb2xiYXIsIFNXVC5OT05FKTsKLQkJcHJpbnRCdXR0b24uc2V0SW1hZ2UoQXV0aG9yaW5nVUlJbWFnZXMuSU1HX1BSSU5UKTsKLQkJcHJpbnRCdXR0b24uc2V0VG9vbFRpcFRleHQoQXV0aG9yaW5nVUlSZXNvdXJjZXMucHJpbnRCdXR0b25fdGV4dCk7IAotCQlwcmludEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJcHJldmlld2VyLnByaW50KCk7Ci0JCQl9OwotCQl9KTsKLQotCQlyZXR1cm4gdG9vbGJhcjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZWRpdG9ycy9Qcm9jZXNzRWRpdG9yLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2VkaXRvcnMvUHJvY2Vzc0VkaXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYzBjMmY3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZWRpdG9ycy9Qcm9jZXNzRWRpdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDIwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9yczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuRXZlbnRPYmplY3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRIYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZFN0YWNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kU3RhY2tMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udWkudmlld2VyLklWaWV3ZXJQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQmFzaWNFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ3JlYXRlQ2hpbGRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuU2V0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5JRWRpdGluZ0RvbWFpblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5VHJlZUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VkQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlJlZmxlY3RpdmVJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5yZXNvdXJjZS5SZXNvdXJjZUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5FZGl0aW5nRG9tYWluQWN0aW9uQmFyQ29udHJpYnV0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuZG5kLkxvY2FsVHJhbnNmZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuZG5kLlZpZXdlckRyYWdBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnMuSVdvcmtiZW5jaFBhcnRBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zLkxpYnJhcnlWYWxpZGF0ZUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmRuZC5FZGl0aW5nRG9tYWluVGFibGVUcmVlVmlld2VyRHJvcEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLlByb2Nlc3NCcmVha2Rvd25TdHJ1Y3R1cmVGb3JtUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLlByb2Nlc3NEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByZWZlcmVuY2VzLkFwcGxpY2F0aW9uUHJlZmVyZW5jZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuRVBGUHJvcGVydHlTaGVldFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm92aWRlcnMuSU1ldGhvZEVsZW1lbnRFZGl0b3JQYWdlUHJvdmlkZXJFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS52aWV3cy5Qcm9jZXNzVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24ucHJlZmVyZW5jZXMuSVByZWZlcmVuY2VTdG9yZVdyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5wcmVmZXJlbmNlcy5JUHJvcGVydHlDaGFuZ2VFdmVudFdyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5wcmVmZXJlbmNlcy5JUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcldyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5wYXJ0LkFic3RyYWN0RGlhZ3JhbUVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnBhcnQuRGlhZ3JhbUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUucGFydC5EaWFncmFtRWRpdG9ySW5wdXRQcm94eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS51aS5zZXJ2aWNlLkRpYWdyYW1FZGl0b3JIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuSUxpYnJhcnlNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LklMaWJyYXJ5U2VydmljZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5Qcm9jZXNzQXV0aG9yaW5nQ29uZmlndXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUFkYXB0ZXJGYWN0b3J5UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuQ29tbWFuZFN0YWNrQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuSUJTSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudWkuSUFjdGlvblR5cGVQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuQ29uZmlndXJhYmxlQ29tcG9zZWRBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuRWRpdGluZ0RvbWFpbkNvbXBvc2VkQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlByb2Nlc3NVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5TdXBwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5ldmVudHMuSUxpYnJhcnlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wcmVmcy5QcmVmZXJlbmNlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5MaWJyYXJ5VUlJbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5SZXNvdXJjZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLkZpbGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5yZWZyZXNoLlJlZnJlc2hKb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLnV0aWwuUGVyc2lzdGVuY2VVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ2FwYWJpbGl0eVBhdHRlcm47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyeVByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NaWxlc3RvbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtCcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC5kb21haW4uVHJhY2VhYmxlQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5VbWFVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi52YWxpZGF0aW9uLkxpYnJhcnlFVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLk1lbnVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5TZXBhcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQnVzeUluZGljYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLkRORDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLkRyb3BUYXJnZXRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLlRyYW5zZmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLk1lbnU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuV2lkZ2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklQYXJ0TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVZpZXdTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hBY3Rpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGFydEluaXRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5CYXNlU2VsZWN0aW9uTGlzdGVuZXJBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuZWRpdG9yLklGb3JtUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pZGUuSUdvdG9NYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5JUHJvcGVydHlTaGVldFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5Qcm9wZXJ0eVNoZWV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLklUYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZUNvbnRyaWJ1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLlRhYmJlZFByb3BlcnR5U2hlZXRQYWdlOwotCi1pbXBvcnQgY29tLmlibS5pY3UudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLS8qKgotICogRWRpdG9yIGZvciBwcm9jZXNzIGF1dGhvcmluZy4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUHJvY2Vzc0VkaXRvciBleHRlbmRzIE1ldGhvZEVsZW1lbnRFZGl0b3IgaW1wbGVtZW50cwotCQlJRWRpdGluZ0RvbWFpblByb3ZpZGVyLCBJTWVudUxpc3RlbmVyLCBJU2VsZWN0aW9uUHJvdmlkZXIsCi0JCUlWaWV3ZXJQcm92aWRlciwgSVRhYmJlZFByb3BlcnR5U2hlZXRQYWdlQ29udHJpYnV0b3IgewotCi0JLyoqCi0JICogVGhlIGVkaXRvciBJRC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFRElUT1JfSUQgPSBQcm9jZXNzRWRpdG9yLmNsYXNzLmdldE5hbWUoKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdPUktGTE9XX0VESVRPUl9JRCA9IEdyYXBoaWNhbFdvcmtmbG93RWRpdG9yLmNsYXNzCi0JCQkuZ2V0TmFtZSgpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNUSVZJVFlfREVUQUlMX0RJQUdSQU1fRURJVE9SX0lEID0gQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9yLmNsYXNzCi0JCQkuZ2V0TmFtZSgpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV1BERVBFTkRFTkNZX0VESVRPUl9JRCA9IEdyYXBoaWNhbFdQRGVwZW5kZW5jeUVkaXRvci5jbGFzcwotCQkJLmdldE5hbWUoKTsKLQotCS8qKiBDb2x1bW4gZGVzY3JpcHRvciBjb25zdGFudHMgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENvbHVtbkRlc2NyaXB0b3IgQ09MX0RFU0NfTkFNRSA9IG5ldyBDb2x1bW5EZXNjcmlwdG9yKAotCQkJSUJTSXRlbVByb3ZpZGVyLkNPTF9OQU1FLCBQcm9jZXNzVXRpbC5nZXRDb2x1bW5EaXNwbGF5TmFtZShJQlNJdGVtUHJvdmlkZXIuQ09MX05BTUUpLAotCQkJMywgMjAwLCB0cnVlLCBDb2x1bW5EZXNjcmlwdG9yLkNFTExfRURJVE9SX1RZUEVfVEVYVCk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENvbHVtbkRlc2NyaXB0b3IgQ09MX0RFU0NfSUQgPSBuZXcgQ29sdW1uRGVzY3JpcHRvcigKLQkJCUlCU0l0ZW1Qcm92aWRlci5DT0xfSUQsIFByb2Nlc3NVdGlsLmdldENvbHVtbkRpc3BsYXlOYW1lKElCU0l0ZW1Qcm92aWRlci5DT0xfSUQpLAotCQkJMCwgNDAsIHRydWUsIENvbHVtbkRlc2NyaXB0b3IuQ0VMTF9FRElUT1JfVFlQRV9OT05FKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29sdW1uRGVzY3JpcHRvciBDT0xfREVTQ19QUkVGSVggPSBuZXcgQ29sdW1uRGVzY3JpcHRvcigKLQkJCUlCU0l0ZW1Qcm92aWRlci5DT0xfUFJFRklYLAotCQkJUHJvY2Vzc1V0aWwuZ2V0Q29sdW1uRGlzcGxheU5hbWUoSUJTSXRlbVByb3ZpZGVyLkNPTF9QUkVGSVgpLCAwLCA4MCwgdHJ1ZSwKLQkJCUNvbHVtbkRlc2NyaXB0b3IuQ0VMTF9FRElUT1JfVFlQRV9URVhUKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29sdW1uRGVzY3JpcHRvciBDT0xfREVTQ19NT0RFTF9JTkZPID0gbmV3IENvbHVtbkRlc2NyaXB0b3IoCi0JCQlJQlNJdGVtUHJvdmlkZXIuQ09MX01PREVMX0lORk8sCi0JCQlQcm9jZXNzVXRpbC5nZXRDb2x1bW5EaXNwbGF5TmFtZShJQlNJdGVtUHJvdmlkZXIuQ09MX01PREVMX0lORk8pLCAwLCAxMjAsIHRydWUsCi0JCQlDb2x1bW5EZXNjcmlwdG9yLkNFTExfRURJVE9SX1RZUEVfTk9ORSk7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDb2x1bW5EZXNjcmlwdG9yIENPTF9ERVNDX1RZUEUgPSBuZXcgQ29sdW1uRGVzY3JpcHRvcigKLQkJCUlCU0l0ZW1Qcm92aWRlci5DT0xfVFlQRSwgUHJvY2Vzc1V0aWwuZ2V0Q29sdW1uRGlzcGxheU5hbWUoSUJTSXRlbVByb3ZpZGVyLkNPTF9UWVBFKSwKLQkJCTAsIDgwLCB0cnVlLCBDb2x1bW5EZXNjcmlwdG9yLkNFTExfRURJVE9SX1RZUEVfTk9ORSk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENvbHVtbkRlc2NyaXB0b3IgQ09MX0RFU0NfUFJFREVDRVNTT1JTID0gbmV3IENvbHVtbkRlc2NyaXB0b3IoCi0JCQlJQlNJdGVtUHJvdmlkZXIuQ09MX1BSRURFQ0VTU09SUywKLQkJCVByb2Nlc3NVdGlsLmdldENvbHVtbkRpc3BsYXlOYW1lKElCU0l0ZW1Qcm92aWRlci5DT0xfUFJFREVDRVNTT1JTKSwgMiwgMTAwLCB0cnVlLAotCQkJQ29sdW1uRGVzY3JpcHRvci5DRUxMX0VESVRPUl9UWVBFX1RFWFQpOyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29sdW1uRGVzY3JpcHRvciBDT0xfREVTQ19JU19SRVBFQVRBQkxFID0gbmV3IENvbHVtbkRlc2NyaXB0b3IoCi0JCQlJQlNJdGVtUHJvdmlkZXIuQ09MX0lTX1JFUEVBVEFCTEUsCi0JCQlQcm9jZXNzVXRpbC5nZXRDb2x1bW5EaXNwbGF5TmFtZShJQlNJdGVtUHJvdmlkZXIuQ09MX0lTX1JFUEVBVEFCTEUpLCAxLCA2MCwgdHJ1ZSwKLQkJCUNvbHVtbkRlc2NyaXB0b3IuQ0VMTF9FRElUT1JfVFlQRV9DSEVDS19CT09MRUFOKTsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENvbHVtbkRlc2NyaXB0b3IgQ09MX0RFU0NfSVNfT05HT0lORyA9IG5ldyBDb2x1bW5EZXNjcmlwdG9yKAotCQkJSUJTSXRlbVByb3ZpZGVyLkNPTF9JU19PTkdPSU5HLAotCQkJUHJvY2Vzc1V0aWwuZ2V0Q29sdW1uRGlzcGxheU5hbWUoSUJTSXRlbVByb3ZpZGVyLkNPTF9JU19PTkdPSU5HKSwgMSwgNjAsIHRydWUsCi0JCQlDb2x1bW5EZXNjcmlwdG9yLkNFTExfRURJVE9SX1RZUEVfQ0hFQ0tfQk9PTEVBTik7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENvbHVtbkRlc2NyaXB0b3IgQ09MX0RFU0NfSVNfRVZFTlRfRFJJVkVOID0gbmV3IENvbHVtbkRlc2NyaXB0b3IoCi0JCQlJQlNJdGVtUHJvdmlkZXIuQ09MX0lTX0VWRU5UX0RSSVZFTiwKLQkJCVByb2Nlc3NVdGlsLmdldENvbHVtbkRpc3BsYXlOYW1lKElCU0l0ZW1Qcm92aWRlci5DT0xfSVNfRVZFTlRfRFJJVkVOKSwgMSwgNjAsIHRydWUsCi0JCQlDb2x1bW5EZXNjcmlwdG9yLkNFTExfRURJVE9SX1RZUEVfQ0hFQ0tfQk9PTEVBTik7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDb2x1bW5EZXNjcmlwdG9yIENPTF9ERVNDX1RFQU0gPSBuZXcgQ29sdW1uRGVzY3JpcHRvcigKLQkJCUlCU0l0ZW1Qcm92aWRlci5DT0xfVEVBTVMsIFByb2Nlc3NVdGlsLmdldENvbHVtbkRpc3BsYXlOYW1lKElCU0l0ZW1Qcm92aWRlci5DT0xfVEVBTVMpLAotCQkJMSwgMTAwLCB0cnVlLCBDb2x1bW5EZXNjcmlwdG9yLkNFTExfRURJVE9SX1RZUEVfVEVYVCk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENvbHVtbkRlc2NyaXB0b3IgQ09MX0RFU0NfRU5UUllfU1RBVEUgPSBuZXcgQ29sdW1uRGVzY3JpcHRvcigKLQkJCUlCU0l0ZW1Qcm92aWRlci5DT0xfRU5UUllfU1RBVEUsCi0JCQlQcm9jZXNzVXRpbC5nZXRDb2x1bW5EaXNwbGF5TmFtZShJQlNJdGVtUHJvdmlkZXIuQ09MX0VOVFJZX1NUQVRFKSwgMSwgNjAsIHRydWUsCi0JCQlDb2x1bW5EZXNjcmlwdG9yLkNFTExfRURJVE9SX1RZUEVfVEVYVCk7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDb2x1bW5EZXNjcmlwdG9yIENPTF9ERVNDX0VYSVRfU1RBVEUgPSBuZXcgQ29sdW1uRGVzY3JpcHRvcigKLQkJCUlCU0l0ZW1Qcm92aWRlci5DT0xfRVhJVF9TVEFURSwKLQkJCVByb2Nlc3NVdGlsLmdldENvbHVtbkRpc3BsYXlOYW1lKElCU0l0ZW1Qcm92aWRlci5DT0xfRVhJVF9TVEFURSksIDEsIDYwLCB0cnVlLAotCQkJQ29sdW1uRGVzY3JpcHRvci5DRUxMX0VESVRPUl9UWVBFX1RFWFQpOyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29sdW1uRGVzY3JpcHRvciBDT0xfREVTQ19QUkVTRU5UQVRJT05fTkFNRSA9IG5ldyBDb2x1bW5EZXNjcmlwdG9yKAotCQkJSUJTSXRlbVByb3ZpZGVyLkNPTF9QUkVTRU5UQVRJT05fTkFNRSwKLQkJCVByb2Nlc3NVdGlsLmdldENvbHVtbkRpc3BsYXlOYW1lKElCU0l0ZW1Qcm92aWRlci5DT0xfUFJFU0VOVEFUSU9OX05BTUUpLCAzLCAyMDAsIHRydWUsCi0JCQlDb2x1bW5EZXNjcmlwdG9yLkNFTExfRURJVE9SX1RZUEVfVEVYVCk7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDb2x1bW5EZXNjcmlwdG9yIENPTF9ERVNDX0RFTElWRVJBQkxFID0gbmV3IENvbHVtbkRlc2NyaXB0b3IoCi0JCQlJQlNJdGVtUHJvdmlkZXIuQ09MX0RFTElWRVJBQkxFLAotCQkJUHJvY2Vzc1V0aWwuZ2V0Q29sdW1uRGlzcGxheU5hbWUoSUJTSXRlbVByb3ZpZGVyLkNPTF9ERUxJVkVSQUJMRSksIDEsIDEwMCwgdHJ1ZSwKLQkJCUNvbHVtbkRlc2NyaXB0b3IuQ0VMTF9FRElUT1JfVFlQRV9URVhUKTsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENvbHVtbkRlc2NyaXB0b3IgQ09MX0RFU0NfSVNfT1BUSU9OQUwgPSBuZXcgQ29sdW1uRGVzY3JpcHRvcigKLQkJCUlCU0l0ZW1Qcm92aWRlci5DT0xfSVNfT1BUSU9OQUwsCi0JCQlQcm9jZXNzVXRpbC5nZXRDb2x1bW5EaXNwbGF5TmFtZShJQlNJdGVtUHJvdmlkZXIuQ09MX0lTX09QVElPTkFMKSwgMSwgNjAsIHRydWUsCi0JCQlDb2x1bW5EZXNjcmlwdG9yLkNFTExfRURJVE9SX1RZUEVfQ0hFQ0tfQk9PTEVBTik7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDb2x1bW5EZXNjcmlwdG9yIENPTF9ERVNDX0lTX1BMQU5ORUQgPSBuZXcgQ29sdW1uRGVzY3JpcHRvcigKLQkJCUlCU0l0ZW1Qcm92aWRlci5DT0xfSVNfUExBTk5FRCwKLQkJCVByb2Nlc3NVdGlsLmdldENvbHVtbkRpc3BsYXlOYW1lKElCU0l0ZW1Qcm92aWRlci5DT0xfSVNfUExBTk5FRCksIDEsIDYwLCB0cnVlLAotCQkJQ29sdW1uRGVzY3JpcHRvci5DRUxMX0VESVRPUl9UWVBFX0NIRUNLX0JPT0xFQU4pOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDb2x1bW5EZXNjcmlwdG9yIENPTF9ERVNDX0hBU19NVUxUSVBMRV9PQ0NVUlJFTkNFUyA9IG5ldyBDb2x1bW5EZXNjcmlwdG9yKAotCQkJSUJTSXRlbVByb3ZpZGVyLkNPTF9IQVNfTVVMVElQTEVfT0NDVVJSRU5DRVMsCi0JCQlQcm9jZXNzVXRpbC5nZXRDb2x1bW5EaXNwbGF5TmFtZShJQlNJdGVtUHJvdmlkZXIuQ09MX0hBU19NVUxUSVBMRV9PQ0NVUlJFTkNFUyksIDEsIDYwLAotCQkJdHJ1ZSwgQ29sdW1uRGVzY3JpcHRvci5DRUxMX0VESVRPUl9UWVBFX0NIRUNLX0JPT0xFQU4pOyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdCU19GT1JNX0lEID0gIndicyI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBX0ZPUk1fSUQgPSAidGJzIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV1BCU19GT1JNX0lEID0gIndwYnMiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05TT0xJREFURURfRk9STV9JRCA9ICJjb25zb2xpZGF0ZWQiOyAvLyROT04tTkxTLTEkCi0JCi0JRGlhZ3JhbUVkaXRvckhlbHBlciBkaWFncmFtRWRpdG9ySGVscGVyID0gbnVsbDsKLQotCS8vIGNoYW5nZSB0aGUgZGVmYXVsdCBvcmRlciBiYXNlZCBvbiAxNTI4NjcgLSBQdWJsaXNoIG9wdGlvbiBhbmQgcHJlZnJlbmNlcwotCS8qIFdCUzogUHJlc2VudGF0aW9uIE5hbWUsIEluZGV4LCBQcmVkZWNlc3NvcnMsIE1vZGVsIEluZm8sIFR5cGUsIFBsYW5uZWQsCi0JCQlSZXBlYXRhYmxlLCBNdWx0aXBsZSBPY2N1cnJlbmNlcywgT25nb2luZywgRXZlbnQtZHJpdmVuLCBPcHRpb25hbAotCQlUQTogUHJlc2VudGF0aW9uIE5hbWUsIE1vZGVsIEluZm8sIFRlYW0sIFR5cGUsIFBsYW5uZWQsIE11bHRpcGxlCi0JCQlPY2N1cnJlbmNlcywgT3B0aW9uYWwKLQkJV29yayBQcm9kdWN0IFVzYWdlOiBQcmVzZW50YXRpb24gTmFtZSwgTW9kZWwgSW5mbywgRW50cnkgU3RhdGUsIEV4aXQgU3RhdGUsIAotCQkJRGVsaXZlcmFibGUsIFR5cGUsIFBsYW5uZWQsIE11bHRpcGxlIE9jY3VycmVuY2VzLCBPcHRpb25hbAotCSovCi0JLy8gSmluaHVhIFhpLCAwOC8yMS8yMDA2Ci0JCi0JLy8gdGhlIGRlZmF1bHQgbGlzdCBtdXN0IGJlIGF2YWlsYWJsZSBpbiB0aGUgbGlicmFyeSBwbHVnaW4gYXMgd2VsbC4KLQkvLyBkdXBsaWNhdGUgZGVmaW5pdGlvbiBmb3Igbm93LCB3aWxsIG5lZWQgdG8gbWVyZ2UgdG9nZXRoZXIgbGF0ZXIKLQkvLyBzZWUgUHJlZmVyZW5jZUNvbnN0YW50cy5vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wcmVmcwotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgTGlzdDxDb2x1bW5EZXNjcmlwdG9yPiBERUZBVUxUX1RCU19DT0xVTU5TID0gQXJyYXlzCi0JCQkuYXNMaXN0KG5ldyBDb2x1bW5EZXNjcmlwdG9yW10gewotCQkJCQlDT0xfREVTQ19QUkVTRU5UQVRJT05fTkFNRSwKLQkJCQkJLy8gQ09MX0RFU0NfSUQsCi0JCQkJCS8vQ09MX0RFU0NfUFJFRklYLCAKLQkJCQkJQ09MX0RFU0NfTU9ERUxfSU5GTywgQ09MX0RFU0NfVEVBTSwgQ09MX0RFU0NfVFlQRSwKLQkJCQkJQ09MX0RFU0NfSVNfUExBTk5FRCwKLQkJCQkJQ09MX0RFU0NfSEFTX01VTFRJUExFX09DQ1VSUkVOQ0VTLCBDT0xfREVTQ19JU19PUFRJT05BTCB9KTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgTGlzdCBERUZBVUxUX1dQQlNfQ09MVU1OUyA9IEFycmF5cwotCQkJLmFzTGlzdChuZXcgQ29sdW1uRGVzY3JpcHRvcltdIHsKLQkJCQkJQ09MX0RFU0NfUFJFU0VOVEFUSU9OX05BTUUsCi0JCQkJCS8vIENPTF9ERVNDX0lELAotCQkJCQkvL0NPTF9ERVNDX1BSRUZJWCwgCi0JCQkJCUNPTF9ERVNDX01PREVMX0lORk8sIENPTF9ERVNDX0VOVFJZX1NUQVRFLAotCQkJCQlDT0xfREVTQ19FWElUX1NUQVRFLCAKLQkJCQkJQ09MX0RFU0NfREVMSVZFUkFCTEUsIENPTF9ERVNDX1RZUEUsIAotCQkJCQlDT0xfREVTQ19JU19QTEFOTkVELCBDT0xfREVTQ19IQVNfTVVMVElQTEVfT0NDVVJSRU5DRVMsIENPTF9ERVNDX0lTX09QVElPTkFMIH0pOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBMaXN0PENvbHVtbkRlc2NyaXB0b3I+IERFRkFVTFRfV0JTX0NPTFVNTlMgPSBBcnJheXMKLQkJCS5hc0xpc3QobmV3IENvbHVtbkRlc2NyaXB0b3JbXSB7IENPTF9ERVNDX1BSRVNFTlRBVElPTl9OQU1FLAotCQkJCQlDT0xfREVTQ19JRCwgCi0JCQkJCS8vQ09MX0RFU0NfUFJFRklYLCAKLQkJCQkJQ09MX0RFU0NfUFJFREVDRVNTT1JTLCBDT0xfREVTQ19NT0RFTF9JTkZPLAotCQkJCQlDT0xfREVTQ19UWVBFLCBDT0xfREVTQ19JU19QTEFOTkVELCAKLQkJCQkJQ09MX0RFU0NfSVNfUkVQRUFUQUJMRSwgQ09MX0RFU0NfSEFTX01VTFRJUExFX09DQ1VSUkVOQ0VTLCBDT0xfREVTQ19JU19PTkdPSU5HLAotCQkJCQlDT0xfREVTQ19JU19FVkVOVF9EUklWRU4sIENPTF9ERVNDX0lTX09QVElPTkFMCi0JCQkJCSB9KTsKLQotCSAKLQlwdWJsaWMgc3RhdGljIGZpbmFsIExpc3Q8Q29sdW1uRGVzY3JpcHRvcj4gQUxMX1dCU19DT0xVTU5TID0gbmV3IEFycmF5TGlzdDxDb2x1bW5EZXNjcmlwdG9yPigKLQkJCURFRkFVTFRfV0JTX0NPTFVNTlMpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBMaXN0PENvbHVtbkRlc2NyaXB0b3I+IEFMTF9UQlNfQ09MVU1OUyA9IG5ldyBBcnJheUxpc3Q8Q29sdW1uRGVzY3JpcHRvcj4oCi0JCQlERUZBVUxUX1RCU19DT0xVTU5TKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgTGlzdDxDb2x1bW5EZXNjcmlwdG9yPiBBTExfV1BCU19DT0xVTU5TID0gbmV3IEFycmF5TGlzdDxDb2x1bW5EZXNjcmlwdG9yPigKLQkJCURFRkFVTFRfV1BCU19DT0xVTU5TKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgTWFwPFN0cmluZywgQ29sdW1uRGVzY3JpcHRvcj4gaWRUb0NvbHVtbkRlc2NyaXB0b3JNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIENvbHVtbkRlc2NyaXB0b3I+KCk7Ci0Jc3RhdGljIHsKLQkJQUxMX1dCU19DT0xVTU5TLmFkZChDT0xfREVTQ19QUkVGSVgpOwotCQlBTExfVEJTX0NPTFVNTlMuYWRkKENPTF9ERVNDX1BSRUZJWCk7Ci0JCUFMTF9XUEJTX0NPTFVNTlMuYWRkKENPTF9ERVNDX1BSRUZJWCk7Ci0JCQotCQlQcm9jZXNzRWRpdG9yLmlkVG9Db2x1bW5EZXNjcmlwdG9yTWFwLnB1dChDT0xfREVTQ19OQU1FLmlkLAotCQkJCUNPTF9ERVNDX05BTUUpOwotCQlQcm9jZXNzRWRpdG9yLmlkVG9Db2x1bW5EZXNjcmlwdG9yTWFwLnB1dChDT0xfREVTQ19JRC5pZCwgQ09MX0RFU0NfSUQpOwotCQlQcm9jZXNzRWRpdG9yLmlkVG9Db2x1bW5EZXNjcmlwdG9yTWFwLnB1dChDT0xfREVTQ19QUkVGSVguaWQsCi0JCQkJQ09MX0RFU0NfUFJFRklYKTsKLQkJUHJvY2Vzc0VkaXRvci5pZFRvQ29sdW1uRGVzY3JpcHRvck1hcC5wdXQoQ09MX0RFU0NfTU9ERUxfSU5GTy5pZCwKLQkJCQlDT0xfREVTQ19NT0RFTF9JTkZPKTsKLQkJUHJvY2Vzc0VkaXRvci5pZFRvQ29sdW1uRGVzY3JpcHRvck1hcC5wdXQoQ09MX0RFU0NfVFlQRS5pZCwKLQkJCQlDT0xfREVTQ19UWVBFKTsKLQkJUHJvY2Vzc0VkaXRvci5pZFRvQ29sdW1uRGVzY3JpcHRvck1hcC5wdXQoQ09MX0RFU0NfUFJFREVDRVNTT1JTLmlkLAotCQkJCUNPTF9ERVNDX1BSRURFQ0VTU09SUyk7Ci0JCVByb2Nlc3NFZGl0b3IuaWRUb0NvbHVtbkRlc2NyaXB0b3JNYXAucHV0KENPTF9ERVNDX0lTX1JFUEVBVEFCTEUuaWQsCi0JCQkJQ09MX0RFU0NfSVNfUkVQRUFUQUJMRSk7Ci0JCVByb2Nlc3NFZGl0b3IuaWRUb0NvbHVtbkRlc2NyaXB0b3JNYXAucHV0KENPTF9ERVNDX0lTX09OR09JTkcuaWQsCi0JCQkJQ09MX0RFU0NfSVNfT05HT0lORyk7Ci0JCVByb2Nlc3NFZGl0b3IuaWRUb0NvbHVtbkRlc2NyaXB0b3JNYXAucHV0KENPTF9ERVNDX0lTX0VWRU5UX0RSSVZFTi5pZCwKLQkJCQlDT0xfREVTQ19JU19FVkVOVF9EUklWRU4pOwotCQlQcm9jZXNzRWRpdG9yLmlkVG9Db2x1bW5EZXNjcmlwdG9yTWFwLnB1dChDT0xfREVTQ19URUFNLmlkLAotCQkJCUNPTF9ERVNDX1RFQU0pOwotCQlQcm9jZXNzRWRpdG9yLmlkVG9Db2x1bW5EZXNjcmlwdG9yTWFwLnB1dChDT0xfREVTQ19FTlRSWV9TVEFURS5pZCwKLQkJCQlDT0xfREVTQ19FTlRSWV9TVEFURSk7Ci0JCVByb2Nlc3NFZGl0b3IuaWRUb0NvbHVtbkRlc2NyaXB0b3JNYXAucHV0KENPTF9ERVNDX0VYSVRfU1RBVEUuaWQsCi0JCQkJQ09MX0RFU0NfRVhJVF9TVEFURSk7Ci0JCVByb2Nlc3NFZGl0b3IuaWRUb0NvbHVtbkRlc2NyaXB0b3JNYXAucHV0KAotCQkJCUNPTF9ERVNDX1BSRVNFTlRBVElPTl9OQU1FLmlkLCBDT0xfREVTQ19QUkVTRU5UQVRJT05fTkFNRSk7Ci0JCVByb2Nlc3NFZGl0b3IuaWRUb0NvbHVtbkRlc2NyaXB0b3JNYXAucHV0KENPTF9ERVNDX0RFTElWRVJBQkxFLmlkLAotCQkJCUNPTF9ERVNDX0RFTElWRVJBQkxFKTsKLQkJUHJvY2Vzc0VkaXRvci5pZFRvQ29sdW1uRGVzY3JpcHRvck1hcC5wdXQoQ09MX0RFU0NfSVNfT1BUSU9OQUwuaWQsCi0JCQkJQ09MX0RFU0NfSVNfT1BUSU9OQUwpOwotCQlQcm9jZXNzRWRpdG9yLmlkVG9Db2x1bW5EZXNjcmlwdG9yTWFwLnB1dChDT0xfREVTQ19JU19QTEFOTkVELmlkLAotCQkJCUNPTF9ERVNDX0lTX1BMQU5ORUQpOwotCQlQcm9jZXNzRWRpdG9yLmlkVG9Db2x1bW5EZXNjcmlwdG9yTWFwLnB1dCgKLQkJCQlDT0xfREVTQ19IQVNfTVVMVElQTEVfT0NDVVJSRU5DRVMuaWQsCi0JCQkJQ09MX0RFU0NfSEFTX01VTFRJUExFX09DQ1VSUkVOQ0VTKTsKLQotCQlBTExfV0JTX0NPTFVNTlMuYWRkKENPTF9ERVNDX05BTUUpOwotCQlBTExfVEJTX0NPTFVNTlMuYWRkKENPTF9ERVNDX05BTUUpOwotCQlBTExfV1BCU19DT0xVTU5TLmFkZChDT0xfREVTQ19OQU1FKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGJvb2xlYW4gYWRkQWRhcHRlckZhY3RvcnlMaXN0ZW5lcnMgPSBmYWxzZTsKLQotCXByaXZhdGUgY2xhc3MgUHJvY2Vzc0VkaXRvckRyb3BBZGFwdGVyIGV4dGVuZHMKLQkJCUVkaXRpbmdEb21haW5UYWJsZVRyZWVWaWV3ZXJEcm9wQWRhcHRlciB7Ci0KLQkJLyoqCi0JCSAqIEBwYXJhbSBkb21haW4KLQkJICogQHBhcmFtIHZpZXdlcgotCQkgKi8KLQkJcHVibGljIFByb2Nlc3NFZGl0b3JEcm9wQWRhcHRlcihFZGl0aW5nRG9tYWluIGRvbWFpbiwgVmlld2VyIHZpZXdlcikgewotCQkJc3VwZXIoZG9tYWluLCB2aWV3ZXIpOwotCQl9Ci0KLQkJLyoqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZG5kLkVkaXRpbmdEb21haW5UYWJsZVRyZWVWaWV3ZXJEcm9wQWRhcHRlciNnZXREcm9wVGFyZ2V0KG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLldpZGdldCkKLQkJICovCi0JCXByb3RlY3RlZCBPYmplY3QgZ2V0RHJvcFRhcmdldChXaWRnZXQgaXRlbSkgewotCQkJT2JqZWN0IHRhcmdldCA9IHN1cGVyLmdldERyb3BUYXJnZXQoaXRlbSk7Ci0JCQlpZiAodGFyZ2V0ID09IG51bGwgJiYgc2VsZWN0ZWRQcm9jZXNzQ29tcG9uZW50ICE9IG51bGwpIHsKLQkJCQl0YXJnZXQgPSBzZWxlY3RlZFByb2Nlc3NDb21wb25lbnQuZ2V0UHJvY2VzcygpOwotCQkJfQotCQkJcmV0dXJuIHRhcmdldDsKLQkJfQotCi0JCS8qKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZG5kLkVkaXRpbmdEb21haW5UYWJsZVRyZWVWaWV3ZXJEcm9wQWRhcHRlciNkcm9wKG9yZy5lY2xpcHNlLnN3dC5kbmQuRHJvcFRhcmdldEV2ZW50KQotCQkgKi8KLQkJcHVibGljIHZvaWQgZHJvcChEcm9wVGFyZ2V0RXZlbnQgZXZlbnQpIHsKLQkJCWlmIChjdXJyZW50Vmlld2VyIGluc3RhbmNlb2YgSUFjdGlvblR5cGVQcm92aWRlcikgewotCQkJCSgoSUFjdGlvblR5cGVQcm92aWRlcikgY3VycmVudFZpZXdlcikuc2V0SW5wdXREYXRhKG5ldyBQb2ludCgKLQkJCQkJCWV2ZW50LngsIGV2ZW50LnkpKTsKLQkJCX0KLQkJCXN1cGVyLmRyb3AoZXZlbnQpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIENvbXBvc2VkQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3Rvcnk7Ci0KLQlwcm90ZWN0ZWQgQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluIGVkaXRpbmdEb21haW47Ci0KLQlwcm90ZWN0ZWQgVmlld2VyIGN1cnJlbnRWaWV3ZXI7Ci0KLQlwcm90ZWN0ZWQgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciBzZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci0KLQlwcm90ZWN0ZWQgQ29sbGVjdGlvbiBzZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXJzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JcHJvdGVjdGVkIElTZWxlY3Rpb24gdmlld1NlbGVjdGlvbjsKLQotCXByb3RlY3RlZCBQcm9jZXNzQ29tcG9uZW50IHNlbGVjdGVkUHJvY2Vzc0NvbXBvbmVudDsKLQotCXByb3RlY3RlZCBQcm9jZXNzIHNlbGVjdGVkUHJvY2VzczsKLQotCXByb3RlY3RlZCBBZGFwdGVyIHByb2Nlc3NDb21wb25lbnRMaXN0ZW5lciA9IG5ldyBBZGFwdGVySW1wbCgpIHsKLQkJLyoqCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVySW1wbCNub3RpZnlDaGFuZ2VkKG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbikKLQkJICovCi0JCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG1zZykgewotCQkJc3dpdGNoIChtc2cuZ2V0RmVhdHVyZUlEKFByb2Nlc3NDb21wb25lbnQuY2xhc3MpKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfX05BTUU6Ci0JCQkJU3RyaW5nIG5hbWUgPSBtc2cuZ2V0TmV3U3RyaW5nVmFsdWUoKTsKLQkJCQlpZiAobmFtZSA9PSBudWxsKQotCQkJCQluYW1lID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCQlzZXRQYXJ0TmFtZShuYW1lKTsKLQotCQkJCWlmIChwYWdlcyAhPSBudWxsKSB7Ci0JCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHBhZ2VzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQkJT2JqZWN0IHBhZ2UgPSBpdGVyLm5leHQoKTsKLQkJCQkJCWlmIChwYWdlIGluc3RhbmNlb2YgUHJvY2Vzc0Rlc2NyaXB0aW9uKSB7Ci0JCQkJCQkJKChQcm9jZXNzRGVzY3JpcHRpb24pIHBhZ2UpCi0JCQkJCQkJCQkucmVmcmVzaEVsZW1lbnROYW1lKG5hbWUpOwotCQkJCQkJfQotCi0JCQkJCX0KLQkJCQl9Ci0KLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCX07Ci0KLQlwcm90ZWN0ZWQgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIgcHJvcENvbnRlbnRQcm92aWRlcjsKLQotCXByb3RlY3RlZCBNZXRob2RDb25maWd1cmF0aW9uIGN1cnJlbnRDb25maWc7Ci0KLQlwcm90ZWN0ZWQgSUxpYnJhcnlDaGFuZ2VMaXN0ZW5lciBsaWJyYXJ5TGlzdGVuZXIgPSBuZXcgSUxpYnJhcnlDaGFuZ2VMaXN0ZW5lcigpIHsKLQotCQlwdWJsaWMgdm9pZCBsaWJyYXJ5Q2hhbmdlZChpbnQgb3B0aW9uLCBDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJCXN3aXRjaCAob3B0aW9uKSB7Ci0JCQkvLyBjYXNlIElMaWJyYXJ5Q2hhbmdlTGlzdGVuZXIuT1BUSU9OX0xPQURFRDoKLQkJCS8vIC8vIGNsb3NlIGFsbCBvcGVuIGRpYWdyYW0gZWRpdG9ycwotCQkJLy8gLy8KLQkJCS8vIElFZGl0b3JSZWZlcmVuY2VbXSBlZGl0b3JSZWZzID0KLQkJCS8vIGdldFNpdGUoKS5nZXRQYWdlKCkuZ2V0RWRpdG9yUmVmZXJlbmNlcygpOwotCQkJLy8gZm9yIChpbnQgaSA9IDA7IGkgPCBlZGl0b3JSZWZzLmxlbmd0aDsgaSsrKSB7Ci0JCQkvLyBJRWRpdG9yUGFydCBlZGl0b3JQYXJ0ID0gZWRpdG9yUmVmc1tpXS5nZXRFZGl0b3IoZmFsc2UpOwotCQkJLy8gaWYoZWRpdG9yUGFydCBpbnN0YW5jZW9mIEdyYXBoaWNhbFdvcmtmbG93RWRpdG9yCi0JCQkvLyB8fCBlZGl0b3JQYXJ0IGluc3RhbmNlb2YgUHJvY2Vzc0Zvcm1FZGl0b3IpIHsKLQkJCS8vIGdldFNpdGUoKS5nZXRQYWdlKCkuY2xvc2VFZGl0b3IoZWRpdG9yUGFydCwgdHJ1ZSk7Ci0JCQkvLyB9Ci0JCQkvLyB9Ci0JCQkvLyBnZXRTaXRlKCkuZ2V0UGFnZSgpLmNsb3NlRWRpdG9yKFByb2Nlc3NGb3JtRWRpdG9yLnRoaXMsIHRydWUpOwotCQkJY2FzZSBJTGlicmFyeUNoYW5nZUxpc3RlbmVyLk9QVElPTl9DSEFOR0VEOiB7Ci0JCQkJaWYgKGNvbGxlY3Rpb24gIT0gbnVsbCAmJiBjb2xsZWN0aW9uLmNvbnRhaW5zKGN1cnJlbnRDb25maWcpKSB7Ci0JCQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gUHJvY2Vzc0F1dGhvcmluZ0NvbmZpZ3VyYXRvci5JTlNUQU5DRQotCQkJCQkJCS5nZXRNZXRob2RDb25maWd1cmF0aW9uKCk7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlQcm9jZXNzQXV0aG9yaW5nQ29uZmlndXJhdG9yLklOU1RBTkNFCi0JCQkJCQkJCS5zZXRNZXRob2RDb25maWd1cmF0aW9uKGN1cnJlbnRDb25maWcpOwotCQkJCQkJcmVmcmVzaEFsbCgpOwotCQkJCQl9IGZpbmFsbHkgewotCQkJCQkJUHJvY2Vzc0F1dGhvcmluZ0NvbmZpZ3VyYXRvci5JTlNUQU5DRQotCQkJCQkJCQkuc2V0TWV0aG9kQ29uZmlndXJhdGlvbihjb25maWcpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJfQotCQkJCS8vIGhhbmRsZWQgYnkgbGliU3ZjTGlzdGVuZXIKLQkJCQkvLyBjYXNlIElMaWJyYXJ5Q2hhbmdlTGlzdGVuZXIuT1BUSU9OX0NPTkZJR1VSQVRJT05fU0VMRUNURUQ6IHsKLQkJCQkvLyBjb25maWdDaGFuZ2VkKCk7Ci0JCQkJLy8gYnJlYWs7Ci0JCQkJLy8gfQotCi0JCQl9Ci0KLQkJfQotCi0JfTsKLQotCXByb3RlY3RlZCBJTGlicmFyeVNlcnZpY2VMaXN0ZW5lciBsaWJTdmNMaXN0ZW5lciA9IG5ldyBJTGlicmFyeVNlcnZpY2VMaXN0ZW5lcigpIHsKLQotCQlwdWJsaWMgdm9pZCBjb25maWd1cmF0aW9uU2V0KE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0JCQljb25maWdDaGFuZ2VkKCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBsaWJyYXJ5Q2xvc2VkKE1ldGhvZExpYnJhcnkgbGlicmFyeSkgewotCQl9Ci0KLQkJcHVibGljIHZvaWQgbGlicmFyeUNyZWF0ZWQoTWV0aG9kTGlicmFyeSBsaWJyYXJ5KSB7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBsaWJyYXJ5T3BlbmVkKE1ldGhvZExpYnJhcnkgbGlicmFyeSkgewotCQl9Ci0KLQkJcHVibGljIHZvaWQgbGlicmFyeVJlb3BlbmVkKE1ldGhvZExpYnJhcnkgbGlicmFyeSkgewotCQl9Ci0KLQkJcHVibGljIHZvaWQgbGlicmFyeVNldChNZXRob2RMaWJyYXJ5IGxpYnJhcnkpIHsKLQkJfQotCi0JfTsKLQotCXByb3RlY3RlZCBQcm9jZXNzQnJlYWtkb3duU3RydWN0dXJlRm9ybVBhZ2UgV0JTVGFiOwotCi0JcHJvdGVjdGVkIFByb2Nlc3NCcmVha2Rvd25TdHJ1Y3R1cmVGb3JtUGFnZSBPQlNUYWI7Ci0KLQlwcm90ZWN0ZWQgUHJvY2Vzc0JyZWFrZG93blN0cnVjdHVyZUZvcm1QYWdlIFBCU1RhYjsKLQotCXByb3RlY3RlZCBQcm9jZXNzQnJlYWtkb3duU3RydWN0dXJlRm9ybVBhZ2UgcHJvY1RhYjsKLQotCXByb3RlY3RlZCBDb2xsZWN0aW9uPFByb2Nlc3NCcmVha2Rvd25TdHJ1Y3R1cmVGb3JtUGFnZT4gZXh0ZW5zaW9uVGFicyA9IG51bGw7Ci0KLQlwcm90ZWN0ZWQgUHJvY2Vzc0JyZWFrZG93blN0cnVjdHVyZUZvcm1QYWdlW10gYnNQYWdlczsKLQotCXByb3RlY3RlZCBFUEZQcm9wZXJ0eVNoZWV0UGFnZSBwcm9wZXJ0eVNoZWV0UGFnZTsKLQotCXB1YmxpYyBDb2xsZWN0aW9uIHJlc291cmNlc1RvU2F2ZSA9IG5ldyBBcnJheUxpc3QoKTsKLQotCS8vIHByaXZhdGUgYm9vbGVhbiBmaXJzdEV4cGFuZGVkID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBhIGxpc3RlbmVyIHRoYXQgaXMgaW50ZXJlc3RlZCBpbiBwYXJ0IGFjdGl2YXRpb24gZXZlbnRzLgotCSAqLwotCXByb3RlY3RlZCBJUGFydExpc3RlbmVyIHBhcnRBY3RpdmF0aW9uTGlzdGVuZXIgPSBuZXcgSVBhcnRMaXN0ZW5lcigpIHsKLQotCQlwdWJsaWMgdm9pZCBwYXJ0QWN0aXZhdGVkKElXb3JrYmVuY2hQYXJ0IHBhcnQpIHsKLQkJCWlmIChwYXJ0IGluc3RhbmNlb2YgUHJvcGVydHlTaGVldCkgewotCQkJCXJlbW92ZVByb3BlcnRpZXNEcm9wRG93bk1lbnUocGFydCk7Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBwYXJ0QnJvdWdodFRvVG9wKElXb3JrYmVuY2hQYXJ0IHBhcnQpIHsKLQkJCS8vIGlmKCFmaXJzdEV4cGFuZGVkKSB7Ci0JCQkvLyBzeW5jaHJvbml6ZWQoUHJvY2Vzc0Zvcm1FZGl0b3IudGhpcykgewotCQkJLy8gaWYoZmlyc3RFeHBhbmRlZCkgewotCQkJLy8gKChBYnN0cmFjdFRyZWVWaWV3ZXIpIFdCU1RhYi5nZXRWaWV3ZXIoKSkuZXhwYW5kQWxsKCk7Ci0JCQkvLyAoKEFic3RyYWN0VHJlZVZpZXdlcikgT0JTVGFiLmdldFZpZXdlcigpKS5leHBhbmRBbGwoKTsKLQkJCS8vICgoQWJzdHJhY3RUcmVlVmlld2VyKSBQQlNUYWIuZ2V0Vmlld2VyKCkpLmV4cGFuZEFsbCgpOwotCQkJLy8gZmlyc3RFeHBhbmRlZCA9IHRydWU7Ci0JCQkvLyB9Ci0JCQkvLyB9Ci0JCQkvLyB9Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBwYXJ0Q2xvc2VkKElXb3JrYmVuY2hQYXJ0IHBhcnQpIHsKLQkJCWlmIChwYXJ0IGluc3RhbmNlb2YgUHJvcGVydHlTaGVldCkgewotCQkJCXByb3BlcnR5U2hlZXRQYWdlID0gbnVsbDsKLQkJCX0KLQkJfQotCi0JCXB1YmxpYyB2b2lkIHBhcnREZWFjdGl2YXRlZChJV29ya2JlbmNoUGFydCBwYXJ0KSB7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBwYXJ0T3BlbmVkKElXb3JrYmVuY2hQYXJ0IHBhcnQpIHsKLQkJCWlmIChwYXJ0IGluc3RhbmNlb2YgUHJvcGVydHlTaGVldCkgewotCQkJCXJlbW92ZVByb3BlcnRpZXNEcm9wRG93bk1lbnUocGFydCk7Ci0JCQl9Ci0JCX0KLQl9OwotCi0JcHJvdGVjdGVkIElQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyV3JhcHBlciBwcmVmU3RvcmVMaXN0ZW5lcjsKLQotCS8vIHByaXZhdGUgUHJvY2Vzc0NvbmZpZ3VyYXRvciBjb25maWd1cmF0b3I7Ci0KLQlwcm90ZWN0ZWQgU3VwcHJlc3Npb24gc3VwcHJlc3Npb247Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBzeW5jaHJvbml6aW5nU2VsZWN0aW9uOwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaW5wdXRDaGFuZ2VkOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJQWRhcHRlckZhY3RvcnlQcm92aWRlciBhZGFwdGVyRmFjdG9yeVByb3ZpZGVyID0gbmV3IElBZGFwdGVyRmFjdG9yeVByb3ZpZGVyKCkgewotCi0JCXB1YmxpYyBBZGFwdGVyRmFjdG9yeSBnZXRDQlNBZGFwdGVyRmFjdG9yeSgpIHsKLQkJCXJldHVybiBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRS5nZXRQcm9jZXNzQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpOwotCQl9Ci0KLQkJcHVibGljIEFkYXB0ZXJGYWN0b3J5IGdldFRCU0FkYXB0ZXJGYWN0b3J5KCkgewotCQkJcmV0dXJuIFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFLmdldE9CU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCk7Ci0JCX0KLQotCQlwdWJsaWMgQWRhcHRlckZhY3RvcnkgZ2V0V0JTQWRhcHRlckZhY3RvcnkoKSB7Ci0JCQlyZXR1cm4gVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UuZ2V0V0JTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKTsKLQkJfQotCi0JCXB1YmxpYyBBZGFwdGVyRmFjdG9yeSBnZXRXUEJTQWRhcHRlckZhY3RvcnkoKSB7Ci0JCQlyZXR1cm4gVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UuZ2V0UEJTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKTsKLQkJfQotCX07Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLk1ldGhvZEVsZW1lbnRFZGl0b3IjaXNWYWxpZGF0ZVJlc291cmNlc0JlZm9yZVNhdmVSZXF1aXJlZCgpCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNWYWxpZGF0ZVJlc291cmNlc0JlZm9yZVNhdmVSZXF1aXJlZCgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5NZXRob2RFbGVtZW50RWRpdG9yI2NyZWF0ZVZhbGlkYXRlUmVzb3VyY2VBY3Rpb24oKQotCSAqLwotCXByb3RlY3RlZCBMaWJyYXJ5VmFsaWRhdGVBY3Rpb24gY3JlYXRlVmFsaWRhdGVSZXNvdXJjZUFjdGlvbigpIHsKLQkJTGlicmFyeVZhbGlkYXRlQWN0aW9uIHZhbGlkYXRlQWN0aW9uID0gc3VwZXIuY3JlYXRlVmFsaWRhdGVSZXNvdXJjZUFjdGlvbigpOwotCQl2YWxpZGF0ZUFjdGlvbi5wdXRDb250ZXh0RGF0YShMaWJyYXJ5RVZhbGlkYXRvci5DVFhfQURBUFRFUl9GQUNUT1JZX1BST1ZJREVSLAotCQkJCWFkYXB0ZXJGYWN0b3J5UHJvdmlkZXIpOwotCQlyZXR1cm4gdmFsaWRhdGVBY3Rpb247Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGlucHV0Q2hhbmdlZChPYmplY3QgbmV3SW5wdXQpIHsKLQkJaW5wdXRDaGFuZ2VkID0gZmFsc2U7Ci0JCWlmICghKG5ld0lucHV0IGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudEVkaXRvcklucHV0KSkKLQkJCXJldHVybjsKLQkJTWV0aG9kRWxlbWVudEVkaXRvcklucHV0IG1ldGhvZEVsZW1lbnRJbnB1dCA9IChNZXRob2RFbGVtZW50RWRpdG9ySW5wdXQpIG5ld0lucHV0OwotCi0JCU9iamVjdCBvYmogPSBtZXRob2RFbGVtZW50SW5wdXQuZ2V0TWV0aG9kRWxlbWVudCgpOwotCQlpZiAob2JqIGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkgewotCQkJc2VsZWN0ZWRQcm9jZXNzQ29tcG9uZW50ID0gKFByb2Nlc3NDb21wb25lbnQpIG9iajsKLQkJCXNlbGVjdGVkUHJvY2VzcyA9IGdldFRvcEJyZWFrZG93bkVsZW1lbnQoc2VsZWN0ZWRQcm9jZXNzQ29tcG9uZW50KTsKLQkJCXN1cHByZXNzaW9uID0gZ2V0U3VwcHJlc3Npb24oc2VsZWN0ZWRQcm9jZXNzKTsKLQotCQkJLy8gZm9yIChJdGVyYXRvciBpdGVyID0gcGFnZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkvLyBPYmplY3QgcGFnZSA9IGl0ZXIubmV4dCgpOwotCQkJLy8gaWYocGFnZSBpbnN0YW5jZW9mIFByb2Nlc3NCcmVha2Rvd25TdHJ1Y3R1cmVGb3JtUGFnZSkgewotCQkJLy8gKChQcm9jZXNzQnJlYWtkb3duU3RydWN0dXJlRm9ybVBhZ2UpcGFnZSkuc2V0UHJvY2Vzcyhwcm9jKTsKLQkJCS8vIH0KLQkJCS8vIH0KLQotCQkJaWYgKFdCU1RhYiAhPSBudWxsKSB7Ci0JCQkJV0JTVGFiLnNldFByb2Nlc3Moc2VsZWN0ZWRQcm9jZXNzKTsKLQkJCX0KLQkJCQotCQkJaWYgKCBPQlNUYWIgIT0gbnVsbCApIHsKLQkJCQlPQlNUYWIuc2V0UHJvY2VzcyhzZWxlY3RlZFByb2Nlc3MpOwotCQkJfQotCQkJCi0JCQlpZiAoIFBCU1RhYiAhPSBudWxsICkgewotCQkJCVBCU1RhYi5zZXRQcm9jZXNzKHNlbGVjdGVkUHJvY2Vzcyk7Ci0JCQl9Ci0JCQkKLQkJCWlmICggcHJvY1RhYiAhPSBudWxsICkgewotCQkJCXByb2NUYWIuc2V0UHJvY2VzcyhzZWxlY3RlZFByb2Nlc3MpOwotCQkJfQotCQkJCi0JCQlpZiAoZXh0ZW5zaW9uVGFicyAhPSBudWxsKSB7Ci0JCQkJZm9yIChQcm9jZXNzQnJlYWtkb3duU3RydWN0dXJlRm9ybVBhZ2UgZXh0UGFnZSA6IGV4dGVuc2lvblRhYnMpIHsKLQkJCQkJZXh0UGFnZS5zZXRQcm9jZXNzKHNlbGVjdGVkUHJvY2Vzcyk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBQcm9jZXNzICBnZXRUb3BCcmVha2Rvd25FbGVtZW50KFByb2Nlc3NDb21wb25lbnQgc2VsZWN0ZWRQcm9jZXNzQ29tcG9uZW50KSB7Ci0JCXJldHVybiAoUHJvY2VzcykgUHJvY2Vzc1V0aWwuZ2V0VG9wQnJlYWtkb3duRWxlbWVudChzZWxlY3RlZFByb2Nlc3NDb21wb25lbnQpOwotCX0KLQkKLQkgICAvKioKLSAgICAgKiBAcGFyYW0gc2VsZWN0ZWRQcm9jZXNzCi0gICAgICogQHJldHVybgotICAgICAqLwotICAgIHByb3RlY3RlZCBTdXBwcmVzc2lvbiBnZXRTdXBwcmVzc2lvbihQcm9jZXNzIHNlbGVjdGVkUHJvY2VzcykgewotICAgICAgICByZXR1cm4gU3VwcHJlc3Npb24uZ2V0U3VwcHJlc3Npb24oc2VsZWN0ZWRQcm9jZXNzKTsKLSAgICB9Ci0KLSAgICAKLQkvLyBwcml2YXRlIFN0cmluZyBnZXRUaXRsZVByZWZpeCgpIHsKLQkvLyBJRWRpdG9ySW5wdXQgaW5wdXQgPSBnZXRFZGl0b3JJbnB1dCgpOwotCS8vIGlmIChpbnB1dCBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnRFZGl0b3JJbnB1dCkgewotCS8vIE9iamVjdCBvYmogPSAoKE1ldGhvZEVsZW1lbnRFZGl0b3JJbnB1dCkgaW5wdXQpLmdldE1ldGhvZEVsZW1lbnQoKTsKLQkvLyBpZiAob2JqIGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkgewotCS8vIFByb2Nlc3NDb21wb25lbnQgcGMgPSAoUHJvY2Vzc0NvbXBvbmVudCkgb2JqOwotCS8vIFByb2Nlc3MgcHJvYyA9IHBjLmdldFByb2Nlc3MoKTsKLQkvLyBpZiAocHJvYyBpbnN0YW5jZW9mIENhcGFiaWxpdHlQYXR0ZXJuKSB7Ci0JLy8gcmV0dXJuIExpYnJhcnlVSVRleHQuVEVYVF9DQVBBQklMSVRZX1BBVFRFUk47Ci0JLy8gfSBlbHNlIGlmIChwcm9jIGluc3RhbmNlb2YgRGVsaXZlcnlQcm9jZXNzKSB7Ci0JLy8gcmV0dXJuIExpYnJhcnlVSVRleHQuVEVYVF9ERUxJVkVSWV9QUk9DRVNTOwotCS8vIH0gZWxzZSBpZiAocHJvYyBpbnN0YW5jZW9mIFByb2Nlc3NDb250cmlidXRpb24pIHsKLQkvLyByZXR1cm4gTGlicmFyeVVJVGV4dC5URVhUX1BST0NFU1NfQ09OVFJJQlVUSU9OOwotCS8vIH0KLQkvLyB9Ci0JLy8gfQotCS8vIHJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcwotCS8vIC5nZXRTdHJpbmcoIkF1dGhvcmluZ1VJLlByb2Nlc3NFZGl0b3IuVGl0bGUiKTsgLy8kTk9OLU5MUy0xJAotCS8vIH0KLQotCXByb3RlY3RlZCBJbWFnZSBnZXRQcm9jVGl0bGVJbWFnZSgpIHsKLQkJSUVkaXRvcklucHV0IGlucHV0ID0gZ2V0RWRpdG9ySW5wdXQoKTsKLQkJaWYgKGlucHV0IGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudEVkaXRvcklucHV0KSB7Ci0JCQlPYmplY3Qgb2JqID0gKChNZXRob2RFbGVtZW50RWRpdG9ySW5wdXQpIGlucHV0KS5nZXRNZXRob2RFbGVtZW50KCk7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkgewotCQkJCVByb2Nlc3NDb21wb25lbnQgcGMgPSAoUHJvY2Vzc0NvbXBvbmVudCkgb2JqOwotCQkJCVByb2Nlc3MgcHJvYyA9IHBjLmdldFByb2Nlc3MoKTsKLQkJCQlpZiAocHJvYyBpbnN0YW5jZW9mIENhcGFiaWxpdHlQYXR0ZXJuKSB7Ci0JCQkJCXJldHVybiBMaWJyYXJ5VUlJbWFnZXMuSU1HX0NBUEFCSUxJVFlfUEFUVEVSTjsKLQkJCQl9IGVsc2UgaWYgKHByb2MgaW5zdGFuY2VvZiBEZWxpdmVyeVByb2Nlc3MpIHsKLQkJCQkJcmV0dXJuIExpYnJhcnlVSUltYWdlcy5JTUdfREVMSVZFUllfUFJPQ0VTUzsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIExpYnJhcnlVSUltYWdlcy5JTUdfUFJPQ0VTUzsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgUHJvcGVydGllcyB2aWV3IGRyb3AgZG93biBtZW51Ci0JICogCi0JICogQHBhcmFtIHBhcnQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVQcm9wZXJ0aWVzRHJvcERvd25NZW51KElXb3JrYmVuY2hQYXJ0IHBhcnQpIHsKLQkJaWYgKHBhcnQgaW5zdGFuY2VvZiBQcm9wZXJ0eVNoZWV0KSB7Ci0JCQlJVmlld1NpdGUgdmlldyA9ICgoUHJvcGVydHlTaGVldCkgcGFydCkuZ2V0Vmlld1NpdGUoKTsKLQotCQkJSU1lbnVNYW5hZ2VyIG1lbnVNZ3IgPSB2aWV3LmdldEFjdGlvbkJhcnMoKS5nZXRNZW51TWFuYWdlcigpOwotCQkJLy8gSUNvbnRyaWJ1dGlvbkl0ZW1bXSBpdGVtcyA9IG1lbnVNZ3IuZ2V0SXRlbXMoKTsKLQkJCS8vIGZvciAoaW50IGk9MDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKQotCQkJLy8gewotCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJJZCA9IiArIGkgKyAiICIgKyBpdGVtc1tpXS5nZXRJZCgpICsgIiQiKTsKLQkJCS8vIH0KLQkJCW1lbnVNZ3IucmVtb3ZlQWxsKCk7Ci0JCQltZW51TWdyLnVwZGF0ZUFsbCh0cnVlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuZm9ybXMuZWRpdG9yLkZvcm1FZGl0b3IjaW5pdChvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZSwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElFZGl0b3JTaXRlIHNpdGUsIElFZGl0b3JJbnB1dCBpbnB1dCkKLQkJCXRocm93cyBQYXJ0SW5pdEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLmluaXQoc2l0ZSwgaW5wdXQpOwotCQlzaXRlLnNldFNlbGVjdGlvblByb3ZpZGVyKHRoaXMpOwotCi0JCS8vIFRPRE86IG5lZWQgcmV2aXNpdAotCQkvLyBzaXRlLnNldFNlbGVjdGlvblByb3ZpZGVyKG5ldyBGb3JtRWRpdG9yU2VsZWN0aW9uUHJvdmlkZXIodGhpcykpOwotCQkvLyBhY3Rpb25NYW5hZ2VyID0gZ2V0QWN0aW9uTWFuYWdlcigpOwotCi0JCUxpc3QgZmFjdG9yaWVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlmYWN0b3JpZXMuYWRkKG5ldyBSZXNvdXJjZUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkpOwotCQlmYWN0b3JpZXMuYWRkKG5ldyBSZWZsZWN0aXZlSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSk7Ci0KLQkJYWRhcHRlckZhY3RvcnkgPSBuZXcgQ29tcG9zZWRBZGFwdGVyRmFjdG9yeShmYWN0b3JpZXMpOwotCi0JCS8vIENyZWF0ZSB0aGUgY29tbWFuZCBzdGFjayB0aGF0IHdpbGwgbm90aWZ5IHRoaXMgZWRpdG9yIGFzIGNvbW1hbmRzIGFyZQotCQkvLyBleGVjdXRlZC4KLQkJLy8KLQkJQ29tbWFuZFN0YWNrIGNvbW1hbmRTdGFjayA9IGFjdGlvbk1nci5nZXRDb21tYW5kU3RhY2soKTsgLy8gbmV3Ci0JCS8vIEJhc2ljQ29tbWFuZFN0YWNrKCk7Ci0KLQkJLy8gQWRkIGEgbGlzdGVuZXIgdG8gc2V0IHRoZSBtb3N0IHJlY2VudCBjb21tYW5kJ3MgYWZmZWN0ZWQgb2JqZWN0cyB0bwotCQkvLyBiZSB0aGUgc2VsZWN0aW9uIG9mIHRoZSB2aWV3ZXIgd2l0aCBmb2N1cy4KLQkJLy8KLQkJY29tbWFuZFN0YWNrLmFkZENvbW1hbmRTdGFja0xpc3RlbmVyKG5ldyBDb21tYW5kU3RhY2tMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGNvbW1hbmRTdGFja0NoYW5nZWQoZmluYWwgRXZlbnRPYmplY3QgZXZlbnQpIHsKLQkJCQlib29sZWFuIHJ1biA9IGZhbHNlOwotCQkJCWlmIChldmVudCBpbnN0YW5jZW9mIENvbW1hbmRTdGFja0NoYW5nZWRFdmVudCkgewotCQkJCQlzd2l0Y2ggKCgoQ29tbWFuZFN0YWNrQ2hhbmdlZEV2ZW50KSBldmVudCkuZ2V0VHlwZSgpKSB7Ci0JCQkJCWNhc2UgQ29tbWFuZFN0YWNrQ2hhbmdlZEV2ZW50LkVYRUNVVEVEOgotCQkJCQljYXNlIENvbW1hbmRTdGFja0NoYW5nZWRFdmVudC5VTkRPOgotCQkJCQkJcnVuID0gdHJ1ZTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJcnVuID0gdHJ1ZTsKLQkJCQl9Ci0JCQkJaWYgKHJ1bikgewotCQkJCQlEaXNwbGF5LmdldEN1cnJlbnQoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCWZpcmVQcm9wZXJ0eUNoYW5nZShJRWRpdG9yUGFydC5QUk9QX0RJUlRZKTsKLQotCQkJCQkJCS8vIFRyeSB0byBzZWxlY3QgdGhlIGFmZmVjdGVkIG9iamVjdHMuCi0JCQkJCQkJLy8KLQkJCQkJCQlDb21tYW5kIG1vc3RSZWNlbnRDb21tYW5kID0gKChDb21tYW5kU3RhY2spIGV2ZW50Ci0JCQkJCQkJCQkuZ2V0U291cmNlKCkpLmdldE1vc3RSZWNlbnRDb21tYW5kKCk7Ci0JCQkJCQkJaWYgKG1vc3RSZWNlbnRDb21tYW5kICE9IG51bGwpIHsKLQkJCQkJCQkJCWlmICghKFRuZ1V0aWwudW53cmFwKG1vc3RSZWNlbnRDb21tYW5kKSBpbnN0YW5jZW9mIFNldENvbW1hbmQpKSB7Ci0JCQkJCQkJCQkJc2V0U2VsZWN0aW9uVG9WaWV3ZXIobW9zdFJlY2VudENvbW1hbmQKLQkJCQkJCQkJCQkJCS5nZXRBZmZlY3RlZE9iamVjdHMoKSk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCQlpZiAobW9zdFJlY2VudENvbW1hbmQgaW5zdGFuY2VvZiBDcmVhdGVDaGlsZENvbW1hbmQKLQkJCQkJCQkJCQkJJiYgY3VycmVudFZpZXdlciBpbnN0YW5jZW9mIFByb2Nlc3NWaWV3ZXIpIHsKLQkJCQkJCQkJCQlPYmplY3RbXSBhcnIgPSBtb3N0UmVjZW50Q29tbWFuZAotCQkJCQkJCQkJCQkJLmdldEFmZmVjdGVkT2JqZWN0cygpLnRvQXJyYXkoKTsKLQkJCQkJCQkJCQlpZiAoYXJyLmxlbmd0aCA9PSAxKSB7Ci0JCQkJCQkJCQkJCVByb2Nlc3NWaWV3ZXIgdmlld2VyID0gKFByb2Nlc3NWaWV3ZXIpIGN1cnJlbnRWaWV3ZXI7Ci0JCQkJCQkJCQkJCXZpZXdlci5lZGl0RWxlbWVudChhcnJbMF0sIDApOwotCQkJCQkJCQkJCX0KLQkJCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQkJLy8gaWYgKHByb3BlcnR5U2hlZXRQYWdlICE9IG51bGwpIHsKLQkJCQkJCQkvLyBwcm9wZXJ0eVNoZWV0UGFnZS5yZWZyZXNoKCk7Ci0JCQkJCQkJLy8gfQotCQkJCQkJfQotCQkJCQl9KTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JCS8vIENyZWF0ZSB0aGUgZWRpdGluZyBkb21haW4gd2l0aCBhIHNwZWNpYWwgY29tbWFuZCBzdGFjay4KLQkJZWRpdGluZ0RvbWFpbiA9IG5ldyBUcmFjZWFibGVBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW4oCi0JCQkJYWRhcHRlckZhY3RvcnksIGNvbW1hbmRTdGFjayk7Ci0KLQkJTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5hZGRMaXN0ZW5lcihsaWJTdmNMaXN0ZW5lcik7Ci0JCUlMaWJyYXJ5TWFuYWdlciBtYW5hZ2VyID0gKElMaWJyYXJ5TWFuYWdlcikgTGlicmFyeVNlcnZpY2UKLQkJCQkuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TGlicmFyeU1hbmFnZXIoKTsKLQkJaWYgKG1hbmFnZXIgIT0gbnVsbCkgewotCQkJbWFuYWdlci5hZGRMaXN0ZW5lcihsaWJyYXJ5TGlzdGVuZXIpOwotCQkJbWFuYWdlci5zdGFydExpc3RlbmluZ1RvKGFjdGlvbk1nci5nZXRDb21tYW5kU3RhY2soKSk7Ci0KLQkJCS8vIFRPRE86IG5lZWQgdG8gcmV2aXNpdCB0aGlzIGNvZGUKLQkJCWlmICghYWRkQWRhcHRlckZhY3RvcnlMaXN0ZW5lcnMpIHsKLQkJCQlhZGRBZGFwdGVyRmFjdG9yeUxpc3RlbmVycyA9IHRydWU7Ci0JCQkJbWFuYWdlci5zdGFydExpc3RlbmluZ1RvKFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkuZ2V0V0JTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSk7Ci0JCQkJbWFuYWdlci5zdGFydExpc3RlbmluZ1RvKFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkuZ2V0T0JTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSk7Ci0JCQkJbWFuYWdlci5zdGFydExpc3RlbmluZ1RvKFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkuZ2V0UEJTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSk7Ci0JCQl9Ci0JCX0KLQotCQkvL3NldFBhcnROYW1lKGlucHV0LmdldE5hbWUoKSk7Ci0JCS8vc2V0VGl0bGVJbWFnZShnZXRQcm9jVGl0bGVJbWFnZSgpKTsKLQotCQlzZXRQYXJ0RmFjYWRlKGlucHV0KTsKLQotCQkvLyBnZXQgbWV0aG9kIGVsZW1lbnQgb2JqZWN0IGZyb20gRWRpdG9yIGlucHV0Ci0JCU1ldGhvZEVsZW1lbnRFZGl0b3JJbnB1dCBtZXRob2RFbGVtZW50SW5wdXQgPSAoTWV0aG9kRWxlbWVudEVkaXRvcklucHV0KSBpbnB1dDsKLQkJZWxlbWVudE9iaiA9IG1ldGhvZEVsZW1lbnRJbnB1dC5nZXRNZXRob2RFbGVtZW50KCk7Ci0KLQkJaWYgKGVsZW1lbnRPYmogaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50KSB7Ci0JCQlzZWxlY3RlZFByb2Nlc3NDb21wb25lbnQgPSAoKFByb2Nlc3NDb21wb25lbnQpIGVsZW1lbnRPYmopOwotCQkJc2VsZWN0ZWRQcm9jZXNzID0gc2VsZWN0ZWRQcm9jZXNzQ29tcG9uZW50LmdldFByb2Nlc3MoKTsKLQkJfQotCi0JCWlmIChzZWxlY3RlZFByb2Nlc3NDb21wb25lbnQgIT0gbnVsbCkgewotCQkJc2VsZWN0ZWRQcm9jZXNzQ29tcG9uZW50LmVBZGFwdGVycygpLmFkZChwcm9jZXNzQ29tcG9uZW50TGlzdGVuZXIpOwotCQl9Ci0KLQkJLy8gbGlzdGVuIHRvIHJlc291cmNlIGNoYW5nZSB0byB1cGRhdGUgZGlydHkgZmxhZwotCQkvLwotCQkvLyBhZGRSZXNvdXJjZUNoYW5nZWRMaXN0ZW5lcigpOwotCi0JCS8vIGFkZCBwYXJ0IGxpc3RlbmVyIHRvIGxpc3RlbiB0byBwcm9wZXJ0eVNoZWV0IGNsb3NlIGV2ZW50Ci0JCWdldFNpdGUoKS5nZXRXb3JrYmVuY2hXaW5kb3coKS5nZXRQYXJ0U2VydmljZSgpLmFkZFBhcnRMaXN0ZW5lcigKLQkJCQlwYXJ0QWN0aXZhdGlvbkxpc3RlbmVyKTsKLQotCQkvLyBpbnB1dENoYW5nZWQoaW5wdXQpOwotCi0JCS8vIGxpc3RlbiB0byB0aGUgY2hhbmdlIG9mIGNvbHVtbiBsaXN0IGluIHByZWZlcmVuY2Ugc3RvcmUKLQkJLy8KLQkJaWYgKHByZWZTdG9yZUxpc3RlbmVyID09IG51bGwpIHsKLQkJCXByZWZTdG9yZUxpc3RlbmVyID0gbmV3IElQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyV3JhcHBlcigpIHsKLQotCQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlKElQcm9wZXJ0eUNoYW5nZUV2ZW50V3JhcHBlciBldmVudCkgewotCQkJCQlQcm9jZXNzQnJlYWtkb3duU3RydWN0dXJlRm9ybVBhZ2UgcGFnZSA9IG51bGw7Ci0JCQkJCWlmIChldmVudC5nZXRQcm9wZXJ0eSgpLmVxdWFscygKLQkJCQkJCQlBcHBsaWNhdGlvblByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9XQlNfQ09MVU1OUykpIHsKLQkJCQkJCXBhZ2UgPSBXQlNUYWI7Ci0JCQkJCX0gZWxzZSBpZiAoZXZlbnQuZ2V0UHJvcGVydHkoKS5lcXVhbHMoCi0JCQkJCQkJQXBwbGljYXRpb25QcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfVEJTX0NPTFVNTlMpKSB7Ci0JCQkJCQlwYWdlID0gT0JTVGFiOwotCQkJCQl9IGVsc2UgaWYgKGV2ZW50LmdldFByb3BlcnR5KCkuZXF1YWxzKAotCQkJCQkJCUFwcGxpY2F0aW9uUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX1dQQlNfQ09MVU1OUykpIHsKLQkJCQkJCXBhZ2UgPSBQQlNUYWI7Ci0JCQkJCX0KLQkJCQkJaWYgKHBhZ2UgIT0gbnVsbCkgewotCQkJCQkJQ29sdW1uRGVzY3JpcHRvcltdIGNvbHMgPSB0b0NvbHVtbkRlc2NyaXB0b3JzKGdldFByZWZlcmVuY2VTdG9yZSgpLmdldFN0cmluZygKLQkJCQkJCQkJCQlldmVudC5nZXRQcm9wZXJ0eSgpKSk7Ci0JCQkJCQlwYWdlLnVwZGF0ZUNvbHVtbnMoY29scyk7Ci0JCQkJCQlpZiAocGFnZSA9PSBXQlNUYWIgfHwgcGFnZSA9PSBPQlNUYWIpIHsKLQkJCQkJCQkvLyB1cGRhdGUgY29uc29saWRhdGVkIHZpZXcgYXMgd2VsbAotCQkJCQkJCS8vCi0JCQkJCQkJLy8gZ2V0IFdCUyBjb2x1bW5zCi0JCQkJCQkJTGlzdCBsaXN0ID0gdG9Db2x1bW5EZXNjcmlwdG9yTGlzdChnZXRQcmVmZXJlbmNlU3RvcmUoKQotCQkJCQkJCQkJLmdldFN0cmluZyhBcHBsaWNhdGlvblByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9XQlNfQ09MVU1OUykpOwotCi0JCQkJCQkJLy8gZ2V0IFRCUyBjb2x1bW5zIAotCQkJCQkJCUNvbHVtbkRlc2NyaXB0b3JbXSB0ZWFtQ29sdW1uRGVzY3JpcHRvcnMgPSB0b0NvbHVtbkRlc2NyaXB0b3JzKGdldFByZWZlcmVuY2VTdG9yZSgpCi0JCQkJCQkJCQkuZ2V0U3RyaW5nKEFwcGxpY2F0aW9uUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX1RCU19DT0xVTU5TKSk7Ci0KLQkJCQkJCQkvLyBpZiBUQlMgY29sdW1ucyBoYXMgVEVBTSBjb2x1bW4gdGhlbiBhZGQgdG8gY29uc29saWRhdGVkIHZpZXcKLQkJCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHRlYW1Db2x1bW5EZXNjcmlwdG9ycy5sZW5ndGg7IGkrKykgewotCQkJCQkJCQlDb2x1bW5EZXNjcmlwdG9yIGNvbERlc2MgPSB0ZWFtQ29sdW1uRGVzY3JpcHRvcnNbaV07Ci0JCQkJCQkJCWlmIChjb2xEZXNjID09IENPTF9ERVNDX1RFQU0pIHsKLQkJCQkJCQkJCWxpc3QuYWRkKGNvbERlc2MpOwotCQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQkJCi0JCQkJCQkJQ29sdW1uRGVzY3JpcHRvcltdIGNvbHVtbnMgPSBuZXcgQ29sdW1uRGVzY3JpcHRvcltsaXN0LnNpemUoKV07Ci0JCQkJCQkJbGlzdC50b0FycmF5KGNvbHVtbnMpOwotCQkJCQkJCXByb2NUYWIudXBkYXRlQ29sdW1ucyhjb2x1bW5zKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQotCQkJfTsKLQkJfQotCi0JCWdldFByZWZlcmVuY2VTdG9yZSgpCi0JCQkJLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIocHJlZlN0b3JlTGlzdGVuZXIpOwotCQkKLQkJZGlhZ3JhbUVkaXRvckhlbHBlciA9IG5ldyBEaWFncmFtRWRpdG9ySGVscGVyKCk7Ci0KLQl9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gaW5wdXQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRQYXJ0RmFjYWRlKElFZGl0b3JJbnB1dCBpbnB1dCkgewotICAgICAgICBzZXRQYXJ0TmFtZShpbnB1dC5nZXROYW1lKCkpOwotICAgICAgICBzZXRUaXRsZUltYWdlKGdldFByb2NUaXRsZUltYWdlKCkpOwotICAgIH0KLQotCS8qKgotCSAqIFRoaXMgc2V0cyB0aGUgc2VsZWN0aW9uIGludG8gd2hpY2hldmVyIHZpZXdlciBpcyBhY3RpdmUuIAotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNlbGVjdGlvblRvVmlld2VyKENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlpZiAoY3VycmVudFZpZXdlciAhPSBudWxsICYmIGNvbGxlY3Rpb24gIT0gbnVsbCAmJiAhY29sbGVjdGlvbi5pc0VtcHR5KCkpIHsKLQkJCQkJLy8gVHJ5IHRvIHNlbGVjdCB0aGUgaXRlbXMgaW4gdGhlIGN1cnJlbnQgY29udGVudCB2aWV3ZXIgb2YKLQkJCQkJLy8gdGhlIGVkaXRvci4KLQkJCQkJLy8KLQkJCWN1cnJlbnRWaWV3ZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKAotCQkJCQljb2xsZWN0aW9uLnRvQXJyYXkoKSksIHRydWUpOwotCQl9Ci0JfQotCi0JcHVibGljIEVkaXRpbmdEb21haW5BY3Rpb25CYXJDb250cmlidXRvciBnZXRBY3Rpb25CYXJDb250cmlidXRvcigpIHsKLQkJcmV0dXJuIChFZGl0aW5nRG9tYWluQWN0aW9uQmFyQ29udHJpYnV0b3IpIGdldEVkaXRvclNpdGUoKQotCQkJCS5nZXRBY3Rpb25CYXJDb250cmlidXRvcigpOwotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCS8vIGNsb3NlIGFsbCBkaWFncmFtIGVkaXRvcnMgb2YgdGhpcyBwcm9jZXNzCi0JCS8vCi0JCWNsb3NlQWxsRGlhZ3JhbUVkaXRvcnMoKTsKLQkJCi0JCWdldFByZWZlcmVuY2VTdG9yZSgpCi0JCQkJLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIocHJlZlN0b3JlTGlzdGVuZXIpOwotCi0JCS8vIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5yZW1vdmVSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKHJlc291cmNlQ2hhbmdlTGlzdGVuZXIpOwotCQkvLwotCQkvLyBnZXRTaXRlKCkuZ2V0UGFnZSgpLnJlbW92ZVBhcnRMaXN0ZW5lcihwYXJ0TGlzdGVuZXIpOwotCi0JCWFkYXB0ZXJGYWN0b3J5LmRpc3Bvc2UoKTsKLQotCQlpZiAoZ2V0QWN0aW9uQmFyQ29udHJpYnV0b3IoKS5nZXRBY3RpdmVFZGl0b3IoKSA9PSB0aGlzKSB7Ci0JCQlnZXRBY3Rpb25CYXJDb250cmlidXRvcigpLnNldEFjdGl2ZUVkaXRvcihudWxsKTsKLQkJfQotCi0JCWlmIChwcm9wZXJ0eVNoZWV0UGFnZSAhPSBudWxsKSB7Ci0JCQlwcm9wZXJ0eVNoZWV0UGFnZS5kaXNwb3NlKCk7Ci0JCX0KLQotCQlJTGlicmFyeU1hbmFnZXIgbWFuYWdlciA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLQkJCQkuZ2V0Q3VycmVudExpYnJhcnlNYW5hZ2VyKCk7Ci0JCWlmIChtYW5hZ2VyICE9IG51bGwpIHsKLQkJCW1hbmFnZXIucmVtb3ZlTGlzdGVuZXIobGlicmFyeUxpc3RlbmVyKTsKLQkJCW1hbmFnZXIuc3RvcExpc3RlbmluZ1RvKGVkaXRpbmdEb21haW4uZ2V0Q29tbWFuZFN0YWNrKCkpOwotCQl9Ci0JCUxpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkucmVtb3ZlTGlzdGVuZXIobGliU3ZjTGlzdGVuZXIpOwotCi0JCWlmIChzZWxlY3RlZFByb2Nlc3NDb21wb25lbnQgIT0gbnVsbCkgewotCQkJc2VsZWN0ZWRQcm9jZXNzQ29tcG9uZW50LmVBZGFwdGVycygpLnJlbW92ZSgKLQkJCQkJcHJvY2Vzc0NvbXBvbmVudExpc3RlbmVyKTsKLQkJfQotCi0JCS8vIHJlbW92ZVJlc291cmNlQ2hhbmdlZExpc3RlbmVyKCk7Ci0KLQkJZ2V0U2l0ZSgpLmdldFdvcmtiZW5jaFdpbmRvdygpLmdldFBhcnRTZXJ2aWNlKCkucmVtb3ZlUGFydExpc3RlbmVyKAotCQkJCXBhcnRBY3RpdmF0aW9uTGlzdGVuZXIpOwotCi0JCWJvb2xlYW4gc2F2ZU5lZWRlZCA9IGlzRGlydHkoKTsKLQkJCi0JCXN1cGVyLmRpc3Bvc2UoKTsKLQkJCi0JCWlmKGRpYWdyYW1FZGl0b3JIZWxwZXIgIT0gbnVsbCkKLQkJCWRpYWdyYW1FZGl0b3JIZWxwZXIuZGlzcG9zZSgpOwotCi0KLQkJLy8gY2FsbCB0aGlzIHRvIHNldCBtb2RpZmllZCBmbGFnIG9mIHN1cHByZXNzaW9uIHRvIGZhbHNlCi0JCS8vCi0JCXN1cHByZXNzaW9uLnNhdmVJc0RvbmUoKTsKLQotCQlpZiAoc2F2ZU5lZWRlZCkgewotCQkJLy8gdXNlciBkaXNjYXJkZWQgYWxsIHRoZSBjaGFuZ2VzLCBzYXZlIHRoZSByZXNvdXJjZXMgYWZ0ZXIgY2hhbmdlcwotCQkJLy8gYXJlIHVuZG9uZS4KLQkJCS8vIFRPRE86IHJlbG9hZCB0aGUgcHJvY2VzcyBjb21wb25lbnQgcmVzb3VyY2UgaW5zdGVhZCBzaW5jZSBpdCBpcwotCQkJLy8gbm90IHNoYXJlZC4KLQkJCS8vCi0JCQkvLyBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSByZXNvdXJjZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkvLyBSZXNvdXJjZSByZXNvdXJjZSA9IChSZXNvdXJjZSkgaXRlci5uZXh0KCk7Ci0JCQkvLyBzYXZlUmVzb3VyY2UocmVzb3VyY2UpOwotCQkJLy8gfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNsb3NlQWxsRGlhZ3JhbUVkaXRvcnMoKSB7Ci0JCUlXb3JrYmVuY2hQYWdlIHdvcmtiZW5jaFBhZ2UgPSBBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCQkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0QWN0aXZlUGFnZSgpOwotCQlpZih3b3JrYmVuY2hQYWdlID09IG51bGwpIHsKLQkJCS8vIHdvcmtiZW5jaCBpcyBjbG9zaW5nLCBhbGwgZWRpdG9yIHdpbGwgYmUgY2xvc2VkIHNvIG5vIG5lZWQgdG8gY2xvc2UgdGhlIGRpYWdyYW0gZWRpdG9yIGhlcmUKLQkJCS8vCi0JCQlyZXR1cm47Ci0JCX0KLQkJSUVkaXRvclJlZmVyZW5jZVtdIGVkaXRvclJlZmVyZW5jZXMgPSB3b3JrYmVuY2hQYWdlCi0JCQkJLmdldEVkaXRvclJlZmVyZW5jZXMoKTsKLQkJQXJyYXlMaXN0PElFZGl0b3JSZWZlcmVuY2U+IGRpYWdyYW1FZGl0b3JSZWZzID0gbmV3IEFycmF5TGlzdDxJRWRpdG9yUmVmZXJlbmNlPigpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGVkaXRvclJlZmVyZW5jZXMubGVuZ3RoOyBpKyspIHsKLQkJCUlFZGl0b3JSZWZlcmVuY2UgcmVmZXJlbmNlID0gZWRpdG9yUmVmZXJlbmNlc1tpXTsKLQkJCUlFZGl0b3JQYXJ0IGVkaXRvciA9IHJlZmVyZW5jZS5nZXRFZGl0b3IodHJ1ZSk7Ci0JCQlJRWRpdG9ySW5wdXQgaW5wdXQgPSBlZGl0b3IuZ2V0RWRpdG9ySW5wdXQoKTsKLQkJCWlmIChpbnB1dCBpbnN0YW5jZW9mIERpYWdyYW1FZGl0b3JJbnB1dFByb3h5KSB7Ci0JCQkJRGlhZ3JhbUVkaXRvcklucHV0IGRpYWdyYW1JbnB1dCA9ICgoRGlhZ3JhbUVkaXRvcklucHV0UHJveHkpIGlucHV0KQotCQkJCS5nZXREaWFncmFtRWRpdG9ySW5wdXQoKTsKLQkJCQlpZiAoZGlhZ3JhbUlucHV0ICE9IG51bGwpIHsKLQkJCQkJTWV0aG9kRWxlbWVudCBlbGVtZW50ID0gZGlhZ3JhbUlucHV0LmdldE1ldGhvZEVsZW1lbnQoKTsKLQkJCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50Ci0JCQkJCQkJJiYgc2VsZWN0ZWRQcm9jZXNzID09IFRuZ1V0aWwKLQkJCQkJCQkuZ2V0T3duaW5nUHJvY2VzcygoQnJlYWtkb3duRWxlbWVudCkgZWxlbWVudCkpIHsKLQkJCQkJCWRpYWdyYW1FZGl0b3JSZWZzLmFkZChyZWZlcmVuY2UpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmKCFkaWFncmFtRWRpdG9yUmVmcy5pc0VtcHR5KCkpIHsKLQkJCUlFZGl0b3JSZWZlcmVuY2VbXSByZWZzID0gbmV3IElFZGl0b3JSZWZlcmVuY2VbZGlhZ3JhbUVkaXRvclJlZnMuc2l6ZSgpXTsKLQkJCWRpYWdyYW1FZGl0b3JSZWZzLnRvQXJyYXkocmVmcyk7Ci0JCQl3b3JrYmVuY2hQYWdlLmNsb3NlRWRpdG9ycyhyZWZzLCB0cnVlKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZERlc2NyaXB0aW9uUGFnZSgpIHRocm93cyBQYXJ0SW5pdEV4Y2VwdGlvbiB7Ci0JCWlmIChzZWxlY3RlZFByb2Nlc3MgaW5zdGFuY2VvZiBEZWxpdmVyeVByb2Nlc3MpIHsKLQkJCS8vIERlbGl2ZXJ5IFByb2Nlc3MKLQkJCWFkZFBhZ2UoMCwgbmV3IERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uKHRoaXMpKTsKLQkJfSBlbHNlIHsKLQkJCS8vIENhcGFiaWxpdHkgUGF0dGVybgotCQkJLy8gUHJvY2VzcyBDb250cmlidXRpb24KLQkJCWFkZFBhZ2UoMCwgbmV3IFByb2Nlc3NEZXNjcmlwdGlvbih0aGlzKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLmZvcm1zLmVkaXRvci5Gb3JtRWRpdG9yI2FkZFBhZ2VzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRQYWdlcygpIHsKLQkJdHJ5IHsKLQkJCWFkZERlc2NyaXB0aW9uUGFnZSgpOwotCi0JCQlBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeTsKLQotCQkJLy8gY3JlYXRlIERORCB0cmFuc2ZlciBvYmplY3RzCi0JCQkvLyBpbnQgZG5kT3BlcmF0aW9ucyA9IERORC5EUk9QX0NPUFkgfCBETkQuRFJPUF9MSU5LOwotCQkJLy8gVHJhbnNmZXJbXSB0cmFuc2ZlcnMgPSBuZXcgVHJhbnNmZXJbXQotCQkJLy8ge0xvY2FsVHJhbnNmZXIuZ2V0SW5zdGFuY2UoKSB9OwotCi0JCQkvLyBwcmVmZXJlbmNlIGlzIG1hbmFnZWQgYnkgbGlicmFyeSBwbHVnaW4sCi0JCQkvLyBzaW5jZSB0aGlzIHByZWZlcmVuY2VzIGlzIGFsc28gdXNlZCBmb3IgYnJvd3NpbmcgYW5kIHB1Ymxpc2hpbmcKLQkJCS8vIEppbmh1YSBYaSAwOC8yMS8yMDA2Ci0JCQkvLyBJUHJlZmVyZW5jZVN0b3JlIHN0b3JlID0gQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpCi0JCQkvLyAuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JCQlQcmVmZXJlbmNlVXRpbC52YWxpZGF0ZVByZWZlcmVuY2VzKCk7Ci0JCQlJUHJlZmVyZW5jZVN0b3JlV3JhcHBlciBzdG9yZSA9IGdldFByZWZlcmVuY2VTdG9yZSgpOwotCQkJCi0JCQlMaXN0IHBhZ2VzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCQkvLyBXQlMgdGFiCi0JCQlXQlNUYWIgPSBuZXcgUHJvY2Vzc0JyZWFrZG93blN0cnVjdHVyZUZvcm1QYWdlKHRoaXMsIFdCU19GT1JNX0lELAotCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5Qcm9jZXNzRWRpdG9yX1dvcmtCcmVha2Rvd25TdHJ1Y3R1cmUpOyAKLQkJCUNvbHVtbkRlc2NyaXB0b3JbXSBjb2x1bW5EZXNjcmlwdG9ycyA9IHRvQ29sdW1uRGVzY3JpcHRvcnMoc3RvcmUKLQkJCQkJLmdldFN0cmluZyhBcHBsaWNhdGlvblByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9XQlNfQ09MVU1OUykpOwotCQkJYWRhcHRlckZhY3RvcnkgPSBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkuZ2V0V0JTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKTsKLQkJCWN1cnJlbnRDb25maWcgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJCS5nZXRDdXJyZW50TWV0aG9kQ29uZmlndXJhdGlvbigpOwotCQkJUHJvY2Vzc0F1dGhvcmluZ0NvbmZpZ3VyYXRvci5JTlNUQU5DRQotCQkJCQkuc2V0TWV0aG9kQ29uZmlndXJhdGlvbihjdXJyZW50Q29uZmlnKTsKLQkJCWlmIChhZGFwdGVyRmFjdG9yeSBpbnN0YW5jZW9mIENvbmZpZ3VyYWJsZUNvbXBvc2VkQWRhcHRlckZhY3RvcnkpIHsKLQkJCQkoKENvbmZpZ3VyYWJsZUNvbXBvc2VkQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJLnNldEZpbHRlcihQcm9jZXNzQXV0aG9yaW5nQ29uZmlndXJhdG9yLklOU1RBTkNFKTsKLQkJCX0KLQkJCVdCU1RhYi5zZXRBZGFwdGVyRmFjdG9yeShhZGFwdGVyRmFjdG9yeSk7Ci0JCQlXQlNUYWIuc2V0Q29sdW1uRGVzY3JpcHRvcnMoY29sdW1uRGVzY3JpcHRvcnMpOwotCQkJaW50IGlkID0gYWRkUGFnZShXQlNUYWIuY3JlYXRlQ29udHJvbChnZXRDb250YWluZXIoKSkpOwotCQkJc2V0UGFnZVRleHQoaWQsIFdCU1RhYi5nZXRUaXRsZSgpKTsKLQkJCVdCU1RhYi5zZXRUYWJJbmRleChpZCk7Ci0JCQlTdHJ1Y3R1cmVkVmlld2VyIHZpZXdlciA9IChTdHJ1Y3R1cmVkVmlld2VyKSBXQlNUYWIuZ2V0Vmlld2VyKCk7Ci0JCQljcmVhdGVDb250ZXh0TWVudUZvcih2aWV3ZXIpOwotCQkJcGFnZXMuYWRkKFdCU1RhYik7Ci0JCQkvLyB2aWV3ZXIuYWRkRHJvcFN1cHBvcnQoZG5kT3BlcmF0aW9ucywgdHJhbnNmZXJzLCBuZXcKLQkJCS8vIFByb2Nlc3NFZGl0b3JEcm9wQWRhcHRlcihlZGl0aW5nRG9tYWluLCB2aWV3ZXIpKTsKLQkJCS8vIHZpZXdlci5hZGREb3VibGVDbGlja0xpc3RlbmVyKG5ldyBJRG91YmxlQ2xpY2tMaXN0ZW5lcigpCi0JCQkvLyB7Ci0JCQkvLyBwdWJsaWMgdm9pZCBkb3VibGVDbGljayhEb3VibGVDbGlja0V2ZW50IGV2ZW50KQotCQkJLy8gewotCQkJLy8gVUlBY3Rpb25EaXNwYXRjaGVyLmdldEluc3RhbmNlKCkuaGFuZGxlRG91YmxlQ2xpY2tFdmVudChldmVudCk7Ci0JCQkvLyAvLyBTeXN0ZW0ub3V0LnByaW50bG4oImRvdWJsZSBjbGlja2VkIC4uLiIpOwotCQkJLy8gLy8KLQkJCS8vIC8vIFN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKFN0cnVjdHVyZWRTZWxlY3Rpb24pCi0JCQkvLyBldmVudC5nZXRTZWxlY3Rpb24oKTsKLQkJCS8vIC8vIFN5c3RlbS5vdXQucHJpbnRsbigic2VsIitzZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCkpOwotCQkJLy8gLy8KLQkJCS8vIFByb2R1Y3RFZGl0b3JWaWV3LmdldFZpZXcoKS5nZXRQcm9kdWN0Vmlld2VyKCkuc2V0SW5wdXQoc2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpKTsKLQkJCS8vIH0KLQkJCS8vIH0pOwotCQkJLy8gYWRkUGFnZShXQlNUYWIpOwotCi0JCQkvLyBPQlMgdGFiCi0JCQlPQlNUYWIgPSBuZXcgUHJvY2Vzc0JyZWFrZG93blN0cnVjdHVyZUZvcm1QYWdlKHRoaXMsIFRBX0ZPUk1fSUQsCi0JCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLlByb2Nlc3NFZGl0b3JfVGVhbUFsbG9jYXRpb24pOyAKLQkJCWNvbHVtbkRlc2NyaXB0b3JzID0gdG9Db2x1bW5EZXNjcmlwdG9ycyhzdG9yZQotCQkJCQkuZ2V0U3RyaW5nKEFwcGxpY2F0aW9uUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX1RCU19DT0xVTU5TKSk7Ci0JCQkvLyBzZXRDb2x1bW5JbmRleFRvTmFtZU1hcChUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRS5nZXRPQlNfQWRhcHRlckZhY3RvcmllcygpLAotCQkJLy8gY29sdW1uRGVzY3JpcHRvcnMpOwotCQkJYWRhcHRlckZhY3RvcnkgPSBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkuZ2V0T0JTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKTsKLQkJCWlmIChhZGFwdGVyRmFjdG9yeSBpbnN0YW5jZW9mIENvbmZpZ3VyYWJsZUNvbXBvc2VkQWRhcHRlckZhY3RvcnkpIHsKLQkJCQkoKENvbmZpZ3VyYWJsZUNvbXBvc2VkQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJLnNldEZpbHRlcihQcm9jZXNzQXV0aG9yaW5nQ29uZmlndXJhdG9yLklOU1RBTkNFKTsKLQkJCX0KLQkJCU9CU1RhYi5zZXRBZGFwdGVyRmFjdG9yeShhZGFwdGVyRmFjdG9yeSk7Ci0JCQlPQlNUYWIuc2V0Q29sdW1uRGVzY3JpcHRvcnMoY29sdW1uRGVzY3JpcHRvcnMpOwotCQkJaWQgPSBhZGRQYWdlKE9CU1RhYi5jcmVhdGVDb250cm9sKGdldENvbnRhaW5lcigpKSk7Ci0JCQlzZXRQYWdlVGV4dChpZCwgT0JTVGFiLmdldFRpdGxlKCkpOwotCQkJT0JTVGFiLnNldFRhYkluZGV4KGlkKTsKLQkJCXZpZXdlciA9IChTdHJ1Y3R1cmVkVmlld2VyKSBPQlNUYWIuZ2V0Vmlld2VyKCk7Ci0JCQljcmVhdGVDb250ZXh0TWVudUZvcih2aWV3ZXIpOwotCQkJcGFnZXMuYWRkKE9CU1RhYik7Ci0JCQkvLyB2aWV3ZXIuYWRkRHJvcFN1cHBvcnQoZG5kT3BlcmF0aW9ucywgdHJhbnNmZXJzLCBuZXcKLQkJCS8vIFByb2Nlc3NFZGl0b3JEcm9wQWRhcHRlcihlZGl0aW5nRG9tYWluLCB2aWV3ZXIpKTsKLQkJCS8vIGFkZFBhZ2UoT0JTVGFiKTsKLQotCQkJLy8gUEJTIHRhYgotCQkJUEJTVGFiID0gbmV3IFByb2Nlc3NCcmVha2Rvd25TdHJ1Y3R1cmVGb3JtUGFnZSh0aGlzLCBXUEJTX0ZPUk1fSUQsCi0JCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLlByb2Nlc3NFZGl0b3JfV29ya1Byb2R1Y3RVc2FnZSk7IAotCQkJY29sdW1uRGVzY3JpcHRvcnMgPSB0b0NvbHVtbkRlc2NyaXB0b3JzKHN0b3JlCi0JCQkJCS5nZXRTdHJpbmcoQXBwbGljYXRpb25QcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfV1BCU19DT0xVTU5TKSk7Ci0JCQkvLyBzZXRDb2x1bW5JbmRleFRvTmFtZU1hcChUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRS5nZXRQQlNfQWRhcHRlckZhY3RvcmllcygpLAotCQkJLy8gY29sdW1uRGVzY3JpcHRvcnMpOwotCQkJYWRhcHRlckZhY3RvcnkgPSBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkuZ2V0UEJTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKTsKLQkJCWlmIChhZGFwdGVyRmFjdG9yeSBpbnN0YW5jZW9mIENvbmZpZ3VyYWJsZUNvbXBvc2VkQWRhcHRlckZhY3RvcnkpIHsKLQkJCQkoKENvbmZpZ3VyYWJsZUNvbXBvc2VkQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJLnNldEZpbHRlcihQcm9jZXNzQXV0aG9yaW5nQ29uZmlndXJhdG9yLklOU1RBTkNFKTsKLQkJCX0KLQkJCVBCU1RhYi5zZXRBZGFwdGVyRmFjdG9yeShhZGFwdGVyRmFjdG9yeSk7Ci0JCQlQQlNUYWIuc2V0Q29sdW1uRGVzY3JpcHRvcnMoY29sdW1uRGVzY3JpcHRvcnMpOwotCQkJaWQgPSBhZGRQYWdlKFBCU1RhYi5jcmVhdGVDb250cm9sKGdldENvbnRhaW5lcigpKSk7Ci0JCQlzZXRQYWdlVGV4dChpZCwgUEJTVGFiLmdldFRpdGxlKCkpOwotCQkJUEJTVGFiLnNldFRhYkluZGV4KGlkKTsKLQkJCXZpZXdlciA9IChTdHJ1Y3R1cmVkVmlld2VyKSBQQlNUYWIuZ2V0Vmlld2VyKCk7Ci0JCQljcmVhdGVDb250ZXh0TWVudUZvcih2aWV3ZXIpOwotCQkJcGFnZXMuYWRkKFBCU1RhYik7Ci0JCQkvLyB2aWV3ZXIuYWRkRHJvcFN1cHBvcnQoZG5kT3BlcmF0aW9ucywgdHJhbnNmZXJzLCBuZXcKLQkJCS8vIFByb2Nlc3NFZGl0b3JEcm9wQWRhcHRlcihlZGl0aW5nRG9tYWluLCB2aWV3ZXIpKTsKLQkJCS8vIGFkZFBhZ2UoUEJTVGFiKTsKLQotCQkJLy8gY29uc29saWRhdGVkIHRhYgotCQkJcHJvY1RhYiA9IG5ldyBQcm9jZXNzQnJlYWtkb3duU3RydWN0dXJlRm9ybVBhZ2UodGhpcywKLQkJCQkJQ09OU09MSURBVEVEX0ZPUk1fSUQsCi0JCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLlByb2Nlc3NFZGl0b3JfQ29uc29saWRhdGVkVmlldyk7IAotCQkJcHJvY1RhYi5zZXRSZWFkT25seSh0cnVlKTsKLQkJCWFkYXB0ZXJGYWN0b3J5ID0gVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJLmdldFByb2Nlc3NDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KCk7Ci0JCQlpZiAoYWRhcHRlckZhY3RvcnkgaW5zdGFuY2VvZiBDb25maWd1cmFibGVDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KSB7Ci0JCQkJKChDb25maWd1cmFibGVDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCS5zZXRGaWx0ZXIoUHJvY2Vzc0F1dGhvcmluZ0NvbmZpZ3VyYXRvci5JTlNUQU5DRSk7Ci0JCQl9Ci0JCQlwcm9jVGFiLnNldEFkYXB0ZXJGYWN0b3J5KGFkYXB0ZXJGYWN0b3J5KTsKLS8vCQkJY29sdW1uRGVzY3JpcHRvcnMgPSB0b0NvbHVtbkRlc2NyaXB0b3JzKHN0b3JlCi0vLwkJCQkJLmdldFN0cmluZyhBcHBsaWNhdGlvblByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9XQlNfQ09MVU1OUykpOwotLy8JCQkKLQkJCS8vIGdldCBXQlMgY29sdW1ucwotCQkJTGlzdCBsaXN0ID0gdG9Db2x1bW5EZXNjcmlwdG9yTGlzdChzdG9yZQotCQkJCQkuZ2V0U3RyaW5nKEFwcGxpY2F0aW9uUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX1dCU19DT0xVTU5TKSk7Ci0KLQkJCS8vIGdldCBUQlMgY29sdW1ucyAKLQkJCUNvbHVtbkRlc2NyaXB0b3JbXSB0ZWFtQ29sdW1uRGVzY3JpcHRvcnMgPSB0b0NvbHVtbkRlc2NyaXB0b3JzKHN0b3JlCi0JCQkJCS5nZXRTdHJpbmcoQXBwbGljYXRpb25QcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfVEJTX0NPTFVNTlMpKTsKLQotCQkJLy8gaWYgVEJTIGNvbHVtbnMgaGFzIFRFQU0gY29sdW1uIHRoZW4gYWRkIHRvIGNvbnNvbGlkYXRlZCB2aWV3Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHRlYW1Db2x1bW5EZXNjcmlwdG9ycy5sZW5ndGg7IGkrKykgewotCQkJCUNvbHVtbkRlc2NyaXB0b3IgY29sRGVzYyA9IHRlYW1Db2x1bW5EZXNjcmlwdG9yc1tpXTsKLQkJCQlpZiAoY29sRGVzYyA9PSBDT0xfREVTQ19URUFNKSB7Ci0JCQkJCWxpc3QuYWRkKGNvbERlc2MpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0KLQkJCUNvbHVtbkRlc2NyaXB0b3JbXSBjb2x1bW5zID0gbmV3IENvbHVtbkRlc2NyaXB0b3JbbGlzdC5zaXplKCldOwotCQkJbGlzdC50b0FycmF5KGNvbHVtbnMpOwotCQkJcHJvY1RhYi5zZXRDb2x1bW5EZXNjcmlwdG9ycyhjb2x1bW5zKTsKLQkJCQotCQkJaWQgPSBhZGRQYWdlKHByb2NUYWIuY3JlYXRlQ29udHJvbChnZXRDb250YWluZXIoKSkpOwotCQkJc2V0UGFnZVRleHQoaWQsIHByb2NUYWIuZ2V0VGl0bGUoKSk7Ci0JCQlwcm9jVGFiLnNldFRhYkluZGV4KGlkKTsKLQkJCXZpZXdlciA9IChTdHJ1Y3R1cmVkVmlld2VyKSBwcm9jVGFiLmdldFZpZXdlcigpOwotCQkJY3JlYXRlQ29udGV4dE1lbnVGb3Iodmlld2VyKTsKLQkJCXBhZ2VzLmFkZChwcm9jVGFiKTsKLQotCQkJCi0JCQkvLyBUT0RPOiBwcm9wZXJseSBpbXBsZW1lbnQgZXh0ZW5zaW9uIHBvaW50Ci0JCQkvLyB0aGlzIGV4dGVuc2lvbiBwb2ludCBpcyBzdXBwb3NlZCB0byBsZXQgZXh0ZW5zaW9ucyBtb2RpZnkgdGhlIAotCQkJLy8gbGlzdCBvZiBwYWdlcy4gIEJ1dCB0aGlzIGVkaXRvciBpcyBzbyBtZXNzeSB0aGF0IHdlIGNhbid0Ci0JCQkvLyBqdXN0IHB1dCB0aGUgcGFnZXMgaW4gYSBtYXAgdG8gYmUgcGFzc2VkIHRvIGV4dGVuc2lvbnMKLQkJCS8vIChsaWtlIGluIHRoZSBNZXRob2RFbGVtZW50RWRpdG9yKS4KLQkJCQotCQkJLy8gY2hlY2sgZm9yIGV4dGVuc3Rpb24gcG9pbnQgYW5kIGFkZCB0aGUgcGFnZSBpZiB0aGVyZQotCQkJTWFwPE9iamVjdCxTdHJpbmc+IHBhZ2VNYXAgPSBuZXcgTGlua2VkSGFzaE1hcDxPYmplY3QsU3RyaW5nPigpOwotCQkJTGlzdDxJTWV0aG9kRWxlbWVudEVkaXRvclBhZ2VQcm92aWRlckV4dGVuc2lvbj4gcGFnZVByb3ZpZGVycyA9IGdldEFsbFBhZ2VQcm92aWRlcnMoKTsKLQkJCWlmIChwYWdlUHJvdmlkZXJzICE9IG51bGwgJiYgcGFnZVByb3ZpZGVycy5zaXplKCkgPiAwKSB7Ci0JCQkJZm9yIChJTWV0aG9kRWxlbWVudEVkaXRvclBhZ2VQcm92aWRlckV4dGVuc2lvbiBleHRlbnNpb24gOiBwYWdlUHJvdmlkZXJzKSB7Ci0JCQkJCXBhZ2VNYXAgPSBleHRlbnNpb24uZ2V0UGFnZXMocGFnZU1hcCwgdGhpcywgc2VsZWN0ZWRQcm9jZXNzKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmICghcGFnZU1hcC5pc0VtcHR5KCkpIHsKLQkJCQlleHRlbnNpb25UYWJzID0gbmV3IEFycmF5TGlzdDxQcm9jZXNzQnJlYWtkb3duU3RydWN0dXJlRm9ybVBhZ2U+KCk7Ci0JCQkJZm9yIChNYXAuRW50cnk8T2JqZWN0LCBTdHJpbmc+IHBhZ2VFbnRyeSA6IHBhZ2VNYXAuZW50cnlTZXQoKSkgewotCQkJCQlPYmplY3QgcGFnZSA9IHBhZ2VFbnRyeS5nZXRLZXkoKTsKLQkJCQkJU3RyaW5nIG5hbWUgPSBwYWdlRW50cnkuZ2V0VmFsdWUoKTsKLQkJCQkJaW50IGluZGV4ID0gLTE7Ci0JCQkJCWlmIChwYWdlIGluc3RhbmNlb2YgQ29udHJvbCkgewotCQkJCQkJaW5kZXggPSBhZGRQYWdlKChDb250cm9sKXBhZ2UpOwotCQkJCQl9IGVsc2UgaWYgKHBhZ2UgaW5zdGFuY2VvZiBJRm9ybVBhZ2UpIHsKLQkJCQkJCWlmIChwYWdlIGluc3RhbmNlb2YgUHJvY2Vzc0JyZWFrZG93blN0cnVjdHVyZUZvcm1QYWdlKSB7Ci0JCQkJCQkJUHJvY2Vzc0JyZWFrZG93blN0cnVjdHVyZUZvcm1QYWdlIGV4dGVuZGVkUGFnZSA9IChQcm9jZXNzQnJlYWtkb3duU3RydWN0dXJlRm9ybVBhZ2UpIHBhZ2U7Ci0JCQkJCQkJZXh0ZW5zaW9uVGFicy5hZGQoZXh0ZW5kZWRQYWdlKTsKLQkJCQkJCQlpbmRleCA9IGFkZFBhZ2UoZXh0ZW5kZWRQYWdlCi0JCQkJCQkJCQkuY3JlYXRlQ29udHJvbChnZXRDb250YWluZXIoKSkpOwotCQkJCQkJCXNldFBhZ2VUZXh0KGluZGV4LCBleHRlbmRlZFBhZ2UuZ2V0VGl0bGUoKSk7Ci0JCQkJCQkJZXh0ZW5kZWRQYWdlLnNldFRhYkluZGV4KGluZGV4KTsKLQkJCQkJCQl2aWV3ZXIgPSAoU3RydWN0dXJlZFZpZXdlcikgZXh0ZW5kZWRQYWdlCi0JCQkJCQkJCQkuZ2V0Vmlld2VyKCk7Ci0JCQkJCQkJY3JlYXRlQ29udGV4dE1lbnVGb3Iodmlld2VyKTsKLQkKLQkJCQkJCQlwYWdlcy5hZGQoZXh0ZW5kZWRQYWdlKTsKLQkJCQkJCX0KLQkJCQkJfSBlbHNlIGlmIChwYWdlIGluc3RhbmNlb2YgSUVkaXRvclBhcnQpIHsKLQkJCQkJCWluZGV4ID0gYWRkUGFnZSgoSUVkaXRvclBhcnQpcGFnZSwgZ2V0RWRpdG9ySW5wdXQoKSk7Ci0JCQkJCX0KLQkJCQkJaWYgKG5hbWUgIT0gbnVsbCkgewotCQkJCQkJc2V0UGFnZVRleHQoaW5kZXgsIG5hbWUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJCi0JCQlic1BhZ2VzID0gbmV3IFByb2Nlc3NCcmVha2Rvd25TdHJ1Y3R1cmVGb3JtUGFnZVtwYWdlcy5zaXplKCldOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYWdlcy5zaXplKCk7IGkrKykgewotCQkJCWJzUGFnZXNbaV0gPSAoUHJvY2Vzc0JyZWFrZG93blN0cnVjdHVyZUZvcm1QYWdlKSBwYWdlcy5nZXQoaSk7Ci0JCQl9Ci0KLQkJCS8vIGJzUGFnZXMgPSBuZXcgUHJvY2Vzc0JyZWFrZG93blN0cnVjdHVyZUZvcm1QYWdlW10geyBXQlNUYWIsCi0JCQkvLyBPQlNUYWIsCi0JCQkvLyBQQlNUYWIsIHByb2NUYWIgfTsKLQotCQkJLy8gaWYoZ2V0RWRpdG9ySW5wdXQoKSBpbnN0YW5jZW9mIFByb2Nlc3NFZGl0b3JJbnB1dCkgewotCQkJLy8gaW50IHBhZ2VJZCA9Ci0JCQkvLyAoKFByb2Nlc3NFZGl0b3JJbnB1dClnZXRFZGl0b3JJbnB1dCgpKS5nZXRBY3RpdmVQYWdlKCk7Ci0JCQkvLyBpZihwYWdlSWQgIT0gLTEpIHsKLQkJCS8vIHNldEFjdGl2ZVBhZ2UoMCk7Ci0JCQkvLyBzZXRBY3RpdmVQYWdlKHBhZ2VJZCk7Ci0JCQkvLyB9Ci0JCQkvLyB9Ci0KLQkJCWlucHV0Q2hhbmdlZChnZXRFZGl0b3JJbnB1dCgpKTsKLQkJfSBjYXRjaCAoUGFydEluaXRFeGNlcHRpb24gZSkgewotCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldEFjdGl2ZVBhZ2UoaW50IHBhZ2VJbmRleCkgewotCQlzdXBlci5zZXRBY3RpdmVQYWdlKHBhZ2VJbmRleCk7Ci0KLQkJLy8gd29yayBhcm91bmQgZm9yIGFjdGl2ZSBwYWdlIHRoYXQgaXMgbm90IGEgZm9ybSBwYWdlLiBTdXBlciBtZXRob2QKLQkJLy8gZG9lcyBub3QgY2FsbCBwYWdlQ2hhbmdlKCkgaW4gdGhpcyBjYXNlCi0JCS8vCi0JCWhhbmRsZVBhZ2VDaGFuZ2UoKTsKLQkJaWYgKHBhZ2VJbmRleCA+IDAgJiYgYnNQYWdlcy5sZW5ndGggPD0gcGFnZUluZGV4KSB7Ci0JCQlWaWV3ZXIgdmlld2VyID0gYnNQYWdlc1twYWdlSW5kZXhdLmdldFZpZXdlcigpOwotCQkJSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSB2aWV3ZXIuZ2V0U2VsZWN0aW9uKCk7Ci0JCQlpZiAoc2VsZWN0aW9uID09IG51bGwgfHwgc2VsZWN0aW9uLmlzRW1wdHkoKSkgewotCQkJCUlTZWxlY3Rpb24gaW5pdGlhbFNlbGVjdGlvbiA9IG51bGw7Ci0JCQkJaWYgKGdldEVkaXRvcklucHV0KCkgaW5zdGFuY2VvZiBQcm9jZXNzRWRpdG9ySW5wdXQpIHsKLQkJCQkJaW5pdGlhbFNlbGVjdGlvbiA9ICgoUHJvY2Vzc0VkaXRvcklucHV0KSBnZXRFZGl0b3JJbnB1dCgpKQotCQkJCQkJCS5nZXRJbml0aWFsU2VsZWN0aW9uKCk7Ci0JCQkJfQotCQkJCWlmIChpbml0aWFsU2VsZWN0aW9uID09IG51bGwpIHsKLQkJCQkJc2VsZWN0aW9uID0gbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oc2VsZWN0ZWRQcm9jZXNzKTsKLQkJCQl9IGVsc2UgewotCQkJCQlzZWxlY3Rpb24gPSBpbml0aWFsU2VsZWN0aW9uOwotCQkJCX0KLQkJCQl2aWV3ZXIuc2V0U2VsZWN0aW9uKHNlbGVjdGlvbiwgdHJ1ZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuZm9ybXMuZWRpdG9yLkZvcm1FZGl0b3Ijc2V0QWN0aXZlUGFnZShqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBJRm9ybVBhZ2Ugc2V0QWN0aXZlUGFnZShTdHJpbmcgcGFnZUlkKSB7Ci0JCWludCBpZCA9IC0xOwotCQlJRm9ybVBhZ2UgYWN0aXZlUGFnZSA9IG51bGw7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcGFnZXMuc2l6ZSgpOyBpKyspIHsKLQkJCU9iamVjdCBwYWdlID0gcGFnZXMuZ2V0KGkpOwotCQkJaWYgKHBhZ2UgaW5zdGFuY2VvZiBJRm9ybVBhZ2UpIHsKLQkJCQlJRm9ybVBhZ2UgZnBhZ2UgPSAoSUZvcm1QYWdlKSBwYWdlOwotCQkJCWlmIChmcGFnZS5nZXRJZCgpLmVxdWFscyhwYWdlSWQpKSB7Ci0JCQkJCWlkID0gaTsKLQkJCQkJYWN0aXZlUGFnZSA9IGZwYWdlOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYoaWQgPT0gLTEpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYnNQYWdlcy5sZW5ndGg7IGkrKykgewotCQkJCVByb2Nlc3NCcmVha2Rvd25TdHJ1Y3R1cmVGb3JtUGFnZSBwYWdlID0gYnNQYWdlc1tpXTsKLQkJCQlpZiAocGFnZS5nZXRJZCgpLmVxdWFscyhwYWdlSWQpKSB7Ci0JCQkJCWlkID0gcGFnZS5nZXRUYWJJbmRleCgpOwotCQkJCQlhY3RpdmVQYWdlID0gcGFnZTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmKGlkID09IC0xICYmIGV4dGVuc2lvblRhYnMgIT0gbnVsbCkgewotCQkJZm9yIChQcm9jZXNzQnJlYWtkb3duU3RydWN0dXJlRm9ybVBhZ2UgZXh0UGFnZSA6IGV4dGVuc2lvblRhYnMpIHsKLQkJCQlleHRQYWdlLnNldFByb2Nlc3Moc2VsZWN0ZWRQcm9jZXNzKTsKLQkJCQlpZiAoZXh0UGFnZS5nZXRJZCgpLmVxdWFscyhwYWdlSWQpKSB7Ci0JCQkJCWlkID0gZXh0UGFnZS5nZXRUYWJJbmRleCgpOwotCQkJCQlhY3RpdmVQYWdlID0gZXh0UGFnZTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJaWYoYWN0aXZlUGFnZSAhPSBudWxsKSB7Ci0JCQlzZXRBY3RpdmVQYWdlKGlkKTsKLQkJCXJldHVybiBhY3RpdmVQYWdlOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVQYWdlQ2hhbmdlKCkgewotCQlpbnQgaWQgPSBnZXRBY3RpdmVQYWdlKCk7Ci0JCWlmIChpZCAhPSAtMSkgewotCQkJT2JqZWN0IHBhZ2UgPSBwYWdlcy5nZXQoaWQpOwotCQkJaWYgKHBhZ2UgaW5zdGFuY2VvZiBQcm9jZXNzRGVzY3JpcHRpb24pIHsKLQkJCQkoKFByb2Nlc3NEZXNjcmlwdGlvbikgcGFnZSkuc2V0Rm9ybVRleHQoKTsKLQkJCX0KLQkJCWlmIChXQlNUYWIgIT0gbnVsbCAmJiBpZCA9PSBXQlNUYWIuZ2V0VGFiSW5kZXgoKSkgewotCQkJCXNldEN1cnJlbnRWaWV3ZXIoV0JTVGFiLmdldFZpZXdlcigpKTsKLQkJCX0gZWxzZSBpZiAoT0JTVGFiICE9IG51bGwgJiYgaWQgPT0gT0JTVGFiLmdldFRhYkluZGV4KCkpIHsKLQkJCQlzZXRDdXJyZW50Vmlld2VyKE9CU1RhYi5nZXRWaWV3ZXIoKSk7Ci0JCQl9IGVsc2UgaWYgKFBCU1RhYiAhPSBudWxsICYmIGlkID09IFBCU1RhYi5nZXRUYWJJbmRleCgpKSB7Ci0JCQkJc2V0Q3VycmVudFZpZXdlcihQQlNUYWIuZ2V0Vmlld2VyKCkpOwotCQkJfSBlbHNlIGlmIChwcm9jVGFiICE9IG51bGwgJiYgaWQgPT0gcHJvY1RhYi5nZXRUYWJJbmRleCgpKSB7Ci0JCQkJc2V0Q3VycmVudFZpZXdlcihwcm9jVGFiLmdldFZpZXdlcigpKTsKLQkJCX0gZWxzZSBpZiAoZXh0ZW5zaW9uVGFicyAhPSBudWxsKSB7Ci0JCQkJZm9yIChQcm9jZXNzQnJlYWtkb3duU3RydWN0dXJlRm9ybVBhZ2UgZXh0UGFnZSA6IGV4dGVuc2lvblRhYnMpIHsKLQkJCQkJaWYgKGlkID09IGV4dFBhZ2UuZ2V0VGFiSW5kZXgoKSkKLQkJCQkJCXNldEN1cnJlbnRWaWV3ZXIoZXh0UGFnZS5nZXRWaWV3ZXIoKSk7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlzZXRDdXJyZW50Vmlld2VyKG51bGwpOwotCQkJfQotCi0JCQlpZiAocHJvcGVydHlTaGVldFBhZ2UgIT0gbnVsbCkgewotCQkJCXByb3BlcnR5U2hlZXRQYWdlLnJlZnJlc2goKTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHBhZ2VDaGFuZ2UoaW50IG5ld1BhZ2VJbmRleCkgewotCQlzdXBlci5wYWdlQ2hhbmdlKG5ld1BhZ2VJbmRleCk7Ci0JCWhhbmRsZVBhZ2VDaGFuZ2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgY29udGV4dCBtZW51IGZvciB0aGUgZ2l2ZSB2aWV3ZXIKLQkgKiBAcGFyYW0gdmlld2VyCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udGV4dE1lbnVGb3IoZmluYWwgU3RydWN0dXJlZFZpZXdlciB2aWV3ZXIpIHsKLQkJTWVudU1hbmFnZXIgY29udGV4dE1lbnUgPSBuZXcgTWVudU1hbmFnZXIoIiNQb3BVcCIpOyAvLyROT04tTkxTLTEkCi0JCWNvbnRleHRNZW51LmFkZChuZXcgU2VwYXJhdG9yKElXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuTUJfQURESVRJT05TKSk7Ci0JCWNvbnRleHRNZW51LnNldFJlbW92ZUFsbFdoZW5TaG93bih0cnVlKTsKLQkJY29udGV4dE1lbnUuYWRkTWVudUxpc3RlbmVyKHRoaXMpOwotCQlNZW51IG1lbnUgPSBjb250ZXh0TWVudS5jcmVhdGVDb250ZXh0TWVudSh2aWV3ZXIuZ2V0Q29udHJvbCgpKTsKLQkJdmlld2VyLmdldENvbnRyb2woKS5zZXRNZW51KG1lbnUpOwotCQlnZXRTaXRlKCkucmVnaXN0ZXJDb250ZXh0TWVudShjb250ZXh0TWVudSwgdmlld2VyKTsKLQotCQl2aWV3ZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWwgPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGV2ZW50Ci0JCQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJc2V0U2VsZWN0aW9uKHNlbCk7Ci0JCQl9Ci0JCX0pOwotCi0JCWludCBkbmRPcGVyYXRpb25zID0gRE5ELkRST1BfTElOSyB8IERORC5EUk9QX0NPUFkgfCBETkQuRFJPUF9NT1ZFOwotCQlUcmFuc2ZlcltdIHRyYW5zZmVycyA9IG5ldyBUcmFuc2ZlcltdIHsgTG9jYWxUcmFuc2Zlci5nZXRJbnN0YW5jZSgpIH07Ci0JCXZpZXdlci5hZGREcm9wU3VwcG9ydChkbmRPcGVyYXRpb25zLCB0cmFuc2ZlcnMsCi0JCQkJbmV3IFByb2Nlc3NFZGl0b3JEcm9wQWRhcHRlcihlZGl0aW5nRG9tYWluLCB2aWV3ZXIpKTsKLQkJCi0JCWRuZE9wZXJhdGlvbnMgPSBETkQuRFJPUF9NT1ZFIHwgRE5ELkRST1BfQ09QWTsKLQkJdHJhbnNmZXJzID0gbmV3IFRyYW5zZmVyW10geyBMb2NhbFRyYW5zZmVyLmdldEluc3RhbmNlKCkgfTsKLQkJdmlld2VyLmFkZERyYWdTdXBwb3J0KGRuZE9wZXJhdGlvbnMsIHRyYW5zZmVycywgbmV3IFZpZXdlckRyYWdBZGFwdGVyKHZpZXdlcikpOwotCi0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0Q3VycmVudFZpZXdlcihWaWV3ZXIgdmlld2VyKSB7Ci0JCS8vIElmIGl0IGlzIGNoYW5naW5nLi4uCi0JCS8vCi0JCWlmIChjdXJyZW50Vmlld2VyICE9IHZpZXdlcikgewotCQkJaWYgKHNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciA9PSBudWxsKSB7Ci0JCQkJLy8gQ3JlYXRlIHRoZSBsaXN0ZW5lciBvbiBkZW1hbmQuCi0JCQkJLy8KLQkJCQlzZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgPSBuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQkJCQkJLy8gVGhpcyBqdXN0IG5vdGlmaWVzIHRob3NlIHRoaW5ncyB0aGF0IGFyZSBhZmZlY3RlZCBieSB0aGUKLQkJCQkJLy8gc2VjdGlvbi4KLQkJCQkJLy8KLQkJCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZCgKLQkJCQkJCQlTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgc2VsZWN0aW9uQ2hhbmdlZEV2ZW50KSB7Ci0JCQkJCQlzZXRTZWxlY3Rpb24oc2VsZWN0aW9uQ2hhbmdlZEV2ZW50LmdldFNlbGVjdGlvbigpKTsKLQkJCQkJfQotCQkJCX07Ci0JCQl9Ci0KLQkJCS8vIFN0b3AgbGlzdGVuaW5nIHRvIHRoZSBvbGQgb25lLgotCQkJLy8KLQkJCWlmIChjdXJyZW50Vmlld2VyICE9IG51bGwpIHsKLQkJCQljdXJyZW50Vmlld2VyCi0JCQkJCQkucmVtb3ZlU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKHNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcik7Ci0JCQl9Ci0KLQkJCS8vIFN0YXJ0IGxpc3RlbmluZyB0byB0aGUgbmV3IG9uZS4KLQkJCS8vCi0JCQlpZiAodmlld2VyICE9IG51bGwpIHsKLQkJCQl2aWV3ZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKHNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcik7Ci0JCQl9Ci0KLQkJCS8vIFJlbWVtYmVyIGl0LgotCQkJLy8KLQkJCWN1cnJlbnRWaWV3ZXIgPSB2aWV3ZXI7Ci0KLQkJCS8vIFNldCBhZGFwdGVyIGZhY3Rvcnkgb2YgZWRpdGluZ0RvbWFpbiB0byB0aGF0IG9mIHRoZSBjdXJyZW50IHZpZXcKLQkJCS8vCi0JCQlpZiAoY3VycmVudFZpZXdlciBpbnN0YW5jZW9mIFByb2Nlc3NWaWV3ZXIpIHsKLQkJCQlJQ29udGVudFByb3ZpZGVyIGNvbnRlbnRQcm92aWRlciA9ICgoUHJvY2Vzc1ZpZXdlcikgY3VycmVudFZpZXdlcikKLQkJCQkJCS5nZXRDb250ZW50UHJvdmlkZXIoKTsKLQkJCQlpZiAoY29udGVudFByb3ZpZGVyIGluc3RhbmNlb2YgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIpIHsKLQkJCQkJQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIgYWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIgPSAoKEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKSBjb250ZW50UHJvdmlkZXIpOwotCQkJCQlBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSA9IGFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyCi0JCQkJCQkJLmdldEFkYXB0ZXJGYWN0b3J5KCk7Ci0JCQkJCWlmIChhZGFwdGVyRmFjdG9yeSBpbnN0YW5jZW9mIEVkaXRpbmdEb21haW5Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KSB7Ci0JCQkJCQkoKEVkaXRpbmdEb21haW5Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLnNldEVkaXRpbmdEb21haW4oZWRpdGluZ0RvbWFpbik7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQllZGl0aW5nRG9tYWluLnNldEFkYXB0ZXJGYWN0b3J5KGFkYXB0ZXJGYWN0b3J5KTsKLQkJCQkJfQotCi0JCQkJCWlmIChwcm9wQ29udGVudFByb3ZpZGVyICE9IG51bGwpIHsKLQkJCQkJCXByb3BDb250ZW50UHJvdmlkZXIuc2V0QWRhcHRlckZhY3RvcnkoYWRhcHRlckZhY3RvcnkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQkvLyBTZXQgdGhlIGVkaXRvcnMgc2VsZWN0aW9uIGJhc2VkIG9uIHRoZSBjdXJyZW50IHZpZXdlcidzCi0JCQkvLyBzZWxlY3Rpb24uCi0JCQkvLwotCQkJc2V0U2VsZWN0aW9uKGN1cnJlbnRWaWV3ZXIgPT0gbnVsbCA/IFN0cnVjdHVyZWRTZWxlY3Rpb24uRU1QVFkKLQkJCQkJOiBjdXJyZW50Vmlld2VyLmdldFNlbGVjdGlvbigpKTsKLQotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyBBY3Rpdml0eSBnZXRQYXJlbnRBY3Rpdml0eShCcmVha2Rvd25FbGVtZW50IGUsCi0JCQlBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlBY3Rpdml0eSBhY3QgPSBVbWFVdGlsLmdldFBhcmVudEFjdGl2aXR5KGUpOwotCQlpZiAoYWN0ICE9IG51bGwpIHsKLQkJCXJldHVybiBhY3Q7Ci0JCX0KLQotCQkvLyBUT0RPOiBoYW5kbGUgZWxlbWVudCB0aGF0IGRvZXMgbm90IGRpcmVjdGx5IGJlbG9uZyB0byBhbiBhY3Rpdml0eQotCQkvLyAobGlrZSBkZWxpdmVyYWJsZSBwYXJ0IG9mIGEgZGVsaXZlcmFibGUgZGVzY3JpcHRvcikKLQkJLy8KLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIEFkYXB0ZXJGYWN0b3J5IGdldEFkYXB0ZXJGYWN0b3J5KFN0cnVjdHVyZWRWaWV3ZXIgdmlld2VyKSB7Ci0JCXJldHVybiAoKEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKSB2aWV3ZXIuZ2V0Q29udGVudFByb3ZpZGVyKCkpCi0JCQkJLmdldEFkYXB0ZXJGYWN0b3J5KCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldFNlbGVjdGlvblRvVmlld2VyKFZpZXdlciB2aWV3ZXIsCi0JCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBvdGhlclNlbCwgYm9vbGVhbiBhbHRlcm5hdGVTZWxlY3Rpb24pIHsKLQkJaWYgKGFsdGVybmF0ZVNlbGVjdGlvbikgewotCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB2aWV3ZXIKLQkJCQkJLmdldFNlbGVjdGlvbigpOwotCQkJT2JqZWN0IGN1cnJlbnRTZWxlY3Rpb24gPSBudWxsOwotCQkJaWYgKHNlbC5zaXplKCkgPT0gMSkgewotCQkJCWN1cnJlbnRTZWxlY3Rpb24gPSBzZWwuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCQkJaWYgKGN1cnJlbnRTZWxlY3Rpb24gaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50KSB7Ci0JCQkJCUFjdGl2aXR5IGFjdCA9IGdldFBhcmVudEFjdGl2aXR5KAotCQkJCQkJCShCcmVha2Rvd25FbGVtZW50KSBjdXJyZW50U2VsZWN0aW9uLAotCQkJCQkJCWdldEFkYXB0ZXJGYWN0b3J5KChTdHJ1Y3R1cmVkVmlld2VyKSB2aWV3ZXIpKTsKLQkJCQkJaWYgKGFjdCAhPSBvdGhlclNlbC5nZXRGaXJzdEVsZW1lbnQoKSkgewotCQkJCQkJdmlld2VyLnNldFNlbGVjdGlvbihvdGhlclNlbCwgdHJ1ZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCXZpZXdlci5zZXRTZWxlY3Rpb24ob3RoZXJTZWwsIHRydWUpOwotCQkJfQotCQl9IGVsc2UgewotCQkJdmlld2VyLnNldFNlbGVjdGlvbihvdGhlclNlbCwgdHJ1ZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyI3NldFNlbGVjdGlvbihvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb24pCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2VsZWN0aW9uKElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCWlmIChzeW5jaHJvbml6aW5nU2VsZWN0aW9uKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQkvLyAvLyBjaGVjayBpZiB0aGUgcmVzb3VyY2VzIG9mIHNlbGVjdGVkIG9iamVjdHMgYXJlIG91dCBvZiBzeW5jaCBvciBhbnkKLQkJLy8gb2YgdGhlIHNlbGVjdGVkIG9iamVjdHMKLQkJLy8gLy8gYmVjYW1lIHByb3h5IHRoZW4gcmVmcmVzaCB0aGVtIGlmIG5lZWRlZAotCQkvLyAvLwotCQkvLyBpZihyZWZyZXNoT3V0T2ZTeW5jaChzZWxlY3Rpb24pKSB7Ci0JCS8vIHJldHVybjsKLQkJLy8gfQotCi0JCXZpZXdTZWxlY3Rpb24gPSBzZWxlY3Rpb247Ci0JCUFycmF5TGlzdCBsaXN0ZW5lckxpc3QgPSBuZXcgQXJyYXlMaXN0KHNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcnMpOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdGVuZXJMaXN0LnNpemUoKTsgaSsrKSB7Ci0JCQlJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyID0gKElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIpIGxpc3RlbmVyTGlzdAotCQkJCQkuZ2V0KGkpOwotCQkJbGlzdGVuZXIKLQkJCQkJLnNlbGVjdGlvbkNoYW5nZWQobmV3IFNlbGVjdGlvbkNoYW5nZWRFdmVudCh0aGlzLCBzZWxlY3Rpb24pKTsKLQkJfQotCi0JCS8vIHN5bmNocm9uaXplIHNlbGVjdGlvbiBpbiBhbGwgQlMgdmlld3MgaWYgb25seSBvbmUgZWxlbWVudCBpcyBzZWxlY3RlZAotCQkvLwotCQlzeW5jaHJvbml6ZVNlbGVjdGlvbihzZWxlY3Rpb24sIGN1cnJlbnRWaWV3ZXIpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBzZWxlY3Rpb24KLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gcmVmcmVzaE91dE9mU3luY2goSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJaWYgKGN1cnJlbnRWaWV3ZXIgIT0gbnVsbCAmJiBzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgewotCQkJYm9vbGVhbiByZWZyZXNoUmVxdWlyZWQgPSBmYWxzZTsKLQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbCA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uOwotCQkJSGFzaFNldDxSZXNvdXJjZT4gcmVzb3VyY2VzID0gbmV3IEhhc2hTZXQ8UmVzb3VyY2U+KCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBzZWwuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IGUgPSBUbmdVdGlsLnVud3JhcChpdGVyLm5leHQoKSk7Ci0JCQkJaWYgKGUgaW5zdGFuY2VvZiBFT2JqZWN0KSB7Ci0JCQkJCUVPYmplY3QgZU9iamVjdCA9ICgoRU9iamVjdCkgZSk7Ci0JCQkJCWlmIChlT2JqZWN0LmVJc1Byb3h5KCkpIHsKLQkJCQkJCWVPYmplY3QgPSBSZWZyZXNoSm9iLmdldEluc3RhbmNlKCkucmVzb2x2ZShlT2JqZWN0KTsKLQkJCQkJCXJlZnJlc2hSZXF1aXJlZCA9IHRydWU7Ci0JCQkJCX0KLQkJCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSBlT2JqZWN0LmVSZXNvdXJjZSgpOwotCQkJCQlpZiAocmVzb3VyY2UgIT0gbnVsbCkgewotCQkJCQkJcmVzb3VyY2VzLmFkZChyZXNvdXJjZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoIXJlc291cmNlcy5pc0VtcHR5KCkpIHsKLQkJCQlBcnJheUxpc3Q8UmVzb3VyY2U+IHJlbW92ZWRSZXNvdXJjZXMgPSBuZXcgQXJyYXlMaXN0PFJlc291cmNlPigpOwotCQkJCUFycmF5TGlzdDxSZXNvdXJjZT4gY2hhbmdlZFJlc291cmNlcyA9IG5ldyBBcnJheUxpc3Q8UmVzb3VyY2U+KCk7Ci0JCQkJUmVzb3VyY2VVdGlsLmNoZWNrT3V0T2ZTeW5jaFJlc291cmNlcyhyZXNvdXJjZXMsCi0JCQkJCQlyZW1vdmVkUmVzb3VyY2VzLCBjaGFuZ2VkUmVzb3VyY2VzKTsKLQkJCQlpZiAoIXJlbW92ZWRSZXNvdXJjZXMuaXNFbXB0eSgpIHx8ICFjaGFuZ2VkUmVzb3VyY2VzLmlzRW1wdHkoKSkgewotCQkJCQlib29sZWFuIHJldCA9IHByb21wdFJlbG9hZEZpbGVzKCk7Ci0JCQkJCWlmIChyZXQpIHsKLQkJCQkJCS8vIHVubG9hZCB0aGUgcmVtb3ZlZCByZXNvdXJjZXMKLQkJCQkJCS8vCi0JCQkJCQlpZiAoIXJlbW92ZWRSZXNvdXJjZXMuaXNFbXB0eSgpKSB7Ci0JCQkJCQkJUGVyc2lzdGVuY2VVdGlsLnVubG9hZChyZW1vdmVkUmVzb3VyY2VzKTsKLQkJCQkJCX0KLQotCQkJCQkJQ29sbGVjdGlvbiByZWxvYWRlZFJlc291cmNlcyA9IG51bGw7Ci0JCQkJCQlpZiAoIWNoYW5nZWRSZXNvdXJjZXMuaXNFbXB0eSgpKSB7Ci0JCQkJCQkJLy8gUmVsb2FkIHRoZSBjaGFuZ2VkIHJlc291cmNlcy4KLQkJCQkJCQlJTGlicmFyeU1hbmFnZXIgbWFuYWdlciA9IChJTGlicmFyeU1hbmFnZXIpIExpYnJhcnlTZXJ2aWNlCi0JCQkJCQkJCQkuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TGlicmFyeU1hbmFnZXIoKTsKLQkJCQkJCQlpZiAobWFuYWdlciAhPSBudWxsKSB7Ci0JCQkJCQkJCXJlbG9hZGVkUmVzb3VyY2VzID0gbWFuYWdlcgotCQkJCQkJCQkJCS5yZWxvYWRSZXNvdXJjZXMoY2hhbmdlZFJlc291cmNlcyk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCi0JCQkJCQlpZiAoIXJlbW92ZWRSZXNvdXJjZXMuaXNFbXB0eSgpCi0JCQkJCQkJCXx8IHJlbG9hZGVkUmVzb3VyY2VzICE9IG51bGwpIHsKLQkJCQkJCQlyZWZyZXNoUmVxdWlyZWQgPSB0cnVlOwotCQkJCQkJfQotCi0JCQkJCQkvLyByZWZyZXNoIG91dC1vZi1zeW5jaCByZXNvdXJjZXMKLQkJCQkJCS8vCi0JCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjaGFuZ2VkUmVzb3VyY2VzLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCQlGaWxlTWFuYWdlci5nZXRJbnN0YW5jZSgpLnJlZnJlc2goCi0JCQkJCQkJCQkoUmVzb3VyY2UpIGl0ZXIubmV4dCgpKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWlmIChyZWZyZXNoUmVxdWlyZWQpIHsKLQkJCQljdXJyZW50Vmlld2VyLnJlZnJlc2goKTsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gc2VsZWN0aW9uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc3luY2hyb25pemVTZWxlY3Rpb24oSVNlbGVjdGlvbiBzZWxlY3Rpb24sIFZpZXdlciBjdXJyZW50Vmlld2VyKSB7Ci0JCXRyeSB7Ci0JCQlzeW5jaHJvbml6aW5nU2VsZWN0aW9uID0gdHJ1ZTsKLQkJCWlmIChjdXJyZW50Vmlld2VyICE9IG51bGwKLQkJCQkJJiYgc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKLQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWwgPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbjsKLQkJCQlpZiAoc2VsLnNpemUoKSA9PSAxKSB7Ci0JCQkJCU9iamVjdCBzZWxlY3RlZCA9IHNlbC5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gb3RoZXJTZWwgPSBudWxsOwotCQkJCQlib29sZWFuIGFsdGVybmF0ZVNlbGVjdGlvbiA9IGZhbHNlOwotCQkJCQlBcnJheUxpc3Qgc2VsZWN0ZWRQYXRoID0gbnVsbDsKLQkJCQkJQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkgPSBnZXRBZGFwdGVyRmFjdG9yeSgoU3RydWN0dXJlZFZpZXdlcikgY3VycmVudFZpZXdlcik7Ci0JCQkJCWlmIChzZWxlY3RlZCBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSB7Ci0JCQkJCQlpZiAoKChCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgc2VsZWN0ZWQpCi0JCQkJCQkJCS5pc1JlYWRPbmx5KCkpIHsKLQkJCQkJCQlpZiAoYWRhcHRlckZhY3RvcnkgIT0gbnVsbCkgewotCQkJCQkJCQkvLyBnZXQgcGF0aAotCQkJCQkJCQkvLwotCQkJCQkJCQlPYmplY3QgZSA9IFRuZ1V0aWwudW53cmFwKHNlbGVjdGVkKTsKLQkJCQkJCQkJc2VsZWN0ZWRQYXRoID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQkJCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIgYWRhcHRlciA9IChJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIpIHNlbGVjdGVkOwotCQkJCQkJCQlkbyB7Ci0JCQkJCQkJCQlzZWxlY3RlZFBhdGguYWRkKDAsIGUpOwotCQkJCQkJCQkJT2JqZWN0IHBhcmVudCA9IGFkYXB0ZXIuZ2V0UGFyZW50KGUpOwotCQkJCQkJCQkJaWYgKHBhcmVudCA9PSBudWxsKSB7Ci0JCQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCQlpZiAocGFyZW50IGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIHsKLQkJCQkJCQkJCQlhZGFwdGVyID0gKElUcmVlSXRlbUNvbnRlbnRQcm92aWRlcikgcGFyZW50OwotCQkJCQkJCQkJCWUgPSBUbmdVdGlsLnVud3JhcChwYXJlbnQpOwotCQkJCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJCQlhZGFwdGVyID0gKElUcmVlSXRlbUNvbnRlbnRQcm92aWRlcikgYWRhcHRlckZhY3RvcnkKLQkJCQkJCQkJCQkJCS5hZGFwdCgKLQkJCQkJCQkJCQkJCQkJcGFyZW50LAotCQkJCQkJCQkJCQkJCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkJCQkJCQkJCWUgPSBwYXJlbnQ7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0gd2hpbGUgKHRydWUpOwotCQkJCQkJCX0KLQkJCQkJCX0gZWxzZSBpZiAocHJvY1RhYi5nZXRWaWV3ZXIoKSA9PSBjdXJyZW50Vmlld2VyKSB7Ci0JCQkJCQkJc2VsZWN0ZWQgPSBUbmdVdGlsLnVud3JhcChzZWxlY3RlZCk7Ci0JCQkJCQkJc2VsZWN0aW9uID0gbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oc2VsZWN0ZWQpOwotCQkJCQkJfSBlbHNlIGlmIChleHRlbnNpb25UYWJzICE9IG51bGwpIHsKLQkJCQkJCQlmb3IgKFByb2Nlc3NCcmVha2Rvd25TdHJ1Y3R1cmVGb3JtUGFnZSBleHRQYWdlIDogZXh0ZW5zaW9uVGFicykgewotCQkJCQkJCQlpZiAoZXh0UGFnZS5nZXRWaWV3ZXIoKSA9PSBjdXJyZW50Vmlld2VyKSB7Ci0JCQkJCQkJCQlzZWxlY3RlZCA9IFRuZ1V0aWwudW53cmFwKHNlbGVjdGVkKTsKLQkJCQkJCQkJCXNlbGVjdGlvbiA9IG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKAotCQkJCQkJCQkJCQlzZWxlY3RlZCk7CQkJCQkJCQotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWlmIChzZWxlY3RlZCBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnQpIHsKLQkJCQkJCWlmIChwcm9jVGFiLmdldFZpZXdlcigpICE9IGN1cnJlbnRWaWV3ZXIpIHsKLQkJCQkJCQlwcm9jVGFiLmdldFZpZXdlcigpLnNldFNlbGVjdGlvbihzZWxlY3Rpb24sIGZhbHNlKTsKLQkJCQkJCX0KLQkJCQkJCWlmIChleHRlbnNpb25UYWJzICE9IG51bGwpIHsKLQkJCQkJCQlmb3IgKFByb2Nlc3NCcmVha2Rvd25TdHJ1Y3R1cmVGb3JtUGFnZSBleHRQYWdlIDogZXh0ZW5zaW9uVGFicykgewotCQkJCQkJCQlpZiAoZXh0UGFnZS5nZXRWaWV3ZXIoKSAhPSBjdXJyZW50Vmlld2VyKQotCQkJCQkJCQkJZXh0UGFnZS5nZXRWaWV3ZXIoKS5zZXRTZWxlY3Rpb24oc2VsZWN0aW9uLCBmYWxzZSk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCi0JCQkJCQlpZiAoc2VsZWN0ZWQgaW5zdGFuY2VvZiBBY3Rpdml0eQotCQkJCQkJCQl8fCBzZWxlY3RlZCBpbnN0YW5jZW9mIE1pbGVzdG9uZSkgewotCQkJCQkJCW90aGVyU2VsID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb247Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCUFjdGl2aXR5IGFjdCA9IGdldFBhcmVudEFjdGl2aXR5KAotCQkJCQkJCQkJKEJyZWFrZG93bkVsZW1lbnQpIHNlbGVjdGVkLCBhZGFwdGVyRmFjdG9yeSk7Ci0JCQkJCQkJaWYgKGFjdCAhPSBudWxsKSB7Ci0JCQkJCQkJCW90aGVyU2VsID0gbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oYWN0KTsKLQkJCQkJCQkJYWx0ZXJuYXRlU2VsZWN0aW9uID0gdHJ1ZTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJaWYgKG90aGVyU2VsICE9IG51bGwpIHsKLQkJCQkJCS8vIG93biBlbGVtZW50IGlzIHNlbGVjdGVkCi0JCQkJCQkvLwotCQkJCQkJVmlld2VyIHZpZXdlciA9IG51bGw7Ci0KLQkJCQkJCWlmICggV0JTVGFiICE9IG51bGwgKSB7Ci0JCQkJCQkJdmlld2VyID0gV0JTVGFiLmdldFZpZXdlcigpOwotCQkJCQkJfQotCQkJCQkJCi0JCQkJCQlpZiAodmlld2VyICE9IG51bGwgJiYgdmlld2VyICE9IGN1cnJlbnRWaWV3ZXIpIHsKLQkJCQkJCQlpZiAoc2VsZWN0ZWQgaW5zdGFuY2VvZiBXb3JrQnJlYWtkb3duRWxlbWVudCkgewotCQkJCQkJCQl2aWV3ZXIuc2V0U2VsZWN0aW9uKHNlbGVjdGlvbiwgZmFsc2UpOwotCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCXNldFNlbGVjdGlvblRvVmlld2VyKHZpZXdlciwgb3RoZXJTZWwsCi0JCQkJCQkJCQkJYWx0ZXJuYXRlU2VsZWN0aW9uKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQkKLQkJCQkJCWlmICggT0JTVGFiICE9IG51bGwgKSB7Ci0JCQkJCQkJdmlld2VyID0gT0JTVGFiLmdldFZpZXdlcigpOwotCQkJCQkJfQotCQkJCQkJCi0JCQkJCQlpZiAodmlld2VyICE9IG51bGwgJiYgdmlld2VyICE9IGN1cnJlbnRWaWV3ZXIpIHsKLQkJCQkJCQlpZiAoc2VsZWN0ZWQgaW5zdGFuY2VvZiBSb2xlRGVzY3JpcHRvcikgewotCQkJCQkJCQl2aWV3ZXIuc2V0U2VsZWN0aW9uKHNlbGVjdGlvbiwgZmFsc2UpOwotCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCXNldFNlbGVjdGlvblRvVmlld2VyKHZpZXdlciwgb3RoZXJTZWwsCi0JCQkJCQkJCQkJYWx0ZXJuYXRlU2VsZWN0aW9uKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQkKLQkJCQkJCWlmICggUEJTVGFiICE9IG51bGwgKSB7Ci0JCQkJCQkJdmlld2VyID0gUEJTVGFiLmdldFZpZXdlcigpOwotCQkJCQkJfQotCQkJCQkJCi0JCQkJCQlpZiAodmlld2VyICE9IG51bGwgJiYgdmlld2VyICE9IGN1cnJlbnRWaWV3ZXIpIHsKLQkJCQkJCQlpZiAoc2VsZWN0ZWQgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3IpIHsKLQkJCQkJCQkJdmlld2VyLnNldFNlbGVjdGlvbihzZWxlY3Rpb24sIGZhbHNlKTsKLQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQlzZXRTZWxlY3Rpb25Ub1ZpZXdlcih2aWV3ZXIsIG90aGVyU2VsLAotCQkJCQkJCQkJCWFsdGVybmF0ZVNlbGVjdGlvbik7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9IGVsc2UgaWYgKHNlbGVjdGVkUGF0aCAhPSBudWxsKSB7Ci0JCQkJCQkvLyBpbmhlcml0ZWQgZWxlbWVudCBpcyBzZWxlY3RlZAotCQkJCQkJLy8KLQkJCQkJCVZpZXdlciB2aWV3ZXIgPSBudWxsOwotCQkJCQkJaWYgKCBXQlNUYWIgIT0gbnVsbCApIHsKLQkJCQkJCQl2aWV3ZXIgPSBXQlNUYWIuZ2V0Vmlld2VyKCk7Ci0JCQkJCQkJaWYgKHZpZXdlciAhPSBjdXJyZW50Vmlld2VyKSB7Ci0JCQkJCQkJCXNlbGVjdGlvbiA9IG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKGZpbmRTZWxlY3Rpb24oCi0JCQkJCQkJCQkJc2VsZWN0ZWRQYXRoLCBXQlNUYWIuZ2V0QWRhcHRlckZhY3RvcnkoKSkpOwotCQkJCQkJCQl2aWV3ZXIuc2V0U2VsZWN0aW9uKHNlbGVjdGlvbiwgZmFsc2UpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCQkJCQkJCQotCQkJCQkJaWYgKCBPQlNUYWIgIT0gbnVsbCApIHsKLQkJCQkJCQl2aWV3ZXIgPSBPQlNUYWIuZ2V0Vmlld2VyKCk7CQkJCQkJCi0JCQkJCQkJaWYgKHZpZXdlciAhPSBjdXJyZW50Vmlld2VyKSB7Ci0JCQkJCQkJCXNlbGVjdGlvbiA9IG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKGZpbmRTZWxlY3Rpb24oCi0JCQkJCQkJCQkJc2VsZWN0ZWRQYXRoLCBPQlNUYWIuZ2V0QWRhcHRlckZhY3RvcnkoKSkpOwotCQkJCQkJCQl2aWV3ZXIuc2V0U2VsZWN0aW9uKHNlbGVjdGlvbiwgZmFsc2UpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCQotCQkJCQkJaWYgKCBQQlNUYWIgIT0gbnVsbCApIHsKLQkJCQkJCQl2aWV3ZXIgPSBQQlNUYWIuZ2V0Vmlld2VyKCk7CQkJCQkJCi0JCQkJCQkJaWYgKHZpZXdlciAhPSBjdXJyZW50Vmlld2VyKSB7Ci0JCQkJCQkJCXNlbGVjdGlvbiA9IG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKGZpbmRTZWxlY3Rpb24oCi0JCQkJCQkJCQkJc2VsZWN0ZWRQYXRoLCBQQlNUYWIuZ2V0QWRhcHRlckZhY3RvcnkoKSkpOwotCQkJCQkJCQl2aWV3ZXIuc2V0U2VsZWN0aW9uKHNlbGVjdGlvbiwgZmFsc2UpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCQotCQkJCQkJaWYgKCBwcm9jVGFiICE9IG51bGwgKSB7Ci0JCQkJCQkJdmlld2VyID0gcHJvY1RhYi5nZXRWaWV3ZXIoKTsKLQkJCQkJCQlpZiAodmlld2VyICE9IGN1cnJlbnRWaWV3ZXIpIHsKLQkJCQkJCQkJc2VsZWN0aW9uID0gbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oZmluZFNlbGVjdGlvbigKLQkJCQkJCQkJCQlzZWxlY3RlZFBhdGgsIHByb2NUYWIuZ2V0QWRhcHRlckZhY3RvcnkoKSkpOwotCQkJCQkJCQl2aWV3ZXIuc2V0U2VsZWN0aW9uKHNlbGVjdGlvbiwgZmFsc2UpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCQotCQkJCQkJaWYgKGV4dGVuc2lvblRhYnMgIT0gbnVsbCkgewotCQkJCQkJCWZvciAoUHJvY2Vzc0JyZWFrZG93blN0cnVjdHVyZUZvcm1QYWdlIGV4dFBhZ2UgOiBleHRlbnNpb25UYWJzKSB7Ci0JCQkJCQkJCXZpZXdlciA9IGV4dFBhZ2UuZ2V0Vmlld2VyKCk7Ci0JCQkJCQkJCWlmICh2aWV3ZXIgIT0gY3VycmVudFZpZXdlcikgewotCQkJCQkJCQkJc2VsZWN0aW9uID0gbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oCi0JCQkJCQkJCQkJCWZpbmRTZWxlY3Rpb24oCi0JCQkJCQkJCQkJCQkJc2VsZWN0ZWRQYXRoLAotCQkJCQkJCQkJCQkJCWV4dFBhZ2UKLQkJCQkJCQkJCQkJCQkJCS5nZXRBZGFwdGVyRmFjdG9yeSgpKSk7Ci0JCQkJCQkJCQl2aWV3ZXIuc2V0U2VsZWN0aW9uKHNlbGVjdGlvbiwgZmFsc2UpOwotCQkJCQkJCQl9Ci0JCQkJCQkJCQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSBmaW5hbGx5IHsKLQkJCXN5bmNocm9uaXppbmdTZWxlY3Rpb24gPSBmYWxzZTsKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IGZpbmRTZWxlY3Rpb24oTGlzdCBzZWxlY3RlZFBhdGgsCi0JCQlBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlpbnQgc2l6ZSA9IHNlbGVjdGVkUGF0aC5zaXplKCk7Ci0JCWlmIChzaXplID09IDApIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCU9iamVjdCBlID0gc2VsZWN0ZWRQYXRoLmdldCgwKTsKLQkJT2JqZWN0IHNlbGVjdGlvbiA9IGU7Ci0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciBhZGFwdGVyID0gKElUcmVlSXRlbUNvbnRlbnRQcm92aWRlcikgYWRhcHRlckZhY3RvcnkKLQkJCQkuYWRhcHQoZSwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJQ29sbGVjdGlvbiBjaGlsZHJlbiA9IGFkYXB0ZXIuZ2V0Q2hpbGRyZW4oZSk7Ci0JCWZpbmRfc2VsZWN0aW9uOiBmb3IgKGludCBpID0gMTsgaSA8IHNpemU7IGkrKykgewotCQkJZSA9IHNlbGVjdGVkUGF0aC5nZXQoaSk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjaGlsZHJlbi5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3QgY2hpbGQgPSBpdGVyLm5leHQoKTsKLQkJCQlPYmplY3QgZWxlbWVudCA9IFRuZ1V0aWwudW53cmFwKGNoaWxkKTsKLQkJCQlpZiAoZWxlbWVudCA9PSBlKSB7Ci0JCQkJCXNlbGVjdGlvbiA9IGNoaWxkOwotCQkJCQlhZGFwdGVyID0gKElUcmVlSXRlbUNvbnRlbnRQcm92aWRlcikgYWRhcHRlckZhY3RvcnkuYWRhcHQoCi0JCQkJCQkJY2hpbGQsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCQkJCWNoaWxkcmVuID0gYWRhcHRlci5nZXRDaGlsZHJlbihlKTsKLQkJCQkJY29udGludWUgZmluZF9zZWxlY3Rpb247Ci0JCQkJfQotCQkJfQotCQkJYnJlYWsgZmluZF9zZWxlY3Rpb247Ci0JCX0KLQkJcmV0dXJuIHNlbGVjdGlvbjsKLQl9Ci0KLQkvLyBJbXBsZW1lbnRzIElTZWxlY3Rpb25Qcm92aWRlcgotCS8vCi0JcHVibGljIHZvaWQgYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJc2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVycy5hZGQobGlzdGVuZXIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigKLQkJCUlTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJc2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVycy5yZW1vdmUobGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXIjZ2V0U2VsZWN0aW9uKCkKLQkgKi8KLQlwdWJsaWMgSVNlbGVjdGlvbiBnZXRTZWxlY3Rpb24oKSB7Ci0JCXJldHVybiB2aWV3U2VsZWN0aW9uOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLklFZGl0aW5nRG9tYWluUHJvdmlkZXIjZ2V0RWRpdGluZ0RvbWFpbigpCi0JICovCi0JcHVibGljIEVkaXRpbmdEb21haW4gZ2V0RWRpdGluZ0RvbWFpbigpIHsKLQkJcmV0dXJuIGVkaXRpbmdEb21haW47Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnVpLnZpZXdlci5JVmlld2VyUHJvdmlkZXIjZ2V0Vmlld2VyKCkKLQkgKi8KLQlwdWJsaWMgVmlld2VyIGdldFZpZXdlcigpIHsKLQkJcmV0dXJuIGN1cnJlbnRWaWV3ZXI7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgYWRhcHRlciBmYWN0b3J5IG9mIHRoZSBjdXJyZW50IHBhZ2UgaWYgdGhlcmUgaXMgYW55Ci0JICogCi0JICogQHJldHVybgotCSAqIAkJQWRhcHRlciBGYWN0b3J5IG9mIHRoZSBjdXJyZW50IHBhZ2Ugb2YgdGhlIGVkaXRvcgotCSAqLwotCXB1YmxpYyBBZGFwdGVyRmFjdG9yeSBnZXRBZGFwdGVyRmFjdG9yeSgpIHsKLQkJSUZvcm1QYWdlIHBhZ2UgPSBnZXRBY3RpdmVQYWdlSW5zdGFuY2UoKTsKLQkJaWYgKHBhZ2UgaW5zdGFuY2VvZiBQcm9jZXNzQnJlYWtkb3duU3RydWN0dXJlRm9ybVBhZ2UpIHsKLQkJCXJldHVybiAoKFByb2Nlc3NCcmVha2Rvd25TdHJ1Y3R1cmVGb3JtUGFnZSkgcGFnZSkKLQkJCQkJLmdldEFkYXB0ZXJGYWN0b3J5KCk7Ci0JCX0KLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudUxpc3RlbmVyI21lbnVBYm91dFRvU2hvdyhvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVNYW5hZ2VyKQotCSAqLwotCXB1YmxpYyB2b2lkIG1lbnVBYm91dFRvU2hvdyhJTWVudU1hbmFnZXIgbWVudU1hbmFnZXIpIHsKLQkJKChJTWVudUxpc3RlbmVyKSBnZXRFZGl0b3JTaXRlKCkuZ2V0QWN0aW9uQmFyQ29udHJpYnV0b3IoKSkKLQkJCQkubWVudUFib3V0VG9TaG93KG1lbnVNYW5hZ2VyKTsKLQkJCi0JCS8vIHBvcHVsYXRlIGNvbnRyaWJ1dGVkIG1lbnUgaXRlbXMKLQkJLy8KLQkJSUZvcm1QYWdlIGFjdGl2ZVBhZ2UgPSBnZXRBY3RpdmVQYWdlSW5zdGFuY2UoKTsKLQkJaWYoYWN0aXZlUGFnZSBpbnN0YW5jZW9mIFByb2Nlc3NCcmVha2Rvd25TdHJ1Y3R1cmVGb3JtUGFnZSkgewotCQkJSUFjdGlvbltdIGFjdGlvbnMgPSAoKFByb2Nlc3NCcmVha2Rvd25TdHJ1Y3R1cmVGb3JtUGFnZSlhY3RpdmVQYWdlKS5nZXRBZGRpdGlvbmFsQWN0aW9ucygpOwotCQkJaWYoYWN0aW9ucyAhPSBudWxsICYmIGFjdGlvbnMubGVuZ3RoID4gMCkgewotCQkJCW1lbnVNYW5hZ2VyLmluc2VydEFmdGVyKElXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuTUJfQURESVRJT05TLCBuZXcgU2VwYXJhdG9yKCkpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYWN0aW9ucy5sZW5ndGg7IGkrKykgewotCQkJCQlJQWN0aW9uIGFjdGlvbiA9IGFjdGlvbnNbaV07Ci0JCQkJCUlTZWxlY3Rpb24gc2VsZWN0aW9uID0gZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJCWlmKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uICYmIGFjdGlvbiBpbnN0YW5jZW9mIEJhc2VTZWxlY3Rpb25MaXN0ZW5lckFjdGlvbikgewotCQkJCQkJKChCYXNlU2VsZWN0aW9uTGlzdGVuZXJBY3Rpb24pYWN0aW9uKS5zZWxlY3Rpb25DaGFuZ2VkKChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uKTsKLQkJCQkJfQotCQkJCQlpZiAoYWN0aW9uIGluc3RhbmNlb2YgSVdvcmtiZW5jaFBhcnRBY3Rpb24pIHsKLQkJCQkJCSgoSVdvcmtiZW5jaFBhcnRBY3Rpb24pIGFjdGlvbikKLQkJCQkJCQkJLnNldEFjdGl2ZVdvcmtiZW5jaFBhcnQodGhpcyk7Ci0JCQkJCX0KLQkJCQkJbWVudU1hbmFnZXIuaW5zZXJ0QWZ0ZXIoSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5NQl9BRERJVElPTlMsIGFjdGlvbik7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHByb3BlcnR5IHNoZWV0IHBhZ2UKLQkgKiBAcmV0dXJuCi0JICogCQkJUHJvcGVydHlTaGVldCBQYWdlCi0JICovCi0JcHVibGljIElQcm9wZXJ0eVNoZWV0UGFnZSBnZXRQcm9wZXJ0eVNoZWV0UGFnZSgpIHsKLQkJaWYgKHByb3BlcnR5U2hlZXRQYWdlID09IG51bGwpIHsKLQkJCXByb3BlcnR5U2hlZXRQYWdlID0gKEVQRlByb3BlcnR5U2hlZXRQYWdlKSBjcmVhdGVQcm9wZXJ0eVNoZWV0UGFnZSgpOwotCi0JCQkvLyB7Ci0JCQkvLyBwdWJsaWMgdm9pZCBtYWtlQ29udHJpYnV0aW9ucyhJTWVudU1hbmFnZXIgbWVudU1hbmFnZXIsCi0JCQkvLyBJVG9vbEJhck1hbmFnZXIgdG9vbEJhck1hbmFnZXIsIElTdGF0dXNMaW5lTWFuYWdlcgotCQkJLy8gc3RhdHVzTGluZU1hbmFnZXIpIHsKLQkJCS8vIHN1cGVyLm1ha2VDb250cmlidXRpb25zKG1lbnVNYW5hZ2VyLCB0b29sQmFyTWFuYWdlciwKLQkJCS8vIHN0YXR1c0xpbmVNYW5hZ2VyKTsKLQkJCS8vIH0KLQkJCS8vCi0JCQkvLyBwdWJsaWMgdm9pZCBzZXRBY3Rpb25CYXJzKElBY3Rpb25CYXJzIGFjdGlvbkJhcnMpIHsKLQkJCS8vIHN1cGVyLnNldEFjdGlvbkJhcnMoYWN0aW9uQmFycyk7Ci0JCQkvLyBnZXRBY3Rpb25CYXJDb250cmlidXRvcigpLnNoYXJlR2xvYmFsQWN0aW9ucyh0aGlzLCBhY3Rpb25CYXJzKTsKLQkJCS8vIH0KLQkJCS8vIH07Ci0JCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlNldHRpbmcgcHJvdmlkZXIgIik7Ci0JCQlpZiAoY3VycmVudFZpZXdlciAhPSBudWxsKSB7Ci0JCQkJQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIgY29udGVudFByb3ZpZGVyID0gKEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKSAoKFByb2Nlc3NWaWV3ZXIpIGN1cnJlbnRWaWV3ZXIpCi0JCQkJCQkuZ2V0Q29udGVudFByb3ZpZGVyKCk7Ci0JCQkJcHJvcENvbnRlbnRQcm92aWRlciA9IG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcigKLQkJCQkJCWNvbnRlbnRQcm92aWRlci5nZXRBZGFwdGVyRmFjdG9yeSgpKTsKLQkJCQlwcm9wZXJ0eVNoZWV0UGFnZQotCQkJCQkJLnNldFByb3BlcnR5U291cmNlUHJvdmlkZXIocHJvcENvbnRlbnRQcm92aWRlcik7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHByb3BlcnR5U2hlZXRQYWdlOwotCX0KLQotICAgIC8qKgotICAgICAqIAotICAgICAqLwotICAgIHByb3RlY3RlZCBUYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZSBjcmVhdGVQcm9wZXJ0eVNoZWV0UGFnZSgpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBFUEZQcm9wZXJ0eVNoZWV0UGFnZSh0aGlzKTsKLSAgICB9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBhcnQuTXVsdGlQYWdlRWRpdG9yUGFydCNnZXRBZGFwdGVyKGphdmEubGFuZy5DbGFzcykKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3Mga2V5KSB7Ci0JCWlmIChrZXkuZXF1YWxzKElQcm9wZXJ0eVNoZWV0UGFnZS5jbGFzcykpIHsKLQkJCXJldHVybiBnZXRQcm9wZXJ0eVNoZWV0UGFnZSgpOwotCQl9IGVsc2UgaWYgKGtleS5lcXVhbHMoSUdvdG9NYXJrZXIuY2xhc3MpKSB7Ci0JCQlyZXR1cm4gdGhpczsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBzdXBlci5nZXRBZGFwdGVyKGtleSk7Ci0JCX0KLQl9Ci0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuSVRhYmJlZFByb3BlcnR5U2hlZXRQYWdlQ29udHJpYnV0b3IjZ2V0Q29udHJpYnV0b3JJZCgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDb250cmlidXRvcklkKCkgewotCQlyZXR1cm4gZ2V0U2l0ZSgpLmdldElkKCk7Ci0JfQotCi0JCi0JLyoqCi0JICogUmV0dXJuIGNvbHVtbiBkZXNjcmlwdG9yIGxpc3QgZm9yIGdpdmVuIHN0cmluZwotCSAqIEBwYXJhbSBzdHIKLQkgKiBAcmV0dXJuCi0JICogCQkJbGlzdCBvZiBjb2x1bW4gZGVzY3JpcHRvcnMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEVMaXN0IHRvQ29sdW1uRGVzY3JpcHRvckxpc3QoU3RyaW5nIHN0cikgewotCQlFTGlzdCBjb2x1bW5EZXNjcmlwdG9ycyA9IG5ldyBCYXNpY0VMaXN0KCk7Ci0JCVN0cmluZ1Rva2VuaXplciB0b2tlbnMgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHN0ciwgIiwiKTsgLy8kTk9OLU5MUy0xJAotCQl3aGlsZSAodG9rZW5zLmhhc01vcmVUb2tlbnMoKSkgewotCQkJU3RyaW5nIHRva2VuID0gdG9rZW5zLm5leHRUb2tlbigpOwotCQkJT2JqZWN0IGNvbHVtbkRlc2NyaXB0b3IgPSBQcm9jZXNzRWRpdG9yLmlkVG9Db2x1bW5EZXNjcmlwdG9yTWFwCi0JCQkJCS5nZXQodG9rZW4pOwotCQkJaWYgKGNvbHVtbkRlc2NyaXB0b3IgIT0gbnVsbCkgewotCQkJCWNvbHVtbkRlc2NyaXB0b3JzLmFkZChjb2x1bW5EZXNjcmlwdG9yKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gY29sdW1uRGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGFycmF5IG9mIGNvbHVtbiBkZXNjcmlwdG9ycyBmb3IgdGhlIGdpdmVuIHN0cmluZwotCSAqIEBwYXJhbSBzdHIKLQkgKiBAcmV0dXJuCi0JICogCQkJbGlzdCBvZiBjb2x1bW4gZGVzY3JpcHRvcnMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIENvbHVtbkRlc2NyaXB0b3JbXSB0b0NvbHVtbkRlc2NyaXB0b3JzKFN0cmluZyBzdHIpIHsKLQkJTGlzdCBsaXN0ID0gdG9Db2x1bW5EZXNjcmlwdG9yTGlzdChzdHIpOwotCQlDb2x1bW5EZXNjcmlwdG9yW10gY29sdW1ucyA9IG5ldyBDb2x1bW5EZXNjcmlwdG9yW2xpc3Quc2l6ZSgpXTsKLQkJbGlzdC50b0FycmF5KGNvbHVtbnMpOwotCQlyZXR1cm4gY29sdW1uczsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLmZvcm1zLmVkaXRvci5Gb3JtRWRpdG9yI2dldEN1cnJlbnRQYWdlKCkKLQkgKi8KLQlwdWJsaWMgaW50IGdldEN1cnJlbnRQYWdlKCkgewotCQlyZXR1cm4gc3VwZXIuZ2V0Q3VycmVudFBhZ2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gc3VwcHJlc3Npb24gaW5mbwotCSAqLwotCXB1YmxpYyBTdXBwcmVzc2lvbiBnZXRTdXBwcmVzc2lvbigpIHsKLQkJcmV0dXJuIHN1cHByZXNzaW9uOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNvbmZpZ0NoYW5nZWQoKSB7Ci0JCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKQotCQkJCS5nZXRDdXJyZW50TWV0aG9kQ29uZmlndXJhdGlvbigpOwotCQlpZiAoY29uZmlnICE9IGN1cnJlbnRDb25maWcpIHsKLQkJCS8vIHJlZnJlc2ggb25seSBpZiB0aGUgYWN0aXZlIHBhcnQgaXMgdGhpcyBlZGl0b3Igb3IgZGlhZ3JhbSBlZGl0b3IKLQkJCS8vIG9mIGFueSBhY3Rpdml0eSBpbiB0aGlzIHByb2Nlc3MKLQkJCS8vCi0JCQlJV29ya2JlbmNoUGFydCBhY3RpdmVQYXJ0ID0gZ2V0U2l0ZSgpLmdldFdvcmtiZW5jaFdpbmRvdygpCi0JCQkJCS5nZXRQYXJ0U2VydmljZSgpLmdldEFjdGl2ZVBhcnQoKTsKLQkJCWJvb2xlYW4gcmVmcmVzaCA9IGFjdGl2ZVBhcnQgPT0gdGhpczsKLQkJCWlmICghcmVmcmVzaCkgewotCQkJCWlmIChhY3RpdmVQYXJ0IGluc3RhbmNlb2YgQWJzdHJhY3REaWFncmFtRWRpdG9yKSB7Ci0JCQkJCURpYWdyYW1FZGl0b3JJbnB1dCBpbnB1dCA9ICgoRGlhZ3JhbUVkaXRvcklucHV0UHJveHkpKChJRWRpdG9yUGFydCkgYWN0aXZlUGFydCkKLQkJCQkJCQkuZ2V0RWRpdG9ySW5wdXQoKSkuZ2V0RGlhZ3JhbUVkaXRvcklucHV0KCk7Ci0JCQkJCXJlZnJlc2ggPSBpbnB1dC5nZXRTdXBwcmVzc2lvbigpLmdldFByb2Nlc3MoKSA9PSBzZWxlY3RlZFByb2Nlc3M7Ci0JCQkJfQotCQkJfQotCQkJaWYgKHJlZnJlc2gpIHsKLQkJCQljdXJyZW50Q29uZmlnID0gY29uZmlnOwotCQkJCXJlZnJlc2hBbGwoKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLk1ldGhvZEVsZW1lbnRFZGl0b3Ijc2V0SW5wdXQob3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldElucHV0KElFZGl0b3JJbnB1dCBpbnB1dCkgewotCQlpZiAoaW5wdXQgIT0gZ2V0RWRpdG9ySW5wdXQoKSkgewotCQkJaW5wdXRDaGFuZ2VkID0gdHJ1ZTsKLQkJfQotCQlzdXBlci5zZXRJbnB1dChpbnB1dCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuTWV0aG9kRWxlbWVudEVkaXRvciN1cGRhdGVQYWdlcygpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlUGFnZXMoKSB7Ci0JCS8vIHJlbW92ZSBhbmQgYWRkIGRlc2NyaXB0aW9uIHBhZ2UgaWYgdGhlIG1vZGVsLnhtaSBvciBjb250ZW50LnhtaSBvZgotCQkvLyB0aGUgcHJvY2VzcyBoYXZlIGJlZW4gY2hhbmdlZAotCQkvLwotCQlSZXNvdXJjZSBtb2RlbFJlc291cmNlID0gc2VsZWN0ZWRQcm9jZXNzLmVSZXNvdXJjZSgpOwotCQlSZXNvdXJjZSBjb250ZW50UmVzb3VyY2UgPSBzZWxlY3RlZFByb2Nlc3MuZ2V0UHJlc2VudGF0aW9uKCkKLQkJCQkuZVJlc291cmNlKCk7Ci0JCWlmIChjaGFuZ2VkUmVzb3VyY2VzLmNvbnRhaW5zKG1vZGVsUmVzb3VyY2UpCi0JCQkJfHwgKGNvbnRlbnRSZXNvdXJjZSAhPSBudWxsICYmIGNoYW5nZWRSZXNvdXJjZXMKLQkJCQkJCS5jb250YWlucyhjb250ZW50UmVzb3VyY2UpKSkgewotCQkJcmVtb3ZlUGFnZSgwKTsKLQkJCXRyeSB7Ci0JCQkJYWRkRGVzY3JpcHRpb25QYWdlKCk7Ci0JCQl9IGNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBlKSB7Ci0JCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpLmRpc3BsYXlFcnJvcigKLQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLlByb2Nlc3NFZGl0b3JfcmVmcmVzaEVycm9yVGl0bGUsIAotCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuUHJvY2Vzc0VkaXRvcl9yZWZyZXNoRXJyb3JNc2csIGUpOyAKLQkJCX0KLQkJfQotCQlpZiAoaW5wdXRDaGFuZ2VkKSB7Ci0JCQlpbnB1dENoYW5nZWQoZ2V0RWRpdG9ySW5wdXQoKSk7Ci0JCQlpZiAocHJvcGVydHlTaGVldFBhZ2UgIT0gbnVsbCkgewotCQkJCXByb3BlcnR5U2hlZXRQYWdlLnJlZnJlc2goKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXJlZnJlc2hBbGwoKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hBbGwoKSB7Ci0JCUJ1c3lJbmRpY2F0b3Iuc2hvd1doaWxlKGdldFNpdGUoKS5nZXRTaGVsbCgpLmdldERpc3BsYXkoKSwKLQkJCQluZXcgUnVubmFibGUoKSB7Ci0KLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJZG9SZWZyZXNoQWxsKHRydWUpOwotCQkJCQl9Ci0KLQkJCQl9KTsKLQl9Ci0KLQkvKioKLQkgKiBSZWZyZXNoIGFsbCB2aWV3ZXJzIAotCSAqIEBwYXJhbSB1cGRhdGVJRHMKLQkgKiAJCQlpZiB0cnVlLCB0aGVuIHJlZnJlc2ggYWxsIGluZGV4IGluIHZpZXdlcnMKLQkgKi8KLQlwdWJsaWMgdm9pZCBkb1JlZnJlc2hBbGwoYm9vbGVhbiB1cGRhdGVJRHMpIHsKLS8vCQlpZiAodXBkYXRlSURzKSB7Ci0vLwkJCUFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5ID0gVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLS8vCQkJCQkuZ2V0V0JTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKTsKLS8vCQkJUHJvY2Vzc1V0aWwudXBkYXRlSURzKGFkYXB0ZXJGYWN0b3J5LCBzZWxlY3RlZFByb2Nlc3MpOwotLy8JCQlQcm9jZXNzVXRpbC5yZWZyZXNoUHJlZGVjY2Vzc29yTGlzdHMoYWRhcHRlckZhY3RvcnksCi0vLwkJCQkJc2VsZWN0ZWRQcm9jZXNzKTsKLS8vCi0vLwkJCWFkYXB0ZXJGYWN0b3J5ID0gVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLS8vCQkJCQkuZ2V0UHJvY2Vzc0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKTsKLS8vCQkJUHJvY2Vzc1V0aWwudXBkYXRlSURzKGFkYXB0ZXJGYWN0b3J5LCBzZWxlY3RlZFByb2Nlc3MpOwotLy8JCX0KLQotCQl1cGRhdGVJRHModXBkYXRlSURzKTsKLQkJCi0gICAgICAgIGlmIChXQlNUYWIgIT0gbnVsbCAmJiBXQlNUYWIuZ2V0Vmlld2VyKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgV0JTVGFiLmdldFZpZXdlcigpLnJlZnJlc2goKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaWYgKE9CU1RhYiAhPSBudWxsICYmIE9CU1RhYi5nZXRWaWV3ZXIoKSAhPSBudWxsKSB7Ci0gICAgICAgIAlPQlNUYWIuZ2V0Vmlld2VyKCkucmVmcmVzaCgpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChQQlNUYWIgIT0gbnVsbCAmJiBQQlNUYWIuZ2V0Vmlld2VyKCkgIT0gbnVsbCkgewotICAgICAgICAJUEJTVGFiLmdldFZpZXdlcigpLnJlZnJlc2goKTsKLSAgICAgICAgfQotICAgICAgICBpZiAocHJvY1RhYiAhPSBudWxsICYmIHByb2NUYWIuZ2V0Vmlld2VyKCkgIT0gbnVsbCkgewotICAgICAgICAJcHJvY1RhYi5nZXRWaWV3ZXIoKS5yZWZyZXNoKCk7Ci0gICAgICAgIH0KLQotCQkKLQkJaWYgKGV4dGVuc2lvblRhYnMgIT0gbnVsbCkgewotCQkJZm9yIChQcm9jZXNzQnJlYWtkb3duU3RydWN0dXJlRm9ybVBhZ2UgZXh0UGFnZSA6IGV4dGVuc2lvblRhYnMpIHsKLQkJCQlleHRQYWdlLmdldFZpZXdlcigpLnJlZnJlc2goKTsKLQkJCX0KLQkJfQotCi0JCWlmIChwcm9wZXJ0eVNoZWV0UGFnZSAhPSBudWxsKSB7Ci0JCQlwcm9wZXJ0eVNoZWV0UGFnZS5yZWZyZXNoKCk7Ci0JCX0KLQl9Ci0JCi0JCi0gICAgLyoqCi0gICAgICogQHBhcmFtIHVwZGF0ZUlEcwotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHVwZGF0ZUlEcyhib29sZWFuIHVwZGF0ZUlEcykgewotICAgICAgICBpZiAodXBkYXRlSURzKSB7Ci0gICAgICAgICAgICBBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSA9IG51bGw7Ci0gICAgICAgICAgICBpZiAoV0JTVGFiICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBhZGFwdGVyRmFjdG9yeSA9IFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFLmdldFdCU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCk7Ci0gICAgICAgICAgICAgICAgUHJvY2Vzc1V0aWwudXBkYXRlSURzKGFkYXB0ZXJGYWN0b3J5LCBzZWxlY3RlZFByb2Nlc3MpOwotICAgICAgICAgICAgICAgIFByb2Nlc3NVdGlsLnJlZnJlc2hQcmVkZWNjZXNzb3JMaXN0cyhhZGFwdGVyRmFjdG9yeSwgc2VsZWN0ZWRQcm9jZXNzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChwcm9jVGFiICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBhZGFwdGVyRmFjdG9yeSA9IFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFLmdldFByb2Nlc3NDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KCk7Ci0gICAgICAgICAgICAgICAgUHJvY2Vzc1V0aWwudXBkYXRlSURzKGFkYXB0ZXJGYWN0b3J5LCBzZWxlY3RlZFByb2Nlc3MpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0KLQkvKioKLQkgKiBSZWZyZXNoIGFsbCBvcGVuIHByb2Nlc3MgZWRpdG9ycwotCSAqLwotCXB1YmxpYyB2b2lkIHJlZnJlc2hBbGxQcm9jZXNzRWRpdG9ycygpIHsKLQkJSUVkaXRvclJlZmVyZW5jZVtdIGVkaXRvclJlZmVyZW5jZXMgPSBnZXRTaXRlKCkuZ2V0UGFnZSgpCi0JCQkJLmdldEVkaXRvclJlZmVyZW5jZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlZGl0b3JSZWZlcmVuY2VzLmxlbmd0aDsgaSsrKSB7Ci0JCQlJRWRpdG9yUmVmZXJlbmNlIHJlZmVyZW5jZSA9IGVkaXRvclJlZmVyZW5jZXNbaV07Ci0JCQlJRWRpdG9yUGFydCBlZGl0b3IgPSByZWZlcmVuY2UuZ2V0RWRpdG9yKHRydWUpOwotCQkJaWYgKGVkaXRvciBpbnN0YW5jZW9mIFByb2Nlc3NFZGl0b3IpIHsKLQkJCQkoKFByb2Nlc3NFZGl0b3IpIGVkaXRvcikuZG9SZWZyZXNoQWxsKGZhbHNlKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuZm9ybXMuZWRpdG9yLkZvcm1FZGl0b3IjZ2V0QWN0aXZlUGFnZUluc3RhbmNlKCkKLQkgKi8KLQlwdWJsaWMgSUZvcm1QYWdlIGdldEFjdGl2ZVBhZ2VJbnN0YW5jZSgpIHsKLQkJaW50IGluZGV4ID0gZ2V0QWN0aXZlUGFnZSgpOwotCQlpZiAoaW5kZXggPT0gLTEpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCWlmIChpbmRleCA9PSAwKSB7Ci0JCQlyZXR1cm4gc3VwZXIuZ2V0QWN0aXZlUGFnZUluc3RhbmNlKCk7Ci0JCX0KLQkJcmV0dXJuIGJzUGFnZXNbaW5kZXggLSAxXTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29sbGVjdGlvbiBnZXRNb2RpZmllZFJlc291cmNlcygpIHsKLQkJQ29sbGVjdGlvbiBtb2RpZmllZFJlc291cmNlcyA9IHN1cGVyLmdldE1vZGlmaWVkUmVzb3VyY2VzKCk7Ci0JCWlmIChzdXBwcmVzc2lvbi5pc1NhdmVOZWVkZWQoKQotCQkJCSYmICFtb2RpZmllZFJlc291cmNlcy5jb250YWlucyhzZWxlY3RlZFByb2Nlc3NDb21wb25lbnQKLQkJCQkJCS5lUmVzb3VyY2UoKSkpIHsKLQkJCW1vZGlmaWVkUmVzb3VyY2VzLmFkZChzZWxlY3RlZFByb2Nlc3NDb21wb25lbnQuZVJlc291cmNlKCkpOwotCQl9Ci0JCW1vZGlmaWVkUmVzb3VyY2VzLmFkZEFsbChyZXNvdXJjZXNUb1NhdmUpOwotCi0JCXJldHVybiBtb2RpZmllZFJlc291cmNlczsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5NZXRob2RFbGVtZW50RWRpdG9yI2RvU2F2ZShvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBkb1NhdmUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCXN1cHByZXNzaW9uLnNhdmVUb01vZGVsKCk7Ci0JCXN1cGVyLmRvU2F2ZShtb25pdG9yKTsKLQkJc3VwcHJlc3Npb24uc2F2ZUlzRG9uZSgpOwotCQlyZXNvdXJjZXNUb1NhdmUuY2xlYXIoKTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlKFBST1BfRElSVFkpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLk1ldGhvZEVsZW1lbnRFZGl0b3IjaXNEaXJ0eSgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNEaXJ0eSgpIHsKLQkJaWYgKHN1cHByZXNzaW9uLmlzU2F2ZU5lZWRlZCgpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuaXNEaXJ0eSgpOwotCX0KLQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGFydC5Xb3JrYmVuY2hQYXJ0I2ZpcmVQcm9wZXJ0eUNoYW5nZShpbnQpCi0JICovCi0JcHVibGljIHZvaWQgZmlyZVByb3BlcnR5Q2hhbmdlKGludCBwcm9wZXJ0eUlkKSB7Ci0JCXN1cGVyLmZpcmVQcm9wZXJ0eUNoYW5nZShwcm9wZXJ0eUlkKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5NZXRob2RFbGVtZW50RWRpdG9yI2dldFVzZWRSZXNvdXJjZXMoKQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uPFJlc291cmNlPiBnZXRVc2VkUmVzb3VyY2VzKCkgewotCQlIYXNoU2V0PFJlc291cmNlPiB1c2VkUmVzb3VyY2VzID0gbmV3IEhhc2hTZXQ8UmVzb3VyY2U+KCk7Ci0KLQkJLy8gbW9kZWwueG1pCi0JCS8vCi0JCVJlc291cmNlIHJlc291cmNlID0gZWxlbWVudE9iai5lUmVzb3VyY2UoKTsKLQkJaWYgKHJlc291cmNlICE9IG51bGwpIHsKLQkJCXVzZWRSZXNvdXJjZXMuYWRkKHJlc291cmNlKTsKLQkJfQotCi0JCS8vIGNvbnRlbnQueG1pCi0JCS8vCi0JCXJlc291cmNlID0gc2VsZWN0ZWRQcm9jZXNzLmdldFByZXNlbnRhdGlvbigpLmVSZXNvdXJjZSgpOwotCQlpZiAocmVzb3VyY2UgIT0gbnVsbCkgewotCQkJdXNlZFJlc291cmNlcy5hZGQocmVzb3VyY2UpOwotCQl9Ci0KLQkJLy8gY29uZmlndXJhdGlvbi54bWkKLQkJLy8KLQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSBzZWxlY3RlZFByb2Nlc3MuZ2V0RGVmYXVsdENvbnRleHQoKTsKLQkJaWYgKGNvbmZpZyAhPSBudWxsKSB7Ci0JCQlyZXNvdXJjZSA9IGNvbmZpZy5lUmVzb3VyY2UoKTsKLQkJCWlmIChyZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQkJdXNlZFJlc291cmNlcy5hZGQocmVzb3VyY2UpOwotCQkJfQotCQl9Ci0KLQkJLy8gcmVzb3VyY2VzIG9mIG90aGVyIHByb2Nlc3NlcyB0aGF0IHRoaXMgcHJvY2VzcyBpcyBkZXBlbmRpbmcgb24KLQkJLy8KLQkJQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkgPSBnZXRBZGFwdGVyRmFjdG9yeUZyb21UYWIoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gbmV3IEFkYXB0ZXJGYWN0b3J5VHJlZUl0ZXJhdG9yKGFkYXB0ZXJGYWN0b3J5LAotCQkJCXNlbGVjdGVkUHJvY2Vzcyk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IG9iaiA9IFRuZ1V0aWwudW53cmFwKGl0ZXIubmV4dCgpKTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBFT2JqZWN0KSB7Ci0JCQkJcmVzb3VyY2UgPSAoKEVPYmplY3QpIG9iaikuZVJlc291cmNlKCk7Ci0JCQkJaWYgKHJlc291cmNlICE9IG51bGwpIHsKLQkJCQkJdXNlZFJlc291cmNlcy5hZGQocmVzb3VyY2UpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWxhc3RVc2VkUmVzb3VyY2VzID0gdXNlZFJlc291cmNlczsKLQotCQlyZXR1cm4gdXNlZFJlc291cmNlczsKLQl9Ci0KLQkvKioKLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIEFkYXB0ZXJGYWN0b3J5IGdldEFkYXB0ZXJGYWN0b3J5RnJvbVRhYigpIHsKLSAgICAgICAgcmV0dXJuIFdCU1RhYi5nZXRBZGFwdGVyRmFjdG9yeSgpOwotICAgIH0KLQotICAgIAotCS8qKgotCSAqIENoZWNrIHdoZXRoZXIgc2VsZWN0ZWQgb2JqZWN0cyBjYW4gYmUgcmV2ZWFsZWQgb3Igbm90IGFuZCByZXR1bnMgcmVzdWx0Ci0JICogCi0JICogQHBhcmFtIHNlbGVjdGlvbgotCSAqIAkJCUxpc3Qgb2Ygb2JqZWN0cwotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqIAkJCUFkYXB0ZXIgZmFjdG9yeSBvZiB0aGUgc2VsZWN0ZWQgb2JqZWN0cwotCSAqIEBwYXJhbSBzdXBwcmVzc2lvbgotCSAqIAkJCVN1cHByZXNzaW9uIGluZm9ybWF0aW9uCi0JICogQHJldHVybgotCSAqIAkJQm9vbGVhbiB2YWx1ZSB0byBpbmRpY2F0ZSB3aGV0aGVyIHNlbGVjdGVkIG9iamVjdHMgY2FuIGJlIHJldmVhbGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNhblJldmVhbChDb2xsZWN0aW9uPD8+IHNlbGVjdGlvbiwKLQkJCUFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LCBTdXBwcmVzc2lvbiBzdXBwcmVzc2lvbikgewotCQkvLyBOTyBtb3JlIGNoZWNrIGZvciBkdXBsaWNhdGlvbiBvZiBuYW1lIGFuZCBwcmVzZW50YXRpb24gbmFtZQotCQkvLwotLy8JCS8vIGNoZWNrIGlmIHJldmVhbGluZyB0aGUgc2VsZWN0ZWQgZWxlbWVudHMgd2lsbCBjYXVzZSBuYW1lIGR1cGxpY2F0aW9uCi0vLwkJLy8KLS8vCQlTdHJpbmcgbXNnID0gc3VwcHJlc3Npb24uY2hlY2tEdXBsaWNhdGVOYW1lQWZ0ZXJSZXZlYWwoc2VsZWN0aW9uLAotLy8JCQkJYWRhcHRlckZhY3RvcnkpOwotLy8JCWlmIChtc2cgIT0gbnVsbCkgewotLy8JCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkuZGlzcGxheUVycm9yKAotLy8JCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLlByb2Nlc3NFZGl0b3JfUmV2ZWFsX1RpdGxlLCAvLyROT04tTkxTLTEkIAotLy8JCQkJCW1zZyk7Ci0vLwkJCXJldHVybiBmYWxzZTsKLS8vCQl9Ci0vLwotLy8JCS8vIGNoZWNrIGlmIHJldmVhbGluZyB0aGUgc2VsZWN0ZWQgZWxlbWVudHMgd2lsbCBjYXVzZSBkdXBsaWNhdGUKLS8vCQkvLyBkZXNjcmlwdG9ycy4KLS8vCQkvLyBJZiBzbywgcHJvbXB0IHVzZXIgdG8gZGVsZXRlIHRoZSBkdXBsaWNhdGVzIGJlZm9yZSBjb250aW51aW5nLgotLy8JCS8vCi0vLwkJQ29sbGVjdGlvbiBkdXBsaWNhdGVzID0gUHJvY2Vzc1V0aWwKLS8vCQkJCS5nZXREdXBsaWNhdGVEZXNjcmlwdG9yc0FmdGVyUmV2ZWFsKHNlbGVjdGlvbik7Ci0vLwkJaWYgKCFkdXBsaWNhdGVzLmlzRW1wdHkoKSkgewotLy8JCQlNdWx0aVN0YXR1cyBzdGF0dXMgPSBuZXcgTXVsdGlTdGF0dXMoQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpCi0vLwkJCQkJLmdldElkKCksIDAsICIiLCBudWxsKTsgLy8kTk9OLU5MUy0xJAotLy8JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBkdXBsaWNhdGVzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotLy8JCQkJRGVzY3JpcHRvciBkZXNjID0gKERlc2NyaXB0b3IpIGl0ZXIubmV4dCgpOwotLy8JCQkJU3RyaW5nIGRlc2NUeHQgPSBUbmdVdGlsLmdldFR5cGVUZXh0KGRlc2MpCi0vLwkJCQkJCSsgIjogIiArIGRlc2MuZ2V0UHJlc2VudGF0aW9uTmFtZSgpOyAvLyROT04tTkxTLTEkCi0vLwkJCQlzdGF0dXMuYWRkKG5ldyBTdGF0dXMoSVN0YXR1cy5JTkZPLCBBdXRob3JpbmdVSVBsdWdpbgotLy8JCQkJCQkuZ2V0RGVmYXVsdCgpLmdldElkKCksIDAsIGRlc2NUeHQsIG51bGwpKTsKLS8vCQkJfQotLy8JCQlpZiAoQXV0aG9yaW5nVUlQbHVnaW4KLS8vCQkJCQkuZ2V0RGVmYXVsdCgpCi0vLwkJCQkJLmdldE1zZ0RpYWxvZygpCi0vLwkJCQkJLmRpc3BsYXlDb25maXJtYXRpb24oCi0vLwkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5Qcm9jZXNzRWRpdG9yX1JldmVhbF9UaXRsZSwgLy8kTk9OLU5MUy0xJCAKLS8vCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLlByb2Nlc3NFZGl0b3JfcHJvbXB0VG9EZWxldGVCZWZvcmVSZXZlYWwsIC8vJE5PTi1OTFMtMSQKLS8vCQkJCQkJCXN0YXR1cykgPT0gRGlhbG9nLkNBTkNFTCkgewotLy8JCQkJcmV0dXJuIGZhbHNlOwotLy8JCQl9Ci0vLwotLy8JCQkvLyBkZWxldGUgZHVwbGljYXRlIGRlc2NyaXB0b3JzCi0vLwkJCXRyeSB7Ci0vLwkJCQlQcm9jZXNzRGVsZXRlQWN0aW9uLmRlbGV0ZShkdXBsaWNhdGVzKTsKLS8vCQkJfSBjYXRjaCAoT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24gZSkgewotLy8JCQkJcmV0dXJuIGZhbHNlOwotLy8JCQl9Ci0vLwkJfQotCi0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBoYXNJbmhlcml0ZWQoQ29sbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gc2VsZWN0aW9uLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyLm5leHQoKTsKLQkJCWlmIChQcm9jZXNzVXRpbC5pc0luaGVyaXRlZChlbGVtZW50KSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSVByZWZlcmVuY2VTdG9yZVdyYXBwZXIgZ2V0UHJlZmVyZW5jZVN0b3JlKCkgewotCQkvLyBwcmVmZXJlbmNlIGlzIG1hbmFnZWQgYnkgbGlicmFyeSBwbHVnaW4sCi0JCS8vIHNpbmNlIHRoaXMgcHJlZmVyZW5jZXMgaXMgYWxzbyB1c2VkIGZvciBicm93c2luZyBhbmQgcHVibGlzaGluZwotCQkvLyBKaW5odWEgWGkgMDgvMjEvMjAwNgotCQkvLyBJUHJlZmVyZW5jZVN0b3JlIHN0b3JlID0gQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpCi0JCS8vIC5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQkJSVByZWZlcmVuY2VTdG9yZVdyYXBwZXIgc3RvcmUgPSBMaWJyYXJ5UGx1Z2luLmdldERlZmF1bHQoKQotCQkJCS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQotCQlyZXR1cm4gc3RvcmU7Ci0JfQotCQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcm90ZWN0ZWQgRGlhZ3JhbUVkaXRvckhlbHBlciBnZXREaWFncmFtRWRpdG9ySGVscGVyKCl7Ci0JCWlmKGRpYWdyYW1FZGl0b3JIZWxwZXIgPT0gbnVsbCl7Ci0JCQlkaWFncmFtRWRpdG9ySGVscGVyID0gbmV3IERpYWdyYW1FZGl0b3JIZWxwZXIoKTsKLQkJCWRpYWdyYW1FZGl0b3JIZWxwZXIuZ2V0RGlhZ3JhbU1hbmFnZXIoc2VsZWN0ZWRQcm9jZXNzKTsKLQkJfQotCQlyZXR1cm4gZGlhZ3JhbUVkaXRvckhlbHBlcjsKLQl9Ci0JCi0JLyoqCi0JICogT3ZlcnJpZGUgd2l0aG91dCBhbnkgY29kZSBjaGFuZ2UganVzdCBmb3Ige0BsaW5rIFByb2Nlc3NFZGl0b3JBY3Rpb25CYXJDb250cmlidXRvcn0gdG8gYWNjZXNzIGl0LgotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBpbnQgZ2V0QWN0aXZlUGFnZSgpIHsKLQkJcmV0dXJuIHN1cGVyLmdldEFjdGl2ZVBhZ2UoKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9lZGl0b3JzL1Byb2Nlc3NFZGl0b3JBY3Rpb25CYXJDb250cmlidXRvci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9lZGl0b3JzL1Byb2Nlc3NFZGl0b3JBY3Rpb25CYXJDb250cmlidXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YjI4NDA4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZWRpdG9ycy9Qcm9jZXNzRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1MzAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLlVuZXhlY3V0YWJsZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnVpLnZpZXdlci5JVmlld2VyUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkFic3RyYWN0VHJlZUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5JRWRpdGluZ0RvbWFpblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkRlbGVnYXRpbmdXcmFwcGVySXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklDaGFuZ2VOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5Db21tYW5kQWN0aW9uSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uQ29weUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uQ3V0QWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5EZWxldGVBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLlBhc3RlQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zLklNb2RpZnlpbmdBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zLklXb3JrYmVuY2hQYXJ0QWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9ucy5JbmRlbnRBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zLk1ldGhvZExpYnJhcnlBY3Rpb25CYXJDb250cmlidXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnMuTW92ZURvd25BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zLk1vdmVVcEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnMuT3V0ZGVudEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnMuUHJvY2Vzc0F1dG9TeW5jaHJvbml6ZUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnMuU3luY2hyb25pemF0aW9uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9ucy5VcGRhdGVTdXBwcmVzc2lvbkZyb21CYXNlQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZGlhbG9ncy5EaWFsb2dIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5kaWFsb2dzLlVzZXJEZWZpbmVkRGlhZ3JhbURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLlByb2Nlc3NCcmVha2Rvd25TdHJ1Y3R1cmVGb3JtUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuRVBGUHJvcGVydHlTaGVldFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS52aWV3cy5MaWJyYXJ5VmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnZpZXdzLlByb2Nlc3NWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS52aWV3cy5WaWV3SGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLkFESW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5BRERJbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5wYXJ0LkRpYWdyYW1FZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnBhcnQudXRpbC5EaWFncmFtRWRpdG9yVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnNlcnZpY2VzLkRpYWdyYW1NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLnV0aWwuR3JhcGhpY2FsRGF0YUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC51dGlsLkdyYXBoaWNhbERhdGFNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLnVpLnNlcnZpY2UuRGlhZ3JhbUVkaXRvckhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLnBhcnQuV1BEREltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLkFjdGl2aXR5RGVlcENvcHlDb25maWd1cmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSUFjdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklSZXNvdXJjZUF3YXJlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuUmVzb3VyY2VBd2FyZVBhc3RlRnJvbUNsaXBib2FyZENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkFjdGl2aXR5V3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLklCU0l0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZC5BY3Rpdml0eURyb3BDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kLkNvbnRyaWJ1dGVUb0FjdGl2aXR5Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZC5Mb2NhbGx5UmVwbGFjZUFuZERlZXBDb3B5Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZC5SZXBsYWNlQWN0aXZpdHlDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudWkuSUFjdGlvblR5cGVQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnVpLlVzZXJJbnRlcmFjdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuRGlhZ3JhbU9wdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkV4cG9zZWRBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuSURpYWdyYW1NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Qcm9jZXNzVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuU3VwcHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlN1cHByZXNzaW9uLlN1cHByZXNzaW9uQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb24uRGVwZW5kZW5jeUNoZWNrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuYWN0aW9ucy5MaWJyYXJ5TG9ja2luZ09wZXJhdGlvblJ1bm5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5hY3Rpb25zLlByb2Nlc3NEZWxldGVBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLkZpbGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1pbGVzdG9uZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQuZG9tYWluLlRyYWNlYWJsZUFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklUb29sQmFyTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uTWVudU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLlNlcGFyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uSVJ1bm5hYmxlV2l0aFByb2dyZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkFic3RyYWN0VHJlZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkFycmF5Q29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkJ1c3lJbmRpY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JQWN0aW9uQmFyczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBhcnRJbml0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuQWN0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLkxpc3RTZWxlY3Rpb25EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuZWRpdG9yLklGb3JtUGFnZTsKLQotLyoqCi0gKiBBY3Rpb24gYmFyIGNvbnRyaWJ0dXRvciBmb3IgcHJvY2VzcyBlZGl0b3IKLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5lIDEuMgotICovCi1wdWJsaWMgY2xhc3MgUHJvY2Vzc0VkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yIGV4dGVuZHMKLQkJTWV0aG9kTGlicmFyeUFjdGlvbkJhckNvbnRyaWJ1dG9yIHsKLQlwcm90ZWN0ZWQgQ29sbGVjdGlvbjxJQWN0aW9uPiByZWdpc3RlcmVkQWN0aW9ucyA9IG5ldyBBcnJheUxpc3Q8SUFjdGlvbj4oKTsKLQotCXByb3RlY3RlZCBib29sZWFuIGxvY2tlZDsKLQotCXByb3RlY3RlZCBJQWN0aW9uIHJvbGx1cEFjdGlvbiA9IG5ldyBBY3Rpb24oCi0JCQlBdXRob3JpbmdVSVJlc291cmNlcy5Qcm9jZXNzRWRpdG9yX0FjdGlvbl9Sb2xsVXApIHsKLQotCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQlib29sZWFuIHdhc1JvbGxlZFVwID0gYnNJdGVtUHJvdmlkZXIuaXNSb2xsZWRVcCgpOwotCQkJYnNJdGVtUHJvdmlkZXIuc2V0Um9sbGVkVXAoIWJzSXRlbVByb3ZpZGVyLmlzUm9sbGVkVXAoKSk7Ci0JCQkoKElDaGFuZ2VOb3RpZmllcikgYnNJdGVtUHJvdmlkZXIpCi0JCQkJCS5maXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKAotCQkJCQkJCW5ldyBFTm90aWZpY2F0aW9uSW1wbCgKLQkJCQkJCQkJCShJbnRlcm5hbEVPYmplY3QpIHNlbGVjdGVkQWN0aXZpdHksCi0JCQkJCQkJCQlOb3RpZmljYXRpb24uQURELCBudWxsLCBudWxsLCBudWxsLCBmYWxzZSksCi0JCQkJCQkJc2VsZWN0ZWRBY3Rpdml0eSwgdHJ1ZSwgZmFsc2UpKTsKLQotCQkJaWYgKGJzSXRlbVByb3ZpZGVyIGluc3RhbmNlb2YgRGVsZWdhdGluZ1dyYXBwZXJJdGVtUHJvdmlkZXIpIHsKLQkJCQkvLyBSZWZyZXNoaW5nIGZvciBncmVlbiBhY3Rpdml0aWVzIGR1cmluZyByb2xsdXAKLQkJCQlEZWxlZ2F0aW5nV3JhcHBlckl0ZW1Qcm92aWRlciBwcm92aWRlciA9IChEZWxlZ2F0aW5nV3JhcHBlckl0ZW1Qcm92aWRlcikgYnNJdGVtUHJvdmlkZXI7Ci0JCQkJcHJvdmlkZXIuZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbigKLQkJCQkJCW5ldyBOb3RpZmljYXRpb25JbXBsKE5vdGlmaWNhdGlvbi5TRVQsIHByb3ZpZGVyLAotCQkJCQkJCQlwcm92aWRlciksIHByb3ZpZGVyLCB0cnVlLCBmYWxzZSkpOwotCQkJfQotCQkJaWYgKHdhc1JvbGxlZFVwKSB7Ci0JCQkJUHJvY2Vzc1ZpZXdlciB2aWV3ZXIgPSAoUHJvY2Vzc1ZpZXdlcikgKChQcm9jZXNzRWRpdG9yKSBhY3RpdmVFZGl0b3IpLmN1cnJlbnRWaWV3ZXI7Ci0JCQkJdmlld2VyLmV4cGFuZFRvTGV2ZWwoc2VsZWN0ZWRBY3Rpdml0eSwKLQkJCQkJCUFic3RyYWN0VHJlZVZpZXdlci5BTExfTEVWRUxTKTsKLQotCQkJCS8vIGV2ZW50aG91Z2ggd2Ugc3dpdGNoZWQgb2ZmIGNyZWF0aW5nIG5ldyBhY3Rpdml0aWVzIGluCi0JCQkJLy8gV0JTLAotCQkJCS8vIHVzZXIgY2FuIHN0aWxsIGNyZWF0ZSB0aHJ1IEFELiBIZW5jZSB3ZSBuZWVkIHRvIHVwZGF0ZQotCQkJCS8vIElEcwotCQkJCS8vIGFmdGVyd2FyZHMKLQkJCQlkb1JlZnJlc2goKTsKLQkJCX0KLQkJfQotCi0JfTsKLQotCXByb3RlY3RlZCBNb3ZlVXBBY3Rpb24gbW92ZVVwQWN0aW9uID0gbmV3IE1vdmVVcEFjdGlvbigpIHsKLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBib29sZWFuIGFjY2VwdChJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJCWlmKCFpc0VkaXRpbmdBbGxvd2VkKCkpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQlyZXR1cm4gc3VwZXIuYWNjZXB0KHNlbGVjdGlvbik7Ci0JCX0JCQotCX07Ci0KLQlwcm90ZWN0ZWQgTW92ZURvd25BY3Rpb24gbW92ZURvd25BY3Rpb24gPSBuZXcgTW92ZURvd25BY3Rpb24oKSB7Ci0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHQoSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCQlpZighaXNFZGl0aW5nQWxsb3dlZCgpKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJcmV0dXJuIHN1cGVyLmFjY2VwdChzZWxlY3Rpb24pOwotCQl9Ci0JfTsKLQotCXByaXZhdGUgSUFjdGlvbiBwcmVmZXJlbmNlQWN0aW9uID0gbmV3IEFjdGlvbigKLQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLlByb2Nlc3NFZGl0b3JfQWN0aW9uX1ByZWZlcmVuY2VzKSB7Ci0JCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCS8vIG9wZW4gcHJvY2VzcyBwcmVmZXJlbmNlIHBhZ2UKLQkJCW9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuUHJlZmVyZW5jZXNVdGlsCi0JCQkJCS5jcmVhdGVQcmVmZXJlbmNlRGlhbG9nT24oCi0JCQkJCQkJZ2V0QWN0aXZlRWRpdG9yKCkuZ2V0RWRpdG9yU2l0ZSgpLmdldFNoZWxsKCksCi0JCQkJCQkJIm9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJlZmVyZW5jZXMuUHJvY2Vzc0VkaXRvclByZWZlcmVuY2VQYWdlIiwgLy8kTk9OLU5MUy0xJAotCQkJCQkJCW51bGwsIG51bGwpLm9wZW4oKTsKLQkJfQotCX07Ci0KLQlwcm90ZWN0ZWQgSUFjdGlvbiBvcGVuQmFzZUFjdGl2aXR5ID0gbmV3IEFjdGlvbigKLQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLlByb2Nlc3NFZGl0b3JfQWN0aW9uX09wZW5CYXNlQWN0aXZpdHkpIHsKLQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJVmFyaWFiaWxpdHlFbGVtZW50IGJhc2UgPSBzZWxlY3RlZEFjdGl2aXR5Ci0JCQkJCS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCk7Ci0JCQlQcm9jZXNzIHByb2MgPSBUbmdVdGlsLmdldE93bmluZ1Byb2Nlc3MoKEJyZWFrZG93bkVsZW1lbnQpIGJhc2UpOwotCQkJdHJ5IHsKLQkJCQlpbnQgaWQgPSAoKFByb2Nlc3NFZGl0b3IpIGFjdGl2ZUVkaXRvcikuZ2V0QWN0aXZlUGFnZSgpOwotCQkJCUlTZWxlY3Rpb24gc2VsZWN0aW9uID0gbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oYmFzZSk7Ci0KLQkJCQlJRWRpdG9ySW5wdXQgaW5wdXQgPSBuZXcgTWV0aG9kRWxlbWVudEVkaXRvcklucHV0KAotCQkJCQkJKE1ldGhvZEVsZW1lbnQpIHByb2MuZUNvbnRhaW5lcigpKTsKLQkJCQlQcm9jZXNzRWRpdG9yIGVkaXRvciA9IChQcm9jZXNzRWRpdG9yKSBnZXRQYWdlKCkub3BlbkVkaXRvcigKLQkJCQkJCWlucHV0LCBQcm9jZXNzRWRpdG9yLkVESVRPUl9JRCk7Ci0JCQkJZWRpdG9yLnNldEFjdGl2ZVBhZ2UoaWQpOwotCQkJCWVkaXRvci5ic1BhZ2VzW2lkIC0gMV0uZ2V0Vmlld2VyKCkKLQkJCQkJCS5zZXRTZWxlY3Rpb24oc2VsZWN0aW9uLCB0cnVlKTsKLQkJCX0gY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIGUpIHsKLQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQl9Ci0JCX0KLQl9OwotCi0JcHJvdGVjdGVkIElBY3Rpb24gb3BlbldvcmtmbG93RWRpdG9yQWN0aW9uID0gbmV3IEFjdGlvbigKLQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLlByb2Nlc3NFZGl0b3JfQWN0aW9uX09wZW5BY3Rpdml0eURpYWdyYW0pIHsKLQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJdHJ5IHsKLQkJCQl0cnkgewotCQkJCQlJRWRpdG9yUGFydCBwYXJlbnQgPSBnZXRQYWdlKCkuZ2V0QWN0aXZlRWRpdG9yKCk7Ci0JCQkJCUlFZGl0b3JJbnB1dCBpbnB1dCA9IG5ldyBHcmFwaGljYWxXb3JrZmxvd0VkaXRvci5FZGl0b3JJbnB1dCgKLQkJCQkJCQlzZWxlY3RlZE9iamVjdCwgZ2V0U3VwcHJlc3Npb24oKSk7Ci0JCQkJCUlFZGl0b3JQYXJ0IHBhcnQgPSBnZXRQYWdlKCkub3BlbkVkaXRvcihpbnB1dCwKLQkJCQkJCQlQcm9jZXNzRWRpdG9yLldPUktGTE9XX0VESVRPUl9JRCk7Ci0JCQkJCWlmIChwYXJ0IGluc3RhbmNlb2YgQWJzdHJhY3REaWFncmFtRWRpdG9yKSB7Ci0JCQkJCQlBYnN0cmFjdERpYWdyYW1FZGl0b3IgZWRpdG9yID0gKEFic3RyYWN0RGlhZ3JhbUVkaXRvcikgcGFydDsKLQkJCQkJCWVkaXRvci5zZXRQYXJlbnRFZGl0b3IocGFyZW50KTsKLQkJCQkJfQotCQkJCX0gY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIGV4Y2VwdGlvbikgewotCQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoCi0JCQkJCQkJZXhjZXB0aW9uKTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQl9Ci0JCX0KLQl9OwotCQotCXByaXZhdGUgY2xhc3MgT3BlbkRpYWdyYW1FZGl0b3JBY3Rpb24gZXh0ZW5kcyBBY3Rpb24gewotCi0JCXByaXZhdGUgaW50IGRpYWdyYW1UeXBlOwotCi0JCXB1YmxpYyBPcGVuRGlhZ3JhbUVkaXRvckFjdGlvbihTdHJpbmcgdGV4dCwgaW50IGRpYWdyYW1UeXBlKSB7Ci0JCQlzdXBlcih0ZXh0KTsKLQkJCXRoaXMuZGlhZ3JhbVR5cGUgPSBkaWFncmFtVHlwZTsKLQkJCXNldEltYWdlRGVzY3JpcHRvcihnZXRJbWFnZURlc2NyaXB0b3IoZGlhZ3JhbVR5cGUpKTsKLQkJCXNldERpc2FibGVkSW1hZ2VEZXNjcmlwdG9yKGdldERpc2FibGVkSW1hZ2VEZXNjcmlwdG9yKGRpYWdyYW1UeXBlKSk7Ci0JCX0KLQkJCi0JCXByaXZhdGUgSW1hZ2VEZXNjcmlwdG9yIGdldEltYWdlRGVzY3JpcHRvcihpbnQgZGlhZ3JhbVR5cGUpIHsKLQkJCXN3aXRjaChkaWFncmFtVHlwZSkgewotCQkJY2FzZSBJRGlhZ3JhbU1hbmFnZXIuQUNUSVZJVFlfRElBR1JBTToKLQkJCQlyZXR1cm4gQURJbWFnZXMuSU1HX0RFU0NfRURJVE9SOwotCQkJY2FzZSBJRGlhZ3JhbU1hbmFnZXIuQUNUSVZJVFlfREVUQUlMX0RJQUdSQU06Ci0JCQkJcmV0dXJuIEFEREltYWdlcy5JTUdfREVTQ19FRElUT1I7Ci0JCQljYXNlIElEaWFncmFtTWFuYWdlci5XT1JLX1BST0RVQ1RfREVQRU5ERU5DWV9ESUFHUkFNOgotCQkJCXJldHVybiBXUERESW1hZ2VzLklNR19ERVNDX0VESVRPUjsKLQkJCX0KLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCQotCQlwcml2YXRlIEltYWdlRGVzY3JpcHRvciBnZXREaXNhYmxlZEltYWdlRGVzY3JpcHRvcihpbnQgZGlhZ3JhbVR5cGUpIHsKLQkJCXN3aXRjaChkaWFncmFtVHlwZSkgewotCQkJY2FzZSBJRGlhZ3JhbU1hbmFnZXIuQUNUSVZJVFlfRElBR1JBTToKLQkJCQlyZXR1cm4gQURJbWFnZXMuRElTQUJMRURfSU1HX0RFU0NfRURJVE9SOwotCQkJY2FzZSBJRGlhZ3JhbU1hbmFnZXIuQUNUSVZJVFlfREVUQUlMX0RJQUdSQU06Ci0JCQkJcmV0dXJuIEFEREltYWdlcy5ESVNBQkxFRF9JTUdfREVTQ19FRElUT1I7Ci0JCQljYXNlIElEaWFncmFtTWFuYWdlci5XT1JLX1BST0RVQ1RfREVQRU5ERU5DWV9ESUFHUkFNOgotCQkJCXJldHVybiBXUERESW1hZ2VzLkRJU0FCTEVEX0lNR19ERVNDX0VESVRPUjsKLQkJCX0KLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQlEaWFncmFtTWFuYWdlciBtZ3IgPSBudWxsOwotCQkJdHJ5IHsKLQkJCQlpZighUHJvY2Vzc1V0aWwuaXNJbmhlcml0ZWQoc2VsZWN0ZWRPYmplY3QpKSB7Ci0JCQkJCW1nciA9IERpYWdyYW1NYW5hZ2VyLmdldEluc3RhbmNlKGdldFByb2Nlc3MoKSwgdGhpcyk7Ci0JCQkJCVJlc291cmNlIHJlc291cmNlID0gbWdyLmdldFJlc291cmNlKCk7Ci0JCQkJCWlmKG1nci5pc05ld1Jlc291cmNlKCkgJiYgIW5ldyBGaWxlKEZpbGVNYW5hZ2VyLnRvRmlsZVN0cmluZyhyZXNvdXJjZS5nZXRVUkkoKSkpLmV4aXN0cygpKSB7Ci0JCQkJCQlib29sZWFuIHJlc3VsdCA9IEF1dGhvcmluZ1VJUGx1Z2luCi0JCQkJCQkuZ2V0RGVmYXVsdCgpCi0JCQkJCQkuZ2V0TXNnRGlhbG9nKCkKLQkJCQkJCS5kaXNwbGF5Q29uZmlybWF0aW9uKEF1dGhvcmluZ1VJUmVzb3VyY2VzLk5ld0RpYWdyYW1GaWxlX3RpdGxlLAotCQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5wcm9tcHRDcmVhdGVOZXdEaWFncmFtRmlsZV9tc2cpOwotCQkJCQkJaWYocmVzdWx0KSB7Ci0JCQkJCQkJcmVzb3VyY2Uuc2F2ZShDb2xsZWN0aW9ucy5FTVBUWV9NQVApOwotCi0JCQkJCQkJLy8gc3RpbGwga2VlcCB0aGUgZmxhZyByZXNvdXJjZUlzTmV3IHNldCBzbyBlZGl0b3Igd2lsbCBiZSBtYXJrZWQgZGlydHkKLQkJCQkJCQkvLwotCQkJCQkJCW1nci5zZXRSZXNvdXJjZUlzTmV3KHRydWUpOwotCQkJCQkJfQotCQkJCQkJZWxzZSB7Ci0JCQkJCQkJcmV0dXJuOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCW9wZW5EaWFncmFtKGRpYWdyYW1UeXBlKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoCi0JCQkJCQlleGNlcHRpb24pOwotCQkJfQotCQkJZmluYWxseSB7Ci0JCQkJaWYobWdyICE9IG51bGwpIHsKLQkJCQkJbWdyLnJlbW92ZUNvbnN1bWVyKHRoaXMpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkKLQlwcml2YXRlIElBY3Rpb24gbmV3QWN0aXZpdHlEaWFncmFtRWRpdG9yID0gbmV3IE9wZW5EaWFncmFtRWRpdG9yQWN0aW9uKAotCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuUHJvY2Vzc0VkaXRvcl9BY3Rpb25fT3BlbkFjdGl2aXR5RGlhZ3JhbSwgSURpYWdyYW1NYW5hZ2VyLkFDVElWSVRZX0RJQUdSQU0pOwotCi0JcHJpdmF0ZSBJQWN0aW9uIG5ld0FjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvciA9IG5ldyBPcGVuRGlhZ3JhbUVkaXRvckFjdGlvbigKLQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLlByb2Nlc3NFZGl0b3JfQWN0aW9uX09wZW5BY3Rpdml0eURldGFpbERpYWdyYW0sIElEaWFncmFtTWFuYWdlci5BQ1RJVklUWV9ERVRBSUxfRElBR1JBTSk7Ci0KLQlwcml2YXRlIElBY3Rpb24gbmV3V1BEaWFncmFtRWRpdG9yID0gbmV3IE9wZW5EaWFncmFtRWRpdG9yQWN0aW9uKAotCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuUHJvY2Vzc0VkaXRvcl9BY3Rpb25fT3BlbldvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW0sCi0JCQlJRGlhZ3JhbU1hbmFnZXIuV09SS19QUk9EVUNUX0RFUEVOREVOQ1lfRElBR1JBTSk7Ci0KLQkvLyBPcGVuIHdvcmtmbG93IGRldGFpbCBhY3Rpb24KLQkvLwotCXByb3RlY3RlZCBJQWN0aW9uIG9wZW5Xb3JrZmxvd0RldGFpbEVkaXRvckFjdGlvbiA9IG5ldyBBY3Rpb24oCi0JCQlBdXRob3JpbmdVSVJlc291cmNlcy5Qcm9jZXNzRWRpdG9yX0FjdGlvbl9PcGVuQWN0aXZpdHlEZXRhaWxEaWFncmFtKSB7Ci0JCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCXRyeSB7Ci0JCQkJdHJ5IHsKLQkJCQkJSUVkaXRvclBhcnQgcGFyZW50ID0gZ2V0UGFnZSgpLmdldEFjdGl2ZUVkaXRvcigpOwotCQkJCQlJRWRpdG9ySW5wdXQgaW5wdXQgPSBuZXcgQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9yLkVkaXRvcklucHV0KAotCQkJCQkJCXNlbGVjdGVkT2JqZWN0LCBnZXRTdXBwcmVzc2lvbigpKTsKLQkJCQkJSUVkaXRvclBhcnQgcGFydCA9IGdldFBhZ2UoKS5vcGVuRWRpdG9yKGlucHV0LAotCQkJCQkJCVByb2Nlc3NFZGl0b3IuQUNUSVZJVFlfREVUQUlMX0RJQUdSQU1fRURJVE9SX0lEKTsKLQkJCQkJaWYgKHBhcnQgaW5zdGFuY2VvZiBBYnN0cmFjdERpYWdyYW1FZGl0b3IpIHsKLQkJCQkJCUFic3RyYWN0RGlhZ3JhbUVkaXRvciBlZGl0b3IgPSAoQWJzdHJhY3REaWFncmFtRWRpdG9yKSBwYXJ0OwotCQkJCQkJZWRpdG9yLnNldFBhcmVudEVkaXRvcihwYXJlbnQpOwotCQkJCQl9Ci0JCQkJfSBjYXRjaCAoUGFydEluaXRFeGNlcHRpb24gZXhjZXB0aW9uKSB7Ci0JCQkJCWV4Y2VwdGlvbi5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJfQotCi0JCX0KLQl9OwotCi0JcHJvdGVjdGVkIElBY3Rpb24gb3BlbldQRGVwZW5kZW5jeUVkaXRvckFjdGlvbiA9IG5ldyBBY3Rpb24oCi0JCQlBdXRob3JpbmdVSVJlc291cmNlcy5Qcm9jZXNzRWRpdG9yX0FjdGlvbl9PcGVuV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbSkgewotCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQl0cnkgewotCQkJCXRyeSB7Ci0JCQkJCUlFZGl0b3JQYXJ0IHBhcmVudCA9IGdldFBhZ2UoKS5nZXRBY3RpdmVFZGl0b3IoKTsKLQkJCQkJTWV0aG9kRWxlbWVudEVkaXRvcklucHV0IGlucHV0ID0gbmV3IEJyZWFrZG93bkVsZW1lbnRFZGl0b3JJbnB1dCgKLQkJCQkJCQlzZWxlY3RlZE9iamVjdCwgZ2V0U3VwcHJlc3Npb24oKSkgewotCQkJCQl9OwotCQkJCQlJRWRpdG9yUGFydCBwYXJ0ID0gZ2V0UGFnZSgpLm9wZW5FZGl0b3IoaW5wdXQsCi0JCQkJCQkJUHJvY2Vzc0VkaXRvci5XUERFUEVOREVOQ1lfRURJVE9SX0lEKTsKLQkJCQkJaWYgKHBhcnQgaW5zdGFuY2VvZiBBYnN0cmFjdERpYWdyYW1FZGl0b3IpIHsKLQkJCQkJCUFic3RyYWN0RGlhZ3JhbUVkaXRvciBlZGl0b3IgPSAoQWJzdHJhY3REaWFncmFtRWRpdG9yKSBwYXJ0OwotCQkJCQkJZWRpdG9yLnNldFBhcmVudEVkaXRvcihwYXJlbnQpOwotCQkJCQl9Ci0JCQkJfSBjYXRjaCAoUGFydEluaXRFeGNlcHRpb24gZXhjZXB0aW9uKSB7Ci0JCQkJCWV4Y2VwdGlvbi5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJfQotCQl9Ci0JfTsKLQotCXByb3RlY3RlZCBJQWN0aW9uIHJlcGxhY2VBY3Rpb24gPSBuZXcgQWN0aW9uKAotCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuUHJvY2Vzc0VkaXRvcl9BY3Rpb25fUmVwbGFjZSkgewotCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQlJUmVzb3VyY2VBd2FyZUNvbW1hbmQgY21kID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJY21kID0gbmV3IFJlcGxhY2VBY3Rpdml0eUNvbW1hbmQoCi0JCQkJCQkoQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIGJzSXRlbVByb3ZpZGVyKTsKLQkJCQlnZXRBY3Rpb25NYW5hZ2VyKCkuZXhlY3V0ZShjbWQpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQl9IGZpbmFsbHkgewotCQkJCWlmIChjbWQgIT0gbnVsbCkgewotCQkJCQl0cnkgewotCQkJCQkJY21kLmRpc3Bvc2UoKTsKLQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX07Ci0KLQlwcm90ZWN0ZWQgSUFjdGlvbiBsb2NhbFJlcGxhY2VtZW50QW5kRGVlcENvcHkgPSBuZXcgQWN0aW9uKAotCQkJTGlicmFyeUVkaXRSZXNvdXJjZXMubG9jYWxSZXBsYWNlbWVudEFuZERlZXBDb3B5X3RleHQpIHsKLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uI3J1bigpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQlSdW5uYWJsZSBydW5uYWJsZSA9IG5ldyBSdW5uYWJsZSgpIHsKLQotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJSVJlc291cmNlQXdhcmVDb21tYW5kIGNtZCA9IG51bGw7Ci0JCQkJCXRyeSB7Ci0JCQkJCQljbWQgPSBuZXcgTG9jYWxseVJlcGxhY2VBbmREZWVwQ29weUNvbW1hbmQoCi0JCQkJCQkJCShCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgYnNJdGVtUHJvdmlkZXIpOwotCQkJCQkJZ2V0QWN0aW9uTWFuYWdlcigpLmV4ZWN1dGUoY21kKTsKLQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCQkJfSBmaW5hbGx5IHsKLQkJCQkJCWlmIChjbWQgIT0gbnVsbCkgewotCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCWNtZC5kaXNwb3NlKCk7Ci0JCQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpCi0JCQkJCQkJCQkJLmxvZ0Vycm9yKGUpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQotCQkJfTsKLQotCQkJVXNlckludGVyYWN0aW9uSGVscGVyLnJ1bkluVUkocnVubmFibGUsIGdldFRleHQoKSk7Ci0JCX0KLQl9OwotCi0JcHJvdGVjdGVkIElBY3Rpb24gY29udHJpYnV0ZUFjdGlvbiA9IG5ldyBBY3Rpb24oCi0JCQlBdXRob3JpbmdVSVJlc291cmNlcy5Qcm9jZXNzRWRpdG9yX0FjdGlvbl9Db250cmlidXRlKSB7Ci0JCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCUlSZXNvdXJjZUF3YXJlQ29tbWFuZCBjbWQgPSBudWxsOwotCQkJdHJ5IHsKLQkJCQljbWQgPSBuZXcgQ29udHJpYnV0ZVRvQWN0aXZpdHlDb21tYW5kKAotCQkJCQkJKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSBic0l0ZW1Qcm92aWRlcik7Ci0JCQkJZ2V0QWN0aW9uTWFuYWdlcigpLmV4ZWN1dGUoY21kKTsKLQkJCQkvLyBQcm9jZXNzVXRpbC5jb250cmlidXRlVG9BY3Rpdml0eSgoQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpYnNJdGVtUHJvdmlkZXIsCi0JCQkJLy8gKChQcm9jZXNzRm9ybUVkaXRvcilhY3RpdmVFZGl0b3IpLmVkaXRpbmdEb21haW4uZ2V0QWRhcHRlckZhY3RvcnkoKSk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCX0gZmluYWxseSB7Ci0JCQkJaWYgKGNtZCAhPSBudWxsKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQljbWQuZGlzcG9zZSgpOwotCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfTsKLQotCXByaXZhdGUgY2xhc3MgRWRpdG9yU3VwcHJlc3Npb25Db21tYW5kIGV4dGVuZHMgU3VwcHJlc3Npb25Db21tYW5kIHsKLQkJRWRpdG9yU3VwcHJlc3Npb25Db21tYW5kKFN1cHByZXNzaW9uIHN1cHByZXNzaW9uLCBMaXN0IHNlbGVjdGlvbiwKLQkJCQlib29sZWFuIHN1cHByZXNzZWQpIHsKLQkJCXN1cGVyKHN1cHByZXNzaW9uLCBzZWxlY3Rpb24sIHN1cHByZXNzZWQpOwotCQl9Ci0KLQkJcHJpdmF0ZSB2b2lkIHJlZnJlc2goKSB7Ci0JCQlpZiAoIWdldFJlc3VsdCgpLmlzRW1wdHkoKSkgewotCQkJCVByb2Nlc3NFZGl0b3IgZWRpdG9yID0gKFByb2Nlc3NFZGl0b3IpIGdldEFjdGl2ZUVkaXRvcigpOwotCQkJCWlmIChpc1JlYWRPbmx5RWxlbWVudEFmZmVjdGVkKCkpIHsKLQkJCQkJaWYgKFByb2Nlc3NFZGl0b3IuaGFzSW5oZXJpdGVkKHNlbGVjdGlvbikpIHsKLQkJCQkJCWVkaXRvci5yZWZyZXNoQWxsUHJvY2Vzc0VkaXRvcnMoKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCWVkaXRvci5kb1JlZnJlc2hBbGwoZmFsc2UpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWVkaXRvci5maXJlUHJvcGVydHlDaGFuZ2UoSUVkaXRvclBhcnQuUFJPUF9ESVJUWSk7Ci0KLQkJCQkvLyBEbyBEaWFncmFtIEVkaXRvcnMgcmVmcmVzaAotCQkJCUxpc3Q8SUVkaXRvclJlZmVyZW5jZT4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8SUVkaXRvclJlZmVyZW5jZT4oKTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBzZWxlY3Rpb24uaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCU9iamVjdCBlbGVtZW50ID0gaXRlci5uZXh0KCk7Ci0JCQkJCURpYWdyYW1FZGl0b3JIZWxwZXIuY2xvc2VEaWFncmFtRWRpdG9ycyhlbGVtZW50LCBsaXN0KTsKLQkJCQkJRGlhZ3JhbUVkaXRvckhlbHBlci5yZWZyZXNoUGFyZW50RGlhZ3JhbUVkaXRvcnMoZWxlbWVudCwKLQkJCQkJCQlsaXN0LCB0cnVlKTsKLQkJCQkJbGlzdC5jbGVhcigpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCS8qKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5TdXBwcmVzc2lvbi5TdXBwcmVzc2lvbkNvbW1hbmQjZGlkRXhlY3V0ZSgpCi0JCSAqLwotCQlwcm90ZWN0ZWQgdm9pZCBkaWRFeGVjdXRlKCkgewotCQkJcmVmcmVzaCgpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlN1cHByZXNzaW9uLlN1cHByZXNzaW9uQ29tbWFuZCNkaWRVbmRvKCkKLQkJICovCi0JCXByb3RlY3RlZCB2b2lkIGRpZFVuZG8oKSB7Ci0JCQlyZWZyZXNoKCk7Ci0JCX0KLQotCX0KLQotCS8vVE9ETzogbW92ZSB0aGlzIGFjdGlvbiB0byBpdHMgb3duIENvbW1hbmRBY3Rpb25IYW5kbGVyIGNsYXNzLCBzZWUgSW5kZW5BY3Rpb24KLQlwcml2YXRlIElBY3Rpb24gc3VwcHJlc3NUYXNrQWN0aW9uID0gbmV3IEFjdGlvbigKLQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLlByb2Nlc3NFZGl0b3JfQWN0aW9uX1N1cHByZXNzX1Rhc2spIHsKLQotCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkvLyBjaGVjayBpZiBzdXBwcmVzc2luZyB0aGUgc2VsZWN0ZWQgZWxlbWVudHMgd2lsbCBjYXVzZQotCQkJLy8gZHVwbGljYXRlIGRlc2NyaXB0b3JzLgotCQkJLy8gSWYgc28sIHByb21wdCB1c2VyIHRvIGRlbGV0ZSB0aGUgZHVwbGljYXRlcyBiZWZvcmUKLQkJCS8vIGNvbnRpbnVpbmcuCi0JCQkvLwotCi0JCQlmaW5hbCBMaXN0IHRhc2tEZXNjcmlwdG9ycyA9IFByb2Nlc3NVdGlsCi0JCQkJCS5nZXRUYXNrRGVzY3JpcHRvcnMoc2VsZWN0aW9uKTsKLQkJCQotCQkJLy8gTk8gTU9SRSBDSEVDSyBGT1IgRFVQTElDQVRJT04gT0YgTkFNRSwgUFJFU0VOVEFUSU9OIE5BTUUsIE9SIExJTktFRCBFTEVNRU5UCi0KLQkJCUJ1c3lJbmRpY2F0b3Iuc2hvd1doaWxlKGdldEFjdGl2ZUVkaXRvcigpLmdldEVkaXRvclNpdGUoKQotCQkJCQkuZ2V0U2hlbGwoKS5nZXREaXNwbGF5KCksIG5ldyBSdW5uYWJsZSgpIHsKLQotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJRWRpdG9yU3VwcHJlc3Npb25Db21tYW5kIGNtZCA9IG5ldyBFZGl0b3JTdXBwcmVzc2lvbkNvbW1hbmQoCi0JCQkJCQkJZ2V0U3VwcHJlc3Npb24oKSwgdGFza0Rlc2NyaXB0b3JzLCB0cnVlKTsKLQkJCQkJY21kLnNldExhYmVsKGdldFRleHQoKSk7Ci0JCQkJCWdldEFjdGlvbk1hbmFnZXIoKS5leGVjdXRlKGNtZCk7Ci0JCQkJfQotCQkJfSk7Ci0KLQkJCWJvb2xlYW4gc2hvdyA9IHRydWU7Ci0JCQkvLyB1cGRhdGUgY29udGV4dCBiYXIgbWVudSBhZnRlciBwZXJmb3JtaW5nIHN1cHByZXNzCi0JCQlpZiAoZ2V0QWRhcHRlckZhY3RvcnkoKSA9PSBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkuZ2V0V0JTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSkgewotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2VsZWN0aW9uLnNpemUoKTsgaSsrKSB7Ci0JCQkJCWlmICghKHNlbGVjdGlvbi5nZXQoaSkgaW5zdGFuY2VvZiBBY3Rpdml0eSB8fCBzZWxlY3Rpb24KLQkJCQkJCQkuZ2V0KGkpIGluc3RhbmNlb2YgQWN0aXZpdHlXcmFwcGVySXRlbVByb3ZpZGVyKSkKLQkJCQkJCXNob3cgPSBmYWxzZTsKLQkJCQl9Ci0JCQl9IGVsc2UKLQkJCQlzaG93ID0gZmFsc2U7Ci0KLQkJCXJldmVhbFRhc2tBY3Rpb24uc2V0RW5hYmxlZChzaG93KTsKLQkJCXN1cHByZXNzVGFza0FjdGlvbi5zZXRFbmFibGVkKHNob3cpOwotCi0JCQkvLyBlbmFibGUgc3luY2hyb25pemUgYWN0aW9ucyBjb3JyZWN0bHkKLQkJCWF1dG9TeW5jaHJvbml6ZS5zZXRFbmFibGVkKGF1dG9TeW5jaHJvbml6ZQotCQkJCQkudXBkYXRlU2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKHNlbGVjdGlvbgotCQkJCQkJCS50b0FycmF5KCkpKSk7Ci0JCQltYW51YWxTeW5jaHJvbml6ZUFjdGlvbi5zZXRFbmFibGVkKG1hbnVhbFN5bmNocm9uaXplQWN0aW9uCi0JCQkJCS51cGRhdGVTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oc2VsZWN0aW9uCi0JCQkJCQkJLnRvQXJyYXkoKSkpKTsKLQkJfQotCX07Ci0KLQlwcml2YXRlIElBY3Rpb24gc3VwcHJlc3NBY3Rpb24gPSBuZXcgQWN0aW9uKAotCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuUHJvY2Vzc0VkaXRvcl9BY3Rpb25fU3VwcHJlc3MpIHsKLQotCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkvLyBOTyBNT1JFIENIRUNLIEZPUiBEVVBMSUNBVElPTiBPRiBOQU1FLCBQUkVTRU5UQVRJT04gTkFNRSwgT1IgTElOS0VEIEVMRU1FTlQKLQkJCQotCQkJQnVzeUluZGljYXRvci5zaG93V2hpbGUoZ2V0QWN0aXZlRWRpdG9yKCkuZ2V0RWRpdG9yU2l0ZSgpCi0JCQkJCS5nZXRTaGVsbCgpLmdldERpc3BsYXkoKSwgbmV3IFJ1bm5hYmxlKCkgewotCi0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkvLyBpZiAoZ2V0U3VwcHJlc3Npb24oKS5zdXBwcmVzcyhzZWxlY3Rpb24pKSB7Ci0JCQkJCS8vIGlmIChoYXNJbmhlcml0ZWQoc2VsZWN0aW9uKSkgewotCQkJCQkvLyBlZGl0b3IucmVmcmVzaEFsbFByb2Nlc3NFZGl0b3JzKCk7Ci0JCQkJCS8vIH0gZWxzZSB7Ci0JCQkJCS8vIGVkaXRvci5kb1JlZnJlc2hBbGwoZmFsc2UpOwotCQkJCQkvLyB9Ci0JCQkJCS8vIH0KLQkJCQkJLy8gZWRpdG9yLmZpcmVQcm9wZXJ0eUNoYW5nZShQUk9QX0RJUlRZKTsKLQotCQkJCQlFZGl0b3JTdXBwcmVzc2lvbkNvbW1hbmQgY21kID0gbmV3IEVkaXRvclN1cHByZXNzaW9uQ29tbWFuZCgKLQkJCQkJCQlnZXRTdXBwcmVzc2lvbigpLCBzZWxlY3Rpb24sIHRydWUpOwotCQkJCQljbWQuc2V0TGFiZWwoZ2V0VGV4dCgpKTsKLQkJCQkJZ2V0QWN0aW9uTWFuYWdlcigpLmV4ZWN1dGUoY21kKTsKLQkJCQl9Ci0KLQkJCX0pOwotCi0JCQkvLyB1cGRhdGUgY29udGV4dCBiYXIgbWVudSBhZnRlciBwZXJmb3JtaW5nIHN1cHByZXNzCi0JCQlyZXZlYWxBY3Rpb24uc2V0RW5hYmxlZChnZXRTdXBwcmVzc2lvbigpLmNhblJldmVhbChzZWxlY3Rpb24pKTsKLQkJCXN1cHByZXNzQWN0aW9uLnNldEVuYWJsZWQoZ2V0U3VwcHJlc3Npb24oKS5jYW5TdXBwcmVzcyhzZWxlY3Rpb24pKTsKLQotCQkJLy8gZW5hYmxlIHN5bmNocm9uaXplIGFjdGlvbnMgY29ycmVjdGx5Ci0JCQlhdXRvU3luY2hyb25pemUuc2V0RW5hYmxlZChhdXRvU3luY2hyb25pemUKLQkJCQkJLnVwZGF0ZVNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihzZWxlY3Rpb24KLQkJCQkJCQkudG9BcnJheSgpKSkpOwotCQkJbWFudWFsU3luY2hyb25pemVBY3Rpb24uc2V0RW5hYmxlZChtYW51YWxTeW5jaHJvbml6ZUFjdGlvbgotCQkJCQkudXBkYXRlU2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKHNlbGVjdGlvbgotCQkJCQkJCS50b0FycmF5KCkpKSk7Ci0JCX0KLQl9OwotCi0JcHJvdGVjdGVkIFVwZGF0ZVN1cHByZXNzaW9uRnJvbUJhc2VBY3Rpb24gdXBkYXRlU3VwcHJlc3Npb25Gcm9tQmFzZUFjdGlvbiA9IG5ldyBVcGRhdGVTdXBwcmVzc2lvbkZyb21CYXNlQWN0aW9uKCk7Ci0KLQlwcm90ZWN0ZWQgSUFjdGlvbiByZXZlYWxBY3Rpb24gPSBuZXcgQWN0aW9uKAotCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuUHJvY2Vzc0VkaXRvcl9BY3Rpb25fUmV2ZWFsKSB7Ci0KLQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJaWYgKFByb2Nlc3NFZGl0b3IuY2FuUmV2ZWFsKHNlbGVjdGlvbiwgZ2V0QWRhcHRlckZhY3RvcnkoKSwgZ2V0U3VwcHJlc3Npb24oKSkpIHsKLQkJCQkvLyBmaW5hbCBQcm9jZXNzRWRpdG9yIGVkaXRvciA9IChQcm9jZXNzRWRpdG9yKQotCQkJCS8vIGdldEFjdGl2ZUVkaXRvcigpOwotCi0JCQkJQnVzeUluZGljYXRvci5zaG93V2hpbGUoZ2V0QWN0aXZlRWRpdG9yKCkuZ2V0RWRpdG9yU2l0ZSgpCi0JCQkJCQkuZ2V0U2hlbGwoKS5nZXREaXNwbGF5KCksIG5ldyBSdW5uYWJsZSgpIHsKLQotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkvLyBpZiAoZ2V0U3VwcHJlc3Npb24oKS5yZXZlYWwoc2VsZWN0aW9uKSkgewotCQkJCQkJLy8gaWYgKGhhc0luaGVyaXRlZChzZWxlY3Rpb24pKSB7Ci0JCQkJCQkvLyBlZGl0b3IucmVmcmVzaEFsbFByb2Nlc3NFZGl0b3JzKCk7Ci0JCQkJCQkvLyB9IGVsc2UgewotCQkJCQkJLy8gZWRpdG9yLmRvUmVmcmVzaEFsbChmYWxzZSk7Ci0JCQkJCQkvLyB9Ci0JCQkJCQkvLyB9Ci0JCQkJCQkvLyBlZGl0b3IuZmlyZVByb3BlcnR5Q2hhbmdlKFBST1BfRElSVFkpOwotCi0JCQkJCQlFZGl0b3JTdXBwcmVzc2lvbkNvbW1hbmQgY21kID0gbmV3IEVkaXRvclN1cHByZXNzaW9uQ29tbWFuZCgKLQkJCQkJCQkJZ2V0U3VwcHJlc3Npb24oKSwgc2VsZWN0aW9uLCBmYWxzZSk7Ci0JCQkJCQljbWQuc2V0TGFiZWwoZ2V0VGV4dCgpKTsKLQkJCQkJCWdldEFjdGlvbk1hbmFnZXIoKS5leGVjdXRlKGNtZCk7Ci0JCQkJCX0KLQotCQkJCX0pOwotCQkJCS8vIHVwZGF0ZSBjb250ZXh0IGJhciBtZW51IGFmdGVyIHBlcmZvcm1pbmcgcmV2ZWFsCi0JCQkJcmV2ZWFsQWN0aW9uLnNldEVuYWJsZWQoZ2V0U3VwcHJlc3Npb24oKS5jYW5SZXZlYWwoc2VsZWN0aW9uKSk7Ci0JCQkJc3VwcHJlc3NBY3Rpb24uc2V0RW5hYmxlZChnZXRTdXBwcmVzc2lvbigpLmNhblN1cHByZXNzKAotCQkJCQkJc2VsZWN0aW9uKSk7Ci0JCQkJLy8gZW5hYmxlIHN5bmNocm9uaXplIGFjdGlvbnMgY29ycmVjdGx5Ci0JCQkJYXV0b1N5bmNocm9uaXplLnNldEVuYWJsZWQoYXV0b1N5bmNocm9uaXplCi0JCQkJCQkudXBkYXRlU2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKHNlbGVjdGlvbgotCQkJCQkJCQkudG9BcnJheSgpKSkpOwotCQkJCW1hbnVhbFN5bmNocm9uaXplQWN0aW9uLnNldEVuYWJsZWQobWFudWFsU3luY2hyb25pemVBY3Rpb24KLQkJCQkJCS51cGRhdGVTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oc2VsZWN0aW9uCi0JCQkJCQkJCS50b0FycmF5KCkpKSk7Ci0JCQl9Ci0JCX0KLQl9OwotCi0JcHJpdmF0ZSBJQWN0aW9uIHJldmVhbFRhc2tBY3Rpb24gPSBuZXcgQWN0aW9uKAotCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuUHJvY2Vzc0VkaXRvcl9BY3Rpb25fUmV2ZWFsX1Rhc2spIHsKLQotCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQlmaW5hbCBMaXN0IHRhc2tEZXNjcmlwdG9ycyA9IFByb2Nlc3NVdGlsCi0JCQkJCS5nZXRUYXNrRGVzY3JpcHRvcnMoc2VsZWN0aW9uKTsKLQkJCWlmIChQcm9jZXNzRWRpdG9yLmNhblJldmVhbCh0YXNrRGVzY3JpcHRvcnMsIGdldEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCWdldFN1cHByZXNzaW9uKCkpKSB7Ci0KLQkJCQlCdXN5SW5kaWNhdG9yLnNob3dXaGlsZShnZXRBY3RpdmVFZGl0b3IoKS5nZXRFZGl0b3JTaXRlKCkKLQkJCQkJCS5nZXRTaGVsbCgpLmdldERpc3BsYXkoKSwgbmV3IFJ1bm5hYmxlKCkgewotCi0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCUVkaXRvclN1cHByZXNzaW9uQ29tbWFuZCBjbWQgPSBuZXcgRWRpdG9yU3VwcHJlc3Npb25Db21tYW5kKAotCQkJCQkJCQlnZXRTdXBwcmVzc2lvbigpLCB0YXNrRGVzY3JpcHRvcnMsIGZhbHNlKTsKLQkJCQkJCWNtZC5zZXRMYWJlbChnZXRUZXh0KCkpOwotCQkJCQkJZ2V0QWN0aW9uTWFuYWdlcigpLmV4ZWN1dGUoY21kKTsKLQkJCQkJfQotCi0JCQkJfSk7Ci0KLQkJCQkvLyBlbmFibGUgc3luY2hyb25pemUgYWN0aW9ucyBjb3JyZWN0bHkKLQkJCQlhdXRvU3luY2hyb25pemUuc2V0RW5hYmxlZChhdXRvU3luY2hyb25pemUKLQkJCQkJCS51cGRhdGVTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oc2VsZWN0aW9uCi0JCQkJCQkJCS50b0FycmF5KCkpKSk7Ci0JCQkJbWFudWFsU3luY2hyb25pemVBY3Rpb24uc2V0RW5hYmxlZChtYW51YWxTeW5jaHJvbml6ZUFjdGlvbgotCQkJCQkJLnVwZGF0ZVNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihzZWxlY3Rpb24KLQkJCQkJCQkJLnRvQXJyYXkoKSkpKTsKLQkJCX0KLQkJfQotCX07Ci0KLQlwcm90ZWN0ZWQgSUJTSXRlbVByb3ZpZGVyIGJzSXRlbVByb3ZpZGVyID0gbnVsbDsKLQotCXByb3RlY3RlZCBPYmplY3Qgc2VsZWN0ZWRFbGVtZW50ID0gbnVsbDsKLQotCXByb3RlY3RlZCBBY3Rpdml0eSBzZWxlY3RlZEFjdGl2aXR5ID0gbnVsbDsKLQotCXByb3RlY3RlZCBCcmVha2Rvd25FbGVtZW50IHNlbGVjdGVkQnJlYWtkb3duRWxlbWVudCA9IG51bGw7Ci0KLQlwcm90ZWN0ZWQgTGlzdCBzZWxlY3Rpb247Ci0KLQlwcm90ZWN0ZWQgSUFjdGlvbiBzdXBwcmVzc0RpYWdyYW1BY3Rpb24gPSBuZXcgQWN0aW9uKAotCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuUHJvY2Vzc0VkaXRvcl9BY3Rpb25fU3VwcHJlc3MyKSB7Ci0JCXB1YmxpYyBib29sZWFuIGlzRW5hYmxlZCgpIHsKLQkJCWlmICghc3VwZXIuaXNFbmFibGVkKCkpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQlyZXR1cm4gIShic0l0ZW1Qcm92aWRlciBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyICYmICgoQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIGJzSXRlbVByb3ZpZGVyKQotCQkJCQkuaXNSZWFkT25seSgpKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCWlmICghcHJvbXB0U2F2ZUFjdGl2ZUVkaXRvcigpKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCi0JCQlJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciBjb250ZW50UHJvdmlkZXIgPSBuZXcgQXJyYXlDb250ZW50UHJvdmlkZXIoKTsKLQotCQkJSUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlciA9IG5ldyBBZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIoCi0JCQkJCVRuZ1V0aWwudW1hSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkpIHsKLQkJCQlwdWJsaWMgU3RyaW5nIGdldENvbHVtblRleHQoT2JqZWN0IG9iamVjdCwgaW50IGNvbHVtbkluZGV4KSB7Ci0JCQkJCXJldHVybiBHcmFwaGljYWxEYXRhSGVscGVyCi0JCQkJCQkJLmdldERpYWdyYW1UeXBlVGV4dCgoRGlhZ3JhbSkgb2JqZWN0KTsKLQkJCQl9Ci0JCQl9OwotCi0JCQlDb2xsZWN0aW9uIGRpYWdyYW1zID0gR3JhcGhpY2FsRGF0YUhlbHBlcgotCQkJCQkuZ2V0RGlhZ3JhbXMoc2VsZWN0ZWRBY3Rpdml0eSk7Ci0JCQlBcnJheUxpc3QgdW5zdXBwcmVzc2VkRGlhZ3JhbXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBkaWFncmFtcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlEaWFncmFtIGRpYWdyYW0gPSAoRGlhZ3JhbSkgaXRlci5uZXh0KCk7Ci0JCQkJaWYgKCFkaWFncmFtLmdldFN1cHByZXNzZWQoKS5ib29sZWFuVmFsdWUoKSkgewotCQkJCQl1bnN1cHByZXNzZWREaWFncmFtcy5hZGQoZGlhZ3JhbSk7Ci0JCQkJfQotCQkJfQotCi0JCQlMaXN0U2VsZWN0aW9uRGlhbG9nIGRsZyA9IG5ldyBMaXN0U2VsZWN0aW9uRGlhbG9nKGFjdGl2ZUVkaXRvcgotCQkJCQkuZ2V0RWRpdG9yU2l0ZSgpLmdldFNoZWxsKCksIGRpYWdyYW1zLCBjb250ZW50UHJvdmlkZXIsCi0JCQkJCWxhYmVsUHJvdmlkZXIsCi0JCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLlByb2Nlc3NFZGl0b3JfU3VwcHJlc3NEaWFsb2dfTWVzc2FnZSk7Ci0JCQlkbGcuc2V0SW5pdGlhbEVsZW1lbnRTZWxlY3Rpb25zKHVuc3VwcHJlc3NlZERpYWdyYW1zKTsKLQkJCWRsZwotCQkJCQkuc2V0VGl0bGUoQXV0aG9yaW5nVUlSZXNvdXJjZXMuUHJvY2Vzc0VkaXRvcl9TdXBwcmVzc0RpYWxvZ19UaXRsZSk7Ci0JCQlkbGcuc2V0QmxvY2tPbk9wZW4odHJ1ZSk7Ci0JCQlkbGcub3BlbigpOwotCi0JCQlPYmplY3RbXSBkaWFncmFtc1RvUmV2ZWFsID0gZGxnLmdldFJlc3VsdCgpOwotCi0JCQlpZiAoZGlhZ3JhbXNUb1JldmVhbCA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCi0JCQlib29sZWFuIGNoYW5nZWQgPSB0cnVlOwotCi0JCQkvLyBjaGVjayBpZiB0aGVyZSBpcyByZWFsbHkgYW55IGNoYW5nZQotCQkJLy8KLQkJCWlmIChkaWFncmFtc1RvUmV2ZWFsLmxlbmd0aCA9PSB1bnN1cHByZXNzZWREaWFncmFtcy5zaXplKCkpIHsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGRpYWdyYW1zVG9SZXZlYWwubGVuZ3RoOyBpKyspIHsKLQkJCQkJaWYgKCF1bnN1cHByZXNzZWREaWFncmFtcy5jb250YWlucyhkaWFncmFtc1RvUmV2ZWFsW2ldKSkgewotCQkJCQkJY2hhbmdlZCA9IGZhbHNlOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmIChjaGFuZ2VkKSB7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gZGlhZ3JhbXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCURpYWdyYW0gZGlhZ3JhbSA9IChEaWFncmFtKSBpdGVyLm5leHQoKTsKLQkJCQkJZGlhZ3JhbS5zZXRTdXBwcmVzc2VkKEJvb2xlYW4uVFJVRSk7Ci0JCQkJfQotCi0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkaWFncmFtc1RvUmV2ZWFsLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCURpYWdyYW0gZGlhZ3JhbSA9IChEaWFncmFtKSBkaWFncmFtc1RvUmV2ZWFsW2ldOwotCQkJCQlkaWFncmFtLnNldFN1cHByZXNzZWQoQm9vbGVhbi5GQUxTRSk7Ci0JCQkJfQotCi0JCQkJLy8gc2F2ZSB0aGUgZWRpdG9yCi0JCQkJLy8KLQkJCQlzYXZlQWN0aXZlRWRpdG9yKCk7Ci0JCQl9Ci0JCX0KLQl9OwotCi0JcHJpdmF0ZSBJQWN0aW9uIG5ld1N1cHByZXNzRGlhZ3JhbUFjdGlvbiA9IG5ldyBBY3Rpb24oCi0JCQlBdXRob3JpbmdVSVJlc291cmNlcy5Qcm9jZXNzRWRpdG9yX0FjdGlvbl9TdXBwcmVzczIpIHsKLQkJcHVibGljIGJvb2xlYW4gaXNFbmFibGVkKCkgewotCQkJaWYgKCFzdXBlci5pc0VuYWJsZWQoKSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCXJldHVybiAhKGJzSXRlbVByb3ZpZGVyIGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIgJiYgKChCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgYnNJdGVtUHJvdmlkZXIpCi0JCQkJCS5pc1JlYWRPbmx5KCkpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJaWYgKCFwcm9tcHRTYXZlQWN0aXZlRWRpdG9yKCkpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0KLQkJCUlTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyIGNvbnRlbnRQcm92aWRlciA9IG5ldyBBcnJheUNvbnRlbnRQcm92aWRlcigpOwotCi0JCQlJTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyID0gbmV3IEFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcigKLQkJCQkJVG5nVXRpbC51bWFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSkgewotCQkJCXB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uVGV4dChPYmplY3Qgb2JqZWN0LCBpbnQgY29sdW1uSW5kZXgpIHsKLQkJCQkJLy8gVE9ETzogQ2hhbmdlIHRvIGV4YWN0IHN0cmluZy4KLQkJCQkJcmV0dXJuIERpYWdyYW1FZGl0b3JIZWxwZXIKLQkJCQkJCQkuZ2V0RGlhZ3JhbVR5cGVTdHJpbmcoKG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkRpYWdyYW0pIG9iamVjdCk7Ci0JCQkJfQotCQkJfTsKLQotCQkJQ29sbGVjdGlvbiBkaWFncmFtcyA9ICgoUHJvY2Vzc0VkaXRvcikgZ2V0QWN0aXZlRWRpdG9yKCkpCi0JCQkJCS5nZXREaWFncmFtRWRpdG9ySGVscGVyKCkuZ2V0RGlhZ3JhbXMoc2VsZWN0ZWRBY3Rpdml0eSk7Ci0JCQlBcnJheUxpc3Q8b3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRGlhZ3JhbT4gcHVibGlzaERpYWdyYW1zID0gbmV3IEFycmF5TGlzdDxvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5EaWFncmFtPigpOwotCi0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBkaWFncmFtcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5EaWFncmFtIGRpYWdyYW0gPSAob3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRGlhZ3JhbSkgaXRlcgotCQkJCQkJLm5leHQoKTsKLQkJCQlzd2l0Y2ggKERpYWdyYW1FZGl0b3JIZWxwZXIuZ2V0RGlhZ3JhbVR5cGUoZGlhZ3JhbSkpIHsKLQkJCQljYXNlIElEaWFncmFtTWFuYWdlci5BQ1RJVklUWV9ESUFHUkFNOgotCQkJCQlpZiAoRGlhZ3JhbU9wdGlvbnMuaXNQdWJsaXNoQUQoc2VsZWN0ZWRBY3Rpdml0eSkpIHsKLQkJCQkJCXB1Ymxpc2hEaWFncmFtcy5hZGQoZGlhZ3JhbSk7Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBJRGlhZ3JhbU1hbmFnZXIuQUNUSVZJVFlfREVUQUlMX0RJQUdSQU06Ci0JCQkJCWlmIChEaWFncmFtT3B0aW9ucy5pc1B1Ymxpc2hBREQoc2VsZWN0ZWRBY3Rpdml0eSkpIHsKLQkJCQkJCXB1Ymxpc2hEaWFncmFtcy5hZGQoZGlhZ3JhbSk7Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBJRGlhZ3JhbU1hbmFnZXIuV09SS19QUk9EVUNUX0RFUEVOREVOQ1lfRElBR1JBTToKLQkJCQkJaWYgKERpYWdyYW1PcHRpb25zLmlzUHVibGlzaFdQREQoc2VsZWN0ZWRBY3Rpdml0eSkpIHsKLQkJCQkJCXB1Ymxpc2hEaWFncmFtcy5hZGQoZGlhZ3JhbSk7Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCi0JCQlMaXN0U2VsZWN0aW9uRGlhbG9nIGRsZyA9IG5ldyBMaXN0U2VsZWN0aW9uRGlhbG9nKGFjdGl2ZUVkaXRvcgotCQkJCQkuZ2V0RWRpdG9yU2l0ZSgpLmdldFNoZWxsKCksIGRpYWdyYW1zLCBjb250ZW50UHJvdmlkZXIsCi0JCQkJCWxhYmVsUHJvdmlkZXIsCi0JCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLlByb2Nlc3NFZGl0b3JfU3VwcHJlc3NEaWFsb2dfTWVzc2FnZSk7Ci0JCQlkbGcuc2V0SW5pdGlhbEVsZW1lbnRTZWxlY3Rpb25zKHB1Ymxpc2hEaWFncmFtcyk7Ci0JCQlkbGcKLQkJCQkJLnNldFRpdGxlKEF1dGhvcmluZ1VJUmVzb3VyY2VzLlByb2Nlc3NFZGl0b3JfU3VwcHJlc3NEaWFsb2dfVGl0bGUpOwotCQkJZGxnLnNldEJsb2NrT25PcGVuKHRydWUpOwotCQkJZGxnLm9wZW4oKTsKLQotCQkJT2JqZWN0W10gZGlhZ3JhbXNUb1JldmVhbCA9IGRsZy5nZXRSZXN1bHQoKTsKLQotCQkJaWYgKGRpYWdyYW1zVG9SZXZlYWwgPT0gbnVsbCkgewotCQkJCXJldHVybjsKLQkJCX0KLQotCQkJYm9vbGVhbiBjaGFuZ2VkID0gdHJ1ZTsKLQotCQkJLy8gY2hlY2sgaWYgdGhlcmUgaXMgcmVhbGx5IGFueSBjaGFuZ2UKLQkJCS8vCi0JCQlpZiAoZGlhZ3JhbXNUb1JldmVhbC5sZW5ndGggPT0gcHVibGlzaERpYWdyYW1zLnNpemUoKSkgewotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZGlhZ3JhbXNUb1JldmVhbC5sZW5ndGg7IGkrKykgewotCQkJCQlpZiAoIXB1Ymxpc2hEaWFncmFtcy5jb250YWlucyhkaWFncmFtc1RvUmV2ZWFsW2ldKSkgewotCQkJCQkJY2hhbmdlZCA9IGZhbHNlOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmIChjaGFuZ2VkKSB7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gZGlhZ3JhbXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCW9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkRpYWdyYW0gZGlhZ3JhbSA9IChvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5EaWFncmFtKSBpdGVyCi0JCQkJCQkJLm5leHQoKTsKLQkJCQkJc3dpdGNoIChEaWFncmFtRWRpdG9ySGVscGVyLmdldERpYWdyYW1UeXBlKGRpYWdyYW0pKSB7Ci0JCQkJCWNhc2UgSURpYWdyYW1NYW5hZ2VyLkFDVElWSVRZX0RJQUdSQU06Ci0JCQkJCQlEaWFncmFtT3B0aW9ucy5zZXRQdWJsaXNoQUQoc2VsZWN0ZWRBY3Rpdml0eSwgZmFsc2UpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgSURpYWdyYW1NYW5hZ2VyLkFDVElWSVRZX0RFVEFJTF9ESUFHUkFNOgotCQkJCQkJRGlhZ3JhbU9wdGlvbnMuc2V0UHVibGlzaEFERChzZWxlY3RlZEFjdGl2aXR5LCBmYWxzZSk7Ci0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSBJRGlhZ3JhbU1hbmFnZXIuV09SS19QUk9EVUNUX0RFUEVOREVOQ1lfRElBR1JBTToKLQkJCQkJCURpYWdyYW1PcHRpb25zLnNldFB1Ymxpc2hXUEREKHNlbGVjdGVkQWN0aXZpdHksIGZhbHNlKTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkaWFncmFtc1RvUmV2ZWFsLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCW9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkRpYWdyYW0gZGlhZ3JhbSA9IChvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5EaWFncmFtKSBkaWFncmFtc1RvUmV2ZWFsW2ldOwotCQkJCQlzd2l0Y2ggKERpYWdyYW1FZGl0b3JIZWxwZXIuZ2V0RGlhZ3JhbVR5cGUoZGlhZ3JhbSkpIHsKLQkJCQkJY2FzZSBJRGlhZ3JhbU1hbmFnZXIuQUNUSVZJVFlfRElBR1JBTToKLQkJCQkJCURpYWdyYW1PcHRpb25zLnNldFB1Ymxpc2hBRChzZWxlY3RlZEFjdGl2aXR5LCB0cnVlKTsKLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIElEaWFncmFtTWFuYWdlci5BQ1RJVklUWV9ERVRBSUxfRElBR1JBTToKLQkJCQkJCURpYWdyYW1PcHRpb25zLnNldFB1Ymxpc2hBREQoc2VsZWN0ZWRBY3Rpdml0eSwgdHJ1ZSk7Ci0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSBJRGlhZ3JhbU1hbmFnZXIuV09SS19QUk9EVUNUX0RFUEVOREVOQ1lfRElBR1JBTToKLQkJCQkJCURpYWdyYW1PcHRpb25zLnNldFB1Ymxpc2hXUEREKHNlbGVjdGVkQWN0aXZpdHksIHRydWUpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJLy8gc2F2ZSB0aGUgZWRpdG9yCi0JCQkJLy8KLQkJCQlzYXZlQWN0aXZlRWRpdG9yKCk7Ci0JCQl9Ci0JCX0KLQl9OwotCi0JcHJpdmF0ZSBJQWN0aW9uIG5ld0Fzc2lnblVzZXJEaWFncmFtID0gbmV3IEFjdGlvbigKLQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLlByb2Nlc3NFZGl0b3JfQWN0aW9uX0Fzc2lnblVzZXJEaWFncmFtKSB7Ci0JCS8qKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb24jcnVuKCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCS8vIFRPRE86IG5lY2Vzc2FyeSBjaGFuZ2VzIFVzZXJEZWZpbmVkRGlhZ3JhbURpYWxvZydzIERpYWdyYW1JbmZvLgotCQkJVXNlckRlZmluZWREaWFncmFtRGlhbG9nIGRpYWxvZyA9IG5ldyBVc2VyRGVmaW5lZERpYWdyYW1EaWFsb2coCi0JCQkJCURpc3BsYXkuZ2V0Q3VycmVudCgpLmdldEFjdGl2ZVNoZWxsKCksIGFjdGl2ZUVkaXRvciwKLQkJCQkJc2VsZWN0ZWRBY3Rpdml0eSwgZ2V0UHJvY2VzcygpLmdldERlZmF1bHRDb250ZXh0KCksIFRuZ1V0aWwKLQkJCQkJCQkuaXNXcmFwcGVkKHNlbGVjdGVkT2JqZWN0KSk7Ci0JCQlkaWFsb2cub3BlbigpOwotCQl9Ci0JfTsKLQotCXByaXZhdGUgSUFjdGlvbiBkaWFncmFtUHVibGlzaE5vbmUgPSBuZXcgQWN0aW9uKAotCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuUHJvY2Vzc0VkaXRvcl9BY3Rpb25fU3VwcHJlc3NBbGwpIHsKLQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJcHVibGlzaERpYWdyYW1zRm9yUHJvY2VzcyhmYWxzZSk7Ci0JCX0KLQl9OwotCi0JcHJpdmF0ZSBJQWN0aW9uIGRpYWdyYW1zUHVibGlzaEFsbCA9IG5ldyBBY3Rpb24oCi0JCQlBdXRob3JpbmdVSVJlc291cmNlcy5Qcm9jZXNzRWRpdG9yX0FjdGlvbl9SZXZlYWxBbGwpIHsKLQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJcHVibGlzaERpYWdyYW1zRm9yUHJvY2Vzcyh0cnVlKTsKLQkJfQotCX07Ci0KLQlwcm90ZWN0ZWQgSUFjdGlvbiBzdXBwcmVzc0FsbERpYWdyYW1zID0gbmV3IEFjdGlvbigKLQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLlByb2Nlc3NFZGl0b3JfQWN0aW9uX1N1cHByZXNzQWxsKSB7Ci0JCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCXNldEFsbERpYWdyYW1TdXBwcmVzc2VkKHRydWUpOwotCQl9Ci0JfTsKLQotCXByb3RlY3RlZCBJQWN0aW9uIHJldmVhbEFsbERpYWdyYW1zID0gbmV3IEFjdGlvbigKLQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLlByb2Nlc3NFZGl0b3JfQWN0aW9uX1JldmVhbEFsbCkgewotCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQlzZXRBbGxEaWFncmFtU3VwcHJlc3NlZChmYWxzZSk7Ci0JCX0KLQl9OwotCi0JcHJvdGVjdGVkIElBY3Rpb24gYWRkQWN0aW9uID0gbmV3IEFjdGlvbigKLQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLlByb2Nlc3NFZGl0b3JfQWN0aW9uX0FkZCkgewotCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQlMaWJyYXJ5TG9ja2luZ09wZXJhdGlvblJ1bm5lciBydW5uZXIgPSBuZXcgTGlicmFyeUxvY2tpbmdPcGVyYXRpb25SdW5uZXIoKTsKLQkJCXJ1bm5lci5ydW4obmV3IElSdW5uYWJsZVdpdGhQcm9ncmVzcygpIHsKLQotCQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCi0JCQkJCQl0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQkJCQlBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSA9IGdldEFkYXB0ZXJGYWN0b3J5KCk7Ci0JCQkJCWlmIChhZGFwdGVyRmFjdG9yeSAhPSBudWxsKSB7Ci0JCQkJCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IExpYnJhcnlTZXJ2aWNlCi0JCQkJCQkJCS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRNZXRob2RDb25maWd1cmF0aW9uKCk7Ci0JCQkJCQlpZiAoY29uZmlnID09IG51bGwpIHsKLQkJCQkJCQljb25maWcgPSBUbmdVdGlsLmdldE93bmluZ1Byb2Nlc3MoCi0JCQkJCQkJCQlzZWxlY3RlZEJyZWFrZG93bkVsZW1lbnQpCi0JCQkJCQkJCQkuZ2V0RGVmYXVsdENvbnRleHQoKTsKLQkJCQkJCX0KLQkJCQkJCUxpc3Qgc2VsZWN0aW9uID0gRGlhbG9nSGVscGVyLnNlbGVjdEVsZW1lbnRzRm9yKAotCQkJCQkJCQlzZWxlY3RlZEJyZWFrZG93bkVsZW1lbnQsIGNvbmZpZywKLQkJCQkJCQkJYWRhcHRlckZhY3RvcnkpOwotCi0JCQkJCQlpZiAoc2VsZWN0aW9uID09IG51bGwgfHwgc2VsZWN0aW9uLmlzRW1wdHkoKSkgewotCQkJCQkJCXJldHVybjsKLQkJCQkJCX0KLQotCQkJCQkJT2JqZWN0IGFkYXB0ZXIgPSBhZGFwdGVyRmFjdG9yeS5hZGFwdCgKLQkJCQkJCQkJc2VsZWN0ZWRCcmVha2Rvd25FbGVtZW50LAotCQkJCQkJCQlJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlci5jbGFzcyk7Ci0JCQkJCQlpZiAoYWRhcHRlciBpbnN0YW5jZW9mIElCU0l0ZW1Qcm92aWRlcikgewotCQkJCQkJCUlSZXNvdXJjZUF3YXJlQ29tbWFuZCBjbWQgPSAoKElCU0l0ZW1Qcm92aWRlcikgYWRhcHRlcikKLQkJCQkJCQkJCS5jcmVhdGVEcm9wQ29tbWFuZCgKLQkJCQkJCQkJCQkJc2VsZWN0ZWRCcmVha2Rvd25FbGVtZW50LCBzZWxlY3Rpb24pOwotCQkJCQkJCWdldEFjdGlvbk1hbmFnZXIoKS5leGVjdXRlKGNtZCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCX0pOwotCi0JCX0KLQl9OwotCi0JcHJvdGVjdGVkIElBY3Rpb24gY29weUFjdGl2aXR5QWN0aW9uID0gbmV3IEFjdGlvbigKLQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLlByb2Nlc3NFZGl0b3JfQWN0aW9uX0NvcHkpIHsKLQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJCS5nZXRDdXJyZW50TWV0aG9kQ29uZmlndXJhdGlvbigpOwotCQkJaWYgKGNvbmZpZyA9PSBudWxsKSB7Ci0JCQkJY29uZmlnID0gVG5nVXRpbC5nZXRPd25pbmdQcm9jZXNzKHNlbGVjdGVkQWN0aXZpdHkpCi0JCQkJCQkuZ2V0RGVmYXVsdENvbnRleHQoKTsKLQkJCX0KLQkJCUxpc3Qgc2VsZWN0aW9uID0gRGlhbG9nSGVscGVyLnNlbGVjdEFjdGl2aXRpZXNGb3Ioc2VsZWN0ZWRBY3Rpdml0eSwKLQkJCQkJY29uZmlnLCBJQWN0aW9uVHlwZVByb3ZpZGVyLkNPUFkpOwotCi0JCQlpZiAoc2VsZWN0aW9uID09IG51bGwgfHwgc2VsZWN0aW9uLmlzRW1wdHkoKSkgewotCQkJCXJldHVybjsKLQkJCX0gZWxzZSB7Ci0JCQkJZm9yIChJdGVyYXRvciBpdG9yID0gc2VsZWN0aW9uLml0ZXJhdG9yKCk7IGl0b3IuaGFzTmV4dCgpOykgewotCQkJCQlPYmplY3QgbyA9IGl0b3IubmV4dCgpOwotCi0JCQkJCWlmIChvIGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQkJCUFjdGl2aXR5IGFjdCA9IChBY3Rpdml0eSkgbzsKLQotCQkJCQkJLy8gUHJvY2VzcyBwcm9jID0KLQkJCQkJCS8vIFRuZ1V0aWwuZ2V0T3duaW5nUHJvY2VzcyhzZWxlY3RlZEJyZWFrZG93bkVsZW1lbnQpOwotCQkJCQkJLy8gaWYgKERlcGVuZGVuY3lDaGVja2VyLmhhc0N5Y2xpY0RlcGVuZGVuY3koYWN0LCBwcm9jKSkKLQkJCQkJCS8vIHsKLQkJCQkJCS8vIE9iamVjdFtdIGFyZ3MgPSB7IHNlbGVjdGVkQWN0aXZpdHkuZ2V0TmFtZSgpLAotCQkJCQkJLy8gYWN0LmdldE5hbWUoKSB9OwotCQkJCQkJLy8gU3RyaW5nIG1lc3NhZ2UgPSBBdXRob3JpbmdVSVJlc291cmNlcwotCQkJCQkJLy8gLmJpbmQoCi0JCQkJCQkvLyBBdXRob3JpbmdVSVJlc291cmNlcy5hcHBseV9wYXR0ZXJuX2Vycm9yX21zZywKLQkJCQkJCS8vIGFyZ3MpOwotCQkJCQkJLy8KLQkJCQkJCS8vIFN0cmluZyB0aXRsZSA9Ci0JCQkJCQkvLyBBdXRob3JpbmdVSVJlc291cmNlcy5hcHBseV9wYXR0ZXJuX2Vycm9yX3RpdGxlOwotCQkJCQkJLy8gQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpCi0JCQkJCQkvLyAuZGlzcGxheUVycm9yKHRpdGxlLCBtZXNzYWdlLCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCS8vIGl0b3IucmVtb3ZlKCk7Ci0JCQkJCQkvLyB9Ci0JCQkJCQkvLyBlbHNlIGlmIChQcm9jZXNzVXRpbC5oYXNDb250cmlidXRvck9yUmVwbGFjZXIoYWN0KSkgewotCQkJCQkJLy8gT2JqZWN0W10gYXJncyA9IHsgc2VsZWN0ZWRBY3Rpdml0eS5nZXROYW1lKCksCi0JCQkJCQkvLyBhY3QuZ2V0TmFtZSgpIH07Ci0JCQkJCQkvLyBTdHJpbmcgbWVzc2FnZSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzCi0JCQkJCQkvLyAuYmluZCgKLQkJCQkJCS8vIEF1dGhvcmluZ1VJUmVzb3VyY2VzLmFjdGl2aXR5X3ZhcmlhYmlsaXR5X2Vycm9yX21zZywKLQkJCQkJCS8vIGFyZ3MpOwotCQkJCQkJLy8KLQkJCQkJCS8vIFN0cmluZyB0aXRsZSA9Ci0JCQkJCQkvLyBBdXRob3JpbmdVSVJlc291cmNlcy5hY3Rpdml0eV92YXJpYWJpbGl0eV9lcnJvcl90aXRsZTsKLQkJCQkJCS8vIEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKQotCQkJCQkJLy8gLmRpc3BsYXlFcnJvcih0aXRsZSwgbWVzc2FnZSwgIiIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkvLwotCQkJCQkJLy8gaXRvci5yZW1vdmUoKTsKLQkJCQkJCS8vIHJldHVybjsKLQkJCQkJCS8vIH0KLQotCQkJCQkJSVN0YXR1cyBzdGF0dXMgPSBEZXBlbmRlbmN5Q2hlY2tlcgotCQkJCQkJCQkuY2hlY2tDaXJjdWxhckRlcGVuZGVuY3koYWN0LCBzZWxlY3RlZEFjdGl2aXR5KTsKLQkJCQkJCWlmICghc3RhdHVzLmlzT0soKSkgewotCQkJCQkJCVN0cmluZyB0aXRsZSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmFjdGl2aXR5X3ZhcmlhYmlsaXR5X2Vycm9yX3RpdGxlOwotCQkJCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKQotCQkJCQkJCQkJLmRpc3BsYXlFcnJvcih0aXRsZSwgc3RhdHVzLmdldE1lc3NhZ2UoKSk7Ci0JCQkJCQkJaXRvci5yZW1vdmUoKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlpZiAoc2VsZWN0aW9uLmlzRW1wdHkoKSkgewotCQkJCQkJcmV0dXJuOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQlBY3Rpdml0eURyb3BDb21tYW5kIGNtZCA9IG5ldyBBY3Rpdml0eURyb3BDb21tYW5kKHNlbGVjdGVkQWN0aXZpdHksCi0JCQkJCXNlbGVjdGlvbiwgbnVsbCwgZ2V0QWRhcHRlckZhY3RvcnkoKSk7Ci0JCQlJU3RhdHVzIHN0YXR1cyA9IGNtZC5jaGVja0NvcHkoKTsKLQkJCWlmICghc3RhdHVzLmlzT0soKSkgewotCQkJCVN0cmluZyB0aXRsZSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmFjdGl2aXR5X3ZhcmlhYmlsaXR5X2Vycm9yX3RpdGxlOwotCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKS5kaXNwbGF5RXJyb3IoCi0JCQkJCQl0aXRsZSwgc3RhdHVzLmdldE1lc3NhZ2UoKSk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJY21kLnNldFR5cGUoSUFjdGlvblR5cGVQcm92aWRlci5DT1BZKTsKLQkJCWdldEFjdGlvbk1hbmFnZXIoKS5leGVjdXRlKGNtZCk7Ci0JCX0KLQl9OwotCi0JcHJvdGVjdGVkIElBY3Rpb24gZXh0ZW5kQWN0aXZpdHlBY3Rpb24gPSBuZXcgQWN0aW9uKAotCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuUHJvY2Vzc0VkaXRvcl9BY3Rpb25fRXh0ZW5kKSB7Ci0JCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKQotCQkJCQkuZ2V0Q3VycmVudE1ldGhvZENvbmZpZ3VyYXRpb24oKTsKLQkJCWlmIChjb25maWcgPT0gbnVsbCkgewotCQkJCWNvbmZpZyA9IFRuZ1V0aWwuZ2V0T3duaW5nUHJvY2VzcyhzZWxlY3RlZEFjdGl2aXR5KQotCQkJCQkJLmdldERlZmF1bHRDb250ZXh0KCk7Ci0JCQl9Ci0JCQlMaXN0IHNlbGVjdGlvbiA9IERpYWxvZ0hlbHBlci5zZWxlY3RBY3Rpdml0aWVzRm9yKHNlbGVjdGVkQWN0aXZpdHksCi0JCQkJCWNvbmZpZywgSUFjdGlvblR5cGVQcm92aWRlci5FWFRFTkQpOwotCi0JCQlpZiAoc2VsZWN0aW9uID09IG51bGwgfHwgc2VsZWN0aW9uLmlzRW1wdHkoKSkgewotCQkJCXJldHVybjsKLQkJCX0gZWxzZSB7Ci0JCQkJZm9yIChJdGVyYXRvciBpdG9yID0gc2VsZWN0aW9uLml0ZXJhdG9yKCk7IGl0b3IuaGFzTmV4dCgpOykgewotCQkJCQlPYmplY3QgbyA9IGl0b3IubmV4dCgpOwotCi0JCQkJCWlmIChvIGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQkJCUFjdGl2aXR5IGFjdCA9IChBY3Rpdml0eSkgbzsKLQotCQkJCQkJLy8gUHJvY2VzcyBwcm9jID0KLQkJCQkJCS8vIFRuZ1V0aWwuZ2V0T3duaW5nUHJvY2VzcyhzZWxlY3RlZEJyZWFrZG93bkVsZW1lbnQpOwotCQkJCQkJLy8gaWYgKERlcGVuZGVuY3lDaGVja2VyLmhhc0N5Y2xpY0RlcGVuZGVuY3koYWN0LCBwcm9jKSkKLQkJCQkJCS8vIHsKLQkJCQkJCS8vIE9iamVjdFtdIGFyZ3MgPSB7IHNlbGVjdGVkQWN0aXZpdHkuZ2V0TmFtZSgpLAotCQkJCQkJLy8gYWN0LmdldE5hbWUoKSB9OwotCQkJCQkJLy8gU3RyaW5nIG1lc3NhZ2UgPSBBdXRob3JpbmdVSVJlc291cmNlcwotCQkJCQkJLy8gLmJpbmQoCi0JCQkJCQkvLyBBdXRob3JpbmdVSVJlc291cmNlcy5hcHBseV9wYXR0ZXJuX2Vycm9yX21zZywKLQkJCQkJCS8vIGFyZ3MpOwotCQkJCQkJLy8KLQkJCQkJCS8vIFN0cmluZyB0aXRsZSA9Ci0JCQkJCQkvLyBBdXRob3JpbmdVSVJlc291cmNlcy5hcHBseV9wYXR0ZXJuX2Vycm9yX3RpdGxlOwotCQkJCQkJLy8gQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpCi0JCQkJCQkvLyAuZGlzcGxheUVycm9yKHRpdGxlLCBtZXNzYWdlLCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCS8vIGl0b3IucmVtb3ZlKCk7Ci0JCQkJCQkvLyB9Ci0JCQkJCQkvLyBlbHNlIGlmIChQcm9jZXNzVXRpbC5oYXNDb250cmlidXRvck9yUmVwbGFjZXIoYWN0KSkgewotCQkJCQkJLy8gT2JqZWN0W10gYXJncyA9IHsgc2VsZWN0ZWRBY3Rpdml0eS5nZXROYW1lKCksCi0JCQkJCQkvLyBhY3QuZ2V0TmFtZSgpIH07Ci0JCQkJCQkvLyBTdHJpbmcgbWVzc2FnZSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzCi0JCQkJCQkvLyAuYmluZCgKLQkJCQkJCS8vIEF1dGhvcmluZ1VJUmVzb3VyY2VzLmFjdGl2aXR5X3ZhcmlhYmlsaXR5X2Vycm9yX21zZywKLQkJCQkJCS8vIGFyZ3MpOwotCQkJCQkJLy8KLQkJCQkJCS8vIFN0cmluZyB0aXRsZSA9Ci0JCQkJCQkvLyBBdXRob3JpbmdVSVJlc291cmNlcy5hY3Rpdml0eV92YXJpYWJpbGl0eV9lcnJvcl90aXRsZTsKLQkJCQkJCS8vIEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKQotCQkJCQkJLy8gLmRpc3BsYXlFcnJvcih0aXRsZSwgbWVzc2FnZSwgIiIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkvLwotCQkJCQkJLy8gaXRvci5yZW1vdmUoKTsKLQkJCQkJCS8vIHJldHVybjsKLQkJCQkJCS8vIH0KLQotCQkJCQkJLyoKLQkJCQkJCSAqIElTdGF0dXMgc3RhdHVzID0gRGVwZW5kZW5jeUNoZWNrZXIubmV3Q2hlY2tBY3QgPwotCQkJCQkJICogRGVwZW5kZW5jeUNoZWNrZXIuY2hlY2tDaXJjdWxhckRlcGVuZGVuY3lBZnRlckZpbHRlclNlbGVjdGlvbgotCQkJCQkJICogKGFjdCwgc2VsZWN0ZWRBY3Rpdml0eSwKLQkJCQkJCSAqIFZhcmlhYmlsaXR5VHlwZS5FWFRFTkRTX0xJVEVSQUwpIDoKLQkJCQkJCSAqIERlcGVuZGVuY3lDaGVja2VyLmNoZWNrQ2lyY3VsYXJEZXBlbmRlbmN5KGFjdCwKLQkJCQkJCSAqIHNlbGVjdGVkQWN0aXZpdHkpOwotCQkJCQkJICovCi0JCQkJCQlJU3RhdHVzIHN0YXR1cyA9IERlcGVuZGVuY3lDaGVja2VyLm5ld0NoZWNrQWN0ID8gRGVwZW5kZW5jeUNoZWNrZXIKLQkJCQkJCQkJLmNoZWNrQ2lyY3VsYXJGb3JBcHBseWluZ1ZhcmlhYmlsaXR5RWxlbWVudCgKLQkJCQkJCQkJCQlzZWxlY3RlZEFjdGl2aXR5LCBhY3QsIHRydWUpCi0JCQkJCQkJCTogRGVwZW5kZW5jeUNoZWNrZXIuY2hlY2tDaXJjdWxhckRlcGVuZGVuY3koCi0JCQkJCQkJCQkJYWN0LCBzZWxlY3RlZEFjdGl2aXR5KTsKLQkJCQkJCWlmICghc3RhdHVzLmlzT0soKSkgewotCQkJCQkJCVN0cmluZyB0aXRsZSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmFjdGl2aXR5X3ZhcmlhYmlsaXR5X2Vycm9yX3RpdGxlOwotCQkJCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKQotCQkJCQkJCQkJLmRpc3BsYXlFcnJvcih0aXRsZSwgc3RhdHVzKTsKLQkJCQkJCQlpdG9yLnJlbW92ZSgpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWlmIChzZWxlY3Rpb24uaXNFbXB0eSgpKSB7Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlBY3Rpdml0eURyb3BDb21tYW5kIGNtZCA9IG5ldyBBY3Rpdml0eURyb3BDb21tYW5kKHNlbGVjdGVkQWN0aXZpdHksCi0JCQkJCXNlbGVjdGlvbiwgbnVsbCwgZ2V0QWRhcHRlckZhY3RvcnkoKSk7Ci0JCQlJU3RhdHVzIHN0YXR1cyA9IGNtZC5jaGVja0V4dGVuZCgpOwotCQkJaWYgKCFzdGF0dXMuaXNPSygpKSB7Ci0JCQkJU3RyaW5nIHRpdGxlID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuYWN0aXZpdHlfdmFyaWFiaWxpdHlfZXJyb3JfdGl0bGU7Ci0JCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpLmRpc3BsYXlFcnJvcigKLQkJCQkJCXRpdGxlLCBzdGF0dXMuZ2V0TWVzc2FnZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQljbWQuc2V0VHlwZShJQWN0aW9uVHlwZVByb3ZpZGVyLkVYVEVORCk7Ci0JCQlnZXRBY3Rpb25NYW5hZ2VyKCkuZXhlY3V0ZShjbWQpOwotCQl9Ci0JfTsKLQotCXByb3RlY3RlZCBJQWN0aW9uIGRlZXBDb3B5QWN0aXZpdHlBY3Rpb24gPSBuZXcgQWN0aW9uKAotCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuUHJvY2Vzc0VkaXRvcl9hY3Rpb25fZGVlcENvcHkpIHsKLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uI3J1bigpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQlMaWJyYXJ5TG9ja2luZ09wZXJhdGlvblJ1bm5lciBydW5uZXIgPSBuZXcgTGlicmFyeUxvY2tpbmdPcGVyYXRpb25SdW5uZXIoKTsKLQkJCXJ1bm5lci5ydW4obmV3IElSdW5uYWJsZVdpdGhQcm9ncmVzcygpIHsKLQotCQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCi0JCQkJCQl0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQkJCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLQkJCQkJCQkuZ2V0Q3VycmVudE1ldGhvZENvbmZpZ3VyYXRpb24oKTsKLQkJCQkJaWYgKGNvbmZpZyA9PSBudWxsKSB7Ci0JCQkJCQljb25maWcgPSBUbmdVdGlsLmdldE93bmluZ1Byb2Nlc3Moc2VsZWN0ZWRBY3Rpdml0eSkKLQkJCQkJCQkJLmdldERlZmF1bHRDb250ZXh0KCk7Ci0JCQkJCX0KLQkJCQkJTGlzdCBzZWxlY3Rpb24gPSBEaWFsb2dIZWxwZXIuc2VsZWN0QWN0aXZpdGllc0ZvcigKLQkJCQkJCQlzZWxlY3RlZEFjdGl2aXR5LCBjb25maWcsCi0JCQkJCQkJSUFjdGlvblR5cGVQcm92aWRlci5ERUVQX0NPUFkpOwotCi0JCQkJCWlmIChzZWxlY3Rpb24gPT0gbnVsbCB8fCBzZWxlY3Rpb24uaXNFbXB0eSgpKSB7Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlmb3IgKEl0ZXJhdG9yIGl0b3IgPSBzZWxlY3Rpb24uaXRlcmF0b3IoKTsgaXRvcgotCQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJCU9iamVjdCBvID0gaXRvci5uZXh0KCk7Ci0KLQkJCQkJCQlpZiAobyBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJCQkJCUFjdGl2aXR5IGFjdCA9IChBY3Rpdml0eSkgbzsKLQotCQkJCQkJCQkvLyBQcm9jZXNzIHByb2MgPQotCQkJCQkJCQkvLyBUbmdVdGlsLmdldE93bmluZ1Byb2Nlc3Moc2VsZWN0ZWRCcmVha2Rvd25FbGVtZW50KTsKLQkJCQkJCQkJLy8gaWYgKFByb2Nlc3NVdGlsLmhhc0N5Y2xpY0RlcGVuZGVuY3koYWN0LAotCQkJCQkJCQkvLyBwcm9jKSkgewotCQkJCQkJCQkvLyBPYmplY3RbXSBhcmdzID0geyBzZWxlY3RlZEFjdGl2aXR5LmdldE5hbWUoKSwKLQkJCQkJCQkJLy8gYWN0LmdldE5hbWUoKSB9OwotCQkJCQkJCQkvLyBTdHJpbmcgbWVzc2FnZSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzCi0JCQkJCQkJCS8vIC5iaW5kKAotCQkJCQkJCQkvLyBBdXRob3JpbmdVSVJlc291cmNlcy5hcHBseV9wYXR0ZXJuX2Vycm9yX21zZywKLQkJCQkJCQkJLy8gYXJncyk7Ci0JCQkJCQkJCS8vCi0JCQkJCQkJCS8vIFN0cmluZyB0aXRsZSA9Ci0JCQkJCQkJCS8vIEF1dGhvcmluZ1VJUmVzb3VyY2VzLmFwcGx5X3BhdHRlcm5fZXJyb3JfdGl0bGU7Ci0JCQkJCQkJCS8vIEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKQotCQkJCQkJCQkvLyAuZGlzcGxheUVycm9yKHRpdGxlLCBtZXNzYWdlLCAiIik7Ci0JCQkJCQkJCS8vIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJLy8gaXRvci5yZW1vdmUoKTsKLQkJCQkJCQkJLy8gfQotCi0JCQkJCQkJCUlTdGF0dXMgc3RhdHVzID0gRGVwZW5kZW5jeUNoZWNrZXIKLQkJCQkJCQkJCQkuY2hlY2tDaXJjdWxhckRlcGVuZGVuY3koYWN0LAotCQkJCQkJCQkJCQkJc2VsZWN0ZWRBY3Rpdml0eSk7Ci0JCQkJCQkJCWlmICghc3RhdHVzLmlzT0soKSkgewotCQkJCQkJCQkJU3RyaW5nIHRpdGxlID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuYWN0aXZpdHlfdmFyaWFiaWxpdHlfZXJyb3JfdGl0bGU7Ci0JCQkJCQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCQkJCQkJCQkJLmdldE1zZ0RpYWxvZygpLmRpc3BsYXlFcnJvcih0aXRsZSwKLQkJCQkJCQkJCQkJCQlzdGF0dXMuZ2V0TWVzc2FnZSgpKTsKLQkJCQkJCQkJCWl0b3IucmVtb3ZlKCk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQkJaWYgKHNlbGVjdGlvbi5pc0VtcHR5KCkpIHsKLQkJCQkJCQkJcmV0dXJuOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCi0JCQkJCUFjdGl2aXR5RHJvcENvbW1hbmQgY21kID0gbmV3IEFjdGl2aXR5RHJvcENvbW1hbmQoCi0JCQkJCQkJc2VsZWN0ZWRBY3Rpdml0eSwgc2VsZWN0aW9uLCBudWxsLAotCQkJCQkJCWdldEFkYXB0ZXJGYWN0b3J5KCksbmV3IEFjdGl2aXR5RGVlcENvcHlDb25maWd1cmF0b3IoY29uZmlnKSk7Ci0JCQkJCWNtZC5zZXRUeXBlKElBY3Rpb25UeXBlUHJvdmlkZXIuREVFUF9DT1BZKTsKLQkJCQkJZ2V0QWN0aW9uTWFuYWdlcigpLmV4ZWN1dGUoY21kKTsKLQotCQkJCX0KLQkJCX0pOwotCQl9Ci0JfTsKLQotCXByb3RlY3RlZCBPYmplY3Qgc2VsZWN0ZWRPYmplY3Q7Ci0KLQlwcm90ZWN0ZWQgSUFjdGlvbiBleHBhbmRBbGxBY3Rpb24gPSBuZXcgQWN0aW9uKAotCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuUHJvY2Vzc0Zvcm1FZGl0b3JfZXhwYW5BbGxBY3Rpb25MYWJlbCkgewotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb24jcnVuKCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCVZpZXdlciB2aWV3ZXIgPSAoKFByb2Nlc3NFZGl0b3IpIGFjdGl2ZUVkaXRvcikuY3VycmVudFZpZXdlcjsKLQkJCWlmICh2aWV3ZXIgaW5zdGFuY2VvZiBUcmVlVmlld2VyKSB7Ci0JCQkJKChUcmVlVmlld2VyKSB2aWV3ZXIpLmV4cGFuZFRvTGV2ZWwoc2VsZWN0ZWRPYmplY3QsCi0JCQkJCQlBYnN0cmFjdFRyZWVWaWV3ZXIuQUxMX0xFVkVMUyk7Ci0JCQl9Ci0JCX0KLQl9OwotCi0JcHJvdGVjdGVkIElBY3Rpb24gY29sbGFwc2VBbGxBY3Rpb24gPSBuZXcgQWN0aW9uKAotCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuUHJvY2Vzc0Zvcm1FZGl0b3JfY29sbGFwc2VBbGxBY3Rpb25MYWJlbCkgewotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb24jcnVuKCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCVZpZXdlciB2aWV3ZXIgPSAoKFByb2Nlc3NFZGl0b3IpIGFjdGl2ZUVkaXRvcikuY3VycmVudFZpZXdlcjsKLQkJCWlmICh2aWV3ZXIgaW5zdGFuY2VvZiBUcmVlVmlld2VyKSB7Ci0JCQkJKChUcmVlVmlld2VyKSB2aWV3ZXIpLmNvbGxhcHNlVG9MZXZlbChzZWxlY3RlZE9iamVjdCwKLQkJCQkJCUFic3RyYWN0VHJlZVZpZXdlci5BTExfTEVWRUxTKTsKLQkJCX0KLQkJfQotCX07Ci0KLQlwcm90ZWN0ZWQgU3luY2hyb25pemF0aW9uQWN0aW9uIG1hbnVhbFN5bmNocm9uaXplQWN0aW9uID0gbmV3IFN5bmNocm9uaXphdGlvbkFjdGlvbigpIHsKLQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJc3VwZXIucnVuKCk7Ci0KLQkJCS8vIHJlZnJlc2ggcHJvcGVydGllcyB2aWV3IGFmdGVyIHN5bmNoCi0JCQlFUEZQcm9wZXJ0eVNoZWV0UGFnZSBwYWdlID0gKEVQRlByb3BlcnR5U2hlZXRQYWdlKSAoKFByb2Nlc3NFZGl0b3IpIGFjdGl2ZUVkaXRvcikKLQkJCQkJLmdldFByb3BlcnR5U2hlZXRQYWdlKCk7Ci0JCQlpZiAocGFnZSAhPSBudWxsKSB7Ci0JCQkJcGFnZS5yZWZyZXNoKCk7Ci0JCQl9Ci0JCX0KLQl9OwotCi0JcHJvdGVjdGVkIFByb2Nlc3NBdXRvU3luY2hyb25pemVBY3Rpb24gYXV0b1N5bmNocm9uaXplID0gbmV3IFByb2Nlc3NBdXRvU3luY2hyb25pemVBY3Rpb24oKSB7Ci0JCXByaXZhdGUgdm9pZCBzdXBlclJ1bigpIHsKLQkJCXN1cGVyLnJ1bigpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zLlByb2Nlc3NBdXRvU3luY2hyb25pemVBY3Rpb24jcnVuKCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCUxpYnJhcnlMb2NraW5nT3BlcmF0aW9uUnVubmVyIHJ1bm5lciA9IG5ldyBMaWJyYXJ5TG9ja2luZ09wZXJhdGlvblJ1bm5lcigpOwotCQkJcnVubmVyLnJ1bihuZXcgSVJ1bm5hYmxlV2l0aFByb2dyZXNzKCkgewotCi0JCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLQkJCQkJCXRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCQkJCWlmICghQXV0aG9yaW5nVUlQbHVnaW4KLQkJCQkJCQkuZ2V0RGVmYXVsdCgpCi0JCQkJCQkJLmdldE1zZ0RpYWxvZygpCi0JCQkJCQkJLmRpc3BsYXlDb25maXJtYXRpb24oCi0JCQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5Qcm9jZXNzRWRpdG9yX2RlZmF1bHRTeW5jaHJvbml6YXRpb24sCi0JCQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5Qcm9jZXNzRWRpdG9yX2NvbmZpcm1BdXRvU3luY2gpKSB7Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCX0KLQkJCQkJLy8gKChTeW5jaHJvbml6ZUNvbW1hbmQpY29tbWFuZCkuc2V0VUlDb250ZXh0KGdldEFjdGl2ZUVkaXRvcigpLmdldFNpdGUoKS5nZXRTaGVsbCgpKTsKLQkJCQkJc3VwZXJSdW4oKTsKLQotCQkJCQkvLyByZWZyZXNoIHByb3BlcnRpZXMgdmlldyBhZnRlciBzeW5jaAotCQkJCQlFUEZQcm9wZXJ0eVNoZWV0UGFnZSBwYWdlID0gKEVQRlByb3BlcnR5U2hlZXRQYWdlKSAoKFByb2Nlc3NFZGl0b3IpIGFjdGl2ZUVkaXRvcikKLQkJCQkJCQkuZ2V0UHJvcGVydHlTaGVldFBhZ2UoKTsKLQkJCQkJaWYgKHBhZ2UgIT0gbnVsbCkgewotCQkJCQkJcGFnZS5yZWZyZXNoKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9KTsKLQotCQl9Ci0JfTsKLQotCXByaXZhdGUgSUFjdGlvbiBzaG93SW5MaWJyYXJ5VmlldyA9IG5ldyBBY3Rpb24oCi0JCQlBdXRob3JpbmdVSVJlc291cmNlcy5Qcm9jZXNzRWRpdG9yX0FjdGlvbl9TaG93TGlua2VkRWxlbWVudGluTGlicmFyeVZpZXcsCi0JCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKAotCQkJCQkiZnVsbC9ldG9vbDE2L3Nob3dfbGlua2VkX2VsZW1lbnQuZ2lmIikpIHsgLy8kTk9OLU5MUy0xJCAgIC8vKSAKLQotCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQlmaW5hbCBPYmplY3QgbGlua2VkRWxlbWVudCA9IFByb2Nlc3NVdGlsCi0JCQkJCS5nZXRBc3NvY2lhdGVkRWxlbWVudCgoRGVzY3JpcHRvcikgc2VsZWN0ZWRCcmVha2Rvd25FbGVtZW50KTsKLQkJCWlmIChsaW5rZWRFbGVtZW50ICE9IG51bGwpIHsKLQkJCQlEaXNwbGF5LmdldEN1cnJlbnQoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCi0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCUxpYnJhcnlWaWV3LmdldFZpZXcoKS5zZXRTZWxlY3Rpb25Ub1ZpZXdlcigKLQkJCQkJCQkJbGlua2VkRWxlbWVudCk7Ci0JCQkJCX0KLQotCQkJCX0pOwotCQkJfQotCQl9Ci0KLQl9OwotCi0JcHJpdmF0ZSBJQWN0aW9uIGFzc2lnblVzZXJEaWFncmFtID0gbmV3IEFjdGlvbigKLQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLlByb2Nlc3NFZGl0b3JfQWN0aW9uX0Fzc2lnblVzZXJEaWFncmFtKSB7Ci0JCS8qKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb24jcnVuKCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCVVzZXJEZWZpbmVkRGlhZ3JhbURpYWxvZyBkaWFsb2cgPSBuZXcgVXNlckRlZmluZWREaWFncmFtRGlhbG9nKAotCQkJCQlEaXNwbGF5LmdldEN1cnJlbnQoKS5nZXRBY3RpdmVTaGVsbCgpLCBhY3RpdmVFZGl0b3IsCi0JCQkJCXNlbGVjdGVkQWN0aXZpdHksIGdldFByb2Nlc3MoKS5nZXREZWZhdWx0Q29udGV4dCgpLCBUbmdVdGlsCi0JCQkJCQkJLmlzV3JhcHBlZChzZWxlY3RlZE9iamVjdCkpOwotCi0JCQlkaWFsb2cub3BlbigpOwotCQl9Ci0JfTsKLQotCS8vIHByaXZhdGUgSUFjdGlvbiBhY3Rpdml0eURldGFpbERpYWdyYW1JbmZvID0gbmV3Ci0JLy8gQWN0aXZpdHlEZXRhaWxEaWFncmFtSW5mb0FjdGlvbigpewotCS8vIHB1YmxpYyBPYmplY3QgZ2V0T2JqZWN0KCkgewotCS8vIHJldHVybiBzZWxlY3RlZEFjdGl2aXR5OwotCS8vIH0KLQkvLyBwdWJsaWMgSVdvcmtiZW5jaFBhZ2UgZ2V0UGFnZXgoKSB7Ci0JLy8gLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCS8vIHJldHVybiBnZXRQYWdlKCk7Ci0JLy8gfQotCS8vIH07Ci0KLQlwcml2YXRlIGJvb2xlYW4gb2xkTG9ja2VkOwotCi0JcHJpdmF0ZSBJbmRlbnRBY3Rpb24gaW5kZW50QWN0aW9uID0gbmV3IEluZGVudEFjdGlvbigpIHsKLQkJcHVibGljIGJvb2xlYW4gdXBkYXRlU2VsZWN0aW9uKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQkJaWYgKCFpc0VkaXRpbmdBbGxvd2VkKCkpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQlyZXR1cm4gc3VwZXIudXBkYXRlU2VsZWN0aW9uKHNlbGVjdGlvbik7Ci0JCX0KLQl9OwotCi0JcHJpdmF0ZSBPdXRkZW50QWN0aW9uIG91dGRlbnRBY3Rpb24gPSBuZXcgT3V0ZGVudEFjdGlvbigpIHsKLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBib29sZWFuIHVwZGF0ZVNlbGVjdGlvbihJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJCWlmICghaXNFZGl0aW5nQWxsb3dlZCgpKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJcmV0dXJuIHN1cGVyLnVwZGF0ZVNlbGVjdGlvbihzZWxlY3Rpb24pOwotCQl9Ci0JfTsKLQotCXB1YmxpYyBQcm9jZXNzRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3IoKSB7Ci0JCXN1cGVyKEF1dGhvcmluZ1VJUmVzb3VyY2VzLlByb2Nlc3NFZGl0b3IpOwotCi0JCS8vIGRvbid0IHNob3cgdmFsaWRhdGUgYWN0aW9uCi0JCS8vCi0JCXZhbGlkYXRlQWN0aW9uID0gbnVsbDsKLQotCQkvLyBzZXQgZGlzYWJsZWQgaW1hZ2UgZGVzY3JpcHRvcnMKLQkJc2hvd0luTGlicmFyeVZpZXcuc2V0RGlzYWJsZWRJbWFnZURlc2NyaXB0b3IoQXV0aG9yaW5nVUlQbHVnaW4KLQkJCQkuZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcigKLQkJCQkJCSJmdWxsL2V0b29sMTYvc2hvd19saW5rZWRfZWxlbWVudF9kaXNhYmxlZC5naWYiKSk7IC8vJE5PTi1OTFMtMSQJCQkKLQl9Ci0KLQlwdWJsaWMgUHJvY2Vzc0VkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHN1cGVyKG5hbWUpOwotICAgIH0KLQotCXByb3RlY3RlZCB2b2lkIG9wZW5EaWFncmFtKGludCBkaWFncmFtVHlwZSkgewotCQl0cnkgewotCQkJRGlhZ3JhbUVkaXRvcklucHV0IGlucHV0ID0gbmV3IERpYWdyYW1FZGl0b3JJbnB1dCgKLQkJCQkJc2VsZWN0ZWRPYmplY3QsIGdldFN1cHByZXNzaW9uKCksIGRpYWdyYW1UeXBlKTsKLQkJCURpYWdyYW1FZGl0b3JVdGlsLm9wZW5EaWFncmFtRWRpdG9yKGdldFBhZ2UoKSwgaW5wdXQsCi0JCQkJCURpYWdyYW1FZGl0b3JIZWxwZXIuZ2V0RGlhZ3JhbVByZWZlcmVuY2VzSGludChkaWFncmFtVHlwZSksCi0JCQkJCW5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlZ2lzdGVyQWN0aW9uKElBY3Rpb24gYWN0aW9uKSB7Ci0JCWlmIChhY3Rpb24gIT0gbnVsbCAmJiAhcmVnaXN0ZXJlZEFjdGlvbnMuY29udGFpbnMoYWN0aW9uKSkgewotCQkJcmVnaXN0ZXJlZEFjdGlvbnMuYWRkKGFjdGlvbik7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZWdpc3RlckFjdGlvbnMoKSB7Ci0JCXJlZ2lzdGVyQWN0aW9uKGF1dG9TeW5jaHJvbml6ZSk7Ci0JCXJlZ2lzdGVyQWN0aW9uKG1hbnVhbFN5bmNocm9uaXplQWN0aW9uKTsKLQkJcmVnaXN0ZXJBY3Rpb24odXBkYXRlU3VwcHJlc3Npb25Gcm9tQmFzZUFjdGlvbik7Ci0JCXJlZ2lzdGVyQWN0aW9uKGluZGVudEFjdGlvbik7Ci0JCXJlZ2lzdGVyQWN0aW9uKG91dGRlbnRBY3Rpb24pOwotCQlyZWdpc3RlckFjdGlvbihtb3ZlRG93bkFjdGlvbik7Ci0JCXJlZ2lzdGVyQWN0aW9uKG1vdmVVcEFjdGlvbik7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uRWRpdGluZ0RvbWFpbkFjdGlvbkJhckNvbnRyaWJ1dG9yI3VwZGF0ZSgpCi0JICovCi0JcHVibGljIHZvaWQgdXBkYXRlKCkgewotCQlzdXBlci51cGRhdGUoKTsKLQotCQlJU2VsZWN0aW9uUHJvdmlkZXIgc2VsZWN0aW9uUHJvdmlkZXIgPSBhY3RpdmVFZGl0b3IgaW5zdGFuY2VvZiBJU2VsZWN0aW9uUHJvdmlkZXIgPyAoSVNlbGVjdGlvblByb3ZpZGVyKSBhY3RpdmVFZGl0b3IKLQkJCQk6IGFjdGl2ZUVkaXRvci5nZXRFZGl0b3JTaXRlKCkuZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKTsKLQkJSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSBzZWxlY3Rpb25Qcm92aWRlci5nZXRTZWxlY3Rpb24oKTsKLQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc3RydWN0dXJlZFNlbGVjdGlvbiA9IHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uID8gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb24KLQkJCQk6IFN0cnVjdHVyZWRTZWxlY3Rpb24uRU1QVFk7Ci0KLQkJYm9vbGVhbiBlZGl0aW5nQWxsb3dlZCA9IGlzRWRpdGluZ0FsbG93ZWQoKTsKLQkJZm9yIChJQWN0aW9uIGFjdGlvbiA6IHJlZ2lzdGVyZWRBY3Rpb25zKSB7Ci0JCQlpZiAoYWN0aW9uIGluc3RhbmNlb2YgQ29tbWFuZEFjdGlvbkhhbmRsZXIpIHsKLQkJCQlhY3Rpb24uc2V0RW5hYmxlZCgoKENvbW1hbmRBY3Rpb25IYW5kbGVyKSBhY3Rpb24pCi0JCQkJCQkudXBkYXRlU2VsZWN0aW9uKHN0cnVjdHVyZWRTZWxlY3Rpb24pKTsKLQkJCX0KLQkJCWVsc2UgaWYgKGFjdGlvbiBpbnN0YW5jZW9mIElNb2RpZnlpbmdBY3Rpb24pIHsKLQkJCQlhY3Rpb24uc2V0RW5hYmxlZChlZGl0aW5nQWxsb3dlZCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5FZGl0aW5nRG9tYWluQWN0aW9uQmFyQ29udHJpYnV0b3IjYWN0aXZhdGUoKQotCSAqLwotCXB1YmxpYyB2b2lkIGFjdGl2YXRlKCkgewotCQltYW51YWxTeW5jaHJvbml6ZUFjdGlvbi5zZXRQcm9jZXNzKGdldFByb2Nlc3MoKSk7Ci0JCUlTZWxlY3Rpb25Qcm92aWRlciBzZWxlY3Rpb25Qcm92aWRlciA9IGFjdGl2ZUVkaXRvciBpbnN0YW5jZW9mIElTZWxlY3Rpb25Qcm92aWRlciA/IChJU2VsZWN0aW9uUHJvdmlkZXIpIGFjdGl2ZUVkaXRvcgotCQkJCTogYWN0aXZlRWRpdG9yLmdldEVkaXRvclNpdGUoKS5nZXRTZWxlY3Rpb25Qcm92aWRlcigpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSByZWdpc3RlcmVkQWN0aW9ucy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBhY3Rpb24gPSAoT2JqZWN0KSBpdGVyLm5leHQoKTsKLQkJCWlmIChhY3Rpb24gaW5zdGFuY2VvZiBJV29ya2JlbmNoUGFydEFjdGlvbikgewotCQkJCSgoSVdvcmtiZW5jaFBhcnRBY3Rpb24pIGFjdGlvbikKLQkJCQkJCS5zZXRBY3RpdmVXb3JrYmVuY2hQYXJ0KGFjdGl2ZUVkaXRvcik7Ci0JCQl9Ci0JCQlpZiAoYWN0aW9uIGluc3RhbmNlb2YgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcikgewotCQkJCXNlbGVjdGlvblByb3ZpZGVyCi0JCQkJCQkuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKChJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKSBhY3Rpb24pOwotCQkJfQotCQl9Ci0JCXN1cGVyLmFjdGl2YXRlKCk7Ci0KLQkJLy8gY2FsbCBzZXQgQWN0aXZlIHBhZ2UgZXhwbGljaXRseSBpbiBvcmRlciB0byBnZXQgY29ycmVjdCBhY3Rpb24KLQkJLy8gYmFycwotCQlzZXRBY3RpdmVQYWdlKGFjdGl2ZUVkaXRvcik7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uRWRpdGluZ0RvbWFpbkFjdGlvbkJhckNvbnRyaWJ1dG9yI2RlYWN0aXZhdGUoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRlYWN0aXZhdGUoKSB7Ci0JCXN1cGVyLmRlYWN0aXZhdGUoKTsKLQotCQlJU2VsZWN0aW9uUHJvdmlkZXIgc2VsZWN0aW9uUHJvdmlkZXIgPSBhY3RpdmVFZGl0b3IgaW5zdGFuY2VvZiBJU2VsZWN0aW9uUHJvdmlkZXIgPyAoSVNlbGVjdGlvblByb3ZpZGVyKSBhY3RpdmVFZGl0b3IKLQkJCQk6IGFjdGl2ZUVkaXRvci5nZXRFZGl0b3JTaXRlKCkuZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKTsKLQotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSByZWdpc3RlcmVkQWN0aW9ucy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBhY3Rpb24gPSAoT2JqZWN0KSBpdGVyLm5leHQoKTsKLQkJCWlmIChhY3Rpb24gaW5zdGFuY2VvZiBJV29ya2JlbmNoUGFydEFjdGlvbikgewotCQkJCSgoSVdvcmtiZW5jaFBhcnRBY3Rpb24pIGFjdGlvbikuc2V0QWN0aXZlV29ya2JlbmNoUGFydChudWxsKTsKLQkJCX0KLQkJCWlmIChhY3Rpb24gaW5zdGFuY2VvZiBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKSB7Ci0JCQkJc2VsZWN0aW9uUHJvdmlkZXIKLQkJCQkJCS5yZW1vdmVTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIpIGFjdGlvbik7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9ucy5NZXRob2RMaWJyYXJ5QWN0aW9uQmFyQ29udHJpYnV0b3IjaW5pdChvcmcuZWNsaXBzZS51aS5JQWN0aW9uQmFycykKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElBY3Rpb25CYXJzIGFjdGlvbkJhcnMpIHsKLQkJc3VwZXIuaW5pdChhY3Rpb25CYXJzKTsKLQkJcmVnaXN0ZXJBY3Rpb25zKCk7Ci0JCWNvbnRyaWJ1dGVUb1Rvb2xCYXIoYWN0aW9uQmFycy5nZXRUb29sQmFyTWFuYWdlcigpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSUFjdGlvbk1hbmFnZXIgZ2V0QWN0aW9uTWFuYWdlcigpIHsKLQkJcmV0dXJuICgoTWV0aG9kRWxlbWVudEVkaXRvcikgYWN0aXZlRWRpdG9yKS5nZXRBY3Rpb25NYW5hZ2VyKCk7Ci0JfQotCi0JcHJvdGVjdGVkIEFkYXB0ZXJGYWN0b3J5IGdldEFkYXB0ZXJGYWN0b3J5KCkgewotCQlyZXR1cm4gKChQcm9jZXNzRWRpdG9yKSBhY3RpdmVFZGl0b3IpLmdldEFkYXB0ZXJGYWN0b3J5KCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0QWxsRGlhZ3JhbVN1cHByZXNzZWQoZmluYWwgYm9vbGVhbiBzdXBwcmVzc2VkKSB7Ci0JCVN0cmluZyB0aXRsZSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLnByb2Nlc3NGb3JtRWRpdG9yU2F2ZURpYWxvZ190aXRsZTsKLQkJU3RyaW5nIG1lc3NhZ2UgPSBBdXRob3JpbmdVSVJlc291cmNlcy5wcm9jZXNzRm9ybUVkaXRvclNhdmVEaWFsb2dfbWVzc2FnZTE7Ci0KLQkJaWYgKCFBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkuZGlzcGxheUNvbmZpcm1hdGlvbigKLQkJCQl0aXRsZSwgbWVzc2FnZSkpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCUJ1c3lJbmRpY2F0b3Iuc2hvd1doaWxlKGFjdGl2ZUVkaXRvci5nZXRFZGl0b3JTaXRlKCkuZ2V0U2hlbGwoKQotCQkJCS5nZXREaXNwbGF5KCksIG5ldyBSdW5uYWJsZSgpIHsKLQotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCUdyYXBoaWNhbERhdGFIZWxwZXIuc2V0QWxsRGlhZ3JhbVN1cHByZXNzZWQoZ2V0UHJvY2VzcygpLAotCQkJCQkJc3VwcHJlc3NlZCk7Ci0JCQkJZG9TYXZlQWN0aXZlRWRpdG9yKCk7Ci0JCQl9Ci0KLQkJfSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHB1Ymxpc2hEaWFncmFtc0ZvclByb2Nlc3MoZmluYWwgYm9vbGVhbiBwdWJsaXNoKSB7Ci0JCVN0cmluZyB0aXRsZSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLnByb2Nlc3NGb3JtRWRpdG9yU2F2ZURpYWxvZ190aXRsZTsKLQkJU3RyaW5nIG1lc3NhZ2UgPSBBdXRob3JpbmdVSVJlc291cmNlcy5wcm9jZXNzRm9ybUVkaXRvclNhdmVEaWFsb2dfbWVzc2FnZTE7Ci0KLQkJaWYgKCFBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkuZGlzcGxheUNvbmZpcm1hdGlvbigKLQkJCQl0aXRsZSwgbWVzc2FnZSkpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCUJ1c3lJbmRpY2F0b3Iuc2hvd1doaWxlKGFjdGl2ZUVkaXRvci5nZXRFZGl0b3JTaXRlKCkuZ2V0U2hlbGwoKQotCQkJCS5nZXREaXNwbGF5KCksIG5ldyBSdW5uYWJsZSgpIHsKLQotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCi0JCQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBuZXcgQWJzdHJhY3RUcmVlSXRlcmF0b3IoZ2V0UHJvY2VzcygpKSB7Ci0KLQkJCQkJLyoqCi0JCQkJCSAqIENvbW1lbnQgZm9yIDxjb2RlPnNlcmlhbFZlcnNpb25VSUQ8L2NvZGU+Ci0JCQkJCSAqLwotCQkJCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtNjE4OTQ5MDE0NDc2MzcxMTE0TDsKLQotCQkJCQlwcm90ZWN0ZWQgSXRlcmF0b3IgZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQkJCQkJQWN0aXZpdHkgYWN0ID0gKEFjdGl2aXR5KSBvYmplY3Q7Ci0JCQkJCQlBcnJheUxpc3QgY2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gYWN0LmdldEJyZWFrZG93bkVsZW1lbnRzKCkKLQkJCQkJCQkJLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCQkJCQlPYmplY3QgZWxlbWVudCA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJCQkJCWNoaWxkcmVuLmFkZChlbGVtZW50KTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQlyZXR1cm4gY2hpbGRyZW4uaXRlcmF0b3IoKTsKLQkJCQkJfQotCi0JCQkJfTsKLQkJCQl0cnkgewotCQkJCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJCQlBY3Rpdml0eSBhY3Rpdml0eSA9IChBY3Rpdml0eSkgaXRlcmF0b3IubmV4dCgpOwotCQkJCQkJRGlhZ3JhbU9wdGlvbnMuc2V0UHVibGlzaEFEKGFjdGl2aXR5LCBwdWJsaXNoKTsKLQkJCQkJCURpYWdyYW1PcHRpb25zLnNldFB1Ymxpc2hBREQoYWN0aXZpdHksIHB1Ymxpc2gpOwotCQkJCQkJRGlhZ3JhbU9wdGlvbnMuc2V0UHVibGlzaFdQREQoYWN0aXZpdHksIHB1Ymxpc2gpOwotCQkJCQl9Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCX0KLQkJCQlkb1NhdmVBY3RpdmVFZGl0b3IoKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIHByb21wdFNhdmVBY3RpdmVFZGl0b3IoKSB7Ci0JCVN0cmluZyB0aXRsZSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLnByb2Nlc3NGb3JtRWRpdG9yU2F2ZURpYWxvZ190aXRsZTsKLQkJU3RyaW5nIG1lc3NhZ2UgPSBBdXRob3JpbmdVSVJlc291cmNlcy5wcm9jZXNzRm9ybUVkaXRvclNhdmVEaWFsb2dfbWVzc2FnZTI7Ci0JCWlmIChhY3RpdmVFZGl0b3IuaXNEaXJ0eSgpKSB7Ci0JCQlyZXR1cm4gQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpCi0JCQkJCS5kaXNwbGF5Q29uZmlybWF0aW9uKHRpdGxlLCBtZXNzYWdlKTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzYXZlQWN0aXZlRWRpdG9yKCkgewotCQkvLyBzYXZlIHRoZSBlZGl0b3IKLQkJLy8KLQkJQnVzeUluZGljYXRvci5zaG93V2hpbGUoYWN0aXZlRWRpdG9yLmdldEVkaXRvclNpdGUoKS5nZXRTaGVsbCgpCi0JCQkJLmdldERpc3BsYXkoKSwgbmV3IFJ1bm5hYmxlKCkgewotCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJZG9TYXZlQWN0aXZlRWRpdG9yKCk7Ci0JCQl9Ci0KLQkJfSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZG9TYXZlQWN0aXZlRWRpdG9yKCkgewotCQkoKFByb2Nlc3NFZGl0b3IpIGFjdGl2ZUVkaXRvcikucmVzb3VyY2VzVG9TYXZlLmFkZChnZXRQcm9jZXNzKCkKLQkJCQkuZVJlc291cmNlKCkpOwotCQlhY3RpdmVFZGl0b3IuZG9TYXZlKG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCX0KLQotCXByb3RlY3RlZCBEZWxldGVBY3Rpb24gY3JlYXRlRGVsZXRlQWN0aW9uKCkgewotCQlyZXR1cm4gbmV3IFByb2Nlc3NEZWxldGVBY3Rpb24oKSB7Ci0JCQlwcm90ZWN0ZWQgdm9pZCBzYXZlQ3VycmVudEVkaXRvcigpIHsKLQkJCQlpZiAoYWN0aXZlRWRpdG9yLmlzRGlydHkoKSkgewotCQkJCQlCdXN5SW5kaWNhdG9yLnNob3dXaGlsZShhY3RpdmVFZGl0b3IuZ2V0RWRpdG9yU2l0ZSgpCi0JCQkJCQkJLmdldFNoZWxsKCkuZ2V0RGlzcGxheSgpLCBuZXcgUnVubmFibGUoKSB7Ci0KLQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQlhY3RpdmVFZGl0b3IuZG9TYXZlKG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQkJCQkJfQotCi0JCQkJCX0pOwotCQkJCX0KLQkJCX0KLQotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCUlGb3JtUGFnZSBhY3RpdmVQYWdlID0gKChQcm9jZXNzRWRpdG9yKSBhY3RpdmVFZGl0b3IpCi0JCQkJCQkuZ2V0QWN0aXZlUGFnZUluc3RhbmNlKCk7Ci0JCQkJaWYgKGFjdGl2ZVBhZ2UgIT0gbnVsbCkgewotCQkJCQlTdHJpbmcgaWQgPSBhY3RpdmVQYWdlLmdldElkKCk7Ci0JCQkJCWlmIChpZCA9PSBQcm9jZXNzRWRpdG9yLldCU19GT1JNX0lECi0JCQkJCQkJfHwgaWQgPT0gUHJvY2Vzc0VkaXRvci5UQV9GT1JNX0lECi0JCQkJCQkJfHwgaWQgPT0gUHJvY2Vzc0VkaXRvci5XUEJTX0ZPUk1fSUQKLQkJCQkJCQl8fCBpZCA9PSBQcm9jZXNzRWRpdG9yLkNPTlNPTElEQVRFRF9GT1JNX0lEKSB7Ci0JCQkJCQkvLyBmb3IgYWxsIG90aGVyIHBhZ2VzLCBkaXNhYmxlIERFTEVURQotCQkJCQkJc3VwZXIucnVuKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJvdGVjdGVkIEN1dEFjdGlvbiBjcmVhdGVDdXRBY3Rpb24oKSB7Ci0JCXJldHVybiBuZXcgQ3V0QWN0aW9uKCkgewotCQkJcHVibGljIGJvb2xlYW4gdXBkYXRlU2VsZWN0aW9uKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQkJCXJldHVybiBzdXBlci51cGRhdGVTZWxlY3Rpb24oUHJvY2Vzc0RlbGV0ZUFjdGlvbgotCQkJCQkJLmZpbHRlclNlbGVjdGlvbihzZWxlY3Rpb24pKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgQ29tbWFuZCBjcmVhdGVDb21tYW5kKENvbGxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCQkJYm9vbGVhbiB1bmV4ZWN1dGFibGUgPSBmYWxzZTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBzZWxlY3Rpb24uaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCU9iamVjdCBlbGVtZW50ID0gKE9iamVjdCkgaXRlci5uZXh0KCk7Ci0JCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQkJCXVuZXhlY3V0YWJsZSA9IHRydWU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKHVuZXhlY3V0YWJsZSkgewotCQkJCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJCQl9IGVsc2UgewotCQkJCQlyZXR1cm4gc3VwZXIuY3JlYXRlQ29tbWFuZChzZWxlY3Rpb24pOwotCQkJCX0KLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcm90ZWN0ZWQgUGFzdGVBY3Rpb24gY3JlYXRlUGFzdGVBY3Rpb24oKSB7Ci0JCXJldHVybiBuZXcgUGFzdGVBY3Rpb24oKSB7Ci0JCQlwdWJsaWMgYm9vbGVhbiB1cGRhdGVTZWxlY3Rpb24oSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCQkJcmV0dXJuIHN1cGVyLnVwZGF0ZVNlbGVjdGlvbihQcm9jZXNzRGVsZXRlQWN0aW9uCi0JCQkJCQkuZmlsdGVyU2VsZWN0aW9uKHNlbGVjdGlvbikpOwotCQkJfQotCi0JCQkvKioKLQkJCSAqIE92ZXJyaWRlZCB0byB1c2UgUmVzb3VyY2VBd2FyZVBhc3RlRnJvbUNsaXBib2FyZENvbW1hbmQKLQkJCSAqIAotCQkJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uUGFzdGVBY3Rpb24jY3JlYXRlQ29tbWFuZChqYXZhLnV0aWwuQ29sbGVjdGlvbikKLQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLlJlc291cmNlQXdhcmVQYXN0ZUZyb21DbGlwYm9hcmRDb21tYW5kCi0JCQkgKi8KLQkJCXB1YmxpYyBDb21tYW5kIGNyZWF0ZUNvbW1hbmQoQ29sbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJCQlpZiAoc2VsZWN0aW9uLnNpemUoKSA9PSAxKSB7Ci0JCQkJCXJldHVybiBuZXcgUmVzb3VyY2VBd2FyZVBhc3RlRnJvbUNsaXBib2FyZENvbW1hbmQoZG9tYWluLAotCQkJCQkJCXNlbGVjdGlvbi5pdGVyYXRvcigpLm5leHQoKSwgbnVsbCwKLQkJCQkJCQlDb21tYW5kUGFyYW1ldGVyLk5PX0lOREVYKTsKLQkJCQl9IGVsc2UgewotCQkJCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJvdGVjdGVkIENvcHlBY3Rpb24gY3JlYXRlQ29weUFjdGlvbigpIHsKLQkJcmV0dXJuIG5ldyBDb3B5QWN0aW9uKCkgewotCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJaWYgKGRvbWFpbiBpbnN0YW5jZW9mIFRyYWNlYWJsZUFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbikgewotCQkJCQkoKFRyYWNlYWJsZUFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbikgZG9tYWluKQotCQkJCQkJCS5yZXNldENvcHlNYXBzKCk7Ci0JCQkJfQotCQkJCXN1cGVyLnJ1bigpOwotCQkJfQotCi0JCX07Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uRWRpdGluZ0RvbWFpbkFjdGlvbkJhckNvbnRyaWJ1dG9yI2FkZEdsb2JhbEFjdGlvbnMob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TWFuYWdlcikKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRHbG9iYWxBY3Rpb25zKElNZW51TWFuYWdlciBtZW51TWFuYWdlcikgewotCQlzdXBlci5hZGRHbG9iYWxBY3Rpb25zKG1lbnVNYW5hZ2VyKTsKLQkJbWVudU1hbmFnZXIuaW5zZXJ0QWZ0ZXIoImFkZGl0aW9ucyIsIG5ldyBTZXBhcmF0b3IoImZpeGVkLWFkZGl0aW9ucyIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCS8vIG1lbnVNYW5hZ2VyLmluc2VydEJlZm9yZSgiZml4ZWQtYWRkaXRpb25zIiwKLQkJLy8gaW5zZXJ0TmV3UGhhc2VBY3Rpb24pOwotCX0KLQotCXB1YmxpYyB2b2lkIGNvbnRyaWJ1dGVUb1Rvb2xCYXIoSVRvb2xCYXJNYW5hZ2VyIHRvb2xCYXJNYW5hZ2VyKSB7Ci0JCXN1cGVyLmNvbnRyaWJ1dGVUb1Rvb2xCYXIodG9vbEJhck1hbmFnZXIpOwotCi0JCXNob3dJbkxpYnJhcnlWaWV3Ci0JCQkJLnNldFRvb2xUaXBUZXh0KEF1dGhvcmluZ1VJUmVzb3VyY2VzLlByb2Nlc3NFZGl0b3JfQWN0aW9uX1Nob3dMaW5rZWRFbGVtZW50aW5MaWJyYXJ5Vmlldyk7Ci0JCXRvb2xCYXJNYW5hZ2VyLmFkZChtb3ZlVXBBY3Rpb24pOwotCQl0b29sQmFyTWFuYWdlci5hZGQobW92ZURvd25BY3Rpb24pOwotCQl0b29sQmFyTWFuYWdlci5hZGQoaW5kZW50QWN0aW9uKTsKLQkJdG9vbEJhck1hbmFnZXIuYWRkKG91dGRlbnRBY3Rpb24pOwotCQl0b29sQmFyTWFuYWdlci5hZGQoc2hvd0luTGlicmFyeVZpZXcpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzRWRpdGluZ0FsbG93ZWQoKSB7Ci0JCUlGb3JtUGFnZSBhY3RpdmVQYWdlID0gKChQcm9jZXNzRWRpdG9yKSBhY3RpdmVFZGl0b3IpCi0JCQkJLmdldEFjdGl2ZVBhZ2VJbnN0YW5jZSgpOwotCQlyZXR1cm4gIShhY3RpdmVQYWdlIGluc3RhbmNlb2YgUHJvY2Vzc0JyZWFrZG93blN0cnVjdHVyZUZvcm1QYWdlICYmICgoUHJvY2Vzc0JyZWFrZG93blN0cnVjdHVyZUZvcm1QYWdlKSBhY3RpdmVQYWdlKQotCQkJCS5iYXNpY0lzUmVhZE9ubHkoKSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVMaXN0ZW5lciNtZW51QWJvdXRUb1Nob3cob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TWFuYWdlcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBtZW51QWJvdXRUb1Nob3coSU1lbnVNYW5hZ2VyIG1lbnVNYW5hZ2VyKSB7Ci0JCUlGb3JtUGFnZSBhY3RpdmVQYWdlID0gKChQcm9jZXNzRWRpdG9yKSBhY3RpdmVFZGl0b3IpCi0JCQkJLmdldEFjdGl2ZVBhZ2VJbnN0YW5jZSgpOwotCQlpZiAoIWlzRWRpdGluZ0FsbG93ZWQoKSkgewotCQkJbWVudU1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoCi0JCQkJCUlXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuTUJfQURESVRJT05TKSk7Ci0JCQltZW51TWFuYWdlci5hZGQoc2hvd0luTGlicmFyeVZpZXcpOwotCQkJaWYgKGJzSXRlbVByb3ZpZGVyICE9IG51bGwKLQkJCS8vICYmICgoSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyKQotCQkJLy8gYnNJdGVtUHJvdmlkZXIpLmhhc0NoaWxkcmVuKHNlbGVjdGVkT2JqZWN0KQotCQkJKSB7Ci0JCQkJbWVudU1hbmFnZXIuYWRkKGV4cGFuZEFsbEFjdGlvbik7Ci0JCQkJbWVudU1hbmFnZXIuYWRkKGNvbGxhcHNlQWxsQWN0aW9uKTsKLQkJCX0KLQkJCW1lbnVNYW5hZ2VyLmFkZChuZXcgU2VwYXJhdG9yKCkpOwotCQkJcmVmcmVzaFZpZXdlckFjdGlvbi5zZXRFbmFibGVkKHJlZnJlc2hWaWV3ZXJBY3Rpb24uaXNFbmFibGVkKCkpOwotCQkJbWVudU1hbmFnZXIuYWRkKHJlZnJlc2hWaWV3ZXJBY3Rpb24pOwotCQkJbWVudU1hbmFnZXIuYWRkKHNob3dQcm9wZXJ0aWVzVmlld0FjdGlvbik7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlJU2VsZWN0aW9uUHJvdmlkZXIgc2VsZWN0aW9uUHJvdmlkZXIgPSAoSVNlbGVjdGlvblByb3ZpZGVyKSBhY3RpdmVFZGl0b3I7Ci0KLQkJaWYgKHNlbGVjdGVkQWN0aXZpdHkgPT0gbnVsbAotCQkJCSYmIChzZWxlY3Rpb25Qcm92aWRlci5nZXRTZWxlY3Rpb24oKSA9PSBudWxsIHx8IHNlbGVjdGlvblByb3ZpZGVyCi0JCQkJCQkuZ2V0U2VsZWN0aW9uKCkuaXNFbXB0eSgpKSkgewotCQkJLy8gZmFrZSBhIHNlbGVjdGlvbiBjaGFuZ2UgZXZlbnQgd2l0aCB0aGUgcHJvY2VzcyBzZWxlY3RlZCBpZiBubwotCQkJLy8gZWxlbWVudCBpcyBzZWxlY3RlZCB5ZXQuCi0JCQkvLwotCQkJc2VsZWN0aW9uQ2hhbmdlZChuZXcgU2VsZWN0aW9uQ2hhbmdlZEV2ZW50KHNlbGVjdGlvblByb3ZpZGVyLAotCQkJCQluZXcgU3RydWN0dXJlZFNlbGVjdGlvbihnZXRQcm9jZXNzKCkpKSk7Ci0JCX0KLQkJLy8gZGlzYWJsZSBhbGwgbmV3IGFjdGlvbiBpZiBpdCdzIHJvbGxlZCB1cAotCQlib29sZWFuIGlzUm9sbGVkVVAgPSBic0l0ZW1Qcm92aWRlciAhPSBudWxsCi0JCQkJJiYgYnNJdGVtUHJvdmlkZXIuaXNSb2xsZWRVcCgpOwotCQlzdXBlci5zZXRFbmFibGVkKCFpc1JvbGxlZFVQKTsKLQkJc3VwZXIubWVudUFib3V0VG9TaG93KG1lbnVNYW5hZ2VyKTsKLQotCQkvLyBhZGQgbWFya2VycwotCQkvLwotCQltZW51TWFuYWdlci5pbnNlcnRBZnRlcigiZml4ZWQtYWRkaXRpb25zIiwgbmV3IFNlcGFyYXRvcigicHJlZmVyZW5jZSIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCQotCQltZW51TWFuYWdlci5hcHBlbmRUb0dyb3VwKCJwcmVmZXJlbmNlIiwgcHJlZmVyZW5jZUFjdGlvbik7IC8vJE5PTi1OTFMtMSQKLQotCQltZW51TWFuYWdlci5pbnNlcnRBZnRlcigiZml4ZWQtYWRkaXRpb25zIiwgbmV3IFNlcGFyYXRvcigib3BlbiIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkJaWYgKGJzSXRlbVByb3ZpZGVyIGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIKLQkJCQkmJiBUbmdVdGlsLnVud3JhcChic0l0ZW1Qcm92aWRlcikgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJbWVudU1hbmFnZXIuaW5zZXJ0QmVmb3JlKElXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuTUJfQURESVRJT05TLAotCQkJCQljb250cmlidXRlQWN0aW9uKTsKLQkJCW1lbnVNYW5hZ2VyLmluc2VydEJlZm9yZShJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLk1CX0FERElUSU9OUywKLQkJCQkJcmVwbGFjZUFjdGlvbik7Ci0JCQltZW51TWFuYWdlci5pbnNlcnRCZWZvcmUoSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5NQl9BRERJVElPTlMsCi0JCQkJCWxvY2FsUmVwbGFjZW1lbnRBbmREZWVwQ29weSk7Ci0JCX0KLQotCQlpZiAoIWlzUm9sbGVkVVApIHsKLQkJCWlmIChjcmVhdGVDaGlsZEFjdGlvbnMgIT0gbnVsbCAmJiAhY3JlYXRlQ2hpbGRBY3Rpb25zLmlzRW1wdHkoKSkgewotCQkJCW1lbnVNYW5hZ2VyLmluc2VydEJlZm9yZSgKLQkJCQkJCUlXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuTUJfQURESVRJT05TLCBhZGRBY3Rpb24pOwotCQkJfQotCQl9Ci0KLQkJaWYgKHJldmVhbEFjdGlvbi5pc0VuYWJsZWQoKSkgewotCQkJbWVudU1hbmFnZXIuaW5zZXJ0QmVmb3JlKCJmaXhlZC1hZGRpdGlvbnMiLCByZXZlYWxBY3Rpb24pOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlpZiAoc3VwcHJlc3NBY3Rpb24uaXNFbmFibGVkKCkpIHsKLQkJCW1lbnVNYW5hZ2VyLmluc2VydEJlZm9yZSgiZml4ZWQtYWRkaXRpb25zIiwgc3VwcHJlc3NBY3Rpb24pOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJaWYgKCFpc1JvbGxlZFVQKSB7Ci0JCQlpZiAoc3VwcHJlc3NUYXNrQWN0aW9uLmlzRW5hYmxlZCgpKSB7Ci0JCQkJbWVudU1hbmFnZXIuaW5zZXJ0QmVmb3JlKCJmaXhlZC1hZGRpdGlvbnMiLCBzdXBwcmVzc1Rhc2tBY3Rpb24pOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlpZiAocmV2ZWFsVGFza0FjdGlvbi5pc0VuYWJsZWQoKSkgewotCQkJCW1lbnVNYW5hZ2VyLmluc2VydEJlZm9yZSgiZml4ZWQtYWRkaXRpb25zIiwgcmV2ZWFsVGFza0FjdGlvbik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCQlpZiAodXBkYXRlU3VwcHJlc3Npb25Gcm9tQmFzZUFjdGlvbi5pc0VuYWJsZWQoKSkgewotCQkJbWVudU1hbmFnZXIuaW5zZXJ0QmVmb3JlKAotCQkJCQkiZml4ZWQtYWRkaXRpb25zIiwgdXBkYXRlU3VwcHJlc3Npb25Gcm9tQmFzZUFjdGlvbik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCWlmICgoc2VsZWN0ZWRCcmVha2Rvd25FbGVtZW50ICE9IG51bGwpICYmIChic0l0ZW1Qcm92aWRlciAhPSBudWxsKSkgewotCQkJbWVudU1hbmFnZXIuaW5zZXJ0QmVmb3JlKCJmaXhlZC1hZGRpdGlvbnMiLCBtb3ZlVXBBY3Rpb24pOyAvLyROT04tTkxTLTEkCi0JCQltZW51TWFuYWdlci5pbnNlcnRCZWZvcmUoImZpeGVkLWFkZGl0aW9ucyIsIG1vdmVEb3duQWN0aW9uKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJLy8gSW5kZW50L291dGRlbnQKLQkJLy8KLQkJbWVudU1hbmFnZXIuaW5zZXJ0QmVmb3JlKCJmaXhlZC1hZGRpdGlvbnMiLCBpbmRlbnRBY3Rpb24pOyAvLyROT04tTkxTLTEkCQkJCQotCQltZW51TWFuYWdlci5pbnNlcnRCZWZvcmUoImZpeGVkLWFkZGl0aW9ucyIsIG91dGRlbnRBY3Rpb24pOyAvLyROT04tTkxTLTEkCi0KLQkJbWVudU1hbmFnZXIuYXBwZW5kVG9Hcm91cCgib3BlbiIsIHNob3dJbkxpYnJhcnlWaWV3KTsgLy8kTk9OLU5MUy0xJAotCi0JCWlmICgoc2VsZWN0ZWRBY3Rpdml0eSAhPSBudWxsKSAmJiAoYnNJdGVtUHJvdmlkZXIgIT0gbnVsbCkpIHsKLQkJCWlmIChic0l0ZW1Qcm92aWRlci5pc1JvbGxlZFVwKCkpIHsKLQkJCQlyb2xsdXBBY3Rpb24KLQkJCQkJCS5zZXRUZXh0KEF1dGhvcmluZ1VJUmVzb3VyY2VzLlByb2Nlc3NFZGl0b3JfQWN0aW9uX1JvbGxEb3duKTsKLQkJCX0gZWxzZSB7Ci0JCQkJcm9sbHVwQWN0aW9uCi0JCQkJCQkuc2V0VGV4dChBdXRob3JpbmdVSVJlc291cmNlcy5Qcm9jZXNzRWRpdG9yX0FjdGlvbl9Sb2xsVXApOwotCQkJfQotCQkJbWVudU1hbmFnZXIuYXBwZW5kVG9Hcm91cCgib3BlbiIsIHJvbGx1cEFjdGlvbik7IC8vJE5PTi1OTFMtMSQJCQkJCi0JCX0KLQotCQlpZiAoc2VsZWN0ZWRPYmplY3QgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJLy8gIlJldXNlIiBtZW51Ci0JCQkvLwotCQkJTWVudU1hbmFnZXIgcmV1c2VTdWJNZW51ID0gbmV3IE1lbnVNYW5hZ2VyKAotCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5Qcm9jZXNzRWRpdG9yX0FjdGlvbl9BcHBseVBhdHRlcm4pOwotCQkJcmV1c2VTdWJNZW51LmFkZChjb3B5QWN0aXZpdHlBY3Rpb24pOwotCQkJcmV1c2VTdWJNZW51LmFkZChleHRlbmRBY3Rpdml0eUFjdGlvbik7Ci0JCQlyZXVzZVN1Yk1lbnUuYWRkKGRlZXBDb3B5QWN0aXZpdHlBY3Rpb24pOwotCi0JCQltZW51TWFuYWdlci5pbnNlcnRCZWZvcmUoSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5NQl9BRERJVElPTlMsCi0JCQkJCXJldXNlU3ViTWVudSk7Ci0JCX0KLQotCQlpZiAoYXV0b1N5bmNocm9uaXplLmlzRW5hYmxlZCgpKSB7Ci0JCQltZW51TWFuYWdlci5pbnNlcnRCZWZvcmUoSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5NQl9BRERJVElPTlMsCi0JCQkJCWF1dG9TeW5jaHJvbml6ZSk7Ci0JCX0KLQkJaWYgKG1hbnVhbFN5bmNocm9uaXplQWN0aW9uLmlzRW5hYmxlZCgpKSB7Ci0JCQltZW51TWFuYWdlci5pbnNlcnRCZWZvcmUoSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5NQl9BRERJVElPTlMsCi0JCQkJCW1hbnVhbFN5bmNocm9uaXplQWN0aW9uKTsKLQkJfQotCi0JCWlmICghKHNlbGVjdGVkRWxlbWVudCBpbnN0YW5jZW9mIE1pbGVzdG9uZSkpIHsKLQkJCS8vIE1lbnVNYW5hZ2VyIGRpYWdyYW1TdWJNZW51ID0gbmV3IE1lbnVNYW5hZ2VyKAotCQkJLy8gQXV0aG9yaW5nVUlSZXNvdXJjZXMuUHJvY2Vzc0VkaXRvcl9BY3Rpb25fRGlhZ3JhbXMpOwotCQkJaWYgKHNlbGVjdGVkQWN0aXZpdHkgIT0gbnVsbCkgewotCQkJCWlmIChzZWxlY3RlZEFjdGl2aXR5LmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSAhPSBudWxsKSB7Ci0JCQkJCW1lbnVNYW5hZ2VyLmFwcGVuZFRvR3JvdXAoIm9wZW4iLCBvcGVuQmFzZUFjdGl2aXR5KTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQotCQkJCS8vIGRpYWdyYW1TdWJNZW51LmFkZChvcGVuV29ya2Zsb3dFZGl0b3JBY3Rpb24pOwotCQkJCS8vIGRpYWdyYW1TdWJNZW51LmFkZChvcGVuV29ya2Zsb3dEZXRhaWxFZGl0b3JBY3Rpb24pOwotCQkJCS8vIGRpYWdyYW1TdWJNZW51LmFkZChvcGVuV1BEZXBlbmRlbmN5RWRpdG9yQWN0aW9uKTsKLQkJCQkvLyBkaWFncmFtU3ViTWVudS5hZGQoc3VwcHJlc3NEaWFncmFtQWN0aW9uKTsKLQkJCQkvLyBkaWFncmFtU3ViTWVudS5hZGQoYXNzaWduVXNlckRpYWdyYW0pOwotCQkJfQotCQkJLy8gaWYgKHNlbGVjdGVkQWN0aXZpdHkgPT0gZ2V0UHJvY2VzcygpKSB7Ci0JCQkvLyBkaWFncmFtU3ViTWVudS5hZGQoc3VwcHJlc3NBbGxEaWFncmFtcyk7Ci0JCQkvLyBkaWFncmFtU3ViTWVudS5hZGQocmV2ZWFsQWxsRGlhZ3JhbXMpOwotCQkJLy8gfQotCQkJLy8gRW5hYmxlIHRoaXMgY29kZSBpZiBBY3Rpdml0eURldGFpbERpYWdyYW1JbmZvRGlhbG9nIGlzIG5lZWQuCi0JCQkvLyBpZihzZWxlY3RlZEFjdGl2aXR5ICE9IG51bGwpewotCQkJLy8gZGlhZ3JhbVN1Yk1lbnUuYWRkKG5ldyBTZXBhcmF0b3IoKSk7Ci0JCQkvLyBkaWFncmFtU3ViTWVudS5hZGQoYWN0aXZpdHlEZXRhaWxEaWFncmFtSW5mbyk7Ci0JCQkvLyB9Ci0JCQkvLyBtZW51TWFuYWdlci5hcHBlbmRUb0dyb3VwKCJvcGVuIiwgZGlhZ3JhbVN1Yk1lbnUpOyAvLyROT04tTkxTLTEkCi0KLQkJCU1lbnVNYW5hZ2VyIG5ld0RpYWdyYW1TdWJNZW51ID0gbmV3IE1lbnVNYW5hZ2VyKAotCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5Qcm9jZXNzRWRpdG9yX0FjdGlvbl9EaWFncmFtcyk7IAotCQkJaWYgKHNlbGVjdGVkQWN0aXZpdHkgIT0gbnVsbCkgewotCQkJCW5ld0RpYWdyYW1TdWJNZW51LmFkZChuZXdBY3Rpdml0eURpYWdyYW1FZGl0b3IpOwotCQkJCW5ld0RpYWdyYW1TdWJNZW51LmFkZChuZXdBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0b3IpOwotCQkJCW5ld0RpYWdyYW1TdWJNZW51LmFkZChuZXdXUERpYWdyYW1FZGl0b3IpOwotCQkJCW5ld0RpYWdyYW1TdWJNZW51LmFkZChuZXdTdXBwcmVzc0RpYWdyYW1BY3Rpb24pOwotCQkJCW5ld0RpYWdyYW1TdWJNZW51LmFkZChuZXdBc3NpZ25Vc2VyRGlhZ3JhbSk7Ci0KLQkJCX0KLQotCQkJaWYgKHNlbGVjdGVkQWN0aXZpdHkgPT0gZ2V0UHJvY2VzcygpKSB7Ci0JCQkJbmV3RGlhZ3JhbVN1Yk1lbnUuYWRkKGRpYWdyYW1zUHVibGlzaEFsbCk7Ci0JCQkJbmV3RGlhZ3JhbVN1Yk1lbnUuYWRkKGRpYWdyYW1QdWJsaXNoTm9uZSk7Ci0JCQl9Ci0JCQltZW51TWFuYWdlci5hcHBlbmRUb0dyb3VwKCJvcGVuIiwgbmV3RGlhZ3JhbVN1Yk1lbnUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlpZiAoYnNJdGVtUHJvdmlkZXIgIT0gbnVsbAotCQkvLyB0aGlzIGlzIGFuIGV4cGVuc2l2ZSBjaGVjaywgcmVtb3ZlZCBpdAotCQkvLwotCQkvLyAmJiAoKElUcmVlSXRlbUNvbnRlbnRQcm92aWRlcikKLQkJLy8gYnNJdGVtUHJvdmlkZXIpLmhhc0NoaWxkcmVuKHNlbGVjdGVkT2JqZWN0KQotCQkpIHsKLQkJCW1lbnVNYW5hZ2VyLmFwcGVuZFRvR3JvdXAoIm9wZW4iLCBleHBhbmRBbGxBY3Rpb24pOyAvLyROT04tTkxTLTEkCi0JCQltZW51TWFuYWdlci5hcHBlbmRUb0dyb3VwKCJvcGVuIiwgY29sbGFwc2VBbGxBY3Rpb24pOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIFByb2Nlc3MgZ2V0UHJvY2VzcygpIHsKLQkJcmV0dXJuICgoUHJvY2Vzc0NvbXBvbmVudCkgKChNZXRob2RFbGVtZW50RWRpdG9ySW5wdXQpIGFjdGl2ZUVkaXRvcgotCQkJCS5nZXRFZGl0b3JJbnB1dCgpKS5nZXRNZXRob2RFbGVtZW50KCkpLmdldFByb2Nlc3MoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3VwcHJlc3Npb24gZ2V0U3VwcHJlc3Npb24oKSB7Ci0JCXJldHVybiAoKFByb2Nlc3NFZGl0b3IpIGFjdGl2ZUVkaXRvcikuc3VwcHJlc3Npb247Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZGVwb3B1bGF0ZUR5bmFtaWNNZW51SXRlbXMoKSB7Ci0JCS8vIFJlbW92ZSBhbnkgbWVudSBpdGVtcyBmb3Igb2xkIHNlbGVjdGlvbi4KLQkJLy8KLQkJaWYgKGNyZWF0ZUNoaWxkTWVudU1hbmFnZXIgIT0gbnVsbCkgewotCQkJZGVwb3B1bGF0ZU1hbmFnZXIoY3JlYXRlQ2hpbGRNZW51TWFuYWdlciwgY3JlYXRlQ2hpbGRBY3Rpb25zKTsKLQkJfQotCQlpZiAoY3JlYXRlU2libGluZ01lbnVNYW5hZ2VyICE9IG51bGwpIHsKLQkJCWRlcG9wdWxhdGVNYW5hZ2VyKGNyZWF0ZVNpYmxpbmdNZW51TWFuYWdlciwgY3JlYXRlU2libGluZ0FjdGlvbnMpOwotCQl9Ci0JCWNyZWF0ZUNoaWxkQWN0aW9ucyA9IG51bGw7Ci0JCWNyZWF0ZVNpYmxpbmdBY3Rpb25zID0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgYWN0aW9uIHN0YXRlIHRvIGVuYWJsZWQgb3IgZGlzYWJsZWQKLQkgKiAKLQkgKiBAcGFyYW0gbG9ja2VkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0QWN0aW9uU3RhdGUoKSB7Ci0JCWlmIChsb2NrZWQpIHsKLQkJCS8vIGRpc2FibGUgbW9kaWZ5aW5nIGFjdGlvbnMKLQkJCXBhc3RlQWN0aW9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJY3V0QWN0aW9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJZGVsZXRlQWN0aW9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCi0JCQlmb3IoSUFjdGlvbiBhY3Rpb24gOiByZWdpc3RlcmVkQWN0aW9ucykgewotCQkJCWlmKGFjdGlvbiBpbnN0YW5jZW9mIElNb2RpZnlpbmdBY3Rpb24pIHsKLQkJCQkJYWN0aW9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCX0KLQkJCX0KLQkJfSBlbHNlIGlmICghb2xkTG9ja2VkKSB7Ci0JCQkvLyB1cGRhdGUgc3RhdGUgb2YgbW9kaWZ5aW5nIGFjdGlvbnMKLQkJCS8vCi0JCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvblByb3ZpZGVyCi0JCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQkJCWN1dEFjdGlvbi5zZXRFbmFibGVkKGN1dEFjdGlvbi51cGRhdGVTZWxlY3Rpb24oc2VsZWN0aW9uKSk7Ci0JCQlwYXN0ZUFjdGlvbi5zZXRFbmFibGVkKHBhc3RlQWN0aW9uLnVwZGF0ZVNlbGVjdGlvbihzZWxlY3Rpb24pKTsKLQkJCWRlbGV0ZUFjdGlvbi5zZXRFbmFibGVkKGRlbGV0ZUFjdGlvbi51cGRhdGVTZWxlY3Rpb24oc2VsZWN0aW9uKSk7Ci0JCQkKLQkJCWZvcihJQWN0aW9uIGFjdGlvbiA6IHJlZ2lzdGVyZWRBY3Rpb25zKSB7Ci0JCQkJaWYoYWN0aW9uIGluc3RhbmNlb2YgSU1vZGlmeWluZ0FjdGlvbikgewotCQkJCQlhY3Rpb24uc2V0RW5hYmxlZChhY3Rpb24gaW5zdGFuY2VvZiBDb21tYW5kQWN0aW9uSGFuZGxlciA/IAotCQkJCQkJCSgoQ29tbWFuZEFjdGlvbkhhbmRsZXIpYWN0aW9uKS51cGRhdGVTZWxlY3Rpb24oc2VsZWN0aW9uKSA6IHRydWUpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWJvb2xlYW4gZW5hYmxlZCA9ICFsb2NrZWQ7Ci0KLQkJYWRkQWN0aW9uLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0JCWNvbnRyaWJ1dGVBY3Rpb24uc2V0RW5hYmxlZChlbmFibGVkKTsKLQotCQkvLyBzdGF0ZSBvZiB0aGVzZSBhY3Rpb25zIGlzIHNldCBpbiB1cGRhdGVBY3Rpb25zKCkKLQkJLy8KLQkJLy8gbW92ZURvd25BY3Rpb24uc2V0RW5hYmxlZChlbmFibGVkKTsKLQkJLy8gbW92ZVVwQWN0aW9uLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0JCS8vIHJldmVhbEFjdGlvbi5zZXRFbmFibGVkKGVuYWJsZWQpOwotCQkvLyBzdXBwcmVzc0FjdGlvbi5zZXRFbmFibGVkKGVuYWJsZWQpOwotCQlyZXBsYWNlQWN0aW9uLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0JCWxvY2FsUmVwbGFjZW1lbnRBbmREZWVwQ29weS5zZXRFbmFibGVkKGVuYWJsZWQpOwotCQlyZXZlYWxBbGxEaWFncmFtcy5zZXRFbmFibGVkKGVuYWJsZWQpOwotCQlzdXBwcmVzc0FsbERpYWdyYW1zLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0JCXN1cHByZXNzRGlhZ3JhbUFjdGlvbi5zZXRFbmFibGVkKGVuYWJsZWQpOwotCQljb3B5QWN0aXZpdHlBY3Rpb24uc2V0RW5hYmxlZChlbmFibGVkKTsKLQkJZXh0ZW5kQWN0aXZpdHlBY3Rpb24uc2V0RW5hYmxlZChlbmFibGVkKTsKLQkJZGVlcENvcHlBY3Rpdml0eUFjdGlvbi5zZXRFbmFibGVkKGVuYWJsZWQpOwotCX0KLQotCXByb3RlY3RlZCBDb2xsZWN0aW9uIGdlbmVyYXRlQ3JlYXRlQ2hpbGRBY3Rpb25zKENvbGxlY3Rpb24gZGVzY3JpcHRvcnMsCi0JCQlJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlpZiAobG9ja2VkKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2VuZXJhdGVDcmVhdGVDaGlsZEFjdGlvbnMoZGVzY3JpcHRvcnMsIHNlbGVjdGlvbik7Ci0JfQotCi0JcHJvdGVjdGVkIENvbGxlY3Rpb24gZ2VuZXJhdGVDcmVhdGVTaWJsaW5nQWN0aW9ucyhDb2xsZWN0aW9uIGRlc2NyaXB0b3JzLAotCQkJSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJaWYgKGxvY2tlZCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdlbmVyYXRlQ3JlYXRlU2libGluZ0FjdGlvbnMoZGVzY3JpcHRvcnMsIHNlbGVjdGlvbik7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnMuTWV0aG9kTGlicmFyeUFjdGlvbkJhckNvbnRyaWJ1dG9yI3NlbGVjdGlvbkNoYW5nZWQob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJSVNlbGVjdGlvbiBzZWwgPSBldmVudC5nZXRTZWxlY3Rpb24oKTsKLQkJaWYgKHNlbCBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7Ci0JCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzdHJ1Y3R1cmVkU2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWw7Ci0JCQlvbGRMb2NrZWQgPSBsb2NrZWQ7Ci0JCQlsb2NrZWQgPSBWaWV3SGVscGVyLmlzTG9ja2VkKHN0cnVjdHVyZWRTZWxlY3Rpb24pOwotCi0JCQlzZWxlY3Rpb24gPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWwpLnRvTGlzdCgpOwotCQkJaWYgKHNlbGVjdGlvbi5zaXplKCkgPT0gMSkgewotCQkJCXNlbGVjdGVkT2JqZWN0ID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsKS5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCQlPYmplY3Qgb2JqID0gVG5nVXRpbC51bndyYXAoc2VsZWN0ZWRPYmplY3QpOwotCQkJCXN1cGVyLnNlbGVjdGlvbkNoYW5nZWQoZXZlbnQpOwotCQkJCXNlbGVjdGVkRWxlbWVudCA9IG9iajsKLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQkJc2VsZWN0ZWRBY3Rpdml0eSA9IChBY3Rpdml0eSkgb2JqOwotCQkJCX0gZWxzZSB7Ci0JCQkJCS8vIGRlcG9wdWxhdGVEeW5hbWljTWVudUl0ZW1zKCk7Ci0JCQkJCS8vIGJzSXRlbVByb3ZpZGVyID0gbnVsbDsKLQkJCQkJc2VsZWN0ZWRBY3Rpdml0eSA9IG51bGw7Ci0JCQkJfQotCQkJCUFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbiBkb21haW4gPSAoQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluKSAoKElFZGl0aW5nRG9tYWluUHJvdmlkZXIpIGFjdGl2ZUVkaXRvcikKLQkJCQkJCS5nZXRFZGl0aW5nRG9tYWluKCk7Ci0JCQkJT2JqZWN0IHByb3ZpZGVyT2JqID0gZG9tYWluLmdldEFkYXB0ZXJGYWN0b3J5KCkuYWRhcHQoCi0JCQkJCQlzZWxlY3RlZE9iamVjdCwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCQlpZiAocHJvdmlkZXJPYmogaW5zdGFuY2VvZiBJQlNJdGVtUHJvdmlkZXIpCi0JCQkJCWJzSXRlbVByb3ZpZGVyID0gKElCU0l0ZW1Qcm92aWRlcikgcHJvdmlkZXJPYmo7Ci0KLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudCkgewotCQkJCQlzZWxlY3RlZEJyZWFrZG93bkVsZW1lbnQgPSAoQnJlYWtkb3duRWxlbWVudCkgb2JqOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXNlbGVjdGVkQnJlYWtkb3duRWxlbWVudCA9IG51bGw7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlkZXBvcHVsYXRlRHluYW1pY01lbnVJdGVtcygpOwotCQkJCWJzSXRlbVByb3ZpZGVyID0gbnVsbDsKLQkJCQlzZWxlY3RlZEVsZW1lbnQgPSBudWxsOwotCQkJCXNlbGVjdGVkQWN0aXZpdHkgPSBudWxsOwotCQkJCXNlbGVjdGVkQnJlYWtkb3duRWxlbWVudCA9IG51bGw7Ci0JCQkJc2VsZWN0ZWRPYmplY3QgPSBudWxsOwotCQkJfQotCi0JCQl1cGRhdGVBY3Rpb25zKCk7Ci0KLQkJfSBlbHNlIHsKLQkJCWRlcG9wdWxhdGVEeW5hbWljTWVudUl0ZW1zKCk7Ci0JCQlic0l0ZW1Qcm92aWRlciA9IG51bGw7Ci0JCQlzZWxlY3RlZEVsZW1lbnQgPSBudWxsOwotCQkJc2VsZWN0ZWRBY3Rpdml0eSA9IG51bGw7Ci0JCQlzZWxlY3RlZEJyZWFrZG93bkVsZW1lbnQgPSBudWxsOwotCQl9Ci0KLQkJLy8gLy8gdGVzdCBjb2RlCi0JCS8vIC8vCi0JCS8vIGlmKHNlbGVjdGVkQWN0aXZpdHkgIT0gbnVsbCkgewotCQkvLyBmb3IgKEl0ZXJhdG9yIGl0ZXIgPQotCQkvLyBzZWxlY3RlZEFjdGl2aXR5LmVDbGFzcygpLmdldEVBbGxBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKTsKLQkJLy8gaXRlci5oYXNOZXh0KCk7KSB7Ci0JCS8vIEVBdHRyaWJ1dGUgYXR0cmliID0gKEVBdHRyaWJ1dGUpIGl0ZXIubmV4dCgpOwotCQkvLyBpZihTdHJpbmcuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShhdHRyaWIuZ2V0RUF0dHJpYnV0ZVR5cGUoKS5nZXRJbnN0YW5jZUNsYXNzKCkpKQotCQkvLyB7Ci0JCS8vIExpc3QgdmFsdWVzID0KLQkJLy8gQ29uZmlndXJhdGlvbkhlbHBlci5nZXRTdHJpbmdBdHRyaWJ1dGUoc2VsZWN0ZWRBY3Rpdml0eSwgYXR0cmliKTsKLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCk7Ci0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbihhdHRyaWIuZ2V0TmFtZSgpICsgIjogIiArIHZhbHVlcyk7Ci0JCS8vIH0KLQkJLy8gfQotCQkvLyB9Ci0JfQotCi0JLyoqCi0JICogVXBkYXRlcyBhY3Rpb25zIGluY2x1ZGluZyBlbmFibGluZy9kaXNhYmxpbmcgdGhlbSBiYXNlZCBvbiBzZWxlY3Rpb24KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVBY3Rpb25zKCkgewotCQlzaG93SW5MaWJyYXJ5VmlldwotCQkJCS5zZXRFbmFibGVkKHNlbGVjdGVkQnJlYWtkb3duRWxlbWVudCBpbnN0YW5jZW9mIERlc2NyaXB0b3IKLQkJCQkJCSYmIFByb2Nlc3NVdGlsCi0JCQkJCQkJCS5nZXRBc3NvY2lhdGVkRWxlbWVudCgoRGVzY3JpcHRvcikgc2VsZWN0ZWRCcmVha2Rvd25FbGVtZW50KSAhPSBudWxsKTsKLQotCQlpZiAoIWxvY2tlZCAmJiBzZWxlY3Rpb24gIT0gbnVsbCAmJiAhc2VsZWN0aW9uLmlzRW1wdHkoKSkgewotCQkJaWYgKHNlbGVjdGlvbi5zaXplKCkgPT0gMSkgewkJCQkKLQkJCQlPYmplY3QgbyA9IHNlbGVjdGlvbi5nZXQoMCk7Ci0JCQkJQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkgPSBnZXRBZGFwdGVyRmFjdG9yeSgpOwotCQkJCWlmKFByb2Nlc3NVdGlsLmlzUm9sbGVkVXBEZXNjcmlwdG9yKG8sIGFkYXB0ZXJGYWN0b3J5KSkgewotCQkJCQlyZXZlYWxBY3Rpb24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJCXN1cHByZXNzQWN0aW9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJaWYgKGdldFN1cHByZXNzaW9uKCkuY2FuUmV2ZWFsKHNlbGVjdGlvbikpIHsKLQkJCQkJCXJldmVhbEFjdGlvbi5zZXRFbmFibGVkKHRydWUpOwotCQkJCQkJc3VwcHJlc3NBY3Rpb24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJCX0gZWxzZSBpZiAoZ2V0U3VwcHJlc3Npb24oKS5jYW5TdXBwcmVzcyhzZWxlY3Rpb24pKSB7Ci0JCQkJCQlzdXBwcmVzc0FjdGlvbi5zZXRFbmFibGVkKHRydWUpOwotCQkJCQkJcmV2ZWFsQWN0aW9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJcmV2ZWFsQWN0aW9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCQkJc3VwcHJlc3NBY3Rpb24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCXJldmVhbEFjdGlvbi5zZXRFbmFibGVkKGdldFN1cHByZXNzaW9uKCkuY2FuUmV2ZWFsKHNlbGVjdGlvbikpOwotCQkJCXN1cHByZXNzQWN0aW9uLnNldEVuYWJsZWQoZ2V0U3VwcHJlc3Npb24oKS5jYW5TdXBwcmVzcygKLQkJCQkJCXNlbGVjdGlvbikpOwotCQkJfQotCi0JCQkvLyBBY3Rpb24gRW5hYmxlL0Rpc2FibGUgZm9yIFN1cHByZXNzIFRhc2svUmV2ZWFsIFRhc2sgY29udGV4dCBtZW51Ci0JCQlib29sZWFuIHNob3cgPSB0cnVlOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzZWxlY3Rpb24uc2l6ZSgpOyBpKyspIHsKLQkJCQlpZiAoZ2V0QWRhcHRlckZhY3RvcnkoKSA9PSBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkJLmdldFdCU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpIHsKLQotCQkJCQlpZiAoIShzZWxlY3Rpb24uZ2V0KGkpIGluc3RhbmNlb2YgQWN0aXZpdHkgfHwgc2VsZWN0aW9uCi0JCQkJCQkJLmdldChpKSBpbnN0YW5jZW9mIEFjdGl2aXR5V3JhcHBlckl0ZW1Qcm92aWRlcikpIHsKLQkJCQkJCXNob3cgPSBmYWxzZTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfSBlbHNlCi0JCQkJCXNob3cgPSBmYWxzZTsKLQkJCX0KLQkJCWlmIChzaG93KSB7Ci0JCQkJTGlzdCB0YXNrRGVzY3JpcHRvcnMgPSBQcm9jZXNzVXRpbAotCQkJCQkJLmdldFRhc2tEZXNjcmlwdG9ycyhzZWxlY3Rpb24pOwotCQkJCXN1cHByZXNzVGFza0FjdGlvbi5zZXRFbmFibGVkKGdldFN1cHByZXNzaW9uKCkuY2FuU3VwcHJlc3MoCi0JCQkJCQl0YXNrRGVzY3JpcHRvcnMpKTsKLQkJCQlyZXZlYWxUYXNrQWN0aW9uLnNldEVuYWJsZWQoZ2V0U3VwcHJlc3Npb24oKS5jYW5SZXZlYWwoCi0JCQkJCQl0YXNrRGVzY3JpcHRvcnMpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJc3VwcHJlc3NUYXNrQWN0aW9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCXJldmVhbFRhc2tBY3Rpb24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQl9Ci0KLQkJCS8vIGJvb2xlYW4gaGFzSW5oZXJpdGVkID0gZmFsc2U7Ci0JCQkvLyBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBzZWxlY3Rpb24uaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkvLyBPYmplY3QgaXRlbSA9IGl0ZXIubmV4dCgpOwotCQkJLy8gaWYgKGl0ZW0gaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcgotCQkJLy8gJiYgKChCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgaXRlbSkKLQkJCS8vIC5pc1JlYWRPbmx5KCkpIHsKLQkJCS8vIGhhc0luaGVyaXRlZCA9IHRydWU7Ci0JCQkvLyBicmVhazsKLQkJCS8vIH0KLQkJCS8vIH0KLQkJCS8vIHVwZGF0ZVN1cHByZXNzaW9uRnJvbUJhc2VBY3Rpb24uc2V0RW5hYmxlZChoYXNJbmhlcml0ZWQpOwotCQl9IGVsc2UgewotCQkJcmV2ZWFsQWN0aW9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJc3VwcHJlc3NBY3Rpb24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQlzdXBwcmVzc1Rhc2tBY3Rpb24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQlyZXZlYWxUYXNrQWN0aW9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQl9Ci0KLQkJLy8gU2V0IEFjdGl2aXR5IERldGFpbCBEaWFncmFtIEFjdGlvbiBlbmFibGUgc3RhdGUuCi0JCWlmIChzZWxlY3RlZE9iamVjdCBpbnN0YW5jZW9mIEFjdGl2aXR5Ci0JCQkJfHwgc2VsZWN0ZWRPYmplY3QgaW5zdGFuY2VvZiBBY3Rpdml0eVdyYXBwZXJJdGVtUHJvdmlkZXIpIHsKLS8vCQkJc2V0QWN0aW9uU3RhdGVGb3JBREQoKTsKLQkJCXNldERpYWdyYW1zQ29udGV4dE1lbnVTdGF0ZSgpOwotCQl9Ci0KLQkJLy8gY2hhbmdlIGFjdGlvbiBzdGF0ZSBmb3IgbG9ja2VkIHBsdWdpbgotCQlzZXRBY3Rpb25TdGF0ZSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEFjdGl2ZVBhZ2UoSUVkaXRvclBhcnQgcGFydCkgewotCQlpZiAodGhpcy5hY3RpdmVFZGl0b3IgIT0gbnVsbCkgewotCQkJaW50IHBhZ2UgPSAoKFByb2Nlc3NFZGl0b3IpIHRoaXMuYWN0aXZlRWRpdG9yKS5nZXRBY3RpdmVQYWdlKCk7Ci0JCQlJQWN0aW9uQmFycyBhY3Rpb25CYXJzID0gdGhpcy5hY3RpdmVFZGl0b3IuZ2V0RWRpdG9yU2l0ZSgpCi0JCQkJCS5nZXRBY3Rpb25CYXJzKCk7Ci0KLQkJCS8vIFRPRE8gLSBuZWVkIHRvIGdldCBJRm9ybVBhZ2UgYW5kIGNvbXBhcmUgb24gdGhhdCByYXRoZXIgdGhhbgotCQkJLy8gaW50ZWdlciBwYWdlIGlkLiBUaGVzZSBpZCB3aWxsIGNoYW5nZSBpZiB3ZSByZXBvc2l0aW9uIHBhZ2VzLgotCQkJaWYgKHBhZ2UgPT0gMCkgewkJCQotCQkJCWFjdGlvbkJhcnMuc2V0R2xvYmFsQWN0aW9uSGFuZGxlcihBY3Rpb25GYWN0b3J5LkRFTEVURS5nZXRJZCgpLAotCQkJCQkJbnVsbCk7Ci0JCQkJYWN0aW9uQmFycy5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKEFjdGlvbkZhY3RvcnkuQ1VULmdldElkKCksCi0JCQkJCQludWxsKTsKLQkJCQlhY3Rpb25CYXJzLnNldEdsb2JhbEFjdGlvbkhhbmRsZXIoQWN0aW9uRmFjdG9yeS5DT1BZLmdldElkKCksCi0JCQkJCQludWxsKTsKLQkJCQlhY3Rpb25CYXJzLnNldEdsb2JhbEFjdGlvbkhhbmRsZXIoQWN0aW9uRmFjdG9yeS5QQVNURS5nZXRJZCgpLAotCQkJCQkJbnVsbCk7Ci0JCQkJYWN0aW9uQmFycy5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKEFjdGlvbkZhY3RvcnkuVU5ETy5nZXRJZCgpLAotCQkJCQkJbnVsbCk7Ci0JCQkJYWN0aW9uQmFycy5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKEFjdGlvbkZhY3RvcnkuUkVETy5nZXRJZCgpLAotCQkJCQkJbnVsbCk7Ci0JCQl9IGVsc2UgaWYgKHBhZ2UgPT0gNCkgewotCQkJCWFjdGlvbkJhcnMuY2xlYXJHbG9iYWxBY3Rpb25IYW5kbGVycygpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJYWN0aW9uQmFycy5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKEFjdGlvbkZhY3RvcnkuREVMRVRFLmdldElkKCksCi0JCQkJCQlkZWxldGVBY3Rpb24pOwotCQkJCWFjdGlvbkJhcnMuc2V0R2xvYmFsQWN0aW9uSGFuZGxlcihBY3Rpb25GYWN0b3J5LkNVVC5nZXRJZCgpLAotCQkJCQkJY3V0QWN0aW9uKTsKLQkJCQlhY3Rpb25CYXJzLnNldEdsb2JhbEFjdGlvbkhhbmRsZXIoQWN0aW9uRmFjdG9yeS5DT1BZLmdldElkKCksCi0JCQkJCQljb3B5QWN0aW9uKTsKLQkJCQlhY3Rpb25CYXJzLnNldEdsb2JhbEFjdGlvbkhhbmRsZXIoQWN0aW9uRmFjdG9yeS5QQVNURS5nZXRJZCgpLAotCQkJCQkJcGFzdGVBY3Rpb24pOwotCQkJCWFjdGlvbkJhcnMuc2V0R2xvYmFsQWN0aW9uSGFuZGxlcihBY3Rpb25GYWN0b3J5LlVORE8uZ2V0SWQoKSwKLQkJCQkJCXVuZG9BY3Rpb24pOwotCQkJCWFjdGlvbkJhcnMuc2V0R2xvYmFsQWN0aW9uSGFuZGxlcihBY3Rpb25GYWN0b3J5LlJFRE8uZ2V0SWQoKSwKLQkJCQkJCXJlZG9BY3Rpb24pOwotCQkJfQotCQkJYWN0aW9uQmFycy51cGRhdGVBY3Rpb25CYXJzKCk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHN1cGVyRG9SZWZyZXNoKCkgewotCQlzdXBlci5kb1JlZnJlc2goKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBkb1JlZnJlc2goKSB7Ci0JCWlmIChhY3RpdmVFZGl0b3IgaW5zdGFuY2VvZiBJVmlld2VyUHJvdmlkZXIpIHsKLQkJCURpc3BsYXkgZGlzcGxheSA9IGFjdGl2ZUVkaXRvci5nZXRFZGl0b3JTaXRlKCkuZ2V0U2hlbGwoKS5nZXREaXNwbGF5KCk7Ci0JCQlCdXN5SW5kaWNhdG9yLnNob3dXaGlsZShkaXNwbGF5LCBuZXcgUnVubmFibGUoKSB7Ci0KLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCS8vIHVwZGF0ZSBJRHMKLQkJCQkJLy8KLQkJCQkJQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkgPSBnZXRBZGFwdGVyRmFjdG9yeSgpOwotCQkJCQlpZiAoYWRhcHRlckZhY3RvcnkgPT0gVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJCQkuZ2V0V0JTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKQotCQkJCQkJCXx8IGFkYXB0ZXJGYWN0b3J5ID09IFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkJCQkuZ2V0UHJvY2Vzc0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSkgewotCQkJCQkJUHJvY2VzcyBwcm9jID0gZ2V0UHJvY2VzcygpOwotCQkJCQkJUHJvY2Vzc1V0aWwudXBkYXRlSURzKGFkYXB0ZXJGYWN0b3J5LCBwcm9jKTsKLS8vCQkJCQkJbG9uZyB0aW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCQkJCQlQcm9jZXNzVXRpbC5yZWZyZXNoUHJlZGVjY2Vzc29yTGlzdHMoYWRhcHRlckZhY3RvcnksIHByb2MpOwotLy8JCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oInJlZnJlc2hQcmVkZWNjZXNzb3JMaXN0cygpIHRvb2s6ICIgKyAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSB0aW1lKSk7Ci0JCQkJCX0KLQotCQkJCQlzdXBlckRvUmVmcmVzaCgpOwotCQkJCX0KLQkJCQkKLQkJCX0pOwotCQl9Ci0KLQl9Ci0KLQkvKgotCSAqIFNldCBBY3Rpb24gc3RhdGUgZm9yIEFjdGl2aXR5IERldGFpbCBEaWFncmFtIGluIENvbnRleHQgTWVudSBvbiBzZWxlY3Rpb24KLQkgKiBvZiBBY3Rpdml0eS4gSWYgYW4gQWN0aXZpdHkgY29uc2lzdCBhdGxlYXN0IG9uZSB0YXNrZGVzY3JpcHRvciBhbmQgaXRzCi0JICogcHJpbWFyeSBwZXJmb3JtZXIgaW4gY3VycmVudCBjb25maWd1cmF0aW9uLCB0aGVuIHN0YXRlIGlzIGVuYWJsZWQgZWxzZQotCSAqIHN0YXRlIGlzIGRpc2FibGVkIGluIGNvbnRleHQgbWVudSAocHJvY2VzcyBlZGl0b3IpLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldEFjdGlvblN0YXRlRm9yQUREKCkgewotCi0JCS8vIHNldCBBREQgQWN0aW9uIHN0YXRlIGZhbHNlCi0JCW9wZW5Xb3JrZmxvd0RldGFpbEVkaXRvckFjdGlvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQotCQkvLyBzZXQgQUQgQWN0aW9uIHN0YXRlIHRydWUgYWx3YXlzCi0JCW9wZW5Xb3JrZmxvd0VkaXRvckFjdGlvbi5zZXRFbmFibGVkKHRydWUpOwotCi0JCS8vIHNldCBXUEQgRGlhZ3JhbSBNZW51IEFjdGlvbiBzdGF0ZSB0cnUgYWx3YXlzCi0JCW9wZW5XUERlcGVuZGVuY3lFZGl0b3JBY3Rpb24uc2V0RW5hYmxlZCh0cnVlKTsKLQotCQlpZiAoc2VsZWN0ZWRPYmplY3QgIT0gbnVsbCkgewotCi0JCQlpZiAoZ2V0U3VwcHJlc3Npb24oKS5pc1N1cHByZXNzZWQoc2VsZWN0ZWRPYmplY3QpKSB7Ci0JCQkJb3BlbldvcmtmbG93RGV0YWlsRWRpdG9yQWN0aW9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCW9wZW5Xb3JrZmxvd0VkaXRvckFjdGlvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQlvcGVuV1BEZXBlbmRlbmN5RWRpdG9yQWN0aW9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCXJldHVybjsKLQkJCX0KLQotCQkJQWN0aXZpdHkgYWN0aXZpdHkgPSBudWxsOwotCQkJTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCQlpZiAoc2VsZWN0ZWRPYmplY3QgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCWFjdGl2aXR5ID0gc2VsZWN0ZWRBY3Rpdml0eTsKLQkJCX0gZWxzZSBpZiAoc2VsZWN0ZWRPYmplY3QgaW5zdGFuY2VvZiBBY3Rpdml0eVdyYXBwZXJJdGVtUHJvdmlkZXIpIHsKLQkJCQlhY3Rpdml0eSA9IChBY3Rpdml0eSkgKChBY3Rpdml0eVdyYXBwZXJJdGVtUHJvdmlkZXIpIHNlbGVjdGVkT2JqZWN0KQotCQkJCQkJLmdldFZhbHVlKCk7Ci0JCQl9Ci0JCQlpZiAoYWN0aXZpdHkgPT0gbnVsbCkKLQkJCQlyZXR1cm47Ci0KLQkJCXdoaWxlICghYWN0aXZpdHkuZ2V0VmFyaWFiaWxpdHlUeXBlKCkuZXF1YWxzKAotCQkJCQlWYXJpYWJpbGl0eVR5cGUuTkEpKSB7Ci0KLQkJCQlWYXJpYWJpbGl0eUVsZW1lbnQgdmUgPSBhY3Rpdml0eS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCk7Ci0JCQkJLy8gSWYgQWN0aXZpdHkgaXMgc2V0IHRvIGxvY2FsIGNvbnRyaWJ1dGlvbiwKLQkJCQkvLyBuZWVkIHRvIGdldCBicmVha2Rvd24gZWxlbWVudHMgb2YgbG9jYWwgY29udHJpYnV0ZWQKLQkJCQkvLyBhY3Rpdml0eSArIGJhc2UgYWN0aXZpdHkuIEFuZCBiYXNlIGFjdGl2aXR5IGJyZWFrZG93bgotCQkJCS8vIGVsZW1lbnRzCi0JCQkJLy8gYXJlIGNvbGxlY3RlZCBhZnRlciB3aGlsZSBsb29wIGVuZHMpCi0JCQkJLy8gaWYgKFZhcmlhYmlsaXR5VHlwZS5DT05UUklCVVRFU19MSVRFUkFMLmVxdWFscyhhY3Rpdml0eQotCQkJCS8vIC5nZXRWYXJpYWJpbGl0eVR5cGUoKSkpIHsKLQkJCQkvLyBsaXN0LmFkZEFsbChhY3Rpdml0eS5nZXRCcmVha2Rvd25FbGVtZW50cygpKTsKLQkJCQkvLyB9Ci0JCQkJbGlzdC5hZGRBbGwoYWN0aXZpdHkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKSk7Ci0KLQkJCQlpZiAoKHZlICE9IG51bGwpICYmICh2ZSBpbnN0YW5jZW9mIEFjdGl2aXR5KSkgewotCQkJCQlhY3Rpdml0eSA9IChBY3Rpdml0eSkgdmU7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCi0JCQkvLyBGb3IgQUQgZGlhZ3JhbSBtZW51IG9wdGlvbiwgaWYgQmFzZSBBY3Rpdml0eSBkb25vdCBoYXZlIGFueQotCQkJLy8gQUQgZGlhZ3JhbSwgZG9ub3Qgc2hvdyBBRCBkaWFncmFtIG9wdGlvbiBpbiBjb250ZXh0IG1lbnUgZm9yCi0JCQkvLyByZWFkb25seSBhY3Rpdml0eS4KLQkJCURpYWdyYW0gZGlhZ3JhbSA9IEdyYXBoaWNhbERhdGFNYW5hZ2VyLmdldEluc3RhbmNlKCkuZ2V0VU1BRGlhZ3JhbSgKLQkJCQkJYWN0aXZpdHksIEdyYXBoaWNhbERhdGFIZWxwZXIuQUNUSVZJVFlfRElBR1JBTSwgZmFsc2UpOwotCQkJaWYgKGRpYWdyYW0gPT0gbnVsbAotCQkJCQkmJiBzZWxlY3RlZE9iamVjdCBpbnN0YW5jZW9mIEFjdGl2aXR5V3JhcHBlckl0ZW1Qcm92aWRlcikgewotCQkJCW9wZW5Xb3JrZmxvd0VkaXRvckFjdGlvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCX0KLQotCQkJLy8gRm9yIFdQRCBkaWFncmFtIG1lbnUgb3B0aW9uLCBpZiBCYXNlIEFjdGl2aXR5IGRvbm90IGhhdmUgYW55Ci0JCQkvLyBXUEQgZGlhZ3JhbSwgZG9ub3Qgc2hvdyBXUEQgZGlhZ3JhbSBvcHRpb24gaW4gY29udGV4dCBtZW51Ci0JCQkvLyBmb3IgcmVhZG9ubHkgYWN0aXZpdHkuCi0JCQlkaWFncmFtID0gR3JhcGhpY2FsRGF0YU1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5nZXRVTUFEaWFncmFtKAotCQkJCQlhY3Rpdml0eSwKLQkJCQkJR3JhcGhpY2FsRGF0YUhlbHBlci5XT1JLX1BST0RVQ1RfREVQRU5ERU5DWV9ESUFHUkFNLCBmYWxzZSk7Ci0JCQlpZiAoZGlhZ3JhbSA9PSBudWxsCi0JCQkJCSYmIHNlbGVjdGVkT2JqZWN0IGluc3RhbmNlb2YgQWN0aXZpdHlXcmFwcGVySXRlbVByb3ZpZGVyKSB7Ci0JCQkJb3BlbldQRGVwZW5kZW5jeUVkaXRvckFjdGlvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCX0KLQotCQkJLy8gQ29sbGVjdCB0aGUgYnJlYWtkb3duIGVsZW1lbnRzIHRvIHZlcmlmdHkgdGFza2Rlc2NyaXB0b3JzIGFyZQotCQkJLy8gbm90LgotCQkJbGlzdC5hZGRBbGwoYWN0aXZpdHkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKSk7Ci0KLQkJCS8vIEZvciBBREQgZGlhZ3JhbSBtZW51IG9wdGlvbiwgaWYgQmFzZSBBY3Rpdml0eSBkb25vdCBoYXZlIGFueQotCQkJLy8gQUREIGRpYWdyYW0sIGRvbm90IHNob3cgQUREIGRpYWdyYW0gb3B0aW9uIGluIGNvbnRleHQgbWVudQotCQkJLy8gZm9yCi0JCQkvLyByZWFkb25seSBhY3Rpdml0eS4KLQkJCWRpYWdyYW0gPSBHcmFwaGljYWxEYXRhTWFuYWdlci5nZXRJbnN0YW5jZSgpLmdldFVNQURpYWdyYW0oCi0JCQkJCWFjdGl2aXR5LCBHcmFwaGljYWxEYXRhSGVscGVyLkFDVElWSVRZX0RFVEFJTF9ESUFHUkFNLAotCQkJCQlmYWxzZSk7Ci0JCQlpZiAoZGlhZ3JhbSA9PSBudWxsCi0JCQkJCSYmIHNlbGVjdGVkT2JqZWN0IGluc3RhbmNlb2YgQWN0aXZpdHlXcmFwcGVySXRlbVByb3ZpZGVyKSB7Ci0JCQkJb3BlbldvcmtmbG93RGV0YWlsRWRpdG9yQWN0aW9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJfSBlbHNlIHsKLQkJCQkvLyBJdGVyYXRlIHRocm91Z2ggdGhlIExpc3QsIHRvIGZpbmQgdGFza2Rlc2NyaXB0b3IgYW5kIGhhcwotCQkJCS8vIHByaW1hcnkgcm9sZSB3aXRoaW4gY3VycmVudCBjb25maWd1cmF0aW9uLgotCQkJCS8vIHRoZW4gZW5hYmxlIHRoZSBhY3Rpb24uCi0JCQkJZmluZFJvbGVEZXNjOgotCQkJCWZvciAoSXRlcmF0b3I8Pz4gaXRlcmF0b3IgPSBsaXN0Lml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCQkJT2JqZWN0IG9iaiA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFRhc2tEZXNjcmlwdG9yKSB7Ci0JCQkJCQlpZiAoIWdldFN1cHByZXNzaW9uKCkuaXNTdXBwcmVzc2VkKG9iaikpIHsKLQkJCQkJCQlMaXN0PFJvbGVEZXNjcmlwdG9yPiBwcmltYXJ5UGVyZm9ybWVycyA9ICgoVGFza0Rlc2NyaXB0b3IpIG9iaikKLQkJCQkJCQkJCS5nZXRQZXJmb3JtZWRQcmltYXJpbHlCeSgpOwotCQkJCQkJCUFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbiBkb21haW4gPSAoQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluKSAoKElFZGl0aW5nRG9tYWluUHJvdmlkZXIpIGFjdGl2ZUVkaXRvcikKLQkJCQkJCQkJCS5nZXRFZGl0aW5nRG9tYWluKCk7Ci0JCQkJCQkJQWRhcHRlckZhY3RvcnkgZmFjdG9yeSA9IGRvbWFpbi5nZXRBZGFwdGVyRmFjdG9yeSgpOwotCQkJCQkJCWlmIChmYWN0b3J5IGluc3RhbmNlb2YgRXhwb3NlZEFkYXB0ZXJGYWN0b3J5KSB7Ci0JCQkJCQkJCUlGaWx0ZXIgZmlsdGVyID0gKChFeHBvc2VkQWRhcHRlckZhY3RvcnkpIGZhY3RvcnkpCi0JCQkJCQkJCQkJLmdldEZpbHRlcigpOwotCQkJCQkJCQlmb3IgKFJvbGVEZXNjcmlwdG9yIGUgOiBwcmltYXJ5UGVyZm9ybWVycykgewotCQkJCQkJCQkJaWYgKGZpbHRlciAhPSBudWxsICYmIGZpbHRlci5hY2NlcHQoZSkKLQkJCQkJCQkJCQkJJiYgIWdldFN1cHByZXNzaW9uKCkuaXNTdXBwcmVzc2VkKGUpKSB7Ci0JCQkJCQkJCQkJb3BlbldvcmtmbG93RGV0YWlsRWRpdG9yQWN0aW9uCi0JCQkJCQkJCQkJCQkuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQkJCQkJCQlicmVhayBmaW5kUm9sZURlc2M7Ci0JCQkJCQkJCQl9CQkJCQkJCQkJCi0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIFNldCBBY3Rpb24gc3RhdGUgZm9yIE9wZW4gRGlhZ3JhbSBBY3Rpb25zIGluIENvbnRleHQgTWVudSBvbgotCSAqIHNlbGVjdGlvbiBvZiBBY3Rpdml0eS4gQ2hlY2tpbmcgY29uZGl0aW9uIHRvIGhhbmRsZSBpZiBhY3Rpdml0eSBzdXBwcmVzc2VkLCBpZiBhY3Rpdml0eSBkb24ndCBoYXZlCi0JICogYW55IHRhc2tkZXNjcmlwdG9yIGFuZCBwcmltYXJ5IHBlcmZvcm1lciwgaWYgYmFzZSBhY3Rpdml0eSBkb24ndCBoYXZlIGRpYWdyYW0uIAotCSAqLwotCXByaXZhdGUgdm9pZCBzZXREaWFncmFtc0NvbnRleHRNZW51U3RhdGUoKSB7Ci0KLQkJLy8gc2V0IEFERCBBY3Rpb24gc3RhdGUgZmFsc2UKLQkJbmV3QWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9yLnNldEVuYWJsZWQoZmFsc2UpOwotCi0JCS8vIHNldCBBRCBBY3Rpb24gc3RhdGUgdHJ1ZSBhbHdheXMKLQkJbmV3QWN0aXZpdHlEaWFncmFtRWRpdG9yLnNldEVuYWJsZWQodHJ1ZSk7Ci0KLQkJLy8gc2V0IFdQRCBEaWFncmFtIE1lbnUgQWN0aW9uIHN0YXRlIHRydSBhbHdheXMKLQkJbmV3V1BEaWFncmFtRWRpdG9yLnNldEVuYWJsZWQodHJ1ZSk7Ci0KLQkJaWYgKHNlbGVjdGVkT2JqZWN0ICE9IG51bGwpIHsKLQotCQkJaWYgKGdldFN1cHByZXNzaW9uKCkuaXNTdXBwcmVzc2VkKHNlbGVjdGVkT2JqZWN0KSkgewotCQkJCW5ld0FjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvci5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQluZXdBY3Rpdml0eURpYWdyYW1FZGl0b3Iuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJbmV3V1BEaWFncmFtRWRpdG9yLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCXJldHVybjsKLQkJCX0KLQotCQkJT2JqZWN0IHVud3JhcHBlZCA9IFRuZ1V0aWwudW53cmFwKHNlbGVjdGVkT2JqZWN0KTsKLQkJCWlmKCEodW53cmFwcGVkIGluc3RhbmNlb2YgQWN0aXZpdHkpKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJQWN0aXZpdHkgYWN0aXZpdHkgPSAoQWN0aXZpdHkpIHVud3JhcHBlZDsKLQkJCUxpc3Q8T2JqZWN0PiBsaXN0ID0gbmV3IEFycmF5TGlzdDxPYmplY3Q+KCk7Ci0JCQkKLQkJCS8vVE9ETzogY2hlY2sgZm9yIGV4aXN0aW5nIGRpYWdyYW1zIGluIGltbWVkaWF0ZSBiYXNlIGluc3RlYWQgb2Ygcm9vdCBiYXNlCi0JCQkKLQkJCXdoaWxlICghYWN0aXZpdHkuZ2V0VmFyaWFiaWxpdHlUeXBlKCkuZXF1YWxzKAotCQkJCQlWYXJpYWJpbGl0eVR5cGUuTkEpKSB7Ci0KLQkJCQlWYXJpYWJpbGl0eUVsZW1lbnQgdmUgPSBhY3Rpdml0eS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCk7Ci0JCQkJbGlzdC5hZGRBbGwoYWN0aXZpdHkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKSk7Ci0KLQkJCQlpZiAoKHZlICE9IG51bGwpICYmICh2ZSBpbnN0YW5jZW9mIEFjdGl2aXR5KSkgewotCQkJCQlhY3Rpdml0eSA9IChBY3Rpdml0eSkgdmU7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCi0JCQlvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5EaWFncmFtIGRpYWdyYW0gPSAoKFByb2Nlc3NFZGl0b3IpIGdldEFjdGl2ZUVkaXRvcigpKQotCQkJCQkuZ2V0RGlhZ3JhbUVkaXRvckhlbHBlcigpLmdldERpYWdyYW0oYWN0aXZpdHksCi0JCQkJCQkJSURpYWdyYW1NYW5hZ2VyLkFDVElWSVRZX0RJQUdSQU0pOwotCQkJaWYgKGRpYWdyYW0gPT0gbnVsbAotCQkJCQkmJiBzZWxlY3RlZE9iamVjdCBpbnN0YW5jZW9mIEFjdGl2aXR5V3JhcHBlckl0ZW1Qcm92aWRlcikgewotCQkJCW5ld0FjdGl2aXR5RGlhZ3JhbUVkaXRvci5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCX0KLQotCQkJLy8gRm9yIFdQRCBkaWFncmFtIG1lbnUgb3B0aW9uLCBpZiBCYXNlIEFjdGl2aXR5IGRvbm90IGhhdmUgYW55Ci0JCQkvLyBXUEQgZGlhZ3JhbSwgZG9ub3Qgc2hvdyBXUEQgZGlhZ3JhbSBvcHRpb24gaW4gY29udGV4dCBtZW51Ci0JCQkvLyBmb3IgcmVhZG9ubHkgYWN0aXZpdHkuCi0JCQlkaWFncmFtID0gKChQcm9jZXNzRWRpdG9yKSBnZXRBY3RpdmVFZGl0b3IoKSkKLQkJCQkJLmdldERpYWdyYW1FZGl0b3JIZWxwZXIoKS5nZXREaWFncmFtKGFjdGl2aXR5LAotCQkJCQkJCUlEaWFncmFtTWFuYWdlci5XT1JLX1BST0RVQ1RfREVQRU5ERU5DWV9ESUFHUkFNKTsKLQkJCWlmIChkaWFncmFtID09IG51bGwKLQkJCQkJJiYgc2VsZWN0ZWRPYmplY3QgaW5zdGFuY2VvZiBBY3Rpdml0eVdyYXBwZXJJdGVtUHJvdmlkZXIpIHsKLQkJCQluZXdXUERpYWdyYW1FZGl0b3Iuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQl9Ci0KLQkJCS8vIENvbGxlY3QgdGhlIGJyZWFrZG93biBlbGVtZW50cyB0byB2ZXJpZnR5IHRhc2tkZXNjcmlwdG9ycyBhcmUKLQkJCS8vIG5vdC4KLQkJCWxpc3QuYWRkQWxsKGFjdGl2aXR5LmdldEJyZWFrZG93bkVsZW1lbnRzKCkpOwotCi0JCQkvLyBGb3IgQUREIGRpYWdyYW0gbWVudSBvcHRpb24sIGlmIEJhc2UgQWN0aXZpdHkgZG9ub3QgaGF2ZSBhbnkKLQkJCS8vIEFERCBkaWFncmFtLCBkb25vdCBzaG93IEFERCBkaWFncmFtIG9wdGlvbiBpbiBjb250ZXh0IG1lbnUKLQkJCS8vIGZvcgotCQkJLy8gcmVhZG9ubHkgYWN0aXZpdHkuCi0JCQlkaWFncmFtID0gKChQcm9jZXNzRWRpdG9yKSBnZXRBY3RpdmVFZGl0b3IoKSkKLQkJCQkJLmdldERpYWdyYW1FZGl0b3JIZWxwZXIoKS5nZXREaWFncmFtKGFjdGl2aXR5LAotCQkJCQkJCUlEaWFncmFtTWFuYWdlci5BQ1RJVklUWV9ERVRBSUxfRElBR1JBTSk7Ci0KLQkJCWlmIChkaWFncmFtID09IG51bGwKLQkJCQkJJiYgc2VsZWN0ZWRPYmplY3QgaW5zdGFuY2VvZiBBY3Rpdml0eVdyYXBwZXJJdGVtUHJvdmlkZXIpIHsKLQkJCQluZXdBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0b3Iuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQl9IGVsc2UgewotCQkJCS8vIEl0ZXJhdGUgdGhyb3VnaCB0aGUgTGlzdCwgdG8gZmluZCB0YXNrZGVzY3JpcHRvciBhbmQgaGFzCi0JCQkJLy8gcHJpbWFyeSByb2xlIHdpdGhpbiBjdXJyZW50IGNvbmZpZ3VyYXRpb24uCi0JCQkJLy8gdGhlbiBlbmFibGUgdGhlIGFjdGlvbi4KLQkJCQlmaW5kUm9sZURlc2M6Ci0JCQkJZm9yIChJdGVyYXRvcjw/PiBpdGVyYXRvciA9IGxpc3QuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJCQlPYmplY3Qgb2JqID0gaXRlcmF0b3IubmV4dCgpOwotCQkJCQlpZiAob2JqIGluc3RhbmNlb2YgVGFza0Rlc2NyaXB0b3IpIHsKLQkJCQkJCWlmICghZ2V0U3VwcHJlc3Npb24oKS5pc1N1cHByZXNzZWQob2JqKSkgewotCQkJCQkJCUxpc3Q8Um9sZURlc2NyaXB0b3I+IHByaW1hcnlQZXJmb3JtZXJzID0gKChUYXNrRGVzY3JpcHRvcikgb2JqKQotCQkJCQkJCQkJLmdldFBlcmZvcm1lZFByaW1hcmlseUJ5KCk7Ci0JCQkJCQkJQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluIGRvbWFpbiA9IChBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW4pICgoSUVkaXRpbmdEb21haW5Qcm92aWRlcikgYWN0aXZlRWRpdG9yKQotCQkJCQkJCQkJLmdldEVkaXRpbmdEb21haW4oKTsKLQkJCQkJCQlBZGFwdGVyRmFjdG9yeSBmYWN0b3J5ID0gZG9tYWluLmdldEFkYXB0ZXJGYWN0b3J5KCk7Ci0JCQkJCQkJaWYgKGZhY3RvcnkgaW5zdGFuY2VvZiBFeHBvc2VkQWRhcHRlckZhY3RvcnkpIHsKLQkJCQkJCQkJSUZpbHRlciBmaWx0ZXIgPSAoKEV4cG9zZWRBZGFwdGVyRmFjdG9yeSkgZmFjdG9yeSkKLQkJCQkJCQkJCQkuZ2V0RmlsdGVyKCk7Ci0JCQkJCQkJCWZvciAoUm9sZURlc2NyaXB0b3IgZSA6IHByaW1hcnlQZXJmb3JtZXJzKSB7Ci0JCQkJCQkJCQlpZiAoZmlsdGVyICE9IG51bGwgJiYgZmlsdGVyLmFjY2VwdChlKQotCQkJCQkJCQkJCQkmJiAhZ2V0U3VwcHJlc3Npb24oKS5pc1N1cHByZXNzZWQoZSkpIHsKLQkJCQkJCQkJCQluZXdBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0b3IKLQkJCQkJCQkJCQkJCS5zZXRFbmFibGVkKHRydWUpOwotCQkJCQkJCQkJCWJyZWFrIGZpbmRSb2xlRGVzYzsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZWRpdG9ycy9Qcm9jZXNzRWRpdG9ySW5wdXQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZWRpdG9ycy9Qcm9jZXNzRWRpdG9ySW5wdXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTljNTc4Yi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2VkaXRvcnMvUHJvY2Vzc0VkaXRvcklucHV0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotCi0vKioKLSAqIEFuIGVkaXRvciBpbnB1dCBmb3IgcHJvY2VzcyBlZGl0b3IKLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqLwotcHVibGljIGNsYXNzIFByb2Nlc3NFZGl0b3JJbnB1dCBleHRlbmRzIE1ldGhvZEVsZW1lbnRFZGl0b3JJbnB1dCB7Ci0JcHJpdmF0ZSBJU2VsZWN0aW9uIGluaXRpYWxTZWxlY3Rpb247Ci0JcHJpdmF0ZSBpbnQgYWN0aXZlUGFnZSA9IC0xOwotCi0JcHVibGljIFByb2Nlc3NFZGl0b3JJbnB1dChNZXRob2RFbGVtZW50IGUpIHsKLQkJc3VwZXIoZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGFjdGl2ZSBwYWdlIG9mIHRoZSBlZGl0b3IKLQkgKi8KLQlwdWJsaWMgaW50IGdldEFjdGl2ZVBhZ2UoKSB7Ci0JCXJldHVybiBhY3RpdmVQYWdlOwotCX0KLQotCS8qKgotCSAqIFNldCBhY3RpdmUgcGFnZSBmb3IgdGhlIGVkaXRvcgotCSAqIEBwYXJhbSBhY3RpdmVQYWdlCi0JICovCi0JcHVibGljIHZvaWQgc2V0QWN0aXZlUGFnZShpbnQgYWN0aXZlUGFnZSkgewotCQl0aGlzLmFjdGl2ZVBhZ2UgPSBhY3RpdmVQYWdlOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBpbml0aWFsIHNlbGVjdGlvbgotCSAqIEByZXR1cm4KLQkgKiAJCQlTZWxlY3Rpb24KLQkgKi8KLQlwdWJsaWMgSVNlbGVjdGlvbiBnZXRJbml0aWFsU2VsZWN0aW9uKCkgewotCQlyZXR1cm4gaW5pdGlhbFNlbGVjdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgaW5pdGlhbCBzZWxlY3Rpb24gCi0JICogQHBhcmFtIGluaXRpYWxTZWxlY3Rpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJbml0aWFsU2VsZWN0aW9uKElTZWxlY3Rpb24gaW5pdGlhbFNlbGVjdGlvbikgewotCQl0aGlzLmluaXRpYWxTZWxlY3Rpb24gPSBpbml0aWFsU2VsZWN0aW9uOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZWRpdG9ycy9wYWNrYWdlLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2VkaXRvcnMvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYzI3MjU2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZWRpdG9ycy9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyBtZXRob2QsIHByb2Nlc3MgYW5kIGFjdGl2aXR5IGRpYWdyYW0gZWRpdG9ycy4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2ZpbHRlcnMvQWJzdHJhY3RCYXNlRmlsdGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2ZpbHRlcnMvQWJzdHJhY3RCYXNlRmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5YjIzNGYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9maWx0ZXJzL0Fic3RyYWN0QmFzZUZpbHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZpbHRlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5GaWx0ZXJIZWxwZXI7Ci0KLS8qKgotICogVGhlIGJhc2UgY2xhc3MgZm9yIFVJIGZpbHRlcnMuIFN1cHBvcnRzIG11bHRpcGxlIGZpbHRlcnMuCi0gKiBTdXBwb3J0IGZpbHRlcmluZyB0aGUgZWxlbWVudCBiYXNlZCBvbiB0aGUgcGF0dGVybiBhbmQgdHlwZS4gCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIEFic3RyYWN0QmFzZUZpbHRlciB7Ci0KLQlwcm90ZWN0ZWQgRmlsdGVySGVscGVyIGhlbHBlcjsKLQotCXByb3RlY3RlZCBJRmlsdGVyW10gYWRkaXRpb25hbEZpbHRlcnMgPSBudWxsOwotCi0JLyoqCi0JICogYWRkZWQgZm9yIGZ1dGhlciBmaWx0ZXJpbmcuIEZvciBleGFtcGxlLCB3ZSBtYXkgc2V0IGEgZmlsZXIgdG8gcHJldmVudAotCSAqIGdlbmVyYWxpemVycyBhcyBiYXNlIGVsZW1lbnQgdG8gYXZvaWQgY2lyY3VsYXIgZGVwZW5kZW5jeQotCSAqIAotCSAqIEBwYXJhbSBhZGRpdGlvbmFsRmlsdGVycwotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFkZGl0aW9uYWxGaWx0ZXJzKElGaWx0ZXJbXSBhZGRpdGlvbmFsRmlsdGVycykgewotCQl0aGlzLmFkZGl0aW9uYWxGaWx0ZXJzID0gYWRkaXRpb25hbEZpbHRlcnM7Ci0JfQotCi0JcHVibGljIEZpbHRlckhlbHBlciBnZXRIZWxwZXIoKSB7Ci0JCXJldHVybiBoZWxwZXI7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0SGVscGVyKEZpbHRlckhlbHBlciBoZWxwZXIpIHsKLQkJdGhpcy5oZWxwZXIgPSBoZWxwZXI7Ci0JfQotCi0JLyoKLQkgKiBzdWJjbGFzcyBtZXRob2Qgc2hvdWxkIGNhbGwgdGhpcyBiZWZvcmUgcmV0dXJuaW5nIHRydWUuCi0JICovCi0JcHVibGljIGJvb2xlYW4gYWNjZXB0KE9iamVjdCBvYmopIHsKLQotCQkvLyBKaW5odWEgWGksIGFkZGVkIGZvciBmdXRoZXIgZmlsdGVyaW5nLgotCQkvLyBGb3IgZXhhbXBsZSwgd2UgbWF5IHNldCBhIGZpbGVyIHRvIHByZXZlbnQgZ2VuZXJhbGl6ZXJzIGFzIGJhc2UKLQkJLy8gZWxlbWVudCB0byBhdm9pZCBjaXJjdWxhciBkZXBlbmRlbmN5Ci0JCWlmIChhZGRpdGlvbmFsRmlsdGVycyAhPSBudWxsICYmIGFkZGl0aW9uYWxGaWx0ZXJzLmxlbmd0aCA+IDApIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYWRkaXRpb25hbEZpbHRlcnMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAoYWRkaXRpb25hbEZpbHRlcnNbaV0uYWNjZXB0KG9iaikgPT0gZmFsc2UpIHsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiB0cnVlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9maWx0ZXJzL0FjdGl2aXR5VmFyaWFiaWxpdHlGaWx0ZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZmlsdGVycy9BY3Rpdml0eVZhcmlhYmlsaXR5RmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyYmRlNTguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9maWx0ZXJzL0FjdGl2aXR5VmFyaWFiaWxpdHlGaWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZpbHRlcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbmZpZ3VyYXRpb24uQ2F0ZWdvcml6ZWRQcm9jZXNzZXNJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb25maWd1cmF0aW9uLlByb2Nlc3Nlc0l0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLkZpbHRlclV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DYXBhYmlsaXR5UGF0dGVybjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJ5UHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc1BhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZVZpZXdlcjsKLQotLyoqCi0gKiBBY3Rpdml0eSB2YXJpYWJpbGl0eSBmaWx0ZXIKLSAqIAotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZpdHlWYXJpYWJpbGl0eUZpbHRlciBleHRlbmRzIEV4UHJvY2Vzc0F1dGhvcmluZ0NvbmZpZ3VyYXRvciB7Ci0KLQlwcml2YXRlIEFjdGl2aXR5IGFjdGl2aXR5ID0gbnVsbDsKLQkKLQlwcml2YXRlIExpc3QgdHJlZUxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JcHJpdmF0ZSBMaXN0IGdlbmVyYWxpemVycyA9IG5ldyBBcnJheUxpc3QoKTsKLQlwcml2YXRlIExpc3QgYmFzZWVsZW1lbnRzID0gbmV3IEFycmF5TGlzdCgpOwotCXByaXZhdGUgTGlzdCBiYWRlbGVtZW50cyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCXB1YmxpYyBBY3Rpdml0eVZhcmlhYmlsaXR5RmlsdGVyKE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnLAotCQkJVGFibGVWaWV3ZXIgdmlld2VyLCBTdHJpbmcgdGFiTmFtZSwgQWN0aXZpdHkgYWN0aXZpdHkpIHsKLQkJc3VwZXIoY29uZmlnLCB2aWV3ZXIpOwotCQl0aGlzLmFjdGl2aXR5ID0gYWN0aXZpdHk7Ci0JCQotCQkvLyBsb2FkIHRoZSBwYXJlbnRsaXN0Ci0JCUFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXIgPSBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRS5nZXRXQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpOwotCQlGaWx0ZXJVdGlsLmdldFN1YlRyZWUoYWRhcHRlciwgYWN0aXZpdHksIHRyZWVMaXN0KTsKLQkJRmlsdGVyVXRpbC5nZXRHZW5lcmFsaXplcnModHJlZUxpc3QsIGdlbmVyYWxpemVycyk7Ci0JCUZpbHRlclV0aWwuZ2V0VmFyaWFiaWxpdHlCYXNlKHRyZWVMaXN0LCBiYXNlZWxlbWVudHMpOwotCQkKLQkJRmlsdGVyVXRpbC5nZXRTdWJUcmVlKGFkYXB0ZXIsIGdlbmVyYWxpemVycywgYmFkZWxlbWVudHMpOwotCQlGaWx0ZXJVdGlsLmdldFN1YlRyZWUoYWRhcHRlciwgYmFzZWVsZW1lbnRzLCBiYWRlbGVtZW50cyk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJaWYgKCFzdXBlci5hY2NlcHQob2JqKSkgcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gY2hpbGRBY2NlcHQob2JqKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjaGlsZEFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBQcm9jZXNzZXNJdGVtUHJvdmlkZXIpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBDYXRlZ29yaXplZFByb2Nlc3Nlc0l0ZW1Qcm92aWRlcikgewotCQkJcmV0dXJuIHRydWU7Ci0KLQkJfQotCQlpZiAoKG9iaiBpbnN0YW5jZW9mIEFjdGl2aXR5KSB8fCBvYmogaW5zdGFuY2VvZiBQcm9jZXNzUGFja2FnZSkgewotCQkJaWYgKChvYmogaW5zdGFuY2VvZiBBY3Rpdml0eSkpewotCQkJCWlmKHRoaXMuYWN0aXZpdHkuZXF1YWxzKChBY3Rpdml0eSkgb2JqKSkgCi0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQlWYXJpYWJpbGl0eUVsZW1lbnQgZSA9ICgoQWN0aXZpdHkpb2JqKS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCk7Ci0JCQkJaWYoZSAhPSBudWxsICYmIGFjdGl2aXR5LmVxdWFscyhlKSkKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnQpIHsKLQkJCQlQcm9jZXNzIHNyY1Byb2MgPSBUbmdVdGlsCi0JCQkJCQkuZ2V0T3duaW5nUHJvY2VzcygoQnJlYWtkb3duRWxlbWVudCkgb2JqKTsKLQkJCQlQcm9jZXNzIHRhcmdldFByb2MgPSBUbmdVdGlsCi0JCQkJCQkuZ2V0T3duaW5nUHJvY2VzcygoQnJlYWtkb3duRWxlbWVudCkgdGhpcy5hY3Rpdml0eSk7Ci0JCQkJaWYgKHNyY1Byb2MgaW5zdGFuY2VvZiBEZWxpdmVyeVByb2Nlc3MKLQkJCQkJCSYmIHRhcmdldFByb2MgaW5zdGFuY2VvZiBDYXBhYmlsaXR5UGF0dGVybikgewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJfQotCQkJaWYob2JqIGluc3RhbmNlb2YgQWN0aXZpdHkpewotCQkJCWlmKFRuZ1V0aWwuY29udGFpbnMoZ2VuZXJhbGl6ZXJzLCBvYmopIAotCQkJCS8vQ29tbWVudCB0aGlzIG91dCBkdWUgdG8gMTgyNTMxLCBvdGhlciBjYXNlcyBtaXNzaW5nIHRoaXMgY2hlY2sgaGVyZQotCQkJCS8vc2hvdWxkIGJlIGNvbXBlbnNhdGVkIGJ5IGNpcmN1bGFyIGNoZWNrIGFmdGVyIGZpbHRlciBzZWxlY3Rpb24uCi0JCQkJLy9CZXR0ZXIgZml4IGlzIHRvIGluY2x1ZGUgdGhlIGNpcmN1bGFyIGNoZWNrIGludG8gdGhlIGZpbHRlciBsb2dpYy4JCQotCQkJCS8vIHx8IFRuZ1V0aWwuY29udGFpbnMoYmFzZWVsZW1lbnRzLCBvYmopCQkJCQkJCi0JCQkJLy8JCXx8VG5nVXRpbC5jb250YWlucyhiYWRlbGVtZW50cywgb2JqKQotCQkJCQkJKXsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCX0KLQkJCQotLy8JCQlpZiAob2JqIGluc3RhbmNlb2YgUHJvY2VzcykgewotLy8JCQkJUHJvY2VzcyBwcm9jID0gKFByb2Nlc3MpIG9iajsKLS8vCQkJCWlmIChwcm9jLmVxdWFscyhUbmdVdGlsLmdldE93bmluZ1Byb2Nlc3ModGhpcy5hY3Rpdml0eSkpKQotLy8JCQkJCXJldHVybiBmYWxzZTsKLS8vCQkJfQotLy8JCQlpZihvYmogaW5zdGFuY2VvZiBBY3Rpdml0eSl7Ci0vLwkJCQlpZihUbmdVdGlsLmNvbnRhaW5zKGNvbnRyaWJ1dG9ycywgb2JqKSkgcmV0dXJuIGZhbHNlOwotLy8JCQkJaWYoVG5nVXRpbC5jb250YWlucyh2YXJpYWJpbGl0eWJhc2VzLCBvYmopKSByZXR1cm4gZmFsc2U7Ci0vLwkJCQlpZihvYmouZXF1YWxzKEZpbHRlclV0aWwuZ2V0UGFyZW50QWN0aXZpdHkoVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UuZ2V0V0JTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSwgCi0vLwkJCQkJCWFjdGl2aXR5KSkpIHJldHVybiBmYWxzZTsKLS8vCQkJfQotCQkJCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJfSBlbHNlCi0JCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9maWx0ZXJzL0FkZExpbmtGaWx0ZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZmlsdGVycy9BZGRMaW5rRmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlOGYwNGYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9maWx0ZXJzL0FkZExpbmtGaWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyMCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vIAotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5maWx0ZXJzOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLkNhdGVnb3JpemVkUHJvY2Vzc2VzSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuQ29udGVudENhdGVnb3JpZXNHcm91cEl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLkZpbHRlckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLklBbGxGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5Qcm9jZXNzZXNJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5uYXZpZ2F0b3IuUGx1Z2luVUlQYWNrYWdlc0l0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DaGVja2xpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db25jZXB0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DdXN0b21DYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpc2NpcGxpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaXNjaXBsaW5lR3JvdXBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Eb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5FeGFtcGxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3VpZGFuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HdWlkZWxpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJhY3RpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUmVwb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUmV1c2FibGVBc3NldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvYWRtYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVTZXRHcm91cGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlN1cHBvcnRpbmdNYXRlcmlhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZW1wbGF0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRlcm1EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVG9vbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRvb2xNZW50b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5XaGl0ZXBhcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdFR5cGU7Ci0KLS8qKgotICogRmlsdGVyIGZvciBBZGRMaW5rIGluIFJpY2hUZXh0RWRpdG9yLgotICogCi0gKi8KLQotcHVibGljIGNsYXNzIEFkZExpbmtGaWx0ZXIgZXh0ZW5kcyBBYnN0cmFjdEJhc2VGaWx0ZXIgaW1wbGVtZW50cyBJQWxsRmlsdGVyIHsKLQotCXB1YmxpYyBib29sZWFuIGFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCQotCQkvLyBpZiBjYW4ndCBiZSBhY2NkZXB0ZWQgYnkgc3VwZXIsIHJldHVybi4KLQkJaWYob2JqID09IG51bGwgKXJldHVybiBmYWxzZTsKLQkJCi0JCWlmICghc3VwZXIuYWNjZXB0KG9iaikpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCVN0cmluZyBmaWx0ZXJUeXBlU3RyaW5nID0gaGVscGVyLmdldEZpbHRlclR5cGVTdHIoKTsKLQkJT2JqZWN0IGNvbnRlbnRFbGVtZW50ID0gaGVscGVyLmdldENvbnRlbnRFbGVtZW50KCk7Ci0KLQkJaWYgKGhlbHBlci5nZXRBbHJlYWR5U2VsZWN0ZWRMaXN0KCkgIT0gbnVsbCkgewotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpIHsKLQkJCQlpZiAoaGVscGVyLmdldEFscmVhZHlTZWxlY3RlZExpc3QoKS5jb250YWlucygKLQkJCQkJCSgoUHJvY2Vzc0NvbXBvbmVudCkgb2JqKS5nZXRQcm9jZXNzKCkpKQotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9IGVsc2UgewotCQkJCWlmIChoZWxwZXIuZ2V0QWxyZWFkeVNlbGVjdGVkTGlzdCgpLmNvbnRhaW5zKG9iaikpCi0JCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCi0JCWlmIChjb250ZW50RWxlbWVudCAhPSBudWxsCi0JCQkJJiYgIShvYmogaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50IHx8IG9iaiBpbnN0YW5jZW9mIFByb2Nlc3MpKSB7Ci0JCQlpZiAob2JqLmVxdWFscyhoZWxwZXIuZ2V0Q29udGVudEVsZW1lbnQoKSkpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJaWYgKGZpbHRlclR5cGVTdHJpbmcgPT0gbnVsbAotCQkJCXx8IGZpbHRlclR5cGVTdHJpbmcuZXF1YWxzKEZpbHRlckNvbnN0YW50cy5BTExfRUxFTUVOVFMpCi0JCQkJfHwgZmlsdGVyVHlwZVN0cmluZy5lcXVhbHMoRmlsdGVyQ29uc3RhbnRzLk1FVEhPX1BMVUdJTlMpKSB7Ci0KLQkJCWlmIChvYmogaW5zdGFuY2VvZiBDdXN0b21DYXRlZ29yeSkgewotCQkJCWlmIChUbmdVdGlsLmlzUm9vdEN1c3RvbUNhdGVnb3J5KChDdXN0b21DYXRlZ29yeSkgb2JqKSkgewotCQkJCQlpZiAoKChDdXN0b21DYXRlZ29yeSkgb2JqKS5nZXRDYXRlZ29yaXplZEVsZW1lbnRzKCkKLQkJCQkJCQkuaXNFbXB0eSgpKQotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCX0KLQkJCWlmICghaGVscGVyLm1hdGNoUGF0dGVybihvYmopKQotCQkJCXJldHVybiBmYWxzZTsKLQotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIENvbnRlbnRQYWNrYWdlKQotCQkJCXJldHVybiB0cnVlOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIENvbnRlbnRDYXRlZ29yaWVzR3JvdXBJdGVtUHJvdmlkZXIpIHsKLQkJCQlDb2xsZWN0aW9uIGxpc3QgPSAoKENvbnRlbnRDYXRlZ29yaWVzR3JvdXBJdGVtUHJvdmlkZXIpIG9iaikKLQkJCQkJCS5nZXRDaGlsZHJlbihvYmopOwotCQkJCWlmIChsaXN0LmlzRW1wdHkoKSkKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCWVsc2UKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgUHJvY2Vzc2VzSXRlbVByb3ZpZGVyKSB7Ci0JCQkJQ29sbGVjdGlvbiBsaXN0ID0gKChQcm9jZXNzZXNJdGVtUHJvdmlkZXIpIG9iaikKLQkJCQkJCS5nZXRDaGlsZHJlbihvYmopOwotCQkJCWZvciAoSXRlcmF0b3IgaW9yID0gbGlzdC5pdGVyYXRvcigpOyBpb3IuaGFzTmV4dCgpOykgewotCQkJCQlPYmplY3Qgb2JqZWN0ID0gaW9yLm5leHQoKTsKLQkJCQkJaWYgKCgoQ2F0ZWdvcml6ZWRQcm9jZXNzZXNJdGVtUHJvdmlkZXIpIG9iamVjdCkKLQkJCQkJCQkuZ2V0Q2hpbGRyZW4ob2JqZWN0KS5pc0VtcHR5KCkpCi0JCQkJCQlpb3IucmVtb3ZlKCk7Ci0JCQkJfQotCQkJCWlmIChsaXN0LmlzRW1wdHkoKSkKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCWVsc2UKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgUGx1Z2luVUlQYWNrYWdlc0l0ZW1Qcm92aWRlcikgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQkJaWYgKGNoaWxkQWNjZXB0KG9iaikpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0gZWxzZSBpZiAoZmlsdGVyVHlwZVN0cmluZy5lcXVhbHMoRmlsdGVyQ29uc3RhbnRzLkRJU0NJUExJTkVTKSkgewotCi0JCQlpZiAoIWhlbHBlci5tYXRjaFBhdHRlcm5CYXNlZE9uVHlwZShvYmopKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBDb250ZW50Q2F0ZWdvcmllc0dyb3VwSXRlbVByb3ZpZGVyKSB7Ci0JCQkJcmV0dXJuIGFjY2VwdENhdGVnb3JpZXNHcm91cChvYmosIExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCQkuZ2V0U3RyaW5nKCJfVUlfRGlzY2lwbGluZXNfZ3JvdXAiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWlmIChvYmogaW5zdGFuY2VvZiBEaXNjaXBsaW5lR3JvdXBpbmcpIHsKLQkJCQlyZXR1cm4gISgoRGlzY2lwbGluZUdyb3VwaW5nKSBvYmopLmdldERpc2NpcGxpbmVzKCkuaXNFbXB0eSgpOwotCQkJfQotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIERpc2NpcGxpbmUpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsvLyBBc3NvY2lhdGlvbkhlbHBlci5nZXREaXNjaXBsaW5lR3JvdXBzKChEaXNjaXBsaW5lKW9iaikuaXNFbXB0eSgpOwotCQkJfQotCQl9IGVsc2UgaWYgKGZpbHRlclR5cGVTdHJpbmcuZXF1YWxzKEZpbHRlckNvbnN0YW50cy5ST0xFU0VUUykpIHsKLQotCQkJaWYgKCFoZWxwZXIubWF0Y2hQYXR0ZXJuQmFzZWRPblR5cGUob2JqKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgQ29udGVudENhdGVnb3JpZXNHcm91cEl0ZW1Qcm92aWRlcikgewotCQkJCXJldHVybiBhY2NlcHRDYXRlZ29yaWVzR3JvdXAob2JqLCBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkJLmdldFN0cmluZygiX1VJX1JvbGVfU2V0c19ncm91cCIpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFJvbGVTZXRHcm91cGluZykgewotCQkJCXJldHVybiAhKChSb2xlU2V0R3JvdXBpbmcpIG9iaikuZ2V0Um9sZVNldHMoKS5pc0VtcHR5KCk7Ci0JCQl9Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgUm9sZVNldCkgewotCQkJCXJldHVybiB0cnVlOy8vIEFzc29jaWF0aW9uSGVscGVyLmdldFJvbGVTZXRHcm91cHMoKFJvbGVTZXQpb2JqKS5pc0VtcHR5KCk7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoZmlsdGVyVHlwZVN0cmluZy5lcXVhbHMoRmlsdGVyQ29uc3RhbnRzLldPUktQUk9EVUNUVFlQRVMpKSB7Ci0KLQkJCWlmICghaGVscGVyLm1hdGNoUGF0dGVybkJhc2VkT25UeXBlKG9iaikpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIENvbnRlbnRDYXRlZ29yaWVzR3JvdXBJdGVtUHJvdmlkZXIpIHsKLQkJCQkKLQkJCQlyZXR1cm4gYWNjZXB0Q2F0ZWdvcmllc0dyb3VwKG9iaiwgTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJCS5nZXRTdHJpbmcoIl9VSV9Xb3JrUHJvZHVjdFR5cGVzX2dyb3VwIikpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgV29ya1Byb2R1Y3RUeXBlKQotCQkJCXJldHVybiB0cnVlOwotCQl9IGVsc2UgaWYgKGZpbHRlclR5cGVTdHJpbmcuZXF1YWxzKEZpbHRlckNvbnN0YW50cy5ET01BSU5TKSkgewotCi0JCQlpZiAoIWhlbHBlci5tYXRjaFBhdHRlcm5CYXNlZE9uVHlwZShvYmopKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBDb250ZW50Q2F0ZWdvcmllc0dyb3VwSXRlbVByb3ZpZGVyKSB7Ci0JCQkJcmV0dXJuIGFjY2VwdENhdGVnb3JpZXNHcm91cChvYmosIExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCQkuZ2V0U3RyaW5nKCJfVUlfRG9tYWluc19ncm91cCIpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIERvbWFpbikKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfSBlbHNlIGlmIChmaWx0ZXJUeXBlU3RyaW5nLmVxdWFscyhGaWx0ZXJDb25zdGFudHMuVE9PTFMpKSB7Ci0KLQkJCWlmICghaGVscGVyLm1hdGNoUGF0dGVybkJhc2VkT25UeXBlKG9iaikpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIENvbnRlbnRDYXRlZ29yaWVzR3JvdXBJdGVtUHJvdmlkZXIpIHsKLQkJCQlyZXR1cm4gYWNjZXB0Q2F0ZWdvcmllc0dyb3VwKG9iaiwgTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJCS5nZXRTdHJpbmcoIl9VSV9Ub29sc19ncm91cCIpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFRvb2wpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0gZWxzZSBpZiAoZmlsdGVyVHlwZVN0cmluZy5lcXVhbHMoRmlsdGVyQ29uc3RhbnRzLlJPTEVTKSkgeyAKLQotCQkJaWYgKCFoZWxwZXIubWF0Y2hQYXR0ZXJuQmFzZWRPblR5cGUob2JqKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgUm9sZSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfSBlbHNlIGlmIChmaWx0ZXJUeXBlU3RyaW5nLmVxdWFscyhGaWx0ZXJDb25zdGFudHMuVEFTS1MpKSB7IAotCi0JCQlpZiAoIWhlbHBlci5tYXRjaFBhdHRlcm5CYXNlZE9uVHlwZShvYmopKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBDb250ZW50UGFja2FnZSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBUYXNrKQotCQkJCXJldHVybiB0cnVlOwotCQl9IGVsc2UgaWYgKGZpbHRlclR5cGVTdHJpbmcuZXF1YWxzKEZpbHRlckNvbnN0YW50cy5XT1JLUFJPRFVDVFMpKSB7IAotCi0JCQlpZiAoIWhlbHBlci5tYXRjaFBhdHRlcm5CYXNlZE9uVHlwZShvYmopKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBDb250ZW50UGFja2FnZSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBXb3JrUHJvZHVjdCkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfSBlbHNlIGlmIChmaWx0ZXJUeXBlU3RyaW5nLmVxdWFscyhGaWx0ZXJDb25zdGFudHMuR1VJREFOQ0UpKSB7IAotCi0JCQlpZiAoIWhlbHBlci5tYXRjaFBhdHRlcm5CYXNlZE9uVHlwZShvYmopKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBDb250ZW50UGFja2FnZSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBHdWlkYW5jZSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfWVsc2UgaWYgKGZpbHRlclR5cGVTdHJpbmcuZXF1YWxzKEZpbHRlckNvbnN0YW50cy5DSEVDS0xJU1RTKSkgeyAvLzE3Mjk1NgotCQkJCi0JCQlpZiAoIWhlbHBlci5tYXRjaFBhdHRlcm5CYXNlZE9uVHlwZShvYmopKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBDb250ZW50UGFja2FnZSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBDaGVja2xpc3QpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX1lbHNlIGlmIChmaWx0ZXJUeXBlU3RyaW5nLmVxdWFscyhGaWx0ZXJDb25zdGFudHMuQ09OQ0VQVFMpKSB7Ci0JCQkKLQkJCWlmICghaGVscGVyLm1hdGNoUGF0dGVybkJhc2VkT25UeXBlKG9iaikpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIENvbnRlbnRQYWNrYWdlKQotCQkJCXJldHVybiB0cnVlOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIENvbmNlcHQpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX1lbHNlIGlmIChmaWx0ZXJUeXBlU3RyaW5nLmVxdWFscyhGaWx0ZXJDb25zdGFudHMuRVhBTVBMRVMpKSB7Ci0JCQkKLQkJCWlmICghaGVscGVyLm1hdGNoUGF0dGVybkJhc2VkT25UeXBlKG9iaikpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIENvbnRlbnRQYWNrYWdlKQotCQkJCXJldHVybiB0cnVlOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIEV4YW1wbGUpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX1lbHNlIGlmIChmaWx0ZXJUeXBlU3RyaW5nLmVxdWFscyhGaWx0ZXJDb25zdGFudHMuR1VJREVMSU5FUykpIHsKLQkJCQotCQkJaWYgKCFoZWxwZXIubWF0Y2hQYXR0ZXJuQmFzZWRPblR5cGUob2JqKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgR3VpZGVsaW5lKQotCQkJCXJldHVybiB0cnVlOwotCQl9ZWxzZSBpZiAoZmlsdGVyVHlwZVN0cmluZy5lcXVhbHMoRmlsdGVyQ29uc3RhbnRzLkNPTkNFUFRTKSkgewotCQkJCi0JCQlpZiAoIWhlbHBlci5tYXRjaFBhdHRlcm5CYXNlZE9uVHlwZShvYmopKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBDb250ZW50UGFja2FnZSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBDb25jZXB0KQotCQkJCXJldHVybiB0cnVlOwotCQl9ZWxzZSBpZiAoZmlsdGVyVHlwZVN0cmluZy5lcXVhbHMoRmlsdGVyQ29uc3RhbnRzLkVTVElNQVRFX0NPTlNJREVSQVRJT05TKSkgewotCQkJCi0JCQlpZiAoIWhlbHBlci5tYXRjaFBhdHRlcm5CYXNlZE9uVHlwZShvYmopKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBDb250ZW50UGFja2FnZSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX1lbHNlIGlmIChmaWx0ZXJUeXBlU3RyaW5nLmVxdWFscyhGaWx0ZXJDb25zdGFudHMuUFJBQ1RJQ0VTKSkgewotCQkJCi0JCQlpZiAoIWhlbHBlci5tYXRjaFBhdHRlcm5CYXNlZE9uVHlwZShvYmopKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBDb250ZW50UGFja2FnZSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBQcmFjdGljZSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfWVsc2UgaWYgKGZpbHRlclR5cGVTdHJpbmcuZXF1YWxzKEZpbHRlckNvbnN0YW50cy5SRVBPUlRTKSkgewotCQkJCi0JCQlpZiAoIWhlbHBlci5tYXRjaFBhdHRlcm5CYXNlZE9uVHlwZShvYmopKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBDb250ZW50UGFja2FnZSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBSZXBvcnQpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0gZWxzZSBpZiAoZmlsdGVyVHlwZVN0cmluZy5lcXVhbHMoRmlsdGVyQ29uc3RhbnRzLlJFVVNBQkxFX0FTU0VUUykpIHsKLQkJCQotCQkJaWYgKCFoZWxwZXIubWF0Y2hQYXR0ZXJuQmFzZWRPblR5cGUob2JqKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgUmV1c2FibGVBc3NldCkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfSBlbHNlIGlmIChmaWx0ZXJUeXBlU3RyaW5nLmVxdWFscyhGaWx0ZXJDb25zdGFudHMuUk9BRE1BUCkpIHsKLQkJCQotCQkJaWYgKCFoZWxwZXIubWF0Y2hQYXR0ZXJuQmFzZWRPblR5cGUob2JqKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgUm9hZG1hcCkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfSBlbHNlIGlmIChmaWx0ZXJUeXBlU3RyaW5nLmVxdWFscyhGaWx0ZXJDb25zdGFudHMuU1VQUE9SVElOR19NQVRFUklBTFMpKSB7Ci0JCQkKLQkJCWlmICghaGVscGVyLm1hdGNoUGF0dGVybkJhc2VkT25UeXBlKG9iaikpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIENvbnRlbnRQYWNrYWdlKQotCQkJCXJldHVybiB0cnVlOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFN1cHBvcnRpbmdNYXRlcmlhbCkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfSBlbHNlIGlmIChmaWx0ZXJUeXBlU3RyaW5nLmVxdWFscyhGaWx0ZXJDb25zdGFudHMuVEVNUExBVEVTKSkgewotCQkJCi0JCQlpZiAoIWhlbHBlci5tYXRjaFBhdHRlcm5CYXNlZE9uVHlwZShvYmopKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBDb250ZW50UGFja2FnZSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBUZW1wbGF0ZSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfSBlbHNlIGlmIChmaWx0ZXJUeXBlU3RyaW5nLmVxdWFscyhGaWx0ZXJDb25zdGFudHMuVEVSTV9ERUZJTklUSU9OUykpIHsKLQkJCQotCQkJaWYgKCFoZWxwZXIubWF0Y2hQYXR0ZXJuQmFzZWRPblR5cGUob2JqKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgVGVybURlZmluaXRpb24pCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0gZWxzZSBpZiAoZmlsdGVyVHlwZVN0cmluZy5lcXVhbHMoRmlsdGVyQ29uc3RhbnRzLlRPT0xfTUVOVE9SUykpIHsKLQkJCQotCQkJaWYgKCFoZWxwZXIubWF0Y2hQYXR0ZXJuQmFzZWRPblR5cGUob2JqKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgVG9vbE1lbnRvcikKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfSBlbHNlIGlmIChmaWx0ZXJUeXBlU3RyaW5nLmVxdWFscyhGaWx0ZXJDb25zdGFudHMuV0hJVEVfUEFQRVJTKSkgewotCQkJCi0JCQlpZiAoIWhlbHBlci5tYXRjaFBhdHRlcm5CYXNlZE9uVHlwZShvYmopKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBDb250ZW50UGFja2FnZSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBXaGl0ZXBhcGVyKQotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWVsc2UgaWYgKGZpbHRlclR5cGVTdHJpbmcuZXF1YWxzKEZpbHRlckNvbnN0YW50cy5DT05URU5UX1BBQ0tBR0VTKSkgewotCi0JCQlpZiAoIWhlbHBlci5tYXRjaFBhdHRlcm4ob2JqKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgQ3VzdG9tQ2F0ZWdvcnkpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFJvbGUgfHwgb2JqIGluc3RhbmNlb2YgVGFzawotCQkJCQl8fCBvYmogaW5zdGFuY2VvZiBXb3JrUHJvZHVjdCB8fCBvYmogaW5zdGFuY2VvZiBHdWlkYW5jZSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCS8vIGlmKG9iaiBpbnN0YW5jZW9mIEd1aWRhbmNlKSByZXR1cm4gdHJ1ZTsKLQkJfSBlbHNlIGlmIChmaWx0ZXJUeXBlU3RyaW5nLmVxdWFscyhGaWx0ZXJDb25zdGFudHMuQ1VTVE9NX0NBVEVHT1JJRVMpKSB7Ci0KLQkJCWlmICghaGVscGVyLm1hdGNoUGF0dGVybihvYmopKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBDdXN0b21DYXRlZ29yeSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfSBlbHNlIGlmIChmaWx0ZXJUeXBlU3RyaW5nLmVxdWFscyhGaWx0ZXJDb25zdGFudHMuUFJPQ0VTU0VTKSkgewotCi0JCQlpZiAoIWhlbHBlci5tYXRjaFBhdHRlcm5CYXNlZE9uVHlwZShvYmopKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBDdXN0b21DYXRlZ29yeSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgUHJvY2Vzc2VzSXRlbVByb3ZpZGVyKSB7Ci0JCQkJQ29sbGVjdGlvbiBsaXN0ID0gKChQcm9jZXNzZXNJdGVtUHJvdmlkZXIpIG9iaikKLQkJCQkJCS5nZXRDaGlsZHJlbihvYmopOwotCQkJCWZvciAoSXRlcmF0b3IgaW9yID0gbGlzdC5pdGVyYXRvcigpOyBpb3IuaGFzTmV4dCgpOykgewotCQkJCQlPYmplY3Qgb2JqZWN0ID0gaW9yLm5leHQoKTsKLQkJCQkJaWYgKCgoQ2F0ZWdvcml6ZWRQcm9jZXNzZXNJdGVtUHJvdmlkZXIpIG9iamVjdCkKLQkJCQkJCQkuZ2V0Q2hpbGRyZW4ob2JqZWN0KS5pc0VtcHR5KCkpCi0JCQkJCQlpb3IucmVtb3ZlKCk7Ci0JCQkJfQotCQkJCWlmIChsaXN0LmlzRW1wdHkoKSkKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCWVsc2UKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgUHJvY2Vzc1BhY2thZ2UpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudCkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlpZiAob2JqIGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gY2hpbGRBY2NlcHQoT2JqZWN0IG9iaikgewotCQlpZiAob2JqIGluc3RhbmNlb2YgTWV0aG9kQ29uZmlndXJhdGlvbikKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gYWNjZXB0Q2F0ZWdvcmllc0dyb3VwKE9iamVjdCBvYmosIFN0cmluZyB0eXBlKSB7Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBDb250ZW50Q2F0ZWdvcmllc0dyb3VwSXRlbVByb3ZpZGVyKSB7Ci0JCQlDb2xsZWN0aW9uIGxpc3QgPSAoKENvbnRlbnRDYXRlZ29yaWVzR3JvdXBJdGVtUHJvdmlkZXIpIG9iaikKLQkJCQkJLmdldENoaWxkcmVuKG9iaik7Ci0JCQlpZiAobGlzdC5pc0VtcHR5KCkpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJaWYgKCgoQ29udGVudENhdGVnb3JpZXNHcm91cEl0ZW1Qcm92aWRlcikgb2JqKS5nZXRUZXh0KG9iaikuZXF1YWxzKAotCQkJCQl0eXBlKSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRPYmplY3QoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZmlsdGVycy9BbGxGaWx0ZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZmlsdGVycy9BbGxGaWx0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTBiYWExZi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2ZpbHRlcnMvQWxsRmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1ODcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5maWx0ZXJzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkN1c3RvbUNhdGVnb3J5QXNzaWduUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuQ2F0ZWdvcml6ZWRQcm9jZXNzZXNJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5Db250ZW50Q2F0ZWdvcmllc0dyb3VwSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuRmlsdGVyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuSUFsbEZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLlByb2Nlc3Nlc0l0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuTWV0aG9kRWxlbWVudFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ2hlY2tsaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29uY2VwdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ3VzdG9tQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaXNjaXBsaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGlzY2lwbGluZUdyb3VwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRXhhbXBsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkd1aWRhbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3VpZGVsaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1pbGVzdG9uZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByYWN0aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJlcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJldXNhYmxlQXNzZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2FkbWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlU2V0R3JvdXBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5TdXBwb3J0aW5nTWF0ZXJpYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGVtcGxhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZXJtRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRvb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Ub29sTWVudG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV2hpdGVwYXBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3RUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5Bc3NvY2lhdGlvbkhlbHBlcjsKLQotCi0vKioKLSAqIEZpbHRlciBmb3IgYWxsIGVsZW1lbnRzIGVnOiB1c2VkIGluIHtAbGluayBDdXN0b21DYXRlZ29yeUFzc2lnblBhZ2V9IAotICogCi0gKiBAYXV0aG9yIExva2FuYXRoIEphZ2dhCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEFsbEZpbHRlciBleHRlbmRzIEFic3RyYWN0QmFzZUZpbHRlciBpbXBsZW1lbnRzIElBbGxGaWx0ZXIgewotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5JQWxsRmlsdGVyI2dldE9iamVjdCgpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRPYmplY3QoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuSUZpbHRlciNhY2NlcHQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoT2JqZWN0IG9iaikgewotCQlpZihvYmogPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJLy8gaWYgY2FuJ3QgYmUgYWNjZGVwdGVkIGJ5IHN1cGVyLCByZXR1cm4uCi0JCWlmICghc3VwZXIuYWNjZXB0KG9iaikpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCVN0cmluZyBmaWx0ZXJUeXBlU3RyaW5nID0gaGVscGVyLmdldEZpbHRlclR5cGVTdHIoKTsKLQkJT2JqZWN0IGNvbnRlbnRFbGVtZW50ID0gaGVscGVyLmdldENvbnRlbnRFbGVtZW50KCk7Ci0KLQkJaWYgKGhlbHBlci5nZXRBbHJlYWR5U2VsZWN0ZWRMaXN0KCkgIT0gbnVsbCkgewotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpIHsKLQkJCQlpZiAoaGVscGVyLmdldEFscmVhZHlTZWxlY3RlZExpc3QoKS5jb250YWlucygKLQkJCQkJCSgoUHJvY2Vzc0NvbXBvbmVudCkgb2JqKS5nZXRQcm9jZXNzKCkpKQotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9IGVsc2UgewotCQkJCWlmIChoZWxwZXIuZ2V0QWxyZWFkeVNlbGVjdGVkTGlzdCgpLmNvbnRhaW5zKG9iaikpCi0JCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCi0JCWlmIChjb250ZW50RWxlbWVudCAhPSBudWxsCi0JCQkJJiYgIShvYmogaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50IHx8IG9iaiBpbnN0YW5jZW9mIFByb2Nlc3MpKSB7Ci0JCQlpZihvYmogPT0gbnVsbCl7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJudWxsIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWlmIChvYmouZXF1YWxzKGhlbHBlci5nZXRDb250ZW50RWxlbWVudCgpKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlpZiAoZmlsdGVyVHlwZVN0cmluZyA9PSBudWxsCi0JCQkJfHwgZmlsdGVyVHlwZVN0cmluZy5lcXVhbHMoRmlsdGVyQ29uc3RhbnRzLkFMTF9FTEVNRU5UUykKLQkJCQl8fCBmaWx0ZXJUeXBlU3RyaW5nLmVxdWFscyhGaWx0ZXJDb25zdGFudHMuTUVUSE9fUExVR0lOUykKLQkJCQl8fCBmaWx0ZXJUeXBlU3RyaW5nCi0JCQkJCQkuZXF1YWxzKEZpbHRlckNvbnN0YW50cy5PTkxZX0NPTlRFTlRfRUxFTUVOVFMpKSB7Ci0KLQkJCWlmIChvYmogaW5zdGFuY2VvZiBDdXN0b21DYXRlZ29yeSkgewotCQkJCWlmIChUbmdVdGlsLmlzUm9vdEN1c3RvbUNhdGVnb3J5KChDdXN0b21DYXRlZ29yeSkgb2JqKSkgewotCQkJCQlpZiAoKChDdXN0b21DYXRlZ29yeSkgb2JqKS5nZXRDYXRlZ29yaXplZEVsZW1lbnRzKCkKLQkJCQkJCQkuaXNFbXB0eSgpKQotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCX0KLQkJCWlmICghaGVscGVyLm1hdGNoUGF0dGVybihvYmopKQotCQkJCXJldHVybiBmYWxzZTsKLQotCQkJLy8gaWYob2JqIGluc3RhbmNlb2YgVGVybURlZmluaXRpb24pIHJldHVybiBmYWxzZTsKLQotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikgewotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pIHsKLQkJCQkJaWYgKGNvbnRlbnRFbGVtZW50ICE9IG51bGwpIHsKLQkJCQkJCWlmIChNZXRob2RFbGVtZW50VXRpbC5nZXRBbGxNb2RlbHMoY29udGVudEVsZW1lbnQpCi0JCQkJCQkJCS5jb250YWlucyhvYmopKQotCQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQkJZWxzZQotCQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIENvbnRlbnRQYWNrYWdlKQotCQkJCXJldHVybiB0cnVlOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIENvbnRlbnRDYXRlZ29yaWVzR3JvdXBJdGVtUHJvdmlkZXIpIHsKLQkJCQlDb2xsZWN0aW9uIGxpc3QgPSAoKENvbnRlbnRDYXRlZ29yaWVzR3JvdXBJdGVtUHJvdmlkZXIpIG9iaikKLQkJCQkJCS5nZXRDaGlsZHJlbihvYmopOwotCQkJCWlmIChsaXN0LmlzRW1wdHkoKSkKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCWVsc2UKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgUHJvY2Vzc2VzSXRlbVByb3ZpZGVyKSB7Ci0JCQkJQ29sbGVjdGlvbiBsaXN0ID0gKChQcm9jZXNzZXNJdGVtUHJvdmlkZXIpIG9iaikKLQkJCQkJCS5nZXRDaGlsZHJlbihvYmopOwotCQkJCWZvciAoSXRlcmF0b3IgaW9yID0gbGlzdC5pdGVyYXRvcigpOyBpb3IuaGFzTmV4dCgpOykgewotCQkJCQlPYmplY3Qgb2JqZWN0ID0gaW9yLm5leHQoKTsKLQkJCQkJaWYgKCgoQ2F0ZWdvcml6ZWRQcm9jZXNzZXNJdGVtUHJvdmlkZXIpIG9iamVjdCkKLQkJCQkJCQkuZ2V0Q2hpbGRyZW4ob2JqZWN0KS5pc0VtcHR5KCkpCi0JCQkJCQlpb3IucmVtb3ZlKCk7Ci0JCQkJfQotCQkJCWlmIChsaXN0LmlzRW1wdHkoKSkKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCWVsc2UKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0KLQkJCWlmIChjaGlsZEFjY2VwdChvYmopKQotCQkJCXJldHVybiB0cnVlOwotCQkJLy8JCQotCQl9IGVsc2UgaWYgKGZpbHRlclR5cGVTdHJpbmcuZXF1YWxzKEZpbHRlckNvbnN0YW50cy5ESVNDSVBMSU5FUykpIHsKLQotCQkJaWYgKCFoZWxwZXIubWF0Y2hQYXR0ZXJuQmFzZWRPblR5cGUob2JqKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkvLyBpZihvYmogaW5zdGFuY2VvZiBEaXNjaXBsaW5lKSByZXR1cm4gdHJ1ZTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pIHsKLQkJCQlyZXR1cm4gYWNjZXB0TWV0aG9kUGx1Z2luKG9iaiwgY29udGVudEVsZW1lbnQpOwotCQkJfQotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIENvbnRlbnRDYXRlZ29yaWVzR3JvdXBJdGVtUHJvdmlkZXIpIHsKLQkJCQlyZXR1cm4gYWNjZXB0Q2F0ZWdvcmllc0dyb3VwKG9iaiwgTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJCS5nZXRTdHJpbmcoIl9VSV9EaXNjaXBsaW5lc19ncm91cCIpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIERpc2NpcGxpbmVHcm91cGluZykgewotCQkJCXJldHVybiAhKChEaXNjaXBsaW5lR3JvdXBpbmcpIG9iaikuZ2V0RGlzY2lwbGluZXMoKS5pc0VtcHR5KCk7Ci0JCQl9Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgRGlzY2lwbGluZSkgewotCQkJCXJldHVybiB0cnVlOy8vIEFzc29jaWF0aW9uSGVscGVyLmdldERpc2NpcGxpbmVHcm91cHMoKERpc2NpcGxpbmUpb2JqKS5pc0VtcHR5KCk7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoZmlsdGVyVHlwZVN0cmluZy5lcXVhbHMoRmlsdGVyQ29uc3RhbnRzLlJPTEVTRVRTKSkgewotCi0JCQlpZiAoIWhlbHBlci5tYXRjaFBhdHRlcm5CYXNlZE9uVHlwZShvYmopKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCS8vIGlmKG9iaiBpbnN0YW5jZW9mIERpc2NpcGxpbmUpIHJldHVybiB0cnVlOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikgewotCQkJCXJldHVybiBhY2NlcHRNZXRob2RQbHVnaW4ob2JqLCBjb250ZW50RWxlbWVudCk7Ci0JCQl9Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgQ29udGVudENhdGVnb3JpZXNHcm91cEl0ZW1Qcm92aWRlcikgewotCQkJCXJldHVybiBhY2NlcHRDYXRlZ29yaWVzR3JvdXAob2JqLCBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkJLmdldFN0cmluZygiX1VJX1JvbGVfU2V0c19ncm91cCIpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFJvbGVTZXRHcm91cGluZykgewotCQkJCXJldHVybiAhKChSb2xlU2V0R3JvdXBpbmcpIG9iaikuZ2V0Um9sZVNldHMoKS5pc0VtcHR5KCk7Ci0JCQl9Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgUm9sZVNldCkgewotCQkJCXJldHVybiB0cnVlOy8vIEFzc29jaWF0aW9uSGVscGVyLmdldFJvbGVTZXRHcm91cHMoKFJvbGVTZXQpb2JqKS5pc0VtcHR5KCk7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoZmlsdGVyVHlwZVN0cmluZy5lcXVhbHMoRmlsdGVyQ29uc3RhbnRzLldPUktQUk9EVUNUVFlQRVMpKSB7Ci0KLQkJCWlmICghaGVscGVyLm1hdGNoUGF0dGVybkJhc2VkT25UeXBlKG9iaikpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJLy8gaWYob2JqIGluc3RhbmNlb2YgRGlzY2lwbGluZSkgcmV0dXJuIHRydWU7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luKSB7Ci0JCQkJcmV0dXJuIGFjY2VwdE1ldGhvZFBsdWdpbihvYmosIGNvbnRlbnRFbGVtZW50KTsKLQkJCX0KLQkJCWlmIChvYmogaW5zdGFuY2VvZiBDb250ZW50Q2F0ZWdvcmllc0dyb3VwSXRlbVByb3ZpZGVyKSB7Ci0JCQkJcmV0dXJuIGFjY2VwdENhdGVnb3JpZXNHcm91cChvYmosIExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCQkuZ2V0U3RyaW5nKCJfVUlfV29ya1Byb2R1Y3RUeXBlc19ncm91cCIpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0VHlwZSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfSBlbHNlIGlmIChmaWx0ZXJUeXBlU3RyaW5nLmVxdWFscyhGaWx0ZXJDb25zdGFudHMuRE9NQUlOUykpIHsKLQotCQkJaWYgKCFoZWxwZXIubWF0Y2hQYXR0ZXJuQmFzZWRPblR5cGUob2JqKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkvLyBpZihvYmogaW5zdGFuY2VvZiBEaXNjaXBsaW5lKSByZXR1cm4gdHJ1ZTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pIHsKLQkJCQlyZXR1cm4gYWNjZXB0TWV0aG9kUGx1Z2luKG9iaiwgY29udGVudEVsZW1lbnQpOwotCQkJfQotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIENvbnRlbnRDYXRlZ29yaWVzR3JvdXBJdGVtUHJvdmlkZXIpIHsKLQkJCQlyZXR1cm4gYWNjZXB0Q2F0ZWdvcmllc0dyb3VwKG9iaiwgTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJCS5nZXRTdHJpbmcoIl9VSV9Eb21haW5zX2dyb3VwIikpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgRG9tYWluKQotCQkJCXJldHVybiB0cnVlOwotCQl9IGVsc2UgaWYgKGZpbHRlclR5cGVTdHJpbmcuZXF1YWxzKEZpbHRlckNvbnN0YW50cy5UT09MUykpIHsKLQotCQkJaWYgKCFoZWxwZXIubWF0Y2hQYXR0ZXJuQmFzZWRPblR5cGUob2JqKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkvLyBpZihvYmogaW5zdGFuY2VvZiBEaXNjaXBsaW5lKSByZXR1cm4gdHJ1ZTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pIHsKLQkJCQlyZXR1cm4gYWNjZXB0TWV0aG9kUGx1Z2luKG9iaiwgY29udGVudEVsZW1lbnQpOwotCQkJfQotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIENvbnRlbnRDYXRlZ29yaWVzR3JvdXBJdGVtUHJvdmlkZXIpIHsKLQkJCQlyZXR1cm4gYWNjZXB0Q2F0ZWdvcmllc0dyb3VwKG9iaiwgTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJCS5nZXRTdHJpbmcoIl9VSV9Ub29sc19ncm91cCIpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFRvb2wpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0gZWxzZSBpZiAoZmlsdGVyVHlwZVN0cmluZy5lcXVhbHMoRmlsdGVyQ29uc3RhbnRzLlJPTEVTKSkgeyAKLQotCQkJaWYgKCFoZWxwZXIubWF0Y2hQYXR0ZXJuQmFzZWRPblR5cGUob2JqKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkvLyBpZihvYmogaW5zdGFuY2VvZiBEaXNjaXBsaW5lKSByZXR1cm4gdHJ1ZTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pIHsKLQkJCQlyZXR1cm4gYWNjZXB0TWV0aG9kUGx1Z2luKG9iaiwgY29udGVudEVsZW1lbnQpOwotCQkJfQotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIENvbnRlbnRQYWNrYWdlKQotCQkJCXJldHVybiB0cnVlOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFJvbGUpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0gZWxzZSBpZiAoZmlsdGVyVHlwZVN0cmluZy5lcXVhbHMoRmlsdGVyQ29uc3RhbnRzLlRBU0tTKSkgeyAKLQotCQkJaWYgKCFoZWxwZXIubWF0Y2hQYXR0ZXJuQmFzZWRPblR5cGUob2JqKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkvLyBpZihvYmogaW5zdGFuY2VvZiBEaXNjaXBsaW5lKSByZXR1cm4gdHJ1ZTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pIHsKLQkJCQlyZXR1cm4gYWNjZXB0TWV0aG9kUGx1Z2luKG9iaiwgY29udGVudEVsZW1lbnQpOwotCQkJfQotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIENvbnRlbnRQYWNrYWdlKQotCQkJCXJldHVybiB0cnVlOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFRhc2spCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0gZWxzZSBpZiAoZmlsdGVyVHlwZVN0cmluZy5lcXVhbHMoRmlsdGVyQ29uc3RhbnRzLldPUktQUk9EVUNUUykpIHsgCi0KLQkJCWlmICghaGVscGVyLm1hdGNoUGF0dGVybkJhc2VkT25UeXBlKG9iaikpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJLy8gaWYob2JqIGluc3RhbmNlb2YgRGlzY2lwbGluZSkgcmV0dXJuIHRydWU7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luKSB7Ci0JCQkJcmV0dXJuIGFjY2VwdE1ldGhvZFBsdWdpbihvYmosIGNvbnRlbnRFbGVtZW50KTsKLQkJCX0KLQkJCWlmIChvYmogaW5zdGFuY2VvZiBDb250ZW50UGFja2FnZSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBXb3JrUHJvZHVjdCkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfSBlbHNlIGlmIChmaWx0ZXJUeXBlU3RyaW5nLmVxdWFscyhGaWx0ZXJDb25zdGFudHMuR1VJREFOQ0UpKSB7IAotCi0JCQlpZiAoIWhlbHBlci5tYXRjaFBhdHRlcm5CYXNlZE9uVHlwZShvYmopKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCS8vIGlmKG9iaiBpbnN0YW5jZW9mIERpc2NpcGxpbmUpIHJldHVybiB0cnVlOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikgewotCQkJCXJldHVybiBhY2NlcHRNZXRob2RQbHVnaW4ob2JqLCBjb250ZW50RWxlbWVudCk7Ci0JCQl9Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgR3VpZGFuY2UpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0gZWxzZSBpZiAoZmlsdGVyVHlwZVN0cmluZy5lcXVhbHMoRmlsdGVyQ29uc3RhbnRzLkNIRUNLTElTVFMpKSB7IC8vMTcyOTU2Ci0JCQlpZiAoIWhlbHBlci5tYXRjaFBhdHRlcm5CYXNlZE9uVHlwZShvYmopKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pIHsKLQkJCQlyZXR1cm4gYWNjZXB0TWV0aG9kUGx1Z2luKG9iaiwgY29udGVudEVsZW1lbnQpOwotCQkJfQotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIENvbnRlbnRQYWNrYWdlKQotCQkJCXJldHVybiB0cnVlOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIENoZWNrbGlzdCkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfWVsc2UgaWYgKGZpbHRlclR5cGVTdHJpbmcuZXF1YWxzKEZpbHRlckNvbnN0YW50cy5DT05DRVBUUykpIHsKLQkJCWlmICghaGVscGVyLm1hdGNoUGF0dGVybkJhc2VkT25UeXBlKG9iaikpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikgewotCQkJCXJldHVybiBhY2NlcHRNZXRob2RQbHVnaW4ob2JqLCBjb250ZW50RWxlbWVudCk7Ci0JCQl9Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgQ29uY2VwdCkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQllbHNlIGlmIChmaWx0ZXJUeXBlU3RyaW5nLmVxdWFscyhGaWx0ZXJDb25zdGFudHMuRVhBTVBMRVMpKSB7Ci0JCQlpZiAoIWhlbHBlci5tYXRjaFBhdHRlcm5CYXNlZE9uVHlwZShvYmopKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pIHsKLQkJCQlyZXR1cm4gYWNjZXB0TWV0aG9kUGx1Z2luKG9iaiwgY29udGVudEVsZW1lbnQpOwotCQkJfQotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIENvbnRlbnRQYWNrYWdlKQotCQkJCXJldHVybiB0cnVlOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIEV4YW1wbGUpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX1lbHNlIGlmIChmaWx0ZXJUeXBlU3RyaW5nLmVxdWFscyhGaWx0ZXJDb25zdGFudHMuR1VJREVMSU5FUykpIHsKLQkJCWlmICghaGVscGVyLm1hdGNoUGF0dGVybkJhc2VkT25UeXBlKG9iaikpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikgewotCQkJCXJldHVybiBhY2NlcHRNZXRob2RQbHVnaW4ob2JqLCBjb250ZW50RWxlbWVudCk7Ci0JCQl9Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgR3VpZGVsaW5lKQotCQkJCXJldHVybiB0cnVlOwotCQl9ZWxzZSBpZiAoZmlsdGVyVHlwZVN0cmluZy5lcXVhbHMoRmlsdGVyQ29uc3RhbnRzLkNPTkNFUFRTKSkgewotCQkJaWYgKCFoZWxwZXIubWF0Y2hQYXR0ZXJuQmFzZWRPblR5cGUob2JqKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luKSB7Ci0JCQkJcmV0dXJuIGFjY2VwdE1ldGhvZFBsdWdpbihvYmosIGNvbnRlbnRFbGVtZW50KTsKLQkJCX0KLQkJCWlmIChvYmogaW5zdGFuY2VvZiBDb250ZW50UGFja2FnZSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBDb25jZXB0KQotCQkJCXJldHVybiB0cnVlOwotCQl9ZWxzZSBpZiAoZmlsdGVyVHlwZVN0cmluZy5lcXVhbHMoRmlsdGVyQ29uc3RhbnRzLkVTVElNQVRFX0NPTlNJREVSQVRJT05TKSkgewotCQkJaWYgKCFoZWxwZXIubWF0Y2hQYXR0ZXJuQmFzZWRPblR5cGUob2JqKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luKSB7Ci0JCQkJcmV0dXJuIGFjY2VwdE1ldGhvZFBsdWdpbihvYmosIGNvbnRlbnRFbGVtZW50KTsKLQkJCX0KLQkJCWlmIChvYmogaW5zdGFuY2VvZiBDb250ZW50UGFja2FnZSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX1lbHNlIGlmIChmaWx0ZXJUeXBlU3RyaW5nLmVxdWFscyhGaWx0ZXJDb25zdGFudHMuUFJBQ1RJQ0VTKSkgewotCQkJaWYgKCFoZWxwZXIubWF0Y2hQYXR0ZXJuQmFzZWRPblR5cGUob2JqKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luKSB7Ci0JCQkJcmV0dXJuIGFjY2VwdE1ldGhvZFBsdWdpbihvYmosIGNvbnRlbnRFbGVtZW50KTsKLQkJCX0KLQkJCWlmIChvYmogaW5zdGFuY2VvZiBDb250ZW50UGFja2FnZSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBQcmFjdGljZSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfWVsc2UgaWYgKGZpbHRlclR5cGVTdHJpbmcuZXF1YWxzKEZpbHRlckNvbnN0YW50cy5SRVBPUlRTKSkgewotCQkJaWYgKCFoZWxwZXIubWF0Y2hQYXR0ZXJuQmFzZWRPblR5cGUob2JqKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luKSB7Ci0JCQkJcmV0dXJuIGFjY2VwdE1ldGhvZFBsdWdpbihvYmosIGNvbnRlbnRFbGVtZW50KTsKLQkJCX0KLQkJCWlmIChvYmogaW5zdGFuY2VvZiBDb250ZW50UGFja2FnZSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBSZXBvcnQpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0gZWxzZSBpZiAoZmlsdGVyVHlwZVN0cmluZy5lcXVhbHMoRmlsdGVyQ29uc3RhbnRzLlJFVVNBQkxFX0FTU0VUUykpIHsKLQkJCWlmICghaGVscGVyLm1hdGNoUGF0dGVybkJhc2VkT25UeXBlKG9iaikpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikgewotCQkJCXJldHVybiBhY2NlcHRNZXRob2RQbHVnaW4ob2JqLCBjb250ZW50RWxlbWVudCk7Ci0JCQl9Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgUmV1c2FibGVBc3NldCkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfSBlbHNlIGlmIChmaWx0ZXJUeXBlU3RyaW5nLmVxdWFscyhGaWx0ZXJDb25zdGFudHMuUk9BRE1BUCkpIHsKLQkJCWlmICghaGVscGVyLm1hdGNoUGF0dGVybkJhc2VkT25UeXBlKG9iaikpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikgewotCQkJCXJldHVybiBhY2NlcHRNZXRob2RQbHVnaW4ob2JqLCBjb250ZW50RWxlbWVudCk7Ci0JCQl9Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgUm9hZG1hcCkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfSBlbHNlIGlmIChmaWx0ZXJUeXBlU3RyaW5nLmVxdWFscyhGaWx0ZXJDb25zdGFudHMuU1VQUE9SVElOR19NQVRFUklBTFMpKSB7Ci0JCQlpZiAoIWhlbHBlci5tYXRjaFBhdHRlcm5CYXNlZE9uVHlwZShvYmopKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pIHsKLQkJCQlyZXR1cm4gYWNjZXB0TWV0aG9kUGx1Z2luKG9iaiwgY29udGVudEVsZW1lbnQpOwotCQkJfQotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIENvbnRlbnRQYWNrYWdlKQotCQkJCXJldHVybiB0cnVlOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFN1cHBvcnRpbmdNYXRlcmlhbCkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfSBlbHNlIGlmIChmaWx0ZXJUeXBlU3RyaW5nLmVxdWFscyhGaWx0ZXJDb25zdGFudHMuVEVNUExBVEVTKSkgewotCQkJaWYgKCFoZWxwZXIubWF0Y2hQYXR0ZXJuQmFzZWRPblR5cGUob2JqKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luKSB7Ci0JCQkJcmV0dXJuIGFjY2VwdE1ldGhvZFBsdWdpbihvYmosIGNvbnRlbnRFbGVtZW50KTsKLQkJCX0KLQkJCWlmIChvYmogaW5zdGFuY2VvZiBDb250ZW50UGFja2FnZSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBUZW1wbGF0ZSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfSBlbHNlIGlmIChmaWx0ZXJUeXBlU3RyaW5nLmVxdWFscyhGaWx0ZXJDb25zdGFudHMuVEVSTV9ERUZJTklUSU9OUykpIHsKLQkJCWlmICghaGVscGVyLm1hdGNoUGF0dGVybkJhc2VkT25UeXBlKG9iaikpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikgewotCQkJCXJldHVybiBhY2NlcHRNZXRob2RQbHVnaW4ob2JqLCBjb250ZW50RWxlbWVudCk7Ci0JCQl9Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgVGVybURlZmluaXRpb24pCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0gZWxzZSBpZiAoZmlsdGVyVHlwZVN0cmluZy5lcXVhbHMoRmlsdGVyQ29uc3RhbnRzLlRPT0xfTUVOVE9SUykpIHsKLQkJCWlmICghaGVscGVyLm1hdGNoUGF0dGVybkJhc2VkT25UeXBlKG9iaikpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikgewotCQkJCXJldHVybiBhY2NlcHRNZXRob2RQbHVnaW4ob2JqLCBjb250ZW50RWxlbWVudCk7Ci0JCQl9Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgVG9vbE1lbnRvcikKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfSBlbHNlIGlmIChmaWx0ZXJUeXBlU3RyaW5nLmVxdWFscyhGaWx0ZXJDb25zdGFudHMuV0hJVEVfUEFQRVJTKSkgewotCQkJaWYgKCFoZWxwZXIubWF0Y2hQYXR0ZXJuQmFzZWRPblR5cGUob2JqKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luKSB7Ci0JCQkJcmV0dXJuIGFjY2VwdE1ldGhvZFBsdWdpbihvYmosIGNvbnRlbnRFbGVtZW50KTsKLQkJCX0KLQkJCWlmIChvYmogaW5zdGFuY2VvZiBDb250ZW50UGFja2FnZSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBXaGl0ZXBhcGVyKQotCQkJCXJldHVybiB0cnVlOwotCQl9IGVsc2UgaWYgKGZpbHRlclR5cGVTdHJpbmcuZXF1YWxzKEZpbHRlckNvbnN0YW50cy5DT05URU5UX1BBQ0tBR0VTKSkgewotCi0JCQlpZiAoIWhlbHBlci5tYXRjaFBhdHRlcm4ob2JqKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkvLyBpZihvYmogaW5zdGFuY2VvZiBEaXNjaXBsaW5lKSByZXR1cm4gdHJ1ZTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pIHsKLQkJCQlyZXR1cm4gYWNjZXB0TWV0aG9kUGx1Z2luKG9iaiwgY29udGVudEVsZW1lbnQpOwotCQkJfQotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIENvbnRlbnRQYWNrYWdlKQotCQkJCXJldHVybiB0cnVlOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIEN1c3RvbUNhdGVnb3J5KQotCQkJCXJldHVybiBmYWxzZTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBSb2xlIHx8IG9iaiBpbnN0YW5jZW9mIFRhc2sKLQkJCQkJfHwgb2JqIGluc3RhbmNlb2YgV29ya1Byb2R1Y3QgfHwgb2JqIGluc3RhbmNlb2YgR3VpZGFuY2UpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQkvLyBpZihvYmogaW5zdGFuY2VvZiBHdWlkYW5jZSkgcmV0dXJuIHRydWU7Ci0JCX0gZWxzZSBpZiAoZmlsdGVyVHlwZVN0cmluZy5lcXVhbHMoRmlsdGVyQ29uc3RhbnRzLkNVU1RPTV9DQVRFR09SSUVTKSkgewotCi0JCQlpZiAoIWhlbHBlci5tYXRjaFBhdHRlcm4ob2JqKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkvLyBpZihvYmogaW5zdGFuY2VvZiBEaXNjaXBsaW5lKSByZXR1cm4gdHJ1ZTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pIHsKLQkJCQlyZXR1cm4gYWNjZXB0TWV0aG9kUGx1Z2luKG9iaiwgY29udGVudEVsZW1lbnQpOwotCQkJfQotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIEN1c3RvbUNhdGVnb3J5KQotCQkJCXJldHVybiB0cnVlOwotCQl9IGVsc2UgaWYgKGZpbHRlclR5cGVTdHJpbmcuZXF1YWxzKEZpbHRlckNvbnN0YW50cy5QUk9DRVNTRVMpKSB7Ci0KLQkJCWlmICghaGVscGVyLm1hdGNoUGF0dGVybkJhc2VkT25UeXBlKG9iaikpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJLy8gaWYob2JqIGluc3RhbmNlb2YgRGlzY2lwbGluZSkgcmV0dXJuIHRydWU7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luKSB7Ci0JCQkJcmV0dXJuIGFjY2VwdE1ldGhvZFBsdWdpbihvYmosIGNvbnRlbnRFbGVtZW50KTsKLQkJCX0KLQkJCWlmIChvYmogaW5zdGFuY2VvZiBDdXN0b21DYXRlZ29yeSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgUHJvY2Vzc2VzSXRlbVByb3ZpZGVyKSB7Ci0JCQkJQ29sbGVjdGlvbiBsaXN0ID0gKChQcm9jZXNzZXNJdGVtUHJvdmlkZXIpIG9iaikKLQkJCQkJCS5nZXRDaGlsZHJlbihvYmopOwotCQkJCWZvciAoSXRlcmF0b3IgaW9yID0gbGlzdC5pdGVyYXRvcigpOyBpb3IuaGFzTmV4dCgpOykgewotCQkJCQlPYmplY3Qgb2JqZWN0ID0gaW9yLm5leHQoKTsKLQkJCQkJaWYgKCgoQ2F0ZWdvcml6ZWRQcm9jZXNzZXNJdGVtUHJvdmlkZXIpIG9iamVjdCkKLQkJCQkJCQkuZ2V0Q2hpbGRyZW4ob2JqZWN0KS5pc0VtcHR5KCkpCi0JCQkJCQlpb3IucmVtb3ZlKCk7Ci0JCQkJfQotCQkJCWlmIChsaXN0LmlzRW1wdHkoKSkKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCWVsc2UKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgUHJvY2Vzc1BhY2thZ2UpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudCkKLQkJCQkvL3JldHVybiB0cnVlOwotCQkJCXJldHVybiBjaGlsZEFjY2VwdChvYmopOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBjaGlsZEFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBNZXRob2RDb25maWd1cmF0aW9uKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpZihvYmogaW5zdGFuY2VvZiBNaWxlc3RvbmUpIHJldHVybiBmYWxzZTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLy8gcHVibGljIEZpbHRlckhlbHBlciBnZXRIZWxwZXIoKSB7Ci0JLy8gcmV0dXJuIGhlbHBlcjsKLQkvLyB9Ci0JLy8KLQkvLwkKLQkvLyBwdWJsaWMgdm9pZCBzZXRIZWxwZXIoRmlsdGVySGVscGVyIGhlbHBlcikgewotCS8vIHRoaXMuaGVscGVyID0gaGVscGVyOwotCS8vIH0KLQlwcm90ZWN0ZWQgTGlzdCBnZXRBbmNlc3RvcnMoQ3VzdG9tQ2F0ZWdvcnkgbWV0aG9kT2JqZWN0KSB7Ci0JCUxpc3QgYW5jZXN0b3JMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCUxpc3Qgb2JqTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJb2JqTGlzdC5hZGQobWV0aG9kT2JqZWN0KTsKLQotCQlnZXRBbmNlc3RvcnMoYW5jZXN0b3JMaXN0LCBvYmpMaXN0KTsKLQotCQlyZXR1cm4gYW5jZXN0b3JMaXN0OwotCX0KLQotCXByb3RlY3RlZCBMaXN0IGdldEFuY2VzdG9ycyhMaXN0IGFuY2VzdG9yTGlzdCwgTGlzdCBtZXRob2RPYmplY3RMaXN0KSB7Ci0JCWlmIChtZXRob2RPYmplY3RMaXN0LmlzRW1wdHkoKSkKLQkJCXJldHVybiBhbmNlc3Rvckxpc3Q7Ci0KLQkJTGlzdCBhbGxQYXJlbnRDdXN0Q2F0cyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBtZXRob2RPYmplY3RMaXN0Lml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJQ3VzdG9tQ2F0ZWdvcnkgZWxlbWVudCA9IChDdXN0b21DYXRlZ29yeSkgaXRlci5uZXh0KCk7Ci0JCQlMaXN0IHBhcmVudExpc3QgPSBBc3NvY2lhdGlvbkhlbHBlci5nZXRDdXN0b21DYXRlZ29yaWVzKGVsZW1lbnQpOwotCQkJYWxsUGFyZW50Q3VzdENhdHMuYWRkQWxsKHBhcmVudExpc3QpOwotCi0JCX0KLQotCQlhbmNlc3Rvckxpc3QuYWRkQWxsKG1ldGhvZE9iamVjdExpc3QpOwotCQlMaXN0IG5leHRDaGVja0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGFsbFBhcmVudEN1c3RDYXRzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyLm5leHQoKTsKLQkJCWlmICghYW5jZXN0b3JMaXN0LmNvbnRhaW5zKGVsZW1lbnQpKQotCQkJCW5leHRDaGVja0xpc3QuYWRkKGVsZW1lbnQpOwotCQl9Ci0KLQkJcmV0dXJuIGdldEFuY2VzdG9ycyhhbmNlc3Rvckxpc3QsIG5leHRDaGVja0xpc3QpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGFjY2VwdE1ldGhvZFBsdWdpbihPYmplY3Qgb2JqLCBPYmplY3QgY29udGVudEVsZW1lbnQpIHsKLQkJaWYgKGNvbnRlbnRFbGVtZW50ICE9IG51bGwpIHsKLQkJCWlmIChNZXRob2RFbGVtZW50VXRpbC5nZXRBbGxNb2RlbHMoY29udGVudEVsZW1lbnQpLmNvbnRhaW5zKG9iaikpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQllbHNlCi0JCQkJcmV0dXJuIGZhbHNlOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBhY2NlcHRDYXRlZ29yaWVzR3JvdXAoT2JqZWN0IG9iaiwgU3RyaW5nIHR5cGUpIHsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIENvbnRlbnRDYXRlZ29yaWVzR3JvdXBJdGVtUHJvdmlkZXIpIHsKLQkJCUNvbGxlY3Rpb24gbGlzdCA9ICgoQ29udGVudENhdGVnb3JpZXNHcm91cEl0ZW1Qcm92aWRlcikgb2JqKQotCQkJCQkuZ2V0Q2hpbGRyZW4ob2JqKTsKLQkJCWlmIChsaXN0LmlzRW1wdHkoKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlpZiAoKChDb250ZW50Q2F0ZWdvcmllc0dyb3VwSXRlbVByb3ZpZGVyKSBvYmopLmdldFRleHQob2JqKS5lcXVhbHMoCi0JCQkJCXR5cGUpKQotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZmlsdGVycy9DYXRlZ29yeUZpbHRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9maWx0ZXJzL0NhdGVnb3J5RmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjZjhjYTAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9maWx0ZXJzL0NhdGVnb3J5RmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZpbHRlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLklDYXRlZ29yeUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRDYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotCi0KLS8qKgotICogRmlsdGVyIGZvciB7QGxpbmsgQ29udGVudENhdGVnb3J5fQotICogCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIENhdGVnb3J5RmlsdGVyIGV4dGVuZHMgQWJzdHJhY3RCYXNlRmlsdGVyIGltcGxlbWVudHMKLQkJSUNhdGVnb3J5RmlsdGVyIHsKLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuSUNhdGVnb3J5RmlsdGVyI2dldENhdGVnb3J5UGFja2FnZVBhdGgoKQotCSAqLwotCXB1YmxpYyBTdHJpbmdbXSBnZXRDYXRlZ29yeVBhY2thZ2VQYXRoKCkgewotCQlyZXR1cm4gaGVscGVyLmdldFBhdGhCYXNlZE9uVGFiU3RyaW5nKGhlbHBlci5nZXRDb250ZW50Q2F0ZWdvcnlUYWJTdHIoKSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5JQ2F0ZWdvcnlGaWx0ZXIjZ2V0T2JqZWN0KCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldE9iamVjdCgpIHsKLQkJcmV0dXJuIGhlbHBlci5nZXRDb250ZW50RWxlbWVudCgpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuSUZpbHRlciNhY2NlcHQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoT2JqZWN0IG9iaikgewotCQkvLyBpZiBjYW4ndCBiZSBhY2NkZXB0ZWQgYnkgc3VwZXIsIHJldHVybi4KLQkJaWYgKCFzdXBlci5hY2NlcHQob2JqKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJaWYgKCFoZWxwZXIuY2hlY2tPYmplY3RBY2NlcHRlZChvYmopKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCWlmIChvYmogaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pIHsKLQkJCXJldHVybiBoZWxwZXIuYWNjZXB0TWV0aG9kUGx1Z2luKG9iaik7Ci0JCX0KLQkJaWYgKGNoaWxkQWNjZXB0KG9iaikpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGNoaWxkQWNjZXB0KE9iamVjdCBvYmopIHsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIENvbnRlbnRFbGVtZW50KQotCQkJcmV0dXJuIHRydWU7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZmlsdGVycy9Db250ZW50RmlsdGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2ZpbHRlcnMvQ29udGVudEZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNDY5MDQ2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZmlsdGVycy9Db250ZW50RmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZpbHRlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLklDb250ZW50RmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci0KLQotLyoqCi0gKiBGaWx0ZXIgaW1wbGVtZW50cyB7QGxpbmsgSUNvbnRlbnRGaWx0ZXJ9LiBGaWx0ZXIgY29udGVudCBlbGVtZW50IGluIGNvbnRlbnQgcGFja2FnZS4gCi0gKiAKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIENvbnRlbnRGaWx0ZXIgZXh0ZW5kcyBBYnN0cmFjdEJhc2VGaWx0ZXIgaW1wbGVtZW50cyBJQ29udGVudEZpbHRlciB7Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLklDb250ZW50RmlsdGVyI2dldENvbnRlbnRQYWNrYWdlUGF0aCgpCi0JICovCi0JcHVibGljIFN0cmluZ1tdIGdldENvbnRlbnRQYWNrYWdlUGF0aCgpIHsKLQkJcmV0dXJuIGhlbHBlci5nZXRQYXRoQmFzZWRPblRhYlN0cmluZyhoZWxwZXIuZ2V0VGFiU3RyKCkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuSUNvbnRlbnRGaWx0ZXIjZ2V0T2JqZWN0KCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldE9iamVjdCgpIHsKLQkJcmV0dXJuIGhlbHBlci5nZXRDb250ZW50RWxlbWVudCgpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuSUZpbHRlciNhY2NlcHQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoT2JqZWN0IG9iaikgewotCQkvLyBpZiBjYW4ndCBiZSBhY2NkZXB0ZWQgYnkgc3VwZXIsIHJldHVybi4KLQkJaWYgKCFzdXBlci5hY2NlcHQob2JqKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJLy8gZnVydGhlciBmaWx0ZXJpbmcKLQkJaWYgKCFoZWxwZXIuY2hlY2tPYmplY3RBY2NlcHRlZChvYmopKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCWlmIChvYmogaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pIHsKLQkJCXJldHVybiBoZWxwZXIuYWNjZXB0TWV0aG9kUGx1Z2luKG9iaik7Ci0JCX0KLQotCQlpZiAoY2hpbGRBY2NlcHQob2JqKSkKLQkJCXJldHVybiB0cnVlOwotCi0JCWlmIChvYmogaW5zdGFuY2VvZiBDb250ZW50UGFja2FnZSkgewotCQkJcmV0dXJuIGhlbHBlci5hY2NlcHRDb250ZW50UGFja2FnZShvYmopOwotCQl9Ci0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGNoaWxkQWNjZXB0KE9iamVjdCBvYmopIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9maWx0ZXJzL0N1c3RvbUNhdGVnb3J5RmlsdGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2ZpbHRlcnMvQ3VzdG9tQ2F0ZWdvcnlGaWx0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTg1NDBkOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2ZpbHRlcnMvQ3VzdG9tQ2F0ZWdvcnlGaWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZmlsdGVyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuSUN1c3RvbUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkN1c3RvbUNhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotCi0KLS8qKgotICogRmlsdGVyIHNwZWNpZmljIGZvciB7QGxpbmsgQ3VzdG9tQ2F0ZWdvcnl9IGVsZW1lbnRzLiAKLSAqIAotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBDdXN0b21DYXRlZ29yeUZpbHRlciBleHRlbmRzIEFic3RyYWN0QmFzZUZpbHRlciBpbXBsZW1lbnRzCi0JCUlDdXN0b21GaWx0ZXIgewotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5JQ3VzdG9tRmlsdGVyI2dldENvbnRlbnRQYWNrYWdlUGF0aCgpCi0JICovCi0JcHVibGljIFN0cmluZ1tdIGdldENvbnRlbnRQYWNrYWdlUGF0aCgpIHsKLQkJcmV0dXJuIGhlbHBlci5nZXRQYXRoQmFzZWRPblRhYlN0cmluZyhoZWxwZXIuZ2V0VGFiU3RyKCkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuSUN1c3RvbUZpbHRlciNnZXRPYmplY3QoKQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0T2JqZWN0KCkgewotCQlyZXR1cm4gaGVscGVyLmdldENvbnRlbnRFbGVtZW50KCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5JQ3VzdG9tRmlsdGVyI2dldFN0cmluZygpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTdHJpbmcoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuSUZpbHRlciNhY2NlcHQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoT2JqZWN0IG9iaikgewotCQkvLyBpZiBjYW4ndCBiZSBhY2NkZXB0ZWQgYnkgc3VwZXIsIHJldHVybi4KLQkJaWYgKCFzdXBlci5hY2NlcHQob2JqKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJaWYgKCFoZWxwZXIuY2hlY2tPYmplY3RBY2NlcHRlZChvYmopKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCWlmIChvYmogaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pIHsKLQkJCXJldHVybiBoZWxwZXIuYWNjZXB0TWV0aG9kUGx1Z2luKG9iaik7Ci0JCX0KLQotCQlpZiAoY2hpbGRBY2NlcHQob2JqKSkKLQkJCXJldHVybiB0cnVlOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGNoaWxkQWNjZXB0KE9iamVjdCBvYmopIHsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIEN1c3RvbUNhdGVnb3J5KQotCQkJcmV0dXJuIHRydWU7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZmlsdGVycy9EZXNjcmlwdG9yQ29uZmlndXJhdGlvbkZpbHRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9maWx0ZXJzL0Rlc2NyaXB0b3JDb25maWd1cmF0aW9uRmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5MWY3NjMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9maWx0ZXJzL0Rlc2NyaXB0b3JDb25maWd1cmF0aW9uRmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5maWx0ZXJzOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb25GaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5GaWx0ZXJIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuc2VydmljZXMuU2FmZVVwZGF0ZUNvbnRyb2xsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotCi0KLS8qKgotICogIE1ldGhvZCBjb25maWd1cmF0aW9uIHNwZWNpZmljIGZpbHRlciBmb3IgZmlsdGVyaW5nIGVsZW1lbnRzIGJhc2VkIG9uIGZpbHRlciBwYXR0ZXJuCi0gKiAgYW5kIHR5cGUgYWZ0ZXIgZWxlbWVudHMgYXJlIHJlYWxpemVkIHdpdGhpbiB0aGUgc3BlY2lmaWVkIGNvbmZpZ3VyYWl0b24uCi0gKiAKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRGVzY3JpcHRvckNvbmZpZ3VyYXRpb25GaWx0ZXIgZXh0ZW5kcyBDb25maWd1cmF0aW9uRmlsdGVyIHsKLQotCVN0cmluZyBmaWx0ZXJTdHI7Ci0KLQlNZXRob2RDb25maWd1cmF0aW9uIG1ldGhvZENvbmZpZ3VyYXRpb247Ci0KLQlwcm90ZWN0ZWQgRmlsdGVySGVscGVyIGhlbHBlcjsKLQotCXByb3RlY3RlZCBWaWV3ZXIgdmlld2VyOwotCQotCS8qKgotCSAqIEBwYXJhbSBtZXRob2RDb25maWcKLQkgKiBAcGFyYW0gdmlld2VyCi0JICovCi0JcHVibGljIERlc2NyaXB0b3JDb25maWd1cmF0aW9uRmlsdGVyKE1ldGhvZENvbmZpZ3VyYXRpb24gbWV0aG9kQ29uZmlnLAotCQkJVmlld2VyIHZpZXdlciwgU3RyaW5nIGZpbHRlclN0cikgewotCQlzdXBlcihtZXRob2RDb25maWcpOwotCQl0aGlzLnZpZXdlciA9IHZpZXdlcjsKLQkJdGhpcy5maWx0ZXJTdHIgPSBmaWx0ZXJTdHI7Ci0JCXRoaXMubWV0aG9kQ29uZmlndXJhdGlvbiA9IG1ldGhvZENvbmZpZzsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKGZpbmFsIE5vdGlmaWNhdGlvbiBtc2cpIHsKLQkJaWYgKHZpZXdlciA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkKLQkJU2FmZVVwZGF0ZUNvbnRyb2xsZXIuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCXN3aXRjaCAobXNnLmdldEV2ZW50VHlwZSgpKSB7Ci0JCQkJY2FzZSBOb3RpZmljYXRpb24uQUREOgotCQkJCWNhc2UgTm90aWZpY2F0aW9uLkFERF9NQU5ZOgotCQkJCWNhc2UgTm90aWZpY2F0aW9uLlJFTU9WRToKLQkJCQljYXNlIE5vdGlmaWNhdGlvbi5SRU1PVkVfTUFOWToKLQkJCQkJdmlld2VyLnJlZnJlc2goKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JfQotCQotCXB1YmxpYyBib29sZWFuIGFjY2VwdChPYmplY3Qgb2JqKSB7Ci0KLQkJaWYgKG9iaiBpbnN0YW5jZW9mIE1ldGhvZENvbmZpZ3VyYXRpb24pIHsKLQkJCXJldHVybiBtZXRob2RDb25maWd1cmF0aW9uLmVxdWFscyhvYmopOwotCQl9Ci0KLQkJaWYgKCFzdXBlci5hY2NlcHQob2JqKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJaWYoaGVscGVyICE9IG51bGwpIHsKLQkJCWlmIChoZWxwZXIuaXNTaG93UHJlc2VudGF0aW9uTmFtZSgpKSB7Ci0JCQkJaWYgKCFoZWxwZXIubWF0Y2hQYXR0ZXJuT25QcmVzZW50YXRpb25OYW1lKG9iaikpCi0JCQkJCXJldHVybiBmYWxzZTsKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKCFoZWxwZXIubWF0Y2hQYXR0ZXJuKG9iaikpCi0JCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCWlmICghaGVscGVyLmlzT2JqZWN0SW5TZWxlY3RlZEl0ZW1zKG9iaikpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWlmIChjaGlsZEFjY2VwdChvYmopKQotCQkJcmV0dXJuIHRydWU7Ci0JCXJldHVybiBmYWxzZTsKLQotCX0KLQotCXB1YmxpYyBqYXZhLnV0aWwuQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqLAotCQkJb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZSBjaGlsZEZlYXR1cmUpIHsKLQkJLy8gcmV0dXJuIHN1cGVyLmdldENoaWxkcmVuKG9iaiwgY2hpbGRGZWF0dXJlKTsKLQkJLy8gTW9kaWZpZWQgY29kZSB0byBoYW5kbGUgdGhlIGZpbHRlcmluZwotCQkvLyB0byBjaGVjayBpZiB0aGUgdmFyaWFiaWxpdHkgb2YgcGFyZW50IGlzIG5vdCBOL0EsIGZpbHRlciBvdXQgYWxyZWFkeQotCQkvLyBleGlzaXRuZwotCQkvLyBlbGVtZW50IGZyb20gY2hpbGRyZW4gbGlzdC4KLQkJQ29sbGVjdGlvbiBjb2wgPSBzdXBlci5nZXRDaGlsZHJlbihvYmosIGNoaWxkRmVhdHVyZSk7Ci0JCWlmKGNvbCAhPSBudWxsKXsKLQkJZm9yIChJdGVyYXRvciBpdG9yID0gY29sLml0ZXJhdG9yKCk7IGl0b3IuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGVsZW1lbnQgPSBpdG9yLm5leHQoKTsKLQkJCWlmICghYWNjZXB0KGVsZW1lbnQpKQotCQkJCWl0b3IucmVtb3ZlKCk7Ci0JCX0KLQkJfWVsc2V7Ci0JCQljb2wgPSBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCQl9Ci0KLQkJcmV0dXJuIGNvbDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjaGlsZEFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRIZWxwZXIoRmlsdGVySGVscGVyIGhlbHBlcikgewotCQl0aGlzLmhlbHBlciA9IGhlbHBlcjsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0TWV0aG9kQ29uZmlndXJhdGlvbihNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZykKLQl7Ci0JCXN1cGVyLnNldE1ldGhvZENvbmZpZ3VyYXRpb24oY29uZmlnKTsKLQkJdGhpcy5tZXRob2RDb25maWd1cmF0aW9uID0gY29uZmlnOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9maWx0ZXJzL0Rlc2NyaXB0b3JQcm9jZXNzRmlsdGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2ZpbHRlcnMvRGVzY3JpcHRvclByb2Nlc3NGaWx0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTZhMjA2YS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2ZpbHRlcnMvRGVzY3JpcHRvclByb2Nlc3NGaWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZpbHRlcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwucmVnZXguTWF0Y2hlcjsKLWltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uUHJvY2Vzc0NvbmZpZ3VyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5JUHJvY2Vzc0ZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudDsKLQotCi0vKioKLSAqIHtAbGluayBQcm9jZXNzfSBmaWx0ZXIgZm9yIGZpbHRlcmluZyB7QGxpbmsgUHJvY2Vzc30gZWxlbWVudHMuIAotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBEZXNjcmlwdG9yUHJvY2Vzc0ZpbHRlciBleHRlbmRzIEFic3RyYWN0QmFzZUZpbHRlciBpbXBsZW1lbnRzCi0JCUlQcm9jZXNzRmlsdGVyIHsKLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuSUZpbHRlciNnZXRPYmplY3QoKQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0T2JqZWN0KCkgewotCQlyZXR1cm4gaGVscGVyLmdldENvbnRlbnRFbGVtZW50KCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5JRmlsdGVyI2FjY2VwdChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBib29sZWFuIGFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCS8vIGlmIGNhbid0IGJlIGFjY2RlcHRlZCBieSBzdXBlciwgcmV0dXJuLgotCQlpZiAoIXN1cGVyLmFjY2VwdChvYmopKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlpZiAoIWhlbHBlci5pc09iamVjdEluU2VsZWN0ZWRJdGVtcyhvYmopKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAoIW1hdGNoUGF0dGVybihvYmopKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAob2JqIGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkKLQkJCXJldHVybiB0cnVlOwotCQlpZiAob2JqIGluc3RhbmNlb2YgUHJvY2VzcykKLQkJCXJldHVybiB0cnVlOwotCQlpZiAoY2hpbGRBY2NlcHQob2JqKSkKLQkJCXJldHVybiB0cnVlOwotCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBjaGlsZEFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBtYXRjaFBhdHRlcm4oT2JqZWN0IG9iaikgewotCQkvLyBpZiBubyB2YWxpZCBmaWx0ZXIgdHlwZSBvciBwYXR0ZXJuLCBhbHdheXMgcmV0dXJuIHRydWUKLQkJU3RyaW5nIGZpbHRlclR5cGVTdHIgPSBoZWxwZXIuZ2V0RmlsdGVyVHlwZVN0cigpOwotCQkvLyBTdHJpbmcgcGF0dGVybiA9IGhlbHBlci5nZXRQYXR0ZXJuKCk7Ci0JCVN0cmluZyB0YWJTdHIgPSBoZWxwZXIuZ2V0VGFiU3RyKCk7Ci0JCVBhdHRlcm4gcmVnZXhQYXR0ZXJuID0gaGVscGVyLmdldFJlZ2V4UGF0dGVybigpOwotCQlpZiAoaGVscGVyLmdldEZpbHRlclR5cGVTdHIoKSA9PSBudWxsIHx8IGhlbHBlci5nZXRQYXR0ZXJuKCkgPT0gbnVsbAotCQkJCXx8IGhlbHBlci5nZXRQYXR0ZXJuKCkuZXF1YWxzSWdub3JlQ2FzZSgiIikpIC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiB0cnVlOwotCi0JCWlmIChmaWx0ZXJUeXBlU3RyLmVxdWFsc0lnbm9yZUNhc2UodGFiU3RyKSkgewotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnQpIHsKLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgQWN0aXZpdHkpCi0JCQkJCXJldHVybiB0cnVlOwotCQkJCU1hdGNoZXIgbSA9IHJlZ2V4UGF0dGVybi5tYXRjaGVyKCgoQnJlYWtkb3duRWxlbWVudCkgb2JqKQotCQkJCQkJLmdldE5hbWUoKSk7Ci0JCQkJYm9vbGVhbiBmb3VuZCA9IG0ubWF0Y2hlcygpOwotCQkJCWlmIChmb3VuZCkKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJZWxzZSB7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCS8vIGVsc2UgZm9yIGFsbCBvdGhlciB0eXBlcyBvZiBlbGVtZW50cwotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9IGVsc2UKLQkJCS8vIHRoZSBBbGwgY2FzZQotCQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZ2V0QWN0aXZpdGllc0luU2NvcGUoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksCi0JCQlCcmVha2Rvd25FbGVtZW50IGVsZW1lbnQsIExpc3QgYWN0aXZpdHlMaXN0KSB7Ci0JCUl0ZW1Qcm92aWRlckFkYXB0ZXIgYWRhcHRlciA9IChJdGVtUHJvdmlkZXJBZGFwdGVyKSBhZGFwdGVyRmFjdG9yeQotCQkJCS5hZGFwdChlbGVtZW50LCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQlPYmplY3QgcGFyZW50ID0gYWRhcHRlci5nZXRQYXJlbnQoZWxlbWVudCk7Ci0JCWlmIChwYXJlbnQgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJYWN0aXZpdHlMaXN0LmFkZChwYXJlbnQpOwotCQkJZ2V0QWN0aXZpdGllc0luU2NvcGUoYWRhcHRlckZhY3RvcnksIChCcmVha2Rvd25FbGVtZW50KSBwYXJlbnQsCi0JCQkJCWFjdGl2aXR5TGlzdCk7Ci0JCX0KLQl9Ci0JcHVibGljIERlc2NyaXB0b3JQcm9jZXNzRmlsdGVyKE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0JCXNldEFkZGl0aW9uYWxGaWx0ZXJzKG5ldyBJRmlsdGVyW10geyBuZXcgUHJvY2Vzc0NvbmZpZ3VyYXRvcihjb25maWcpIH0pOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9maWx0ZXJzL0V4UHJvY2Vzc0F1dGhvcmluZ0NvbmZpZ3VyYXRvci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9maWx0ZXJzL0V4UHJvY2Vzc0F1dGhvcmluZ0NvbmZpZ3VyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOWEyNjQ0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZmlsdGVycy9FeFByb2Nlc3NBdXRob3JpbmdDb25maWd1cmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNiArMCwwIEBACi0vKioKLSAqIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZmlsdGVyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLlByb2Nlc3NBdXRob3JpbmdDb25maWd1cmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5GaWx0ZXJIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuc2VydmljZXMuU2FmZVVwZGF0ZUNvbnRyb2xsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5MaWJyYXJ5VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci0KLS8qKgotICogQ29uZmlndXJhdGlvbiBmaWx0ZXIgdGhhdCBzdGlsbCBzaG93cyBjZXJ0YWluIGVsZW1lbnRzIGR1cmluZyBwcm9jZXNzIGF1dGhvcmluZyB0aGF0Ci0gKiBQcm9jZXNzQ29uZmlndXJhdG9yIGRvZXMgbm90IHNob3cuIEZpbHRlciBlbGVtZW50cyBiYXNlZCBvbiBzZWFyY2ggcGF0dGVybiBhbmQgdHlwZS4KLSAqIEBhdXRob3Igc2thbm5vb3IKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBFeFByb2Nlc3NBdXRob3JpbmdDb25maWd1cmF0b3IgZXh0ZW5kcwotCQlQcm9jZXNzQXV0aG9yaW5nQ29uZmlndXJhdG9yIHsKLQotCVN0cmluZyBmaWx0ZXJTdHI7Ci0KLQlNZXRob2RDb25maWd1cmF0aW9uIG1ldGhvZENvbmZpZ3VyYXRpb247Ci0JVmlld2VyIHZpZXdlcjsKLQkKLQlwcm90ZWN0ZWQgRmlsdGVySGVscGVyIGhlbHBlcjsKLQkvKioKLQkgKiBAcGFyYW0gbWV0aG9kQ29uZmlnCi0JICogQHBhcmFtIHZpZXdlcgotCSAqLwotCXB1YmxpYyBFeFByb2Nlc3NBdXRob3JpbmdDb25maWd1cmF0b3IoTWV0aG9kQ29uZmlndXJhdGlvbiBtZXRob2RDb25maWcsCi0JCQlWaWV3ZXIgdmlld2VyKSB7Ci0JCXN1cGVyKG1ldGhvZENvbmZpZyk7Ci0JCXRoaXMudmlld2VyID0gdmlld2VyOwotCQkvL3RoaXMuZmlsdGVyU3RyID0gZmlsdGVyU3RyOwotCQl0aGlzLm1ldGhvZENvbmZpZ3VyYXRpb24gPSBtZXRob2RDb25maWc7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY29uc3RydWN0b3Igc3R1YgotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVySW1wbCNub3RpZnlDaGFuZ2VkKG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKGZpbmFsIE5vdGlmaWNhdGlvbiBtc2cpIHsKLQkJaWYgKHZpZXdlciA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlTYWZlVXBkYXRlQ29udHJvbGxlci5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJc3dpdGNoIChtc2cuZ2V0RXZlbnRUeXBlKCkpIHsKLQkJCQljYXNlIE5vdGlmaWNhdGlvbi5BREQ6Ci0JCQkJY2FzZSBOb3RpZmljYXRpb24uQUREX01BTlk6Ci0JCQkJY2FzZSBOb3RpZmljYXRpb24uUkVNT1ZFOgotCQkJCWNhc2UgTm90aWZpY2F0aW9uLlJFTU9WRV9NQU5ZOgotCQkJCQl2aWV3ZXIucmVmcmVzaCgpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gYWNjZXB0KE9iamVjdCBvYmopIHsKLQotCQlpZihvYmogPT0gbnVsbCkgcmV0dXJuIGZhbHNlOwotCQkKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIE1ldGhvZENvbmZpZ3VyYXRpb24pIHsKLQkJCXJldHVybiBtZXRob2RDb25maWd1cmF0aW9uLmVxdWFscyhvYmopOwotCQl9Ci0KLS8vCQlpZiAoIXN1cGVyLmFjY2VwdChvYmopKQotLy8JCQlyZXR1cm4gZmFsc2U7Ci0JCWlmIChtZXRob2RDb25maWcgPT0gbnVsbCkKLQkJCXJldHVybiB0cnVlOwotCi0JCW9iaiA9IExpYnJhcnlVdGlsLnVud3JhcChvYmopOwotCi0vLwkJaWYgKG9iaiBpbnN0YW5jZW9mIE1ldGhvZFBhY2thZ2UpIHsKLS8vCQkJcmV0dXJuIG1ldGhvZENvbmZpZy5nZXRNZXRob2RQYWNrYWdlU2VsZWN0aW9uKCkuY29udGFpbnMob2JqKTsKLS8vCQl9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIEl0ZW1Qcm92aWRlckFkYXB0ZXIpIHsKLS8vCQkJcmV0dXJuIHRydWU7Ci0vLwkJfSBlbHNlIHsKLS8vCQkJaWYoTG9nLkRFQlVHKSB7Ci0vLwkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIk9iamVjdCBmaWx0ZXJlZDogIiArIChvYmogPT0gbnVsbCA/IG51bGwgOiBvYmoudG9TdHJpbmcoKSkpOyAvLyROT04tTkxTLTEkCi0vLwkJCX0KLS8vCQl9Ci0JCWlmIChoZWxwZXIuaXNTaG93UHJlc2VudGF0aW9uTmFtZSgpKSB7Ci0JCQlpZiAoIWhlbHBlci5tYXRjaFBhdHRlcm5PblByZXNlbnRhdGlvbk5hbWUob2JqKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoIWhlbHBlci5tYXRjaFBhdHRlcm4ob2JqKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJaWYgKCFoZWxwZXIuaXNPYmplY3RJblNlbGVjdGVkSXRlbXMob2JqKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJaWYgKGNoaWxkQWNjZXB0KG9iaikpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJcmV0dXJuIGZhbHNlOwotCi0JfQotCi0JcHVibGljIGJvb2xlYW4gY2hpbGRBY2NlcHQoT2JqZWN0IG9iaikgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0SGVscGVyKEZpbHRlckhlbHBlciBoZWxwZXIpIHsKLQkJdGhpcy5oZWxwZXIgPSBoZWxwZXI7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldE1ldGhvZENvbmZpZ3VyYXRpb24oTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcpCi0JewotCQlzdXBlci5zZXRNZXRob2RDb25maWd1cmF0aW9uKGNvbmZpZyk7Ci0JCXRoaXMubWV0aG9kQ29uZmlndXJhdGlvbiA9IGNvbmZpZzsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2ZpbHRlcnMvR3VpZGFuY2VGaWx0ZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZmlsdGVycy9HdWlkYW5jZUZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNDNkOGJiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZmlsdGVycy9HdWlkYW5jZUZpbHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5maWx0ZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5GaWx0ZXJJbml0aWFsaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNoZWNrbGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbmNlcHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5FeGFtcGxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3VpZGFuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HdWlkZWxpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5SZXBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5SZXVzYWJsZUFzc2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuU3VwcG9ydGluZ01hdGVyaWFsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFzazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRlbXBsYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVG9vbE1lbnRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0OwotCi0KLS8qKgotICogRmlsdGVyIGZvciB7QGxpbmsgR3VpZGFuY2V9IHR5cGUgZWxlbWVudHMuCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEd1aWRhbmNlRmlsdGVyIGV4dGVuZHMgQ29udGVudEZpbHRlciB7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBjaGlsZEFjY2VwdChPYmplY3Qgb2JqKSB7Ci0vLwkJIFdoZW4gdHlwZSBpcyBzZWxlY3RlZCBhbGxvdyB0aG9zZSBDbGFzcyB0eXBlcyB0byBkaXNwbGF5LgotCQlDbGFzcyBjbHMgPSBGaWx0ZXJJbml0aWFsaXplci5nZXRJbnN0YW5jZSgpLgotCQkJCQkJZ2V0Q2xhc3NGb3JUeXBlKGhlbHBlci5nZXRGaWx0ZXJUeXBlU3RyKCkpOwotCQlpZihjbHMgIT0gbnVsbCl7Ci0JCQlpZihjbHMuaXNJbnN0YW5jZShvYmopKXsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX1lbHNlewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCQkvLyBGb3IgYWxsIENvbnRlbnRFbGVtZW50IC0gdGhlc2UgZ3VpZGFuY2VzIGFyZSBhc3NvY2lhdGVkCi0JCWlmIChvYmogaW5zdGFuY2VvZiBDaGVja2xpc3QgfHwgb2JqIGluc3RhbmNlb2YgQ29uY2VwdAotCQkJCXx8IG9iaiBpbnN0YW5jZW9mIEV4YW1wbGUgfHwgb2JqIGluc3RhbmNlb2YgU3VwcG9ydGluZ01hdGVyaWFsCi0JCQkJfHwgb2JqIGluc3RhbmNlb2YgR3VpZGVsaW5lIHx8IG9iaiBpbnN0YW5jZW9mIFJldXNhYmxlQXNzZXQpCQotCQkJcmV0dXJuIHRydWU7Ci0JCQotCQkvLyBGb3IgdGFzayBleHRyYSBndWlkYW5jZXMKLQkJaWYoaGVscGVyLmdldENvbnRlbnRFbGVtZW50KCkgaW5zdGFuY2VvZiBUYXNrKXsKLQkJCWlmKG9iaiBpbnN0YW5jZW9mIFRvb2xNZW50b3IgCi0JCQkJCXx8IG9iaiBpbnN0YW5jZW9mIEVzdGltYXRpb25Db25zaWRlcmF0aW9ucykKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQkvLyBGb3Igd29ya1Byb2R1Y3QgRXh0cmEgZ3VpZGFuY2VzLgotCQlpZihoZWxwZXIuZ2V0Q29udGVudEVsZW1lbnQoKSBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0KXsKLQkJCWlmKG9iaiBpbnN0YW5jZW9mIFJlcG9ydCB8fCBvYmogaW5zdGFuY2VvZiBUZW1wbGF0ZQotCQkJCQl8fCBvYmogaW5zdGFuY2VvZiBUb29sTWVudG9yIAotCQkJCQl8fCBvYmogaW5zdGFuY2VvZiBFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZmlsdGVycy9Qcm9jZXNzQWN0aXZpdHlGaWx0ZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZmlsdGVycy9Qcm9jZXNzQWN0aXZpdHlGaWx0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmU1MTU3MS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2ZpbHRlcnMvUHJvY2Vzc0FjdGl2aXR5RmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5maWx0ZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb25maWd1cmF0aW9uLkNhdGVnb3JpemVkUHJvY2Vzc2VzSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29uZmlndXJhdGlvbi5Qcm9jZXNzZXNJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5GaWx0ZXJIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51aS5JQWN0aW9uVHlwZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ2FwYWJpbGl0eVBhdHRlcm47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyeVByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlVmlld2VyOwotCi0KLS8qKgotICogQWN0aXZpdHkgRmlsdGVyIGZvciBkb2luZyBQcm9jZXNzIGNvcHkvZXh0ZW5kCi0gKiAKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9jZXNzQWN0aXZpdHlGaWx0ZXIgZXh0ZW5kcyBEZXNjcmlwdG9yQ29uZmlndXJhdGlvbkZpbHRlciB7Ci0KLQlwcml2YXRlIEFjdGl2aXR5IGFjdGl2aXR5ID0gbnVsbDsKLQotCXByaXZhdGUgaW50IGNvbW1hbmQgPSAwOwotCi0JcHJpdmF0ZSBBY3Rpdml0eVZhcmlhYmlsaXR5RmlsdGVyIGRlbGVnYXRlRmlsdGVyOwotCi0JcHVibGljIFByb2Nlc3NBY3Rpdml0eUZpbHRlcihNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZywKLQkJCVRhYmxlVmlld2VyIHZpZXdlciwgU3RyaW5nIHRhYk5hbWUsIEFjdGl2aXR5IGFjdGl2aXR5LCBpbnQgY29tbWFuZCkgewotCQlzdXBlcihjb25maWcsIHZpZXdlciwgdGFiTmFtZSk7Ci0JCXRoaXMuYWN0aXZpdHkgPSBhY3Rpdml0eTsKLQkJdGhpcy5jb21tYW5kID0gY29tbWFuZDsKLQkJZGVsZWdhdGVGaWx0ZXIgPSBuZXcgQWN0aXZpdHlWYXJpYWJpbGl0eUZpbHRlcihjb25maWcsIHZpZXdlciwgdGFiTmFtZSwgYWN0aXZpdHkpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZpbHRlcnMuRGVzY3JpcHRvckNvbmZpZ3VyYXRpb25GaWx0ZXIjc2V0SGVscGVyKG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuRmlsdGVySGVscGVyKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEhlbHBlcihGaWx0ZXJIZWxwZXIgaGVscGVyKSB7Ci0JCXN1cGVyLnNldEhlbHBlcihoZWxwZXIpOwotCQlkZWxlZ2F0ZUZpbHRlci5zZXRIZWxwZXIoaGVscGVyKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5maWx0ZXJzLkRlc2NyaXB0b3JDb25maWd1cmF0aW9uRmlsdGVyI2FjY2VwdChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBib29sZWFuIGFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCS8vIGFueSBhY3Rpdml0eSBjYW4gYmUgZGVlcC1jb3BpZWQKLQkJLy8KLQkJaWYoY29tbWFuZCA9PSBJQWN0aW9uVHlwZVByb3ZpZGVyLkRFRVBfQ09QWSAmJiAKLQkJCQkob2JqIGluc3RhbmNlb2YgQWN0aXZpdHkgfHwgb2JqIGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBzdXBlci5hY2NlcHQob2JqKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjaGlsZEFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBQcm9jZXNzZXNJdGVtUHJvdmlkZXIpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBDYXRlZ29yaXplZFByb2Nlc3Nlc0l0ZW1Qcm92aWRlcikgewotCQkJcmV0dXJuIHRydWU7Ci0KLQkJfQotCQkKLS8vCQlpZiAoKG9iaiBpbnN0YW5jZW9mIEFjdGl2aXR5KSB8fCBvYmogaW5zdGFuY2VvZiBQcm9jZXNzUGFja2FnZSkgewotLy8JCQlpZiAob2JqIGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkgewotLy8JCQkJLy8gaWYgc291cmNlIGFuZCB0YWdldCBpcyBzYW1lIHByb2Nlc3MsIGJsb2NrIGl0Ci0vLwkJCQlQcm9jZXNzIHByb2MgPSAoKFByb2Nlc3NDb21wb25lbnQpIG9iaikuZ2V0UHJvY2VzcygpOwotLy8JCQkJaWYgKCEodGhpcy5jb21tYW5kID09IElBY3Rpb25UeXBlUHJvdmlkZXIuQ09QWSkpIHsKLS8vCQkJCQlpZiAocHJvYy5lcXVhbHModGhpcy5hY3Rpdml0eSkpCi0vLwkJCQkJCXJldHVybiBmYWxzZTsKLS8vCQkJCX0KLS8vCQkJfQotLy8JCQlpZiAob2JqIGluc3RhbmNlb2YgUHJvY2VzcykgewotLy8JCQkJLy8gaWYgc291cmNlIGFuZCB0YWdldCBpcyBzYW1lIHByb2Nlc3MsIGJsb2NrIGl0Ci0vLwkJCQlQcm9jZXNzIHByb2MgPSAoUHJvY2Vzcykgb2JqOwotLy8JCQkJaWYgKCEodGhpcy5jb21tYW5kID09IElBY3Rpb25UeXBlUHJvdmlkZXIuQ09QWSkpIHsKLS8vCQkJCQlpZiAocHJvYy5lcXVhbHModGhpcy5hY3Rpdml0eSkpCi0vLwkJCQkJCXJldHVybiBmYWxzZTsKLS8vCQkJCX0KLS8vCQkJfQotLy8KLS8vCQkJaWYgKG9iaiBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnQpIHsKLS8vCQkJCVByb2Nlc3Mgc3JjUHJvYyA9IFRuZ1V0aWwKLS8vCQkJCQkJLmdldE93bmluZ1Byb2Nlc3MoKEJyZWFrZG93bkVsZW1lbnQpIG9iaik7Ci0vLwkJCQlQcm9jZXNzIHRhcmdldFByb2MgPSBUbmdVdGlsCi0vLwkJCQkJCS5nZXRPd25pbmdQcm9jZXNzKChCcmVha2Rvd25FbGVtZW50KSB0aGlzLmFjdGl2aXR5KTsKLS8vCQkJCWlmIChzcmNQcm9jIGluc3RhbmNlb2YgRGVsaXZlcnlQcm9jZXNzCi0vLwkJCQkJCSYmIHRhcmdldFByb2MgaW5zdGFuY2VvZiBDYXBhYmlsaXR5UGF0dGVybikgewotLy8JCQkJCXJldHVybiBmYWxzZTsKLS8vCQkJCX0KLS8vCQkJfQotLy8JCQlpZiAob2JqIGluc3RhbmNlb2YgUHJvY2VzcykgewotLy8JCQkJUHJvY2VzcyBwcm9jID0gKFByb2Nlc3MpIG9iajsKLS8vCQkJCWlmIChwcm9jLmVxdWFscyh0aGlzLmFjdGl2aXR5KSkKLS8vCQkJCQlyZXR1cm4gZmFsc2U7Ci0vLwkJCX0KLS8vCi0vLwkJCXJldHVybiB0cnVlOwotLy8JCX0gZWxzZQotLy8JCQlyZXR1cm4gZmFsc2U7Ci0JCQotCQlpZihvYmogaW5zdGFuY2VvZiBBY3Rpdml0eSB8fCBvYmogaW5zdGFuY2VvZiBQcm9jZXNzUGFja2FnZSkgewotCQkJc3dpdGNoKGNvbW1hbmQpIHsKLQkJCQljYXNlIElBY3Rpb25UeXBlUHJvdmlkZXIuRVhURU5EOgotCQkJCQlyZXR1cm4gZGVsZWdhdGVGaWx0ZXIuYWNjZXB0KG9iaik7Ci0JCQkJY2FzZSBJQWN0aW9uVHlwZVByb3ZpZGVyLkNPUFk6Ci0JCQkJCS8vIGRpc2FsbG93IGNvcHlpbmcgZnJvbSBkZWxpdmVyeSBwcm9jZXNzIHRvIGNhcGFiaWxpdHkgcGF0dGVybgotCQkJCQkvLwotCQkJCQlQcm9jZXNzIHNyY1Byb2MgPSBudWxsOwotCQkJCQlpZiAob2JqIGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkgewotCQkJCQkJLy8gaWYgc291cmNlIGFuZCB0YWdldCBpcyBzYW1lIHByb2Nlc3MsIGJsb2NrIGl0Ci0JCQkJCQlzcmNQcm9jID0gKChQcm9jZXNzQ29tcG9uZW50KSBvYmopLmdldFByb2Nlc3MoKTsKLQkJCQkJfQotCQkJCQllbHNlIGlmIChvYmogaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50KSB7Ci0JCQkJCQlCcmVha2Rvd25FbGVtZW50IGJlID0gKEJyZWFrZG93bkVsZW1lbnQpIG9iajsKLQkJCQkJCXNyY1Byb2MgPSBUbmdVdGlsLmdldE93bmluZ1Byb2Nlc3MoYmUpOwotCQkJCQl9Ci0JCQkJCWlmKHNyY1Byb2MgIT0gbnVsbCkgewotCQkJCQkJUHJvY2VzcyB0YXJnZXRQcm9jID0gVG5nVXRpbC5nZXRPd25pbmdQcm9jZXNzKHRoaXMuYWN0aXZpdHkpOwotCQkJCQkJaWYgKHNyY1Byb2MgaW5zdGFuY2VvZiBEZWxpdmVyeVByb2Nlc3MKLQkJCQkJCQkJJiYgdGFyZ2V0UHJvYyBpbnN0YW5jZW9mIENhcGFiaWxpdHlQYXR0ZXJuKSB7Ci0JCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQkJfQotCQkJCQkJZWxzZSB7Ci0JCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIGZhbHNlOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZmlsdGVycy9Qcm9jZXNzR3VpZGFuY2VGaWx0ZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZmlsdGVycy9Qcm9jZXNzR3VpZGFuY2VGaWx0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmVkNGU1OS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2ZpbHRlcnMvUHJvY2Vzc0d1aWRhbmNlRmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZpbHRlcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29uZmlndXJhdGlvbi5HdWlkYW5jZUdyb3VwaW5nSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29uZmlndXJhdGlvbi5HdWlkYW5jZUl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZVZpZXdlcjsKLQotCi0vKioKLSAqIEd1aWRhbmNlIEZpbHRlciBmb3IgV29yayBicmVha2Rvd24gc3RydWN0dXJlLiAKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUHJvY2Vzc0d1aWRhbmNlRmlsdGVyIGV4dGVuZHMgRGVzY3JpcHRvckNvbmZpZ3VyYXRpb25GaWx0ZXIgewotCi0JcHVibGljIFByb2Nlc3NHdWlkYW5jZUZpbHRlcihNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZywKLQkJCVRhYmxlVmlld2VyIHZpZXdlciwgU3RyaW5nIHRhYk5hbWUpIHsKLQkJc3VwZXIoY29uZmlnLCB2aWV3ZXIsIHRhYk5hbWUpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCXJldHVybiBzdXBlci5hY2NlcHQob2JqKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjaGlsZEFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBHdWlkYW5jZUdyb3VwaW5nSXRlbVByb3ZpZGVyKQotCQkJcmV0dXJuIHRydWU7Ci0JCWlmICgob2JqIGluc3RhbmNlb2YgR3VpZGFuY2VJdGVtUHJvdmlkZXIpKSB7Ci0JCQlDb2xsZWN0aW9uIGNvbCA9ICgoR3VpZGFuY2VJdGVtUHJvdmlkZXIpIG9iaikuZ2V0Q2hpbGRyZW4ob2JqKTsKLQkJCWlmIChjb2wuaXNFbXB0eSgpKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCWVsc2UKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2ZpbHRlcnMvUHJvY2Vzc1JvbGVGaWx0ZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZmlsdGVycy9Qcm9jZXNzUm9sZUZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Y2JlY2E1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZmlsdGVycy9Qcm9jZXNzUm9sZUZpbHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5maWx0ZXJzOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbmZpZ3VyYXRpb24uQ2F0ZWdvcmllc0l0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbmZpZ3VyYXRpb24uVW5jYXRlZ29yaXplZEl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmVsZW1lbnQuUm9sZUl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVTZXRHcm91cGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlVmlld2VyOwotCi0KLS8qKgotICogRmlsdGVycyB7QGxpbmsgUm9sZVNldH0sIHtAbGluayBSb2xlU2V0R3JvdXBpbmd9IGluIHNwZWNpZmljIHtAbGluayBNZXRob2RDb25maWd1cmF0aW9ufQotICogYmFzZWQgb24gc2VhcmNoIHBhdHRlcm4uIAotICogCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFByb2Nlc3NSb2xlRmlsdGVyIGV4dGVuZHMgRGVzY3JpcHRvckNvbmZpZ3VyYXRpb25GaWx0ZXIgewotCi0JcHVibGljIFByb2Nlc3NSb2xlRmlsdGVyKE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnLCBUYWJsZVZpZXdlciB2aWV3ZXIsCi0JCQlTdHJpbmcgdGFiTmFtZSkgewotCQlzdXBlcihjb25maWcsIHZpZXdlciwgdGFiTmFtZSk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY2hpbGRBY2NlcHQoT2JqZWN0IG9iaikgewotCQlpZiAob2JqIGluc3RhbmNlb2YgQ2F0ZWdvcmllc0l0ZW1Qcm92aWRlcikgewotCQkJaWYgKCgoQ2F0ZWdvcmllc0l0ZW1Qcm92aWRlcikgb2JqKS5nZXRUZXh0KG9iaikuZXF1YWxzSWdub3JlQ2FzZSgKLQkJCQkJTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfUm9sZV9TZXRzX2dyb3VwIikpKSAvLyROT04tTkxTLTEkCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJaWYgKChvYmogaW5zdGFuY2VvZiBSb2xlSXRlbVByb3ZpZGVyKSB8fCAob2JqIGluc3RhbmNlb2YgUm9sZSkKLQkJCQl8fCAob2JqIGluc3RhbmNlb2YgVW5jYXRlZ29yaXplZEl0ZW1Qcm92aWRlcikpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJCi0JCWlmKG9iaiBpbnN0YW5jZW9mIFJvbGVTZXRHcm91cGluZyl7Ci0JCQlJdGVyYXRvciBpdGVyID0gKFRuZ1V0aWwuZ2V0Q29udHJpYnV0b3JzKChWYXJpYWJpbGl0eUVsZW1lbnQpb2JqKSk7Ci0JCQlpZihpdGVyICE9IG51bGwpewotCQkJCXdoaWxlKGl0ZXIuaGFzTmV4dCgpKXsKLQkJCQkJUm9sZVNldEdyb3VwaW5nIGdyb3VwaW5nID0gKFJvbGVTZXRHcm91cGluZylpdGVyLm5leHQoKTsKLQkJCQkJLy8gVE9ETyA6IENoZWNrIGZvciAocmVjdXJzaXZlKVJvbGVTZXRzIGlzIGVtcHR5LCAKLQkJCQkJLy8gaWYgcm9sZXNldCdzIHJvbGVzIGFyZSBlbXB0eSBkb25vdCBzaG93IERpc2NpcGxpbmUgZ3JvdXBpbmcgCi0JCQkJCWlmKCFncm91cGluZy5nZXRSb2xlU2V0cygpLmlzRW1wdHkoKSkgcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQotCQkJLy8gVE9ETyA6IENoZWNrIGZvciAocmVjdXJzaXZlKVJvbGVTZXRzIGlzIGVtcHR5LCAKLQkJCS8vIGlmIHJvbGVzZXQncyByb2xlcyBhcmUgZW1wdHkgZG9ub3Qgc2hvdyBEaXNjaXBsaW5lIGdyb3VwaW5nIAotCQkJcmV0dXJuICEoKFJvbGVTZXRHcm91cGluZylvYmopLmdldFJvbGVTZXRzKCkuaXNFbXB0eSgpOwotCQl9Ci0JCWlmKG9iaiBpbnN0YW5jZW9mIFJvbGVTZXQpewotCQkJcmV0dXJuICEoKFJvbGVTZXQpb2JqKS5nZXRSb2xlcygpLmlzRW1wdHkoKTsKLQkJfQotCQllbHNlCi0JCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9maWx0ZXJzL1Byb2Nlc3NTcGVjaWZpY1dvcmtQcm9kdWN0RmlsdGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2ZpbHRlcnMvUHJvY2Vzc1NwZWNpZmljV29ya1Byb2R1Y3RGaWx0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDk1Yjk3OC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2ZpbHRlcnMvUHJvY2Vzc1NwZWNpZmljV29ya1Byb2R1Y3RGaWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZmlsdGVyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3RUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVWaWV3ZXI7Ci0KLQotLyoqCi0gKiBGaWx0ZXJzIHtAbGluayBXb3JrUHJvZHVjdH1zIGJhc2VkIG9uIHtAbGluayBNZXRob2RDb25maWd1cmF0aW9ufSBhbmQgc2VhcmNoIHBhdHRlcm4uCi0gKiBhbmQge0BsaW5rIFdvcmtQcm9kdWN0VHlwZX0gIAotICogCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFByb2Nlc3NTcGVjaWZpY1dvcmtQcm9kdWN0RmlsdGVyIGV4dGVuZHMgUHJvY2Vzc1dvcmtQcm9kdWN0RmlsdGVyIHsKLQotCUNsYXNzIHdvcmtQcm9kdWN0VHlwZSA9IG51bGw7Ci0KLQlwdWJsaWMgUHJvY2Vzc1NwZWNpZmljV29ya1Byb2R1Y3RGaWx0ZXIoTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcsCi0JCQlUYWJsZVZpZXdlciB2aWV3ZXIsIFN0cmluZyB0YWJOYW1lLCBDbGFzcyB0eXBlKSB7Ci0JCXN1cGVyKGNvbmZpZywgdmlld2VyLCB0YWJOYW1lKTsKLQkJdGhpcy53b3JrUHJvZHVjdFR5cGUgPSB0eXBlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNoaWxkQWNjZXB0KE9iamVjdCBvYmopIHsKLQkJaWYgKHN1cGVyLmNoaWxkQWNjZXB0KG9iaikpIHsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBXb3JrUHJvZHVjdCkgewotCQkJCWlmICh3b3JrUHJvZHVjdFR5cGUgPT0gbnVsbCkKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJZWxzZSBpZiAob2JqLmdldENsYXNzKCkuZXF1YWxzKHRoaXMud29ya1Byb2R1Y3RUeXBlKSkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9IGVsc2UgewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCi0JCQl9IGVsc2UgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9IGVsc2UgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2ZpbHRlcnMvUHJvY2Vzc1Rhc2tGaWx0ZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZmlsdGVycy9Qcm9jZXNzVGFza0ZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMzljYjcwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZmlsdGVycy9Qcm9jZXNzVGFza0ZpbHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5maWx0ZXJzOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbmZpZ3VyYXRpb24uQ2F0ZWdvcmllc0l0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbmZpZ3VyYXRpb24uVW5jYXRlZ29yaXplZEl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmVsZW1lbnQuVGFza0l0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpc2NpcGxpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaXNjaXBsaW5lR3JvdXBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFzazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlVmlld2VyOwotCi0KLS8qKgotICogRmlsdGVycyB7QGxpbmsgVGFza31zIGluIHtAbGluayBNZXRob2RDb25maWd1cmF0aW9ufSBiYXNlZCBvbiBzZWFyY2ggcGF0dGVybi4KLSAqIAotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9jZXNzVGFza0ZpbHRlciBleHRlbmRzIERlc2NyaXB0b3JDb25maWd1cmF0aW9uRmlsdGVyIHsKLQotCXB1YmxpYyBQcm9jZXNzVGFza0ZpbHRlcihNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZywgVGFibGVWaWV3ZXIgdmlld2VyLAotCQkJU3RyaW5nIHRhYk5hbWUpIHsKLQkJc3VwZXIoY29uZmlnLCB2aWV3ZXIsIHRhYk5hbWUpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNoaWxkQWNjZXB0KE9iamVjdCBvYmopIHsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIENhdGVnb3JpZXNJdGVtUHJvdmlkZXIpIHsKLQkJCWlmICgoKENhdGVnb3JpZXNJdGVtUHJvdmlkZXIpIG9iaikuZ2V0VGV4dChvYmopLmVxdWFsc0lnbm9yZUNhc2UoCi0JCQkJCUxpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCQkJLmdldFN0cmluZygiX1VJX0Rpc2NpcGxpbmVzX2dyb3VwIikpKSAvLyROT04tTkxTLTEkCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJaWYgKChvYmogaW5zdGFuY2VvZiBUYXNrSXRlbVByb3ZpZGVyKSB8fCAob2JqIGluc3RhbmNlb2YgVGFzaykKLQkJCQl8fCAob2JqIGluc3RhbmNlb2YgVW5jYXRlZ29yaXplZEl0ZW1Qcm92aWRlcikpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJaWYob2JqIGluc3RhbmNlb2YgRGlzY2lwbGluZUdyb3VwaW5nKXsKLQkJCUl0ZXJhdG9yIGl0ZXIgPSAoVG5nVXRpbC5nZXRDb250cmlidXRvcnMoKFZhcmlhYmlsaXR5RWxlbWVudClvYmopKTsKLQkJCWlmKGl0ZXIgIT0gbnVsbCl7Ci0JCQkJd2hpbGUoaXRlci5oYXNOZXh0KCkpewotCQkJCQlEaXNjaXBsaW5lR3JvdXBpbmcgZ3JvdXBpbmcgPSAoRGlzY2lwbGluZUdyb3VwaW5nKWl0ZXIubmV4dCgpOwotCQkJCQkvLyBUT0RPIDogQ2hlY2sgZm9yIChyZWN1cnNpdmUpRGlzY2lwbGluZSBpcyBlbXB0eSwgCi0JCQkJCS8vIGlmIGRpc2NpcGxpbmUncyB0YXNrcyBhcmUgZW1wdHkgZG9ub3Qgc2hvdyBEaXNjaXBsaW5lIGdyb3VwaW5nIAotCQkJCQlpZighZ3JvdXBpbmcuZ2V0RGlzY2lwbGluZXMoKS5pc0VtcHR5KCkpIHJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0KLQkJCS8vIFRPRE8gOiBDaGVjayBmb3IgKHJlY3Vyc2l2ZSlEaXNjaXBsaW5lIGlzIGVtcHR5LCAKLQkJCS8vIGlmIGRpc2NpcGxpbmUncyB0YXNrcyBhcmUgZW1wdHkgZG9ub3Qgc2hvdyBEaXNjaXBsaW5lIGdyb3VwaW5nIAotCQkJcmV0dXJuICEoKERpc2NpcGxpbmVHcm91cGluZylvYmopLmdldERpc2NpcGxpbmVzKCkuaXNFbXB0eSgpOwotCQl9Ci0JCWlmKG9iaiBpbnN0YW5jZW9mIERpc2NpcGxpbmUpewotCQkJSXRlcmF0b3IgaXRlciA9IChUbmdVdGlsLmdldENvbnRyaWJ1dG9ycygoVmFyaWFiaWxpdHlFbGVtZW50KW9iaikpOwotCQkJaWYoaXRlciAhPSBudWxsKXsKLQkJCQl3aGlsZShpdGVyLmhhc05leHQoKSl7Ci0JCQkJCURpc2NpcGxpbmUgZGlzY2lwbGluZSA9IChEaXNjaXBsaW5lKWl0ZXIubmV4dCgpOwotCQkJCQkvLyBUT0RPIDogQ2hlY2sgZm9yIChyZWN1cnNpdmUpRGlzY2lwbGluZSBpcyBlbXB0eSwgCi0JCQkJCS8vIGlmIGRpc2NpcGxpbmUncyB0YXNrcyBhcmUgZW1wdHkgZG9ub3Qgc2hvdyBEaXNjaXBsaW5lIAotCQkJCQlpZighZGlzY2lwbGluZS5nZXRUYXNrcygpLmlzRW1wdHkoKSkgcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuICEoKERpc2NpcGxpbmUpb2JqKS5nZXRUYXNrcygpLmlzRW1wdHkoKTsKLQkJfQotCQkJcmV0dXJuIGZhbHNlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9maWx0ZXJzL1Byb2Nlc3NWaWV3RmlsdGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2ZpbHRlcnMvUHJvY2Vzc1ZpZXdGaWx0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDg0NjUyMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2ZpbHRlcnMvUHJvY2Vzc1ZpZXdGaWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZmlsdGVyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZGlhbG9ncy5JdGVtc0ZpbHRlckRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbmZpZ3VyYXRpb24uQ2F0ZWdvcmllc0l0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLkZpbHRlckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkN1c3RvbUNhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGlzY2lwbGluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpc2NpcGxpbmVHcm91cGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVTZXRHcm91cGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRvb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci0KLQotLyoqCi0gKiBGaWx0ZXIge0BsaW5rIFByb2Nlc3N9ZXMgd2l0aGluIHtAbGluayBNZXRob2RDb25maWd1cmF0aW9ufSB1c2VkIGluCi0gKiB7QGxpbmsgSXRlbXNGaWx0ZXJEaWFsb2d9LgotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9jZXNzVmlld0ZpbHRlciBleHRlbmRzIERlc2NyaXB0b3JDb25maWd1cmF0aW9uRmlsdGVyIHsKLQotCXB1YmxpYyBQcm9jZXNzVmlld0ZpbHRlcihNZXRob2RDb25maWd1cmF0aW9uIG1ldGhvZENvbmZpZywgVmlld2VyIHZpZXdlciwKLQkJCVN0cmluZyBmaWx0ZXJTdHIpIHsKLQkJc3VwZXIobWV0aG9kQ29uZmlnLCB2aWV3ZXIsIGZpbHRlclN0cik7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY2hpbGRBY2NlcHQoT2JqZWN0IG9iaikgewotCQlTdHJpbmcgZmlsdGVyVHlwZSA9IGhlbHBlci5nZXRGaWx0ZXJUeXBlU3RyKCk7Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBDYXRlZ29yaWVzSXRlbVByb3ZpZGVyKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlpZiAoZmlsdGVyVHlwZS5lcXVhbHNJZ25vcmVDYXNlKEZpbHRlckNvbnN0YW50cy5ST0xFU0VUUykpIHsKLQkJCXJldHVybiAob2JqIGluc3RhbmNlb2YgUm9sZVNldCB8fCBvYmogaW5zdGFuY2VvZiBSb2xlU2V0R3JvdXBpbmcpOwotCQl9IGVsc2UgaWYgKGZpbHRlclR5cGUuZXF1YWxzSWdub3JlQ2FzZShGaWx0ZXJDb25zdGFudHMuRElTQ0lQTElORVMpKSB7Ci0JCQlyZXR1cm4gKG9iaiBpbnN0YW5jZW9mIERpc2NpcGxpbmUgfHwgb2JqIGluc3RhbmNlb2YgRGlzY2lwbGluZUdyb3VwaW5nKTsKLQkJfSBlbHNlIGlmIChmaWx0ZXJUeXBlLmVxdWFsc0lnbm9yZUNhc2UoRmlsdGVyQ29uc3RhbnRzLkRPTUFJTlMpKSB7Ci0JCQlyZXR1cm4gKG9iaiBpbnN0YW5jZW9mIERvbWFpbik7Ci0JCX0gZWxzZSBpZiAoZmlsdGVyVHlwZQotCQkJCS5lcXVhbHNJZ25vcmVDYXNlKEZpbHRlckNvbnN0YW50cy5XT1JLUFJPRFVDVFRZUEVTKSkgewotCQkJcmV0dXJuIChvYmogaW5zdGFuY2VvZiBXb3JrUHJvZHVjdFR5cGUpOwotCQl9IGVsc2UgaWYgKGZpbHRlclR5cGUuZXF1YWxzSWdub3JlQ2FzZShGaWx0ZXJDb25zdGFudHMuVE9PTFMpKSB7Ci0JCQlyZXR1cm4gKG9iaiBpbnN0YW5jZW9mIFRvb2wpOwotCQl9IGVsc2UgaWYgKGZpbHRlclR5cGUKLQkJCQkuZXF1YWxzSWdub3JlQ2FzZShGaWx0ZXJDb25zdGFudHMuQ1VTVE9NX0NBVEVHT1JJRVMpKSB7Ci0JCQlyZXR1cm4gb2JqIGluc3RhbmNlb2YgQ3VzdG9tQ2F0ZWdvcnk7Ci0JCX0gZWxzZSBpZiAoZmlsdGVyVHlwZS5lcXVhbHNJZ25vcmVDYXNlKEZpbHRlckNvbnN0YW50cy5BTExfRUxFTUVOVFMpKSB7Ci0JCQlyZXR1cm4gb2JqIGluc3RhbmNlb2YgUm9sZVNldCB8fCBvYmogaW5zdGFuY2VvZiBEaXNjaXBsaW5lCi0JCQkJCXx8IG9iaiBpbnN0YW5jZW9mIERvbWFpbiB8fCBvYmogaW5zdGFuY2VvZiBXb3JrUHJvZHVjdFR5cGUKLQkJCQkJfHwgb2JqIGluc3RhbmNlb2YgVG9vbCB8fCBvYmogaW5zdGFuY2VvZiBDdXN0b21DYXRlZ29yeQotCQkJCQl8fCBvYmogaW5zdGFuY2VvZiBEaXNjaXBsaW5lR3JvdXBpbmcKLQkJCQkJfHwgb2JqIGluc3RhbmNlb2YgUm9sZVNldEdyb3VwaW5nOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZmlsdGVycy9Qcm9jZXNzV29ya1Byb2R1Y3RGaWx0ZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZmlsdGVycy9Qcm9jZXNzV29ya1Byb2R1Y3RGaWx0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzNmZjMwZi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2ZpbHRlcnMvUHJvY2Vzc1dvcmtQcm9kdWN0RmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZpbHRlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29uZmlndXJhdGlvbi5DYXRlZ29yaWVzSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29uZmlndXJhdGlvbi5Eb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb25maWd1cmF0aW9uLlVuY2F0ZWdvcml6ZWRJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5lbGVtZW50LldvcmtQcm9kdWN0SXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3RUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVWaWV3ZXI7Ci0KLQotLyoqCi0gKiBGaWx0ZXJzIHtAbGluayBXb3JrUHJvZHVjdH1zIHdpdGggaW4ge0BsaW5rIE1ldGhvZENvbmZpZ3VyYXRpb259LiAKLSAqIAotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9jZXNzV29ya1Byb2R1Y3RGaWx0ZXIgZXh0ZW5kcyBEZXNjcmlwdG9yQ29uZmlndXJhdGlvbkZpbHRlciB7Ci0KLQlwdWJsaWMgUHJvY2Vzc1dvcmtQcm9kdWN0RmlsdGVyKE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnLAotCQkJVGFibGVWaWV3ZXIgdmlld2VyLCBTdHJpbmcgdGFiTmFtZSkgewotCQlzdXBlcihjb25maWcsIHZpZXdlciwgdGFiTmFtZSk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY2hpbGRBY2NlcHQoT2JqZWN0IG9iaikgewotCQlpZiAob2JqIGluc3RhbmNlb2YgQ2F0ZWdvcmllc0l0ZW1Qcm92aWRlcikgewotCQkJaWYgKCgoQ2F0ZWdvcmllc0l0ZW1Qcm92aWRlcikgb2JqKS5nZXRUZXh0KG9iaikuZXF1YWxzSWdub3JlQ2FzZSgKLQkJCQkJTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJCQkuZ2V0U3RyaW5nKCJfVUlfV29ya1Byb2R1Y3RUeXBlc19ncm91cCIpKSkgLy8kTk9OLU5MUy0xJAotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBDYXRlZ29yaWVzSXRlbVByb3ZpZGVyKSB7Ci0JCQlpZiAoKChDYXRlZ29yaWVzSXRlbVByb3ZpZGVyKSBvYmopLmdldFRleHQob2JqKS5lcXVhbHNJZ25vcmVDYXNlKAotCQkJCQlMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9Eb21haW5zX2dyb3VwIikpKSAvLyROT04tTkxTLTEkCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJaWYgKChvYmogaW5zdGFuY2VvZiBXb3JrUHJvZHVjdEl0ZW1Qcm92aWRlcikKLQkJCQl8fCAob2JqIGluc3RhbmNlb2YgV29ya1Byb2R1Y3QpCi0JCQkJfHwgKG9iaiBpbnN0YW5jZW9mIFVuY2F0ZWdvcml6ZWRJdGVtUHJvdmlkZXIpCi0JCQkJfHwgKG9iaiBpbnN0YW5jZW9mIERvbWFpbikKLQkJCQl8fCAob2JqIGluc3RhbmNlb2YgRG9tYWluSXRlbVByb3ZpZGVyKQotCQkJCXx8IChvYmogaW5zdGFuY2VvZiBXb3JrUHJvZHVjdFR5cGUpKQotCQkJcmV0dXJuIHRydWU7Ci0JCWVsc2UKLQkJCXJldHVybiBmYWxzZTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2ZpbHRlcnMvUmVmZXJlbmNlV29ya0Zsb3dGaWx0ZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZmlsdGVycy9SZWZlcmVuY2VXb3JrRmxvd0ZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYmEwMWRiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZmlsdGVycy9SZWZlcmVuY2VXb3JrRmxvd0ZpbHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZmlsdGVyczsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuQ2F0ZWdvcml6ZWRQcm9jZXNzZXNJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5JQWxsRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuUHJvY2Vzc2VzSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5NZXRob2RFbGVtZW50VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGlzY2lwbGluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc1BhY2thZ2U7Ci0KLQotLyoqCi0gKiBGaWx0ZXJzIHRoZSB7QGxpbmsgUHJvY2Vzc31zIGZvciByZWZlcmVuY2Ugd29ya2Zsb3dzIG9mIHtAbGluayBEaXNjaXBsaW5lfS4gCi0gKiAKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUmVmZXJlbmNlV29ya0Zsb3dGaWx0ZXIgZXh0ZW5kcyBBYnN0cmFjdEJhc2VGaWx0ZXIgaW1wbGVtZW50cwotCQlJQWxsRmlsdGVyIHsKLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuSUFsbEZpbHRlciNnZXRPYmplY3QoKQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0T2JqZWN0KCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LklGaWx0ZXIjYWNjZXB0KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIGJvb2xlYW4gYWNjZXB0KE9iamVjdCBvYmopIHsKLQkJLy8gaWYgY2FuJ3QgYmUgYWNjZGVwdGVkIGJ5IHN1cGVyLCByZXR1cm4uCi0JCWlmICghc3VwZXIuYWNjZXB0KG9iaikpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCU9iamVjdCBjb250ZW50RWxlbWVudCA9IGhlbHBlci5nZXRDb250ZW50RWxlbWVudCgpOwotCQlpZiAoY29udGVudEVsZW1lbnQgIT0gbnVsbCkgewotCQkJaWYgKG9iai5lcXVhbHMoaGVscGVyLmdldENvbnRlbnRFbGVtZW50KCkpKQotCQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCWlmIChoZWxwZXIuZ2V0QWxyZWFkeVNlbGVjdGVkTGlzdCgpICE9IG51bGwpIHsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50KSB7Ci0JCQkJaWYgKGhlbHBlci5nZXRBbHJlYWR5U2VsZWN0ZWRMaXN0KCkuY29udGFpbnMoCi0JCQkJCQkoKFByb2Nlc3NDb21wb25lbnQpIG9iaikuZ2V0UHJvY2VzcygpKSkKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJaWYoaGVscGVyLmdldEFscmVhZHlTZWxlY3RlZExpc3QoKS5jb250YWlucyhvYmopKQotCQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlpZiAoIWhlbHBlci5tYXRjaFBhdHRlcm4ob2JqKSkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlpZiAob2JqIGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luKSB7Ci0JCQlpZiAoY29udGVudEVsZW1lbnQgIT0gbnVsbCkgewotCQkJCWlmIChNZXRob2RFbGVtZW50VXRpbC5nZXRBbGxNb2RlbHMoY29udGVudEVsZW1lbnQpCi0JCQkJCQkuY29udGFpbnMob2JqKSkKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJZWxzZQotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9IGVsc2UgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBQcm9jZXNzZXNJdGVtUHJvdmlkZXIpIHsKLQkJCUNvbGxlY3Rpb24gbGlzdCA9ICgoUHJvY2Vzc2VzSXRlbVByb3ZpZGVyKSBvYmopLmdldENoaWxkcmVuKG9iaik7Ci0JCQlmb3IgKEl0ZXJhdG9yIGlvciA9IGxpc3QuaXRlcmF0b3IoKTsgaW9yLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3Qgb2JqZWN0ID0gaW9yLm5leHQoKTsKLQkJCQlpZiAoKChDYXRlZ29yaXplZFByb2Nlc3Nlc0l0ZW1Qcm92aWRlcikgb2JqZWN0KS5nZXRDaGlsZHJlbigKLQkJCQkJCW9iamVjdCkuaXNFbXB0eSgpKQotCQkJCQlpb3IucmVtb3ZlKCk7Ci0JCQl9Ci0JCQlpZiAobGlzdC5pc0VtcHR5KCkpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJZWxzZQotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBBY3Rpdml0eSkKLQkJCXJldHVybiB0cnVlOwotCQlpZiAob2JqIGluc3RhbmNlb2YgUHJvY2Vzc1BhY2thZ2UpIHsKLQkJCWlmICghKG9iaiBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpKSB7Ci0JCQkJaWYgKCgoUHJvY2Vzc1BhY2thZ2UpIG9iaikuZ2V0UHJvY2Vzc0VsZW1lbnRzKCkuaXNFbXB0eSgpCi0JCQkJCQkmJiAoKFByb2Nlc3NQYWNrYWdlKSBvYmopLmdldENoaWxkUGFja2FnZXMoKS5pc0VtcHR5KCkpCi0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQllbHNlCi0JCQkJCXJldHVybiB0cnVlOwotCQkJfSBlbHNlIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZmlsdGVycy9Sb2xlRmlsdGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2ZpbHRlcnMvUm9sZUZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OWNjNDNiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZmlsdGVycy9Sb2xlRmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZpbHRlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuTWV0aG9kRWxlbWVudFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGU7Ci0KLQotLyoqCi0gKiBGaWx0ZXJzIHtAbGluayBSb2xlfSAKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUm9sZUZpbHRlciBleHRlbmRzIEFsbEZpbHRlciB7Ci0KLQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoT2JqZWN0IG9iaikgewotCQlPYmplY3QgY29udGVudEVsZW1lbnQgPSBnZXRIZWxwZXIoKS5nZXRDb250ZW50RWxlbWVudCgpOwotCQlpZiAoY29udGVudEVsZW1lbnQgIT0gbnVsbCkgewotCQkJaWYgKG9iai5lcXVhbHMoY29udGVudEVsZW1lbnQpKQotCQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCWlmIChnZXRIZWxwZXIoKS5nZXRBbHJlYWR5U2VsZWN0ZWRMaXN0KCkgIT0gbnVsbCkgewotCQkJaWYgKGdldEhlbHBlcigpLmdldEFscmVhZHlTZWxlY3RlZExpc3QoKS5jb250YWlucyhvYmopKQotCQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlpZiAoIWdldEhlbHBlcigpLm1hdGNoUGF0dGVybihvYmopKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAob2JqIGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luKSB7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luKSB7Ci0JCQkJaWYgKGNvbnRlbnRFbGVtZW50ICE9IG51bGwpIHsKLQkJCQkJaWYgKE1ldGhvZEVsZW1lbnRVdGlsLmdldEFsbE1vZGVscyhjb250ZW50RWxlbWVudCkKLQkJCQkJCQkuY29udGFpbnMob2JqKSkKLQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQllbHNlCi0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBDb250ZW50UGFja2FnZSkKLQkJCXJldHVybiB0cnVlOwotCQlpZiAob2JqIGluc3RhbmNlb2YgUm9sZSkKLQkJCXJldHVybiB0cnVlOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2ZpbHRlcnMvVmFyaWFiaWxpdHlQcm9jZXNzUm9sZUZpbHRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9maWx0ZXJzL1ZhcmlhYmlsaXR5UHJvY2Vzc1JvbGVGaWx0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzBkMGU5My4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2ZpbHRlcnMvVmFyaWFiaWxpdHlQcm9jZXNzUm9sZUZpbHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5maWx0ZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZC5Qcm9jZXNzQ29tbWFuZFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlVmlld2VyOwotCi0KLS8qKgotICogRmlsdGVycyB7QGxpbmsgUHJvY2Vzc30ncyB7QGxpbmsgUm9sZX0gd2l0aGluIHtAbGluayBNZXRob2RDb25maWd1cmF0aW9ufQotICogCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFZhcmlhYmlsaXR5UHJvY2Vzc1JvbGVGaWx0ZXIgZXh0ZW5kcyBQcm9jZXNzUm9sZUZpbHRlciB7Ci0KLQlBY3Rpdml0eSBhY3Rpdml0eSA9IG51bGw7Ci0KLQlwdWJsaWMgVmFyaWFiaWxpdHlQcm9jZXNzUm9sZUZpbHRlcihNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZywKLQkJCVRhYmxlVmlld2VyIHZpZXdlciwgU3RyaW5nIHRhYk5hbWUsIEFjdGl2aXR5IGFjdGl2aXR5KSB7Ci0JCXN1cGVyKGNvbmZpZywgdmlld2VyLCB0YWJOYW1lKTsKLQkJdGhpcy5hY3Rpdml0eSA9IGFjdGl2aXR5OwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNoaWxkQWNjZXB0KE9iamVjdCBvYmopIHsKLQkJaWYgKHN1cGVyLmNoaWxkQWNjZXB0KG9iaikpIHsKLS8vCQkJaWYgKFByb2Nlc3NVdGlsLmdldFZhcmlhYmlsaXR5RWxlbWVudCh0aGlzLmFjdGl2aXR5KS5jb250YWlucyhvYmopKSB7Ci0vLwkJCQlyZXR1cm4gZmFsc2U7Ci0vLwkJCX0gZWxzZQotLy8JCQkJcmV0dXJuIHRydWU7Ci0JCQlyZXR1cm4gUHJvY2Vzc0NvbW1hbmRVdGlsLmdldFZhbGlkRGVzY3JpcHRvcihvYmosIGFjdGl2aXR5LCBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRS5nZXRPQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKSA9PSBudWxsOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2ZpbHRlcnMvVmFyaWFiaWxpdHlQcm9jZXNzVGFza0ZpbHRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9maWx0ZXJzL1ZhcmlhYmlsaXR5UHJvY2Vzc1Rhc2tGaWx0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODA4YzY5Mi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2ZpbHRlcnMvVmFyaWFiaWxpdHlQcm9jZXNzVGFza0ZpbHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5maWx0ZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZC5Qcm9jZXNzQ29tbWFuZFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFzazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlVmlld2VyOwotCi0KLS8qKgotICogRmlsdGVycyB7QGxpbmsgUHJvY2Vzc30ncyB7QGxpbmsgVGFza30gd2l0aGluIHtAbGluayBNZXRob2RDb25maWd1cmF0aW9ufQotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBWYXJpYWJpbGl0eVByb2Nlc3NUYXNrRmlsdGVyIGV4dGVuZHMgUHJvY2Vzc1Rhc2tGaWx0ZXIgewotCi0JQWN0aXZpdHkgYWN0aXZpdHkgPSBudWxsOwotCi0JcHVibGljIFZhcmlhYmlsaXR5UHJvY2Vzc1Rhc2tGaWx0ZXIoTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcsCi0JCQlUYWJsZVZpZXdlciB2aWV3ZXIsIFN0cmluZyB0YWJOYW1lLCBBY3Rpdml0eSBhY3Rpdml0eSkgewotCQlzdXBlcihjb25maWcsIHZpZXdlciwgdGFiTmFtZSk7Ci0JCXRoaXMuYWN0aXZpdHkgPSBhY3Rpdml0eTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjaGlsZEFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCWlmIChzdXBlci5jaGlsZEFjY2VwdChvYmopKSB7Ci0vLwkJCWlmIChQcm9jZXNzVXRpbC5nZXRWYXJpYWJpbGl0eUVsZW1lbnQodGhpcy5hY3Rpdml0eSkuY29udGFpbnMob2JqKSkgewotLy8JCQkJcmV0dXJuIGZhbHNlOwotLy8JCQl9IGVsc2UKLS8vCQkJCXJldHVybiB0cnVlOwotCQkJcmV0dXJuIFByb2Nlc3NDb21tYW5kVXRpbC5nZXRWYWxpZERlc2NyaXB0b3Iob2JqLCBhY3Rpdml0eSwgVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UuZ2V0V0JTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSkgPT0gbnVsbDsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9maWx0ZXJzL1ZhcmlhYmlsaXR5UHJvY2Vzc1dvcmtQcm9kdWN0RmlsdGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2ZpbHRlcnMvVmFyaWFiaWxpdHlQcm9jZXNzV29ya1Byb2R1Y3RGaWx0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTQyYzJiYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2ZpbHRlcnMvVmFyaWFiaWxpdHlQcm9jZXNzV29ya1Byb2R1Y3RGaWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZmlsdGVyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQuUHJvY2Vzc0NvbW1hbmRVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVWaWV3ZXI7Ci0KLQotLyoqCi0gKiBGaWx0ZXJzIHtAbGluayBQcm9jZXNzfSdzIHtAbGluayBXb3JrUHJvZHVjdH0gd2l0aGluIHtAbGluayBNZXRob2RDb25maWd1cmF0aW9ufQotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBWYXJpYWJpbGl0eVByb2Nlc3NXb3JrUHJvZHVjdEZpbHRlciBleHRlbmRzCi0JCVByb2Nlc3NXb3JrUHJvZHVjdEZpbHRlciB7Ci0KLQlBY3Rpdml0eSBhY3Rpdml0eSA9IG51bGw7Ci0KLQlwdWJsaWMgVmFyaWFiaWxpdHlQcm9jZXNzV29ya1Byb2R1Y3RGaWx0ZXIoTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcsCi0JCQlUYWJsZVZpZXdlciB2aWV3ZXIsIFN0cmluZyB0YWJOYW1lLCBBY3Rpdml0eSBhY3Rpdml0eSkgewotCQlzdXBlcihjb25maWcsIHZpZXdlciwgdGFiTmFtZSk7Ci0JCXRoaXMuYWN0aXZpdHkgPSBhY3Rpdml0eTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjaGlsZEFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCWlmIChzdXBlci5jaGlsZEFjY2VwdChvYmopKSB7Ci0vLwkJCWlmIChQcm9jZXNzVXRpbC5nZXRWYXJpYWJpbGl0eUVsZW1lbnQodGhpcy5hY3Rpdml0eSkuY29udGFpbnMob2JqKSkgewotLy8JCQkJcmV0dXJuIGZhbHNlOwotLy8JCQl9IGVsc2UKLS8vCQkJCXJldHVybiB0cnVlOwotCQkJcmV0dXJuIFByb2Nlc3NDb21tYW5kVXRpbC5nZXRWYWxpZERlc2NyaXB0b3Iob2JqLCBhY3Rpdml0eSwgVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UuZ2V0UEJTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSkgPT0gbnVsbDsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9maWx0ZXJzL1dvcmtQcm9kdWN0RmlsdGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2ZpbHRlcnMvV29ya1Byb2R1Y3RGaWx0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmQ2MjEzNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2ZpbHRlcnMvV29ya1Byb2R1Y3RGaWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZmlsdGVyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3Q7Ci0KLS8qKgotICogRmlsdGVycyB7QGxpbmsgV29ya1Byb2R1Y3R9IGJhc2VkIG9uIHNlYXJjaCBwYXR0ZXJuCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFdvcmtQcm9kdWN0RmlsdGVyIGV4dGVuZHMgQ29udGVudEZpbHRlciB7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBjaGlsZEFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBXb3JrUHJvZHVjdCkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9maWx0ZXJzL3BhY2thZ2UuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZmlsdGVycy9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5OGQ0NzUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9maWx0ZXJzL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIGZpbHRlcnMgZm9yIHRoZSBtZXRob2QgYW5kIHByb2Nlc3MgZWxlbWVudHMuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9Bc3NvY2lhdGlvbkZvcm1QYWdlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL0Fzc29jaWF0aW9uRm9ybVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTJlMWRiMy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL0Fzc29jaWF0aW9uRm9ybVBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MzAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3JtczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zLkxpYnJhcnlWaWV3RmluZEVsZW1lbnRBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5kaWFsb2dzLkNvbnRlbnRFbGVtZW50c09yZGVyRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZGlhbG9ncy5JdGVtc0ZpbHRlckRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuTWV0aG9kRWxlbWVudEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnV0aWwuRWRpdG9yc0NvbnRleHRIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS51dGlsLlVJSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudmlld3MuTGlicmFyeVZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSUFjdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLk1vdmVJbkxpc3RDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5DYXRlZ29yeVNvcnRIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkNvbnRlbnRFbGVtZW50T3JkZXJMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLkxpYnJhcnlVSVRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5MaWJyYXJ5TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRDYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnRQcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uTWVudU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLlNlcGFyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNvbWJvVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXJTb3J0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRm9jdXNBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRm9jdXNFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTWVudTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5JTWFuYWdlZEZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuZWRpdG9yLkZvcm1FZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5TZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuVGFibGVXcmFwRGF0YTsKLQotCi0vKioKLSAqIFRoZSBiYXNlIGNsYXNzIGZvciBhbGwgQXNzb2NpYXRpb24gdHlwZSBmb3JtIHBhZ2VzIGluIHRoZSBNZXRob2QgZWRpdG9ycy4KLSAqIAotICogQGF1dGhvciBKZWZmIEhhcmR5Ci0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQXNzb2NpYXRpb25Gb3JtUGFnZSBleHRlbmRzIEJhc2VGb3JtUGFnZSBpbXBsZW1lbnRzIElNZW51TGlzdGVuZXIgewotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFDS0FHRV9QUkVGSVggPSAiQXV0aG9yaW5nVUlfIjsgLy8kTk9OLU5MUy0xJAkKLQotCXByb3RlY3RlZCBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciBjb250ZW50UHJvdmlkZXJTZWxlY3RlZDsKLQotCXByb3RlY3RlZCBJTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyU2VsZWN0ZWQgPSBuZXcgQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyKAotCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJLmdldE5hdmlnYXRvclZpZXdfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKSB7Ci0JCXB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uVGV4dChPYmplY3Qgb2JqZWN0LCBpbnQgY29sdW1uSW5kZXgpIHsKLQkJCXJldHVybiBUbmdVdGlsLmdldExhYmVsV2l0aFBhdGgob2JqZWN0KTsKLQkJfQotCX07Ci0KLQlwcm90ZWN0ZWQgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIgY29udGVudFByb3ZpZGVyU2VsZWN0ZWQyOwotCi0JcHJvdGVjdGVkIElMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXJTZWxlY3RlZDIgPSBuZXcgQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyKAotCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJLmdldE5hdmlnYXRvclZpZXdfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKSB7Ci0JCXB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uVGV4dChPYmplY3Qgb2JqZWN0LCBpbnQgY29sdW1uSW5kZXgpIHsKLQkJCXJldHVybiBUbmdVdGlsLmdldExhYmVsV2l0aFBhdGgob2JqZWN0KTsKLQkJfQotCX07Ci0KLQlwcm90ZWN0ZWQgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIgY29udGVudFByb3ZpZGVyU2VsZWN0ZWQzOwotCi0JcHJvdGVjdGVkIElMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXJTZWxlY3RlZDMgPSBuZXcgQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyKAotCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJLmdldE5hdmlnYXRvclZpZXdfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKSB7Ci0JCXB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uVGV4dChPYmplY3Qgb2JqZWN0LCBpbnQgY29sdW1uSW5kZXgpIHsKLQkJCXJldHVybiBUbmdVdGlsLmdldExhYmVsV2l0aFBhdGgob2JqZWN0KTsKLQkJfQotCX07Ci0KLQlwcm90ZWN0ZWQgU2VjdGlvbiBhU2VjdGlvbjsKLQotCXByb3RlY3RlZCBDb21wb3NpdGUgYUNvbXBvc2l0ZTsKLQkKLQlwcm90ZWN0ZWQgQ29tcG9zaXRlIGNhdGVnb3J5MXBhbmUxOwotCXByb3RlY3RlZCBDb21wb3NpdGUgY2F0ZWdvcnkxcGFuZTI7Ci0JcHJvdGVjdGVkIENvbXBvc2l0ZSBjYXRlZ29yeTJwYW5lMTsKLQlwcm90ZWN0ZWQgQ29tcG9zaXRlIGNhdGVnb3J5MnBhbmUyOwotCXByb3RlY3RlZCBDb21wb3NpdGUgY2F0ZWdvcnkzcGFuZTE7Ci0JcHJvdGVjdGVkIENvbXBvc2l0ZSBjYXRlZ29yeTNwYW5lMjsKLQotCXByb3RlY3RlZCBUYWJsZVZpZXdlciB2aWV3ZXJfc2VsZWN0ZWQsIHZpZXdlcl9zZWxlY3RlZDIsIHZpZXdlcl9zZWxlY3RlZDM7Ci0KLQlwcm90ZWN0ZWQgVGFibGUgY3RybF9zZWxlY3RlZCwgY3RybF9zZWxlY3RlZDIsIGN0cmxfc2VsZWN0ZWQzOwotCi0JcHJvdGVjdGVkIEJ1dHRvbiBjdHJsX2FkZCwgY3RybF9yZW1vdmUsIGN0cmxfYWRkMiwgY3RybF9yZW1vdmUyLCBjdHJsX2FkZDMsCi0JCQljdHJsX3JlbW92ZTM7Ci0KLQlwcm90ZWN0ZWQgQnV0dG9uIGN0cmxfdXAxLCBjdHJsX2Rvd24xLCBjdHJsX3VwMiwgY3RybF9kb3duMiwgY3RybF91cDMsCi0JCQljdHJsX2Rvd24zOwotCi0JcHJvdGVjdGVkIFRleHQgY3RybF9icmllZkRlc2M7Ci0KLQlwcm90ZWN0ZWQgQnV0dG9uIGN0cmxfc2VsZWN0LCBjdHJsX2NsZWFyOwotCi0JcHJvdGVjdGVkIEFycmF5TGlzdCB1c2VkQ2F0ZWdvcmllcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCXByb3RlY3RlZCBMYWJlbCBsYWJlbF9DYXRlZ29yeSwgbGFiZWxfQ2F0ZWdvcnkyLCBsYWJlbF9DYXRlZ29yeTM7Ci0KLQlwcml2YXRlIGJvb2xlYW4gdXNlQ2F0ZWdvcnkxID0gdHJ1ZTsKLQotCXByaXZhdGUgYm9vbGVhbiB1c2VDYXRlZ29yeTIgPSB0cnVlOwotCi0JcHJpdmF0ZSBib29sZWFuIHVzZUNhdGVnb3J5MyA9IHRydWU7Ci0KLQlwcml2YXRlIGJvb2xlYW4gYWxsb3dDaGFuZ2UxID0gdHJ1ZTsKLQotCXByaXZhdGUgYm9vbGVhbiBhbGxvd0NoYW5nZTIgPSB0cnVlOwotCi0JcHJpdmF0ZSBib29sZWFuIGFsbG93Q2hhbmdlMyA9IHRydWU7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1VwQW5kRG93bkJ1dHRvbnNSZXF1aXJlZDEgPSBmYWxzZTsKLQotCXByb3RlY3RlZCBib29sZWFuIGlzVXBBbmREb3duQnV0dG9uc1JlcXVpcmVkMiA9IGZhbHNlOwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNVcEFuZERvd25CdXR0b25zUmVxdWlyZWQzID0gZmFsc2U7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBjYXRlZ29yeUlzU2luZ2xlU2VsZWN0aW9uMSA9IGZhbHNlOwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gY2F0ZWdvcnlJc1NpbmdsZVNlbGVjdGlvbjIgPSBmYWxzZTsKLQotCXByb3RlY3RlZCBib29sZWFuIGNhdGVnb3J5SXNTaW5nbGVTZWxlY3Rpb24zID0gZmFsc2U7Ci0KLQlwcml2YXRlIExpYnJhcnlWaWV3RmluZEVsZW1lbnRBY3Rpb24gbGlicmFyeVZpZXdGaW5kRWxlbWVudEFjdGlvbjsKLQkvLyBzdHJpbmdzIHVzZWQgaW4gdGhlIGZvcm0KLQlwcm90ZWN0ZWQgU3RyaW5nIGZvcm1OYW1lUHJlZml4ID0gIkZvcm0gcHJlZml4IjsgLy8kTk9OLU5MUy0xJAotCi0JcHJvdGVjdGVkIFN0cmluZyBzZWN0aW9uTmFtZSA9ICJTZWN0aW9uIG5hbWUiOyAvLyROT04tTkxTLTEkCi0KLQlwcm90ZWN0ZWQgU3RyaW5nIHNlY3Rpb25EZXNjID0gIlNlY3Rpb24gZGVzY3JpcHRpb24iOyAvLyROT04tTkxTLTEkCi0KLQlwcm90ZWN0ZWQgU3RyaW5nIHNlbGVjdGVkTGFiZWwgPSAiU2VsZWN0ZWQgTGFiZWwgMSI7IC8vJE5PTi1OTFMtMSQKLQotCXByb3RlY3RlZCBTdHJpbmcgc2VsZWN0ZWRMYWJlbDIgPSAiU2VsZWN0ZWQgTGFiZWwgMiI7IC8vJE5PTi1OTFMtMSQKLQotCXByb3RlY3RlZCBTdHJpbmcgc2VsZWN0ZWRMYWJlbDMgPSAiU2VsZWN0ZWQgTGFiZWwgMyI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIERhdGEgbW9kZWwgbWV0aG9kcy4KLQlwcm90ZWN0ZWQgdm9pZCBhZGRJdGVtc1RvTW9kZWwxKEFycmF5TGlzdCBuZXdJdGVtcykgewotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZEl0ZW1zVG9Nb2RlbDIoQXJyYXlMaXN0IG5ld0l0ZW1zKSB7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkSXRlbXNUb01vZGVsMyhBcnJheUxpc3QgbmV3SXRlbXMpIHsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVJdGVtc0Zyb21Nb2RlbDEoQXJyYXlMaXN0IHJtSXRlbXMpIHsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVJdGVtc0Zyb21Nb2RlbDIoQXJyYXlMaXN0IHJtSXRlbXMpIHsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVJdGVtc0Zyb21Nb2RlbDMoQXJyYXlMaXN0IHJtSXRlbXMpIHsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBtb3ZlVXBJdGVtc0luU2VsZWN0ZWRJdGVtczEoQXJyYXlMaXN0IG1vdmVVcEl0ZW1zKSB7Ci0JCWlmICghbW92ZVVwSXRlbXMuaXNFbXB0eSgpKSB7Ci0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IGdldE9yZGVyRmVhdHVyZSgpOwotCQkJQ29udGVudEVsZW1lbnRPcmRlckxpc3Qgb3JkZXJMaXN0ID0gZ2V0Q29udGVudEVsZW1lbnRPcmRlckxpc3QoKTsKLQkJCWlmIChmZWF0dXJlICE9IG51bGwgJiYgb3JkZXJMaXN0ICE9IG51bGwpIHsKLQkJCQlNb3ZlSW5MaXN0Q29tbWFuZCBjbWQgPSBuZXcgTW92ZUluTGlzdENvbW1hbmQoCi0JCQkJCQljb250ZW50RWxlbWVudCwgbW92ZVVwSXRlbXMsIG9yZGVyTGlzdCwKLQkJCQkJCWZlYXR1cmUsIE1vdmVJbkxpc3RDb21tYW5kLlVQKTsKLQkJCQlnZXRBY3Rpb25NYW5hZ2VyKCkuZXhlY3V0ZShjbWQpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgbW92ZURvd25JdGVtc0luU2VsZWN0ZWRJdGVtczEoQXJyYXlMaXN0IG1vdmVEb3duSXRlbXMpIHsKLQkJaWYgKCFtb3ZlRG93bkl0ZW1zLmlzRW1wdHkoKSkgewotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBnZXRPcmRlckZlYXR1cmUoKTsKLQkJCUNvbnRlbnRFbGVtZW50T3JkZXJMaXN0IG9yZGVyTGlzdCA9IGdldENvbnRlbnRFbGVtZW50T3JkZXJMaXN0KCk7Ci0JCQlpZiAoZmVhdHVyZSAhPSBudWxsICYmIG9yZGVyTGlzdCAhPSBudWxsKSB7Ci0JCQkJTW92ZUluTGlzdENvbW1hbmQgY21kID0gbmV3IE1vdmVJbkxpc3RDb21tYW5kKAotCQkJCQkJY29udGVudEVsZW1lbnQsIG1vdmVEb3duSXRlbXMsIG9yZGVyTGlzdCwKLQkJCQkJCWZlYXR1cmUsIE1vdmVJbkxpc3RDb21tYW5kLkRPV04pOwotCQkJCWdldEFjdGlvbk1hbmFnZXIoKS5leGVjdXRlKGNtZCk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JLy8gVmlld2VyIG1ldGhvZHMuCi0JcHJvdGVjdGVkIHZvaWQgaW5pdENvbnRlbnRQcm92aWRlclNlbGVjdGVkKCkgewotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXRDb250ZW50UHJvdmlkZXJTZWxlY3RlZDIoKSB7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdENvbnRlbnRQcm92aWRlclNlbGVjdGVkMygpIHsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29udGVudEVsZW1lbnRPcmRlckxpc3QgZ2V0Q29udGVudEVsZW1lbnRPcmRlckxpc3QoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwcm90ZWN0ZWQgU3RyaW5nW10gZ2V0TW9kZWxTdHJ1Y3R1cmVQYXRoKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHJvdGVjdGVkIE9iamVjdCBnZXRDb250ZW50RWxlbWVudCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRUYWJTdHJpbmcoKSB7Ci0JCXJldHVybiAiY29udGVudGVsZW1lbnQiO30gLy8kTk9OLU5MUy0xJAotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRUYWJTdHJpbmcyKCkgewotCQlyZXR1cm4gZ2V0VGFiU3RyaW5nKCk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRUYWJTdHJpbmczKCkgewotCQlyZXR1cm4gZ2V0VGFiU3RyaW5nKCk7Ci0JfQotCi0JLyoKLQkgKiBnZXRGaWx0ZXJUeXBlcyBzaG91bGQgYmUgb3ZlcnJpZGUgdG8gcGFzcyB0eXBlcy4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nW10gZ2V0RmlsdGVyVHlwZXMoKXsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCS8qCi0JICogZ2V0RmlsdGVyVHlwZXMgc2hvdWxkIGJlIG92ZXJyaWRlIHRvIHBhc3MgdHlwZXMuCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZ1tdIGdldEZpbHRlclR5cGVzMigpewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JLyoKLQkgKiBnZXRGaWx0ZXJUeXBlcyBzaG91bGQgYmUgb3ZlcnJpZGUgdG8gcGFzcyB0eXBlcy4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nW10gZ2V0RmlsdGVyVHlwZXMzKCl7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCBNZXRob2RFbGVtZW50RWRpdG9yIGVkaXRvciA9IChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKTsKLQotCS8vIEZpbHRlciBpbmZvLgotCXByb3RlY3RlZCBJRmlsdGVyIGZpbHRlciwgZmlsdGVyMiwgZmlsdGVyMzsKLQotCXByb3RlY3RlZCBJRmlsdGVyIGdldEZpbHRlcigpIHsKLQkJcmV0dXJuIGZpbHRlcjsKLQl9Ci0KLQlwcm90ZWN0ZWQgSUZpbHRlciBnZXRGaWx0ZXIyKCkgewotCQlyZXR1cm4gZmlsdGVyOwotCX0KLQotCXByb3RlY3RlZCBJRmlsdGVyIGdldEZpbHRlcjMoKSB7Ci0JCXJldHVybiBmaWx0ZXI7Ci0JfQotCi0JLy8gT3JkZXJpbmcgb2YgY29udHJpYnV0ZWQgY2F0ZWdvcml6ZWQgZWxlbWVudHMgaW4gY3VzdG9tCi0JLy8gY2F0ZWdvcmllcwotCXByb3RlY3RlZCBCdXR0b24gY3RybF9vcmRlcmluZzsKLQotCXByb3RlY3RlZCBDb21ib1ZpZXdlciB2aWV3ZXJfc29ydDE7Ci0JCi0JcHJvdGVjdGVkIElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyIGNvbnRlbnRQcm92aWRlclNvcnQgPSBuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoCi0JCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRS5nZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSkgewotCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IG9iamVjdCkgewotCQkJTGlzdDxTdHJpbmc+IHNvcnRUeXBlc0xpc3QgPSBDYXRlZ29yeVNvcnRIZWxwZXIuZ2V0Q2F0ZWdvcnlTb3J0VHlwZXMoKTsKLQkJCXJldHVybiBzb3J0VHlwZXNMaXN0LnRvQXJyYXkoKTsKLQkJfQotCX07Ci0KLQlwcm90ZWN0ZWQgSUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlclNvcnQgPSBuZXcgQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyKAotCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJLmdldE5hdmlnYXRvclZpZXdfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKSB7Ci0JCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0JCQkJU3RyaW5nIHN0ciA9ICgoU3RyaW5nKW9iamVjdCk7Ci0JCQkJcmV0dXJuIENhdGVnb3J5U29ydEhlbHBlci5nZXRTb3J0VHlwZURpc3BsYXlOYW1lKHN0cik7Ci0JCQl9Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX07Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgQXNzb2NpYXRpb25Gb3JtUGFnZShGb3JtRWRpdG9yIGVkaXRvciwgU3RyaW5nIGlkLCBTdHJpbmcgbmFtZSkgewotCQlzdXBlcihlZGl0b3IsIGlkLCBuYW1lKTsKLQkJdGhpcy5lZGl0b3JUYWJOYW1lID0gbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQmFzZUZvcm1QYWdlI2luaXQob3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGUsIG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElFZGl0b3JTaXRlIHNpdGUsIElFZGl0b3JJbnB1dCBpbnB1dCkgewotCQlzdXBlci5pbml0KHNpdGUsIGlucHV0KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLmZvcm1zLmVkaXRvci5jcmVhdGVGb3JtQ29udGVudChJTWFuYWdlZEZvcm0pCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRm9ybUNvbnRlbnQoSU1hbmFnZWRGb3JtIG1hbmFnZWRGb3JtKSB7Ci0JCXN1cGVyLmNyZWF0ZUZvcm1Db250ZW50KG1hbmFnZWRGb3JtKTsKLQotCQlVSUhlbHBlci5zZXRGb3JtVGV4dChmb3JtLCBjb250ZW50RWxlbWVudCk7Ci0JCQotCQkvLyBDcmVhdGUgYSBzZWN0aW9uLgotCQlhU2VjdGlvbiA9IHRvb2xraXQuY3JlYXRlU2VjdGlvbihmb3JtLmdldEJvZHkoKSwgU2VjdGlvbi5USVRMRV9CQVIKLQkJCQl8IFNlY3Rpb24uREVTQ1JJUFRJT04gfCBTZWN0aW9uLlRXSVNUSUUgfCBTZWN0aW9uLkVYUEFOREVEKTsKLQkJVGFibGVXcmFwRGF0YSB0ZCA9IG5ldyBUYWJsZVdyYXBEYXRhKFRhYmxlV3JhcERhdGEuRklMTF9HUkFCKTsKLQkJYVNlY3Rpb24uc2V0TGF5b3V0RGF0YSh0ZCk7Ci0JCWFTZWN0aW9uLnNldFRleHQoZ2V0U2VjdGlvbk5hbWUoKSk7Ci0JCWFTZWN0aW9uLnNldERlc2NyaXB0aW9uKGdldFNlY3Rpb25EZXNjcmlwdGlvbigpKTsKLQkJYVNlY3Rpb24uc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCi0JCWFDb21wb3NpdGUgPSB0b29sa2l0LmNyZWF0ZUNvbXBvc2l0ZShhU2VjdGlvbik7Ci0JCWFDb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCWFDb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKSk7Ci0JCWFTZWN0aW9uLnNldENsaWVudChhQ29tcG9zaXRlKTsKLQotCQlpbnQgbnVtVGFibGVzVXNlZCA9IDA7Ci0KLQkJaWYgKHVzZUNhdGVnb3J5MSkKLQkJCW51bVRhYmxlc1VzZWQrKzsKLQkJaWYgKHVzZUNhdGVnb3J5MikKLQkJCW51bVRhYmxlc1VzZWQrKzsKLQkJaWYgKHVzZUNhdGVnb3J5MykKLQkJCW51bVRhYmxlc1VzZWQrKzsKLQotCQlpZiAodXNlQ2F0ZWdvcnkxKSB7Ci0JCQljYXRlZ29yeTFwYW5lMSA9IGNyZWF0ZUNvbXBvc2l0ZSh0b29sa2l0LCBhQ29tcG9zaXRlLCAxKTsKLQkJCWxhYmVsX0NhdGVnb3J5ID0gY3JlYXRlTGFiZWwodG9vbGtpdCwgY2F0ZWdvcnkxcGFuZTEsIGdldFNlbGVjdGVkTGFiZWwoKSk7Ci0KLQkJCWlmIChjYXRlZ29yeUlzU2luZ2xlU2VsZWN0aW9uMSkKLQkJCQljdHJsX3NlbGVjdGVkID0gY3JlYXRlVGFibGUodG9vbGtpdCwgY2F0ZWdvcnkxcGFuZTEsIFNJTkdMRV9ST1cpOwotCQkJZWxzZSB7Ci0JCQkJaWYgKG51bVRhYmxlc1VzZWQgPT0gMSkKLQkJCQkJY3RybF9zZWxlY3RlZCA9IGNyZWF0ZVRhYmxlKHRvb2xraXQsIGNhdGVnb3J5MXBhbmUxLCBMQVJHRV9TSVpFKTsKLQkJCQllbHNlIGlmIChudW1UYWJsZXNVc2VkID09IDIpCi0JCQkJCWN0cmxfc2VsZWN0ZWQgPSBjcmVhdGVUYWJsZSh0b29sa2l0LCBjYXRlZ29yeTFwYW5lMSwgTUVESVVNX1NJWkUpOwotCQkJCWVsc2UKLQkJCQkJY3RybF9zZWxlY3RlZCA9IGNyZWF0ZVRhYmxlKHRvb2xraXQsIGNhdGVnb3J5MXBhbmUxLCBTTUFMTF9TSVpFKTsKLQkJCX0KLQotCQkJbGlicmFyeVZpZXdGaW5kRWxlbWVudEFjdGlvbiA9IG5ldyBMaWJyYXJ5Vmlld0ZpbmRFbGVtZW50QWN0aW9uKEF1dGhvcmluZ1VJUmVzb3VyY2VzLmFjdGlvbkxhYmVsX2ZpbmRFbGVtZW50SW5MaWJOYXYpOyAKLQkJCXZpZXdlcl9zZWxlY3RlZCA9IG5ldyBUYWJsZVZpZXdlcihjdHJsX3NlbGVjdGVkKTsKLQkJCXZpZXdlcl9zZWxlY3RlZC5zZXRMYWJlbFByb3ZpZGVyKGxhYmVsUHJvdmlkZXJTZWxlY3RlZCk7Ci0JCQlpbml0Q29udGVudFByb3ZpZGVyU2VsZWN0ZWQoKTsKLQkJCXZpZXdlcl9zZWxlY3RlZC5zZXRJbnB1dChjb250ZW50RWxlbWVudCk7Ci0JCQlpZiAoIWlzVXBBbmREb3duQnV0dG9uc1JlcXVpcmVkMSkKLQkJCQl2aWV3ZXJfc2VsZWN0ZWQuc2V0U29ydGVyKG5ldyBWaWV3ZXJTb3J0ZXIoKSk7Ci0KLQkJCWNyZWF0ZUNvbnRleHRNZW51Rm9yKHZpZXdlcl9zZWxlY3RlZCk7Ci0JCQl0b29sa2l0LnBhaW50Qm9yZGVyc0ZvcihjYXRlZ29yeTFwYW5lMSk7Ci0KLQkJCWNhdGVnb3J5MXBhbmUyID0gY3JlYXRlQ29tcG9zaXRlRm9yQnV0dG9ucyh0b29sa2l0LCBhQ29tcG9zaXRlKTsKLQkJCWlmIChhbGxvd0NoYW5nZTEpIHsKLQkJCQljdHJsX2FkZCA9IGNyZWF0ZUJ1dHRvbih0b29sa2l0LCBjYXRlZ29yeTFwYW5lMiwKLQkJCQkJCShjYXRlZ29yeUlzU2luZ2xlU2VsZWN0aW9uMSkgPyBTRUxFQ1RfQlVUVE9OCi0JCQkJCQkJCTogQUREX0JVVFRPTik7Ci0JCQkJY3RybF9yZW1vdmUgPSBjcmVhdGVCdXR0b24odG9vbGtpdCwgY2F0ZWdvcnkxcGFuZTIsCi0JCQkJCQkoY2F0ZWdvcnlJc1NpbmdsZVNlbGVjdGlvbjEpID8gQ0xFQVJfQlVUVE9OCi0JCQkJCQkJCTogUkVNT1ZFX0JVVFRPTik7Ci0KLQkJCQlpZiAoaXNVcEFuZERvd25CdXR0b25zUmVxdWlyZWQxKSB7Ci0JCQkJCWN0cmxfdXAxID0gY3JlYXRlQnV0dG9uKHRvb2xraXQsIGNhdGVnb3J5MXBhbmUyLCBVUF9CVVRUT04pOwotCQkJCQljdHJsX2Rvd24xID0gY3JlYXRlQnV0dG9uKHRvb2xraXQsIGNhdGVnb3J5MXBhbmUyLCBET1dOX0JVVFRPTik7Ci0JCQkJCWlmIChjb250ZW50RWxlbWVudCBpbnN0YW5jZW9mIENvbnRlbnRDYXRlZ29yeSkgewotCQkJCQkJY3RybF9vcmRlcmluZyA9IGNyZWF0ZUJ1dHRvbih0b29sa2l0LCBjYXRlZ29yeTFwYW5lMiwgT1JERVJfQlVUVE9OKTsKLQkJCQkJCWN0cmxfb3JkZXJpbmcuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQkJCUNvbWJvIGN0cmxfc29ydDEgPSBjcmVhdGVDb21ib1dpdGhMYWJlbCh0b29sa2l0LCBjYXRlZ29yeTFwYW5lMiwgTGlicmFyeUVkaXRSZXNvdXJjZXMuU29ydFR5cGVfTGFiZWwpOwotCQkJCQkJdmlld2VyX3NvcnQxID0gbmV3IENvbWJvVmlld2VyKGN0cmxfc29ydDEpOwotCQkJCQkJdmlld2VyX3NvcnQxLnNldENvbnRlbnRQcm92aWRlcihjb250ZW50UHJvdmlkZXJTb3J0KTsKLQkJCQkJCXZpZXdlcl9zb3J0MS5zZXRMYWJlbFByb3ZpZGVyKGxhYmVsUHJvdmlkZXJTb3J0KTsKLQkJCQkJCXZpZXdlcl9zb3J0MS5zZXRJbnB1dChjb250ZW50RWxlbWVudCk7Ci0JCQkJCQkvLyBzZXQgaW5pdGlhbCBzZWxlY3Rpb24KLQkJCQkJCVN0cmluZyBzb3J0VHlwZSA9IENhdGVnb3J5U29ydEhlbHBlci5nZXRDYXRlZ29yeVNvcnRWYWx1ZShjb250ZW50RWxlbWVudCk7Ci0JCQkJCQl2aWV3ZXJfc29ydDEuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKHNvcnRUeXBlKSwgdHJ1ZSk7Ci0JCQkJCX0KLQotCQkJCQkvLyBjdHJsX29yZGVyaW5nLnNldExheW91dERhdGEobmV3Ci0JCQkJCS8vIEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCi0JCQkJfQotCQkJfQotCQkJdG9vbGtpdC5wYWludEJvcmRlcnNGb3IoY2F0ZWdvcnkxcGFuZTIpOwotCQl9Ci0KLQkJaWYgKHVzZUNhdGVnb3J5MikgewotCQkJY2F0ZWdvcnkycGFuZTEgPSBjcmVhdGVDb21wb3NpdGUodG9vbGtpdCwgYUNvbXBvc2l0ZSwgMSk7Ci0JCQlsYWJlbF9DYXRlZ29yeTIgPSBjcmVhdGVMYWJlbCh0b29sa2l0LCBjYXRlZ29yeTJwYW5lMSwgZ2V0U2VsZWN0ZWRMYWJlbDIoKSk7Ci0JCQlpZiAoY2F0ZWdvcnlJc1NpbmdsZVNlbGVjdGlvbjIpCi0JCQkJY3RybF9zZWxlY3RlZDIgPSBjcmVhdGVUYWJsZSh0b29sa2l0LCBjYXRlZ29yeTJwYW5lMSwgU0lOR0xFX1JPVyk7Ci0JCQllbHNlIHsKLQkJCQlpZiAobnVtVGFibGVzVXNlZCA9PSAxKQotCQkJCQljdHJsX3NlbGVjdGVkMiA9IGNyZWF0ZVRhYmxlKHRvb2xraXQsIGNhdGVnb3J5MnBhbmUxLCBMQVJHRV9TSVpFKTsKLQkJCQllbHNlIGlmIChudW1UYWJsZXNVc2VkID09IDIpCi0JCQkJCWN0cmxfc2VsZWN0ZWQyID0gY3JlYXRlVGFibGUodG9vbGtpdCwgY2F0ZWdvcnkycGFuZTEsIE1FRElVTV9TSVpFKTsKLQkJCQllbHNlCi0JCQkJCWN0cmxfc2VsZWN0ZWQyID0gY3JlYXRlVGFibGUodG9vbGtpdCwgY2F0ZWdvcnkycGFuZTEsIFNNQUxMX1NJWkUpOwotCQkJfQotCQkJdmlld2VyX3NlbGVjdGVkMiA9IG5ldyBUYWJsZVZpZXdlcihjdHJsX3NlbGVjdGVkMik7Ci0JCQl2aWV3ZXJfc2VsZWN0ZWQyLnNldExhYmVsUHJvdmlkZXIobGFiZWxQcm92aWRlclNlbGVjdGVkMik7Ci0JCQlpbml0Q29udGVudFByb3ZpZGVyU2VsZWN0ZWQyKCk7Ci0JCQl2aWV3ZXJfc2VsZWN0ZWQyLnNldElucHV0KGNvbnRlbnRFbGVtZW50KTsKLQkJCXZpZXdlcl9zZWxlY3RlZDIuc2V0U29ydGVyKG5ldyBWaWV3ZXJTb3J0ZXIoKSk7Ci0JCQljcmVhdGVDb250ZXh0TWVudUZvcih2aWV3ZXJfc2VsZWN0ZWQyKTsKLQotCQkJdG9vbGtpdC5wYWludEJvcmRlcnNGb3IoY2F0ZWdvcnkycGFuZTEpOwotCi0JCQljYXRlZ29yeTJwYW5lMiA9IGNyZWF0ZUNvbXBvc2l0ZUZvckJ1dHRvbnModG9vbGtpdCwgYUNvbXBvc2l0ZSk7Ci0JCQlpZiAoYWxsb3dDaGFuZ2UyKSB7Ci0JCQkJY3RybF9hZGQyID0gY3JlYXRlQnV0dG9uKHRvb2xraXQsIGNhdGVnb3J5MnBhbmUyLCBBRERfQlVUVE9OKTsKLQkJCQljdHJsX3JlbW92ZTIgPSBjcmVhdGVCdXR0b24odG9vbGtpdCwgY2F0ZWdvcnkycGFuZTIsIFJFTU9WRV9CVVRUT04pOwotCi0JCQkJaWYgKGlzVXBBbmREb3duQnV0dG9uc1JlcXVpcmVkMikgewotCQkJCQljdHJsX3VwMiA9IGNyZWF0ZUJ1dHRvbih0b29sa2l0LCBjYXRlZ29yeTJwYW5lMiwgVVBfQlVUVE9OKTsKLQkJCQkJY3RybF9kb3duMiA9IGNyZWF0ZUJ1dHRvbih0b29sa2l0LCBjYXRlZ29yeTJwYW5lMiwgRE9XTl9CVVRUT04pOwotCQkJCX0KLQkJCX0KLQkJCXRvb2xraXQucGFpbnRCb3JkZXJzRm9yKGNhdGVnb3J5MnBhbmUyKTsKLQkJfQotCi0JCWlmICh1c2VDYXRlZ29yeTMpIHsKLQkJCWNhdGVnb3J5M3BhbmUxID0gY3JlYXRlQ29tcG9zaXRlKHRvb2xraXQsIGFDb21wb3NpdGUsIDEpOwotCQkJbGFiZWxfQ2F0ZWdvcnkzID0gY3JlYXRlTGFiZWwodG9vbGtpdCwgY2F0ZWdvcnkzcGFuZTEsIGdldFNlbGVjdGVkTGFiZWwzKCkpOwotCQkJaWYgKGNhdGVnb3J5SXNTaW5nbGVTZWxlY3Rpb24zKQotCQkJCWN0cmxfc2VsZWN0ZWQzID0gY3JlYXRlVGFibGUodG9vbGtpdCwgY2F0ZWdvcnkzcGFuZTEsIFNJTkdMRV9ST1cpOwotCQkJZWxzZSB7Ci0JCQkJaWYgKG51bVRhYmxlc1VzZWQgPT0gMSkKLQkJCQkJY3RybF9zZWxlY3RlZDMgPSBjcmVhdGVUYWJsZSh0b29sa2l0LCBjYXRlZ29yeTNwYW5lMSwgTEFSR0VfU0laRSk7Ci0JCQkJZWxzZSBpZiAobnVtVGFibGVzVXNlZCA9PSAyKQotCQkJCQljdHJsX3NlbGVjdGVkMyA9IGNyZWF0ZVRhYmxlKHRvb2xraXQsIGNhdGVnb3J5M3BhbmUxLCBNRURJVU1fU0laRSk7Ci0JCQkJZWxzZQotCQkJCQljdHJsX3NlbGVjdGVkMyA9IGNyZWF0ZVRhYmxlKHRvb2xraXQsIGNhdGVnb3J5M3BhbmUxLCBTTUFMTF9TSVpFKTsKLQkJCX0KLQkJCXZpZXdlcl9zZWxlY3RlZDMgPSBuZXcgVGFibGVWaWV3ZXIoY3RybF9zZWxlY3RlZDMpOwotCQkJdmlld2VyX3NlbGVjdGVkMy5zZXRMYWJlbFByb3ZpZGVyKGxhYmVsUHJvdmlkZXJTZWxlY3RlZDMpOwotCQkJaW5pdENvbnRlbnRQcm92aWRlclNlbGVjdGVkMygpOwotCQkJdmlld2VyX3NlbGVjdGVkMy5zZXRJbnB1dChjb250ZW50RWxlbWVudCk7Ci0JCQl2aWV3ZXJfc2VsZWN0ZWQzLnNldFNvcnRlcihuZXcgVmlld2VyU29ydGVyKCkpOwotCQkJY3JlYXRlQ29udGV4dE1lbnVGb3Iodmlld2VyX3NlbGVjdGVkMyk7Ci0KLQkJCXRvb2xraXQucGFpbnRCb3JkZXJzRm9yKGNhdGVnb3J5M3BhbmUxKTsKLQotCQkJY2F0ZWdvcnkzcGFuZTIgPSBjcmVhdGVDb21wb3NpdGVGb3JCdXR0b25zKHRvb2xraXQsIGFDb21wb3NpdGUpOwotCQkJaWYgKGFsbG93Q2hhbmdlMykgewotCQkJCWN0cmxfYWRkMyA9IGNyZWF0ZUJ1dHRvbih0b29sa2l0LCBjYXRlZ29yeTNwYW5lMiwgQUREX0JVVFRPTik7Ci0JCQkJY3RybF9yZW1vdmUzID0gY3JlYXRlQnV0dG9uKHRvb2xraXQsIGNhdGVnb3J5M3BhbmUyLCBSRU1PVkVfQlVUVE9OKTsKLQotCQkJCWlmIChpc1VwQW5kRG93bkJ1dHRvbnNSZXF1aXJlZDMpIHsKLQkJCQkJY3RybF91cDMgPSBjcmVhdGVCdXR0b24odG9vbGtpdCwgY2F0ZWdvcnkzcGFuZTIsIFVQX0JVVFRPTik7Ci0JCQkJCWN0cmxfZG93bjMgPSBjcmVhdGVCdXR0b24odG9vbGtpdCwgY2F0ZWdvcnkzcGFuZTIsIERPV05fQlVUVE9OKTsKLQkJCQl9Ci0JCQl9Ci0JCQl0b29sa2l0LnBhaW50Qm9yZGVyc0ZvcihjYXRlZ29yeTNwYW5lMik7Ci0JCX0KLQotCQlzZXRFbmFibGVkQWRkQnV0dG9ucyh0cnVlKTsKLQotCQlzZXRXaWRnZXRXaWR0aHMoKTsKLQkJQ29tcG9zaXRlIHBhbmU3ID0gY3JlYXRlQ29tcG9zaXRlKHRvb2xraXQsIGFDb21wb3NpdGUsCi0JCQkJR3JpZERhdGEuRklMTF9CT1RILCAxLCAxLCAxKTsKLQkJY3RybF9icmllZkRlc2MgPSBjcmVhdGVUZXh0RWRpdFdpdGhMYWJlbExhcmdlKAotCQkJCXRvb2xraXQsCi0JCQkJcGFuZTcsCi0JCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuQXNzb2NpYXRpb25Gb3JtUGFnZV9CcmllZkRlc2NyaXB0aW9uTGFiZWwpOyAKLQkJY3RybF9icmllZkRlc2Muc2V0RWRpdGFibGUoZmFsc2UpOwotCQl0b29sa2l0LnBhaW50Qm9yZGVyc0ZvcihwYW5lNyk7Ci0JCXRvb2xraXQucGFpbnRCb3JkZXJzRm9yKGFDb21wb3NpdGUpOwotCi0JCWFkZExpc3RlbmVycygpOwotCi0JCXNldENvbnRleHRIZWxwKCk7Ci0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRFbmFibGVkQWRkQnV0dG9ucyhib29sZWFuIHZhbHVlKSB7Ci0JCWlmIChhbGxvd0NoYW5nZTEpCi0JCQljdHJsX2FkZC5zZXRFbmFibGVkKHZhbHVlKTsKLQkJaWYgKHVzZUNhdGVnb3J5MiAmJiBhbGxvd0NoYW5nZTIpCi0JCQljdHJsX2FkZDIuc2V0RW5hYmxlZCh2YWx1ZSk7Ci0JCWlmICh1c2VDYXRlZ29yeTMgJiYgYWxsb3dDaGFuZ2UzKQotCQkJY3RybF9hZGQzLnNldEVuYWJsZWQodmFsdWUpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldEVuYWJsZWRSZW1vdmVCdXR0b25zKGJvb2xlYW4gdmFsdWUpIHsKLQkJaWYgKGFsbG93Q2hhbmdlMSkKLQkJCWN0cmxfcmVtb3ZlLnNldEVuYWJsZWQodmFsdWUpOwotCQlpZiAodXNlQ2F0ZWdvcnkyICYmIGFsbG93Q2hhbmdlMikKLQkJCWN0cmxfcmVtb3ZlMi5zZXRFbmFibGVkKHZhbHVlKTsKLQkJaWYgKHVzZUNhdGVnb3J5MyAmJiBhbGxvd0NoYW5nZTMpCi0JCQljdHJsX3JlbW92ZTMuc2V0RW5hYmxlZCh2YWx1ZSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZGlzYWJsZUJ1dHRvbnNBbmREZXNlbGVjdFRhYmxlcygpIHsKLQkJLy8gc2V0RW5hYmxlZEFkZEJ1dHRvbnMoZmFsc2UpOwotCQlzZXRFbmFibGVkUmVtb3ZlQnV0dG9ucyhmYWxzZSk7Ci0JCXZpZXdlcl9zZWxlY3RlZC5zZXRTZWxlY3Rpb24obnVsbCwgdHJ1ZSk7Ci0JCWlmICh1c2VDYXRlZ29yeTIpCi0JCQl2aWV3ZXJfc2VsZWN0ZWQyLnNldFNlbGVjdGlvbihudWxsLCB0cnVlKTsKLQkJaWYgKHVzZUNhdGVnb3J5MykKLQkJCXZpZXdlcl9zZWxlY3RlZDMuc2V0U2VsZWN0aW9uKG51bGwsIHRydWUpOwotCQljdHJsX2JyaWVmRGVzYy5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hWaWV3ZXJzKCkgewotCi0JCXZpZXdlcl9zZWxlY3RlZC5yZWZyZXNoKCk7Ci0JCS8vIENoZWNrIGlmIGV4aXN0aW5nIGVsZW1lbnQgaXMgY29udHJpYnV0b3IvY29udHJpYnV0ZXMgZm9yIHN0YW5kYXJkCi0JCS8vIGNhdGVnb3JpZXMKLQkJLy8gc2hvdWxkIG5vdCBzaG93biBpbiB0aGUgdGFibGV2aWV3ZXIuCi0JCS8vIENvbW1lbnRlZCBiZWxvdyB0byBhbGxvdyBjb250cmlidXRvcnMgdG8gZGlzcGxheSBpbiB0aGUgbGlzdCBib3gKLQkJLy8gaWYoY29udGVudEVsZW1lbnQgaW5zdGFuY2VvZiBDb250ZW50Q2F0ZWdvcnkpewotCQkvLyBpZighKGNvbnRlbnRFbGVtZW50IGluc3RhbmNlb2YgQ3VzdG9tQ2F0ZWdvcnkpKXsKLQkJLy8gT2JqZWN0W10gZWxlbWVudHMgPQotCQkvLyBjb250ZW50UHJvdmlkZXJTZWxlY3RlZC5nZXRFbGVtZW50cyhjb250ZW50RWxlbWVudCk7Ci0JCS8vIGZvcihpbnQgaT0wOyBpPGVsZW1lbnRzLmxlbmd0aDsgaSsrKXsKLQkJLy8gT2JqZWN0IGVsZW1lbnQgPSBlbGVtZW50c1tpXTsKLQkJLy8gaWYoZWxlbWVudCBpbnN0YW5jZW9mIENvbnRlbnRFbGVtZW50KXsKLQkJLy8gaWYoVUlIZWxwZXIuaXNDb250cmlidXRvcigoQ29udGVudEVsZW1lbnQpZWxlbWVudCkpewotCQkvLyB2aWV3ZXJfc2VsZWN0ZWQucmVtb3ZlKGVsZW1lbnQpOwotCQkvLyB9Ci0JCS8vIH0KLQkJLy8gfQotCQkvLyB9Ci0JCS8vIH0KLQotCQlpZiAodXNlQ2F0ZWdvcnkyKSB7Ci0JCQl2aWV3ZXJfc2VsZWN0ZWQyLnJlZnJlc2goKTsKLQkJCS8vIGlmKGNvbnRlbnRFbGVtZW50IGluc3RhbmNlb2YgQ29udGVudENhdGVnb3J5KXsKLQkJCS8vIE9iamVjdFtdIGVsZW1lbnRzID0KLQkJCS8vIGNvbnRlbnRQcm92aWRlclNlbGVjdGVkMi5nZXRFbGVtZW50cyhjb250ZW50RWxlbWVudCk7Ci0JCQkvLyBmb3IoaW50IGk9MDsgaTxlbGVtZW50cy5sZW5ndGg7IGkrKyl7Ci0JCQkvLyBPYmplY3QgZWxlbWVudCA9IGVsZW1lbnRzW2ldOwotCQkJLy8gaWYoZWxlbWVudCBpbnN0YW5jZW9mIENvbnRlbnRFbGVtZW50KXsKLQkJCS8vIGlmKFVJSGVscGVyLmlzQ29udHJpYnV0b3IoKENvbnRlbnRFbGVtZW50KWVsZW1lbnQpKXsKLQkJCS8vIHZpZXdlcl9zZWxlY3RlZDIucmVtb3ZlKGVsZW1lbnQpOwotCQkJLy8gfQotCQkJLy8gfQotCQkJLy8gfQotCQkJLy8gfQotCi0JCX0KLQkJaWYgKHVzZUNhdGVnb3J5MykgewotCQkJdmlld2VyX3NlbGVjdGVkMy5yZWZyZXNoKCk7Ci0JCQkvLyBpZihjb250ZW50RWxlbWVudCBpbnN0YW5jZW9mIENvbnRlbnRDYXRlZ29yeSl7Ci0JCQkvLyBPYmplY3RbXSBlbGVtZW50cyA9Ci0JCQkvLyBjb250ZW50UHJvdmlkZXJTZWxlY3RlZDMuZ2V0RWxlbWVudHMoY29udGVudEVsZW1lbnQpOwotCQkJLy8gZm9yKGludCBpPTA7IGk8ZWxlbWVudHMubGVuZ3RoOyBpKyspewotCQkJLy8gT2JqZWN0IGVsZW1lbnQgPSBlbGVtZW50c1tpXTsKLQkJCS8vIGlmKGVsZW1lbnQgaW5zdGFuY2VvZiBDb250ZW50RWxlbWVudCl7Ci0JCQkvLyBpZihVSUhlbHBlci5pc0NvbnRyaWJ1dG9yKChDb250ZW50RWxlbWVudCllbGVtZW50KSl7Ci0JCQkvLyB2aWV3ZXJfc2VsZWN0ZWQzLnJlbW92ZShlbGVtZW50KTsKLQkJCS8vIH0KLQkJCS8vIH0KLQkJCS8vIH0KLQkJCS8vIH0KLQkJfQotCQljdHJsX2JyaWVmRGVzYy5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotCi0JfQotCi0JLyoqCi0JICogQWRkIGxpc3RlbmVycwotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZExpc3RlbmVycygpIHsKLQkJZm9ybS5hZGRMaXN0ZW5lcihTV1QuQWN0aXZhdGUsIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQlpZiAoZm9ybSAhPSBudWxsICYmICFmb3JtLmlzRGlzcG9zZWQoKSkgewotCQkJCQlVSUhlbHBlci5zZXRGb3JtVGV4dChmb3JtLCBjb250ZW50RWxlbWVudCk7Ci0JCQkJfQotCQkJCXJlZnJlc2hWaWV3ZXJzKCk7Ci0JCQkJaWYgKFRuZ1V0aWwuaXNMb2NrZWQoY29udGVudEVsZW1lbnQpKSB7Ci0JCQkJCWVuYWJsZUNvbnRyb2xzKGZhbHNlKTsKLQkJCQl9IGVsc2UgewotCQkJCQllbmFibGVDb250cm9scyh0cnVlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCQkKLQkJZm9ybS5hZGRMaXN0ZW5lcihTV1QuRGVhY3RpdmF0ZSwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCWlmIChmb3JtICE9IG51bGwgJiYgIWZvcm0uaXNEaXNwb3NlZCgpKSB7Ci0JCQkJCVVJSGVscGVyLnNldEZvcm1UZXh0KGZvcm0sIGNvbnRlbnRFbGVtZW50KTsKLQkJCQl9Ci0JCQkJcmVmcmVzaFZpZXdlcnMoKTsKLQkJCQlpZiAoVG5nVXRpbC5pc0xvY2tlZChjb250ZW50RWxlbWVudCkpIHsKLQkJCQkJZW5hYmxlQ29udHJvbHMoZmFsc2UpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWVuYWJsZUNvbnRyb2xzKHRydWUpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJaWYgKHVzZUNhdGVnb3J5MSkgewotCQkJLy8gQWRkIGZvY3VzIGxpc3RlbmVyIG9uIHByaW1hcnkgdGFza3MgbGlzdAotCQkJY3RybF9zZWxlY3RlZC5hZGRGb2N1c0xpc3RlbmVyKG5ldyBGb2N1c0FkYXB0ZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgZm9jdXNHYWluZWQoRm9jdXNFdmVudCBlKSB7Ci0JCQkJCWRpc2FibGVCdXR0b25zQW5kRGVzZWxlY3RUYWJsZXMoKTsKLQotCQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHZpZXdlcl9zZWxlY3RlZAotCQkJCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQkJCQkJaWYgKGFsbG93Q2hhbmdlMSAmJiBzZWxlY3Rpb24uc2l6ZSgpID4gMAotCQkJCQkJCSYmICFUbmdVdGlsLmlzTG9ja2VkKGNvbnRlbnRFbGVtZW50KSkgewotCQkJCQkJY3RybF9yZW1vdmUuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0pOwotCi0JCQl2aWV3ZXJfc2VsZWN0ZWQKLQkJCQkJLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQotCQkJCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHZpZXdlcl9zZWxlY3RlZAotCQkJCQkJCQkJLmdldFNlbGVjdGlvbigpOwotCQkJCQkJCWxpYnJhcnlWaWV3RmluZEVsZW1lbnRBY3Rpb24uc2VsZWN0aW9uQ2hhbmdlZChldmVudCk7Ci0JCQkJCQkJaWYgKGFsbG93Q2hhbmdlMSAmJiBzZWxlY3Rpb24uc2l6ZSgpID4gMAotCQkJCQkJCQkJJiYgIVRuZ1V0aWwuaXNMb2NrZWQoY29udGVudEVsZW1lbnQpKSB7Ci0JCQkJCQkJCWN0cmxfcmVtb3ZlLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJCQkJfQotCQkJCQkJCWVuYWJsZVVwRG93bkJ1dHRvbnMxKCk7Ci0KLQkJCQkJCQlpZiAoc2VsZWN0aW9uLnNpemUoKSA9PSAxKSB7Ci0JCQkJCQkJCVN0cmluZyBkZXNjID0gKChNZXRob2RFbGVtZW50KSBzZWxlY3Rpb24KLQkJCQkJCQkJCQkuZ2V0Rmlyc3RFbGVtZW50KCkpCi0JCQkJCQkJCQkJLmdldEJyaWVmRGVzY3JpcHRpb24oKTsKLQkJCQkJCQkJaWYgKGRlc2MgPT0gbnVsbCkgewotCQkJCQkJCQkJZGVzYyA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJCX0KLQkJCQkJCQkJY3RybF9icmllZkRlc2Muc2V0VGV4dChkZXNjKTsKLQkJCQkJCQl9IGVsc2UgaWYgKHNlbGVjdGlvbi5zaXplKCkgPiAxKSB7Ci0JCQkJCQkJCWN0cmxfYnJpZWZEZXNjCi0JCQkJCQkJCQkJLnNldFRleHQoZ2V0TXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbihzZWxlY3Rpb24KLQkJCQkJCQkJCQkJCS5zaXplKCkpKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0KLQkJCQkJfSk7Ci0KLQkJCWlmIChhbGxvd0NoYW5nZTEpIHsKLQkJCQljdHJsX2FkZC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQkJVGFibGVJdGVtW10gaXRlbXMgPSB2aWV3ZXJfc2VsZWN0ZWQuZ2V0VGFibGUoKQotCQkJCQkJCQkuZ2V0SXRlbXMoKTsKLQkJCQkJCUxpc3Qgc2VsZWN0ZWRMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykgewotCQkJCQkJCXNlbGVjdGVkTGlzdC5hZGQoaXRlbXNbaV0uZ2V0RGF0YSgpKTsKLQkJCQkJCX0KLQotCQkJCQkJaWYgKGdldEZpbHRlcigpICE9IG51bGwpIHsKLQkJCQkJCQlJdGVtc0ZpbHRlckRpYWxvZyBmZCA9IG5ldyBJdGVtc0ZpbHRlckRpYWxvZygKLQkJCQkJCQkJCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkKLQkJCQkJCQkJCQkJLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpCi0JCQkJCQkJCQkJCS5nZXRTaGVsbCgpLCBnZXRGaWx0ZXIoKSwKLQkJCQkJCQkJCWdldENvbnRlbnRFbGVtZW50KCksIGdldFRhYlN0cmluZygpKTsKLQkJCQkJCQlmZC5zZXRCbG9ja09uT3Blbih0cnVlKTsKLQkJCQkJCQlmZC5zZXRUaXRsZShnZXRUYWJTdHJpbmcoKSk7Ci0JCQkJCQkJaWYoY2F0ZWdvcnlJc1NpbmdsZVNlbGVjdGlvbjEpewotCQkJCQkJCQlmZC5zZXRWaWV3ZXJTZWxlY3Rpb25TaW5nbGUodHJ1ZSk7Ci0JCQkJCQkJfQotCQkJCQkJCWZkLnNldEV4aXN0aW5nRWxlbWVudHMoc2VsZWN0ZWRMaXN0KTsKLQkJCQkJCQlpZihnZXRGaWx0ZXJUeXBlcygpICE9IG51bGwpewotCQkJCQkJCQlmZC5zZXRUeXBlcyhnZXRGaWx0ZXJUeXBlcygpKTsKLQkJCQkJCQl9Ci0JCQkJCQkJZmQub3BlbigpOwotCQkJCQkJCWFkZEl0ZW1zVG9Nb2RlbDEoZmQuZ2V0U2VsZWN0ZWRJdGVtcygpKTsKLQkJCQkJCX0KLQkJCQkJCS8vIHZpZXdlcl9zZWxlY3RlZC5yZWZyZXNoKCk7Ci0JCQkJCQlyZWZyZXNoVmlld2VycygpOwotCi0JCQkJCX0KLQkJCQl9KTsKLQotCQkJCWN0cmxfcmVtb3ZlLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHZpZXdlcl9zZWxlY3RlZAotCQkJCQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJCQlpZiAoc2VsZWN0aW9uLnNpemUoKSA+IDApIHsKLQkJCQkJCQkvLyB1cGRhdGUgdGhlIG1vZGVsCi0JCQkJCQkJQXJyYXlMaXN0IHJtSXRlbXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCQkJcm1JdGVtcy5hZGRBbGwoc2VsZWN0aW9uLnRvTGlzdCgpKTsKLQkJCQkJCQlyZW1vdmVJdGVtc0Zyb21Nb2RlbDEocm1JdGVtcyk7Ci0JCQkJCQkJLy8gdmlld2VyX3NlbGVjdGVkLnJlZnJlc2goKTsKLQkJCQkJCQlyZWZyZXNoVmlld2VycygpOwotCQkJCQkJCS8vIGNsZWFyIHRoZSBzZWxlY3Rpb24KLQkJCQkJCQl2aWV3ZXJfc2VsZWN0ZWQuc2V0U2VsZWN0aW9uKG51bGwsIHRydWUpOwotCQkJCQkJCWN0cmxfYnJpZWZEZXNjLnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQl9Ci0JCQkJCQljdHJsX3JlbW92ZS5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQkJfQotCQkJCX0pOwotCQkJfQotCQl9Ci0KLQkJaWYgKHVzZUNhdGVnb3J5MikgewotCQkJLy8gQWRkIGZvY3VzIGxpc3RlbmVyIG9uIHByaW1hcnkgdGFza3MgbGlzdAotCQkJY3RybF9zZWxlY3RlZDIuYWRkRm9jdXNMaXN0ZW5lcihuZXcgRm9jdXNBZGFwdGVyKCkgewotCQkJCXB1YmxpYyB2b2lkIGZvY3VzR2FpbmVkKEZvY3VzRXZlbnQgZSkgewotCQkJCQlkaXNhYmxlQnV0dG9uc0FuZERlc2VsZWN0VGFibGVzKCk7Ci0KLQkJCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB2aWV3ZXJfc2VsZWN0ZWQyCi0JCQkJCQkJLmdldFNlbGVjdGlvbigpOwotCQkJCQlpZiAoYWxsb3dDaGFuZ2UyICYmIHNlbGVjdGlvbi5zaXplKCkgPiAwCi0JCQkJCQkJJiYgIVRuZ1V0aWwuaXNMb2NrZWQoY29udGVudEVsZW1lbnQpKSB7Ci0JCQkJCQljdHJsX3JlbW92ZTIuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0pOwotCi0JCQl2aWV3ZXJfc2VsZWN0ZWQyCi0JCQkJCS5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0KLQkJCQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB2aWV3ZXJfc2VsZWN0ZWQyCi0JCQkJCQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJCQkJbGlicmFyeVZpZXdGaW5kRWxlbWVudEFjdGlvbi5zZWxlY3Rpb25DaGFuZ2VkKGV2ZW50KTsKLQkJCQkJCQlpZiAoYWxsb3dDaGFuZ2UyICYmIHNlbGVjdGlvbi5zaXplKCkgPiAwCi0JCQkJCQkJCQkmJiAhVG5nVXRpbC5pc0xvY2tlZChjb250ZW50RWxlbWVudCkpIHsKLQkJCQkJCQkJY3RybF9yZW1vdmUyLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJCQkJfQotCQkJCQkJCWlmIChzZWxlY3Rpb24uc2l6ZSgpID09IDEpIHsKLQkJCQkJCQkJU3RyaW5nIGRlc2MgPSAoKE1ldGhvZEVsZW1lbnQpIHNlbGVjdGlvbgotCQkJCQkJCQkJCS5nZXRGaXJzdEVsZW1lbnQoKSkKLQkJCQkJCQkJCQkuZ2V0QnJpZWZEZXNjcmlwdGlvbigpOwotCQkJCQkJCQlpZiAoZGVzYyA9PSBudWxsKSB7Ci0JCQkJCQkJCQlkZXNjID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJfQotCQkJCQkJCQljdHJsX2JyaWVmRGVzYy5zZXRUZXh0KGRlc2MpOwotCQkJCQkJCX0gZWxzZSBpZiAoc2VsZWN0aW9uLnNpemUoKSA+IDEpIHsKLQkJCQkJCQkJY3RybF9icmllZkRlc2MKLQkJCQkJCQkJCQkuc2V0VGV4dChnZXRNdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uKHNlbGVjdGlvbgotCQkJCQkJCQkJCQkJLnNpemUoKSkpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQotCQkJCQl9KTsKLQotCQkJaWYgKGFsbG93Q2hhbmdlMikgewotCQkJCWN0cmxfYWRkMi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQkJVGFibGVJdGVtW10gaXRlbXMgPSB2aWV3ZXJfc2VsZWN0ZWQyLmdldFRhYmxlKCkKLQkJCQkJCQkJLmdldEl0ZW1zKCk7Ci0JCQkJCQlMaXN0IHNlbGVjdGVkTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHsKLQkJCQkJCQlzZWxlY3RlZExpc3QuYWRkKGl0ZW1zW2ldLmdldERhdGEoKSk7Ci0JCQkJCQl9Ci0JCQkJCQlpZiAoZ2V0RmlsdGVyMigpICE9IG51bGwpIHsKLQkJCQkJCQlJdGVtc0ZpbHRlckRpYWxvZyBmZCA9IG5ldyBJdGVtc0ZpbHRlckRpYWxvZygKLQkJCQkJCQkJCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkKLQkJCQkJCQkJCQkJLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpCi0JCQkJCQkJCQkJCS5nZXRTaGVsbCgpLCBnZXRGaWx0ZXIyKCksCi0JCQkJCQkJCQlnZXRDb250ZW50RWxlbWVudCgpLCBnZXRUYWJTdHJpbmcyKCkpOwotCQkJCQkJCWZkLnNldEJsb2NrT25PcGVuKHRydWUpOwotCQkJCQkJCWZkLnNldFRpdGxlKGdldFRhYlN0cmluZzIoKSk7Ci0JCQkJCQkJZmQuc2V0RXhpc3RpbmdFbGVtZW50cyhzZWxlY3RlZExpc3QpOwotCQkJCQkJCWZkLm9wZW4oKTsKLQkJCQkJCQlhZGRJdGVtc1RvTW9kZWwyKGZkLmdldFNlbGVjdGVkSXRlbXMoKSk7Ci0JCQkJCQl9Ci0JCQkJCQl2aWV3ZXJfc2VsZWN0ZWQyLnJlZnJlc2goKTsKLQkJCQkJfQotCQkJCX0pOwotCi0JCQkJY3RybF9yZW1vdmUyLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHZpZXdlcl9zZWxlY3RlZDIKLQkJCQkJCQkJLmdldFNlbGVjdGlvbigpOwotCQkJCQkJaWYgKHNlbGVjdGlvbi5zaXplKCkgPiAwKSB7Ci0JCQkJCQkJLy8gdXBkYXRlIHRoZSBtb2RlbAotCQkJCQkJCUFycmF5TGlzdCBybUl0ZW1zID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQkJCXJtSXRlbXMuYWRkQWxsKHNlbGVjdGlvbi50b0xpc3QoKSk7Ci0JCQkJCQkJcmVtb3ZlSXRlbXNGcm9tTW9kZWwyKHJtSXRlbXMpOwotCQkJCQkJCXZpZXdlcl9zZWxlY3RlZDIucmVmcmVzaCgpOwotCi0JCQkJCQkJLy8gY2xlYXIgdGhlIHNlbGVjdGlvbgotCQkJCQkJCXZpZXdlcl9zZWxlY3RlZDIuc2V0U2VsZWN0aW9uKG51bGwsIHRydWUpOwotCQkJCQkJCWN0cmxfYnJpZWZEZXNjLnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQl9Ci0JCQkJCQljdHJsX3JlbW92ZTIuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCX0KLQkJfQotCQlpZiAodXNlQ2F0ZWdvcnkzKSB7Ci0JCQkvLyBBZGQgZm9jdXMgbGlzdGVuZXIgb24gcHJpbWFyeSB0YXNrcyBsaXN0Ci0JCQljdHJsX3NlbGVjdGVkMy5hZGRGb2N1c0xpc3RlbmVyKG5ldyBGb2N1c0FkYXB0ZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgZm9jdXNHYWluZWQoRm9jdXNFdmVudCBlKSB7Ci0JCQkJCWRpc2FibGVCdXR0b25zQW5kRGVzZWxlY3RUYWJsZXMoKTsKLQotCQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHZpZXdlcl9zZWxlY3RlZDMKLQkJCQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJCWlmIChhbGxvd0NoYW5nZTMgJiYgc2VsZWN0aW9uLnNpemUoKSA+IDAKLQkJCQkJCQkmJiAhVG5nVXRpbC5pc0xvY2tlZChjb250ZW50RWxlbWVudCkpIHsKLQkJCQkJCWN0cmxfcmVtb3ZlMy5zZXRFbmFibGVkKHRydWUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfSk7Ci0KLQkJCXZpZXdlcl9zZWxlY3RlZDMKLQkJCQkJLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQotCQkJCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHZpZXdlcl9zZWxlY3RlZDMKLQkJCQkJCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQkJCQkJCQlsaWJyYXJ5Vmlld0ZpbmRFbGVtZW50QWN0aW9uLnNlbGVjdGlvbkNoYW5nZWQoZXZlbnQpOwotCQkJCQkJCWlmIChhbGxvd0NoYW5nZTMgJiYgc2VsZWN0aW9uLnNpemUoKSA+IDAKLQkJCQkJCQkJCSYmICFUbmdVdGlsLmlzTG9ja2VkKGNvbnRlbnRFbGVtZW50KSkgewotCQkJCQkJCQljdHJsX3JlbW92ZTMuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQkJCQl9Ci0JCQkJCQkJaWYgKHNlbGVjdGlvbi5zaXplKCkgPT0gMSkgewotCQkJCQkJCQlTdHJpbmcgZGVzYyA9ICgoTWV0aG9kRWxlbWVudCkgc2VsZWN0aW9uCi0JCQkJCQkJCQkJLmdldEZpcnN0RWxlbWVudCgpKQotCQkJCQkJCQkJCS5nZXRCcmllZkRlc2NyaXB0aW9uKCk7Ci0JCQkJCQkJCWlmIChkZXNjID09IG51bGwpIHsKLQkJCQkJCQkJCWRlc2MgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQl9Ci0JCQkJCQkJCWN0cmxfYnJpZWZEZXNjLnNldFRleHQoZGVzYyk7Ci0JCQkJCQkJfSBlbHNlIGlmIChzZWxlY3Rpb24uc2l6ZSgpID4gMSkgewotCQkJCQkJCQljdHJsX2JyaWVmRGVzYwotCQkJCQkJCQkJCS5zZXRUZXh0KGdldE11bHRpcGxlU2VsZWN0RGVzY3JpcHRpb24oc2VsZWN0aW9uCi0JCQkJCQkJCQkJCQkuc2l6ZSgpKSk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCi0JCQkJCX0pOwotCi0JCQlpZiAoYWxsb3dDaGFuZ2UzKSB7Ci0JCQkJY3RybF9hZGQzLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCQlUYWJsZUl0ZW1bXSBpdGVtcyA9IHZpZXdlcl9zZWxlY3RlZDMuZ2V0VGFibGUoKQotCQkJCQkJCQkuZ2V0SXRlbXMoKTsKLQkJCQkJCUxpc3Qgc2VsZWN0ZWRMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykgewotCQkJCQkJCXNlbGVjdGVkTGlzdC5hZGQoaXRlbXNbaV0uZ2V0RGF0YSgpKTsKLQkJCQkJCX0KLQkJCQkJCWlmIChnZXRGaWx0ZXIzKCkgIT0gbnVsbCkgewotCQkJCQkJCUl0ZW1zRmlsdGVyRGlhbG9nIGZkID0gbmV3IEl0ZW1zRmlsdGVyRGlhbG9nKAotCQkJCQkJCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKQotCQkJCQkJCQkJCQkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkKLQkJCQkJCQkJCQkJLmdldFNoZWxsKCksIGdldEZpbHRlcjMoKSwKLQkJCQkJCQkJCWdldENvbnRlbnRFbGVtZW50KCksIGdldFRhYlN0cmluZzMoKSk7Ci0JCQkJCQkJZmQuc2V0QmxvY2tPbk9wZW4odHJ1ZSk7Ci0JCQkJCQkJZmQuc2V0VGl0bGUoZ2V0VGFiU3RyaW5nMygpKTsKLQkJCQkJCQlmZC5zZXRFeGlzdGluZ0VsZW1lbnRzKHNlbGVjdGVkTGlzdCk7Ci0JCQkJCQkJZmQub3BlbigpOwotCQkJCQkJCWFkZEl0ZW1zVG9Nb2RlbDMoZmQuZ2V0U2VsZWN0ZWRJdGVtcygpKTsKLQkJCQkJCX0KLQkJCQkJCXZpZXdlcl9zZWxlY3RlZDMucmVmcmVzaCgpOwotCi0JCQkJCX0KLQkJCQl9KTsKLQotCQkJCWN0cmxfcmVtb3ZlMy5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB2aWV3ZXJfc2VsZWN0ZWQzCi0JCQkJCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQkJCQkJCWlmIChzZWxlY3Rpb24uc2l6ZSgpID4gMCkgewotCQkJCQkJCS8vIHVwZGF0ZSB0aGUgbW9kZWwKLQkJCQkJCQlBcnJheUxpc3Qgcm1JdGVtcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJCQlybUl0ZW1zLmFkZEFsbChzZWxlY3Rpb24udG9MaXN0KCkpOwotCQkJCQkJCXJlbW92ZUl0ZW1zRnJvbU1vZGVsMyhybUl0ZW1zKTsKLQkJCQkJCQl2aWV3ZXJfc2VsZWN0ZWQzLnJlZnJlc2goKTsKLQotCQkJCQkJCS8vIGNsZWFyIHRoZSBzZWxlY3Rpb24KLQkJCQkJCQl2aWV3ZXJfc2VsZWN0ZWQzLnNldFNlbGVjdGlvbihudWxsLCB0cnVlKTsKLQkJCQkJCQljdHJsX2JyaWVmRGVzYy5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJfQotCQkJCQkJY3RybF9yZW1vdmUzLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQl9Ci0JCX0KLQotCQlpZiAoYWxsb3dDaGFuZ2UxICYmIGlzVXBBbmREb3duQnV0dG9uc1JlcXVpcmVkMSkgewotCQkJY3RybF91cDEuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHZpZXdlcl9zZWxlY3RlZAotCQkJCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQkJCQkJaWYgKHNlbGVjdGlvbi5zaXplKCkgPiAwKSB7Ci0JCQkJCQlBcnJheUxpc3QgbW92ZVVwSXRlbXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCQltb3ZlVXBJdGVtcy5hZGRBbGwoc2VsZWN0aW9uLnRvTGlzdCgpKTsKLQkJCQkJCW1vdmVVcEl0ZW1zSW5TZWxlY3RlZEl0ZW1zMShtb3ZlVXBJdGVtcyk7Ci0JCQkJCX0KLQkJCQkJLy8gdmlld2VyX3NlbGVjdGVkLnJlZnJlc2goKTsKLQkJCQkJcmVmcmVzaFZpZXdlcnMoKTsKLQkJCQkJZW5hYmxlVXBEb3duQnV0dG9uczEoKTsKLQkJCQl9Ci0JCQl9KTsKLQotCQkJY3RybF9kb3duMS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgdmlld2VyX3NlbGVjdGVkCi0JCQkJCQkJLmdldFNlbGVjdGlvbigpOwotCQkJCQlpZiAoc2VsZWN0aW9uLnNpemUoKSA+IDApIHsKLQkJCQkJCUFycmF5TGlzdCBtb3ZlRG93bkl0ZW1zID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQkJbW92ZURvd25JdGVtcy5hZGRBbGwoc2VsZWN0aW9uLnRvTGlzdCgpKTsKLQkJCQkJCW1vdmVEb3duSXRlbXNJblNlbGVjdGVkSXRlbXMxKG1vdmVEb3duSXRlbXMpOwotCQkJCQl9Ci0JCQkJCS8vIHZpZXdlcl9zZWxlY3RlZC5yZWZyZXNoKCk7Ci0JCQkJCXJlZnJlc2hWaWV3ZXJzKCk7Ci0JCQkJCWVuYWJsZVVwRG93bkJ1dHRvbnMxKCk7Ci0JCQkJfQotCQkJfSk7Ci0KLQkJCWlmIChjdHJsX29yZGVyaW5nICE9IG51bGwpIHsKLQkJCQljdHJsX29yZGVyaW5nLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCQlDb250ZW50RWxlbWVudHNPcmRlckRpYWxvZyBkbGcgPSBuZXcgQ29udGVudEVsZW1lbnRzT3JkZXJEaWFsb2coCi0JCQkJCQkJCURpc3BsYXkuZ2V0Q3VycmVudCgpLmdldEFjdGl2ZVNoZWxsKCksCi0JCQkJCQkJCWNvbnRlbnRFbGVtZW50LCBnZXRBY3Rpb25NYW5hZ2VyKCkpOwotCQkJCQkJZGxnLnNldEZlYXR1cmUoZ2V0T3JkZXJGZWF0dXJlKCkpOwotCQkJCQkJZGxnLm9wZW4oKTsKLQkJCQkJCWlmIChhbGxvd0NoYW5nZTEgJiYgaXNVcEFuZERvd25CdXR0b25zUmVxdWlyZWQxKSB7Ci0JCQkJCQkJU3RyaW5nIHNvcnRUeXBlID0gQ2F0ZWdvcnlTb3J0SGVscGVyLmdldENhdGVnb3J5U29ydFZhbHVlKGNvbnRlbnRFbGVtZW50KTsKLQkJCQkJCQl2aWV3ZXJfc29ydDEuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKHNvcnRUeXBlKSwgdHJ1ZSk7Ci0JCQkJCQkJdmlld2VyX3NvcnQxLnJlZnJlc2goKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0pOwotCQkJfQotCQkJCi0JCQlpZiAodmlld2VyX3NvcnQxICE9IG51bGwpIHsKLQkJCQl2aWV3ZXJfc29ydDEuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewotCQkJCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQkJCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB2aWV3ZXJfc29ydDEKLQkJCQkJCQkJLmdldFNlbGVjdGlvbigpOwotCQkJCQkJU3RyaW5nIHNvcnRUeXBlID0gKFN0cmluZylzZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCQkJCQlpZiAoIUNhdGVnb3J5U29ydEhlbHBlci5nZXRDYXRlZ29yeVNvcnRWYWx1ZShjb250ZW50RWxlbWVudCkuZXF1YWxzKHNvcnRUeXBlKSkgewotCQkJCQkJCU1ldGhvZEVsZW1lbnRQcm9wZXJ0eSBwcm9wID0gQ2F0ZWdvcnlTb3J0SGVscGVyLmdldENhdGVnb3J5U29ydFByb3BlcnR5KGNvbnRlbnRFbGVtZW50KTsKLQkJCQkJCQkKLQkJCQkJCQlpZiAocHJvcCA9PSBudWxsKSB7CQkJCi0JCQkJCQkJCXByb3AgPSBDYXRlZ29yeVNvcnRIZWxwZXIuY3JlYXRlTmV3U29ydFByb3BlcnR5KHNvcnRUeXBlKTsKLQkJCQkJCQkJZ2V0QWN0aW9uTWFuYWdlcigpCi0JCQkJCQkJCS5kb0FjdGlvbigKLQkJCQkJCQkJCQlJQWN0aW9uTWFuYWdlci5BREQsCi0JCQkJCQkJCQkJY29udGVudEVsZW1lbnQsCi0JCQkJCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCQkJCS5nZXRNZXRob2RFbGVtZW50X01ldGhvZEVsZW1lbnRQcm9wZXJ0eSgpLAotCQkJCQkJCQkJCXByb3AsIC0xKTsKLQkJCQkJCQl9Ci0JCQkJCQkJZWxzZSB7Ci0JCQkJCQkJCWdldEFjdGlvbk1hbmFnZXIoKS5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5TRVQsCi0JCQkJCQkJCQlwcm9wLAotCQkJCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCQkJLmdldE1ldGhvZEVsZW1lbnRQcm9wZXJ0eV9WYWx1ZSgpLAotCQkJCQkJCQkJCQlzb3J0VHlwZSwgLTEpOwotCQkJCQkJCX0KLQkJCQkJCQlMaWJyYXJ5Vmlldy5nZXRWaWV3KCkucmVmcmVzaFZpZXdzKCk7Ci0JCQkJCQl9Ci0JCQkJCQlyZWZyZXNoVmlld2VycygpOwotCQkJCQkJZW5hYmxlVXBEb3duQnV0dG9uczEoKTsKLQkJCQkJfQotCQkJCX0pOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIEVTdHJ1Y3R1cmFsRmVhdHVyZSBnZXRPcmRlckZlYXR1cmUoKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZW5hYmxlQ29udHJvbHMoYm9vbGVhbiBlZGl0YWJsZSkgewotCQlpZiAodXNlQ2F0ZWdvcnkxKSB7Ci0JCQlpZiAoYWxsb3dDaGFuZ2UxKSB7Ci0JCQkJY3RybF9hZGQuc2V0RW5hYmxlZChlZGl0YWJsZSk7Ci0JCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB2aWV3ZXJfc2VsZWN0ZWQKLQkJCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQkJCQlpZiAoYWxsb3dDaGFuZ2UxICYmIHNlbGVjdGlvbi5zaXplKCkgPiAwCi0JCQkJCQkmJiAhVG5nVXRpbC5pc0xvY2tlZChjb250ZW50RWxlbWVudCkpIHsKLQkJCQkJY3RybF9yZW1vdmUuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQl9IGVsc2UgewotCQkJCQljdHJsX3JlbW92ZS5zZXRFbmFibGVkKGZhbHNlKTsKLQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWlmICh1c2VDYXRlZ29yeTIpIHsKLQkJCWlmIChhbGxvd0NoYW5nZTIpIHsKLQkJCQljdHJsX2FkZDIuc2V0RW5hYmxlZChlZGl0YWJsZSk7Ci0JCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB2aWV3ZXJfc2VsZWN0ZWQyCi0JCQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJaWYgKGFsbG93Q2hhbmdlMiAmJiBzZWxlY3Rpb24uc2l6ZSgpID4gMAotCQkJCQkJJiYgIVRuZ1V0aWwuaXNMb2NrZWQoY29udGVudEVsZW1lbnQpKSB7Ci0JCQkJCWN0cmxfcmVtb3ZlMi5zZXRFbmFibGVkKHRydWUpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWN0cmxfcmVtb3ZlMi5zZXRFbmFibGVkKGZhbHNlKTsKLQotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAodXNlQ2F0ZWdvcnkzKSB7Ci0JCQlpZiAoYWxsb3dDaGFuZ2UzKSB7Ci0JCQkJY3RybF9hZGQzLnNldEVuYWJsZWQoZWRpdGFibGUpOwotCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgdmlld2VyX3NlbGVjdGVkMwotCQkJCQkJLmdldFNlbGVjdGlvbigpOwotCQkJCWlmIChhbGxvd0NoYW5nZTMgJiYgc2VsZWN0aW9uLnNpemUoKSA+IDAKLQkJCQkJCSYmICFUbmdVdGlsLmlzTG9ja2VkKGNvbnRlbnRFbGVtZW50KSkgewotCQkJCQljdHJsX3JlbW92ZTMuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQl9IGVsc2UgewotCQkJCQljdHJsX3JlbW92ZTMuc2V0RW5hYmxlZChmYWxzZSk7Ci0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZW5hYmxlVXBEb3duQnV0dG9uczEoKTsKLQkJaWYgKGlzVXBBbmREb3duQnV0dG9uc1JlcXVpcmVkMSAmJiB2aWV3ZXJfc29ydDEgIT0gbnVsbCkgewotCQkJaWYgKCFUbmdVdGlsLmlzTG9ja2VkKGNvbnRlbnRFbGVtZW50KSkgewotCQkJCXZpZXdlcl9zb3J0MS5nZXRDb21ibygpLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQl9IGVsc2UgewotCQkJCXZpZXdlcl9zb3J0MS5nZXRDb21ibygpLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJfQotCQl9Ci0JfQotCi0Jdm9pZCBzZXREaXJ0eShib29sZWFuIGIpIHsKLQkJLy8gUGhvbmcgKDAzLzA3LzIwMDUpOiB0aGUgZGlydHkgc3RhdGUgb2YgdGhlIGVkaXRvciBpcyBhbHJlYWR5IHRha2VuCi0JCS8vIGNhcmUgaW4gTWV0aG9kRWxlbWVudEVkaXRvciwgdHJhbnNwYXJlbnQgZnJvbSB1c2VyCi0JCS8vIGludGVyYWN0aW9uLiBObyBmaXJlUHJvcGVydHlDaGFuZ2UoUFJPUF9ESVJUWSkgc2hvdWxkIGJlIGNhbGxlZAotCQkvLyBzb21ld2hlcmUgZWxzZS4KLQkJLy8gTk9URTogdW5uZWNlc3NhcnkgY2FsbHMgdG8gZmlyZVByb3BlcnR5Q2hhbmdlKFBST1BfRElSVFkpIHdpbGwgY2F1c2UKLQkJLy8gcGVyZm9ybWFuY2UgcHJvYmxlbS4KLQkJLy8gZmlyZVByb3BlcnR5Q2hhbmdlKFBST1BfRElSVFkpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuZm9ybXMuZWRpdG9yLkZvcm1QYWdlI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWlmICh1c2VkQ2F0ZWdvcmllcy5zaXplKCkgPiAwKQotCQkJTGlicmFyeU1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5yZWxlYXNlQ2F0ZWdvcmllcyhjb250ZW50RWxlbWVudCwKLQkJCQkJdXNlZENhdGVnb3JpZXMpOwotCi0JCWlmIChsYWJlbFByb3ZpZGVyU2VsZWN0ZWQgIT0gbnVsbCkgewotCQkJbGFiZWxQcm92aWRlclNlbGVjdGVkLmRpc3Bvc2UoKTsKLQkJfQotCQlpZiAobGFiZWxQcm92aWRlclNlbGVjdGVkMiAhPSBudWxsKSB7Ci0JCQlsYWJlbFByb3ZpZGVyU2VsZWN0ZWQyLmRpc3Bvc2UoKTsKLQkJfQotCQlpZiAobGFiZWxQcm92aWRlclNlbGVjdGVkMyAhPSBudWxsKSB7Ci0JCQlsYWJlbFByb3ZpZGVyU2VsZWN0ZWQzLmRpc3Bvc2UoKTsKLQkJfQotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2VjdGlvbiBuYW1lLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VjdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNlY3Rpb24gZGVzY3JpcHRpb24uCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTZWN0aW9uRGVzY3JpcHRpb24oKSB7Ci0JCS8vIFRWVCBpc3N1ZSBzaW5nbGUgcXVvdGUgCi0JCS8vIEZvcm1hdCBzaG91bGQgYmUgZG9uZSBvbmx5IGZvciBDYXRlZ29yeUd1aWRhbmNlUGFnZSwgQXV0aG9yaW5nVUkuY2F0ZWdvcnlHdWlkYW5jZXNQYWdlLnNlY3Rpb25EZXNjcmlwdGlvbiBrZXkgCi0JCS8vIGhhdmUgaGFzIHJlcGxhY2VtZW50IHZhcmlhYmxlIGluIGl0cyB2YWx1ZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24gY2hlY2sgTkxTX01FU1NBR0VGT1JNQVRfVkFSCi0JICAgLyogCi0JICAgICogTkxTX01FU1NBR0VGT1JNQVRfVkFSCi0JICAgIFN0cmluZ3Mgd2hpY2ggY29udGFpbiByZXBsYWNlbWVudCB2YXJpYWJsZXMgYXJlIHByb2Nlc3NlZCBieSB0aGUgIAotCSAgICBNZXNzYWdlRm9ybWF0IGNsYXNzIChzaW5nbGUgcXVvdGUgbXVzdCBiZSBjb2RlZCBhcyAyIGNvbnNlY3V0aXZlIHNpbmdsZSAgCi0JICAgIHF1b3RlcyAnJykuIFN0cmluZ3Mgd2hpY2ggZG8gTk9UIGNvbnRhaW4gcmVwbGFjZW1lbnQgdmFyaWFibGVzIGFyZSBOT1QgICAKLQkgICAgcHJvY2Vzc2VkIGJ5IHRoZSBNZXNzYWdlRm9ybWF0IGNsYXNzIChzaW5nbGUgcXVvdGUgbXVzdCBiZSBjb2RlZCBhcyAxCi0JCXNpbmdsZSBxdW90ZSAnKS4qLwotCQkKLQkJaWYgKG1ldGhvZEVsZW1lbnQgaW5zdGFuY2VvZiBDb250ZW50RWxlbWVudAotCQkJCSYmICJjYXRlZ29yeUd1aWRhbmNlc1BhZ2UiLmVxdWFsc0lnbm9yZUNhc2UoZ2V0SWQoKSkpIHsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIE5MUy5iaW5kKGdldElkKCkgKyAiX3NlY3Rpb25EZXNjcmlwdGlvbiIsIExpYnJhcnlVSVRleHQuZ2V0VUlUZXh0TG93ZXIobWV0aG9kRWxlbWVudCkpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZmlyc3Qgc2VsZWN0ZWQgbGFibGUuCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTZWxlY3RlZExhYmVsKCkgewotCQkvLyBpZiAobWV0aG9kRWxlbWVudCBpbnN0YW5jZW9mIENvbnRlbnRDYXRlZ29yeSkgewotCQkvLyByZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZm9ybWF0U3RyaW5nKFBBQ0tBR0VfUFJFRklYICsgZ2V0SWQoKSArCi0JCS8vICIuc2VsZWN0ZWRMYWJlbCIsIExpYnJhcnlVSVRleHQuZ2V0VUlUZXh0KG1ldGhvZEVsZW1lbnQpKTsKLQkJLy8gLy8kTk9OLU5MUy0xJAotCQkvLyB9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNlY29uZCBzZWxlY3RlZCBsYWJsZS4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlbGVjdGVkTGFiZWwyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB0aGlyZCBzZWxlY3RlZCBsYWJsZS4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlbGVjdGVkTGFiZWwzKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtdWx0aXBsZSBzZWN0aW9uIGRlc2NyaXB0aW9uLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbihpbnQgY291bnQpIHsKLQkJcmV0dXJuIGdldE11bHRpcGxlU2VsZWN0RGVzY3JpcHRpb24oY291bnQsIGdldE11bHRpcGxlU2VsZWN0RGVzY3JpcHRpb25TdHJpbmcoKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtdWx0aXBsZSBzZWN0aW9uIGRlc2NyaXB0aW9uLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbihpbnQgY291bnQsIFN0cmluZyBtZXNzYWdlKSB7Ci0JCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy5iaW5kKG1lc3NhZ2UsIG5ldyBJbnRlZ2VyKGNvdW50KSk7Ci0JfQotCQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvblN0cmluZygpIHsKLQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLnJvbGVDYXRlZ29yaWVzUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uOwotCX0KLQotCS8qKgotCSAqIFNldCBkZXNjcmlwdGlvbiBmb3Igc2VjdGlvbgotCSAqIEBwYXJhbSBzZWN0aW9uRGVzYwotCSAqIAkJCURlc2NyaXB0aW9uCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2VjdGlvbkRlc2MoU3RyaW5nIHNlY3Rpb25EZXNjKSB7Ci0JCXRoaXMuc2VjdGlvbkRlc2MgPSBzZWN0aW9uRGVzYzsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgZmlyc3QgbGFiZWwKLQkgKiBAcGFyYW0gc2VsZWN0ZWRMYWJlbDEKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTZWxlY3RlZExhYmVsKFN0cmluZyBzZWxlY3RlZExhYmVsMSkgewotCQl0aGlzLnNlbGVjdGVkTGFiZWwgPSBzZWxlY3RlZExhYmVsMTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgc2Vjb25kIGxhYmVsCi0JICogQHBhcmFtIHNlbGVjdGVkTGFiZWwyCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2VsZWN0ZWRMYWJlbDIoU3RyaW5nIHNlbGVjdGVkTGFiZWwyKSB7Ci0JCXRoaXMuc2VsZWN0ZWRMYWJlbDIgPSBzZWxlY3RlZExhYmVsMjsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhpcmQgbGFiZWwKLQkgKiBAcGFyYW0gc2VsZWN0ZWRMYWJlbDMKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTZWxlY3RlZExhYmVsMyhTdHJpbmcgc2VsZWN0ZWRMYWJlbDMpIHsKLQkJdGhpcy5zZWxlY3RlZExhYmVsMyA9IHNlbGVjdGVkTGFiZWwzOwotCX0KLQotCS8qKgotCSAqIFNldCBhbiBvcHRpb24gZm9yIHRoZSBmaXJzdCBjYXRlZ29yeSB0byBiZSBlaXRoZXIgc2luZ2xlIHNlbGVjdGlvbiBvciBtdWx0aXBsZSBzZWxlY3Rpb24KLQkgKiBAcGFyYW0gY2F0ZWdvcnlJc1NpbmdsZVNlbGVjdGlvbjEKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDYXRlZ29yeUlzU2luZ2xlU2VsZWN0aW9uMShib29sZWFuIGNhdGVnb3J5SXNTaW5nbGVTZWxlY3Rpb24xKSB7Ci0JCXRoaXMuY2F0ZWdvcnlJc1NpbmdsZVNlbGVjdGlvbjEgPSBjYXRlZ29yeUlzU2luZ2xlU2VsZWN0aW9uMTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgYW4gb3B0aW9uIGZvciB0aGUgc2Vjb25kIGNhdGVnb3J5IHRvIGJlIGVpdGhlciBzaW5nbGUgc2VsZWN0aW9uIG9yIG11bHRpcGxlIHNlbGVjdGlvbgotCSAqIEBwYXJhbSBjYXRlZ29yeUlzU2luZ2xlU2VsZWN0aW9uMgotCSAqLwotCXB1YmxpYyB2b2lkIHNldENhdGVnb3J5SXNTaW5nbGVTZWxlY3Rpb24yKGJvb2xlYW4gY2F0ZWdvcnlJc1NpbmdsZVNlbGVjdGlvbjIpIHsKLQkJdGhpcy5jYXRlZ29yeUlzU2luZ2xlU2VsZWN0aW9uMiA9IGNhdGVnb3J5SXNTaW5nbGVTZWxlY3Rpb24yOwotCX0KLQotCS8qKgotCSAqIFNldCBhbiBvcHRpb24gZm9yIHRoZSB0aGlyZCBjYXRlZ29yeSB0byBiZSBlaXRoZXIgc2luZ2xlIHNlbGVjdGlvbiBvciBtdWx0aXBsZSBzZWxlY3Rpb24KLQkgKiBAcGFyYW0gY2F0ZWdvcnlJc1NpbmdsZVNlbGVjdGlvbjMKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDYXRlZ29yeUlzU2luZ2xlU2VsZWN0aW9uMyhib29sZWFuIGNhdGVnb3J5SXNTaW5nbGVTZWxlY3Rpb24zKSB7Ci0JCXRoaXMuY2F0ZWdvcnlJc1NpbmdsZVNlbGVjdGlvbjMgPSBjYXRlZ29yeUlzU2luZ2xlU2VsZWN0aW9uMzsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgYW4gb3B0aW9uIHRvIHVzZSBmaXJzdCBjYXRlZ29yeQotCSAqIEBwYXJhbSB1c2VDYXRlZ29yeTEKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRVc2VDYXRlZ29yeTEoYm9vbGVhbiB1c2VDYXRlZ29yeTEpIHsKLQkJdGhpcy51c2VDYXRlZ29yeTEgPSB1c2VDYXRlZ29yeTE7Ci0JfQotCi0JLyoqCi0JICogU2V0IGFuIG9wdGlvbiB0byB1c2Ugc2Vjb25kIGNhdGVnb3J5Ci0JICogQHBhcmFtIHVzZUNhdGVnb3J5MgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFVzZUNhdGVnb3J5Mihib29sZWFuIHVzZUNhdGVnb3J5MikgewotCQl0aGlzLnVzZUNhdGVnb3J5MiA9IHVzZUNhdGVnb3J5MjsKLQl9Ci0KLQkKLQkvKioKLQkgKiBTZXQgYW4gb3B0aW9uIHRvIHVzZSB0aGlyZCBjYXRlZ29yeQotCSAqIEBwYXJhbSB1c2VDYXRlZ29yeTMKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRVc2VDYXRlZ29yeTMoYm9vbGVhbiB1c2VDYXRlZ29yeTMpIHsKLQkJdGhpcy51c2VDYXRlZ29yeTMgPSB1c2VDYXRlZ29yeTM7Ci0JfQotCi0JLyoqCi0JICogU2V0IGFuIG9wdGlvbiB0byBhbGxvdyBjaGFuZ2VzIGZvciBmaXJzdCB0YWJsZSBpbiBVSQotCSAqIEBwYXJhbSBhbGxvd0NoYW5nZTEKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBbGxvd0NoYW5nZTEoYm9vbGVhbiBhbGxvd0NoYW5nZTEpIHsKLQkJdGhpcy5hbGxvd0NoYW5nZTEgPSBhbGxvd0NoYW5nZTE7Ci0JfQotCi0JLyoqCi0JICogU2V0IGFuIG9wdGlvbiB0byBhbGxvdyBjaGFuZ2VzIGZvciB0aGUgc2Vjb25kIHRhYmxlIGluIFVJCi0JICogQHBhcmFtIGFsbG93Q2hhbmdlMgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFsbG93Q2hhbmdlMihib29sZWFuIGFsbG93Q2hhbmdlMikgewotCQl0aGlzLmFsbG93Q2hhbmdlMiA9IGFsbG93Q2hhbmdlMjsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgYW4gb3B0aW9uIHRvIGFsbG93IGNoYW5nZXMgZm9yIHRoaXJkIHRhYmxlLgotCSAqIEBwYXJhbSBhbGxvd0NoYW5nZTMKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBbGxvd0NoYW5nZTMoYm9vbGVhbiBhbGxvd0NoYW5nZTMpIHsKLQkJdGhpcy5hbGxvd0NoYW5nZTMgPSBhbGxvd0NoYW5nZTM7Ci0JfQotCi0JLyoqCi0JICogU2V0IGFuIG9wdGlvbiB0byBzaG93IGZpcnN0IHNldCBvZiB1cC9kb3duIGJ1dHRvbnMKLQkgKiBAcGFyYW0gaXNVcEFuZERvd25CdXR0b25zUmVxdWlyZWQxCi0JICovCi0JcHVibGljIHZvaWQgc2V0SXNVcEFuZERvd25CdXR0b25zUmVxdWlyZWQxKAotCQkJYm9vbGVhbiBpc1VwQW5kRG93bkJ1dHRvbnNSZXF1aXJlZDEpIHsKLQkJdGhpcy5pc1VwQW5kRG93bkJ1dHRvbnNSZXF1aXJlZDEgPSBpc1VwQW5kRG93bkJ1dHRvbnNSZXF1aXJlZDE7Ci0JfQotCi0JLyoqCi0JICogU2V0IGFuIG9wdGlvbiB0byBzaG93IHNlY29uZCBzZXQgb2YgdXAvZG93biBidXR0b25zCi0JICogQHBhcmFtIGlzVXBBbmREb3duQnV0dG9uc1JlcXVpcmVkMgotCSAqLwotCXB1YmxpYyB2b2lkIHNldElzVXBBbmREb3duQnV0dG9uc1JlcXVpcmVkMigKLQkJCWJvb2xlYW4gaXNVcEFuZERvd25CdXR0b25zUmVxdWlyZWQyKSB7Ci0JCXRoaXMuaXNVcEFuZERvd25CdXR0b25zUmVxdWlyZWQyID0gaXNVcEFuZERvd25CdXR0b25zUmVxdWlyZWQyOwotCX0KLQotCS8qKgotCSAqIFNldCBhbiBvcHRpb24gdG8gc2hvdyB0aGlyZCBzZXQgb2YgdXAvZG93biBidXR0b25zLgotCSAqIEBwYXJhbSBpc1VwQW5kRG93bkJ1dHRvbnNSZXF1aXJlZDMKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJc1VwQW5kRG93bkJ1dHRvbnNSZXF1aXJlZDMoCi0JCQlib29sZWFuIGlzVXBBbmREb3duQnV0dG9uc1JlcXVpcmVkMykgewotCQl0aGlzLmlzVXBBbmREb3duQnV0dG9uc1JlcXVpcmVkMyA9IGlzVXBBbmREb3duQnV0dG9uc1JlcXVpcmVkMzsKLQl9Ci0KLQkvLyBjYWxjdWxhdGUgd2lkdGhzIGZvciBsYWJlbHMgYW5kIHRhYmxlcywgYmFzZWQgb24gd2lkdGggb2YgbGFiZWxzCi0JcHJvdGVjdGVkIHZvaWQgc2V0V2lkZ2V0V2lkdGhzKCkgewotCQlpbnQgYWxsQ2F0ZWdvcmllc1dpZHRoID0gMCwgY2F0ZWdvcnlXaWR0aCA9IDAsIGNhdGVnb3J5MldpZHRoID0gMCwgY2F0ZWdvcnkzV2lkdGggPSAwOwotCQlpbnQgbGFyZ2VzdFdpZHRoID0gMDsKLQkJLy8gaWYgKHVzZUNhdGVnb3J5MSkgYWxsQ2F0ZWdvcmllc1dpZHRoID0KLQkJLy8gbGFiZWxfYWxsQ2F0ZWdvcmllcy5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpLng7Ci0JCWlmICh1c2VDYXRlZ29yeTEpCi0JCQljYXRlZ29yeVdpZHRoID0gbGFiZWxfQ2F0ZWdvcnkKLQkJCQkJLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCkueDsKLQkJaWYgKHVzZUNhdGVnb3J5MikKLQkJCWNhdGVnb3J5MldpZHRoID0gbGFiZWxfQ2F0ZWdvcnkyLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULAotCQkJCQlTV1QuREVGQVVMVCkueDsKLQkJaWYgKHVzZUNhdGVnb3J5MykKLQkJCWNhdGVnb3J5M1dpZHRoID0gbGFiZWxfQ2F0ZWdvcnkzLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULAotCQkJCQlTV1QuREVGQVVMVCkueDsKLQotCQlpZiAodXNlQ2F0ZWdvcnkxKQotCQkJbGFyZ2VzdFdpZHRoID0gTWF0aC5tYXgoYWxsQ2F0ZWdvcmllc1dpZHRoLCBjYXRlZ29yeVdpZHRoKTsKLQkJaWYgKHVzZUNhdGVnb3J5MikKLQkJCWxhcmdlc3RXaWR0aCA9IE1hdGgubWF4KGxhcmdlc3RXaWR0aCwgY2F0ZWdvcnkyV2lkdGgpOwotCQlpZiAodXNlQ2F0ZWdvcnkzKQotCQkJbGFyZ2VzdFdpZHRoID0gTWF0aC5tYXgobGFyZ2VzdFdpZHRoLCBjYXRlZ29yeTNXaWR0aCk7Ci0KLQkJaWYgKHVzZUNhdGVnb3J5MSkgewotCQkJLy8gKChHcmlkRGF0YSlsYWJlbF9hbGxDYXRlZ29yaWVzLmdldExheW91dERhdGEoKSkud2lkdGhIaW50ID0KLQkJCS8vIGxhcmdlc3RXaWR0aDsKLQkJCS8vICgoR3JpZERhdGEpY3RybF9hbGxBdmFpbGFibGUuZ2V0TGF5b3V0RGF0YSgpKS53aWR0aEhpbnQgPQotCQkJLy8gbGFyZ2VzdFdpZHRoOwotCQkJKChHcmlkRGF0YSkgbGFiZWxfQ2F0ZWdvcnkuZ2V0TGF5b3V0RGF0YSgpKS53aWR0aEhpbnQgPSBsYXJnZXN0V2lkdGg7Ci0JCQkoKEdyaWREYXRhKSBjdHJsX3NlbGVjdGVkLmdldExheW91dERhdGEoKSkud2lkdGhIaW50ID0gbGFyZ2VzdFdpZHRoOwotCQl9Ci0JCWlmICh1c2VDYXRlZ29yeTIpIHsKLQkJCSgoR3JpZERhdGEpIGxhYmVsX0NhdGVnb3J5Mi5nZXRMYXlvdXREYXRhKCkpLndpZHRoSGludCA9IGxhcmdlc3RXaWR0aDsKLQkJCSgoR3JpZERhdGEpIGN0cmxfc2VsZWN0ZWQyLmdldExheW91dERhdGEoKSkud2lkdGhIaW50ID0gbGFyZ2VzdFdpZHRoOwotCQl9Ci0JCWlmICh1c2VDYXRlZ29yeTMpIHsKLQkJCSgoR3JpZERhdGEpIGxhYmVsX0NhdGVnb3J5My5nZXRMYXlvdXREYXRhKCkpLndpZHRoSGludCA9IGxhcmdlc3RXaWR0aDsKLQkJCSgoR3JpZERhdGEpIGN0cmxfc2VsZWN0ZWQzLmdldExheW91dERhdGEoKSkud2lkdGhIaW50ID0gbGFyZ2VzdFdpZHRoOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIElBY3Rpb25NYW5hZ2VyIGdldEFjdGlvbk1hbmFnZXIoKSB7Ci0JCUZvcm1FZGl0b3IgZWRpdG9yID0gZ2V0RWRpdG9yKCk7Ci0JCWlmIChlZGl0b3IgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50RWRpdG9yKSB7Ci0JCQlyZXR1cm4gKChNZXRob2RFbGVtZW50RWRpdG9yKSBlZGl0b3IpLmdldEFjdGlvbk1hbmFnZXIoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0Q29udGV4dEhlbHAoKSB7Ci0JCS8vIGluIHRoZSBmdXR1cmUsIHdlIHNob3VsZCBjaGVjayB0aGUgc3ViY2xhc3MgdHlwZSB0byBzZXQgdXAgYQotCQkvLyBkaWZmZXJlbnQKLQkJLy8gY29udGV4dCBwYWdlIGZvciBlY2ggdHlwZSBvZiBhc3NvY2lhdGlvbnMKLQkJRWRpdG9yc0NvbnRleHRIZWxwZXIuc2V0SGVscChnZXRQYXJ0Q29udHJvbCgpLCBnZXRDb250ZW50RWxlbWVudCgpKTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlIGNvbnRleHQgbWVudSBmb3IgdGhlIGdpdmVuIHZpZXdlcgotCSAqIEBwYXJhbSB2aWV3ZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250ZXh0TWVudUZvcihmaW5hbCBTdHJ1Y3R1cmVkVmlld2VyIHZpZXdlcikgewotCQlNZW51TWFuYWdlciBjb250ZXh0TWVudSA9IG5ldyBNZW51TWFuYWdlcigiI1BvcFVwIik7IC8vJE5PTi1OTFMtMSQKLQkJY29udGV4dE1lbnUuYWRkKG5ldyBTZXBhcmF0b3Iob3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5NQl9BRERJVElPTlMpKTsKLQkJY29udGV4dE1lbnUuc2V0UmVtb3ZlQWxsV2hlblNob3duKHRydWUpOwotCQljb250ZXh0TWVudS5hZGRNZW51TGlzdGVuZXIodGhpcyk7Ci0JCU1lbnUgbWVudSA9IGNvbnRleHRNZW51LmNyZWF0ZUNvbnRleHRNZW51KHZpZXdlci5nZXRDb250cm9sKCkpOwotCQl2aWV3ZXIuZ2V0Q29udHJvbCgpLnNldE1lbnUobWVudSk7Ci0JCWdldFNpdGUoKS5yZWdpc3RlckNvbnRleHRNZW51KGNvbnRleHRNZW51LCB2aWV3ZXIpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TGlzdGVuZXIjbWVudUFib3V0VG9TaG93KG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudU1hbmFnZXIpCi0JICovCi0JcHVibGljIHZvaWQgbWVudUFib3V0VG9TaG93KElNZW51TWFuYWdlciBtZW51TWFuYWdlcikgewotCQltZW51TWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcihvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLk1CX0FERElUSU9OUykpOwotCQltZW51TWFuYWdlci5hZGQobmV3IEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0obGlicmFyeVZpZXdGaW5kRWxlbWVudEFjdGlvbikpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBlbmFibGVVcERvd25CdXR0b25zMSgpIHsKLQkJaWYgKGN0cmxfdXAxICE9IG51bGwpIHsKLQkJCWlmIChpc1Nob3VsZEVuYWJsZVVwMSgpKSB7Ci0JCQkJY3RybF91cDEuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCX0gZWxzZSB7Ci0JCQkJY3RybF91cDEuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQl9Ci0JCX0KLQkJaWYgKGN0cmxfZG93bjEgIT0gbnVsbCkgewotCQkJaWYgKGlzU2hvdWxkRW5hYmxlRG93bjEoKSkgewotCQkJCWN0cmxfZG93bjEuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCX0gZWxzZSB7Ci0JCQkJY3RybF9kb3duMS5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCX0KLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1Nob3VsZEVuYWJsZVVwMSgpIHsKLQkJaWYgKHZpZXdlcl9zZWxlY3RlZCAhPSBudWxsICYmIGNvbnRlbnRFbGVtZW50ICE9IG51bGwpIHsKLQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgdmlld2VyX3NlbGVjdGVkCi0JCQkJLmdldFNlbGVjdGlvbigpOwotCQkJaWYgKGlzVXBBbmREb3duQnV0dG9uc1JlcXVpcmVkMSAmJgotCQkJCQlzZWxlY3Rpb24uc2l6ZSgpID09IDEgJiYKLQkJCQkJdmlld2VyX3NlbGVjdGVkLmdldFRhYmxlKCkuZ2V0U2VsZWN0aW9uSW5kZXgoKSA+IDAgJiYKLQkJCQkJIVRuZ1V0aWwuaXNMb2NrZWQoY29udGVudEVsZW1lbnQpICYmIAotCQkJCQlDYXRlZ29yeVNvcnRIZWxwZXIuaXNNYW51YWxDYXRlZ29yeVNvcnQoY29udGVudEVsZW1lbnQpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0gCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNTaG91bGRFbmFibGVEb3duMSgpIHsKLQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB2aWV3ZXJfc2VsZWN0ZWQKLQkJCS5nZXRTZWxlY3Rpb24oKTsKLQkJaWYgKGlzVXBBbmREb3duQnV0dG9uc1JlcXVpcmVkMSAmJgotCQkJCXNlbGVjdGlvbi5zaXplKCkgPT0gMSAmJgotCQkJCSh2aWV3ZXJfc2VsZWN0ZWQuZ2V0VGFibGUoKS5nZXRTZWxlY3Rpb25JbmRleCgpIDwgdmlld2VyX3NlbGVjdGVkCi0JCQkJCS5nZXRUYWJsZSgpLmdldEl0ZW1Db3VudCgpIC0gMSkgJiYKLQkJCQkhVG5nVXRpbC5pc0xvY2tlZChjb250ZW50RWxlbWVudCkgJiYKLQkJCQlDYXRlZ29yeVNvcnRIZWxwZXIuaXNNYW51YWxDYXRlZ29yeVNvcnQoY29udGVudEVsZW1lbnQpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9CYXNlRm9ybVBhZ2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvQmFzZUZvcm1QYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1OWY2NzAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9CYXNlRm9ybVBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMzAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3JtczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJSW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuTWV0aG9kRWxlbWVudEVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucmljaHRleHQuSU1ldGhvZFJpY2hUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucmljaHRleHQuSU1ldGhvZFJpY2hUZXh0RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuUmVzb3VyY2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5maWVsZGFzc2lzdC5Db250cm9sRGVjb3JhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5maWVsZGFzc2lzdC5GaWVsZERlY29yYXRpb25SZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5JTWFuYWdlZEZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuZWRpdG9yLkZvcm1FZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuZWRpdG9yLkZvcm1QYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLmV2ZW50cy5IeXBlcmxpbmtBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLmV2ZW50cy5IeXBlcmxpbmtFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLkZvcm1Ub29sa2l0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuSW1hZ2VIeXBlcmxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5TY3JvbGxlZEZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5TZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuVGFibGVXcmFwRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLlRhYmxlV3JhcExheW91dDsKLQotCi0vKioKLSAqIFRoZSBiYXNlIGNsYXNzIGZvciBhbGwgTWV0aG9kIGVkaXRvciBmb3JtIHBhZ2VzLgotICogCi0gKiBAYXV0aG9yIEplZmYgSGFyZHkKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAc2luY2UgMS4wCi0gKiBmaXggZm9yIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNzYzODIKLSAqLwotcHVibGljIGNsYXNzIEJhc2VGb3JtUGFnZSBleHRlbmRzIEZvcm1QYWdlIHsKLQotCS8qKgotCSAqIEJ1dHRvbiB0eXBlcy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBRERfQlVUVE9OID0gMDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFTU9WRV9CVVRUT04gPSAxOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVVBfQlVUVE9OID0gMjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERPV05fQlVUVE9OID0gMzsKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IE9SREVSX0JVVFRPTiA9IDQ7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBTRUxFQ1RfQlVUVE9OID0gNTsKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IENMRUFSX0JVVFRPTiA9IDY7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBBVFRBQ0hfQlVUVE9OID0gNzsKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IERFVEFDSF9CVVRUT04gPSA4OwotCQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IEFUVEFDSF9VUkxfQlVUVE9OID0gOTsKLQkKLQkvKioKLQkgKiBUYWJsZSB0eXBlcy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTTUFMTF9TSVpFID0gMDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1FRElVTV9TSVpFID0gMTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExBUkdFX1NJWkUgPSAyOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0lOR0xFX1JPVyA9IDM7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBkZWJ1ZzsKLQotCXByb3RlY3RlZCBTY3JvbGxlZEZvcm0gZm9ybTsKLQotCXByb3RlY3RlZCBGb3JtVG9vbGtpdCB0b29sa2l0OwotCi0JcHJvdGVjdGVkIFN0cmluZyBlZGl0b3JUYWJOYW1lOwotCi0JcHJvdGVjdGVkIFN0cmluZyBlZGl0b3JOYW1lOwotCi0JcHJvdGVjdGVkIE1ldGhvZFVuaXQgbWV0aG9kVW5pdDsKLQkKLQlwcm90ZWN0ZWQgTWV0aG9kRWxlbWVudCBtZXRob2RFbGVtZW50OwotCi0JcHJvdGVjdGVkIENvbnRlbnRFbGVtZW50IGNvbnRlbnRFbGVtZW50ID0gbnVsbDsKLQotCXByb3RlY3RlZCBTdHJpbmcgY29udGVudEVsZW1lbnRQYXRoOwotCi0JcHJpdmF0ZSBpbnQgU0VDVElPTl9JRDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIExBQkVMX0RFQ09SQVRPUl9LRVkgPSAibGFiZWxDb250cm9sRGVjb3JhdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqIAotCSAqIEBwYXJhbSBlZGl0b3IKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgZm9ybSBlZGl0b3IuCi0JICogQHBhcmFtIGlkCi0JICogICAgICAgICAgICBUaGUgdW5pcXVlIElEIGZvciB0aGUgZm9ybSBwYWdlLgotCSAqIEBwYXJhbSB0aXRsZQotCSAqICAgICAgICAgICAgVGhlIHRpdGxlIGZvciB0aGUgZm9ybSBwYWdlLgotCSAqLwotCXB1YmxpYyBCYXNlRm9ybVBhZ2UoRm9ybUVkaXRvciBlZGl0b3IsIFN0cmluZyBpZCwgU3RyaW5nIHRpdGxlKSB7Ci0JCXN1cGVyKGVkaXRvciwgaWQsIHRpdGxlKTsKLQkJZGVidWcgPSBBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuaXNEZWJ1Z2dpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLmZvcm1zLmVkaXRvci5Gb3JtUGFnZSNpbml0KG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlLCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJRWRpdG9yU2l0ZSBzaXRlLCBJRWRpdG9ySW5wdXQgaW5wdXQpIHsKLQkJc2V0U2l0ZShzaXRlKTsKLQkJc2V0SW5wdXQoaW5wdXQpOwotCi0JCS8vIFJldHJpZXZlIHRoZSBDb250ZW50RWxlbWVudCBvYmplY3QgZnJvbSB0aGUgZWRpdG9yIGlucHV0LgotCQlNZXRob2RFbGVtZW50RWRpdG9ySW5wdXQgbWV0aG9kRWxlbWVudElucHV0ID0gKE1ldGhvZEVsZW1lbnRFZGl0b3JJbnB1dCkgaW5wdXQ7Ci0JCW1ldGhvZEVsZW1lbnQgPSBtZXRob2RFbGVtZW50SW5wdXQuZ2V0TWV0aG9kRWxlbWVudCgpOwotCQlNZXRob2RFbGVtZW50IGVsZW1lbnRPZlBhdGggPSAgbWV0aG9kRWxlbWVudCBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQgPwotCQkJCSgoUHJvY2Vzc0NvbXBvbmVudCkgbWV0aG9kRWxlbWVudCkuZ2V0UHJvY2VzcygpIDogbWV0aG9kRWxlbWVudDsKLQkJY29udGVudEVsZW1lbnRQYXRoID0gUmVzb3VyY2VIZWxwZXIuZ2V0Rm9sZGVyQWJzb2x1dGVQYXRoKGVsZW1lbnRPZlBhdGgpOwotCQlpZiAobWV0aG9kRWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZFVuaXQpIHsKLQkJCW1ldGhvZFVuaXQgPSAoTWV0aG9kVW5pdCltZXRob2RFbGVtZW50OwotCQl9Ci0JCWlmIChtZXRob2RFbGVtZW50IGluc3RhbmNlb2YgQ29udGVudEVsZW1lbnQpIHsKLQkJCWNvbnRlbnRFbGVtZW50ID0gKENvbnRlbnRFbGVtZW50KSBtZXRob2RFbGVtZW50OwotCQkJQ29udGVudERlc2NyaXB0aW9uIGNvbnRlbnREZXNjcmlwdGlvbiA9IGNvbnRlbnRFbGVtZW50Ci0JCQkJCS5nZXRQcmVzZW50YXRpb24oKTsKLQkJCW1ldGhvZFVuaXQgPSBjb250ZW50RGVzY3JpcHRpb247Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLmZvcm1zLmVkaXRvci5jcmVhdGVGb3JtQ29udGVudChJTWFuYWdlZEZvcm0pCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRm9ybUNvbnRlbnQoSU1hbmFnZWRGb3JtIG1hbmFnZWRGb3JtKSB7Ci0JCWZvcm0gPSBtYW5hZ2VkRm9ybS5nZXRGb3JtKCk7Ci0JCXRvb2xraXQgPSBtYW5hZ2VkRm9ybS5nZXRUb29sa2l0KCk7Ci0JCWZvcm0uZ2V0Qm9keSgpLnNldExheW91dChuZXcgVGFibGVXcmFwTGF5b3V0KCkpOwotCX0KLQotCS8qKgotCSAqIENhbGxlZCB3aGVuIHRoZSBleHBhbmQvY29sbGFwc2UgYnV0dG9uIGlzIHNlbGVjdGVkLgotCSAqIAotCSAqIEBwYXJhbSBldmVudAotCSAqICAgICAgICAgICAgVGhlIGFzc29jaWF0ZWQgZXZlbnQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdG9nZ2xlKEh5cGVybGlua0V2ZW50IGV2ZW50KSB7Ci0JfQotCi0JLyoqCi0JICogQ2FsbGVkIHdoZW4gdGhlIGV4cGFuZC9jb2xsYXBzZSBidXR0b24gaXMgc2VsZWN0ZWQuCi0JICogCi0JICogQHBhcmFtIGV2ZW50Ci0JICogICAgICAgICAgICBUaGUgYXNzb2NpYXRlZCBldmVudC4KLQkgKiBAcGFyYW0gbwotCSAqICAgICAgICAgICAgPz8/Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgdG9nZ2xlKEh5cGVybGlua0V2ZW50IGV2ZW50LCBpbnQgbykgewotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIG5hbWUgZm9yIHRoZSBlZGl0b3IuCi0JICogCi0JICogQHBhcmFtIGVkaXRvck5hbWUKLQkgKiAgICAgICAgICAgIFRoZSBuYW1lIG9mIHRoZSBlZGl0b3IuCi0JICovCi0JcHVibGljIHZvaWQgc2V0RWRpdG9yTmFtZShTdHJpbmcgZWRpdG9yTmFtZSkgewotCQl0aGlzLmVkaXRvck5hbWUgPSBlZGl0b3JOYW1lOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSBsaXN0IG9mIE1ldGhvZCBlbGVtZW50cy4KLQkgKiAKLQkgKiBAcGFyYW0gdmlld2VyCi0JICogICAgICAgICAgICBBIFRhYmxlVmlld2VyLgotCSAqIEByZXR1cm4gQSBsaXN0IG9mIE1ldGhvZCBlbGVtZW50cy4KLQkgKi8KLQlwdWJsaWMgTGlzdDw/PiByZXRyaWV2ZVRhYmxlVmlld2VyQ29udGVudHMoVGFibGVWaWV3ZXIgdmlld2VyKSB7Ci0JCU9iamVjdFtdIGVsZW1lbnRzID0gKChJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcikgdmlld2VyCi0JCQkJLmdldENvbnRlbnRQcm92aWRlcigpKS5nZXRFbGVtZW50cyh2aWV3ZXIuZ2V0SW5wdXQoKSk7Ci0JCUxpc3Q8T2JqZWN0PiBlbGVtZW50TGlzdCA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PigpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKQotCQkJZWxlbWVudExpc3QuYWRkKGVsZW1lbnRzW2ldKTsKLQkJcmV0dXJuIGVsZW1lbnRMaXN0OwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBzZWN0aW9uIG9uIGEgZm9ybSBwYWdlLgotCSAqIAotCSAqIEBwYXJhbSB0b29sa2l0Ci0JICogICAgICAgICAgICBUaGUgZm9ybSB0b29sa2l0LgotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29tcG9zaXRlLgotCSAqIEBwYXJhbSBuYW1lCi0JICogICAgICAgICAgICBUaGUgc2VjdGlvbiBuYW1lLgotCSAqIEBwYXJhbSBkZXNjcmlwdGlvbgotCSAqICAgICAgICAgICAgVGhlIHNlY3Rpb24gZGVzY3JpcHRpb24uCi0JICogQHJldHVybiBBIG5ldyA8Y29kZT5TZWN0aW9uPC9jb2RlPi4KLQkgKi8KLQlwcm90ZWN0ZWQgU2VjdGlvbiBjcmVhdGVTZWN0aW9uKEZvcm1Ub29sa2l0IHRvb2xraXQsIENvbXBvc2l0ZSBwYXJlbnQsCi0JCQlTdHJpbmcgdGl0bGUsIFN0cmluZyBkZXNjcmlwdGlvbikgewotCQlTZWN0aW9uIHNlY3Rpb24gPSB0b29sa2l0LmNyZWF0ZVNlY3Rpb24ocGFyZW50LCBTZWN0aW9uLkRFU0NSSVBUSU9OCi0JCQkJfCBTZWN0aW9uLlRXSVNUSUUgfCBTZWN0aW9uLkVYUEFOREVEIHwgU2VjdGlvbi5USVRMRV9CQVIpOwotCQlHcmlkRGF0YSB0ZCA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIGZhbHNlKTsKLQkJc2VjdGlvbi5zZXRMYXlvdXREYXRhKHRkKTsKLQkJc2VjdGlvbi5zZXRUZXh0KHRpdGxlKTsKLS8vCQlTdHJpbmcgdGV4dCA9IE1lc3NhZ2VGb3JtYXQuZm9ybWF0KGRlc2NyaXB0aW9uLAotLy8JCQkJbmV3IFN0cmluZ1tdIHsgTGlicmFyeVVJVGV4dC5nZXRVSVRleHRMb3dlcihtZXRob2RFbGVtZW50KSB9KTsKLS8vCQlzZWN0aW9uLnNldERlc2NyaXB0aW9uKHRleHQpOwotCQlzZWN0aW9uLnNldERlc2NyaXB0aW9uKGRlc2NyaXB0aW9uKTsKLQkJc2VjdGlvbi5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JCXJldHVybiBzZWN0aW9uOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBsYWJlbCBvbiBhIGZvcm0gcGFnZS4KLQkgKiAKLQkgKiBAcGFyYW0gdG9vbGtpdAotCSAqICAgICAgICAgICAgVGhlIGZvcm0gdG9vbGtpdC4KLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbXBvc2l0ZS4KLQkgKiBAcGFyYW0gdGV4dAotCSAqICAgICAgICAgICAgVGhlIHRleHQgZm9yIHRoZSBsYWJlbC4KLQkgKiBAcGFyYW0gZ3JpZERhdGFTdHlsZQotCSAqICAgICAgICAgICAgVGhlIEdyaWREYXRhIHN0eWxlLgotCSAqIEBwYXJhbSBob3Jpem9udGFsU3BhbgotCSAqICAgICAgICAgICAgVGhlIG51bWJlciBvZiBjb2x1bW4gY2VsbHMgdGFrZW4gdXAgYnkgdGhlIExhYmVsLgotCSAqIEByZXR1cm4gQSBuZXcgPGNvZGU+TGFiZWw8L2NvZGU+LgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgTGFiZWwgY3JlYXRlTGFiZWwoRm9ybVRvb2xraXQgdG9vbGtpdCwgQ29tcG9zaXRlIHBhcmVudCwKLQkJCVN0cmluZyB0ZXh0LCBpbnQgZ3JpZERhdGFTdHlsZSwgaW50IGhvcml6b250YWxTcGFuKSB7Ci0JCUxhYmVsIGxhYmVsID0gdG9vbGtpdC5jcmVhdGVMYWJlbChwYXJlbnQsIHRleHQsIFNXVC5XUkFQCi0JCQkJfCBTV1QuTEVGVF9UT19SSUdIVCk7Ci0JCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKGdyaWREYXRhU3R5bGUpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IGhvcml6b250YWxTcGFuOwotCQlncmlkRGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IFNXVC5UT1A7Ci0JCWdyaWREYXRhLndpZHRoSGludCA9IChob3Jpem9udGFsU3BhbiA9PSAyKSA/IDExNSA6IDEwMDsKLQkJbGFiZWwuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCXJldHVybiBsYWJlbDsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyBhIGxhYmVsIG9uIGEgZm9ybSBwYWdlIHdpdGhvdXQgd3JhcCBhbmQgbm8gd2lkdGhIaW50LgotCSAqIAotCSAqIEBwYXJhbSB0b29sa2l0Ci0JICogICAgICAgICAgICBUaGUgZm9ybSB0b29sa2l0LgotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29tcG9zaXRlLgotCSAqIEBwYXJhbSB0ZXh0Ci0JICogICAgICAgICAgICBUaGUgdGV4dCBmb3IgdGhlIGxhYmVsLgotCSAqIEBwYXJhbSBncmlkRGF0YVN0eWxlCi0JICogICAgICAgICAgICBUaGUgR3JpZERhdGEgc3R5bGUuCi0JICogQHBhcmFtIGhvcml6b250YWxTcGFuCi0JICogICAgICAgICAgICBUaGUgbnVtYmVyIG9mIGNvbHVtbiBjZWxscyB0YWtlbiB1cCBieSB0aGUgTGFiZWwuCi0JICogQHJldHVybiBBIG5ldyA8Y29kZT5MYWJlbDwvY29kZT4uCi0JICovCi0JcHVibGljIHN0YXRpYyBMYWJlbCBjcmVhdGVMYWJlbFdpdGhOb1dyYXAoRm9ybVRvb2xraXQgdG9vbGtpdCwgQ29tcG9zaXRlIHBhcmVudCwKLQkJCVN0cmluZyB0ZXh0LCBpbnQgZ3JpZERhdGFTdHlsZSwgaW50IGhvcml6b250YWxTcGFuKSB7Ci0JCUxhYmVsIGxhYmVsID0gdG9vbGtpdC5jcmVhdGVMYWJlbChwYXJlbnQsIHRleHQsIFNXVC5MRUZUX1RPX1JJR0hUKTsKLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoZ3JpZERhdGFTdHlsZSk7Ci0JCWdyaWREYXRhLmhvcml6b250YWxTcGFuID0gaG9yaXpvbnRhbFNwYW47Ci0JCWdyaWREYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gU1dULlRPUDsKLQkJLy9ncmlkRGF0YS53aWR0aEhpbnQgPSAoaG9yaXpvbnRhbFNwYW4gPT0gMikgPyAxMTUgOiAxMDA7Ci0JCWxhYmVsLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQlyZXR1cm4gbGFiZWw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIGxhYmVsIG9uIGEgZm9ybSBwYWdlLgotCSAqIAotCSAqIEBwYXJhbSB0b29sa2l0Ci0JICogICAgICAgICAgICBUaGUgZm9ybSB0b29sa2l0LgotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29tcG9zaXRlLgotCSAqIEBwYXJhbSB0ZXh0Ci0JICogICAgICAgICAgICBUaGUgdGV4dCBmb3IgdGhlIGxhYmVsLgotCSAqIEByZXR1cm4gQSBuZXcgPGNvZGU+TGFiZWw8L2NvZGU+LgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgTGFiZWwgY3JlYXRlTGFiZWwoRm9ybVRvb2xraXQgdG9vbGtpdCwgQ29tcG9zaXRlIHBhcmVudCwKLQkJCVN0cmluZyB0ZXh0KSB7Ci0JCXJldHVybiBjcmVhdGVMYWJlbCh0b29sa2l0LCBwYXJlbnQsIHRleHQsIEdyaWREYXRhLkJFR0lOTklORywgMSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIGxhYmVsIG9uIGEgZm9ybSBwYWdlLgotCSAqIAotCSAqIEBwYXJhbSB0b29sa2l0Ci0JICogICAgICAgICAgICBUaGUgZm9ybSB0b29sa2l0LgotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29tcG9zaXRlLgotCSAqIEBwYXJhbSB0ZXh0Ci0JICogICAgICAgICAgICBUaGUgdGV4dCBmb3IgdGhlIGxhYmVsLgotCSAqIEBwYXJhbSBob3Jpem9udGFsU3BhbgotCSAqICAgICAgICAgICAgVGhlIG51bWJlciBvZiBjb2x1bW4gY2VsbHMgdGFrZW4gdXAgYnkgdGhlIExhYmVsLgotCSAqIEByZXR1cm4gQSBuZXcgPGNvZGU+TGFiZWw8L2NvZGU+LgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgTGFiZWwgY3JlYXRlTGFiZWwoRm9ybVRvb2xraXQgdG9vbGtpdCwgQ29tcG9zaXRlIHBhcmVudCwKLQkJCVN0cmluZyB0ZXh0LCBpbnQgaG9yaXpvbnRhbFNwYW4pIHsKLQkJcmV0dXJuIGNyZWF0ZUxhYmVsKHRvb2xraXQsIHBhcmVudCwgdGV4dCwgR3JpZERhdGEuQkVHSU5OSU5HLAotCQkJCWhvcml6b250YWxTcGFuKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgYmxhbmsgbGFiZWwgb24gYSBmb3JtIHBhZ2UuCi0JICogCi0JICogQHBhcmFtIHRvb2xraXQKLQkgKiAgICAgICAgICAgIFRoZSBmb3JtIHRvb2xraXQuCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb21wb3NpdGUuCi0JICogQHBhcmFtIGhvcml6b250YWxTcGFuCi0JICogICAgICAgICAgICBUaGUgbnVtYmVyIG9mIGNvbHVtbiBjZWxscyB0YWtlbiB1cCBieSB0aGUgTGFiZWwuCi0JICogQHJldHVybiBBIG5ldyA8Y29kZT5MYWJlbDwvY29kZT4uCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBMYWJlbCBjcmVhdGVCbGFua0xhYmVsKEZvcm1Ub29sa2l0IHRvb2xraXQsCi0JCQlDb21wb3NpdGUgcGFyZW50LCBpbnQgaG9yaXpvbnRhbFNwYW4pIHsKLQkJcmV0dXJuIGNyZWF0ZUxhYmVsKHRvb2xraXQsIHBhcmVudCwKLQkJCQkiIiwgR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMLCBob3Jpem9udGFsU3Bhbik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgdGV4dCBjb250cm9sIG9uIGEgZm9ybSBwYWdlLgotCSAqIAotCSAqIEBwYXJhbSB0b29sa2l0Ci0JICogICAgICAgICAgICBUaGUgZm9ybSB0b29sa2l0LgotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29tcG9zaXRlLgotCSAqIEBwYXJhbSBzdHlsZQotCSAqICAgICAgICAgICAgVGhlIFRleHQgc3R5bGUuCi0JICogQHBhcmFtIGdyaWREYXRhU3R5bGUKLQkgKiAgICAgICAgICAgIFRoZSBHcmlkRGF0YSBzdHlsZS4KLQkgKiBAcGFyYW0gaGVpZ3RoCi0JICogICAgICAgICAgICBUaGUgaGVpZ2h0IG9mIHRoZSBjb250cm9sLgotCSAqIEBwYXJhbSB3aWR0aAotCSAqICAgICAgICAgICAgVGhlIHdpZHRoIG9mIHRoZSB0ZXh0IGNvbnRyb2wuCi0JICogQHBhcmFtIGhvcml6b250YWxTcGFuCi0JICogICAgICAgICAgICBUaGUgbnVtYmVyIG9mIGNvbHVtbiBjZWxscyB0YWtlbiB1cCBieSB0aGUgVGV4dCBjb250cm9sLgotCSAqIEByZXR1cm4gQSBuZXcgPGNvZGU+VGV4dDwvY29kZT4gY29udHJvbC4KLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIFRleHQgY3JlYXRlVGV4dEVkaXQoRm9ybVRvb2xraXQgdG9vbGtpdCwgQ29tcG9zaXRlIHBhcmVudCwKLQkJCWludCBzdHlsZSwgaW50IGdyaWREYXRhU3R5bGUsIGludCBoZWlnaHQsIGludCB3aWR0aCwKLQkJCWludCBob3Jpem9udGFsU3BhbikgewotCQlUZXh0IGNvbnRyb2wgPSB0b29sa2l0LmNyZWF0ZVRleHQocGFyZW50LCAiIiwgc3R5bGUpOyAvLyROT04tTkxTLTEkCi0JCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKGdyaWREYXRhU3R5bGUpOwotCQlncmlkRGF0YS5oZWlnaHRIaW50ID0gaGVpZ2h0OwotCQlncmlkRGF0YS53aWR0aEhpbnQgPSB3aWR0aDsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSBob3Jpem9udGFsU3BhbjsKLQkJY29udHJvbC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJcmV0dXJuIGNvbnRyb2w7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIHNpbmdsZS1saW5lIHRleHQgY29udHJvbCBvbiBhIGZvcm0gcGFnZS4KLQkgKiAKLQkgKiBAcGFyYW0gdG9vbGtpdAotCSAqICAgICAgICAgICAgVGhlIGZvcm0gdG9vbGtpdC4KLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbXBvc2l0ZS4KLQkgKiBAcmV0dXJuIEEgbmV3IDxjb2RlPlRleHQ8L2NvZGU+IGNvbnRyb2wuCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBUZXh0IGNyZWF0ZVRleHRFZGl0KEZvcm1Ub29sa2l0IHRvb2xraXQsIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJcmV0dXJuIGNyZWF0ZVRleHRFZGl0KHRvb2xraXQsIHBhcmVudCwgU1dULlNJTkdMRSB8IFNXVC5XUkFQLAotCQkJCUdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCwgU1dULkRFRkFVTFQsIDEwMCwgMSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIHRleHQgY29udHJvbCB3aXRoIGEgbGFiZWwgb24gYSBmb3JtIHBhZ2UuCi0JICogCi0JICogQHBhcmFtIHRvb2xraXQKLQkgKiAgICAgICAgICAgIFRoZSBmb3JtIHRvb2xraXQuCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb21wb3NpdGUuCi0JICogQHBhcmFtIHRleHRTdHlsZQotCSAqICAgICAgICAgICAgVGhlIFRleHQgc3R5bGUuCi0JICogQHBhcmFtIGdyaWREYXRhU3R5bGUKLQkgKiAgICAgICAgICAgIFRoZSBHcmlkRGF0YSBzdHlsZS4KLQkgKiBAcGFyYW0gaGVpZ2h0Ci0JICogICAgICAgICAgICBUaGUgaGVpZ2h0IG9mIHRoZSBjb250cm9sLgotCSAqIEBwYXJhbSB3aWR0aAotCSAqICAgICAgICAgICAgVGhlIHdpZHRoIG9mIHRoZSB0ZXh0IGNvbnRyb2wuCi0JICogQHBhcmFtIGhvcml6b250YWxTcGFuCi0JICogICAgICAgICAgICBUaGUgbnVtYmVyIG9mIGNvbHVtbiBjZWxscyB0YWtlbiB1cCBieSB0aGUgVGV4dCBjb250cm9sLgotCSAqIEBwYXJhbSBsYWJlbFRleHQKLQkgKiAgICAgICAgICAgIHRoZSB0ZXh0IGZvciB0aGUgbGFiZWwuCi0JICogQHJldHVybiBBIG5ldyA8Y29kZT5UZXh0PC9jb2RlPiBjb250cm9sLgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgVGV4dCBjcmVhdGVUZXh0RWRpdFdpdGhMYWJlbChGb3JtVG9vbGtpdCB0b29sa2l0LAotCQkJQ29tcG9zaXRlIHBhcmVudCwgaW50IHRleHRTdHlsZSwgaW50IGdyaWREYXRhU3R5bGUsIGludCBoZWlnaHQsCi0JCQlpbnQgd2lkdGgsIGludCBob3Jpem9udGFsU3BhbiwgU3RyaW5nIHRleHRMYWJlbCkgewotCQljcmVhdGVMYWJlbCh0b29sa2l0LCBwYXJlbnQsIHRleHRMYWJlbCk7Ci0JCXJldHVybiBjcmVhdGVUZXh0RWRpdCh0b29sa2l0LCBwYXJlbnQsIHRleHRTdHlsZSwgZ3JpZERhdGFTdHlsZSwKLQkJCQloZWlnaHQsIHdpZHRoLCBob3Jpem9udGFsU3Bhbik7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIHNpbmdsZS1saW5lIHRleHQgY29udHJvbCB3aXRoIGEgbGFiZWwgb24gYSBmb3JtIHBhZ2UuCi0JICogCi0JICogQHBhcmFtIHRvb2xraXQKLQkgKiAgICAgICAgICAgIFRoZSBmb3JtIHRvb2xraXQuCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb21wb3NpdGUuCi0JICogQHBhcmFtIGxhYmVsVGV4dAotCSAqICAgICAgICAgICAgdGhlIHRleHQgZm9yIHRoZSBsYWJlbC4KLQkgKiBAcmV0dXJuIEEgbmV3IDxjb2RlPlRleHQ8L2NvZGU+IGNvbnRyb2wuCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBUZXh0IGNyZWF0ZVRleHRFZGl0V2l0aExhYmVsKEZvcm1Ub29sa2l0IHRvb2xraXQsCi0JCQlDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgbGFiZWxUZXh0KSB7Ci0JCWNyZWF0ZUxhYmVsKHRvb2xraXQsIHBhcmVudCwgbGFiZWxUZXh0LCAyKTsKLQkJcmV0dXJuIGNyZWF0ZVRleHRFZGl0KHRvb2xraXQsIHBhcmVudCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIGRvdWJsZS1saW5lIHRleHQgY29udHJvbCB3aXRoIGEgbGFiZWwgb24gYSBmb3JtIHBhZ2UuCi0JICogCi0JICogQHBhcmFtIHRvb2xraXQKLQkgKiAgICAgICAgICAgIFRoZSBmb3JtIHRvb2xraXQuCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb21wb3NpdGUuCi0JICogQHBhcmFtIGxhYmVsVGV4dAotCSAqICAgICAgICAgICAgdGhlIHRleHQgZm9yIHRoZSBsYWJlbC4KLQkgKiBAcmV0dXJuIEEgbmV3IDxjb2RlPlRleHQ8L2NvZGU+IGNvbnRyb2wuCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBUZXh0IGNyZWF0ZVRleHRFZGl0V2l0aExhYmVsMihGb3JtVG9vbGtpdCB0b29sa2l0LAotCQkJQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIGxhYmVsVGV4dCkgewotCQljcmVhdGVMYWJlbCh0b29sa2l0LCBwYXJlbnQsIGxhYmVsVGV4dCwgMik7Ci0JCXJldHVybiBjcmVhdGVUZXh0RWRpdCh0b29sa2l0LCBwYXJlbnQsIFNXVC5NVUxUSSB8IFNXVC5XUkFQCi0JCQkJfCBTV1QuVl9TQ1JPTEwsIEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTAotCQkJCXwgR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMLCA0MCwgMzAwLCAxKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgc2luZ2xlIG9yIG11bHRpLWxpbmUgdGV4dCBjb250cm9sIHdpdGggYSBsYWJlbCBvbiBhIGZvcm0gcGFnZS4KLQkgKiAKLQkgKiBAcGFyYW0gdG9vbGtpdAotCSAqICAgICAgICAgICAgVGhlIGZvcm0gdG9vbGtpdC4KLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbXBvc2l0ZS4KLQkgKiBAcGFyYW0gbGFiZWxUZXh0Ci0JICogICAgICAgICAgICB0aGUgdGV4dCBmb3IgdGhlIGxhYmVsLgotCSAqIEByZXR1cm4gQSBuZXcgPGNvZGU+VGV4dDwvY29kZT4gY29udHJvbC4KLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIFRleHQgY3JlYXRlVGV4dEVkaXRXaXRoTGFiZWwzKEZvcm1Ub29sa2l0IHRvb2xraXQsCi0JCQlDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgbGFiZWxUZXh0LCBpbnQgaGVpZ2h0LCBpbnQgc2luZ2xlT3JNdWx0aSkgewotCQljcmVhdGVMYWJlbCh0b29sa2l0LCBwYXJlbnQsIGxhYmVsVGV4dCwgMik7Ci0JCXJldHVybiBjcmVhdGVUZXh0RWRpdCh0b29sa2l0LCBwYXJlbnQsIHNpbmdsZU9yTXVsdGkgfCBTV1QuV1JBUAotCQkJCXwgU1dULlZfU0NST0xMIHwgU1dULlRSQVZFUlNFX1RBQl9ORVhULAotCQkJCUdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCB8IEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTCwgaGVpZ2h0LAotCQkJCTMwMCwgMik7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIHNpbmdsZSBvciBtdWx0aS1saW5lIHRleHQgY29udHJvbCB3aXRoIGEgbGFiZWwgaW4gYSBjb21wb3NpdGUuCi0JICogCi0JICogQGF1dGhvciBob3Blc2hhcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBUZXh0IGNyZWF0ZVRleHRFZGl0V2l0aExhYmVsNChGb3JtVG9vbGtpdCB0b29sa2l0LAotCQkJQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIGxhYmVsVGV4dCwgaW50IGhlaWdodCwgaW50IHNpbmdsZU9yTXVsdGksIFN0cmluZyBmaWxsVGV4dCkgewotCQljcmVhdGVMYWJlbCh0b29sa2l0LCBwYXJlbnQsIGxhYmVsVGV4dCwgMik7Ci0JCQotCQlpbnQgaG9yaXpvbnRhbFNwYW4gPSBjYWxjdWxhdGVTcGFuKGZpbGxUZXh0KTsKLQkJCi0JCWlmKGhvcml6b250YWxTcGFuPT0xKXsKLQkJCVRleHQgdGV4dCA9IGNyZWF0ZVRleHRFZGl0KHRvb2xraXQsIHBhcmVudCwgc2luZ2xlT3JNdWx0aSB8IFNXVC5XUkFQCi0JCQkJCXwgU1dULlZfU0NST0xMIHwgU1dULlRSQVZFUlNFX1RBQl9ORVhULCBHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwKLQkJCQkJfCBHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwsIGhlaWdodCwgMjAwLCAxKTsKLQkJCVRleHQgdGV4dDIgPSBjcmVhdGVUZXh0RWRpdCh0b29sa2l0LCBwYXJlbnQsIHNpbmdsZU9yTXVsdGkgfCBTV1QuV1JBUAotCQkJCQl8IFNXVC5WX1NDUk9MTCwgR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMCi0JCQkJCXwgR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMLCBoZWlnaHQsIDEwMCwgMSk7Ci0JCQl0ZXh0Mi5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJCWNyZWF0ZUxhYmVsKHRvb2xraXQsIHBhcmVudCwKLQkJCQkJIiIsIDEpOyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gdGV4dDsKLQkJfWVsc2V7Ci0JCQlyZXR1cm4gY3JlYXRlVGV4dEVkaXQodG9vbGtpdCwgcGFyZW50LCBzaW5nbGVPck11bHRpIHwgU1dULldSQVAKLQkJCQkJfCBTV1QuVl9TQ1JPTEwgfCBTV1QuVFJBVkVSU0VfVEFCX05FWFQsCi0JCQkJCUdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCB8IEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTCwgaGVpZ2h0LAotCQkJCQkzMDAsIDMpOwotCQl9Ci0JfQotCQotCQotCS8qKgotCSAqIENyZWF0ZXMgYSBkb3VibGUtbGluZSB0ZXh0IGNvbnRyb2wgd2l0aCBhIGxhYmVsIG9uIGEgZm9ybSBwYWdlLgotCSAqIEBhdXRob3IgaG9wZXNoYXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgVGV4dCBjcmVhdGVUZXh0RWRpdFdpdGhMYWJlbDUoRm9ybVRvb2xraXQgdG9vbGtpdCwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyBsYWJlbFRleHQpIHsKLQkJY3JlYXRlTGFiZWwodG9vbGtpdCwgcGFyZW50LCBsYWJlbFRleHQsIDIpOwotCQlyZXR1cm4gY3JlYXRlVGV4dEVkaXQodG9vbGtpdCwgcGFyZW50LCBTV1QuTVVMVEkgfCBTV1QuV1JBUAotCQkJCXwgU1dULlZfU0NST0xMLCBHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwKLQkJCQl8IEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTCwgNDAsIDMwMCwgMik7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgYSBzaW5nbGUgb3IgbXVsdGktbGluZSB0ZXh0IGNvbnRyb2wgd2l0aCBhIGxhYmVsIG9uIGEgZm9ybSBwYWdlLgotCSAqIEBhdXRob3IgaG9wZXNoYXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgVGV4dCBjcmVhdGVUZXh0RWRpdFdpdGhMYWJlbDUoRm9ybVRvb2xraXQgdG9vbGtpdCwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyBsYWJlbFRleHQsIGludCBoZWlnaHQsIGludCBzaW5nbGVPck11bHRpKSB7Ci0JCWNyZWF0ZUxhYmVsKHRvb2xraXQsIHBhcmVudCwgbGFiZWxUZXh0LCAyKTsKLQkJcmV0dXJuIGNyZWF0ZVRleHRFZGl0KHRvb2xraXQsIHBhcmVudCwgc2luZ2xlT3JNdWx0aSB8IFNXVC5XUkFQCi0JCQkJfCBTV1QuVl9TQ1JPTEwgfCBTV1QuVFJBVkVSU0VfVEFCX05FWFQsCi0JCQkJR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMIHwgR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMLCBoZWlnaHQsCi0JCQkJMzAwLCAzKTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyBhIGNvbWJvYm94IGNvbnRyb2wgd2l0aCBhIGxhYmVsIG9uIGEgZm9ybSBwYWdlLgotCSAqIAotCSAqIEBhdXRob3IgaG9wZXNoYXJlZAotCSAqIEBwYXJhbSB0b29sa2l0Ci0JICogICAgICAgICAgICBUaGUgZm9ybSB0b29sa2l0LgotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29tcG9zaXRlLgotCSAqIEBwYXJhbSBsYWJlbFRleHQKLQkgKiAgICAgICAgICAgIFRoZSB0ZXh0IGZvciB0aGUgTGFiZWwuCi0JICogQHJldHVybiBBIG5ldyA8Y29kZT5Db21ib2JveDwvY29kZT4uCi0JICovCi0JcHJvdGVjdGVkIENvbWJvIGNyZWF0ZUNvbWJvV2l0aExhYmVsMyhGb3JtVG9vbGtpdCB0b29sa2l0LCBDb21wb3NpdGUgcGFyZW50LAotCQkJU3RyaW5nIGxhYmVsVGV4dCkgewotCQljcmVhdGVMYWJlbCh0b29sa2l0LCBwYXJlbnQsIGxhYmVsVGV4dCwgMik7Ci0JCXJldHVybiBjcmVhdGVDb21ibyhwYXJlbnQsIFNXVC5TSU5HTEUgfCBTV1QuRkxBVCB8IFNXVC5SRUFEX09OTFkgfFNXVC5UUkFWRVJTRV9UQUJfTkVYVCwKLQkJCQlHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwgfCBHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwpOwotCX0KLQkKLQkvKioKLQkgKiBDYWxjdWxhdGUgdGhlIHRleHQncyBob3Jpem9udGFsIHNwYW4uCi0JICogCi0JICogQGF1dGhvciBob3Blc2hhcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBpbnQgY2FsY3VsYXRlU3BhbihTdHJpbmcgZmlsbFRleHQpewotCQlpbnQgbGVuZ3RoID0gZmlsbFRleHQubGVuZ3RoKCk7Ci0KLQkJaWYobGVuZ3RoIDwgNjApCi0JCQlyZXR1cm4gMTsKLQkJcmV0dXJuIDI7Ci0JfQotCi0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbGFyZ2UgdGV4dCBjb250cm9sIHdpdGggYSBsYWJlbCBvbiBhIGZvcm0gcGFnZS4KLQkgKiA8cD4KLQkgKiBVc2VkIGZvciB0aGUgQnJpZWYgRGVzY3JpcHRpb24gYm94LgotCSAqIAotCSAqIEBwYXJhbSB0b29sa2l0Ci0JICogICAgICAgICAgICBUaGUgZm9ybSB0b29sa2l0LgotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29tcG9zaXRlLgotCSAqIEBwYXJhbSBsYWJlbFRleHQKLQkgKiAgICAgICAgICAgIHRoZSB0ZXh0IGZvciB0aGUgbGFiZWwuCi0JICogQHJldHVybiBBIG5ldyA8Y29kZT5UZXh0PC9jb2RlPiBjb250cm9sLgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgVGV4dCBjcmVhdGVUZXh0RWRpdFdpdGhMYWJlbExhcmdlKEZvcm1Ub29sa2l0IHRvb2xraXQsCi0JCQlDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgbGFiZWxUZXh0KSB7Ci0JCUxhYmVsIGxhYmVsID0gY3JlYXRlTGFiZWwodG9vbGtpdCwgcGFyZW50LCBsYWJlbFRleHQpOwotCQkoKEdyaWREYXRhKSBsYWJlbC5nZXRMYXlvdXREYXRhKCkpLndpZHRoSGludCA9IFNXVC5ERUZBVUxUOwotCQlyZXR1cm4gY3JlYXRlVGV4dEVkaXQodG9vbGtpdCwgcGFyZW50LCBTV1QuTVVMVEkgfCBTV1QuV1JBUAotCQkJCXwgU1dULlZfU0NST0xMLCBHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwKLQkJCQl8IEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTCwgODAsIFNXVC5ERUZBVUxULCAzKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGltYWdlIGh5cGVybGluayBvbiBhIGZvcm0gcGFnZS4KLQkgKiAKLQkgKiBAcGFyYW0gdG9vbGtpdAotCSAqICAgICAgICAgICAgVGhlIGZvcm0gdG9vbGtpdC4KLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbXBvc2l0ZS4KLQkgKiBAcGFyYW0gdGV4dAotCSAqICAgICAgICAgICAgVGhlIHRleHQgZm9yIHRoZSBoeXBlcmxpbmsuCi0JICogQHBhcmFtIGltYWdlCi0JICogICAgICAgICAgICBUaGUgaHlwZXJsaW5rIGltYWdlLgotCSAqIEByZXR1cm4gQSBuZXcgPGNvZGU+SW1hZ2VIeXBlcmxpbms8L2NvZGU+LgotCSAqLwotCXByb3RlY3RlZCBJbWFnZUh5cGVybGluayBjcmVhdGVJbWFnZUh5cGVybGluayhGb3JtVG9vbGtpdCB0b29sa2l0LAotCQkJQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIHRleHQsIEltYWdlIGltYWdlKSB7Ci0JCUltYWdlSHlwZXJsaW5rIGxpbmsgPSB0b29sa2l0LmNyZWF0ZUltYWdlSHlwZXJsaW5rKHBhcmVudCwgU1dULkxFRlQKLQkJCQl8IFNXVC5UT1ApOwotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5CRUdJTk5JTkcpOwotCQlncmlkRGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IFNXVC5UT1A7Ci0JCWxpbmsuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCWxpbmsuc2V0SW1hZ2UoaW1hZ2UpOwotCQlpZiAodGV4dCAhPSBudWxsKQotCQkJbGluay5zZXRUZXh0KHRleHQpOwotCQlyZXR1cm4gbGluazsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGltYWdlIGh5cGVybGluayBvbiBhIGZvcm0gcGFnZS4KLQkgKiAKLQkgKiBAcGFyYW0gdG9vbGtpdAotCSAqICAgICAgICAgICAgVGhlIGZvcm0gdG9vbGtpdC4KLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbXBvc2l0ZS4KLQkgKiBAcGFyYW0gc2VjdGlvbklkCi0JICogICAgICAgICAgICBUaGUgc2N0aW9uIElELgotCSAqIEByZXR1cm4gQSBuZXcgPGNvZGU+SW1hZ2VIeXBlcmxpbms8L2NvZGU+LgotCSAqLwotCXByb3RlY3RlZCBJbWFnZUh5cGVybGluayBjcmVhdGVIeXBlckxpbmsoRm9ybVRvb2xraXQgdG9vbGtpdCwKLQkJCUNvbXBvc2l0ZSBleHBhbmRlZENvbXBvc2l0ZSwgaW50IHNlY3Rpb25JRCkgewotCQlTRUNUSU9OX0lEID0gc2VjdGlvbklEOwotCQlJbWFnZUh5cGVybGluayBleHBhbmRMaW5rID0gdG9vbGtpdC5jcmVhdGVJbWFnZUh5cGVybGluaygKLQkJCQlleHBhbmRlZENvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlleHBhbmRMaW5rLnNldEltYWdlKEF1dGhvcmluZ1VJSW1hZ2VzLklNR19FWFBBTkRFRCk7Ci0JCWV4cGFuZExpbmsuc2V0VW5kZXJsaW5lZChmYWxzZSk7Ci0JCWV4cGFuZExpbmsuYWRkSHlwZXJsaW5rTGlzdGVuZXIobmV3IEh5cGVybGlua0FkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBsaW5rQWN0aXZhdGVkKEh5cGVybGlua0V2ZW50IGUpIHsKLQkJCQl0b2dnbGUoZSwgU0VDVElPTl9JRCk7Ci0JCQl9Ci0JCX0pOwotCQlyZXR1cm4gZXhwYW5kTGluazsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgcmljaCB0ZXh0IGNvbnRyb2wgb24gYSBmb3JtIHBhZ2UuCi0JICogCi0JICogQHBhcmFtIHRvb2xraXQKLQkgKiAgICAgICAgICAgIFRoZSBmb3JtIHRvb2xraXQuCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb21wb3NpdGUuCi0JICogQHBhcmFtIHN0eWxlCi0JICogICAgICAgICAgICBUaGUgcmljaCB0ZXh0IHN0eWxlLgotCSAqIEBwYXJhbSBoZWlnaHQKLQkgKiAgICAgICAgICAgIFRoZSBoZWlnaHQgb2YgdGhlIGNvbnRyb2wuCi0JICogQHBhcmFtIHdpZHRoCi0JICogICAgICAgICAgICBUaGUgd2lkdGggb2YgdGhlIHRleHQgY29udHJvbC4KLQkgKiBAcGFyYW0gaG9yaXpvbnRhbFNwYW4KLQkgKiAgICAgICAgICAgIFRoZSBudW1iZXIgb2YgY29sdW1uIGNlbGxzIHRha2VuIHVwIGJ5IHRoZSBUZXh0IGNvbnRyb2wuCi0JICogQHJldHVybiBBIG5ldyA8Y29kZT5JTWV0aG9kUmljaFRleHQ8L2NvZGU+LgotCSAqLwotCXByb3RlY3RlZCBJTWV0aG9kUmljaFRleHQgY3JlYXRlUmljaFRleHRFZGl0KEZvcm1Ub29sa2l0IHRvb2xraXQsCi0JCQlDb21wb3NpdGUgcGFyZW50LCBpbnQgc3R5bGUsIGludCBncmlkRGF0YVN0eWxlLCBpbnQgaGVpZ2h0LAotCQkJaW50IHdpZHRoLCBpbnQgaG9yaXpvbnRhbFNwYW4sIExhYmVsIGxhYmVsKSB7Ci0JCUlNZXRob2RSaWNoVGV4dCByaWNoVGV4dCA9IE1ldGhvZEZvcm1Ub29sa2l0LmNyZWF0ZVJpY2hUZXh0KHRvb2xraXQsCi0JCQkJcGFyZW50LCAiIiwgc3R5bGUsIGNvbnRlbnRFbGVtZW50UGF0aCwgbWV0aG9kRWxlbWVudCwgbGFiZWwpOyAvLyROT04tTkxTLTEkCi0JCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKGdyaWREYXRhU3R5bGUpOwotCQlncmlkRGF0YS5oZWlnaHRIaW50ID0gaGVpZ2h0OwotCQlncmlkRGF0YS53aWR0aEhpbnQgPSB3aWR0aDsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSBob3Jpem9udGFsU3BhbjsKLQkJcmljaFRleHQuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCXJldHVybiByaWNoVGV4dDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgcmljaCB0ZXh0IGNvbnRyb2wgb24gYSBmb3JtIHBhZ2UuCi0JICogCi0JICogQHBhcmFtIHRvb2xraXQKLQkgKiAgICAgICAgICAgIFRoZSBmb3JtIHRvb2xraXQuCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb21wb3NpdGUuCi0JICogQHJldHVybiBBIG5ldyA8Y29kZT5JTWV0aG9kUmljaFRleHQ8L2NvZGU+LgotCSAqLwotCXByb3RlY3RlZCBJTWV0aG9kUmljaFRleHQgY3JlYXRlUmljaFRleHRFZGl0KEZvcm1Ub29sa2l0IHRvb2xraXQsCi0JCQlDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXJldHVybiBjcmVhdGVSaWNoVGV4dEVkaXQodG9vbGtpdCwgcGFyZW50LCBTV1QuTVVMVEkgfCBTV1QuV1JBUAotCQkJCXwgU1dULlZfU0NST0xMLCBHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwsIFNXVC5ERUZBVUxULAotCQkJCVNXVC5ERUZBVUxULCAxLCBudWxsKTsKLQl9Ci0JCi0JCi0JcHVibGljIHN0YXRpYyBMYWJlbCBjcmVhdGVEZWNvcmF0ZWRMYWJlbChGb3JtVG9vbGtpdCB0b29sa2l0LCBDb21wb3NpdGUgcGFyZW50LAotCQkJU3RyaW5nIHRleHQpIHsKLQkJTGFiZWwgZGVjb3JhdGVkTGFiZWwgPSBjcmVhdGVMYWJlbCh0b29sa2l0LCBwYXJlbnQsIHRleHQpOwotCQlpbnQgbWFyZ2luID0gRmllbGREZWNvcmF0aW9uUmVnaXN0cnkuZ2V0RGVmYXVsdCgpLmdldE1heGltdW1EZWNvcmF0aW9uV2lkdGgoKTsgCi0JCSgoR3JpZERhdGEpZGVjb3JhdGVkTGFiZWwuZ2V0TGF5b3V0RGF0YSgpKS5ob3Jpem9udGFsSW5kZW50ID0gbWFyZ2luOwotCQlDb250cm9sRGVjb3JhdGlvbiBsYWJlbENvbnRyb2xEZWNvcmF0aW9uID0gbmV3IENvbnRyb2xEZWNvcmF0aW9uKGRlY29yYXRlZExhYmVsLCBTV1QuTEVGVCB8IFNXVC5CT1RUT00pOwotCQlkZWNvcmF0ZWRMYWJlbC5zZXREYXRhKExBQkVMX0RFQ09SQVRPUl9LRVksIGxhYmVsQ29udHJvbERlY29yYXRpb24pOwotCQlyZXR1cm4gZGVjb3JhdGVkTGFiZWw7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgYSByaWNoIHRleHQgY29udHJvbCB3aXRoIGEgaW1hZ2UgaHlwZXJMaW5rIGFuZCBsYWJlbCBvbiBhIGZvcm0KLQkgKiBwYWdlLgotCSAqIAotCSAqIEBwYXJhbSB0b29sa2l0Ci0JICogICAgICAgICAgICBUaGUgZm9ybSB0b29sa2l0LgotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29tcG9zaXRlLgotCSAqIEBwYXJhbSBsYWJlbFRleHQKLQkgKiAgICAgICAgICAgIFRoZSB0ZXh0IGZvciB0aGUgbGFiZWwuCi0JICogQHBhcmFtIHNlY3Rpb25JZAotCSAqICAgICAgICAgICAgVGhlIHNlY3Rpb24gSUQuCi0JICogQHJldHVybiBBIG5ldyA8Y29kZT5JUmljaE1ldGhvZFRleHQ8L2NvZGU+LgotCSAqLwotCXByb3RlY3RlZCBJTWV0aG9kUmljaFRleHQgY3JlYXRlUmljaFRleHRFZGl0V2l0aExpbmsoCi0JCQlGb3JtVG9vbGtpdCB0b29sa2l0LCBDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgbGFiZWxUZXh0LAotCQkJaW50IGhlaWdodCwgaW50IHdpZHRoLCBpbnQgaG9yaXpvbnRhbFNwYW4pIHsKLQkJSW1hZ2VIeXBlcmxpbmsgbGluayA9IGNyZWF0ZUltYWdlSHlwZXJsaW5rKHRvb2xraXQsIHBhcmVudCwgbnVsbCwKLQkJCQlBdXRob3JpbmdVSUltYWdlcy5JTUdfQ09MTEFQU0VEKTsKLQkJbGluay5zZXRUb29sVGlwVGV4dChBdXRob3JpbmdVSVJlc291cmNlcy5vcGVuUlRFKTsKLQkJLy8gY3JlYXRlIGxhYmVsIHdpdGggQ29udHJvbERlY29yYXRpb24gaGVyZSBmb3IgbWFya2VycwotCQlMYWJlbCBkZWNvcmF0ZWRMYWJlbCA9IGNyZWF0ZURlY29yYXRlZExhYmVsKHRvb2xraXQsIHBhcmVudCwgbGFiZWxUZXh0KTsKLQotCQlJTWV0aG9kUmljaFRleHQgY29udHJvbCA9IGNyZWF0ZVJpY2hUZXh0RWRpdCh0b29sa2l0LCBwYXJlbnQsIFNXVC5NVUxUSQotCQkJCXwgU1dULldSQVAgfCBTV1QuVl9TQ1JPTEwsIEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCwgaGVpZ2h0LAotCQkJCXdpZHRoLCBob3Jpem9udGFsU3BhbiwgZGVjb3JhdGVkTGFiZWwpOwotCi0JCWxpbmsuc2V0SHJlZihjb250cm9sKTsKLQkJbGluay5zZXREYXRhKCJUaXRsZSIsIGxhYmVsVGV4dCk7IC8vJE5PTi1OTFMtMSQKLQkJbGluay5hZGRIeXBlcmxpbmtMaXN0ZW5lcihuZXcgSHlwZXJsaW5rQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGxpbmtBY3RpdmF0ZWQoSHlwZXJsaW5rRXZlbnQgZSkgewotCQkJCXRvZ2dsZShlKTsKLQkJCX0KLQkJfSk7Ci0KLQkJcmV0dXJuIGNvbnRyb2w7Ci0JfQotCi0KLQkvKioKLQkgKiBDcmVhdGVzIGEgcmljaCB0ZXh0IGNvbnRyb2wgd2l0aCBhIGltYWdlIGh5cGVyTGluayBhbmQgbGFiZWwgb24gYSBmb3JtCi0JICogcGFnZS4KLQkgKiAKLQkgKiBAcGFyYW0gdG9vbGtpdAotCSAqICAgICAgICAgICAgVGhlIGZvcm0gdG9vbGtpdC4KLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbXBvc2l0ZS4KLQkgKiBAcGFyYW0gbGFiZWxUZXh0Ci0JICogICAgICAgICAgICBUaGUgdGV4dCBmb3IgdGhlIGxhYmVsLgotCSAqIEBwYXJhbSBzZWN0aW9uSWQKLQkgKiAgICAgICAgICAgIFRoZSBzZWN0aW9uIElELgotCSAqIEByZXR1cm4gQSBuZXcgPGNvZGU+SVJpY2hNZXRob2RUZXh0PC9jb2RlPi4KLQkgKi8KLQlwcm90ZWN0ZWQgSU1ldGhvZFJpY2hUZXh0IGNyZWF0ZVJpY2hUZXh0RWRpdFdpdGhMaW5rRm9yU2VjdGlvbigKLQkJCUZvcm1Ub29sa2l0IHRvb2xraXQsIENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyBsYWJlbFRleHQsCi0JCQlpbnQgaGVpZ2h0LCBpbnQgd2lkdGgsIGludCBzZWN0aW9uSUQpIHsKLQkJZmluYWwgaW50IFNFQ1RJT05fSUQgPSBzZWN0aW9uSUQ7Ci0JCUltYWdlSHlwZXJsaW5rIGxpbmsgPSBjcmVhdGVJbWFnZUh5cGVybGluayh0b29sa2l0LCBwYXJlbnQsIG51bGwsCi0JCQkJQXV0aG9yaW5nVUlJbWFnZXMuSU1HX0NPTExBUFNFRCk7Ci0JCWxpbmsuc2V0VG9vbFRpcFRleHQoQXV0aG9yaW5nVUlSZXNvdXJjZXMub3BlblJURSk7Ci0KLQkJLy8gY3JlYXRlIGxhYmVsIHdpdGggQ29udHJvbERlY29yYXRpb24gaGVyZSBmb3IgbWFya2VycwotCQlMYWJlbCBkZWNvcmF0ZWRMYWJlbCA9IGNyZWF0ZURlY29yYXRlZExhYmVsKHRvb2xraXQsIHBhcmVudCwgbGFiZWxUZXh0KTsKLQotCQlJTWV0aG9kUmljaFRleHQgY29udHJvbCA9IGNyZWF0ZVJpY2hUZXh0RWRpdCh0b29sa2l0LCBwYXJlbnQsIFNXVC5NVUxUSQotCQkJCXwgU1dULldSQVAgfCBTV1QuVl9TQ1JPTEwsIEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCwgaGVpZ2h0LAotCQkJCXdpZHRoLCAxLCBkZWNvcmF0ZWRMYWJlbCk7Ci0KLQkJbGluay5zZXRIcmVmKGNvbnRyb2wpOwotCQlsaW5rLnNldERhdGEoIlRpdGxlIiwgbGFiZWxUZXh0KTsgLy8kTk9OLU5MUy0xJAotCQlsaW5rLmFkZEh5cGVybGlua0xpc3RlbmVyKG5ldyBIeXBlcmxpbmtBZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgbGlua0FjdGl2YXRlZChIeXBlcmxpbmtFdmVudCBlKSB7Ci0JCQkJdG9nZ2xlKGUsIFNFQ1RJT05fSUQpOwotCQkJfQotCQl9KTsKLQotCQlyZXR1cm4gY29udHJvbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgcmljaCB0ZXh0IGVkaXRvciBvbiBhIGZvcm0gcGFnZS4KLQkgKiAKLQkgKiBAcGFyYW0gdG9vbGtpdAotCSAqICAgICAgICAgICAgVGhlIGZvcm0gdG9vbGtpdC4KLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbXBvc2l0ZS4KLQkgKiBAcGFyYW0gc3R5bGUKLQkgKiAgICAgICAgICAgIFRoZSByaWNoIHRleHQgc3R5bGUuCi0JICogQHBhcmFtIGhlaWdodAotCSAqICAgICAgICAgICAgVGhlIGhlaWdodCBvZiB0aGUgY29udHJvbC4KLQkgKiBAcGFyYW0gd2lkdGgKLQkgKiAgICAgICAgICAgIFRoZSB3aWR0aCBvZiB0aGUgdGV4dCBjb250cm9sLgotCSAqIEBwYXJhbSBob3Jpem9udGFsU3BhbgotCSAqICAgICAgICAgICAgVGhlIG51bWJlciBvZiBjb2x1bW4gY2VsbHMgdGFrZW4gdXAgYnkgdGhlIFRleHQgY29udHJvbC4KLQkgKiBAcmV0dXJuIFRoZSBuZXcgPGNvZGU+SU1ldGhvZFJpY2hUZXh0RWRpdG9yPC9jb2RlPi4KLQkgKi8KLQlwcm90ZWN0ZWQgSU1ldGhvZFJpY2hUZXh0RWRpdG9yIGNyZWF0ZVJpY2hUZXh0RWRpdG9yKEZvcm1Ub29sa2l0IHRvb2xraXQsCi0JCQlDb21wb3NpdGUgcGFyZW50LCBpbnQgc3R5bGUsIGludCBncmlkRGF0YVN0eWxlLCBpbnQgaGVpZ2h0LAotCQkJaW50IHdpZHRoLCBpbnQgaG9yaXpvbnRhbFNwYW4sIExhYmVsIGxhYmVsKSB7Ci0JCUlNZXRob2RSaWNoVGV4dEVkaXRvciBlZGl0b3IgPSBNZXRob2RGb3JtVG9vbGtpdC5jcmVhdGVSaWNoVGV4dEVkaXRvcigKLQkJCQl0b29sa2l0LCBwYXJlbnQsICIiLCBzdHlsZSwgY29udGVudEVsZW1lbnRQYXRoLCBtZXRob2RFbGVtZW50LCBsYWJlbCwgZ2V0RWRpdG9yKCkuZ2V0RWRpdG9yU2l0ZSgpKTsgLy8kTk9OLU5MUy0xJAotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShncmlkRGF0YVN0eWxlKTsKLQkJZ3JpZERhdGEuaGVpZ2h0SGludCA9IGhlaWdodDsKLQkJZ3JpZERhdGEud2lkdGhIaW50ID0gd2lkdGg7Ci0JCWdyaWREYXRhLmhvcml6b250YWxTcGFuID0gaG9yaXpvbnRhbFNwYW47Ci0JCWVkaXRvci5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJcmV0dXJuIGVkaXRvcjsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgY29tYm9ib3ggY29udHJvbCBvbiBhIGZvcm0gcGFnZS4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbXBvc2l0ZS4KLQkgKiBAcGFyYW0gc3R5bGUKLQkgKiAgICAgICAgICAgIFRoZSBDb21ib2JveCBzdHlsZS4KLQkgKiBAcGFyYW0gZ3JpZERhdGFTdHlsZQotCSAqICAgICAgICAgICAgVGhlIEdyaWREYXRhIHN0eWxlLgotCSAqIEByZXR1cm4gQSBuZXcgPGNvZGU+Q29tYm9ib3g8L2NvZGU+LgotCSAqLwotCXByb3RlY3RlZCBDb21ibyBjcmVhdGVDb21ibyhDb21wb3NpdGUgcGFyZW50LCBpbnQgc3R5bGUsIGludCBncmlkRGF0YVN0eWxlKSB7Ci0JCUNvbWJvIGNvbnRyb2wgPSBuZXcgQ29tYm8ocGFyZW50LCBzdHlsZSk7Ci0JCXJldHVybiBjb250cm9sOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBjb21ib2JveCBjb250cm9sIG9uIGEgZm9ybSBwYWdlLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29tcG9zaXRlLgotCSAqIEByZXR1cm4gQSBuZXcgPGNvZGU+Q29tYm9ib3g8L2NvZGU+LgotCSAqLwotCXByb3RlY3RlZCBDb21ibyBjcmVhdGVDb21ibyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXJldHVybiBjcmVhdGVDb21ibyhwYXJlbnQsIFNXVC5TSU5HTEUgfCBTV1QuRkxBVCB8IFNXVC5SRUFEX09OTFksCi0JCQkJR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgY29tYm9ib3ggY29udHJvbCB3aXRoIGEgbGFiZWwgb24gYSBmb3JtIHBhZ2UuCi0JICogCi0JICogQHBhcmFtIHRvb2xraXQKLQkgKiAgICAgICAgICAgIFRoZSBmb3JtIHRvb2xraXQuCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb21wb3NpdGUuCi0JICogQHBhcmFtIGxhYmVsVGV4dAotCSAqICAgICAgICAgICAgVGhlIHRleHQgZm9yIHRoZSBMYWJlbC4KLQkgKiBAcGFyYW0gc3R5bGUKLQkgKiAgICAgICAgICAgIFRoZSBDb21ib2JveCBzdHlsZS4KLQkgKiBAcGFyYW0gZ3JpZERhdGFTdHlsZQotCSAqICAgICAgICAgICAgVGhlIEdyaWREYXRhIHN0eWxlLgotCSAqIEByZXR1cm4gQSBuZXcgPGNvZGU+Q29tYm9ib3g8L2NvZGU+LgotCSAqLwotCXByb3RlY3RlZCBDb21ibyBjcmVhdGVDQ29tYm9XaXRoTGFiZWwoRm9ybVRvb2xraXQgdG9vbGtpdCwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyB0ZXh0TGFiZWwsIGludCBzdHlsZSwgaW50IGdyaWREYXRhU3R5bGUpIHsKLQkJY3JlYXRlTGFiZWwodG9vbGtpdCwgcGFyZW50LCB0ZXh0TGFiZWwpOwotCQlyZXR1cm4gY3JlYXRlQ29tYm8ocGFyZW50LCBzdHlsZSwgZ3JpZERhdGFTdHlsZSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIGNvbWJvYm94IGNvbnRyb2wgd2l0aCBhIGxhYmVsIG9uIGEgZm9ybSBwYWdlLgotCSAqIAotCSAqIEBwYXJhbSB0b29sa2l0Ci0JICogICAgICAgICAgICBUaGUgZm9ybSB0b29sa2l0LgotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29tcG9zaXRlLgotCSAqIEBwYXJhbSBsYWJlbFRleHQKLQkgKiAgICAgICAgICAgIFRoZSB0ZXh0IGZvciB0aGUgTGFiZWwuCi0JICogQHJldHVybiBBIG5ldyA8Y29kZT5Db21ib2JveDwvY29kZT4uCi0JICovCi0JcHJvdGVjdGVkIENvbWJvIGNyZWF0ZUNvbWJvV2l0aExhYmVsKEZvcm1Ub29sa2l0IHRvb2xraXQsIENvbXBvc2l0ZSBwYXJlbnQsCi0JCQlTdHJpbmcgbGFiZWxUZXh0KSB7Ci0JCWNyZWF0ZUxhYmVsKHRvb2xraXQsIHBhcmVudCwgbGFiZWxUZXh0KTsKLQkJcmV0dXJuIGNyZWF0ZUNvbWJvKHBhcmVudCwgU1dULlNJTkdMRSB8IFNXVC5GTEFUIHwgU1dULlJFQURfT05MWSwKLQkJCQlHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBjb21wb3NpdGUgb24gYSBmb3JtIHBhZ2UuCi0JICogCi0JICogQHBhcmFtIHRvb2xraXQKLQkgKiAgICAgICAgICAgIFRoZSBmb3JtIHRvb2xraXQuCi0JICogQHBhcmFtIHNlY3Rpb24KLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgc2VjdGlvbi4KLQkgKiBAcmV0dXJuIEEgbmV3IDxjb2RlPkNvbXBvc2l0ZTwvY29kZT4uCi0JICovCi0KLQlwcm90ZWN0ZWQgQ29tcG9zaXRlIGNyZWF0ZUNvbXBvc2l0ZShGb3JtVG9vbGtpdCB0b29sa2l0LCBTZWN0aW9uIHNlY3Rpb24pIHsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IHRvb2xraXQuY3JlYXRlQ29tcG9zaXRlKHNlY3Rpb24pOwotCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMywgZmFsc2UpKTsKLQkJc2VjdGlvbi5zZXRDbGllbnQoY29tcG9zaXRlKTsKLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgY29tcG9zaXRlIG9uIGEgZm9ybSBwYWdlLgotCSAqIAotCSAqIEBwYXJhbSB0b29sa2l0Ci0JICogICAgICAgICAgICBUaGUgZm9ybSB0b29sa2l0LgotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29tcG9zaXRlLgotCSAqIEBwYXJhbSBncmlkRGF0YVN0eWxlCi0JICogICAgICAgICAgICBUaGUgR3JpZERhdGEgc3R5bGUuCi0JICogQHBhcmFtIHZlcnRpY2FsU3BhbgotCSAqICAgICAgICAgICAgVGhlIG51bWJlciBvZiByb3cgY2VsbHMgdGFrZW4gdXAgYnkgdGhlIENvbXBvc2l0ZS4KLQkgKiBAcGFyYW0gaG9yaXpvbnRhbFNwYW4KLQkgKiAgICAgICAgICAgIFRoZSBudW1iZXIgb2YgY29sdW1uIGNlbGxzIHRha2VuIHVwIGJ5IHRoZSBDb21wb3NpdGUuCi0JICogQHBhcmFtIG51bUNvbHVtbnMKLQkgKiAgICAgICAgICAgIFRoZSBudW1iZXIgb2YgY29sdW1ucyBpbiB0aGUgZ3JpZC4KLQkgKiBAcmV0dXJuIEEgbmV3IDxjb2RlPkNvbXBvc2l0ZTwvY29kZT4uCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBDb21wb3NpdGUgY3JlYXRlQ29tcG9zaXRlKEZvcm1Ub29sa2l0IHRvb2xraXQsCi0JCQlDb21wb3NpdGUgcGFyZW50LCBpbnQgZ3JpZERhdGFTdHlsZSwgaW50IHZlcnRpY2FsU3BhbiwKLQkJCWludCBob3Jpem9udGFsU3BhbiwgaW50IG51bUNvbHVtbnMpIHsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IHRvb2xraXQuY3JlYXRlQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShncmlkRGF0YVN0eWxlKTsKLQkJZ3JpZERhdGEudmVydGljYWxTcGFuID0gdmVydGljYWxTcGFuOwotCQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IGhvcml6b250YWxTcGFuOwotCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQobnVtQ29sdW1ucywgZmFsc2UpKTsKLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgY29tcG9zaXRlIG9uIGEgZm9ybSBwYWdlLgotCSAqIAotCSAqIEBwYXJhbSB0b29sa2l0Ci0JICogICAgICAgICAgICBUaGUgZm9ybSB0b29sa2l0LgotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29tcG9zaXRlLgotCSAqIEBwYXJhbSB2ZXJ0aWNhbFNwYW4KLQkgKiAgICAgICAgICAgIFRoZSBudW1iZXIgb2Ygcm93IGNlbGxzIHRha2VuIHVwIGJ5IHRoZSBDb21wb3NpdGUuCi0JICogQHJldHVybiBBIG5ldyA8Y29kZT5Db21wb3NpdGU8L2NvZGU+LgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgQ29tcG9zaXRlIGNyZWF0ZUNvbXBvc2l0ZShGb3JtVG9vbGtpdCB0b29sa2l0LAotCQkJQ29tcG9zaXRlIHBhcmVudCwgaW50IHZlcnRpY2FsU3BhbikgewotCQlyZXR1cm4gY3JlYXRlQ29tcG9zaXRlKHRvb2xraXQsIHBhcmVudCwgR3JpZERhdGEuRklMTF9CT1RILAotCQkJCXZlcnRpY2FsU3BhbiwgMSwgMSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIGNvbXBvc2l0ZSBmb3IgZGlzcGxheWluZyBidXR0b25zIG9uIGEgZm9ybSBwYWdlLgotCSAqIAotCSAqIEBwYXJhbSB0b29sa2l0Ci0JICogICAgICAgICAgICBUaGUgZm9ybSB0b29sa2l0LgotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29tcG9zaXRlLgotCSAqIEBwYXJhbSB0eXBlCi0JICogICAgICAgICAgICBUaGUgQ29tcG9zaXRlIHR5cGUuCi0JICogQHJldHVybiBBIG5ldyA8Y29kZT5Db21wb3NpdGU8L2NvZGU+LgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgQ29tcG9zaXRlIGNyZWF0ZUNvbXBvc2l0ZUZvckJ1dHRvbnMoRm9ybVRvb2xraXQgdG9vbGtpdCwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJcmV0dXJuIGNyZWF0ZUNvbXBvc2l0ZSh0b29sa2l0LCBwYXJlbnQsIEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0NFTlRFUgotCQkJCXwgR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9DRU5URVIsIFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCwgMSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIGV4cGFuZGVkIGNvbXBvc2l0ZSBpbiB0aGUgZm9ybQotCSAqIDxwPgotCSAqIFVzZWQgdG8gaG9sZCBhbiBleHBhbmRlZCByaWNoIHRleHQgZWRpdG9yLgotCSAqIAotCSAqIEBwYXJhbSB0b29sa2l0Ci0JICogICAgICAgICAgICBUaGUgZm9ybSB0b29sa2l0LgotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29tcG9zaXRlLgotCSAqIEByZXR1cm4gQSBuZXcgPGNvZGU+Q29tcG9zaXRlPC9jb2RlPi4KLQkgKi8KLQlwcm90ZWN0ZWQgQ29tcG9zaXRlIGNyZWF0ZUV4cGFuZGVkQ29tcG9zaXRlKEZvcm1Ub29sa2l0IHRvb2xraXQsCi0JCQlDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBleHBhbmRlZENvbXBvc2l0ZSA9IHRvb2xraXQuY3JlYXRlQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlleHBhbmRlZENvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJZXhwYW5kZWRDb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKSk7Ci0JCWV4cGFuZGVkQ29tcG9zaXRlLnNldFZpc2libGUoZmFsc2UpOwotCQlyZXR1cm4gZXhwYW5kZWRDb21wb3NpdGU7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIHRhYmxlIG9uIGEgZm9ybSBwYWdlLgotCSAqIAotCSAqIEBwYXJhbSB0b29sa2l0Ci0JICogICAgICAgICAgICBUaGUgZm9ybSB0b29sa2l0LgotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29tcG9zaXRlLgotCSAqIEBwYXJhbSBzdHlsZQotCSAqICAgICAgICAgICAgVGhlIFRhYmxlIHN0eWxlLgotCSAqIEBwYXJhbSBncmlkRGF0YVN0eWxlCi0JICogICAgICAgICAgICBUaGUgR3JpZERhdGEgc3R5bGUuCi0JICogQHBhcmFtIGhlaWdodAotCSAqICAgICAgICAgICAgVGhlIGhlaWdodCBvZiB0aGUgVGFibGUuCi0JICogQHBhcmFtIHdpZHRoCi0JICogICAgICAgICAgICBUaGUgd2lkdGggb2YgdGhlIFRhYmxlLgotCSAqIEBwYXJhbSB2ZXJ0aWNhbFNwYW4KLQkgKiAgICAgICAgICAgIFRoZSBudW1iZXIgb2Ygcm93IGNlbGxzIHRha2VuIHVwIGJ5IHRoZSBUYWJsZS4KLQkgKiBAcGFyYW0gaG9yaXpvbnRhbFNwYW4KLQkgKiAgICAgICAgICAgIFRoZSBudW1iZXIgb2YgY29sdW1uIGNlbGxzIHRha2VuIHVwIGJ5IHRoZSBUYWJsZS4KLQkgKiBAcmV0dXJuIEEgbmV3IDxjb2RlPlRhYmxlPC9jb2RlPi4KLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIFRhYmxlIGNyZWF0ZVRhYmxlKEZvcm1Ub29sa2l0IHRvb2xraXQsIENvbXBvc2l0ZSBwYXJlbnQsCi0JCQlpbnQgc3R5bGUsIGludCBncmlkRGF0YVN0eWxlLCBpbnQgaGVpZ2h0LCBpbnQgd2lkdGgsCi0JCQlpbnQgdmVydGljYWxTcGFuLCBpbnQgaG9yaXpvbnRhbFNwYW4pIHsKLQkJVGFibGUgdGFibGUgPSB0b29sa2l0LmNyZWF0ZVRhYmxlKHBhcmVudCwgc3R5bGUpOwotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShncmlkRGF0YVN0eWxlKTsKLQkJZ3JpZERhdGEuaGVpZ2h0SGludCA9IGhlaWdodDsKLQkJZ3JpZERhdGEud2lkdGhIaW50ID0gd2lkdGg7Ci0JCWdyaWREYXRhLnZlcnRpY2FsU3BhbiA9IHZlcnRpY2FsU3BhbjsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSBob3Jpem9udGFsU3BhbjsKLQkJdGFibGUuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCXJldHVybiB0YWJsZTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgdGFibGUgb24gYSBmb3JtIHBhZ2UuCi0JICogCi0JICogQHBhcmFtIHRvb2xraXQKLQkgKiAgICAgICAgICAgIFRoZSBmb3JtIHRvb2xraXQuCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb21wb3NpdGUuCi0JICogQHBhcmFtIHR5cGUKLQkgKiAgICAgICAgICAgIFRoZSB0YWJsZSB0YWJsZS4KLQkgKiBAcmV0dXJuIEEgbmV3IDxjb2RlPlRhYmxlPC9jb2RlPi4KLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIFRhYmxlIGNyZWF0ZVRhYmxlKEZvcm1Ub29sa2l0IHRvb2xraXQsIENvbXBvc2l0ZSBwYXJlbnQsCi0JCQlpbnQgdHlwZSkgewotCQlzd2l0Y2ggKHR5cGUpIHsKLQkJY2FzZSBTTUFMTF9TSVpFOgotCQkJcmV0dXJuIGNyZWF0ZVRhYmxlKHRvb2xraXQsIHBhcmVudCwgU1dULk1VTFRJLCBHcmlkRGF0YS5GSUxMX0JPVEgsCi0JCQkJCTU2LCAyMDAsIDEsIDEpOwotCQljYXNlIE1FRElVTV9TSVpFOgotCQkJcmV0dXJuIGNyZWF0ZVRhYmxlKHRvb2xraXQsIHBhcmVudCwgU1dULk1VTFRJLCBHcmlkRGF0YS5GSUxMX0JPVEgsCi0JCQkJCTExMiwgMjAwLCAxLCAxKTsKLQkJY2FzZSBMQVJHRV9TSVpFOgotCQkJcmV0dXJuIGNyZWF0ZVRhYmxlKHRvb2xraXQsIHBhcmVudCwgU1dULk1VTFRJLCBHcmlkRGF0YS5GSUxMX0JPVEgsCi0JCQkJCTIwMCwgMjAwLCAxLCAxKTsKLQkJY2FzZSBTSU5HTEVfUk9XOgotCQkJcmV0dXJuIGNyZWF0ZVRhYmxlKHRvb2xraXQsIHBhcmVudCwgU1dULk1VTFRJLAotCQkJCQlHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwsIDIwLCAyMDAsIDEsIDEpOwotCQlkZWZhdWx0OgotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIGJ1dHRvbiBvbiBhIGZvcm0gcGFnZS4KLQkgKiAKLQkgKiBAcGFyYW0gdG9vbGtpdAotCSAqICAgICAgICAgICAgVGhlIGZvcm0gdG9vbGtpdC4KLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbXBvc2l0ZS4KLQkgKiBAcGFyYW0gdHlwZQotCSAqICAgICAgICAgICAgVGhlIGJ1dHRvbiB0eXBlLgotCSAqIEByZXR1cm4gQSBuZXcgPGNvZGU+QnV0dG9uPC9jb2RlPi4KLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIEJ1dHRvbiBjcmVhdGVCdXR0b24oRm9ybVRvb2xraXQgdG9vbGtpdCwgQ29tcG9zaXRlIHBhcmVudCwKLQkJCWludCB0eXBlKSB7Ci0JCUJ1dHRvbiBidXR0b247Ci0JCXN3aXRjaCAodHlwZSkgewotCQljYXNlIEFERF9CVVRUT046Ci0JCQlidXR0b24gPSB0b29sa2l0LmNyZWF0ZUJ1dHRvbihwYXJlbnQsCi0JCQkJCUF1dGhvcmluZ1VJVGV4dC5BRERfQlVUVE9OX1RFWFQsIFNXVC5OT05FKTsKLQkJCWJyZWFrOwotCQljYXNlIFJFTU9WRV9CVVRUT046Ci0JCQlidXR0b24gPSB0b29sa2l0LmNyZWF0ZUJ1dHRvbihwYXJlbnQsCi0JCQkJCUF1dGhvcmluZ1VJVGV4dC5SRU1PVkVfQlVUVE9OX1RFWFQsIFNXVC5OT05FKTsKLQkJCWJyZWFrOwotCQljYXNlIFVQX0JVVFRPTjoKLQkJCWJ1dHRvbiA9IHRvb2xraXQuY3JlYXRlQnV0dG9uKHBhcmVudCwKLQkJCQkJQXV0aG9yaW5nVUlUZXh0LlVQX0JVVFRPTl9URVhULCBTV1QuTk9ORSk7Ci0JCQlicmVhazsKLQkJY2FzZSBET1dOX0JVVFRPTjoKLQkJCWJ1dHRvbiA9IHRvb2xraXQuY3JlYXRlQnV0dG9uKHBhcmVudCwKLQkJCQkJQXV0aG9yaW5nVUlUZXh0LkRPV05fQlVUVE9OX1RFWFQsIFNXVC5OT05FKTsKLQkJCWJyZWFrOwotCQljYXNlIE9SREVSX0JVVFRPTjoKLQkJCWJ1dHRvbiA9IHRvb2xraXQuY3JlYXRlQnV0dG9uKHBhcmVudCwKLQkJCQkJQXV0aG9yaW5nVUlUZXh0Lk9SREVSX0JVVFRPTl9URVhULCBTV1QuTk9ORSk7Ci0JCQlicmVhazsKLQkJY2FzZSBTRUxFQ1RfQlVUVE9OOgotCQkJYnV0dG9uID0gdG9vbGtpdC5jcmVhdGVCdXR0b24ocGFyZW50LAotCQkJCQlBdXRob3JpbmdVSVRleHQuU0VMRUNUX0JVVFRPTl9URVhULCBTV1QuTk9ORSk7Ci0JCQlicmVhazsKLQkJY2FzZSBDTEVBUl9CVVRUT046Ci0JCQlidXR0b24gPSB0b29sa2l0LmNyZWF0ZUJ1dHRvbihwYXJlbnQsCi0JCQkJCUF1dGhvcmluZ1VJVGV4dC5DTEVBUl9CVVRUT05fVEVYVCwgU1dULk5PTkUpOwotCQkJYnJlYWs7Ci0JCWNhc2UgQVRUQUNIX0JVVFRPTjoKLQkJCWJ1dHRvbiA9IHRvb2xraXQuY3JlYXRlQnV0dG9uKHBhcmVudCwKLQkJCQkJQXV0aG9yaW5nVUlUZXh0LkFUVEFDSF9CVVRUT05fVEVYVCwgU1dULk5PTkUpOwotCQkJYnJlYWs7Ci0JCWNhc2UgQVRUQUNIX1VSTF9CVVRUT046Ci0JCQlidXR0b24gPSB0b29sa2l0LmNyZWF0ZUJ1dHRvbihwYXJlbnQsCi0JCQkJCUF1dGhvcmluZ1VJVGV4dC5BVFRBQ0hfVVJMX0JVVFRPTl9URVhULCBTV1QuTk9ORSk7Ci0JCQlicmVhazsJCQotCQljYXNlIERFVEFDSF9CVVRUT046Ci0JCQlidXR0b24gPSB0b29sa2l0LmNyZWF0ZUJ1dHRvbihwYXJlbnQsCi0JCQkJCUF1dGhvcmluZ1VJVGV4dC5ERVRBQ0hfQlVUVE9OX1RFWFQsIFNXVC5OT05FKTsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotCQl9Ci0JCWJ1dHRvbi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJYnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQlyZXR1cm4gYnV0dG9uOwotCX0KLQkKLQkvKioKLQkgKiBHZXQgaGVpZ2h0IG9mIHRoZSByaWNoIHRleHQgY29udHJvbAotCSAqIEByZXR1cm4KLQkgKiAJCUhlaWdodCBvZiB0aGUgcmljaCB0ZXh0IGNvbnRyb2wKLQkgKi8KLQlwdWJsaWMgaW50IGdldFJpY2hUZXh0RWRpdG9ySGVpZ2h0KCkgewotCQlyZXR1cm4gZm9ybS5nZXRCb3VuZHMoKS5oZWlnaHQgLSAzICogMzI7Ci0JfQotCi0JLyoqCi0JICogR2V0IHdpZHRoIG9mIHRoZSByaWNoIHRleHQgY29udHJvbAotCSAqIEByZXR1cm4KLQkgKiAJCVdpZHRoIG9mIHRoZSByaWNoIHRleHQgY29udHJvbAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0UmljaFRleHRFZGl0b3JXaWR0aCgpIHsKLQkJcmV0dXJuIGZvcm0uZ2V0Qm91bmRzKCkud2lkdGggLSAyICogMzI7Ci0JfQotCi0JcHVibGljIE1ldGhvZEVsZW1lbnQgZ2V0TWV0aG9kRWxlbWVudCgpIHsKLQkJcmV0dXJuIG1ldGhvZEVsZW1lbnQ7Ci0JfQotCi0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvQ2F0ZWdvcnlHdWlkYW5jZVBhZ2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvQ2F0ZWdvcnlHdWlkYW5jZVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzA4YWY3Yy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL0NhdGVnb3J5R3VpZGFuY2VQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3JtczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZpbHRlcnMuR3VpZGFuY2VGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklBY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuRmlsdGVyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5NZXRob2RFbGVtZW50VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNoZWNrbGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbmNlcHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5FeGFtcGxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3VpZGFuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HdWlkZWxpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5QcmFjdGljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJldXNhYmxlQXNzZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5TdXBwb3J0aW5nTWF0ZXJpYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Ub29sOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVG9vbE1lbnRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLmVkaXRvci5Gb3JtRWRpdG9yOwotCi0KLS8qKgotICogVGhlIEd1aWRhbmNlIHBhZ2UgaW4gdGhlIGNvbnRlbnQgZWxlbWVudCBlZGl0b3IuCi0gKiAKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMAotICogCi0gKiBUT0RPIC0gY2hhbmdlIG5hbWUgb2YgY2xhc3MgdG8gQ29udGVudEVsZW1lbnRHdWlkYW5jZVBhZ2UKLSAqLwotcHVibGljIGNsYXNzIENhdGVnb3J5R3VpZGFuY2VQYWdlIGV4dGVuZHMgQXNzb2NpYXRpb25Gb3JtUGFnZSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9STV9QQUdFX0lEID0gImNhdGVnb3J5R3VpZGFuY2VzUGFnZSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIENhdGVnb3J5R3VpZGFuY2VQYWdlKEZvcm1FZGl0b3IgZWRpdG9yKSB7Ci0JCXN1cGVyKGVkaXRvciwgRk9STV9QQUdFX0lELCBBdXRob3JpbmdVSVRleHQuR1VJREFOQ0VfUEFHRV9USVRMRSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjaW5pdChvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZSwgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0KQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSUVkaXRvclNpdGUgc2l0ZSwgSUVkaXRvcklucHV0IGlucHV0KSB7Ci0JCXN1cGVyLmluaXQoc2l0ZSwgaW5wdXQpOwotCQlzZXRBbGxvd0NoYW5nZTEodHJ1ZSk7Ci0JCXNldEFsbG93Q2hhbmdlMih0cnVlKTsKLQkJc2V0VXNlQ2F0ZWdvcnkyKGZhbHNlKTsKLQkJc2V0VXNlQ2F0ZWdvcnkzKGZhbHNlKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNpbml0Q29udGVudFByb3ZpZGVyU2VsZWN0ZWQoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRDb250ZW50UHJvdmlkZXJTZWxlY3RlZCgpIHsKLQkJY29udGVudFByb3ZpZGVyU2VsZWN0ZWQgPSBuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoCi0JCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJCS5nZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSkgewotCQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBvYmplY3QpIHsKLQkJCQlMaXN0IGxpc3QgPSBNZXRob2RFbGVtZW50VXRpbAotCQkJCQkJLmdldFNlbGVjdGVkR3VpZGFuY2VzKGNvbnRlbnRFbGVtZW50KTsKLQkJCQlMaXN0IGxvY2FsID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCWZvciAoSXRlcmF0b3IgaXQgPSBsaXN0Lml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQkJT2JqZWN0IG9iaiA9IGl0Lm5leHQoKTsKLQkJCQkJaWYgKCEob2JqIGluc3RhbmNlb2YgUHJhY3RpY2UKLQkJCQkJCQl8fCAob2JqIGluc3RhbmNlb2YgVG9vbE1lbnRvciAmJiBjb250ZW50RWxlbWVudCBpbnN0YW5jZW9mIFRvb2wpIHx8IG9iagotCQkJCQkJCS5lcXVhbHMoY29udGVudEVsZW1lbnQKLQkJCQkJCQkJCS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkpKSkgewotCQkJCQkJbG9jYWwuYWRkKG9iaik7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJcmV0dXJuIGxvY2FsLnRvQXJyYXkoKTsKLQkJCX0KLQkJfTsKLQkJdmlld2VyX3NlbGVjdGVkLnNldENvbnRlbnRQcm92aWRlcihjb250ZW50UHJvdmlkZXJTZWxlY3RlZCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjYWRkSXRlbXNUb01vZGVsMShBcnJheUxpc3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkSXRlbXNUb01vZGVsMShBcnJheUxpc3QgYWRkSXRlbXMpIHsKLQkJLy8gVXBkYXRlIHRoZSBtb2RlbC4KLQkJaWYgKCFhZGRJdGVtcy5pc0VtcHR5KCkpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBhZGRJdGVtcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJR3VpZGFuY2UgaXRlbSA9IChHdWlkYW5jZSkgaXQubmV4dCgpOwotCi0JCQkJLy8gR3VpZGFuY2UgZm9yIGNvbnRlbnQgZWxlbWVudC4KLQkJCQlpZiAoaXRlbSBpbnN0YW5jZW9mIENoZWNrbGlzdCkgewotCQkJCQllZGl0b3IuZ2V0QWN0aW9uTWFuYWdlcigpCi0JCQkJCQkJLmRvQWN0aW9uKAotCQkJCQkJCQkJSUFjdGlvbk1hbmFnZXIuQURELAotCQkJCQkJCQkJY29udGVudEVsZW1lbnQsCi0JCQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJCQkuZ2V0Q29udGVudEVsZW1lbnRfQ2hlY2tsaXN0cygpLAotCQkJCQkJCQkJKENoZWNrbGlzdCkgaXRlbSwgLTEpOwotCQkJCX0gZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIENvbmNlcHQpIHsKLQkJCQkJZWRpdG9yLmdldEFjdGlvbk1hbmFnZXIoKS5kb0FjdGlvbigKLQkJCQkJCQlJQWN0aW9uTWFuYWdlci5BREQsCi0JCQkJCQkJY29udGVudEVsZW1lbnQsCi0JCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCS5nZXRDb250ZW50RWxlbWVudF9Db25jZXB0c0FuZFBhcGVycygpLAotCQkJCQkJCShDb25jZXB0KSBpdGVtLCAtMSk7Ci0JCQkJfSBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgRXhhbXBsZSkgewotCQkJCQllZGl0b3IuZ2V0QWN0aW9uTWFuYWdlcigpLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLkFERCwKLQkJCQkJCQljb250ZW50RWxlbWVudCwKLQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb250ZW50RWxlbWVudF9FeGFtcGxlcygpLAotCQkJCQkJCShFeGFtcGxlKSBpdGVtLCAtMSk7Ci0JCQkJfSBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgU3VwcG9ydGluZ01hdGVyaWFsKSB7Ci0JCQkJCWVkaXRvci5nZXRBY3Rpb25NYW5hZ2VyKCkuZG9BY3Rpb24oCi0JCQkJCQkJSUFjdGlvbk1hbmFnZXIuQURELAotCQkJCQkJCWNvbnRlbnRFbGVtZW50LAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkuZ2V0Q29udGVudEVsZW1lbnRfU3VwcG9ydGluZ01hdGVyaWFscygpLAotCQkJCQkJCShTdXBwb3J0aW5nTWF0ZXJpYWwpIGl0ZW0sIC0xKTsKLQkJCQl9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBHdWlkZWxpbmUpIHsKLQkJCQkJZWRpdG9yLmdldEFjdGlvbk1hbmFnZXIoKQotCQkJCQkJCS5kb0FjdGlvbigKLQkJCQkJCQkJCUlBY3Rpb25NYW5hZ2VyLkFERCwKLQkJCQkJCQkJCWNvbnRlbnRFbGVtZW50LAotCQkJCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCQkJLmdldENvbnRlbnRFbGVtZW50X0d1aWRlbGluZXMoKSwKLQkJCQkJCQkJCShHdWlkZWxpbmUpIGl0ZW0sIC0xKTsKLQkJCQl9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBSZXVzYWJsZUFzc2V0KSB7Ci0JCQkJCWVkaXRvci5nZXRBY3Rpb25NYW5hZ2VyKCkuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuQURELAotCQkJCQkJCWNvbnRlbnRFbGVtZW50LAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbnRlbnRFbGVtZW50X0Fzc2V0cygpLAotCQkJCQkJCShSZXVzYWJsZUFzc2V0KSBpdGVtLCAtMSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4KLQkJCQkJCQkuZ2V0RGVmYXVsdCgpCi0JCQkJCQkJLmdldExvZ2dlcigpCi0JCQkJCQkJLmxvZ0Vycm9yKAotCQkJCQkJCQkJIlVuYWJsZSB0byBhZGQgZ3VpZGFuY2UgIiArIGl0ZW0uZ2V0VHlwZSgpLmdldE5hbWUoKSArICI6IiArIGl0ZW0uZ2V0TmFtZSgpICsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQkJCQkJCSJ0byAiIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCQkJKyBjb250ZW50RWxlbWVudC5nZXRUeXBlKCkKLQkJCQkJCQkJCQkJCQkuZ2V0TmFtZSgpCi0JCQkJCQkJCQkJCSsgIjoiICsgY29udGVudEVsZW1lbnQuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCX0KLQkJCXNldERpcnR5KHRydWUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjcmVtb3ZlSXRlbXNGcm9tTW9kZWwxKEFycmF5TGlzdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVJdGVtc0Zyb21Nb2RlbDEoQXJyYXlMaXN0IHJtSXRlbXMpIHsKLQkJLy8gVXBkYXRlIHRoZSBtb2RlbC4KLQkJaWYgKCFybUl0ZW1zLmlzRW1wdHkoKSkgewotCQkJZm9yIChJdGVyYXRvciBpdCA9IHJtSXRlbXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCUd1aWRhbmNlIGl0ZW0gPSAoR3VpZGFuY2UpIGl0Lm5leHQoKTsKLQotCQkJCS8vIEd1aWRhbmNlIGZvciB0aGUgbWV0aG9kIGVsZW1lbnQuCi0JCQkJaWYgKGl0ZW0gaW5zdGFuY2VvZiBDaGVja2xpc3QpIHsKLQkJCQkJZWRpdG9yLmdldEFjdGlvbk1hbmFnZXIoKQotCQkJCQkJCS5kb0FjdGlvbigKLQkJCQkJCQkJCUlBY3Rpb25NYW5hZ2VyLlJFTU9WRSwKLQkJCQkJCQkJCWNvbnRlbnRFbGVtZW50LAotCQkJCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCQkJLmdldENvbnRlbnRFbGVtZW50X0NoZWNrbGlzdHMoKSwKLQkJCQkJCQkJCWl0ZW0sIC0xKTsKLQkJCQl9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBDb25jZXB0KSB7Ci0JCQkJCWVkaXRvci5nZXRBY3Rpb25NYW5hZ2VyKCkuZG9BY3Rpb24oCi0JCQkJCQkJSUFjdGlvbk1hbmFnZXIuUkVNT1ZFLAotCQkJCQkJCWNvbnRlbnRFbGVtZW50LAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkuZ2V0Q29udGVudEVsZW1lbnRfQ29uY2VwdHNBbmRQYXBlcnMoKSwKLQkJCQkJCQkoQ29uY2VwdCkgaXRlbSwgLTEpOwotCQkJCX0gZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIEV4YW1wbGUpIHsKLQkJCQkJZWRpdG9yLmdldEFjdGlvbk1hbmFnZXIoKS5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5SRU1PVkUsCi0JCQkJCQkJY29udGVudEVsZW1lbnQsCi0JCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29udGVudEVsZW1lbnRfRXhhbXBsZXMoKSwKLQkJCQkJCQkoRXhhbXBsZSkgaXRlbSwgLTEpOwotCQkJCX0gZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIFN1cHBvcnRpbmdNYXRlcmlhbCkgewotCQkJCQllZGl0b3IuZ2V0QWN0aW9uTWFuYWdlcigpLmRvQWN0aW9uKAotCQkJCQkJCUlBY3Rpb25NYW5hZ2VyLlJFTU9WRSwKLQkJCQkJCQljb250ZW50RWxlbWVudCwKLQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJLmdldENvbnRlbnRFbGVtZW50X1N1cHBvcnRpbmdNYXRlcmlhbHMoKSwKLQkJCQkJCQkoU3VwcG9ydGluZ01hdGVyaWFsKSBpdGVtLCAtMSk7Ci0JCQkJfSBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgR3VpZGVsaW5lKSB7Ci0JCQkJCWVkaXRvci5nZXRBY3Rpb25NYW5hZ2VyKCkKLQkJCQkJCQkuZG9BY3Rpb24oCi0JCQkJCQkJCQlJQWN0aW9uTWFuYWdlci5SRU1PVkUsCi0JCQkJCQkJCQljb250ZW50RWxlbWVudCwKLQkJCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJCS5nZXRDb250ZW50RWxlbWVudF9HdWlkZWxpbmVzKCksCi0JCQkJCQkJCQkoR3VpZGVsaW5lKSBpdGVtLCAtMSk7Ci0JCQkJfSBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgUmV1c2FibGVBc3NldCkgewotCQkJCQllZGl0b3IuZ2V0QWN0aW9uTWFuYWdlcigpLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlJFTU9WRSwKLQkJCQkJCQljb250ZW50RWxlbWVudCwKLQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb250ZW50RWxlbWVudF9Bc3NldHMoKSwKLQkJCQkJCQkoUmV1c2FibGVBc3NldCkgaXRlbSwgLTEpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCUF1dGhvcmluZ1VJUGx1Z2luCi0JCQkJCQkJLmdldERlZmF1bHQoKQotCQkJCQkJCS5nZXRMb2dnZXIoKQotCQkJCQkJCS5sb2dFcnJvcigKLQkJCQkJCQkJCSJVbmFibGUgdG8gcmVtb3ZlIGd1aWRhbmNlICIgKyBpdGVtLmdldFR5cGUoKS5nZXROYW1lKCkgKyAiOiIgKyBpdGVtLmdldE5hbWUoKSArIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJCQkJCQkiZnJvbSAiIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCQkJKyBjb250ZW50RWxlbWVudC5nZXRUeXBlKCkKLQkJCQkJCQkJCQkJCQkuZ2V0TmFtZSgpCi0JCQkJCQkJCQkJCSsgIjoiICsgY29udGVudEVsZW1lbnQuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJCAKLQkJCQl9Ci0JCQl9Ci0JCQlzZXREaXJ0eSh0cnVlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2dldENvbnRlbnRFbGVtZW50KCkKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGdldENvbnRlbnRFbGVtZW50KCkgewotCQlyZXR1cm4gY29udGVudEVsZW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjZ2V0VGFiU3RyaW5nKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFRhYlN0cmluZygpIHsKLQkJcmV0dXJuIEZpbHRlckNvbnN0YW50cy5HVUlEQU5DRTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRGaWx0ZXIoKQotCSAqLwotCXByb3RlY3RlZCBJRmlsdGVyIGdldEZpbHRlcigpIHsKLQkJcmV0dXJuIGZpbHRlciA9IG5ldyBHdWlkYW5jZUZpbHRlcigpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9DaGVja2xpc3RJdGVtc1BhZ2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvQ2hlY2tsaXN0SXRlbXNQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4NmM4ZGMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9DaGVja2xpc3RJdGVtc1BhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zOwotCi1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJSW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmRpYWxvZ3MuU2VjdGlvbnNPcmRlckRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuTWV0aG9kRWxlbWVudEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuTWV0aG9kRWxlbWVudEVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5NZXRob2RFbGVtZW50RWRpdG9yLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvdmlkZXJzLlZhcmlhYmlsaXR5RWxlbWVudExhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5yaWNodGV4dC5JTWV0aG9kUmljaFRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5yaWNodGV4dC5JTWV0aG9kUmljaFRleHRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS51dGlsLkVkaXRvcnNDb250ZXh0SGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudXRpbC5VSUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLlN0clV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuSUxpYnJhcnlNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLkFkZFRvU2VjdGlvbkxpc3RDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JQWN0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuTW92ZUluU2VjdGlvbkxpc3RDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5SZW1vdmVGcm9tU2VjdGlvbkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlNlY3Rpb25MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmV2ZW50cy5JTGlicmFyeUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLkxpYnJhcnlVSVRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DaGVja2xpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkNvbnRyb2xFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkNvbnRyb2xMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkZvY3VzQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkZvY3VzRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklTaGFyZWRJbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5JTWFuYWdlZEZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuZWRpdG9yLkZvcm1FZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuZXZlbnRzLkh5cGVybGlua0FkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuZXZlbnRzLkh5cGVybGlua0V2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuSW1hZ2VIeXBlcmxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5TZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuVGFibGVXcmFwRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLlRhYmxlV3JhcExheW91dDsKLQotCi0vKioKLSAqIFRoZSBDaGVjayBJdGVtIHBhZ2UgaW4gdGhlIENoZWNrbGlzdCBlZGl0b3IuCi0gKiAKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQ2hlY2tsaXN0SXRlbXNQYWdlIGV4dGVuZHMgQmFzZUZvcm1QYWdlIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JNX1BBR0VfSUQgPSAiY2hlY2tsaXN0Q2hlY2tJdGVtc1BhZ2UiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIFRleHQgY3RybF9uYW1lOwotCi0JcHJpdmF0ZSBCdXR0b24gY3RybF9hZGQsIGN0cmxfZGVsZXRlLCBjdHJsX3VwLCBjdHJsX2Rvd24sIGN0cmxfb3JkZXI7Ci0KLQlwcml2YXRlIFRhYmxlIGN0cmxfY2hlY2tJdGVtczsKLQotCXByaXZhdGUgVGFibGVWaWV3ZXIgY2hlY2tJdGVtc1RhYmxlVmlld2VyOwotCi0JcHJpdmF0ZSBTZWN0aW9uTGlzdCBhbGxjaGVja0l0ZW1zOwotCi0JcHJpdmF0ZSBJTWV0aG9kUmljaFRleHQgYWN0aXZlQ29udHJvbDsKLQotCXByaXZhdGUgYm9vbGVhbiBkZXNjRXhwYW5kRmxhZyA9IGZhbHNlOwotCi0JcHJpdmF0ZSBJTWV0aG9kUmljaFRleHRFZGl0b3IgY3RybF9leHBhbmRlZDsKLQotCXByaXZhdGUgSW1hZ2VIeXBlcmxpbmsgZXhwYW5kTGluazsKLQotCXByaXZhdGUgTGFiZWwgZXhwYW5kTGFiZWw7Ci0KLQlwcm90ZWN0ZWQgU2VjdGlvbiBmb3JtU2VjdGlvbjsKLQlwcml2YXRlIFNlY3Rpb24gZ2VuZXJhbFNlY3Rpb247Ci0KLQlwcm90ZWN0ZWQgQ29tcG9zaXRlIHNlY3Rpb25Db21wb3NpdGU7Ci0JcHJpdmF0ZSBDb21wb3NpdGUgZ2VuZXJhbENvbXBvc2l0ZTsKLQotCXByaXZhdGUgQ29tcG9zaXRlIGV4cGFuZGVkQ29tcG9zaXRlOwotCi0JcHJpdmF0ZSBJTWV0aG9kUmljaFRleHQgY3RybF9tYWluZGVzYzsKLQotCXByaXZhdGUgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIgY2hlY2tJdGVtc1ZpZXdlckNvbnRlbnRQcm92aWRlcjsKLQotCXByaXZhdGUgSUxhYmVsUHJvdmlkZXIgY2hlY2tJdGVtc1ZpZXdlckxhYmVsUHJvdmlkZXI7Ci0KLQlwcml2YXRlIENoZWNrbGlzdCBjaGVja2xpc3Q7Ci0KLQlwcml2YXRlIG9yZy5lY2xpcHNlLmVwZi51bWEuU2VjdGlvbiBjdXJyZW50SXRlbTsKLQotCXByaXZhdGUgSUxpYnJhcnlDaGFuZ2VMaXN0ZW5lciBsaWJMaXN0ZW5lciA9IG51bGw7Ci0KLQlwcml2YXRlIE1vZGlmeUxpc3RlbmVyIGNvbnRlbnRNb2RpZnlMaXN0ZW5lcjsKLQotCXByaXZhdGUgSUFjdGlvbk1hbmFnZXIgYWN0aW9uTWdyOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgQ2hlY2tsaXN0SXRlbXNQYWdlKEZvcm1FZGl0b3IgZWRpdG9yKSB7Ci0JCXN1cGVyKGVkaXRvciwgRk9STV9QQUdFX0lELCBBdXRob3JpbmdVSVRleHQuQ0hFQ0tfSVRFTVNfVEVYVCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkJhc2VGb3JtUGFnZSNpbml0KG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlLCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJRWRpdG9yU2l0ZSBzaXRlLCBJRWRpdG9ySW5wdXQgaW5wdXQpIHsKLQkJc3VwZXIuaW5pdChzaXRlLCBpbnB1dCk7Ci0JCU1ldGhvZEVsZW1lbnRFZGl0b3JJbnB1dCBtZXRob2RFbGVtZW50SW5wdXQgPSAoTWV0aG9kRWxlbWVudEVkaXRvcklucHV0KSBpbnB1dDsKLQkJY2hlY2tsaXN0ID0gKENoZWNrbGlzdCkgbWV0aG9kRWxlbWVudElucHV0LmdldE1ldGhvZEVsZW1lbnQoKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgZm9ybSBjb250ZW50Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRm9ybUNvbnRlbnQoSU1hbmFnZWRGb3JtIG1hbmFnZWRGb3JtKSB7Ci0JCXN1cGVyLmNyZWF0ZUZvcm1Db250ZW50KG1hbmFnZWRGb3JtKTsKLQotCQlTdHJpbmcgZWxlbWVudExhYmVsID0gTGlicmFyeVVJVGV4dC5nZXRVSVRleHQobWV0aG9kRWxlbWVudCk7Ci0JCWZvcm0uc2V0VGV4dChMaWJyYXJ5VUlUZXh0LlRFWFRfR1VJREFOQ0UKLQkJCQkrICIgKCIgKyBlbGVtZW50TGFiZWwgKyAiKTogIiArIG1ldGhvZEVsZW1lbnQuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQotCQlmb3JtU2VjdGlvbiA9IHRvb2xraXQuY3JlYXRlU2VjdGlvbihmb3JtLmdldEJvZHkoKSwgU2VjdGlvbi5OT19USVRMRSk7Ci0JCXsKLQkJCVRhYmxlV3JhcERhdGEgdGQgPSBuZXcgVGFibGVXcmFwRGF0YShUYWJsZVdyYXBEYXRhLkZJTExfR1JBQik7Ci0JCQlmb3JtU2VjdGlvbi5zZXRMYXlvdXREYXRhKHRkKTsKLQkJCWZvcm1TZWN0aW9uLnNldExheW91dChuZXcgVGFibGVXcmFwTGF5b3V0KCkpOwotCQl9Ci0JCS8vIENyZWF0ZSB0aGUgY29tcG9zaXRlIGZvciB0aGUgc2VjdGlvbnMuCi0JCXNlY3Rpb25Db21wb3NpdGUgPSB0b29sa2l0LmNyZWF0ZUNvbXBvc2l0ZShmb3JtU2VjdGlvbiwgU1dULk5PTkUpOwotCQlzZWN0aW9uQ29tcG9zaXRlLnNldExheW91dERhdGEobmV3IFRhYmxlV3JhcERhdGEoVGFibGVXcmFwRGF0YS5GSUxMX0dSQUIpKTsKLQkJc2VjdGlvbkNvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IFRhYmxlV3JhcExheW91dCgpKTsKLQkJZm9ybVNlY3Rpb24uc2V0Q2xpZW50KHNlY3Rpb25Db21wb3NpdGUpOwotCi0JCS8vIENyZWF0ZSB0aGUgR2VuZXJhbCBJbmZvcm1hdGlvbiBzZWN0aW9uLgotCQlnZW5lcmFsU2VjdGlvbiA9IHRvb2xraXQuY3JlYXRlU2VjdGlvbihzZWN0aW9uQ29tcG9zaXRlLAotCQkJCVNlY3Rpb24uVElUTEVfQkFSIHwgU2VjdGlvbi5ERVNDUklQVElPTiB8IFNlY3Rpb24uVFdJU1RJRQotCQkJCQkJfCBTZWN0aW9uLkVYUEFOREVEKTsKLQkJZ2VuZXJhbFNlY3Rpb24KLQkJCQkuc2V0TGF5b3V0RGF0YShuZXcgVGFibGVXcmFwRGF0YShUYWJsZVdyYXBEYXRhLkZJTExfR1JBQikpOwotCQlnZW5lcmFsU2VjdGlvbi5zZXRUZXh0KEF1dGhvcmluZ1VJVGV4dC5DSEVDS19JVEVNU19TRUNUSU9OX05BTUUpOwotCQlnZW5lcmFsU2VjdGlvbi5zZXREZXNjcmlwdGlvbihBdXRob3JpbmdVSVRleHQuQ0hFQ0tfSVRFTVNfU0VDVElPTl9ERVNDKTsKLQkJZ2VuZXJhbFNlY3Rpb24uc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCi0JCWdlbmVyYWxDb21wb3NpdGUgPSB0b29sa2l0LmNyZWF0ZUNvbXBvc2l0ZShnZW5lcmFsU2VjdGlvbik7Ci0JCWdlbmVyYWxDb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCWdlbmVyYWxDb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDQsIGZhbHNlKSk7Ci0JCWdlbmVyYWxTZWN0aW9uLnNldENsaWVudChnZW5lcmFsQ29tcG9zaXRlKTsKLQotCQlFZGl0b3JzQ29udGV4dEhlbHBlci5zZXRIZWxwKGdlbmVyYWxDb21wb3NpdGUuZ2V0UGFyZW50KCksIGNoZWNrbGlzdCk7Ci0KLQkJQ29tcG9zaXRlIHBhbmUxID0gdG9vbGtpdC5jcmVhdGVDb21wb3NpdGUoZ2VuZXJhbENvbXBvc2l0ZSk7Ci0JCXsKLQkJCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCQlncmlkRGF0YS52ZXJ0aWNhbFNwYW4gPSAxOwotCQkJZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAzOwotCQkJcGFuZTEuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCQlwYW5lMS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JCX0KLQotCQlMYWJlbCBsX25hbWUgPSB0b29sa2l0LmNyZWF0ZUxhYmVsKHBhbmUxLAotCQkJCUF1dGhvcmluZ1VJVGV4dC5DSEVDS19JVEVNU19URVhUKTsKLQkJewotCQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuQkVHSU5OSU5HKTsKLQkJCWdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMzsKLQkJCWxfbmFtZS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJfQotCi0JCWN0cmxfY2hlY2tJdGVtcyA9IHRvb2xraXQuY3JlYXRlVGFibGUocGFuZTEsIFNXVC5NVUxUSSk7Ci0JCXsKLQkJCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDM7Ci0JCQlncmlkRGF0YS5oZWlnaHRIaW50ID0gMTUwOwotCQkJY3RybF9jaGVja0l0ZW1zLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQl9Ci0KLQkJaW5pdFByb3ZpZGVycygpOwotCi0JCWNoZWNrSXRlbXNUYWJsZVZpZXdlciA9IG5ldyBUYWJsZVZpZXdlcihjdHJsX2NoZWNrSXRlbXMpOwotCQljaGVja0l0ZW1zVGFibGVWaWV3ZXIKLQkJCQkuc2V0Q29udGVudFByb3ZpZGVyKGNoZWNrSXRlbXNWaWV3ZXJDb250ZW50UHJvdmlkZXIpOwotCQljaGVja0l0ZW1zVGFibGVWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihjaGVja0l0ZW1zVmlld2VyTGFiZWxQcm92aWRlcik7Ci0KLQkJQ29tcG9zaXRlIHBhbmUyID0gdG9vbGtpdC5jcmVhdGVDb21wb3NpdGUoZ2VuZXJhbENvbXBvc2l0ZSk7Ci0JCXBhbmUyLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0NFTlRFUgotCQkJCXwgR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9DRU5URVIpKTsKLQkJcGFuZTIuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCi0JCWN0cmxfYWRkID0gdG9vbGtpdC5jcmVhdGVCdXR0b24ocGFuZTIsIEF1dGhvcmluZ1VJVGV4dC5BRERfQlVUVE9OX1RFWFQsCi0JCQkJU1dULk5PTkUpOwotCQljdHJsX2FkZC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQotCQljdHJsX2RlbGV0ZSA9IHRvb2xraXQuY3JlYXRlQnV0dG9uKHBhbmUyLAotCQkJCUF1dGhvcmluZ1VJVGV4dC5ERUxFVEVfQlVUVE9OX1RFWFQsIFNXVC5OT05FKTsKLQkJY3RybF9kZWxldGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCWN0cmxfZGVsZXRlLnNldEVuYWJsZWQoZmFsc2UpOwotCi0JCWN0cmxfdXAgPSB0b29sa2l0LmNyZWF0ZUJ1dHRvbihwYW5lMiwgQXV0aG9yaW5nVUlUZXh0LlVQX0JVVFRPTl9URVhULAotCQkJCVNXVC5OT05FKTsKLQkJY3RybF91cC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJY3RybF91cC5zZXRFbmFibGVkKGZhbHNlKTsKLQotCQljdHJsX2Rvd24gPSB0b29sa2l0LmNyZWF0ZUJ1dHRvbihwYW5lMiwKLQkJCQlBdXRob3JpbmdVSVRleHQuRE9XTl9CVVRUT05fVEVYVCwgU1dULk5PTkUpOwotCQljdHJsX2Rvd24uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCWN0cmxfZG93bi5zZXRFbmFibGVkKGZhbHNlKTsKLQotCQljdHJsX29yZGVyID0gdG9vbGtpdC5jcmVhdGVCdXR0b24ocGFuZTIsCi0JCQkJQXV0aG9yaW5nVUlUZXh0Lk9SREVSX0JVVFRPTl9URVhULCBTV1QuTk9ORSk7Ci0JCWN0cmxfb3JkZXIuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLQkJLy8gbmFtZQotCQlMYWJlbCBuYW1lTGFiZWwgPSB0b29sa2l0LmNyZWF0ZUxhYmVsKGdlbmVyYWxDb21wb3NpdGUsCi0JCQkJQXV0aG9yaW5nVUlUZXh0Lk5BTUVfVEVYVCk7Ci0JCXsKLQkJCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkJFR0lOTklORyk7Ci0JCQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDQ7Ci0JCQluYW1lTGFiZWwuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCX0KLQkJY3RybF9uYW1lID0gdG9vbGtpdC5jcmVhdGVUZXh0KGdlbmVyYWxDb21wb3NpdGUsICIiLCBTV1QuU0lOR0xFKTsgLy8kTk9OLU5MUy0xJAotCQl7Ci0JCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQkJZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSA0OwotCQkJY3RybF9uYW1lLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQl9Ci0KLQkJY3JlYXRlQmxhbmtMYWJlbCh0b29sa2l0LCBnZW5lcmFsQ29tcG9zaXRlLCA0KTsKLQkJCi0JCWN0cmxfbWFpbmRlc2MgPSBjcmVhdGVSaWNoVGV4dEVkaXRXaXRoTGluaygKLQkJCQl0b29sa2l0LCBnZW5lcmFsQ29tcG9zaXRlLCBBdXRob3JpbmdVSVRleHQuREVTQ1JJUFRJT05fVEVYVCwKLQkJCQkyNTAsIDMwMCwgNCk7Ci0KLQkJY3JlYXRlUmljaFRleHRFZGl0b3JTZWN0aW9uKCk7Ci0KLQkJdG9vbGtpdC5wYWludEJvcmRlcnNGb3IocGFuZTEpOwotCQl0b29sa2l0LnBhaW50Qm9yZGVyc0ZvcihwYW5lMik7Ci0JCXRvb2xraXQucGFpbnRCb3JkZXJzRm9yKGdlbmVyYWxDb21wb3NpdGUpOwotCQl0b29sa2l0LnBhaW50Qm9yZGVyc0ZvcihleHBhbmRlZENvbXBvc2l0ZSk7Ci0KLQkJYWN0aW9uTWdyID0gKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkuZ2V0QWN0aW9uTWFuYWdlcigpOwotCi0JCWFkZExpc3RlbmVycygpOwotCQlsb2FkRGF0YSgpOwotCQllbmFibGVDb250cm9scygpOwotCX0KLQotCS8qKgotCSAqIEFkZCBsaWJyYXJ5IGFuZCBzZWxlY3Rpb24gbGlzdGVuZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcnMoKSB7Ci0JCWZpbmFsIE1ldGhvZEVsZW1lbnRFZGl0b3IgZWRpdG9yID0gKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpOwotCQljb250ZW50TW9kaWZ5TGlzdGVuZXIgPSBlZGl0b3IuY3JlYXRlTW9kaWZ5TGlzdGVuZXIoY3VycmVudEl0ZW0pOwotCQljdHJsX25hbWUuYWRkTW9kaWZ5TGlzdGVuZXIoY29udGVudE1vZGlmeUxpc3RlbmVyKTsKLQkJKChNZXRob2RFbGVtZW50RWRpdG9yLk1vZGlmeUxpc3RlbmVyKSBjb250ZW50TW9kaWZ5TGlzdGVuZXIpCi0JCQkJLnNldERpc2FibGUodHJ1ZSk7Ci0KLQkJZm9ybS5hZGRMaXN0ZW5lcihTV1QuQWN0aXZhdGUsIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLS8vCQkJCUlTdGF0dXMgc3RhdHVzID0gVG5nVXRpbC5jaGVja0VkaXQoKEVPYmplY3QpIGNoZWNrbGlzdCwKLS8vCQkJCQkJZ2V0U2l0ZSgpLmdldFNoZWxsKCkpOwotLy8JCQkJaWYgKHN0YXR1cy5pc09LKCkpIHsKLS8vCQkJCQlsb2FkRGF0YSgpOwotLy8JCQkJfQotCQkJCWlmIChmb3JtICE9IG51bGwgJiYgIWZvcm0uaXNEaXNwb3NlZCgpKSB7Ci0JCQkJCVVJSGVscGVyLnNldEZvcm1UZXh0KGZvcm0sIGNvbnRlbnRFbGVtZW50KTsKLQkJCQl9Ci0JCQkJbG9hZERhdGEoKTsKLQkJCQlpZiAoVG5nVXRpbC5pc0xvY2tlZChjb250ZW50RWxlbWVudCkpIHsKLQkJCQkJZW5hYmxlQ29udHJvbHMoZmFsc2UpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWN0cmxfYWRkLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJCWNoZWNrU2VsZWN0aW9uKCk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQotCQlmb3JtLmFkZExpc3RlbmVyKFNXVC5EZWFjdGl2YXRlLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJZGVhY3RpdmF0ZSgpOwotCQkJfQotCQl9KTsKLQotCQlmb3JtLmFkZENvbnRyb2xMaXN0ZW5lcihuZXcgQ29udHJvbExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgY29udHJvbFJlc2l6ZWQoQ29udHJvbEV2ZW50IGUpIHsKLQkJCQlpZiAoY3RybF9leHBhbmRlZCAhPSBudWxsKSB7Ci0JCQkJCSgoR3JpZERhdGEpIGN0cmxfZXhwYW5kZWQuZ2V0TGF5b3V0RGF0YSgpKS5oZWlnaHRIaW50ID0gZ2V0UmljaFRleHRFZGl0b3JIZWlnaHQoKTsKLQkJCQkJKChHcmlkRGF0YSkgY3RybF9leHBhbmRlZC5nZXRMYXlvdXREYXRhKCkpLndpZHRoSGludCA9IGdldFJpY2hUZXh0RWRpdG9yV2lkdGgoKTsKLQkJCQl9Ci0JCQkJZm9ybVNlY3Rpb24ubGF5b3V0KHRydWUsIHRydWUpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBjb250cm9sTW92ZWQoQ29udHJvbEV2ZW50IGUpIHsKLQkJCX0KLQkJfSk7Ci0KLQkJY3RybF9uYW1lLmFkZE1vZGlmeUxpc3RlbmVyKGNvbnRlbnRNb2RpZnlMaXN0ZW5lcik7Ci0JCWN0cmxfbmFtZS5hZGRGb2N1c0xpc3RlbmVyKG5ldyBGb2N1c0FkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBmb2N1c0xvc3QoRm9jdXNFdmVudCBlKSB7Ci0JCQkJaWYgKGN1cnJlbnRJdGVtICE9IG51bGwpIHsKLQkJCQkJU3RyaW5nIG9sZE5hbWUgPSBjdXJyZW50SXRlbS5nZXROYW1lKCk7Ci0JCQkJCVN0cmluZyBuZXdOYW1lID0gY3RybF9uYW1lLmdldFRleHQoKTsKLQkJCQkJLy9uZXdOYW1lID0gU3RyVXRpbC5tYWtlVmFsaWRGaWxlTmFtZShuZXdOYW1lKTsKLQkJCQkJaWYgKGN0cmxfbmFtZS5nZXRUZXh0KCkgPT0gbnVsbAotCQkJCQkJCXx8IGN0cmxfbmFtZS5nZXRUZXh0KCkubGVuZ3RoKCkgPT0gMCkgewotCQkJCQkJU3RyaW5nIHRpdGxlID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuYmluZChBdXRob3JpbmdVSVJlc291cmNlcy5yZW5hbWVEaWFsb2dfdGl0bGUsIExpYnJhcnlVSVRleHQuVEVYVF9DSEVDS19JVEVNKTsgCi0JCQkJCQlTdHJpbmcgbXNnID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuYmluZChBdXRob3JpbmdVSVJlc291cmNlcy5lbXB0eUVsZW1lbnROYW1lRXJyb3JfbXNnLCBTdHJVdGlsLnRvTG93ZXIoTGlicmFyeVVJVGV4dC5URVhUX0NIRUNLX0lURU0pKTsgCi0JCQkJCQlpZiAob2xkTmFtZSAhPSBudWxsICYmIG9sZE5hbWUubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpCi0JCQkJCQkJCQkuZGlzcGxheUVycm9yKHRpdGxlLCBtc2cpOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlnZXRFZGl0b3JTaXRlKCkKLQkJCQkJCQkJCS5nZXRBY3Rpb25CYXJzKCkKLQkJCQkJCQkJCS5nZXRTdGF0dXNMaW5lTWFuYWdlcigpCi0JCQkJCQkJCQkuc2V0RXJyb3JNZXNzYWdlKAotCQkJCQkJCQkJCQlQbGF0Zm9ybVVJCi0JCQkJCQkJCQkJCQkJLmdldFdvcmtiZW5jaCgpCi0JCQkJCQkJCQkJCQkJLmdldFNoYXJlZEltYWdlcygpCi0JCQkJCQkJCQkJCQkJLmdldEltYWdlKAotCQkJCQkJCQkJCQkJCQkJSVNoYXJlZEltYWdlcy5JTUdfT0JKU19FUlJPUl9UU0spLAotCQkJCQkJCQkJCQltc2cpOwotCQkJCQkJfQotCQkJCQl9IGVsc2UgaWYgKCFvbGROYW1lLmVxdWFscyhuZXdOYW1lKSkgewotCQkJCQkJZWRpdG9yLmdldEFjdGlvbk1hbmFnZXIoKS5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5TRVQsCi0JCQkJCQkJCWN1cnJlbnRJdGVtLAotCQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXROYW1lZEVsZW1lbnRfTmFtZSgpLAotCQkJCQkJCQluZXdOYW1lLCAtMSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JCWN0cmxfbWFpbmRlc2MuYWRkTW9kaWZ5TGlzdGVuZXIoY29udGVudE1vZGlmeUxpc3RlbmVyKTsKLQkJY3RybF9tYWluZGVzYy5hZGRMaXN0ZW5lcihTV1QuRGVhY3RpdmF0ZSwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCXNhdmVNYWluRGVzY3JpcHRpb24oKTsKLQkJCX0KLQkJfSk7Ci0KLQkJY2hlY2tJdGVtc1RhYmxlVmlld2VyCi0JCQkJLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQkJCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQkJCWNoZWNrU2VsZWN0aW9uKCk7Ci0JCQkJCX0KLQkJCQl9KTsKLQotCQljdHJsX2FkZC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlvcmcuZWNsaXBzZS5lcGYudW1hLlNlY3Rpb24gY2hpbGQgPSBVbWFGYWN0b3J5LmVJTlNUQU5DRQotCQkJCQkJLmNyZWF0ZVNlY3Rpb24oKTsKLQkJCQlTdHJpbmcgbmV3TmFtZSA9IE1lc3NhZ2VGb3JtYXQuZm9ybWF0KAotCQkJCQkJQXV0aG9yaW5nVUlUZXh0Lk5FV19FTEVNRU5UX1RFWFQsCi0JCQkJCQluZXcgU3RyaW5nW10geyBMaWJyYXJ5VUlUZXh0LlRFWFRfQ0hFQ0tfSVRFTSB9KTsKLQkJCQljaGlsZC5zZXROYW1lKG5ld05hbWUpOwotCQkJCUFkZFRvU2VjdGlvbkxpc3RDb21tYW5kIGNtZCA9IG5ldyBBZGRUb1NlY3Rpb25MaXN0Q29tbWFuZCgKLQkJCQkJCWNoZWNrbGlzdCwgY2hpbGQsIGFsbGNoZWNrSXRlbXMpOwotCQkJCWdldEFjdGlvbk1hbmFnZXIoKS5leGVjdXRlKGNtZCk7Ci0JCQkJY2hlY2tJdGVtc1RhYmxlVmlld2VyLnJlZnJlc2goKTsKLQkJCQljaGVja0l0ZW1zVGFibGVWaWV3ZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKAotCQkJCQkJY2hpbGQpKTsKLQkJCQljdHJsX25hbWUuc2V0Rm9jdXMoKTsKLQkJCQljdHJsX25hbWUuc2V0U2VsZWN0aW9uKDAsIG5ld05hbWUubGVuZ3RoKCkpOwotCQkJCWdldEVkaXRvclNpdGUoKS5nZXRBY3Rpb25CYXJzKCkuZ2V0U3RhdHVzTGluZU1hbmFnZXIoKQotCQkJCQkJLnNldEVycm9yTWVzc2FnZSgiIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfSk7Ci0KLQkJY3RybF9kZWxldGUuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJZ2V0RWRpdG9yU2l0ZSgpLmdldEFjdGlvbkJhcnMoKS5nZXRTdGF0dXNMaW5lTWFuYWdlcigpCi0JCQkJCQkuc2V0RXJyb3JNZXNzYWdlKCIiKTsgLy8kTk9OLU5MUy0xJAotCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgY2hlY2tJdGVtc1RhYmxlVmlld2VyCi0JCQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gc2VsZWN0aW9uLnRvTGlzdCgpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCU9iamVjdCBvID0gaXRlci5uZXh0KCk7Ci0JCQkJCWlmIChvIGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UuZXBmLnVtYS5TZWN0aW9uKSB7Ci0JCQkJCQlSZW1vdmVGcm9tU2VjdGlvbkxpc3QgY21kID0gbmV3IFJlbW92ZUZyb21TZWN0aW9uTGlzdCgKLQkJCQkJCQkJY2hlY2tsaXN0LCAob3JnLmVjbGlwc2UuZXBmLnVtYS5TZWN0aW9uKSBvLAotCQkJCQkJCQlhbGxjaGVja0l0ZW1zKTsKLQkJCQkJCWdldEFjdGlvbk1hbmFnZXIoKS5leGVjdXRlKGNtZCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJY2hlY2tJdGVtc1RhYmxlVmlld2VyLnJlZnJlc2goKTsKLQkJCQllZGl0SXRlbShudWxsKTsKLQkJCX0KLQkJfSk7Ci0KLQkJY3RybF91cC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGNoZWNrSXRlbXNUYWJsZVZpZXdlcgotCQkJCQkJLmdldFNlbGVjdGlvbigpOwotCi0JCQkJQXJyYXlMaXN0IG1vdmVVcEl0ZW1zID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCW1vdmVVcEl0ZW1zLmFkZEFsbChzZWxlY3Rpb24udG9MaXN0KCkpOwotCQkJCU1vdmVJblNlY3Rpb25MaXN0Q29tbWFuZCBjbWQgPSBuZXcgTW92ZUluU2VjdGlvbkxpc3RDb21tYW5kKAotCQkJCQkJY2hlY2tsaXN0LCBtb3ZlVXBJdGVtcywgYWxsY2hlY2tJdGVtcywgMSk7Ci0JCQkJZ2V0QWN0aW9uTWFuYWdlcigpLmV4ZWN1dGUoY21kKTsKLQotCQkJCWNoZWNrSXRlbXNUYWJsZVZpZXdlci5yZWZyZXNoKCk7Ci0KLQkJCQlpZiAoY2hlY2tJdGVtc1RhYmxlVmlld2VyLmdldFRhYmxlKCkuZ2V0U2VsZWN0aW9uSW5kZXgoKSA+IDAKLQkJCQkJCSYmICFUbmdVdGlsLmlzTG9ja2VkKGNoZWNrbGlzdCkpIHsKLQkJCQkJY3RybF91cC5zZXRFbmFibGVkKHRydWUpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWN0cmxfdXAuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJfQotCQkJCWlmIChjaGVja0l0ZW1zVGFibGVWaWV3ZXIuZ2V0VGFibGUoKS5nZXRTZWxlY3Rpb25JbmRleCgpIDwgY2hlY2tJdGVtc1RhYmxlVmlld2VyCi0JCQkJCQkuZ2V0VGFibGUoKS5nZXRJdGVtQ291bnQoKSAtIDEKLQkJCQkJCSYmICFUbmdVdGlsLmlzTG9ja2VkKGNoZWNrbGlzdCkpIHsKLQkJCQkJY3RybF9kb3duLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJY3RybF9kb3duLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJY3RybF9kb3duLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgY2hlY2tJdGVtc1RhYmxlVmlld2VyCi0JCQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJQXJyYXlMaXN0IG1vdmVEb3duSXRlbXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJbW92ZURvd25JdGVtcy5hZGRBbGwoc2VsZWN0aW9uLnRvTGlzdCgpKTsKLQkJCQlNb3ZlSW5TZWN0aW9uTGlzdENvbW1hbmQgY21kID0gbmV3IE1vdmVJblNlY3Rpb25MaXN0Q29tbWFuZCgKLQkJCQkJCWNoZWNrbGlzdCwgbW92ZURvd25JdGVtcywgYWxsY2hlY2tJdGVtcywgMCk7Ci0JCQkJZ2V0QWN0aW9uTWFuYWdlcigpLmV4ZWN1dGUoY21kKTsKLQotCQkJCWNoZWNrSXRlbXNUYWJsZVZpZXdlci5yZWZyZXNoKCk7Ci0KLQkJCQlpZiAoY2hlY2tJdGVtc1RhYmxlVmlld2VyLmdldFRhYmxlKCkuZ2V0U2VsZWN0aW9uSW5kZXgoKSA+IDAKLQkJCQkJCSYmICFUbmdVdGlsLmlzTG9ja2VkKGNoZWNrbGlzdCkpIHsKLQkJCQkJY3RybF91cC5zZXRFbmFibGVkKHRydWUpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWN0cmxfdXAuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJfQotCQkJCWlmIChjaGVja0l0ZW1zVGFibGVWaWV3ZXIuZ2V0VGFibGUoKS5nZXRTZWxlY3Rpb25JbmRleCgpIDwgY2hlY2tJdGVtc1RhYmxlVmlld2VyCi0JCQkJCQkuZ2V0VGFibGUoKS5nZXRJdGVtQ291bnQoKSAtIDEKLQkJCQkJCSYmICFUbmdVdGlsLmlzTG9ja2VkKGNoZWNrbGlzdCkpIHsKLQkJCQkJY3RybF9kb3duLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJY3RybF9kb3duLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJY3RybF9vcmRlci5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlTZWN0aW9uc09yZGVyRGlhbG9nIGRsZyA9IG5ldyBTZWN0aW9uc09yZGVyRGlhbG9nKAotCQkJCQkJRGlzcGxheS5nZXRDdXJyZW50KCkuZ2V0QWN0aXZlU2hlbGwoKSwKLQkJCQkJCWNoZWNrbGlzdCwKLQkJCQkJCWdldEFjdGlvbk1hbmFnZXIoKSwKLQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLkNoZWNrbGlzdE9yZGVyX3RpdGxlLCAKLQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLkNoZWNrbGlzdE9yZGVyX2Rlc2NyaXB0aW9uLCAKLQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLkNoZWNrbGlzdE9yZGVyX2NoZWNrbGlzdGl0ZW1zX3RleHQpOyAKLQkJCQlkbGcub3BlbigpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBlbmFibGVDb250cm9scyhib29sZWFuIGVkaXRhYmxlKSB7Ci0JCWN0cmxfbmFtZS5zZXRFZGl0YWJsZShlZGl0YWJsZSk7Ci0JCWN0cmxfbWFpbmRlc2Muc2V0RWRpdGFibGUoZWRpdGFibGUpOwotCQljdHJsX2FkZC5zZXRFbmFibGVkKGVkaXRhYmxlKTsKLQkJY3RybF9kZWxldGUuc2V0RW5hYmxlZChlZGl0YWJsZSk7Ci0JCWN0cmxfdXAuc2V0RW5hYmxlZChlZGl0YWJsZSk7Ci0JCWN0cmxfZG93bi5zZXRFbmFibGVkKGVkaXRhYmxlKTsKLQkJY3RybF9vcmRlci5zZXRFbmFibGVkKHRydWUpOwotCQlpZiAoY3RybF9leHBhbmRlZCAhPSBudWxsKSB7Ci0JCQljdHJsX2V4cGFuZGVkLnNldEVkaXRhYmxlKGVkaXRhYmxlKTsKLQkJfQotCX0KLQotCi0JcHJvdGVjdGVkIHZvaWQgZGVhY3RpdmF0ZSgpIHsKLQkJLy8gU2F2ZSB0aGUgSXRlbSBvcmRlci4KLQkJaWYgKGFsbGNoZWNrSXRlbXMgIT0gbnVsbCkgewotCQkJYWxsY2hlY2tJdGVtcy5hcHBseSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZXMgdGhlIGNvbnRyb2xzIHdpdGggZGF0YSBmcm9tIHRoZSBtb2RlbC4KLQkgKi8KLQlwcml2YXRlIHZvaWQgbG9hZERhdGEoKSB7Ci0JCWFsbGNoZWNrSXRlbXMgPSBudWxsOwotCQljaGVja0l0ZW1zVGFibGVWaWV3ZXIuc2V0SW5wdXQoY2hlY2tsaXN0KTsKLQkJY2hlY2tJdGVtc1RhYmxlVmlld2VyLnJlZnJlc2goKTsKLQkJZWRpdEl0ZW0oY3VycmVudEl0ZW0pOwotCX0KLQotCS8qKgotCSAqIEVkaXQgY3VycmVudCBJdGVtLgotCSAqLwotCXByaXZhdGUgdm9pZCBlZGl0SXRlbShvcmcuZWNsaXBzZS5lcGYudW1hLlNlY3Rpb24gaXRlbSkgewotCQkoKE1ldGhvZEVsZW1lbnRFZGl0b3IuTW9kaWZ5TGlzdGVuZXIpIGNvbnRlbnRNb2RpZnlMaXN0ZW5lcikKLQkJCQkuc2V0RGlzYWJsZSh0cnVlKTsKLQotCQlpZiAoY3RybF9tYWluZGVzYy5nZXRNb2RpZmllZCgpKSB7Ci0JCQlzYXZlTWFpbkRlc2NyaXB0aW9uKCk7Ci0JCX0KLQotCQljdXJyZW50SXRlbSA9IGl0ZW07Ci0JCVN0cmluZyBuYW1lID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIGRlc2MgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQlpZiAoY3VycmVudEl0ZW0gIT0gbnVsbCkgewotCQkJbmFtZSA9IGN1cnJlbnRJdGVtLmdldE5hbWUoKTsKLQkJCWRlc2MgPSBjdXJyZW50SXRlbS5nZXRTZWN0aW9uRGVzY3JpcHRpb24oKTsKLQkJCWN0cmxfbmFtZS5zZXRGb2N1cygpOwotCQkJZ2V0RWRpdG9yU2l0ZSgpLmdldEFjdGlvbkJhcnMoKS5nZXRTdGF0dXNMaW5lTWFuYWdlcigpCi0JCQkJCS5zZXRFcnJvck1lc3NhZ2UoIiIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJY3RybF9uYW1lLnNldFRleHQobmFtZSA9PSBudWxsID8gIiIgOiBuYW1lKTsgLy8kTk9OLU5MUy0xJAotCQljdHJsX21haW5kZXNjLnNldFRleHQoZGVzYyA9PSBudWxsID8gIiIgOiBkZXNjKTsgLy8kTk9OLU5MUy0xJAotCQljdHJsX21haW5kZXNjLnNldE1vZGFsT2JqZWN0KGN1cnJlbnRJdGVtKTsKLQkJY3RybF9tYWluZGVzYy5zZXRNb2RhbE9iamVjdEZlYXR1cmUoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0U2VjdGlvbl9TZWN0aW9uRGVzY3JpcHRpb24oKSk7Ci0JCWlmIChpdGVtID09IG51bGwpIHsKLQkJCS8vIGNsb3NlIGFueSBGaW5kL1JlcGxhY2UgZGlhbG9nIG9wZW4gaW4gdGhlIFJURQotCQkJY3RybF9tYWluZGVzYy5nZXRGaW5kUmVwbGFjZUFjdGlvbigpLmRpc3Bvc2UoKTsKLQkJfQotCi0JCSgoTWV0aG9kRWxlbWVudEVkaXRvci5Nb2RpZnlMaXN0ZW5lcikgY29udGVudE1vZGlmeUxpc3RlbmVyKQotCQkJCS5zZXRFbGVtZW50KGN1cnJlbnRJdGVtKTsKLQkJKChNZXRob2RFbGVtZW50RWRpdG9yLk1vZGlmeUxpc3RlbmVyKSBjb250ZW50TW9kaWZ5TGlzdGVuZXIpCi0JCQkJLnNldERpc2FibGUoY3VycmVudEl0ZW0gPT0gbnVsbCk7Ci0KLQkJZW5hYmxlQ29udHJvbHMoKTsKLQl9Ci0KLQkvKioKLQkgKiBFbmFibGUgbmFtZSBhbmQgZGVzY3JpcHRpb24gY29udHJvbHMKLQkgKi8KLQlwcml2YXRlIHZvaWQgZW5hYmxlQ29udHJvbHMoKSB7Ci0JCWlmIChjaGVja2xpc3QuZ2V0UHJlc2VudGF0aW9uKCkuZ2V0U2VjdGlvbnMoKS5jb250YWlucyhjdXJyZW50SXRlbSkpIHsKLQkJCWlmICghVG5nVXRpbC5pc0xvY2tlZChjb250ZW50RWxlbWVudCkpIHsKLQkJCQljdHJsX25hbWUuc2V0RWRpdGFibGUodHJ1ZSk7Ci0JCQkJY3RybF9tYWluZGVzYy5zZXRFZGl0YWJsZSh0cnVlKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWN0cmxfbmFtZS5zZXRFZGl0YWJsZShmYWxzZSk7Ci0JCQljdHJsX21haW5kZXNjLnNldEVkaXRhYmxlKGZhbHNlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIERpc3Bvc2UgbGlzdGVuZXIKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLmZvcm1zLmVkaXRvci5Gb3JtUGFnZSNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlpZiAobGliTGlzdGVuZXIgIT0gbnVsbCkgewotCQkJSUxpYnJhcnlNYW5hZ2VyIG1hbmFnZXIgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRMaWJyYXJ5TWFuYWdlcigpOwotCQkJaWYgKG1hbmFnZXIgIT0gbnVsbCkgewotCQkJCW1hbmFnZXIucmVtb3ZlTGlzdGVuZXIobGliTGlzdGVuZXIpOwotCQkJfQotCQkJbGliTGlzdGVuZXIgPSBudWxsOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVJpY2hUZXh0RWRpdG9yU2VjdGlvbigpIHsKLQkJZXhwYW5kZWRDb21wb3NpdGUgPSB0b29sa2l0LmNyZWF0ZUNvbXBvc2l0ZShmb3JtU2VjdGlvbiwgU1dULk5PTkUpOwotCQlleHBhbmRlZENvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBUYWJsZVdyYXBEYXRhKFRhYmxlV3JhcERhdGEuRklMTF9HUkFCKSk7Ci0JCWV4cGFuZGVkQ29tcG9zaXRlLnNldExheW91dChuZXcgR3JpZExheW91dCgyLCBmYWxzZSkpOwotCQlleHBhbmRlZENvbXBvc2l0ZS5zZXRWaXNpYmxlKGZhbHNlKTsKLQotCQkvLyBIeXBlcmxpbmsgZGVzYwotCQlleHBhbmRMaW5rID0gdG9vbGtpdC5jcmVhdGVJbWFnZUh5cGVybGluayhleHBhbmRlZENvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlleHBhbmRMaW5rLnNldEltYWdlKEF1dGhvcmluZ1VJSW1hZ2VzLklNR19FWFBBTkRFRCk7Ci0JCWV4cGFuZExpbmsuc2V0VG9vbFRpcFRleHQoQXV0aG9yaW5nVUlSZXNvdXJjZXMuY2xvc2VSVEUpOyAKLQkJZXhwYW5kTGluay5zZXRVbmRlcmxpbmVkKGZhbHNlKTsKLQkJZXhwYW5kTGluay5hZGRIeXBlcmxpbmtMaXN0ZW5lcihuZXcgSHlwZXJsaW5rQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGxpbmtBY3RpdmF0ZWQoSHlwZXJsaW5rRXZlbnQgZSkgewotCQkJCXRvZ2dsZShlKTsKLQkJCX0KLQkJfSk7Ci0KLQkJZXhwYW5kTGFiZWwgPSBjcmVhdGVEZWNvcmF0ZWRMYWJlbCh0b29sa2l0LCBleHBhbmRlZENvbXBvc2l0ZSwgIiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVG9nZ2xlIERlc2NyaXB0aW9uIGNvbnRyb2wgdG8gZXhwYW5kIGFuZCBjb250cm9sIHN0YXRlCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkJhc2VGb3JtUGFnZSN0b2dnbGUob3JnLmVjbGlwc2UudWkuZm9ybXMuZXZlbnRzLkh5cGVybGlua0V2ZW50KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHRvZ2dsZShIeXBlcmxpbmtFdmVudCBlKSB7Ci0JCWlmIChjdXJyZW50SXRlbSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpZiAoY3RybF9leHBhbmRlZCA9PSBudWxsKSB7Ci0JCQljdHJsX2V4cGFuZGVkID0gY3JlYXRlUmljaFRleHRFZGl0b3IodG9vbGtpdCwgZXhwYW5kZWRDb21wb3NpdGUsCi0JCQkJCVNXVC5NVUxUSSB8IFNXVC5XUkFQIHwgU1dULlZfU0NST0xMLCBHcmlkRGF0YS5GSUxMX0JPVEgsCi0JCQkJCWdldFJpY2hUZXh0RWRpdG9ySGVpZ2h0KCksIGdldFJpY2hUZXh0RWRpdG9yV2lkdGgoKSwgMiwgZXhwYW5kTGFiZWwpOwotCQkJY3RybF9leHBhbmRlZC5hZGRNb2RpZnlMaXN0ZW5lcihjb250ZW50TW9kaWZ5TGlzdGVuZXIpOwotCQl9Ci0KLQkJaWYgKGRlc2NFeHBhbmRGbGFnKSB7Ci0JCQlzZWN0aW9uQ29tcG9zaXRlLnNldFZpc2libGUodHJ1ZSk7Ci0JCQlleHBhbmRlZENvbXBvc2l0ZS5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJCWZvcm1TZWN0aW9uLnNldENsaWVudChzZWN0aW9uQ29tcG9zaXRlKTsKLQkJCUlNZXRob2RSaWNoVGV4dCByaWNoVGV4dCA9IGdldEFjdGl2ZVJpY2hUZXh0Q29udHJvbCgpOwotCQkJcmljaFRleHQuc2V0VGV4dChjdHJsX2V4cGFuZGVkLmdldFRleHQoKSk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGkgPSByaWNoVGV4dC5nZXRMaXN0ZW5lcnMoKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQkJUmljaFRleHRMaXN0ZW5lciBsaXN0ZW5lciA9IChSaWNoVGV4dExpc3RlbmVyKSBpLm5leHQoKTsKLQkJCQljdHJsX2V4cGFuZGVkLnJlbW92ZUxpc3RlbmVyKGxpc3RlbmVyLmdldEV2ZW50VHlwZSgpLCBsaXN0ZW5lcgotCQkJCQkJLmdldExpc3RlbmVyKCkpOwotCQkJfQotCQkJaWYgKGN0cmxfZXhwYW5kZWQuZ2V0TW9kaWZpZWQoKSkgewotCQkJCSgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpCi0JCQkJCQkuc2F2ZU1vZGlmaWVkUmljaFRleHQoY3RybF9leHBhbmRlZCk7Ci0JCQl9Ci0JCQlyaWNoVGV4dC5zZXRGb2N1cygpOwotCQl9IGVsc2UgewotCQkJc2VjdGlvbkNvbXBvc2l0ZS5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJCWV4cGFuZGVkQ29tcG9zaXRlLnNldFZpc2libGUodHJ1ZSk7Ci0JCQlmb3JtU2VjdGlvbi5zZXRDbGllbnQoZXhwYW5kZWRDb21wb3NpdGUpOwotCQkJZXhwYW5kTGFiZWwuc2V0VGV4dChjdXJyZW50SXRlbS5nZXROYW1lKCkgKwotCQkJCQkiIC0gIiArIChTdHJpbmcpICgoSW1hZ2VIeXBlcmxpbmspIGUuZ2V0U291cmNlKCkpLmdldERhdGEoIlRpdGxlIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCUlNZXRob2RSaWNoVGV4dCByaWNoVGV4dCA9IChJTWV0aG9kUmljaFRleHQpIGUuZ2V0SHJlZigpOwotCQkJY3RybF9leHBhbmRlZC5zZXRJbml0aWFsVGV4dChyaWNoVGV4dC5nZXRUZXh0KCkpOwotCQkJY3RybF9leHBhbmRlZC5zZXRNb2RhbE9iamVjdChyaWNoVGV4dC5nZXRNb2RhbE9iamVjdCgpKTsKLQkJCWN0cmxfZXhwYW5kZWQuc2V0TW9kYWxPYmplY3RGZWF0dXJlKHJpY2hUZXh0Ci0JCQkJCS5nZXRNb2RhbE9iamVjdEZlYXR1cmUoKSk7Ci0JCQljdHJsX2V4cGFuZGVkLnNldEZpbmRSZXBsYWNlQWN0aW9uKHJpY2hUZXh0LmdldEZpbmRSZXBsYWNlQWN0aW9uKCkpOwotCQkJZm9yIChJdGVyYXRvciBpID0gcmljaFRleHQuZ2V0TGlzdGVuZXJzKCk7IGkuaGFzTmV4dCgpOykgewotCQkJCVJpY2hUZXh0TGlzdGVuZXIgbGlzdGVuZXIgPSAoUmljaFRleHRMaXN0ZW5lcikgaS5uZXh0KCk7Ci0JCQkJY3RybF9leHBhbmRlZC5hZGRMaXN0ZW5lcihsaXN0ZW5lci5nZXRFdmVudFR5cGUoKSwgbGlzdGVuZXIKLQkJCQkJCS5nZXRMaXN0ZW5lcigpKTsKLQkJCX0KLQkJCWJvb2xlYW4gZWRpdGFibGUgPSAhVG5nVXRpbC5pc0xvY2tlZChjb250ZW50RWxlbWVudCk7Ci0JCQljdHJsX2V4cGFuZGVkLnNldEVkaXRhYmxlKGVkaXRhYmxlKTsKLQkJCWlmIChlZGl0YWJsZSkgewotCQkJCWN0cmxfZXhwYW5kZWQuc2V0Rm9jdXMoKTsKLQkJCX0KLQkJCXNldEFjdGl2ZVJpY2hUZXh0Q29udHJvbChyaWNoVGV4dCk7Ci0JCX0KLQotCQlmb3JtLmdldEJvZHkoKS5sYXlvdXQodHJ1ZSwgdHJ1ZSk7Ci0JCWRlc2NFeHBhbmRGbGFnID0gIWRlc2NFeHBhbmRGbGFnOwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRBY3RpdmVSaWNoVGV4dENvbnRyb2woSU1ldGhvZFJpY2hUZXh0IGVkaXRvcikgewotCQlhY3RpdmVDb250cm9sID0gZWRpdG9yOwotCX0KLQotCXByaXZhdGUgSU1ldGhvZFJpY2hUZXh0IGdldEFjdGl2ZVJpY2hUZXh0Q29udHJvbCgpIHsKLQkJcmV0dXJuIGFjdGl2ZUNvbnRyb2w7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGluaXRQcm92aWRlcnMoKSB7Ci0JCWNoZWNrSXRlbXNWaWV3ZXJDb250ZW50UHJvdmlkZXIgPSBuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoCi0JCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJCS5nZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSkgewotCQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBvYmplY3QpIHsKLQkJCQlpZiAob2JqZWN0ICE9IGNoZWNrbGlzdCkKLQkJCQkJcmV0dXJuIHN1cGVyLmdldEVsZW1lbnRzKG9iamVjdCk7Ci0JCQkJaWYgKGFsbGNoZWNrSXRlbXMgPT0gbnVsbCkgewotCQkJCQlhbGxjaGVja0l0ZW1zID0gbmV3IFNlY3Rpb25MaXN0KGNoZWNrbGlzdCwKLQkJCQkJCQlTZWN0aW9uTGlzdC5TVEVQU19GT1JfRUxFTUVOVF9PTkxZKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIGFsbGNoZWNrSXRlbXMudG9BcnJheSgpOwotCQkJfQotCQl9OwotCi0JCWNoZWNrSXRlbXNWaWV3ZXJMYWJlbFByb3ZpZGVyID0gbmV3IFZhcmlhYmlsaXR5RWxlbWVudExhYmVsUHJvdmlkZXIoCi0JCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJCS5nZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSkgewotCQkJcHVibGljIGJvb2xlYW4gaXNFeHRlcm5hbChPYmplY3QgZWxlbWVudCkgewotCQkJCXJldHVybiAhY2hlY2tsaXN0LmdldFByZXNlbnRhdGlvbigpLmdldFNlY3Rpb25zKCkuY29udGFpbnMoCi0JCQkJCQllbGVtZW50KTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2F2ZU1haW5EZXNjcmlwdGlvbigpIHsKLQkJaWYgKGN1cnJlbnRJdGVtICE9IG51bGwpIHsKLQkJCUlNZXRob2RSaWNoVGV4dCBjb250cm9sID0gZGVzY0V4cGFuZEZsYWcgPyBjdHJsX2V4cGFuZGVkCi0JCQkJCTogY3RybF9tYWluZGVzYzsKLQkJCWlmICghY29udHJvbC5nZXRNb2RpZmllZCgpKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJU3RyaW5nIG9sZENvbnRlbnQgPSBjdXJyZW50SXRlbS5nZXRTZWN0aW9uRGVzY3JpcHRpb24oKTsKLQkJCWlmICgoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpKS5tdXN0UmVzdG9yZVZhbHVlKGNvbnRyb2wsCi0JCQkJCW9sZENvbnRlbnQpKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJU3RyaW5nIG5ld0NvbnRlbnQgPSBjb250cm9sLmdldFRleHQoKTsKLQkJCWlmICghbmV3Q29udGVudC5lcXVhbHMob2xkQ29udGVudCkpIHsKLQkJCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuU0VULCBjdXJyZW50SXRlbSwKLQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFNlY3Rpb25fU2VjdGlvbkRlc2NyaXB0aW9uKCksCi0JCQkJCQluZXdDb250ZW50LCAtMSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgSUFjdGlvbk1hbmFnZXIgZ2V0QWN0aW9uTWFuYWdlcigpIHsKLQkJRm9ybUVkaXRvciBlZGl0b3IgPSBnZXRFZGl0b3IoKTsKLQkJaWYgKGVkaXRvciBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnRFZGl0b3IpIHsKLQkJCXJldHVybiAoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGVkaXRvcikuZ2V0QWN0aW9uTWFuYWdlcigpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgdm9pZCBjaGVja1NlbGVjdGlvbigpIHsKLQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBjaGVja0l0ZW1zVGFibGVWaWV3ZXIKLQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCWlmIChzZWxlY3Rpb24uc2l6ZSgpID4gMCAmJiAhVG5nVXRpbC5pc0xvY2tlZChjaGVja2xpc3QpKSB7Ci0JCQljdHJsX2RlbGV0ZS5zZXRFbmFibGVkKHRydWUpOwotCi0JCQlpZiAoY2hlY2tJdGVtc1RhYmxlVmlld2VyLmdldFRhYmxlKCkuZ2V0U2VsZWN0aW9uSW5kZXgoKSA+IDAKLQkJCQkJJiYgIVRuZ1V0aWwuaXNMb2NrZWQoY2hlY2tsaXN0KSAmJiBzZWxlY3Rpb24uc2l6ZSgpID09IDEpIHsKLQkJCQljdHJsX3VwLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQl9IGVsc2UgewotCQkJCWN0cmxfdXAuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQl9Ci0KLQkJCWlmIChjaGVja0l0ZW1zVGFibGVWaWV3ZXIuZ2V0VGFibGUoKS5nZXRTZWxlY3Rpb25JbmRleCgpIDwgY2hlY2tJdGVtc1RhYmxlVmlld2VyCi0JCQkJCS5nZXRUYWJsZSgpLmdldEl0ZW1Db3VudCgpIC0gMQotCQkJCQkmJiAhVG5nVXRpbC5pc0xvY2tlZChjaGVja2xpc3QpICYmIHNlbGVjdGlvbi5zaXplKCkgPT0gMSkgewotCQkJCWN0cmxfZG93bi5zZXRFbmFibGVkKHRydWUpOwotCQkJfSBlbHNlIHsKLQkJCQljdHJsX2Rvd24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQl9Ci0JCX0KLQkJaWYgKHNlbGVjdGlvbi5zaXplKCkgPT0gMSkgewotCQkJZWRpdEl0ZW0oKG9yZy5lY2xpcHNlLmVwZi51bWEuU2VjdGlvbikgc2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpKTsKLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL0NvbmZpZ1ZpZXdQYWdlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL0NvbmZpZ1ZpZXdQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4NWZkNmMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9Db25maWdWaWV3UGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJSGVscENvbnRleHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmRpYWxvZ3MuQ29uZmlndXJhdGlvbkFkZFZpZXdzRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZGlhbG9ncy5Db25maWd1cmF0aW9uT3JkZXJEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLkNvbmZpZ3VyYXRpb25FZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLkNvbmZpZ3VyYXRpb25FZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZpbHRlcnMuUHJvY2Vzc1ZpZXdGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm92aWRlcnMuQ29uZmlndXJhdGlvbkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS52aWV3cy5Db25maWd1cmF0aW9uVmlld0ZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnNlcnZpY2VhYmlsaXR5LkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSUFjdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5GaWx0ZXJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50Q2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ1RhYkZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNUYWJJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5Gb3JtQ29sb3JzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLklNYW5hZ2VkRm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuRm9ybUVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuRm9ybVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5Gb3JtVG9vbGtpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLlNjcm9sbGVkRm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLlNlY3Rpb247Ci0KLQotLyoqCi0gKiBQYWdlIGZvciBjdXN0b21pemluZyBwdWJsaXNoaW5nIHZpZXdzCi0gKiAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICogZml4IGZvciBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTczODI3Ci0gKiBmaXggZm9yIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNzQyNjAKLSAqLwotcHVibGljIGNsYXNzIENvbmZpZ1ZpZXdQYWdlIGV4dGVuZHMgRm9ybVBhZ2UgewotCi0JcHJpdmF0ZSBNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IG51bGw7Ci0KLQlwcml2YXRlIFN0cmluZyBmb3JtUHJlZml4ID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuY29uZmlnVmlld1BhZ2VfY29uZmlndXJhdGlvbjsgCi0KLQlwcml2YXRlIEZvcm1Ub29sa2l0IHRvb2xraXQ7Ci0KLQlwcml2YXRlIENUYWJGb2xkZXIgdGFiRm9sZGVyOwotCXByaXZhdGUgQ1RhYkl0ZW0gdGFiRGVmYXVsdHZpZXdJdGVtOwotCi0JcHJpdmF0ZSBCdXR0b24gcmVtb3ZlQnV0dG9uLCBtYWtlRGVmYXVsdEJ1dHRvbiwgb3JkZXJCdXR0b247Ci0KLQlwcml2YXRlIE9iamVjdCBzZWxlY3RlZEl0ZW0gPSBudWxsOwotCi0JcHJpdmF0ZSBJQWN0aW9uTWFuYWdlciBhY3Rpb25NZ3IgPSBudWxsOwotCi0JcHJpdmF0ZSBMb2dnZXIgbG9nZ2VyID0gbnVsbDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2UKLQkgKiBAcGFyYW0gZWRpdG9yCi0JICovCi0JcHVibGljIENvbmZpZ1ZpZXdQYWdlKEZvcm1FZGl0b3IgZWRpdG9yKSB7Ci0JCXN1cGVyKAotCQkJCWVkaXRvciwKLQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5jb25maWdWaWV3UGFnZV9jb25maWd1cmF0aW9uVmlld3MsIEF1dGhvcmluZ1VJUmVzb3VyY2VzLmNvbmZpZ1ZpZXdQYWdlX3ZpZXdzKTsgCi0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuRm9ybVBhZ2UjaW5pdChvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZSwgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0KQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSUVkaXRvclNpdGUgc2l0ZSwgSUVkaXRvcklucHV0IGlucHV0KSB7Ci0JCXNldFNpdGUoc2l0ZSk7Ci0JCXNldElucHV0KGlucHV0KTsKLQotCQlDb25maWd1cmF0aW9uRWRpdG9ySW5wdXQgY29uZmlnSW5wdXQgPSAoQ29uZmlndXJhdGlvbkVkaXRvcklucHV0KSBpbnB1dDsKLQkJY29uZmlnID0gY29uZmlnSW5wdXQuZ2V0Q29uZmlndXJhdGlvbigpOwotCi0JCWFjdGlvbk1nciA9ICgoQ29uZmlndXJhdGlvbkVkaXRvcikgZ2V0RWRpdG9yKCkpLmdldEFjdGlvbk1hbmFnZXIoKTsKLQotCQkvLyBnZXQgcGx1Z2luIGxvZ2dlcgotCQlsb2dnZXIgPSBBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuRm9ybVBhZ2UjY3JlYXRlRm9ybUNvbnRlbnQob3JnLmVjbGlwc2UudWkuZm9ybXMuSU1hbmFnZWRGb3JtKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUZvcm1Db250ZW50KElNYW5hZ2VkRm9ybSBtYW5hZ2VkRm9ybSkgewotCQlTY3JvbGxlZEZvcm0gZm9ybSA9IG1hbmFnZWRGb3JtLmdldEZvcm0oKTsKLQkJZm9ybS5zZXRUZXh0KGZvcm1QcmVmaXggKyBjb25maWcuZ2V0TmFtZSgpKTsKLQkJdG9vbGtpdCA9IG1hbmFnZWRGb3JtLmdldFRvb2xraXQoKTsKLQkJZm9ybS5nZXRCb2R5KCkuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCi0JCS8vIENyZWF0ZSB0aGUgdmlldyBzZWN0aW9uLgotCQlTZWN0aW9uIHZpZXdTZWN0aW9uID0gdG9vbGtpdC5jcmVhdGVTZWN0aW9uKGZvcm0uZ2V0Qm9keSgpLAotCQkJCVNlY3Rpb24uREVTQ1JJUFRJT04gfCBTZWN0aW9uLlRXSVNUSUUgfCBTZWN0aW9uLkVYUEFOREVECi0JCQkJCQl8IFNlY3Rpb24uVElUTEVfQkFSKTsKLQkJR3JpZERhdGEgdGQgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJdmlld1NlY3Rpb24uc2V0TGF5b3V0RGF0YSh0ZCk7Ci0JCXZpZXdTZWN0aW9uCi0JCQkJLnNldFRleHQoQXV0aG9yaW5nVUlSZXNvdXJjZXMuY29uZmlnVmlld1BhZ2VfY29uZmlndXJhdGlvblZpZXdTZWN0aW9uVGl0bGUpOyAKLQkJdmlld1NlY3Rpb24KLQkJCQkuc2V0RGVzY3JpcHRpb24oQXV0aG9yaW5nVUlSZXNvdXJjZXMuY29uZmlnVmlld1BhZ2VfY29uZmlndXJhdGlvblZpZXdTZWN0aW9uTWVzc2FnZSk7IAotCQl2aWV3U2VjdGlvbi5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0KLQkJQ29tcG9zaXRlIHBhcmVudCA9IHRvb2xraXQuY3JlYXRlQ29tcG9zaXRlKHZpZXdTZWN0aW9uKTsKLQkJcGFyZW50LnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCQlwYXJlbnQuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQl2aWV3U2VjdGlvbi5zZXRDbGllbnQocGFyZW50KTsKLQotCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHBhcmVudC5nZXRQYXJlbnQoKSwKLQkJCQlBdXRob3JpbmdVSUhlbHBDb250ZXh0cy5DT05GSUdVUkFUSU9OX0VESVRPUl9BTExfQ09OVEVYVCk7Ci0KLQkJLy8gY3JlYXRlIGJ1dHRvbiBwYW5lCi0JCWNyZWF0ZUJ1dHRvblBhbmUocGFyZW50KTsKLQotCQkvLyBjcmVhdGUgdGFiZm9sZGVyIHBhbmUKLQkJY3JlYXRlVGFiUGFuZShwYXJlbnQpOwotCi0JCXRvb2xraXQucGFpbnRCb3JkZXJzRm9yKHBhcmVudCk7Ci0JCWxvYWREYXRhKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqLwotCXByaXZhdGUgdm9pZCBjcmVhdGVUYWJQYW5lKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJdGFiRm9sZGVyID0gbmV3IENUYWJGb2xkZXIocGFyZW50LCBTV1QuRkxBVCB8IFNXVC5UT1AgfCBTV1QuQk9SREVSKTsKLQkJdGFiRm9sZGVyLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQkJdGFiRm9sZGVyLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCi0JCS8vIHNldCB0YWJmb2xkZXIgYmFja2dyb3VuZCBjb2xvcgotCQlDb2xvciBzZWxlY3RlZENvbG9yID0gdG9vbGtpdC5nZXRDb2xvcnMoKS5nZXRDb2xvcihGb3JtQ29sb3JzLlRCX0JHKTsKLQkJdGFiRm9sZGVyLnNldFNlbGVjdGlvbkJhY2tncm91bmQobmV3IENvbG9yW10geyBzZWxlY3RlZENvbG9yLCB0b29sa2l0LmdldENvbG9ycygpLmdldEJhY2tncm91bmQoKSB9LCBuZXcgaW50W10geyA1MCB9KTsKLQkJCi0JCXRvb2xraXQucGFpbnRCb3JkZXJzRm9yKHRhYkZvbGRlcik7Ci0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICovCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUJ1dHRvblBhbmUoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgYnV0dG9uUGFuZSA9IHRvb2xraXQuY3JlYXRlQ29tcG9zaXRlKHBhcmVudCk7Ci0JCWJ1dHRvblBhbmUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCWJ1dHRvblBhbmUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDQsIGZhbHNlKSk7Ci0KLQkJQnV0dG9uIGFkZEJ1dHRvbiA9IHRvb2xraXQKLQkJCQkuY3JlYXRlQnV0dG9uKAotCQkJCQkJYnV0dG9uUGFuZSwKLQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLmNvbmZpZ1ZpZXdQYWdlX2FkZFZpZXdCdXR0b25UZXh0LCBTV1QuTk9ORSk7IAotCQl7Ci0JCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5CRUdJTk5JTkcpOwotCQkJYWRkQnV0dG9uLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQl9Ci0JCWFkZEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkvLyBDb25maWdQcm9jZXNzVmlld0RpYWxvZyBmZCA9IG5ldwotCQkJCS8vIENvbmZpZ1Byb2Nlc3NWaWV3RGlhbG9nKFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0U2hlbGwoKSwKLQkJCQkvLyBjb25maWcpOwotCQkJCS8vIENvbmZpZ1Byb2Nlc3NWaWV3RGlhbG9nLnNldERlZmF1bHRJbWFnZShEaXNwbGF5LmdldEN1cnJlbnQoKS5nZXRBY3RpdmVTaGVsbCgpLmdldEltYWdlKCkpOwotCQkJCUlGaWx0ZXIgZmlsdGVyID0gbmV3IFByb2Nlc3NWaWV3RmlsdGVyKGNvbmZpZywgbnVsbCwKLQkJCQkJCUZpbHRlckNvbnN0YW50cy5BTExfRUxFTUVOVFMpOwotCQkJCUNvbmZpZ3VyYXRpb25BZGRWaWV3c0RpYWxvZyBmZCA9IG5ldyBDb25maWd1cmF0aW9uQWRkVmlld3NEaWFsb2coCi0JCQkJCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpCi0JCQkJCQkJCS5nZXRTaGVsbCgpKTsKLQkJCQlmZC5zZXRUeXBlcyhnZXRUeXBlcygpKTsKLQkJCQlmZAotCQkJCQkJLnNldFRpdGxlKEF1dGhvcmluZ1VJUmVzb3VyY2VzLkNvbmZpZ1Byb2Nlc3NWaWV3RGlhbG9nX1NlbGVjdENhdGVnb3JpZXMpOyAKLQkJCQlmZC5zZXRJbnB1dChjb25maWcpOwotCQkJCWZkLnNldEZpbHRlcihmaWx0ZXIpOwotCQkJCWZkLnNldEV4aXN0aW5nRWxlbWVudHMoY29uZmlnLmdldFByb2Nlc3NWaWV3cygpKTsKLQkJCQlmZC5zZXRDb250ZW50UHJvdmlkZXIobmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKAotCQkJCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJCQkJLmdldEl0ZW1zRmlsdGVyX0FkYXB0ZXJGYWN0b3J5KGZpbHRlcikpLAotCQkJCQkJCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRS5nZXRJdGVtc0ZpbHRlcl9Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpOwotCQkJCWZkLnNldEJsb2NrT25PcGVuKHRydWUpOwotCQkJCWZkLm9wZW4oKTsKLQkJCQlMaXN0IHZpZXdzID0gZmQuZ2V0U2VsZWN0ZWRJdGVtcygpOwotCi0JCQkJLy8gYWRkIHZpZXcgdG8gY29uZmlndXJhdGlvbgotCQkJCWZvciAoSXRlcmF0b3IgaXRvciA9IHZpZXdzLml0ZXJhdG9yKCk7IGl0b3IuaGFzTmV4dCgpOykgewotCQkJCQlPYmplY3Qgb2JqID0gaXRvci5uZXh0KCk7Ci0JCQkJCWlmIChvYmogaW5zdGFuY2VvZiBDb250ZW50Q2F0ZWdvcnkpIHsKLQotCQkJCQkJaWYgKGNvbmZpZy5nZXRQcm9jZXNzVmlld3MoKS5jb250YWlucygKLQkJCQkJCQkJKENvbnRlbnRDYXRlZ29yeSkgb2JqKSkgewotCQkJCQkJCVN0cmluZyBuYW1lID0gKChDb250ZW50Q2F0ZWdvcnkpIG9iaikuZ2V0TmFtZSgpOwotCQkJCQkJCVN0cmluZyB0aXRsZSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmNvbmZpZ1ZpZXdQYWdlVmlld0V4aXN0c0RpYWxvZ190aXRsZTsgCi0JCQkJCQkJU3RyaW5nIG1lc3NhZ2UgPSBBdXRob3JpbmdVSVJlc291cmNlcy5iaW5kKEF1dGhvcmluZ1VJUmVzb3VyY2VzLmNvbmZpZ1ZpZXdQYWdlVmlld0V4aXN0c0RpYWxvZ19tZXNzYWdlLCBuYW1lKTsKLQkJCQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkKLQkJCQkJCQkJCS5kaXNwbGF5V2FybmluZyh0aXRsZSwgbWVzc2FnZSk7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCWJvb2xlYW4gc3RhdHVzID0gYWN0aW9uTWdyCi0JCQkJCQkJLmRvQWN0aW9uKAotCQkJCQkJCQkJSUFjdGlvbk1hbmFnZXIuQURELAotCQkJCQkJCQkJY29uZmlnLAotCQkJCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCQkJLmdldE1ldGhvZENvbmZpZ3VyYXRpb25fUHJvY2Vzc1ZpZXdzKCksCi0JCQkJCQkJCQkoQ29udGVudENhdGVnb3J5KSBvYmosIC0xKTsKLQkJCQkJCQlpZihzdGF0dXMpewotCQkJCQkJCQlhZGRWaWV3KChDb250ZW50Q2F0ZWdvcnkpIG9iaik7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9KTsKLQotCQkvLyByZW1vdmUgYnV0dG9uCi0JCXJlbW92ZUJ1dHRvbiA9IHRvb2xraXQKLQkJCQkuY3JlYXRlQnV0dG9uKAotCQkJCQkJYnV0dG9uUGFuZSwKLQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLmNvbmZpZ1ZpZXdQYWdlX3JlbW92ZVZpZXdCdXR0b25UZXh0LCBTV1QuTk9ORSk7IAotCQl7Ci0JCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5CRUdJTk5JTkcpOwotCQkJcmVtb3ZlQnV0dG9uLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQl9Ci0JCXJlbW92ZUJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJcmVtb3ZlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCXJlbW92ZVZpZXcoKTsKLQkJCX0KLQkJfSk7Ci0KLQkJLy8gbWFrZSBkZWZhdWx0IGJ1dHRvbgotCQltYWtlRGVmYXVsdEJ1dHRvbiA9IHRvb2xraXQKLQkJCQkuY3JlYXRlQnV0dG9uKAotCQkJCQkJYnV0dG9uUGFuZSwKLQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLmNvbmZpZ1ZpZXdQYWdlX21ha2VEZWZhdWx0QnV0dG9uVGV4dCwgU1dULk5PTkUpOyAKLQkJewotCQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuQkVHSU5OSU5HKTsKLQkJCW1ha2VEZWZhdWx0QnV0dG9uLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQl9Ci0JCW1ha2VEZWZhdWx0QnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQltYWtlRGVmYXVsdEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQltYWtlRGVmYXVsdFZpZXcoKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQlvcmRlckJ1dHRvbiA9IHRvb2xraXQuY3JlYXRlQnV0dG9uKAotCQkJCWJ1dHRvblBhbmUsCi0JCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMub3JkZXJCdXR0b25fdGV4dCwgU1dULk5PTkUpOyAKLQkJewotCQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuQkVHSU5OSU5HKTsKLQkJCXJlbW92ZUJ1dHRvbi5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJfQotCQlvcmRlckJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCUNvbmZpZ3VyYXRpb25PcmRlckRpYWxvZyBkbGcgPSBuZXcgQ29uZmlndXJhdGlvbk9yZGVyRGlhbG9nKAotCQkJCQkJRGlzcGxheS5nZXRDdXJyZW50KCkuZ2V0QWN0aXZlU2hlbGwoKSwKLQkJCQkJCWNvbmZpZywKLQkJCQkJCWdldEFjdGlvbk1hbmFnZXIoKSk7Ci0JCQkJaW50IHJldCA9IGRsZy5vcGVuKCk7Ci0JCQkJaWYocmV0ID09IFdpbmRvdy5PSykgcmVmcmVzaCgpOwotCQkJfQotCQl9KTsKLQotCQl0b29sa2l0LnBhaW50Qm9yZGVyc0ZvcihidXR0b25QYW5lKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgdGhlIHNlbGVjdGVkIHZpZXcKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHZvaWQgcmVtb3ZlVmlldygpIHsKLQkJQ1RhYkl0ZW0gaXRlbSA9IHRhYkZvbGRlci5nZXRTZWxlY3Rpb24oKTsKLQkJaWYgKGl0ZW0gPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJCi0JCS8vIGRvbid0IGNoYW5nZSBkZWZhdWx0IHZpZXcgaWYgdGhlIHZpZXcgaXMgbm90IHJlbW92ZWQuCi0JCS8vIDE1NTAyNSAtIGVycm9yIHdoZW4gcmVtb3ZpbmcgdGhlIHZpZXcgaW4gY29uZmlndXJhdGlvbgotCQlTdHJpbmcgaXRlbVRleHQgPSBpdGVtLmdldFRleHQoKTsJCQotCQlTdHJpbmcgdGl0bGUgPSBBdXRob3JpbmdVSVJlc291cmNlcy5jb25maWdWaWV3UGFnZVJlbW92ZVZpZXdEaWFsb2dfdGl0bGU7IAotCQlTdHJpbmcgbWVzc2FnZSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmJpbmQoQXV0aG9yaW5nVUlSZXNvdXJjZXMuY29uZmlnVmlld1BhZ2VSZW1vdmVWaWV3RGlhbG9nX21lc3NhZ2UsIGl0ZW0gCi0JCS5nZXRUZXh0KCkpOwotCQlib29sZWFuIHJldCA9IEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKQotCQkJCS5kaXNwbGF5Q29uZmlybWF0aW9uKHRpdGxlLCBtZXNzYWdlKTsKLQotCQlpZiAoIXJldCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlib29sZWFuIHJlbW92ZURlZmF1bHQgPSBmYWxzZTsKLQkJaWYgKHRhYkRlZmF1bHR2aWV3SXRlbSAhPSBudWxsICYmIGl0ZW0gPT0gdGFiRGVmYXVsdHZpZXdJdGVtKSB7Ci0JCQlyZW1vdmVEZWZhdWx0ID0gdHJ1ZTsKLQkJfQotCi0JCQlMaXN0IHZpZXdzID0gY29uZmlnLmdldFByb2Nlc3NWaWV3cygpOwotCQkJLy8gaWYgdGhlcmUgaXMgYSBkZWZhdWx0IHZpZXcgdGFiLCBhbmQgaXQncyB0aGUgb25lIHNsZWN0ZWQgdG8gYmUgcmVtb3ZlZAotCQkJaWYgKHJlbW92ZURlZmF1bHQpIHsKLQkJCQlTdHJpbmcgZGVmYXVsdFRleHQgPSAiICIgLy8kTk9OLU5MUy0xJAotCQkJCQkrIEF1dGhvcmluZ1VJUmVzb3VyY2VzLnByb2Nlc3NEZXNjcmlwdGlvbl9kZWZhdWx0OyAKLQkJCQlpbnQgaWR4ID0gaXRlbVRleHQubGFzdEluZGV4T2YoZGVmYXVsdFRleHQpOwotCQkJCWlmIChpZHggPiAwKSB7Ci0JCQkJCWl0ZW1UZXh0ID0gaXRlbVRleHQuc3Vic3RyaW5nKDAsaWR4KTsKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCWZvciAoSXRlcmF0b3IgaXRvciA9IHZpZXdzLml0ZXJhdG9yKCk7IGl0b3IuaGFzTmV4dCgpOykgewotCQkJCUNvbnRlbnRDYXRlZ29yeSBjYXRlZ29yeSA9IChDb250ZW50Q2F0ZWdvcnkpIGl0b3IubmV4dCgpOwotCQkJCQotCQkJCWlmIChjYXRlZ29yeS5nZXROYW1lKCkuZXF1YWxzKGl0ZW1UZXh0KSkgewotCQkJCQkvLyByZW1vdmUgaXQgZnJvbSB2aWV3cwotCQkJCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuUkVNT1ZFLCBjb25maWcsCi0JCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCS5nZXRNZXRob2RDb25maWd1cmF0aW9uX1Byb2Nlc3NWaWV3cygpLAotCQkJCQkJCWNhdGVnb3J5LCAtMSk7Ci0KLQkJCQkJQ29udGVudENhdGVnb3J5IGRlZmF1bHRWaWV3ID0gY29uZmlnLmdldERlZmF1bHRWaWV3KCk7Ci0KLQkJCQkJaWYgKChkZWZhdWx0VmlldyAhPSBudWxsKSAmJiAoZGVmYXVsdFZpZXcuZXF1YWxzKGNhdGVnb3J5KSkpIHsKLQkJCQkJCWlmICh2aWV3cy5zaXplKCkgPiAwKSB7Ci0JCQkJCQkJYWN0aW9uTWdyCi0JCQkJCQkJCQkuZG9BY3Rpb24oCi0JCQkJCQkJCQkJCUlBY3Rpb25NYW5hZ2VyLlNFVCwKLQkJCQkJCQkJCQkJY29uZmlnLAotCQkJCQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJCQkJCS5nZXRNZXRob2RDb25maWd1cmF0aW9uX0RlZmF1bHRWaWV3KCksCi0JCQkJCQkJCQkJCShDb250ZW50Q2F0ZWdvcnkpIHZpZXdzLmdldCgwKSwgLTEpOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlhY3Rpb25NZ3IKLQkJCQkJCQkJCS5kb0FjdGlvbigKLQkJCQkJCQkJCQkJSUFjdGlvbk1hbmFnZXIuU0VULAotCQkJCQkJCQkJCQljb25maWcsCi0JCQkJCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJCQkJLmdldE1ldGhvZENvbmZpZ3VyYXRpb25fRGVmYXVsdFZpZXcoKSwKLQkJCQkJCQkJCQkJbnVsbCwgLTEpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCS8vIHJlbW92ZSB0YWIgaXRlbQotCQkJCQlpdGVtLmRpc3Bvc2UoKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCi0JCXZpZXdzID0gY29uZmlnLmdldFByb2Nlc3NWaWV3cygpOwotCQlpZiAoKHZpZXdzID09IG51bGwpIHx8ICh2aWV3cy5zaXplKCkgPD0gMCkpIHsKLQkJCXJlbW92ZUJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCW1ha2VEZWZhdWx0QnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQl9Ci0JCQotCQkvLyBtYWtlIHRoZSAxc3QgdGFiIGFzIHRoZSBkZWZhdWx0IHZpZXcgaWYgdGhlIGRlZmF1bHQgb25lIGlzIHJlbW92ZWQKLQkJaWYgKHJlbW92ZURlZmF1bHQpIHsKLQkJCUNvbnRyb2xbXSB0YWJMaXN0ID0gdGFiRm9sZGVyLmdldFRhYkxpc3QoKTsKLQkJCWlmICh0YWJMaXN0ICE9IG51bGwgJiYgdGFiTGlzdC5sZW5ndGggPiAwKSB7Ci0JCQkJdGFiRm9sZGVyLnNldFNlbGVjdGlvbigwKTsKLQkJCQltYWtlRGVmYXVsdFZpZXcoKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEFkZCB2aWV3Ci0JICogCi0JICogQHBhcmFtIG9iagotCSAqLwotCXByaXZhdGUgdm9pZCBhZGRWaWV3KENvbnRlbnRDYXRlZ29yeSBvYmopIHsKLQkJc2VsZWN0ZWRJdGVtID0gb2JqOwotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZSh0YWJGb2xkZXIsIFNXVC5OT05FKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0KLQkJVHJlZVZpZXdlciB0cmVlVmlld2VyID0gbmV3IFRyZWVWaWV3ZXIoY29tcG9zaXRlLCBTV1QuSF9TQ1JPTEwKLQkJCQl8IFNXVC5WX1NDUk9MTCB8IFNXVC5CT1JERVIpOwotCQl0cmVlVmlld2VyLmdldFRyZWUoKS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JCXRyZWVWaWV3ZXIuZ2V0VHJlZSgpLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCi0JCUlGaWx0ZXIgY29uZmlnRmlsdGVyID0gbmV3IENvbmZpZ3VyYXRpb25WaWV3RmlsdGVyKGNvbmZpZywgdHJlZVZpZXdlcik7Ci0JCUFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5ID0gVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkuZ2V0Q29uZmlndXJhdGlvblZpZXdfQWRhcHRlckZhY3RvcnkoY29uZmlnRmlsdGVyKTsKLQotCQlBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlciBjb250ZW50UHJvdmlkZXIgPSBuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoCi0JCQkJYWRhcHRlckZhY3RvcnkpIHsKLQkJCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJLy8gR2V0IHRoZSBhZGFwdGVyIGZyb20gdGhlIGZhY3RvcnkuCi0JCQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyIGl0ZW1Qcm92aWRlciA9IChJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIpIGFkYXB0ZXJGYWN0b3J5Ci0JCQkJCQkuYWRhcHQoc2VsZWN0ZWRJdGVtLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCi0JCQkJcmV0dXJuIGl0ZW1Qcm92aWRlci5nZXRDaGlsZHJlbihzZWxlY3RlZEl0ZW0pLnRvQXJyYXkoKTsKLQkJCQkvLyByZXR1cm4gaXRlbVByb3ZpZGVyLmdldEVsZW1lbnRzKHNlbGVjdGVkSXRlbSkudG9BcnJheSgpOwotCQkJfQotCQl9OwotCi0JCXRyZWVWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKGNvbnRlbnRQcm92aWRlcik7Ci0JCXRyZWVWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihuZXcgQ29uZmlndXJhdGlvbkxhYmVsUHJvdmlkZXIoY29uZmlnLAotCQkJCWFkYXB0ZXJGYWN0b3J5KSk7Ci0JCXRyeSB7Ci0JCQl0cmVlVmlld2VyLnNldElucHV0KGNvbmZpZyk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJbG9nZ2VyLmxvZ0Vycm9yKCJFcnJvciBjcmVhdGluZyB0cmVldmlld2VyIGZvciBjb25maWciLCBleCk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCUNUYWJJdGVtIGl0ZW0gPSBuZXcgQ1RhYkl0ZW0odGFiRm9sZGVyLCBTV1QuVE9QKTsKLQkJaXRlbS5zZXRUZXh0KCgoQ29udGVudENhdGVnb3J5KSBvYmopLmdldE5hbWUoKSk7Ci0JCWl0ZW0uc2V0Q29udHJvbChjb21wb3NpdGUpOwotCi0JCS8vIG1ha2UgYWxsIGJ1dHRvbnMgZW5hYmxlZAotCQlyZW1vdmVCdXR0b24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJbWFrZURlZmF1bHRCdXR0b24uc2V0RW5hYmxlZCh0cnVlKTsKLQotCQl0b29sa2l0LnBhaW50Qm9yZGVyc0Zvcihjb21wb3NpdGUpOwotCQl0YWJGb2xkZXIuc2V0U2VsZWN0aW9uKGl0ZW0pOwotCX0KLQotCS8qKgotCSAqIE1ha2Ugc2VsZWN0ZWQgYXMgZGVmYXVsdCB2aWV3Ci0JICogCi0JICovCi0JcHJpdmF0ZSB2b2lkIG1ha2VEZWZhdWx0VmlldygpIHsKLQkJQ1RhYkl0ZW0gaXRlbSA9IHRhYkZvbGRlci5nZXRTZWxlY3Rpb24oKTsKLQkJTGlzdCB2aWV3cyA9IGNvbmZpZy5nZXRQcm9jZXNzVmlld3MoKTsKLQkJZm9yIChJdGVyYXRvciBpdG9yID0gdmlld3MuaXRlcmF0b3IoKTsgaXRvci5oYXNOZXh0KCk7KSB7Ci0JCQlDb250ZW50Q2F0ZWdvcnkgY2F0ZWdvcnkgPSAoQ29udGVudENhdGVnb3J5KSBpdG9yLm5leHQoKTsKLQkJCWlmIChjYXRlZ29yeS5nZXROYW1lKCkuZXF1YWxzKGl0ZW0uZ2V0VGV4dCgpKSkgewotCQkJCWNsZWFyRGVmYXVsdFZpZXdJbmRpY2F0b3IoKTsKLQkJCQkvLyBtYWtlIHRoYXQgdmlldyBkZWZhdWx0Ci0JCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlNFVCwgY29uZmlnLAotCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJLmdldE1ldGhvZENvbmZpZ3VyYXRpb25fRGVmYXVsdFZpZXcoKSwKLQkJCQkJCWNhdGVnb3J5LCAtMSk7Ci0JCQkJc2V0RGVmYXVsdFZpZXdJbmRpY2F0b3IoaXRlbSk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBMb2FkIGluaXRpYWwgZGF0YQotCSAqIAotCSAqLwotCXByaXZhdGUgdm9pZCBsb2FkRGF0YSgpIHsKLQkJLy8gZ2V0IHByb2Nlc3Mgdmlld3MKLQkJTGlzdCB2aWV3cyA9IGNvbmZpZy5nZXRQcm9jZXNzVmlld3MoKTsKLQkJZm9yIChJdGVyYXRvciBpdG9yID0gdmlld3MuaXRlcmF0b3IoKTsgaXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkvLyBjcmVhdGUgdmlldyBpbiBVSQotCQkJYWRkVmlldygoQ29udGVudENhdGVnb3J5KSBpdG9yLm5leHQoKSk7Ci0JCX0KLQotCQkvLyBnZXQgZGVmYXVsdCB2aWV3Ci0JCUNvbnRlbnRDYXRlZ29yeSBkZWZhdWx0VmlldyA9IGNvbmZpZy5nZXREZWZhdWx0VmlldygpOwotCQlpbnQgY250ID0gdGFiRm9sZGVyLmdldEl0ZW1Db3VudCgpOwotCQlpZiAoZGVmYXVsdFZpZXcgIT0gbnVsbCkgewotCQkJLy8gaWYgZGVmYXVsdCB2aWV3IGlzIGRlZmluZWQsIHNlbGVjdCB0aGF0IHZpZXcKLQkJCUNUYWJJdGVtW10gaXRlbXMgPSB0YWJGb2xkZXIuZ2V0SXRlbXMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHsKLQkJCQlTdHJpbmcgbmFtZSA9IGl0ZW1zW2ldLmdldFRleHQoKTsKLQkJCQlpZiAobmFtZS5lcXVhbHMoZGVmYXVsdFZpZXcuZ2V0TmFtZSgpKSkgewotCQkJCQl0YWJGb2xkZXIuc2V0U2VsZWN0aW9uKGl0ZW1zW2ldKTsKLQkJCQkJc2V0RGVmYXVsdFZpZXdJbmRpY2F0b3IoaXRlbXNbaV0pOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoY250ID4gMCkgewotCQkJLy8gZWxzZSBzZWxlY3QgZmlyc3QgdmlldwotCQkJdGFiRm9sZGVyLnNldFNlbGVjdGlvbigwKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgcmVmcmVzaCgpewotCQlDb250ZW50Q2F0ZWdvcnkgZGVmYXVsdFZpZXcgPSBjb25maWcuZ2V0RGVmYXVsdFZpZXcoKTsKLQkJU3RyaW5nIGRlZmF1bHRWaWV3TmFtZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCWlmKGRlZmF1bHRWaWV3IT1udWxsKSB7Ci0JCQlkZWZhdWx0Vmlld05hbWUgPSBkZWZhdWx0Vmlldy5nZXROYW1lKCk7Ci0JCQljbGVhckRlZmF1bHRWaWV3SW5kaWNhdG9yKCk7Ci0JCX0KLQkJU3RyaW5nIHNlbGVjdGVkVmlldyA9IHRhYkZvbGRlci5nZXRTZWxlY3Rpb24oKS5nZXRUZXh0KCk7Ci0JCU1hcCBvcmlnVmlld3MgPSBuZXcgSGFzaE1hcCgpOwotCQlmb3IoaW50IGk9MDtpPHRhYkZvbGRlci5nZXRJdGVtQ291bnQoKTtpKyspewotCQkJQ1RhYkl0ZW0gaXRlbSA9IHRhYkZvbGRlci5nZXRJdGVtKGkpOwotCQkJb3JpZ1ZpZXdzLnB1dChpdGVtLmdldFRleHQoKSwgaXRlbS5nZXRDb250cm9sKCkpOwotCQl9Ci0JCUxpc3Qgdmlld3MgPSBjb25maWcuZ2V0UHJvY2Vzc1ZpZXdzKCk7Ci0JCWludCBpbmRleCA9IDA7Ci0JCWludCBzZWxlY3RlZEluZGV4ID0gMDsKLQkJZm9yIChJdGVyYXRvciBpdG9yID0gdmlld3MuaXRlcmF0b3IoKTsgaXRvci5oYXNOZXh0KCkgJiYgaW5kZXg8dGFiRm9sZGVyLmdldEl0ZW1Db3VudCgpOykgewotCQkJU3RyaW5nIHZpZXcgPSAoKENvbnRlbnRDYXRlZ29yeSlpdG9yLm5leHQoKSkuZ2V0TmFtZSgpOwotCQkJQ1RhYkl0ZW0gaXRlbSA9IHRhYkZvbGRlci5nZXRJdGVtKGluZGV4KyspOwotCQkJaXRlbS5zZXRUZXh0KHZpZXcpOwotCQkJaXRlbS5zZXRDb250cm9sKChDb250cm9sKW9yaWdWaWV3cy5nZXQodmlldykpOwotCQkJaWYodmlldy5lcXVhbHMoZGVmYXVsdFZpZXdOYW1lKSkgc2V0RGVmYXVsdFZpZXdJbmRpY2F0b3IoaXRlbSk7Ci0JCQlpZih2aWV3LmVxdWFscyhzZWxlY3RlZFZpZXcpKSBzZWxlY3RlZEluZGV4ID0gaW5kZXgtMTsKLQkJfQotCQl0YWJGb2xkZXIuc2V0U2VsZWN0aW9uKHNlbGVjdGVkSW5kZXgpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIHJlbW92ZXMgdGhlIGFwcGVuZGVkICIoZGVmYXVsdCkiIGZyb20gdGhlIHRhYiBmb3IgdGhlIGRlZmF1bHQKLQkgKiB2aWV3LiBUaGlzIG1ldGhvZCBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgY2hhbmdpbmcgdGhlIGRlZmF1bHQgdmlldyEKLQkgKi8KLQlwcml2YXRlIHZvaWQgY2xlYXJEZWZhdWx0Vmlld0luZGljYXRvcigpIHsKLQkJQ29udGVudENhdGVnb3J5IGRlZmF1bHRWaWV3ID0gY29uZmlnLmdldERlZmF1bHRWaWV3KCk7Ci0JCWlmIChkZWZhdWx0VmlldyAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgZGVmYXVsdFZpZXdUYWJOYW1lID0gZGVmYXVsdFZpZXcuZ2V0TmFtZSgpCi0JCQkJCSsgIiAiIC8vJE5PTi1OTFMtMSQKLQkJCQkJKyBBdXRob3JpbmdVSVJlc291cmNlcy5wcm9jZXNzRGVzY3JpcHRpb25fZGVmYXVsdDsgCi0JCQlDVGFiSXRlbVtdIGl0ZW1zID0gdGFiRm9sZGVyLmdldEl0ZW1zKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJU3RyaW5nIG5hbWUgPSBpdGVtc1tpXS5nZXRUZXh0KCk7Ci0JCQkJaWYgKG5hbWUuZXF1YWxzKGRlZmF1bHRWaWV3VGFiTmFtZSkpIHsKLQkJCQkJaXRlbXNbaV0uc2V0VGV4dChkZWZhdWx0Vmlldy5nZXROYW1lKCkpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkKLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBhcHBlbmRzICIoZGVmYXVsdCkiIHRvIHRoZSB0YWIgb2YgdGhlIGRlZmF1bHQgdmlldy4KLQkgKi8KLQlwcml2YXRlIHZvaWQgc2V0RGVmYXVsdFZpZXdJbmRpY2F0b3IoQ1RhYkl0ZW0gaXRlbSkgewotCQl0YWJEZWZhdWx0dmlld0l0ZW0gPSBpdGVtOwotCQkKLQkJU3RyaW5nIG5hbWUgPSBpdGVtLmdldFRleHQoKQotCQkJCSsgIiAiIC8vJE5PTi1OTFMtMSQKLQkJCQkrIEF1dGhvcmluZ1VJUmVzb3VyY2VzLnByb2Nlc3NEZXNjcmlwdGlvbl9kZWZhdWx0OyAKLQkJaXRlbS5zZXRUZXh0KG5hbWUpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nW10gZ2V0VHlwZXMoKSB7Ci0JCVN0cmluZ1tdIENhdGVnb3JpZXMgPSBuZXcgU3RyaW5nW10geyBGaWx0ZXJDb25zdGFudHMuQ1VTVE9NX0NBVEVHT1JJRVMsCi0JCQkJRmlsdGVyQ29uc3RhbnRzLkFMTF9FTEVNRU5UUywgRmlsdGVyQ29uc3RhbnRzLkRJU0NJUExJTkVTLAotCQkJCUZpbHRlckNvbnN0YW50cy5ET01BSU5TLCBGaWx0ZXJDb25zdGFudHMuUk9MRVNFVFMsCi0JCQkJRmlsdGVyQ29uc3RhbnRzLldPUktQUk9EVUNUVFlQRVMsIEZpbHRlckNvbnN0YW50cy5UT09MUyB9OwotCQlyZXR1cm4gQ2F0ZWdvcmllczsKLQl9Ci0JCi0JcHJvdGVjdGVkIElBY3Rpb25NYW5hZ2VyIGdldEFjdGlvbk1hbmFnZXIoKSB7Ci0JCXJldHVybiBhY3Rpb25NZ3I7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9Db25maWd1cmF0aW9uRGVzY3JpcHRpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvQ29uZmlndXJhdGlvbkRlc2NyaXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmNmY3OGUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9Db25maWd1cmF0aW9uRGVzY3JpcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5Db25maWd1cmF0aW9uRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLmVkaXRvci5Gb3JtRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuRm9ybVRvb2xraXQ7Ci0KLQotLyoqCi0gKiBUaGUgRGVzY3JpcHRpb24gcGFnZSBpbiB0aGUgQ29uZmlndXJhdGlvbiBlZGl0b3IuCi0gKiAKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQ29uZmlndXJhdGlvbkRlc2NyaXB0aW9uIGV4dGVuZHMgRGVzY3JpcHRpb25Gb3JtUGFnZSBpbXBsZW1lbnRzIElSZWZyZXNoYWJsZSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9STV9QUkVGSVggPSBBdXRob3JpbmdVSVJlc291cmNlcy5Db25maWd1cmF0aW9uRGVzY3JpcHRpb25Gb3JtUHJlZml4OyAKLQotCXByaXZhdGUgTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSBudWxsOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgQ29uZmlndXJhdGlvbkRlc2NyaXB0aW9uKEZvcm1FZGl0b3IgZWRpdG9yKSB7Ci0JCXN1cGVyKAotCQkJCWVkaXRvciwKLQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5Db25maWd1cmF0aW9uRGVzY3JpcHRpb25EZXNjcmlwdGlvbiwgQXV0aG9yaW5nVUlSZXNvdXJjZXMuQ29uZmlndXJhdGlvbkRlc2NyaXB0aW9uRGVzY3JpcHRpb24pOyAKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLmZvcm1zLmVkaXRvci5Gb3JtUGFnZSNpbml0KG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlLCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJRWRpdG9yU2l0ZSBzaXRlLCBJRWRpdG9ySW5wdXQgaW5wdXQpIHsKLQkJc3VwZXIuaW5pdChzaXRlLCBpbnB1dCk7Ci0JCUNvbmZpZ3VyYXRpb25FZGl0b3JJbnB1dCBjb25maWdJbnB1dCA9IChDb25maWd1cmF0aW9uRWRpdG9ySW5wdXQpIGlucHV0OwotCQljb25maWcgPSBjb25maWdJbnB1dC5nZXRDb25maWd1cmF0aW9uKCk7Ci0JCXZlcnNpb25TZWN0aW9uT24gPSBmYWxzZTsKLQkJZGV0YWlsU2VjdGlvbk9uID0gZmFsc2U7Ci0JCXZhcmlhYmlsaXR5U2VjdGlvbk9uID0gZmFsc2U7Ci0JCWZ1bGxEZXNjT24gPSBmYWxzZTsKLQkJa2V5Q29uc2lkZXJhdGlvbk9uID0gZmFsc2U7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRWRpdG9yQ29udGVudChGb3JtVG9vbGtpdCB0b29sa2l0KSB7Ci0JCXN1cGVyLmNyZWF0ZUVkaXRvckNvbnRlbnQodG9vbGtpdCk7Ci0JCS8vIFNldCBmb2N1cyBvbiB0aGUgTmFtZSB0ZXh0IGNvbnRyb2wuCi0JCURpc3BsYXkgZGlzcGxheSA9IGZvcm0uZ2V0Qm9keSgpLmdldERpc3BsYXkoKTsKLQkJaWYgKCEoZGlzcGxheSA9PSBudWxsIHx8IGRpc3BsYXkuaXNEaXNwb3NlZCgpKSkgewotCQkJZGlzcGxheS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJaWYoY3RybF9uYW1lLmlzRGlzcG9zZWQoKSkgcmV0dXJuOwkJCi0JCQkJCWN0cmxfbmFtZS5zZXRGb2N1cygpOwotCQkJCQljdHJsX25hbWUuc2V0U2VsZWN0aW9uKDAsIGN0cmxfbmFtZS5nZXRUZXh0KCkubGVuZ3RoKCkpOwotCQkJCX0KLQkJCX0pOwotCQl9Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgbG9hZFNlY3Rpb25EZXNjcmlwdGlvbigpIHsKLQkJdGhpcy5nZW5lcmFsU2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuQ29uZmlndXJhdGlvbkRlc2NyaXB0aW9uRGVzY3JpcHRpb25fdGV4dDsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgT2JqZWN0IGdldENvbnRlbnRFbGVtZW50KCkgewotCQlyZXR1cm4gY29uZmlnOwotCX0KLQkKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL0NvbmZpZ3VyYXRpb25QYWdlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL0NvbmZpZ3VyYXRpb25QYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzZTU4NGIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9Db25maWd1cmF0aW9uUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA2NSArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXM7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWRBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJSGVscENvbnRleHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlJbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5Db25maWd1cmF0aW9uRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5Db25maWd1cmF0aW9uRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm92aWRlcnMuQ2F0ZWdvcnlDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm92aWRlcnMuQ2F0ZWdvcnlMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvdmlkZXJzLkNvbmZpZ1BhY2thZ2VDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm92aWRlcnMuQ29uZmlnUGFja2FnZUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm92aWRlcnMuSGlkZVVuY2hlY2tlZFZpZXdlckZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnV0aWwuQXV0aG9yaW5nQWNjZXNzaWJsZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudXRpbC5Db25maWd1cmF0aW9uTWFya2VySGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudmlld3MuTWV0aG9kQ29udGFpbmVyQ2hlY2tlZFRyZWVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS52aWV3cy5NZXRob2RDb250YWluZXJDaGVja2VkVHJlZVZpZXdlcjI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuSUNvbmZpZ3VyYXRpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LklMaWJyYXJ5TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb25EYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvblByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5jbG9zdXJlLkNsb3N1cmVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLmNsb3N1cmUuQ29uZmlndXJhdGlvbkNsb3N1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5jbG9zdXJlLklDb25maWd1cmF0aW9uRXJyb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JUGx1Z2luVUlQYWNrYWdlQ29udGV4dENoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlBsdWdpblVJUGFja2FnZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSUFjdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLk1ldGhvZEVsZW1lbnRTZXRQcm9wZXJ0eUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51aS5Vc2VySW50ZXJhY3Rpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkNvbmZpZ3VyYXRpb25VdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5NZXRob2RFbGVtZW50UHJvcGVydHlIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLk1ldGhvZEVsZW1lbnRVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmV2ZW50cy5JTGlicmFyeUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuTGlicmFyeVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVpLnV0aWwuU1dUVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRDYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkN1c3RvbUNhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNoZWNrU3RhdGVDaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ2hlY2tTdGF0ZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5CdXN5SW5kaWNhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuQ29udGFpbmVyQ2hlY2tlZFRyZWVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuSU1hbmFnZWRGb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLmVkaXRvci5Gb3JtRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLmVkaXRvci5Gb3JtUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLkZvcm1Ub29sa2l0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuU2Nyb2xsZWRGb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuU2VjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLlRhYmxlV3JhcERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5UYWJsZVdyYXBMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaWRlLklHb3RvTWFya2VyOwotCi1wdWJsaWMgY2xhc3MgQ29uZmlndXJhdGlvblBhZ2UgZXh0ZW5kcyBGb3JtUGFnZSBpbXBsZW1lbnRzIElHb3RvTWFya2VyIHsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUT1VDSEVEX0JZX0NPTkZJR19FRElUT1IgPSAiVG91Y2hlZEJ5Q29uZmlnRWRpdG9yIjsJLy8kTk9OLU5MUy0xJAkKLQkKLQlwcml2YXRlIFN0cmluZyBmb3JtUHJlZml4ID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuQ29uZmlndXJhdGlvblBhZ2VfRm9ybVByZWZpeDsgCi0KLQlwcml2YXRlIE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gbnVsbDsKLQlwcml2YXRlIENvbmZpZ3VyYXRpb25DbG9zdXJlIGNsb3N1cmUgPSBudWxsOwotCQotCXByaXZhdGUgTWV0aG9kQ29udGFpbmVyQ2hlY2tlZFRyZWVWaWV3ZXIgY29uZmlnVmlld2VyOwotCXByaXZhdGUgQ29uZmlnUGFja2FnZUNvbnRlbnRQcm92aWRlciBjb250UHJvdmlkZXI7Ci0JcHJpdmF0ZSBDb25maWdQYWNrYWdlTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyOwotCi0JcHJpdmF0ZSBNZXRob2RDb250YWluZXJDaGVja2VkVHJlZVZpZXdlcjIgYWRkQ2F0ZWdvcnlWaWV3ZXI7Ci0JcHJpdmF0ZSBNZXRob2RDb250YWluZXJDaGVja2VkVHJlZVZpZXdlcjIgc3ViQ2F0ZWdvcnlWaWV3ZXI7Ci0JCi0JcHJpdmF0ZSBIaWRlVW5jaGVja2VkVmlld2VyRmlsdGVyIGNvbmZpZ1ZpZXdlckhpZGVVbmNoZWNrZWRGaWx0ZXI7Ci0JcHJpdmF0ZSBIaWRlVW5jaGVja2VkVmlld2VyRmlsdGVyIGFkZENhdGVnb3J5SGlkZVVuY2hlY2tlZEZpbHRlcjsKLQlwcml2YXRlIEhpZGVVbmNoZWNrZWRWaWV3ZXJGaWx0ZXIgc3ViQ2F0ZWdvcnlIaWRlVW5jaGVja2VkRmlsdGVyOwotCQotCi0JcHJpdmF0ZSBDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5ID0gVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UuY3JlYXRlTGlicmFyeUNvbXBvc2VkQWRhcHRlckZhY3RvcnkoKTsKLQotCXByaXZhdGUgSUxpYnJhcnlDaGFuZ2VMaXN0ZW5lciBsaWJMaXN0ZW5lciA9IG51bGw7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ29uZmlndXJhdGlvbk1hcmtlckhlbHBlciBtYXJrZXJIZWxwZXIgPSBDb25maWd1cmF0aW9uTWFya2VySGVscGVyLklOU1RBTkNFOwotCWJvb2xlYW4gaXNEaXJ0eSA9IGZhbHNlOwotCXByb3RlY3RlZCBJU2VsZWN0aW9uIGN1cnJlbnRTZWxlY3Rpb24gPSBTdHJ1Y3R1cmVkU2VsZWN0aW9uLkVNUFRZOwotCi0JcHJpdmF0ZSBJQWN0aW9uTWFuYWdlciBhY3Rpb25NZ3I7Ci0JU2Nyb2xsZWRGb3JtIGZvcm0gPSBudWxsOwotCXByaXZhdGUgQnV0dG9uIHVwZGF0ZU9uQ2xpY2s7Ci0JcHJpdmF0ZSBCdXR0b24gbm9VcGRhdGVPbkNsaWNrOwotCXByaXZhdGUgQnV0dG9uIGNsb3N1cmVCdXR0b247Ci0JcHJpdmF0ZSBCdXR0b24gZml4V2FybmluZ0J1dHRvbjsKLQlwcml2YXRlIEJ1dHRvbiByZWZyZXNoQnV0dG9uOwotCXByaXZhdGUgQnV0dG9uIGhpZGVCdXR0b247Ci0JcHJpdmF0ZSBUZXh0IGVsZW1EZXNwQ29udGVudFRleHQ7Ci0KLQlwcml2YXRlIENvbmZpZ3VyYXRpb25Qcm9wZXJ0aWVzIGNvbmZpZ1Byb3BlcnRpZXM7Ci0JcHJpdmF0ZSBCdXR0b24gaGlkZUVycm9yQnV0dG9uOwotCXByaXZhdGUgQnV0dG9uIGhpZGVXYXJuQnV0dG9uOwotCXByaXZhdGUgQnV0dG9uIGhpZGVJbmZvQnV0dG9uOwotCi0JcHJpdmF0ZSBTaG93RXJyb3JKb2Igc2hvd0Vycm9ySm9iID0gbmV3IFNob3dFcnJvckpvYihBdXRob3JpbmdVSVJlc291cmNlcy5Db25maWd1cmF0aW9uX1Byb2JsZW1fUmVmcmVzaCk7IC8vJE5PTi1OTFMtMSQKLQotCXByb3RlY3RlZCBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIHRyZWVTZWxlY3Rpb25MaXN0ZW5lciA9IG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewotCQkvKioKLQkJICoJSGFuZGxlcyB0aGUgc2VsZWN0aW9uIG9mIGFuIGl0ZW0gaW4gdGhlIHRyZWUgdmlld2VyCi0JCSAqCi0JCSAqCUBwYXJhbSBldmVudCBJU2VsZWN0aW9uCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKGZpbmFsIFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQkJQnVzeUluZGljYXRvci5zaG93V2hpbGUoQ29uZmlndXJhdGlvblBhZ2UudGhpcy5nZXRTaXRlKCkuZ2V0U2hlbGwoKS5nZXREaXNwbGF5KCksIG5ldyBSdW5uYWJsZSgpIHsKLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbj0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBldmVudC5nZXRTZWxlY3Rpb24oKTsKLQkJCQkJT2JqZWN0IHNlbGVjdGVkRWxlbWVudD0gc2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOwotCQkJCQlzZWxlY3RlZEVsZW1lbnQgPSBUbmdVdGlsLnVud3JhcChzZWxlY3RlZEVsZW1lbnQpOwotCQkJCQlpZiAoc2VsZWN0ZWRFbGVtZW50ID09IG51bGwpIHsKLQkJCQkJCXJldHVybjsKLQkJCQkJfSBlbHNlIGlmIChlbGVtRGVzcENvbnRlbnRUZXh0ICE9IG51bGwgJiYgc2VsZWN0ZWRFbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJCQkJLy8gZGlzcGxheSBzZWxlY3RlZCBlbGVtZW50J3MgZGVzY3JpcHRpb24KLQkJCQkJCVN0cmluZyBicmllZkRlc2MgPSAoKE1ldGhvZEVsZW1lbnQpIHNlbGVjdGVkRWxlbWVudCkuZ2V0QnJpZWZEZXNjcmlwdGlvbigpOwotCQkJCQkJZWxlbURlc3BDb250ZW50VGV4dC5zZXRUZXh0KGJyaWVmRGVzYyAhPSBudWxsID8gYnJpZWZEZXNjIDogIiIpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQl9Ci0JCQl9KTsKLQkJfQotCX07Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBDbG9zdXJlTGlzdGVuZXIgY2xvc3VyZUxpc3RlbmVyID0gbmV3IENsb3N1cmVMaXN0ZW5lcigpIHsKLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyB2b2lkIGVycm9yQWRkZWQoTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcsIElDb25maWd1cmF0aW9uRXJyb3IgZXJyb3IpIHsKLQkJCUlDb25maWd1cmF0aW9uTWFuYWdlciBjb25maWdNZ3IgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmdldENvbmZpZ3VyYXRpb25NYW5hZ2VyKGNvbmZpZyk7Ci0JCQlpZiAoY29uZmlnTWdyLmdldENvbmZpZ3VyYXRpb25Qcm9wZXJ0aWVzKCkudG9IaWRlKGVycm9yKSkgewotCQkJCXJldHVybjsKLQkJCX0KLQkJCW1hcmtlckhlbHBlci5jcmVhdGVNYXJrZXIoY29uZmlnLCBlcnJvcik7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIHZvaWQgZXJyb3JSZW1vdmVkKE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnLCBJQ29uZmlndXJhdGlvbkVycm9yIGVycm9yKSB7Ci0JCQltYXJrZXJIZWxwZXIuZGVsZXRlTWFya2VyKGNvbmZpZywgZXJyb3IpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyB2b2lkIGVycm9yVXBkYXRlZChNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZywgSUNvbmZpZ3VyYXRpb25FcnJvciBlcnJvcikgewotCQkJbWFya2VySGVscGVyLmFkanVzdE1hcmtlcihudWxsLCBjb25maWcsIGVycm9yKTsKLQkJfQotCX07Ci0KLQlwcml2YXRlIElQbHVnaW5VSVBhY2thZ2VDb250ZXh0Q2hhbmdlZExpc3RlbmVyIGxheW91dExpc3RlbmVyID0gbmV3IElQbHVnaW5VSVBhY2thZ2VDb250ZXh0Q2hhbmdlZExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBsYXlvdXRDaGFuZ2VkKGJvb2xlYW4gaXNGbGF0KSB7Ci0JCQlyZWZyZXNoVmlld2VycygpOwotCQl9Ci0JfTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2UKLQkgKiBAcGFyYW0gZWRpdG9yCi0JICovCi0JcHVibGljIENvbmZpZ3VyYXRpb25QYWdlKEZvcm1FZGl0b3IgZWRpdG9yKSB7Ci0JCXN1cGVyKGVkaXRvciwgQXV0aG9yaW5nVUlSZXNvdXJjZXMuQ29uZmlndXJhdGlvblBhZ2VfRGVzY3JpcHRpb24xLCAKLQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5Db25maWd1cmF0aW9uUGFnZV9EZXNjcmlwdGlvbjIpOyAKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLmZvcm1zLmVkaXRvci5Gb3JtUGFnZSNjcmVhdGVGb3JtQ29udGVudChvcmcuZWNsaXBzZS51aS5mb3Jtcy5JTWFuYWdlZEZvcm0pCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRm9ybUNvbnRlbnQoSU1hbmFnZWRGb3JtIG1hbmFnZWRGb3JtKSB7Ci0JCS8vIGNyZWF0ZSBmb3JtIHRvb2xraXQKLQkJZm9ybSA9IG1hbmFnZWRGb3JtLmdldEZvcm0oKTsKLQkJZm9ybS5zZXRUZXh0KGZvcm1QcmVmaXggKyBjb25maWcuZ2V0TmFtZSgpKTsKLQkJRm9ybVRvb2xraXQgdG9vbGtpdCA9IG1hbmFnZWRGb3JtLmdldFRvb2xraXQoKTsKLQotCQlUYWJsZVdyYXBMYXlvdXQgbGF5b3V0ID0gbmV3IFRhYmxlV3JhcExheW91dCgpOwotCQlmb3JtLmdldEJvZHkoKS5zZXRMYXlvdXQobGF5b3V0KTsKLQotCQlTZWN0aW9uIHRyZWVTZWN0aW9uID0gdG9vbGtpdC5jcmVhdGVTZWN0aW9uKGZvcm0uZ2V0Qm9keSgpLAotCQkJCVNlY3Rpb24uREVTQ1JJUFRJT04gfCBTZWN0aW9uLlRXSVNUSUUgfCBTZWN0aW9uLkVYUEFOREVECi0JCQkJCQl8IFNlY3Rpb24uVElUTEVfQkFSKTsKLQkJdHJlZVNlY3Rpb24uc2V0TGF5b3V0RGF0YShuZXcgVGFibGVXcmFwRGF0YShUYWJsZVdyYXBEYXRhLkZJTExfR1JBQikpOwotCQl0cmVlU2VjdGlvbi5zZXRUZXh0KEF1dGhvcmluZ1VJUmVzb3VyY2VzLkNvbmZpZ3VyYXRpb25QYWdlX0NvbmZpZ0NvbnRlbnQpOyAKLQkJdHJlZVNlY3Rpb24uc2V0RGVzY3JpcHRpb24oQXV0aG9yaW5nVUlSZXNvdXJjZXMuQ29uZmlndXJhdGlvblBhZ2VfQ29uZmlnQ29udGVudERlc2NyaXB0aW9uKTsgCi0JCXRyZWVTZWN0aW9uLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQkJCi0JCWNyZWF0ZUNvbnRlbnQodG9vbGtpdCwgdHJlZVNlY3Rpb24pOwotCQkKLQkJYWRkTGlzdGVuZXJzKCk7Ci0KLQkJLy8gZmluYWxseSBzZXQgdGhlIGlucHV0LgotCQlzZXRJbnB1dChMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCkpOwotCQkKLQkJaW5pdGlhbGl6ZVZpZXdlcnNTZWxlY3Rpb24oKTsKLQl9Ci0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLmZvcm1zLmVkaXRvci5Gb3JtUGFnZSNpbml0KG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlLCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJRWRpdG9yU2l0ZSBzaXRlLCBJRWRpdG9ySW5wdXQgaW5wdXQpIHsKLQkJc2V0U2l0ZShzaXRlKTsKLQkJc2V0SW5wdXQoaW5wdXQpOwotCi0JCUNvbmZpZ3VyYXRpb25FZGl0b3JJbnB1dCBjb25maWdJbnB1dCA9IChDb25maWd1cmF0aW9uRWRpdG9ySW5wdXQpIGlucHV0OwotCQljb25maWcgPSBjb25maWdJbnB1dC5nZXRDb25maWd1cmF0aW9uKCk7Ci0JCWFjdGlvbk1nciA9ICgoQ29uZmlndXJhdGlvbkVkaXRvcikgZ2V0RWRpdG9yKCkpLmdldEFjdGlvbk1hbmFnZXIoKTsKLQkJY29uZmlnUHJvcGVydGllcyA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLQkJLmdldENvbmZpZ3VyYXRpb25NYW5hZ2VyKGNvbmZpZykuZ2V0Q29uZmlndXJhdGlvblByb3BlcnRpZXMoKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgdHJlZSBjb250ZW50Ci0JICogQHBhcmFtIHRvb2xraXQKLQkgKiBAcGFyYW0gc2VjdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRlbnQoRm9ybVRvb2xraXQgdG9vbGtpdCwgU2VjdGlvbiBzZWN0aW9uKSB7Ci0JCUNvbXBvc2l0ZSBzZWN0aW9uQ2xpZW50ID0gdG9vbGtpdC5jcmVhdGVDb21wb3NpdGUoc2VjdGlvbik7Ci0JCXNlY3Rpb25DbGllbnQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0JCXNlY3Rpb24uc2V0Q2xpZW50KHNlY3Rpb25DbGllbnQpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KDIsIHRydWUpOwotCQlzZWN0aW9uQ2xpZW50LnNldExheW91dChsYXlvdXQpOwotCi0JCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoCi0JCQkJc2VjdGlvbkNsaWVudC5nZXRQYXJlbnQoKSwKLQkJCQlBdXRob3JpbmdVSUhlbHBDb250ZXh0cy5DT05GSUdVUkFUSU9OX0VESVRPUl9BTExfQ09OVEVYVCk7Ci0KLQkJQ29tcG9zaXRlIGJ1dHRvbkNvbXBvc2l0ZSA9IHRvb2xraXQuY3JlYXRlQ29tcG9zaXRlKHNlY3Rpb25DbGllbnQpOwotCQlHcmlkTGF5b3V0IGdyaWRMYXlvdXQgPSBuZXcgR3JpZExheW91dCg2LCBmYWxzZSk7Ci0JCWJ1dHRvbkNvbXBvc2l0ZS5zZXRMYXlvdXQoZ3JpZExheW91dCk7Ci0JCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCWdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJYnV0dG9uQ29tcG9zaXRlLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQkKLQkJQ29tcG9zaXRlIHJhZGlvQ29tcG9zaXRlID0gdG9vbGtpdC5jcmVhdGVDb21wb3NpdGUoYnV0dG9uQ29tcG9zaXRlKTsKLQkJZ3JpZExheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCXJhZGlvQ29tcG9zaXRlLnNldExheW91dChncmlkTGF5b3V0KTsKLQkJZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAxOwotCQlyYWRpb0NvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJCi0JCQotCQl1cGRhdGVPbkNsaWNrID0gdG9vbGtpdC5jcmVhdGVCdXR0b24ocmFkaW9Db21wb3NpdGUsIEF1dGhvcmluZ1VJUmVzb3VyY2VzLkNvbmZpZ3VyYXRpb25QYWdlX3VwZGF0ZU9uQ2xpY2ssIFNXVC5SQURJTyk7Ci0JCXVwZGF0ZU9uQ2xpY2suc2V0VG9vbFRpcFRleHQoQXV0aG9yaW5nVUlSZXNvdXJjZXMuQ29uZmlndXJhdGlvblBhZ2VfdXBkYXRlT25DbGlja1Rvb2xUaXApOyAKLQkJdXBkYXRlT25DbGljay5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuQkVHSU5OSU5HLCBTV1QuREVGQVVMVCwgZmFsc2UsIGZhbHNlKSk7Ci0JCXVwZGF0ZU9uQ2xpY2suZ2V0QWNjZXNzaWJsZSgpLmFkZEFjY2Vzc2libGVMaXN0ZW5lcihuZXcgQXV0aG9yaW5nQWNjZXNzaWJsZUxpc3RlbmVyKAotCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLkNvbmZpZ3VyYXRpb25QYWdlX3VwZGF0ZU9uQ2xpY2tUb29sVGlwKSk7Ci0JCXVwZGF0ZU9uQ2xpY2suc2V0U2VsZWN0aW9uKHRydWUpOwotCQkKLQkJbm9VcGRhdGVPbkNsaWNrID0gdG9vbGtpdC5jcmVhdGVCdXR0b24ocmFkaW9Db21wb3NpdGUsIEF1dGhvcmluZ1VJUmVzb3VyY2VzLkNvbmZpZ3VyYXRpb25QYWdlX25vVXBkYXRlT25DbGljaywgU1dULlJBRElPKTsKLQkJbm9VcGRhdGVPbkNsaWNrLnNldFRvb2xUaXBUZXh0KEF1dGhvcmluZ1VJUmVzb3VyY2VzLkNvbmZpZ3VyYXRpb25QYWdlX25vVXBkYXRlT25DbGlja1Rvb2xUaXApOyAKLQkJbm9VcGRhdGVPbkNsaWNrLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5CRUdJTk5JTkcsIFNXVC5ERUZBVUxULCBmYWxzZSwgZmFsc2UpKTsKLQkJbm9VcGRhdGVPbkNsaWNrLmdldEFjY2Vzc2libGUoKS5hZGRBY2Nlc3NpYmxlTGlzdGVuZXIobmV3IEF1dGhvcmluZ0FjY2Vzc2libGVMaXN0ZW5lcigKLQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5Db25maWd1cmF0aW9uUGFnZV9ub1VwZGF0ZU9uQ2xpY2tUb29sVGlwKSk7Ci0KLQkJR3JvdXAgZ3JvdXAgPSBuZXcgR3JvdXAoYnV0dG9uQ29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWdyb3VwLnNldExheW91dChuZXcgR3JpZExheW91dCgxLCBmYWxzZSkpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCwgZmFsc2UsIGZhbHNlKTsKLQkJZ3JvdXAuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJZ3JvdXAuc2V0VGV4dChBdXRob3JpbmdVSVJlc291cmNlcy5jb25maWdQcm9ibGVtVmlld09wdGlvbnNUZXh0KTsKLQotCQloaWRlRXJyb3JCdXR0b24gPSBTV1RVdGlsLmNyZWF0ZUNoZWNrYm94KGdyb3VwLCBBdXRob3JpbmdVSVJlc291cmNlcy5oaWRlRXJyb3NUZXh0KTsKLQkJaGlkZVdhcm5CdXR0b24gPSBTV1RVdGlsLmNyZWF0ZUNoZWNrYm94KGdyb3VwLCBBdXRob3JpbmdVSVJlc291cmNlcy5oaWRlV2FybmluZ3NUZXh0KTsKLQkJaGlkZUluZm9CdXR0b24gPSBTV1RVdGlsLmNyZWF0ZUNoZWNrYm94KGdyb3VwLEF1dGhvcmluZ1VJUmVzb3VyY2VzLmhpZGVJbmZvc1RleHQpOwotCQkKLQkJaGlkZUVycm9yQnV0dG9uLnNldFNlbGVjdGlvbihjb25maWdQcm9wZXJ0aWVzLmlzSGlkZUVycm9ycygpKTsKLQkJaGlkZVdhcm5CdXR0b24uc2V0U2VsZWN0aW9uKGNvbmZpZ1Byb3BlcnRpZXMuaXNIaWRlV2FybmluZ3MoKSk7Ci0JCWhpZGVJbmZvQnV0dG9uLnNldFNlbGVjdGlvbihjb25maWdQcm9wZXJ0aWVzLmlzSGlkZUluZm9zKCkpOwkJCi0KLQkJCi0JCQotCQloaWRlQnV0dG9uID0gdG9vbGtpdC5jcmVhdGVCdXR0b24oYnV0dG9uQ29tcG9zaXRlLCAiIiwgU1dULlBVU0ggLy8kTk9OLU5MUy0xJAotCQkJCXwgR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9FTkQpOwotCQloaWRlQnV0dG9uLnNldEltYWdlKEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRTaGFyZWRJbWFnZSgKLQkJCQkiaGlkZVVuY2hlY2tlZEVsZW0uZ2lmIikpOyAvLyROT04tTkxTLTEkCi0JCWhpZGVCdXR0b24uc2V0VG9vbFRpcFRleHQoQXV0aG9yaW5nVUlSZXNvdXJjZXMuQ29uZmlndXJhdGlvblBhZ2VfaGlkZVRvb2xUaXApOyAKLQkJaGlkZUJ1dHRvbi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5FTkQpKTsKLQkJaGlkZUJ1dHRvbi5nZXRBY2Nlc3NpYmxlKCkuYWRkQWNjZXNzaWJsZUxpc3RlbmVyKG5ldyBBdXRob3JpbmdBY2Nlc3NpYmxlTGlzdGVuZXIoCi0JCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuQ29uZmlndXJhdGlvblBhZ2VfaGlkZVRvb2xUaXApKTsKLQkJCi0JCWZpeFdhcm5pbmdCdXR0b24gPSB0b29sa2l0LmNyZWF0ZUJ1dHRvbihidXR0b25Db21wb3NpdGUsICIiLCBTV1QuUFVTSCk7IC8vJE5PTi1OTFMtMSQKLQkJZml4V2FybmluZ0J1dHRvbi5zZXRJbWFnZShBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCQkuZ2V0U2hhcmVkSW1hZ2UoImFkZHJlZl9jby5naWYiKSk7IC8vJE5PTi1OTFMtMSQKLQkJZml4V2FybmluZ0J1dHRvbi5zZXRUb29sVGlwVGV4dChBdXRob3JpbmdVSVJlc291cmNlcy5Db25maWd1cmF0aW9uUGFnZV9BZGRNaXNzaW5nVG9vbFRpcCk7IAotCQlmaXhXYXJuaW5nQnV0dG9uLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkVORCkpOwotCQlmaXhXYXJuaW5nQnV0dG9uLmdldEFjY2Vzc2libGUoKS5hZGRBY2Nlc3NpYmxlTGlzdGVuZXIobmV3IEF1dGhvcmluZ0FjY2Vzc2libGVMaXN0ZW5lcigKLQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5Db25maWd1cmF0aW9uUGFnZV9BZGRNaXNzaW5nVG9vbFRpcCkpOwotCi0JCS8vIEFkZCB0aGUgY2xvc3VyZSBidXR0b24uCi0JCWNsb3N1cmVCdXR0b24gPSB0b29sa2l0LmNyZWF0ZUJ1dHRvbihidXR0b25Db21wb3NpdGUsICIiLCBTV1QuUFVTSCk7IC8vJE5PTi1OTFMtMSQKLQkJY2xvc3VyZUJ1dHRvbi5zZXRJbWFnZShBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0U2hhcmVkSW1hZ2UoCi0JCQkJImNsb3N1cmVfY28uZ2lmIikpOyAvLyROT04tTkxTLTEkCi0JCWNsb3N1cmVCdXR0b24uc2V0VG9vbFRpcFRleHQoQXV0aG9yaW5nVUlSZXNvdXJjZXMuQ29uZmlndXJhdGlvblBhZ2VfTWFrZUNsb3N1cmVUb29sVGlwKTsgCi0JCWNsb3N1cmVCdXR0b24uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRU5EKSk7Ci0JCWNsb3N1cmVCdXR0b24uZ2V0QWNjZXNzaWJsZSgpLmFkZEFjY2Vzc2libGVMaXN0ZW5lcihuZXcgQXV0aG9yaW5nQWNjZXNzaWJsZUxpc3RlbmVyKAotCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLkNvbmZpZ3VyYXRpb25QYWdlX01ha2VDbG9zdXJlVG9vbFRpcCkpOwotCQkvLyBjbG9zdXJlQnV0dG9uLnNldFRleHQoIiIpOwotCi0JCXJlZnJlc2hCdXR0b24gPSB0b29sa2l0LmNyZWF0ZUJ1dHRvbihidXR0b25Db21wb3NpdGUsICIiLCBTV1QuUFVTSCk7IC8vJE5PTi1OTFMtMSQKLQkJcmVmcmVzaEJ1dHRvbi5zZXRJbWFnZShBdXRob3JpbmdVSUltYWdlcy5JTUdfUkVGUkVTSCk7Ci0JCXJlZnJlc2hCdXR0b24uc2V0VG9vbFRpcFRleHQoQXV0aG9yaW5nVUlSZXNvdXJjZXMucmVmcmVzaEJ1dHRvbl90ZXh0KTsKLQkJewotCQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRU5ECi0JCQkJCXwgR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9FTkQpOwotCQkJZ2QuaG9yaXpvbnRhbEFsaWdubWVudCA9IDM7Ci0JCQlnZC5ob3Jpem9udGFsU3BhbiA9IDE7Ci0JCQlyZWZyZXNoQnV0dG9uLnNldExheW91dERhdGEoZ2QpOwotCQl9Ci0JCXJlZnJlc2hCdXR0b24uZ2V0QWNjZXNzaWJsZSgpLmFkZEFjY2Vzc2libGVMaXN0ZW5lcihuZXcgQXV0aG9yaW5nQWNjZXNzaWJsZUxpc3RlbmVyKAotCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLnJlZnJlc2hCdXR0b25fdGV4dCkpOwotCi0JCS8vIENyZWF0ZSBWaWV3ZXIgYW5kIEhhbmRsZSBMaXN0ZW5lciBmb3IgdGhlIHZpZXdlci4KLQkJY3JlYXRlVmlld2Vycyh0b29sa2l0LCBzZWN0aW9uQ2xpZW50KTsKLQotCQlMYWJlbCBlbGVtRGVzcExhYmVsID0gdG9vbGtpdAotCQkJCS5jcmVhdGVMYWJlbChzZWN0aW9uQ2xpZW50LCBBdXRob3JpbmdVSVJlc291cmNlcy5Db25maWd1cmF0aW9uUGFnZV9EZXNjcmlwdGlvbik7IAotCQlHcmlkRGF0YSBnZDEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ2QxLmhvcml6b250YWxTcGFuID0gNjsKLQkJZWxlbURlc3BMYWJlbC5zZXRMYXlvdXREYXRhKGdkMSk7Ci0KLQkJZWxlbURlc3BDb250ZW50VGV4dCA9IHRvb2xraXQuY3JlYXRlVGV4dChzZWN0aW9uQ2xpZW50LCAiIiwgU1dULk5PTkUgLy8kTk9OLU5MUy0xJAotCQkJCXwgU1dULk1VTFRJIHwgU1dULlJFQURfT05MWSB8IFNXVC5XUkFQKTsKLQkJR3JpZERhdGEgZ2QyID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCWdkMi5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQkJZ2QyLmhvcml6b250YWxTcGFuID0gNjsKLQkJZ2QyLmhlaWdodEhpbnQgPSA1MDsKLQotCQl0b29sa2l0LnBhaW50Qm9yZGVyc0ZvcihzZWN0aW9uQ2xpZW50KTsKLQkJdG9vbGtpdC5wYWludEJvcmRlcnNGb3IoYnV0dG9uQ29tcG9zaXRlKTsKLQkJZWxlbURlc3BDb250ZW50VGV4dC5zZXRMYXlvdXREYXRhKGdkMik7Ci0JCQotCQkvLyBzZXQgdGV4dCB3aWRnZXQgdG8gdmlld2VycyBzbyB0aGV5IGNhbiB1cGRhdGUgZGVzY3JpcHRpb24gZmllbGQKLQkJY29uZmlnVmlld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcih0cmVlU2VsZWN0aW9uTGlzdGVuZXIpOwotCQlhZGRDYXRlZ29yeVZpZXdlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIodHJlZVNlbGVjdGlvbkxpc3RlbmVyKTsKLQkJc3ViQ2F0ZWdvcnlWaWV3ZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKHRyZWVTZWxlY3Rpb25MaXN0ZW5lcik7Ci0KLQkJaGlkZUJ1dHRvbi5zZXRFbmFibGVkKHRydWUpOwotCQloaWRlQnV0dG9uLnNldFZpc2libGUodHJ1ZSk7Ci0JCXJlZnJlc2hCdXR0b24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJcmVmcmVzaEJ1dHRvbi5zZXRWaXNpYmxlKHRydWUpOwotCQlmaXhXYXJuaW5nQnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCWZpeFdhcm5pbmdCdXR0b24uc2V0VmlzaWJsZSh0cnVlKTsKLQkJY2xvc3VyZUJ1dHRvbi5zZXRFbmFibGVkKHRydWUpOwotCQljbG9zdXJlQnV0dG9uLnNldFZpc2libGUodHJ1ZSk7Ci0JfQotCi0KLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZVZpZXdlcnNTZWxlY3Rpb24oKSB7Ci0JCWluaXRpYWxpemVDb25maWdGYWN0b3J5KCk7Ci0KLSAgICAJTGlzdDxNZXRob2RQYWNrYWdlPiBwYWNrYWdlcyA9IG5ldyBBcnJheUxpc3Q8TWV0aG9kUGFja2FnZT4oY29uZmlnLmdldE1ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKSk7Ci0vLyAgICAJTGlzdDxNZXRob2RQbHVnaW4+IHBsdWdpbnMgPSBuZXcgQXJyYXlMaXN0PE1ldGhvZFBsdWdpbj4oY29uZmlnLmdldE1ldGhvZFBsdWdpblNlbGVjdGlvbigpKTsKLS8vICAgIAlpbml0aWFsaXplVmlld2VyU2VsZWN0aW9uKGNvbmZpZ1ZpZXdlciwgcGx1Z2lucyk7Ci0gICAgCWluaXRpYWxpemVWaWV3ZXJTZWxlY3Rpb24oY29uZmlnVmlld2VyLCBwYWNrYWdlcyk7Ci0JCQotCQkvLyByZWFkIGZyb20gY29uZmlnIGFuZCBjaGVjayB0aGUgYXBwcm9wcmlhdGUgaXRlbXMgaW4gdGhlIENDIHZpZXdlcnMKLQkJTGlzdDxDb250ZW50Q2F0ZWdvcnk+IGFkZENhdHMgPSBuZXcgQXJyYXlMaXN0PENvbnRlbnRDYXRlZ29yeT4oY29uZmlnLmdldEFkZGVkQ2F0ZWdvcnkoKSk7Ci0JCWluaXRpYWxpemVWaWV3ZXJTZWxlY3Rpb24oYWRkQ2F0ZWdvcnlWaWV3ZXIsIGFkZENhdHMpOwotICAgIAlMaXN0PENvbnRlbnRDYXRlZ29yeT4gc3ViQ2F0cyA9IG5ldyBBcnJheUxpc3Q8Q29udGVudENhdGVnb3J5Pihjb25maWcuZ2V0U3VidHJhY3RlZENhdGVnb3J5KCkpOwotICAgIAlpbml0aWFsaXplVmlld2VyU2VsZWN0aW9uKHN1YkNhdGVnb3J5Vmlld2VyLCBzdWJDYXRzKTsKLSAgICAJCi0JfQotCQotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplVmlld2VyU2VsZWN0aW9uKENvbnRhaW5lckNoZWNrZWRUcmVlVmlld2VyIHZpZXdlciwgTGlzdDw/IGV4dGVuZHMgT2JqZWN0PiBlbGVtZW50cykgewotCQlpZiAoIWVsZW1lbnRzLmlzRW1wdHkoKSkKLQkJCXZpZXdlci5zZXRDaGVja2VkRWxlbWVudHMoZWxlbWVudHMudG9BcnJheSgpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlVmlld2VycyhGb3JtVG9vbGtpdCB0b29sa2l0LCBDb21wb3NpdGUgc2VjdGlvbkNsaWVudCkgewotCQlDb21wb3NpdGUgY29uZmlnVmlld2VyTGFiZWxDb21wb3NpdGUgPSB0b29sa2l0LmNyZWF0ZUNvbXBvc2l0ZShzZWN0aW9uQ2xpZW50KTsKLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5FTkQsIHRydWUsIGZhbHNlKTsKLQkJY29uZmlnVmlld2VyTGFiZWxDb21wb3NpdGUuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCWdkLmhvcml6b250YWxTcGFuID0gMTsKLQkJY29uZmlnVmlld2VyTGFiZWxDb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDMsIGZhbHNlKSk7Ci0KLQkJQ29tcG9zaXRlIGFkZENhdHNWaWV3ZXJMYWJlbENvbXBvc2l0ZSA9IHRvb2xraXQuY3JlYXRlQ29tcG9zaXRlKHNlY3Rpb25DbGllbnQpOwotCQlnZCA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkVORCwgdHJ1ZSwgZmFsc2UpOwotCQlhZGRDYXRzVmlld2VyTGFiZWxDb21wb3NpdGUuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCWdkLmhvcml6b250YWxTcGFuID0gMTsKLQkJYWRkQ2F0c1ZpZXdlckxhYmVsQ29tcG9zaXRlLnNldExheW91dChuZXcgR3JpZExheW91dCgzLCBmYWxzZSkpOwotCQkKLQkJLy8gY3JlYXRlIHRoZSBsaWJyYXJ5IHRyZWUgdmlld2VyCi0JCWNvbmZpZ1ZpZXdlciA9IG5ldyBNZXRob2RDb250YWluZXJDaGVja2VkVHJlZVZpZXdlcihzZWN0aW9uQ2xpZW50KTsKLQkJZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RICi0JCQkJfCBHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwpOwotCQlnZC5oZWlnaHRIaW50ID0gMjAwOwotCQlnZC52ZXJ0aWNhbFNwYW4gPSAzOwotCQljb25maWdWaWV3ZXIuZ2V0VHJlZSgpLnNldExheW91dERhdGEoZ2QpOwotCi0JCWNvbnRQcm92aWRlciA9IG5ldyBDb25maWdQYWNrYWdlQ29udGVudFByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQkJY29uZmlnVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihjb250UHJvdmlkZXIpOwotCQlsYWJlbFByb3ZpZGVyID0gbmV3IENvbmZpZ1BhY2thZ2VMYWJlbFByb3ZpZGVyKGNvbnRQcm92aWRlcik7Ci0JCWNvbmZpZ1ZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKGxhYmVsUHJvdmlkZXIpOwotCQljcmVhdGVWaWV3ZXJMYWJlbEFuZEJ1dHRvbnModG9vbGtpdCwgY29uZmlnVmlld2VyTGFiZWxDb21wb3NpdGUsCi0JCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuQ29uZmlndXJhdGlvblBhZ2VfVHJlZVRpdGxlTGFiZWwsIGNvbmZpZ1ZpZXdlcik7Ci0KLQkJCi0JCQotCQlhZGRDYXRlZ29yeVZpZXdlciA9IG5ldyBNZXRob2RDb250YWluZXJDaGVja2VkVHJlZVZpZXdlcjIoc2VjdGlvbkNsaWVudCk7Ci0JCWdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCB8IEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTCk7Ci0JCWdkLmhlaWdodEhpbnQ9IDIwMDsKLQkJYWRkQ2F0ZWdvcnlWaWV3ZXIuZ2V0VHJlZSgpLnNldExheW91dERhdGEoZ2QpOwotCQlhZGRDYXRlZ29yeVZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIobmV3IENhdGVnb3J5Q29udGVudFByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5LCBjb25maWcpKTsKLQkJYWRkQ2F0ZWdvcnlWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihuZXcgQ2F0ZWdvcnlMYWJlbFByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5KSk7Ci0KLQkJY3JlYXRlVmlld2VyTGFiZWxBbmRCdXR0b25zKHRvb2xraXQsIGFkZENhdHNWaWV3ZXJMYWJlbENvbXBvc2l0ZSwKLQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5Db25maWd1cmF0aW9uUGFnZV9BZGRDYXRlZ29yaWVzVGl0bGVMYWJlbCwgYWRkQ2F0ZWdvcnlWaWV3ZXIpOwotCQotCQlDb21wb3NpdGUgc3ViQ2F0c1ZpZXdlckxhYmVsQ29tcG9zaXRlID0gdG9vbGtpdC5jcmVhdGVDb21wb3NpdGUoc2VjdGlvbkNsaWVudCk7Ci0JCWdkID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRU5ELCB0cnVlLCBmYWxzZSk7Ci0JCXN1YkNhdHNWaWV3ZXJMYWJlbENvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGdkKTsKLQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSAxOwotCQlzdWJDYXRzVmlld2VyTGFiZWxDb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDMsIGZhbHNlKSk7Ci0JCQotCQlzdWJDYXRlZ29yeVZpZXdlciA9IG5ldyBNZXRob2RDb250YWluZXJDaGVja2VkVHJlZVZpZXdlcjIoc2VjdGlvbkNsaWVudCk7Ci0JCWdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCB8IEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTCk7Ci0JCWdkLmhlaWdodEhpbnQ9IDIwMDsKLQkJc3ViQ2F0ZWdvcnlWaWV3ZXIuZ2V0VHJlZSgpLnNldExheW91dERhdGEoZ2QpOwotCQlzdWJDYXRlZ29yeVZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIobmV3IENhdGVnb3J5Q29udGVudFByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5LCBjb25maWcpKTsKLQkJc3ViQ2F0ZWdvcnlWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihuZXcgQ2F0ZWdvcnlMYWJlbFByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5KSk7Ci0JCWNyZWF0ZVZpZXdlckxhYmVsQW5kQnV0dG9ucyh0b29sa2l0LCBzdWJDYXRzVmlld2VyTGFiZWxDb21wb3NpdGUsCi0JCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuQ29uZmlndXJhdGlvblBhZ2VfU3ViQ2F0ZWdvcmllc1RpdGxlTGFiZWwsIHN1YkNhdGVnb3J5Vmlld2VyKTsKLQkJCi0JCS8vIGFkZCBsaXN0ZW5lciBzbyB0aGUgMiBDYXRlZ29yeSB2aWV3ZXJzIGFyZSBpbiBzeW5jCi0JCS8vIHRoYXQgaXMsIHdoZW4gYW4gaXRlbSBpcyBjaGVja2VkIGluIG9uZSwgaXQgaXMgdW5jaGVja2VkIGluIHRoZSBvdGhlcgotCQlhZGRDYXRlZ29yeVZpZXdlci5hZGRDaGVja1N0YXRlTGlzdGVuZXIobmV3IElDaGVja1N0YXRlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBjaGVja1N0YXRlQ2hhbmdlZChmaW5hbCBDaGVja1N0YXRlQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJLy9Qb3RlbnRpYWxseSBsb25nIG9wZXJhdGlvbiAtIHNob3cgYSBidXN5IGN1cnNvcgotCQkJCUJ1c3lJbmRpY2F0b3Iuc2hvd1doaWxlKHN1YkNhdGVnb3J5Vmlld2VyLmdldFRyZWUoKS5nZXREaXNwbGF5KCksIG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJaWYgKGV2ZW50LmdldENoZWNrZWQoKSkKLQkJCQkJCQlzdWJDYXRlZ29yeVZpZXdlci5zZXRDaGVja2VkKGV2ZW50LmdldEVsZW1lbnQoKSwgZmFsc2UpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQl9Ci0JCX0pOwotCi0JCXN1YkNhdGVnb3J5Vmlld2VyLmFkZENoZWNrU3RhdGVMaXN0ZW5lcihuZXcgSUNoZWNrU3RhdGVMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGNoZWNrU3RhdGVDaGFuZ2VkKGZpbmFsIENoZWNrU3RhdGVDaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQkvL1BvdGVudGlhbGx5IGxvbmcgb3BlcmF0aW9uIC0gc2hvdyBhIGJ1c3kgY3Vyc29yCi0JCQkJQnVzeUluZGljYXRvci5zaG93V2hpbGUoYWRkQ2F0ZWdvcnlWaWV3ZXIuZ2V0VHJlZSgpLmdldERpc3BsYXkoKSwgbmV3IFJ1bm5hYmxlKCkgewotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQlpZiAoZXZlbnQuZ2V0Q2hlY2tlZCgpKQotCQkJCQkJCWFkZENhdGVnb3J5Vmlld2VyLnNldENoZWNrZWQoZXZlbnQuZ2V0RWxlbWVudCgpLCBmYWxzZSk7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVWaWV3ZXJMYWJlbEFuZEJ1dHRvbnMoRm9ybVRvb2xraXQgdG9vbGtpdCwgQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIHRleHQsIGZpbmFsIFRyZWVWaWV3ZXIgdmlld2VyKSB7Ci0JCUxhYmVsIGxhYmVsID0gdG9vbGtpdC5jcmVhdGVMYWJlbChwYXJlbnQsIHRleHQpOwotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkVORCwgdHJ1ZSwgZmFsc2UpOwotCQlsYWJlbC5zZXRMYXlvdXREYXRhKGdkKTsKLQkJCi0JCUJ1dHRvbiBleHBhbmRCdXR0b24gPSB0b29sa2l0LmNyZWF0ZUJ1dHRvbihwYXJlbnQsIG51bGwsIFNXVC5QVVNIKTsKLQkJZ2QgPSBuZXcgR3JpZERhdGEoU1dULlJJR0hULCBTV1QuRU5ELCBmYWxzZSwgZmFsc2UpOwotCQlleHBhbmRCdXR0b24uc2V0TGF5b3V0RGF0YShnZCk7Ci0JCWV4cGFuZEJ1dHRvbi5zZXRJbWFnZShBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0U2hhcmVkSW1hZ2UoImV4cGFuZGFsbC5naWYiKSk7IC8vJE5PTi1OTFMtMSQKLQkJZXhwYW5kQnV0dG9uLnNldFRvb2xUaXBUZXh0KEF1dGhvcmluZ1VJUmVzb3VyY2VzLkZpbHRlckRpYWxvZ19FeHBhbmRBbGwpOyAKLQkJZXhwYW5kQnV0dG9uLmdldEFjY2Vzc2libGUoKS5hZGRBY2Nlc3NpYmxlTGlzdGVuZXIobmV3IEF1dGhvcmluZ0FjY2Vzc2libGVMaXN0ZW5lcigKLQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLkZpbHRlckRpYWxvZ19FeHBhbmRBbGwpKTsKLQkJCi0JCWV4cGFuZEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKXsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJd2lkZ2V0U2VsZWN0ZWQoZSk7Ci0JCQl9Ci0JCQkKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQl2aWV3ZXIuZXhwYW5kQWxsKCk7Ci0JCQl9Ci0JCX0pOwotCi0KLQkJQnV0dG9uIGNvbGxhcHNlQnV0dG9uID0gdG9vbGtpdC5jcmVhdGVCdXR0b24ocGFyZW50LCBudWxsLCBTV1QuUFVTSCk7Ci0JCWdkID0gbmV3IEdyaWREYXRhKFNXVC5SSUdIVCwgU1dULkVORCwgZmFsc2UsIGZhbHNlKTsKLQkJY29sbGFwc2VCdXR0b24uc2V0TGF5b3V0RGF0YShnZCk7Ci0JCWNvbGxhcHNlQnV0dG9uLnNldEltYWdlKEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRTaGFyZWRJbWFnZSgiY29sbGFwc2VhbGwuZ2lmIikpOyAvLyROT04tTkxTLTEkCi0JCWNvbGxhcHNlQnV0dG9uLnNldFRvb2xUaXBUZXh0KEF1dGhvcmluZ1VJUmVzb3VyY2VzLkZpbHRlckRpYWxvZ19Db2xsYXBzZUFsbCk7IAotCQljb2xsYXBzZUJ1dHRvbi5nZXRBY2Nlc3NpYmxlKCkuYWRkQWNjZXNzaWJsZUxpc3RlbmVyKG5ldyBBdXRob3JpbmdBY2Nlc3NpYmxlTGlzdGVuZXIoCi0JCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuRmlsdGVyRGlhbG9nX0NvbGxhcHNlQWxsKSk7Ci0JCWNvbGxhcHNlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpewotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQl3aWRnZXRTZWxlY3RlZChlKTsKLQkJCX0KLQkJCQotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCXZpZXdlci5jb2xsYXBzZUFsbCgpOwotCQkJfQotCQl9KTsKLQotCX0KLQotCQotCXByaXZhdGUgdm9pZCByZUluaXRpYWxpemVDb25maWdGYWN0b3J5KCkgewotCQkvLyB0aGUgZm9sbG93aW5nIG1heSBub3QgYmUgdGhlIG1vc3QgZWZmaWNpZW50IHdheQotCQkvLyBuZWVkIGEgZmFzdCB3YXkgdG8gdXBkYXRlIHRoZSBjbG9zdXJlCi0vLwkJU3lzdGVtLm91dC5wcmludGxuKCIkJCQgcmVJbml0IGNsb3N1cmUgZm9yIGNvbmZpZyBhZGQgbm90aWZpY2F0aW9uISIpOwotCi0JCWNyZWF0ZUNvbmZpZ3VyYXRpb25DbG9zdXJlKCk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVDb25maWd1cmF0aW9uQ2xvc3VyZSgpIHsKLQkJY2xvc3VyZSA9IG5ldyBDb25maWd1cmF0aW9uQ2xvc3VyZShhY3Rpb25NZ3IsIGNvbmZpZyk7Ci0JCWNsb3N1cmUuYWRkTGlzdGVuZXIoY2xvc3VyZUxpc3RlbmVyKTsKLQkJaWYgKGxhYmVsUHJvdmlkZXIgIT0gbnVsbCkgewotCQkJbGFiZWxQcm92aWRlci5zZXRDbG9zdXJlKGNsb3N1cmUpOwotCQl9Ci0JfQotCi0KLQkvKioKLQkgKiBTZXQgaW5wdXQgZm9yIGNvbm5maWd1cmF0aW9uIHZpZXdlcgotCSAqIEBwYXJhbSBpbnB1dAotCSAqLwotCXByaXZhdGUgdm9pZCBzZXRJbnB1dChPYmplY3QgaW5wdXQpIHsKLQkJY29uZmlnVmlld2VyLnNldElucHV0KGlucHV0KTsKLQkJYWRkQ2F0ZWdvcnlWaWV3ZXIuc2V0SW5wdXQoaW5wdXQpOwotCQlzdWJDYXRlZ29yeVZpZXdlci5zZXRJbnB1dChpbnB1dCk7Ci0JCQotCQljb25maWdWaWV3ZXIuZXhwYW5kQWxsKCk7Ci0JCWNvbmZpZ1ZpZXdlci5jb2xsYXBzZUFsbCgpOwotCQlhZGRDYXRlZ29yeVZpZXdlci5leHBhbmRBbGwoKTsKLQkJYWRkQ2F0ZWdvcnlWaWV3ZXIuY29sbGFwc2VBbGwoKTsKLQkJc3ViQ2F0ZWdvcnlWaWV3ZXIuZXhwYW5kQWxsKCk7Ci0JCXN1YkNhdGVnb3J5Vmlld2VyLmNvbGxhcHNlQWxsKCk7Ci0KLS8vCQl1cGRhdGVDaGVja1N0YXRlcygpOwotCX0KLQotCXByaXZhdGUgdm9pZCByZWZyZXNoVmlld2VycygpIHsKLQkJY29uZmlnVmlld2VyLnJlZnJlc2goKTsKLQkJYWRkQ2F0ZWdvcnlWaWV3ZXIucmVmcmVzaCgpOwotCQlzdWJDYXRlZ29yeVZpZXdlci5yZWZyZXNoKCk7Ci0JfQotCQotCQotCXByb3RlY3RlZCB2b2lkIHNob3dIaWRlRWxlbWVudHMoKSB7Ci0JCWNvbmZpZ1ZpZXdlckhpZGVVbmNoZWNrZWRGaWx0ZXIudG9nZ2xlSGlkZVVuY2hlY2tlZCgpOwotCQlhZGRDYXRlZ29yeUhpZGVVbmNoZWNrZWRGaWx0ZXIudG9nZ2xlSGlkZVVuY2hlY2tlZCgpOwotCQlzdWJDYXRlZ29yeUhpZGVVbmNoZWNrZWRGaWx0ZXIudG9nZ2xlSGlkZVVuY2hlY2tlZCgpOwotCQlyZWZyZXNoVmlld2VycygpOwotLy8JCXVwZGF0ZUNoZWNrU3RhdGVzKCk7IC8vIG5lZGVkIHRvIGhhdmUgdGhpcyB0byB1cGRhdGUgdGhlIGNoZWNrIHN0YXR1cwotCX0KLQkKLQkvKioKLQkgKiBJbml0aWFsaXplIGNvbmZpZ3VyYXRpb24gZmFjdG9yeQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVDb25maWdGYWN0b3J5KCkgewotCQkvLyBsb2FkaW5nIHRoZSBjb25maWd1cmF0aW9uIGNsb3N1cmUgbWlnaHQgYmUgc2xvdywKLQkJLy8gZGlzcGxheSBhIHByb2dyZXNzIGJhcgotCQlvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuSVJ1bm5hYmxlV2l0aFByb2dyZXNzIHJ1bm5hYmxlID0gbmV3IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5JUnVubmFibGVXaXRoUHJvZ3Jlc3MoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQotCQkJCQl0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQkJCWNyZWF0ZUNvbmZpZ3VyYXRpb25DbG9zdXJlKCk7Ci0JCQl9Ci0KLQkJfTsKLQotCQlVc2VySW50ZXJhY3Rpb25IZWxwZXIucnVuV2l0aFByb2dyZXNzKHJ1bm5hYmxlLCBBdXRob3JpbmdVSVJlc291cmNlcy5Db25maWd1cmF0aW9uUGFnZV9Mb2FkaW5nTWVzc2FnZSk7IAotCi0JCWNvbmZpZ1ZpZXdlckhpZGVVbmNoZWNrZWRGaWx0ZXIgPSBuZXcgSGlkZVVuY2hlY2tlZFZpZXdlckZpbHRlcihjb25maWdWaWV3ZXIpOwotCQljb25maWdWaWV3ZXIuYWRkRmlsdGVyKGNvbmZpZ1ZpZXdlckhpZGVVbmNoZWNrZWRGaWx0ZXIpOwotCQlhZGRDYXRlZ29yeUhpZGVVbmNoZWNrZWRGaWx0ZXIgPSBuZXcgSGlkZVVuY2hlY2tlZFZpZXdlckZpbHRlcihhZGRDYXRlZ29yeVZpZXdlcik7Ci0JCWFkZENhdGVnb3J5Vmlld2VyLmFkZEZpbHRlcihhZGRDYXRlZ29yeUhpZGVVbmNoZWNrZWRGaWx0ZXIpOwotCQlzdWJDYXRlZ29yeUhpZGVVbmNoZWNrZWRGaWx0ZXIgPSBuZXcgSGlkZVVuY2hlY2tlZFZpZXdlckZpbHRlcihzdWJDYXRlZ29yeVZpZXdlcik7Ci0JCXN1YkNhdGVnb3J5Vmlld2VyLmFkZEZpbHRlcihzdWJDYXRlZ29yeUhpZGVVbmNoZWNrZWRGaWx0ZXIpOwotCQkKLQl9Ci0KLQkKLQlwcml2YXRlIHZvaWQgYWRkTGlzdGVuZXJzKCkgewotCQloaWRlRXJyb3JCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJaGFuZGxlSGlkZXNCdXR0b25XaWRnZXRTZWxlY3RlZChlLAotCQkJCQkJTWV0aG9kRWxlbWVudFByb3BlcnR5SGVscGVyLkNPTkZJR19QUk9QQkxFTV9ISURFX0VSUk9SUyk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJaGlkZVdhcm5CdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJaGFuZGxlSGlkZXNCdXR0b25XaWRnZXRTZWxlY3RlZChlLAotCQkJCQkJTWV0aG9kRWxlbWVudFByb3BlcnR5SGVscGVyLkNPTkZJR19QUk9QQkxFTV9ISURFX1dBUk5JTkdTKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQloaWRlSW5mb0J1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQloYW5kbGVIaWRlc0J1dHRvbldpZGdldFNlbGVjdGVkKGUsCi0JCQkJCQlNZXRob2RFbGVtZW50UHJvcGVydHlIZWxwZXIuQ09ORklHX1BST1BCTEVNX0hJREVfSU5GT1MpOwotCQkJfQotCQl9KTsKLQkJCi0JCWNsb3N1cmVCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCQotCQkJCUJ1c3lJbmRpY2F0b3Iuc2hvd1doaWxlKGZvcm0uZ2V0RGlzcGxheSgpLCBuZXcgUnVubmFibGUoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCW1ha2VDbG9zdXJlKCk7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCX07Ci0JCX0pOwotCQlmaXhXYXJuaW5nQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlCdXN5SW5kaWNhdG9yLnNob3dXaGlsZShmb3JtLmdldERpc3BsYXkoKSwgbmV3IFJ1bm5hYmxlKCkgewotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQlmaXhXYXJuaW5nKCk7Ci0JCQkJCX0KLQkJCQl9KTsJCQkJCi0JCQl9OwotCQl9KTsKLQkJcmVmcmVzaEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJQnVzeUluZGljYXRvci5zaG93V2hpbGUoZm9ybS5nZXREaXNwbGF5KCksIG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJc2F2ZUNvbmZpZ3VyYXRpb24oKTsKLQkJCQkJCXNob3dFcnJvcnMoKTsKLQkJCQkJfQotCQkJCX0pOwkJCQkKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCX0KLQkJfSk7Ci0JCWhpZGVCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCXNob3dIaWRlRWxlbWVudHMoKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCX0KLQkJfSk7Ci0KLQkJLy8gYWRkIGEgY2hlY2sgc3RhdGUgY2hhbmdlIGxpc3RlbmVyCi0JCUlDaGVja1N0YXRlTGlzdGVuZXIgY29uZmlnQ2hlY2tTdGF0ZUxpc3RlbmVyID0gbmV3IElDaGVja1N0YXRlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBjaGVja1N0YXRlQ2hhbmdlZChDaGVja1N0YXRlQ2hhbmdlZEV2ZW50IGV2dCkgewotCQkJCQotCQkJCUJ1c3lJbmRpY2F0b3Iuc2hvd1doaWxlKGZvcm0uZ2V0RGlzcGxheSgpLCBuZXcgUnVubmFibGUoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCWlmICh1cGRhdGVPbkNsaWNrLmdldFNlbGVjdGlvbigpKSB7Ci0JCQkJCQkJc2F2ZUNvbmZpZ3VyYXRpb24oKTsKLQkJCQkJCQkvLyB1cGRhdGUgdGhlIGNsb3N1cmUgZXJyb3IKLQkJCQkJCQlzaG93RXJyb3JzKCk7Ci0JCQkJCQl9Ci0JCQkJCQlhY3Rpb25NZ3IuZXhlY3V0ZShuZXcgTWV0aG9kRWxlbWVudFNldFByb3BlcnR5Q29tbWFuZChjb25maWcsIFRPVUNIRURfQllfQ09ORklHX0VESVRPUiwgQm9vbGVhbi5UUlVFLnRvU3RyaW5nKCkpKTsKLQkJCQkJfQotCQkJCX0pOwotCQkJCQotCQkJfQotCQl9OwotCQkKLQkJSUNoZWNrU3RhdGVMaXN0ZW5lciBjYXRzQ2hlY2tTdGF0ZUxpc3RlbmVyID0gbmV3IElDaGVja1N0YXRlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBjaGVja1N0YXRlQ2hhbmdlZChDaGVja1N0YXRlQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJCi0JCQkJQnVzeUluZGljYXRvci5zaG93V2hpbGUoZm9ybS5nZXREaXNwbGF5KCksIG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJc2F2ZUNvbnRlbnRDYXRlZ29yeVNlbGVjdGlvbnNUb0NvbmZpZ3VyYXRpb24oKTsKLQkJCQkJCS8vIHVwZGF0ZSB0aGUgY2xvc3VyZSBlcnJvcgotCQkJCQkJc2hvd0Vycm9ycygpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQl9Ci0JCX07Ci0JCQotCQljb25maWdWaWV3ZXIuYWRkQ2hlY2tTdGF0ZUxpc3RlbmVyKGNvbmZpZ0NoZWNrU3RhdGVMaXN0ZW5lcik7Ci0JCWFkZENhdGVnb3J5Vmlld2VyLmFkZENoZWNrU3RhdGVMaXN0ZW5lcihjYXRzQ2hlY2tTdGF0ZUxpc3RlbmVyKTsKLQkJc3ViQ2F0ZWdvcnlWaWV3ZXIuYWRkQ2hlY2tTdGF0ZUxpc3RlbmVyKGNhdHNDaGVja1N0YXRlTGlzdGVuZXIpOwotCi0JCS8vIGxpc3RlbiB0byB0aGUgbGlicmFyeSBjaGFuZ2VzIGFuZCBhdXRvbWF0aWNhbGx5IHVwZGF0ZSB0aGUKLQkJLy8gY29uZmlndXJhdGlvbiB2aWV3Ci0JCWxpYkxpc3RlbmVyID0gbmV3IElMaWJyYXJ5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBsaWJyYXJ5Q2hhbmdlZChpbnQgb3B0aW9uLCBDb2xsZWN0aW9uPE9iamVjdD4gY2hhbmdlZEl0ZW1zKSB7Ci0JCQkJLy8gZm9yIHBlcmZvcm1hbmNlIHJlYXNvbiwgd2Ugc2hvdWxkIG5vdCByZXNwb25zZSB0byBldmVyeQotCQkJCS8vIGxpYnJhcnkgY2hhbmdlCi0JCQkJLy8gb25seSBjb3ZlciBwYWNrYWdlIGFuZCBwbHVnaW4gY2hhbmdlcwotCQkJCWlmIChvcHRpb24gPT0gSUxpYnJhcnlDaGFuZ2VMaXN0ZW5lci5PUFRJT05fREVMRVRFRAotCQkJCQkJfHwgb3B0aW9uID09IElMaWJyYXJ5Q2hhbmdlTGlzdGVuZXIuT1BUSU9OX05FV0NISUxECi0JCQkJCQl8fCBvcHRpb24gPT0gSUxpYnJhcnlDaGFuZ2VMaXN0ZW5lci5PUFRJT05fTkVXQ0hJTEQpIHsKLQkJCQkJaWYgKGNoYW5nZWRJdGVtcyAhPSBudWxsICYmIGNoYW5nZWRJdGVtcy5zaXplKCkgPiAwKSB7Ci0JCQkJCQlPYmplY3QgbyA9IGNoYW5nZWRJdGVtcy50b0FycmF5KClbMF07Ci0JCQkJCQlpZiAobyBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbgotCQkJCQkJCQl8fCBvIGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudAotCQkJCQkJCQl8fCBvIGluc3RhbmNlb2YgTWV0aG9kUGFja2FnZQotCQkJCQkJCQl8fCBvIGluc3RhbmNlb2YgQ3VzdG9tQ2F0ZWdvcnkpIHsKLQkJCQkJCQlyZUluaXRpYWxpemVDb25maWdGYWN0b3J5KCk7Ci0JCQkJCQkJcmVmcmVzaFZpZXdlcnMoKTsKLS8vCQkJCQkJCXVwZGF0ZUNoZWNrU3RhdGVzKCk7Ci0JCQkJCQkJc2hvd0Vycm9ycygpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9OwotCi0JCUlMaWJyYXJ5TWFuYWdlciBtYW5hZ2VyID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TGlicmFyeU1hbmFnZXIoKTsKLQkJaWYgKG1hbmFnZXIgIT0gbnVsbCkgewotCQkJbWFuYWdlci5hZGRMaXN0ZW5lcihsaWJMaXN0ZW5lcik7Ci0JCX0KLQkJCi0JCS8vIGxpc3RlbiB0byBwbHVnaW4gcHJlc2VudGF0aW9uIGxheW91dCBjaGFuZ2VzCi0JCVBsdWdpblVJUGFja2FnZUNvbnRleHQuSU5TVEFOQ0UuYWRkTGlzdGVuZXIobGF5b3V0TGlzdGVuZXIpOwotCX0KLQkKLQljbGFzcyBTaG93RXJyb3JKb2IgZXh0ZW5kcyBKb2IgewotCQkKLQkJcHVibGljIFNob3dFcnJvckpvYihTdHJpbmcgbmFtZSkgewotCQkJc3VwZXIobmFtZSk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIElTdGF0dXMgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkJLy8gc2F2ZSB0aGUgcHJldmlvdXMgaW52YWxpZCBlbGVtZW50cwotCQkJZmluYWwgTGlzdDxPYmplY3Q+IGludmFsaWQgPSBjbG9zdXJlLmdldEludmFsaWRFbGVtZW50cygpOwotCQkJY2xvc3VyZS5jaGVja0Vycm9yKCk7Ci0JCQlpZiAoY2xvc3VyZS5pc0Fib3J0Q2hlY2tFcnJvcigpKSB7Ci0JCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCQl9Ci0JCQkKLQkJCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0RGlzcGxheSgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQlpZiAoY29uZmlnVmlld2VySGlkZVVuY2hlY2tlZEZpbHRlci5pc0hpZGVVbmNoZWNrZWQoKSkgewotCQkJCQkJY29uZmlnVmlld2VyLnJlZnJlc2goKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCS8vIGdldCB0aGUgbmV3IGVycm9yIGVsZW1lbnRzLCBhZGQgdG8gdGhlIHByZXZpb3VzIGVycm9yIGVsZW1lbnRzLAotCQkJCQkJLy8gYW5kIHVwZGF0ZSB0aGVtIHRvIHVwZGF0ZSB0aGUgZXJyb3Ivd2FybmluZyBpbWFnZXMKLQkJCQkJCWludmFsaWQuYWRkQWxsKGNsb3N1cmUuZ2V0SW52YWxpZEVsZW1lbnRzKCkpOwotCi0JCQkJCQkvLyBhbHNvIGFkZCB0aGUgVUkgZm9sZGVycwotCQkJCQkJQ29uZmlnUGFja2FnZUNvbnRlbnRQcm92aWRlciBjcCA9IChDb25maWdQYWNrYWdlQ29udGVudFByb3ZpZGVyKSBjb25maWdWaWV3ZXIKLQkJCQkJCQkJLmdldENvbnRlbnRQcm92aWRlcigpOwotCQkJCQkJaW52YWxpZC5hZGRBbGwoY3AuZ2V0VUlFbGVtZW50cygpKTsKLQotCQkJCQkJY29uZmlnVmlld2VyLnVwZGF0ZShpbnZhbGlkLnRvQXJyYXkoKSwgbnVsbCk7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCX0pOwotCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCX0KLQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzaG93RXJyb3JzKCkgewotCQlpZiAoY2xvc3VyZS5pc0Fib3J0Q2hlY2tFcnJvcigpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCWlmIChzaG93RXJyb3JKb2IuZ2V0U3RhdGUoKSA9PSBKb2IuUlVOTklORykgewotCQkJY2xvc3VyZS5zZXRBYm9ydENoZWNrRXJyb3IodHJ1ZSk7Ci0JCX0KLQotCQlpZiAoISBzaG93RXJyb3JKb2IuY2FuY2VsKCkpIHsKLQkJCXRyeSB7Ci0JCQkJc2hvd0Vycm9ySm9iLmpvaW4oKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CQkJCQkJCQotCQkJfQotCQl9Ci0JCQotCQljbG9zdXJlLnNldEFib3J0Q2hlY2tFcnJvcihmYWxzZSk7Ci0JCXNob3dFcnJvckpvYi5zY2hlZHVsZSgpOwotCX0KLQkKLQkvL29sZCBjb2RlIGZvciBzaG93RXJyb3JzIG1ldGhvZAotCXByb3RlY3RlZCB2b2lkIHNob3dFcnJvcnNfb2xkKCkgewotCQkvLyBzYXZlIHRoZSBwcmV2aW91cyBpbnZhbGlkIGVsZW1lbnRzCi0JCUxpc3Q8T2JqZWN0PiBpbnZhbGlkID0gY2xvc3VyZS5nZXRJbnZhbGlkRWxlbWVudHMoKTsKLQotCQljbG9zdXJlLmNoZWNrRXJyb3IoKTsKLQkJCi0JCWlmIChjb25maWdWaWV3ZXJIaWRlVW5jaGVja2VkRmlsdGVyLmlzSGlkZVVuY2hlY2tlZCgpKSB7Ci0JCQljb25maWdWaWV3ZXIucmVmcmVzaCgpOwotCQl9IGVsc2UgewotCQkJLy8gZ2V0IHRoZSBuZXcgZXJyb3IgZWxlbWVudHMsIGFkZCB0byB0aGUgcHJldmlvdXMgZXJyb3IgZWxlbWVudHMsCi0JCQkvLyBhbmQgdXBkYXRlIHRoZW0gdG8gdXBkYXRlIHRoZSBlcnJvci93YXJuaW5nIGltYWdlcwotCQkJaW52YWxpZC5hZGRBbGwoY2xvc3VyZS5nZXRJbnZhbGlkRWxlbWVudHMoKSk7Ci0KLQkJCS8vIGFsc28gYWRkIHRoZSBVSSBmb2xkZXJzCi0JCQlDb25maWdQYWNrYWdlQ29udGVudFByb3ZpZGVyIGNwID0gKENvbmZpZ1BhY2thZ2VDb250ZW50UHJvdmlkZXIpIGNvbmZpZ1ZpZXdlcgotCQkJCQkuZ2V0Q29udGVudFByb3ZpZGVyKCk7Ci0JCQlpbnZhbGlkLmFkZEFsbChjcC5nZXRVSUVsZW1lbnRzKCkpOwotCi0JCQljb25maWdWaWV3ZXIudXBkYXRlKGludmFsaWQudG9BcnJheSgpLCBudWxsKTsKLQkJfQotCi0JfQotCi0JCi0JLyoqCi0JICogTWFrZSBjb25maWd1cmF0aW9uIGNsb3N1cmUKLQkgKgotCSAqLwotCXByb3RlY3RlZCB2b2lkIG1ha2VDbG9zdXJlKCkgewotCQljbG9zdXJlLmZpeEVycm9ycygpOwotCQlyZWZyZXNoVmlld2VycygpOwotLy8JCXVwZGF0ZUNoZWNrU3RhdGVzKCk7Ci0JCXNhdmVDb25maWd1cmF0aW9uKCk7Ci0KLQl9Ci0KLQkvKioKLQkgKiBGaXggYWxsIHdhcm5pbmdzIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZpeFdhcm5pbmcoKSB7Ci0KLQkJY2xvc3VyZS5maXhQcm9ibGVtcygpOwotCQlyZWZyZXNoVmlld2VycygpOwkKLS8vCQl1cGRhdGVDaGVja1N0YXRlcygpOwotCQlzYXZlQ29uZmlndXJhdGlvbigpOwotCi0JfQotCi0JLyoqCi0JICogU2F2ZSBjb25maWd1cmF0aW9uCi0JICogQHJldHVybgotCSAqIAkJVHJ1ZSBpZiBjb25maWd1cmF0aW9uIGlzIHNhdmUgc3VjY2Vzc2Z1bGx5LCBmYWxzZSBvdGhlcndpc2UKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBzYXZlQ29uZmlndXJhdGlvbigpIHsKLQkJQ29uZmlndXJhdGlvbkRhdGEgY29uZmlnRGF0YSA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLQkJCQkJCQkuZ2V0Q29uZmlndXJhdGlvbk1hbmFnZXIoY29uZmlnKQotCQkJCQkJCQkJLmdldENvbmZpZ3VyYXRpb25EYXRhKCk7Ci0JCQotCQljb25maWdEYXRhLnNldEVuYWJsZVVwZGF0ZShmYWxzZSk7Ci0JCWJvb2xlYW4gcmV0ID0gZG9TYXZlQ29uZmlndXJhdGlvbigpOwotCQljb25maWdEYXRhLnNldEVuYWJsZVVwZGF0ZSh0cnVlKTsKLQotCQlyZXR1cm4gcmV0OwotCX0KLQkKLQlwcml2YXRlIGJvb2xlYW4gZG9TYXZlQ29uZmlndXJhdGlvbigpIHsKLQotCQlib29sZWFuIG9sZE5vdGlmeSA9IGNvbmZpZy5lRGVsaXZlcigpOwotCSAgICB0cnkKLQkgICAgewotCSAgICAJCi0JICAgIAlMaXN0PE1ldGhvZFBhY2thZ2U+IG9sZFBhY2thZ2VzID0gbmV3IEFycmF5TGlzdDxNZXRob2RQYWNrYWdlPihjb25maWcuZ2V0TWV0aG9kUGFja2FnZVNlbGVjdGlvbigpKTsKLQkgICAgCUxpc3Q8TWV0aG9kUGx1Z2luPiBvbGRQbHVnaW5zID0gbmV3IEFycmF5TGlzdDxNZXRob2RQbHVnaW4+KGNvbmZpZy5nZXRNZXRob2RQbHVnaW5TZWxlY3Rpb24oKSk7Ci0JICAgIAkKLQkgICAgCVNldDxNZXRob2RQYWNrYWdlPiBuZXdQYWNrYWdlcyA9IGdldENoZWNrZWRNZXRob2RQYWNrYWdlcyhjb25maWdWaWV3ZXIuZ2V0Q2hlY2tlZEVsZW1lbnRzKCkpOwotCSAgICAJU2V0PE1ldGhvZFBsdWdpbj4gbmV3UGx1Z2lucyA9IGdldENoZWNrZWRNZXRob2RQbHVnaW5zKGNvbmZpZ1ZpZXdlci5nZXRDaGVja2VkRWxlbWVudHMoKSk7Ci0JICAgIAkKLQkgICAgCW9sZFBhY2thZ2VzLnJlbW92ZUFsbChuZXdQYWNrYWdlcyk7Ci0JICAgIAlvbGRQbHVnaW5zLnJlbW92ZUFsbChuZXdQbHVnaW5zKTsKLQkgICAgCQotCSAgICAJbmV3UGFja2FnZXMucmVtb3ZlQWxsKGNvbmZpZy5nZXRNZXRob2RQYWNrYWdlU2VsZWN0aW9uKCkpOwotCSAgICAJbmV3UGx1Z2lucy5yZW1vdmVBbGwoY29uZmlnLmdldE1ldGhvZFBsdWdpblNlbGVjdGlvbigpKTsKLQkgICAgCQotCQkJaWYgKENvbmZpZ3VyYXRpb25VdGlsLnJlbW92ZUNvbGxGcm9tTWV0aG9kUGx1Z2luTGlzdChhY3Rpb25NZ3IsIGNvbmZpZywgb2xkUGx1Z2lucykgPT0gZmFsc2UpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJaWYgKENvbmZpZ3VyYXRpb25VdGlsLnJlbW92ZUNvbGxGcm9tTWV0aG9kUGFja2FnZUxpc3QoYWN0aW9uTWdyLCBjb25maWcsIG9sZFBhY2thZ2VzKSA9PSBmYWxzZSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkKLQkJCWlmIChDb25maWd1cmF0aW9uVXRpbC5hZGRDb2xsVG9NZXRob2RQbHVnaW5MaXN0KGFjdGlvbk1nciwgY29uZmlnLCBuZXdQbHVnaW5zKSA9PSBmYWxzZSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlpZiAoQ29uZmlndXJhdGlvblV0aWwuYWRkQ29sbFRvTWV0aG9kUGFja2FnZUxpc3QoYWN0aW9uTWdyLCBjb25maWcsIG5ld1BhY2thZ2VzKSA9PSBmYWxzZSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCi0JICAgIAkvLyB2YWxpZGF0ZSBiZWZvcmUgc2F2ZQotCQkJTGlicmFyeVV0aWwudmFsaWRhdGVNZXRob2RDb25maWd1cmF0aW9uKGFjdGlvbk1nciwgY29uZmlnKTsKLQotCQkJYWN0aW9uTWdyLmV4ZWN1dGUobmV3IE1ldGhvZEVsZW1lbnRTZXRQcm9wZXJ0eUNvbW1hbmQoY29uZmlnLCBUT1VDSEVEX0JZX0NPTkZJR19FRElUT1IsIEJvb2xlYW4uVFJVRS50b1N0cmluZygpKSk7Ci0KLQkJCXJldHVybiB0cnVlOwotCQkKLQkJfSBmaW5hbGx5IHsKLQkJCWNvbmZpZy5lU2V0RGVsaXZlcihvbGROb3RpZnkpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIFNhdmUgY29uZmlndXJhdGlvbgotCSAqIEByZXR1cm4KLQkgKiAJCVRydWUgaWYgY29uZmlndXJhdGlvbiBpcyBzYXZlIHN1Y2Nlc3NmdWxseSwgZmFsc2Ugb3RoZXJ3aXNlCi0JICovCi0JcHVibGljIGJvb2xlYW4gc2F2ZUNvbnRlbnRDYXRlZ29yeVNlbGVjdGlvbnNUb0NvbmZpZ3VyYXRpb24oKSB7Ci0JCQotICAgIAlMaXN0PENvbnRlbnRDYXRlZ29yeT4gb2xkQWRkQ2F0cyA9IG5ldyBBcnJheUxpc3Q8Q29udGVudENhdGVnb3J5Pihjb25maWcuZ2V0QWRkZWRDYXRlZ29yeSgpKTsKLSAgICAJTGlzdDxDb250ZW50Q2F0ZWdvcnk+IG9sZFN1YkNhdHMgPSBuZXcgQXJyYXlMaXN0PENvbnRlbnRDYXRlZ29yeT4oY29uZmlnLmdldFN1YnRyYWN0ZWRDYXRlZ29yeSgpKTsKLSAgICAJCi0gICAgCVNldDxDb250ZW50Q2F0ZWdvcnk+IG5ld0FkZENhdHMgPSBnZXRDaGVja2VkQ29udGVudENhdGVnb3JpZXMoYWRkQ2F0ZWdvcnlWaWV3ZXIuZ2V0Q2hlY2tCdXROb3RHcmF5ZWRFbGVtZW50cygpKTsKLSAgICAJU2V0PENvbnRlbnRDYXRlZ29yeT4gbmV3U3ViQ2F0cyA9IGdldENoZWNrZWRDb250ZW50Q2F0ZWdvcmllcyhzdWJDYXRlZ29yeVZpZXdlci5nZXRDaGVja0J1dE5vdEdyYXllZEVsZW1lbnRzKCkpOwotICAgIAkKLSAgICAJb2xkQWRkQ2F0cy5yZW1vdmVBbGwobmV3QWRkQ2F0cyk7Ci0gICAgCW9sZFN1YkNhdHMucmVtb3ZlQWxsKG5ld1N1YkNhdHMpOwotICAgIAkKLSAgICAJbmV3QWRkQ2F0cy5yZW1vdmVBbGwoY29uZmlnLmdldEFkZGVkQ2F0ZWdvcnkoKSk7Ci0gICAgCW5ld1N1YkNhdHMucmVtb3ZlQWxsKGNvbmZpZy5nZXRTdWJ0cmFjdGVkQ2F0ZWdvcnkoKSk7Ci0JCQotCQlpZiAoQ29uZmlndXJhdGlvblV0aWwucmVtb3ZlQ29sbEZyb21BZGRlZENhdGVnb3J5TGlzdChhY3Rpb25NZ3IsIGNvbmZpZywgb2xkQWRkQ2F0cykgPT0gZmFsc2UpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCQotCQlpZiAoIW5ld0FkZENhdHMuaXNFbXB0eSgpKSB7Ci0JCQlpZiAoQ29uZmlndXJhdGlvblV0aWwuYWRkQ29sbFRvQWRkZWRDYXRlZ29yeUxpc3QoYWN0aW9uTWdyLCBjb25maWcsIG5ld0FkZENhdHMpID09IGZhbHNlKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCQotCQkJTWFwPFN0cmluZywgTWV0aG9kRWxlbWVudD4gcGx1Z2luTWFwID0gTWV0aG9kRWxlbWVudFV0aWwuYnVpbGRNYXAoY29uZmlnLmdldE1ldGhvZFBsdWdpblNlbGVjdGlvbigpKTsKLQkJCUhhc2hTZXQ8TWV0aG9kUGx1Z2luPiBuZXdBZGRlZFBsdWdpbnMgPSBuZXcgSGFzaFNldDxNZXRob2RQbHVnaW4+KCk7Ci0JCQlmb3IgKEl0ZXJhdG9yPENvbnRlbnRDYXRlZ29yeT4gaXQgPSBuZXdBZGRDYXRzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTsgKSB7Ci0JCQkJQ29udGVudENhdGVnb3J5IGNhdCA9IGl0Lm5leHQoKTsKLQkJCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4oY2F0KTsKLQkJCQlpZiAoISBwbHVnaW5NYXAuY29udGFpbnNLZXkocGx1Z2luLmdldEd1aWQoKSkpIHsKLQkJCQkJaWYgKCEgbmV3QWRkZWRQbHVnaW5zLmNvbnRhaW5zKHBsdWdpbikpIHsKLQkJCQkJCW5ld0FkZGVkUGx1Z2lucy5hZGQocGx1Z2luKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWlmICghIG5ld0FkZGVkUGx1Z2lucy5pc0VtcHR5KCkpIHsKLQkJCQlpZiAoQ29uZmlndXJhdGlvblV0aWwuYWRkQ29sbFRvTWV0aG9kUGx1Z2luTGlzdChhY3Rpb25NZ3IsIGNvbmZpZywgbmV3QWRkZWRQbHVnaW5zKSA9PSBmYWxzZSkKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCUxpYnJhcnlVdGlsLnZhbGlkYXRlTWV0aG9kQ29uZmlndXJhdGlvbihhY3Rpb25NZ3IsIGNvbmZpZyk7Ci0JCQl9Ci0JCQkKLQkJfQotCQlpZiAoQ29uZmlndXJhdGlvblV0aWwucmVtb3ZlQ29sbEZyb21TdWJ0cmFjdGVkQ2F0ZWdvcnlMaXN0KGFjdGlvbk1nciwgY29uZmlnLCBvbGRTdWJDYXRzKSA9PSBmYWxzZSkKLQkJCXJldHVybiBmYWxzZTsKLQkJCi0JCWlmIChDb25maWd1cmF0aW9uVXRpbC5hZGRDb2xsVG9TdWJ0cmFjdGVkQ2F0ZWdvcnlMaXN0KGFjdGlvbk1nciwgY29uZmlnLCBuZXdTdWJDYXRzKSA9PSBmYWxzZSkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlhY3Rpb25NZ3IuZXhlY3V0ZShuZXcgTWV0aG9kRWxlbWVudFNldFByb3BlcnR5Q29tbWFuZChjb25maWcsIFRPVUNIRURfQllfQ09ORklHX0VESVRPUiwgQm9vbGVhbi5UUlVFLnRvU3RyaW5nKCkpKTsKLQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFNldDxDb250ZW50Q2F0ZWdvcnk+IGdldENoZWNrZWRDb250ZW50Q2F0ZWdvcmllcyhPYmplY3RbXSBjaGVja2VkSXRlbXMpIHsKLQkJU2V0PENvbnRlbnRDYXRlZ29yeT4gcmVzdWx0ID0gbmV3IEhhc2hTZXQ8Q29udGVudENhdGVnb3J5PigpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNoZWNrZWRJdGVtcy5sZW5ndGg7IGkrKykgewotCQkJT2JqZWN0IGl0ZW0gPSBUbmdVdGlsLnVud3JhcChjaGVja2VkSXRlbXNbaV0pOwotCQkJaWYgKGl0ZW0gaW5zdGFuY2VvZiBDb250ZW50Q2F0ZWdvcnkpIHsKLS8vCQkJCWlmIChjb25maWcuZ2V0TWV0aG9kUGx1Z2luU2VsZWN0aW9uKCkuY29udGFpbnMoTGlicmFyeVV0aWwuZ2V0TWV0aG9kUGx1Z2luKChDb250ZW50Q2F0ZWdvcnkpaXRlbSkpKSB7Ci0JCQkJCXJlc3VsdC5hZGQoKENvbnRlbnRDYXRlZ29yeSlpdGVtKTsKLS8vCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkKLQlwcm90ZWN0ZWQgU2V0PE1ldGhvZFBhY2thZ2U+IGdldENoZWNrZWRNZXRob2RQYWNrYWdlcyhPYmplY3RbXSBjaGVja2VkSXRlbXMpIHsKLQkJU2V0PE1ldGhvZFBhY2thZ2U+IHJlc3VsdCA9IG5ldyBIYXNoU2V0PE1ldGhvZFBhY2thZ2U+KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2hlY2tlZEl0ZW1zLmxlbmd0aDsgaSsrKSB7Ci0JCQlPYmplY3QgaXRlbSA9IFRuZ1V0aWwudW53cmFwKGNoZWNrZWRJdGVtc1tpXSk7Ci0JCQlpZiAoaXRlbSBpbnN0YW5jZW9mIE1ldGhvZFBhY2thZ2UpIHsKLQkJCQlyZXN1bHQuYWRkKChNZXRob2RQYWNrYWdlKWl0ZW0pOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCQotCXByb3RlY3RlZCBTZXQ8TWV0aG9kUGx1Z2luPiBnZXRDaGVja2VkTWV0aG9kUGx1Z2lucyhPYmplY3RbXSBjaGVja2VkSXRlbXMpIHsKLQkJU2V0PE1ldGhvZFBsdWdpbj4gcmVzdWx0ID0gbmV3IEhhc2hTZXQ8TWV0aG9kUGx1Z2luPigpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNoZWNrZWRJdGVtcy5sZW5ndGg7IGkrKykgewotCQkJT2JqZWN0IGl0ZW0gPSBUbmdVdGlsLnVud3JhcChjaGVja2VkSXRlbXNbaV0pOwotCQkJaWYgKGl0ZW0gaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pIHsKLQkJCQlyZXN1bHQuYWRkKChNZXRob2RQbHVnaW4paXRlbSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJc3VwZXIuZGlzcG9zZSgpOwotCi0JCWlmIChsaWJMaXN0ZW5lciAhPSBudWxsKSB7Ci0JCQlJTGlicmFyeU1hbmFnZXIgbWFuYWdlciA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudExpYnJhcnlNYW5hZ2VyKCk7Ci0JCQlpZiAobWFuYWdlciAhPSBudWxsKSB7Ci0JCQkJbWFuYWdlci5yZW1vdmVMaXN0ZW5lcihsaWJMaXN0ZW5lcik7Ci0JCQl9Ci0JCX0KLQkJCi0JCWlmIChsYXlvdXRMaXN0ZW5lciAhPSBudWxsKSB7Ci0JCQlQbHVnaW5VSVBhY2thZ2VDb250ZXh0LklOU1RBTkNFLnJlbW92ZUxpc3RlbmVyKGxheW91dExpc3RlbmVyKTsKLQkJfQotCi0JCWlmIChjbG9zdXJlICE9IG51bGwpIHsKLQkJCWNsb3N1cmUuZGlzcG9zZSgpOwotCQkJY2xvc3VyZSA9IG51bGw7Ci0JCX0KLQkJaWYgKGFkYXB0ZXJGYWN0b3J5ICE9IG51bGwpIHsKLQkJCWFkYXB0ZXJGYWN0b3J5LmRpc3Bvc2UoKTsKLQkJCWFkYXB0ZXJGYWN0b3J5ID0gbnVsbDsKLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCBnb3RvTWFya2VyKElNYXJrZXIgbWFya2VyKSB7Ci0JCS8vIHNlbGVjdCBwcm9ibGVtIGluIG1haW4gdmlld2VyCi0JCQotCQlNZXRob2RFbGVtZW50IGUgPSBDb25maWd1cmF0aW9uTWFya2VySGVscGVyLklOU1RBTkNFLmdldEVycm9yTWV0aG9kRWxlbWVudChtYXJrZXIpOwotCi0JCWlmIChlICE9IG51bGwgJiYgY29uZmlnVmlld2VyICE9IG51bGwpIHsKLQkJCWNvbmZpZ1ZpZXdlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oTGlicmFyeVV0aWwuZ2V0U2VsZWN0YWJsZShlKSksIHRydWUpOwotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIGRvUXVpY2tGaXgoSU1hcmtlciBtYXJrZXIpIHsKLQkJaWYgKCBtYXJrZXIgPT0gbnVsbCApIHsKLQkJCXJldHVybjsKLQkJfQotCQlNZXRob2RFbGVtZW50IGVsZW1lbnQgPSBtYXJrZXJIZWxwZXIuZ2V0Q2F1c2VNZXRob2RFbGVtZW50KG1hcmtlcik7CQotCQlpZiAoIGVsZW1lbnQgPT0gbnVsbCApIHsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJaWYgKCBjbG9zdXJlLmdldENvbmZpZ3VyYXRpb25NYW5hZ2VyKCkuZ2V0Q29uZmlndXJhdGlvbkRhdGEoKS5pc0VsZW1lbnRJblN1YnRyYWN0ZWRDYXRlZ29yeShlbGVtZW50KSkgewotCQkJU3RyaW5nIG1lc3NhZ2UgPSBBdXRob3JpbmdVSVJlc291cmNlcy5iaW5kKAotCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5jb25maWd1cmF0aW9uUGFnZV9RdWlja2ZpeEVycm9yX3JlYXNvbjEsIAotCQkJCQkobmV3IFN0cmluZ1tdIHtMaWJyYXJ5VXRpbC5nZXRUeXBlTmFtZShlbGVtZW50KX0pKTsKLQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKQotCQkJCS5kaXNwbGF5V2FybmluZygKLQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLmNvbmZpZ3VyYXRpb25QYWdlX3F1aWNrZml4RXJyb3JfdGl0bGUsIAotCQkJCQkJbWVzc2FnZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCU9iamVjdCBvd25lciA9IExpYnJhcnlVdGlsLmdldFNlbGVjdGFibGUoZWxlbWVudCk7Ci0JCWNvbmZpZ1ZpZXdlci5zZXRDaGVja2VkKG93bmVyLCB0cnVlKTsKLQkJc2F2ZUNvbmZpZ3VyYXRpb24oKTsKLQkJc2hvd0Vycm9ycygpOwkJCQkJCi0gICB9Ci0KLQlwcml2YXRlIHZvaWQgaGFuZGxlSGlkZXNCdXR0b25XaWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlLCBTdHJpbmcga2V5KSB7Ci0JCU9iamVjdCBvYmogPSBlLmdldFNvdXJjZSgpOwotCQlpZiAob2JqIGluc3RhbmNlb2YgQnV0dG9uKSB7Ci0JCQlCdXR0b24gYnV0dG9uID0gKEJ1dHRvbikgb2JqOwotCQkJU3RyaW5nIHZhbHVlID0gYnV0dG9uLmdldFNlbGVjdGlvbigpID8gQm9vbGVhbi5UUlVFLnRvU3RyaW5nKCkKLQkJCQkJOiBCb29sZWFuLkZBTFNFLnRvU3RyaW5nKCk7Ci0JCQlhY3Rpb25NZ3IuZXhlY3V0ZShuZXcgTWV0aG9kRWxlbWVudFNldFByb3BlcnR5Q29tbWFuZChjb25maWcsIGtleSwgdmFsdWUpKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9Db250ZW50RWxlbWVudEd1aWRhbmNlUGFnZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9Db250ZW50RWxlbWVudEd1aWRhbmNlUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMTk3OGM0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvQ29udGVudEVsZW1lbnRHdWlkYW5jZVBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0NyArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZpbHRlcnMuR3VpZGFuY2VGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklBY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuRmlsdGVyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5NZXRob2RFbGVtZW50VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNoZWNrbGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbmNlcHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DdXN0b21DYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpc2NpcGxpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Eb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5FeGFtcGxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3VpZGFuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HdWlkZWxpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5QcmFjdGljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJlcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJldXNhYmxlQXNzZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2FkbWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5TdXBwb3J0aW5nTWF0ZXJpYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGVtcGxhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZXJtRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRvb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Ub29sTWVudG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldoaXRlcGFwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuZWRpdG9yLkZvcm1FZGl0b3I7Ci0KLS8qKgotICogQ2xhc3MgZm9yIEd1aWRhbmNlIHRhYiBwYWdlIGluIHRoZSBjb250ZW50IGVsZW1lbnQgZWRpdG9yLgotICogQ2xhc3MgQ29udGVudEVsZW1lbnRHdWlkYW5jZVBhZ2UgcmVwbGFjZXMgQ2F0ZWdvcnlHdWlkYW5jZVBhZ2UgYW5kIGhhbmRsZXMKLSAqIGFsbCBjb250ZW50ZWxlbWVudCdzIGd1aWRhbmNlIHRhYiBmZWF0dXJlLiAgCi0gKiAKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMAotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBDb250ZW50RWxlbWVudEd1aWRhbmNlUGFnZSBleHRlbmRzIEFzc29jaWF0aW9uRm9ybVBhZ2UgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZPUk1fUEFHRV9JRCA9ICJjYXRlZ29yeUd1aWRhbmNlc1BhZ2UiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBDb250ZW50RWxlbWVudEd1aWRhbmNlUGFnZShGb3JtRWRpdG9yIGVkaXRvcikgewotCQlzdXBlcihlZGl0b3IsIEZPUk1fUEFHRV9JRCwgQXV0aG9yaW5nVUlUZXh0LkdVSURBTkNFX1BBR0VfVElUTEUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2luaXQob3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGUsIG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElFZGl0b3JTaXRlIHNpdGUsIElFZGl0b3JJbnB1dCBpbnB1dCkgewotCQlzdXBlci5pbml0KHNpdGUsIGlucHV0KTsKLQkJc2V0QWxsb3dDaGFuZ2UxKHRydWUpOwotCQlzZXRBbGxvd0NoYW5nZTIodHJ1ZSk7Ci0JCXNldFVzZUNhdGVnb3J5MihmYWxzZSk7Ci0JCXNldFVzZUNhdGVnb3J5MyhmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjaW5pdENvbnRlbnRQcm92aWRlclNlbGVjdGVkKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0Q29udGVudFByb3ZpZGVyU2VsZWN0ZWQoKSB7Ci0JCWNvbnRlbnRQcm92aWRlclNlbGVjdGVkID0gbmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKAotCQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpIHsKLQkJCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJTGlzdCBsaXN0ID0gTWV0aG9kRWxlbWVudFV0aWwKLQkJCQkJCS5nZXRTZWxlY3RlZEd1aWRhbmNlcyhjb250ZW50RWxlbWVudCk7Ci0JCQkJTGlzdCBsb2NhbCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ID0gbGlzdC5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJCU9iamVjdCBvYmogPSBpdC5uZXh0KCk7Ci0JCQkJCWlmICghKG9iaiBpbnN0YW5jZW9mIFByYWN0aWNlCi0JCQkJCQkJfHwgKG9iaiBpbnN0YW5jZW9mIFRvb2xNZW50b3IgJiYgY29udGVudEVsZW1lbnQgaW5zdGFuY2VvZiBUb29sKSB8fCBvYmoKLQkJCQkJCQkuZXF1YWxzKGNvbnRlbnRFbGVtZW50Ci0JCQkJCQkJCQkuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpKSkpIHsKLQkJCQkJCWxvY2FsLmFkZChvYmopOwotCQkJCQl9Ci0JCQkJfQotCQkJCXJldHVybiBsb2NhbC50b0FycmF5KCk7Ci0JCQl9Ci0JCX07Ci0JCXZpZXdlcl9zZWxlY3RlZC5zZXRDb250ZW50UHJvdmlkZXIoY29udGVudFByb3ZpZGVyU2VsZWN0ZWQpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2FkZEl0ZW1zVG9Nb2RlbDEoQXJyYXlMaXN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEl0ZW1zVG9Nb2RlbDEoQXJyYXlMaXN0IGFkZEl0ZW1zKSB7Ci0JCS8vIFVwZGF0ZSB0aGUgbW9kZWwuCi0JCUlBY3Rpb25NYW5hZ2VyIGFjdGlvbk1nciA9IGVkaXRvci5nZXRBY3Rpb25NYW5hZ2VyKCk7Ci0JCWlmICghYWRkSXRlbXMuaXNFbXB0eSgpKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gYWRkSXRlbXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCUd1aWRhbmNlIGl0ZW0gPSAoR3VpZGFuY2UpIGl0Lm5leHQoKTsKLQotCQkJCS8vIENvbnNvbGlkYXRpbmcgdGhlIHNlcGFyYXRlIGZvcm0gcGFnZSBjb2RlCi0JCQkJLy8gdG8gYWNjb21vZGF0ZSBiZXR0ZXIgZmlsdGVyaW5nLgotCQkJCWlmIChjb250ZW50RWxlbWVudCBpbnN0YW5jZW9mIFRhc2spIHsKLS8vCQkJCQlpZiAoaXRlbSBpbnN0YW5jZW9mIEVzdGltYXRlKSB7Ci0vLwkJCQkJCWVkaXRvci5nZXRBY3Rpb25NYW5hZ2VyKCkuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuU0VULAotLy8JCQkJCQkJCWNvbnRlbnRFbGVtZW50LAotLy8JCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tfRXN0aW1hdGUoKSwKLS8vCQkJCQkJCQkoRXN0aW1hdGUpIGl0ZW0sIC0xKTsKLS8vCQkJCQl9IGVsc2UgCi0JCQkJCWlmIChpdGVtIGluc3RhbmNlb2YgVG9vbE1lbnRvcikgewotCQkJCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLkFERCwKLQkJCQkJCQkJY29udGVudEVsZW1lbnQsCi0JCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tfVG9vbE1lbnRvcnMoKSwKLQkJCQkJCQkJKFRvb2xNZW50b3IpIGl0ZW0sIC0xKTsKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQl9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMpIHsKLQkJCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5BREQsIGNvbnRlbnRFbGVtZW50LAotCQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrX0VzdGltYXRpb25Db25zaWRlcmF0aW9ucygpLAotCQkJCQkJCQlpdGVtLCAtMSk7Ci0JCQkJCQljb250aW51ZTsKLQkJCQkJfQotCQkJCX0KLQkJCQkvLyBJbiBjYXNlIG9mIFdvcmtQcm9kdWN0LCBXb3JrUHJvZHVjdCBpcyBhc3NvY2lhdGVkIHRvIFRvb2xNZW50b3IsCi0JCQkJLy8gRXN0aW1hdGUsIFJlcG9ydCBhbmQgVGVtcGxhdGUgZ3VpZGFuY2UKLQkJCQlpZiAoY29udGVudEVsZW1lbnQgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdCkgewotCQkJCQlpZiAoaXRlbSBpbnN0YW5jZW9mIFRlbXBsYXRlKSB7Ci0JCQkJCQlhY3Rpb25NZ3IKLQkJCQkJCQkJLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLkFERCwgY29udGVudEVsZW1lbnQsCi0JCQkJCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCQkJCS5nZXRXb3JrUHJvZHVjdF9UZW1wbGF0ZXMoKSwKLQkJCQkJCQkJCQlpdGVtLCAtMSk7Ci0JCQkJCQljb250aW51ZTsKLQkJCQkJfSBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgVG9vbE1lbnRvcikgewotCQkJCQkJYWN0aW9uTWdyCi0JCQkJCQkJCS5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5BREQsIGNvbnRlbnRFbGVtZW50LAotCQkJCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJCQkuZ2V0V29ya1Byb2R1Y3RfVG9vbE1lbnRvcnMoKSwKLQkJCQkJCQkJCQlpdGVtLCAtMSk7Ci0JCQkJCQljb250aW51ZTsKLQkJCQkJfSBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgUmVwb3J0KSB7Ci0JCQkJCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuQURELCBjb250ZW50RWxlbWVudCwKLQkJCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V29ya1Byb2R1Y3RfUmVwb3J0cygpLAotCQkJCQkJCQlpdGVtLCAtMSk7Ci0JCQkJCQljb250aW51ZTsKLQkJCQkJfSAKLS8vCQkJCQllbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgRXN0aW1hdGUpIHsKLS8vCQkJCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlNFVCwgY29udGVudEVsZW1lbnQsCi0vLwkJCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V29ya1Byb2R1Y3RfRXN0aW1hdGUoKSwKLS8vCQkJCQkJCQlpdGVtLCAtMSk7Ci0vLwkJCQkJfQotCQkJCQllbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKSB7Ci0JCQkJCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuQURELCBjb250ZW50RWxlbWVudCwKLQkJCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V29ya1Byb2R1Y3RfRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKCksCi0JCQkJCQkJCWl0ZW0sIC0xKTsKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJLy8gR3VpZGFuY2UgZm9yIGNvbnRlbnQgZWxlbWVudC4KLQkJCQlpZiAoaXRlbSBpbnN0YW5jZW9mIENoZWNrbGlzdCkgewotCQkJCQllZGl0b3IuZ2V0QWN0aW9uTWFuYWdlcigpCi0JCQkJCQkJLmRvQWN0aW9uKAotCQkJCQkJCQkJSUFjdGlvbk1hbmFnZXIuQURELAotCQkJCQkJCQkJY29udGVudEVsZW1lbnQsCi0JCQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJCQkuZ2V0Q29udGVudEVsZW1lbnRfQ2hlY2tsaXN0cygpLAotCQkJCQkJCQkJKENoZWNrbGlzdCkgaXRlbSwgLTEpOwotCQkJCQljb250aW51ZTsKLQkJCQl9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBDb25jZXB0KSB7Ci0JCQkJCWVkaXRvci5nZXRBY3Rpb25NYW5hZ2VyKCkuZG9BY3Rpb24oCi0JCQkJCQkJSUFjdGlvbk1hbmFnZXIuQURELAotCQkJCQkJCWNvbnRlbnRFbGVtZW50LAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkuZ2V0Q29udGVudEVsZW1lbnRfQ29uY2VwdHNBbmRQYXBlcnMoKSwKLQkJCQkJCQkoQ29uY2VwdCkgaXRlbSwgLTEpOwotCQkJCQljb250aW51ZTsKLQkJCQl9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBFeGFtcGxlKSB7Ci0JCQkJCWVkaXRvci5nZXRBY3Rpb25NYW5hZ2VyKCkuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuQURELAotCQkJCQkJCWNvbnRlbnRFbGVtZW50LAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbnRlbnRFbGVtZW50X0V4YW1wbGVzKCksCi0JCQkJCQkJKEV4YW1wbGUpIGl0ZW0sIC0xKTsKLQkJCQkJY29udGludWU7Ci0JCQkJfSBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgU3VwcG9ydGluZ01hdGVyaWFsKSB7Ci0JCQkJCWVkaXRvci5nZXRBY3Rpb25NYW5hZ2VyKCkuZG9BY3Rpb24oCi0JCQkJCQkJSUFjdGlvbk1hbmFnZXIuQURELAotCQkJCQkJCWNvbnRlbnRFbGVtZW50LAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkuZ2V0Q29udGVudEVsZW1lbnRfU3VwcG9ydGluZ01hdGVyaWFscygpLAotCQkJCQkJCShTdXBwb3J0aW5nTWF0ZXJpYWwpIGl0ZW0sIC0xKTsKLQkJCQkJY29udGludWU7Ci0JCQkJfSBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgR3VpZGVsaW5lKSB7Ci0JCQkJCWVkaXRvci5nZXRBY3Rpb25NYW5hZ2VyKCkKLQkJCQkJCQkuZG9BY3Rpb24oCi0JCQkJCQkJCQlJQWN0aW9uTWFuYWdlci5BREQsCi0JCQkJCQkJCQljb250ZW50RWxlbWVudCwKLQkJCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJCS5nZXRDb250ZW50RWxlbWVudF9HdWlkZWxpbmVzKCksCi0JCQkJCQkJCQkoR3VpZGVsaW5lKSBpdGVtLCAtMSk7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0gZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIFJldXNhYmxlQXNzZXQpIHsKLQkJCQkJZWRpdG9yLmdldEFjdGlvbk1hbmFnZXIoKS5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5BREQsCi0JCQkJCQkJY29udGVudEVsZW1lbnQsCi0JCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29udGVudEVsZW1lbnRfQXNzZXRzKCksCi0JCQkJCQkJKFJldXNhYmxlQXNzZXQpIGl0ZW0sIC0xKTsKLQkJCQkJY29udGludWU7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4KLQkJCQkJCQkuZ2V0RGVmYXVsdCgpCi0JCQkJCQkJLmdldExvZ2dlcigpCi0JCQkJCQkJLmxvZ0Vycm9yKAotCQkJCQkJCQkJIlVuYWJsZSB0byBhZGQgZ3VpZGFuY2UgIiArIGl0ZW0uZ2V0VHlwZSgpLmdldE5hbWUoKSArICI6IiArIGl0ZW0uZ2V0TmFtZSgpICsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQkJCQkJCSJ0byAiIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCQkJKyBjb250ZW50RWxlbWVudC5nZXRUeXBlKCkKLQkJCQkJCQkJCQkJCQkuZ2V0TmFtZSgpCi0JCQkJCQkJCQkJCSsgIjoiICsgY29udGVudEVsZW1lbnQuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJCAKLQkJCQl9Ci0JCQl9Ci0JCQlzZXREaXJ0eSh0cnVlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI3JlbW92ZUl0ZW1zRnJvbU1vZGVsMShBcnJheUxpc3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlSXRlbXNGcm9tTW9kZWwxKEFycmF5TGlzdCBybUl0ZW1zKSB7Ci0JCS8vIFVwZGF0ZSB0aGUgbW9kZWwuCi0JCUlBY3Rpb25NYW5hZ2VyIGFjdGlvbk1nciA9IGVkaXRvci5nZXRBY3Rpb25NYW5hZ2VyKCk7Ci0JCWlmICghcm1JdGVtcy5pc0VtcHR5KCkpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBybUl0ZW1zLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlHdWlkYW5jZSBpdGVtID0gKEd1aWRhbmNlKSBpdC5uZXh0KCk7Ci0KLQkJCQkvLyBJbiBjYXNlIG9mIFRhc2ssIFRhc2sgaXMgYXNzb2NpYXRlZCB0byBUb29sTWVudG9yIGFuZAotCQkJCS8vIEVzdGltYXRlIGd1aWRhbmNlCi0JCQkJaWYgKGNvbnRlbnRFbGVtZW50IGluc3RhbmNlb2YgVGFzaykgewotCQkJCQlpZiAoaXRlbSBpbnN0YW5jZW9mIFRvb2xNZW50b3IpIHsKLQkJCQkJCWVkaXRvci5nZXRBY3Rpb25NYW5hZ2VyKCkuZG9BY3Rpb24oCi0JCQkJCQkJCUlBY3Rpb25NYW5hZ2VyLlJFTU9WRSwgY29udGVudEVsZW1lbnQsCi0JCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tfVG9vbE1lbnRvcnMoKSwKLQkJCQkJCQkJaXRlbSwgLTEpOwotCQkJCQkJY29udGludWU7Ci0JCQkJCX0gCi0vLwkJCQkJZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIEVzdGltYXRlKSB7Ci0vLwkJCQkJCWVkaXRvci5nZXRBY3Rpb25NYW5hZ2VyKCkuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuU0VULAotLy8JCQkJCQkJCWNvbnRlbnRFbGVtZW50LAotLy8JCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tfRXN0aW1hdGUoKSwgbnVsbCwKLS8vCQkJCQkJCQktMSk7Ci0vLwkJCQkJfQotCQkJCQllbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKSB7Ci0JCQkJCQllZGl0b3IuZ2V0QWN0aW9uTWFuYWdlcigpLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlJFTU9WRSwKLQkJCQkJCQkJY29udGVudEVsZW1lbnQsCi0JCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tfRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKCksIGl0ZW0sCi0JCQkJCQkJCS0xKTsKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQl9Ci0JCQkJfQotCQkJCS8vIEluIGNhc2Ugb2YgV29ya1Byb2R1Y3QsIFdvcmtQcm9kdWN0IGlzIGFzc29jaWF0ZWQgdG8gVG9vbE1lbnRvciwKLQkJCQkvLyBFc3RpbWF0ZSwgUmVwb3J0IGFuZCBUZW1wbGF0ZSBndWlkYW5jZQotCQkJCWlmIChjb250ZW50RWxlbWVudCBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0KSB7Ci0JCQkJCWlmIChpdGVtIGluc3RhbmNlb2YgUmVwb3J0KSB7Ci0JCQkJCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuUkVNT1ZFLAotCQkJCQkJCQljb250ZW50RWxlbWVudCwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCQkuZ2V0V29ya1Byb2R1Y3RfUmVwb3J0cygpLCBpdGVtLCAtMSk7Ci0JCQkJCQljb250aW51ZTsKLQkJCQkJfSBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgVGVtcGxhdGUpIHsKLQkJCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5SRU1PVkUsCi0JCQkJCQkJCWNvbnRlbnRFbGVtZW50LCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJCS5nZXRXb3JrUHJvZHVjdF9UZW1wbGF0ZXMoKSwgaXRlbSwgLTEpOwotCQkJCQkJY29udGludWU7Ci0JCQkJCX0gZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIFRvb2xNZW50b3IpIHsKLQkJCQkJCWFjdGlvbk1ncgotCQkJCQkJCQkuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuUkVNT1ZFLAotCQkJCQkJCQkJCWNvbnRlbnRFbGVtZW50LCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJCQkJLmdldFdvcmtQcm9kdWN0X1Rvb2xNZW50b3JzKCksCi0JCQkJCQkJCQkJaXRlbSwgLTEpOwotCQkJCQkJY29udGludWU7Ci0JCQkJCX0gCi0vLwkJCQkJZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIEVzdGltYXRlKSB7Ci0vLwkJCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5TRVQsIGNvbnRlbnRFbGVtZW50LAotLy8JCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFdvcmtQcm9kdWN0X0VzdGltYXRlKCksCi0vLwkJCQkJCQkJbnVsbCwgLTEpOwotLy8JCQkJCX0KLQkJCQkJZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIEVzdGltYXRpb25Db25zaWRlcmF0aW9ucykgewotCQkJCQkJZWRpdG9yLmdldEFjdGlvbk1hbmFnZXIoKS5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5SRU1PVkUsCi0JCQkJCQkJCWNvbnRlbnRFbGVtZW50LAotCQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRXb3JrUHJvZHVjdF9Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMoKSwgaXRlbSwKLQkJCQkJCQkJLTEpOwotCQkJCQkJY29udGludWU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJLy8gR3VpZGFuY2UgZm9yIHRoZSBtZXRob2QgZWxlbWVudC4KLQkJCQlpZiAoaXRlbSBpbnN0YW5jZW9mIENoZWNrbGlzdCkgewotCQkJCQllZGl0b3IuZ2V0QWN0aW9uTWFuYWdlcigpCi0JCQkJCQkJLmRvQWN0aW9uKAotCQkJCQkJCQkJSUFjdGlvbk1hbmFnZXIuUkVNT1ZFLAotCQkJCQkJCQkJY29udGVudEVsZW1lbnQsCi0JCQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJCQkuZ2V0Q29udGVudEVsZW1lbnRfQ2hlY2tsaXN0cygpLAotCQkJCQkJCQkJaXRlbSwgLTEpOwotCQkJCQljb250aW51ZTsKLQkJCQl9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBDb25jZXB0KSB7Ci0JCQkJCWVkaXRvci5nZXRBY3Rpb25NYW5hZ2VyKCkuZG9BY3Rpb24oCi0JCQkJCQkJSUFjdGlvbk1hbmFnZXIuUkVNT1ZFLAotCQkJCQkJCWNvbnRlbnRFbGVtZW50LAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkuZ2V0Q29udGVudEVsZW1lbnRfQ29uY2VwdHNBbmRQYXBlcnMoKSwKLQkJCQkJCQkoQ29uY2VwdCkgaXRlbSwgLTEpOwotCQkJCQljb250aW51ZTsKLQkJCQl9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBFeGFtcGxlKSB7Ci0JCQkJCWVkaXRvci5nZXRBY3Rpb25NYW5hZ2VyKCkuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuUkVNT1ZFLAotCQkJCQkJCWNvbnRlbnRFbGVtZW50LAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbnRlbnRFbGVtZW50X0V4YW1wbGVzKCksCi0JCQkJCQkJKEV4YW1wbGUpIGl0ZW0sIC0xKTsKLQkJCQkJY29udGludWU7Ci0JCQkJfSBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgU3VwcG9ydGluZ01hdGVyaWFsKSB7Ci0JCQkJCWVkaXRvci5nZXRBY3Rpb25NYW5hZ2VyKCkuZG9BY3Rpb24oCi0JCQkJCQkJSUFjdGlvbk1hbmFnZXIuUkVNT1ZFLAotCQkJCQkJCWNvbnRlbnRFbGVtZW50LAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkuZ2V0Q29udGVudEVsZW1lbnRfU3VwcG9ydGluZ01hdGVyaWFscygpLAotCQkJCQkJCShTdXBwb3J0aW5nTWF0ZXJpYWwpIGl0ZW0sIC0xKTsKLQkJCQkJY29udGludWU7Ci0JCQkJfSBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgR3VpZGVsaW5lKSB7Ci0JCQkJCWVkaXRvci5nZXRBY3Rpb25NYW5hZ2VyKCkKLQkJCQkJCQkuZG9BY3Rpb24oCi0JCQkJCQkJCQlJQWN0aW9uTWFuYWdlci5SRU1PVkUsCi0JCQkJCQkJCQljb250ZW50RWxlbWVudCwKLQkJCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJCS5nZXRDb250ZW50RWxlbWVudF9HdWlkZWxpbmVzKCksCi0JCQkJCQkJCQkoR3VpZGVsaW5lKSBpdGVtLCAtMSk7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0gZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIFJldXNhYmxlQXNzZXQpIHsKLQkJCQkJZWRpdG9yLmdldEFjdGlvbk1hbmFnZXIoKS5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5SRU1PVkUsCi0JCQkJCQkJY29udGVudEVsZW1lbnQsCi0JCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29udGVudEVsZW1lbnRfQXNzZXRzKCksCi0JCQkJCQkJKFJldXNhYmxlQXNzZXQpIGl0ZW0sIC0xKTsKLQkJCQkJY29udGludWU7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4KLQkJCQkJCQkuZ2V0RGVmYXVsdCgpCi0JCQkJCQkJLmdldExvZ2dlcigpCi0JCQkJCQkJLmxvZ0Vycm9yKAotCQkJCQkJCQkJIlVuYWJsZSB0byByZW1vdmUgZ3VpZGFuY2UgIiArIGl0ZW0uZ2V0VHlwZSgpLmdldE5hbWUoKSArICI6IiArIGl0ZW0uZ2V0TmFtZSgpICsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQkJCQkJCSJmcm9tICIgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJCQkrIGNvbnRlbnRFbGVtZW50LmdldFR5cGUoKQotCQkJCQkJCQkJCQkJCS5nZXROYW1lKCkKLQkJCQkJCQkJCQkJKyAiOiIgKyBjb250ZW50RWxlbWVudC5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkIAotCQkJCX0KLQkJCX0KLQkJCXNldERpcnR5KHRydWUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjZ2V0Q29udGVudEVsZW1lbnQoKQotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZ2V0Q29udGVudEVsZW1lbnQoKSB7Ci0JCXJldHVybiBjb250ZW50RWxlbWVudDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRUYWJTdHJpbmcoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0VGFiU3RyaW5nKCkgewotCQlyZXR1cm4gRmlsdGVyQ29uc3RhbnRzLkdVSURBTkNFOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2dldEZpbHRlcigpCi0JICovCi0JcHJvdGVjdGVkIElGaWx0ZXIgZ2V0RmlsdGVyKCkgewotCQlyZXR1cm4gZmlsdGVyID0gbmV3IEd1aWRhbmNlRmlsdGVyKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0RmlsdGVyVHlwZXMoKQotCSAqICAgICAgVHlwZXMgYXJlIHJldHVybmVkIGluIG9yZGVyIHRvIGRpc3BsYXkgaW4gdGhlIGZpbHRlciBkaWFsb2cgZm9yCi0JICogICAgICBzZWFyY2ggYmFzZWQgb24gdHlwZS4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nW10gZ2V0RmlsdGVyVHlwZXMoKSB7Ci0JCQotCQlTdHJpbmdbXSBzdHI7Ci0JCWlmIChjb250ZW50RWxlbWVudCBpbnN0YW5jZW9mIFRhc2spIHsKLQkJCXN0ciA9IG5ldyBTdHJpbmdbMTFdOwotCQl9IGVsc2UgaWYgKGNvbnRlbnRFbGVtZW50IGluc3RhbmNlb2YgV29ya1Byb2R1Y3QpIHsKLQkJCXN0ciA9IG5ldyBTdHJpbmdbMTNdOwotCQl9IGVsc2UKLQkJCXN0ciA9IG5ldyBTdHJpbmdbOV07Ci0JCWludCBpID0gMDsKLQkJc3RyW2krK10gPSBGaWx0ZXJDb25zdGFudHMuR1VJREFOQ0U7Ci0JCXN0cltpKytdID0gRmlsdGVyQ29uc3RhbnRzLnNwYWNlICsgRmlsdGVyQ29uc3RhbnRzLkNIRUNLTElTVFM7Ci0JCXN0cltpKytdID0gRmlsdGVyQ29uc3RhbnRzLnNwYWNlICsgRmlsdGVyQ29uc3RhbnRzLkNPTkNFUFRTOwotCQlzdHJbaSsrXSA9IEZpbHRlckNvbnN0YW50cy5zcGFjZSArIEZpbHRlckNvbnN0YW50cy5FWEFNUExFUzsKLQkJc3RyW2krK10gPSBGaWx0ZXJDb25zdGFudHMuc3BhY2UgKyBGaWx0ZXJDb25zdGFudHMuR1VJREVMSU5FUzsKLQkJc3RyW2krK10gPSBGaWx0ZXJDb25zdGFudHMuc3BhY2UgKyBGaWx0ZXJDb25zdGFudHMuUkVVU0FCTEVfQVNTRVRTOwotCQlzdHJbaSsrXSA9IEZpbHRlckNvbnN0YW50cy5zcGFjZSArIEZpbHRlckNvbnN0YW50cy5TVVBQT1JUSU5HX01BVEVSSUFMUzsKLQkJaWYgKGNvbnRlbnRFbGVtZW50IGluc3RhbmNlb2YgVGFzaykgewotCQkJc3RyW2krK10gPSBGaWx0ZXJDb25zdGFudHMuc3BhY2UgKyBGaWx0ZXJDb25zdGFudHMuVE9PTF9NRU5UT1JTOwotCQkJc3RyW2krK10gPSBGaWx0ZXJDb25zdGFudHMuc3BhY2UgKyBGaWx0ZXJDb25zdGFudHMuRVNUSU1BVEVfQ09OU0lERVJBVElPTlM7Ci0JCQkvLyBUT0RPIEVzdGltYXRlIGNvbnRlbnRlbGVtZW50Ci0JCX0gZWxzZSBpZiAoY29udGVudEVsZW1lbnQgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdCkgewotCQkJc3RyW2krK10gPSBGaWx0ZXJDb25zdGFudHMuc3BhY2UgKyBGaWx0ZXJDb25zdGFudHMuUkVQT1JUUzsKLQkJCXN0cltpKytdID0gRmlsdGVyQ29uc3RhbnRzLnNwYWNlICsgRmlsdGVyQ29uc3RhbnRzLlRFTVBMQVRFUzsKLQkJCXN0cltpKytdID0gRmlsdGVyQ29uc3RhbnRzLnNwYWNlICsgRmlsdGVyQ29uc3RhbnRzLlRPT0xfTUVOVE9SUzsKLQkJCXN0cltpKytdID0gRmlsdGVyQ29uc3RhbnRzLnNwYWNlICsgRmlsdGVyQ29uc3RhbnRzLkVTVElNQVRFX0NPTlNJREVSQVRJT05TOwotCQkJLy8gVE9ETyBFc3RpbWF0ZSBjb250ZW50ZWxlbWVudAotCQl9Ci0JCXN0cltpKytdID0gRmlsdGVyQ29uc3RhbnRzLkNPTlRFTlRfUEFDS0FHRVM7Ci0JCXN0cltpKytdID0gRmlsdGVyQ29uc3RhbnRzLk1FVEhPX1BMVUdJTlM7Ci0JCXJldHVybiBzdHI7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldE11bHRpcGxlU2VsZWN0RGVzY3JpcHRpb24oaW50KQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbihpbnQgY291bnQpIHsKLQkJcmV0dXJuIHN1cGVyLmdldE11bHRpcGxlU2VsZWN0RGVzY3JpcHRpb24oY291bnQsIEF1dGhvcmluZ1VJUmVzb3VyY2VzLmNhdGVnb3J5R3VpZGFuY2VzUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uKTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0U2VjdGlvbkRlc2NyaXB0aW9uKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlY3Rpb25EZXNjcmlwdGlvbigpIHsKLQkJCi0JCWlmKGNvbnRlbnRFbGVtZW50IGluc3RhbmNlb2YgUm9sZVNldCl7Ci0JCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMucm9sZXNldHNfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbjsKLQkJfQotCQlpZihjb250ZW50RWxlbWVudCBpbnN0YW5jZW9mIERpc2NpcGxpbmUpewotCQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLmRpc2NpcGxpbmVzX2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb247Ci0JCX0KLQkJaWYoY29udGVudEVsZW1lbnQgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdFR5cGUpewotCQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLndvcmtwcm9kdWN0dHlwZXNfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbjsKLQkJfQotCQlpZihjb250ZW50RWxlbWVudCBpbnN0YW5jZW9mIERvbWFpbil7Ci0JCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZG9tYWluc19ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uOwotCQl9Ci0JCWlmKGNvbnRlbnRFbGVtZW50IGluc3RhbmNlb2YgVG9vbCl7Ci0JCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMudG9vbHNfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbjsKLQkJfQotCQlpZihjb250ZW50RWxlbWVudCBpbnN0YW5jZW9mIFJvbGUpewotCQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLnJvbGVHdWlkYW5jZVBhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uOwotCQl9Ci0JCWlmKGNvbnRlbnRFbGVtZW50IGluc3RhbmNlb2YgVGFzayl7Ci0JCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMudGFza0d1aWRhbmNlUGFnZV9zZWN0aW9uRGVzY3JpcHRpb247Ci0JCX0KLQkJaWYoY29udGVudEVsZW1lbnQgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdCl7Ci0JCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMud29ya1Byb2R1Y3RHdWlkYW5jZVBhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uOwotCQl9Ci0JCWlmKGNvbnRlbnRFbGVtZW50IGluc3RhbmNlb2YgVG9vbCl7Ci0JCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMudG9vbHNfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbjsKLQkJfQotCQlpZihjb250ZW50RWxlbWVudCBpbnN0YW5jZW9mIFdoaXRlcGFwZXIpewotCQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLndoaXRlcGFwZXJfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbjsKLQkJfQotCQlpZihjb250ZW50RWxlbWVudCBpbnN0YW5jZW9mIENvbmNlcHQpewotCQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLmNvbmNlcHRfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbjsKLQkJfQotCQlpZihjb250ZW50RWxlbWVudCBpbnN0YW5jZW9mIENoZWNrbGlzdCl7Ci0JCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMuY2hlY2tsaXN0X2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb247Ci0JCX0KLQkJaWYoY29udGVudEVsZW1lbnQgaW5zdGFuY2VvZiBFeGFtcGxlKXsKLQkJCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy5leGFtcGxlX2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb247Ci0JCX0KLQkJaWYoY29udGVudEVsZW1lbnQgaW5zdGFuY2VvZiBHdWlkZWxpbmUpewotCQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLmd1aWRlbGluZV9ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uOwotCQl9Ci0JCWlmKGNvbnRlbnRFbGVtZW50IGluc3RhbmNlb2YgU3VwcG9ydGluZ01hdGVyaWFsKXsKLQkJCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy5zdXBwb3J0aW5nbWF0ZXJpYWxfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbjsKLQkJfQotCQlpZihjb250ZW50RWxlbWVudCBpbnN0YW5jZW9mIFJvYWRtYXApewotCQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLnJvYWRtYXBfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbjsKLQkJfQotCQlpZihjb250ZW50RWxlbWVudCBpbnN0YW5jZW9mIFByYWN0aWNlKXsKLQkJCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy5wcmFjdGljZV9ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uOwotCQl9Ci0JCWlmKGNvbnRlbnRFbGVtZW50IGluc3RhbmNlb2YgUmVwb3J0KXsKLQkJCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy5yZXBvcnRfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbjsKLQkJfQotCQlpZihjb250ZW50RWxlbWVudCBpbnN0YW5jZW9mIFJldXNhYmxlQXNzZXQpewotCQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLnJldXNhYmxlYXNzZXRfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbjsKLQkJfQotCQlpZihjb250ZW50RWxlbWVudCBpbnN0YW5jZW9mIFRlbXBsYXRlKXsKLQkJCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy50ZW1wbGF0ZV9ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uOwotCQl9Ci0JCWlmKGNvbnRlbnRFbGVtZW50IGluc3RhbmNlb2YgVGVybURlZmluaXRpb24pewotCQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLnRlcm1kZWZpbml0aW9uX2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb247Ci0JCX0KLQkJaWYoY29udGVudEVsZW1lbnQgaW5zdGFuY2VvZiBFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMpewotCQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLmVzdGltYXRpb25jb25zaWRlcmF0aW9uX2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb247Ci0JCX0KLQkJaWYoY29udGVudEVsZW1lbnQgaW5zdGFuY2VvZiBUb29sTWVudG9yKXsKLQkJCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy50b29sbWVudG9yX2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb247Ci0JCX0KLQkJaWYoY29udGVudEVsZW1lbnQgaW5zdGFuY2VvZiBDdXN0b21DYXRlZ29yeSl7Ci0JCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMuY3VzdG9tY2F0ZWdvcnlfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbjsKLQkJfQotCQkKLQkJaWYoY29udGVudEVsZW1lbnQgIT0gbnVsbCkKLQkJCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy5iaW5kKEF1dGhvcmluZ1VJUmVzb3VyY2VzLmNhdGVnb3J5R3VpZGFuY2VzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb24sIGNvbnRlbnRFbGVtZW50LmdldFR5cGUoKS5nZXROYW1lKCkudG9Mb3dlckNhc2UoKSk7Ci0JCQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNnZXRTZWN0aW9uTmFtZSgpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTZWN0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLmNhdGVnb3J5R3VpZGFuY2VzUGFnZV9zZWN0aW9uTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNnZXRTZWxlY3RlZExhYmVsKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlbGVjdGVkTGFiZWwoKSB7Ci0JCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy5jYXRlZ29yeUd1aWRhbmNlc1BhZ2Vfc2VsZWN0ZWRMYWJlbDsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0U2VsZWN0ZWRMYWJlbDIoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VsZWN0ZWRMYWJlbDIoKSB7Ci0JCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy5jYXRlZ29yeUd1aWRhbmNlc1BhZ2Vfc2VsZWN0ZWRMYWJlbDsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0U2VsZWN0ZWRMYWJlbDMoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VsZWN0ZWRMYWJlbDMoKSB7Ci0JCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy5jYXRlZ29yeUd1aWRhbmNlc1BhZ2Vfc2VsZWN0ZWRMYWJlbDsKLQl9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9Db250ZW50UGFja2FnZURlc2NyaXB0aW9uUGFnZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9Db250ZW50UGFja2FnZURlc2NyaXB0aW9uUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZGIyNDg2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvQ29udGVudFBhY2thZ2VEZXNjcmlwdGlvblBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zOwotCi1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLk1ldGhvZEVsZW1lbnRVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLkxpYnJhcnlVSVRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNoZWNrU3RhdGVDaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DaGVja2JveFRhYmxlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNoZWNrU3RhdGVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyU29ydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuZWRpdG9yLkZvcm1FZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5Gb3JtVG9vbGtpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLlNlY3Rpb247Ci0KLQotLyoqCi0gKiBUaGUgZGVzY3JpcHRpb24gcGFnZSBmb3IgdGhlIENvbnRlbnQgUGFja2FnZSBlZGl0b3IuCi0gKiAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIENvbnRlbnRQYWNrYWdlRGVzY3JpcHRpb25QYWdlIGV4dGVuZHMgRGVzY3JpcHRpb25Gb3JtUGFnZSBpbXBsZW1lbnRzIElSZWZyZXNoYWJsZSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9STV9QUkVGSVggPSBMaWJyYXJ5VUlUZXh0LlRFWFRfQ09OVEVOVF9QQUNLQUdFCi0JCQkrICI6ICI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgQ2hlY2tib3hUYWJsZVZpZXdlciBjdHJsX2RlcGVuZGVuY3k7Ci0KLQlwcml2YXRlIENvbnRlbnRQYWNrYWdlIGNvbnRlbnRQYWNrYWdlOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgQ29udGVudFBhY2thZ2VEZXNjcmlwdGlvblBhZ2UoRm9ybUVkaXRvciBlZGl0b3IpIHsKLQkJc3VwZXIoZWRpdG9yLCBBdXRob3JpbmdVSVRleHQuREVTQ1JJUFRJT05fUEFHRV9USVRMRSwKLQkJCQlBdXRob3JpbmdVSVRleHQuREVTQ1JJUFRJT05fUEFHRV9USVRMRSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuRm9ybVBhZ2UjaW5pdChvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZSwgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0KQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSUVkaXRvclNpdGUgc2l0ZSwgSUVkaXRvcklucHV0IGlucHV0KSB7Ci0JCXN1cGVyLmluaXQoc2l0ZSwgaW5wdXQpOwotCQljb250ZW50UGFja2FnZSA9IChDb250ZW50UGFja2FnZSkgbWV0aG9kRWxlbWVudDsKLQkJZGV0YWlsU2VjdGlvbk9uID0gZmFsc2U7Ci0JCWZ1bGxEZXNjT24gPSBmYWxzZTsKLQkJa2V5Q29uc2lkZXJhdGlvbk9uID0gZmFsc2U7Ci0JCXZhcmlhYmlsaXR5U2VjdGlvbk9uID0gZmFsc2U7Ci0JCXZlcnNpb25TZWN0aW9uT24gPSBmYWxzZTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVFZGl0b3JDb250ZW50KEZvcm1Ub29sa2l0IHRvb2xraXQpIHsKLQkJc3VwZXIuY3JlYXRlRWRpdG9yQ29udGVudCh0b29sa2l0KTsKLQkJY3JlYXRlRGVwZW5kZW5jeVNlY3Rpb24odG9vbGtpdCk7Ci0JCS8vIFNldCBmb2N1cyBvbiB0aGUgTmFtZSB0ZXh0IGNvbnRyb2wuCi0JCURpc3BsYXkgZGlzcGxheSA9IGZvcm0uZ2V0Qm9keSgpLmdldERpc3BsYXkoKTsKLQkJaWYgKCEoZGlzcGxheSA9PSBudWxsIHx8IGRpc3BsYXkuaXNEaXNwb3NlZCgpKSkgewotCQkJZGlzcGxheS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJaWYoY3RybF9uYW1lLmlzRGlzcG9zZWQoKSkgcmV0dXJuOwotCQkJCQljdHJsX25hbWUuc2V0Rm9jdXMoKTsKLQkJCQkJY3RybF9uYW1lLnNldFNlbGVjdGlvbigwLCBjdHJsX25hbWUuZ2V0VGV4dCgpLmxlbmd0aCgpKTsKLQkJCQl9Ci0JCQl9KTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVEZXBlbmRlbmN5U2VjdGlvbihGb3JtVG9vbGtpdCB0b29sa2l0KSB7Ci0JCVNlY3Rpb24gZGVwZW5kZW5jeVNlY3Rpb24gPSBjcmVhdGVTZWN0aW9uKHRvb2xraXQsIHNlY3Rpb25Db21wb3NpdGUsIAotCQkJCUF1dGhvcmluZ1VJVGV4dC5ERVBFTkRFTkNJRVNfU0VDVElPTl9OQU1FLCAKLQkJCQlBdXRob3JpbmdVSVRleHQuREVQRU5ERU5DSUVTX1NFQ1RJT05fREVTQyk7Ci0JCUNvbXBvc2l0ZSBkZXBlbmRlbmN5Q29tcG9zaXRlID0gY3JlYXRlQ29tcG9zaXRlKHRvb2xraXQsIGRlcGVuZGVuY3lTZWN0aW9uKTsKLQotCQlUYWJsZSBjdHJsX3RhYmxlID0gdG9vbGtpdC5jcmVhdGVUYWJsZShkZXBlbmRlbmN5Q29tcG9zaXRlLCBTV1QuVl9TQ1JPTEwKLQkJCQl8IFNXVC5DSEVDSyB8IFNXVC5SRUFEX09OTFkgfCBTV1QuQ09MT1JfQkxVRSk7Ci0JCXsKLQkJCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkJFR0lOTklORwotCQkJCQl8IEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCQlncmlkRGF0YS5oZWlnaHRIaW50ID0gMTAwOwotCQkJY3RybF90YWJsZS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJfQotCi0JCWN0cmxfZGVwZW5kZW5jeSA9IG5ldyBDaGVja2JveFRhYmxlVmlld2VyKGN0cmxfdGFibGUpOwotCi0JCUlMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIgPSBuZXcgTGFiZWxQcm92aWRlcigpIHsKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgewotCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UpIHsKLQkJCQkJcmV0dXJuIFRuZ1V0aWwuZ2V0TGFiZWxXaXRoUGF0aCgoQ29udGVudFBhY2thZ2UpZWxlbWVudCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJcmV0dXJuIGVsZW1lbnQudG9TdHJpbmcoKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JCWN0cmxfZGVwZW5kZW5jeS5zZXRMYWJlbFByb3ZpZGVyKGxhYmVsUHJvdmlkZXIpOwotCQljdHJsX2RlcGVuZGVuY3kuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCQl9Ci0JCQkKLQkJCXB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsCi0JCQkJCU9iamVjdCBuZXdJbnB1dCkgewotCQkJfQotCQkJCi0JCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGlucHV0RWxlbWVudCkgewotCQkJCWlmIChpbnB1dEVsZW1lbnQgaW5zdGFuY2VvZiBDb250ZW50UGFja2FnZSkgewotCQkJCQlyZXR1cm4gZ2V0RGVwZW5kZW5jaWVzUGFja2FnZXMoY29udGVudFBhY2thZ2UpLnRvQXJyYXkoKTsKLQkJCQl9IGVsc2UgewotCQkJCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVC50b0FycmF5KCk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQkJY3RybF9kZXBlbmRlbmN5LnNldFNvcnRlcihuZXcgVmlld2VyU29ydGVyKCkpOwotCQljdHJsX2RlcGVuZGVuY3kuc2V0SW5wdXQoY29udGVudFBhY2thZ2UpOwotCi0JCWN0cmxfZGVwZW5kZW5jeS5zZXRBbGxDaGVja2VkKHRydWUpOwotCQljdHJsX2RlcGVuZGVuY3kuc2V0QWxsR3JheWVkKHRydWUpOwotCi0JCXRvb2xraXQucGFpbnRCb3JkZXJzRm9yKGRlcGVuZGVuY3lDb21wb3NpdGUpOwotCX0KLQotCS8qKgotCSAqIEFkZCBsaXN0ZW5lcnMKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRMaXN0ZW5lcnMoKSB7Ci0JCXN1cGVyLmFkZExpc3RlbmVycygpOwotCQkKLQkJZm9ybS5hZGRMaXN0ZW5lcihTV1QuQWN0aXZhdGUsIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQkvLyByZWZyZXNoVmlld2VycygpOwotCQkJCWN0cmxfZGVwZW5kZW5jeS5yZWZyZXNoKCk7Ci0JCQkJY3RybF9kZXBlbmRlbmN5LnNldEFsbENoZWNrZWQodHJ1ZSk7Ci0JCQkJY3RybF9kZXBlbmRlbmN5LnNldEFsbEdyYXllZCh0cnVlKTsKLQkJCX0KLQkJfSk7Ci0KLQkJY3RybF9kZXBlbmRlbmN5LmFkZENoZWNrU3RhdGVMaXN0ZW5lcihuZXcgSUNoZWNrU3RhdGVMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGNoZWNrU3RhdGVDaGFuZ2VkKENoZWNrU3RhdGVDaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQlPYmplY3Qgb2JqID0gZXZlbnQuZ2V0U291cmNlKCk7Ci0JCQkJKChDaGVja2JveFRhYmxlVmlld2VyKSBvYmopLnNldEFsbENoZWNrZWQodHJ1ZSk7Ci0JCQl9Ci0JCX0pOwotCi0JfQotCi0JLyoqCi0JICogR2V0IGRlcGVuZGVuY3kgcGFja2FnZXMgZm9yIHRoZSBnaXZlbiBjb250ZW50IHBhY2thZ2UKLQkgKiBAcmV0dXJuCi0JICogCQlMaXN0IG9mIGRlcGVuZGVuY3kgcGFja2FnZXMKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbjxDb250ZW50UGFja2FnZT4gZ2V0RGVwZW5kZW5jaWVzUGFja2FnZXMoQ29udGVudFBhY2thZ2UgY29udGVudFBhY2thZ2UpIHsKLQotCQlMaXN0IGVsZW1lbnRzID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjb250ZW50UGFja2FnZS5nZXRDb250ZW50RWxlbWVudHMoKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCUNvbnRlbnRFbGVtZW50IGNvbnRlbnRFbGVtZW50ID0gKENvbnRlbnRFbGVtZW50KSBpdGVyLm5leHQoKTsKLQkJCWlmIChjb250ZW50RWxlbWVudC5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkgIT0gbnVsbCkgewotCQkJCWVsZW1lbnRzLmFkZCgoQ29udGVudEVsZW1lbnQpIGNvbnRlbnRFbGVtZW50Ci0JCQkJCQkuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpKTsKLQkJCX0KLQkJCWVsZW1lbnRzLmFkZEFsbChNZXRob2RFbGVtZW50VXRpbAotCQkJCQkuZ2V0U2VsZWN0ZWRHdWlkYW5jZXMoY29udGVudEVsZW1lbnQpKTsKLQotCQkJaWYgKGNvbnRlbnRFbGVtZW50IGluc3RhbmNlb2YgUm9sZSkgewotLyoJCQkJaWYgKEFzc29jaWF0aW9uSGVscGVyCi0JCQkJCQkuZ2V0TW9kaWZpZWRXb3JrUHJvZHVjdHMoKFJvbGUpIGNvbnRlbnRFbGVtZW50KSAhPSBudWxsKSB7Ci0JCQkJCWVsZW1lbnRzLmFkZEFsbChBc3NvY2lhdGlvbkhlbHBlcgotCQkJCQkJCS5nZXRNb2RpZmllZFdvcmtQcm9kdWN0cygoUm9sZSkgY29udGVudEVsZW1lbnQpKTsKLQkJCQl9Ci0JCQkJaWYgKEFzc29jaWF0aW9uSGVscGVyLmdldFByaW1hcnlUYXNrcygoUm9sZSkgY29udGVudEVsZW1lbnQpICE9IG51bGwpIHsKLQkJCQkJZWxlbWVudHMuYWRkQWxsKEFzc29jaWF0aW9uSGVscGVyCi0JCQkJCQkJLmdldFByaW1hcnlUYXNrcygoUm9sZSkgY29udGVudEVsZW1lbnQpKTsKLQkJCQl9Ci0JCQkJaWYgKEFzc29jaWF0aW9uSGVscGVyLmdldFNlY29uZGFyeVRhc2tzKChSb2xlKSBjb250ZW50RWxlbWVudCkgIT0gbnVsbCkgewotCQkJCQllbGVtZW50cy5hZGRBbGwoQXNzb2NpYXRpb25IZWxwZXIKLQkJCQkJCQkuZ2V0U2Vjb25kYXJ5VGFza3MoKFJvbGUpIGNvbnRlbnRFbGVtZW50KSk7Ci0JCQkJfSovCi0JCQl9Ci0JCQlpZiAoY29udGVudEVsZW1lbnQgaW5zdGFuY2VvZiBUYXNrKSB7Ci0JCQkJaWYgKCgoVGFzaykgY29udGVudEVsZW1lbnQpLmdldFBlcmZvcm1lZEJ5KCkgIT0gbnVsbCkgewotCQkJCQllbGVtZW50cy5hZGRBbGwoKChUYXNrKSBjb250ZW50RWxlbWVudCkuZ2V0UGVyZm9ybWVkQnkoKSk7Ci0JCQkJfQotCQkJCWlmICgoKFRhc2spIGNvbnRlbnRFbGVtZW50KS5nZXRBZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSgpICE9IG51bGwpIHsKLQkJCQkJZWxlbWVudHMuYWRkQWxsKCgoVGFzaykgY29udGVudEVsZW1lbnQpCi0JCQkJCQkJLmdldEFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5KCkpOwotCQkJCX0KLQkJCQlpZiAoKChUYXNrKSBjb250ZW50RWxlbWVudCkuZ2V0TWFuZGF0b3J5SW5wdXQoKSAhPSBudWxsKSB7Ci0JCQkJCWVsZW1lbnRzCi0JCQkJCQkJLmFkZEFsbCgoKFRhc2spIGNvbnRlbnRFbGVtZW50KS5nZXRNYW5kYXRvcnlJbnB1dCgpKTsKLQkJCQl9Ci0JCQkJaWYgKCgoVGFzaykgY29udGVudEVsZW1lbnQpLmdldE9wdGlvbmFsSW5wdXQoKSAhPSBudWxsKSB7Ci0JCQkJCWVsZW1lbnRzLmFkZEFsbCgoKFRhc2spIGNvbnRlbnRFbGVtZW50KS5nZXRPcHRpb25hbElucHV0KCkpOwotCQkJCX0KLQkJCQlpZiAoKChUYXNrKSBjb250ZW50RWxlbWVudCkuZ2V0T3V0cHV0KCkgIT0gbnVsbCkgewotCQkJCQllbGVtZW50cy5hZGRBbGwoKChUYXNrKSBjb250ZW50RWxlbWVudCkuZ2V0T3V0cHV0KCkpOwotCQkJCX0KLQkJCX0KLQkJCWlmIChjb250ZW50RWxlbWVudCBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0KSB7Ci0vKgkJCQlpZiAoQXNzb2NpYXRpb25IZWxwZXIKLQkJCQkJCS5nZXRNb2RpZmllZEJ5KChXb3JrUHJvZHVjdCkgY29udGVudEVsZW1lbnQpICE9IG51bGwpIHsKLQkJCQkJZWxlbWVudHMuYWRkQWxsKEFzc29jaWF0aW9uSGVscGVyCi0JCQkJCQkJLmdldE1vZGlmaWVkQnkoKFdvcmtQcm9kdWN0KSBjb250ZW50RWxlbWVudCkpOwotCQkJCX0KLQkJCQlpZiAoQXNzb2NpYXRpb25IZWxwZXIKLQkJCQkJCS5nZXRNYW5kYXRvcnlJbnB1dFRvVGFza3MoKFdvcmtQcm9kdWN0KSBjb250ZW50RWxlbWVudCkgIT0gbnVsbCkgewotCQkJCQllbGVtZW50cwotCQkJCQkJCS5hZGRBbGwoQXNzb2NpYXRpb25IZWxwZXIKLQkJCQkJCQkJCS5nZXRNYW5kYXRvcnlJbnB1dFRvVGFza3MoKFdvcmtQcm9kdWN0KSBjb250ZW50RWxlbWVudCkpOwotCQkJCX0KLQkJCQlpZiAoQXNzb2NpYXRpb25IZWxwZXIKLQkJCQkJCS5nZXRPdXRwdXR0aW5nVGFza3MoKFdvcmtQcm9kdWN0KSBjb250ZW50RWxlbWVudCkgIT0gbnVsbCkgewotCQkJCQllbGVtZW50cy5hZGRBbGwoQXNzb2NpYXRpb25IZWxwZXIKLQkJCQkJCQkuZ2V0T3V0cHV0dGluZ1Rhc2tzKChXb3JrUHJvZHVjdCkgY29udGVudEVsZW1lbnQpKTsKLQkJCQl9Ci0JCQkJTGlzdCBsaXN0ID0gQXNzb2NpYXRpb25IZWxwZXIuZ2V0UmVzcG9uc2libGVSb2xlcygoV29ya1Byb2R1Y3QpIGNvbnRlbnRFbGVtZW50KTsKLQkJCQlpZiAobGlzdCAhPSBudWxsKSB7Ci0JCQkJCWVsZW1lbnRzLmFkZEFsbChsaXN0KTsKLQkJCQl9Ki8KLQkJCX0KLQotCQl9Ci0KLQkJTGlzdDxDb250ZW50UGFja2FnZT4gY3BMaXN0ID0gbmV3IEFycmF5TGlzdDxDb250ZW50UGFja2FnZT4oKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbGVtZW50cy5zaXplKCk7IGkrKykgewotCQkJT2JqZWN0IG9iamVjdCA9ICgoQ29udGVudEVsZW1lbnQpIGVsZW1lbnRzLmdldChpKSkuZUNvbnRhaW5lcigpOwotCQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIENvbnRlbnRQYWNrYWdlKSB7Ci0JCQkJaWYgKCFjb250ZW50UGFja2FnZS5lcXVhbHMob2JqZWN0KSkgewotCQkJCQlpZiAoIWNwTGlzdC5jb250YWlucygoQ29udGVudFBhY2thZ2Upb2JqZWN0KSkgewotCQkJCQkJY3BMaXN0LmFkZCgoQ29udGVudFBhY2thZ2Upb2JqZWN0KTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gY3BMaXN0OwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBPYmplY3QgZ2V0Q29udGVudEVsZW1lbnQoKSB7Ci0JCXJldHVybiBjb250ZW50UGFja2FnZTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBsb2FkU2VjdGlvbkRlc2NyaXB0aW9uKCkgewotCQl0aGlzLmdlbmVyYWxTZWN0aW9uRGVzY3JpcHRpb24gPSBNZXNzYWdlRm9ybWF0LmZvcm1hdCgKLQkJCQlBdXRob3JpbmdVSVRleHQuR0VORVJBTF9JTkZPX1NFQ1RJT05fREVTQywKLQkJCQluZXcgU3RyaW5nW10geyBMaWJyYXJ5VUlUZXh0LmdldFVJVGV4dExvd2VyKGNvbnRlbnRQYWNrYWdlKSB9KTsKLQl9CQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL0N1c3RvbUNhdGVnb3J5QXNzaWduUGFnZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9DdXN0b21DYXRlZ29yeUFzc2lnblBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWY3YTYzNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL0N1c3RvbUNhdGVnb3J5QXNzaWduUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTI5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzc2lmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9ucy5MaWJyYXJ5Vmlld0RlbGV0ZUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZpbHRlcnMuQWxsRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudmlld3MuTGlicmFyeVZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5TdHJVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklBY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5NZXRob2RFbGVtZW50U2V0UHJvcGVydHlDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuRmlsdGVyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5DYXRlZ29yeVNvcnRIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkNvbnRlbnRFbGVtZW50T3JkZXJMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5NZXRob2RFbGVtZW50UHJvcGVydHlIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLk1vZGVsU3RydWN0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbi5EZXBlbmRlbmN5Q2hlY2tlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5MaWJyYXJ5VUlNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuTGlicmFyeU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5MaWJyYXJ5VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DdXN0b21DYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50UHJvcGVydHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NaWxlc3RvbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGVybURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5Bc3NvY2lhdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuTWVzc2FnZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkFycmF5Q29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ29tYm9WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5JTWFuYWdlZEZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuZWRpdG9yLkZvcm1FZGl0b3I7Ci0KLQotLyoqCi0gKiBUaGUgQXNzaWduIHBhZ2UgaW4gdGhlIEN1c3RvbSBDYXRlZ29yeSBlZGl0b3IuCi0gKiAKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQ3VzdG9tQ2F0ZWdvcnlBc3NpZ25QYWdlIGV4dGVuZHMgQXNzb2NpYXRpb25Gb3JtUGFnZSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9STV9QQUdFX0lEID0gImN1c3RvbUNhdGVnb3J5QXNzaWduUGFnZSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgQ3VzdG9tQ2F0ZWdvcnkgY2F0ZWdvcnk7Ci0KLQkvL3ByaXZhdGUgQ29udGVudEVsZW1lbnRPcmRlckxpc3QgYWxsU3RlcHM7Ci0JcHJpdmF0ZSBDb250ZW50RWxlbWVudE9yZGVyTGlzdCBhbGxTdGVwczsKLQotCXByaXZhdGUgQnV0dG9uIGluY2x1ZGVDaGVja0JveDsKLQotCXByaXZhdGUgQ29tYm9WaWV3ZXIgdHlwZUNvbWJvVmlld2VyOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgQ3VzdG9tQ2F0ZWdvcnlBc3NpZ25QYWdlKEZvcm1FZGl0b3IgZWRpdG9yKSB7Ci0JCXN1cGVyKGVkaXRvciwgRk9STV9QQUdFX0lELCBBdXRob3JpbmdVSVRleHQuQVNTSUdOX1BBR0VfVElUTEUpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVGb3JtQ29udGVudChJTWFuYWdlZEZvcm0gbWFuYWdlZEZvcm0pIHsKLQkJc3VwZXIuY3JlYXRlRm9ybUNvbnRlbnQobWFuYWdlZEZvcm0pOwotCQkKLQkJY3RybF9hZGQuc2V0VGV4dChBdXRob3JpbmdVSVJlc291cmNlcy5hc3NpZ25BY3Rpb25fdGV4dCk7Ci0JCWN0cmxfcmVtb3ZlLnNldFRleHQoQXV0aG9yaW5nVUlSZXNvdXJjZXMudW5hc3NpZ25BY3Rpb25fdGV4dCk7Ci0JCQotCQljcmVhdGVJbmNsdWRlQ29tcG9zaXRlKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUluY2x1ZGVDb21wb3NpdGUoKSB7Ci0JCWNyZWF0ZUNvbXBvc2l0ZUZvckJ1dHRvbnModG9vbGtpdCwgYUNvbXBvc2l0ZSk7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBjcmVhdGVDb21wb3NpdGUodG9vbGtpdCwgYUNvbXBvc2l0ZSwgR3JpZERhdGEuRklMTF9CT1RILCAxLCAxLCAyKTsKLQkJaW5jbHVkZUNoZWNrQm94ID0gdG9vbGtpdC5jcmVhdGVCdXR0b24oY29tcG9zaXRlLCBBdXRob3JpbmdVSVJlc291cmNlcy5DdXN0b21DYXRlZ29yeUFzc2lnblBhZ2VfaW5jbHVkZUVsZW1lbnRzT2ZUeXBlLCBTV1QuQ0hFQ0spOwotCQlpbmNsdWRlQ2hlY2tCb3guc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuQkVHSU5OSU5HKSk7Ci0JCUNvbWJvIHR5cGVDb21ibyA9IG5ldyBDb21ibyhjb21wb3NpdGUsIFNXVC5TSU5HTEUgfCBTV1QuRkxBVCB8IFNXVC5SRUFEX09OTFkpOwotCQl0eXBlQ29tYm8uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuQkVHSU5OSU5HKSk7Ci0JCXR5cGVDb21ib1ZpZXdlciA9IG5ldyBDb21ib1ZpZXdlcih0eXBlQ29tYm8pOwotCQl0eXBlQ29tYm9WaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBBcnJheUNvbnRlbnRQcm92aWRlcigpKTsKLQkJdHlwZUNvbWJvVmlld2VyLnNldExhYmVsUHJvdmlkZXIobmV3IExhYmVsUHJvdmlkZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgewotCQkJCWlmKGVsZW1lbnQgaW5zdGFuY2VvZiBFQ2xhc3MpIHsKLQkJCQkJcmV0dXJuIFRuZ1V0aWwuZ2V0VHlwZVRleHQoKEVDbGFzcykgZWxlbWVudCk7Ci0JCQkJfQotCQkJCXJldHVybiBzdXBlci5nZXRUZXh0KGVsZW1lbnQpOwotCQkJfQotCQl9KTsKLQkJdHlwZUNvbWJvVmlld2VyLnNldElucHV0KExpYnJhcnlVdGlsLmdldEluY2x1ZGVkRWxlbWVudFR5cGVzKCkpOwotCQkKLQkJLy8gcG9wdWxhdGUgZGF0YQotCQkvLwotCQlNZXRob2RFbGVtZW50UHJvcGVydHkgcHJvcCA9IE1ldGhvZEVsZW1lbnRQcm9wZXJ0eUhlbHBlci5nZXRQcm9wZXJ0eShjYXRlZ29yeSwgTWV0aG9kRWxlbWVudFByb3BlcnR5SGVscGVyLkNVU1RPTV9DQVRFR09SWV9fSU5DTFVERURfRUxFTUVOVFMpOwotCQlpZihwcm9wICE9IG51bGwpIHsKLQkJCWluY2x1ZGVDaGVja0JveC5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCQlFQ2xhc3NpZmllciBjbHMgPSBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRFQ2xhc3NpZmllcihwcm9wLmdldFZhbHVlKCkpOwotCQkJaWYoY2xzIGluc3RhbmNlb2YgRUNsYXNzKSB7Ci0JCQkJdHlwZUNvbWJvVmlld2VyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihjbHMpKTsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCXR5cGVDb21iby5zZXRFbmFibGVkKGZhbHNlKTsKLQkJfQotCQkKLQkJLy8gYWRkIGxpc3RlbmVycwotCQkvLwotCQlpbmNsdWRlQ2hlY2tCb3guYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQl0eXBlQ29tYm9WaWV3ZXIuZ2V0Q29tYm8oKS5zZXRFbmFibGVkKGluY2x1ZGVDaGVja0JveC5nZXRTZWxlY3Rpb24oKSk7Ci0JCQkJdXBkYXRlSW5jbHVkZSgpOwotCQkJfQotCQl9KTsKLQkJdHlwZUNvbWJvVmlld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQotCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQlpZihpbmNsdWRlQ2hlY2tCb3guZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCQkJdXBkYXRlSW5jbHVkZSgpOwotCQkJCX0KLQkJCX0KLQkJCQotCQl9KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdXBkYXRlSW5jbHVkZSgpIHsKLQkJaWYoaW5jbHVkZUNoZWNrQm94LmdldFNlbGVjdGlvbigpKSB7Ci0JCQlTdHJpbmcgdHlwZTsKLQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgdHlwZUNvbWJvVmlld2VyLmdldFNlbGVjdGlvbigpOwotCQkJaWYoc2VsZWN0aW9uLmlzRW1wdHkoKSkgewotCQkJCXR5cGUgPSBTdHJVdGlsLkVNUFRZX1NUUklORzsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXR5cGUgPSAoKEVDbGFzcykgc2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpKS5nZXROYW1lKCk7Ci0JCQl9Ci0JCQlNZXRob2RFbGVtZW50U2V0UHJvcGVydHlDb21tYW5kIGNtZCA9IG5ldyBNZXRob2RFbGVtZW50U2V0UHJvcGVydHlDb21tYW5kKGNhdGVnb3J5LAotCQkJCQlNZXRob2RFbGVtZW50UHJvcGVydHlIZWxwZXIuQ1VTVE9NX0NBVEVHT1JZX19JTkNMVURFRF9FTEVNRU5UUywgdHlwZSk7Ci0JCQlnZXRBY3Rpb25NYW5hZ2VyKCkuZXhlY3V0ZShjbWQpOwotCQl9Ci0JCWVsc2UgewotCQkJLy8gcmVtb3ZlIHByb3BlcnR5ICJpbmNsdWRlIgotCQkJLy8KLQkJCU1ldGhvZEVsZW1lbnRQcm9wZXJ0eSBwcm9wID0gTWV0aG9kRWxlbWVudFByb3BlcnR5SGVscGVyLmdldFByb3BlcnR5KGNhdGVnb3J5LCBNZXRob2RFbGVtZW50UHJvcGVydHlIZWxwZXIuQ1VTVE9NX0NBVEVHT1JZX19JTkNMVURFRF9FTEVNRU5UUyk7Ci0JCQlpZihwcm9wICE9IG51bGwpIHsKLQkJCQlnZXRBY3Rpb25NYW5hZ2VyKCkuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuUkVNT1ZFLCBjYXRlZ29yeSwgVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWV0aG9kRWxlbWVudF9NZXRob2RFbGVtZW50UHJvcGVydHkoKSwgcHJvcCwgLTEpOwotCQkJfQotCQl9Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2luaXQob3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGUsIG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElFZGl0b3JTaXRlIHNpdGUsIElFZGl0b3JJbnB1dCBpbnB1dCkgewotCQlzdXBlci5pbml0KHNpdGUsIGlucHV0KTsKLQkJY2F0ZWdvcnkgPSAoQ3VzdG9tQ2F0ZWdvcnkpIGNvbnRlbnRFbGVtZW50OwotCQlzZXRVc2VDYXRlZ29yeTIoZmFsc2UpOwotCQlzZXRVc2VDYXRlZ29yeTMoZmFsc2UpOwotCQlzZXRBbGxvd0NoYW5nZTEodHJ1ZSk7Ci0JCXNldElzVXBBbmREb3duQnV0dG9uc1JlcXVpcmVkMSh0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNpbml0Q29udGVudFByb3ZpZGVyU2VsZWN0ZWQoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRDb250ZW50UHJvdmlkZXJTZWxlY3RlZCgpIHsKLQkJY29udGVudFByb3ZpZGVyU2VsZWN0ZWQgPSBuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoCi0JCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJCS5nZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSkgewotCQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBvYmplY3QpIHsKLQkJCQlpZiAoYWxsU3RlcHMgPT0gbnVsbCkgewotCQkJCQlhbGxTdGVwcyA9IG5ldyBDb250ZW50RWxlbWVudE9yZGVyTGlzdCgKLQkJCQkJCQljb250ZW50RWxlbWVudCwKLQkJCQkJCQlDb250ZW50RWxlbWVudE9yZGVyTGlzdC5DT05URU5UX0VMRU1FTlRTX19GT1JfRUxFTUVOVF9PTkxZLAotCQkJCQkJCWdldE9yZGVyRmVhdHVyZSgpKTsKLQkJCQl9Ci0JCQkJTGlzdCByZXR1cm5MaXN0ID0gQ2F0ZWdvcnlTb3J0SGVscGVyLnNvcnRDYXRlZ29yeUVsZW1lbnRzKGNvbnRlbnRFbGVtZW50LCBhbGxTdGVwcy50b0FycmF5KCkpOwotCQkJCXJldHVybiByZXR1cm5MaXN0LnRvQXJyYXkoKTsKLQkJCX0KLQkJfTsKLQkJdmlld2VyX3NlbGVjdGVkLnNldENvbnRlbnRQcm92aWRlcihjb250ZW50UHJvdmlkZXJTZWxlY3RlZCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjYWRkSXRlbXNUb01vZGVsMShBcnJheUxpc3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkSXRlbXNUb01vZGVsMShBcnJheUxpc3QgYWRkSXRlbXMpIHsKLQkJYWRkSXRlbXNUb01vZGVsMShhZGRJdGVtcywgY2F0ZWdvcnksIHVzZWRDYXRlZ29yaWVzLAotCQkJCWdldEFjdGlvbk1hbmFnZXIoKSwgZ2V0QW5jZXN0b3JzKGNhdGVnb3J5KSk7Ci0JCWlmICghYWRkSXRlbXMuaXNFbXB0eSgpKSB7Ci0JCQlzZXREaXJ0eSh0cnVlKTsKLQkJfQotCX0KLQkJCi0JcHVibGljIHN0YXRpYyB2b2lkIGFkZEl0ZW1zVG9Nb2RlbDEoQXJyYXlMaXN0IGFkZEl0ZW1zLCAKLQkJCUN1c3RvbUNhdGVnb3J5IGNhdGVnb3J5LAotCQkJQXJyYXlMaXN0IHVzZWRDYXRlZ29yaWVzLAotCQkJSUFjdGlvbk1hbmFnZXIgYWN0aW9uTWFuYWdlciwKLQkJCUxpc3Q8T2JqZWN0PiBhbmNlc3RvcnMKLQkJCSkgewotCQlib29sZWFuIG9rID0gRGVwZW5kZW5jeUNoZWNrZXIuY2hlY2tDaXJjdWxhckZvck1vdmluZ1ZhcmlhYmlsaXR5RWxlbWVudChjYXRlZ29yeSwgYWRkSXRlbXMpOwotCQlpZighIG9rKSB7Ci0JCQlTdHJpbmcgdGl0bGUgPSBBdXRob3JpbmdVSVJlc291cmNlcy5jaXJjdWxhcl9kZXBlbmRlbmN5X2Vycm9yX3RpdGxlOwotCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpLmRpc3BsYXlFcnJvcih0aXRsZSwgTGlicmFyeUVkaXRSZXNvdXJjZXMuY2lyY3VsYXJfZGVwZW5kZW5jeV9lcnJvcl9tc2cpOwkJCQkJCQotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQkvL0xpc3Q8T2JqZWN0PiBhbmNlc3RvcnMgPSBnZXRBbmNlc3RvcnMoY2F0ZWdvcnkpOwotCQlpZiAoIWFkZEl0ZW1zLmlzRW1wdHkoKSkgewotCQkJZm9yIChJdGVyYXRvciBpdCA9IGFkZEl0ZW1zLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlNZXRob2RFbGVtZW50IGN1c3RvbUNhdGVnb3J5ID0gKE1ldGhvZEVsZW1lbnQpIGl0Lm5leHQoKTsKLQkJCQlpZiAoY3VzdG9tQ2F0ZWdvcnkgaW5zdGFuY2VvZiBDdXN0b21DYXRlZ29yeQotCQkJCQkJJiYgVG5nVXRpbAotCQkJCQkJCQkuaXNSb290Q3VzdG9tQ2F0ZWdvcnkoKEN1c3RvbUNhdGVnb3J5KSBjdXN0b21DYXRlZ29yeSkpIHsKLQkJCQl9IGVsc2UgaWYgKGFuY2VzdG9ycy5jb250YWlucyhjdXN0b21DYXRlZ29yeSkpIHsKLQkJCQl9IGVsc2UgewotCQkJCQlpZiAoY3VzdG9tQ2F0ZWdvcnkgaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50KSB7Ci0JCQkJCQlNZXRob2RFbGVtZW50IG9iamVjdCA9ICgoUHJvY2Vzc0NvbXBvbmVudCkgY3VzdG9tQ2F0ZWdvcnkpCi0JCQkJCQkJCS5nZXRQcm9jZXNzKCk7Ci0JCQkJCQlMaWJyYXJ5TWFuYWdlci5nZXRJbnN0YW5jZSgpLmFkZFRvQ3VzdG9tQ2F0ZWdvcnkoCi0JCQkJCQkJCWFjdGlvbk1hbmFnZXIsIGNhdGVnb3J5LCBvYmplY3QsIHVzZWRDYXRlZ29yaWVzKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCUxpYnJhcnlNYW5hZ2VyLmdldEluc3RhbmNlKCkuYWRkVG9DdXN0b21DYXRlZ29yeSgKLQkJCQkJCQkJYWN0aW9uTWFuYWdlciwgY2F0ZWdvcnksIGN1c3RvbUNhdGVnb3J5LCB1c2VkQ2F0ZWdvcmllcyk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQkvL3NldERpcnR5KHRydWUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjcmVtb3ZlSXRlbXNGcm9tTW9kZWwxKEFycmF5TGlzdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVJdGVtc0Zyb21Nb2RlbDEoQXJyYXlMaXN0IHJtSXRlbXMpIHsKLQkJcmVtb3ZlSXRlbXNGcm9tTW9kZWwxKHJtSXRlbXMsIGNhdGVnb3J5LCB1c2VkQ2F0ZWdvcmllcywKLQkJCQlnZXRBY3Rpb25NYW5hZ2VyKCksIGdldEFuY2VzdG9ycyhjYXRlZ29yeSkpOwotCQlpZiAoIXJtSXRlbXMuaXNFbXB0eSgpKSB7Ci0JCQlzZXREaXJ0eSh0cnVlKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVtb3ZlSXRlbXNGcm9tTW9kZWwxKEFycmF5TGlzdCBybUl0ZW1zLAotCQlDdXN0b21DYXRlZ29yeSBjYXRlZ29yeSwKLQkJQXJyYXlMaXN0IHVzZWRDYXRlZ29yaWVzLAotCQlJQWN0aW9uTWFuYWdlciBhY3Rpb25NYW5hZ2VyLAotCQlMaXN0PE9iamVjdD4gYW5jZXN0b3JzCi0JCSkgewotCQlpZiAoIXJtSXRlbXMuaXNFbXB0eSgpKSB7Ci0JCQlBcnJheUxpc3Q8TWV0aG9kRWxlbWVudD4gY3VzdG9tQ2F0ZWdvcmllc1RvRGVsZXRlID0gbmV3IEFycmF5TGlzdDxNZXRob2RFbGVtZW50PigpOwotCQkJTWV0aG9kUGx1Z2luIGN1cnJlbnRQbHVnaW4gPSBVbWFVdGlsLmdldE1ldGhvZFBsdWdpbihjYXRlZ29yeSk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gcm1JdGVtcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJTWV0aG9kRWxlbWVudCBlID0gKE1ldGhvZEVsZW1lbnQpIGl0Lm5leHQoKTsKLQkJCQlpZiAoZSBpbnN0YW5jZW9mIEN1c3RvbUNhdGVnb3J5KSB7Ci0vLwkJCQkJQWRhcHRlciBhZGFwdGVyID0gVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLS8vCQkJCQkJCS5nZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKS5hZGFwdCgKLS8vCQkJCQkJCQkJY2F0ZWdvcnksIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0vLwkJCQkJaWYgKGFkYXB0ZXIgIT0gbnVsbAotLy8JCQkJCQkJJiYgYWRhcHRlciBpbnN0YW5jZW9mIEl0ZW1Qcm92aWRlckFkYXB0ZXIpIHsKLS8vCQkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gKChJdGVtUHJvdmlkZXJBZGFwdGVyKSBhZGFwdGVyKQotLy8JCQkJCQkJCS5nZXRDaGlsZHJlbihjYXRlZ29yeSkuaXRlcmF0b3IoKTsgaXRlcgotLy8JCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0vLwkJCQkJCQlPYmplY3QgbyA9IGl0ZXIubmV4dCgpOwotLy8JCQkJCQkJaWYgKFRuZ1V0aWwudW53cmFwKG8pID09IGUpIHsKLS8vCQkJCQkJCQljdXN0b21DYXRlZ29yaWVzVG9EZWxldGUuYWRkKG8pOwotLy8JCQkJCQkJfQotLy8JCQkJCQl9Ci0vLwkJCQkJfQotCQkJCQkKLQkJCQkJLy8gd2lsbCBkZWxldGUgZSBpZiBpdCBpcyBpbiB0aGUgY3VycmVudCBwbHVnaW4gYW5kCi0JCQkJCS8vIHRoZSBsYXN0IHN1cGVyIGN1c3RvbSBjYXRlZ29yeSBvZiBlIGluIHRoZSBjdXJyZW50IHBsdWdpbgotCQkJCQkvLwotCQkJCQlpZihUbmdVdGlsLmlzSW5QbHVnaW5XaXRoTGVzc1RoYW5PbmVTdXBlckN1c3RvbUNhdGVnb3J5KChDdXN0b21DYXRlZ29yeSkgZSwgY3VycmVudFBsdWdpbikpIHsKLQkJCQkJCWN1c3RvbUNhdGVnb3JpZXNUb0RlbGV0ZS5hZGQoZSk7Ci0JCQkJCQljb250aW51ZTsKLQkJCQkJfQotCQkJCX0JCQkJCi0JCQkJTGlicmFyeU1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5yZW1vdmVGcm9tQ3VzdG9tQ2F0ZWdvcnkoCi0JCQkJCQlhY3Rpb25NYW5hZ2VyLCBjYXRlZ29yeSwgZSwgdXNlZENhdGVnb3JpZXMpOwotCQkJfQotCi0JCQlpZiAoY3VzdG9tQ2F0ZWdvcmllc1RvRGVsZXRlLnNpemUoKSA+IDApIHsKLQkJCQlpbnQgaSA9IDA7Ci0JCQkJU3RyaW5nQnVmZmVyIGVsZW1lbnRTdHIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQkJZm9yIChJdGVyYXRvcjxNZXRob2RFbGVtZW50PiBpdCA9IGN1c3RvbUNhdGVnb3JpZXNUb0RlbGV0ZS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJCU9iamVjdCBvYmogPSBUbmdVdGlsLnVud3JhcChpdC5uZXh0KCkpOwotCQkJCQlpZiAob2JqIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJCQkJaWYgKGkgPiAwKSB7Ci0JCQkJCQkJZWxlbWVudFN0ci5hcHBlbmQoIiwgIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCX0KLQkJCQkJCWVsZW1lbnRTdHIuYXBwZW5kKCgoTWV0aG9kRWxlbWVudCkgb2JqKS5nZXROYW1lKCkpOwotCi0JCQkJCQlpKys7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJCi0JCQkJaWYoIUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKS5kaXNwbGF5Q29uZmlybWF0aW9uKEF1dGhvcmluZ1VJUmVzb3VyY2VzLnJlbW92ZV90ZXh0LAotCQkJCQkJTkxTLmJpbmQoQXV0aG9yaW5nVUlSZXNvdXJjZXMucHJvbXB0RGVsZXRlQ3VzdG9tQ2F0ZWdvcnlCZWZvcmVSZW1vdmVMYXN0UmVmVG9JdCwgZWxlbWVudFN0cikpKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJTGlicmFyeVZpZXdEZWxldGVBY3Rpb24gZGVsZXRlQWN0aW9uID0gbmV3IExpYnJhcnlWaWV3RGVsZXRlQWN0aW9uKCkgewotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQlTdHJpbmcgdGl0bGUgPSBBdXRob3JpbmdVSVJlc291cmNlcy5hY3Rpb25zX0xpYnJhcnlBY3Rpb25CYXJDb250cmlidXRvcl9kZWxldGVFcnJvclRpdGxlOyAKLQkJCQkJCWNvbmZpcm0gPSBmYWxzZTsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJc3VwZXIucnVuKCk7Ci0JCQkJCQl9IGNhdGNoIChNZXNzYWdlRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkKLQkJCQkJCQkJCS5kaXNwbGF5RXJyb3IodGl0bGUsIGUuZ2V0TWVzc2FnZSgpKTsKLQkJCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJU3RyaW5nIGRldGFpbHMgPSBUbmdVdGlsLnRvU3RhY2tUcmFjZVN0cmluZyhlKTsKLQkJCQkJCQlTdHJpbmcgbWVzc2FnZSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmFjdGlvbnNfTGlicmFyeUFjdGlvbkJhckNvbnRyaWJ1dG9yX2RlbGV0ZUVycm9yTWVzc2FnZTsgCi0JCQkJCQkJU3RyaW5nIHJlYXNvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmFjdGlvbnNfTGlicmFyeUFjdGlvbkJhckNvbnRyaWJ1dG9yX2RlbGV0ZUVycm9yUmVhc29uOyAKLQkJCQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkKLQkJCQkJCQkJCS5kaXNwbGF5RXJyb3IodGl0bGUsIG1lc3NhZ2UsIHJlYXNvbiwKLQkJCQkJCQkJCQkJZGV0YWlscywgZSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQotCQkJCQlwcm90ZWN0ZWQgdm9pZCBkZWxldGVGYWlsZWQoKSB7Ci0JCQkJCQkvLyBsaWJyYXJ5IG5lZWQgdG8gYmUgcmVsb2FkZWQKLQkJCQkJCVN0cmluZyBsaWJEaXIgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJCQkJCS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeUxvY2F0aW9uKCk7Ci0JCQkJCQlMaWJyYXJ5VUlNYW5hZ2VyLmdldEluc3RhbmNlKCkub3BlbkxpYnJhcnkobGliRGlyKTsKLQkJCQkJfQotCQkJCQkKLQkJCQl9OwotCQkJCWRlbGV0ZUFjdGlvbi5zZXRFZGl0aW5nRG9tYWluKExpYnJhcnlWaWV3LmdldFZpZXcoKQotCQkJCQkJLmdldEVkaXRpbmdEb21haW4oKSk7Ci0JCQkJZGVsZXRlQWN0aW9uLnNlbGVjdGlvbkNoYW5nZWQobmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oCi0JCQkJCQljdXN0b21DYXRlZ29yaWVzVG9EZWxldGUpKTsKLQkJCQlkZWxldGVBY3Rpb24ucnVuKCk7Ci0JCQl9Ci0JCQkvL3NldERpcnR5KHRydWUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgYW5jZXN0b3JzIGZvciB0aGUgZ2l2ZW4gQ3VzdG9tIENhdGVnb3J5LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdDxPYmplY3Q+IGdldEFuY2VzdG9ycyhDdXN0b21DYXRlZ29yeSBtZXRob2RPYmplY3QpIHsKLQkJTGlzdDxPYmplY3Q+IGFuY2VzdG9yTGlzdCA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PigpOwotCQlMaXN0PE9iamVjdD4gb2JqTGlzdCA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PigpOwotCQlvYmpMaXN0LmFkZChtZXRob2RPYmplY3QpOwotCQlnZXRBbmNlc3RvcnMoYW5jZXN0b3JMaXN0LCBvYmpMaXN0KTsKLQkJcmV0dXJuIGFuY2VzdG9yTGlzdDsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBMaXN0PE9iamVjdD4gZ2V0QW5jZXN0b3JzKExpc3Q8T2JqZWN0PiBhbmNlc3Rvckxpc3QsIExpc3Q8T2JqZWN0PiBtZXRob2RPYmplY3RMaXN0KSB7Ci0JCWlmIChtZXRob2RPYmplY3RMaXN0LmlzRW1wdHkoKSkKLQkJCXJldHVybiBhbmNlc3Rvckxpc3Q7Ci0KLQkJTGlzdCBhbGxQYXJlbnRDdXN0Q2F0cyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQlmb3IgKEl0ZXJhdG9yPE9iamVjdD4gaXRlciA9IG1ldGhvZE9iamVjdExpc3QuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlDdXN0b21DYXRlZ29yeSBlbGVtZW50ID0gKEN1c3RvbUNhdGVnb3J5KSBpdGVyLm5leHQoKTsKLQkJCUxpc3QgcGFyZW50TGlzdCA9IEFzc29jaWF0aW9uSGVscGVyLmdldEN1c3RvbUNhdGVnb3JpZXMoZWxlbWVudCk7Ci0JCQlhbGxQYXJlbnRDdXN0Q2F0cy5hZGRBbGwocGFyZW50TGlzdCk7Ci0JCX0KLQotCQlhbmNlc3Rvckxpc3QuYWRkQWxsKG1ldGhvZE9iamVjdExpc3QpOwotCQlMaXN0PE9iamVjdD4gbmV4dENoZWNrTGlzdCA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PigpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBhbGxQYXJlbnRDdXN0Q2F0cy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAoIWFuY2VzdG9yTGlzdC5jb250YWlucyhlbGVtZW50KSkgewotCQkJCW5leHRDaGVja0xpc3QuYWRkKGVsZW1lbnQpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGdldEFuY2VzdG9ycyhhbmNlc3Rvckxpc3QsIG5leHRDaGVja0xpc3QpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2dldENvbnRlbnRFbGVtZW50KCkKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGdldENvbnRlbnRFbGVtZW50KCkgewotCQlyZXR1cm4gY2F0ZWdvcnk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjZ2V0VGFiU3RyaW5nKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFRhYlN0cmluZygpIHsKLQkJcmV0dXJuIEZpbHRlckNvbnN0YW50cy5BTExfRUxFTUVOVFM7Ci0JfQotCi0JcHJpdmF0ZSBjbGFzcyBDdXN0b21DYXRlZ29yeUFzc2lnbkZpbHRlciBleHRlbmRzIEFsbEZpbHRlciB7Ci0JCXByb3RlY3RlZCBib29sZWFuIGNoaWxkQWNjZXB0KE9iamVjdCBvYmopIHsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBQcm9jZXNzUGFja2FnZSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBQcm9jZXNzKQotCQkJCXJldHVybiB0cnVlOwotCQkJaWYob2JqIGluc3RhbmNlb2YgTWlsZXN0b25lKXsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJCWlmKG9iaiBpbnN0YW5jZW9mIEFjdGl2aXR5KXsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJCWlmIChvYmogaW5zdGFuY2VvZiBDdXN0b21DYXRlZ29yeSkgewotCQkJCWlmIChUbmdVdGlsLmlzUm9vdEN1c3RvbUNhdGVnb3J5KChDdXN0b21DYXRlZ29yeSkgb2JqKSkgewotCQkJCQlyZXR1cm4gISgoKEN1c3RvbUNhdGVnb3J5KSBvYmopLmdldENhdGVnb3JpemVkRWxlbWVudHMoKQotCQkJCQkJCS5pc0VtcHR5KCkpOwotCQkJCX0KLQkJCX0KLQkJCWlmIChvYmogaW5zdGFuY2VvZiBUZXJtRGVmaW5pdGlvbikKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgQ29udGVudEVsZW1lbnQpIHsKLQkJCQkvLyBpZiAob2JqIGluc3RhbmNlb2YgRGlzY2lwbGluZSl7Ci0JCQkJLy8gcmV0dXJuCi0JCQkJLy8gQXNzb2NpYXRpb25IZWxwZXIuZ2V0RGlzY2lwbGluZUdyb3VwcygoRGlzY2lwbGluZSlvYmopLmlzRW1wdHkoKTsKLQkJCQkvLyB9Ci0JCQkJLy8gaWYgKG9iaiBpbnN0YW5jZW9mIFJvbGVTZXQpewotCQkJCS8vIHJldHVybgotCQkJCS8vIEFzc29jaWF0aW9uSGVscGVyLmdldFJvbGVTZXRHcm91cHMoKFJvbGVTZXQpb2JqKS5pc0VtcHR5KCk7Ci0JCQkJLy8gfQotCQkJCXJldHVybiAhKGdldEhlbHBlcigpLmlzQ29udHJpYnV0b3IoKENvbnRlbnRFbGVtZW50KSBvYmopKTsKLQkJCX0KLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCX07Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRGaWx0ZXIoKQotCSAqLwotCXByb3RlY3RlZCBJRmlsdGVyIGdldEZpbHRlcigpIHsKLQkJcmV0dXJuIGZpbHRlciA9IG5ldyBDdXN0b21DYXRlZ29yeUFzc2lnbkZpbHRlcigpOwotCX0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNnZXRNdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uKGludCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldE11bHRpcGxlU2VsZWN0RGVzY3JpcHRpb24oaW50IGNvdW50KSB7Ci0JCXJldHVybiBzdXBlci5nZXRNdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uKGNvdW50LCBBdXRob3JpbmdVSVJlc291cmNlcy5jdXN0b21DYXRlZ29yeUFzc2lnblBhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbik7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldFNlY3Rpb25EZXNjcmlwdGlvbigpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTZWN0aW9uRGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy5jdXN0b21DYXRlZ29yeUFzc2lnblBhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldFNlY3Rpb25OYW1lKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlY3Rpb25OYW1lKCkgewotCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMuY3VzdG9tQ2F0ZWdvcnlBc3NpZ25QYWdlX3NlY3Rpb25OYW1lOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldFNlbGVjdGVkTGFiZWwoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VsZWN0ZWRMYWJlbCgpIHsKLQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLmN1c3RvbUNhdGVnb3J5QXNzaWduUGFnZV9zZWxlY3RlZExhYmVsOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNnZXRTZWxlY3RlZExhYmVsMigpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTZWxlY3RlZExhYmVsMigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldFNlbGVjdGVkTGFiZWwzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlbGVjdGVkTGFiZWwzKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVTdHJ1Y3R1cmFsRmVhdHVyZSBnZXRPcmRlckZlYXR1cmUoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRDdXN0b21DYXRlZ29yeV9DYXRlZ29yaXplZEVsZW1lbnRzKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmdbXSBnZXRNb2RlbFN0cnVjdHVyZVBhdGgoKSB7Ci0JCXJldHVybiBNb2RlbFN0cnVjdHVyZS5ERUZBVUxULmN1c3RvbUNhdGVnb3J5UGF0aDsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIENvbnRlbnRFbGVtZW50T3JkZXJMaXN0IGdldENvbnRlbnRFbGVtZW50T3JkZXJMaXN0KCkgewotCQlyZXR1cm4gYWxsU3RlcHM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9DdXN0b21DYXRlZ29yeURlc2NyaXB0aW9uUGFnZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9DdXN0b21DYXRlZ29yeURlc2NyaXB0aW9uUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZDE1MzhhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvQ3VzdG9tQ2F0ZWdvcnlEZXNjcmlwdGlvblBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZmlsdGVycy5DdXN0b21DYXRlZ29yeUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5GaWx0ZXJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5WYXJpYWJpbGl0eUJhc2VFbGVtZW50RmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ3VzdG9tQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLmVkaXRvci5Gb3JtRWRpdG9yOwotCi0KLS8qKgotICogVGhlIERlc2NyaXB0aW9uIHBhZ2UgZm9yIHRoZSBEb21haW4gZWRpdG9yLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBDdXN0b21DYXRlZ29yeURlc2NyaXB0aW9uUGFnZSBleHRlbmRzIERlc2NyaXB0aW9uRm9ybVBhZ2UgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZPUk1fUEFHRV9JRCA9ICJjdXN0b21DYXRlZ29yeURlc2NyaXB0aW9uUGFnZSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgQ3VzdG9tQ2F0ZWdvcnkgY2F0ZWdvcnk7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBDdXN0b21DYXRlZ29yeURlc2NyaXB0aW9uUGFnZShGb3JtRWRpdG9yIGVkaXRvcikgewotCQlzdXBlcihlZGl0b3IsIEZPUk1fUEFHRV9JRCwgQXV0aG9yaW5nVUlUZXh0LkRFU0NSSVBUSU9OX1BBR0VfVElUTEUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2luaXQob3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGUsIG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElFZGl0b3JTaXRlIHNpdGUsIElFZGl0b3JJbnB1dCBpbnB1dCkgewotCQlzdXBlci5pbml0KHNpdGUsIGlucHV0KTsKLQkJY2F0ZWdvcnkgPSAoQ3VzdG9tQ2F0ZWdvcnkpIGNvbnRlbnRFbGVtZW50OwotCQlwdWJsaXNoQ2F0ZWdvcnlPbiA9IHRydWU7Ci0JCXNldEljb25TZWN0aW9uT24odHJ1ZSk7Ci0JCXNldEV4dGVybmFsSURPbih0cnVlKTsKLQkJc2V0TG9uZ1ByZXNlbnRhdGlvbk5hbWVPbih0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRDb250ZW50RWxlbWVudCgpCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBnZXRDb250ZW50RWxlbWVudCgpIHsKLQkJcmV0dXJuIGNhdGVnb3J5OwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2dldFRhYlN0cmluZygpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRUYWJTdHJpbmcoKSB7Ci0JCXJldHVybiBGaWx0ZXJDb25zdGFudHMuQ1VTVE9NX0NBVEVHT1JJRVM7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjZ2V0RmlsdGVyKCkKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpbHRlciBnZXRGaWx0ZXIoKSB7Ci0JCWZpbHRlciA9IG5ldyBDdXN0b21DYXRlZ29yeUZpbHRlcigpOwotCQkvLyBzZXQgYWRkaXRpb25hbCBmaWx0ZXIgZm9yIHZhcmlhYmlsaXR5IGJhc2UgZWxlbWVudCBjaGVja2luZwotCQkoKEN1c3RvbUNhdGVnb3J5RmlsdGVyKSBmaWx0ZXIpCi0JCQkJLnNldEFkZGl0aW9uYWxGaWx0ZXJzKG5ldyBJRmlsdGVyW10geyBuZXcgVmFyaWFiaWxpdHlCYXNlRWxlbWVudEZpbHRlcigKLQkJCQkJCWNhdGVnb3J5KSB9KTsKLQkJcmV0dXJuIGZpbHRlcjsKLQl9Ci0JCi0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjbG9hZFNlY3Rpb25EZXNjcmlwdGlvbigpCi0JICovCi0JcHVibGljIHZvaWQgbG9hZFNlY3Rpb25EZXNjcmlwdGlvbigpIHsKLQkJdGhpcy5nZW5lcmFsU2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuY3VzdG9tY2F0ZWdvcnlfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M7Ci0JCXRoaXMuZGV0YWlsU2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuY3VzdG9tY2F0ZWdvcnlfZGV0YWlsU2VjdGlvbl9kZXNjOwotCQl0aGlzLnZhcmlhYmlsaXR5U2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuY3VzdG9tY2F0ZWdvcnlfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M7Ci0JCXRoaXMudmVyc2lvblNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmN1c3RvbWNhdGVnb3J5X3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjOwotCQl0aGlzLmljb25TZWN0aW9uRGVzY3JpcHRpb24gPSAgQXV0aG9yaW5nVUlSZXNvdXJjZXMuY3VzdG9tY2F0ZWdvcnlfSWNvblNlY3Rpb25fZGVzYzsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDc3NWYxMS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMzIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3JtczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLk1ldGhvZEVsZW1lbnRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5yaWNodGV4dC5JTWV0aG9kUmljaFRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklBY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcnlQcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuRm9ybUVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLkZvcm1Ub29sa2l0OwotCi0KLS8qKgotICogRGVzY3JpcHRpb24gcGFnZSBmb3IgZGVsaXZlcnkgcHJvY2VzcwotICogCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBEZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbiBleHRlbmRzIFByb2Nlc3NEZXNjcmlwdGlvbiB7Ci0KLQlwcml2YXRlIElNZXRob2RSaWNoVGV4dCBjdHJsX3NjYWxlLCBjdHJsX3Byb2plY3RfY2hhcmFjdGVyaXN0aWNzOwotCi0JcHJpdmF0ZSBJTWV0aG9kUmljaFRleHQgY3RybF9yaXNrX2xldmVsLCBjdHJsX2VzdGltYXRpbmdfdGVjaG5pcXVlczsKLQotCXByaXZhdGUgSU1ldGhvZFJpY2hUZXh0IGN0cmxfcHJvamVjdF9tZW1iZXJfZXhwZXJ0aXNlLAotCQkJY3RybF90eXBlX29mX2NvbnRyYWN0OwotCi0JcHJpdmF0ZSBEZWxpdmVyeVByb2Nlc3MgZGVsaXZlcnlQcm9jZXNzOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZQotCSAqIEBwYXJhbSBlZGl0b3IKLQkgKi8KLQlwdWJsaWMgRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24oRm9ybUVkaXRvciBlZGl0b3IpIHsKLQkJc3VwZXIoZWRpdG9yKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuUHJvY2Vzc0Zvcm1QYWdlI2luaXQob3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGUsIG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElFZGl0b3JTaXRlIHNpdGUsIElFZGl0b3JJbnB1dCBpbnB1dCkgewotCQlzdXBlci5pbml0KHNpdGUsIGlucHV0KTsKLQkJZGVsaXZlcnlQcm9jZXNzID0gKERlbGl2ZXJ5UHJvY2VzcykgcHJvY2VzczsKLQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Qcm9jZXNzRGVzY3JpcHRpb24jY3JlYXRlRGV0YWlsU2VjdGlvbigpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRGV0YWlsU2VjdGlvbihGb3JtVG9vbGtpdCB0b29sa2l0KSB7Ci0JCXN1cGVyLmNyZWF0ZURldGFpbFNlY3Rpb24odG9vbGtpdCk7Ci0KLQkJLy8gc2NhbGUKLQkJY3RybF9zY2FsZSA9IGNyZWF0ZVJpY2hUZXh0RWRpdFdpdGhMaW5rRm9yU2VjdGlvbih0b29sa2l0LAotCQkJCWRldGFpbENvbXBvc2l0ZSwgQXV0aG9yaW5nVUlSZXNvdXJjZXMuUHJvY2Vzc19TY2FsZSwgNDAsIDQwMCwgREVUQUlMX1NFQ1RJT05fSUQpOyAKLQotCQkvLyBwcm9qZWN0IGNoYXJhY3RlcmlzdGljcwotCQljdHJsX3Byb2plY3RfY2hhcmFjdGVyaXN0aWNzID0gY3JlYXRlUmljaFRleHRFZGl0V2l0aExpbmtGb3JTZWN0aW9uKAotCQkJCXRvb2xraXQsCi0JCQkJZGV0YWlsQ29tcG9zaXRlLAotCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLlByb2Nlc3NfUHJvamVjdENoYXJhY3RlcmlzdGljcywgNDAsIDQwMCwgREVUQUlMX1NFQ1RJT05fSUQpOyAKLQotCQkvLyByaXNrIGxldmVsCi0JCWN0cmxfcmlza19sZXZlbCA9IGNyZWF0ZVJpY2hUZXh0RWRpdFdpdGhMaW5rRm9yU2VjdGlvbigKLQkJCQl0b29sa2l0LAotCQkJCWRldGFpbENvbXBvc2l0ZSwKLQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5Qcm9jZXNzX1Jpc2tMZXZlbCwgNDAsIDQwMCwgREVUQUlMX1NFQ1RJT05fSUQpOyAKLQotCQkvLyBFc3RpbWF0aW5nIHRlY2huaXF1ZQotCQljdHJsX2VzdGltYXRpbmdfdGVjaG5pcXVlcyA9IGNyZWF0ZVJpY2hUZXh0RWRpdFdpdGhMaW5rRm9yU2VjdGlvbigKLQkJCQl0b29sa2l0LAotCQkJCWRldGFpbENvbXBvc2l0ZSwKLQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5Qcm9jZXNzX0VzdGltYXRpbmdUZWNobmlxdWUsIDQwLCA0MDAsIERFVEFJTF9TRUNUSU9OX0lEKTsgCi0KLQkJLy8gUHJvamVjdCBNZW1iZXIgZXhwZXJ0aXNlCi0JCWN0cmxfcHJvamVjdF9tZW1iZXJfZXhwZXJ0aXNlID0gY3JlYXRlUmljaFRleHRFZGl0V2l0aExpbmtGb3JTZWN0aW9uKAotCQkJCXRvb2xraXQsCi0JCQkJZGV0YWlsQ29tcG9zaXRlLAotCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLlByb2Nlc3NfUHJvamVjdE1lbWJlckV4cGVydGlzZSwgNDAsIDQwMCwgREVUQUlMX1NFQ1RJT05fSUQpOyAKLQotCQkvLyBUeXBlIG9mIGNvbnRyYWN0Ci0JCWN0cmxfdHlwZV9vZl9jb250cmFjdCA9IGNyZWF0ZVJpY2hUZXh0RWRpdFdpdGhMaW5rRm9yU2VjdGlvbigKLQkJCQl0b29sa2l0LAotCQkJCWRldGFpbENvbXBvc2l0ZSwKLQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5Qcm9jZXNzX1R5cGVPZkNvbnRyYWN0LCA0MCwgNDAwLCBERVRBSUxfU0VDVElPTl9JRCk7IAotCQl0b29sa2l0LnBhaW50Qm9yZGVyc0ZvcihkZXRhaWxDb21wb3NpdGUpOwotCi0JfQotCi0JLyoqCi0JICogTG9hZHMgaW5pdGlhbCBkYXRhIGZyb20gbW9kZWwKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuUHJvY2Vzc0Rlc2NyaXB0aW9uI2xvYWREYXRhKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBsb2FkRGF0YSgpIHsKLQkJc3VwZXIubG9hZERhdGEoKTsKLQotCQlvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uIGNvbnRlbnQgPSAob3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbikgZGVsaXZlcnlQcm9jZXNzCi0JCQkJLmdldFByZXNlbnRhdGlvbigpOwotCQlTdHJpbmcgc2NhbGUgPSBjb250ZW50LmdldFNjYWxlKCk7Ci0JCVN0cmluZyBwcm9qZWN0Q2hhciA9IGNvbnRlbnQuZ2V0UHJvamVjdENoYXJhY3RlcmlzdGljcygpOwotCQlTdHJpbmcgZXN0aW1hdGluZ1RlY2huaXF1ZSA9IGNvbnRlbnQuZ2V0RXN0aW1hdGluZ1RlY2huaXF1ZSgpOwotCQlTdHJpbmcgcmlza0xldmVsID0gY29udGVudC5nZXRSaXNrTGV2ZWwoKTsKLQkJU3RyaW5nIHByb2plY3RNZW1iZXJFeHBlcnRpZXNlID0gY29udGVudC5nZXRQcm9qZWN0TWVtYmVyRXhwZXJ0aXNlKCk7Ci0JCVN0cmluZyB0eXBlT2ZDb250cmFjdCA9IGNvbnRlbnQuZ2V0VHlwZU9mQ29udHJhY3QoKTsKLQotCQljdHJsX3NjYWxlLnNldFRleHQoc2NhbGUgPT0gbnVsbCA/ICIiIDogc2NhbGUpOyAvLyROT04tTkxTLTEkCi0JCWN0cmxfcHJvamVjdF9jaGFyYWN0ZXJpc3RpY3MKLQkJCQkuc2V0VGV4dChwcm9qZWN0Q2hhciA9PSBudWxsID8gIiIgOiBwcm9qZWN0Q2hhcik7IC8vJE5PTi1OTFMtMSQKLQkJY3RybF9lc3RpbWF0aW5nX3RlY2huaXF1ZXMKLQkJCQkuc2V0VGV4dChlc3RpbWF0aW5nVGVjaG5pcXVlID09IG51bGwgPyAiIiA6IGVzdGltYXRpbmdUZWNobmlxdWUpOyAvLyROT04tTkxTLTEkCi0JCWN0cmxfcmlza19sZXZlbC5zZXRUZXh0KHJpc2tMZXZlbCA9PSBudWxsID8gIiIgOiByaXNrTGV2ZWwpOyAvLyROT04tTkxTLTEkCi0JCWN0cmxfcHJvamVjdF9tZW1iZXJfZXhwZXJ0aXNlCi0JCQkJLnNldFRleHQocHJvamVjdE1lbWJlckV4cGVydGllc2UgPT0gbnVsbCA/ICIiIDogcHJvamVjdE1lbWJlckV4cGVydGllc2UpOyAvLyROT04tTkxTLTEkCi0JCWN0cmxfdHlwZV9vZl9jb250cmFjdAotCQkJCS5zZXRUZXh0KHR5cGVPZkNvbnRyYWN0ID09IG51bGwgPyAiIiA6IHR5cGVPZkNvbnRyYWN0KTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEFkZCBsaXN0ZW5lcnMKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuUHJvY2Vzc0Rlc2NyaXB0aW9uI2FkZExpc3RlbmVycygpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkTGlzdGVuZXJzKCkgewotCQlzdXBlci5hZGRMaXN0ZW5lcnMoKTsKLQkJTWV0aG9kRWxlbWVudEVkaXRvciBlZGl0b3IgPSAoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpKTsKLQkJZmluYWwgSUFjdGlvbk1hbmFnZXIgYWN0aW9uTWdyID0gZWRpdG9yLmdldEFjdGlvbk1hbmFnZXIoKTsKLQkJZmluYWwgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbiBjb250ZW50ID0gKG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24pIGRlbGl2ZXJ5UHJvY2VzcwotCQkJCS5nZXRQcmVzZW50YXRpb24oKTsKLQotCQljdHJsX3NjYWxlLnNldE1vZGFsT2JqZWN0KGRlbGl2ZXJ5UHJvY2Vzcy5nZXRQcmVzZW50YXRpb24oKSk7Ci0JCWN0cmxfc2NhbGUuc2V0TW9kYWxPYmplY3RGZWF0dXJlKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX1NjYWxlKCkpOwotCQljdHJsX3NjYWxlLmFkZE1vZGlmeUxpc3RlbmVyKGNvbnRlbnRNb2RpZnlMaXN0ZW5lcik7Ci0JCWN0cmxfc2NhbGUuYWRkTGlzdGVuZXIoU1dULkRlYWN0aXZhdGUsIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQlJTWV0aG9kUmljaFRleHQgY29udHJvbCA9IGRlc2NFeHBhbmRGbGFnID8gY3RybF9leHBhbmRlZAotCQkJCQkJOiBjdHJsX3NjYWxlOwotCQkJCWlmICghY29udHJvbC5nZXRNb2RpZmllZCgpKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJU3RyaW5nIG9sZENvbnRlbnQgPSBjb250ZW50LmdldFNjYWxlKCk7Ci0JCQkJaWYgKCgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpLm11c3RSZXN0b3JlVmFsdWUoCi0JCQkJCQljb250cm9sLCBvbGRDb250ZW50KSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCVN0cmluZyBuZXdDb250ZW50ID0gY29udHJvbC5nZXRUZXh0KCk7Ci0JCQkJaWYgKCFuZXdDb250ZW50LmVxdWFscyhvbGRDb250ZW50KSkgewotCQkJCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuU0VULCBkZWxpdmVyeVByb2Nlc3MKLQkJCQkJCQkuZ2V0UHJlc2VudGF0aW9uKCksIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJLmdldERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX1NjYWxlKCksIG5ld0NvbnRlbnQsCi0JCQkJCQkJLTEpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJY3RybF9wcm9qZWN0X2NoYXJhY3RlcmlzdGljcy5zZXRNb2RhbE9iamVjdChkZWxpdmVyeVByb2Nlc3MKLQkJCQkuZ2V0UHJlc2VudGF0aW9uKCkpOwotCQljdHJsX3Byb2plY3RfY2hhcmFjdGVyaXN0aWNzLnNldE1vZGFsT2JqZWN0RmVhdHVyZShVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXREZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl9Qcm9qZWN0Q2hhcmFjdGVyaXN0aWNzKCkpOwotCQljdHJsX3Byb2plY3RfY2hhcmFjdGVyaXN0aWNzLmFkZE1vZGlmeUxpc3RlbmVyKGNvbnRlbnRNb2RpZnlMaXN0ZW5lcik7Ci0JCWN0cmxfcHJvamVjdF9jaGFyYWN0ZXJpc3RpY3MuYWRkTGlzdGVuZXIoU1dULkRlYWN0aXZhdGUsCi0JCQkJbmV3IExpc3RlbmVyKCkgewotCQkJCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJCQlJTWV0aG9kUmljaFRleHQgY29udHJvbCA9IGRlc2NFeHBhbmRGbGFnID8gY3RybF9leHBhbmRlZAotCQkJCQkJCQk6IGN0cmxfcHJvamVjdF9jaGFyYWN0ZXJpc3RpY3M7Ci0JCQkJCQlpZiAoIWNvbnRyb2wuZ2V0TW9kaWZpZWQoKSkgewotCQkJCQkJCXJldHVybjsKLQkJCQkJCX0KLQkJCQkJCVN0cmluZyBvbGRDb250ZW50ID0gY29udGVudC5nZXRQcm9qZWN0Q2hhcmFjdGVyaXN0aWNzKCk7Ci0JCQkJCQlpZiAoKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkKLQkJCQkJCQkJLm11c3RSZXN0b3JlVmFsdWUoY29udHJvbCwgb2xkQ29udGVudCkpIHsKLQkJCQkJCQlyZXR1cm47Ci0JCQkJCQl9Ci0JCQkJCQlTdHJpbmcgbmV3Q29udGVudCA9IGNvbnRyb2wuZ2V0VGV4dCgpOwotCQkJCQkJaWYgKCFuZXdDb250ZW50LmVxdWFscyhvbGRDb250ZW50KSkgewotCQkJCQkJCWFjdGlvbk1ncgotCQkJCQkJCQkJLmRvQWN0aW9uKAotCQkJCQkJCQkJCQlJQWN0aW9uTWFuYWdlci5TRVQsCi0JCQkJCQkJCQkJCWRlbGl2ZXJ5UHJvY2Vzcy5nZXRQcmVzZW50YXRpb24oKSwKLQkJCQkJCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCQkJCQkuZ2V0RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fUHJvamVjdENoYXJhY3RlcmlzdGljcygpLAotCQkJCQkJCQkJCQluZXdDb250ZW50LCAtMSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9KTsKLQotCQljdHJsX3Jpc2tfbGV2ZWwuc2V0TW9kYWxPYmplY3QoZGVsaXZlcnlQcm9jZXNzLmdldFByZXNlbnRhdGlvbigpKTsKLQkJY3RybF9yaXNrX2xldmVsLnNldE1vZGFsT2JqZWN0RmVhdHVyZShVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXREZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl9SaXNrTGV2ZWwoKSk7Ci0JCWN0cmxfcmlza19sZXZlbC5hZGRNb2RpZnlMaXN0ZW5lcihjb250ZW50TW9kaWZ5TGlzdGVuZXIpOwotCQljdHJsX3Jpc2tfbGV2ZWwuYWRkTGlzdGVuZXIoU1dULkRlYWN0aXZhdGUsIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQlJTWV0aG9kUmljaFRleHQgY29udHJvbCA9IGRlc2NFeHBhbmRGbGFnID8gY3RybF9leHBhbmRlZAotCQkJCQkJOiBjdHJsX3Jpc2tfbGV2ZWw7Ci0JCQkJaWYgKCFjb250cm9sLmdldE1vZGlmaWVkKCkpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlTdHJpbmcgb2xkQ29udGVudCA9IGNvbnRlbnQuZ2V0Umlza0xldmVsKCk7Ci0JCQkJaWYgKCgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpLm11c3RSZXN0b3JlVmFsdWUoCi0JCQkJCQljb250cm9sLCBvbGRDb250ZW50KSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCVN0cmluZyBuZXdDb250ZW50ID0gY29udHJvbC5nZXRUZXh0KCk7Ci0JCQkJaWYgKCFuZXdDb250ZW50LmVxdWFscyhvbGRDb250ZW50KSkgewotCQkJCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuU0VULCBkZWxpdmVyeVByb2Nlc3MKLQkJCQkJCQkuZ2V0UHJlc2VudGF0aW9uKCksIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJLmdldERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX1Jpc2tMZXZlbCgpLAotCQkJCQkJCW5ld0NvbnRlbnQsIC0xKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JCWN0cmxfZXN0aW1hdGluZ190ZWNobmlxdWVzLnNldE1vZGFsT2JqZWN0KGRlbGl2ZXJ5UHJvY2VzcwotCQkJCS5nZXRQcmVzZW50YXRpb24oKSk7Ci0JCWN0cmxfZXN0aW1hdGluZ190ZWNobmlxdWVzLnNldE1vZGFsT2JqZWN0RmVhdHVyZShVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXREZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl9Fc3RpbWF0aW5nVGVjaG5pcXVlKCkpOwotCQljdHJsX2VzdGltYXRpbmdfdGVjaG5pcXVlcy5hZGRNb2RpZnlMaXN0ZW5lcihjb250ZW50TW9kaWZ5TGlzdGVuZXIpOwotCQljdHJsX2VzdGltYXRpbmdfdGVjaG5pcXVlcy5hZGRMaXN0ZW5lcihTV1QuRGVhY3RpdmF0ZSwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCUlNZXRob2RSaWNoVGV4dCBjb250cm9sID0gZGVzY0V4cGFuZEZsYWcgPyBjdHJsX2V4cGFuZGVkCi0JCQkJCQk6IGN0cmxfZXN0aW1hdGluZ190ZWNobmlxdWVzOwotCQkJCWlmICghY29udHJvbC5nZXRNb2RpZmllZCgpKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJU3RyaW5nIG9sZENvbnRlbnQgPSBjb250ZW50LmdldEVzdGltYXRpbmdUZWNobmlxdWUoKTsKLQkJCQlpZiAoKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkubXVzdFJlc3RvcmVWYWx1ZSgKLQkJCQkJCWNvbnRyb2wsIG9sZENvbnRlbnQpKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJU3RyaW5nIG5ld0NvbnRlbnQgPSBjb250cm9sLmdldFRleHQoKTsKLQkJCQlpZiAoIW5ld0NvbnRlbnQuZXF1YWxzKG9sZENvbnRlbnQpKSB7Ci0JCQkJCWFjdGlvbk1ncgotCQkJCQkJCS5kb0FjdGlvbigKLQkJCQkJCQkJCUlBY3Rpb25NYW5hZ2VyLlNFVCwKLQkJCQkJCQkJCWRlbGl2ZXJ5UHJvY2Vzcy5nZXRQcmVzZW50YXRpb24oKSwKLQkJCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJCS5nZXREZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl9Fc3RpbWF0aW5nVGVjaG5pcXVlKCksCi0JCQkJCQkJCQluZXdDb250ZW50LCAtMSk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQotCQljdHJsX3Byb2plY3RfbWVtYmVyX2V4cGVydGlzZS5zZXRNb2RhbE9iamVjdChkZWxpdmVyeVByb2Nlc3MKLQkJCQkuZ2V0UHJlc2VudGF0aW9uKCkpOwotCQljdHJsX3Byb2plY3RfbWVtYmVyX2V4cGVydGlzZQotCQkJCS5zZXRNb2RhbE9iamVjdEZlYXR1cmUoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCS5nZXREZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl9Qcm9qZWN0TWVtYmVyRXhwZXJ0aXNlKCkpOwotCQljdHJsX3Byb2plY3RfbWVtYmVyX2V4cGVydGlzZS5hZGRNb2RpZnlMaXN0ZW5lcihjb250ZW50TW9kaWZ5TGlzdGVuZXIpOwotCQljdHJsX3Byb2plY3RfbWVtYmVyX2V4cGVydGlzZS5hZGRMaXN0ZW5lcihTV1QuRGVhY3RpdmF0ZSwKLQkJCQluZXcgTGlzdGVuZXIoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQkJCUlNZXRob2RSaWNoVGV4dCBjb250cm9sID0gZGVzY0V4cGFuZEZsYWcgPyBjdHJsX2V4cGFuZGVkCi0JCQkJCQkJCTogY3RybF9wcm9qZWN0X21lbWJlcl9leHBlcnRpc2U7Ci0JCQkJCQlpZiAoIWNvbnRyb2wuZ2V0TW9kaWZpZWQoKSkgewotCQkJCQkJCXJldHVybjsKLQkJCQkJCX0KLQkJCQkJCVN0cmluZyBvbGRDb250ZW50ID0gY29udGVudC5nZXRQcm9qZWN0TWVtYmVyRXhwZXJ0aXNlKCk7Ci0JCQkJCQlpZiAoKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkKLQkJCQkJCQkJLm11c3RSZXN0b3JlVmFsdWUoY29udHJvbCwgb2xkQ29udGVudCkpIHsKLQkJCQkJCQlyZXR1cm47Ci0JCQkJCQl9Ci0JCQkJCQlTdHJpbmcgbmV3Q29udGVudCA9IGNvbnRyb2wuZ2V0VGV4dCgpOwotCQkJCQkJaWYgKCFuZXdDb250ZW50LmVxdWFscyhvbGRDb250ZW50KSkgewotCQkJCQkJCWFjdGlvbk1ncgotCQkJCQkJCQkJLmRvQWN0aW9uKAotCQkJCQkJCQkJCQlJQWN0aW9uTWFuYWdlci5TRVQsCi0JCQkJCQkJCQkJCWRlbGl2ZXJ5UHJvY2Vzcy5nZXRQcmVzZW50YXRpb24oKSwKLQkJCQkJCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCQkJCQkuZ2V0RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fUHJvamVjdE1lbWJlckV4cGVydGlzZSgpLAotCQkJCQkJCQkJCQluZXdDb250ZW50LCAtMSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9KTsKLQotCQljdHJsX3R5cGVfb2ZfY29udHJhY3Quc2V0TW9kYWxPYmplY3QoZGVsaXZlcnlQcm9jZXNzLmdldFByZXNlbnRhdGlvbigpKTsKLQkJY3RybF90eXBlX29mX2NvbnRyYWN0LnNldE1vZGFsT2JqZWN0RmVhdHVyZShVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXREZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl9UeXBlT2ZDb250cmFjdCgpKTsKLQkJY3RybF90eXBlX29mX2NvbnRyYWN0LmFkZE1vZGlmeUxpc3RlbmVyKGNvbnRlbnRNb2RpZnlMaXN0ZW5lcik7Ci0JCWN0cmxfdHlwZV9vZl9jb250cmFjdC5hZGRMaXN0ZW5lcihTV1QuRGVhY3RpdmF0ZSwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCUlNZXRob2RSaWNoVGV4dCBjb250cm9sID0gZGVzY0V4cGFuZEZsYWcgPyBjdHJsX2V4cGFuZGVkCi0JCQkJCQk6IGN0cmxfdHlwZV9vZl9jb250cmFjdDsKLQkJCQlpZiAoIWNvbnRyb2wuZ2V0TW9kaWZpZWQoKSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCVN0cmluZyBvbGRDb250ZW50ID0gY29udGVudC5nZXRUeXBlT2ZDb250cmFjdCgpOwotCQkJCWlmICgoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpKS5tdXN0UmVzdG9yZVZhbHVlKAotCQkJCQkJY29udHJvbCwgb2xkQ29udGVudCkpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlTdHJpbmcgbmV3Q29udGVudCA9IGNvbnRyb2wuZ2V0VGV4dCgpOwotCQkJCWlmICghbmV3Q29udGVudC5lcXVhbHMob2xkQ29udGVudCkpIHsKLQkJCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlNFVCwgZGVsaXZlcnlQcm9jZXNzCi0JCQkJCQkJLmdldFByZXNlbnRhdGlvbigpLCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCS5nZXREZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl9UeXBlT2ZDb250cmFjdCgpLAotCQkJCQkJCW5ld0NvbnRlbnQsIC0xKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Qcm9jZXNzRGVzY3JpcHRpb24jcmVmcmVzaChib29sZWFuKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2goYm9vbGVhbiBlZGl0YWJsZSkgewotCQlzdXBlci5yZWZyZXNoKGVkaXRhYmxlKTsKLQkJY3RybF9lc3RpbWF0aW5nX3RlY2huaXF1ZXMuc2V0RWRpdGFibGUoZWRpdGFibGUpOwotCQljdHJsX3Byb2plY3RfY2hhcmFjdGVyaXN0aWNzLnNldEVkaXRhYmxlKGVkaXRhYmxlKTsKLQkJY3RybF9wcm9qZWN0X21lbWJlcl9leHBlcnRpc2Uuc2V0RWRpdGFibGUoZWRpdGFibGUpOwotCQljdHJsX3Jpc2tfbGV2ZWwuc2V0RWRpdGFibGUoZWRpdGFibGUpOwotCQljdHJsX3NjYWxlLnNldEVkaXRhYmxlKGVkaXRhYmxlKTsKLQkJY3RybF90eXBlX29mX2NvbnRyYWN0LnNldEVkaXRhYmxlKGVkaXRhYmxlKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvRGVzY3JpcHRpb25Gb3JtUGFnZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9EZXNjcmlwdGlvbkZvcm1QYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhNzQ2Y2MuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9EZXNjcmlwdGlvbkZvcm1QYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMTU0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJJOwotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5EYXRlOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Db2xvckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJSGVscENvbnRleHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlJbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZGlhbG9ncy5JdGVtc0ZpbHRlckRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuRWRpdG9yQ2hvb3NlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuTWV0aG9kRWxlbWVudEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuTWV0aG9kRWxlbWVudEVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZmlsdGVycy5Db250ZW50RmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJlZmVyZW5jZXMuQXV0aG9yaW5nVUlQcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3ZpZGVycy5Db2x1bW5FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvdmlkZXJzLkRlc2NyaXB0aW9uUGFnZUNvbHVtblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucmljaHRleHQuSU1ldGhvZFJpY2hUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucmljaHRleHQuSU1ldGhvZFJpY2hUZXh0RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudXRpbC5FZGl0b3JzQ29udGV4dEhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnV0aWwuVUlIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS52aWV3cy5MaWJyYXJ5VmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpLnV0aWwuTXNnQm94OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuRmlsZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5OZXRVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuU3RyVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5EZWxldGVNZXRob2RFbGVtZW50Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSUFjdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5GaWx0ZXJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkV4dGVuc2lvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLkRlcGVuZGVuY3lDaGVja2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbi5JVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbi5JVmFsaWRhdG9yRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5MaWJyYXJ5VUlUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLkxpYnJhcnlVSVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuYWN0aW9ucy5NZXRob2RFbGVtZW50RGVsZXRlQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLnV0aWwuQ29udmVydEd1aWRhbmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLlJlc291cmNlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudENhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3VpZGFuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudFByb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuU3VwcG9ydGluZ01hdGVyaWFsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkNvbnRlbnREZXNjcmlwdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5Db21ib1ZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuQ29udHJvbEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuQ29udHJvbExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRm9jdXNBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRm9jdXNFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuUGFpbnRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlBhaW50TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZURhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZvcm1BdHRhY2htZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRm9ybURhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5Gb3JtTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5DYW52YXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRmlsZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5JTWFuYWdlZEZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuZWRpdG9yLkZvcm1FZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuZXZlbnRzLkh5cGVybGlua0FkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuZXZlbnRzLkh5cGVybGlua0V2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuRm9ybVRvb2xraXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5JbWFnZUh5cGVybGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLlNlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5UYWJsZVdyYXBEYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuVGFibGVXcmFwTGF5b3V0OwotCi1pbXBvcnQgY29tLmlibS5pY3UudGV4dC5EYXRlRm9ybWF0OwotCi0KLS8qKgotICogVGhlIGJhc2UgY2xhc3MgZm9yIGFsbCBEZXNjcmlwdGlvbiBwYWdlcyBpbiB0aGUgTWV0aG9kIGVkaXRvcnMuCi0gKiAKLSAqIEBhdXRob3IgSmVmZiBIYXJkeQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICogZml4IGZvciBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTc2MzgyCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBEZXNjcmlwdGlvbkZvcm1QYWdlIGV4dGVuZHMgQmFzZUZvcm1QYWdlIGltcGxlbWVudHMgSVJlZnJlc2hhYmxlIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJVVFRPTl9XSURUSCA9IDE1MDsKLQkKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBOT1RfQVBQTElDQUJMRV9URVhUID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMubm90QXBwbGljYWJsZV90ZXh0OyAKLQkKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBDT05UUklCVVRFU19URVhUID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuY29udHJpYnV0ZXNfdGV4dDsgCi0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExPQ0FMX0NPTlRSSUJVVEVTX1RFWFQgPSBBdXRob3JpbmdVSVJlc291cmNlcy5sb2NhbENvbnRyaWJ1dGVzX3RleHQ7ICAKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVEVORFNfVEVYVCA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmV4dGVuZHNfdGV4dDsgCi0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBSRVBMQUNFU19URVhUID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMucmVwbGFjZXNfdGV4dDsgCi0JCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9DQUxfUkVQTEFDRVNfVEVYVCA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmxvY2FsUmVwbGFjZXNfdGV4dDsgCi0JCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhURU5EU19SRVBMQUNFU19URVhUID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZXh0ZW5kc1JlcGxhY2VzX3RleHQ7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIElMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIgPSBuZXcgQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyKAotCQkJVG5nVXRpbC51bWFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSk7Ci0JCi0JLy8gQ29tcG9zaXRlcyBhbmQgc2VjdGlvbnMuCi0JcHJvdGVjdGVkIFNlY3Rpb24gZm9ybVNlY3Rpb247Ci0KLQlwcm90ZWN0ZWQgQ29tcG9zaXRlIHNlY3Rpb25Db21wb3NpdGU7Ci0JCi0JcHJpdmF0ZSBDb21wb3NpdGUgbWFpbkNvbXBvc2l0ZTsKLQotCXByb3RlY3RlZCBDb21wb3NpdGUgZXhwYW5kZWRDb21wb3NpdGU7Ci0KLQlwcm90ZWN0ZWQgU2VjdGlvbiBnZW5lcmFsU2VjdGlvbjsKLQotCXByb3RlY3RlZCBTZWN0aW9uIHZhcmlhYmlsaXR5U2VjdGlvbjsKLQotCXByb3RlY3RlZCBDb21wb3NpdGUgZ2VuZXJhbENvbXBvc2l0ZTsKLQotCXByb3RlY3RlZCBDb21wb3NpdGUgdmFyaWFiaWxpdHlDb21wb3NpdGU7Ci0KLQlwcm90ZWN0ZWQgU2VjdGlvbiB2ZXJzaW9uU2VjdGlvbjsKLQotCXByb3RlY3RlZCBDb21wb3NpdGUgdmVyc2lvbkNvbXBvc2l0ZTsKLQotCXByb3RlY3RlZCBTZWN0aW9uIGljb25TZWN0aW9uOwotCi0JcHJvdGVjdGVkIENvbXBvc2l0ZSBpY29uQ29tcG9zaXRlOwotCi0JcHJpdmF0ZSBDYW52YXMgcGFuZTE7Ci0KLQlwcml2YXRlIENhbnZhcyBwYW5lMzsKLQotCXByb3RlY3RlZCBTZWN0aW9uIGRldGFpbFNlY3Rpb247Ci0KLQlwcm90ZWN0ZWQgQ29tcG9zaXRlIGRldGFpbENvbXBvc2l0ZTsKLQotCXByb3RlY3RlZCBTZWN0aW9uIG5vdGF0aW9uU2VjdGlvbjsKLQotCXByb3RlY3RlZCBDb21wb3NpdGUgbm90YXRpb25Db21wb3NpdGU7Ci0KLQlwcm90ZWN0ZWQgU2VjdGlvbiB0YWlsb3JpbmdTZWN0aW9uOwotCi0JcHJvdGVjdGVkIENvbXBvc2l0ZSB0YWlsb3JpbmdDb21wb3NpdGU7Ci0KLQkvLyBFZGl0IGNvbnRyb2xzLgotCXByb3RlY3RlZCBUZXh0IGN0cmxfbmFtZTsKLQotCXByb3RlY3RlZCBUZXh0IGN0cmxfcHJlc2VudGF0aW9uX25hbWU7Ci0JCi0JcHJvdGVjdGVkIFRleHQgY3RybF9sb25nX3ByZXNlbnRhdGlvbl9uYW1lOwotCi0JcHJvdGVjdGVkIExhYmVsIGN0cmxfdHlwZV9sYWJlbDsKLQotCXByb3RlY3RlZCBCdXR0b24gY3RybF90eXBlX2J1dHRvbjsKLQotCXByb3RlY3RlZCBUZXh0IGN0cmxfYnJpZWZfZGVzYzsKLQotCXByb3RlY3RlZCBJTWV0aG9kUmljaFRleHQgY3RybF9mdWxsX2Rlc2M7Ci0KLQlwcm90ZWN0ZWQgSU1ldGhvZFJpY2hUZXh0IGN0cmxfa2V5OwotCi0JcHJvdGVjdGVkIElNZXRob2RSaWNoVGV4dEVkaXRvciBjdHJsX2V4cGFuZGVkOwotCi0JcHJvdGVjdGVkIENvbWJvVmlld2VyIHZpZXdlcl92YXJpYWJpbGl0eTsKLQotCXByb3RlY3RlZCBDb21ibyBjdHJsX3ZhcmlhYmlsaXR5OwotCi0JcHJvdGVjdGVkIExhYmVsIGxhYmVsX2Jhc2U7Ci0KLQlwcm90ZWN0ZWQgVGFibGVWaWV3ZXIgYmFzZV92aWV3ZXI7Ci0KLQlwcm90ZWN0ZWQgVGFibGUgY3RybF9iYXNlOwotCi0JcHJvdGVjdGVkIEJ1dHRvbiBjdHJsX2Jhc2VfYnV0dG9uOwotCi0JcHJpdmF0ZSBJTWV0aG9kUmljaFRleHQgYWN0aXZlQ29udHJvbDsKLQotCXByaXZhdGUgVGV4dCBjdHJsX2F1dGhvcnM7Ci0KLQlwcm90ZWN0ZWQgVGV4dCBjdHJsX2NoYW5nZV9kYXRlOwotCi0JcHJpdmF0ZSBUZXh0IGN0cmxfY2hhbmdlX2Rlc2M7Ci0KLQlwcml2YXRlIFRleHQgY3RybF92ZXJzaW9uOwotCi0JcHJvdGVjdGVkIExhYmVsIGxhYmVsX2NvcHlyaWdodDsKLQotCXByb3RlY3RlZCBUYWJsZVZpZXdlciBjb3B5cmlnaHRfdmlld2VyOwotCi0JcHJvdGVjdGVkIFRhYmxlIGN0cmxfY29weXJpZ2h0OwotCi0JcHJpdmF0ZSBCdXR0b24gY29weXJpZ2h0X2J1dHRvbjsKLQotCXByaXZhdGUgQnV0dG9uIGNvcHlyaWdodF9idXR0b25fZGVzZWxlY3Q7Ci0KLQlwcm90ZWN0ZWQgSW1hZ2VIeXBlcmxpbmsgZXhwYW5kRGV0YWlsTGluazsKLQotCXByb3RlY3RlZCBMYWJlbCBleHBhbmREZXRhaWxMYWJlbDsKLQotCXByb3RlY3RlZCBJbWFnZUh5cGVybGluayBleHBhbmROb3RhdGlvbkxpbms7Ci0KLQlwcm90ZWN0ZWQgTGFiZWwgZXhwYW5kTm90YXRpb25MYWJlbDsKLQotCXByb3RlY3RlZCBJbWFnZUh5cGVybGluayBleHBhbmRUYWlsb3JpbmdMaW5rOwotCi0JcHJvdGVjdGVkIExhYmVsIGV4cGFuZFRhaWxvcmluZ0xhYmVsOwotCi0JcHJvdGVjdGVkIElNZXRob2RSaWNoVGV4dCBjdHJsX3B1cnBvc2U7Ci0KLQlwcm90ZWN0ZWQgVGV4dCBjdHJsX2V4dGVybmFsX2lkOwotCi0JcHJpdmF0ZSBJbWFnZSBzaGFwZUltYWdlOwotCi0JcHJpdmF0ZSBJbWFnZSBub2RlSW1hZ2U7Ci0KLQlwcm90ZWN0ZWQgQnV0dG9uIGN0cmxfc2VsZWN0X3NoYXBlSWNvbl9idXR0b247Ci0KLQlwcm90ZWN0ZWQgQnV0dG9uIGN0cmxfY2xlYXJfc2hhcGVJY29uX2J1dHRvbjsKLQotCXByb3RlY3RlZCBCdXR0b24gY3RybF9zZWxlY3Rfbm9kZUljb25fYnV0dG9uOwotCi0JcHJvdGVjdGVkIEJ1dHRvbiBjdHJsX2NsZWFyX25vZGVJY29uX2J1dHRvbjsKLQkKLQlwcm90ZWN0ZWQgQnV0dG9uIGN0cmxfcHVibGlzaF9jYXRlZ29yaWVzX2J1dHRvbjsKLQotCXByb3RlY3RlZCBJbWFnZUh5cGVybGluayBleHBhbmRWZXJzaW9uTGluazsKLQotCXByb3RlY3RlZCBMYWJlbCBleHBhbmRWZXJzaW9uTGFiZWw7Ci0KLQlwcm90ZWN0ZWQgSW1hZ2VIeXBlcmxpbmsgZXhwYW5kTGluazsKLQotCXByb3RlY3RlZCBMYWJlbCBleHBhbmRMYWJlbDsKLQkKLQlwcm90ZWN0ZWQgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIgY29udGVudFByb3ZpZGVyVmFyaWFiaWxpdHk7Ci0KLQlwcm90ZWN0ZWQgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIgY29udGVudFByb3ZpZGVyQmFzZTsKLQkKLQlwcml2YXRlIElDb2x1bW5Qcm92aWRlciBjb2x1bW5Qcm92aWRlcjsKLQkKLQlwcml2YXRlIExpc3Q8SVNlY3Rpb25Qcm92aWRlcj4gc2VjdGlvblByb3ZpZGVyczsKLQkKLQlwcm90ZWN0ZWQgSUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlclZhcmlhYmlsaXR5ID0gbmV3IEFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcigKLQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCS5nZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSkgewotCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQkJVmFyaWFiaWxpdHlUeXBlIHZhck9iamVjdCA9IChWYXJpYWJpbGl0eVR5cGUpIG9iamVjdDsKLQkJCWlmICh2YXJPYmplY3QgPT0gVmFyaWFiaWxpdHlUeXBlLk5BKQotCQkJCXJldHVybiBOT1RfQVBQTElDQUJMRV9URVhUOwotCQkJaWYgKHZhck9iamVjdCA9PSBWYXJpYWJpbGl0eVR5cGUuQ09OVFJJQlVURVMpCi0JCQkJcmV0dXJuIENPTlRSSUJVVEVTX1RFWFQ7Ci0JCQlpZiAodmFyT2JqZWN0ID09IFZhcmlhYmlsaXR5VHlwZS5MT0NBTF9DT05UUklCVVRJT04pCi0JCQkJcmV0dXJuIExPQ0FMX0NPTlRSSUJVVEVTX1RFWFQ7Ci0JCQlpZiAodmFyT2JqZWN0ID09IFZhcmlhYmlsaXR5VHlwZS5FWFRFTkRTKQotCQkJCXJldHVybiBFWFRFTkRTX1RFWFQ7Ci0JCQlpZiAodmFyT2JqZWN0ID09IFZhcmlhYmlsaXR5VHlwZS5SRVBMQUNFUykKLQkJCQlyZXR1cm4gUkVQTEFDRVNfVEVYVDsKLQkJCWlmICh2YXJPYmplY3QgPT0gVmFyaWFiaWxpdHlUeXBlLkxPQ0FMX1JFUExBQ0VNRU5UKQotCQkJCXJldHVybiBMT0NBTF9SRVBMQUNFU19URVhUOwotCQkJaWYgKHZhck9iamVjdCA9PSBWYXJpYWJpbGl0eVR5cGUuRVhURU5EU19SRVBMQUNFUykKLQkJCQlyZXR1cm4gRVhURU5EU19SRVBMQUNFU19URVhUOwotCQkJCi0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX07Ci0KLQlwcm90ZWN0ZWQgSUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlckJhc2UgPSBuZXcgQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyKAotCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJLmdldE5hdmlnYXRvclZpZXdfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKSB7Ci0JCXB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uVGV4dChPYmplY3Qgb2JqZWN0LCBpbnQgY29sdW1uSW5kZXgpIHsKLQkJCXJldHVybiBUbmdVdGlsLmdldExhYmVsV2l0aFBhdGgob2JqZWN0KTsKLQkJfQotCX07Ci0KLQlwcm90ZWN0ZWQgSUFjdGlvbk1hbmFnZXIgYWN0aW9uTWdyOwotCi0JcHJvdGVjdGVkIElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyIGNvcHlyaWdodENvbnRlbnRQcm92aWRlcjsKLQotCXByaXZhdGUgSUxhYmVsUHJvdmlkZXIgY29weXJpZ2h0TGFiZWxQcm92aWRlckJhc2UgPSBuZXcgQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyKAotCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJLmdldE5hdmlnYXRvclZpZXdfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKTsKLQotCXByb3RlY3RlZCBNb2RpZnlMaXN0ZW5lciBtb2RlbE1vZGlmeUxpc3RlbmVyOwotCi0JcHJvdGVjdGVkIE1vZGlmeUxpc3RlbmVyIGNvbnRlbnRNb2RpZnlMaXN0ZW5lcjsKLQkKLQkKLQlwcm90ZWN0ZWQgRm9jdXNBZGFwdGVyIG5hbWVGb2N1c0xpc3RlbmVyID0gbmV3IEZvY3VzQWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgZm9jdXNHYWluZWQoRm9jdXNFdmVudCBlKSB7Ci0JCQkoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpKS5zZXRDdXJyZW50RmVhdHVyZUVkaXRvcihlLndpZGdldCwKLQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TmFtZWRFbGVtZW50X05hbWUoKSk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBmb2N1c0xvc3QoRm9jdXNFdmVudCBlKSB7Ci0JCQlTdHJpbmcgb2xkQ29udGVudCA9IG1ldGhvZEVsZW1lbnQuZ2V0TmFtZSgpIDsKLQkJCVN0cmluZyBuYW1lID0gY3RybF9uYW1lLmdldFRleHQoKS50cmltKCk7Ci0JCQlpZiAoKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkubXVzdFJlc3RvcmVWYWx1ZSgKLQkJCQkJZS53aWRnZXQsIG1ldGhvZEVsZW1lbnQuZ2V0TmFtZSgpKSkgewotCQkJCXJldHVybjsKLQkJCX0KLQkJCWlmIChuYW1lLmVxdWFscyhtZXRob2RFbGVtZW50LmdldE5hbWUoKSkpCi0JCQkJcmV0dXJuOwotCQkJCi0JCQkvLyAxNzg0NjIKLQkJCVN0cmluZyBtc2cgPSBudWxsOwotCQkJaWYgKG9sZENvbnRlbnQuaW5kZXhPZigiJiIpIDwgMCAmJiBuYW1lLmluZGV4T2YoIiYiKSA+IC0xKSB7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCW1zZyA9IE5MUy5iaW5kKAotCQkJCQkJTGlicmFyeUVkaXRSZXNvdXJjZXMuaW52YWxpZEVsZW1lbnROYW1lRXJyb3I0X21zZywKLQkJCQkJCW5hbWUpOwotCQkJfSBlbHNlIHsKLQkJCQlJVmFsaWRhdG9yIHZhbGlkYXRvciA9IGdldE5hbWVWYWxpZGF0b3IoKTsKLQkJCQlpZih2YWxpZGF0b3IgPT0gbnVsbCl7Ci0JCQkJCXZhbGlkYXRvciA9IElWYWxpZGF0b3JGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkuY3JlYXRlTmFtZVZhbGlkYXRvcigKLQkJCQkJCQkJbWV0aG9kRWxlbWVudCwKLQkJCQkJCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJCQkJCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpOwotCQkJCX0KLQkJCQltc2cgPSB2YWxpZGF0b3IuaXNWYWxpZChuYW1lKTsKLQkJCX0KLQkJCWlmIChtc2cgPT0gbnVsbCAmJiAhbmFtZS5lcXVhbHMobWV0aG9kRWxlbWVudC5nZXROYW1lKCkpKSB7Ci0JCQkJaWYobmFtZS5pbmRleE9mKCImIikgPiAtMSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCW1zZyA9IE5MUy5iaW5kKAotCQkJCQkJCUxpYnJhcnlFZGl0UmVzb3VyY2VzLmludmFsaWRFbGVtZW50TmFtZUVycm9yNF9tc2csCi0JCQkJCQkJbmFtZSk7Ci0JCQkJfQotCQkJfQotCQkJaWYgKG1zZyA9PSBudWxsKSB7Ci0JCQkJbmFtZSA9IFN0clV0aWwubWFrZVZhbGlkRmlsZU5hbWUoY3RybF9uYW1lLmdldFRleHQoKSk7Ci0JCQkJY3RybF9uYW1lLnNldFRleHQobmFtZSk7IC8vMTgzMDg0Ci0JCQkJaWYgKCFuYW1lLmVxdWFscyhtZXRob2RFbGVtZW50LmdldE5hbWUoKSkpIHsJCQkJCQkKLQkJCQkJYm9vbGVhbiBzdWNjZXNzID0gYWN0aW9uTWdyLmRvQWN0aW9uKAotCQkJCQkJCUlBY3Rpb25NYW5hZ2VyLlNFVCwgbWV0aG9kRWxlbWVudCwKLQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXROYW1lZEVsZW1lbnRfTmFtZSgpLAotCQkJCQkJCW5hbWUsIC0xKTsKLQkJCQkJaWYgKCFzdWNjZXNzKSB7Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCX0KLQkJCQkJaWYgKENvbnRlbnREZXNjcmlwdGlvbkZhY3RvcnkKLQkJCQkJCQkuaGFzUHJlc2VudGF0aW9uKG1ldGhvZEVsZW1lbnQpKSB7Ci0JCQkJCQlSZXNvdXJjZSBjb250ZW50UmVzb3VyY2UgPSBjb250ZW50RWxlbWVudAotCQkJCQkJCQkuZ2V0UHJlc2VudGF0aW9uKCkuZVJlc291cmNlKCk7Ci0JCQkJCQlpZiAoY29udGVudFJlc291cmNlICE9IG51bGwpIHsKLQkJCQkJCQkoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpKQotCQkJCQkJCQkJLmFkZFJlc291cmNlVG9BZGp1c3RMb2NhdGlvbihjb250ZW50UmVzb3VyY2UpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCXNldEZvcm1UZXh0V2l0aFZhcmlhYmxlSW5mbygpOwotCQkJCQljdHJsX25hbWUuc2V0VGV4dChuYW1lKTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCS8vRml4IG1pc3NpbmcgIiYiIGluIGVycm9yIGRpYWxvZwotCQkJCWlmIChtc2cuaW5kZXhPZigiJiIpID49IDApIHsvLyROT04tTkxTLTEkCi0JCQkJCW1zZyA9IG1zZy5yZXBsYWNlKCImIiwgIiYmIik7Ly8kTk9OLU5MUy0xJC8vJE5PTi1OTFMtMiQKLQkJCQl9Ci0JCQkJQXV0aG9yaW5nVUlQbHVnaW4KLQkJCQkJCS5nZXREZWZhdWx0KCkKLQkJCQkJCS5nZXRNc2dEaWFsb2coKQotCQkJCQkJLmRpc3BsYXlFcnJvcigKLQkJCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMucmVuYW1lRXJyb3JfdGl0bGUsIAotCQkJCQkJCQltc2cpOwotCQkJCWN0cmxfbmFtZS5zZXRUZXh0KG1ldGhvZEVsZW1lbnQuZ2V0TmFtZSgpKTsKLQkJCQljdHJsX25hbWUuZ2V0RGlzcGxheSgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCWN0cmxfbmFtZS5zZXRGb2N1cygpOwotCQkJCQkJY3RybF9uYW1lLnNlbGVjdEFsbCgpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQl9Ci0JCX0KLQl9OwotCi0JLy8gRWRpdGluZyBhbmQgZGlzcGxheSBmbGFncy4KLQlwcm90ZWN0ZWQgYm9vbGVhbiBkZXNjRXhwYW5kRmxhZyA9IGZhbHNlOwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gZ2VuZXJhbFNlY3Rpb25FeHBhbmRGbGFnID0gZmFsc2U7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBkZXRhaWxTZWN0aW9uRXhwYW5kRmxhZyA9IGZhbHNlOwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gbm90YXRpb25TZWN0aW9uRXhwYW5kRmxhZyA9IGZhbHNlOwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gdGFpbG9yaW5nU2VjdGlvbkV4cGFuZEZsYWcgPSBmYWxzZTsKLQotCXByb3RlY3RlZCBib29sZWFuIHZlcnNpb25TZWN0aW9uRXhwYW5kRmxhZyA9IGZhbHNlOwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gZWxlbWVudFNlY3Rpb25FeHBhbmRGbGFnID0gZmFsc2U7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpY29uU2VjdGlvbkV4cGFuZEZsYWcgPSBmYWxzZTsKLQotCXByb3RlY3RlZCBib29sZWFuIGZ1bGxEZXNjT24gPSB0cnVlOwotCi0JcHJvdGVjdGVkIGJvb2xlYW4ga2V5Q29uc2lkZXJhdGlvbk9uID0gdHJ1ZTsKLQotCXByb3RlY3RlZCBib29sZWFuIGJyaWVmRGVzY09uID0gdHJ1ZTsKLQotCXByb3RlY3RlZCBib29sZWFuIGVsZW1lbnRUeXBlT24gPSBmYWxzZTsKLQotCXByb3RlY3RlZCBib29sZWFuIGNvbnRlbnRGaWVsZE9uID0gZmFsc2U7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiB2ZXJzaW9uU2VjdGlvbk9uID0gdHJ1ZTsKLQotCXByb3RlY3RlZCBib29sZWFuIGFueUF0dHJpYnV0ZU1vZGlmaWVkID0gZmFsc2U7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBnZW5lcmFsU2VjdGlvbk9uID0gdHJ1ZTsKLQotCXByb3RlY3RlZCBib29sZWFuIG5vdGF0aW9uU2VjdGlvbk9uID0gZmFsc2U7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBkZXRhaWxTZWN0aW9uT24gPSB0cnVlOwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gdGFpbG9yaW5nU2VjdGlvbk9uID0gZmFsc2U7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiB2YXJpYWJpbGl0eVNlY3Rpb25PbiA9IHRydWU7Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gc2xvdFNlY3Rpb25Pbj0gZmFsc2U7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBwdXJwb3NlT24gPSBmYWxzZTsKLQotCXByb3RlY3RlZCBib29sZWFuIGV4dGVybmFsSWRPbiA9IGZhbHNlOwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaWNvblNlY3Rpb25PbiA9IGZhbHNlOwotCQotCXByb3RlY3RlZCBib29sZWFuIHB1Ymxpc2hDYXRlZ29yeU9uID0gZmFsc2U7Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gbG9uZ1ByZXNlbnRhdGlvbk5hbWVPbiA9IGZhbHNlOwotCi0JLy8gSW50ZXJuYWwgSURzIGZvciB0aGUgc2VjdGlvbnMuCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgR0VORVJBTF9TRUNUSU9OX0lEID0gMTsKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IERFVEFJTF9TRUNUSU9OX0lEID0gMjsKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IFZFUlNJT05fU0VDVElPTl9JRCA9IDM7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBOT1RBVElPTl9TRUNUSU9OX0lEID0gNDsKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IFRBSUxPUklOR19TRUNUSU9OX0lEID0gNTsKLQotCXByaXZhdGUgaW50IHdhcm5pbmdDb3VudCA9IDE7Ci0KLQlwcml2YXRlIGludCBTRUNUSU9OUyA9IDA7Ci0KLQlwcml2YXRlIHN0YXRpYyBpbnQgU0hBUEVJQ09OX1dJRFRIX01BWCA9IDMyOwotCi0JcHJpdmF0ZSBzdGF0aWMgaW50IFNIQVBFSUNPTl9IRUlHSFRfTUFYID0gMzI7Ci0KLQlwcml2YXRlIHN0YXRpYyBpbnQgTk9ERUlDT05fV0lEVEhfTUFYID0gMTY7Ci0KLQlwcml2YXRlIHN0YXRpYyBpbnQgTk9ERUlDT05fSEVJR0hUX01BWCA9IDE2OwotCi0JcHJvdGVjdGVkIElGaWx0ZXIgZmlsdGVyOwotCi0JcHJpdmF0ZSBib29sZWFuIGRpc3Bvc2VkOwotCi0JLy8gVG8gaGFuZGxlIHRoZSBpMTE4biBwcm9wZXJseSBhbmQgYXZvaWQgc3RyaW5nIGNvbmNhdGVuYXRpb24uCi0JcHVibGljIFN0cmluZyBnZW5lcmFsU2VjdGlvbkRlc2NyaXB0aW9uOwotCXB1YmxpYyBTdHJpbmcgZGV0YWlsU2VjdGlvbkRlc2NyaXB0aW9uOwotCXB1YmxpYyBTdHJpbmcgdGFpbG9yaW5nU2VjdGlvbkRlc2NyaXB0aW9uOwotCXB1YmxpYyBTdHJpbmcgbm90YXRpb25TZWN0aW9uRGVzY3JpcHRpb247Ci0JcHVibGljIFN0cmluZyB2YXJpYWJpbGl0eVNlY3Rpb25EZXNjcmlwdGlvbjsKLQlwdWJsaWMgU3RyaW5nIGljb25TZWN0aW9uRGVzY3JpcHRpb247Ci0JcHVibGljIFN0cmluZyB2ZXJzaW9uU2VjdGlvbkRlc2NyaXB0aW9uOwotCi0JcHJpdmF0ZSBMYWJlbCBub2RlSWNvblBhdGg7Ci0KLQlwcml2YXRlIExhYmVsIHNoYXBlSWNvblBhdGg7Ci0JCi0JcHJpdmF0ZSBTdHJpbmdbXSBpbWFnZVR5cGVzID0gbmV3IFN0cmluZ1tdIHsgIiouZ2lmOyouanBnOyoucG5nOyouaWNvOyouYm1wIiB9OyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBTdHJpbmdbXSBpbWFnZU5hbWVzID0gbmV3IFN0cmluZ1tdIHsgIkltYWdlIChnaWYsIGpwZWcsIHBuZywgaWNvLCBibXApIiB9OyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBDb250ZW50IGZpbHRlciBhc3NvY2lhdGVkIHdpdGggdGhpcyBwYWdlLgotCSAqLwotCXByb3RlY3RlZCBJRmlsdGVyIGdldEZpbHRlcigpIHsKLQkJcmV0dXJuIGZpbHRlcjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBDb250ZW50IGVsZW1lbnQgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcGFnZS4KLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGdldENvbnRlbnRFbGVtZW50KCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0Q29udGVudFByb3ZpZGVyQmFzZSgpIHsKLQkJY29udGVudFByb3ZpZGVyQmFzZSA9IG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcigKLQkJCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkJLmdldE5hdmlnYXRvclZpZXdfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKSB7Ci0JCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IG9iamVjdCkgewotCQkJCUFycmF5TGlzdCBiYXNlX3NlbGVjdGVkX2xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJaWYgKGNvbnRlbnRFbGVtZW50LmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSAhPSBudWxsKQotCQkJCQliYXNlX3NlbGVjdGVkX2xpc3QuYWRkKGNvbnRlbnRFbGVtZW50Ci0JCQkJCQkJLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSk7Ci0JCQkJcmV0dXJuIGJhc2Vfc2VsZWN0ZWRfbGlzdC50b0FycmF5KCk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQkJCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChWYXJpYWJpbGl0eUVsZW1lbnQuY2xhc3MpKSB7Ci0JCQkJY2FzZSBVbWFQYWNrYWdlLlZBUklBQklMSVRZX0VMRU1FTlRfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQ6Ci0JCQkJCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JCWJhc2Vfdmlld2VyLnNldENvbnRlbnRQcm92aWRlcihjb250ZW50UHJvdmlkZXJCYXNlKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqIAotCSAqIEBwYXJhbSBlZGl0b3IKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgZm9ybSBlZGl0b3IuCi0JICogQHBhcmFtIGlkCi0JICogICAgICAgICAgICBUaGUgdW5pcXVlIElEIGZvciB0aGUgZm9ybSBwYWdlLgotCSAqIEBwYXJhbSB0aXRsZQotCSAqICAgICAgICAgICAgVGhlIHRpdGxlIGZvciB0aGUgZm9ybSBwYWdlLgotCSAqLwotCXB1YmxpYyBEZXNjcmlwdGlvbkZvcm1QYWdlKEZvcm1FZGl0b3IgZWRpdG9yLCBTdHJpbmcgaWQsIFN0cmluZyB0aXRsZSkgewotCQlzdXBlcihlZGl0b3IsIGlkLCB0aXRsZSk7Ci0JfQotCQotCXByaXZhdGUgY2xhc3MgVmFyaWFiaWxpdHlUeXBlQ29udGVudFByb3ZpZGVyIGV4dGVuZHMgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIgewotCi0JCXByaXZhdGUgVmFyaWFiaWxpdHlUeXBlW10gdHlwZXM7Ci0KLQkJcHVibGljIFZhcmlhYmlsaXR5VHlwZUNvbnRlbnRQcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwgVmFyaWFiaWxpdHlUeXBlW10gdHlwZXMpIHsKLQkJCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQkJCXRoaXMudHlwZXMgPSB0eXBlczsKLQkJfQotCQkKLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3Qgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gdHlwZXM7Ci0JCX0KLQkJCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJCWlmIChub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKSA9PSBtZXRob2RFbGVtZW50Ci0JCQkJCSYmIG5vdGlmaWNhdGlvbi5nZXRFdmVudFR5cGUoKSA9PSBOb3RpZmljYXRpb24uU0VUCi0JCQkJCSYmIG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlKCkgPT0gVW1hUGFja2FnZS5MaXRlcmFscy5WQVJJQUJJTElUWV9FTEVNRU5UX19WQVJJQUJJTElUWV9UWVBFKSB7Ci0JCQkJdmlld2VyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihub3RpZmljYXRpb24uZ2V0TmV3VmFsdWUoKSkpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkJhc2VGb3JtUGFnZSNpbml0KG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlLCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJRWRpdG9yU2l0ZSBzaXRlLCBJRWRpdG9ySW5wdXQgaW5wdXQpIHsKLQkJc3VwZXIuaW5pdChzaXRlLCBpbnB1dCk7Ci0JCQotCQlWYXJpYWJpbGl0eVR5cGVbXSB0eXBlczsKLQkJaWYgKG1ldGhvZEVsZW1lbnQgaW5zdGFuY2VvZiBDb250ZW50Q2F0ZWdvcnkpIHsKLQkJCXR5cGVzID0gbmV3IFZhcmlhYmlsaXR5VHlwZVtdIHsKLQkJCQkJVmFyaWFiaWxpdHlUeXBlLk5BLAotCQkJCQlWYXJpYWJpbGl0eVR5cGUuQ09OVFJJQlVURVMsCi0JCQkJCVZhcmlhYmlsaXR5VHlwZS5SRVBMQUNFUywKLQkJCQkJVmFyaWFiaWxpdHlUeXBlLkVYVEVORFMKLQkJCX07Ci0JCX0gZWxzZSB7Ci0JCQl0eXBlcyA9IG5ldyBWYXJpYWJpbGl0eVR5cGVbXSB7Ci0JCQkJCVZhcmlhYmlsaXR5VHlwZS5OQSwKLQkJCQkJVmFyaWFiaWxpdHlUeXBlLkNPTlRSSUJVVEVTLAotCQkJCQlWYXJpYWJpbGl0eVR5cGUuRVhURU5EUywKLQkJCQkJVmFyaWFiaWxpdHlUeXBlLlJFUExBQ0VTLAotCQkJCQlWYXJpYWJpbGl0eVR5cGUuRVhURU5EU19SRVBMQUNFUwotCQkJfTsKLQkJfQotCQljb250ZW50UHJvdmlkZXJWYXJpYWJpbGl0eSA9IG5ldyBWYXJpYWJpbGl0eVR5cGVDb250ZW50UHJvdmlkZXIoCi0JCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJCS5nZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSwgdHlwZXMpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuZm9ybXMuZWRpdG9yLmNyZWF0ZUZvcm1Db250ZW50KElNYW5hZ2VkRm9ybSkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVGb3JtQ29udGVudChJTWFuYWdlZEZvcm0gbWFuYWdlZEZvcm0pIHsKLQkJc3VwZXIuY3JlYXRlRm9ybUNvbnRlbnQobWFuYWdlZEZvcm0pOwotCQljcmVhdGVFZGl0b3JDb250ZW50KHRvb2xraXQpOwotCQlzZXRDb250ZXh0SGVscCgpOwotCQlzZXRGb3JtVGV4dFdpdGhWYXJpYWJsZUluZm8oKTsKLQkJbG9hZERhdGEoKTsKLQkJYWRkTGlzdGVuZXJzKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldEZvcm1UZXh0V2l0aFZhcmlhYmxlSW5mbygpIHsKLQkJVUlIZWxwZXIuc2V0Rm9ybVRleHQoZm9ybSwgbWV0aG9kRWxlbWVudCk7Ci0JfQotCi0JLyoqCi0JICogQGRlcHJlY2F0ZWQKLQkgKiBAc2VlIFRuZ1V0aWwjZ2V0TGFiZWwgQ29kZSBtb3ZlZCB0byBUbmdVdGlsLmdldExhYmVsKGJlbG93IG1vcmUgc3BlY2lmaWMKLQkgKiAgICAgIG1ldGhvZClyZXR1cm5zIGxhYmVsIHdpdGggdmFyaWFiaWxpdHlJbmZvCi0JICogICAgICA8Y29kZT5UbmdVdGlsLmdldExhYmVsKFZhcmlhYmlsaXR5RWxlbWVudCBvYmplY3QsIFN0cmluZyBhbHRlcm5hdGl2ZUxhYmVsLCBib29sZWFuIHByZWZlckJhc2UpPC9jb2RlPgotCSAqIAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TGFiZWwoVmFyaWFiaWxpdHlFbGVtZW50IG9iamVjdCwgU3RyaW5nIGFsdGVybmF0aXZlTGFiZWwsCi0JCQlib29sZWFuIHByZWZlckJhc2UpIHsKLQkJU3RyaW5nIGxhYmVsID0gVG5nVXRpbC5nZXRMYWJlbChvYmplY3QsIGFsdGVybmF0aXZlTGFiZWwpOwotCQlpZiAocHJlZmVyQmFzZSAmJiBvYmplY3QuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpICE9IG51bGwpIHsKLQkJCVZhcmlhYmlsaXR5VHlwZSB0eXBlID0gb2JqZWN0LmdldFZhcmlhYmlsaXR5VHlwZSgpOwotCQkJU3RyaW5nIHZhcmlhYmlsaXR5VHh0ID0gbnVsbDsKLQkJCWlmICh0eXBlID09IFZhcmlhYmlsaXR5VHlwZS5DT05UUklCVVRFUykgewotCQkJCXZhcmlhYmlsaXR5VHh0ID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMKLQkJCQkJCS5jb250cmlidXRlc190b190ZXh0OyAKLQkJCX0gZWxzZSBpZiAodHlwZSA9PSBWYXJpYWJpbGl0eVR5cGUuTE9DQUxfQ09OVFJJQlVUSU9OKSB7Ci0JCQkJdmFyaWFiaWxpdHlUeHQgPSBBdXRob3JpbmdVSVJlc291cmNlcwotCQkJCQkubG9jYWxDb250cmlidXRlc190ZXh0OyAJCQkKLQkJCX0gZWxzZSBpZiAodHlwZSA9PSBWYXJpYWJpbGl0eVR5cGUuRVhURU5EUykgewkJCQkJCi0JCQkJdmFyaWFiaWxpdHlUeHQgPSBBdXRob3JpbmdVSVJlc291cmNlcwotCQkJCQkJLmV4dGVuZHNfdGV4dDsKLQkJCX0gZWxzZSBpZiAodHlwZSA9PSBWYXJpYWJpbGl0eVR5cGUuUkVQTEFDRVMpIHsKLQkJCQl2YXJpYWJpbGl0eVR4dCA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzCi0JCQkJCQkucmVwbGFjZXNfdGV4dDsgCi0JCQl9IGVsc2UgaWYgKHR5cGUgPT0gVmFyaWFiaWxpdHlUeXBlLkxPQ0FMX1JFUExBQ0VNRU5UKSB7Ci0JCQkJdmFyaWFiaWxpdHlUeHQgPSBBdXRob3JpbmdVSVJlc291cmNlcwotCQkJCQkJLmxvY2FsUmVwbGFjZXNfdGV4dDsgCi0JCQl9IGVsc2UgaWYgKHR5cGUgPT0gVmFyaWFiaWxpdHlUeXBlLkVYVEVORFNfUkVQTEFDRVMpIHsKLQkJCQl2YXJpYWJpbGl0eVR4dCA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzCi0JCQkJLmV4dGVuZHNSZXBsYWNlc190ZXh0OyAKLQkJCX0KLQkJCWlmICh2YXJpYWJpbGl0eVR4dCAhPSBudWxsKSB7Ci0JCQkJU3RyaW5nQnVmZmVyIHN0ckJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIobGFiZWwpCi0JCQkJCQkuYXBwZW5kKCIgKCIpLmFwcGVuZCh2YXJpYWJpbGl0eVR4dCkuYXBwZW5kKCIgJyIpIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJLmFwcGVuZCgKLQkJCQkJCQkJVG5nVXRpbC5nZXRMYWJlbChvYmplY3QKLQkJCQkJCQkJCQkuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpLAotCQkJCQkJCQkJCWFsdGVybmF0aXZlTGFiZWwpKS5hcHBlbmQoIiciKTsgLy8kTk9OLU5MUy0xJAotCQkJCU1ldGhvZFBsdWdpbiBiYXNlUGx1Z2luID0gVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4ob2JqZWN0Ci0JCQkJCQkuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpKTsKLQkJCQlpZiAoYmFzZVBsdWdpbiAhPSBudWxsKSB7Ci0JCQkJCXN0ckJ1ZgotCQkJCQkJCS5hcHBlbmQoIiBpbiAnIikuYXBwZW5kKGJhc2VQbHVnaW4uZ2V0TmFtZSgpKS5hcHBlbmQoIicpIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCX0KLQkJCQlsYWJlbCA9IHN0ckJ1Zi50b1N0cmluZygpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGxhYmVsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIGVkaXRvciB0YWIgY29udGVudAotCSAqIAotCSAqIEBwYXJhbSB0b29sa2l0Ci0JICogICAgICAgICAgICBUaGUgZm9ybSB0b29sa2l0LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUVkaXRvckNvbnRlbnQoRm9ybVRvb2xraXQgdG9vbGtpdCkgewotCQljcmVhdGVGb3JtQ29tcG9zaXRlcyh0b29sa2l0KTsKLQkJbG9hZFNlY3Rpb25EZXNjcmlwdGlvbigpOwotCQkKLQkJLy8gY2hlY2sgZm9yIGV4dGVuc2lvbiBzZWN0aW9uIGlmIGFueQotCQlsb2FkU2VjdGlvblByb3ZpZGVycygpOwotCQkKLQkJLy8gQ3JlYXRlIHRoZSBHZW5lcmFsIHNlY3Rpb24uCi0JCWlmIChnZW5lcmFsU2VjdGlvbk9uKSB7Ci0JCQljcmVhdGVHZW5lcmFsU2VjdGlvbih0b29sa2l0KTsKLQkJCXRvb2xraXQucGFpbnRCb3JkZXJzRm9yKGdlbmVyYWxDb21wb3NpdGUpOwotCQkJU0VDVElPTlMrKzsKLQkJfQotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2VjdGlvblByb3ZpZGVycy5zaXplKCk7IGkrKykgewotCQkJdHJ5IHsKLQkJCQlPYmplY3QgcHJvdmlkZXIgID0gc2VjdGlvblByb3ZpZGVycy5nZXQoaSk7Ci0JCQkJaWYgKHByb3ZpZGVyIGluc3RhbmNlb2YgSVNlY3Rpb25Qcm92aWRlcikgewotCQkJCQkoKElTZWN0aW9uUHJvdmlkZXIpIHByb3ZpZGVyKS5jcmVhdGVTZWN0aW9uKAotCQkJCQkJCShNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSwgdG9vbGtpdCwKLQkJCQkJCQlzZWN0aW9uQ29tcG9zaXRlKTsKLQkJCQkJU0VDVElPTlMrKzsKLQkJCQl9Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCX0KLQkJfQotCQkKLQkJLy8gQ3JlYXRlIHRoZSBTbG90IFNlY3Rpb24KLQkJaWYgKHNsb3RTZWN0aW9uT24pIHsKLQkJCWNyZWF0ZVNsb3RTZWN0aW9uKHRvb2xraXQpOwotCQkJU0VDVElPTlMrKzsKLQkJfQotCQkKLQkJLy8gQ3JlYXRlIHRoZSBEZXRhaWwgc2VjdGlvbi4KLQkJaWYgKGRldGFpbFNlY3Rpb25PbikgewotCQkJY3JlYXRlRGV0YWlsU2VjdGlvbih0b29sa2l0KTsKLQkJCVNFQ1RJT05TKys7Ci0JCX0KLQotCQkvLyBDcmVhdGUgdGhlIE5vdGF0aW9uIHNlY3Rpb24uCi0JCWlmIChub3RhdGlvblNlY3Rpb25PbikgewotCQkJY3JlYXRlTm90YXRpb25TZWN0aW9uKHRvb2xraXQpOwotCQkJU0VDVElPTlMrKzsKLQkJfQotCi0JCS8vIENyZWF0ZSB0aGUgVGFpbG9yaW5nIFNlY3Rpb24uCi0JCWlmICh0YWlsb3JpbmdTZWN0aW9uT24pIHsKLQkJCWNyZWF0ZVRhaWxvcmluZ1NlY3Rpb24odG9vbGtpdCk7Ci0JCQlTRUNUSU9OUysrOwotCQl9Ci0KLQkJLy8gQ3JlYXRlIHRoZSBWZXJzaW9uIHNlY3Rpb24uCi0JCWlmICh2ZXJzaW9uU2VjdGlvbk9uKSB7Ci0JCQljcmVhdGVWZXJzaW9uU2VjdGlvbih0b29sa2l0KTsKLQkJCWNyZWF0ZVZlcnNpb25TZWN0aW9uQ29udGVudCgpOwotCQkJdG9vbGtpdC5wYWludEJvcmRlcnNGb3IodmVyc2lvbkNvbXBvc2l0ZSk7Ci0JCQlTRUNUSU9OUysrOwotCQl9CQkKLQkJCi0JCWlmICh2YXJpYWJpbGl0eVNlY3Rpb25PbikgewotCQkJY3JlYXRlVmFyaWFiaWxpdHlTZWN0aW9uKHRvb2xraXQpOwotCQkJdG9vbGtpdC5wYWludEJvcmRlcnNGb3IodmFyaWFiaWxpdHlDb21wb3NpdGUpOwotCQkJU0VDVElPTlMrKzsKLQkJfQotCQkKLQkJLy8gSWNvbiBTZWN0aW9uCi0JCWlmIChpY29uU2VjdGlvbk9uKSB7Ci0JCQljcmVhdGVJY29uU2VjdGlvbih0b29sa2l0KTsKLQkJCWNyZWF0ZUljb25TZWN0aW9uQ29udGVudCgpOwotCQkJU0VDVElPTlMrKzsKLQkJfQotCi0JCWlmIChleHBhbmRlZENvbXBvc2l0ZSAhPSBudWxsKQotCQkJdG9vbGtpdC5wYWludEJvcmRlcnNGb3IoZXhwYW5kZWRDb21wb3NpdGUpOwotCX0KLQotCQotCS8qKiAKLQkgKiBHZXQgYWxsIHNlY3Rpb24gcHJvdmlkZXJzCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgTGlzdDxJU2VjdGlvblByb3ZpZGVyPiBsb2FkU2VjdGlvblByb3ZpZGVycygpIHsKLQkJaWYgKHNlY3Rpb25Qcm92aWRlcnMgPT0gbnVsbCkgewotCQkJc2VjdGlvblByb3ZpZGVycyA9IEV4dGVuc2lvbk1hbmFnZXIuZ2V0RXh0ZW5zaW9ucyhBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SWQoKSwgImRlc2NyaXB0aW9uUGFnZVNlY3Rpb25Qcm92aWRlciIsIElTZWN0aW9uUHJvdmlkZXIuY2xhc3MpOyAvLyROT04tTkxTLTEkCQotCQl9Ci0JCXJldHVybiBzZWN0aW9uUHJvdmlkZXJzOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlRm9ybUNvbXBvc2l0ZXMoRm9ybVRvb2xraXQgdG9vbGtpdCkgewotCQkvLyBDcmVhdGUgdGhlIG1haW4gc2VjdGlvbiAodXNlZCBmb3Igc3dhcHBpbmcgZGlzcGxheSBvZgotCQkvLyBzZWN0aW9uQ29tcG9zaXRlIGFuZCBleHBhbmRlZENvbXBvc2l0ZSkuCi0JCWZvcm1TZWN0aW9uID0gdG9vbGtpdC5jcmVhdGVTZWN0aW9uKGZvcm0uZ2V0Qm9keSgpLCBTZWN0aW9uLk5PX1RJVExFKTsKLQkJewotCQkJVGFibGVXcmFwRGF0YSB0ZCA9IG5ldyBUYWJsZVdyYXBEYXRhKFRhYmxlV3JhcERhdGEuRklMTF9HUkFCKTsKLQkJCWZvcm1TZWN0aW9uLnNldExheW91dERhdGEodGQpOwotCQkJZm9ybVNlY3Rpb24uc2V0TGF5b3V0KG5ldyBUYWJsZVdyYXBMYXlvdXQoKSk7Ci0JCX0KLQotCQkvLyBDcmVhdGUgdGhlIGNvbXBvc2l0ZSBmb3IgdGhlIHNlY3Rpb25zLgotCQltYWluQ29tcG9zaXRlID0gdG9vbGtpdC5jcmVhdGVDb21wb3NpdGUoZm9ybVNlY3Rpb24sIFNXVC5OT05FKTsKLQkJewotCQkJVGFibGVXcmFwRGF0YSB0ZCA9IG5ldyBUYWJsZVdyYXBEYXRhKFRhYmxlV3JhcERhdGEuRklMTF9HUkFCKTsKLQkJCW1haW5Db21wb3NpdGUuc2V0TGF5b3V0RGF0YSh0ZCk7Ci0JCQlGb3JtTGF5b3V0IGxheW91dCA9IG5ldyBGb3JtTGF5b3V0KCk7Ci0JCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCQltYWluQ29tcG9zaXRlLnNldExheW91dCggbGF5b3V0KTsKLQkJCWZvcm1TZWN0aW9uLnNldENsaWVudChtYWluQ29tcG9zaXRlKTsKLQkJfQotCQkKLQkKLQkJLy8gY2hlY2sgZm9yIGV4dGVuc3Rpb24gcG9pbnQgYW5kIGFkZCB0aGUgcGFnZSBpZiB0aGVyZQotCQlMaXN0PD8+IGNvbHVtblByb3ZpZGVycyA9IERlc2NyaXB0aW9uUGFnZUNvbHVtblByb3ZpZGVyLmdldEluc3RhbmNlKCkKLQkJCQkuZ2V0Q29sdW1uUHJvdmlkZXJzKCk7Ci0KLQkJaWYgKGNvbHVtblByb3ZpZGVycyA9PSBudWxsIHx8IGNvbHVtblByb3ZpZGVycy5zaXplKCkgPT0gMCkgewotCQkJY3JlYXRlU2VjdGlvbkNvbXBvc2l0ZShtYWluQ29tcG9zaXRlLCAwLCAxMDApOwotCQl9IGVsc2UgewotCQkJdHJ5IHsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbHVtblByb3ZpZGVycy5zaXplKCk7IGkrKykgewotCQkJCQlDb2x1bW5FbGVtZW50IGNvbHVtbiA9IChDb2x1bW5FbGVtZW50KSBjb2x1bW5Qcm92aWRlcnMuZ2V0KGkpOwotCQkJCQlPYmplY3QgcHJvdmlkZXJDbGFzcyA9IGNvbHVtbi5nZXRDb250cmlidXRvckNsYXNzKCk7Ci0JCQkJCWludCB3aWR0aCA9IGNvbHVtbi5nZXRXaWR0aCgpOwotCQkJCQlTdHJpbmcgYWxpZ25tZW50ID0gY29sdW1uLmdldEFsaWdubWVudCgpOwotCQkJCQkKLQkJCQkJaWYgKHByb3ZpZGVyQ2xhc3MgaW5zdGFuY2VvZiBJQ29sdW1uUHJvdmlkZXIpIHsKLQkJCQkJCWNvbHVtblByb3ZpZGVyID0gKElDb2x1bW5Qcm92aWRlcikgcHJvdmlkZXJDbGFzczsKLQkJCQkJCQotCQkJCQkJaWYgKGFsaWdubWVudC5lcXVhbHMoImxlZnQiKSkgewkvLyROT04tTkxTLTEkCQotCQkJCQkJCWNyZWF0ZVNlY3Rpb25Db21wb3NpdGUobWFpbkNvbXBvc2l0ZSwgd2lkdGgsCi0JCQkJCQkJCQkxMDApOwotCi0JCQkJCQkJQ29tcG9zaXRlIGNvbHVtbkNvbXBvc2l0ZSA9IGNvbHVtblByb3ZpZGVyCi0JCQkJCQkJCQkuc2V0Q29sdW1uKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSwgdG9vbGtpdCwgbWFpbkNvbXBvc2l0ZSk7Ci0JCQkJCQkJewkJCQkJCQkKLQkJCQkJCQkJRm9ybURhdGEgZGF0YSA9IG5ldyBGb3JtRGF0YSgpOwotCQkJCQkJCQlkYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAwKTsKLQkJCQkJCQkJZGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDUpOwotCQkJCQkJCQlkYXRhLmJvdHRvbSA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIC01KTsKLQkJCQkJCQkJZGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgKLQkJCQkJCQkJCQlzZWN0aW9uQ29tcG9zaXRlLCAwKTsKLQkJCQkJCQkJY29sdW1uQ29tcG9zaXRlLnNldExheW91dERhdGEoZGF0YSk7Ci0JCQkJCQkJCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJCQkJCQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCQkJCQkJCWNvbHVtbkNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQkJCQkJCQl9CQkJCQkJCi0JCQkJCQl9Ci0JCQkJCQlpZiAoYWxpZ25tZW50LmVxdWFscygicmlnaHQiKSkgeyAvLyROT04tTkxTLTEkCQotCQkJCQkJCWNyZWF0ZVNlY3Rpb25Db21wb3NpdGUobWFpbkNvbXBvc2l0ZSwgMCwKLQkJCQkJCQkJCTEwMCAtIHdpZHRoKTsKLQotCQkJCQkJCUNvbXBvc2l0ZSBjb2x1bW5Db21wb3NpdGUgPSBjb2x1bW5Qcm92aWRlcgotCQkJCQkJCQkJLnNldENvbHVtbigoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCksIHRvb2xraXQsIG1haW5Db21wb3NpdGUpOwotCQkJCQkJCXsJCi0JCQkJCQkJCUZvcm1EYXRhIGRhdGEgPSBuZXcgRm9ybURhdGEoKTsKLQkJCQkJCQkJZGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7Ci0JCQkJCQkJCWRhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgKLQkJCQkJCQkJCQlzZWN0aW9uQ29tcG9zaXRlLCA1KTsKLQkJCQkJCQkJZGF0YS5ib3R0b20gPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAtNSk7Ci0JCQkJCQkJCWRhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAwKTsKLQkJCQkJCQkJY29sdW1uQ29tcG9zaXRlLnNldExheW91dERhdGEoZGF0YSk7Ci0JCQkJCQkJCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJCQkJCQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCQkJCQkJCWNvbHVtbkNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCX0KLQkJfQotCi0JCS8vIENyZWF0ZSB0aGUgY29tcG9zaXRlIGZvciB0aGUgUmljaFRleHRFZGl0b3IuCi0JCWV4cGFuZGVkQ29tcG9zaXRlID0gdG9vbGtpdC5jcmVhdGVDb21wb3NpdGUoZm9ybVNlY3Rpb24sIFNXVC5OT05FKTsKLQkJewotCQkJVGFibGVXcmFwRGF0YSB0ZCA9IG5ldyBUYWJsZVdyYXBEYXRhKFRhYmxlV3JhcERhdGEuRklMTF9HUkFCKTsKLQkJCWV4cGFuZGVkQ29tcG9zaXRlLnNldExheW91dERhdGEodGQpOwotCQkJZXhwYW5kZWRDb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKSk7Ci0JCQlleHBhbmRlZENvbXBvc2l0ZS5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJfQotCi0JCS8vIEFkZCB0aGUgZXhwYW5kL2NvbGxhcHNlIGh5cGVybGluayBpbWFnZS4KLQkJZXhwYW5kTGluayA9IHRvb2xraXQuY3JlYXRlSW1hZ2VIeXBlcmxpbmsoZXhwYW5kZWRDb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJZXhwYW5kTGluay5zZXRJbWFnZShBdXRob3JpbmdVSUltYWdlcy5JTUdfRVhQQU5ERUQpOwotCQlleHBhbmRMaW5rLnNldFRvb2xUaXBUZXh0KEF1dGhvcmluZ1VJUmVzb3VyY2VzLmNsb3NlUlRFKTsKLQkJZXhwYW5kTGluay5zZXRVbmRlcmxpbmVkKGZhbHNlKTsKLQkJZXhwYW5kTGluay5hZGRIeXBlcmxpbmtMaXN0ZW5lcihuZXcgSHlwZXJsaW5rQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGxpbmtBY3RpdmF0ZWQoSHlwZXJsaW5rRXZlbnQgZSkgewotCQkJCXRvZ2dsZShlKTsKLQkJCX0KLQkJfSk7Ci0KLQkJLy8gQWRkIHRoZSBleHBhbmQvY29sbGFwc2UgaHlwZXJsaW5rIHRleHQuCi0JCWV4cGFuZExhYmVsID0gY3JlYXRlRGVjb3JhdGVkTGFiZWwodG9vbGtpdCwgZXhwYW5kZWRDb21wb3NpdGUsICIiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgRVBGIE1haW4gc2VjdGlvbiBjb21wb3NpdGUgd2hlcmUgYWxsIGdlbmVyYWwsIGRldGFpbCBzZWN0aW9uIHJlc2lkZXMKLQkgKi8KLQlwcml2YXRlIHZvaWQgY3JlYXRlU2VjdGlvbkNvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50LCBpbnQgbGVmdE1hcmdpbiwKLQkJCWludCByaWdodE1hcmdpbikgewotCQkvLyBDcmVhdGUgdGhlIGNvbXBvc2l0ZSBmb3IgdGhlIHNlY3Rpb25zLgotCQlzZWN0aW9uQ29tcG9zaXRlID0gdG9vbGtpdC5jcmVhdGVDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCXsKLQkJCUZvcm1EYXRhIGRhdGEgPSBuZXcgRm9ybURhdGEoKTsKLQkJCWRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOwotCQkJZGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KGxlZnRNYXJnaW4sIDApOwotCQkJZGF0YS5ib3R0b20gPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAtNSk7Ci0JCQlkYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KHJpZ2h0TWFyZ2luLCAtNSk7Ci0JCQlzZWN0aW9uQ29tcG9zaXRlLnNldExheW91dERhdGEoZGF0YSk7Ci0JCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJCXNlY3Rpb25Db21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgR2VuZXJhbCBzZWN0aW9uLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUdlbmVyYWxTZWN0aW9uKEZvcm1Ub29sa2l0IHRvb2xraXQpIHsKLQkJZ2VuZXJhbFNlY3Rpb24gPSBjcmVhdGVTZWN0aW9uKHRvb2xraXQsIHNlY3Rpb25Db21wb3NpdGUsCi0JCQkJQXV0aG9yaW5nVUlUZXh0LkdFTkVSQUxfSU5GT19TRUNUSU9OX05BTUUsCi0JCQkJZ2V0R2VuZXJhbFNlY3Rpb25EZXNjcmlwdGlvbigpKTsKLQkJZ2VuZXJhbENvbXBvc2l0ZSA9IGNyZWF0ZUNvbXBvc2l0ZSh0b29sa2l0LCBnZW5lcmFsU2VjdGlvbik7Ci0JCSgoR3JpZExheW91dCkgZ2VuZXJhbENvbXBvc2l0ZS5nZXRMYXlvdXQoKSkubnVtQ29sdW1ucyA9IDQ7Ci0JCWNyZWF0ZUdlbmVyYWxTZWN0aW9uQ29udGVudCgpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIEdlbmVyYWwgc2VjdGlvbiBjb250ZW50LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUdlbmVyYWxTZWN0aW9uQ29udGVudCgpIHsKLQkJLy8gQWRkIHRoZSBOYW1lIGxhYmVsIGFuZCB0ZXh0IGNvbnRyb2wuCi0JCWN0cmxfbmFtZSA9IGNyZWF0ZVRleHRFZGl0V2l0aExhYmVsMyh0b29sa2l0LCBnZW5lcmFsQ29tcG9zaXRlLAotCQkJCUF1dGhvcmluZ1VJVGV4dC5OQU1FX1RFWFQsIFNXVC5ERUZBVUxULCBTV1QuU0lOR0xFKTsKLQotCQkvLyBBZGQgdGhlIFByZXNlbnRhdGlvbiBuYW1lIGxhYmVsIGFuZCB0ZXh0IGNvbnRyb2wuCi0JCWN0cmxfcHJlc2VudGF0aW9uX25hbWUgPSBjcmVhdGVUZXh0RWRpdFdpdGhMYWJlbDModG9vbGtpdCwKLQkJCQlnZW5lcmFsQ29tcG9zaXRlLCBBdXRob3JpbmdVSVRleHQuUFJFU0VOVEFUSU9OX05BTUVfVEVYVCwKLQkJCQlTV1QuREVGQVVMVCwgU1dULlNJTkdMRSk7Ci0JCQotCQkvLyBBZGQgbG9uZyAgcHJlc2VudGF0aW9uIG5hbWUgbGFibGUgYW5kIHRleHQgY29udHJvbAotCQkKLQkJaWYgKGxvbmdQcmVzZW50YXRpb25OYW1lT24gJiYgQXV0aG9yaW5nVUlQcmVmZXJlbmNlcy5nZXRTaG93TG9uZ1ByZXNlbnRhdGlvbk5hbWUoKSkgewotCQkJY3RybF9sb25nX3ByZXNlbnRhdGlvbl9uYW1lID0gY3JlYXRlVGV4dEVkaXRXaXRoTGFiZWwzKHRvb2xraXQsCi0JCQkJCWdlbmVyYWxDb21wb3NpdGUsIEF1dGhvcmluZ1VJVGV4dC5MT05HX1BSRVNFTlRBVElPTl9OQU1FX1RFWFQsCi0JCQkJCVNXVC5ERUZBVUxULCBTV1QuU0lOR0xFKTsKLQkJfQotCi0JCWlmIChlbGVtZW50VHlwZU9uKSB7Ci0JCQljcmVhdGVMYWJlbCh0b29sa2l0LCBnZW5lcmFsQ29tcG9zaXRlLCBBdXRob3JpbmdVSVRleHQuVFlQRV9URVhULCAyKTsKLQkJCWN0cmxfdHlwZV9sYWJlbCA9IGNyZWF0ZUxhYmVsKHRvb2xraXQsIGdlbmVyYWxDb21wb3NpdGUsICIiKTsgLy8kTk9OLU5MUy0xJAotCQkJewotCQkJCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkJFR0lOTklORyk7Ci0JCQkJZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAxOwotCQkJCWN0cmxfdHlwZV9sYWJlbC5zZXRCYWNrZ3JvdW5kKERpc3BsYXkuZ2V0Q3VycmVudCgpCi0JCQkJCQkuZ2V0U3lzdGVtQ29sb3IoMTkpKTsKLQkJCQljdHJsX3R5cGVfbGFiZWwuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCQl9Ci0JCQlpZiAobWV0aG9kRWxlbWVudCBpbnN0YW5jZW9mIEd1aWRhbmNlKSB7Ci0JCQkJY3RybF90eXBlX2J1dHRvbiA9IHRvb2xraXQuY3JlYXRlQnV0dG9uKGdlbmVyYWxDb21wb3NpdGUsCi0JCQkJCQlBdXRob3JpbmdVSVRleHQuQ0hBTkdFX1RZUEVfQlVUVE9OX1RFWFQsIFNXVC5QVVNIKTsKLQkJCQl7Ci0JCQkJCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkJFR0lOTklORyk7Ci0JCQkJCWdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMTsKLQkJCQkJY3RybF90eXBlX2J1dHRvbi5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJCQl9Ci0JCQkJaWYgKENvbnZlcnRHdWlkYW5jZVR5cGUKLQkJCQkJCS5nZXRWYWxpZE5ld0d1aWRhbmNlVHlwZXMoKEd1aWRhbmNlKSBtZXRob2RFbGVtZW50KSA9PSBudWxsKSB7Ci0JCQkJCWN0cmxfdHlwZV9idXR0b24uc2V0VmlzaWJsZShmYWxzZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJaWYgKGV4dGVybmFsSWRPbikgewotCQkJY3RybF9leHRlcm5hbF9pZCA9IGNyZWF0ZVRleHRFZGl0V2l0aExhYmVsMyh0b29sa2l0LAotCQkJCQlnZW5lcmFsQ29tcG9zaXRlLCBBdXRob3JpbmdVSVRleHQuVU5JUVVFX0lEX1RFWFQsCi0JCQkJCVNXVC5ERUZBVUxULCBTV1QuU0lOR0xFKTsKLQkJfQotCi0JCWlmIChicmllZkRlc2NPbikgewotCQkJY3RybF9icmllZl9kZXNjID0gY3JlYXRlVGV4dEVkaXRXaXRoTGFiZWwzKHRvb2xraXQsCi0JCQkJCWdlbmVyYWxDb21wb3NpdGUsIEF1dGhvcmluZ1VJVGV4dC5CUklFRl9ERVNDUklQVElPTl9URVhULAotCQkJCQk0MCwgU1dULk1VTFRJIHwgU1dULlRSQVZFUlNFX1RBQl9ORVhUKTsKLQkJfQkJCi0KLQkJaWYgKHB1Ymxpc2hDYXRlZ29yeU9uKSB7Ci0JCQljdHJsX3B1Ymxpc2hfY2F0ZWdvcmllc19idXR0b24gPSB0b29sa2l0Ci0JCQkuY3JlYXRlQnV0dG9uKAotCQkJCQlnZW5lcmFsQ29tcG9zaXRlLAotCQkJCQlBdXRob3JpbmdVSVRleHQuUFVCTElTSF9DQVRFR09SSUVTX1RFWFQsIFNXVC5DSEVDSyk7IAotCQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDM7Ci0JCQljdHJsX3B1Ymxpc2hfY2F0ZWdvcmllc19idXR0b24uc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIENvbnRlbnQgVmFyaWFiaWxpdHkgc2VjdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVWYXJpYWJpbGl0eVNlY3Rpb24oRm9ybVRvb2xraXQgdG9vbGtpdCkgewotCQl2YXJpYWJpbGl0eVNlY3Rpb24gPSBjcmVhdGVTZWN0aW9uKHRvb2xraXQsIHNlY3Rpb25Db21wb3NpdGUsCi0JCQkJQXV0aG9yaW5nVUlUZXh0LlZBUklBQklMSVRZX1NFQ1RJT05fTkFNRSwKLQkJCQlnZXRWYXJpYWJpbGl0eVNlY3Rpb25EZXNjcmlwdGlvbigpKTsKLQkJCi0JCXZhcmlhYmlsaXR5Q29tcG9zaXRlID0gdG9vbGtpdC5jcmVhdGVDb21wb3NpdGUodmFyaWFiaWxpdHlTZWN0aW9uKTsKLQkJewotCQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMIHwgR3JpZERhdGEuQkVHSU5OSU5HIHwgR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMKTsKLQkJCWdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMTsKLQkJCWdyaWREYXRhLmhlaWdodEhpbnQgPSAyNDsKLQkJCWdyaWREYXRhLndpZHRoSGludCA9IDMwMDsKLQkJCXZhcmlhYmlsaXR5Q29tcG9zaXRlLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQl9Ci0JCXZhcmlhYmlsaXR5Q29tcG9zaXRlLnNldExheW91dChuZXcgR3JpZExheW91dCg1LCBmYWxzZSkpOwotCQl2YXJpYWJpbGl0eVNlY3Rpb24uc2V0Q2xpZW50KHZhcmlhYmlsaXR5Q29tcG9zaXRlKTsKLQotCQljdHJsX3ZhcmlhYmlsaXR5ID0gY3JlYXRlQ29tYm9XaXRoTGFiZWwzKHRvb2xraXQsIHZhcmlhYmlsaXR5Q29tcG9zaXRlLAotCQkJCUF1dGhvcmluZ1VJVGV4dC5WQVJJQUJJTElUWV9UWVBFX1RFWFQpOwotCi0JCXZpZXdlcl92YXJpYWJpbGl0eSA9IG5ldyBDb21ib1ZpZXdlcihjdHJsX3ZhcmlhYmlsaXR5KTsKLQkJewotCQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMIHwgR3JpZERhdGEuQkVHSU5OSU5HIHwgR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMKTsKLQkJCWdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJCWdyaWREYXRhLmhlaWdodEhpbnQgPSAyNDsKLQkJCWdyaWREYXRhLndpZHRoSGludCA9IDMwMDsKLQkJCXZpZXdlcl92YXJpYWJpbGl0eS5nZXRDb21ibygpLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQl9Ci0JCXZpZXdlcl92YXJpYWJpbGl0eS5zZXRDb250ZW50UHJvdmlkZXIoY29udGVudFByb3ZpZGVyVmFyaWFiaWxpdHkpOwotCQl2aWV3ZXJfdmFyaWFiaWxpdHkuc2V0TGFiZWxQcm92aWRlcihsYWJlbFByb3ZpZGVyVmFyaWFiaWxpdHkpOwotCQl2aWV3ZXJfdmFyaWFiaWxpdHkuc2V0SW5wdXQobWV0aG9kRWxlbWVudCk7Ci0KLQkJdG9vbGtpdC5jcmVhdGVMYWJlbCh2YXJpYWJpbGl0eUNvbXBvc2l0ZSwgIiIsIFNXVC5OT05FKTsgLy8kTk9OLU5MUy0xJAotCi0JCS8vU3RyaW5nIGJhc2VFbGVtZW50ID0gTGlicmFyeVVJVGV4dC5nZXRVSVRleHRMb3dlcihtZXRob2RFbGVtZW50KTsKLQkJbGFiZWxfYmFzZSA9IGNyZWF0ZUxhYmVsKHRvb2xraXQsIHZhcmlhYmlsaXR5Q29tcG9zaXRlLAotCQkJCUF1dGhvcmluZ1VJVGV4dC5CQVNFX0VMRU1FTlRfVEVYVCwgMik7Ci0JCWN0cmxfYmFzZSA9IGNyZWF0ZVRhYmxlKHRvb2xraXQsIHZhcmlhYmlsaXR5Q29tcG9zaXRlLCBTV1QuU0lOR0xFCi0JCQkJfCBTV1QuUkVBRF9PTkxZLCBHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwgfCBHcmlkRGF0YS5CRUdJTk5JTkcsIDUsIDMwMCwgMSwgMik7Ci0JCXsKLQkJCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCB8IEdyaWREYXRhLkJFR0lOTklORyk7Ci0JCQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCQlncmlkRGF0YS5oZWlnaHRIaW50ID0gMjQ7Ci0JCQlncmlkRGF0YS53aWR0aEhpbnQgPSAzMDA7Ci0JCQljdHJsX2Jhc2Uuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCX0KLQotCQliYXNlX3ZpZXdlciA9IG5ldyBUYWJsZVZpZXdlcihjdHJsX2Jhc2UpOwotCQlpbml0Q29udGVudFByb3ZpZGVyQmFzZSgpOwotCQliYXNlX3ZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKGxhYmVsUHJvdmlkZXJCYXNlKTsKLQkJYmFzZV92aWV3ZXIuc2V0SW5wdXQobWV0aG9kRWxlbWVudCk7Ci0KLQkJQ29tcG9zaXRlIGJhc2VCdXR0b25QYW5lID0gY3JlYXRlQ29tcG9zaXRlKHRvb2xraXQsIHZhcmlhYmlsaXR5Q29tcG9zaXRlLCAKLQkJCQlHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9CRUdJTk5JTkcsIDEsIDEsIDEpOwotCQl7Ci0JCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpOwotCQkJYmFzZUJ1dHRvblBhbmUuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCX0KLQkJY3RybF9iYXNlX2J1dHRvbiA9IHRvb2xraXQuY3JlYXRlQnV0dG9uKGJhc2VCdXR0b25QYW5lLAotCQkJCUF1dGhvcmluZ1VJVGV4dC5TRUxFQ1RfQlVUVE9OX1RFWFQsIFNXVC5TSU1QTEUpOwotCQl7Ci0JCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQkJZ3JpZERhdGEud2lkdGhIaW50ID0gQlVUVE9OX1dJRFRIOwotCQkJY3RybF9iYXNlX2J1dHRvbi5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJfQotCi0JCS8vIFNldCBmb2N1cyBvbiB0aGUgTmFtZSB0ZXh0IGNvbnRyb2wuCi0JCURpc3BsYXkgZGlzcGxheSA9IGZvcm0uZ2V0Qm9keSgpLmdldERpc3BsYXkoKTsKLQkJaWYgKCEoZGlzcGxheSA9PSBudWxsIHx8IGRpc3BsYXkuaXNEaXNwb3NlZCgpKSkgewotCQkJZGlzcGxheS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJaWYoY3RybF9uYW1lLmlzRGlzcG9zZWQoKSkgcmV0dXJuOwotCQkJCQkKLQkJCQkJY3RybF9uYW1lLnNldEZvY3VzKCk7Ci0JCQkJCWlmIChtZXRob2RVbml0ICE9IG51bGwgJiYgbWV0aG9kVW5pdC5nZXRDaGFuZ2VEYXRlKCkgPT0gbnVsbCkKLQkJCQkJCWN0cmxfbmFtZS5zZXRTZWxlY3Rpb24oMCwgY3RybF9uYW1lLmdldFRleHQoKS5sZW5ndGgoKSk7Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoKGJvb2xlYW4gZWRpdGFibGUpIHsKLQkJY3RybF9uYW1lLnNldEVkaXRhYmxlKGVkaXRhYmxlKTsKLQkJY3RybF9wcmVzZW50YXRpb25fbmFtZS5zZXRFZGl0YWJsZShlZGl0YWJsZSk7Ci0JCWlmIChsb25nUHJlc2VudGF0aW9uTmFtZU9uICYmIEF1dGhvcmluZ1VJUHJlZmVyZW5jZXMuZ2V0U2hvd0xvbmdQcmVzZW50YXRpb25OYW1lKCkpIHsKLQkJCWN0cmxfbG9uZ19wcmVzZW50YXRpb25fbmFtZS5zZXRFZGl0YWJsZShlZGl0YWJsZSk7Ci0JCX0KLQotCQlpZiAoYnJpZWZEZXNjT24pIHsKLQkJCWN0cmxfYnJpZWZfZGVzYy5zZXRFZGl0YWJsZShlZGl0YWJsZSk7Ci0JCX0KLQkJaWYgKHB1cnBvc2VPbikgewotCQkJY3RybF9wdXJwb3NlLnNldEVkaXRhYmxlKGVkaXRhYmxlKTsKLQkJfQotCQlpZiAoZnVsbERlc2NPbikgewotCQkJY3RybF9mdWxsX2Rlc2Muc2V0RWRpdGFibGUoZWRpdGFibGUpOwotCQl9Ci0JCWlmIChrZXlDb25zaWRlcmF0aW9uT24pIHsKLQkJCWN0cmxfa2V5LnNldEVkaXRhYmxlKGVkaXRhYmxlKTsKLQkJfQotCQlpZiAoZXh0ZXJuYWxJZE9uKSB7Ci0JCQljdHJsX2V4dGVybmFsX2lkLnNldEVkaXRhYmxlKGVkaXRhYmxlKTsKLQkJfQotCQlpZiAoZWxlbWVudFR5cGVPbikgewotCQkJY3RybF90eXBlX2J1dHRvbi5zZXRFbmFibGVkKGVkaXRhYmxlKTsKLQkJfQotCQlpZiAodmFyaWFiaWxpdHlTZWN0aW9uT24pIHsKLQkJCWN0cmxfdmFyaWFiaWxpdHkuc2V0RW5hYmxlZChlZGl0YWJsZSk7Ci0JCQljdHJsX2Jhc2VfYnV0dG9uLnNldEVuYWJsZWQoZWRpdGFibGUpOwotCQkJaWYgKCgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHZpZXdlcl92YXJpYWJpbGl0eS5nZXRTZWxlY3Rpb24oKSkKLQkJCQkJLmdldEZpcnN0RWxlbWVudCgpID09IFZhcmlhYmlsaXR5VHlwZS5OQSkgewotCQkJCWN0cmxfYmFzZV9idXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQl9Ci0JCX0KLQkJaWYgKHZlcnNpb25TZWN0aW9uT24pIHsKLQkJCWN0cmxfY2hhbmdlX2RhdGUuc2V0RWRpdGFibGUoZmFsc2UpOwotCQkJY3RybF9jaGFuZ2VfZGVzYy5zZXRFZGl0YWJsZShlZGl0YWJsZSk7Ci0JCQljdHJsX2F1dGhvcnMuc2V0RWRpdGFibGUoZWRpdGFibGUpOwotCQkJY3RybF92ZXJzaW9uLnNldEVkaXRhYmxlKGVkaXRhYmxlKTsKLQkJCWNvcHlyaWdodF9idXR0b24uc2V0RW5hYmxlZChlZGl0YWJsZSk7Ci0JCQlzZXRDb3B5cmlnaHRCdXR0b25EZXNlbGVjdCgpOwotCQl9Ci0JCWlmIChpY29uU2VjdGlvbk9uKSB7Ci0JCQljdHJsX3NlbGVjdF9zaGFwZUljb25fYnV0dG9uLnNldEVuYWJsZWQoZWRpdGFibGUpOwotCQkJY3RybF9jbGVhcl9zaGFwZUljb25fYnV0dG9uLnNldEVuYWJsZWQoZWRpdGFibGUKLQkJCQkJJiYgY29udGVudEVsZW1lbnQuZ2V0U2hhcGVpY29uKCkgIT0gbnVsbCk7Ci0JCQljdHJsX3NlbGVjdF9ub2RlSWNvbl9idXR0b24uc2V0RW5hYmxlZChlZGl0YWJsZSk7Ci0JCQljdHJsX2NsZWFyX25vZGVJY29uX2J1dHRvbi5zZXRFbmFibGVkKGVkaXRhYmxlCi0JCQkJCSYmIGNvbnRlbnRFbGVtZW50LmdldE5vZGVpY29uKCkgIT0gbnVsbCk7Ci0JCX0KLQkJaWYgKGN0cmxfZXhwYW5kZWQgIT0gbnVsbCkgewotCQkJY3RybF9leHBhbmRlZC5zZXRFZGl0YWJsZShlZGl0YWJsZSk7Ci0JCX0KLQkJCi0JCWlmIChwdWJsaXNoQ2F0ZWdvcnlPbikgewotCQkJY3RybF9wdWJsaXNoX2NhdGVnb3JpZXNfYnV0dG9uLnNldEVuYWJsZWQoZWRpdGFibGUpOwotCQl9Ci0JCQotCQlpZiAoY29sdW1uUHJvdmlkZXIgIT0gbnVsbCkKLQkJCWNvbHVtblByb3ZpZGVyLnJlZnJlc2goZWRpdGFibGUpOwotCQkKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzZWN0aW9uUHJvdmlkZXJzLnNpemUoKTsgaSsrKSB7Ci0JCQlPYmplY3QgcHJvdmlkZXIgPSBzZWN0aW9uUHJvdmlkZXJzLmdldChpKTsKLQkJCWlmIChwcm92aWRlciAhPSBudWxsICYmIHByb3ZpZGVyIGluc3RhbmNlb2YgSVNlY3Rpb25Qcm92aWRlcikgewotCQkJCSgoSVNlY3Rpb25Qcm92aWRlcikgcHJvdmlkZXIpLnJlZnJlc2goZWRpdGFibGUpOwotCQkJfQotCQl9Ci0JCQkKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgdGhlIERldGFpbCBzZWN0aW9uLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZURldGFpbFNlY3Rpb24oRm9ybVRvb2xraXQgdG9vbGtpdCkgewotCQlkZXRhaWxTZWN0aW9uID0gY3JlYXRlU2VjdGlvbih0b29sa2l0LCBzZWN0aW9uQ29tcG9zaXRlLAotCQkJCUF1dGhvcmluZ1VJVGV4dC5ERVRBSUxfU0VDVElPTl9OQU1FLAotCQkJCWdldERldGFpbFNlY3Rpb25EZXNjcmlwdGlvbigpKTsKLQkJZGV0YWlsQ29tcG9zaXRlID0gY3JlYXRlQ29tcG9zaXRlKHRvb2xraXQsIGRldGFpbFNlY3Rpb24pOwotCQljcmVhdGVEZXRhaWxTZWN0aW9uQ29udGVudCgpOwotCQl0b29sa2l0LnBhaW50Qm9yZGVyc0ZvcihkZXRhaWxDb21wb3NpdGUpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIERldGFpbCBzZWN0aW9uIGNvbnRlbnQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRGV0YWlsU2VjdGlvbkNvbnRlbnQoKSB7Ci0JCWlmIChwdXJwb3NlT24pIHsKLQkJCWN0cmxfcHVycG9zZSA9IGNyZWF0ZVJpY2hUZXh0RWRpdFdpdGhMaW5rRm9yU2VjdGlvbih0b29sa2l0LAotCQkJCQlkZXRhaWxDb21wb3NpdGUsIEF1dGhvcmluZ1VJVGV4dC5QVVJQT1NFX1RFWFQsIDQwLCA0MDAsCi0JCQkJCURFVEFJTF9TRUNUSU9OX0lEKTsKLQkJfQotCi0JCWlmIChmdWxsRGVzY09uKSB7Ci0JCQljdHJsX2Z1bGxfZGVzYyA9IGNyZWF0ZVJpY2hUZXh0RWRpdFdpdGhMaW5rRm9yU2VjdGlvbih0b29sa2l0LAotCQkJCQlkZXRhaWxDb21wb3NpdGUsIEF1dGhvcmluZ1VJVGV4dC5NQUlOX0RFU0NSSVBUSU9OX1RFWFQsCi0JCQkJCTEwMCwgNDAwLCBERVRBSUxfU0VDVElPTl9JRCk7Ci0KLQkJfQotCi0JCWlmIChrZXlDb25zaWRlcmF0aW9uT24pIHsKLQkJCWN0cmxfa2V5ID0gY3JlYXRlUmljaFRleHRFZGl0V2l0aExpbmtGb3JTZWN0aW9uKHRvb2xraXQsCi0JCQkJCWRldGFpbENvbXBvc2l0ZSwgQXV0aG9yaW5nVUlUZXh0LktFWV9DT05TSURFUkFUSU9OU19URVhULAotCQkJCQk0MCwgNDAwLCBERVRBSUxfU0VDVElPTl9JRCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBOb3RhdGlvbiBzZWN0aW9uLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZU5vdGF0aW9uU2VjdGlvbihGb3JtVG9vbGtpdCB0b29sa2l0KSB7Ci0JCW5vdGF0aW9uU2VjdGlvbiA9IGNyZWF0ZVNlY3Rpb24odG9vbGtpdCwgc2VjdGlvbkNvbXBvc2l0ZSwKLQkJCQlBdXRob3JpbmdVSVRleHQuTk9UQVRJT05fU0VDVElPTl9OQU1FLAotCQkJCWdldE5vdGF0aW9uU2VjdGlvbkRlc2NyaXB0aW9uKCkpOwotCQlub3RhdGlvbkNvbXBvc2l0ZSA9IGNyZWF0ZUNvbXBvc2l0ZSh0b29sa2l0LCBub3RhdGlvblNlY3Rpb24pOwotCQljcmVhdGVOb3RhdGlvblNlY3Rpb25Db250ZW50KCk7Ci0JCXRvb2xraXQucGFpbnRCb3JkZXJzRm9yKG5vdGF0aW9uQ29tcG9zaXRlKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBOb3RhdGlvbiBzZWN0aW9uIGNvbnRlbnQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlTm90YXRpb25TZWN0aW9uQ29udGVudCgpIHsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBUYWlsb3Jpbmcgc2VjdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVUYWlsb3JpbmdTZWN0aW9uKEZvcm1Ub29sa2l0IHRvb2xraXQpIHsKLQkJdGFpbG9yaW5nU2VjdGlvbiA9IGNyZWF0ZVNlY3Rpb24odG9vbGtpdCwgc2VjdGlvbkNvbXBvc2l0ZSwKLQkJCQlBdXRob3JpbmdVSVRleHQuVEFJTE9SSU5HX1NFQ1RJT05fTkFNRSwKLQkJCQlnZXRUYWlsb3JpbmdTZWN0aW9uRGVzY3JpcHRpb24oKSk7Ci0JCXRhaWxvcmluZ0NvbXBvc2l0ZSA9IGNyZWF0ZUNvbXBvc2l0ZSh0b29sa2l0LCB0YWlsb3JpbmdTZWN0aW9uKTsKLQkJY3JlYXRlVGFpbG9yaW5nU2VjdGlvbkNvbnRlbnQoKTsKLQkJdG9vbGtpdC5wYWludEJvcmRlcnNGb3IodGFpbG9yaW5nQ29tcG9zaXRlKTsKLQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZVRhaWxvcmluZ1NlY3Rpb25Db250ZW50KCkgewotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBzbG90IHNlY3Rpb24uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlU2xvdFNlY3Rpb24oRm9ybVRvb2xraXQgdG9vbGtpdCkgewotCi0JfQotCi0JLyoqCi0JICogQWRkIGxpc3RlbmVycyB0byBtb25pdG9yIGZvY3VzIGFuZCBtb2RpZmljYXRpb24gY2hhbmdlcyBpbiB0aGUgZWRpdAotCSAqIGNvbnRyb2xzLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZExpc3RlbmVycygpIHsKLQkJZmluYWwgTWV0aG9kRWxlbWVudEVkaXRvciBlZGl0b3IgPSAoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCk7Ci0KLQkJbW9kZWxNb2RpZnlMaXN0ZW5lciA9IGVkaXRvci5jcmVhdGVNb2RpZnlMaXN0ZW5lcihtZXRob2RFbGVtZW50KTsKLQkJY29udGVudE1vZGlmeUxpc3RlbmVyID0gZWRpdG9yLmNyZWF0ZU1vZGlmeUxpc3RlbmVyKG1ldGhvZFVuaXQpOwotCQlhY3Rpb25NZ3IgPSBlZGl0b3IuZ2V0QWN0aW9uTWFuYWdlcigpOwotCQkKLQkJCi0KLQkJZm9ybS5hZGRDb250cm9sTGlzdGVuZXIobmV3IENvbnRyb2xMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGNvbnRyb2xSZXNpemVkKENvbnRyb2xFdmVudCBlKSB7Ci0JCQkJaWYgKGN0cmxfZXhwYW5kZWQgIT0gbnVsbCkgewotCQkJCQkoKEdyaWREYXRhKSBjdHJsX2V4cGFuZGVkLmdldExheW91dERhdGEoKSkuaGVpZ2h0SGludCA9IGdldFJpY2hUZXh0RWRpdG9ySGVpZ2h0KCk7Ci0JCQkJCSgoR3JpZERhdGEpIGN0cmxfZXhwYW5kZWQuZ2V0TGF5b3V0RGF0YSgpKS53aWR0aEhpbnQgPSBnZXRSaWNoVGV4dEVkaXRvcldpZHRoKCk7Ci0JCQkJfQotCQkJCWZvcm1TZWN0aW9uLmxheW91dCh0cnVlLCB0cnVlKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgY29udHJvbE1vdmVkKENvbnRyb2xFdmVudCBlKSB7Ci0JCQl9Ci0JCX0pOwotCi0JCWZvcm0uZ2V0UGFyZW50KCkuYWRkTGlzdGVuZXIoU1dULkFjdGl2YXRlLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJCWlmKGRpc3Bvc2VkKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJCi0JCQkJcmVmcmVzaCghVG5nVXRpbC5pc0xvY2tlZChtZXRob2RFbGVtZW50KSk7Ci0JCQkJc2V0Rm9ybVRleHRXaXRoVmFyaWFibGVJbmZvKCk7Ci0JCQkJCi0JCQkJLy8gZG8gcmVmcmVzaCB2YXJpYWJpbGl0eSBhbmQgY29weXJpZ2h0IHZpZXdlcgotCQkJCWlmKHZhcmlhYmlsaXR5U2VjdGlvbk9uKQotCQkJCQliYXNlX3ZpZXdlci5yZWZyZXNoKCk7Ci0JCQkJaWYodmVyc2lvblNlY3Rpb25PbikKLQkJCQkJY29weXJpZ2h0X3ZpZXdlci5yZWZyZXNoKCk7Ci0JCQl9Ci0JCX0pOwotCi0JCWlmIChnZW5lcmFsU2VjdGlvbk9uKSB7Ci0JCQlhZGRHZW5lcmFsU2VjdGlvbkxpc3RlbmVycygpOwotCQl9Ci0KLQkJaWYgKGRldGFpbFNlY3Rpb25PbikgewotCQkJYWRkRGV0YWlsU2VjdGlvbkxpc3RlbmVycygpOwotCQl9Ci0KLQkJaWYgKHZlcnNpb25TZWN0aW9uT24pIHsKLQkJCWFkZFZlcnNpb25TZWN0aW9uTGlzdGVuZXJzKCk7Ci0JCX0KLQotCQlpZiAoaWNvblNlY3Rpb25PbikgewotCQkJYWRkSWNvblNlY3Rpb25MaXN0ZW5lcnMoKTsKLQkJfQotCi0JCWlmICh2YXJpYWJpbGl0eVNlY3Rpb25PbikgewotCQkJdmlld2VyX3ZhcmlhYmlsaXR5Ci0JCQkJCS5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0JCQkJCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQkJCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgdmlld2VyX3ZhcmlhYmlsaXR5Ci0JCQkJCQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCi0JCQkJCQkJaWYgKGNvbnRlbnRFbGVtZW50LmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSAhPSBudWxsKSB7Ci0JCQkJCQkJCWJvb2xlYW4gc3RhdHVzID0gZWRpdG9yCi0JCQkJCQkJCQkJLmdldEFjdGlvbk1hbmFnZXIoKQotCQkJCQkJCQkJCS5kb0FjdGlvbigKLQkJCQkJCQkJCQkJCUlBY3Rpb25NYW5hZ2VyLlNFVCwKLQkJCQkJCQkJCQkJCW1ldGhvZEVsZW1lbnQsCi0JCQkJCQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJCQkJCQkuZ2V0VmFyaWFiaWxpdHlFbGVtZW50X1ZhcmlhYmlsaXR5VHlwZSgpLAotCQkJCQkJCQkJCQkJKFZhcmlhYmlsaXR5VHlwZSkgc2VsZWN0aW9uCi0JCQkJCQkJCQkJCQkJCS5nZXRGaXJzdEVsZW1lbnQoKSwgLTEpOwotCQkJCQkJCQlpZiAoIXN0YXR1cykgewotCQkJCQkJCQkJcmV0dXJuOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJCWlmIChzZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCkgPT0gVmFyaWFiaWxpdHlUeXBlLk5BKSB7Ci0JCQkJCQkJCWlmIChjb250ZW50RWxlbWVudC5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkgIT0gbnVsbCkgewotCQkJCQkJCQkJYm9vbGVhbiBzdGF0dXMgPSBlZGl0b3IKLQkJCQkJCQkJCQkJLmdldEFjdGlvbk1hbmFnZXIoKQotCQkJCQkJCQkJCQkuZG9BY3Rpb24oCi0JCQkJCQkJCQkJCQkJSUFjdGlvbk1hbmFnZXIuU0VULAotCQkJCQkJCQkJCQkJCW1ldGhvZEVsZW1lbnQsCi0JCQkJCQkJCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCQkJCQkJCS5nZXRWYXJpYWJpbGl0eUVsZW1lbnRfVmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpLAotCQkJCQkJCQkJCQkJCW51bGwsIC0xKTsKLQkJCQkJCQkJCWlmICghc3RhdHVzKSB7Ci0JCQkJCQkJCQkJcmV0dXJuOwotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJCWN0cmxfYmFzZV9idXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJCQkJCWJhc2Vfdmlld2VyLnJlZnJlc2goKTsKLQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQlMaXN0IHNlbGVjdGlvbkJhc2VMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQkJCQlWYXJpYWJpbGl0eUVsZW1lbnQgYmFzZSA9IGNvbnRlbnRFbGVtZW50Ci0JCQkJCQkJCQkJLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsKLQkJCQkJCQkJc2VsZWN0aW9uQmFzZUxpc3QuYWRkKGJhc2UpOwotCQkJCQkJCQljdHJsX2Jhc2VfYnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJCQkJCWJhc2Vfdmlld2VyLnJlZnJlc2goKTsKLQkJCQkJCQl9Ci0JCQkJCQkJc2V0Rm9ybVRleHRXaXRoVmFyaWFibGVJbmZvKCk7Ci0JCQkJCQkJCi0JCQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzZWN0aW9uUHJvdmlkZXJzLnNpemUoKTsgaSsrKSB7Ci0JCQkJCQkJCU9iamVjdCBwcm92aWRlciA9IHNlY3Rpb25Qcm92aWRlcnMuZ2V0KGkpOwotCQkJCQkJCQlpZiAocHJvdmlkZXIgIT0gbnVsbCAmJiBwcm92aWRlciBpbnN0YW5jZW9mIElTZWN0aW9uUHJvdmlkZXIpIHsKLQkJCQkJCQkJCSgoSVNlY3Rpb25Qcm92aWRlcikgcHJvdmlkZXIpLnJlZnJlc2goZmFsc2UpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9KTsKLQkKLQkJCWN0cmxfYmFzZV9idXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQlmaWx0ZXIgPSBnZXRGaWx0ZXIoKTsKLQkJCQkJaWYgKGZpbHRlciAhPSBudWxsKSB7Ci0JCQkJCQlJdGVtc0ZpbHRlckRpYWxvZyBmZCA9IG5ldyBJdGVtc0ZpbHRlckRpYWxvZyhQbGF0Zm9ybVVJCi0JCQkJCQkJCS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKQotCQkJCQkJCQkuZ2V0U2hlbGwoKSwgZmlsdGVyLCBnZXRDb250ZW50RWxlbWVudCgpLAotCQkJCQkJCQlMaWJyYXJ5VUlUZXh0LmdldFVJVGV4dChtZXRob2RFbGVtZW50LCB0cnVlKSk7Ci0JCQkJCQlmZC5zZXRWaWV3ZXJTZWxlY3Rpb25TaW5nbGUodHJ1ZSk7Ci0JCQkJCQlmZC5zZXRCbG9ja09uT3Blbih0cnVlKTsKLQkJCQkJCWZkLnNldFRpdGxlKExpYnJhcnlVSVRleHQuZ2V0VUlUZXh0KG1ldGhvZEVsZW1lbnQsIHRydWUpKTsKLQkJCQkJCWZkLm9wZW4oKTsKLQkJCQkJCWZkLmdldFNlbGVjdGVkSXRlbXMoKTsKLQkJCQkJCWlmIChmZC5nZXRTZWxlY3RlZEl0ZW1zKCkuc2l6ZSgpID4gMCkgewotCQkJCQkJCUlTdGF0dXMgaXN0YXR1cyA9IERlcGVuZGVuY3lDaGVja2VyLmNoZWNrQ2lyY3VsYXJEZXBlbmRlbmN5QWZ0ZXJGaWx0ZXJTZWxlY3Rpb24oCi0JCQkJCQkJCQljb250ZW50RWxlbWVudCwgKFZhcmlhYmlsaXR5RWxlbWVudCkgZmQuZ2V0U2VsZWN0ZWRJdGVtcygpLmdldCgwKSk7Ci0JCQkJCQkJaWYoIWlzdGF0dXMuaXNPSygpKSB7Ci0JCQkJCQkJCVN0cmluZyB0aXRsZSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLnZhcmlhYmlsaXR5X2Vycm9yX3RpdGxlOwotCQkJCQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkuZGlzcGxheUVycm9yKHRpdGxlLCBpc3RhdHVzLmdldE1lc3NhZ2UoKSk7CQkJCQkJCi0JCQkJCQkJCXJldHVybjsKLQkJCQkJCQl9Ci0JCQkJCQkJYm9vbGVhbiBzdGF0dXMgPSBlZGl0b3IKLQkJCQkJCQkJCS5nZXRBY3Rpb25NYW5hZ2VyKCkKLQkJCQkJCQkJCS5kb0FjdGlvbigKLQkJCQkJCQkJCQkJSUFjdGlvbk1hbmFnZXIuU0VULAotCQkJCQkJCQkJCQltZXRob2RFbGVtZW50LAotCQkJCQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJCQkJCS5nZXRWYXJpYWJpbGl0eUVsZW1lbnRfVmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpLAotCQkJCQkJCQkJCQkoVmFyaWFiaWxpdHlFbGVtZW50KSBmZAotCQkJCQkJCQkJCQkJCS5nZXRTZWxlY3RlZEl0ZW1zKCkuZ2V0KDApLCAtMSk7Ci0JCQkJCQkJaWYgKCFzdGF0dXMpIHsKLQkJCQkJCQkJcmV0dXJuOwotCQkJCQkJCX0KLQkJCQkJCQlzdGF0dXMgPSBlZGl0b3IKLQkJCQkJCQkJCS5nZXRBY3Rpb25NYW5hZ2VyKCkKLQkJCQkJCQkJCS5kb0FjdGlvbigKLQkJCQkJCQkJCQkJSUFjdGlvbk1hbmFnZXIuU0VULAotCQkJCQkJCQkJCQltZXRob2RFbGVtZW50LAotCQkJCQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJCQkJCS5nZXRWYXJpYWJpbGl0eUVsZW1lbnRfVmFyaWFiaWxpdHlUeXBlKCksCi0JCQkJCQkJCQkJCShWYXJpYWJpbGl0eVR5cGUpICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHZpZXdlcl92YXJpYWJpbGl0eQotCQkJCQkJCQkJCQkJCS5nZXRTZWxlY3Rpb24oKSkKLQkJCQkJCQkJCQkJCQkuZ2V0Rmlyc3RFbGVtZW50KCksIC0xKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlzZXRGb3JtVGV4dFdpdGhWYXJpYWJsZUluZm8oKTsKLQkJCQkJCi0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2VjdGlvblByb3ZpZGVycy5zaXplKCk7IGkrKykgewotCQkJCQkJT2JqZWN0IHByb3ZpZGVyID0gc2VjdGlvblByb3ZpZGVycy5nZXQoaSk7Ci0JCQkJCQlpZiAocHJvdmlkZXIgIT0gbnVsbCAmJiBwcm92aWRlciBpbnN0YW5jZW9mIElTZWN0aW9uUHJvdmlkZXIpIHsKLQkJCQkJCQkoKElTZWN0aW9uUHJvdmlkZXIpIHByb3ZpZGVyKS5yZWZyZXNoKGZhbHNlKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlpZiAoKGN0cmxfYmFzZSAhPSBudWxsKSAmJiAoIShjdHJsX2Jhc2UuaXNEaXNwb3NlZCgpKSkpCi0JCQkJCQljdHJsX2Jhc2UucmVkcmF3KCk7Ci0JCQkJCWlmICgoYmFzZV92aWV3ZXIgIT0gbnVsbCkKLQkJCQkJCQkmJiAoIShiYXNlX3ZpZXdlci5nZXRDb250cm9sKCkuaXNEaXNwb3NlZCgpKSkpCi0JCQkJCQliYXNlX3ZpZXdlci5yZWZyZXNoKCk7Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRHZW5lcmFsU2VjdGlvbkxpc3RlbmVycygpIHsKLQkJY3RybF9uYW1lLmFkZE1vZGlmeUxpc3RlbmVyKG1vZGVsTW9kaWZ5TGlzdGVuZXIpOwotCQljdHJsX25hbWUuYWRkRm9jdXNMaXN0ZW5lcihuYW1lRm9jdXNMaXN0ZW5lcik7Ci0KLQkJY3RybF9wcmVzZW50YXRpb25fbmFtZS5hZGRNb2RpZnlMaXN0ZW5lcihtb2RlbE1vZGlmeUxpc3RlbmVyKTsKLQkJY3RybF9wcmVzZW50YXRpb25fbmFtZS5hZGRGb2N1c0xpc3RlbmVyKG5ldyBGb2N1c0FkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBmb2N1c0xvc3QoRm9jdXNFdmVudCBlKSB7Ci0JCQkJU3RyaW5nIG9sZENvbnRlbnQgPSBtZXRob2RFbGVtZW50LmdldFByZXNlbnRhdGlvbk5hbWUoKTsKLQkJCQlpZiAoKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkubXVzdFJlc3RvcmVWYWx1ZSgKLQkJCQkJCWUud2lkZ2V0LCBvbGRDb250ZW50KSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCQotCQkJCVN0cmluZyBuZXdDb250ZW50ID0gU3RyVXRpbC5nZXRQbGFpblRleHQoY3RybF9wcmVzZW50YXRpb25fbmFtZQotCQkJCQkJLmdldFRleHQoKSk7CQkJCQotCQkJCWlmICghbmV3Q29udGVudC5lcXVhbHMob2xkQ29udGVudCkpIHsKLQkJCQkJYm9vbGVhbiBzdWNjZXNzID0gYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlNFVCwKLQkJCQkJCQltZXRob2RFbGVtZW50LCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJLmdldE1ldGhvZEVsZW1lbnRfUHJlc2VudGF0aW9uTmFtZSgpLAotCQkJCQkJCW5ld0NvbnRlbnQsIC0xKTsKLQkJCQkJaWYgKHN1Y2Nlc3MpIHsKLQkJCQkJCWN0cmxfcHJlc2VudGF0aW9uX25hbWUuc2V0VGV4dChuZXdDb250ZW50KTsKLQkJCQkJfQotCQkJCX0KLQkJCQkvLyBjbGVhciB0aGUgc2VsZWN0aW9uIHdoZW4gdGhlIGZvY3VzIG9mIHRoZSBjb21wb25lbnQgaXMgbG9zdCAKLQkJCQlpZihjdHJsX3ByZXNlbnRhdGlvbl9uYW1lLmdldFNlbGVjdGlvbkNvdW50KCkgPiAwKXsKLQkJCQkJY3RybF9wcmVzZW50YXRpb25fbmFtZS5jbGVhclNlbGVjdGlvbigpOwotCQkJCX0gICAgCi0JCQl9Ci0JCQkKLQkJCS8qIChub24tSmF2YWRvYykKLQkJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Gb2N1c0FkYXB0ZXIjZm9jdXNHYWluZWQob3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Gb2N1c0V2ZW50KQotCQkJICovCi0JCQlwdWJsaWMgdm9pZCBmb2N1c0dhaW5lZChGb2N1c0V2ZW50IGUpIHsKLQkJCQkoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpKS5zZXRDdXJyZW50RmVhdHVyZUVkaXRvcihlLndpZGdldCwgVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWV0aG9kRWxlbWVudF9QcmVzZW50YXRpb25OYW1lKCkpOwotCQkJCS8vIHdoZW4gdXNlciB0YWIgdG8gdGhpcyBmaWVsZCwgc2VsZWN0IGFsbCB0ZXh0Ci0JCQkJY3RybF9wcmVzZW50YXRpb25fbmFtZS5zZWxlY3RBbGwoKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQlpZiAobG9uZ1ByZXNlbnRhdGlvbk5hbWVPbiAmJiBBdXRob3JpbmdVSVByZWZlcmVuY2VzLmdldFNob3dMb25nUHJlc2VudGF0aW9uTmFtZSgpKSB7Ci0JCQljdHJsX2xvbmdfcHJlc2VudGF0aW9uX25hbWUuYWRkTW9kaWZ5TGlzdGVuZXIobW9kZWxNb2RpZnlMaXN0ZW5lcik7Ci0JCQljdHJsX2xvbmdfcHJlc2VudGF0aW9uX25hbWUuYWRkRm9jdXNMaXN0ZW5lcihuZXcgRm9jdXNBZGFwdGVyKCkgewotCQkJCXB1YmxpYyB2b2lkIGZvY3VzTG9zdChGb2N1c0V2ZW50IGUpIHsKLQkJCQkJU3RyaW5nIG9sZENvbnRlbnQgPSBjb250ZW50RWxlbWVudC5nZXRQcmVzZW50YXRpb24oKS5nZXRMb25nUHJlc2VudGF0aW9uTmFtZSgpOwotCQkJCQlpZiAoKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkubXVzdFJlc3RvcmVWYWx1ZSgKLQkJCQkJCQljdHJsX2xvbmdfcHJlc2VudGF0aW9uX25hbWUsIG9sZENvbnRlbnQpKSB7Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCX0KLQkJCQkJCi0JCQkJCVN0cmluZyBuZXdDb250ZW50ID0gU3RyVXRpbC5nZXRQbGFpblRleHQoY3RybF9sb25nX3ByZXNlbnRhdGlvbl9uYW1lCi0JCQkJCQkJLmdldFRleHQoKSk7CQkJCQotCQkJCQlpZiAoIW5ld0NvbnRlbnQuZXF1YWxzKG9sZENvbnRlbnQpKSB7Ci0JCQkJCQlib29sZWFuIHN1Y2Nlc3MgPSBhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuU0VULAotCQkJCQkJCQljb250ZW50RWxlbWVudC5nZXRQcmVzZW50YXRpb24oKSwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCQkuZ2V0Q29udGVudERlc2NyaXB0aW9uX0xvbmdQcmVzZW50YXRpb25OYW1lKCksCi0JCQkJCQkJCW5ld0NvbnRlbnQsIC0xKTsKLQkJCQkJCWlmIChzdWNjZXNzKSB7Ci0JCQkJCQkJY3RybF9sb25nX3ByZXNlbnRhdGlvbl9uYW1lLnNldFRleHQobmV3Q29udGVudCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJLy8gY2xlYXIgdGhlIHNlbGVjdGlvbiB3aGVuIHRoZSBmb2N1cyBvZiB0aGUgY29tcG9uZW50IGlzIGxvc3QgCi0JCQkJCWlmKGN0cmxfbG9uZ19wcmVzZW50YXRpb25fbmFtZS5nZXRTZWxlY3Rpb25Db3VudCgpID4gMCl7Ci0JCQkJCQljdHJsX2xvbmdfcHJlc2VudGF0aW9uX25hbWUuY2xlYXJTZWxlY3Rpb24oKTsKLQkJCQkJfSAgICAKLQkJCQl9Ci0JCQkJCi0JCQkJLyogKG5vbi1KYXZhZG9jKQotCQkJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Gb2N1c0FkYXB0ZXIjZm9jdXNHYWluZWQob3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Gb2N1c0V2ZW50KQotCQkJCSAqLwotCQkJCXB1YmxpYyB2b2lkIGZvY3VzR2FpbmVkKEZvY3VzRXZlbnQgZSkgewotCQkJCQkvLyB3aGVuIHVzZXIgdGFiIHRvIHRoaXMgZmllbGQsIHNlbGVjdCBhbGwgdGV4dAotCQkJCQljdHJsX2xvbmdfcHJlc2VudGF0aW9uX25hbWUuc2VsZWN0QWxsKCk7Ci0JCQkJCSgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpCi0JCQkJCS5zZXRDdXJyZW50RmVhdHVyZUVkaXRvcihlLndpZGdldCwKLQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJLmdldENvbnRlbnREZXNjcmlwdGlvbl9Mb25nUHJlc2VudGF0aW9uTmFtZSgpKTsKLQkJCQl9Ci0JCQl9KTsKLQkJfQotCi0JCWlmIChicmllZkRlc2NPbikgewotCQkJY3RybF9icmllZl9kZXNjLmFkZE1vZGlmeUxpc3RlbmVyKG1vZGVsTW9kaWZ5TGlzdGVuZXIpOwotCQkJY3RybF9icmllZl9kZXNjLmFkZEZvY3VzTGlzdGVuZXIobmV3IEZvY3VzQWRhcHRlcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBmb2N1c0dhaW5lZChGb2N1c0V2ZW50IGUpIHsKLQkJCQkJKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkuc2V0Q3VycmVudEZlYXR1cmVFZGl0b3IoZS53aWRnZXQsCi0JCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWV0aG9kRWxlbWVudF9CcmllZkRlc2NyaXB0aW9uKCkpOwotCQkJCX0KLQotCQkJCS8qIChub24tSmF2YWRvYykKLQkJCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRm9jdXNBZGFwdGVyI2ZvY3VzTG9zdChvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkZvY3VzRXZlbnQpCi0JCQkJICovCi0JCQkJcHVibGljIHZvaWQgZm9jdXNMb3N0KEZvY3VzRXZlbnQgZSkgewotCQkJCQlTdHJpbmcgb2xkQ29udGVudCA9IG1ldGhvZEVsZW1lbnQuZ2V0QnJpZWZEZXNjcmlwdGlvbigpOwotCQkJCQlpZiAoKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkubXVzdFJlc3RvcmVWYWx1ZSgKLQkJCQkJCQllLndpZGdldCwgb2xkQ29udGVudCkpIHsKLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCQlTdHJpbmcgbmV3Q29udGVudCA9IGN0cmxfYnJpZWZfZGVzYy5nZXRUZXh0KCk7Ci0JCQkJCWlmICghbmV3Q29udGVudC5lcXVhbHMob2xkQ29udGVudCkpIHsKLQkJCQkJCWJvb2xlYW4gc3VjY2VzcyA9IGFjdGlvbk1nci5kb0FjdGlvbigKLQkJCQkJCQkJSUFjdGlvbk1hbmFnZXIuU0VULCBtZXRob2RFbGVtZW50LAotCQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJCS5nZXRNZXRob2RFbGVtZW50X0JyaWVmRGVzY3JpcHRpb24oKSwKLQkJCQkJCQkJbmV3Q29udGVudCwgLTEpOwotCQkJCQkJaWYgKHN1Y2Nlc3MpIHsKLQkJCQkJCQljdHJsX2JyaWVmX2Rlc2Muc2V0VGV4dChuZXdDb250ZW50KTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0pOwotCQl9Ci0KLQkJaWYgKGVsZW1lbnRUeXBlT24pIHsKLQkJCWlmIChtZXRob2RFbGVtZW50IGluc3RhbmNlb2YgR3VpZGFuY2UpIHsKLQkJCQljdHJsX3R5cGVfYnV0dG9uLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCQkJCWZpbmFsIE1ldGhvZEVsZW1lbnRFZGl0b3IgZWRpdG9yID0gKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpOwotCQkJCQkJaWYgKGVkaXRvci5pc0RpcnR5KCkpIHsKLQkJCQkJCQlTdHJpbmcgdGl0bGUgPSBBdXRob3JpbmdVSVJlc291cmNlcy5kZXNjcmlwdGlvblRhYkd1aWRhbmNlV2FybmluZ0RpYWxvZ190aXRsZTsgCi0JCQkJCQkJU3RyaW5nIG1lc3NhZ2UgPSBBdXRob3JpbmdVSVJlc291cmNlcy5kZXNjcmlwdGlvblRhYkd1aWRhbmNlV2FybmluZ0RpYWxvZ19tZXNzYWdlMTsgCi0JCQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpCi0JCQkJCQkJCQkuZGlzcGxheVdhcm5pbmcodGl0bGUsIG1lc3NhZ2UpOwotCQkJCQkJfSBlbHNlIGlmIChtZXRob2RFbGVtZW50IGluc3RhbmNlb2YgR3VpZGFuY2UpIHsKLQkJCQkJCQlNZXRob2RFbGVtZW50RGVsZXRlQWN0aW9uIGRlbGV0ZUFjdGlvbiA9IG5ldyBNZXRob2RFbGVtZW50RGVsZXRlQWN0aW9uKCk7Ci0JCQkJCQkJZGVsZXRlQWN0aW9uLnNldEVkaXRpbmdEb21haW4oTGlicmFyeVZpZXcuZ2V0VmlldygpCi0JCQkJCQkJCQkuZ2V0RWRpdGluZ0RvbWFpbigpKTsKLQkJCQkJCQlkZWxldGVBY3Rpb24KLQkJCQkJCQkJCS5zZWxlY3Rpb25DaGFuZ2VkKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKAotCQkJCQkJCQkJCQltZXRob2RFbGVtZW50KSk7Ci0JCQkJCQkJQ29tbWFuZCBjbWQgPSBkZWxldGVBY3Rpb24KLQkJCQkJCQkJCS5jcmVhdGVDb21tYW5kKENvbGxlY3Rpb25zCi0JCQkJCQkJCQkJCS5zaW5nbGV0b24obWV0aG9kRWxlbWVudCkpOwotCQkJCQkJCWlmIChjbWQgaW5zdGFuY2VvZiBEZWxldGVNZXRob2RFbGVtZW50Q29tbWFuZCkgewotCQkJCQkJCQlHdWlkYW5jZSBuZXdHdWlkYW5jZTsKLQkJCQkJCQkJdHJ5IHsKLQkJCQkJCQkJCW5ld0d1aWRhbmNlID0gQ29udmVydEd1aWRhbmNlVHlwZQotCQkJCQkJCQkJCS5jb252ZXJ0R3VpZGFuY2UoCi0JCQkJCQkJCQkJCQkoR3VpZGFuY2UpIG1ldGhvZEVsZW1lbnQsCi0JCQkJCQkJCQkJCQludWxsLAotCQkJCQkJCQkJCQkJKERlbGV0ZU1ldGhvZEVsZW1lbnRDb21tYW5kKSBjbWQpOwotCQkJCQkJCQl9Ci0JCQkJCQkJCWZpbmFsbHkgewotCQkJCQkJCQkJdHJ5IHsgY21kLmRpc3Bvc2UoKTsgfSBjYXRjaChFeGNlcHRpb24gZSkge30KLQkJCQkJCQkJfQotCQkJCQkJCQlpZiAobmV3R3VpZGFuY2UgIT0gbnVsbCkgewotCQkJCQkJCQkJRWRpdG9yQ2hvb3Nlci5nZXRJbnN0YW5jZSgpLmNsb3NlRWRpdG9yKAotCQkJCQkJCQkJCQltZXRob2RFbGVtZW50KTsKLQkJCQkJCQkJCUVkaXRvckNob29zZXIuZ2V0SW5zdGFuY2UoKS5vcGVuRWRpdG9yKAotCQkJCQkJCQkJCQluZXdHdWlkYW5jZSk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9IGVsc2UgaWYgKGVkaXRvci5pc0RpcnR5KCkpIHsKLQkJCQkJCQlTdHJpbmcgdGl0bGUgPSBBdXRob3JpbmdVSVJlc291cmNlcy5kZXNjcmlwdGlvblRhYkd1aWRhbmNlV2FybmluZ0RpYWxvZ190aXRsZTsgCi0JCQkJCQkJU3RyaW5nIG1lc3NhZ2UgPSBBdXRob3JpbmdVSVJlc291cmNlcy5kZXNjcmlwdGlvblRhYkd1aWRhbmNlV2FybmluZ0RpYWxvZ19tZXNzYWdlMjsgCi0JCQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpCi0JCQkJCQkJCQkuZGlzcGxheVdhcm5pbmcodGl0bGUsIG1lc3NhZ2UpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfSk7Ci0JCQl9Ci0JCX0KLQkJCi0JCWlmIChwdWJsaXNoQ2F0ZWdvcnlPbikJewotCQkJY3RybF9wdWJsaXNoX2NhdGVnb3JpZXNfYnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewkJCQotCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsJCQkJCi0JCQkJCVN0cmluZyB2YWwgPSBuZXcgQm9vbGVhbihjdHJsX3B1Ymxpc2hfY2F0ZWdvcmllc19idXR0b24uZ2V0U2VsZWN0aW9uKCkpLnRvU3RyaW5nKCk7CQkJCQotCQkJCQlNZXRob2RFbGVtZW50UHJvcGVydHkgcHJvcCA9IFRuZ1V0aWwuZ2V0UHVibGlzaENhdGVnb3J5UHJvcGVydHkobWV0aG9kRWxlbWVudCk7Ci0JCQkJCQkJCQkJCi0JCQkJCWlmIChwcm9wID09IG51bGwpIHsJCQkKLQkJCQkJCXByb3AgPSBVbWFGYWN0b3J5LmVJTlNUQU5DRQotCQkJCQkJCS5jcmVhdGVNZXRob2RFbGVtZW50UHJvcGVydHkoKTsKLQkJCQkJCXByb3Auc2V0TmFtZShUbmdVdGlsLlBVQkxJU0hfQ0FURUdPUllfUFJPUEVSVFkpOwotCQkJCQkJcHJvcC5zZXRWYWx1ZSh2YWwpOwotCQkJCQkJCQkKLQkJCQkJCWFjdGlvbk1ncgotCQkJCQkJLmRvQWN0aW9uKAotCQkJCQkJCQlJQWN0aW9uTWFuYWdlci5BREQsCi0JCQkJCQkJCW1ldGhvZEVsZW1lbnQsCi0JCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJLmdldE1ldGhvZEVsZW1lbnRfTWV0aG9kRWxlbWVudFByb3BlcnR5KCksCi0JCQkJCQkJCXByb3AsIC0xKTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5TRVQsCi0JCQkJCQkJcHJvcCwKLQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJLmdldE1ldGhvZEVsZW1lbnRQcm9wZXJ0eV9WYWx1ZSgpLAotCQkJCQkJCXZhbCwgLTEpOwotCQkJCQl9Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQkJCi0JCWlmIChleHRlcm5hbElkT24pIHsKLQkJCWN0cmxfZXh0ZXJuYWxfaWQuYWRkTW9kaWZ5TGlzdGVuZXIoY29udGVudE1vZGlmeUxpc3RlbmVyKTsKLQkJCWN0cmxfZXh0ZXJuYWxfaWQuYWRkRm9jdXNMaXN0ZW5lcihuZXcgRm9jdXNBZGFwdGVyKCkgewotCQkJCXB1YmxpYyB2b2lkIGZvY3VzR2FpbmVkKEZvY3VzRXZlbnQgZSkgewotCQkJCQkoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpKQotCQkJCQkJCS5zZXRDdXJyZW50RmVhdHVyZUVkaXRvcihlLndpZGdldCwKLQkJCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJCS5nZXRDb250ZW50RGVzY3JpcHRpb25fRXh0ZXJuYWxJZCgpKTsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgdm9pZCBmb2N1c0xvc3QoRm9jdXNFdmVudCBlKSB7Ci0JCQkJCVN0cmluZyBvbGRDb250ZW50ID0gIGNvbnRlbnRFbGVtZW50LmdldFByZXNlbnRhdGlvbigpLmdldEV4dGVybmFsSWQoKTsKLQkJCQkJaWYgKCgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpLm11c3RSZXN0b3JlVmFsdWUoCi0JCQkJCQkJY3RybF9leHRlcm5hbF9pZCwgb2xkQ29udGVudCkpIHsKLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCQlTdHJpbmcgbmV3Q29udGVudCA9IGN0cmxfZXh0ZXJuYWxfaWQuZ2V0VGV4dCgpOwotCQkJCQlpZiAoIW5ld0NvbnRlbnQuZXF1YWxzKG9sZENvbnRlbnQpKSB7Ci0JCQkJCQlib29sZWFuIHN1Y2Nlc3MgPSBhY3Rpb25NZ3IuZG9BY3Rpb24oCi0JCQkJCQkJCUlBY3Rpb25NYW5hZ2VyLlNFVCwgY29udGVudEVsZW1lbnQKLQkJCQkJCQkJCQkuZ2V0UHJlc2VudGF0aW9uKCksCi0JCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJLmdldENvbnRlbnREZXNjcmlwdGlvbl9FeHRlcm5hbElkKCksCi0JCQkJCQkJCW5ld0NvbnRlbnQsIC0xKTsKLQkJCQkJCWlmIChzdWNjZXNzICYmIGlzVmVyc2lvblNlY3Rpb25PbigpKSB7Ci0JCQkJCQkJdXBkYXRlQ2hhbmdlRGF0ZSgpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgSVZhbGlkYXRvciBnZXROYW1lVmFsaWRhdG9yKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkRGV0YWlsU2VjdGlvbkxpc3RlbmVycygpIHsKLQkJaWYgKGZ1bGxEZXNjT24pIHsKLQkJCWN0cmxfZnVsbF9kZXNjLnNldE1vZGFsT2JqZWN0KGNvbnRlbnRFbGVtZW50LmdldFByZXNlbnRhdGlvbigpKTsKLQkJCWN0cmxfZnVsbF9kZXNjLnNldE1vZGFsT2JqZWN0RmVhdHVyZShVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkuZ2V0Q29udGVudERlc2NyaXB0aW9uX01haW5EZXNjcmlwdGlvbigpKTsKLQkJCWN0cmxfZnVsbF9kZXNjLmFkZE1vZGlmeUxpc3RlbmVyKGNvbnRlbnRNb2RpZnlMaXN0ZW5lcik7Ci0JCQljdHJsX2Z1bGxfZGVzYy5hZGRMaXN0ZW5lcihTV1QuRGVhY3RpdmF0ZSwgbmV3IExpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQkJSU1ldGhvZFJpY2hUZXh0IGNvbnRyb2wgPSBkZXNjRXhwYW5kRmxhZyA/IGN0cmxfZXhwYW5kZWQKLQkJCQkJCQk6IGN0cmxfZnVsbF9kZXNjOwotCQkJCQlpZiAoZGVidWcpIHsKLQkJCQkJCVN5c3RlbS5vdXQKLQkJCQkJCQkJLnByaW50bG4oIkRlc2NyaXB0aW9uRm9ybVBhZ2UuY3RybF9mdWxsX2Rlc2MuZGVhY3RpdmF0ZUxpc3RlbmVyOiBjb250cm9sPSIgKyBjb250cm9sKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJCWlmICghY29udHJvbC5nZXRNb2RpZmllZCgpKSB7Ci0JCQkJCQlpZiAoZGVidWcpIHsKLQkJCQkJCQlTeXN0ZW0ub3V0Ci0JCQkJCQkJCQkucHJpbnRsbigiRGVzY3JpcHRpb25Gb3JtUGFnZS5jdHJsX2Z1bGxfZGVzYy5kZWFjdGl2YXRlTGlzdGVuZXI6IGNvbnRlbnQgbm90IG1vZGlmaWVkLCBleGl0Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCX0KLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCQlTdHJpbmcgb2xkQ29udGVudCA9IGNvbnRlbnRFbGVtZW50LmdldFByZXNlbnRhdGlvbigpCi0JCQkJCQkJLmdldE1haW5EZXNjcmlwdGlvbigpOwotCQkJCQlpZiAoKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkubXVzdFJlc3RvcmVWYWx1ZSgKLQkJCQkJCQljb250cm9sLCBvbGRDb250ZW50KSkgewotCQkJCQkJaWYgKGRlYnVnKSB7Ci0JCQkJCQkJU3lzdGVtLm91dAotCQkJCQkJCQkJLnByaW50bG4oIkRlc2NyaXB0aW9uRm9ybVBhZ2UuY3RybF9mdWxsX2Rlc2MuZGVhY3RpdmF0ZUxpc3RlbmVyOiByZXN0b3JlZCBvbGQgY29udGVudCwgZXhpdCIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQl9Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCX0KLQkJCQkJU3RyaW5nIG5ld0NvbnRlbnQgPSBjb250cm9sLmdldFRleHQoKTsKLQkJCQkJaWYgKCFuZXdDb250ZW50LmVxdWFscyhvbGRDb250ZW50KSkgewotCQkJCQkJaWYgKGRlYnVnKSB7Ci0JCQkJCQkJU3lzdGVtLm91dAotCQkJCQkJCQkJLnByaW50bG4oIkRlc2NyaXB0aW9uRm9ybVBhZ2UuY3RybF9mdWxsX2Rlc2MuZGVhY3RpdmF0ZUxpc3RlbmVyOiBzYXZpbmcgbW9kaWZpZWQgY29udGVudCIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQl9Ci0JCQkJCQlib29sZWFuIHN1Y2Nlc3MgPSBhY3Rpb25NZ3IKLQkJCQkJCQkJLmRvQWN0aW9uKAotCQkJCQkJCQkJCUlBY3Rpb25NYW5hZ2VyLlNFVCwKLQkJCQkJCQkJCQljb250ZW50RWxlbWVudC5nZXRQcmVzZW50YXRpb24oKSwKLQkJCQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJCQkJLmdldENvbnRlbnREZXNjcmlwdGlvbl9NYWluRGVzY3JpcHRpb24oKSwKLQkJCQkJCQkJCQluZXdDb250ZW50LCAtMSk7Ci0JCQkJCQlpZiAoZGVidWcpIHsKLQkJCQkJCQlTeXN0ZW0ub3V0Ci0JCQkJCQkJCQkucHJpbnRsbigiRGVzY3JpcHRpb25Gb3JtUGFnZS5jdHJsX2Z1bGxfZGVzYy5kZWFjdGl2YXRlTGlzdGVuZXI6IHNhdmVkIHN0YXR1cz0iICsgc3VjY2Vzcyk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCX0KLQkJCQkJCWlmIChzdWNjZXNzICYmIGlzVmVyc2lvblNlY3Rpb25PbigpKSB7Ci0JCQkJCQkJdXBkYXRlQ2hhbmdlRGF0ZSgpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWlmIChkZWJ1ZykgewotCQkJCQkJU3lzdGVtLm91dAotCQkJCQkJCQkucHJpbnRsbigiRGVzY3JpcHRpb25Gb3JtUGFnZS5jdHJsX2Z1bGxfZGVzYy5kZWFjdGl2YXRlTGlzdGVuZXI6IGV4aXQiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQotCQlpZiAoa2V5Q29uc2lkZXJhdGlvbk9uKSB7Ci0JCQljdHJsX2tleS5zZXRNb2RhbE9iamVjdChjb250ZW50RWxlbWVudC5nZXRQcmVzZW50YXRpb24oKSk7Ci0JCQljdHJsX2tleS5zZXRNb2RhbE9iamVjdEZlYXR1cmUoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJLmdldENvbnRlbnREZXNjcmlwdGlvbl9LZXlDb25zaWRlcmF0aW9ucygpKTsKLQkJCWN0cmxfa2V5LmFkZE1vZGlmeUxpc3RlbmVyKGNvbnRlbnRNb2RpZnlMaXN0ZW5lcik7Ci0JCQljdHJsX2tleS5hZGRMaXN0ZW5lcihTV1QuRGVhY3RpdmF0ZSwgbmV3IExpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQkJSU1ldGhvZFJpY2hUZXh0IGNvbnRyb2wgPSBkZXNjRXhwYW5kRmxhZyA/IGN0cmxfZXhwYW5kZWQKLQkJCQkJCQk6IGN0cmxfa2V5OwotCQkJCQlpZiAoZGVidWcpIHsKLQkJCQkJCVN5c3RlbS5vdXQKLQkJCQkJCQkJLnByaW50bG4oIkRlc2NyaXB0aW9uRm9ybVBhZ2UuY3RybF9rZXkuZGVhY3RpdmF0ZUxpc3RlbmVyOiBjb250cm9sPSIgKyBjb250cm9sKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJCWlmICghY29udHJvbC5nZXRNb2RpZmllZCgpKSB7Ci0JCQkJCQlpZiAoZGVidWcpIHsKLQkJCQkJCQlTeXN0ZW0ub3V0Ci0JCQkJCQkJCQkucHJpbnRsbigiRGVzY3JpcHRpb25Gb3JtUGFnZS5jdHJsX2tleS5kZWFjdGl2YXRlTGlzdGVuZXI6IGNvbnRlbnQgbm90IG1vZGlmaWVkLCBleGl0Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCX0KLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCQlTdHJpbmcgb2xkQ29udGVudCA9IGNvbnRlbnRFbGVtZW50LmdldFByZXNlbnRhdGlvbigpCi0JCQkJCQkJLmdldEtleUNvbnNpZGVyYXRpb25zKCk7Ci0JCQkJCWlmICgoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpKS5tdXN0UmVzdG9yZVZhbHVlKAotCQkJCQkJCWNvbnRyb2wsIG9sZENvbnRlbnQpKSB7Ci0JCQkJCQlpZiAoZGVidWcpIHsKLQkJCQkJCQlTeXN0ZW0ub3V0Ci0JCQkJCQkJCQkucHJpbnRsbigiRGVzY3JpcHRpb25Gb3JtUGFnZS5jdHJsX2tleS5kZWFjdGl2YXRlTGlzdGVuZXI6IHJlc3RvcmVkIG9sZCBjb250ZW50LCBleGl0Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCX0KLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCQlTdHJpbmcgbmV3Q29udGVudCA9IGNvbnRyb2wuZ2V0VGV4dCgpOwotCQkJCQlpZiAoIW5ld0NvbnRlbnQuZXF1YWxzKG9sZENvbnRlbnQpKSB7Ci0JCQkJCQlib29sZWFuIHN1Y2Nlc3MgPSBhY3Rpb25NZ3IKLQkJCQkJCQkJLmRvQWN0aW9uKAotCQkJCQkJCQkJCUlBY3Rpb25NYW5hZ2VyLlNFVCwKLQkJCQkJCQkJCQljb250ZW50RWxlbWVudC5nZXRQcmVzZW50YXRpb24oKSwKLQkJCQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJCQkJLmdldENvbnRlbnREZXNjcmlwdGlvbl9LZXlDb25zaWRlcmF0aW9ucygpLAotCQkJCQkJCQkJCW5ld0NvbnRlbnQsIC0xKTsKLQkJCQkJCWlmIChkZWJ1ZykgewotCQkJCQkJCVN5c3RlbS5vdXQKLQkJCQkJCQkJCS5wcmludGxuKCJEZXNjcmlwdGlvbkZvcm1QYWdlLmN0cmxfa2V5LmRlYWN0aXZhdGVMaXN0ZW5lcjogc2F2ZWQgc3RhdHVzPSIgKyBzdWNjZXNzKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJfQotCQkJCQkJaWYgKHN1Y2Nlc3MgJiYgaXNWZXJzaW9uU2VjdGlvbk9uKCkpIHsKLQkJCQkJCQl1cGRhdGVDaGFuZ2VEYXRlKCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJaWYgKGRlYnVnKSB7Ci0JCQkJCQlTeXN0ZW0ub3V0Ci0JCQkJCQkJCS5wcmludGxuKCJEZXNjcmlwdGlvbkZvcm1QYWdlLmN0cmxfa2V5LmRlYWN0aXZhdGVMaXN0ZW5lcjogZXhpdCIpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQl9Ci0JCQl9KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemVzIHRoZSBjb250cm9scyB3aXRoIGRhdGEgZnJvbSB0aGUgbW9kZWwuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgbG9hZERhdGEoKSB7Ci0JCWlmIChnZW5lcmFsU2VjdGlvbk9uKSB7Ci0JCQlsb2FkR2VuZXJhbFNlY3Rpb25EYXRhKCk7Ci0JCX0KLQkJaWYgKGRldGFpbFNlY3Rpb25PbikgewotCQkJbG9hZERldGFpbFNlY3Rpb25EYXRhKCk7Ci0JCX0KLQkJaWYgKG5vdGF0aW9uU2VjdGlvbk9uKSB7Ci0JCQlsb2FkTm90YXRpb25TZWN0aW9uRGF0YSgpOwotCQl9Ci0JCWlmICh0YWlsb3JpbmdTZWN0aW9uT24pIHsKLQkJCWxvYWRUYWlsb3JpbmdTZWN0aW9uRGF0YSgpOwotCQl9Ci0JCWlmICh2ZXJzaW9uU2VjdGlvbk9uKSB7Ci0JCQlsb2FkVmVyc2lvblNlY3Rpb25EYXRhKCk7Ci0JCX0KLQkJaWYgKGljb25TZWN0aW9uT24pIHsKLQkJCWxvYWRJY29uU2VjdGlvbkRhdGEoKTsKLQkJfQotCQlpZiAodmFyaWFiaWxpdHlTZWN0aW9uT24pIHsKLQkJCXZhcmlhYmlsaXR5U2VjdGlvbkRhdGEoKTsKLQkJfQotCQlmb3JtLmdldEJvZHkoKS5sYXlvdXQodHJ1ZSwgdHJ1ZSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgbG9hZEdlbmVyYWxTZWN0aW9uRGF0YSgpIHsKLQkJU3RyaW5nIG5hbWUgPSBtZXRob2RFbGVtZW50LmdldE5hbWUoKTsKLQkJU3RyaW5nIHByZXNlbnRhdGlvbk5hbWUgPSAobWV0aG9kRWxlbWVudCkuZ2V0UHJlc2VudGF0aW9uTmFtZSgpOwotCQljdHJsX25hbWUuc2V0VGV4dChuYW1lID09IG51bGwgPyAiIiA6IG5hbWUpOyAvLyROT04tTkxTLTEkCi0JCWN0cmxfcHJlc2VudGF0aW9uX25hbWUKLQkJCQkuc2V0VGV4dChwcmVzZW50YXRpb25OYW1lID09IG51bGwgPyAiIiA6IHByZXNlbnRhdGlvbk5hbWUpOyAvLyROT04tTkxTLTEkCi0KLQkJaWYgKGxvbmdQcmVzZW50YXRpb25OYW1lT24gJiYgQXV0aG9yaW5nVUlQcmVmZXJlbmNlcy5nZXRTaG93TG9uZ1ByZXNlbnRhdGlvbk5hbWUoKSkgewotCQkJU3RyaW5nIGxvbmdQcmVzZW50TmFtZSA9IGNvbnRlbnRFbGVtZW50LmdldFByZXNlbnRhdGlvbigpLmdldExvbmdQcmVzZW50YXRpb25OYW1lKCk7Ci0JCQljdHJsX2xvbmdfcHJlc2VudGF0aW9uX25hbWUuc2V0VGV4dChsb25nUHJlc2VudE5hbWUgPT0gbnVsbCA/ICIiIDogbG9uZ1ByZXNlbnROYW1lKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWlmIChlbGVtZW50VHlwZU9uKSB7Ci0JCQkvLyBTdHJpbmcgdHlwZSA9IG1ldGhvZEVsZW1lbnQuZ2V0VHlwZSgpLmdldE5hbWUoKTsKLQkJCVN0cmluZyB0eXBlID0gTGlicmFyeVVJVGV4dC5nZXRVSVRleHQobWV0aG9kRWxlbWVudCk7Ci0JCQljdHJsX3R5cGVfbGFiZWwuc2V0VGV4dCh0eXBlID09IG51bGwgPyAiIiA6IHR5cGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJaWYgKGJyaWVmRGVzY09uKSB7Ci0JCQlTdHJpbmcgYnJpZWZfZGVzYyA9IG1ldGhvZEVsZW1lbnQuZ2V0QnJpZWZEZXNjcmlwdGlvbigpOwotCQkJY3RybF9icmllZl9kZXNjLnNldFRleHQoYnJpZWZfZGVzYyA9PSBudWxsID8gIiIgOiBicmllZl9kZXNjKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCQotCQlpZiAoZXh0ZXJuYWxJZE9uKSB7Ci0JCQlpZiAoY29udGVudEVsZW1lbnQgIT0gbnVsbCkgewotCQkJCVN0cmluZyBleHRlcm5hbF9pZCA9IGNvbnRlbnRFbGVtZW50LmdldFByZXNlbnRhdGlvbigpLmdldEV4dGVybmFsSWQoKTsKLQkJCQljdHJsX2V4dGVybmFsX2lkLnNldFRleHQoZXh0ZXJuYWxfaWQgPT0gbnVsbCA/ICIiIDogZXh0ZXJuYWxfaWQpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQkJCi0JCWlmIChwdWJsaXNoQ2F0ZWdvcnlPbikgewotCQkJTWV0aG9kRWxlbWVudFByb3BlcnR5IHByb3AgPSBUbmdVdGlsLmdldFB1Ymxpc2hDYXRlZ29yeVByb3BlcnR5KG1ldGhvZEVsZW1lbnQpOwotCQkJaWYgKHByb3AgIT0gbnVsbCkgewotCQkJCVN0cmluZyB2YWwgPSBwcm9wLmdldFZhbHVlKCk7Ci0JCQkJY3RybF9wdWJsaXNoX2NhdGVnb3JpZXNfYnV0dG9uLnNldFNlbGVjdGlvbigobmV3IEJvb2xlYW4odmFsKSkuYm9vbGVhblZhbHVlKCkpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGxvYWREZXRhaWxTZWN0aW9uRGF0YSgpIHsKLQkJaWYgKGZ1bGxEZXNjT24pIHsKLQkJCVN0cmluZyBmdWxsX2Rlc2MgPSAoY29udGVudEVsZW1lbnQuZ2V0UHJlc2VudGF0aW9uKCkpCi0JCQkJCS5nZXRNYWluRGVzY3JpcHRpb24oKTsKLQkJCWN0cmxfZnVsbF9kZXNjLnNldFRleHQoZnVsbF9kZXNjID09IG51bGwgPyAiIiA6IGZ1bGxfZGVzYyk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlpZiAoa2V5Q29uc2lkZXJhdGlvbk9uKSB7Ci0JCQlTdHJpbmcga2V5Q29uc2lkZXJhdGlvbnMgPSAoY29udGVudEVsZW1lbnQuZ2V0UHJlc2VudGF0aW9uKCkpCi0JCQkJCS5nZXRLZXlDb25zaWRlcmF0aW9ucygpOwotCQkJY3RybF9rZXkKLQkJCQkJLnNldFRleHQoa2V5Q29uc2lkZXJhdGlvbnMgPT0gbnVsbCA/ICIiIDoga2V5Q29uc2lkZXJhdGlvbnMpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0JCi0JCi0KLQlwcml2YXRlIHZvaWQgbG9hZFRhaWxvcmluZ1NlY3Rpb25EYXRhKCkgewotCX0KLQotCXByaXZhdGUgdm9pZCBsb2FkTm90YXRpb25TZWN0aW9uRGF0YSgpIHsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmFyaWFiaWxpdHlTZWN0aW9uRGF0YSgpIHsKLQkJVmFyaWFiaWxpdHlUeXBlIHZhcmlhYmlsaXR5VHlwZSA9IGNvbnRlbnRFbGVtZW50LmdldFZhcmlhYmlsaXR5VHlwZSgpOwotCQlMaXN0IHNlbGVjdGlvblZhcmlhYmlsaXR5TGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJc2VsZWN0aW9uVmFyaWFiaWxpdHlMaXN0LmFkZCh2YXJpYWJpbGl0eVR5cGUpOwotCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBuZXdWYXJpYWJpbGl0eVNlbGVjdGlvbiA9IG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKAotCQkJCXNlbGVjdGlvblZhcmlhYmlsaXR5TGlzdCk7Ci0JCXZpZXdlcl92YXJpYWJpbGl0eS5zZXRTZWxlY3Rpb24obmV3VmFyaWFiaWxpdHlTZWxlY3Rpb24sIHRydWUpOwotCX0KLQotCS8qKgotCSAqIFRvZ2dsZSBEZXNjcmlwdGlvbiBjb250cm9sIHRvIGV4cGFuZCBhbmQgY29udHJvbCBzdGF0ZS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB0b2dnbGUoSHlwZXJsaW5rRXZlbnQgZSkgewotCQlpZiAoY3RybF9leHBhbmRlZCA9PSBudWxsKSB7Ci0JCQljdHJsX2V4cGFuZGVkID0gY3JlYXRlUmljaFRleHRFZGl0b3IodG9vbGtpdCwgZXhwYW5kZWRDb21wb3NpdGUsCi0JCQkJCVNXVC5NVUxUSSB8IFNXVC5XUkFQIHwgU1dULlZfU0NST0xMLCBHcmlkRGF0YS5GSUxMX0JPVEgsCi0JCQkJCWdldFJpY2hUZXh0RWRpdG9ySGVpZ2h0KCksIGdldFJpY2hUZXh0RWRpdG9yV2lkdGgoKSwgMiwKLQkJCQkJZXhwYW5kTGFiZWwpOwotCQkJY3RybF9leHBhbmRlZC5hZGRNb2RpZnlMaXN0ZW5lcihjb250ZW50TW9kaWZ5TGlzdGVuZXIpOwotCQl9Ci0KLQkJaWYgKGRlc2NFeHBhbmRGbGFnKSB7Ci0JCQlleHBhbmRlZENvbXBvc2l0ZS5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJCW1haW5Db21wb3NpdGUuc2V0VmlzaWJsZSh0cnVlKTsKLQkJCWZvcm1TZWN0aW9uLnNldENsaWVudChtYWluQ29tcG9zaXRlKTsKLQkJCWVuYWJsZVNlY3Rpb25zKHRydWUpOwotCQkJSU1ldGhvZFJpY2hUZXh0IHJpY2hUZXh0ID0gZ2V0QWN0aXZlUmljaFRleHRDb250cm9sKCk7Ci0JCQlyaWNoVGV4dC5zZXRUZXh0KGN0cmxfZXhwYW5kZWQuZ2V0VGV4dCgpKTsKLQkJCXJpY2hUZXh0LnNldEZpbmRSZXBsYWNlQWN0aW9uKGN0cmxfZXhwYW5kZWQuZ2V0RmluZFJlcGxhY2VBY3Rpb24oKSk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGkgPSByaWNoVGV4dC5nZXRMaXN0ZW5lcnMoKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQkJUmljaFRleHRMaXN0ZW5lciBsaXN0ZW5lciA9IChSaWNoVGV4dExpc3RlbmVyKSBpLm5leHQoKTsKLQkJCQljdHJsX2V4cGFuZGVkLnJlbW92ZUxpc3RlbmVyKGxpc3RlbmVyLmdldEV2ZW50VHlwZSgpLCBsaXN0ZW5lcgotCQkJCQkJLmdldExpc3RlbmVyKCkpOwotCQkJfQotCQkJaWYgKGN0cmxfZXhwYW5kZWQuZ2V0TW9kaWZpZWQoKSkgewotCQkJCSgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpCi0JCQkJCQkuc2F2ZU1vZGlmaWVkUmljaFRleHQoY3RybF9leHBhbmRlZCk7Ci0JCQl9Ci0JCQlyaWNoVGV4dC5zZXRGb2N1cygpOwotCQkJSUVkaXRvcklucHV0IGlucHV0ID0gZ2V0RWRpdG9ySW5wdXQoKTsKLQkJCWlmIChpbnB1dCBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnRFZGl0b3JJbnB1dCkgewotCQkJCSgoTWV0aG9kRWxlbWVudEVkaXRvcklucHV0KWlucHV0KS5zZXRNb2RhbE9iamVjdChudWxsKTsKLQkJCQkoKE1ldGhvZEVsZW1lbnRFZGl0b3JJbnB1dClpbnB1dCkuc2V0TW9kYWxPYmplY3RGZWF0dXJlKG51bGwpOwotCQkJfQotCi0JCX0gZWxzZSB7Ci0JCQltYWluQ29tcG9zaXRlLnNldFZpc2libGUoZmFsc2UpOwotCQkJZXhwYW5kZWRDb21wb3NpdGUuc2V0VmlzaWJsZSh0cnVlKTsKLQkJCWZvcm1TZWN0aW9uLnNldENsaWVudChleHBhbmRlZENvbXBvc2l0ZSk7Ci0JCQllbmFibGVTZWN0aW9ucyhmYWxzZSk7Ci0JCQlleHBhbmRMYWJlbC5zZXRUZXh0KChTdHJpbmcpICgoSW1hZ2VIeXBlcmxpbmspIGUuZ2V0U291cmNlKCkpCi0JCQkJCS5nZXREYXRhKCJUaXRsZSIpKTsgLy8kTk9OLU5MUy0xJAotCQkJSU1ldGhvZFJpY2hUZXh0IHJpY2hUZXh0ID0gKElNZXRob2RSaWNoVGV4dCkgZS5nZXRIcmVmKCk7Ci0JCQljdHJsX2V4cGFuZGVkLnNldEluaXRpYWxUZXh0KHJpY2hUZXh0LmdldFRleHQoKSk7Ci0JCQljdHJsX2V4cGFuZGVkLnNldE1vZGFsT2JqZWN0KHJpY2hUZXh0LmdldE1vZGFsT2JqZWN0KCkpOwotCQkJY3RybF9leHBhbmRlZC5zZXRNb2RhbE9iamVjdEZlYXR1cmUocmljaFRleHQKLQkJCQkJLmdldE1vZGFsT2JqZWN0RmVhdHVyZSgpKTsKLQkJCWN0cmxfZXhwYW5kZWQuc2V0RmluZFJlcGxhY2VBY3Rpb24ocmljaFRleHQuZ2V0RmluZFJlcGxhY2VBY3Rpb24oKSk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGkgPSByaWNoVGV4dC5nZXRMaXN0ZW5lcnMoKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQkJUmljaFRleHRMaXN0ZW5lciBsaXN0ZW5lciA9IChSaWNoVGV4dExpc3RlbmVyKSBpLm5leHQoKTsKLQkJCQljdHJsX2V4cGFuZGVkLmFkZExpc3RlbmVyKGxpc3RlbmVyLmdldEV2ZW50VHlwZSgpLCBsaXN0ZW5lcgotCQkJCQkJLmdldExpc3RlbmVyKCkpOwotCQkJfQotCQkJYm9vbGVhbiBlZGl0YWJsZSA9ICFUbmdVdGlsLmlzTG9ja2VkKG1ldGhvZEVsZW1lbnQpOwotCQkJY3RybF9leHBhbmRlZC5zZXRFZGl0YWJsZShlZGl0YWJsZSk7Ci0JCQlpZiAoZWRpdGFibGUpIHsKLQkJCQljdHJsX2V4cGFuZGVkLnNldEZvY3VzKCk7Ci0JCQl9Ci0JCQlzZXRBY3RpdmVSaWNoVGV4dENvbnRyb2wocmljaFRleHQpOwotCQkJSUVkaXRvcklucHV0IGlucHV0ID0gZ2V0RWRpdG9ySW5wdXQoKTsKLQkJCWlmIChpbnB1dCBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnRFZGl0b3JJbnB1dCkgewotCQkJCSgoTWV0aG9kRWxlbWVudEVkaXRvcklucHV0KWlucHV0KS5zZXRNb2RhbE9iamVjdChyaWNoVGV4dC5nZXRNb2RhbE9iamVjdCgpKTsKLQkJCQkoKE1ldGhvZEVsZW1lbnRFZGl0b3JJbnB1dClpbnB1dCkuc2V0TW9kYWxPYmplY3RGZWF0dXJlKHJpY2hUZXh0LmdldE1vZGFsT2JqZWN0RmVhdHVyZSgpKTsKLQkJCX0KLQkJfQotCQlmb3JtLmdldEJvZHkoKS5sYXlvdXQodHJ1ZSwgdHJ1ZSk7Ci0JCWRlc2NFeHBhbmRGbGFnID0gIWRlc2NFeHBhbmRGbGFnOwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgYWN0aXZlIHJpY2ggdGV4dCBjb250cm9sLgotCSAqLwotCXByaXZhdGUgdm9pZCBzZXRBY3RpdmVSaWNoVGV4dENvbnRyb2woSU1ldGhvZFJpY2hUZXh0IGN0cmwpIHsKLQkJYWN0aXZlQ29udHJvbCA9IGN0cmw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgYWN0aXZlIHJpY2ggdGV4dCBjb250cm9sLgotCSAqLwotCXByaXZhdGUgSU1ldGhvZFJpY2hUZXh0IGdldEFjdGl2ZVJpY2hUZXh0Q29udHJvbCgpIHsKLQkJcmV0dXJuIGFjdGl2ZUNvbnRyb2w7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0QnJpZWZEZXNjT24oYm9vbGVhbiBicmllZkRlc2NPbikgewotCQl0aGlzLmJyaWVmRGVzY09uID0gYnJpZWZEZXNjT247Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldEV4dGVybmFsSURPbihib29sZWFuIGV4dGVyYW5sSURPbikgewotCQl0aGlzLmV4dGVybmFsSWRPbiA9IGV4dGVyYW5sSURPbjsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0TG9uZ1ByZXNlbnRhdGlvbk5hbWVPbihib29sZWFuIGxvbmdQcmVzZW50YXRpb25OYW1lT24pIHsKLQkJdGhpcy5sb25nUHJlc2VudGF0aW9uTmFtZU9uID0gbG9uZ1ByZXNlbnRhdGlvbk5hbWVPbjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRGdWxsRGVzY09uKGJvb2xlYW4gZnVsbERlc2NPbikgewotCQl0aGlzLmZ1bGxEZXNjT24gPSBmdWxsRGVzY09uOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEtleUNvbnNpZGVyYXRpb25Pbihib29sZWFuIGtleUNvbnNpZGVyYXRpb25PbikgewotCQl0aGlzLmtleUNvbnNpZGVyYXRpb25PbiA9IGtleUNvbnNpZGVyYXRpb25PbjsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZWxlbWVudFR5cGVPbgotCSAqICAgICAgICAgICAgVGhlIGVsZW1lbnRUeXBlT24gdG8gc2V0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVsZW1lbnRUeXBlT24oYm9vbGVhbiBlbGVtZW50VHlwZU9uKSB7Ci0JCXRoaXMuZWxlbWVudFR5cGVPbiA9IGVsZW1lbnRUeXBlT247Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBhbnlBdHRyaWJ1dGVNb2RpZmllZC4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0FueUF0dHJpYnV0ZU1vZGlmaWVkKCkgewotCQlyZXR1cm4gYW55QXR0cmlidXRlTW9kaWZpZWQ7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoaXMgaWYgYW55IGF0dHJpYnV0ZSBpcyBtb2RpZmllZC4gVGhpcyBpcyByZXF1aXJlZCBmb3IgdGhlIGNoYW5nZQotCSAqIGRhdGUgZmllbGQgaW4gdmVyc2lvbiBzZWN0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBhbnlBdHRyaWJ1dGVNb2RpZmllZAotCSAqICAgICAgICAgICAgVGhlIGFueUF0dHJpYnV0ZU1vZGlmaWVkIHRvIHNldC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBbnlBdHRyaWJ1dGVNb2RpZmllZChib29sZWFuIGFueUF0dHJpYnV0ZU1vZGlmaWVkKSB7Ci0JCXRoaXMuYW55QXR0cmlidXRlTW9kaWZpZWQgPSBhbnlBdHRyaWJ1dGVNb2RpZmllZDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIHZlcnNpb25TZWN0aW9uT24uCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNWZXJzaW9uU2VjdGlvbk9uKCkgewotCQlyZXR1cm4gdmVyc2lvblNlY3Rpb25PbjsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gdmVyc2lvblNlY3Rpb25PbgotCSAqICAgICAgICAgICAgVGhlIHZlcnNpb25TZWN0aW9uT24gdG8gc2V0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZlcnNpb25TZWN0aW9uT24oYm9vbGVhbiB2ZXJzaW9uU2VjdGlvbk9uKSB7Ci0JCXRoaXMudmVyc2lvblNlY3Rpb25PbiA9IHZlcnNpb25TZWN0aW9uT247Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgVmVyc2lvbiBJbmZvcm1hdGlvbiBzZWN0aW9uLgotCSAqLwotCXByaXZhdGUgdm9pZCBjcmVhdGVWZXJzaW9uU2VjdGlvbihGb3JtVG9vbGtpdCB0b29sa2l0KSB7Ci0JCXZlcnNpb25TZWN0aW9uID0gdG9vbGtpdC5jcmVhdGVTZWN0aW9uKHNlY3Rpb25Db21wb3NpdGUsCi0JCQkJU2VjdGlvbi5ERVNDUklQVElPTiB8IFNlY3Rpb24uVFdJU1RJRSB8IFNlY3Rpb24uRVhQQU5ERUQKLQkJCQkJCXwgU2VjdGlvbi5USVRMRV9CQVIpOwotCQlHcmlkRGF0YSB0ZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQl2ZXJzaW9uU2VjdGlvbi5zZXRMYXlvdXREYXRhKHRkKTsKLQkJdmVyc2lvblNlY3Rpb24uc2V0VGV4dChBdXRob3JpbmdVSVRleHQuVkVSU0lPTl9JTkZPX1NFQ1RJT05fTkFNRSk7Ci0JCXZlcnNpb25TZWN0aW9uLnNldERlc2NyaXB0aW9uKGdldFZlcnNpb25TZWN0aW9uRGVzY3JpcHRpb24oKSk7Ci0JCXZlcnNpb25TZWN0aW9uLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQotCQl2ZXJzaW9uQ29tcG9zaXRlID0gdG9vbGtpdC5jcmVhdGVDb21wb3NpdGUodmVyc2lvblNlY3Rpb24pOwotCQl2ZXJzaW9uQ29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQl2ZXJzaW9uQ29tcG9zaXRlLnNldExheW91dChuZXcgR3JpZExheW91dCg1LCBmYWxzZSkpOwotCQl2ZXJzaW9uU2VjdGlvbi5zZXRDbGllbnQodmVyc2lvbkNvbXBvc2l0ZSk7Ci0JfQotCQotCQotCi0JLyoqCi0JICogQ3JlYXRlIHRoZSBWZXJzaW9uIHNlY3Rpb24gY29udGVudC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVWZXJzaW9uU2VjdGlvbkNvbnRlbnQoKSB7Ci0JCVN0cmluZyBmaWxsVGV4dCA9IChtZXRob2RVbml0LmdldFZlcnNpb24oKSA9PSBudWxsID8gIiIgOiBtZXRob2RVbml0LmdldFZlcnNpb24oKSk7IC8vJE5PTi1OTFMtMSQKLQkJY3RybF92ZXJzaW9uID0gY3JlYXRlVGV4dEVkaXRXaXRoTGFiZWw0KHRvb2xraXQsIHZlcnNpb25Db21wb3NpdGUsCi0JCQkJQXV0aG9yaW5nVUlUZXh0LlZFUlNJT05fVEVYVCwgU1dULkRFRkFVTFQsIFNXVC5TSU5HTEUsIGZpbGxUZXh0KTsKLQotCQlmaWxsVGV4dCA9IG1ldGhvZFVuaXQuZ2V0Q2hhbmdlRGF0ZSgpID09IG51bGwgPyAiIiAvLyROT04tTkxTLTEkCi0JCQkJOiBEYXRlRm9ybWF0LmdldERhdGVJbnN0YW5jZShEYXRlRm9ybWF0LkZVTEwpLmZvcm1hdCgKLQkJCQkJCW1ldGhvZFVuaXQuZ2V0Q2hhbmdlRGF0ZSgpKTsKLQkJY3RybF9jaGFuZ2VfZGF0ZSA9IGNyZWF0ZVRleHRFZGl0V2l0aExhYmVsNCh0b29sa2l0LCB2ZXJzaW9uQ29tcG9zaXRlLAotCQkJCUF1dGhvcmluZ1VJVGV4dC5DSEFOR0VfREFURV9URVhULCBTV1QuREVGQVVMVCwgU1dULlNJTkdMRSwgZmlsbFRleHQpOwotCQljdHJsX2NoYW5nZV9kYXRlLnNldEVkaXRhYmxlKGZhbHNlKTsKLQotCQljdHJsX2NoYW5nZV9kZXNjID0gY3JlYXRlVGV4dEVkaXRXaXRoTGFiZWw1KHRvb2xraXQsIHZlcnNpb25Db21wb3NpdGUsCi0JCQkJQXV0aG9yaW5nVUlUZXh0LkNIQU5HRV9ERVNDUklQVElPTl9URVhULCA0MCwgU1dULk1VTFRJKTsKLQotCQljdHJsX2F1dGhvcnMgPSBjcmVhdGVUZXh0RWRpdFdpdGhMYWJlbDUodG9vbGtpdCwgdmVyc2lvbkNvbXBvc2l0ZSwKLQkJCQlBdXRob3JpbmdVSVRleHQuQVVUSE9SU19URVhULCA0MCwgU1dULk1VTFRJKTsKLQotCQlsYWJlbF9jb3B5cmlnaHQgPSBjcmVhdGVMYWJlbCh0b29sa2l0LCB2ZXJzaW9uQ29tcG9zaXRlLAotCQkJCUF1dGhvcmluZ1VJVGV4dC5DT1BZUklHSFRfVEVYVCwgMik7Ci0JCWN0cmxfY29weXJpZ2h0ID0gY3JlYXRlVGFibGUodG9vbGtpdCwgdmVyc2lvbkNvbXBvc2l0ZSwgU1dULlNJTkdMRQotCQkJCXwgU1dULlJFQURfT05MWSwgR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMIHwgR3JpZERhdGEuQkVHSU5OSU5HIHwgR3JpZERhdGEuRklMTF9WRVJUSUNBTCwKLQkJCQk1LCA0MDAsIDEsIDIpOwotCi0JCWNvcHlyaWdodF92aWV3ZXIgPSBuZXcgVGFibGVWaWV3ZXIoY3RybF9jb3B5cmlnaHQpOwotCQlpbml0Q29udGVudFByb3ZpZGVyQ29weXJpZ2h0KCk7Ci0JCWNvcHlyaWdodF92aWV3ZXIuc2V0TGFiZWxQcm92aWRlcihjb3B5cmlnaHRMYWJlbFByb3ZpZGVyQmFzZSk7Ci0JCWNvcHlyaWdodF92aWV3ZXIuc2V0SW5wdXQobWV0aG9kRWxlbWVudCk7Ci0JCUNvbXBvc2l0ZSBidXR0b25wYW5lID0gY3JlYXRlQ29tcG9zaXRlKHRvb2xraXQsIHZlcnNpb25Db21wb3NpdGUsCi0JCQkJR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9FTkQsIDEsIDEsIDEpOwotCQl7Ci0JCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0VORCk7Ci0JCQlidXR0b25wYW5lLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQl9Ci0JCWNvcHlyaWdodF9idXR0b24gPSB0b29sa2l0LmNyZWF0ZUJ1dHRvbihidXR0b25wYW5lLAotCQkJCUF1dGhvcmluZ1VJVGV4dC5TRUxFQ1RfQlVUVE9OX1RFWFQsIFNXVC5TSU1QTEUpOwotCQl7Ci0JCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0VORCk7Ci0JCQlncmlkRGF0YS53aWR0aEhpbnQgPSBCVVRUT05fV0lEVEg7Ci0JCQljb3B5cmlnaHRfYnV0dG9uLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQl9Ci0JCWNvcHlyaWdodF9idXR0b25fZGVzZWxlY3QgPSB0b29sa2l0LmNyZWF0ZUJ1dHRvbihidXR0b25wYW5lLAotCQkJCUF1dGhvcmluZ1VJVGV4dC5ERVNFTEVDVF9CVVRUT05fVEVYVCwgU1dULlNJTVBMRSk7Ci0JCXsKLQkJCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRU5EKTsKLQkJCWdyaWREYXRhLndpZHRoSGludCA9IEJVVFRPTl9XSURUSDsKLQkJCWNvcHlyaWdodF9idXR0b25fZGVzZWxlY3Quc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCX0KLQotCQlzZXRDb3B5cmlnaHRCdXR0b25EZXNlbGVjdCgpOwotCi0JCS8vIENyZWF0ZSB0aGUgZXhwYW5kZWQgY29tcG9zaXRlLgotCQl0b29sa2l0LnBhaW50Qm9yZGVyc0Zvcih2ZXJzaW9uQ29tcG9zaXRlKTsKLQkJLy90b29sa2l0LnBhaW50Qm9yZGVyc0ZvcihidXR0b25wYW5lKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5pdENvbnRlbnRQcm92aWRlckNvcHlyaWdodCgpIHsKLQkJY29weXJpZ2h0Q29udGVudFByb3ZpZGVyID0gbmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKAotCQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpIHsKLQkJCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCWlmIChtZXRob2RVbml0LmdldENvcHlyaWdodFN0YXRlbWVudCgpICE9IG51bGwpIHsKLQkJCQkJbGlzdC5hZGQobWV0aG9kVW5pdAotCQkJCQkJCS5nZXRDb3B5cmlnaHRTdGF0ZW1lbnQoKSk7Ci0JCQkJfQotCQkJCXJldHVybiBsaXN0LnRvQXJyYXkoKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCQl9Ci0JCX07Ci0JCWNvcHlyaWdodF92aWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKGNvcHlyaWdodENvbnRlbnRQcm92aWRlcik7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkVmVyc2lvblNlY3Rpb25MaXN0ZW5lcnMoKSB7Ci0JCWN0cmxfdmVyc2lvbi5hZGRNb2RpZnlMaXN0ZW5lcihjb250ZW50TW9kaWZ5TGlzdGVuZXIpOwotCQljdHJsX3ZlcnNpb24uYWRkRm9jdXNMaXN0ZW5lcihuZXcgRm9jdXNBZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgZm9jdXNHYWluZWQoRm9jdXNFdmVudCBlKSB7Ci0JCQkJKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkuc2V0Q3VycmVudEZlYXR1cmVFZGl0b3IoZS53aWRnZXQsCi0JCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRNZXRob2RVbml0X1ZlcnNpb24oKSk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGZvY3VzTG9zdChGb2N1c0V2ZW50IGUpIHsKLQkJCQlTdHJpbmcgb2xkQ29udGVudCA9IG1ldGhvZFVuaXQKLQkJCQkJCS5nZXRWZXJzaW9uKCk7Ci0JCQkJaWYgKCgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpLm11c3RSZXN0b3JlVmFsdWUoCi0JCQkJCQllLndpZGdldCwgb2xkQ29udGVudCkpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlTdHJpbmcgbmV3Q29udGVudCA9IFN0clV0aWwKLQkJCQkJCS5nZXRQbGFpblRleHQoY3RybF92ZXJzaW9uLmdldFRleHQoKSk7Ci0JCQkJaWYgKCFuZXdDb250ZW50LmVxdWFscyhvbGRDb250ZW50KSkgewotCQkJCQlib29sZWFuIHN0YXR1cyA9IGFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5TRVQsCi0JCQkJCQkJbWV0aG9kVW5pdCwKLQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRNZXRob2RVbml0X1ZlcnNpb24oKSwKLQkJCQkJCQluZXdDb250ZW50LCAtMSk7Ci0JCQkJCWlmIChzdGF0dXMpIHsKLQkJCQkJCXVwZGF0ZUNoYW5nZURhdGUoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJY3RybF9hdXRob3JzLmFkZE1vZGlmeUxpc3RlbmVyKGNvbnRlbnRNb2RpZnlMaXN0ZW5lcik7Ci0JCWN0cmxfYXV0aG9ycy5hZGRGb2N1c0xpc3RlbmVyKG5ldyBGb2N1c0FkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBmb2N1c0dhaW5lZChGb2N1c0V2ZW50IGUpIHsKLQkJCQkoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpKS5zZXRDdXJyZW50RmVhdHVyZUVkaXRvcihlLndpZGdldCwKLQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE1ldGhvZFVuaXRfQXV0aG9ycygpKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgZm9jdXNMb3N0KEZvY3VzRXZlbnQgZSkgewotCQkJCVN0cmluZyBvbGRDb250ZW50ID0gbWV0aG9kVW5pdAotCQkJCQkJLmdldEF1dGhvcnMoKTsKLQkJCQlpZiAoKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkubXVzdFJlc3RvcmVWYWx1ZSgKLQkJCQkJCWUud2lkZ2V0LCBvbGRDb250ZW50KSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCVN0cmluZyBuZXdDb250ZW50ID0gU3RyVXRpbAotCQkJCQkJLmdldFBsYWluVGV4dChjdHJsX2F1dGhvcnMuZ2V0VGV4dCgpKTsKLQkJCQlpZiAoIW5ld0NvbnRlbnQuZXF1YWxzKG9sZENvbnRlbnQpKSB7Ci0JCQkJCWJvb2xlYW4gc3RhdHVzID0gYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlNFVCwKLQkJCQkJCQltZXRob2RVbml0LAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE1ldGhvZFVuaXRfQXV0aG9ycygpLAotCQkJCQkJCW5ld0NvbnRlbnQsIC0xKTsKLQkJCQkJaWYgKHN0YXR1cykgewotCQkJCQkJdXBkYXRlQ2hhbmdlRGF0ZSgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9KTsKLQotCQljb3B5cmlnaHRfYnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCUlGaWx0ZXIgZmlsdGVyID0gbmV3IENvbnRlbnRGaWx0ZXIoKSB7Ci0JCQkJCXByb3RlY3RlZCBib29sZWFuIGNoaWxkQWNjZXB0KE9iamVjdCBvYmopIHsKLQkJCQkJCWlmIChvYmogaW5zdGFuY2VvZiBHdWlkYW5jZSkgewotCQkJCQkJCXJldHVybiAob2JqIGluc3RhbmNlb2YgU3VwcG9ydGluZ01hdGVyaWFsKTsKLQkJCQkJCX0KLQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJfQotCQkJCX07Ci0JCQkJTGlzdCBhbHJlYWR5RXhzdGluZyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQlpZiAoY3RybF9jb3B5cmlnaHQuZ2V0SXRlbUNvdW50KCkgPiAwKSB7Ci0JCQkJCVRhYmxlSXRlbSBpdGVtID0gY3RybF9jb3B5cmlnaHQuZ2V0SXRlbXMoKVswXTsKLQkJCQkJaWYgKGl0ZW0uZ2V0RGF0YSgpICE9IG51bGwpCi0JCQkJCQlhbHJlYWR5RXhzdGluZy5hZGQoaXRlbS5nZXREYXRhKCkpOwotCQkJCX0KLQkJCQlJdGVtc0ZpbHRlckRpYWxvZyBmZCA9IG5ldyBJdGVtc0ZpbHRlckRpYWxvZyhQbGF0Zm9ybVVJCi0JCQkJCQkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0U2hlbGwoKSwKLQkJCQkJCWZpbHRlciwgbWV0aG9kRWxlbWVudCwKLQkJCQkJCUZpbHRlckNvbnN0YW50cy5TVVBQT1JUSU5HX01BVEVSSUFMUywgYWxyZWFkeUV4c3RpbmcpOwotCQkJCWZkLnNldFZpZXdlclNlbGVjdGlvblNpbmdsZSh0cnVlKTsKLQkJCQlmZC5zZXRCbG9ja09uT3Blbih0cnVlKTsKLQkJCQlmZC5zZXRUaXRsZShGaWx0ZXJDb25zdGFudHMuU1VQUE9SVElOR19NQVRFUklBTFMpOwotCQkJCWZkLm9wZW4oKTsKLQkJCQlmZC5nZXRTZWxlY3RlZEl0ZW1zKCk7Ci0JCQkJaWYgKGZkLmdldFNlbGVjdGVkSXRlbXMoKS5zaXplKCkgPiAwKSB7Ci0JCQkJCWJvb2xlYW4gc3RhdHVzID0gYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlNFVCwKLQkJCQkJCQltZXRob2RVbml0LAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkuZ2V0TWV0aG9kVW5pdF9Db3B5cmlnaHRTdGF0ZW1lbnQoKSwKLQkJCQkJCQkoU3VwcG9ydGluZ01hdGVyaWFsKSBmZC5nZXRTZWxlY3RlZEl0ZW1zKCkuZ2V0KDApLAotCQkJCQkJCS0xKTsKLQkJCQkJaWYgKCFzdGF0dXMpIHsKLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCX0KLQkJCQljb3B5cmlnaHRfdmlld2VyLnJlZnJlc2goKTsKLQkJCQlzZXRDb3B5cmlnaHRCdXR0b25EZXNlbGVjdCgpOwotCQkJfQotCQl9KTsKLQotCQljdHJsX2NoYW5nZV9kZXNjLmFkZE1vZGlmeUxpc3RlbmVyKGNvbnRlbnRNb2RpZnlMaXN0ZW5lcik7Ci0JCWN0cmxfY2hhbmdlX2Rlc2MuYWRkRm9jdXNMaXN0ZW5lcihuZXcgRm9jdXNBZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgZm9jdXNHYWluZWQoRm9jdXNFdmVudCBlKSB7Ci0JCQkJKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkuc2V0Q3VycmVudEZlYXR1cmVFZGl0b3IoZS53aWRnZXQsCi0JCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRNZXRob2RVbml0X0NoYW5nZURlc2NyaXB0aW9uKCkpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBmb2N1c0xvc3QoRm9jdXNFdmVudCBlKSB7Ci0JCQkJU3RyaW5nIG9sZENvbnRlbnQgPSBtZXRob2RVbml0Ci0JCQkJCQkuZ2V0Q2hhbmdlRGVzY3JpcHRpb24oKTsKLQkJCQlpZiAoKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkubXVzdFJlc3RvcmVWYWx1ZSgKLQkJCQkJCWUud2lkZ2V0LCBvbGRDb250ZW50KSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCVN0cmluZyBuZXdDb250ZW50ID0gY3RybF9jaGFuZ2VfZGVzYy5nZXRUZXh0KCk7Ci0JCQkJbmV3Q29udGVudCA9IG5ld0NvbnRlbnQucmVwbGFjZShTdHJVdGlsLkxJTkVfRkVFRCwgQXV0aG9yaW5nVUlSZXNvdXJjZXMuQ2hhbmdlSGlzdG9yeURpYWxvZ19kZWxpbWl0ZXIpOwotCQkJCWlmICghbmV3Q29udGVudC5lcXVhbHMob2xkQ29udGVudCkpIHsKLQkJCQkJYm9vbGVhbiBzdWNjZXNzID0gYWN0aW9uTWdyLmRvQWN0aW9uKAotCQkJCQkJCUlBY3Rpb25NYW5hZ2VyLlNFVCwgbWV0aG9kVW5pdCwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkuZ2V0TWV0aG9kVW5pdF9DaGFuZ2VEZXNjcmlwdGlvbigpLCBuZXdDb250ZW50LCAtMSk7Ci0JCQkJCWlmIChzdWNjZXNzKSB7Ci0JCQkJCQl1cGRhdGVDaGFuZ2VEYXRlKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JCWNvcHlyaWdodF9idXR0b25fZGVzZWxlY3QuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJYm9vbGVhbiBzdGF0dXMgPSBhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuU0VULAotCQkJCQkJbWV0aG9kVW5pdCwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJLmdldE1ldGhvZFVuaXRfQ29weXJpZ2h0U3RhdGVtZW50KCksIG51bGwsIC0xKTsKLQkJCQlpZiAoc3RhdHVzKSB7Ci0JCQkJCWNvcHlyaWdodF92aWV3ZXIucmVmcmVzaCgpOwotCQkJCQlzZXRDb3B5cmlnaHRCdXR0b25EZXNlbGVjdCgpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JfQotCi0JLyoKLQkgKiB1cGRhdGUgdGhlIGNoYW5nZSBkYXRlIGlmIGFueSBhdHRyaWJ1dGUgaXMgbW9kaWZpZWQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlQ2hhbmdlRGF0ZSgpIHsKLQotCQlEYXRlIGNoYW5nZURhdGUgPSBtZXRob2RVbml0LmdldENoYW5nZURhdGUoKTsKLQkJRGF0ZUZvcm1hdCBkZiA9IERhdGVGb3JtYXQuZ2V0RGF0ZUluc3RhbmNlKERhdGVGb3JtYXQuRlVMTCk7Ci0KLQkJU3RyaW5nIG9sZENvbnRlbnQgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQlpZiAoY2hhbmdlRGF0ZSAhPSBudWxsKSB7Ci0JCQlvbGRDb250ZW50ID0gZGYuZm9ybWF0KGNoYW5nZURhdGUpOwotCQl9Ci0KLQkJRGF0ZSBjdXJyZW50RGF0ZSA9IG5ldyBEYXRlKCk7Ci0JCVN0cmluZyBuZXdDb250ZW50ID0gZGYuZm9ybWF0KGN1cnJlbnREYXRlKTsKLQkJaWYgKCFuZXdDb250ZW50LmVxdWFscyhvbGRDb250ZW50KSkgewotCQkJYm9vbGVhbiBzdGF0dXMgPSBhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuU0VULAotCQkJCQltZXRob2RVbml0LCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCS5nZXRNZXRob2RVbml0X0NoYW5nZURhdGUoKSwgY3VycmVudERhdGUsIC0xKTsKLQkJCWlmICghc3RhdHVzKSB7Ci0JCQkJcmV0dXJuOwotCQkJfSBlbHNlIHsKLQkJCQljdHJsX2NoYW5nZV9kYXRlLnNldFRleHQobmV3Q29udGVudCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBsb2FkVmVyc2lvblNlY3Rpb25EYXRhKCkgewotCi0JCWN0cmxfdmVyc2lvbgotCQkJCS5zZXRUZXh0KG1ldGhvZFVuaXQuZ2V0VmVyc2lvbigpID09IG51bGwgPyAiIiA6IG1ldGhvZFVuaXQuZ2V0VmVyc2lvbigpKTsgLy8kTk9OLU5MUy0xJAotCQljdHJsX2F1dGhvcnMKLQkJCQkuc2V0VGV4dChtZXRob2RVbml0LmdldEF1dGhvcnMoKSA9PSBudWxsID8gIiIgOiBtZXRob2RVbml0LmdldEF1dGhvcnMoKSk7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIGNoYW5nZURlc2MgPSBtZXRob2RVbml0LmdldENoYW5nZURlc2NyaXB0aW9uKCkgPT0gbnVsbCA/ICIiIDogbWV0aG9kVW5pdC5nZXRDaGFuZ2VEZXNjcmlwdGlvbigpOyAvLyROT04tTkxTLTEkCi0JCWNoYW5nZURlc2MgPSBjaGFuZ2VEZXNjLnJlcGxhY2UoQXV0aG9yaW5nVUlSZXNvdXJjZXMuQ2hhbmdlSGlzdG9yeURpYWxvZ19kZWxpbWl0ZXIsIFN0clV0aWwuTElORV9GRUVEKTsKLQkJY3RybF9jaGFuZ2VfZGVzYy5zZXRUZXh0KGNoYW5nZURlc2MpOwotCQljdHJsX2NoYW5nZV9kYXRlCi0JCQkJLnNldFRleHQobWV0aG9kVW5pdC5nZXRDaGFuZ2VEYXRlKCkgPT0gbnVsbCA/ICIiIC8vJE5PTi1OTFMtMSQKLQkJCQkJCTogRGF0ZUZvcm1hdC5nZXREYXRlSW5zdGFuY2UoRGF0ZUZvcm1hdC5GVUxMKS5mb3JtYXQoCi0JCQkJCQkJCW1ldGhvZFVuaXQuZ2V0Q2hhbmdlRGF0ZSgpKSk7Ci0JfQotCi0JLyoqCi0JICogVG9nZ2xlIERlc2NyaXB0aW9uIGNvbnRyb2wgdG8gZXhwYW5kIGFuZCBjb250cm9sIHN0YXRlCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdG9nZ2xlKEh5cGVybGlua0V2ZW50IGUsIGludCBpZCkgewotCQkvLyBUT0RPLSB3ZSBzaG91bGQgY29tYmluZSB0aGVzZSBtZXRob2RzIGludG8gb25lLiBPbmUgd2F5IHRvIGRvIGl0LAotCQkvLyBkaXNwb2luZwotCQkvLyBjdHJsX2V4cGFuZGVkIGV2ZXJ5IHRpbWUgaXQgY29sbGFwc2VzIGFuZCBjcmVhdGluZyBpdCB3aGVuIHdlIGV4cGFuZC4KLQkJLy8gQXQgcHJlc2VudCwgdGhlcmUgaXMgbm8gbWV0aG9kIHRvIGRpc3Bvc2UKLQkJdG9nZ2xlKGUpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgaWNvblNlY3Rpb25Pbi4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0ljb25TZWN0aW9uT24oKSB7Ci0JCXJldHVybiBpY29uU2VjdGlvbk9uOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBpY29uU2VjdGlvbk9uCi0JICogICAgICAgICAgICBUaGUgaWNvblNlY3Rpb25PbiB0byBzZXQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0SWNvblNlY3Rpb25Pbihib29sZWFuIGljb25TZWN0aW9uT24pIHsKLQkJdGhpcy5pY29uU2VjdGlvbk9uID0gaWNvblNlY3Rpb25PbjsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBJY29uIHNlY3Rpb24uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlSWNvblNlY3Rpb24oRm9ybVRvb2xraXQgdG9vbGtpdCkgewotCQlpY29uU2VjdGlvbiA9IHRvb2xraXQuY3JlYXRlU2VjdGlvbihzZWN0aW9uQ29tcG9zaXRlLAotCQkJCVNlY3Rpb24uREVTQ1JJUFRJT04gfCBTZWN0aW9uLlRXSVNUSUUgfCBTZWN0aW9uLkVYUEFOREVECi0JCQkJCQl8IFNlY3Rpb24uVElUTEVfQkFSKTsKLQkJR3JpZERhdGEgdGQgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJaWNvblNlY3Rpb24uc2V0TGF5b3V0RGF0YSh0ZCk7Ci0JCWljb25TZWN0aW9uLnNldFRleHQoQXV0aG9yaW5nVUlUZXh0LklDT05fU0VDVElPTl9OQU1FKTsKLQkJaWNvblNlY3Rpb24uc2V0RGVzY3JpcHRpb24oZ2V0SWNvblNlY3Rpb25EZXNjcmlwdGlvbigpKTsKLQkJaWNvblNlY3Rpb24uc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCi0JCWljb25Db21wb3NpdGUgPSB0b29sa2l0LmNyZWF0ZUNvbXBvc2l0ZShpY29uU2VjdGlvbik7Ci0JCWljb25Db21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCWljb25Db21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDMsIHRydWUpKTsKLQkJaWNvblNlY3Rpb24uc2V0Q2xpZW50KGljb25Db21wb3NpdGUpOwotCX0KLQlwcml2YXRlIHZvaWQgY3JlYXRlSWNvblNlY3Rpb25Db250ZW50KCkgewotCQlDb21wb3NpdGUgc2hhcGVJY29uQ29tcG9zaXRlID0gY3JlYXRlQ29tcG9zaXRlKHRvb2xraXQsIGljb25Db21wb3NpdGUsCi0JCQkJMSk7Ci0JCXNoYXBlSWNvbkNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YSgpKTsKLQkJc2hhcGVJY29uQ29tcG9zaXRlLnNldExheW91dChuZXcgR3JpZExheW91dCgyLCB0cnVlKSk7Ci0vLwkJY3JlYXRlTGFiZWwoCi0vLwkJCQl0b29sa2l0LAotLy8JCQkJc2hhcGVJY29uQ29tcG9zaXRlLAotLy8JCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuRGVzY3JpcHRpb25Gb3JtUGFnZV9TaGFwZUljb25QcmV2aWV3X0xhYmVsLCAyKTsgLy8kTk9OLU5MUy0xJAotCQkvLyBObyB3cmFwIG5lZWRlZAotCQljcmVhdGVMYWJlbFdpdGhOb1dyYXAoCi0JCQkJdG9vbGtpdCwKLQkJCQlzaGFwZUljb25Db21wb3NpdGUsCi0JCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuRGVzY3JpcHRpb25Gb3JtUGFnZV9TaGFwZUljb25QcmV2aWV3X0xhYmVsLAotCQkJCUdyaWREYXRhLkJFR0lOTklORywKLQkJCQkyKTsgCi0JCQotCQlwYW5lMSA9IG5ldyBDYW52YXMoc2hhcGVJY29uQ29tcG9zaXRlLCBTV1QuQk9SREVSKTsKLQkJewotCQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuQkVHSU5OSU5HKTsKLQotCQkJZ3JpZERhdGEuaGVpZ2h0SGludCA9IDYwOwotCQkJZ3JpZERhdGEud2lkdGhIaW50ID0gNjA7Ci0JCQlncmlkRGF0YS52ZXJ0aWNhbFNwYW4gPSAxOwotCQkJZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAxOwotCQkJcGFuZTEuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCQlwYW5lMS5zZXRCYWNrZ3JvdW5kKENvbG9yQ29uc3RhbnRzLmxpZ2h0R3JheSk7Ci0JCX0KLQkJLy8gcGFuZTEuc2V0U2l6ZSgzMCwzMCk7Ci0JCUNvbXBvc2l0ZSBwYW5lMiA9IGNyZWF0ZUNvbXBvc2l0ZUZvckJ1dHRvbnModG9vbGtpdCwgc2hhcGVJY29uQ29tcG9zaXRlKTsKLQkJY3RybF9zZWxlY3Rfc2hhcGVJY29uX2J1dHRvbiA9IHRvb2xraXQKLQkJCQkuY3JlYXRlQnV0dG9uKAotCQkJCQkJcGFuZTIsCi0JCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5EZXNjcmlwdGlvbkZvcm1QYWdlX1NoYXBlSWNvblByZXZpZXdfU2VsZWN0QnV0dG9uTGFiZWwsIFNXVC5OT05FKTsgCi0JCWN0cmxfY2xlYXJfc2hhcGVJY29uX2J1dHRvbiA9IHRvb2xraXQKLQkJCQkuY3JlYXRlQnV0dG9uKAotCQkJCQkJcGFuZTIsCi0JCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5EZXNjcmlwdGlvbkZvcm1QYWdlX1NoYXBlSWNvblByZXZpZXdfQ2xlYXJCdXR0b25MYWJlbCwgU1dULk5PTkUpOyAKLQkJaWYgKGNvbnRlbnRFbGVtZW50LmdldFNoYXBlaWNvbigpID09IG51bGwpCi0JCQljdHJsX2NsZWFyX3NoYXBlSWNvbl9idXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCWVsc2UKLQkJCWN0cmxfY2xlYXJfc2hhcGVJY29uX2J1dHRvbi5zZXRFbmFibGVkKHRydWUpOwotCi0JCUNvbXBvc2l0ZSBub2RlSWNvbkNvbXBvc2l0ZSA9IGNyZWF0ZUNvbXBvc2l0ZSh0b29sa2l0LCBpY29uQ29tcG9zaXRlLCAxKTsKLQkJbm9kZUljb25Db21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCW5vZGVJY29uQ29tcG9zaXRlLnNldExheW91dChuZXcgR3JpZExheW91dCgyLCBmYWxzZSkpOwotLy8JCWNyZWF0ZUxhYmVsKAotLy8JCQkJdG9vbGtpdCwKLS8vCQkJCW5vZGVJY29uQ29tcG9zaXRlLAotLy8JCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuRGVzY3JpcHRpb25Gb3JtUGFnZV9Ob2RlSWNvblByZXZpZXdfTGFiZWwsIDIpOyAvLyROT04tTkxTLTEkCi0JCS8vIE5vIHdyYXAgbmVlZCBmb3IgCi0JCWNyZWF0ZUxhYmVsV2l0aE5vV3JhcCgKLQkJCQl0b29sa2l0LAotCQkJCW5vZGVJY29uQ29tcG9zaXRlLAotCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLkRlc2NyaXB0aW9uRm9ybVBhZ2VfTm9kZUljb25QcmV2aWV3X0xhYmVsLAotCQkJCUdyaWREYXRhLkJFR0lOTklORywKLQkJCQkyKTsgCi0JCXBhbmUzID0gbmV3IENhbnZhcyhub2RlSWNvbkNvbXBvc2l0ZSwgU1dULkJPUkRFUik7Ci0JCXsKLQkJCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkJFR0lOTklORyk7Ci0KLQkJCWdyaWREYXRhLmhlaWdodEhpbnQgPSA0MDsKLQkJCWdyaWREYXRhLndpZHRoSGludCA9IDQwOwotCQkJZ3JpZERhdGEudmVydGljYWxTcGFuID0gMTsKLQkJCWdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMTsKLQkJCXBhbmUzLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQkJcGFuZTMuc2V0QmFja2dyb3VuZChDb2xvckNvbnN0YW50cy5saWdodEdyYXkpOwotCQl9Ci0JCUNvbXBvc2l0ZSBwYW5lNCA9IGNyZWF0ZUNvbXBvc2l0ZUZvckJ1dHRvbnModG9vbGtpdCwgbm9kZUljb25Db21wb3NpdGUpOwotCQljdHJsX3NlbGVjdF9ub2RlSWNvbl9idXR0b24gPSB0b29sa2l0Ci0JCQkJLmNyZWF0ZUJ1dHRvbigKLQkJCQkJCXBhbmU0LAotCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuRGVzY3JpcHRpb25Gb3JtUGFnZV9Ob2RlSWNvblByZXZpZXdfU2VsZWN0QnV0dG9uTGFiZWwsIFNXVC5OT05FKTsgCi0JCWN0cmxfY2xlYXJfbm9kZUljb25fYnV0dG9uID0gdG9vbGtpdAotCQkJCS5jcmVhdGVCdXR0b24oCi0JCQkJCQlwYW5lNCwKLQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLkRlc2NyaXB0aW9uRm9ybVBhZ2VfTm9kZUljb25QcmV2aWV3X0NsZWFyQnV0dG9uTGFiZWwsIFNXVC5OT05FKTsgCi0JCWlmIChjb250ZW50RWxlbWVudC5nZXROb2RlaWNvbigpID09IG51bGwpCi0JCQljdHJsX2NsZWFyX25vZGVJY29uX2J1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJZWxzZQotCQkJY3RybF9jbGVhcl9ub2RlSWNvbl9idXR0b24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJCi0JCW5ldyBMYWJlbChpY29uQ29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCXNoYXBlSWNvblBhdGggPSBjcmVhdGVMYWJlbFdpdGhOb1dyYXAodG9vbGtpdCwKLQkJCQlpY29uQ29tcG9zaXRlLCAiIiwgR3JpZERhdGEuQkVHSU5OSU5HLCAxKTsgLy8kTk9OLU5MUy0xJAotCQlub2RlSWNvblBhdGggPSBjcmVhdGVMYWJlbFdpdGhOb1dyYXAodG9vbGtpdCwKLQkJCQlpY29uQ29tcG9zaXRlLCAiIiwgR3JpZERhdGEuQkVHSU5OSU5HLCAyKTsgLy8kTk9OLU5MUy0xJAotLy8JCQluZXcgTGFiZWwobm9kZUljb25Db21wb3NpdGUsIFNXVC5OT05FKTsKLS8vCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkJFR0lOTklORyk7Ci0vLwkJZGF0YS5ob3Jpem9udGFsU3BhbiA9MjsKLS8vCQlub2RlSWNvblBhdGguc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQl0b29sa2l0LnBhaW50Qm9yZGVyc0ZvcihwYW5lMSk7Ci0JCXRvb2xraXQucGFpbnRCb3JkZXJzRm9yKHBhbmUyKTsKLQkJdG9vbGtpdC5wYWludEJvcmRlcnNGb3IocGFuZTMpOwotCQl0b29sa2l0LnBhaW50Qm9yZGVyc0ZvcihwYW5lNCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkSWNvblNlY3Rpb25MaXN0ZW5lcnMoKSB7Ci0KLQkJY3RybF9zZWxlY3Rfc2hhcGVJY29uX2J1dHRvbgotCQkJCS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLS8vCQkJCQlGaWxlIGxpYkRpckZpbGUgPSBuZXcgRmlsZShMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0vLwkJCQkJCQkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnlQYXRoKCkpOwotCi0JCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJCWphdmEubmV0LlVSSSBzaGFwZUljb25VcmkgPSBudWxsOwotCQkJCQkJRmlsZURpYWxvZyBmaWxlQ2hvb3NlciA9IG5ldyBGaWxlRGlhbG9nKERpc3BsYXkKLQkJCQkJCQkJLmdldEN1cnJlbnQoKS5nZXRBY3RpdmVTaGVsbCgpLCBTV1QuT1BFTik7Ci0JCQkJCQlmaWxlQ2hvb3Nlci5zZXRUZXh0KEF1dGhvcmluZ1VJUmVzb3VyY2VzLkRlc2NyaXB0aW9uRm9ybVBhZ2VfSWNvbkZpbGVDaG9vc2VyRGlhbG9nX3RpdGxlKTsgCi0JCQkJCQlmaWxlQ2hvb3Nlci5zZXRGaWx0ZXJFeHRlbnNpb25zKGltYWdlVHlwZXMpOyAKLQkJCQkJCWZpbGVDaG9vc2VyLnNldEZpbHRlck5hbWVzKGltYWdlTmFtZXMpOyAKLQkJCQkJCVN0cmluZyBpbWFnZUZpbGUgPSBudWxsOwotCQkJCQkJU3RyaW5nIGZpbGVuYW1lID0gbnVsbDsKLQkJCQkJCXdoaWxlICh0cnVlKSB7Ci0JCQkJCQkJaW1hZ2VGaWxlID0gZmlsZUNob29zZXIub3BlbigpOwotCQkJCQkJCWZpbGVuYW1lID0gZmlsZUNob29zZXIuZ2V0RmlsZU5hbWUoKTsKLQkJCQkJCQlpZiAoaW1hZ2VGaWxlICE9IG51bGwpIHsKLQkJCQkJCQkJaWYgKG5ldyBGaWxlKGltYWdlRmlsZSkuZXhpc3RzKCkpIHsKLS8vCQkJCQkJCQkJSW1hZ2VEYXRhIGltYWdlRGF0YSA9IG5ldyBJbWFnZURhdGEoCi0vLwkJCQkJCQkJCQkJaW1hZ2VGaWxlKTsKLS8vCQkJCQkJCQkJaWYgKGltYWdlRGF0YS53aWR0aCA+IFNIQVBFSUNPTl9XSURUSF9NQVgKLS8vCQkJCQkJCQkJCQl8fCBpbWFnZURhdGEuaGVpZ2h0ID4gU0hBUEVJQ09OX0hFSUdIVF9NQVgpIHsKLS8vCQkJCQkJCQkJCS8vIG1zZyB1c2VyIC0gaW1hZ2UgdG9vIGJpZwotLy8JCQkJCQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4KLS8vCQkJCQkJCQkJCQkJLmdldERlZmF1bHQoKQotLy8JCQkJCQkJCQkJCQkuZ2V0TXNnRGlhbG9nKCkKLS8vCQkJCQkJCQkJCQkJLmRpc3BsYXlFcnJvcigKLS8vCQkJCQkJCQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5mb3Jtc19EZXNjcmlwdGlvbkZvcm1QYWdlX2ltYWdlVG9vQmlnRGlhbG9nX3RpdGxlLCAvLyROT04tTkxTLTEkIAotLy8JCQkJCQkJCQkJCQkJCU1lc3NhZ2VGb3JtYXQKLS8vCQkJCQkJCQkJCQkJCQkJCS5mb3JtYXQoCi0vLwkJCQkJCQkJCQkJCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLmZvcm1zX0Rlc2NyaXB0aW9uRm9ybVBhZ2VfaW1hZ2VUb29CaWdEaWFsb2dfdGVtcGxhdGUsIC8vJE5PTi1OTFMtMSQKLS8vCQkJCQkJCQkJCQkJCQkJCQkJbmV3IE9iamVjdFtdIHsKLS8vCQkJCQkJCQkJCQkJCQkJCQkJCQlpbWFnZUZpbGUsCi0vLwkJCQkJCQkJCQkJCQkJCQkJCQkJbmV3IEludGVnZXIoCi0vLwkJCQkJCQkJCQkJCQkJCQkJCQkJCQlTSEFQRUlDT05fV0lEVEhfTUFYKSwKLS8vCQkJCQkJCQkJCQkJCQkJCQkJCQluZXcgSW50ZWdlcigKLS8vCQkJCQkJCQkJCQkJCQkJCQkJCQkJCVNIQVBFSUNPTl9IRUlHSFRfTUFYKSB9KSk7Ci0vLwkJCQkJCQkJCX0gZWxzZSB7Ci0vLwkJCQkJCQkJCQlicmVhazsKLS8vCQkJCQkJCQkJfQotCQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCQkvLyBtc2cgdXNlciAtIGZpbGUgZG9lc24ndCBleGlzdAotCQkJCQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4KLQkJCQkJCQkJCQkJLmdldERlZmF1bHQoKQotCQkJCQkJCQkJCQkuZ2V0TXNnRGlhbG9nKCkKLQkJCQkJCQkJCQkJLmRpc3BsYXlFcnJvcigKLQkJCQkJCQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5mb3Jtc19EZXNjcmlwdGlvbkZvcm1QYWdlX2ltYWdlTm90Rm91bmREaWFsb2dfdGl0bGUsIAotCQkJCQkJCQkJCQkJCU1lc3NhZ2VGb3JtYXQKLQkJCQkJCQkJCQkJCQkJCS5mb3JtYXQoCi0JCQkJCQkJCQkJCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLmZvcm1zX0Rlc2NyaXB0aW9uRm9ybVBhZ2VfaW1hZ2VOb3RGb3VuZERpYWxvZ190ZW1wbGF0ZSwgCi0JCQkJCQkJCQkJCQkJCQkJCW5ldyBPYmplY3RbXSB7IGltYWdlRmlsZSB9KSk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQlyZXR1cm47Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJaWYgKGltYWdlRmlsZSAhPSBudWxsICYmIGltYWdlRmlsZS5sZW5ndGgoKSA+IDApIHsKLQkJCQkJCQl0cnkgewotCQkJCQkJCQlTdHJpbmcgdXJsID0gY29weVJlc291cmNlVG9MaWIoY3RybF9zZWxlY3Rfc2hhcGVJY29uX2J1dHRvbi5nZXRTaGVsbCgpLCBmaWxlbmFtZSwKLQkJCQkJCQkJCQlmaWxlQ2hvb3Nlci5nZXRGaWx0ZXJQYXRoKCksCi0JCQkJCQkJCQkJbWV0aG9kRWxlbWVudCk7Ci0JCQkJCQkJCWlmICh1cmwgIT0gbnVsbCkgewotCQkJCQkJCQkJRmlsZSBmaWxlID0gbmV3IEZpbGUodXJsKTsKLQkJCQkJCQkJCXNoYXBlSWNvblVyaSA9IG5ldyBVUkkoTmV0VXRpbAotCQkJCQkJCQkJCQkuZW5jb2RlRmlsZVVSTChGaWxlVXRpbAotCQkJCQkJCQkJCQkJCS5nZXRSZWxhdGl2ZVBhdGgoZmlsZSwKLQkJCQkJCQkJCQkJCQkJCW5ldyBGaWxlKGdldFBsdWdpblBhdGgobWV0aG9kRWxlbWVudCkpKSkpOwotCQkJCQkJCQkJaWYgKHNoYXBlSWNvblVyaSAhPSBudWxsKSB7Ci0JCQkJCQkJCQkJYm9vbGVhbiBzdGF0dXMgPSBhY3Rpb25NZ3IKLQkJCQkJCQkJCQkJCS5kb0FjdGlvbigKLQkJCQkJCQkJCQkJCQkJSUFjdGlvbk1hbmFnZXIuU0VULAotCQkJCQkJCQkJCQkJCQltZXRob2RFbGVtZW50LAotCQkJCQkJCQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJCQkJCQkJCS5nZXREZXNjcmliYWJsZUVsZW1lbnRfU2hhcGVpY29uKCksCi0JCQkJCQkJCQkJCQkJCXNoYXBlSWNvblVyaSwgLTEpOwotCQkJCQkJCQkJCWlmICghc3RhdHVzKQotCQkJCQkJCQkJCQlyZXR1cm47Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCQlzaGFwZUltYWdlID0gbmV3IEltYWdlKAotCQkJCQkJCQkJCQlEaXNwbGF5LmdldEN1cnJlbnQoKSwgZmlsZQotCQkJCQkJCQkJCQkJCS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0JCQkJCQkJCQlzaGFwZUljb25QYXRoLnNldFRleHQoc2hhcGVJY29uVXJpLmdldFBhdGgoKSk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCQkJCQkJc2hhcGVJY29uVXJpID0gbnVsbDsKLQkJCQkJCQkJc2hhcGVJbWFnZSA9IG51bGw7Ci0JCQkJCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKQotCQkJCQkJCQkJCS5sb2dFcnJvcihleCk7Ci0JCQkJCQkJCWlmIChleCBpbnN0YW5jZW9mIElPRXhjZXB0aW9uKSB7Ci0JCQkJCQkJCQlBdXRob3JpbmdVSVBsdWdpbgotCQkJCQkJCQkJCQkuZ2V0RGVmYXVsdCgpCi0JCQkJCQkJCQkJCS5nZXRNc2dEaWFsb2coKQotCQkJCQkJCQkJCQkuZGlzcGxheUVycm9yKAotCQkJCQkJCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLmVycl9jb3B5aW5nX2ZpbGVfdGl0bGUsIAotCQkJCQkJCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLmVycl9jb3B5aW5nX2ZpbGVfZXJyb3IsIAotCQkJCQkJCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLmVycl9jb3B5aW5nX2ZpbGVfcmVhc29uLCAKLQkJCQkJCQkJCQkJCQlleC5nZXRNZXNzYWdlKCkpOwotCQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4KLQkJCQkJCQkJCQkJLmdldERlZmF1bHQoKQotCQkJCQkJCQkJCQkuZ2V0TXNnRGlhbG9nKCkKLQkJCQkJCQkJCQkJLmRpc3BsYXlFcnJvcigKLQkJCQkJCQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5lcnJfcHJvY2Vzc2luZ19maWxlX3RpdGxlLCAKLQkJCQkJCQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5lcnJfcHJvY2Vzc2luZ19maWxlX2Rlc2NyaXB0aW9uLCBleCk7IAotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJaWYgKHNoYXBlSW1hZ2UgIT0gbnVsbCkgewotCQkJCQkJCXBhbmUxLnJlZHJhdygpOwotCQkJCQkJCWN0cmxfY2xlYXJfc2hhcGVJY29uX2J1dHRvbi5zZXRFbmFibGVkKHRydWUpOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQljdHJsX2NsZWFyX3NoYXBlSWNvbl9idXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJCQl9Ci0KLQkJCQkJfQotCQkJCX0pOwotCi0JCWN0cmxfY2xlYXJfc2hhcGVJY29uX2J1dHRvbgotCQkJCS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQkJYm9vbGVhbiBzdGF0dXMgPSBhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuU0VULAotCQkJCQkJCQltZXRob2RFbGVtZW50LCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJCS5nZXREZXNjcmliYWJsZUVsZW1lbnRfU2hhcGVpY29uKCksCi0JCQkJCQkJCW51bGwsIC0xKTsKLQkJCQkJCWlmICghc3RhdHVzKQotCQkJCQkJCXJldHVybjsKLQkJCQkJCXBhbmUxLnJlZHJhdygpOwotCQkJCQkJY3RybF9jbGVhcl9zaGFwZUljb25fYnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCQkJc2hhcGVJY29uUGF0aC5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJfSk7Ci0KLQkJY3RybF9zZWxlY3Rfbm9kZUljb25fYnV0dG9uCi0JCQkJLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotLy8JCQkJCUZpbGUgbGliRGlyRmlsZSA9IG5ldyBGaWxlKExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLS8vCQkJCQkJCS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeVBhdGgoKSk7Ci0KLQkJCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQkJamF2YS5uZXQuVVJJIG5vZGVJY29uVXJpID0gbnVsbDsKLQkJCQkJCUZpbGVEaWFsb2cgZmlsZUNob29zZXIgPSBuZXcgRmlsZURpYWxvZyhEaXNwbGF5Ci0JCQkJCQkJCS5nZXRDdXJyZW50KCkuZ2V0QWN0aXZlU2hlbGwoKSwgU1dULk9QRU4pOwotCQkJCQkJZmlsZUNob29zZXIuc2V0VGV4dChBdXRob3JpbmdVSVJlc291cmNlcy5EZXNjcmlwdGlvbkZvcm1QYWdlX0ljb25GaWxlQ2hvb3NlckRpYWxvZ190aXRsZSk7IAotCQkJCQkJZmlsZUNob29zZXIuc2V0RmlsdGVyRXh0ZW5zaW9ucyhpbWFnZVR5cGVzKTsgCi0JCQkJCQlmaWxlQ2hvb3Nlci5zZXRGaWx0ZXJOYW1lcyhpbWFnZU5hbWVzKTsgCi0JCQkJCQlTdHJpbmcgaW1hZ2VGaWxlID0gbnVsbDsKLQkJCQkJCVN0cmluZyBmaWxlbmFtZSA9IG51bGw7Ci0JCQkJCQl3aGlsZSAodHJ1ZSkgewotCQkJCQkJCWltYWdlRmlsZSA9IGZpbGVDaG9vc2VyLm9wZW4oKTsKLQkJCQkJCQlmaWxlbmFtZSA9IGZpbGVDaG9vc2VyLmdldEZpbGVOYW1lKCk7Ci0JCQkJCQkJaWYgKGltYWdlRmlsZSAhPSBudWxsKSB7Ci0JCQkJCQkJCWlmIChuZXcgRmlsZShpbWFnZUZpbGUpLmV4aXN0cygpKSB7Ci0JCQkJCQkJCQlJbWFnZURhdGEgaW1hZ2VEYXRhID0gbmV3IEltYWdlRGF0YSgKLQkJCQkJCQkJCQkJaW1hZ2VGaWxlKTsKLQkJCQkJCQkJCWlmIChpbWFnZURhdGEud2lkdGggPiBOT0RFSUNPTl9XSURUSF9NQVgKLQkJCQkJCQkJCQkJfHwgaW1hZ2VEYXRhLmhlaWdodCA+IE5PREVJQ09OX0hFSUdIVF9NQVgpIHsKLQkJCQkJCQkJCQkvLyBtc2cgdXNlciAtIGltYWdlIHRvbyBiaWcKLQkJCQkJCQkJCQlBdXRob3JpbmdVSVBsdWdpbgotCQkJCQkJCQkJCQkJLmdldERlZmF1bHQoKQotCQkJCQkJCQkJCQkJLmdldE1zZ0RpYWxvZygpCi0JCQkJCQkJCQkJCQkuZGlzcGxheUVycm9yKAotCQkJCQkJCQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5mb3Jtc19EZXNjcmlwdGlvbkZvcm1QYWdlX2ltYWdlVG9vQmlnRGlhbG9nX3RpdGxlLCAKLQkJCQkJCQkJCQkJCQkJTWVzc2FnZUZvcm1hdAotCQkJCQkJCQkJCQkJCQkJCS5mb3JtYXQoCi0JCQkJCQkJCQkJCQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5mb3Jtc19EZXNjcmlwdGlvbkZvcm1QYWdlX2ltYWdlVG9vQmlnRGlhbG9nX3RlbXBsYXRlLCAKLQkJCQkJCQkJCQkJCQkJCQkJCW5ldyBPYmplY3RbXSB7Ci0JCQkJCQkJCQkJCQkJCQkJCQkJCWltYWdlRmlsZSwKLQkJCQkJCQkJCQkJCQkJCQkJCQkJbmV3IEludGVnZXIoCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJTk9ERUlDT05fV0lEVEhfTUFYKSwKLQkJCQkJCQkJCQkJCQkJCQkJCQkJbmV3IEludGVnZXIoCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJTk9ERUlDT05fSEVJR0hUX01BWCkgfSkpOwotCQkJCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJCQlicmVhazsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJCS8vIG1zZyB1c2VyIC0gZmlsZSBkb2Vzbid0IGV4aXN0Ci0JCQkJCQkJCQlBdXRob3JpbmdVSVBsdWdpbgotCQkJCQkJCQkJCQkuZ2V0RGVmYXVsdCgpCi0JCQkJCQkJCQkJCS5nZXRNc2dEaWFsb2coKQotCQkJCQkJCQkJCQkuZGlzcGxheUVycm9yKAotCQkJCQkJCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLmZvcm1zX0Rlc2NyaXB0aW9uRm9ybVBhZ2VfaW1hZ2VOb3RGb3VuZERpYWxvZ190aXRsZSwgCi0JCQkJCQkJCQkJCQkJTWVzc2FnZUZvcm1hdAotCQkJCQkJCQkJCQkJCQkJLmZvcm1hdCgKLQkJCQkJCQkJCQkJCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuZm9ybXNfRGVzY3JpcHRpb25Gb3JtUGFnZV9pbWFnZU5vdEZvdW5kRGlhbG9nX3RlbXBsYXRlLCAKLQkJCQkJCQkJCQkJCQkJCQkJbmV3IE9iamVjdFtdIHsgaW1hZ2VGaWxlIH0pKTsKLQkJCQkJCQkJfQotCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCXJldHVybjsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQlpZiAoaW1hZ2VGaWxlICE9IG51bGwgJiYgaW1hZ2VGaWxlLmxlbmd0aCgpID4gMCkgewotCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCVN0cmluZyB1cmwgPSBjb3B5UmVzb3VyY2VUb0xpYihjdHJsX3NlbGVjdF9ub2RlSWNvbl9idXR0b24uZ2V0U2hlbGwoKSwgZmlsZW5hbWUsCi0JCQkJCQkJCQkJZmlsZUNob29zZXIuZ2V0RmlsdGVyUGF0aCgpLAotCQkJCQkJCQkJCW1ldGhvZEVsZW1lbnQpOwotCQkJCQkJCQlpZiAodXJsICE9IG51bGwpIHsKLQkJCQkJCQkJCUZpbGUgZmlsZSA9IG5ldyBGaWxlKHVybCk7Ci0JCQkJCQkJCQlub2RlSWNvblVyaSA9IG5ldyBVUkkoTmV0VXRpbAotCQkJCQkJCQkJCQkuZW5jb2RlRmlsZVVSTChGaWxlVXRpbAotCQkJCQkJCQkJCQkJCS5nZXRSZWxhdGl2ZVBhdGgoZmlsZSwKLQkJCQkJCQkJCQkJCQkJCW5ldyBGaWxlKGdldFBsdWdpblBhdGgobWV0aG9kRWxlbWVudCkpKSkpOwotCQkJCQkJCQkJaWYgKG5vZGVJY29uVXJpICE9IG51bGwpIHsKLQkJCQkJCQkJCQlib29sZWFuIHN0YXR1cyA9IGFjdGlvbk1ncgotCQkJCQkJCQkJCQkJLmRvQWN0aW9uKAotCQkJCQkJCQkJCQkJCQlJQWN0aW9uTWFuYWdlci5TRVQsCi0JCQkJCQkJCQkJCQkJCW1ldGhvZEVsZW1lbnQsCi0JCQkJCQkJCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJCQkJCQkJLmdldERlc2NyaWJhYmxlRWxlbWVudF9Ob2RlaWNvbigpLAotCQkJCQkJCQkJCQkJCQlub2RlSWNvblVyaSwgLTEpOwotCQkJCQkJCQkJCWlmICghc3RhdHVzKQotCQkJCQkJCQkJCQlyZXR1cm47Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCQlub2RlSW1hZ2UgPSBuZXcgSW1hZ2UoRGlzcGxheS5nZXRDdXJyZW50KCksCi0JCQkJCQkJCQkJCWZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOwotCQkJCQkJCQkJbm9kZUljb25QYXRoLnNldFRleHQobm9kZUljb25VcmkuZ2V0UGF0aCgpKTsKLQkJCQkJCQkJfQotCQkJCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJCQkJCQlub2RlSWNvblVyaSA9IG51bGw7Ci0JCQkJCQkJCW5vZGVJbWFnZSA9IG51bGw7Ci0JCQkJCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKQotCQkJCQkJCQkJCS5sb2dFcnJvcihleCk7Ci0JCQkJCQkJCWlmIChleCBpbnN0YW5jZW9mIElPRXhjZXB0aW9uKSB7Ci0JCQkJCQkJCQlBdXRob3JpbmdVSVBsdWdpbgotCQkJCQkJCQkJCQkuZ2V0RGVmYXVsdCgpCi0JCQkJCQkJCQkJCS5nZXRNc2dEaWFsb2coKQotCQkJCQkJCQkJCQkuZGlzcGxheUVycm9yKAotCQkJCQkJCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLmVycl9jb3B5aW5nX2ZpbGVfdGl0bGUsIAotCQkJCQkJCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLmVycl9jb3B5aW5nX2ZpbGVfZXJyb3IsIAotCQkJCQkJCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLmVycl9jb3B5aW5nX2ZpbGVfcmVhc29uLCAKLQkJCQkJCQkJCQkJCQlleC5nZXRNZXNzYWdlKCkpOwotCi0JCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCQlBdXRob3JpbmdVSVBsdWdpbgotCQkJCQkJCQkJCQkuZ2V0RGVmYXVsdCgpCi0JCQkJCQkJCQkJCS5nZXRNc2dEaWFsb2coKQotCQkJCQkJCQkJCQkuZGlzcGxheUVycm9yKAotCQkJCQkJCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLmVycl9wcm9jZXNzaW5nX2ZpbGVfdGl0bGUsIAotCQkJCQkJCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLmVycl9wcm9jZXNzaW5nX2ZpbGVfZGVzY3JpcHRpb24sIGV4KTsgCi0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQlpZiAobm9kZUltYWdlICE9IG51bGwpIHsKLQkJCQkJCQlwYW5lMy5yZWRyYXcoKTsKLQkJCQkJCQljdHJsX2NsZWFyX25vZGVJY29uX2J1dHRvbi5zZXRFbmFibGVkKHRydWUpOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQljdHJsX2NsZWFyX25vZGVJY29uX2J1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0pOwotCi0JCWN0cmxfY2xlYXJfbm9kZUljb25fYnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWJvb2xlYW4gc3RhdHVzID0gYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlNFVCwKLQkJCQkJCW1ldGhvZEVsZW1lbnQsIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCS5nZXREZXNjcmliYWJsZUVsZW1lbnRfTm9kZWljb24oKSwgbnVsbCwgLTEpOwotCQkJCWlmICghc3RhdHVzKQotCQkJCQlyZXR1cm47Ci0JCQkJcGFuZTMucmVkcmF3KCk7Ci0JCQkJY3RybF9jbGVhcl9ub2RlSWNvbl9idXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJbm9kZUljb25QYXRoLnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0pOwotCX0KLQotCS8qKgotCSAqIENvcGllcyB0aGUgc2VsZWN0ZWQgc2hhcGVOb2RlSWNvbiBhbmQgbm9kZUljb24gdG8gcmVzb3VyY2VzIGZvbGRlciBvZgotCSAqIGNvbnRlbnQgZWxlbWVudC4gUHJvbXB0cyB0byBvdmVyd3JpdGUgaWYgZmlsZSBhbHJlYWR5IGV4aXN0cy4KLQkgKiBAcGFyYW0gc0ZpbGVOYW1lCi0JICogQHBhcmFtIHNGaWxlUGF0aAotCSAqIEBwYXJhbSBtZXRob2RFbGVtZW50Ci0JICogQHJldHVybgotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGNvcHlSZXNvdXJjZVRvTGliKFNoZWxsIHNoZWxsLCBTdHJpbmcgc0ZpbGVOYW1lLCBTdHJpbmcgc0ZpbGVQYXRoLAotCQkJTWV0aG9kRWxlbWVudCBtZXRob2RFbGVtZW50KSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlGaWxlIG5ld0ZpbGUgPSBMaWJyYXJ5VUlVdGlsLmNvcHlSZXNvdXJjZVRvTGliKHNoZWxsLCBuZXcgRmlsZShzRmlsZVBhdGgsIHNGaWxlTmFtZSksIG1ldGhvZEVsZW1lbnQpOwotCQlpZiAobmV3RmlsZSAhPSBudWxsKQotCQkJcmV0dXJuIG5ld0ZpbGUuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0JCWVsc2UgCi0JCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBsb2FkSWNvblNlY3Rpb25EYXRhKCkgewotCQlwYW5lMS5hZGRQYWludExpc3RlbmVyKG5ldyBQYWludExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgcGFpbnRDb250cm9sKFBhaW50RXZlbnQgZSkgewotCQkJCS8vIHBhaW50IHRoZSBncmV5IGJhY2tncm91bmQKLQkJCQlSZWN0YW5nbGUgY2xpZW50UmVjdCA9IHBhbmUxLmdldENsaWVudEFyZWEoKTsKLQkJCQllLmdjLnNldENsaXBwaW5nKGNsaWVudFJlY3QpOwotCQkJCWUuZ2Muc2V0QmFja2dyb3VuZChEaXNwbGF5LmdldEN1cnJlbnQoKS5nZXRTeXN0ZW1Db2xvcigxNSkpOwotCQkJCWUuZ2MuZmlsbFJlY3RhbmdsZShjbGllbnRSZWN0KTsKLQotCQkJCWphdmEubmV0LlVSSSB1cmkgPSBjb250ZW50RWxlbWVudC5nZXRTaGFwZWljb24oKTsKLQkJCQlpZiAodXJpICE9IG51bGwpIHsKLQkJCQkJU3RyaW5nIHBhdGggPSBjb250ZW50RWxlbWVudC5nZXRTaGFwZWljb24oKS5nZXRQYXRoKCk7Ci0JCQkJCWlmIChwYXRoICE9IG51bGwpIHsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJRmlsZSBmaWxlID0gbmV3IEZpbGUocGF0aCk7Ci0JCQkJCQkJaWYgKGZpbGUuZXhpc3RzKCkpIHsKLQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQlpZiAoIWZpbGUuaXNBYnNvbHV0ZSgpKSB7Ci0JCQkJCQkJCQkvLyBDaGVjayBmb3IgdGhlIHVyaSBjb250YWlucyB0aGUgcmVsYXRpdmUgdG8gbGlicmFyeS4KLQkJCQkJCQkJCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSBVbWFVdGlsLmdldE1ldGhvZFBsdWdpbihtZXRob2RFbGVtZW50KTsKLQkJCQkJCQkJCWlmKHBhdGguaW5kZXhPZihwbHVnaW4uZ2V0TmFtZSgpKSA+IC0xKXsKLQkJCQkJCQkJCQlwYXRoID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKQotCQkJCQkJCQkJCS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeUxvY2F0aW9uKCkKLQkJCQkJCQkJCQkrIEZpbGUuc2VwYXJhdG9yICsgcGF0aDsJCi0JCQkJCQkJCQl9ZWxzZXsKLQkJCQkJCQkJCQlwYXRoID0gZ2V0UGx1Z2luUGF0aChtZXRob2RFbGVtZW50KQotCQkJCQkJCQkJCSsgRmlsZS5zZXBhcmF0b3IgKyBwYXRoOwotCQkJCQkJCQkJfQotCQkJCQkJCQkJCi0JCQkJCQkJCX0KLQkJCQkJCQkJZmlsZSA9IG5ldyBGaWxlKHBhdGgpOwotCQkJCQkJCX0KLQkJCQkJCQlpZiAoZmlsZS5leGlzdHMoKSkgewotCQkJCQkJCQlpZiAoc2hhcGVJbWFnZSA9PSBudWxsKSB7Ci0JCQkJCQkJCQlzaGFwZUltYWdlID0gbmV3IEltYWdlKAotCQkJCQkJCQkJCQlEaXNwbGF5LmdldEN1cnJlbnQoKSwgcGF0aCk7Ci0JCQkJCQkJCX0KLQkJCQkJCQkJaWYoY29udGVudEVsZW1lbnQuZ2V0U2hhcGVpY29uKCkgIT0gbnVsbCl7Ci0JCQkJCQkJCQlzaGFwZUljb25QYXRoLnNldFRleHQoY29udGVudEVsZW1lbnQuZ2V0U2hhcGVpY29uKCkuZ2V0UGF0aCgpKTsKLQkJCQkJCQkJfQotCQkJCQkJCQljbGllbnRSZWN0ID0gcGFuZTEuZ2V0Q2xpZW50QXJlYSgpOwotCQkJCQkJCQllLmdjLnNldENsaXBwaW5nKGNsaWVudFJlY3QpOwotCQkJCQkJCQllLmdjLnNldEJhY2tncm91bmQoRGlzcGxheS5nZXRDdXJyZW50KCkKLQkJCQkJCQkJCQkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX1dISVRFKSk7Ci0JCQkJCQkJCWUuZ2MuZmlsbFJlY3RhbmdsZShjbGllbnRSZWN0KTsKLQkJCQkJCQkJZS5nYy5kcmF3SW1hZ2Uoc2hhcGVJbWFnZSwgc2hhcGVJbWFnZQotCQkJCQkJCQkJCS5nZXRCb3VuZHMoKS54LAotCQkJCQkJCQkJCXNoYXBlSW1hZ2UuZ2V0Qm91bmRzKCkueSwgc2hhcGVJbWFnZQotCQkJCQkJCQkJCQkJLmdldEJvdW5kcygpLndpZHRoLCBzaGFwZUltYWdlCi0JCQkJCQkJCQkJCQkuZ2V0Qm91bmRzKCkuaGVpZ2h0LCBwYW5lMQotCQkJCQkJCQkJCQkJLmdldENsaWVudEFyZWEoKS54LCBwYW5lMQotCQkJCQkJCQkJCQkJLmdldENsaWVudEFyZWEoKS55LCBwYW5lMQotCQkJCQkJCQkJCQkJLmdldENsaWVudEFyZWEoKS53aWR0aCwgcGFuZTEKLQkJCQkJCQkJCQkJCS5nZXRDbGllbnRBcmVhKCkuaGVpZ2h0KTsKLQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQlpZiAod2FybmluZ0NvdW50ID09IDEpIHsKLQkJCQkJCQkJCXdhcm5pbmdDb3VudCsrOwotCQkJCQkJCQkJU3RyaW5nIG1zZyA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmJpbmQoQXV0aG9yaW5nVUlSZXNvdXJjZXMuRGVzY3JpcHRpb25Gb3JtUGFnZV9Mb2FkU2hhcGVJY29uV2FybmluZywgKG5ldyBPYmplY3RbXSB7IG1ldGhvZEVsZW1lbnQuZ2V0TmFtZSgpLCBwYXRoIH0pKTsgCi0JCQkJCQkJCQlNc2dCb3guc2hvd1dhcm5pbmcobXNnKTsKLQkJCQkJCQkJfQotCi0JCQkJCQkJfQotCQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4KLQkJCQkJCQkJCS5nZXREZWZhdWx0KCkKLQkJCQkJCQkJCS5nZXRMb2dnZXIoKQotCQkJCQkJCQkJLmxvZ0Vycm9yKAotCQkJCQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5iaW5kKEF1dGhvcmluZ1VJUmVzb3VyY2VzLkRlc2NyaXB0aW9uRm9ybVBhZ2VfTG9hZFNoYXBlSWNvbkVycm9yLCAobmV3IE9iamVjdFtdIHsgZXguZ2V0TWVzc2FnZSgpIH0pKSk7IAotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCX0pOwotCQlwYW5lMS5yZWRyYXcoKTsKLQkJaWYoY29udGVudEVsZW1lbnQuZ2V0U2hhcGVpY29uKCkgIT0gbnVsbCl7Ci0JCQlzaGFwZUljb25QYXRoLnNldFRleHQoY29udGVudEVsZW1lbnQuZ2V0U2hhcGVpY29uKCkuZ2V0UGF0aCgpKTsKLQkJfQotCQkKLQkJcGFuZTMuYWRkUGFpbnRMaXN0ZW5lcihuZXcgUGFpbnRMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHBhaW50Q29udHJvbChQYWludEV2ZW50IGUpIHsKLQkJCQkvLyBwYWludCB0aGUgZ3JleSBiYWNrZ3JvdW5kCi0JCQkJUmVjdGFuZ2xlIGNsaWVudFJlY3QgPSBwYW5lMy5nZXRDbGllbnRBcmVhKCk7Ci0JCQkJZS5nYy5zZXRDbGlwcGluZyhjbGllbnRSZWN0KTsKLQkJCQllLmdjLnNldEJhY2tncm91bmQoRGlzcGxheS5nZXRDdXJyZW50KCkuZ2V0U3lzdGVtQ29sb3IoMTUpKTsKLQkJCQllLmdjLmZpbGxSZWN0YW5nbGUoY2xpZW50UmVjdCk7Ci0KLQkJCQlqYXZhLm5ldC5VUkkgdXJpID0gY29udGVudEVsZW1lbnQuZ2V0Tm9kZWljb24oKTsKLQkJCQlpZiAodXJpICE9IG51bGwpIHsKLQkJCQkJU3RyaW5nIHBhdGggPSBjb250ZW50RWxlbWVudC5nZXROb2RlaWNvbigpLmdldFBhdGgoKTsKLQkJCQkJaWYgKHBhdGggIT0gbnVsbCkgewotCQkJCQkJdHJ5IHsKLQkJCQkJCQlGaWxlIGZpbGUgPSBuZXcgRmlsZShwYXRoKTsKLQkJCQkJCQlpZiAoZmlsZS5leGlzdHMoKSkgewotCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCWlmICghZmlsZS5pc0Fic29sdXRlKCkpIHsKLQkJCQkJCQkJCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSBVbWFVdGlsLmdldE1ldGhvZFBsdWdpbihtZXRob2RFbGVtZW50KTsKLQkJCQkJCQkJCWlmKHBhdGguaW5kZXhPZihwbHVnaW4uZ2V0TmFtZSgpKSA+IC0xKXsKLQkJCQkJCQkJCQlwYXRoID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKQotCQkJCQkJCQkJCS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeUxvY2F0aW9uKCkKLQkJCQkJCQkJCQkrIEZpbGUuc2VwYXJhdG9yICsgcGF0aDsJCi0JCQkJCQkJCQl9ZWxzZXsKLQkJCQkJCQkJCQlwYXRoID0gZ2V0UGx1Z2luUGF0aChtZXRob2RFbGVtZW50KQotCQkJCQkJCQkJCSsgRmlsZS5zZXBhcmF0b3IgKyBwYXRoOwotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJCWZpbGUgPSBuZXcgRmlsZShwYXRoKTsKLQkJCQkJCQl9Ci0JCQkJCQkJaWYgKGZpbGUuZXhpc3RzKCkpIHsKLQkJCQkJCQkJaWYgKG5vZGVJbWFnZSA9PSBudWxsKSB7Ci0JCQkJCQkJCQlub2RlSW1hZ2UgPSBuZXcgSW1hZ2UoRGlzcGxheS5nZXRDdXJyZW50KCksCi0JCQkJCQkJCQkJCXBhdGgpOwotCQkJCQkJCQl9Ci0JCQkJCQkJCWlmKGNvbnRlbnRFbGVtZW50LmdldE5vZGVpY29uKCkgIT0gbnVsbCl7Ci0JCQkJCQkJCQlub2RlSWNvblBhdGguc2V0VGV4dChjb250ZW50RWxlbWVudC5nZXROb2RlaWNvbigpLmdldFBhdGgoKSk7Ci0JCQkJCQkJCX0KLQkJCQkJCQkJY2xpZW50UmVjdCA9IHBhbmUzLmdldENsaWVudEFyZWEoKTsKLQkJCQkJCQkJZS5nYy5zZXRDbGlwcGluZyhjbGllbnRSZWN0KTsKLQkJCQkJCQkJZS5nYy5zZXRCYWNrZ3JvdW5kKERpc3BsYXkuZ2V0Q3VycmVudCgpCi0JCQkJCQkJCQkJLmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9XSElURSkpOwotCQkJCQkJCQllLmdjLmZpbGxSZWN0YW5nbGUoY2xpZW50UmVjdCk7Ci0JCQkJCQkJCWUuZ2MuZHJhd0ltYWdlKG5vZGVJbWFnZSwKLQkJCQkJCQkJCQlub2RlSW1hZ2UuZ2V0Qm91bmRzKCkueCwgbm9kZUltYWdlCi0JCQkJCQkJCQkJCQkuZ2V0Qm91bmRzKCkueSwgbm9kZUltYWdlCi0JCQkJCQkJCQkJCQkuZ2V0Qm91bmRzKCkud2lkdGgsIG5vZGVJbWFnZQotCQkJCQkJCQkJCQkJLmdldEJvdW5kcygpLmhlaWdodCwgcGFuZTMKLQkJCQkJCQkJCQkJCS5nZXRDbGllbnRBcmVhKCkueCwgcGFuZTMKLQkJCQkJCQkJCQkJCS5nZXRDbGllbnRBcmVhKCkueSwgcGFuZTMKLQkJCQkJCQkJCQkJCS5nZXRDbGllbnRBcmVhKCkud2lkdGgsIHBhbmUzCi0JCQkJCQkJCQkJCQkuZ2V0Q2xpZW50QXJlYSgpLmhlaWdodCk7Ci0JCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJaWYgKHdhcm5pbmdDb3VudCA9PSAxKSB7Ci0JCQkJCQkJCQl3YXJuaW5nQ291bnQrKzsKLQkJCQkJCQkJCVN0cmluZyBtc2cgPSBBdXRob3JpbmdVSVJlc291cmNlcy5iaW5kKEF1dGhvcmluZ1VJUmVzb3VyY2VzLkRlc2NyaXB0aW9uRm9ybVBhZ2VfTG9hZE5vZGVJY29uV2FybmluZywgKG5ldyBPYmplY3RbXSB7IG1ldGhvZEVsZW1lbnQuZ2V0TmFtZSgpLCBwYXRoIH0pKTsgCi0JCQkJCQkJCQlNc2dCb3guc2hvd1dhcm5pbmcobXNnKTsKLQkJCQkJCQkJfQotCi0JCQkJCQkJfQotCQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4KLQkJCQkJCQkJCS5nZXREZWZhdWx0KCkKLQkJCQkJCQkJCS5nZXRMb2dnZXIoKQotCQkJCQkJCQkJLmxvZ0Vycm9yKAotCQkJCQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5iaW5kKEF1dGhvcmluZ1VJUmVzb3VyY2VzLkRlc2NyaXB0aW9uRm9ybVBhZ2VfTG9hZE5vZGVJY29uRXJyb3IsIChuZXcgT2JqZWN0W10geyBleC5nZXRNZXNzYWdlKCkgfSkpKTsgCi0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJfSk7Ci0JCXBhbmUzLnJlZHJhdygpOwotCQlpZihjb250ZW50RWxlbWVudC5nZXROb2RlaWNvbigpICE9IG51bGwpewotCQkJbm9kZUljb25QYXRoLnNldFRleHQoY29udGVudEVsZW1lbnQuZ2V0Tm9kZWljb24oKS5nZXRQYXRoKCkpOwotCQl9Ci0JfQotCi0JCi0JcHJvdGVjdGVkIHZvaWQgZW5hYmxlU2VjdGlvbnMoYm9vbGVhbiBlbmFibGUpIHsKLQkJaWYgKGdlbmVyYWxTZWN0aW9uT24pIHsKLQkJCWdlbmVyYWxTZWN0aW9uLnNldFZpc2libGUoZW5hYmxlKTsKLQkJCWlmIChlbmFibGUpIHsKLQkJCQlnZW5lcmFsU2VjdGlvbi5zZXRFeHBhbmRlZChnZW5lcmFsU2VjdGlvbkV4cGFuZEZsYWcpOwotCQkJfSBlbHNlIHsKLQkJCQlnZW5lcmFsU2VjdGlvbkV4cGFuZEZsYWcgPSBnZW5lcmFsU2VjdGlvbi5pc0V4cGFuZGVkKCk7Ci0JCQkJZ2VuZXJhbFNlY3Rpb24uc2V0RXhwYW5kZWQoZW5hYmxlKTsKLQkJCX0KLQkJfQotCi0JCWlmIChkZXRhaWxTZWN0aW9uT24pIHsKLQkJCWRldGFpbFNlY3Rpb24uc2V0VmlzaWJsZShlbmFibGUpOwotCQkJaWYgKGVuYWJsZSkgewotCQkJCWRldGFpbFNlY3Rpb24uc2V0RXhwYW5kZWQoZGV0YWlsU2VjdGlvbkV4cGFuZEZsYWcpOwotCQkJfSBlbHNlIHsKLQkJCQlkZXRhaWxTZWN0aW9uRXhwYW5kRmxhZyA9IGRldGFpbFNlY3Rpb24uaXNFeHBhbmRlZCgpOwotCQkJCWRldGFpbFNlY3Rpb24uc2V0RXhwYW5kZWQoZW5hYmxlKTsKLQkJCX0KLQkJfQotCQlpZiAobm90YXRpb25TZWN0aW9uT24pIHsKLQkJCW5vdGF0aW9uU2VjdGlvbi5zZXRWaXNpYmxlKGVuYWJsZSk7Ci0JCQlpZiAoZW5hYmxlKSB7Ci0JCQkJbm90YXRpb25TZWN0aW9uLnNldEV4cGFuZGVkKG5vdGF0aW9uU2VjdGlvbkV4cGFuZEZsYWcpOwotCQkJfSBlbHNlIHsKLQkJCQlub3RhdGlvblNlY3Rpb25FeHBhbmRGbGFnID0gbm90YXRpb25TZWN0aW9uLmlzRXhwYW5kZWQoKTsKLQkJCQlub3RhdGlvblNlY3Rpb24uc2V0RXhwYW5kZWQoZW5hYmxlKTsKLQkJCX0KLQkJfQotCQlpZiAodGFpbG9yaW5nU2VjdGlvbk9uKSB7Ci0JCQl0YWlsb3JpbmdTZWN0aW9uLnNldFZpc2libGUoZW5hYmxlKTsKLQkJCWlmIChlbmFibGUpIHsKLQkJCQl0YWlsb3JpbmdTZWN0aW9uLnNldEV4cGFuZGVkKHRhaWxvcmluZ1NlY3Rpb25FeHBhbmRGbGFnKTsKLQkJCX0gZWxzZSB7Ci0JCQkJdGFpbG9yaW5nU2VjdGlvbkV4cGFuZEZsYWcgPSB0YWlsb3JpbmdTZWN0aW9uLmlzRXhwYW5kZWQoKTsKLQkJCQl0YWlsb3JpbmdTZWN0aW9uLnNldEV4cGFuZGVkKGVuYWJsZSk7Ci0JCQl9Ci0JCX0KLQkJaWYgKHZlcnNpb25TZWN0aW9uT24pIHsKLQkJCXZlcnNpb25TZWN0aW9uLnNldFZpc2libGUoZW5hYmxlKTsKLQkJCWlmIChlbmFibGUpIHsKLQkJCQl2ZXJzaW9uU2VjdGlvbi5zZXRFeHBhbmRlZCh2ZXJzaW9uU2VjdGlvbkV4cGFuZEZsYWcpOwotCQkJfSBlbHNlIHsKLQkJCQl2ZXJzaW9uU2VjdGlvbkV4cGFuZEZsYWcgPSB2ZXJzaW9uU2VjdGlvbi5pc0V4cGFuZGVkKCk7Ci0JCQkJdmVyc2lvblNlY3Rpb24uc2V0RXhwYW5kZWQoZW5hYmxlKTsKLQkJCX0KLQkJfQotCQlpZiAoaWNvblNlY3Rpb25PbikgewotCQkJaWNvblNlY3Rpb24uc2V0VmlzaWJsZShlbmFibGUpOwotCQkJaWYgKGVuYWJsZSkgewotCQkJCWljb25TZWN0aW9uLnNldEV4cGFuZGVkKGljb25TZWN0aW9uRXhwYW5kRmxhZyk7Ci0JCQl9IGVsc2UgewotCQkJCWljb25TZWN0aW9uRXhwYW5kRmxhZyA9IGljb25TZWN0aW9uLmlzRXhwYW5kZWQoKTsKLQkJCQlpY29uU2VjdGlvbi5zZXRFeHBhbmRlZChlbmFibGUpOwotCQkJfQotCQl9Ci0JCWlmICh2YXJpYWJpbGl0eVNlY3Rpb25PbikgewotCQkJdmFyaWFiaWxpdHlTZWN0aW9uLnNldFZpc2libGUoZW5hYmxlKTsKLQkJCWlmIChlbmFibGUpIHsKLQkJCQl2YXJpYWJpbGl0eVNlY3Rpb24uc2V0RXhwYW5kZWQoZWxlbWVudFNlY3Rpb25FeHBhbmRGbGFnKTsKLQkJCX0gZWxzZSB7Ci0JCQkJZWxlbWVudFNlY3Rpb25FeHBhbmRGbGFnID0gdmFyaWFiaWxpdHlTZWN0aW9uLmlzRXhwYW5kZWQoKTsKLQkJCQl2YXJpYWJpbGl0eVNlY3Rpb24uc2V0RXhwYW5kZWQoZW5hYmxlKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuZm9ybXMuZWRpdG9yLkZvcm1QYWdlI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWlmIChzaGFwZUltYWdlICE9IG51bGwpIHsKLQkJCXNoYXBlSW1hZ2UuZGlzcG9zZSgpOwotCQl9Ci0JCWlmIChub2RlSW1hZ2UgIT0gbnVsbCkgewotCQkJbm9kZUltYWdlLmRpc3Bvc2UoKTsKLQkJfQotCQlpZiAobGFiZWxQcm92aWRlclZhcmlhYmlsaXR5ICE9IG51bGwpIHsKLQkJCWxhYmVsUHJvdmlkZXJWYXJpYWJpbGl0eS5kaXNwb3NlKCk7Ci0JCX0KLQkJaWYgKGNvbnRlbnRQcm92aWRlclZhcmlhYmlsaXR5ICE9IG51bGwpIHsKLQkJCWNvbnRlbnRQcm92aWRlclZhcmlhYmlsaXR5LmRpc3Bvc2UoKTsKLQkJfQotCQlpZiAobGFiZWxQcm92aWRlckJhc2UgIT0gbnVsbCkgewotCQkJbGFiZWxQcm92aWRlckJhc2UuZGlzcG9zZSgpOwotCQl9Ci0JCWlmIChjb3B5cmlnaHRMYWJlbFByb3ZpZGVyQmFzZSAhPSBudWxsKSB7Ci0JCQljb3B5cmlnaHRMYWJlbFByb3ZpZGVyQmFzZS5kaXNwb3NlKCk7Ci0JCX0KLQkJCi0JCWlmIChjb2x1bW5Qcm92aWRlciAhPSBudWxsKSB7Ci0JCQljb2x1bW5Qcm92aWRlci5kaXNwb3NlKCk7Ci0JCX0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzZWN0aW9uUHJvdmlkZXJzLnNpemUoKTsgaSsrKSB7Ci0JCQlPYmplY3QgcHJvdmlkZXIgPSBzZWN0aW9uUHJvdmlkZXJzLmdldChpKTsKLQkJCWlmIChwcm92aWRlciAhPSBudWxsICYmIHByb3ZpZGVyIGluc3RhbmNlb2YgSVNlY3Rpb25Qcm92aWRlcikgewotCQkJCSgoSVNlY3Rpb25Qcm92aWRlcikgcHJvdmlkZXIpLmRpc3Bvc2UoKTsKLQkJCX0KLQkJfQotCQlzdXBlci5kaXNwb3NlKCk7Ci0JCQotCQlkaXNwb3NlZCA9IHRydWU7Ci0JfQkJCi0KLQlwcml2YXRlIHZvaWQgc2V0Q29weXJpZ2h0QnV0dG9uRGVzZWxlY3QoKSB7Ci0JCWlmIChtZXRob2RVbml0LmdldENvcHlyaWdodFN0YXRlbWVudCgpICE9IG51bGwpIHsKLQkJCWNvcHlyaWdodF9idXR0b25fZGVzZWxlY3QKLQkJCQkJLnNldEVuYWJsZWQoKG1ldGhvZFVuaXQKLQkJCQkJCQkuZ2V0Q29weXJpZ2h0U3RhdGVtZW50KCkuZ2V0TmFtZSgpID09IG51bGwpID8gZmFsc2UKLQkJCQkJCQk6IHRydWUpOwotCQl9IGVsc2UKLQkJCWNvcHlyaWdodF9idXR0b25fZGVzZWxlY3Quc2V0RW5hYmxlZChmYWxzZSk7Ci0JCWlmIChUbmdVdGlsLmlzTG9ja2VkKG1ldGhvZEVsZW1lbnQpKQotCQkJY29weXJpZ2h0X2J1dHRvbl9kZXNlbGVjdC5zZXRFbmFibGVkKGZhbHNlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRDb250ZXh0SGVscCgpIHsKLQkJaWYgKG1haW5Db21wb3NpdGUgIT0gbnVsbCkgewotCQkJRWRpdG9yc0NvbnRleHRIZWxwZXIuc2V0SGVscChtYWluQ29tcG9zaXRlLmdldFBhcmVudCgpLAotCQkJCQlnZXRDb250ZW50RWxlbWVudCgpKTsKLQkJfQotCQlpZiAoZXhwYW5kZWRDb21wb3NpdGUgIT0gbnVsbCkgewotCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscCgKLQkJCQkJZXhwYW5kZWRDb21wb3NpdGUsCi0JCQkJCUF1dGhvcmluZ1VJSGVscENvbnRleHRzLlJJQ0hfVEVYVF9FRElUT1JfQ09OVEVYVF9JRCk7Ci0JCX0KLQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuSVJlZnJlc2hhYmxlI3JlZnJlc2hOYW1lKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgcmVmcmVzaE5hbWUoU3RyaW5nIG5ld05hbWUpIHsKLQkJaWYgKG5ld05hbWUgIT0gbnVsbCkgewotCQkJaWYgKChjdHJsX25hbWUgIT0gbnVsbCkgJiYgIShjdHJsX25hbWUuaXNEaXNwb3NlZCgpKSkgewotCQkJCWN0cmxfbmFtZS5yZW1vdmVNb2RpZnlMaXN0ZW5lcihtb2RlbE1vZGlmeUxpc3RlbmVyKTsKLQkJCQljdHJsX25hbWUuc2V0VGV4dChuZXdOYW1lKTsKLQkJCQljdHJsX25hbWUuYWRkTW9kaWZ5TGlzdGVuZXIobW9kZWxNb2RpZnlMaXN0ZW5lcik7Ci0JCQkJc2V0Rm9ybVRleHRXaXRoVmFyaWFibGVJbmZvKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgbG9hZFNlY3Rpb25EZXNjcmlwdGlvbigpewotCQkKLQl9Ci0JcHJvdGVjdGVkIFN0cmluZyBnZXREZXRhaWxTZWN0aW9uRGVzY3JpcHRpb24oKXsKLQkJaWYoZGV0YWlsU2VjdGlvbkRlc2NyaXB0aW9uICE9IG51bGwpewotCQkJcmV0dXJuIGRldGFpbFNlY3Rpb25EZXNjcmlwdGlvbjsKLQkJfQotCQlyZXR1cm4gQXV0aG9yaW5nVUlUZXh0LkRFVEFJTF9TRUNUSU9OX0RFU0M7Ci0JfQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0R2VuZXJhbFNlY3Rpb25EZXNjcmlwdGlvbigpewotCQlpZihnZW5lcmFsU2VjdGlvbkRlc2NyaXB0aW9uIT0gbnVsbCl7Ci0JCQlyZXR1cm4gZ2VuZXJhbFNlY3Rpb25EZXNjcmlwdGlvbjsKLQkJfQotCQlyZXR1cm4gQXV0aG9yaW5nVUlUZXh0LkdFTkVSQUxfSU5GT19TRUNUSU9OX0RFU0M7Ci0JfQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0VGFpbG9yaW5nU2VjdGlvbkRlc2NyaXB0aW9uKCl7Ci0JCWlmKHRhaWxvcmluZ1NlY3Rpb25EZXNjcmlwdGlvbiAhPSBudWxsKXsKLQkJCXJldHVybiB0YWlsb3JpbmdTZWN0aW9uRGVzY3JpcHRpb247Ci0JCX0KLQkJcmV0dXJuIEF1dGhvcmluZ1VJVGV4dC5UQUlMT1JJTkdfU0VDVElPTl9ERVNDOwotCX0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldE5vdGF0aW9uU2VjdGlvbkRlc2NyaXB0aW9uKCl7Ci0JCWlmKG5vdGF0aW9uU2VjdGlvbkRlc2NyaXB0aW9uICE9IG51bGwpewotCQkJcmV0dXJuIG5vdGF0aW9uU2VjdGlvbkRlc2NyaXB0aW9uOwotCQl9Ci0JCXJldHVybiBBdXRob3JpbmdVSVRleHQuTk9UQVRJT05fU0VDVElPTl9ERVNDOwotCX0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFZhcmlhYmlsaXR5U2VjdGlvbkRlc2NyaXB0aW9uKCl7Ci0JCWlmKHZhcmlhYmlsaXR5U2VjdGlvbkRlc2NyaXB0aW9uICE9IG51bGwpewotCQkJcmV0dXJuIHZhcmlhYmlsaXR5U2VjdGlvbkRlc2NyaXB0aW9uOwotCQl9Ci0JCXJldHVybiBBdXRob3JpbmdVSVRleHQuVkFSSUFCSUxJVFlfU0VDVElPTl9ERVNDOwotCX0KLQkKLQlwcml2YXRlIFN0cmluZyBnZXRJY29uU2VjdGlvbkRlc2NyaXB0aW9uKCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHVicwotCQlpZihpY29uU2VjdGlvbkRlc2NyaXB0aW9uICE9IG51bGwpewotCQkJcmV0dXJuIGljb25TZWN0aW9uRGVzY3JpcHRpb247Ci0JCX0KLQkJcmV0dXJuIEF1dGhvcmluZ1VJVGV4dC5JQ09OX1NFQ1RJT05fREVTQzsKLQl9Ci0JcHJpdmF0ZSBTdHJpbmcgZ2V0VmVyc2lvblNlY3Rpb25EZXNjcmlwdGlvbigpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlpZih2ZXJzaW9uU2VjdGlvbkRlc2NyaXB0aW9uICE9IG51bGwpewotCQkJcmV0dXJuIHZlcnNpb25TZWN0aW9uRGVzY3JpcHRpb247Ci0JCX0KLQkJcmV0dXJuIEF1dGhvcmluZ1VJVGV4dC5WRVJTSU9OX0lORk9fU0VDVElPTl9ERVNDOwotCX0KLQotCS8qKiAKLQkgKiBGb2xsb3dpbmcgbWV0aG9kcyBiZWxvdyBleHBvc2VkIHB1YmxpYyBpbiBvcmRlciB0byBhbGxvdyAKLQkgKiB0ZXN0IGF1dG9tYXRpb24gdG8gYWNjZXNzIHRoZSBmb3JtIG9iamVjdHMgdGhyb3VnaCB0ZXN0IG9iamVjdHMKLQkgKiBvZiBhbnkgYXV0b21hdGlvbiB0b29scy4KLQkgKi8KLQkKLQkvKioKLQkgKiBHZXQgYnJpZWYgZGVzY3JpcHRpb24KLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIGN0cmxfYnJpZWZfZGVzYy4KLQkgKi8KLQlwdWJsaWMgVGV4dCBnZXRDdHJsX2JyaWVmX2Rlc2MoKSB7Ci0JCXJldHVybiBjdHJsX2JyaWVmX2Rlc2M7Ci0JfQotCi0JLyoqCi0JICogU2V0IGJyaWVmIGRlc2NyaXB0aW9uCi0JICogQHBhcmFtIGN0cmxfYnJpZWZfZGVzYyBUaGUgY3RybF9icmllZl9kZXNjIHRvIHNldC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDdHJsX2JyaWVmX2Rlc2MoVGV4dCBjdHJsX2JyaWVmX2Rlc2MpIHsKLQkJdGhpcy5jdHJsX2JyaWVmX2Rlc2MgPSBjdHJsX2JyaWVmX2Rlc2M7Ci0JfQotCi0JLyoqCi0JICogR2V0IG1haW4gZGVzY3JpcHRpb24KLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIGN0cmxfZnVsbF9kZXNjLgotCSAqLwotCXB1YmxpYyBJTWV0aG9kUmljaFRleHQgZ2V0Q3RybF9mdWxsX2Rlc2MoKSB7Ci0JCXJldHVybiBjdHJsX2Z1bGxfZGVzYzsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgbWFpbiBkZXNjcmlwdGlvbgotCSAqIEBwYXJhbSBjdHJsX2Z1bGxfZGVzYyBUaGUgY3RybF9mdWxsX2Rlc2MgdG8gc2V0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEN0cmxfZnVsbF9kZXNjKElNZXRob2RSaWNoVGV4dCBjdHJsX2Z1bGxfZGVzYykgewotCQl0aGlzLmN0cmxfZnVsbF9kZXNjID0gY3RybF9mdWxsX2Rlc2M7Ci0JfQotCi0JLyoqCi0JICogR2V0IHByZXNlbnRhdGlvbiBuYW1lCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBjdHJsX3ByZXNlbnRhdGlvbl9uYW1lLgotCSAqLwotCXB1YmxpYyBUZXh0IGdldEN0cmxfcHJlc2VudGF0aW9uX25hbWUoKSB7Ci0JCXJldHVybiBjdHJsX3ByZXNlbnRhdGlvbl9uYW1lOwotCX0KLQotCS8qKgotCSAqIFNldCBwcmVzZW50YXRpb24gbmFtZQotCSAqIEBwYXJhbSBjdHJsX3ByZXNlbnRhdGlvbl9uYW1lIFRoZSBjdHJsX3ByZXNlbnRhdGlvbl9uYW1lIHRvIHNldC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDdHJsX3ByZXNlbnRhdGlvbl9uYW1lKFRleHQgY3RybF9wcmVzZW50YXRpb25fbmFtZSkgewotCQl0aGlzLmN0cmxfcHJlc2VudGF0aW9uX25hbWUgPSBjdHJsX3ByZXNlbnRhdGlvbl9uYW1lOwotCX0KLQotCS8qKgotCSAqIEdldCBleHBhbmRlZCByaWNoIHRleHQgY29udHJvbAotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgY3RybF9leHBhbmRlZC4KLQkgKi8KLQlwdWJsaWMgSU1ldGhvZFJpY2hUZXh0RWRpdG9yIGdldEN0cmxfZXhwYW5kZWQoKSB7Ci0JCXJldHVybiBjdHJsX2V4cGFuZGVkOwotCX0KLQotCS8qKgotCSAqIFNldCBleHBhbmRlZCByaWNoIHRleHQgY29udHJvbAotCSAqIEBwYXJhbSBjdHJsX2V4cGFuZGVkIFRoZSBjdHJsX2V4cGFuZGVkIHRvIHNldC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDdHJsX2V4cGFuZGVkKElNZXRob2RSaWNoVGV4dEVkaXRvciBjdHJsX2V4cGFuZGVkKSB7Ci0JCXRoaXMuY3RybF9leHBhbmRlZCA9IGN0cmxfZXhwYW5kZWQ7Ci0JfQotCi0JLyoqCi0JICogR2V0IHJpY2ggdGV4dCBjb250cm9sCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBjdHJsX2tleS4KLQkgKi8KLQlwdWJsaWMgSU1ldGhvZFJpY2hUZXh0IGdldEN0cmxfa2V5KCkgewotCQlyZXR1cm4gY3RybF9rZXk7Ci0JfQotCi0JLyoqCi0JICogU2V0IHJpY2ggdGV4dCBjb250cm9sCi0JICogQHBhcmFtIGN0cmxfa2V5IFRoZSBjdHJsX2tleSB0byBzZXQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q3RybF9rZXkoSU1ldGhvZFJpY2hUZXh0IGN0cmxfa2V5KSB7Ci0JCXRoaXMuY3RybF9rZXkgPSBjdHJsX2tleTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRQbHVnaW5QYXRoKE1ldGhvZEVsZW1lbnQgZSl7Ci0JCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSBVbWFVdGlsLmdldE1ldGhvZFBsdWdpbihlKTsKLQkJaWYgKHBsdWdpbiAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gUmVzb3VyY2VIZWxwZXIuZ2V0Rm9sZGVyQWJzb2x1dGVQYXRoKHBsdWdpbik7Ci0JCX0KLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL0Rpc2NpcGxpbmVEZXNjcmlwdGlvblBhZ2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvRGlzY2lwbGluZURlc2NyaXB0aW9uUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZmY0NTRhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvRGlzY2lwbGluZURlc2NyaXB0aW9uUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3JtczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5maWx0ZXJzLkNhdGVnb3J5RmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLkZpbHRlckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLlZhcmlhYmlsaXR5QmFzZUVsZW1lbnRGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaXNjaXBsaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuRm9ybUVkaXRvcjsKLQotCi0vKioKLSAqIFRoZSBEZXNjcmlwdGlvbiBwYWdlIGZvciB0aGUgRG9tYWluIGVkaXRvci4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAYXV0aG9yIEJpbmd4dWUgWHUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIERpc2NpcGxpbmVEZXNjcmlwdGlvblBhZ2UgZXh0ZW5kcyBEZXNjcmlwdGlvbkZvcm1QYWdlIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JNX1BBR0VfSUQgPSAiZGlzY2lwbGluZURlc2NyaXB0aW9uUGFnZSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgRGlzY2lwbGluZSBkaXNjaXBsaW5lOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgRGlzY2lwbGluZURlc2NyaXB0aW9uUGFnZShGb3JtRWRpdG9yIGVkaXRvcikgewotCQlzdXBlcihlZGl0b3IsIEZPUk1fUEFHRV9JRCwgQXV0aG9yaW5nVUlUZXh0LkRFU0NSSVBUSU9OX1BBR0VfVElUTEUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2luaXQob3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGUsIG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElFZGl0b3JTaXRlIHNpdGUsIElFZGl0b3JJbnB1dCBpbnB1dCkgewotCQlzdXBlci5pbml0KHNpdGUsIGlucHV0KTsKLQkJZGlzY2lwbGluZSA9IChEaXNjaXBsaW5lKSBjb250ZW50RWxlbWVudDsKLQkJc2V0RXh0ZXJuYWxJRE9uKHRydWUpOwotCQlzZXRMb25nUHJlc2VudGF0aW9uTmFtZU9uKHRydWUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2dldENvbnRlbnRFbGVtZW50KCkKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGdldENvbnRlbnRFbGVtZW50KCkgewotCQlyZXR1cm4gZGlzY2lwbGluZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRGaWx0ZXIoKQotCSAqLwotCXByb3RlY3RlZCBJRmlsdGVyIGdldEZpbHRlcigpIHsKLQkJZmlsdGVyID0gbmV3IENhdGVnb3J5RmlsdGVyKCkgewotCQkJcHJvdGVjdGVkIGJvb2xlYW4gY2hpbGRBY2NlcHQoT2JqZWN0IG9iaikgewotCQkJCXJldHVybiAob2JqIGluc3RhbmNlb2YgRGlzY2lwbGluZSk7Ci0JCQl9Ci0JCX07Ci0KLQkJLy8gc2V0IGFkZGl0aW9uYWwgZmlsdGVyIGZvciB2YXJpYWJpbGl0eSBiYXNlIGVsZW1lbnQgY2hlY2tpbmcKLQkJKChDYXRlZ29yeUZpbHRlcikgZmlsdGVyKQotCQkJCS5zZXRBZGRpdGlvbmFsRmlsdGVycyhuZXcgSUZpbHRlcltdIHsgbmV3IFZhcmlhYmlsaXR5QmFzZUVsZW1lbnRGaWx0ZXIoCi0JCQkJCQlkaXNjaXBsaW5lKSB9KTsKLQkJcmV0dXJuIGZpbHRlcjsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFRhYlN0cmluZygpIHsKLQkJcmV0dXJuIEZpbHRlckNvbnN0YW50cy5ESVNDSVBMSU5FUzsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjbG9hZFNlY3Rpb25EZXNjcmlwdGlvbigpCi0JICovCi0JcHVibGljIHZvaWQgbG9hZFNlY3Rpb25EZXNjcmlwdGlvbigpIHsKLQkJdGhpcy5nZW5lcmFsU2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZGlzY2lwbGluZV9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYzsKLQkJdGhpcy5kZXRhaWxTZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy5kaXNjaXBsaW5lX2RldGFpbFNlY3Rpb25fZGVzYzsKLQkJdGhpcy52YXJpYWJpbGl0eVNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmRpc2NpcGxpbmVfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M7Ci0JCXRoaXMudmVyc2lvblNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmRpc2NpcGxpbmVfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL0Rpc2NpcGxpbmVHcm91cGluZ0Rlc2NyaXB0aW9uUGFnZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9EaXNjaXBsaW5lR3JvdXBpbmdEZXNjcmlwdGlvblBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmUxMWQyZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL0Rpc2NpcGxpbmVHcm91cGluZ0Rlc2NyaXB0aW9uUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3JtczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5maWx0ZXJzLkNhdGVnb3J5RmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLkZpbHRlckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLlZhcmlhYmlsaXR5QmFzZUVsZW1lbnRGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaXNjaXBsaW5lR3JvdXBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLmVkaXRvci5Gb3JtRWRpdG9yOwotCi0KLS8qKgotICogVGhlIERlc2NyaXB0aW9uIHBhZ2UgZm9yIHRoZSBEaXNjaXBsaW5lIEdyb3VwaW5nIGVkaXRvci4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRGlzY2lwbGluZUdyb3VwaW5nRGVzY3JpcHRpb25QYWdlIGV4dGVuZHMgRGVzY3JpcHRpb25Gb3JtUGFnZSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9STV9QQUdFX0lEID0gImRpc2NpcGxpbmVHcm91cGluZ0Rlc2NyaXB0aW9uUGFnZSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgRGlzY2lwbGluZUdyb3VwaW5nIGRpc2NpcGxpbmVHcm91cGluZzsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIERpc2NpcGxpbmVHcm91cGluZ0Rlc2NyaXB0aW9uUGFnZShGb3JtRWRpdG9yIGVkaXRvcikgewotCQlzdXBlcihlZGl0b3IsIEZPUk1fUEFHRV9JRCwgQXV0aG9yaW5nVUlUZXh0LkRFU0NSSVBUSU9OX1BBR0VfVElUTEUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2luaXQob3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGUsIG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElFZGl0b3JTaXRlIHNpdGUsIElFZGl0b3JJbnB1dCBpbnB1dCkgewotCQlzdXBlci5pbml0KHNpdGUsIGlucHV0KTsKLQkJZGlzY2lwbGluZUdyb3VwaW5nID0gKERpc2NpcGxpbmVHcm91cGluZykgY29udGVudEVsZW1lbnQ7Ci0JCXNldEV4dGVybmFsSURPbih0cnVlKTsKLQkJc2V0TG9uZ1ByZXNlbnRhdGlvbk5hbWVPbih0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRDb250ZW50RWxlbWVudCgpCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBnZXRDb250ZW50RWxlbWVudCgpIHsKLQkJcmV0dXJuIGRpc2NpcGxpbmVHcm91cGluZzsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRUYWJTdHJpbmcoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0VGFiU3RyaW5nKCkgewotCQlyZXR1cm4gRmlsdGVyQ29uc3RhbnRzLkRJU0NJUExJTkVTOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2dldEZpbHRlcigpCi0JICovCi0JcHJvdGVjdGVkIElGaWx0ZXIgZ2V0RmlsdGVyKCkgewotCQlmaWx0ZXIgPSBuZXcgQ2F0ZWdvcnlGaWx0ZXIoKSB7Ci0JCQlwcm90ZWN0ZWQgYm9vbGVhbiBjaGlsZEFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCQkJcmV0dXJuIChvYmogaW5zdGFuY2VvZiBEaXNjaXBsaW5lR3JvdXBpbmcpOwotCQkJfQotCQl9OwotCi0JCS8vIFNldCBhZGRpdGlvbmFsIGZpbHRlciBmb3IgdmFyaWFiaWxpdHkgYmFzZSBlbGVtZW50IGNoZWNraW5nLgotCQkoKENhdGVnb3J5RmlsdGVyKSBmaWx0ZXIpCi0JCQkJLnNldEFkZGl0aW9uYWxGaWx0ZXJzKG5ldyBJRmlsdGVyW10geyBuZXcgVmFyaWFiaWxpdHlCYXNlRWxlbWVudEZpbHRlcigKLQkJCQkJCWRpc2NpcGxpbmVHcm91cGluZykgfSk7Ci0JCXJldHVybiBmaWx0ZXI7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2xvYWRTZWN0aW9uRGVzY3JpcHRpb24oKQotCSAqLwotCXB1YmxpYyB2b2lkIGxvYWRTZWN0aW9uRGVzY3JpcHRpb24oKSB7Ci0JCXRoaXMuZ2VuZXJhbFNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmRpc2NpcGxpbmVncm91cGluZ19nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYzsKLQkJdGhpcy5kZXRhaWxTZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy5kaXNjaXBsaW5lZ3JvdXBpbmdfZGV0YWlsU2VjdGlvbl9kZXNjOwotCQl0aGlzLnZhcmlhYmlsaXR5U2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZGlzY2lwbGluZWdyb3VwaW5nX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjOwotCQl0aGlzLnZlcnNpb25TZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy5kaXNjaXBsaW5lZ3JvdXBpbmdfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL0Rpc2NpcGxpbmVHcm91cGluZ0Rpc2NpcGxpbmVzUGFnZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9EaXNjaXBsaW5lR3JvdXBpbmdEaXNjaXBsaW5lc1BhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2VmYWJmZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL0Rpc2NpcGxpbmVHcm91cGluZ0Rpc2NpcGxpbmVzUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZpbHRlcnMuQ2F0ZWdvcnlGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklBY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuRmlsdGVyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGlzY2lwbGluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpc2NpcGxpbmVHcm91cGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLmVkaXRvci5Gb3JtRWRpdG9yOwotCi0KLS8qKgotICogVGhlIERpc2NpcGxpbmVzIHBhZ2UgaW4gdGhlIERpc2NpcGxpbmUgR3JvdXBpbmcgZWRpdG9yLgotICogCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRGlzY2lwbGluZUdyb3VwaW5nRGlzY2lwbGluZXNQYWdlIGV4dGVuZHMgQXNzb2NpYXRpb25Gb3JtUGFnZSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9STV9QQUdFX0lEID0gImRpc2NpcGxpbmVHcm91cGluZ0Rpc2NpcGxpbmVzUGFnZSI7IC8vJE5PTi1OTFMtMSQJCi0KLQlwcml2YXRlIERpc2NpcGxpbmVHcm91cGluZyBkaXNjaXBsaW5lR3JvdXBpbmc7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBEaXNjaXBsaW5lR3JvdXBpbmdEaXNjaXBsaW5lc1BhZ2UoRm9ybUVkaXRvciBlZGl0b3IpIHsKLQkJc3VwZXIoZWRpdG9yLCBGT1JNX1BBR0VfSUQsIEF1dGhvcmluZ1VJVGV4dC5ESVNDSVBMSU5FU19QQUdFX1RJVExFKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNpbml0KG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlLCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJRWRpdG9yU2l0ZSBzaXRlLCBJRWRpdG9ySW5wdXQgaW5wdXQpIHsKLQkJc3VwZXIuaW5pdChzaXRlLCBpbnB1dCk7Ci0JCWRpc2NpcGxpbmVHcm91cGluZyA9IChEaXNjaXBsaW5lR3JvdXBpbmcpIGNvbnRlbnRFbGVtZW50OwotCQlzZXRVc2VDYXRlZ29yeTIoZmFsc2UpOwotCQlzZXRVc2VDYXRlZ29yeTMoZmFsc2UpOwotCQlzZXRBbGxvd0NoYW5nZTEodHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjaW5pdENvbnRlbnRQcm92aWRlclNlbGVjdGVkKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0Q29udGVudFByb3ZpZGVyU2VsZWN0ZWQoKSB7Ci0JCWNvbnRlbnRQcm92aWRlclNlbGVjdGVkID0gbmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKAotCQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpIHsKLQkJCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuICgoRGlzY2lwbGluZUdyb3VwaW5nKSBvYmplY3QpLmdldERpc2NpcGxpbmVzKCkudG9BcnJheSgpOwotCQkJfQotCQl9OwotCQl2aWV3ZXJfc2VsZWN0ZWQuc2V0Q29udGVudFByb3ZpZGVyKGNvbnRlbnRQcm92aWRlclNlbGVjdGVkKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNhZGRJdGVtc1RvTW9kZWwxKEFycmF5TGlzdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRJdGVtc1RvTW9kZWwxKEFycmF5TGlzdCBhZGRJdGVtcykgewotCQkvLyBVcGRhdGUgdGhlIG1vZGVsLgotCQlpZiAoIWFkZEl0ZW1zLmlzRW1wdHkoKSkgewotCQkJZWRpdG9yLmdldEFjdGlvbk1hbmFnZXIoKS5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5BRERfTUFOWSwKLQkJCQkJZGlzY2lwbGluZUdyb3VwaW5nLAotCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXREaXNjaXBsaW5lR3JvdXBpbmdfRGlzY2lwbGluZXMoKSwKLQkJCQkJYWRkSXRlbXMsIC0xKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI3JlbW92ZUl0ZW1zRnJvbU1vZGVsMShBcnJheUxpc3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlSXRlbXNGcm9tTW9kZWwxKEFycmF5TGlzdCBybUl0ZW1zKSB7Ci0JCS8vIFVwZGF0ZSB0aGUgbW9kZWwuCi0JCWlmICghcm1JdGVtcy5pc0VtcHR5KCkpIHsKLQkJCWVkaXRvci5nZXRBY3Rpb25NYW5hZ2VyKCkuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuUkVNT1ZFX01BTlksCi0JCQkJCWRpc2NpcGxpbmVHcm91cGluZywKLQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RGlzY2lwbGluZUdyb3VwaW5nX0Rpc2NpcGxpbmVzKCksCi0JCQkJCXJtSXRlbXMsIC0xKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2dldENvbnRlbnRFbGVtZW50KCkKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGdldENvbnRlbnRFbGVtZW50KCkgewotCQlyZXR1cm4gZGlzY2lwbGluZUdyb3VwaW5nOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2dldFRhYlN0cmluZygpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRUYWJTdHJpbmcoKSB7Ci0JCXJldHVybiBGaWx0ZXJDb25zdGFudHMuRElTQ0lQTElORVM7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjZ2V0RmlsdGVyKCkKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpbHRlciBnZXRGaWx0ZXIoKSB7Ci0JCXJldHVybiBmaWx0ZXIgPSBuZXcgQ2F0ZWdvcnlGaWx0ZXIoKSB7Ci0JCQlwcm90ZWN0ZWQgYm9vbGVhbiBjaGlsZEFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCQkJcmV0dXJuIChvYmogaW5zdGFuY2VvZiBEaXNjaXBsaW5lKTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0TXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbihpbnQpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRNdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uKGludCBjb3VudCkgewotCQlyZXR1cm4gc3VwZXIuZ2V0TXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbihjb3VudCwgQXV0aG9yaW5nVUlSZXNvdXJjZXMuZGlzY2lwbGluZUdyb3VwaW5nRGlzY2lwbGluZXNQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb24pOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNnZXRTZWN0aW9uRGVzY3JpcHRpb24oKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VjdGlvbkRlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZGlzY2lwbGluZUdyb3VwaW5nRGlzY2lwbGluZXNQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNnZXRTZWN0aW9uTmFtZSgpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTZWN0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLmRpc2NpcGxpbmVHcm91cGluZ0Rpc2NpcGxpbmVzUGFnZV9zZWN0aW9uTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNnZXRTZWxlY3RlZExhYmVsKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlbGVjdGVkTGFiZWwoKSB7Ci0JCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy5kaXNjaXBsaW5lR3JvdXBpbmdEaXNjaXBsaW5lc1BhZ2Vfc2VsZWN0ZWRMYWJlbDsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0U2VsZWN0ZWRMYWJlbDIoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VsZWN0ZWRMYWJlbDIoKSB7Ci0JCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy5kaXNjaXBsaW5lR3JvdXBpbmdEaXNjaXBsaW5lc1BhZ2Vfc2VsZWN0ZWRMYWJlbDsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0U2VsZWN0ZWRMYWJlbDMoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VsZWN0ZWRMYWJlbDMoKSB7Ci0JCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy5kaXNjaXBsaW5lR3JvdXBpbmdEaXNjaXBsaW5lc1BhZ2Vfc2VsZWN0ZWRMYWJlbDsKLQl9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9EaXNjaXBsaW5lUmVmZXJlbmNlV29ya2Zsb3dQYWdlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL0Rpc2NpcGxpbmVSZWZlcmVuY2VXb3JrZmxvd1BhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTVmM2Y1MC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL0Rpc2NpcGxpbmVSZWZlcmVuY2VXb3JrZmxvd1BhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5maWx0ZXJzLlJlZmVyZW5jZVdvcmtGbG93RmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JQWN0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLkZpbHRlckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnVpLlVzZXJJbnRlcmFjdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpc2NpcGxpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLmVkaXRvci5Gb3JtRWRpdG9yOwotCi0KLS8qKgotICogVGhlIFJlZmVyZW5jZSBXb3JrZmxvdyBwYWdlIGluIHRoZSBEaXNjaXBsaW5lIGVkaXRvci4KLSAqIAotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIERpc2NpcGxpbmVSZWZlcmVuY2VXb3JrZmxvd1BhZ2UgZXh0ZW5kcyBBc3NvY2lhdGlvbkZvcm1QYWdlIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JNX1BBR0VfSUQgPSAiZGlzY2lwbGluZVJlZmVyZW5jZVdvcmtmbG93UGFnZSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgRGlzY2lwbGluZSBkaXNjaXBsaW5lOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgRGlzY2lwbGluZVJlZmVyZW5jZVdvcmtmbG93UGFnZShGb3JtRWRpdG9yIGVkaXRvcikgewotCQlzdXBlcihlZGl0b3IsIEZPUk1fUEFHRV9JRCwKLQkJCQlBdXRob3JpbmdVSVRleHQuUkVGRVJFTkNFX1dPUktGTE9XX1BBR0VfVElUTEUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2luaXQob3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGUsIG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElFZGl0b3JTaXRlIHNpdGUsIElFZGl0b3JJbnB1dCBpbnB1dCkgewotCQlzdXBlci5pbml0KHNpdGUsIGlucHV0KTsKLQkJZGlzY2lwbGluZSA9IChEaXNjaXBsaW5lKSBjb250ZW50RWxlbWVudDsKLQkJc2V0QWxsb3dDaGFuZ2UxKHRydWUpOwotCQlzZXRBbGxvd0NoYW5nZTIodHJ1ZSk7Ci0JCXNldFVzZUNhdGVnb3J5MihmYWxzZSk7Ci0JCXNldFVzZUNhdGVnb3J5MyhmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjaW5pdENvbnRlbnRQcm92aWRlclNlbGVjdGVkKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0Q29udGVudFByb3ZpZGVyU2VsZWN0ZWQoKSB7Ci0JCWNvbnRlbnRQcm92aWRlclNlbGVjdGVkID0gbmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKAotCQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpIHsKLQkJCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGRpc2NpcGxpbmUuZ2V0UmVmZXJlbmNlV29ya2Zsb3dzKCkudG9BcnJheSgpOwotCQkJfQotCQl9OwotCQl2aWV3ZXJfc2VsZWN0ZWQuc2V0Q29udGVudFByb3ZpZGVyKGNvbnRlbnRQcm92aWRlclNlbGVjdGVkKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNhZGRJdGVtc1RvTW9kZWwxKEFycmF5TGlzdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRJdGVtc1RvTW9kZWwxKEFycmF5TGlzdCBhZGRJdGVtcykgewotCQlmb3IgKEl0ZXJhdG9yIGl0b3IgPSBhZGRJdGVtcy5pdGVyYXRvcigpOyBpdG9yLmhhc05leHQoKTspIHsKLQkJCS8vIE9iamVjdCBvYmplY3QgPSBpdG9yLm5leHQoKTsKLQkJCS8vIGlmIChvYmplY3QgaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50KSB7Ci0JCQkvLyBQcm9jZXNzIHByb2Nlc3MgPQotCQkJLy8gKFByb2Nlc3MpKChQcm9jZXNzQ29tcG9uZW50KW9iamVjdCkuZ2V0UHJvY2VzcygpOwotCQkJLy8gaWYgKHByb2Nlc3MgIT0gbnVsbCkgewotCQkJLy8gZWRpdG9yLmdldEFjdGlvbk1hbmFnZXIoKS5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5BREQsCi0JCQkvLyBkaXNjaXBsaW5lLAotCQkJLy8gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RGlzY2lwbGluZV9SZWZlcmVuY2VXb3JrZmxvd3MoKSwgcHJvY2VzcywKLQkJCS8vIC0xKTsKLQkJCS8vIH0KLQkJCS8vIH0KLQkJCS8vIGVsc2UgewotCQkJLy8gZWRpdG9yLmdldEFjdGlvbk1hbmFnZXIoKS5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5BREQsCi0JCQkvLyBkaXNjaXBsaW5lLAotCQkJLy8gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RGlzY2lwbGluZV9SZWZlcmVuY2VXb3JrZmxvd3MoKSwgb2JqZWN0LAotCQkJLy8gLTEpOwotCQkJLy8gfQotCQkJTWV0aG9kRWxlbWVudCBvYmplY3QgPSAoTWV0aG9kRWxlbWVudCkgaXRvci5uZXh0KCk7Ci0JCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkgewotCQkJCW9iamVjdCA9ICgoUHJvY2Vzc0NvbXBvbmVudCkgb2JqZWN0KS5nZXRQcm9jZXNzKCk7Ci0JCQl9Ci0JCQlpZiAob2JqZWN0ICE9IG51bGwpIHsKLQkJCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkuZ2V0RGlzY2lwbGluZV9SZWZlcmVuY2VXb3JrZmxvd3MoKTsKLQkJCQlpZiAoVXNlckludGVyYWN0aW9uSGVscGVyLmNoZWNrTW9kaWZ5T3Bwb3NpdGUoZGlzY2lwbGluZSwKLQkJCQkJCWZlYXR1cmUsIG9iamVjdCkpIHsKLQkJCQkJZWRpdG9yLmdldEFjdGlvbk1hbmFnZXIoKS5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5BREQsCi0JCQkJCQkJZGlzY2lwbGluZSwgZmVhdHVyZSwgb2JqZWN0LCAtMSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjcmVtb3ZlSXRlbXNGcm9tTW9kZWwxKEFycmF5TGlzdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVJdGVtc0Zyb21Nb2RlbDEoQXJyYXlMaXN0IHJtSXRlbXMpIHsKLQkJLy8gVXBkYXRlIHRoZSBtb2RlbC4KLQkJaWYgKCFybUl0ZW1zLmlzRW1wdHkoKSkgewotCQkJZWRpdG9yLmdldEFjdGlvbk1hbmFnZXIoKS5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5SRU1PVkVfTUFOWSwKLQkJCQkJZGlzY2lwbGluZSwKLQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RGlzY2lwbGluZV9SZWZlcmVuY2VXb3JrZmxvd3MoKSwKLQkJCQkJcm1JdGVtcywgLTEpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjZ2V0Q29udGVudEVsZW1lbnQoKQotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZ2V0Q29udGVudEVsZW1lbnQoKSB7Ci0JCXJldHVybiBkaXNjaXBsaW5lOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2dldFRhYlN0cmluZygpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRUYWJTdHJpbmcoKSB7Ci0JCXJldHVybiBGaWx0ZXJDb25zdGFudHMuUFJPQ0VTU0VTOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2dldEZpbHRlcigpCi0JICovCi0JcHJvdGVjdGVkIElGaWx0ZXIgZ2V0RmlsdGVyKCkgewotCQlyZXR1cm4gZmlsdGVyID0gbmV3IFJlZmVyZW5jZVdvcmtGbG93RmlsdGVyKCk7Ci0JfQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldE11bHRpcGxlU2VsZWN0RGVzY3JpcHRpb24oaW50KQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbihpbnQgY291bnQpIHsKLQkJcmV0dXJuIHN1cGVyLmdldE11bHRpcGxlU2VsZWN0RGVzY3JpcHRpb24oY291bnQsIEF1dGhvcmluZ1VJUmVzb3VyY2VzLmRpc2NpcGxpbmVSZWZlcmVuY2VXb3JrZmxvd1BhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbik7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldFNlY3Rpb25EZXNjcmlwdGlvbigpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTZWN0aW9uRGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy5kaXNjaXBsaW5lUmVmZXJlbmNlV29ya2Zsb3dQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNnZXRTZWN0aW9uTmFtZSgpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTZWN0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLmRpc2NpcGxpbmVSZWZlcmVuY2VXb3JrZmxvd1BhZ2Vfc2VjdGlvbk5hbWU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0U2VsZWN0ZWRMYWJlbCgpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTZWxlY3RlZExhYmVsKCkgewotCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZGlzY2lwbGluZVJlZmVyZW5jZVdvcmtmbG93UGFnZV9zZWxlY3RlZExhYmVsOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNnZXRTZWxlY3RlZExhYmVsMigpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTZWxlY3RlZExhYmVsMigpIHsKLQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLmRpc2NpcGxpbmVSZWZlcmVuY2VXb3JrZmxvd1BhZ2Vfc2VsZWN0ZWRMYWJlbDsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0U2VsZWN0ZWRMYWJlbDMoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VsZWN0ZWRMYWJlbDMoKSB7Ci0JCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy5kaXNjaXBsaW5lUmVmZXJlbmNlV29ya2Zsb3dQYWdlX3NlbGVjdGVkTGFiZWw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL0Rpc2NpcGxpbmVUYXNrc1BhZ2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvRGlzY2lwbGluZVRhc2tzUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NmU2ZDQzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvRGlzY2lwbGluZVRhc2tzUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZpbHRlcnMuQ29udGVudEZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuTW92ZUluTGlzdENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5GaWx0ZXJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkNhdGVnb3J5U29ydEhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuQ29udGVudEVsZW1lbnRPcmRlckxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLk1vZGVsU3RydWN0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuTGlicmFyeU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50Q2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpc2NpcGxpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuZWRpdG9yLkZvcm1FZGl0b3I7Ci0KLQotLyoqCi0gKiBUaGUgVGFza3MgcGFnZSBpbiB0aGUgRGlzY2lwbGluZSBlZGl0b3IuCi0gKiAKLSAqIEBhdXRob3IgTG9rYW5hdGggSmFnZ2EKLSAqIEBhdXRob3IgQmluZ3h1ZSBYdQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBEaXNjaXBsaW5lVGFza3NQYWdlIGV4dGVuZHMgQXNzb2NpYXRpb25Gb3JtUGFnZSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9STV9QQUdFX0lEID0gImRpc2NpcGxpbmVUYXNrc1BhZ2UiOyAvLyROT04tTkxTLTEkCQotCi0JcHJpdmF0ZSBEaXNjaXBsaW5lIGRpc2NpcGxpbmU7Ci0JCi0JcHJpdmF0ZSBDb250ZW50RWxlbWVudE9yZGVyTGlzdCBhbGxTdGVwczsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIERpc2NpcGxpbmVUYXNrc1BhZ2UoRm9ybUVkaXRvciBlZGl0b3IpIHsKLQkJc3VwZXIoZWRpdG9yLCBGT1JNX1BBR0VfSUQsIEF1dGhvcmluZ1VJVGV4dC5UQVNLU19QQUdFX1RJVExFKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNpbml0KG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlLCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJRWRpdG9yU2l0ZSBzaXRlLCBJRWRpdG9ySW5wdXQgaW5wdXQpIHsKLQkJc3VwZXIuaW5pdChzaXRlLCBpbnB1dCk7Ci0JCWRpc2NpcGxpbmUgPSAoRGlzY2lwbGluZSkgY29udGVudEVsZW1lbnQ7Ci0JCXNldFVzZUNhdGVnb3J5MihmYWxzZSk7Ci0JCXNldFVzZUNhdGVnb3J5MyhmYWxzZSk7Ci0JCXNldEFsbG93Q2hhbmdlMSh0cnVlKTsKLQkJc2V0SXNVcEFuZERvd25CdXR0b25zUmVxdWlyZWQxKHRydWUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2luaXRDb250ZW50UHJvdmlkZXJTZWxlY3RlZCgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdENvbnRlbnRQcm92aWRlclNlbGVjdGVkKCkgewotCQljb250ZW50UHJvdmlkZXJTZWxlY3RlZCA9IG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcigKLQkJCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkJLmdldE5hdmlnYXRvclZpZXdfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKSB7Ci0KLQkJCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJLy9yZXR1cm4gKChEaXNjaXBsaW5lKSBvYmplY3QpLmdldFRhc2tzKCkudG9BcnJheSgpOwotCQkJCWlmIChhbGxTdGVwcyA9PSBudWxsKSB7Ci0JCQkJCWFsbFN0ZXBzID0gbmV3IENvbnRlbnRFbGVtZW50T3JkZXJMaXN0KAotCQkJCQkJCWNvbnRlbnRFbGVtZW50LAotCQkJCQkJCUNvbnRlbnRFbGVtZW50T3JkZXJMaXN0LkNPTlRFTlRfRUxFTUVOVFNfX0ZPUl9FTEVNRU5UX09OTFksCi0JCQkJCQkJZ2V0T3JkZXJGZWF0dXJlKCkpOwotCQkJCX0KLQkJCQlMaXN0IHJldHVybkxpc3QgPSBDYXRlZ29yeVNvcnRIZWxwZXIuc29ydENhdGVnb3J5RWxlbWVudHMoY29udGVudEVsZW1lbnQsIAotCQkJCQkJYWxsU3RlcHMudG9BcnJheSgpKTsKLQkJCQlyZXR1cm4gcmV0dXJuTGlzdC50b0FycmF5KCk7Ci0JCQl9Ci0JCX07Ci0JCXZpZXdlcl9zZWxlY3RlZC5zZXRDb250ZW50UHJvdmlkZXIoY29udGVudFByb3ZpZGVyU2VsZWN0ZWQpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2FkZEl0ZW1zVG9Nb2RlbDEoQXJyYXlMaXN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEl0ZW1zVG9Nb2RlbDEoQXJyYXlMaXN0IGFkZEl0ZW1zKSB7Ci0JCS8vIFVwZGF0ZSB0aGUgbW9kZWwuCi0JCWlmICghYWRkSXRlbXMuaXNFbXB0eSgpKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gYWRkSXRlbXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCVRhc2sgdGFzayA9IChUYXNrKSBpdC5uZXh0KCk7Ci0JCQkJCi0JCQkJLy8JY2hlY2sgdG8gbWFpbnRhaW4gbWFueS10by1vbmUgcnVsZSBmb3IgZG9tYWluLXdvcmtwcm9kdWN0Ci0vLwkJCQlMaXN0IGRpc2NpcGxpbmVzID0gQXNzb2NpYXRpb25IZWxwZXIuZ2V0RGlzY2lwbGluZXModGFzayk7Ci0vLwkJCQlpZiAoZGlzY2lwbGluZXMgIT0gbnVsbCAmJiBkaXNjaXBsaW5lcy5zaXplKCkgPiAwKQl7Ci0vLwkJCQkJT2JqZWN0IGFzc29jaWF0ZWREaXNjaXBsaW5lID0gZGlzY2lwbGluZXMuZ2V0KDApOwotLy8JCQkJCVN0cmluZyBtc2cgPSBNZXNzYWdlRm9ybWF0Ci0vLwkJCQkJLmZvcm1hdCgKLS8vCQkJCQkJCUxpYnJhcnlFZGl0UmVzb3VyY2VzLlVzZXJJbnRlcmFjdGlvbkhlbHBlcl9lcnJSZWxhdGlvbnNoaXBFeGlzdHMsCi0vLwkJCQkJCQluZXcgT2JqZWN0W10gewotLy8JCQkJCQkJCQl0YXNrLmdldE5hbWUoKSwKLS8vCQkJCQkJCQkJVG5nVXRpbAotLy8JCQkJCQkJCQkJCS5nZXRMYWJlbFdpdGhQYXRoKGFzc29jaWF0ZWREaXNjaXBsaW5lKSwKLS8vCQkJCQkJCQkJZGlzY2lwbGluZS5nZXROYW1lKCkgfSk7Ci0vLwkJCQkJTWVzc2VuZ2VyLklOU1RBTkNFLnNob3dXYXJuaW5nKAotLy8JCQkJCQkJTGlicmFyeUVkaXRSZXNvdXJjZXMuZXJyb3JEaWFsb2dfdGl0bGUsIG1zZyk7Ci0vLwkJCQkJcmV0dXJuOwotLy8JCQkJfQotCQkJCQotCQkJCUxpYnJhcnlNYW5hZ2VyLmdldEluc3RhbmNlKCkuYWRkVG9EaXNjaXBsaW5lKAotCQkJCQkJZ2V0QWN0aW9uTWFuYWdlcigpLCBkaXNjaXBsaW5lLCB0YXNrLCB1c2VkQ2F0ZWdvcmllcyk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNyZW1vdmVJdGVtc0Zyb21Nb2RlbDEoQXJyYXlMaXN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbW92ZUl0ZW1zRnJvbU1vZGVsMShBcnJheUxpc3Qgcm1JdGVtcykgewotCQkvLyBVcGRhdGUgdGhlIG1vZGVsLgotCQlpZiAoIXJtSXRlbXMuaXNFbXB0eSgpKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gcm1JdGVtcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJVGFzayB0YXNrID0gKFRhc2spIGl0Lm5leHQoKTsKLQkJCQlMaWJyYXJ5TWFuYWdlci5nZXRJbnN0YW5jZSgpLnJlbW92ZUZyb21EaXNjaXBsaW5lKAotCQkJCQkJZ2V0QWN0aW9uTWFuYWdlcigpLCBkaXNjaXBsaW5lLCB0YXNrLCB1c2VkQ2F0ZWdvcmllcyk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRDb250ZW50RWxlbWVudCgpCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBnZXRDb250ZW50RWxlbWVudCgpIHsKLQkJcmV0dXJuIGRpc2NpcGxpbmU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjZ2V0VGFiU3RyaW5nKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFRhYlN0cmluZygpIHsKLQkJcmV0dXJuIEZpbHRlckNvbnN0YW50cy5UQVNLUzsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRGaWx0ZXIoKQotCSAqLwotCXByb3RlY3RlZCBJRmlsdGVyIGdldEZpbHRlcigpIHsKLQkJcmV0dXJuIGZpbHRlciA9IG5ldyBDb250ZW50RmlsdGVyKCkgewotCQkJcHJvdGVjdGVkIGJvb2xlYW4gY2hpbGRBY2NlcHQoT2JqZWN0IG9iaikgewotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBDb250ZW50RWxlbWVudCkgewotCQkJCQlpZiAoZ2V0SGVscGVyKCkuaXNDb250cmlidXRvcigoQ29udGVudEVsZW1lbnQpIG9iaikpCi0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJCXJldHVybiAob2JqIGluc3RhbmNlb2YgVGFzayk7Ci0JCQl9Ci0JCX07Ci0JfQotCQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNnZXRNdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uKGludCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldE11bHRpcGxlU2VsZWN0RGVzY3JpcHRpb24oaW50IGNvdW50KSB7Ci0JCXJldHVybiBzdXBlci5nZXRNdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uKGNvdW50LCBBdXRob3JpbmdVSVJlc291cmNlcy5kaXNjaXBsaW5lVGFza3NQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb24pOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNnZXRTZWN0aW9uRGVzY3JpcHRpb24oKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VjdGlvbkRlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZGlzY2lwbGluZVRhc2tzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb247Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0U2VjdGlvbk5hbWUoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VjdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy5kaXNjaXBsaW5lVGFza3NQYWdlX3NlY3Rpb25OYW1lOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldFNlbGVjdGVkTGFiZWwoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VsZWN0ZWRMYWJlbCgpIHsKLQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLmRpc2NpcGxpbmVUYXNrc1BhZ2Vfc2VsZWN0ZWRMYWJlbDsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0U2VsZWN0ZWRMYWJlbDIoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VsZWN0ZWRMYWJlbDIoKSB7Ci0JCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy5kaXNjaXBsaW5lVGFza3NQYWdlX3NlbGVjdGVkTGFiZWw7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldFNlbGVjdGVkTGFiZWwzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlbGVjdGVkTGFiZWwzKCkgewotCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZGlzY2lwbGluZVRhc2tzUGFnZV9zZWxlY3RlZExhYmVsOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFU3RydWN0dXJhbEZlYXR1cmUgZ2V0T3JkZXJGZWF0dXJlKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RGlzY2lwbGluZV9UYXNrcygpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nW10gZ2V0TW9kZWxTdHJ1Y3R1cmVQYXRoKCkgewotCQlyZXR1cm4gTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC5kaXNjaXBsaW5lRGVmaW5pdGlvblBhdGg7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBDb250ZW50RWxlbWVudE9yZGVyTGlzdCBnZXRDb250ZW50RWxlbWVudE9yZGVyTGlzdCgpIHsKLQkJcmV0dXJuIGFsbFN0ZXBzOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9Eb21haW5EZXNjcmlwdGlvblBhZ2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvRG9tYWluRGVzY3JpcHRpb25QYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkZWUxZTguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9Eb21haW5EZXNjcmlwdGlvblBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZmlsdGVycy5DYXRlZ29yeUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5GaWx0ZXJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5WYXJpYWJpbGl0eUJhc2VFbGVtZW50RmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuRm9ybUVkaXRvcjsKLQotCi0vKioKLSAqIFRoZSBEZXNjcmlwdGlvbiBwYWdlIGZvciB0aGUgRG9tYWluIGVkaXRvci4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRG9tYWluRGVzY3JpcHRpb25QYWdlIGV4dGVuZHMgRGVzY3JpcHRpb25Gb3JtUGFnZSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9STV9QQUdFX0lEID0gImRvbWFpbkRlc2NyaXB0aW9uUGFnZSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgRG9tYWluIGRvbWFpbjsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIERvbWFpbkRlc2NyaXB0aW9uUGFnZShGb3JtRWRpdG9yIGVkaXRvcikgewotCQlzdXBlcihlZGl0b3IsIEZPUk1fUEFHRV9JRCwgQXV0aG9yaW5nVUlUZXh0LkRFU0NSSVBUSU9OX1BBR0VfVElUTEUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2luaXQob3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGUsIG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElFZGl0b3JTaXRlIHNpdGUsIElFZGl0b3JJbnB1dCBpbnB1dCkgewotCQlzdXBlci5pbml0KHNpdGUsIGlucHV0KTsKLQkJZG9tYWluID0gKERvbWFpbikgY29udGVudEVsZW1lbnQ7Ci0JCXNldEV4dGVybmFsSURPbih0cnVlKTsKLQkJc2V0TG9uZ1ByZXNlbnRhdGlvbk5hbWVPbih0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRDb250ZW50RWxlbWVudCgpCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBnZXRDb250ZW50RWxlbWVudCgpIHsKLQkJcmV0dXJuIGRvbWFpbjsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRGaWx0ZXIoKQotCSAqLwotCXByb3RlY3RlZCBJRmlsdGVyIGdldEZpbHRlcigpIHsKLQkJZmlsdGVyID0gbmV3IENhdGVnb3J5RmlsdGVyKCkgewotCQkJcHJvdGVjdGVkIGJvb2xlYW4gY2hpbGRBY2NlcHQoT2JqZWN0IG9iaikgewotCQkJCXJldHVybiAob2JqIGluc3RhbmNlb2YgRG9tYWluKTsKLQkJCX0KLQkJfTsKLQotCQkvLyBzZXQgYWRkaXRpb25hbCBmaWx0ZXIgZm9yIHZhcmlhYmlsaXR5IGJhc2UgZWxlbWVudCBjaGVja2luZwotCQkoKENhdGVnb3J5RmlsdGVyKSBmaWx0ZXIpCi0JCQkJLnNldEFkZGl0aW9uYWxGaWx0ZXJzKG5ldyBJRmlsdGVyW10geyBuZXcgVmFyaWFiaWxpdHlCYXNlRWxlbWVudEZpbHRlcigKLQkJCQkJCWRvbWFpbikgfSk7Ci0JCXJldHVybiBmaWx0ZXI7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRUYWJTdHJpbmcoKSB7Ci0JCXJldHVybiBGaWx0ZXJDb25zdGFudHMuRE9NQUlOUzsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjbG9hZFNlY3Rpb25EZXNjcmlwdGlvbigpCi0JICovCi0JcHVibGljIHZvaWQgbG9hZFNlY3Rpb25EZXNjcmlwdGlvbigpIHsKLQkJdGhpcy5nZW5lcmFsU2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZG9tYWluX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjOwotCQl0aGlzLmRldGFpbFNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmRvbWFpbl9kZXRhaWxTZWN0aW9uX2Rlc2M7Ci0JCXRoaXMudmFyaWFiaWxpdHlTZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy5kb21haW5fdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M7Ci0JCXRoaXMudmVyc2lvblNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmRvbWFpbl92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYzsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvRG9tYWluV29ya1Byb2R1Y3RzUGFnZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9Eb21haW5Xb3JrUHJvZHVjdHNQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjNWQ0OGMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9Eb21haW5Xb3JrUHJvZHVjdHNQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3JtczsKLQotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5NZXRob2RFbGVtZW50RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZmlsdGVycy5Xb3JrUHJvZHVjdEZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JQWN0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuTW92ZUluTGlzdENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5GaWx0ZXJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkNhdGVnb3J5U29ydEhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuQ29udGVudEVsZW1lbnRPcmRlckxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLk1lc3NlbmdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuTW9kZWxTdHJ1Y3R1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50Q2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkFzc29jaWF0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuRm9ybUVkaXRvcjsKLQotCi0vKioKLSAqIFRoZSBXb3JrIFByb2R1Y3RzIHBhZ2UgaW4gdGhlIERvbWFpbiBlZGl0b3IuCi0gKiAKLSAqIEBhdXRob3IgTG9rYW5hdGggSmFnZ2EKLSAqIEBhdXRob3IgQmluZ3h1ZSBYdQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKiByZW1vdmUgdGhlIHRvLW9uZSBVSSByZXN0cmljdGlvbiBvbiB3cC1kb21pYW4gKFIzOTUzOTApIDIwMDctMDgtMzAKLSAqLwotcHVibGljIGNsYXNzIERvbWFpbldvcmtQcm9kdWN0c1BhZ2UgZXh0ZW5kcyBBc3NvY2lhdGlvbkZvcm1QYWdlIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JNX1BBR0VfSUQgPSAiZG9tYWluV29ya1Byb2R1Y3RzUGFnZSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgRG9tYWluIGRvbWFpbjsKLQotCXByaXZhdGUgSUFjdGlvbk1hbmFnZXIgYWN0aW9uTWdyOwotCQotCXByaXZhdGUgQ29udGVudEVsZW1lbnRPcmRlckxpc3QgYWxsU3RlcHM7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBEb21haW5Xb3JrUHJvZHVjdHNQYWdlKEZvcm1FZGl0b3IgZWRpdG9yKSB7Ci0JCXN1cGVyKGVkaXRvciwgRk9STV9QQUdFX0lELCBBdXRob3JpbmdVSVRleHQuV09SS19QUk9EVUNUU19QQUdFX1RJVExFKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNpbml0KG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlLCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJRWRpdG9yU2l0ZSBzaXRlLCBJRWRpdG9ySW5wdXQgaW5wdXQpIHsKLQkJc3VwZXIuaW5pdChzaXRlLCBpbnB1dCk7Ci0JCWRvbWFpbiA9IChEb21haW4pIGNvbnRlbnRFbGVtZW50OwotCQlhY3Rpb25NZ3IgPSAoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpKS5nZXRBY3Rpb25NYW5hZ2VyKCk7Ci0JCXNldFVzZUNhdGVnb3J5MihmYWxzZSk7Ci0JCXNldFVzZUNhdGVnb3J5MyhmYWxzZSk7Ci0JCXNldElzVXBBbmREb3duQnV0dG9uc1JlcXVpcmVkMSh0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNpbml0Q29udGVudFByb3ZpZGVyU2VsZWN0ZWQoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRDb250ZW50UHJvdmlkZXJTZWxlY3RlZCgpIHsKLQkJY29udGVudFByb3ZpZGVyU2VsZWN0ZWQgPSBuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoCi0JCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJCS5nZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSkgewotCQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBvYmplY3QpIHsKLQkJCQkvL3JldHVybiAoKERvbWFpbikgb2JqZWN0KS5nZXRXb3JrUHJvZHVjdHMoKS50b0FycmF5KCk7Ci0JCQkJaWYgKGFsbFN0ZXBzID09IG51bGwpIHsKLQkJCQkJYWxsU3RlcHMgPSBuZXcgQ29udGVudEVsZW1lbnRPcmRlckxpc3QoCi0JCQkJCQkJY29udGVudEVsZW1lbnQsCi0JCQkJCQkJQ29udGVudEVsZW1lbnRPcmRlckxpc3QuQ09OVEVOVF9FTEVNRU5UU19fRk9SX0VMRU1FTlRfT05MWSwKLQkJCQkJCQlnZXRPcmRlckZlYXR1cmUoKSk7Ci0JCQkJfQotCQkJCUxpc3QgcmV0dXJuTGlzdCA9IENhdGVnb3J5U29ydEhlbHBlci5zb3J0Q2F0ZWdvcnlFbGVtZW50cygKLQkJCQkJCWNvbnRlbnRFbGVtZW50LCBhbGxTdGVwcy50b0FycmF5KCkpOwotCQkJCXJldHVybiByZXR1cm5MaXN0LnRvQXJyYXkoKTsKLQkJCX0KLQkJfTsKLQkJdmlld2VyX3NlbGVjdGVkLnNldENvbnRlbnRQcm92aWRlcihjb250ZW50UHJvdmlkZXJTZWxlY3RlZCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjYWRkSXRlbXNUb01vZGVsMShBcnJheUxpc3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkSXRlbXNUb01vZGVsMShBcnJheUxpc3QgYWRkSXRlbXMpIHsKLQkJLy8gVXVwZGF0ZSB0aGUgbW9kZWwuCi0JCWlmICghYWRkSXRlbXMuaXNFbXB0eSgpKSB7Ci0JCQkJLy8gY2hlY2sgdG8gbWFpbnRhaW4gbWFueS10by1vbmUgcnVsZSBmb3IgZG9tYWluLXdvcmtwcm9kdWN0Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBhZGRJdGVtcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlNZXRob2RFbGVtZW50IGVsZW1lbnQgPSAoTWV0aG9kRWxlbWVudCkgaXRlci5uZXh0KCk7Ci0JCQkJTGlzdCBkb21haW5zID0gQXNzb2NpYXRpb25IZWxwZXIuZ2V0RG9tYWlucygoV29ya1Byb2R1Y3QpIGVsZW1lbnQpOwotCQkJCWlmIChkb21haW5zICE9IG51bGwgJiYgZG9tYWlucy5zaXplKCkgPiAwKQl7Ci0JCQkJCU9iamVjdCBhc3NvY2lhdGVkRG9tYWluID0gZG9tYWlucy5nZXQoMCk7Ci0vLwkJCQkJU3RyaW5nIG1zZyA9IE1lc3NhZ2VGb3JtYXQKLS8vCQkJCQkuZm9ybWF0KAotLy8JCQkJCQkJTGlicmFyeUVkaXRSZXNvdXJjZXMuVXNlckludGVyYWN0aW9uSGVscGVyX2VyclJlbGF0aW9uc2hpcEV4aXN0cywKLS8vCQkJCQkJCW5ldyBPYmplY3RbXSB7Ci0vLwkJCQkJCQkJCWVsZW1lbnQuZ2V0TmFtZSgpLAotLy8JCQkJCQkJCQlUbmdVdGlsCi0vLwkJCQkJCQkJCQkJLmdldExhYmVsV2l0aFBhdGgoYXNzb2NpYXRlZERvbWFpbiksCi0vLwkJCQkJCQkJCWRvbWFpbi5nZXROYW1lKCkgfSk7Ci0vLwkJCQkJTWVzc2VuZ2VyLklOU1RBTkNFLnNob3dXYXJuaW5nKAotLy8JCQkJCQkJTGlicmFyeUVkaXRSZXNvdXJjZXMuZXJyb3JEaWFsb2dfdGl0bGUsIG1zZyk7Ci0vLwkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQkvLyBjaGVjayBpZiB0aGlzIG9wZXJhdGlvbiB3aWxsIG1vZGlmeSB0aGUgZWxlbWVudCBpbiBvcHBvc2l0ZQotCQkJCS8vIGZlYXR1cmUgdmFsdWUKLQkJCQkvLwkKLS8vCQkJCWlmICghVXNlckludGVyYWN0aW9uSGVscGVyLmNoZWNrTW9kaWZ5T3Bwb3NpdGUoZG9tYWluLAotLy8JCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXREb21haW5fV29ya1Byb2R1Y3RzKCksIGVsZW1lbnQpKSB7Ci0vLwkJCQkJcmV0dXJuOwotLy8JCQkJfQotCQkJfQotCi0JCQlhY3Rpb25NZ3IKLQkJCQkJLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLkFERF9NQU5ZLCBkb21haW4sCi0JCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RG9tYWluX1dvcmtQcm9kdWN0cygpLAotCQkJCQkJCWFkZEl0ZW1zLCAtMSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNyZW1vdmVJdGVtc0Zyb21Nb2RlbDEoQXJyYXlMaXN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbW92ZUl0ZW1zRnJvbU1vZGVsMShBcnJheUxpc3Qgcm1JdGVtcykgewotCQkvLyBVcGRhdGUgdGhlIG1vZGVsLgotCQlpZiAoIXJtSXRlbXMuaXNFbXB0eSgpKSB7Ci0JCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuUkVNT1ZFX01BTlksIGRvbWFpbiwKLQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RG9tYWluX1dvcmtQcm9kdWN0cygpLCBybUl0ZW1zLCAtMSk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjZ2V0Q29udGVudEVsZW1lbnQoKQotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZ2V0Q29udGVudEVsZW1lbnQoKSB7Ci0JCXJldHVybiBkb21haW47Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjZ2V0VGFiU3RyaW5nKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFRhYlN0cmluZygpIHsKLQkJcmV0dXJuIEZpbHRlckNvbnN0YW50cy5XT1JLUFJPRFVDVFM7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjZ2V0RmlsdGVyKCkKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpbHRlciBnZXRGaWx0ZXIoKSB7Ci0JCXJldHVybiBmaWx0ZXIgPSBuZXcgV29ya1Byb2R1Y3RGaWx0ZXIoKSB7Ci0JCQlwcm90ZWN0ZWQgYm9vbGVhbiBjaGlsZEFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIENvbnRlbnRFbGVtZW50KSB7Ci0JCQkJCWlmIChnZXRIZWxwZXIoKS5pc0NvbnRyaWJ1dG9yKChDb250ZW50RWxlbWVudCkgb2JqKSkKLQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQkJcmV0dXJuIChvYmogaW5zdGFuY2VvZiBXb3JrUHJvZHVjdCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0TXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbihpbnQpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRNdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uKGludCBjb3VudCkgewotCQlyZXR1cm4gc3VwZXIuZ2V0TXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbihjb3VudCwgQXV0aG9yaW5nVUlSZXNvdXJjZXMuZG9tYWluV29ya1Byb2R1Y3RzUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uKTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0U2VjdGlvbkRlc2NyaXB0aW9uKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlY3Rpb25EZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLmRvbWFpbldvcmtQcm9kdWN0c1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldFNlY3Rpb25OYW1lKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlY3Rpb25OYW1lKCkgewotCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZG9tYWluV29ya1Byb2R1Y3RzUGFnZV9zZWN0aW9uTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNnZXRTZWxlY3RlZExhYmVsKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlbGVjdGVkTGFiZWwoKSB7Ci0JCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy5kb21haW5Xb3JrUHJvZHVjdHNQYWdlX3NlbGVjdGVkTGFiZWw7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldFNlbGVjdGVkTGFiZWwyKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlbGVjdGVkTGFiZWwyKCkgewotCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZG9tYWluV29ya1Byb2R1Y3RzUGFnZV9zZWxlY3RlZExhYmVsOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNnZXRTZWxlY3RlZExhYmVsMygpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTZWxlY3RlZExhYmVsMygpIHsKLQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLmRvbWFpbldvcmtQcm9kdWN0c1BhZ2Vfc2VsZWN0ZWRMYWJlbDsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVTdHJ1Y3R1cmFsRmVhdHVyZSBnZXRPcmRlckZlYXR1cmUoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXREb21haW5fV29ya1Byb2R1Y3RzKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmdbXSBnZXRNb2RlbFN0cnVjdHVyZVBhdGgoKSB7Ci0JCXJldHVybiBNb2RlbFN0cnVjdHVyZS5ERUZBVUxULmRvbWFpblBhdGg7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBDb250ZW50RWxlbWVudE9yZGVyTGlzdCBnZXRDb250ZW50RWxlbWVudE9yZGVyTGlzdCgpIHsKLQkJcmV0dXJuIGFsbFN0ZXBzOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9HdWlkYW5jZURlc2NyaXB0aW9uUGFnZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9HdWlkYW5jZURlc2NyaXB0aW9uUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZGYxMzRlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvR3VpZGFuY2VEZXNjcmlwdGlvblBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzOCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuTWV0aG9kRWxlbWVudEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZpbHRlcnMuQ29udGVudEZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnJpY2h0ZXh0LklNZXRob2RSaWNoVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklBY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuRmlsdGVyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuVmFyaWFiaWxpdHlCYXNlRWxlbWVudEZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5MaWJyYXJ5VUlUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ2hlY2tsaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29uY2VwdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRXhhbXBsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkd1aWRhbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3VpZGVsaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJhY3RpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5SZXBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5SZXVzYWJsZUFzc2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9hZG1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlN1cHBvcnRpbmdNYXRlcmlhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRlbXBsYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGVybURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Ub29sTWVudG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldoaXRlcGFwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuZWRpdG9yLkZvcm1FZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5Gb3JtVG9vbGtpdDsKLQotCi0vKioKLSAqIFRoZSBEZXNjcmlwdGlvbiBwYWdlIGluIGEgR3VpZGFuY2UgZWRpdG9yLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBHdWlkYW5jZURlc2NyaXB0aW9uUGFnZSBleHRlbmRzIERlc2NyaXB0aW9uRm9ybVBhZ2UgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZPUk1fUEFHRV9JRCA9ICJndWlkYW5jZURlc2NyaXB0aW9uUGFnZSI7IC8vJE5PTi1OTFMtMSQKLQotCXByb3RlY3RlZCBHdWlkYW5jZSBndWlkYW5jZTsKLQotCXByaXZhdGUgU3RyaW5nIGVsZW1lbnRMYWJlbDsKLQotCXByaXZhdGUgSU1ldGhvZFJpY2hUZXh0IGN0cmxfY29udGVudDsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBjb250ZW50T24gPSB0cnVlOwotCi0JcHJpdmF0ZSBpbnQgY29udGVudEZpZWxkSGVpZ2h0ID0gNDAwOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgR3VpZGFuY2VEZXNjcmlwdGlvblBhZ2UoRm9ybUVkaXRvciBlZGl0b3IpIHsKLQkJc3VwZXIoZWRpdG9yLCBGT1JNX1BBR0VfSUQsIEF1dGhvcmluZ1VJVGV4dC5ERVNDUklQVElPTl9QQUdFX1RJVExFKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNpbml0KG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlLCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJRWRpdG9yU2l0ZSBzaXRlLCBJRWRpdG9ySW5wdXQgaW5wdXQpIHsKLQkJc3VwZXIuaW5pdChzaXRlLCBpbnB1dCk7Ci0JCWd1aWRhbmNlID0gKEd1aWRhbmNlKSBjb250ZW50RWxlbWVudDsKLQkJZWxlbWVudExhYmVsID0gTGlicmFyeVVJVGV4dC5nZXRVSVRleHQoZ3VpZGFuY2UpOwotCQlzZXRFbGVtZW50VHlwZU9uKHRydWUpOwotCQlpZiAoZ3VpZGFuY2UgaW5zdGFuY2VvZiBUZXJtRGVmaW5pdGlvbikKLQkJCXNldEJyaWVmRGVzY09uKGZhbHNlKTsKLQkJc2V0RnVsbERlc2NPbihmYWxzZSk7Ci0JCXNldEtleUNvbnNpZGVyYXRpb25PbihmYWxzZSk7Ci0JCXNldEljb25TZWN0aW9uT24odHJ1ZSk7Ci0JCXNldEV4dGVybmFsSURPbih0cnVlKTsKLQkJc2V0TG9uZ1ByZXNlbnRhdGlvbk5hbWVPbih0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRGb3JtUHJlZml4KCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEZvcm1QcmVmaXgoKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nQnVmZmVyKExpYnJhcnlVSVRleHQuVEVYVF9HVUlEQU5DRSkKLQkJCQkuYXBwZW5kKCIgKCIpLmFwcGVuZChlbGVtZW50TGFiZWwpLmFwcGVuZCgiKTogIikudG9TdHJpbmcoKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCQotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIGVkaXRvciB0YWIgY29udGVudAotCSAqIAotCSAqIEBwYXJhbSB0b29sa2l0Ci0JICogICAgICAgICAgICBUaGUgZm9ybSB0b29sa2l0LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUVkaXRvckNvbnRlbnQoRm9ybVRvb2xraXQgdG9vbGtpdCkgewotCQlzdXBlci5jcmVhdGVFZGl0b3JDb250ZW50KHRvb2xraXQpOwotCQlpZiAoY29udGVudE9uKSB7Ci0JCQljdHJsX2NvbnRlbnQgPSBjcmVhdGVSaWNoVGV4dEVkaXRXaXRoTGlua0ZvclNlY3Rpb24odG9vbGtpdCwKLQkJCQkJZGV0YWlsQ29tcG9zaXRlLCBBdXRob3JpbmdVSVRleHQuTUFJTl9ERVNDUklQVElPTl9URVhULAotCQkJCQljb250ZW50RmllbGRIZWlnaHQsIDQwMCwgREVUQUlMX1NFQ1RJT05fSUQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjYWRkTGlzdGVuZXJzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRMaXN0ZW5lcnMoKSB7Ci0JCXN1cGVyLmFkZExpc3RlbmVycygpOwotCQlpZiAoY29udGVudE9uKSB7Ci0JCi0JCQlmaW5hbCBNZXRob2RFbGVtZW50RWRpdG9yIGVkaXRvciA9IChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKTsKLQkKLQkJCWN0cmxfY29udGVudC5zZXRNb2RhbE9iamVjdChjb250ZW50RWxlbWVudC5nZXRQcmVzZW50YXRpb24oKSk7Ci0JCQljdHJsX2NvbnRlbnQuc2V0TW9kYWxPYmplY3RGZWF0dXJlKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCS5nZXRDb250ZW50RGVzY3JpcHRpb25fTWFpbkRlc2NyaXB0aW9uKCkpOwotCQkJY3RybF9jb250ZW50LmFkZE1vZGlmeUxpc3RlbmVyKGNvbnRlbnRNb2RpZnlMaXN0ZW5lcik7Ci0JCQljdHJsX2NvbnRlbnQuYWRkTGlzdGVuZXIoU1dULkRlYWN0aXZhdGUsIG5ldyBMaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJCUlNZXRob2RSaWNoVGV4dCBjb250cm9sID0gZGVzY0V4cGFuZEZsYWcgPyBjdHJsX2V4cGFuZGVkCi0JCQkJCQkJOiBjdHJsX2NvbnRlbnQ7Ci0JCQkJCWlmICghY29udHJvbC5nZXRNb2RpZmllZCgpKSB7Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCX0KLQkJCQkJU3RyaW5nIG9sZENvbnRlbnQgPSBndWlkYW5jZS5nZXRQcmVzZW50YXRpb24oKQotCQkJCQkJCS5nZXRNYWluRGVzY3JpcHRpb24oKTsKLQkJCQkJaWYgKCgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpLm11c3RSZXN0b3JlVmFsdWUoCi0JCQkJCQkJY29udHJvbCwgb2xkQ29udGVudCkpIHsKLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCQlTdHJpbmcgbmV3Q29udGVudCA9IGNvbnRyb2wuZ2V0VGV4dCgpOwotCQkJCQlpZiAoIW5ld0NvbnRlbnQuZXF1YWxzKG9sZENvbnRlbnQpKSB7Ci0JCQkJCQlib29sZWFuIHN1Y2Nlc3MgPSBlZGl0b3IuZ2V0QWN0aW9uTWFuYWdlcigpLmRvQWN0aW9uKAotCQkJCQkJCQlJQWN0aW9uTWFuYWdlci5TRVQsCi0JCQkJCQkJCWNvbnRlbnRFbGVtZW50LmdldFByZXNlbnRhdGlvbigpLAotCQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJCS5nZXRDb250ZW50RGVzY3JpcHRpb25fTWFpbkRlc2NyaXB0aW9uKCksCi0JCQkJCQkJCW5ld0NvbnRlbnQsIC0xKTsKLQkJCQkJCWlmIChzdWNjZXNzICYmIGlzVmVyc2lvblNlY3Rpb25PbigpKSB7Ci0JCQkJCQkJdXBkYXRlQ2hhbmdlRGF0ZSgpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNyZWZyZXNoKGJvb2xlYW4pCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaChib29sZWFuIGVkaXRhYmxlKSB7Ci0JCXN1cGVyLnJlZnJlc2goZWRpdGFibGUpOwotCQlpZiAoY29udGVudE9uKSB7Ci0JCQljdHJsX2NvbnRlbnQuc2V0RWRpdGFibGUoZWRpdGFibGUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjbG9hZERhdGEoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGxvYWREYXRhKCkgewotCQlzdXBlci5sb2FkRGF0YSgpOwotCQlpZiAoY29udGVudE9uKSB7Ci0JCQlpZiAoZ3VpZGFuY2UgIT0gbnVsbCkgewotCQkJCVN0cmluZyBjb250ZW50ID0gbnVsbDsKLQkJCQlpZiAoZ3VpZGFuY2UuZ2V0UHJlc2VudGF0aW9uKCkgIT0gbnVsbCkgewotCQkJCQljb250ZW50ID0gZ3VpZGFuY2UuZ2V0UHJlc2VudGF0aW9uKCkuZ2V0TWFpbkRlc2NyaXB0aW9uKCk7Ci0JCQkJfQotCQkJCWN0cmxfY29udGVudC5zZXRUZXh0KGNvbnRlbnQgPT0gbnVsbCA/ICIiIDogY29udGVudCk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2dldENvbnRlbnRFbGVtZW50KCkKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGdldENvbnRlbnRFbGVtZW50KCkgewotCQlyZXR1cm4gZ3VpZGFuY2U7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgaGVpZ2h0IG9mIHRoZSBNYWluIERlc2NyaXB0aW9uIHRleHQgYm94LgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0Q29udGVudEZpZWxkSGVpZ2h0KCkgewotCQlyZXR1cm4gY29udGVudEZpZWxkSGVpZ2h0OwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGhlaWdodCBvZiB0aGUgTWFpbiBEZXNjcmlwdGlvbiB0ZXh0IGJveC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb250ZW50RmllbGRIZWlnaHQoaW50IGNvbnRlbnRGaWVsZEhlaWdodCkgewotCQl0aGlzLmNvbnRlbnRGaWVsZEhlaWdodCA9IGNvbnRlbnRGaWVsZEhlaWdodDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRUYWJTdHJpbmcoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0VGFiU3RyaW5nKCkgewotCQlyZXR1cm4gRmlsdGVyQ29uc3RhbnRzLkdVSURBTkNFOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2dldEZpbHRlcigpCi0JICovCi0JcHJvdGVjdGVkIElGaWx0ZXIgZ2V0RmlsdGVyKCkgewotCQlmaWx0ZXIgPSBuZXcgQ29udGVudEZpbHRlcigpIHsKLQkJCXByb3RlY3RlZCBib29sZWFuIGNoaWxkQWNjZXB0KE9iamVjdCBvYmopIHsKLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgR3VpZGFuY2UpIHsKLQkJCQkJcmV0dXJuICgoKENvbnRlbnRFbGVtZW50KSBvYmopLmdldFR5cGUoKQotCQkJCQkJCS5lcXVhbHMoKChHdWlkYW5jZSkgY29udGVudEVsZW1lbnQpLmdldFR5cGUoKSkpOwotCQkJCX0KLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX07Ci0KLQkJLy8gU2V0IGFkZGl0aW9uYWwgZmlsdGVyIGZvciB2YXJpYWJpbGl0eSBiYXNlIGVsZW1lbnQgY2hlY2tpbmcuCi0JCSgoQ29udGVudEZpbHRlcikgZmlsdGVyKQotCQkJCS5zZXRBZGRpdGlvbmFsRmlsdGVycyhuZXcgSUZpbHRlcltdIHsgbmV3IFZhcmlhYmlsaXR5QmFzZUVsZW1lbnRGaWx0ZXIoCi0JCQkJCQlndWlkYW5jZSkgfSk7Ci0JCXJldHVybiBmaWx0ZXI7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2xvYWRTZWN0aW9uRGVzY3JpcHRpb24oKQotCSAqLwotCXB1YmxpYyB2b2lkIGxvYWRTZWN0aW9uRGVzY3JpcHRpb24oKSB7Ci0JCWlmKGNvbnRlbnRFbGVtZW50IGluc3RhbmNlb2YgV2hpdGVwYXBlcil7Ci0JCQl0aGlzLmdlbmVyYWxTZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy53aGl0ZXBhcGVyX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjOwotCQkJdGhpcy5kZXRhaWxTZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy53aGl0ZXBhcGVyX2RldGFpbFNlY3Rpb25fZGVzYzsKLQkJCXRoaXMudmFyaWFiaWxpdHlTZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy53aGl0ZXBhcGVyX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjOwotCQkJdGhpcy52ZXJzaW9uU2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMud2hpdGVwYXBlcl92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYzsKLQkJCXRoaXMuaWNvblNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLndoaXRlcGFwZXJfaWNvblNlY3Rpb25fZGVzYzsKLQkJfQotCQllbHNlIGlmKGNvbnRlbnRFbGVtZW50IGluc3RhbmNlb2YgQ29uY2VwdCl7Ci0JCQl0aGlzLmdlbmVyYWxTZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy5jb25jZXB0X2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjOwotCQkJdGhpcy5kZXRhaWxTZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy5jb25jZXB0X2RldGFpbFNlY3Rpb25fZGVzYzsKLQkJCXRoaXMudmFyaWFiaWxpdHlTZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy5jb25jZXB0X3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjOwotCQkJdGhpcy52ZXJzaW9uU2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuY29uY2VwdF92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYzsKLQkJCXRoaXMuaWNvblNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmNvbmNlcHRfaWNvblNlY3Rpb25fZGVzYzsKLQkJfQotCQllbHNlIGlmKGNvbnRlbnRFbGVtZW50IGluc3RhbmNlb2YgQ2hlY2tsaXN0KXsKLQkJCXRoaXMuZ2VuZXJhbFNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmNoZWNrbGlzdF9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYzsKLQkJCXRoaXMuZGV0YWlsU2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuY2hlY2tsaXN0X2RldGFpbFNlY3Rpb25fZGVzYzsKLQkJCXRoaXMudmFyaWFiaWxpdHlTZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy5jaGVja2xpc3RfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M7Ci0JCQl0aGlzLnZlcnNpb25TZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy5jaGVja2xpc3RfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M7Ci0JCQl0aGlzLmljb25TZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy5jaGVja2xpc3RfaWNvblNlY3Rpb25fZGVzYzsKLQkJfQotCQllbHNlIGlmKGNvbnRlbnRFbGVtZW50IGluc3RhbmNlb2YgRXhhbXBsZSl7Ci0JCQl0aGlzLmdlbmVyYWxTZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy5leGFtcGxlX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjOwotCQkJdGhpcy5kZXRhaWxTZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy5leGFtcGxlX2RldGFpbFNlY3Rpb25fZGVzYzsKLQkJCXRoaXMudmFyaWFiaWxpdHlTZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy5leGFtcGxlX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjOwotCQkJdGhpcy52ZXJzaW9uU2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZXhhbXBsZV92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYzsKLQkJCXRoaXMuaWNvblNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmV4YW1wbGVfaWNvblNlY3Rpb25fZGVzYzsKLQkJfQotCQllbHNlIGlmKGNvbnRlbnRFbGVtZW50IGluc3RhbmNlb2YgR3VpZGVsaW5lKXsKLQkJCXRoaXMuZ2VuZXJhbFNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmd1aWRlbGluZV9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYzsKLQkJCXRoaXMuZGV0YWlsU2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZ3VpZGVsaW5lX2RldGFpbFNlY3Rpb25fZGVzYzsKLQkJCXRoaXMudmFyaWFiaWxpdHlTZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy5ndWlkZWxpbmVfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M7Ci0JCQl0aGlzLnZlcnNpb25TZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy5ndWlkZWxpbmVfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M7Ci0JCQl0aGlzLmljb25TZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy5ndWlkZWxpbmVfaWNvblNlY3Rpb25fZGVzYzsKLQkJfQotCQllbHNlIGlmKGNvbnRlbnRFbGVtZW50IGluc3RhbmNlb2YgRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKXsKLQkJCXRoaXMuZ2VuZXJhbFNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmVzdGltYXRpb25jb25zaWRlcmF0aW9uX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjOwotCQkJdGhpcy5kZXRhaWxTZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy5lc3RpbWF0aW9uY29uc2lkZXJhdGlvbl9kZXRhaWxTZWN0aW9uX2Rlc2M7Ci0JCQl0aGlzLnZhcmlhYmlsaXR5U2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZXN0aW1hdGlvbmNvbnNpZGVyYXRpb25fdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M7Ci0JCQl0aGlzLnZlcnNpb25TZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy5lc3RpbWF0aW9uY29uc2lkZXJhdGlvbl92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYzsKLQkJCXRoaXMuaWNvblNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmVzdGltYXRpb25jb25zaWRlcmF0aW9uX2ljb25TZWN0aW9uX2Rlc2M7Ci0JCX0KLQkJZWxzZSBpZihjb250ZW50RWxlbWVudCBpbnN0YW5jZW9mIFByYWN0aWNlKXsKLQkJCXRoaXMuZ2VuZXJhbFNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLnByYWN0aWNlX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjOwotCQkJdGhpcy5kZXRhaWxTZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy5wcmFjdGljZV9kZXRhaWxTZWN0aW9uX2Rlc2M7Ci0JCQl0aGlzLnZhcmlhYmlsaXR5U2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMucHJhY3RpY2VfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M7Ci0JCQl0aGlzLnZlcnNpb25TZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy5wcmFjdGljZV92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYzsKLQkJCXRoaXMuaWNvblNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLnByYWN0aWNlX2ljb25TZWN0aW9uX2Rlc2M7Ci0JCX0KLQkJZWxzZSBpZihjb250ZW50RWxlbWVudCBpbnN0YW5jZW9mIFN1cHBvcnRpbmdNYXRlcmlhbCl7Ci0JCQl0aGlzLmdlbmVyYWxTZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy5zdXBwb3J0aW5nbWF0ZXJpYWxfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M7Ci0JCQl0aGlzLmRldGFpbFNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLnN1cHBvcnRpbmdtYXRlcmlhbF9kZXRhaWxTZWN0aW9uX2Rlc2M7Ci0JCQl0aGlzLnZhcmlhYmlsaXR5U2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuc3VwcG9ydGluZ21hdGVyaWFsX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjOwotCQkJdGhpcy52ZXJzaW9uU2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuc3VwcG9ydGluZ21hdGVyaWFsX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjOwotCQkJdGhpcy5pY29uU2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuc3VwcG9ydGluZ21hdGVyaWFsX2ljb25TZWN0aW9uX2Rlc2M7Ci0JCX0KLQkJZWxzZSBpZihjb250ZW50RWxlbWVudCBpbnN0YW5jZW9mIFJlcG9ydCl7Ci0JCQl0aGlzLmdlbmVyYWxTZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy5yZXBvcnRfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M7Ci0JCQl0aGlzLmRldGFpbFNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLnJlcG9ydF9kZXRhaWxTZWN0aW9uX2Rlc2M7Ci0JCQl0aGlzLnZhcmlhYmlsaXR5U2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMucmVwb3J0X3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjOwotCQkJdGhpcy52ZXJzaW9uU2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMucmVwb3J0X3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjOwotCQkJdGhpcy5pY29uU2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMucmVwb3J0X2ljb25TZWN0aW9uX2Rlc2M7Ci0JCX0KLQkJZWxzZSBpZihjb250ZW50RWxlbWVudCBpbnN0YW5jZW9mIFJvYWRtYXApewotCQkJdGhpcy5nZW5lcmFsU2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMucm9hZG1hcF9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYzsKLQkJCXRoaXMuZGV0YWlsU2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMucm9hZG1hcF9kZXRhaWxTZWN0aW9uX2Rlc2M7Ci0JCQl0aGlzLnZhcmlhYmlsaXR5U2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMucm9hZG1hcF92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYzsKLQkJCXRoaXMudmVyc2lvblNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLnJvYWRtYXBfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M7Ci0JCQl0aGlzLmljb25TZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy5yb2FkbWFwX2ljb25TZWN0aW9uX2Rlc2M7Ci0JCX0KLQkJZWxzZSBpZihjb250ZW50RWxlbWVudCBpbnN0YW5jZW9mIFRlbXBsYXRlKXsKLQkJCXRoaXMuZ2VuZXJhbFNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLnRlbXBsYXRlX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjOwotCQkJdGhpcy5kZXRhaWxTZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy50ZW1wbGF0ZV9kZXRhaWxTZWN0aW9uX2Rlc2M7Ci0JCQl0aGlzLnZhcmlhYmlsaXR5U2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMudGVtcGxhdGVfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M7Ci0JCQl0aGlzLnZlcnNpb25TZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy50ZW1wbGF0ZV92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYzsKLQkJCXRoaXMuaWNvblNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLnRlbXBsYXRlX2ljb25TZWN0aW9uX2Rlc2M7Ci0JCX0KLQkJZWxzZSBpZihjb250ZW50RWxlbWVudCBpbnN0YW5jZW9mIFRlcm1EZWZpbml0aW9uKXsKLQkJCXRoaXMuZ2VuZXJhbFNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLnRlcm1kZWZpbml0aW9uX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjOwotCQkJdGhpcy5kZXRhaWxTZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy50ZXJtZGVmaW5pdGlvbl9kZXRhaWxTZWN0aW9uX2Rlc2M7Ci0JCQl0aGlzLnZhcmlhYmlsaXR5U2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMudGVybWRlZmluaXRpb25fdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M7Ci0JCQl0aGlzLnZlcnNpb25TZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy50ZXJtZGVmaW5pdGlvbl92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYzsKLQkJCXRoaXMuaWNvblNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLnRlcm1kZWZpbml0aW9uX2ljb25TZWN0aW9uX2Rlc2M7Ci0JCX0KLQkJZWxzZSBpZihjb250ZW50RWxlbWVudCBpbnN0YW5jZW9mIFJldXNhYmxlQXNzZXQpewotCQkJdGhpcy5nZW5lcmFsU2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMucmVzdWFibGVhc3NldF9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYzsKLQkJCXRoaXMuZGV0YWlsU2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMucmVzdWFibGVhc3NldF9kZXRhaWxTZWN0aW9uX2Rlc2M7Ci0JCQl0aGlzLnZhcmlhYmlsaXR5U2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMucmVzdWFibGVhc3NldF92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYzsKLQkJCXRoaXMudmVyc2lvblNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLnJlc3VhYmxlYXNzZXRfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M7Ci0JCQl0aGlzLmljb25TZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy5yZXVzYWJsZWFzc2V0X2ljb25TZWN0aW9uX2Rlc2M7Ci0JCX0KLQkJZWxzZSBpZihjb250ZW50RWxlbWVudCBpbnN0YW5jZW9mIFRvb2xNZW50b3IpewotCQkJdGhpcy5nZW5lcmFsU2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMudG9vbG1lbnRvcl9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYzsKLQkJCXRoaXMuZGV0YWlsU2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMudG9vbG1lbnRvcl9kZXRhaWxTZWN0aW9uX2Rlc2M7Ci0JCQl0aGlzLnZhcmlhYmlsaXR5U2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMudG9vbG1lbnRvcl92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYzsKLQkJCXRoaXMudmVyc2lvblNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLnRvb2xtZW50b3JfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M7Ci0JCQl0aGlzLmljb25TZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy50b29sbWVudG9yX2ljb25TZWN0aW9uX2Rlc2M7Ci0JCX0KLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL0d1aWRhbmNlV2l0aEF0dGFjaG1lbnRzRGVzY3JpcHRpb25QYWdlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL0d1aWRhbmNlV2l0aEF0dGFjaG1lbnRzRGVzY3JpcHRpb25QYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlMThjYzMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9HdWlkYW5jZVdpdGhBdHRhY2htZW50c0Rlc2NyaXB0aW9uUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuTWV0aG9kRWxlbWVudEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLkZpbGVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuTmV0VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSUFjdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuTGlicmFyeVVJVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLlJlc291cmNlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5kaWFsb2dzLkFkZExpbmtEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkZpbGVEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLmVkaXRvci5Gb3JtRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuRm9ybVRvb2xraXQ7Ci0KLQotLyoqCi0gKiBUaGUgRGVzY3JpcHRpb24gcGFnZSBpbiBhIEd1aWRhbmNlICh3aXRoIGF0dGFjaG1lbnRzKSBlZGl0b3IuCi0gKiAKLSAqIEBhdXRob3IgTG9rYW5hdGggSmFnZ2EKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBHdWlkYW5jZVdpdGhBdHRhY2htZW50c0Rlc2NyaXB0aW9uUGFnZSBleHRlbmRzIEd1aWRhbmNlRGVzY3JpcHRpb25QYWdlIHsKLQotCXByaXZhdGUgQnV0dG9uIGN0cmxfYXR0YWNoLCBjdHJsX2RldGFjaCwgY3RybF9hdHRhY2hfdXJsIDsgLy9jdHJsX3JlbW92ZSA7Ci0KLQlwcml2YXRlIExpc3QgY3RybF9hdHRhY2hlZF9maWxlczsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBHVUlEQU5DRV9BVFRBQ0hNRU5UX0xBU1RfRElSRUNUT1JZX0JST1dTRURfUFJFRiA9ICJndWlkYW5jZV9hdHRhY2htZW50X2xhc3RfZGlyX2Jyb3dzZWQiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBHdWlkYW5jZVdpdGhBdHRhY2htZW50c0Rlc2NyaXB0aW9uUGFnZShGb3JtRWRpdG9yIGVkaXRvcikgewotCQlzdXBlcihlZGl0b3IpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5HdWlkYW5jZURlc2NyaXB0aW9uUGFnZSNjcmVhdGVFZGl0b3JDb250ZW50KG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuRm9ybVRvb2xraXQpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRWRpdG9yQ29udGVudChGb3JtVG9vbGtpdCB0b29sa2l0KSB7Ci0JCXN1cGVyLmNyZWF0ZUVkaXRvckNvbnRlbnQodG9vbGtpdCk7Ci0KLQkJY3JlYXRlTGFiZWwodG9vbGtpdCwgZ2VuZXJhbENvbXBvc2l0ZSwKLQkJCQlBdXRob3JpbmdVSVRleHQuQVRUQUNIRURfRklMRV9URVhULCAyKTsKLQkJY3RybF9hdHRhY2hlZF9maWxlcyA9IG5ldyBMaXN0KGdlbmVyYWxDb21wb3NpdGUsIFNXVC5TSU5HTEUKLQkJCQl8IFNXVC5WX1NDUk9MTCB8IFNXVC5IX1NDUk9MTCk7Ci0JCUdyaWREYXRhIGxpc3RHcmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuQkVHSU5OSU5HLCBTV1QuQkVHSU5OSU5HLAotCQkJCXRydWUsIHRydWUpOwotCQlsaXN0R3JpZERhdGEuaGVpZ2h0SGludCA9IDMwOwotCQlsaXN0R3JpZERhdGEud2lkdGhIaW50ID0gMzAwOwotCQljdHJsX2F0dGFjaGVkX2ZpbGVzLnNldExheW91dERhdGEobGlzdEdyaWREYXRhKTsKLQotCQljdHJsX2F0dGFjaGVkX2ZpbGVzLnNldERhdGEoRm9ybVRvb2xraXQuS0VZX0RSQVdfQk9SREVSLAotCQkJCUZvcm1Ub29sa2l0LlRFWFRfQk9SREVSKTsKLQotCQlDb21wb3NpdGUgYnV0dG9uQ29tcG9zaXRlID0gY3JlYXRlQ29tcG9zaXRlKHRvb2xraXQsIGdlbmVyYWxDb21wb3NpdGUsCi0JCQkJMSk7Ci0JCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRU5EKTsKLQkJZ3JpZERhdGEudmVydGljYWxTcGFuID0gMTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAzOwotCQlidXR0b25Db21wb3NpdGUuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCWJ1dHRvbkNvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMywgZmFsc2UpKTsKLQotCQljdHJsX2F0dGFjaCA9IGNyZWF0ZUJ1dHRvbih0b29sa2l0LCBidXR0b25Db21wb3NpdGUsIEFUVEFDSF9CVVRUT04pOwotCQljdHJsX2F0dGFjaF91cmwgPSBjcmVhdGVCdXR0b24odG9vbGtpdCwgYnV0dG9uQ29tcG9zaXRlLCBBVFRBQ0hfVVJMX0JVVFRPTik7Ci0JCWN0cmxfZGV0YWNoID0gY3JlYXRlQnV0dG9uKHRvb2xraXQsIGJ1dHRvbkNvbXBvc2l0ZSwgREVUQUNIX0JVVFRPTik7Ci0JCQotCQlsYWJlbF9iYXNlLnNldFRleHQoQXV0aG9yaW5nVUlUZXh0LkJBU0VfRUxFTUVOVF9URVhUKTsKLQotCX0KLQotCS8qKgotCSAqIEFkZCBsaXN0ZW5lcnMKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuR3VpZGFuY2VEZXNjcmlwdGlvblBhZ2UjYWRkTGlzdGVuZXJzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRMaXN0ZW5lcnMoKSB7Ci0JCXN1cGVyLmFkZExpc3RlbmVycygpOwotCi0JCWZpbmFsIElBY3Rpb25NYW5hZ2VyIGFjdGlvbk1nciA9ICgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpCi0JCQkJLmdldEFjdGlvbk1hbmFnZXIoKTsKLQotCQljdHJsX2F0dGFjaC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlGaWxlRGlhbG9nIGRpYWxvZyA9IG5ldyBGaWxlRGlhbG9nKFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkKLQkJCQkJCS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRTaGVsbCgpKTsKLQkJCQlkaWFsb2cKLQkJCQkJCS5zZXRUZXh0KEF1dGhvcmluZ1VJUmVzb3VyY2VzLmF0dGFjaEd1aWRhbmNlRmlsZURpYWxvZ190aXRsZSk7IAotCQkJCVN0cmluZyBsYXN0RGlyID0gQXV0aG9yaW5nVUlQbHVnaW4KLQkJCQkJCS5nZXREZWZhdWx0KCkKLQkJCQkJCS5nZXRQcmVmZXJlbmNlU3RvcmUoKQotCQkJCQkJLmdldFN0cmluZygKLQkJCQkJCQkJR1VJREFOQ0VfQVRUQUNITUVOVF9MQVNUX0RJUkVDVE9SWV9CUk9XU0VEX1BSRUYpOwotCQkJCWlmIChsYXN0RGlyICE9IG51bGwgJiYgbGFzdERpci50cmltKCkubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJCWRpYWxvZy5zZXRGaWx0ZXJQYXRoKGxhc3REaXIpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWRpYWxvZy5zZXRGaWx0ZXJQYXRoKFJlc291cmNlSGVscGVyLmdldEZvbGRlckFic29sdXRlUGF0aChndWlkYW5jZSkpOwotCQkJCX0KLQkJCQlkaWFsb2cub3BlbigpOwotCQkJCWlmIChkaWFsb2cuZ2V0RmlsZU5hbWUoKSAhPSBudWxsICYmIGRpYWxvZy5nZXRGaWxlTmFtZSgpICE9ICIiKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJdHJ5IHsKLQkJCQkJCUZpbGUgZmlsZVRvQXR0YWNoID0gbmV3IEZpbGUoZGlhbG9nLmdldEZpbHRlclBhdGgoKSwKLQkJCQkJCQkJZGlhbG9nLmdldEZpbGVOYW1lKCkpOwotCQkJCQkJU3RyaW5nIGZpbGVVcmwgPSBMaWJyYXJ5VUlVdGlsLmdldFVSTEZvckF0dGFjaG1lbnQoY3RybF9hdHRhY2guZ2V0U2hlbGwoKSwKLQkJCQkJCQkJZmlsZVRvQXR0YWNoLCBndWlkYW5jZSwgdHJ1ZSk7Ci0JCQkJCQlpZiAoZmlsZVVybCA9PSBudWxsKSB7Ci0JCQkJCQkJLy8gdXNlciBoaXQgY2FuY2VsIG9uIFJlbmFtZUZpbGVDb25mbGljdERpYWxvZwotCQkJCQkJCXJldHVybjsKLQkJCQkJCX0KLQkJCQkJCWlmIChjdHJsX2F0dGFjaGVkX2ZpbGVzLmluZGV4T2YoZmlsZVVybCkgIT0gLTEpIHsKLQkJCQkJCQkvLyBmaWxlIGlzIGFscmVhZHkgYW4gYXR0YWNobWVudAotCQkJCQkJCUF1dGhvcmluZ1VJUGx1Z2luCi0JCQkJCQkJCQkuZ2V0RGVmYXVsdCgpCi0JCQkJCQkJCQkuZ2V0TXNnRGlhbG9nKCkKLQkJCQkJCQkJCS5kaXNwbGF5SW5mbygKLQkJCQkJCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuQXR0YWNobWVudERpYWxvZ2F0dGFjaEZpbGVfdGV4dCwgCi0JCQkJCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLmZvcm1zX0d1aWRhbmNlV2l0aEF0dGFjaG1lbnRzRGVzY3JpcHRpb25QYWdlX2FscmVhZHlBdHRhY2hlZF9tc2cpOyAKLQkJCQkJCQlyZXR1cm47Ci0JCQkJCQl9Ci0JCQkJCQljdHJsX2F0dGFjaGVkX2ZpbGVzLmFkZChmaWxlVXJsKTsKLQkJCQkJCWJvb2xlYW4gc3RhdHVzID0gYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlNFVCwKLQkJCQkJCQkJZ3VpZGFuY2UuZ2V0UHJlc2VudGF0aW9uKCksCi0JCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJLmdldEd1aWRhbmNlRGVzY3JpcHRpb25fQXR0YWNobWVudHMoKSwKLQkJCQkJCQkJZ2V0RmlsZXNGcm9tTGlzdEN0cmwoKSwgLTEpOwotCQkJCQkJaWYgKCFzdGF0dXMpIHsKLQkJCQkJCQlyZXR1cm47Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCUF1dGhvcmluZ1VJUGx1Z2luCi0JCQkJCQkJCQkuZ2V0RGVmYXVsdCgpCi0JCQkJCQkJCQkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkKLQkJCQkJCQkJCS5zZXRWYWx1ZSgKLQkJCQkJCQkJCQkJR1VJREFOQ0VfQVRUQUNITUVOVF9MQVNUX0RJUkVDVE9SWV9CUk9XU0VEX1BSRUYsCi0JCQkJCQkJCQkJCWRpYWxvZy5nZXRGaWx0ZXJQYXRoKCkpOwotCQkJCQkJfQotCQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgewotCQkJCQkJLy8gVE9ETzogRGlzcGxheSBhbiBlcnJvciBkaWFsb2cuCi0JCQkJCQlleC5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJY3RybF9hdHRhY2hfdXJsLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCUFkZExpbmtEaWFsb2cgZGlhbG9nID0gbmV3IEFkZExpbmtEaWFsb2coUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKQotCQkJCQkJLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldFNoZWxsKCksICIiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWRpYWxvZy5vcGVuKCk7Ci0JCQkJaWYgKGRpYWxvZy5nZXRSZXR1cm5Db2RlKCkgPT0gV2luZG93Lk9LKSB7Ci0JCQkJCQotCQkJCQlpZiggZGlhbG9nLmdldExpbmsoKSAhPSBudWxsKSB7IAotCQkJCQkJCi0JCQkJCQl0cnkgewotCQkJCQkJCVN0cmluZyBsaW5rVXJsID0gZGlhbG9nLmdldExpbmsoKS5nZXRVUkwoKTsKLQkJCQkJCQlTdHJpbmcgbGlua05hbWUgPSBkaWFsb2cuZ2V0TGluaygpLmdldE5hbWUoKTsKLQkJCQkJCQlpZiAobGlua05hbWUgPT0gbnVsbCB8fCBsaW5rTmFtZS50cmltKCkubGVuZ3RoKCkgPT0gMCkgewotCQkJCQkJCQlsaW5rTmFtZSA9IEZpbGVVdGlsLmdldEZpbGVOYW1lKGxpbmtVcmwpOwotCQkJCQkJCX0KLQkJCQkJCQkKLQkJCQkJCQl0cnkgewotCQkJCQkJCQlVUkwgdXJsID0gbmV3IFVSTChsaW5rVXJsKTsKLQkJCQkJCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gbXVlKSB7Ci0JCQkJCQkJCWlmIChtdWUuZ2V0TWVzc2FnZSgpLnN0YXJ0c1dpdGgoIm5vIHByb3RvY29sIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJbGlua1VybCA9IE5ldFV0aWwuSFRUUF9VUklfUFJFRklYICsgbGlua1VybDsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCQkKLQkJCQkJCQlTdHJpbmcgdXJsU3RyaW5nID0gIjxhIGhyZWY9XCIiOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJaWYgKFBsYXRmb3JtLmdldE9TKCkuZXF1YWxzKFBsYXRmb3JtLldTX1dJTjMyKSkgewotCQkJCQkJCQl1cmxTdHJpbmcgKz0gTmV0VXRpbAotCQkJCQkJCQkJCS5lbmNvZGVGaWxlVVJMKGxpbmtVcmwpOwotCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCXVybFN0cmluZyArPSBOZXRVdGlsLmVuY29kZUZpbGVVUkwobGlua1VybCk7Ci0JCQkJCQkJfQotCQkJCQkJCXVybFN0cmluZyArPSAiXCI+IiArIGxpbmtOYW1lICsgIjwvYT4iOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCQlsaW5rVXJsID0gdXJsU3RyaW5nOwotCQkJCQkJCS8vU3RyaW5nIGxpbmtEaXNwbGF5TmFtZSA9IGRpYWxvZy5nZXRMaW5rKCkuZ2V0TmFtZSgpOwkJCQkJCQkKLQkJCQkJCQkKLQkJCQkJCQlpZiAobGlua1VybCA9PSBudWxsKSB7Ci0JCQkJCQkJCS8vIHVzZXIgaGl0IGNhbmNlbCBvbiBBZGRMaW5rRGlhbG9nCi0JCQkJCQkJCXJldHVybjsKLQkJCQkJCQl9Ci0JCQkJCQkJaWYgKGN0cmxfYXR0YWNoZWRfZmlsZXMuaW5kZXhPZihsaW5rVXJsKSAhPSAtMSkgewotCQkJCQkJCQkvLyBJZiBsaW5rIGFscmVhZHkgZXhpc3RzCi0JCQkJCQkJCUF1dGhvcmluZ1VJUGx1Z2luCi0JCQkJCQkJCQkJLmdldERlZmF1bHQoKQotCQkJCQkJCQkJCS5nZXRNc2dEaWFsb2coKQotCQkJCQkJCQkJCS5kaXNwbGF5SW5mbygKLQkJCQkJCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLkF0dGFjaG1lbnREaWFsb2dhdHRhY2hVcmxfdGV4dCwgCi0JCQkJCQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5mb3Jtc19HdWlkYW5jZVdpdGhVcmxBdHRhY2htZW50c0Rlc2NyaXB0aW9uUGFnZV9hbHJlYWR5QXR0YWNoZWRfbXNnKTsgCi0JCQkJCQkJCXJldHVybjsKLQkJCQkJCQl9Ci0JCQkJCQkJY3RybF9hdHRhY2hlZF9maWxlcy5hZGQobGlua1VybCk7Ci0JCQkJCQkJYm9vbGVhbiBzdGF0dXMgPSBhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuU0VULAotCQkJCQkJCQkJZ3VpZGFuY2UuZ2V0UHJlc2VudGF0aW9uKCksCi0JCQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJCQkuZ2V0R3VpZGFuY2VEZXNjcmlwdGlvbl9BdHRhY2htZW50cygpLAotCQkJCQkJCQkJZ2V0RmlsZXNGcm9tTGlzdEN0cmwoKSwgLTEpOwotCQkJCQkJCWlmICghc3RhdHVzKSB7Ci0JCQkJCQkJCXJldHVybjsKLQkJCQkJCQl9Ci0JCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCQkJCQkvLyBUT0RPOiBEaXNwbGF5IGFuIGVycm9yIGRpYWxvZy4KLQkJCQkJCQlleC5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JCQotCQljdHJsX2RldGFjaC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQljdHJsX2F0dGFjaGVkX2ZpbGVzLnJlbW92ZShjdHJsX2F0dGFjaGVkX2ZpbGVzCi0JCQkJCQkuZ2V0U2VsZWN0aW9uSW5kZXgoKSk7Ci0JCQkJYm9vbGVhbiBzdGF0dXMgPSBhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuU0VULAotCQkJCQkJZ3VpZGFuY2UuZ2V0UHJlc2VudGF0aW9uKCksIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCS5nZXRHdWlkYW5jZURlc2NyaXB0aW9uX0F0dGFjaG1lbnRzKCksCi0JCQkJCQlnZXRGaWxlc0Zyb21MaXN0Q3RybCgpLCAtMSk7Ci0KLQkJCQlpZiAoIXN0YXR1cykgewotCQkJCQkvLyBjdHJsX2F0dGFjaGVkX2ZpbGVzLnNldFRleHQob2xkQ29udGVudCk7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JCS8vIGN0cmxfcmVtb3ZlLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCl7Ci0JCS8vIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJLy8gLy9jdHJsX2F0dGFjaGVkX2ZpbGVzLnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0JCS8vIFN0cmluZyBvbGRDb250ZW50ID0KLQkJLy8gKChHdWlkYW5jZURlc2NyaXB0aW9uKWd1aWRhbmNlLmdldFByZXNlbnRhdGlvbigpKS5nZXRBdHRhY2htZW50cygpOwotCQkvLyBjdHJsX2F0dGFjaGVkX2ZpbGVzLnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0JCS8vIGJvb2xlYW4gc3RhdHVzID0gYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlNFVCwKLQkJLy8gZ3VpZGFuY2UuZ2V0UHJlc2VudGF0aW9uKCksCi0JCS8vIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEd1aWRhbmNlRGVzY3JpcHRpb25fQXR0YWNobWVudHMoKSwKLQkJLy8gY3RybF9hdHRhY2hlZF9maWxlcy5nZXRUZXh0KCksIC0xKTsKLQkJLy8gaWYoIXN0YXR1cyl7Ci0JCS8vIC8vY3RybF9hdHRhY2hlZF9maWxlcy5zZXRUZXh0KG9sZENvbnRlbnQpOwotCQkvLyByZXR1cm47Ci0JCS8vIH0KLQkJLy8gfQotCQkvLyB9KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuR3VpZGFuY2VEZXNjcmlwdGlvblBhZ2UjcmVmcmVzaChib29sZWFuKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2goYm9vbGVhbiBlZGl0YWJsZSkgewotCQlzdXBlci5yZWZyZXNoKGVkaXRhYmxlKTsKLQkJY3RybF9hdHRhY2guc2V0RW5hYmxlZChlZGl0YWJsZSk7Ci0JCWN0cmxfYXR0YWNoX3VybC5zZXRFbmFibGVkKGVkaXRhYmxlKTsKLQkJY3RybF9kZXRhY2guc2V0RW5hYmxlZChlZGl0YWJsZSk7Ci0JCQotCQkvLyBjdHJsX3JlbW92ZS5zZXRFbmFibGVkKGVkaXRhYmxlKTsKLQl9Ci0KLQkvKioKLQkgKiBMb2FkIGluaXRpYWwgZGF0YSBmcm9tIG1vZGVsCi0JICoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuR3VpZGFuY2VEZXNjcmlwdGlvblBhZ2UjbG9hZERhdGEoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGxvYWREYXRhKCkgewotCQlzdXBlci5sb2FkRGF0YSgpOwotCQlpZiAoZ3VpZGFuY2UgIT0gbnVsbCkgewotCQkJQ29udGVudERlc2NyaXB0aW9uIGNvbnRlbnQgPSAoQ29udGVudERlc2NyaXB0aW9uKSBndWlkYW5jZQotCQkJCQkuZ2V0UHJlc2VudGF0aW9uKCk7Ci0JCQlTdHJpbmcgdGhpcmRwYXJ0eWZvcm1hdCA9ICgob3JnLmVjbGlwc2UuZXBmLnVtYS5HdWlkYW5jZURlc2NyaXB0aW9uKSBjb250ZW50KQotCQkJCQkuZ2V0QXR0YWNobWVudHMoKTsKLQkJCXNldEZpbGVzVG9MaXN0Q3RybCh0aGlyZHBhcnR5Zm9ybWF0KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5HdWlkYW5jZURlc2NyaXB0aW9uUGFnZSNnZXRDb250ZW50RWxlbWVudCgpCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBnZXRDb250ZW50RWxlbWVudCgpIHsKLQkJcmV0dXJuIGNvbnRlbnRFbGVtZW50OwotCX0KLQotCS8qKgotCSAqIEdpdmVuIGEgc3RyaW5nIG9mIGZpbGVzLCBhZGQgdGhlIGZpbGVzIHRvIHRoZSBMaXN0IGNvbnRyb2wKLQkgKiAKLQkgKiBAcGFyYW0gZmlsZXMKLQkgKi8KLQlwcml2YXRlIHZvaWQgc2V0RmlsZXNUb0xpc3RDdHJsKFN0cmluZyBmaWxlU3RyaW5nKSB7Ci0JCWphdmEudXRpbC5MaXN0IGF0dGFjaG1lbnRMaXN0ID0gVG5nVXRpbAotCQkJCS5jb252ZXJ0R3VpZGFuY2VBdHRhY2htZW50c1RvTGlzdChmaWxlU3RyaW5nKTsKLQkJY3RybF9hdHRhY2hlZF9maWxlcy5yZW1vdmVBbGwoKTsKLQotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBhdHRhY2htZW50TGlzdC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCVN0cmluZyBhdHRhY2htZW50ID0gKFN0cmluZykgaXRlci5uZXh0KCk7Ci0JCQljdHJsX2F0dGFjaGVkX2ZpbGVzLmFkZChhdHRhY2htZW50KTsKLQotCQl9Ci0JfQotCi0JLyoqCi0JICogcmV0dXJucyB0aGUgbGlzdCBvZiBmaWxlcyBhcyBhIHN0cmluZwotCSAqIAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXRGaWxlc0Zyb21MaXN0Q3RybCgpIHsKLQkJU3RyaW5nIGZpbGVzW10gPSBjdHJsX2F0dGFjaGVkX2ZpbGVzLmdldEl0ZW1zKCk7Ci0JCXJldHVybiBUbmdVdGlsLmNvbnZlcnRHdWlkYW5jZUF0dGFjaG1lbnRzVG9TdHJpbmcoQXJyYXlzLmFzTGlzdChmaWxlcykpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9JQ29sdW1uUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvSUNvbHVtblByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiZTE2YTkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9JQ29sdW1uUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuTWV0aG9kRWxlbWVudEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5Gb3JtVG9vbGtpdDsKLQotLyoqCi0gKiBJbnRlcmZhY2UgdG8gYmUgdXNlZCBhZGQgY29sdW1ucyBvbiBkZXNjcmlwdGlvbiB0YWIgb2YgYWxsIGVkaXRvcnMKLSAqIAotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjUKLSAqLwotcHVibGljIGludGVyZmFjZSBJQ29sdW1uUHJvdmlkZXIgICB7Ci0KLQotCS8qKgotCSAqIFNldCBjb2x1bW4gY29tcG9zaXRlIGZvciB0aGUgZ2l2ZW4gbWV0aG9kIGVsZW1lbnQgZWRpdG9yCi0JICogQHBhcmFtIHRvb2xraXQKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIENvbXBvc2l0ZSBzZXRDb2x1bW4oTWV0aG9kRWxlbWVudEVkaXRvciBlZGl0b3IsIEZvcm1Ub29sa2l0IHRvb2xraXQsIENvbXBvc2l0ZSBwYXJlbnQpOwotCQotCS8qKgotCSAqIFJlZnJlc2ggc3RhdGUgb2YgYWxsIGNvbnRyb2xzCi0JICogQHBhcmFtIHZhbHVlCi0JICovCi0JcHVibGljIHZvaWQgcmVmcmVzaChib29sZWFuIHZhbHVlKTsKLQkKLQkKLQkvKioKLQkgKiBEaXNwb3NlIHRoZSBjb250cm9sCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpOwotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9JUmVmcmVzaGFibGUuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvSVJlZnJlc2hhYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhYTZhNDYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9JUmVmcmVzaGFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXM7Ci0KLS8qKgotICogSW50ZXJmYWNlIHVzZWQgdG8gcmVmcmVzaCBhIGZvcm0gdGhhdCBpbXBsZW1lbnRzIHRoaXMgaW4gY2FzZSBvZiBtb2RlbCBjaGFuZ2Ugb3V0c2lkZSBvZiB0aGUgZm9ybQotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZSAKLSAqIEBzaW5jZSAgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVJlZnJlc2hhYmxlIHsKLQkKLQkvKioKLQkgKiBSZWZyZXNoIG5hbWUgb2YgdGhlIGZvcm0KLQkgKiBAcGFyYW0gbmV3TmFtZQotCSAqLwotCXZvaWQgcmVmcmVzaE5hbWUoU3RyaW5nIG5ld05hbWUpOwotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9JU2VjdGlvblByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL0lTZWN0aW9uUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzFhMmI3My4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL0lTZWN0aW9uUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuTWV0aG9kRWxlbWVudEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5Gb3JtVG9vbGtpdDsKLQotLyoqCi0gKiBJbnRlcmZhY2UgdG8gYmUgdXNlZCBhZGQgc2VjdGlvbiBvbiBkZXNjcmlwdGlvbiB0YWIgb2YgYWxsIGVkaXRvcnMKLSAqIAotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjUKLSAqLwotcHVibGljIGludGVyZmFjZSBJU2VjdGlvblByb3ZpZGVyICAgewotCi0KLQkvKioKLQkgKiBDcmVhdGUgc2VjdGlvbiBjb21wb3NpdGUgZm9yIHRoZSBnaXZlbiBtZXRob2QgZWxlbWVudCBlZGl0b3IKLQkgKiBAcGFyYW0gdG9vbGtpdAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVTZWN0aW9uKE1ldGhvZEVsZW1lbnRFZGl0b3IgZWRpdG9yLCBGb3JtVG9vbGtpdCB0b29sa2l0LCBDb21wb3NpdGUgcGFyZW50KTsKLQkKLQkvKioKLQkgKiBSZWZyZXNoIHN0YXRlIG9mIGFsbCBjb250cm9scwotCSAqIEBwYXJhbSB2YWx1ZQotCSAqLwotCXB1YmxpYyB2b2lkIHJlZnJlc2goYm9vbGVhbiB2YWx1ZSk7Ci0JCi0JCi0JLyoqCi0JICogRGlzcG9zZSB0aGUgY29udHJvbAotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKTsKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvTWV0aG9kRm9ybVRvb2xraXQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvTWV0aG9kRm9ybVRvb2xraXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTVkNmZkMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL01ldGhvZEZvcm1Ub29sa2l0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3JtczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5NZXRob2RSaWNoVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuTWV0aG9kUmljaFRleHRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5yaWNodGV4dC5JTWV0aG9kUmljaFRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5yaWNodGV4dC5JTWV0aG9kUmljaFRleHRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5yaWNodGV4dC5NZXRob2RSaWNoVGV4dENvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5yaWNodGV4dC5NZXRob2RSaWNoVGV4dEVkaXRvckNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5FeHRlbnNpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLkZvcm1Ub29sa2l0OwotCi0KLS8qKgotICogQSBoZWxwIGNsYXNzIGZvciBjcmVhdGluZyBVSSB3aWRnZXRzIGFkYXB0ZWQgYWRhcHRlZCB0byB3b3JrIGluIEVjbGlwc2UKLSAqIGZvcm1zLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIE1ldGhvZEZvcm1Ub29sa2l0IHsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBSaWNoIFRleHQgY29udHJvbCBhbmQgYWRhcHRzIGl0IHRvIGJlIHVzZWQgaW4gYSBmb3JtLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29udHJvbC4KLQkgKiBAcGFyYW0gdGV4dAotCSAqICAgICAgICAgICAgVGhlIGluaXRpYWwgdGV4dCBmb3IgdGhlIHZpZXdlci4KLQkgKiBAcGFyYW0gc3R5bGUKLQkgKiAgICAgICAgICAgIFRoZSBpbml0aWFsIHN0eWxlIGZvciB0aGUgdmlld2VyLgotCSAqIEBwYXJhbSBiYXNlUGF0aAotCSAqICAgICAgICAgICAgVGhlIGJhc2UgcGF0aCB1c2VkIGZvciByZXNvbHZpbmcgaHJlZnMuCi0JICogQHJldHVybiBBIG5ldyA8Y29kZT5JTWV0aG9kUmljaFRleHQ8L2NvZGU+IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSU1ldGhvZFJpY2hUZXh0IGNyZWF0ZVJpY2hUZXh0KEZvcm1Ub29sa2l0IHRvb2xraXQsCi0JCQlDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgdGV4dCwgaW50IHN0eWxlLCBTdHJpbmcgYmFzZVBhdGgsCi0JCQlNZXRob2RFbGVtZW50IG1ldGhvZEVsZW1lbnQsIExhYmVsIGxhYmVsKSB7Ci0JCUlNZXRob2RSaWNoVGV4dCByaWNoVGV4dCA9IGNyZWF0ZU1ldGhvZFJpY2hUZXh0KHBhcmVudCwgc3R5bGUsIGJhc2VQYXRoKTsKLQkJcmljaFRleHQuaW5pdChtZXRob2RFbGVtZW50LCBsYWJlbCk7Ci0JCXJpY2hUZXh0LmdldENvbnRyb2woKS5zZXREYXRhKEZvcm1Ub29sa2l0LktFWV9EUkFXX0JPUkRFUiwKLQkJCQlGb3JtVG9vbGtpdC5URVhUX0JPUkRFUik7Ci0JCWlmICh0ZXh0ICE9IG51bGwpIHsKLQkJCXJpY2hUZXh0LnNldFRleHQodGV4dCk7Ci0JCX0KLQkJcmV0dXJuIHJpY2hUZXh0OwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIElNZXRob2RSaWNoVGV4dCBjcmVhdGVNZXRob2RSaWNoVGV4dChDb21wb3NpdGUgcGFyZW50LCBpbnQgc3R5bGUsIFN0cmluZyBiYXNlUGF0aCkgewotCQlNZXRob2RSaWNoVGV4dENvbnRleHQgY29udGV4dCA9IG5ldyBNZXRob2RSaWNoVGV4dENvbnRleHQocGFyZW50LCBzdHlsZSwgYmFzZVBhdGgpOwotCQlPYmplY3QgcHJvdmlkZXIgPSBFeHRlbnNpb25IZWxwZXIuY3JlYXRlKElNZXRob2RSaWNoVGV4dC5jbGFzcywgY29udGV4dCk7Ci0JCXJldHVybiBwcm92aWRlciBpbnN0YW5jZW9mIElNZXRob2RSaWNoVGV4dCA/IChJTWV0aG9kUmljaFRleHQpIHByb3ZpZGVyIDogbmV3IE1ldGhvZFJpY2hUZXh0KGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBSaWNoIFRleHQgZWRpdG9yIGFuZCBhZGFwdHMgaXQgdG8gYmUgdXNlZCBpbiBhIGZvcm0uCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb250cm9sLgotCSAqIEBwYXJhbSB0ZXh0Ci0JICogICAgICAgICAgICBUaGUgaW5pdGlhbCB0ZXh0IGZvciB0aGUgdmlld2VyLgotCSAqIEBwYXJhbSBzdHlsZQotCSAqICAgICAgICAgICAgVGhlIGluaXRpYWwgc3R5bGUgZm9yIHRoZSB2aWV3ZXIuCi0JICogQHBhcmFtIGJhc2VQYXRoCi0JICogICAgICAgICAgICBUaGUgYmFzZSBwYXRoIHVzZWQgZm9yIHJlc29sdmluZyBocmVmcy4KLQkgKiBAcmV0dXJuIEEgbmV3IDxjb2RlPklNZXRob2RSaWNoVGV4dEVkaXRvcjwvY29kZT4gaW5zdGFuY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBJTWV0aG9kUmljaFRleHRFZGl0b3IgY3JlYXRlUmljaFRleHRFZGl0b3IoCi0JCQlGb3JtVG9vbGtpdCB0b29sa2l0LCBDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgdGV4dCwgaW50IHN0eWxlLAotCQkJU3RyaW5nIGJhc2VQYXRoLCBNZXRob2RFbGVtZW50IG1ldGhvZEVsZW1lbnQsIExhYmVsIGxhYmVsLCBJRWRpdG9yU2l0ZSBlZGl0b3JTaXRlKSB7Ci0JCUlNZXRob2RSaWNoVGV4dEVkaXRvciBlZGl0b3IgPSBjcmVhdGVNZXRob2RSaWNoVGV4dEVkaXRvcihwYXJlbnQsIHN0eWxlLAotCQkJCWJhc2VQYXRoLCBtZXRob2RFbGVtZW50LCBsYWJlbCwgZWRpdG9yU2l0ZSk7Ci0JCWVkaXRvci5nZXRDb250cm9sKCkuc2V0RGF0YShGb3JtVG9vbGtpdC5LRVlfRFJBV19CT1JERVIsCi0JCQkJRm9ybVRvb2xraXQuVEVYVF9CT1JERVIpOwotCQlpZiAodGV4dCAhPSBudWxsKSB7Ci0JCQllZGl0b3Iuc2V0VGV4dCh0ZXh0KTsKLQkJfQotCQlyZXR1cm4gZWRpdG9yOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIElNZXRob2RSaWNoVGV4dEVkaXRvciBjcmVhdGVNZXRob2RSaWNoVGV4dEVkaXRvcihDb21wb3NpdGUgcGFyZW50LCBpbnQgc3R5bGUsIFN0cmluZyBiYXNlUGF0aCwgTWV0aG9kRWxlbWVudCBtZXRob2RFbGVtZW50LCBMYWJlbCBsYWJlbCwgSUVkaXRvclNpdGUgZWRpdG9yU2l0ZSkgewotCQlNZXRob2RSaWNoVGV4dEVkaXRvckNvbnRleHQgY29udGV4dCA9IG5ldyBNZXRob2RSaWNoVGV4dEVkaXRvckNvbnRleHQocGFyZW50LCBzdHlsZSwgYmFzZVBhdGgsIG1ldGhvZEVsZW1lbnQsIGxhYmVsLCBlZGl0b3JTaXRlKTsKLQkJT2JqZWN0IHByb3ZpZGVyID0gRXh0ZW5zaW9uSGVscGVyLmNyZWF0ZShJTWV0aG9kUmljaFRleHRFZGl0b3IuY2xhc3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcHJvdmlkZXIgaW5zdGFuY2VvZiBJTWV0aG9kUmljaFRleHRFZGl0b3IgPyAoSU1ldGhvZFJpY2hUZXh0RWRpdG9yKSBwcm92aWRlciA6IG5ldyBNZXRob2RSaWNoVGV4dEVkaXRvcihjb250ZXh0KTsKLQl9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9NZXRob2RMaWJyYXJ5RGVzY3JpcHRpb25Gb3JtUGFnZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9NZXRob2RMaWJyYXJ5RGVzY3JpcHRpb25Gb3JtUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MmY3YzM2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvTWV0aG9kTGlicmFyeURlc2NyaXB0aW9uRm9ybVBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuTWV0aG9kRWxlbWVudEVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRm9jdXNBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRm9jdXNFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5JTWFuYWdlZEZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuZWRpdG9yLkZvcm1FZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuZWRpdG9yLkZvcm1QYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuRm9ybVRvb2xraXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5TY3JvbGxlZEZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5TZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuVGFibGVXcmFwRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLlRhYmxlV3JhcExheW91dDsKLQotCi0vKioKLSAqIERlc2NyaXB0aW9uIHBhZ2UgZm9yIG1ldGhvZCBsaWJyYXJ5Ci0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXRob2RMaWJyYXJ5RGVzY3JpcHRpb25Gb3JtUGFnZSBleHRlbmRzIEZvcm1QYWdlIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9WRVJUSUNBTF9JTkRFTlQgPSAyOwotCi0JcHJpdmF0ZSBUZXh0IGN0cmxfbmFtZTsKLQotCXByaXZhdGUgVGV4dCBjdHJsX2JyaWVmX2Rlc2M7Ci0KLQlwcml2YXRlIFNlY3Rpb24gZ2VuZXJhbFNlY3Rpb247Ci0KLQlwcml2YXRlIENvbXBvc2l0ZSBnZW5lcmFsQ29tcG9zaXRlOwotCi0JcHJpdmF0ZSBNZXRob2RMaWJyYXJ5IGxpYnJhcnk7Ci0KLQlwcml2YXRlIFRleHQgdGV4dEF1dGhvcnM7Ci0KLQlwcml2YXRlIFRleHQgY3RybF9jaGFuZ2VfZGF0ZTsKLQotCXByaXZhdGUgVGV4dCBjdHJsX2NoYW5nZV9kZXNjOwotCi0JcHJpdmF0ZSBUZXh0IGN0cmxfdmVyc2lvbjsKLQotCXByaXZhdGUgVGV4dCBjdHJsX2NvcHlyaWdodDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2UKLQkgKiBAcGFyYW0gZWRpdG9yCi0JICovCi0JcHVibGljIE1ldGhvZExpYnJhcnlEZXNjcmlwdGlvbkZvcm1QYWdlKEZvcm1FZGl0b3IgZWRpdG9yKSB7Ci0JCXN1cGVyKAotCQkJCWVkaXRvciwKLQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5kZXNjcmlwdGlvblBhZ2VfdGl0bGUsIEF1dGhvcmluZ1VJUmVzb3VyY2VzLmRlc2NyaXB0aW9uUGFnZV90aXRsZSk7IAotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuZm9ybXMuZWRpdG9yLkZvcm1QYWdlI2luaXQob3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGUsIG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElFZGl0b3JTaXRlIHNpdGUsIElFZGl0b3JJbnB1dCBpbnB1dCkgewotCQlzdXBlci5pbml0KHNpdGUsIGlucHV0KTsKLQotCQkvLyBnZXQgTWV0aG9kTGlicmFyeSBvYmplY3QgZnJvbSBFZGl0b3IgaW5wdXQKLQkJTWV0aG9kRWxlbWVudEVkaXRvcklucHV0IG1ldGhvZEVsZW1lbnRJbnB1dCA9IChNZXRob2RFbGVtZW50RWRpdG9ySW5wdXQpIGlucHV0OwotCi0JCU9iamVjdCBvYmogPSBtZXRob2RFbGVtZW50SW5wdXQuZ2V0TWV0aG9kRWxlbWVudCgpOwotCQlpZiAob2JqIGluc3RhbmNlb2YgTWV0aG9kTGlicmFyeSkgewotCQkJbGlicmFyeSA9IChNZXRob2RMaWJyYXJ5KSBvYmo7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBmb3JtIGNvbnRlbnQuCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuRm9ybVBhZ2UjY3JlYXRlRm9ybUNvbnRlbnQob3JnLmVjbGlwc2UudWkuZm9ybXMuSU1hbmFnZWRGb3JtKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUZvcm1Db250ZW50KElNYW5hZ2VkRm9ybSBtYW5hZ2VkRm9ybSkgewotCQkvLyBjcmVhdGUgZm9ybSB0b29sa2l0Ci0JCVNjcm9sbGVkRm9ybSBmb3JtID0gbWFuYWdlZEZvcm0uZ2V0Rm9ybSgpOwotCQlGb3JtVG9vbGtpdCB0b29sa2l0ID0gbWFuYWdlZEZvcm0uZ2V0VG9vbGtpdCgpOwotCQlmb3JtLnNldFRleHQoZ2V0RWRpdG9yKCkuZ2V0UGFydE5hbWUoKSk7Ci0KLQkJVGFibGVXcmFwTGF5b3V0IGxheW91dCA9IG5ldyBUYWJsZVdyYXBMYXlvdXQoKTsKLQkJZm9ybS5nZXRCb2R5KCkuc2V0TGF5b3V0KGxheW91dCk7Ci0KLQkJLy8gQ3JlYXRlIGVkaXRvciBjb250ZW50Ci0JCWNyZWF0ZUVkaXRvckNvbnRlbnQodG9vbGtpdCwgZm9ybS5nZXRCb2R5KCkpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBlZGl0b3IgdGFiIGNvbnRlbnQKLQkgKiAKLQkgKiBAcGFyYW0gdG9vbGtpdAotCSAqIEBwYXJhbSBlZGl0b3JDb21wb3NpdGUKLQkgKi8KLQlwcml2YXRlIHZvaWQgY3JlYXRlRWRpdG9yQ29udGVudChGb3JtVG9vbGtpdCB0b29sa2l0LAotCQkJQ29tcG9zaXRlIGVkaXRvckNvbXBvc2l0ZSkgewotCQkvLyBDcmVhdGUgR2VuZXJhbCBJbmZvcm1hdGlvbiBzZWN0aW9uCi0JCWdlbmVyYWxTZWN0aW9uID0gdG9vbGtpdC5jcmVhdGVTZWN0aW9uKGVkaXRvckNvbXBvc2l0ZSwKLQkJCQlTZWN0aW9uLkRFU0NSSVBUSU9OIHwgU2VjdGlvbi5UV0lTVElFIHwgU2VjdGlvbi5FWFBBTkRFRAotCQkJCQkJfCBTZWN0aW9uLlRJVExFX0JBUik7Ci0JCVRhYmxlV3JhcERhdGEgdGQgPSBuZXcgVGFibGVXcmFwRGF0YShUYWJsZVdyYXBEYXRhLkZJTExfR1JBQik7Ci0JCWdlbmVyYWxTZWN0aW9uLnNldExheW91dERhdGEodGQpOwotCQlnZW5lcmFsU2VjdGlvbgotCQkJCS5zZXRUZXh0KEF1dGhvcmluZ1VJUmVzb3VyY2VzLk1ldGhvZExpYnJhcnlEZXNjcmlwdGlvbkZvcm1QYWdlX3NlY3Rpb25fdGl0bGUpOyAKLQkJZ2VuZXJhbFNlY3Rpb24KLQkJCQkuc2V0RGVzY3JpcHRpb24oQXV0aG9yaW5nVUlSZXNvdXJjZXMuTWV0aG9kTGlicmFyeURlc2NyaXB0aW9uRm9ybVBhZ2Vfc2VjdGlvbl9kZXNjcmlwdGlvbik7IAotCQlnZW5lcmFsU2VjdGlvbi5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0KLQkJZ2VuZXJhbENvbXBvc2l0ZSA9IHRvb2xraXQuY3JlYXRlQ29tcG9zaXRlKGdlbmVyYWxTZWN0aW9uKTsKLQkJZ2VuZXJhbENvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQkJZ2VuZXJhbENvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpKTsKLQkJZ2VuZXJhbFNlY3Rpb24uc2V0Q2xpZW50KGdlbmVyYWxDb21wb3NpdGUpOwotCi0JCS8vIG5hbWUKLQkJTGFiZWwgbF9uYW1lID0gdG9vbGtpdC5jcmVhdGVMYWJlbChnZW5lcmFsQ29tcG9zaXRlLAotCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLm5hbWVfdGV4dCk7IAotCQl7Ci0JCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5CRUdJTk5JTkcpOwotCQkJZ3JpZERhdGEudmVydGljYWxJbmRlbnQgPSBERUZBVUxUX1ZFUlRJQ0FMX0lOREVOVDsKLQkJCWxfbmFtZS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJfQotCi0JCWN0cmxfbmFtZSA9IHRvb2xraXQuY3JlYXRlVGV4dChnZW5lcmFsQ29tcG9zaXRlLCAiIiwgU1dULlNJTkdMRSk7IC8vJE5PTi1OTFMtMSQKLQkJewotCQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMCi0JCQkJCXwgR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMKTsKLQkJCWdyaWREYXRhLndpZHRoSGludCA9IDQwMDsKLQkJCWdyaWREYXRhLnZlcnRpY2FsSW5kZW50ID0gREVGQVVMVF9WRVJUSUNBTF9JTkRFTlQ7Ci0JCQljdHJsX25hbWUuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCX0KLQotCQkvLyBicmllZiBkZXNjCi0JCUxhYmVsIGxfYnJpZWZfZGVzYyA9IHRvb2xraXQuY3JlYXRlTGFiZWwoZ2VuZXJhbENvbXBvc2l0ZSwKLQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5kZXNjcmlwdGlvbl90ZXh0KTsgCi0JCXsKLQkJCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkJFR0lOTklORyk7Ci0JCQlncmlkRGF0YS52ZXJ0aWNhbEluZGVudCA9IERFRkFVTFRfVkVSVElDQUxfSU5ERU5UOwotCQkJbF9icmllZl9kZXNjLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQl9Ci0KLQkJY3RybF9icmllZl9kZXNjID0gdG9vbGtpdC5jcmVhdGVUZXh0KGdlbmVyYWxDb21wb3NpdGUsCi0JCQkJIiIsIFNXVC5NVUxUSSB8IFNXVC5XUkFQKTsgLy8kTk9OLU5MUy0xJAotCQl7Ci0JCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwKLQkJCQkJfCBHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwpOwotCQkJZ3JpZERhdGEuaGVpZ2h0SGludCA9IDQwOwotCQkJZ3JpZERhdGEud2lkdGhIaW50ID0gNDAwOwotCQkJZ3JpZERhdGEudmVydGljYWxJbmRlbnQgPSBERUZBVUxUX1ZFUlRJQ0FMX0lOREVOVDsKLQkJCWN0cmxfYnJpZWZfZGVzYy5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJfQotCi0JCS8vIEF1dGhvcnMKLQkJTGFiZWwgbGFiZWwgPSB0b29sa2l0LmNyZWF0ZUxhYmVsKGdlbmVyYWxDb21wb3NpdGUsCi0JCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuYXV0aG9yc190ZXh0KTsgCi0JCXsKLQkJCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkJFR0lOTklORyk7Ci0JCQlncmlkRGF0YS52ZXJ0aWNhbEluZGVudCA9IERFRkFVTFRfVkVSVElDQUxfSU5ERU5UOwotCQkJbGFiZWwuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCX0KLQotCQl0ZXh0QXV0aG9ycyA9IHRvb2xraXQuY3JlYXRlVGV4dChnZW5lcmFsQ29tcG9zaXRlLAotCQkJCSIiLCBTV1QuTVVMVEkgfCBTV1QuV1JBUCk7IC8vJE5PTi1OTFMtMSQKLQkJewotCQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMCi0JCQkJCXwgR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMKTsKLQkJCWdyaWREYXRhLmhlaWdodEhpbnQgPSA0MDsKLQkJCWdyaWREYXRhLndpZHRoSGludCA9IDQwMDsKLQkJCWdyaWREYXRhLnZlcnRpY2FsSW5kZW50ID0gREVGQVVMVF9WRVJUSUNBTF9JTkRFTlQ7Ci0JCQl0ZXh0QXV0aG9ycy5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJfQotCi0JCS8vIENoYW5nZSBEYXRlCi0JCUxhYmVsIGxfY2hhbmdlZGF0ZSA9IHRvb2xraXQuY3JlYXRlTGFiZWwoZ2VuZXJhbENvbXBvc2l0ZSwgIiIpOyAvLyROT04tTkxTLTEkCi0JCXsKLQkJCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkJFR0lOTklORyk7Ci0JCQlncmlkRGF0YS52ZXJ0aWNhbEluZGVudCA9IERFRkFVTFRfVkVSVElDQUxfSU5ERU5UOwotCQkJbF9jaGFuZ2VkYXRlLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQl9Ci0KLQkJY3RybF9jaGFuZ2VfZGF0ZSA9IHRvb2xraXQuY3JlYXRlVGV4dChnZW5lcmFsQ29tcG9zaXRlLAotCQkJCSIiLCBTV1QuUkVBRF9PTkxZKTsgLy8kTk9OLU5MUy0xJAotCQl7Ci0JCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwKLQkJCQkJfCBHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwpOwotCQkJZ3JpZERhdGEudmVydGljYWxJbmRlbnQgPSBERUZBVUxUX1ZFUlRJQ0FMX0lOREVOVDsKLQkJCWN0cmxfY2hhbmdlX2RhdGUuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCX0KLQotCQkvLyBBdXRob3JzCi0JCUxhYmVsIGxfY2hhbmdlX2Rlc2MgPSB0b29sa2l0LmNyZWF0ZUxhYmVsKGdlbmVyYWxDb21wb3NpdGUsCi0JCQkJQXV0aG9yaW5nVUlUZXh0LkNIQU5HRV9ERVNDUklQVElPTl9URVhUKTsKLQkJewotCQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuQkVHSU5OSU5HKTsKLQkJCWdyaWREYXRhLnZlcnRpY2FsSW5kZW50ID0gREVGQVVMVF9WRVJUSUNBTF9JTkRFTlQ7Ci0JCQlsX2NoYW5nZV9kZXNjLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQl9Ci0KLQkJY3RybF9jaGFuZ2VfZGVzYyA9IHRvb2xraXQuY3JlYXRlVGV4dChnZW5lcmFsQ29tcG9zaXRlLCAiIiwgU1dULk1VTFRJKTsgLy8kTk9OLU5MUy0xJAotCQl7Ci0JCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwKLQkJCQkJfCBHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwpOwotCQkJZ3JpZERhdGEuaGVpZ2h0SGludCA9IDQwOwotCQkJZ3JpZERhdGEudmVydGljYWxJbmRlbnQgPSBERUZBVUxUX1ZFUlRJQ0FMX0lOREVOVDsKLQkJCWN0cmxfY2hhbmdlX2Rlc2Muc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCX0KLQotCQkvLyBWZXJzaW9uCi0JCUxhYmVsIGxfdmVyc2lvbiA9IHRvb2xraXQuY3JlYXRlTGFiZWwoZ2VuZXJhbENvbXBvc2l0ZSwKLQkJCQlBdXRob3JpbmdVSVRleHQuVkVSU0lPTl9URVhUKTsKLQkJewotCQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuQkVHSU5OSU5HKTsKLQkJCWdyaWREYXRhLnZlcnRpY2FsSW5kZW50ID0gREVGQVVMVF9WRVJUSUNBTF9JTkRFTlQ7Ci0JCQlsX3ZlcnNpb24uc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCX0KLQotCQljdHJsX3ZlcnNpb24gPSB0b29sa2l0LmNyZWF0ZVRleHQoZ2VuZXJhbENvbXBvc2l0ZSwgIiIsIFNXVC5NVUxUSSk7IC8vJE5PTi1OTFMtMSQKLQkJewotCQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMCi0JCQkJCXwgR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMKTsKLQkJCWdyaWREYXRhLnZlcnRpY2FsSW5kZW50ID0gREVGQVVMVF9WRVJUSUNBTF9JTkRFTlQ7Ci0JCQljdHJsX3ZlcnNpb24uc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCX0KLQkJTGFiZWwgbF9jb3B5cmlnaHQgPSB0b29sa2l0LmNyZWF0ZUxhYmVsKGdlbmVyYWxDb21wb3NpdGUsCi0JCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuY29weXJpZ2h0X3RleHQpOyAKLQkJewotCQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuQkVHSU5OSU5HKTsKLQkJCWdyaWREYXRhLnZlcnRpY2FsSW5kZW50ID0gREVGQVVMVF9WRVJUSUNBTF9JTkRFTlQ7Ci0JCQlsX2NvcHlyaWdodC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJfQotCQljdHJsX2NvcHlyaWdodCA9IHRvb2xraXQuY3JlYXRlVGV4dChnZW5lcmFsQ29tcG9zaXRlLCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJewotCQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMCi0JCQkJCXwgR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMKTsKLQkJCWdyaWREYXRhLmhlaWdodEhpbnQgPSA0MDsKLQkJCWdyaWREYXRhLndpZHRoSGludCA9IDQwMDsKLQkJCWdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMTsKLQkJCWdyaWREYXRhLnZlcnRpY2FsSW5kZW50ID0gREVGQVVMVF9WRVJUSUNBTF9JTkRFTlQ7Ci0JCQljdHJsX2NvcHlyaWdodC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJfQotCi0JCXRvb2xraXQucGFpbnRCb3JkZXJzRm9yKGdlbmVyYWxDb21wb3NpdGUpOwotCi0JCWFkZExpc3RlbmVycygpOwotCQlsb2FkRGF0YSgpOwotCi0JCS8vIFNldCBmb2N1cyBvbiB0aGUgbmFtZSBhdHRyaWJ1dGUKLQkJRGlzcGxheSBkaXNwbGF5ID0gZWRpdG9yQ29tcG9zaXRlLmdldERpc3BsYXkoKTsKLQkJaWYgKCEoZGlzcGxheSA9PSBudWxsIHx8IGRpc3BsYXkuaXNEaXNwb3NlZCgpKSkgewotCQkJZGlzcGxheS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJY3RybF9uYW1lLnNldEZvY3VzKCk7Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLmZvcm1zLmVkaXRvci5Gb3JtUGFnZSNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotCi0JLyoqCi0JICogTG9hZHMgaW5pdGlhbCBkYXRhIGZyb20gbW9kZWwKLQkgKi8KLQlwcml2YXRlIHZvaWQgbG9hZERhdGEoKSB7Ci0JCVN0cmluZyBuYW1lID0gbGlicmFyeS5nZXROYW1lKCk7Ci0JCVN0cmluZyBicmllZl9kZXNjID0gbGlicmFyeS5nZXRCcmllZkRlc2NyaXB0aW9uKCk7Ci0KLQkJY3RybF9uYW1lLnNldFRleHQoVG5nVXRpbC5jaGVja051bGwobmFtZSkpOwotCQljdHJsX2JyaWVmX2Rlc2Muc2V0VGV4dChUbmdVdGlsLmNoZWNrTnVsbChicmllZl9kZXNjKSk7Ci0JCXRleHRBdXRob3JzLnNldFRleHQoVG5nVXRpbC5jaGVja051bGwobGlicmFyeS5nZXRBdXRob3JzKCkpKTsKLQkJaWYgKGxpYnJhcnkuZ2V0Q2hhbmdlRGF0ZSgpICE9IG51bGwpIHsKLQkJCWN0cmxfY2hhbmdlX2RhdGUuc2V0VGV4dChUbmdVdGlsLmNoZWNrTnVsbChsaWJyYXJ5LmdldENoYW5nZURhdGUoKQotCQkJCQkudG9Mb2NhbGVTdHJpbmcoKSkpOwotCQl9Ci0JCWN0cmxfY2hhbmdlX2Rlc2Muc2V0VGV4dChUbmdVdGlsLmNoZWNrTnVsbChsaWJyYXJ5Ci0JCQkJLmdldENoYW5nZURlc2NyaXB0aW9uKCkpKTsKLQkJY3RybF92ZXJzaW9uLnNldFRleHQoVG5nVXRpbC5jaGVja051bGwobGlicmFyeS5nZXRWZXJzaW9uKCkpKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGQgZm9jdXMgbGlzdGVuZXJzCi0JICogCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZExpc3RlbmVycygpIHsKLQkJY3RybF9uYW1lLmFkZEZvY3VzTGlzdGVuZXIobmV3IEZvY3VzQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGZvY3VzTG9zdChGb2N1c0V2ZW50IGUpIHsKLQkJCQlsaWJyYXJ5LnNldE5hbWUoY3RybF9uYW1lLmdldFRleHQoKSk7Ci0JCQl9Ci0JCX0pOwotCi0JCWN0cmxfYnJpZWZfZGVzYy5hZGRGb2N1c0xpc3RlbmVyKG5ldyBGb2N1c0FkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBmb2N1c0xvc3QoRm9jdXNFdmVudCBlKSB7Ci0JCQkJbGlicmFyeS5zZXRCcmllZkRlc2NyaXB0aW9uKGN0cmxfYnJpZWZfZGVzYy5nZXRUZXh0KCkpOwotCQkJfQotCQl9KTsKLQotCQl0ZXh0QXV0aG9ycy5hZGRGb2N1c0xpc3RlbmVyKG5ldyBGb2N1c0FkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBmb2N1c0xvc3QoRm9jdXNFdmVudCBlKSB7Ci0JCQkJbGlicmFyeS5zZXRBdXRob3JzKHRleHRBdXRob3JzLmdldFRleHQoKSk7Ci0JCQl9Ci0JCX0pOwotCi0JCWN0cmxfY2hhbmdlX2Rlc2MuYWRkRm9jdXNMaXN0ZW5lcihuZXcgRm9jdXNBZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgZm9jdXNMb3N0KEZvY3VzRXZlbnQgZSkgewotCQkJCWxpYnJhcnkuc2V0Q2hhbmdlRGVzY3JpcHRpb24oY3RybF9jaGFuZ2VfZGVzYy5nZXRUZXh0KCkpOwotCQkJfQotCQl9KTsKLQotCQljdHJsX3ZlcnNpb24uYWRkRm9jdXNMaXN0ZW5lcihuZXcgRm9jdXNBZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgZm9jdXNMb3N0KEZvY3VzRXZlbnQgZSkgewotCQkJCWxpYnJhcnkuc2V0VmVyc2lvbihjdHJsX3ZlcnNpb24uZ2V0VGV4dCgpKTsKLQkJCX0KLQkJfSk7Ci0KLQkJY3RybF9jb3B5cmlnaHQuYWRkRm9jdXNMaXN0ZW5lcihuZXcgRm9jdXNBZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgZm9jdXNMb3N0KEZvY3VzRXZlbnQgZSkgewotCQkJfQotCQl9KTsKLQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9NZXRob2RQbHVnaW5EZXNjcmlwdGlvblBhZ2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvTWV0aG9kUGx1Z2luRGVzY3JpcHRpb25QYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkNTRlYWEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9NZXRob2RQbHVnaW5EZXNjcmlwdGlvblBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyNyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQWJzdHJhY3RUcmVlSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5FZGl0b3JDaG9vc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5NZXRob2RFbGVtZW50RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudmlld3MuVmlld0hlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLlN0clV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSUFjdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLlJlbW92ZVJlZmVyZW5jZXNDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Db21wYXJhdG9yczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuTWlzYzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5MaWJyYXJ5VUlUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuTGlicmFyeVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5QbHVnaW5SZWZlcmVuY2VDaGVja2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy5JTGlicmFyeVBlcnNpc3RlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5NZXNzYWdlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2hlY2tTdGF0ZUNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNoZWNrYm94VGFibGVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ2hlY2tTdGF0ZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQnVzeUluZGljYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkZvY3VzQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkZvY3VzRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuZWRpdG9yLkZvcm1FZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5Gb3JtVG9vbGtpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLlNlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5UYWJsZVdyYXBEYXRhOwotCi0vKioKLSAqIERlc2NyaXB0aW9uIHBhZ2UgZm9yIG1ldGhvZCBwbHVnaW4KLSAqIAotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqIGZpeCBmb3IgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE3NjM4MgotICovCi1wdWJsaWMgY2xhc3MgTWV0aG9kUGx1Z2luRGVzY3JpcHRpb25QYWdlIGV4dGVuZHMgRGVzY3JpcHRpb25Gb3JtUGFnZSBpbXBsZW1lbnRzIElSZWZyZXNoYWJsZSB7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JNX1BSRUZJWCA9IExpYnJhcnlVSVRleHQuVEVYVF9NRVRIT0RfUExVR0lOCi0JCQkrICI6ICI7IC8vJE5PTi1OTFMtMSQKLQotCi0JcHJvdGVjdGVkIFRleHQgY3RybF9yX2JyaWVmX2Rlc2M7Ci0JcHJvdGVjdGVkIENoZWNrYm94VGFibGVWaWV3ZXIgY3RybF9yZWZNb2RlbDsKLQlwcm90ZWN0ZWQgU2VjdGlvbiByZWZNb2RlbFNlY3Rpb247Ci0JcHJvdGVjdGVkIENvbXBvc2l0ZSByZWZNb2RlbENvbXBvc2l0ZTsKLQotCXByb3RlY3RlZCBNZXRob2RQbHVnaW4gcGx1Z2luOwotCi0JcHJvdGVjdGVkIEJ1dHRvbiBjdHJsX2NoYW5nZWFibGU7Ci0JcHJvdGVjdGVkIEJ1dHRvbiBzdXBwb3J0aW5nUGx1Z2luQ2hlY2tib3g7Ci0KLQlwdWJsaWMgYm9vbGVhbiBub3RpZmljYXRpb25FbmFibGVkID0gdHJ1ZTsKLQotCXByb3RlY3RlZCBBZGFwdGVyIHVzZXJDaGFuZ2VhYmxlQWRhcHRlcjsKLQotCXByb3RlY3RlZCBNb2RpZnlMaXN0ZW5lciBuYW1lTW9kaWZ5TGlzdGVuZXI7Ci0JCi0JcHJvdGVjdGVkIElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgcmVmTW9kZWxTZWxDaGFuZ2VkTGlzdGVuZXIgPSBuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0ZWRMaXN0ID0gKFN0cnVjdHVyZWRTZWxlY3Rpb24pIGV2ZW50Ci0JCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQkJCU1ldGhvZFBsdWdpbiBzZWxlY3RlZE9iaiA9IChNZXRob2RQbHVnaW4pIHNlbGVjdGVkTGlzdAotCQkJCQkuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCQlpZiAoc2VsZWN0ZWRPYmogPT0gbnVsbCkKLQkJCQlyZXR1cm47Ci0JCQljdHJsX3JfYnJpZWZfZGVzYy5zZXRUZXh0KHNlbGVjdGVkT2JqCi0JCQkJCS5nZXRCcmllZkRlc2NyaXB0aW9uKCkpOwotCQl9Ci0JfTsKLQkKLQlwcm90ZWN0ZWQgSUNoZWNrU3RhdGVMaXN0ZW5lciByZWZNb2RlbENoZWNrU3RhdGVMaXN0ZW5lciA9IG5ldyBJQ2hlY2tTdGF0ZUxpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBjaGVja1N0YXRlQ2hhbmdlZChDaGVja1N0YXRlQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQlPYmplY3Qgb2JqID0gZXZlbnQuZ2V0RWxlbWVudCgpOwotCi0JCQljdHJsX3JfYnJpZWZfZGVzYy5zZXRUZXh0KCgoTWV0aG9kUGx1Z2luKSBvYmopCi0JCQkJCS5nZXRCcmllZkRlc2NyaXB0aW9uKCkpOwotCi0JCQlpZiAoVG5nVXRpbC5pc0xvY2tlZChwbHVnaW4pKSB7Ci0JCQkJY3RybF9yZWZNb2RlbC5zZXRDaGVja2VkKG9iaiwgIWV2ZW50LmdldENoZWNrZWQoKSk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCi0JCQlpZiAoZXZlbnQuZ2V0Q2hlY2tlZCgpKSB7Ci0JCQkJLy8gVE9ETzogQ2hhbmdlIHRoaXMgdG8gYmUgbm90IHVuLWRvYWJsZSBkdWUgdG8gdGhlIGNpcmN1bGFyCi0JCQkJLy8gZGVwZW5kZW5jeSBjaGVjay4KLQkJCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuQURELCBwbHVnaW4sCi0JCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRNZXRob2RQbHVnaW5fQmFzZXMoKSwKLQkJCQkJCShNZXRob2RQbHVnaW4pIG9iaiwgLTEpOwotCQkJfSBlbHNlIHsKLQkJCQlmaW5hbCBNZXRob2RQbHVnaW4gYmFzZSA9IChNZXRob2RQbHVnaW4pIG9iajsKLQkJCQkKLQkJCQlpZihyZW1vdmVBbGxSZWZlcmVuY2VzKGJhc2UpKXsKLQkJCQkJY3RybF9yZWZNb2RlbC5zZXRDaGVja2VkKGJhc2UsIGZhbHNlKTsKLQkJCQl9ZWxzZXsKLQkJCQkJRGlzcGxheS5nZXRDdXJyZW50KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQljdHJsX3JlZk1vZGVsLnNldENoZWNrZWQoYmFzZSwgdHJ1ZSk7Ci0JCQkJCQl9Ci0JCQkJCX0pOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCS8vIGNoYW5nZSB0aGlzIHRvIGJlIG5vdCB1bi1kb2FibGUgZHVlIHRvIHRoZSBjaXJjdWxhcgotCQkJCS8vIGRlcGVuZGVuY3kgY2hlY2sKLQkJCQkvLyBwbHVnaW4uZ2V0QmFzZXMoKS5yZW1vdmUob2JqKTsKLQkJCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuUkVNT1ZFLCBwbHVnaW4sCi0JCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRNZXRob2RQbHVnaW5fQmFzZXMoKSwKLQkJCQkJCShNZXRob2RQbHVnaW4pIG9iaiwgLTEpOwotCQkJfQotCi0JCQkvLyBkb3VibGUgY2hlY2sgY2lyY3VsYXIgZGVwZW5kZW5jeSwgbm90IG5lY2Vzc2FyeSBoZXJlCi0JCQlQbHVnaW5SZWZlcmVuY2VDaGVja2VyLmhhc0NpcmN1bGFyQ29uZmxpY3RXaXRoUGx1Z2luKHBsdWdpbik7Ci0KLQkJCXVwZGF0ZUNoYW5nZURhdGUoKTsKLQkJfQotCi0JfTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIE1ldGhvZFBsdWdpbkRlc2NyaXB0aW9uUGFnZShGb3JtRWRpdG9yIGVkaXRvcikgewotCQlzdXBlcihlZGl0b3IsIEF1dGhvcmluZ1VJVGV4dC5ERVNDUklQVElPTl9QQUdFX1RJVExFLAotCQkJCUF1dGhvcmluZ1VJVGV4dC5ERVNDUklQVElPTl9QQUdFX1RJVExFKTsKLQotCQl1c2VyQ2hhbmdlYWJsZUFkYXB0ZXIgPSBuZXcgVXNlckNoYW5nZWFibGVBZGFwdGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkJhc2VGb3JtUGFnZSNpbml0KG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlLCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJRWRpdG9yU2l0ZSBzaXRlLCBJRWRpdG9ySW5wdXQgaW5wdXQpIHsKLQkJc3VwZXIuaW5pdChzaXRlLCBpbnB1dCk7Ci0JCXBsdWdpbiA9IChNZXRob2RQbHVnaW4pIG1ldGhvZEVsZW1lbnQ7Ci0JCWlmICh1c2VyQ2hhbmdlYWJsZUFkYXB0ZXIgIT0gbnVsbCkgewotCQkJcGx1Z2luLmVBZGFwdGVycygpLmFkZCh1c2VyQ2hhbmdlYWJsZUFkYXB0ZXIpOwotCQl9Ci0JCWRldGFpbFNlY3Rpb25PbiA9IGZhbHNlOwotCQlmdWxsRGVzY09uID0gZmFsc2U7Ci0JCWtleUNvbnNpZGVyYXRpb25PbiA9IGZhbHNlOwotCQl2YXJpYWJpbGl0eVNlY3Rpb25PbiA9IGZhbHNlOwotCQkKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNjcmVhdGVFZGl0b3JDb250ZW50KEZvcm1Ub29sa2l0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUVkaXRvckNvbnRlbnQoRm9ybVRvb2xraXQgdG9vbGtpdCkgewotCQlzdXBlci5jcmVhdGVFZGl0b3JDb250ZW50KHRvb2xraXQpOwotCQljcmVhdGVSZWZlcmVuY2VTZWN0aW9uKHRvb2xraXQpOwotCQkvLyBTZXQgZm9jdXMgb24gdGhlIE5hbWUgdGV4dCBjb250cm9sLgotCQlEaXNwbGF5IGRpc3BsYXkgPSBmb3JtLmdldEJvZHkoKS5nZXREaXNwbGF5KCk7Ci0JCWlmICghKGRpc3BsYXkgPT0gbnVsbCB8fCBkaXNwbGF5LmlzRGlzcG9zZWQoKSkpIHsKLQkJCWRpc3BsYXkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCWlmKGN0cmxfbmFtZS5pc0Rpc3Bvc2VkKCkpIHJldHVybjsKLQkJCQkJY3RybF9uYW1lLnNldEZvY3VzKCk7Ci0JCQkJCWN0cmxfbmFtZS5zZXRTZWxlY3Rpb24oMCwgY3RybF9uYW1lLmdldFRleHQoKS5sZW5ndGgoKSk7Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVSZWZlcmVuY2VDb250ZW50KEZvcm1Ub29sa2l0IHRvb2xraXQpIHsKLQotCQlUYWJsZSBjdHJsX3RhYmxlID0gdG9vbGtpdC5jcmVhdGVUYWJsZShyZWZNb2RlbENvbXBvc2l0ZSwgU1dULkNIRUNLKTsKLQkJewotCQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuQkVHSU5OSU5HCi0JCQkJCXwgR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJCWdyaWREYXRhLmhlaWdodEhpbnQgPSAxMDA7Ci0JCQljdHJsX3RhYmxlLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQl9Ci0KLQkJY3RybF9yZWZNb2RlbCA9IG5ldyBDaGVja2JveFRhYmxlVmlld2VyKGN0cmxfdGFibGUpOwotCQlJTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyID0gbmV3IExhYmVsUHJvdmlkZXIoKSB7Ci0JCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gKE1ldGhvZFBsdWdpbikgZWxlbWVudDsKLQkJCQlyZXR1cm4gcGx1Z2luLmdldE5hbWUoKTsKLQkJCX0KLQkJfTsKLQkJY3RybF9yZWZNb2RlbC5zZXRMYWJlbFByb3ZpZGVyKGxhYmVsUHJvdmlkZXIpOwotCi0JCWNyZWF0ZVJlZk1vZGVsQnJpZWZEZXNjRmllbGQodG9vbGtpdCk7Ci0KLQkJdG9vbGtpdC5wYWludEJvcmRlcnNGb3IocmVmTW9kZWxDb21wb3NpdGUpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZVJlZk1vZGVsQnJpZWZEZXNjRmllbGQoRm9ybVRvb2xraXQgdG9vbGtpdCkgewotCQlMYWJlbCBsX3JfYnJpZWZfZGVzYyA9IHRvb2xraXQuY3JlYXRlTGFiZWwocmVmTW9kZWxDb21wb3NpdGUsCi0JCQkJQXV0aG9yaW5nVUlUZXh0LkJSSUVGX0RFU0NSSVBUSU9OX1RFWFQpOwotCQl7Ci0JCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5CRUdJTk5JTkcpOwotCQkJZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQkJbF9yX2JyaWVmX2Rlc2Muc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCX0KLQotCQljdHJsX3JfYnJpZWZfZGVzYyA9IHRvb2xraXQuY3JlYXRlVGV4dChyZWZNb2RlbENvbXBvc2l0ZSwKLQkJCQkiIiwgU1dULk1VTFRJIHwgU1dULldSQVAgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuUkVBRF9PTkxZKTsgLy8kTk9OLU5MUy0xJAotCQl7Ci0JCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwKLQkJCQkJfCBHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwpOwotCQkJZ3JpZERhdGEuaGVpZ2h0SGludCA9IDgwOwotCQkJZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQkJY3RybF9yX2JyaWVmX2Rlc2Muc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVSZWZlcmVuY2VTZWN0aW9uKEZvcm1Ub29sa2l0IHRvb2xraXQpIHsKLQkJLy8gUmVmIE1vZGVsIFNlY3Rpb24KLQkJcmVmTW9kZWxTZWN0aW9uID0gdG9vbGtpdC5jcmVhdGVTZWN0aW9uKHNlY3Rpb25Db21wb3NpdGUsCi0JCQkJU2VjdGlvbi5ERVNDUklQVElPTiB8IFNlY3Rpb24uVFdJU1RJRSB8IFNlY3Rpb24uRVhQQU5ERUQKLQkJCQkJCXwgU2VjdGlvbi5USVRMRV9CQVIpOwotCQlHcmlkRGF0YSB0ZDEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJcmVmTW9kZWxTZWN0aW9uLnNldExheW91dERhdGEodGQxKTsKLQkJcmVmTW9kZWxTZWN0aW9uCi0JCQkJLnNldFRleHQoQXV0aG9yaW5nVUlUZXh0LlJFRkVSRU5DRURfUExVR0lOU19TRUNUSU9OX05BTUUpOwotCQlyZWZNb2RlbFNlY3Rpb24KLQkJCQkuc2V0RGVzY3JpcHRpb24oQXV0aG9yaW5nVUlUZXh0LlJFRkVSRU5DRURfUExVR0lOU19TRUNUSU9OX0RFU0MpOwotCQlyZWZNb2RlbFNlY3Rpb24uc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCi0JCXJlZk1vZGVsQ29tcG9zaXRlID0gdG9vbGtpdC5jcmVhdGVDb21wb3NpdGUocmVmTW9kZWxTZWN0aW9uKTsKLQkJcmVmTW9kZWxDb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCXJlZk1vZGVsQ29tcG9zaXRlLnNldExheW91dChuZXcgR3JpZExheW91dCgyLCBmYWxzZSkpOwotCQlyZWZNb2RlbFNlY3Rpb24uc2V0Q2xpZW50KHJlZk1vZGVsQ29tcG9zaXRlKTsKLQkJY3JlYXRlUmVmZXJlbmNlQ29udGVudCh0b29sa2l0KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRDaGVja2JveEZvckN1cnJlbnRCYXNlKExpc3Q8TWV0aG9kUGx1Z2luPiBjdXJyZW50QmFzZUxpc3QpIHsKLQkJY3RybF9yZWZNb2RlbC5zZXRBbGxDaGVja2VkKGZhbHNlKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjdXJyZW50QmFzZUxpc3Quc2l6ZSgpOyBpKyspIHsKLQkJCU1ldGhvZFBsdWdpbiBtb2RlbCA9IChNZXRob2RQbHVnaW4pIGN1cnJlbnRCYXNlTGlzdC5nZXQoaSk7Ci0JCQljdHJsX3JlZk1vZGVsLnNldENoZWNrZWQobW9kZWwsIHRydWUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQWRkIGxpc3RlbmVycwotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZExpc3RlbmVycygpIHsKLQkJc3VwZXIuYWRkTGlzdGVuZXJzKCk7Ci0KLQkJZmluYWwgTWV0aG9kRWxlbWVudEVkaXRvciBlZGl0b3IgPSAoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCk7Ci0KLQkJZm9ybS5hZGRMaXN0ZW5lcihTV1QuQWN0aXZhdGUsIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQlyZWZyZXNoUmVmZXJlbmNlZE1vZGVscygpOwotCi0JCQkJaWYgKCFwbHVnaW4uZ2V0VXNlckNoYW5nZWFibGUoKS5ib29sZWFuVmFsdWUoKSkgewotCQkJCQlyZWZyZXNoKGZhbHNlKTsKLQkJCQl9IGVsc2UgewotCQkJCQlyZWZyZXNoKHRydWUpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJY3RybF9uYW1lLnJlbW92ZUZvY3VzTGlzdGVuZXIobmFtZUZvY3VzTGlzdGVuZXIpOwotCQluYW1lTW9kaWZ5TGlzdGVuZXIgPSBlZGl0b3IuY3JlYXRlTW9kaWZ5TGlzdGVuZXIocGx1Z2luLCB0cnVlKTsKLQkJY3RybF9uYW1lLmFkZE1vZGlmeUxpc3RlbmVyKG5hbWVNb2RpZnlMaXN0ZW5lcik7Ci0JCWN0cmxfbmFtZS5hZGRMaXN0ZW5lcihTV1QuRGVhY3RpdmF0ZSwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCVN0cmluZyBvbGRDb250ZW50ID0gcGx1Z2luLmdldE5hbWUoKTsKLQkJCQlpZiAoKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkubXVzdFJlc3RvcmVWYWx1ZSgKLQkJCQkJCWUud2lkZ2V0LCBvbGRDb250ZW50KSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCWlmIChjdHJsX25hbWUuZ2V0VGV4dCgpLmVxdWFscyhwbHVnaW4uZ2V0TmFtZSgpKSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCi0JCQkJLy8gQ2hlY2sgaW52YWxpZCBjaGFyYWN0ZXJzIGZpcnN0LgotCQkJCQotCQkJCS8vIDE3ODQ2MgotCQkJCVN0cmluZyBtc2cgPSBudWxsOwotCQkJCVN0cmluZyBuYW1lID0gY3RybF9uYW1lLmdldFRleHQoKS50cmltKCk7Ci0JCQkJaWYgKG5hbWUgIT0gbnVsbCkgewotCQkJCQlpZiAob2xkQ29udGVudC5pbmRleE9mKCImIikgPCAwICYmIG5hbWUuaW5kZXhPZigiJiIpID4gLTEpIHsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQltc2cgPSBOTFMKLQkJCQkJCQkJLmJpbmQoCi0JCQkJCQkJCQkJTGlicmFyeUVkaXRSZXNvdXJjZXMuaW52YWxpZEVsZW1lbnROYW1lRXJyb3I0X21zZywKLQkJCQkJCQkJCQluYW1lKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCW1zZyA9IExpYnJhcnlVdGlsLmNoZWNrUGx1Z2luTmFtZShudWxsLCBuYW1lKTsKLQkJCQkJfQotCQkJCX0KLQkJCQkKLQkJCQlTdHJpbmcgdmFsaWROYW1lID0gU3RyVXRpbC5tYWtlVmFsaWRGaWxlTmFtZShjdHJsX25hbWUKLQkJCQkJCS5nZXRUZXh0KCkpOwotCQkJCWlmIChtc2cgPT0gbnVsbCkgewotCQkJCQkvLyBDaGVjayBkdXBsaWNhdGUgcGx1Zy1pbiBuYW1lLgotCQkJCQltc2cgPSBMaWJyYXJ5VXRpbC5jaGVja1BsdWdpbk5hbWUocGx1Z2luLCB2YWxpZE5hbWUpOwotCQkJCX0KLQkJCQlpZiAobXNnID09IG51bGwpIHsKLQkJCQkJaWYgKCF2YWxpZE5hbWUuZXF1YWxzKHBsdWdpbi5nZXROYW1lKCkpKSB7Ci0JCQkJCQlTaGVsbCBzaGVsbCA9IGdldFNpdGUoKS5nZXRTaGVsbCgpOwotCQkJCQkJbXNnID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuYmluZChBdXRob3JpbmdVSVJlc291cmNlcy5tZXRob2RQbHVnaW5EZXNjcmlwdGlvblBhZ2VfY29uZmlybVJlbmFtZSwgKG5ldyBPYmplY3RbXSB7IHBsdWdpbi5nZXROYW1lKCksIGN0cmxfbmFtZS5nZXRUZXh0KCkgfSkpOyAKLQkJCQkJCVN0cmluZyB0aXRsZSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLm1ldGhvZFBsdWdpbkRlc2NyaXB0aW9uUGFnZV9jb25maXJtUmVuYW1lX3RpdGxlOyAKLQkJCQkJCWlmICghTWVzc2FnZURpYWxvZy5vcGVuQ29uZmlybShzaGVsbCwgdGl0bGUsIG1zZykpIHsKLQkJCQkJCQljdHJsX25hbWUuc2V0VGV4dChwbHVnaW4uZ2V0TmFtZSgpKTsKLQkJCQkJCQlyZXR1cm47Ci0JCQkJCQl9Ci0KLQkJCQkJCWUuZG9pdCA9IHRydWU7Ci0JCQkJCQlFZGl0b3JDaG9vc2VyLmdldEluc3RhbmNlKCkuY2xvc2VNZXRob2RFZGl0b3JzRm9yUGx1Z2luRWxlbWVudHMocGx1Z2luKTsKLQkJCQkJCWN0cmxfbmFtZS5zZXRUZXh0KHZhbGlkTmFtZSk7Ci0JCQkJCQlib29sZWFuIHN0YXR1cyA9IGFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5TRVQsCi0JCQkJCQkJCXBsdWdpbiwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCQkuZ2V0TmFtZWRFbGVtZW50X05hbWUoKSwgdmFsaWROYW1lLCAtMSk7Ci0KLQkJCQkJCWlmICghc3RhdHVzKSB7Ci0JCQkJCQkJcmV0dXJuOwotCQkJCQkJfQotCQkJCQkJZm9ybS5zZXRUZXh0KEZPUk1fUFJFRklYICsgcGx1Z2luLmdldE5hbWUoKSk7Ci0JCQkJCQl1cGRhdGVDaGFuZ2VEYXRlKCk7Ci0KLQkJCQkJCS8vIGFkanVzdCBwbHVnaW4gbG9jYXRpb24gYW5kIHNhdmUgdGhlIGVkaXRvcgotCQkJCQkJLy8KLQkJCQkJCUJ1c3lJbmRpY2F0b3Iuc2hvd1doaWxlKGdldFNpdGUoKS5nZXRTaGVsbCgpCi0JCQkJCQkJCS5nZXREaXNwbGF5KCksIG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJCU1ldGhvZEVsZW1lbnRFZGl0b3IgZWRpdG9yID0gKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpOwotCQkJCQkJCQllZGl0b3IuZG9TYXZlKG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQkJCQkJCQlJTGlicmFyeVBlcnNpc3Rlci5GYWlsU2FmZU1ldGhvZExpYnJhcnlQZXJzaXN0ZXIgcGVyc2lzdGVyID0gZWRpdG9yCi0JCQkJCQkJCQkJLmdldFBlcnNpc3RlcigpOwotCQkJCQkJCQl0cnkgewotCQkJCQkJCQkJcGVyc2lzdGVyCi0JCQkJCQkJCQkJCS5hZGp1c3RMb2NhdGlvbihwbHVnaW4uZVJlc291cmNlKCkpOwotCQkJCQkJCQkJcGVyc2lzdGVyLmNvbW1pdCgpOwotCQkJCQkJCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKQotCQkJCQkJCQkJCQkubG9nRXJyb3IoZSk7Ci0JCQkJCQkJCQl0cnkgewotCQkJCQkJCQkJCXBlcnNpc3Rlci5yb2xsYmFjaygpOwotCQkJCQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpCi0JCQkJCQkJCQkJCQkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZXgpOwotCQkJCQkJCQkJCVZpZXdIZWxwZXIKLQkJCQkJCQkJCQkJCS5yZWxvYWRDdXJyZW50TGliYXJ5T25Sb2xsYmFja0Vycm9yKGdldFNpdGUoKQotCQkJCQkJCQkJCQkJCQkuZ2V0U2hlbGwoKSk7Ci0JCQkJCQkJCQkJcmV0dXJuOwotCQkJCQkJCQkJfQotCQkJCQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4KLQkJCQkJCQkJCQkJLmdldERlZmF1bHQoKQotCQkJCQkJCQkJCQkuZ2V0TXNnRGlhbG9nKCkKLQkJCQkJCQkJCQkJLmRpc3BsYXlXYXJuaW5nKAotCQkJCQkJCQkJCQkJCWdldFNpdGUoKS5nZXRTaGVsbCgpCi0JCQkJCQkJCQkJCQkJCQkuZ2V0VGV4dCgpLAotCQkJCQkJCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLm1ldGhvZFBsdWdpbkRlc2NyaXB0aW9uUGFnZV9jYW5ub3RSZW5hbWVQbHVnaW5Gb2xkZXIKLQkJCQkJCQkJCQkJCQksIGUuZ2V0TWVzc2FnZSgpLCBlKTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0pOwotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJY3RybF9uYW1lLnNldFRleHQocGx1Z2luLmdldE5hbWUoKSk7Ci0JCQkJCVNoZWxsIHNoZWxsID0gZ2V0U2l0ZSgpLmdldFNoZWxsKCk7Ci0JCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKS5kaXNwbGF5RXJyb3IoCi0JCQkJCQkJc2hlbGwuZ2V0VGV4dCgpLCBtc2cpOwotCQkJCQllLmRvaXQgPSBmYWxzZTsKLQkJCQkJY3RybF9uYW1lLmdldERpc3BsYXkoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCWN0cmxfbmFtZS5zZXRGb2N1cygpOwotCQkJCQkJCWN0cmxfbmFtZS5zZWxlY3RBbGwoKTsKLQkJCQkJCX0KLQkJCQkJfSk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQkJY3RybF9uYW1lLmFkZEZvY3VzTGlzdGVuZXIobmV3IEZvY3VzQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGZvY3VzR2FpbmVkKEZvY3VzRXZlbnQgZSkgewotCQkJCSgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpLnNldEN1cnJlbnRGZWF0dXJlRWRpdG9yKGUud2lkZ2V0LAotCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TmFtZWRFbGVtZW50X05hbWUoKSk7Ci0JCQl9Ci0JCX0pOwotCi0KLQotCQlhZGRSZWZlcmVuY2VkTW9kZWxMaXN0ZW5lcigpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZFJlZmVyZW5jZWRNb2RlbExpc3RlbmVyKCkgewotCQljdHJsX3JlZk1vZGVsLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihyZWZNb2RlbFNlbENoYW5nZWRMaXN0ZW5lcik7Ci0KLQkJY3RybF9yZWZNb2RlbC5hZGRDaGVja1N0YXRlTGlzdGVuZXIocmVmTW9kZWxDaGVja1N0YXRlTGlzdGVuZXIpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2goYm9vbGVhbiBlZGl0YWJsZSkgewotCQlzdXBlci5yZWZyZXNoKGVkaXRhYmxlKTsKLQkJY3RybF9yX2JyaWVmX2Rlc2Muc2V0RWRpdGFibGUoZmFsc2UpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVHZW5lcmFsU2VjdGlvbkNvbnRlbnQoKSB7Ci0JCXN1cGVyLmNyZWF0ZUdlbmVyYWxTZWN0aW9uQ29udGVudCgpOwotCQkKLQkJc3VwcG9ydGluZ1BsdWdpbkNoZWNrYm94ID0gdG9vbGtpdAotCQkJLmNyZWF0ZUJ1dHRvbigKLQkJCQlnZW5lcmFsQ29tcG9zaXRlLAotCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLm1ldGhvZFBsdWdpbkRlc2NyaXB0aW9uUGFnZV9zdXBwb3J0aW5nUGx1Z2luTGFiZWwsIFNXVC5DSEVDSyk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGFkZEdlbmVyYWxTZWN0aW9uTGlzdGVuZXJzKCkgewotCQlzdXBlci5hZGRHZW5lcmFsU2VjdGlvbkxpc3RlbmVycygpOwotCQkKLQkJc3VwcG9ydGluZ1BsdWdpbkNoZWNrYm94LmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCUlTdGF0dXMgc3RhdHVzID0gVG5nVXRpbC5jaGVja0VkaXQocGx1Z2luLCBnZXRTaXRlKCkuZ2V0U2hlbGwoKSk7Ci0JCQkJaWYgKHN0YXR1cy5pc09LKCkpIHsKLQkJCQkJYm9vbGVhbiByZXQgPSBhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuU0VULAotCQkJCQkJCXBsdWdpbiwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCS5nZXRNZXRob2RQbHVnaW5fU3VwcG9ydGluZygpLAotCQkJCQkJCW5ldyBCb29sZWFuKHN1cHBvcnRpbmdQbHVnaW5DaGVja2JveC5nZXRTZWxlY3Rpb24oKSksCi0JCQkJCQkJLTEpOwotCQkJCQkvLyBpbiBjYXNlIG9mIHJlYWRvbmx5IGZpbGUsIHJvbGwgYmFjayBjaGFuZ2VzLgotCQkJCQlpZiAoIXJldCkgewotCQkJCQkJc3VwcG9ydGluZ1BsdWdpbkNoZWNrYm94LnNldFNlbGVjdGlvbighc3VwcG9ydGluZ1BsdWdpbkNoZWNrYm94Ci0JCQkJCQkJCS5nZXRTZWxlY3Rpb24oKSk7Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkuZGlzcGxheUVycm9yKAotCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLmVkaXREaWFsb2dfdGl0bGUsCi0JCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuZWRpdERpYWxvZ19tc2dDYW5ub3RFZGl0LAotCQkJCQkJCXN0YXR1cyk7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQl9Ci0KLQkJCQotCQl9KTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgbG9hZEdlbmVyYWxTZWN0aW9uRGF0YSgpIHsKLQkJc3VwZXIubG9hZEdlbmVyYWxTZWN0aW9uRGF0YSgpOwotCQlzdXBwb3J0aW5nUGx1Z2luQ2hlY2tib3gKLQkJCS5zZXRTZWxlY3Rpb24ocGx1Z2luLmlzU3VwcG9ydGluZygpKTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlIHRoZSBWZXJzaW9uIHNlY3Rpb24gY29udGVudC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVWZXJzaW9uU2VjdGlvbkNvbnRlbnQoKSB7Ci0JCXN1cGVyLmNyZWF0ZVZlcnNpb25TZWN0aW9uQ29udGVudCgpOwotCi0JCWN0cmxfY2hhbmdlYWJsZSA9IHRvb2xraXQKLQkJCQkuY3JlYXRlQnV0dG9uKAotCQkJCQkJdmVyc2lvbkNvbXBvc2l0ZSwKLQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLm1ldGhvZFBsdWdpbkRlc2NyaXB0aW9uUGFnZV9sb2NrUGx1Z2luTGFiZWwsIFNXVC5DSEVDSyk7IAotCi0JfQotCi0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRWZXJzaW9uU2VjdGlvbkxpc3RlbmVycygpIHsKLQkJc3VwZXIuYWRkVmVyc2lvblNlY3Rpb25MaXN0ZW5lcnMoKTsKLQotCQljdHJsX2NoYW5nZWFibGUuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJbm90aWZpY2F0aW9uRW5hYmxlZCA9IHRydWU7Ci0KLQkJCQkKLQkJCQlJU3RhdHVzIHN0YXR1cyA9IFRuZ1V0aWwuY2hlY2tFZGl0KHBsdWdpbiwgZ2V0U2l0ZSgpLmdldFNoZWxsKCkpOwotCQkJCWlmIChzdGF0dXMuaXNPSygpKSB7Ci0JCQkJCQotCQkJCQlTdHJpbmcgbWVzc2FnZSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzCi0JCQkJCQkJLmJpbmQoCi0JCQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5tZXRob2RQbHVnaW5EZXNjcmlwdGlvblBhZ2VfbG9ja1BsdWdpbl9tZXNzYWdlLAotCQkJCQkJCQkJcGx1Z2luLmdldE5hbWUoKSk7Ci0JCQkJCVNoZWxsIHNoZWxsID0gZ2V0U2l0ZSgpLmdldFNoZWxsKCk7Ci0JCQkJCWlmIChBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkKLQkJCQkJCQkuZGlzcGxheUNvbmZpcm1hdGlvbihzaGVsbC5nZXRUZXh0KCksIG1lc3NhZ2UpKSB7Ci0JCQkJCQkvLyBjbG9zZSBlZGl0b3JzIG9uIGFueSBjaGFuZ2UgaW4gY3RybF9jaGFuZ2VhYmxlCi0JCQkJCQkvLyBpZiAoY3RybF9jaGFuZ2VhYmxlLmdldFNlbGVjdGlvbigpKSB7Ci0JCQkJCQlFZGl0b3JDaG9vc2VyLmdldEluc3RhbmNlKCkuY2xvc2VNZXRob2RFZGl0b3JzRm9yUGx1Z2luRWxlbWVudHMocGx1Z2luKTsKLQkJCQkJCWJvb2xlYW4gcmV0ID0gYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlNFVCwKLQkJCQkJCQkJcGx1Z2luLCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJCS5nZXRNZXRob2RQbHVnaW5fVXNlckNoYW5nZWFibGUoKSwKLQkJCQkJCQkJbmV3IEJvb2xlYW4oIWN0cmxfY2hhbmdlYWJsZS5nZXRTZWxlY3Rpb24oKSksCi0JCQkJCQkJCS0xKTsKLQkJCQkJCS8vIGluIGNhc2Ugb2YgcmVhZG9ubHkgZmlsZSwgcm9sbCBiYWNrIGNoYW5nZXMuCi0JCQkJCQlpZiAoIXJldCkgewotCQkJCQkJCWN0cmxfY2hhbmdlYWJsZS5zZXRTZWxlY3Rpb24oIWN0cmxfY2hhbmdlYWJsZQotCQkJCQkJCQkJLmdldFNlbGVjdGlvbigpKTsKLQkJCQkJCQlyZXR1cm47Ci0JCQkJCQl9Ci0KLQkJCQkJCS8vIH0KLQkJCQkJCXJlZnJlc2goIWN0cmxfY2hhbmdlYWJsZS5nZXRTZWxlY3Rpb24oKSk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQkvLyBhY3Rpb25NZ3IudW5kbygpOwotCQkJCQkJY3RybF9jaGFuZ2VhYmxlLnNldFNlbGVjdGlvbighY3RybF9jaGFuZ2VhYmxlCi0JCQkJCQkJCS5nZXRTZWxlY3Rpb24oKSk7Ci0JCQkJCQlyZWZyZXNoKCFjdHJsX2NoYW5nZWFibGUuZ2V0U2VsZWN0aW9uKCkpOwotCQkJCQkJLy8gcmV0dXJuOwotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpLmRpc3BsYXlFcnJvcigKLQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5lZGl0RGlhbG9nX3RpdGxlLAotCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLmVkaXREaWFsb2dfbXNnQ2Fubm90RWRpdCwKLQkJCQkJCQlzdGF0dXMpOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCWNvcHlyaWdodF92aWV3ZXIucmVmcmVzaCgpOwotCQkJCQotCQkJCS8vIHJlZnJlc2ggZWRpdG9yIHRpdGxlIGltYWdlLiAKLQkJCQkoKE1ldGhvZEVsZW1lbnRFZGl0b3IpZ2V0RWRpdG9yKCkpLnJlZnJlc2hUaXRsZUltYWdlKCk7Ci0JCQl9Ci0KLQkJCQotCQl9KTsKLQl9Ci0KLQotCXByb3RlY3RlZCB2b2lkIGxvYWRWZXJzaW9uU2VjdGlvbkRhdGEoKSB7Ci0JCXN1cGVyLmxvYWRWZXJzaW9uU2VjdGlvbkRhdGEoKTsKLQkJY3RybF9jaGFuZ2VhYmxlCi0JCQkJLnNldFNlbGVjdGlvbighcGx1Z2luLmdldFVzZXJDaGFuZ2VhYmxlKCkuYm9vbGVhblZhbHVlKCkpOwotCX0KLQotCXByb3RlY3RlZCBjbGFzcyBVc2VyQ2hhbmdlYWJsZUFkYXB0ZXIgZXh0ZW5kcyBBZGFwdGVySW1wbCB7Ci0JCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG1zZykgewotCQkJc3dpdGNoIChtc2cuZ2V0RmVhdHVyZUlEKE1ldGhvZFBsdWdpbi5jbGFzcykpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfUExVR0lOX19VU0VSX0NIQU5HRUFCTEU6Ci0JCQkJQm9vbGVhbiBiID0gKEJvb2xlYW4pIG1zZy5nZXROZXdWYWx1ZSgpOwotCQkJCXNldFVzZXJDaGFuZ2VhYmxlKGIuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHNldFVzZXJDaGFuZ2VhYmxlKGJvb2xlYW4gdXNlckNoYW5nZWFibGUpIHsKLQkJaWYgKCFub3RpZmljYXRpb25FbmFibGVkKQotCQkJcmV0dXJuOwotCQlub3RpZmljYXRpb25FbmFibGVkID0gZmFsc2U7Ci0JCXBsdWdpbi5zZXRVc2VyQ2hhbmdlYWJsZShCb29sZWFuLnZhbHVlT2YodXNlckNoYW5nZWFibGUpKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLmZvcm1zLmVkaXRvci5Gb3JtUGFnZSNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlwbHVnaW4uZUFkYXB0ZXJzKCkucmVtb3ZlKHVzZXJDaGFuZ2VhYmxlQWRhcHRlcik7Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQl9Ci0JCi0JLyoqCi0JICogQ2hlY2tzIGlmIHRoZSBnaXZlbiBNZXRob2RQbHVnaW4gPGNvZGU+YmFzZTwvY29kZT4gaXMgb25lIGluIHRoZSBnaXZlbgotCSAqIHBsdWdpbnMgY29sbGVjdGlvbiBvciBiYXNlIG9mIGFueSBwbHVnaW4gaW4gdGhlIGNvbGxlY3Rpb24uCi0JICogCi0JICogQHBhcmFtIGJhc2UKLQkgKiBAcGFyYW0gcGx1Z2lucwotCSAqIEByZXR1cm4KLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGJvb2xlYW4gaXNPbmVPckJhc2VPZihNZXRob2RQbHVnaW4gYmFzZSwgQ29sbGVjdGlvbjxNZXRob2RQbHVnaW4+IHBsdWdpbnMpIHsKLQkJZm9yIChNZXRob2RQbHVnaW4gcGx1Z2luIDogcGx1Z2lucykgewotCQkJaWYoYmFzZSA9PSBwbHVnaW4gfHwgTWlzYy5pc0Jhc2VPZihiYXNlLCBwbHVnaW4pKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHJlbW92ZUFsbFJlZmVyZW5jZXMoTWV0aG9kUGx1Z2luIHVuQ2hlY2tlZFBsdWdpbikgewotCQlBcnJheUxpc3Q8TWV0aG9kUGx1Z2luPiByZW1vdmVkQmFzZXMgPSBuZXcgQXJyYXlMaXN0PE1ldGhvZFBsdWdpbj4oKTsKLQkJcmVtb3ZlZEJhc2VzLmFkZCh1bkNoZWNrZWRQbHVnaW4pOwotCQlmb3IgKEl0ZXJhdG9yPE1ldGhvZFBsdWdpbj4gaXRlciA9IG5ldyBBYnN0cmFjdFRyZWVJdGVyYXRvcjxNZXRob2RQbHVnaW4+KHVuQ2hlY2tlZFBsdWdpbiwgZmFsc2UpIHsKLQkJCi0JCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgSXRlcmF0b3I8PyBleHRlbmRzIE1ldGhvZFBsdWdpbj4gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQkJCWlmKG9iamVjdCBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikgewotCQkJCQlyZXR1cm4gKChNZXRob2RQbHVnaW4pb2JqZWN0KS5nZXRCYXNlcygpLml0ZXJhdG9yKCk7Ci0JCQkJfQotCQkJCUNvbGxlY3Rpb248PyBleHRlbmRzIE1ldGhvZFBsdWdpbj4gZW1wdHkgPSBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsKLQkJCQlyZXR1cm4gZW1wdHkuaXRlcmF0b3IoKTsKLQkJCX0KLQkJCi0JCX07IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJTWV0aG9kUGx1Z2luIGJhc2UgPSBpdGVyLm5leHQoKTsKLQkJCUFycmF5TGlzdDxNZXRob2RQbHVnaW4+IHBsdWdpbnMgPSBuZXcgQXJyYXlMaXN0PE1ldGhvZFBsdWdpbj4ocGx1Z2luLmdldEJhc2VzKCkpOwotCQkJcGx1Z2lucy5yZW1vdmUodW5DaGVja2VkUGx1Z2luKTsKLQkJCWlmKCFpc09uZU9yQmFzZU9mKGJhc2UsIHBsdWdpbnMpKSB7Ci0JCQkJcmVtb3ZlZEJhc2VzLmFkZChiYXNlKTsKLQkJCX0KLQkJfQotCQkKLQkJQXJyYXlMaXN0PE1ldGhvZFBsdWdpbj4gYWZmZWN0ZWRQbHVnaW5zID0gbmV3IEFycmF5TGlzdDxNZXRob2RQbHVnaW4+KCk7Ci0JCQotCQkvLyBnZXQgYWxsIHBsdWctaW5zIGluIGxpYnJhcnkgdGhhdCBleHRlbmQgdGhpcyBwbHVnLWluCi0JCS8vCi0JCUxpc3Q8Pz4gcGx1Z2lucyA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKQotCQkJCS5nZXRNZXRob2RQbHVnaW5zKCk7Ci0JCWZvciAoSXRlcmF0b3I8Pz4gaXRlcmF0b3IgPSBwbHVnaW5zLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCU1ldGhvZFBsdWdpbiBtcCA9IChNZXRob2RQbHVnaW4pIGl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmKG1wICE9IHBsdWdpbiAmJiBNaXNjLmlzQmFzZU9mKHBsdWdpbiwgbXApKSB7CQkJCQotCQkJCWFmZmVjdGVkUGx1Z2lucy5hZGQobXApOwotCQkJfQotCQl9Ci0JCQotCQlBcnJheUxpc3Q8UmVtb3ZlUmVmZXJlbmNlc0NvbW1hbmQ+IGNvbW1hbmRzID0gbmV3IEFycmF5TGlzdDxSZW1vdmVSZWZlcmVuY2VzQ29tbWFuZD4oKTsKLQkJZm9yIChNZXRob2RQbHVnaW4gYmFzZSA6IHJlbW92ZWRCYXNlcykgewkJCQotCQkJaWYoVW1hVXRpbC5oYXNSZWZlcmVuY2UocGx1Z2luLCBiYXNlKSkgewotCQkJCWNvbW1hbmRzLmFkZChuZXcgUmVtb3ZlUmVmZXJlbmNlc0NvbW1hbmQocGx1Z2luLCBiYXNlKSk7Ci0JCQl9Ci0JCQlmb3IgKE1ldGhvZFBsdWdpbiBtcCA6IGFmZmVjdGVkUGx1Z2lucykgewotCQkJCUFycmF5TGlzdDxNZXRob2RQbHVnaW4+IGJhc2VzID0gbmV3IEFycmF5TGlzdDxNZXRob2RQbHVnaW4+KG1wLmdldEJhc2VzKCkpOwotCQkJCWJhc2VzLnJlbW92ZShiYXNlKTsKLQkJCQlpZighaXNPbmVPckJhc2VPZihiYXNlLCBiYXNlcykgJiYgVW1hVXRpbC5oYXNSZWZlcmVuY2UobXAsIGJhc2UpKSB7Ci0JCQkJCWNvbW1hbmRzLmFkZChuZXcgUmVtb3ZlUmVmZXJlbmNlc0NvbW1hbmQobXAsIGJhc2UpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlpZiAoIWNvbW1hbmRzLmlzRW1wdHkoKSkgewotCQkJU3RyaW5nIG1lc3NhZ2UgPSBBdXRob3JpbmdVSVJlc291cmNlcwotCQkJCQkuYmluZChBdXRob3JpbmdVSVJlc291cmNlcy5tZXRob2RQbHVnaW5EZXNjcmlwdGlvblJlbW92ZVJlZkNvbmZpcm1fbWVzc2FnZSwKLQkJCQkJCQlwbHVnaW4uZ2V0TmFtZSgpKTsKLQkJCVNoZWxsIHNoZWxsID0gZ2V0U2l0ZSgpLmdldFNoZWxsKCk7Ci0JCQlpZiAoQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpCi0JCQkJCS5kaXNwbGF5Q29uZmlybWF0aW9uKHNoZWxsLmdldFRleHQoKSwgbWVzc2FnZSkpIHsKLQkJCQlpbnQgaSA9IDA7Ci0JCQkJdHJ5IHsKLQkJCQkJZm9yIChSZW1vdmVSZWZlcmVuY2VzQ29tbWFuZCBjbWQgOiBjb21tYW5kcykgewotCQkJCQkJYWN0aW9uTWdyLmV4ZWN1dGUoY21kKTsKLQkJCQkJCWkrKzsKLQkJCQkJfQotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQkJY2F0Y2goRXhjZXB0aW9uIGUpIHsKLQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCQkvLyB1bmRvIHRoZSBleGVjdXRlZCBjb21tYW5kcwotCQkJCQlmb3IgKDsgaSA+IDA7IGktLSkgewotCQkJCQkJYWN0aW9uTWdyLnVuZG8oKTsKLQkJCQkJfQotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2xvYWRTZWN0aW9uRGVzY3JpcHRpb24oKQotCSAqLwotCXB1YmxpYyB2b2lkIGxvYWRTZWN0aW9uRGVzY3JpcHRpb24oKSB7Ci0JCXRoaXMuZ2VuZXJhbFNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLnBsdWdpbl9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYzsKLQkJdGhpcy52ZXJzaW9uU2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMucGx1Z2luX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBPYmplY3QgZ2V0Q29udGVudEVsZW1lbnQoKSB7Ci0JCXJldHVybiBwbHVnaW47Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFJlZmVyZW5jZWRNb2RlbHMoKSB7Ci0JCS8vIENsZWFyIHRoZSBvbGQgaXRlbXMgYW5kIGFkZCB0aGUgbmV3bHkgYWxsb3dhYmxlIGl0ZW1zLgotCQljdHJsX3JlZk1vZGVsLmdldFRhYmxlKCkuY2xlYXJBbGwoKTsKLQkJY3RybF9yZWZNb2RlbC5yZWZyZXNoKCk7Ci0KLQkJTGlzdCBhbGxvd2FibGVMaXN0ID0gUGx1Z2luUmVmZXJlbmNlQ2hlY2tlcgotCQkJCS5nZXRBcHBsaWNhYmxlQmFzZVBsdWdpbnMocGx1Z2luKTsKLQkJQ29sbGVjdGlvbnMuPE9iamVjdD5zb3J0KGFsbG93YWJsZUxpc3QsIENvbXBhcmF0b3JzLlBMVUdJTlBBQ0tBR0VfQ09NUEFSQVRPUik7Ci0JCWN0cmxfcmVmTW9kZWwuYWRkKGFsbG93YWJsZUxpc3QudG9BcnJheSgpKTsKLQotCQlMaXN0PE1ldGhvZFBsdWdpbj4gY3VycmVudEJhc2VMaXN0ID0gcGx1Z2luLmdldEJhc2VzKCk7Ci0JCXNldENoZWNrYm94Rm9yQ3VycmVudEJhc2UoY3VycmVudEJhc2VMaXN0KTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL1ByYWN0aWNlRGVzY3JpcHRpb25QYWdlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL1ByYWN0aWNlRGVzY3JpcHRpb25QYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlMTY1Y2UuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9QcmFjdGljZURlc2NyaXB0aW9uUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5NZXRob2RFbGVtZW50RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucmljaHRleHQuSU1ldGhvZFJpY2hUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JQWN0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByYWN0aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLmVkaXRvci5Gb3JtRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuRm9ybVRvb2xraXQ7Ci0KLQotLyoqCi0gKiBUaGUgRGVzY3JpcHRpb24gcGFnZSBpbiBhIFByYWN0aWNlIGVkaXRvci4KLSAqIAotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFByYWN0aWNlRGVzY3JpcHRpb25QYWdlIGV4dGVuZHMgR3VpZGFuY2VEZXNjcmlwdGlvblBhZ2UgewotCi0JcHJpdmF0ZSBJTWV0aG9kUmljaFRleHQgY3RybF9hZGRpdGlvbmFsX2luZm8sIGN0cmxfcHJvYmxlbSwKLQkJCWN0cmxfYmFja2dyb3VuZDsKLQotCXByaXZhdGUgSU1ldGhvZFJpY2hUZXh0IGN0cmxfZ29hbHMsIGN0cmxfYXBwbGljYXRpb24sIGN0cmxfbGV2ZWxzX2Fkb3B0aW9uOwotCi0JcHJpdmF0ZSBQcmFjdGljZSBndWlkYW5jZTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFByYWN0aWNlRGVzY3JpcHRpb25QYWdlKEZvcm1FZGl0b3IgZWRpdG9yKSB7Ci0JCXN1cGVyKGVkaXRvcik7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkd1aWRhbmNlRGVzY3JpcHRpb25QYWdlI2luaXQob3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGUsIG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElFZGl0b3JTaXRlIHNpdGUsIElFZGl0b3JJbnB1dCBpbnB1dCkgewotCQlzdXBlci5pbml0KHNpdGUsIGlucHV0KTsKLQkJZ3VpZGFuY2UgPSAoUHJhY3RpY2UpIGNvbnRlbnRFbGVtZW50OwotCQlzZXRDb250ZW50RmllbGRIZWlnaHQoMjAwKTsKLQkJc2V0RnVsbERlc2NPbih0cnVlKTsKLQkJY29udGVudE9uID0gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkd1aWRhbmNlRGVzY3JpcHRpb25QYWdlI2NyZWF0ZUVkaXRvckNvbnRlbnQob3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5Gb3JtVG9vbGtpdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVFZGl0b3JDb250ZW50KEZvcm1Ub29sa2l0IHRvb2xraXQpIHsKLQkJc3VwZXIuY3JlYXRlRWRpdG9yQ29udGVudCh0b29sa2l0KTsKLQkJbGFiZWxfYmFzZS5zZXRUZXh0KEF1dGhvcmluZ1VJVGV4dC5CQVNFX0VMRU1FTlRfVEVYVCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZURldGFpbFNlY3Rpb25Db250ZW50KCkgewotCQkvLyBQcm9ibGVtIGlzIG5hbWVkICJQdXJwb3NlIiBpbiB0aGUgVUkKLQkJY3RybF9wcm9ibGVtID0gY3JlYXRlUmljaFRleHRFZGl0V2l0aExpbmtGb3JTZWN0aW9uKHRvb2xraXQsCi0JCQkJZGV0YWlsQ29tcG9zaXRlLCBBdXRob3JpbmdVSVRleHQuUFVSUE9TRV9URVhULCA0MCwgNDAwLAotCQkJCURFVEFJTF9TRUNUSU9OX0lEKTsKLQotCQljdHJsX2dvYWxzID0gY3JlYXRlUmljaFRleHRFZGl0V2l0aExpbmtGb3JTZWN0aW9uKHRvb2xraXQsCi0JCQkJZGV0YWlsQ29tcG9zaXRlLCBBdXRob3JpbmdVSVRleHQuR09BTFNfVEVYVCwgNDAsIDQwMCwKLQkJCQlERVRBSUxfU0VDVElPTl9JRCk7Ci0JCWN0cmxfYmFja2dyb3VuZCA9IGNyZWF0ZVJpY2hUZXh0RWRpdFdpdGhMaW5rRm9yU2VjdGlvbih0b29sa2l0LAotCQkJCWRldGFpbENvbXBvc2l0ZSwgQXV0aG9yaW5nVUlUZXh0LkJBQ0tHUk9VTkRfVEVYVCwgNDAsIDQwMCwKLQkJCQlERVRBSUxfU0VDVElPTl9JRCk7Ci0KLQkJaWYgKGZ1bGxEZXNjT24pIHsKLQkJCWN0cmxfZnVsbF9kZXNjID0gY3JlYXRlUmljaFRleHRFZGl0V2l0aExpbmtGb3JTZWN0aW9uKHRvb2xraXQsCi0JCQkJCWRldGFpbENvbXBvc2l0ZSwgQXV0aG9yaW5nVUlUZXh0Lk1BSU5fREVTQ1JJUFRJT05fVEVYVCwKLQkJCQkJMTAwLCA0MDAsIERFVEFJTF9TRUNUSU9OX0lEKTsKLQkJfQotCQkKLQkJLy8gQXBwbGljYXRpb24gZmllbGQgaXMgY2FsbGVkICJIb3cgdG8gcmVhZCB0aGlzIHByYWN0aWNlIiBpbiB0aGUgVUkKLQkJY3RybF9hcHBsaWNhdGlvbiA9IGNyZWF0ZVJpY2hUZXh0RWRpdFdpdGhMaW5rRm9yU2VjdGlvbih0b29sa2l0LAotCQkJCWRldGFpbENvbXBvc2l0ZSwgQXV0aG9yaW5nVUlSZXNvdXJjZXMucHJhY3RpY2VfYXBwbGljYXRpb25fdGV4dCwgNDAsIDQwMCwKLQkJCQlERVRBSUxfU0VDVElPTl9JRCk7Ci0JCWN0cmxfbGV2ZWxzX2Fkb3B0aW9uID0gY3JlYXRlUmljaFRleHRFZGl0V2l0aExpbmtGb3JTZWN0aW9uKHRvb2xraXQsCi0JCQkJZGV0YWlsQ29tcG9zaXRlLCBBdXRob3JpbmdVSVRleHQuTEVWRUxfT0ZfQURPUFRJT05fVEVYVCwgNDAsCi0JCQkJNDAwLCBERVRBSUxfU0VDVElPTl9JRCk7Ci0JCWN0cmxfYWRkaXRpb25hbF9pbmZvID0gY3JlYXRlUmljaFRleHRFZGl0V2l0aExpbmtGb3JTZWN0aW9uKHRvb2xraXQsCi0JCQkJZGV0YWlsQ29tcG9zaXRlLCBBdXRob3JpbmdVSVRleHQuQURESVRJT05BTF9JTkZPX1RFWFQsIDQwLCA0MDAsCi0JCQkJREVUQUlMX1NFQ1RJT05fSUQpOwotCX0KLQotCS8qKgotCSAqIEFkZCBsaXN0ZW5lcnMKLQkgKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5HdWlkYW5jZURlc2NyaXB0aW9uUGFnZSNhZGRMaXN0ZW5lcnMoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZExpc3RlbmVycygpIHsKLQkJc3VwZXIuYWRkTGlzdGVuZXJzKCk7Ci0JCWZpbmFsIE1ldGhvZEVsZW1lbnRFZGl0b3IgZWRpdG9yID0gKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpOwotCi0JCWZpbmFsIE1vZGlmeUxpc3RlbmVyIGNvbnRlbnRNb2RpZnlMaXN0ZW5lciA9IGVkaXRvcgotCQkJCS5jcmVhdGVNb2RpZnlMaXN0ZW5lcihndWlkYW5jZS5nZXRQcmVzZW50YXRpb24oKSk7Ci0KLQkJY3RybF9hZGRpdGlvbmFsX2luZm8KLQkJCQkuc2V0TW9kYWxPYmplY3QoKG9yZy5lY2xpcHNlLmVwZi51bWEuUHJhY3RpY2VEZXNjcmlwdGlvbikgZ3VpZGFuY2UKLQkJCQkJCS5nZXRQcmVzZW50YXRpb24oKSk7Ci0JCWN0cmxfYWRkaXRpb25hbF9pbmZvLnNldE1vZGFsT2JqZWN0RmVhdHVyZShVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRQcmFjdGljZURlc2NyaXB0aW9uX0FkZGl0aW9uYWxJbmZvKCkpOwotCQljdHJsX2FkZGl0aW9uYWxfaW5mby5hZGRNb2RpZnlMaXN0ZW5lcihjb250ZW50TW9kaWZ5TGlzdGVuZXIpOwotCQljdHJsX2FkZGl0aW9uYWxfaW5mby5hZGRMaXN0ZW5lcihTV1QuRGVhY3RpdmF0ZSwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCUlNZXRob2RSaWNoVGV4dCBjb250cm9sID0gZGVzY0V4cGFuZEZsYWcgPyBjdHJsX2V4cGFuZGVkCi0JCQkJCQk6IGN0cmxfYWRkaXRpb25hbF9pbmZvOwotCQkJCWlmICghY29udHJvbC5nZXRNb2RpZmllZCgpKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJU3RyaW5nIG9sZENvbnRlbnQgPSAoKG9yZy5lY2xpcHNlLmVwZi51bWEuUHJhY3RpY2VEZXNjcmlwdGlvbikgZ3VpZGFuY2UKLQkJCQkJCS5nZXRQcmVzZW50YXRpb24oKSkuZ2V0QWRkaXRpb25hbEluZm8oKTsKLQkJCQlpZiAoKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkubXVzdFJlc3RvcmVWYWx1ZSgKLQkJCQkJCWNvbnRyb2wsIG9sZENvbnRlbnQpKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJU3RyaW5nIG5ld0NvbnRlbnQgPSBjb250cm9sLmdldFRleHQoKTsKLQkJCQlpZiAoIW5ld0NvbnRlbnQuZXF1YWxzKG9sZENvbnRlbnQpKSB7Ci0JCQkJCWJvb2xlYW4gc3VjY2VzcyA9IGVkaXRvci5nZXRBY3Rpb25NYW5hZ2VyKCkuZG9BY3Rpb24oCi0JCQkJCQkJSUFjdGlvbk1hbmFnZXIuU0VULAotCQkJCQkJCShvcmcuZWNsaXBzZS5lcGYudW1hLlByYWN0aWNlRGVzY3JpcHRpb24pIGd1aWRhbmNlCi0JCQkJCQkJCQkuZ2V0UHJlc2VudGF0aW9uKCksCi0JCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCS5nZXRQcmFjdGljZURlc2NyaXB0aW9uX0FkZGl0aW9uYWxJbmZvKCksCi0JCQkJCQkJbmV3Q29udGVudCwgLTEpOwotCQkJCQlpZiAoc3VjY2VzcyAmJiBpc1ZlcnNpb25TZWN0aW9uT24oKSkgewotCQkJCQkJdXBkYXRlQ2hhbmdlRGF0ZSgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9KTsKLQotCQljdHJsX2FwcGxpY2F0aW9uCi0JCQkJLnNldE1vZGFsT2JqZWN0KChvcmcuZWNsaXBzZS5lcGYudW1hLlByYWN0aWNlRGVzY3JpcHRpb24pIGd1aWRhbmNlCi0JCQkJCQkuZ2V0UHJlc2VudGF0aW9uKCkpOwotCQljdHJsX2FwcGxpY2F0aW9uLnNldE1vZGFsT2JqZWN0RmVhdHVyZShVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRQcmFjdGljZURlc2NyaXB0aW9uX0FwcGxpY2F0aW9uKCkpOwotCQljdHJsX2FwcGxpY2F0aW9uLmFkZE1vZGlmeUxpc3RlbmVyKGNvbnRlbnRNb2RpZnlMaXN0ZW5lcik7Ci0JCWN0cmxfYXBwbGljYXRpb24uYWRkTGlzdGVuZXIoU1dULkRlYWN0aXZhdGUsIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQlJTWV0aG9kUmljaFRleHQgY29udHJvbCA9IGRlc2NFeHBhbmRGbGFnID8gY3RybF9leHBhbmRlZAotCQkJCQkJOiBjdHJsX2FwcGxpY2F0aW9uOwotCQkJCWlmICghY29udHJvbC5nZXRNb2RpZmllZCgpKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJU3RyaW5nIG9sZENvbnRlbnQgPSAoKG9yZy5lY2xpcHNlLmVwZi51bWEuUHJhY3RpY2VEZXNjcmlwdGlvbikgZ3VpZGFuY2UKLQkJCQkJCS5nZXRQcmVzZW50YXRpb24oKSkuZ2V0QXBwbGljYXRpb24oKTsKLQkJCQlpZiAoKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkubXVzdFJlc3RvcmVWYWx1ZSgKLQkJCQkJCWNvbnRyb2wsIG9sZENvbnRlbnQpKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJU3RyaW5nIG5ld0NvbnRlbnQgPSBjb250cm9sLmdldFRleHQoKTsKLQkJCQlpZiAoIW5ld0NvbnRlbnQuZXF1YWxzKG9sZENvbnRlbnQpKSB7Ci0JCQkJCWJvb2xlYW4gc3VjY2VzcyA9IGVkaXRvci5nZXRBY3Rpb25NYW5hZ2VyKCkuZG9BY3Rpb24oCi0JCQkJCQkJSUFjdGlvbk1hbmFnZXIuU0VULAotCQkJCQkJCShvcmcuZWNsaXBzZS5lcGYudW1hLlByYWN0aWNlRGVzY3JpcHRpb24pIGd1aWRhbmNlCi0JCQkJCQkJCQkuZ2V0UHJlc2VudGF0aW9uKCksCi0JCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCS5nZXRQcmFjdGljZURlc2NyaXB0aW9uX0FwcGxpY2F0aW9uKCksCi0JCQkJCQkJbmV3Q29udGVudCwgLTEpOwotCQkJCQlpZiAoc3VjY2VzcyAmJiBpc1ZlcnNpb25TZWN0aW9uT24oKSkgewotCQkJCQkJdXBkYXRlQ2hhbmdlRGF0ZSgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9KTsKLQotCQljdHJsX2dvYWxzLnNldE1vZGFsT2JqZWN0KChvcmcuZWNsaXBzZS5lcGYudW1hLlByYWN0aWNlRGVzY3JpcHRpb24pIGd1aWRhbmNlCi0JCQkJLmdldFByZXNlbnRhdGlvbigpKTsKLQkJY3RybF9nb2Fscy5zZXRNb2RhbE9iamVjdEZlYXR1cmUoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0UHJhY3RpY2VEZXNjcmlwdGlvbl9Hb2FscygpKTsKLQkJY3RybF9nb2Fscy5hZGRNb2RpZnlMaXN0ZW5lcihjb250ZW50TW9kaWZ5TGlzdGVuZXIpOwotCQljdHJsX2dvYWxzLmFkZExpc3RlbmVyKFNXVC5EZWFjdGl2YXRlLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJSU1ldGhvZFJpY2hUZXh0IGNvbnRyb2wgPSBkZXNjRXhwYW5kRmxhZyA/IGN0cmxfZXhwYW5kZWQKLQkJCQkJCTogY3RybF9nb2FsczsKLQkJCQlpZiAoIWNvbnRyb2wuZ2V0TW9kaWZpZWQoKSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCVN0cmluZyBvbGRDb250ZW50ID0gKChvcmcuZWNsaXBzZS5lcGYudW1hLlByYWN0aWNlRGVzY3JpcHRpb24pIGd1aWRhbmNlCi0JCQkJCQkuZ2V0UHJlc2VudGF0aW9uKCkpLmdldEdvYWxzKCk7Ci0JCQkJaWYgKCgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpLm11c3RSZXN0b3JlVmFsdWUoCi0JCQkJCQljb250cm9sLCBvbGRDb250ZW50KSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCVN0cmluZyBuZXdDb250ZW50ID0gY29udHJvbC5nZXRUZXh0KCk7Ci0JCQkJaWYgKCFuZXdDb250ZW50LmVxdWFscyhvbGRDb250ZW50KSkgewotCQkJCQlib29sZWFuIHN1Y2Nlc3MgPSBlZGl0b3IuZ2V0QWN0aW9uTWFuYWdlcigpCi0JCQkJCQkJLmRvQWN0aW9uKAotCQkJCQkJCQkJSUFjdGlvbk1hbmFnZXIuU0VULAotCQkJCQkJCQkJKG9yZy5lY2xpcHNlLmVwZi51bWEuUHJhY3RpY2VEZXNjcmlwdGlvbikgZ3VpZGFuY2UKLQkJCQkJCQkJCQkJLmdldFByZXNlbnRhdGlvbigpLAotCQkJCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCQkJLmdldFByYWN0aWNlRGVzY3JpcHRpb25fR29hbHMoKSwKLQkJCQkJCQkJCW5ld0NvbnRlbnQsIC0xKTsKLQkJCQkJaWYgKHN1Y2Nlc3MgJiYgaXNWZXJzaW9uU2VjdGlvbk9uKCkpIHsKLQkJCQkJCXVwZGF0ZUNoYW5nZURhdGUoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJY3RybF9wcm9ibGVtLnNldE1vZGFsT2JqZWN0KChvcmcuZWNsaXBzZS5lcGYudW1hLlByYWN0aWNlRGVzY3JpcHRpb24pIGd1aWRhbmNlCi0JCQkJLmdldFByZXNlbnRhdGlvbigpKTsKLQkJY3RybF9wcm9ibGVtLnNldE1vZGFsT2JqZWN0RmVhdHVyZShVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRQcmFjdGljZURlc2NyaXB0aW9uX1Byb2JsZW0oKSk7Ci0JCWN0cmxfcHJvYmxlbS5hZGRNb2RpZnlMaXN0ZW5lcihjb250ZW50TW9kaWZ5TGlzdGVuZXIpOwotCQljdHJsX3Byb2JsZW0uYWRkTGlzdGVuZXIoU1dULkRlYWN0aXZhdGUsIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQlJTWV0aG9kUmljaFRleHQgY29udHJvbCA9IGRlc2NFeHBhbmRGbGFnID8gY3RybF9leHBhbmRlZAotCQkJCQkJOiBjdHJsX3Byb2JsZW07Ci0JCQkJU3RyaW5nIG9sZENvbnRlbnQgPSAoKG9yZy5lY2xpcHNlLmVwZi51bWEuUHJhY3RpY2VEZXNjcmlwdGlvbikgZ3VpZGFuY2UKLQkJCQkJCS5nZXRQcmVzZW50YXRpb24oKSkuZ2V0UHJvYmxlbSgpOwotCQkJCWlmICgoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpKS5tdXN0UmVzdG9yZVZhbHVlKAotCQkJCQkJY29udHJvbCwgb2xkQ29udGVudCkpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlTdHJpbmcgbmV3Q29udGVudCA9IGNvbnRyb2wuZ2V0VGV4dCgpOwotCQkJCWlmICghbmV3Q29udGVudC5lcXVhbHMob2xkQ29udGVudCkpIHsKLQkJCQkJYm9vbGVhbiBzdWNjZXNzID0gZWRpdG9yLmdldEFjdGlvbk1hbmFnZXIoKS5kb0FjdGlvbigKLQkJCQkJCQlJQWN0aW9uTWFuYWdlci5TRVQsCi0JCQkJCQkJKG9yZy5lY2xpcHNlLmVwZi51bWEuUHJhY3RpY2VEZXNjcmlwdGlvbikgZ3VpZGFuY2UKLQkJCQkJCQkJCS5nZXRQcmVzZW50YXRpb24oKSwKLQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJLmdldFByYWN0aWNlRGVzY3JpcHRpb25fUHJvYmxlbSgpLAotCQkJCQkJCW5ld0NvbnRlbnQsIC0xKTsKLQkJCQkJaWYgKHN1Y2Nlc3MgJiYgaXNWZXJzaW9uU2VjdGlvbk9uKCkpIHsKLQkJCQkJCXVwZGF0ZUNoYW5nZURhdGUoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJY3RybF9iYWNrZ3JvdW5kCi0JCQkJLnNldE1vZGFsT2JqZWN0KChvcmcuZWNsaXBzZS5lcGYudW1hLlByYWN0aWNlRGVzY3JpcHRpb24pIGd1aWRhbmNlCi0JCQkJCQkuZ2V0UHJlc2VudGF0aW9uKCkpOwotCQljdHJsX2JhY2tncm91bmQuc2V0TW9kYWxPYmplY3RGZWF0dXJlKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldFByYWN0aWNlRGVzY3JpcHRpb25fQmFja2dyb3VuZCgpKTsKLQkJY3RybF9iYWNrZ3JvdW5kLmFkZE1vZGlmeUxpc3RlbmVyKGNvbnRlbnRNb2RpZnlMaXN0ZW5lcik7Ci0JCWN0cmxfYmFja2dyb3VuZC5hZGRMaXN0ZW5lcihTV1QuRGVhY3RpdmF0ZSwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCUlNZXRob2RSaWNoVGV4dCBjb250cm9sID0gZGVzY0V4cGFuZEZsYWcgPyBjdHJsX2V4cGFuZGVkCi0JCQkJCQk6IGN0cmxfYmFja2dyb3VuZDsKLQkJCQlTdHJpbmcgb2xkQ29udGVudCA9ICgob3JnLmVjbGlwc2UuZXBmLnVtYS5QcmFjdGljZURlc2NyaXB0aW9uKSBndWlkYW5jZQotCQkJCQkJLmdldFByZXNlbnRhdGlvbigpKS5nZXRCYWNrZ3JvdW5kKCk7Ci0JCQkJaWYgKCgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpLm11c3RSZXN0b3JlVmFsdWUoCi0JCQkJCQljb250cm9sLCBvbGRDb250ZW50KSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCVN0cmluZyBuZXdDb250ZW50ID0gY29udHJvbC5nZXRUZXh0KCk7Ci0JCQkJaWYgKCFuZXdDb250ZW50LmVxdWFscyhvbGRDb250ZW50KSkgewotCQkJCQlib29sZWFuIHN1Y2Nlc3MgPSBlZGl0b3IuZ2V0QWN0aW9uTWFuYWdlcigpLmRvQWN0aW9uKAotCQkJCQkJCUlBY3Rpb25NYW5hZ2VyLlNFVCwKLQkJCQkJCQkob3JnLmVjbGlwc2UuZXBmLnVtYS5QcmFjdGljZURlc2NyaXB0aW9uKSBndWlkYW5jZQotCQkJCQkJCQkJLmdldFByZXNlbnRhdGlvbigpLAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkuZ2V0UHJhY3RpY2VEZXNjcmlwdGlvbl9CYWNrZ3JvdW5kKCksCi0JCQkJCQkJbmV3Q29udGVudCwgLTEpOwotCQkJCQlpZiAoc3VjY2VzcyAmJiBpc1ZlcnNpb25TZWN0aW9uT24oKSkgewotCQkJCQkJdXBkYXRlQ2hhbmdlRGF0ZSgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9KTsKLQotCQljdHJsX2xldmVsc19hZG9wdGlvbgotCQkJCS5zZXRNb2RhbE9iamVjdCgob3JnLmVjbGlwc2UuZXBmLnVtYS5QcmFjdGljZURlc2NyaXB0aW9uKSBndWlkYW5jZQotCQkJCQkJLmdldFByZXNlbnRhdGlvbigpKTsKLQkJY3RybF9sZXZlbHNfYWRvcHRpb24uc2V0TW9kYWxPYmplY3RGZWF0dXJlKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldFByYWN0aWNlRGVzY3JpcHRpb25fTGV2ZWxzT2ZBZG9wdGlvbigpKTsKLQkJY3RybF9sZXZlbHNfYWRvcHRpb24uYWRkTW9kaWZ5TGlzdGVuZXIoY29udGVudE1vZGlmeUxpc3RlbmVyKTsKLQkJY3RybF9sZXZlbHNfYWRvcHRpb24uYWRkTGlzdGVuZXIoU1dULkRlYWN0aXZhdGUsIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQlJTWV0aG9kUmljaFRleHQgY29udHJvbCA9IGRlc2NFeHBhbmRGbGFnID8gY3RybF9leHBhbmRlZAotCQkJCQkJOiBjdHJsX2xldmVsc19hZG9wdGlvbjsKLQkJCQlTdHJpbmcgb2xkQ29udGVudCA9ICgob3JnLmVjbGlwc2UuZXBmLnVtYS5QcmFjdGljZURlc2NyaXB0aW9uKSBndWlkYW5jZQotCQkJCQkJLmdldFByZXNlbnRhdGlvbigpKS5nZXRMZXZlbHNPZkFkb3B0aW9uKCk7Ci0JCQkJaWYgKCgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpLm11c3RSZXN0b3JlVmFsdWUoCi0JCQkJCQljb250cm9sLCBvbGRDb250ZW50KSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCVN0cmluZyBuZXdDb250ZW50ID0gZGVzY0V4cGFuZEZsYWcgPyBjdHJsX2V4cGFuZGVkLmdldFRleHQoKQotCQkJCQkJOiBjdHJsX2xldmVsc19hZG9wdGlvbi5nZXRUZXh0KCk7Ci0JCQkJaWYgKCFuZXdDb250ZW50LmVxdWFscyhvbGRDb250ZW50KSkgewotCQkJCQlib29sZWFuIHN1Y2Nlc3MgPSBlZGl0b3IuZ2V0QWN0aW9uTWFuYWdlcigpLmRvQWN0aW9uKAotCQkJCQkJCUlBY3Rpb25NYW5hZ2VyLlNFVCwKLQkJCQkJCQkob3JnLmVjbGlwc2UuZXBmLnVtYS5QcmFjdGljZURlc2NyaXB0aW9uKSBndWlkYW5jZQotCQkJCQkJCQkJLmdldFByZXNlbnRhdGlvbigpLAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkuZ2V0UHJhY3RpY2VEZXNjcmlwdGlvbl9MZXZlbHNPZkFkb3B0aW9uKCksCi0JCQkJCQkJbmV3Q29udGVudCwgLTEpOwotCQkJCQlpZiAoc3VjY2VzcyAmJiBpc1ZlcnNpb25TZWN0aW9uT24oKSkgewotCQkJCQkJdXBkYXRlQ2hhbmdlRGF0ZSgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuR3VpZGFuY2VEZXNjcmlwdGlvblBhZ2UjcmVmcmVzaChib29sZWFuKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2goYm9vbGVhbiBlZGl0YWJsZSkgewotCQlzdXBlci5yZWZyZXNoKGVkaXRhYmxlKTsKLQkJY3RybF9hZGRpdGlvbmFsX2luZm8uc2V0RWRpdGFibGUoZWRpdGFibGUpOwotCQljdHJsX2FwcGxpY2F0aW9uLnNldEVkaXRhYmxlKGVkaXRhYmxlKTsKLQkJY3RybF9nb2Fscy5zZXRFZGl0YWJsZShlZGl0YWJsZSk7Ci0vLwkJY3RybF9wcm9ibGVtLnNldEVkaXRhYmxlKGVkaXRhYmxlKTsKLQkJY3RybF9sZXZlbHNfYWRvcHRpb24uc2V0RWRpdGFibGUoZWRpdGFibGUpOwotCQljdHJsX2JhY2tncm91bmQuc2V0RWRpdGFibGUoZWRpdGFibGUpOwotCX0KLQotCS8qKgotCSAqIExvYWQgaW5pdGlhbCBkYXRhIGZyb20gbW9kZWwKLQkgKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5HdWlkYW5jZURlc2NyaXB0aW9uUGFnZSNsb2FkRGF0YSgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgbG9hZERhdGEoKSB7Ci0JCXN1cGVyLmxvYWREYXRhKCk7Ci0JCWlmIChndWlkYW5jZSAhPSBudWxsKSB7Ci0JCQlvcmcuZWNsaXBzZS5lcGYudW1hLlByYWN0aWNlRGVzY3JpcHRpb24gZ3VpZGFuY2VEZXNjcmlwdGlvbiA9IChvcmcuZWNsaXBzZS5lcGYudW1hLlByYWN0aWNlRGVzY3JpcHRpb24pIGd1aWRhbmNlCi0JCQkJCS5nZXRQcmVzZW50YXRpb24oKTsKLQkJCWN0cmxfYWRkaXRpb25hbF9pbmZvCi0JCQkJCS5zZXRUZXh0KGd1aWRhbmNlRGVzY3JpcHRpb24uZ2V0QWRkaXRpb25hbEluZm8oKSA9PSBudWxsID8gIiIgOiBndWlkYW5jZURlc2NyaXB0aW9uLmdldEFkZGl0aW9uYWxJbmZvKCkpOyAvLyROT04tTkxTLTEkCi0JCQljdHJsX3Byb2JsZW0KLQkJCQkJLnNldFRleHQoZ3VpZGFuY2VEZXNjcmlwdGlvbi5nZXRQcm9ibGVtKCkgPT0gbnVsbCA/ICIiIDogZ3VpZGFuY2VEZXNjcmlwdGlvbi5nZXRQcm9ibGVtKCkpOyAvLyROT04tTkxTLTEkCi0JCQljdHJsX2JhY2tncm91bmQKLQkJCQkJLnNldFRleHQoZ3VpZGFuY2VEZXNjcmlwdGlvbi5nZXRCYWNrZ3JvdW5kKCkgPT0gbnVsbCA/ICIiIDogZ3VpZGFuY2VEZXNjcmlwdGlvbi5nZXRCYWNrZ3JvdW5kKCkpOyAvLyROT04tTkxTLTEkCi0JCQljdHJsX2FwcGxpY2F0aW9uCi0JCQkJCS5zZXRUZXh0KGd1aWRhbmNlRGVzY3JpcHRpb24uZ2V0QXBwbGljYXRpb24oKSA9PSBudWxsID8gIiIgOiBndWlkYW5jZURlc2NyaXB0aW9uLmdldEFwcGxpY2F0aW9uKCkpOyAvLyROT04tTkxTLTEkCi0JCQljdHJsX2dvYWxzCi0JCQkJCS5zZXRUZXh0KGd1aWRhbmNlRGVzY3JpcHRpb24uZ2V0R29hbHMoKSA9PSBudWxsID8gIiIgOiBndWlkYW5jZURlc2NyaXB0aW9uLmdldEdvYWxzKCkpOyAvLyROT04tTkxTLTEkCi0JCQljdHJsX2xldmVsc19hZG9wdGlvbgotCQkJCQkuc2V0VGV4dChndWlkYW5jZURlc2NyaXB0aW9uLmdldExldmVsc09mQWRvcHRpb24oKSA9PSBudWxsID8gIiIgOiBndWlkYW5jZURlc2NyaXB0aW9uLmdldExldmVsc09mQWRvcHRpb24oKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5HdWlkYW5jZURlc2NyaXB0aW9uUGFnZSNnZXRDb250ZW50RWxlbWVudCgpCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBnZXRDb250ZW50RWxlbWVudCgpIHsKLQkJcmV0dXJuIGd1aWRhbmNlOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvUHJhY3RpY2VSZWZlcmVuY2VzUGFnZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9QcmFjdGljZVJlZmVyZW5jZXNQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllZTI2MWMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9QcmFjdGljZVJlZmVyZW5jZXNQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNjcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3JtczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuTWV0aG9kRWxlbWVudEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZpbHRlcnMuQWxsRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlByZXNlbnRhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSUFjdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLk1ldGhvZEVsZW1lbnRTZXRQcm9wZXJ0eUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5GaWx0ZXJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkNhdGVnb3J5U29ydEhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuQ29udGVudEVsZW1lbnRPcmRlckxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1pbGVzdG9uZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByYWN0aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc1BhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLklNYW5hZ2VkRm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuRm9ybUVkaXRvcjsKLQotCi0vKioKLSAqIFRoZSBSZWZlcmVuY2VzIHBhZ2UgaW4gdGhlIFByYWN0aWNlIGVkaXRvci4KLSAqIAotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUHJhY3RpY2VSZWZlcmVuY2VzUGFnZSBleHRlbmRzIEFzc29jaWF0aW9uRm9ybVBhZ2UgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZPUk1fUEFHRV9JRCA9ICJwcmFjdGljZVJlZmVyZW5jZXNQYWdlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBQcmFjdGljZSBwcmFjdGljZTsKLQotCXByaXZhdGUgSUFjdGlvbk1hbmFnZXIgYWN0aW9uTWdyOwotCQotCXByaXZhdGUgQ29udGVudEVsZW1lbnRPcmRlckxpc3QgY29udGVudEVsZW1lbnRPcmRlckxpc3Q7Ci0JcHJpdmF0ZSBDb250ZW50RWxlbWVudE9yZGVyTGlzdCBhY3Rpdml0eU9yZGVyTGlzdDsKLQlwcml2YXRlIEJ1dHRvbiBtYW51YWxTb3J0Q2hlY2tCdXR0b247Ci0JcHJpdmF0ZSBCdXR0b24gdHlwZVNvcnRCdXR0b247Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBQcmFjdGljZVJlZmVyZW5jZXNQYWdlKEZvcm1FZGl0b3IgZWRpdG9yKSB7Ci0JCXN1cGVyKGVkaXRvciwgRk9STV9QQUdFX0lELCBBdXRob3JpbmdVSVRleHQuUkVGRVJFTkNFU19QQUdFX1RJVExFKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNpbml0KG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlLCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJRWRpdG9yU2l0ZSBzaXRlLCBJRWRpdG9ySW5wdXQgaW5wdXQpIHsKLQkJc3VwZXIuaW5pdChzaXRlLCBpbnB1dCk7Ci0JCXByYWN0aWNlID0gKFByYWN0aWNlKSBjb250ZW50RWxlbWVudDsKLQkJYWN0aW9uTWdyID0gKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkuZ2V0QWN0aW9uTWFuYWdlcigpOwotCQlzZXRJc1VwQW5kRG93bkJ1dHRvbnNSZXF1aXJlZDEodHJ1ZSk7Ci0JCXNldFVzZUNhdGVnb3J5MihmYWxzZSk7Ci0JCXNldFVzZUNhdGVnb3J5MyhmYWxzZSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUZvcm1Db250ZW50KElNYW5hZ2VkRm9ybSBtYW5hZ2VkRm9ybSkgewotCQlzdXBlci5jcmVhdGVGb3JtQ29udGVudChtYW5hZ2VkRm9ybSk7Ci0JCW1hbnVhbFNvcnRDaGVja0J1dHRvbiA9IHRvb2xraXQuY3JlYXRlQnV0dG9uKGNhdGVnb3J5MXBhbmUyLCBBdXRob3JpbmdVSVJlc291cmNlcy5wcmFjdGljZVJlZmVyZW5jZXNQYWdlX3NvcnRPcmRlckJ1dHRvbl90ZXh0LCBTV1QuQ0hFQ0spOwotCQltYW51YWxTb3J0Q2hlY2tCdXR0b24ubW92ZUFib3ZlKGN0cmxfdXAxKTsKLQkJbWFudWFsU29ydENoZWNrQnV0dG9uLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQlib29sZWFuIGlzTWFudWFsID0gQ2F0ZWdvcnlTb3J0SGVscGVyLmlzTWFudWFsQ2F0ZWdvcnlTb3J0KGNvbnRlbnRFbGVtZW50KTsKLQkJbWFudWFsU29ydENoZWNrQnV0dG9uLnNldFNlbGVjdGlvbihpc01hbnVhbCk7Ci0JCW1hbnVhbFNvcnRDaGVja0J1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWJvb2xlYW4gaXNNYW51YWwgPSBtYW51YWxTb3J0Q2hlY2tCdXR0b24uZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJU3RyaW5nIHZhbHVlID0gQ2F0ZWdvcnlTb3J0SGVscGVyLlZfQ0FURUdPUllfRUxFTUVOVFNfX1NPUlRfVFlQRV9NQU5VQUw7Ci0JCQkJaWYgKCFpc01hbnVhbCkgewotCQkJCQl2YWx1ZSA9IENhdGVnb3J5U29ydEhlbHBlci5WX0NBVEVHT1JZX0VMRU1FTlRTX19TT1JUX1RZUEVfTUVUSE9EX1RZUEU7Ci0JCQkJfQotCQkJCWFjdGlvbk1nci5leGVjdXRlKG5ldyBNZXRob2RFbGVtZW50U2V0UHJvcGVydHlDb21tYW5kKHByYWN0aWNlLAotCQkJCQkJQ2F0ZWdvcnlTb3J0SGVscGVyLktFWV9DQVRFR09SWV9FTEVNRU5UU19fU09SVF9UWVBFLCB2YWx1ZSkpOwotCQkJCWVuYWJsZVVwRG93bkJ1dHRvbnMxKCk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJdHlwZVNvcnRCdXR0b24gPSB0b29sa2l0LmNyZWF0ZUJ1dHRvbihjYXRlZ29yeTFwYW5lMiwgQXV0aG9yaW5nVUlSZXNvdXJjZXMucHJhY3RpY2VSZWZlcmVuY2VzUGFnZV9zb3J0VHlwZUJ1dHRvbl90ZXh0LCBTV1QuUFVTSCk7Ci0JCXR5cGVTb3J0QnV0dG9uLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQl0eXBlU29ydEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCS8vIHNvcnQgZWxlbWVudHMKLQkJCQlMaXN0PE9iamVjdD4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PigpOwotCQkJCWxpc3QuYWRkQWxsKHByYWN0aWNlLmdldENvbnRlbnRSZWZlcmVuY2VzKCkpOwotCQkJCUNvbXBhcmF0b3IgY29tcGFyYXRvciA9IFByZXNlbnRhdGlvbkNvbnRleHQuSU5TVEFOQ0UuZ2V0TWV0aG9kRWxlbWVudFR5cGVDb21wYXJhdG9yKCk7Ci0JCQkJQ29sbGVjdGlvbnMuPE9iamVjdD5zb3J0KGxpc3QsIGNvbXBhcmF0b3IpOwotCi0JCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlJFTU9WRV9NQU5ZLCBwcmFjdGljZSwKLQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCS5nZXRQcmFjdGljZV9Db250ZW50UmVmZXJlbmNlcygpLCBwcmFjdGljZS5nZXRDb250ZW50UmVmZXJlbmNlcygpLCAtMSk7Ci0KLQkJCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuQUREX01BTlksIHByYWN0aWNlLAotCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJLmdldFByYWN0aWNlX0NvbnRlbnRSZWZlcmVuY2VzKCksIGxpc3QsIC0xKTsKLQkJCQlyZWZyZXNoVmlld2VycygpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZW5hYmxlVXBEb3duQnV0dG9uczEoKSB7Ci0JCXN1cGVyLmVuYWJsZVVwRG93bkJ1dHRvbnMxKCk7Ci0JCWlmICh0eXBlU29ydEJ1dHRvbiAhPSBudWxsKSB7Ci0JCQlpZiAoaXNTaG91bGRFbmFibGVBbHBoYVNvcnQoKSkgewotCQkJCXR5cGVTb3J0QnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQl9IGVsc2UgewotCQkJCXR5cGVTb3J0QnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNTaG91bGRFbmFibGVBbHBoYVNvcnQoKSB7Ci0JCWlmIChjb250ZW50RWxlbWVudCAhPSBudWxsKSB7Ci0JCQlpZiAoIVRuZ1V0aWwuaXNMb2NrZWQoY29udGVudEVsZW1lbnQpICYmIAotCQkJCQlDYXRlZ29yeVNvcnRIZWxwZXIuaXNNYW51YWxDYXRlZ29yeVNvcnQoY29udGVudEVsZW1lbnQpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0gCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNpbml0Q29udGVudFByb3ZpZGVyU2VsZWN0ZWQoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRDb250ZW50UHJvdmlkZXJTZWxlY3RlZCgpIHsKLQkJY29udGVudFByb3ZpZGVyU2VsZWN0ZWQgPSBuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoCi0JCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJCS5nZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSkgewotCQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBvYmplY3QpIHsKLQkJCQlpZiAoY29udGVudEVsZW1lbnRPcmRlckxpc3QgPT0gbnVsbCkgewotCQkJCQljb250ZW50RWxlbWVudE9yZGVyTGlzdCA9IG5ldyBDb250ZW50RWxlbWVudE9yZGVyTGlzdCgKLQkJCQkJCQljb250ZW50RWxlbWVudCwKLQkJCQkJCQlDb250ZW50RWxlbWVudE9yZGVyTGlzdC5DT05URU5UX0VMRU1FTlRTX19GT1JfRUxFTUVOVF9PTkxZLAotCQkJCQkJCWdldENvbnRlbnRFbGVtZW50T3JkZXJGZWF0dXJlKCkpOwotCQkJCX0KLQkJCQlpZiAoYWN0aXZpdHlPcmRlckxpc3QgPT0gbnVsbCkgewotCQkJCQlhY3Rpdml0eU9yZGVyTGlzdCA9IG5ldyBDb250ZW50RWxlbWVudE9yZGVyTGlzdCgKLQkJCQkJCQljb250ZW50RWxlbWVudCwKLQkJCQkJCQlDb250ZW50RWxlbWVudE9yZGVyTGlzdC5DT05URU5UX0VMRU1FTlRTX19GT1JfRUxFTUVOVF9PTkxZLAotCQkJCQkJCWdldEFjdGl2aXR5T3JkZXJGZWF0dXJlKCkpOwotCQkJCX0KLQkJCQlMaXN0PE9iamVjdD4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PigpOwotCQkJCWxpc3QuYWRkQWxsKGNvbnRlbnRFbGVtZW50T3JkZXJMaXN0KTsKLQkJCQlsaXN0LmFkZEFsbChhY3Rpdml0eU9yZGVyTGlzdCk7Ci0JCQkJcmV0dXJuIGxpc3QudG9BcnJheSgpOwotCQkJfQotCQl9OwotCQl2aWV3ZXJfc2VsZWN0ZWQuc2V0Q29udGVudFByb3ZpZGVyKGNvbnRlbnRQcm92aWRlclNlbGVjdGVkKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNhZGRJdGVtc1RvTW9kZWwxKEFycmF5TGlzdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRJdGVtc1RvTW9kZWwxKEFycmF5TGlzdCBhZGRJdGVtcykgewotCQkvLyBVcGRhdGUgdGhlIG1vZGVsLgotCQlpZiAoIWFkZEl0ZW1zLmlzRW1wdHkoKSkgewotCQkJZm9yIChJdGVyYXRvciBpdCA9IGFkZEl0ZW1zLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlPYmplY3QgaXRlbSA9IGl0Lm5leHQoKTsKLQkJCQlpZiAoaXRlbSBpbnN0YW5jZW9mIENvbnRlbnRFbGVtZW50KSB7Ci0JCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5BREQsIHByYWN0aWNlLAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkuZ2V0UHJhY3RpY2VfQ29udGVudFJlZmVyZW5jZXMoKSwgaXRlbSwgLTEpOwotCQkJCX0gZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJCWFjdGlvbk1ncgotCQkJCQkJCS5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5BREQsIHByYWN0aWNlLAotCQkJCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCQkJLmdldFByYWN0aWNlX0FjdGl2aXR5UmVmZXJlbmNlcygpLAotCQkJCQkJCQkJaXRlbSwgLTEpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI3JlbW92ZUl0ZW1zRnJvbU1vZGVsMShBcnJheUxpc3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlSXRlbXNGcm9tTW9kZWwxKEFycmF5TGlzdCBybUl0ZW1zKSB7Ci0JCS8vIFVwZGF0ZSB0aGUgbW9kZWwuCi0JCWlmICghcm1JdGVtcy5pc0VtcHR5KCkpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBybUl0ZW1zLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlPYmplY3QgaXRlbSA9IGl0Lm5leHQoKTsKLQkJCQlpZiAoaXRlbSBpbnN0YW5jZW9mIENvbnRlbnRFbGVtZW50KSB7Ci0JCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5SRU1PVkUsIHByYWN0aWNlLAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkuZ2V0UHJhY3RpY2VfQ29udGVudFJlZmVyZW5jZXMoKSwgaXRlbSwgLTEpOwotCQkJCX0gZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJCWFjdGlvbk1ncgotCQkJCQkJCS5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5SRU1PVkUsIHByYWN0aWNlLAotCQkJCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCQkJLmdldFByYWN0aWNlX0FjdGl2aXR5UmVmZXJlbmNlcygpLAotCQkJCQkJCQkJaXRlbSwgLTEpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkJCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVTdHJ1Y3R1cmFsRmVhdHVyZSBnZXRPcmRlckZlYXR1cmUoKSB7Ci0JCUxpc3Q8Q29udGVudEVsZW1lbnQ+IGNlTGlzdCA9IGdldFNlbGVjdGVkQ29udGVudEVsZW1lbnRzKCk7Ci0JCUxpc3Q8QWN0aXZpdHk+IGFMaXN0ID0gZ2V0U2VsZWN0ZWRBY3Rpdml0aWVzKCk7Ci0JCWlmIChjZUxpc3Quc2l6ZSgpID4gMCAmJiBhTGlzdC5zaXplKCkgPT0gMCkgewotCQkJcmV0dXJuIGdldENvbnRlbnRFbGVtZW50T3JkZXJGZWF0dXJlKCk7Ci0JCX0gZWxzZSBpZiAoYUxpc3Quc2l6ZSgpID4gMCAmJiBjZUxpc3Quc2l6ZSgpID09IDApIHsKLQkJCXJldHVybiBnZXRBY3Rpdml0eU9yZGVyRmVhdHVyZSgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwcml2YXRlIEVTdHJ1Y3R1cmFsRmVhdHVyZSBnZXRDb250ZW50RWxlbWVudE9yZGVyRmVhdHVyZSgpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFByYWN0aWNlX0NvbnRlbnRSZWZlcmVuY2VzKCk7Ci0JfQotCi0JcHJpdmF0ZSBFU3RydWN0dXJhbEZlYXR1cmUgZ2V0QWN0aXZpdHlPcmRlckZlYXR1cmUoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRQcmFjdGljZV9BY3Rpdml0eVJlZmVyZW5jZXMoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIENvbnRlbnRFbGVtZW50T3JkZXJMaXN0IGdldENvbnRlbnRFbGVtZW50T3JkZXJMaXN0KCkgewotCQlMaXN0PENvbnRlbnRFbGVtZW50PiBjZUxpc3QgPSBnZXRTZWxlY3RlZENvbnRlbnRFbGVtZW50cygpOwotCQlMaXN0PEFjdGl2aXR5PiBhTGlzdCA9IGdldFNlbGVjdGVkQWN0aXZpdGllcygpOwotCQlpZiAoY2VMaXN0LnNpemUoKSA+IDAgJiYgYUxpc3Quc2l6ZSgpID09IDApIHsKLQkJCXJldHVybiBjb250ZW50RWxlbWVudE9yZGVyTGlzdDsKLQkJfSBlbHNlIGlmIChhTGlzdC5zaXplKCkgPiAwICYmIGNlTGlzdC5zaXplKCkgPT0gMCkgewotCQkJcmV0dXJuIGFjdGl2aXR5T3JkZXJMaXN0OwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwcml2YXRlIExpc3Q8Q29udGVudEVsZW1lbnQ+IGdldFNlbGVjdGVkQ29udGVudEVsZW1lbnRzKCkgewotCQlMaXN0PENvbnRlbnRFbGVtZW50PiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PENvbnRlbnRFbGVtZW50PigpOwotCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHZpZXdlcl9zZWxlY3RlZAotCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gc2VsZWN0aW9uLml0ZXJhdG9yKCk7aXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgbyA9IGl0ZXIubmV4dCgpOwotCQkJaWYgKG8gaW5zdGFuY2VvZiBDb250ZW50RWxlbWVudCkgewotCQkJCXJlc3VsdC5hZGQoKENvbnRlbnRFbGVtZW50KW8pOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0PEFjdGl2aXR5PiBnZXRTZWxlY3RlZEFjdGl2aXRpZXMoKSB7Ci0JCUxpc3Q8QWN0aXZpdHk+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8QWN0aXZpdHk+KCk7Ci0JCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgdmlld2VyX3NlbGVjdGVkCi0JCQkJLmdldFNlbGVjdGlvbigpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBzZWxlY3Rpb24uaXRlcmF0b3IoKTtpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBvID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAobyBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJcmVzdWx0LmFkZCgoQWN0aXZpdHkpbyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRDb250ZW50RWxlbWVudCgpCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBnZXRDb250ZW50RWxlbWVudCgpIHsKLQkJcmV0dXJuIHByYWN0aWNlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2dldFRhYlN0cmluZygpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRUYWJTdHJpbmcoKSB7Ci0JCXJldHVybiBGaWx0ZXJDb25zdGFudHMuQUxMX0VMRU1FTlRTOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2dldEZpbHRlcigpCi0JICovCi0JcHJvdGVjdGVkIElGaWx0ZXIgZ2V0RmlsdGVyKCkgewotCQlyZXR1cm4gZmlsdGVyID0gbmV3IEFsbEZpbHRlcigpIHsKLQkJCXByb3RlY3RlZCBib29sZWFuIGNoaWxkQWNjZXB0KE9iamVjdCBvYmopIHsKLQkJCQlpZihvYmogaW5zdGFuY2VvZiBNaWxlc3RvbmUpIHJldHVybiBmYWxzZTsKLQkJCQlpZihvYmogaW5zdGFuY2VvZiBDb250ZW50RWxlbWVudAotCQkJCQl8fCBvYmogaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50Ci0JCQkJCXx8IG9iaiBpbnN0YW5jZW9mIFByb2Nlc3NQYWNrYWdlKSAKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9OwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNnZXRNdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uKGludCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldE11bHRpcGxlU2VsZWN0RGVzY3JpcHRpb24oaW50IGNvdW50KSB7Ci0JCXJldHVybiBzdXBlci5nZXRNdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uKGNvdW50LCBBdXRob3JpbmdVSVJlc291cmNlcy5wcmFjdGljZVJlZmVyZW5jZXNQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb24pOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNnZXRTZWN0aW9uRGVzY3JpcHRpb24oKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VjdGlvbkRlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMucHJhY3RpY2VSZWZlcmVuY2VzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb247Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0U2VjdGlvbk5hbWUoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VjdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy5wcmFjdGljZVJlZmVyZW5jZXNQYWdlX3NlY3Rpb25OYW1lOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldFNlbGVjdGVkTGFiZWwoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VsZWN0ZWRMYWJlbCgpIHsKLQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLnByYWN0aWNlUmVmZXJlbmNlc1BhZ2Vfc2VsZWN0ZWRMYWJlbDsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0U2VsZWN0ZWRMYWJlbDIoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VsZWN0ZWRMYWJlbDIoKSB7Ci0JCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy5wcmFjdGljZVJlZmVyZW5jZXNQYWdlX3NlbGVjdGVkTGFiZWw7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldFNlbGVjdGVkTGFiZWwzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlbGVjdGVkTGFiZWwzKCkgewotCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMucHJhY3RpY2VSZWZlcmVuY2VzUGFnZV9zZWxlY3RlZExhYmVsOwotCX0KLQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9Qcm9jZXNzQnJlYWtkb3duU3RydWN0dXJlRm9ybVBhZ2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvUHJvY2Vzc0JyZWFrZG93blN0cnVjdHVyZUZvcm1QYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3NzhlYTAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9Qcm9jZXNzQnJlYWtkb3duU3RydWN0dXJlRm9ybVBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMDYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3JtczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udWkudmlld2VyLklWaWV3ZXJQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZmlndXJlcy5Db2xvcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSUhlbHBDb250ZXh0czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5jZWxsZWRpdG9ycy5BYnN0cmFjdENoZWNrQm94Q2VsbEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmNlbGxlZGl0b3JzLlByb2Nlc3NDaGVja0JveENlbGxFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLkNvbHVtbkRlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLk1ldGhvZEVsZW1lbnRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLlByb2Nlc3NFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm92aWRlcnMuRXhwb3NlZEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvdmlkZXJzLlZhcmlhYmlsaXR5RWxlbWVudExhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS52aWV3cy5Qcm9jZXNzVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuU3RyVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JQWN0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLklCU0l0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuSUNvbHVtbkF3YXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5QcmVkZWNlc3Nvckxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlByb2Nlc3NVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5TdXBwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmliYWJsZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtPcmRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNlbGxFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DaGVja2JveENlbGxFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5Db21ib0JveENlbGxFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5EZWNvcmF0aW5nTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDZWxsRWRpdG9yVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNlbGxNb2RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDb2xvclByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXJMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGV4dENlbGxFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNUYWJGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLldpZGdldDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLklNYW5hZ2VkRm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuRm9ybUVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLkZvcm1Ub29sa2l0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuU2Nyb2xsZWRGb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuU2VjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLlRhYmxlV3JhcERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5UYWJsZVdyYXBMYXlvdXQ7Ci0KLQotLyoqCi0gKiBCcmVhZG93biBzdHJ1Y3R1cmUgZWRpdG9yCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUHJvY2Vzc0JyZWFrZG93blN0cnVjdHVyZUZvcm1QYWdlIGV4dGVuZHMgUHJvY2Vzc0Zvcm1QYWdlCi0JCWltcGxlbWVudHMgSVZpZXdlclByb3ZpZGVyIHsKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFRYVF9UUlVFID0gInRydWUiOyAvLyROT04tTkxTLTEkCi0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBUWFRfRkFMU0UgPSAiZmFsc2UiOyAvLyROT04tTkxTLTEkCi0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIENvbGxlY3Rpb248RUNsYXNzPiBFQ0xBU1NFUzsKLQkKLQlwcml2YXRlIGludCB0YWJJbmRleCA9IDA7Ci0JCi0Jc3RhdGljIHsKLQkJRUNMQVNTRVMgPSBuZXcgQXJyYXlMaXN0PEVDbGFzcz4oKTsKLQkJRUNMQVNTRVMuYWRkKFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE1ldGhvZFBhY2thZ2UoKSk7Ci0JfQotCQotCXByaXZhdGUgY2xhc3MgUHJvY2Vzc0FkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlciBleHRlbmRzCi0JCQlWYXJpYWJpbGl0eUVsZW1lbnRMYWJlbFByb3ZpZGVyIGltcGxlbWVudHMgSUNvbG9yUHJvdmlkZXIgewotCi0JCXByaXZhdGUgRGVjb3JhdGluZ0xhYmVsUHJvdmlkZXIgZGVjb3JhdGluZ0xhYmVsUHJvdmlkZXI7Ci0JCQotCQkvKioKLQkJICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JCSAqLwotCQlwdWJsaWMgUHJvY2Vzc0FkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCQkJZGVjb3JhdGluZ0xhYmVsUHJvdmlkZXIgPSBuZXcgRGVjb3JhdGluZ0xhYmVsUHJvdmlkZXIoCi0JCQkJCW5ldyBBZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIoYWRhcHRlckZhY3RvcnkpLAotCQkJCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldERlY29yYXRvck1hbmFnZXIoKS5nZXRMYWJlbERlY29yYXRvcigpKTsKLQkJfQotCQkKLQkJcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoSUxhYmVsUHJvdmlkZXJMaXN0ZW5lciBsaXN0ZW5lcikgewotCQkJc3VwZXIuYWRkTGlzdGVuZXIobGlzdGVuZXIpOwotCQkJZGVjb3JhdGluZ0xhYmVsUHJvdmlkZXIuYWRkTGlzdGVuZXIobGlzdGVuZXIpOwotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCByZW1vdmVMaXN0ZW5lcihJTGFiZWxQcm92aWRlckxpc3RlbmVyIGxpc3RlbmVyKSB7CQkJCi0JCQlzdXBlci5yZW1vdmVMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCQlkZWNvcmF0aW5nTGFiZWxQcm92aWRlci5yZW1vdmVMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCX0KLQkJCQkKLQkJCi0JCS8qIChub24tSmF2YWRvYykKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIjZ2V0Q29sdW1uSW1hZ2UoamF2YS5sYW5nLk9iamVjdCwgaW50KQotCQkgKi8KLQkJcHVibGljIEltYWdlIGdldENvbHVtbkltYWdlKE9iamVjdCBvYmplY3QsIGludCBjb2x1bW5JbmRleCkgewotCQkJaWYoY29sdW1uSW5kZXggPT0gMCkgewotCQkJCXJldHVybiBnZXRJbWFnZShvYmplY3QpOwotCQkJfQotCQkJcmV0dXJuIHN1cGVyLmdldENvbHVtbkltYWdlKG9iamVjdCwgY29sdW1uSW5kZXgpOwotCQl9Ci0JCQotCQkvKiAobm9uLUphdmFkb2MpCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyI2dldEltYWdlKGphdmEubGFuZy5PYmplY3QpCi0JCSAqLwotCQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQkJcmV0dXJuIGRlY29yYXRpbmdMYWJlbFByb3ZpZGVyLmdldEltYWdlKG9iamVjdCk7Ci0JCX0KLQotCQkvKioKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ29sb3JQcm92aWRlciNnZXRGb3JlZ3JvdW5kKGphdmEubGFuZy5PYmplY3QpCi0JCSAqLwotCQlwdWJsaWMgQ29sb3IgZ2V0Rm9yZWdyb3VuZChPYmplY3QgZWxlbWVudCkgewotCQkJaWYgKGlzU3VwcHJlc3NlZChlbGVtZW50KSkgewotCQkJCXJldHVybiBDb2xvcnMuU1VQUkVTU0VEX0VMRU1FTlRfTEFCRUw7Ci0JCQl9Ci0JCQllbHNlIGlmIChpc0V4dGVybmFsKGVsZW1lbnQpKSB7Ci0JCQkJcmV0dXJuIENvbG9ycy5JTkhFUklURURfRUxFTUVOVF9MQUJFTDsKLQkJCX0JCQkKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJcHJpdmF0ZSBib29sZWFuIGlzU3VwcHJlc3NlZChPYmplY3QgZWxlbWVudCkgewotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50KSB7Ci0JCQkJcmV0dXJuIGdldFN1cHByZXNzaW9uKCkKLQkJCQkJCS5pc1N1cHByZXNzZWQoKEJyZWFrZG93bkVsZW1lbnQpIGVsZW1lbnQpOwotCQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIHsKLQkJCQlyZXR1cm4gZ2V0U3VwcHJlc3Npb24oKS5pc1N1cHByZXNzZWQoCi0JCQkJCQkoQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIGVsZW1lbnQpOwotCQkJfQotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJcHJpdmF0ZSBTdXBwcmVzc2lvbiBnZXRTdXBwcmVzc2lvbigpIHsKLQkJCXJldHVybiAoKFByb2Nlc3NFZGl0b3IpIFByb2Nlc3NCcmVha2Rvd25TdHJ1Y3R1cmVGb3JtUGFnZS50aGlzCi0JCQkJCS5nZXRFZGl0b3IoKSkuZ2V0U3VwcHJlc3Npb24oKTsKLQkJfQotCi0JCS8qKgotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDb2xvclByb3ZpZGVyI2dldEJhY2tncm91bmQoamF2YS5sYW5nLk9iamVjdCkKLQkJICovCi0JCXB1YmxpYyBDb2xvciBnZXRCYWNrZ3JvdW5kKE9iamVjdCBlbGVtZW50KSB7Ci0JCQkvLyBsZXQgT1MgdGFrZSBjb250cm9sIG92ZXIgdHJlZSB3aWRnZXQgYmFja2dyb3VuZAotCQkJLy8gcmF0aGVyIHRoYW4gc2VuZGluZyBvbmUgZml4ZWQgYmFja2dyb3VuZC4KLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJLyoqCi0JCSAqIAotCQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnV0aWwuVmFyaWFiaWxpdHlFbGVtZW50TGFiZWxQcm92aWRlciNpc0V4dGVybmFsKGphdmEubGFuZy5PYmplY3QpCi0JCSAqLwotCQlwdWJsaWMgYm9vbGVhbiBpc0V4dGVybmFsKE9iamVjdCBlbGVtZW50KSB7Ci0JCQlyZXR1cm4gUHJvY2Vzc1V0aWwuaXNJbmhlcml0ZWQoZWxlbWVudCk7Ci0JCX0KLQotCQkvKioKLQkJICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC51dGlsLlZhcmlhYmlsaXR5RWxlbWVudExhYmVsUHJvdmlkZXIjZ2V0Rm9udChqYXZhLmxhbmcuT2JqZWN0KQotCQkgKi8KLQkJcHVibGljIEZvbnQgZ2V0Rm9udChPYmplY3QgZWxlbWVudCkgewotCQkJaWYgKGlzRXh0ZXJuYWwoZWxlbWVudCkpIHsKLQkJCQlyZXR1cm4gaXRhbGljRm9udDsKLQkJCX0KLQkJCXJldHVybiByZWd1bGFyRm9udDsKLQkJfQotCQkKLQkJLyogKG5vbi1KYXZhZG9jKQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvdmlkZXJzLlZhcmlhYmlsaXR5RWxlbWVudExhYmVsUHJvdmlkZXIjZGlzcG9zZSgpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkJZGVjb3JhdGluZ0xhYmVsUHJvdmlkZXIuZGlzcG9zZSgpOwotCQkJZGVjb3JhdGluZ0xhYmVsUHJvdmlkZXIgPSBudWxsOwotCQkJc3VwZXIuZGlzcG9zZSgpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIGNsYXNzIFZhbGlkYXRpbmdUZXh0Q2VsbEVkaXRvciBleHRlbmRzIFRleHRDZWxsRWRpdG9yIHsKLQkJcHJvdGVjdGVkIE9iamVjdCBsYXN0SW52YWxpZEVsZW1lbnQ7Ci0KLQkJcHJpdmF0ZSBpbnQgY29sdW1uSW5kZXg7Ci0KLQkJLyoqCi0JCSAqIEBwYXJhbSBwYXJlbnQKLQkJICovCi0JCXB1YmxpYyBWYWxpZGF0aW5nVGV4dENlbGxFZGl0b3IoQ29tcG9zaXRlIHBhcmVudCkgewotCQkJc3VwZXIocGFyZW50KTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHNldENvbHVtbkluZGV4KGludCBjb2x1bW5JbmRleCkgewotCQkJdGhpcy5jb2x1bW5JbmRleCA9IGNvbHVtbkluZGV4OwotCQl9Ci0KLQkJcHVibGljIGludCBnZXRDb2x1bW5JbmRleCgpIHsKLQkJCXJldHVybiBjb2x1bW5JbmRleDsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgZ2V0TGFzdEludmFsaWRFbGVtZW50KCkgewotCQkJcmV0dXJuIGxhc3RJbnZhbGlkRWxlbWVudDsKLQkJfQotCi0JCVN0cmluZyBpc1ZhbGlkKFN0cmluZyB0eHQpIHsKLQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgdmlld2VyCi0JCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQkJCWlmIChzZWxlY3Rpb24uc2l6ZSgpID09IDEpIHsKLQkJCQlPYmplY3QgZSA9IHNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCQlTdHJpbmcgbXNnID0gaXNWYWxpZChlLCB0eHQpOwotCQkJCWlmIChtc2cgIT0gbnVsbCkgewotCQkJCQlsYXN0SW52YWxpZEVsZW1lbnQgPSBlOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWxhc3RJbnZhbGlkRWxlbWVudCA9IG51bGw7Ci0JCQkJfQotCQkJCXJldHVybiBtc2c7Ci0JCQl9Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXByb3RlY3RlZCBTdHJpbmcgaXNWYWxpZChPYmplY3QgZSwgU3RyaW5nIHR4dCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGNsYXNzIENlbGxFZGl0b3JWYWxpZGF0b3IgaW1wbGVtZW50cyBJQ2VsbEVkaXRvclZhbGlkYXRvciB7Ci0KLQkJcHJpdmF0ZSBWYWxpZGF0aW5nVGV4dENlbGxFZGl0b3IgY2VsbEVkaXRvcjsKLQotCQkvKioKLQkJICogCi0JCSAqLwotCQlwdWJsaWMgQ2VsbEVkaXRvclZhbGlkYXRvcihWYWxpZGF0aW5nVGV4dENlbGxFZGl0b3IgY2VsbEVkaXRvcikgewotCQkJdGhpcy5jZWxsRWRpdG9yID0gY2VsbEVkaXRvcjsKLQkJfQotCi0JCS8qKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNlbGxFZGl0b3JWYWxpZGF0b3IjaXNWYWxpZChqYXZhLmxhbmcuT2JqZWN0KQotCQkgKi8KLQkJcHVibGljIFN0cmluZyBpc1ZhbGlkKE9iamVjdCB2YWx1ZSkgewotCQkJcmV0dXJuIGNlbGxFZGl0b3IuaXNWYWxpZCgoU3RyaW5nKSB2YWx1ZSk7Ci0JCX0KLQotCX0KLQotCXByb3RlY3RlZCBjbGFzcyBWYWxpZGF0aW5nRGVhY3RpdmF0ZUxpc3RlbmVyIGltcGxlbWVudHMgTGlzdGVuZXIgewotCQlwcml2YXRlIFZhbGlkYXRpbmdUZXh0Q2VsbEVkaXRvciBjZWxsRWRpdG9yOwotCi0JCXB1YmxpYyBWYWxpZGF0aW5nRGVhY3RpdmF0ZUxpc3RlbmVyKFZhbGlkYXRpbmdUZXh0Q2VsbEVkaXRvciBjZWxsRWRpdG9yKSB7Ci0JCQl0aGlzLmNlbGxFZGl0b3IgPSBjZWxsRWRpdG9yOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJRGlzcGxheS5nZXRDdXJyZW50KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCWlmIChjZWxsRWRpdG9yLmdldExhc3RJbnZhbGlkRWxlbWVudCgpICE9IG51bGwpIHsKLQkJCQkJCUF1dGhvcmluZ1VJUGx1Z2luCi0JCQkJCQkJCS5nZXREZWZhdWx0KCkKLQkJCQkJCQkJLmdldE1zZ0RpYWxvZygpCi0JCQkJCQkJCS5kaXNwbGF5RXJyb3IoCi0JCQkJCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuZWRpdFByb2Nlc3NFbGVtZW50RXJyb3JEaWFsb2dfdGl0bGUsIAotCQkJCQkJCQkJCWNlbGxFZGl0b3IuZ2V0RXJyb3JNZXNzYWdlKCkpOwotCQkJCQkJdmlld2VyLmVkaXRFbGVtZW50KGNlbGxFZGl0b3IuZ2V0TGFzdEludmFsaWRFbGVtZW50KCksCi0JCQkJCQkJCWNlbGxFZGl0b3IuZ2V0Q29sdW1uSW5kZXgoKSk7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCX0pOwotCQl9Ci0JfQotCi0JLy8gcHJpdmF0ZSBjbGFzcyBWYWxpZGF0aW5nRm9jdXNBZGFwdGVyIGV4dGVuZHMgRm9jdXNBZGFwdGVyIHsKLQkvLyBwcml2YXRlIFZhbGlkYXRpbmdUZXh0Q2VsbEVkaXRvciBjZWxsRWRpdG9yOwotCS8vCi0JLy8gVmFsaWRhdGluZ0ZvY3VzQWRhcHRlcihWYWxpZGF0aW5nVGV4dENlbGxFZGl0b3IgY2VsbEVkaXRvcikgewotCS8vIHRoaXMuY2VsbEVkaXRvciA9IGNlbGxFZGl0b3I7Ci0JLy8gfQotCS8vCi0JLy8gcHVibGljIHZvaWQgZm9jdXNMb3N0KEZvY3VzRXZlbnQgZSkgewotCS8vIERpc3BsYXkuZ2V0Q3VycmVudCgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JLy8KLQkvLyBwdWJsaWMgdm9pZCBydW4oKSB7Ci0JLy8gaWYgKGNlbGxFZGl0b3IuZ2V0TGFzdEludmFsaWRFbGVtZW50KCkgIT0gbnVsbCkgewotCS8vIEF1dGhvcmluZ1VJUGx1Z2luCi0JLy8gLmdldERlZmF1bHQoKQotCS8vIC5nZXRNc2dEaWFsb2coKQotCS8vIC5kaXNwbGF5RXJyb3IoCi0JLy8gQXV0aG9yaW5nVUlSZXNvdXJjZXMKLQkvLyAuZ2V0U3RyaW5nKCJBdXRob3JpbmdVSS5lZGl0UHJvY2Vzc0VsZW1lbnRFcnJvckRpYWxvZy50aXRsZSIpLAotCS8vIC8vJE5PTi1OTFMtMSQKLQkvLyBjZWxsRWRpdG9yLmdldEVycm9yTWVzc2FnZSgpKTsKLQkvLyB2aWV3ZXIuZWRpdEVsZW1lbnQoY2VsbEVkaXRvci5nZXRMYXN0SW52YWxpZEVsZW1lbnQoKSwKLQkvLyBjZWxsRWRpdG9yLmdldENvbHVtbkluZGV4KCkpOwotCS8vIH0KLQkvLyB9Ci0JLy8KLQkvLyB9KTsKLQkvLyB9Ci0JLy8gfQotCi0JLy8gcHJpdmF0ZSBDb21wb3NpdGUgcGFyZW50ID0gbnVsbDsKLQotCXByb3RlY3RlZCBDb2x1bW5EZXNjcmlwdG9yW10gY29sdW1uRGVzY3JpcHRvcnM7Ci0KLQkvLyBwcml2YXRlIGJvb2xlYW4gdmFsaWROYW1lUHJvbXB0ZWQgPSBmYWxzZTsKLQkvLyBwcml2YXRlIGludCBwcm9tcHRDb3VudCA9IDA7Ci0KLQkvLyBwcml2YXRlIE1ldGhvZEVsZW1lbnQgcHJvbXB0ZWRFbGVtZW50OwotCi0JLy8gcHJpdmF0ZSBUYWJsZVRyZWVWaWV3ZXIgdGFibGVUcmVlVmlld2VyOwotCi0JcHJvdGVjdGVkIEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5OwotCi0JLy8gcHJpdmF0ZSBpbnQgdGFiSW5kZXg7Ci0KLQkvLyBwcml2YXRlIE9iamVjdCB0YWJGb2xkZXI7Ci0KLQlwcm90ZWN0ZWQgUHJvY2Vzc1ZpZXdlciB2aWV3ZXI7Ci0KLQlwcm90ZWN0ZWQgVGV4dENlbGxFZGl0b3IgdGV4dENlbGxFZGl0b3I7Ci0KLQlwcm90ZWN0ZWQgVmFsaWRhdGluZ1RleHRDZWxsRWRpdG9yIG5hbWVDZWxsRWRpdG9yOwotCi0JcHJvdGVjdGVkIFZhbGlkYXRpbmdUZXh0Q2VsbEVkaXRvciBwcmVkTGlzdENlbGxFZGl0b3I7Ci0KLQlwcm90ZWN0ZWQgQ29tYm9Cb3hDZWxsRWRpdG9yIGNvbWJvQm94Q2VsbEVkaXRvcjsKLQotCXByb3RlY3RlZCBDaGVja2JveENlbGxFZGl0b3IgY2hlY2tCb3hDZWxsRWRpdG9yOwotCi0JcHJvdGVjdGVkIFZhbGlkYXRpbmdUZXh0Q2VsbEVkaXRvciBwcmVzZW50YXRpb25OYW1lQ2VsbEVkaXRvcjsKLQotCS8vIHByaXZhdGUgSGFzaE1hcCBjb2x1bW5JbmRleFRvTmFtZU1hcDsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1JlYWRPbmx5OwotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZQotCSAqIEBwYXJhbSBlZGl0b3IKLQkgKiBAcGFyYW0gaWQKLQkgKiBAcGFyYW0gdGl0bGUKLQkgKi8KLQlwdWJsaWMgUHJvY2Vzc0JyZWFrZG93blN0cnVjdHVyZUZvcm1QYWdlKEZvcm1FZGl0b3IgZWRpdG9yLCBTdHJpbmcgaWQsCi0JCQlTdHJpbmcgdGl0bGUpIHsKLQkJc3VwZXIoZWRpdG9yLCBpZCwgdGl0bGUpOwotCX0KLQkKLQkvKioKLQkgKiBJZiByZXR1cm5zIHRydWUsIGVkaXRpbmcgaXMgZGlzYWJsZWQgb3Igbm90IGF2YWlsYWJsZSBmb3IgdGhlIHByb2Nlc3MgCi0JICogYnJlYWtkb3duIHN0cnVjdHVyZS4KLQkgKiAKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1JlYWRPbmx5KCkgewotCQlpZiAoaXNSZWFkT25seSkgewotCQkJcmV0dXJuIGlzUmVhZE9ubHk7Ci0JCX0KLQkJcmV0dXJuIFRuZ1V0aWwuaXNMb2NrZWQocHJvY2Vzcyk7Ci0JfQotCQotCS8qKgotCSAqIElmIHJldHVybnMgdHJ1ZSwgZWRpdGluZyBpcyBkaXNhYmxlZCBvciBub3QgYXZhaWxhYmxlIGZvciB0aGUgcHJvY2VzcyAKLQkgKiBicmVha2Rvd24gc3RydWN0dXJlLgotCSAqIAotCSAqLwotCXB1YmxpYyBib29sZWFuIGJhc2ljSXNSZWFkT25seSgpIHsKLQkJcmV0dXJuIGlzUmVhZE9ubHk7Ci0JfQotCi0JLyoqCi0JICogRW5hYmxlcy9kaXNhYmxlIG1vZGlmeWluZyBwcm9jZXNzIGJyZWFrZG93biBzdHJ1Y3R1cmUKLQkgKiAKLQkgKiBAcGFyYW0gaXNSZWFkT25seQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlYWRPbmx5KGJvb2xlYW4gaXNSZWFkT25seSkgewotCQl0aGlzLmlzUmVhZE9ubHkgPSBpc1JlYWRPbmx5OwotCX0KLQotCS8qKgotCSAqIFNldHMgYWRhcHRlciBmYWN0b3J5IHRvIGNyZWF0ZSBpdGVtIHByb3ZpZGVyIGZvciBlYWNoIGVsZW1lbnQgaW4gCi0JICogdGhlIGJyZWFrZG93biBzdHJ1Y3R1cmUKLQkgKgotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFkYXB0ZXJGYWN0b3J5KEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXRoaXMuYWRhcHRlckZhY3RvcnkgPSBhZGFwdGVyRmFjdG9yeTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIGNvbHVtbiBkZXNjcmlwdG9ycyB0byBkZWZpbmUgdGhlIGNvbHVtbnMgb2YgdGhlIHRyZWUuCi0JICogCi0JICogQHBhcmFtIGNvbHVtbkRlc2NyaXB0b3JzCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29sdW1uRGVzY3JpcHRvcnMoQ29sdW1uRGVzY3JpcHRvcltdIGNvbHVtbkRlc2NyaXB0b3JzKSB7Ci0JCXRoaXMuY29sdW1uRGVzY3JpcHRvcnMgPSBjb2x1bW5EZXNjcmlwdG9yczsKLQotCQlpZiAoYWRhcHRlckZhY3RvcnkgaW5zdGFuY2VvZiBJQ29sdW1uQXdhcmUpIHsKLQkJCU1hcDxJbnRlZ2VyLCBTdHJpbmc+IGNvbHVtbkluZGV4VG9OYW1lTWFwID0gbmV3IEhhc2hNYXA8SW50ZWdlciwgU3RyaW5nPigpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb2x1bW5EZXNjcmlwdG9ycy5sZW5ndGg7IGkrKykgewotCQkJCWNvbHVtbkluZGV4VG9OYW1lTWFwLnB1dChuZXcgSW50ZWdlcihpKSwKLQkJCQkJCWNvbHVtbkRlc2NyaXB0b3JzW2ldLmlkKTsKLQkJCX0KLQkJCSgoSUNvbHVtbkF3YXJlKSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJLnNldENvbHVtbkluZGV4VG9OYW1lTWFwKGNvbHVtbkluZGV4VG9OYW1lTWFwKTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzZXRUZXh0KEJyZWFrZG93bkVsZW1lbnQgZSwgU3RyaW5nIHByb3AsIFN0cmluZyB0eHQpIHsKLQkJSUFjdGlvbk1hbmFnZXIgYWN0aW9uTWdyID0gKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkKLQkJCQkuZ2V0QWN0aW9uTWFuYWdlcigpOwotCQlpZiAocHJvcCA9PSBJQlNJdGVtUHJvdmlkZXIuQ09MX1BSRURFQ0VTU09SUykgewotCQkJV29ya0JyZWFrZG93bkVsZW1lbnQgd2JlID0gKFdvcmtCcmVha2Rvd25FbGVtZW50KSBlOwotCQkJTGlzdDxXb3JrT3JkZXI+IGFkZExpc3QgPSBuZXcgQXJyYXlMaXN0PFdvcmtPcmRlcj4oKTsKLQkJCUxpc3Q8V29ya09yZGVyPiBwcmVkVG9CZURlbGV0ZWQgPSBuZXcgQXJyYXlMaXN0PFdvcmtPcmRlcj4oKTsKLQkJCWlmKFByZWRlY2Vzc29yTGlzdC5wcmVwYXJlVXBkYXRlUHJlZGVjZXNzb3JzKGFkYXB0ZXJGYWN0b3J5LCB3YmUsIHR4dCwgYWRkTGlzdCwgcHJlZFRvQmVEZWxldGVkKSkgewotCQkJCWlmKCFwcmVkVG9CZURlbGV0ZWQuaXNFbXB0eSgpKSB7Ci0JCQkJCWFjdGlvbk1nci5kb0FjdGlvbigKLQkJCQkJCQlJQWN0aW9uTWFuYWdlci5SRU1PVkVfTUFOWSwKLQkJCQkJCQl3YmUsCi0JCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V29ya0JyZWFrZG93bkVsZW1lbnRfTGlua1RvUHJlZGVjZXNzb3IoKSwKLQkJCQkJCQlwcmVkVG9CZURlbGV0ZWQsIC0xKTsKLQkJCQl9Ci0JCQkJaWYoIWFkZExpc3QuaXNFbXB0eSgpKSB7Ci0JCQkJCWFjdGlvbk1ncgotCQkJCQkuZG9BY3Rpb24oCi0JCQkJCQkJSUFjdGlvbk1hbmFnZXIuQUREX01BTlksCi0JCQkJCQkJd2JlLAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkuZ2V0V29ya0JyZWFrZG93bkVsZW1lbnRfTGlua1RvUHJlZGVjZXNzb3IoKSwKLQkJCQkJCQlhZGRMaXN0LCAtMSk7Ci0JCQkJfQotCQkJfQotCQkJCi0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCVByb2Nlc3NVdGlsLnNldEF0dHJpYnV0ZShhY3Rpb25NZ3IsIGUsIHByb3AsIHR4dCk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRUZXh0KEJyZWFrZG93bkVsZW1lbnQgZSwgU3RyaW5nIHByb3ApIHsKLQkJLy8gaGFuZGxlIGVkaXRpbmcgcHJlc2VudGF0aW9uIG5hbWUgb2YgZXh0ZW5kaW5nL2NvbnRyaWJ1dGluZyBhY3Rpdml0eQotCQkvLyBzcGVjaWFsbHkKLQkJLy8KLQkJaWYgKHByb3AgPT0gSUJTSXRlbVByb3ZpZGVyLkNPTF9QUkVTRU5UQVRJT05fTkFNRQotCQkJCSYmIFByb2Nlc3NVdGlsLmlzRXh0ZW5kaW5nT3JMb2NhbGx5Q29udHJpYnV0aW5nKGUpKSB7Ci0JCQlyZXR1cm4gKChEZXNjcmliYWJsZUVsZW1lbnQpIGUpLmdldFByZXNlbnRhdGlvbk5hbWUoKTsKLQkJfQotCi0JCUlCU0l0ZW1Qcm92aWRlciBhZGFwdGVyID0gKElCU0l0ZW1Qcm92aWRlcikgYWRhcHRlckZhY3RvcnkuYWRhcHQoZSwKLQkJCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQlyZXR1cm4gYWRhcHRlci5nZXRBdHRyaWJ1dGUoZSwgcHJvcCk7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRhYiBpbmRleCBmb3IgdGhlIGZvcm0gcGFnZQotCSAqIEBwYXJhbSBpZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRhYkluZGV4KGludCBpZCkgewotCQkgdGFiSW5kZXggPSBpZDsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRhYiBpbmRleCBmb3IgdGhlIGZvcm0gcGFnZQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0VGFiSW5kZXgoKSB7Ci0JCXJldHVybiB0YWJJbmRleDsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGFiIGZvbGRlcgotCSAqIEBwYXJhbSB0YWJGb2xkZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUYWJGb2xkZXIoQ1RhYkZvbGRlciB0YWJGb2xkZXIpIHsKLQkJLy8gdGhpcy50YWJGb2xkZXIgPSB0YWJGb2xkZXI7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuRm9ybVBhZ2UjY3JlYXRlRm9ybUNvbnRlbnQob3JnLmVjbGlwc2UudWkuZm9ybXMuSU1hbmFnZWRGb3JtKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUZvcm1Db250ZW50KElNYW5hZ2VkRm9ybSBtYW5hZ2VkRm9ybSkgewotCQkvLyBjcmVhdGUgZm9ybSB0b29sa2l0Ci0JCVNjcm9sbGVkRm9ybSBmb3JtID0gbWFuYWdlZEZvcm0uZ2V0Rm9ybSgpOwotCQlGb3JtVG9vbGtpdCB0b29sa2l0ID0gbWFuYWdlZEZvcm0uZ2V0VG9vbGtpdCgpOwotCQlmb3JtLnNldFRleHQoZ2V0RWRpdG9yKCkuZ2V0UGFydE5hbWUoKSk7Ci0KLQkJVGFibGVXcmFwTGF5b3V0IGxheW91dCA9IG5ldyBUYWJsZVdyYXBMYXlvdXQoKTsKLQkJZm9ybS5nZXRCb2R5KCkuc2V0TGF5b3V0KGxheW91dCk7Ci0KLQkJU2VjdGlvbiBzZWN0aW9uID0gdG9vbGtpdC5jcmVhdGVTZWN0aW9uKGZvcm0uZ2V0Qm9keSgpLAotCQkJCVNlY3Rpb24uRVhQQU5ERUQgfCBTZWN0aW9uLlRJVExFX0JBUik7Ci0JCVRhYmxlV3JhcERhdGEgdGQgPSBuZXcgVGFibGVXcmFwRGF0YShUYWJsZVdyYXBEYXRhLkZJTExfR1JBQiwKLQkJCQlUYWJsZVdyYXBEYXRhLkZJTExfR1JBQik7Ci0JCXNlY3Rpb24uc2V0TGF5b3V0RGF0YSh0ZCk7Ci0JCXNlY3Rpb24KLQkJCQkuc2V0VGV4dChnZXRUaXRsZSgpCi0JCQkJCQkrICIgIiArIEF1dGhvcmluZ1VJUmVzb3VyY2VzLnByb2Nlc3NCcmVha2Rvd25TdHJ1Y3R1cmVGb3JtUGFnZV9CU0VkaXRvcik7IC8vJE5PTi1OTFMtMSQgCi0JCXNlY3Rpb24uc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCi0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSB0b29sa2l0LmNyZWF0ZUNvbXBvc2l0ZShzZWN0aW9uKTsKLQkJLy8gY29tcG9zaXRlLnNldExheW91dChuZXcgR3JpZExheW91dCgxLCBmYWxzZSkpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlKSk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JCXNlY3Rpb24uc2V0Q2xpZW50KGNvbXBvc2l0ZSk7Ci0JCUNvbnRyb2wgY29udHJvbCA9IGNyZWF0ZUNvbnRyb2woY29tcG9zaXRlKTsKLQkJdG9vbGtpdC5hZGFwdChjb250cm9sLCB0cnVlLCB0cnVlKTsKLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlKTsKLQkJZ3JpZERhdGEudmVydGljYWxJbmRlbnQgPSAxMDsKLQkJZ3JpZERhdGEuaGVpZ2h0SGludCA9IDYwMDsKLQkJY29udHJvbC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotCQlQcm9jZXNzRWRpdG9yIGVkaXRvciA9IChQcm9jZXNzRWRpdG9yKSBnZXRFZGl0b3IoKTsKLQkJLy8gZWRpdG9yLmNyZWF0ZUNvbnRleHRNZW51Rm9yKHRhYmxlVHJlZVZpZXdlcik7Ci0JCWVkaXRvci5jcmVhdGVDb250ZXh0TWVudUZvcih2aWV3ZXIpOwotCi0JCXNldElucHV0KHByb2Nlc3MpOwotCX0KLQotCi0JLyoqCi0JICogQ3JlYXRlIGNvbnRyb2wKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogQHJldHVybgotCSAqIAkJCUNvbnRyb2wKLQkgKi8KLQlwdWJsaWMgQ29udHJvbCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJLy8gdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0JCS8vIFRoaXMgaXMgdGhlIHBhZ2UgZm9yIHRoZSB0YWJsZSB0cmVlIHZpZXdlci4KLQkJLy8KLQkJQ29tcG9zaXRlIGNvbXAgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQljb21wLnNldExheW91dChsYXlvdXQpOwotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5CRUdJTk5JTkcgfCBHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQljb21wLnNldExheW91dERhdGEoZ2QpOwotCQkKLQkJdmlld2VyID0gbmV3IFByb2Nlc3NWaWV3ZXIoY29tcCwgU1dULk1VTFRJIHwgU1dULkhfU0NST0xMCi0JCQkJfCBTV1QuVl9TQ1JPTEwgfCBTV1QuQk9SREVSIHwgU1dULkZVTExfU0VMRUNUSU9OKTsKLQkJdmlld2VyLnNldFVzZUhhc2hsb29rdXAodHJ1ZSk7Ci0JCXZpZXdlci5nZXRDb250cm9sKCkuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCXZpZXdlci5zZXR1cENvbHVtbnMoY29sdW1uRGVzY3JpcHRvcnMpOwotCQl2aWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBFeHBvc2VkQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoCi0JCQkJYWRhcHRlckZhY3RvcnkpKTsKLQkJdmlld2VyLnNldExhYmVsUHJvdmlkZXIobmV3IFByb2Nlc3NBZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIoYWRhcHRlckZhY3RvcnkpKTsKLQotCi0JCXZpZXdlci5zZXRBY3Rpb25NYW5hZ2VyKCgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpCi0JCQkuZ2V0QWN0aW9uTWFuYWdlcigpKTsKLQotCQl0ZXh0Q2VsbEVkaXRvciA9IG5ldyBUZXh0Q2VsbEVkaXRvcih2aWV3ZXIuZ2V0Q2VsbEVkaXRvclBhcmVudCgpKTsKLQkJY29tYm9Cb3hDZWxsRWRpdG9yID0gbmV3IENvbWJvQm94Q2VsbEVkaXRvcih2aWV3ZXIKLQkJCQkuZ2V0Q2VsbEVkaXRvclBhcmVudCgpLCBuZXcgU3RyaW5nW10geyBUWFRfVFJVRSwgVFhUX0ZBTFNFIH0pOwotCQljaGVja0JveENlbGxFZGl0b3IgPSBuZXcgQ2hlY2tib3hDZWxsRWRpdG9yKHZpZXdlcgotCQkJCS5nZXRDZWxsRWRpdG9yUGFyZW50KCkpOwotCi0JCS8vc2V0IGFsbCBlZGl0b3JzIGFuZCBtb2RpZmllcnMKLQkJc2V0QWxsRWRpdG9yc0FuZE1vZGlmaWVycygpOwotCQkKLQkJdmlld2VyLnNldEF1dG9FeHBhbmRMZXZlbCgzKTsKLQkJdmlld2VyLnNldElucHV0KHByb2Nlc3MpOwotCi0vLwkJIGludCBkbmRPcGVyYXRpb25zID0gRE5ELkRST1BfQ09QWSB8IERORC5EUk9QX01PVkUgOwotLy8JCSBUcmFuc2ZlcltdIHRyYW5zZmVycyA9IG5ldyBUcmFuc2ZlcltdIHsgVE5HT2JqVHJhbnNmZXIuZ2V0SW5zdGFuY2UoKQotLy8JCSB9OwotLy8JCSB0YWJsZVRyZWVWaWV3ZXIuYWRkRHJvcFN1cHBvcnQoRE5ELkRST1BfTU9WRSwgdHJhbnNmZXJzLCBuZXcKLS8vCQkgQlNUYWJEcm9wQWRhcHRlcih0YWJsZVRyZWVWaWV3ZXIpKTsKLQotCQkvLyBCU0VkaXRvclZpZXcuZ2V0VmlldygpLmNyZWF0ZUNvbnRleHRNZW51Rm9yKHRhYmxlVHJlZVZpZXdlcik7Ci0JCS8vIHJldHVybiB0YWJsZVRyZWVWaWV3ZXIuZ2V0Q29udHJvbCgpOwotCi0JCXNldENvbnRleHRIZWxwKHZpZXdlci5nZXRDb250cm9sKCkpOwotCi0JCXJldHVybiBjb21wOwotCi0JfQotCi0JCi0JLyoqCi0JICogU2V0IGFsbCBlZGl0b3JzIGFuZCBtb2RpZmllcnMgZm9yIHRoZSB2aWV3ZXIKLQkgKi8KLQlwcml2YXRlIHZvaWQgc2V0QWxsRWRpdG9yc0FuZE1vZGlmaWVycygpCi0JewotCQlzZXRDZWxsRWRpdG9ycygpOwotCQlzZXRDaGVja0JveENlbGxFZGl0b3JzKCk7Ci0KLQkJLy8gU2V0IHRoZSBjZWxsIG1vZGlmaWVyCi0JCXZpZXdlci5zZXRDZWxsTW9kaWZpZXIobmV3IElDZWxsTW9kaWZpZXIoKSB7Ci0JCQkvKioKLQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ2VsbE1vZGlmaWVyI2Nhbk1vZGlmeShqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuU3RyaW5nKQotCQkJICovCi0JCQlwdWJsaWMgYm9vbGVhbiBjYW5Nb2RpZnkoT2JqZWN0IGVsZW1lbnQsIFN0cmluZyBwcm9wZXJ0eSkgewotCQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiY2FuTW9kaWZ5OiBlbGVtZW50PSIrZWxlbWVudCsiLAotCQkJCS8vIHByb3BlcnR5PSIrcHJvcGVydHkpOwotCi0JCQkJaWYgKGlzUmVhZE9ubHkoKSB8fAotCQkJCQkJKGVsZW1lbnQgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlciAmJiAoKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSBlbGVtZW50KS5pc1JlYWRPbmx5KCkpKSB7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0KLS8vCQkJCWlmICghKGVsZW1lbnQgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50KQotLy8JCQkJCQkmJiAhKGVsZW1lbnQgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlciAmJiAhKChCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgZWxlbWVudCkKLS8vCQkJCQkJCQkuaXNSZWFkT25seSgpKSkgewotLy8JCQkJCUNvbGxlY3Rpb24gdHlwZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0vLwkJCQkJdHlwZXMuYWRkKFZhcmlhYmlsaXR5VHlwZS5FWFRFTkRTX0xJVEVSQUwpOwotLy8JCQkJCWlmIChUbmdVdGlsCi0vLwkJCQkJCQkuaXNHZW5lcmFsaXplcigKLS8vCQkJCQkJCQkJKFZhcmlhYmlsaXR5RWxlbWVudCkgKChCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgZWxlbWVudCkKLS8vCQkJCQkJCQkJCQkuZ2V0T3duZXIoKSwgdHlwZXMpKQotLy8JCQkJCQlyZXR1cm4gZmFsc2U7Ci0vLwkJCQl9Ci0JCQkJCi0JCQkJaWYgKHByb3BlcnR5ID09IElCU0l0ZW1Qcm92aWRlci5DT0xfSUQKLQkJCQkJCXx8IHByb3BlcnR5ID09IElCU0l0ZW1Qcm92aWRlci5DT0xfVFlQRQotCQkJCQkJfHwgcHJvcGVydHkgPT0gSUJTSXRlbVByb3ZpZGVyLkNPTF9NT0RFTF9JTkZPCi0JCQkJCQl8fCBwcm9wZXJ0eSA9PSBJQlNJdGVtUHJvdmlkZXIuQ09MX0RFTElWRVJBQkxFKSB7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0KLQkJCQllbGVtZW50ID0gVG5nVXRpbC51bndyYXAoZWxlbWVudCk7Ci0JCQkJaWYgKCEoZWxlbWVudCBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0RGVzY3JpcHRvcikKLQkJCQkJCSYmIChwcm9wZXJ0eSA9PSBJQlNJdGVtUHJvdmlkZXIuQ09MX0VOVFJZX1NUQVRFIHx8IHByb3BlcnR5ID09IElCU0l0ZW1Qcm92aWRlci5DT0xfRVhJVF9TVEFURSkpIHsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCQlpZiAoIShlbGVtZW50IGluc3RhbmNlb2YgV29ya0JyZWFrZG93bkVsZW1lbnQpCi0JCQkJCQkmJiAocHJvcGVydHkgPT0gSUJTSXRlbVByb3ZpZGVyLkNPTF9QUkVERUNFU1NPUlMpKSB7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0KLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQotCQkJLyoqCi0JCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNlbGxNb2RpZmllciNnZXRWYWx1ZShqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuU3RyaW5nKQotCQkJICovCi0JCQlwdWJsaWMgT2JqZWN0IGdldFZhbHVlKE9iamVjdCBlbGVtZW50LCBTdHJpbmcgcHJvcGVydHkpIHsKLQkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oImdldFZhbHVlOiBlbGVtZW50PSIrZWxlbWVudCsiLAotCQkJCS8vIHByb3BlcnR5PSIrcHJvcGVydHkpOwotCQkJCUJyZWFrZG93bkVsZW1lbnQgZSA9IChCcmVha2Rvd25FbGVtZW50KSBUbmdVdGlsLnVud3JhcChlbGVtZW50KTsKLQkJCQlTdHJpbmcgdmFsID0gZ2V0VGV4dChlLCBwcm9wZXJ0eSk7Ci0JCQkJc3dpdGNoIChnZXRDZWxsRWRpdG9yVHlwZShwcm9wZXJ0eSkpIHsKLQkJCQljYXNlIENvbHVtbkRlc2NyaXB0b3IuQ0VMTF9FRElUT1JfVFlQRV9DT01CT19CT09MRUFOOgotCQkJCQlpZiAoVFhUX1RSVUUuZXF1YWxzSWdub3JlQ2FzZSh2YWwpKSB7Ci0JCQkJCQlyZXR1cm4gbmV3IEludGVnZXIoMCk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlyZXR1cm4gbmV3IEludGVnZXIoMSk7Ci0JCQkJCX0KLQkJCQljYXNlIENvbHVtbkRlc2NyaXB0b3IuQ0VMTF9FRElUT1JfVFlQRV9URVhUOgotCQkJCQlyZXR1cm4gdmFsOwotCQkJCWNhc2UgQ29sdW1uRGVzY3JpcHRvci5DRUxMX0VESVRPUl9UWVBFX0NIRUNLX0JPT0xFQU46Ci0JCQkJCXJldHVybiBCb29sZWFuLnZhbHVlT2YodmFsKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gdmFsOwotCQkJCX0KLQkJCX0KLQotCQkJLyoqCi0JCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNlbGxNb2RpZmllciNtb2RpZnkoamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLk9iamVjdCkKLQkJCSAqLwotCQkJcHVibGljIHZvaWQgbW9kaWZ5KGZpbmFsIE9iamVjdCBlbGVtZW50LCBTdHJpbmcgcHJvcGVydHksCi0JCQkJCU9iamVjdCB2YWx1ZSkgewotCQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigibW9kaWZ5OiBlbGVtZW50PSIrZWxlbWVudCsiLAotCQkJCS8vIHByb3BlcnR5PSIrcHJvcGVydHkrIiwgdmFsdWU9Iit2YWx1ZSk7Ci0JCQkJV2lkZ2V0IGl0ZW0gPSAoV2lkZ2V0KSBlbGVtZW50OwotCQkJCUJyZWFrZG93bkVsZW1lbnQgYmUgPSAoQnJlYWtkb3duRWxlbWVudCkgVG5nVXRpbC51bndyYXAoaXRlbQotCQkJCQkJLmdldERhdGEoKSk7Ci0KLQkJCQlmaW5hbCBpbnQgY29sdW1uSW5kZXggPSBnZXRDb2x1bW5JbmRleChwcm9wZXJ0eSk7Ci0JCQkJQ2VsbEVkaXRvciBjZWxsRWRpdG9yID0gdmlld2VyLmdldENlbGxFZGl0b3JzKClbY29sdW1uSW5kZXhdOwotCQkJCVN0cmluZyBlcnJNc2cgPSBjZWxsRWRpdG9yLmdldEVycm9yTWVzc2FnZSgpOwotCQkJCWlmIChlcnJNc2cgIT0gbnVsbCkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCi0JCQkJU3RyaW5nIHR4dDsKLQkJCQlzd2l0Y2ggKGdldENlbGxFZGl0b3JUeXBlKHByb3BlcnR5KSkgewotCQkJCWNhc2UgQ29sdW1uRGVzY3JpcHRvci5DRUxMX0VESVRPUl9UWVBFX1RFWFQ6Ci0JCQkJCXR4dCA9IChTdHJpbmcpIHZhbHVlOwotCQkJCQlicmVhazsKLQkJCQljYXNlIENvbHVtbkRlc2NyaXB0b3IuQ0VMTF9FRElUT1JfVFlQRV9DT01CT19CT09MRUFOOgotCQkJCQlpbnQgaW5kZXggPSAoKE51bWJlcikgdmFsdWUpLmludFZhbHVlKCk7Ci0JCQkJCWlmIChpbmRleCA9PSAwKSB7Ci0JCQkJCQl0eHQgPSBUWFRfVFJVRTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCXR4dCA9IFRYVF9GQUxTRTsKLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQljYXNlIENvbHVtbkRlc2NyaXB0b3IuQ0VMTF9FRElUT1JfVFlQRV9DSEVDS19CT09MRUFOOgotCQkJCQl0eHQgPSB2YWx1ZS50b1N0cmluZygpOwotCQkJCQlicmVhazsKLQkJCQlkZWZhdWx0OgotCQkJCQl0eHQgPSBUbmdVdGlsLmNoZWNrTnVsbCh2YWx1ZS50b1N0cmluZygpKTsKLQkJCQl9Ci0JCQkJc2V0VGV4dChiZSwgcHJvcGVydHksIHR4dCk7Ci0JCQkJaWYgKHByb3BlcnR5ID09IElCU0l0ZW1Qcm92aWRlci5DT0xfUFJFU0VOVEFUSU9OX05BTUUKLQkJCQkJCSYmIFN0clV0aWwuaXNCbGFuayhiZS5nZXROYW1lKCkpKSB7Ci0JCQkJCWJlLnNldE5hbWUodHh0KTsKLQkJCQl9Ci0JCQkJCi0JCQkJdmlld2VyLnJlZnJlc2goKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCQotCS8qKgotCSAqIEdldCBjZWxsIGVkaXRvciBmb3IgdGhlIGdpdmVuIGNvbHVtbgotCSAqIEBwYXJhbSBjb2x1bW5JRAotCSAqIEBwYXJhbSBjb2x1bW5JbmRleAotCSAqIEByZXR1cm4KLQkgKiAJCQlDZWxsIEVkaXRvcgotCSAqLwotCXB1YmxpYyBDZWxsRWRpdG9yIGdldENlbGxFZGl0b3IoU3RyaW5nIGNvbHVtbklELCBpbnQgY29sdW1uSW5kZXgpIHsKLQkJaWYgKGNvbHVtbklEID09IElCU0l0ZW1Qcm92aWRlci5DT0xfUFJFU0VOVEFUSU9OX05BTUUpIHsKLQkJCWlmIChwcmVzZW50YXRpb25OYW1lQ2VsbEVkaXRvciA9PSBudWxsKSB7Ci0JCQkJcHJlc2VudGF0aW9uTmFtZUNlbGxFZGl0b3IgPSBuZXcgVmFsaWRhdGluZ1RleHRDZWxsRWRpdG9yKAotCQkJCQkJdmlld2VyLmdldENlbGxFZGl0b3JQYXJlbnQoKSkgewotCQkJCQlwcm90ZWN0ZWQgU3RyaW5nIGlzVmFsaWQoT2JqZWN0IGUsIFN0cmluZyB0eHQpIHsKLQkJCQkJCWUgPSBUbmdVdGlsLnVud3JhcChlKTsKLQkJCQkJCVN1cHByZXNzaW9uIHN1cHByZXNzaW9uID0gKChQcm9jZXNzRWRpdG9yKWdldEVkaXRvcigpKS5nZXRTdXBwcmVzc2lvbigpOwotCQkJCQkJYm9vbGVhbiBpZ25vcmVTdXBwcmVzc2VkID0gdHJ1ZTsKLQkJCQkJCXJldHVybiBQcm9jZXNzVXRpbAotCQkJCQkJCQkuY2hlY2tCcmVha2Rvd25FbGVtZW50UHJlc2VudGF0aW9uTmFtZSgKLQkJCQkJCQkJCQlhZGFwdGVyRmFjdG9yeSwgKEJyZWFrZG93bkVsZW1lbnQpIGUsCi0JCQkJCQkJCQkJdHh0LCBzdXBwcmVzc2lvbiwgaWdub3JlU3VwcHJlc3NlZCk7Ci0JCQkJCX0KLQkJCQl9OwotCi0JCQkJcHJlc2VudGF0aW9uTmFtZUNlbGxFZGl0b3IKLQkJCQkJCS5zZXRWYWxpZGF0b3IobmV3IENlbGxFZGl0b3JWYWxpZGF0b3IoCi0JCQkJCQkJCXByZXNlbnRhdGlvbk5hbWVDZWxsRWRpdG9yKSk7Ci0JCQkJLy8gcHJlc2VudGF0aW9uTmFtZUNlbGxFZGl0b3IuZ2V0Q29udHJvbCgpLmFkZEZvY3VzTGlzdGVuZXIobmV3Ci0JCQkJLy8gVmFsaWRhdGluZ0ZvY3VzQWRhcHRlcihwcmVzZW50YXRpb25OYW1lQ2VsbEVkaXRvcikpOwotCQkJCXByZXNlbnRhdGlvbk5hbWVDZWxsRWRpdG9yLmdldENvbnRyb2woKS5hZGRMaXN0ZW5lcigKLQkJCQkJCVNXVC5EZWFjdGl2YXRlLAotCQkJCQkJbmV3IFZhbGlkYXRpbmdEZWFjdGl2YXRlTGlzdGVuZXIoCi0JCQkJCQkJCXByZXNlbnRhdGlvbk5hbWVDZWxsRWRpdG9yKSk7Ci0JCQl9Ci0JCQlwcmVzZW50YXRpb25OYW1lQ2VsbEVkaXRvci5zZXRDb2x1bW5JbmRleChjb2x1bW5JbmRleCk7Ci0KLQkJCXJldHVybiBwcmVzZW50YXRpb25OYW1lQ2VsbEVkaXRvcjsKLQkJfSBlbHNlIGlmIChjb2x1bW5JRCA9PSBJQlNJdGVtUHJvdmlkZXIuQ09MX05BTUUpIHsKLQkJCWlmIChuYW1lQ2VsbEVkaXRvciA9PSBudWxsKSB7Ci0JCQkJbmFtZUNlbGxFZGl0b3IgPSBuZXcgVmFsaWRhdGluZ1RleHRDZWxsRWRpdG9yKHZpZXdlcgotCQkJCQkJLmdldENlbGxFZGl0b3JQYXJlbnQoKSkgewotCQkJCQlwcm90ZWN0ZWQgU3RyaW5nIGlzVmFsaWQoT2JqZWN0IGUsIFN0cmluZyB0eHQpIHsKLQkJCQkJCWUgPSBUbmdVdGlsLnVud3JhcChlKTsKLQkJCQkJCVN1cHByZXNzaW9uIHN1cHByZXNzaW9uID0gKChQcm9jZXNzRWRpdG9yKWdldEVkaXRvcigpKS5nZXRTdXBwcmVzc2lvbigpOwotCQkJCQkJcmV0dXJuIFRuZ1V0aWwKLQkJCQkJCQkJLmNoZWNrQWN0aXZpdHlOYW1lKGFkYXB0ZXJGYWN0b3J5LCBlLCB0eHQsIHN1cHByZXNzaW9uKTsKLQkJCQkJfQotCQkJCX07Ci0JCQkJbmFtZUNlbGxFZGl0b3Iuc2V0VmFsaWRhdG9yKG5ldyBDZWxsRWRpdG9yVmFsaWRhdG9yKAotCQkJCQkJbmFtZUNlbGxFZGl0b3IpKTsKLQkJCQkvLyBuYW1lQ2VsbEVkaXRvci5nZXRDb250cm9sKCkuYWRkRm9jdXNMaXN0ZW5lcihuZXcKLQkJCQkvLyBWYWxpZGF0aW5nRm9jdXNBZGFwdGVyKG5hbWVDZWxsRWRpdG9yKSk7Ci0JCQkJbmFtZUNlbGxFZGl0b3IuZ2V0Q29udHJvbCgpLmFkZExpc3RlbmVyKFNXVC5EZWFjdGl2YXRlLAotCQkJCQkJbmV3IFZhbGlkYXRpbmdEZWFjdGl2YXRlTGlzdGVuZXIobmFtZUNlbGxFZGl0b3IpKTsKLQkJCX0KLQkJCW5hbWVDZWxsRWRpdG9yLnNldENvbHVtbkluZGV4KGNvbHVtbkluZGV4KTsKLQotCQkJcmV0dXJuIG5hbWVDZWxsRWRpdG9yOwotCQl9IGVsc2UgaWYgKGNvbHVtbklEID09IElCU0l0ZW1Qcm92aWRlci5DT0xfUFJFREVDRVNTT1JTKSB7Ci0JCQlpZiAocHJlZExpc3RDZWxsRWRpdG9yID09IG51bGwpIHsKLQkJCQlwcmVkTGlzdENlbGxFZGl0b3IgPSBuZXcgVmFsaWRhdGluZ1RleHRDZWxsRWRpdG9yKHZpZXdlcgotCQkJCQkJLmdldENlbGxFZGl0b3JQYXJlbnQoKSkgewotCQkJCQlwcm90ZWN0ZWQgU3RyaW5nIGlzVmFsaWQoT2JqZWN0IGUsIFN0cmluZyB0eHQpIHsKLQkJCQkJCWUgPSBUbmdVdGlsLnVud3JhcChlKTsKLQkJCQkJCXJldHVybiBQcm9jZXNzVXRpbC5jaGVja1ByZWRlY2Vzc29yTGlzdCgKLQkJCQkJCQkJKFdvcmtCcmVha2Rvd25FbGVtZW50KSBlLCB0eHQsIGFkYXB0ZXJGYWN0b3J5LAotCQkJCQkJCQlwcm9jZXNzLCBudWxsKTsKLQkJCQkJfQotCQkJCX07Ci0JCQkJcHJlZExpc3RDZWxsRWRpdG9yLnNldFZhbGlkYXRvcihuZXcgQ2VsbEVkaXRvclZhbGlkYXRvcigKLQkJCQkJCXByZWRMaXN0Q2VsbEVkaXRvcikpOwotCQkJCS8vIHByZWRMaXN0Q2VsbEVkaXRvci5nZXRDb250cm9sKCkuYWRkRm9jdXNMaXN0ZW5lcihuZXcKLQkJCQkvLyBWYWxpZGF0aW5nRm9jdXNBZGFwdGVyKHByZWRMaXN0Q2VsbEVkaXRvcikpOwotCQkJCXByZWRMaXN0Q2VsbEVkaXRvci5nZXRDb250cm9sKCkuYWRkTGlzdGVuZXIoU1dULkRlYWN0aXZhdGUsCi0JCQkJCQluZXcgVmFsaWRhdGluZ0RlYWN0aXZhdGVMaXN0ZW5lcihwcmVkTGlzdENlbGxFZGl0b3IpKTsKLQkJCX0KLQkJCXByZWRMaXN0Q2VsbEVkaXRvci5zZXRDb2x1bW5JbmRleChjb2x1bW5JbmRleCk7Ci0KLQkJCXJldHVybiBwcmVkTGlzdENlbGxFZGl0b3I7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogU2V0IGNlbGwgZWRpdG9ycyBmb3IgYWxsIGNvbHVtbnMgCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q2VsbEVkaXRvcnMoKSB7Ci0JCUNlbGxFZGl0b3JbXSBjZWxsRWRpdG9ycyA9IG5ldyBDZWxsRWRpdG9yW2NvbHVtbkRlc2NyaXB0b3JzLmxlbmd0aF07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY29sdW1uRGVzY3JpcHRvcnMubGVuZ3RoOyBpKyspIHsKLQkJCUNlbGxFZGl0b3IgY2VsbEVkaXRvciA9IGdldENlbGxFZGl0b3IoY29sdW1uRGVzY3JpcHRvcnNbaV0uaWQsIGkpOwotCQkJaWYgKGNlbGxFZGl0b3IgIT0gbnVsbCkgewotCQkJCWNlbGxFZGl0b3JzW2ldID0gY2VsbEVkaXRvcjsKLQkJCX0gZWxzZSB7Ci0JCQkJc3dpdGNoIChjb2x1bW5EZXNjcmlwdG9yc1tpXS5jZWxsRWRpdG9yVHlwZSkgewotCQkJCWNhc2UgQ29sdW1uRGVzY3JpcHRvci5DRUxMX0VESVRPUl9UWVBFX0NPTUJPX0JPT0xFQU46Ci0JCQkJCWNlbGxFZGl0b3JzW2ldID0gY29tYm9Cb3hDZWxsRWRpdG9yOwotCQkJCQlicmVhazsKLQkJCQljYXNlIENvbHVtbkRlc2NyaXB0b3IuQ0VMTF9FRElUT1JfVFlQRV9URVhUOgotCQkJCQljZWxsRWRpdG9yc1tpXSA9IHRleHRDZWxsRWRpdG9yOwotCQkJCQlicmVhazsKLQkJCQljYXNlIENvbHVtbkRlc2NyaXB0b3IuQ0VMTF9FRElUT1JfVFlQRV9DSEVDS19CT09MRUFOOgotCQkJCQljZWxsRWRpdG9yc1tpXSA9IGNoZWNrQm94Q2VsbEVkaXRvcjsKLQkJCQkJYnJlYWs7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJY2VsbEVkaXRvcnNbaV0gPSBudWxsOwotCQkJCX0KLQkJCX0KLQkJfQotCQl2aWV3ZXIuc2V0Q2VsbEVkaXRvcnMoY2VsbEVkaXRvcnMpOwotCX0KLQkKLQkKLQkKLQotCS8qKgotCSAqIFNldCBpbnB1dCBmb3Igdmlld2VyCi0JICogQHBhcmFtIG5ld0lucHV0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0SW5wdXQoT2JqZWN0IG5ld0lucHV0KSB7Ci0JCWlmIChuZXdJbnB1dCBpbnN0YW5jZW9mIFByb2Nlc3MpIHsKLQkJCXByb2Nlc3MgPSAoUHJvY2VzcykgbmV3SW5wdXQ7Ci0JCQlpZiAocHJvY2Vzcy5lQ29udGFpbmVyKCkgaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50KSB7Ci0JCQkJdmlld2VyLnNldElucHV0KHByb2Nlc3MuZUNvbnRhaW5lcigpKTsKLQkJCQkvLyB2aWV3ZXIuZXhwYW5kQWxsKCk7Ci0vLwkJCQl2aWV3ZXIucmV2ZWFsKHByb2Nlc3MpOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQl2aWV3ZXIuc2V0SW5wdXQobnVsbCk7Ci0JfQotCi0JcHJvdGVjdGVkIGludCBnZXRDb2x1bW5JbmRleChTdHJpbmcgcHJvcGVydHkpIHsKLQkJT2JqZWN0W10gY29sUHJvcHMgPSB2aWV3ZXIuZ2V0Q29sdW1uUHJvcGVydGllcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbFByb3BzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoY29sUHJvcHNbaV0gPT0gcHJvcGVydHkpCi0JCQkJcmV0dXJuIGk7Ci0JCX0KLQkJcmV0dXJuIC0xOwotCX0KLQotCXByb3RlY3RlZCBpbnQgZ2V0Q2VsbEVkaXRvclR5cGUoU3RyaW5nIHByb3BlcnR5KSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY29sdW1uRGVzY3JpcHRvcnMubGVuZ3RoOyBpKyspIHsKLQkJCUNvbHVtbkRlc2NyaXB0b3IgZGVzYyA9IGNvbHVtbkRlc2NyaXB0b3JzW2ldOwotCQkJaWYgKGRlc2MuaWQgPT0gcHJvcGVydHkpIHsKLQkJCQlyZXR1cm4gZGVzYy5jZWxsRWRpdG9yVHlwZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gQ29sdW1uRGVzY3JpcHRvci5DRUxMX0VESVRPUl9UWVBFX05PTkU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHZpZXdlcgotCSAqLwotCXB1YmxpYyBWaWV3ZXIgZ2V0Vmlld2VyKCkgewotCQlyZXR1cm4gdmlld2VyOwotCX0KLQotCS8qKgotCSAqIFNldCBwcm9jZXNzIGFzIGlucHV0Ci0JICogQHBhcmFtIHByb2MKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQcm9jZXNzKFByb2Nlc3MgcHJvYykgewotCQlpZiAocHJvY2VzcyAhPSBwcm9jKSB7Ci0JCQlzZXRJbnB1dChwcm9jKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGFkYXB0ZXJGYWN0b3J5LgotCSAqLwotCXB1YmxpYyBBZGFwdGVyRmFjdG9yeSBnZXRBZGFwdGVyRmFjdG9yeSgpIHsKLQkJcmV0dXJuIGFkYXB0ZXJGYWN0b3J5OwotCX0KLQotCS8qKgotCSAqIFVwZGF0ZSBjb2x1bW5zIHdpdGggbmV3IGNvbHVtbiBkZXNjcmlwdG9ycwotCSAqIEBwYXJhbSBuZXdDb2x1bW5EZXNjcmlwdG9ycwotCSAqLwotCXB1YmxpYyB2b2lkIHVwZGF0ZUNvbHVtbnMoQ29sdW1uRGVzY3JpcHRvcltdIG5ld0NvbHVtbkRlc2NyaXB0b3JzKSB7Ci0JCXNldENvbHVtbkRlc2NyaXB0b3JzKG5ld0NvbHVtbkRlc2NyaXB0b3JzKTsKLQkJdmlld2VyLnNldHVwQ29sdW1ucyhuZXdDb2x1bW5EZXNjcmlwdG9ycyk7CQotCQlzZXRBbGxFZGl0b3JzQW5kTW9kaWZpZXJzKCk7Ci0JCXZpZXdlci5yZWZyZXNoKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuRm9ybVBhZ2UjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJLy8gaWYoYWRhcHRlckZhY3RvcnkgaW5zdGFuY2VvZiBDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSB7Ci0JCS8vICgoQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSlhZGFwdGVyRmFjdG9yeSkuZGlzcG9zZSgpOwotCQkvLyB9Ci0KLQkJaWYgKHZpZXdlci5nZXRDb250ZW50UHJvdmlkZXIoKSAhPSBudWxsKSB7Ci0JCQl2aWV3ZXIuZ2V0Q29udGVudFByb3ZpZGVyKCkuZGlzcG9zZSgpOwotCQl9Ci0KLQkJaWYgKHZpZXdlci5nZXRMYWJlbFByb3ZpZGVyKCkgIT0gbnVsbCkgewotCQkJdmlld2VyLmdldExhYmVsUHJvdmlkZXIoKS5kaXNwb3NlKCk7Ci0JCX0KLQotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0Q29udGV4dEhlbHAoQ29udHJvbCBjb250cm9sKSB7Ci0JCUFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWMgPSBnZXRBZGFwdGVyRmFjdG9yeSgpOwotCQlBZGFwdGVyRmFjdG9yeSBhbGxGYWMgPSBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCS5nZXRQcm9jZXNzQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpOwotCQlBZGFwdGVyRmFjdG9yeSB3YnNGYWMgPSBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCS5nZXRXQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpOwotCQlBZGFwdGVyRmFjdG9yeSBvYnNGYWMgPSBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCS5nZXRPQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpOwotCQlBZGFwdGVyRmFjdG9yeSBwYnNGYWMgPSBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCS5nZXRQQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpOwotCi0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiJCQkIERFQlVHOiBjdXJyZW50IGRhZHB0ZXIgZmFjID0gIiArIGFkYXB0ZXJGYWMpOwotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIiQkJCBERUJVRzogYWxsIGRhZHB0ZXIgZmFjID0gIiArIGFsbEZhYyk7Ci0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiJCQkIERFQlVHOiB3YnMgZGFkcHRlciBmYWMgPSAiICsgd2JzRmFjKTsKLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCIkJCQgREVCVUc6IG9icyBkYWRwdGVyIGZhYyA9ICIgKyBvYnNGYWMpOwotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIiQkJCBERUJVRzogcGJzIGRhZHB0ZXIgZmFjID0gIiArIHBic0ZhYyk7Ci0KLQkJaWYgKGFkYXB0ZXJGYWMgPT0gd2JzRmFjKQotCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChjb250cm9sLAotCQkJCQlBdXRob3JpbmdVSUhlbHBDb250ZXh0cy5GT1JNX0VESVRPUl9QUk9DRVNTX1dCU19DT05URVhUKTsKLQkJZWxzZSBpZiAoYWRhcHRlckZhYyA9PSBvYnNGYWMpCi0JCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGNvbnRyb2wsCi0JCQkJCUF1dGhvcmluZ1VJSGVscENvbnRleHRzLkZPUk1fRURJVE9SX1BST0NFU1NfT0JTX0NPTlRFWFQpOwotCQllbHNlIGlmIChhZGFwdGVyRmFjID09IHBic0ZhYykKLQkJCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoY29udHJvbCwKLQkJCQkJQXV0aG9yaW5nVUlIZWxwQ29udGV4dHMuRk9STV9FRElUT1JfUFJPQ0VTU19QQlNfQ09OVEVYVCk7Ci0JCWVsc2UgaWYgKGFkYXB0ZXJGYWMgPT0gYWxsRmFjKQotCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChjb250cm9sLAotCQkJCQlBdXRob3JpbmdVSUhlbHBDb250ZXh0cy5GT1JNX0VESVRPUl9QUk9DRVNTX0FMTEJTX0NPTlRFWFQpOwotCX0KLQkKLQkvKioKLQkgKiBHZXRzIGFkZGl0aW9uYWwgYWN0aW9ucyB0byBjb250cmlidXRlIHRvIHRoZSBjb250ZXh0IG1lbnUuCi0JICogCi0JICogQHJldHVybgotCSAqIAkJCUFjdGlvbnMKLQkgKi8KLQlwdWJsaWMgSUFjdGlvbltdIGdldEFkZGl0aW9uYWxBY3Rpb25zKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogU2V0IGNoZWNrIGJveCBjZWxsIGVkaXRvcnMKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDaGVja0JveENlbGxFZGl0b3JzKCkgewotCQlBYnN0cmFjdENoZWNrQm94Q2VsbEVkaXRvcltdIGNlbGxFZGl0b3JzID0gbmV3IEFic3RyYWN0Q2hlY2tCb3hDZWxsRWRpdG9yW2NvbHVtbkRlc2NyaXB0b3JzLmxlbmd0aF07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY29sdW1uRGVzY3JpcHRvcnMubGVuZ3RoOyBpKyspIHsKLQkJCXN3aXRjaCAoY29sdW1uRGVzY3JpcHRvcnNbaV0uY2VsbEVkaXRvclR5cGUpIHsKLQkJCQljYXNlIENvbHVtbkRlc2NyaXB0b3IuQ0VMTF9FRElUT1JfVFlQRV9DSEVDS19CT09MRUFOOgotCQkJCQljZWxsRWRpdG9yc1tpXSA9IG5ldyBQcm9jZXNzQ2hlY2tCb3hDZWxsRWRpdG9yKHZpZXdlcgotCQkJCQkJCS5nZXRDZWxsRWRpdG9yUGFyZW50KCkpOwotCQkJCQlicmVhazsKLQkJCQlkZWZhdWx0OgotCQkJCQljZWxsRWRpdG9yc1tpXSA9IG51bGw7Ci0JCQl9Ci0JCX0KLQkJKChQcm9jZXNzVmlld2VyKSB2aWV3ZXIpLnNldENoZWNrQm94Q2VsbEVkaXRvcnMoY2VsbEVkaXRvcnMpOwotCX0KLQkKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL1Byb2Nlc3NEZXNjcmlwdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9Qcm9jZXNzRGVzY3JpcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzI0ZjFhZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL1Byb2Nlc3NEZXNjcmlwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMzNSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zOwotCi1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLk1ldGhvZEVsZW1lbnRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcmVmZXJlbmNlcy5BdXRob3JpbmdVSVByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucmljaHRleHQuSU1ldGhvZFJpY2hUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudXRpbC5FZGl0b3JzQ29udGV4dEhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnV0aWwuVUlIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5zZXJ2aWNlcy5EaWFncmFtTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklBY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQubmF2aWdhdG9yLkNvbmZpZ3VyYXRpb25zSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbi5JVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbi5JVmFsaWRhdG9yRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5MaWJyYXJ5VUlUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy5JTGlicmFyeVBlcnNpc3RlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5VbWFVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MaXN0Vmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQnVzeUluZGljYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkNvbnRyb2xFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkNvbnRyb2xMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkZvY3VzQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkZvY3VzRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5MaXN0U2VsZWN0aW9uRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLmVkaXRvci5Gb3JtRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuRm9ybVRvb2xraXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5TZWN0aW9uOwotCi0KLS8qKgotICogVGhlIERlc2NyaXB0aW9uIHBhZ2UgZm9yIHRoZSBwcm9jZXNzIGRlc2NyaXB0aW9uLgotICogCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICogCi0gKiBUT0RPOiBSZW5hbWUgdGhpcyBjbGFzcyB0byBQcm9jZXNzRGVzY3JpcHRpb25QYWdlCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9jZXNzRGVzY3JpcHRpb24gZXh0ZW5kcyBQcm9jZXNzRm9ybVBhZ2UgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZPUk1fUEFHRV9JRCA9ICJwcm9jZXNzRGVzY3JpcHRpb25QYWdlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfVkVSVElDQUxfSU5ERU5UID0gMjsKLQotCXByaXZhdGUgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIgY29udGVudFByb3ZpZGVyID0gbmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKAotCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJLmdldE5hdmlnYXRvclZpZXdfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKSB7Ci0JfTsKLQotCXByaXZhdGUgSUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlciA9IG5ldyBBZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIoCi0JCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpOwotCi0JcHJpdmF0ZSBJTWV0aG9kUmljaFRleHQgY3RybF9zY29wZSwgY3RybF91c2FnZV9ub3RlczsKLQotCXByaXZhdGUgSU1ldGhvZFJpY2hUZXh0IGN0cmxfYWx0ZXJuYXRpdmVzLCBjdHJsX2hvd190b19zdGFmZiwKLQkJCWN0cmxfa2V5X2NvbnNpZGVyYXRpb247Ci0KLQlwcml2YXRlIFNlY3Rpb24gY29uZmlnU2VjdGlvbjsKLQotCXByb3RlY3RlZCBDb21wb3NpdGUgY29uZmlnQ29tcG9zaXRlOwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gY29uZmlnU2VjdGlvbkV4cGFuZEZsYWcgPSBmYWxzZTsKLQotCXByaXZhdGUgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdCBsaXN0X2NvbmZpZ3VyYXRpb25zOwotCi0JcHJpdmF0ZSBMaXN0Vmlld2VyIGNvbmZpZ0xpc3RWaWV3ZXI7Ci0KLQlwcm90ZWN0ZWQgQnV0dG9uIGJ1dHRvbkFkZDsKLQotCXByb3RlY3RlZCBCdXR0b24gYnV0dG9uUmVtb3ZlOwotCi0JLy8gcHJpdmF0ZSBCdXR0b24gYnV0dG9uRWRpdDsKLQlwcm90ZWN0ZWQgQnV0dG9uIGJ1dHRvbk1ha2VEZWZhdWx0OwotCi0JcHJpdmF0ZSBUZXh0IHRleHRDb25maWdEZXNjcmlwdGlvbjsKLQotCXByaXZhdGUgSXRlbVByb3ZpZGVyQWRhcHRlciBjb25maWdMaXN0QWRhcHRlcjsKLQotCXByb3RlY3RlZCBNb2RpZnlMaXN0ZW5lciBtb2RpZnlMaXN0ZW5lcjsKLQotCXByb3RlY3RlZCBNb2RpZnlMaXN0ZW5lciBjb250ZW50TW9kaWZ5TGlzdGVuZXI7Ci0KLS8vCXByaXZhdGUgQWRhcHRlciBwcm9jZXNzTGlzdGVuZXI7Ci0KLQlwcml2YXRlIFN0cmluZyBwcm9jZXNzVHlwZTsKLQotCXByaXZhdGUgTWV0aG9kRWxlbWVudEVkaXRvciBlZGl0b3I7Ci0KLQlwcml2YXRlIE1vZGlmeUxpc3RlbmVyIG5hbWVNb2RpZnlMaXN0ZW5lcjsKLQotCXByaXZhdGUgYm9vbGVhbiBkaXNwb3NlZDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFByb2Nlc3NEZXNjcmlwdGlvbihGb3JtRWRpdG9yIGVkaXRvcikgewotCQlzdXBlcihlZGl0b3IsIEZPUk1fUEFHRV9JRCwgQXV0aG9yaW5nVUlSZXNvdXJjZXMuZGVzY3JpcHRpb25QYWdlX3RpdGxlKTsgCi0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGluaXQoSUVkaXRvclNpdGUgc2l0ZSwgSUVkaXRvcklucHV0IGlucHV0KSB7Ci0JCXN1cGVyLmluaXQoc2l0ZSwgaW5wdXQpOwotCQlwcm9jZXNzVHlwZSA9IExpYnJhcnlVSVRleHQuZ2V0VUlUZXh0TG93ZXIocHJvY2Vzcyk7Ci0JCXZlcnNpb25TZWN0aW9uT24gPSBmYWxzZTsKLQkJdmFyaWFiaWxpdHlTZWN0aW9uT24gPSBmYWxzZTsKLQkJZXh0ZXJuYWxJZE9uID0gdHJ1ZTsKLQkJcHVycG9zZU9uID0gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBlZGl0b3IgdGFiIGNvbnRlbnQKLQkgKiAKLQkgKiBAcGFyYW0gdG9vbGtpdAotCSAqICAgICAgICAgICAgVGhlIGZvcm0gdG9vbGtpdC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVFZGl0b3JDb250ZW50KEZvcm1Ub29sa2l0IHRvb2xraXQpIHsKLQkJc3VwZXIuY3JlYXRlRWRpdG9yQ29udGVudCh0b29sa2l0KTsKLQkJY3JlYXRlQ29uZmlndXJhdGlvblNlY3Rpb24odG9vbGtpdCk7Ci0JCS8vIFNldCBmb2N1cyBvbiB0aGUgTmFtZSB0ZXh0IGNvbnRyb2wuCi0JCURpc3BsYXkgZGlzcGxheSA9IGZvcm0uZ2V0Qm9keSgpLmdldERpc3BsYXkoKTsKLQkJaWYgKCEoZGlzcGxheSA9PSBudWxsIHx8IGRpc3BsYXkuaXNEaXNwb3NlZCgpKSkgewotCQkJZGlzcGxheS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJaWYoY3RybF9uYW1lLmlzRGlzcG9zZWQoKSkgcmV0dXJuOwotCQkJCQljdHJsX25hbWUuc2V0Rm9jdXMoKTsKLQkJCQkJY3RybF9uYW1lLnNldFNlbGVjdGlvbigwLCBjdHJsX25hbWUuZ2V0VGV4dCgpLmxlbmd0aCgpKTsKLQkJCQl9Ci0JCQl9KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBnZW5lcmFsIHNlY3Rpb24KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVHZW5lcmFsU2VjdGlvbihGb3JtVG9vbGtpdCB0b29sa2l0KSB7Ci0JCS8vIGNyZWF0ZSBHZW5lcmFsIEluZm9ybWF0aW9uIHNlY3Rpb24KLQkJZ2VuZXJhbFNlY3Rpb24gPSBjcmVhdGVTZWN0aW9uKHRvb2xraXQsIHNlY3Rpb25Db21wb3NpdGUsIAotCQkJCUF1dGhvcmluZ1VJVGV4dC5HRU5FUkFMX0lORk9fU0VDVElPTl9OQU1FLCAKLQkJCQlNZXNzYWdlRm9ybWF0LmZvcm1hdCgKLQkJCQkJCUF1dGhvcmluZ1VJVGV4dC5HRU5FUkFMX0lORk9fU0VDVElPTl9ERVNDLAotCQkJCQkJbmV3IFN0cmluZ1tdIHsgcHJvY2Vzc1R5cGUgfSkpOwotCQlnZW5lcmFsQ29tcG9zaXRlID0gY3JlYXRlQ29tcG9zaXRlKHRvb2xraXQsIGdlbmVyYWxTZWN0aW9uKTsKLQotCQkvLyBuYW1lCi0JCWN0cmxfbmFtZSA9IGNyZWF0ZVRleHRFZGl0V2l0aExhYmVsKHRvb2xraXQsIGdlbmVyYWxDb21wb3NpdGUsCi0JCQkJQXV0aG9yaW5nVUlUZXh0Lk5BTUVfVEVYVCk7Ci0KLQkJLy8gUHJlc2VudGF0aW9uIG5hbWUKLQkJY3RybF9wcmVzZW50YXRpb25fbmFtZSA9IGNyZWF0ZVRleHRFZGl0V2l0aExhYmVsKHRvb2xraXQsCi0JCQkJZ2VuZXJhbENvbXBvc2l0ZSwgQXV0aG9yaW5nVUlUZXh0LlBSRVNFTlRBVElPTl9OQU1FX1RFWFQpOwotCQkKLQkJLy8gTG9uZyBQcmVzZW50YXRpb24gbmFtZQotCQlpZiAoQXV0aG9yaW5nVUlQcmVmZXJlbmNlcy5nZXRTaG93TG9uZ1ByZXNlbnRhdGlvbk5hbWUoKSkgewotCQkJY3RybF9sb25nX3ByZXNlbnRhdGlvbl9uYW1lID0gY3JlYXRlVGV4dEVkaXRXaXRoTGFiZWwodG9vbGtpdCwKLQkJCQkJZ2VuZXJhbENvbXBvc2l0ZSwgQXV0aG9yaW5nVUlUZXh0LkxPTkdfUFJFU0VOVEFUSU9OX05BTUVfVEVYVCk7Ci0JCX0KLQotCQkvLyBicmllZiBkZXNjCi0JCWN0cmxfYnJpZWZfZGVzYyA9IGNyZWF0ZVRleHRFZGl0V2l0aExhYmVsMih0b29sa2l0LCBnZW5lcmFsQ29tcG9zaXRlLAotCQkJCUF1dGhvcmluZ1VJVGV4dC5CUklFRl9ERVNDUklQVElPTl9URVhUKTsKLQotCQkvLyBFeHRlcm5hbCBJZAotCQljdHJsX2V4dGVybmFsX2lkID0gY3JlYXRlVGV4dEVkaXRXaXRoTGFiZWwodG9vbGtpdCwgZ2VuZXJhbENvbXBvc2l0ZSwKLQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5Qcm9jZXNzX0V4dGVybmFsSUQpOyAKLQotCQkvLyBQdXJwb3NlCi0JCWN0cmxfcHVycG9zZSA9IGNyZWF0ZVJpY2hUZXh0RWRpdFdpdGhMaW5rRm9yU2VjdGlvbigKLQkJCQl0b29sa2l0LAotCQkJCWdlbmVyYWxDb21wb3NpdGUsCi0JCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuUHJvY2Vzc19QdXJwb3NlLCA0MCwgNDAwLCBHRU5FUkFMX1NFQ1RJT05fSUQpOyAKLQkJCi0JCXRvb2xraXQucGFpbnRCb3JkZXJzRm9yKGdlbmVyYWxDb21wb3NpdGUpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBkZXRhaWwgc2VjdGlvbgotCSAqCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRGV0YWlsU2VjdGlvbihGb3JtVG9vbGtpdCB0b29sa2l0KSB7Ci0JCS8vIGNyZWF0ZSBkZXRhaWwgc2VjdGlvbgotCQlkZXRhaWxTZWN0aW9uID0gY3JlYXRlU2VjdGlvbih0b29sa2l0LCBzZWN0aW9uQ29tcG9zaXRlLCAKLQkJCQlBdXRob3JpbmdVSVRleHQuREVUQUlMX1NFQ1RJT05fTkFNRSwgCi0JCQkJTWVzc2FnZUZvcm1hdC5mb3JtYXQoCi0JCQkJCQlBdXRob3JpbmdVSVRleHQuREVUQUlMX1NFQ1RJT05fREVTQywKLQkJCQkJCW5ldyBTdHJpbmdbXSB7IHByb2Nlc3NUeXBlIH0pKTsKLQkJZGV0YWlsQ29tcG9zaXRlID0gY3JlYXRlQ29tcG9zaXRlKHRvb2xraXQsIGRldGFpbFNlY3Rpb24pOwotCi0JCS8vIGZ1bGwgZGVzY3JpcHRpb24KLQkJY3RybF9mdWxsX2Rlc2MgPSBjcmVhdGVSaWNoVGV4dEVkaXRXaXRoTGlua0ZvclNlY3Rpb24odG9vbGtpdCwKLQkJCQlkZXRhaWxDb21wb3NpdGUsIEF1dGhvcmluZ1VJVGV4dC5NQUlOX0RFU0NSSVBUSU9OX1RFWFQsIDEwMCwKLQkJCQk0MDAsIERFVEFJTF9TRUNUSU9OX0lEKTsKLQotCQkvLyBzY29wZQotCQljdHJsX3Njb3BlID0gY3JlYXRlUmljaFRleHRFZGl0V2l0aExpbmtGb3JTZWN0aW9uKHRvb2xraXQsCi0JCQkJZGV0YWlsQ29tcG9zaXRlLCBBdXRob3JpbmdVSVJlc291cmNlcy5Qcm9jZXNzX1Njb3BlLCA0MCwgNDAwLCBERVRBSUxfU0VDVElPTl9JRCk7IAotCi0JCS8vIHVzYWdlIG5vdGVzCi0JCWN0cmxfdXNhZ2Vfbm90ZXMgPSBjcmVhdGVSaWNoVGV4dEVkaXRXaXRoTGlua0ZvclNlY3Rpb24oCi0JCQkJdG9vbGtpdCwKLQkJCQlkZXRhaWxDb21wb3NpdGUsCi0JCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuUHJvY2Vzc19Vc2FnZU5vdGVzLCA0MCwgNDAwLCBERVRBSUxfU0VDVElPTl9JRCk7IAotCi0JCS8vIGFsdGVybmF0aXZlcwotCQljdHJsX2FsdGVybmF0aXZlcyA9IGNyZWF0ZVJpY2hUZXh0RWRpdFdpdGhMaW5rRm9yU2VjdGlvbigKLQkJCQl0b29sa2l0LAotCQkJCWRldGFpbENvbXBvc2l0ZSwKLQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5Qcm9jZXNzX0FsdGVybmF0aXZlcywgNDAsIDQwMCwgREVUQUlMX1NFQ1RJT05fSUQpOyAKLQotCQkvLyBob3cgdG8gc3RhZmYKLQkJY3RybF9ob3dfdG9fc3RhZmYgPSBjcmVhdGVSaWNoVGV4dEVkaXRXaXRoTGlua0ZvclNlY3Rpb24oCi0JCQkJdG9vbGtpdCwKLQkJCQlkZXRhaWxDb21wb3NpdGUsCi0JCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuUHJvY2Vzc19Ib3dUb1N0YWZmLCA0MCwgNDAwLCBERVRBSUxfU0VDVElPTl9JRCk7IAotCi0JCS8vIGtleSBjb25zaWRlcmF0aW9uCi0JCWN0cmxfa2V5X2NvbnNpZGVyYXRpb24gPSBjcmVhdGVSaWNoVGV4dEVkaXRXaXRoTGlua0ZvclNlY3Rpb24oCi0JCQkJdG9vbGtpdCwKLQkJCQlkZXRhaWxDb21wb3NpdGUsCi0JCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuUHJvY2Vzc19LZXlDb25zaWRlcmF0aW9uLCA0MCwgNDAwLCBERVRBSUxfU0VDVElPTl9JRCk7IAotCi0JCXRvb2xraXQucGFpbnRCb3JkZXJzRm9yKGRldGFpbENvbXBvc2l0ZSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGNvbmZpZ3VyYXRpb24gc2VjdGlvbgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUNvbmZpZ3VyYXRpb25TZWN0aW9uKEZvcm1Ub29sa2l0IHRvb2xraXQpIHsKLQkJLy8gY3JlYXRlIENvbmZpZ3VyYXRpb24gc2VjdGlvbgotCQljb25maWdTZWN0aW9uID0gY3JlYXRlU2VjdGlvbih0b29sa2l0LCBzZWN0aW9uQ29tcG9zaXRlLCAKLQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5wcm9jZXNzRGVzY3JpcHRpb25fY29uZmlndXJhdGlvblNlY3Rpb25UaXRsZSwgCi0JCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMucHJvY2Vzc0Rlc2NyaXB0aW9uX2NvbmZpZ3VyYXRpb25TZWN0aW9uTWVzc2FnZSk7Ci0JCWNvbmZpZ0NvbXBvc2l0ZSA9IGNyZWF0ZUNvbXBvc2l0ZSh0b29sa2l0LCBjb25maWdTZWN0aW9uKTsKLQkJKChHcmlkTGF5b3V0KSBjb25maWdDb21wb3NpdGUuZ2V0TGF5b3V0KCkpLm51bUNvbHVtbnMgPSAyOwotCi0JCUxhYmVsIGxfZWxlbWVudCA9IHRvb2xraXQKLQkJCQkuY3JlYXRlTGFiZWwoCi0JCQkJCQljb25maWdDb21wb3NpdGUsCi0JCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5wcm9jZXNzRGVzY3JpcHRpb25fY29uZmlndXJhdGlvbnMpOyAKLQkJewotCQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkJFR0lOTklORywgU1dULkVORCwgdHJ1ZSwKLQkJCQkJdHJ1ZSwgMiwgMSk7Ci0JCQlsX2VsZW1lbnQuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCX0KLQotCQlsaXN0X2NvbmZpZ3VyYXRpb25zID0gVUlIZWxwZXIuY3JlYXRlTGlzdCh0b29sa2l0LCBjb25maWdDb21wb3NpdGUsCi0JCQkJU1dULlNJTkdMRSB8IFNXVC5CT1JERVIpOwotCQl7Ci0JCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIHRydWUpOwotCQkJZ3JpZERhdGEudmVydGljYWxJbmRlbnQgPSBERUZBVUxUX1ZFUlRJQ0FMX0lOREVOVDsKLQkJCWdyaWREYXRhLmhlaWdodEhpbnQgPSA4MDsKLQkJCWdyaWREYXRhLndpZHRoSGludCA9IDIwMDsKLQkJCWxpc3RfY29uZmlndXJhdGlvbnMuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCX0KLQkJY29uZmlnTGlzdFZpZXdlciA9IG5ldyBMaXN0Vmlld2VyKGxpc3RfY29uZmlndXJhdGlvbnMpOwotCQljb25maWdMaXN0Vmlld2VyLnNldENvbnRlbnRQcm92aWRlcihjb250ZW50UHJvdmlkZXIpOwotCQljb25maWdMaXN0Vmlld2VyLnNldExhYmVsUHJvdmlkZXIobmV3IExhYmVsUHJvdmlkZXIoKSB7Ci0JCQlwdWJsaWMgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlIGdldEltYWdlKE9iamVjdCBlbGVtZW50KSB7Ci0JCQkJaWYgKGVsZW1lbnQgPT0gcHJvY2Vzcy5nZXREZWZhdWx0Q29udGV4dCgpKSB7Ci0JCQkJCXJldHVybiBBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0U2hhcmVkSW1hZ2UoCi0JCQkJCQkJImljb25zL2NoZWNrZWQuZ2lmIik7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgewotCQkJCVN0cmluZyB0eHQgPSBsYWJlbFByb3ZpZGVyLmdldFRleHQoZWxlbWVudCk7Ci0JCQkJaWYgKGVsZW1lbnQgPT0gcHJvY2Vzcy5nZXREZWZhdWx0Q29udGV4dCgpKSB7Ci0JCQkJCXR4dCA9IHR4dAotCQkJCQkJCSsgIiAiICsgQXV0aG9yaW5nVUlSZXNvdXJjZXMucHJvY2Vzc0Rlc2NyaXB0aW9uX2RlZmF1bHQ7IC8vJE5PTi1OTFMtMSQgCi0JCQkJfQotCQkJCXJldHVybiB0eHQ7Ci0JCQl9Ci0JCX0pOwotCi0JCUNvbXBvc2l0ZSBidXR0b25QYW5lbCA9IHRvb2xraXQuY3JlYXRlQ29tcG9zaXRlKGNvbmZpZ0NvbXBvc2l0ZSk7Ci0JCXsKLQkJCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKFNXVC5DRU5URVIsIFNXVC5DRU5URVIsIGZhbHNlLAotCQkJCQlmYWxzZSk7Ci0JCQkvLyBncmlkRGF0YS53aWR0aEhpbnQgPSA4MDsKLQkJCWdyaWREYXRhLmhvcml6b250YWxJbmRlbnQgPSA0OwotCQkJYnV0dG9uUGFuZWwuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCQlidXR0b25QYW5lbC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0KLQkJfQotCQkvLyBBZGQgYnV0dG9uCi0JCUJ1dHRvbiBidXR0b24gPSB0b29sa2l0LmNyZWF0ZUJ1dHRvbihidXR0b25QYW5lbCwgQXV0aG9yaW5nVUlSZXNvdXJjZXMuYWRkQnV0dG9uX3RleHQsIFNXVC5OT05FKTsgCi0JCXsKLQkJCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCQlidXR0b24uc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCX0KLQkJYnV0dG9uQWRkID0gYnV0dG9uOwotCi0JCS8vIFJlbW92ZSBidXR0b24KLQkJYnV0dG9uID0gdG9vbGtpdC5jcmVhdGVCdXR0b24oYnV0dG9uUGFuZWwsIEF1dGhvcmluZ1VJUmVzb3VyY2VzLnJlbW92ZUJ1dHRvbl90ZXh0LCBTV1QuTk9ORSk7IAotCQl7Ci0JCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQkJYnV0dG9uLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQl9Ci0JCWJ1dHRvblJlbW92ZSA9IGJ1dHRvbjsKLQotCQkvLyAvLyBFZGl0IGJ1dHRvbgotCQkvLyBidXR0b24gPSB0b29sa2l0LmNyZWF0ZUJ1dHRvbihidXR0b25QYW5lbCwgIkVkaXQuLi4iLCBTV1QuTk9ORSk7Ci0JCS8vIHsKLQkJLy8gR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJLy8gZ3JpZERhdGEudmVydGljYWxJbmRlbnQgPSBERUZBVUxUX1ZFUlRJQ0FMX0lOREVOVCAqIDY7Ci0JCS8vIGJ1dHRvbi5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJLy8gfQotCQkvLyBidXR0b25FZGl0ID0gYnV0dG9uOwotCQkvLwkJCi0JCS8vCQkKLQkJLy8gTWFrZSBEZWZhdWx0IGJ1dHRvbgotCQlidXR0b24gPSB0b29sa2l0LmNyZWF0ZUJ1dHRvbihidXR0b25QYW5lbCwgQXV0aG9yaW5nVUlSZXNvdXJjZXMubWFrZURlZmF1bHRCdXR0b25fdGV4dCwgU1dULk5PTkUpOyAKLQkJewotCQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJCWJ1dHRvbi5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJfQotCQlidXR0b25NYWtlRGVmYXVsdCA9IGJ1dHRvbjsKLQotCQkvLyBjb25maWd1cmF0aW9uIGRlc2NyaXB0aW9uCi0JCUxhYmVsIGxhYmVsID0gdG9vbGtpdAotCQkJCS5jcmVhdGVMYWJlbCgKLQkJCQkJCWNvbmZpZ0NvbXBvc2l0ZSwKLQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLnByb2Nlc3NEZXNjcmlwdGlvbl9jb25maWd1cmF0aW9uRGVzY3JpcHRpb24pOyAKLQkJewotCQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkJFR0lOTklORywgU1dULkVORCwgdHJ1ZSwKLQkJCQkJZmFsc2UsIDIsIDEpOwotCQkJbGFiZWwuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCX0KLQotCQl0ZXh0Q29uZmlnRGVzY3JpcHRpb24gPSB0b29sa2l0LmNyZWF0ZVRleHQoY29uZmlnQ29tcG9zaXRlLCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJewotCQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlKTsKLQkJCWdyaWREYXRhLnZlcnRpY2FsSW5kZW50ID0gREVGQVVMVF9WRVJUSUNBTF9JTkRFTlQ7Ci0JCQlncmlkRGF0YS5oZWlnaHRIaW50ID0gODA7Ci0JCQlncmlkRGF0YS53aWR0aEhpbnQgPSA0MDA7Ci0JCQl0ZXh0Q29uZmlnRGVzY3JpcHRpb24uc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCX0KLQkJdGV4dENvbmZpZ0Rlc2NyaXB0aW9uLnNldEVkaXRhYmxlKGZhbHNlKTsKLQkJdG9vbGtpdC5wYWludEJvcmRlcnNGb3IoY29uZmlnQ29tcG9zaXRlKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLmZvcm1zLmVkaXRvci5Gb3JtUGFnZSNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotLy8JCWlmIChwcm9jZXNzTGlzdGVuZXIgIT0gbnVsbCkgewotLy8JCQlwcm9jZXNzLmVBZGFwdGVycygpLnJlbW92ZShwcm9jZXNzTGlzdGVuZXIpOwotLy8JCX0KLQotCQlpZiAoY29uZmlnTGlzdEFkYXB0ZXIgIT0gbnVsbCkgewotCQkJY29uZmlnTGlzdEFkYXB0ZXIuZGlzcG9zZSgpOwotCQl9Ci0KLQkJc3VwZXIuZGlzcG9zZSgpOwotCi0JCWlmIChjb250ZW50UHJvdmlkZXIgIT0gbnVsbCkgewotCQkJY29udGVudFByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJfQotCQlpZiAobGFiZWxQcm92aWRlciAhPSBudWxsKSB7Ci0JCQlsYWJlbFByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJfQotCQkKLQkJZGlzcG9zZWQgPSB0cnVlOwotCX0KLQotCS8qKgotCSAqIENvbnRlbnQgcHJvdmlkZXIgZm9yIGNvbmZpZ3VyYXRpb25zCi0JICoKLQkgKi8KLQljbGFzcyBDb25maWdMaXN0SXRlbVByb3ZpZGVyIGV4dGVuZHMgSXRlbVByb3ZpZGVyQWRhcHRlciBpbXBsZW1lbnRzCi0JCQlJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIgewotCQkKLQkJLyoqCi0JCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2UKLQkJICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JCSAqLwotCQlwdWJsaWMgQ29uZmlnTGlzdEl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCQkJcHJvY2Vzcy5lQWRhcHRlcnMoKS5hZGQodGhpcyk7Ci0JCX0KLQotCQkvKioKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldENoaWxkcmVuKGphdmEubGFuZy5PYmplY3QpCi0JCSAqLwotCQlwdWJsaWMgamF2YS51dGlsLkNvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBkZWZhdWx0Q29uZmlnID0gcHJvY2Vzcy5nZXREZWZhdWx0Q29udGV4dCgpOwotCi0JCQlpZiAoZGVmYXVsdENvbmZpZyAhPSBudWxsCi0JCQkJCSYmICFwcm9jZXNzLmdldFZhbGlkQ29udGV4dCgpLmNvbnRhaW5zKGRlZmF1bHRDb25maWcpKSB7Ci0JCQkJcHJvY2Vzcy5nZXRWYWxpZENvbnRleHQoKS5hZGQoMCwgZGVmYXVsdENvbmZpZyk7Ci0JCQl9Ci0JCQlyZXR1cm4gcHJvY2Vzcy5nZXRWYWxpZENvbnRleHQoKTsKLQkJfQotCi0JCS8qKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGwjbm90aWZ5Q2hhbmdlZChvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb24pCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbiBtc2cpIHsKLQkJCWJvb2xlYW4gcmVmcmVzaCA9IGZhbHNlOwotCQkJc3dpdGNoIChtc2cuZ2V0RmVhdHVyZUlEKFByb2Nlc3MuY2xhc3MpKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19fVkFMSURfQ09OVEVYVDoKLQkJCQlzd2l0Y2ggKG1zZy5nZXRFdmVudFR5cGUoKSkgewotCQkJCWNhc2UgTm90aWZpY2F0aW9uLkFERDoKLQkJCQljYXNlIE5vdGlmaWNhdGlvbi5BRERfTUFOWToKLQkJCQljYXNlIE5vdGlmaWNhdGlvbi5SRU1PVkU6Ci0JCQkJY2FzZSBOb3RpZmljYXRpb24uUkVNT1ZFX01BTlk6Ci0JCQkJCXJlZnJlc2ggPSB0cnVlOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX19ERUZBVUxUX0NPTlRFWFQ6Ci0JCQkJcmVmcmVzaCA9IHRydWU7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlpZiAocmVmcmVzaCkKLQkJCQljb25maWdMaXN0Vmlld2VyLnJlZnJlc2goKTsKLQkJfQotCX07Ci0KLQlwcml2YXRlIHZvaWQgdXBkYXRlTW9kZWxDb250cm9scygpIHsKLQkJaWYgKChjdHJsX25hbWUgIT0gbnVsbCkgJiYgKCFjdHJsX25hbWUuaXNEaXNwb3NlZCgpKSkgewotCQkJdXBkYXRlQ29udHJvbChjdHJsX25hbWUsIHByb2Nlc3MuZ2V0TmFtZSgpKTsKLQkJfQotCQlpZiAoKGN0cmxfYnJpZWZfZGVzYyAhPSBudWxsKSAmJiAoIWN0cmxfYnJpZWZfZGVzYy5pc0Rpc3Bvc2VkKCkpKSB7Ci0JCQl1cGRhdGVDb250cm9sKGN0cmxfYnJpZWZfZGVzYywgcHJvY2Vzcy5nZXRCcmllZkRlc2NyaXB0aW9uKCkpOwotCQl9Ci0JCWlmICgoY3RybF9wcmVzZW50YXRpb25fbmFtZSAhPSBudWxsKQotCQkJCSYmICghY3RybF9wcmVzZW50YXRpb25fbmFtZS5pc0Rpc3Bvc2VkKCkpKSB7Ci0JCQl1cGRhdGVDb250cm9sKGN0cmxfcHJlc2VudGF0aW9uX25hbWUsIHByb2Nlc3MuZ2V0UHJlc2VudGF0aW9uTmFtZSgpKTsKLQkJfQotCQlpZiAoQXV0aG9yaW5nVUlQcmVmZXJlbmNlcy5nZXRTaG93TG9uZ1ByZXNlbnRhdGlvbk5hbWUoKSkgewotCQkJaWYgKChjdHJsX2xvbmdfcHJlc2VudGF0aW9uX25hbWUgIT0gbnVsbCkKLQkJCQkJJiYgKCFjdHJsX2xvbmdfcHJlc2VudGF0aW9uX25hbWUuaXNEaXNwb3NlZCgpKSkgewotCQkJCXVwZGF0ZUNvbnRyb2woY3RybF9sb25nX3ByZXNlbnRhdGlvbl9uYW1lLCBwcm9jZXNzCi0JCQkJCQkuZ2V0UHJlc2VudGF0aW9uKCkuZ2V0TG9uZ1ByZXNlbnRhdGlvbk5hbWUoKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBVcGRhdGVzIHRoZSBUZXh0IGNvbnRyb2wgaWZmIHRoZSBuZXdUZXh0IGlzIGRpZmZlcmVudCB0aGFuIHdoYXQncyB0aGVyZQotCSAqIEBwYXJhbSB0ZXh0Ci0JICogQHBhcmFtIG5ld1RleHQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIHVwZGF0ZUNvbnRyb2woVGV4dCB0ZXh0LCBTdHJpbmcgbmV3VGV4dCkgewotCQlpZiAoIXRleHQuZ2V0VGV4dCgpLmVxdWFscyhUbmdVdGlsLmNoZWNrTnVsbChuZXdUZXh0KSkpIHsKLQkJCXRleHQuc2V0VGV4dChUbmdVdGlsLmNoZWNrTnVsbChuZXdUZXh0KSk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQkvKioKLQkgKiBVcGRhdGVzIHRoZSBJTWV0aG9kUmljaFRleHQgY29udHJvbCBpZmYgdGhlIG5ld1RleHQgaXMgZGlmZmVyZW50IHRoYW4gd2hhdCdzIHRoZXJlCi0JICogQHBhcmFtIHRleHQKLQkgKiBAcGFyYW0gbmV3VGV4dAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gdXBkYXRlQ29udHJvbChJTWV0aG9kUmljaFRleHQgdGV4dCwgU3RyaW5nIG5ld1RleHQpIHsKLQkJaWYgKCF0ZXh0LmdldFRleHQoKS5lcXVhbHMoVG5nVXRpbC5jaGVja051bGwobmV3VGV4dCkpKSB7Ci0JCQl0ZXh0LnNldFRleHQoVG5nVXRpbC5jaGVja051bGwobmV3VGV4dCkpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBMb2FkcyBpbml0aWFsIGRhdGEgZnJvbSBtb2RlbAotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIGxvYWREYXRhKCkgewotCQlvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NEZXNjcmlwdGlvbiBjb250ZW50ID0gKG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0Rlc2NyaXB0aW9uKSBwcm9jZXNzCi0JCQkJLmdldFByZXNlbnRhdGlvbigpOwotCi0JCVN0cmluZyBleHRlcm5hbElEID0gY29udGVudC5nZXRFeHRlcm5hbElkKCk7Ci0JCVN0cmluZyBwdXJwb3NlID0gY29udGVudC5nZXRQdXJwb3NlKCk7Ci0JCVN0cmluZyBmdWxsRGVzYyA9IGNvbnRlbnQuZ2V0TWFpbkRlc2NyaXB0aW9uKCk7Ci0JCVN0cmluZyBzY29wZSA9IGNvbnRlbnQuZ2V0U2NvcGUoKTsKLQkJU3RyaW5nIHVzYWdlTm90ZXMgPSBjb250ZW50LmdldFVzYWdlTm90ZXMoKTsKLQkJU3RyaW5nIGFsdGVybmF0aXZlcyA9IGNvbnRlbnQuZ2V0QWx0ZXJuYXRpdmVzKCk7Ci0JCVN0cmluZyBob3dUb1N0YWZmID0gY29udGVudC5nZXRIb3d0b1N0YWZmKCk7Ci0JCVN0cmluZyBrZXlDb25zaWRlcmF0aW9uID0gY29udGVudC5nZXRLZXlDb25zaWRlcmF0aW9ucygpOwotCi0JCXVwZGF0ZU1vZGVsQ29udHJvbHMoKTsKLQotCQl1cGRhdGVDb250cm9sKGN0cmxfZXh0ZXJuYWxfaWQsIGV4dGVybmFsSUQpOwotCQl1cGRhdGVDb250cm9sKGN0cmxfcHVycG9zZSwgcHVycG9zZSk7Ci0JCXVwZGF0ZUNvbnRyb2woY3RybF9mdWxsX2Rlc2MsIGZ1bGxEZXNjKTsKLQkJdXBkYXRlQ29udHJvbChjdHJsX3Njb3BlLCBzY29wZSk7Ci0JCXVwZGF0ZUNvbnRyb2woY3RybF91c2FnZV9ub3RlcywgdXNhZ2VOb3Rlcyk7Ci0JCXVwZGF0ZUNvbnRyb2woY3RybF9hbHRlcm5hdGl2ZXMsIGFsdGVybmF0aXZlcyk7Ci0JCXVwZGF0ZUNvbnRyb2woY3RybF9ob3dfdG9fc3RhZmYsIGhvd1RvU3RhZmYpOwotCQl1cGRhdGVDb250cm9sKGN0cmxfa2V5X2NvbnNpZGVyYXRpb24sIGtleUNvbnNpZGVyYXRpb24pOwotCi0JCWlmIChjb25maWdMaXN0QWRhcHRlciA9PSBudWxsKSB7Ci0JCQljb25maWdMaXN0QWRhcHRlciA9IG5ldyBDb25maWdMaXN0SXRlbVByb3ZpZGVyKAotCQkJCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkJCS5nZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSk7Ci0JCX0KLQotCQljb25maWdMaXN0Vmlld2VyLnNldElucHV0KGNvbmZpZ0xpc3RBZGFwdGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGQgbGlzdGVuZXJzCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkTGlzdGVuZXJzKCkgewotLy8JCXN1cGVyLmFkZExpc3RlbmVycygpOwotCQl0aGlzLmVkaXRvciA9ICgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpOwotCQlmaW5hbCBJQWN0aW9uTWFuYWdlciBhY3Rpb25NZ3IgPSBlZGl0b3IuZ2V0QWN0aW9uTWFuYWdlcigpOwotCQlmaW5hbCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NEZXNjcmlwdGlvbiBjb250ZW50ID0gKG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0Rlc2NyaXB0aW9uKSBwcm9jZXNzCi0JCQkJLmdldFByZXNlbnRhdGlvbigpOwotCQltb2RpZnlMaXN0ZW5lciA9IGVkaXRvci5jcmVhdGVNb2RpZnlMaXN0ZW5lcihwcm9jZXNzKTsKLQkJY29udGVudE1vZGlmeUxpc3RlbmVyID0gZWRpdG9yLmNyZWF0ZU1vZGlmeUxpc3RlbmVyKHByb2Nlc3MKLQkJCQkuZ2V0UHJlc2VudGF0aW9uKCkpOwotCi0JCWZvcm0uYWRkQ29udHJvbExpc3RlbmVyKG5ldyBDb250cm9sTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBjb250cm9sUmVzaXplZChDb250cm9sRXZlbnQgZSkgewotCQkJCWlmICghZGVzY0V4cGFuZEZsYWcpCi0JCQkJCXJldHVybjsKLQkJCQlpZiAoY3RybF9leHBhbmRlZCAhPSBudWxsKSB7Ci0JCQkJCSgoR3JpZERhdGEpIGN0cmxfZXhwYW5kZWQuZ2V0TGF5b3V0RGF0YSgpKS5oZWlnaHRIaW50ID0gZ2V0UmljaFRleHRFZGl0b3JIZWlnaHQoKTsKLQkJCQkJKChHcmlkRGF0YSkgY3RybF9leHBhbmRlZC5nZXRMYXlvdXREYXRhKCkpLndpZHRoSGludCA9IGdldFJpY2hUZXh0RWRpdG9yV2lkdGgoKTsKLQkJCQl9Ci0JCQkJZm9ybVNlY3Rpb24ubGF5b3V0KHRydWUsIHRydWUpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBjb250cm9sTW92ZWQoQ29udHJvbEV2ZW50IGUpIHsKLQkJCX0KLQkJfSk7Ci0KLQkJZm9ybS5nZXRQYXJlbnQoKS5hZGRMaXN0ZW5lcihTV1QuQWN0aXZhdGUsIG5ldyBMaXN0ZW5lcigpIHsKLQotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCQlpZiAoVG5nVXRpbC5pc0xvY2tlZChwcm9jZXNzKSkgewotCQkJCQlyZWZyZXNoKGZhbHNlKTsKLQkJCQl9IGVsc2UgewotCQkJCQlyZWZyZXNoKHRydWUpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JCQotCQluYW1lTW9kaWZ5TGlzdGVuZXIgPSBlZGl0b3IuY3JlYXRlTW9kaWZ5TGlzdGVuZXIocHJvY2Vzcy5lQ29udGFpbmVyKCksCi0JCQkJdHJ1ZSk7Ci0JCWN0cmxfbmFtZS5hZGRNb2RpZnlMaXN0ZW5lcihuYW1lTW9kaWZ5TGlzdGVuZXIpOwotCQljdHJsX25hbWUuYWRkTGlzdGVuZXIoU1dULkRlYWN0aXZhdGUsIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQlTdHJpbmcgb2xkQ29udGVudCA9IHByb2Nlc3MuZ2V0TmFtZSgpOwotCQkJCWlmICgoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpKS5tdXN0UmVzdG9yZVZhbHVlKAotCQkJCQkJZS53aWRnZXQsIG9sZENvbnRlbnQpKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJU3RyaW5nIG5ld05hbWUgPSBjdHJsX25hbWUuZ2V0VGV4dCgpLnRyaW0oKTsKLQkJCQlpZiAobmV3TmFtZS5lcXVhbHMocHJvY2Vzcy5nZXROYW1lKCkpKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0KLQkJCQlQcm9jZXNzQ29tcG9uZW50IHByb2NDb21wID0gKFByb2Nlc3NDb21wb25lbnQpIHByb2Nlc3MuZUNvbnRhaW5lcigpOwotCQkJCQotCQkJCVN0cmluZyBtc2cgPSBudWxsOwotCQkJCWlmIChuZXdOYW1lLmluZGV4T2YoJyYnKSA+IC0xKSB7IC8vRklYTUU6IHRoaXMgbXVzdCBnbyB0byB2YWxpZGF0b3IgY29kZQotCQkJCQltc2cgPSBOTFMuYmluZChMaWJyYXJ5RWRpdFJlc291cmNlcy5pbnZhbGlkRWxlbWVudE5hbWVFcnJvcjRfbXNnLCBuZXdOYW1lKTsKLQkJCQl9IGVsc2UgewotCQkJCQlJVmFsaWRhdG9yIHZhbGlkYXRvciA9IElWYWxpZGF0b3JGYWN0b3J5LklOU1RBTkNFCi0JCQkJCS5jcmVhdGVOYW1lVmFsaWRhdG9yKAotCQkJCQkJCXByb2NDb21wLAotCQkJCQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkJCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpOwotCQkJCQltc2cgPSB2YWxpZGF0b3IuaXNWYWxpZChuZXdOYW1lKTsKLQkJCQl9Ci0JCQkJCi0JCQkJaWYgKG1zZyA9PSBudWxsKSB7Ci0JCQkJCVN0cmluZyB0aXRsZSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLnByb2Nlc3NEZXNjcmlwdGlvbk5hbWVDaGFuZ2VDb25maXJtX3RpdGxlOyAKLQkJCQkJU3RyaW5nIG1lc3NhZ2UgPSBBdXRob3JpbmdVSVJlc291cmNlcy5wcm9jZXNzRGVzY3JpcHRpb25OYW1lQ2hhbmdlQ29uZmlybV9tZXNzYWdlOyAKLQkJCQkJaWYgKEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKQotCQkJCQkJCS5kaXNwbGF5Q29uZmlybWF0aW9uKHRpdGxlLCBtZXNzYWdlKSkgewotCQkJCQkJZS5kb2l0ID0gdHJ1ZTsKLQotCQkJCQkJYm9vbGVhbiBzdGF0dXMgPSBhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuU0VULAotCQkJCQkJCQlwcm9jZXNzLCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJCS5nZXROYW1lZEVsZW1lbnRfTmFtZSgpLCBjdHJsX25hbWUKLQkJCQkJCQkJCQkuZ2V0VGV4dCgpLCAtMSk7Ci0JCQkJCQlpZiAoIXN0YXR1cykgewotCQkJCQkJCWN0cmxfbmFtZS5zZXRUZXh0KHByb2Nlc3MuZ2V0TmFtZSgpKTsKLQkJCQkJCQlyZXR1cm47Ci0JCQkJCQl9Ci0JCQkJCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuU0VULCBwcm9jQ29tcCwKLQkJCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TmFtZWRFbGVtZW50X05hbWUoKSwKLQkJCQkJCQkJY3RybF9uYW1lLmdldFRleHQoKSwgLTEpOwotCi0JCQkJCQlzZXRGb3JtVGV4dCgpOwotCi0JCQkJCQkvLyBhZGp1c3QgcGx1Z2luIGxvY2F0aW9uIGFuZCBzYXZlIHRoZSBlZGl0b3IKLQkJCQkJCS8vCi0JCQkJCQlCdXN5SW5kaWNhdG9yLnNob3dXaGlsZShnZXRTaXRlKCkuZ2V0U2hlbGwoKQotCQkJCQkJCQkuZ2V0RGlzcGxheSgpLCBuZXcgUnVubmFibGUoKSB7Ci0JCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCQlNZXRob2RFbGVtZW50RWRpdG9yIGVkaXRvciA9IChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKTsKLQkJCQkJCQkJZWRpdG9yCi0JCQkJCQkJCQkJLmRvU2F2ZShuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJCQkJCQkJaWYoZWRpdG9yLmlzRGlydHkoKSkgewotCQkJCQkJCQkJLy8gc2F2ZSBmYWlsZWQKLQkJCQkJCQkJCS8vCi0JCQkJCQkJCQlyZXR1cm47Ci0JCQkJCQkJCX0KLQkJCQkJCQkJSUxpYnJhcnlQZXJzaXN0ZXIuRmFpbFNhZmVNZXRob2RMaWJyYXJ5UGVyc2lzdGVyIHBlcnNpc3RlciA9IGVkaXRvcgotCQkJCQkJCQkJCS5nZXRQZXJzaXN0ZXIoKTsKLQkJCQkJCQkJdHJ5IHsKLQkJCQkJCQkJCXBlcnNpc3Rlci5hZGp1c3RMb2NhdGlvbihwcm9jZXNzCi0JCQkJCQkJCQkJCQkJLmVSZXNvdXJjZSgpKTsKLQkJCQkJCQkJCXBlcnNpc3Rlci5jb21taXQoKTsKLQkJCQkJCQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJCQlwZXJzaXN0ZXIucm9sbGJhY2soKTsKLQkJCQkJCQkJCXRocm93IGU7Ci0JCQkJCQkJCX0KLQkJCQkJCQkJLy8gYWRqdXN0IGRpYWdyYW0gcmVzb3VyY2UgYXMgd2VsbAotCQkJCQkJCQkvLwotCQkJCQkJCQlEaWFncmFtTWFuYWdlciBtZ3IgPSBEaWFncmFtTWFuYWdlci5nZXRJbnN0YW5jZShwcm9jZXNzLCB0aGlzKTsKLQkJCQkJCQkJaWYobWdyICE9IG51bGwpIHsKLQkJCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCQkJbWdyLnVwZGF0ZVJlc291cmNlVVJJKCk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCQljYXRjaChFeGNlcHRpb24gZSkgewotCQkJCQkJCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJCWZpbmFsbHkgewotCQkJCQkJCQkJCW1nci5yZW1vdmVDb25zdW1lcih0aGlzKTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0pOwotCQkJCQl9IGVsc2UgewotCQkJCQkJY3RybF9uYW1lLnNldFRleHQocHJvY2Vzcy5nZXROYW1lKCkpOwotCQkJCQkJcmV0dXJuOwotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4KLQkJCQkJCQkuZ2V0RGVmYXVsdCgpCi0JCQkJCQkJLmdldE1zZ0RpYWxvZygpCi0JCQkJCQkJLmRpc3BsYXlFcnJvcigKLQkJCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLnJlbmFtZURpYWxvZ190aXRsZSwgbXNnKTsgCi0JCQkJCWN0cmxfbmFtZS5zZXRUZXh0KHByb2Nlc3MuZ2V0TmFtZSgpKTsKLQkJCQkJZS5kb2l0ID0gZmFsc2U7Ci0JCQkJCWN0cmxfbmFtZS5nZXREaXNwbGF5KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQljdHJsX25hbWUuc2V0Rm9jdXMoKTsKLQkJCQkJCQljdHJsX25hbWUuc2VsZWN0QWxsKCk7Ci0JCQkJCQl9Ci0JCQkJCX0pOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JCWN0cmxfbmFtZS5hZGRGb2N1c0xpc3RlbmVyKG5ldyBGb2N1c0FkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBmb2N1c0dhaW5lZChGb2N1c0V2ZW50IGUpIHsKLQkJCQkoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpKS5zZXRDdXJyZW50RmVhdHVyZUVkaXRvcihlLndpZGdldCwKLQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE5hbWVkRWxlbWVudF9OYW1lKCkpOwotCQkJfQotCQl9KTsKLQkJCi0JCWN0cmxfcHJlc2VudGF0aW9uX25hbWUuYWRkTW9kaWZ5TGlzdGVuZXIobW9kaWZ5TGlzdGVuZXIpOwotCQljdHJsX3ByZXNlbnRhdGlvbl9uYW1lLmFkZExpc3RlbmVyKFNXVC5EZWFjdGl2YXRlLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJU3RyaW5nIG9sZENvbnRlbnQgPSBwcm9jZXNzLmdldFByZXNlbnRhdGlvbk5hbWUoKTsKLQkJCQlpZiAoKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkubXVzdFJlc3RvcmVWYWx1ZSgKLQkJCQkJCWUud2lkZ2V0LCBvbGRDb250ZW50KSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCWlmICgoY3RybF9wcmVzZW50YXRpb25fbmFtZS5nZXRUZXh0KCkgIT0gbnVsbCkKLQkJCQkJCSYmICghY3RybF9wcmVzZW50YXRpb25fbmFtZS5nZXRUZXh0KCkuZXF1YWxzKCIiKSkpIC8vJE5PTi1OTFMtMSQKLQkJCQl7Ci0JCQkJCWUuZG9pdCA9IHRydWU7Ci0JCQkJCWlmICghY3RybF9wcmVzZW50YXRpb25fbmFtZS5nZXRUZXh0KCkuZXF1YWxzKG9sZENvbnRlbnQpKSB7Ci0KLQkJCQkJCWJvb2xlYW4gc3RhdHVzID0gYWN0aW9uTWdyCi0JCQkJCQkJCS5kb0FjdGlvbigKLQkJCQkJCQkJCQlJQWN0aW9uTWFuYWdlci5TRVQsCi0JCQkJCQkJCQkJcHJvY2VzcywKLQkJCQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJCQkJLmdldE1ldGhvZEVsZW1lbnRfUHJlc2VudGF0aW9uTmFtZSgpLAotCQkJCQkJCQkJCWN0cmxfcHJlc2VudGF0aW9uX25hbWUuZ2V0VGV4dCgpLCAtMSk7Ci0JCQkJCQlpZiAoIXN0YXR1cykgewotCQkJCQkJCWN0cmxfcHJlc2VudGF0aW9uX25hbWUuc2V0VGV4dChvbGRDb250ZW50KTsKLQkJCQkJCQlyZXR1cm47Ci0JCQkJCQl9Ci0vLwkJCQkJCUxpYnJhcnlWaWV3IGVsZW1lbnRzVmlldyA9IExpYnJhcnlWaWV3LmdldFZpZXcoKTsKLS8vCQkJCQkJaWYgKGVsZW1lbnRzVmlldyAhPSBudWxsKQotLy8JCQkJCQkJZWxlbWVudHNWaWV3LmdldFZpZXdlcigpLnJlZnJlc2goKTsKLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCS8vIHJlc3RvcmUgdGhlIG9sZCBuYW1lIGZpcnN0LCB0aGVuIHByZXNlbnQgdGhlIGVycm9yCi0JCQkJCS8vIG1lc3NhZ2UgYm94Ci0JCQkJCWN0cmxfcHJlc2VudGF0aW9uX25hbWUuc2V0VGV4dChwcm9jZXNzCi0JCQkJCQkJLmdldFByZXNlbnRhdGlvbk5hbWUoKSk7Ci0JCQkJCUF1dGhvcmluZ1VJUGx1Z2luCi0JCQkJCQkJLmdldERlZmF1bHQoKQotCQkJCQkJCS5nZXRNc2dEaWFsb2coKQotCQkJCQkJCS5kaXNwbGF5RXJyb3IoCi0JCQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5lZGl0RGlhbG9nX3RpdGxlLCAKLQkJCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLmludmFsaWRQcmVzZW50YXRpb25OYW1lRXJyb3JfbXNnKTsgCi0JCQkJCWUuZG9pdCA9IGZhbHNlOwotCQkJCQljdHJsX3ByZXNlbnRhdGlvbl9uYW1lLmdldERpc3BsYXkoKS5hc3luY0V4ZWMoCi0JCQkJCQkJbmV3IFJ1bm5hYmxlKCkgewotCQkJCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJCQljdHJsX3ByZXNlbnRhdGlvbl9uYW1lLnNldEZvY3VzKCk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9KTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCQljdHJsX3ByZXNlbnRhdGlvbl9uYW1lLmFkZEZvY3VzTGlzdGVuZXIobmV3IEZvY3VzQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGZvY3VzR2FpbmVkKEZvY3VzRXZlbnQgZSkgewotCQkJCSgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpLnNldEN1cnJlbnRGZWF0dXJlRWRpdG9yKGUud2lkZ2V0LAotCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWV0aG9kRWxlbWVudF9QcmVzZW50YXRpb25OYW1lKCkpOwotCQkJCS8vIHdoZW4gdXNlciB0YWIgdG8gdGhpcyBmaWVsZCwgc2VsZWN0IGFsbCB0ZXh0Ci0JCQkJY3RybF9wcmVzZW50YXRpb25fbmFtZS5zZWxlY3RBbGwoKTsKLQotCQkJfQotCQkJcHVibGljIHZvaWQgZm9jdXNMb3N0KEZvY3VzRXZlbnQgZSkgewotCQkJCS8vIGNsZWFyIHRoZSBzZWxlY3Rpb24gd2hlbiB0aGUgZm9jdXMgb2YgdGhlIGNvbXBvbmVudCBpcyBsb3N0IAotCQkJCWlmKGN0cmxfcHJlc2VudGF0aW9uX25hbWUuZ2V0U2VsZWN0aW9uQ291bnQoKSA+IDApewotCQkJCQljdHJsX3ByZXNlbnRhdGlvbl9uYW1lLmNsZWFyU2VsZWN0aW9uKCk7Ci0JCQkJfSB9Ci0JCX0pOwotCi0JCWlmIChBdXRob3JpbmdVSVByZWZlcmVuY2VzLmdldFNob3dMb25nUHJlc2VudGF0aW9uTmFtZSgpKSB7IAotCQkJY3RybF9sb25nX3ByZXNlbnRhdGlvbl9uYW1lLmFkZE1vZGlmeUxpc3RlbmVyKG1vZGlmeUxpc3RlbmVyKTsKLQkJCWN0cmxfbG9uZ19wcmVzZW50YXRpb25fbmFtZS5hZGRGb2N1c0xpc3RlbmVyKG5ldyBGb2N1c0FkYXB0ZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgZm9jdXNHYWluZWQoRm9jdXNFdmVudCBlKSB7Ci0JCQkJCSgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpLnNldEN1cnJlbnRGZWF0dXJlRWRpdG9yKGUud2lkZ2V0LAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbnRlbnREZXNjcmlwdGlvbl9Mb25nUHJlc2VudGF0aW9uTmFtZSgpKTsKLQkJCQl9Ci0JCi0JCQkJcHVibGljIHZvaWQgZm9jdXNMb3N0KEZvY3VzRXZlbnQgZSkgewotCQkJCQlTdHJpbmcgb2xkQ29udGVudCA9IGNvbnRlbnQuZ2V0TG9uZ1ByZXNlbnRhdGlvbk5hbWUoKTsKLQkJCQkJaWYgKCgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpLm11c3RSZXN0b3JlVmFsdWUoCi0JCQkJCQkJY3RybF9sb25nX3ByZXNlbnRhdGlvbl9uYW1lLCBvbGRDb250ZW50KSkgewotCQkJCQkJcmV0dXJuOwotCQkJCQl9Ci0JCQkJCVN0cmluZyBuZXdDb250ZW50ID0gY3RybF9sb25nX3ByZXNlbnRhdGlvbl9uYW1lLmdldFRleHQoKTsKLQkJCQkJaWYgKCFuZXdDb250ZW50LmVxdWFscyhvbGRDb250ZW50KSkgewotCQkJCQkJYm9vbGVhbiBzdWNjZXNzID0gYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlNFVCwKLQkJCQkJCQkJcHJvY2Vzcy5nZXRQcmVzZW50YXRpb24oKSwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCQkuZ2V0Q29udGVudERlc2NyaXB0aW9uX0xvbmdQcmVzZW50YXRpb25OYW1lKCksCi0JCQkJCQkJCW5ld0NvbnRlbnQsIC0xKTsKLQkJCQkJCWlmIChzdWNjZXNzKSB7Ci0JCQkJCQkJY3RybF9sb25nX3ByZXNlbnRhdGlvbl9uYW1lLnNldFRleHQobmV3Q29udGVudCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9KTsKLQkJfQotCQkKLQkJY3RybF9icmllZl9kZXNjLmFkZE1vZGlmeUxpc3RlbmVyKG1vZGlmeUxpc3RlbmVyKTsKLQkJY3RybF9icmllZl9kZXNjLmFkZEZvY3VzTGlzdGVuZXIobmV3IEZvY3VzQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGZvY3VzR2FpbmVkKEZvY3VzRXZlbnQgZSkgewotCQkJCSgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpLnNldEN1cnJlbnRGZWF0dXJlRWRpdG9yKGUud2lkZ2V0LAotCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWV0aG9kRWxlbWVudF9CcmllZkRlc2NyaXB0aW9uKCkpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBmb2N1c0xvc3QoRm9jdXNFdmVudCBlKSB7Ci0JCQkJU3RyaW5nIG9sZENvbnRlbnQgPSBwcm9jZXNzLmdldEJyaWVmRGVzY3JpcHRpb24oKTsKLQkJCQlpZiAoKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkubXVzdFJlc3RvcmVWYWx1ZSgKLQkJCQkJCWUud2lkZ2V0LCBvbGRDb250ZW50KSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCVN0cmluZyBuZXdDb250ZW50ID0gY3RybF9icmllZl9kZXNjLmdldFRleHQoKTsKLQkJCQlpZiAoIW5ld0NvbnRlbnQuZXF1YWxzKG9sZENvbnRlbnQpKSB7Ci0JCQkJCWJvb2xlYW4gc3VjY2VzcyA9IGFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5TRVQsCi0JCQkJCQkJcHJvY2VzcywgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCS5nZXRNZXRob2RFbGVtZW50X0JyaWVmRGVzY3JpcHRpb24oKSwKLQkJCQkJCQluZXdDb250ZW50LCAtMSk7Ci0JCQkJCWlmIChzdWNjZXNzKSB7Ci0JCQkJCQljdHJsX2JyaWVmX2Rlc2Muc2V0VGV4dChuZXdDb250ZW50KTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJY3RybF9leHRlcm5hbF9pZC5hZGRNb2RpZnlMaXN0ZW5lcihjb250ZW50TW9kaWZ5TGlzdGVuZXIpOwotCQljdHJsX2V4dGVybmFsX2lkLmFkZEZvY3VzTGlzdGVuZXIobmV3IEZvY3VzQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGZvY3VzR2FpbmVkKEZvY3VzRXZlbnQgZSkgewotCQkJCSgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpLnNldEN1cnJlbnRGZWF0dXJlRWRpdG9yKGUud2lkZ2V0LAotCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29udGVudERlc2NyaXB0aW9uX0V4dGVybmFsSWQoKSk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGZvY3VzTG9zdChGb2N1c0V2ZW50IGUpIHsKLQkJCQlTdHJpbmcgb2xkQ29udGVudCA9IGNvbnRlbnQuZ2V0RXh0ZXJuYWxJZCgpOwotCQkJCWlmICgoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpKS5tdXN0UmVzdG9yZVZhbHVlKAotCQkJCQkJY3RybF9leHRlcm5hbF9pZCwgb2xkQ29udGVudCkpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlTdHJpbmcgbmV3Q29udGVudCA9IGN0cmxfZXh0ZXJuYWxfaWQuZ2V0VGV4dCgpOwotCQkJCWlmICghbmV3Q29udGVudC5lcXVhbHMob2xkQ29udGVudCkpIHsKLQkJCQkJYm9vbGVhbiBzdWNjZXNzID0gYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlNFVCwKLQkJCQkJCQlwcm9jZXNzLmdldFByZXNlbnRhdGlvbigpLCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJLmdldENvbnRlbnREZXNjcmlwdGlvbl9FeHRlcm5hbElkKCksCi0JCQkJCQkJbmV3Q29udGVudCwgLTEpOwotCQkJCQlpZiAoc3VjY2VzcykgewotCQkJCQkJY3RybF9leHRlcm5hbF9pZC5zZXRUZXh0KG5ld0NvbnRlbnQpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9KTsKLQotCQljdHJsX3B1cnBvc2Uuc2V0TW9kYWxPYmplY3QocHJvY2Vzcy5nZXRQcmVzZW50YXRpb24oKSk7Ci0JCWN0cmxfcHVycG9zZS5zZXRNb2RhbE9iamVjdEZlYXR1cmUoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0QWN0aXZpdHlEZXNjcmlwdGlvbl9QdXJwb3NlKCkpOwotCQljdHJsX3B1cnBvc2UuYWRkTW9kaWZ5TGlzdGVuZXIoY29udGVudE1vZGlmeUxpc3RlbmVyKTsKLQkJY3RybF9wdXJwb3NlLmFkZExpc3RlbmVyKFNXVC5EZWFjdGl2YXRlLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJSU1ldGhvZFJpY2hUZXh0IGNvbnRyb2wgPSBkZXNjRXhwYW5kRmxhZyA/IGN0cmxfZXhwYW5kZWQKLQkJCQkJCTogY3RybF9wdXJwb3NlOwotCQkJCWlmICghY29udHJvbC5nZXRNb2RpZmllZCgpKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJU3RyaW5nIG9sZENvbnRlbnQgPSBjb250ZW50LmdldFB1cnBvc2UoKTsKLQkJCQlpZiAoKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkubXVzdFJlc3RvcmVWYWx1ZSgKLQkJCQkJCWN0cmxfcHVycG9zZSwgb2xkQ29udGVudCkpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlTdHJpbmcgbmV3Q29udGVudCA9IGNvbnRyb2wuZ2V0VGV4dCgpOwotCQkJCWlmICghbmV3Q29udGVudC5lcXVhbHMob2xkQ29udGVudCkpIHsKLQkJCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlNFVCwgcHJvY2VzcwotCQkJCQkJCS5nZXRQcmVzZW50YXRpb24oKSwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkuZ2V0QWN0aXZpdHlEZXNjcmlwdGlvbl9QdXJwb3NlKCksIG5ld0NvbnRlbnQsIC0xKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JCWN0cmxfZnVsbF9kZXNjLnNldE1vZGFsT2JqZWN0KHByb2Nlc3MuZ2V0UHJlc2VudGF0aW9uKCkpOwotCQljdHJsX2Z1bGxfZGVzYy5zZXRNb2RhbE9iamVjdEZlYXR1cmUoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0Q29udGVudERlc2NyaXB0aW9uX01haW5EZXNjcmlwdGlvbigpKTsKLQkJY3RybF9mdWxsX2Rlc2MuYWRkTW9kaWZ5TGlzdGVuZXIoY29udGVudE1vZGlmeUxpc3RlbmVyKTsKLQkJY3RybF9mdWxsX2Rlc2MuYWRkTGlzdGVuZXIoU1dULkRlYWN0aXZhdGUsIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQlJTWV0aG9kUmljaFRleHQgY29udHJvbCA9IGRlc2NFeHBhbmRGbGFnID8gY3RybF9leHBhbmRlZAotCQkJCQkJOiBjdHJsX2Z1bGxfZGVzYzsKLQkJCQlpZiAoIWNvbnRyb2wuZ2V0TW9kaWZpZWQoKSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCVN0cmluZyBvbGRDb250ZW50ID0gY29udGVudC5nZXRNYWluRGVzY3JpcHRpb24oKTsKLQkJCQlpZiAoKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkubXVzdFJlc3RvcmVWYWx1ZSgKLQkJCQkJCWN0cmxfZnVsbF9kZXNjLCBvbGRDb250ZW50KSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCVN0cmluZyBuZXdDb250ZW50ID0gY29udHJvbC5nZXRUZXh0KCk7Ci0JCQkJaWYgKCFuZXdDb250ZW50LmVxdWFscyhvbGRDb250ZW50KSkgewotCQkJCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuU0VULCBwcm9jZXNzCi0JCQkJCQkJLmdldFByZXNlbnRhdGlvbigpLCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCS5nZXRDb250ZW50RGVzY3JpcHRpb25fTWFpbkRlc2NyaXB0aW9uKCksCi0JCQkJCQkJbmV3Q29udGVudCwgLTEpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJY3RybF9zY29wZS5zZXRNb2RhbE9iamVjdChwcm9jZXNzLmdldFByZXNlbnRhdGlvbigpKTsKLQkJY3RybF9zY29wZS5zZXRNb2RhbE9iamVjdEZlYXR1cmUoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0UHJvY2Vzc0Rlc2NyaXB0aW9uX1Njb3BlKCkpOwotCQljdHJsX3Njb3BlLmFkZE1vZGlmeUxpc3RlbmVyKGNvbnRlbnRNb2RpZnlMaXN0ZW5lcik7Ci0JCWN0cmxfc2NvcGUuYWRkTGlzdGVuZXIoU1dULkRlYWN0aXZhdGUsIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQlJTWV0aG9kUmljaFRleHQgY29udHJvbCA9IGRlc2NFeHBhbmRGbGFnID8gY3RybF9leHBhbmRlZAotCQkJCQkJOiBjdHJsX3Njb3BlOwotCQkJCWlmICghY29udHJvbC5nZXRNb2RpZmllZCgpKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJU3RyaW5nIG9sZENvbnRlbnQgPSBjb250ZW50LmdldFNjb3BlKCk7Ci0JCQkJaWYgKCgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpLm11c3RSZXN0b3JlVmFsdWUoCi0JCQkJCQljdHJsX3Njb3BlLCBvbGRDb250ZW50KSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCVN0cmluZyBuZXdDb250ZW50ID0gY29udHJvbC5nZXRUZXh0KCk7Ci0JCQkJaWYgKCFuZXdDb250ZW50LmVxdWFscyhvbGRDb250ZW50KSkgewotCQkJCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuU0VULCBwcm9jZXNzCi0JCQkJCQkJLmdldFByZXNlbnRhdGlvbigpLCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCS5nZXRQcm9jZXNzRGVzY3JpcHRpb25fU2NvcGUoKSwgbmV3Q29udGVudCwgLTEpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJY3RybF91c2FnZV9ub3Rlcy5zZXRNb2RhbE9iamVjdChwcm9jZXNzLmdldFByZXNlbnRhdGlvbigpKTsKLQkJY3RybF91c2FnZV9ub3Rlcy5zZXRNb2RhbE9iamVjdEZlYXR1cmUoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0UHJvY2Vzc0Rlc2NyaXB0aW9uX1VzYWdlTm90ZXMoKSk7Ci0JCWN0cmxfdXNhZ2Vfbm90ZXMuYWRkTW9kaWZ5TGlzdGVuZXIoY29udGVudE1vZGlmeUxpc3RlbmVyKTsKLQkJY3RybF91c2FnZV9ub3Rlcy5hZGRMaXN0ZW5lcihTV1QuRGVhY3RpdmF0ZSwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCUlNZXRob2RSaWNoVGV4dCBjb250cm9sID0gZGVzY0V4cGFuZEZsYWcgPyBjdHJsX2V4cGFuZGVkCi0JCQkJCQk6IGN0cmxfdXNhZ2Vfbm90ZXM7Ci0JCQkJaWYgKCFjb250cm9sLmdldE1vZGlmaWVkKCkpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlTdHJpbmcgb2xkQ29udGVudCA9IGNvbnRlbnQuZ2V0VXNhZ2VOb3RlcygpOwotCQkJCWlmICgoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpKS5tdXN0UmVzdG9yZVZhbHVlKAotCQkJCQkJY3RybF91c2FnZV9ub3Rlcywgb2xkQ29udGVudCkpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlTdHJpbmcgbmV3Q29udGVudCA9IGNvbnRyb2wuZ2V0VGV4dCgpOwotCQkJCWlmICghbmV3Q29udGVudC5lcXVhbHMob2xkQ29udGVudCkpIHsKLQkJCQkJYWN0aW9uTWdyCi0JCQkJCQkJLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlNFVCwgcHJvY2VzcwotCQkJCQkJCQkJLmdldFByZXNlbnRhdGlvbigpLCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJLmdldFByb2Nlc3NEZXNjcmlwdGlvbl9Vc2FnZU5vdGVzKCksCi0JCQkJCQkJCQluZXdDb250ZW50LCAtMSk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQotCQljdHJsX2FsdGVybmF0aXZlcy5zZXRNb2RhbE9iamVjdChwcm9jZXNzLmdldFByZXNlbnRhdGlvbigpKTsKLQkJY3RybF9hbHRlcm5hdGl2ZXMuc2V0TW9kYWxPYmplY3RGZWF0dXJlKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldEFjdGl2aXR5RGVzY3JpcHRpb25fQWx0ZXJuYXRpdmVzKCkpOwotCQljdHJsX2FsdGVybmF0aXZlcy5hZGRNb2RpZnlMaXN0ZW5lcihjb250ZW50TW9kaWZ5TGlzdGVuZXIpOwotCQljdHJsX2FsdGVybmF0aXZlcy5hZGRMaXN0ZW5lcihTV1QuRGVhY3RpdmF0ZSwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCUlNZXRob2RSaWNoVGV4dCBjb250cm9sID0gZGVzY0V4cGFuZEZsYWcgPyBjdHJsX2V4cGFuZGVkCi0JCQkJCQk6IGN0cmxfYWx0ZXJuYXRpdmVzOwotCQkJCWlmICghY29udHJvbC5nZXRNb2RpZmllZCgpKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJU3RyaW5nIG9sZENvbnRlbnQgPSBjb250ZW50LmdldEFsdGVybmF0aXZlcygpOwotCQkJCWlmICgoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpKS5tdXN0UmVzdG9yZVZhbHVlKAotCQkJCQkJY3RybF9hbHRlcm5hdGl2ZXMsIG9sZENvbnRlbnQpKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJU3RyaW5nIG5ld0NvbnRlbnQgPSBjb250cm9sLmdldFRleHQoKTsKLQkJCQlpZiAoIW5ld0NvbnRlbnQuZXF1YWxzKG9sZENvbnRlbnQpKSB7Ci0JCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5TRVQsIHByb2Nlc3MKLQkJCQkJCQkuZ2V0UHJlc2VudGF0aW9uKCksIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJLmdldEFjdGl2aXR5RGVzY3JpcHRpb25fQWx0ZXJuYXRpdmVzKCksIG5ld0NvbnRlbnQsCi0JCQkJCQkJLTEpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJY3RybF9ob3dfdG9fc3RhZmYuc2V0TW9kYWxPYmplY3QocHJvY2Vzcy5nZXRQcmVzZW50YXRpb24oKSk7Ci0JCWN0cmxfaG93X3RvX3N0YWZmLnNldE1vZGFsT2JqZWN0RmVhdHVyZShVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRBY3Rpdml0eURlc2NyaXB0aW9uX0hvd3RvU3RhZmYoKSk7Ci0JCWN0cmxfaG93X3RvX3N0YWZmLmFkZE1vZGlmeUxpc3RlbmVyKGNvbnRlbnRNb2RpZnlMaXN0ZW5lcik7Ci0JCWN0cmxfaG93X3RvX3N0YWZmLmFkZExpc3RlbmVyKFNXVC5EZWFjdGl2YXRlLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJSU1ldGhvZFJpY2hUZXh0IGNvbnRyb2wgPSBkZXNjRXhwYW5kRmxhZyA/IGN0cmxfZXhwYW5kZWQKLQkJCQkJCTogY3RybF9ob3dfdG9fc3RhZmY7Ci0JCQkJaWYgKCFjb250cm9sLmdldE1vZGlmaWVkKCkpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlTdHJpbmcgb2xkQ29udGVudCA9IGNvbnRlbnQuZ2V0SG93dG9TdGFmZigpOwotCQkJCWlmICgoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpKS5tdXN0UmVzdG9yZVZhbHVlKAotCQkJCQkJY3RybF9ob3dfdG9fc3RhZmYsIG9sZENvbnRlbnQpKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJU3RyaW5nIG5ld0NvbnRlbnQgPSBjb250cm9sLmdldFRleHQoKTsKLQkJCQlpZiAoIW5ld0NvbnRlbnQuZXF1YWxzKG9sZENvbnRlbnQpKSB7Ci0JCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5TRVQsIHByb2Nlc3MKLQkJCQkJCQkuZ2V0UHJlc2VudGF0aW9uKCksIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJLmdldEFjdGl2aXR5RGVzY3JpcHRpb25fSG93dG9TdGFmZigpLCBuZXdDb250ZW50LAotCQkJCQkJCS0xKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JCWN0cmxfa2V5X2NvbnNpZGVyYXRpb24uc2V0TW9kYWxPYmplY3QocHJvY2Vzcy5nZXRQcmVzZW50YXRpb24oKSk7Ci0JCWN0cmxfa2V5X2NvbnNpZGVyYXRpb24uc2V0TW9kYWxPYmplY3RGZWF0dXJlKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldENvbnRlbnREZXNjcmlwdGlvbl9LZXlDb25zaWRlcmF0aW9ucygpKTsKLQkJY3RybF9rZXlfY29uc2lkZXJhdGlvbi5hZGRNb2RpZnlMaXN0ZW5lcihjb250ZW50TW9kaWZ5TGlzdGVuZXIpOwotCQljdHJsX2tleV9jb25zaWRlcmF0aW9uLmFkZExpc3RlbmVyKFNXVC5EZWFjdGl2YXRlLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJSU1ldGhvZFJpY2hUZXh0IGNvbnRyb2wgPSBkZXNjRXhwYW5kRmxhZyA/IGN0cmxfZXhwYW5kZWQKLQkJCQkJCTogY3RybF9rZXlfY29uc2lkZXJhdGlvbjsKLQkJCQlpZiAoIWNvbnRyb2wuZ2V0TW9kaWZpZWQoKSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCVN0cmluZyBvbGRDb250ZW50ID0gY29udGVudC5nZXRLZXlDb25zaWRlcmF0aW9ucygpOwotCQkJCWlmICgoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpKS5tdXN0UmVzdG9yZVZhbHVlKAotCQkJCQkJY3RybF9rZXlfY29uc2lkZXJhdGlvbiwgb2xkQ29udGVudCkpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlTdHJpbmcgbmV3Q29udGVudCA9IGNvbnRyb2wuZ2V0VGV4dCgpOwotCQkJCWlmICghbmV3Q29udGVudC5lcXVhbHMob2xkQ29udGVudCkpIHsKLQkJCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlNFVCwgcHJvY2VzcwotCQkJCQkJCS5nZXRQcmVzZW50YXRpb24oKSwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkuZ2V0Q29udGVudERlc2NyaXB0aW9uX0tleUNvbnNpZGVyYXRpb25zKCksCi0JCQkJCQkJbmV3Q29udGVudCwgLTEpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJY29uZmlnTGlzdFZpZXdlcgotCQkJCS5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGNvbmZpZ0xpc3RWaWV3ZXIKLQkJCQkJCQkJLmdldFNlbGVjdGlvbigpOwotCQkJCQkJaWYgKHNlbGVjdGlvbi5zaXplKCkgPT0gMSkgewotCQkJCQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gKChNZXRob2RDb25maWd1cmF0aW9uKSBzZWxlY3Rpb24KLQkJCQkJCQkJCS5nZXRGaXJzdEVsZW1lbnQoKSk7Ci0JCQkJCQkJaWYgKGNvbmZpZyA9PSBwcm9jZXNzLmdldERlZmF1bHRDb250ZXh0KCkpIHsKLQkJCQkJCQkJYnV0dG9uUmVtb3ZlLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCWJ1dHRvblJlbW92ZS5zZXRFbmFibGVkKHRydWUpOwotCQkJCQkJCX0KLQkJCQkJCQlTdHJpbmcgZGVzYyA9IGNvbmZpZy5nZXRCcmllZkRlc2NyaXB0aW9uKCk7Ci0JCQkJCQkJaWYgKGRlc2MgPT0gbnVsbCkgewotCQkJCQkJCQlkZXNjID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQl9Ci0JCQkJCQkJdGV4dENvbmZpZ0Rlc2NyaXB0aW9uLnNldFRleHQoZGVzYyk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9KTsKLQotCQlidXR0b25BZGQuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlNZXRob2RMaWJyYXJ5IGxpYiA9IFVtYVV0aWwuZ2V0TWV0aG9kTGlicmFyeShwcm9jZXNzKTsKLQotCQkJCWZpbmFsIENvbmZpZ3VyYXRpb25zSXRlbVByb3ZpZGVyIGlucHV0ID0gbmV3IENvbmZpZ3VyYXRpb25zSXRlbVByb3ZpZGVyKAotCQkJCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJCQkJLmdldE5hdmlnYXRvclZpZXdfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJbGliLCAiIik7IC8vJE5PTi1OTFMtMSQKLQotCQkJCUxpc3RTZWxlY3Rpb25EaWFsb2cgZGxnID0gbmV3IExpc3RTZWxlY3Rpb25EaWFsb2coCi0JCQkJCQlEaXNwbGF5LmdldEN1cnJlbnQoKS5nZXRBY3RpdmVTaGVsbCgpLAotCQkJCQkJaW5wdXQsCi0JCQkJCQljb250ZW50UHJvdmlkZXIsCi0JCQkJCQlsYWJlbFByb3ZpZGVyLAotCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuUHJvY2Vzc0Rlc2NyaXB0aW9uX3NlbGVjdENvbmZpZ3VyYXRpb24pIHsgCi0JCQkJCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkgewotCQkJCQkJQ29udHJvbCBjb250cm9sID0gc3VwZXIuY3JlYXRlRGlhbG9nQXJlYShwYXJlbnQpOwotCQkJCQkJZ2V0Vmlld2VyKCkuYWRkRmlsdGVyKG5ldyBWaWV3ZXJGaWx0ZXIoKSB7Ci0KLQkJCQkJCQlwdWJsaWMgYm9vbGVhbiBzZWxlY3QoVmlld2VyIHZpZXdlciwKLQkJCQkJCQkJCU9iamVjdCBwYXJlbnRFbGVtZW50LCBPYmplY3QgZWxlbWVudCkgewotCQkJCQkJCQkvLyBpbnQgY291bnQgPQotCQkJCQkJCQkvLyBjb25maWdMaXN0Vmlld2VyLmdldExpc3QoKS5nZXRJdGVtQ291bnQoKTsKLQkJCQkJCQkJLy8gZm9yKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLQkJCQkJCQkJLy8gaWYoZWxlbWVudCA9PQotCQkJCQkJCQkvLyBjb25maWdMaXN0Vmlld2VyLmdldEVsZW1lbnRBdChpKSkgcmV0dXJuCi0JCQkJCQkJCS8vIGZhbHNlOwotCQkJCQkJCQkvLyB9Ci0JCQkJCQkJCS8vIHJldHVybiB0cnVlOwotCQkJCQkJCQlyZXR1cm4gIXByb2Nlc3MuZ2V0VmFsaWRDb250ZXh0KCkuY29udGFpbnMoCi0JCQkJCQkJCQkJZWxlbWVudCk7Ci0JCQkJCQkJfQotCi0JCQkJCQl9KTsKLQkJCQkJCXJldHVybiBjb250cm9sOwotCQkJCQl9Ci0KLQkJCQkJcHVibGljIGJvb2xlYW4gY2xvc2UoKSB7Ci0JCQkJCQlpbnB1dC5kaXNwb3NlKCk7Ci0JCQkJCQlyZXR1cm4gc3VwZXIuY2xvc2UoKTsKLQkJCQkJfQotCQkJCX07Ci0JCQkJaWYgKGRsZy5vcGVuKCkgPT0gV2luZG93Lk9LKSB7Ci0JCQkJCU9iamVjdCBvYnNbXSA9IGRsZy5nZXRSZXN1bHQoKTsKLQkJCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWc7Ci0JCQkJCS8vIGdldCBkZWZhdWx0IGNvbmZpZ3VyYXRpb24KLS8vCQkJCQlNZXRob2RDb25maWd1cmF0aW9uIGRlZmF1bHRDb25maWcgPSBwcm9jZXNzCi0vLwkJCQkJCQkuZ2V0RGVmYXVsdENvbnRleHQoKTsKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBvYnMubGVuZ3RoOyBpKyspIHsKLQkJCQkJCWNvbmZpZyA9IChNZXRob2RDb25maWd1cmF0aW9uKSBvYnNbaV07Ci0JCQkJCQlpZiAoY29uZmlnICE9IG51bGwpIHsKLS8vCQkJCQkJCQl8fCBjaGVja1ZhbGlkaXR5Rm9yU3VwZXJTZXQoZGVmYXVsdENvbmZpZywKLS8vCQkJCQkJCQkJCWNvbmZpZykpIHsKLQkJCQkJCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuQURELCBwcm9jZXNzLAotCQkJCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCQkJLmdldFByb2Nlc3NfVmFsaWRDb250ZXh0KCksIGNvbmZpZywKLQkJCQkJCQkJCS0xKTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4KLQkJCQkJCQkJCS5nZXREZWZhdWx0KCkKLQkJCQkJCQkJCS5nZXRNc2dEaWFsb2coKQotCQkJCQkJCQkJLmRpc3BsYXlFcnJvcigKLQkJCQkJCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuYWRkQ29uZmlnRXJyb3JEaWFsb2dfdGl0bGUsIAotCQkJCQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5iaW5kKEF1dGhvcmluZ1VJUmVzb3VyY2VzLmludmFsaWRDb25maWdFcnJvcl9tc2csIGNvbmZpZy5nZXROYW1lKCkpKTsgCi0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JCWJ1dHRvblJlbW92ZS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgY29uZmlnTGlzdFZpZXdlcgotCQkJCQkJLmdldFNlbGVjdGlvbigpOwotCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5SRU1PVkVfTUFOWSwgcHJvY2VzcywKLQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFByb2Nlc3NfVmFsaWRDb250ZXh0KCksCi0JCQkJCQlzZWxlY3Rpb24udG9MaXN0KCksIC0xKTsKLQkJCX0KLQkJfSk7Ci0KLQkJYnV0dG9uTWFrZURlZmF1bHQuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGNvbmZpZ0xpc3RWaWV3ZXIKLQkJCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQkJCQlpZiAoc2VsZWN0aW9uLnNpemUoKSA9PSAxKSB7Ci0JCQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY3VycmVudENvbmZpZyA9IHByb2Nlc3MKLQkJCQkJCQkuZ2V0RGVmYXVsdENvbnRleHQoKTsKLQotCQkJCQlpZiAoY3VycmVudENvbmZpZyAhPSBzZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCkpIHsKLQkJCQkJCWJvb2xlYW4gaXNWYWxpZCA9IHRydWU7Ci0JCQkJCQlMaXN0IHZhbGlkQ29udGV4dCA9IHByb2Nlc3MuZ2V0VmFsaWRDb250ZXh0KCk7Ci0JCQkJCQlmb3IgKEl0ZXJhdG9yIGl0b3IgPSB2YWxpZENvbnRleHQuaXRlcmF0b3IoKTsgaXRvcgotCQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gKE1ldGhvZENvbmZpZ3VyYXRpb24pIGl0b3IKLQkJCQkJCQkJCS5uZXh0KCk7Ci0JCQkJCQkJaWYgKCEoY2hlY2tWYWxpZGl0eUZvclN1cGVyU2V0KAotCQkJCQkJCQkJKE1ldGhvZENvbmZpZ3VyYXRpb24pIHNlbGVjdGlvbgotCQkJCQkJCQkJCQkuZ2V0Rmlyc3RFbGVtZW50KCksIGNvbmZpZykpKSB7Ci0JCQkJCQkJCWlzVmFsaWQgPSBmYWxzZTsKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJaWYgKGlzVmFsaWQpIHsKLQkJCQkJCQlib29sZWFuIHN0YXR1cyA9IGFjdGlvbk1nci5kb0FjdGlvbigKLQkJCQkJCQkJCUlBY3Rpb25NYW5hZ2VyLlNFVCwgcHJvY2VzcywKLQkJCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJCS5nZXRQcm9jZXNzX0RlZmF1bHRDb250ZXh0KCksCi0JCQkJCQkJCQlzZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCksIC0xKTsKLQkJCQkJCQlpZiAoIXN0YXR1cykKLQkJCQkJCQkJcmV0dXJuOwotCQkJCQkJCWJ1dHRvblJlbW92ZS5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJU3RyaW5nIHNlbGVjdGVkQ29uZmlnTmFtZSA9ICgoTWV0aG9kQ29uZmlndXJhdGlvbikgc2VsZWN0aW9uCi0JCQkJCQkJCQkuZ2V0Rmlyc3RFbGVtZW50KCkpLmdldE5hbWUoKTsKLQkJCQkJCQlBdXRob3JpbmdVSVBsdWdpbgotCQkJCQkJCQkJLmdldERlZmF1bHQoKQotCQkJCQkJCQkJLmdldE1zZ0RpYWxvZygpCi0JCQkJCQkJCQkuZGlzcGxheUVycm9yKAotCQkJCQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5zZXREZWZhdWx0Q29uZmlnRXJyb3JEaWFsb2dfdGl0bGUsIAotCQkJCQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5iaW5kKEF1dGhvcmluZ1VJUmVzb3VyY2VzLnNldERlZmF1bHRDb25maWdFcnJvcl9tc2csIHNlbGVjdGVkQ29uZmlnTmFtZSkpOyAKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JfQotCi0JLyoqCi0JICogUmVmcmVzaCBhbGwgdGhlIGNvbnRyb2xzCi0JICogCi0JICogQHBhcmFtIGVkaXRhYmxlCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaChib29sZWFuIGVkaXRhYmxlKSB7Ci0JCWlmICghY3RybF9uYW1lLmlzRGlzcG9zZWQoKSkgewotCQkJY3RybF9uYW1lLnNldEVkaXRhYmxlKGVkaXRhYmxlKTsKLQkJfQotCQlpZiAoIWN0cmxfcHJlc2VudGF0aW9uX25hbWUuaXNEaXNwb3NlZCgpKSB7Ci0JCQljdHJsX3ByZXNlbnRhdGlvbl9uYW1lLnNldEVkaXRhYmxlKGVkaXRhYmxlKTsKLQkJfQotCQlpZiAoQXV0aG9yaW5nVUlQcmVmZXJlbmNlcy5nZXRTaG93TG9uZ1ByZXNlbnRhdGlvbk5hbWUoKSkgewotCQkJaWYgKCFjdHJsX2xvbmdfcHJlc2VudGF0aW9uX25hbWUuaXNEaXNwb3NlZCgpKSB7Ci0JCQkJY3RybF9sb25nX3ByZXNlbnRhdGlvbl9uYW1lLnNldEVkaXRhYmxlKGVkaXRhYmxlKTsKLQkJCX0KLQkJfQotCQlpZiAoIWN0cmxfYnJpZWZfZGVzYy5pc0Rpc3Bvc2VkKCkpIHsKLQkJCWN0cmxfYnJpZWZfZGVzYy5zZXRFZGl0YWJsZShlZGl0YWJsZSk7Ci0JCX0KLQkJaWYgKCFjdHJsX3B1cnBvc2UuaXNEaXNwb3NlZCgpKSB7Ci0JCQljdHJsX3B1cnBvc2Uuc2V0RWRpdGFibGUoZWRpdGFibGUpOwotCQl9Ci0JCWlmICghY3RybF9mdWxsX2Rlc2MuaXNEaXNwb3NlZCgpKSB7Ci0JCQljdHJsX2Z1bGxfZGVzYy5zZXRFZGl0YWJsZShlZGl0YWJsZSk7Ci0JCX0KLQkJaWYgKCFjdHJsX2FsdGVybmF0aXZlcy5pc0Rpc3Bvc2VkKCkpIHsKLQkJCWN0cmxfYWx0ZXJuYXRpdmVzLnNldEVkaXRhYmxlKGVkaXRhYmxlKTsKLQkJfQotCQlpZiAoIWN0cmxfZXh0ZXJuYWxfaWQuaXNEaXNwb3NlZCgpKQotCQkJY3RybF9leHRlcm5hbF9pZC5zZXRFZGl0YWJsZShlZGl0YWJsZSk7Ci0JCWlmICghY3RybF9rZXlfY29uc2lkZXJhdGlvbi5pc0Rpc3Bvc2VkKCkpCi0JCQljdHJsX2tleV9jb25zaWRlcmF0aW9uLnNldEVkaXRhYmxlKGVkaXRhYmxlKTsKLQkJaWYgKCFjdHJsX2hvd190b19zdGFmZi5pc0Rpc3Bvc2VkKCkpCi0JCQljdHJsX2hvd190b19zdGFmZi5zZXRFZGl0YWJsZShlZGl0YWJsZSk7Ci0JCWlmICghY3RybF9zY29wZS5pc0Rpc3Bvc2VkKCkpCi0JCQljdHJsX3Njb3BlLnNldEVkaXRhYmxlKGVkaXRhYmxlKTsKLQkJaWYgKCFjdHJsX3VzYWdlX25vdGVzLmlzRGlzcG9zZWQoKSkKLQkJCWN0cmxfdXNhZ2Vfbm90ZXMuc2V0RWRpdGFibGUoZWRpdGFibGUpOwotCQlpZiAoY3RybF9leHBhbmRlZCAhPSBudWxsICYmICFjdHJsX2V4cGFuZGVkLmlzRGlzcG9zZWQoKSkgewotCQkJY3RybF9leHBhbmRlZC5zZXRFZGl0YWJsZShlZGl0YWJsZSk7Ci0JCX0KLQkJaWYgKCFidXR0b25BZGQuaXNEaXNwb3NlZCgpKQotCQkJYnV0dG9uQWRkLnNldEVuYWJsZWQoZWRpdGFibGUpOwotCQlpZiAoIWJ1dHRvbk1ha2VEZWZhdWx0LmlzRGlzcG9zZWQoKSkKLQkJCWJ1dHRvbk1ha2VEZWZhdWx0LnNldEVuYWJsZWQoZWRpdGFibGUpOwotCQlpZiAoIWJ1dHRvblJlbW92ZS5pc0Rpc3Bvc2VkKCkpCi0JCQlidXR0b25SZW1vdmUuc2V0RW5hYmxlZChlZGl0YWJsZSk7Ci0JfQotCi0JLyoqCi0JICogQ2hlY2tzIHdoZXRoZXIgZGVmYXVsdCBjb25maWd1cmF0aW9uIGlzIHN1cGVyc2V0IG9mIHNlbGVjdGVkCi0JICogY29uZmlndXJhdGlvbiBvciBub3QKLQkgKiAKLQkgKiBAcGFyYW0gY29uZmlnCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBjaGVja1ZhbGlkaXR5Rm9yU3VwZXJTZXQoTWV0aG9kQ29uZmlndXJhdGlvbiBkZWZhdWx0Q29uZmlnLAotCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLQkJLy8gZ2V0IGRlZmF1bHQgcGx1Z2lucyBhbmQgcGFja2FnZXMKLQkJTGlzdCBkZWZhdWx0UGx1Z2lucyA9IGRlZmF1bHRDb25maWcuZ2V0TWV0aG9kUGx1Z2luU2VsZWN0aW9uKCk7Ci0JCUxpc3QgZGVmYXVsdFBhY2thZ2VzID0gZGVmYXVsdENvbmZpZy5nZXRNZXRob2RQYWNrYWdlU2VsZWN0aW9uKCk7Ci0KLQkJLy8gZ2V0IGNvbmZpdWdyYXRpb24gcGx1Z2lucyBhbmQgcGFjYWtnZXMKLQkJTGlzdCBwYWNrYWdlcyA9IGNvbmZpZy5nZXRNZXRob2RQYWNrYWdlU2VsZWN0aW9uKCk7Ci0JCUxpc3QgcGx1Z2lucyA9IGNvbmZpZy5nZXRNZXRob2RQbHVnaW5TZWxlY3Rpb24oKTsKLQkJYm9vbGVhbiBwbHVnaW5Db250YWlucyA9IGZhbHNlOwotCQlib29sZWFuIHBhY2thZ2VDb250YWlucyA9IGZhbHNlOwotCQlpZiAoKHBsdWdpbnMgIT0gbnVsbCkgKSB7Ci0JCQlwbHVnaW5Db250YWlucyA9IGRlZmF1bHRQbHVnaW5zLmNvbnRhaW5zQWxsKHBsdWdpbnMpOwotCQl9Ci0JCWlmICgocGFja2FnZXMgIT0gbnVsbCkgKSB7Ci0JCQlwYWNrYWdlQ29udGFpbnMgPSBkZWZhdWx0UGFja2FnZXMuY29udGFpbnNBbGwocGFja2FnZXMpOwotCQl9Ci0KLQkJcmV0dXJuIChwbHVnaW5Db250YWlucykgJiYgKHBhY2thZ2VDb250YWlucyk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZW5hYmxlU2VjdGlvbnMoYm9vbGVhbiBlbmFibGUpIHsKLQkJZ2VuZXJhbFNlY3Rpb24uc2V0VmlzaWJsZShlbmFibGUpOwotCQlpZiAoZW5hYmxlKSB7Ci0JCQlnZW5lcmFsU2VjdGlvbi5zZXRFeHBhbmRlZChnZW5lcmFsU2VjdGlvbkV4cGFuZEZsYWcpOwotCQl9IGVsc2UgewotCQkJZ2VuZXJhbFNlY3Rpb25FeHBhbmRGbGFnID0gZ2VuZXJhbFNlY3Rpb24uaXNFeHBhbmRlZCgpOwotCQkJZ2VuZXJhbFNlY3Rpb24uc2V0RXhwYW5kZWQoZW5hYmxlKTsKLQkJfQotCi0JCWRldGFpbFNlY3Rpb24uc2V0VmlzaWJsZShlbmFibGUpOwotCQlpZiAoZW5hYmxlKSB7Ci0JCQlkZXRhaWxTZWN0aW9uLnNldEV4cGFuZGVkKGRldGFpbFNlY3Rpb25FeHBhbmRGbGFnKTsKLQkJfSBlbHNlIHsKLQkJCWRldGFpbFNlY3Rpb25FeHBhbmRGbGFnID0gZGV0YWlsU2VjdGlvbi5pc0V4cGFuZGVkKCk7Ci0JCQlkZXRhaWxTZWN0aW9uLnNldEV4cGFuZGVkKGVuYWJsZSk7Ci0JCX0KLQkJY29uZmlnU2VjdGlvbi5zZXRWaXNpYmxlKGVuYWJsZSk7Ci0JCWlmIChlbmFibGUpIHsKLQkJCWNvbmZpZ1NlY3Rpb24uc2V0RXhwYW5kZWQoY29uZmlnU2VjdGlvbkV4cGFuZEZsYWcpOwotCQl9IGVsc2UgewotCQkJY29uZmlnU2VjdGlvbkV4cGFuZEZsYWcgPSBjb25maWdTZWN0aW9uLmlzRXhwYW5kZWQoKTsKLQkJCWNvbmZpZ1NlY3Rpb24uc2V0RXhwYW5kZWQoZW5hYmxlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNldCBuYW1lIGZvciB0aGUgZm9ybQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZvcm1UZXh0KCkgewotCi0JCWZvcm0uc2V0VGV4dChMaWJyYXJ5VUlUZXh0LmdldFVJVGV4dChwcm9jZXNzKQotCQkJCSsgIjogIiArIG1ldGhvZEVsZW1lbnQuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFJlZnJlc2ggZm9ybSBuYW1lCi0JICogQHBhcmFtIG5ld05hbWUKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWZyZXNoRWxlbWVudE5hbWUoZmluYWwgU3RyaW5nIG5ld05hbWUpIHsKLQkJaWYgKG5ld05hbWUgIT0gbnVsbCkgewotCQkJaWYgKChjdHJsX25hbWUgIT0gbnVsbCkgJiYgIShjdHJsX25hbWUuaXNEaXNwb3NlZCgpKSkgewotCQkJCVJ1bm5hYmxlIHJ1bm5hYmxlID0gbmV3IFJ1bm5hYmxlKCkgewotCi0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCWN0cmxfbmFtZS5yZW1vdmVNb2RpZnlMaXN0ZW5lcihuYW1lTW9kaWZ5TGlzdGVuZXIpOwotCQkJCQkJY3RybF9uYW1lLnNldFRleHQobmV3TmFtZSk7Ci0JCQkJCQljdHJsX25hbWUuYWRkTW9kaWZ5TGlzdGVuZXIobmFtZU1vZGlmeUxpc3RlbmVyKTsKLQkJCQkJCXNldEZvcm1UZXh0KCk7Ci0JCQkJCX0KLQkJCQkJCi0JCQkJfTsKLQkJCQlpZiAoY3RybF9uYW1lLmdldERpc3BsYXkoKS5nZXRUaHJlYWQoKSA9PSBUaHJlYWQuY3VycmVudFRocmVhZCgpKSB7Ci0JCQkJCXJ1bm5hYmxlLnJ1bigpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWN0cmxfbmFtZS5nZXREaXNwbGF5KCkuc3luY0V4ZWMocnVubmFibGUpOwotCQkJCX0KLQotCQkJfQotCQl9Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0Q29udGV4dEhlbHAoKSB7Ci0JCXN1cGVyLnNldENvbnRleHRIZWxwKCk7Ci0JCUVkaXRvcnNDb250ZXh0SGVscGVyLnNldEhlbHAoZ2V0UGFydENvbnRyb2woKSwgcHJvY2Vzc1R5cGUpOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvUHJvY2Vzc0Zvcm1QYWdlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL1Byb2Nlc3NGb3JtUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MmJjNmUzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvUHJvY2Vzc0Zvcm1QYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLk1ldGhvZEVsZW1lbnRFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuRm9ybUVkaXRvcjsKLQotCi0vKioKLSAqIFRoZSBiYXNlIGNsYXNzIGZvciBhbGwgUHJvY2VzcyBmb3JtIHBhZ2VzLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9jZXNzRm9ybVBhZ2UgZXh0ZW5kcyBEZXNjcmlwdGlvbkZvcm1QYWdlIHsKLQotCXByb3RlY3RlZCBQcm9jZXNzIHByb2Nlc3M7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqIAotCSAqIEBwYXJhbSBlZGl0b3IKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgZm9ybSBlZGl0b3IuCi0JICogQHBhcmFtIGlkCi0JICogICAgICAgICAgICBUaGUgdW5pcXVlIElEIGZvciB0aGUgZm9ybSBwYWdlLgotCSAqIEBwYXJhbSB0aXRsZQotCSAqICAgICAgICAgICAgVGhlIHRpdGxlIGZvciB0aGUgZm9ybSBwYWdlLgotCSAqLwotCXB1YmxpYyBQcm9jZXNzRm9ybVBhZ2UoRm9ybUVkaXRvciBlZGl0b3IsIFN0cmluZyBpZCwgU3RyaW5nIHRpdGxlKSB7Ci0JCXN1cGVyKGVkaXRvciwgaWQsIHRpdGxlKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQmFzZUZvcm1QYWdlI2luaXQob3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGUsIG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElFZGl0b3JTaXRlIHNpdGUsIElFZGl0b3JJbnB1dCBpbnB1dCkgewotCQlzdXBlci5pbml0KHNpdGUsIGlucHV0KTsKLQotCQkvLyBHZXQgdGhlIFByb2Nlc3Mgb2JqZWN0IGZyb20gdGhlIGVkaXRvciBpbnB1dC4KLQkJTWV0aG9kRWxlbWVudEVkaXRvcklucHV0IG1ldGhvZEVsZW1lbnRJbnB1dCA9IChNZXRob2RFbGVtZW50RWRpdG9ySW5wdXQpIGlucHV0OwotCi0JCU9iamVjdCBvYmogPSBtZXRob2RFbGVtZW50SW5wdXQuZ2V0TWV0aG9kRWxlbWVudCgpOwotCQlpZiAob2JqIGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkgewotCQkJcHJvY2VzcyA9ICgoUHJvY2Vzc0NvbXBvbmVudCkgb2JqKS5nZXRQcm9jZXNzKCk7Ci0JCX0KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgT2JqZWN0IGdldENvbnRlbnRFbGVtZW50KCkgewotCQlyZXR1cm4gcHJvY2VzczsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvUHJvY2Vzc0Zvcm1VdGlsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL1Byb2Nlc3NGb3JtVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MDBkMWMyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvUHJvY2Vzc0Zvcm1VdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQmFzaWNFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLkNvbHVtbkRlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLlByb2Nlc3NFZGl0b3I7Ci0KLWltcG9ydCBjb20uaWJtLmljdS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotLyoqCi0gKiBIZWxwZXIgY2xhc3MgZm9yIHRoZSBQcm9jZXNzIGVkaXRvciBmb3JtIHBhZ2VzLgotICogCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUHJvY2Vzc0Zvcm1VdGlsIHsKLQotCS8qKgotCSAqIENvbnZlcnRzIHN0cmluZyByZXByZXNlbnRhdGlvbiBpbnRvIGNvbHVtbiBkZXNjcmlwdG9ycyBsaXN0Ci0JICogQHBhcmFtIHN0cgotCSAqIEByZXR1cm4KLQkgKiAJCUxpc3Qgb2YgY29sdW1uIGRlc2NyaXB0b3JzCi0JICovCi0JcHVibGljIHN0YXRpYyBFTGlzdCB0b0NvbHVtbkRlc2NyaXB0b3JMaXN0KFN0cmluZyBzdHIpIHsKLQkJRUxpc3QgY29sdW1uRGVzY3JpcHRvcnMgPSBuZXcgQmFzaWNFTGlzdCgpOwotCQlTdHJpbmdUb2tlbml6ZXIgdG9rZW5zID0gbmV3IFN0cmluZ1Rva2VuaXplcihzdHIsICIsIik7IC8vJE5PTi1OTFMtMSQKLQkJd2hpbGUgKHRva2Vucy5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJCVN0cmluZyB0b2tlbiA9IHRva2Vucy5uZXh0VG9rZW4oKTsKLQkJCU9iamVjdCBjb2x1bW5EZXNjcmlwdG9yID0gUHJvY2Vzc0VkaXRvci5pZFRvQ29sdW1uRGVzY3JpcHRvck1hcAotCQkJCQkuZ2V0KHRva2VuKTsKLQkJCWlmIChjb2x1bW5EZXNjcmlwdG9yICE9IG51bGwpIHsKLQkJCQljb2x1bW5EZXNjcmlwdG9ycy5hZGQoY29sdW1uRGVzY3JpcHRvcik7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGNvbHVtbkRlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIENvbnZlcnRzIHN0cmluZyByZXByZXNlbnRhdGlvbiBpbnRvIGNvbHVtbiBkZXNjcmlwdG9ycyBhcnJheSBsaXN0Ci0JICogQHBhcmFtIHN0cgotCSAqIEByZXR1cm4KLQkgKiAJCUFycmF5IGlzdCBvZiBjb2x1bW4gZGVzY3JpcHRvcnMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIENvbHVtbkRlc2NyaXB0b3JbXSB0b0NvbHVtbkRlc2NyaXB0b3JzKFN0cmluZyBzdHIpIHsKLQkJTGlzdCBsaXN0ID0gdG9Db2x1bW5EZXNjcmlwdG9yTGlzdChzdHIpOwotCQlDb2x1bW5EZXNjcmlwdG9yW10gY29sdW1ucyA9IG5ldyBDb2x1bW5EZXNjcmlwdG9yW2xpc3Quc2l6ZSgpXTsKLQkJbGlzdC50b0FycmF5KGNvbHVtbnMpOwotCQlyZXR1cm4gY29sdW1uczsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvUm9sZUNhdGVnb3JpZXNQYWdlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL1JvbGVDYXRlZ29yaWVzUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjODA1NzAyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvUm9sZUNhdGVnb3JpZXNQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3JtczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZpbHRlcnMuQ2F0ZWdvcnlGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5maWx0ZXJzLkN1c3RvbUNhdGVnb3J5RmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuRmlsdGVyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuTGlicmFyeU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DdXN0b21DYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5Bc3NvY2lhdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuZWRpdG9yLkZvcm1FZGl0b3I7Ci0KLQotLyoqCi0gKiBUaGUgQ2F0ZWdvcmllcyBwYWdlIGluIHRoZSBSb2xlIGVkaXRvci4KLSAqIAotICogQGF1dGhvciBKZWZmIEhhcmR5Ci0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFJvbGVDYXRlZ29yaWVzUGFnZSBleHRlbmRzIEFzc29jaWF0aW9uRm9ybVBhZ2UgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZPUk1fUEFHRV9JRCA9ICJyb2xlQ2F0ZWdvcmllc1BhZ2UiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIFJvbGUgcm9sZTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFJvbGVDYXRlZ29yaWVzUGFnZShGb3JtRWRpdG9yIGVkaXRvcikgewotCQlzdXBlcihlZGl0b3IsIEZPUk1fUEFHRV9JRCwgQXV0aG9yaW5nVUlUZXh0LkNBVEVHT1JJRVNfUEFHRV9USVRMRSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjaW5pdChvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZSwgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0KQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSUVkaXRvclNpdGUgc2l0ZSwgSUVkaXRvcklucHV0IGlucHV0KSB7Ci0JCXN1cGVyLmluaXQoc2l0ZSwgaW5wdXQpOwotCQlyb2xlID0gKFJvbGUpIGNvbnRlbnRFbGVtZW50OwotCQlzZXRBbGxvd0NoYW5nZTEodHJ1ZSk7Ci0JCXNldEFsbG93Q2hhbmdlMih0cnVlKTsKLQkJc2V0VXNlQ2F0ZWdvcnkzKGZhbHNlKTsKLQkJc2V0Q2F0ZWdvcnlJc1NpbmdsZVNlbGVjdGlvbjEoZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2luaXRDb250ZW50UHJvdmlkZXJTZWxlY3RlZCgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdENvbnRlbnRQcm92aWRlclNlbGVjdGVkKCkgewotCQljb250ZW50UHJvdmlkZXJTZWxlY3RlZCA9IG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcigKLQkJCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkJLmdldE5hdmlnYXRvclZpZXdfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKSB7Ci0JCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IG9iamVjdCkgewotCQkJCXJldHVybiBBc3NvY2lhdGlvbkhlbHBlci5nZXRSb2xlU2V0cygoUm9sZSkgb2JqZWN0KS50b0FycmF5KCk7Ci0JCQl9Ci0JCX07Ci0JCXZpZXdlcl9zZWxlY3RlZC5zZXRDb250ZW50UHJvdmlkZXIoY29udGVudFByb3ZpZGVyU2VsZWN0ZWQpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2FkZEl0ZW1zVG9Nb2RlbDEoQXJyYXlMaXN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEl0ZW1zVG9Nb2RlbDEoQXJyYXlMaXN0IGFkZEl0ZW1zKSB7Ci0JCS8vIFVwZGF0ZSB0aGUgbW9kZWwuCi0JCWlmICghYWRkSXRlbXMuaXNFbXB0eSgpKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gYWRkSXRlbXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCVJvbGVTZXQgcm9sZVNldCA9IChSb2xlU2V0KSBpdC5uZXh0KCk7Ci0JCQkJLy8gVE9ETzogVGVzdCBvbi10aGUtZmx5IGNyZWF0aW9uIG9mIGNhdGVnb3J5IGNvbnRyaWJ1dG9yCi0JCQkJTGlicmFyeU1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5hZGRUb1JvbGVTZXQoZ2V0QWN0aW9uTWFuYWdlcigpLAotCQkJCQkJcm9sZVNldCwgcm9sZSwgdXNlZENhdGVnb3JpZXMpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjcmVtb3ZlSXRlbXNGcm9tTW9kZWwxKEFycmF5TGlzdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVJdGVtc0Zyb21Nb2RlbDEoQXJyYXlMaXN0IHJtSXRlbXMpIHsKLQkJLy8gVXBkYXRlIHRoZSBtb2RlbC4KLQkJaWYgKCFybUl0ZW1zLmlzRW1wdHkoKSkgewotCQkJZm9yIChJdGVyYXRvciBpdCA9IHJtSXRlbXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCVJvbGVTZXQgcm9sZVNldCA9IChSb2xlU2V0KSBpdC5uZXh0KCk7Ci0JCQkJLy8gVE9ETzogVGVzdCBvbi10aGUtZmx5IGNyZWF0aW9uIG9mIGNhdGVnb3J5IGNvbnRyaWJ1dG9yCi0JCQkJTGlicmFyeU1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5yZW1vdmVGcm9tUm9sZVNldCgKLQkJCQkJCWdldEFjdGlvbk1hbmFnZXIoKSwgcm9sZVNldCwgcm9sZSwgdXNlZENhdGVnb3JpZXMpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjaW5pdENvbnRlbnRQcm92aWRlclNlbGVjdGVkMigpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdENvbnRlbnRQcm92aWRlclNlbGVjdGVkMigpIHsKLQkJY29udGVudFByb3ZpZGVyU2VsZWN0ZWQyID0gbmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKAotCQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpIHsKLQkJCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIEFzc29jaWF0aW9uSGVscGVyLmdldEN1c3RvbUNhdGVnb3JpZXMoKFJvbGUpIG9iamVjdCkKLQkJCQkJCS50b0FycmF5KCk7Ci0JCQl9Ci0JCX07Ci0JCXZpZXdlcl9zZWxlY3RlZDIuc2V0Q29udGVudFByb3ZpZGVyKGNvbnRlbnRQcm92aWRlclNlbGVjdGVkMik7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjYWRkSXRlbXNUb01vZGVsMigpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkSXRlbXNUb01vZGVsMihBcnJheUxpc3QgYWRkSXRlbXMpIHsKLQkJaWYgKCFhZGRJdGVtcy5pc0VtcHR5KCkpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBhZGRJdGVtcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJQ3VzdG9tQ2F0ZWdvcnkgY3VzdG9tQ2F0ZWdvcnkgPSAoQ3VzdG9tQ2F0ZWdvcnkpIGl0Lm5leHQoKTsKLQkJCQlMaWJyYXJ5TWFuYWdlci5nZXRJbnN0YW5jZSgpLmFkZFRvQ3VzdG9tQ2F0ZWdvcnkoCi0JCQkJCQlnZXRBY3Rpb25NYW5hZ2VyKCksIGN1c3RvbUNhdGVnb3J5LCByb2xlLCB1c2VkQ2F0ZWdvcmllcyk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNyZW1vdmVJdGVtc0Zyb21Nb2RlbDIoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbW92ZUl0ZW1zRnJvbU1vZGVsMihBcnJheUxpc3Qgcm1JdGVtcykgewotCQkvLyBVcGRhdGUgdGhlIG1vZGVsLgotCQlpZiAoIXJtSXRlbXMuaXNFbXB0eSgpKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gcm1JdGVtcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJQ3VzdG9tQ2F0ZWdvcnkgY3VzdG9tQ2F0ZWdvcnkgPSAoQ3VzdG9tQ2F0ZWdvcnkpIGl0Lm5leHQoKTsKLQkJCQlMaWJyYXJ5TWFuYWdlci5nZXRJbnN0YW5jZSgpLnJlbW92ZUZyb21DdXN0b21DYXRlZ29yeSgKLQkJCQkJCWdldEFjdGlvbk1hbmFnZXIoKSwgY3VzdG9tQ2F0ZWdvcnksIHJvbGUsIHVzZWRDYXRlZ29yaWVzKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2dldENvbnRlbnRFbGVtZW50KCkKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGdldENvbnRlbnRFbGVtZW50KCkgewotCQlyZXR1cm4gcm9sZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRUYWJTdHJpbmcoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0VGFiU3RyaW5nKCkgewotCQlyZXR1cm4gRmlsdGVyQ29uc3RhbnRzLlJPTEVTRVRTOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2dldFRhYlN0cmluZzIoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0VGFiU3RyaW5nMigpIHsKLQkJcmV0dXJuIEZpbHRlckNvbnN0YW50cy5DVVNUT01fQ0FURUdPUklFUzsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRGaWx0ZXIoKQotCSAqLwotCXByb3RlY3RlZCBJRmlsdGVyIGdldEZpbHRlcigpIHsKLQkJcmV0dXJuIGZpbHRlciA9IG5ldyBDYXRlZ29yeUZpbHRlcigpIHsKLQkJCXByb3RlY3RlZCBib29sZWFuIGNoaWxkQWNjZXB0KE9iamVjdCBvYmopIHsKLQkJCQlyZXR1cm4gKG9iaiBpbnN0YW5jZW9mIFJvbGVTZXQpOwotCQkJfQotCQl9OwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2dldEZpbHRlcjIoKQotCSAqLwotCXByb3RlY3RlZCBJRmlsdGVyIGdldEZpbHRlcjIoKSB7Ci0JCXJldHVybiBmaWx0ZXIgPSBuZXcgQ3VzdG9tQ2F0ZWdvcnlGaWx0ZXIoKTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0U2VjdGlvbkRlc2NyaXB0aW9uKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlY3Rpb25EZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLnJvbGVDYXRlZ29yaWVzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb247Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0U2VjdGlvbk5hbWUoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VjdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy5yb2xlQ2F0ZWdvcmllc1BhZ2Vfc2VjdGlvbk5hbWU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0U2VsZWN0ZWRMYWJlbCgpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTZWxlY3RlZExhYmVsKCkgewotCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMucm9sZUNhdGVnb3JpZXNQYWdlX3NlbGVjdGVkTGFiZWw7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldFNlbGVjdGVkTGFiZWwyKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlbGVjdGVkTGFiZWwyKCkgewotCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMucm9sZUNhdGVnb3JpZXNQYWdlX3NlbGVjdGVkTGFiZWwyOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNnZXRTZWxlY3RlZExhYmVsMygpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTZWxlY3RlZExhYmVsMygpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvblN0cmluZygpIHsKLQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLnJvbGVDYXRlZ29yaWVzUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uOwotCX0KLQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL1JvbGVEZXNjcmlwdGlvblBhZ2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvUm9sZURlc2NyaXB0aW9uUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYTI4ZTQ2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvUm9sZURlc2NyaXB0aW9uUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjc4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5NZXRob2RFbGVtZW50RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZmlsdGVycy5Db250ZW50RmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucmljaHRleHQuSU1ldGhvZFJpY2hUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSUFjdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5GaWx0ZXJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5WYXJpYWJpbGl0eUJhc2VFbGVtZW50RmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuZWRpdG9yLkZvcm1FZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5Gb3JtVG9vbGtpdDsKLQotCi0vKioKLSAqIFRoZSBEZXNjcmlwdGlvbiBwYWdlIGZvciB0aGUgUm9sZSBlZGl0b3IuCi0gKiAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFJvbGVEZXNjcmlwdGlvblBhZ2UgZXh0ZW5kcyBEZXNjcmlwdGlvbkZvcm1QYWdlIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JNX1BBR0VfSUQgPSAicm9sZURlc2NyaXB0aW9uUGFnZSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCQVNFX1JPTEUgPSBBdXRob3JpbmdVSVRleHQuQkFTRV9FTEVNRU5UX1RFWFQ7Ci0KLQlwcml2YXRlIElNZXRob2RSaWNoVGV4dCBjdHJsX3NraWxsczsKLQotCXByaXZhdGUgSU1ldGhvZFJpY2hUZXh0IGN0cmxfYXNzaWduOwotCi0JcHJpdmF0ZSBJTWV0aG9kUmljaFRleHQgY3RybF9zeW5vbnltczsKLQotCXByaXZhdGUgUm9sZSByb2xlOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgUm9sZURlc2NyaXB0aW9uUGFnZShGb3JtRWRpdG9yIGVkaXRvcikgewotCQlzdXBlcihlZGl0b3IsIEZPUk1fUEFHRV9JRCwgQXV0aG9yaW5nVUlUZXh0LkRFU0NSSVBUSU9OX1BBR0VfVElUTEUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2luaXQob3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGUsIG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElFZGl0b3JTaXRlIHNpdGUsIElFZGl0b3JJbnB1dCBpbnB1dCkgewotCQlzdXBlci5pbml0KHNpdGUsIGlucHV0KTsKLQkJcm9sZSA9IChSb2xlKSBjb250ZW50RWxlbWVudDsKLQkJbm90YXRpb25TZWN0aW9uT24gPSB0cnVlOwotCQlleHRlcm5hbElkT24gPSB0cnVlOwotCQlzZXRMb25nUHJlc2VudGF0aW9uTmFtZU9uKHRydWUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2NyZWF0ZUVkaXRvckNvbnRlbnQoRm9ybVRvb2xraXQpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRWRpdG9yQ29udGVudChGb3JtVG9vbGtpdCB0b29sa2l0KSB7Ci0JCXN1cGVyLmNyZWF0ZUVkaXRvckNvbnRlbnQodG9vbGtpdCk7Ci0JCWxhYmVsX2Jhc2Uuc2V0VGV4dChCQVNFX1JPTEUpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIFN0YWZmaW5nIHNlY3Rpb24uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlTm90YXRpb25TZWN0aW9uQ29udGVudCgpIHsKLQkJc3VwZXIuY3JlYXRlTm90YXRpb25TZWN0aW9uQ29udGVudCgpOwotCQlub3RhdGlvblNlY3Rpb24uc2V0VGV4dChBdXRob3JpbmdVSVRleHQuU1RBRkZJTkdfU0VDVElPTl9OQU1FKTsKLQkJbm90YXRpb25TZWN0aW9uLnNldERlc2NyaXB0aW9uKEF1dGhvcmluZ1VJVGV4dC5TVEFGRklOR19TRUNUSU9OX0RFU0MpOwotCQljdHJsX3NraWxscyA9IGNyZWF0ZVJpY2hUZXh0RWRpdFdpdGhMaW5rRm9yU2VjdGlvbih0b29sa2l0LAotCQkJCW5vdGF0aW9uQ29tcG9zaXRlLCBBdXRob3JpbmdVSVRleHQuU0tJTExTX1RFWFQsIDQwLCA0MDAsCi0JCQkJTk9UQVRJT05fU0VDVElPTl9JRCk7Ci0JCWN0cmxfYXNzaWduID0gY3JlYXRlUmljaFRleHRFZGl0V2l0aExpbmtGb3JTZWN0aW9uKHRvb2xraXQsCi0JCQkJbm90YXRpb25Db21wb3NpdGUsIEF1dGhvcmluZ1VJVGV4dC5BU1NJR05NRU5UX0FQUFJPQUNIRVNfVEVYVCwKLQkJCQk0MCwgNDAwLCBOT1RBVElPTl9TRUNUSU9OX0lEKTsKLQkJY3RybF9zeW5vbnltcyA9IGNyZWF0ZVJpY2hUZXh0RWRpdFdpdGhMaW5rRm9yU2VjdGlvbih0b29sa2l0LAotCQkJCW5vdGF0aW9uQ29tcG9zaXRlLCBBdXRob3JpbmdVSVRleHQuU1lOT05ZTVNfVEVYVCwgNDAsIDQwMCwKLQkJCQlOT1RBVElPTl9TRUNUSU9OX0lEKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNhZGRMaXN0ZW5lcnMoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZExpc3RlbmVycygpIHsKLQkJc3VwZXIuYWRkTGlzdGVuZXJzKCk7Ci0KLQkJZmluYWwgTWV0aG9kRWxlbWVudEVkaXRvciBlZGl0b3IgPSAoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCk7Ci0KLQkJaWYgKG5vdGF0aW9uU2VjdGlvbk9uKSB7Ci0JCQljdHJsX3NraWxscy5zZXRNb2RhbE9iamVjdChjb250ZW50RWxlbWVudC5nZXRQcmVzZW50YXRpb24oKSk7Ci0JCQljdHJsX3NraWxscy5zZXRNb2RhbE9iamVjdEZlYXR1cmUoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJLmdldFJvbGVEZXNjcmlwdGlvbl9Ta2lsbHMoKSk7Ci0JCQljdHJsX3NraWxscy5hZGRNb2RpZnlMaXN0ZW5lcihjb250ZW50TW9kaWZ5TGlzdGVuZXIpOwotCQkJY3RybF9za2lsbHMuYWRkTGlzdGVuZXIoU1dULkRlYWN0aXZhdGUsIG5ldyBMaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJCUlNZXRob2RSaWNoVGV4dCBjb250cm9sID0gZGVzY0V4cGFuZEZsYWcgPyBjdHJsX2V4cGFuZGVkCi0JCQkJCQkJOiBjdHJsX3NraWxsczsKLQkJCQkJaWYgKCFjb250cm9sLmdldE1vZGlmaWVkKCkpIHsKLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCQlTdHJpbmcgb2xkQ29udGVudCA9ICgob3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRpb24pIHJvbGUKLQkJCQkJCQkuZ2V0UHJlc2VudGF0aW9uKCkpLmdldFNraWxscygpOwotCQkJCQlpZiAoKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkubXVzdFJlc3RvcmVWYWx1ZSgKLQkJCQkJCQljb250cm9sLCBvbGRDb250ZW50KSkgewotCQkJCQkJcmV0dXJuOwotCQkJCQl9Ci0JCQkJCVN0cmluZyBuZXdDb250ZW50ID0gY29udHJvbC5nZXRUZXh0KCk7Ci0JCQkJCWlmICghbmV3Q29udGVudC5lcXVhbHMob2xkQ29udGVudCkpIHsKLQkJCQkJCWJvb2xlYW4gc3VjY2VzcyA9IGVkaXRvci5nZXRBY3Rpb25NYW5hZ2VyKCkuZG9BY3Rpb24oCi0JCQkJCQkJCUlBY3Rpb25NYW5hZ2VyLlNFVCwKLQkJCQkJCQkJY29udGVudEVsZW1lbnQuZ2V0UHJlc2VudGF0aW9uKCksCi0JCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFJvbGVEZXNjcmlwdGlvbl9Ta2lsbHMoKSwKLQkJCQkJCQkJbmV3Q29udGVudCwgLTEpOwotCQkJCQkJaWYgKHN1Y2Nlc3MgJiYgaXNWZXJzaW9uU2VjdGlvbk9uKCkpIHsKLQkJCQkJCQl1cGRhdGVDaGFuZ2VEYXRlKCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9KTsKLQotCQkJY3RybF9hc3NpZ24uc2V0TW9kYWxPYmplY3QoY29udGVudEVsZW1lbnQuZ2V0UHJlc2VudGF0aW9uKCkpOwotCQkJY3RybF9hc3NpZ24uc2V0TW9kYWxPYmplY3RGZWF0dXJlKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCS5nZXRSb2xlRGVzY3JpcHRpb25fQXNzaWdubWVudEFwcHJvYWNoZXMoKSk7Ci0JCQljdHJsX2Fzc2lnbi5hZGRNb2RpZnlMaXN0ZW5lcihjb250ZW50TW9kaWZ5TGlzdGVuZXIpOwotCQkJY3RybF9hc3NpZ24uYWRkTGlzdGVuZXIoU1dULkRlYWN0aXZhdGUsIG5ldyBMaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJCUlNZXRob2RSaWNoVGV4dCBjb250cm9sID0gZGVzY0V4cGFuZEZsYWcgPyBjdHJsX2V4cGFuZGVkCi0JCQkJCQkJOiBjdHJsX2Fzc2lnbjsKLQkJCQkJaWYgKCFjb250cm9sLmdldE1vZGlmaWVkKCkpIHsKLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCQlTdHJpbmcgb2xkQ29udGVudCA9ICgob3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRpb24pIHJvbGUKLQkJCQkJCQkuZ2V0UHJlc2VudGF0aW9uKCkpLmdldEFzc2lnbm1lbnRBcHByb2FjaGVzKCk7Ci0JCQkJCWlmICgoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpKS5tdXN0UmVzdG9yZVZhbHVlKAotCQkJCQkJCWNvbnRyb2wsIG9sZENvbnRlbnQpKSB7Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCX0KLQkJCQkJU3RyaW5nIG5ld0NvbnRlbnQgPSBjb250cm9sLmdldFRleHQoKTsKLQkJCQkJaWYgKCFuZXdDb250ZW50LmVxdWFscyhvbGRDb250ZW50KSkgewotCQkJCQkJYm9vbGVhbiBzdWNjZXNzID0gZWRpdG9yLmdldEFjdGlvbk1hbmFnZXIoKS5kb0FjdGlvbigKLQkJCQkJCQkJSUFjdGlvbk1hbmFnZXIuU0VULAotCQkJCQkJCQljb250ZW50RWxlbWVudC5nZXRQcmVzZW50YXRpb24oKSwKLQkJCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCQkuZ2V0Um9sZURlc2NyaXB0aW9uX0Fzc2lnbm1lbnRBcHByb2FjaGVzKCksCi0JCQkJCQkJCW5ld0NvbnRlbnQsIC0xKTsKLQkJCQkJCWlmIChzdWNjZXNzICYmIGlzVmVyc2lvblNlY3Rpb25PbigpKSB7Ci0JCQkJCQkJdXBkYXRlQ2hhbmdlRGF0ZSgpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfSk7Ci0KLQkJCWN0cmxfc3lub255bXMuc2V0TW9kYWxPYmplY3QoY29udGVudEVsZW1lbnQuZ2V0UHJlc2VudGF0aW9uKCkpOwotCQkJY3RybF9zeW5vbnltcy5zZXRNb2RhbE9iamVjdEZlYXR1cmUoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJLmdldFJvbGVEZXNjcmlwdGlvbl9TeW5vbnltcygpKTsKLQkJCWN0cmxfc3lub255bXMuYWRkTW9kaWZ5TGlzdGVuZXIoY29udGVudE1vZGlmeUxpc3RlbmVyKTsKLQkJCWN0cmxfc3lub255bXMuYWRkTGlzdGVuZXIoU1dULkRlYWN0aXZhdGUsIG5ldyBMaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJCUlNZXRob2RSaWNoVGV4dCBjb250cm9sID0gZGVzY0V4cGFuZEZsYWcgPyBjdHJsX2V4cGFuZGVkCi0JCQkJCQkJOiBjdHJsX3N5bm9ueW1zOwotCQkJCQlpZiAoIWNvbnRyb2wuZ2V0TW9kaWZpZWQoKSkgewotCQkJCQkJcmV0dXJuOwotCQkJCQl9Ci0JCQkJCVN0cmluZyBvbGRDb250ZW50ID0gKChvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdGlvbikgcm9sZQotCQkJCQkJCS5nZXRQcmVzZW50YXRpb24oKSkuZ2V0U3lub255bXMoKTsKLQkJCQkJaWYgKCgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpLm11c3RSZXN0b3JlVmFsdWUoCi0JCQkJCQkJY29udHJvbCwgb2xkQ29udGVudCkpIHsKLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCQlTdHJpbmcgbmV3Q29udGVudCA9IGNvbnRyb2wuZ2V0VGV4dCgpOwotCQkJCQlpZiAoIW5ld0NvbnRlbnQuZXF1YWxzKG9sZENvbnRlbnQpKSB7Ci0JCQkJCQlib29sZWFuIHN1Y2Nlc3MgPSBlZGl0b3IuZ2V0QWN0aW9uTWFuYWdlcigpLmRvQWN0aW9uKAotCQkJCQkJCQlJQWN0aW9uTWFuYWdlci5TRVQsCi0JCQkJCQkJCWNvbnRlbnRFbGVtZW50LmdldFByZXNlbnRhdGlvbigpLAotCQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRSb2xlRGVzY3JpcHRpb25fU3lub255bXMoKSwKLQkJCQkJCQkJbmV3Q29udGVudCwgLTEpOwotCQkJCQkJaWYgKHN1Y2Nlc3MgJiYgaXNWZXJzaW9uU2VjdGlvbk9uKCkpIHsKLQkJCQkJCQl1cGRhdGVDaGFuZ2VEYXRlKCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI3JlZnJlc2goYm9vbGVhbikKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoKGJvb2xlYW4gZWRpdGFibGUpIHsKLQkJc3VwZXIucmVmcmVzaChlZGl0YWJsZSk7Ci0JCQotCQlpZiAobm90YXRpb25TZWN0aW9uT24pIHsKLQkJCWN0cmxfc2tpbGxzLnNldEVkaXRhYmxlKGVkaXRhYmxlKTsKLQkJCWN0cmxfYXNzaWduLnNldEVkaXRhYmxlKGVkaXRhYmxlKTsKLQkJCWN0cmxfc3lub255bXMuc2V0RWRpdGFibGUoZWRpdGFibGUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjbG9hZERhdGEoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGxvYWREYXRhKCkgewotCQlzdXBlci5sb2FkRGF0YSgpOwotCi0JCWlmIChub3RhdGlvblNlY3Rpb25PbikgewotCQkJU3RyaW5nIHNraWxscyA9ICgob3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRpb24pIHJvbGUuZ2V0UHJlc2VudGF0aW9uKCkpCi0JCQkJCS5nZXRTa2lsbHMoKTsKLQkJCVN0cmluZyBhc3NpZ24gPSAoKG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZURlc2NyaXB0aW9uKSByb2xlLmdldFByZXNlbnRhdGlvbigpKQotCQkJCQkuZ2V0QXNzaWdubWVudEFwcHJvYWNoZXMoKTsKLQkJCVN0cmluZyBzeW5vbnltcyA9ICgob3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRpb24pIHJvbGUuZ2V0UHJlc2VudGF0aW9uKCkpCi0JCQkJCS5nZXRTeW5vbnltcygpOwotCQotCQkJY3RybF9za2lsbHMuc2V0VGV4dChza2lsbHMgPT0gbnVsbCA/ICIiIDogc2tpbGxzKTsgLy8kTk9OLU5MUy0xJAotCQkJY3RybF9hc3NpZ24uc2V0VGV4dChhc3NpZ24gPT0gbnVsbCA/ICIiIDogYXNzaWduKTsgLy8kTk9OLU5MUy0xJAotCQkJY3RybF9zeW5vbnltcy5zZXRUZXh0KHN5bm9ueW1zID09IG51bGwgPyAiIiA6IHN5bm9ueW1zKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjZ2V0Q29udGVudEVsZW1lbnQoKQotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZ2V0Q29udGVudEVsZW1lbnQoKSB7Ci0JCXJldHVybiByb2xlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2dldFRhYlN0cmluZygpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRUYWJTdHJpbmcoKSB7Ci0JCXJldHVybiBGaWx0ZXJDb25zdGFudHMuUk9MRVM7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjZ2V0RmlsdGVyKCkKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpbHRlciBnZXRGaWx0ZXIoKSB7Ci0JCWZpbHRlciA9IG5ldyBDb250ZW50RmlsdGVyKCkgewotCQkJcHJvdGVjdGVkIGJvb2xlYW4gY2hpbGRBY2NlcHQoT2JqZWN0IG9iaikgewotCQkJCXJldHVybiAob2JqIGluc3RhbmNlb2YgUm9sZSk7Ci0JCQl9Ci0JCX07Ci0KLQkJLy8gU2V0IGFkZGl0aW9uYWwgZmlsdGVyIGZvciB2YXJpYWJpbGl0eSBiYXNlIGVsZW1lbnQgY2hlY2tpbmcuCi0JCSgoQ29udGVudEZpbHRlcikgZmlsdGVyKQotCQkJCS5zZXRBZGRpdGlvbmFsRmlsdGVycyhuZXcgSUZpbHRlcltdIHsgbmV3IFZhcmlhYmlsaXR5QmFzZUVsZW1lbnRGaWx0ZXIoCi0JCQkJCQlyb2xlKSB9KTsKLQkJcmV0dXJuIGZpbHRlcjsKLQl9Ci0JCi0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjbG9hZFNlY3Rpb25EZXNjcmlwdGlvbigpCi0JICovCi0JcHVibGljIHZvaWQgbG9hZFNlY3Rpb25EZXNjcmlwdGlvbigpIHsKLQkJdGhpcy5nZW5lcmFsU2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMucm9sZV9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYzsKLQkJdGhpcy5kZXRhaWxTZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy5yb2xlX2RldGFpbFNlY3Rpb25fZGVzYzsKLQkJdGhpcy52YXJpYWJpbGl0eVNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLnJvbGVfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M7Ci0JCXRoaXMudmVyc2lvblNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLnJvbGVfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9Sb2xlR3VpZGFuY2VQYWdlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL1JvbGVHdWlkYW5jZVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjIxNzQ0Yy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL1JvbGVHdWlkYW5jZVBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZmlsdGVycy5HdWlkYW5jZUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnV0aWwuVUlIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklBY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuRmlsdGVyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ2hlY2tsaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29uY2VwdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkV4YW1wbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HdWlkYW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkd1aWRlbGluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByYWN0aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUmV1c2FibGVBc3NldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5TdXBwb3J0aW5nTWF0ZXJpYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuRm9ybUVkaXRvcjsKLQotCi0vKioKLSAqIFRoZSBHdWlkYW5jZSBwYWdlIGluIHRoZSBSb2xlIGVkaXRvci4KLSAqIAotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUm9sZUd1aWRhbmNlUGFnZSBleHRlbmRzIEFzc29jaWF0aW9uRm9ybVBhZ2UgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZPUk1fUEFHRV9JRCA9ICJyb2xlR3VpZGFuY2VQYWdlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBSb2xlIHJvbGU7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBSb2xlR3VpZGFuY2VQYWdlKEZvcm1FZGl0b3IgZWRpdG9yKSB7Ci0JCXN1cGVyKGVkaXRvciwgRk9STV9QQUdFX0lELCBBdXRob3JpbmdVSVRleHQuR1VJREFOQ0VfUEFHRV9USVRMRSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjaW5pdChvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZSwgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0KQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSUVkaXRvclNpdGUgc2l0ZSwgSUVkaXRvcklucHV0IGlucHV0KSB7Ci0JCXN1cGVyLmluaXQoc2l0ZSwgaW5wdXQpOwotCQlyb2xlID0gKFJvbGUpIGNvbnRlbnRFbGVtZW50OwotCQlzZXRBbGxvd0NoYW5nZTEodHJ1ZSk7Ci0JCXNldEFsbG93Q2hhbmdlMih0cnVlKTsKLQkJc2V0VXNlQ2F0ZWdvcnkyKGZhbHNlKTsKLQkJc2V0VXNlQ2F0ZWdvcnkzKGZhbHNlKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNpbml0Q29udGVudFByb3ZpZGVyU2VsZWN0ZWQoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRDb250ZW50UHJvdmlkZXJTZWxlY3RlZCgpIHsKLQkJY29udGVudFByb3ZpZGVyU2VsZWN0ZWQgPSBuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoCi0JCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJCS5nZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSkgewotCQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gVUlIZWxwZXIuZ2V0U2VsZWN0ZWRHdWlkYW5jZXMocm9sZSk7Ci0JCQl9Ci0JCX07Ci0JCXZpZXdlcl9zZWxlY3RlZC5zZXRDb250ZW50UHJvdmlkZXIoY29udGVudFByb3ZpZGVyU2VsZWN0ZWQpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2FkZEl0ZW1zVG9Nb2RlbDEoQXJyYXlMaXN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEl0ZW1zVG9Nb2RlbDEoQXJyYXlMaXN0IGFkZEl0ZW1zKSB7Ci0JCS8vIFVwZGF0ZSB0aGUgbW9kZWwuCi0JCWlmICghYWRkSXRlbXMuaXNFbXB0eSgpKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gYWRkSXRlbXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCUd1aWRhbmNlIGl0ZW0gPSAoR3VpZGFuY2UpIGl0Lm5leHQoKTsKLQotCQkJCS8vIEd1aWRhbmNlIGZvciB0aGUgY29udGVudCBlbGVtZW50LgotCQkJCWlmIChpdGVtIGluc3RhbmNlb2YgQ2hlY2tsaXN0KSB7Ci0JCQkJCWVkaXRvci5nZXRBY3Rpb25NYW5hZ2VyKCkKLQkJCQkJCQkuZG9BY3Rpb24oCi0JCQkJCQkJCQlJQWN0aW9uTWFuYWdlci5BREQsCi0JCQkJCQkJCQlyb2xlLAotCQkJCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCQkJLmdldENvbnRlbnRFbGVtZW50X0NoZWNrbGlzdHMoKSwKLQkJCQkJCQkJCShDaGVja2xpc3QpIGl0ZW0sIC0xKTsKLQkJCQl9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBDb25jZXB0KSB7Ci0JCQkJCWVkaXRvci5nZXRBY3Rpb25NYW5hZ2VyKCkuZG9BY3Rpb24oCi0JCQkJCQkJSUFjdGlvbk1hbmFnZXIuQURELAotCQkJCQkJCXJvbGUsCi0JCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCS5nZXRDb250ZW50RWxlbWVudF9Db25jZXB0c0FuZFBhcGVycygpLAotCQkJCQkJCShDb25jZXB0KSBpdGVtLCAtMSk7Ci0JCQkJfSBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgRXhhbXBsZSkgewotCQkJCQllZGl0b3IuZ2V0QWN0aW9uTWFuYWdlcigpLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLkFERCwKLQkJCQkJCQlyb2xlLAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbnRlbnRFbGVtZW50X0V4YW1wbGVzKCksCi0JCQkJCQkJKEV4YW1wbGUpIGl0ZW0sIC0xKTsKLQkJCQl9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBQcmFjdGljZSkgewotCQkJCQllZGl0b3IuZ2V0QWN0aW9uTWFuYWdlcigpLmRvQWN0aW9uKAotCQkJCQkJCUlBY3Rpb25NYW5hZ2VyLkFERCwKLQkJCQkJCQkoUHJhY3RpY2UpIGl0ZW0sCi0JCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCS5nZXRQcmFjdGljZV9Db250ZW50UmVmZXJlbmNlcygpLCByb2xlLCAtMSk7Ci0JCQkJfSBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgU3VwcG9ydGluZ01hdGVyaWFsKSB7Ci0JCQkJCWVkaXRvci5nZXRBY3Rpb25NYW5hZ2VyKCkuZG9BY3Rpb24oCi0JCQkJCQkJSUFjdGlvbk1hbmFnZXIuQURELAotCQkJCQkJCXJvbGUsCi0JCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCS5nZXRDb250ZW50RWxlbWVudF9TdXBwb3J0aW5nTWF0ZXJpYWxzKCksCi0JCQkJCQkJKFN1cHBvcnRpbmdNYXRlcmlhbCkgaXRlbSwgLTEpOwotCQkJCX0gZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIEd1aWRlbGluZSkgewotCQkJCQllZGl0b3IuZ2V0QWN0aW9uTWFuYWdlcigpCi0JCQkJCQkJLmRvQWN0aW9uKAotCQkJCQkJCQkJSUFjdGlvbk1hbmFnZXIuQURELAotCQkJCQkJCQkJcm9sZSwKLQkJCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJCS5nZXRDb250ZW50RWxlbWVudF9HdWlkZWxpbmVzKCksCi0JCQkJCQkJCQkoR3VpZGVsaW5lKSBpdGVtLCAtMSk7Ci0JCQkJfSBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgUmV1c2FibGVBc3NldCkgewotCQkJCQllZGl0b3IuZ2V0QWN0aW9uTWFuYWdlcigpLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLkFERCwKLQkJCQkJCQlyb2xlLAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbnRlbnRFbGVtZW50X0Fzc2V0cygpLAotCQkJCQkJCShSZXVzYWJsZUFzc2V0KSBpdGVtLCAtMSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4KLQkJCQkJCQkuZ2V0RGVmYXVsdCgpCi0JCQkJCQkJLmdldExvZ2dlcigpCi0JCQkJCQkJLmxvZ0Vycm9yKAotCQkJCQkJCQkJIlVuYWJsZSB0byBhZGQgZ3VpZGFuY2UgIiArIGl0ZW0uZ2V0VHlwZSgpLmdldE5hbWUoKSArICI6IiArIGl0ZW0uZ2V0TmFtZSgpICsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQkJCQkJCSJ0byAiICsgcm9sZS5nZXRUeXBlKCkuZ2V0TmFtZSgpIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCQkJKyAiOiIgKyByb2xlLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQgCi0JCQkJfQotCQkJfQotCQkJc2V0RGlydHkodHJ1ZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNyZW1vdmVJdGVtc0Zyb21Nb2RlbDEoQXJyYXlMaXN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbW92ZUl0ZW1zRnJvbU1vZGVsMShBcnJheUxpc3Qgcm1JdGVtcykgewotCQkvLyBVcGRhdGUgdGhlIG1vZGVsLgotCQlpZiAoIXJtSXRlbXMuaXNFbXB0eSgpKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gcm1JdGVtcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJR3VpZGFuY2UgaXRlbSA9IChHdWlkYW5jZSkgaXQubmV4dCgpOwotCi0JCQkJLy8gR3VpZGFuY2UgZm9yIHRoZSBtZXRob2QgZWxlbWVudC4KLQkJCQlpZiAoaXRlbSBpbnN0YW5jZW9mIENoZWNrbGlzdCkgewotCQkJCQllZGl0b3IuZ2V0QWN0aW9uTWFuYWdlcigpCi0JCQkJCQkJLmRvQWN0aW9uKAotCQkJCQkJCQkJSUFjdGlvbk1hbmFnZXIuUkVNT1ZFLAotCQkJCQkJCQkJcm9sZSwKLQkJCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJCS5nZXRDb250ZW50RWxlbWVudF9DaGVja2xpc3RzKCksCi0JCQkJCQkJCQkoQ2hlY2tsaXN0KSBpdGVtLCAtMSk7Ci0JCQkJfSBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgQ29uY2VwdCkgewotCQkJCQllZGl0b3IuZ2V0QWN0aW9uTWFuYWdlcigpLmRvQWN0aW9uKAotCQkJCQkJCUlBY3Rpb25NYW5hZ2VyLlJFTU9WRSwKLQkJCQkJCQlyb2xlLAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkuZ2V0Q29udGVudEVsZW1lbnRfQ29uY2VwdHNBbmRQYXBlcnMoKSwKLQkJCQkJCQkoQ29uY2VwdCkgaXRlbSwgLTEpOwotCQkJCX0gZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIEV4YW1wbGUpIHsKLQkJCQkJZWRpdG9yLmdldEFjdGlvbk1hbmFnZXIoKS5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5SRU1PVkUsCi0JCQkJCQkJcm9sZSwKLQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb250ZW50RWxlbWVudF9FeGFtcGxlcygpLAotCQkJCQkJCShFeGFtcGxlKSBpdGVtLCAtMSk7Ci0JCQkJfSBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgUHJhY3RpY2UpIHsKLQkJCQkJZWRpdG9yLmdldEFjdGlvbk1hbmFnZXIoKS5kb0FjdGlvbigKLQkJCQkJCQlJQWN0aW9uTWFuYWdlci5SRU1PVkUsCi0JCQkJCQkJKFByYWN0aWNlKSBpdGVtLAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkuZ2V0UHJhY3RpY2VfQ29udGVudFJlZmVyZW5jZXMoKSwgcm9sZSwgLTEpOwotCQkJCX0gZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIFN1cHBvcnRpbmdNYXRlcmlhbCkgewotCQkJCQllZGl0b3IuZ2V0QWN0aW9uTWFuYWdlcigpLmRvQWN0aW9uKAotCQkJCQkJCUlBY3Rpb25NYW5hZ2VyLlJFTU9WRSwKLQkJCQkJCQlyb2xlLAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkuZ2V0Q29udGVudEVsZW1lbnRfU3VwcG9ydGluZ01hdGVyaWFscygpLAotCQkJCQkJCShTdXBwb3J0aW5nTWF0ZXJpYWwpIGl0ZW0sIC0xKTsKLQkJCQl9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBHdWlkZWxpbmUpIHsKLQkJCQkJZWRpdG9yLmdldEFjdGlvbk1hbmFnZXIoKQotCQkJCQkJCS5kb0FjdGlvbigKLQkJCQkJCQkJCUlBY3Rpb25NYW5hZ2VyLlJFTU9WRSwKLQkJCQkJCQkJCXJvbGUsCi0JCQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJCQkuZ2V0Q29udGVudEVsZW1lbnRfR3VpZGVsaW5lcygpLAotCQkJCQkJCQkJKEd1aWRlbGluZSkgaXRlbSwgLTEpOwotCQkJCX0gZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIFJldXNhYmxlQXNzZXQpIHsKLQkJCQkJZWRpdG9yLmdldEFjdGlvbk1hbmFnZXIoKS5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5SRU1PVkUsCi0JCQkJCQkJcm9sZSwKLQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb250ZW50RWxlbWVudF9Bc3NldHMoKSwKLQkJCQkJCQkoUmV1c2FibGVBc3NldCkgaXRlbSwgLTEpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCUF1dGhvcmluZ1VJUGx1Z2luCi0JCQkJCQkJLmdldERlZmF1bHQoKQotCQkJCQkJCS5nZXRMb2dnZXIoKQotCQkJCQkJCS5sb2dFcnJvcigKLQkJCQkJCQkJCSJVbmFibGUgdG8gcmVtb3ZlIGd1aWRhbmNlICIgKyBpdGVtLmdldFR5cGUoKS5nZXROYW1lKCkgKyAiOiIgKyBpdGVtLmdldE5hbWUoKSArIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJCQkJCQkiZnJvbSAiICsgcm9sZS5nZXRUeXBlKCkuZ2V0TmFtZSgpIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCQkJKyAiOiIgKyByb2xlLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQgCi0JCQkJfQotCQkJfQotCQkJc2V0RGlydHkodHJ1ZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRDb250ZW50RWxlbWVudCgpCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBnZXRDb250ZW50RWxlbWVudCgpIHsKLQkJcmV0dXJuIHJvbGU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjZ2V0VGFiU3RyaW5nKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFRhYlN0cmluZygpIHsKLQkJcmV0dXJuIEZpbHRlckNvbnN0YW50cy5HVUlEQU5DRTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRGaWx0ZXIoKQotCSAqLwotCXByb3RlY3RlZCBJRmlsdGVyIGdldEZpbHRlcigpIHsKLQkJcmV0dXJuIGZpbHRlciA9IG5ldyBHdWlkYW5jZUZpbHRlcigpOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvUm9sZVNldERlc2NyaXB0aW9uUGFnZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9Sb2xlU2V0RGVzY3JpcHRpb25QYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjZjE1YzMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9Sb2xlU2V0RGVzY3JpcHRpb25QYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZpbHRlcnMuQ2F0ZWdvcnlGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuRmlsdGVyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuVmFyaWFiaWxpdHlCYXNlRWxlbWVudEZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLmVkaXRvci5Gb3JtRWRpdG9yOwotCi0KLS8qKgotICogVGhlIERlc2NyaXB0aW9uIHBhZ2UgZm9yIHRoZSBEb21haW4gZWRpdG9yLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBSb2xlU2V0RGVzY3JpcHRpb25QYWdlIGV4dGVuZHMgRGVzY3JpcHRpb25Gb3JtUGFnZSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9STV9QQUdFX0lEID0gInJvbGVTZXREZXNjcmlwdGlvblBhZ2UiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIFJvbGVTZXQgcm9sZVNldDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFJvbGVTZXREZXNjcmlwdGlvblBhZ2UoRm9ybUVkaXRvciBlZGl0b3IpIHsKLQkJc3VwZXIoZWRpdG9yLCBGT1JNX1BBR0VfSUQsIEF1dGhvcmluZ1VJVGV4dC5ERVNDUklQVElPTl9QQUdFX1RJVExFKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNpbml0KG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlLCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJRWRpdG9yU2l0ZSBzaXRlLCBJRWRpdG9ySW5wdXQgaW5wdXQpIHsKLQkJc3VwZXIuaW5pdChzaXRlLCBpbnB1dCk7Ci0JCXJvbGVTZXQgPSAoUm9sZVNldCkgY29udGVudEVsZW1lbnQ7Ci0JCXNldEV4dGVybmFsSURPbih0cnVlKTsKLQkJc2V0TG9uZ1ByZXNlbnRhdGlvbk5hbWVPbih0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRDb250ZW50RWxlbWVudCgpCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBnZXRDb250ZW50RWxlbWVudCgpIHsKLQkJcmV0dXJuIHJvbGVTZXQ7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjZ2V0RmlsdGVyKCkKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpbHRlciBnZXRGaWx0ZXIoKSB7Ci0JCWZpbHRlciA9IG5ldyBDYXRlZ29yeUZpbHRlcigpIHsKLQkJCXByb3RlY3RlZCBib29sZWFuIGNoaWxkQWNjZXB0KE9iamVjdCBvYmopIHsKLQkJCQlyZXR1cm4gKG9iaiBpbnN0YW5jZW9mIFJvbGVTZXQpOwotCQkJfQotCQl9OwotCi0JCS8vIHNldCBhZGRpdGlvbmFsIGZpbHRlciBmb3IgdmFyaWFiaWxpdHkgYmFzZSBlbGVtZW50IGNoZWNraW5nCi0JCSgoQ2F0ZWdvcnlGaWx0ZXIpIGZpbHRlcikKLQkJCQkuc2V0QWRkaXRpb25hbEZpbHRlcnMobmV3IElGaWx0ZXJbXSB7IG5ldyBWYXJpYWJpbGl0eUJhc2VFbGVtZW50RmlsdGVyKAotCQkJCQkJcm9sZVNldCkgfSk7Ci0JCXJldHVybiBmaWx0ZXI7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRUYWJTdHJpbmcoKSB7Ci0JCXJldHVybiBGaWx0ZXJDb25zdGFudHMuUk9MRVNFVFM7Ci0JfQotCQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2xvYWRTZWN0aW9uRGVzY3JpcHRpb24oKQotCSAqLwotCXB1YmxpYyB2b2lkIGxvYWRTZWN0aW9uRGVzY3JpcHRpb24oKSB7Ci0JCXRoaXMuZ2VuZXJhbFNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLnJvbGVzZXRfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M7Ci0JCXRoaXMuZGV0YWlsU2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMucm9sZXNldF9kZXRhaWxTZWN0aW9uX2Rlc2M7Ci0JCXRoaXMudmFyaWFiaWxpdHlTZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy5yb2xlc2V0X3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjOwotCQl0aGlzLnZlcnNpb25TZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy5yb2xlc2V0X3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9Sb2xlU2V0R3JvdXBpbmdEZXNjcmlwdGlvblBhZ2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvUm9sZVNldEdyb3VwaW5nRGVzY3JpcHRpb25QYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkODIwOWUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9Sb2xlU2V0R3JvdXBpbmdEZXNjcmlwdGlvblBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZmlsdGVycy5DYXRlZ29yeUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5GaWx0ZXJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5WYXJpYWJpbGl0eUJhc2VFbGVtZW50RmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZVNldEdyb3VwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuRm9ybUVkaXRvcjsKLQotCi0vKioKLSAqIFRoZSBEZXNjcmlwdGlvbiBwYWdlIGZvciB0aGUgRG9tYWluIGVkaXRvci4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUm9sZVNldEdyb3VwaW5nRGVzY3JpcHRpb25QYWdlIGV4dGVuZHMgRGVzY3JpcHRpb25Gb3JtUGFnZSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9STV9QQUdFX0lEID0gInJvbGVTZXRHcm91cGluZ0Rlc2NyaXB0aW9uUGFnZSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgUm9sZVNldEdyb3VwaW5nIHJvbGVTZXRHcm91cGluZzsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFJvbGVTZXRHcm91cGluZ0Rlc2NyaXB0aW9uUGFnZShGb3JtRWRpdG9yIGVkaXRvcikgewotCQlzdXBlcihlZGl0b3IsIEZPUk1fUEFHRV9JRCwgQXV0aG9yaW5nVUlUZXh0LkRFU0NSSVBUSU9OX1BBR0VfVElUTEUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2luaXQob3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGUsIG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElFZGl0b3JTaXRlIHNpdGUsIElFZGl0b3JJbnB1dCBpbnB1dCkgewotCQlzdXBlci5pbml0KHNpdGUsIGlucHV0KTsKLQkJcm9sZVNldEdyb3VwaW5nID0gKFJvbGVTZXRHcm91cGluZykgY29udGVudEVsZW1lbnQ7Ci0JCXNldEV4dGVybmFsSURPbih0cnVlKTsKLQkJc2V0TG9uZ1ByZXNlbnRhdGlvbk5hbWVPbih0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRDb250ZW50RWxlbWVudCgpCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBnZXRDb250ZW50RWxlbWVudCgpIHsKLQkJcmV0dXJuIHJvbGVTZXRHcm91cGluZzsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRUYWJTdHJpbmcoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0VGFiU3RyaW5nKCkgewotCQlyZXR1cm4gRmlsdGVyQ29uc3RhbnRzLlJPTEVTRVRTOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2dldEZpbHRlcigpCi0JICovCi0JcHJvdGVjdGVkIElGaWx0ZXIgZ2V0RmlsdGVyKCkgewotCQlmaWx0ZXIgPSBuZXcgQ2F0ZWdvcnlGaWx0ZXIoKSB7Ci0JCQlwcm90ZWN0ZWQgYm9vbGVhbiBjaGlsZEFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCQkJcmV0dXJuIChvYmogaW5zdGFuY2VvZiBSb2xlU2V0R3JvdXBpbmcpOwotCQkJfQotCQl9OwotCi0JCS8vIHNldCBhZGRpdGlvbmFsIGZpbHRlciBmb3IgdmFyaWFiaWxpdHkgYmFzZSBlbGVtZW50IGNoZWNraW5nCi0JCSgoQ2F0ZWdvcnlGaWx0ZXIpIGZpbHRlcikKLQkJCQkuc2V0QWRkaXRpb25hbEZpbHRlcnMobmV3IElGaWx0ZXJbXSB7IG5ldyBWYXJpYWJpbGl0eUJhc2VFbGVtZW50RmlsdGVyKAotCQkJCQkJcm9sZVNldEdyb3VwaW5nKSB9KTsKLQkJcmV0dXJuIGZpbHRlcjsKLQl9Ci0JCi0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjbG9hZFNlY3Rpb25EZXNjcmlwdGlvbigpCi0JICovCi0JcHVibGljIHZvaWQgbG9hZFNlY3Rpb25EZXNjcmlwdGlvbigpIHsKLQkJdGhpcy5nZW5lcmFsU2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMucm9sZXNldGdyb3VwaW5nX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjOwotCQl0aGlzLmRldGFpbFNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLnJvbGVzZXRncm91cGluZ19kZXRhaWxTZWN0aW9uX2Rlc2M7Ci0JCXRoaXMudmFyaWFiaWxpdHlTZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy5yb2xlc2V0Z3JvdXBpbmdfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M7Ci0JCXRoaXMudmVyc2lvblNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLnJvbGVzZXRncm91cGluZ192ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYzsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvUm9sZVNldEdyb3VwaW5nUm9sZVNldHMuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvUm9sZVNldEdyb3VwaW5nUm9sZVNldHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2IyZjI4NC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL1JvbGVTZXRHcm91cGluZ1JvbGVTZXRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3JtczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZmlsdGVycy5DYXRlZ29yeUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSUFjdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5GaWx0ZXJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZVNldEdyb3VwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuZWRpdG9yLkZvcm1FZGl0b3I7Ci0KLQotLyoqCi0gKiBUaGUgUm9sZSBTZXRzIHBhZ2UgaW4gdGhlIFJvbGUgU2V0IEdyb3VwaW5nIGVkaXRvci4KLSAqIAotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqIAotICogVE9ETzogUmVuYW1lIHRoaXMgY2xhc3MgdG8gUm9sZVNldEdyb3VwaW5nUm9sZVNldHNQYWdlIGFuZCBtb3ZlIGl0IHRvIHRoZQotICogb20uaWJtLnJtYy5hdXRob3JpbmcudWkudXRpbC5mb3JtcyBwYWNrYWdlCi0gKi8KLXB1YmxpYyBjbGFzcyBSb2xlU2V0R3JvdXBpbmdSb2xlU2V0cyBleHRlbmRzIEFzc29jaWF0aW9uRm9ybVBhZ2UgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZPUk1fUEFHRV9JRCA9ICJyb2xlU2V0R3JvdXBpbmdSb2xlU2V0c1BhZ2UiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIFJvbGVTZXRHcm91cGluZyByb2xlU2V0R3JvdXBpbmc7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBSb2xlU2V0R3JvdXBpbmdSb2xlU2V0cyhGb3JtRWRpdG9yIGVkaXRvcikgewotCQlzdXBlcihlZGl0b3IsIEZPUk1fUEFHRV9JRCwgQXV0aG9yaW5nVUlUZXh0LlJPTEVfU0VUU19QQUdFX1RJVExFKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNpbml0KG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlLCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJRWRpdG9yU2l0ZSBzaXRlLCBJRWRpdG9ySW5wdXQgaW5wdXQpIHsKLQkJc3VwZXIuaW5pdChzaXRlLCBpbnB1dCk7Ci0JCXJvbGVTZXRHcm91cGluZyA9IChSb2xlU2V0R3JvdXBpbmcpIGNvbnRlbnRFbGVtZW50OwotCQlzZXRVc2VDYXRlZ29yeTIoZmFsc2UpOwotCQlzZXRVc2VDYXRlZ29yeTMoZmFsc2UpOwotCQlzZXRBbGxvd0NoYW5nZTEodHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjaW5pdENvbnRlbnRQcm92aWRlclNlbGVjdGVkKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0Q29udGVudFByb3ZpZGVyU2VsZWN0ZWQoKSB7Ci0JCWNvbnRlbnRQcm92aWRlclNlbGVjdGVkID0gbmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKAotCQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpIHsKLQkJCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuICgoUm9sZVNldEdyb3VwaW5nKSBvYmplY3QpLmdldFJvbGVTZXRzKCkudG9BcnJheSgpOwotCQkJfQotCQl9OwotCQl2aWV3ZXJfc2VsZWN0ZWQuc2V0Q29udGVudFByb3ZpZGVyKGNvbnRlbnRQcm92aWRlclNlbGVjdGVkKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNhZGRJdGVtc1RvTW9kZWwxKEFycmF5TGlzdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRJdGVtc1RvTW9kZWwxKEFycmF5TGlzdCBhZGRJdGVtcykgewotCQkvLyBVcGRhdGUgdGhlIG1vZGVsLgotCQlpZiAoIWFkZEl0ZW1zLmlzRW1wdHkoKSkgewotCQkJZWRpdG9yLmdldEFjdGlvbk1hbmFnZXIoKS5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5BRERfTUFOWSwKLQkJCQkJcm9sZVNldEdyb3VwaW5nLAotCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRSb2xlU2V0R3JvdXBpbmdfUm9sZVNldHMoKSwKLQkJCQkJYWRkSXRlbXMsIC0xKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI3JlbW92ZUl0ZW1zRnJvbU1vZGVsMShBcnJheUxpc3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlSXRlbXNGcm9tTW9kZWwxKEFycmF5TGlzdCBybUl0ZW1zKSB7Ci0JCS8vIFVwZGF0ZSB0aGUgbW9kZWwuCi0JCWlmICghcm1JdGVtcy5pc0VtcHR5KCkpIHsKLQkJCWVkaXRvci5nZXRBY3Rpb25NYW5hZ2VyKCkuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuUkVNT1ZFX01BTlksCi0JCQkJCXJvbGVTZXRHcm91cGluZywKLQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Um9sZVNldEdyb3VwaW5nX1JvbGVTZXRzKCksCi0JCQkJCXJtSXRlbXMsIC0xKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2dldENvbnRlbnRFbGVtZW50KCkKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGdldENvbnRlbnRFbGVtZW50KCkgewotCQlyZXR1cm4gcm9sZVNldEdyb3VwaW5nOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2dldFRhYlN0cmluZygpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRUYWJTdHJpbmcoKSB7Ci0JCXJldHVybiBGaWx0ZXJDb25zdGFudHMuUk9MRVNFVFM7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjZ2V0RmlsdGVyKCkKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpbHRlciBnZXRGaWx0ZXIoKSB7Ci0JCXJldHVybiBmaWx0ZXIgPSBuZXcgQ2F0ZWdvcnlGaWx0ZXIoKSB7Ci0JCQlwcm90ZWN0ZWQgYm9vbGVhbiBjaGlsZEFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCQkJcmV0dXJuIChvYmogaW5zdGFuY2VvZiBSb2xlU2V0KTsKLQkJCX0KLQkJfTsKLQl9Ci0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0TXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbihpbnQpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRNdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uKGludCBjb3VudCkgewotCQlyZXR1cm4gc3VwZXIuZ2V0TXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbihjb3VudCwgQXV0aG9yaW5nVUlSZXNvdXJjZXMucm9sZVNldEdyb3VwaW5nUm9sZVNldHNQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb24pOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNnZXRTZWN0aW9uRGVzY3JpcHRpb24oKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VjdGlvbkRlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMucm9sZVNldEdyb3VwaW5nUm9sZVNldHNQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNnZXRTZWN0aW9uTmFtZSgpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTZWN0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLnJvbGVTZXRHcm91cGluZ1JvbGVTZXRzUGFnZV9zZWN0aW9uTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNnZXRTZWxlY3RlZExhYmVsKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlbGVjdGVkTGFiZWwoKSB7Ci0JCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy5yb2xlU2V0R3JvdXBpbmdSb2xlU2V0c1BhZ2Vfc2VsZWN0ZWRMYWJlbDsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0U2VsZWN0ZWRMYWJlbDIoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VsZWN0ZWRMYWJlbDIoKSB7Ci0JCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy5yb2xlU2V0R3JvdXBpbmdSb2xlU2V0c1BhZ2Vfc2VsZWN0ZWRMYWJlbDsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0U2VsZWN0ZWRMYWJlbDMoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VsZWN0ZWRMYWJlbDMoKSB7Ci0JCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy5yb2xlU2V0R3JvdXBpbmdSb2xlU2V0c1BhZ2Vfc2VsZWN0ZWRMYWJlbDsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL1JvbGVTZXRSb2xlc1BhZ2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvUm9sZVNldFJvbGVzUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZTc1MWI5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvUm9sZVNldFJvbGVzUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZmlsdGVycy5Db250ZW50RmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JQWN0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuTW92ZUluTGlzdENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5GaWx0ZXJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkNhdGVnb3J5U29ydEhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuQ29udGVudEVsZW1lbnRPcmRlckxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLk1vZGVsU3RydWN0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudENhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLmVkaXRvci5Gb3JtRWRpdG9yOwotCi0KLS8qKgotICogVGhlIFJvbGVzIHBhZ2UgaW4gdGhlIFJvbGUgU2V0IGVkaXRvci4KLSAqIAotICogQGF1dGhvciBMb2thbmF0aCBKYWdnYQotICogQGF1dGhvciBCaW5neHVlIFh1Ci0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFJvbGVTZXRSb2xlc1BhZ2UgZXh0ZW5kcyBBc3NvY2lhdGlvbkZvcm1QYWdlIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JNX1BBR0VfSUQgPSAicm9sZVNldFJvbGVzUGFnZSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgUm9sZVNldCByb2xlU2V0OwotCQotCXByaXZhdGUgQ29udGVudEVsZW1lbnRPcmRlckxpc3QgYWxsU3RlcHM7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBSb2xlU2V0Um9sZXNQYWdlKEZvcm1FZGl0b3IgZWRpdG9yKSB7Ci0JCXN1cGVyKGVkaXRvciwgRk9STV9QQUdFX0lELCBBdXRob3JpbmdVSVRleHQuUk9MRVNfUEFHRV9USVRMRSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjaW5pdChvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZSwgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0KQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSUVkaXRvclNpdGUgc2l0ZSwgSUVkaXRvcklucHV0IGlucHV0KSB7Ci0JCXN1cGVyLmluaXQoc2l0ZSwgaW5wdXQpOwotCQlyb2xlU2V0ID0gKFJvbGVTZXQpIGNvbnRlbnRFbGVtZW50OwotCQlzZXRVc2VDYXRlZ29yeTIoZmFsc2UpOwotCQlzZXRVc2VDYXRlZ29yeTMoZmFsc2UpOwotCQlzZXRJc1VwQW5kRG93bkJ1dHRvbnNSZXF1aXJlZDEodHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjaW5pdENvbnRlbnRQcm92aWRlclNlbGVjdGVkKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0Q29udGVudFByb3ZpZGVyU2VsZWN0ZWQoKSB7Ci0JCWNvbnRlbnRQcm92aWRlclNlbGVjdGVkID0gbmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKAotCQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpIHsKLQkJCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJLy9yZXR1cm4gKChSb2xlU2V0KSBvYmplY3QpLmdldFJvbGVzKCkudG9BcnJheSgpOwotCQkJCWlmIChhbGxTdGVwcyA9PSBudWxsKSB7Ci0JCQkJCWFsbFN0ZXBzID0gbmV3IENvbnRlbnRFbGVtZW50T3JkZXJMaXN0KAotCQkJCQkJCWNvbnRlbnRFbGVtZW50LAotCQkJCQkJCUNvbnRlbnRFbGVtZW50T3JkZXJMaXN0LkNPTlRFTlRfRUxFTUVOVFNfX0ZPUl9FTEVNRU5UX09OTFksCi0JCQkJCQkJZ2V0T3JkZXJGZWF0dXJlKCkpOwotCQkJCX0KLQkJCQlMaXN0IHJldHVybkxpc3QgPSBDYXRlZ29yeVNvcnRIZWxwZXIuc29ydENhdGVnb3J5RWxlbWVudHMoY29udGVudEVsZW1lbnQsIAotCQkJCQkJYWxsU3RlcHMudG9BcnJheSgpKTsKLQkJCQlyZXR1cm4gcmV0dXJuTGlzdC50b0FycmF5KCk7Ci0JCQl9Ci0JCX07Ci0JCXZpZXdlcl9zZWxlY3RlZC5zZXRDb250ZW50UHJvdmlkZXIoY29udGVudFByb3ZpZGVyU2VsZWN0ZWQpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2FkZEl0ZW1zVG9Nb2RlbDEoQXJyYXlMaXN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEl0ZW1zVG9Nb2RlbDEoQXJyYXlMaXN0IGFkZEl0ZW1zKSB7Ci0JCS8vIFVwZGF0ZSB0aGUgbW9kZWwuCi0JCWlmICghYWRkSXRlbXMuaXNFbXB0eSgpKSB7Ci0JCQllZGl0b3IuZ2V0QWN0aW9uTWFuYWdlcigpLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLkFERF9NQU5ZLAotCQkJCQlyb2xlU2V0LCBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRSb2xlU2V0X1JvbGVzKCksIGFkZEl0ZW1zLAotCQkJCQktMSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNyZW1vdmVJdGVtc0Zyb21Nb2RlbDEoQXJyYXlMaXN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbW92ZUl0ZW1zRnJvbU1vZGVsMShBcnJheUxpc3Qgcm1JdGVtcykgewotCQkvLyBVcGRhdGUgdGhlIG1vZGVsLgotCQlpZiAoIXJtSXRlbXMuaXNFbXB0eSgpKSB7Ci0JCQllZGl0b3IuZ2V0QWN0aW9uTWFuYWdlcigpLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlJFTU9WRV9NQU5ZLAotCQkJCQlyb2xlU2V0LCBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRSb2xlU2V0X1JvbGVzKCksIHJtSXRlbXMsCi0JCQkJCS0xKTsKLQkJfQotCX0KLQkJCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjZ2V0Q29udGVudEVsZW1lbnQoKQotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZ2V0Q29udGVudEVsZW1lbnQoKSB7Ci0JCXJldHVybiByb2xlU2V0OwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2dldFRhYlN0cmluZygpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRUYWJTdHJpbmcoKSB7Ci0JCXJldHVybiBGaWx0ZXJDb25zdGFudHMuUk9MRVM7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjZ2V0RmlsdGVyKCkKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpbHRlciBnZXRGaWx0ZXIoKSB7Ci0JCXJldHVybiBmaWx0ZXIgPSBuZXcgQ29udGVudEZpbHRlcigpIHsKLQkJCXByb3RlY3RlZCBib29sZWFuIGNoaWxkQWNjZXB0KE9iamVjdCBvYmopIHsKLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgQ29udGVudEVsZW1lbnQpIHsKLQkJCQkJaWYgKGdldEhlbHBlcigpLmlzQ29udHJpYnV0b3IoKENvbnRlbnRFbGVtZW50KSBvYmopKQotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCQlyZXR1cm4gKG9iaiBpbnN0YW5jZW9mIFJvbGUpOwotCQkJfQotCQl9OwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldE11bHRpcGxlU2VsZWN0RGVzY3JpcHRpb24oaW50KQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbihpbnQgY291bnQpIHsKLQkJcmV0dXJuIHN1cGVyLmdldE11bHRpcGxlU2VsZWN0RGVzY3JpcHRpb24oY291bnQsIEF1dGhvcmluZ1VJUmVzb3VyY2VzLnJvbGVTZXRSb2xlc1BhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbik7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldFNlY3Rpb25EZXNjcmlwdGlvbigpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTZWN0aW9uRGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy5yb2xlU2V0Um9sZXNQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNnZXRTZWN0aW9uTmFtZSgpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTZWN0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLnJvbGVTZXRSb2xlc1BhZ2Vfc2VjdGlvbk5hbWU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0U2VsZWN0ZWRMYWJlbCgpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTZWxlY3RlZExhYmVsKCkgewotCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMucm9sZVNldFJvbGVzUGFnZV9zZWxlY3RlZExhYmVsOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNnZXRTZWxlY3RlZExhYmVsMigpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTZWxlY3RlZExhYmVsMigpIHsKLQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLnJvbGVTZXRSb2xlc1BhZ2Vfc2VsZWN0ZWRMYWJlbDsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0U2VsZWN0ZWRMYWJlbDMoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VsZWN0ZWRMYWJlbDMoKSB7Ci0JCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy5yb2xlU2V0Um9sZXNQYWdlX3NlbGVjdGVkTGFiZWw7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFU3RydWN0dXJhbEZlYXR1cmUgZ2V0T3JkZXJGZWF0dXJlKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Um9sZVNldF9Sb2xlcygpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmdbXSBnZXRNb2RlbFN0cnVjdHVyZVBhdGgoKSB7Ci0JCXJldHVybiBNb2RlbFN0cnVjdHVyZS5ERUZBVUxULnJvbGVTZXRQYXRoOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQ29udGVudEVsZW1lbnRPcmRlckxpc3QgZ2V0Q29udGVudEVsZW1lbnRPcmRlckxpc3QoKSB7Ci0JCXJldHVybiBhbGxTdGVwczsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvUm9sZVRhc2tzUGFnZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9Sb2xlVGFza3NQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3NzVhZGQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9Sb2xlVGFza3NQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3JtczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZmlsdGVycy5Db250ZW50RmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JQWN0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLkZpbHRlckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQXNzb2NpYXRpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLmVkaXRvci5Gb3JtRWRpdG9yOwotCi0KLS8qKgotICogVGhlIFRhc2tzIHBhZ2UgaW4gdGhlIFJvbGUgZWRpdG9yLgotICogCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBSb2xlVGFza3NQYWdlIGV4dGVuZHMgQXNzb2NpYXRpb25Gb3JtUGFnZSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9STV9QQUdFX0lEID0gInJvbGVUYXNrc1BhZ2UiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIFJvbGUgcm9sZTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFJvbGVUYXNrc1BhZ2UoRm9ybUVkaXRvciBlZGl0b3IpIHsKLQkJc3VwZXIoZWRpdG9yLCBGT1JNX1BBR0VfSUQsIEF1dGhvcmluZ1VJVGV4dC5UQVNLU19QQUdFX1RJVExFKTsgCi0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjaW5pdChvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZSwgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0KQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSUVkaXRvclNpdGUgc2l0ZSwgSUVkaXRvcklucHV0IGlucHV0KSB7Ci0JCXN1cGVyLmluaXQoc2l0ZSwgaW5wdXQpOwotCQlyb2xlID0gKFJvbGUpIGNvbnRlbnRFbGVtZW50OwotCQlzZXRVc2VDYXRlZ29yeTMoZmFsc2UpOwotCQlzZXRBbGxvd0NoYW5nZTEoZmFsc2UpOwotCQlzZXRBbGxvd0NoYW5nZTIoZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2luaXRDb250ZW50UHJvdmlkZXJTZWxlY3RlZCgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdENvbnRlbnRQcm92aWRlclNlbGVjdGVkKCkgewotCQljb250ZW50UHJvdmlkZXJTZWxlY3RlZCA9IG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcigKLQkJCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkJLmdldE5hdmlnYXRvclZpZXdfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKSB7Ci0JCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IG9iamVjdCkgewotCQkJCXJldHVybiBBc3NvY2lhdGlvbkhlbHBlci5nZXRQcmltYXJ5VGFza3MoKFJvbGUpIG9iamVjdCkKLQkJCQkJCS50b0FycmF5KCk7Ci0JCQl9Ci0JCX07Ci0JCXZpZXdlcl9zZWxlY3RlZC5zZXRDb250ZW50UHJvdmlkZXIoY29udGVudFByb3ZpZGVyU2VsZWN0ZWQpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2FkZEl0ZW1zVG9Nb2RlbDEoQXJyYXlMaXN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEl0ZW1zVG9Nb2RlbDEoQXJyYXlMaXN0IGFkZEl0ZW1zKSB7Ci0JCS8vIFVwZGF0ZSB0aGUgbW9kZWwuCi0JCWlmICghYWRkSXRlbXMuaXNFbXB0eSgpKSB7Ci0JCQlMaXN0IGVsZW1lbnRMaXN0ID0gcmV0cmlldmVUYWJsZVZpZXdlckNvbnRlbnRzKHZpZXdlcl9zZWxlY3RlZDIpOwotCQkJZm9yIChqYXZhLnV0aWwuSXRlcmF0b3IgaXQgPSBhZGRJdGVtcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJVGFzayB0YXNrID0gKFRhc2spIGl0Lm5leHQoKTsKLQkJCQlpZiAoIWVsZW1lbnRMaXN0LmNvbnRhaW5zKHRhc2spKSB7Ci0JCQkJCWVkaXRvci5nZXRBY3Rpb25NYW5hZ2VyKCkuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuU0VULAotCQkJCQkJCXRhc2ssIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tfUGVyZm9ybWVkQnkoKSwKLQkJCQkJCQlyb2xlLCAtMSk7Ci0JCQkJfQotCQkJfQotCQkJc2V0RGlydHkodHJ1ZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNyZW1vdmVJdGVtc0Zyb21Nb2RlbDEoQXJyYXlMaXN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbW92ZUl0ZW1zRnJvbU1vZGVsMShBcnJheUxpc3Qgcm1JdGVtcykgewotCQkvLyBVcGRhdGUgdGhlIG1vZGVsLgotCQlpZiAoIXJtSXRlbXMuaXNFbXB0eSgpKSB7Ci0JCQlnZXRBY3Rpb25NYW5hZ2VyKCkuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuUkVNT1ZFX01BTlksIHJvbGUsCi0JCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tfUGVyZm9ybWVkQnkoKSwgcm1JdGVtcywgLTEpOwotCQkJc2V0RGlydHkodHJ1ZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNpbml0Q29udGVudFByb3ZpZGVyU2VsZWN0ZWQyKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0Q29udGVudFByb3ZpZGVyU2VsZWN0ZWQyKCkgewotCQljb250ZW50UHJvdmlkZXJTZWxlY3RlZDIgPSBuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoCi0JCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJCS5nZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSkgewotCQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gQXNzb2NpYXRpb25IZWxwZXIuZ2V0U2Vjb25kYXJ5VGFza3MoKFJvbGUpIG9iamVjdCkKLQkJCQkJCS50b0FycmF5KCk7Ci0JCQl9Ci0JCX07Ci0JCXZpZXdlcl9zZWxlY3RlZDIuc2V0Q29udGVudFByb3ZpZGVyKGNvbnRlbnRQcm92aWRlclNlbGVjdGVkMik7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjYWRkSXRlbXNUb01vZGVsMihBcnJheUxpc3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkSXRlbXNUb01vZGVsMihBcnJheUxpc3QgYWRkSXRlbXMpIHsKLQkJLy8gVXBkYXRlIHRoZSBtb2RlbC4KLQkJaWYgKCFhZGRJdGVtcy5pc0VtcHR5KCkpIHsKLQkJCUxpc3QgZWxlbWVudExpc3QgPSByZXRyaWV2ZVRhYmxlVmlld2VyQ29udGVudHModmlld2VyX3NlbGVjdGVkKTsKLQkJCWZvciAoamF2YS51dGlsLkl0ZXJhdG9yIGl0ID0gYWRkSXRlbXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCVRhc2sgdGFzayA9IChUYXNrKSBpdC5uZXh0KCk7Ci0JCQkJaWYgKCFlbGVtZW50TGlzdC5jb250YWlucyh0YXNrKSkgewotCQkJCQl0YXNrLmdldEFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5KCkuYWRkKHJvbGUpOwotCQkJCX0KLQkJCX0KLQkJCXNldERpcnR5KHRydWUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjcmVtb3ZlSXRlbXNGcm9tTW9kZWwyKEFycmF5TGlzdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVJdGVtc0Zyb21Nb2RlbDIoQXJyYXlMaXN0IHJtSXRlbXMpIHsKLQkJLy8gVXBkYXRlIHRoZSBtb2RlbC4KLQkJaWYgKCFybUl0ZW1zLmlzRW1wdHkoKSkgewotCQkJZm9yIChqYXZhLnV0aWwuSXRlcmF0b3IgaXQgPSBybUl0ZW1zLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlUYXNrIHRhc2sgPSAoVGFzaykgaXQubmV4dCgpOwotCQkJCXRhc2suZ2V0QWRkaXRpb25hbGx5UGVyZm9ybWVkQnkoKS5yZW1vdmUocm9sZSk7Ci0JCQl9Ci0JCQlzZXREaXJ0eSh0cnVlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2dldENvbnRlbnRFbGVtZW50KCkKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGdldENvbnRlbnRFbGVtZW50KCkgewotCQlyZXR1cm4gcm9sZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRUYWJTdHJpbmcoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0VGFiU3RyaW5nKCkgewotCQlyZXR1cm4gRmlsdGVyQ29uc3RhbnRzLlRBU0tTOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2dldEZpbHRlcigpCi0JICovCi0JcHJvdGVjdGVkIElGaWx0ZXIgZ2V0RmlsdGVyKCkgewotCQlyZXR1cm4gZmlsdGVyID0gbmV3IENvbnRlbnRGaWx0ZXIoKSB7Ci0JCQlwcm90ZWN0ZWQgYm9vbGVhbiBjaGlsZEFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCQkJcmV0dXJuIChvYmogaW5zdGFuY2VvZiBUYXNrKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNnZXRNdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uKGludCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldE11bHRpcGxlU2VsZWN0RGVzY3JpcHRpb24oaW50IGNvdW50KSB7Ci0JCXJldHVybiBzdXBlci5nZXRNdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uKGNvdW50LCBBdXRob3JpbmdVSVJlc291cmNlcy5yb2xlVGFza3NQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb24pOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNnZXRTZWN0aW9uRGVzY3JpcHRpb24oKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VjdGlvbkRlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMucm9sZVRhc2tzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb247Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0U2VjdGlvbk5hbWUoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VjdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy5yb2xlVGFza3NQYWdlX3NlY3Rpb25OYW1lOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldFNlbGVjdGVkTGFiZWwoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VsZWN0ZWRMYWJlbCgpIHsKLQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLnJvbGVUYXNrc1BhZ2Vfc2VsZWN0ZWRMYWJlbDsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0U2VsZWN0ZWRMYWJlbDIoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VsZWN0ZWRMYWJlbDIoKSB7Ci0JCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy5yb2xlVGFza3NQYWdlX3NlbGVjdGVkTGFiZWwyOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvUm9sZVdvcmtQcm9kdWN0c1BhZ2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvUm9sZVdvcmtQcm9kdWN0c1BhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzEyMTBiYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL1JvbGVXb3JrUHJvZHVjdHNQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3JtczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZmlsdGVycy5Xb3JrUHJvZHVjdEZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSUFjdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5GaWx0ZXJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQXNzb2NpYXRpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLklNYW5hZ2VkRm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuRm9ybUVkaXRvcjsKLQotCi0vKioKLSAqIFRoZSBXb3JrIFByb2R1Y3RzIHBhZ2UgaW4gdGhlIFJvbGUgZWRpdG9yLgotICogCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBSb2xlV29ya1Byb2R1Y3RzUGFnZSBleHRlbmRzIEFzc29jaWF0aW9uRm9ybVBhZ2UgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZPUk1fUEFHRV9JRCA9ICJyb2xlV29ya1Byb2R1Y3RzUGFnZSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgUm9sZSByb2xlOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgUm9sZVdvcmtQcm9kdWN0c1BhZ2UoRm9ybUVkaXRvciBlZGl0b3IpIHsKLQkJc3VwZXIoZWRpdG9yLCBGT1JNX1BBR0VfSUQsIEF1dGhvcmluZ1VJVGV4dC5XT1JLX1BST0RVQ1RTX1BBR0VfVElUTEUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2luaXQob3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGUsIG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElFZGl0b3JTaXRlIHNpdGUsIElFZGl0b3JJbnB1dCBpbnB1dCkgewotCQlzdXBlci5pbml0KHNpdGUsIGlucHV0KTsKLQkJcm9sZSA9IChSb2xlKSBjb250ZW50RWxlbWVudDsKLQkJc2V0VXNlQ2F0ZWdvcnkzKGZhbHNlKTsKLQkJc2V0QWxsb3dDaGFuZ2UxKHRydWUpOwotCQlzZXRBbGxvd0NoYW5nZTIodHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuY3JlYXRlRm9ybUNvbnRlbnQoSU1hbmFnZWRGb3JtKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUZvcm1Db250ZW50KElNYW5hZ2VkRm9ybSBtYW5hZ2VkRm9ybSkgewotCQlzdXBlci5jcmVhdGVGb3JtQ29udGVudChtYW5hZ2VkRm9ybSk7Ci0JCWN0cmxfYWRkMi5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJY3RybF9yZW1vdmUyLnNldFZpc2libGUoZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2luaXRDb250ZW50UHJvdmlkZXJTZWxlY3RlZCgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdENvbnRlbnRQcm92aWRlclNlbGVjdGVkKCkgewotCQljb250ZW50UHJvdmlkZXJTZWxlY3RlZCA9IG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcigKLQkJCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkJLmdldE5hdmlnYXRvclZpZXdfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKSB7Ci0JCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IG9iamVjdCkgewotCQkJCXJldHVybiAoKFJvbGUpIG9iamVjdCkuZ2V0UmVzcG9uc2libGVGb3IoKS50b0FycmF5KCk7Ci0JCQl9Ci0JCX07Ci0JCXZpZXdlcl9zZWxlY3RlZC5zZXRDb250ZW50UHJvdmlkZXIoY29udGVudFByb3ZpZGVyU2VsZWN0ZWQpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2FkZEl0ZW1zVG9Nb2RlbDEoQXJyYXlMaXN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEl0ZW1zVG9Nb2RlbDEoQXJyYXlMaXN0IGFkZEl0ZW1zKSB7Ci0JCS8vIFVwZGF0ZSB0aGUgbW9kZWwuCi0JCWlmKCFhZGRJdGVtcy5pc0VtcHR5KCkpIHsKLQkJCWdldEFjdGlvbk1hbmFnZXIoKS5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5BRERfTUFOWSwgcm9sZSwgVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Um9sZV9SZXNwb25zaWJsZUZvcigpLCBhZGRJdGVtcywgLTEpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjcmVtb3ZlSXRlbXNGcm9tTW9kZWwxKEFycmF5TGlzdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVJdGVtc0Zyb21Nb2RlbDEoQXJyYXlMaXN0IHJtSXRlbXMpIHsKLQkJLy8gVXBkYXRlIHRoZSBtb2RlbC4KLQkJaWYgKCFybUl0ZW1zLmlzRW1wdHkoKSkgewotLy8JCQlmb3IgKGludCBpID0gMDsgaSA8IHJtSXRlbXMuc2l6ZSgpOyBpKyspIHsKLS8vCQkJCUxpYnJhcnlNYW5hZ2VyLmdldEluc3RhbmNlKCkuc2V0UmVzcG9uc2libGVSb2xlKAotLy8JCQkJCQlnZXRBY3Rpb25NYW5hZ2VyKCksIChXb3JrUHJvZHVjdCkgcm1JdGVtcy5nZXQoaSksIG51bGwpOwotLy8JCQl9Ci0JCQkKLQkJCWdldEFjdGlvbk1hbmFnZXIoKS5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5SRU1PVkVfTUFOWSwgcm9sZSwgVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Um9sZV9SZXNwb25zaWJsZUZvcigpLCBybUl0ZW1zLCAtMSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNpbml0Q29udGVudFByb3ZpZGVyU2VsZWN0ZWQyKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0Q29udGVudFByb3ZpZGVyU2VsZWN0ZWQyKCkgewotCQljb250ZW50UHJvdmlkZXJTZWxlY3RlZDIgPSBuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoCi0JCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJCS5nZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSkgewotCQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gQXNzb2NpYXRpb25IZWxwZXIuZ2V0TW9kaWZpZWRXb3JrUHJvZHVjdHMoKFJvbGUpIG9iamVjdCkKLQkJCQkJCS50b0FycmF5KCk7Ci0JCQl9Ci0JCX07Ci0JCXZpZXdlcl9zZWxlY3RlZDIuc2V0Q29udGVudFByb3ZpZGVyKGNvbnRlbnRQcm92aWRlclNlbGVjdGVkMik7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjZ2V0Q29udGVudEVsZW1lbnQoKQotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZ2V0Q29udGVudEVsZW1lbnQoKSB7Ci0JCXJldHVybiByb2xlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2dldFRhYlN0cmluZygpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRUYWJTdHJpbmcoKSB7Ci0JCXJldHVybiBGaWx0ZXJDb25zdGFudHMuV09SS1BST0RVQ1RTOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2dldEZpbHRlcigpCi0JICovCi0JcHJvdGVjdGVkIElGaWx0ZXIgZ2V0RmlsdGVyKCkgewotCQlyZXR1cm4gZmlsdGVyID0gbmV3IFdvcmtQcm9kdWN0RmlsdGVyKCk7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldE11bHRpcGxlU2VsZWN0RGVzY3JpcHRpb24oaW50KQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbihpbnQgY291bnQpIHsKLQkJcmV0dXJuIHN1cGVyLmdldE11bHRpcGxlU2VsZWN0RGVzY3JpcHRpb24oY291bnQsIEF1dGhvcmluZ1VJUmVzb3VyY2VzLnJvbGVXb3JrUHJvZHVjdHNQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb24pOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNnZXRTZWN0aW9uRGVzY3JpcHRpb24oKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VjdGlvbkRlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMucm9sZVdvcmtQcm9kdWN0c1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldFNlY3Rpb25OYW1lKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlY3Rpb25OYW1lKCkgewotCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMucm9sZVdvcmtQcm9kdWN0c1BhZ2Vfc2VjdGlvbk5hbWU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0U2VsZWN0ZWRMYWJlbCgpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTZWxlY3RlZExhYmVsKCkgewotCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMucm9sZVdvcmtQcm9kdWN0c1BhZ2Vfc2VsZWN0ZWRMYWJlbDsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0U2VsZWN0ZWRMYWJlbDIoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VsZWN0ZWRMYWJlbDIoKSB7Ci0JCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy5yb2xlV29ya1Byb2R1Y3RzUGFnZV9zZWxlY3RlZExhYmVsMjsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0U2VsZWN0ZWRMYWJlbDMoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VsZWN0ZWRMYWJlbDMoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9UYXNrQ2F0ZWdvcmllc1BhZ2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvVGFza0NhdGVnb3JpZXNQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmNGE0YmUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9UYXNrQ2F0ZWdvcmllc1BhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zOwotCi1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZmlsdGVycy5DYXRlZ29yeUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZpbHRlcnMuQ3VzdG9tQ2F0ZWdvcnlGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLkZpbHRlckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuTWVzc2VuZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuTGlicmFyeU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DdXN0b21DYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpc2NpcGxpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5Bc3NvY2lhdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuZWRpdG9yLkZvcm1FZGl0b3I7Ci0KLQotLyoqCi0gKiBUaGUgQ2F0ZWdvcmllcyBwYWdlIGluIHRoZSBUYXNrIGVkaXRvci4KLSAqIAotICogQGF1dGhvciBKZWZmIEhhcmR5Ci0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFRhc2tDYXRlZ29yaWVzUGFnZSBleHRlbmRzIEFzc29jaWF0aW9uRm9ybVBhZ2UgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZPUk1fUEFHRV9JRCA9ICJ0YXNrQ2F0ZWdvcmllc1BhZ2UiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIFRhc2sgdGFzazsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFRhc2tDYXRlZ29yaWVzUGFnZShGb3JtRWRpdG9yIGVkaXRvcikgewotCQlzdXBlcihlZGl0b3IsIEZPUk1fUEFHRV9JRCwgQXV0aG9yaW5nVUlUZXh0LkNBVEVHT1JJRVNfUEFHRV9USVRMRSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjaW5pdChvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZSwgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0KQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSUVkaXRvclNpdGUgc2l0ZSwgSUVkaXRvcklucHV0IGlucHV0KSB7Ci0JCXN1cGVyLmluaXQoc2l0ZSwgaW5wdXQpOwotCQl0YXNrID0gKFRhc2spIGNvbnRlbnRFbGVtZW50OwotLy8JCXNldENhdGVnb3J5SXNTaW5nbGVTZWxlY3Rpb24xKHRydWUpOwotCQlzZXRBbGxvd0NoYW5nZTEodHJ1ZSk7Ci0JCXNldEFsbG93Q2hhbmdlMih0cnVlKTsKLQkJc2V0VXNlQ2F0ZWdvcnkzKGZhbHNlKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNpbml0Q29udGVudFByb3ZpZGVyU2VsZWN0ZWQoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRDb250ZW50UHJvdmlkZXJTZWxlY3RlZCgpIHsKLQkJY29udGVudFByb3ZpZGVyU2VsZWN0ZWQgPSBuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoCi0JCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJCS5nZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSkgewotCQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gQXNzb2NpYXRpb25IZWxwZXIuZ2V0RGlzY2lwbGluZXMoKFRhc2spIG9iamVjdCkudG9BcnJheSgpOwkJCQkKLQkJCX0KLQkJfTsKLQkJdmlld2VyX3NlbGVjdGVkLnNldENvbnRlbnRQcm92aWRlcihjb250ZW50UHJvdmlkZXJTZWxlY3RlZCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjYWRkSXRlbXNUb01vZGVsMShBcnJheUxpc3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkSXRlbXNUb01vZGVsMShBcnJheUxpc3QgYWRkSXRlbXMpIHsKLQkJLy8gVXBkYXRlIHRoZSBtb2RlbC4KLQkJaWYgKCFhZGRJdGVtcy5pc0VtcHR5KCkpIHsKLQkJCWZvcihJdGVyYXRvciBpdGVyYXRvciA9IGFkZEl0ZW1zLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspewotCQkJCU9iamVjdCBkaXNjaXBsaW5lID0gaXRlcmF0b3IubmV4dCgpOwotCQkJCWlmKGRpc2NpcGxpbmUgaW5zdGFuY2VvZiBEaXNjaXBsaW5lKXsKLS8vCQkJCQlMaXN0IGRpc2NpcGxpbmVzID0gQXNzb2NpYXRpb25IZWxwZXIuZ2V0RGlzY2lwbGluZXModGFzayk7Ci0vLwkJCQkJaWYgKGRpc2NpcGxpbmVzICE9IG51bGwgJiYgZGlzY2lwbGluZXMuc2l6ZSgpID4gMCkJewotLy8JCQkJCQlPYmplY3QgYXNzb2NpYXRlZERpc2NpcGxpbmUgPSBkaXNjaXBsaW5lcy5nZXQoMCk7Ci0vLwkJCQkJCVN0cmluZyBtc2cgPSBNZXNzYWdlRm9ybWF0Ci0vLwkJCQkJCS5mb3JtYXQoCi0vLwkJCQkJCQkJTGlicmFyeUVkaXRSZXNvdXJjZXMuVXNlckludGVyYWN0aW9uSGVscGVyX2VyclJlbGF0aW9uc2hpcEV4aXN0cywKLS8vCQkJCQkJCQluZXcgT2JqZWN0W10gewotLy8JCQkJCQkJCQkJdGFzay5nZXROYW1lKCksCi0vLwkJCQkJCQkJCQlUbmdVdGlsCi0vLwkJCQkJCQkJCQkJCS5nZXRMYWJlbFdpdGhQYXRoKGFzc29jaWF0ZWREaXNjaXBsaW5lKSwKLS8vCQkJCQkJCQkJCSgoRGlzY2lwbGluZSkgZGlzY2lwbGluZSkuZ2V0TmFtZSgpIH0pOwotLy8JCQkJCQlNZXNzZW5nZXIuSU5TVEFOQ0Uuc2hvd1dhcm5pbmcoCi0vLwkJCQkJCQkJTGlicmFyeUVkaXRSZXNvdXJjZXMuZXJyb3JEaWFsb2dfdGl0bGUsIG1zZyk7Ci0vLwkJCQkJCXJldHVybjsKLS8vCQkJCQl9Ci0KLQkJCQkJCi0JCQkJCUxpYnJhcnlNYW5hZ2VyLmdldEluc3RhbmNlKCkuYWRkVG9EaXNjaXBsaW5lKGdldEFjdGlvbk1hbmFnZXIoKSwKLQkJCQkJCShEaXNjaXBsaW5lKSBkaXNjaXBsaW5lLCB0YXNrLCB1c2VkQ2F0ZWdvcmllcyk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjcmVtb3ZlSXRlbXNGcm9tTW9kZWwxKEFycmF5TGlzdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVJdGVtc0Zyb21Nb2RlbDEoQXJyYXlMaXN0IHJtSXRlbXMpIHsKLQkJLy8gVXBkYXRlIHRoZSBtb2RlbC4KLQkJaWYgKCFybUl0ZW1zLmlzRW1wdHkoKSkgewotCQkJZm9yIChJdGVyYXRvciBpdCA9IHJtSXRlbXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCURpc2NpcGxpbmUgZGlzY2lwbGluZSA9IChEaXNjaXBsaW5lKSBpdC5uZXh0KCk7Ci0JCQkJTGlicmFyeU1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5yZW1vdmVGcm9tRGlzY2lwbGluZSgKLQkJCQkJCWdldEFjdGlvbk1hbmFnZXIoKSwgZGlzY2lwbGluZSwgdGFzaywgdXNlZENhdGVnb3JpZXMpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjaW5pdENvbnRlbnRQcm92aWRlclNlbGVjdGVkMigpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdENvbnRlbnRQcm92aWRlclNlbGVjdGVkMigpIHsKLQkJY29udGVudFByb3ZpZGVyU2VsZWN0ZWQyID0gbmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKAotCQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpIHsKLQkJCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIEFzc29jaWF0aW9uSGVscGVyLmdldEN1c3RvbUNhdGVnb3JpZXMoKFRhc2spIG9iamVjdCkKLQkJCQkJCS50b0FycmF5KCk7Ci0JCQl9Ci0JCX07Ci0JCXZpZXdlcl9zZWxlY3RlZDIuc2V0Q29udGVudFByb3ZpZGVyKGNvbnRlbnRQcm92aWRlclNlbGVjdGVkMik7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjYWRkSXRlbXNUb01vZGVsMigpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkSXRlbXNUb01vZGVsMihBcnJheUxpc3QgYWRkSXRlbXMpIHsKLQkJLy8gVXBkYXRlIHRoZSBtb2RlbC4KLQkJaWYgKCFhZGRJdGVtcy5pc0VtcHR5KCkpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBhZGRJdGVtcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJQ3VzdG9tQ2F0ZWdvcnkgY3VzdG9tQ2F0ZWdvcnkgPSAoQ3VzdG9tQ2F0ZWdvcnkpIGl0Lm5leHQoKTsKLQkJCQlMaWJyYXJ5TWFuYWdlci5nZXRJbnN0YW5jZSgpLmFkZFRvQ3VzdG9tQ2F0ZWdvcnkoCi0JCQkJCQlnZXRBY3Rpb25NYW5hZ2VyKCksIGN1c3RvbUNhdGVnb3J5LCB0YXNrLCB1c2VkQ2F0ZWdvcmllcyk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNyZW1vdmVJdGVtc0Zyb21Nb2RlbDIoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbW92ZUl0ZW1zRnJvbU1vZGVsMihBcnJheUxpc3Qgcm1JdGVtcykgewotCQkvLyBVcGRhdGUgdGhlIG1vZGVsLgotCQlpZiAoIXJtSXRlbXMuaXNFbXB0eSgpKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gcm1JdGVtcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJQ3VzdG9tQ2F0ZWdvcnkgY3VzdG9tQ2F0ZWdvcnkgPSAoQ3VzdG9tQ2F0ZWdvcnkpIGl0Lm5leHQoKTsKLQkJCQlMaWJyYXJ5TWFuYWdlci5nZXRJbnN0YW5jZSgpLnJlbW92ZUZyb21DdXN0b21DYXRlZ29yeSgKLQkJCQkJCWdldEFjdGlvbk1hbmFnZXIoKSwgY3VzdG9tQ2F0ZWdvcnksIHRhc2ssIHVzZWRDYXRlZ29yaWVzKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2dldENvbnRlbnRFbGVtZW50KCkKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGdldENvbnRlbnRFbGVtZW50KCkgewotCQlyZXR1cm4gdGFzazsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRUYWJTdHJpbmcoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0VGFiU3RyaW5nKCkgewotCQlyZXR1cm4gRmlsdGVyQ29uc3RhbnRzLkRJU0NJUExJTkVTOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2dldFRhYlN0cmluZzIoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0VGFiU3RyaW5nMigpIHsKLQkJcmV0dXJuIEZpbHRlckNvbnN0YW50cy5DVVNUT01fQ0FURUdPUklFUzsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRGaWx0ZXIoKQotCSAqLwotCXByb3RlY3RlZCBJRmlsdGVyIGdldEZpbHRlcigpIHsKLQkJcmV0dXJuIGZpbHRlciA9IG5ldyBDYXRlZ29yeUZpbHRlcigpIHsKLQkJCXByb3RlY3RlZCBib29sZWFuIGNoaWxkQWNjZXB0KE9iamVjdCBvYmopIHsKLQkJCQlyZXR1cm4gKG9iaiBpbnN0YW5jZW9mIERpc2NpcGxpbmUpOwotCQkJfQotCQl9OwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2dldEZpbHRlcigpCi0JICovCi0JcHJvdGVjdGVkIElGaWx0ZXIgZ2V0RmlsdGVyMigpIHsKLQkJcmV0dXJuIGZpbHRlcjIgPSBuZXcgQ3VzdG9tQ2F0ZWdvcnlGaWx0ZXIoKTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0U2VjdGlvbkRlc2NyaXB0aW9uKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlY3Rpb25EZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLnRhc2tDYXRlZ29yaWVzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb247Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0U2VjdGlvbk5hbWUoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VjdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy50YXNrQ2F0ZWdvcmllc1BhZ2Vfc2VjdGlvbk5hbWU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0U2VsZWN0ZWRMYWJlbCgpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTZWxlY3RlZExhYmVsKCkgewotCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMudGFza0NhdGVnb3JpZXNQYWdlX3NlbGVjdGVkTGFiZWw7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldFNlbGVjdGVkTGFiZWwyKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlbGVjdGVkTGFiZWwyKCkgewotCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMudGFza0NhdGVnb3JpZXNQYWdlX3NlbGVjdGVkTGFiZWwyOwotCX0KLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldE11bHRpcGxlU2VsZWN0RGVzY3JpcHRpb25TdHJpbmcoKSB7Ci0JCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy50YXNrQ2F0ZWdvcmllc1BhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvVGFza0Rlc2NyaXB0aW9uUGFnZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9UYXNrRGVzY3JpcHRpb25QYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkZDNhNjEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9UYXNrRGVzY3JpcHRpb25QYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3JtczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLk1ldGhvZEVsZW1lbnRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5maWx0ZXJzLkNvbnRlbnRGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5yaWNodGV4dC5JTWV0aG9kUmljaFRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JQWN0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLkZpbHRlckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLlZhcmlhYmlsaXR5QmFzZUVsZW1lbnRGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuRm9ybUVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLkZvcm1Ub29sa2l0OwotCi0KLS8qKgotICogVGhlIERlc2NyaXB0aW9uIHBhZ2UgZm9yIHRoZSBUYXNrIGVkaXRvci4KLSAqIAotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgVGFza0Rlc2NyaXB0aW9uUGFnZSBleHRlbmRzIERlc2NyaXB0aW9uRm9ybVBhZ2UgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZPUk1fUEFHRV9JRCA9ICJ0YXNrRGVzY3JpcHRpb25QYWdlIjsgLy8kTk9OLU5MUy0xJAkJCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkFTRV9UQVNLID0gQXV0aG9yaW5nVUlUZXh0LkJBU0VfRUxFTUVOVF9URVhUOwotCi0JcHJpdmF0ZSBJTWV0aG9kUmljaFRleHQgY3RybF9hbHRlcm5hdGl2ZXM7Ci0KLQlwcml2YXRlIFRhc2sgdGFzazsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFRhc2tEZXNjcmlwdGlvblBhZ2UoRm9ybUVkaXRvciBlZGl0b3IpIHsKLQkJc3VwZXIoZWRpdG9yLCBGT1JNX1BBR0VfSUQsIEF1dGhvcmluZ1VJVGV4dC5ERVNDUklQVElPTl9QQUdFX1RJVExFKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNpbml0KG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlLCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJRWRpdG9yU2l0ZSBzaXRlLCBJRWRpdG9ySW5wdXQgaW5wdXQpIHsKLQkJc3VwZXIuaW5pdChzaXRlLCBpbnB1dCk7Ci0JCXRhc2sgPSAoVGFzaykgY29udGVudEVsZW1lbnQ7Ci0JCXB1cnBvc2VPbiA9IHRydWU7Ci0JCWV4dGVybmFsSWRPbiA9IHRydWU7Ci0JCXNldExvbmdQcmVzZW50YXRpb25OYW1lT24odHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjY3JlYXRlRWRpdG9yQ29udGVudChGb3JtVG9vbGtpdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVFZGl0b3JDb250ZW50KEZvcm1Ub29sa2l0IHRvb2xraXQpIHsKLQkJc3VwZXIuY3JlYXRlRWRpdG9yQ29udGVudCh0b29sa2l0KTsKLQkJY3RybF9hbHRlcm5hdGl2ZXMgPSBjcmVhdGVSaWNoVGV4dEVkaXRXaXRoTGlua0ZvclNlY3Rpb24odG9vbGtpdCwKLQkJCQlkZXRhaWxDb21wb3NpdGUsIEF1dGhvcmluZ1VJVGV4dC5BTFRFUk5BVElWRVNfVEVYVCwgNDAsIDQwMCwKLQkJCQlERVRBSUxfU0VDVElPTl9JRCk7Ci0JCWxhYmVsX2Jhc2Uuc2V0VGV4dChCQVNFX1RBU0spOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2xvYWREYXRhKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBsb2FkRGF0YSgpIHsKLQkJc3VwZXIubG9hZERhdGEoKTsKLQkJU3RyaW5nIHB1cnBvc2UgPSAoKG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0aW9uKSB0YXNrLmdldFByZXNlbnRhdGlvbigpKQotCQkJCS5nZXRQdXJwb3NlKCk7Ci0JCVN0cmluZyBhbHRlcm5hdGl2ZXMgPSAoKG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0aW9uKSB0YXNrCi0JCQkJLmdldFByZXNlbnRhdGlvbigpKS5nZXRBbHRlcm5hdGl2ZXMoKTsKLQkJY3RybF9wdXJwb3NlLnNldFRleHQocHVycG9zZSA9PSBudWxsID8gIiIgOiBwdXJwb3NlKTsgLy8kTk9OLU5MUy0xJAkKLQkJY3RybF9hbHRlcm5hdGl2ZXMuc2V0VGV4dChhbHRlcm5hdGl2ZXMgPT0gbnVsbCA/ICIiIDogYWx0ZXJuYXRpdmVzKTsgLy8kTk9OLU5MUy0xJAkKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNhZGRMaXN0ZW5lcnMoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZExpc3RlbmVycygpIHsKLQkJc3VwZXIuYWRkTGlzdGVuZXJzKCk7Ci0JCWZpbmFsIE1ldGhvZEVsZW1lbnRFZGl0b3IgZWRpdG9yID0gKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpOwotCi0JCWN0cmxfcHVycG9zZS5zZXRNb2RhbE9iamVjdChjb250ZW50RWxlbWVudC5nZXRQcmVzZW50YXRpb24oKSk7Ci0JCWN0cmxfcHVycG9zZS5zZXRNb2RhbE9iamVjdEZlYXR1cmUoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0VGFza0Rlc2NyaXB0aW9uX1B1cnBvc2UoKSk7Ci0JCWN0cmxfcHVycG9zZS5hZGRNb2RpZnlMaXN0ZW5lcihjb250ZW50TW9kaWZ5TGlzdGVuZXIpOwotCQljdHJsX3B1cnBvc2UuYWRkTGlzdGVuZXIoU1dULkRlYWN0aXZhdGUsIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQlJTWV0aG9kUmljaFRleHQgY29udHJvbCA9IGRlc2NFeHBhbmRGbGFnID8gY3RybF9leHBhbmRlZAotCQkJCQkJOiBjdHJsX3B1cnBvc2U7Ci0JCQkJaWYgKCFjb250cm9sLmdldE1vZGlmaWVkKCkpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlTdHJpbmcgb2xkQ29udGVudCA9ICgob3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRpb24pIHRhc2sKLQkJCQkJCS5nZXRQcmVzZW50YXRpb24oKSkuZ2V0UHVycG9zZSgpOwotCQkJCWlmICgoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpKS5tdXN0UmVzdG9yZVZhbHVlKAotCQkJCQkJY29udHJvbCwgb2xkQ29udGVudCkpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlTdHJpbmcgbmV3Q29udGVudCA9IGNvbnRyb2wuZ2V0VGV4dCgpOwotCQkJCWlmICghbmV3Q29udGVudC5lcXVhbHMob2xkQ29udGVudCkpIHsKLQkJCQkJYm9vbGVhbiBzdWNjZXNzID0gZWRpdG9yLmdldEFjdGlvbk1hbmFnZXIoKS5kb0FjdGlvbigKLQkJCQkJCQlJQWN0aW9uTWFuYWdlci5TRVQsCi0JCQkJCQkJY29udGVudEVsZW1lbnQuZ2V0UHJlc2VudGF0aW9uKCksCi0JCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza0Rlc2NyaXB0aW9uX1B1cnBvc2UoKSwKLQkJCQkJCQluZXdDb250ZW50LCAtMSk7Ci0JCQkJCWlmIChzdWNjZXNzICYmIGlzVmVyc2lvblNlY3Rpb25PbigpKSB7Ci0JCQkJCQl1cGRhdGVDaGFuZ2VEYXRlKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JCWN0cmxfYWx0ZXJuYXRpdmVzLnNldE1vZGFsT2JqZWN0KGNvbnRlbnRFbGVtZW50LmdldFByZXNlbnRhdGlvbigpKTsKLQkJY3RybF9hbHRlcm5hdGl2ZXMuc2V0TW9kYWxPYmplY3RGZWF0dXJlKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldFRhc2tEZXNjcmlwdGlvbl9BbHRlcm5hdGl2ZXMoKSk7Ci0JCWN0cmxfYWx0ZXJuYXRpdmVzLmFkZE1vZGlmeUxpc3RlbmVyKGNvbnRlbnRNb2RpZnlMaXN0ZW5lcik7Ci0JCWN0cmxfYWx0ZXJuYXRpdmVzLmFkZExpc3RlbmVyKFNXVC5EZWFjdGl2YXRlLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJSU1ldGhvZFJpY2hUZXh0IGNvbnRyb2wgPSBkZXNjRXhwYW5kRmxhZyA/IGN0cmxfZXhwYW5kZWQKLQkJCQkJCTogY3RybF9hbHRlcm5hdGl2ZXM7Ci0JCQkJaWYgKCFjb250cm9sLmdldE1vZGlmaWVkKCkpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlTdHJpbmcgb2xkQ29udGVudCA9ICgob3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRpb24pIHRhc2sKLQkJCQkJCS5nZXRQcmVzZW50YXRpb24oKSkuZ2V0QWx0ZXJuYXRpdmVzKCk7Ci0JCQkJaWYgKCgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpLm11c3RSZXN0b3JlVmFsdWUoCi0JCQkJCQljb250cm9sLCBvbGRDb250ZW50KSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCVN0cmluZyBuZXdDb250ZW50ID0gY29udHJvbC5nZXRUZXh0KCk7Ci0JCQkJaWYgKCFuZXdDb250ZW50LmVxdWFscyhvbGRDb250ZW50KSkgewotCQkJCQlib29sZWFuIHN1Y2Nlc3MgPSBlZGl0b3IuZ2V0QWN0aW9uTWFuYWdlcigpLmRvQWN0aW9uKAotCQkJCQkJCUlBY3Rpb25NYW5hZ2VyLlNFVCwKLQkJCQkJCQljb250ZW50RWxlbWVudC5nZXRQcmVzZW50YXRpb24oKSwKLQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJLmdldFRhc2tEZXNjcmlwdGlvbl9BbHRlcm5hdGl2ZXMoKSwKLQkJCQkJCQluZXdDb250ZW50LCAtMSk7Ci0JCQkJCWlmIChzdWNjZXNzICYmIGlzVmVyc2lvblNlY3Rpb25PbigpKSB7Ci0JCQkJCQl1cGRhdGVDaGFuZ2VEYXRlKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI3JlZnJlc2goYm9vbGVhbikKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoKGJvb2xlYW4gZWRpdGFibGUpIHsKLQkJc3VwZXIucmVmcmVzaChlZGl0YWJsZSk7Ci0JCWN0cmxfYWx0ZXJuYXRpdmVzLnNldEVkaXRhYmxlKGVkaXRhYmxlKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRDb250ZW50RWxlbWVudCgpCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBnZXRDb250ZW50RWxlbWVudCgpIHsKLQkJcmV0dXJuIHRhc2s7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjZ2V0VGFiU3RyaW5nKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFRhYlN0cmluZygpIHsKLQkJcmV0dXJuIEZpbHRlckNvbnN0YW50cy5UQVNLUzsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRGaWx0ZXIoKQotCSAqLwotCXByb3RlY3RlZCBJRmlsdGVyIGdldEZpbHRlcigpIHsKLQkJZmlsdGVyID0gbmV3IENvbnRlbnRGaWx0ZXIoKSB7Ci0JCQlwcm90ZWN0ZWQgYm9vbGVhbiBjaGlsZEFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCQkJcmV0dXJuIChvYmogaW5zdGFuY2VvZiBUYXNrKTsKLQkJCX0KLQkJfTsKLQotCQkvLyBTZXQgYWRkaXRpb25hbCBmaWx0ZXIgZm9yIHZhcmlhYmlsaXR5IGJhc2UgZWxlbWVudCBjaGVja2luZy4KLQkJKChDb250ZW50RmlsdGVyKSBmaWx0ZXIpCi0JCQkJLnNldEFkZGl0aW9uYWxGaWx0ZXJzKG5ldyBJRmlsdGVyW10geyBuZXcgVmFyaWFiaWxpdHlCYXNlRWxlbWVudEZpbHRlcigKLQkJCQkJCXRhc2spIH0pOwotCQlyZXR1cm4gZmlsdGVyOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNsb2FkU2VjdGlvbkRlc2NyaXB0aW9uKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBsb2FkU2VjdGlvbkRlc2NyaXB0aW9uKCkgewotCQl0aGlzLmdlbmVyYWxTZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy50YXNrX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjOwotCQl0aGlzLmRldGFpbFNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLnRhc2tfZGV0YWlsU2VjdGlvbl9kZXNjOwotCQl0aGlzLnZhcmlhYmlsaXR5U2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMudGFza192YXJpYWJpbGl0eVNlY3Rpb25fZGVzYzsKLQkJdGhpcy52ZXJzaW9uU2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMudGFza192ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYzsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvVGFza0d1aWRhbmNlUGFnZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9UYXNrR3VpZGFuY2VQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiODQ1NGEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9UYXNrR3VpZGFuY2VQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3JtczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZpbHRlcnMuR3VpZGFuY2VGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS51dGlsLlVJSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JQWN0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLkZpbHRlckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNoZWNrbGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbmNlcHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5FeGFtcGxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3VpZGFuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HdWlkZWxpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5QcmFjdGljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJldXNhYmxlQXNzZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5TdXBwb3J0aW5nTWF0ZXJpYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVG9vbE1lbnRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLmVkaXRvci5Gb3JtRWRpdG9yOwotCi0KLS8qKgotICogVGhlIEd1aWRhbmNlIHBhZ2UgaW4gdGhlIFRhc2sgZWRpdG9yLgotICogCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBUYXNrR3VpZGFuY2VQYWdlIGV4dGVuZHMgQXNzb2NpYXRpb25Gb3JtUGFnZSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9STV9QQUdFX0lEID0gInRhc2tHdWlkYW5jZVBhZ2UiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIFRhc2sgdGFzazsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFRhc2tHdWlkYW5jZVBhZ2UoRm9ybUVkaXRvciBlZGl0b3IpIHsKLQkJc3VwZXIoZWRpdG9yLCBGT1JNX1BBR0VfSUQsIEF1dGhvcmluZ1VJVGV4dC5HVUlEQU5DRV9QQUdFX1RJVExFKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNpbml0KG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlLCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJRWRpdG9yU2l0ZSBzaXRlLCBJRWRpdG9ySW5wdXQgaW5wdXQpIHsKLQkJc3VwZXIuaW5pdChzaXRlLCBpbnB1dCk7Ci0JCXRhc2sgPSAoVGFzaykgY29udGVudEVsZW1lbnQ7Ci0JCXNldFVzZUNhdGVnb3J5MihmYWxzZSk7Ci0JCXNldFVzZUNhdGVnb3J5MyhmYWxzZSk7Ci0JCXNldEFsbG93Q2hhbmdlMSh0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNpbml0Q29udGVudFByb3ZpZGVyU2VsZWN0ZWQoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRDb250ZW50UHJvdmlkZXJTZWxlY3RlZCgpIHsKLQkJY29udGVudFByb3ZpZGVyU2VsZWN0ZWQgPSBuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoCi0JCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJCS5nZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSkgewotCQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gVUlIZWxwZXIuZ2V0U2VsZWN0ZWRHdWlkYW5jZXModGFzayk7Ci0JCQl9Ci0JCX07Ci0JCXZpZXdlcl9zZWxlY3RlZC5zZXRDb250ZW50UHJvdmlkZXIoY29udGVudFByb3ZpZGVyU2VsZWN0ZWQpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2FkZEl0ZW1zVG9Nb2RlbDEoQXJyYXlMaXN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEl0ZW1zVG9Nb2RlbDEoQXJyYXlMaXN0IGFkZEl0ZW1zKSB7Ci0JCS8vIFVwZGF0ZSB0aGUgbW9kZWwuCi0JCWlmICghYWRkSXRlbXMuaXNFbXB0eSgpKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gYWRkSXRlbXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCUd1aWRhbmNlIGl0ZW0gPSAoR3VpZGFuY2UpIGl0Lm5leHQoKTsKLQotCQkJCS8vIEd1aWRhbmNlcyBmb3IgY29udGVudCBlbGVtZW50LgotCQkJCWlmIChpdGVtIGluc3RhbmNlb2YgQ2hlY2tsaXN0KSB7Ci0JCQkJCWVkaXRvci5nZXRBY3Rpb25NYW5hZ2VyKCkKLQkJCQkJCQkuZG9BY3Rpb24oCi0JCQkJCQkJCQlJQWN0aW9uTWFuYWdlci5BREQsCi0JCQkJCQkJCQl0YXNrLAotCQkJCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCQkJLmdldENvbnRlbnRFbGVtZW50X0NoZWNrbGlzdHMoKSwKLQkJCQkJCQkJCShDaGVja2xpc3QpIGl0ZW0sIC0xKTsKLQkJCQl9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBDb25jZXB0KSB7Ci0JCQkJCWVkaXRvci5nZXRBY3Rpb25NYW5hZ2VyKCkuZG9BY3Rpb24oCi0JCQkJCQkJSUFjdGlvbk1hbmFnZXIuQURELAotCQkJCQkJCXRhc2ssCi0JCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCS5nZXRDb250ZW50RWxlbWVudF9Db25jZXB0c0FuZFBhcGVycygpLAotCQkJCQkJCShDb25jZXB0KSBpdGVtLCAtMSk7Ci0JCQkJfSAKLQkJCQllbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgRXhhbXBsZSkgewotCQkJCQllZGl0b3IuZ2V0QWN0aW9uTWFuYWdlcigpLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLkFERCwKLQkJCQkJCQl0YXNrLAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbnRlbnRFbGVtZW50X0V4YW1wbGVzKCksCi0JCQkJCQkJKEV4YW1wbGUpIGl0ZW0sIC0xKTsKLQkJCQl9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBQcmFjdGljZSkgewotCQkJCQllZGl0b3IuZ2V0QWN0aW9uTWFuYWdlcigpLmRvQWN0aW9uKAotCQkJCQkJCUlBY3Rpb25NYW5hZ2VyLkFERCwKLQkJCQkJCQkoUHJhY3RpY2UpIGl0ZW0sCi0JCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCS5nZXRQcmFjdGljZV9Db250ZW50UmVmZXJlbmNlcygpLCB0YXNrLCAtMSk7Ci0JCQkJfSBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgU3VwcG9ydGluZ01hdGVyaWFsKSB7Ci0JCQkJCWVkaXRvci5nZXRBY3Rpb25NYW5hZ2VyKCkuZG9BY3Rpb24oCi0JCQkJCQkJSUFjdGlvbk1hbmFnZXIuQURELAotCQkJCQkJCXRhc2ssCi0JCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCS5nZXRDb250ZW50RWxlbWVudF9TdXBwb3J0aW5nTWF0ZXJpYWxzKCksCi0JCQkJCQkJKFN1cHBvcnRpbmdNYXRlcmlhbCkgaXRlbSwgLTEpOwotCQkJCX0gZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIEd1aWRlbGluZSkgewotCQkJCQllZGl0b3IuZ2V0QWN0aW9uTWFuYWdlcigpCi0JCQkJCQkJLmRvQWN0aW9uKAotCQkJCQkJCQkJSUFjdGlvbk1hbmFnZXIuQURELAotCQkJCQkJCQkJdGFzaywKLQkJCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJCS5nZXRDb250ZW50RWxlbWVudF9HdWlkZWxpbmVzKCksCi0JCQkJCQkJCQkoR3VpZGVsaW5lKSBpdGVtLCAtMSk7Ci0JCQkJfSBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgVG9vbE1lbnRvcikgewotCQkJCQllZGl0b3IuZ2V0QWN0aW9uTWFuYWdlcigpLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLkFERCwKLQkJCQkJCQl0YXNrLCBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrX1Rvb2xNZW50b3JzKCksCi0JCQkJCQkJKFRvb2xNZW50b3IpIGl0ZW0sIC0xKTsKLQkJCQl9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBSZXVzYWJsZUFzc2V0KSB7Ci0JCQkJCWVkaXRvci5nZXRBY3Rpb25NYW5hZ2VyKCkuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuQURELAotCQkJCQkJCXRhc2ssCi0JCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29udGVudEVsZW1lbnRfQXNzZXRzKCksCi0JCQkJCQkJKFJldXNhYmxlQXNzZXQpIGl0ZW0sIC0xKTsKLQkJCQl9IAotCQkJCWVsc2UgewotCQkJCQlBdXRob3JpbmdVSVBsdWdpbgotCQkJCQkJCS5nZXREZWZhdWx0KCkKLQkJCQkJCQkuZ2V0TG9nZ2VyKCkKLQkJCQkJCQkubG9nRXJyb3IoCi0JCQkJCQkJCQkiVW5hYmxlIHRvIGFkZCBndWlkYW5jZSAiICsgaXRlbS5nZXRUeXBlKCkuZ2V0TmFtZSgpICsgIjoiICsgaXRlbS5nZXROYW1lKCkgKyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCQkJCQkJInRvICIgKyB0YXNrLmdldFR5cGUoKS5nZXROYW1lKCkgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJCQkrICI6IiArIHRhc2suZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJCAKLQkJCQl9Ci0JCQl9Ci0JCQlzZXREaXJ0eSh0cnVlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI3JlbW92ZUl0ZW1zRnJvbU1vZGVsMShBcnJheUxpc3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlSXRlbXNGcm9tTW9kZWwxKEFycmF5TGlzdCBybUl0ZW1zKSB7Ci0JCS8vIFVwZGF0ZSB0aGUgbW9kZWwuCi0JCWlmICghcm1JdGVtcy5pc0VtcHR5KCkpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBybUl0ZW1zLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlHdWlkYW5jZSBpdGVtID0gKEd1aWRhbmNlKSBpdC5uZXh0KCk7Ci0KLQkJCQkvLyBHdWlkYW5jZSBmb3IgdGhlIG1ldGhvZCBlbGVtZW50LgotCQkJCWlmIChpdGVtIGluc3RhbmNlb2YgQ2hlY2tsaXN0KSB7Ci0JCQkJCWVkaXRvci5nZXRBY3Rpb25NYW5hZ2VyKCkKLQkJCQkJCQkuZG9BY3Rpb24oCi0JCQkJCQkJCQlJQWN0aW9uTWFuYWdlci5SRU1PVkUsCi0JCQkJCQkJCQl0YXNrLAotCQkJCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCQkJLmdldENvbnRlbnRFbGVtZW50X0NoZWNrbGlzdHMoKSwKLQkJCQkJCQkJCShDaGVja2xpc3QpIGl0ZW0sIC0xKTsKLQkJCQl9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBDb25jZXB0KSB7Ci0JCQkJCWVkaXRvci5nZXRBY3Rpb25NYW5hZ2VyKCkuZG9BY3Rpb24oCi0JCQkJCQkJSUFjdGlvbk1hbmFnZXIuUkVNT1ZFLAotCQkJCQkJCXRhc2ssCi0JCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCS5nZXRDb250ZW50RWxlbWVudF9Db25jZXB0c0FuZFBhcGVycygpLAotCQkJCQkJCShDb25jZXB0KSBpdGVtLCAtMSk7Ci0JCQkJfSBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgRXhhbXBsZSkgewotCQkJCQllZGl0b3IuZ2V0QWN0aW9uTWFuYWdlcigpLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlJFTU9WRSwKLQkJCQkJCQl0YXNrLAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbnRlbnRFbGVtZW50X0V4YW1wbGVzKCksCi0JCQkJCQkJKEV4YW1wbGUpIGl0ZW0sIC0xKTsKLQkJCQl9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBQcmFjdGljZSkgewotCQkJCQllZGl0b3IuZ2V0QWN0aW9uTWFuYWdlcigpLmRvQWN0aW9uKAotCQkJCQkJCUlBY3Rpb25NYW5hZ2VyLlJFTU9WRSwKLQkJCQkJCQkoUHJhY3RpY2UpIGl0ZW0sCi0JCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCS5nZXRQcmFjdGljZV9Db250ZW50UmVmZXJlbmNlcygpLCB0YXNrLCAtMSk7Ci0JCQkJfSBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgU3VwcG9ydGluZ01hdGVyaWFsKSB7Ci0JCQkJCWVkaXRvci5nZXRBY3Rpb25NYW5hZ2VyKCkuZG9BY3Rpb24oCi0JCQkJCQkJSUFjdGlvbk1hbmFnZXIuUkVNT1ZFLAotCQkJCQkJCXRhc2ssCi0JCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCS5nZXRDb250ZW50RWxlbWVudF9TdXBwb3J0aW5nTWF0ZXJpYWxzKCksCi0JCQkJCQkJKFN1cHBvcnRpbmdNYXRlcmlhbCkgaXRlbSwgLTEpOwotCQkJCX0gZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIEd1aWRlbGluZSkgewotCQkJCQllZGl0b3IuZ2V0QWN0aW9uTWFuYWdlcigpCi0JCQkJCQkJLmRvQWN0aW9uKAotCQkJCQkJCQkJSUFjdGlvbk1hbmFnZXIuUkVNT1ZFLAotCQkJCQkJCQkJdGFzaywKLQkJCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJCS5nZXRDb250ZW50RWxlbWVudF9HdWlkZWxpbmVzKCksCi0JCQkJCQkJCQkoR3VpZGVsaW5lKSBpdGVtLCAtMSk7Ci0JCQkJfSBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgVG9vbE1lbnRvcikgewotCQkJCQllZGl0b3IuZ2V0QWN0aW9uTWFuYWdlcigpLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlJFTU9WRSwKLQkJCQkJCQl0YXNrLCBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrX1Rvb2xNZW50b3JzKCksCi0JCQkJCQkJaXRlbSwgLTEpOwotCQkJCX0gZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIFJldXNhYmxlQXNzZXQpIHsKLQkJCQkJZWRpdG9yLmdldEFjdGlvbk1hbmFnZXIoKS5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5SRU1PVkUsCi0JCQkJCQkJdGFzaywKLQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb250ZW50RWxlbWVudF9Bc3NldHMoKSwKLQkJCQkJCQkoUmV1c2FibGVBc3NldCkgaXRlbSwgLTEpOwotCQkJCX0gCi0vLwkJCQllbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgRXN0aW1hdGUpIHsKLS8vCQkJCQllZGl0b3IuZ2V0QWN0aW9uTWFuYWdlcigpLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlNFVCwKLS8vCQkJCQkJCXRhc2ssIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tfRXN0aW1hdGUoKSwKLS8vCQkJCQkJCW51bGwsIC0xKTsKLS8vCQkJCX0gCi0JCQkJZWxzZSB7Ci0JCQkJCUF1dGhvcmluZ1VJUGx1Z2luCi0JCQkJCQkJLmdldERlZmF1bHQoKQotCQkJCQkJCS5nZXRMb2dnZXIoKQotCQkJCQkJCS5sb2dFcnJvcigKLQkJCQkJCQkJCSJVbmFibGUgdG8gcmVtb3ZlIGd1aWRhbmNlICIgKyBpdGVtLmdldFR5cGUoKS5nZXROYW1lKCkgKyAiOiIgKyBpdGVtLmdldE5hbWUoKSArIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJCQkJCQkiZnJvbSAiICsgdGFzay5nZXRUeXBlKCkuZ2V0TmFtZSgpIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCQkJKyAiOiIgKyB0YXNrLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQgCi0JCQkJfQotCQkJfQotCQkJc2V0RGlydHkodHJ1ZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRDb250ZW50RWxlbWVudCgpCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBnZXRDb250ZW50RWxlbWVudCgpIHsKLQkJcmV0dXJuIHRhc2s7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjZ2V0VGFiU3RyaW5nKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFRhYlN0cmluZygpIHsKLQkJcmV0dXJuIEZpbHRlckNvbnN0YW50cy5HVUlEQU5DRTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRGaWx0ZXIoKQotCSAqLwotCXByb3RlY3RlZCBJRmlsdGVyIGdldEZpbHRlcigpIHsKLQkJcmV0dXJuIGZpbHRlciA9IG5ldyBHdWlkYW5jZUZpbHRlcigpIHsKLQkJCXByb3RlY3RlZCBib29sZWFuIGNoaWxkQWNjZXB0KE9iamVjdCBvYmopIHsKLQkJCQlpZiAoc3VwZXIuY2hpbGRBY2NlcHQob2JqKSkKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJcmV0dXJuIChvYmogaW5zdGFuY2VvZiBUb29sTWVudG9yKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL1Rhc2tSb2xlc1BhZ2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvVGFza1JvbGVzUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNDk4MDRmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvVGFza1JvbGVzUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjk3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLk1ldGhvZEVsZW1lbnRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5maWx0ZXJzLkNvbnRlbnRGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklBY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuRmlsdGVyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuRm9ybUVkaXRvcjsKLQotCi0vKioKLSAqIFRoZSBSb2xlcyBwYWdlIGluIHRoZSBUYXNrIGVkaXRvci4KLSAqIAotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgVGFza1JvbGVzUGFnZSBleHRlbmRzIEFzc29jaWF0aW9uRm9ybVBhZ2UgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZPUk1fUEFHRV9JRCA9ICJ0YXNrUm9sZXNQYWdlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBUYXNrIHRhc2s7Ci0KLQlwcml2YXRlIElBY3Rpb25NYW5hZ2VyIGFjdGlvbk1ncjsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFRhc2tSb2xlc1BhZ2UoRm9ybUVkaXRvciBlZGl0b3IpIHsKLQkJc3VwZXIoZWRpdG9yLCBGT1JNX1BBR0VfSUQsIEF1dGhvcmluZ1VJVGV4dC5ST0xFU19QQUdFX1RJVExFKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNpbml0KG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlLCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJRWRpdG9yU2l0ZSBzaXRlLCBJRWRpdG9ySW5wdXQgaW5wdXQpIHsKLQkJc3VwZXIuaW5pdChzaXRlLCBpbnB1dCk7Ci0JCXRhc2sgPSAoVGFzaykgY29udGVudEVsZW1lbnQ7Ci0JCWFjdGlvbk1nciA9ICgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpLmdldEFjdGlvbk1hbmFnZXIoKTsKLQkJc2V0VXNlQ2F0ZWdvcnkzKGZhbHNlKTsKLQkJc2V0QWxsb3dDaGFuZ2UxKHRydWUpOwotCQlzZXRBbGxvd0NoYW5nZTIodHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjaW5pdENvbnRlbnRQcm92aWRlclNlbGVjdGVkKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0Q29udGVudFByb3ZpZGVyU2VsZWN0ZWQoKSB7Ci0JCWNvbnRlbnRQcm92aWRlclNlbGVjdGVkID0gbmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKAotCQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpIHsKLQkJCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuICgoVGFzaykgb2JqZWN0KS5nZXRQZXJmb3JtZWRCeSgpLnRvQXJyYXkoKTsKLQkJCX0KLQkJfTsKLQkJdmlld2VyX3NlbGVjdGVkLnNldENvbnRlbnRQcm92aWRlcihjb250ZW50UHJvdmlkZXJTZWxlY3RlZCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjYWRkSXRlbXNUb01vZGVsMShBcnJheUxpc3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkSXRlbXNUb01vZGVsMShBcnJheUxpc3QgYWRkSXRlbXMpIHsKLQkJLy8gVXBkYXRlIHRoZSBtb2RlbC4KLQkJaWYgKCFhZGRJdGVtcy5pc0VtcHR5KCkpIHsJCQotCQkJTGlzdCBlbGVtZW50TGlzdCA9IHJldHJpZXZlVGFibGVWaWV3ZXJDb250ZW50cyh2aWV3ZXJfc2VsZWN0ZWQpOwotCQkJTGlzdCBhZGRJdGVtc0ZpbHRlcmVkID0gbmV3IEFycmF5TGlzdCgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhZGRJdGVtcy5zaXplKCk7IGkrKykgewotCQkJCWlmICghZWxlbWVudExpc3QuY29udGFpbnMoKChSb2xlKSBhZGRJdGVtcy5nZXQoaSkpKSkgewotCQkJCQlhZGRJdGVtc0ZpbHRlcmVkLmFkZChhZGRJdGVtcy5nZXQoaSkpOwotCQkJCX0KLQkJCX0KLQkJCWlmIChhZGRJdGVtcy5zaXplKCkgPiAwKSB7Ci0JCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLkFERF9NQU5ZLCB0YXNrLAotCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza19QZXJmb3JtZWRCeSgpLAotCQkJCQkJYWRkSXRlbXNGaWx0ZXJlZCwgLTEpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjcmVtb3ZlSXRlbXNGcm9tTW9kZWwxKEFycmF5TGlzdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVJdGVtc0Zyb21Nb2RlbDEoQXJyYXlMaXN0IHJtSXRlbXMpIHsKLQkJLy8gVXBkYXRlIHRoZSBtb2RlbC4KLQkJaWYgKCFybUl0ZW1zLmlzRW1wdHkoKSkgewotCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlJFTU9WRV9NQU5ZLCB0YXNrLAotCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrX1BlcmZvcm1lZEJ5KCksCi0JCQkJCXJtSXRlbXMsIC0xKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2luaXRDb250ZW50UHJvdmlkZXJTZWxlY3RlZDIoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRDb250ZW50UHJvdmlkZXJTZWxlY3RlZDIoKSB7Ci0JCWNvbnRlbnRQcm92aWRlclNlbGVjdGVkMiA9IG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcigKLQkJCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkJLmdldE5hdmlnYXRvclZpZXdfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKSB7Ci0JCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IG9iamVjdCkgewotCQkJCXJldHVybiAoKFRhc2spIG9iamVjdCkuZ2V0QWRkaXRpb25hbGx5UGVyZm9ybWVkQnkoKS50b0FycmF5KCk7Ci0JCQl9Ci0JCX07Ci0JCXZpZXdlcl9zZWxlY3RlZDIuc2V0Q29udGVudFByb3ZpZGVyKGNvbnRlbnRQcm92aWRlclNlbGVjdGVkMik7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjYWRkSXRlbXNUb01vZGVsMihBcnJheUxpc3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkSXRlbXNUb01vZGVsMihBcnJheUxpc3QgYWRkSXRlbXMpIHsKLQkJLy8gVXBkYXRlIHRoZSBtb2RlbC4KLQkJaWYgKCFhZGRJdGVtcy5pc0VtcHR5KCkpIHsKLQkJCUxpc3QgZWxlbWVudExpc3QgPSByZXRyaWV2ZVRhYmxlVmlld2VyQ29udGVudHModmlld2VyX3NlbGVjdGVkKTsKLQkJCUxpc3QgYWRkSXRlbXNGaWx0ZXJlZCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYWRkSXRlbXMuc2l6ZSgpOyBpKyspIHsKLQkJCQlpZiAoIWVsZW1lbnRMaXN0LmNvbnRhaW5zKCgoUm9sZSkgYWRkSXRlbXMuZ2V0KGkpKSkpIHsKLQkJCQkJYWRkSXRlbXNGaWx0ZXJlZC5hZGQoYWRkSXRlbXMuZ2V0KGkpKTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoYWRkSXRlbXMuc2l6ZSgpID4gMCkgewotCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5BRERfTUFOWSwgdGFzaywKLQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tfQWRkaXRpb25hbGx5UGVyZm9ybWVkQnkoKSwKLQkJCQkJCWFkZEl0ZW1zRmlsdGVyZWQsIC0xKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI3JlbW92ZUl0ZW1zRnJvbU1vZGVsMihBcnJheUxpc3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlSXRlbXNGcm9tTW9kZWwyKEFycmF5TGlzdCBybUl0ZW1zKSB7Ci0JCS8vIFVwZGF0ZSB0aGUgbW9kZWwuCi0JCWlmICghcm1JdGVtcy5pc0VtcHR5KCkpIHsKLQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5SRU1PVkVfTUFOWSwgdGFzaywKLQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza19BZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSgpLAotCQkJCQlybUl0ZW1zLCAtMSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRDb250ZW50RWxlbWVudCgpCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBnZXRDb250ZW50RWxlbWVudCgpIHsKLQkJcmV0dXJuIHRhc2s7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjZ2V0VGFiU3RyaW5nKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFRhYlN0cmluZygpIHsKLQkJcmV0dXJuIEZpbHRlckNvbnN0YW50cy5ST0xFUzsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRGaWx0ZXIoKQotCSAqLwotCXByb3RlY3RlZCBJRmlsdGVyIGdldEZpbHRlcigpIHsKLQkJcmV0dXJuIGZpbHRlciA9CW5ldyBDb250ZW50RmlsdGVyICgpewotCQkJcHJvdGVjdGVkIGJvb2xlYW4gY2hpbGRBY2NlcHQoT2JqZWN0IG9iaikgewotCQkJCWlmKHRhc2suZ2V0QWRkaXRpb25hbGx5UGVyZm9ybWVkQnkoKSAhPSBudWxsKXsKLQkJCQkJTGlzdCBsaXN0ID0gdGFzay5nZXRBZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSgpOwotCQkJCQlmb3IoSXRlcmF0b3IgaXQgPSBsaXN0Lml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspewotCQkJCQkJT2JqZWN0IG5leHQgPSBpdC5uZXh0KCk7Ci0JCQkJCQlpZihuZXh0IGluc3RhbmNlb2YgUm9sZSl7Ci0JCQkJCQkJaWYob2JqID09IG5leHQpIHJldHVybiBmYWxzZTsKLQkJCQkJCQlpZighY2hlY2tDb250cmlidXRpb24oKFZhcmlhYmlsaXR5RWxlbWVudCluZXh0LCBvYmopKQotCQkJCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJcmV0dXJuIChvYmogaW5zdGFuY2VvZiBSb2xlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRGaWx0ZXIyKCkKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpbHRlciBnZXRGaWx0ZXIyKCkgewotCQlyZXR1cm4gZmlsdGVyID0gbmV3IENvbnRlbnRGaWx0ZXIgKCl7Ci0JCQlwcm90ZWN0ZWQgYm9vbGVhbiBjaGlsZEFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCQkJaWYodGFzay5nZXRQZXJmb3JtZWRCeSgpICE9IG51bGwpewotCQkJCQkKLQkJCQkJTGlzdCBsaXN0ID0gdGFzay5nZXRQZXJmb3JtZWRCeSgpOwotCQkJCQlmb3IoSXRlcmF0b3IgaXQgPSBsaXN0Lml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspewotCQkJCQkJT2JqZWN0IG5leHQgPSBpdC5uZXh0KCk7Ci0JCQkJCQlpZihuZXh0IGluc3RhbmNlb2YgUm9sZSl7Ci0JCQkJCQkJaWYob2JqID09IG5leHQpIHJldHVybiBmYWxzZTsKLQkJCQkJCQlpZighY2hlY2tDb250cmlidXRpb24oKFJvbGUpbmV4dCwgb2JqKSkKLQkJCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCXJldHVybiAob2JqIGluc3RhbmNlb2YgUm9sZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogUm9sZSBmaWx0ZXIKLQkgKgotCSAqLwotCXB1YmxpYyBjbGFzcyBSb2xlRmlsdGVyIGV4dGVuZHMgQ29udGVudEZpbHRlciB7Ci0JCXByb3RlY3RlZCBib29sZWFuIGNoaWxkQWNjZXB0KE9iamVjdCBvYmopIHsKLQkJCWlmKHRhc2suZ2V0UGVyZm9ybWVkQnkoKSAhPSBudWxsKXsKLQkJCQlMaXN0IGxpc3QgPSB0YXNrLmdldFBlcmZvcm1lZEJ5KCk7Ci0JCQkJZm9yKEl0ZXJhdG9yIGl0ID0gbGlzdC5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KXsKLQkJCQkJT2JqZWN0IG5leHQgPSBpdC5uZXh0KCk7Ci0JCQkJCWlmKG5leHQgaW5zdGFuY2VvZiBSb2xlKXsKLQkJCQkJCWlmKG9iaiA9PSBuZXh0KSByZXR1cm4gZmFsc2U7Ci0JCQkJCQlpZighY2hlY2tDb250cmlidXRpb24oKFJvbGUpbmV4dCwgb2JqKSkKLQkJCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gKG9iaiBpbnN0YW5jZW9mIFJvbGUpOwotCQl9Ci0JfTsKLQotCS8qKgotCSAqIENoZWNrIGNvbnRyaWJ1dGlvbgotCSAqIEBwYXJhbSBjb250cmlidXRvcgotCSAqIEBwYXJhbSBvYmoKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjaGVja0NvbnRyaWJ1dGlvbihWYXJpYWJpbGl0eUVsZW1lbnQgY29udHJpYnV0b3IsIE9iamVjdCBvYmopewotCQlpZihUbmdVdGlsLmlzQ29udHJpYnV0b3IoY29udHJpYnV0b3IpICYmIG9iaiBpbnN0YW5jZW9mIFJvbGUpewotCQkJVmFyaWFiaWxpdHlFbGVtZW50IGUgPSBjb250cmlidXRvci5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCk7Ci0JCQlpZihlICE9IG51bGwpewotCQkJCWlmKGUuZXF1YWxzKG9iaikpIHJldHVybiBmYWxzZTsKLQkJCQlpZihUbmdVdGlsLmlzQ29udHJpYnV0b3IoZSkpCi0JCQkJCXJldHVybiBjaGVja0NvbnRyaWJ1dGlvbihlLCBvYmopOwotCQkJfQotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNnZXRNdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uKGludCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldE11bHRpcGxlU2VsZWN0RGVzY3JpcHRpb24oaW50IGNvdW50KSB7Ci0JCXJldHVybiBzdXBlci5nZXRNdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uKGNvdW50LCBBdXRob3JpbmdVSVJlc291cmNlcy50YXNrUm9sZXNQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb24pOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNnZXRTZWN0aW9uRGVzY3JpcHRpb24oKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VjdGlvbkRlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMudGFza1JvbGVzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb247Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0U2VjdGlvbk5hbWUoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VjdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy50YXNrUm9sZXNQYWdlX3NlY3Rpb25OYW1lOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldFNlbGVjdGVkTGFiZWwoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VsZWN0ZWRMYWJlbCgpIHsKLQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLnRhc2tSb2xlc1BhZ2Vfc2VsZWN0ZWRMYWJlbDsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0U2VsZWN0ZWRMYWJlbDIoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VsZWN0ZWRMYWJlbDIoKSB7Ci0JCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy50YXNrUm9sZXNQYWdlX3NlbGVjdGVkTGFiZWwyOwotCX0KLQkKLQkKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvVGFza1N0ZXBzUGFnZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9UYXNrU3RlcHNQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjOGU0YzQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9UYXNrU3RlcHNQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MjAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3JtczsKLQotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSUltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5kaWFsb2dzLlNlY3Rpb25zT3JkZXJEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLk1ldGhvZEVsZW1lbnRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLk1ldGhvZEVsZW1lbnRFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuTWV0aG9kRWxlbWVudEVkaXRvci5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3ZpZGVycy5WYXJpYWJpbGl0eUVsZW1lbnRMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucmljaHRleHQuSU1ldGhvZFJpY2hUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucmljaHRleHQuSU1ldGhvZFJpY2hUZXh0RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudXRpbC5FZGl0b3JzQ29udGV4dEhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnV0aWwuVUlIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5TdHJVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLkFkZFRvU2VjdGlvbkxpc3RDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JQWN0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuTW92ZUluU2VjdGlvbkxpc3RDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5SZW1vdmVGcm9tU2VjdGlvbkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlNlY3Rpb25MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLkxpYnJhcnlVSVRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Db250cm9sRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Db250cm9sTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Gb2N1c0FkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Gb2N1c0V2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5JTWFuYWdlZEZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuZWRpdG9yLkZvcm1FZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuZXZlbnRzLkh5cGVybGlua0FkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuZXZlbnRzLkh5cGVybGlua0V2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuSW1hZ2VIeXBlcmxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5TZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuVGFibGVXcmFwRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLlRhYmxlV3JhcExheW91dDsKLQotCi0vKioKLSAqIFRoZSBTdGVwcyBwYWdlIGluIHRoZSBUYXNrIGVkaXRvci4KLSAqIAotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgVGFza1N0ZXBzUGFnZSBleHRlbmRzIEJhc2VGb3JtUGFnZSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9STV9QQUdFX0lEID0gInRhc2tTdGVwc1BhZ2UiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIFRleHQgY3RybF9uYW1lOwotCi0JcHJpdmF0ZSBCdXR0b24gY3RybF9hZGQsIGN0cmxfZGVsZXRlLCBjdHJsX3VwLCBjdHJsX2Rvd24sIGN0cmxfb3JkZXJpbmc7Ci0KLQlwcml2YXRlIFRhYmxlIGN0cmxfc3RlcHM7Ci0KLQlwcml2YXRlIFRhYmxlVmlld2VyIHN0ZXBzVGFibGVWaWV3ZXI7Ci0KLQlwcml2YXRlIFNlY3Rpb25MaXN0IGFsbFN0ZXBzOwotCi0JcHJvdGVjdGVkIElNZXRob2RSaWNoVGV4dCBhY3RpdmVDb250cm9sOwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gZGVzY0V4cGFuZEZsYWcgPSBmYWxzZTsKLQotCXByb3RlY3RlZCBJTWV0aG9kUmljaFRleHRFZGl0b3IgY3RybF9leHBhbmRlZDsKLQotCXByb3RlY3RlZCBJbWFnZUh5cGVybGluayBleHBhbmRMaW5rOwotCi0JcHJvdGVjdGVkIExhYmVsIGV4cGFuZExhYmVsOwotCi0JcHJvdGVjdGVkIFNlY3Rpb24gZm9ybVNlY3Rpb247Ci0KLQlwcm90ZWN0ZWQgU2VjdGlvbiBnZW5lcmFsU2VjdGlvbjsKLQotCXByb3RlY3RlZCBDb21wb3NpdGUgc2VjdGlvbkNvbXBvc2l0ZTsKLQkKLQlwcm90ZWN0ZWQgQ29tcG9zaXRlIGdlbmVyYWxDb21wb3NpdGU7Ci0KLQlwcm90ZWN0ZWQgQ29tcG9zaXRlIGV4cGFuZGVkQ29tcG9zaXRlOwotCi0JcHJvdGVjdGVkIElNZXRob2RSaWNoVGV4dCBjdHJsX21haW5kZXNjOwotCi0JcHJpdmF0ZSBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciBzdGVwc1ZpZXdlckNvbnRlbnRQcm92aWRlcjsKLQotCXByaXZhdGUgSUxhYmVsUHJvdmlkZXIgc3RlcHNWaWV3ZXJMYWJlbFByb3ZpZGVyOwotCi0JcHJpdmF0ZSBUYXNrIHRhc2s7Ci0KLQlwcml2YXRlIG9yZy5lY2xpcHNlLmVwZi51bWEuU2VjdGlvbiBjdXJyZW50U3RlcDsKLQotCXByaXZhdGUgTW9kaWZ5TGlzdGVuZXIgY29udGVudE1vZGlmeUxpc3RlbmVyOwotCi0JcHJpdmF0ZSBJQWN0aW9uTWFuYWdlciBhY3Rpb25NZ3I7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBUYXNrU3RlcHNQYWdlKEZvcm1FZGl0b3IgZWRpdG9yKSB7Ci0JCXN1cGVyKGVkaXRvciwgRk9STV9QQUdFX0lELCBBdXRob3JpbmdVSVRleHQuU1RFUFNfUEFHRV9USVRMRSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkJhc2VGb3JtUGFnZSNpbml0KG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlLCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJRWRpdG9yU2l0ZSBzaXRlLCBJRWRpdG9ySW5wdXQgaW5wdXQpIHsKLQkJc3VwZXIuaW5pdChzaXRlLCBpbnB1dCk7Ci0JCU1ldGhvZEVsZW1lbnRFZGl0b3JJbnB1dCBtZXRob2RFbGVtZW50SW5wdXQgPSAoTWV0aG9kRWxlbWVudEVkaXRvcklucHV0KSBpbnB1dDsKLQkJdGFzayA9IChUYXNrKSBtZXRob2RFbGVtZW50SW5wdXQuZ2V0TWV0aG9kRWxlbWVudCgpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuZm9ybXMuZWRpdG9yLmNyZWF0ZUZvcm1Db250ZW50KElNYW5hZ2VkRm9ybQotCSAqICAgICAgbWFuYWdlZEZvcm0pCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRm9ybUNvbnRlbnQoSU1hbmFnZWRGb3JtIG1hbmFnZWRGb3JtKSB7Ci0JCXN1cGVyLmNyZWF0ZUZvcm1Db250ZW50KG1hbmFnZWRGb3JtKTsKLQotCQlmb3JtLnNldFRleHQoTGlicmFyeVVJVGV4dC5nZXRVSVRleHQodGFzaykgKyAiOiAiICsgdGFzay5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkCi0KLQkJZm9ybVNlY3Rpb24gPSB0b29sa2l0LmNyZWF0ZVNlY3Rpb24oZm9ybS5nZXRCb2R5KCksIFNlY3Rpb24uTk9fVElUTEUpOwotCQl7Ci0JCQlUYWJsZVdyYXBEYXRhIHRkID0gbmV3IFRhYmxlV3JhcERhdGEoVGFibGVXcmFwRGF0YS5GSUxMX0dSQUIpOwotCQkJZm9ybVNlY3Rpb24uc2V0TGF5b3V0RGF0YSh0ZCk7Ci0JCQlmb3JtU2VjdGlvbi5zZXRMYXlvdXQobmV3IFRhYmxlV3JhcExheW91dCgpKTsKLQkJfQotCQkvLyBDcmVhdGUgdGhlIGNvbXBvc2l0ZSBmb3IgdGhlIHNlY3Rpb25zLgotCQlzZWN0aW9uQ29tcG9zaXRlID0gdG9vbGtpdC5jcmVhdGVDb21wb3NpdGUoZm9ybVNlY3Rpb24sIFNXVC5OT05FKTsKLQkJc2VjdGlvbkNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBUYWJsZVdyYXBEYXRhKFRhYmxlV3JhcERhdGEuRklMTF9HUkFCKSk7Ci0JCXNlY3Rpb25Db21wb3NpdGUuc2V0TGF5b3V0KG5ldyBUYWJsZVdyYXBMYXlvdXQoKSk7Ci0JCWZvcm1TZWN0aW9uLnNldENsaWVudChzZWN0aW9uQ29tcG9zaXRlKTsKLQotCQkvLyBDcmVhdGUgdGhlIEdlbmVyYWwgSW5mb3JtYXRpb24gc2VjdGlvbi4KLQkJZ2VuZXJhbFNlY3Rpb24gPSB0b29sa2l0LmNyZWF0ZVNlY3Rpb24oc2VjdGlvbkNvbXBvc2l0ZSwKLQkJCQlTZWN0aW9uLlRJVExFX0JBUiB8IFNlY3Rpb24uREVTQ1JJUFRJT04gfCBTZWN0aW9uLlRXSVNUSUUKLQkJCQkJCXwgU2VjdGlvbi5FWFBBTkRFRCk7Ci0JCWdlbmVyYWxTZWN0aW9uCi0JCQkJLnNldExheW91dERhdGEobmV3IFRhYmxlV3JhcERhdGEoVGFibGVXcmFwRGF0YS5GSUxMX0dSQUIpKTsKLQkJZ2VuZXJhbFNlY3Rpb24uc2V0VGV4dChBdXRob3JpbmdVSVRleHQuU1RFUFNfU0VDVElPTl9OQU1FKTsKLQkJZ2VuZXJhbFNlY3Rpb24uc2V0RGVzY3JpcHRpb24oQXV0aG9yaW5nVUlUZXh0LlNURVBTX1NFQ1RJT05fREVTQyk7Ci0JCWdlbmVyYWxTZWN0aW9uLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQotCQlnZW5lcmFsQ29tcG9zaXRlID0gdG9vbGtpdC5jcmVhdGVDb21wb3NpdGUoZ2VuZXJhbFNlY3Rpb24pOwotCQlnZW5lcmFsQ29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQlnZW5lcmFsQ29tcG9zaXRlLnNldExheW91dChuZXcgR3JpZExheW91dCg0LCBmYWxzZSkpOwotCQlnZW5lcmFsU2VjdGlvbi5zZXRDbGllbnQoZ2VuZXJhbENvbXBvc2l0ZSk7Ci0KLQkJRWRpdG9yc0NvbnRleHRIZWxwZXIuc2V0SGVscChnZW5lcmFsQ29tcG9zaXRlLmdldFBhcmVudCgpLCB0YXNrKTsKLQotCQlDb21wb3NpdGUgcGFuZTEgPSB0b29sa2l0LmNyZWF0ZUNvbXBvc2l0ZShnZW5lcmFsQ29tcG9zaXRlKTsKLQkJewotCQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJCWdyaWREYXRhLnZlcnRpY2FsU3BhbiA9IDE7Ci0JCQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDM7Ci0JCQlwYW5lMS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJCXBhbmUxLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQkJfQotCi0JCUxhYmVsIGxfbmFtZSA9IHRvb2xraXQuY3JlYXRlTGFiZWwocGFuZTEsIEF1dGhvcmluZ1VJVGV4dC5TVEVQU19URVhUKTsKLQkJewotCQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuQkVHSU5OSU5HKTsKLQkJCWdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMzsKLQkJCWxfbmFtZS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJfQotCi0JCWN0cmxfc3RlcHMgPSB0b29sa2l0LmNyZWF0ZVRhYmxlKHBhbmUxLCBTV1QuTVVMVEkpOwotCQl7Ci0JCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQkJZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAzOwotCQkJZ3JpZERhdGEuaGVpZ2h0SGludCA9IDE1MDsKLQkJCWN0cmxfc3RlcHMuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCX0KLQotCQlpbml0UHJvdmlkZXJzKCk7Ci0KLQkJc3RlcHNUYWJsZVZpZXdlciA9IG5ldyBUYWJsZVZpZXdlcihjdHJsX3N0ZXBzKTsKLQkJc3RlcHNUYWJsZVZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIoc3RlcHNWaWV3ZXJDb250ZW50UHJvdmlkZXIpOwotCQlzdGVwc1RhYmxlVmlld2VyLnNldExhYmVsUHJvdmlkZXIoc3RlcHNWaWV3ZXJMYWJlbFByb3ZpZGVyKTsKLQotCQlDb21wb3NpdGUgcGFuZTIgPSB0b29sa2l0LmNyZWF0ZUNvbXBvc2l0ZShnZW5lcmFsQ29tcG9zaXRlKTsKLQkJcGFuZTIuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQ0VOVEVSCi0JCQkJfCBHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0NFTlRFUikpOwotCQlwYW5lMi5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0KLQkJY3RybF9hZGQgPSB0b29sa2l0LmNyZWF0ZUJ1dHRvbihwYW5lMiwgQXV0aG9yaW5nVUlUZXh0LkFERF9CVVRUT05fVEVYVCwKLQkJCQlTV1QuTk9ORSk7Ci0JCWN0cmxfYWRkLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCi0JCWN0cmxfZGVsZXRlID0gdG9vbGtpdC5jcmVhdGVCdXR0b24ocGFuZTIsCi0JCQkJQXV0aG9yaW5nVUlUZXh0LkRFTEVURV9CVVRUT05fVEVYVCwgU1dULk5PTkUpOwotCQljdHJsX2RlbGV0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJY3RybF9kZWxldGUuc2V0RW5hYmxlZChmYWxzZSk7Ci0KLQkJY3RybF91cCA9IHRvb2xraXQuY3JlYXRlQnV0dG9uKHBhbmUyLCBBdXRob3JpbmdVSVRleHQuVVBfQlVUVE9OX1RFWFQsCi0JCQkJU1dULk5PTkUpOwotCQljdHJsX3VwLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQljdHJsX3VwLnNldEVuYWJsZWQoZmFsc2UpOwotCi0JCWN0cmxfZG93biA9IHRvb2xraXQuY3JlYXRlQnV0dG9uKHBhbmUyLAotCQkJCUF1dGhvcmluZ1VJVGV4dC5ET1dOX0JVVFRPTl9URVhULCBTV1QuTk9ORSk7Ci0JCWN0cmxfZG93bi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJY3RybF9kb3duLnNldEVuYWJsZWQoZmFsc2UpOwotCi0JCWN0cmxfb3JkZXJpbmcgPSB0b29sa2l0LmNyZWF0ZUJ1dHRvbihwYW5lMiwKLQkJCQlBdXRob3JpbmdVSVRleHQuT1JERVJfQlVUVE9OX1RFWFQsIFNXVC5OT05FKTsKLQkJY3RybF9vcmRlcmluZy5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQotCQkvLyBuYW1lCi0JCUxhYmVsIG5hbWVMYWJlbCA9IHRvb2xraXQuY3JlYXRlTGFiZWwoZ2VuZXJhbENvbXBvc2l0ZSwKLQkJCQlBdXRob3JpbmdVSVRleHQuU1RFUF9OQU1FX1RFWFQpOwotCQl7Ci0JCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5CRUdJTk5JTkcpOwotCQkJZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSA0OwotCQkJbmFtZUxhYmVsLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQl9Ci0JCWN0cmxfbmFtZSA9IHRvb2xraXQuY3JlYXRlVGV4dChnZW5lcmFsQ29tcG9zaXRlLCAiIiwgU1dULlNJTkdMRSk7IC8vJE5PTi1OTFMtMSQKLQkJewotCQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJCWdyaWREYXRhLmhvcml6b250YWxTcGFuID0gNDsKLQkJCWN0cmxfbmFtZS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJfQotCi0JCWNyZWF0ZUJsYW5rTGFiZWwodG9vbGtpdCwgZ2VuZXJhbENvbXBvc2l0ZSwgNCk7Ci0KLQkJY3RybF9tYWluZGVzYyA9IGNyZWF0ZVJpY2hUZXh0RWRpdFdpdGhMaW5rKAotCQkJCXRvb2xraXQsIGdlbmVyYWxDb21wb3NpdGUsIEF1dGhvcmluZ1VJVGV4dC5ERVNDUklQVElPTl9URVhULAotCQkJCTI1MCwgMzAwLCA0KTsKLQotCQljcmVhdGVSaWNoVGV4dEVkaXRvclNlY3Rpb24oKTsKLQotCQl0b29sa2l0LnBhaW50Qm9yZGVyc0ZvcihwYW5lMSk7Ci0JCXRvb2xraXQucGFpbnRCb3JkZXJzRm9yKHBhbmUyKTsKLQkJdG9vbGtpdC5wYWludEJvcmRlcnNGb3IoZ2VuZXJhbENvbXBvc2l0ZSk7Ci0JCXRvb2xraXQucGFpbnRCb3JkZXJzRm9yKGV4cGFuZGVkQ29tcG9zaXRlKTsKLQotCQlhY3Rpb25NZ3IgPSAoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpKS5nZXRBY3Rpb25NYW5hZ2VyKCk7Ci0KLQkJYWRkTGlzdGVuZXJzKCk7Ci0JCWxvYWREYXRhKCk7Ci0JCWVuYWJsZUNvbnRyb2xzKCk7Ci0JfQotCi0JLyoqCi0JICogQWRkIGxpc3RlbmVycyB0byBtb25pdG9yIGZvY3VzIGFuZCBtb2RpZmljYXRpb24gY2hhbmdlcyBpbiB0aGUgZWRpdAotCSAqIGNvbnRyb2xzLgotCSAqLwotCXB1YmxpYyB2b2lkIGFkZExpc3RlbmVycygpIHsKLQkJZmluYWwgTWV0aG9kRWxlbWVudEVkaXRvciBlZGl0b3IgPSAoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCk7Ci0JCWNvbnRlbnRNb2RpZnlMaXN0ZW5lciA9IGVkaXRvci5jcmVhdGVNb2RpZnlMaXN0ZW5lcihjdXJyZW50U3RlcCk7Ci0JCWN0cmxfbmFtZS5hZGRNb2RpZnlMaXN0ZW5lcihjb250ZW50TW9kaWZ5TGlzdGVuZXIpOwotCQkoKE1ldGhvZEVsZW1lbnRFZGl0b3IuTW9kaWZ5TGlzdGVuZXIpIGNvbnRlbnRNb2RpZnlMaXN0ZW5lcikKLQkJCQkuc2V0RGlzYWJsZSh0cnVlKTsKLQotCQlmb3JtLmFkZExpc3RlbmVyKFNXVC5BY3RpdmF0ZSwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotLy8JCQkJSVN0YXR1cyBzdGF0dXMgPSBUbmdVdGlsLmNoZWNrRWRpdCgoRU9iamVjdCkgdGFzaywgZ2V0U2l0ZSgpCi0vLwkJCQkJCS5nZXRTaGVsbCgpKTsKLS8vCQkJCWlmIChzdGF0dXMuaXNPSygpKSB7Ci0vLwkJCQkJbG9hZERhdGEoKTsKLS8vCQkJCX0KLQkJCQlpZiAoZm9ybSAhPSBudWxsICYmICFmb3JtLmlzRGlzcG9zZWQoKSkgewotCQkJCQlVSUhlbHBlci5zZXRGb3JtVGV4dChmb3JtLCBjb250ZW50RWxlbWVudCk7Ci0JCQkJfQotCQkJCWxvYWREYXRhKCk7Ci0JCQkJaWYgKFRuZ1V0aWwuaXNMb2NrZWQoY29udGVudEVsZW1lbnQpKSB7Ci0JCQkJCWVuYWJsZUNvbnRyb2xzKGZhbHNlKTsKLQkJCQl9IGVsc2UgewotCQkJCQljdHJsX2FkZC5zZXRFbmFibGVkKHRydWUpOwotCQkJCQljaGVja1NlbGVjdGlvbigpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJZm9ybS5hZGRMaXN0ZW5lcihTV1QuRGVhY3RpdmF0ZSwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCWRlYWN0aXZhdGUoKTsKLQkJCX0KLQkJfSk7Ci0KLQkJZm9ybS5hZGRDb250cm9sTGlzdGVuZXIobmV3IENvbnRyb2xMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGNvbnRyb2xSZXNpemVkKENvbnRyb2xFdmVudCBlKSB7Ci0JCQkJaWYgKGN0cmxfZXhwYW5kZWQgIT0gbnVsbCkgewotCQkJCQkoKEdyaWREYXRhKSBjdHJsX2V4cGFuZGVkLmdldExheW91dERhdGEoKSkuaGVpZ2h0SGludCA9IGdldFJpY2hUZXh0RWRpdG9ySGVpZ2h0KCk7Ci0JCQkJCSgoR3JpZERhdGEpIGN0cmxfZXhwYW5kZWQuZ2V0TGF5b3V0RGF0YSgpKS53aWR0aEhpbnQgPSBnZXRSaWNoVGV4dEVkaXRvcldpZHRoKCk7Ci0JCQkJfQotCQkJCWZvcm1TZWN0aW9uLmxheW91dCh0cnVlLCB0cnVlKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgY29udHJvbE1vdmVkKENvbnRyb2xFdmVudCBlKSB7Ci0JCQl9Ci0JCX0pOwotCi0JCWN0cmxfbmFtZS5hZGRNb2RpZnlMaXN0ZW5lcihjb250ZW50TW9kaWZ5TGlzdGVuZXIpOwotCQljdHJsX25hbWUuYWRkRm9jdXNMaXN0ZW5lcihuZXcgRm9jdXNBZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgZm9jdXNMb3N0KEZvY3VzRXZlbnQgZSkgewotCQkJCWlmIChjdXJyZW50U3RlcCAhPSBudWxsKSB7Ci0JCQkJCVN0cmluZyBvbGRDb250ZW50ID0gY3VycmVudFN0ZXAuZ2V0TmFtZSgpOwotCQkJCQlTdHJpbmcgbmV3Q29udGVudCA9IGN0cmxfbmFtZS5nZXRUZXh0KCk7Ci0JCQkJCWlmIChjdHJsX25hbWUuZ2V0VGV4dCgpID09IG51bGwKLQkJCQkJCQl8fCBjdHJsX25hbWUuZ2V0VGV4dCgpLmxlbmd0aCgpID09IDApIHsKLQkJCQkJCVN0cmluZyB0aXRsZSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmJpbmQoQXV0aG9yaW5nVUlSZXNvdXJjZXMucmVuYW1lRGlhbG9nX3RpdGxlLCBMaWJyYXJ5VUlUZXh0LlRFWFRfU1RFUCk7IAotCQkJCQkJU3RyaW5nIG1zZyA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmJpbmQoQXV0aG9yaW5nVUlSZXNvdXJjZXMuZW1wdHlFbGVtZW50TmFtZUVycm9yX21zZywgU3RyVXRpbC50b0xvd2VyKExpYnJhcnlVSVRleHQuVEVYVF9TVEVQKSk7IAotCQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpCi0JCQkJCQkJCS5kaXNwbGF5RXJyb3IodGl0bGUsIG1zZyk7Ci0JCQkJCQljdHJsX25hbWUuc2V0U2VsZWN0aW9uKDAsIG9sZENvbnRlbnQubGVuZ3RoKCkpOwotCQkJCQl9IGVsc2UgaWYgKCFuZXdDb250ZW50LmVxdWFscyhvbGRDb250ZW50KSkgewotCQkJCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlNFVCwgY3VycmVudFN0ZXAsCi0JCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE5hbWVkRWxlbWVudF9OYW1lKCksCi0JCQkJCQkJCW5ld0NvbnRlbnQsIC0xKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJY3RybF9tYWluZGVzYy5hZGRNb2RpZnlMaXN0ZW5lcihjb250ZW50TW9kaWZ5TGlzdGVuZXIpOwotCQljdHJsX21haW5kZXNjLmFkZExpc3RlbmVyKFNXVC5EZWFjdGl2YXRlLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJc2F2ZU1haW5EZXNjcmlwdGlvbigpOwotCQkJfQotCQl9KTsKLQotCQlzdGVwc1RhYmxlVmlld2VyCi0JCQkJLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQkJCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQkJCWNoZWNrU2VsZWN0aW9uKCk7Ci0JCQkJCX0KLQkJCQl9KTsKLQotCQljdHJsX2FkZC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlvcmcuZWNsaXBzZS5lcGYudW1hLlNlY3Rpb24gY2hpbGQgPSBVbWFGYWN0b3J5LmVJTlNUQU5DRQotCQkJCQkJLmNyZWF0ZVNlY3Rpb24oKTsKLQkJCQlTdHJpbmcgbmV3TmFtZSA9IE1lc3NhZ2VGb3JtYXQuZm9ybWF0KAotCQkJCQkJQXV0aG9yaW5nVUlUZXh0Lk5FV19FTEVNRU5UX1RFWFQsCi0JCQkJCQluZXcgU3RyaW5nW10geyBMaWJyYXJ5VUlUZXh0LlRFWFRfU1RFUCB9KTsKLQkJCQljaGlsZC5zZXROYW1lKG5ld05hbWUpOwotCQkJCUFkZFRvU2VjdGlvbkxpc3RDb21tYW5kIGNtZCA9IG5ldyBBZGRUb1NlY3Rpb25MaXN0Q29tbWFuZCh0YXNrLAotCQkJCQkJY2hpbGQsIGFsbFN0ZXBzKTsKLQkJCQlnZXRBY3Rpb25NYW5hZ2VyKCkuZXhlY3V0ZShjbWQpOwotCQkJCXN0ZXBzVGFibGVWaWV3ZXIucmVmcmVzaCgpOwotCQkJCXN0ZXBzVGFibGVWaWV3ZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKGNoaWxkKSk7Ci0JCQkJY3RybF9uYW1lLnNldEZvY3VzKCk7Ci0JCQkJY3RybF9uYW1lLnNldFNlbGVjdGlvbigwLCBuZXdOYW1lLmxlbmd0aCgpKTsKLQkJCX0KLQkJfSk7Ci0KLQkJY3RybF9kZWxldGUuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzdGVwc1RhYmxlVmlld2VyCi0JCQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gc2VsZWN0aW9uLnRvTGlzdCgpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCU9iamVjdCBvID0gaXRlci5uZXh0KCk7Ci0JCQkJCWlmIChvIGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UuZXBmLnVtYS5TZWN0aW9uKSB7Ci0JCQkJCQlSZW1vdmVGcm9tU2VjdGlvbkxpc3QgY21kID0gbmV3IFJlbW92ZUZyb21TZWN0aW9uTGlzdCgKLQkJCQkJCQkJdGFzaywgKG9yZy5lY2xpcHNlLmVwZi51bWEuU2VjdGlvbikgbywgYWxsU3RlcHMpOwotCQkJCQkJZ2V0QWN0aW9uTWFuYWdlcigpLmV4ZWN1dGUoY21kKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlzdGVwc1RhYmxlVmlld2VyLnJlZnJlc2goKTsKLQkJCQllZGl0U3RlcChudWxsKTsKLQkJCX0KLQkJfSk7Ci0KLQkJY3RybF91cC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHN0ZXBzVGFibGVWaWV3ZXIKLQkJCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQotCQkJCUFycmF5TGlzdCBtb3ZlVXBJdGVtcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQltb3ZlVXBJdGVtcy5hZGRBbGwoc2VsZWN0aW9uLnRvTGlzdCgpKTsKLQkJCQlNb3ZlSW5TZWN0aW9uTGlzdENvbW1hbmQgY21kID0gbmV3IE1vdmVJblNlY3Rpb25MaXN0Q29tbWFuZCgKLQkJCQkJCXRhc2ssIG1vdmVVcEl0ZW1zLCBhbGxTdGVwcywgMSk7Ci0JCQkJZ2V0QWN0aW9uTWFuYWdlcigpLmV4ZWN1dGUoY21kKTsKLQotCQkJCXN0ZXBzVGFibGVWaWV3ZXIucmVmcmVzaCgpOwotCi0JCQkJaWYgKHN0ZXBzVGFibGVWaWV3ZXIuZ2V0VGFibGUoKS5nZXRTZWxlY3Rpb25JbmRleCgpID4gMAotCQkJCQkJJiYgIVRuZ1V0aWwuaXNMb2NrZWQodGFzaykpIHsKLQkJCQkJY3RybF91cC5zZXRFbmFibGVkKHRydWUpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWN0cmxfdXAuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJfQotCQkJCWlmIChzdGVwc1RhYmxlVmlld2VyLmdldFRhYmxlKCkuZ2V0U2VsZWN0aW9uSW5kZXgoKSA8IHN0ZXBzVGFibGVWaWV3ZXIKLQkJCQkJCS5nZXRUYWJsZSgpLmdldEl0ZW1Db3VudCgpIC0gMQotCQkJCQkJJiYgIVRuZ1V0aWwuaXNMb2NrZWQodGFzaykpIHsKLQkJCQkJY3RybF9kb3duLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJY3RybF9kb3duLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJY3RybF9kb3duLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgc3RlcHNUYWJsZVZpZXdlcgotCQkJCQkJLmdldFNlbGVjdGlvbigpOwotCQkJCUFycmF5TGlzdCBtb3ZlRG93bkl0ZW1zID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCW1vdmVEb3duSXRlbXMuYWRkQWxsKHNlbGVjdGlvbi50b0xpc3QoKSk7Ci0JCQkJTW92ZUluU2VjdGlvbkxpc3RDb21tYW5kIGNtZCA9IG5ldyBNb3ZlSW5TZWN0aW9uTGlzdENvbW1hbmQoCi0JCQkJCQl0YXNrLCBtb3ZlRG93bkl0ZW1zLCBhbGxTdGVwcywgMCk7Ci0JCQkJZ2V0QWN0aW9uTWFuYWdlcigpLmV4ZWN1dGUoY21kKTsKLQotCQkJCXN0ZXBzVGFibGVWaWV3ZXIucmVmcmVzaCgpOwotCi0JCQkJaWYgKHN0ZXBzVGFibGVWaWV3ZXIuZ2V0VGFibGUoKS5nZXRTZWxlY3Rpb25JbmRleCgpID4gMAotCQkJCQkJJiYgIVRuZ1V0aWwuaXNMb2NrZWQodGFzaykpIHsKLQkJCQkJY3RybF91cC5zZXRFbmFibGVkKHRydWUpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWN0cmxfdXAuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJfQotCQkJCWlmIChzdGVwc1RhYmxlVmlld2VyLmdldFRhYmxlKCkuZ2V0U2VsZWN0aW9uSW5kZXgoKSA8IHN0ZXBzVGFibGVWaWV3ZXIKLQkJCQkJCS5nZXRUYWJsZSgpLmdldEl0ZW1Db3VudCgpIC0gMQotCQkJCQkJJiYgIVRuZ1V0aWwuaXNMb2NrZWQodGFzaykpIHsKLQkJCQkJY3RybF9kb3duLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJY3RybF9kb3duLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJY3RybF9vcmRlcmluZy5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlTZWN0aW9uc09yZGVyRGlhbG9nIGRsZyA9IG5ldyBTZWN0aW9uc09yZGVyRGlhbG9nKAotCQkJCQkJRGlzcGxheS5nZXRDdXJyZW50KCkuZ2V0QWN0aXZlU2hlbGwoKSwKLQkJCQkJCXRhc2ssCi0JCQkJCQlnZXRBY3Rpb25NYW5hZ2VyKCksCi0JCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5TdGVwc09yZGVyRGlhbG9nX3RpdGxlLCAKLQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLlN0ZXBzT3JkZXJEaWFsb2dfZGVzY3JpcHRpb24sIAotCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuc3RlcHNfdGV4dCk7IAotCQkJCWRsZy5vcGVuKCk7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGVuYWJsZUNvbnRyb2xzKGJvb2xlYW4gZWRpdGFibGUpIHsKLQkJY3RybF9uYW1lLnNldEVkaXRhYmxlKGVkaXRhYmxlKTsKLQkJY3RybF9tYWluZGVzYy5zZXRFZGl0YWJsZShlZGl0YWJsZSk7Ci0JCWN0cmxfYWRkLnNldEVuYWJsZWQoZWRpdGFibGUpOwotCQljdHJsX2RlbGV0ZS5zZXRFbmFibGVkKGVkaXRhYmxlKTsKLQkJY3RybF91cC5zZXRFbmFibGVkKGVkaXRhYmxlKTsKLQkJY3RybF9kb3duLnNldEVuYWJsZWQoZWRpdGFibGUpOwotCQljdHJsX29yZGVyaW5nLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCWlmIChjdHJsX2V4cGFuZGVkICE9IG51bGwpIHsKLQkJCWN0cmxfZXhwYW5kZWQuc2V0RWRpdGFibGUoZWRpdGFibGUpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZGVhY3RpdmF0ZSgpIHsKLQkJLy8gU2F2ZSB0aGUgc3RlcCBvcmRlci4KLQkJaWYgKGFsbFN0ZXBzICE9IG51bGwpIHsKLQkJCWFsbFN0ZXBzLmFwcGx5KCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplcyB0aGUgY29udHJvbHMgd2l0aCBkYXRhIGZyb20gdGhlIG1vZGVsLgotCSAqLwotCXByaXZhdGUgdm9pZCBsb2FkRGF0YSgpIHsKLQkJYWxsU3RlcHMgPSBudWxsOwotCQlzdGVwc1RhYmxlVmlld2VyLnNldElucHV0KHRhc2spOwotCQlzdGVwc1RhYmxlVmlld2VyLnJlZnJlc2goKTsKLQkJZWRpdFN0ZXAoY3VycmVudFN0ZXApOwotCX0KLQotCS8qKgotCSAqIEVkaXQgY3VycmVudCBzdGVwLgotCSAqLwotCXByaXZhdGUgdm9pZCBlZGl0U3RlcChvcmcuZWNsaXBzZS5lcGYudW1hLlNlY3Rpb24gc3RlcCkgewotCQkoKE1ldGhvZEVsZW1lbnRFZGl0b3IuTW9kaWZ5TGlzdGVuZXIpIGNvbnRlbnRNb2RpZnlMaXN0ZW5lcikKLQkJCQkuc2V0RGlzYWJsZSh0cnVlKTsKLQotCQlpZiAoY3RybF9tYWluZGVzYy5nZXRNb2RpZmllZCgpKSB7Ci0JCQlzYXZlTWFpbkRlc2NyaXB0aW9uKCk7Ci0JCX0KLQotCQljdXJyZW50U3RlcCA9IHN0ZXA7Ci0JCVN0cmluZyBuYW1lID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIGRlc2MgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQlpZiAoY3VycmVudFN0ZXAgIT0gbnVsbCkgewotCQkJbmFtZSA9IGN1cnJlbnRTdGVwLmdldE5hbWUoKTsKLQkJCWRlc2MgPSBjdXJyZW50U3RlcC5nZXRTZWN0aW9uRGVzY3JpcHRpb24oKTsKLQkJCWN0cmxfbmFtZS5zZXRGb2N1cygpOwotCQl9Ci0JCWN0cmxfbmFtZS5zZXRUZXh0KG5hbWUgPT0gbnVsbCA/ICIiIDogbmFtZSk7IC8vJE5PTi1OTFMtMSQKLQkJY3RybF9tYWluZGVzYy5zZXRUZXh0KGRlc2MgPT0gbnVsbCA/ICIiIDogZGVzYyk7IC8vJE5PTi1OTFMtMSQKLQkJY3RybF9tYWluZGVzYy5zZXRNb2RhbE9iamVjdChjdXJyZW50U3RlcCk7Ci0JCWN0cmxfbWFpbmRlc2Muc2V0TW9kYWxPYmplY3RGZWF0dXJlKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldFNlY3Rpb25fU2VjdGlvbkRlc2NyaXB0aW9uKCkpOwotCQlpZiAoc3RlcCA9PSBudWxsKSB7Ci0JCQkvLyBjbG9zZSBhbnkgRmluZC9SZXBsYWNlIGRpYWxvZyBvcGVuIGluIHRoZSBSVEUKLQkJCWN0cmxfbWFpbmRlc2MuZ2V0RmluZFJlcGxhY2VBY3Rpb24oKS5kaXNwb3NlKCk7Ci0JCX0KLQotCQkoKE1ldGhvZEVsZW1lbnRFZGl0b3IuTW9kaWZ5TGlzdGVuZXIpIGNvbnRlbnRNb2RpZnlMaXN0ZW5lcikKLQkJCQkuc2V0RWxlbWVudChjdXJyZW50U3RlcCk7Ci0JCSgoTWV0aG9kRWxlbWVudEVkaXRvci5Nb2RpZnlMaXN0ZW5lcikgY29udGVudE1vZGlmeUxpc3RlbmVyKQotCQkJCS5zZXREaXNhYmxlKGN1cnJlbnRTdGVwID09IG51bGwpOwotCi0JCWVuYWJsZUNvbnRyb2xzKCk7Ci0JfQotCi0JLyoqCi0JICogRW5hYmxlIG5hbWUgYW5kIGRlc2NyaXB0aW9uIGNvbnRyb2xzCi0JICovCi0JcHJpdmF0ZSB2b2lkIGVuYWJsZUNvbnRyb2xzKCkgewotCQlpZiAodGFzay5nZXRQcmVzZW50YXRpb24oKS5nZXRTZWN0aW9ucygpLmNvbnRhaW5zKGN1cnJlbnRTdGVwKSkgewotCQkJaWYgKCFUbmdVdGlsLmlzTG9ja2VkKGNvbnRlbnRFbGVtZW50KSkgewotCQkJCWN0cmxfbmFtZS5zZXRFZGl0YWJsZSh0cnVlKTsKLQkJCQljdHJsX21haW5kZXNjLnNldEVkaXRhYmxlKHRydWUpOwotCQkJfQotCQl9IGVsc2UgewotCQkJY3RybF9uYW1lLnNldEVkaXRhYmxlKGZhbHNlKTsKLQkJCWN0cmxfbWFpbmRlc2Muc2V0RWRpdGFibGUoZmFsc2UpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogRGlzcG9zZSBsaXN0ZW5lcgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuZm9ybXMuZWRpdG9yLkZvcm1QYWdlI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVJpY2hUZXh0RWRpdG9yU2VjdGlvbigpIHsKLQkJZXhwYW5kZWRDb21wb3NpdGUgPSB0b29sa2l0LmNyZWF0ZUNvbXBvc2l0ZShmb3JtU2VjdGlvbiwgU1dULk5PTkUpOwotCQlleHBhbmRlZENvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBUYWJsZVdyYXBEYXRhKFRhYmxlV3JhcERhdGEuRklMTF9HUkFCKSk7Ci0JCWV4cGFuZGVkQ29tcG9zaXRlLnNldExheW91dChuZXcgR3JpZExheW91dCgyLCBmYWxzZSkpOwotCQlleHBhbmRlZENvbXBvc2l0ZS5zZXRWaXNpYmxlKGZhbHNlKTsKLQotCi0JCS8vIEh5cGVybGluayBkZXNjCi0JCWV4cGFuZExpbmsgPSB0b29sa2l0LmNyZWF0ZUltYWdlSHlwZXJsaW5rKGV4cGFuZGVkQ29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWV4cGFuZExpbmsuc2V0SW1hZ2UoQXV0aG9yaW5nVUlJbWFnZXMuSU1HX0VYUEFOREVEKTsKLQkJZXhwYW5kTGluay5zZXRUb29sVGlwVGV4dChBdXRob3JpbmdVSVJlc291cmNlcy5jbG9zZVJURSk7IAotCQlleHBhbmRMaW5rLnNldFVuZGVybGluZWQoZmFsc2UpOwotCQlleHBhbmRMaW5rLmFkZEh5cGVybGlua0xpc3RlbmVyKG5ldyBIeXBlcmxpbmtBZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgbGlua0FjdGl2YXRlZChIeXBlcmxpbmtFdmVudCBlKSB7Ci0JCQkJdG9nZ2xlKGUpOwotCQkJfQotCQl9KTsKLQotCQlleHBhbmRMYWJlbCA9IGNyZWF0ZURlY29yYXRlZExhYmVsKHRvb2xraXQsIGV4cGFuZGVkQ29tcG9zaXRlLCAiIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUb2dnbGUgRGVzY3JpcHRpb24gY29udHJvbCB0byBleHBhbmQgYW5kIGNvbnRyb2wgc3RhdGUuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdG9nZ2xlKEh5cGVybGlua0V2ZW50IGUpIHsKLQkJaWYgKGN1cnJlbnRTdGVwID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlmIChjdHJsX2V4cGFuZGVkID09IG51bGwpIHsKLQkJCWN0cmxfZXhwYW5kZWQgPSBjcmVhdGVSaWNoVGV4dEVkaXRvcih0b29sa2l0LCBleHBhbmRlZENvbXBvc2l0ZSwKLQkJCQkJU1dULk1VTFRJIHwgU1dULldSQVAgfCBTV1QuVl9TQ1JPTEwsIEdyaWREYXRhLkZJTExfQk9USCwKLQkJCQkJZ2V0UmljaFRleHRFZGl0b3JIZWlnaHQoKSwgZ2V0UmljaFRleHRFZGl0b3JXaWR0aCgpLCAyLCBleHBhbmRMYWJlbCk7Ci0JCQljdHJsX2V4cGFuZGVkLmFkZE1vZGlmeUxpc3RlbmVyKGNvbnRlbnRNb2RpZnlMaXN0ZW5lcik7Ci0JCX0KLQotCQlpZiAoZGVzY0V4cGFuZEZsYWcpIHsKLQkJCXNlY3Rpb25Db21wb3NpdGUuc2V0VmlzaWJsZSh0cnVlKTsKLQkJCWV4cGFuZGVkQ29tcG9zaXRlLnNldFZpc2libGUoZmFsc2UpOwotCQkJZm9ybVNlY3Rpb24uc2V0Q2xpZW50KHNlY3Rpb25Db21wb3NpdGUpOwotCQkJSU1ldGhvZFJpY2hUZXh0IHJpY2hUZXh0ID0gYWN0aXZlQ29udHJvbDsKLQkJCXJpY2hUZXh0LnNldFRleHQoY3RybF9leHBhbmRlZC5nZXRUZXh0KCkpOwotCQkJZm9yIChJdGVyYXRvciBpID0gcmljaFRleHQuZ2V0TGlzdGVuZXJzKCk7IGkuaGFzTmV4dCgpOykgewotCQkJCVJpY2hUZXh0TGlzdGVuZXIgbGlzdGVuZXIgPSAoUmljaFRleHRMaXN0ZW5lcikgaS5uZXh0KCk7Ci0JCQkJY3RybF9leHBhbmRlZC5yZW1vdmVMaXN0ZW5lcihsaXN0ZW5lci5nZXRFdmVudFR5cGUoKSwgbGlzdGVuZXIKLQkJCQkJCS5nZXRMaXN0ZW5lcigpKTsKLQkJCX0KLQkJCWlmIChjdHJsX2V4cGFuZGVkLmdldE1vZGlmaWVkKCkpIHsKLQkJCQkoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpKQotCQkJCQkJLnNhdmVNb2RpZmllZFJpY2hUZXh0KGN0cmxfZXhwYW5kZWQpOwotCQkJfQotCQkJcmljaFRleHQuc2V0Rm9jdXMoKTsKLQkJfSBlbHNlIHsKLQkJCXNlY3Rpb25Db21wb3NpdGUuc2V0VmlzaWJsZShmYWxzZSk7Ci0JCQlleHBhbmRlZENvbXBvc2l0ZS5zZXRWaXNpYmxlKHRydWUpOwotCQkJZm9ybVNlY3Rpb24uc2V0Q2xpZW50KGV4cGFuZGVkQ29tcG9zaXRlKTsKLQkJCWV4cGFuZExhYmVsLnNldFRleHQoY3VycmVudFN0ZXAuZ2V0TmFtZSgpICsKLQkJCQkJIiAtICIgKyAoU3RyaW5nKSAoKEltYWdlSHlwZXJsaW5rKSBlLmdldFNvdXJjZSgpKS5nZXREYXRhKCJUaXRsZSIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlJTWV0aG9kUmljaFRleHQgcmljaFRleHQgPSAoSU1ldGhvZFJpY2hUZXh0KSBlLmdldEhyZWYoKTsKLQkJCWN0cmxfZXhwYW5kZWQuc2V0SW5pdGlhbFRleHQocmljaFRleHQuZ2V0VGV4dCgpKTsKLQkJCWN0cmxfZXhwYW5kZWQuc2V0TW9kYWxPYmplY3QocmljaFRleHQuZ2V0TW9kYWxPYmplY3QoKSk7Ci0JCQljdHJsX2V4cGFuZGVkLnNldE1vZGFsT2JqZWN0RmVhdHVyZShyaWNoVGV4dAotCQkJCQkuZ2V0TW9kYWxPYmplY3RGZWF0dXJlKCkpOwotCQkJY3RybF9leHBhbmRlZC5zZXRGaW5kUmVwbGFjZUFjdGlvbihyaWNoVGV4dC5nZXRGaW5kUmVwbGFjZUFjdGlvbigpKTsKLQkJCWZvciAoSXRlcmF0b3IgaSA9IHJpY2hUZXh0LmdldExpc3RlbmVycygpOyBpLmhhc05leHQoKTspIHsKLQkJCQlSaWNoVGV4dExpc3RlbmVyIGxpc3RlbmVyID0gKFJpY2hUZXh0TGlzdGVuZXIpIGkubmV4dCgpOwotCQkJCWN0cmxfZXhwYW5kZWQuYWRkTGlzdGVuZXIobGlzdGVuZXIuZ2V0RXZlbnRUeXBlKCksIGxpc3RlbmVyCi0JCQkJCQkuZ2V0TGlzdGVuZXIoKSk7Ci0JCQl9Ci0JCQlib29sZWFuIGVkaXRhYmxlID0gIVRuZ1V0aWwuaXNMb2NrZWQoY29udGVudEVsZW1lbnQpOwotCQkJY3RybF9leHBhbmRlZC5zZXRFZGl0YWJsZShlZGl0YWJsZSk7Ci0JCQlpZiAoZWRpdGFibGUpIHsKLQkJCQljdHJsX2V4cGFuZGVkLnNldEZvY3VzKCk7Ci0JCQl9Ci0JCQlhY3RpdmVDb250cm9sID0gcmljaFRleHQ7Ci0JCX0KLQotCQlmb3JtLmdldEJvZHkoKS5sYXlvdXQodHJ1ZSwgdHJ1ZSk7Ci0JCWRlc2NFeHBhbmRGbGFnID0gIWRlc2NFeHBhbmRGbGFnOwotCX0KLQotCXByaXZhdGUgdm9pZCBpbml0UHJvdmlkZXJzKCkgewotCQlzdGVwc1ZpZXdlckNvbnRlbnRQcm92aWRlciA9IG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcigKLQkJCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkJLmdldE5hdmlnYXRvclZpZXdfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKSB7Ci0JCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IG9iamVjdCkgewotCQkJCWlmIChhbGxTdGVwcyA9PSBudWxsKSB7Ci0JCQkJCWFsbFN0ZXBzID0gbmV3IFNlY3Rpb25MaXN0KHRhc2ssCi0JCQkJCQkJU2VjdGlvbkxpc3QuU1RFUFNfRk9SX0VMRU1FTlRfT05MWSk7Ci0JCQkJfQotCQkJCXJldHVybiBhbGxTdGVwcy50b0FycmF5KCk7Ci0JCQl9Ci0JCX07Ci0KLQkJc3RlcHNWaWV3ZXJMYWJlbFByb3ZpZGVyID0gbmV3IFZhcmlhYmlsaXR5RWxlbWVudExhYmVsUHJvdmlkZXIoCi0JCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJCS5nZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSkgewotCQkJcHVibGljIGJvb2xlYW4gaXNFeHRlcm5hbChPYmplY3QgZWxlbWVudCkgewotCQkJCXJldHVybiAhdGFzay5nZXRQcmVzZW50YXRpb24oKS5nZXRTZWN0aW9ucygpLmNvbnRhaW5zKGVsZW1lbnQpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgdm9pZCBzYXZlTWFpbkRlc2NyaXB0aW9uKCkgewotCQlpZiAoY3VycmVudFN0ZXAgIT0gbnVsbCkgewotCQkJSU1ldGhvZFJpY2hUZXh0IGNvbnRyb2wgPSBkZXNjRXhwYW5kRmxhZyA/IGN0cmxfZXhwYW5kZWQKLQkJCQkJOiBjdHJsX21haW5kZXNjOwotCQkJaWYgKCFjb250cm9sLmdldE1vZGlmaWVkKCkpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlTdHJpbmcgb2xkQ29udGVudCA9IGN1cnJlbnRTdGVwLmdldFNlY3Rpb25EZXNjcmlwdGlvbigpOwotCQkJaWYgKCgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpLm11c3RSZXN0b3JlVmFsdWUoY29udHJvbCwKLQkJCQkJb2xkQ29udGVudCkpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlTdHJpbmcgbmV3Q29udGVudCA9IGNvbnRyb2wuZ2V0VGV4dCgpOwotCQkJaWYgKCFuZXdDb250ZW50LmVxdWFscyhvbGRDb250ZW50KSkgewotCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5TRVQsIGN1cnJlbnRTdGVwLAotCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2VjdGlvbl9TZWN0aW9uRGVzY3JpcHRpb24oKSwKLQkJCQkJCW5ld0NvbnRlbnQsIC0xKTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCBJQWN0aW9uTWFuYWdlciBnZXRBY3Rpb25NYW5hZ2VyKCkgewotCQlGb3JtRWRpdG9yIGVkaXRvciA9IGdldEVkaXRvcigpOwotCQlpZiAoZWRpdG9yIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudEVkaXRvcikgewotCQkJcmV0dXJuICgoTWV0aG9kRWxlbWVudEVkaXRvcikgZWRpdG9yKS5nZXRBY3Rpb25NYW5hZ2VyKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNoZWNrU2VsZWN0aW9uKCkgewotCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHN0ZXBzVGFibGVWaWV3ZXIKLQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCWlmIChzZWxlY3Rpb24uc2l6ZSgpID4gMCAmJiAhVG5nVXRpbC5pc0xvY2tlZCh0YXNrKSkgewotCQkJY3RybF9kZWxldGUuc2V0RW5hYmxlZCh0cnVlKTsKLQotCQkJaWYgKHN0ZXBzVGFibGVWaWV3ZXIuZ2V0VGFibGUoKS5nZXRTZWxlY3Rpb25JbmRleCgpID4gMAotCQkJCQkmJiAhVG5nVXRpbC5pc0xvY2tlZCh0YXNrKSAmJiBzZWxlY3Rpb24uc2l6ZSgpID09IDEpIHsKLQkJCQljdHJsX3VwLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQl9IGVsc2UgewotCQkJCWN0cmxfdXAuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQl9Ci0KLQkJCWlmIChzdGVwc1RhYmxlVmlld2VyLmdldFRhYmxlKCkuZ2V0U2VsZWN0aW9uSW5kZXgoKSA8IHN0ZXBzVGFibGVWaWV3ZXIKLQkJCQkJLmdldFRhYmxlKCkuZ2V0SXRlbUNvdW50KCkgLSAxCi0JCQkJCSYmICFUbmdVdGlsLmlzTG9ja2VkKHRhc2spICYmIHNlbGVjdGlvbi5zaXplKCkgPT0gMSkgewotCQkJCWN0cmxfZG93bi5zZXRFbmFibGVkKHRydWUpOwotCQkJfSBlbHNlIHsKLQkJCQljdHJsX2Rvd24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQl9Ci0JCX0KLQkJaWYgKHNlbGVjdGlvbi5zaXplKCkgPT0gMSkgewotCQkJZWRpdFN0ZXAoKG9yZy5lY2xpcHNlLmVwZi51bWEuU2VjdGlvbikgc2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpKTsKLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL1Rhc2tXb3JrUHJvZHVjdHNQYWdlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL1Rhc2tXb3JrUHJvZHVjdHNQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5ZWQ1YzQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9UYXNrV29ya1Byb2R1Y3RzUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjY2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuTWV0aG9kRWxlbWVudEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZpbHRlcnMuV29ya1Byb2R1Y3RGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklBY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuRmlsdGVyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFzazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuZWRpdG9yLkZvcm1FZGl0b3I7Ci0KLQotLyoqCi0gKiBUaGUgV29yayBQcm9kdWN0cyBwYWdlIGluIHRoZSBUYXNrIGVkaXRvci4KLSAqIAotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgVGFza1dvcmtQcm9kdWN0c1BhZ2UgZXh0ZW5kcyBBc3NvY2lhdGlvbkZvcm1QYWdlIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JNX1BBR0VfSUQgPSAidGFza1dvcmtQcm9kdWN0c1BhZ2UiOyAvLyROT04tTkxTLTEkCQotCi0JcHJpdmF0ZSBUYXNrIHRhc2s7Ci0KLQlwcml2YXRlIElBY3Rpb25NYW5hZ2VyIGFjdGlvbk1ncjsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFRhc2tXb3JrUHJvZHVjdHNQYWdlKEZvcm1FZGl0b3IgZWRpdG9yKSB7Ci0JCXN1cGVyKGVkaXRvciwgRk9STV9QQUdFX0lELCBBdXRob3JpbmdVSVRleHQuV09SS19QUk9EVUNUU19QQUdFX1RJVExFKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNpbml0KG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlLCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJRWRpdG9yU2l0ZSBzaXRlLCBJRWRpdG9ySW5wdXQgaW5wdXQpIHsKLQkJc3VwZXIuaW5pdChzaXRlLCBpbnB1dCk7Ci0JCXRhc2sgPSAoVGFzaykgY29udGVudEVsZW1lbnQ7Ci0JCWFjdGlvbk1nciA9ICgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpLmdldEFjdGlvbk1hbmFnZXIoKTsKLQkJc2V0QWxsb3dDaGFuZ2UxKHRydWUpOwotCQlzZXRBbGxvd0NoYW5nZTIodHJ1ZSk7Ci0JCXNldEFsbG93Q2hhbmdlMyh0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLmZvcm1zLmVkaXRvci5jcmVhdGVGb3JtQ29udGVudChJTWFuYWdlZEZvcm0pCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdENvbnRlbnRQcm92aWRlclNlbGVjdGVkKCkgewotCQljb250ZW50UHJvdmlkZXJTZWxlY3RlZCA9IG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcigKLQkJCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkJLmdldE5hdmlnYXRvclZpZXdfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKSB7Ci0JCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IG9iamVjdCkgewotCQkJCXJldHVybiAoKFRhc2spIG9iamVjdCkuZ2V0TWFuZGF0b3J5SW5wdXQoKS50b0FycmF5KCk7Ci0JCQl9Ci0JCX07Ci0JCXZpZXdlcl9zZWxlY3RlZC5zZXRDb250ZW50UHJvdmlkZXIoY29udGVudFByb3ZpZGVyU2VsZWN0ZWQpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2FkZEl0ZW1zVG9Nb2RlbDEoQXJyYXlMaXN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEl0ZW1zVG9Nb2RlbDEoQXJyYXlMaXN0IGFkZEl0ZW1zKSB7Ci0JCS8vIFVwZGF0ZSB0aGUgbW9kZWwuCi0JCWlmICghYWRkSXRlbXMuaXNFbXB0eSgpKSB7Ci0JCQlMaXN0IGVsZW1lbnRMaXN0ID0gcmV0cmlldmVUYWJsZVZpZXdlckNvbnRlbnRzKHZpZXdlcl9zZWxlY3RlZDIpOwotCQkJTGlzdCBhZGRJdGVtc0ZpbHRlcmVkID0gbmV3IEFycmF5TGlzdCgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhZGRJdGVtcy5zaXplKCk7IGkrKykgewotCQkJCWlmICghZWxlbWVudExpc3QuY29udGFpbnMoKChXb3JrUHJvZHVjdCkgYWRkSXRlbXMuZ2V0KGkpKSkpIHsKLQkJCQkJYWRkSXRlbXNGaWx0ZXJlZC5hZGQoYWRkSXRlbXMuZ2V0KGkpKTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoYWRkSXRlbXMuc2l6ZSgpID4gMCkgewotCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5BRERfTUFOWSwgdGFzaywKLQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tfTWFuZGF0b3J5SW5wdXQoKSwKLQkJCQkJCWFkZEl0ZW1zRmlsdGVyZWQsIC0xKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI3JlbW92ZUl0ZW1zRnJvbU1vZGVsMShBcnJheUxpc3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlSXRlbXNGcm9tTW9kZWwxKEFycmF5TGlzdCBybUl0ZW1zKSB7Ci0JCS8vIFVwZGF0ZSB0aGUgbW9kZWwuCi0JCWlmICghcm1JdGVtcy5pc0VtcHR5KCkpIHsKLQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5SRU1PVkVfTUFOWSwgdGFzaywKLQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza19NYW5kYXRvcnlJbnB1dCgpLCBybUl0ZW1zLCAtMSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNpbml0Q29udGVudFByb3ZpZGVyU2VsZWN0ZWQyKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0Q29udGVudFByb3ZpZGVyU2VsZWN0ZWQyKCkgewotCQljb250ZW50UHJvdmlkZXJTZWxlY3RlZDIgPSBuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoCi0JCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJCS5nZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSkgewotCQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gKChUYXNrKSBvYmplY3QpLmdldE9wdGlvbmFsSW5wdXQoKS50b0FycmF5KCk7Ci0JCQl9Ci0JCX07Ci0JCXZpZXdlcl9zZWxlY3RlZDIuc2V0Q29udGVudFByb3ZpZGVyKGNvbnRlbnRQcm92aWRlclNlbGVjdGVkMik7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjYWRkSXRlbXNUb01vZGVsMihBcnJheUxpc3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkSXRlbXNUb01vZGVsMihBcnJheUxpc3QgYWRkSXRlbXMpIHsKLQkJLy8gVXBkYXRlIHRoZSBtb2RlbC4KLQkJaWYgKCFhZGRJdGVtcy5pc0VtcHR5KCkpIHsKLQkJCUxpc3QgZWxlbWVudExpc3QgPSByZXRyaWV2ZVRhYmxlVmlld2VyQ29udGVudHModmlld2VyX3NlbGVjdGVkKTsKLQkJCUxpc3QgYWRkSXRlbXNGaWx0ZXJlZCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYWRkSXRlbXMuc2l6ZSgpOyBpKyspIHsKLQkJCQlpZiAoIWVsZW1lbnRMaXN0LmNvbnRhaW5zKCgoV29ya1Byb2R1Y3QpIGFkZEl0ZW1zLmdldChpKSkpKSB7Ci0JCQkJCWFkZEl0ZW1zRmlsdGVyZWQuYWRkKGFkZEl0ZW1zLmdldChpKSk7Ci0JCQkJfQotCQkJfQotCQkJaWYgKGFkZEl0ZW1zLnNpemUoKSA+IDApIHsKLQkJCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuQUREX01BTlksIHRhc2ssCi0JCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrX09wdGlvbmFsSW5wdXQoKSwKLQkJCQkJCWFkZEl0ZW1zRmlsdGVyZWQsIC0xKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI3JlbW92ZUl0ZW1zRnJvbU1vZGVsMihBcnJheUxpc3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlSXRlbXNGcm9tTW9kZWwyKEFycmF5TGlzdCBybUl0ZW1zKSB7Ci0JCS8vIFVwZGF0ZSB0aGUgbW9kZWwuCi0JCWlmICghcm1JdGVtcy5pc0VtcHR5KCkpIHsKLQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5SRU1PVkVfTUFOWSwgdGFzaywKLQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza19PcHRpb25hbElucHV0KCksIHJtSXRlbXMsIC0xKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2luaXRDb250ZW50UHJvdmlkZXJTZWxlY3RlZDMoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRDb250ZW50UHJvdmlkZXJTZWxlY3RlZDMoKSB7Ci0JCWNvbnRlbnRQcm92aWRlclNlbGVjdGVkMyA9IG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcigKLQkJCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkJLmdldE5hdmlnYXRvclZpZXdfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKSB7Ci0JCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IG9iamVjdCkgewotCQkJCXJldHVybiAoKFRhc2spIG9iamVjdCkuZ2V0T3V0cHV0KCkudG9BcnJheSgpOwotCQkJfQotCQl9OwotCQl2aWV3ZXJfc2VsZWN0ZWQzLnNldENvbnRlbnRQcm92aWRlcihjb250ZW50UHJvdmlkZXJTZWxlY3RlZDMpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2FkZEl0ZW1zVG9Nb2RlbDIoQXJyYXlMaXN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEl0ZW1zVG9Nb2RlbDMoQXJyYXlMaXN0IGFkZEl0ZW1zKSB7Ci0JCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5BRERfTUFOWSwgdGFzaywgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0VGFza19PdXRwdXQoKSwgYWRkSXRlbXMsIC0xKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNyZW1vdmVJdGVtc0Zyb21Nb2RlbDIoQXJyYXlMaXN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbW92ZUl0ZW1zRnJvbU1vZGVsMyhBcnJheUxpc3Qgcm1JdGVtcykgewotCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuUkVNT1ZFX01BTlksIHRhc2ssCi0JCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza19PdXRwdXQoKSwgcm1JdGVtcywgLTEpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2dldENvbnRlbnRFbGVtZW50KCkKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGdldENvbnRlbnRFbGVtZW50KCkgewotCQlyZXR1cm4gdGFzazsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRUYWJTdHJpbmcoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0VGFiU3RyaW5nKCkgewotCQlyZXR1cm4gRmlsdGVyQ29uc3RhbnRzLldPUktQUk9EVUNUUzsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRGaWx0ZXIoKQotCSAqLwotCXByb3RlY3RlZCBJRmlsdGVyIGdldEZpbHRlcigpIHsKLQkJcmV0dXJuIGZpbHRlciA9IG5ldyBXb3JrUHJvZHVjdEZpbHRlcigpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2dldEZpbHRlcjIoKQotCSAqLwotCXByb3RlY3RlZCBJRmlsdGVyIGdldEZpbHRlcjIoKSB7Ci0JCXJldHVybiBmaWx0ZXIgPSBuZXcgV29ya1Byb2R1Y3RGaWx0ZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRGaWx0ZXIzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpbHRlciBnZXRGaWx0ZXIzKCkgewotCQlyZXR1cm4gZmlsdGVyID0gbmV3IFdvcmtQcm9kdWN0RmlsdGVyKCk7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldE11bHRpcGxlU2VsZWN0RGVzY3JpcHRpb24oaW50KQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbihpbnQgY291bnQpIHsKLQkJcmV0dXJuIHN1cGVyLmdldE11bHRpcGxlU2VsZWN0RGVzY3JpcHRpb24oY291bnQsIEF1dGhvcmluZ1VJUmVzb3VyY2VzLnRhc2tXb3JrUHJvZHVjdHNQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb24pOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNnZXRTZWN0aW9uRGVzY3JpcHRpb24oKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VjdGlvbkRlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMudGFza1dvcmtQcm9kdWN0c1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldFNlY3Rpb25OYW1lKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlY3Rpb25OYW1lKCkgewotCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMudGFza1dvcmtQcm9kdWN0c1BhZ2Vfc2VjdGlvbk5hbWU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0U2VsZWN0ZWRMYWJlbCgpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTZWxlY3RlZExhYmVsKCkgewotCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMudGFza1dvcmtQcm9kdWN0c1BhZ2Vfc2VsZWN0ZWRMYWJlbDsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0U2VsZWN0ZWRMYWJlbDIoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VsZWN0ZWRMYWJlbDIoKSB7Ci0JCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy50YXNrV29ya1Byb2R1Y3RzUGFnZV9zZWxlY3RlZExhYmVsMjsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0U2VsZWN0ZWRMYWJlbDMoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VsZWN0ZWRMYWJlbDMoKSB7Ci0JCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy50YXNrV29ya1Byb2R1Y3RzUGFnZV9zZWxlY3RlZExhYmVsMzsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvVG9vbERlc2NyaXB0aW9uUGFnZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9Ub29sRGVzY3JpcHRpb25QYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyNDUwOTYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9Ub29sRGVzY3JpcHRpb25QYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZpbHRlcnMuQ2F0ZWdvcnlGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuRmlsdGVyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuVmFyaWFiaWxpdHlCYXNlRWxlbWVudEZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRvb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLmVkaXRvci5Gb3JtRWRpdG9yOwotCi0KLS8qKgotICogVGhlIERlc2NyaXB0aW9uIHBhZ2UgZm9yIHRoZSBEb21haW4gZWRpdG9yLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBUb29sRGVzY3JpcHRpb25QYWdlIGV4dGVuZHMgRGVzY3JpcHRpb25Gb3JtUGFnZSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9STV9QQUdFX0lEID0gInRvb2xEZXNjcmlwdGlvblBhZ2UiOyAvLyROT04tTkxTLTEkCQotCi0JcHJpdmF0ZSBUb29sIHRvb2w7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBUb29sRGVzY3JpcHRpb25QYWdlKEZvcm1FZGl0b3IgZWRpdG9yKSB7Ci0JCXN1cGVyKGVkaXRvciwgRk9STV9QQUdFX0lELCBBdXRob3JpbmdVSVRleHQuREVTQ1JJUFRJT05fUEFHRV9USVRMRSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjaW5pdChvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZSwgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0KQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSUVkaXRvclNpdGUgc2l0ZSwgSUVkaXRvcklucHV0IGlucHV0KSB7Ci0JCXN1cGVyLmluaXQoc2l0ZSwgaW5wdXQpOwotCQl0b29sID0gKFRvb2wpIGNvbnRlbnRFbGVtZW50OwotCQlzZXRFeHRlcm5hbElET24odHJ1ZSk7Ci0JCXNldExvbmdQcmVzZW50YXRpb25OYW1lT24odHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjZ2V0Q29udGVudEVsZW1lbnQoKQotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZ2V0Q29udGVudEVsZW1lbnQoKSB7Ci0JCXJldHVybiB0b29sOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2dldEZpbHRlcigpCi0JICovCi0JcHJvdGVjdGVkIElGaWx0ZXIgZ2V0RmlsdGVyKCkgewotCQlmaWx0ZXIgPSBuZXcgQ2F0ZWdvcnlGaWx0ZXIoKSB7Ci0JCQlwcm90ZWN0ZWQgYm9vbGVhbiBjaGlsZEFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCQkJcmV0dXJuIChvYmogaW5zdGFuY2VvZiBUb29sKTsKLQkJCX0KLQkJfTsKLQotCQkvLyBzZXQgYWRkaXRpb25hbCBmaWx0ZXIgZm9yIHZhcmlhYmlsaXR5IGJhc2UgZWxlbWVudCBjaGVja2luZwotCQkoKENhdGVnb3J5RmlsdGVyKSBmaWx0ZXIpCi0JCQkJLnNldEFkZGl0aW9uYWxGaWx0ZXJzKG5ldyBJRmlsdGVyW10geyBuZXcgVmFyaWFiaWxpdHlCYXNlRWxlbWVudEZpbHRlcigKLQkJCQkJCXRvb2wpIH0pOwotCQlyZXR1cm4gZmlsdGVyOwotCi0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRUYWJTdHJpbmcoKSB7Ci0JCXJldHVybiBGaWx0ZXJDb25zdGFudHMuVE9PTFM7Ci0JfQotCQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2xvYWRTZWN0aW9uRGVzY3JpcHRpb24oKQotCSAqLwotCXB1YmxpYyB2b2lkIGxvYWRTZWN0aW9uRGVzY3JpcHRpb24oKSB7Ci0JCXRoaXMuZ2VuZXJhbFNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLnRvb2xfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M7Ci0JCXRoaXMuZGV0YWlsU2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMudG9vbF9kZXRhaWxTZWN0aW9uX2Rlc2M7Ci0JCXRoaXMudmFyaWFiaWxpdHlTZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy50b29sX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjOwotCQl0aGlzLnZlcnNpb25TZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy50b29sX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9Ub29sVG9vbE1lbnRvcnNQYWdlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL1Rvb2xUb29sTWVudG9yc1BhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGRhZjI5Mi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL1Rvb2xUb29sTWVudG9yc1BhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwMCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLk1ldGhvZEVsZW1lbnRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5maWx0ZXJzLkd1aWRhbmNlRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JQWN0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuTW92ZUluTGlzdENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5GaWx0ZXJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51aS5Vc2VySW50ZXJhY3Rpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkNhdGVnb3J5U29ydEhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuQ29udGVudEVsZW1lbnRPcmRlckxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLk1vZGVsU3RydWN0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudENhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRvb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Ub29sTWVudG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuZWRpdG9yLkZvcm1FZGl0b3I7Ci0KLQotLyoqCi0gKiBUaGUgVG9vbCBNZW50b3JzIHBhZ2UgaW4gdGhlIFRvb2wgZWRpdG9yLgotICogCi0gKiBAYXV0aG9yIExva2FuYXRoIEphZ2dhCi0gKiBAYXV0aG9yIEJpbmd4dWUgWHUKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgVG9vbFRvb2xNZW50b3JzUGFnZSBleHRlbmRzIEFzc29jaWF0aW9uRm9ybVBhZ2UgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZPUk1fUEFHRV9JRCA9ICJ0b29sVG9vbE1lbnRvcnNQYWdlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBUb29sIHRvb2w7Ci0KLQlwcml2YXRlIElBY3Rpb25NYW5hZ2VyIGFjdGlvbk1ncjsKLQkKLQlwcml2YXRlIENvbnRlbnRFbGVtZW50T3JkZXJMaXN0IGFsbFN0ZXBzOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgVG9vbFRvb2xNZW50b3JzUGFnZShGb3JtRWRpdG9yIGVkaXRvcikgewotCQlzdXBlcihlZGl0b3IsIEZPUk1fUEFHRV9JRCwgQXV0aG9yaW5nVUlUZXh0LlRPT0xfTUVOVE9SU19QQUdFX1RJVExFKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNpbml0KG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlLCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJRWRpdG9yU2l0ZSBzaXRlLCBJRWRpdG9ySW5wdXQgaW5wdXQpIHsKLQkJc3VwZXIuaW5pdChzaXRlLCBpbnB1dCk7Ci0JCXRvb2wgPSAoVG9vbCkgY29udGVudEVsZW1lbnQ7Ci0JCWFjdGlvbk1nciA9ICgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpLmdldEFjdGlvbk1hbmFnZXIoKTsKLQkJc2V0VXNlQ2F0ZWdvcnkyKGZhbHNlKTsKLQkJc2V0VXNlQ2F0ZWdvcnkzKGZhbHNlKTsKLQkJc2V0SXNVcEFuZERvd25CdXR0b25zUmVxdWlyZWQxKHRydWUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2luaXRDb250ZW50UHJvdmlkZXJTZWxlY3RlZCgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdENvbnRlbnRQcm92aWRlclNlbGVjdGVkKCkgewotCQljb250ZW50UHJvdmlkZXJTZWxlY3RlZCA9IG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcigKLQkJCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkJLmdldE5hdmlnYXRvclZpZXdfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKSB7Ci0JCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IG9iamVjdCkgewotCQkJCS8vcmV0dXJuIHRvb2wuZ2V0VG9vbE1lbnRvcnMoKS50b0FycmF5KCk7Ci0JCQkJaWYgKGFsbFN0ZXBzID09IG51bGwpIHsKLQkJCQkJYWxsU3RlcHMgPSBuZXcgQ29udGVudEVsZW1lbnRPcmRlckxpc3QoCi0JCQkJCQkJY29udGVudEVsZW1lbnQsCi0JCQkJCQkJQ29udGVudEVsZW1lbnRPcmRlckxpc3QuQ09OVEVOVF9FTEVNRU5UU19fRk9SX0VMRU1FTlRfT05MWSwKLQkJCQkJCQlnZXRPcmRlckZlYXR1cmUoKSk7Ci0JCQkJfQotCQkJCUxpc3QgcmV0dXJuTGlzdCA9IENhdGVnb3J5U29ydEhlbHBlci5zb3J0Q2F0ZWdvcnlFbGVtZW50cygKLQkJCQkJCWNvbnRlbnRFbGVtZW50LCBhbGxTdGVwcy50b0FycmF5KCkpOwotCQkJCXJldHVybiByZXR1cm5MaXN0LnRvQXJyYXkoKTsKLQkJCX0KLQkJfTsKLQkJdmlld2VyX3NlbGVjdGVkLnNldENvbnRlbnRQcm92aWRlcihjb250ZW50UHJvdmlkZXJTZWxlY3RlZCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjYWRkSXRlbXNUb01vZGVsMShBcnJheUxpc3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkSXRlbXNUb01vZGVsMShBcnJheUxpc3QgYWRkSXRlbXMpIHsKLQkJLy8gVXBkYXRlIHRoZSBtb2RlbC4KLQkJaWYgKCFhZGRJdGVtcy5pc0VtcHR5KCkpIHsKLQkJCS8vIGNoZWNrIGlmIHRoaXMgb3BlcmF0aW9uIHdpbGwgbW9kaWZ5IHRoZSBlbGVtZW50IGluIG9wcG9zaXRlIGZlYXR1cmUgdmFsdWUKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGFkZEl0ZW1zLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCU1ldGhvZEVsZW1lbnQgZWxlbWVudCA9IChNZXRob2RFbGVtZW50KSBpdGVyLm5leHQoKTsKLQkJCQlpZiAoIVVzZXJJbnRlcmFjdGlvbkhlbHBlci5jaGVja01vZGlmeU9wcG9zaXRlKHRvb2wsCi0JCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUb29sX1Rvb2xNZW50b3JzKCksIGVsZW1lbnQpKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQl9Ci0JCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuQUREX01BTlksIHRvb2wsCi0JCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRvb2xfVG9vbE1lbnRvcnMoKSwgYWRkSXRlbXMsIC0xKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI3JlbW92ZUl0ZW1zRnJvbU1vZGVsMShBcnJheUxpc3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlSXRlbXNGcm9tTW9kZWwxKEFycmF5TGlzdCBybUl0ZW1zKSB7Ci0JCS8vIFVwZGF0ZSB0aGUgbW9kZWwuCi0JCWlmICghcm1JdGVtcy5pc0VtcHR5KCkpIHsKLQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5SRU1PVkVfTUFOWSwgdG9vbCwKLQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VG9vbF9Ub29sTWVudG9ycygpLCBybUl0ZW1zLCAtMSk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjZ2V0Q29udGVudEVsZW1lbnQoKQotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZ2V0Q29udGVudEVsZW1lbnQoKSB7Ci0JCXJldHVybiB0b29sOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2dldFRhYlN0cmluZygpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRUYWJTdHJpbmcoKSB7Ci0JCXJldHVybiBGaWx0ZXJDb25zdGFudHMuVE9PTF9NRU5UT1JTOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2dldEZpbHRlcigpCi0JICovCi0JcHJvdGVjdGVkIElGaWx0ZXIgZ2V0RmlsdGVyKCkgewotCQlyZXR1cm4gZmlsdGVyID0gbmV3IEd1aWRhbmNlRmlsdGVyKCkgewotCQkJcHJvdGVjdGVkIGJvb2xlYW4gY2hpbGRBY2NlcHQoT2JqZWN0IG9iaikgewotCQkJCXJldHVybiAob2JqIGluc3RhbmNlb2YgVG9vbE1lbnRvcik7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldE11bHRpcGxlU2VsZWN0RGVzY3JpcHRpb24oaW50KQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbihpbnQgY291bnQpIHsKLQkJcmV0dXJuIHN1cGVyLmdldE11bHRpcGxlU2VsZWN0RGVzY3JpcHRpb24oY291bnQsIEF1dGhvcmluZ1VJUmVzb3VyY2VzLnRvb2xUb29sTWVudG9yc1BhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbik7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldFNlY3Rpb25EZXNjcmlwdGlvbigpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTZWN0aW9uRGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy50b29sVG9vbE1lbnRvcnNQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNnZXRTZWN0aW9uTmFtZSgpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTZWN0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLnRvb2xUb29sTWVudG9yc1BhZ2Vfc2VjdGlvbk5hbWU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0U2VsZWN0ZWRMYWJlbCgpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTZWxlY3RlZExhYmVsKCkgewotCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMudG9vbFRvb2xNZW50b3JzUGFnZV9zZWxlY3RlZExhYmVsOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRVN0cnVjdHVyYWxGZWF0dXJlIGdldE9yZGVyRmVhdHVyZSgpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRvb2xfVG9vbE1lbnRvcnMoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nW10gZ2V0TW9kZWxTdHJ1Y3R1cmVQYXRoKCkgewotCQlyZXR1cm4gTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC50b29sUGF0aDsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIENvbnRlbnRFbGVtZW50T3JkZXJMaXN0IGdldENvbnRlbnRFbGVtZW50T3JkZXJMaXN0KCkgewotCQlyZXR1cm4gYWxsU3RlcHM7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL1dvcmtQcm9kdWN0Q2F0ZWdvcmllc1BhZ2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvV29ya1Byb2R1Y3RDYXRlZ29yaWVzUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MDg4OGQzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvV29ya1Byb2R1Y3RDYXRlZ29yaWVzUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzA5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXM7Ci0KLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5maWx0ZXJzLkNhdGVnb3J5RmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZmlsdGVycy5DdXN0b21DYXRlZ29yeUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuRmlsdGVyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5NZXNzZW5nZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5MaWJyYXJ5TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkN1c3RvbUNhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkFzc29jaWF0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuRm9ybUVkaXRvcjsKLQotCi0vKioKLSAqIFRoZSBDYXRlZ29yaWVzIHBhZ2UgaW4gdGhlIFdvcmsgUHJvZHVjdCBlZGl0b3IuCi0gKiAKLSAqIEBhdXRob3IgSmVmZiBIYXJkeQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKiByZW1vdmUgdGhlIHRvLW9uZSBVSSByZXN0cmljdGlvbiBvbiB3cC1kb21pYW4gKFIzOTUzOTApIDIwMDctMDgtMzAKLSAqLwotcHVibGljIGNsYXNzIFdvcmtQcm9kdWN0Q2F0ZWdvcmllc1BhZ2UgZXh0ZW5kcyBBc3NvY2lhdGlvbkZvcm1QYWdlIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JNX1BBR0VfSUQgPSAid29ya1Byb2R1Y3RDYXRlZ29yaWVzUGFnZSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgV29ya1Byb2R1Y3Qgd29ya1Byb2R1Y3Q7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBXb3JrUHJvZHVjdENhdGVnb3JpZXNQYWdlKEZvcm1FZGl0b3IgZWRpdG9yKSB7Ci0JCXN1cGVyKGVkaXRvciwgRk9STV9QQUdFX0lELCBBdXRob3JpbmdVSVRleHQuQ0FURUdPUklFU19QQUdFX1RJVExFKTsKLQl9Ci0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjaW5pdChvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZSwgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0KQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSUVkaXRvclNpdGUgc2l0ZSwgSUVkaXRvcklucHV0IGlucHV0KSB7Ci0JCXN1cGVyLmluaXQoc2l0ZSwgaW5wdXQpOwotCQl3b3JrUHJvZHVjdCA9IChXb3JrUHJvZHVjdCkgY29udGVudEVsZW1lbnQ7Ci0JCXNldFVzZUNhdGVnb3J5Myh0cnVlKTsKLQkJc2V0Q2F0ZWdvcnlJc1NpbmdsZVNlbGVjdGlvbjEodHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjaW5pdENvbnRlbnRQcm92aWRlclNlbGVjdGVkKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0Q29udGVudFByb3ZpZGVyU2VsZWN0ZWQoKSB7Ci0JCWNvbnRlbnRQcm92aWRlclNlbGVjdGVkID0gbmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKAotCQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpIHsKLQkJCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIEFzc29jaWF0aW9uSGVscGVyLmdldERvbWFpbnMoKFdvcmtQcm9kdWN0KSBvYmplY3QpLnRvQXJyYXkoKTsKLQkJCX0KLQkJfTsKLQkJdmlld2VyX3NlbGVjdGVkLnNldENvbnRlbnRQcm92aWRlcihjb250ZW50UHJvdmlkZXJTZWxlY3RlZCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjYWRkSXRlbXNUb01vZGVsMShBcnJheUxpc3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkSXRlbXNUb01vZGVsMShBcnJheUxpc3QgYWRkSXRlbXMpIHsKLQkJLy8gVXBkYXRlIHRoZSBtb2RlbC4KLQkJaWYgKCFhZGRJdGVtcy5pc0VtcHR5KCkpIHsKLQkJCU9iamVjdCBkb21haW4gPSBhZGRJdGVtcy5nZXQoMCk7Ci0JCQlMaXN0IGRvbWFpbnMgPSBBc3NvY2lhdGlvbkhlbHBlci5nZXREb21haW5zKHdvcmtQcm9kdWN0KTsKLQkJCWlmIChkb21haW5zICE9IG51bGwgJiYgZG9tYWlucy5zaXplKCkgPiAwKQl7Ci0JCQkJT2JqZWN0IGFzc29jaWF0ZWREb21haW4gPSBkb21haW5zLmdldCgwKTsKLS8vCQkJCVN0cmluZyBtc2cgPSBNZXNzYWdlRm9ybWF0Ci0vLwkJCQkuZm9ybWF0KAotLy8JCQkJCQlMaWJyYXJ5RWRpdFJlc291cmNlcy5Vc2VySW50ZXJhY3Rpb25IZWxwZXJfZXJyUmVsYXRpb25zaGlwRXhpc3RzLAotLy8JCQkJCQluZXcgT2JqZWN0W10gewotLy8JCQkJCQkJCXdvcmtQcm9kdWN0LmdldE5hbWUoKSwKLS8vCQkJCQkJCQlUbmdVdGlsCi0vLwkJCQkJCQkJCQkuZ2V0TGFiZWxXaXRoUGF0aChhc3NvY2lhdGVkRG9tYWluKSwKLS8vCQkJCQkJCQkoKERvbWFpbikgZG9tYWluKS5nZXROYW1lKCkgfSk7Ci0vLwkJCQlNZXNzZW5nZXIuSU5TVEFOQ0Uuc2hvd1dhcm5pbmcoCi0vLwkJCQkJCUxpYnJhcnlFZGl0UmVzb3VyY2VzLmVycm9yRGlhbG9nX3RpdGxlLCBtc2cpOwotLy8JCQkJcmV0dXJuOwotCQkJfQotCQkJCi0JCQlMaWJyYXJ5TWFuYWdlci5nZXRJbnN0YW5jZSgpLmFkZFRvRG9tYWluKGdldEFjdGlvbk1hbmFnZXIoKSwKLQkJCQkJKERvbWFpbikgZG9tYWluLCB3b3JrUHJvZHVjdCwgdXNlZENhdGVnb3JpZXMpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjcmVtb3ZlSXRlbXNGcm9tTW9kZWwxKEFycmF5TGlzdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVJdGVtc0Zyb21Nb2RlbDEoQXJyYXlMaXN0IHJtSXRlbXMpIHsKLQkJLy8gVXBkYXRlIHRoZSBtb2RlbC4KLQkJaWYgKCFybUl0ZW1zLmlzRW1wdHkoKSkgewotCQkJZm9yIChJdGVyYXRvciBpdCA9IHJtSXRlbXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCURvbWFpbiBkb21haW4gPSAoRG9tYWluKSBpdC5uZXh0KCk7Ci0JCQkJTGlicmFyeU1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5yZW1vdmVGcm9tRG9tYWluKAotCQkJCQkJZ2V0QWN0aW9uTWFuYWdlcigpLCBkb21haW4sIHdvcmtQcm9kdWN0LCB1c2VkQ2F0ZWdvcmllcyk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNpbml0Q29udGVudFByb3ZpZGVyU2VsZWN0ZWQyKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0Q29udGVudFByb3ZpZGVyU2VsZWN0ZWQyKCkgewotCQljb250ZW50UHJvdmlkZXJTZWxlY3RlZDIgPSBuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoCi0JCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJCS5nZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSkgewotCQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gQXNzb2NpYXRpb25IZWxwZXIuZ2V0V29ya1Byb2R1Y3RUeXBlcygKLQkJCQkJCShXb3JrUHJvZHVjdCkgb2JqZWN0KS50b0FycmF5KCk7Ci0JCQl9Ci0JCX07Ci0JCXZpZXdlcl9zZWxlY3RlZDIuc2V0Q29udGVudFByb3ZpZGVyKGNvbnRlbnRQcm92aWRlclNlbGVjdGVkMik7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjYWRkSXRlbXNUb01vZGVsMigpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkSXRlbXNUb01vZGVsMihBcnJheUxpc3QgYWRkSXRlbXMpIHsKLQkJLy8gVXBkYXRlIHRoZSBtb2RlbC4KLQkJaWYgKCFhZGRJdGVtcy5pc0VtcHR5KCkpIHsKLQkJCWZvciAoamF2YS51dGlsLkl0ZXJhdG9yIGl0ID0gYWRkSXRlbXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCVdvcmtQcm9kdWN0VHlwZSB3cFR5cGUgPSAoV29ya1Byb2R1Y3RUeXBlKSBpdC5uZXh0KCk7Ci0JCQkJTGlicmFyeU1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5hZGRUb1dvcmtQcm9kdWN0VHlwZSgKLQkJCQkJCWdldEFjdGlvbk1hbmFnZXIoKSwgd3BUeXBlLCB3b3JrUHJvZHVjdCwgdXNlZENhdGVnb3JpZXMpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjcmVtb3ZlSXRlbXNGcm9tTW9kZWwyKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVJdGVtc0Zyb21Nb2RlbDIoQXJyYXlMaXN0IHJtSXRlbXMpIHsKLQkJLy8gVXBkYXRlIHRoZSBtb2RlbC4KLQkJaWYgKCFybUl0ZW1zLmlzRW1wdHkoKSkgewotCQkJZm9yIChJdGVyYXRvciBpdCA9IHJtSXRlbXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCVdvcmtQcm9kdWN0VHlwZSB3cFR5cGUgPSAoV29ya1Byb2R1Y3RUeXBlKSBpdC5uZXh0KCk7Ci0JCQkJTGlicmFyeU1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5yZW1vdmVGcm9tV29ya1Byb2R1Y3RUeXBlKAotCQkJCQkJZ2V0QWN0aW9uTWFuYWdlcigpLCB3cFR5cGUsIHdvcmtQcm9kdWN0LCB1c2VkQ2F0ZWdvcmllcyk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNpbml0Q29udGVudFByb3ZpZGVyU2VsZWN0ZWQzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0Q29udGVudFByb3ZpZGVyU2VsZWN0ZWQzKCkgewotCQljb250ZW50UHJvdmlkZXJTZWxlY3RlZDMgPSBuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoCi0JCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJCS5nZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSkgewotCQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gQXNzb2NpYXRpb25IZWxwZXIuZ2V0Q3VzdG9tQ2F0ZWdvcmllcygKLQkJCQkJCShXb3JrUHJvZHVjdCkgb2JqZWN0KS50b0FycmF5KCk7Ci0JCQl9Ci0JCX07Ci0JCXZpZXdlcl9zZWxlY3RlZDMuc2V0Q29udGVudFByb3ZpZGVyKGNvbnRlbnRQcm92aWRlclNlbGVjdGVkMyk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjYWRkSXRlbXNUb01vZGVsMyhBcnJheUxpc3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkSXRlbXNUb01vZGVsMyhBcnJheUxpc3QgYWRkSXRlbXMpIHsKLQkJLy8gVXBkYXRlIHRoZSBtb2RlbC4KLQkJaWYgKCFhZGRJdGVtcy5pc0VtcHR5KCkpIHsKLQkJCWZvciAoamF2YS51dGlsLkl0ZXJhdG9yIGl0ID0gYWRkSXRlbXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCUN1c3RvbUNhdGVnb3J5IGN1c3RvbUNhdGVnb3J5ID0gKEN1c3RvbUNhdGVnb3J5KSBpdC5uZXh0KCk7Ci0JCQkJTGlicmFyeU1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5hZGRUb0N1c3RvbUNhdGVnb3J5KAotCQkJCQkJZ2V0QWN0aW9uTWFuYWdlcigpLCBjdXN0b21DYXRlZ29yeSwgd29ya1Byb2R1Y3QsIHVzZWRDYXRlZ29yaWVzKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI3JlbW92ZUl0ZW1zRnJvbU1vZGVsMyhBcnJheUxpc3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlSXRlbXNGcm9tTW9kZWwzKEFycmF5TGlzdCBybUl0ZW1zKSB7Ci0JCS8vIFVwZGF0ZSB0aGUgbW9kZWwuCi0JCWlmICghcm1JdGVtcy5pc0VtcHR5KCkpIHsKLQkJCWZvciAoamF2YS51dGlsLkl0ZXJhdG9yIGl0ID0gcm1JdGVtcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJQ3VzdG9tQ2F0ZWdvcnkgY3VzdG9tQ2F0ZWdvcnkgPSAoQ3VzdG9tQ2F0ZWdvcnkpIGl0Lm5leHQoKTsKLQkJCQlMaWJyYXJ5TWFuYWdlci5nZXRJbnN0YW5jZSgpLnJlbW92ZUZyb21DdXN0b21DYXRlZ29yeSgKLQkJCQkJCWdldEFjdGlvbk1hbmFnZXIoKSwgY3VzdG9tQ2F0ZWdvcnksIHdvcmtQcm9kdWN0LCB1c2VkQ2F0ZWdvcmllcyk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRDb250ZW50RWxlbWVudCgpCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBnZXRDb250ZW50RWxlbWVudCgpIHsKLQkJcmV0dXJuIHdvcmtQcm9kdWN0OwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2dldFRhYlN0cmluZygpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRUYWJTdHJpbmcoKSB7Ci0JCXJldHVybiBGaWx0ZXJDb25zdGFudHMuRE9NQUlOUzsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRUYWJTdHJpbmcyKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFRhYlN0cmluZzIoKSB7Ci0JCXJldHVybiBGaWx0ZXJDb25zdGFudHMuV09SS1BST0RVQ1RUWVBFUzsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRUYWJTdHJpbmczKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFRhYlN0cmluZzMoKSB7Ci0JCXJldHVybiBGaWx0ZXJDb25zdGFudHMuQ1VTVE9NX0NBVEVHT1JJRVM7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjZ2V0RmlsdGVyKCkKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpbHRlciBnZXRGaWx0ZXIoKSB7Ci0JCXJldHVybiBmaWx0ZXIgPSBuZXcgQ2F0ZWdvcnlGaWx0ZXIoKSB7Ci0JCQlwcm90ZWN0ZWQgYm9vbGVhbiBjaGlsZEFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCQkJcmV0dXJuIChvYmogaW5zdGFuY2VvZiBEb21haW4pOwotCQkJfQotCQl9OwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2dldEZpbHRlcjIoKQotCSAqLwotCXByb3RlY3RlZCBJRmlsdGVyIGdldEZpbHRlcjIoKSB7Ci0JCXJldHVybiBmaWx0ZXIyID0gbmV3IENhdGVnb3J5RmlsdGVyKCkgewotCQkJcHJvdGVjdGVkIGJvb2xlYW4gY2hpbGRBY2NlcHQoT2JqZWN0IG9iaikgewotCQkJCXJldHVybiAob2JqIGluc3RhbmNlb2YgV29ya1Byb2R1Y3RUeXBlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRGaWx0ZXIzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpbHRlciBnZXRGaWx0ZXIzKCkgewotCQlyZXR1cm4gZmlsdGVyMyA9IG5ldyBDdXN0b21DYXRlZ29yeUZpbHRlcigpOwotCX0KLQkKLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNnZXRTZWN0aW9uRGVzY3JpcHRpb24oKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VjdGlvbkRlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMud29ya1Byb2R1Y3RDYXRlZ29yaWVzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb247Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0U2VjdGlvbk5hbWUoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VjdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy53b3JrUHJvZHVjdENhdGVnb3JpZXNQYWdlX3NlY3Rpb25OYW1lOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldFNlbGVjdGVkTGFiZWwoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VsZWN0ZWRMYWJlbCgpIHsKLQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLndvcmtQcm9kdWN0Q2F0ZWdvcmllc1BhZ2Vfc2VsZWN0ZWRMYWJlbDsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0U2VsZWN0ZWRMYWJlbDIoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VsZWN0ZWRMYWJlbDIoKSB7Ci0JCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy53b3JrUHJvZHVjdENhdGVnb3JpZXNQYWdlX3NlbGVjdGVkTGFiZWwyOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNnZXRTZWxlY3RlZExhYmVsMygpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTZWxlY3RlZExhYmVsMygpIHsKLQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLndvcmtQcm9kdWN0Q2F0ZWdvcmllc1BhZ2Vfc2VsZWN0ZWRMYWJlbDM7Ci0JfQotCQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvblN0cmluZygpIHsKLQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLndvcmtQcm9kdWN0Q2F0ZWdvcmllc1BhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvV29ya1Byb2R1Y3REZWxpdmVyYWJsZVBhcnRzUGFnZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9Xb3JrUHJvZHVjdERlbGl2ZXJhYmxlUGFydHNQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4ZWVkNmQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9Xb3JrUHJvZHVjdERlbGl2ZXJhYmxlUGFydHNQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMzYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3JtczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuTWV0aG9kRWxlbWVudEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZpbHRlcnMuV29ya1Byb2R1Y3RGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS51dGlsLlVJSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JQWN0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLkZpbHRlckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuRm9ybUVkaXRvcjsKLQotCi0vKioKLSAqIFRoZSBEZWxpdmVyYWJsZSBQYXJ0cyBwYWdlIGluIHRoZSBXb3JrIFByb2R1Y3QgZWRpdG9yLgotICogCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgV29ya1Byb2R1Y3REZWxpdmVyYWJsZVBhcnRzUGFnZSBleHRlbmRzIEFzc29jaWF0aW9uRm9ybVBhZ2UgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZPUk1fUEFHRV9JRCA9ICJ3b3JrUHJvZHVjdERlbGl2ZXJhYmxlUGFydHNQYWdlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBXb3JrUHJvZHVjdCB3b3JrUHJvZHVjdDsKLQotCXByaXZhdGUgSUFjdGlvbk1hbmFnZXIgYWN0aW9uTWdyOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgV29ya1Byb2R1Y3REZWxpdmVyYWJsZVBhcnRzUGFnZShGb3JtRWRpdG9yIGVkaXRvcikgewotCQlzdXBlcihlZGl0b3IsIEZPUk1fUEFHRV9JRCwKLQkJCQlBdXRob3JpbmdVSVRleHQuREVMSVZFUkFCTEVfUEFSVFNfUEFHRV9USVRMRSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjaW5pdChvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZSwgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0KQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSUVkaXRvclNpdGUgc2l0ZSwgSUVkaXRvcklucHV0IGlucHV0KSB7Ci0JCXN1cGVyLmluaXQoc2l0ZSwgaW5wdXQpOwotCQl3b3JrUHJvZHVjdCA9IChXb3JrUHJvZHVjdCkgY29udGVudEVsZW1lbnQ7Ci0JCWFjdGlvbk1nciA9ICgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpLmdldEFjdGlvbk1hbmFnZXIoKTsKLQkJc2V0VXNlQ2F0ZWdvcnkyKGZhbHNlKTsKLQkJc2V0VXNlQ2F0ZWdvcnkzKGZhbHNlKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNpbml0Q29udGVudFByb3ZpZGVyU2VsZWN0ZWQoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRDb250ZW50UHJvdmlkZXJTZWxlY3RlZCgpIHsKLQkJY29udGVudFByb3ZpZGVyU2VsZWN0ZWQgPSBuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoCi0JCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJCS5nZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSkgewotCQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBvYmplY3QpIHsKLQkJCQlEZWxpdmVyYWJsZSB3cCA9IChEZWxpdmVyYWJsZSkgd29ya1Byb2R1Y3Q7Ci0JCQkJcmV0dXJuIHdwLmdldERlbGl2ZXJlZFdvcmtQcm9kdWN0cygpLnRvQXJyYXkoKTsKLQkJCX0KLQkJfTsKLQkJdmlld2VyX3NlbGVjdGVkLnNldENvbnRlbnRQcm92aWRlcihjb250ZW50UHJvdmlkZXJTZWxlY3RlZCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjYWRkSXRlbXNUb01vZGVsMShBcnJheUxpc3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkSXRlbXNUb01vZGVsMShBcnJheUxpc3QgYWRkSXRlbXMpIHsKLQkJLy8gVXBkYXRlIHRoZSBtb2RlbC4KLQkJaWYgKCFhZGRJdGVtcy5pc0VtcHR5KCkpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBhZGRJdGVtcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJV29ya1Byb2R1Y3QgaXRlbSA9IChXb3JrUHJvZHVjdCkgaXQubmV4dCgpOwotCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5BREQsIHdvcmtQcm9kdWN0LAotCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJLmdldERlbGl2ZXJhYmxlX0RlbGl2ZXJlZFdvcmtQcm9kdWN0cygpLCBpdGVtLAotCQkJCQkJLTEpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjcmVtb3ZlSXRlbXNGcm9tTW9kZWwxKEFycmF5TGlzdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVJdGVtc0Zyb21Nb2RlbDEoQXJyYXlMaXN0IHJtSXRlbXMpIHsKLQkJLy8gVXBkYXRlIHRoZSBtb2RlbC4KLQkJaWYgKCFybUl0ZW1zLmlzRW1wdHkoKSkgewotCQkJZm9yIChJdGVyYXRvciBpdCA9IHJtSXRlbXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCVdvcmtQcm9kdWN0IGl0ZW0gPSAoV29ya1Byb2R1Y3QpIGl0Lm5leHQoKTsKLQkJCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuUkVNT1ZFLCB3b3JrUHJvZHVjdCwKLQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCS5nZXREZWxpdmVyYWJsZV9EZWxpdmVyZWRXb3JrUHJvZHVjdHMoKSwgaXRlbSwKLQkJCQkJCS0xKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2dldENvbnRlbnRFbGVtZW50KCkKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGdldENvbnRlbnRFbGVtZW50KCkgewotCQlyZXR1cm4gd29ya1Byb2R1Y3Q7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjZ2V0VGFiU3RyaW5nKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFRhYlN0cmluZygpIHsKLQkJcmV0dXJuIEZpbHRlckNvbnN0YW50cy5XT1JLUFJPRFVDVFM7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjZ2V0RmlsdGVyKCkKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpbHRlciBnZXRGaWx0ZXIoKSB7Ci0JCWZpbHRlciA9IG5ldyBXb3JrUHJvZHVjdEZpbHRlcigpIHsKLQkJCS8qCi0JCQkgKiBBcnJheUxpc3QoYmFkbGlzdCkgaXMgdXNlZCB0byBzdG9yZSBhbGwKLQkJCSAqIGdlbmVyYWxpemVyL2Jhc2V2YXJpYWJpbGl0eSBmb3Igc3VicGFydHMgb2YKLQkJCSAqIGdlbmVyYWxpemVyL2Jhc2V2YXJpYWJpbGl0eSBjYW4gYmUgcmVqZWN0ZWQuIERlbGl2ZXJhYmxlIGNhbm5vdAotCQkJICogaG9sZCBpbmZvcm1hdGlvbiB0byB3aG8gaXRzZWxmIGlzIGFjdGluZyBhcyBkZWxpdmVyYWJsZSBwYXJ0LgotCQkJICovCi0JCQlMaXN0IGJhZGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJCXByb3RlY3RlZCBib29sZWFuIGNoaWxkQWNjZXB0KE9iamVjdCBvYmopIHsKLQkJCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0KSB7Ci0JCQkJCS8qIAotCQkJCQkgKiBDaGVjayBEZWxpdmVyYWJsZSBhbmQgRGVsaXZlcmFibGVQYXJ0cyBhc3NvY2lhdGlvbgotCQkJCQkgKiBjaXJjdWxhciBkZXBlbmRlbmN5LgotCQkJCQkqLwotCQkJCQlpZiAob2JqIGluc3RhbmNlb2YgRGVsaXZlcmFibGUKLQkJCQkJCQkmJiB3b3JrUHJvZHVjdCBpbnN0YW5jZW9mIERlbGl2ZXJhYmxlKSB7Ci0JCQkJCQkvKgotCQkJCQkJICogQ2hlY2sgcGFzc2VkIG9iamVjdCdzIGNoYWluZWQgZGVsaXZlcmFibGUgcGFydHMKLQkJCQkJCSAqICh0cmVlKSBjb250YWluIHdvcmtQcm9kdWN0IChlZGl0b3Igb2JqZWN0KS4KLQkJCQkJCSAqLwotCQkJCQkJaWYgKCFVSUhlbHBlci5jaGVja0NpcmN1bGFyRGVsaXZlcmFibGVzKAotCQkJCQkJCQkoRGVsaXZlcmFibGUpIG9iaiwgKERlbGl2ZXJhYmxlKSB3b3JrUHJvZHVjdCkpIHsKLQkJCQkJCQliYWRsaXN0LmFkZChvYmopOwotCQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJCX0KLQkJCQkJCWlmICghY2hlY2tWYXJpYWJpbGl0eSgoRGVsaXZlcmFibGUpIG9iaiwgYmFkbGlzdCkpIHsKLQkJCQkJCQliYWRsaXN0LmFkZChvYmopOwotCQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJCX0KLQkJCQkJCS8vIGJyb3dzZSB0aHJvdWdoIGJhZGxpc3QgYW5kIGl0cyBkZWxpdmVyYWJsZSBwYXJ0cy4KLQkJCQkJCUxpc3QgdGVtcGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gYmFkbGlzdC5pdGVyYXRvcigpOyBpdGVyYXRvcgotCQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJCU9iamVjdCBiYWQgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCQkJVUlIZWxwZXIuZGVsaXZlcmFibGVQYXJ0c0NoYWluKChEZWxpdmVyYWJsZSkgYmFkLCB0ZW1wbGlzdCk7Ci0JCQkJCQl9Ci0JCQkJCQlpZiAodGVtcGxpc3QuY29udGFpbnMob2JqKSkKLQkJCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCX0KLQkJCQkJLyoKLQkJCQkJICogcmV0dXJuIHRydWUgaWYgYWJvdmUgY29uZGl0aW9uIGFyZSBzdWNjZXNzZnVsCi0JCQkJCSAqLwotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9OwotCQlyZXR1cm4gZmlsdGVyOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNoZWNrVmFyaWFiaWxpdHkoRGVsaXZlcmFibGUgZSwgTGlzdCBiYWRsaXN0KSB7Ci0KLQkJLyoKLQkJICogQ2hlY2sgZWRpdG9yIG9iamVjdCdzIHZhcmlhYmlsaXR5IGJhc2Ugb2JqZWN0IGlzIGNoaWxkIGluCi0JCSAqIERlbGl2ZXJhYmxlKGUpIHRyZWUuIHRoZW4gRGVsaXZlcmFibGUoZSlzaG91bGRub3QgYmUgYWNjZXB0ZWQuIEQxIC0+Ci0JCSAqIEQyIC0+IEQzICggLT4gaW5kaWNhdGVzIGRlbGl2ZXJhYmxlIHBhcnQgcmVsYXRpb25zaGlwKSBENiBjb250cmlidXRlcwotCQkgKiBEMy4gRDYgY2Fubm90IHNlbGVjdCBEMSxEMiBhcyBkZWxpdmVyYWJsZSBwYXJ0LgotCQkgKi8KLQkJaWYgKHdvcmtQcm9kdWN0LmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSAhPSBudWxsKSB7Ci0JCQlPYmplY3Qgb2JqID0gd29ya1Byb2R1Y3QuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpOwotCQkJaWYgKCFVSUhlbHBlci5jaGVja0NpcmN1bGFyRGVsaXZlcmFibGVzKGUsIChEZWxpdmVyYWJsZSkgb2JqKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQkvKgotCQkgKiBDaGVjayBlZGl0b3IgRGVsaXZlcmFibGUncyBnZW5lcmFsaXplciwgaWYgZ2VuZXJhbGl6ZXIncyBzdWJwYXJ0cwotCQkgKiAodHJlZSkgY29udGFpbnMgcGFzc2VkIGRlbGl2ZXJhYmxlLiBSZXR1cm4gZmFsc2UuCi0JCSAqLwotCi0JCUl0ZXJhdG9yIGl0ID0gVG5nVXRpbC5nZXRHZW5lcmFsaXplcnMod29ya1Byb2R1Y3QpOwotCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQlWYXJpYWJpbGl0eUVsZW1lbnQgdmUgPSAoVmFyaWFiaWxpdHlFbGVtZW50KSBpdC5uZXh0KCk7Ci0JCQlpZiAodmUgIT0gbnVsbCkgewotCQkJCS8qCi0JCQkJICogZ2VuZXJhbGl6ZXIgaXMgYWRkZWQgdG8gYmFkbGlzdCwgYmVjYXVzZSBpZiB2YXJpYWJpbGl0eSBiYXNlCi0JCQkJICogaXMgZmlsdGVyZWQgYmVmb3JlIGNvbWluZyB0byBjaGlsZEFjY2VwdChvYmplY3QpIG1ldGhvZCwgdGhpcwotCQkJCSAqIHdpbGwgcHJldmVudHMgYW55IHN1YnBhcnRzIG9mIGdlbmVyYWxpemVyIHRvIGJlIGFkZGVkIGFzIGEKLQkJCQkgKiBkZWxpdmVyYWJsZSBwYXJ0IG9mIERlbGl2ZXJhYmxlIChFZGl0b3Igb2JqZWN0IG9yIGxvY2FsCi0JCQkJICogZGVmaW5lZCB2YXJpYWJsZSJ3b3JrUHJvZHVjdCIpLgotCQkJCSAqIAotCQkJCSAqIGVnOiBEMSAtPiBEMiAtPiBEMy4gKC0+IGluZGljYXRlcyBkZWxpdmVyYWJsZSBwYXJ0KS4gRDEKLQkJCQkgKiBjb250cmlidXRlcyBENS4gYW5kIEQ1J3MgZGVsaXZlcmFibGUgcGFydHMgYXNzaWduIGZpbHRlcgotCQkJCSAqIHNob3VsZG5vdCBzaG93IEQyIGFuZCBEMy4KLQkJCQkgKiAKLQkJCQkgKi8KLQkJCQliYWRsaXN0LmFkZCh2ZSk7Ci0JCQkJaWYgKHZlLmVxdWFscyhlKSkKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCWlmICghVUlIZWxwZXIuY2hlY2tDaXJjdWxhckRlbGl2ZXJhYmxlcyhlLCAoRGVsaXZlcmFibGUpIHZlKSkKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCi0JCX0KLQkJLyoKLQkJICogCi0JCSAqLwotCQlpZiAoZS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkgIT0gbnVsbCkgewotCQkJT2JqZWN0IG9iaiA9IGUuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpOwotCQkJaWYgKCFVSUhlbHBlci5jaGVja0NpcmN1bGFyRGVsaXZlcmFibGVzKChEZWxpdmVyYWJsZSkgb2JqLAotCQkJCQkoRGVsaXZlcmFibGUpIHdvcmtQcm9kdWN0KSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJLyoKLQkJICogQ2hlY2sgcGFzc2VkIG9iamVjdCdzIGdlbmVyYWxpemVyJ3MgZGVsaXZlcmFibGUgcGFydHMgbGlzdCBkb25vdCBoYXZlCi0JCSAqIHdvcmtQcm9kdWN0LgotCQkgKi8KLQkJSXRlcmF0b3IgaXQxID0gVG5nVXRpbC5nZXRHZW5lcmFsaXplcnMoZSk7Ci0JCXdoaWxlIChpdDEuaGFzTmV4dCgpKSB7Ci0JCQlWYXJpYWJpbGl0eUVsZW1lbnQgdmUgPSAoVmFyaWFiaWxpdHlFbGVtZW50KSBpdDEubmV4dCgpOwotCQkJaWYgKHZlICE9IG51bGwpIHsKLQkJCQlpZiAodmUuZXF1YWxzKGUpKQotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJaWYgKCFVSUhlbHBlci5jaGVja0NpcmN1bGFyRGVsaXZlcmFibGVzKChEZWxpdmVyYWJsZSkgdmUsCi0JCQkJCQkoRGVsaXZlcmFibGUpIHdvcmtQcm9kdWN0KSkKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCi0JCX0KLQotCQkvKgotCQkgKiBDaGVjayB3b3JrUHJvZHVjdCBvYmplY3QgKGVkaXRvciBvYmplY3QpJ3MgdmFyaWFiaWxpdHkgYW5kIGl0cwotCQkgKiBkZWxpdmVyYWJsZXMgc2hvdWxkIG5vdCBjb250YWluIHBhc3NlZCBvYmplY3QuCi0JCSAqLwotCQlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWRlbGl2ZXJhYmxlUGFydHNWYXJpYWJpbGl0eSgoRGVsaXZlcmFibGUpIHdvcmtQcm9kdWN0LCBsaXN0KTsKLQkJaWYgKGxpc3QuY29udGFpbnMoZSkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJLyoKLQkJICogQ2hlY2sgcGFzc2VkIG9iamVjdCB2YXJpYWJpbGl0eSBhbmQgaXRzIGRlbGl2ZXJhYmxlcyBzaG91bGQgbm90Ci0JCSAqIGNvbnRhaW4gd29ya3Byb2R1Y3QoZGVsaXZlcmFibGUgb3IgZWRpdG9yIG9iamVjdCkuIElmIGl0IGNvbnRhaW5zLAotCQkgKiBwYXNzZWQgb2JqZWN0IHNob3VsZG5vdCBiZSBhY2NlcHRlZC4KLQkJICovCi0JCWRlbGl2ZXJhYmxlUGFydHNWYXJpYWJpbGl0eSgoRGVsaXZlcmFibGUpIGUsIGxpc3QpOwotCQlpZiAobGlzdC5jb250YWlucyh3b3JrUHJvZHVjdCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXByaXZhdGUgdm9pZCBkZWxpdmVyYWJsZVBhcnRzVmFyaWFiaWxpdHkoRGVsaXZlcmFibGUgZSwgTGlzdCByb290cykgewotCQlMaXN0IGxpc3QgPSAoKERlbGl2ZXJhYmxlKSBlKS5nZXREZWxpdmVyZWRXb3JrUHJvZHVjdHMoKTsKLQkJaWYgKGxpc3QgIT0gbnVsbCAmJiBsaXN0LnNpemUoKSA+IDApIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBsaXN0Lml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3Qgb2JqID0gaXRlcmF0b3IubmV4dCgpOwotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBEZWxpdmVyYWJsZSkgewotCQkJCQlpZiAoKChEZWxpdmVyYWJsZSkgb2JqKS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkgIT0gbnVsbCkgewotCQkJCQkJcm9vdHMuYWRkKCgoRGVsaXZlcmFibGUpIG9iaikKLQkJCQkJCQkJLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlJdGVyYXRvciBpdDEgPSBUbmdVdGlsLmdldEdlbmVyYWxpemVycyhlKTsKLQkJCQkJCXdoaWxlIChpdDEuaGFzTmV4dCgpKSB7Ci0JCQkJCQkJVmFyaWFiaWxpdHlFbGVtZW50IHZlID0gKFZhcmlhYmlsaXR5RWxlbWVudCkgaXQxCi0JCQkJCQkJCQkubmV4dCgpOwotCQkJCQkJCVVJSGVscGVyLmRlbGl2ZXJhYmxlUGFydHNDaGFpbigoRGVsaXZlcmFibGUpIHZlLCByb290cyk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJZGVsaXZlcmFibGVQYXJ0c1ZhcmlhYmlsaXR5KChEZWxpdmVyYWJsZSkgb2JqLCByb290cyk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmIChlIGluc3RhbmNlb2YgRGVsaXZlcmFibGUpIHsKLQkJCUl0ZXJhdG9yIGl0MSA9IFRuZ1V0aWwuZ2V0R2VuZXJhbGl6ZXJzKGUpOwotCQkJd2hpbGUgKGl0MS5oYXNOZXh0KCkpIHsKLQkJCQlWYXJpYWJpbGl0eUVsZW1lbnQgdmUgPSAoVmFyaWFiaWxpdHlFbGVtZW50KSBpdDEubmV4dCgpOwotCQkJCVVJSGVscGVyLmRlbGl2ZXJhYmxlUGFydHNDaGFpbigoRGVsaXZlcmFibGUpIHZlLCByb290cyk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0TXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbihpbnQpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRNdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uKGludCBjb3VudCkgewotCQlyZXR1cm4gc3VwZXIuZ2V0TXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbihjb3VudCwgQXV0aG9yaW5nVUlSZXNvdXJjZXMud29ya1Byb2R1Y3REZWxpdmVyYWJsZVBhcnRzUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uKTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0U2VjdGlvbkRlc2NyaXB0aW9uKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlY3Rpb25EZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLndvcmtQcm9kdWN0RGVsaXZlcmFibGVQYXJ0c1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldFNlY3Rpb25OYW1lKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlY3Rpb25OYW1lKCkgewotCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMud29ya1Byb2R1Y3REZWxpdmVyYWJsZVBhcnRzUGFnZV9zZWN0aW9uTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNnZXRTZWxlY3RlZExhYmVsKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlbGVjdGVkTGFiZWwoKSB7Ci0JCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy53b3JrUHJvZHVjdERlbGl2ZXJhYmxlUGFydHNQYWdlX3NlbGVjdGVkTGFiZWw7Ci0JfQotCQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL1dvcmtQcm9kdWN0RGVzY3JpcHRpb25QYWdlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL1dvcmtQcm9kdWN0RGVzY3JpcHRpb25QYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhZmM3OWUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9Xb3JrUHJvZHVjdERlc2NyaXB0aW9uUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAwMSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZGlhbG9ncy5JdGVtc0ZpbHRlckRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuTWV0aG9kRWxlbWVudEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZpbHRlcnMuQ29udGVudEZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZpbHRlcnMuV29ya1Byb2R1Y3RGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5yaWNodGV4dC5JTWV0aG9kUmljaFRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS51dGlsLlVJSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JQWN0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLkZpbHRlckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLlZhcmlhYmlsaXR5QmFzZUVsZW1lbnRGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BcnRpZmFjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFydGlmYWN0RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcmFibGVEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkZ1bGZpbGxhYmxlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk91dGNvbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkFzc29jaWF0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuRm9ybUVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLkZvcm1Ub29sa2l0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuU2VjdGlvbjsKLQotLyoqCi0gKiBUaGUgRGVzY3JpcHRpb24gcGFnZSBpbiBhIFdvcmsgUHJvZHVjdCAoQXJ0aWZhY3QsIERlbGl2ZXJhYmxlIGFuZCBPdXRjb21lKQotICogZWRpdG9yLgotICogCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBXb3JrUHJvZHVjdERlc2NyaXB0aW9uUGFnZSBleHRlbmRzIERlc2NyaXB0aW9uRm9ybVBhZ2UgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZPUk1fUEFHRV9JRCA9ICJ3b3JrUHJvZHVjdERlc2NyaXB0aW9uUGFnZSI7IC8vJE5PTi1OTFMtMSQJCi0KLQlwcml2YXRlIElNZXRob2RSaWNoVGV4dCBjdHJsX2ltcGFjdDsKLQotCXByaXZhdGUgSU1ldGhvZFJpY2hUZXh0IGN0cmxfcmVhc29uOwotCi0JLy8gRm9yIEFydGlmYWN0Ci0JcHJpdmF0ZSBJTWV0aG9kUmljaFRleHQgY3RybF9icmllZl9vdXRsaW5lOwotCi0JcHJpdmF0ZSBJTWV0aG9kUmljaFRleHQgY3RybF9yZXByZXNlbnRhdGlvbl9vcHRpb25zOwotCi0JLy8gRm9yIERlbGl2ZXJhYmxlCi0JcHJpdmF0ZSBJTWV0aG9kUmljaFRleHQgY3RybF9leHRlcm5hbF9kZXNjLCBjdHJsX3BhY2thZ2luZ19ndWlkYW5jZTsKLQotCXByaXZhdGUgSU1ldGhvZFJpY2hUZXh0IGN0cmxfcmVwcmVzZW50YXRpb247Ci0KLQlwcml2YXRlIElNZXRob2RSaWNoVGV4dCBjdHJsX25vdGF0aW9uOwotCi0JcHJpdmF0ZSBXb3JrUHJvZHVjdCB3b3JrUHJvZHVjdDsKLQotCS8vIEZvciBzbG90cwotCXByaXZhdGUgQnV0dG9uIGN0cmxfc2xvdF9idXR0b247Ci0JCi0JcHJpdmF0ZSBTZWN0aW9uIHNsb3RTZWN0aW9uOwotCQotCXByaXZhdGUgQ29tcG9zaXRlIHNsb3RDb21wb3NpdGU7Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgc2xvdFNlY3Rpb25EZXNjcmlwdGlvbjsKLQkKLQlwcml2YXRlIEJ1dHRvbiBhZGRTbG90QnV0dG9uLCByZW1vdmVTbG90QnV0dG9uOwotCQotCXByaXZhdGUgVGFibGUgY3RybF9zbG90OwotCQotCXByaXZhdGUgVGFibGVWaWV3ZXIgc2xvdFZpZXdlcjsKLQotCS8vIHNsb3RzIGNvbnRlbnQgcHJvdmlkZXIKLQlwcml2YXRlIElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyIHNsb3RDb250ZW50UHJvdmlkZXIgPSBuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoCi0JCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpIHsKLQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBvYmplY3QpIHsKLQkJCUxpc3Q8RnVsZmlsbGFibGVFbGVtZW50PiBsaXN0ID0gbmV3IEFycmF5TGlzdDxGdWxmaWxsYWJsZUVsZW1lbnQ+KCk7Ci0JCQlsaXN0LmFkZEFsbCh3b3JrUHJvZHVjdC5nZXRGdWxmaWxscygpKTsKLQkJCXJldHVybiBsaXN0LnRvQXJyYXkoKTsKLQkJfQotCX07Ci0JCi0JcHJvdGVjdGVkIElMYWJlbFByb3ZpZGVyIHNsb3RMYWJlbFByb3ZpZGVyID0gbmV3IEFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcigKLQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCS5nZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSkgewotCQlwdWJsaWMgU3RyaW5nIGdldENvbHVtblRleHQoT2JqZWN0IG9iamVjdCwgaW50IGNvbHVtbkluZGV4KSB7Ci0JCQlyZXR1cm4gVG5nVXRpbC5nZXRMYWJlbFdpdGhQYXRoKG9iamVjdCk7Ci0JCX0KLQl9OwotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFdvcmtQcm9kdWN0RGVzY3JpcHRpb25QYWdlKEZvcm1FZGl0b3IgZWRpdG9yKSB7Ci0JCXN1cGVyKGVkaXRvciwgRk9STV9QQUdFX0lELCBBdXRob3JpbmdVSVRleHQuREVTQ1JJUFRJT05fUEFHRV9USVRMRSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjaW5pdChvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZSwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElFZGl0b3JTaXRlIHNpdGUsIElFZGl0b3JJbnB1dCBpbnB1dCkgewotCQlzdXBlci5pbml0KHNpdGUsIGlucHV0KTsKLQkJd29ya1Byb2R1Y3QgPSAoV29ya1Byb2R1Y3QpIGNvbnRlbnRFbGVtZW50OwotCQlwdXJwb3NlT24gPSB0cnVlOwotCQlleHRlcm5hbElkT24gPSB0cnVlOwotCQlpZiAoIShjb250ZW50RWxlbWVudCBpbnN0YW5jZW9mIE91dGNvbWUpKSB7Ci0JCQlub3RhdGlvblNlY3Rpb25PbiA9IHRydWU7Ci0JCX0KLQkJdGFpbG9yaW5nU2VjdGlvbk9uID0gdHJ1ZTsKLQkJaWNvblNlY3Rpb25PbiA9IHRydWU7Ci0JCXNsb3RTZWN0aW9uT24gPSB0cnVlOwotCQlzZXRMb25nUHJlc2VudGF0aW9uTmFtZU9uKHRydWUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2NyZWF0ZU5vdGF0aW9uU2VjdGlvbkNvbnRlbnQoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZU5vdGF0aW9uU2VjdGlvbkNvbnRlbnQoKSB7Ci0JCXN1cGVyLmNyZWF0ZU5vdGF0aW9uU2VjdGlvbkNvbnRlbnQoKTsKLQotCQlpZiAod29ya1Byb2R1Y3QgaW5zdGFuY2VvZiBBcnRpZmFjdCkgewotCQkJY3RybF9icmllZl9vdXRsaW5lID0gY3JlYXRlUmljaFRleHRFZGl0V2l0aExpbmtGb3JTZWN0aW9uKHRvb2xraXQsCi0JCQkJCW5vdGF0aW9uQ29tcG9zaXRlLCBBdXRob3JpbmdVSVRleHQuQlJJRUZfT1VUTElORV9URVhULCA0MCwKLQkJCQkJNDAwLCBOT1RBVElPTl9TRUNUSU9OX0lEKTsKLQkJCWN0cmxfcmVwcmVzZW50YXRpb24gPSBjcmVhdGVSaWNoVGV4dEVkaXRXaXRoTGlua0ZvclNlY3Rpb24odG9vbGtpdCwKLQkJCQkJbm90YXRpb25Db21wb3NpdGUsIEF1dGhvcmluZ1VJVGV4dC5SRVBSRVNFTlRBVElPTl9URVhULCA0MCwKLQkJCQkJNDAwLCBOT1RBVElPTl9TRUNUSU9OX0lEKTsKLQkJCWN0cmxfbm90YXRpb24gPSBjcmVhdGVSaWNoVGV4dEVkaXRXaXRoTGlua0ZvclNlY3Rpb24odG9vbGtpdCwKLQkJCQkJbm90YXRpb25Db21wb3NpdGUsIEF1dGhvcmluZ1VJVGV4dC5OT1RBVElPTl9URVhULCA0MCwgNDAwLAotCQkJCQlOT1RBVElPTl9TRUNUSU9OX0lEKTsKLQkJfSBlbHNlIGlmICh3b3JrUHJvZHVjdCBpbnN0YW5jZW9mIERlbGl2ZXJhYmxlKSB7Ci0JCQljdHJsX2V4dGVybmFsX2Rlc2MgPSBjcmVhdGVSaWNoVGV4dEVkaXRXaXRoTGlua0ZvclNlY3Rpb24odG9vbGtpdCwKLQkJCQkJbm90YXRpb25Db21wb3NpdGUsCi0JCQkJCUF1dGhvcmluZ1VJVGV4dC5FWFRFUk5BTF9ERVNDUklQVElPTl9URVhULCA0MCwgNDAwLAotCQkJCQlOT1RBVElPTl9TRUNUSU9OX0lEKTsKLQkJCWN0cmxfcGFja2FnaW5nX2d1aWRhbmNlID0gY3JlYXRlUmljaFRleHRFZGl0V2l0aExpbmtGb3JTZWN0aW9uKAotCQkJCQl0b29sa2l0LCBub3RhdGlvbkNvbXBvc2l0ZSwKLQkJCQkJQXV0aG9yaW5nVUlUZXh0LlBBQ0tBR0lOR19HVUlEQU5DRV9URVhULCA0MCwgNDAwLAotCQkJCQlOT1RBVElPTl9TRUNUSU9OX0lEKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2NyZWF0ZVRhaWxvcmluZ1NlY3Rpb25Db250ZW50KCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVUYWlsb3JpbmdTZWN0aW9uQ29udGVudCgpIHsKLQkJc3VwZXIuY3JlYXRlVGFpbG9yaW5nU2VjdGlvbkNvbnRlbnQoKTsKLQkJY3RybF9pbXBhY3QgPSBjcmVhdGVSaWNoVGV4dEVkaXRXaXRoTGlua0ZvclNlY3Rpb24odG9vbGtpdCwKLQkJCQl0YWlsb3JpbmdDb21wb3NpdGUsIEF1dGhvcmluZ1VJVGV4dC5JTVBBQ1RfT0ZfTk9UX0hBVklOR19URVhULAotCQkJCTQwLCA0MDAsIFRBSUxPUklOR19TRUNUSU9OX0lEKTsKLQkJY3RybF9yZWFzb24gPSBjcmVhdGVSaWNoVGV4dEVkaXRXaXRoTGlua0ZvclNlY3Rpb24odG9vbGtpdCwKLQkJCQl0YWlsb3JpbmdDb21wb3NpdGUsCi0JCQkJQXV0aG9yaW5nVUlUZXh0LlJFQVNPTl9GT1JfTk9UX05FRURJTkdfVEVYVCwgNDAsIDQwMCwKLQkJCQlUQUlMT1JJTkdfU0VDVElPTl9JRCk7Ci0JCWlmICh3b3JrUHJvZHVjdCBpbnN0YW5jZW9mIEFydGlmYWN0KSB7Ci0JCQljdHJsX3JlcHJlc2VudGF0aW9uX29wdGlvbnMgPSBjcmVhdGVSaWNoVGV4dEVkaXRXaXRoTGlua0ZvclNlY3Rpb24oCi0JCQkJCXRvb2xraXQsIHRhaWxvcmluZ0NvbXBvc2l0ZSwKLQkJCQkJQXV0aG9yaW5nVUlUZXh0LlJFUFJFU0VOVEFUSU9OX09QVElPTlNfVEVYVCwgNDAsIDQwMCwKLQkJCQkJTk9UQVRJT05fU0VDVElPTl9JRCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVFZGl0b3JDb250ZW50KEZvcm1Ub29sa2l0IHRvb2xraXQpIHsKLQkJc3VwZXIuY3JlYXRlRWRpdG9yQ29udGVudCh0b29sa2l0KTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgc2xvdCBzZWN0aW9uCi0JICogCi0JICogQHBhcmFtIHRvb2xraXQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVTbG90U2VjdGlvbihGb3JtVG9vbGtpdCB0b29sa2l0KSB7Ci0KLQkJc2xvdFNlY3Rpb24gPSBjcmVhdGVTZWN0aW9uKHRvb2xraXQsIHNlY3Rpb25Db21wb3NpdGUsCi0JCQkJQXV0aG9yaW5nVUlUZXh0LlNMT1RfU0VDVElPTl9OQU1FLCB0aGlzLnNsb3RTZWN0aW9uRGVzY3JpcHRpb24pOwotCQlzbG90Q29tcG9zaXRlID0gY3JlYXRlQ29tcG9zaXRlKHRvb2xraXQsIHNsb3RTZWN0aW9uKTsKLQkJc2xvdENvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJc2xvdENvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoNSwgZmFsc2UpKTsKLQkJY3JlYXRlU2xvdFNlY3Rpb25Db250ZW50KCk7Ci0JCXRvb2xraXQucGFpbnRCb3JkZXJzRm9yKHNsb3RDb21wb3NpdGUpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgdm9pZCBjcmVhdGVTbG90U2VjdGlvbkNvbnRlbnQoKSB7Ci0JCQotCQljdHJsX3Nsb3RfYnV0dG9uID0gdG9vbGtpdC5jcmVhdGVCdXR0b24oc2xvdENvbXBvc2l0ZSwKLQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy53b3JrcHJvZHVjdERlc2NyaXB0aW9uUGFnZV9zbG90X3RleHQsCi0JCQkJU1dULkNIRUNLKTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlkYXRhLmhvcml6b250YWxTcGFuID0gNTsKLQkJY3RybF9zbG90X2J1dHRvbi5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQkKLQkJY3JlYXRlTGFiZWwodG9vbGtpdCwgc2xvdENvbXBvc2l0ZSwKLQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5zbG90c0xhYmVsX3RleHQsIDIpOwotCQljdHJsX3Nsb3QgPSBjcmVhdGVUYWJsZSh0b29sa2l0LCBzbG90Q29tcG9zaXRlLCBTV1QuTVVMVEkKLQkJCQl8IFNXVC5SRUFEX09OTFksIEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCB8IEdyaWREYXRhLkJFR0lOTklORywKLQkJCQk1LCAzMDAsIDEsIDIpOwotCQl7Ci0JCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwKLQkJCQkJfCBHcmlkRGF0YS5CRUdJTk5JTkcpOwotCQkJZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQkJZ3JpZERhdGEuaGVpZ2h0SGludCA9IDMwOwotCQkJZ3JpZERhdGEud2lkdGhIaW50ID0gMzAwOwotCQkJY3RybF9zbG90LnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQl9Ci0KLQkJc2xvdFZpZXdlciA9IG5ldyBUYWJsZVZpZXdlcihjdHJsX3Nsb3QpOwotCQlzbG90Vmlld2VyLnNldENvbnRlbnRQcm92aWRlcihzbG90Q29udGVudFByb3ZpZGVyKTsKLQkJc2xvdFZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKHNsb3RMYWJlbFByb3ZpZGVyKTsKLQkJc2xvdFZpZXdlci5zZXRJbnB1dChtZXRob2RFbGVtZW50KTsKLQotCQlDb21wb3NpdGUgYnV0dG9uUGFuZSA9IGNyZWF0ZUNvbXBvc2l0ZSh0b29sa2l0LCBzbG90Q29tcG9zaXRlLAotCQkJCUdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRU5ELCAxLCAxLCAxKTsKLQkJewotCQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9FTkQpOwotCQkJYnV0dG9uUGFuZS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJfQotCi0JCWFkZFNsb3RCdXR0b24gPSB0b29sa2l0LmNyZWF0ZUJ1dHRvbihidXR0b25QYW5lLAotCQkJCUF1dGhvcmluZ1VJVGV4dC5BRERfQlVUVE9OX1RFWFQsIFNXVC5TSU1QTEUpOwotCQl7Ci0JCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQkJZ3JpZERhdGEud2lkdGhIaW50ID0gQlVUVE9OX1dJRFRIOwotCQkJYWRkU2xvdEJ1dHRvbi5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJfQotCQkKLQkJcmVtb3ZlU2xvdEJ1dHRvbiA9IHRvb2xraXQuY3JlYXRlQnV0dG9uKGJ1dHRvblBhbmUsCi0JCQkJQXV0aG9yaW5nVUlUZXh0LlJFTU9WRV9CVVRUT05fVEVYVCwgU1dULlNJTVBMRSk7Ci0JCXsKLQkJCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCQlncmlkRGF0YS53aWR0aEhpbnQgPSBCVVRUT05fV0lEVEg7Ci0JCQlyZW1vdmVTbG90QnV0dG9uLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQl9Ci0JCXJlbW92ZVNsb3RCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjYWRkTGlzdGVuZXJzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRMaXN0ZW5lcnMoKSB7Ci0JCWZpbmFsIElBY3Rpb25NYW5hZ2VyIGFjdGlvbk1nciA9ICgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpCi0JCQkJLmdldEFjdGlvbk1hbmFnZXIoKTsKLQotCQlzdXBlci5hZGRMaXN0ZW5lcnMoKTsKLQotCQkvLyBhZGQgYWxsIHNsb3QgcmVsYXRlZCBsaXN0ZW5lcnMKLQkJCi0JCWlmIChzbG90U2VjdGlvbk9uKSB7Ci0JCQlhZGRTbG90TGlzdGVuZXJzKCk7Ci0JCX0KLQkJCi0JCQotCQlpZiAocHVycG9zZU9uKSB7Ci0JCQljdHJsX3B1cnBvc2Uuc2V0TW9kYWxPYmplY3QoY29udGVudEVsZW1lbnQuZ2V0UHJlc2VudGF0aW9uKCkpOwotCQkJY3RybF9wdXJwb3NlLnNldE1vZGFsT2JqZWN0RmVhdHVyZShVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkuZ2V0V29ya1Byb2R1Y3REZXNjcmlwdGlvbl9QdXJwb3NlKCkpOwotCQkJY3RybF9wdXJwb3NlLmFkZE1vZGlmeUxpc3RlbmVyKGNvbnRlbnRNb2RpZnlMaXN0ZW5lcik7Ci0JCQljdHJsX3B1cnBvc2UuYWRkTGlzdGVuZXIoU1dULkRlYWN0aXZhdGUsIG5ldyBMaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJCUlNZXRob2RSaWNoVGV4dCBjb250cm9sID0gZGVzY0V4cGFuZEZsYWcgPyBjdHJsX2V4cGFuZGVkCi0JCQkJCQkJOiBjdHJsX3B1cnBvc2U7Ci0JCQkJCWlmICghY29udHJvbC5nZXRNb2RpZmllZCgpKSB7Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCX0KLQkJCQkJU3RyaW5nIG9sZENvbnRlbnQgPSAoKG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdGlvbikgd29ya1Byb2R1Y3QKLQkJCQkJCQkuZ2V0UHJlc2VudGF0aW9uKCkpLmdldFB1cnBvc2UoKTsKLQkJCQkJaWYgKCgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpLm11c3RSZXN0b3JlVmFsdWUoCi0JCQkJCQkJY29udHJvbCwgb2xkQ29udGVudCkpIHsKLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCQlTdHJpbmcgbmV3Q29udGVudCA9IGNvbnRyb2wuZ2V0VGV4dCgpOwotCQkJCQlpZiAoIW5ld0NvbnRlbnQuZXF1YWxzKG9sZENvbnRlbnQpKSB7Ci0JCQkJCQlib29sZWFuIHN1Y2Nlc3MgPSBhY3Rpb25NZ3IuZG9BY3Rpb24oCi0JCQkJCQkJCUlBY3Rpb25NYW5hZ2VyLlNFVCwgY29udGVudEVsZW1lbnQKLQkJCQkJCQkJCQkuZ2V0UHJlc2VudGF0aW9uKCksCi0JCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJLmdldFdvcmtQcm9kdWN0RGVzY3JpcHRpb25fUHVycG9zZSgpLAotCQkJCQkJCQluZXdDb250ZW50LCAtMSk7Ci0JCQkJCQlpZiAoc3VjY2VzcyAmJiBpc1ZlcnNpb25TZWN0aW9uT24oKSkgewotCQkJCQkJCXVwZGF0ZUNoYW5nZURhdGUoKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0pOwotCQl9Ci0KLQotCQlpZiAodGFpbG9yaW5nU2VjdGlvbk9uKSB7Ci0JCQljdHJsX2ltcGFjdC5zZXRNb2RhbE9iamVjdChjb250ZW50RWxlbWVudC5nZXRQcmVzZW50YXRpb24oKSk7Ci0JCQljdHJsX2ltcGFjdC5zZXRNb2RhbE9iamVjdEZlYXR1cmUoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJLmdldFdvcmtQcm9kdWN0RGVzY3JpcHRpb25fSW1wYWN0T2ZOb3RIYXZpbmcoKSk7Ci0JCQljdHJsX2ltcGFjdC5hZGRNb2RpZnlMaXN0ZW5lcihjb250ZW50TW9kaWZ5TGlzdGVuZXIpOwotCQkJY3RybF9pbXBhY3QuYWRkTGlzdGVuZXIoU1dULkRlYWN0aXZhdGUsIG5ldyBMaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJCUlNZXRob2RSaWNoVGV4dCBjb250cm9sID0gZGVzY0V4cGFuZEZsYWcgPyBjdHJsX2V4cGFuZGVkCi0JCQkJCQkJOiBjdHJsX2ltcGFjdDsKLQkJCQkJaWYgKCFjb250cm9sLmdldE1vZGlmaWVkKCkpIHsKLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCQlTdHJpbmcgb2xkQ29udGVudCA9ICgob3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0aW9uKSB3b3JrUHJvZHVjdAotCQkJCQkJCS5nZXRQcmVzZW50YXRpb24oKSkuZ2V0SW1wYWN0T2ZOb3RIYXZpbmcoKTsKLQkJCQkJaWYgKCgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpLm11c3RSZXN0b3JlVmFsdWUoCi0JCQkJCQkJY29udHJvbCwgb2xkQ29udGVudCkpIHsKLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCQlTdHJpbmcgbmV3Q29udGVudCA9IGNvbnRyb2wuZ2V0VGV4dCgpOwotCQkJCQlpZiAoIW5ld0NvbnRlbnQuZXF1YWxzKG9sZENvbnRlbnQpKSB7Ci0JCQkJCQlib29sZWFuIHN1Y2Nlc3MgPSBhY3Rpb25NZ3IKLQkJCQkJCQkJLmRvQWN0aW9uKAotCQkJCQkJCQkJCUlBY3Rpb25NYW5hZ2VyLlNFVCwKLQkJCQkJCQkJCQljb250ZW50RWxlbWVudC5nZXRQcmVzZW50YXRpb24oKSwKLQkJCQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJCQkJLmdldFdvcmtQcm9kdWN0RGVzY3JpcHRpb25fSW1wYWN0T2ZOb3RIYXZpbmcoKSwKLQkJCQkJCQkJCQluZXdDb250ZW50LCAtMSk7Ci0JCQkJCQlpZiAoc3VjY2VzcyAmJiBpc1ZlcnNpb25TZWN0aW9uT24oKSkgewotCQkJCQkJCXVwZGF0ZUNoYW5nZURhdGUoKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0pOwotCi0JCQljdHJsX3JlYXNvbi5zZXRNb2RhbE9iamVjdChjb250ZW50RWxlbWVudC5nZXRQcmVzZW50YXRpb24oKSk7Ci0JCQljdHJsX3JlYXNvbi5zZXRNb2RhbE9iamVjdEZlYXR1cmUoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJLmdldFdvcmtQcm9kdWN0RGVzY3JpcHRpb25fUmVhc29uc0Zvck5vdE5lZWRpbmcoKSk7Ci0JCQljdHJsX3JlYXNvbi5hZGRNb2RpZnlMaXN0ZW5lcihjb250ZW50TW9kaWZ5TGlzdGVuZXIpOwotCQkJY3RybF9yZWFzb24uYWRkTGlzdGVuZXIoU1dULkRlYWN0aXZhdGUsIG5ldyBMaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJCUlNZXRob2RSaWNoVGV4dCBjb250cm9sID0gZGVzY0V4cGFuZEZsYWcgPyBjdHJsX2V4cGFuZGVkCi0JCQkJCQkJOiBjdHJsX3JlYXNvbjsKLQkJCQkJaWYgKCFjb250cm9sLmdldE1vZGlmaWVkKCkpIHsKLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCQlTdHJpbmcgb2xkQ29udGVudCA9ICgob3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0aW9uKSB3b3JrUHJvZHVjdAotCQkJCQkJCS5nZXRQcmVzZW50YXRpb24oKSkuZ2V0UmVhc29uc0Zvck5vdE5lZWRpbmcoKTsKLQkJCQkJaWYgKCgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpLm11c3RSZXN0b3JlVmFsdWUoCi0JCQkJCQkJY29udHJvbCwgb2xkQ29udGVudCkpIHsKLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCQlTdHJpbmcgbmV3Q29udGVudCA9IGNvbnRyb2wuZ2V0VGV4dCgpOwotCQkJCQlpZiAoIW5ld0NvbnRlbnQuZXF1YWxzKG9sZENvbnRlbnQpKSB7Ci0JCQkJCQlib29sZWFuIHN1Y2Nlc3MgPSBhY3Rpb25NZ3IKLQkJCQkJCQkJLmRvQWN0aW9uKAotCQkJCQkJCQkJCUlBY3Rpb25NYW5hZ2VyLlNFVCwKLQkJCQkJCQkJCQljb250ZW50RWxlbWVudC5nZXRQcmVzZW50YXRpb24oKSwKLQkJCQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJCQkJLmdldFdvcmtQcm9kdWN0RGVzY3JpcHRpb25fUmVhc29uc0Zvck5vdE5lZWRpbmcoKSwKLQkJCQkJCQkJCQluZXdDb250ZW50LCAtMSk7Ci0JCQkJCQlpZiAoc3VjY2VzcyAmJiBpc1ZlcnNpb25TZWN0aW9uT24oKSkgewotCQkJCQkJCXVwZGF0ZUNoYW5nZURhdGUoKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0pOwotCi0JCQlpZiAod29ya1Byb2R1Y3QgaW5zdGFuY2VvZiBBcnRpZmFjdCkgewotCQkJCWN0cmxfcmVwcmVzZW50YXRpb25fb3B0aW9ucy5zZXRNb2RhbE9iamVjdChjb250ZW50RWxlbWVudAotCQkJCQkJLmdldFByZXNlbnRhdGlvbigpKTsKLQkJCQljdHJsX3JlcHJlc2VudGF0aW9uX29wdGlvbnMKLQkJCQkJCS5zZXRNb2RhbE9iamVjdEZlYXR1cmUoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJLmdldEFydGlmYWN0RGVzY3JpcHRpb25fUmVwcmVzZW50YXRpb25PcHRpb25zKCkpOwotCQkJCWN0cmxfcmVwcmVzZW50YXRpb25fb3B0aW9ucwotCQkJCQkJLmFkZE1vZGlmeUxpc3RlbmVyKGNvbnRlbnRNb2RpZnlMaXN0ZW5lcik7Ci0JCQkJY3RybF9yZXByZXNlbnRhdGlvbl9vcHRpb25zLmFkZExpc3RlbmVyKFNXVC5EZWFjdGl2YXRlLAotCQkJCQkJbmV3IExpc3RlbmVyKCkgewotCQkJCQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQkJCQkJSU1ldGhvZFJpY2hUZXh0IGNvbnRyb2wgPSBkZXNjRXhwYW5kRmxhZyA/IGN0cmxfZXhwYW5kZWQKLQkJCQkJCQkJCQk6IGN0cmxfcmVwcmVzZW50YXRpb25fb3B0aW9uczsKLQkJCQkJCQkJaWYgKCFjb250cm9sLmdldE1vZGlmaWVkKCkpIHsKLQkJCQkJCQkJCXJldHVybjsKLQkJCQkJCQkJfQotCQkJCQkJCQlTdHJpbmcgb2xkQ29udGVudCA9ICgob3JnLmVjbGlwc2UuZXBmLnVtYS5BcnRpZmFjdERlc2NyaXB0aW9uKSB3b3JrUHJvZHVjdAotCQkJCQkJCQkJCS5nZXRQcmVzZW50YXRpb24oKSkKLQkJCQkJCQkJCQkuZ2V0UmVwcmVzZW50YXRpb25PcHRpb25zKCk7Ci0JCQkJCQkJCWlmICgoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpKQotCQkJCQkJCQkJCS5tdXN0UmVzdG9yZVZhbHVlKGNvbnRyb2wsIG9sZENvbnRlbnQpKSB7Ci0JCQkJCQkJCQlyZXR1cm47Ci0JCQkJCQkJCX0KLQkJCQkJCQkJU3RyaW5nIG5ld0NvbnRlbnQgPSBjb250cm9sLmdldFRleHQoKTsKLQkJCQkJCQkJaWYgKCFuZXdDb250ZW50LmVxdWFscyhvbGRDb250ZW50KSkgewotCQkJCQkJCQkJYm9vbGVhbiBzdWNjZXNzID0gYWN0aW9uTWdyCi0JCQkJCQkJCQkJCS5kb0FjdGlvbigKLQkJCQkJCQkJCQkJCQlJQWN0aW9uTWFuYWdlci5TRVQsCi0JCQkJCQkJCQkJCQkJY29udGVudEVsZW1lbnQKLQkJCQkJCQkJCQkJCQkJCS5nZXRQcmVzZW50YXRpb24oKSwKLQkJCQkJCQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJCQkJCQkJLmdldEFydGlmYWN0RGVzY3JpcHRpb25fUmVwcmVzZW50YXRpb25PcHRpb25zKCksCi0JCQkJCQkJCQkJCQkJbmV3Q29udGVudCwgLTEpOwotCQkJCQkJCQkJaWYgKHN1Y2Nlc3MgJiYgaXNWZXJzaW9uU2VjdGlvbk9uKCkpIHsKLQkJCQkJCQkJCQl1cGRhdGVDaGFuZ2VEYXRlKCk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9KTsKLQkJCX0KLQkJfQotCi0JCWlmIChub3RhdGlvblNlY3Rpb25PbikgewotCQkJaWYgKHdvcmtQcm9kdWN0IGluc3RhbmNlb2YgQXJ0aWZhY3QpIHsKLQkJCQljdHJsX2JyaWVmX291dGxpbmUuc2V0TW9kYWxPYmplY3QoY29udGVudEVsZW1lbnQKLQkJCQkJCS5nZXRQcmVzZW50YXRpb24oKSk7Ci0JCQkJY3RybF9icmllZl9vdXRsaW5lLnNldE1vZGFsT2JqZWN0RmVhdHVyZShVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJLmdldEFydGlmYWN0RGVzY3JpcHRpb25fQnJpZWZPdXRsaW5lKCkpOwotCQkJCWN0cmxfYnJpZWZfb3V0bGluZS5hZGRNb2RpZnlMaXN0ZW5lcihjb250ZW50TW9kaWZ5TGlzdGVuZXIpOwotCQkJCWN0cmxfYnJpZWZfb3V0bGluZS5hZGRMaXN0ZW5lcihTV1QuRGVhY3RpdmF0ZSwgbmV3IExpc3RlbmVyKCkgewotCQkJCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJCQlJTWV0aG9kUmljaFRleHQgY29udHJvbCA9IGRlc2NFeHBhbmRGbGFnID8gY3RybF9leHBhbmRlZAotCQkJCQkJCQk6IGN0cmxfYnJpZWZfb3V0bGluZTsKLQkJCQkJCWlmICghY29udHJvbC5nZXRNb2RpZmllZCgpKSB7Ci0JCQkJCQkJcmV0dXJuOwotCQkJCQkJfQotCQkJCQkJU3RyaW5nIG9sZENvbnRlbnQgPSAoKG9yZy5lY2xpcHNlLmVwZi51bWEuQXJ0aWZhY3REZXNjcmlwdGlvbikgd29ya1Byb2R1Y3QKLQkJCQkJCQkJLmdldFByZXNlbnRhdGlvbigpKS5nZXRCcmllZk91dGxpbmUoKTsKLQkJCQkJCWlmICgoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpKQotCQkJCQkJCQkubXVzdFJlc3RvcmVWYWx1ZShjb250cm9sLCBvbGRDb250ZW50KSkgewotCQkJCQkJCXJldHVybjsKLQkJCQkJCX0KLQkJCQkJCVN0cmluZyBuZXdDb250ZW50ID0gZGVzY0V4cGFuZEZsYWcgPyBjdHJsX2V4cGFuZGVkCi0JCQkJCQkJCS5nZXRUZXh0KCkgOiBjdHJsX2JyaWVmX291dGxpbmUuZ2V0VGV4dCgpOwotCQkJCQkJaWYgKCFuZXdDb250ZW50LmVxdWFscyhvbGRDb250ZW50KSkgewotCQkJCQkJCWJvb2xlYW4gc3VjY2VzcyA9IGFjdGlvbk1ncgotCQkJCQkJCQkJLmRvQWN0aW9uKAotCQkJCQkJCQkJCQlJQWN0aW9uTWFuYWdlci5TRVQsCi0JCQkJCQkJCQkJCWNvbnRlbnRFbGVtZW50LmdldFByZXNlbnRhdGlvbigpLAotCQkJCQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJCQkJCS5nZXRBcnRpZmFjdERlc2NyaXB0aW9uX0JyaWVmT3V0bGluZSgpLAotCQkJCQkJCQkJCQluZXdDb250ZW50LCAtMSk7Ci0JCQkJCQkJaWYgKHN1Y2Nlc3MgJiYgaXNWZXJzaW9uU2VjdGlvbk9uKCkpIHsKLQkJCQkJCQkJdXBkYXRlQ2hhbmdlRGF0ZSgpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0pOwotCi0JCQkJY3RybF9yZXByZXNlbnRhdGlvbi5zZXRNb2RhbE9iamVjdChjb250ZW50RWxlbWVudAotCQkJCQkJLmdldFByZXNlbnRhdGlvbigpKTsKLQkJCQljdHJsX3JlcHJlc2VudGF0aW9uLnNldE1vZGFsT2JqZWN0RmVhdHVyZShVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJLmdldEFydGlmYWN0RGVzY3JpcHRpb25fUmVwcmVzZW50YXRpb24oKSk7Ci0JCQkJY3RybF9yZXByZXNlbnRhdGlvbi5hZGRNb2RpZnlMaXN0ZW5lcihjb250ZW50TW9kaWZ5TGlzdGVuZXIpOwotCQkJCWN0cmxfcmVwcmVzZW50YXRpb24uYWRkTGlzdGVuZXIoU1dULkRlYWN0aXZhdGUsIG5ldyBMaXN0ZW5lcigpIHsKLQkJCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCQkJSU1ldGhvZFJpY2hUZXh0IGNvbnRyb2wgPSBkZXNjRXhwYW5kRmxhZyA/IGN0cmxfZXhwYW5kZWQKLQkJCQkJCQkJOiBjdHJsX3JlcHJlc2VudGF0aW9uOwotCQkJCQkJaWYgKCFjb250cm9sLmdldE1vZGlmaWVkKCkpIHsKLQkJCQkJCQlyZXR1cm47Ci0JCQkJCQl9Ci0JCQkJCQlTdHJpbmcgb2xkQ29udGVudCA9ICgob3JnLmVjbGlwc2UuZXBmLnVtYS5BcnRpZmFjdERlc2NyaXB0aW9uKSB3b3JrUHJvZHVjdAotCQkJCQkJCQkuZ2V0UHJlc2VudGF0aW9uKCkpLmdldFJlcHJlc2VudGF0aW9uKCk7Ci0JCQkJCQlpZiAoKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkKLQkJCQkJCQkJLm11c3RSZXN0b3JlVmFsdWUoY29udHJvbCwgb2xkQ29udGVudCkpIHsKLQkJCQkJCQlyZXR1cm47Ci0JCQkJCQl9Ci0JCQkJCQlTdHJpbmcgbmV3Q29udGVudCA9IGRlc2NFeHBhbmRGbGFnID8gY3RybF9leHBhbmRlZAotCQkJCQkJCQkuZ2V0VGV4dCgpIDogY3RybF9yZXByZXNlbnRhdGlvbi5nZXRUZXh0KCk7Ci0JCQkJCQlpZiAoIW5ld0NvbnRlbnQuZXF1YWxzKG9sZENvbnRlbnQpKSB7Ci0JCQkJCQkJYm9vbGVhbiBzdWNjZXNzID0gYWN0aW9uTWdyCi0JCQkJCQkJCQkuZG9BY3Rpb24oCi0JCQkJCQkJCQkJCUlBY3Rpb25NYW5hZ2VyLlNFVCwKLQkJCQkJCQkJCQkJY29udGVudEVsZW1lbnQuZ2V0UHJlc2VudGF0aW9uKCksCi0JCQkJCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJCQkJLmdldEFydGlmYWN0RGVzY3JpcHRpb25fUmVwcmVzZW50YXRpb24oKSwKLQkJCQkJCQkJCQkJbmV3Q29udGVudCwgLTEpOwotCQkJCQkJCWlmIChzdWNjZXNzICYmIGlzVmVyc2lvblNlY3Rpb25PbigpKSB7Ci0JCQkJCQkJCXVwZGF0ZUNoYW5nZURhdGUoKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9KTsKLQotCQkJCWN0cmxfbm90YXRpb24uc2V0TW9kYWxPYmplY3QoY29udGVudEVsZW1lbnQuZ2V0UHJlc2VudGF0aW9uKCkpOwotCQkJCWN0cmxfbm90YXRpb24uc2V0TW9kYWxPYmplY3RGZWF0dXJlKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkuZ2V0QXJ0aWZhY3REZXNjcmlwdGlvbl9Ob3RhdGlvbigpKTsKLQkJCQljdHJsX25vdGF0aW9uLmFkZE1vZGlmeUxpc3RlbmVyKGNvbnRlbnRNb2RpZnlMaXN0ZW5lcik7Ci0JCQkJY3RybF9ub3RhdGlvbi5hZGRMaXN0ZW5lcihTV1QuRGVhY3RpdmF0ZSwgbmV3IExpc3RlbmVyKCkgewotCQkJCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJCQlJTWV0aG9kUmljaFRleHQgY29udHJvbCA9IGRlc2NFeHBhbmRGbGFnID8gY3RybF9leHBhbmRlZAotCQkJCQkJCQk6IGN0cmxfbm90YXRpb247Ci0JCQkJCQlpZiAoIWNvbnRyb2wuZ2V0TW9kaWZpZWQoKSkgewotCQkJCQkJCXJldHVybjsKLQkJCQkJCX0KLQkJCQkJCVN0cmluZyBvbGRDb250ZW50ID0gKChvcmcuZWNsaXBzZS5lcGYudW1hLkFydGlmYWN0RGVzY3JpcHRpb24pIHdvcmtQcm9kdWN0Ci0JCQkJCQkJCS5nZXRQcmVzZW50YXRpb24oKSkuZ2V0Tm90YXRpb24oKTsKLQkJCQkJCWlmICgoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpKQotCQkJCQkJCQkubXVzdFJlc3RvcmVWYWx1ZShjb250cm9sLCBvbGRDb250ZW50KSkgewotCQkJCQkJCXJldHVybjsKLQkJCQkJCX0KLQkJCQkJCVN0cmluZyBuZXdDb250ZW50ID0gZGVzY0V4cGFuZEZsYWcgPyBjdHJsX2V4cGFuZGVkCi0JCQkJCQkJCS5nZXRUZXh0KCkgOiBjdHJsX25vdGF0aW9uLmdldFRleHQoKTsKLQkJCQkJCWlmICghbmV3Q29udGVudC5lcXVhbHMob2xkQ29udGVudCkpIHsKLQkJCQkJCQlib29sZWFuIHN1Y2Nlc3MgPSBhY3Rpb25NZ3IuZG9BY3Rpb24oCi0JCQkJCQkJCQlJQWN0aW9uTWFuYWdlci5TRVQsIGNvbnRlbnRFbGVtZW50Ci0JCQkJCQkJCQkJCS5nZXRQcmVzZW50YXRpb24oKSwKLQkJCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJCS5nZXRBcnRpZmFjdERlc2NyaXB0aW9uX05vdGF0aW9uKCksCi0JCQkJCQkJCQluZXdDb250ZW50LCAtMSk7Ci0JCQkJCQkJaWYgKHN1Y2Nlc3MgJiYgaXNWZXJzaW9uU2VjdGlvbk9uKCkpIHsKLQkJCQkJCQkJdXBkYXRlQ2hhbmdlRGF0ZSgpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0pOwotCQkJfQotCi0JCQlpZiAod29ya1Byb2R1Y3QgaW5zdGFuY2VvZiBEZWxpdmVyYWJsZSkgewotCQkJCWN0cmxfZXh0ZXJuYWxfZGVzYy5zZXRNb2RhbE9iamVjdChjb250ZW50RWxlbWVudAotCQkJCQkJLmdldFByZXNlbnRhdGlvbigpKTsKLQkJCQljdHJsX2V4dGVybmFsX2Rlc2Muc2V0TW9kYWxPYmplY3RGZWF0dXJlKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkuZ2V0RGVsaXZlcmFibGVEZXNjcmlwdGlvbl9FeHRlcm5hbERlc2NyaXB0aW9uKCkpOwotCQkJCWN0cmxfZXh0ZXJuYWxfZGVzYy5hZGRNb2RpZnlMaXN0ZW5lcihjb250ZW50TW9kaWZ5TGlzdGVuZXIpOwotCQkJCWN0cmxfZXh0ZXJuYWxfZGVzYy5hZGRMaXN0ZW5lcihTV1QuRGVhY3RpdmF0ZSwgbmV3IExpc3RlbmVyKCkgewotCQkJCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJCQlJTWV0aG9kUmljaFRleHQgY29udHJvbCA9IGRlc2NFeHBhbmRGbGFnID8gY3RybF9leHBhbmRlZAotCQkJCQkJCQk6IGN0cmxfZXh0ZXJuYWxfZGVzYzsKLQkJCQkJCWlmICghY29udHJvbC5nZXRNb2RpZmllZCgpKSB7Ci0JCQkJCQkJcmV0dXJuOwotCQkJCQkJfQotCQkJCQkJU3RyaW5nIG9sZENvbnRlbnQgPSAoKG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcmFibGVEZXNjcmlwdGlvbikgd29ya1Byb2R1Y3QKLQkJCQkJCQkJLmdldFByZXNlbnRhdGlvbigpKS5nZXRFeHRlcm5hbERlc2NyaXB0aW9uKCk7Ci0JCQkJCQlpZiAoKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkKLQkJCQkJCQkJLm11c3RSZXN0b3JlVmFsdWUoY29udHJvbCwgb2xkQ29udGVudCkpIHsKLQkJCQkJCQlyZXR1cm47Ci0JCQkJCQl9Ci0JCQkJCQlTdHJpbmcgbmV3Q29udGVudCA9IGNvbnRyb2wuZ2V0VGV4dCgpOwotCQkJCQkJaWYgKCFuZXdDb250ZW50LmVxdWFscyhvbGRDb250ZW50KSkgewotCQkJCQkJCWJvb2xlYW4gc3VjY2VzcyA9IGFjdGlvbk1ncgotCQkJCQkJCQkJLmRvQWN0aW9uKAotCQkJCQkJCQkJCQlJQWN0aW9uTWFuYWdlci5TRVQsCi0JCQkJCQkJCQkJCWNvbnRlbnRFbGVtZW50LmdldFByZXNlbnRhdGlvbigpLAotCQkJCQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJCQkJCS5nZXREZWxpdmVyYWJsZURlc2NyaXB0aW9uX0V4dGVybmFsRGVzY3JpcHRpb24oKSwKLQkJCQkJCQkJCQkJbmV3Q29udGVudCwgLTEpOwotCQkJCQkJCWlmIChzdWNjZXNzICYmIGlzVmVyc2lvblNlY3Rpb25PbigpKSB7Ci0JCQkJCQkJCXVwZGF0ZUNoYW5nZURhdGUoKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9KTsKLQotCQkJCWN0cmxfcGFja2FnaW5nX2d1aWRhbmNlLnNldE1vZGFsT2JqZWN0KGNvbnRlbnRFbGVtZW50Ci0JCQkJCQkuZ2V0UHJlc2VudGF0aW9uKCkpOwotCQkJCWN0cmxfcGFja2FnaW5nX2d1aWRhbmNlCi0JCQkJCQkuc2V0TW9kYWxPYmplY3RGZWF0dXJlKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCS5nZXREZWxpdmVyYWJsZURlc2NyaXB0aW9uX1BhY2thZ2luZ0d1aWRhbmNlKCkpOwotCQkJCWN0cmxfcGFja2FnaW5nX2d1aWRhbmNlCi0JCQkJCQkuYWRkTW9kaWZ5TGlzdGVuZXIoY29udGVudE1vZGlmeUxpc3RlbmVyKTsKLQkJCQljdHJsX3BhY2thZ2luZ19ndWlkYW5jZS5hZGRMaXN0ZW5lcihTV1QuRGVhY3RpdmF0ZSwKLQkJCQkJCW5ldyBMaXN0ZW5lcigpIHsKLQkJCQkJCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJCQkJCUlNZXRob2RSaWNoVGV4dCBjb250cm9sID0gZGVzY0V4cGFuZEZsYWcgPyBjdHJsX2V4cGFuZGVkCi0JCQkJCQkJCQkJOiBjdHJsX3BhY2thZ2luZ19ndWlkYW5jZTsKLQkJCQkJCQkJaWYgKCFjb250cm9sLmdldE1vZGlmaWVkKCkpIHsKLQkJCQkJCQkJCXJldHVybjsKLQkJCQkJCQkJfQotCQkJCQkJCQlTdHJpbmcgb2xkQ29udGVudCA9ICgob3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyYWJsZURlc2NyaXB0aW9uKSB3b3JrUHJvZHVjdAotCQkJCQkJCQkJCS5nZXRQcmVzZW50YXRpb24oKSkKLQkJCQkJCQkJCQkuZ2V0UGFja2FnaW5nR3VpZGFuY2UoKTsKLQkJCQkJCQkJaWYgKCgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpCi0JCQkJCQkJCQkJLm11c3RSZXN0b3JlVmFsdWUoY29udHJvbCwgb2xkQ29udGVudCkpIHsKLQkJCQkJCQkJCXJldHVybjsKLQkJCQkJCQkJfQotCQkJCQkJCQlTdHJpbmcgbmV3Q29udGVudCA9IGNvbnRyb2wuZ2V0VGV4dCgpOwotCQkJCQkJCQlpZiAoIW5ld0NvbnRlbnQuZXF1YWxzKG9sZENvbnRlbnQpKSB7Ci0JCQkJCQkJCQlib29sZWFuIHN1Y2Nlc3MgPSBhY3Rpb25NZ3IKLQkJCQkJCQkJCQkJLmRvQWN0aW9uKAotCQkJCQkJCQkJCQkJCUlBY3Rpb25NYW5hZ2VyLlNFVCwKLQkJCQkJCQkJCQkJCQljb250ZW50RWxlbWVudAotCQkJCQkJCQkJCQkJCQkJLmdldFByZXNlbnRhdGlvbigpLAotCQkJCQkJCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJCQkJCQkuZ2V0RGVsaXZlcmFibGVEZXNjcmlwdGlvbl9QYWNrYWdpbmdHdWlkYW5jZSgpLAotCQkJCQkJCQkJCQkJCW5ld0NvbnRlbnQsIC0xKTsKLQkJCQkJCQkJCWlmIChzdWNjZXNzICYmIGlzVmVyc2lvblNlY3Rpb25PbigpKSB7Ci0JCQkJCQkJCQkJdXBkYXRlQ2hhbmdlRGF0ZSgpOwotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JCi0JLyoqCi0JICogU2xvdCBMaXN0ZW5lcnMKLQkgKi8KLQlwcml2YXRlIHZvaWQgYWRkU2xvdExpc3RlbmVycygpCXsKLQkJLy8gd29yayBwcm9kdWN0IHNsb3QgY2hlY2sgYnV0dG9uCi0JCWN0cmxfc2xvdF9idXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJQm9vbGVhbiBpc1Nsb3QgPSBuZXcgQm9vbGVhbihjdHJsX3Nsb3RfYnV0dG9uLmdldFNlbGVjdGlvbigpKTsKLQkJCQlpZiAoaXNTbG90LmJvb2xlYW5WYWx1ZSgpKSB7Ci0JCQkJCS8vIGlmIHRoaXMgYmVjb21pbmcgYSBzbG90IGl0c2VsZgotCQkJCQlMaXN0PEZ1bGZpbGxhYmxlRWxlbWVudD4gZnVsRmlsbHMgPSB3b3JrUHJvZHVjdAotCQkJCQkJCS5nZXRGdWxmaWxscygpOwotCQkJCQlpZiAoZnVsRmlsbHMgIT0gbnVsbCAmJiBmdWxGaWxscy5zaXplKCkgIT0gMCkgewotCQkJCQkJYm9vbGVhbiB2YWwgPSBBdXRob3JpbmdVSVBsdWdpbgotCQkJCQkJCQkuZ2V0RGVmYXVsdCgpCi0JCQkJCQkJCS5nZXRNc2dEaWFsb2coKQotCQkJCQkJCQkuZGlzcGxheUNvbmZpcm1hdGlvbigKLQkJCQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5zbG90Q29uZmlybURpYWxvZ190aXRsZSwKLQkJCQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy53cEZ1bEZpbGxzQ29uZmlybURpYWxvZ19tZXNzYWdlKTsKLQkJCQkJCWlmICghdmFsKSB7Ci0JCQkJCQkJY3RybF9zbG90X2J1dHRvbi5zZXRTZWxlY3Rpb24od29ya1Byb2R1Y3QKLQkJCQkJCQkJCS5nZXRJc0Fic3RyYWN0KCkuYm9vbGVhblZhbHVlKCkpOwotCQkJCQkJCXJldHVybjsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlJFTU9WRV9NQU5ZLAotCQkJCQkJCQkJd29ya1Byb2R1Y3QsIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJCS5nZXRGdWxmaWxsYWJsZUVsZW1lbnRfRnVsZmlsbHMoKSwKLQkJCQkJCQkJCWZ1bEZpbGxzLCAtMSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewkJCQkJCi0JCQkJCUxpc3QgZnVsRmlsbHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCWZ1bEZpbGxzLmFkZEFsbChBc3NvY2lhdGlvbkhlbHBlci5nZXRGdWxsRmlsbHMod29ya1Byb2R1Y3QpKTsKLQkJCQkJaWYgKGZ1bEZpbGxzICE9IG51bGwgJiYgZnVsRmlsbHMuc2l6ZSgpICE9IDApIHsKLQkJCQkJCWJvb2xlYW4gdmFsID0gQXV0aG9yaW5nVUlQbHVnaW4KLQkJCQkJCQkJLmdldERlZmF1bHQoKQotCQkJCQkJCQkuZ2V0TXNnRGlhbG9nKCkKLQkJCQkJCQkJLmRpc3BsYXlDb25maXJtYXRpb24oCi0JCQkJCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuc2xvdENvbmZpcm1EaWFsb2dfdGl0bGUsCi0JCQkJCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMud3BTbG90RnVsRmlsbHNDb25maXJtRGlhbG9nX21lc3NhZ2UpOwotCQkJCQkJaWYgKCF2YWwpIHsKLQkJCQkJCQljdHJsX3Nsb3RfYnV0dG9uLnNldFNlbGVjdGlvbih3b3JrUHJvZHVjdAotCQkJCQkJCQkJLmdldElzQWJzdHJhY3QoKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJCQkJcmV0dXJuOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlmb3IgKEl0ZXJhdG9yIGl0b3IgPSBmdWxGaWxscy5pdGVyYXRvcigpOyBpdG9yCi0JCQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJCQlXb3JrUHJvZHVjdCB3cCA9IChXb3JrUHJvZHVjdCkgaXRvci5uZXh0KCk7Ci0JCQkJCQkJCWFjdGlvbk1ncgotCQkJCQkJCQkJCS5kb0FjdGlvbigKLQkJCQkJCQkJCQkJCUlBY3Rpb25NYW5hZ2VyLlJFTU9WRSwKLQkJCQkJCQkJCQkJCXdwLAotCQkJCQkJCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCQkJCQkJLmdldEZ1bGZpbGxhYmxlRWxlbWVudF9GdWxmaWxscygpLAotCQkJCQkJCQkJCQkJd29ya1Byb2R1Y3QsIC0xKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0JCQkJCi0JCQkJfQotCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5TRVQsIG1ldGhvZEVsZW1lbnQsCi0JCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRDbGFzc2lmaWVyX0lzQWJzdHJhY3QoKSwgaXNTbG90LAotCQkJCQkJLTEpOwotCQkJCQotCQkJCWlmIChpc1Nsb3QpIHsJCQotCQkJCQlhZGRTbG90QnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJYWRkU2xvdEJ1dHRvbi5zZXRFbmFibGVkKHRydWUpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJYWRkU2xvdEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlJRmlsdGVyIGZpbHRlciA9IG5ldyBXb3JrUHJvZHVjdEZpbHRlcigpIHsKLQkJCQkJcHJvdGVjdGVkIGJvb2xlYW4gY2hpbGRBY2NlcHQoT2JqZWN0IG9iaikgewotCQkJCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0KSB7Ci0JCQkJCQkJcmV0dXJuICgoV29ya1Byb2R1Y3QpIG9iaikuZ2V0SXNBYnN0cmFjdCgpLmJvb2xlYW5WYWx1ZSgpOwotCQkJCQkJfQotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQl9Ci0JCQkJfTsKLQkJCQlMaXN0PEZ1bGZpbGxhYmxlRWxlbWVudD4gYWxyZWFkeUV4aXN0aW5nID0gbmV3IEFycmF5TGlzdDxGdWxmaWxsYWJsZUVsZW1lbnQ+KCk7Ci0JCQkJYWxyZWFkeUV4aXN0aW5nLmFkZEFsbCh3b3JrUHJvZHVjdC5nZXRGdWxmaWxscygpKTsKLQkJCQlJdGVtc0ZpbHRlckRpYWxvZyBmZCA9IG5ldyBJdGVtc0ZpbHRlckRpYWxvZyhQbGF0Zm9ybVVJCi0JCQkJCQkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0U2hlbGwoKSwKLQkJCQkJCWZpbHRlciwgbWV0aG9kRWxlbWVudCwKLQkJCQkJCUZpbHRlckNvbnN0YW50cy5XT1JLUFJPRFVDVFMsIGFscmVhZHlFeGlzdGluZyk7Ci0JCQkJZmQuc2V0Vmlld2VyU2VsZWN0aW9uU2luZ2xlKGZhbHNlKTsKLQkJCQlmZC5zZXRCbG9ja09uT3Blbih0cnVlKTsKLQkJCQlmZC5zZXRUaXRsZShGaWx0ZXJDb25zdGFudHMuV09SS1BST0RVQ1RTKTsKLQkJCQlmZC5vcGVuKCk7Ci0JCQkJCi0JCQkJaWYgKGZkLmdldFNlbGVjdGVkSXRlbXMoKS5zaXplKCkgPiAwKSB7Ci0JCQkJCWJvb2xlYW4gc3RhdHVzID0gYWN0aW9uTWdyLmRvQWN0aW9uKAotCQkJCQkJCUlBY3Rpb25NYW5hZ2VyLkFERF9NQU5ZLCB3b3JrUHJvZHVjdCwKLQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJLmdldEZ1bGZpbGxhYmxlRWxlbWVudF9GdWxmaWxscygpLCBmZAotCQkJCQkJCQkJLmdldFNlbGVjdGVkSXRlbXMoKSwgLTEpOwotCQkJCQlpZiAoIXN0YXR1cykgewotCQkJCQkJcmV0dXJuOwotCQkJCQl9Ci0JCQkJCS8vIHJlZnJlc2ggc2xvdCB2aWV3ZXIKLQkJCQkJc2xvdFZpZXdlci5yZWZyZXNoKCk7CQotCQkJCX0JCQotCQkJfQotCQl9KTsKLQkJCi0JCXJlbW92ZVNsb3RCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKXsKLQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNsb3RWaWV3ZXIKLQkJCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQkJCQlpZiAoc2VsZWN0aW9uLnNpemUoKSA+IDApIHsKLQkJCQkJYm9vbGVhbiBzdGF0dXMgPSBhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuUkVNT1ZFX01BTlksIHdvcmtQcm9kdWN0LAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkuZ2V0RnVsZmlsbGFibGVFbGVtZW50X0Z1bGZpbGxzKCksCi0JCQkJCQkJc2VsZWN0aW9uLnRvTGlzdCgpLCAtMSk7Ci0JCQkJCQotCQkJCQlpZiAoIXN0YXR1cykgewotCQkJCQkJcmV0dXJuOwotCQkJCQl9Ci0JCQkJCS8vIHJlZnJlc2ggc2xvdCB2aWV3ZXIKLQkJCQkJc2xvdFZpZXdlci5yZWZyZXNoKCk7Ci0JCQkJCXJlbW92ZVNsb3RCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJfQotCQkJfQkKLQkJfSk7Ci0JCQotCQlzbG90Vmlld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGUpIHsKLQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNsb3RWaWV3ZXIKLQkJCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQkJCQlpZiAoc2VsZWN0aW9uLnNpemUoKSA+IDAgJiYgIVRuZ1V0aWwuaXNMb2NrZWQod29ya1Byb2R1Y3QpKSB7Ci0JCQkJCXJlbW92ZVNsb3RCdXR0b24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjcmVmcmVzaChib29sZWFuKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2goYm9vbGVhbiBlZGl0YWJsZSkgewotCQlzdXBlci5yZWZyZXNoKGVkaXRhYmxlKTsKLQkJCi0JCWlmIChzbG90U2VjdGlvbk9uKSAgewotCQkJY3RybF9zbG90X2J1dHRvbi5zZXRFbmFibGVkKGVkaXRhYmxlKTsKLQkJCQotCQkJQm9vbGVhbiBpc0Fic3RyYWN0ID0gd29ya1Byb2R1Y3QuZ2V0SXNBYnN0cmFjdCgpOwotCQkJaWYgKGlzQWJzdHJhY3QgIT0gbnVsbCAmJiBlZGl0YWJsZSkgewotCQkJCWlmIChpc0Fic3RyYWN0LmJvb2xlYW5WYWx1ZSgpKSAgewotCQkJCQlhZGRTbG90QnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWFkZFNsb3RCdXR0b24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlCi0JCQkJYWRkU2xvdEJ1dHRvbi5zZXRFbmFibGVkKGVkaXRhYmxlKTsKLQkJCQotCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzbG90Vmlld2VyLmdldFNlbGVjdGlvbigpOwotCQkJaWYgKHNlbGVjdGlvbi5zaXplKCkgPiAwICYmIGVkaXRhYmxlKSB7Ci0JCQkJcmVtb3ZlU2xvdEJ1dHRvbi5zZXRFbmFibGVkKHRydWUpOwotCQkJfSBlbHNlIHsKLQkJCQlyZW1vdmVTbG90QnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJfQotCQl9Ci0JCQotCQlpZiAodGFpbG9yaW5nU2VjdGlvbk9uKSB7Ci0JCQljdHJsX2ltcGFjdC5zZXRFZGl0YWJsZShlZGl0YWJsZSk7Ci0JCQljdHJsX3JlYXNvbi5zZXRFZGl0YWJsZShlZGl0YWJsZSk7Ci0JCQlpZiAod29ya1Byb2R1Y3QgaW5zdGFuY2VvZiBBcnRpZmFjdCkKLQkJCQljdHJsX3JlcHJlc2VudGF0aW9uX29wdGlvbnMuc2V0RWRpdGFibGUoZWRpdGFibGUpOwotCQl9Ci0JCWlmIChub3RhdGlvblNlY3Rpb25PbikgewotCQkJaWYgKHdvcmtQcm9kdWN0IGluc3RhbmNlb2YgQXJ0aWZhY3QpIHsKLQkJCQljdHJsX2JyaWVmX291dGxpbmUuc2V0RWRpdGFibGUoZWRpdGFibGUpOwotCQkJCWN0cmxfcmVwcmVzZW50YXRpb24uc2V0RWRpdGFibGUoZWRpdGFibGUpOwotCQkJCWN0cmxfbm90YXRpb24uc2V0RWRpdGFibGUoZWRpdGFibGUpOwotCQkJfQotCQkJaWYgKHdvcmtQcm9kdWN0IGluc3RhbmNlb2YgRGVsaXZlcmFibGUpIHsKLQkJCQljdHJsX2V4dGVybmFsX2Rlc2Muc2V0RWRpdGFibGUoZWRpdGFibGUpOwotCQkJCWN0cmxfcGFja2FnaW5nX2d1aWRhbmNlLnNldEVkaXRhYmxlKGVkaXRhYmxlKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2xvYWREYXRhKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBsb2FkRGF0YSgpIHsKLQkJc3VwZXIubG9hZERhdGEoKTsKLQotCQkvLyBJc0Fic3RyYWN0IGF0dHJpYnV0ZQotCQlpZiAoc2xvdFNlY3Rpb25PbikgewotCQkJQm9vbGVhbiBpc0Fic3RyYWN0ID0gd29ya1Byb2R1Y3QuZ2V0SXNBYnN0cmFjdCgpOwotCQkJaWYgKGlzQWJzdHJhY3QgIT0gbnVsbCkgewotCQkJCWN0cmxfc2xvdF9idXR0b24uc2V0U2VsZWN0aW9uKGlzQWJzdHJhY3QuYm9vbGVhblZhbHVlKCkpOwotCQkJfSBlbHNlCi0JCQkJY3RybF9zbG90X2J1dHRvbi5zZXRTZWxlY3Rpb24oZmFsc2UpOwotCQl9Ci0KLQkJCi0JCW9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdGlvbiBjb250ZW50ID0gKChvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRpb24pIHdvcmtQcm9kdWN0Ci0JCQkJLmdldFByZXNlbnRhdGlvbigpKTsKLQotCQlpZiAocHVycG9zZU9uKSB7Ci0JCQlTdHJpbmcgcHVycG9zZSA9IGNvbnRlbnQuZ2V0UHVycG9zZSgpOwotCQkJY3RybF9wdXJwb3NlLnNldFRleHQocHVycG9zZSA9PSBudWxsID8gIiIgOiBwdXJwb3NlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWlmICh0YWlsb3JpbmdTZWN0aW9uT24pIHsKLQkJCVN0cmluZyBpbXBhY3QgPSBjb250ZW50LmdldEltcGFjdE9mTm90SGF2aW5nKCk7Ci0JCQlTdHJpbmcgcmVhc29uID0gY29udGVudC5nZXRSZWFzb25zRm9yTm90TmVlZGluZygpOwotCQkJY3RybF9pbXBhY3Quc2V0VGV4dChpbXBhY3QgPT0gbnVsbCA/ICIiIDogaW1wYWN0KTsgLy8kTk9OLU5MUy0xJAkKLQkJCWN0cmxfcmVhc29uLnNldFRleHQocmVhc29uID09IG51bGwgPyAiIiA6IHJlYXNvbik7IC8vJE5PTi1OTFMtMSQKLQkJCWlmICh3b3JrUHJvZHVjdCBpbnN0YW5jZW9mIEFydGlmYWN0KSB7Ci0JCQkJY3RybF9yZXByZXNlbnRhdGlvbl9vcHRpb25zCi0JCQkJCQkuc2V0VGV4dCgoKEFydGlmYWN0RGVzY3JpcHRpb24pIGNvbnRlbnQpCi0JCQkJCQkJCS5nZXRSZXByZXNlbnRhdGlvbk9wdGlvbnMoKSA9PSBudWxsID8gIiIgOiAoKEFydGlmYWN0RGVzY3JpcHRpb24pIGNvbnRlbnQpLmdldFJlcHJlc2VudGF0aW9uT3B0aW9ucygpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0KLQkJCi0KLQkJaWYgKG5vdGF0aW9uU2VjdGlvbk9uKSB7Ci0JCQlpZiAod29ya1Byb2R1Y3QgaW5zdGFuY2VvZiBBcnRpZmFjdCkgewotCQkJCWN0cmxfYnJpZWZfb3V0bGluZQotCQkJCQkJLnNldFRleHQoKChBcnRpZmFjdERlc2NyaXB0aW9uKSBjb250ZW50KQotCQkJCQkJCQkuZ2V0QnJpZWZPdXRsaW5lKCkgPT0gbnVsbCA/ICIiIDogKChBcnRpZmFjdERlc2NyaXB0aW9uKSBjb250ZW50KS5nZXRCcmllZk91dGxpbmUoKSk7IC8vJE5PTi1OTFMtMSQJCQkKLQkJCQljdHJsX3JlcHJlc2VudGF0aW9uCi0JCQkJCQkuc2V0VGV4dCgoKEFydGlmYWN0RGVzY3JpcHRpb24pIGNvbnRlbnQpCi0JCQkJCQkJCS5nZXRSZXByZXNlbnRhdGlvbigpID09IG51bGwgPyAiIiA6ICgoQXJ0aWZhY3REZXNjcmlwdGlvbikgY29udGVudCkuZ2V0UmVwcmVzZW50YXRpb24oKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQljdHJsX25vdGF0aW9uCi0JCQkJCQkuc2V0VGV4dCgoKEFydGlmYWN0RGVzY3JpcHRpb24pIGNvbnRlbnQpLmdldE5vdGF0aW9uKCkgPT0gbnVsbCA/ICIiIDogKChBcnRpZmFjdERlc2NyaXB0aW9uKSBjb250ZW50KS5nZXROb3RhdGlvbigpKTsgLy8kTk9OLU5MUy0xJAotCQkJfSBlbHNlIGlmICh3b3JrUHJvZHVjdCBpbnN0YW5jZW9mIERlbGl2ZXJhYmxlKSB7Ci0JCQkJY3RybF9leHRlcm5hbF9kZXNjCi0JCQkJCQkuc2V0VGV4dCgoKERlbGl2ZXJhYmxlRGVzY3JpcHRpb24pIGNvbnRlbnQpCi0JCQkJCQkJCS5nZXRFeHRlcm5hbERlc2NyaXB0aW9uKCkgPT0gbnVsbCA/ICIiIDogKChEZWxpdmVyYWJsZURlc2NyaXB0aW9uKSBjb250ZW50KS5nZXRFeHRlcm5hbERlc2NyaXB0aW9uKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJY3RybF9wYWNrYWdpbmdfZ3VpZGFuY2UKLQkJCQkJCS5zZXRUZXh0KCgoRGVsaXZlcmFibGVEZXNjcmlwdGlvbikgY29udGVudCkKLQkJCQkJCQkJLmdldFBhY2thZ2luZ0d1aWRhbmNlKCkgPT0gbnVsbCA/ICIiIDogKChEZWxpdmVyYWJsZURlc2NyaXB0aW9uKSBjb250ZW50KS5nZXRQYWNrYWdpbmdHdWlkYW5jZSgpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRDb250ZW50RWxlbWVudCgpCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBnZXRDb250ZW50RWxlbWVudCgpIHsKLQkJcmV0dXJuIHdvcmtQcm9kdWN0OwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2dldFRhYlN0cmluZygpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRUYWJTdHJpbmcoKSB7Ci0JCXJldHVybiBGaWx0ZXJDb25zdGFudHMuV09SS1BST0RVQ1RTOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2dldEZpbHRlcigpCi0JICovCi0JcHJvdGVjdGVkIElGaWx0ZXIgZ2V0RmlsdGVyKCkgewotCQlmaWx0ZXIgPSBuZXcgV29ya1Byb2R1Y3RGaWx0ZXIoKSB7Ci0JCQlMaXN0IGJhZGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJCXByb3RlY3RlZCBib29sZWFuIGNoaWxkQWNjZXB0KE9iamVjdCBvYmopIHsKLQkJCQlpZiAoc3VwZXIuY2hpbGRBY2NlcHQob2JqKSkgewotCQkJCQlpZiAob2JqIGluc3RhbmNlb2YgQ29udGVudEVsZW1lbnQpIHsKLQkJCQkJCWlmIChvYmogaW5zdGFuY2VvZiBXb3JrUHJvZHVjdAotCQkJCQkJCQkmJiAoKENvbnRlbnRFbGVtZW50KSBnZXRIZWxwZXIoKQotCQkJCQkJCQkJCS5nZXRDb250ZW50RWxlbWVudCgpKS5nZXRUeXBlKCkuZXF1YWxzKAotCQkJCQkJCQkJCSgoQ29udGVudEVsZW1lbnQpIG9iaikuZ2V0VHlwZSgpKSkgewotCQkJCQkJCS8vIHByZXZlbnQgY2lyY3VsYXIgZGVwZW5kZW5jeSBmcm9tIGRlbGl2ZXJhYmxlCi0JCQkJCQkJLy8gcGFydHMgYW5kIHZhcmlhYmlsaXR5Ci0JCQkJCQkJaWYgKG9iaiBpbnN0YW5jZW9mIERlbGl2ZXJhYmxlCi0JCQkJCQkJCQkmJiB3b3JrUHJvZHVjdCBpbnN0YW5jZW9mIERlbGl2ZXJhYmxlKSB7Ci0JCQkJCQkJCWlmICghVUlIZWxwZXIuY2hlY2tDaXJjdWxhckRlbGl2ZXJhYmxlcygKLQkJCQkJCQkJCQkoRGVsaXZlcmFibGUpIG9iaiwKLQkJCQkJCQkJCQkoRGVsaXZlcmFibGUpIHdvcmtQcm9kdWN0KSkgewotCQkJCQkJCQkJYmFkbGlzdC5hZGQob2JqKTsKLQkJCQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJCQkJfQotCQkJCQkJCQlpZiAoKChEZWxpdmVyYWJsZSkgb2JqKQotCQkJCQkJCQkJCS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkgIT0gbnVsbCkgewotCQkJCQkJCQkJaWYgKCFVSUhlbHBlcgotCQkJCQkJCQkJCQkuY2hlY2tDaXJjdWxhckRlbGl2ZXJhYmxlcygKLQkJCQkJCQkJCQkJCQkoRGVsaXZlcmFibGUpICgoRGVsaXZlcmFibGUpIG9iaikKLQkJCQkJCQkJCQkJCQkJCS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCksCi0JCQkJCQkJCQkJCQkJKERlbGl2ZXJhYmxlKSB3b3JrUHJvZHVjdCkpIHsKLQkJCQkJCQkJCQliYWRsaXN0LmFkZChvYmopOwotCQkJCQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCQkJCQkJCQlJdGVyYXRvciBpdDEgPSBUbmdVdGlsCi0JCQkJCQkJCQkJLmdldEdlbmVyYWxpemVycygoRGVsaXZlcmFibGUpIG9iaik7Ci0JCQkJCQkJCXdoaWxlIChpdDEuaGFzTmV4dCgpKSB7Ci0JCQkJCQkJCQlWYXJpYWJpbGl0eUVsZW1lbnQgdmUgPSAoVmFyaWFiaWxpdHlFbGVtZW50KSBpdDEKLQkJCQkJCQkJCQkJLm5leHQoKTsKLQkJCQkJCQkJCWlmICh2ZSAhPSBudWxsKSB7Ci0JCQkJCQkJCQkJaWYgKHZlLmVxdWFscyhvYmopKQotCQkJCQkJCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCQkJCQkJaWYgKCFVSUhlbHBlcgotCQkJCQkJCQkJCQkJLmNoZWNrQ2lyY3VsYXJEZWxpdmVyYWJsZXMoCi0JCQkJCQkJCQkJCQkJCShEZWxpdmVyYWJsZSkgdmUsCi0JCQkJCQkJCQkJCQkJCShEZWxpdmVyYWJsZSkgd29ya1Byb2R1Y3QpKSB7Ci0JCQkJCQkJCQkJCWJhZGxpc3QuYWRkKG9iaik7Ci0JCQkJCQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQl9Ci0KLQkJCQkJCQkJfQotCQkJCQkJCQkvLyBicm93c2UgdGhyb3VnaCBiYWRsaXN0IGFuZCBpdHMgZGVsaXZlcmFibGUKLQkJCQkJCQkJLy8gcGFydHMuCi0JCQkJCQkJCUxpc3QgdGVtcGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBiYWRsaXN0Lml0ZXJhdG9yKCk7IGl0ZXJhdG9yCi0JCQkJCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCQkJCU9iamVjdCBiYWQgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCQkJCQlVSUhlbHBlci5kZWxpdmVyYWJsZVBhcnRzQ2hhaW4oCi0JCQkJCQkJCQkJCShEZWxpdmVyYWJsZSkgYmFkLCB0ZW1wbGlzdCk7Ci0JCQkJCQkJCX0KLQkJCQkJCQkJaWYgKHRlbXBsaXN0LmNvbnRhaW5zKG9iaikpCi0JCQkJCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCQkJfQotCi0JCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9OwotCi0JCS8vIHNldCBhZGRpdGlvbmFsIGZpbHRlciBmb3IgdmFyaWFiaWxpdHkgYmFzZSBlbGVtZW50IGNoZWNraW5nCi0JCSgoQ29udGVudEZpbHRlcikgZmlsdGVyKQotCQkJCS5zZXRBZGRpdGlvbmFsRmlsdGVycyhuZXcgSUZpbHRlcltdIHsgbmV3IFZhcmlhYmlsaXR5QmFzZUVsZW1lbnRGaWx0ZXIoCi0JCQkJCQl3b3JrUHJvZHVjdCkgfSk7Ci0JCXJldHVybiBmaWx0ZXI7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjbG9hZFNlY3Rpb25EZXNjcmlwdGlvbigpCi0JICovCi0JcHVibGljIHZvaWQgbG9hZFNlY3Rpb25EZXNjcmlwdGlvbigpIHsKLQkJaWYgKGNvbnRlbnRFbGVtZW50IGluc3RhbmNlb2YgQXJ0aWZhY3QpIHsKLQkJCXRoaXMuZ2VuZXJhbFNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmFydGlmYWN0X2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjOwotCQkJdGhpcy5kZXRhaWxTZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy5hcnRpZmFjdF9kZXRhaWxTZWN0aW9uX2Rlc2M7Ci0JCQl0aGlzLnZhcmlhYmlsaXR5U2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuYXJ0aWZhY3RfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M7Ci0JCQl0aGlzLnZlcnNpb25TZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy5hcnRpZmFjdF92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYzsKLQkJCXRoaXMubm90YXRpb25TZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy5hcnRpZmFjdF9ub3RhdGlvblNlY3Rpb25fZGVzYzsKLQkJCXRoaXMudGFpbG9yaW5nU2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuYXJ0aWZhY3RfdGFpbG9yaW5nU2VjdGlvbl9kZXNjOwotCQkJdGhpcy5pY29uU2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuYXJ0aWZhY3RfaWNvblNlY3Rpb25fZGVzYzsKLQkJCXRoaXMuc2xvdFNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmFydGlmYWN0X3Nsb3RTZWN0aW9uX2Rlc2M7Ci0JCX0KLQkJaWYgKGNvbnRlbnRFbGVtZW50IGluc3RhbmNlb2YgT3V0Y29tZSkgewotCQkJdGhpcy5nZW5lcmFsU2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMub3V0Y29tZV9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYzsKLQkJCXRoaXMuZGV0YWlsU2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMub3V0Y29tZV9kZXRhaWxTZWN0aW9uX2Rlc2M7Ci0JCQl0aGlzLnZhcmlhYmlsaXR5U2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMub3V0Y29tZV92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYzsKLQkJCXRoaXMudmVyc2lvblNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLm91dGNvbWVfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M7Ci0JCQl0aGlzLm5vdGF0aW9uU2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMub3V0Y29tZV9ub3RhdGlvblNlY3Rpb25fZGVzYzsKLQkJCXRoaXMudGFpbG9yaW5nU2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMub3V0Y29tZV90YWlsb3JpbmdTZWN0aW9uX2Rlc2M7Ci0JCQl0aGlzLmljb25TZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy5vdXRjb21lX2ljb25TZWN0aW9uX2Rlc2M7Ci0JCQl0aGlzLnNsb3RTZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy5vdXRjb21lX3Nsb3RTZWN0aW9uX2Rlc2M7Ci0JCX0KLQkJaWYgKGNvbnRlbnRFbGVtZW50IGluc3RhbmNlb2YgRGVsaXZlcmFibGUpIHsKLQkJCXRoaXMuZ2VuZXJhbFNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmRlbGl2ZXJhYmxlX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjOwotCQkJdGhpcy5kZXRhaWxTZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy5kZWxpdmVyYWJsZV9kZXRhaWxTZWN0aW9uX2Rlc2M7Ci0JCQl0aGlzLnZhcmlhYmlsaXR5U2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZGVsaXZlcmFibGVfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M7Ci0JCQl0aGlzLnZlcnNpb25TZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy5kZWxpdmVyYWJsZV92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYzsKLQkJCXRoaXMubm90YXRpb25TZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy5kZWxpdmVyYWJsZV9ub3RhdGlvblNlY3Rpb25fZGVzYzsKLQkJCXRoaXMudGFpbG9yaW5nU2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZGVsaXZlcmFibGVfdGFpbG9yaW5nU2VjdGlvbl9kZXNjOwotCQkJdGhpcy5pY29uU2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZGVsaXZlcmFibGVfaWNvblNlY3Rpb25fZGVzYzsKLQkJCXRoaXMuc2xvdFNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmRlbGl2ZXJhYmxlX3Nsb3RTZWN0aW9uX2Rlc2M7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvV29ya1Byb2R1Y3RHdWlkYW5jZVBhZ2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvV29ya1Byb2R1Y3RHdWlkYW5jZVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjE4ZTM4YS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL1dvcmtQcm9kdWN0R3VpZGFuY2VQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3JtczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuTWV0aG9kRWxlbWVudEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZpbHRlcnMuR3VpZGFuY2VGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS51dGlsLlVJSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JQWN0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLkZpbHRlckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNoZWNrbGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbmNlcHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5FeGFtcGxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3VpZGFuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HdWlkZWxpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5QcmFjdGljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJlcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJldXNhYmxlQXNzZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5TdXBwb3J0aW5nTWF0ZXJpYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZW1wbGF0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRvb2xNZW50b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLmVkaXRvci5Gb3JtRWRpdG9yOwotCi0KLS8qKgotICogVGhlIEd1aWRhbmNlIHBhZ2UgaW4gdGhlIFdvcmsgUHJvZHVjdCBlZGl0b3IuCi0gKiAKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBXb3JrUHJvZHVjdEd1aWRhbmNlUGFnZSBleHRlbmRzIEFzc29jaWF0aW9uRm9ybVBhZ2UgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZPUk1fUEFHRV9JRCA9ICJ3b3JrUHJvZHVjdEd1aWRhbmNlUGFnZSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgV29ya1Byb2R1Y3Qgd29ya1Byb2R1Y3Q7Ci0KLQlwcml2YXRlIElBY3Rpb25NYW5hZ2VyIGFjdGlvbk1ncjsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFdvcmtQcm9kdWN0R3VpZGFuY2VQYWdlKEZvcm1FZGl0b3IgZWRpdG9yKSB7Ci0JCXN1cGVyKGVkaXRvciwgRk9STV9QQUdFX0lELCBBdXRob3JpbmdVSVRleHQuR1VJREFOQ0VfUEFHRV9USVRMRSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjaW5pdChvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZSwgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0KQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSUVkaXRvclNpdGUgc2l0ZSwgSUVkaXRvcklucHV0IGlucHV0KSB7Ci0JCXN1cGVyLmluaXQoc2l0ZSwgaW5wdXQpOwotCQl3b3JrUHJvZHVjdCA9IChXb3JrUHJvZHVjdCkgY29udGVudEVsZW1lbnQ7Ci0JCWFjdGlvbk1nciA9ICgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpLmdldEFjdGlvbk1hbmFnZXIoKTsKLQkJc2V0VXNlQ2F0ZWdvcnkyKGZhbHNlKTsKLQkJc2V0VXNlQ2F0ZWdvcnkzKGZhbHNlKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNpbml0Q29udGVudFByb3ZpZGVyU2VsZWN0ZWQoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRDb250ZW50UHJvdmlkZXJTZWxlY3RlZCgpIHsKLQkJY29udGVudFByb3ZpZGVyU2VsZWN0ZWQgPSBuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoCi0JCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJCS5nZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSkgewotCQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gVUlIZWxwZXIuZ2V0U2VsZWN0ZWRHdWlkYW5jZXMod29ya1Byb2R1Y3QpOwotCQkJfQotCQl9OwotCQl2aWV3ZXJfc2VsZWN0ZWQuc2V0Q29udGVudFByb3ZpZGVyKGNvbnRlbnRQcm92aWRlclNlbGVjdGVkKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNhZGRJdGVtc1RvTW9kZWwxKEFycmF5TGlzdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRJdGVtc1RvTW9kZWwxKEFycmF5TGlzdCBhZGRJdGVtcykgewotCQkvLyBVcGRhdGUgdGhlIG1vZGVsLgotCQlpZiAoIWFkZEl0ZW1zLmlzRW1wdHkoKSkgewotCQkJZm9yIChJdGVyYXRvciBpdCA9IGFkZEl0ZW1zLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlHdWlkYW5jZSBpdGVtID0gKEd1aWRhbmNlKSBpdC5uZXh0KCk7Ci0KLQkJCQkvLyBUaGUgZ3VpZGFuY2UgZm9yIHRoZSBjb250ZW50IGVsZW1lbnQuCi0JCQkJaWYgKGl0ZW0gaW5zdGFuY2VvZiBDaGVja2xpc3QpIHsKLQkJCQkJYWN0aW9uTWdyCi0JCQkJCQkJLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLkFERCwgd29ya1Byb2R1Y3QsCi0JCQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJCQkuZ2V0Q29udGVudEVsZW1lbnRfQ2hlY2tsaXN0cygpLAotCQkJCQkJCQkJKENoZWNrbGlzdCkgaXRlbSwgLTEpOwotCQkJCX0gZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIENvbmNlcHQpIHsKLQkJCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLkFERCwgd29ya1Byb2R1Y3QsCi0JCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCS5nZXRDb250ZW50RWxlbWVudF9Db25jZXB0c0FuZFBhcGVycygpLAotCQkJCQkJCWl0ZW0sIC0xKTsKLQkJCQl9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBFeGFtcGxlKSB7Ci0JCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5BREQsIHdvcmtQcm9kdWN0LAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbnRlbnRFbGVtZW50X0V4YW1wbGVzKCksCi0JCQkJCQkJaXRlbSwgLTEpOwotCQkJCX0gZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIEd1aWRlbGluZSkgewotCQkJCQlhY3Rpb25NZ3IKLQkJCQkJCQkuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuQURELCB3b3JrUHJvZHVjdCwKLQkJCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJCS5nZXRDb250ZW50RWxlbWVudF9HdWlkZWxpbmVzKCksCi0JCQkJCQkJCQlpdGVtLCAtMSk7Ci0JCQkJfSBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgUHJhY3RpY2UpIHsKLQkJCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLkFERCwgKFByYWN0aWNlKSBpdGVtLAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkuZ2V0UHJhY3RpY2VfQ29udGVudFJlZmVyZW5jZXMoKSwKLQkJCQkJCQl3b3JrUHJvZHVjdCwgLTEpOwotCQkJCX0gZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIFJlcG9ydCkgewotCQkJCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuQURELCB3b3JrUHJvZHVjdCwKLQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRXb3JrUHJvZHVjdF9SZXBvcnRzKCksCi0JCQkJCQkJaXRlbSwgLTEpOwotCQkJCX0gZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIFJldXNhYmxlQXNzZXQpIHsKLQkJCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLkFERCwgd29ya1Byb2R1Y3QsCi0JCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29udGVudEVsZW1lbnRfQXNzZXRzKCksCi0JCQkJCQkJaXRlbSwgLTEpOwotCQkJCX0gZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIFN1cHBvcnRpbmdNYXRlcmlhbCkgewotCQkJCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuQURELCB3b3JrUHJvZHVjdCwKLQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJLmdldENvbnRlbnRFbGVtZW50X1N1cHBvcnRpbmdNYXRlcmlhbHMoKSwKLQkJCQkJCQlpdGVtLCAtMSk7Ci0JCQkJfSBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgVGVtcGxhdGUpIHsKLQkJCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLkFERCwgd29ya1Byb2R1Y3QsCi0JCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V29ya1Byb2R1Y3RfVGVtcGxhdGVzKCksCi0JCQkJCQkJaXRlbSwgLTEpOwotCQkJCX0gZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIFRvb2xNZW50b3IpIHsKLQkJCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLkFERCwgd29ya1Byb2R1Y3QsCi0JCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V29ya1Byb2R1Y3RfVG9vbE1lbnRvcnMoKSwKLQkJCQkJCQlpdGVtLCAtMSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4KLQkJCQkJCQkuZ2V0RGVmYXVsdCgpCi0JCQkJCQkJLmdldExvZ2dlcigpCi0JCQkJCQkJLmxvZ0Vycm9yKAotCQkJCQkJCQkJIlVuYWJsZSB0byBhZGQgZ3VpZGFuY2UgIiArIGl0ZW0uZ2V0VHlwZSgpLmdldE5hbWUoKSArICI6IiArIGl0ZW0uZ2V0TmFtZSgpICsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQkJCQkJCSJ0byAiIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCQkJKyB3b3JrUHJvZHVjdC5nZXRUeXBlKCkuZ2V0TmFtZSgpCi0JCQkJCQkJCQkJCSsgIjoiICsgd29ya1Byb2R1Y3QuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJCAKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNyZW1vdmVJdGVtc0Zyb21Nb2RlbDEoQXJyYXlMaXN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbW92ZUl0ZW1zRnJvbU1vZGVsMShBcnJheUxpc3Qgcm1JdGVtcykgewotCQkvLyBVcGRhdGUgdGhlIG1vZGVsLgotCQlpZiAoIXJtSXRlbXMuaXNFbXB0eSgpKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gcm1JdGVtcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJR3VpZGFuY2UgaXRlbSA9IChHdWlkYW5jZSkgaXQubmV4dCgpOwotCi0JCQkJLy8gVGhlIGd1aWRhbmNlIGZvciB0aGUgY29udGVudCBlbGVtZW50LgotCQkJCWlmIChpdGVtIGluc3RhbmNlb2YgQ2hlY2tsaXN0KSB7Ci0JCQkJCWFjdGlvbk1ncgotCQkJCQkJCS5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5SRU1PVkUsIHdvcmtQcm9kdWN0LAotCQkJCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCQkJLmdldENvbnRlbnRFbGVtZW50X0NoZWNrbGlzdHMoKSwKLQkJCQkJCQkJCWl0ZW0sIC0xKTsKLQkJCQl9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBDb25jZXB0KSB7Ci0JCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5SRU1PVkUsIHdvcmtQcm9kdWN0LAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkuZ2V0Q29udGVudEVsZW1lbnRfQ29uY2VwdHNBbmRQYXBlcnMoKSwKLQkJCQkJCQlpdGVtLCAtMSk7Ci0JCQkJfSBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgRXhhbXBsZSkgewotCQkJCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuUkVNT1ZFLCB3b3JrUHJvZHVjdCwKLQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb250ZW50RWxlbWVudF9FeGFtcGxlcygpLAotCQkJCQkJCWl0ZW0sIC0xKTsKLQkJCQl9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBHdWlkZWxpbmUpIHsKLQkJCQkJYWN0aW9uTWdyCi0JCQkJCQkJLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlJFTU9WRSwgd29ya1Byb2R1Y3QsCi0JCQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJCQkuZ2V0Q29udGVudEVsZW1lbnRfR3VpZGVsaW5lcygpLAotCQkJCQkJCQkJaXRlbSwgLTEpOwotCQkJCX0gZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIFByYWN0aWNlKSB7Ci0JCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5SRU1PVkUsIChQcmFjdGljZSkgaXRlbSwKLQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJLmdldFByYWN0aWNlX0NvbnRlbnRSZWZlcmVuY2VzKCksCi0JCQkJCQkJd29ya1Byb2R1Y3QsIC0xKTsKLQkJCQl9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBSZXBvcnQpIHsKLQkJCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlJFTU9WRSwgd29ya1Byb2R1Y3QsCi0JCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V29ya1Byb2R1Y3RfUmVwb3J0cygpLAotCQkJCQkJCWl0ZW0sIC0xKTsKLQkJCQl9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBSZXVzYWJsZUFzc2V0KSB7Ci0JCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5SRU1PVkUsIHdvcmtQcm9kdWN0LAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbnRlbnRFbGVtZW50X0Fzc2V0cygpLAotCQkJCQkJCWl0ZW0sIC0xKTsKLQkJCQl9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBTdXBwb3J0aW5nTWF0ZXJpYWwpIHsKLQkJCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlJFTU9WRSwgd29ya1Byb2R1Y3QsCi0JCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCS5nZXRDb250ZW50RWxlbWVudF9TdXBwb3J0aW5nTWF0ZXJpYWxzKCksCi0JCQkJCQkJaXRlbSwgLTEpOwotCQkJCX0gZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIFRlbXBsYXRlKSB7Ci0JCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5SRU1PVkUsIHdvcmtQcm9kdWN0LAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFdvcmtQcm9kdWN0X1RlbXBsYXRlcygpLAotCQkJCQkJCWl0ZW0sIC0xKTsKLQkJCQl9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBUb29sTWVudG9yKSB7Ci0JCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5SRU1PVkUsIHdvcmtQcm9kdWN0LAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFdvcmtQcm9kdWN0X1Rvb2xNZW50b3JzKCksCi0JCQkJCQkJaXRlbSwgLTEpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCUF1dGhvcmluZ1VJUGx1Z2luCi0JCQkJCQkJLmdldERlZmF1bHQoKQotCQkJCQkJCS5nZXRMb2dnZXIoKQotCQkJCQkJCS5sb2dFcnJvcigKLQkJCQkJCQkJCSJVbmFibGUgdG8gcmVtb3ZlIGd1aWRhbmNlICIgKyBpdGVtLmdldFR5cGUoKS5nZXROYW1lKCkgKyAiOiIgKyBpdGVtLmdldE5hbWUoKSArIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJCQkJCQkiZnJvbSAiIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCQkJKyB3b3JrUHJvZHVjdC5nZXRUeXBlKCkuZ2V0TmFtZSgpCi0JCQkJCQkJCQkJCSsgIjoiICsgd29ya1Byb2R1Y3QuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJCAKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRDb250ZW50RWxlbWVudCgpCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBnZXRDb250ZW50RWxlbWVudCgpIHsKLQkJcmV0dXJuIHdvcmtQcm9kdWN0OwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2dldFRhYlN0cmluZygpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRUYWJTdHJpbmcoKSB7Ci0JCXJldHVybiBGaWx0ZXJDb25zdGFudHMuR1VJREFOQ0U7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjZ2V0RmlsdGVyKCkKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpbHRlciBnZXRGaWx0ZXIoKSB7Ci0JCXJldHVybiBmaWx0ZXIgPSBuZXcgR3VpZGFuY2VGaWx0ZXIoKSB7Ci0JCQlwcm90ZWN0ZWQgYm9vbGVhbiBjaGlsZEFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCQkJaWYgKHN1cGVyLmNoaWxkQWNjZXB0KG9iaikpCi0JCQkJCXJldHVybiB0cnVlOwotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBUZW1wbGF0ZSkKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFJlcG9ydCkKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFRvb2xNZW50b3IpCi0JCQkJCXJldHVybiB0cnVlOwotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL1dvcmtQcm9kdWN0Um9sZXNQYWdlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL1dvcmtQcm9kdWN0Um9sZXNQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0MTk1NjIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9Xb3JrUHJvZHVjdFJvbGVzUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLk1ldGhvZEVsZW1lbnRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSUFjdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51aS5Vc2VySW50ZXJhY3Rpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5Bc3NvY2lhdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuZWRpdG9yLkZvcm1FZGl0b3I7Ci0KLQotLyoqCi0gKiBUaGUgUm9sZXMgcGFnZSBpbiB0aGUgV29yayBQcm9kdWN0IGVkaXRvci4KLSAqIAotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICogCi0gKiBUT0RPOiBSZW5hbWUgdGhpcyBjbGFzcyB0byBXb3JrUHJvZHVjdFJvbGVzRm9ybVBhZ2UKLSAqLwotcHVibGljIGNsYXNzIFdvcmtQcm9kdWN0Um9sZXNQYWdlIGV4dGVuZHMgQXNzb2NpYXRpb25Gb3JtUGFnZSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9STV9QQUdFX0lEID0gIndvcmtQcm9kdWN0Um9sZXNQYWdlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBXb3JrUHJvZHVjdCB3b3JrUHJvZHVjdDsKLQotCXByaXZhdGUgSUFjdGlvbk1hbmFnZXIgYWN0aW9uTWdyOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgV29ya1Byb2R1Y3RSb2xlc1BhZ2UoRm9ybUVkaXRvciBlZGl0b3IpIHsKLQkJc3VwZXIoZWRpdG9yLCBGT1JNX1BBR0VfSUQsIEF1dGhvcmluZ1VJVGV4dC5ST0xFU19QQUdFX1RJVExFKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNpbml0KG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlLCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJRWRpdG9yU2l0ZSBzaXRlLCBJRWRpdG9ySW5wdXQgaW5wdXQpIHsKLQkJc3VwZXIuaW5pdChzaXRlLCBpbnB1dCk7Ci0JCXdvcmtQcm9kdWN0ID0gKFdvcmtQcm9kdWN0KSBjb250ZW50RWxlbWVudDsKLQkJYWN0aW9uTWdyID0gKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkuZ2V0QWN0aW9uTWFuYWdlcigpOwotCQlzZXRVc2VDYXRlZ29yeTMoZmFsc2UpOwotCQlzZXRDYXRlZ29yeUlzU2luZ2xlU2VsZWN0aW9uMSh0cnVlKTsKLQkJc2V0QWxsb3dDaGFuZ2UxKGZhbHNlKTsKLQkJc2V0QWxsb3dDaGFuZ2UyKGZhbHNlKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNpbml0Q29udGVudFByb3ZpZGVyU2VsZWN0ZWQoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRDb250ZW50UHJvdmlkZXJTZWxlY3RlZCgpIHsKLQkJY29udGVudFByb3ZpZGVyU2VsZWN0ZWQgPSBuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoCi0JCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJCS5nZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSkgewotCQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gQXNzb2NpYXRpb25IZWxwZXIuZ2V0UmVzcG9uc2libGVSb2xlcygoV29ya1Byb2R1Y3QpIG9iamVjdCkudG9BcnJheSgpOwotCQkJfQotCQl9OwotCQl2aWV3ZXJfc2VsZWN0ZWQuc2V0Q29udGVudFByb3ZpZGVyKGNvbnRlbnRQcm92aWRlclNlbGVjdGVkKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNhZGRJdGVtc1RvTW9kZWwxKEFycmF5TGlzdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRJdGVtc1RvTW9kZWwxKEFycmF5TGlzdCBhZGRJdGVtcykgewotCQkvLyBVcGRhdGUgdGhlIG1vZGVsLgotCQlpZiAoIWFkZEl0ZW1zLmlzRW1wdHkoKSkgewotCQkJUm9sZSByb2xlID0gKFJvbGUpIGFkZEl0ZW1zLmdldCgwKTsKLQkJCWlmIChVc2VySW50ZXJhY3Rpb25IZWxwZXIuY2hlY2tNb2RpZnlPcHBvc2l0ZShyb2xlLAotCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRSb2xlX1Jlc3BvbnNpYmxlRm9yKCksIHdvcmtQcm9kdWN0KSkgewotCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5BREQsIHJvbGUsCi0JCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRSb2xlX1Jlc3BvbnNpYmxlRm9yKCksCi0JCQkJCQl3b3JrUHJvZHVjdCwgLTEpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjcmVtb3ZlSXRlbXNGcm9tTW9kZWwxKEFycmF5TGlzdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVJdGVtc0Zyb21Nb2RlbDEoQXJyYXlMaXN0IHJtSXRlbXMpIHsKLQkJLy8gVXBkYXRlIHRoZSBtb2RlbC4KLQkJaWYgKCFybUl0ZW1zLmlzRW1wdHkoKSkgewotLy8JCQlMaWJyYXJ5TWFuYWdlci5nZXRJbnN0YW5jZSgpLnNldFJlc3BvbnNpYmxlUm9sZShnZXRBY3Rpb25NYW5hZ2VyKCksCi0vLwkJCQkJd29ya1Byb2R1Y3QsIG51bGwpOwotCQkJCi0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBybUl0ZW1zLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCVJvbGUgcm9sZSA9IChSb2xlKSBpdGVyLm5leHQoKTsKLQkJCQlnZXRBY3Rpb25NYW5hZ2VyKCkuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuUkVNT1ZFLCByb2xlLCBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRSb2xlX1Jlc3BvbnNpYmxlRm9yKCksIHdvcmtQcm9kdWN0LCAtMSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNpbml0Q29udGVudFByb3ZpZGVyU2VsZWN0ZWQyKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0Q29udGVudFByb3ZpZGVyU2VsZWN0ZWQyKCkgewotCQljb250ZW50UHJvdmlkZXJTZWxlY3RlZDIgPSBuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoCi0JCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJCS5nZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSkgewotCQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gQXNzb2NpYXRpb25IZWxwZXIuZ2V0TW9kaWZpZWRCeSgoV29ya1Byb2R1Y3QpIG9iamVjdCkKLQkJCQkJCS50b0FycmF5KCk7Ci0JCQl9Ci0JCX07Ci0JCXZpZXdlcl9zZWxlY3RlZDIuc2V0Q29udGVudFByb3ZpZGVyKGNvbnRlbnRQcm92aWRlclNlbGVjdGVkMik7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldE11bHRpcGxlU2VsZWN0RGVzY3JpcHRpb24oaW50KQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbihpbnQgY291bnQpIHsKLQkJcmV0dXJuIHN1cGVyLmdldE11bHRpcGxlU2VsZWN0RGVzY3JpcHRpb24oY291bnQsIEF1dGhvcmluZ1VJUmVzb3VyY2VzLndvcmtQcm9kdWN0Um9sZXNQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb24pOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNnZXRTZWN0aW9uRGVzY3JpcHRpb24oKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VjdGlvbkRlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMud29ya1Byb2R1Y3RSb2xlc1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldFNlY3Rpb25OYW1lKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlY3Rpb25OYW1lKCkgewotCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMud29ya1Byb2R1Y3RSb2xlc1BhZ2Vfc2VjdGlvbk5hbWU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0U2VsZWN0ZWRMYWJlbCgpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTZWxlY3RlZExhYmVsKCkgewotCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMud29ya1Byb2R1Y3RSb2xlc1BhZ2Vfc2VsZWN0ZWRMYWJlbDsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0U2VsZWN0ZWRMYWJlbDIoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VsZWN0ZWRMYWJlbDIoKSB7Ci0JCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy53b3JrUHJvZHVjdFJvbGVzUGFnZV9zZWxlY3RlZExhYmVsMjsKLQl9Ci0JCi0JCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL1dvcmtQcm9kdWN0VGFza3NQYWdlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL1dvcmtQcm9kdWN0VGFza3NQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5NjU5ODAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9Xb3JrUHJvZHVjdFRhc2tzUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjU2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLk1ldGhvZEVsZW1lbnRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSUFjdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5MaWJyYXJ5TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkFzc29jaWF0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuRm9ybUVkaXRvcjsKLQotCi0vKioKLSAqIFRoZSBUYXNrcyBwYWdlIGluIHRoZSBXb3JrIFByb2R1Y3QgZWRpdG9yLgotICogCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBXb3JrUHJvZHVjdFRhc2tzUGFnZSBleHRlbmRzIEFzc29jaWF0aW9uRm9ybVBhZ2UgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZPUk1fUEFHRV9JRCA9ICJ3b3JrUHJvZHVjdFRhc2tzUGFnZSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgV29ya1Byb2R1Y3Qgd29ya1Byb2R1Y3Q7Ci0KLQlwcml2YXRlIElBY3Rpb25NYW5hZ2VyIGFjdGlvbk1ncjsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFdvcmtQcm9kdWN0VGFza3NQYWdlKEZvcm1FZGl0b3IgZWRpdG9yKSB7Ci0JCXN1cGVyKGVkaXRvciwgRk9STV9QQUdFX0lELCBBdXRob3JpbmdVSVRleHQuVEFTS1NfUEFHRV9USVRMRSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjaW5pdChvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZSwgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0KQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSUVkaXRvclNpdGUgc2l0ZSwgSUVkaXRvcklucHV0IGlucHV0KSB7Ci0JCXN1cGVyLmluaXQoc2l0ZSwgaW5wdXQpOwotCQl3b3JrUHJvZHVjdCA9IChXb3JrUHJvZHVjdCkgY29udGVudEVsZW1lbnQ7Ci0JCWFjdGlvbk1nciA9ICgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpLmdldEFjdGlvbk1hbmFnZXIoKTsKLQkJc2V0QWxsb3dDaGFuZ2UxKGZhbHNlKTsKLQkJc2V0QWxsb3dDaGFuZ2UyKGZhbHNlKTsKLQkJc2V0QWxsb3dDaGFuZ2UzKGZhbHNlKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNpbml0Q29udGVudFByb3ZpZGVyU2VsZWN0ZWQoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRDb250ZW50UHJvdmlkZXJTZWxlY3RlZCgpIHsKLQkJY29udGVudFByb3ZpZGVyU2VsZWN0ZWQgPSBuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoCi0JCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJCS5nZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSkgewotCQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gQXNzb2NpYXRpb25IZWxwZXIuZ2V0TWFuZGF0b3J5SW5wdXRUb1Rhc2tzKAotCQkJCQkJKFdvcmtQcm9kdWN0KSBvYmplY3QpLnRvQXJyYXkoKTsKLQkJCX0KLQkJfTsKLQkJdmlld2VyX3NlbGVjdGVkLnNldENvbnRlbnRQcm92aWRlcihjb250ZW50UHJvdmlkZXJTZWxlY3RlZCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjYWRkSXRlbXNUb01vZGVsMShBcnJheUxpc3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkSXRlbXNUb01vZGVsMShBcnJheUxpc3QgYWRkSXRlbXMpIHsKLQkJLy8gVXBkYXRlIHRoZSBtb2RlbC4KLQkJaWYgKCFhZGRJdGVtcy5pc0VtcHR5KCkpIHsKLQkJCUxpc3QgZWxlbWVudExpc3QgPSByZXRyaWV2ZVRhYmxlVmlld2VyQ29udGVudHModmlld2VyX3NlbGVjdGVkMik7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gYWRkSXRlbXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCVRhc2sgdGFzayA9IChUYXNrKSBpdC5uZXh0KCk7Ci0JCQkJaWYgKCFlbGVtZW50TGlzdC5jb250YWlucyh0YXNrKSkgewotCQkJCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuQURELCB0YXNrLAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tfTWFuZGF0b3J5SW5wdXQoKSwKLQkJCQkJCQl3b3JrUHJvZHVjdCwgLTEpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI3JlbW92ZUl0ZW1zRnJvbU1vZGVsMShBcnJheUxpc3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlSXRlbXNGcm9tTW9kZWwxKEFycmF5TGlzdCBybUl0ZW1zKSB7Ci0JCS8vIFVwZGF0ZSB0aGUgbW9kZWwuCi0JCWlmICghcm1JdGVtcy5pc0VtcHR5KCkpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBybUl0ZW1zLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlUYXNrIHRhc2sgPSAoVGFzaykgaXQubmV4dCgpOwotCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5SRU1PVkUsIHRhc2ssCi0JCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrX01hbmRhdG9yeUlucHV0KCksCi0JCQkJCQl3b3JrUHJvZHVjdCwgLTEpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjaW5pdENvbnRlbnRQcm92aWRlclNlbGVjdGVkMigpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdENvbnRlbnRQcm92aWRlclNlbGVjdGVkMigpIHsKLQkJY29udGVudFByb3ZpZGVyU2VsZWN0ZWQyID0gbmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKAotCQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpIHsKLQkJCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJTGlzdCBzZWxlY3RlZFRhc2tzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCUxpc3QgYXZhaWxhYmxlVGFza3NMaXN0ID0gTGlicmFyeU1hbmFnZXIuZ2V0SW5zdGFuY2UoKQotCQkJCQkJLmdldEF2YWlsYWJsZVRhc2tzKHdvcmtQcm9kdWN0KTsKLQkJCQlpZiAoYXZhaWxhYmxlVGFza3NMaXN0ICE9IG51bGwgJiYgYXZhaWxhYmxlVGFza3NMaXN0LnNpemUoKSA+IDApIHsKLQkJCQkJZm9yIChqYXZhLnV0aWwuSXRlcmF0b3IgaXQgPSBhdmFpbGFibGVUYXNrc0xpc3QuaXRlcmF0b3IoKTsgaXQKLQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJVGFzayB0YXNrID0gKFRhc2spIGl0Lm5leHQoKTsKLQkJCQkJCWlmICh0YXNrLmdldE9wdGlvbmFsSW5wdXQoKS5jb250YWlucyh3b3JrUHJvZHVjdCkpCi0JCQkJCQkJc2VsZWN0ZWRUYXNrcy5hZGQodGFzayk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJcmV0dXJuIHNlbGVjdGVkVGFza3MudG9BcnJheSgpOwotCQkJfQotCQl9OwotCQl2aWV3ZXJfc2VsZWN0ZWQyLnNldENvbnRlbnRQcm92aWRlcihjb250ZW50UHJvdmlkZXJTZWxlY3RlZDIpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2FkZEl0ZW1zVG9Nb2RlbDIoQXJyYXlMaXN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEl0ZW1zVG9Nb2RlbDIoQXJyYXlMaXN0IGFkZEl0ZW1zKSB7Ci0JCS8vIFVwZGF0ZSB0aGUgbW9kZWwuCi0JCWlmICghYWRkSXRlbXMuaXNFbXB0eSgpKSB7Ci0JCQlMaXN0IGVsZW1lbnRMaXN0ID0gcmV0cmlldmVUYWJsZVZpZXdlckNvbnRlbnRzKHZpZXdlcl9zZWxlY3RlZCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gYWRkSXRlbXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCVRhc2sgdGFzayA9IChUYXNrKSBpdC5uZXh0KCk7Ci0JCQkJaWYgKCFlbGVtZW50TGlzdC5jb250YWlucyh0YXNrKSkgewotCQkJCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuQURELCB0YXNrLAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tfT3B0aW9uYWxJbnB1dCgpLAotCQkJCQkJCXdvcmtQcm9kdWN0LCAtMSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjcmVtb3ZlSXRlbXNGcm9tTW9kZWwyKEFycmF5TGlzdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVJdGVtc0Zyb21Nb2RlbDIoQXJyYXlMaXN0IHJtSXRlbXMpIHsKLQkJLy8gVXBkYXRlIHRoZSBtb2RlbC4KLQkJaWYgKCFybUl0ZW1zLmlzRW1wdHkoKSkgewotCQkJZm9yIChJdGVyYXRvciBpdCA9IHJtSXRlbXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCVRhc2sgdGFzayA9IChUYXNrKSBpdC5uZXh0KCk7Ci0JCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlJFTU9WRSwgdGFzaywKLQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tfT3B0aW9uYWxJbnB1dCgpLAotCQkJCQkJd29ya1Byb2R1Y3QsIC0xKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2luaXRDb250ZW50UHJvdmlkZXJTZWxlY3RlZDMoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRDb250ZW50UHJvdmlkZXJTZWxlY3RlZDMoKSB7Ci0JCWNvbnRlbnRQcm92aWRlclNlbGVjdGVkMyA9IG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcigKLQkJCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkJLmdldE5hdmlnYXRvclZpZXdfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKSB7Ci0JCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IG9iamVjdCkgewotCQkJCXJldHVybiBBc3NvY2lhdGlvbkhlbHBlci5nZXRPdXRwdXR0aW5nVGFza3MoCi0JCQkJCQkoV29ya1Byb2R1Y3QpIG9iamVjdCkudG9BcnJheSgpOwotCQkJfQotCQl9OwotCQl2aWV3ZXJfc2VsZWN0ZWQzLnNldENvbnRlbnRQcm92aWRlcihjb250ZW50UHJvdmlkZXJTZWxlY3RlZDMpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2FkZEl0ZW1zVG9Nb2RlbDMoQXJyYXlMaXN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEl0ZW1zVG9Nb2RlbDMoQXJyYXlMaXN0IGFkZEl0ZW1zKSB7Ci0JCS8vIFVwZGF0ZSB0aGUgbW9kZWwuCi0JCWlmICghYWRkSXRlbXMuaXNFbXB0eSgpKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gYWRkSXRlbXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCVRhc2sgdGFzayA9IChUYXNrKSBpdC5uZXh0KCk7Ci0JCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLkFERCwgdGFzaywKLQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tfT3V0cHV0KCksIHdvcmtQcm9kdWN0LCAtMSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNyZW1vdmVJdGVtc0Zyb21Nb2RlbDMoQXJyYXlMaXN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbW92ZUl0ZW1zRnJvbU1vZGVsMyhBcnJheUxpc3Qgcm1JdGVtcykgewotCQkvLyBVcGRhdGUgdGhlIG1vZGVsLgotCQlpZiAoIXJtSXRlbXMuaXNFbXB0eSgpKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gcm1JdGVtcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJVGFzayB0YXNrID0gKFRhc2spIGl0Lm5leHQoKTsKLQkJCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuUkVNT1ZFLCB0YXNrLAotCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza19PdXRwdXQoKSwgd29ya1Byb2R1Y3QsIC0xKTsKLQkJCX0KLQkJfQotCX0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNnZXRNdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uKGludCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldE11bHRpcGxlU2VsZWN0RGVzY3JpcHRpb24oaW50IGNvdW50KSB7Ci0JCXJldHVybiBzdXBlci5nZXRNdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uKGNvdW50LCBBdXRob3JpbmdVSVJlc291cmNlcy5Xb3JrUHJvZHVjdF9UYXNrc19NdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uKTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0U2VjdGlvbkRlc2NyaXB0aW9uKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlY3Rpb25EZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLldvcmtQcm9kdWN0X1Rhc2tzX1NlY3Rpb25EZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNnZXRTZWN0aW9uTmFtZSgpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTZWN0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLldvcmtQcm9kdWN0X1Rhc2tzX1NlY3Rpb25OYW1lOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldFNlbGVjdGVkTGFiZWwoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VsZWN0ZWRMYWJlbCgpIHsKLQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLldvcmtQcm9kdWN0X1Rhc2tzX1NlbGVjdGVkTGFiZWw7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldFNlbGVjdGVkTGFiZWwyKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlbGVjdGVkTGFiZWwyKCkgewotCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMuV29ya1Byb2R1Y3RfVGFza3NfU2VsZWN0ZWRMYWJlbDI7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldFNlbGVjdGVkTGFiZWwzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlbGVjdGVkTGFiZWwzKCkgewotCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMuV29ya1Byb2R1Y3RfVGFza3NfU2VsZWN0ZWRMYWJlbDM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9Xb3JrUHJvZHVjdFR5cGVEZXNjcmlwdGlvblBhZ2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvV29ya1Byb2R1Y3RUeXBlRGVzY3JpcHRpb25QYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyMjRiNjYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9Xb3JrUHJvZHVjdFR5cGVEZXNjcmlwdGlvblBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZmlsdGVycy5DYXRlZ29yeUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5GaWx0ZXJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5WYXJpYWJpbGl0eUJhc2VFbGVtZW50RmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3RUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuRm9ybUVkaXRvcjsKLQotCi0vKioKLSAqIFRoZSBEZXNjcmlwdGlvbiBwYWdlIGZvciB0aGUgV29yayBwcm9kdWN0IFR5cGUgZWRpdG9yLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBXb3JrUHJvZHVjdFR5cGVEZXNjcmlwdGlvblBhZ2UgZXh0ZW5kcyBEZXNjcmlwdGlvbkZvcm1QYWdlIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JNX1BBR0VfSUQgPSAid29ya1Byb2R1Y3RUeXBlRGVzY3JpcHRpb25QYWdlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBXb3JrUHJvZHVjdFR5cGUgd29ya1Byb2R1Y3RUeXBlOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgV29ya1Byb2R1Y3RUeXBlRGVzY3JpcHRpb25QYWdlKEZvcm1FZGl0b3IgZWRpdG9yKSB7Ci0JCXN1cGVyKGVkaXRvciwgRk9STV9QQUdFX0lELCBBdXRob3JpbmdVSVRleHQuREVTQ1JJUFRJT05fUEFHRV9USVRMRSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjaW5pdChvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZSwgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0KQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSUVkaXRvclNpdGUgc2l0ZSwgSUVkaXRvcklucHV0IGlucHV0KSB7Ci0JCXN1cGVyLmluaXQoc2l0ZSwgaW5wdXQpOwotCQl3b3JrUHJvZHVjdFR5cGUgPSAoV29ya1Byb2R1Y3RUeXBlKSBjb250ZW50RWxlbWVudDsKLQkJc2V0RXh0ZXJuYWxJRE9uKHRydWUpOwotCQlzZXRMb25nUHJlc2VudGF0aW9uTmFtZU9uKHRydWUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2dldENvbnRlbnRFbGVtZW50KCkKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGdldENvbnRlbnRFbGVtZW50KCkgewotCQlyZXR1cm4gd29ya1Byb2R1Y3RUeXBlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2dldEZpbHRlcigpCi0JICovCi0JcHJvdGVjdGVkIElGaWx0ZXIgZ2V0RmlsdGVyKCkgewotCQlmaWx0ZXIgPSBuZXcgQ2F0ZWdvcnlGaWx0ZXIoKSB7Ci0JCQlwcm90ZWN0ZWQgYm9vbGVhbiBjaGlsZEFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCQkJcmV0dXJuIChvYmogaW5zdGFuY2VvZiBXb3JrUHJvZHVjdFR5cGUpOwotCQkJfQotCQl9OwotCi0JCS8vIHNldCBhZGRpdGlvbmFsIGZpbHRlciBmb3IgdmFyaWFiaWxpdHkgYmFzZSBlbGVtZW50IGNoZWNraW5nCi0JCSgoQ2F0ZWdvcnlGaWx0ZXIpIGZpbHRlcikKLQkJCQkuc2V0QWRkaXRpb25hbEZpbHRlcnMobmV3IElGaWx0ZXJbXSB7IG5ldyBWYXJpYWJpbGl0eUJhc2VFbGVtZW50RmlsdGVyKAotCQkJCQkJd29ya1Byb2R1Y3RUeXBlKSB9KTsKLQkJcmV0dXJuIGZpbHRlcjsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFRhYlN0cmluZygpIHsKLQkJcmV0dXJuIEZpbHRlckNvbnN0YW50cy5XT1JLUFJPRFVDVFRZUEVTOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2xvYWRTZWN0aW9uRGVzY3JpcHRpb24oKQotCSAqLwotCXB1YmxpYyB2b2lkIGxvYWRTZWN0aW9uRGVzY3JpcHRpb24oKSB7Ci0JCXRoaXMuZ2VuZXJhbFNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLndvcmtwcm9kdWN0dHlwZV9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYzsKLQkJdGhpcy5kZXRhaWxTZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy53b3JrcHJvZHVjdHR5cGVfZGV0YWlsU2VjdGlvbl9kZXNjOwotCQl0aGlzLnZhcmlhYmlsaXR5U2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMud29ya3Byb2R1Y3R0eXBlX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjOwotCQl0aGlzLnZlcnNpb25TZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy53b3JrcHJvZHVjdHR5cGVfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9Xb3JrUHJvZHVjdFR5cGVXb3JrUHJvZHVjdHNQYWdlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL1dvcmtQcm9kdWN0VHlwZVdvcmtQcm9kdWN0c1BhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzRkMDI4ZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL1dvcmtQcm9kdWN0VHlwZVdvcmtQcm9kdWN0c1BhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuTWV0aG9kRWxlbWVudEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZpbHRlcnMuV29ya1Byb2R1Y3RGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklBY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5Nb3ZlSW5MaXN0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLkZpbHRlckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuQ2F0ZWdvcnlTb3J0SGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Db250ZW50RWxlbWVudE9yZGVyTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuTW9kZWxTdHJ1Y3R1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50Q2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuZWRpdG9yLkZvcm1FZGl0b3I7Ci0KLQotLyoqCi0gKiBUaGUgV29yayBQcm9kdWN0cyBwYWdlIGluIHRoZSBXb3JrIFByb2R1Y3QgVHlwZSBlZGl0b3IuCi0gKiAKLSAqIEBhdXRob3IgQmluZ3h1ZSBYdQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBXb3JrUHJvZHVjdFR5cGVXb3JrUHJvZHVjdHNQYWdlIGV4dGVuZHMgQXNzb2NpYXRpb25Gb3JtUGFnZSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9STV9QQUdFX0lEID0gIndvcmtQcm9kdWN0VHlwZVdvcmtQcm9kdWN0c1BhZ2UiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIFdvcmtQcm9kdWN0VHlwZSB3b3JrUHJvZHVjdFR5cGU7Ci0KLQlwcml2YXRlIElBY3Rpb25NYW5hZ2VyIGFjdGlvbk1ncjsKLQkKLQlwcml2YXRlIENvbnRlbnRFbGVtZW50T3JkZXJMaXN0IGFsbFN0ZXBzOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgV29ya1Byb2R1Y3RUeXBlV29ya1Byb2R1Y3RzUGFnZShGb3JtRWRpdG9yIGVkaXRvcikgewotCQlzdXBlcihlZGl0b3IsIEZPUk1fUEFHRV9JRCwgQXV0aG9yaW5nVUlUZXh0LldPUktfUFJPRFVDVFNfUEFHRV9USVRMRSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjaW5pdChvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZSwgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0KQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSUVkaXRvclNpdGUgc2l0ZSwgSUVkaXRvcklucHV0IGlucHV0KSB7Ci0JCXN1cGVyLmluaXQoc2l0ZSwgaW5wdXQpOwotCQl3b3JrUHJvZHVjdFR5cGUgPSAoV29ya1Byb2R1Y3RUeXBlKSBjb250ZW50RWxlbWVudDsKLQkJYWN0aW9uTWdyID0gKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkuZ2V0QWN0aW9uTWFuYWdlcigpOwotCQlzZXRVc2VDYXRlZ29yeTIoZmFsc2UpOwotCQlzZXRVc2VDYXRlZ29yeTMoZmFsc2UpOwotCQlzZXRJc1VwQW5kRG93bkJ1dHRvbnNSZXF1aXJlZDEodHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjaW5pdENvbnRlbnRQcm92aWRlclNlbGVjdGVkKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0Q29udGVudFByb3ZpZGVyU2VsZWN0ZWQoKSB7Ci0JCWNvbnRlbnRQcm92aWRlclNlbGVjdGVkID0gbmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKAotCQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpIHsKLQkJCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJLy9yZXR1cm4gKChXb3JrUHJvZHVjdFR5cGUpIG9iamVjdCkuZ2V0V29ya1Byb2R1Y3RzKCkudG9BcnJheSgpOwotCQkJCWlmIChhbGxTdGVwcyA9PSBudWxsKSB7Ci0JCQkJCWFsbFN0ZXBzID0gbmV3IENvbnRlbnRFbGVtZW50T3JkZXJMaXN0KAotCQkJCQkJCWNvbnRlbnRFbGVtZW50LAotCQkJCQkJCUNvbnRlbnRFbGVtZW50T3JkZXJMaXN0LkNPTlRFTlRfRUxFTUVOVFNfX0ZPUl9FTEVNRU5UX09OTFksCi0JCQkJCQkJZ2V0T3JkZXJGZWF0dXJlKCkpOwotCQkJCX0KLQkJCQlMaXN0IHJldHVybkxpc3QgPSBDYXRlZ29yeVNvcnRIZWxwZXIuc29ydENhdGVnb3J5RWxlbWVudHMoY29udGVudEVsZW1lbnQsIAotCQkJCQkJYWxsU3RlcHMudG9BcnJheSgpKTsKLQkJCQlyZXR1cm4gcmV0dXJuTGlzdC50b0FycmF5KCk7Ci0JCQl9Ci0JCX07Ci0JCXZpZXdlcl9zZWxlY3RlZC5zZXRDb250ZW50UHJvdmlkZXIoY29udGVudFByb3ZpZGVyU2VsZWN0ZWQpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2FkZEl0ZW1zVG9Nb2RlbDEoQXJyYXlMaXN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEl0ZW1zVG9Nb2RlbDEoQXJyYXlMaXN0IGFkZEl0ZW1zKSB7Ci0JCWlmICghYWRkSXRlbXMuaXNFbXB0eSgpKSB7Ci0JCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuQUREX01BTlksIHdvcmtQcm9kdWN0VHlwZSwKLQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V29ya1Byb2R1Y3RUeXBlX1dvcmtQcm9kdWN0cygpLAotCQkJCQlhZGRJdGVtcywgLTEpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjcmVtb3ZlSXRlbXNGcm9tTW9kZWwxKEFycmF5TGlzdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVJdGVtc0Zyb21Nb2RlbDEoQXJyYXlMaXN0IHJtSXRlbXMpIHsKLQkJLy8gVXBkYXRlIHRoZSBtb2RlbC4KLQkJaWYgKCFybUl0ZW1zLmlzRW1wdHkoKSkgewotCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlJFTU9WRV9NQU5ZLCB3b3JrUHJvZHVjdFR5cGUsCi0JCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFdvcmtQcm9kdWN0VHlwZV9Xb3JrUHJvZHVjdHMoKSwKLQkJCQkJcm1JdGVtcywgLTEpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2dldENvbnRlbnRFbGVtZW50KCkKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGdldENvbnRlbnRFbGVtZW50KCkgewotCQlyZXR1cm4gd29ya1Byb2R1Y3RUeXBlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2dldFRhYlN0cmluZygpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRUYWJTdHJpbmcoKSB7Ci0JCXJldHVybiBGaWx0ZXJDb25zdGFudHMuV09SS1BST0RVQ1RTOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2dldEZpbHRlcigpCi0JICovCi0JcHJvdGVjdGVkIElGaWx0ZXIgZ2V0RmlsdGVyKCkgewotCQlyZXR1cm4gZmlsdGVyID0gbmV3IFdvcmtQcm9kdWN0RmlsdGVyKCkgewotCQkJcHJvdGVjdGVkIGJvb2xlYW4gY2hpbGRBY2NlcHQoT2JqZWN0IG9iaikgewotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBDb250ZW50RWxlbWVudCkgewotCQkJCQlpZiAoZ2V0SGVscGVyKCkuaXNDb250cmlidXRvcigoQ29udGVudEVsZW1lbnQpIG9iaikpCi0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJCXJldHVybiAob2JqIGluc3RhbmNlb2YgV29ya1Byb2R1Y3QpOwotCQkJfQotCQl9OwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNnZXRNdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uKGludCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldE11bHRpcGxlU2VsZWN0RGVzY3JpcHRpb24oaW50IGNvdW50KSB7Ci0JCXJldHVybiBzdXBlci5nZXRNdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uKGNvdW50LCBBdXRob3JpbmdVSVJlc291cmNlcy53b3JrUHJvZHVjdFR5cGVXb3JrUHJvZHVjdHNQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb24pOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNnZXRTZWN0aW9uRGVzY3JpcHRpb24oKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VjdGlvbkRlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMud29ya1Byb2R1Y3RUeXBlV29ya1Byb2R1Y3RzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb247Ci0JfQotCQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldFNlY3Rpb25OYW1lKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlY3Rpb25OYW1lKCkgewotCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMud29ya1Byb2R1Y3RUeXBlV29ya1Byb2R1Y3RzUGFnZV9zZWN0aW9uTmFtZTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVTdHJ1Y3R1cmFsRmVhdHVyZSBnZXRPcmRlckZlYXR1cmUoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRXb3JrUHJvZHVjdFR5cGVfV29ya1Byb2R1Y3RzKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZ1tdIGdldE1vZGVsU3RydWN0dXJlUGF0aCgpIHsKLQkJcmV0dXJuIE1vZGVsU3RydWN0dXJlLkRFRkFVTFQud29ya1Byb2R1Y3RUeXBlUGF0aDsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIENvbnRlbnRFbGVtZW50T3JkZXJMaXN0IGdldENvbnRlbnRFbGVtZW50T3JkZXJMaXN0KCkgewotCQlyZXR1cm4gYWxsU3RlcHM7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL3BhY2thZ2UuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYjczNzEzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgZm9ybSBwYWdlcyBmb3IgdGhlIG1ldGhvZCBhbmQgcHJvY2VzcyBlZGl0b3JzLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvaW50ZXJuYWwvSVByb2JsZW1DaGFuZ2VkTGlzdGVuZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvaW50ZXJuYWwvSVByb2JsZW1DaGFuZ2VkTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWRjOGU5My4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2ludGVybmFsL0lQcm9ibGVtQ2hhbmdlZExpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotCi0vKioKLSAqIAotICogQ29kZSB0YWtlbiBmcm9tIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC51aS52aWV3c3VwcG9ydC5JUHJvYmxlbUNoYW5nZWRMaXN0ZW5lcgotICoKLSAqLwotcHVibGljIGludGVyZmFjZSBJUHJvYmxlbUNoYW5nZWRMaXN0ZW5lciB7Ci0JCi0JLyoqCi0JICogQ2FsbGVkIHdoZW4gcHJvYmxlbXMgY2hhbmdlZC4gVGhpcyBjYWxsIGlzIHBvc3RlZCBpbiBhbiBheW5jaCBleGVjLCB0aGVyZWZvcmUgcGFzc2VkCi0JICogcmVzb3VyY2VzIG11c3Qgbm90IGV4aXN0LgotCSAqIEBwYXJhbSBjaGFuZ2VkUmVzb3VyY2VzICBBIHNldCB3aXRoIGVsZW1lbnRzIG9mIHR5cGUgPGNvZGU+SVJlc291cmNlPC9jb2RlPiB0aGF0Ci0JICogZGVzY3JpYmUgdGhlIHJlc291cmNlcyB0aGF0IGhhZCBhbiBwcm9ibGVtIGNoYW5nZS4KLQkgKiBAcGFyYW0gaXNNYXJrZXJDaGFuZ2UgSWYgc2V0IHRvIDxjb2RlPnRydWU8L2NvZGU+LCB0aGUgY2hhbmdlIHdhcyBhIG1hcmtlciBjaGFuZ2UsIGlmCi0JICogPGNvZGU+ZmFsc2U8L2NvZGU+LCB0aGUgY2hhbmdlIGNhbWUgZnJvbSBhbiBhbm5vdGF0aW9uIG1vZGVsIG1vZGlmaWNhdGlvbi4KLQkgKi8KLQl2b2lkIHByb2JsZW1zQ2hhbmdlZChJUmVzb3VyY2VbXSBjaGFuZ2VkUmVzb3VyY2VzLCBib29sZWFuIGlzTWFya2VyQ2hhbmdlKTsKLQkKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvaW50ZXJuYWwvSW1hZ2VEZXNjcmlwdG9yUmVnaXN0cnkuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvaW50ZXJuYWwvSW1hZ2VEZXNjcmlwdG9yUmVnaXN0cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzYzODUyOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2ludGVybmFsL0ltYWdlRGVzY3JpcHRvclJlZ2lzdHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci0KLS8qKgotICogCi0gKiBDb2RlIHRha2VuIGZyb20gb3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLnZpZXdzdXBwb3J0LkltYWdlRGVzY3JpcHRvclJlZ2lzdHJ5Ci0gKgotICovCi1wdWJsaWMgY2xhc3MgSW1hZ2VEZXNjcmlwdG9yUmVnaXN0cnkgewotCi0JcHJpdmF0ZSBIYXNoTWFwPEltYWdlRGVzY3JpcHRvciwgSW1hZ2U+IGZSZWdpc3RyeT0gbmV3IEhhc2hNYXA8SW1hZ2VEZXNjcmlwdG9yLCBJbWFnZT4oMTApOwotCXByaXZhdGUgRGlzcGxheSBmRGlzcGxheTsKLQkKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGltYWdlIGRlc2NyaXB0b3IgcmVnaXN0cnkgZm9yIHRoZSBjdXJyZW50IG9yIGRlZmF1bHQgZGlzcGxheSwKLQkgKiByZXNwZWN0aXZlbHkuCi0JICovCi0JcHVibGljIEltYWdlRGVzY3JpcHRvclJlZ2lzdHJ5KCkgewotCQl0aGlzKEF1dGhvcmluZ1VJUGx1Z2luLmdldFN0YW5kYXJkRGlzcGxheSgpKTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbWFnZSBkZXNjcmlwdG9yIHJlZ2lzdHJ5IGZvciB0aGUgZ2l2ZW4gZGlzcGxheS4gQWxsIGltYWdlcwotCSAqIG1hbmFnZWQgYnkgdGhpcyByZWdpc3RyeSB3aWxsIGJlIGRpc3Bvc2VkIHdoZW4gdGhlIGRpc3BsYXkgZ2V0cyBkaXNwb3NlZC4KLQkgKiAKLQkgKiBAcGFyYW0gZGlzcGxheSB0aGUgZGlzcGxheSB0aGUgaW1hZ2VzIG1hbmFnZWQgYnkgdGhpcyByZWdpc3RyeSBhcmUgYWxsb2NhdGVkIGZvciAKLQkgKi8KLQlwdWJsaWMgSW1hZ2VEZXNjcmlwdG9yUmVnaXN0cnkoRGlzcGxheSBkaXNwbGF5KSB7Ci0JCWZEaXNwbGF5PSBkaXNwbGF5OwotCQlBc3NlcnQuaXNOb3ROdWxsKGZEaXNwbGF5KTsKLQkJaG9va0Rpc3BsYXkoKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgaW1hZ2UgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBpbWFnZSBkZXNjcmlwdG9yLgotCSAqIAotCSAqIEBwYXJhbSBkZXNjcmlwdG9yIHRoZSBpbWFnZSBkZXNjcmlwdG9yIGZvciB3aGljaCB0aGUgcmVnaXN0cnkgbWFuYWdlcyBhbiBpbWFnZQotCSAqIEByZXR1cm4gdGhlIGltYWdlIGFzc29jaWF0ZWQgd2l0aCB0aGUgaW1hZ2UgZGVzY3JpcHRvciBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqICBpZiB0aGUgaW1hZ2UgZGVzY3JpcHRvciBjYW4ndCBjcmVhdGUgdGhlIHJlcXVlc3RlZCBpbWFnZS4KLQkgKi8KLQlwdWJsaWMgSW1hZ2UgZ2V0KEltYWdlRGVzY3JpcHRvciBkZXNjcmlwdG9yKSB7Ci0JCWlmIChkZXNjcmlwdG9yID09IG51bGwpCi0JCQlkZXNjcmlwdG9yPSBJbWFnZURlc2NyaXB0b3IuZ2V0TWlzc2luZ0ltYWdlRGVzY3JpcHRvcigpOwotCQkJCi0JCUltYWdlIHJlc3VsdD0gKEltYWdlKWZSZWdpc3RyeS5nZXQoZGVzY3JpcHRvcik7Ci0JCWlmIChyZXN1bHQgIT0gbnVsbCkKLQkJCXJldHVybiByZXN1bHQ7Ci0JCi0JCUFzc2VydC5pc1RydWUoZkRpc3BsYXkgPT0gQXV0aG9yaW5nVUlQbHVnaW4uZ2V0U3RhbmRhcmREaXNwbGF5KCksICJBbGxvY2F0aW5nIGltYWdlIGZvciB3cm9uZyBkaXNwbGF5LiIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdD0gZGVzY3JpcHRvci5jcmVhdGVJbWFnZSgpOwotCQlpZiAocmVzdWx0ICE9IG51bGwpCi0JCQlmUmVnaXN0cnkucHV0KGRlc2NyaXB0b3IsIHJlc3VsdCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogRGlzcG9zZXMgYWxsIGltYWdlcyBtYW5hZ2VkIGJ5IHRoaXMgcmVnaXN0cnkuCi0JICovCQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlcj0gZlJlZ2lzdHJ5LnZhbHVlcygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOyApIHsKLQkJCUltYWdlIGltYWdlPSAoSW1hZ2UpaXRlci5uZXh0KCk7Ci0JCQlpbWFnZS5kaXNwb3NlKCk7Ci0JCX0KLQkJZlJlZ2lzdHJ5LmNsZWFyKCk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBob29rRGlzcGxheSgpIHsKLQkJZkRpc3BsYXkuZGlzcG9zZUV4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCWRpc3Bvc2UoKTsKLQkJCX0JCi0JCX0pOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2ludGVybmFsL0ltYWdlSW1hZ2VEZXNjcmlwdG9yLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2ludGVybmFsL0ltYWdlSW1hZ2VEZXNjcmlwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3ODY0ZGMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9pbnRlcm5hbC9JbWFnZUltYWdlRGVzY3JpcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlRGF0YTsKLQotLyoqCi0gKiBDb2RlIHRha2VuIGZyb20gb3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLnZpZXdzdXBwb3J0LkltYWdlSW1hZ2VEZXNjcmlwdG9yCi0gKgotICovCi1wdWJsaWMgY2xhc3MgSW1hZ2VJbWFnZURlc2NyaXB0b3IgZXh0ZW5kcyBJbWFnZURlc2NyaXB0b3IgewotCi0JcHJpdmF0ZSBJbWFnZSBmSW1hZ2U7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgSW1hZ0ltYWdlRGVzY3JpcHRvci4KLQkgKi8KLQlwdWJsaWMgSW1hZ2VJbWFnZURlc2NyaXB0b3IoSW1hZ2UgaW1hZ2UpIHsKLQkJc3VwZXIoKTsKLQkJZkltYWdlPSBpbWFnZTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBJbWFnZURlc2NyaXB0b3IjZ2V0SW1hZ2VEYXRhKCkKLQkgKi8KLQlwdWJsaWMgSW1hZ2VEYXRhIGdldEltYWdlRGF0YSgpIHsKLQkJcmV0dXJuIGZJbWFnZS5nZXRJbWFnZURhdGEoKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBPYmplY3QjZXF1YWxzKE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotCQlyZXR1cm4gKG9iaiAhPSBudWxsKSAmJiBnZXRDbGFzcygpLmVxdWFscyhvYmouZ2V0Q2xhc3MoKSkgJiYgZkltYWdlLmVxdWFscygoKEltYWdlSW1hZ2VEZXNjcmlwdG9yKW9iaikuZkltYWdlKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBPYmplY3QjaGFzaENvZGUoKQotCSAqLwotCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0JCXJldHVybiBmSW1hZ2UuaGFzaENvZGUoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvaW50ZXJuYWwvTWV0aG9kRWxlbWVudEVkaXRvckVycm9yVGlja1VwZGF0ZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvaW50ZXJuYWwvTWV0aG9kRWxlbWVudEVkaXRvckVycm9yVGlja1VwZGF0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzBlNzgxYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2ludGVybmFsL01ldGhvZEVsZW1lbnRFZGl0b3JFcnJvclRpY2tVcGRhdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLk1ldGhvZEVsZW1lbnRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLk1ldGhvZEVsZW1lbnRFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3ZpZGVycy5NZXRob2RFbGVtZW50VUlMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvdmlkZXJzLlByb2JsZW1zTGFiZWxEZWNvcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLnV0aWwuUGVyc2lzdGVuY2VVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLQotLyoqCi0gKiBDb2RlIHRha2VuIGZyb20gb3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLmphdmFlZGl0b3IuSmF2YUVkaXRvckVycm9yVGlja1VwZGF0ZXIKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXRob2RFbGVtZW50RWRpdG9yRXJyb3JUaWNrVXBkYXRlciBpbXBsZW1lbnRzIElQcm9ibGVtQ2hhbmdlZExpc3RlbmVyIHsKLQotCXByaXZhdGUgTWV0aG9kRWxlbWVudEVkaXRvciBmTWV0aG9kRWxlbWVudEVkaXRvcjsKLQlwcml2YXRlIE1ldGhvZEVsZW1lbnRVSUxhYmVsUHJvdmlkZXIgZkxhYmVsUHJvdmlkZXI7Ci0KLQlwdWJsaWMgTWV0aG9kRWxlbWVudEVkaXRvckVycm9yVGlja1VwZGF0ZXIoTWV0aG9kRWxlbWVudEVkaXRvciBlZGl0b3IpIHsKLQkJQXNzZXJ0LmlzTm90TnVsbChlZGl0b3IpOwotCQlmTWV0aG9kRWxlbWVudEVkaXRvcj0gZWRpdG9yOwotCQlmTGFiZWxQcm92aWRlcj0gbmV3IE1ldGhvZEVsZW1lbnRVSUxhYmVsUHJvdmlkZXIoKTsKLQkJZkxhYmVsUHJvdmlkZXIuYWRkTGFiZWxEZWNvcmF0b3IobmV3IFByb2JsZW1zTGFiZWxEZWNvcmF0b3IobnVsbCkpOwotCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJvYmxlbU1hcmtlck1hbmFnZXIoKS5hZGRMaXN0ZW5lcih0aGlzKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBJUHJvYmxlbUNoYW5nZWRMaXN0ZW5lciNwcm9ibGVtc0NoYW5nZWQoSVJlc291cmNlW10sIGJvb2xlYW4pCi0JICovCi0JcHVibGljIHZvaWQgcHJvYmxlbXNDaGFuZ2VkKElSZXNvdXJjZVtdIGNoYW5nZWRSZXNvdXJjZXMsIGJvb2xlYW4gaXNNYXJrZXJDaGFuZ2UpIHsKLQkJaWYgKCFpc01hcmtlckNoYW5nZSkKLQkJCXJldHVybjsKLQotCQlJRWRpdG9ySW5wdXQgaW5wdXQ9IGZNZXRob2RFbGVtZW50RWRpdG9yLmdldEVkaXRvcklucHV0KCk7Ci0JCWlmIChpbnB1dCBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnRFZGl0b3JJbnB1dCkgeyAvLyBtaWdodCBydW4gYXN5bmMsIHRlc3RzIG5lZWRlZAotCQkJTWV0aG9kRWxlbWVudCBtZWxlbWVudCA9ICgoTWV0aG9kRWxlbWVudEVkaXRvcklucHV0KWlucHV0KS5nZXRNZXRob2RFbGVtZW50KCk7Ci0JCQlpZiAobWVsZW1lbnQgaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50KSB7Ci0JCQkJbWVsZW1lbnQgPSAoKFByb2Nlc3NDb21wb25lbnQpIG1lbGVtZW50KS5nZXRQcm9jZXNzKCk7Ci0JCQl9Ci0JCQlpZiAobWVsZW1lbnQgIT0gbnVsbCkgewotCQkJCUlSZXNvdXJjZSByZXNvdXJjZT0gUGVyc2lzdGVuY2VVdGlsLmdldFdvcmtzcGFjZVJlc291cmNlKG1lbGVtZW50KTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGNoYW5nZWRSZXNvdXJjZXMubGVuZ3RoOyBpKyspIHsKLQkJCQkJaWYgKGNoYW5nZWRSZXNvdXJjZXNbaV0uZXF1YWxzKHJlc291cmNlKSkgewotCQkJCQkJdXBkYXRlRWRpdG9ySW1hZ2UobWVsZW1lbnQpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdXBkYXRlRWRpdG9ySW1hZ2UoTWV0aG9kRWxlbWVudCBtZWxlbWVudCkgewotCQlJbWFnZSB0aXRsZUltYWdlPSBmTWV0aG9kRWxlbWVudEVkaXRvci5nZXRUaXRsZUltYWdlKCk7Ci0JCWlmICh0aXRsZUltYWdlID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQlJbWFnZSBuZXdJbWFnZTsKLQkJbmV3SW1hZ2U9IGZMYWJlbFByb3ZpZGVyLmdldEltYWdlKG1lbGVtZW50KTsKLQkJaWYgKHRpdGxlSW1hZ2UgIT0gbmV3SW1hZ2UpIHsKLQkJCXBvc3RJbWFnZUNoYW5nZShuZXdJbWFnZSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgcG9zdEltYWdlQ2hhbmdlKGZpbmFsIEltYWdlIG5ld0ltYWdlKSB7Ci0JCVNoZWxsIHNoZWxsPSBmTWV0aG9kRWxlbWVudEVkaXRvci5nZXRFZGl0b3JTaXRlKCkuZ2V0U2hlbGwoKTsKLQkJaWYgKHNoZWxsICE9IG51bGwgJiYgIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQkJc2hlbGwuZ2V0RGlzcGxheSgpLnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCWZNZXRob2RFbGVtZW50RWRpdG9yLnVwZGF0ZWRUaXRsZUltYWdlKG5ld0ltYWdlKTsKLQkJCQl9Ci0JCQl9KTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWZMYWJlbFByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByb2JsZW1NYXJrZXJNYW5hZ2VyKCkucmVtb3ZlTGlzdGVuZXIodGhpcyk7Ci0JfQotCi0KLX0KLQotCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2ludGVybmFsL01ldGhvZEVsZW1lbnRJbWFnZURlc2NyaXB0b3IuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvaW50ZXJuYWwvTWV0aG9kRWxlbWVudEltYWdlRGVzY3JpcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ODgyMjJkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvaW50ZXJuYWwvTWV0aG9kRWxlbWVudEltYWdlRGVzY3JpcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJSW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuQ29tcG9zaXRlSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLkFzc2VydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2VEYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLS8qKgotICogQ29kZSB0YWtlbiBmcm9tIG9yZy5lY2xpcHNlLmpkdC51aS5KYXZhRWxlbWVudEltYWdlRGVzY3JpcHRvcgotICoKLSAqLwotcHVibGljIGNsYXNzIE1ldGhvZEVsZW1lbnRJbWFnZURlc2NyaXB0b3IgZXh0ZW5kcyBDb21wb3NpdGVJbWFnZURlc2NyaXB0b3IgewotCQotCS8qKiBGbGFnIHRvIHJlbmRlciB0aGUgZXJyb3IgYWRvcm5tZW50LiAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IEVSUk9SPQkJCTB4MDQwOwotCi0JcHJpdmF0ZSBJbWFnZURlc2NyaXB0b3IgZkJhc2VJbWFnZTsKLQlwcml2YXRlIGludCBmRmxhZ3M7Ci0JcHJpdmF0ZSBQb2ludCBmU2l6ZTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgTWV0aG9kRWxlbWVudEltYWdlRGVzY3JpcHRvci4KLQkgKiAKLQkgKiBAcGFyYW0gYmFzZUltYWdlIGFuIGltYWdlIGRlc2NyaXB0b3IgdXNlZCBhcyB0aGUgYmFzZSBpbWFnZQotCSAqIEBwYXJhbSBmbGFncyBmbGFncyBpbmRpY2F0aW5nIHdoaWNoIGFkb3JubWVudHMgYXJlIHRvIGJlIHJlbmRlcmVkLiBTZWUgPGNvZGU+c2V0QWRvcm5tZW50czwvY29kZT4KLQkgKiAJZm9yIHZhbGlkIHZhbHVlcy4KLQkgKiBAcGFyYW0gc2l6ZSB0aGUgc2l6ZSBvZiB0aGUgcmVzdWx0aW5nIGltYWdlCi0JICogQHNlZSAjc2V0QWRvcm5tZW50cyhpbnQpCi0JICovCi0JcHVibGljIE1ldGhvZEVsZW1lbnRJbWFnZURlc2NyaXB0b3IoSW1hZ2VEZXNjcmlwdG9yIGJhc2VJbWFnZSwgaW50IGZsYWdzLCBQb2ludCBzaXplKSB7Ci0JCWZCYXNlSW1hZ2U9IGJhc2VJbWFnZTsKLQkJQXNzZXJ0LmlzTm90TnVsbChmQmFzZUltYWdlKTsKLQkJZkZsYWdzPSBmbGFnczsKLQkJQXNzZXJ0LmlzVHJ1ZShmRmxhZ3MgPj0gMCk7Ci0JCWZTaXplPSBzaXplOwotCQlBc3NlcnQuaXNOb3ROdWxsKGZTaXplKTsKLQl9Ci0JCi0JLyoqCi0JICogU2V0cyB0aGUgZGVzY3JpcHRvcnMgYWRvcm5tZW50cy4gVmFsaWQgdmFsdWVzIGFyZTogPGNvZGU+QUJTVFJBQ1Q8L2NvZGU+LCA8Y29kZT5GSU5BTDwvY29kZT4sCi0JICogPGNvZGU+U1lOQ0hST05JWkVEPC9jb2RlPiwgPC9jb2RlPlNUQVRJQzxjb2RlPiwgPC9jb2RlPlJVTk5BQkxFPGNvZGU+LCA8L2NvZGU+V0FSTklORzxjb2RlPiwgCi0JICogPC9jb2RlPkVSUk9SPGNvZGU+LCA8L2NvZGU+T1ZFUlJJRERFUzxjb2RlPiwgPGNvZGU+SU1QTEVNRU5UUzwvY29kZT4sIDxjb2RlPkNPTlNUUlVDVE9SPC9jb2RlPiwKLQkgKiA8Y29kZT5ERVBSRUNBVEVEPC9jb2RlPiwgIG9yIGFueSBjb21iaW5hdGlvbiBvZiB0aG9zZS4KLQkgKiAKLQkgKiBAcGFyYW0gYWRvcm5tZW50cyB0aGUgaW1hZ2UgZGVzY3JpcHRvcnMgYWRvcm5tZW50cwotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFkb3JubWVudHMoaW50IGFkb3JubWVudHMpIHsKLQkJQXNzZXJ0LmlzVHJ1ZShhZG9ybm1lbnRzID49IDApOwotCQlmRmxhZ3M9IGFkb3JubWVudHM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY3VycmVudCBhZG9ybm1lbnRzLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGN1cnJlbnQgYWRvcm5tZW50cwotCSAqLwotCXB1YmxpYyBpbnQgZ2V0QWRyb25tZW50cygpIHsKLQkJcmV0dXJuIGZGbGFnczsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBzaXplIG9mIHRoZSBpbWFnZSBjcmVhdGVkIGJ5IGNhbGxpbmcgPGNvZGU+Y3JlYXRlSW1hZ2UoKTwvY29kZT4uCi0JICogCi0JICogQHBhcmFtIHNpemUgdGhlIHNpemUgb2YgdGhlIGltYWdlIHJldHVybmVkIGZyb20gY2FsbGluZyA8Y29kZT5jcmVhdGVJbWFnZSgpPC9jb2RlPgotCSAqIEBzZWUgSW1hZ2VEZXNjcmlwdG9yI2NyZWF0ZUltYWdlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJbWFnZVNpemUoUG9pbnQgc2l6ZSkgewotCQlBc3NlcnQuaXNOb3ROdWxsKHNpemUpOwotCQlBc3NlcnQuaXNUcnVlKHNpemUueCA+PSAwICYmIHNpemUueSA+PSAwKTsKLQkJZlNpemU9IHNpemU7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNpemUgb2YgdGhlIGltYWdlIGNyZWF0ZWQgYnkgY2FsbGluZyA8Y29kZT5jcmVhdGVJbWFnZSgpPC9jb2RlPi4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBzaXplIG9mIHRoZSBpbWFnZSBjcmVhdGVkIGJ5IGNhbGxpbmcgPGNvZGU+Y3JlYXRlSW1hZ2UoKTwvY29kZT4KLQkgKiBAc2VlIEltYWdlRGVzY3JpcHRvciNjcmVhdGVJbWFnZSgpCi0JICovCi0JcHVibGljIFBvaW50IGdldEltYWdlU2l6ZSgpIHsKLQkJcmV0dXJuIG5ldyBQb2ludChmU2l6ZS54LCBmU2l6ZS55KTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIE1ldGhvZCBkZWNsYXJlZCBpbiBDb21wb3NpdGVJbWFnZURlc2NyaXB0b3IKLQkgKi8KLQlwcm90ZWN0ZWQgUG9pbnQgZ2V0U2l6ZSgpIHsKLQkJcmV0dXJuIGZTaXplOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogTWV0aG9kIGRlY2xhcmVkIG9uIE9iamVjdC4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAob2JqZWN0ID09IG51bGwgfHwgIU1ldGhvZEVsZW1lbnRJbWFnZURlc2NyaXB0b3IuY2xhc3MuZXF1YWxzKG9iamVjdC5nZXRDbGFzcygpKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJCQotCQlNZXRob2RFbGVtZW50SW1hZ2VEZXNjcmlwdG9yIG90aGVyPSAoTWV0aG9kRWxlbWVudEltYWdlRGVzY3JpcHRvcilvYmplY3Q7Ci0JCXJldHVybiAoZkJhc2VJbWFnZS5lcXVhbHMob3RoZXIuZkJhc2VJbWFnZSkgJiYgZkZsYWdzID09IG90aGVyLmZGbGFncyAmJiBmU2l6ZS5lcXVhbHMob3RoZXIuZlNpemUpKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBPYmplY3QuCi0JICovCi0JcHVibGljIGludCBoYXNoQ29kZSgpIHsKLQkJcmV0dXJuIGZCYXNlSW1hZ2UuaGFzaENvZGUoKSB8IGZGbGFncyB8IGZTaXplLmhhc2hDb2RlKCk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBNZXRob2QgZGVjbGFyZWQgaW4gQ29tcG9zaXRlSW1hZ2VEZXNjcmlwdG9yCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZHJhd0NvbXBvc2l0ZUltYWdlKGludCB3aWR0aCwgaW50IGhlaWdodCkgewotCQlJbWFnZURhdGEgYmc9IGdldEltYWdlRGF0YShmQmFzZUltYWdlKTsKLQkJCQotCQkKLQkJZHJhd0ltYWdlKGJnLCAwLCAwKTsKLQkJCQkKLQkJZHJhd1RvcFJpZ2h0KCk7Ci0JCWRyYXdCb3R0b21SaWdodCgpOwotCQlkcmF3Qm90dG9tTGVmdCgpOwotCQkKLQotCX0KLQkKLQlwcml2YXRlIEltYWdlRGF0YSBnZXRJbWFnZURhdGEoSW1hZ2VEZXNjcmlwdG9yIGRlc2NyaXB0b3IpIHsKLQkJSW1hZ2VEYXRhIGRhdGE9IGRlc2NyaXB0b3IuZ2V0SW1hZ2VEYXRhKCk7IC8vIHNlZSBidWcgNTE5NjU6IGdldEltYWdlRGF0YSBjYW4gcmV0dXJuIG51bGwKLQkJaWYgKGRhdGEgPT0gbnVsbCkgewotCQkJZGF0YT0gREVGQVVMVF9JTUFHRV9EQVRBOwotCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKCJJbWFnZSBkYXRhIG5vdCBhdmFpbGFibGU6ICIgKyBkZXNjcmlwdG9yLnRvU3RyaW5nKCkpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIGRhdGE7Ci0JfQotCQotCQotCXByaXZhdGUgdm9pZCBkcmF3VG9wUmlnaHQoKSB7CQkKLQl9CQkKLQkKLQlwcml2YXRlIHZvaWQgZHJhd0JvdHRvbVJpZ2h0KCkgewotCX0JCQotCQotCXByaXZhdGUgdm9pZCBkcmF3Qm90dG9tTGVmdCgpIHsKLQkJUG9pbnQgc2l6ZT0gZ2V0U2l6ZSgpOwotCQlpbnQgeD0gMDsKLQkJaWYgKChmRmxhZ3MgJiBFUlJPUikgIT0gMCkgewotCQkJSW1hZ2VEYXRhIGRhdGE9IGdldEltYWdlRGF0YShBdXRob3JpbmdVSUltYWdlcy5JTUdfREVTQ19PVlJfRVJST1IpOwotCQkJZHJhd0ltYWdlKGRhdGEsIHgsIHNpemUueSAtIGRhdGEuaGVpZ2h0KTsKLQkJCXgrPSBkYXRhLndpZHRoOwotCQl9Ci0JfQkJCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2ludGVybmFsL1Byb2JsZW1NYXJrZXJNYW5hZ2VyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2ludGVybmFsL1Byb2JsZW1NYXJrZXJNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmMjIzMDQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9pbnRlcm5hbC9Qcm9ibGVtTWFya2VyTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlckRlbHRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YVZpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5MaXN0ZW5lckxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5JQW5ub3RhdGlvbk1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci0KLS8qKgotICogTGlzdGVucyB0byByZXNvdXJjZSBkZWx0YXMgYW5kIGZpbHRlcnMgZm9yIG1hcmtlciBjaGFuZ2VzIG9mIHR5cGUgSU1hcmtlci5QUk9CTEVNCi0gKiBWaWV3ZXJzIHNob3dpbmcgZXJyb3IgdGlja3Mgc2hvdWxkIHJlZ2lzdGVyIGFzIGxpc3RlbmVyIHRvCi0gKiB0aGlzIHR5cGUuCi0gKiAKLSAqIENvZGUgdGFrZW4gZnJvbSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwudWkudmlld3N1cHBvcnQuUHJvYmxlbU1hcmtlck1hbmFnZXIKLSAqLwotcHVibGljIGNsYXNzIFByb2JsZW1NYXJrZXJNYW5hZ2VyIGltcGxlbWVudHMgSVJlc291cmNlQ2hhbmdlTGlzdGVuZXIgewotCi0JLyoqCi0JICogVmlzaXRvcnMgdXNlZCB0byBsb29rIGlmIHRoZSBlbGVtZW50IGNoYW5nZSBkZWx0YSBjb250YWlucyBhIG1hcmtlciBjaGFuZ2UuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUHJvamVjdEVycm9yVmlzaXRvciBpbXBsZW1lbnRzIElSZXNvdXJjZURlbHRhVmlzaXRvciB7Ci0KLQkJcHJpdmF0ZSBIYXNoU2V0PElSZXNvdXJjZT4gZkNoYW5nZWRFbGVtZW50czsgCi0JCQotCQlwdWJsaWMgUHJvamVjdEVycm9yVmlzaXRvcihIYXNoU2V0PElSZXNvdXJjZT4gY2hhbmdlZEVsZW1lbnRzKSB7Ci0JCQlmQ2hhbmdlZEVsZW1lbnRzPSBjaGFuZ2VkRWxlbWVudHM7Ci0JCX0KLQkJCQotCQlwdWJsaWMgYm9vbGVhbiB2aXNpdChJUmVzb3VyY2VEZWx0YSBkZWx0YSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkJSVJlc291cmNlIHJlcz0gZGVsdGEuZ2V0UmVzb3VyY2UoKTsKLQkJCWlmIChyZXMgaW5zdGFuY2VvZiBJUHJvamVjdCAmJiBkZWx0YS5nZXRLaW5kKCkgPT0gSVJlc291cmNlRGVsdGEuQ0hBTkdFRCkgewotCQkJCUlQcm9qZWN0IHByb2plY3Q9IChJUHJvamVjdCkgcmVzOwotCQkJCWlmICghcHJvamVjdC5pc0FjY2Vzc2libGUoKSkgewotCQkJCQkvLyBvbmx5IHRyYWNrIG9wZW4gSmF2YSBwcm9qZWN0cwotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJfQotCQkJY2hlY2tJbnZhbGlkYXRlKGRlbHRhLCByZXMpOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJCi0JCXByaXZhdGUgdm9pZCBjaGVja0ludmFsaWRhdGUoSVJlc291cmNlRGVsdGEgZGVsdGEsIElSZXNvdXJjZSByZXNvdXJjZSkgewotCQkJaW50IGtpbmQ9IGRlbHRhLmdldEtpbmQoKTsKLQkJCWlmIChraW5kID09IElSZXNvdXJjZURlbHRhLlJFTU9WRUQgfHwga2luZCA9PSBJUmVzb3VyY2VEZWx0YS5BRERFRCB8fCAoa2luZCA9PSBJUmVzb3VyY2VEZWx0YS5DSEFOR0VEICYmIGlzRXJyb3JEZWx0YShkZWx0YSkpKSB7Ci0JCQkJLy8gaW52YWxpZGF0ZSB0aGUgcmVzb3VyY2UgYW5kIGFsbCBwYXJlbnRzCi0JCQkJd2hpbGUgKHJlc291cmNlLmdldFR5cGUoKSAhPSBJUmVzb3VyY2UuUk9PVCAmJiBmQ2hhbmdlZEVsZW1lbnRzLmFkZChyZXNvdXJjZSkpIHsKLQkJCQkJcmVzb3VyY2U9IHJlc291cmNlLmdldFBhcmVudCgpOwotCQkJCX0KLQkJCX0gCi0JCX0JCi0JCQotCQlwcml2YXRlIGJvb2xlYW4gaXNFcnJvckRlbHRhKElSZXNvdXJjZURlbHRhIGRlbHRhKSB7CQotCQkJaWYgKChkZWx0YS5nZXRGbGFncygpICYgSVJlc291cmNlRGVsdGEuTUFSS0VSUykgIT0gMCkgewotCQkJCUlNYXJrZXJEZWx0YVtdIG1hcmtlckRlbHRhcz0gZGVsdGEuZ2V0TWFya2VyRGVsdGFzKCk7Ci0JCQkJZm9yIChpbnQgaT0gMDsgaSA8IG1hcmtlckRlbHRhcy5sZW5ndGg7IGkrKykgewotCQkJCQlpZiAobWFya2VyRGVsdGFzW2ldLmlzU3VidHlwZU9mKElNYXJrZXIuUFJPQkxFTSkpIHsKLQkJCQkJCWludCBraW5kPSBtYXJrZXJEZWx0YXNbaV0uZ2V0S2luZCgpOwotCQkJCQkJaWYgKGtpbmQgPT0gSVJlc291cmNlRGVsdGEuQURERUQgfHwga2luZCA9PSBJUmVzb3VyY2VEZWx0YS5SRU1PVkVEKQotCQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQkJaW50IHNldmVyaXR5PSBtYXJrZXJEZWx0YXNbaV0uZ2V0QXR0cmlidXRlKElNYXJrZXIuU0VWRVJJVFksIC0xKTsKLQkJCQkJCWludCBuZXdTZXZlcml0eT0gbWFya2VyRGVsdGFzW2ldLmdldE1hcmtlcigpLmdldEF0dHJpYnV0ZShJTWFya2VyLlNFVkVSSVRZLCAtMSk7Ci0JCQkJCQlpZiAobmV3U2V2ZXJpdHkgIT0gc2V2ZXJpdHkpCi0JCQkJCQkJcmV0dXJuIHRydWU7IAotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBMaXN0ZW5lckxpc3QgZkxpc3RlbmVyczsKLQkKLQkKLQlwdWJsaWMgUHJvYmxlbU1hcmtlck1hbmFnZXIoKSB7Ci0JCWZMaXN0ZW5lcnM9IG5ldyBMaXN0ZW5lckxpc3QoKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSVJlc291cmNlQ2hhbmdlTGlzdGVuZXIjcmVzb3VyY2VDaGFuZ2VkCi0JICovCQotCXB1YmxpYyB2b2lkIHJlc291cmNlQ2hhbmdlZChJUmVzb3VyY2VDaGFuZ2VFdmVudCBldmVudCkgewotCQlIYXNoU2V0PElSZXNvdXJjZT4gY2hhbmdlZEVsZW1lbnRzPSBuZXcgSGFzaFNldDxJUmVzb3VyY2U+KCk7Ci0JCQotCQl0cnkgewotCQkJSVJlc291cmNlRGVsdGEgZGVsdGE9IGV2ZW50LmdldERlbHRhKCk7Ci0JCQlpZiAoZGVsdGEgIT0gbnVsbCkKLQkJCQlkZWx0YS5hY2NlcHQobmV3IFByb2plY3RFcnJvclZpc2l0b3IoY2hhbmdlZEVsZW1lbnRzKSk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQl9Ci0KLQkJaWYgKCFjaGFuZ2VkRWxlbWVudHMuaXNFbXB0eSgpKSB7Ci0JCQlJUmVzb3VyY2VbXSBjaGFuZ2VzPSAoSVJlc291cmNlW10pIGNoYW5nZWRFbGVtZW50cy50b0FycmF5KG5ldyBJUmVzb3VyY2VbY2hhbmdlZEVsZW1lbnRzLnNpemUoKV0pOwotCQkJZmlyZUNoYW5nZXMoY2hhbmdlcywgdHJ1ZSk7Ci0JCX0KLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgSUFubm90YXRpb25Nb2RlbExpc3RlbmVyI21vZGVsQ2hhbmdlZChJQW5ub3RhdGlvbk1vZGVsKQotCSAqLwotCXB1YmxpYyB2b2lkIG1vZGVsQ2hhbmdlZChJQW5ub3RhdGlvbk1vZGVsIG1vZGVsKSB7Ci0JCS8vIG5vIGFjdGlvbgotCX0JCi0JCi0JLyoqCi0JICogQWRkcyBhIGxpc3RlbmVyIGZvciBwcm9ibGVtIG1hcmtlciBjaGFuZ2VzLgotCSAqLwotCXB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKElQcm9ibGVtQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWlmIChmTGlzdGVuZXJzLmlzRW1wdHkoKSkgeyAKLQkJCVJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5hZGRSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKHRoaXMpOwotCQl9Ci0JCWZMaXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmVzIGEgPGNvZGU+SVByb2JsZW1DaGFuZ2VkTGlzdGVuZXI8L2NvZGU+LgotCSAqLwkKLQlwdWJsaWMgdm9pZCByZW1vdmVMaXN0ZW5lcihJUHJvYmxlbUNoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlmTGlzdGVuZXJzLnJlbW92ZShsaXN0ZW5lcik7Ci0JCWlmIChmTGlzdGVuZXJzLmlzRW1wdHkoKSkgewotCQkJUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLnJlbW92ZVJlc291cmNlQ2hhbmdlTGlzdGVuZXIodGhpcyk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGZpcmVDaGFuZ2VzKGZpbmFsIElSZXNvdXJjZVtdIGNoYW5nZXMsIGZpbmFsIGJvb2xlYW4gaXNNYXJrZXJDaGFuZ2UpIHsKLQkJRGlzcGxheSBkaXNwbGF5PSBEaXNwbGF5LmdldEN1cnJlbnQoKTsKLQkJaWYgKGRpc3BsYXkgIT0gbnVsbCAmJiAhZGlzcGxheS5pc0Rpc3Bvc2VkKCkpIHsKLQkJCWRpc3BsYXkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7CQkKLQkJCQkJT2JqZWN0W10gbGlzdGVuZXJzPSBmTGlzdGVuZXJzLmdldExpc3RlbmVycygpOwotCQkJCQlmb3IgKGludCBpPSAwOyBpIDwgbGlzdGVuZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQlJUHJvYmxlbUNoYW5nZWRMaXN0ZW5lciBjdXJyPSAoSVByb2JsZW1DaGFuZ2VkTGlzdGVuZXIpIGxpc3RlbmVyc1tpXTsKLQkJCQkJCWN1cnIucHJvYmxlbXNDaGFuZ2VkKGNoYW5nZXMsIGlzTWFya2VyQ2hhbmdlKTsKLQkJCQkJfQkKLQkJCQl9Ci0JCQl9KTsKLQkJfQkKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvaW50ZXJuYWwvd2l6YXJkcy9OZXdMaWJyYXJ5TWFpblBhZ2UyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2ludGVybmFsL3dpemFyZHMvTmV3TGlicmFyeU1haW5QYWdlMi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmY2E1MWJmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvaW50ZXJuYWwvd2l6YXJkcy9OZXdMaWJyYXJ5TWFpblBhZ2UyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5pbnRlcm5hbC53aXphcmRzOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeU1hbmFnZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLndpemFyZHMuTmV3TGlicmFyeVdpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkud2l6YXJkcy5OZXdMaWJyYXJ5V2l6YXJkUGFnZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLQotLyoqCi0gKiBBIHdpemFyZCBwYWdlIHRoYXQgcHJvbXB0cyB0aGUgdXNlciB0byBlbnRlciB0aGUgbmFtZSwgYnJpZWYgZGVzY3JpcHRpb24gYW5kCi0gKiB0eXBlIGZvciBhIG5ldyBtZXRob2QgbGlicmFyeS4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4yCi0gKiBAZGVwcmVjYXRlZAotICovCi1wdWJsaWMgY2xhc3MgTmV3TGlicmFyeU1haW5QYWdlMiBleHRlbmRzIFdpemFyZFBhZ2UgewotCi0JLyoqCi0JICogVGhlIHdpemFyZCBwYWdlIG5hbWUuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFHRV9OQU1FID0gTmV3TGlicmFyeU1haW5QYWdlMi5jbGFzcwotCQkJLmdldE5hbWUoKTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUWVBFX0lEID0gInR5cGVJZCI7IC8vJE5PTi1OTFMtMSQJCi0KLQlwcml2YXRlIFRleHQgbmFtZVRleHQ7Ci0KLQlwcml2YXRlIFRleHQgYnJpZWZEZXNjVGV4dDsKLQotCXByaXZhdGUgQnV0dG9uW10gcmFkaW9CdXR0b25zOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgTmV3TGlicmFyeU1haW5QYWdlMigpIHsKLQkJc3VwZXIoUEFHRV9OQU1FKTsKLQkJc2V0VGl0bGUoQXV0aG9yaW5nVUlSZXNvdXJjZXMubmV3TGlicmFyeVdpemFyZE1haW5QYWdlX3RpdGxlKTsKLQkJc2V0RGVzY3JpcHRpb24oQXV0aG9yaW5nVUlSZXNvdXJjZXMubmV3TGlicmFyeVdpemFyZE1haW5QYWdlX2Rlc2NyaXB0aW9uKTsKLQkJc2V0SW1hZ2VEZXNjcmlwdG9yKEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoCi0JCQkJImZ1bGwvd2l6YmFuL05ldy5naWYiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ1BhZ2UjY3JlYXRlQ29udHJvbChDb21wb3NpdGUpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDMsIGZhbHNlKSk7Ci0KLQkJTGFiZWwgbmFtZUxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PUk1BTCk7Ci0JCW5hbWVMYWJlbC5zZXRUZXh0KEF1dGhvcmluZ1VJVGV4dC5OQU1FX1RFWFQpOwotCi0JCW5hbWVUZXh0ID0gbmV3IFRleHQoY29tcG9zaXRlLCBTV1QuQk9SREVSKTsKLQkJbmFtZVRleHQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCSgoR3JpZERhdGEpIG5hbWVUZXh0LmdldExheW91dERhdGEoKSkuaG9yaXpvbnRhbFNwYW4gPSAyOwotCi0JCUxhYmVsIGJyaWVmRGVzY0xhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PUk1BTCk7Ci0JCWJyaWVmRGVzY0xhYmVsLnNldFRleHQoQXV0aG9yaW5nVUlUZXh0LkRFU0NSSVBUSU9OX1RFWFQpOwotCi0JCWJyaWVmRGVzY1RleHQgPSBuZXcgVGV4dChjb21wb3NpdGUsIFNXVC5CT1JERVIgfCBTV1QuTVVMVEkgfCBTV1QuV1JBUAotCQkJCXwgU1dULlZfU0NST0xMKTsKLQkJYnJpZWZEZXNjVGV4dC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJKChHcmlkRGF0YSkgYnJpZWZEZXNjVGV4dC5nZXRMYXlvdXREYXRhKCkpLmhvcml6b250YWxTcGFuID0gMjsKLQkJKChHcmlkRGF0YSkgYnJpZWZEZXNjVGV4dC5nZXRMYXlvdXREYXRhKCkpLmhlaWdodEhpbnQgPSA3MDsKLQkJKChHcmlkRGF0YSkgYnJpZWZEZXNjVGV4dC5nZXRMYXlvdXREYXRhKCkpLndpZHRoSGludCA9IDQ4MDsKLQotCQlMYWJlbCBsaWJyYXJ5VHlwZUxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PUk1BTCk7Ci0JCWxpYnJhcnlUeXBlTGFiZWwuc2V0VGV4dChBdXRob3JpbmdVSVJlc291cmNlcy5saWJyYXJ5VHlwZUxhYmVsX3RleHQpOwotCi0JCUNvbXBvc2l0ZSB0eXBlQ29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShjb21wb3NpdGUsIFNXVC5OT1JNQUwpOwotCQl0eXBlQ29tcG9zaXRlLnNldExheW91dChuZXcgR3JpZExheW91dCgyLCBmYWxzZSkpOwotCQl0eXBlQ29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCi0JCU1hcCB0eXBlcyA9IExpYnJhcnlNYW5hZ2VyRmFjdG9yeS5nZXRJbnN0YW5jZSgpLmdldExpYnJhcnlUeXBlcygpOwotCQlyYWRpb0J1dHRvbnMgPSBuZXcgQnV0dG9uW3R5cGVzLnNpemUoKV07Ci0JCWludCByYWRpb0J1dHRvbkluZGV4ID0gMDsKLQkJZm9yIChJdGVyYXRvciBpdCA9IHR5cGVzLmtleVNldCgpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCVN0cmluZyB0eXBlSWQgPSAoU3RyaW5nKSBpdC5uZXh0KCk7Ci0JCQlTdHJpbmcgdHlwZU5hbWUgPSAoU3RyaW5nKSB0eXBlcy5nZXQodHlwZUlkKTsKLQkJCUJ1dHRvbiByYWRpb0J1dHRvbiA9IG5ldyBCdXR0b24odHlwZUNvbXBvc2l0ZSwgU1dULlJBRElPKTsKLQkJCXJhZGlvQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJCXNldFBhZ2VDb21wbGV0ZShpc1BhZ2VDb21wbGV0ZSgpKTsKLQkJCQkJZ2V0V2l6YXJkKCkuZ2V0Q29udGFpbmVyKCkudXBkYXRlQnV0dG9ucygpOwotCQkJCX0KLQkJCX0pOwotCQkJcmFkaW9CdXR0b24uc2V0VGV4dCh0eXBlTmFtZSk7Ci0JCQlyYWRpb0J1dHRvbi5zZXREYXRhKFRZUEVfSUQsIHR5cGVJZCk7Ci0JCQlyYWRpb0J1dHRvbnNbcmFkaW9CdXR0b25JbmRleCsrXSA9IHJhZGlvQnV0dG9uOwotCQl9Ci0KLQkJaWYgKHJhZGlvQnV0dG9ucy5sZW5ndGggPiAwKSB7Ci0JCQlyYWRpb0J1dHRvbnNbMF0uc2V0U2VsZWN0aW9uKHRydWUpOwotCQl9Ci0KLQkJYWRkTGlzdGVuZXJzKCk7Ci0KLQkJc2V0UGFnZUNvbXBsZXRlKGlzUGFnZUNvbXBsZXRlKCkpOwotCi0JCXNldENvbnRyb2woY29tcG9zaXRlKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlI2dldE5leHRQYWdlKCkKLQkgKi8KLQlwdWJsaWMgSVdpemFyZFBhZ2UgZ2V0TmV4dFBhZ2UoKSB7Ci0JCU5ld0xpYnJhcnlXaXphcmRQYWdlIHdpemFyZFBhZ2UgPSBOZXdMaWJyYXJ5V2l6YXJkUGFnZUZhY3RvcnkKLQkJCQkuZ2V0SW5zdGFuY2UoKS5nZXRXaXphcmRQYWdlKGdldExpYnJhcnlUeXBlKCkpOwotCQlpZiAod2l6YXJkUGFnZSAhPSBudWxsKSB7Ci0JCQl3aXphcmRQYWdlLm9uRW50ZXJQYWdlKGdldExpYnJhcnlOYW1lKCkpOwotCQl9Ci0JCXJldHVybiB3aXphcmRQYWdlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2UjaXNDb21wbGV0ZWQoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUGFnZUNvbXBsZXRlKCkgewotCQlyZXR1cm4gZ2V0TGlicmFyeU5hbWUoKS5sZW5ndGgoKSA+IDA7Ci0JfQotCi0JLyoqCi0JICogQWRkcyBsaXN0ZW5lcnMgdG8gdGhlIHdpemFyZCBjb250cm9scy4KLQkgKi8KLQlwcml2YXRlIHZvaWQgYWRkTGlzdGVuZXJzKCkgewotCQluYW1lVGV4dC5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJCQlzZXRQYWdlQ29tcGxldGUoaXNQYWdlQ29tcGxldGUoKSk7Ci0JCQkJZ2V0V2l6YXJkKCkuZ2V0Q29udGFpbmVyKCkudXBkYXRlQnV0dG9ucygpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBsaWJyYXJ5IG5hbWUuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMaWJyYXJ5TmFtZSgpIHsKLQkJcmV0dXJuIG5hbWVUZXh0LmdldFRleHQoKS50cmltKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbGlicmFyeSB0eXBlIHNlbGVjdGVkIGJ5IHRoZSB1c2VyLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TGlicmFyeVR5cGUoKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmFkaW9CdXR0b25zLmxlbmd0aDsgaSsrKSB7Ci0JCQlCdXR0b24gcmFkaW9CdXR0b24gPSByYWRpb0J1dHRvbnNbaV07Ci0JCQlpZiAocmFkaW9CdXR0b24uZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCQlyZXR1cm4gKFN0cmluZykgcmFkaW9CdXR0b24uZ2V0RGF0YShUWVBFX0lEKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gKFN0cmluZykgcmFkaW9CdXR0b25zWzBdLmdldERhdGEoVFlQRV9JRCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2ludGVybmFsL3dpemFyZHMvTmV3TGlicmFyeVdpemFyZDIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvaW50ZXJuYWwvd2l6YXJkcy9OZXdMaWJyYXJ5V2l6YXJkMi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYzdkMjFlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvaW50ZXJuYWwvd2l6YXJkcy9OZXdMaWJyYXJ5V2l6YXJkMi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuaW50ZXJuYWwud2l6YXJkczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nUGVyc3BlY3RpdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkud2l6YXJkcy5OZXdMaWJyYXJ5TWFpblBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS53aXphcmRzLlNhdmVBbGxFZGl0b3JzUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpLnV0aWwuUGVyc3BlY3RpdmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlNYW5hZ2VyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5MaWJyYXJ5VUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkucHJlZmVyZW5jZXMuTGlicmFyeVVJUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkud2l6YXJkcy5OZXdMaWJyYXJ5V2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS53aXphcmRzLk5ld0xpYnJhcnlXaXphcmRQYWdlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSU5ld1dpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotCi0vKioKLSAqIEEgd2l6YXJkIHRoYXQgZ3VpZGVzIHRoZSB1c2VyIHRvIGNyZWF0ZSBhIG5ldyBtZXRob2QgbGlicmFyeS4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4yCi0gKiBAZGVwcmVjYXRlZAotICovCi1wdWJsaWMgY2xhc3MgTmV3TGlicmFyeVdpemFyZDIgZXh0ZW5kcyBXaXphcmQgaW1wbGVtZW50cyBJTmV3V2l6YXJkIHsKLQotCS8qKgotCSAqIFRoZSB3aXphcmQgSUQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0laQVJEX0lEID0gTmV3TGlicmFyeVdpemFyZDIuY2xhc3MuZ2V0TmFtZSgpOwotCi0JLy8gVGhlIG1haW4gd2l6YXJkIHBhZ2UuCi0JcHJpdmF0ZSBOZXdMaWJyYXJ5TWFpblBhZ2UgbWFpblBhZ2U7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBOZXdMaWJyYXJ5V2l6YXJkMigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaXphcmQjaW5pdChJV29ya2JlbmNoLAotCSAqICAgICAgSVN0cnVjdHVyZWRTZWxlY3Rpb24pCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoIHdvcmtiZW5jaCwgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCXNldFdpbmRvd1RpdGxlKEF1dGhvcmluZ1VJUmVzb3VyY2VzLm5ld0xpYnJhcnlXaXphcmRfdGl0bGUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZCNhZGRQYWdlcygpCi0JICovCi0JcHVibGljIHZvaWQgYWRkUGFnZXMoKSB7Ci0JCVNhdmVBbGxFZGl0b3JzUGFnZS5hZGRQYWdlSWZOZWVkZWQodGhpcywgdHJ1ZSwgbnVsbCwgbnVsbCwgbnVsbCk7Ci0JCW1haW5QYWdlID0gbmV3IE5ld0xpYnJhcnlNYWluUGFnZSgpOwotCQlhZGRQYWdlKG1haW5QYWdlKTsKLQotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gTGlicmFyeU1hbmFnZXJGYWN0b3J5LmdldEluc3RhbmNlKCkKLQkJCQkuZ2V0TGlicmFyeVR5cGVzKCkua2V5U2V0KCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJU3RyaW5nIHBlcnNpc3RlbmNlSWQgPSAoU3RyaW5nKSBpdC5uZXh0KCk7Ci0JCQlTdHJpbmcgcGFnZUlkID0gcGVyc2lzdGVuY2VJZCArICJQYWdlIjsgLy8kTk9OLU5MUy0xJAotCQkJTmV3TGlicmFyeVdpemFyZFBhZ2UgcGFnZSA9IE5ld0xpYnJhcnlXaXphcmRQYWdlRmFjdG9yeQotCQkJCQkuZ2V0SW5zdGFuY2UoKS5jcmVhdGVXaXphcmRQYWdlKHBhZ2VJZCwgcGVyc2lzdGVuY2VJZCk7Ci0JCQlpZiAocGFnZSAhPSBudWxsKSB7Ci0JCQkJcGFnZS5zZXRJbWFnZURlc2NyaXB0b3IoQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpCi0JCQkJCQkuZ2V0SW1hZ2VEZXNjcmlwdG9yKCJmdWxsL3dpemJhbi9OZXcuZ2lmIikpOyAvLyROT04tTkxTLTEkCQkJCQkKLQkJCQlhZGRQYWdlKHBhZ2UpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkI2NyZWF0ZVBhZ2VDb250cm9scyhDb21wb3NpdGUpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlUGFnZUNvbnRyb2xzKENvbXBvc2l0ZSBwYWdlQ29udGFpbmVyKSB7Ci0JCXN1cGVyLmNyZWF0ZVBhZ2VDb250cm9scyhwYWdlQ29udGFpbmVyKTsKLQkJcGFnZUNvbnRhaW5lci5nZXRTaGVsbCgpLnNldEltYWdlKAotCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRTaGFyZWRJbWFnZSgKLQkJCQkJCSJmdWxsL29iajE2L01ldGhvZExpYnJhcnkuZ2lmIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkI2NhbkZpbmlzaCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2FuRmluaXNoKCkgewotCQlJV2l6YXJkUGFnZVtdIHBhZ2VzID0gZ2V0UGFnZXMoKTsKLQkJZm9yIChpbnQgaSA9IDE7IGkgPCBwYWdlcy5sZW5ndGg7IGkrKykgewotCQkJaWYgKCFwYWdlc1tpXS5pc1BhZ2VDb21wbGV0ZSgpKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0JCXJldHVybiBnZXRDb250YWluZXIoKS5nZXRDdXJyZW50UGFnZSgpICE9IG1haW5QYWdlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZCNwZXJmb3JtRmluaXNoKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtRmluaXNoKCkgewotCQlTdHJpbmcgbmFtZSA9IG1haW5QYWdlLmdldExpYnJhcnlOYW1lKCk7Ci0JCVN0cmluZyB0eXBlID0gbWFpblBhZ2UuZ2V0TGlicmFyeVR5cGUoKTsKLQkJTmV3TGlicmFyeVdpemFyZFBhZ2UgcGFnZSA9IE5ld0xpYnJhcnlXaXphcmRQYWdlRmFjdG9yeS5nZXRJbnN0YW5jZSgpCi0JCQkJLmdldFdpemFyZFBhZ2UodHlwZSk7Ci0JCXRyeSB7Ci0JCQlNZXRob2RMaWJyYXJ5IGxpYnJhcnkgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJCS5jcmVhdGVNZXRob2RMaWJyYXJ5KG5hbWUsIHR5cGUsIHBhZ2UuZ2V0U2VsZWN0aW9ucygpKTsKLQkJCWlmIChsaWJyYXJ5ICE9IG51bGwpIHsKLQkJCQlhZGRSZWNlbnRseU9wZW5lZExpYnJhcnkobGlicmFyeSk7Ci0JCQkJUGVyc3BlY3RpdmVVdGlsCi0JCQkJCQkub3BlblBlcnNwZWN0aXZlKEF1dGhvcmluZ1BlcnNwZWN0aXZlLlBFUlNQRUNUSVZFX0lEKTsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVN0cmluZyByZWFzb24gPSBlLmdldE1lc3NhZ2UoKTsKLQkJCWlmIChyZWFzb24gPT0gbnVsbCkgewotCQkJCXJlYXNvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLm5ld0xpYnJhcnlJbnRlcm5sRXJyb3JfcmVhc29uOwotCQkJfQotCQkJcmVhc29uICs9ICJcblxuIiArIEF1dGhvcmluZ1VJUmVzb3VyY2VzLm5ld0xpYnJhcnlFcnJvcl9hZHZpY2U7ICAvLyROT04tTkxTLTEkCi0JCQlpZiAoZS5nZXRNZXNzYWdlKCkgIT0gbnVsbCkgewotCQkJCUxpYnJhcnlVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkuZGlzcGxheUVycm9yKAotCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMubmV3TGlicmFyeVdpemFyZF90aXRsZSwKLQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLm5ld0xpYnJhcnlFcnJvcl9tc2csIHJlYXNvbik7Ci0JCQl9IGVsc2UgewotCQkJCUxpYnJhcnlVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkuZGlzcGxheUVycm9yKAotCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMubmV3TGlicmFyeVdpemFyZF90aXRsZSwKLQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLm5ld0xpYnJhcnlFcnJvcl9tc2csIHJlYXNvbiwgZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEFkZHMgdGhlIG5ld2x5IG9wZW5lZCBvciBjcmVhdGVkIG1ldGhvZCBsaWJyYXJ5IHRvIHRoZSByZWNlbnRseSBvcGVuZWQKLQkgKiBtZXRob2QgbGlicmFyaWVzIHByZWZlcmVuY2UuCi0JICogCi0JICogQHBhcmFtIGxpYnJhcnkKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGxpYnJhcnkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRSZWNlbnRseU9wZW5lZExpYnJhcnkoTWV0aG9kTGlicmFyeSBsaWJyYXJ5KSB7Ci0JCWlmIChsaWJyYXJ5ICE9IG51bGwpIHsKLQkJCVN0cmluZyBsaWJyYXJ5VVJJID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRMaWJyYXJ5TWFuYWdlcigKLQkJCQkJbGlicmFyeSkuZ2V0TWV0aG9kTGlicmFyeVVSSSgpLnRvU3RyaW5nKCk7Ci0JCQlMaWJyYXJ5VUlQcmVmZXJlbmNlcy5hZGRPcGVuTGlicmFyeVVSSShsaWJyYXJ5VVJJKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wYWNrYWdlLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmFlYmIwMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIFVJIHNlcnZpY2VzIGZvciB0aGUgQXV0aG9yaW5nIGFuZCBCcm93c2luZyBwZXJzcGVjdGl2ZXMuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcmVmZXJlbmNlcy9BcHBsaWNhdGlvblByZWZlcmVuY2VDb25zdGFudHMuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJlZmVyZW5jZXMvQXBwbGljYXRpb25QcmVmZXJlbmNlQ29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4MDVlZWYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcmVmZXJlbmNlcy9BcHBsaWNhdGlvblByZWZlcmVuY2VDb25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJlZmVyZW5jZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5MaWJyYXJ5RWRpdENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wcmVmcy5QcmVmZXJlbmNlQ29uc3RhbnRzOwotCi0vKioKLSAqIAotICogUHJlZmVyZW5jZSBjb25zdGFudHMgZm9yIGFwcGxpY2F0aW9uCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgQXBwbGljYXRpb25QcmVmZXJlbmNlQ29uc3RhbnRzIGltcGxlbWVudHMgUHJlZmVyZW5jZUNvbnN0YW50cyB7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRl9FTkFCTEVfUFJPQ0VTU19DT05UUklCVVRJT04gPSBMaWJyYXJ5RWRpdENvbnN0YW50cy5QUkVGX0VOQUJMRV9QUk9DRVNTX0NPTlRSSUJVVElPTjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZfSU5IRVJJVF9TVVBQUkVTU0lPTl9TVEFURSA9IExpYnJhcnlFZGl0Q29uc3RhbnRzLlBSRUZfSU5IRVJJVF9TVVBQUkVTU0lPTl9TVEFURTsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGX0xJQl9WSUVXX0xBWU9VVCA9ICJsYXlvdXQiOyAvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRl9MSUJfVklFV19ETkRfREVGQVVMVF9MSU5LVFlQRSA9ICJsaWJWaWV3RE5ERGVmYXVsdExpbmtUeXBlIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogU2F2ZXMgdGhlIFVSSSBvZiB0aGUgbWV0aG9kIGxpYnJhcnkgdGhhdCB3YXMgb3BlbmVkIGluIHRoZSBsYXN0IHNlc3Npb24uCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldExheW91dChTdHJpbmcgdmFsdWUpIHsKLQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpLnNldFZhbHVlKAotCQkJCVBSRUZfTElCX1ZJRVdfTEFZT1VULCB2YWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgdHlwZSBvZiB0aGUgbWV0aG9kIGxpYnJhcnkgdGhhdCB3YXMgb3BlbmVkIGluIHRoZSBsYXN0IHNlc3Npb24uCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TGF5b3V0KCkgewotCQlyZXR1cm4gQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpLmdldFN0cmluZygKLQkJCQlQUkVGX0xJQl9WSUVXX0xBWU9VVCk7Ci0JfQotCi0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJlZmVyZW5jZXMvQXV0aG9yaW5nUHJlZmVyZW5jZUluaXRpYWxpemVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3ByZWZlcmVuY2VzL0F1dGhvcmluZ1ByZWZlcmVuY2VJbml0aWFsaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZTBhZDE4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJlZmVyZW5jZXMvQXV0aG9yaW5nUHJlZmVyZW5jZUluaXRpYWxpemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByZWZlcmVuY2VzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLkFic3RyYWN0UHJlZmVyZW5jZUluaXRpYWxpemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLlByb2Nlc3NFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotCi0KLS8qKgotICogUHJlZmVyZW5jZUluaXRpYWxpemVyIGZvciBBdXRob3JpbmdQbHVnaW4uCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBBdXRob3JpbmdQcmVmZXJlbmNlSW5pdGlhbGl6ZXIgZXh0ZW5kcwotCQlBYnN0cmFjdFByZWZlcmVuY2VJbml0aWFsaXplciB7Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5BYnN0cmFjdFByZWZlcmVuY2VJbml0aWFsaXplciNpbml0aWFsaXplRGVmYXVsdFByZWZlcmVuY2VzKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplRGVmYXVsdFByZWZlcmVuY2VzKCkgewotCQlJUHJlZmVyZW5jZVN0b3JlIHN0b3JlID0gQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpCi0JCQkJLmdldFByZWZlcmVuY2VTdG9yZSgpOwotCi0JCS8vIFdlIGRvbid0IG5lZWQgaXQgaGVyZS4gSXQncyBiZWVuIG1vdmVkIHRvIGxpYnJhcnlQbHVnaW4KLS8vCQlzdG9yZS5zZXREZWZhdWx0KEFwcGxpY2F0aW9uUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX1dCU19DT0xVTU5TLAotLy8JCQkJUHJvY2Vzc0VkaXRvclByZWZlcmVuY2VQYWdlCi0vLwkJCQkJCS50b1N0cmluZyhQcm9jZXNzRWRpdG9yLkRFRkFVTFRfV0JTX0NPTFVNTlMpKTsKLS8vCQlzdG9yZS5zZXREZWZhdWx0KEFwcGxpY2F0aW9uUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX1RCU19DT0xVTU5TLAotLy8JCQkJUHJvY2Vzc0VkaXRvclByZWZlcmVuY2VQYWdlCi0vLwkJCQkJCS50b1N0cmluZyhQcm9jZXNzRWRpdG9yLkRFRkFVTFRfVEJTX0NPTFVNTlMpKTsKLS8vCQlzdG9yZS5zZXREZWZhdWx0KEFwcGxpY2F0aW9uUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX1dQQlNfQ09MVU1OUywKLS8vCQkJCVByb2Nlc3NFZGl0b3JQcmVmZXJlbmNlUGFnZQotLy8JCQkJCQkudG9TdHJpbmcoUHJvY2Vzc0VkaXRvci5ERUZBVUxUX1dQQlNfQ09MVU1OUykpOwotLy8JCXN0b3JlLnNldERlZmF1bHQoCi0vLwkJCQlBcHBsaWNhdGlvblByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9JTkhFUklUX1NVUFBSRVNTSU9OX1NUQVRFLAotLy8JCQkJdHJ1ZSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3ByZWZlcmVuY2VzL0F1dGhvcmluZ1ByZWZlcmVuY2VQYWdlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3ByZWZlcmVuY2VzL0F1dGhvcmluZ1ByZWZlcmVuY2VQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkMTZkYjQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcmVmZXJlbmNlcy9BdXRob3JpbmdQcmVmZXJlbmNlUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzI1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJlZmVyZW5jZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLkVkaXRvckNob29zZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS51dGlsLkNvbW1vblByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuU3RyVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wcmVmZXJlbmNlcy5MaWJyYXJ5UHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuTGlicmFyeVVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLnByZWZlcmVuY2VzLkxpYnJhcnlVSVByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51aS5wcmVmZXJlbmNlcy5CYXNlUHJlZmVyZW5jZVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpcmVjdG9yeURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci0KLS8qKgotICogVGhlIEF1dGhvcmluZyBwcmVmZXJlbmNlIHBhZ2UuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjIKLSAqLwotcHVibGljIGNsYXNzIEF1dGhvcmluZ1ByZWZlcmVuY2VQYWdlIGV4dGVuZHMgQmFzZVByZWZlcmVuY2VQYWdlIGltcGxlbWVudHMKLQkJTW9kaWZ5TGlzdGVuZXIgewotCi0JcHJpdmF0ZSBzdGF0aWMgaW50IE1JTl9QUkVGRVJFTkNFX0hJU1RPUllfU0laRSA9IDE7Ci0KLQlwcml2YXRlIHN0YXRpYyBpbnQgTUFYX1BSRUZFUkVOQ0VfSElTVE9SWV9TSVpFID0gMjA7Ci0KLQlwcml2YXRlIENvbXBvc2l0ZSBjb21wb3NpdGU7Ci0KLQlwcml2YXRlIFRleHQgZGVmYXVsdExpYnJhcnlQYXRoVGV4dDsKLQotCXByaXZhdGUgQnV0dG9uIGJyb3dzZUJ1dHRvbjsKLQotCXByaXZhdGUgQnV0dG9uIGRpc2NhcmRVbnJlc29sdmVkUmVmZXJlbmNlc0NoZWNrYm94OwotCi0JcHJpdmF0ZSBCdXR0b24gdXNlTmV3RXh0ZW5kc1NlbWFudGljc0NoZWNrYm94OwotCi0JcHJpdmF0ZSBCdXR0b24gZW5hYmxlTGlicmFyeVZhbGlkYXRpb25DaGVja2JveDsKLQotCXByaXZhdGUgVGV4dCBwcmVmZXJlbmNlSGlzdG9yeVNpemVUZXh0OwotCQotCXByaXZhdGUgQnV0dG9uIHNob3dMb25nUHJlc2VudGF0aW9uTmFtZUNoZWNrYm94OwotCi0JLyoqCi0JICogQ3JlYXRlcyBhbmQgcmV0dXJucyB0aGUgU1dUIGNvbnRyb2wgZm9yIHRoZSBjdXN0b21pemVkIGJvZHkgb2YgdGhpcwotCSAqIHByZWZlcmVuY2UgcGFnZSB1bmRlciB0aGUgZ2l2ZW4gcGFyZW50IGNvbXBvc2l0ZS4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IGNvbXBvc2l0ZQotCSAqIEByZXR1cm4gdGhlIG5ldyBjb250cm9sCi0JICovCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkgewotCQljb21wb3NpdGUgPSBjcmVhdGVHcmlkTGF5b3V0Q29tcG9zaXRlKHBhcmVudCwgMSk7Ci0KLQkJLy8gQ3JlYXRlIHRoZSBNZXRob2QgbGlicmFyeSBncm91cC4KLQkJR3JvdXAgbGlicmFyeUdyb3VwID0gY3JlYXRlR3JpZExheW91dEdyb3VwKGNvbXBvc2l0ZSwKLQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5tZXRob2RMaWJyYXJ5R3JvdXBfdGV4dCwgMyk7Ci0KLQkJY3JlYXRlTGFiZWwobGlicmFyeUdyb3VwLCBBdXRob3JpbmdVSVJlc291cmNlcy5kZWZhdWx0UGF0aExhYmVsX3RleHQpOwotCQlkZWZhdWx0TGlicmFyeVBhdGhUZXh0ID0gY3JlYXRlRWRpdGFibGVUZXh0KGxpYnJhcnlHcm91cCk7Ci0JCWJyb3dzZUJ1dHRvbiA9IGNyZWF0ZUJ1dHRvbihsaWJyYXJ5R3JvdXAsCi0JCQkJQXV0aG9yaW5nVUlUZXh0LkJST1dTRV9CVVRUT05fVEVYVCk7Ci0KLQkJZGlzY2FyZFVucmVzb2x2ZWRSZWZlcmVuY2VzQ2hlY2tib3ggPSBjcmVhdGVDaGVja2JveChsaWJyYXJ5R3JvdXAsCi0JCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuZGlzY2FyZHVucmVzb2x2ZWRyZWYsIDMpOwotCi0JCS8vIENyZWF0ZSB0aGUgTW9kZWxpbmcgZ3JvdXAuCi0JCUdyb3VwIG1vZGVsaW5nR3JvdXAgPSBjcmVhdGVHcmlkTGF5b3V0R3JvdXAoY29tcG9zaXRlLAotCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLm1vZGVsaW5nR3JvdXBfdGV4dCwgMSk7Ci0KLQkJdXNlTmV3RXh0ZW5kc1NlbWFudGljc0NoZWNrYm94ID0gY3JlYXRlQ2hlY2tib3gobW9kZWxpbmdHcm91cCwKLQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5leHRlbmRfc2VtYW50aWNzX2J1dHRvbl90ZXh0KTsKLQotCQkvLyBDcmVhdGUgdGhlIFVJIGdyb3VwLgotCQlHcm91cCB1c2VySW50ZXJmYWNlR3JvdXAgPSBjcmVhdGVHcmlkTGF5b3V0R3JvdXAoY29tcG9zaXRlLAotCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLnVzZXJJbnRlcmZhY2VHcm91cF90ZXh0LCAyKTsKLQotCQljcmVhdGVMYWJlbCh1c2VySW50ZXJmYWNlR3JvdXAsCi0JCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuZGVmYXVsdF9saXN0X2xlbmd0aF9sYWJlbCk7Ci0JCXByZWZlcmVuY2VIaXN0b3J5U2l6ZVRleHQgPSBjcmVhdGVFZGl0YWJsZVRleHQodXNlckludGVyZmFjZUdyb3VwLAotCQkJCSIiLCAyNSk7IC8vJE5PTi1OTFMtMSQKLQotCQkvLyBDcmVhdGUgdGhlIGRlYnVnIGdyb3VwLgotCQlHcm91cCBkZWJ1Z0dyb3VwID0gY3JlYXRlR3JpZExheW91dEdyb3VwKGNvbXBvc2l0ZSwKLQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5kZWJ1Z0dyb3VwX3RleHQsIDIpOwotCi0JCWVuYWJsZUxpYnJhcnlWYWxpZGF0aW9uQ2hlY2tib3ggPSBjcmVhdGVDaGVja2JveChkZWJ1Z0dyb3VwLAotCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLmVuYWJsZUxpYnJhcnlWYWxpZGF0aW9uQ2hlY2tib3hfdGV4dCk7Ci0JCQotCQkvLyBDcmVhdGUgdGhlIGVkaXRvciBncm91cC4KLQkJR3JvdXAgZWRpdG9yR3JvdXAgPSBjcmVhdGVHcmlkTGF5b3V0R3JvdXAoY29tcG9zaXRlLAotCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLmVkaXRvckdyb3VwX3RleHQsIDIpOwotCi0JCXNob3dMb25nUHJlc2VudGF0aW9uTmFtZUNoZWNrYm94ID0gY3JlYXRlQ2hlY2tib3goZWRpdG9yR3JvdXAsCi0JCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuc2hvd0xvbmdQcmVzZW50YXRpb25OYW1lQ2hlY2tib3hfdGV4dCk7Ci0KLQkJaW5pdENvbnRyb2xzKCk7Ci0KLQkJYWRkTGlzdGVuZXJzKCk7Ci0KLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplcyB0aGUgcHJlZmVyZW5jZSBwYWdlIGNvbnRyb2xzIHdpdGggZGF0YS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0Q29udHJvbHMoKSB7Ci0JCWRlZmF1bHRMaWJyYXJ5UGF0aFRleHQuc2V0VGV4dChMaWJyYXJ5VUlQcmVmZXJlbmNlcwotCQkJCS5nZXREZWZhdWx0TGlicmFyeVBhdGgoKSk7Ci0KLQkJZGlzY2FyZFVucmVzb2x2ZWRSZWZlcmVuY2VzQ2hlY2tib3guc2V0U2VsZWN0aW9uKExpYnJhcnlQcmVmZXJlbmNlcwotCQkJCS5nZXREaXNjYXJkVW5yZXNvbHZlZFJlZmVyZW5jZXMoKSk7Ci0KLQkJdXNlTmV3RXh0ZW5kc1NlbWFudGljc0NoZWNrYm94LnNldFNlbGVjdGlvbihMaWJyYXJ5UHJlZmVyZW5jZXMKLQkJCQkuZ2V0VXNlTmV3RXh0ZW5kc1NlbWFudGljcygpKTsKLQotCQlwcmVmZXJlbmNlSGlzdG9yeVNpemVUZXh0LnNldFRleHQoIiIgLy8kTk9OLU5MUy0xJAotCQkJCSsgQ29tbW9uUHJlZmVyZW5jZXMuZ2V0UHJlZmVyZW5jZUhpc3RvcnlTaXplKCkpOyAKLQotCQllbmFibGVMaWJyYXJ5VmFsaWRhdGlvbkNoZWNrYm94LnNldFNlbGVjdGlvbihBdXRob3JpbmdVSVByZWZlcmVuY2VzCi0JCQkJLmdldEVuYWJsZUxpYnJhcnlWYWxpZGF0aW9uKCkpOwotCQkKLQkJc2hvd0xvbmdQcmVzZW50YXRpb25OYW1lQ2hlY2tib3guc2V0U2VsZWN0aW9uKEF1dGhvcmluZ1VJUHJlZmVyZW5jZXMKLQkJCQkuZ2V0U2hvd0xvbmdQcmVzZW50YXRpb25OYW1lKCkpOwotCX0KLQotCS8qKgotCSAqIEFkZHMgZXZlbnQgbGlzdGVuZXJzIHRvIHRoZSBwcmVmZXJlbmNlIHBhZ2UgY29udHJvbHMuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkTGlzdGVuZXJzKCkgewotCQlicm93c2VCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJb3BlbkRpcmVjdG9yeURpYWxvZygpOwotCQkJfQotCQl9KTsKLQotCQlwcmVmZXJlbmNlSGlzdG9yeVNpemVUZXh0LmFkZE1vZGlmeUxpc3RlbmVyKHRoaXMpOwotCQkKLQkJc2hvd0xvbmdQcmVzZW50YXRpb25OYW1lQ2hlY2tib3guYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJU2hlbGwgc2hlbGwgPSBEaXNwbGF5LmdldEN1cnJlbnQoKS5nZXRBY3RpdmVTaGVsbCgpOwotCQkJCWlmIChBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkKLQkJCQkJCS5kaXNwbGF5Q29uZmlybWF0aW9uKHNoZWxsLmdldFRleHQoKSwgQXV0aG9yaW5nVUlSZXNvdXJjZXMuc2hvd0xvbmdQcmVzZW50YXRpb25OYW1lQ2hhbmdlX21lc3NhZ2UpKSB7Ci0JCQkJCS8vIGNsb3NlIGVkaXRvcnMgd2l0aCBzYXZpbmcKLQkJCQkJRWRpdG9yQ2hvb3Nlci5nZXRJbnN0YW5jZSgpLmNsb3NlQWxsTWV0aG9kRWRpdG9yc1dpdGhTYXZpbmcoKTsKLQkJCQkJCi0JCQkJfSBlbHNlIHsKLQkJCQkJc2hvd0xvbmdQcmVzZW50YXRpb25OYW1lQ2hlY2tib3guc2V0U2VsZWN0aW9uKCFzaG93TG9uZ1ByZXNlbnRhdGlvbk5hbWVDaGVja2JveAotCQkJCQkJCS5nZXRTZWxlY3Rpb24oKSk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXIjbW9kaWZ5VGV4dChNb2RpZnlFdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJc2V0RXJyb3JNZXNzYWdlKG51bGwpOwotCQlzZXRWYWxpZCh0cnVlKTsKLQotCQlpbnQgdmFsdWUgPSAwOwotCQlpZiAoZS53aWRnZXQgPT0gcHJlZmVyZW5jZUhpc3RvcnlTaXplVGV4dCkgewotCQkJdmFsdWUgPSBnZXRQcmVmZXJlbmNlSGlzdG9yeVNpemUoKTsKLQkJCWlmICh2YWx1ZSA8IE1JTl9QUkVGRVJFTkNFX0hJU1RPUllfU0laRQotCQkJCQl8fCB2YWx1ZSA+IE1BWF9QUkVGRVJFTkNFX0hJU1RPUllfU0laRSkgewotCQkJCXNldEVycm9yTWVzc2FnZShBdXRob3JpbmdVSVJlc291cmNlcwotCQkJCQkJLmJpbmQoCi0JCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLmludmFsaWRQcmVmZXJlbmNlSGlzdG9yeVNpemVFcnJvcl9tc2csCi0JCQkJCQkJCW5ldyBPYmplY3RbXSB7Ci0JCQkJCQkJCQkJbmV3IEludGVnZXIoTUlOX1BSRUZFUkVOQ0VfSElTVE9SWV9TSVpFKSwKLQkJCQkJCQkJCQluZXcgSW50ZWdlcihNQVhfUFJFRkVSRU5DRV9ISVNUT1JZX1NJWkUpIH0pKTsKLQkJCQlzZXRWYWxpZChmYWxzZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBQZXJmb3JtcyBzcGVjaWFsIHByb2Nlc3Npbmcgd2hlbiB0aGlzIHBhZ2UncyBEZWZhdWx0cyBidXR0b24gaGFzIGJlZW4KLQkgKiBwcmVzc2VkLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EZWZhdWx0cygpIHsKLQkJc3VwZXIucGVyZm9ybURlZmF1bHRzKCk7Ci0KLQkJU3RyaW5nIGRlZmF1bHRMaWJyYXJ5UGF0aCA9IExpYnJhcnlVSVByZWZlcmVuY2VzCi0JCQkJLmdldEluaXRpYWxEZWZhdWx0TGlicmFyeVBhdGgoKTsKLQkJTGlicmFyeVVJUHJlZmVyZW5jZXMuc2V0RGVmYXVsdExpYnJhcnlQYXRoKGRlZmF1bHRMaWJyYXJ5UGF0aCk7Ci0JCWRlZmF1bHRMaWJyYXJ5UGF0aFRleHQuc2V0VGV4dChkZWZhdWx0TGlicmFyeVBhdGgpOwotCi0JCWJvb2xlYW4gZGlzY2FyZFVucmVzb2x2ZWRSZWZlcmVuY2VzID0gTGlicmFyeVByZWZlcmVuY2VzCi0JCQkJLmdldERlZmF1bHREaXNjYXJkVW5yZXNvbHZlZFJlZmVyZW5jZXMoKTsKLQkJTGlicmFyeVByZWZlcmVuY2VzCi0JCQkJLnNldERpc2NhcmRVbnJlc29sdmVkUmVmZXJlbmNlcyhkaXNjYXJkVW5yZXNvbHZlZFJlZmVyZW5jZXMpOwotCQlkaXNjYXJkVW5yZXNvbHZlZFJlZmVyZW5jZXNDaGVja2JveAotCQkJCS5zZXRTZWxlY3Rpb24oZGlzY2FyZFVucmVzb2x2ZWRSZWZlcmVuY2VzKTsKLQotCQlib29sZWFuIHVzZU5ld0V4dGVuZHNTZW1hbnRpY3MgPSBMaWJyYXJ5UHJlZmVyZW5jZXMKLQkJCQkuZ2V0RGVmYXVsdFVzZU5ld0V4dGVuZHNTZW1hbnRpY3MoKTsKLQkJTGlicmFyeVByZWZlcmVuY2VzLnNldFVzZU5ld0V4dGVuZHNTZW1hbnRpY3ModXNlTmV3RXh0ZW5kc1NlbWFudGljcyk7Ci0JCXVzZU5ld0V4dGVuZHNTZW1hbnRpY3NDaGVja2JveC5zZXRTZWxlY3Rpb24odXNlTmV3RXh0ZW5kc1NlbWFudGljcyk7Ci0KLQkJaW50IHByZWZlcmVuY2VIaXN0b3J5U2l6ZSA9IENvbW1vblByZWZlcmVuY2VzCi0JCQkJLmdldERlZmF1bHRQcmVmZXJlbmNlSGlzdG9yeVNpemUoKTsKLQkJQ29tbW9uUHJlZmVyZW5jZXMuc2V0UHJlZmVyZW5jZUhpc3RvcnlTaXplKHByZWZlcmVuY2VIaXN0b3J5U2l6ZSk7Ci0JCXByZWZlcmVuY2VIaXN0b3J5U2l6ZVRleHQuc2V0VGV4dCgiIiArIHByZWZlcmVuY2VIaXN0b3J5U2l6ZSk7IC8vJE5PTi1OTFMtMSQKLQotCQlib29sZWFuIGVuYWJsZUxpYnJhcnlWYWxpZGF0aW9uID0gQXV0aG9yaW5nVUlQcmVmZXJlbmNlcwotCQkJCS5nZXREZWZhdWx0RW5hYmxlTGlicmFyeVZhbGlkYXRpb24oKTsKLQkJQXV0aG9yaW5nVUlQcmVmZXJlbmNlcwotCQkJCS5zZXRFbmFibGVMaWJyYXJ5VmFsaWRhdGlvbihlbmFibGVMaWJyYXJ5VmFsaWRhdGlvbik7Ci0JCWVuYWJsZUxpYnJhcnlWYWxpZGF0aW9uQ2hlY2tib3guc2V0U2VsZWN0aW9uKGVuYWJsZUxpYnJhcnlWYWxpZGF0aW9uKTsKLQkJCi0JCWJvb2xlYW4gc2hvd0xvbmdQcmVzZW50YXRpb25OYW1lID0gQXV0aG9yaW5nVUlQcmVmZXJlbmNlcwotCQkJCS5nZXREZWZhdWx0U2hvd0xvbmdQcmVzZW50YXRpb25OYW1lKCk7Ci0JCUF1dGhvcmluZ1VJUHJlZmVyZW5jZXMKLQkJCQkuc2V0U2hvd0xvbmdQcmVzZW50YXRpb25OYW1lKHNob3dMb25nUHJlc2VudGF0aW9uTmFtZSk7Ci0JCXNob3dMb25nUHJlc2VudGF0aW9uTmFtZUNoZWNrYm94LnNldFNlbGVjdGlvbihzaG93TG9uZ1ByZXNlbnRhdGlvbk5hbWUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlUGFnZSNwZXJmb3JtT2soKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHBlcmZvcm1PaygpIHsKLQkJTGlicmFyeVVJUHJlZmVyZW5jZXMuc2V0RGVmYXVsdExpYnJhcnlQYXRoKGdldERlZmF1bHRMaWJyYXJ5UGF0aCgpKTsKLQkJTGlicmFyeVByZWZlcmVuY2VzCi0JCQkJLnNldERpc2NhcmRVbnJlc29sdmVkUmVmZXJlbmNlcyhnZXREaXNjYXJkVW5yZXNvbHZlZFJlZmVyZW5jZXMoKSk7Ci0JCUxpYnJhcnlQcmVmZXJlbmNlcwotCQkJCS5zZXRVc2VOZXdFeHRlbmRzU2VtYW50aWNzKGdldFVzZU5ld0V4dGVuZHNTZW1hbnRpY3MoKSk7Ci0JCUNvbW1vblByZWZlcmVuY2VzLnNldFByZWZlcmVuY2VIaXN0b3J5U2l6ZShnZXRQcmVmZXJlbmNlSGlzdG9yeVNpemUoKSk7Ci0JCUF1dGhvcmluZ1VJUHJlZmVyZW5jZXMKLQkJCS5zZXRFbmFibGVMaWJyYXJ5VmFsaWRhdGlvbihnZXRFbmFibGVMaWJyYXJ5VmFsaWRhdGlvbigpKTsKLQkJQXV0aG9yaW5nVUlQcmVmZXJlbmNlcwotCQkJCS5zZXRTaG93TG9uZ1ByZXNlbnRhdGlvbk5hbWUoZ2V0U2hvd0xvbmdQcmVzZW50YXRpb25OYW1lKCkpOwotCQkKLQkJLy8gdXBkYXRlIHRoZSBzZXR0aW5ncyBmb3IgYnJvd3NpbmcKLQkJTGlicmFyeVVJUGx1Z2luLmdldERlZmF1bHQoKS51cGRhdGVMYXlvdXRTZXR0aW5ncygpOwotCi0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHVzZXIgc3BlY2lmaWVkIGRlZmF1bHQgbWV0aG9kIGxpYnJhcnkgcGF0aC4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERlZmF1bHRMaWJyYXJ5UGF0aCgpIHsKLQkJcmV0dXJuIGRlZmF1bHRMaWJyYXJ5UGF0aFRleHQuZ2V0VGV4dCgpLnRyaW0oKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSB1c2VyIHNwZWNpZmllZCBkaXNjYXJkIHVucmVzb2x2ZWQgcmVmZXJlbmNlcyBwcmVmZXJlbmNlLgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGdldERpc2NhcmRVbnJlc29sdmVkUmVmZXJlbmNlcygpIHsKLQkJcmV0dXJuIGRpc2NhcmRVbnJlc29sdmVkUmVmZXJlbmNlc0NoZWNrYm94LmdldFNlbGVjdGlvbigpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHVzZXIgc3BlY2lmaWVkIHVzZSBuZXcgZXh0ZW5kcyBzZW1hbnRpY3MgcHJlZmVyZW5jZS4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBnZXRVc2VOZXdFeHRlbmRzU2VtYW50aWNzKCkgewotCQlyZXR1cm4gdXNlTmV3RXh0ZW5kc1NlbWFudGljc0NoZWNrYm94LmdldFNlbGVjdGlvbigpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHVzZXIgc3BlY2lmaWVkIHByZWZlcmVuY2UgaGlzdG9yeSBzaXplLgotCSAqLwotCXByb3RlY3RlZCBpbnQgZ2V0UHJlZmVyZW5jZUhpc3RvcnlTaXplKCkgewotCQlyZXR1cm4gU3RyVXRpbC5nZXRJbnRWYWx1ZShwcmVmZXJlbmNlSGlzdG9yeVNpemVUZXh0LmdldFRleHQoKS50cmltKCksCi0JCQkJMCk7Ci0JfQotCQotCS8qKgotCSAqIEdldHMgdGhlIGVuYWJsZWQgbGlicmFyeSB2YWxpZGF0aW9uIHByZWZlcmVuY2UKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gZ2V0RW5hYmxlTGlicmFyeVZhbGlkYXRpb24oKSB7Ci0JCXJldHVybiBlbmFibGVMaWJyYXJ5VmFsaWRhdGlvbkNoZWNrYm94LmdldFNlbGVjdGlvbigpOwotCX0KLQkKLQkvKioKLQkgKiBHZXRzIHRoZSBzaG93IGxvbmcgcHJlc2VudGF0aW9uIG5hbWUgcHJlZmVyZW5jZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBnZXRTaG93TG9uZ1ByZXNlbnRhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBzaG93TG9uZ1ByZXNlbnRhdGlvbk5hbWVDaGVja2JveC5nZXRTZWxlY3Rpb24oKTsKLQl9Ci0KLQkvKioKLQkgKiBPcGVucyB0aGUgZGlyZWN0b3J5IGRpYWxvZy4KLQkgKi8KLQlwcml2YXRlIHZvaWQgb3BlbkRpcmVjdG9yeURpYWxvZygpIHsKLQkJdHJ5IHsKLQkJCURpcmVjdG9yeURpYWxvZyBkZCA9IG5ldyBEaXJlY3RvcnlEaWFsb2coY29tcG9zaXRlLmdldFNoZWxsKCksCi0JCQkJCVNXVC5OT05FKTsKLQkJCVN0cmluZyBwYXRoID0gZGQub3BlbigpOwotCQkJaWYgKHBhdGggIT0gbnVsbCkgewotCQkJCWRlZmF1bHRMaWJyYXJ5UGF0aFRleHQuc2V0VGV4dChwYXRoKTsKLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcmVmZXJlbmNlcy9BdXRob3JpbmdVSVByZWZlcmVuY2VzLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3ByZWZlcmVuY2VzL0F1dGhvcmluZ1VJUHJlZmVyZW5jZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWNlM2I2Ni4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3ByZWZlcmVuY2VzL0F1dGhvcmluZ1VJUHJlZmVyZW5jZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByZWZlcmVuY2VzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci0KLS8qKgotICogTWFuYWdlcyB0aGUgQXV0aG9yaW5nIFVJIHByZWZlcmVuY2VzLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjIKLSAqLwotcHVibGljIGNsYXNzIEF1dGhvcmluZ1VJUHJlZmVyZW5jZXMgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5BQkxFX0xJQlJBUllfVkFMSURBVElPTiA9ICJlbmFibGVkTGlicmFyeVZhbGlkYXRpb24iOyAvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0hPV19MT05HX1BSRVNFTlRBVElPTl9OQU1FID0gInNob3dMb25nUHJlc2VudGF0aW9uTmFtZSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFERF9UQVNLU19QRVJfUk9XID0gIkFDVElWSVRZX0RFVEFJTF9ESUFHUkFNX1RBU0tTX1BFUl9ST1ciOyAvLyROT04tTkxTLTEkCi0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfQUREX1RBU0tTX1BFUl9ST1cgPSAxMDsgCi0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUZBVUxUX0VOQUJMRV9MSUJSQVJZX1ZBTElEQVRJT04gPSBmYWxzZTsKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERFRkFVTFRfU0hPV19MT05HX1BSRVNFTlRBVElPTl9OQU1FID0gZmFsc2U7Ci0KLQkvLyBUaGUgcGx1Zy1pbiBzcGVjaWZpYyBwcmVmZXJlbmNlIHN0b3JlLgotCXByaXZhdGUgc3RhdGljIElQcmVmZXJlbmNlU3RvcmUgcHJlZlN0b3JlID0gQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpCi0JCQkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0Jc3RhdGljIHsKLQkJLy8gSW5pdGlhbGl6ZSB0aGUgZGVmYXVsdCBwcmVmZXJlbmNlIHZhbHVlcy4KLQkJcHJlZlN0b3JlLnNldERlZmF1bHQoRU5BQkxFX0xJQlJBUllfVkFMSURBVElPTiwKLQkJCQlERUZBVUxUX0VOQUJMRV9MSUJSQVJZX1ZBTElEQVRJT04pOwotCQkKLQkJcHJlZlN0b3JlLnNldERlZmF1bHQoU0hPV19MT05HX1BSRVNFTlRBVElPTl9OQU1FLAotCQkJCURFRkFVTFRfU0hPV19MT05HX1BSRVNFTlRBVElPTl9OQU1FKTsKLQkJCi0JCXByZWZTdG9yZS5zZXREZWZhdWx0KEFERF9UQVNLU19QRVJfUk9XLCBERUZBVUxUX0FERF9UQVNLU19QRVJfUk9XKTsKLQkJCi0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgZGVmYXVsdCBlbmFibGUgbWV0aG9kIGxpYnJhcnkgdmFsaWRhdGlvbiBwcmVmZXJlbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBnZXREZWZhdWx0RW5hYmxlTGlicmFyeVZhbGlkYXRpb24oKSB7Ci0JCXJldHVybiBERUZBVUxUX0VOQUJMRV9MSUJSQVJZX1ZBTElEQVRJT047Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgbWV0aG9kIGxpYnJhcnkgdmFsaWRhdGlvbiBwcmVmZXJlbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBnZXRFbmFibGVMaWJyYXJ5VmFsaWRhdGlvbigpIHsKLQkJcmV0dXJuIHByZWZTdG9yZS5nZXRCb29sZWFuKEVOQUJMRV9MSUJSQVJZX1ZBTElEQVRJT04pOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIG1ldGhvZCBsaWJyYXJ5IHZhbGlkYXRpb24gcHJlZmVyZW5jZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0RW5hYmxlTGlicmFyeVZhbGlkYXRpb24oYm9vbGVhbiB2YWx1ZSkgewotCQlwcmVmU3RvcmUuc2V0VmFsdWUoRU5BQkxFX0xJQlJBUllfVkFMSURBVElPTiwgdmFsdWUpOwotCX0KLQkKLQkvKioKLQkgKiBHZXRzIHRoZSBkZWZhdWx0IHNob3cgbG9uZyBwcmVzZW50YXRpb24gbmFtZSBwcmVmZXJlbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBnZXREZWZhdWx0U2hvd0xvbmdQcmVzZW50YXRpb25OYW1lKCkgewotCQlyZXR1cm4gREVGQVVMVF9TSE9XX0xPTkdfUFJFU0VOVEFUSU9OX05BTUU7Ci0JfQotCQotCS8qKgotCSAqIEdldHMgdGhlCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGdldFNob3dMb25nUHJlc2VudGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIHByZWZTdG9yZS5nZXRCb29sZWFuKFNIT1dfTE9OR19QUkVTRU5UQVRJT05fTkFNRSk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgc2hvdyBsb25nIHByZXNlbnRhdGlvbiBuYW1lIHByZWZlcmVuY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldFNob3dMb25nUHJlc2VudGF0aW9uTmFtZShib29sZWFuIHZhbHVlKSB7Ci0JCXByZWZTdG9yZS5zZXRWYWx1ZShTSE9XX0xPTkdfUFJFU0VOVEFUSU9OX05BTUUsIHZhbHVlKTsKLQl9Ci0JCi0JLyoqCi0JICogR2V0cyB0aGUgQUREX1RBU0tTX1BFUl9ST1cgcHJlZmVyZW5jZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBnZXRBRERfVGFza3NQZXJSb3coKSAgewotCQlpbnQgdmFsdWUgPSBwcmVmU3RvcmUuZ2V0SW50KEFERF9UQVNLU19QRVJfUk9XKTsKLQkJcmV0dXJuIHZhbHVlID4gMCA/IHZhbHVlIDogREVGQVVMVF9BRERfVEFTS1NfUEVSX1JPVzsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBBRERfVEFTS1NfUEVSX1JPVyBwcmVmZXJlbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRBRERUYXNrc1BlclJvdyhpbnQgdmFsdWUpIHsKLQkJcHJlZlN0b3JlLnNldFZhbHVlKEFERF9UQVNLU19QRVJfUk9XLCB2YWx1ZSk7Ci0JfQotCQotCS8qKgotCSAqIEdldHMgdGhlIGRlZmF1bHQgQUREX1RBU0tTX1BFUl9ST1cgcHJlZmVyZW5jZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBnZXREZWZhdWx0QUREVGFza3NQZXJSb3coKSB7Ci0JCXJldHVybiBERUZBVUxUX0FERF9UQVNLU19QRVJfUk9XOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcmVmZXJlbmNlcy9CcmVha2Rvd25FbGVtZW50UHJlZlBhZ2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJlZmVyZW5jZXMvQnJlYWtkb3duRWxlbWVudFByZWZQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxNjQ0NjcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcmVmZXJlbmNlcy9CcmVha2Rvd25FbGVtZW50UHJlZlBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByZWZlcmVuY2VzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnByZWZlcmVuY2VzLklQcmVmZXJlbmNlU3RvcmVXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udWkuUHJlZmVyZW5jZVN0b3JlV3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLkxpYnJhcnlVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5wcmVmZXJlbmNlcy5MaWJyYXJ5VUlQcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudWkucHJlZmVyZW5jZXMuQmFzZVByZWZlcmVuY2VQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFByZWZlcmVuY2VQYWdlOwotCi0vKioKLSAqIFByZWZlcmVuY2UgcGFnZSBmb3IgYnJlYWtkb3duIGVsZW1lbnQgYXR0cmlidXRlcwotICogCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBCcmVha2Rvd25FbGVtZW50UHJlZlBhZ2UgZXh0ZW5kcyBCYXNlUHJlZmVyZW5jZVBhZ2UgaW1wbGVtZW50cwotCQlJV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2UsIFNlbGVjdGlvbkxpc3RlbmVyIHsKLQotCUNvbXBvc2l0ZSBjb21wb3NpdGU7Ci0KLQlwcml2YXRlIEJ1dHRvbiB3b3JrQnJlYWtkb3duRWxlbWVudE9wdGlvbmFsQnV0dG9uLAotCQkJd29ya0JyZWFrZG93bkVsZW1lbnRNdWx0aXBsZU9jY3VycmFuY2VzQnV0dG9uLAotCQkJd29ya0JyZWFrZG93bkVsZW1lbnRQbGFubmVkQnV0dG9uLAotCQkJd29ya0JyZWFrZG93bkVsZW1lbnRFdmVudERyaXZlbkJ1dHRvbiwKLQkJCXdvcmtCcmVha2Rvd25FbGVtZW50T25nb2luZ0J1dHRvbiwKLQkJCXdvcmtCcmVha2Rvd25FbGVtZW50UmVwZXRhYmxlQnV0dG9uOwotCi0JcHJpdmF0ZSBCdXR0b24gZGVzY3JpcHRvck9wdGlvbmFsQnV0dG9uLAotCQkJZGVzY3JpcHRvck11bHRpcGxlT2NjdXJyYW5jZXNCdXR0b24sIGRlc2NyaXB0b3JQbGFubmVkQnV0dG9uLAotCQkJZGVzY3JpcHRvckV2ZW50RHJpdmVuQnV0dG9uLCBkZXNjcmlwdG9yT25nb2luZ0J1dHRvbiwKLQkJCWRlc2NyaXB0b3JSZXBldGFibGVCdXR0b247Ci0KLQlwdWJsaWMgQnJlYWtkb3duRWxlbWVudFByZWZQYWdlKCkgewotCQlzdXBlcigpOwotCX0KLQotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQljb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDEsIGZhbHNlKSk7Ci0KLQkJY3JlYXRlTGFiZWwoY29tcG9zaXRlLAotCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLnByZWZlcmVuY2VfYnJlYWtEb3duRWxlbWVudF9EZXNjcmlwdGlvbik7Ci0KLQkJY3JlYXRlTGFiZWwoY29tcG9zaXRlLCAiIik7IC8vJE5PTi1OTFMtMSQKLQotCQkvLyBjcmVhdGUgZ3JvdXAgZm9yIGFjdGl2aXR5IGVsZW1lbnRzCi0JCUdyb3VwIHdvcmtCcmVha2Rvd25FbGVtZW50R3JvdXAgPSBjcmVhdGVHcmlkTGF5b3V0R3JvdXAoY29tcG9zaXRlLAotCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLnByZWZlcmVuY2VfV29ya0JyZWFrZG93bkVsZW1lbnRzLCAxLCB0cnVlKTsKLQotCQl3b3JrQnJlYWtkb3duRWxlbWVudE9wdGlvbmFsQnV0dG9uID0gY3JlYXRlQ2hlY2tib3goCi0JCQkJd29ya0JyZWFrZG93bkVsZW1lbnRHcm91cCwKLQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5Qcm9jZXNzRWRpdG9yX09wdGlvbmFsKTsKLQkJd29ya0JyZWFrZG93bkVsZW1lbnRNdWx0aXBsZU9jY3VycmFuY2VzQnV0dG9uID0gY3JlYXRlQ2hlY2tib3goCi0JCQkJd29ya0JyZWFrZG93bkVsZW1lbnRHcm91cCwKLQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5Qcm9jZXNzRWRpdG9yX011bHRpcGxlT2NjdXJyZW5jZXMpOwotCQl3b3JrQnJlYWtkb3duRWxlbWVudFBsYW5uZWRCdXR0b24gPSBjcmVhdGVDaGVja2JveCgKLQkJCQl3b3JrQnJlYWtkb3duRWxlbWVudEdyb3VwLAotCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLlByb2Nlc3NFZGl0b3JfUGxhbm5lZCk7Ci0JCXdvcmtCcmVha2Rvd25FbGVtZW50RXZlbnREcml2ZW5CdXR0b24gPSBjcmVhdGVDaGVja2JveCgKLQkJCQl3b3JrQnJlYWtkb3duRWxlbWVudEdyb3VwLAotCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLlByb2Nlc3NFZGl0b3JfRXZlbnREcml2ZW4pOwotCQl3b3JrQnJlYWtkb3duRWxlbWVudE9uZ29pbmdCdXR0b24gPSBjcmVhdGVDaGVja2JveCgKLQkJCQl3b3JrQnJlYWtkb3duRWxlbWVudEdyb3VwLAotCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLlByb2Nlc3NFZGl0b3JfT25nb2luZyk7Ci0JCXdvcmtCcmVha2Rvd25FbGVtZW50UmVwZXRhYmxlQnV0dG9uID0gY3JlYXRlQ2hlY2tib3goCi0JCQkJd29ya0JyZWFrZG93bkVsZW1lbnRHcm91cCwKLQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5Qcm9jZXNzRWRpdG9yX1JlcGV0YWJsZSk7Ci0KLQkJLy8gY3JlYXRlIGdyb3VwIGZvciBkZXNjcmlwdG9yIGVsZW1lbnRzCi0JCUdyb3VwIGRlc2NyaXB0b3JHcm91cCA9IGNyZWF0ZUdyaWRMYXlvdXRHcm91cChjb21wb3NpdGUsCi0JCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMucHJlZmVyZW5jZV9EZXNjcmlwdG9yRWxlbWVudHMsIDEsIHRydWUpOwotCQlkZXNjcmlwdG9yT3B0aW9uYWxCdXR0b24gPSBjcmVhdGVDaGVja2JveChkZXNjcmlwdG9yR3JvdXAsCi0JCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuUHJvY2Vzc0VkaXRvcl9PcHRpb25hbCk7Ci0JCWRlc2NyaXB0b3JNdWx0aXBsZU9jY3VycmFuY2VzQnV0dG9uID0gY3JlYXRlQ2hlY2tib3goZGVzY3JpcHRvckdyb3VwLAotCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLlByb2Nlc3NFZGl0b3JfTXVsdGlwbGVPY2N1cnJlbmNlcyk7Ci0JCWRlc2NyaXB0b3JQbGFubmVkQnV0dG9uID0gY3JlYXRlQ2hlY2tib3goZGVzY3JpcHRvckdyb3VwLAotCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLlByb2Nlc3NFZGl0b3JfUGxhbm5lZCk7Ci0JCWRlc2NyaXB0b3JFdmVudERyaXZlbkJ1dHRvbiA9IGNyZWF0ZUNoZWNrYm94KGRlc2NyaXB0b3JHcm91cCwKLQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5Qcm9jZXNzRWRpdG9yX0V2ZW50RHJpdmVuKTsKLQkJZGVzY3JpcHRvck9uZ29pbmdCdXR0b24gPSBjcmVhdGVDaGVja2JveChkZXNjcmlwdG9yR3JvdXAsCi0JCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuUHJvY2Vzc0VkaXRvcl9PbmdvaW5nKTsKLQkJZGVzY3JpcHRvclJlcGV0YWJsZUJ1dHRvbiA9IGNyZWF0ZUNoZWNrYm94KGRlc2NyaXB0b3JHcm91cCwKLQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5Qcm9jZXNzRWRpdG9yX1JlcGV0YWJsZSk7Ci0KLQkJLy8gSW5pdGlhbGl6ZSB2YWx1ZXMKLQkJaW5pdGlhbGl6ZVZhbHVlcygpOwotCi0JCXJldHVybiBjb21wb3NpdGU7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoIHdvcmtiZW5jaCkgewotCi0JfQotCi0JcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCi0JfQotCi0JcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykgTWV0aG9kIGRlY2xhcmVkIG9uIFByZWZlcmVuY2VQYWdlCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURlZmF1bHRzKCkgewotCQlzdXBlci5wZXJmb3JtRGVmYXVsdHMoKTsKLQkJaW5pdGlhbGl6ZURlZmF1bHRzKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpIE1ldGhvZCBkZWNsYXJlZCBvbiBQcmVmZXJlbmNlUGFnZQotCSAqLwotCXB1YmxpYyBib29sZWFuIHBlcmZvcm1PaygpIHsKLQkJc3RvcmVWYWx1ZXMoKTsKLQkJTGlicmFyeVVJUGx1Z2luLmdldERlZmF1bHQoKS5zYXZlUGx1Z2luUHJlZmVyZW5jZXMoKTsKLQkJTGlicmFyeVVJUHJlZmVyZW5jZXMuYXBwbHlEZWZhdWx0VmFsdWVzRm9yQnJlYWtkb3duRWxlbWVudEF0dHJpYnV0ZXMoKTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogU3RvcmVzIHRoZSB2YWx1ZXMgb2YgdGhlIGNvbnRyb2xzIGJhY2sgdG8gdGhlIHByZWZlcmVuY2Ugc3RvcmUuCi0JICovCi0JcHJpdmF0ZSB2b2lkIHN0b3JlVmFsdWVzKCkgewotCQkvLwotCQlMaWJyYXJ5VUlQcmVmZXJlbmNlcwotCQkJCS5zZXRXb3JrQnJlYWtkb3duRWxlbWVudE9wdGlvbmFsKHdvcmtCcmVha2Rvd25FbGVtZW50T3B0aW9uYWxCdXR0b24KLQkJCQkJCS5nZXRTZWxlY3Rpb24oKSk7Ci0JCUxpYnJhcnlVSVByZWZlcmVuY2VzCi0JCQkJLnNldFdvcmtCcmVha2Rvd25FbGVtZW50TXVsdGlwbGVPY2N1cnJhbmNlcyh3b3JrQnJlYWtkb3duRWxlbWVudE11bHRpcGxlT2NjdXJyYW5jZXNCdXR0b24KLQkJCQkJCS5nZXRTZWxlY3Rpb24oKSk7Ci0JCUxpYnJhcnlVSVByZWZlcmVuY2VzCi0JCQkJLnNldFdvcmtCcmVha2Rvd25FbGVtZW50UGxhbm5lZCh3b3JrQnJlYWtkb3duRWxlbWVudFBsYW5uZWRCdXR0b24KLQkJCQkJCS5nZXRTZWxlY3Rpb24oKSk7Ci0JCUxpYnJhcnlVSVByZWZlcmVuY2VzCi0JCQkJLnNldFdvcmtCcmVha2Rvd25FbGVtZW50RXZlbnREcml2ZW4od29ya0JyZWFrZG93bkVsZW1lbnRFdmVudERyaXZlbkJ1dHRvbgotCQkJCQkJLmdldFNlbGVjdGlvbigpKTsKLQkJTGlicmFyeVVJUHJlZmVyZW5jZXMKLQkJCQkuc2V0V29ya0JyZWFrZG93bkVsZW1lbnRPbmdvaW5nKHdvcmtCcmVha2Rvd25FbGVtZW50T25nb2luZ0J1dHRvbgotCQkJCQkJLmdldFNlbGVjdGlvbigpKTsKLQkJTGlicmFyeVVJUHJlZmVyZW5jZXMKLQkJCQkuc2V0V29ya0JyZWFrZG93bkVsZW1lbnRSZXBlYXRhYmxlKHdvcmtCcmVha2Rvd25FbGVtZW50UmVwZXRhYmxlQnV0dG9uCi0JCQkJCQkuZ2V0U2VsZWN0aW9uKCkpOwotCi0JCUxpYnJhcnlVSVByZWZlcmVuY2VzLnNldERlc2NyaXB0b3JPcHRpb25hbChkZXNjcmlwdG9yT3B0aW9uYWxCdXR0b24KLQkJCQkuZ2V0U2VsZWN0aW9uKCkpOwotCQlMaWJyYXJ5VUlQcmVmZXJlbmNlcwotCQkJCS5zZXREZXNjcmlwdG9yTXVsdGlwbGVPY2N1cnJhbmNlcyhkZXNjcmlwdG9yTXVsdGlwbGVPY2N1cnJhbmNlc0J1dHRvbgotCQkJCQkJLmdldFNlbGVjdGlvbigpKTsKLQkJTGlicmFyeVVJUHJlZmVyZW5jZXMuc2V0RGVzY3JpcHRvclBsYW5uZWQoZGVzY3JpcHRvclBsYW5uZWRCdXR0b24KLQkJCQkuZ2V0U2VsZWN0aW9uKCkpOwotCQlMaWJyYXJ5VUlQcmVmZXJlbmNlcwotCQkJCS5zZXREZXNjcmlwdG9yRXZlbnREcml2ZW4oZGVzY3JpcHRvckV2ZW50RHJpdmVuQnV0dG9uCi0JCQkJCQkuZ2V0U2VsZWN0aW9uKCkpOwotCQlMaWJyYXJ5VUlQcmVmZXJlbmNlcy5zZXREZXNjcmlwdG9yT25nb2luZyhkZXNjcmlwdG9yT25nb2luZ0J1dHRvbgotCQkJCS5nZXRTZWxlY3Rpb24oKSk7Ci0JCUxpYnJhcnlVSVByZWZlcmVuY2VzLnNldERlc2NyaXB0b3JSZXBlYXRhYmxlKGRlc2NyaXB0b3JSZXBldGFibGVCdXR0b24KLQkJCQkuZ2V0U2VsZWN0aW9uKCkpOwotCi0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZXMgZGVmYXVsdCBzdGF0ZXMgb2YgdGhlIGNvbnRyb2xzIGZyb20gdGhlIHByZWZlcmVuY2Ugc3RvcmUuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVEZWZhdWx0cygpIHsKLQkJCi0JCXdvcmtCcmVha2Rvd25FbGVtZW50T3B0aW9uYWxCdXR0b24uc2V0U2VsZWN0aW9uKGZhbHNlKTsKLQkJd29ya0JyZWFrZG93bkVsZW1lbnRNdWx0aXBsZU9jY3VycmFuY2VzQnV0dG9uLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0JCXdvcmtCcmVha2Rvd25FbGVtZW50UGxhbm5lZEJ1dHRvbi5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCXdvcmtCcmVha2Rvd25FbGVtZW50RXZlbnREcml2ZW5CdXR0b24uc2V0U2VsZWN0aW9uKGZhbHNlKTsKLQkJd29ya0JyZWFrZG93bkVsZW1lbnRPbmdvaW5nQnV0dG9uLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0JCXdvcmtCcmVha2Rvd25FbGVtZW50UmVwZXRhYmxlQnV0dG9uLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0KLQkJZGVzY3JpcHRvck9wdGlvbmFsQnV0dG9uLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0JCWRlc2NyaXB0b3JNdWx0aXBsZU9jY3VycmFuY2VzQnV0dG9uLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0JCWRlc2NyaXB0b3JQbGFubmVkQnV0dG9uLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0JCWRlc2NyaXB0b3JFdmVudERyaXZlbkJ1dHRvbi5zZXRTZWxlY3Rpb24oZmFsc2UpOwotCQlkZXNjcmlwdG9yT25nb2luZ0J1dHRvbi5zZXRTZWxlY3Rpb24oZmFsc2UpOwotCQlkZXNjcmlwdG9yUmVwZXRhYmxlQnV0dG9uLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZXMgc3RhdGVzIG9mIHRoZSBjb250cm9scyBmcm9tIHRoZSBwcmVmZXJlbmNlIHN0b3JlLgotCSAqLwotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplVmFsdWVzKCkgewotCQotCQl3b3JrQnJlYWtkb3duRWxlbWVudE9wdGlvbmFsQnV0dG9uLnNldFNlbGVjdGlvbihMaWJyYXJ5VUlQcmVmZXJlbmNlcwotCQkJCS5nZXRXb3JrQnJlYWtEb3duRWxlbWVudE9wdGlvbmFsKCkpOwotCQl3b3JrQnJlYWtkb3duRWxlbWVudE11bHRpcGxlT2NjdXJyYW5jZXNCdXR0b24KLQkJCQkuc2V0U2VsZWN0aW9uKExpYnJhcnlVSVByZWZlcmVuY2VzCi0JCQkJCQkuZ2V0V29ya0JyZWFrRG93bkVsZW1lbnRNdWx0aXBsZU9jY3VycmFuY2VzKCkpOwotCQl3b3JrQnJlYWtkb3duRWxlbWVudFBsYW5uZWRCdXR0b24uc2V0U2VsZWN0aW9uKExpYnJhcnlVSVByZWZlcmVuY2VzCi0JCQkJLmdldFdvcmtCcmVha0Rvd25FbGVtZW50UGxhbm5lZCgpKTsKLQkJd29ya0JyZWFrZG93bkVsZW1lbnRFdmVudERyaXZlbkJ1dHRvbi5zZXRTZWxlY3Rpb24oTGlicmFyeVVJUHJlZmVyZW5jZXMKLQkJCQkuZ2V0V29ya0JyZWFrRG93bkVsZW1lbnRFdmVudERyaXZlbigpKTsKLQkJd29ya0JyZWFrZG93bkVsZW1lbnRPbmdvaW5nQnV0dG9uLnNldFNlbGVjdGlvbihMaWJyYXJ5VUlQcmVmZXJlbmNlcwotCQkJCS5nZXRXb3JrQnJlYWtEb3duRWxlbWVudE9uZ29pbmcoKSk7Ci0JCXdvcmtCcmVha2Rvd25FbGVtZW50UmVwZXRhYmxlQnV0dG9uLnNldFNlbGVjdGlvbihMaWJyYXJ5VUlQcmVmZXJlbmNlcwotCQkJCS5nZXRXb3JrQnJlYWtEb3duRWxlbWVudFJlcGVhdGFibGUoKSk7Ci0KLQkJZGVzY3JpcHRvck9wdGlvbmFsQnV0dG9uLnNldFNlbGVjdGlvbihMaWJyYXJ5VUlQcmVmZXJlbmNlcwotCQkJCS5nZXREZXNjcmlwdG9yT3B0aW9uYWwoKSk7Ci0JCWRlc2NyaXB0b3JNdWx0aXBsZU9jY3VycmFuY2VzQnV0dG9uLnNldFNlbGVjdGlvbihMaWJyYXJ5VUlQcmVmZXJlbmNlcwotCQkJCS5nZXREZXNjcmlwdG9yTXVsdGlwbGVPY2N1cnJhbmNlcygpKTsKLQkJZGVzY3JpcHRvclBsYW5uZWRCdXR0b24uc2V0U2VsZWN0aW9uKExpYnJhcnlVSVByZWZlcmVuY2VzCi0JCQkJLmdldERlc2NyaXB0b3JQbGFubmVkKCkpOwotCQlkZXNjcmlwdG9yRXZlbnREcml2ZW5CdXR0b24uc2V0U2VsZWN0aW9uKExpYnJhcnlVSVByZWZlcmVuY2VzCi0JCQkJLmdldERlc2NyaXB0b3JFdmVudERyaXZlbigpKTsKLQkJZGVzY3JpcHRvck9uZ29pbmdCdXR0b24uc2V0U2VsZWN0aW9uKExpYnJhcnlVSVByZWZlcmVuY2VzCi0JCQkJLmdldERlc2NyaXB0b3JPbmdvaW5nKCkpOwotCQlkZXNjcmlwdG9yUmVwZXRhYmxlQnV0dG9uLnNldFNlbGVjdGlvbihMaWJyYXJ5VUlQcmVmZXJlbmNlcwotCQkJCS5nZXREZXNjcmlwdG9yUmVwZWF0YWJsZSgpKTsKLQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcmVmZXJlbmNlcy5Db21tb25QcmVmUGFnZSNkb0dldFByZWZlcmVuY2VTdG9yZSgpCi0JICovCi0JcHJvdGVjdGVkIElQcmVmZXJlbmNlU3RvcmUgZG9HZXRQcmVmZXJlbmNlU3RvcmUoKSB7Ci0JCUlQcmVmZXJlbmNlU3RvcmVXcmFwcGVyIHdyYXBwZXIgPSBMaWJyYXJ5UGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQkJaWYgKCB3cmFwcGVyIGluc3RhbmNlb2YgUHJlZmVyZW5jZVN0b3JlV3JhcHBlciApIHsKLQkJCXJldHVybiAoKFByZWZlcmVuY2VTdG9yZVdyYXBwZXIpd3JhcHBlcikuZ2V0U3RvcmUoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJlZmVyZW5jZXMvQ29tbW9uUHJlZlBhZ2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJlZmVyZW5jZXMvQ29tbW9uUHJlZlBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDUxYmU1Mi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3ByZWZlcmVuY2VzL0NvbW1vblByZWZQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcmVmZXJlbmNlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24ucHJlZmVyZW5jZXMuSVByZWZlcmVuY2VTdG9yZVdyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS5QcmVmZXJlbmNlU3RvcmVXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlyZWN0b3J5RGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci0KLS8qKgotICogUHJlZmVyZW5jZSBwYWdlIGZvciBjb21tb24gb3B0aW9ucwotICogCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMAotICoKLSAqLwotcHVibGljIGNsYXNzIENvbW1vblByZWZQYWdlIGV4dGVuZHMgUHJlZmVyZW5jZVBhZ2UgewotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VQYWdlI2NyZWF0ZUNvbnRlbnRzKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKLQkgKi8KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCS8vIGRvIG5vdGhpbmcgaW4gdGhpcyBjb21tb24gcHJlZmVyZW5jZSBwYWdlCi0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCBDb21wb3NpdGUgY3JlYXRlR3JpZENvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50LCBpbnQgbnVtQ29sdW1ucykgewotCi0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOwotCi0JCS8vIEdyaWRMYXlvdXQKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IG51bUNvbHVtbnM7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQotCQkvLyBHcmlkRGF0YQotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWRhdGEudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQlkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIG9wZW5EaXJlY3RvcnlEaWFsb2coQ29tcG9zaXRlIHBhcmVudCwgVGV4dCBwYXRoX2N0cikgewotCQl0cnkgewotCQkJRGlyZWN0b3J5RGlhbG9nIGRkID0gbmV3IERpcmVjdG9yeURpYWxvZyhwYXJlbnQuZ2V0U2hlbGwoKSwKLQkJCQkJU1dULk5PTkUpOwotCi0JCQlTdHJpbmcgZGVzdGluYXRpb24gPSBkZC5vcGVuKCk7Ci0JCQlpZiAoZGVzdGluYXRpb24gIT0gbnVsbCkgewotCQkJCXBhdGhfY3RyLnNldFRleHQoZGVzdGluYXRpb24pOwotCQkJfQotCi0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJZXgucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBNZXRob2QgdG8gY3JlYXRlIGEgTGFiZWwKLQkgKiBAcGFyYW0gcGFyZW50IHBhcmVudCBjb21wb3NpdGUgb2YgdGhlIExhYmVsCi0JICogQHBhcmFtIHRleHQgTGFiZWwgdGV4dAotCSAqIEBwYXJhbSBzcGFuIGhvcml6b250YWwgc3BhbgotCSAqIEByZXR1cm4gdGhlIG5ld2x5IGNyZWF0ZWQgTGFiZWwKLQkgKi8KLQlwcm90ZWN0ZWQgTGFiZWwgY3JlYXRlTGFiZWwoQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIHRleHQsIGludCBzcGFuKSB7Ci0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULkxFRlQpOwotCQlsYWJlbC5zZXRUZXh0KHRleHQpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSBzcGFuOwotCQlkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQlsYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQlyZXR1cm4gbGFiZWw7Ci0JfQotCi0JLyoqCi0JICogTWV0aG9kIHRvIGNyZWF0ZSBhIHJhZGlvIGJ1dHRvbgotCSAqIEBwYXJhbSBwYXJlbnQgcGFyZW50IGNvbXBvc2l0ZSBvZiB0aGUgYnV0dG9uCi0JICogQHBhcmFtIGxhYmVsIHRoZSBidXR0b24gbGFiZWwKLQkgKiBAcmV0dXJuIHRoZSBuZXdseSBjcmVhdGVkIFJhZGlvIEJ1dHRvbgotCSAqLwotCXByb3RlY3RlZCBCdXR0b24gY3JlYXRlUmFkaW9CdXR0b24oQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIGxhYmVsKSB7Ci0JCUJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULlJBRElPIHwgU1dULkxFRlQpOwotCQlidXR0b24uc2V0VGV4dChsYWJlbCk7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJYnV0dG9uLnNldExheW91dERhdGEoZGF0YSk7Ci0JCXJldHVybiBidXR0b247Ci0JfQotCi0JLyoqCi0JICogTWV0aG9kIHRvIGNyZWF0ZSBhIGxpbmUKLQkgKiBAcGFyYW0gcGFyZW50IHBhcmVudCBjb21wb3NpdGUgb2YgdGhlIGxpbmUKLQkgKiBAcGFyYW0gbmNvbCBob3Jpem9udGFsIHNwYW4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVMaW5lKENvbXBvc2l0ZSBwYXJlbnQsIGludCBuY29sKSB7Ci0JCUxhYmVsIGxpbmUgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuU0VQQVJBVE9SIHwgU1dULkhPUklaT05UQUwKLQkJCQl8IFNXVC5CT0xEKTsKLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSBuY29sOwotCQlsaW5lLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCX0KLQotCS8qKgotCSAqIHJldHVybiB0aGUgcHJlZmVyZW5jZSBzdG9yZQotCSAqLwotCXByb3RlY3RlZCBJUHJlZmVyZW5jZVN0b3JlIGRvR2V0UHJlZmVyZW5jZVN0b3JlKCkgewotCi0JCUlQcmVmZXJlbmNlU3RvcmVXcmFwcGVyIHdyYXBwZXIgPSBMaWJyYXJ5UGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQkJaWYgKCB3cmFwcGVyIGluc3RhbmNlb2YgUHJlZmVyZW5jZVN0b3JlV3JhcHBlciApIHsKLQkJCXJldHVybiAoKFByZWZlcmVuY2VTdG9yZVdyYXBwZXIpd3JhcHBlcikuZ2V0U3RvcmUoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQkJLy8gcmV0dXJuIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJlZmVyZW5jZXMvTGlicmFyeUxvY2F0aW9uRGF0YS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcmVmZXJlbmNlcy9MaWJyYXJ5TG9jYXRpb25EYXRhLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3NjZiNDAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcmVmZXJlbmNlcy9MaWJyYXJ5TG9jYXRpb25EYXRhLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcmVmZXJlbmNlczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24ucHJlZmVyZW5jZXMuSVByZWZlcmVuY2VTdG9yZVdyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS5Db21tb25VSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnByZWZzLkxpYnJhcnlQcmVmZXJlbmNlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLnByZWZlcmVuY2VzLkxpYnJhcnlVSVByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLQotLyoqCi0gKiBMb2NhdGlvbiBEYXRhIGZvciBsaWJyYXJ5IAotICogCi0gKiBAYXV0aG9yIEJpbmdYdWUgWHUKLSAqIEBzaW5jZSAxLjAKLSAqIGZpeCBmb3IgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE1NzQwMQotICovCi1wdWJsaWMgY2xhc3MgTGlicmFyeUxvY2F0aW9uRGF0YSB7Ci0KLQlwcml2YXRlIFN0cmluZyBwYXJlbnRGb2xkZXI7Ci0KLQlwcml2YXRlIFN0cmluZyBsaWJOYW1lOwotCi0JcHJpdmF0ZSBTdHJpbmcgbGliQnJpZWZEZXNjcmlwdGlvbjsKLQotCXByaXZhdGUgYm9vbGVhbiBpc1NpbmdsZUxpYkZpbGU7Ci0KLQlwcml2YXRlIGJvb2xlYW4gZGVmTGliRGlyQ2hlY2tlZDsKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIGxpYnJhcnlGaWxlID0gImxpYnJhcnkueG1pIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBpc09rUHJlc3NlZC4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc09rUHJlc3NlZCgpIHsKLQkJcmV0dXJuIGlzT2tQcmVzc2VkOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBpc09rUHJlc3NlZAotCSAqICAgICAgICAgICAgVGhlIGlzT2tQcmVzc2VkIHRvIHNldC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRPa1ByZXNzZWQoYm9vbGVhbiBpc09rUHJlc3NlZCkgewotCQl0aGlzLmlzT2tQcmVzc2VkID0gaXNPa1ByZXNzZWQ7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzT2tQcmVzc2VkOwotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBpc1NpbmdsZUxpYkZpbGUuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTaW5nbGVMaWJGaWxlKCkgewotCQlyZXR1cm4gaXNTaW5nbGVMaWJGaWxlOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBpc1NpbmdsZUxpYkZpbGUKLQkgKiAgICAgICAgICAgIFRoZSBpc1NpbmdsZUxpYkZpbGUgdG8gc2V0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNpbmdsZUxpYkZpbGUoYm9vbGVhbiBpc1NpbmdsZUxpYkZpbGUpIHsKLQkJdGhpcy5pc1NpbmdsZUxpYkZpbGUgPSBpc1NpbmdsZUxpYkZpbGU7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBsaWJOYW1lLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TGliTmFtZSgpIHsKLQkJcmV0dXJuIGxpYk5hbWU7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHJldHVybiBGdWxsIHBhdGggb2YgbGlicmFyeS54bWkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExpYnJhcnlGaWxlKCkgewotCQlyZXR1cm4gZ2V0UGFyZW50Rm9sZGVyKCkgKyBGaWxlLnNlcGFyYXRvciArIGxpYnJhcnlGaWxlOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBsaWJOYW1lCi0JICogICAgICAgICAgICBUaGUgbGliTmFtZSB0byBzZXQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGliTmFtZShTdHJpbmcgbGliTmFtZSkgewotCQl0aGlzLmxpYk5hbWUgPSBsaWJOYW1lOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgcGFyZW50Rm9sZGVyLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UGFyZW50Rm9sZGVyKCkgewotCQlyZXR1cm4gcGFyZW50Rm9sZGVyOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBwYXJlbnRGb2xkZXIKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnRGb2xkZXIgdG8gc2V0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBhcmVudEZvbGRlcihTdHJpbmcgcGFyZW50Rm9sZGVyKSB7Ci0JCXRoaXMucGFyZW50Rm9sZGVyID0gcGFyZW50Rm9sZGVyOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgbGliQnJpZWZEZXNjcmlwdGlvbi4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExpYkJyaWVmRGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBsaWJCcmllZkRlc2NyaXB0aW9uOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBsaWJCcmllZkRlc2NyaXB0aW9uCi0JICogICAgICAgICAgICBUaGUgbGliQnJpZWZEZXNjcmlwdGlvbiB0byBzZXQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGliQnJpZWZEZXNjcmlwdGlvbihTdHJpbmcgbGliQnJpZWZEZXNjcmlwdGlvbikgewotCQl0aGlzLmxpYkJyaWVmRGVzY3JpcHRpb24gPSBsaWJCcmllZkRlc2NyaXB0aW9uOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgZGVmTGliRGlyQ2hlY2tlZC4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0RlZkxpYkRpckNoZWNrZWQoKSB7Ci0JCXJldHVybiBkZWZMaWJEaXJDaGVja2VkOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBkZWZMaWJEaXJDaGVja2VkCi0JICogICAgICAgICAgICBUaGUgZGVmTGliRGlyQ2hlY2tlZCB0byBzZXQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGVmTGliRGlyQ2hlY2tlZChib29sZWFuIGRlZkxpYkRpckNoZWNrZWQpIHsKLQkJdGhpcy5kZWZMaWJEaXJDaGVja2VkID0gZGVmTGliRGlyQ2hlY2tlZDsKLQl9Ci0KLQkvKioKLQkgKiBMb2FkcyBwcmVmZXJlbmNlcyBmcm9tIHRoZSBzdG9yZQotCSAqCi0JICovCi0JcHVibGljIHZvaWQgbG9hZEZyb21QcmVmZXJlbmNlU3RvcmUoKSB7Ci0JCUlQcmVmZXJlbmNlU3RvcmVXcmFwcGVyIHN0b3JlID0gTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCQkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0KLQkJU3RyaW5nIGxhc3REaXIgPSBzdG9yZQotCQkJCS5nZXRTdHJpbmcoTGlicmFyeVByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9MQVNUX0xJQlJBUllfUEFSRU5UX0RJUkVDVE9SWSk7Ci0JCXRoaXMuc2V0UGFyZW50Rm9sZGVyKGxhc3REaXIpOwotCi0JCWJvb2xlYW4gbGFzdENoZWNrZWQgPSBzdG9yZQotCQkJCS5nZXRCb29sZWFuKExpYnJhcnlQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfTEFTVF9ERUZBVUxUX0RJUkVDVE9SWV9DSEVDS0VEKTsKLQkJLy8gdGhlIGNvbnRhaW5zIG1ldGhvZCBkb2VzIG5vdCBzZWVtIHRvIHdvcmsgc28gdXNlIGxhc3QgZGlyIGFzIGFuCi0JCS8vIGFwcHJveGltYXRpb24gaWYKLQkJLy8gKHN0b3JlLmNvbnRhaW5zKExpYmFyeVByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9MQVNUX0RFRkFVTFRfRElSRUNUT1JZX0NIRUNLRUQpKQotCQlpZiAobGFzdERpciA9PSBudWxsIHx8IGxhc3REaXIudHJpbSgpLmxlbmd0aCgpID09IDApCi0JCQl0aGlzLnNldERlZkxpYkRpckNoZWNrZWQodHJ1ZSk7Ci0JCWVsc2UKLQkJCXRoaXMuc2V0RGVmTGliRGlyQ2hlY2tlZChsYXN0Q2hlY2tlZCk7Ci0JfQotCi0JLyoqCi0JICogU2F2ZXMgZGlhbG9nIGNob2ljZXMgdG8gdGhlIHByZWZlcmVuY2Ugc3RvcmUKLQkgKgotCSAqLwotCXB1YmxpYyB2b2lkIHNhdmVUb1ByZWZlcmVuY2VTdG9yZSgpIHsKLQkJSVByZWZlcmVuY2VTdG9yZVdyYXBwZXIgc3RvcmUgPSBMaWJyYXJ5UGx1Z2luLmdldERlZmF1bHQoKQotCQkJCS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQkJRmlsZSBmaWxlID0gbmV3IEZpbGUodGhpcy5nZXRQYXJlbnRGb2xkZXIoKSk7Ci0JCUxpYnJhcnlVSVByZWZlcmVuY2VzLnNldFNhdmVkTGlicmFyeVBhdGgoZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0JCXN0b3JlLnNldFZhbHVlKAotCQkJCUxpYnJhcnlQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfTEFTVF9MSUJSQVJZX1BBUkVOVF9ESVJFQ1RPUlksCi0JCQkJZmlsZS5nZXRQYXJlbnQoKSk7Ci0JCXN0b3JlLnNldFZhbHVlKAotCQkJCUxpYnJhcnlQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfTEFTVF9ERUZBVUxUX0RJUkVDVE9SWV9DSEVDS0VELAotCQkJCXRoaXMuaXNEZWZMaWJEaXJDaGVja2VkKCkpOwotCi0JCUxpYnJhcnlQbHVnaW4uZ2V0RGVmYXVsdCgpLnNhdmVQbHVnaW5QcmVmZXJlbmNlcygpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcmVmZXJlbmNlcy9MaWJyYXJ5UHJlZmVyZW5jZUNvbnN0YW50cy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcmVmZXJlbmNlcy9MaWJyYXJ5UHJlZmVyZW5jZUNvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyM2YxYzI4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJlZmVyZW5jZXMvTGlicmFyeVByZWZlcmVuY2VDb25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJlZmVyZW5jZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wcmVmcy5QcmVmZXJlbmNlQ29uc3RhbnRzOwotCi0vKioKLSAqIFByZWZlcmVuY2UgQ29uc3RhbnRzIGZvciBsaWJyYXJ5Ci0gKiBAYXV0aG9yIEJpbmdYdWUgWHUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBMaWJyYXJ5UHJlZmVyZW5jZUNvbnN0YW50cyBleHRlbmRzIFByZWZlcmVuY2VDb25zdGFudHMgewotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3ByZWZlcmVuY2VzL0xpYnJhcnlQcmVmZXJlbmNlSW5pdGlhbGl6ZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJlZmVyZW5jZXMvTGlicmFyeVByZWZlcmVuY2VJbml0aWFsaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMWQyNDc4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJlZmVyZW5jZXMvTGlicmFyeVByZWZlcmVuY2VJbml0aWFsaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcmVmZXJlbmNlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5BYnN0cmFjdFByZWZlcmVuY2VJbml0aWFsaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuUHJvY2Vzc0VkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnByZWZlcmVuY2VzLklQcmVmZXJlbmNlU3RvcmVXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucHJlZnMuTGlicmFyeVByZWZlcmVuY2VDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotCi0vKioKLSAqIEluaXRpYWxpemVyIGZvciBsaWJyYXJ5IHByZWZlcmVuY2VzCi0gKiAKLSAqIEBhdXRob3IgQmluZ1h1ZSBYdQotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIExpYnJhcnlQcmVmZXJlbmNlSW5pdGlhbGl6ZXIgZXh0ZW5kcyBBYnN0cmFjdFByZWZlcmVuY2VJbml0aWFsaXplciB7Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5BYnN0cmFjdFByZWZlcmVuY2VJbml0aWFsaXplciNpbml0aWFsaXplRGVmYXVsdFByZWZlcmVuY2VzKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplRGVmYXVsdFByZWZlcmVuY2VzKCkgewotCQlJUHJlZmVyZW5jZVN0b3JlV3JhcHBlciBzdG9yZSA9IExpYnJhcnlQbHVnaW4uZ2V0RGVmYXVsdCgpCi0JCQkJLmdldFByZWZlcmVuY2VTdG9yZSgpOwotCQlzdG9yZS5zZXREZWZhdWx0KExpYnJhcnlQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfUkFESU9fU0FWRV9DSE9JQ0UsIDEpOwotCQkKLQkJc3RvcmUuc2V0RGVmYXVsdChBcHBsaWNhdGlvblByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9XQlNfQ09MVU1OUywKLQkJCQlQcm9jZXNzRWRpdG9yUHJlZmVyZW5jZVBhZ2UKLQkJCQkJCS50b1N0cmluZyhQcm9jZXNzRWRpdG9yLkRFRkFVTFRfV0JTX0NPTFVNTlMpKTsKLQkJc3RvcmUuc2V0RGVmYXVsdChBcHBsaWNhdGlvblByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9UQlNfQ09MVU1OUywKLQkJCQlQcm9jZXNzRWRpdG9yUHJlZmVyZW5jZVBhZ2UKLQkJCQkJCS50b1N0cmluZyhQcm9jZXNzRWRpdG9yLkRFRkFVTFRfVEJTX0NPTFVNTlMpKTsKLQkJc3RvcmUuc2V0RGVmYXVsdChBcHBsaWNhdGlvblByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9XUEJTX0NPTFVNTlMsCi0JCQkJUHJvY2Vzc0VkaXRvclByZWZlcmVuY2VQYWdlCi0JCQkJCQkudG9TdHJpbmcoUHJvY2Vzc0VkaXRvci5ERUZBVUxUX1dQQlNfQ09MVU1OUykpOwotCQlzdG9yZS5zZXREZWZhdWx0KAotCQkJCUFwcGxpY2F0aW9uUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX0lOSEVSSVRfU1VQUFJFU1NJT05fU1RBVEUsCi0JCQkJdHJ1ZSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3ByZWZlcmVuY2VzL0xpYnJhcnlWaWV3UHJlZlBhZ2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJlZmVyZW5jZXMvTGlicmFyeVZpZXdQcmVmUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OGI5YzQ1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJlZmVyZW5jZXMvTGlicmFyeVZpZXdQcmVmUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcmVmZXJlbmNlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5MaWJyYXJ5VUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5SZXNvdXJjZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmludGVybmFsLnBhZ2VzZXR1cC5EZWZhdWx0VmFsdWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuaW50ZXJuYWwucHJvcGVydGllcy5Xb3Jrc3BhY2VWaWV3ZXJQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuRmllbGRFZGl0b3JQcmVmZXJlbmNlUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5SYWRpb0dyb3VwRmllbGRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFByZWZlcmVuY2VQYWdlOwotCi0vKioKLSAqIExpYnJhcnkgdmlldyBvcHRpb25zIHByZWZlcmVuY2UgcGFnZQotICogCi0gKiBAYXV0aG9yIEplZmYgSGFyZHkKLSAqIEBzaW5jZSAxLjIKLSAqLwotcHVibGljIGNsYXNzIExpYnJhcnlWaWV3UHJlZlBhZ2UgZXh0ZW5kcyBGaWVsZEVkaXRvclByZWZlcmVuY2VQYWdlIGltcGxlbWVudHMgSVdvcmtiZW5jaFByZWZlcmVuY2VQYWdlIHsKLQkKLQlwdWJsaWMgTGlicmFyeVZpZXdQcmVmUGFnZSgpIHsKLQkJc3VwZXIoR1JJRCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRmllbGRFZGl0b3JzKCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCUNvbXBvc2l0ZSBwYXJlbnQgPSBnZXRGaWVsZEVkaXRvclBhcmVudCgpOwotCQlSYWRpb0dyb3VwRmllbGRFZGl0b3IgZGVmYXVsdExpbmtUeXBlRWRpdG9yID0gbmV3IFJhZGlvR3JvdXBGaWVsZEVkaXRvcigKLQkgICAgCSAgICAgCQkJQXBwbGljYXRpb25QcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfTElCX1ZJRVdfRE5EX0RFRkFVTFRfTElOS1RZUEUsCi0JICAgIAkgICAgIAkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLmRlZmF1bHRMaW5rVHlwZVByZWZMYWJlbCwgMSwKLQkgICAgCSAgICAgCQkJbmV3IFN0cmluZ1tdW10gewotCSAgICAJICAgICAJCQkJCXtMaWJyYXJ5VUlSZXNvdXJjZXMuZWxlbWVudExpbmtfbmFtZSwgUmVzb3VyY2VIZWxwZXIuRUxFTUVOVF9MSU5LX0NMQVNTX2VsZW1lbnRMaW5rfSwKLQkgICAgCSAgICAgCQkJCQl7TGlicmFyeVVJUmVzb3VyY2VzLmVsZW1lbnRMaW5rV2l0aFR5cGVfbmFtZSwgUmVzb3VyY2VIZWxwZXIuRUxFTUVOVF9MSU5LX0NMQVNTX2VsZW1lbnRMaW5rV2l0aFR5cGV9LAotCSAgICAJICAgICAJCQkJCXtMaWJyYXJ5VUlSZXNvdXJjZXMuZWxlbWVudExpbmtXaXRoVXNlclRleHRfbmFtZSwgUmVzb3VyY2VIZWxwZXIuRUxFTUVOVF9MSU5LX0NMQVNTX2VsZW1lbnRMaW5rV2l0aFVzZXJUZXh0fQotCSAgICAJICAgICAJCQl9LCBwYXJlbnQsIHRydWUpOwotCQlkZWZhdWx0TGlua1R5cGVFZGl0b3Iuc2V0UHJlZmVyZW5jZVN0b3JlKGRvR2V0UHJlZmVyZW5jZVN0b3JlKCkpOwotCQlhZGRGaWVsZChkZWZhdWx0TGlua1R5cGVFZGl0b3IpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2ggd29ya2JlbmNoKSB7Ci0JfQotCQotCXByb3RlY3RlZCBJUHJlZmVyZW5jZVN0b3JlIGRvR2V0UHJlZmVyZW5jZVN0b3JlKCkgewotCQlyZXR1cm4gQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpOwotCX0KLQkKLQkvKioKLQkgKiBJbml0aWFsaXplcyBwcmludGluZyBwcmVmZXJlbmNlcyB0byB0aGVpciBkZWZhdWx0IHZhbHVlcy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgaW5pdERlZmF1bHRzKElQcmVmZXJlbmNlU3RvcmUgc3RvcmUpIHsKLQkJc3RvcmUuc2V0RGVmYXVsdChBcHBsaWNhdGlvblByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9MSUJfVklFV19ETkRfREVGQVVMVF9MSU5LVFlQRSwKLQkJCQlSZXNvdXJjZUhlbHBlci5FTEVNRU5UX0xJTktfQ0xBU1NfZWxlbWVudExpbmspOwotCX0KLQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3ByZWZlcmVuY2VzL1Byb2Nlc3NFZGl0b3JQcmVmZXJlbmNlUGFnZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcmVmZXJlbmNlcy9Qcm9jZXNzRWRpdG9yUHJlZmVyZW5jZVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2Q3YmVlYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3ByZWZlcmVuY2VzL1Byb2Nlc3NFZGl0b3JQcmVmZXJlbmNlUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJlZmVyZW5jZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLkNvbHVtbkRlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLlByb2Nlc3NFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5wcmVmZXJlbmNlcy5JUHJlZmVyZW5jZVN0b3JlV3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpLlByZWZlcmVuY2VTdG9yZVdyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5MaWJyYXJ5VUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkucHJlZmVyZW5jZXMuTGlicmFyeVVJUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5NZXNzYWdlRGlhbG9nV2l0aFRvZ2dsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXJMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUcmVlQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGlzdFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXJGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLkxpc3RTZWxlY3Rpb25EaWFsb2c7Ci0KLS8qKgotICogUHJlZmVyZW5jZSBwYWdlIGZvciBQcm9jZXNzRWRpdG9yCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFByb2Nlc3NFZGl0b3JQcmVmZXJlbmNlUGFnZSBleHRlbmRzIFByZWZlcmVuY2VQYWdlIGltcGxlbWVudHMKLQkJSVdvcmtiZW5jaFByZWZlcmVuY2VQYWdlLCBTZWxlY3Rpb25MaXN0ZW5lciwgTW9kaWZ5TGlzdGVuZXIgewotCi0JLy8gcHJpdmF0ZSBUZXh0IGxpbmVXaWR0aFRleHQ7Ci0JLy8gcHJpdmF0ZSBCdXR0b24gaW5kZW50Q2hlY2tib3g7Ci0JLy8gcHJpdmF0ZSBUZXh0IGluZGVudFNpemVUZXh0OwotCS8vIHByaXZhdGUgQ29tYm8gYnNDb21ibzsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0JTX1RYVCA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLlByb2Nlc3NFZGl0b3JfV29ya0JyZWFrZG93blN0cnVjdHVyZTsgCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEJTX1RYVCA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLlByb2Nlc3NFZGl0b3JfVGVhbUFsbG9jYXRpb247IAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFdQQlNfVFhUID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuUHJvY2Vzc0VkaXRvcl9Xb3JrUHJvZHVjdFVzYWdlOyAKLQotCXByaXZhdGUgTGlzdFZpZXdlciBzZWxlY3RlZENvbHVtbkxpc3RWaWV3ZXI7Ci0KLQkvLyBwcml2YXRlIExpc3RWaWV3ZXIgdGJzU2VsZWN0ZWRDb2xMaXN0OwotCS8vIHByaXZhdGUgTGlzdFZpZXdlciB3cGJzU2VsZWN0ZWRDb2xMaXN0OwotCXByaXZhdGUgamF2YS51dGlsLkxpc3Qgd2JzQ29sdW1uRGVzY3JpcHRvcnM7Ci0KLQlwcml2YXRlIGphdmEudXRpbC5MaXN0IHRic0NvbHVtbkRlc2NyaXB0b3JzOwotCi0JcHJpdmF0ZSBqYXZhLnV0aWwuTGlzdCB3cGJzQ29sdW1uRGVzY3JpcHRvcnM7Ci0KLQlwcml2YXRlIEJ1dHRvbiBhZGRCdXR0b247Ci0KLQlwcml2YXRlIEJ1dHRvbiByZW1vdmVCdXR0b247Ci0KLQlwcml2YXRlIEJ1dHRvbiBkb3duQnV0dG9uOwotCi0JcHJpdmF0ZSBCdXR0b24gdXBCdXR0b247Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBCU19OQU1FUyA9IG5ldyBTdHJpbmdbXSB7IFdCU19UWFQsIFRCU19UWFQsCi0JCQlXUEJTX1RYVCB9OwotCi0JcHJpdmF0ZSBMaXN0W10gY29sdW1uRGVzY3JpcHRvckxpc3RzOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgTGlzdFtdIEFMTF9DT0xVTU5fREVTQ1JJUFRPUl9MSVNUUyA9IG5ldyBMaXN0W10gewotCQkJUHJvY2Vzc0VkaXRvci5BTExfV0JTX0NPTFVNTlMsIFByb2Nlc3NFZGl0b3IuQUxMX1RCU19DT0xVTU5TLAotCQkJUHJvY2Vzc0VkaXRvci5BTExfV1BCU19DT0xVTU5TIH07Ci0KLQkvLyBjb25maWd1cmF0aW9uIHN3aXRjaGluZyBwcmVmZXJlbmNlCi0JcHJpdmF0ZSBCdXR0b24gY29uZmlnU3dpdGNoQWx3YXlzQnV0dG9uOwotCi0JcHJpdmF0ZSBCdXR0b24gY29uZmlnU3dpdGNoTmV2ZXJCdXR0b247Ci0KLQlwcml2YXRlIEJ1dHRvbiBjb25maWdTd2l0Y2hQcm9tcHRCdXR0b247Ci0KLQlwcml2YXRlIEJ1dHRvbiBpbmhlcml0U3VwcHJlc3Npb25CdXR0b247Ci0KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBDb2x1bW5EZXNjcmlwdG9yUHJvdmlkZXIgaW1wbGVtZW50cwotCQkJSVRyZWVDb250ZW50UHJvdmlkZXIsIElMYWJlbFByb3ZpZGVyIHsKLQotCQlwdWJsaWMgQ29sdW1uRGVzY3JpcHRvclByb3ZpZGVyKCkgewotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUcmVlQ29udGVudFByb3ZpZGVyI2dldENoaWxkcmVuKGphdmEubGFuZy5PYmplY3QpCi0JCSAqLwotCQlwdWJsaWMgT2JqZWN0W10gZ2V0Q2hpbGRyZW4oT2JqZWN0IHBhcmVudEVsZW1lbnQpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUcmVlQ29udGVudFByb3ZpZGVyI2dldFBhcmVudChqYXZhLmxhbmcuT2JqZWN0KQotCQkgKi8KLQkJcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUcmVlQ29udGVudFByb3ZpZGVyI2hhc0NoaWxkcmVuKGphdmEubGFuZy5PYmplY3QpCi0JCSAqLwotCQlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbihPYmplY3QgZWxlbWVudCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyI2dldEVsZW1lbnRzKGphdmEubGFuZy5PYmplY3QpCi0JCSAqLwotCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGlucHV0RWxlbWVudCkgewotCQkJcmV0dXJuICgoamF2YS51dGlsLkxpc3QpIGlucHV0RWxlbWVudCkudG9BcnJheSgpOwotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDb250ZW50UHJvdmlkZXIjZGlzcG9zZSgpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCi0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNvbnRlbnRQcm92aWRlciNpbnB1dENoYW5nZWQob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXIsCi0JCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLk9iamVjdCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkgewotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyI2dldEltYWdlKGphdmEubGFuZy5PYmplY3QpCi0JCSAqLwotCQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyI2dldFRleHQoamF2YS5sYW5nLk9iamVjdCkKLQkJICovCi0JCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgewotCQkJcmV0dXJuICgoQ29sdW1uRGVzY3JpcHRvcikgZWxlbWVudCkubGFiZWw7Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUJhc2VMYWJlbFByb3ZpZGVyI2FkZExpc3RlbmVyKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXJMaXN0ZW5lcikKLQkJICovCi0JCXB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKElMYWJlbFByb3ZpZGVyTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQmFzZUxhYmVsUHJvdmlkZXIjaXNMYWJlbFByb3BlcnR5KGphdmEubGFuZy5PYmplY3QsCi0JCSAqICAgICAgamF2YS5sYW5nLlN0cmluZykKLQkJICovCi0JCXB1YmxpYyBib29sZWFuIGlzTGFiZWxQcm9wZXJ0eShPYmplY3QgZWxlbWVudCwgU3RyaW5nIHByb3BlcnR5KSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUJhc2VMYWJlbFByb3ZpZGVyI3JlbW92ZUxpc3RlbmVyKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXJMaXN0ZW5lcikKLQkJICovCi0JCXB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKElMYWJlbFByb3ZpZGVyTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJfQotCi0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2UjaW5pdChvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoKQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaCB3b3JrYmVuY2gpIHsKLQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlUGFnZSNkb0dldFByZWZlcmVuY2VTdG9yZSgpCi0JICovCi0JcHJvdGVjdGVkIElQcmVmZXJlbmNlU3RvcmUgZG9HZXRQcmVmZXJlbmNlU3RvcmUoKSB7Ci0JCUlQcmVmZXJlbmNlU3RvcmVXcmFwcGVyIHdyYXBwZXIgPSBMaWJyYXJ5UGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQkJaWYgKCB3cmFwcGVyIGluc3RhbmNlb2YgUHJlZmVyZW5jZVN0b3JlV3JhcHBlciApIHsKLQkJCXJldHVybiAoKFByZWZlcmVuY2VTdG9yZVdyYXBwZXIpd3JhcHBlcikuZ2V0U3RvcmUoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZVBhZ2UjY3JlYXRlQ29udGVudHMob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlKQotCSAqLwotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJaW5pdERhdGEoKTsKLQotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJY29tcG9zaXRlLnNldExheW91dChuZXcgR3JpZExheW91dCgxLCBmYWxzZSkpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLQkJQ29tcG9zaXRlIGNvbHVtbnNDb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQljb2x1bW5zQ29tcG9zaXRlLnNldExheW91dChuZXcgR3JpZExheW91dCgxLCBmYWxzZSkpOwotCQljb2x1bW5zQ29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCi0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKGNvbHVtbnNDb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJbGFiZWwuc2V0VGV4dChBdXRob3JpbmdVSVJlc291cmNlcy5jb2x1bW5zZWxlY3Rpb25fdGV4dCk7IAotCi0JCWZpbmFsIENvbWJvIGJzQ29tYm8gPSBuZXcgQ29tYm8oY29sdW1uc0NvbXBvc2l0ZSwgU1dULlJFQURfT05MWQotCQkJCXwgU1dULkJPUkRFUik7Ci0JCWJzQ29tYm8uc2V0SXRlbXMoQlNfTkFNRVMpOwotCQlic0NvbWJvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCUNvbWJvIGNvbWJvID0gKENvbWJvKSBlLmdldFNvdXJjZSgpOwotCQkJCWludCBpZCA9IGNvbWJvLmdldFNlbGVjdGlvbkluZGV4KCk7Ci0JCQkJaWYgKGlkICE9IC0xKSB7Ci0JCQkJCXNlbGVjdGVkQ29sdW1uTGlzdFZpZXdlcgotCQkJCQkJCS5zZXRJbnB1dChjb2x1bW5EZXNjcmlwdG9yTGlzdHNbaWRdKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0KLQkJCX0KLQotCQl9KTsKLQkJYnNDb21iby5zZWxlY3QoMCk7Ci0KLQkJQ29tcG9zaXRlIGxpc3RDb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKTsKLQkJbGlzdENvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQkJbGlzdENvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQotCQlDb21wb3NpdGUgc3ViQ29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShsaXN0Q29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5tYXJnaW5MZWZ0ID0gMDsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJc3ViQ29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCQlzdWJDb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLQkJc2VsZWN0ZWRDb2x1bW5MaXN0Vmlld2VyID0gbmV3IExpc3RWaWV3ZXIoc3ViQ29tcG9zaXRlLCBTV1QuTVVMVEkKLQkJCQl8IFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCB8IFNXVC5CT1JERVIpOwotCQlmaW5hbCBDb2x1bW5EZXNjcmlwdG9yUHJvdmlkZXIgaXRlbVByb3ZpZGVyID0gbmV3IENvbHVtbkRlc2NyaXB0b3JQcm92aWRlcigpOwotCQlzZWxlY3RlZENvbHVtbkxpc3RWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKGl0ZW1Qcm92aWRlcik7Ci0JCXNlbGVjdGVkQ29sdW1uTGlzdFZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKGl0ZW1Qcm92aWRlcik7Ci0JCXNlbGVjdGVkQ29sdW1uTGlzdFZpZXdlci5zZXRJbnB1dCh3YnNDb2x1bW5EZXNjcmlwdG9ycyk7Ci0JCXNlbGVjdGVkQ29sdW1uTGlzdFZpZXdlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKXsKLQotCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQlMaXN0IHJlbW92ZUxpc3QgPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3RlZENvbHVtbkxpc3RWaWV3ZXIKLQkJCQkJCS5nZXRTZWxlY3Rpb24oKSkudG9MaXN0KCk7Ci0JCQkJaWYgKHJlbW92ZUxpc3QuY29udGFpbnMoUHJvY2Vzc0VkaXRvci5DT0xfREVTQ19JRCkKLQkJCQkJCXx8IHJlbW92ZUxpc3QKLQkJCQkJCQkJLmNvbnRhaW5zKFByb2Nlc3NFZGl0b3IuQ09MX0RFU0NfUFJFU0VOVEFUSU9OX05BTUUpKSB7Ci0JCQkJCS8vIGlmIHByZXNlbnQgbmFtZSBvciBpZCBzZWxlY3RlZCwgCi0JCQkJCS8vIGRpc2FibGUgInJlbW92ZSIsInVwIiBhbmQgImRvd24iIGJ1dHRvbgotCQkJCQkvLwotCQkJCQlpZihyZW1vdmVCdXR0b24uaXNFbmFibGVkKCkpIHJlbW92ZUJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQkJaWYodXBCdXR0b24uaXNFbmFibGVkKCkpIHVwQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCQlpZihkb3duQnV0dG9uLmlzRW5hYmxlZCgpKSBkb3duQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWlmKCFyZW1vdmVCdXR0b24uaXNFbmFibGVkKCkpIHJlbW92ZUJ1dHRvbi5zZXRFbmFibGVkKHRydWUpOwotCQkJCQlpZighdXBCdXR0b24uaXNFbmFibGVkKCkpIHVwQnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJCWlmKCFkb3duQnV0dG9uLmlzRW5hYmxlZCgpKSBkb3duQnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJfQotCQkJfQotCQkJCi0JCX0pOwotCQkKLQkKLQkJc2VsZWN0ZWRDb2x1bW5MaXN0Vmlld2VyLmdldENvbnRyb2woKS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQotCQkvLyB3YnNTZWxlY3RlZENvbHVtbnNUYWJsZS5zZXRJdGVtcyhuZXcgU3RyaW5nW10gewotCQkvLyBJQlNJdGVtUHJvdmlkZXIuQ09MX0lELAotCQkvLyBJQlNJdGVtUHJvdmlkZXIuQ09MX0lTX0VWRU5UX0RSSVZFTiwKLQkJLy8gSUJTSXRlbVByb3ZpZGVyLkNPTF9JU19PTkdPSU5HLAotCQkvLyBJQlNJdGVtUHJvdmlkZXIuQ09MX0lTX1JFUEVBVEFCTEUsCi0JCS8vIElCU0l0ZW1Qcm92aWRlci5DT0xfTU9ERUxfSU5GTywKLQkJLy8gSUJTSXRlbVByb3ZpZGVyLkNPTF9OQU1FLAotCQkvLyBJQlNJdGVtUHJvdmlkZXIuQ09MX1BSRURFQ0VTU09SUywKLQkJLy8gSUJTSXRlbVByb3ZpZGVyLkNPTF9QUkVGSVgsCi0JCS8vIElCU0l0ZW1Qcm92aWRlci5DT0xfVFlQRSwKLQkJLy8gfSk7Ci0KLQkJLy8gQ1RhYkl0ZW0gdGFiSXRlbSA9IG5ldyBDVGFiSXRlbSh0YWJGb2xkZXIsIFNXVC5OT05FKTsKLQkJLy8gdGFiSXRlbS5zZXRUZXh0KCJXb3JrIEJyZWFrZG93biBTdHJ1Y3R1cmUiKTsKLQkJLy8gdGFiSXRlbS5zZXRDb250cm9sKHdic1NlbGVjdGVkQ29sdW1uc1RhYmxlLmdldENvbnRyb2woKSk7Ci0KLQkJLy8gdGJzU2VsZWN0ZWRDb2xMaXN0ID0gbmV3IExpc3RWaWV3ZXIoY29sdW1uc0NvbXBvc2l0ZSwgU1dULkNIRUNLIHwKLQkJLy8gU1dULk1VTFRJIHwgU1dULkhfU0NST0xMIHwgU1dULlZfU0NST0xMIHwgU1dULkJPUkRFUik7Ci0JCS8vIHRic1NlbGVjdGVkQ29sTGlzdC5zZXRDb250ZW50UHJvdmlkZXIoaXRlbVByb3ZpZGVyKTsKLQkJLy8gdGJzU2VsZWN0ZWRDb2xMaXN0LnNldExhYmVsUHJvdmlkZXIoaXRlbVByb3ZpZGVyKTsKLQkJLy8gdGJzU2VsZWN0ZWRDb2xMaXN0LnNldElucHV0KHRic0NvbHVtbkRlc2NyaXB0b3JzKTsKLQkJLy8gdGJzU2VsZWN0ZWRDb2xMaXN0LnNldEl0ZW1zKG5ldyBTdHJpbmdbXSB7Ci0JCS8vIElCU0l0ZW1Qcm92aWRlci5DT0xfSUQsCi0JCS8vIElCU0l0ZW1Qcm92aWRlci5DT0xfTU9ERUxfSU5GTywKLQkJLy8gSUJTSXRlbVByb3ZpZGVyLkNPTF9OQU1FLAotCQkvLyBJQlNJdGVtUHJvdmlkZXIuQ09MX1BSRUZJWCwKLQkJLy8gSUJTSXRlbVByb3ZpZGVyLkNPTF9UWVBFLAotCQkvLyB9KTsKLQkJLy8gdGFiSXRlbSA9IG5ldyBDVGFiSXRlbSh0YWJGb2xkZXIsIFNXVC5OT05FKTsKLQkJLy8gdGFiSXRlbS5zZXRUZXh0KCJUZWFtIEJyZWFrZG93biBTdHJ1Y3R1cmUiKTsKLQkJLy8gdGFiSXRlbS5zZXRDb250cm9sKHRic1NlbGVjdGVkQ29sTGlzdC5nZXRDb250cm9sKCkpOwotCi0JCS8vIHdwYnNTZWxlY3RlZENvbExpc3QgPSBuZXcgTGlzdFZpZXdlcihjb2x1bW5zQ29tcG9zaXRlLCBTV1QuQ0hFQ0sgfAotCQkvLyBTV1QuTVVMVEkgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuQk9SREVSKTsKLQkJLy8gd3Bic1NlbGVjdGVkQ29sTGlzdC5zZXRDb250ZW50UHJvdmlkZXIoaXRlbVByb3ZpZGVyKTsKLQkJLy8gd3Bic1NlbGVjdGVkQ29sTGlzdC5zZXRMYWJlbFByb3ZpZGVyKGl0ZW1Qcm92aWRlcik7Ci0JCS8vIHdwYnNTZWxlY3RlZENvbExpc3Quc2V0SW5wdXQod3Bic0NvbHVtbkRlc2NyaXB0b3JzKTsKLQkJLy8gdGFiSXRlbSA9IG5ldyBDVGFiSXRlbSh0YWJGb2xkZXIsIFNXVC5OT05FKTsKLQkJLy8gdGFiSXRlbS5zZXRUZXh0KCJXb3JrIFByb2R1Y3QgQnJlYWtkb3duIFN0cnVjdHVyZSIpOwotCQkvLyB0YWJJdGVtLnNldENvbnRyb2wod3Bic1NlbGVjdGVkQ29sTGlzdC5nZXRDb250cm9sKCkpOwotCi0JCUNvbXBvc2l0ZSBidXR0b25zQ29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShsaXN0Q29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWJ1dHRvbnNDb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwpOwotCQlncmlkRGF0YS53aWR0aEhpbnQgPSAxMDA7Ci0JCWJ1dHRvbnNDb21wb3NpdGUuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLQkJR3JpZERhdGEgbGF5b3V0RGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0JFR0lOTklORyB8IEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0KLQkJYWRkQnV0dG9uID0gbmV3IEJ1dHRvbihidXR0b25zQ29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWFkZEJ1dHRvbi5zZXRUZXh0KEF1dGhvcmluZ1VJVGV4dC5BRERfQlVUVE9OX1RFWFQpOwotCQlhZGRCdXR0b24uc2V0TGF5b3V0RGF0YShsYXlvdXREYXRhKTsKLQkJYWRkQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWludCBpZCA9IGJzQ29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLQkJCQlPYmplY3QgaW5wdXQgPSBBTExfQ09MVU1OX0RFU0NSSVBUT1JfTElTVFNbaWRdOwotCQkJCWZpbmFsIExpc3Qgc2VsZWN0ZWRDb2x1bW5zID0gY29sdW1uRGVzY3JpcHRvckxpc3RzW2lkXTsKLQkJCQlMaXN0U2VsZWN0aW9uRGlhbG9nIGRsZyA9IG5ldyBMaXN0U2VsZWN0aW9uRGlhbG9nKAotCQkJCQkJRGlzcGxheS5nZXRDdXJyZW50KCkuZ2V0QWN0aXZlU2hlbGwoKSwKLQkJCQkJCWlucHV0LAotCQkJCQkJaXRlbVByb3ZpZGVyLAotCQkJCQkJaXRlbVByb3ZpZGVyLAotCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuc2VsZWN0Q29sdW1uc3RvQWRkX3RleHQpIHsgCi0JCQkJCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkgewotCQkJCQkJQ29udHJvbCBjb250cm9sID0gc3VwZXIuY3JlYXRlRGlhbG9nQXJlYShwYXJlbnQpOwotCQkJCQkJZ2V0Vmlld2VyKCkuYWRkRmlsdGVyKG5ldyBWaWV3ZXJGaWx0ZXIoKSB7Ci0KLQkJCQkJCQlwdWJsaWMgYm9vbGVhbiBzZWxlY3QoVmlld2VyIHZpZXdlciwKLQkJCQkJCQkJCU9iamVjdCBwYXJlbnRFbGVtZW50LCBPYmplY3QgZWxlbWVudCkgewotCQkJCQkJCQlyZXR1cm4gIXNlbGVjdGVkQ29sdW1ucy5jb250YWlucyhlbGVtZW50KTsKLQkJCQkJCQl9Ci0KLQkJCQkJCX0pOwotCQkJCQkJcmV0dXJuIGNvbnRyb2w7Ci0JCQkJCX0KLQotCQkJCX07Ci0JCQkJaWYgKGRsZy5vcGVuKCkgPT0gV2luZG93Lk9LKSB7Ci0JCQkJCXNlbGVjdGVkQ29sdW1ucy5hZGRBbGwoQXJyYXlzLmFzTGlzdChkbGcuZ2V0UmVzdWx0KCkpKTsKLQkJCQkJc2VsZWN0ZWRDb2x1bW5MaXN0Vmlld2VyLnJlZnJlc2goKTsKLQkJCQl9Ci0KLQkJCX0KLQkJfSk7Ci0KLQkJcmVtb3ZlQnV0dG9uID0gbmV3IEJ1dHRvbihidXR0b25zQ29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCXJlbW92ZUJ1dHRvbi5zZXRUZXh0KEF1dGhvcmluZ1VJUmVzb3VyY2VzLnJlbW92ZUJ1dHRvbl90ZXh0KTsgCi0JCXJlbW92ZUJ1dHRvbi5zZXRMYXlvdXREYXRhKGxheW91dERhdGEpOwotCQlyZW1vdmVCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlqYXZhLnV0aWwuTGlzdCBjb2x1bW5zID0gKGphdmEudXRpbC5MaXN0KSBzZWxlY3RlZENvbHVtbkxpc3RWaWV3ZXIKLQkJCQkJCS5nZXRJbnB1dCgpOwotCQkJCUxpc3QgcmVtb3ZlTGlzdCA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGVkQ29sdW1uTGlzdFZpZXdlcgotCQkJCQkJLmdldFNlbGVjdGlvbigpKS50b0xpc3QoKTsKLQkJCQlpZiAocmVtb3ZlTGlzdC5jb250YWlucyhQcm9jZXNzRWRpdG9yLkNPTF9ERVNDX0lEKQotCQkJCQkJfHwgcmVtb3ZlTGlzdAotCQkJCQkJCQkuY29udGFpbnMoUHJvY2Vzc0VkaXRvci5DT0xfREVTQ19QUkVTRU5UQVRJT05fTkFNRSkpIHsKLQkJCQkJLy8gY2Fubm90IHJlbW92ZSBuYW1lIG9yIElEIGNvbHVtbgotCQkJCQkvLwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCWNvbHVtbnMucmVtb3ZlQWxsKHJlbW92ZUxpc3QpOwotCQkJCXNlbGVjdGVkQ29sdW1uTGlzdFZpZXdlci5yZWZyZXNoKCk7Ci0JCQl9Ci0KLQkJfSk7Ci0KLQkJdXBCdXR0b24gPSBuZXcgQnV0dG9uKGJ1dHRvbnNDb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJdXBCdXR0b24uc2V0VGV4dChBdXRob3JpbmdVSVRleHQuVVBfQlVUVE9OX1RFWFQpOwotCQl1cEJ1dHRvbi5zZXRMYXlvdXREYXRhKGxheW91dERhdGEpOwotCQl1cEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0ZWRDb2x1bW5MaXN0Vmlld2VyCi0JCQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJaWYgKHNlbGVjdGlvbi5zaXplKCkgPiAxKQotCQkJCQlyZXR1cm47Ci0JCQkJRUxpc3QgY29sdW1ucyA9IChFTGlzdCkgc2VsZWN0ZWRDb2x1bW5MaXN0Vmlld2VyLmdldElucHV0KCk7Ci0JCQkJT2JqZWN0IHNlbGVjdGVkID0gc2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOwotCQkJCWludCBpZCA9IGNvbHVtbnMuaW5kZXhPZihzZWxlY3RlZCk7Ci0JCQkJaWYgKGJzQ29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKSA9PSAwICYmIGlkIDwgMykKLQkJCQkJcmV0dXJuOwotCQkJCWlmIChic0NvbWJvLmdldFNlbGVjdGlvbkluZGV4KCkgPiAwICYmIGlkIDwgMikKLQkJCQkJcmV0dXJuOwotCQkJCWNvbHVtbnMubW92ZShpZCAtIDEsIGlkKTsKLQkJCQlzZWxlY3RlZENvbHVtbkxpc3RWaWV3ZXIucmVmcmVzaCgpOwotCQkJCXNlbGVjdGVkQ29sdW1uTGlzdFZpZXdlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oCi0JCQkJCQlzZWxlY3RlZCksIHRydWUpOwotCQkJfQotCi0JCX0pOwotCi0JCWRvd25CdXR0b24gPSBuZXcgQnV0dG9uKGJ1dHRvbnNDb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJZG93bkJ1dHRvbi5zZXRUZXh0KEF1dGhvcmluZ1VJVGV4dC5ET1dOX0JVVFRPTl9URVhUKTsKLQkJZG93bkJ1dHRvbi5zZXRMYXlvdXREYXRhKGxheW91dERhdGEpOwotCQlkb3duQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3RlZENvbHVtbkxpc3RWaWV3ZXIKLQkJCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQkJCQlpZiAoc2VsZWN0aW9uLnNpemUoKSA+IDEpCi0JCQkJCXJldHVybjsKLQkJCQlFTGlzdCBjb2x1bW5zID0gKEVMaXN0KSBzZWxlY3RlZENvbHVtbkxpc3RWaWV3ZXIuZ2V0SW5wdXQoKTsKLQkJCQlPYmplY3Qgc2VsZWN0ZWQgPSBzZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCQkJaW50IGlkID0gY29sdW1ucy5pbmRleE9mKHNlbGVjdGVkKTsKLQkJCQkKLQkJCQlpZiAoaWQgPT0gY29sdW1ucy5zaXplKCkgLSAxIHx8IChic0NvbWJvLmdldFNlbGVjdGlvbkluZGV4KCkgPT0gMCAmJiBpZCA8IDIpKQotCQkJCQlyZXR1cm47Ci0JCQkJaWYgKGlkID09IGNvbHVtbnMuc2l6ZSgpIC0gMSB8fCAoYnNDb21iby5nZXRTZWxlY3Rpb25JbmRleCgpID4gMCAmJiBpZCA8IDEpKQotCQkJCQlyZXR1cm47Ci0JCQkJY29sdW1ucy5tb3ZlKGlkICsgMSwgaWQpOwotCQkJCXNlbGVjdGVkQ29sdW1uTGlzdFZpZXdlci5yZWZyZXNoKCk7Ci0JCQkJc2VsZWN0ZWRDb2x1bW5MaXN0Vmlld2VyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbigKLQkJCQkJCXNlbGVjdGVkKSwgdHJ1ZSk7Ci0JCQl9Ci0KLQkJfSk7Ci0KLQkJR3JvdXAgY29uZmlnU3dpdGNoR3JvdXAgPSBuZXcgR3JvdXAoY29tcG9zaXRlLCBTV1QuU0hBRE9XX09VVCk7Ci0JCWNvbmZpZ1N3aXRjaEdyb3VwLnNldExheW91dChuZXcgR3JpZExheW91dCgzLCBmYWxzZSkpOwotCQljb25maWdTd2l0Y2hHcm91cC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJY29uZmlnU3dpdGNoR3JvdXAKLQkJCQkuc2V0VGV4dChBdXRob3JpbmdVSVJlc291cmNlcy5Qcm9jZXNzRWRpdG9yUHJlZmVyZW5jZVBhZ2Vfc3dpdGNoQ29uZmlndXJhdGlvbik7IAotCi0JCWNvbmZpZ1N3aXRjaEFsd2F5c0J1dHRvbiA9IG5ldyBCdXR0b24oY29uZmlnU3dpdGNoR3JvdXAsIFNXVC5SQURJTyk7Ci0JCWNvbmZpZ1N3aXRjaEFsd2F5c0J1dHRvbi5zZXRUZXh0KExpYnJhcnlVSVJlc291cmNlcy5hbHdheXNCdXR0b25fdGV4dCk7Ci0JCWNvbmZpZ1N3aXRjaE5ldmVyQnV0dG9uID0gbmV3IEJ1dHRvbihjb25maWdTd2l0Y2hHcm91cCwgU1dULlJBRElPKTsKLQkJY29uZmlnU3dpdGNoTmV2ZXJCdXR0b24uc2V0VGV4dChMaWJyYXJ5VUlSZXNvdXJjZXMubmV2ZXJCdXR0b25fdGV4dCk7Ci0JCWNvbmZpZ1N3aXRjaFByb21wdEJ1dHRvbiA9IG5ldyBCdXR0b24oY29uZmlnU3dpdGNoR3JvdXAsIFNXVC5SQURJTyk7Ci0JCWNvbmZpZ1N3aXRjaFByb21wdEJ1dHRvbi5zZXRUZXh0KExpYnJhcnlVSVJlc291cmNlcy5wcm9tcHRCdXR0b25fdGV4dCk7Ci0KLQkJc2V0U3dpdGNoQ29uZmlnQnV0dG9uKExpYnJhcnlVSVByZWZlcmVuY2VzLmdldFN3aXRjaENvbmZpZygpKTsKLQotCQkvLyBpbmhlcml0IHN1cHByZXNzaW9uIHN0YXRlcwotCQlHcm91cCBzdXBwcmVzc2lvbkdyb3VwID0gbmV3IEdyb3VwKGNvbXBvc2l0ZSwgU1dULlNIQURPV19PVVQpOwotCQlzdXBwcmVzc2lvbkdyb3VwLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQkJc3VwcHJlc3Npb25Hcm91cC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJc3VwcHJlc3Npb25Hcm91cAotCQkJCS5zZXRUZXh0KEF1dGhvcmluZ1VJUmVzb3VyY2VzLlByb2Nlc3NFZGl0b3JQcmVmZXJlbmNlUGFnZV9zdXBwcmVzc2lvbkdyb3VwVGl0bGUpOyAKLQotCQlpbmhlcml0U3VwcHJlc3Npb25CdXR0b24gPSBuZXcgQnV0dG9uKHN1cHByZXNzaW9uR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCWluaGVyaXRTdXBwcmVzc2lvbkJ1dHRvbgotCQkJCS5zZXRUZXh0KEF1dGhvcmluZ1VJUmVzb3VyY2VzLlByb2Nlc3NFZGl0b3JQcmVmZXJlbmNlUGFnZV9pbmhlcml0U3VwcHJlc3Npb25TdGF0ZSk7IAotCi0JCWluaGVyaXRTdXBwcmVzc2lvbkJ1dHRvbi5zZXRTZWxlY3Rpb24oZ2V0UHJlZmVyZW5jZVN0b3JlKCkuZ2V0Qm9vbGVhbigKLQkJCQlBcHBsaWNhdGlvblByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9JTkhFUklUX1NVUFBSRVNTSU9OX1NUQVRFKSk7Ci0JCXJldHVybiBjb21wb3NpdGU7Ci0JfQotCi0JLyoqCi0JICogTG9hZHMgZGF0YSBmcm9tIHByZWZlcmVuY2Ugc3RvcmUKLQkgKi8KLQlwcml2YXRlIHZvaWQgaW5pdERhdGEoKSB7Ci0JCUlQcmVmZXJlbmNlU3RvcmUgc3RvcmUgPSBnZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQotCQlTdHJpbmcgc3RyID0gc3RvcmUKLQkJCQkuZ2V0U3RyaW5nKEFwcGxpY2F0aW9uUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX1dCU19DT0xVTU5TKTsKLQkJaWYgKHN0ciA9PSBudWxsKSB7Ci0JCQlzdHIgPSBzdG9yZQotCQkJCQkuZ2V0RGVmYXVsdFN0cmluZyhBcHBsaWNhdGlvblByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9XQlNfQ09MVU1OUyk7Ci0JCX0KLQkJd2JzQ29sdW1uRGVzY3JpcHRvcnMgPSBQcm9jZXNzRWRpdG9yLnRvQ29sdW1uRGVzY3JpcHRvckxpc3Qoc3RyKTsKLQotCQlzdHIgPSBzdG9yZS5nZXRTdHJpbmcoQXBwbGljYXRpb25QcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfVEJTX0NPTFVNTlMpOwotCQlpZiAoc3RyID09IG51bGwpIHsKLQkJCXN0ciA9IHN0b3JlCi0JCQkJCS5nZXREZWZhdWx0U3RyaW5nKEFwcGxpY2F0aW9uUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX1RCU19DT0xVTU5TKTsKLQkJfQotCQl0YnNDb2x1bW5EZXNjcmlwdG9ycyA9IFByb2Nlc3NFZGl0b3IudG9Db2x1bW5EZXNjcmlwdG9yTGlzdChzdHIpOwotCi0JCXN0ciA9IHN0b3JlLmdldFN0cmluZyhBcHBsaWNhdGlvblByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9XUEJTX0NPTFVNTlMpOwotCQlpZiAoc3RyID09IG51bGwpIHsKLQkJCXN0ciA9IHN0b3JlCi0JCQkJCS5nZXREZWZhdWx0U3RyaW5nKEFwcGxpY2F0aW9uUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX1dQQlNfQ09MVU1OUyk7Ci0JCX0KLQkJd3Bic0NvbHVtbkRlc2NyaXB0b3JzID0gUHJvY2Vzc0VkaXRvci50b0NvbHVtbkRlc2NyaXB0b3JMaXN0KHN0cik7Ci0KLQkJLy8gbG9hZCBhbmQgc2V0IHRvIHRoZSBkZWZhdWx0IGlmIG5vdGhpbmcgaW4gdGhlIHN0b3JlCi0JCS8vIDE1NDc1OCAtIFByb2Nlc3NlczogV0JTIGlzIGJsYW5rIGFzIGRlZmF1bHQgcHJlZmVyZW5jZSBpcyBub3Qgc2V0IGZvciB0aGUgZmlyc3QgdGltZQotCQlpZiAoIHdic0NvbHVtbkRlc2NyaXB0b3JzLnNpemUoKSA9PSAwICkgewotCQkJd2JzQ29sdW1uRGVzY3JpcHRvcnMuYWRkQWxsKFByb2Nlc3NFZGl0b3IuREVGQVVMVF9XQlNfQ09MVU1OUyk7Ci0JCQlzdG9yZS5zZXRWYWx1ZShBcHBsaWNhdGlvblByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9XQlNfQ09MVU1OUywKLQkJCQkJdG9TdHJpbmcod2JzQ29sdW1uRGVzY3JpcHRvcnMpKTsKLQkJCi0JCX0KLQkJCi0JCWlmICggdGJzQ29sdW1uRGVzY3JpcHRvcnMuc2l6ZSgpID09IDAgKSB7Ci0JCQl0YnNDb2x1bW5EZXNjcmlwdG9ycy5hZGRBbGwoUHJvY2Vzc0VkaXRvci5ERUZBVUxUX1RCU19DT0xVTU5TKTsKLQkJCXN0b3JlLnNldFZhbHVlKEFwcGxpY2F0aW9uUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX1RCU19DT0xVTU5TLAotCQkJCQl0b1N0cmluZyh0YnNDb2x1bW5EZXNjcmlwdG9ycykpOwotCQl9Ci0JCQotCQlpZiAoIHdwYnNDb2x1bW5EZXNjcmlwdG9ycy5zaXplKCkgPT0gMCApIHsKLQkJCXdwYnNDb2x1bW5EZXNjcmlwdG9ycy5hZGRBbGwoUHJvY2Vzc0VkaXRvci5ERUZBVUxUX1dQQlNfQ09MVU1OUyk7Ci0JCQlzdG9yZS5zZXRWYWx1ZShBcHBsaWNhdGlvblByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9XUEJTX0NPTFVNTlMsCi0JCQkJCXRvU3RyaW5nKHdwYnNDb2x1bW5EZXNjcmlwdG9ycykpOwotCQl9Ci0JCQotCQljb2x1bW5EZXNjcmlwdG9yTGlzdHMgPSBuZXcgTGlzdFtdIHsgd2JzQ29sdW1uRGVzY3JpcHRvcnMsCi0JCQkJdGJzQ29sdW1uRGVzY3JpcHRvcnMsIHdwYnNDb2x1bW5EZXNjcmlwdG9ycyB9OwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlUGFnZS5wZXJmb3JtRGVmYXVsdHMKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGVmYXVsdHMoKSB7Ci0JCXN1cGVyLnBlcmZvcm1EZWZhdWx0cygpOwotCi0JCXdic0NvbHVtbkRlc2NyaXB0b3JzLmNsZWFyKCk7Ci0JCXdic0NvbHVtbkRlc2NyaXB0b3JzLmFkZEFsbChQcm9jZXNzRWRpdG9yLkRFRkFVTFRfV0JTX0NPTFVNTlMpOwotCi0JCXRic0NvbHVtbkRlc2NyaXB0b3JzLmNsZWFyKCk7Ci0JCXRic0NvbHVtbkRlc2NyaXB0b3JzLmFkZEFsbChQcm9jZXNzRWRpdG9yLkRFRkFVTFRfVEJTX0NPTFVNTlMpOwotCi0JCXdwYnNDb2x1bW5EZXNjcmlwdG9ycy5jbGVhcigpOwotCQl3cGJzQ29sdW1uRGVzY3JpcHRvcnMuYWRkQWxsKFByb2Nlc3NFZGl0b3IuREVGQVVMVF9XUEJTX0NPTFVNTlMpOwotCi0JCWluaGVyaXRTdXBwcmVzc2lvbkJ1dHRvbgotCQkJCS5zZXRTZWxlY3Rpb24oZ2V0UHJlZmVyZW5jZVN0b3JlKCkKLQkJCQkJCS5nZXREZWZhdWx0Qm9vbGVhbigKLQkJCQkJCQkJQXBwbGljYXRpb25QcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfSU5IRVJJVF9TVVBQUkVTU0lPTl9TVEFURSkpOwotCi0JCXNldFN3aXRjaENvbmZpZ0J1dHRvbihNZXNzYWdlRGlhbG9nV2l0aFRvZ2dsZS5QUk9NUFQpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlUGFnZSNwZXJmb3JtT2soKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHBlcmZvcm1PaygpIHsKLQkJSVByZWZlcmVuY2VTdG9yZSBzdG9yZSA9IGdldFByZWZlcmVuY2VTdG9yZSgpOwotCi0JCXN0b3JlLnNldFZhbHVlKEFwcGxpY2F0aW9uUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX1dCU19DT0xVTU5TLAotCQkJCXRvU3RyaW5nKHdic0NvbHVtbkRlc2NyaXB0b3JzKSk7Ci0JCXN0b3JlLnNldFZhbHVlKEFwcGxpY2F0aW9uUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX1RCU19DT0xVTU5TLAotCQkJCXRvU3RyaW5nKHRic0NvbHVtbkRlc2NyaXB0b3JzKSk7Ci0JCXN0b3JlLnNldFZhbHVlKEFwcGxpY2F0aW9uUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX1dQQlNfQ09MVU1OUywKLQkJCQl0b1N0cmluZyh3cGJzQ29sdW1uRGVzY3JpcHRvcnMpKTsKLQkJc3RvcmUuc2V0VmFsdWUoCi0JCQkJQXBwbGljYXRpb25QcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfSU5IRVJJVF9TVVBQUkVTU0lPTl9TVEFURSwKLQkJCQlpbmhlcml0U3VwcHJlc3Npb25CdXR0b24uZ2V0U2VsZWN0aW9uKCkpOwotCQkvLyBzd2l0Y2ggY29uZmlnIHByZWZlcmVuY2UgaXMgaW4gbGlicmFyeS51aQotCQlMaWJyYXJ5VUlQcmVmZXJlbmNlcy5zZXRTd2l0Y2hDb25maWcoZ2V0U3dpdGNoQ29uZmlnVmFsdWUoKSk7Ci0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogQ29udmVydHMgZ2l2ZW4gbGlzdCBpbnRvIHN0cmluZyByZXByZXNlbnRhdGlvbgotCSAqIEBwYXJhbSBjb2x1bW5EZXNjcmlwdG9ycwotCSAqIEByZXR1cm4gCi0JICogCQkJU3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBnaXZlbiBsaXN0Ci0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdG9TdHJpbmcoamF2YS51dGlsLkxpc3QgY29sdW1uRGVzY3JpcHRvcnMpIHsKLQkJU3RyaW5nQnVmZmVyIHN0ckJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJaW50IG1heCA9IGNvbHVtbkRlc2NyaXB0b3JzLnNpemUoKSAtIDE7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbWF4OyBpKyspIHsKLQkJCXN0ckJ1Zi5hcHBlbmQoKChDb2x1bW5EZXNjcmlwdG9yKSBjb2x1bW5EZXNjcmlwdG9ycy5nZXQoaSkpLmlkKQotCQkJCQkuYXBwZW5kKCcsJyk7Ci0JCX0KLQkJc3RyQnVmLmFwcGVuZCgoKENvbHVtbkRlc2NyaXB0b3IpIGNvbHVtbkRlc2NyaXB0b3JzLmdldChtYXgpKS5pZCk7Ci0JCXJldHVybiBzdHJCdWYudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXIjd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lciN3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXIjbW9kaWZ5VGV4dChNb2RpZnlFdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBnZXRTd2l0Y2hDb25maWdWYWx1ZSgpIHsKLQkJaWYgKGNvbmZpZ1N3aXRjaEFsd2F5c0J1dHRvbi5nZXRTZWxlY3Rpb24oKSkKLQkJCXJldHVybiBNZXNzYWdlRGlhbG9nV2l0aFRvZ2dsZS5BTFdBWVM7Ci0JCWlmIChjb25maWdTd2l0Y2hOZXZlckJ1dHRvbi5nZXRTZWxlY3Rpb24oKSkKLQkJCXJldHVybiBNZXNzYWdlRGlhbG9nV2l0aFRvZ2dsZS5ORVZFUjsKLQkJaWYgKGNvbmZpZ1N3aXRjaFByb21wdEJ1dHRvbi5nZXRTZWxlY3Rpb24oKSkKLQkJCXJldHVybiBNZXNzYWdlRGlhbG9nV2l0aFRvZ2dsZS5QUk9NUFQ7Ci0KLQkJLy8gcmV0dXJuIFByb21wdCB2YWx1ZSBhcyBhIGRlZmF1bHQKLQkJcmV0dXJuIE1lc3NhZ2VEaWFsb2dXaXRoVG9nZ2xlLlBST01QVDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0U3dpdGNoQ29uZmlnQnV0dG9uKFN0cmluZyB2YWx1ZSkgewotCQlpZiAoTWVzc2FnZURpYWxvZ1dpdGhUb2dnbGUuQUxXQVlTLmVxdWFscyh2YWx1ZSkpIHsKLQkJCWNvbmZpZ1N3aXRjaEFsd2F5c0J1dHRvbi5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCQljb25maWdTd2l0Y2hOZXZlckJ1dHRvbi5zZXRTZWxlY3Rpb24oZmFsc2UpOwotCQkJY29uZmlnU3dpdGNoUHJvbXB0QnV0dG9uLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0JCX0gZWxzZSBpZiAoTWVzc2FnZURpYWxvZ1dpdGhUb2dnbGUuTkVWRVIuZXF1YWxzKHZhbHVlKSkgewotCQkJY29uZmlnU3dpdGNoQWx3YXlzQnV0dG9uLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0JCQljb25maWdTd2l0Y2hOZXZlckJ1dHRvbi5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCQljb25maWdTd2l0Y2hQcm9tcHRCdXR0b24uc2V0U2VsZWN0aW9uKGZhbHNlKTsKLQkJfSBlbHNlIHsgLy8gTWVzc2FnZURpYWxvZ1dpdGhUb2dnbGUuUFJPTVBUCi0JCQljb25maWdTd2l0Y2hBbHdheXNCdXR0b24uc2V0U2VsZWN0aW9uKGZhbHNlKTsKLQkJCWNvbmZpZ1N3aXRjaE5ldmVyQnV0dG9uLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0JCQljb25maWdTd2l0Y2hQcm9tcHRCdXR0b24uc2V0U2VsZWN0aW9uKHRydWUpOwotCQl9Ci0JfQotCQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlUGFnZSNnZXRQcmVmZXJlbmNlU3RvcmUoKQotCSAqLwotCXB1YmxpYyBJUHJlZmVyZW5jZVN0b3JlIGdldFByZWZlcmVuY2VTdG9yZSgpIHsKLQkJCi0JCS8vIGNoYW5nZSB0byB1c2UgTGlicmFyeVBsdWdpbiBzdG9yZQotCQkvLyB3ZSBuZWVkIHRvIHNoYXJlIHRoZSBwcmVmZXJlbmNlIGluIExpYnJhcnkgYnJvd3NpbmcgYW5kIHB1Ymxpc2hpbmcKLQkJLy8gSmluaHVhIFhpIDA4LzE5LzIwMDYKLQkJLy8gY2hhbmdlZCB0byB1c2UgQ29tbW9uVUlQbHVnaW4gc3RvcmUKLQkJSVByZWZlcmVuY2VTdG9yZVdyYXBwZXIgd3JhcHBlciA9IExpYnJhcnlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpOwotCQlpZiAoIHdyYXBwZXIgaW5zdGFuY2VvZiBQcmVmZXJlbmNlU3RvcmVXcmFwcGVyICkgewotCQkJcmV0dXJuICgoUHJlZmVyZW5jZVN0b3JlV3JhcHBlcil3cmFwcGVyKS5nZXRTdG9yZSgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJlZmVyZW5jZXMvUm9vdFByZWZQYWdlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3ByZWZlcmVuY2VzL1Jvb3RQcmVmUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOWVkZTM0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJlZmVyZW5jZXMvUm9vdFByZWZQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcmVmZXJlbmNlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24ucHJlZmVyZW5jZXMuSVByZWZlcmVuY2VTdG9yZVdyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS5Db21tb25VSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpLlByZWZlcmVuY2VTdG9yZVdyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFByZWZlcmVuY2VQYWdlOwotCi0KLS8qKgotICogUm9vdCBwcmVmZXJlbmNlIHBhZ2UKLSAqIAotICogQGF1dGhvciBCaW5neHVlIFh1Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBSb290UHJlZlBhZ2UgZXh0ZW5kcyBQcmVmZXJlbmNlUGFnZSBpbXBsZW1lbnRzCi0JCUlXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZSB7Ci0KLQlwcml2YXRlIENvbXBvc2l0ZSBjb21wb3NpdGVfdGFiOwotCi0JLy8gcHJpdmF0ZSBJV29ya2JlbmNoIHdvcmtiZW5jaDsKLQotCS8vIERpc2FibGVpbmcgZW5hYmxlIHByb2Nlc3MgY29udHJpYnV0aW9uIHByZWZlcmVuY2UgZm9yIG5vdy4KLQkvLyBwcml2YXRlIEJ1dHRvbiBlbmFibGVQcm9jZXNzQ29udHJpYnV0aW9uOwotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VQYWdlI2NyZWF0ZUNvbnRlbnRzKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKLQkgKi8KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJLy8gY29tcG9zaXRlX3RhYiA8PCBwYXJlbnQKLQkJY29tcG9zaXRlX3RhYiA9IGNyZWF0ZUNvbXBvc2l0ZShwYXJlbnQsIDMpOwotCi0JCS8vIGVuYWJsZVByb2Nlc3NDb250cmlidXRpb24gPSBuZXcgQnV0dG9uKGNvbXBvc2l0ZV90YWIsIFNXVC5DSEVDSyk7Ci0JCS8vIGVuYWJsZVByb2Nlc3NDb250cmlidXRpb24uc2V0VGV4dChBdXRob3JpbmdVSVJlc291cmNlcy5nZXRTdHJpbmcoIkF1dGhvcmluZ1VJLlJvb3RQcmVmUGFnZS5lbmFibGVwcm9jZXNzY29udHJpYnV0aW9uLnRleHQiKSk7Ci0JCS8vIC8vJE5PTi1OTFMtMSQKLQotCQlpbml0aWFsaXplVmFsdWVzKCk7Ci0KLQkJLy8gZm9udCA9IG51bGw7Ci0JCXJldHVybiBjb21wb3NpdGVfdGFiOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFByZWZlcmVuY2VQYWdlI2luaXQob3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2ggd29ya2JlbmNoKSB7Ci0JCS8vIHRoaXMud29ya2JlbmNoID0gd29ya2JlbmNoOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKSBNZXRob2QgZGVjbGFyZWQgb24gUHJlZmVyZW5jZVBhZ2UKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGVmYXVsdHMoKSB7Ci0JCXN1cGVyLnBlcmZvcm1EZWZhdWx0cygpOwotCQlpbml0aWFsaXplRGVmYXVsdHMoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykgTWV0aG9kIGRlY2xhcmVkIG9uIFByZWZlcmVuY2VQYWdlCi0JICovCi0JcHVibGljIGJvb2xlYW4gcGVyZm9ybU9rKCkgewotCQlzdG9yZVZhbHVlcygpOwotCQlMaWJyYXJ5UGx1Z2luLmdldERlZmF1bHQoKS5zYXZlUGx1Z2luUHJlZmVyZW5jZXMoKTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VQYWdlI2RvR2V0UHJlZmVyZW5jZVN0b3JlKCkKLQkgKi8KLQlwcm90ZWN0ZWQgSVByZWZlcmVuY2VTdG9yZSBkb0dldFByZWZlcmVuY2VTdG9yZSgpIHsKLQkJSVByZWZlcmVuY2VTdG9yZVdyYXBwZXIgd3JhcHBlciA9IExpYnJhcnlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpOwotCQlpZiAoIHdyYXBwZXIgaW5zdGFuY2VvZiBQcmVmZXJlbmNlU3RvcmVXcmFwcGVyICkgewotCQkJcmV0dXJuICgoUHJlZmVyZW5jZVN0b3JlV3JhcHBlcil3cmFwcGVyKS5nZXRTdG9yZSgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFN0b3JlcyB0aGUgdmFsdWVzIG9mIHRoZSBjb250cm9scyBiYWNrIHRvIHRoZSBwcmVmZXJlbmNlIHN0b3JlLgotCSAqLwotCXByaXZhdGUgdm9pZCBzdG9yZVZhbHVlcygpIHsKLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplcyBzdGF0ZXMgb2YgdGhlIGNvbnRyb2xzIHVzaW5nIGRlZmF1bHQgdmFsdWVzIGluIHRoZSBwcmVmZXJlbmNlCi0JICogc3RvcmUuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVEZWZhdWx0cygpIHsKLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplcyBzdGF0ZXMgb2YgdGhlIGNvbnRyb2xzIGZyb20gdGhlIHByZWZlcmVuY2Ugc3RvcmUuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVWYWx1ZXMoKSB7Ci0JfQotCi0JcHJpdmF0ZSBDb21wb3NpdGUgY3JlYXRlQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQsIGludCBudW1Db2x1bW5zKSB7Ci0KLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7Ci0KLQkJLy8gR3JpZExheW91dAotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gbnVtQ29sdW1uczsKLQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IGxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQotCQkvLyBHcmlkRGF0YQotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWRhdGEudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQlkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLQotCS8vIHByaXZhdGUgTGFiZWwgY3JlYXRlTGFiZWwoQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIHRleHQsIGludCBzcGFuKSB7Ci0JLy8gTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTEVGVCk7Ci0JLy8gbGFiZWwuc2V0VGV4dCh0ZXh0KTsKLQkvLyBHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JLy8gZGF0YS5ob3Jpem9udGFsU3BhbiA9IHNwYW47Ci0JLy8gZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkvLyBsYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCS8vIHJldHVybiBsYWJlbDsKLQkvLyB9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJlZmVyZW5jZXMvcGFja2FnZS5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcmVmZXJlbmNlcy9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4YjUzOTAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcmVmZXJlbmNlcy9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyBwcmVmZXJlbmNlIHN1cHBvcnQgZm9yIHRoZSBBdXRob3JpbmcgVUkuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL0Fic3RyYWN0U2VjdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL0Fic3RyYWN0U2VjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZjY3ZTExLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9BYnN0cmFjdFNlY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXM7Ci0KLWltcG9ydCBqYXZhLmJlYW5zLlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgamF2YS5iZWFucy5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuUHJvY2Vzc0VkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnNlcnZpY2VhYmlsaXR5LkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5JTGlicmFyeU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5Qcm9jZXNzQXV0aG9yaW5nQ29uZmlndXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuSUJTSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmV2ZW50cy5JTGlicmFyeUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuTGlicmFyeVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC52aWV3LlRhYjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5BYnN0cmFjdFByb3BlcnR5U2VjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5JU2VjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5UYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZTsKLQotLyoqCi0gKiBCYXNlIGNsYXNzIGZvciBhIHNlY3Rpb24gaW4gYSB0YWIgaW4gdGhlIHByb3BlcnRpZXMgdmlldy4KLSAqIAotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEFic3RyYWN0U2VjdGlvbiBleHRlbmRzIEFic3RyYWN0UHJvcGVydHlTZWN0aW9uIGltcGxlbWVudHMKLQkJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciB7Ci0KLQlwcml2YXRlIEJyZWFrZG93bkVsZW1lbnQgZWxlbWVudDsKLQotCXByb3RlY3RlZCBib29sZWFuIGVkaXRhYmxlID0gZmFsc2U7Ci0KLQlwcm90ZWN0ZWQgVGFiYmVkUHJvcGVydHlTaGVldFBhZ2UgcGFnZTsKLQotCXByb3RlY3RlZCBQcm9jZXNzQXV0aG9yaW5nQ29uZmlndXJhdG9yIGNvbmZpZ3VyYXRvciA9IG5ldyBQcm9jZXNzQXV0aG9yaW5nQ29uZmlndXJhdG9yKAotCQkJTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TWV0aG9kQ29uZmlndXJhdGlvbigpKTsKLQotCXByb3RlY3RlZCBMb2dnZXIgbG9nZ2VyOwotCi0JLyoKLQkgKiBDcmVhdGUgYW4gaW5zdGFuY2UKLQkgKi8KLQlwdWJsaWMgQWJzdHJhY3RTZWN0aW9uKCkgewotCQlzdXBlcigpOwotCi0JCS8vIGxpc3RlbiB0byBjaGFuZ2UgZm9yIGN1cnJlbnQgc2VsZWN0aW9uIG9mIE1ldGhvZENvbmZpZ3VyYXRpb24KLQkJSUxpYnJhcnlNYW5hZ2VyIG1hbmFnZXIgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRMaWJyYXJ5TWFuYWdlcigpOwotCQlpZiAobWFuYWdlciAhPSBudWxsKSB7Ci0JCQltYW5hZ2VyLmFkZExpc3RlbmVyKGxpYnJhcnlMaXN0ZW5lcik7Ci0JCX0KLQotCQkvLyBnZXQgbG9nZ2VyCi0JCWxvZ2dlciA9IEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLkFic3RyYWN0UHJvcGVydHlTZWN0aW9uI2NyZWF0ZUNvbnRyb2xzKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSwgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuVGFiYmVkUHJvcGVydHlTaGVldFBhZ2UpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbHMoQ29tcG9zaXRlIGNvbXAsIFRhYmJlZFByb3BlcnR5U2hlZXRQYWdlIHBhZ2UpIHsKLQkJc3VwZXIuY3JlYXRlQ29udHJvbHMoY29tcCwgcGFnZSk7Ci0JCXRoaXMucGFnZSA9IHBhZ2U7Ci0JfQotCi0JcHJpdmF0ZSBJTGlicmFyeUNoYW5nZUxpc3RlbmVyIGxpYnJhcnlMaXN0ZW5lciA9IG5ldyBJTGlicmFyeUNoYW5nZUxpc3RlbmVyKCkgewotCi0JCXB1YmxpYyB2b2lkIGxpYnJhcnlDaGFuZ2VkKGludCBvcHRpb24sIENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQkJc3dpdGNoIChvcHRpb24pIHsKLQkJCWNhc2UgSUxpYnJhcnlDaGFuZ2VMaXN0ZW5lci5PUFRJT05fQ0hBTkdFRDogewotCQkJCXNlY3Rpb25SZWZyZXNoKCk7Ci0JCQl9Ci0JCQl9Ci0JCX0KLQl9OwotCi0JLyoqCi0JICogUmVmcmVzaCB0aGUgY3VycmVudCBzZWN0aW9uCi0JICogCi0JICovCi0JcHJpdmF0ZSB2b2lkIHNlY3Rpb25SZWZyZXNoKCkgewotCQlpZiAocGFnZSAhPSBudWxsKSB7Ci0JCQlUYWIgdGFiID0gcGFnZS5nZXRDdXJyZW50VGFiKCk7Ci0JCQlpZiAodGFiICE9IG51bGwpIHsKLQkJCQlJU2VjdGlvbiBzZWN0aW9uID0gdGFiLmdldFNlY3Rpb25BdEluZGV4KDApOwotCi0JCQkJaWYgKChzZWN0aW9uICE9IG51bGwpCi0JCQkJCQkmJiAoc2VjdGlvbiBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnRHZW5lcmFsU2VjdGlvbikpIHsKLQkJCQkJc2VjdGlvbi5yZWZyZXNoKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5BYnN0cmFjdFByb3BlcnR5U2VjdGlvbiNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlzdXBlci5kaXNwb3NlKCk7Ci0JCWlmIChsaWJyYXJ5TGlzdGVuZXIgIT0gbnVsbCkgewotCQkJSUxpYnJhcnlNYW5hZ2VyIG1hbmFnZXIgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRMaWJyYXJ5TWFuYWdlcigpOwotCQkJaWYgKG1hbmFnZXIgIT0gbnVsbCkgewotCQkJCW1hbmFnZXIucmVtb3ZlTGlzdGVuZXIobGlicmFyeUxpc3RlbmVyKTsKLQkJCX0KLQkJfQotCX0KLQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5BYnN0cmFjdFByb3BlcnR5U2VjdGlvbiNzZXRJbnB1dChvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydCwgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldElucHV0KElXb3JrYmVuY2hQYXJ0IHBhcnQsIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCXN1cGVyLnNldElucHV0KHBhcnQsIHNlbGVjdGlvbik7Ci0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiU2V0SW5wdXQ6OnNlbGVjdGlvbiAtICIrc2VsZWN0aW9uKTsKLQkJQXNzZXJ0LmlzVHJ1ZShzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbik7Ci0JCU9iamVjdCBpbnB1dCA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbikuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0KLQkJaW5pdEVsZW1lbnREYXRhKGlucHV0KTsKLQotCX0KLQotCXByaXZhdGUgdm9pZCBpbml0RWxlbWVudERhdGEoT2JqZWN0IGlucHV0KSB7Ci0KLQkJaWYgKGlucHV0IGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudCkgewotCQkJdGhpcy5lbGVtZW50ID0gKEJyZWFrZG93bkVsZW1lbnQpIGlucHV0OwotCQkJaWYgKFRuZ1V0aWwuaXNMb2NrZWQodGhpcy5lbGVtZW50KSkKLQkJCQl0aGlzLmVkaXRhYmxlID0gZmFsc2U7Ci0JCQllbHNlIHsKLQkJCQl0aGlzLmVkaXRhYmxlID0gdHJ1ZTsKLQotCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgUm9sZURlc2NyaXB0b3IpIHsKLQkJCQkJUm9sZURlc2NyaXB0b3Igcm9sZURlc2MgPSAoUm9sZURlc2NyaXB0b3IpIGVsZW1lbnQ7Ci0JCQkJCWlmICgocm9sZURlc2MuZ2V0U3VwZXJBY3Rpdml0aWVzKCkgPT0gbnVsbCkKLQkJCQkJCQl8fCAocm9sZURlc2MuZ2V0U3VwZXJBY3Rpdml0aWVzKCkgPT0gbnVsbCkpCi0JCQkJCQl0aGlzLmVkaXRhYmxlID0gZmFsc2U7Ci0JCQkJCWVsc2UKLQkJCQkJCXRoaXMuZWRpdGFibGUgPSB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfSBlbHNlIGlmIChpbnB1dCBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSB7Ci0JCQl0aGlzLmVsZW1lbnQgPSAoQnJlYWtkb3duRWxlbWVudCkgTGlicmFyeVV0aWwudW53cmFwKGlucHV0KTsKLQkJCXRoaXMuZWRpdGFibGUgPSBmYWxzZTsKLQkJfQotCi0JfQotCi0JLyoqCi0JICogUmV0dXJuIHNlbGVjdGlvbgotCSAqLwotCXB1YmxpYyBJU2VsZWN0aW9uIGdldFNlbGVjdGlvbigpIHsKLQkJcmV0dXJuIEVQRlByb3BlcnR5U2hlZXRQYWdlLmdldFNlbGVjdGlvbigpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBmaXJzdCBlbGVtZW50IGZyb20gc2VsZWN0aW9uCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbnB1dCgpIHsKLQkJSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSBnZXRTZWxlY3Rpb24oKTsKLQkJaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7Ci0JCQlPYmplY3QgaW5wdXQgPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb24pLmdldEZpcnN0RWxlbWVudCgpOwotCQkJcmV0dXJuIGlucHV0OwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBwcm9jZXNzIGVkaXRvcgotCSAqIAotCSAqIEByZXR1cm4KLQkgKiAJCXByb2Nlc3MgZWRpdG9yCi0JICovCi0JcHVibGljIFByb2Nlc3NFZGl0b3IgZ2V0RWRpdG9yKCkgewotCQlyZXR1cm4gRVBGUHJvcGVydHlTaGVldFBhZ2UuZ2V0RWRpdG9yKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIEl0ZW1Qcm92aWRlcgotCSAqIAotCSAqIEByZXR1cm4KLQkgKiAJCQlhZGFwdGVyCi0JICovCi0JcHVibGljIEl0ZW1Qcm92aWRlckFkYXB0ZXIgZ2V0QWRhcHRlcigpIHsKLQkJdHJ5IHsKLQkJCUFkYXB0ZXJGYWN0b3J5IGZhY3RvcnkgPSBFUEZQcm9wZXJ0eVNoZWV0UGFnZS5nZXRBZGFwdGVyRmFjdG9yeSgpOwotCQkJSXRlbVByb3ZpZGVyQWRhcHRlciBwcm92aWRlciA9IChJdGVtUHJvdmlkZXJBZGFwdGVyKSBmYWN0b3J5LmFkYXB0KAotCQkJCQllbGVtZW50LCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkJcmV0dXJuIHByb3ZpZGVyOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIEFkYXB0ZXIgZmFjdG9yeQotCSAqIAotCSAqIEByZXR1cm4KLQkgKiAJCQlhZGFwdGVyIGZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgQWRhcHRlckZhY3RvcnkgZ2V0QWRhcHRlckZhY3RvcnkoKSB7Ci0JCUFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5ID0gRVBGUHJvcGVydHlTaGVldFBhZ2UKLQkJCQkuZ2V0QWRhcHRlckZhY3RvcnkoKTsKLQkJcmV0dXJuIGFkYXB0ZXJGYWN0b3J5OwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgZWxlbWVudC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBlbGVtZW50LgotCSAqLwotCXB1YmxpYyBCcmVha2Rvd25FbGVtZW50IGdldEVsZW1lbnQoKSB7Ci0JCUlTZWxlY3Rpb24gc2VsZWN0aW9uID0gZ2V0U2VsZWN0aW9uKCk7Ci0JCWlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgewotCQkJT2JqZWN0IGlucHV0ID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uKS5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiZ2V0RWxlbWVudDo6c2VsZWN0aW9uIC0gIitzZWxlY3Rpb24pOwotCQkJdHJ5IHsKLQkJCQlpbml0RWxlbWVudERhdGEoaW5wdXQpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlsb2dnZXIKLQkJCQkJCS5sb2dFcnJvcigKLQkJCQkJCQkJIkVycm9yIGdldHRpbmcgZWxlbWVudCBmcm9tIHRoZSBzZWxlY3Rpb24gIiArIGVsZW1lbnQsIGUpOyAvLyROT04tTkxTLTEkCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCQlyZXR1cm4gZWxlbWVudDsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gcHJvcGVydHkgc2hlZXQgcGFnZQotCSAqIEByZXR1cm4KLQkgKiAJCQlwcm9wZXJ0eSBzaGVldCBwYWdlCi0JICovCi0JcHVibGljIFRhYmJlZFByb3BlcnR5U2hlZXRQYWdlIGdldFByb3BlcnR5U2hlZXRQYWdlKCkgewotCQlyZXR1cm4gdGhpcy5wYWdlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgamF2YS5iZWFucy5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyI3Byb3BlcnR5Q2hhbmdlKGphdmEuYmVhbnMuUHJvcGVydHlDaGFuZ2VFdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZShQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2dCkgewotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlByb2VwcnR5Q2hhbmdlRXZlbnQiICsgZXZ0KTsKLQkJcmVmcmVzaCgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBmaWx0ZXIgbGlzdCBvZiBlbGVtZW50cy4gRmlsdGVyIGlzIGJhc2VkIG9uIGN1cnJlbnQgbWV0aG9kIGNvbmZpZ3VyYXRpb24KLQkgKiBAcGFyYW0gbGlzdAotCSAqIAkJCU9yaWdpbmFsIGxpc3QKLQkgKiBAcmV0dXJuCi0JICogCQkJZmlsdGVyZWQgbGlzdAotCSAqLwotCXB1YmxpYyBMaXN0IGdldEZpbHRlcmVkTGlzdChMaXN0IGxpc3QpIHsKLQkJTGlzdCBuZXdMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0b3IgPSBsaXN0Lml0ZXJhdG9yKCk7IGl0b3IuaGFzTmV4dCgpOykgewotCQkJaWYgKGNvbmZpZ3VyYXRvciAhPSBudWxsKSB7Ci0JCQkJT2JqZWN0IG9iaiA9IChPYmplY3QpIGl0b3IubmV4dCgpOwotCQkJCWNvbmZpZ3VyYXRvci5zZXRNZXRob2RDb25maWd1cmF0aW9uKExpYnJhcnlTZXJ2aWNlCi0JCQkJCQkuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TWV0aG9kQ29uZmlndXJhdGlvbigpKTsKLQkJCQlpZiAoY29uZmlndXJhdG9yLmFjY2VwdChvYmopKSB7Ci0JCQkJCW5ld0xpc3QuYWRkKG9iaik7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBuZXdMaXN0OwotCX0KLQotCS8qKgotCSAqIEdldCBkZWZhdWx0IG1ldGhvZCBjb25maWd1cmF0aW9uCi0JICogCi0JICogQHJldHVybiAKLQkgKiAJCQlkZWZhdWx0IG1ldGhvZCBjb25maWd1cmF0aW9uCi0JICovCi0JcHJvdGVjdGVkIE1ldGhvZENvbmZpZ3VyYXRpb24gZ2V0RGVmYXVsdENvbmZpZ3VyYXRpb24oKSB7Ci0JCUl0ZW1Qcm92aWRlckFkYXB0ZXIgYWRhcHRlciA9IChJdGVtUHJvdmlkZXJBZGFwdGVyKSBnZXRBZGFwdGVyKCk7Ci0JCU9iamVjdCBwYXJlbnQgPSBudWxsOwotCQlpZiAoYWRhcHRlciBpbnN0YW5jZW9mIElCU0l0ZW1Qcm92aWRlcikgewotCQkJSUJTSXRlbVByb3ZpZGVyIGJzSXRlbVByb3ZpZGVyID0gKElCU0l0ZW1Qcm92aWRlcikgYWRhcHRlcjsKLQkJCXBhcmVudCA9IGJzSXRlbVByb3ZpZGVyLmdldFRvcEl0ZW0oKTsKLQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gKChvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3MpIHBhcmVudCkKLQkJCQkJLmdldERlZmF1bHRDb250ZXh0KCk7Ci0JCQlyZXR1cm4gY29uZmlnOwotCQl9IGVsc2UgewotCQkJbG9nZ2VyCi0JCQkJCS5sb2dFcnJvcigiQWJzdHJhY3RTZWN0aW9uOjpnZXREZWZhdWx0Q29uZmlndXJhdGlvbiAtIElCU0l0ZW1Qcm92aWRlciBpcyBudWxsIik7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGN1cnJlbnQgbWV0aG9kIGNvbmZpZ3VyYXRpb24KLQkgKiAKLQkgKiBAcmV0dXJuCi0JICogCQkJY3VycmVudCBtZXRob2QgY29uZmlndXJhdGlvbgotCSAqLwotCXByb3RlY3RlZCBNZXRob2RDb25maWd1cmF0aW9uIGdldENvbmZpZ3VyYXRpb24oKSB7Ci0JCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKQotCQkJCS5nZXRDdXJyZW50TWV0aG9kQ29uZmlndXJhdGlvbigpOwotCQlpZiAoY29uZmlnID09IG51bGwpIHsKLQkJCS8vIGlmIGNvbmZpZ3VyYXRpb24gaXMgbm90IHNlbGVjdGVkLCB1c2UgZGVmYXVsdCBjb25maWd1cmF0aW9uCi0JCQlyZXR1cm4gZ2V0RGVmYXVsdENvbmZpZ3VyYXRpb24oKTsKLQkJfQotCi0JCXJldHVybiBjb25maWc7Ci0JfQotCi0KLQkvLyBwdWJsaWMgdm9pZCB1cGRhdGVUaXRsZShPYmplY3Qgb2JqKQotCS8vIHsKLQkvLyBTdHJpbmcgbmFtZSA9IGdldE5hbWVQcmVmaXgoKSArICgoQnJlYWtkb3duRWxlbWVudClvYmopLmdldE5hbWUoKTsKLQkvLyBUYWJiZWRQcm9wZXJ0eUNvbXBvc2l0ZSBjb21wID0gKFRhYmJlZFByb3BlcnR5Q29tcG9zaXRlKQotCS8vIHBhZ2UuZ2V0Q29udHJvbCgpOwotCS8vIFRhYmJlZFByb3BlcnR5VGl0bGUgdGl0bGUgPSBjb21wLmdldFRpdGxlKCk7Ci0JLy8gaWYgKHRpdGxlSW1hZ2UgPT0gbnVsbCkKLQkvLyB7Ci0JLy8gdGl0bGVJbWFnZSA9IERpc3BsYXkuZ2V0Q3VycmVudCgpLmdldEFjdGl2ZVNoZWxsKCkuZ2V0SW1hZ2UoKTsKLQkvLyB9Ci0JLy8gdGl0bGUuc2V0VGl0bGUobmFtZSwgdGl0bGVJbWFnZSk7Ci0JLy8gfQotCQotCQotCQotCS8qKgotCSAqIEdldCBuYW1lIHByZWZpeCBmb3IgdGhlIGVsZW1lbnQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWVQcmVmaXgoKSB7Ci0JCXJldHVybiAiUHJvY2Vzc0VsZW1lbnQ6ICI7IC8vJE5PTi1OTFMtMSQKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvQWN0aXZpdHlEb2N1bWVudFNlY3Rpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9BY3Rpdml0eURvY3VtZW50U2VjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MWJkOGFhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9BY3Rpdml0eURvY3VtZW50U2VjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzY3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5NZXRob2RFbGVtZW50RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucmljaHRleHQuSU1ldGhvZFJpY2hUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudXRpbC5SaWNoVGV4dEltYWdlTGlua0NvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSUFjdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlByb2Nlc3NVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwudmlld3MucHJvcGVydGllcy50YWJiZWQudmlldy5UYWJiZWRQcm9wZXJ0eUNvbXBvc2l0ZTsKLQotCi0vKioKLSAqIFRoZSBkb2N1bWVudCB0YWIgZm9yIEFjdGl2aXR5Ci0gKiAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXR5RG9jdW1lbnRTZWN0aW9uIGV4dGVuZHMgQnJlYWtkb3duRWxlbWVudERvY3VtZW50U2VjdGlvbiB7Ci0KLQlwcm90ZWN0ZWQgQWN0aXZpdHkgZWxlbWVudDsKLQotCXByb3RlY3RlZCBJTWV0aG9kUmljaFRleHQgbWFpbkRlc2NUZXh0OwotCQotCXByb3RlY3RlZCBSaWNoVGV4dEltYWdlTGlua0NvbnRhaW5lciBtYWluRGVzY0NvbnRhaW5lcjsKLQotCXByb3RlY3RlZCBJTWV0aG9kUmljaFRleHQgcHVycG9zZVRleHQ7Ci0JCi0JcHJvdGVjdGVkIFJpY2hUZXh0SW1hZ2VMaW5rQ29udGFpbmVyIHB1cnBvc2VDb250YWluZXI7Ci0KLQlwcm90ZWN0ZWQgSU1ldGhvZFJpY2hUZXh0IGFsdGVybmF0aXZlc1RleHQ7Ci0JCi0JcHJvdGVjdGVkIFJpY2hUZXh0SW1hZ2VMaW5rQ29udGFpbmVyIGFsdGVybmF0aXZlc0NvbnRhaW5lcjsKLQotCXByb3RlY3RlZCBJTWV0aG9kUmljaFRleHQgaG93VG9TdGFmZlRleHQ7Ci0JCi0JcHJvdGVjdGVkIFJpY2hUZXh0SW1hZ2VMaW5rQ29udGFpbmVyIGhvd1RvU3RhZmZDb250YWluZXI7Ci0KLQlwcml2YXRlIExpc3RlbmVyIHB1cnBvc2VMaXN0ZW5lciA9IG5ldyBMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJZWxlbWVudCA9IChBY3Rpdml0eSkgZ2V0RWxlbWVudCgpOwotCQkJSU1ldGhvZFJpY2hUZXh0IGNvbnRyb2wgPSBleHBhbmRGbGFnID8gY3RybF9kb2N1bWVudF9leHBhbmRlZAotCQkJCQk6IHB1cnBvc2VUZXh0OwotCQkJaWYgKCFjb250cm9sLmdldE1vZGlmaWVkKCkpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlTdHJpbmcgb2xkQ29udGVudCA9ICgoQWN0aXZpdHlEZXNjcmlwdGlvbikgZWxlbWVudAotCQkJCQkuZ2V0UHJlc2VudGF0aW9uKCkpLmdldFB1cnBvc2UoKTsKLQkJCWlmICgoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpKS5tdXN0UmVzdG9yZVZhbHVlKAotCQkJCQlwdXJwb3NlVGV4dCwgb2xkQ29udGVudCkpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlTdHJpbmcgbmV3Q29udGVudCA9IGNvbnRyb2wuZ2V0VGV4dCgpOwotCQkJaWYgKCFuZXdDb250ZW50LmVxdWFscyhvbGRDb250ZW50KSkgewotCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5TRVQsIGVsZW1lbnQKLQkJCQkJCS5nZXRQcmVzZW50YXRpb24oKSwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCS5nZXRBY3Rpdml0eURlc2NyaXB0aW9uX1B1cnBvc2UoKSwgbmV3Q29udGVudCwgLTEpOwotCQkJfQotCQl9Ci0JfTsKLQotCXByaXZhdGUgTGlzdGVuZXIgbWFpbkRlc2NMaXN0ZW5lciA9IG5ldyBMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJZWxlbWVudCA9IChBY3Rpdml0eSkgZ2V0RWxlbWVudCgpOwotCQkJSU1ldGhvZFJpY2hUZXh0IGNvbnRyb2wgPSBleHBhbmRGbGFnID8gY3RybF9kb2N1bWVudF9leHBhbmRlZAotCQkJCQk6IG1haW5EZXNjVGV4dDsKLQkJCWlmICghY29udHJvbC5nZXRNb2RpZmllZCgpKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJU3RyaW5nIG9sZENvbnRlbnQgPSAoKEFjdGl2aXR5RGVzY3JpcHRpb24pIGVsZW1lbnQKLQkJCQkJLmdldFByZXNlbnRhdGlvbigpKS5nZXRNYWluRGVzY3JpcHRpb24oKTsKLQkJCWlmICgoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpKS5tdXN0UmVzdG9yZVZhbHVlKAotCQkJCQltYWluRGVzY1RleHQsIG9sZENvbnRlbnQpKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJU3RyaW5nIG5ld0NvbnRlbnQgPSBjb250cm9sLmdldFRleHQoKTsKLQkJCWlmICghbmV3Q29udGVudC5lcXVhbHMob2xkQ29udGVudCkpIHsKLQkJCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuU0VULCBlbGVtZW50Ci0JCQkJCQkuZ2V0UHJlc2VudGF0aW9uKCksIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkuZ2V0Q29udGVudERlc2NyaXB0aW9uX01haW5EZXNjcmlwdGlvbigpLCBuZXdDb250ZW50LAotCQkJCQkJLTEpOwotCQkJfQotCQl9Ci0JfTsKLQotCXByaXZhdGUgTGlzdGVuZXIgYWx0ZXJuYXRpdmVzTGlzdGVuZXIgPSBuZXcgTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCWVsZW1lbnQgPSAoQWN0aXZpdHkpIGdldEVsZW1lbnQoKTsKLQkJCUlNZXRob2RSaWNoVGV4dCBjb250cm9sID0gZXhwYW5kRmxhZyA/IGN0cmxfZG9jdW1lbnRfZXhwYW5kZWQKLQkJCQkJOiBhbHRlcm5hdGl2ZXNUZXh0OwotCQkJaWYgKCFjb250cm9sLmdldE1vZGlmaWVkKCkpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlTdHJpbmcgb2xkQ29udGVudCA9ICgoQWN0aXZpdHlEZXNjcmlwdGlvbikgZWxlbWVudAotCQkJCQkuZ2V0UHJlc2VudGF0aW9uKCkpLmdldEFsdGVybmF0aXZlcygpOwotCQkJaWYgKCgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpLm11c3RSZXN0b3JlVmFsdWUoCi0JCQkJCWFsdGVybmF0aXZlc1RleHQsIG9sZENvbnRlbnQpKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJU3RyaW5nIG5ld0NvbnRlbnQgPSBjb250cm9sLmdldFRleHQoKTsKLQkJCWlmICghbmV3Q29udGVudC5lcXVhbHMob2xkQ29udGVudCkpIHsKLQkJCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuU0VULCBlbGVtZW50Ci0JCQkJCQkuZ2V0UHJlc2VudGF0aW9uKCksIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkuZ2V0QWN0aXZpdHlEZXNjcmlwdGlvbl9BbHRlcm5hdGl2ZXMoKSwgbmV3Q29udGVudCwgLTEpOwotCQkJfQotCQl9Ci0JfTsKLQotCXByaXZhdGUgTGlzdGVuZXIgaG93VG9TdGFmZkxpc3RlbmVyID0gbmV3IExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQllbGVtZW50ID0gKEFjdGl2aXR5KSBnZXRFbGVtZW50KCk7Ci0JCQlJTWV0aG9kUmljaFRleHQgY29udHJvbCA9IGV4cGFuZEZsYWcgPyBjdHJsX2RvY3VtZW50X2V4cGFuZGVkCi0JCQkJCTogaG93VG9TdGFmZlRleHQ7Ci0JCQlpZiAoIWNvbnRyb2wuZ2V0TW9kaWZpZWQoKSkgewotCQkJCXJldHVybjsKLQkJCX0KLQkJCVN0cmluZyBvbGRDb250ZW50ID0gKChBY3Rpdml0eURlc2NyaXB0aW9uKSBlbGVtZW50Ci0JCQkJCS5nZXRQcmVzZW50YXRpb24oKSkuZ2V0SG93dG9TdGFmZigpOwotCQkJaWYgKCgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpLm11c3RSZXN0b3JlVmFsdWUoCi0JCQkJCWhvd1RvU3RhZmZUZXh0LCBvbGRDb250ZW50KSkgewotCQkJCXJldHVybjsKLQkJCX0KLQkJCVN0cmluZyBuZXdDb250ZW50ID0gY29udHJvbC5nZXRUZXh0KCk7Ci0JCQlpZiAoIW5ld0NvbnRlbnQuZXF1YWxzKG9sZENvbnRlbnQpKSB7Ci0JCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlNFVCwgZWxlbWVudAotCQkJCQkJLmdldFByZXNlbnRhdGlvbigpLCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJLmdldEFjdGl2aXR5RGVzY3JpcHRpb25fSG93dG9TdGFmZigpLCBuZXdDb250ZW50LCAtMSk7Ci0JCQl9Ci0JCX0KLQl9OwotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuQnJlYWtkb3duRWxlbWVudERvY3VtZW50U2VjdGlvbiNpbml0KCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0KCkgewotCQlzdXBlci5pbml0KCk7Ci0JCWVsZW1lbnQgPSAoQWN0aXZpdHkpIGdldEVsZW1lbnQoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5CcmVha2Rvd25FbGVtZW50RG9jdW1lbnRTZWN0aW9uI2NyZWF0ZURvY3VtZW50U2VjdGlvbihvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRG9jdW1lbnRTZWN0aW9uKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQkJaW50IG1haW5EZXNjaGVpZ2h0SGludCA9IDEwMDsKLQotCQlzdXBlci5jcmVhdGVEb2N1bWVudFNlY3Rpb24oY29tcG9zaXRlKTsKLQotCQkvLyBtYWluIGRlc2NyaXB0aW9uCi0JCW1haW5EZXNjQ29udGFpbmVyID0gRm9ybVVJLmNyZWF0ZVJpY2hUZXh0V2l0aExpbmsodG9vbGtpdCwKLQkJCQlkb2N1bWVudENvbXBvc2l0ZSwgbWFpbkRlc2NoZWlnaHRIaW50LCBjb250ZW50RWxlbWVudFBhdGgsIGVsZW1lbnQsCi0JCQkJUHJvcGVydGllc1Jlc291cmNlcy5Qcm9jZXNzX21haW5EZXNjcmlwdGlvbik7Ci0JCWFkZEh5cGVyTGlua0xpc3RlbmVyKG1haW5EZXNjQ29udGFpbmVyLmxpbmspOwotCQltYWluRGVzY1RleHQgPSBtYWluRGVzY0NvbnRhaW5lci5yaWNoVGV4dDsKLQotCQkvLyBwdXJwb3NlCi0JCXB1cnBvc2VDb250YWluZXIgPSBGb3JtVUkuY3JlYXRlUmljaFRleHRXaXRoTGluayh0b29sa2l0LAotCQkJCWRvY3VtZW50Q29tcG9zaXRlLCBoZWlnaHRIaW50LCBjb250ZW50RWxlbWVudFBhdGgsIGVsZW1lbnQsCi0JCQkJUHJvcGVydGllc1Jlc291cmNlcy5Qcm9jZXNzX3B1cnBvc2UpOwotCQlhZGRIeXBlckxpbmtMaXN0ZW5lcihwdXJwb3NlQ29udGFpbmVyLmxpbmspOwotCQlwdXJwb3NlVGV4dCA9IHB1cnBvc2VDb250YWluZXIucmljaFRleHQ7Ci0KLQkJLy8gY3JlYXRlIGFsdGVybmF0aXZlcwotCQlhbHRlcm5hdGl2ZXNDb250YWluZXIgPSBGb3JtVUkuY3JlYXRlUmljaFRleHRXaXRoTGluayh0b29sa2l0LAotCQkJCWRvY3VtZW50Q29tcG9zaXRlLCBoZWlnaHRIaW50LCBjb250ZW50RWxlbWVudFBhdGgsIGVsZW1lbnQsCi0JCQkJUHJvcGVydGllc1Jlc291cmNlcy5BY3Rpdml0eV9hbHRlcm5hdGl2ZXMpOwotCQlhZGRIeXBlckxpbmtMaXN0ZW5lcihhbHRlcm5hdGl2ZXNDb250YWluZXIubGluayk7Ci0JCWFsdGVybmF0aXZlc1RleHQgPSBhbHRlcm5hdGl2ZXNDb250YWluZXIucmljaFRleHQ7Ci0JCQotCQkvLyBjcmVhdGUgaG93dG9TdGFmZgotCQlob3dUb1N0YWZmQ29udGFpbmVyID0gRm9ybVVJLmNyZWF0ZVJpY2hUZXh0V2l0aExpbmsodG9vbGtpdCwKLQkJCQlkb2N1bWVudENvbXBvc2l0ZSwgaGVpZ2h0SGludCwgY29udGVudEVsZW1lbnRQYXRoLCBlbGVtZW50LAotCQkJCVByb3BlcnRpZXNSZXNvdXJjZXMuQWN0aXZpdHlfaG93VG9TdGFmZik7Ci0JCWFkZEh5cGVyTGlua0xpc3RlbmVyKGhvd1RvU3RhZmZDb250YWluZXIubGluayk7Ci0JCWhvd1RvU3RhZmZUZXh0ID0gaG93VG9TdGFmZkNvbnRhaW5lci5yaWNoVGV4dDsKLQkJCi0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuQnJlYWtkb3duRWxlbWVudERvY3VtZW50U2VjdGlvbiNhZGRMaXN0ZW5lcnMoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZExpc3RlbmVycygpIHsKLQkJc3VwZXIuYWRkTGlzdGVuZXJzKCk7Ci0JCQotCQlCcmVha2Rvd25FbGVtZW50IGVsZW1lbnQgPSBnZXRFbGVtZW50KCk7Ci0JCQotCQlwdXJwb3NlVGV4dC5zZXRNb2RhbE9iamVjdChlbGVtZW50KTsKLQkJcHVycG9zZVRleHQuc2V0TW9kYWxPYmplY3RGZWF0dXJlKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkuZ2V0QWN0aXZpdHlEZXNjcmlwdGlvbl9QdXJwb3NlKCkpOwotCQlwdXJwb3NlVGV4dC5hZGRMaXN0ZW5lcihTV1QuRGVhY3RpdmF0ZSwgcHVycG9zZUxpc3RlbmVyKTsKLQkJCi0JCW1haW5EZXNjVGV4dC5zZXRNb2RhbE9iamVjdChlbGVtZW50KTsKLQkJbWFpbkRlc2NUZXh0LnNldE1vZGFsT2JqZWN0RmVhdHVyZShVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb250ZW50RGVzY3JpcHRpb25fTWFpbkRlc2NyaXB0aW9uKCkpOwotCQltYWluRGVzY1RleHQuYWRkTGlzdGVuZXIoU1dULkRlYWN0aXZhdGUsIG1haW5EZXNjTGlzdGVuZXIpOwotCQkJCQotCQlhbHRlcm5hdGl2ZXNUZXh0LnNldE1vZGFsT2JqZWN0KGVsZW1lbnQpOwotCQlhbHRlcm5hdGl2ZXNUZXh0LnNldE1vZGFsT2JqZWN0RmVhdHVyZShVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRBY3Rpdml0eURlc2NyaXB0aW9uX0FsdGVybmF0aXZlcygpKTsKLQkJYWx0ZXJuYXRpdmVzVGV4dC5hZGRMaXN0ZW5lcihTV1QuRGVhY3RpdmF0ZSwgYWx0ZXJuYXRpdmVzTGlzdGVuZXIpOwotCQkKLQkJaG93VG9TdGFmZlRleHQuc2V0TW9kYWxPYmplY3QoZWxlbWVudCk7Ci0JCWhvd1RvU3RhZmZUZXh0LnNldE1vZGFsT2JqZWN0RmVhdHVyZShVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRBY3Rpdml0eURlc2NyaXB0aW9uX0hvd3RvU3RhZmYoKSk7Ci0JCWhvd1RvU3RhZmZUZXh0LmFkZExpc3RlbmVyKFNXVC5EZWFjdGl2YXRlLCBob3dUb1N0YWZmTGlzdGVuZXIpOwotCX0KLQkJCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuQnJlYWtkb3duRWxlbWVudERvY3VtZW50U2VjdGlvbiN1cGRhdGVDb250cm9scygpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlQ29udHJvbHMoKSB7Ci0JCXN1cGVyLnVwZGF0ZUNvbnRyb2xzKCk7Ci0JCXB1cnBvc2VUZXh0LnNldEVkaXRhYmxlKGVkaXRhYmxlKTsKLQkJbWFpbkRlc2NUZXh0LnNldEVkaXRhYmxlKGVkaXRhYmxlKTsKLQkJYWx0ZXJuYXRpdmVzVGV4dC5zZXRFZGl0YWJsZShlZGl0YWJsZSk7Ci0JCWhvd1RvU3RhZmZUZXh0LnNldEVkaXRhYmxlKGVkaXRhYmxlKTsKLQkJLy8gaGlkZSBmaWVsZHMgZm9yIHRvcC1sZXZlbCBwcm9jZXNzZXM6Ci0JCWlmIChQcm9jZXNzVXRpbC5pc1RvcFByb2Nlc3MoZWxlbWVudCkpIHsKLQkJCWJyaWVmRGVzY0xhYmVsLnNldFZpc2libGUoZmFsc2UpOwotCQkJYnJpZWZEZXNjVGV4dC5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJCWV4dGVybmFsSURMYWJlbC5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJCWV4dGVybmFsSURUZXh0LnNldFZpc2libGUoZmFsc2UpOwotCQkJa2V5Q29uc2lkZXJhdGlvbnNDb250YWluZXIuc2V0VmlzaWJsZShmYWxzZSk7Ci0JCQltYWluRGVzY0NvbnRhaW5lci5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJCXB1cnBvc2VDb250YWluZXIuc2V0VmlzaWJsZShmYWxzZSk7Ci0JCQlhbHRlcm5hdGl2ZXNDb250YWluZXIuc2V0VmlzaWJsZShmYWxzZSk7Ci0JCQlob3dUb1N0YWZmQ29udGFpbmVyLnNldFZpc2libGUoZmFsc2UpOwotCQkJCi0JCQkvLyBtb3ZlIHVzYWdlIGd1aWRhbmNlIHRvIGJlIHJpZ2h0IGFmdGVyIHByZWZpeCBmaWVsZAotCQkJdXNhZ2VHdWlkYW5jZUNvbnRhaW5lci5tb3ZlQmVsb3cocHJlZml4VGV4dCk7Ci0JCQkKLQkJfSBlbHNlIHsKLQkJCWJyaWVmRGVzY0xhYmVsLnNldFZpc2libGUodHJ1ZSk7Ci0JCQlicmllZkRlc2NUZXh0LnNldFZpc2libGUodHJ1ZSk7Ci0JCQlleHRlcm5hbElETGFiZWwuc2V0VmlzaWJsZSh0cnVlKTsKLQkJCWV4dGVybmFsSURUZXh0LnNldFZpc2libGUodHJ1ZSk7Ci0JCQlrZXlDb25zaWRlcmF0aW9uc0NvbnRhaW5lci5zZXRWaXNpYmxlKHRydWUpOwotCQkJbWFpbkRlc2NDb250YWluZXIuc2V0VmlzaWJsZSh0cnVlKTsKLQkJCXB1cnBvc2VDb250YWluZXIuc2V0VmlzaWJsZSh0cnVlKTsKLQkJCWFsdGVybmF0aXZlc0NvbnRhaW5lci5zZXRWaXNpYmxlKHRydWUpOwotCQkJaG93VG9TdGFmZkNvbnRhaW5lci5zZXRWaXNpYmxlKHRydWUpOwotCQkJLy8gbW92ZSB1c2FnZSBndWlkYW5jZSB0byBiZSByaWdodCBhZnRlciBleHRlcm5hbElEIGZpZWxkCi0JCQl1c2FnZUd1aWRhbmNlQ29udGFpbmVyLm1vdmVCZWxvdyhleHRlcm5hbElEVGV4dCk7Ci0JCX0KLQkJcGFyZW50LmxheW91dCh0cnVlLCB0cnVlKTsKLQkJLy8gbWFrZSBwYXJlbnQgYmUgdG90YWxseSByZXBhaW50ZWQKLQkJcGFyZW50LnNldFZpc2libGUoZmFsc2UpOwotCQlwYXJlbnQuc2V0VmlzaWJsZSh0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5CcmVha2Rvd25FbGVtZW50RG9jdW1lbnRTZWN0aW9uI3JlZnJlc2goKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlZnJlc2goKSB7Ci0JCXRyeSB7Ci0JCQlpZiAoZ2V0RWxlbWVudCgpIGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQkoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpKS5zYXZlTW9kaWZpZWRSaWNoVGV4dCgpOwotCi0JCQkJZWxlbWVudCA9IChBY3Rpdml0eSkgZ2V0RWxlbWVudCgpOwotCQkJCUFjdGl2aXR5RGVzY3JpcHRpb24gY29udGVudCA9IChBY3Rpdml0eURlc2NyaXB0aW9uKSBlbGVtZW50Ci0JCQkJCQkuZ2V0UHJlc2VudGF0aW9uKCk7Ci0KLQkJCQlpZiAoY29udGVudE1vZGlmeUxpc3RlbmVyICE9IG51bGwpIHsKLQkJCQkJbWFpbkRlc2NUZXh0LnJlbW92ZU1vZGlmeUxpc3RlbmVyKGNvbnRlbnRNb2RpZnlMaXN0ZW5lcik7Ci0JCQkJCXB1cnBvc2VUZXh0LnJlbW92ZU1vZGlmeUxpc3RlbmVyKGNvbnRlbnRNb2RpZnlMaXN0ZW5lcik7Ci0JCQkJCWFsdGVybmF0aXZlc1RleHQKLQkJCQkJCQkucmVtb3ZlTW9kaWZ5TGlzdGVuZXIoY29udGVudE1vZGlmeUxpc3RlbmVyKTsKLQkJCQkJaG93VG9TdGFmZlRleHQucmVtb3ZlTW9kaWZ5TGlzdGVuZXIoY29udGVudE1vZGlmeUxpc3RlbmVyKTsKLQkJCQl9Ci0JCQkJCi0JCQkJc3VwZXIucmVmcmVzaCgpOwotCi0JCQkJaWYgKGNvbnRlbnRNb2RpZnlMaXN0ZW5lciAhPSBudWxsKSB7Ci0JCQkJCWlmIChjb250ZW50TW9kaWZ5TGlzdGVuZXIgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50RWRpdG9yLk1vZGlmeUxpc3RlbmVyKSB7Ci0JCQkJCQkoKE1ldGhvZEVsZW1lbnRFZGl0b3IuTW9kaWZ5TGlzdGVuZXIpIGNvbnRlbnRNb2RpZnlMaXN0ZW5lcikKLQkJCQkJCQkJLnNldEVsZW1lbnQoZWxlbWVudC5nZXRQcmVzZW50YXRpb24oKSk7Ci0JCQkJCQkoKE1ldGhvZEVsZW1lbnRFZGl0b3IuTW9kaWZ5TGlzdGVuZXIpIGNvbnRlbnRNb2RpZnlMaXN0ZW5lcikKLQkJCQkJCQkJLnNldERpc2FibGUodHJ1ZSk7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQltYWluRGVzY1RleHQuc2V0VGV4dChjb250ZW50LmdldE1haW5EZXNjcmlwdGlvbigpKTsKLQkJCQlwdXJwb3NlVGV4dC5zZXRUZXh0KGNvbnRlbnQuZ2V0UHVycG9zZSgpKTsKLQkJCQlhbHRlcm5hdGl2ZXNUZXh0LnNldFRleHQoY29udGVudC5nZXRBbHRlcm5hdGl2ZXMoKSk7Ci0JCQkJaG93VG9TdGFmZlRleHQuc2V0VGV4dChjb250ZW50LmdldEhvd3RvU3RhZmYoKSk7Ci0KLQkJCQlpZiAoZXhwYW5kRmxhZykgewotCQkJCQlpZiAoZXhwYW5kRG9jdW1lbnRMYWJlbC5nZXRUZXh0KCkuZXF1YWxzKAotCQkJCQkJCVByb3BlcnRpZXNSZXNvdXJjZXMuUHJvY2Vzc19tYWluRGVzY3JpcHRpb24pKSB7IAotCQkJCQkJY3RybF9kb2N1bWVudF9leHBhbmRlZC5zZXRUZXh0KGNvbnRlbnQKLQkJCQkJCQkJLmdldE1haW5EZXNjcmlwdGlvbigpKTsKLQkJCQkJCWN0cmxfZG9jdW1lbnRfZXhwYW5kZWQuc2V0U2VsZWN0aW9uKDApOwotCQkJCQkJY3RybF9kb2N1bWVudF9leHBhbmRlZC5zZXRNb2RhbE9iamVjdChjb250ZW50KTsKLQkJCQkJCWN0cmxfZG9jdW1lbnRfZXhwYW5kZWQKLQkJCQkJCQkJLnNldE1vZGFsT2JqZWN0RmVhdHVyZShVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJCS5nZXRDb250ZW50RGVzY3JpcHRpb25fTWFpbkRlc2NyaXB0aW9uKCkpOwotCi0JCQkJCX0gZWxzZSBpZiAoZXhwYW5kRG9jdW1lbnRMYWJlbC5nZXRUZXh0KCkuZXF1YWxzKAotCQkJCQkJCVByb3BlcnRpZXNSZXNvdXJjZXMuUHJvY2Vzc19wdXJwb3NlKSkgeyAKLQkJCQkJCWN0cmxfZG9jdW1lbnRfZXhwYW5kZWQuc2V0VGV4dChjb250ZW50LmdldFB1cnBvc2UoKSk7Ci0JCQkJCQljdHJsX2RvY3VtZW50X2V4cGFuZGVkLnNldE1vZGFsT2JqZWN0KGNvbnRlbnQpOwotCQkJCQkJY3RybF9kb2N1bWVudF9leHBhbmRlZAotCQkJCQkJCQkuc2V0TW9kYWxPYmplY3RGZWF0dXJlKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJLmdldEFjdGl2aXR5RGVzY3JpcHRpb25fUHVycG9zZSgpKTsKLQkJCQkJfSBlbHNlIGlmIChleHBhbmREb2N1bWVudExhYmVsLmdldFRleHQoKS5lcXVhbHMoCi0JCQkJCQkJUHJvcGVydGllc1Jlc291cmNlcy5BY3Rpdml0eV9hbHRlcm5hdGl2ZXMpKSB7IAotCQkJCQkJY3RybF9kb2N1bWVudF9leHBhbmRlZC5zZXRUZXh0KGNvbnRlbnQKLQkJCQkJCQkJLmdldEFsdGVybmF0aXZlcygpKTsKLQkJCQkJCWN0cmxfZG9jdW1lbnRfZXhwYW5kZWQuc2V0TW9kYWxPYmplY3QoY29udGVudCk7Ci0JCQkJCQljdHJsX2RvY3VtZW50X2V4cGFuZGVkCi0JCQkJCQkJCS5zZXRNb2RhbE9iamVjdEZlYXR1cmUoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCQkuZ2V0QWN0aXZpdHlEZXNjcmlwdGlvbl9BbHRlcm5hdGl2ZXMoKSk7Ci0JCQkJCX0gZWxzZSBpZiAoZXhwYW5kRG9jdW1lbnRMYWJlbC5nZXRUZXh0KCkuZXF1YWxzKAotCQkJCQkJCVByb3BlcnRpZXNSZXNvdXJjZXMuQWN0aXZpdHlfaG93VG9TdGFmZikpIHsgCi0JCQkJCQljdHJsX2RvY3VtZW50X2V4cGFuZGVkLnNldFRleHQoY29udGVudC5nZXRIb3d0b1N0YWZmKCkpOwotCQkJCQkJY3RybF9kb2N1bWVudF9leHBhbmRlZC5zZXRNb2RhbE9iamVjdChjb250ZW50KTsKLQkJCQkJCWN0cmxfZG9jdW1lbnRfZXhwYW5kZWQKLQkJCQkJCQkJLnNldE1vZGFsT2JqZWN0RmVhdHVyZShVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJCS5nZXRBY3Rpdml0eURlc2NyaXB0aW9uX0hvd3RvU3RhZmYoKSk7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQlpZiAoY29udGVudE1vZGlmeUxpc3RlbmVyIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudEVkaXRvci5Nb2RpZnlMaXN0ZW5lcikgewotCQkJCQkoKE1ldGhvZEVsZW1lbnRFZGl0b3IuTW9kaWZ5TGlzdGVuZXIpIGNvbnRlbnRNb2RpZnlMaXN0ZW5lcikKLQkJCQkJCQkuc2V0RGlzYWJsZShmYWxzZSk7Ci0JCQkJfQotCi0JCQkJbWFpbkRlc2NUZXh0LnNldE1vZGFsT2JqZWN0KGNvbnRlbnQpOwotCQkJCW1haW5EZXNjVGV4dC5zZXRNb2RhbE9iamVjdEZlYXR1cmUoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCS5nZXRDb250ZW50RGVzY3JpcHRpb25fTWFpbkRlc2NyaXB0aW9uKCkpOwotCQkJCW1haW5EZXNjVGV4dC5hZGRNb2RpZnlMaXN0ZW5lcihjb250ZW50TW9kaWZ5TGlzdGVuZXIpOwotCi0JCQkJcHVycG9zZVRleHQuc2V0TW9kYWxPYmplY3QoY29udGVudCk7Ci0JCQkJcHVycG9zZVRleHQuc2V0TW9kYWxPYmplY3RGZWF0dXJlKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkuZ2V0QWN0aXZpdHlEZXNjcmlwdGlvbl9QdXJwb3NlKCkpOwotCQkJCXB1cnBvc2VUZXh0LmFkZE1vZGlmeUxpc3RlbmVyKGNvbnRlbnRNb2RpZnlMaXN0ZW5lcik7Ci0KLQkJCQlhbHRlcm5hdGl2ZXNUZXh0LnNldE1vZGFsT2JqZWN0KGNvbnRlbnQpOwotCQkJCWFsdGVybmF0aXZlc1RleHQuc2V0TW9kYWxPYmplY3RGZWF0dXJlKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkuZ2V0QWN0aXZpdHlEZXNjcmlwdGlvbl9BbHRlcm5hdGl2ZXMoKSk7Ci0JCQkJYWx0ZXJuYXRpdmVzVGV4dC5hZGRNb2RpZnlMaXN0ZW5lcihjb250ZW50TW9kaWZ5TGlzdGVuZXIpOwotCi0JCQkJaG93VG9TdGFmZlRleHQuc2V0TW9kYWxPYmplY3QoY29udGVudCk7Ci0JCQkJaG93VG9TdGFmZlRleHQuc2V0TW9kYWxPYmplY3RGZWF0dXJlKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkuZ2V0QWN0aXZpdHlEZXNjcmlwdGlvbl9Ib3d0b1N0YWZmKCkpOwotCQkJCWhvd1RvU3RhZmZUZXh0LmFkZE1vZGlmeUxpc3RlbmVyKGNvbnRlbnRNb2RpZnlMaXN0ZW5lcik7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJbG9nZ2VyLmxvZ0Vycm9yKAotCQkJCQkiRXJyb3IgcmVmcmVzaGluZyBhY3Rpdml0eSBkb2N1bWVudGF0aW9uIHNlY3Rpb24gOiIsIGV4KTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL0FjdGl2aXR5R2VuZXJhbFNlY3Rpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9BY3Rpdml0eUdlbmVyYWxTZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0YzEzZjAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL0FjdGl2aXR5R2VuZXJhbFNlY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkNvbG9yQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5kaWFsb2dzLkl0ZW1zRmlsdGVyRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5Qcm9jZXNzRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZmlsdGVycy5BY3Rpdml0eVZhcmlhYmlsaXR5RmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuUHJvY2Vzc0JyZWFrZG93blN0cnVjdHVyZUZvcm1QYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudmlld3MuUHJvY2Vzc1ZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLlN0clV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5wYXJ0LkFic3RyYWN0RGlhZ3JhbUVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnBhcnQuRGlhZ3JhbUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUucGFydC5EaWFncmFtRWRpdG9ySW5wdXRQcm94eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnByb3ZpZGVycy5TaGFyZWRSZXNvdXJjZURpYWdyYW1Eb2N1bWVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uUHJvY2Vzc1ZhcmlhYmlsaXR5Q29uZmlndXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSUFjdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5GaWx0ZXJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLklCU0l0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZC5BY3Rpdml0eVZhcmlhYmlsaXR5Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb24uRGVwZW5kZW5jeUNoZWNrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuTGlicmFyeVVJVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5kaWFsb2dzLkNvbnZlcnRBY3Rpdml0eURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNhcGFiaWxpdHlQYXR0ZXJuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcnlQcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuSXRlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5QaGFzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXNvdXJjZXMuZWRpdG9yLmRvY3VtZW50LklEb2N1bWVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ29tYm9WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklGaWxlRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLQotLyoqCi0gKiBUaGUgZ2VuZXJhbCB0YWIgc2VjdGlvbiBmb3IgQWN0aXZpdHkKLSAqIAotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXR5R2VuZXJhbFNlY3Rpb24gZXh0ZW5kcyBXb3JrQnJlYWtkb3duRWxlbWVudEdlbmVyYWxTZWN0aW9uIHsKLQlwcm90ZWN0ZWQgQWN0aXZpdHkgZWxlbWVudDsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBOT1RfQVBQTElDQUJMRV9URVhUID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMubm90QXBwbGljYWJsZV90ZXh0OyAKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT05UUklCVVRFU19URVhUID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuY29udHJpYnV0ZXNfdGV4dDsgCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhURU5EU19URVhUID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZXh0ZW5kc190ZXh0OyAKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRVBMQUNFU19URVhUID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMucmVwbGFjZXNfdGV4dDsgCi0KLQlwcml2YXRlIFRleHQgbW9kZWxJbmZvVGV4dDsKLQotCXByaXZhdGUgTGFiZWwgYWN0aXZpdHlUeXBlTGFiZWw7Ci0KLQlwcml2YXRlIFRleHQgY3RybF90eXBlX3RleHQ7Ci0KLQlwcml2YXRlIEJ1dHRvbiBjdHJsX3R5cGVfYnV0dG9uOwotCi0JcHJpdmF0ZSBDb21ibyBjdHJsX3ZhcmlhYmlsaXR5OwotCi0JcHJpdmF0ZSBDb21ib1ZpZXdlciB2aWV3ZXJfdmFyaWFiaWxpdHk7Ci0KLQlwcml2YXRlIFRleHQgYmFzZVRleHQ7Ci0KLQlwcml2YXRlIEJ1dHRvbiBzZWxlY3RCdXR0b247Ci0KLQlwcm90ZWN0ZWQgSUxhYmVsUHJvdmlkZXIgdmFyaWFiaWxpdHlMYWJlbFByb3ZpZGVyID0gbmV3IEFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcigKLQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCS5nZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSkgewotCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQkJVmFyaWFiaWxpdHlUeXBlIHZhck9iamVjdCA9IChWYXJpYWJpbGl0eVR5cGUpIG9iamVjdDsKLQkJCWlmICh2YXJPYmplY3QgPT0gVmFyaWFiaWxpdHlUeXBlLk5BKQotCQkJCXJldHVybiBOT1RfQVBQTElDQUJMRV9URVhUOwotCQkJaWYgKHZhck9iamVjdCA9PSBWYXJpYWJpbGl0eVR5cGUuQ09OVFJJQlVURVMpCi0JCQkJcmV0dXJuIENPTlRSSUJVVEVTX1RFWFQ7Ci0JCQlpZiAodmFyT2JqZWN0ID09IFZhcmlhYmlsaXR5VHlwZS5FWFRFTkRTKQotCQkJCXJldHVybiBFWFRFTkRTX1RFWFQ7Ci0JCQlpZiAodmFyT2JqZWN0ID09IFZhcmlhYmlsaXR5VHlwZS5SRVBMQUNFUykKLQkJCQlyZXR1cm4gUkVQTEFDRVNfVEVYVDsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfTsKLQotCXByaXZhdGUgSUNvbnRlbnRQcm92aWRlciB2YXJpYWJpbGl0eUNvbnRlbnRQcm92aWRlciA9IG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcigKLQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCS5nZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSkgewotCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IG9iamVjdCkgewotCQkJTGlzdCB2YXJpYWJpbGl0eVR5cGVzTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCXZhcmlhYmlsaXR5VHlwZXNMaXN0LmFkZChWYXJpYWJpbGl0eVR5cGUuTkEpOwotCQkJdmFyaWFiaWxpdHlUeXBlc0xpc3QuYWRkKFZhcmlhYmlsaXR5VHlwZS5DT05UUklCVVRFUyk7Ci0JCQl2YXJpYWJpbGl0eVR5cGVzTGlzdC5hZGQoVmFyaWFiaWxpdHlUeXBlLkVYVEVORFMpOwotCQkJdmFyaWFiaWxpdHlUeXBlc0xpc3QuYWRkKFZhcmlhYmlsaXR5VHlwZS5SRVBMQUNFUyk7Ci0JCQlyZXR1cm4gdmFyaWFiaWxpdHlUeXBlc0xpc3QudG9BcnJheSgpOwotCQl9Ci0JfTsKLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLldvcmtCcmVha2Rvd25FbGVtZW50R2VuZXJhbFNlY3Rpb24jaW5pdCgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdCgpIHsKLQkJc3VwZXIuaW5pdCgpOwotCQkvLyBnZXQgYWN0aXZpdHkgb2JqZWN0Ci0JCWVsZW1lbnQgPSAoQWN0aXZpdHkpIGdldEVsZW1lbnQoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5Xb3JrQnJlYWtkb3duRWxlbWVudEdlbmVyYWxTZWN0aW9uI2NyZWF0ZUdlbmVyYWxTZWN0aW9uKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVHZW5lcmFsU2VjdGlvbihDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JCXN1cGVyLmNyZWF0ZUdlbmVyYWxTZWN0aW9uKGNvbXBvc2l0ZSk7Ci0KLQkJLy8gTW9kZWwgSW5mbwotCQlGb3JtVUkuY3JlYXRlTGFiZWwodG9vbGtpdCwgZ2VuZXJhbENvbXBvc2l0ZSwKLQkJCQlQcm9wZXJ0aWVzUmVzb3VyY2VzLkFjdGl2aXR5X01vZGVsSW5mbyk7IAotCi0JCW1vZGVsSW5mb1RleHQgPSBGb3JtVUkuY3JlYXRlVGV4dCh0b29sa2l0LCBnZW5lcmFsQ29tcG9zaXRlLAotCQkJCVNXVC5ERUZBVUxULCBob3Jpem9udGFsU3Bhbik7Ci0vLwkJbW9kZWxJbmZvVGV4dC5zZXRFbmFibGVkKGZhbHNlKTsKLQkJbW9kZWxJbmZvVGV4dC5zZXRFZGl0YWJsZShmYWxzZSk7Ci0JCW1vZGVsSW5mb1RleHQuc2V0VGV4dChnZXRNb2RlbEluZm8oKSk7Ci0JCW1vZGVsSW5mb1RleHQuc2V0Rm9yZWdyb3VuZChDb2xvckNvbnN0YW50cy5ncmF5KTsKLQotCQkvLyBUeXBlIG9mIGFuIEFjdGl2aXR5Ci0JCWFjdGl2aXR5VHlwZUxhYmVsID0gRm9ybVVJLmNyZWF0ZUxhYmVsKHRvb2xraXQsIGdlbmVyYWxDb21wb3NpdGUsCi0JCQkJUHJvcGVydGllc1Jlc291cmNlcy5BY3Rpdml0eV9UeXBlKTsKLQkJCi0JCWN0cmxfdHlwZV90ZXh0ID0gdG9vbGtpdC5jcmVhdGVUZXh0KGdlbmVyYWxDb21wb3NpdGUsICIiLCBTV1QuUkVBRF9PTkxZKTsgLy8kTk9OLU5MUy0xJAotCQl7Ci0JCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5CRUdJTk5JTkcgfCBHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQkJZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAxOwotCQkJY3RybF90eXBlX3RleHQuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCX0KLQkJY3RybF90eXBlX2J1dHRvbiA9IHRvb2xraXQuY3JlYXRlQnV0dG9uKGdlbmVyYWxDb21wb3NpdGUsCi0JCQkJQXV0aG9yaW5nVUlUZXh0LkNIQU5HRV9UWVBFX0JVVFRPTl9URVhULCBTV1QuUFVTSCk7Ci0JCXsKLQkJCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkJFR0lOTklORyk7Ci0JCQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDE7Ci0JCQljdHJsX3R5cGVfYnV0dG9uLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQl9Ci0JCWlmIChDb252ZXJ0QWN0aXZpdHlEaWFsb2cuZ2V0VmFsaWROZXdBY3Rpdml0eVR5cGVzKGVsZW1lbnQpID09IG51bGwpIHsKLQkJCWN0cmxfdHlwZV9idXR0b24uc2V0VmlzaWJsZShmYWxzZSk7Ci0JCX0KLQotCQlGb3JtVUkuY3JlYXRlTGFiZWwodG9vbGtpdCwgZ2VuZXJhbENvbXBvc2l0ZSwgIiIpOyAvLyROT04tTkxTLTEkCi0KLQkJLy8gVmFyaWFiaWxpdHkgVHlwZQotCQlGb3JtVUkuY3JlYXRlTGFiZWwodG9vbGtpdCwgZ2VuZXJhbENvbXBvc2l0ZSwKLQkJCQlBdXRob3JpbmdVSVRleHQuVkFSSUFCSUxJVFlfVFlQRV9URVhUKTsKLQotCQljdHJsX3ZhcmlhYmlsaXR5ID0gRm9ybVVJLmNyZWF0ZUNvbWJvKHRvb2xraXQsIGdlbmVyYWxDb21wb3NpdGUsIDIpOwotCQl7Ci0JCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5CRUdJTk5JTkcpOwotCQkJZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAxOwotCQkJY3RybF92YXJpYWJpbGl0eS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJfQotCi0JCXZpZXdlcl92YXJpYWJpbGl0eSA9IG5ldyBDb21ib1ZpZXdlcihjdHJsX3ZhcmlhYmlsaXR5KTsKLQkJdmlld2VyX3ZhcmlhYmlsaXR5LmdldENvbWJvKCkuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoMSkpOwotCQl2aWV3ZXJfdmFyaWFiaWxpdHkuc2V0Q29udGVudFByb3ZpZGVyKHZhcmlhYmlsaXR5Q29udGVudFByb3ZpZGVyKTsKLQkJdmlld2VyX3ZhcmlhYmlsaXR5LnNldExhYmVsUHJvdmlkZXIodmFyaWFiaWxpdHlMYWJlbFByb3ZpZGVyKTsKLQkJdmlld2VyX3ZhcmlhYmlsaXR5LnNldElucHV0KGVsZW1lbnQpOwotCi0JCUxhYmVsIGJsYW5rTGFiZWwgPSBGb3JtVUkuY3JlYXRlTGFiZWwodG9vbGtpdCwgZ2VuZXJhbENvbXBvc2l0ZSwgIiIpOyAvLyROT04tTkxTLTEkCi0JCXsKLQkJCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkJFR0lOTklORyk7Ci0JCQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCQlibGFua0xhYmVsLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQl9Ci0KLQkJLy8gQmFzZSBlbGVtZW50cwotCQlGb3JtVUkuY3JlYXRlTGFiZWwodG9vbGtpdCwgZ2VuZXJhbENvbXBvc2l0ZSwKLQkJCQlBdXRob3JpbmdVSVRleHQuQkFTRV9FTEVNRU5UX1RFWFQpOwotCi0JCWJhc2VUZXh0ID0gRm9ybVVJLmNyZWF0ZVRleHQodG9vbGtpdCwgZ2VuZXJhbENvbXBvc2l0ZSk7Ci0JCXsKLQkJCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkJFR0lOTklORwotCQkJCQl8IEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCQlnZC5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCQliYXNlVGV4dC5zZXRMYXlvdXREYXRhKGdkKTsKLQkJfQotCQliYXNlVGV4dC5zZXRFbmFibGVkKGZhbHNlKTsKLQotCQkvLyBCdXR0b24gdG8gc2VsZWN0Ci0JCXNlbGVjdEJ1dHRvbiA9IEZvcm1VSS5jcmVhdGVCdXR0b24odG9vbGtpdCwgZ2VuZXJhbENvbXBvc2l0ZSwKLQkJCQlBdXRob3JpbmdVSVRleHQuU0VMRUNUX0JVVFRPTl9URVhUKTsKLQl9Ci0JCi0JcHJpdmF0ZSBMaXN0PEFic3RyYWN0RGlhZ3JhbUVkaXRvcj4gZ2V0RGlydHlEaWFncmFtRWRpdG9ycygpIHsKLQkJSVdvcmtiZW5jaFBhZ2Ugd29ya2JlbmNoUGFnZSA9IEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKQotCQkJCS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRBY3RpdmVQYWdlKCk7Ci0JCUlFZGl0b3JSZWZlcmVuY2VbXSBlZGl0b3JSZWZlcmVuY2VzID0gd29ya2JlbmNoUGFnZQotCQkJCS5nZXRFZGl0b3JSZWZlcmVuY2VzKCk7Ci0JCW9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzcyBwcm9jZXNzID0gVG5nVXRpbC5nZXRPd25pbmdQcm9jZXNzKGVsZW1lbnQpOyAKLQkJQXJyYXlMaXN0PEFic3RyYWN0RGlhZ3JhbUVkaXRvcj4gZGlydHlFZGl0b3JzID0gbmV3IEFycmF5TGlzdDxBYnN0cmFjdERpYWdyYW1FZGl0b3I+KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZWRpdG9yUmVmZXJlbmNlcy5sZW5ndGg7IGkrKykgewotCQkJSUVkaXRvclJlZmVyZW5jZSByZWZlcmVuY2UgPSBlZGl0b3JSZWZlcmVuY2VzW2ldOwotCQkJSUVkaXRvclBhcnQgZWRpdG9yID0gcmVmZXJlbmNlLmdldEVkaXRvcih0cnVlKTsKLQkJCWlmIChlZGl0b3IgaW5zdGFuY2VvZiBBYnN0cmFjdERpYWdyYW1FZGl0b3IgJiYgZWRpdG9yLmlzRGlydHkoKSkgewotCQkJCUlFZGl0b3JJbnB1dCBpbnB1dCA9IGVkaXRvci5nZXRFZGl0b3JJbnB1dCgpOwotCQkJCWlmIChpbnB1dCBpbnN0YW5jZW9mIERpYWdyYW1FZGl0b3JJbnB1dFByb3h5KSB7Ci0JCQkJCURpYWdyYW1FZGl0b3JJbnB1dCBkaWFncmFtSW5wdXQgPSAoKERpYWdyYW1FZGl0b3JJbnB1dFByb3h5KSBpbnB1dCkuZ2V0RGlhZ3JhbUVkaXRvcklucHV0KCk7Ci0JCQkJCWlmIChkaWFncmFtSW5wdXQgIT0gbnVsbCkgewotCQkJCQkJTWV0aG9kRWxlbWVudCBlbGVtZW50ID0gZGlhZ3JhbUlucHV0LmdldE1ldGhvZEVsZW1lbnQoKTsKLQkJCQkJCWlmKGVsZW1lbnQgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50ICYmIHByb2Nlc3MgPT0gVG5nVXRpbC5nZXRPd25pbmdQcm9jZXNzKChCcmVha2Rvd25FbGVtZW50KWVsZW1lbnQpKSB7Ci0JCQkJCQkJZGlydHlFZGl0b3JzLmFkZCgoQWJzdHJhY3REaWFncmFtRWRpdG9yKSBlZGl0b3IpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBkaXJ0eUVkaXRvcnM7Ci0JfQotCi0JLyoqCi0JICogYWRkIGxpc3RlbmVycwotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZExpc3RlbmVycygpIHsKLQkJc3VwZXIuYWRkTGlzdGVuZXJzKCk7Ci0JCWN0cmxfdHlwZV9idXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJZmluYWwgUHJvY2Vzc0VkaXRvciBlZGl0b3IgPSAoUHJvY2Vzc0VkaXRvcikgZ2V0RWRpdG9yKCk7Ci0JCQkJLy8gYWxsb3cgY2hhbmdpbmcgdHlwZSBvbmx5IGlmIHRoZSBwcm9jZXNzIGVkaXRvciBhbmQgYWxsIG9mIGl0cyBkaWFncmFtIGVkaXRvcnMgYXJlIG5vdCBkaXJ0eQotCQkJCS8vCi0JCQkJaWYgKGVkaXRvci5pc0RpcnR5KCkgfHwgIWdldERpcnR5RGlhZ3JhbUVkaXRvcnMoKS5pc0VtcHR5KCkpIHsKLQkJCQkJU3RyaW5nIHRpdGxlID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuY2hhbmdlQWN0aXZpdHlUeXBlV2FybmluZ0RpYWxvZ190aXRsZTsgCi0JCQkJCVN0cmluZyBtZXNzYWdlID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZGVzY3JpcHRpb25UYWJHdWlkYW5jZVdhcm5pbmdEaWFsb2dfbWVzc2FnZTE7IAotCQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkKLQkJCQkJCQkuZGlzcGxheVdhcm5pbmcodGl0bGUsIG1lc3NhZ2UpOwotCQkJCX0gZWxzZSAgewotCQkJCQluYW1lVGV4dC5yZW1vdmVMaXN0ZW5lcihTV1QuRGVhY3RpdmF0ZSwKLQkJCQkJCQluYW1lRGVhY3RpdmF0ZUxpc3RlbmVyKTsKLQkJCQkJcHJlc2VudGF0aW9uTmFtZVRleHQucmVtb3ZlTGlzdGVuZXIoU1dULkRlYWN0aXZhdGUsCi0JCQkJCQkJcHJlc2VudGF0aW9uTmFtZURlYWN0aXZhdGVMaXN0ZW5lcik7Ci0KLQkJCQkJQWN0aXZpdHkgbmV3QWN0aXZpdHkgPSBDb252ZXJ0QWN0aXZpdHlEaWFsb2cKLQkJCQkJLnF1ZXJ5VXNlckFuZENvbnZlcnQoKEFjdGl2aXR5KSBlbGVtZW50LCBudWxsLCBudWxsKTsKLQkJCQkJCi0JCQkJCWlmIChuZXdBY3Rpdml0eSAhPSBudWxsKSB7Ci0JCQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWwgPSBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbigKLQkJCQkJCQkJbmV3QWN0aXZpdHkpOwotCQkJCQkJLy8gZGVhbCB3aXRoIHByb3BlcnR5IHNoZWV0IGRpcmVjdGx5LgotCQkJCQkJZ2V0UHJvcGVydHlTaGVldFBhZ2UoKS5zZWxlY3Rpb25DaGFuZ2VkKGdldFBhcnQoKSwKLQkJCQkJCQkJc2VsKTsKLQkJCQkJCS8vIGdldEVkaXRvcigpLnNldFNlbGVjdGlvbihzZWwpOwotCQkJCQkJcmVmcmVzaCgpOwotCQkJCQkJKChQcm9jZXNzVmlld2VyKSAoKFByb2Nlc3NCcmVha2Rvd25TdHJ1Y3R1cmVGb3JtUGFnZSkgZ2V0RWRpdG9yKCkKLQkJCQkJCQkJLmdldEFjdGl2ZVBhZ2VJbnN0YW5jZSgpKS5nZXRWaWV3ZXIoKSkKLQkJCQkJCQkJLmV4cGFuZFRvTGV2ZWwobmV3QWN0aXZpdHksIDMpOwotCQkJCQl9Ci0JCQkJCW5hbWVUZXh0LmFkZExpc3RlbmVyKFNXVC5EZWFjdGl2YXRlLAotCQkJCQkJCW5hbWVEZWFjdGl2YXRlTGlzdGVuZXIpOwotCQkJCQlwcmVzZW50YXRpb25OYW1lVGV4dC5hZGRMaXN0ZW5lcihTV1QuRGVhY3RpdmF0ZSwKLQkJCQkJCQlwcmVzZW50YXRpb25OYW1lRGVhY3RpdmF0ZUxpc3RlbmVyKTsKLQotCQkJCQlEaXNwbGF5LmdldEN1cnJlbnQoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCi0JCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJLy8gcmVmcmVzaCBhbnkgZGlydHkgZGlhZ3JhbSBlZGl0b3IgYW5kIGNsZWFyIHRoZSBkaXJ0eSBmbGFnCi0JCQkJCQkJLy8KLQkJCQkJCQlMaXN0PEFic3RyYWN0RGlhZ3JhbUVkaXRvcj4gZGlydHlEaWFncmFtRWRpdG9ycyA9IGdldERpcnR5RGlhZ3JhbUVkaXRvcnMoKTsKLQkJCQkJCQlmb3IgKEFic3RyYWN0RGlhZ3JhbUVkaXRvciBkaWFncmFtRWRpdG9yIDogZGlydHlEaWFncmFtRWRpdG9ycykgewotCQkJCQkJCQlkaWFncmFtRWRpdG9yLnJlZnJlc2goKTsKLQkJCQkJCQkJSURvY3VtZW50UHJvdmlkZXIgZG9jUHJvdmlkZXIgPSBkaWFncmFtRWRpdG9yLmdldERvY3VtZW50UHJvdmlkZXIoKTsKLQkJCQkJCQkJaWYoZG9jUHJvdmlkZXIgaW5zdGFuY2VvZiBTaGFyZWRSZXNvdXJjZURpYWdyYW1Eb2N1bWVudFByb3ZpZGVyKSB7Ci0JCQkJCQkJCQkoKFNoYXJlZFJlc291cmNlRGlhZ3JhbURvY3VtZW50UHJvdmlkZXIpZG9jUHJvdmlkZXIpLm1hcmtEb2N1bWVudEFzU2F2ZWQoKElGaWxlRWRpdG9ySW5wdXQpIGRpYWdyYW1FZGl0b3IuZ2V0RWRpdG9ySW5wdXQoKSk7Ci0JCQkJCQkJCX0JCQkKLQkJCQkJCQl9CQkJCQkJCQotCQkJCQkJfQotCQkJCQkJCi0JCQkJCX0pOwotCQkJCX0KLQkJCX0KLQotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCX0KLQkJfSk7Ci0KLQkJY3RybF92YXJpYWJpbGl0eS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB2aWV3ZXJfdmFyaWFiaWxpdHkKLQkJCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQotCQkJCVZhcmlhYmlsaXR5RWxlbWVudCB2ZSA9IGVsZW1lbnQuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpOwotCQkJCVZhcmlhYmlsaXR5VHlwZSB0eXBlID0gKFZhcmlhYmlsaXR5VHlwZSkgc2VsZWN0aW9uCi0JCQkJCQkuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0KLQkJCQlpZiAodmUgIT0gbnVsbCAmIHZlIGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLS8vCQkJCQlpZih0eXBlLmVxdWFscyhWYXJpYWJpbGl0eVR5cGUuUkVQTEFDRVNfTElURVJBTCkKLS8vCQkJCQkJCSYmIHZlIGluc3RhbmNlb2YgUHJvY2Vzcyl7Ci0vLwkJCQkJCU9iamVjdFtdIGFyZ3MgPSB7IGVsZW1lbnQuZ2V0TmFtZSgpIH07Ci0vLwkJCQkJCVN0cmluZyBtZXNzYWdlID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMKLS8vCQkJCQkJLmJpbmQoCi0vLwkJCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuYWN0aXZpdHlfdmFyaWFiaWxpdHlfZXJyb3JfbXNnMSwKLS8vCQkJCQkJCQlhcmdzKTsKLS8vCi0vLwkJCQkJCVN0cmluZyB0aXRsZSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmFjdGl2aXR5X3ZhcmlhYmlsaXR5X2Vycm9yX3RpdGxlOwotLy8JCQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkKLS8vCQkJCQkJCS5kaXNwbGF5RXJyb3IodGl0bGUsIG1lc3NhZ2UsICIiKTsgLy8kTk9OLU5MUy0xJAotLy8JCQkJCQlWYXJpYWJpbGl0eVR5cGUgdnR5cGUgPSBlbGVtZW50LmdldFZhcmlhYmlsaXR5VHlwZSgpOwotLy8JCQkJCQlpZih2dHlwZSAhPSBudWxsKXsKLS8vCQkJCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbCA9IG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKHZ0eXBlKTsKLS8vCQkJCQkJCXZpZXdlcl92YXJpYWJpbGl0eS5zZXRTZWxlY3Rpb24oc2VsKTsKLS8vCQkJCQkJfQotLy8JCQkJCQlyZXR1cm47Ci0vLwkJCQkJfQotLy8JCQkJCWlmIChQcm9jZXNzVXRpbC5oYXNDb250cmlidXRvck9yUmVwbGFjZXIoKEFjdGl2aXR5KSB2ZSkKLS8vCQkJCQkJCSYmIHR5cGUuZXF1YWxzKFZhcmlhYmlsaXR5VHlwZS5FWFRFTkRTX0xJVEVSQUwpKSB7Ci0vLwkJCQkJCU9iamVjdFtdIGFyZ3MgPSB7IGVsZW1lbnQuZ2V0TmFtZSgpLAotLy8JCQkJCQkJCSgoQWN0aXZpdHkpIHZlKS5nZXROYW1lKCkgfTsKLS8vCQkJCQkJU3RyaW5nIG1lc3NhZ2UgPSBBdXRob3JpbmdVSVJlc291cmNlcwotLy8JCQkJCQkJCS5iaW5kKAotLy8JCQkJCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuYWN0aXZpdHlfdmFyaWFiaWxpdHlfZXJyb3JfbXNnLAotLy8JCQkJCQkJCQkJYXJncyk7Ci0vLwotLy8JCQkJCQlTdHJpbmcgdGl0bGUgPSBBdXRob3JpbmdVSVJlc291cmNlcy5hY3Rpdml0eV92YXJpYWJpbGl0eV9lcnJvcl90aXRsZTsKLS8vCQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpCi0vLwkJCQkJCQkJLmRpc3BsYXlFcnJvcih0aXRsZSwgbWVzc2FnZSwgIiIpOyAvLyROT04tTkxTLTEkCi0vLwotLy8JCQkJCQlWYXJpYWJpbGl0eVR5cGUgdmFyaWFiaWxpdHlUeXBlID0gZWxlbWVudAotLy8JCQkJCQkJCS5nZXRWYXJpYWJpbGl0eVR5cGUoKTsKLS8vCQkJCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gbmV3VmFyaWFiaWxpdHlTZWxlY3Rpb24gPSBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbigKLS8vCQkJCQkJCQl2YXJpYWJpbGl0eVR5cGUpOwotLy8JCQkJCQl2aWV3ZXJfdmFyaWFiaWxpdHkuc2V0U2VsZWN0aW9uKAotLy8JCQkJCQkJCW5ld1ZhcmlhYmlsaXR5U2VsZWN0aW9uLCB0cnVlKTsKLS8vCi0vLwkJCQkJCXJldHVybjsKLS8vCQkJCQl9Ci0JCQkJCQotCQkJCQlpZih0eXBlICE9IFZhcmlhYmlsaXR5VHlwZS5OQSkgewotCQkJCQkJSVN0YXR1cyBzdGF0ZSA9IERlcGVuZGVuY3lDaGVja2VyLmNoZWNrQ2lyY3VsYXJEZXBlbmRlbmN5QWZ0ZXJGaWx0ZXJTZWxlY3Rpb24oZWxlbWVudCwgKEFjdGl2aXR5KSB2ZSwgdHlwZSk7Ci0JCQkJCQlpZighc3RhdGUuaXNPSygpKSB7Ci0JCQkJCQkJU3RyaW5nIHRpdGxlID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuYWN0aXZpdHlfdmFyaWFiaWxpdHlfZXJyb3JfdGl0bGU7Ci0JCQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpLmRpc3BsYXlFcnJvcih0aXRsZSwgc3RhdGUuZ2V0TWVzc2FnZSgpKTsKLQkJCQkJCQkKLQkJCQkJCQkvLyBzZXQgdmFyaWFiaWxpdHkgdG8gYmFjayB3aGF0ZXZlciBpdCB3YXMgZm9yIFVJCi0JCQkJCQkJVmFyaWFiaWxpdHlUeXBlIHZhcmlhYmlsaXR5VHlwZSA9IGVsZW1lbnQuZ2V0VmFyaWFiaWxpdHlUeXBlKCk7Ci0JCQkJCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gbmV3VmFyaWFiaWxpdHlTZWxlY3Rpb24gPSBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbigKLQkJCQkJCQkJCXZhcmlhYmlsaXR5VHlwZSk7Ci0JCQkJCQkJdmlld2VyX3ZhcmlhYmlsaXR5LnNldFNlbGVjdGlvbihuZXdWYXJpYWJpbGl0eVNlbGVjdGlvbiwgdHJ1ZSk7Ci0JCQkJCQkJcmV0dXJuOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWJvb2xlYW4gc3RhdHVzID0gYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlNFVCwKLQkJCQkJCQllbGVtZW50LCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJLmdldFZhcmlhYmlsaXR5RWxlbWVudF9WYXJpYWJpbGl0eVR5cGUoKSwKLQkJCQkJCQl0eXBlLCAtMSk7Ci0JCQkJCWlmICghc3RhdHVzKSB7Ci0JCQkJCQlpZiAoZWxlbWVudC5nZXRQcmVzZW50YXRpb25OYW1lKCkgPT0gbnVsbAotCQkJCQkJCQl8fCBlbGVtZW50LmdldFByZXNlbnRhdGlvbk5hbWUoKS5lcXVhbHMoIiIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQlpZiAodHlwZS5lcXVhbHMoVmFyaWFiaWxpdHlUeXBlLk5BKSkKLQkJCQkJCQkJZWxlbWVudC5zZXRQcmVzZW50YXRpb25OYW1lKGVsZW1lbnQuZ2V0TmFtZSgpKTsKLQkJCQkJCX0KLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCQlpZiAoZWxlbWVudC5nZXRQcmVzZW50YXRpb25OYW1lKCkgPT0gbnVsbAotCQkJCQkJCXx8IGVsZW1lbnQuZ2V0UHJlc2VudGF0aW9uTmFtZSgpLmVxdWFscygiIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQkJaWYgKHR5cGUuZXF1YWxzKFZhcmlhYmlsaXR5VHlwZS5DT05UUklCVVRFUykKLQkJCQkJCQkJfHwgdHlwZS5lcXVhbHMoVmFyaWFiaWxpdHlUeXBlLlJFUExBQ0VTKQotCQkJCQkJCQl8fCB0eXBlLmVxdWFscyhWYXJpYWJpbGl0eVR5cGUuTkEpKQotCQkJCQkJCWVsZW1lbnQuc2V0UHJlc2VudGF0aW9uTmFtZShlbGVtZW50LmdldE5hbWUoKSk7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQlpZiAodHlwZSA9PSBWYXJpYWJpbGl0eVR5cGUuTkEpIHsKLQkJCQkJaWYgKHZlICE9IG51bGwpIHsKLQkJCQkJCWJvb2xlYW4gc3RhdHVzID0gYWN0aW9uTWdyCi0JCQkJCQkJCS5kb0FjdGlvbigKLQkJCQkJCQkJCQlJQWN0aW9uTWFuYWdlci5TRVQsCi0JCQkJCQkJCQkJZWxlbWVudCwKLQkJCQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJCQkJLmdldFZhcmlhYmlsaXR5RWxlbWVudF9WYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCksCi0JCQkJCQkJCQkJbnVsbCwgLTEpOwotCi0JCQkJCQlpZiAoIXN0YXR1cykgewotCQkJCQkJCXJldHVybjsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlzZWxlY3RCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJCWJhc2VUZXh0LnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0JCQkJfSBlbHNlIHsKLQkJCQkJTGlzdCBzZWxlY3Rpb25CYXNlTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJVmFyaWFiaWxpdHlFbGVtZW50IGJhc2UgPSBlbGVtZW50Ci0JCQkJCQkJLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsKLQkJCQkJc2VsZWN0aW9uQmFzZUxpc3QuYWRkKGJhc2UpOwotCQkJCQlzZWxlY3RCdXR0b24uc2V0RW5hYmxlZCh0cnVlKTsKLQotCQkJCX0KLQkJCQkvLyBzZXRGb3JtVGV4dFdpdGhWYXJpYWJsZUluZm8oKTsKLQkJCX0KLQkJfSk7Ci0KLQkJc2VsZWN0QnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gZ2V0Q29uZmlndXJhdGlvbigpOwotCQkJCVN0cmluZyB0YWJOYW1lID0gRmlsdGVyQ29uc3RhbnRzLkFDVElWSVRJRVM7Ci0KLQkJCQlWYXJpYWJpbGl0eVR5cGUgdHlwZSA9IChWYXJpYWJpbGl0eVR5cGUpICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHZpZXdlcl92YXJpYWJpbGl0eQotCQkJCQkJLmdldFNlbGVjdGlvbigpKS5nZXRGaXJzdEVsZW1lbnQoKTsKLQotCQkJCUlGaWx0ZXIgZmlsdGVyID0gbmV3IEFjdGl2aXR5VmFyaWFiaWxpdHlGaWx0ZXIoY29uZmlnLCBudWxsLAotCQkJCQkJdGFiTmFtZSwgZWxlbWVudCk7Ci0KLQkJCQlJdGVtc0ZpbHRlckRpYWxvZyBmZCA9IG5ldyBJdGVtc0ZpbHRlckRpYWxvZyhQbGF0Zm9ybVVJCi0JCQkJCQkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0U2hlbGwoKSwKLQkJCQkJCWZpbHRlciwgdGFiTmFtZSwgbnVsbCwgY29uZmlnKTsKLQkJCQlmZC5zZXRCbG9ja09uT3Blbih0cnVlKTsKLQkJCQlmZC5zZXRWaWV3ZXJTZWxlY3Rpb25TaW5nbGUodHJ1ZSk7Ci0JCQkJZmQuc2V0VGl0bGUodGFiTmFtZSk7Ci0JCQkJZmQub3BlbigpOwotCi0JCQkJTGlzdCBzZWxlY3RlZEl0ZW1zID0gZmQuZ2V0U2VsZWN0ZWRJdGVtcygpOwotCi0JCQkJaWYgKHNlbGVjdGVkSXRlbXMgIT0gbnVsbCAmJiAhc2VsZWN0ZWRJdGVtcy5pc0VtcHR5KCkpIHsKLQkJCQkJT2JqZWN0IG8gPSBzZWxlY3RlZEl0ZW1zLmdldCgwKTsKLQkJCQkJaWYgKG8gaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotLy8JCQkJCQlBY3Rpdml0eSBhY3QgPSAoQWN0aXZpdHkpIG87Ci0vLwkJCQkJCWlmIChpc0RpcmVjdFBhcmVudChhY3QpCi0vLwkJCQkJCQkJfHwgKChhY3QgaW5zdGFuY2VvZiBQcm9jZXNzKSAmJiB0eXBlLmVxdWFscyhWYXJpYWJpbGl0eVR5cGUuUkVQTEFDRVNfTElURVJBTCkKLS8vCQkJCQkJCQkJCSYmICEoZWxlbWVudCBpbnN0YW5jZW9mIFByb2Nlc3MpKSkgCi0vLwkJCQkJCXsKLS8vCQkJCQkJCU9iamVjdFtdIGFyZ3MgPSB7IGVsZW1lbnQuZ2V0TmFtZSgpIH07Ci0vLwkJCQkJCQlTdHJpbmcgbWVzc2FnZSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzCi0vLwkJCQkJCQkJCS5iaW5kKAotLy8JCQkJCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLmFjdGl2aXR5X3ZhcmlhYmlsaXR5X2Vycm9yX21zZzEsCi0vLwkJCQkJCQkJCQkJYXJncyk7Ci0vLwotLy8JCQkJCQkJU3RyaW5nIHRpdGxlID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuYWN0aXZpdHlfdmFyaWFiaWxpdHlfZXJyb3JfdGl0bGU7Ci0vLwkJCQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkKLS8vCQkJCQkJCQkJLmRpc3BsYXlFcnJvcih0aXRsZSwgbWVzc2FnZSwgIiIpOyAvLyROT04tTkxTLTEkCi0vLwotLy8JCQkJCQkJcmV0dXJuOwotLy8JCQkJCQl9Ci0vLwkJCQkJCWlmIChpc0NpcmN1bGFyRGVwZW5kZW5jeShhY3QpKSB7Ci0vLwkJCQkJCQlPYmplY3RbXSBhcmdzID0geyBlbGVtZW50LmdldE5hbWUoKSwgYWN0LmdldE5hbWUoKSB9OwotLy8JCQkJCQkJU3RyaW5nIG1lc3NhZ2UgPSBBdXRob3JpbmdVSVJlc291cmNlcwotLy8JCQkJCQkJCQkuYmluZCgKLS8vCQkJCQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5hY3Rpdml0eV92YXJpYWJpbGl0eV9lcnJvcl9tc2cyLAotLy8JCQkJCQkJCQkJCWFyZ3MpOwotLy8KLS8vCQkJCQkJCVN0cmluZyB0aXRsZSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmFjdGl2aXR5X3ZhcmlhYmlsaXR5X2Vycm9yX3RpdGxlOwotLy8JCQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpCi0vLwkJCQkJCQkJCS5kaXNwbGF5RXJyb3IodGl0bGUsIG1lc3NhZ2UsICIiKTsgLy8kTk9OLU5MUy0xJAotLy8KLS8vCQkJCQkJCXJldHVybjsKLS8vCQkJCQkJfQotLy8JCQkJCQkvLyBibG9jayBmb3IgY2hpbGRyZW4KLS8vCQkJCQkJaWYgKFByb2Nlc3NVdGlsLmhhc0NvbnRyaWJ1dG9yT3JSZXBsYWNlcihhY3QpCi0vLwkJCQkJCQkJJiYgdHlwZS5lcXVhbHMoVmFyaWFiaWxpdHlUeXBlLkVYVEVORFNfTElURVJBTCkpIHsKLS8vCQkJCQkJCU9iamVjdFtdIGFyZ3MgPSB7IGVsZW1lbnQuZ2V0TmFtZSgpLCBhY3QuZ2V0TmFtZSgpIH07Ci0vLwkJCQkJCQlTdHJpbmcgbWVzc2FnZSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzCi0vLwkJCQkJCQkJCS5iaW5kKAotLy8JCQkJCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLmFjdGl2aXR5X3ZhcmlhYmlsaXR5X2Vycm9yX21zZywKLS8vCQkJCQkJCQkJCQlhcmdzKTsKLS8vCi0vLwkJCQkJCQlTdHJpbmcgdGl0bGUgPSBBdXRob3JpbmdVSVJlc291cmNlcy5hY3Rpdml0eV92YXJpYWJpbGl0eV9lcnJvcl90aXRsZTsKLS8vCQkJCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKQotLy8JCQkJCQkJCQkuZGlzcGxheUVycm9yKHRpdGxlLCBtZXNzYWdlLCAiIik7IC8vJE5PTi1OTFMtMSQKLS8vCi0vLwkJCQkJCQlyZXR1cm47Ci0vLwkJCQkJCX0KLQkJCQkJCQotCQkJCQkJSVN0YXR1cyBzdGF0dXMgPSBEZXBlbmRlbmN5Q2hlY2tlci5jaGVja0NpcmN1bGFyRGVwZW5kZW5jeUFmdGVyRmlsdGVyU2VsZWN0aW9uKGVsZW1lbnQsIChBY3Rpdml0eSkgbywgdHlwZSk7Ci0JCQkJCQlpZighc3RhdHVzLmlzT0soKSkgewotCQkJCQkJCVN0cmluZyB0aXRsZSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmFjdGl2aXR5X3ZhcmlhYmlsaXR5X2Vycm9yX3RpdGxlOwotCQkJCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKS5kaXNwbGF5RXJyb3IodGl0bGUsIHN0YXR1cy5nZXRNZXNzYWdlKCkpOwkJCQkJCQotCQkJCQkJCXJldHVybjsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlpZiAobyBpbnN0YW5jZW9mIFZhcmlhYmlsaXR5RWxlbWVudCkgewotCQkJCQkJVmFyaWFiaWxpdHlFbGVtZW50IHZlID0gKFZhcmlhYmlsaXR5RWxlbWVudCkgbzsKLQotCQkJCQkJSUNvbmZpZ3VyYXRvciBjb25maWd1cmF0b3IgPSBuZXcgUHJvY2Vzc1ZhcmlhYmlsaXR5Q29uZmlndXJhdG9yKAotCQkJCQkJCQlnZXREZWZhdWx0Q29uZmlndXJhdGlvbigpKTsKLQkJCQkJCUFjdGl2aXR5VmFyaWFiaWxpdHlDb21tYW5kIGNtZCA9IG5ldyBBY3Rpdml0eVZhcmlhYmlsaXR5Q29tbWFuZCgKLQkJCQkJCQkJZWxlbWVudCwgdmUsIHR5cGUsIGNvbmZpZ3VyYXRvcik7Ci0JCQkJCQlib29sZWFuIHN0YXR1cyA9IGFjdGlvbk1nci5leGVjdXRlKGNtZCk7Ci0KLQkJCQkJCWlmICghc3RhdHVzKSB7Ci0JCQkJCQkJcmV0dXJuOwotCQkJCQkJfQotCi0JCQkJCQliYXNlVGV4dC5zZXRUZXh0KFRuZ1V0aWwuZ2V0TGFiZWxXaXRoUGF0aCh2ZSkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9KTsKLQotCX0KLQotCS8qKgotCSAqIEdldCBtb2RlbCBpbmZvcm1hdGlvbiBmb3IgdGhlIGFjdGl2aXR5Ci0JICogQHJldHVybgotCSAqIAkJCW1vZGVsIGluZm8gc3RyaW5nCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0TW9kZWxJbmZvKCkgewotCQlTdHJpbmcgaW5mbyA9IG51bGw7Ci0KLQkJdHJ5IHsKLQkJCU9iamVjdCBvID0gZ2V0QWRhcHRlcigpOwotCQkJaWYgKG8gaW5zdGFuY2VvZiBJQlNJdGVtUHJvdmlkZXIpIHsKLQkJCQlJQlNJdGVtUHJvdmlkZXIgYWRhcHRlciA9IChJQlNJdGVtUHJvdmlkZXIpIG87Ci0JCQkJaW5mbyA9IGFkYXB0ZXIuZ2V0QXR0cmlidXRlKGVsZW1lbnQsCi0JCQkJCQlJQlNJdGVtUHJvdmlkZXIuQ09MX01PREVMX0lORk8pOwotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLy8gcHJpbnQgZXhjZXB0aW9uCi0JCX0KLQkJaWYgKCEoU3RyVXRpbC5pc0JsYW5rKGluZm8pKSkKLQkJCXJldHVybiBpbmZvOwotCQllbHNlCi0JCQlyZXR1cm4gUHJvcGVydGllc1Jlc291cmNlcy5Qcm9jZXNzX05vbmU7Ci0JfQotCi0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5Xb3JrQnJlYWtkb3duRWxlbWVudEdlbmVyYWxTZWN0aW9uI3VwZGF0ZUNvbnRyb2xzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVDb250cm9scygpIHsKLQkJc3VwZXIudXBkYXRlQ29udHJvbHMoKTsKLQotCQljdHJsX3R5cGVfYnV0dG9uLnNldEVuYWJsZWQoZWRpdGFibGUpOwotCQljdHJsX3ZhcmlhYmlsaXR5LnNldEVuYWJsZWQoZWRpdGFibGUpOwotCQlzZWxlY3RCdXR0b24uc2V0RW5hYmxlZChlZGl0YWJsZSk7Ci0KLQkJY3RybF92YXJpYWJpbGl0eS5zZXRFbmFibGVkKGVkaXRhYmxlKTsKLQkJaWYgKCgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHZpZXdlcl92YXJpYWJpbGl0eS5nZXRTZWxlY3Rpb24oKSkKLQkJCQkuZ2V0Rmlyc3RFbGVtZW50KCkgPT0gVmFyaWFiaWxpdHlUeXBlLk5BKSB7Ci0JCQlzZWxlY3RCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCX0KLQl9Ci0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLldvcmtCcmVha2Rvd25FbGVtZW50R2VuZXJhbFNlY3Rpb24jcmVmcmVzaCgpCi0JICovCi0JcHVibGljIHZvaWQgcmVmcmVzaCgpIHsKLQkJdHJ5IHsKLQkJCWlmIChnZXRFbGVtZW50KCkgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCXN1cGVyLnJlZnJlc2goKTsKLQotCQkJCWVsZW1lbnQgPSAoQWN0aXZpdHkpIGdldEVsZW1lbnQoKTsKLQotCQkJCW1vZGVsSW5mb1RleHQuc2V0VGV4dChnZXRNb2RlbEluZm8oKSk7Ci0KLQkJCQljdHJsX3R5cGVfdGV4dC5zZXRUZXh0KFByb3BlcnRpZXNVdGlsLmdldFR5cGUoZWxlbWVudCkpOwotCi0JCQkJLy8gaGlkZS9zaG93IGNvbWJvCi0JCQkJaWYgKChlbGVtZW50IGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzKQotCQkJCQkJJiYgKGVsZW1lbnQuZ2V0U3VwZXJBY3Rpdml0aWVzKCkgPT0gbnVsbCB8fCBlbGVtZW50Ci0JCQkJCQkJCS5nZXRTdXBlckFjdGl2aXRpZXMoKSA9PSBudWxsKSkgewotCQkJCQlhY3Rpdml0eVR5cGVMYWJlbC5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJCQkJY3RybF90eXBlX3RleHQuc2V0VmlzaWJsZShmYWxzZSk7Ci0JCQkJCWN0cmxfdHlwZV9idXR0b24uc2V0VmlzaWJsZShmYWxzZSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJYWN0aXZpdHlUeXBlTGFiZWwuc2V0VmlzaWJsZSh0cnVlKTsKLQkJCQkJY3RybF90eXBlX3RleHQuc2V0VmlzaWJsZSh0cnVlKTsKLQkJCQkJY3RybF90eXBlX2J1dHRvbi5zZXRWaXNpYmxlKHRydWUpOwotCQkJCX0KLQotCQkJCVZhcmlhYmlsaXR5VHlwZSB2YXJpYWJpbGl0eVR5cGUgPSBlbGVtZW50LmdldFZhcmlhYmlsaXR5VHlwZSgpOwotCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIG5ld1ZhcmlhYmlsaXR5U2VsZWN0aW9uID0gbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oCi0JCQkJCQl2YXJpYWJpbGl0eVR5cGUpOwotCQkJCXZpZXdlcl92YXJpYWJpbGl0eS5zZXRTZWxlY3Rpb24obmV3VmFyaWFiaWxpdHlTZWxlY3Rpb24sIHRydWUpOwotCi0JCQkJaWYgKGVsZW1lbnQuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpICE9IG51bGwpCi0JCQkJCWJhc2VUZXh0LnNldFRleHQoVG5nVXRpbC5nZXRMYWJlbFdpdGhQYXRoKGVsZW1lbnQKLQkJCQkJCQkuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpKSk7Ci0JCQkJZWxzZQotCQkJCQliYXNlVGV4dC5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQotCQkJCS8vIG1ha2UgdmFyaWFiaWxpdHkgdHlwZSBjb21ibyBkaXNhYmxlZCBpbmNhc2UgdHlwZSBpcyBlaXRoZXIgbG9jYWwgY29udHJpYnV0ZXMgb3IgbG9jYWwgcmVwbGFjZXMuCi0JCQkJaWYgKHZhcmlhYmlsaXR5VHlwZQotCQkJCQkJLmVxdWFscyhWYXJpYWJpbGl0eVR5cGUuTE9DQUxfQ09OVFJJQlVUSU9OKQotCQkJCQkJfHwgKHZhcmlhYmlsaXR5VHlwZQotCQkJCQkJCQkuZXF1YWxzKFZhcmlhYmlsaXR5VHlwZS5MT0NBTF9SRVBMQUNFTUVOVCkpKSB7Ci0JCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKAotCQkJCQkJCVZhcmlhYmlsaXR5VHlwZS5OQSk7Ci0JCQkJCXZpZXdlcl92YXJpYWJpbGl0eS5zZXRTZWxlY3Rpb24oc2VsZWN0aW9uKTsKLQkJCQkJY3RybF92YXJpYWJpbGl0eS5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQl9IGVsc2UKLQkJCQkJY3RybF92YXJpYWJpbGl0eS5zZXRFbmFibGVkKGVkaXRhYmxlKTsKLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQlsb2dnZXIKLQkJCQkJLmxvZ0Vycm9yKAotCQkJCQkJCSJFcnJvciByZWZyZXNoaW5nIEFjdGl2aXR5IGdlbmVyYWwgc2VjdGlvbiA6ICIgKyBlbGVtZW50LCBleCk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLldvcmtCcmVha2Rvd25FbGVtZW50R2VuZXJhbFNlY3Rpb24jZ2V0TmFtZVByZWZpeCgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lUHJlZml4KCkgewotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIENhcGFiaWxpdHlQYXR0ZXJuKSB7Ci0JCQlyZXR1cm4gTGlicmFyeVVJVGV4dC5URVhUX0NBUEFCSUxJVFlfUEFUVEVSTiArICI6ICI7IC8vJE5PTi1OTFMtMSQKLQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgRGVsaXZlcnlQcm9jZXNzKSB7Ci0JCQlyZXR1cm4gTGlicmFyeVVJVGV4dC5URVhUX0RFTElWRVJZX1BST0NFU1MgKyAiOiAiOyAvLyROT04tTkxTLTEkCi0JCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFBoYXNlKSB7Ci0JCQlyZXR1cm4gTGlicmFyeVVJVGV4dC5URVhUX1BIQVNFICsgIjogIjsgLy8kTk9OLU5MUy0xJAotCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJdGVyYXRpb24pIHsKLQkJCXJldHVybiBMaWJyYXJ5VUlUZXh0LlRFWFRfSVRFUkFUSU9OICsgIjogIjsgLy8kTk9OLU5MUy0xJAotCQl9IGVsc2UKLQkJCXJldHVybiBMaWJyYXJ5VUlUZXh0LlRFWFRfQUNUSVZJVFkgKyAiOiAiOyAvLyROT04tTkxTLTEkCi0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvQWN0aXZpdHlHdWlkYW5jZVNlY3Rpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9BY3Rpdml0eUd1aWRhbmNlU2VjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNzI3NGJjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9BY3Rpdml0eUd1aWRhbmNlU2VjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTc3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZGlhbG9ncy5JdGVtc0ZpbHRlckRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZpbHRlcnMuUHJvY2Vzc0d1aWRhbmNlRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLnV0aWwuRGlhZ3JhbUluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSUFjdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb25maWd1cmF0aW9uLkd1aWRhbmNlR3JvdXBpbmdJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb25maWd1cmF0aW9uLkd1aWRhbmNlSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuRmlsdGVyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuRmlsdGVySW5pdGlhbGl6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLklCU0l0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZC5BZGRHdWlkYW5jZVRvQnJlYWtkb3duRWxlbWVudENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNoZWNrbGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbmNlcHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyeVByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5FeGFtcGxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3VpZGFuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HdWlkZWxpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5SZXVzYWJsZUFzc2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9hZG1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlN1cHBvcnRpbmdNYXRlcmlhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Gb2N1c0FkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Gb2N1c0V2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLkZvcm1Ub29sa2l0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuU2VjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5UYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZTsKLQotLyoqCi0gKiBUaGUgYWN0aXZpdHkgZ3VpZGFuY2Ugc2VjdGlvbi4gSXQgbGlzdCBhbGwgYXZhaWFibGUgZ3VpZGFuY2VzIG9mIGFuIGFjdGl2aXR5Ci0gKiAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4wCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXR5R3VpZGFuY2VTZWN0aW9uIGV4dGVuZHMgQWJzdHJhY3RTZWN0aW9uIHsKLQlwcm90ZWN0ZWQgSUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlciA9IG5ldyBBZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIoCi0JCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpOwotCi0JcHJpdmF0ZSBGb3JtVG9vbGtpdCB0b29sa2l0OwotCi0JcHJpdmF0ZSBCdXR0b24gY3RybF9hZGRfMSwgY3RybF9yZW1vdmVfMSwgY3RybF9hZGRfMiwgY3RybF9yZW1vdmVfMjsKLQotCXByaXZhdGUgQnV0dG9uIGN0cmxfYWRkXzMsIGN0cmxfcmVtb3ZlXzMsIGN0cmxfYWRkXzQsIGN0cmxfcmVtb3ZlXzQ7Ci0KLQlwcml2YXRlIFRhYmxlIGN0cmxfdGFibGVfMSwgY3RybF90YWJsZV8yLCBjdHJsX3RhYmxlXzMsIGN0cmxfdGFibGVfNDsKLQotCXByaXZhdGUgU2VjdGlvbiBjb21tdW5pY2F0aW9uTWF0ZXJpYWxTZWN0aW9uLCBlZHVjYXRpb25NYXRlcmlhbFNlY3Rpb247Ci0KLQlwcml2YXRlIFRhYmxlVmlld2VyIHZpZXdlcl8xLCB2aWV3ZXJfMiwgdmlld2VyXzMsIHZpZXdlcl80OwotCi0JLy8gZWxlbWVudAotCXByaXZhdGUgQWN0aXZpdHkgZWxlbWVudDsKLQotCS8vIGFjdGlvbiBtYW5hZ2VyCi0JcHJpdmF0ZSBJQWN0aW9uTWFuYWdlciBhY3Rpb25NZ3I7Ci0KLQlwdWJsaWMgZmluYWwgU3RyaW5nIHRhYk5hbWUgPSBGaWx0ZXJDb25zdGFudHMuR1VJREFOQ0U7Ci0KLQlwcml2YXRlIElGaWx0ZXIgcm9hZE1hcEZpbHRlciA9IG51bGw7Ci0KLQlwcml2YXRlIElGaWx0ZXIgZ2VuZXJhbEd1aWRhbmNlRmlsdGVyID0gbnVsbDsKLQotCXByaXZhdGUgSUZpbHRlciBzdXBwb3J0aW5nTWF0ZXJpYWxGaWx0ZXIgPSBudWxsOwotCi0JLyoqCi0JICogR2V0IHJvYWQgbWFwIGd1aWRhbmNlIGZpbHRlcgotCSAqLwotCXB1YmxpYyBJRmlsdGVyIGdldFJvYWRNYXBGaWx0ZXIoKSB7Ci0JCWlmIChyb2FkTWFwRmlsdGVyID09IG51bGwpIHsKLQkJCXJvYWRNYXBGaWx0ZXIgPSBuZXcgUHJvY2Vzc0d1aWRhbmNlRmlsdGVyKGdldENvbmZpZ3VyYXRpb24oKSwgbnVsbCwKLQkJCQkJdGFiTmFtZSkgewotCQkJCXB1YmxpYyBib29sZWFuIGNoaWxkQWNjZXB0KE9iamVjdCBvYmopIHsKLQkJCQkJaWYgKG9iaiBpbnN0YW5jZW9mIEd1aWRhbmNlR3JvdXBpbmdJdGVtUHJvdmlkZXIpCi0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJaWYgKG9iaiBpbnN0YW5jZW9mIEd1aWRhbmNlSXRlbVByb3ZpZGVyKSB7Ci0JCQkJCQlTdHJpbmcgbmFtZSA9ICgoR3VpZGFuY2VJdGVtUHJvdmlkZXIpIG9iaikuZ2V0VGV4dChvYmopOwotCQkJCQkJaWYgKG5hbWUuZXF1YWxzSWdub3JlQ2FzZShMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkJCQkuZ2V0U3RyaW5nKCJfVUlfR3VpZGFuY2VzX1JvYWRtYXAiKSkgJiYgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkhKChHdWlkYW5jZUl0ZW1Qcm92aWRlcikgb2JqKS5nZXRDaGlsZHJlbihvYmopCi0JCQkJCQkJCQkJLmlzRW1wdHkoKSkKLQkJCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJCWVsc2UKLQkJCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCX0KLQkJCQkJaWYgKChvYmogaW5zdGFuY2VvZiBSb2FkbWFwKSkKLQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJfTsKLQkJfSBlbHNlIHsKLQkJCSgoUHJvY2Vzc0d1aWRhbmNlRmlsdGVyKSByb2FkTWFwRmlsdGVyKS5zZXRNZXRob2RDb25maWd1cmF0aW9uKGdldENvbmZpZ3VyYXRpb24oKSk7Ci0JCX0KLQotCQlyZXR1cm4gcm9hZE1hcEZpbHRlcjsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgR2VuZXJhbCBndWlkYW5jZSBmaWx0ZXIKLQkgKiAKLQkgKi8KLQlwdWJsaWMgSUZpbHRlciBnZXRHZW5lcmFsR3VpZGFuY2VGaWx0ZXIoKSB7Ci0JCWlmIChnZW5lcmFsR3VpZGFuY2VGaWx0ZXIgPT0gbnVsbCkgewotCQkJZ2VuZXJhbEd1aWRhbmNlRmlsdGVyID0gbmV3IFByb2Nlc3NHdWlkYW5jZUZpbHRlcigKLQkJCQkJZ2V0Q29uZmlndXJhdGlvbigpLCBudWxsLCB0YWJOYW1lKSB7Ci0JCQkJcHVibGljIGJvb2xlYW4gY2hpbGRBY2NlcHQoT2JqZWN0IG9iaikgewotCQkJCQlpZiAoc3VwZXIuY2hpbGRBY2NlcHQob2JqKSkKLQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQlpZiAob2JqIGluc3RhbmNlb2YgR3VpZGFuY2VJdGVtUHJvdmlkZXIpIHsKLQkJCQkJCWlmICgoKEd1aWRhbmNlSXRlbVByb3ZpZGVyKSBvYmopLmdldENoaWxkcmVuKG9iaikKLQkJCQkJCQkJLmlzRW1wdHkoKSkKLQkJCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCQllbHNlCi0JCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCX0KLQkJCQkJQ2xhc3MgY2xzID0gRmlsdGVySW5pdGlhbGl6ZXIuZ2V0SW5zdGFuY2UoKQotCQkJCQkJCS5nZXRDbGFzc0ZvclR5cGUoaGVscGVyLmdldEZpbHRlclR5cGVTdHIoKSk7Ci0JCQkJCWlmIChjbHMgIT0gbnVsbCkgewotCQkJCQkJaWYgKGNscy5pc0luc3RhbmNlKG9iaikpIHsKLQkJCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWlmICgob2JqIGluc3RhbmNlb2YgQ2hlY2tsaXN0KSB8fCAob2JqIGluc3RhbmNlb2YgQ29uY2VwdCkKLQkJCQkJCQl8fCAob2JqIGluc3RhbmNlb2YgRXhhbXBsZSkKLQkJCQkJCQl8fCAob2JqIGluc3RhbmNlb2YgR3VpZGVsaW5lKQotCQkJCQkJCXx8IChvYmogaW5zdGFuY2VvZiBSZXVzYWJsZUFzc2V0KQotCQkJCQkJCXx8IChvYmogaW5zdGFuY2VvZiBTdXBwb3J0aW5nTWF0ZXJpYWwpKQotCQkJCQkJcmV0dXJuIHRydWU7Ci0KLQkJCQkJcmV0dXJuIGZhbHNlOwotCi0JCQkJfQotCQkJfTsKLQkJfWVsc2UgewotCQkJKChQcm9jZXNzR3VpZGFuY2VGaWx0ZXIpIGdlbmVyYWxHdWlkYW5jZUZpbHRlcikuc2V0TWV0aG9kQ29uZmlndXJhdGlvbihnZXRDb25maWd1cmF0aW9uKCkpOwotCQl9Ci0JCXJldHVybiBnZW5lcmFsR3VpZGFuY2VGaWx0ZXI7Ci0JfQotCi0JLyoqCi0JICogR2V0IFN1cHBvcnRpbmcgbWF0ZXJpY2FsIGd1aWRhbmNlIGZpbHRlcgotCSAqIAotCSAqLwotCXB1YmxpYyBJRmlsdGVyIGdldFN1cHBvcnRpbmdNYXRlcmlhbEZpbHRlcigpIHsKLQkJaWYgKHN1cHBvcnRpbmdNYXRlcmlhbEZpbHRlciA9PSBudWxsKSB7Ci0JCQlzdXBwb3J0aW5nTWF0ZXJpYWxGaWx0ZXIgPSBuZXcgUHJvY2Vzc0d1aWRhbmNlRmlsdGVyKAotCQkJCQlnZXRDb25maWd1cmF0aW9uKCksIG51bGwsIHRhYk5hbWUpIHsKLQkJCQlwdWJsaWMgYm9vbGVhbiBjaGlsZEFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCQkJCWlmIChzdXBlci5jaGlsZEFjY2VwdChvYmopKQotCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCWlmICgob2JqIGluc3RhbmNlb2YgR3VpZGFuY2VJdGVtUHJvdmlkZXIpCi0JCQkJCQkJfHwgKG9iaiBpbnN0YW5jZW9mIFN1cHBvcnRpbmdNYXRlcmlhbCkpCi0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCX07Ci0JCX0gZWxzZSB7Ci0JCQkoKFByb2Nlc3NHdWlkYW5jZUZpbHRlcikgc3VwcG9ydGluZ01hdGVyaWFsRmlsdGVyKS5zZXRNZXRob2RDb25maWd1cmF0aW9uKGdldENvbmZpZ3VyYXRpb24oKSk7Ci0JCX0KLQkJcmV0dXJuIHN1cHBvcnRpbmdNYXRlcmlhbEZpbHRlcjsKLQl9Ci0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLkFic3RyYWN0U2VjdGlvbiNjcmVhdGVDb250cm9scyhvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUsIG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLlRhYmJlZFByb3BlcnR5U2hlZXRQYWdlKQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2xzKENvbXBvc2l0ZSBwYXJlbnQsCi0JCQlUYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZSB0YWJiZWRQcm9wZXJ0eVNoZWV0UGFnZSkgewotCi0JCXN1cGVyLmNyZWF0ZUNvbnRyb2xzKHBhcmVudCwgdGFiYmVkUHJvcGVydHlTaGVldFBhZ2UpOwotCQlpbml0KCk7Ci0KLQkJcGFyZW50LnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQkJcGFyZW50LnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCi0JCS8vIGNyZWF0ZSBndWlkYW5jZSBzZWN0aW9uCi0JCWNyZWF0ZUd1aWRhbmNlU2VjdGlvbihwYXJlbnQpOwotCi0JCS8vIGFkZCBsaXN0ZW5lcnMKLQkJYWRkTGlzdGVuZXJzKCk7Ci0KLQkJLy8gdXBkYXRlIGNvbnRyb2xzCi0JCXVwZGF0ZUNvbnRyb2xzKCk7Ci0KLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplCi0JICovCi0JcHJpdmF0ZSB2b2lkIGluaXQoKSB7Ci0JCS8vIGdldCBhY3Rpdml0eSBvYmplY3QKLQkJZWxlbWVudCA9IChBY3Rpdml0eSkgZ2V0RWxlbWVudCgpOwotCi0JCS8vIGdldCB0b29sa2l0Ci0JCXRvb2xraXQgPSBnZXRXaWRnZXRGYWN0b3J5KCk7Ci0KLQkJLy8gZ2V0IGFjdGlvbiBtYW5hZ2VyCi0JCWFjdGlvbk1nciA9IEVQRlByb3BlcnR5U2hlZXRQYWdlLmdldEFjdGlvbk1hbmFnZXIoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdG9nZ2xlU2VjdGlvbigpIHsKLQkJaWYgKCEoZWxlbWVudCBpbnN0YW5jZW9mIERlbGl2ZXJ5UHJvY2VzcykpIHsKLQkJCWlmIChjb21tdW5pY2F0aW9uTWF0ZXJpYWxTZWN0aW9uLmlzRXhwYW5kZWQoKSkKLQkJCQljb21tdW5pY2F0aW9uTWF0ZXJpYWxTZWN0aW9uLnNldEV4cGFuZGVkKGZhbHNlKTsKLQkJCWlmIChlZHVjYXRpb25NYXRlcmlhbFNlY3Rpb24uaXNFeHBhbmRlZCgpKQotCQkJCWVkdWNhdGlvbk1hdGVyaWFsU2VjdGlvbi5zZXRFeHBhbmRlZChmYWxzZSk7Ci0KLQkJCWlmIChjb21tdW5pY2F0aW9uTWF0ZXJpYWxTZWN0aW9uLmlzVmlzaWJsZSgpKQotCQkJCWNvbW11bmljYXRpb25NYXRlcmlhbFNlY3Rpb24uc2V0VmlzaWJsZShmYWxzZSk7Ci0JCQlpZiAoZWR1Y2F0aW9uTWF0ZXJpYWxTZWN0aW9uLmlzVmlzaWJsZSgpKQotCQkJCWVkdWNhdGlvbk1hdGVyaWFsU2VjdGlvbi5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJfSBlbHNlIHsKLQkJCWlmICghY29tbXVuaWNhdGlvbk1hdGVyaWFsU2VjdGlvbi5pc0V4cGFuZGVkKCkpCi0JCQkJY29tbXVuaWNhdGlvbk1hdGVyaWFsU2VjdGlvbi5zZXRFeHBhbmRlZCh0cnVlKTsKLQkJCWlmICghZWR1Y2F0aW9uTWF0ZXJpYWxTZWN0aW9uLmlzRXhwYW5kZWQoKSkKLQkJCQllZHVjYXRpb25NYXRlcmlhbFNlY3Rpb24uc2V0RXhwYW5kZWQodHJ1ZSk7Ci0KLQkJCWlmICghY29tbXVuaWNhdGlvbk1hdGVyaWFsU2VjdGlvbi5pc1Zpc2libGUoKSkKLQkJCQljb21tdW5pY2F0aW9uTWF0ZXJpYWxTZWN0aW9uLnNldFZpc2libGUodHJ1ZSk7Ci0JCQlpZiAoIWVkdWNhdGlvbk1hdGVyaWFsU2VjdGlvbi5pc1Zpc2libGUoKSkKLQkJCQllZHVjYXRpb25NYXRlcmlhbFNlY3Rpb24uc2V0VmlzaWJsZSh0cnVlKTsKLQkJfQotCi0JfQotCi0JLyoqCi0JICogIFVwZGF0ZSBjb250cm9scyBiYXNlZCBvbiBlZGl0YWJsZSBmbGFnLiBDb250cm9scyBjYW4gYmVjb21lIGVkaXRhYmxlIG9yIHVuLWVkaXRhYmxlCi0JICovCi0JcHVibGljIHZvaWQgdXBkYXRlQ29udHJvbHMoKSB7Ci0JCWN0cmxfYWRkXzEuc2V0RW5hYmxlZChlZGl0YWJsZSk7Ci0JCWN0cmxfYWRkXzIuc2V0RW5hYmxlZChlZGl0YWJsZSk7Ci0JCWN0cmxfYWRkXzMuc2V0RW5hYmxlZChlZGl0YWJsZSk7Ci0JCWN0cmxfYWRkXzQuc2V0RW5hYmxlZChlZGl0YWJsZSk7Ci0KLQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB2aWV3ZXJfMQotCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQkJaWYgKHNlbGVjdGlvbi5zaXplKCkgPiAwICYmIGVkaXRhYmxlKSB7Ci0JCQljdHJsX3JlbW92ZV8xLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCX0gZWxzZSB7Ci0JCQljdHJsX3JlbW92ZV8xLnNldEVuYWJsZWQoZmFsc2UpOwotCQl9Ci0KLQkJc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB2aWV3ZXJfMi5nZXRTZWxlY3Rpb24oKTsKLQkJaWYgKHNlbGVjdGlvbi5zaXplKCkgPiAwICYmIGVkaXRhYmxlKSB7Ci0JCQljdHJsX3JlbW92ZV8yLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCX0gZWxzZSB7Ci0JCQljdHJsX3JlbW92ZV8yLnNldEVuYWJsZWQoZmFsc2UpOwotCQl9Ci0KLQkJc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB2aWV3ZXJfMy5nZXRTZWxlY3Rpb24oKTsKLQkJaWYgKHNlbGVjdGlvbi5zaXplKCkgPiAwICYmIGVkaXRhYmxlKSB7Ci0JCQljdHJsX3JlbW92ZV8zLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCX0gZWxzZSB7Ci0JCQljdHJsX3JlbW92ZV8zLnNldEVuYWJsZWQoZmFsc2UpOwotCQl9Ci0KLQkJc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB2aWV3ZXJfNC5nZXRTZWxlY3Rpb24oKTsKLQkJaWYgKHNlbGVjdGlvbi5zaXplKCkgPiAwICYmIGVkaXRhYmxlKSB7Ci0JCQljdHJsX3JlbW92ZV80LnNldEVuYWJsZWQodHJ1ZSk7Ci0JCX0gZWxzZSB7Ci0JCQljdHJsX3JlbW92ZV80LnNldEVuYWJsZWQoZmFsc2UpOwotCQl9Ci0JfQotCi0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLkFic3RyYWN0UHJvcGVydHlTZWN0aW9uI3JlZnJlc2goKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlZnJlc2goKSB7Ci0JCXRyeSB7Ci0JCQlpZiAoZ2V0RWxlbWVudCgpIGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQllbGVtZW50ID0gKEFjdGl2aXR5KSBnZXRFbGVtZW50KCk7Ci0KLQkJCQl2aWV3ZXJfMS5yZWZyZXNoKCk7Ci0JCQkJdmlld2VyXzIucmVmcmVzaCgpOwotCQkJCXZpZXdlcl8zLnJlZnJlc2goKTsKLQkJCQl2aWV3ZXJfNC5yZWZyZXNoKCk7Ci0KLQkJCQkvLyBoaWRlL3Nob3cgY2VydGFpbiBzZWN0aW9ucy4KLQkJCQl0b2dnbGVTZWN0aW9uKCk7Ci0KLQkJCQkvLyBoaWRlL3Nob3cgY29udHJvbHMKLQkJCQl1cGRhdGVDb250cm9scygpOwotCQkJfQotCi0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJbG9nZ2VyLmxvZ0Vycm9yKCJFcnJvciByZWZyZXNoaW5nIGFjdGl2aXR5IGd1aWRhbmNlIHNlY3Rpb246ICIsIGV4KTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuQWJzdHJhY3RTZWN0aW9uI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQotCQlpZiAobGFiZWxQcm92aWRlciAhPSBudWxsKSB7Ci0JCQlsYWJlbFByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBndWlkYW5jZSBzZWN0aW9uIG9uIHRoZSBnaXZlbiBjb21wb3NpdGUKLQkgKiBAcGFyYW0gY29tcG9zaXRlCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUd1aWRhbmNlU2VjdGlvbihDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JCWludCB0YWJsZUhlaWdodCA9IDUwOwotCQlTdHJpbmcgc2VjdGlvblRpdGxlID0gbnVsbDsKLQkJU3RyaW5nIHNlY3Rpb25EZXNjID0gbnVsbDsKLQkJU3RyaW5nIHRhYmxlVGl0bGUgPSBudWxsOwotCQkvLyBMYWJlbCB0YWJsZUxhYmVsID0gbnVsbDsKLQotCQkvLyBST0FETUFQCi0JCXsKLQkJCXNlY3Rpb25UaXRsZSA9IFByb3BlcnRpZXNSZXNvdXJjZXMuQWN0aXZpdHlfUm9hZG1hcFRpdGxlOyAKLQkJCXNlY3Rpb25EZXNjID0gUHJvcGVydGllc1Jlc291cmNlcy5BY3Rpdml0eV9Sb2FkbWFwRGVzY3JpcHRpb247IAotCQkJdGFibGVUaXRsZSA9IFByb3BlcnRpZXNSZXNvdXJjZXMuQWN0aXZpdHlfU2VsZWN0ZWRfUm9hZG1hcDsgCi0KLQkJCVNlY3Rpb24gc2VjdGlvbiA9IEZvcm1VSS5jcmVhdGVTZWN0aW9uKHRvb2xraXQsIGNvbXBvc2l0ZSwKLQkJCQkJc2VjdGlvblRpdGxlLCBzZWN0aW9uRGVzYyk7Ci0KLQkJCS8vIGNyZWF0ZSBjb21wb3NpdGUKLQkJCUNvbXBvc2l0ZSBzZWN0aW9uQ29tcG9zaXRlID0gRm9ybVVJLmNyZWF0ZUNvbXBvc2l0ZSh0b29sa2l0LAotCQkJCQlzZWN0aW9uLCAyLCBmYWxzZSk7Ci0KLQkJCUNvbXBvc2l0ZSBwYW5lMSA9IEZvcm1VSS5jcmVhdGVDb21wb3NpdGUodG9vbGtpdCwgc2VjdGlvbkNvbXBvc2l0ZSwKLQkJCQkJR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJCUZvcm1VSS5jcmVhdGVMYWJlbCh0b29sa2l0LCBwYW5lMSwgdGFibGVUaXRsZSk7Ci0KLQkJCWN0cmxfdGFibGVfMSA9IEZvcm1VSS5jcmVhdGVUYWJsZSh0b29sa2l0LCBwYW5lMSwgdGFibGVIZWlnaHQpOwotCQkJdmlld2VyXzEgPSBuZXcgVGFibGVWaWV3ZXIoY3RybF90YWJsZV8xKTsKLQkJCUlTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyIGNvbnRlbnRQcm92aWRlciA9IG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcigKLQkJCQkJZ2V0QWRhcHRlckZhY3RvcnkoKSkgewotCQkJCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJCXJldHVybiBnZXRGaWx0ZXJlZExpc3QoZWxlbWVudC5nZXRSb2FkbWFwcygpKS50b0FycmF5KCk7Ci0JCQkJfQotCQkJfTsKLQotCQkJdmlld2VyXzEuc2V0Q29udGVudFByb3ZpZGVyKGNvbnRlbnRQcm92aWRlcik7Ci0JCQl2aWV3ZXJfMS5zZXRMYWJlbFByb3ZpZGVyKGxhYmVsUHJvdmlkZXIpOwotCQkJdmlld2VyXzEuc2V0SW5wdXQoZWxlbWVudCk7Ci0KLQkJCS8vIGNyZWF0ZSBidXR0b25zIGZvciB0YWJsZTEKLQkJCUNvbXBvc2l0ZSBwYW5lMiA9IEZvcm1VSS5jcmVhdGVDb21wb3NpdGUodG9vbGtpdCwgc2VjdGlvbkNvbXBvc2l0ZSwKLQkJCQkJR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQ0VOVEVSCi0JCQkJCQkJfCBHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0NFTlRFUik7Ci0KLQkJCWN0cmxfYWRkXzEgPSBGb3JtVUkuY3JlYXRlQnV0dG9uKHRvb2xraXQsIHBhbmUyLAotCQkJCQlQcm9wZXJ0aWVzUmVzb3VyY2VzLlByb2Nlc3NfQWRkKTsKLQkJCWN0cmxfcmVtb3ZlXzEgPSBGb3JtVUkuY3JlYXRlQnV0dG9uKHRvb2xraXQsIHBhbmUyLAotCQkJCQlQcm9wZXJ0aWVzUmVzb3VyY2VzLlByb2Nlc3NfUmVtb3ZlKTsKLQotCQkJdG9vbGtpdC5wYWludEJvcmRlcnNGb3IocGFuZTEpOwotCQl9Ci0KLQkJLy8gR0VORVJBTCBHVUlEQU5DRQotCQl7Ci0JCQlzZWN0aW9uVGl0bGUgPSBQcm9wZXJ0aWVzUmVzb3VyY2VzLkFjdGl2aXR5X0dlbmVyYWxHdWlkYW5jZVRpdGxlOyAKLQkJCXNlY3Rpb25EZXNjID0gUHJvcGVydGllc1Jlc291cmNlcy5BY3Rpdml0eV9HZW5lcmFsR3VpZGFuY2VEZXNjcmlwdGlvbjsgCi0JCQl0YWJsZVRpdGxlID0gUHJvcGVydGllc1Jlc291cmNlcy5BY3Rpdml0eV9TZWxlY3RlZF9HZW5lcmFsR3VpZGFuY2U7IAotCi0JCQlTZWN0aW9uIHNlY3Rpb24gPSBGb3JtVUkuY3JlYXRlU2VjdGlvbih0b29sa2l0LCBjb21wb3NpdGUsCi0JCQkJCXNlY3Rpb25UaXRsZSwgc2VjdGlvbkRlc2MpOwotCi0JCQkvLyBjcmVhdGUgY29tcG9zaXRlCi0JCQlDb21wb3NpdGUgc2VjdGlvbkNvbXBvc2l0ZSA9IEZvcm1VSS5jcmVhdGVDb21wb3NpdGUodG9vbGtpdCwKLQkJCQkJc2VjdGlvbiwgMiwgZmFsc2UpOwotCi0JCQlDb21wb3NpdGUgcGFuZTEgPSBGb3JtVUkuY3JlYXRlQ29tcG9zaXRlKHRvb2xraXQsIHNlY3Rpb25Db21wb3NpdGUsCi0JCQkJCUdyaWREYXRhLkZJTExfQk9USCk7Ci0JCQlGb3JtVUkuY3JlYXRlTGFiZWwodG9vbGtpdCwgcGFuZTEsIHRhYmxlVGl0bGUpOwotCi0JCQljdHJsX3RhYmxlXzIgPSBGb3JtVUkuY3JlYXRlVGFibGUodG9vbGtpdCwgcGFuZTEsIHRhYmxlSGVpZ2h0KTsKLQkJCXZpZXdlcl8yID0gbmV3IFRhYmxlVmlld2VyKGN0cmxfdGFibGVfMik7Ci0JCQlJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciBjb250ZW50UHJvdmlkZXIgPSBuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoCi0JCQkJCWdldEFkYXB0ZXJGYWN0b3J5KCkpIHsKLQkJCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IG9iamVjdCkgewotCQkJCQlyZXR1cm4gZ2V0RmlsdGVyZWRMaXN0KGdldFNlbGVjdGVkR3VpZGFuY2VzKCkpLnRvQXJyYXkoKTsKLQkJCQl9Ci0JCQl9OwotCi0JCQl2aWV3ZXJfMi5zZXRDb250ZW50UHJvdmlkZXIoY29udGVudFByb3ZpZGVyKTsKLQkJCXZpZXdlcl8yLnNldExhYmVsUHJvdmlkZXIobGFiZWxQcm92aWRlcik7Ci0JCQl2aWV3ZXJfMi5zZXRJbnB1dChlbGVtZW50KTsKLQotCQkJLy8gY3JlYXRlIGJ1dHRvbnMgZm9yIHRhYmxlMgotCQkJQ29tcG9zaXRlIHBhbmUyID0gRm9ybVVJLmNyZWF0ZUNvbXBvc2l0ZSh0b29sa2l0LCBzZWN0aW9uQ29tcG9zaXRlLAotCQkJCQlHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9DRU5URVIKLQkJCQkJCQl8IEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQ0VOVEVSKTsKLQotCQkJY3RybF9hZGRfMiA9IEZvcm1VSS5jcmVhdGVCdXR0b24odG9vbGtpdCwgcGFuZTIsCi0JCQkJCVByb3BlcnRpZXNSZXNvdXJjZXMuUHJvY2Vzc19BZGQpOwotCQkJY3RybF9yZW1vdmVfMiA9IEZvcm1VSS5jcmVhdGVCdXR0b24odG9vbGtpdCwgcGFuZTIsCi0JCQkJCVByb3BlcnRpZXNSZXNvdXJjZXMuUHJvY2Vzc19SZW1vdmUpOwotCi0JCQl0b29sa2l0LnBhaW50Qm9yZGVyc0ZvcihwYW5lMSk7Ci0JCX0KLQotCQkvLyBDT01NVU5JQ0FUSU9OIE1BVEVSSUFMCi0JCXsKLQkJCXNlY3Rpb25UaXRsZSA9IFByb3BlcnRpZXNSZXNvdXJjZXMuQWN0aXZpdHlfQ29tbXVuaWNhdGlvbk1hdGVyaWFsVGl0bGU7IAotCQkJc2VjdGlvbkRlc2MgPSBQcm9wZXJ0aWVzUmVzb3VyY2VzLkFjdGl2aXR5X0NvbW11bmljYXRpb25NYXRlcmlhbERlc2NyaXB0aW9uOyAKLQkJCXRhYmxlVGl0bGUgPSBQcm9wZXJ0aWVzUmVzb3VyY2VzLkFjdGl2aXR5X1NlbGVjdGVkX0NvbW11bmljYXRpb25NYXRlcmlhbDsgCi0KLQkJCVNlY3Rpb24gc2VjdGlvbiA9IEZvcm1VSS5jcmVhdGVTZWN0aW9uKHRvb2xraXQsIGNvbXBvc2l0ZSwKLQkJCQkJc2VjdGlvblRpdGxlLCBzZWN0aW9uRGVzYyk7Ci0KLQkJCS8vIGNyZWF0ZSBjb21wb3NpdGUKLQkJCUNvbXBvc2l0ZSBzZWN0aW9uQ29tcG9zaXRlID0gRm9ybVVJLmNyZWF0ZUNvbXBvc2l0ZSh0b29sa2l0LAotCQkJCQlzZWN0aW9uLCAyLCBmYWxzZSk7Ci0KLQkJCUNvbXBvc2l0ZSBwYW5lMSA9IEZvcm1VSS5jcmVhdGVDb21wb3NpdGUodG9vbGtpdCwgc2VjdGlvbkNvbXBvc2l0ZSwKLQkJCQkJR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJCUZvcm1VSS5jcmVhdGVMYWJlbCh0b29sa2l0LCBwYW5lMSwgdGFibGVUaXRsZSk7Ci0KLQkJCWN0cmxfdGFibGVfMyA9IEZvcm1VSS5jcmVhdGVUYWJsZSh0b29sa2l0LCBwYW5lMSwgdGFibGVIZWlnaHQpOwotCQkJdmlld2VyXzMgPSBuZXcgVGFibGVWaWV3ZXIoY3RybF90YWJsZV8zKTsKLQkJCUlTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyIGNvbnRlbnRQcm92aWRlciA9IG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcigKLQkJCQkJZ2V0QWRhcHRlckZhY3RvcnkoKSkgewotCQkJCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgRGVsaXZlcnlQcm9jZXNzKSB7Ci0JCQkJCQlyZXR1cm4gZ2V0RmlsdGVyZWRMaXN0KAotCQkJCQkJCQkoKERlbGl2ZXJ5UHJvY2VzcykgZWxlbWVudCkKLQkJCQkJCQkJCQkuZ2V0Q29tbXVuaWNhdGlvbnNNYXRlcmlhbHMoKSkKLQkJCQkJCQkJLnRvQXJyYXkoKTsKLQkJCQkJfSBlbHNlCi0JCQkJCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVC50b0FycmF5KCk7Ci0JCQkJfQotCQkJfTsKLQotCQkJdmlld2VyXzMuc2V0Q29udGVudFByb3ZpZGVyKGNvbnRlbnRQcm92aWRlcik7Ci0JCQl2aWV3ZXJfMy5zZXRMYWJlbFByb3ZpZGVyKGxhYmVsUHJvdmlkZXIpOwotCQkJdmlld2VyXzMuc2V0SW5wdXQoZWxlbWVudCk7Ci0KLQkJCS8vIGNyZWF0ZSBidXR0b25zIGZvciB0YWJsZTIKLQkJCUNvbXBvc2l0ZSBwYW5lMiA9IEZvcm1VSS5jcmVhdGVDb21wb3NpdGUodG9vbGtpdCwgc2VjdGlvbkNvbXBvc2l0ZSwKLQkJCQkJR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQ0VOVEVSCi0JCQkJCQkJfCBHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0NFTlRFUik7Ci0KLQkJCWN0cmxfYWRkXzMgPSBGb3JtVUkuY3JlYXRlQnV0dG9uKHRvb2xraXQsIHBhbmUyLAotCQkJCQlQcm9wZXJ0aWVzUmVzb3VyY2VzLlByb2Nlc3NfQWRkKTsKLQkJCWN0cmxfcmVtb3ZlXzMgPSBGb3JtVUkuY3JlYXRlQnV0dG9uKHRvb2xraXQsIHBhbmUyLAotCQkJCQlQcm9wZXJ0aWVzUmVzb3VyY2VzLlByb2Nlc3NfUmVtb3ZlKTsKLQotCQkJdG9vbGtpdC5wYWludEJvcmRlcnNGb3IocGFuZTEpOwotCi0JCQljb21tdW5pY2F0aW9uTWF0ZXJpYWxTZWN0aW9uID0gc2VjdGlvbjsKLQotCQl9Ci0KLQkJLy8gRURVQ0FUSU9OIE1BVEVSSUFMCi0JCXsKLQkJCXNlY3Rpb25UaXRsZSA9IFByb3BlcnRpZXNSZXNvdXJjZXMuQWN0aXZpdHlfRWR1Y2F0aW9uTWF0ZXJpYWxUaXRsZTsgCi0JCQlzZWN0aW9uRGVzYyA9IFByb3BlcnRpZXNSZXNvdXJjZXMuQWN0aXZpdHlfRWR1Y2F0aW9uTWF0ZXJpYWxEZXNjcmlwdGlvbjsgCi0JCQl0YWJsZVRpdGxlID0gUHJvcGVydGllc1Jlc291cmNlcy5BY3Rpdml0eV9TZWxlY3RlZF9FZHVjYXRpb25NYXRlcmlhbDsgCi0KLQkJCVNlY3Rpb24gc2VjdGlvbiA9IEZvcm1VSS5jcmVhdGVTZWN0aW9uKHRvb2xraXQsIGNvbXBvc2l0ZSwKLQkJCQkJc2VjdGlvblRpdGxlLCBzZWN0aW9uRGVzYyk7Ci0KLQkJCS8vIGNyZWF0ZSBjb21wb3NpdGUKLQkJCUNvbXBvc2l0ZSBzZWN0aW9uQ29tcG9zaXRlID0gRm9ybVVJLmNyZWF0ZUNvbXBvc2l0ZSh0b29sa2l0LAotCQkJCQlzZWN0aW9uLCAyLCBmYWxzZSk7Ci0KLQkJCUNvbXBvc2l0ZSBwYW5lMSA9IEZvcm1VSS5jcmVhdGVDb21wb3NpdGUodG9vbGtpdCwgc2VjdGlvbkNvbXBvc2l0ZSwKLQkJCQkJR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJCUZvcm1VSS5jcmVhdGVMYWJlbCh0b29sa2l0LCBwYW5lMSwgdGFibGVUaXRsZSk7Ci0KLQkJCWN0cmxfdGFibGVfNCA9IEZvcm1VSS5jcmVhdGVUYWJsZSh0b29sa2l0LCBwYW5lMSwgdGFibGVIZWlnaHQpOwotCQkJdmlld2VyXzQgPSBuZXcgVGFibGVWaWV3ZXIoY3RybF90YWJsZV80KTsKLQkJCUlTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyIGNvbnRlbnRQcm92aWRlciA9IG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcigKLQkJCQkJZ2V0QWRhcHRlckZhY3RvcnkoKSkgewotCQkJCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgRGVsaXZlcnlQcm9jZXNzKSB7Ci0JCQkJCQlyZXR1cm4gZ2V0RmlsdGVyZWRMaXN0KAotCQkJCQkJCQkoKERlbGl2ZXJ5UHJvY2VzcykgZWxlbWVudCkKLQkJCQkJCQkJCQkuZ2V0RWR1Y2F0aW9uTWF0ZXJpYWxzKCkpLnRvQXJyYXkoKTsKLQkJCQkJfSBlbHNlCi0JCQkJCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVC50b0FycmF5KCk7Ci0JCQkJfQotCQkJfTsKLQotCQkJdmlld2VyXzQuc2V0Q29udGVudFByb3ZpZGVyKGNvbnRlbnRQcm92aWRlcik7Ci0JCQl2aWV3ZXJfNC5zZXRMYWJlbFByb3ZpZGVyKGxhYmVsUHJvdmlkZXIpOwotCQkJdmlld2VyXzQuc2V0SW5wdXQoZWxlbWVudCk7Ci0KLQkJCS8vIGNyZWF0ZSBidXR0b25zIGZvciB0YWJsZTIKLQkJCUNvbXBvc2l0ZSBwYW5lMiA9IEZvcm1VSS5jcmVhdGVDb21wb3NpdGUodG9vbGtpdCwgc2VjdGlvbkNvbXBvc2l0ZSwKLQkJCQkJR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQ0VOVEVSCi0JCQkJCQkJfCBHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0NFTlRFUik7Ci0KLQkJCWN0cmxfYWRkXzQgPSBGb3JtVUkuY3JlYXRlQnV0dG9uKHRvb2xraXQsIHBhbmUyLAotCQkJCQlQcm9wZXJ0aWVzUmVzb3VyY2VzLlByb2Nlc3NfQWRkKTsKLQkJCWN0cmxfcmVtb3ZlXzQgPSBGb3JtVUkuY3JlYXRlQnV0dG9uKHRvb2xraXQsIHBhbmUyLAotCQkJCQlQcm9wZXJ0aWVzUmVzb3VyY2VzLlByb2Nlc3NfUmVtb3ZlKTsKLQotCQkJdG9vbGtpdC5wYWludEJvcmRlcnNGb3IocGFuZTEpOwotCi0JCQllZHVjYXRpb25NYXRlcmlhbFNlY3Rpb24gPSBzZWN0aW9uOwotCi0JCX0KLQotCQkvLyBoaWRlL3Nob3cgY2VydGFpbiBzZWN0aW9ucwotCQl0b2dnbGVTZWN0aW9uKCk7Ci0JfQotCi0JLyoqCi0JICogQWRkIGxpc3RlbmVycwotCSAqIAotCSAqLwotCXByaXZhdGUgdm9pZCBhZGRMaXN0ZW5lcnMoKSB7Ci0JCUl0ZW1Qcm92aWRlckFkYXB0ZXIgYWRhcHRlciA9IChJdGVtUHJvdmlkZXJBZGFwdGVyKSBnZXRBZGFwdGVyKCk7Ci0JCU9iamVjdCBwYXJlbnQgPSBudWxsOwotCQlpZiAoYWRhcHRlciBpbnN0YW5jZW9mIElCU0l0ZW1Qcm92aWRlcikgewotCQkJSUJTSXRlbVByb3ZpZGVyIGJzSXRlbVByb3ZpZGVyID0gKElCU0l0ZW1Qcm92aWRlcikgYWRhcHRlcjsKLQkJCXBhcmVudCA9IGJzSXRlbVByb3ZpZGVyLmdldFRvcEl0ZW0oKTsKLQkJfSBlbHNlIHsKLQkJCWxvZ2dlcgotCQkJCQkubG9nRXJyb3IoIkFjdGl2aXR5R3VpZGFuY2VTZWN0aW9uOjphZGRMaXN0ZW5lcnMgLSBJQlNJdGVtUHJvdmlkZXIgaXMgbnVsbCIpOyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm47Ci0JCX0KLQotCQl7Ci0JCQljdHJsX3RhYmxlXzEuYWRkRm9jdXNMaXN0ZW5lcihuZXcgRm9jdXNBZGFwdGVyKCkgewotCQkJCXB1YmxpYyB2b2lkIGZvY3VzR2FpbmVkKEZvY3VzRXZlbnQgZSkgewotCQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHZpZXdlcl8xCi0JCQkJCQkJLmdldFNlbGVjdGlvbigpOwotCQkJCQlpZiAoKHNlbGVjdGlvbi5zaXplKCkgPiAwKSAmJiBlZGl0YWJsZSkKLQkJCQkJCWN0cmxfcmVtb3ZlXzEuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQl9Ci0JCQl9KTsKLQotCQkJdmlld2VyXzEKLQkJCQkJLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQkJCQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB2aWV3ZXJfMQotCQkJCQkJCQkJLmdldFNlbGVjdGlvbigpOwotCQkJCQkJCWlmICgoc2VsZWN0aW9uLnNpemUoKSA+IDApICYmIGVkaXRhYmxlKQotCQkJCQkJCQljdHJsX3JlbW92ZV8xLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJCQl9Ci0JCQkJCX0pOwotCi0JCQljdHJsX2FkZF8xLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJSUZpbHRlciBmaWx0ZXIgPSBnZXRSb2FkTWFwRmlsdGVyKCk7Ci0JCQkJCUl0ZW1zRmlsdGVyRGlhbG9nIGZkID0gbmV3IEl0ZW1zRmlsdGVyRGlhbG9nKFBsYXRmb3JtVUkKLQkJCQkJCQkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkKLQkJCQkJCQkuZ2V0U2hlbGwoKSwgZmlsdGVyLCBlbGVtZW50LAotCQkJCQkJCUZpbHRlckNvbnN0YW50cy5ST0FETUFQLCBlbGVtZW50LmdldFJvYWRtYXBzKCkpOwotCi0JCQkJCWZkLnNldFRpdGxlKEZpbHRlckNvbnN0YW50cy5ST0FETUFQKTsKLQkJCQkJZmQuc2V0SW5wdXQoVW1hVXRpbC5nZXRNZXRob2RMaWJyYXJ5KChFT2JqZWN0KSBlbGVtZW50KSk7Ci0JCQkJCWZkLnNldEJsb2NrT25PcGVuKHRydWUpOwotCQkJCQlmZC5vcGVuKCk7Ci0JCQkJCWFkZEd1aWRhbmNlcyhmZC5nZXRTZWxlY3RlZEl0ZW1zKCkpOwotCQkJCQl2aWV3ZXJfMS5yZWZyZXNoKCk7Ci0JCQkJfQotCQkJfSk7Ci0KLQkJCWN0cmxfcmVtb3ZlXzEuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHZpZXdlcl8xCi0JCQkJCQkJLmdldFNlbGVjdGlvbigpOwotCQkJCQlpZiAoc2VsZWN0aW9uLnNpemUoKSA+IDApIHsKLQkJCQkJCS8vIHVwZGF0ZSB0aGUgbW9kZWwKLQkJCQkJCUFycmF5TGlzdCBybUl0ZW1zID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQkJcm1JdGVtcy5hZGRBbGwoc2VsZWN0aW9uLnRvTGlzdCgpKTsKLQkJCQkJCXJlbW92ZUd1aWRhbmNlcyhybUl0ZW1zKTsKLQkJCQkJCXZpZXdlcl8xLnJlZnJlc2goKTsKLQotCQkJCQkJLy8gY2xlYXIgdGhlIHNlbGVjdGlvbgotCQkJCQkJdmlld2VyXzEuc2V0U2VsZWN0aW9uKG51bGwsIHRydWUpOwotCQkJCQl9Ci0JCQkJCWN0cmxfcmVtb3ZlXzEuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQotCQl7Ci0JCQljdHJsX3RhYmxlXzIuYWRkRm9jdXNMaXN0ZW5lcihuZXcgRm9jdXNBZGFwdGVyKCkgewotCQkJCXB1YmxpYyB2b2lkIGZvY3VzR2FpbmVkKEZvY3VzRXZlbnQgZSkgewotCQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHZpZXdlcl8yCi0JCQkJCQkJLmdldFNlbGVjdGlvbigpOwotCQkJCQlpZiAoKHNlbGVjdGlvbi5zaXplKCkgPiAwKSAmJiBlZGl0YWJsZSkKLQkJCQkJCWN0cmxfcmVtb3ZlXzIuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQl9Ci0JCQl9KTsKLQotCQkJdmlld2VyXzIKLQkJCQkJLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQkJCQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB2aWV3ZXJfMgotCQkJCQkJCQkJLmdldFNlbGVjdGlvbigpOwotCQkJCQkJCWlmICgoc2VsZWN0aW9uLnNpemUoKSA+IDApICYmIGVkaXRhYmxlKQotCQkJCQkJCQljdHJsX3JlbW92ZV8yLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJCQl9Ci0JCQkJCX0pOwotCi0JCQljdHJsX2FkZF8yLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJSUZpbHRlciBmaWx0ZXIgPSBnZXRHZW5lcmFsR3VpZGFuY2VGaWx0ZXIoKTsKLQkJCQkJSXRlbXNGaWx0ZXJEaWFsb2cgZmQgPSBuZXcgSXRlbXNGaWx0ZXJEaWFsb2coUGxhdGZvcm1VSQotCQkJCQkJCS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKQotCQkJCQkJCS5nZXRTaGVsbCgpLCBmaWx0ZXIsIGVsZW1lbnQsCi0JCQkJCQkJRmlsdGVyQ29uc3RhbnRzLkdVSURBTkNFLCBnZXRFeGlzdGluZ0VsZW1lbnRzKCkpOyAKLQotCQkJCQlmZC5zZXRUaXRsZShGaWx0ZXJDb25zdGFudHMuR1VJREFOQ0UpOwotCQkJCQlmZC5zZXRJbnB1dChVbWFVdGlsLmdldE1ldGhvZExpYnJhcnkoKEVPYmplY3QpIGVsZW1lbnQpKTsKLQkJCQkJZmQuc2V0QmxvY2tPbk9wZW4odHJ1ZSk7Ci0JCQkJCWZkLnNldFR5cGVzKGdldEZpbHRlclR5cGVzKCkpOwotCQkJCQlmZC5vcGVuKCk7Ci0JCQkJCWFkZEd1aWRhbmNlcyhmZC5nZXRTZWxlY3RlZEl0ZW1zKCkpOwotCQkJCQl2aWV3ZXJfMi5yZWZyZXNoKCk7Ci0JCQkJfQotCQkJfSk7Ci0KLQkJCWN0cmxfcmVtb3ZlXzIuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHZpZXdlcl8yCi0JCQkJCQkJLmdldFNlbGVjdGlvbigpOwotCQkJCQlpZiAoc2VsZWN0aW9uLnNpemUoKSA+IDApIHsKLQkJCQkJCS8vIHVwZGF0ZSB0aGUgbW9kZWwKLQkJCQkJCUFycmF5TGlzdCBybUl0ZW1zID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQkJcm1JdGVtcy5hZGRBbGwoc2VsZWN0aW9uLnRvTGlzdCgpKTsKLQkJCQkJCXJlbW92ZUd1aWRhbmNlcyhybUl0ZW1zKTsKLQkJCQkJCXZpZXdlcl8yLnJlZnJlc2goKTsKLQotCQkJCQkJLy8gY2xlYXIgdGhlIHNlbGVjdGlvbgotCQkJCQkJdmlld2VyXzIuc2V0U2VsZWN0aW9uKG51bGwsIHRydWUpOwotCQkJCQl9Ci0JCQkJCWN0cmxfcmVtb3ZlXzIuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQotCQl7Ci0JCQljdHJsX3RhYmxlXzMuYWRkRm9jdXNMaXN0ZW5lcihuZXcgRm9jdXNBZGFwdGVyKCkgewotCQkJCXB1YmxpYyB2b2lkIGZvY3VzR2FpbmVkKEZvY3VzRXZlbnQgZSkgewotCQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHZpZXdlcl8zCi0JCQkJCQkJLmdldFNlbGVjdGlvbigpOwotCQkJCQlpZiAoKHNlbGVjdGlvbi5zaXplKCkgPiAwKSAmJiBlZGl0YWJsZSkKLQkJCQkJCWN0cmxfcmVtb3ZlXzMuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQl9Ci0JCQl9KTsKLQotCQkJdmlld2VyXzMKLQkJCQkJLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQkJCQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB2aWV3ZXJfMwotCQkJCQkJCQkJLmdldFNlbGVjdGlvbigpOwotCQkJCQkJCWlmICgoc2VsZWN0aW9uLnNpemUoKSA+IDApICYmIGVkaXRhYmxlKQotCQkJCQkJCQljdHJsX3JlbW92ZV8zLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJCQl9Ci0JCQkJCX0pOwotCi0JCQljdHJsX2FkZF8zLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBEZWxpdmVyeVByb2Nlc3MpIHsKLQkJCQkJCURlbGl2ZXJ5UHJvY2VzcyBwcm9jID0gKERlbGl2ZXJ5UHJvY2VzcykgZWxlbWVudDsKLQotCQkJCQkJSUZpbHRlciBmaWx0ZXIgPSBnZXRTdXBwb3J0aW5nTWF0ZXJpYWxGaWx0ZXIoKTsKLQkJCQkJCUl0ZW1zRmlsdGVyRGlhbG9nIGZkID0gbmV3IEl0ZW1zRmlsdGVyRGlhbG9nKFBsYXRmb3JtVUkKLQkJCQkJCQkJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpCi0JCQkJCQkJCS5nZXRTaGVsbCgpLCBmaWx0ZXIsIHByb2MsCi0JCQkJCQkJCUZpbHRlckNvbnN0YW50cy5TVVBQT1JUSU5HX01BVEVSSUFMUywgcHJvYwotCQkJCQkJCQkJCS5nZXRDb21tdW5pY2F0aW9uc01hdGVyaWFscygpKTsKLQotCQkJCQkJZmQuc2V0VGl0bGUoRmlsdGVyQ29uc3RhbnRzLkdVSURBTkNFKTsKLQkJCQkJCWZkCi0JCQkJCQkJCS5zZXRJbnB1dChVbWFVdGlsCi0JCQkJCQkJCQkJLmdldE1ldGhvZExpYnJhcnkoKEVPYmplY3QpIGVsZW1lbnQpKTsKLQkJCQkJCWZkLnNldEJsb2NrT25PcGVuKHRydWUpOwotCQkJCQkJZmQub3BlbigpOwotCi0JCQkJCQlhY3Rpb25NZ3IKLQkJCQkJCQkJLmRvQWN0aW9uKAotCQkJCQkJCQkJCUlBY3Rpb25NYW5hZ2VyLkFERF9NQU5ZLAotCQkJCQkJCQkJCXByb2MsCi0JCQkJCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCQkJCS5nZXREZWxpdmVyeVByb2Nlc3NfQ29tbXVuaWNhdGlvbnNNYXRlcmlhbHMoKSwKLQkJCQkJCQkJCQlmZC5nZXRTZWxlY3RlZEl0ZW1zKCksIC0xKTsKLQkJCQkJfQotCi0JCQkJCXZpZXdlcl8zLnJlZnJlc2goKTsKLQkJCQl9Ci0JCQl9KTsKLQotCQkJY3RybF9yZW1vdmVfMy5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgdmlld2VyXzMKLQkJCQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJCWlmIChzZWxlY3Rpb24uc2l6ZSgpID4gMCkgewotCQkJCQkJLy8gdXBkYXRlIHRoZSBtb2RlbAotCQkJCQkJQXJyYXlMaXN0IHJtSXRlbXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCQlybUl0ZW1zLmFkZEFsbChzZWxlY3Rpb24udG9MaXN0KCkpOwotCi0JCQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIERlbGl2ZXJ5UHJvY2VzcykgewotCQkJCQkJCURlbGl2ZXJ5UHJvY2VzcyBwcm9jID0gKERlbGl2ZXJ5UHJvY2VzcykgZWxlbWVudDsKLQkJCQkJCQlhY3Rpb25NZ3IKLQkJCQkJCQkJCS5kb0FjdGlvbigKLQkJCQkJCQkJCQkJSUFjdGlvbk1hbmFnZXIuUkVNT1ZFX01BTlksCi0JCQkJCQkJCQkJCXByb2MsCi0JCQkJCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJCQkJLmdldERlbGl2ZXJ5UHJvY2Vzc19Db21tdW5pY2F0aW9uc01hdGVyaWFscygpLAotCQkJCQkJCQkJCQlybUl0ZW1zLCAtMSk7Ci0JCQkJCQl9Ci0JCQkJCQl2aWV3ZXJfMy5yZWZyZXNoKCk7Ci0KLQkJCQkJCS8vIGNsZWFyIHRoZSBzZWxlY3Rpb24KLQkJCQkJCXZpZXdlcl8zLnNldFNlbGVjdGlvbihudWxsLCB0cnVlKTsKLQkJCQkJfQotCQkJCQljdHJsX3JlbW92ZV8zLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCX0KLQkJCX0pOwotCQl9Ci0KLQkJewotCQkJY3RybF90YWJsZV80LmFkZEZvY3VzTGlzdGVuZXIobmV3IEZvY3VzQWRhcHRlcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBmb2N1c0dhaW5lZChGb2N1c0V2ZW50IGUpIHsKLQkJCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB2aWV3ZXJfNAotCQkJCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQkJCQkJaWYgKChzZWxlY3Rpb24uc2l6ZSgpID4gMCkgJiYgZWRpdGFibGUpCi0JCQkJCQljdHJsX3JlbW92ZV80LnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJfQotCQkJfSk7Ci0KLQkJCXZpZXdlcl80Ci0JCQkJCS5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0JCQkJCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQkJCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgdmlld2VyXzQKLQkJCQkJCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQkJCQkJCQlpZiAoKHNlbGVjdGlvbi5zaXplKCkgPiAwKSAmJiBlZGl0YWJsZSkKLQkJCQkJCQkJY3RybF9yZW1vdmVfNC5zZXRFbmFibGVkKHRydWUpOwotCQkJCQkJfQotCQkJCQl9KTsKLQotCQkJY3RybF9hZGRfNC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgRGVsaXZlcnlQcm9jZXNzKSB7Ci0JCQkJCQlEZWxpdmVyeVByb2Nlc3MgcHJvYyA9IChEZWxpdmVyeVByb2Nlc3MpIGVsZW1lbnQ7Ci0KLQkJCQkJCUlGaWx0ZXIgZmlsdGVyID0gZ2V0U3VwcG9ydGluZ01hdGVyaWFsRmlsdGVyKCk7Ci0JCQkJCQlJdGVtc0ZpbHRlckRpYWxvZyBmZCA9IG5ldyBJdGVtc0ZpbHRlckRpYWxvZyhQbGF0Zm9ybVVJCi0JCQkJCQkJCS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKQotCQkJCQkJCQkuZ2V0U2hlbGwoKSwgZmlsdGVyLCBwcm9jLAotCQkJCQkJCQlGaWx0ZXJDb25zdGFudHMuU1VQUE9SVElOR19NQVRFUklBTFMsIHByb2MKLQkJCQkJCQkJCQkuZ2V0RWR1Y2F0aW9uTWF0ZXJpYWxzKCkpOwotCi0JCQkJCQlmZC5zZXRUaXRsZShGaWx0ZXJDb25zdGFudHMuR1VJREFOQ0UpOwotCQkJCQkJZmQKLQkJCQkJCQkJLnNldElucHV0KFVtYVV0aWwKLQkJCQkJCQkJCQkuZ2V0TWV0aG9kTGlicmFyeSgoRU9iamVjdCkgZWxlbWVudCkpOwotCQkJCQkJZmQuc2V0QmxvY2tPbk9wZW4odHJ1ZSk7Ci0JCQkJCQlmZC5vcGVuKCk7Ci0KLQkJCQkJCWFjdGlvbk1ncgotCQkJCQkJCQkuZG9BY3Rpb24oCi0JCQkJCQkJCQkJSUFjdGlvbk1hbmFnZXIuQUREX01BTlksCi0JCQkJCQkJCQkJcHJvYywKLQkJCQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJCQkJLmdldERlbGl2ZXJ5UHJvY2Vzc19FZHVjYXRpb25NYXRlcmlhbHMoKSwKLQkJCQkJCQkJCQlmZC5nZXRTZWxlY3RlZEl0ZW1zKCksIC0xKTsKLQotCQkJCQkJdmlld2VyXzQucmVmcmVzaCgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfSk7Ci0KLQkJCWN0cmxfcmVtb3ZlXzQuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHZpZXdlcl80Ci0JCQkJCQkJLmdldFNlbGVjdGlvbigpOwotCQkJCQlpZiAoc2VsZWN0aW9uLnNpemUoKSA+IDApIHsKLQkJCQkJCS8vIHVwZGF0ZSB0aGUgbW9kZWwKLQkJCQkJCUFycmF5TGlzdCBybUl0ZW1zID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQkJcm1JdGVtcy5hZGRBbGwoc2VsZWN0aW9uLnRvTGlzdCgpKTsKLQkJCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgRGVsaXZlcnlQcm9jZXNzKSB7Ci0JCQkJCQkJRGVsaXZlcnlQcm9jZXNzIHByb2MgPSAoRGVsaXZlcnlQcm9jZXNzKSBlbGVtZW50OwotCQkJCQkJCWFjdGlvbk1ncgotCQkJCQkJCQkJLmRvQWN0aW9uKAotCQkJCQkJCQkJCQlJQWN0aW9uTWFuYWdlci5SRU1PVkVfTUFOWSwKLQkJCQkJCQkJCQkJcHJvYywKLQkJCQkJCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCQkJCQkuZ2V0RGVsaXZlcnlQcm9jZXNzX0VkdWNhdGlvbk1hdGVyaWFscygpLAotCQkJCQkJCQkJCQlybUl0ZW1zLCAtMSk7Ci0JCQkJCQl9Ci0JCQkJCQl2aWV3ZXJfNC5yZWZyZXNoKCk7Ci0KLQkJCQkJCS8vIGNsZWFyIHRoZSBzZWxlY3Rpb24KLQkJCQkJCXZpZXdlcl80LnNldFNlbGVjdGlvbihudWxsLCB0cnVlKTsKLQotCQkJCQl9Ci0JCQkJCWN0cmxfcmVtb3ZlXzQuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIEFkZCBndWlkYW5jZXMgdG8gdGhlIGVsZW1lbnQKLQkgKiBAcGFyYW0gYWRkSXRlbXMKLQkgKiAJCQkJbGlzdCBvZiBndWlkYW5jZXMgdG8gYWRkCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZEd1aWRhbmNlcyhBcnJheUxpc3QgYWRkSXRlbXMpIHsKLQkJLy8gdXBkYXRlIHRoZSBtb2RlbAotCQlBZGRHdWlkYW5jZVRvQnJlYWtkb3duRWxlbWVudENvbW1hbmQgY29tbWFuZCA9IG5ldyBBZGRHdWlkYW5jZVRvQnJlYWtkb3duRWxlbWVudENvbW1hbmQoCi0JCQkJZWxlbWVudCwgYWRkSXRlbXMpOwotCQlhY3Rpb25NZ3IuZXhlY3V0ZShjb21tYW5kKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgZ3VpZGFuY2VzIGZyb20gdGhlIGVsZW1lbnQKLQkgKiBAcGFyYW0gcm1JdGVtcwotCSAqIAkJCQlsaXN0IG9mIGd1aWRhbmNlcyB0byByZW1vdmUKLQkgKi8KLQlwcml2YXRlIHZvaWQgcmVtb3ZlR3VpZGFuY2VzKEFycmF5TGlzdCBybUl0ZW1zKSB7Ci0JCS8vIHVwZGF0ZSB0aGUgbW9kZWwKLQkJaWYgKCFybUl0ZW1zLmlzRW1wdHkoKSkgewotCQkJZm9yIChJdGVyYXRvciBpdCA9IHJtSXRlbXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCUd1aWRhbmNlIGl0ZW0gPSAoR3VpZGFuY2UpIGl0Lm5leHQoKTsKLQotCQkJCS8vIGd1aWRhbmNlcyBmb3IgYWN0aXZpdHkKLQkJCQlpZiAoaXRlbSBpbnN0YW5jZW9mIENoZWNrbGlzdCkgewotCQkJCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuUkVNT1ZFLCBlbGVtZW50LAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEJyZWFrZG93bkVsZW1lbnRfQ2hlY2tsaXN0cygpLAotCQkJCQkJCWl0ZW0sIC0xKTsKLQkJCQl9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBDb25jZXB0KSB7Ci0JCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5SRU1PVkUsIGVsZW1lbnQsCi0JCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QnJlYWtkb3duRWxlbWVudF9Db25jZXB0cygpLCBpdGVtLAotCQkJCQkJCS0xKTsKLQkJCQl9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBFeGFtcGxlKSB7Ci0JCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5SRU1PVkUsIGVsZW1lbnQsCi0JCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QnJlYWtkb3duRWxlbWVudF9FeGFtcGxlcygpLCBpdGVtLAotCQkJCQkJCS0xKTsKLQkJCQl9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBTdXBwb3J0aW5nTWF0ZXJpYWwpIHsKLQkJCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlJFTU9WRSwgZWxlbWVudCwKLQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJLmdldEJyZWFrZG93bkVsZW1lbnRfU3VwcG9ydGluZ01hdGVyaWFscygpLCBpdGVtLAotCQkJCQkJCS0xKTsKLQkJCQl9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBHdWlkZWxpbmUpIHsKLQkJCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlJFTU9WRSwgZWxlbWVudCwKLQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRCcmVha2Rvd25FbGVtZW50X0d1aWRlbGluZXMoKSwKLQkJCQkJCQlpdGVtLCAtMSk7Ci0JCQkJfSBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgUmV1c2FibGVBc3NldCkgewotCQkJCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuUkVNT1ZFLCBlbGVtZW50LAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEJyZWFrZG93bkVsZW1lbnRfUmV1c2FibGVBc3NldHMoKSwKLQkJCQkJCQlpdGVtLCAtMSk7Ci0JCQkJfSBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgUm9hZG1hcCkgewotCQkJCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuUkVNT1ZFLCBlbGVtZW50LAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEFjdGl2aXR5X1JvYWRtYXBzKCksIGl0ZW0sCi0JCQkJCQkJLTEpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWxvZ2dlcgotCQkJCQkJCS5sb2dFcnJvcigiQ2FuJ3QgcmVtb3ZlIEd1aWRhbmNlOiAiICsgaXRlbS5nZXRUeXBlKCkuZ2V0TmFtZSgpICsgIjoiICsgaXRlbS5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBHZXQgZXhpc3RpbmcgZ3VpZGFuY2VzIG9mIHRoZSBlbGVtZW50Ci0JICogQHJldHVybgotCSAqIAkJCWxpc3Qgb2YgZXhpc3RpbmcgZ3VpZGFuY2VzLgotCSAqLwotCXByaXZhdGUgTGlzdCBnZXRFeGlzdGluZ0VsZW1lbnRzKCkgewotCi0JCUxpc3QgaXRlbUxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJaXRlbUxpc3QuYWRkQWxsKGVsZW1lbnQuZ2V0Q2hlY2tsaXN0cygpKTsKLQkJaXRlbUxpc3QuYWRkQWxsKGVsZW1lbnQuZ2V0Q29uY2VwdHMoKSk7Ci0JCWl0ZW1MaXN0LmFkZEFsbChlbGVtZW50LmdldEV4YW1wbGVzKCkpOwotCQlpdGVtTGlzdC5hZGRBbGwoZWxlbWVudC5nZXRHdWlkZWxpbmVzKCkpOwotCQlpdGVtTGlzdC5hZGRBbGwoZWxlbWVudC5nZXRSZXVzYWJsZUFzc2V0cygpKTsKLQkJaXRlbUxpc3QuYWRkQWxsKGVsZW1lbnQuZ2V0U3VwcG9ydGluZ01hdGVyaWFscygpKTsKLQotCQlEaWFncmFtSW5mbyBpbmZvID0gbmV3IERpYWdyYW1JbmZvKChBY3Rpdml0eSkgZWxlbWVudCk7Ci0JCWlmIChpbmZvLmdldEFjdGl2aXR5RGlhZ3JhbSgpICE9IG51bGwpCi0JCQlpdGVtTGlzdC5hZGQoaW5mby5nZXRBY3Rpdml0eURpYWdyYW0oKSk7Ci0JCWlmIChpbmZvLmdldEFjdGl2aXR5RGV0YWlsRGlhZ3JhbSgpICE9IG51bGwpCi0JCQlpdGVtTGlzdC5hZGQoaW5mby5nZXRBY3Rpdml0eURldGFpbERpYWdyYW0oKSk7Ci0JCWlmIChpbmZvLmdldFdQRERpYWdyYW0oKSAhPSBudWxsKQotCQkJaXRlbUxpc3QuYWRkKGluZm8uZ2V0V1BERGlhZ3JhbSgpKTsKLQotCQlyZXR1cm4gaXRlbUxpc3Q7Ci0JfQotCi0JLyoqCi0JICogR2V0IHNlbGVjdGVkIGd1aWRhbmNlcwotCSAqIEByZXR1cm4KLQkgKiAJCQlsaXN0IG9mIHNlbGVjdGVkIGd1aWRhbmNlcwotCSAqLwotCXByaXZhdGUgTGlzdCBnZXRTZWxlY3RlZEd1aWRhbmNlcygpIHsKLQkJTGlzdCBpdGVtTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQlpdGVtTGlzdC5hZGRBbGwoZWxlbWVudC5nZXRDaGVja2xpc3RzKCkpOwotCQlpdGVtTGlzdC5hZGRBbGwoZWxlbWVudC5nZXRDb25jZXB0cygpKTsKLQkJaXRlbUxpc3QuYWRkQWxsKGVsZW1lbnQuZ2V0RXhhbXBsZXMoKSk7Ci0JCWl0ZW1MaXN0LmFkZEFsbChlbGVtZW50LmdldEd1aWRlbGluZXMoKSk7Ci0JCWl0ZW1MaXN0LmFkZEFsbChlbGVtZW50LmdldFJldXNhYmxlQXNzZXRzKCkpOwotCQlMaXN0IHN1cHBvcnRpbmdNYXRlcmlhbHMgPSBlbGVtZW50LmdldFN1cHBvcnRpbmdNYXRlcmlhbHMoKTsKLQkJRGlhZ3JhbUluZm8gaW5mbyA9IG5ldyBEaWFncmFtSW5mbygoQWN0aXZpdHkpIGVsZW1lbnQpOwotCQlmb3IgKEl0ZXJhdG9yIGl0b3IgPSBzdXBwb3J0aW5nTWF0ZXJpYWxzLml0ZXJhdG9yKCk7IGl0b3IuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IG9iaiA9IGl0b3IubmV4dCgpOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFN1cHBvcnRpbmdNYXRlcmlhbCkKLQkJCQlpZiAoIWluZm8uaXNEaWFncmFtKChTdXBwb3J0aW5nTWF0ZXJpYWwpIG9iaikpIHsKLQkJCQkJaXRlbUxpc3QuYWRkKG9iaik7Ci0JCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGl0ZW1MaXN0OwotCX0KLQotCS8qKgotCSAqIFJldHVybiBsaXN0IG9mIGZpbHRlciB0eXBlcwotCSAqLwotCXByb3RlY3RlZCBTdHJpbmdbXSBnZXRGaWx0ZXJUeXBlcygpIHsKLQkJU3RyaW5nW10gc3RyID0gbmV3IFN0cmluZ1sxNF07Ci0JCWludCBpID0gMDsKLQkJc3RyW2krK10gPSBGaWx0ZXJDb25zdGFudHMuR1VJREFOQ0U7Ci0JCXN0cltpKytdID0gRmlsdGVyQ29uc3RhbnRzLnNwYWNlICsgRmlsdGVyQ29uc3RhbnRzLkNIRUNLTElTVFM7Ci0JCXN0cltpKytdID0gRmlsdGVyQ29uc3RhbnRzLnNwYWNlICsgRmlsdGVyQ29uc3RhbnRzLkNPTkNFUFRTOwotCQlzdHJbaSsrXSA9IEZpbHRlckNvbnN0YW50cy5zcGFjZQotCQkJCSsgRmlsdGVyQ29uc3RhbnRzLkVTVElNQVRFX0NPTlNJREVSQVRJT05TOwotCQlzdHJbaSsrXSA9IEZpbHRlckNvbnN0YW50cy5zcGFjZSArIEZpbHRlckNvbnN0YW50cy5FWEFNUExFUzsKLQkJc3RyW2krK10gPSBGaWx0ZXJDb25zdGFudHMuc3BhY2UgKyBGaWx0ZXJDb25zdGFudHMuR1VJREVMSU5FUzsKLQkJc3RyW2krK10gPSBGaWx0ZXJDb25zdGFudHMuc3BhY2UgKyBGaWx0ZXJDb25zdGFudHMuUFJBQ1RJQ0VTOwotCQlzdHJbaSsrXSA9IEZpbHRlckNvbnN0YW50cy5zcGFjZSArIEZpbHRlckNvbnN0YW50cy5SRVBPUlRTOwotCQlzdHJbaSsrXSA9IEZpbHRlckNvbnN0YW50cy5zcGFjZSArIEZpbHRlckNvbnN0YW50cy5SRVVTQUJMRV9BU1NFVFM7Ci0JCXN0cltpKytdID0gRmlsdGVyQ29uc3RhbnRzLnNwYWNlICsgRmlsdGVyQ29uc3RhbnRzLlNVUFBPUlRJTkdfTUFURVJJQUxTOwotCQlzdHJbaSsrXSA9IEZpbHRlckNvbnN0YW50cy5zcGFjZSArIEZpbHRlckNvbnN0YW50cy5URU1QTEFURVM7Ci0JCXN0cltpKytdID0gRmlsdGVyQ29uc3RhbnRzLnNwYWNlICsgRmlsdGVyQ29uc3RhbnRzLlRPT0xfTUVOVE9SUzsKLQkJc3RyW2krK10gPSBGaWx0ZXJDb25zdGFudHMuc3BhY2UgKyBGaWx0ZXJDb25zdGFudHMuV0hJVEVfUEFQRVJTOwotCQlzdHJbaSsrXSA9IEZpbHRlckNvbnN0YW50cy5zcGFjZSArIEZpbHRlckNvbnN0YW50cy5URVJNX0RFRklOSVRJT05TOwotCQlyZXR1cm4gc3RyOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvQWN0aXZpdHlSb2xsdXBTZWN0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvQWN0aXZpdHlSb2xsdXBTZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiNmUwMGEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL0FjdGl2aXR5Um9sbHVwU2VjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllczsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlZEFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLkNvbHVtbkRlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm92aWRlcnMuRXhwb3NlZEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudmlld3MuUHJvY2Vzc1ZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnByZWZlcmVuY2VzLklQcmVmZXJlbmNlU3RvcmVXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLklCU0l0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuSUNvbHVtbkF3YXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuRm9ybVRvb2xraXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5TZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLlRhYmJlZFByb3BlcnR5U2hlZXRQYWdlOwotCi0KLS8qKgotICogVGhlIHJvbGx1cCBzZWN0aW9uIGZvciBhY3Rpdml0eQotICogCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMAotICogCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBY3Rpdml0eVJvbGx1cFNlY3Rpb24gZXh0ZW5kcyBBYnN0cmFjdFNlY3Rpb24gewotCS8vIGNvbnRyb2xzCi0JcHJpdmF0ZSBGb3JtVG9vbGtpdCB0b29sa2l0OwotCi0JcHJvdGVjdGVkIFNlY3Rpb24gc2VjdGlvbjsKLQotCXByaXZhdGUgQ29tcG9zaXRlIHJvbGx1cENvbXBvc2l0ZTsKLQotCXByaXZhdGUgUHJvY2Vzc1ZpZXdlciB2aWV3ZXI7Ci0KLQkvLyBwcml2YXRlIFRhYmJlZFByb3BlcnR5U2hlZXRQYWdlIHRhYmJlZFByb3BlcnR5U2hlZXRQYWdlOwotCi0JLy8gZWxlbWVudAotCXByaXZhdGUgQWN0aXZpdHkgZWxlbWVudDsKLQotCS8vIGFjdGlvbiBtYW5hZ2VyCi0JLy8gcHJvdGVjdGVkIElBY3Rpb25NYW5hZ2VyIGFjdGlvbk1ncjsKLQotCXByb3RlY3RlZCBJUHJlZmVyZW5jZVN0b3JlV3JhcHBlciBzdG9yZTsKLQotCXByb3RlY3RlZCBDb2x1bW5EZXNjcmlwdG9yW10gY29sdW1uRGVzY3JpcHRvcnM7Ci0KLQlwcm90ZWN0ZWQgQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeTsKLQotCXByaXZhdGUgSUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlcjsKLQotCXByaXZhdGUgSUNvbnRlbnRQcm92aWRlciBjb250ZW50UHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplCi0JICogCi0JICovCi0JcHJpdmF0ZSB2b2lkIGluaXQoKSB7Ci0JCS8vIGdldCBBY3Rpdml0eSBvYmplY3QKLQkJZWxlbWVudCA9IChBY3Rpdml0eSkgZ2V0RWxlbWVudCgpOwotCi0JCS8vIGdldCB0b29sa2l0Ci0JCXRvb2xraXQgPSBnZXRXaWRnZXRGYWN0b3J5KCk7Ci0KLQkJLy8gZ2V0IHByZWZlcmVuY2Ugc3RvcmUKLQkJc3RvcmUgPSBMaWJyYXJ5UGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5BYnN0cmFjdFNlY3Rpb24jY3JlYXRlQ29udHJvbHMob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlLCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5UYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9scyhDb21wb3NpdGUgcGFyZW50LAotCQkJVGFiYmVkUHJvcGVydHlTaGVldFBhZ2UgdGFiYmVkUHJvcGVydHlTaGVldFBhZ2UpIHsKLQkJc3VwZXIuY3JlYXRlQ29udHJvbHMocGFyZW50LCB0YWJiZWRQcm9wZXJ0eVNoZWV0UGFnZSk7Ci0JCWluaXQoKTsKLQotCQlwYXJlbnQuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQlwYXJlbnQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0KLQkJLy8gY3JlYXRlIHJvbGx1cCBzZWN0aW9uCi0JCWNyZWF0ZVJvbGx1cFNlY3Rpb24ocGFyZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgcm9sbHVwIHNlY3Rpb24gb24gdGhlIGNvbXBvc2l0ZQotCSAqIEBwYXJhbSBjb21wb3NpdGUKLQkgKi8KLQlwcml2YXRlIHZvaWQgY3JlYXRlUm9sbHVwU2VjdGlvbihDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JCS8vIGNyZWF0ZSBzZWN0aW9uCi0JCXNlY3Rpb24gPSBGb3JtVUkKLQkJCQkuY3JlYXRlU2VjdGlvbih0b29sa2l0LCBjb21wb3NpdGUsIFByb3BlcnRpZXNSZXNvdXJjZXMuQWN0aXZpdHlfV29ya1JvbGx1cCwgCi0JCQkJCQlQcm9wZXJ0aWVzUmVzb3VyY2VzLkFjdGl2aXR5X1dvcmtSb2xsdXBEZXNjcmlwdGlvbik7IAotCi0JCS8vIGNyZWF0ZSByb2xsdXAgY29tcG9zaXRlCi0JCXJvbGx1cENvbXBvc2l0ZSA9IEZvcm1VSS5jcmVhdGVDb21wb3NpdGUodG9vbGtpdCwgc2VjdGlvbiwgMiwgZmFsc2UpOwotCi0JCS8vIHNldCBzZWN0aW9uIGxhYmVscwotCQlzZXRTZWN0aW9uTGFiZWxzKCk7Ci0KLQkJLy8gY3JlYXRlIHZpZXdlcgotCQl2aWV3ZXIgPSBuZXcgUHJvY2Vzc1ZpZXdlcihyb2xsdXBDb21wb3NpdGUsIFNXVC5NVUxUSSB8IFNXVC5IX1NDUk9MTAotCQkJCXwgU1dULlZfU0NST0xMIHwgU1dULkJPUkRFUiB8IFNXVC5GVUxMX1NFTEVDVElPTik7Ci0JCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSk7Ci0JCWdyaWREYXRhLnZlcnRpY2FsSW5kZW50ID0gMTA7Ci0JCS8vIGdyaWREYXRhLmhlaWdodEhpbnQgPSA2MDA7Ci0JCXZpZXdlci5nZXRDb250cm9sKCkuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLQkJLy8gaW5pdEFkYXB0ZXJGYWN0b3J5Ci0JCWluaXRBZGFwdGVyRmFjdG9yeSgpOwotCi0JCS8vIHNldCB1cCBjb2x1bW5zCi0JCXZpZXdlci5zZXR1cENvbHVtbnMoY29sdW1uRGVzY3JpcHRvcnMpOwotCQlzZXRDb2x1bW5JbmRleFRvTmFtZU1hcChhZGFwdGVyRmFjdG9yeSwgY29sdW1uRGVzY3JpcHRvcnMpOwotCi0JCS8vIHNldCB1cCBwcm92aWRlcnMKLQkJdmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgRXhwb3NlZEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKAotCQkJCWFkYXB0ZXJGYWN0b3J5KSk7Ci0JCXZpZXdlcgotCQkJCS5zZXRMYWJlbFByb3ZpZGVyKG5ldyBBZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIoCi0JCQkJCQlhZGFwdGVyRmFjdG9yeSkpOwotCi0JCS8vIGRvIHJvbGwgdXAKLQkJcm9sbFVwKCk7Ci0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgcm9sbFVwKCkgewotCQkvLyBzZXQgdXAgY29sdW1ucwotCQl2aWV3ZXIuc2V0SW5wdXQoZWxlbWVudCk7Ci0JCUlCU0l0ZW1Qcm92aWRlciBhZGFwdGVyID0gKElCU0l0ZW1Qcm92aWRlcikgYWRhcHRlckZhY3RvcnkuYWRhcHQoCi0JCQkJZWxlbWVudCwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJYWRhcHRlci5zZXRSb2xsZWRVcCh0cnVlKTsKLQkJdmlld2VyLnJlZnJlc2goKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHNldENvbHVtbkluZGV4VG9OYW1lTWFwKEFkYXB0ZXJGYWN0b3J5IGZhY3RvcnksCi0JCQlDb2x1bW5EZXNjcmlwdG9yW10gY29sdW1uRGVzY3JpcHRvcnMpIHsKLQkJTWFwIGNvbHVtbkluZGV4VG9OYW1lTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb2x1bW5EZXNjcmlwdG9ycy5sZW5ndGg7IGkrKykgewotCQkJY29sdW1uSW5kZXhUb05hbWVNYXAucHV0KG5ldyBJbnRlZ2VyKGkpLCBjb2x1bW5EZXNjcmlwdG9yc1tpXS5pZCk7Ci0JCX0KLQkJKChJQ29sdW1uQXdhcmUpIGZhY3RvcnkpLnNldENvbHVtbkluZGV4VG9OYW1lTWFwKGNvbHVtbkluZGV4VG9OYW1lTWFwKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5BYnN0cmFjdFNlY3Rpb24jZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJc3VwZXIuZGlzcG9zZSgpOwotCQlpZiAoYWRhcHRlckZhY3RvcnkgIT0gbnVsbCkgewotCQkJYWRhcHRlckZhY3RvcnkuZGlzcG9zZSgpOwotCQl9Ci0JCWlmIChsYWJlbFByb3ZpZGVyICE9IG51bGwpIHsKLQkJCWxhYmVsUHJvdmlkZXIuZGlzcG9zZSgpOwotCQl9Ci0JCWlmIChjb250ZW50UHJvdmlkZXIgIT0gbnVsbCkgewotCQkJY29udGVudFByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJfQotCX0KLQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5BYnN0cmFjdFByb3BlcnR5U2VjdGlvbiNyZWZyZXNoKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWZyZXNoKCkgewotCQl0cnkgewotCQkJLy8gZ2V0IEFjdGl2aXR5IG9iamVjdAotCQkJaWYgKGdldEVsZW1lbnQoKSBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJZWxlbWVudCA9IChBY3Rpdml0eSkgZ2V0RWxlbWVudCgpOwotCi0JCQkJcm9sbFVwKCk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJbG9nZ2VyLmxvZ0Vycm9yKAotCQkJCQkiRXJyb3IgcmVmcmVzaGluZyBhY3Rpdml0eSB3b3JrIHJvbGwgdXAgc2VjdGlvbiIsIGV4KTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZSBhZGFwdGVyIGZhY3RvcnkKLQkgKgotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGluaXRBZGFwdGVyRmFjdG9yeSgpOwotCi0JLyoqCi0JICogU2V0IGxhYmVsIGZvciB0aGUgc2VjdGlvbgotCSAqCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgc2V0U2VjdGlvbkxhYmVscygpOwotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL0FjdGl2aXR5VGVhbVJvbGx1cFNlY3Rpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9BY3Rpdml0eVRlYW1Sb2xsdXBTZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxNTJmZmIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL0FjdGl2aXR5VGVhbVJvbGx1cFNlY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuUHJvY2Vzc0Zvcm1VdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJlZmVyZW5jZXMuQXBwbGljYXRpb25QcmVmZXJlbmNlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkNvbmZpZ3VyYWJsZUNvbXBvc2VkQWRhcHRlckZhY3Rvcnk7Ci0KLQotLyoqCi0gKiBUaGUgdGVhbSByb2xsdXAgc2VjdGlvbiBmb3IgYWN0aXZpdHkKLSAqIAotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjAKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZpdHlUZWFtUm9sbHVwU2VjdGlvbiBleHRlbmRzIEFjdGl2aXR5Um9sbHVwU2VjdGlvbiB7Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5BY3Rpdml0eVJvbGx1cFNlY3Rpb24jaW5pdEFkYXB0ZXJGYWN0b3J5KCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0QWRhcHRlckZhY3RvcnkoKSB7Ci0JCS8vIGdldCBjb2x1bW4gZGVzY3JpcHRvcnMKLQkJY29sdW1uRGVzY3JpcHRvcnMgPSBQcm9jZXNzRm9ybVV0aWwudG9Db2x1bW5EZXNjcmlwdG9ycyhzdG9yZQotCQkJCS5nZXRTdHJpbmcoQXBwbGljYXRpb25QcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfVEJTX0NPTFVNTlMpKTsKLQotCQkvLyBjcmVhdGUgYWRhcHRlciBmYWN0b3J5Ci0JCWFkYXB0ZXJGYWN0b3J5ID0gVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkuY3JlYXRlVEJTQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpOwotCQlpZiAoYWRhcHRlckZhY3RvcnkgaW5zdGFuY2VvZiBDb25maWd1cmFibGVDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KSB7Ci0JCQkoKENvbmZpZ3VyYWJsZUNvbXBvc2VkQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkuc2V0RmlsdGVyKGNvbmZpZ3VyYXRvcik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5BY3Rpdml0eVJvbGx1cFNlY3Rpb24jc2V0U2VjdGlvbkxhYmVscygpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0U2VjdGlvbkxhYmVscygpIHsKLQkJc2VjdGlvbi5zZXRUZXh0KFByb3BlcnRpZXNSZXNvdXJjZXMuQWN0aXZpdHlfVGVhbVJvbGx1cCk7IAotCQlzZWN0aW9uLnNldERlc2NyaXB0aW9uKFByb3BlcnRpZXNSZXNvdXJjZXMuQWN0aXZpdHlfVGVhbVJvbGx1cERlc2NyaXB0aW9uKTsgCi0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL0FjdGl2aXR5V29ya1Byb2R1Y3RzUm9sbHVwU2VjdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL0FjdGl2aXR5V29ya1Byb2R1Y3RzUm9sbHVwU2VjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NzE5YzE5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9BY3Rpdml0eVdvcmtQcm9kdWN0c1JvbGx1cFNlY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuUHJvY2Vzc0Zvcm1VdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJlZmVyZW5jZXMuQXBwbGljYXRpb25QcmVmZXJlbmNlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkNvbmZpZ3VyYWJsZUNvbXBvc2VkQWRhcHRlckZhY3Rvcnk7Ci0KLQotLyoqCi0gKiBUaGUgd29yayBwcm9kdWN0cyByb2xsdXAgc2VjdGlvbiBmb3IgYWN0aXZpdHkKLSAqIAotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjAKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZpdHlXb3JrUHJvZHVjdHNSb2xsdXBTZWN0aW9uIGV4dGVuZHMgQWN0aXZpdHlSb2xsdXBTZWN0aW9uIHsKLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLkFjdGl2aXR5Um9sbHVwU2VjdGlvbiNpbml0QWRhcHRlckZhY3RvcnkoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRBZGFwdGVyRmFjdG9yeSgpIHsKLQkJLy8gZ2V0IGNvbHVtbiBkZXNjcmlwdG9ycwotCQljb2x1bW5EZXNjcmlwdG9ycyA9IFByb2Nlc3NGb3JtVXRpbC50b0NvbHVtbkRlc2NyaXB0b3JzKHN0b3JlCi0JCQkJLmdldFN0cmluZyhBcHBsaWNhdGlvblByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9XUEJTX0NPTFVNTlMpKTsKLQotCQkvLyBjcmVhdGUgYWRhcHRlciBmYWN0b3J5Ci0JCWFkYXB0ZXJGYWN0b3J5ID0gVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkuY3JlYXRlV1BCU0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKTsKLQkJaWYgKGFkYXB0ZXJGYWN0b3J5IGluc3RhbmNlb2YgQ29uZmlndXJhYmxlQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSkgewotCQkJKChDb25maWd1cmFibGVDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJLnNldEZpbHRlcihjb25maWd1cmF0b3IpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuQWN0aXZpdHlSb2xsdXBTZWN0aW9uI3NldFNlY3Rpb25MYWJlbHMoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldFNlY3Rpb25MYWJlbHMoKSB7Ci0JCXNlY3Rpb24uc2V0VGV4dChQcm9wZXJ0aWVzUmVzb3VyY2VzLkFjdGl2aXR5X1dvcmtQcm9kdWN0c1JvbGx1cCk7IAotCQlzZWN0aW9uLnNldERlc2NyaXB0aW9uKFByb3BlcnRpZXNSZXNvdXJjZXMuQWN0aXZpdHlfV29ya1Byb2R1Y3RzUm9sbHVwRGVzY3JpcHRpb24pOyAKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvQWN0aXZpdHlXb3JrUm9sbHVwU2VjdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL0FjdGl2aXR5V29ya1JvbGx1cFNlY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2EwM2ZmNy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvQWN0aXZpdHlXb3JrUm9sbHVwU2VjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllczsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkJhc2ljRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5Db2x1bW5EZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5Qcm9jZXNzRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJlZmVyZW5jZXMuQXBwbGljYXRpb25QcmVmZXJlbmNlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkNvbmZpZ3VyYWJsZUNvbXBvc2VkQWRhcHRlckZhY3Rvcnk7Ci0KLWltcG9ydCBjb20uaWJtLmljdS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotCi0vKioKLSAqIFRoZSB3b3JrIHJvbGx1cCBzZWN0aW9uIGZvciBhY3Rpdml0eQotICogCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMAotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eVdvcmtSb2xsdXBTZWN0aW9uIGV4dGVuZHMgQWN0aXZpdHlSb2xsdXBTZWN0aW9uIHsKLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLkFjdGl2aXR5Um9sbHVwU2VjdGlvbiNpbml0QWRhcHRlckZhY3RvcnkoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRBZGFwdGVyRmFjdG9yeSgpIHsKLQkJLy8gZ2V0IGNvbHVtbiBkZXNjcmlwdG9ycwotCQljb2x1bW5EZXNjcmlwdG9ycyA9IGdldENvbHVtbkRlc2NyaXB0b3JzKCk7Ci0KLQkJLy8gY3JlYXRlIGFkYXB0ZXIgZmFjdG9yeQotCQlhZGFwdGVyRmFjdG9yeSA9IFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJLmNyZWF0ZVdCU0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKTsKLQotCQlpZiAoYWRhcHRlckZhY3RvcnkgaW5zdGFuY2VvZiBDb25maWd1cmFibGVDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KSB7Ci0JCQkoKENvbmZpZ3VyYWJsZUNvbXBvc2VkQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkuc2V0RmlsdGVyKGNvbmZpZ3VyYXRvcik7Ci0JCX0KLQotCX0KLQkKLQlwcml2YXRlIENvbHVtbkRlc2NyaXB0b3JbXSBnZXRDb2x1bW5EZXNjcmlwdG9ycygpIHsKLQkJQ29sdW1uRGVzY3JpcHRvcltdIGRlc2NyaXB0b3JzID0gdG9Db2x1bW5EZXNjcmlwdG9ycyhzdG9yZQotCQkJCS5nZXRTdHJpbmcoQXBwbGljYXRpb25QcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfV0JTX0NPTFVNTlMpKTsKLQkJCi0JCS8vIGRvbid0IHNob3cgY29sdW1uICJQcmVkZWNlc3NvcnMiCi0JCS8vCi0JCWludCBpbmRleCA9IC0xOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3JzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZihkZXNjcmlwdG9yc1tpXSA9PSBQcm9jZXNzRWRpdG9yLkNPTF9ERVNDX1BSRURFQ0VTU09SUykgewotCQkJCWluZGV4ID0gaTsKLQkJCQlicmVhazsKLQkJCX0JCQkKLQkJfQotCQlpZihpbmRleCAhPSAtMSkgewotCQkJQ29sdW1uRGVzY3JpcHRvcltdIGNvbERlc2NyaXB0b3JzID0gbmV3IENvbHVtbkRlc2NyaXB0b3JbZGVzY3JpcHRvcnMubGVuZ3RoIC0gMV07Ci0JCQlpZihpbmRleCA+IDApIHsKLQkJCQlTeXN0ZW0uYXJyYXljb3B5KGRlc2NyaXB0b3JzLCAwLCBjb2xEZXNjcmlwdG9ycywgMCwgaW5kZXgpOwotCQkJfQotCQkJaW50IGxlbiA9IGRlc2NyaXB0b3JzLmxlbmd0aCAtIDEgLSBpbmRleDsKLQkJCWlmKGxlbiA+IDApIHsKLQkJCQlTeXN0ZW0uYXJyYXljb3B5KGRlc2NyaXB0b3JzLCBpbmRleCArIDEsIGNvbERlc2NyaXB0b3JzLCBpbmRleCwgbGVuKTsKLQkJCX0KLQkJCXJldHVybiBjb2xEZXNjcmlwdG9yczsKLQkJfQotCQlyZXR1cm4gZGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogQ29udmVydCBzdHJpbmcgaW50byBjb2x1bSBkZXNjcmlwdG9yIGxpc3QKLQkgKiBAcGFyYW0gc3RyCi0JICogQHJldHVybgotCSAqIAkJTGlzdCBvZiBjb2x1bW4gZGVzY3JpcHRvcnMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEVMaXN0IHRvQ29sdW1uRGVzY3JpcHRvckxpc3QoU3RyaW5nIHN0cikgewotCQlFTGlzdCBjb2x1bW5EZXNjcmlwdG9ycyA9IG5ldyBCYXNpY0VMaXN0KCk7Ci0JCVN0cmluZ1Rva2VuaXplciB0b2tlbnMgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHN0ciwgIiwiKTsgLy8kTk9OLU5MUy0xJAotCQl3aGlsZSAodG9rZW5zLmhhc01vcmVUb2tlbnMoKSkgewotCQkJU3RyaW5nIHRva2VuID0gdG9rZW5zLm5leHRUb2tlbigpOwotCQkJLy8gRE9OIlQgUFVUIElOREVYIENPTFVNTgotCQkJaWYgKCEodG9rZW4uZXF1YWxzKFByb2Nlc3NFZGl0b3IuQ09MX0RFU0NfSUQuaWQpKSkgewotCQkJCU9iamVjdCBjb2x1bW5EZXNjcmlwdG9yID0gUHJvY2Vzc0VkaXRvci5pZFRvQ29sdW1uRGVzY3JpcHRvck1hcAotCQkJCQkJLmdldCh0b2tlbik7Ci0JCQkJaWYgKGNvbHVtbkRlc2NyaXB0b3IgIT0gbnVsbCkgewotCQkJCQljb2x1bW5EZXNjcmlwdG9ycy5hZGQoY29sdW1uRGVzY3JpcHRvcik7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBjb2x1bW5EZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZXJ0IHN0cmluZyBpbnRvIGNvbHVtbiBkZXNjcmlwdG9ycwotCSAqIEBwYXJhbSBzdHIKLQkgKiBAcmV0dXJuCi0JICogCQlsaXN0IG9mIGNvbHVtbiBkZXNjcmlwdG9ycwotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ29sdW1uRGVzY3JpcHRvcltdIHRvQ29sdW1uRGVzY3JpcHRvcnMoU3RyaW5nIHN0cikgewotCQlMaXN0IGxpc3QgPSB0b0NvbHVtbkRlc2NyaXB0b3JMaXN0KHN0cik7Ci0JCUNvbHVtbkRlc2NyaXB0b3JbXSBjb2x1bW5zID0gbmV3IENvbHVtbkRlc2NyaXB0b3JbbGlzdC5zaXplKCldOwotCQlsaXN0LnRvQXJyYXkoY29sdW1ucyk7Ci0JCXJldHVybiBjb2x1bW5zOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLkFjdGl2aXR5Um9sbHVwU2VjdGlvbiNzZXRTZWN0aW9uTGFiZWxzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRTZWN0aW9uTGFiZWxzKCkgewotCQlzZWN0aW9uLnNldFRleHQoUHJvcGVydGllc1Jlc291cmNlcy5BY3Rpdml0eV9Xb3JrUm9sbHVwKTsgCi0JCXNlY3Rpb24uc2V0RGVzY3JpcHRpb24oUHJvcGVydGllc1Jlc291cmNlcy5BY3Rpdml0eV9Xb3JrUm9sbHVwRGVzY3JpcHRpb24pOyAKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvQnJlYWtkb3duRWxlbWVudERvY3VtZW50U2VjdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL0JyZWFrZG93bkVsZW1lbnREb2N1bWVudFNlY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGUzYmVlZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvQnJlYWtkb3duRWxlbWVudERvY3VtZW50U2VjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjI1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlJbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuTWV0aG9kRWxlbWVudEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkJhc2VGb3JtUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLk1ldGhvZEZvcm1Ub29sa2l0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucmljaHRleHQuSU1ldGhvZFJpY2hUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucmljaHRleHQuSU1ldGhvZFJpY2hUZXh0RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudXRpbC5SaWNoVGV4dEltYWdlTGlua0NvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLlN0clV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklBY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuUmVzb3VyY2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuQ29udHJvbEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuQ29udHJvbExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRm9jdXNBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRm9jdXNFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLmV2ZW50cy5IeXBlcmxpbmtBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLmV2ZW50cy5IeXBlcmxpbmtFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLkZvcm1Ub29sa2l0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuSW1hZ2VIeXBlcmxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5TZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLlRhYmJlZFByb3BlcnR5U2hlZXRQYWdlOwotCi0KLS8qKgotICogVGhlIGJyZWFrZG93biBlbGVtZW50IGRvY3VtZW50YXRpb24gc2VjdGlvbgotICogCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBCcmVha2Rvd25FbGVtZW50RG9jdW1lbnRTZWN0aW9uIGV4dGVuZHMgQWJzdHJhY3RTZWN0aW9uIHsKLQotCS8vIGNvbnRyb2xzCi0JcHJvdGVjdGVkIFRleHQgcHJlZml4VGV4dDsKLQkKLQlwcm90ZWN0ZWQgTGFiZWwgcHJlZml4TGFiZWw7Ci0KLQlwcm90ZWN0ZWQgVGV4dCBicmllZkRlc2NUZXh0OwotCQotCXByb3RlY3RlZCBMYWJlbCBicmllZkRlc2NMYWJlbDsKLQkKLQlwcm90ZWN0ZWQgVGV4dCBleHRlcm5hbElEVGV4dDsKLQotCXByb3RlY3RlZCBMYWJlbCBleHRlcm5hbElETGFiZWw7Ci0KLQlwcm90ZWN0ZWQgRm9ybVRvb2xraXQgdG9vbGtpdDsKLQotCXByb3RlY3RlZCBTZWN0aW9uIGRvY3VtZW50U2VjdGlvbjsKLQotCXByb3RlY3RlZCBDb21wb3NpdGUgcGFyZW50OwotCQotCXByb3RlY3RlZCBDb21wb3NpdGUgZG9jdW1lbnRDb21wb3NpdGU7Ci0KLQlwcm90ZWN0ZWQgQ29tcG9zaXRlIGV4cGFuZERvY3VtZW50Q29tcG9zaXRlOwotCi0JcHJvdGVjdGVkIElNZXRob2RSaWNoVGV4dEVkaXRvciBjdHJsX2RvY3VtZW50X2V4cGFuZGVkOwotCi0JcHJvdGVjdGVkIElNZXRob2RSaWNoVGV4dCB1c2FnZUd1aWRhbmNlOwotCQotCXByb3RlY3RlZCBSaWNoVGV4dEltYWdlTGlua0NvbnRhaW5lciB1c2FnZUd1aWRhbmNlQ29udGFpbmVyOwotCi0JcHJvdGVjdGVkIElNZXRob2RSaWNoVGV4dCBrZXlDb25zaWRlcmF0aW9uczsKLQkKLQlwcm90ZWN0ZWQgUmljaFRleHRJbWFnZUxpbmtDb250YWluZXIga2V5Q29uc2lkZXJhdGlvbnNDb250YWluZXI7Ci0KLQlwcm90ZWN0ZWQgVGV4dCBjdHJsX2RvY3VtZW50X2V4cGFuZGVkX1RleHQ7Ci0KLQlwcm90ZWN0ZWQgSW1hZ2VIeXBlcmxpbmsgZXhwYW5kRG9jdW1lbnRMaW5rOwotCi0JcHJvdGVjdGVkIExhYmVsIGV4cGFuZERvY3VtZW50TGFiZWw7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBleHBhbmRGbGFnID0gZmFsc2U7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBleHBhbmRGbGFnVGV4dCA9IGZhbHNlOwotCi0JcHJvdGVjdGVkIElNZXRob2RSaWNoVGV4dCBhY3RpdmVDb250cm9sOwotCi0JcHJvdGVjdGVkIFRleHQgYWN0aXZlQ29udHJvbFRleHQ7Ci0KLQkvLyBlbGVtZW50Ci0JcHJvdGVjdGVkIEJyZWFrZG93bkVsZW1lbnQgZWxlbWVudDsKLQotCS8vIGFjdGlvbiBtYW5hZ2VyCi0JcHJvdGVjdGVkIElBY3Rpb25NYW5hZ2VyIGFjdGlvbk1ncjsKLQotCS8vIG1vZGlmeSBsaXN0ZW5lcgotCXByb3RlY3RlZCBNb2RpZnlMaXN0ZW5lciBtb2RlbE1vZGlmeUxpc3RlbmVyOwotCi0JcHJvdGVjdGVkIE1vZGlmeUxpc3RlbmVyIGNvbnRlbnRNb2RpZnlMaXN0ZW5lcjsKLQotCXByb3RlY3RlZCBTdHJpbmcgY29udGVudEVsZW1lbnRQYXRoOwotCi0JcHJvdGVjdGVkIFN0cmluZyB0eXBlID0gIiI7IC8vJE5PTi1OTFMtMSQKLQotCXByb3RlY3RlZCBTdHJpbmcgY29udGVudEVsZW1lbnROYW1lID0gIiI7IC8vJE5PTi1OTFMtMSQKLQotCXByb3RlY3RlZCBpbnQgaGVpZ2h0SGludCA9IDQwOwotCQotCXByaXZhdGUgTGlzdGVuZXIgdXNhZ2VHdWlkYW5jZUxpc3RlbmVyID0gbmV3IExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQllbGVtZW50ID0gKEJyZWFrZG93bkVsZW1lbnQpIGdldEVsZW1lbnQoKTsKLQkJCUlNZXRob2RSaWNoVGV4dCBjb250cm9sID0gZXhwYW5kRmxhZyA/IGN0cmxfZG9jdW1lbnRfZXhwYW5kZWQKLQkJCQkJOiB1c2FnZUd1aWRhbmNlOwotCQkJaWYgKCFjb250cm9sLmdldE1vZGlmaWVkKCkpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlTdHJpbmcgb2xkQ29udGVudCA9ICgoQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uKSBlbGVtZW50Ci0JCQkJCS5nZXRQcmVzZW50YXRpb24oKSkuZ2V0VXNhZ2VHdWlkYW5jZSgpOwotCQkJaWYgKCgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpLm11c3RSZXN0b3JlVmFsdWUoCi0JCQkJCXVzYWdlR3VpZGFuY2UsIG9sZENvbnRlbnQpKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJU3RyaW5nIG5ld0NvbnRlbnQgPSBjb250cm9sLmdldFRleHQoKTsKLQkJCWlmICghbmV3Q29udGVudC5lcXVhbHMob2xkQ29udGVudCkpIHsKLQkJCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuU0VULCBlbGVtZW50Ci0JCQkJCQkuZ2V0UHJlc2VudGF0aW9uKCksIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkuZ2V0QnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uX1VzYWdlR3VpZGFuY2UoKSwKLQkJCQkJCW5ld0NvbnRlbnQsIC0xKTsKLQkJCX0KLQkJfQotCX07Ci0KLQlwcml2YXRlIExpc3RlbmVyIGtleUNvbnNpZGVyYXRpb25zTGlzdGVuZXIgPSBuZXcgTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCWVsZW1lbnQgPSAoQnJlYWtkb3duRWxlbWVudCkgZ2V0RWxlbWVudCgpOwotCQkJSU1ldGhvZFJpY2hUZXh0IGNvbnRyb2wgPSBleHBhbmRGbGFnID8gY3RybF9kb2N1bWVudF9leHBhbmRlZAotCQkJCQk6IGtleUNvbnNpZGVyYXRpb25zOwotCQkJaWYgKCFjb250cm9sLmdldE1vZGlmaWVkKCkpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlTdHJpbmcgb2xkQ29udGVudCA9ICgoQ29udGVudERlc2NyaXB0aW9uKSBlbGVtZW50LmdldFByZXNlbnRhdGlvbigpKQotCQkJCQkuZ2V0S2V5Q29uc2lkZXJhdGlvbnMoKTsKLQkJCWlmICgoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpKS5tdXN0UmVzdG9yZVZhbHVlKAotCQkJCQlrZXlDb25zaWRlcmF0aW9ucywgb2xkQ29udGVudCkpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlTdHJpbmcgbmV3Q29udGVudCA9IGNvbnRyb2wuZ2V0VGV4dCgpOwotCQkJaWYgKCFuZXdDb250ZW50LmVxdWFscyhvbGRDb250ZW50KSkgewotCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5TRVQsIGVsZW1lbnQKLQkJCQkJCS5nZXRQcmVzZW50YXRpb24oKSwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCS5nZXRDb250ZW50RGVzY3JpcHRpb25fS2V5Q29uc2lkZXJhdGlvbnMoKSwgbmV3Q29udGVudCwKLQkJCQkJCS0xKTsKLQkJCX0KLQkJfQotCX07Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdCgpIHsKLQkJLy8gZ2V0IEJyZWFrZG93bkVsZW1lbnQgb2JqZWN0Ci0JCWVsZW1lbnQgPSAoQnJlYWtkb3duRWxlbWVudCkgZ2V0RWxlbWVudCgpOwotCi0JCS8vIGdldCB0b29sa2l0Ci0JCXRvb2xraXQgPSBnZXRXaWRnZXRGYWN0b3J5KCk7Ci0KLQkJLy8gZ2V0IGFjdGlvbiBtYW5hZ2VyCi0JCWFjdGlvbk1nciA9IEVQRlByb3BlcnR5U2hlZXRQYWdlLmdldEFjdGlvbk1hbmFnZXIoKTsKLQotCQkvLyBzZXQgY29udGVudCBlbGVtZW50IHBhdGgKLQkJY29udGVudEVsZW1lbnRQYXRoID0gUmVzb3VyY2VIZWxwZXIuZ2V0Rm9sZGVyQWJzb2x1dGVQYXRoKGVsZW1lbnQpOyAKLQl9Ci0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLkFic3RyYWN0U2VjdGlvbiNjcmVhdGVDb250cm9scyhvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUsIG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLlRhYmJlZFByb3BlcnR5U2hlZXRQYWdlKQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2xzKENvbXBvc2l0ZSBwYXJlbnQsCi0JCQlUYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZSB0YWJiZWRQcm9wZXJ0eVNoZWV0UGFnZSkgewotCQl0aGlzLnBhcmVudCA9IHBhcmVudDsKLQkJc3VwZXIuY3JlYXRlQ29udHJvbHMocGFyZW50LCB0YWJiZWRQcm9wZXJ0eVNoZWV0UGFnZSk7Ci0JCWluaXQoKTsKLQotCQlwYXJlbnQuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQlwYXJlbnQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0KLQkJLy8gY3JlYXRlIERvY21lbnQgc2VjdGlvbgotCQljcmVhdGVEb2N1bWVudFNlY3Rpb24ocGFyZW50KTsKLQotCQkvLyBhZGQgbGlzdGVuZXJzCi0JCWFkZExpc3RlbmVycygpOwotCi0JCS8vIHVwZGF0ZSBjb250cm9scwotCQl1cGRhdGVDb250cm9scygpOwotCX0KLQotCS8qKgotCSAqIEFkZCBsaXN0ZW5lcnMKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRMaXN0ZW5lcnMoKSB7Ci0KLQkJcGFyZW50LmFkZENvbnRyb2xMaXN0ZW5lcihuZXcgQ29udHJvbExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgY29udHJvbFJlc2l6ZWQoQ29udHJvbEV2ZW50IGUpIHsKLQkJCQlpZiAoY3RybF9kb2N1bWVudF9leHBhbmRlZCAhPSBudWxsKSB7Ci0JCQkJCSgoR3JpZERhdGEpIGN0cmxfZG9jdW1lbnRfZXhwYW5kZWQuZ2V0TGF5b3V0RGF0YSgpKS5oZWlnaHRIaW50ID0gZ2V0UmljaFRleHRFZGl0b3JIZWlnaHQoKTsKLQkJCQkJKChHcmlkRGF0YSkgY3RybF9kb2N1bWVudF9leHBhbmRlZC5nZXRMYXlvdXREYXRhKCkpLndpZHRoSGludCA9IGdldFJpY2hUZXh0RWRpdG9yV2lkdGgoKTsKLQkJCQl9Ci0JCQkJcGFyZW50LmxheW91dCh0cnVlLCB0cnVlKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgY29udHJvbE1vdmVkKENvbnRyb2xFdmVudCBlKSB7Ci0JCQl9Ci0JCX0pOwotCi0JCQotCQlwcmVmaXhUZXh0LmFkZEZvY3VzTGlzdGVuZXIobmV3IEZvY3VzQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGZvY3VzR2FpbmVkKEZvY3VzRXZlbnQgZSkgewotCQkJCSgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpLnNldEN1cnJlbnRGZWF0dXJlRWRpdG9yKGUud2lkZ2V0LAotCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QnJlYWtkb3duRWxlbWVudF9QcmVmaXgoKSk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGZvY3VzTG9zdChGb2N1c0V2ZW50IGUpIHsKLQkJCQllbGVtZW50ID0gKEJyZWFrZG93bkVsZW1lbnQpIGdldEVsZW1lbnQoKTsKLQkJCQlTdHJpbmcgb2xkQ29udGVudCA9IGVsZW1lbnQuZ2V0UHJlZml4KCk7Ci0JCQkJaWYgKCgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpLm11c3RSZXN0b3JlVmFsdWUoCi0JCQkJCQlwcmVmaXhUZXh0LCBvbGRDb250ZW50KSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCVN0cmluZyBuZXdDb250ZW50ID0gU3RyVXRpbC5nZXRQbGFpblRleHQocHJlZml4VGV4dC5nZXRUZXh0KCkpOwotCQkJCWlmICghbmV3Q29udGVudC5lcXVhbHMob2xkQ29udGVudCkpIHsKLQkJCQkJYm9vbGVhbiBzdGF0dXMgPSBhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuU0VULAotCQkJCQkJCWVsZW1lbnQsIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkuZ2V0QnJlYWtkb3duRWxlbWVudF9QcmVmaXgoKSwgbmV3Q29udGVudCwKLQkJCQkJCQktMSk7Ci0JCQkJCWlmIChzdGF0dXMpIHsKLQkJCQkJCXByZWZpeFRleHQuc2V0VGV4dChuZXdDb250ZW50KTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJYnJpZWZEZXNjVGV4dC5hZGRGb2N1c0xpc3RlbmVyKG5ldyBGb2N1c0FkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBmb2N1c0dhaW5lZChGb2N1c0V2ZW50IGUpIHsKLQkJCQkoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpKS5zZXRDdXJyZW50RmVhdHVyZUVkaXRvcihlLndpZGdldCwKLQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE1ldGhvZEVsZW1lbnRfQnJpZWZEZXNjcmlwdGlvbigpKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgZm9jdXNMb3N0KEZvY3VzRXZlbnQgZSkgewotCQkJCWVsZW1lbnQgPSAoQnJlYWtkb3duRWxlbWVudCkgZ2V0RWxlbWVudCgpOwotCQkJCVN0cmluZyBvbGRDb250ZW50ID0gZWxlbWVudC5nZXRCcmllZkRlc2NyaXB0aW9uKCk7Ci0JCQkJaWYgKCgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpLm11c3RSZXN0b3JlVmFsdWUoCi0JCQkJCQlicmllZkRlc2NUZXh0LCBvbGRDb250ZW50KSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCVN0cmluZyBuZXdDb250ZW50ID0gU3RyVXRpbC5nZXRQbGFpblRleHQoYnJpZWZEZXNjVGV4dAotCQkJCQkJLmdldFRleHQoKSk7Ci0JCQkJaWYgKCFuZXdDb250ZW50LmVxdWFscyhvbGRDb250ZW50KSkgewotCQkJCQlib29sZWFuIHN0YXR1cyA9IGFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5TRVQsCi0JCQkJCQkJZWxlbWVudCwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCS5nZXRNZXRob2RFbGVtZW50X0JyaWVmRGVzY3JpcHRpb24oKSwKLQkJCQkJCQluZXdDb250ZW50LCAtMSk7Ci0JCQkJCWlmIChzdGF0dXMpIHsKLQkJCQkJCWJyaWVmRGVzY1RleHQuc2V0VGV4dChuZXdDb250ZW50KTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JCQotCQkKLQkJZXh0ZXJuYWxJRFRleHQuYWRkRm9jdXNMaXN0ZW5lcihuZXcgRm9jdXNBZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgZm9jdXNHYWluZWQoRm9jdXNFdmVudCBlKSB7Ci0JCQkJKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkuc2V0Q3VycmVudEZlYXR1cmVFZGl0b3IoZS53aWRnZXQsCi0JCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb250ZW50RGVzY3JpcHRpb25fRXh0ZXJuYWxJZCgpKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgZm9jdXNMb3N0KEZvY3VzRXZlbnQgZSkgewotCQkJCWVsZW1lbnQgPSAoQnJlYWtkb3duRWxlbWVudCkgZ2V0RWxlbWVudCgpOwkJCQkKLQkJCQkKLQkJCQlTdHJpbmcgb2xkQ29udGVudCA9IGVsZW1lbnQuZ2V0UHJlc2VudGF0aW9uKCkuZ2V0RXh0ZXJuYWxJZCgpOwotCQkJCWlmICgoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpKS5tdXN0UmVzdG9yZVZhbHVlKAotCQkJCQkJZXh0ZXJuYWxJRFRleHQsIG9sZENvbnRlbnQpKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJU3RyaW5nIG5ld0NvbnRlbnQgPSBTdHJVdGlsLmdldFBsYWluVGV4dChleHRlcm5hbElEVGV4dAotCQkJCQkJLmdldFRleHQoKSk7Ci0JCQkJaWYgKCFuZXdDb250ZW50LmVxdWFscyhvbGRDb250ZW50KSkgewotCQkJCQlib29sZWFuIHN0YXR1cyA9IGFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5TRVQsCi0JCQkJCQkJZWxlbWVudC5nZXRQcmVzZW50YXRpb24oKSwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCS5nZXRDb250ZW50RGVzY3JpcHRpb25fRXh0ZXJuYWxJZCgpLAotCQkJCQkJCW5ld0NvbnRlbnQsIC0xKTsKLQkJCQkJaWYgKHN0YXR1cykgewotCQkJCQkJZXh0ZXJuYWxJRFRleHQuc2V0VGV4dChuZXdDb250ZW50KTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJQnJlYWtkb3duRWxlbWVudCBlbGVtZW50ID0gZ2V0RWxlbWVudCgpOwotCQkKLQkJdXNhZ2VHdWlkYW5jZS5zZXRNb2RhbE9iamVjdChlbGVtZW50KTsKLQkJdXNhZ2VHdWlkYW5jZS5zZXRNb2RhbE9iamVjdEZlYXR1cmUoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uX1VzYWdlR3VpZGFuY2UoKSk7Ci0JCXVzYWdlR3VpZGFuY2UuYWRkTGlzdGVuZXIoU1dULkRlYWN0aXZhdGUsIHVzYWdlR3VpZGFuY2VMaXN0ZW5lcik7Ci0JCQotCQlrZXlDb25zaWRlcmF0aW9ucy5zZXRNb2RhbE9iamVjdChlbGVtZW50KTsKLQkJa2V5Q29uc2lkZXJhdGlvbnMuc2V0TW9kYWxPYmplY3RGZWF0dXJlKFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbnRlbnREZXNjcmlwdGlvbl9LZXlDb25zaWRlcmF0aW9ucygpKTsKLQkJa2V5Q29uc2lkZXJhdGlvbnMKLQkJCQkuYWRkTGlzdGVuZXIoU1dULkRlYWN0aXZhdGUsIGtleUNvbnNpZGVyYXRpb25zTGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIEFkZCBkb2N1bWVudGF0aW9uIHNlY3Rpb24gb24gdGhlIGdpdmVuIGNvbXBvc2l0ZQotCSAqIEBwYXJhbSBjb21wb3NpdGUKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEb2N1bWVudFNlY3Rpb24oQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotCQlpbnQgaG9yaXpvbnRhbFNwYW4gPSAyOwotCi0JCS8vIGNyZWF0ZSBkb2N1bWVudCBzZWN0aW9uCi0JCWRvY3VtZW50U2VjdGlvbiA9IEZvcm1VSQotCQkJCS5jcmVhdGVTZWN0aW9uKAotCQkJCQkJdG9vbGtpdCwKLQkJCQkJCWNvbXBvc2l0ZSwKLQkJCQkJCVByb3BlcnRpZXNSZXNvdXJjZXMuUHJvY2Vzc19Eb2N1bWVudEluZm9ybWF0aW9uVGl0bGUsIAotCQkJCQkJUHJvcGVydGllc1Jlc291cmNlcy5iaW5kKFByb3BlcnRpZXNSZXNvdXJjZXMuUHJvY2Vzc19kb2N1bWVudEluZm9ybWF0aW9uRGVzY3JpcHRpb24sIFByb3BlcnRpZXNVdGlsLmdldFR5cGVMb3dlcihlbGVtZW50KSkpOyAKLQotCQkvLyBjcmVhdGUgZG9jdW1lbnQgY29tcG9zaXRlCi0JCWRvY3VtZW50Q29tcG9zaXRlID0gRm9ybVVJLmNyZWF0ZUNvbXBvc2l0ZSh0b29sa2l0LCBkb2N1bWVudFNlY3Rpb24sIDMsCi0JCQkJZmFsc2UpOwotCi0JCS8vIHByZWZpeAotCQlwcmVmaXhMYWJlbCA9IEZvcm1VSS5jcmVhdGVMYWJlbCh0b29sa2l0LCBkb2N1bWVudENvbXBvc2l0ZSwgUHJvcGVydGllc1Jlc291cmNlcy5Qcm9jZXNzX3ByZWZpeCwgaG9yaXpvbnRhbFNwYW4pOyAKLQkJcHJlZml4VGV4dCA9IEZvcm1VSS5jcmVhdGVUZXh0KHRvb2xraXQsIGRvY3VtZW50Q29tcG9zaXRlLCBoZWlnaHRIaW50KTsKLQotCQkvLyBicmllZiBkZXNjcmlwdGlvbgotCQlicmllZkRlc2NMYWJlbCA9IEZvcm1VSS5jcmVhdGVMYWJlbCh0b29sa2l0LCBkb2N1bWVudENvbXBvc2l0ZSwgUHJvcGVydGllc1Jlc291cmNlcy5Qcm9jZXNzX2JyaWVmRGVzY3JpcHRpb24sIGhvcml6b250YWxTcGFuKTsgCi0JCWJyaWVmRGVzY1RleHQgPSBGb3JtVUkuY3JlYXRlVGV4dCh0b29sa2l0LCBkb2N1bWVudENvbXBvc2l0ZSwKLQkJCQloZWlnaHRIaW50KTsKLQkJCi0JCS8vIGV4dGVybmFsIElECi0JCWV4dGVybmFsSURMYWJlbCA9IEZvcm1VSS5jcmVhdGVMYWJlbCh0b29sa2l0LCBkb2N1bWVudENvbXBvc2l0ZSwgQXV0aG9yaW5nVUlSZXNvdXJjZXMuUHJvY2Vzc19FeHRlcm5hbElELCBob3Jpem9udGFsU3Bhbik7IAotCQlleHRlcm5hbElEVGV4dCA9IEZvcm1VSS5jcmVhdGVUZXh0KHRvb2xraXQsIGRvY3VtZW50Q29tcG9zaXRlKTsKLQotCQkvLyBjcmVhdGUgdXNhZ2UgZ3VpZGFuY2UKLQkJdXNhZ2VHdWlkYW5jZUNvbnRhaW5lciA9IEZvcm1VSS5jcmVhdGVSaWNoVGV4dFdpdGhMaW5rKHRvb2xraXQsCi0JCQkJZG9jdW1lbnRDb21wb3NpdGUsIGhlaWdodEhpbnQsIGNvbnRlbnRFbGVtZW50UGF0aCwgZWxlbWVudCwKLQkJCQlQcm9wZXJ0aWVzUmVzb3VyY2VzLlByb2Nlc3NfdXNhZ2VHdWlkYW5jZSk7Ci0JCWFkZEh5cGVyTGlua0xpc3RlbmVyKHVzYWdlR3VpZGFuY2VDb250YWluZXIubGluayk7Ci0JCXVzYWdlR3VpZGFuY2UgPSB1c2FnZUd1aWRhbmNlQ29udGFpbmVyLnJpY2hUZXh0OwotCi0JCS8vIGNyZWF0ZSBrZXkgY29uc2lkZXJhdGlvbnMKLQkJa2V5Q29uc2lkZXJhdGlvbnNDb250YWluZXIgPSBGb3JtVUkuY3JlYXRlUmljaFRleHRXaXRoTGluayh0b29sa2l0LAotCQkJCWRvY3VtZW50Q29tcG9zaXRlLCBoZWlnaHRIaW50LCBjb250ZW50RWxlbWVudFBhdGgsIGVsZW1lbnQsCi0JCQkJUHJvcGVydGllc1Jlc291cmNlcy5CcmVha2Rvd25FbGVtZW50X2tleUNvbnNpZGVyYXRpb25zKTsKLQkJYWRkSHlwZXJMaW5rTGlzdGVuZXIoa2V5Q29uc2lkZXJhdGlvbnNDb250YWluZXIubGluayk7Ci0JCWtleUNvbnNpZGVyYXRpb25zID0ga2V5Q29uc2lkZXJhdGlvbnNDb250YWluZXIucmljaFRleHQ7Ci0KLQkJLy8gY3JlYXRlIGV4cGFuZGVkIGNvbXBvc2l0ZQotCQlleHBhbmREb2N1bWVudENvbXBvc2l0ZSA9IEZvcm1VSS5jcmVhdGVDb21wb3NpdGUodG9vbGtpdCwKLQkJCQlkb2N1bWVudFNlY3Rpb24sIDIsIHRydWUpOwotCi0JCS8vIEh5cGVybGluayBkZXNjCi0JCWV4cGFuZERvY3VtZW50TGluayA9IEZvcm1VSS5jcmVhdGVJbWFnZUh5cGVyTGluayh0b29sa2l0LAotCQkJCWV4cGFuZERvY3VtZW50Q29tcG9zaXRlLCBBdXRob3JpbmdVSUltYWdlcy5JTUdfRVhQQU5ERUQsCi0JCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuY2xvc2VSVEUpOyAKLQkJYWRkSHlwZXJMaW5rTGlzdGVuZXIoZXhwYW5kRG9jdW1lbnRMaW5rKTsKLQotCQkvLyBleHBhbmQgbGFiZWwKLQkJZXhwYW5kRG9jdW1lbnRMYWJlbCA9IEJhc2VGb3JtUGFnZS5jcmVhdGVEZWNvcmF0ZWRMYWJlbCh0b29sa2l0LCBleHBhbmREb2N1bWVudENvbXBvc2l0ZSwgIiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkSHlwZXJMaW5rTGlzdGVuZXIoSW1hZ2VIeXBlcmxpbmsgbGluaykgewotCQlsaW5rLmFkZEh5cGVybGlua0xpc3RlbmVyKG5ldyBIeXBlcmxpbmtBZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgbGlua0FjdGl2YXRlZChIeXBlcmxpbmtFdmVudCBlKSB7Ci0JCQkJdG9nZ2xlKGUpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSU1ldGhvZFJpY2hUZXh0RWRpdG9yIHRvZ2dsZShIeXBlcmxpbmtFdmVudCBlKSB7Ci0JCUlNZXRob2RSaWNoVGV4dCBjdHJsID0gKElNZXRob2RSaWNoVGV4dCkgZS5nZXRIcmVmKCk7Ci0JCWlmIChjdHJsX2RvY3VtZW50X2V4cGFuZGVkID09IG51bGwpIHsKLQkJCWN0cmxfZG9jdW1lbnRfZXhwYW5kZWQgPSBNZXRob2RGb3JtVG9vbGtpdC5jcmVhdGVSaWNoVGV4dEVkaXRvcigKLQkJCQkJdG9vbGtpdCwgZXhwYW5kRG9jdW1lbnRDb21wb3NpdGUsCi0JCQkJCSIiLCBTV1QuTVVMVEkgfCBTV1QuV1JBUCwgY29udGVudEVsZW1lbnRQYXRoLCBlbGVtZW50LCBleHBhbmREb2N1bWVudExhYmVsLCBnZXRFZGl0b3IoKS5nZXRFZGl0b3JTaXRlKCkpOyAvLyROT04tTkxTLTEkCi0JCQl7Ci0JCQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJCQlncmlkRGF0YS5oZWlnaHRIaW50ID0gZ2V0UmljaFRleHRFZGl0b3JIZWlnaHQoKTsKLQkJCQlncmlkRGF0YS53aWR0aEhpbnQgPSBnZXRSaWNoVGV4dEVkaXRvcldpZHRoKCk7Ci0JCQkJZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQkJCWN0cmxfZG9jdW1lbnRfZXhwYW5kZWQuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCQkJLy8gZG9lc24ndCBzZWVtIHRvIHdvcmsgLSBSVEUgaXMgbm90IHByb3BlciB3aWR0aCB1bnRpbCB3aW5kb3cgaXMgcmVzaXplZAotLy8JCQkJKChHcmlkRGF0YSlleHBhbmREb2N1bWVudENvbXBvc2l0ZS5nZXRMYXlvdXREYXRhKCkpLndpZHRoSGludCA9IGdldFJpY2hUZXh0RWRpdG9yV2lkdGgoKTsKLS8vCQkJCSgoR3JpZERhdGEpcGFyZW50LmdldExheW91dERhdGEoKSkud2lkdGhIaW50ID0gZ2V0UmljaFRleHRFZGl0b3JXaWR0aCgpOwotLy8JCQkJcGFyZW50LmxheW91dCh0cnVlLCB0cnVlKTsKLQkJCX0KLQotCQkJY3RybF9kb2N1bWVudF9leHBhbmRlZC5hZGRNb2RpZnlMaXN0ZW5lcihjb250ZW50TW9kaWZ5TGlzdGVuZXIpOwotCQl9Ci0KLQkJaWYgKGV4cGFuZEZsYWcpIHsKLQkJCWRvY3VtZW50Q29tcG9zaXRlLnNldFZpc2libGUodHJ1ZSk7Ci0JCQlkb2N1bWVudFNlY3Rpb24uc2V0Q2xpZW50KGRvY3VtZW50Q29tcG9zaXRlKTsKLQotCQkJZXhwYW5kRG9jdW1lbnRDb21wb3NpdGUuc2V0VmlzaWJsZShmYWxzZSk7Ci0KLQkJCWN0cmwgPSBnZXRBY3RpdmVSaWNoVGV4dENvbnRyb2woKTsKLQkJCWN0cmwuc2V0VGV4dChjdHJsX2RvY3VtZW50X2V4cGFuZGVkLmdldFRleHQoKSk7Ci0KLQkJCWZvciAoSXRlcmF0b3IgaSA9IGN0cmwuZ2V0TGlzdGVuZXJzKCk7IGkuaGFzTmV4dCgpOykgewotCQkJCVJpY2hUZXh0TGlzdGVuZXIgbGlzdGVuZXIgPSAoUmljaFRleHRMaXN0ZW5lcikgaS5uZXh0KCk7Ci0JCQkJY3RybF9kb2N1bWVudF9leHBhbmRlZC5yZW1vdmVMaXN0ZW5lcihsaXN0ZW5lci5nZXRFdmVudFR5cGUoKSwKLQkJCQkJCWxpc3RlbmVyLmdldExpc3RlbmVyKCkpOwotCQkJfQotCi0JCQlpZiAoY3RybF9kb2N1bWVudF9leHBhbmRlZC5nZXRNb2RpZmllZCgpKSB7Ci0JCQkJKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkKLQkJCQkJCS5zYXZlTW9kaWZpZWRSaWNoVGV4dChjdHJsX2RvY3VtZW50X2V4cGFuZGVkKTsKLQkJCX0KLQotCQkJY3RybC5zZXRGb2N1cygpOwotCQl9IGVsc2UgewotCQkJLy8gZXhwYW5kZWQKLQkJCWRvY3VtZW50Q29tcG9zaXRlLnNldFZpc2libGUoZmFsc2UpOwotCQkJZG9jdW1lbnRTZWN0aW9uLnNldENsaWVudChleHBhbmREb2N1bWVudENvbXBvc2l0ZSk7Ci0KLQkJCWV4cGFuZERvY3VtZW50Q29tcG9zaXRlLnNldFZpc2libGUodHJ1ZSk7Ci0KLQkJCWV4cGFuZERvY3VtZW50TGFiZWwuc2V0VGV4dCgoU3RyaW5nKSAoKEltYWdlSHlwZXJsaW5rKSBlCi0JCQkJCS5nZXRTb3VyY2UoKSkuZ2V0RGF0YSgiVGl0bGUiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCXNldEFjdGl2ZVJpY2hUZXh0Q29udHJvbChjdHJsKTsKLQkJCWN0cmxfZG9jdW1lbnRfZXhwYW5kZWQuc2V0SW5pdGlhbFRleHQoY3RybC5nZXRUZXh0KCkpOwotCQkJY3RybF9kb2N1bWVudF9leHBhbmRlZC5zZXRNb2RhbE9iamVjdChjdHJsLmdldE1vZGFsT2JqZWN0KCkpOwotCQkJY3RybF9kb2N1bWVudF9leHBhbmRlZC5zZXRNb2RhbE9iamVjdEZlYXR1cmUoY3RybAotCQkJCQkuZ2V0TW9kYWxPYmplY3RGZWF0dXJlKCkpOwotCQkJY3RybF9kb2N1bWVudF9leHBhbmRlZC5zZXRGaW5kUmVwbGFjZUFjdGlvbihjdHJsLmdldEZpbmRSZXBsYWNlQWN0aW9uKCkpOwotCi0JCQlmb3IgKEl0ZXJhdG9yIGkgPSBjdHJsLmdldExpc3RlbmVycygpOyBpLmhhc05leHQoKTspIHsKLQkJCQlSaWNoVGV4dExpc3RlbmVyIGxpc3RlbmVyID0gKFJpY2hUZXh0TGlzdGVuZXIpIGkubmV4dCgpOwotCQkJCWN0cmxfZG9jdW1lbnRfZXhwYW5kZWQuYWRkTGlzdGVuZXIobGlzdGVuZXIuZ2V0RXZlbnRUeXBlKCksCi0JCQkJCQlsaXN0ZW5lci5nZXRMaXN0ZW5lcigpKTsKLQkJCX0KLQotCQl9Ci0KLQkJZG9jdW1lbnRTZWN0aW9uLmxheW91dCh0cnVlKTsKLQotCQkvLyBzZXQgZWRpdGFibGUKLQkJaWYgKGN0cmxfZG9jdW1lbnRfZXhwYW5kZWQgIT0gbnVsbCkKLQkJCWN0cmxfZG9jdW1lbnRfZXhwYW5kZWQuc2V0RWRpdGFibGUoZWRpdGFibGUpOwotCi0JCWV4cGFuZEZsYWcgPSAhZXhwYW5kRmxhZzsKLQkJcmV0dXJuIGN0cmxfZG9jdW1lbnRfZXhwYW5kZWQ7Ci0JfQotCi0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLkFic3RyYWN0UHJvcGVydHlTZWN0aW9uI3JlZnJlc2goKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlZnJlc2goKSB7Ci0JCXRyeSB7Ci0JCQlpZiAoZ2V0RWxlbWVudCgpIGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudCkgewotCQkJCSgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpLnNhdmVNb2RpZmllZFJpY2hUZXh0KCk7Ci0KLQkJCQllbGVtZW50ID0gKEJyZWFrZG93bkVsZW1lbnQpIGdldEVsZW1lbnQoKTsKLQkJCQlCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24gY29udGVudCA9IChCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24pIGVsZW1lbnQKLQkJCQkJCS5nZXRQcmVzZW50YXRpb24oKTsKLQotCQkJCS8vIHVwZGF0ZSBzZWN0aW9uIG5hbWUKLQkJCQlkb2N1bWVudFNlY3Rpb24KLQkJCQkJCS5zZXREZXNjcmlwdGlvbihQcm9wZXJ0aWVzUmVzb3VyY2VzLmJpbmQoUHJvcGVydGllc1Jlc291cmNlcy5Qcm9jZXNzX2RvY3VtZW50SW5mb3JtYXRpb25EZXNjcmlwdGlvbiwgUHJvcGVydGllc1V0aWwuZ2V0VHlwZUxvd2VyKGVsZW1lbnQpKSk7IAotCi0JCQkJaWYgKG1vZGVsTW9kaWZ5TGlzdGVuZXIgIT0gbnVsbCkgewotCQkJCQlwcmVmaXhUZXh0LnJlbW92ZU1vZGlmeUxpc3RlbmVyKG1vZGVsTW9kaWZ5TGlzdGVuZXIpOwotCQkJCQlicmllZkRlc2NUZXh0LnJlbW92ZU1vZGlmeUxpc3RlbmVyKG1vZGVsTW9kaWZ5TGlzdGVuZXIpOwotCQkJCQkKLQkJCQl9Ci0KLQkJCQlpZiAoY29udGVudE1vZGlmeUxpc3RlbmVyICE9IG51bGwpIHsKLQkJCQkJZXh0ZXJuYWxJRFRleHQucmVtb3ZlTW9kaWZ5TGlzdGVuZXIoY29udGVudE1vZGlmeUxpc3RlbmVyKTsKLQkJCQkJdXNhZ2VHdWlkYW5jZS5yZW1vdmVNb2RpZnlMaXN0ZW5lcihjb250ZW50TW9kaWZ5TGlzdGVuZXIpOwotCQkJCQlrZXlDb25zaWRlcmF0aW9ucwotCQkJCQkJCS5yZW1vdmVNb2RpZnlMaXN0ZW5lcihjb250ZW50TW9kaWZ5TGlzdGVuZXIpOwotCQkJCX0KLQotCQkJCW1vZGVsTW9kaWZ5TGlzdGVuZXIgPSBnZXRFZGl0b3IoKS5jcmVhdGVNb2RpZnlMaXN0ZW5lcihlbGVtZW50KTsKLQkJCQljb250ZW50TW9kaWZ5TGlzdGVuZXIgPSBnZXRFZGl0b3IoKS5jcmVhdGVNb2RpZnlMaXN0ZW5lcigKLQkJCQkJCWVsZW1lbnQuZ2V0UHJlc2VudGF0aW9uKCkpOwotCi0JCQkJaWYgKG1vZGVsTW9kaWZ5TGlzdGVuZXIgIT0gbnVsbAotCQkJCQkJJiYgbW9kZWxNb2RpZnlMaXN0ZW5lciBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnRFZGl0b3IuTW9kaWZ5TGlzdGVuZXIpIHsKLQkJCQkJKChNZXRob2RFbGVtZW50RWRpdG9yLk1vZGlmeUxpc3RlbmVyKSBtb2RlbE1vZGlmeUxpc3RlbmVyKQotCQkJCQkJCS5zZXRFbGVtZW50KGVsZW1lbnQpOwotCQkJCQkoKE1ldGhvZEVsZW1lbnRFZGl0b3IuTW9kaWZ5TGlzdGVuZXIpIG1vZGVsTW9kaWZ5TGlzdGVuZXIpCi0JCQkJCQkJLnNldERpc2FibGUodHJ1ZSk7Ci0JCQkJfQotCi0JCQkJaWYgKGNvbnRlbnRNb2RpZnlMaXN0ZW5lciAhPSBudWxsCi0JCQkJCQkmJiBjb250ZW50TW9kaWZ5TGlzdGVuZXIgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50RWRpdG9yLk1vZGlmeUxpc3RlbmVyKSB7Ci0JCQkJCSgoTWV0aG9kRWxlbWVudEVkaXRvci5Nb2RpZnlMaXN0ZW5lcikgY29udGVudE1vZGlmeUxpc3RlbmVyKQotCQkJCQkJCS5zZXRFbGVtZW50KGVsZW1lbnQuZ2V0UHJlc2VudGF0aW9uKCkpOwotCQkJCQkoKE1ldGhvZEVsZW1lbnRFZGl0b3IuTW9kaWZ5TGlzdGVuZXIpIGNvbnRlbnRNb2RpZnlMaXN0ZW5lcikKLQkJCQkJCQkuc2V0RGlzYWJsZSh0cnVlKTsKLQkJCQl9Ci0KLQkJCQlwcmVmaXhUZXh0LnNldFRleHQoZWxlbWVudC5nZXRQcmVmaXgoKSk7Ci0JCQkJYnJpZWZEZXNjVGV4dC5zZXRUZXh0KGVsZW1lbnQuZ2V0QnJpZWZEZXNjcmlwdGlvbigpKTsKLQkJCQlleHRlcm5hbElEVGV4dC5zZXRUZXh0KGNvbnRlbnQuZ2V0RXh0ZXJuYWxJZCgpKTsKLQotCQkJCXVzYWdlR3VpZGFuY2Uuc2V0VGV4dChjb250ZW50LmdldFVzYWdlR3VpZGFuY2UoKSk7Ci0JCQkJa2V5Q29uc2lkZXJhdGlvbnMuc2V0VGV4dChjb250ZW50LmdldEtleUNvbnNpZGVyYXRpb25zKCkpOwotCi0JCQkJaWYgKGV4cGFuZEZsYWcpIHsKLQkJCQkJaWYgKGV4cGFuZERvY3VtZW50TGFiZWwuZ2V0VGV4dCgpLmVxdWFscygKLQkJCQkJCQlQcm9wZXJ0aWVzUmVzb3VyY2VzLlByb2Nlc3NfdXNhZ2VHdWlkYW5jZSkpIAotCQkJCQl7Ci0JCQkJCQljdHJsX2RvY3VtZW50X2V4cGFuZGVkLnNldFRleHQoY29udGVudAotCQkJCQkJCQkuZ2V0VXNhZ2VHdWlkYW5jZSgpKTsKLQkJCQkJCWN0cmxfZG9jdW1lbnRfZXhwYW5kZWQuc2V0U2VsZWN0aW9uKDApOwotCQkJCQkJY3RybF9kb2N1bWVudF9leHBhbmRlZC5zZXRNb2RhbE9iamVjdChjb250ZW50KTsKLQkJCQkJCWN0cmxfZG9jdW1lbnRfZXhwYW5kZWQKLQkJCQkJCQkJLnNldE1vZGFsT2JqZWN0RmVhdHVyZShVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJCS5nZXRCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb25fVXNhZ2VHdWlkYW5jZSgpKTsKLQkJCQkJfSBlbHNlIGlmIChleHBhbmREb2N1bWVudExhYmVsLmdldFRleHQoKQotCQkJCQkJCS5lcXVhbHMoCi0JCQkJCQkJCQlQcm9wZXJ0aWVzUmVzb3VyY2VzLkJyZWFrZG93bkVsZW1lbnRfa2V5Q29uc2lkZXJhdGlvbnMpKSAKLQkJCQkJewotCQkJCQkJY3RybF9kb2N1bWVudF9leHBhbmRlZC5zZXRUZXh0KGNvbnRlbnQKLQkJCQkJCQkJLmdldEtleUNvbnNpZGVyYXRpb25zKCkpOwotCQkJCQkJY3RybF9kb2N1bWVudF9leHBhbmRlZC5zZXRNb2RhbE9iamVjdChjb250ZW50KTsKLQkJCQkJCWN0cmxfZG9jdW1lbnRfZXhwYW5kZWQKLQkJCQkJCQkJLnNldE1vZGFsT2JqZWN0RmVhdHVyZShVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJCS5nZXRDb250ZW50RGVzY3JpcHRpb25fS2V5Q29uc2lkZXJhdGlvbnMoKSk7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQl1cGRhdGVDb250cm9scygpOwotCi0JCQkJaWYgKG1vZGVsTW9kaWZ5TGlzdGVuZXIgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50RWRpdG9yLk1vZGlmeUxpc3RlbmVyKSB7Ci0JCQkJCSgoTWV0aG9kRWxlbWVudEVkaXRvci5Nb2RpZnlMaXN0ZW5lcikgbW9kZWxNb2RpZnlMaXN0ZW5lcikKLQkJCQkJCQkuc2V0RGlzYWJsZShmYWxzZSk7Ci0JCQkJfQotCQkJCWlmIChjb250ZW50TW9kaWZ5TGlzdGVuZXIgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50RWRpdG9yLk1vZGlmeUxpc3RlbmVyKSB7Ci0JCQkJCSgoTWV0aG9kRWxlbWVudEVkaXRvci5Nb2RpZnlMaXN0ZW5lcikgY29udGVudE1vZGlmeUxpc3RlbmVyKQotCQkJCQkJCS5zZXREaXNhYmxlKGZhbHNlKTsKLQkJCQl9Ci0KLQkJCQlwcmVmaXhUZXh0LmFkZE1vZGlmeUxpc3RlbmVyKG1vZGVsTW9kaWZ5TGlzdGVuZXIpOwotCQkJCWJyaWVmRGVzY1RleHQuYWRkTW9kaWZ5TGlzdGVuZXIobW9kZWxNb2RpZnlMaXN0ZW5lcik7Ci0JCQkJCi0JCQkJZXh0ZXJuYWxJRFRleHQuYWRkTW9kaWZ5TGlzdGVuZXIoY29udGVudE1vZGlmeUxpc3RlbmVyKTsKLQkJCQl1c2FnZUd1aWRhbmNlLnNldE1vZGFsT2JqZWN0KGNvbnRlbnQpOwotCQkJCXVzYWdlR3VpZGFuY2Uuc2V0TW9kYWxPYmplY3RGZWF0dXJlKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkuZ2V0QnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uX1VzYWdlR3VpZGFuY2UoKSk7Ci0JCQkJdXNhZ2VHdWlkYW5jZS5hZGRNb2RpZnlMaXN0ZW5lcihjb250ZW50TW9kaWZ5TGlzdGVuZXIpOwotCi0JCQkJa2V5Q29uc2lkZXJhdGlvbnMuc2V0TW9kYWxPYmplY3QoY29udGVudCk7Ci0JCQkJa2V5Q29uc2lkZXJhdGlvbnMuc2V0TW9kYWxPYmplY3RGZWF0dXJlKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkuZ2V0Q29udGVudERlc2NyaXB0aW9uX0tleUNvbnNpZGVyYXRpb25zKCkpOwotCQkJCWtleUNvbnNpZGVyYXRpb25zLmFkZE1vZGlmeUxpc3RlbmVyKGNvbnRlbnRNb2RpZnlMaXN0ZW5lcik7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJbG9nZ2VyCi0JCQkJCS5sb2dFcnJvcigKLQkJCQkJCQkiRXJyb3IgcmVmcmVzaGluZyBicmVha2Rvd24gZWxlbWVudCBkb2N1bWVudGF0aW9uIHNlY3Rpb24iLCBleCk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZUNvbnRyb2xzKCkgewotCQlwcmVmaXhUZXh0LnNldEVkaXRhYmxlKGVkaXRhYmxlKTsKLQkJYnJpZWZEZXNjVGV4dC5zZXRFZGl0YWJsZShlZGl0YWJsZSk7Ci0JCWV4dGVybmFsSURUZXh0LnNldEVkaXRhYmxlKGVkaXRhYmxlKTsKLQkJdXNhZ2VHdWlkYW5jZS5zZXRFZGl0YWJsZShlZGl0YWJsZSk7Ci0JCWtleUNvbnNpZGVyYXRpb25zLnNldEVkaXRhYmxlKGVkaXRhYmxlKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBhY3RpdmUgInVuZXhwYW5kZWQiIHJpY2ggdGV4dCBjb250cm9sLgotCSAqLwotCXByaXZhdGUgdm9pZCBzZXRBY3RpdmVSaWNoVGV4dENvbnRyb2woSU1ldGhvZFJpY2hUZXh0IGN0cmwpIHsKLQkJYWN0aXZlQ29udHJvbCA9IGN0cmw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgYWN0aXZlICJ1bmV4cGFuZGVkIiByaWNoIHRleHQgY29udHJvbC4KLQkgKi8KLQlwcml2YXRlIElNZXRob2RSaWNoVGV4dCBnZXRBY3RpdmVSaWNoVGV4dENvbnRyb2woKSB7Ci0JCXJldHVybiBhY3RpdmVDb250cm9sOwotCX0KLQkKLQkvKioKLQkgKiBHZXQgaGVpZ2h0IG9mIHRoZSByaWNoIHRleHQgY29udHJvbAotCSAqIEByZXR1cm4KLQkgKiAJCUhlaWdodCBvZiB0aGUgcmljaCB0ZXh0IGNvbnRyb2wKLQkgKi8KLQlwdWJsaWMgaW50IGdldFJpY2hUZXh0RWRpdG9ySGVpZ2h0KCkgewotCQlyZXR1cm4gcGFyZW50LmdldEJvdW5kcygpLmhlaWdodCAtIDMgKiAzMjsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgd2lkdGggb2YgdGhlIHJpY2ggdGV4dCBjb250cm9sCi0JICogQHJldHVybgotCSAqIAkJV2lkdGggb2YgdGhlIHJpY2ggdGV4dCBjb250cm9sCi0JICovCi0JcHVibGljIGludCBnZXRSaWNoVGV4dEVkaXRvcldpZHRoKCkgewotCQlyZXR1cm4gcGFyZW50LmdldEJvdW5kcygpLndpZHRoIC0gMiAqIDMyOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9CcmVha2Rvd25FbGVtZW50R2VuZXJhbFNlY3Rpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9CcmVha2Rvd25FbGVtZW50R2VuZXJhbFNlY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGM3MzAyNy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvQnJlYWtkb3duRWxlbWVudEdlbmVyYWxTZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MTggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5NZXRob2RFbGVtZW50RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5Qcm9jZXNzRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuU3RyVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnNlcnZpY2VzLkRpYWdyYW1NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklBY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuUHJvY2Vzc1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlN1cHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbi5JVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbi5JVmFsaWRhdG9yRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VydmljZXMuSUxpYnJhcnlQZXJzaXN0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQnVzeUluZGljYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkZvY3VzQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkZvY3VzRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5Gb3JtVG9vbGtpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLlNlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwudmlld3MucHJvcGVydGllcy50YWJiZWQudmlldy5UYWJiZWRQcm9wZXJ0eUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC52aWV3LlRhYmJlZFByb3BlcnR5VGl0bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuVGFiYmVkUHJvcGVydHlTaGVldFBhZ2U7Ci0KLQotLyoqCi0gKiBUaGUgZ2VuZXJhbCB0YWIgc2VjdGlvbiBmb3IgYnJlYWtkb3duRWxlbWVudAotICogCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMAotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBCcmVha2Rvd25FbGVtZW50R2VuZXJhbFNlY3Rpb24gZXh0ZW5kcyBBYnN0cmFjdFNlY3Rpb24gewotCS8vIGNvbnRyb2xzCi0JcHJvdGVjdGVkIEZvcm1Ub29sa2l0IHRvb2xraXQ7Ci0KLQlwcm90ZWN0ZWQgU2VjdGlvbiBnZW5lcmFsU2VjdGlvbjsKLQotCXByb3RlY3RlZCBDb21wb3NpdGUgZ2VuZXJhbENvbXBvc2l0ZSwgY2hlY2tCb3hDb21wb3NpdGU7Ci0KLQlwcm90ZWN0ZWQgVGV4dCBuYW1lVGV4dDsKLQotCXByb3RlY3RlZCBUZXh0IHByZXNlbnRhdGlvbk5hbWVUZXh0OwotCi0JcHJpdmF0ZSBCdXR0b24gbXVsdGlwbGVCdXR0b24sIG9wdGlvbmFsQnV0dG9uOwotCi0JcHJpdmF0ZSBCdXR0b24gcGxhbm5lZEJ1dHRvbiwgc3VwcmVzc2VkQnV0dG9uOwotCi0JcHJvdGVjdGVkIGludCBudW1PZkNvbHVtbnMgPSA0OwotCi0JcHJvdGVjdGVkIGludCBob3Jpem9udGFsU3BhbiA9IDM7Ci0KLQkvLyBwcml2YXRlIFRhYmJlZFByb3BlcnR5U2hlZXRQYWdlIHRhYmJlZFByb3BlcnR5U2hlZXRQYWdlOwotCi0JLy8gZWxlbWVudAotCXByb3RlY3RlZCBCcmVha2Rvd25FbGVtZW50IGVsZW1lbnQ7Ci0KLQkvLyBhY3Rpb24gbWFuYWdlcgotCXByb3RlY3RlZCBJQWN0aW9uTWFuYWdlciBhY3Rpb25NZ3I7Ci0KLQkvLyBtb2RpZnkgbGlzdGVuZXIKLQlwcm90ZWN0ZWQgTW9kaWZ5TGlzdGVuZXIgbW9kZWxNb2RpZnlMaXN0ZW5lcjsKLQotCXByb3RlY3RlZCBNb2RpZnlMaXN0ZW5lciBuYW1lTW9kaWZ5TGlzdGVuZXI7Ci0KLQlwcml2YXRlIElMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXI7Ci0KLQlmaW5hbCBib29sZWFuIGlnbm9yZVN1cHByZXNzZWQgPSB0cnVlOwotCi0JcHJvdGVjdGVkIExpc3RlbmVyIG5hbWVEZWFjdGl2YXRlTGlzdGVuZXIgPSBuZXcgTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCUFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5ID0gRVBGUHJvcGVydHlTaGVldFBhZ2UKLQkJCQkJLmdldEFkYXB0ZXJGYWN0b3J5KCk7Ci0KLQkJCWVsZW1lbnQgPSAoQnJlYWtkb3duRWxlbWVudCkgZ2V0RWxlbWVudCgpOwotCQkJU3RyaW5nIG9sZENvbnRlbnQgPSBlbGVtZW50LmdldE5hbWUoKTsKLQkJCWlmICgoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpKS5tdXN0UmVzdG9yZVZhbHVlKAotCQkJCQluYW1lVGV4dCwgb2xkQ29udGVudCkpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0KLQkJCVN0cmluZyBtZXNzYWdlID0gbnVsbDsKLQkJCWlmICghU3RyVXRpbC5pc0JsYW5rKGVsZW1lbnQuZ2V0TmFtZSgpKSkgewotCQkJCVN1cHByZXNzaW9uIHN1cHByZXNzaW9uID0gRVBGUHJvcGVydHlTaGVldFBhZ2UuZ2V0RWRpdG9yKCkKLQkJCQkJCS5nZXRTdXBwcmVzc2lvbigpOwotCQkJCW1lc3NhZ2UgPSBQcm9jZXNzVXRpbC5jaGVja0JyZWFrZG93bkVsZW1lbnROYW1lKAotCQkJCQkJYWRhcHRlckZhY3RvcnksIGVsZW1lbnQsIG5hbWVUZXh0LmdldFRleHQoKSwKLQkJCQkJCXN1cHByZXNzaW9uLCBpZ25vcmVTdXBwcmVzc2VkKTsKLQkJCX0KLQkJCWlmIChtZXNzYWdlID09IG51bGwpIHsKLQkJCQlpZiAoIW5hbWVUZXh0LmdldFRleHQoKS5lcXVhbHMob2xkQ29udGVudCkpIHsKLQkJCQkJaWYgKChlbGVtZW50IGluc3RhbmNlb2YgQWN0aXZpdHkpCi0JCQkJCQkJJiYgKGVsZW1lbnQuZUNvbnRhaW5lcigpIGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkpIHsKLQkJCQkJCVByb2Nlc3NDb21wb25lbnQgcHJvY0NvbXAgPSAoUHJvY2Vzc0NvbXBvbmVudCkgZWxlbWVudAotCQkJCQkJCQkuZUNvbnRhaW5lcigpOwotCQkJCQkJSVZhbGlkYXRvciB2YWxpZGF0b3IgPSBJVmFsaWRhdG9yRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkJCQkuY3JlYXRlTmFtZVZhbGlkYXRvcigKLQkJCQkJCQkJCQlwcm9jQ29tcCwKLQkJCQkJCQkJCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkJCQkJCQkJLmdldE5hdmlnYXRvclZpZXdfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKTsKLQkJCQkJCVN0cmluZyBtc2cgPSB2YWxpZGF0b3IuaXNWYWxpZChuYW1lVGV4dC5nZXRUZXh0KCkpOwotCi0JCQkJCQlpZiAobXNnID09IG51bGwpIHsKLQkJCQkJCQltc2cgPSBQcm9wZXJ0aWVzUmVzb3VyY2VzLlByb2Nlc3NfUmVuYW1lX01lc3NhZ2U7IAotCi0JCQkJCQkJaWYgKEF1dGhvcmluZ1VJUGx1Z2luCi0JCQkJCQkJCQkuZ2V0RGVmYXVsdCgpCi0JCQkJCQkJCQkuZ2V0TXNnRGlhbG9nKCkKLQkJCQkJCQkJCS5kaXNwbGF5Q29uZmlybWF0aW9uKAotCQkJCQkJCQkJCQlQcm9wZXJ0aWVzUmVzb3VyY2VzLlByb2Nlc3NfUmVuYW1lX1RpdGxlLCBtc2cpKSB7IAotCQkJCQkJCQllLmRvaXQgPSB0cnVlOwotCQkJCQkJCQlib29sZWFuIHN0YXR1cyA9IGFjdGlvbk1nci5kb0FjdGlvbigKLQkJCQkJCQkJCQlJQWN0aW9uTWFuYWdlci5TRVQsIGVsZW1lbnQsCi0JCQkJCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCQkJCS5nZXROYW1lZEVsZW1lbnRfTmFtZSgpLAotCQkJCQkJCQkJCW5hbWVUZXh0LmdldFRleHQoKSwgLTEpOwotCQkJCQkJCQlpZiAoIXN0YXR1cykgewotCQkJCQkJCQkJcmV0dXJuOwotCQkJCQkJCQkJLy8gbmFtZVRleHQuc2V0VGV4dChlbGVtZW50LmdldE5hbWUoKSk7Ci0KLQkJCQkJCQkJfQotCQkJCQkJCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuU0VULAotCQkJCQkJCQkJCXByb2NDb21wLCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJCQkJLmdldE5hbWVkRWxlbWVudF9OYW1lKCksCi0JCQkJCQkJCQkJbmFtZVRleHQuZ2V0VGV4dCgpLCAtMSk7Ci0JCQkJCQkJCWdldEVkaXRvcigpLnNldFBhcnROYW1lKCk7Ci0KLQkJCQkJCQkJLy8gYWRqdXN0IHBsdWdpbiBsb2NhdGlvbiBhbmQgc2F2ZSB0aGUKLQkJCQkJCQkJLy8gZWRpdG9yCi0JCQkJCQkJCS8vCi0JCQkJCQkJCUJ1c3lJbmRpY2F0b3Iuc2hvd1doaWxlKERpc3BsYXkKLQkJCQkJCQkJCQkuZ2V0RGVmYXVsdCgpLCBuZXcgUnVubmFibGUoKSB7Ci0KLQkJCQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQkJCQlNZXRob2RFbGVtZW50RWRpdG9yIGVkaXRvciA9IChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKTsKLQkJCQkJCQkJCQllZGl0b3IKLQkJCQkJCQkJCQkJCS5kb1NhdmUobmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCQkJCQkJCQkJSUxpYnJhcnlQZXJzaXN0ZXIuRmFpbFNhZmVNZXRob2RMaWJyYXJ5UGVyc2lzdGVyIHBlcnNpc3RlciA9IGVkaXRvcgotCQkJCQkJCQkJCQkJLmdldFBlcnNpc3RlcigpOwotCQkJCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCQkJCXBlcnNpc3RlcgotCQkJCQkJCQkJCQkJCS5hZGp1c3RMb2NhdGlvbihlbGVtZW50Ci0JCQkJCQkJCQkJCQkJCQkuZVJlc291cmNlKCkpOwotCQkJCQkJCQkJCQlwZXJzaXN0ZXIuY29tbWl0KCk7Ci0JCQkJCQkJCQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJCQkJCXBlcnNpc3Rlci5yb2xsYmFjaygpOwotCQkJCQkJCQkJCQl0aHJvdyBlOwotCQkJCQkJCQkJCX0KLQkJCQkJCQkJCQkvLwkgYWRqdXN0IGRpYWdyYW0gcmVzb3VyY2UgYXMgd2VsbAotCQkJCQkJCQkJCS8vCi0JCQkJCQkJCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBQcm9jZXNzKSB7Ci0JCQkJCQkJCQkJCURpYWdyYW1NYW5hZ2VyIG1nciA9IERpYWdyYW1NYW5hZ2VyLmdldEluc3RhbmNlKChQcm9jZXNzKSBlbGVtZW50LCB0aGlzKTsKLQkJCQkJCQkJCQkJaWYobWdyICE9IG51bGwpIHsKLQkJCQkJCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCQkJCQkJbWdyLnVwZGF0ZVJlc291cmNlVVJJKCk7Ci0JCQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQkJCQljYXRjaChFeGNlcHRpb24gZSkgewotCQkJCQkJCQkJCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCQkJCQkJCQkJCX0KLQkJCQkJCQkJCQkJCWZpbmFsbHkgewotCQkJCQkJCQkJCQkJCW1nci5yZW1vdmVDb25zdW1lcih0aGlzKTsKLQkJCQkJCQkJCQkJCX0KLQkJCQkJCQkJCQkJfQotCQkJCQkJCQkJCX0KLQkJCQkJCQkJCX0KLQotCQkJCQkJCQl9KTsKLQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQkvLyByZXBsYWNlIHdpdGggZXhpc3RpbmcgbmFtZQotCQkJCQkJCQluYW1lVGV4dC5zZXRUZXh0KG9sZENvbnRlbnQpOwotCQkJCQkJCQlyZXR1cm47Ci0JCQkJCQkJfQotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkvLyByZXN0b3JlIHRoZSBvbGQgbmFtZSBmaXJzdCwgdGhlbiBwcmVzZW50IHRoZQotCQkJCQkJCS8vIGVycm9yIG1lc3NhZ2UgYm94Ci0JCQkJCQkJbmFtZVRleHQuc2V0VGV4dChvbGRDb250ZW50KTsKLQkJCQkJCQlBdXRob3JpbmdVSVBsdWdpbgotCQkJCQkJCQkJLmdldERlZmF1bHQoKQotCQkJCQkJCQkJLmdldE1zZ0RpYWxvZygpCi0JCQkJCQkJCQkuZGlzcGxheUVycm9yKAotCQkJCQkJCQkJCQlQcm9wZXJ0aWVzUmVzb3VyY2VzLlByb2Nlc3NfSW52YWxpZE5hbWVUaXRsZSwgbXNnKTsgCi0JCQkJCQkJZS5kb2l0ID0gZmFsc2U7Ci0JCQkJCQkJbmFtZVRleHQuZ2V0RGlzcGxheSgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQkJCW5hbWVUZXh0LnNldEZvY3VzKCk7Ci0JCQkJCQkJCQluYW1lVGV4dC5zZWxlY3RBbGwoKTsKLQkJCQkJCQkJfQotCQkJCQkJCX0pOwotCQkJCQkJfQotCQkJCQl9IGVsc2UgewotCQkJCQkJZS5kb2l0ID0gdHJ1ZTsKLQkJCQkJCWJvb2xlYW4gc3RhdHVzID0gYWN0aW9uTWdyCi0JCQkJCQkJCS5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5TRVQsIGVsZW1lbnQsCi0JCQkJCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCQkJCS5nZXROYW1lZEVsZW1lbnRfTmFtZSgpLAotCQkJCQkJCQkJCW5hbWVUZXh0LmdldFRleHQoKSwgLTEpOwotCQkJCQkJaWYgKCFzdGF0dXMpIHsKLQkJCQkJCQlyZXR1cm47Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCS8vIHJlc3RvcmUgdGhlIG9sZCBuYW1lIGZpcnN0LCB0aGVuIHByZXNlbnQgdGhlIGVycm9yCi0JCQkJLy8gbWVzc2FnZSBib3gKLQkJCQluYW1lVGV4dC5zZXRUZXh0KG9sZENvbnRlbnQpOwotCQkJCUF1dGhvcmluZ1VJUGx1Z2luCi0JCQkJCQkuZ2V0RGVmYXVsdCgpCi0JCQkJCQkuZ2V0TXNnRGlhbG9nKCkKLQkJCQkJCS5kaXNwbGF5RXJyb3IoCi0JCQkJCQkJCVByb3BlcnRpZXNSZXNvdXJjZXMuUHJvY2Vzc19JbnZhbGlkTmFtZVRpdGxlLCBtZXNzYWdlKTsgCi0JCQkJZS5kb2l0ID0gZmFsc2U7Ci0JCQkJbmFtZVRleHQuZ2V0RGlzcGxheSgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCW5hbWVUZXh0LnNldEZvY3VzKCk7Ci0JCQkJCQluYW1lVGV4dC5zZWxlY3RBbGwoKTsKLQkJCQkJfQotCQkJCX0pOwotCi0JCQl9Ci0JCX0KLQl9OwotCi0JcHJvdGVjdGVkIExpc3RlbmVyIHByZXNlbnRhdGlvbk5hbWVEZWFjdGl2YXRlTGlzdGVuZXIgPSBuZXcgTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCUFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5ID0gRVBGUHJvcGVydHlTaGVldFBhZ2UKLQkJCQkJLmdldEFkYXB0ZXJGYWN0b3J5KCk7Ci0KLQkJCWVsZW1lbnQgPSAoQnJlYWtkb3duRWxlbWVudCkgZ2V0RWxlbWVudCgpOwotCQkJU3RyaW5nIG9sZENvbnRlbnQgPSBlbGVtZW50LmdldFByZXNlbnRhdGlvbk5hbWUoKTsKLQkJCWlmICgoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpKS5tdXN0UmVzdG9yZVZhbHVlKAotCQkJCQlwcmVzZW50YXRpb25OYW1lVGV4dCwgb2xkQ29udGVudCkpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0KLQkJCVN0cmluZyBtZXNzYWdlID0gbnVsbDsKLQkJCQotCQkJLy8geW91IGNhbiBoYXZlIGJsYW5rIHByZXNlbnRhdGlvbiBuYW1lIGZvciBhY3Rpdml0eSB0aGF0IGV4dGVuZHMgCi0JCQlpZiAoU3RyVXRpbC5pc0JsYW5rKHByZXNlbnRhdGlvbk5hbWVUZXh0LmdldFRleHQoKSkKLQkJCQkJJiYgZWxlbWVudCBpbnN0YW5jZW9mIFZhcmlhYmlsaXR5RWxlbWVudCkgewotCQkJCVZhcmlhYmlsaXR5RWxlbWVudCB2ZSA9IChWYXJpYWJpbGl0eUVsZW1lbnQpIGVsZW1lbnQ7Ci0JCQkJaWYgKHZlLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSAhPSBudWxsCi0JCQkJCQkmJiB2ZS5nZXRWYXJpYWJpbGl0eVR5cGUoKS5lcXVhbHMoCi0JCQkJCQkJCVZhcmlhYmlsaXR5VHlwZS5FWFRFTkRTKSkgewotCQkJCQkKLQkJCQkJZS5kb2l0ID0gdHJ1ZTsKLQkJCQkJaWYgKCFwcmVzZW50YXRpb25OYW1lVGV4dC5nZXRUZXh0KCkuZXF1YWxzKG9sZENvbnRlbnQpKSB7Ci0JCQkJCQlib29sZWFuIHN0YXR1cyA9IGFjdGlvbk1ncgotCQkJCQkJCQkuZG9BY3Rpb24oCi0JCQkJCQkJCQkJSUFjdGlvbk1hbmFnZXIuU0VULAotCQkJCQkJCQkJCWVsZW1lbnQsCi0JCQkJCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCQkJCS5nZXRNZXRob2RFbGVtZW50X1ByZXNlbnRhdGlvbk5hbWUoKSwKLQkJCQkJCQkJCQlwcmVzZW50YXRpb25OYW1lVGV4dC5nZXRUZXh0KCksIC0xKTsKLQkJCQkJCWlmICghc3RhdHVzKSB7Ci0JCQkJCQkJcmV0dXJuOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJCi0JCQlpZiAoIVN0clV0aWwuaXNCbGFuayhlbGVtZW50LmdldFByZXNlbnRhdGlvbk5hbWUoKSkpIHsKLQkJCQlTdXBwcmVzc2lvbiBzdXBwcmVzc2lvbiA9IEVQRlByb3BlcnR5U2hlZXRQYWdlLmdldEVkaXRvcigpCi0JCQkJCQkuZ2V0U3VwcHJlc3Npb24oKTsKLQkJCQltZXNzYWdlID0gUHJvY2Vzc1V0aWwKLQkJCQkJCS5jaGVja0JyZWFrZG93bkVsZW1lbnRQcmVzZW50YXRpb25OYW1lKAotCQkJCQkJCQlhZGFwdGVyRmFjdG9yeSwgZWxlbWVudCwKLQkJCQkJCQkJcHJlc2VudGF0aW9uTmFtZVRleHQuZ2V0VGV4dCgpLCBzdXBwcmVzc2lvbiwgaWdub3JlU3VwcHJlc3NlZCk7Ci0JCQl9Ci0KLQkJCWlmIChtZXNzYWdlID09IG51bGwpIHsKLQkJCQllLmRvaXQgPSB0cnVlOwotCQkJCWlmICghcHJlc2VudGF0aW9uTmFtZVRleHQuZ2V0VGV4dCgpLmVxdWFscyhvbGRDb250ZW50KSkgewotCQkJCQlib29sZWFuIHN0YXR1cyA9IGFjdGlvbk1ncgotCQkJCQkJCS5kb0FjdGlvbigKLQkJCQkJCQkJCUlBY3Rpb25NYW5hZ2VyLlNFVCwKLQkJCQkJCQkJCWVsZW1lbnQsCi0JCQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJCQkuZ2V0TWV0aG9kRWxlbWVudF9QcmVzZW50YXRpb25OYW1lKCksCi0JCQkJCQkJCQlwcmVzZW50YXRpb25OYW1lVGV4dC5nZXRUZXh0KCksIC0xKTsKLQkJCQkJaWYgKCFzdGF0dXMpIHsKLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJLy8gcmVzdG9yZSB0aGUgb2xkIG5hbWUgZmlyc3QsIHRoZW4gcHJlc2VudCB0aGUgZXJyb3IKLQkJCQkvLyBtZXNzYWdlIGJveAotCQkJCXByZXNlbnRhdGlvbk5hbWVUZXh0LnNldFRleHQoZWxlbWVudC5nZXRQcmVzZW50YXRpb25OYW1lKCkpOwotCi0JCQkJQXV0aG9yaW5nVUlQbHVnaW4KLQkJCQkJCS5nZXREZWZhdWx0KCkKLQkJCQkJCS5nZXRNc2dEaWFsb2coKQotCQkJCQkJLmRpc3BsYXlFcnJvcigKLQkJCQkJCQkJUHJvcGVydGllc1Jlc291cmNlcy5Qcm9jZXNzX0ludmFsaWROYW1lVGl0bGUsIG1lc3NhZ2UpOyAKLQkJCQllLmRvaXQgPSBmYWxzZTsKLQkJCQlwcmVzZW50YXRpb25OYW1lVGV4dC5nZXREaXNwbGF5KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJcHJlc2VudGF0aW9uTmFtZVRleHQuc2V0Rm9jdXMoKTsKLQkJCQkJfQotCQkJCX0pOwotCQkJfQotCQl9Ci0JfTsKLQlwcm90ZWN0ZWQgdm9pZCBpbml0KCkgewotCQkvLyBnZXQgQnJlYWtkb3duRWxlbWVudCBvYmplY3QKLQkJZWxlbWVudCA9IChCcmVha2Rvd25FbGVtZW50KSBnZXRFbGVtZW50KCk7Ci0KLQkJLy8gZ2V0IHRvb2xraXQKLQkJdG9vbGtpdCA9IGdldFdpZGdldEZhY3RvcnkoKTsKLQotCQkvLyBnZXQgYWN0aW9uIG1hbmFnZXIKLQkJYWN0aW9uTWdyID0gRVBGUHJvcGVydHlTaGVldFBhZ2UuZ2V0QWN0aW9uTWFuYWdlcigpOwotCX0KLQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuQWJzdHJhY3RTZWN0aW9uI2NyZWF0ZUNvbnRyb2xzKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSwgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuVGFiYmVkUHJvcGVydHlTaGVldFBhZ2UpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbHMoQ29tcG9zaXRlIHBhcmVudCwKLQkJCVRhYmJlZFByb3BlcnR5U2hlZXRQYWdlIHRhYmJlZFByb3BlcnR5U2hlZXRQYWdlKSB7Ci0JCXN1cGVyLmNyZWF0ZUNvbnRyb2xzKHBhcmVudCwgdGFiYmVkUHJvcGVydHlTaGVldFBhZ2UpOwotCQlpbml0KCk7Ci0JCS8vIHRoaXMudGFiYmVkUHJvcGVydHlTaGVldFBhZ2UgPSB0YWJiZWRQcm9wZXJ0eVNoZWV0UGFnZTsKLQotCQlwYXJlbnQuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQlwYXJlbnQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0KLQkJLy8gY3JlYXRlIGdlbmVyYWwgc2VjdGlvbgotCQljcmVhdGVHZW5lcmFsU2VjdGlvbihwYXJlbnQpOwotCi0JCS8vIGFkZExpc3RlbmVycwotCQlhZGRMaXN0ZW5lcnMoKTsKLQotCQkvLyB1cGRhdGUgY29udHJvbHMKLQkJdXBkYXRlQ29udHJvbHMoKTsKLQotCX0KLQotCS8qKgotCSAqICBBZGQgbGlzdGVuZXJzCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkTGlzdGVuZXJzKCkgewotCQluYW1lVGV4dC5hZGRMaXN0ZW5lcihTV1QuQWN0aXZhdGUsIG5ldyBMaXN0ZW5lcigpIHsKLQotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCQkoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpKS5zZXRDdXJyZW50RmVhdHVyZUVkaXRvcihldmVudC53aWRnZXQsCi0JCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXROYW1lZEVsZW1lbnRfTmFtZSgpKTsKLQkJCX0KLQkJCQotCQl9KTsKLQkJbmFtZVRleHQuYWRkTGlzdGVuZXIoU1dULkRlYWN0aXZhdGUsIG5hbWVEZWFjdGl2YXRlTGlzdGVuZXIpOwotCi0JCXByZXNlbnRhdGlvbk5hbWVUZXh0LmFkZExpc3RlbmVyKFNXVC5BY3RpdmF0ZSwgbmV3IExpc3RlbmVyKCkgewotCi0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJCSgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpLnNldEN1cnJlbnRGZWF0dXJlRWRpdG9yKGV2ZW50LndpZGdldCwKLQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE1ldGhvZEVsZW1lbnRfUHJlc2VudGF0aW9uTmFtZSgpKTsKLQkJCX0KLQkJCQotCQl9KTsJCQotCQlwcmVzZW50YXRpb25OYW1lVGV4dC5hZGRMaXN0ZW5lcihTV1QuRGVhY3RpdmF0ZSwgcHJlc2VudGF0aW9uTmFtZURlYWN0aXZhdGVMaXN0ZW5lcik7Ci0JCXByZXNlbnRhdGlvbk5hbWVUZXh0LmFkZEZvY3VzTGlzdGVuZXIobmV3IEZvY3VzQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGZvY3VzR2FpbmVkKEZvY3VzRXZlbnQgZSkgewotCQkJCS8vIHdoZW4gdXNlciB0YWIgdG8gdGhpcyBmaWVsZCwgc2VsZWN0IGFsbCB0ZXh0Ci0JCQkJcHJlc2VudGF0aW9uTmFtZVRleHQuc2VsZWN0QWxsKCk7Ci0JCQkJICAKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGZvY3VzTG9zdChGb2N1c0V2ZW50IGUpIHsKLQkJCQkvLyBjbGVhciB0aGUgc2VsZWN0aW9uIHdoZW4gdGhlIGZvY3VzIG9mIHRoZSBjb21wb25lbnQgaXMgbG9zdCAKLQkJCQlpZihwcmVzZW50YXRpb25OYW1lVGV4dC5nZXRTZWxlY3Rpb25Db3VudCgpID4gMCl7Ci0JCQkJCXByZXNlbnRhdGlvbk5hbWVUZXh0LmNsZWFyU2VsZWN0aW9uKCk7Ci0JICAgICAgICAgICAgfSAKLQkJCX0KLQkJfSk7Ci0JCQotCQltdWx0aXBsZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJZWxlbWVudCA9IChCcmVha2Rvd25FbGVtZW50KSBnZXRFbGVtZW50KCk7Ci0KLQkJCQlib29sZWFuIHN0YXR1cyA9IGFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5TRVQsCi0JCQkJCQllbGVtZW50LCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkuZ2V0QnJlYWtkb3duRWxlbWVudF9IYXNNdWx0aXBsZU9jY3VycmVuY2VzKCksCi0JCQkJCQlCb29sZWFuLnZhbHVlT2YobXVsdGlwbGVCdXR0b24uZ2V0U2VsZWN0aW9uKCkpLCAtMSk7Ci0JCQkJaWYgKCFzdGF0dXMpCi0JCQkJCW11bHRpcGxlQnV0dG9uLnNldFNlbGVjdGlvbihlbGVtZW50Ci0JCQkJCQkJLmdldEhhc011bHRpcGxlT2NjdXJyZW5jZXMoKS5ib29sZWFuVmFsdWUoKSk7Ci0KLQkJCX0KLQotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCX0KLQkJfSk7Ci0KLQkJb3B0aW9uYWxCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWVsZW1lbnQgPSAoQnJlYWtkb3duRWxlbWVudCkgZ2V0RWxlbWVudCgpOwotCQkJCWJvb2xlYW4gc3RhdHVzID0gYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlNFVCwKLQkJCQkJCWVsZW1lbnQsIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCS5nZXRCcmVha2Rvd25FbGVtZW50X0lzT3B0aW9uYWwoKSwgQm9vbGVhbgotCQkJCQkJCQkudmFsdWVPZihvcHRpb25hbEJ1dHRvbi5nZXRTZWxlY3Rpb24oKSksIC0xKTsKLQkJCQlpZiAoIXN0YXR1cykKLQkJCQkJb3B0aW9uYWxCdXR0b24uc2V0U2VsZWN0aW9uKGVsZW1lbnQuZ2V0SXNPcHRpb25hbCgpCi0JCQkJCQkJLmJvb2xlYW5WYWx1ZSgpKTsKLQotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJfQotCQl9KTsKLQotCQlwbGFubmVkQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQllbGVtZW50ID0gKEJyZWFrZG93bkVsZW1lbnQpIGdldEVsZW1lbnQoKTsKLQkJCQlib29sZWFuIHN0YXR1cyA9IGFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5TRVQsCi0JCQkJCQllbGVtZW50LCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkuZ2V0QnJlYWtkb3duRWxlbWVudF9Jc1BsYW5uZWQoKSwgQm9vbGVhbgotCQkJCQkJCQkudmFsdWVPZihwbGFubmVkQnV0dG9uLmdldFNlbGVjdGlvbigpKSwgLTEpOwotCQkJCWlmICghc3RhdHVzKQotCQkJCQlwbGFubmVkQnV0dG9uLnNldFNlbGVjdGlvbihlbGVtZW50LmdldElzUGxhbm5lZCgpCi0JCQkJCQkJLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCX0KLQkJfSk7Ci0KLQkJc3VwcmVzc2VkQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQllbGVtZW50ID0gKEJyZWFrZG93bkVsZW1lbnQpIGdldEVsZW1lbnQoKTsKLQkJCQlpZiAoZWxlbWVudC5nZXRTdXBwcmVzc2VkKCkuYm9vbGVhblZhbHVlKCkpIHsKLQkJCQkJLy8gcmV2ZWFsaW5nCi0JCQkJCVByb2Nlc3NFZGl0b3IgZWRpdG9yID0gZ2V0RWRpdG9yKCk7Ci0JCQkJCVN1cHByZXNzaW9uIHN1cHByZXNzaW9uID0gZWRpdG9yLmdldFN1cHByZXNzaW9uKCk7Ci0JCQkJCWJvb2xlYW4gY2FuUmV2ZWFsID0gUHJvY2Vzc0VkaXRvci5jYW5SZXZlYWwoCi0JCQkJCQkJQXJyYXlzLmFzTGlzdChuZXcgT2JqZWN0W10geyBlbGVtZW50IH0pLAotCQkJCQkJCUVQRlByb3BlcnR5U2hlZXRQYWdlLmdldEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQkJc3VwcHJlc3Npb24pOwotCQkJCQotCQkJCQlpZiAoIWNhblJldmVhbCkJCQkJCQotCQkJCQkJc3VwcmVzc2VkQnV0dG9uLnNldFNlbGVjdGlvbih0cnVlKTsJCi0JCQkJCWVsc2UKLQkJCQkJCXN1cHJlc3NlZEJ1dHRvbi5zZXRTZWxlY3Rpb24oZmFsc2UpOwotCQkJCX0KLQkJCQlib29sZWFuIHN0YXR1cyA9IGFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5TRVQsCi0JCQkJCQllbGVtZW50LCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkuZ2V0TWV0aG9kRWxlbWVudF9TdXBwcmVzc2VkKCksIEJvb2xlYW4KLQkJCQkJCQkJLnZhbHVlT2Yoc3VwcmVzc2VkQnV0dG9uLmdldFNlbGVjdGlvbigpKSwgLTEpOwotCQkJCWlmICghc3RhdHVzKQotCQkJCQlzdXByZXNzZWRCdXR0b24uc2V0U2VsZWN0aW9uKGVsZW1lbnQuZ2V0U3VwcHJlc3NlZCgpCi0JCQkJCQkJLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGdlbmVyYWwgc2VjdGlvbiBvbiB0aGUgZ2l2ZW4gY29tcG9zaXRlCi0JICogQHBhcmFtIGNvbXBvc2l0ZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUdlbmVyYWxTZWN0aW9uKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQkJLy8gY3JlYXRlIGdlbmVyYWwgc2VjdGlvbgotCQlnZW5lcmFsU2VjdGlvbiA9IEZvcm1VSQotCQkJCS5jcmVhdGVTZWN0aW9uKAotCQkJCQkJdG9vbGtpdCwKLQkJCQkJCWNvbXBvc2l0ZSwKLQkJCQkJCVByb3BlcnRpZXNSZXNvdXJjZXMuUHJvY2Vzc19nZW5lcmFsSW5mb3JtYXRpb25UaXRsZSwgCi0JCQkJCQlQcm9wZXJ0aWVzUmVzb3VyY2VzLmJpbmQoUHJvcGVydGllc1Jlc291cmNlcy5Qcm9jZXNzX2dlbmVyYWxJbmZvcm1hdGlvbkRlc2NyaXB0aW9uLCBQcm9wZXJ0aWVzVXRpbC5nZXRUeXBlTG93ZXIoZWxlbWVudCkpKTsgCi0KLQkJLy8gY3JlYXRlIGdlbmVyYWwgY29tcG9zaXRlCi0JCWdlbmVyYWxDb21wb3NpdGUgPSBGb3JtVUkuY3JlYXRlQ29tcG9zaXRlKHRvb2xraXQsIGdlbmVyYWxTZWN0aW9uLAotCQkJCW51bU9mQ29sdW1ucywgZmFsc2UpOwotCi0JCS8vIG5hbWUKLQkJRm9ybVVJLmNyZWF0ZUxhYmVsKHRvb2xraXQsIGdlbmVyYWxDb21wb3NpdGUsIFByb3BlcnRpZXNSZXNvdXJjZXMuUHJvY2Vzc19uYW1lKTsgCi0JCW5hbWVUZXh0ID0gRm9ybVVJLmNyZWF0ZVRleHQodG9vbGtpdCwgZ2VuZXJhbENvbXBvc2l0ZSwgU1dULkRFRkFVTFQsCi0JCQkJaG9yaXpvbnRhbFNwYW4pOwotCi0JCS8vIHByZXNlbnRhdGlvbiBuYW1lCi0JCUZvcm1VSS5jcmVhdGVMYWJlbCh0b29sa2l0LCBnZW5lcmFsQ29tcG9zaXRlLCBQcm9wZXJ0aWVzUmVzb3VyY2VzLkFjdGl2aXR5X3ByZXNlbnRhdGlvbk5hbWUpOyAKLQkJcHJlc2VudGF0aW9uTmFtZVRleHQgPSBGb3JtVUkuY3JlYXRlVGV4dCh0b29sa2l0LCBnZW5lcmFsQ29tcG9zaXRlLAotCQkJCVNXVC5ERUZBVUxULCBob3Jpem9udGFsU3Bhbik7Ci0KLQkJLy8gY3JlYXRlIGNvbXBvc2l0ZSBmb3IgY2hlY2tib3gKLQkJY2hlY2tCb3hDb21wb3NpdGUgPSBGb3JtVUkuY3JlYXRlQ29tcG9zaXRlKHRvb2xraXQsIGdlbmVyYWxDb21wb3NpdGUsCi0JCQkJR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMLCBudW1PZkNvbHVtbnMsIHRydWUpOwotCi0JCS8vIG9wdGlvbmFsCi0JCW9wdGlvbmFsQnV0dG9uID0gRm9ybVVJLmNyZWF0ZUNoZWNrQnV0dG9uKHRvb2xraXQsIGNoZWNrQm94Q29tcG9zaXRlLAotCQkJCTEpOwotCQlvcHRpb25hbEJ1dHRvbi5zZXRUZXh0KFByb3BlcnRpZXNSZXNvdXJjZXMuQnJlYWtkb3duRWxlbWVudF9PcHRpb25fT3B0aW9uYWwpOyAKLQotCQkvLyBNdWx0aXBsZSBPY3VycmFuY2VzCi0JCW11bHRpcGxlQnV0dG9uID0gRm9ybVVJLmNyZWF0ZUNoZWNrQnV0dG9uKHRvb2xraXQsIGNoZWNrQm94Q29tcG9zaXRlLAotCQkJCTEpOwotCQltdWx0aXBsZUJ1dHRvbi5zZXRUZXh0KFByb3BlcnRpZXNSZXNvdXJjZXMuQnJlYWtkb3duRWxlbWVudF9PcHRpb25fTXVsdGlwbGVPY3VycmFuY2UpOyAKLQotCQkvLyBwbGFubmVkCi0JCXBsYW5uZWRCdXR0b24gPSBGb3JtVUkuY3JlYXRlQ2hlY2tCdXR0b24odG9vbGtpdCwgY2hlY2tCb3hDb21wb3NpdGUsCi0JCQkJMSk7Ci0JCXBsYW5uZWRCdXR0b24uc2V0VGV4dChQcm9wZXJ0aWVzUmVzb3VyY2VzLkJyZWFrZG93bkVsZW1lbnRfT3B0aW9uX1BsYW5uZWQpOyAKLQotCQkvLyBzdXByZXNzZWQKLQkJc3VwcmVzc2VkQnV0dG9uID0gRm9ybVVJLmNyZWF0ZUNoZWNrQnV0dG9uKHRvb2xraXQsIGNoZWNrQm94Q29tcG9zaXRlLAotCQkJCTEpOwotCQlzdXByZXNzZWRCdXR0b24uc2V0VGV4dChQcm9wZXJ0aWVzUmVzb3VyY2VzLkJyZWFrZG93bkVsZW1lbnRfT3B0aW9uX1N1cHJlc3NlZCk7IAotCQlzdXByZXNzZWRCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0KLQkJdG9vbGtpdC5wYWludEJvcmRlcnNGb3IoZ2VuZXJhbENvbXBvc2l0ZSk7Ci0JCXRvb2xraXQucGFpbnRCb3JkZXJzRm9yKGNoZWNrQm94Q29tcG9zaXRlKTsKLQotCX0KLQotCS8qKgotCSAqIE1vZGlmeSBsaXN0bmVyIGZvciBuYW1lIGFuZCBwcmVzZW50YXRpb24gbmFtZQotCSAqCi0JICovCi0JcHVibGljIGNsYXNzIE5hbWVNb2RpZnlMaXN0ZW5lciBleHRlbmRzIE1ldGhvZEVsZW1lbnRFZGl0b3IuTW9kaWZ5TGlzdGVuZXIgewotCQkvKioKLQkJICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkJICovCi0KLQkJcHVibGljIE5hbWVNb2RpZnlMaXN0ZW5lcihFT2JqZWN0IGVsZW1lbnQsIGJvb2xlYW4gY2hlY2tDb250YWluZXIpIHsKLQotCQkJZ2V0RWRpdG9yKCkuc3VwZXIoZWxlbWVudCwgY2hlY2tDb250YWluZXIpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0JCQlzdXBlci5tb2RpZnlUZXh0KGUpOwotCi0JCQl1cGRhdGVUaXRsZShuYW1lVGV4dC5nZXRUZXh0KCkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIG5hbWUgbW9kaWZ5IGxpc3RlbmVyIGZvciB0aGUgZ2l2ZW4gb2JqZWN0Ci0JICogQHBhcmFtIGVPYmoKLQkgKiBAcmV0dXJuCi0JICogCQkJbGlzdGVuZXIKLQkgKi8KLQlwdWJsaWMgTW9kaWZ5TGlzdGVuZXIgY3JlYXRlTmFtZU1vZGlmeUxpc3RlbmVyKEVPYmplY3QgZU9iaikgewotCQlyZXR1cm4gY3JlYXRlTmFtZU1vZGlmeUxpc3RlbmVyKGVPYmosIGZhbHNlKTsKLQl9Ci0KLQlwdWJsaWMgTW9kaWZ5TGlzdGVuZXIgY3JlYXRlTmFtZU1vZGlmeUxpc3RlbmVyKEVPYmplY3QgZU9iaiwKLQkJCWJvb2xlYW4gY2hlY2tDb250YWluZXIpIHsKLQkJcmV0dXJuIG5ldyBOYW1lTW9kaWZ5TGlzdGVuZXIoZU9iaiwgY2hlY2tDb250YWluZXIpOwotCX0KLQotCS8qKgotCSAqIFVwZGF0ZSB0aXRsZSBvZiB0aGUgcHJvcGVydGllcyBwYWdlCi0JICogQHBhcmFtIHR4dAotCSAqIAkJCW5ldyB0aXRsZQotCSAqLwotCXB1YmxpYyB2b2lkIHVwZGF0ZVRpdGxlKFN0cmluZyB0eHQpIHsKLQkJU3RyaW5nIG5hbWUgPSBnZXROYW1lUHJlZml4KCkgKyB0eHQ7Ci0JCVRhYmJlZFByb3BlcnR5Q29tcG9zaXRlIGNvbXAgPSAoVGFiYmVkUHJvcGVydHlDb21wb3NpdGUpIHBhZ2UKLQkJCQkuZ2V0Q29udHJvbCgpOwotCQlUYWJiZWRQcm9wZXJ0eVRpdGxlIHRpdGxlID0gY29tcC5nZXRUaXRsZSgpOwotCi0JCXRpdGxlLnNldFRpdGxlKG5hbWUsIGdldEltYWdlKGVsZW1lbnQpKTsKLQl9Ci0KLQlwcml2YXRlIEltYWdlIGdldEltYWdlKE9iamVjdCBvYmopIHsKLQkJaWYgKGxhYmVsUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJbGFiZWxQcm92aWRlciA9IG5ldyBBZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIoCi0JCQkJCVRuZ1V0aWwudW1hSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkpOwotCQl9Ci0JCUltYWdlIHRpdGxlSW1hZ2UgPSBsYWJlbFByb3ZpZGVyLmdldEltYWdlKG9iaik7Ci0JCXJldHVybiB0aXRsZUltYWdlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLkFic3RyYWN0U2VjdGlvbiNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlpZiAobGFiZWxQcm92aWRlciAhPSBudWxsKSB7Ci0JCQlsYWJlbFByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJfQotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMudmlldy5JVGFiYmVkUHJvcGVydHlTZWN0aW9uI3JlZnJlc2goKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlZnJlc2goKSB7Ci0JCXRyeSB7Ci0JCQlpZiAoZ2V0RWxlbWVudCgpIGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudCkgewotCQkJCS8vIGdldCBCcmVha2Rvd25FbGVtZW50IG9iamVjdAotCQkJCWVsZW1lbnQgPSAoQnJlYWtkb3duRWxlbWVudCkgZ2V0RWxlbWVudCgpOwotCi0JCQkJLy8gdXBkYXRlIHNlY3Rpb24gbmFtZQotCQkJCWdlbmVyYWxTZWN0aW9uCi0JCQkJCQkuc2V0RGVzY3JpcHRpb24oUHJvcGVydGllc1Jlc291cmNlcy5iaW5kKFByb3BlcnRpZXNSZXNvdXJjZXMuUHJvY2Vzc19nZW5lcmFsSW5mb3JtYXRpb25EZXNjcmlwdGlvbiwgUHJvcGVydGllc1V0aWwuZ2V0VHlwZUxvd2VyKGVsZW1lbnQpKSk7IAotCi0JCQkJLy8gTW9kZWwgTW9kaWZ5IGxpc3RlbmVyIGZvciBwcmVzZW50YXRpb24gbmFtZQotCQkJCWlmIChtb2RlbE1vZGlmeUxpc3RlbmVyICE9IG51bGwpIHsKLQkJCQkJcHJlc2VudGF0aW9uTmFtZVRleHQKLQkJCQkJCQkucmVtb3ZlTW9kaWZ5TGlzdGVuZXIobW9kZWxNb2RpZnlMaXN0ZW5lcik7Ci0JCQkJfQotCQkJCW1vZGVsTW9kaWZ5TGlzdGVuZXIgPSBnZXRFZGl0b3IoKS5jcmVhdGVNb2RpZnlMaXN0ZW5lcihlbGVtZW50KTsKLQotCQkJCS8vIE1vZGlmeSBsaXN0ZW5lciBmb3IgbmFtZQotCQkJCWlmIChuYW1lTW9kaWZ5TGlzdGVuZXIgIT0gbnVsbCkKLQkJCQkJbmFtZVRleHQucmVtb3ZlTW9kaWZ5TGlzdGVuZXIobmFtZU1vZGlmeUxpc3RlbmVyKTsKLQotCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgUHJvY2VzcykgewotCQkJCQluYW1lTW9kaWZ5TGlzdGVuZXIgPSBjcmVhdGVOYW1lTW9kaWZ5TGlzdGVuZXIoCi0JCQkJCQkJKChQcm9jZXNzKSBlbGVtZW50KS5lQ29udGFpbmVyKCksIHRydWUpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCW5hbWVNb2RpZnlMaXN0ZW5lciA9IGNyZWF0ZU5hbWVNb2RpZnlMaXN0ZW5lcihlbGVtZW50KTsKLQkJCQl9Ci0KLQkJCQlpZiAobW9kZWxNb2RpZnlMaXN0ZW5lciBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnRFZGl0b3IuTW9kaWZ5TGlzdGVuZXIpIHsKLQkJCQkJKChNZXRob2RFbGVtZW50RWRpdG9yLk1vZGlmeUxpc3RlbmVyKSBtb2RlbE1vZGlmeUxpc3RlbmVyKQotCQkJCQkJCS5zZXRFbGVtZW50KGVsZW1lbnQpOwotCQkJCQkoKE1ldGhvZEVsZW1lbnRFZGl0b3IuTW9kaWZ5TGlzdGVuZXIpIG1vZGVsTW9kaWZ5TGlzdGVuZXIpCi0JCQkJCQkJLnNldERpc2FibGUodHJ1ZSk7Ci0JCQkJfQotCQkJCWlmIChuYW1lTW9kaWZ5TGlzdGVuZXIgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50RWRpdG9yLk1vZGlmeUxpc3RlbmVyKSB7Ci0JCQkJCSgoTWV0aG9kRWxlbWVudEVkaXRvci5Nb2RpZnlMaXN0ZW5lcikgbmFtZU1vZGlmeUxpc3RlbmVyKQotCQkJCQkJCS5zZXREaXNhYmxlKHRydWUpOwotCQkJCX0KLQotCQkJCW5hbWVUZXh0LnNldFRleHQoZWxlbWVudC5nZXROYW1lKCkpOwotCQkJCXByZXNlbnRhdGlvbk5hbWVUZXh0LnNldFRleHQoZWxlbWVudC5nZXRQcmVzZW50YXRpb25OYW1lKCkpOwotCi0JCQkJaWYgKG1vZGVsTW9kaWZ5TGlzdGVuZXIgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50RWRpdG9yLk1vZGlmeUxpc3RlbmVyKSB7Ci0JCQkJCSgoTWV0aG9kRWxlbWVudEVkaXRvci5Nb2RpZnlMaXN0ZW5lcikgbW9kZWxNb2RpZnlMaXN0ZW5lcikKLQkJCQkJCQkuc2V0RGlzYWJsZShmYWxzZSk7Ci0JCQkJfQotCQkJCWlmIChuYW1lTW9kaWZ5TGlzdGVuZXIgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50RWRpdG9yLk1vZGlmeUxpc3RlbmVyKSB7Ci0JCQkJCSgoTWV0aG9kRWxlbWVudEVkaXRvci5Nb2RpZnlMaXN0ZW5lcikgbmFtZU1vZGlmeUxpc3RlbmVyKQotCQkJCQkJCS5zZXREaXNhYmxlKGZhbHNlKTsKLQkJCQl9Ci0KLQkJCQluYW1lVGV4dC5hZGRNb2RpZnlMaXN0ZW5lcihuYW1lTW9kaWZ5TGlzdGVuZXIpOwotCQkJCXByZXNlbnRhdGlvbk5hbWVUZXh0LmFkZE1vZGlmeUxpc3RlbmVyKG1vZGVsTW9kaWZ5TGlzdGVuZXIpOwotCi0JCQkJbXVsdGlwbGVCdXR0b24uc2V0U2VsZWN0aW9uKGVsZW1lbnQuZ2V0SGFzTXVsdGlwbGVPY2N1cnJlbmNlcygpCi0JCQkJCQkuYm9vbGVhblZhbHVlKCkpOwotCQkJCW9wdGlvbmFsQnV0dG9uLnNldFNlbGVjdGlvbihlbGVtZW50LmdldElzT3B0aW9uYWwoKQotCQkJCQkJLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlwbGFubmVkQnV0dG9uLnNldFNlbGVjdGlvbihlbGVtZW50LmdldElzUGxhbm5lZCgpCi0JCQkJCQkuYm9vbGVhblZhbHVlKCkpOwotCQkJCS8vIGdldCBzZWxlY3RlZCBvcmlnaW5hbCBpbnB1dCBvYmplY3QKLQkJCQlPYmplY3QgaW5wdXQgPSBnZXRJbnB1dCgpOwotCQkJCWlmIChpbnB1dCBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSB7Ci0JCQkJCWlmIChnZXRFZGl0b3IoKS5nZXRTdXBwcmVzc2lvbigpLmlzSW5TdXBwcmVzc2VkTGlzdCgKLQkJCQkJCQkoQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIGlucHV0KSkgewotCQkJCQkJc3VwcmVzc2VkQnV0dG9uLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCXN1cHJlc3NlZEJ1dHRvbi5zZXRTZWxlY3Rpb24oZmFsc2UpOwotCQkJCQl9Ci0JCQkJfSBlbHNlCi0JCQkJc3VwcmVzc2VkQnV0dG9uLnNldFNlbGVjdGlvbihlbGVtZW50LmdldFN1cHByZXNzZWQoKQotCQkJCQkJLmJvb2xlYW5WYWx1ZSgpKTsKLQotCQkJCXVwZGF0ZUNvbnRyb2xzKCk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJbG9nZ2VyCi0JCQkJCS5sb2dFcnJvcigKLQkJCQkJCQkiRXJyb3IgcmVmcmVzaGluZyBicmVha2Rvd24gZWxlbWVudCBnZW5lcmFsIHNlY3Rpb24iICsgZWxlbWVudCwgZXgpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVDb250cm9scygpIHsKLQkJbmFtZVRleHQuc2V0RWRpdGFibGUoZWRpdGFibGUpOwotCQlwcmVzZW50YXRpb25OYW1lVGV4dC5zZXRFZGl0YWJsZShlZGl0YWJsZSk7Ci0JCW5hbWVUZXh0LnNldEVuYWJsZWQoZWRpdGFibGUpOwotCQlwcmVzZW50YXRpb25OYW1lVGV4dC5zZXRFbmFibGVkKGVkaXRhYmxlKTsKLQotCQltdWx0aXBsZUJ1dHRvbi5zZXRFbmFibGVkKGVkaXRhYmxlKTsKLQkJb3B0aW9uYWxCdXR0b24uc2V0RW5hYmxlZChlZGl0YWJsZSk7Ci0JCXBsYW5uZWRCdXR0b24uc2V0RW5hYmxlZChlZGl0YWJsZSk7Ci0vLwkJc3VwcmVzc2VkQnV0dG9uLnNldEVuYWJsZWQoZWRpdGFibGUpOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9CcmVha2Rvd25FbGVtZW50R3VpZGFuY2VTZWN0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvQnJlYWtkb3duRWxlbWVudEd1aWRhbmNlU2VjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNDRkNDg1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9CcmVha2Rvd25FbGVtZW50R3VpZGFuY2VTZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NTEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmRpYWxvZ3MuSXRlbXNGaWx0ZXJEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5maWx0ZXJzLlByb2Nlc3NHdWlkYW5jZUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC51dGlsLkRpYWdyYW1JbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JQWN0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbmZpZ3VyYXRpb24uR3VpZGFuY2VJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5GaWx0ZXJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5GaWx0ZXJJbml0aWFsaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuSUJTSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kLkFkZEd1aWRhbmNlVG9CcmVha2Rvd25FbGVtZW50Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DaGVja2xpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db25jZXB0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRXhhbXBsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkd1aWRhbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3VpZGVsaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUmV1c2FibGVBc3NldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlN1cHBvcnRpbmdNYXRlcmlhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Gb2N1c0FkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Gb2N1c0V2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLkZvcm1Ub29sa2l0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuU2VjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5UYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZTsKLQotLyoqCi0gKiBUaGUgYnJlYWtkb3duIGVsZW1lbnQgZ3VpZGFuY2Ugc2VjdGlvbi4gSXQgbGlzdCBhbGwgYXZhaWxhYmxlIGd1aWRhbmNlcyBmb3IgYW4gYnJlYWtkb3duIGVsZW1lbnQKLSAqIAotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjAKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgQnJlYWtkb3duRWxlbWVudEd1aWRhbmNlU2VjdGlvbiBleHRlbmRzIEFic3RyYWN0U2VjdGlvbiB7Ci0JcHJvdGVjdGVkIElMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIgPSBuZXcgQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyKAotCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJLmdldE5hdmlnYXRvclZpZXdfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKTsKLQotCXByaXZhdGUgRm9ybVRvb2xraXQgdG9vbGtpdDsKLQotCXByaXZhdGUgQnV0dG9uIGN0cmxfYWRkXzEsIGN0cmxfcmVtb3ZlXzE7Ci0KLQlwcml2YXRlIFRhYmxlIGN0cmxfdGFibGVfMTsKLQotCXByaXZhdGUgVGFibGVWaWV3ZXIgdmlld2VyXzE7Ci0KLQkvLyBlbGVtZW50Ci0JcHJpdmF0ZSBCcmVha2Rvd25FbGVtZW50IGVsZW1lbnQ7Ci0KLQkvLyBhY3Rpb24gbWFuYWdlcgotCXByaXZhdGUgSUFjdGlvbk1hbmFnZXIgYWN0aW9uTWdyOwotCi0JcHVibGljIGZpbmFsIFN0cmluZyB0YWJOYW1lID0gRmlsdGVyQ29uc3RhbnRzLkdVSURBTkNFOwotCi0JcHJpdmF0ZSBJRmlsdGVyIGdlbmVyYWxHdWlkYW5jZUZpbHRlciA9IG51bGw7Ci0KLQkKLQotCS8qKgotCSAqIEdldCBHZW5lcmFsIGd1aWRhbmNlIGZpbHRlcgotCSAqIAotCSAqLwotCXB1YmxpYyBJRmlsdGVyIGdldEdlbmVyYWxHdWlkYW5jZUZpbHRlcigpIHsKLQkJaWYgKGdlbmVyYWxHdWlkYW5jZUZpbHRlciA9PSBudWxsKSB7Ci0JCQlnZW5lcmFsR3VpZGFuY2VGaWx0ZXIgPSBuZXcgUHJvY2Vzc0d1aWRhbmNlRmlsdGVyKAotCQkJCQlnZXRDb25maWd1cmF0aW9uKCksIG51bGwsIHRhYk5hbWUpIHsKLQkJCQlwdWJsaWMgYm9vbGVhbiBjaGlsZEFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCQkJCWlmIChzdXBlci5jaGlsZEFjY2VwdChvYmopKQotCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCWlmIChvYmogaW5zdGFuY2VvZiBHdWlkYW5jZUl0ZW1Qcm92aWRlcikgewotCQkJCQkJaWYgKCgoR3VpZGFuY2VJdGVtUHJvdmlkZXIpIG9iaikuZ2V0Q2hpbGRyZW4ob2JqKQotCQkJCQkJCQkuaXNFbXB0eSgpKQotCQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJCWVsc2UKLQkJCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJfQotCQkJCQlDbGFzcyBjbHMgPSBGaWx0ZXJJbml0aWFsaXplci5nZXRJbnN0YW5jZSgpCi0JCQkJCQkJLmdldENsYXNzRm9yVHlwZShoZWxwZXIuZ2V0RmlsdGVyVHlwZVN0cigpKTsKLQkJCQkJaWYgKGNscyAhPSBudWxsKSB7Ci0JCQkJCQlpZiAoY2xzLmlzSW5zdGFuY2Uob2JqKSkgewotCQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJaWYgKChvYmogaW5zdGFuY2VvZiBDaGVja2xpc3QpIHx8IChvYmogaW5zdGFuY2VvZiBDb25jZXB0KQotCQkJCQkJCXx8IChvYmogaW5zdGFuY2VvZiBFeGFtcGxlKQotCQkJCQkJCXx8IChvYmogaW5zdGFuY2VvZiBHdWlkZWxpbmUpCi0JCQkJCQkJfHwgKG9iaiBpbnN0YW5jZW9mIFJldXNhYmxlQXNzZXQpCi0JCQkJCQkJfHwgKG9iaiBpbnN0YW5jZW9mIFN1cHBvcnRpbmdNYXRlcmlhbCkpCi0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQotCQkJCQlyZXR1cm4gZmFsc2U7Ci0KLQkJCQl9Ci0JCQl9OwotCQl9ZWxzZSB7Ci0JCQkoKFByb2Nlc3NHdWlkYW5jZUZpbHRlcikgZ2VuZXJhbEd1aWRhbmNlRmlsdGVyKS5zZXRNZXRob2RDb25maWd1cmF0aW9uKGdldENvbmZpZ3VyYXRpb24oKSk7Ci0JCX0KLQkJcmV0dXJuIGdlbmVyYWxHdWlkYW5jZUZpbHRlcjsKLQl9Ci0KLQkKLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLkFic3RyYWN0U2VjdGlvbiNjcmVhdGVDb250cm9scyhvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUsIG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLlRhYmJlZFByb3BlcnR5U2hlZXRQYWdlKQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2xzKENvbXBvc2l0ZSBwYXJlbnQsCi0JCQlUYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZSB0YWJiZWRQcm9wZXJ0eVNoZWV0UGFnZSkgewotCi0JCXN1cGVyLmNyZWF0ZUNvbnRyb2xzKHBhcmVudCwgdGFiYmVkUHJvcGVydHlTaGVldFBhZ2UpOwotCQlpbml0KCk7Ci0KLQkJcGFyZW50LnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQkJcGFyZW50LnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCi0JCS8vIGNyZWF0ZSBndWlkYW5jZSBzZWN0aW9uCi0JCWNyZWF0ZUd1aWRhbmNlU2VjdGlvbihwYXJlbnQpOwotCi0JCS8vIGFkZCBsaXN0ZW5lcnMKLQkJYWRkTGlzdGVuZXJzKCk7Ci0KLQkJLy8gdXBkYXRlIGNvbnRyb2xzCi0JCXVwZGF0ZUNvbnRyb2xzKCk7Ci0KLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplCi0JICovCi0JcHJpdmF0ZSB2b2lkIGluaXQoKSB7Ci0JCS8vIGdldCBhY3Rpdml0eSBvYmplY3QKLQkJZWxlbWVudCA9IChCcmVha2Rvd25FbGVtZW50KSBnZXRFbGVtZW50KCk7Ci0KLQkJLy8gZ2V0IHRvb2xraXQKLQkJdG9vbGtpdCA9IGdldFdpZGdldEZhY3RvcnkoKTsKLQotCQkvLyBnZXQgYWN0aW9uIG1hbmFnZXIKLQkJYWN0aW9uTWdyID0gRVBGUHJvcGVydHlTaGVldFBhZ2UuZ2V0QWN0aW9uTWFuYWdlcigpOwotCX0KLQotCi0JLyoqCi0JICogIFVwZGF0ZSBjb250cm9scyBiYXNlZCBvbiBlZGl0YWJsZSBmbGFnLiBDb250cm9scyBjYW4gYmVjb21lIGVkaXRhYmxlIG9yIHVuLWVkaXRhYmxlCi0JICovCi0JcHVibGljIHZvaWQgdXBkYXRlQ29udHJvbHMoKSB7Ci0JCWN0cmxfYWRkXzEuc2V0RW5hYmxlZChlZGl0YWJsZSk7Ci0JCQotCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHZpZXdlcl8xCi0JCQkJLmdldFNlbGVjdGlvbigpOwotCQlpZiAoc2VsZWN0aW9uLnNpemUoKSA+IDAgJiYgZWRpdGFibGUpIHsKLQkJCWN0cmxfcmVtb3ZlXzEuc2V0RW5hYmxlZCh0cnVlKTsKLQkJfSBlbHNlIHsKLQkJCWN0cmxfcmVtb3ZlXzEuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCX0KLQl9Ci0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuQWJzdHJhY3RQcm9wZXJ0eVNlY3Rpb24jcmVmcmVzaCgpCi0JICovCi0JcHVibGljIHZvaWQgcmVmcmVzaCgpIHsKLQkJdHJ5IHsKLQkJCWlmIChnZXRFbGVtZW50KCkgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50KSB7Ci0JCQkJZWxlbWVudCA9IChCcmVha2Rvd25FbGVtZW50KSBnZXRFbGVtZW50KCk7Ci0KLQkJCQl2aWV3ZXJfMS5yZWZyZXNoKCk7Ci0KLQkJCQkvLyBoaWRlL3Nob3cgY29udHJvbHMKLQkJCQl1cGRhdGVDb250cm9scygpOwotCQkJfQotCi0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJbG9nZ2VyLmxvZ0Vycm9yKCJFcnJvciByZWZyZXNoaW5nIGFjdGl2aXR5IGd1aWRhbmNlIHNlY3Rpb246ICIsIGV4KTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuQWJzdHJhY3RTZWN0aW9uI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQotCQlpZiAobGFiZWxQcm92aWRlciAhPSBudWxsKSB7Ci0JCQlsYWJlbFByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBndWlkYW5jZSBzZWN0aW9uIG9uIHRoZSBnaXZlbiBjb21wb3NpdGUKLQkgKiBAcGFyYW0gY29tcG9zaXRlCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUd1aWRhbmNlU2VjdGlvbihDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JCWludCB0YWJsZUhlaWdodCA9IDUwOwotCQlTdHJpbmcgc2VjdGlvblRpdGxlID0gbnVsbDsKLQkJU3RyaW5nIHNlY3Rpb25EZXNjID0gbnVsbDsKLQkJU3RyaW5nIHRhYmxlVGl0bGUgPSBudWxsOwotCi0JCS8vIEdFTkVSQUwgR1VJREFOQ0UKLQkJewotCQkJc2VjdGlvblRpdGxlID0gUHJvcGVydGllc1Jlc291cmNlcy5BY3Rpdml0eV9HZW5lcmFsR3VpZGFuY2VUaXRsZTsgCi0JCQlzZWN0aW9uRGVzYyA9IFByb3BlcnRpZXNSZXNvdXJjZXMuQWN0aXZpdHlfR2VuZXJhbEd1aWRhbmNlRGVzY3JpcHRpb247IAotCQkJdGFibGVUaXRsZSA9IFByb3BlcnRpZXNSZXNvdXJjZXMuQWN0aXZpdHlfU2VsZWN0ZWRfR2VuZXJhbEd1aWRhbmNlOyAKLQotCQkJU2VjdGlvbiBzZWN0aW9uID0gRm9ybVVJLmNyZWF0ZVNlY3Rpb24odG9vbGtpdCwgY29tcG9zaXRlLAotCQkJCQlzZWN0aW9uVGl0bGUsIHNlY3Rpb25EZXNjKTsKLQotCQkJLy8gY3JlYXRlIGNvbXBvc2l0ZQotCQkJQ29tcG9zaXRlIHNlY3Rpb25Db21wb3NpdGUgPSBGb3JtVUkuY3JlYXRlQ29tcG9zaXRlKHRvb2xraXQsCi0JCQkJCXNlY3Rpb24sIDIsIGZhbHNlKTsKLQotCQkJQ29tcG9zaXRlIHBhbmUxID0gRm9ybVVJLmNyZWF0ZUNvbXBvc2l0ZSh0b29sa2l0LCBzZWN0aW9uQ29tcG9zaXRlLAotCQkJCQlHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQkJRm9ybVVJLmNyZWF0ZUxhYmVsKHRvb2xraXQsIHBhbmUxLCB0YWJsZVRpdGxlKTsKLQotCQkJY3RybF90YWJsZV8xID0gRm9ybVVJLmNyZWF0ZVRhYmxlKHRvb2xraXQsIHBhbmUxLCB0YWJsZUhlaWdodCk7Ci0JCQl2aWV3ZXJfMSA9IG5ldyBUYWJsZVZpZXdlcihjdHJsX3RhYmxlXzEpOwotCQkJSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIgY29udGVudFByb3ZpZGVyID0gbmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKAotCQkJCQlnZXRBZGFwdGVyRmFjdG9yeSgpKSB7Ci0JCQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBvYmplY3QpIHsKLQkJCQkJcmV0dXJuIGdldEZpbHRlcmVkTGlzdChnZXRTZWxlY3RlZEd1aWRhbmNlcygpKS50b0FycmF5KCk7Ci0JCQkJfQotCQkJfTsKLQotCQkJdmlld2VyXzEuc2V0Q29udGVudFByb3ZpZGVyKGNvbnRlbnRQcm92aWRlcik7Ci0JCQl2aWV3ZXJfMS5zZXRMYWJlbFByb3ZpZGVyKGxhYmVsUHJvdmlkZXIpOwotCQkJdmlld2VyXzEuc2V0SW5wdXQoZWxlbWVudCk7Ci0KLQkJCS8vIGNyZWF0ZSBidXR0b25zIGZvciB0YWJsZTIKLQkJCUNvbXBvc2l0ZSBwYW5lMiA9IEZvcm1VSS5jcmVhdGVDb21wb3NpdGUodG9vbGtpdCwgc2VjdGlvbkNvbXBvc2l0ZSwKLQkJCQkJR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQ0VOVEVSCi0JCQkJCQkJfCBHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0NFTlRFUik7Ci0KLQkJCWN0cmxfYWRkXzEgPSBGb3JtVUkuY3JlYXRlQnV0dG9uKHRvb2xraXQsIHBhbmUyLAotCQkJCQlQcm9wZXJ0aWVzUmVzb3VyY2VzLlByb2Nlc3NfQWRkKTsKLQkJCWN0cmxfcmVtb3ZlXzEgPSBGb3JtVUkuY3JlYXRlQnV0dG9uKHRvb2xraXQsIHBhbmUyLAotCQkJCQlQcm9wZXJ0aWVzUmVzb3VyY2VzLlByb2Nlc3NfUmVtb3ZlKTsKLQotCQkJdG9vbGtpdC5wYWludEJvcmRlcnNGb3IocGFuZTEpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQWRkIGxpc3RlbmVycwotCSAqIAotCSAqLwotCXByaXZhdGUgdm9pZCBhZGRMaXN0ZW5lcnMoKSB7Ci0JCUl0ZW1Qcm92aWRlckFkYXB0ZXIgYWRhcHRlciA9IChJdGVtUHJvdmlkZXJBZGFwdGVyKSBnZXRBZGFwdGVyKCk7Ci0JCU9iamVjdCBwYXJlbnQgPSBudWxsOwotCQlpZiAoYWRhcHRlciBpbnN0YW5jZW9mIElCU0l0ZW1Qcm92aWRlcikgewotCQkJSUJTSXRlbVByb3ZpZGVyIGJzSXRlbVByb3ZpZGVyID0gKElCU0l0ZW1Qcm92aWRlcikgYWRhcHRlcjsKLQkJCXBhcmVudCA9IGJzSXRlbVByb3ZpZGVyLmdldFRvcEl0ZW0oKTsKLQkJfSBlbHNlIHsKLQkJCWxvZ2dlcgotCQkJCQkubG9nRXJyb3IoIkFjdGl2aXR5R3VpZGFuY2VTZWN0aW9uOjphZGRMaXN0ZW5lcnMgLSBJQlNJdGVtUHJvdmlkZXIgaXMgbnVsbCIpOyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm47Ci0JCX0KLQotCQl7Ci0JCQljdHJsX3RhYmxlXzEuYWRkRm9jdXNMaXN0ZW5lcihuZXcgRm9jdXNBZGFwdGVyKCkgewotCQkJCXB1YmxpYyB2b2lkIGZvY3VzR2FpbmVkKEZvY3VzRXZlbnQgZSkgewotCQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHZpZXdlcl8xCi0JCQkJCQkJLmdldFNlbGVjdGlvbigpOwotCQkJCQlpZiAoKHNlbGVjdGlvbi5zaXplKCkgPiAwKSAmJiBlZGl0YWJsZSkKLQkJCQkJCWN0cmxfcmVtb3ZlXzEuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQl9Ci0JCQl9KTsKLQotCQkJdmlld2VyXzEKLQkJCQkJLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQkJCQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB2aWV3ZXJfMQotCQkJCQkJCQkJLmdldFNlbGVjdGlvbigpOwotCQkJCQkJCWlmICgoc2VsZWN0aW9uLnNpemUoKSA+IDApICYmIGVkaXRhYmxlKQotCQkJCQkJCQljdHJsX3JlbW92ZV8xLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJCQl9Ci0JCQkJCX0pOwotCi0JCQljdHJsX2FkZF8xLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJSUZpbHRlciBmaWx0ZXIgPSBnZXRHZW5lcmFsR3VpZGFuY2VGaWx0ZXIoKTsKLQkJCQkJSXRlbXNGaWx0ZXJEaWFsb2cgZmQgPSBuZXcgSXRlbXNGaWx0ZXJEaWFsb2coUGxhdGZvcm1VSQotCQkJCQkJCS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKQotCQkJCQkJCS5nZXRTaGVsbCgpLCBmaWx0ZXIsIGVsZW1lbnQsCi0JCQkJCQkJRmlsdGVyQ29uc3RhbnRzLkdVSURBTkNFLCBnZXRTZWxlY3RlZEd1aWRhbmNlcygpKTsKLQotCQkJCQlmZC5zZXRUaXRsZShGaWx0ZXJDb25zdGFudHMuR1VJREFOQ0UpOwotCQkJCQlmZC5zZXRJbnB1dChVbWFVdGlsLmdldE1ldGhvZExpYnJhcnkoKEVPYmplY3QpIGVsZW1lbnQpKTsKLQkJCQkJZmQuc2V0QmxvY2tPbk9wZW4odHJ1ZSk7Ci0JCQkJCWZkLnNldFR5cGVzKGdldEZpbHRlclR5cGVzKCkpOwkJCQkKLQkJCQkJZmQub3BlbigpOwotCQkJCQlhZGRHdWlkYW5jZXMoZmQuZ2V0U2VsZWN0ZWRJdGVtcygpKTsKLQkJCQkJdmlld2VyXzEucmVmcmVzaCgpOwotCQkJCX0KLQkJCX0pOwotCi0JCQljdHJsX3JlbW92ZV8xLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB2aWV3ZXJfMQotCQkJCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQkJCQkJaWYgKHNlbGVjdGlvbi5zaXplKCkgPiAwKSB7Ci0JCQkJCQkvLyB1cGRhdGUgdGhlIG1vZGVsCi0JCQkJCQlBcnJheUxpc3Qgcm1JdGVtcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJCXJtSXRlbXMuYWRkQWxsKHNlbGVjdGlvbi50b0xpc3QoKSk7Ci0JCQkJCQlyZW1vdmVHdWlkYW5jZXMocm1JdGVtcyk7Ci0JCQkJCQl2aWV3ZXJfMS5yZWZyZXNoKCk7Ci0KLQkJCQkJCS8vIGNsZWFyIHRoZSBzZWxlY3Rpb24KLQkJCQkJCXZpZXdlcl8xLnNldFNlbGVjdGlvbihudWxsLCB0cnVlKTsKLQkJCQkJfQotCQkJCQljdHJsX3JlbW92ZV8xLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCX0KLQkJCX0pOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQWRkIGd1aWRhbmNlcyB0byB0aGUgZWxlbWVudAotCSAqIEBwYXJhbSBhZGRJdGVtcwotCSAqIAkJCQlsaXN0IG9mIGd1aWRhbmNlcyB0byBhZGQKLQkgKi8KLQlwcml2YXRlIHZvaWQgYWRkR3VpZGFuY2VzKExpc3Q8R3VpZGFuY2U+IGFkZEl0ZW1zKSB7Ci0JCS8vIHVwZGF0ZSB0aGUgbW9kZWwKLQkJQWRkR3VpZGFuY2VUb0JyZWFrZG93bkVsZW1lbnRDb21tYW5kIGNvbW1hbmQgPSBuZXcgQWRkR3VpZGFuY2VUb0JyZWFrZG93bkVsZW1lbnRDb21tYW5kKAotCQkJCWVsZW1lbnQsIGFkZEl0ZW1zKTsKLQkJYWN0aW9uTWdyLmV4ZWN1dGUoY29tbWFuZCk7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIGd1aWRhbmNlcyBmcm9tIHRoZSBlbGVtZW50Ci0JICogQHBhcmFtIHJtSXRlbXMKLQkgKiAJCQkJbGlzdCBvZiBndWlkYW5jZXMgdG8gcmVtb3ZlCi0JICovCi0JcHJpdmF0ZSB2b2lkIHJlbW92ZUd1aWRhbmNlcyhMaXN0PEd1aWRhbmNlPiBybUl0ZW1zKSB7Ci0JCS8vIHVwZGF0ZSB0aGUgbW9kZWwKLQkJaWYgKCFybUl0ZW1zLmlzRW1wdHkoKSkgewotCQkJZm9yIChJdGVyYXRvciBpdCA9IHJtSXRlbXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCUd1aWRhbmNlIGl0ZW0gPSAoR3VpZGFuY2UpIGl0Lm5leHQoKTsKLQotCQkJCS8vIGd1aWRhbmNlcyBmb3IgYWN0aXZpdHkKLQkJCQlpZiAoaXRlbSBpbnN0YW5jZW9mIENoZWNrbGlzdCkgewotCQkJCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuUkVNT1ZFLCBlbGVtZW50LAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEJyZWFrZG93bkVsZW1lbnRfQ2hlY2tsaXN0cygpLAotCQkJCQkJCWl0ZW0sIC0xKTsKLQkJCQl9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBDb25jZXB0KSB7Ci0JCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5SRU1PVkUsIGVsZW1lbnQsCi0JCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QnJlYWtkb3duRWxlbWVudF9Db25jZXB0cygpLCBpdGVtLAotCQkJCQkJCS0xKTsKLQkJCQl9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBFeGFtcGxlKSB7Ci0JCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5SRU1PVkUsIGVsZW1lbnQsCi0JCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QnJlYWtkb3duRWxlbWVudF9FeGFtcGxlcygpLCBpdGVtLAotCQkJCQkJCS0xKTsKLQkJCQl9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBTdXBwb3J0aW5nTWF0ZXJpYWwpIHsKLQkJCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlJFTU9WRSwgZWxlbWVudCwKLQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJLmdldEJyZWFrZG93bkVsZW1lbnRfU3VwcG9ydGluZ01hdGVyaWFscygpLCBpdGVtLAotCQkJCQkJCS0xKTsKLQkJCQl9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBHdWlkZWxpbmUpIHsKLQkJCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlJFTU9WRSwgZWxlbWVudCwKLQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRCcmVha2Rvd25FbGVtZW50X0d1aWRlbGluZXMoKSwKLQkJCQkJCQlpdGVtLCAtMSk7Ci0JCQkJfSBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgUmV1c2FibGVBc3NldCkgewotCQkJCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuUkVNT1ZFLCBlbGVtZW50LAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEJyZWFrZG93bkVsZW1lbnRfUmV1c2FibGVBc3NldHMoKSwKLQkJCQkJCQlpdGVtLCAtMSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJbG9nZ2VyCi0JCQkJCQkJLmxvZ0Vycm9yKCJDYW4ndCByZW1vdmUgR3VpZGFuY2U6ICIgKyBpdGVtLmdldFR5cGUoKS5nZXROYW1lKCkgKyAiOiIgKyBpdGVtLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCQotCS8qKgotCSAqIEdldCBzZWxlY3RlZCBndWlkYW5jZXMKLQkgKiBAcmV0dXJuCi0JICogCQkJbGlzdCBvZiBleGlzdGluZyBzZWxlY3RlZCBndWlkYW5jZXMKLQkgKi8KLQlwcml2YXRlIExpc3Q8R3VpZGFuY2U+IGdldFNlbGVjdGVkR3VpZGFuY2VzKCkgewotCQlMaXN0PEd1aWRhbmNlPiBpdGVtTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQlpdGVtTGlzdC5hZGRBbGwoZWxlbWVudC5nZXRDaGVja2xpc3RzKCkpOwotCQlpdGVtTGlzdC5hZGRBbGwoZWxlbWVudC5nZXRDb25jZXB0cygpKTsKLQkJaXRlbUxpc3QuYWRkQWxsKGVsZW1lbnQuZ2V0RXhhbXBsZXMoKSk7Ci0JCWl0ZW1MaXN0LmFkZEFsbChlbGVtZW50LmdldEd1aWRlbGluZXMoKSk7Ci0JCWl0ZW1MaXN0LmFkZEFsbChlbGVtZW50LmdldFJldXNhYmxlQXNzZXRzKCkpOwotCQlpdGVtTGlzdC5hZGRBbGwoZWxlbWVudC5nZXRTdXBwb3J0aW5nTWF0ZXJpYWxzKCkpOwotCi0JCXJldHVybiBpdGVtTGlzdDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gbGlzdCBvZiBmaWx0ZXIgdHlwZXMKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nW10gZ2V0RmlsdGVyVHlwZXMoKSB7Ci0JCVN0cmluZ1tdIHN0ciA9IG5ldyBTdHJpbmdbMTRdOwotCQlpbnQgaSA9IDA7Ci0JCXN0cltpKytdID0gRmlsdGVyQ29uc3RhbnRzLkdVSURBTkNFOwotCQlzdHJbaSsrXSA9IEZpbHRlckNvbnN0YW50cy5zcGFjZSArIEZpbHRlckNvbnN0YW50cy5DSEVDS0xJU1RTOwotCQlzdHJbaSsrXSA9IEZpbHRlckNvbnN0YW50cy5zcGFjZSArIEZpbHRlckNvbnN0YW50cy5DT05DRVBUUzsKLQkJc3RyW2krK10gPSBGaWx0ZXJDb25zdGFudHMuc3BhY2UKLQkJCQkrIEZpbHRlckNvbnN0YW50cy5FU1RJTUFURV9DT05TSURFUkFUSU9OUzsKLQkJc3RyW2krK10gPSBGaWx0ZXJDb25zdGFudHMuc3BhY2UgKyBGaWx0ZXJDb25zdGFudHMuRVhBTVBMRVM7Ci0JCXN0cltpKytdID0gRmlsdGVyQ29uc3RhbnRzLnNwYWNlICsgRmlsdGVyQ29uc3RhbnRzLkdVSURFTElORVM7Ci0JCXN0cltpKytdID0gRmlsdGVyQ29uc3RhbnRzLnNwYWNlICsgRmlsdGVyQ29uc3RhbnRzLlBSQUNUSUNFUzsKLQkJc3RyW2krK10gPSBGaWx0ZXJDb25zdGFudHMuc3BhY2UgKyBGaWx0ZXJDb25zdGFudHMuUkVQT1JUUzsKLQkJc3RyW2krK10gPSBGaWx0ZXJDb25zdGFudHMuc3BhY2UgKyBGaWx0ZXJDb25zdGFudHMuUkVVU0FCTEVfQVNTRVRTOwotCQlzdHJbaSsrXSA9IEZpbHRlckNvbnN0YW50cy5zcGFjZSArIEZpbHRlckNvbnN0YW50cy5TVVBQT1JUSU5HX01BVEVSSUFMUzsKLQkJc3RyW2krK10gPSBGaWx0ZXJDb25zdGFudHMuc3BhY2UgKyBGaWx0ZXJDb25zdGFudHMuVEVNUExBVEVTOwotCQlzdHJbaSsrXSA9IEZpbHRlckNvbnN0YW50cy5zcGFjZSArIEZpbHRlckNvbnN0YW50cy5UT09MX01FTlRPUlM7Ci0JCXN0cltpKytdID0gRmlsdGVyQ29uc3RhbnRzLnNwYWNlICsgRmlsdGVyQ29uc3RhbnRzLldISVRFX1BBUEVSUzsKLQkJc3RyW2krK10gPSBGaWx0ZXJDb25zdGFudHMuc3BhY2UgKyBGaWx0ZXJDb25zdGFudHMuVEVSTV9ERUZJTklUSU9OUzsKLQkJcmV0dXJuIHN0cjsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL0NvbXBvc2l0ZVJvbGVSb2xlU2VjdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL0NvbXBvc2l0ZVJvbGVSb2xlU2VjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMWZhMjA0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9Db21wb3NpdGVSb2xlUm9sZVNlY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXM7Ci0KLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5kaWFsb2dzLkl0ZW1zRmlsdGVyRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZmlsdGVycy5EZXNjcmlwdG9yUHJvY2Vzc0ZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSUFjdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5GaWx0ZXJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db21wb3NpdGVSb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuVGFiYmVkUHJvcGVydHlTaGVldFBhZ2U7Ci0KLQotLyoqCi0gKiBUaGUgY29tcG9zaXRlIHJvbGUgLSByb2xlIHNlY3Rpb24KLSAqIAotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjAKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgQ29tcG9zaXRlUm9sZVJvbGVTZWN0aW9uIGV4dGVuZHMgT0JTUmVsYXRpb25TZWN0aW9uIHsKLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5PQlNSZWxhdGlvblNlY3Rpb24jY3JlYXRlQ29udHJvbHMob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlLCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5UYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9scyhDb21wb3NpdGUgcGFyZW50LAotCQkJVGFiYmVkUHJvcGVydHlTaGVldFBhZ2UgdGFiYmVkUHJvcGVydHlTaGVldFBhZ2UpIHsKLQkJc3VwZXIuY3JlYXRlQ29udHJvbHMocGFyZW50LCB0YWJiZWRQcm9wZXJ0eVNoZWV0UGFnZSk7Ci0JfQotCi0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuT0JTUmVsYXRpb25TZWN0aW9uI2luaXRDb250ZW50UHJvdmlkZXIoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRDb250ZW50UHJvdmlkZXIoKSB7Ci0JCWNvbnRlbnRQcm92aWRlciA9IG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcihnZXRBZGFwdGVyRmFjdG9yeSgpKSB7Ci0JCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IG9iamVjdCkgewotCQkJCWVsZW1lbnQgPSBnZXRFbGVtZW50KCk7Ci0JCQkJcmV0dXJuIGdldEZpbHRlcmVkTGlzdCgKLQkJCQkJCSgoQ29tcG9zaXRlUm9sZSkgZWxlbWVudCkuZ2V0QWdncmVnYXRlZFJvbGVzKCkpCi0JCQkJCQkudG9BcnJheSgpOwotCQkJfQotCQl9OwotCi0JCXZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIoY29udGVudFByb3ZpZGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5PQlNSZWxhdGlvblNlY3Rpb24jaW5pdCgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdCgpIHsKLQkJc3VwZXIuaW5pdCgpOwotCQllbGVtZW50ID0gKENvbXBvc2l0ZVJvbGUpIGVsZW1lbnQ7Ci0KLQkJU3RyaW5nIHRpdGxlID0gUHJvcGVydGllc1Jlc291cmNlcy5Db21wb3NpdGVSb2xlX1JvbGVfU2VjdGlvblRpdGxlOwotCQlTdHJpbmcgZGVzYyA9IFByb3BlcnRpZXNSZXNvdXJjZXMuQ29tcG9zaXRlUm9sZV9Sb2xlX1NlY3Rpb25EZXNjcmlwdGlvbjsKLQkJU3RyaW5nIHRhYmxlMSA9IFByb3BlcnRpZXNSZXNvdXJjZXMuQ29tcG9zaXRlUm9sZV9Sb2xlX1RhYmxlMTsKLQkJc2V0VGFiRGF0YSh0aXRsZSwgZGVzYywgdGFibGUxKTsgCi0JCXNob3dBZGRGcm9tUHJvY2Vzc0J1dHRvbiA9IHRydWU7Ci0JfQotCi0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5PQlNSZWxhdGlvblNlY3Rpb24jcmVmcmVzaCgpCi0JICovCi0JcHVibGljIHZvaWQgcmVmcmVzaCgpIHsKLQkJdHJ5IHsKLQkJCWlmIChnZXRFbGVtZW50KCkgaW5zdGFuY2VvZiBDb21wb3NpdGVSb2xlKSB7Ci0JCQkJc3VwZXIucmVmcmVzaCgpOwotCi0JCQkJZWxlbWVudCA9IChDb21wb3NpdGVSb2xlKSBnZXRFbGVtZW50KCk7Ci0JCQkJdmlld2VyLnJlZnJlc2goKTsKLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQlsb2dnZXIubG9nRXJyb3IoCi0JCQkJCSJFcnJvciByZWZyZXNoaW5nIENvbXBvc2l0ZSByb2xlIC0gcm9sZSBzZWN0aW4gIiwgZXgpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBZGQgY29tcG9zaXRlIHJvbGVzIAotCSAqIEBwYXJhbSBpdGVtcwotCSAqIAkJTGlzdCBvZiByb2xlcwotCSAqLwotCXByaXZhdGUgdm9pZCBhZGQoTGlzdCBpdGVtcykgewotCQkvLyB1cGRhdGUgdGhlIG1vZGVsCi0JCWlmIChpdGVtcyAhPSBudWxsKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0b3IgPSBpdGVtcy5pdGVyYXRvcigpOyBpdG9yLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3Qgb2JqID0gaXRvci5uZXh0KCk7Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFJvbGUpIHsKLQkJCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLkFERCwKLQkJCQkJCQkoQ29tcG9zaXRlUm9sZSkgZWxlbWVudCwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCS5nZXRDb21wb3NpdGVSb2xlX0FnZ3JlZ2F0ZWRSb2xlcygpLAotCQkJCQkJCShSb2xlKSBvYmosIC0xKTsKLQkJCQl9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIFJvbGVEZXNjcmlwdG9yKSB7Ci0JCQkJCVJvbGUgcm9sZSA9ICgoUm9sZURlc2NyaXB0b3IpIG9iaikuZ2V0Um9sZSgpOwotCQkJCQlpZiAocm9sZSAhPSBudWxsKQotCQkJCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLkFERCwKLQkJCQkJCQkJKENvbXBvc2l0ZVJvbGUpIGVsZW1lbnQsIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJLmdldENvbXBvc2l0ZVJvbGVfQWdncmVnYXRlZFJvbGVzKCksCi0JCQkJCQkJCXJvbGUsIC0xKTsKLQkJCQkJZWxzZSB7Ci0JCQkJCQlNZXNzYWdlRm9ybWF0IG1mID0gbmV3IE1lc3NhZ2VGb3JtYXQoCi0JCQkJCQkJCVByb3BlcnRpZXNSZXNvdXJjZXMuUHJvY2Vzc19Db21wb3NpdGVSb2xlQXNzaWduRXJyb3IpOyAKLQkJCQkJCU9iamVjdFtdIGFyZ3MgPSB7ICgoUm9sZURlc2NyaXB0b3IpIG9iaikuZ2V0TmFtZSgpLAotCQkJCQkJCQkoKENvbXBvc2l0ZVJvbGUpIGVsZW1lbnQpLmdldE5hbWUoKSB9OwotCQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4KLQkJCQkJCQkJLmdldERlZmF1bHQoKQotCQkJCQkJCQkuZ2V0TXNnRGlhbG9nKCkKLQkJCQkJCQkJLmRpc3BsYXlJbmZvKAotCQkJCQkJCQkJCVByb3BlcnRpZXNSZXNvdXJjZXMuUHJvY2Vzc19Bc3NpZ25tZW50SW5mb1RpdGxlLCBtZi5mb3JtYXQoYXJncykpOyAKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLk9CU1JlbGF0aW9uU2VjdGlvbiNyZW1vdmUoamF2YS51dGlsLkFycmF5TGlzdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmUoQXJyYXlMaXN0IHJtSXRlbXMpIHsKLQkJLy8gdXBkYXRlIHRoZSBtb2RlbAotCQlpZiAoIXJtSXRlbXMuaXNFbXB0eSgpKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0b3IgPSBybUl0ZW1zLml0ZXJhdG9yKCk7IGl0b3IuaGFzTmV4dCgpOykgewotCQkJCVJvbGUgcm9sZSA9IChSb2xlKSBpdG9yLm5leHQoKTsKLQkJCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuUkVNT1ZFLAotCQkJCQkJKENvbXBvc2l0ZVJvbGUpIGVsZW1lbnQsIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCS5nZXRDb21wb3NpdGVSb2xlX0FnZ3JlZ2F0ZWRSb2xlcygpLCByb2xlLCAtMSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5PQlNSZWxhdGlvblNlY3Rpb24jb3BlbkFkZERpYWxvZygpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgb3BlbkFkZERpYWxvZygpIHsKLQkJTGlzdCBleGlzdGluZ0VsZW1lbnRzID0gKChDb21wb3NpdGVSb2xlKSBlbGVtZW50KS5nZXRBZ2dyZWdhdGVkUm9sZXMoKTsKLQkJSXRlbXNGaWx0ZXJEaWFsb2cgZmQgPSBuZXcgSXRlbXNGaWx0ZXJEaWFsb2coUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKQotCQkJCS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRTaGVsbCgpLCBnZXRGaWx0ZXIoKSwgZWxlbWVudCwKLQkJCQlGaWx0ZXJDb25zdGFudHMuUk9MRVMsIGV4aXN0aW5nRWxlbWVudHMpOwotCi0JCWZkLnNldEJsb2NrT25PcGVuKHRydWUpOwotCQlmZC5zZXRUaXRsZShGaWx0ZXJDb25zdGFudHMuUk9MRVMpOwotCQlmZC5vcGVuKCk7Ci0JCWFkZChmZC5nZXRTZWxlY3RlZEl0ZW1zKCkpOwotCi0JfQotCi0JcHJpdmF0ZSBMaXN0IGdldEV4aXN0aW5nRWxlbWVudHMoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLk9CU1JlbGF0aW9uU2VjdGlvbiNvcGVuQWRkRnJvbVByb2Nlc3NEaWFsb2coKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIG9wZW5BZGRGcm9tUHJvY2Vzc0RpYWxvZygpIHsKLQkJU3RyaW5nIHRhYk5hbWUgPSBGaWx0ZXJDb25zdGFudHMuUk9MRV9ERVNDUklQVE9SUzsKLQkJTGlzdCBleGlzdGluZ0VsZW1lbnRzID0gZ2V0RXhpc3RpbmdFbGVtZW50cygpOwotCQlQcm9jZXNzIHByb2Nlc3MgPSAoUHJvY2VzcykgZ2V0UHJvY2VzcyhlbGVtZW50KTsKLQkJSUZpbHRlciBkZXNjcmlwdG9yRmlsdGVyID0gZ2V0RGVzY3JpcHRvckZpbHRlcigpOwotCQlpZiAoZGVzY3JpcHRvckZpbHRlciAhPSBudWxsICYmIHByb2Nlc3MgIT0gbnVsbCkgewotCQkJSXRlbXNGaWx0ZXJEaWFsb2cgZmQgPSBuZXcgSXRlbXNGaWx0ZXJEaWFsb2coUGxhdGZvcm1VSQotCQkJCQkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0U2hlbGwoKSwKLQkJCQkJZGVzY3JpcHRvckZpbHRlciwgcHJvY2VzcywgdGFiTmFtZSwgZXhpc3RpbmdFbGVtZW50cyk7Ci0JCQlmZC5zZXRCbG9ja09uT3Blbih0cnVlKTsKLQkJCWZkLnNldFRpdGxlKEZpbHRlckNvbnN0YW50cy5ST0xFX0RFU0NSSVBUT1JTKTsKLQkJCWZkLm9wZW4oKTsKLQkJCWFkZChmZC5nZXRTZWxlY3RlZEl0ZW1zKCkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogR2V0IHBhcmVudCBGaW5kIHBhcmVudCB1bnRpbCBpdCdzIGFjdGl2aXR5LgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogQHJldHVybgotCSAqIAkJcHJvY2VzcyBvYmplY3QKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGdldFByb2Nlc3MoQnJlYWtkb3duRWxlbWVudCBlbGVtZW50KSB7Ci0JCUFkYXB0ZXJGYWN0b3J5IGFGYWN0b3J5ID0gVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkuZ2V0T0JTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKTsKLQkJSXRlbVByb3ZpZGVyQWRhcHRlciBhZGFwdGVyID0gKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIGFGYWN0b3J5LmFkYXB0KAotCQkJCWVsZW1lbnQsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCU9iamVjdCBwYXJlbnQgPSBhZGFwdGVyLmdldFBhcmVudChlbGVtZW50KTsKLQkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIFByb2Nlc3MpIHsKLQkJCXJldHVybiBwYXJlbnQ7Ci0KLQkJfSBlbHNlIHsKLQkJCXJldHVybiBnZXRQcm9jZXNzKChCcmVha2Rvd25FbGVtZW50KSBwYXJlbnQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGRlc2NyaXB0b3IgcHJvY2VzcyBmaWx0ZXIKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpbHRlciBnZXREZXNjcmlwdG9yRmlsdGVyKCkgewotCQlyZXR1cm4gbmV3IERlc2NyaXB0b3JQcm9jZXNzRmlsdGVyKGdldENvbmZpZ3VyYXRpb24oKSkgewotCQkJcHJvdGVjdGVkIGJvb2xlYW4gY2hpbGRBY2NlcHQoT2JqZWN0IG9iaikgewotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCQkvLyBMaXN0IGxpc3QgPSAoKEFjdGl2aXR5KW9iaikuZ2V0QnJlYWtkb3duRWxlbWVudHMoKTsKLQkJCQkJTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQlnZXRBY3Rpdml0aWVzSW5TY29wZShUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkJCS5nZXRPQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpLCBlbGVtZW50LCBsaXN0KTsKLQkJCQkJaWYgKGxpc3QuY29udGFpbnMob2JqKSkKLQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQllbHNlCi0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBDb21wb3NpdGVSb2xlKSB7Ci0JCQkJCWlmIChvYmouZXF1YWxzKGVsZW1lbnQpKQotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgUm9sZURlc2NyaXB0b3IpCi0JCQkJCXJldHVybiB0cnVlOwotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvRGVzY3JpcHRvckRvY3VtZW50U2VjdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL0Rlc2NyaXB0b3JEb2N1bWVudFNlY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGQzNzhmYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvRGVzY3JpcHRvckRvY3VtZW50U2VjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5NZXRob2RFbGVtZW50RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucmljaHRleHQuSU1ldGhvZFJpY2hUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudXRpbC5SaWNoVGV4dEltYWdlTGlua0NvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSUFjdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpcHRvckRlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLQotCi0vKioKLSAqIFRoZSBkb2N1bWVudCB0YWIgc2VjdGlvbiBmb3IgRGVzY3JpcHRvcgotICogCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBEZXNjcmlwdG9yRG9jdW1lbnRTZWN0aW9uIGV4dGVuZHMgQnJlYWtkb3duRWxlbWVudERvY3VtZW50U2VjdGlvbiB7Ci0KLQlwcm90ZWN0ZWQgRGVzY3JpcHRvciBlbGVtZW50OwotCi0JcHJpdmF0ZSBJTWV0aG9kUmljaFRleHQgcmVmaW5lZERlc2M7Ci0KLQlwcml2YXRlIExpc3RlbmVyIGxpc3RlbmVyID0gbmV3IExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQllbGVtZW50ID0gKERlc2NyaXB0b3IpIGdldEVsZW1lbnQoKTsKLQkJCUlNZXRob2RSaWNoVGV4dCBjb250cm9sID0gZXhwYW5kRmxhZyA/IGN0cmxfZG9jdW1lbnRfZXhwYW5kZWQKLQkJCQkJOiByZWZpbmVkRGVzYzsKLQkJCWlmICghY29udHJvbC5nZXRNb2RpZmllZCgpKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJU3RyaW5nIG9sZENvbnRlbnQgPSAoKERlc2NyaXB0b3JEZXNjcmlwdGlvbikgZWxlbWVudAotCQkJCQkuZ2V0UHJlc2VudGF0aW9uKCkpLmdldFJlZmluZWREZXNjcmlwdGlvbigpOwotCQkJaWYgKCgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpLm11c3RSZXN0b3JlVmFsdWUoCi0JCQkJCXJlZmluZWREZXNjLCBvbGRDb250ZW50KSkgewotCQkJCXJldHVybjsKLQkJCX0KLQkJCVN0cmluZyBuZXdDb250ZW50ID0gY29udHJvbC5nZXRUZXh0KCk7Ci0JCQlpZiAoIW5ld0NvbnRlbnQuZXF1YWxzKG9sZENvbnRlbnQpKSB7Ci0JCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlNFVCwgZWxlbWVudAotCQkJCQkJLmdldFByZXNlbnRhdGlvbigpLCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJLmdldERlc2NyaXB0b3JEZXNjcmlwdGlvbl9SZWZpbmVkRGVzY3JpcHRpb24oKSwKLQkJCQkJCW5ld0NvbnRlbnQsIC0xKTsKLQkJCX0KLQkJfQotCX07Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5CcmVha2Rvd25FbGVtZW50RG9jdW1lbnRTZWN0aW9uI2luaXQoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXQoKSB7Ci0JCXN1cGVyLmluaXQoKTsKLQkJZWxlbWVudCA9IChEZXNjcmlwdG9yKSBnZXRFbGVtZW50KCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuQnJlYWtkb3duRWxlbWVudERvY3VtZW50U2VjdGlvbiNjcmVhdGVEb2N1bWVudFNlY3Rpb24ob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZURvY3VtZW50U2VjdGlvbihDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JCXN1cGVyLmNyZWF0ZURvY3VtZW50U2VjdGlvbihjb21wb3NpdGUpOwotCQlpbnQgaGVpZ2h0SGludCA9IDIwMDsKLQotCQkvLyByZWZpbmVkIGRlc2NyaXB0aW9uCi0JCVJpY2hUZXh0SW1hZ2VMaW5rQ29udGFpbmVyIHJlZmluZWRDb250YWluZXIgPSBGb3JtVUkuY3JlYXRlUmljaFRleHRXaXRoTGluayh0b29sa2l0LAotCQkJCWRvY3VtZW50Q29tcG9zaXRlLCBoZWlnaHRIaW50LCBjb250ZW50RWxlbWVudFBhdGgsIGVsZW1lbnQsCi0JCQkJUHJvcGVydGllc1Jlc291cmNlcy5EZXNjcmlwdG9yX1JlZmluZWREZXNjcmlwdGlvbik7Ci0JCWFkZEh5cGVyTGlua0xpc3RlbmVyKHJlZmluZWRDb250YWluZXIubGluayk7Ci0JCXJlZmluZWREZXNjID0gcmVmaW5lZENvbnRhaW5lci5yaWNoVGV4dDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5CcmVha2Rvd25FbGVtZW50RG9jdW1lbnRTZWN0aW9uI2FkZExpc3RlbmVycygpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkTGlzdGVuZXJzKCkgewotCQlzdXBlci5hZGRMaXN0ZW5lcnMoKTsKLQkJcmVmaW5lZERlc2Muc2V0TW9kYWxPYmplY3QoZ2V0RWxlbWVudCgpKTsKLQkJcmVmaW5lZERlc2Muc2V0TW9kYWxPYmplY3RGZWF0dXJlKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkuZ2V0RGVzY3JpcHRvckRlc2NyaXB0aW9uX1JlZmluZWREZXNjcmlwdGlvbigpKTsKLQkJcmVmaW5lZERlc2MuYWRkTGlzdGVuZXIoU1dULkRlYWN0aXZhdGUsIGxpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5CcmVha2Rvd25FbGVtZW50RG9jdW1lbnRTZWN0aW9uI3VwZGF0ZUNvbnRyb2xzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVDb250cm9scygpIHsKLQkJc3VwZXIudXBkYXRlQ29udHJvbHMoKTsKLQkJcmVmaW5lZERlc2Muc2V0RWRpdGFibGUoZWRpdGFibGUpOwotCX0KLQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuQnJlYWtkb3duRWxlbWVudERvY3VtZW50U2VjdGlvbiNyZWZyZXNoKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWZyZXNoKCkgewotCQl0cnkgewotCQkJaWYgKGdldEVsZW1lbnQoKSBpbnN0YW5jZW9mIERlc2NyaXB0b3IpIHsKLQkJCQkoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpKS5zYXZlTW9kaWZpZWRSaWNoVGV4dCgpOwotCi0JCQkJZWxlbWVudCA9IChEZXNjcmlwdG9yKSBnZXRFbGVtZW50KCk7Ci0JCQkJRGVzY3JpcHRvckRlc2NyaXB0aW9uIGNvbnRlbnQgPSAoRGVzY3JpcHRvckRlc2NyaXB0aW9uKSBlbGVtZW50Ci0JCQkJCQkuZ2V0UHJlc2VudGF0aW9uKCk7Ci0KLQkJCQlpZiAoY29udGVudE1vZGlmeUxpc3RlbmVyICE9IG51bGwpIHsKLQkJCQkJcmVmaW5lZERlc2MucmVtb3ZlTW9kaWZ5TGlzdGVuZXIoY29udGVudE1vZGlmeUxpc3RlbmVyKTsJCQotCQkJCX0KLQkJCQotCQkJCXN1cGVyLnJlZnJlc2goKTsKLQotCQkJCWlmIChjb250ZW50TW9kaWZ5TGlzdGVuZXIgIT0gbnVsbCkgewotCQkJCQlpZiAoY29udGVudE1vZGlmeUxpc3RlbmVyIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudEVkaXRvci5Nb2RpZnlMaXN0ZW5lcikgewotCQkJCQkJKChNZXRob2RFbGVtZW50RWRpdG9yLk1vZGlmeUxpc3RlbmVyKSBjb250ZW50TW9kaWZ5TGlzdGVuZXIpCi0JCQkJCQkJCS5zZXRFbGVtZW50KGVsZW1lbnQuZ2V0UHJlc2VudGF0aW9uKCkpOwotCQkJCQkJKChNZXRob2RFbGVtZW50RWRpdG9yLk1vZGlmeUxpc3RlbmVyKSBjb250ZW50TW9kaWZ5TGlzdGVuZXIpCi0JCQkJCQkJCS5zZXREaXNhYmxlKHRydWUpOwotCQkJCQl9Ci0JCQkJfQotCQkJCQotCQkJCQotCQkJCXJlZmluZWREZXNjLnNldFRleHQoY29udGVudC5nZXRSZWZpbmVkRGVzY3JpcHRpb24oKSk7Ci0KLQkJCQlpZiAoZXhwYW5kRmxhZykgewotCQkJCQlpZiAoZXhwYW5kRG9jdW1lbnRMYWJlbC5nZXRUZXh0KCkKLQkJCQkJCQkuZXF1YWxzKAotCQkJCQkJCQkJUHJvcGVydGllc1Jlc291cmNlcy5EZXNjcmlwdG9yX1JlZmluZWREZXNjcmlwdGlvbikpIHsgCi0JCQkJCQljdHJsX2RvY3VtZW50X2V4cGFuZGVkLnNldFRleHQoY29udGVudAotCQkJCQkJCQkuZ2V0UmVmaW5lZERlc2NyaXB0aW9uKCkpOwotCQkJCQkJY3RybF9kb2N1bWVudF9leHBhbmRlZC5zZXRTZWxlY3Rpb24oMCk7Ci0JCQkJCQljdHJsX2RvY3VtZW50X2V4cGFuZGVkLnNldE1vZGFsT2JqZWN0KGNvbnRlbnQpOwotCQkJCQkJY3RybF9kb2N1bWVudF9leHBhbmRlZAotCQkJCQkJCQkuc2V0TW9kYWxPYmplY3RGZWF0dXJlKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJLmdldERlc2NyaXB0b3JEZXNjcmlwdGlvbl9SZWZpbmVkRGVzY3JpcHRpb24oKSk7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQlpZiAoY29udGVudE1vZGlmeUxpc3RlbmVyIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudEVkaXRvci5Nb2RpZnlMaXN0ZW5lcikgewotCQkJCQkoKE1ldGhvZEVsZW1lbnRFZGl0b3IuTW9kaWZ5TGlzdGVuZXIpIGNvbnRlbnRNb2RpZnlMaXN0ZW5lcikKLQkJCQkJCQkuc2V0RGlzYWJsZShmYWxzZSk7Ci0JCQkJfQotCi0JCQkJcmVmaW5lZERlc2Muc2V0TW9kYWxPYmplY3QoY29udGVudCk7Ci0JCQkJcmVmaW5lZERlc2Muc2V0TW9kYWxPYmplY3RGZWF0dXJlKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkuZ2V0RGVzY3JpcHRvckRlc2NyaXB0aW9uX1JlZmluZWREZXNjcmlwdGlvbigpKTsKLQkJCQlyZWZpbmVkRGVzYy5hZGRNb2RpZnlMaXN0ZW5lcihjb250ZW50TW9kaWZ5TGlzdGVuZXIpOwotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCWxvZ2dlcgotCQkJCQkubG9nRXJyb3IoCi0JCQkJCQkJIkVycm9yIHdoaWxlIHJlZnJlc2hpbmcgZGVzY3JpcHRvciBkb2N1bWVudGF0aW9uIHNlY3Rpb24gOiIsIGV4KTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL0Rlc2NyaXB0b3JHZW5lcmFsU2VjdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL0Rlc2NyaXB0b3JHZW5lcmFsU2VjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYTdiMTljLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9EZXNjcmlwdG9yR2VuZXJhbFNlY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExOCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSUFjdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuTGlicmFyeVVJVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0KLS8qKgotICogVGhlIGdlbmVyYWwgdGFiIHNlY3Rpb24gZm9yIERlc2NyaXB0b3IKLSAqIAotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjAKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgRGVzY3JpcHRvckdlbmVyYWxTZWN0aW9uIGV4dGVuZHMgQnJlYWtkb3duRWxlbWVudEdlbmVyYWxTZWN0aW9uIHsKLQlwcm90ZWN0ZWQgRGVzY3JpcHRvciBlbGVtZW50OwotCi0JcHJpdmF0ZSBCdXR0b24gc3luY2hyb25pemVkQnV0dG9uOwotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuQnJlYWtkb3duRWxlbWVudEdlbmVyYWxTZWN0aW9uI2luaXQoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXQoKSB7Ci0JCXN1cGVyLmluaXQoKTsKLQotCQkvLyBnZXQgRGVzY3JpcHRvciBvYmplY3QKLQkJZWxlbWVudCA9IChEZXNjcmlwdG9yKSBnZXRFbGVtZW50KCk7Ci0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5CcmVha2Rvd25FbGVtZW50R2VuZXJhbFNlY3Rpb24jY3JlYXRlR2VuZXJhbFNlY3Rpb24ob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUdlbmVyYWxTZWN0aW9uKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQkJc3VwZXIuY3JlYXRlR2VuZXJhbFNlY3Rpb24oY29tcG9zaXRlKTsKLQotCQkvLyBjcmVhdGUgY29tcG9zaXRlIGZvciBjaGVja2JveAotCQljaGVja0JveENvbXBvc2l0ZSA9IEZvcm1VSS5jcmVhdGVDb21wb3NpdGUodG9vbGtpdCwgZ2VuZXJhbENvbXBvc2l0ZSwKLQkJCQlHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwsIG51bU9mQ29sdW1ucywgdHJ1ZSk7Ci0KLQkJc3luY2hyb25pemVkQnV0dG9uID0gRm9ybVVJLmNyZWF0ZUNoZWNrQnV0dG9uKHRvb2xraXQsIGNoZWNrQm94Q29tcG9zaXRlLAotCQkJCTEpOwotCQlzeW5jaHJvbml6ZWRCdXR0b24uc2V0VGV4dChQcm9wZXJ0aWVzUmVzb3VyY2VzLkJyZWFrZG93bkVsZW1lbnRfT3B0aW9uX1N5bmNocm9uaXplZCk7IAotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLkJyZWFrZG93bkVsZW1lbnRHZW5lcmFsU2VjdGlvbiNhZGRMaXN0ZW5lcnMoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZExpc3RlbmVycygpIHsKLQkJc3VwZXIuYWRkTGlzdGVuZXJzKCk7Ci0KLQkJc3luY2hyb25pemVkQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5TRVQsIGVsZW1lbnQsCi0JCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkuZ2V0RGVzY3JpcHRvcl9Jc1N5bmNocm9uaXplZFdpdGhTb3VyY2UoKSwKLQkJCQkJCUJvb2xlYW4udmFsdWVPZihzeW5jaHJvbml6ZWRCdXR0b24uZ2V0U2VsZWN0aW9uKCkpLCAtMSk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLkJyZWFrZG93bkVsZW1lbnRHZW5lcmFsU2VjdGlvbiN1cGRhdGVDb250cm9scygpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlQ29udHJvbHMoKSB7Ci0JCXN1cGVyLnVwZGF0ZUNvbnRyb2xzKCk7Ci0JCXN5bmNocm9uaXplZEJ1dHRvbi5zZXRFbmFibGVkKGVkaXRhYmxlKTsKLQl9Ci0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLkJyZWFrZG93bkVsZW1lbnRHZW5lcmFsU2VjdGlvbiNyZWZyZXNoKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWZyZXNoKCkgewotCQl0cnkgewotCQkJaWYgKGdldEVsZW1lbnQoKSBpbnN0YW5jZW9mIERlc2NyaXB0b3IpIHsKLQkJCQlzdXBlci5yZWZyZXNoKCk7Ci0KLQkJCQllbGVtZW50ID0gKERlc2NyaXB0b3IpIGdldEVsZW1lbnQoKTsKLQotCQkJCXN5bmNocm9uaXplZEJ1dHRvbi5zZXRTZWxlY3Rpb24oZWxlbWVudAotCQkJCQkJLmdldElzU3luY2hyb25pemVkV2l0aFNvdXJjZSgpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCX0KLQotCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCWxvZ2dlcgotCQkJCQkubG9nRXJyb3IoCi0JCQkJCQkJIkVycm9yIHJlZnJlc2hpbmcgRGVzY3JpcHRvciBnZW5lcmFsIHNlY3Rpb246ICIsIGV4KTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuQWJzdHJhY3RTZWN0aW9uI2dldE5hbWVQcmVmaXgoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZVByZWZpeCgpIHsKLQkJcmV0dXJuIExpYnJhcnlVSVRleHQuVEVYVF9ERVNDUklQVE9SICsgIjogIjsgLy8kTk9OLU5MUy0xJAotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvRVBGUHJvcGVydHlTaGVldFBhZ2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9FUEZQcm9wZXJ0eVNoZWV0UGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYThjYjZhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9FUEZQcm9wZXJ0eVNoZWV0UGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5Qcm9jZXNzRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuUHJvY2Vzc0JyZWFrZG93blN0cnVjdHVyZUZvcm1QYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JQWN0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuZWRpdG9yLklGb3JtUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLklQcm9wZXJ0eVNoZWV0RW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5JUHJvcGVydHlTb3VyY2VQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLlByb3BlcnR5U2hlZXRFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5JVGFiYmVkUHJvcGVydHlTaGVldFBhZ2VDb250cmlidXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5UYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZTsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgcHJvcGVydHkgc2hlZXQgcGFnZSBmb3IgcHJvY2VzcyBlbGVtZW50cwotICogCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMAotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBFUEZQcm9wZXJ0eVNoZWV0UGFnZSBleHRlbmRzIFRhYmJlZFByb3BlcnR5U2hlZXRQYWdlIHsKLQotCXByaXZhdGUgSVByb3BlcnR5U2hlZXRFbnRyeSByb290RW50cnk7Ci0KLQlwcml2YXRlIHN0YXRpYyBJUHJvcGVydHlTb3VyY2VQcm92aWRlciBzb3VyY2VQcm92aWRlcjsKLQotCXByaXZhdGUgc3RhdGljIElTZWxlY3Rpb24gc2VsZWN0aW9uID0gbnVsbDsKLQotCXByaXZhdGUgc3RhdGljIElBY3Rpb25NYW5hZ2VyIGFjdGlvbk1ncjsKLQotCXByaXZhdGUgc3RhdGljIFByb2Nlc3NFZGl0b3IgcHJvY2Vzc0VkaXRvcjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGZvcm1QYWdlSUQgPSBudWxsOwotCQotCXByaXZhdGUgc3RhdGljIFByb2Nlc3NCcmVha2Rvd25TdHJ1Y3R1cmVGb3JtUGFnZSBmb3JtUGFnZSA9IG51bGw7Ci0KLQlwdWJsaWMgRVBGUHJvcGVydHlTaGVldFBhZ2UoUHJvY2Vzc0VkaXRvciBlZGl0b3IpIHsKLQkJc3VwZXIoKElUYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZUNvbnRyaWJ1dG9yKSBlZGl0b3IpOwotCi0JCWFjdGlvbk1nciA9ICgoUHJvY2Vzc0VkaXRvcikgZWRpdG9yKS5nZXRBY3Rpb25NYW5hZ2VyKCk7Ci0JCXByb2Nlc3NFZGl0b3IgPSBlZGl0b3I7Ci0KLQl9Ci0KLQkvKioKLQkgKiBHZXQgYWN0aW9uIG1hbmFnZXIKLQkgKiBAcmV0dXJuCi0JICogCQkJQWN0aW9uIE1hbmFnZXIKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElBY3Rpb25NYW5hZ2VyIGdldEFjdGlvbk1hbmFnZXIoKSB7Ci0JCXJldHVybiBhY3Rpb25NZ3I7Ci0JfQotCi0JLyoqCi0JICogR2V0IGVkaXRvciBhc3NvY2lhdGVkIHdpdGggcHJvcGVydHkgc2hlZXQgcGFnZQotCSAqIEByZXR1cm4KLQkgKiAJCQlQcm9jZXNzIEVkaXRvcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgUHJvY2Vzc0VkaXRvciBnZXRFZGl0b3IoKSB7Ci0JCXJldHVybiBwcm9jZXNzRWRpdG9yOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGdpdmVuIHByb3BlcnR5IHNvdXJjZSBwcm92aWRlciBhcyB0aGUgcHJvcGVydHkgc291cmNlIHByb3ZpZGVyLgotCSAqIDxwPgotCSAqIENhbGxpbmcgdGhpcyBtZXRob2QgaXMgb25seSB2YWxpZCBpZiB5b3UgYXJlIHVzaW5nIHRoaXMgcGFnZSdzIGRlZmF1bHQKLQkgKiByb290IGVudHJ5LgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gbmV3UHJvdmlkZXIKLQkgKiAgICAgICAgICAgIHRoZSBwcm9wZXJ0eSBzb3VyY2UgcHJvdmlkZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eVNvdXJjZVByb3ZpZGVyKElQcm9wZXJ0eVNvdXJjZVByb3ZpZGVyIG5ld1Byb3ZpZGVyKSB7Ci0JCXNvdXJjZVByb3ZpZGVyID0gbmV3UHJvdmlkZXI7Ci0JCWlmIChyb290RW50cnkgPT0gbnVsbCkgewotCQkJLy8gY3JlYXRlIGEgbmV3IHJvb3QKLQkJCVByb3BlcnR5U2hlZXRFbnRyeSByb290ID0gbmV3IFByb3BlcnR5U2hlZXRFbnRyeSgpOwotCi0JCQlyb290RW50cnkgPSByb290OwotCQl9Ci0JCWlmIChzb3VyY2VQcm92aWRlciAhPSBudWxsKSB7Ci0JCQkvLyBzZXQgdGhlIHByb3BlcnR5IHNvdXJjZSBwcm92aWRlciBmb3Igcm9vdCBlbnRyeQotCQkJaWYgKHJvb3RFbnRyeSBpbnN0YW5jZW9mIFByb3BlcnR5U2hlZXRFbnRyeSkgewotCQkJCSgoUHJvcGVydHlTaGVldEVudHJ5KSByb290RW50cnkpCi0JCQkJCQkuc2V0UHJvcGVydHlTb3VyY2VQcm92aWRlcihzb3VyY2VQcm92aWRlcik7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gcHJvcGVydHkgc291cmNlIHByb3ZpZGVyCi0JICovCi0JcHVibGljIHN0YXRpYyBJUHJvcGVydHlTb3VyY2VQcm92aWRlciBnZXRQcm9wZXJ0eVNvdXJjZVByb3ZpZGVyKCkgewotCQlyZXR1cm4gc291cmNlUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHNlbGVjdGlvbiBvZiB0aGUgb2JqZWN0IGZyb20gYnJlYWtkb3duIHN0cnVjdHVyZSBvZiB0aGUgcHJvY2VzcyBlZGl0b3IKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElTZWxlY3Rpb24gZ2V0U2VsZWN0aW9uKCkgewotCQlyZXR1cm4gc2VsZWN0aW9uOwotCX0KLQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5UYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZSNzZWxlY3Rpb25DaGFuZ2VkKG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0LCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb24pCi0JICovCi0JcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChJV29ya2JlbmNoUGFydCBwYXJ0LCBJU2VsZWN0aW9uIHNlbCkgewotCQlzZWxlY3Rpb24gPSBzZWw7Ci0KLQkJaWYgKHBhcnQgaW5zdGFuY2VvZiBQcm9jZXNzRWRpdG9yKSB7Ci0JCQlwcm9jZXNzRWRpdG9yID0gKFByb2Nlc3NFZGl0b3IpIHBhcnQ7Ci0JCQlhY3Rpb25NZ3IgPSBwcm9jZXNzRWRpdG9yLmdldEFjdGlvbk1hbmFnZXIoKTsKLQkJCUlGb3JtUGFnZSBhY3RpdmVQYWdlID0gcHJvY2Vzc0VkaXRvci5nZXRBY3RpdmVQYWdlSW5zdGFuY2UoKTsKLQkJCWlmIChhY3RpdmVQYWdlIGluc3RhbmNlb2YgUHJvY2Vzc0JyZWFrZG93blN0cnVjdHVyZUZvcm1QYWdlKQotCQkJCWZvcm1QYWdlID0gKFByb2Nlc3NCcmVha2Rvd25TdHJ1Y3R1cmVGb3JtUGFnZSkgYWN0aXZlUGFnZTsKLQkJCWZvcm1QYWdlSUQgPSBhY3RpdmVQYWdlICE9IG51bGwgPyBhY3RpdmVQYWdlLmdldElkKCkgOiBudWxsOwotCQl9Ci0KLQkJc3VwZXIuc2VsZWN0aW9uQ2hhbmdlZChwYXJ0LCBzZWxlY3Rpb24pOwotCQkKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLlRhYmJlZFByb3BlcnR5U2hlZXRQYWdlI2hhbmRsZVBhcnRBY3RpdmF0ZWQob3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQpCi0JICovCi0JcHVibGljIHZvaWQgaGFuZGxlUGFydEFjdGl2YXRlZChJV29ya2JlbmNoUGFydCBwYXJ0KSB7Ci0JCWlmIChwYXJ0IGluc3RhbmNlb2YgUHJvY2Vzc0VkaXRvcikgewotCQkJcHJvY2Vzc0VkaXRvciA9IChQcm9jZXNzRWRpdG9yKSBwYXJ0OwotCQkJc2VsZWN0aW9uID0gcHJvY2Vzc0VkaXRvci5nZXRTZWxlY3Rpb24oKTsKLQkJCWFjdGlvbk1nciA9IHByb2Nlc3NFZGl0b3IuZ2V0QWN0aW9uTWFuYWdlcigpOwotCQkJSUZvcm1QYWdlIGFjdGl2ZVBhZ2UgPSBwcm9jZXNzRWRpdG9yLmdldEFjdGl2ZVBhZ2VJbnN0YW5jZSgpOwotCQkJaWYgKGFjdGl2ZVBhZ2UgaW5zdGFuY2VvZiBQcm9jZXNzQnJlYWtkb3duU3RydWN0dXJlRm9ybVBhZ2UpCi0JCQkJZm9ybVBhZ2UgPSAoUHJvY2Vzc0JyZWFrZG93blN0cnVjdHVyZUZvcm1QYWdlKSBhY3RpdmVQYWdlOwotCQkJZm9ybVBhZ2VJRCA9IGFjdGl2ZVBhZ2UgIT0gbnVsbCA/IGFjdGl2ZVBhZ2UuZ2V0SWQoKSA6IG51bGw7Ci0JCX0KLQotCQlzdXBlci5oYW5kbGVQYXJ0QWN0aXZhdGVkKHBhcnQpOwotCQkKLQkJdGhpcy5yZWZyZXNoKCk7Ci0JfQotCi0JLyoqCi0JICogR2V0IGN1cnJlbnQgYWRhcHRlciBmYWN0b3J5IG9mIGVkaXRvcgotCSAqIEByZXR1cm4KLQkgKiAJCQlBZGFwdGVyIEZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEFkYXB0ZXJGYWN0b3J5IGdldEFkYXB0ZXJGYWN0b3J5KCkgewotCQlyZXR1cm4gZm9ybVBhZ2UuZ2V0QWRhcHRlckZhY3RvcnkoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLlRhYmJlZFByb3BlcnR5U2hlZXRQYWdlI3JlZnJlc2goKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlZnJlc2goKSB7Ci0KLQkJLy8gd2lsbCBzZWUgaWYgdGhpcyB3b3Jrcy4uCi0JCXRyeSB7Ci0JCQlzdXBlci5yZWZyZXNoKCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0KLQkJfQotCQkKLS8vIFRPRE8gLSBnZXQgcmlkIG9mIGludGVybmFsIEFQSXMuCi0vLwkJaWYgKHRoaXMuZ2V0Q3VycmVudFRhYigpICE9IG51bGwpIHsKLS8vCQkJdGhpcy5nZXRDdXJyZW50VGFiKCkucmVmcmVzaCgpOwotLy8KLS8vCQkJLy8gYWxzbyByZWZyZXNoIHNlY3Rpb24KLS8vCQkJSVNlY3Rpb24gc2VjdGlvbiA9IHRoaXMuZ2V0Q3VycmVudFRhYigpLmdldFNlY3Rpb25BdEluZGV4KDApOwotLy8JCQlpZiAoc2VjdGlvbiAhPSBudWxsKSB7Ci0vLwkJCQlzZWN0aW9uLnJlZnJlc2goKTsKLS8vCQkJfQotLy8JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9FbGVtZW50TGFiZWxQcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL0VsZW1lbnRMYWJlbFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5NGRlN2YuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL0VsZW1lbnRMYWJlbFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLkxpYnJhcnlVSUltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLkxpYnJhcnlVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLkFzc2VydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuSVR5cGVNYXBwZXI7Ci0KLQotLyoqCi0gKiBMYWJlbCBwcm92aWRlciBmb3IgdGhlIHRpdGxlIGJhciBmb3IgdGhlIHRhYmJlZCBwcm9wZXJ0eSBzaGVldCBwYWdlLgotICogCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRWxlbWVudExhYmVsUHJvdmlkZXIgZXh0ZW5kcyBMYWJlbFByb3ZpZGVyIHsKLQotCXByaXZhdGUgSVR5cGVNYXBwZXIgdHlwZU1hcHBlcjsKLQotCXByaXZhdGUgSUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlciA9IG51bGw7Ci0KLQkvKioKLQkgKiBDcmVhdGUgYW4gaW5zdGFuY2UKLQkgKi8KLQlwdWJsaWMgRWxlbWVudExhYmVsUHJvdmlkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JCXR5cGVNYXBwZXIgPSBuZXcgRWxlbWVudFR5cGVNYXBwZXIoKTsKLQl9Ci0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlciNnZXRJbWFnZShqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZShPYmplY3Qgb2JqZWN0cykgewotCQlpZiAob2JqZWN0cyA9PSBudWxsIHx8IG9iamVjdHMuZXF1YWxzKFN0cnVjdHVyZWRTZWxlY3Rpb24uRU1QVFkpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlJbWFnZSBpbWFnZSA9IExpYnJhcnlVSUltYWdlcy5JTUdfUFJPQ0VTUzsKLQkJZmluYWwgYm9vbGVhbiBtdWx0aXBsZVtdID0geyBmYWxzZSB9OwotCQlmaW5hbCBPYmplY3Qgb2JqZWN0ID0gZ2V0T2JqZWN0KG9iamVjdHMsIG11bHRpcGxlKTsKLQkJaWYgKG9iamVjdCA9PSBudWxsIHx8ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIG9iamVjdHMpLnNpemUoKSA+IDEpIHsKLQkJCXJldHVybiBpbWFnZTsKLQkJfSBlbHNlIHsKLQkJCU9iamVjdCBvYmogPSBMaWJyYXJ5VXRpbC51bndyYXAob2JqZWN0KTsKLQkJCWlmIChsYWJlbFByb3ZpZGVyID09IG51bGwpIHsKLQkJCQlsYWJlbFByb3ZpZGVyID0gbmV3IEFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcihUbmdVdGlsLnVtYUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KTsKLQkJCX0KLQkJCUltYWdlIHRpdGxlSW1hZ2UgPSBsYWJlbFByb3ZpZGVyLmdldEltYWdlKG9iaik7Ci0KLQkJCXJldHVybiB0aXRsZUltYWdlOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXIjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJbGFiZWxQcm92aWRlci5kaXNwb3NlKCk7Ci0JfQotCi0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlciNnZXRUZXh0KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3RzKSB7Ci0JCWlmIChvYmplY3RzID09IG51bGwgfHwgb2JqZWN0cy5lcXVhbHMoU3RydWN0dXJlZFNlbGVjdGlvbi5FTVBUWSkpIHsKLQkJCXJldHVybiBQcm9wZXJ0aWVzUmVzb3VyY2VzLlByb2Nlc3NfTm9JdGVtczsgCi0JCX0KLQkJZmluYWwgYm9vbGVhbiBtdWx0aXBsZVtdID0geyBmYWxzZSB9OwotCQlmaW5hbCBPYmplY3Qgb2JqZWN0ID0gZ2V0T2JqZWN0KG9iamVjdHMsIG11bHRpcGxlKTsKLQkJaWYgKG9iamVjdCA9PSBudWxsIHx8ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIG9iamVjdHMpLnNpemUoKSA+IDEpIHsKLQkJCU9iamVjdCBzaXplID0gbmV3IEludGVnZXIoKChJU3RydWN0dXJlZFNlbGVjdGlvbikgb2JqZWN0cykuc2l6ZSgpKTsKLQkJCVN0cmluZyBtc2cgPSBQcm9wZXJ0aWVzUmVzb3VyY2VzLmJpbmQoUHJvcGVydGllc1Jlc291cmNlcy5Qcm9jZXNzX0l0ZW1zU2VsZWN0ZWQsIChuZXcgT2JqZWN0W10geyBzaXplIH0pKTsgCi0JCQlyZXR1cm4gbXNnOwotCQl9IGVsc2UgewotCi0JCQlPYmplY3Qgb2JqID0gTGlicmFyeVV0aWwudW53cmFwKG9iamVjdCk7Ci0JCQlyZXR1cm4gZ2V0TmFtZShvYmopOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0TmFtZShPYmplY3Qgb2JqKSB7Ci0JCVN0cmluZyBuYW1lID0gbnVsbDsKLQotCQlTdHJpbmcgcHJlZml4ID0gUHJvcGVydGllc1V0aWwuZ2V0VHlwZShvYmopOwotCi0JCWlmIChvYmogaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50KSB7Ci0JCQluYW1lID0gcHJlZml4ICsgIiA6ICIgKyAoKEJyZWFrZG93bkVsZW1lbnQpIG9iaikuZ2V0TmFtZSgpOyAvLyROT04tTkxTLTEkCi0JCX0gZWxzZSB7Ci0JCQluYW1lID0gUHJvcGVydGllc1Jlc291cmNlcy5Qcm9jZXNzX05vUHJvcGVydGllc0F2YWlsYWJsZTsgCi0JCX0KLQotCQlyZXR1cm4gbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBEZXRlcm1pbmUgaWYgYSBtdWx0aXBsZSBvYmplY3Qgc2VsZWN0aW9uIGhhcyBiZWVuIHBhc3NlZCB0byB0aGUgbGFiZWwKLQkgKiBwcm92aWRlci4gSWYgdGhlIG9iamVjdHMgaXMgYSBJU3RydWN0dXJlZFNlbGVjdGlvbiwgc2VlIGlmIGFsbCB0aGUKLQkgKiBvYmplY3RzIGluIHRoZSBzZWxlY3Rpb24gYXJlIHRoZSBzYW1lIGFuZCBpZiBzbywgd2Ugd2FudCB0byBwcm92aWRlCi0JICogbGFiZWxzIGZvciB0aGUgY29tbW9uIHNlbGVjdGVkIGVsZW1lbnQuCi0JICogCi0JICogQHBhcmFtIG9iamVjdHMKLQkgKiAgICAgICAgICAgIGEgc2luZ2xlIG9iamVjdCBvciBhIElTdHJ1Y3R1cmVkU2VsZWN0aW9uLgotCSAqIEBwYXJhbSBtdWx0aXBsZQotCSAqICAgICAgICAgICAgZmlyc3QgZWxlbWVudCBpbiB0aGUgYXJyYXkgaXMgdHJ1ZSBpZiB0aGVyZSBpcyBtdWx0aXBsZQotCSAqICAgICAgICAgICAgdW5lcXVhbCBzZWxlY3RlZCBlbGVtZW50cyBpbiBhIElTdHJ1Y3R1cmVkU2VsZWN0aW9uLgotCSAqIEByZXR1cm4gdGhlIG9iamVjdCB0byBnZXQgbGFiZWxzIGZvci4KLQkgKi8KLQlwcml2YXRlIE9iamVjdCBnZXRPYmplY3QoT2JqZWN0IG9iamVjdHMsIGJvb2xlYW4gbXVsdGlwbGVbXSkgewotCQlBc3NlcnQuaXNOb3ROdWxsKG9iamVjdHMpOwotCQlPYmplY3Qgb2JqZWN0ID0gbnVsbDsKLQkJaWYgKG9iamVjdHMgaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgewotCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBvYmplY3RzOwotCQkJb2JqZWN0ID0gc2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOwotCQkJaWYgKHNlbGVjdGlvbi5zaXplKCkgPT0gMSkgewotCQkJCS8vIG9uZSBlbGVtZW50IHNlbGVjdGVkCi0JCQkJbXVsdGlwbGVbMF0gPSBmYWxzZTsKLQkJCQlyZXR1cm4gb2JqZWN0OwotCQkJfQotCQkJLy8gbXVsdGlwbGUgZWxlbWVudHMgc2VsZWN0ZWQKLQkJCW11bHRpcGxlWzBdID0gdHJ1ZTsKLS8vCQkJQ2xhc3MgZmlyc3RDbGFzcyA9IHR5cGVNYXBwZXIubWFwVHlwZShvYmplY3QsIG9iamVjdC5nZXRDbGFzcygpKTsKLQkJCUNsYXNzIGZpcnN0Q2xhc3MgPSB0eXBlTWFwcGVyLm1hcFR5cGUob2JqZWN0KTsKLQkJCS8vIGRldGVybWluZSBpZiBhbGwgdGhlIG9iamVjdHMgaW4gdGhlIHNlbGVjdGlvbiBhcmUgdGhlIHNhbWUgdHlwZQotCQkJaWYgKHNlbGVjdGlvbi5zaXplKCkgPiAxKSB7Ci0JCQkJZm9yIChJdGVyYXRvciBpID0gc2VsZWN0aW9uLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgewotCQkJCQlPYmplY3QgbmV4dCA9IGkubmV4dCgpOwotLy8JCQkJCUNsYXNzIG5leHRDbGFzcyA9IHR5cGVNYXBwZXIubWFwVHlwZShuZXh0LCBuZXh0Ci0vLwkJCQkJCQkuZ2V0Q2xhc3MoKSk7Ci0JCQkJCUNsYXNzIG5leHRDbGFzcyA9IHR5cGVNYXBwZXIubWFwVHlwZShuZXh0KTsKLQkJCQkJaWYgKCFuZXh0Q2xhc3MuZXF1YWxzKGZpcnN0Q2xhc3MpKSB7Ci0JCQkJCQkvLyB0d28gZWxlbWVudHMgbm90IGVxdWFsID09IG11bHRpcGxlIHNlbGVjdGVkIHVuZXF1YWwKLQkJCQkJCW11bHRpcGxlWzBdID0gZmFsc2U7Ci0JCQkJCQlvYmplY3QgPSBudWxsOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQltdWx0aXBsZVswXSA9IGZhbHNlOwotCQkJb2JqZWN0ID0gb2JqZWN0czsKLQkJfQotCQlyZXR1cm4gb2JqZWN0OwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9FbGVtZW50VHlwZU1hcHBlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL0VsZW1lbnRUeXBlTWFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4ZWMwNTcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL0VsZW1lbnRUeXBlTWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuSVR5cGVNYXBwZXI7Ci0KLQotLyoqCi0gKiBUeXBlIG1hcHBlciBmb3IgdGhlIGxvZ2ljIGV4YW1wbGUuIFdlIHdhbnQgdG8gZ2V0IHRoZSBHRUYgbW9kZWwgb2JqZWN0IGZyb20KLSAqIHRoZSBzZWxlY3RlZCBlbGVtZW50IGluIHRoZSBvdXRsaW5lIHZpZXcgYW5kIHRoZSBkaWFncmFtLiBXZSBjYW4gdGhlbiBmaWx0ZXIKLSAqIG9uIHRoZSBtb2RlbCBvYmplY3QgdHlwZS4KLSAqIAotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjAKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgRWxlbWVudFR5cGVNYXBwZXIgaW1wbGVtZW50cyBJVHlwZU1hcHBlciB7Ci0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuSVR5cGVNYXBwZXIjbWFwVHlwZShqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDbGFzcyBtYXBUeXBlKE9iamVjdCBvYmplY3QpIHsKLS8vCQlDbGFzcyB0eXBlID0gZWZmZWN0aXZlVHlwZTsKLQkJQ2xhc3MgdHlwZSA9IG51bGw7Ci0JCWlmIChvYmplY3QgIT0gbnVsbCkgewotCQkJdHlwZSA9IG9iamVjdC5nZXRDbGFzcygpOwotCQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnQpIHsKLQkJCQl0eXBlID0gKChCcmVha2Rvd25FbGVtZW50KSBvYmplY3QpLmdldENsYXNzKCk7Ci0JCQl9Ci0JCX0KLQkKLQkJcmV0dXJuIHR5cGU7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9Gb3JtVUkuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9Gb3JtVUkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzFlZDJjMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvRm9ybVVJLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSUltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQmFzZUZvcm1QYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuTWV0aG9kRm9ybVRvb2xraXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5yaWNodGV4dC5JTWV0aG9kUmljaFRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS51dGlsLlJpY2hUZXh0SW1hZ2VMaW5rQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5Gb3JtVG9vbGtpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLkltYWdlSHlwZXJsaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuU2VjdGlvbjsKLQotCi0vKioKLSAqIFRoZSBVSSB1dGlsIGNsYXNzIHRhaWxvcmVkIGZvciBwcm9wZXJ0aWVzIHZpZXcgZm9yIHByb2Nlc3MgYXV0aG9yaW5nCi0gKiAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEZvcm1VSSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9XSURUSCA9IDMwMDsKLQotCXByaXZhdGUgc3RhdGljIExhYmVsIF9jcmVhdGVMYWJlbChGb3JtVG9vbGtpdCB0b29sa2l0LCBDb21wb3NpdGUgcGFyZW50LAotCQkJU3RyaW5nIHN0ciwgaW50IGdyaWREYXRhU3R5bGUsIGludCBob3Jpem9udGFsU3BhbikgewotCQlMYWJlbCBsYWJlbCA9IHRvb2xraXQuY3JlYXRlTGFiZWwocGFyZW50LCBzdHIpOwotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShncmlkRGF0YVN0eWxlKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSBob3Jpem9udGFsU3BhbjsKLQkJbGFiZWwuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCXJldHVybiBsYWJlbDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIExhYmVsIGNyZWF0ZUxhYmVsKEZvcm1Ub29sa2l0IHRvb2xraXQsIENvbXBvc2l0ZSBwYXJlbnQsCi0JCQlTdHJpbmcgc3RyKSB7Ci0JCS8vIG1ha2UgaG9yaXpvbmF0YWxTcGFuIDEKLQkJcmV0dXJuIF9jcmVhdGVMYWJlbCh0b29sa2l0LCBwYXJlbnQsIHN0ciwgR3JpZERhdGEuQkVHSU5OSU5HLCAxKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIExhYmVsIGNyZWF0ZUxhYmVsKEZvcm1Ub29sa2l0IHRvb2xraXQsIENvbXBvc2l0ZSBwYXJlbnQsCi0JCQlTdHJpbmcgc3RyLCBpbnQgaG9yaXpvbnRhbFNwYW4pIHsKLQkJLy8gbWFrZSBob3Jpem9uYXRhbFNwYW4gMgotCQlyZXR1cm4gX2NyZWF0ZUxhYmVsKHRvb2xraXQsIHBhcmVudCwgc3RyLCBHcmlkRGF0YS5CRUdJTk5JTkcsCi0JCQkJaG9yaXpvbnRhbFNwYW4pOwotCX0KLQotCXByaXZhdGUgc3RhdGljIFRleHQgX2NyZWF0ZVRleHQoRm9ybVRvb2xraXQgdG9vbGtpdCwgQ29tcG9zaXRlIHBhcmVudCwKLQkJCWludCB0ZXh0U3R5bGUsIGludCBncmlkRGF0YVN0eWxlLCBpbnQgaGVpZ2h0LCBpbnQgd2lkdGgsCi0JCQlpbnQgaG9yaXpvbnRhbFNwYW4pIHsKLQkJVGV4dCBjb250cm9sID0gdG9vbGtpdC5jcmVhdGVUZXh0KHBhcmVudCwgIiIsIHRleHRTdHlsZSk7IC8vJE5PTi1OTFMtMSQKLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoZ3JpZERhdGFTdHlsZSk7Ci0JCWdyaWREYXRhLmhlaWdodEhpbnQgPSBoZWlnaHQ7Ci0JCWdyaWREYXRhLndpZHRoSGludCA9IHdpZHRoOwotCQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IGhvcml6b250YWxTcGFuOwotCQljb250cm9sLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQlyZXR1cm4gY29udHJvbDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFRleHQgY3JlYXRlVGV4dChGb3JtVG9vbGtpdCB0b29sa2l0LCBDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXJldHVybiBfY3JlYXRlVGV4dCh0b29sa2l0LCBwYXJlbnQsIFNXVC5TSU5HTEUgfCBTV1QuV1JBUCwKLQkJCQlHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwsIFNXVC5ERUZBVUxULCBERUZBVUxUX1dJRFRILAotCQkJCVNXVC5ERUZBVUxUKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFRleHQgY3JlYXRlVGV4dChGb3JtVG9vbGtpdCB0b29sa2l0LCBDb21wb3NpdGUgcGFyZW50LAotCQkJaW50IGhlaWdodCkgewotCQlyZXR1cm4gX2NyZWF0ZVRleHQodG9vbGtpdCwgcGFyZW50LCBTV1QuTVVMVEkgfCBTV1QuV1JBUCwKLQkJCQlHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwsIGhlaWdodCwgREVGQVVMVF9XSURUSCwgU1dULkRFRkFVTFQpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgVGV4dCBjcmVhdGVUZXh0KEZvcm1Ub29sa2l0IHRvb2xraXQsIENvbXBvc2l0ZSBwYXJlbnQsCi0JCQlpbnQgaGVpZ2h0LCBpbnQgaG9yaXpvbnRhbFNwYW4pIHsKLQkJcmV0dXJuIF9jcmVhdGVUZXh0KHRvb2xraXQsIHBhcmVudCwgU1dULlNJTkdMRSB8IFNXVC5XUkFQLAotCQkJCUdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCwgaGVpZ2h0LCBERUZBVUxUX1dJRFRILCBob3Jpem9udGFsU3Bhbik7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgSU1ldGhvZFJpY2hUZXh0IF9jcmVhdGVSaWNoVGV4dChGb3JtVG9vbGtpdCB0b29sa2l0LAotCQkJQ29tcG9zaXRlIHBhcmVudCwgaW50IGhlaWdodCwgaW50IHdpZHRoLCBTdHJpbmcgcGF0aCwKLQkJCU1ldGhvZEVsZW1lbnQgbWV0aG9kRWxlbWVudCwgTGFiZWwgbGFiZWwpIHsKLQkJSU1ldGhvZFJpY2hUZXh0IGNvbnRyb2wgPSBNZXRob2RGb3JtVG9vbGtpdC5jcmVhdGVSaWNoVGV4dCh0b29sa2l0LAotCQkJCXBhcmVudCwKLQkJCQkiIiwgU1dULk1VTFRJIHwgU1dULldSQVAgfCBTV1QuVl9TQ1JPTEwsIHBhdGgsIG1ldGhvZEVsZW1lbnQsIGxhYmVsKTsgLy8kTk9OLU5MUy0xJAotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwKLQkJCQl8IEdyaWREYXRhLkZJTExfVkVSVElDQUwpOwotCQlncmlkRGF0YS5oZWlnaHRIaW50ID0gaGVpZ2h0OwotCQlncmlkRGF0YS53aWR0aEhpbnQgPSB3aWR0aDsKLQkJY29udHJvbC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJcmV0dXJuIGNvbnRyb2w7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBSaWNoVGV4dEltYWdlTGlua0NvbnRhaW5lciBjcmVhdGVSaWNoVGV4dFdpdGhMaW5rKEZvcm1Ub29sa2l0IHRvb2xraXQsCi0JCQlDb21wb3NpdGUgcGFyZW50LCBpbnQgaGVpZ2h0LCBTdHJpbmcgcGF0aCwKLQkJCU1ldGhvZEVsZW1lbnQgbWV0aG9kRWxlbWVudCwgU3RyaW5nIGxhYmVsVGV4dCkgewotCQlJbWFnZUh5cGVybGluayBsaW5rID0gY3JlYXRlSW1hZ2VIeXBlckxpbmsodG9vbGtpdCwgcGFyZW50LCBBdXRob3JpbmdVSUltYWdlcy5JTUdfQ09MTEFQU0VELAotCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLm9wZW5SVEUpOwotCQlsaW5rLnNldERhdGEoIlRpdGxlIiwgbGFiZWxUZXh0KTsgLy8kTk9OLU5MUy0xJAotCQlMYWJlbCBkZWNvcmF0ZWRMYWJlbCA9IEJhc2VGb3JtUGFnZS5jcmVhdGVEZWNvcmF0ZWRMYWJlbCh0b29sa2l0LCBwYXJlbnQsIGxhYmVsVGV4dCk7Ci0JCSgoR3JpZERhdGEpZGVjb3JhdGVkTGFiZWwuZ2V0TGF5b3V0RGF0YSgpKS52ZXJ0aWNhbEFsaWdubWVudCA9IFNXVC5DRU5URVI7Ci0KLQkJSU1ldGhvZFJpY2hUZXh0IGNvbnRyb2wgPSBfY3JlYXRlUmljaFRleHQodG9vbGtpdCwgcGFyZW50LCBoZWlnaHQsIERFRkFVTFRfV0lEVEgsIHBhdGgsCi0JCQkJbWV0aG9kRWxlbWVudCwgZGVjb3JhdGVkTGFiZWwpOwotCQlsaW5rLnNldEhyZWYoY29udHJvbCk7Ci0KLQkJcmV0dXJuIG5ldyBSaWNoVGV4dEltYWdlTGlua0NvbnRhaW5lcihjb250cm9sLCBsaW5rLCBkZWNvcmF0ZWRMYWJlbCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJbWFnZUh5cGVybGluayBjcmVhdGVJbWFnZUh5cGVyTGluayhGb3JtVG9vbGtpdCB0b29sa2l0LAotCQkJQ29tcG9zaXRlIHBhcmVudCwgSW1hZ2UgaW1hZ2UsIFN0cmluZyB0b29sVGlwKSB7Ci0JCUltYWdlSHlwZXJsaW5rIGxpbmsgPSB0b29sa2l0LmNyZWF0ZUltYWdlSHlwZXJsaW5rKHBhcmVudCwgU1dULkxFRlQKLQkJCQl8IFNXVC5UT1ApOwotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5CRUdJTk5JTkcpOwotCQlsaW5rLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQlsaW5rLnNldEltYWdlKGltYWdlKTsKLQkJbGluay5zZXRUb29sVGlwVGV4dCh0b29sVGlwKTsKLQkJcmV0dXJuIGxpbms7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTZWN0aW9uIGNyZWF0ZVNlY3Rpb24oRm9ybVRvb2xraXQgdG9vbGtpdCwgQ29tcG9zaXRlIHBhcmVudCwKLQkJCVN0cmluZyB0aXRsZSwgU3RyaW5nIGRlc2NyaXB0aW9uKSB7Ci0JCVNlY3Rpb24gc2VjdGlvbiA9IHRvb2xraXQuY3JlYXRlU2VjdGlvbihwYXJlbnQsIFNlY3Rpb24uREVTQ1JJUFRJT04KLQkJCQl8IFNlY3Rpb24uVFdJU1RJRSB8IFNlY3Rpb24uRVhQQU5ERUQpOwotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQlzZWN0aW9uLnNldExheW91dERhdGEoZ2QpOwotCQlzZWN0aW9uLnNldFRleHQodGl0bGUpOwotCQlzZWN0aW9uLnNldERlc2NyaXB0aW9uKGRlc2NyaXB0aW9uKTsKLQkJdG9vbGtpdC5jcmVhdGVDb21wb3NpdGVTZXBhcmF0b3Ioc2VjdGlvbik7Ci0JCXNlY3Rpb24uc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQlyZXR1cm4gc2VjdGlvbjsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBTZWN0aW9uIGNyZWF0ZVNlY3Rpb24oRm9ybVRvb2xraXQgdG9vbGtpdCwgQ29tcG9zaXRlIHBhcmVudCwKLQkJCVN0cmluZyB0aXRsZSwgU3RyaW5nIGRlc2NyaXB0aW9uLCBpbnQgZ2RTdHlsZSkgewotCQlTZWN0aW9uIHNlY3Rpb24gPSB0b29sa2l0LmNyZWF0ZVNlY3Rpb24ocGFyZW50LCBTZWN0aW9uLkRFU0NSSVBUSU9OCi0JCQkJfCBTZWN0aW9uLlRXSVNUSUUgfCBTZWN0aW9uLkVYUEFOREVEKTsKLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoZ2RTdHlsZSk7Ci0JCXNlY3Rpb24uc2V0TGF5b3V0RGF0YShnZCk7Ci0JCXNlY3Rpb24uc2V0VGV4dCh0aXRsZSk7Ci0JCXNlY3Rpb24uc2V0RGVzY3JpcHRpb24oZGVzY3JpcHRpb24pOwotCQl0b29sa2l0LmNyZWF0ZUNvbXBvc2l0ZVNlcGFyYXRvcihzZWN0aW9uKTsKLQkJc2VjdGlvbi5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JCXJldHVybiBzZWN0aW9uOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgQ29tcG9zaXRlIGNyZWF0ZUNvbXBvc2l0ZShGb3JtVG9vbGtpdCB0b29sa2l0LAotCQkJU2VjdGlvbiBzZWN0aW9uLCBpbnQgbnVtT2ZDb2x1bW5zLCBib29sZWFuIGV4cGFuZGVkKSB7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSB0b29sa2l0LmNyZWF0ZUNvbXBvc2l0ZShzZWN0aW9uKTsKLQkJY29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KG51bU9mQ29sdW1ucywgZmFsc2UpKTsKLQkJaWYgKCFleHBhbmRlZCkKLQkJCXNlY3Rpb24uc2V0Q2xpZW50KGNvbXBvc2l0ZSk7Ci0JCWVsc2UKLQkJCWNvbXBvc2l0ZS5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBDb21wb3NpdGUgY3JlYXRlQ29tcG9zaXRlKEZvcm1Ub29sa2l0IHRvb2xraXQsCi0JCQlDb21wb3NpdGUgcGFyZW50LCBpbnQgZ3JpZFN0eWxlKSB7Ci0JCUNvbXBvc2l0ZSBwYW5lID0gdG9vbGtpdC5jcmVhdGVDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKGdyaWRTdHlsZSk7Ci0JCXBhbmUuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCXBhbmUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQlyZXR1cm4gcGFuZTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIENvbXBvc2l0ZSBjcmVhdGVDb21wb3NpdGUoRm9ybVRvb2xraXQgdG9vbGtpdCwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsIGludCBncmlkU3R5bGUsIGludCBudW1PZkNvbHVtbnMsCi0JCQlib29sZWFuIGVxdWFsU2l6ZUNvbHVtbikgewotCQlDb21wb3NpdGUgcGFuZSA9IHRvb2xraXQuY3JlYXRlQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShncmlkU3R5bGUpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IG51bU9mQ29sdW1uczsKLQkJcGFuZS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dChudW1PZkNvbHVtbnMsIGVxdWFsU2l6ZUNvbHVtbik7Ci0JCWxheW91dC5tYXJnaW5Cb3R0b20gPSAwOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJbGF5b3V0Lm1hcmdpbkxlZnQgPSAwOwotCQlsYXlvdXQubWFyZ2luUmlnaHQgPSAwOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQlwYW5lLnNldExheW91dChsYXlvdXQpOwotCQlyZXR1cm4gcGFuZTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBCdXR0b24gX2NyZWF0ZUJ1dHRvbihGb3JtVG9vbGtpdCB0b29sa2l0LCBDb21wb3NpdGUgcGFyZW50LAotCQkJU3RyaW5nIGJ1dHRvblN0ciwgaW50IHN0eWxlLCBpbnQgaG9yaXpvbnRhbFNwYW4pIHsKLQkJQnV0dG9uIGNvbnRyb2wgPSB0b29sa2l0LmNyZWF0ZUJ1dHRvbihwYXJlbnQsIGJ1dHRvblN0ciwgc3R5bGUpOwotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IGhvcml6b250YWxTcGFuOwotCQljb250cm9sLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQlyZXR1cm4gY29udHJvbDsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBCdXR0b24gX2NyZWF0ZUJ1dHRvbihGb3JtVG9vbGtpdCB0b29sa2l0LCBDb21wb3NpdGUgcGFyZW50LAotCQkJU3RyaW5nIGJ1dHRvblN0ciwgaW50IHN0eWxlKSB7Ci0JCUJ1dHRvbiBjb250cm9sID0gdG9vbGtpdC5jcmVhdGVCdXR0b24ocGFyZW50LCBidXR0b25TdHIsIHN0eWxlKTsKLQkJY29udHJvbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJcmV0dXJuIGNvbnRyb2w7Ci0JfQotCQotCQotCi0JcHJpdmF0ZSBzdGF0aWMgQ29tYm8gX2NyZWF0ZUNvbWJvKEZvcm1Ub29sa2l0IHRvb2xraXQsIENvbXBvc2l0ZSBwYXJlbnQsCi0JCQlpbnQgc3R5bGUsIGludCBob3Jpem9udGFsU3BhbikgewotCQlDb21ibyBjb21ibyA9IG5ldyBDb21ibyhwYXJlbnQsIHN0eWxlKTsKLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuQkVHSU5OSU5HKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSBob3Jpem9udGFsU3BhbjsKLQkJY29tYm8uc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCXJldHVybiBjb21ibzsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIENvbWJvIGNyZWF0ZUNvbWJvKEZvcm1Ub29sa2l0IHRvb2xraXQsIENvbXBvc2l0ZSBwYXJlbnQsCi0JCQlpbnQgaG9yaXpvbnRhbFNwYW4pIHsKLQkJcmV0dXJuIF9jcmVhdGVDb21ibyh0b29sa2l0LCBwYXJlbnQsIFNXVC5TSU5HTEUgfCBTV1QuRkxBVAotCQkJCXwgU1dULlJFQURfT05MWSwgaG9yaXpvbnRhbFNwYW4pOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIEJ1dHRvbiBjcmVhdGVCdXR0b24oRm9ybVRvb2xraXQgdG9vbGtpdCwgQ29tcG9zaXRlIHBhcmVudCwKLQkJCVN0cmluZyBidXR0b25TdHIpIHsKLQkJcmV0dXJuIF9jcmVhdGVCdXR0b24odG9vbGtpdCwgcGFyZW50LCBidXR0b25TdHIsIFNXVC5OT05FKTsKLQl9Ci0KLQotCXB1YmxpYyBzdGF0aWMgQnV0dG9uIGNyZWF0ZUJ1dHRvbihGb3JtVG9vbGtpdCB0b29sa2l0LCBDb21wb3NpdGUgcGFyZW50LAotCQkJaW50IHN0eWxlLCBpbnQgaG9yaXpvbnRhbFNwYW4pIHsKLQkJcmV0dXJuIF9jcmVhdGVCdXR0b24odG9vbGtpdCwgcGFyZW50LCAiIiwgc3R5bGUsIGhvcml6b250YWxTcGFuKTsgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQlwdWJsaWMgc3RhdGljIEJ1dHRvbiBjcmVhdGVDaGVja0J1dHRvbihGb3JtVG9vbGtpdCB0b29sa2l0LCBDb21wb3NpdGUgcGFyZW50LCBpbnQgaG9yaXpvbnRhbFNwYW4pCi0JewotCQlCdXR0b24gY29udHJvbCA9IHRvb2xraXQuY3JlYXRlQnV0dG9uKHBhcmVudCwgIiIsIFNXVC5DSEVDSyk7CQkvLyROT04tTkxTLTEkCi0JCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTCk7Ci0JCWdyaWREYXRhLmhvcml6b250YWxTcGFuID0gaG9yaXpvbnRhbFNwYW47Ci0JCWNvbnRyb2wuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCXJldHVybiBjb250cm9sOwotCX0KLQotCXByaXZhdGUgc3RhdGljIFRhYmxlIF9jcmVhdGVUYWJsZShGb3JtVG9vbGtpdCB0b29sa2l0LCBDb21wb3NpdGUgcGFyZW50LAotCQkJaW50IHRhYmxlU3R5bGUsIGludCBncmlkU3R5bGUsIGludCBoZWlnaHQsIGludCB3aWR0aCwKLQkJCWludCB2ZXJ0aWNhbFNwYW4sIGludCBob3Jpem9udGFsU3BhbikgewotCQlUYWJsZSB0YWJsZSA9IHRvb2xraXQuY3JlYXRlVGFibGUocGFyZW50LCB0YWJsZVN0eWxlKTsKLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoZ3JpZFN0eWxlKTsKLQkJZ3JpZERhdGEuaGVpZ2h0SGludCA9IGhlaWdodDsKLQkJZ3JpZERhdGEud2lkdGhIaW50ID0gd2lkdGg7Ci0JCWdyaWREYXRhLnZlcnRpY2FsU3BhbiA9IHZlcnRpY2FsU3BhbjsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSBob3Jpem9udGFsU3BhbjsKLQkJdGFibGUuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCXJldHVybiB0YWJsZTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFRhYmxlIGNyZWF0ZVRhYmxlKEZvcm1Ub29sa2l0IHRvb2xraXQsIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJcmV0dXJuIF9jcmVhdGVUYWJsZSh0b29sa2l0LCBwYXJlbnQsIFNXVC5NVUxUSSwgR3JpZERhdGEuRklMTF9CT1RILAotCQkJCTIwMCwgMjAwLCAxLCAxKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFRhYmxlIGNyZWF0ZVRhYmxlKEZvcm1Ub29sa2l0IHRvb2xraXQsIENvbXBvc2l0ZSBwYXJlbnQsCi0JCQlpbnQgaGVpZ2h0KSB7Ci0JCXJldHVybiBfY3JlYXRlVGFibGUodG9vbGtpdCwgcGFyZW50LCBTV1QuTVVMVEksIEdyaWREYXRhLkZJTExfQk9USCwKLQkJCQloZWlnaHQsIDIwMCwgMSwgMSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL01pbGVzdG9uZURvY3VtZW50U2VjdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL01pbGVzdG9uZURvY3VtZW50U2VjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NzhlNTQwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9NaWxlc3RvbmVEb2N1bWVudFNlY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuTWV0aG9kRWxlbWVudEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnJpY2h0ZXh0LklNZXRob2RSaWNoVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnV0aWwuUmljaFRleHRJbWFnZUxpbmtDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklBY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci0KLQotLyoqCi0gKiBUaGUgZG9jdW1lbnQgdGFiIHNlY3Rpb24gZm9yIE1pbGVzdG9uZQotICogCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBNaWxlc3RvbmVEb2N1bWVudFNlY3Rpb24gZXh0ZW5kcyBCcmVha2Rvd25FbGVtZW50RG9jdW1lbnRTZWN0aW9uIHsKLQotCXByb3RlY3RlZCBCcmVha2Rvd25FbGVtZW50IGVsZW1lbnQ7Ci0KLQlwcml2YXRlIElNZXRob2RSaWNoVGV4dCBtYWluRGVzYzsKLQotCXByaXZhdGUgTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCWVsZW1lbnQgPSAoQnJlYWtkb3duRWxlbWVudCkgZ2V0RWxlbWVudCgpOwotCQkJSU1ldGhvZFJpY2hUZXh0IGNvbnRyb2wgPSBleHBhbmRGbGFnID8gY3RybF9kb2N1bWVudF9leHBhbmRlZAotCQkJCQk6IG1haW5EZXNjOwotCQkJaWYgKCFjb250cm9sLmdldE1vZGlmaWVkKCkpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlTdHJpbmcgb2xkQ29udGVudCA9ICgoQ29udGVudERlc2NyaXB0aW9uKSBlbGVtZW50LmdldFByZXNlbnRhdGlvbigpKQotCQkJCQkuZ2V0TWFpbkRlc2NyaXB0aW9uKCk7Ci0JCQlpZiAoKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkubXVzdFJlc3RvcmVWYWx1ZShtYWluRGVzYywKLQkJCQkJb2xkQ29udGVudCkpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlTdHJpbmcgbmV3Q29udGVudCA9IGNvbnRyb2wuZ2V0VGV4dCgpOwotCQkJaWYgKCFuZXdDb250ZW50LmVxdWFscyhvbGRDb250ZW50KSkgewotCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5TRVQsIGVsZW1lbnQKLQkJCQkJCS5nZXRQcmVzZW50YXRpb24oKSwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCS5nZXRDb250ZW50RGVzY3JpcHRpb25fTWFpbkRlc2NyaXB0aW9uKCksIG5ld0NvbnRlbnQsCi0JCQkJCQktMSk7Ci0JCQl9Ci0JCX0KLQl9OwotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuQnJlYWtkb3duRWxlbWVudERvY3VtZW50U2VjdGlvbiNpbml0KCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0KCkgewotCQlzdXBlci5pbml0KCk7Ci0JCWVsZW1lbnQgPSAoQnJlYWtkb3duRWxlbWVudCkgZ2V0RWxlbWVudCgpOwotCi0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuQnJlYWtkb3duRWxlbWVudERvY3VtZW50U2VjdGlvbiNjcmVhdGVEb2N1bWVudFNlY3Rpb24ob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZURvY3VtZW50U2VjdGlvbihDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JCXN1cGVyLmNyZWF0ZURvY3VtZW50U2VjdGlvbihjb21wb3NpdGUpOwotCQlpbnQgaGVpZ2h0SGludCA9IDIwMDsKLQotCQkvLyBtYWluIGRlc2NyaXB0aW9uCi0JCVJpY2hUZXh0SW1hZ2VMaW5rQ29udGFpbmVyIG1haW5EZXNjQ29udGFpbmVyID0gRm9ybVVJLmNyZWF0ZVJpY2hUZXh0V2l0aExpbmsodG9vbGtpdCwKLQkJCQlkb2N1bWVudENvbXBvc2l0ZSwgaGVpZ2h0SGludCwgY29udGVudEVsZW1lbnRQYXRoLCBlbGVtZW50LAotCQkJCVByb3BlcnRpZXNSZXNvdXJjZXMuUHJvY2Vzc19tYWluRGVzY3JpcHRpb24pOwotCQlhZGRIeXBlckxpbmtMaXN0ZW5lcihtYWluRGVzY0NvbnRhaW5lci5saW5rKTsKLQkJbWFpbkRlc2MgPSBtYWluRGVzY0NvbnRhaW5lci5yaWNoVGV4dDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5CcmVha2Rvd25FbGVtZW50RG9jdW1lbnRTZWN0aW9uI2FkZExpc3RlbmVycygpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkTGlzdGVuZXJzKCkgewotCQlzdXBlci5hZGRMaXN0ZW5lcnMoKTsKLQkJbWFpbkRlc2Muc2V0TW9kYWxPYmplY3QoZ2V0RWxlbWVudCgpKTsKLQkJbWFpbkRlc2Muc2V0TW9kYWxPYmplY3RGZWF0dXJlKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkuZ2V0Q29udGVudERlc2NyaXB0aW9uX01haW5EZXNjcmlwdGlvbigpKTsKLQkJbWFpbkRlc2MuYWRkTGlzdGVuZXIoU1dULkRlYWN0aXZhdGUsIGxpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5CcmVha2Rvd25FbGVtZW50RG9jdW1lbnRTZWN0aW9uI3VwZGF0ZUNvbnRyb2xzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVDb250cm9scygpIHsKLQkJc3VwZXIudXBkYXRlQ29udHJvbHMoKTsKLQkJbWFpbkRlc2Muc2V0RWRpdGFibGUoZWRpdGFibGUpOwotCX0KLQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuQnJlYWtkb3duRWxlbWVudERvY3VtZW50U2VjdGlvbiNyZWZyZXNoKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWZyZXNoKCkgewotCQl0cnkgewotCQkJc3VwZXIucmVmcmVzaCgpOwotCi0JCQlpZiAoZ2V0RWxlbWVudCgpIGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudCkgewotCQkJCSgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpLnNhdmVNb2RpZmllZFJpY2hUZXh0KCk7Ci0KLQkJCQllbGVtZW50ID0gKEJyZWFrZG93bkVsZW1lbnQpIGdldEVsZW1lbnQoKTsKLQkJCQlDb250ZW50RGVzY3JpcHRpb24gY29udGVudCA9IChDb250ZW50RGVzY3JpcHRpb24pIGVsZW1lbnQKLQkJCQkJCS5nZXRQcmVzZW50YXRpb24oKTsKLQotCQkJCWlmIChjb250ZW50TW9kaWZ5TGlzdGVuZXIgIT0gbnVsbCkgewotCQkJCQltYWluRGVzYy5yZW1vdmVNb2RpZnlMaXN0ZW5lcihjb250ZW50TW9kaWZ5TGlzdGVuZXIpOwkJCi0JCQkJfQotCQkJCi0JCQkJc3VwZXIucmVmcmVzaCgpOwotCi0JCQkJaWYgKGNvbnRlbnRNb2RpZnlMaXN0ZW5lciAhPSBudWxsKSB7Ci0JCQkJCWlmIChjb250ZW50TW9kaWZ5TGlzdGVuZXIgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50RWRpdG9yLk1vZGlmeUxpc3RlbmVyKSB7Ci0JCQkJCQkoKE1ldGhvZEVsZW1lbnRFZGl0b3IuTW9kaWZ5TGlzdGVuZXIpIGNvbnRlbnRNb2RpZnlMaXN0ZW5lcikKLQkJCQkJCQkJLnNldEVsZW1lbnQoZWxlbWVudC5nZXRQcmVzZW50YXRpb24oKSk7Ci0JCQkJCQkoKE1ldGhvZEVsZW1lbnRFZGl0b3IuTW9kaWZ5TGlzdGVuZXIpIGNvbnRlbnRNb2RpZnlMaXN0ZW5lcikKLQkJCQkJCQkJLnNldERpc2FibGUodHJ1ZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJCi0JCQkJbWFpbkRlc2Muc2V0VGV4dChjb250ZW50LmdldE1haW5EZXNjcmlwdGlvbigpKTsKLQotCQkJCWlmIChleHBhbmRGbGFnKSB7Ci0JCQkJCWlmIChleHBhbmREb2N1bWVudExhYmVsLmdldFRleHQoKS5lcXVhbHMoCi0JCQkJCQkJUHJvcGVydGllc1Jlc291cmNlcy5Qcm9jZXNzX21haW5EZXNjcmlwdGlvbikpIAotCQkJCQl7Ci0JCQkJCQljdHJsX2RvY3VtZW50X2V4cGFuZGVkLnNldFRleHQoY29udGVudAotCQkJCQkJCQkuZ2V0TWFpbkRlc2NyaXB0aW9uKCkpOwotCQkJCQkJY3RybF9kb2N1bWVudF9leHBhbmRlZC5zZXRTZWxlY3Rpb24oMCk7Ci0JCQkJCQljdHJsX2RvY3VtZW50X2V4cGFuZGVkLnNldE1vZGFsT2JqZWN0KGNvbnRlbnQpOwotCQkJCQkJY3RybF9kb2N1bWVudF9leHBhbmRlZAotCQkJCQkJCQkuc2V0TW9kYWxPYmplY3RGZWF0dXJlKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJLmdldENvbnRlbnREZXNjcmlwdGlvbl9NYWluRGVzY3JpcHRpb24oKSk7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQlpZiAoY29udGVudE1vZGlmeUxpc3RlbmVyIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudEVkaXRvci5Nb2RpZnlMaXN0ZW5lcikgewotCQkJCQkoKE1ldGhvZEVsZW1lbnRFZGl0b3IuTW9kaWZ5TGlzdGVuZXIpIGNvbnRlbnRNb2RpZnlMaXN0ZW5lcikKLQkJCQkJCQkuc2V0RGlzYWJsZShmYWxzZSk7Ci0JCQkJfQotCi0JCQkJbWFpbkRlc2Muc2V0TW9kYWxPYmplY3QoY29udGVudCk7Ci0JCQkJbWFpbkRlc2Muc2V0TW9kYWxPYmplY3RGZWF0dXJlKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkuZ2V0Q29udGVudERlc2NyaXB0aW9uX01haW5EZXNjcmlwdGlvbigpKTsKLQkJCQltYWluRGVzYy5hZGRNb2RpZnlMaXN0ZW5lcihjb250ZW50TW9kaWZ5TGlzdGVuZXIpOwotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCWxvZ2dlcgotCQkJCQkubG9nRXJyb3IoCi0JCQkJCQkJIkVycm9yIHdoaWxlIHJlZnJlc2hpbmcgbWlsZXN0b25lIGRvY3VtZW50YXRpb24gc2VjdGlvbiA6IiwgZXgpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvT0JTUmVsYXRpb25TZWN0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvT0JTUmVsYXRpb25TZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2N2I0ODEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL09CU1JlbGF0aW9uU2VjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQ3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZpbHRlcnMuUHJvY2Vzc1JvbGVGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklBY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuRmlsdGVyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5JQlNJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkZvY3VzQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkZvY3VzRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLkZvcm1Ub29sa2l0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuU2VjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5UYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZTsKLQotCi0vKioKLSAqIFRoZSBiYXNlIE9CUyByZWxhdGlvbiBzZWN0aW9uCi0gKiAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4wCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIE9CU1JlbGF0aW9uU2VjdGlvbiBleHRlbmRzIEFic3RyYWN0U2VjdGlvbiB7Ci0JcHJvdGVjdGVkIElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyIGNvbnRlbnRQcm92aWRlciA9IG51bGw7Ci0KLQlwcm90ZWN0ZWQgSUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlciA9IG5ldyBBZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIoCi0JCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRS5nZXRPQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKTsKLQotCXByaXZhdGUgRm9ybVRvb2xraXQgdG9vbGtpdDsKLQotCXByaXZhdGUgQnV0dG9uIGN0cmxfYWRkXzEsIGN0cmxfYWRkXzIsIGN0cmxfcmVtb3ZlOwotCi0JcHJpdmF0ZSBUYWJsZSBjdHJsX3NlbGVjdGVkOwotCi0JcHJvdGVjdGVkIFRhYmxlVmlld2VyIHZpZXdlcjsKLQotCXByaXZhdGUgU3RyaW5nIHRpdGxlOwotCQotCXByaXZhdGUgU3RyaW5nIGRlc2M7Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgdGFibGUxOwotCi0JLy8gZWxlbWVudAotCXByb3RlY3RlZCBCcmVha2Rvd25FbGVtZW50IGVsZW1lbnQ7Ci0KLQkvLyBhY3Rpb24gbWFuYWdlcgotCXByb3RlY3RlZCBJQWN0aW9uTWFuYWdlciBhY3Rpb25NZ3I7Ci0KLQkvLyBieSBkZWZhdWx0IHRoaXMgYnV0dG9uIGlzIGZhbHNlCi0JcHJvdGVjdGVkIGJvb2xlYW4gc2hvd0FkZEZyb21Qcm9jZXNzQnV0dG9uID0gZmFsc2U7Ci0KLQkvLyBmaWx0ZXIKLQlwcml2YXRlIElGaWx0ZXIgZmlsdGVyID0gbnVsbDsKLQotCXB1YmxpYyBJRmlsdGVyIGdldEZpbHRlcigpIHsKLQkJaWYgKGZpbHRlciA9PSBudWxsKSB7Ci0JCQlmaWx0ZXIgPSBuZXcgUHJvY2Vzc1JvbGVGaWx0ZXIoZ2V0Q29uZmlndXJhdGlvbigpLCBudWxsLAotCQkJCQlGaWx0ZXJDb25zdGFudHMuUk9MRVMpOwotCQl9Ci0JCXJldHVybiBmaWx0ZXI7Ci0JfQotCi0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5BYnN0cmFjdFNlY3Rpb24jY3JlYXRlQ29udHJvbHMob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlLCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5UYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9scyhDb21wb3NpdGUgcGFyZW50LAotCQkJVGFiYmVkUHJvcGVydHlTaGVldFBhZ2UgdGFiYmVkUHJvcGVydHlTaGVldFBhZ2UpIHsKLQotCQlzdXBlci5jcmVhdGVDb250cm9scyhwYXJlbnQsIHRhYmJlZFByb3BlcnR5U2hlZXRQYWdlKTsKLQkJaW5pdCgpOwotCi0JCXBhcmVudC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JCXBhcmVudC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQotCQkvLyBjcmVhdGUgc2VjdGlvbgotCQljcmVhdGVTZWN0aW9uKHBhcmVudCk7Ci0KLQkJLy8gYWRkIGxpc3RlbmVycwotCQlhZGRMaXN0ZW5lcnMoKTsKLQotCQkvLyB1cGRhdGUgY29udHJvbHMKLQkJdXBkYXRlQ29udHJvbHMoKTsKLQotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemUKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0KCkgewotCQkvLyBnZXQgYnJlYWtkb3duZWxlbWVudCBvYmplY3QKLQkJZWxlbWVudCA9IChCcmVha2Rvd25FbGVtZW50KSBnZXRFbGVtZW50KCk7Ci0KLQkJLy8gZ2V0IHRvb2xraXQKLQkJdG9vbGtpdCA9IGdldFdpZGdldEZhY3RvcnkoKTsKLQotCQkvLyBnZXQgYWN0aW9uIG1hbmFnZXIKLQkJYWN0aW9uTWdyID0gRVBGUHJvcGVydHlTaGVldFBhZ2UuZ2V0QWN0aW9uTWFuYWdlcigpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldFRhYkRhdGEoU3RyaW5nIHRpdGxlLCBTdHJpbmcgZGVzYywgU3RyaW5nIHRhYmxlMSkgewotCQl0aGlzLnRpdGxlID0gdGl0bGU7Ci0JCXRoaXMuZGVzYyA9IGRlc2M7Ci0JCXRoaXMudGFibGUxID0gdGFibGUxOwotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVTZWN0aW9uKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJLy8gY3JlYXRlIHNlY3Rpb24KLQkJU2VjdGlvbiBhU2VjdGlvbiA9IEZvcm1VSS5jcmVhdGVTZWN0aW9uKHRvb2xraXQsIHBhcmVudCwKLQkJCQl0aXRsZSwgZGVzYyk7Ci0KLQkJLy8gY3JlYXRlIGdlbmVyYWwgY29tcG9zaXRlCi0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBGb3JtVUkuY3JlYXRlQ29tcG9zaXRlKHRvb2xraXQsIGFTZWN0aW9uLCAyLAotCQkJCWZhbHNlKTsKLQotCQkvLyBjcmVhdGUgdGFibGUgY29tcG9zaXRlCi0JCUNvbXBvc2l0ZSBwYW5lMSA9IEZvcm1VSS5jcmVhdGVDb21wb3NpdGUodG9vbGtpdCwgY29tcG9zaXRlLAotCQkJCUdyaWREYXRhLkZJTExfQk9USCk7Ci0JCUZvcm1VSS5jcmVhdGVMYWJlbCh0b29sa2l0LCBwYW5lMSwgdGFibGUxKTsKLQotCQljdHJsX3NlbGVjdGVkID0gRm9ybVVJLmNyZWF0ZVRhYmxlKHRvb2xraXQsIHBhbmUxKTsKLQkJdmlld2VyID0gbmV3IFRhYmxlVmlld2VyKGN0cmxfc2VsZWN0ZWQpOwotCi0JCWluaXRDb250ZW50UHJvdmlkZXIoKTsKLQotCQl2aWV3ZXIuc2V0TGFiZWxQcm92aWRlcihsYWJlbFByb3ZpZGVyKTsKLQkJdmlld2VyLnNldElucHV0KGVsZW1lbnQpOwotCi0JCS8vIGNyZWF0ZSBidXR0b24gY29tcG9zaXRlCi0JCUNvbXBvc2l0ZSBwYW5lMiA9IEZvcm1VSS5jcmVhdGVDb21wb3NpdGUodG9vbGtpdCwgY29tcG9zaXRlLAotCQkJCUdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0NFTlRFUgotCQkJCQkJfCBHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0NFTlRFUik7Ci0KLQkJLy8gY3JlYXRlIGJ1dHRvbnMKLQkJY3RybF9hZGRfMSA9IEZvcm1VSS5jcmVhdGVCdXR0b24odG9vbGtpdCwgcGFuZTIsIFByb3BlcnRpZXNSZXNvdXJjZXMuUHJvY2Vzc19BZGQpOyAKLQkJaWYgKHNob3dBZGRGcm9tUHJvY2Vzc0J1dHRvbikgewotCQkJY3RybF9hZGRfMiA9IEZvcm1VSS5jcmVhdGVCdXR0b24odG9vbGtpdCwgcGFuZTIsCi0JCQkJCVByb3BlcnRpZXNSZXNvdXJjZXMuUHJvY2Vzc19BZGRGcm9tUHJvY2Vzcyk7IAotCQl9Ci0JCWN0cmxfcmVtb3ZlID0gRm9ybVVJLmNyZWF0ZUJ1dHRvbih0b29sa2l0LCBwYW5lMiwgUHJvcGVydGllc1Jlc291cmNlcy5Qcm9jZXNzX1JlbW92ZSk7IAotCi0JCXRvb2xraXQucGFpbnRCb3JkZXJzRm9yKGNvbXBvc2l0ZSk7Ci0JCXRvb2xraXQucGFpbnRCb3JkZXJzRm9yKHBhbmUxKTsKLQkJdG9vbGtpdC5wYWludEJvcmRlcnNGb3IocGFuZTIpOwotCi0JfQotCi0JLyoqCi0JICogR2V0IERlZmF1bHQgY29uZmlndXJhdGlvbgotCSAqIAotCSAqIEByZXR1cm4gTWV0aG9kQ29uZmlndXJhdGlvbgotCSAqLwotCXByb3RlY3RlZCBNZXRob2RDb25maWd1cmF0aW9uIGdldERlZmF1bHRDb25maWd1cmF0aW9uKCkgewotCQlJdGVtUHJvdmlkZXJBZGFwdGVyIGFkYXB0ZXIgPSAoSXRlbVByb3ZpZGVyQWRhcHRlcikgZ2V0QWRhcHRlcigpOwotCQlPYmplY3QgcGFyZW50ID0gbnVsbDsKLQkJaWYgKGFkYXB0ZXIgaW5zdGFuY2VvZiBJQlNJdGVtUHJvdmlkZXIpIHsKLQkJCUlCU0l0ZW1Qcm92aWRlciBic0l0ZW1Qcm92aWRlciA9IChJQlNJdGVtUHJvdmlkZXIpIGFkYXB0ZXI7Ci0JCQlwYXJlbnQgPSBic0l0ZW1Qcm92aWRlci5nZXRUb3BJdGVtKCk7Ci0JCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9ICgob3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzKSBwYXJlbnQpCi0JCQkJCS5nZXREZWZhdWx0Q29udGV4dCgpOwotCQkJcmV0dXJuIGNvbmZpZzsKLQkJfSBlbHNlIHsKLQkJCWxvZ2dlcgotCQkJCQkubG9nRXJyb3IoIk9CU1JlbGF0aW9uU2VjdGlvbjo6Z2V0RGVmYXVsdENvbmZpZ3VyYXRpb24gLSBJQlNJdGVtUHJvdmlkZXIgaXMgbnVsbCIpOyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCS8qKgotCSAqIEFkZCBsaXN0ZW5lcnMKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHZvaWQgYWRkTGlzdGVuZXJzKCkgewotCQkvLyBBZGQgZm9jdXMgbGlzdGVuZXIgb24gcHJpbWFyeSB0YXNrcyBsaXN0Ci0JCWN0cmxfc2VsZWN0ZWQuYWRkRm9jdXNMaXN0ZW5lcihuZXcgRm9jdXNBZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgZm9jdXNHYWluZWQoRm9jdXNFdmVudCBlKSB7Ci0JCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB2aWV3ZXIKLQkJCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQkJCQlpZiAoKHNlbGVjdGlvbi5zaXplKCkgPiAwKSAmJiBlZGl0YWJsZSkKLQkJCQkJY3RybF9yZW1vdmUuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCX0KLQkJfSk7Ci0KLQkJdmlld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQotCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHZpZXdlcgotCQkJCQkJLmdldFNlbGVjdGlvbigpOwotCQkJCWlmICgoc2VsZWN0aW9uLnNpemUoKSA+IDApICYmIGVkaXRhYmxlKQotCQkJCQljdHJsX3JlbW92ZS5zZXRFbmFibGVkKHRydWUpOwotCQkJfQotCQl9KTsKLQotCQljdHJsX2FkZF8xLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCW9wZW5BZGREaWFsb2coKTsKLQkJCQl2aWV3ZXIucmVmcmVzaCgpOwotCQkJfQotCQl9KTsKLQotCQlpZiAoc2hvd0FkZEZyb21Qcm9jZXNzQnV0dG9uKSB7Ci0JCQljdHJsX2FkZF8yLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJb3BlbkFkZEZyb21Qcm9jZXNzRGlhbG9nKCk7Ci0JCQkJCXZpZXdlci5yZWZyZXNoKCk7Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQotCQljdHJsX3JlbW92ZS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHZpZXdlcgotCQkJCQkJLmdldFNlbGVjdGlvbigpOwotCQkJCWlmIChzZWxlY3Rpb24uc2l6ZSgpID4gMCkgewotCQkJCQkvLyB1cGRhdGUgdGhlIG1vZGVsCi0JCQkJCUFycmF5TGlzdCBybUl0ZW1zID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQlybUl0ZW1zLmFkZEFsbChzZWxlY3Rpb24udG9MaXN0KCkpOwotCQkJCQlyZW1vdmUocm1JdGVtcyk7Ci0JCQkJCXZpZXdlci5yZWZyZXNoKCk7Ci0KLQkJCQkJLy8gY2xlYXIgdGhlIHNlbGVjdGlvbgotCQkJCQl2aWV3ZXIuc2V0U2VsZWN0aW9uKG51bGwsIHRydWUpOwotCQkJCX0KLQkJCQljdHJsX3JlbW92ZS5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdXBkYXRlQ29udHJvbHMoKSB7Ci0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiRWxlbWVudCAiK2VsZW1lbnQuZ2V0TmFtZSgpICsKLQkJLy8gIkVkaXRhYmxlLSIrZWRpdGFibGUpOwotCQlpZiAoY3RybF9hZGRfMSAhPSBudWxsKQotCQkJY3RybF9hZGRfMS5zZXRFbmFibGVkKGVkaXRhYmxlKTsKLQkJaWYgKGN0cmxfYWRkXzIgIT0gbnVsbCkKLQkJCWN0cmxfYWRkXzIuc2V0RW5hYmxlZChlZGl0YWJsZSk7Ci0KLQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB2aWV3ZXIKLQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCWlmIChzZWxlY3Rpb24uc2l6ZSgpID4gMCAmJiBlZGl0YWJsZSkgewotCQkJaWYgKGN0cmxfcmVtb3ZlICE9IG51bGwpCi0JCQljdHJsX3JlbW92ZS5zZXRFbmFibGVkKHRydWUpOwotCQl9IGVsc2UgewotCQkJaWYgKGN0cmxfcmVtb3ZlICE9IG51bGwpCi0JCQljdHJsX3JlbW92ZS5zZXRFbmFibGVkKGZhbHNlKTsKLQkJfQotCi0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5BYnN0cmFjdFByb3BlcnR5U2VjdGlvbiNyZWZyZXNoKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWZyZXNoKCkgewotCQl1cGRhdGVDb250cm9scygpOwotCi0JCXN1cGVyLnJlZnJlc2goKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgcGFyZW50IGFjdGl2aXR5Ci0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiBAcmV0dXJuCi0JICovCi0JLy8gcHJvdGVjdGVkIEFjdGl2aXR5IGdldFBhcmVudEFjdGl2aXR5KEJyZWFrZG93bkVsZW1lbnQgZWxlbWVudCkKLQkvLyB7Ci0JLy8gQWN0aXZpdHkgYWN0aXZpdHkgPSBudWxsOwotCS8vIEFkYXB0ZXJGYWN0b3J5IGFGYWN0b3J5ID0KLQkvLyBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRS5nZXRPQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpOwotCS8vIEl0ZW1Qcm92aWRlckFkYXB0ZXIgYWRhcHRlciA9IChJdGVtUHJvdmlkZXJBZGFwdGVyKQotCS8vIGFGYWN0b3J5LmFkYXB0KGVsZW1lbnQsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JLy8gT2JqZWN0IHBhcmVudCA9IGFkYXB0ZXIuZ2V0UGFyZW50KGVsZW1lbnQpOwotCS8vIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBBY3Rpdml0eSkKLQkvLyB7Ci0JLy8gYWN0aXZpdHkgPSAoQWN0aXZpdHkpIHBhcmVudDsKLQkvLyB9Ci0JLy8JCQotCS8vIHJldHVybiBhY3Rpdml0eTsKLQkvLyB9Ci0JCi0JLyoqCi0JICogSW5pdGlhbGl6ZSBjb250ZW50IHByb3ZpZGVyCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdENvbnRlbnRQcm92aWRlcigpIHsKLQl9Ci0KLQkvKioKLQkgKiBPcGVuIFVJIERpYWxvZyB0byBhZGQgbWV0aG9kIGVsZW1lbnRzCi0JICoKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBvcGVuQWRkRGlhbG9nKCkgewotCX0KLQotCS8qKgotCSAqIE9wZW4gVUkgRGlhbG9nIHRvIGFkZCBkZXNjcmlwdG9yIGVsZW1lbnRzCi0JICoKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBvcGVuQWRkRnJvbVByb2Nlc3NEaWFsb2coKSB7Ci0JfQotCi0JLy8gcHJvdGVjdGVkIHZvaWQgYWRkKE9iamVjdFtdIGl0ZW1zKSB7fQotCXByb3RlY3RlZCB2b2lkIHJlbW92ZShBcnJheUxpc3Qgcm1JdGVtcykgewotCX0KLQotCS8qKgotCSAqIERpc3Bvc2UKLQkgKgotCSAqLwotCXB1YmxpYyB2b2lkIGRpc29zZSgpIHsKLQkJc3VwZXIuZGlzcG9zZSgpOwotCQlpZiAobGFiZWxQcm92aWRlciAhPSBudWxsKSB7Ci0JCQlsYWJlbFByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJfQotCQlpZiAoY29udGVudFByb3ZpZGVyICE9IG51bGwpIHsKLQkJCWNvbnRlbnRQcm92aWRlci5kaXNwb3NlKCk7Ci0JCX0KLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvUHJlZGVjZXNzb3JEaWFsb2cuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9QcmVkZWNlc3NvckRpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NDRmMzJkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9QcmVkZWNlc3NvckRpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDM2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlUcmVlSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5TdHJVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JQWN0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuSUJTSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Qcm9jZXNzVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtCcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya09yZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya09yZGVyVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRm9jdXNBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRm9jdXNFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotCi0KLS8qKgotICogRGlhbG9nIGZvciBhZGRpbmcgcHJlZGVjZXNzb3IgZGVwZW5kZW5jeQotICogCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUHJlZGVjZXNzb3JEaWFsb2cgZXh0ZW5kcyBEaWFsb2cgewotCi0JcHJpdmF0ZSBUZXh0IHByZWRJZFRleHQ7Ci0KLQlwcml2YXRlIFRleHQgcHJlc2VudGF0aW9uTmFtZTsKLQotCXByaXZhdGUgQ29tYm8gZGVwZW5kZW5jeTsKLQotCS8qKiBEZXBlbmRlbmN5IExpdGVyYWxzICogKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklOSVNIX1RPX1NUQVJUID0gUHJvcGVydGllc1Jlc291cmNlcy5Xb3JrT3JkZXJUeXBlX0ZJTklTSF9UT19TVEFSVDsgCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklOSVNIX1RPX0ZJTklTSCA9IFByb3BlcnRpZXNSZXNvdXJjZXMuV29ya09yZGVyVHlwZV9GSU5JU0hfVE9fRklOSVNIOyAKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTVEFSVF9UT19TVEFSVCA9IFByb3BlcnRpZXNSZXNvdXJjZXMuV29ya09yZGVyVHlwZV9TVEFSVF9UT19TVEFSVDsgCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RBUlRfVE9fRklOSVNIID0gUHJvcGVydGllc1Jlc291cmNlcy5Xb3JrT3JkZXJUeXBlX1NUQVJUX1RPX0ZJTklTSDsgCi0KLQlwcml2YXRlIFN0cmluZ1tdIGRlcGVuZGVuY3lMaXN0ID0gbmV3IFN0cmluZ1tdIHsgRklOSVNIX1RPX1NUQVJULAotCQkJRklOSVNIX1RPX0ZJTklTSCwgU1RBUlRfVE9fU1RBUlQsIFNUQVJUX1RPX0ZJTklTSCB9OwotCi0JcHJpdmF0ZSBXb3JrQnJlYWtkb3duRWxlbWVudCBlbGVtZW50OwotCi0JcHJpdmF0ZSBPYmplY3QgcHJvY2VzczsKLQotCXByaXZhdGUgQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3Rvcnk7Ci0KLQlwcml2YXRlIExpc3QgcHJlZGVjZXNzb3JzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JcHJpdmF0ZSBMaXN0IHByZWRNYXBMaXN0OwotCi0JcHJpdmF0ZSBJQWN0aW9uTWFuYWdlciBhY3Rpb25NZ3I7Ci0KLQlwcml2YXRlIFByZWRlY2Vzc29yTWFwIHByZWRNYXA7Ci0KLQkvKioKLQkgKiBEaWFsb2cgZm9yIHNldHRpbmcgcHJlZGVjZXNzb3IgZm9yIHRoZSBlbGVtZW50Ci0JICogQHBhcmFtIHBhcmVudFNoZWxsCi0JICogCQkJVGhlIHBhcmVudCBzaGVsbAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogCQkJV29yayBCcmVhayBkb3duIEVsZW1lbnQKLQkgKiBAcGFyYW0gcHJvY2VzcwotCSAqIAkJCVByb2Nlc3Mgb2YgdGhlIHdvcmticmVha2Rvd24gZWxlbWVudAotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqIAkJCUFkYXB0ZXIgRmFjdG9yeSAKLQkgKiBAcGFyYW0gcHJlZE1hcAotCSAqIAkJCVByZWRlY2Vzc29yIE1hcAotCSAqIEBwYXJhbSBwcmVkTWFwTGlzdAotCSAqIAkJCVByZWRlY2Vzc29yIE1hcCBsaXN0Ci0JICogQHBhcmFtIGFjdGlvbk1ncgotCSAqIAkJCUFjdGlvbiBNYW5hZ2VyCi0JICovCi0JcHVibGljIFByZWRlY2Vzc29yRGlhbG9nKFNoZWxsIHBhcmVudFNoZWxsLCBXb3JrQnJlYWtkb3duRWxlbWVudCBlbGVtZW50LAotCQkJT2JqZWN0IHByb2Nlc3MsIEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LAotCQkJUHJlZGVjZXNzb3JNYXAgcHJlZE1hcCwgTGlzdCBwcmVkTWFwTGlzdCwgSUFjdGlvbk1hbmFnZXIgYWN0aW9uTWdyKSB7Ci0JCXN1cGVyKHBhcmVudFNoZWxsKTsKLQotCQl0aGlzLmVsZW1lbnQgPSBlbGVtZW50OwotCQl0aGlzLnByb2Nlc3MgPSBwcm9jZXNzOwotCQl0aGlzLmFkYXB0ZXJGYWN0b3J5ID0gYWRhcHRlckZhY3Rvcnk7Ci0JCXRoaXMucHJlZE1hcCA9IHByZWRNYXA7Ci0JCXRoaXMucHJlZE1hcExpc3QgPSBwcmVkTWFwTGlzdDsKLQkJdGhpcy5hY3Rpb25NZ3IgPSBhY3Rpb25NZ3I7Ci0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nI2NyZWF0ZURpYWxvZ0FyZWEob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlKQotCSAqLwotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gKENvbXBvc2l0ZSkgc3VwZXIuY3JlYXRlRGlhbG9nQXJlYShwYXJlbnQpOwotCi0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gKEdyaWRMYXlvdXQpIGNvbXBvc2l0ZS5nZXRMYXlvdXQoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLQkJLy8gZGlhbG9nIGhlYWRlcgotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJbGFiZWwuc2V0VGV4dChQcm9wZXJ0aWVzUmVzb3VyY2VzLlByZWRlY2Vzc29yRGlhbG9nX0hlYWRlck1lc3NhZ2UpOyAKLQkJZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuQkVHSU5OSU5HKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlsYWJlbC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotCQkvLyBibGFuayBsYWJlbAotCQlsYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJbGFiZWwuc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLQkJZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuQkVHSU5OSU5HKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlsYWJlbC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotCQkvLyBQcmVkZWNlc3NvciBJRCBpbmRleAotCQlsYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJbGFiZWwuc2V0VGV4dChQcm9wZXJ0aWVzUmVzb3VyY2VzLlByZWRlY2Vzc29yRGlhbG9nX0luZGV4KTsgCi0JCWdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkJFR0lOTklORyk7Ci0JCWxhYmVsLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0JCXByZWRJZFRleHQgPSBuZXcgVGV4dChjb21wb3NpdGUsIFNXVC5CT1JERVIpOwotCQlncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwpOwotCQlncmlkRGF0YS53aWR0aEhpbnQgPSAxMDA7Ci0JCXByZWRJZFRleHQuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCXByZWRJZFRleHQuc2V0VGV4dChuZXcgSW50ZWdlcihwcmVkTWFwLmdldElkKCkpLnRvU3RyaW5nKCkpOwotCQkvLyBwcmVkSWRUZXh0LnNldEVkaXRhYmxlKGZhbHNlKTsKLQotCQkvLyBQcmVzZW50YWlvbiBOYW1lCi0JCWxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlsYWJlbC5zZXRUZXh0KFByb3BlcnRpZXNSZXNvdXJjZXMuUHJlZGVjZXNzb3JEaWFsb2dfUHJlc2VudGF0aW9uTmFtZSk7IAotCQlncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5CRUdJTk5JTkcpOwotCQlsYWJlbC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotCQlwcmVzZW50YXRpb25OYW1lID0gbmV3IFRleHQoY29tcG9zaXRlLCBTV1QuQk9SREVSKTsKLQkJZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMKTsKLQkJZ3JpZERhdGEud2lkdGhIaW50ID0gNDAwOwotCQlwcmVzZW50YXRpb25OYW1lLnNldEVkaXRhYmxlKGZhbHNlKTsKLQkJcHJlc2VudGF0aW9uTmFtZS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotCQlXb3JrT3JkZXIgd28gPSBwcmVkTWFwLmdldFdvcmtPcmRlcigpOwotCQlwcmVzZW50YXRpb25OYW1lLnNldFRleHQoUHJvY2Vzc1V0aWwuZ2V0UHJlc2VudGF0aW9uTmFtZSh3by5nZXRQcmVkKCkpKTsKLQotCQkvLyBEZXBlbmRlbmN5Ci0JCWxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlsYWJlbC5zZXRUZXh0KFByb3BlcnRpZXNSZXNvdXJjZXMuUHJlZGVjZXNzb3JEaWFsb2dfRGVwZW5kZW5jeSk7IAotCQlncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5CRUdJTk5JTkcpOwotCQlsYWJlbC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotCQlkZXBlbmRlbmN5ID0gbmV3IENvbWJvKGNvbXBvc2l0ZSwgU1dULlNJTkdMRSB8IFNXVC5SRUFEX09OTFkpOwotCQlncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5CRUdJTk5JTkcpOwotCQlkZXBlbmRlbmN5LnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQlkZXBlbmRlbmN5LnNldEl0ZW1zKGRlcGVuZGVuY3lMaXN0KTsKLQotCQlTdHJpbmcgZGVwZWRlbmN5TmFtZSA9IHdvLmdldExpbmtUeXBlKCkuZ2V0TmFtZSgpOwotCQlpZiAod28uZ2V0TGlua1R5cGUoKSA9PSBXb3JrT3JkZXJUeXBlLkZJTklTSF9UT19GSU5JU0gpIHsKLQkJCWRlcGVkZW5jeU5hbWUgPSBGSU5JU0hfVE9fRklOSVNIOwotCQl9IGVsc2UgaWYgKHdvLmdldExpbmtUeXBlKCkgPT0gV29ya09yZGVyVHlwZS5GSU5JU0hfVE9fU1RBUlQpIHsKLQkJCWRlcGVkZW5jeU5hbWUgPSBGSU5JU0hfVE9fU1RBUlQ7Ci0JCX0gZWxzZSBpZiAod28uZ2V0TGlua1R5cGUoKSA9PSBXb3JrT3JkZXJUeXBlLlNUQVJUX1RPX0ZJTklTSCkgewotCQkJZGVwZWRlbmN5TmFtZSA9IFNUQVJUX1RPX0ZJTklTSDsKLQkJfSBlbHNlIGlmICh3by5nZXRMaW5rVHlwZSgpID09IFdvcmtPcmRlclR5cGUuU1RBUlRfVE9fU1RBUlQpIHsKLQkJCWRlcGVkZW5jeU5hbWUgPSBTVEFSVF9UT19TVEFSVDsKLQkJfQotCQlkZXBlbmRlbmN5LnNldFRleHQoZGVwZWRlbmN5TmFtZSk7Ci0KLQkJTGFiZWwgbGluZSA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5TRVBBUkFUT1IgfCBTV1QuSE9SSVpPTlRBTAotCQkJCXwgU1dULkJPTEQpOwotCQlncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCWxpbmUuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLQkJcHJlZElkVGV4dC5hZGRGb2N1c0xpc3RlbmVyKG5ldyBGb2N1c0FkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBmb2N1c0xvc3QoRm9jdXNFdmVudCBldmVudCkgewotCQkJCWludCBuZXdJZDsKLQkJCQl0cnkgewotCQkJCQluZXdJZCA9IG5ldyBJbnRlZ2VyKHByZWRJZFRleHQuZ2V0VGV4dCgpKS5pbnRWYWx1ZSgpOwotCQkJCQlpZiAobmV3SWQgPCAwKQotCQkJCQkJdGhyb3cgbmV3IEV4Y2VwdGlvbigpOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCUF1dGhvcmluZ1VJUGx1Z2luCi0JCQkJCQkJLmdldERlZmF1bHQoKQotCQkJCQkJCS5nZXRNc2dEaWFsb2coKQotCQkJCQkJCS5kaXNwbGF5V2FybmluZygKLQkJCQkJCQkJCVByb3BlcnRpZXNSZXNvdXJjZXMuUHJvY2Vzc19wcmVkZWNlc3NvcnNfdmFsaWROdW1iZXJUaXRsZSwgCi0JCQkJCQkJCQlQcm9wZXJ0aWVzUmVzb3VyY2VzLlByb2Nlc3NfcHJlZGVjZXNzb3JzX3ZhbGlkTnVtYmVyTWVzc2FnZSk7IAotCi0JCQkJCXByZWRJZFRleHQuc2V0VGV4dChuZXcgSW50ZWdlcihwcmVkTWFwLmdldElkKCkpLnRvU3RyaW5nKCkpOwotCQkJCQlwcmVkSWRUZXh0LnNldEZvY3VzKCk7Ci0JCQkJCXByZWRJZFRleHQuc2VsZWN0QWxsKCk7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0KLQkJCQlpZiAoYWxyZWFkeUV4aXN0cyhuZXdJZCkpIHsKLQkJCQkJcHJlZElkVGV4dC5zZXRUZXh0KG5ldyBJbnRlZ2VyKHByZWRNYXAuZ2V0SWQoKSkudG9TdHJpbmcoKSk7Ci0KLQkJCQkJcHJlZElkVGV4dC5zZWxlY3RBbGwoKTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQotCQkJCVN0cmluZyBwcmVkSURMaXN0ID0gZ2V0UHJlZElkKG5ld0lkKTsKLQkJCQlpZiAocHJlZElETGlzdCA9PSBudWxsKQotCQkJCQlyZXR1cm47Ci0KLQkJCQlTdHJpbmcgc3RyID0gUHJvY2Vzc1V0aWwuY2hlY2tQcmVkZWNlc3Nvckxpc3QoZWxlbWVudCwKLQkJCQkJCXByZWRJRExpc3QsIGFkYXB0ZXJGYWN0b3J5LCBwcm9jZXNzLCBwcmVkZWNlc3NvcnMpOwotCQkJCWlmIChzdHIgIT0gbnVsbCkgewotCQkJCQlBdXRob3JpbmdVSVBsdWdpbgotCQkJCQkJCS5nZXREZWZhdWx0KCkKLQkJCQkJCQkuZ2V0TXNnRGlhbG9nKCkKLQkJCQkJCQkuZGlzcGxheUVycm9yKAotCQkJCQkJCQkJUHJvcGVydGllc1Jlc291cmNlcy5QcmVkZWNlc3NvckRpYWxvZ19QcmVkZWNlc3NvckVycm9yRGlhbG9nVGl0bGUsIHN0cik7IAotCQkJCQlwcmVkSWRUZXh0LnNldFRleHQobmV3IEludGVnZXIocHJlZE1hcC5nZXRJZCgpKS50b1N0cmluZygpKTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlwcmVzZW50YXRpb25OYW1lLnNldFRleHQoZ2V0TmFtZShuZXdJZCkpOwotCQkJfQotCQl9KTsKLQotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLQotCS8qKgotCSAqIEdldCBwcmVzZW50YXRpb24gbmFtZS9uYW1lIGZvciB0aGlzIHByZWRlY2Vzc29yIGlkCi0JICogCi0JICogQHBhcmFtIG5ld0lkCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldE5hbWUoaW50IG5ld0lkKSB7Ci0JCVN0cmluZyBuYW1lID0gbnVsbDsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gbmV3IEFkYXB0ZXJGYWN0b3J5VHJlZUl0ZXJhdG9yKGFkYXB0ZXJGYWN0b3J5LAotCQkJCXByb2Nlc3MpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBvYmogPSBpdGVyLm5leHQoKTsKLQkJCUlCU0l0ZW1Qcm92aWRlciBpdGVtUHJvdmlkZXIgPSAoSUJTSXRlbVByb3ZpZGVyKSBhZGFwdGVyRmFjdG9yeQotCQkJCQkuYWRhcHQob2JqLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkJSW50ZWdlciBpZCA9IG5ldyBJbnRlZ2VyKGl0ZW1Qcm92aWRlci5nZXRJZCgpKTsKLQkJCW9iaiA9IFRuZ1V0aWwudW53cmFwKG9iaik7Ci0KLQkJCWlmIChuZXdJZCA9PSBpZC5pbnRWYWx1ZSgpKSB7Ci0JCQkJbmFtZSA9ICgoQnJlYWtkb3duRWxlbWVudCkgb2JqKS5nZXRQcmVzZW50YXRpb25OYW1lKCk7Ci0JCQkJaWYgKFN0clV0aWwuaXNCbGFuayhuYW1lKSkgewotCQkJCQluYW1lID0gKChCcmVha2Rvd25FbGVtZW50KSBvYmopLmdldE5hbWUoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JLyoqCi0JICogQ2hlY2sgdG8gc2VlIHdoZXRoZXIgcHJlZGVjZXNzb3IgSWQgYWxyZWFkeSBleGlzdHMKLQkgKiAKLQkgKiBAcGFyYW0gbmV3SWQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGFscmVhZHlFeGlzdHMoaW50IG5ld0lkKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRvciA9IHByZWRNYXBMaXN0Lml0ZXJhdG9yKCk7IGl0b3IuaGFzTmV4dCgpOykgewotCQkJUHJlZGVjZXNzb3JNYXAgbWFwID0gKFByZWRlY2Vzc29yTWFwKSBpdG9yLm5leHQoKTsKLQkJCWlmICgobWFwLmdldElkKCkgPT0gbmV3SWQpICYmIChwcmVkTWFwLmdldElkKCkgIT0gbmV3SWQpKSB7Ci0JCQkJQXV0aG9yaW5nVUlQbHVnaW4KLQkJCQkJCS5nZXREZWZhdWx0KCkKLQkJCQkJCS5nZXRNc2dEaWFsb2coKQotCQkJCQkJLmRpc3BsYXlFcnJvcigKLQkJCQkJCQkJUHJvcGVydGllc1Jlc291cmNlcy5QcmVkZWNlc3NvckRpYWxvZ19QcmVkZWNlc3NvckVycm9yRGlhbG9nVGl0bGUsIAotCQkJCQkJCQlQcm9wZXJ0aWVzUmVzb3VyY2VzLlByZWRlY2Vzc29yRGlhbG9nX1ByZWRlY2Vzc29yRXJyb3JNZXNzYWdlKTsgCi0KLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogR2V0IGNvbW1hbmQgc2VwYXJhdGVkIGxpc3Qgb2YgYWxsIHByZWRlY2Vzc29yCi0JICogCi0JICogQHBhcmFtIG5ld0lkCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldFByZWRJZChpbnQgbmV3SWQpIHsKLQkJU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQotCQlmb3IgKEl0ZXJhdG9yIGl0b3IgPSBwcmVkTWFwTGlzdC5pdGVyYXRvcigpOyBpdG9yLmhhc05leHQoKTspIHsKLQkJCVByZWRlY2Vzc29yTWFwIG1hcCA9IChQcmVkZWNlc3Nvck1hcCkgaXRvci5uZXh0KCk7Ci0JCQlpZiAocHJlZE1hcC5nZXRJZCgpID09IG1hcC5nZXRJZCgpKSB7Ci0JCQkJYnVmLmFwcGVuZChuZXdJZCk7Ci0JCQl9IGVsc2UgewotCQkJCWJ1Zi5hcHBlbmQobWFwLmdldElkKCkpOwotCQkJfQotCi0JCQlidWYuYXBwZW5kKCIsIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gYnVmLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93I2NvbmZpZ3VyZVNoZWxsKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZVNoZWxsKFNoZWxsIHBhcmVudCkgewotCQlzdXBlci5jb25maWd1cmVTaGVsbChwYXJlbnQpOwotCQlwYXJlbnQKLQkJCQkuc2V0VGV4dChQcm9wZXJ0aWVzUmVzb3VyY2VzLlByZWRlY2Vzc29yRGlhbG9nX1RpdGxlKTsgCi0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZyNva1ByZXNzZWQoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIG9rUHJlc3NlZCgpIHsKLQkJLy8gbmV3IGlkCi0JCWludCBuZXdJZCA9IG5ldyBJbnRlZ2VyKHByZWRJZFRleHQuZ2V0VGV4dCgpKS5pbnRWYWx1ZSgpOwotCQkvLyBuZSBsaW5rIHR5cGUKLQkJV29ya09yZGVyVHlwZSB3b3JrT3JkZXJUeXBlID0gZ2V0V29ya09yZGVyVHlwZSgpOwotCi0JCWlmICgobmV3SWQgIT0gcHJlZE1hcC5nZXRJZCgpKQotCQkJCXx8ICghd29ya09yZGVyVHlwZS5lcXVhbHMocHJlZE1hcC5nZXRXb3JrT3JkZXIoKS5nZXRMaW5rVHlwZSgpKSkpIHsKLQkJCVN0cmluZyBwcmVkSURMaXN0ID0gZ2V0UHJlZElkKG5ld0lkKTsKLQkJCWlmIChwcmVkSURMaXN0ID09IG51bGwpCi0JCQkJcmV0dXJuOwotCi0JCQlTdHJpbmcgc3RyID0gUHJvY2Vzc1V0aWwuY2hlY2tQcmVkZWNlc3Nvckxpc3QoZWxlbWVudCwgcHJlZElETGlzdCwKLQkJCQkJYWRhcHRlckZhY3RvcnksIHByb2Nlc3MsIHByZWRlY2Vzc29ycyk7Ci0JCQlpZiAoc3RyICE9IG51bGwpIHsKLQkJCQlBdXRob3JpbmdVSVBsdWdpbgotCQkJCQkJLmdldERlZmF1bHQoKQotCQkJCQkJLmdldE1zZ0RpYWxvZygpCi0JCQkJCQkuZGlzcGxheUVycm9yKAotCQkJCQkJCQlQcm9wZXJ0aWVzUmVzb3VyY2VzLlByZWRlY2Vzc29yRGlhbG9nX1ByZWRlY2Vzc29yRXJyb3JEaWFsb2dUaXRsZSwgc3RyKTsgCi0JCQkJcHJlZElkVGV4dC5zZXRUZXh0KG5ldyBJbnRlZ2VyKHByZWRNYXAuZ2V0SWQoKSkudG9TdHJpbmcoKSk7Ci0JCQl9Ci0KLQkJCS8vIHJlbW92ZSBpdAotCQkJYm9vbGVhbiBzdGF0dXMgPSBhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuUkVNT1ZFLCBlbGVtZW50LAotCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCS5nZXRXb3JrQnJlYWtkb3duRWxlbWVudF9MaW5rVG9QcmVkZWNlc3NvcigpLAotCQkJCQlwcmVkTWFwLmdldFdvcmtPcmRlcigpLCAtMSk7Ci0JCQlpZiAoIXN0YXR1cykgewotCQkJCWNsb3NlKCk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJcHJlZE1hcExpc3QucmVtb3ZlKHByZWRNYXApOwotCi0JCQlpbnQgc2l6ZSA9IHByZWRlY2Vzc29ycy5zaXplKCk7Ci0KLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJV29ya0JyZWFrZG93bkVsZW1lbnQgZSA9IChXb3JrQnJlYWtkb3duRWxlbWVudCkgcHJlZGVjZXNzb3JzCi0JCQkJCQkuZ2V0KGkpOwotCi0JCQkJYm9vbGVhbiBmb3VuZCA9IGZhbHNlOwotCQkJCWZpbmRfcHJlZDogZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGVsZW1lbnQKLQkJCQkJCS5nZXRMaW5rVG9QcmVkZWNlc3NvcigpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCQkJV29ya09yZGVyIHdvID0gKFdvcmtPcmRlcikgaXRlcmF0b3IubmV4dCgpOwotCQkJCQlpZiAod28uZ2V0UHJlZCgpID09IGUpIHsKLQkJCQkJCWZvdW5kID0gdHJ1ZTsKLQkJCQkJCWJyZWFrIGZpbmRfcHJlZDsKLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAoIWZvdW5kKSB7Ci0JCQkJCVdvcmtPcmRlciB3byA9IFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVdvcmtPcmRlcigpOwotCQkJCQl3by5zZXRQcmVkKGUpOwotCQkJCQl3by5zZXRMaW5rVHlwZSh3b3JrT3JkZXJUeXBlKTsKLQkJCQkJYm9vbGVhbiBzdGF0ID0gYWN0aW9uTWdyCi0JCQkJCQkJLmRvQWN0aW9uKAotCQkJCQkJCQkJSUFjdGlvbk1hbmFnZXIuQURELAotCQkJCQkJCQkJZWxlbWVudCwKLQkJCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJCS5nZXRXb3JrQnJlYWtkb3duRWxlbWVudF9MaW5rVG9QcmVkZWNlc3NvcigpLAotCQkJCQkJCQkJd28sIC0xKTsKLQkJCQkJaWYgKCFzdGF0KQotCQkJCQkJcmV0dXJuOwotCi0JCQkJCXByZWRNYXAuc2V0SWQobmV3SWQpOwotCQkJCQlwcmVkTWFwLnNldFdvcmtPcmRlcih3byk7Ci0JCQkJCXByZWRNYXBMaXN0LmFkZChwcmVkTWFwKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlzdXBlci5va1ByZXNzZWQoKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgd29yayBvcmRlciBsaW5rIHR5cGUgZnJvbSBVSQotCSAqIAotCSAqIEByZXR1cm4gCi0JICogCQkJV29yayBPcmRlciB0eXBlCi0JICovCi0JcHJpdmF0ZSBXb3JrT3JkZXJUeXBlIGdldFdvcmtPcmRlclR5cGUoKSB7Ci0JCWludCBpbmRleCA9IGRlcGVuZGVuY3kuZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLQkJV29ya09yZGVyVHlwZSB0eXBlOwotCQlpZiAoaW5kZXggPT0gMCkgewotCQkJdHlwZSA9IFdvcmtPcmRlclR5cGUuRklOSVNIX1RPX1NUQVJUOwotCQl9IGVsc2UgaWYgKGluZGV4ID09IDEpIHsKLQkJCXR5cGUgPSBXb3JrT3JkZXJUeXBlLkZJTklTSF9UT19GSU5JU0g7Ci0JCX0gZWxzZSBpZiAoaW5kZXggPT0gMikgewotCQkJdHlwZSA9IFdvcmtPcmRlclR5cGUuU1RBUlRfVE9fU1RBUlQ7Ci0JCX0gZWxzZSB7Ci0JCQl0eXBlID0gV29ya09yZGVyVHlwZS5TVEFSVF9UT19GSU5JU0g7Ci0JCX0KLQotCQlyZXR1cm4gdHlwZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nI2Nsb3NlKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjbG9zZSgpIHsKLQotCQlyZXR1cm4gc3VwZXIuY2xvc2UoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvUHJlZGVjZXNzb3JNYXAuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9QcmVkZWNlc3Nvck1hcC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NWQ1MDJmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9QcmVkZWNlc3Nvck1hcC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrT3JkZXI7Ci0KLS8qKgotICogTWFwIG9mIHByZWRlY2Vzc29yIElEIGFuZCBjb3JyZXNwb25kaW5nIHdvcmsgb3JkZXIKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4wCi0gKgotICovCi1wdWJsaWMgY2xhc3MgUHJlZGVjZXNzb3JNYXAgewotCXByaXZhdGUgaW50IGlkOwotCi0JcHJpdmF0ZSBXb3JrT3JkZXIgd287Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gaWQKLQkgKiAJCVByZWRlY2Vzc29yIElECi0JICogQHBhcmFtIHdvCi0JICogCQlXb3JrT3JkZXIgb2JqZWN0Ci0JICovCi0JcHVibGljIFByZWRlY2Vzc29yTWFwKGludCBpZCwgV29ya09yZGVyIHdvKSB7Ci0JCXRoaXMuaWQgPSBpZDsKLQkJdGhpcy53byA9IHdvOwotCX0KLQotCS8qKgotCSAqIEdldCBwcmVkZWNlc3NvciBJRAotCSAqIEByZXR1cm4KLQkgKiAJCQlQcmVkZWNlc3NvciBJRAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0SWQoKSB7Ci0JCXJldHVybiB0aGlzLmlkOwotCX0KLQotCS8qKgotCSAqIFNldCBQcmVkZWNlc3NvciBJRAotCSAqIEBwYXJhbSBpZAotCSAqIAkJCVByZWRlY2Vzc29yIElECi0JICovCi0JcHVibGljIHZvaWQgc2V0SWQoaW50IGlkKSB7Ci0JCXRoaXMuaWQgPSBpZDsKLQl9Ci0JCi0JLyoqCi0JICogR2V0IHdvcmsgb3JkZXIKLQkgKiBAcmV0dXJuCi0JICogCQlXb3JrIE9yZGVyCi0JICovCi0JcHVibGljIFdvcmtPcmRlciBnZXRXb3JrT3JkZXIoKSB7Ci0JCXJldHVybiB0aGlzLndvOwotCX0KLQotCS8qKgotCSAqIFNldCBXb3JrIE9yZGVyCi0JICogQHBhcmFtIHdvCi0JICogCQkJV29yayBPcmRlcgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFdvcmtPcmRlcihXb3JrT3JkZXIgd28pIHsKLQkJdGhpcy53byA9IHdvOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9Qcm9wZXJ0aWVzUmVzb3VyY2VzLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvUHJvcGVydGllc1Jlc291cmNlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYjgyZGRmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9Qcm9wZXJ0aWVzUmVzb3VyY2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0vKioKLSAqIFByb3BlcnRpZXMgcmVzb3VyY2VzCi0gKiAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBQcm9wZXJ0aWVzUmVzb3VyY2VzIGV4dGVuZHMgTkxTIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9IFByb3BlcnRpZXNSZXNvdXJjZXMuY2xhc3MuZ2V0UGFja2FnZSgpLmdldE5hbWUoKQotCQkJCQkJCQkrICIuUmVzb3VyY2VzIjsgLy8kTk9OLU5MUy0xJAotCQotCXByaXZhdGUgUHJvcGVydGllc1Jlc291cmNlcygpIHsKLQkJLy8gRG8gbm90IGluc3RhbnRpYXRlCi0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc19nZW5lcmFsSW5mb3JtYXRpb25UaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzX0RvY3VtZW50SW5mb3JtYXRpb25UaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3Rpdml0eV9ndWlkYW5jZUluZm9ybWF0aW9uVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQnJlYWtkb3duRWxlbWVudF9vcHRpb25JbmZvcm1hdGlvblRpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhc2tEZXNjcmlwdG9yX3N0ZXBJbmZvcm1hdGlvblRpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NfZ2VuZXJhbEluZm9ybWF0aW9uRGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc19kb2N1bWVudEluZm9ybWF0aW9uRGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGVzY3JpcHRvcl9nZW5lcmFsSW5mb3JtYXRpb25EZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEZXNjcmlwdG9yX2RldGFpbEluZm9ybWF0aW9uRGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTWlsZXN0b25lX2dlbmVyYWxJbmZvcm1hdGlvbkRlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1pbGVzdG9uZV9kZXRhaWxJbmZvcm1hdGlvbkRlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhc2tEZXNjcmlwdG9yX3N0ZXBJbmZvcm1hdGlvbkRlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEJyZWFrZG93bkVsZW1lbnRfZ2VuZXJhbEluZm9ybWF0aW9uRGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgV29ya0JyZWFrZG93bkVsZW1lbnRfZ2VuZXJhbEluZm9ybWF0aW9uRGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGVzY3JpcHRvcl9nZW5lcmFsSW5mb3JtYXRpb25EZXNjcmlwdG9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdGl2aXR5X2dlbmVyYWxJbmZvcm1hdGlvbkRlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEJyZWFrZG93bkVsZW1lbnRfRG9jdW1lbnRJbmZvcm1hdGlvbkRlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdGl2aXR5X0RvY3VtZW50SW5mb3JtYXRpb25EZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEZXNjcmlwdG9yX2RvY3VtZW50SW5mb3JtYXRpb25EZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzX05vbmU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc19uYW1lOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NfUHJlc2VudGF0aW9uTmFtZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzX2JyaWVmRGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc19tYWluRGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc19wdXJwb3NlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NfcHJlZml4OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEJyZWFrZG93bkVsZW1lbnRfVHlwZV9OYW1lOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NfVHlwZV9UYXNrOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NfVHlwZV9Sb2xlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NfVHlwZV9Xb3JrUHJvZHVjdDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXb3JrUHJvZHVjdF9UeXBlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdGl2aXR5X01vZGVsSW5mbzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3Rpdml0eV9UeXBlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdGl2aXR5X3ByZXNlbnRhdGlvbk5hbWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWN0aXZpdHlfYWx0ZXJuYXRpdmVzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdGl2aXR5X2hvd1RvU3RhZmY7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQnJlYWtkb3duRWxlbWVudF9rZXlDb25zaWRlcmF0aW9uczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzX3VzYWdlR3VpZGFuY2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWN0aXZpdHlfUm9hZG1hcFRpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdGl2aXR5X1JvYWRtYXBEZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3Rpdml0eV9HZW5lcmFsR3VpZGFuY2VUaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3Rpdml0eV9HZW5lcmFsR3VpZGFuY2VEZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3Rpdml0eV9Db21tdW5pY2F0aW9uTWF0ZXJpYWxUaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3Rpdml0eV9Db21tdW5pY2F0aW9uTWF0ZXJpYWxEZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3Rpdml0eV9FZHVjYXRpb25NYXRlcmlhbFRpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdGl2aXR5X0VkdWNhdGlvbk1hdGVyaWFsRGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWN0aXZpdHlfU2VsZWN0ZWRfUm9hZG1hcDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3Rpdml0eV9TZWxlY3RlZF9HZW5lcmFsR3VpZGFuY2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWN0aXZpdHlfU2VsZWN0ZWRfQ29tbXVuaWNhdGlvbk1hdGVyaWFsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdGl2aXR5X1NlbGVjdGVkX0VkdWNhdGlvbk1hdGVyaWFsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdGl2aXR5X0RpYWdyYW1UaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3Rpdml0eV9EaWFncmFtRGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWN0aXZpdHlfQURJbWFnZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3Rpdml0eV9BRERJbWFnZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3Rpdml0eV9XUERJbWFnZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3Rpdml0eV9Vc2VBREltYWdlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdGl2aXR5X1VzZUFEREltYWdlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdGl2aXR5X1VzZVdQREltYWdlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdGl2aXR5X0Fzc2lnbjsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3Rpdml0eV9Xb3JrUm9sbHVwOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdGl2aXR5X1RlYW1Sb2xsdXA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWN0aXZpdHlfV29ya1Byb2R1Y3RzUm9sbHVwOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdGl2aXR5X1dvcmtSb2xsdXBEZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3Rpdml0eV9UZWFtUm9sbHVwRGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWN0aXZpdHlfV29ya1Byb2R1Y3RzUm9sbHVwRGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQnJlYWtkb3duRWxlbWVudF9PcHRpb25fTXVsdGlwbGVPY3VycmFuY2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQnJlYWtkb3duRWxlbWVudF9PcHRpb25fT3B0aW9uYWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQnJlYWtkb3duRWxlbWVudF9PcHRpb25fUGxhbm5lZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBCcmVha2Rvd25FbGVtZW50X09wdGlvbl9TdXByZXNzZWQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgV29ya0JyZWFrZG93bkVsZW1lbnRfRXZlbnREcml2ZW47Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgV29ya0JyZWFrZG93bkVsZW1lbnRfT25nb2luZzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXb3JrQnJlYWtkb3duRWxlbWVudF9SZXBlYXRhYmxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdvcmtCcmVha2Rvd25FbGVtZW50X1ByZWRlY2Vzc29yczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXb3JrQnJlYWtkb3duRWxlbWVudF9EZXBlbmRlbmN5OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdvcmtCcmVha2Rvd25FbGVtZW50X0RlcGVuZGVuY3lfQ09MX0lEX1RFWFQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgV29ya0JyZWFrZG93bkVsZW1lbnRfRGVwZW5kZW5jeV9DT0xfUFJFU0VOVEFUSU9OX05BTUVfVEVYVDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXb3JrQnJlYWtkb3duRWxlbWVudF9EZXBlbmRlbmN5X0NPTF9ERVBFTkRFTkNZX1RFWFQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgV29ya0JyZWFrZG93bkVsZW1lbnRfRGVwZW5kZW5jeV9BZGQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgV29ya0JyZWFrZG93bkVsZW1lbnRfRGVwZW5kZW5jeV9FZGl0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdvcmtCcmVha2Rvd25FbGVtZW50X0RlcGVuZGVuY3lfUmVtb3ZlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdvcmtPcmRlclR5cGVfRklOSVNIX1RPX1NUQVJUOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdvcmtPcmRlclR5cGVfRklOSVNIX1RPX0ZJTklTSDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXb3JrT3JkZXJUeXBlX1NUQVJUX1RPX0ZJTklTSDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXb3JrT3JkZXJUeXBlX1NUQVJUX1RPX1NUQVJUOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEJyZWFrZG93bkVsZW1lbnRfT3B0aW9uX1N5bmNocm9uaXplZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEZXNjcmlwdG9yX1JlZmluZWREZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUYXNrRGVzY3JpcHRvcl9Sb2xlc19TZWN0aW9uVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGFza0Rlc2NyaXB0b3JfUm9sZXNfU2VjdGlvbkRlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhc2tEZXNjcmlwdG9yX1JvbGVzX1RhYmxlMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUYXNrRGVzY3JpcHRvcl9Sb2xlc19UYWJsZTI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGFza0Rlc2NyaXB0b3JfUm9sZXNfVGFibGUzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhc2tEZXNjcmlwdG9yX1NlbGVjdGVkX1N0ZXBzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhc2tEZXNjcmlwdG9yX1N0ZXBEaWFsb2dUaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUYXNrRGVzY3JpcHRvcl9TdGVwRGlhbG9nTWVzc2FnZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUYXNrRGVzY3JpcHRvcl9Xb3JrUHJvZHVjdHNfU2VjdGlvblRpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhc2tEZXNjcmlwdG9yX1dvcmtQcm9kdWN0c19TZWN0aW9uRGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGFza0Rlc2NyaXB0b3JfV29ya1Byb2R1Y3RzX1RhYmxlMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUYXNrRGVzY3JpcHRvcl9Xb3JrUHJvZHVjdHNfVGFibGUyOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhc2tEZXNjcmlwdG9yX1dvcmtQcm9kdWN0c19UYWJsZTM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGFza0Rlc2NyaXB0b3JfV29ya1Byb2R1Y3RzX1RhYmxlNDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSb2xlRGVzY3JpcHRvcl9UYXNrc19TZWN0aW9uVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUm9sZURlc2NyaXB0b3JfVGFza3NfU2VjdGlvbkRlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJvbGVEZXNjcmlwdG9yX1Rhc2tzX1RhYmxlMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSb2xlRGVzY3JpcHRvcl9UYXNrc19UYWJsZTI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUm9sZURlc2NyaXB0b3JfVGFza3NfVGFibGUzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJvbGVEZXNjcmlwdG9yX1dvcmtQcm9kdWN0c19TZWN0aW9uVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUm9sZURlc2NyaXB0b3JfV29ya1Byb2R1Y3RzX1NlY3Rpb25EZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSb2xlRGVzY3JpcHRvcl9Xb3JrUHJvZHVjdHNfVGFibGUxOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJvbGVEZXNjcmlwdG9yX1dvcmtQcm9kdWN0c19UYWJsZTI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgV29ya1Byb2R1Y3REZXNjcmlwdG9yX1JvbGVzX1NlY3Rpb25UaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXb3JrUHJvZHVjdERlc2NyaXB0b3JfUm9sZXNfU2VjdGlvbkRlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9Sb2xlc19UYWJsZTE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgV29ya1Byb2R1Y3REZXNjcmlwdG9yX1JvbGVzX1RhYmxlMjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXb3JrUHJvZHVjdERlc2NyaXB0b3JfVHlwZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXb3JrUHJvZHVjdERlc2NyaXB0b3JfQWN0aXZpdHlFbnRyeVN0YXRlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9BY3Rpdml0eUV4aXRTdGF0ZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXUERlc2NyaXB0b3JfRGVsaXZlcmFibGVQYXJ0X1NlY3Rpb25UaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXUERlc2NyaXB0b3JfRGVsaXZlcmFibGVQYXJ0X1NlY3Rpb25EZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXUERlc2NyaXB0b3JfRGVsaXZlcmFibGVQYXJ0X1RhYmxlMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSb2xlRGVzY3JpcHRvcl9UZWFtX1NlY3Rpb25UaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSb2xlRGVzY3JpcHRvcl9UZWFtX1NlY3Rpb25EZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSb2xlRGVzY3JpcHRvcl9UZWFtX1RhYmxlMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb21wb3NpdGVSb2xlX1JvbGVfU2VjdGlvblRpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbXBvc2l0ZVJvbGVfUm9sZV9TZWN0aW9uRGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29tcG9zaXRlUm9sZV9Sb2xlX1RhYmxlMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUZWFtUHJvZmlsZV9Sb2xlX1NlY3Rpb25UaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUZWFtUHJvZmlsZV9Sb2xlX1NlY3Rpb25EZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUZWFtUHJvZmlsZV9Sb2xlX1RhYmxlMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzX1JpY2hUZXh0X0NvbGxhcHNlSW1hZ2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc19SaWNoVGV4dF9FeHBhbmRJbWFnZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzX0FkZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzX0FkZEZyb21Qcm9jZXNzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NfUmVuYW1lX01lc3NhZ2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc19SZW1vdmU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc19VcDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzX0Rvd247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc19NdWx0aXBsZVNlbGVjdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzX0J1dHRvbl9MaW5rTWV0aG9kRWxlbWVudDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzX0J1dHRvbl9DbGVhck1ldGhvZEVsZW1lbnQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc19JbnZhbGlkTmFtZVRpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NfSW52YWxpZE5hbWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc19SZW5hbWVfVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc19JbnZhbGlkUHJlc2VudGF0aW9uTmFtZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzX0xpbmtNZXRob2RFbGVtZW50VGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc19JbnZhbGlkTGlua01ldGhvZEVsZW1lbnQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc19Bc3NpZ25tZW50SW5mb1RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NfVGVhbUFzc2lnbkVycm9yOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NfVGVhbURpYWxvZ01lc3NhZ2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc19UZWFtRGlhbG9nVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc19EZWxpdmVyYWJsZUFzc2lnbkVycm9yOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NfQ29tcG9zaXRlUm9sZUFzc2lnbkVycm9yOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NfcHJlZGVjZXNzb3JzX3ZhbGlkTnVtYmVyTWVzc2FnZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzX3ByZWRlY2Vzc29yc192YWxpZE51bWJlclRpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NfTm9JdGVtczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzX0l0ZW1zU2VsZWN0ZWQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc19Ob1Byb3BlcnRpZXNBdmFpbGFibGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJlZGVjZXNzb3JEaWFsb2dfVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJlZGVjZXNzb3JEaWFsb2dfSGVhZGVyTWVzc2FnZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcmVkZWNlc3NvckRpYWxvZ19JbmRleDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcmVkZWNlc3NvckRpYWxvZ19QcmVzZW50YXRpb25OYW1lOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByZWRlY2Vzc29yRGlhbG9nX0RlcGVuZGVuY3k7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJlZGVjZXNzb3JEaWFsb2dfUHJlZGVjZXNzb3JFcnJvckRpYWxvZ1RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByZWRlY2Vzc29yRGlhbG9nX1ByZWRlY2Vzc29yRXJyb3JNZXNzYWdlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NFZGl0b3JGb3JtUHJvcGVydGllc190ZXh0RWRpdENlbGxfcHJvYmxlbV9tc2c7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc0VkaXRvckZvcm1Qcm9wZXJ0aWVzX2NlbGxFZGl0b3JfaW52YWxpZFByZWRjZXNzb3JfcHJvYmxlbV9tc2c7Ci0KLQlzdGF0aWMgewotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBQcm9wZXJ0aWVzUmVzb3VyY2VzLmNsYXNzKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbG9jYWxpemVkIHN0cmluZyBhc3NvY2lhdGVkIHdpdGggYSByZXNvdXJjZSBrZXkgYW5kIGZvcm1hdHRlZAotCSAqIHdpdGggYSBnaXZlbiBvYmplY3QuCi0JICogCi0JICogQHBhcmFtIGtleQotCSAqICAgICAgICAgICAgQSByZXNvdXJjZSBrZXkuCi0JICogQHBhcmFtIGRhdGEKLQkgKiAgICAgICAgICAgIEFuIG9iamVjdC4KLQkgKiBAcmV0dXJuIEEgZm9ybWF0dGVkIGxvY2FsaXplZCBzdHJpbmcuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgYmluZChTdHJpbmcga2V5LCBPYmplY3QgZGF0YSkgewotCQlyZXR1cm4gTkxTLmJpbmQoa2V5LCBuZXcgT2JqZWN0W10geyBkYXRhIH0pOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvUHJvcGVydGllc1V0aWwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9Qcm9wZXJ0aWVzVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OWMzMWM4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9Qcm9wZXJ0aWVzVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLyAKLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuU3RyVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5MaWJyYXJ5VUlUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BcnRpZmFjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNhcGFiaWxpdHlQYXR0ZXJuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyeVByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5JdGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NaWxlc3RvbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5PdXRjb21lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUGhhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGVhbVByb2ZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3I7Ci0KLQotLyoqCi0gKiBVdGlsaXR5IGNsYXNzIGZvciBwcm9wZXJ0aWVzIAotICogCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMAotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9wZXJ0aWVzVXRpbCB7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHR5cGUgb2YgdGhlIG9iamVjdAotCSAqIAotCSAqIEBwYXJhbSBvYmoKLQkgKiBAcmV0dXJuCi0JICogCQlUeXBlCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0VHlwZShPYmplY3Qgb2JqKSB7Ci0JCVN0cmluZyBwcmVmaXggPSBQcm9wZXJ0aWVzUmVzb3VyY2VzLkJyZWFrZG93bkVsZW1lbnRfVHlwZV9OYW1lOyAKLQotCQlpZiAob2JqIGluc3RhbmNlb2YgQ2FwYWJpbGl0eVBhdHRlcm4pIHsKLQkJCXByZWZpeCA9IExpYnJhcnlVSVRleHQuVEVYVF9DQVBBQklMSVRZX1BBVFRFUk47Ci0JCX0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgRGVsaXZlcnlQcm9jZXNzKSB7Ci0JCQlwcmVmaXggPSBMaWJyYXJ5VUlUZXh0LlRFWFRfREVMSVZFUllfUFJPQ0VTUzsKLQkJfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBQcm9jZXNzKSB7Ci0JCQlwcmVmaXggPSBMaWJyYXJ5VUlUZXh0LlRFWFRfUFJPQ0VTUzsKLQkJfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBQaGFzZSkgewotCQkJcHJlZml4ID0gTGlicmFyeVVJVGV4dC5URVhUX1BIQVNFOwotCQl9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIEl0ZXJhdGlvbikgewotCQkJcHJlZml4ID0gTGlicmFyeVVJVGV4dC5URVhUX0lURVJBVElPTjsKLQkJfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJcHJlZml4ID0gTGlicmFyeVVJVGV4dC5URVhUX0FDVElWSVRZOwotCQl9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIFRhc2tEZXNjcmlwdG9yKSB7Ci0JCQlwcmVmaXggPSBMaWJyYXJ5VUlUZXh0LlRFWFRfVEFTS19ERVNDUklQVE9SOwotCQl9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIFJvbGVEZXNjcmlwdG9yKSB7Ci0JCQlwcmVmaXggPSBMaWJyYXJ5VUlUZXh0LlRFWFRfUk9MRV9ERVNDUklQVE9SOwotCQl9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgewotCQkJcHJlZml4ID0gTGlicmFyeVVJVGV4dC5URVhUX1dPUktfUFJPRFVDVF9ERVNDUklQVE9SOwotCQl9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIE1pbGVzdG9uZSkgewotCQkJcHJlZml4ID0gTGlicmFyeVVJVGV4dC5URVhUX01JTEVTVE9ORTsKLQkJfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBUZWFtUHJvZmlsZSkgewotCQkJcHJlZml4ID0gTGlicmFyeVVJVGV4dC5URVhUX1RFQU1fUFJPRklMRTsKLQkJfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBBcnRpZmFjdCkgewotCQkJcHJlZml4ID0gTGlicmFyeVVJVGV4dC5URVhUX0FSVElGQUNUOwotCQl9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIERlbGl2ZXJhYmxlKSB7Ci0JCQlwcmVmaXggPSBMaWJyYXJ5VUlUZXh0LlRFWFRfREVMSVZFUkFCTEU7Ci0JCX0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgT3V0Y29tZSkgewotCQkJcHJlZml4ID0gTGlicmFyeVVJVGV4dC5URVhUX09VVENPTUU7Ci0JCX0KLQotCQlyZXR1cm4gcHJlZml4OwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdHlwZSBvZiB0aGUgb2JqZWN0IGluIGxvd2VyIGNhc2UKLQkgKiBAcGFyYW0gb2JqCi0JICogQHJldHVybgotCSAqIAkJVHlwZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFR5cGVMb3dlcihPYmplY3Qgb2JqKSB7Ci0JCVN0cmluZyB0eXBlID0gZ2V0VHlwZShvYmopOwotCQkKLQkJcmV0dXJuIFN0clV0aWwudG9Mb3dlcih0eXBlKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9Qcm9wZXJ0aWVzVmlld0NvbnN0YW50cy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL1Byb3BlcnRpZXNWaWV3Q29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4Njc1MDUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL1Byb3BlcnRpZXNWaWV3Q29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXM7Ci0KLS8qKgotICogQ29uc3RhbnRzIGZvciBwcm9wZXJ0aWVzIHZpZXcKLSAqIAotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAc2luY2UgMS4wCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFByb3BlcnRpZXNWaWV3Q29uc3RhbnRzIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJPTEVfREVTQ1JJUFRPUiA9ICJSb2xlRGVzY3JpcHRvciI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdPUktQUk9EVUNUUyA9ICJXb3JrUHJvZHVjdHMiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQVNLX0RFU0NSSVBUT1IgPSAiVGFza0Rlc2NyaXB0b3IiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBST0xFUyA9ICJSb2xlcyI7IC8vJE5PTi1OTFMtMSQKLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL1JlbGF0aW9uU2VjdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL1JlbGF0aW9uU2VjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNzQ5ZWFlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9SZWxhdGlvblNlY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg5OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5kaWFsb2dzLkl0ZW1zRmlsdGVyRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSUFjdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlByb2Nlc3NVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRm9jdXNBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRm9jdXNFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLkZvcm1Ub29sa2l0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuU2VjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5UYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZTsKLQotCi0vKioKLSAqIFRoZSBiYXNlIGNsYXNzIHVzZWQgdG8gZGlzcGxheSByZWxhdGlvbnNoaXBzIGJldHdlZW4gZGVzY3JpcHRvcnMKLSAqIAotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjAKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgUmVsYXRpb25TZWN0aW9uIGV4dGVuZHMgQWJzdHJhY3RTZWN0aW9uIHsKLQlwcm90ZWN0ZWQgSUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlciA9IG51bGw7Ci0KLQlwcm90ZWN0ZWQgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIgY29udGVudFByb3ZpZGVyID0gbnVsbDsKLQotCS8vIGVsZW1lbnQKLQlwcm90ZWN0ZWQgRGVzY3JpcHRvciBlbGVtZW50OwotCi0JLy8gYWN0aW9uIG1hbmFnZXIKLQlwcm90ZWN0ZWQgSUFjdGlvbk1hbmFnZXIgYWN0aW9uTWdyOwotCi0JcHJpdmF0ZSBGb3JtVG9vbGtpdCB0b29sa2l0OwotCi0JcHJpdmF0ZSBCdXR0b24gY3RybF9hZGRfMSwgY3RybF9hZGRfMiwgY3RybF9hZGRfMywgY3RybF9hZGRfNDsKLQotCXByaXZhdGUgQnV0dG9uIGN0cmxfcmVtb3ZlXzEsIGN0cmxfcmVtb3ZlXzIsIGN0cmxfcmVtb3ZlXzMsIGN0cmxfcmVtb3ZlXzQ7Ci0KLQlwcml2YXRlIEJ1dHRvbiBjdHJsX2FkZF9wcm9jXzEsIGN0cmxfYWRkX3Byb2NfMiwgY3RybF9hZGRfcHJvY18zLAotCQkJY3RybF9hZGRfcHJvY180OzsKLQotCXByaXZhdGUgVGFibGUgY3RybF90YWJsZV8xLCBjdHJsX3RhYmxlXzIsIGN0cmxfdGFibGVfMywgY3RybF90YWJsZV80OwotCi0JcHJvdGVjdGVkIFRhYmxlVmlld2VyIHRhYmxlVmlld2VyMSwgdGFibGVWaWV3ZXIyLCB0YWJsZVZpZXdlcjMsCi0JCQl0YWJsZVZpZXdlcjQ7Ci0KLQlwcml2YXRlIFRleHQgY3RybF9icmllZl9kZXNjOwotCi0JcHJpdmF0ZSBTdHJpbmcgdGFiU3RyaW5nOwotCQotCXByaXZhdGUgU3RyaW5nIHRpdGxlLCBkZXNjLCB0YWJsZTEsIHRhYmxlMiwgdGFibGUzLCB0YWJsZTQ7Ci0KLQlwcml2YXRlIGludCB0YWJsZUNvdW50OwotCi0JcHJpdmF0ZSBib29sZWFuW10gY2hhbmdlc0FsbG93ZWQ7Ci0KLQlQcm9jZXNzIHByb2Nlc3M7Ci0KLQlJRmlsdGVyIGRlc2NyaXB0b3JQcm9jZXNzZmlsdGVyOwotCi0JcHJvdGVjdGVkIFByb2Nlc3MgZ2V0UHJvY2VzcygpIHsKLQkJcmV0dXJuIHByb2Nlc3M7Ci0JfQotCi0JcHJvdGVjdGVkIElGaWx0ZXIgZ2V0RmlsdGVyRm9yRGVzY3JpcHRvcnMoKSB7Ci0JCXJldHVybiBkZXNjcmlwdG9yUHJvY2Vzc2ZpbHRlcjsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERlc2NyaXB0b3JUYWJOYW1lKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLkFic3RyYWN0U2VjdGlvbiNjcmVhdGVDb250cm9scyhvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUsIG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLlRhYmJlZFByb3BlcnR5U2hlZXRQYWdlKQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2xzKENvbXBvc2l0ZSBwYXJlbnQsCi0JCQlUYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZSB0YWJiZWRQcm9wZXJ0eVNoZWV0UGFnZSkgewotCi0JCXN1cGVyLmNyZWF0ZUNvbnRyb2xzKHBhcmVudCwgdGFiYmVkUHJvcGVydHlTaGVldFBhZ2UpOwotCQlpbml0KCk7Ci0KLQkJcGFyZW50LnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQkJcGFyZW50LnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCi0JCS8vIGNyZWF0ZSBzZWN0aW9uCi0JCWNyZWF0ZVNlY3Rpb24ocGFyZW50KTsKLQotCQkvLyBhZGQgbGlzdGVuZXJzCi0JCWFkZExpc3RlbmVycygpOwotCi0JCS8vIHVwZGF0ZSBjb250cm9scwotCQl1cGRhdGVDb250cm9scygpOwotCi0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0VGFiRGF0YShTdHJpbmcgdGl0bGUsIFN0cmluZyBkZXNjLCBTdHJpbmcgdGFibGUxLCBTdHJpbmcgdGFibGUyLCBTdHJpbmcgdGFibGUzLCBTdHJpbmcgdGFibGU0LCBTdHJpbmcgdGFiU3RyaW5nKSB7Ci0JCXRoaXMudGl0bGUgPSB0aXRsZTsKLQkJdGhpcy5kZXNjID0gZGVzYzsKLQkJdGhpcy50YWJsZTEgPSB0YWJsZTE7Ci0JCXRoaXMudGFibGUyID0gdGFibGUyOwotCQl0aGlzLnRhYmxlMyA9IHRhYmxlMzsKLQkJdGhpcy50YWJsZTQgPSB0YWJsZTQ7Ci0JCQotCQl0aGlzLnRhYlN0cmluZyA9IHRhYlN0cmluZzsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRUYWJsZURhdGEoaW50IHRhYmxlQ291bnQsIGJvb2xlYW5bXSBjaGFuZ2VzQWxsb3dlZCkgewotCQl0aGlzLnRhYmxlQ291bnQgPSB0YWJsZUNvdW50OwotCQl0aGlzLmNoYW5nZXNBbGxvd2VkID0gY2hhbmdlc0FsbG93ZWQ7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdCgpIHsKLQkJLy8gZ2V0IGRlc2NyaXB0b3Igb2JqZWN0Ci0JCWVsZW1lbnQgPSAoRGVzY3JpcHRvcikgZ2V0RWxlbWVudCgpOwotCi0JCS8vIGdldCB0b29sa2l0Ci0JCXRvb2xraXQgPSBnZXRXaWRnZXRGYWN0b3J5KCk7Ci0KLQkJLy8gZ2V0IGFjdGlvbiBtYW5hZ2VyCi0JCWFjdGlvbk1nciA9IEVQRlByb3BlcnR5U2hlZXRQYWdlLmdldEFjdGlvbk1hbmFnZXIoKTsKLQl9Ci0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLkFic3RyYWN0UHJvcGVydHlTZWN0aW9uI3JlZnJlc2goKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlZnJlc2goKSB7Ci0JCXRyeSB7Ci0JCQlpZiAoZ2V0RWxlbWVudCgpIGluc3RhbmNlb2YgRGVzY3JpcHRvcikgewotCQkJCWVsZW1lbnQgPSAoRGVzY3JpcHRvcikgZ2V0RWxlbWVudCgpOwotCi0JCQkJaW5pdENvbnRlbnRQcm92aWRlcjEoKTsKLQkJCQlpbml0Q29udGVudFByb3ZpZGVyMigpOwotCQkJCWluaXRDb250ZW50UHJvdmlkZXIzKCk7Ci0JCQkJaW5pdENvbnRlbnRQcm92aWRlcjQoKTsKLQotCQkJCS8vIGhpZGUvc2hvdyBjb250cm9scyBiYXNlZCBvbiBlZGl0YWJsZQotCQkJCXVwZGF0ZUNvbnRyb2xzKCk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJbG9nZ2VyCi0JCQkJCS5sb2dFcnJvcigKLQkJCQkJCQkiRXJyb3IgcmVmcmVzaGluZyBkZXNjcmlwdG9yIHJlbGF0aW9uIHNlY3Rpb246ICIgKyBlbGVtZW50LCBleCk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKgotCSAqIFVwZGF0ZSBjb250cm9scyBiYXNlZCBvbiBlZGl0YWJsZSBib29sZWFuIHZhbHVlLiBDb250cm9scyBjb3VsZCBiZQotCSAqIGVkaXRhYmxlIG9yIHJlYWQtb25seSBhZnRlciB0aGlzLgotCSAqLwotCXB1YmxpYyB2b2lkIHVwZGF0ZUNvbnRyb2xzKCkgewotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkVsZW1lbnQgIitlbGVtZW50LmdldE5hbWUoKSArCi0JCS8vICJFZGl0YWJsZS0iK2VkaXRhYmxlKTsKLQkJaWYgKGN0cmxfYWRkXzEgIT0gbnVsbCkKLQkJCWN0cmxfYWRkXzEuc2V0RW5hYmxlZChlZGl0YWJsZSk7Ci0JCWlmIChjdHJsX2FkZF8yICE9IG51bGwpCi0JCQljdHJsX2FkZF8yLnNldEVuYWJsZWQoZWRpdGFibGUpOwotCQlpZiAoY3RybF9hZGRfMyAhPSBudWxsKQotCQkJY3RybF9hZGRfMy5zZXRFbmFibGVkKGVkaXRhYmxlKTsKLQkJaWYgKGN0cmxfYWRkXzQgIT0gbnVsbCkKLQkJCWN0cmxfYWRkXzQuc2V0RW5hYmxlZChlZGl0YWJsZSk7Ci0KLQkJaWYgKGN0cmxfYWRkX3Byb2NfMSAhPSBudWxsKQotCQkJY3RybF9hZGRfcHJvY18xLnNldEVuYWJsZWQoZWRpdGFibGUpOwotCQlpZiAoY3RybF9hZGRfcHJvY18yICE9IG51bGwpCi0JCQljdHJsX2FkZF9wcm9jXzIuc2V0RW5hYmxlZChlZGl0YWJsZSk7Ci0JCWlmIChjdHJsX2FkZF9wcm9jXzMgIT0gbnVsbCkKLQkJCWN0cmxfYWRkX3Byb2NfMy5zZXRFbmFibGVkKGVkaXRhYmxlKTsKLQkJaWYgKGN0cmxfYWRkX3Byb2NfNCAhPSBudWxsKQotCQkJY3RybF9hZGRfcHJvY180LnNldEVuYWJsZWQoZWRpdGFibGUpOwotCi0JCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgdGFibGVWaWV3ZXIxCi0JCQkJLmdldFNlbGVjdGlvbigpOwotCQlpZiAoc2VsZWN0aW9uLnNpemUoKSA+IDAgJiYgZWRpdGFibGUpIHsKLQkJCWN0cmxfcmVtb3ZlXzEuc2V0RW5hYmxlZCh0cnVlKTsKLQkJfSBlbHNlIHsKLQkJCWN0cmxfcmVtb3ZlXzEuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCX0KLQotCQlpZiAodGFibGVWaWV3ZXIyICE9IG51bGwpIHsKLQkJCXNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgdGFibGVWaWV3ZXIyLmdldFNlbGVjdGlvbigpOwotCQkJaWYgKHNlbGVjdGlvbi5zaXplKCkgPiAwICYmIGVkaXRhYmxlKSB7Ci0JCQkJCWlmIChjdHJsX3JlbW92ZV8yICE9IG51bGwpCi0JCQkJY3RybF9yZW1vdmVfMi5zZXRFbmFibGVkKHRydWUpOwotCQkJfSBlbHNlIHsKLQkJCQkJaWYgKGN0cmxfcmVtb3ZlXzIgIT0gbnVsbCkKLQkJCQljdHJsX3JlbW92ZV8yLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJfQotCQl9Ci0KLQkJaWYgKHRhYmxlVmlld2VyMyAhPSBudWxsKSB7Ci0JCQlzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHRhYmxlVmlld2VyMy5nZXRTZWxlY3Rpb24oKTsKLQkJCWlmIChzZWxlY3Rpb24uc2l6ZSgpID4gMCAmJiBlZGl0YWJsZSkgewotCQkJCWN0cmxfcmVtb3ZlXzMuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCX0gZWxzZSB7Ci0JCQkJY3RybF9yZW1vdmVfMy5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCX0KLQkJfQotCi0JCWlmICh0YWJsZVZpZXdlcjQgIT0gbnVsbCkgewotCQkJc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB0YWJsZVZpZXdlcjQuZ2V0U2VsZWN0aW9uKCk7Ci0JCQlpZiAoc2VsZWN0aW9uLnNpemUoKSA+IDAgJiYgZWRpdGFibGUpIHsKLQkJCQljdHJsX3JlbW92ZV80LnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQl9IGVsc2UgewotCQkJCWN0cmxfcmVtb3ZlXzQuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBEaXNwb3NlIGFsbCBsYWJlbCBhbmQgY29udGVudCBwcm92aWRlcnMKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlzdXBlci5kaXNwb3NlKCk7Ci0JCWlmIChsYWJlbFByb3ZpZGVyICE9IG51bGwpIHsKLQkJCWxhYmVsUHJvdmlkZXIuZGlzcG9zZSgpOwotCQl9Ci0JCWlmIChjb250ZW50UHJvdmlkZXIgIT0gbnVsbCkgewotCQkJY29udGVudFByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemUgY29udGVudCBwcm92aWRlciBmb3IgdGhlIGZpcnN0IHRhYmxlIGluIHByb3BlcnRpZXMgdmlldwotCSAqCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdENvbnRlbnRQcm92aWRlcjEoKSB7Ci0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZSBjb250ZW50IHByb3ZpZGVyIGZvciB0aGUgc2Vjb25kIHRhYmxlIGluIHByb3BlcnRpZXMgdmlldwotCSAqCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdENvbnRlbnRQcm92aWRlcjIoKSB7Ci0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZSBjb250ZW50IHByb3ZpZGVyIGZvciB0aGUgdGhpcmQgdGFibGUgaW4gcHJvcGVydGllcyB2aWV3Ci0JICoKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0Q29udGVudFByb3ZpZGVyMygpIHsKLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplIGNvbnRlbnQgcHJvdmlkZXIgZm9yIHRoZSBmb3VydGggdGFibGUgaW4gcHJvcGVydGllcyB2aWV3Ci0JICoKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0Q29udGVudFByb3ZpZGVyNCgpIHsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgbGlzdCBvZiBkZXNjcmlwdG9ycyBmcm9tIHRoZSBwcm9jZXNzCi0JICogQHJldHVybgotCSAqIAkJCUxpc3Qgb2YgZGVzY3JpcHRvcnMKLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBnZXREZXNjcmlwdG9yc0Zyb21Qcm9jZXNzKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGZpbHRlciB3aGljaCBhbGxvd3MgZmlsdGVyaW5nIGVsZW1lbnQgYmFzZWQgb24gbWV0aG9kIGNvbmZpZ3VyYXRpb24gCi0JICogQHJldHVybgotCSAqIAkJRmlsdGVyCi0JICovCi0JcHJvdGVjdGVkIElGaWx0ZXIgZ2V0RmlsdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVTZWN0aW9uKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQkJaW50IHRhYmxlSGVpZ2h0ID0gODA7Ci0KLQkJLy8gY3JlYXRlIHNlY3Rpb24KLQkJU2VjdGlvbiBhU2VjdGlvbiA9IEZvcm1VSS5jcmVhdGVTZWN0aW9uKHRvb2xraXQsIGNvbXBvc2l0ZSwKLQkJCQl0aXRsZSwgZGVzYyk7Ci0KLQkJLy8gY3JlYXRlIGNvbXBvc2l0ZQotCQlDb21wb3NpdGUgc2VjdGlvbkNvbXBvc2l0ZSA9IEZvcm1VSS5jcmVhdGVDb21wb3NpdGUodG9vbGtpdCwgYVNlY3Rpb24sCi0JCQkJMiwgZmFsc2UpOwotCi0JCS8vIGNyZWF0ZSB0YWJsZSAxCi0JCWludCBjb3VudCA9IDA7Ci0JCXsKLQkJCUNvbXBvc2l0ZSBwYW5lMSA9IEZvcm1VSS5jcmVhdGVDb21wb3NpdGUodG9vbGtpdCwgc2VjdGlvbkNvbXBvc2l0ZSwKLQkJCQkJR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJCUZvcm1VSS5jcmVhdGVMYWJlbCh0b29sa2l0LCBwYW5lMSwgdGFibGUxKTsKLQotCQkJY3RybF90YWJsZV8xID0gRm9ybVVJLmNyZWF0ZVRhYmxlKHRvb2xraXQsIHBhbmUxLCB0YWJsZUhlaWdodCk7Ci0JCQl0YWJsZVZpZXdlcjEgPSBuZXcgVGFibGVWaWV3ZXIoY3RybF90YWJsZV8xKTsKLQkJCWluaXRDb250ZW50UHJvdmlkZXIxKCk7Ci0KLQkJCXRhYmxlVmlld2VyMS5zZXRMYWJlbFByb3ZpZGVyKGxhYmVsUHJvdmlkZXIpOwotCQkJdGFibGVWaWV3ZXIxLnNldElucHV0KGVsZW1lbnQpOwotCi0JCQkvLyBjcmVhdGUgYnV0dG9ucyBmb3IgdGFibGUxCi0JCQlDb21wb3NpdGUgcGFuZTIgPSBGb3JtVUkuY3JlYXRlQ29tcG9zaXRlKHRvb2xraXQsIHNlY3Rpb25Db21wb3NpdGUsCi0JCQkJCUdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0NFTlRFUgotCQkJCQkJCXwgR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9DRU5URVIpOwotCi0JCQlpZiAoY2hhbmdlc0FsbG93ZWRbY291bnRdKSB7Ci0JCQkJY3RybF9hZGRfMSA9IEZvcm1VSS5jcmVhdGVCdXR0b24odG9vbGtpdCwgcGFuZTIsCi0JCQkJCQlQcm9wZXJ0aWVzUmVzb3VyY2VzLlByb2Nlc3NfQWRkKTsgCi0JCQkJY3RybF9hZGRfcHJvY18xID0gRm9ybVVJCi0JCQkJCQkuY3JlYXRlQnV0dG9uKHRvb2xraXQsIHBhbmUyLCBQcm9wZXJ0aWVzUmVzb3VyY2VzLlByb2Nlc3NfQWRkRnJvbVByb2Nlc3MpOyAKLQkJCQljdHJsX3JlbW92ZV8xID0gRm9ybVVJLmNyZWF0ZUJ1dHRvbih0b29sa2l0LCBwYW5lMiwKLQkJCQkJCVByb3BlcnRpZXNSZXNvdXJjZXMuUHJvY2Vzc19SZW1vdmUpOyAKLQkJCQljdHJsX3JlbW92ZV8xLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJfQotCQkJdG9vbGtpdC5wYWludEJvcmRlcnNGb3IocGFuZTEpOwotCQl9Ci0JCWNvdW50Kys7Ci0KLQkJLy8gY3JlYXRlIHRhYmxlMgotCQlpZiAoY291bnQgPCB0YWJsZUNvdW50KSB7Ci0JCQlDb21wb3NpdGUgcGFuZTMgPSBGb3JtVUkuY3JlYXRlQ29tcG9zaXRlKHRvb2xraXQsIHNlY3Rpb25Db21wb3NpdGUsCi0JCQkJCUdyaWREYXRhLkZJTExfQk9USCk7Ci0JCQlGb3JtVUkuY3JlYXRlTGFiZWwodG9vbGtpdCwgcGFuZTMsIHRhYmxlMik7Ci0KLQkJCWN0cmxfdGFibGVfMiA9IEZvcm1VSS5jcmVhdGVUYWJsZSh0b29sa2l0LCBwYW5lMywgdGFibGVIZWlnaHQpOwotCQkJdGFibGVWaWV3ZXIyID0gbmV3IFRhYmxlVmlld2VyKGN0cmxfdGFibGVfMik7Ci0JCQlpbml0Q29udGVudFByb3ZpZGVyMigpOwotCi0JCQl0YWJsZVZpZXdlcjIuc2V0TGFiZWxQcm92aWRlcihsYWJlbFByb3ZpZGVyKTsKLQkJCXRhYmxlVmlld2VyMi5zZXRJbnB1dChlbGVtZW50KTsKLQotCQkJLy8gY3JlYXRlIGJ1dHRvbnMgZm9yIHRhYmxlMgotCQkJQ29tcG9zaXRlIHBhbmU0ID0gRm9ybVVJLmNyZWF0ZUNvbXBvc2l0ZSh0b29sa2l0LCBzZWN0aW9uQ29tcG9zaXRlLAotCQkJCQlHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9DRU5URVIKLQkJCQkJCQl8IEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQ0VOVEVSKTsKLQkJCWlmIChjaGFuZ2VzQWxsb3dlZFtjb3VudF0pIHsKLQkJCQljdHJsX2FkZF8yID0gRm9ybVVJLmNyZWF0ZUJ1dHRvbih0b29sa2l0LCBwYW5lNCwKLQkJCQkJCVByb3BlcnRpZXNSZXNvdXJjZXMuUHJvY2Vzc19BZGQpOyAKLQkJCQljdHJsX2FkZF9wcm9jXzIgPSBGb3JtVUkKLQkJCQkJCS5jcmVhdGVCdXR0b24odG9vbGtpdCwgcGFuZTQsIFByb3BlcnRpZXNSZXNvdXJjZXMuUHJvY2Vzc19BZGRGcm9tUHJvY2Vzcyk7IAotCQkJCWN0cmxfcmVtb3ZlXzIgPSBGb3JtVUkuY3JlYXRlQnV0dG9uKHRvb2xraXQsIHBhbmU0LAotCQkJCQkJUHJvcGVydGllc1Jlc291cmNlcy5Qcm9jZXNzX1JlbW92ZSk7IAotCQkJCWN0cmxfcmVtb3ZlXzIuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQl9Ci0JCQl0b29sa2l0LnBhaW50Qm9yZGVyc0ZvcihwYW5lMyk7Ci0JCX0KLQotCQljb3VudCsrOwotCi0JCS8vIENyZWF0ZSB0YWJsZTMKLQkJaWYgKGNvdW50IDwgdGFibGVDb3VudCkgewotCQkJQ29tcG9zaXRlIHBhbmU1ID0gRm9ybVVJLmNyZWF0ZUNvbXBvc2l0ZSh0b29sa2l0LCBzZWN0aW9uQ29tcG9zaXRlLAotCQkJCQlHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQkJRm9ybVVJLmNyZWF0ZUxhYmVsKHRvb2xraXQsIHBhbmU1LCB0YWJsZTMpOwotCi0JCQljdHJsX3RhYmxlXzMgPSBGb3JtVUkuY3JlYXRlVGFibGUodG9vbGtpdCwgcGFuZTUsIHRhYmxlSGVpZ2h0KTsKLQkJCXRhYmxlVmlld2VyMyA9IG5ldyBUYWJsZVZpZXdlcihjdHJsX3RhYmxlXzMpOwotCQkJaW5pdENvbnRlbnRQcm92aWRlcjMoKTsKLQotCQkJdGFibGVWaWV3ZXIzLnNldExhYmVsUHJvdmlkZXIobGFiZWxQcm92aWRlcik7Ci0JCQl0YWJsZVZpZXdlcjMuc2V0SW5wdXQoZWxlbWVudCk7Ci0KLQkJCS8vIGNyZWF0ZSBidXR0b25zIGZvciB0YWJsZTIKLQkJCUNvbXBvc2l0ZSBwYW5lNiA9IEZvcm1VSS5jcmVhdGVDb21wb3NpdGUodG9vbGtpdCwgc2VjdGlvbkNvbXBvc2l0ZSwKLQkJCQkJR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQ0VOVEVSCi0JCQkJCQkJfCBHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0NFTlRFUik7Ci0JCQlpZiAoKG5ldyBCb29sZWFuKGNoYW5nZXNBbGxvd2VkW2NvdW50XSkpLmJvb2xlYW5WYWx1ZSgpKSB7Ci0JCQkJY3RybF9hZGRfMyA9IEZvcm1VSS5jcmVhdGVCdXR0b24odG9vbGtpdCwgcGFuZTYsCi0JCQkJCQlQcm9wZXJ0aWVzUmVzb3VyY2VzLlByb2Nlc3NfQWRkKTsgCi0JCQkJY3RybF9hZGRfcHJvY18zID0gRm9ybVVJCi0JCQkJCQkuY3JlYXRlQnV0dG9uKHRvb2xraXQsIHBhbmU2LCBQcm9wZXJ0aWVzUmVzb3VyY2VzLlByb2Nlc3NfQWRkRnJvbVByb2Nlc3MpOyAKLQkJCQljdHJsX3JlbW92ZV8zID0gRm9ybVVJLmNyZWF0ZUJ1dHRvbih0b29sa2l0LCBwYW5lNiwKLQkJCQkJCVByb3BlcnRpZXNSZXNvdXJjZXMuUHJvY2Vzc19SZW1vdmUpOyAKLQkJCQljdHJsX3JlbW92ZV8zLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJfQotCQkJdG9vbGtpdC5wYWludEJvcmRlcnNGb3IocGFuZTUpOwotCQl9Ci0JCWNvdW50Kys7Ci0KLQkJaWYgKGNvdW50IDwgdGFibGVDb3VudCkgewotCQkJQ29tcG9zaXRlIHBhbmU3ID0gRm9ybVVJLmNyZWF0ZUNvbXBvc2l0ZSh0b29sa2l0LCBzZWN0aW9uQ29tcG9zaXRlLAotCQkJCQlHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQkJRm9ybVVJLmNyZWF0ZUxhYmVsKHRvb2xraXQsIHBhbmU3LCB0YWJsZTQpOwotCi0JCQljdHJsX3RhYmxlXzQgPSBGb3JtVUkuY3JlYXRlVGFibGUodG9vbGtpdCwgcGFuZTcsIHRhYmxlSGVpZ2h0KTsKLQkJCXRhYmxlVmlld2VyNCA9IG5ldyBUYWJsZVZpZXdlcihjdHJsX3RhYmxlXzQpOwotCQkJaW5pdENvbnRlbnRQcm92aWRlcjQoKTsKLQotCQkJdGFibGVWaWV3ZXI0LnNldExhYmVsUHJvdmlkZXIobGFiZWxQcm92aWRlcik7Ci0JCQl0YWJsZVZpZXdlcjQuc2V0SW5wdXQoZWxlbWVudCk7Ci0KLQkJCS8vIGNyZWF0ZSBidXR0b25zIGZvciB0YWJsZTQKLQkJCUNvbXBvc2l0ZSBwYW5lOCA9IEZvcm1VSS5jcmVhdGVDb21wb3NpdGUodG9vbGtpdCwgc2VjdGlvbkNvbXBvc2l0ZSwKLQkJCQkJR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQ0VOVEVSCi0JCQkJCQkJfCBHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0NFTlRFUik7Ci0JCQlpZiAoKG5ldyBCb29sZWFuKGNoYW5nZXNBbGxvd2VkW2NvdW50XSkpLmJvb2xlYW5WYWx1ZSgpKSB7Ci0JCQkJY3RybF9hZGRfNCA9IEZvcm1VSS5jcmVhdGVCdXR0b24odG9vbGtpdCwgcGFuZTgsCi0JCQkJCQlQcm9wZXJ0aWVzUmVzb3VyY2VzLlByb2Nlc3NfQWRkKTsgCi0JCQkJY3RybF9hZGRfcHJvY180ID0gRm9ybVVJCi0JCQkJCQkuY3JlYXRlQnV0dG9uKHRvb2xraXQsIHBhbmU4LCBQcm9wZXJ0aWVzUmVzb3VyY2VzLlByb2Nlc3NfQWRkRnJvbVByb2Nlc3MpOyAKLQkJCQljdHJsX3JlbW92ZV80ID0gRm9ybVVJLmNyZWF0ZUJ1dHRvbih0b29sa2l0LCBwYW5lOCwKLQkJCQkJCVByb3BlcnRpZXNSZXNvdXJjZXMuUHJvY2Vzc19SZW1vdmUpOyAKLQkJCQljdHJsX3JlbW92ZV80LnNldEVuYWJsZWQoZmFsc2UpOwotCQkJfQotCQkJdG9vbGtpdC5wYWludEJvcmRlcnNGb3IocGFuZTgpOwotCi0JCX0KLQotCQkvLyBjcmVhdGUgYnJpZWYgZGVzY3JpcHRpb24KLQkJaW50IGhlaWdodEhpbnQgPSA0MDsKLQkJLy8gaW50IGhvcml6b250YWxTcGFuID0gMjsKLQkJRm9ybVVJLmNyZWF0ZUxhYmVsKHRvb2xraXQsIHNlY3Rpb25Db21wb3NpdGUsIFByb3BlcnRpZXNSZXNvdXJjZXMuUHJvY2Vzc19icmllZkRlc2NyaXB0aW9uLCBoZWlnaHRIaW50KTsgCi0JCWN0cmxfYnJpZWZfZGVzYyA9IEZvcm1VSS5jcmVhdGVUZXh0KHRvb2xraXQsIHNlY3Rpb25Db21wb3NpdGUsCi0JCQkJaGVpZ2h0SGludCwgaGVpZ2h0SGludCk7Ci0JCWN0cmxfYnJpZWZfZGVzYy5zZXRFZGl0YWJsZShmYWxzZSk7Ci0KLQkJdG9vbGtpdC5wYWludEJvcmRlcnNGb3Ioc2VjdGlvbkNvbXBvc2l0ZSk7Ci0JfQotCi0JLyoqCi0JICogYWRkTGlzdGVyZXJzCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkTGlzdGVuZXJzKCkgewotCQkvKioKLQkJICogRmlyc3Qgc2V0IG9mIGxpc3RlbmVycwotCQkgKi8KLQkJaW50IGNvdW50ID0gMDsKLQkJaWYgKGNvdW50IDwgdGFibGVDb3VudCkgewotCQkJY3RybF90YWJsZV8xLmFkZEZvY3VzTGlzdGVuZXIobmV3IEZvY3VzQWRhcHRlcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBmb2N1c0dhaW5lZChGb2N1c0V2ZW50IGUpIHsKLQkJCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB0YWJsZVZpZXdlcjEKLQkJCQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJCWlmICgoc2VsZWN0aW9uLnNpemUoKSA+IDApICYmIGVkaXRhYmxlKQotCQkJCQkJY3RybF9yZW1vdmVfMS5zZXRFbmFibGVkKHRydWUpOwotCQkJCX0KLQkJCX0pOwotCi0JCQl0YWJsZVZpZXdlcjEKLQkJCQkJLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQkJCQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB0YWJsZVZpZXdlcjEKLQkJCQkJCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQkJCQkJCQlpZiAoKHNlbGVjdGlvbi5zaXplKCkgPiAwKSAmIGVkaXRhYmxlKQotCQkJCQkJCQljdHJsX3JlbW92ZV8xLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJCQkJaWYgKHNlbGVjdGlvbi5zaXplKCkgPT0gMSkgewotCQkJCQkJCQlTdHJpbmcgZGVzYyA9ICgoTWV0aG9kRWxlbWVudCkgc2VsZWN0aW9uCi0JCQkJCQkJCQkJLmdldEZpcnN0RWxlbWVudCgpKQotCQkJCQkJCQkJCS5nZXRCcmllZkRlc2NyaXB0aW9uKCk7Ci0JCQkJCQkJCWlmIChkZXNjID09IG51bGwpIHsKLQkJCQkJCQkJCWRlc2MgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQl9Ci0JCQkJCQkJCWN0cmxfYnJpZWZfZGVzYy5zZXRUZXh0KGRlc2MpOwotCQkJCQkJCX0gZWxzZSBpZiAoc2VsZWN0aW9uLnNpemUoKSA+IDEpIHsKLQkJCQkJCQkJY3RybF9icmllZl9kZXNjCi0JCQkJCQkJCQkJLnNldFRleHQoUHJvcGVydGllc1Jlc291cmNlcy5Qcm9jZXNzX011bHRpcGxlU2VsZWN0aW9uICsgIiAtICIgKyBzZWxlY3Rpb24uc2l6ZSgpKTsgLy8kTk9OLU5MUy0xJCAKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0pOwotCi0JCQlpZiAoY2hhbmdlc0FsbG93ZWRbY291bnRdKSB7Ci0JCQkJY3RybF9hZGRfMS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQkJSUZpbHRlciBmaWx0ZXIgPSBnZXRGaWx0ZXIoKTsKLQkJCQkJCUxpc3QgZXhpc3RpbmdFbGVtZW50cyA9IFByb2Nlc3NVdGlsCi0JCQkJCQkJCS5nZXRBc3NvY2lhdGVkRWxlbWVudExpc3QoZ2V0RXhpc3RpbmdFbGVtZW50czEoKSk7Ci0KLQkJCQkJCUl0ZW1zRmlsdGVyRGlhbG9nIGZkID0gbmV3IEl0ZW1zRmlsdGVyRGlhbG9nKFBsYXRmb3JtVUkKLQkJCQkJCQkJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpCi0JCQkJCQkJCS5nZXRTaGVsbCgpLCBmaWx0ZXIsIGVsZW1lbnQsIHRhYlN0cmluZywKLQkJCQkJCQkJZXhpc3RpbmdFbGVtZW50cyk7Ci0KLQkJCQkJCWZkLnNldEJsb2NrT25PcGVuKHRydWUpOwotCQkJCQkJZmQuc2V0VGl0bGUodGFiU3RyaW5nKTsKLQkJCQkJCWZkLm9wZW4oKTsKLQkJCQkJCWFkZEl0ZW1zMShmZC5nZXRTZWxlY3RlZEl0ZW1zKCkpOwotCQkJCQkJdGFibGVWaWV3ZXIxLnJlZnJlc2goKTsKLQotCQkJCQl9Ci0JCQkJfSk7Ci0KLQkJCQljdHJsX2FkZF9wcm9jXzEuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJCWRlc2NyaXB0b3JQcm9jZXNzZmlsdGVyID0gZ2V0RmlsdGVyRm9yRGVzY3JpcHRvcnMoKTsKLQkJCQkJCXByb2Nlc3MgPSBnZXRQcm9jZXNzKCk7Ci0JCQkJCQlpZiAoZGVzY3JpcHRvclByb2Nlc3NmaWx0ZXIgIT0gbnVsbCAmJiBwcm9jZXNzICE9IG51bGwpIHsKLQkJCQkJCQlMaXN0IGV4aXN0aW5nRWxlbWVudHMgPSBnZXRFeGlzdGluZ0VsZW1lbnRzMSgpOwotCQkJCQkJCUl0ZW1zRmlsdGVyRGlhbG9nIGZkID0gbmV3IEl0ZW1zRmlsdGVyRGlhbG9nKAotCQkJCQkJCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKQotCQkJCQkJCQkJCQkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkKLQkJCQkJCQkJCQkJLmdldFNoZWxsKCksCi0JCQkJCQkJCQlkZXNjcmlwdG9yUHJvY2Vzc2ZpbHRlciwgcHJvY2VzcywKLQkJCQkJCQkJCWdldERlc2NyaXB0b3JUYWJOYW1lKCksIGV4aXN0aW5nRWxlbWVudHMpOwotCi0JCQkJCQkJZmQuc2V0QmxvY2tPbk9wZW4odHJ1ZSk7Ci0JCQkJCQkJZmQub3BlbigpOwotCQkJCQkJCWFkZEZyb21Qcm9jZXNzSXRlbXMxKGZkLmdldFNlbGVjdGVkSXRlbXMoKSk7Ci0JCQkJCQkJdGFibGVWaWV3ZXIxLnJlZnJlc2goKTsKLQkJCQkJCX0KLQotCQkJCQl9Ci0JCQkJfSk7Ci0KLQkJCQljdHJsX3JlbW92ZV8xLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHRhYmxlVmlld2VyMQotCQkJCQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJCQlpZiAoc2VsZWN0aW9uLnNpemUoKSA+IDApIHsKLQkJCQkJCQkvLyB1cGRhdGUgdGhlIG1vZGVsCi0JCQkJCQkJQXJyYXlMaXN0IHJtSXRlbXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCQkJcm1JdGVtcy5hZGRBbGwoc2VsZWN0aW9uLnRvTGlzdCgpKTsKLQkJCQkJCQlyZW1vdmVJdGVtczEocm1JdGVtcyk7Ci0JCQkJCQkJdGFibGVWaWV3ZXIxLnJlZnJlc2goKTsKLQotCQkJCQkJCS8vIGNsZWFyIHRoZSBzZWxlY3Rpb24KLQkJCQkJCQl0YWJsZVZpZXdlcjEuc2V0U2VsZWN0aW9uKG51bGwsIHRydWUpOwotCQkJCQkJCWN0cmxfYnJpZWZfZGVzYy5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJfQotCQkJCQkJY3RybF9yZW1vdmVfMS5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQkJfQotCQkJCX0pOwotCQkJfQotCQl9Ci0JCWNvdW50Kys7Ci0KLQkJLyoqCi0JCSAqIFNlY29uZCBzZXQgb2YgbGlzdGVuZXJzCi0JCSAqLwotCQlpZiAoY291bnQgPCB0YWJsZUNvdW50KSB7Ci0JCQljdHJsX3RhYmxlXzIuYWRkRm9jdXNMaXN0ZW5lcihuZXcgRm9jdXNBZGFwdGVyKCkgewotCQkJCXB1YmxpYyB2b2lkIGZvY3VzR2FpbmVkKEZvY3VzRXZlbnQgZSkgewotCQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHRhYmxlVmlld2VyMgotCQkJCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQkJCQkJaWYgKChzZWxlY3Rpb24uc2l6ZSgpID4gMCkgJiYgZWRpdGFibGUpIHsKLQkJCQkJCWlmIChjdHJsX3JlbW92ZV8yICE9IG51bGwpCi0JCQkJCQkJY3RybF9yZW1vdmVfMi5zZXRFbmFibGVkKHRydWUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfSk7Ci0KLQkJCXRhYmxlVmlld2VyMgotCQkJCQkuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewotCQkJCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHRhYmxlVmlld2VyMgotCQkJCQkJCQkJLmdldFNlbGVjdGlvbigpOwotCQkJCQkJCWlmICgoc2VsZWN0aW9uLnNpemUoKSA+IDApICYmIGVkaXRhYmxlKSB7Ci0JCQkJCQkJCWlmIChjdHJsX3JlbW92ZV8yICE9IG51bGwpCi0JCQkJCQkJCQljdHJsX3JlbW92ZV8yLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJCQkJfQotCQkJCQkJCWlmIChzZWxlY3Rpb24uc2l6ZSgpID09IDEpIHsKLQkJCQkJCQkJU3RyaW5nIGRlc2MgPSAoKE1ldGhvZEVsZW1lbnQpIHNlbGVjdGlvbgotCQkJCQkJCQkJCS5nZXRGaXJzdEVsZW1lbnQoKSkKLQkJCQkJCQkJCQkuZ2V0QnJpZWZEZXNjcmlwdGlvbigpOwotCQkJCQkJCQlpZiAoZGVzYyA9PSBudWxsKSB7Ci0JCQkJCQkJCQlkZXNjID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJfQotCQkJCQkJCQljdHJsX2JyaWVmX2Rlc2Muc2V0VGV4dChkZXNjKTsKLQkJCQkJCQl9IGVsc2UgaWYgKHNlbGVjdGlvbi5zaXplKCkgPiAxKSB7Ci0JCQkJCQkJCWN0cmxfYnJpZWZfZGVzYwotCQkJCQkJCQkJCS5zZXRUZXh0KFByb3BlcnRpZXNSZXNvdXJjZXMuUHJvY2Vzc19NdWx0aXBsZVNlbGVjdGlvbiArICIgLSAiICsgc2VsZWN0aW9uLnNpemUoKSk7IC8vJE5PTi1OTFMtMSQgCi0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9KTsKLQotCQkJaWYgKGNoYW5nZXNBbGxvd2VkW2NvdW50XSkgewotCQkJCWN0cmxfYWRkXzIuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJCUlGaWx0ZXIgZmlsdGVyID0gZ2V0RmlsdGVyKCk7Ci0JCQkJCQlMaXN0IGV4aXN0aW5nRWxlbWVudHMgPSBQcm9jZXNzVXRpbAotCQkJCQkJCQkuZ2V0QXNzb2NpYXRlZEVsZW1lbnRMaXN0KGdldEV4aXN0aW5nRWxlbWVudHMyKCkpOwotCQkJCQkJSXRlbXNGaWx0ZXJEaWFsb2cgZmQgPSBuZXcgSXRlbXNGaWx0ZXJEaWFsb2coUGxhdGZvcm1VSQotCQkJCQkJCQkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkKLQkJCQkJCQkJLmdldFNoZWxsKCksIGZpbHRlciwgZWxlbWVudCwgdGFiU3RyaW5nLAotCQkJCQkJCQlleGlzdGluZ0VsZW1lbnRzKTsKLQotCQkJCQkJZmQuc2V0QmxvY2tPbk9wZW4odHJ1ZSk7Ci0JCQkJCQlmZC5zZXRUaXRsZSh0YWJTdHJpbmcpOwotCQkJCQkJZmQub3BlbigpOwotCQkJCQkJYWRkSXRlbXMyKGZkLmdldFNlbGVjdGVkSXRlbXMoKSk7Ci0JCQkJCQl0YWJsZVZpZXdlcjIucmVmcmVzaCgpOwotCQkJCQl9Ci0JCQkJfSk7Ci0KLQkJCQljdHJsX2FkZF9wcm9jXzIuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJCWRlc2NyaXB0b3JQcm9jZXNzZmlsdGVyID0gZ2V0RmlsdGVyRm9yRGVzY3JpcHRvcnMoKTsKLQkJCQkJCXByb2Nlc3MgPSBnZXRQcm9jZXNzKCk7Ci0JCQkJCQlpZiAoZGVzY3JpcHRvclByb2Nlc3NmaWx0ZXIgIT0gbnVsbCAmJiBwcm9jZXNzICE9IG51bGwpIHsKLQkJCQkJCQlMaXN0IGV4aXN0aW5nRWxlbWVudHMgPSBnZXRFeGlzdGluZ0VsZW1lbnRzMigpOwotCQkJCQkJCUl0ZW1zRmlsdGVyRGlhbG9nIGZkID0gbmV3IEl0ZW1zRmlsdGVyRGlhbG9nKAotCQkJCQkJCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKQotCQkJCQkJCQkJCQkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkKLQkJCQkJCQkJCQkJLmdldFNoZWxsKCksCi0JCQkJCQkJCQlkZXNjcmlwdG9yUHJvY2Vzc2ZpbHRlciwgcHJvY2VzcywKLQkJCQkJCQkJCWdldERlc2NyaXB0b3JUYWJOYW1lKCksIGV4aXN0aW5nRWxlbWVudHMpOwotCi0JCQkJCQkJZmQuc2V0QmxvY2tPbk9wZW4odHJ1ZSk7Ci0JCQkJCQkJZmQub3BlbigpOwotCQkJCQkJCWFkZEZyb21Qcm9jZXNzSXRlbXMyKGZkLmdldFNlbGVjdGVkSXRlbXMoKSk7Ci0JCQkJCQkJdGFibGVWaWV3ZXIyLnJlZnJlc2goKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0pOwotCi0JCQkJY3RybF9yZW1vdmVfMi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB0YWJsZVZpZXdlcjIKLQkJCQkJCQkJLmdldFNlbGVjdGlvbigpOwotCQkJCQkJaWYgKHNlbGVjdGlvbi5zaXplKCkgPiAwKSB7Ci0JCQkJCQkJLy8gdXBkYXRlIHRoZSBtb2RlbAotCQkJCQkJCUFycmF5TGlzdCBybUl0ZW1zID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQkJCXJtSXRlbXMuYWRkQWxsKHNlbGVjdGlvbi50b0xpc3QoKSk7Ci0JCQkJCQkJcmVtb3ZlSXRlbXMyKHJtSXRlbXMpOwotCQkJCQkJCXRhYmxlVmlld2VyMi5yZWZyZXNoKCk7Ci0KLQkJCQkJCQkvLyBjbGVhciB0aGUgc2VsZWN0aW9uCi0JCQkJCQkJdGFibGVWaWV3ZXIyLnNldFNlbGVjdGlvbihudWxsLCB0cnVlKTsKLQkJCQkJCQljdHJsX2JyaWVmX2Rlc2Muc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCX0KLQkJCQkJCWN0cmxfcmVtb3ZlXzIuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCX0KLQkJfQotCQljb3VudCsrOwotCi0JCS8qKgotCQkgKiBUaGlyZCBzZXQgb2YgbGlzdGVuZXJzCi0JCSAqLwotCQlpZiAoY291bnQgPCB0YWJsZUNvdW50KSB7Ci0JCQljdHJsX3RhYmxlXzMuYWRkRm9jdXNMaXN0ZW5lcihuZXcgRm9jdXNBZGFwdGVyKCkgewotCQkJCXB1YmxpYyB2b2lkIGZvY3VzR2FpbmVkKEZvY3VzRXZlbnQgZSkgewotCQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHRhYmxlVmlld2VyMwotCQkJCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQkJCQkJaWYgKChzZWxlY3Rpb24uc2l6ZSgpID4gMCkgJiYgZWRpdGFibGUpCi0JCQkJCQljdHJsX3JlbW92ZV8zLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJfQotCQkJfSk7Ci0KLQkJCXRhYmxlVmlld2VyMwotCQkJCQkuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewotCQkJCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHRhYmxlVmlld2VyMwotCQkJCQkJCQkJLmdldFNlbGVjdGlvbigpOwotCQkJCQkJCWlmICgoc2VsZWN0aW9uLnNpemUoKSA+IDApICYmIGVkaXRhYmxlKQotCQkJCQkJCQljdHJsX3JlbW92ZV8zLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJCQkJaWYgKHNlbGVjdGlvbi5zaXplKCkgPT0gMSkgewotCQkJCQkJCQlTdHJpbmcgZGVzYyA9ICgoTWV0aG9kRWxlbWVudCkgc2VsZWN0aW9uCi0JCQkJCQkJCQkJLmdldEZpcnN0RWxlbWVudCgpKQotCQkJCQkJCQkJCS5nZXRCcmllZkRlc2NyaXB0aW9uKCk7Ci0JCQkJCQkJCWlmIChkZXNjID09IG51bGwpIHsKLQkJCQkJCQkJCWRlc2MgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQl9Ci0JCQkJCQkJCWN0cmxfYnJpZWZfZGVzYy5zZXRUZXh0KGRlc2MpOwotCQkJCQkJCX0gZWxzZSBpZiAoc2VsZWN0aW9uLnNpemUoKSA+IDEpIHsKLQkJCQkJCQkJY3RybF9icmllZl9kZXNjCi0JCQkJCQkJCQkJLnNldFRleHQoUHJvcGVydGllc1Jlc291cmNlcy5Qcm9jZXNzX011bHRpcGxlU2VsZWN0aW9uICsgIiAtICIgKyBzZWxlY3Rpb24uc2l6ZSgpKTsgLy8kTk9OLU5MUy0xJCAKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0pOwotCi0JCQlpZiAoKG5ldyBCb29sZWFuKGNoYW5nZXNBbGxvd2VkW2NvdW50XSkpLmJvb2xlYW5WYWx1ZSgpKSB7Ci0JCQkJY3RybF9hZGRfMy5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQkJSUZpbHRlciBmaWx0ZXIgPSBnZXRGaWx0ZXIoKTsKLQkJCQkJCUxpc3QgZXhpc3RpbmdFbGVtZW50cyA9IFByb2Nlc3NVdGlsCi0JCQkJCQkJCS5nZXRBc3NvY2lhdGVkRWxlbWVudExpc3QoZ2V0RXhpc3RpbmdFbGVtZW50czMoKSk7Ci0JCQkJCQlJdGVtc0ZpbHRlckRpYWxvZyBmZCA9IG5ldyBJdGVtc0ZpbHRlckRpYWxvZyhQbGF0Zm9ybVVJCi0JCQkJCQkJCS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKQotCQkJCQkJCQkuZ2V0U2hlbGwoKSwgZmlsdGVyLCBlbGVtZW50LCB0YWJTdHJpbmcsCi0JCQkJCQkJCWV4aXN0aW5nRWxlbWVudHMpOwotCi0JCQkJCQlmZC5zZXRCbG9ja09uT3Blbih0cnVlKTsKLQkJCQkJCWZkLnNldFRpdGxlKHRhYlN0cmluZyk7Ci0JCQkJCQlmZC5vcGVuKCk7Ci0JCQkJCQlhZGRJdGVtczMoZmQuZ2V0U2VsZWN0ZWRJdGVtcygpKTsKLQkJCQkJCXRhYmxlVmlld2VyMy5yZWZyZXNoKCk7Ci0KLQkJCQkJfQotCQkJCX0pOwotCi0JCQkJY3RybF9hZGRfcHJvY18zLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCQlkZXNjcmlwdG9yUHJvY2Vzc2ZpbHRlciA9IGdldEZpbHRlckZvckRlc2NyaXB0b3JzKCk7Ci0JCQkJCQlwcm9jZXNzID0gZ2V0UHJvY2VzcygpOwotCQkJCQkJaWYgKGRlc2NyaXB0b3JQcm9jZXNzZmlsdGVyICE9IG51bGwgJiYgcHJvY2VzcyAhPSBudWxsKSB7Ci0JCQkJCQkJTGlzdCBleGlzdGluZ0VsZW1lbnRzID0gZ2V0RXhpc3RpbmdFbGVtZW50czMoKTsKLQkJCQkJCQlJdGVtc0ZpbHRlckRpYWxvZyBmZCA9IG5ldyBJdGVtc0ZpbHRlckRpYWxvZygKLQkJCQkJCQkJCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkKLQkJCQkJCQkJCQkJLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpCi0JCQkJCQkJCQkJCS5nZXRTaGVsbCgpLAotCQkJCQkJCQkJZGVzY3JpcHRvclByb2Nlc3NmaWx0ZXIsIHByb2Nlc3MsCi0JCQkJCQkJCQlnZXREZXNjcmlwdG9yVGFiTmFtZSgpLCBleGlzdGluZ0VsZW1lbnRzKTsKLQotCQkJCQkJCWZkLnNldEJsb2NrT25PcGVuKHRydWUpOwotCQkJCQkJCWZkLm9wZW4oKTsKLQkJCQkJCQlhZGRGcm9tUHJvY2Vzc0l0ZW1zMyhmZC5nZXRTZWxlY3RlZEl0ZW1zKCkpOwotCQkJCQkJCXRhYmxlVmlld2VyMy5yZWZyZXNoKCk7Ci0JCQkJCQl9Ci0KLQkJCQkJfQotCQkJCX0pOwotCi0JCQkJY3RybF9yZW1vdmVfMy5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB0YWJsZVZpZXdlcjMKLQkJCQkJCQkJLmdldFNlbGVjdGlvbigpOwotCQkJCQkJaWYgKHNlbGVjdGlvbi5zaXplKCkgPiAwKSB7Ci0JCQkJCQkJLy8gdXBkYXRlIHRoZSBtb2RlbAotCQkJCQkJCUFycmF5TGlzdCBybUl0ZW1zID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQkJCXJtSXRlbXMuYWRkQWxsKHNlbGVjdGlvbi50b0xpc3QoKSk7Ci0JCQkJCQkJcmVtb3ZlSXRlbXMzKHJtSXRlbXMpOwotCQkJCQkJCXRhYmxlVmlld2VyMy5yZWZyZXNoKCk7Ci0KLQkJCQkJCQkvLyBjbGVhciB0aGUgc2VsZWN0aW9uCi0JCQkJCQkJdGFibGVWaWV3ZXIzLnNldFNlbGVjdGlvbihudWxsLCB0cnVlKTsKLQkJCQkJCQljdHJsX2JyaWVmX2Rlc2Muc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCX0KLQkJCQkJCWN0cmxfcmVtb3ZlXzMuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCX0KLQkJfQotCQljb3VudCsrOwotCi0JCS8qKgotCQkgKiBGb3V0aCBzZXQgb2YgbGlzdGVuZXJzCi0JCSAqLwotCQlpZiAoY291bnQgPCB0YWJsZUNvdW50KSB7Ci0JCQljdHJsX3RhYmxlXzQuYWRkRm9jdXNMaXN0ZW5lcihuZXcgRm9jdXNBZGFwdGVyKCkgewotCQkJCXB1YmxpYyB2b2lkIGZvY3VzR2FpbmVkKEZvY3VzRXZlbnQgZSkgewotCQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHRhYmxlVmlld2VyNAotCQkJCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQkJCQkJaWYgKChzZWxlY3Rpb24uc2l6ZSgpID4gMCkgJiYgZWRpdGFibGUpCi0JCQkJCQljdHJsX3JlbW92ZV80LnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJfQotCQkJfSk7Ci0KLQkJCXRhYmxlVmlld2VyNAotCQkJCQkuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewotCQkJCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHRhYmxlVmlld2VyNAotCQkJCQkJCQkJLmdldFNlbGVjdGlvbigpOwotCQkJCQkJCWlmICgoc2VsZWN0aW9uLnNpemUoKSA+IDApICYmIGVkaXRhYmxlKQotCQkJCQkJCQljdHJsX3JlbW92ZV80LnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJCQkJaWYgKHNlbGVjdGlvbi5zaXplKCkgPT0gMSkgewotCQkJCQkJCQlTdHJpbmcgZGVzYyA9ICgoTWV0aG9kRWxlbWVudCkgc2VsZWN0aW9uCi0JCQkJCQkJCQkJLmdldEZpcnN0RWxlbWVudCgpKQotCQkJCQkJCQkJCS5nZXRCcmllZkRlc2NyaXB0aW9uKCk7Ci0JCQkJCQkJCWlmIChkZXNjID09IG51bGwpIHsKLQkJCQkJCQkJCWRlc2MgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQl9Ci0JCQkJCQkJCWN0cmxfYnJpZWZfZGVzYy5zZXRUZXh0KGRlc2MpOwotCQkJCQkJCX0gZWxzZSBpZiAoc2VsZWN0aW9uLnNpemUoKSA+IDEpIHsKLQkJCQkJCQkJY3RybF9icmllZl9kZXNjCi0JCQkJCQkJCQkJLnNldFRleHQoUHJvcGVydGllc1Jlc291cmNlcy5Qcm9jZXNzX011bHRpcGxlU2VsZWN0aW9uICsgIiAtICIgKyBzZWxlY3Rpb24uc2l6ZSgpKTsgLy8kTk9OLU5MUy0xJCAKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0pOwotCi0JCQlpZiAoKG5ldyBCb29sZWFuKGNoYW5nZXNBbGxvd2VkW2NvdW50XSkpLmJvb2xlYW5WYWx1ZSgpKSB7Ci0JCQkJY3RybF9hZGRfNC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQkJSUZpbHRlciBmaWx0ZXIgPSBnZXRGaWx0ZXIoKTsKLQkJCQkJCUxpc3QgZXhpc3RpbmdFbGVtZW50cyA9IFByb2Nlc3NVdGlsCi0JCQkJCQkJCS5nZXRBc3NvY2lhdGVkRWxlbWVudExpc3QoZ2V0RXhpc3RpbmdFbGVtZW50czQoKSk7Ci0JCQkJCQlJdGVtc0ZpbHRlckRpYWxvZyBmZCA9IG5ldyBJdGVtc0ZpbHRlckRpYWxvZyhQbGF0Zm9ybVVJCi0JCQkJCQkJCS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKQotCQkJCQkJCQkuZ2V0U2hlbGwoKSwgZmlsdGVyLCBlbGVtZW50LCB0YWJTdHJpbmcsCi0JCQkJCQkJCWV4aXN0aW5nRWxlbWVudHMpOwotCi0JCQkJCQlmZC5zZXRCbG9ja09uT3Blbih0cnVlKTsKLQkJCQkJCWZkLnNldFRpdGxlKHRhYlN0cmluZyk7Ci0JCQkJCQlmZC5vcGVuKCk7Ci0JCQkJCQlhZGRJdGVtczQoZmQuZ2V0U2VsZWN0ZWRJdGVtcygpKTsKLQkJCQkJCXRhYmxlVmlld2VyNC5yZWZyZXNoKCk7Ci0JCQkJCX0KLQkJCQl9KTsKLQotCQkJCWN0cmxfYWRkX3Byb2NfNC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQkJZGVzY3JpcHRvclByb2Nlc3NmaWx0ZXIgPSBnZXRGaWx0ZXJGb3JEZXNjcmlwdG9ycygpOwotCQkJCQkJcHJvY2VzcyA9IGdldFByb2Nlc3MoKTsKLQkJCQkJCWlmIChkZXNjcmlwdG9yUHJvY2Vzc2ZpbHRlciAhPSBudWxsICYmIHByb2Nlc3MgIT0gbnVsbCkgewotCQkJCQkJCUxpc3QgZXhpc3RpbmdFbGVtZW50cyA9IGdldEV4aXN0aW5nRWxlbWVudHM0KCk7Ci0JCQkJCQkJSXRlbXNGaWx0ZXJEaWFsb2cgZmQgPSBuZXcgSXRlbXNGaWx0ZXJEaWFsb2coCi0JCQkJCQkJCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpCi0JCQkJCQkJCQkJCS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKQotCQkJCQkJCQkJCQkuZ2V0U2hlbGwoKSwKLQkJCQkJCQkJCWRlc2NyaXB0b3JQcm9jZXNzZmlsdGVyLCBwcm9jZXNzLAotCQkJCQkJCQkJZ2V0RGVzY3JpcHRvclRhYk5hbWUoKSwgZXhpc3RpbmdFbGVtZW50cyk7Ci0KLQkJCQkJCQlmZC5zZXRCbG9ja09uT3Blbih0cnVlKTsKLQkJCQkJCQlmZC5vcGVuKCk7Ci0JCQkJCQkJYWRkRnJvbVByb2Nlc3NJdGVtczQoZmQuZ2V0U2VsZWN0ZWRJdGVtcygpKTsKLQkJCQkJCQl0YWJsZVZpZXdlcjQucmVmcmVzaCgpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfSk7Ci0KLQkJCQljdHJsX3JlbW92ZV80LmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHRhYmxlVmlld2VyNAotCQkJCQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJCQlpZiAoc2VsZWN0aW9uLnNpemUoKSA+IDApIHsKLQkJCQkJCQkvLyB1cGRhdGUgdGhlIG1vZGVsCi0JCQkJCQkJQXJyYXlMaXN0IHJtSXRlbXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCQkJcm1JdGVtcy5hZGRBbGwoc2VsZWN0aW9uLnRvTGlzdCgpKTsKLQkJCQkJCQlyZW1vdmVJdGVtczQocm1JdGVtcyk7Ci0JCQkJCQkJdGFibGVWaWV3ZXI0LnJlZnJlc2goKTsKLQotCQkJCQkJCS8vIGNsZWFyIHRoZSBzZWxlY3Rpb24KLQkJCQkJCQl0YWJsZVZpZXdlcjQuc2V0U2VsZWN0aW9uKG51bGwsIHRydWUpOwotCQkJCQkJCWN0cmxfYnJpZWZfZGVzYy5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJfQotCQkJCQkJY3RybF9yZW1vdmVfNC5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQkJfQotCQkJCX0pOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkSXRlbXMxKExpc3QgbGlzdCkgewotCX07Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRJdGVtczIoTGlzdCBsaXN0KSB7Ci0JfTsKLQotCXByb3RlY3RlZCB2b2lkIGFkZEl0ZW1zMyhMaXN0IGxpc3QpIHsKLQl9OwotCi0JcHJvdGVjdGVkIHZvaWQgYWRkSXRlbXM0KExpc3QgbGlzdCkgewotCX07Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRGcm9tUHJvY2Vzc0l0ZW1zMShMaXN0IGxpc3QpIHsKLQl9OwotCi0JcHJvdGVjdGVkIHZvaWQgYWRkRnJvbVByb2Nlc3NJdGVtczIoTGlzdCBsaXN0KSB7Ci0JfTsKLQotCXByb3RlY3RlZCB2b2lkIGFkZEZyb21Qcm9jZXNzSXRlbXMzKExpc3QgbGlzdCkgewotCX07Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRGcm9tUHJvY2Vzc0l0ZW1zNChMaXN0IGxpc3QpIHsKLQl9OwotCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlSXRlbXMxKExpc3QgbGlzdCkgewotCX07Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVJdGVtczIoTGlzdCBsaXN0KSB7Ci0JfTsKLQotCXByb3RlY3RlZCB2b2lkIHJlbW92ZUl0ZW1zMyhMaXN0IGxpc3QpIHsKLQl9OwotCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlSXRlbXM0KExpc3QgbGlzdCkgewotCX07Ci0KLQlwcm90ZWN0ZWQgTGlzdCBnZXRFeGlzdGluZ0VsZW1lbnRzMSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfTsKLQotCXByb3RlY3RlZCBMaXN0IGdldEV4aXN0aW5nRWxlbWVudHMyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9OwotCi0JcHJvdGVjdGVkIExpc3QgZ2V0RXhpc3RpbmdFbGVtZW50czMoKSB7Ci0JCXJldHVybiBudWxsOwotCX07Ci0KLQlwcm90ZWN0ZWQgTGlzdCBnZXRFeGlzdGluZ0VsZW1lbnRzNCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfTsKLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9SZW1vdmVEZXNjcmlwdG9yQ29tbWFuZC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL1JlbW92ZURlc2NyaXB0b3JDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxMjNkYjguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL1JlbW92ZURlc2NyaXB0b3JDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQWJzdHJhY3RDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JUmVzb3VyY2VBd2FyZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQuRGVsZXRlVW51c2VkRGVzY3JpcHRvcnNDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudWkuUmVmZXJlbmNlU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Qcm9jZXNzVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5hY3Rpb25zLlByb2Nlc3NEZWxldGVBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLQotCi0vKioKLSAqIENvbW1hbmQgdG8gcmVtb3ZlIGRlc2NyaXB0b3JzCi0gKiAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBSZW1vdmVEZXNjcmlwdG9yQ29tbWFuZCBleHRlbmRzIEFic3RyYWN0Q29tbWFuZCBpbXBsZW1lbnRzCi0JCUlSZXNvdXJjZUF3YXJlQ29tbWFuZCB7Ci0KLQlwcml2YXRlIExpc3QgZWxlbWVudHM7Ci0KLQlwcml2YXRlIERlc2NyaXB0b3IgZGVzYzsKLQotCXByaXZhdGUgQ29sbGVjdGlvbiBtb2RpZmllZFJlc291cmNlczsKLQotCXByaXZhdGUgQ29tbWFuZCBkZWxldGVVbnVzZWREZXNjcmlwdG9yc0NvbW1hbmQgPSBudWxsOwotCi0JcHJpdmF0ZSBpbnQgZmVhdHVyZUlEOwotCi0JcHJpdmF0ZSBMaXN0IHJlZmVyZW5jZXM7Ci0KLQkvKioKLQkgKiBSZW1vdmUgcmVsYXRpb25zaGlwcwotCSAqLwotCXB1YmxpYyBSZW1vdmVEZXNjcmlwdG9yQ29tbWFuZChEZXNjcmlwdG9yIGRlc2MsIExpc3QgZWxlbWVudHMsIGludCBmZWF0dXJlSUQpIHsKLQotCQlzdXBlcigpOwotCi0JCXRoaXMuZWxlbWVudHMgPSBlbGVtZW50czsKLQkJdGhpcy5kZXNjID0gZGVzYzsKLQkJdGhpcy5mZWF0dXJlSUQgPSBmZWF0dXJlSUQ7Ci0KLQkJdGhpcy5tb2RpZmllZFJlc291cmNlcyA9IG5ldyBIYXNoU2V0KCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZCNleGVjdXRlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQkKLQkJTGlzdCBub3RVc2VkUmVmZXJlbmNlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbGVtZW50cy5zaXplKCk7IGkrKykgewotCQkJRGVzY3JpcHRvciBvID0gKERlc2NyaXB0b3IpIGVsZW1lbnRzLmdldChpKTsKLQotCQkJYm9vbGVhbiBjaGVja1JlZjsKLQkJCWlmIChvIGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yKQotCQkJewotCQkJCWNoZWNrUmVmID0gUHJvY2Vzc1V0aWwuY2hlY2tXb3JrUHJvZHVjdERlc2NyaXB0b3JSZWZlcmVuY2VzKENvbGxlY3Rpb25zCi0JCQkJLnNpbmdsZXRvbihkZXNjKSwgKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgbywgdHJ1ZSwgZmVhdHVyZUlEKTsKLQkJCX0KLQkJCWVsc2UKLQkJCQljaGVja1JlZiA9IFByb2Nlc3NVdGlsLmNoZWNrRGVzY3JpcHRvclJlZmVyZW5jZXMoZGVzYywgbyk7Ci0JCQkKLQkJCWlmICghY2hlY2tSZWYpIHsKLQkJCQlBY3Rpdml0eSBhY3QgPSBVbWFVdGlsLmdldFBhcmVudEFjdGl2aXR5KGRlc2MpOwotCQkJCWlmIChhY3QuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5jb250YWlucyhvKSkKLQkJCQkJbm90VXNlZFJlZmVyZW5jZXMuYWRkKG8pOwotCQkJfQotCQl9Ci0JCWlmICghKG5vdFVzZWRSZWZlcmVuY2VzLmlzRW1wdHkoKSkpIHsKLQkJCU9iamVjdFtdIHJlZlRvQmVEZWxldGVkID0gUmVmZXJlbmNlU2VsZWN0aW9uCi0JCQkJCS5nZXRSZWZlcmVuY2VzKG5vdFVzZWRSZWZlcmVuY2VzKTsKLQkJCXJlZmVyZW5jZXMgPSBBcnJheXMuYXNMaXN0KHJlZlRvQmVEZWxldGVkKTsKLQkJfQotCQkKLQkJcmVkbygpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQjcmVkbygpCi0JICovCi0JcHVibGljIHZvaWQgcmVkbygpIHsKLQotCQlpZiAoZGVzYyBpbnN0YW5jZW9mIFRhc2tEZXNjcmlwdG9yKQotCQl7Ci0JCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fUEVSRk9STUVEX1BSSU1BUklMWV9CWToKLS8vCQkJCSgoVGFza0Rlc2NyaXB0b3IpIGRlc2MpLnNldFBlcmZvcm1lZFByaW1hcmlseUJ5KG51bGwpOwotCQkJCSgoVGFza0Rlc2NyaXB0b3IpIGRlc2MpLmdldFBlcmZvcm1lZFByaW1hcmlseUJ5KCkucmVtb3ZlQWxsKAotCQkJCQkJZWxlbWVudHMpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fQURESVRJT05BTExZX1BFUkZPUk1FRF9CWToKLQkJCQkoKFRhc2tEZXNjcmlwdG9yKSBkZXNjKS5nZXRBZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSgpLnJlbW92ZUFsbCgKLQkJCQkJCWVsZW1lbnRzKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX0FTU0lTVEVEX0JZOgotCQkJCSgoVGFza0Rlc2NyaXB0b3IpIGRlc2MpLmdldEFzc2lzdGVkQnkoKS5yZW1vdmVBbGwoZWxlbWVudHMpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fTUFOREFUT1JZX0lOUFVUOgotCQkJCSgoVGFza0Rlc2NyaXB0b3IpIGRlc2MpLmdldE1hbmRhdG9yeUlucHV0KCkucmVtb3ZlQWxsKGVsZW1lbnRzKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX0VYVEVSTkFMX0lOUFVUOgotCQkJCSgoVGFza0Rlc2NyaXB0b3IpIGRlc2MpLmdldEV4dGVybmFsSW5wdXQoKS5yZW1vdmVBbGwoZWxlbWVudHMpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fT1BUSU9OQUxfSU5QVVQ6Ci0JCQkJKChUYXNrRGVzY3JpcHRvcikgZGVzYykuZ2V0T3B0aW9uYWxJbnB1dCgpLnJlbW92ZUFsbChlbGVtZW50cyk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19PVVRQVVQ6Ci0JCQkJKChUYXNrRGVzY3JpcHRvcikgZGVzYykuZ2V0T3V0cHV0KCkucmVtb3ZlQWxsKGVsZW1lbnRzKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQllbHNlIGlmIChkZXNjIGluc3RhbmNlb2YgUm9sZURlc2NyaXB0b3IpCi0JCXsKLQkJCXN3aXRjaCAoZmVhdHVyZUlEKXsKLQkJCWNhc2UgVW1hUGFja2FnZS5ST0xFX0RFU0NSSVBUT1JfX1JFU1BPTlNJQkxFX0ZPUjoKLQkJCQkoKFJvbGVEZXNjcmlwdG9yKSBkZXNjKS5nZXRSZXNwb25zaWJsZUZvcigpLnJlbW92ZUFsbChlbGVtZW50cyk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQotCQlpZiAocmVmZXJlbmNlcyAhPSBudWxsICYmICFyZWZlcmVuY2VzLmlzRW1wdHkoKSkgewotCQkJaWYgKGRlbGV0ZVVudXNlZERlc2NyaXB0b3JzQ29tbWFuZCA9PSBudWxsKSB7Ci0JCQkJZGVsZXRlVW51c2VkRGVzY3JpcHRvcnNDb21tYW5kID0gbmV3IERlbGV0ZVVudXNlZERlc2NyaXB0b3JzQ29tbWFuZCgKLQkJCQkJCXJlZmVyZW5jZXMsIGZhbHNlLCBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUKSB7Ci0KLQkJCQkJcHJvdGVjdGVkIENvbW1hbmQgZGVsZXRlKExpc3QgZWxlbWVudHMpIHsKLQkJCQkJCXJldHVybiBQcm9jZXNzRGVsZXRlQWN0aW9uLmRlbGV0ZShlbGVtZW50cyk7Ci0JCQkJCX0KLQkJCQl9OwotCQkJfQotCQkJZGVsZXRlVW51c2VkRGVzY3JpcHRvcnNDb21tYW5kLmV4ZWN1dGUoKTsKLQkJfQotCi0JCWlmICghZWxlbWVudHMuaXNFbXB0eSgpKSB7Ci0JCQkKLQkJCWlmIChkZXNjLmVSZXNvdXJjZSgpICE9IG51bGwpIHsKLQkJCQltb2RpZmllZFJlc291cmNlcy5hZGQoZGVzYy5lUmVzb3VyY2UoKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5BYnN0cmFjdENvbW1hbmQjdW5kbygpCi0JICovCi0JcHVibGljIHZvaWQgdW5kbygpIHsKLQotCQkvLyBiYXNpY2FsbHkgcmVtb3ZlIGZyb20gY29uZmlndXJhdGlvbiBpZiBhbnl0aGluZyB3YXMgYWRkZWQKLQotCQlpZiAoZGVzYyBpbnN0YW5jZW9mIFRhc2tEZXNjcmlwdG9yKQotCQl7Ci0JCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fUEVSRk9STUVEX1BSSU1BUklMWV9CWToKLS8vCQkJCU9iamVjdCBvID0gZWxlbWVudHMuZ2V0KDApOwotLy8JCQkJaWYgKG8gaW5zdGFuY2VvZiBSb2xlRGVzY3JpcHRvcikKLS8vCQkJCQkoKFRhc2tEZXNjcmlwdG9yKSBkZXNjKS5zZXRQZXJmb3JtZWRQcmltYXJpbHlCeSgoUm9sZURlc2NyaXB0b3Ipbyk7Ci0JCQkJKChUYXNrRGVzY3JpcHRvcikgZGVzYykuZ2V0UGVyZm9ybWVkUHJpbWFyaWx5QnkoKS5hZGRBbGwoCi0JCQkJCQllbGVtZW50cyk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19BRERJVElPTkFMTFlfUEVSRk9STUVEX0JZOgotCQkJCSgoVGFza0Rlc2NyaXB0b3IpIGRlc2MpLmdldEFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5KCkuYWRkQWxsKAotCQkJCQkJZWxlbWVudHMpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fQVNTSVNURURfQlk6Ci0JCQkJKChUYXNrRGVzY3JpcHRvcikgZGVzYykuZ2V0QXNzaXN0ZWRCeSgpLmFkZEFsbChlbGVtZW50cyk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19NQU5EQVRPUllfSU5QVVQ6Ci0JCQkJKChUYXNrRGVzY3JpcHRvcikgZGVzYykuZ2V0TWFuZGF0b3J5SW5wdXQoKS5hZGRBbGwoZWxlbWVudHMpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fRVhURVJOQUxfSU5QVVQ6Ci0JCQkJKChUYXNrRGVzY3JpcHRvcikgZGVzYykuZ2V0RXh0ZXJuYWxJbnB1dCgpLmFkZEFsbChlbGVtZW50cyk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19PUFRJT05BTF9JTlBVVDoKLQkJCQkoKFRhc2tEZXNjcmlwdG9yKSBkZXNjKS5nZXRPcHRpb25hbElucHV0KCkuYWRkQWxsKGVsZW1lbnRzKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX09VVFBVVDoKLQkJCQkoKFRhc2tEZXNjcmlwdG9yKSBkZXNjKS5nZXRPdXRwdXQoKS5hZGRBbGwoZWxlbWVudHMpOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCWVsc2UgaWYgKGRlc2MgaW5zdGFuY2VvZiBSb2xlRGVzY3JpcHRvcikKLQkJewotCQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5ST0xFX0RFU0NSSVBUT1JfX1JFU1BPTlNJQkxFX0ZPUjoKLQkJCQkoKFJvbGVEZXNjcmlwdG9yKSBkZXNjKS5nZXRSZXNwb25zaWJsZUZvcigpLmFkZEFsbChlbGVtZW50cyk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQotCQlpZiAocmVmZXJlbmNlcyAhPSBudWxsICYmICFyZWZlcmVuY2VzLmlzRW1wdHkoKSkgewotCQkJdHJ5IHsKLQkJCQlpZiAoZGVsZXRlVW51c2VkRGVzY3JpcHRvcnNDb21tYW5kICE9IG51bGwpCi0JCQkJCWRlbGV0ZVVudXNlZERlc2NyaXB0b3JzQ29tbWFuZC51bmRvKCk7Ci0JCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGV4Y2VwdGlvbikgewotCQkJCi0JCQl9Ci0JCX0KLQkJCi0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkFic3RyYWN0Q29tbWFuZCNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkKLQl7Ci0JCWlmIChkZWxldGVVbnVzZWREZXNjcmlwdG9yc0NvbW1hbmQgIT0gbnVsbCkKLQkJCWRlbGV0ZVVudXNlZERlc2NyaXB0b3JzQ29tbWFuZC5kaXNwb3NlKCk7Ci0JCWlmKHJlZmVyZW5jZXMgIT0gbnVsbCkgewotCQkJcmVmZXJlbmNlcy5jbGVhcigpOwotCQl9Ci0JCWlmKG1vZGlmaWVkUmVzb3VyY2VzICE9IG51bGwpIHsKLQkJCW1vZGlmaWVkUmVzb3VyY2VzLmNsZWFyKCk7Ci0JCX0KLQkJCi0JCXN1cGVyLmRpc3Bvc2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5BYnN0cmFjdENvbW1hbmQjcHJlcGFyZSgpCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gcHJlcGFyZSgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSVJlc291cmNlQXdhcmVDb21tYW5kI2dldE1vZGlmaWVkUmVzb3VyY2VzKCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRNb2RpZmllZFJlc291cmNlcygpIHsKLQkJcmV0dXJuIG1vZGlmaWVkUmVzb3VyY2VzOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL1Jlc291cmNlcy5wcm9wZXJ0aWVzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL1Jlc291cmNlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZGIwOGNhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9SZXNvdXJjZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIxMSArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLQotUHJvY2Vzc19nZW5lcmFsSW5mb3JtYXRpb25UaXRsZT1HZW5lcmFsIEluZm9ybWF0aW9uCi1Qcm9jZXNzX0RvY3VtZW50SW5mb3JtYXRpb25UaXRsZT1Eb2N1bWVudGF0aW9uIEluZm9ybWF0aW9uCi1BY3Rpdml0eV9ndWlkYW5jZUluZm9ybWF0aW9uVGl0bGU9R3VpZGFuY2UKLUJyZWFrZG93bkVsZW1lbnRfb3B0aW9uSW5mb3JtYXRpb25UaXRsZT1CcmVha2Rvd24gT3B0aW9ucwotVGFza0Rlc2NyaXB0b3Jfc3RlcEluZm9ybWF0aW9uVGl0bGU9U3RlcHMKLQotVGFza0Rlc2NyaXB0b3Jfc3RlcEluZm9ybWF0aW9uRGVzY3JpcHRpb249U3BlY2lmeSB0aGUgc3RlcHMgdG8gcGVyZm9ybSB0aGlzIHRhc2sgZGVzY3JpcHRvci4KLQotUHJvY2Vzc19nZW5lcmFsSW5mb3JtYXRpb25EZXNjcmlwdGlvbj1Qcm92aWRlIGdlbmVyYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyB7MH0uCi1Qcm9jZXNzX2RvY3VtZW50SW5mb3JtYXRpb25EZXNjcmlwdGlvbj1Qcm92aWRlIGRvY3VtZW50YXRpb24gaW5mb3JtYXRpb24gYWJvdXQgdGhpcyB7MH0uCi0KLURlc2NyaXB0b3JfZ2VuZXJhbEluZm9ybWF0aW9uRGVzY3JpcHRpb249UHJvdmlkZSBnZW5lcmFsIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgZGVzY3JpcHRvci4KLURlc2NyaXB0b3JfZGV0YWlsSW5mb3JtYXRpb25EZXNjcmlwdGlvbj1Qcm92aWRlIGRldGFpbGVkIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgZGVzY3JpcHRvci4KLU1pbGVzdG9uZV9nZW5lcmFsSW5mb3JtYXRpb25EZXNjcmlwdGlvbj1Qcm92aWRlIGdlbmVyYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBtaWxlc3RvbmUuCi1NaWxlc3RvbmVfZGV0YWlsSW5mb3JtYXRpb25EZXNjcmlwdGlvbj1Qcm92aWRlIGRldGFpbGVkIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgbWlsZXN0b25lLgotCi1CcmVha2Rvd25FbGVtZW50X2dlbmVyYWxJbmZvcm1hdGlvbkRlc2NyaXB0aW9uPVByb3ZpZGUgZ2VuZXJhbCBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGJyZWFrZG93biBlbGVtZW50LgotV29ya0JyZWFrZG93bkVsZW1lbnRfZ2VuZXJhbEluZm9ybWF0aW9uRGVzY3JpcHRpb249UHJvdmlkZSBnZW5lcmFsIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgd29yayBicmVha2Rvd24gZWxlbWVudC4KLURlc2NyaXB0b3JfZ2VuZXJhbEluZm9ybWF0aW9uRGVzY3JpcHRvbj1Qcm92aWRlIGdlbmVyYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBkZXNjcmlwdG9yLgotQWN0aXZpdHlfZ2VuZXJhbEluZm9ybWF0aW9uRGVzY3JpcHRpb249UHJvdmlkZSBnZW5lcmFsIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgYWN0aXZpdHkuCi0KLUJyZWFrZG93bkVsZW1lbnRfRG9jdW1lbnRJbmZvcm1hdGlvbkRlc2NyaXB0aW9uPVByb3ZpZGUgZG9jdW1lbnRhdGlvbiBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGJyZWFrZG93biBlbGVtZW50LgotQWN0aXZpdHlfRG9jdW1lbnRJbmZvcm1hdGlvbkRlc2NyaXB0aW9uPVByb3ZpZGUgZG9jdW1lbnRhdGlvbiBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGFjdGl2aXR5LgotRGVzY3JpcHRvcl9kb2N1bWVudEluZm9ybWF0aW9uRGVzY3JpcHRpb249UHJvdmlkZSBkb2N1bWVudGF0aW9uIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgZGVzY3JpcHRvci4KLVByb2Nlc3NfTm9uZT08PCBOT05FID4+Ci1Qcm9jZXNzX25hbWU9TmFtZToKLVByb2Nlc3NfUHJlc2VudGF0aW9uTmFtZT1QcmVzZW50YXRpb24gbmFtZToKLVByb2Nlc3NfYnJpZWZEZXNjcmlwdGlvbj1CcmllZiBkZXNjcmlwdGlvbjoKLVByb2Nlc3NfbWFpbkRlc2NyaXB0aW9uPSBNYWluIGRlc2NyaXB0aW9uOgotUHJvY2Vzc19wdXJwb3NlPVB1cnBvc2U6Ci1Qcm9jZXNzX3ByZWZpeD1QcmVmaXg6Ci0KLUJyZWFrZG93bkVsZW1lbnRfVHlwZV9OYW1lPUJyZWFrZG93biBFbGVtZW50Ci0KLVByb2Nlc3NfVHlwZV9UYXNrPU1ldGhvZCB0YXNrOgotUHJvY2Vzc19UeXBlX1JvbGU9TWV0aG9kIHJvbGU6Ci1Qcm9jZXNzX1R5cGVfV29ya1Byb2R1Y3Q9TWV0aG9kIHdvcmsgcHJvZHVjdDoKLQotV29ya1Byb2R1Y3RfVHlwZT1Xb3JrIFByb2R1Y3QgVHlwZToKLQotQWN0aXZpdHlfTW9kZWxJbmZvPU1vZGVsIGluZm9ybWF0aW9uOgotQWN0aXZpdHlfVHlwZT1BY3Rpdml0eSBUeXBlOgotQWN0aXZpdHlfcHJlc2VudGF0aW9uTmFtZT1QcmVzZW50YXRpb24gbmFtZToKLUFjdGl2aXR5X2FsdGVybmF0aXZlcz1BbHRlcm5hdGl2ZXM6Ci1BY3Rpdml0eV9ob3dUb1N0YWZmPUhvdyB0byBzdGFmZjoKLUJyZWFrZG93bkVsZW1lbnRfa2V5Q29uc2lkZXJhdGlvbnM9S2V5IGNvbnNpZGVyYXRpb25zOgotUHJvY2Vzc191c2FnZUd1aWRhbmNlPVVzYWdlIGd1aWRhbmNlOgotCi1BY3Rpdml0eV9Sb2FkbWFwVGl0bGU9Um9hZG1hcHMKLUFjdGl2aXR5X1JvYWRtYXBEZXNjcmlwdGlvbj1Qcm92aWRlIGxpbmtzIHRvIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gaW4gdGhlIGZvcm0gb2Ygcm9hZG1hcHMuCi1BY3Rpdml0eV9HZW5lcmFsR3VpZGFuY2VUaXRsZT1HZW5lcmFsIEd1aWRhbmNlCi1BY3Rpdml0eV9HZW5lcmFsR3VpZGFuY2VEZXNjcmlwdGlvbj1Qcm92aWRlIGxpbmtzIHRvIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gaW4gdGhlIGZvcm0gb2YgZ3VpZGFuY2UuCi1BY3Rpdml0eV9Db21tdW5pY2F0aW9uTWF0ZXJpYWxUaXRsZT1Db21tdW5pY2F0aW9uIE1hdGVyaWFscwotQWN0aXZpdHlfQ29tbXVuaWNhdGlvbk1hdGVyaWFsRGVzY3JpcHRpb249UHJvdmlkZSBsaW5rcyB0byBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGluIHRoZSBmb3JtIG9mIGNvbW11bmljYXRpb24gbWF0ZXJpYWxzLgotQWN0aXZpdHlfRWR1Y2F0aW9uTWF0ZXJpYWxUaXRsZT1FZHVjYXRpb24gTWF0ZXJpYWxzCi1BY3Rpdml0eV9FZHVjYXRpb25NYXRlcmlhbERlc2NyaXB0aW9uPVByb3ZpZGUgbGlua3MgdG8gYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBpbiB0aGUgZm9ybSBvZiBlZHVjYXRpb24gbWF0ZXJpYWxzLgotCi1BY3Rpdml0eV9TZWxlY3RlZF9Sb2FkbWFwPVJvYWRtYXBzOgotQWN0aXZpdHlfU2VsZWN0ZWRfR2VuZXJhbEd1aWRhbmNlPUd1aWRhbmNlOgotQWN0aXZpdHlfU2VsZWN0ZWRfQ29tbXVuaWNhdGlvbk1hdGVyaWFsPUNvbW11bmljYXRpb24gTWF0ZXJpYWxzOgotQWN0aXZpdHlfU2VsZWN0ZWRfRWR1Y2F0aW9uTWF0ZXJpYWw9RWR1Y2F0aW9uIE1hdGVyaWFsczoKLQotQWN0aXZpdHlfRGlhZ3JhbVRpdGxlPURpYWdyYW0KLUFjdGl2aXR5X0RpYWdyYW1EZXNjcmlwdGlvbiA9IFByb3ZpZGUgZGlhZ3JhbSBpbWFnZXMgZm9yIHRoaXMgezB9LgotQWN0aXZpdHlfQURJbWFnZT1BY3Rpdml0eSBEaWFncmFtCi1BY3Rpdml0eV9BRERJbWFnZT1BY3Rpdml0eSBEZXRhaWwgRGlhZ3JhbQotQWN0aXZpdHlfV1BESW1hZ2U9V29yayBQcm9kdWN0IERlcGVuZGVuY3kgRGlhZ3JhbQotQWN0aXZpdHlfVXNlQURJbWFnZT1Vc2UgQWN0aXZpdHkgRGlhZ3JhbSBmb3IgcHVibGlzaGluZwotQWN0aXZpdHlfVXNlQURESW1hZ2U9VXNlIEFjdGl2aXR5IERldGFpbCBEaWFncmFtIGZvciBwdWJsaXNoaW5nCi1BY3Rpdml0eV9Vc2VXUERJbWFnZT1Vc2UgV29yayBQcm9kdWN0IERlcGVuZGVuY3kgRGlhZ3JhbSBmb3IgcHVibGlzaGluZwotQWN0aXZpdHlfQXNzaWduPUFzc2lnbi4uLgotCi1UYXNrRGVzY3JpcHRvcl9TZWxlY3RlZF9TdGVwcz1TdGVwczoKLVRhc2tEZXNjcmlwdG9yX1N0ZXBEaWFsb2dUaXRsZT1TdGVwcwotVGFza0Rlc2NyaXB0b3JfU3RlcERpYWxvZ01lc3NhZ2U9U2VsZWN0IHN0ZXBzCi0KLUFjdGl2aXR5X1dvcmtSb2xsdXA9V29yayBSb2xsdXAKLUFjdGl2aXR5X1RlYW1Sb2xsdXA9VGVhbSBSb2xsdXAKLUFjdGl2aXR5X1dvcmtQcm9kdWN0c1JvbGx1cD1Xb3JrIFByb2R1Y3RzIFJvbGx1cAotQWN0aXZpdHlfV29ya1JvbGx1cERlc2NyaXB0aW9uPVJldmlldyB0aGUgd29yayByb2xsLXVwIGZvciB0aGlzIGFjdGl2aXR5IGluIHRoaXMgc2VjdGlvbi4KLUFjdGl2aXR5X1RlYW1Sb2xsdXBEZXNjcmlwdGlvbj1SZXZpZXcgdGhlIHRlYW0gcm9sbC11cCBmb3IgdGhpcyBhY3Rpdml0eSBpbiB0aGlzIHNlY3Rpb24uCi1BY3Rpdml0eV9Xb3JrUHJvZHVjdHNSb2xsdXBEZXNjcmlwdGlvbj1SZXZpZXcgdGhlIHdvcmsgcHJvZHVjdCByb2xsLXVwIGZvciB0aGlzIGFjdGl2aXR5IGluIHRoaXMgc2VjdGlvbi4KLUJyZWFrZG93bkVsZW1lbnRfT3B0aW9uX011bHRpcGxlT2N1cnJhbmNlPU11bHRpcGxlIE9jY3VycmVuY2VzCi1CcmVha2Rvd25FbGVtZW50X09wdGlvbl9PcHRpb25hbD1PcHRpb25hbAotQnJlYWtkb3duRWxlbWVudF9PcHRpb25fUGxhbm5lZD1QbGFubmVkCi1CcmVha2Rvd25FbGVtZW50X09wdGlvbl9TdXByZXNzZWQ9U3VwcHJlc3NlZAotCi1Xb3JrQnJlYWtkb3duRWxlbWVudF9FdmVudERyaXZlbj1FdmVudCBEcml2ZW4KLVdvcmtCcmVha2Rvd25FbGVtZW50X09uZ29pbmc9T25nb2luZwotV29ya0JyZWFrZG93bkVsZW1lbnRfUmVwZWF0YWJsZT1SZXBlYXRhYmxlCi1Xb3JrQnJlYWtkb3duRWxlbWVudF9QcmVkZWNlc3NvcnM9UHJlZGVjZXNzb3JzOgotV29ya0JyZWFrZG93bkVsZW1lbnRfRGVwZW5kZW5jeT1EZXBlbmRlbmN5OgotV29ya0JyZWFrZG93bkVsZW1lbnRfRGVwZW5kZW5jeV9DT0xfSURfVEVYVD1JbmRleAotV29ya0JyZWFrZG93bkVsZW1lbnRfRGVwZW5kZW5jeV9DT0xfUFJFU0VOVEFUSU9OX05BTUVfVEVYVD1QcmVzZW50YXRpb24gTmFtZQotV29ya0JyZWFrZG93bkVsZW1lbnRfRGVwZW5kZW5jeV9DT0xfREVQRU5ERU5DWV9URVhUPURlcGVuZGVuY3kKLVdvcmtCcmVha2Rvd25FbGVtZW50X0RlcGVuZGVuY3lfQWRkPUFkZAotV29ya0JyZWFrZG93bkVsZW1lbnRfRGVwZW5kZW5jeV9FZGl0PUVkaXQKLVdvcmtCcmVha2Rvd25FbGVtZW50X0RlcGVuZGVuY3lfUmVtb3ZlPVJlbW92ZQotCi1Xb3JrT3JkZXJUeXBlX0ZJTklTSF9UT19TVEFSVD1GaW5pc2ggVG8gU3RhcnQKLVdvcmtPcmRlclR5cGVfRklOSVNIX1RPX0ZJTklTSD1GaW5pc2ggVG8gRmluaXNoCi1Xb3JrT3JkZXJUeXBlX1NUQVJUX1RPX0ZJTklTSD1TdGFydCBUbyBGaW5pc2gKLVdvcmtPcmRlclR5cGVfU1RBUlRfVE9fU1RBUlQ9U3RhcnQgVG8gU3RhcnQKLQotQnJlYWtkb3duRWxlbWVudF9PcHRpb25fU3luY2hyb25pemVkPVN5bmNocm9uaXplZCB3aXRoIHNvdXJjZQotCi1EZXNjcmlwdG9yX1JlZmluZWREZXNjcmlwdGlvbj1SZWZpbmVkIGRlc2NyaXB0aW9uOgotCi1UYXNrRGVzY3JpcHRvcl9Sb2xlc19TZWN0aW9uVGl0bGU9Um9sZXMKLVRhc2tEZXNjcmlwdG9yX1JvbGVzX1NlY3Rpb25EZXNjcmlwdGlvbj1Bc3NpZ24gdGhlIHJvbGUgZGVzY3JpcHRvcnMgdG8gcGVyZm9ybSB0aGlzIHRhc2sgZGVzY3JpcHRvci4KLVRhc2tEZXNjcmlwdG9yX1JvbGVzX1RhYmxlMT1QcmltYXJ5IFBlcmZvcm1lcnM6Ci1UYXNrRGVzY3JpcHRvcl9Sb2xlc19UYWJsZTI9QWRkaXRpb25hbCBQZXJmb3JtZXJzOgotVGFza0Rlc2NyaXB0b3JfUm9sZXNfVGFibGUzPUFzc2lzdGVkIEJ5OgotCi1UYXNrRGVzY3JpcHRvcl9Xb3JrUHJvZHVjdHNfU2VjdGlvblRpdGxlPVdvcmsgUHJvZHVjdHMKLVRhc2tEZXNjcmlwdG9yX1dvcmtQcm9kdWN0c19TZWN0aW9uRGVzY3JpcHRpb249U3BlY2lmeSB0aGUgaW5wdXQgYW5kIG91dHB1dCB3b3JrIHByb2R1Y3QgZGVzY3JpcHRvcnMgZm9yIHRoaXMgdGFzayBkZXNjcmlwdG9yLgotVGFza0Rlc2NyaXB0b3JfV29ya1Byb2R1Y3RzX1RhYmxlMT1NYW5kYXRvcnkgSW5wdXQ6Ci1UYXNrRGVzY3JpcHRvcl9Xb3JrUHJvZHVjdHNfVGFibGUyPU9wdGlvbmFsIElucHV0OgotVGFza0Rlc2NyaXB0b3JfV29ya1Byb2R1Y3RzX1RhYmxlMz1FeHRlcm5hbCBJbnB1dDoKLVRhc2tEZXNjcmlwdG9yX1dvcmtQcm9kdWN0c19UYWJsZTQ9T3V0cHV0OgotCi1Sb2xlRGVzY3JpcHRvcl9UYXNrc19TZWN0aW9uVGl0bGU9VGFza3MKLVJvbGVEZXNjcmlwdG9yX1Rhc2tzX1NlY3Rpb25EZXNjcmlwdGlvbj1UaGlzIHJvbGUgZGVzY3JpcHRvciBpcyBwZXJmb3JtZXIgb2YgZm9sbG93aW5nIHRhc2sgZGVzY3JpcHRvcnMuCi1Sb2xlRGVzY3JpcHRvcl9UYXNrc19UYWJsZTE9UHJpbWFyeSBQZXJmb3JtZXI6Ci1Sb2xlRGVzY3JpcHRvcl9UYXNrc19UYWJsZTI9QWRkaXRpb25hbCBQZXJmb3JtZXJzOgotUm9sZURlc2NyaXB0b3JfVGFza3NfVGFibGUzPUFzc2lzdGVkIEJ5OgotCi1Sb2xlRGVzY3JpcHRvcl9Xb3JrUHJvZHVjdHNfU2VjdGlvblRpdGxlPVdvcmsgUHJvZHVjdHMKLVJvbGVEZXNjcmlwdG9yX1dvcmtQcm9kdWN0c19TZWN0aW9uRGVzY3JpcHRpb249VGhpcyByb2xlIGRlc2NyaXB0b3IgaXMgcmVzcG9uc2libGUgZm9yIGFuZCBtb2RpZmllcyBmb2xsb3dpbmcgd29yayBwcm9kdWN0IGRlc2NyaXB0b3JzLgotUm9sZURlc2NyaXB0b3JfV29ya1Byb2R1Y3RzX1RhYmxlMT1SZXNwb25zaWJsZSBmb3I6Ci1Sb2xlRGVzY3JpcHRvcl9Xb3JrUHJvZHVjdHNfVGFibGUyPU1vZGlmaWVzOgotCi1Xb3JrUHJvZHVjdERlc2NyaXB0b3JfUm9sZXNfU2VjdGlvblRpdGxlPVJvbGVzCi1Xb3JrUHJvZHVjdERlc2NyaXB0b3JfUm9sZXNfU2VjdGlvbkRlc2NyaXB0aW9uPVRoZSBmb2xsb3dpbmcgcm9sZSBkZXNjcmlwdG9ycyBhcmUgcmVzcG9uc2libGUgZm9yIGFuZCBtb2RpZmllcyB0aGlzIHdvcmsgcHJvZHVjdCBkZXNjcmlwdG9yLgotV29ya1Byb2R1Y3REZXNjcmlwdG9yX1JvbGVzX1RhYmxlMT1SZXNwb25zaWJsZSBmb3I6Ci1Xb3JrUHJvZHVjdERlc2NyaXB0b3JfUm9sZXNfVGFibGUyPU1vZGlmaWVkIGJ5OgotV29ya1Byb2R1Y3REZXNjcmlwdG9yX1R5cGU9VHlwZToKLVdvcmtQcm9kdWN0RGVzY3JpcHRvcl9BY3Rpdml0eUVudHJ5U3RhdGU9QWN0aXZpdHkgRW50cnkgU3RhdGU6Ci1Xb3JrUHJvZHVjdERlc2NyaXB0b3JfQWN0aXZpdHlFeGl0U3RhdGU9QWN0aXZpdHkgRXhpdCBTdGF0ZToKLQotV1BEZXNjcmlwdG9yX0RlbGl2ZXJhYmxlUGFydF9TZWN0aW9uVGl0bGU9RGVsaXZlcmFibGUgUGFydHMKLVdQRGVzY3JpcHRvcl9EZWxpdmVyYWJsZVBhcnRfU2VjdGlvbkRlc2NyaXB0aW9uPVRoZSBkZWxpdmVyYWJsZSBoYXMgZm9sbG93aW5nIGRlbGl2ZXJhYmxlIHBhcnRzLgotV1BEZXNjcmlwdG9yX0RlbGl2ZXJhYmxlUGFydF9UYWJsZTE9RGVsaXZlcmFibGUgUGFydHMKLQotUm9sZURlc2NyaXB0b3JfVGVhbV9TZWN0aW9uVGl0bGU9VGVhbXMKLVJvbGVEZXNjcmlwdG9yX1RlYW1fU2VjdGlvbkRlc2NyaXB0aW9uPVRoaXMgcm9sZSBkZXNjcmlwdG9yIHJlZmVycyB0byBmb2xsb3dpbmcgdGVhbXMuCi1Sb2xlRGVzY3JpcHRvcl9UZWFtX1RhYmxlMT1UZWFtczoKLQotQ29tcG9zaXRlUm9sZV9Sb2xlX1NlY3Rpb25UaXRsZT1Sb2xlcwotQ29tcG9zaXRlUm9sZV9Sb2xlX1NlY3Rpb25EZXNjcmlwdGlvbj1UaGlzIGNvbXBvc2l0ZSByb2xlIGhhcyBmb2xsb3dpbmcgYWdncmVnYXRlZCByb2xlcy4KLUNvbXBvc2l0ZVJvbGVfUm9sZV9UYWJsZTE9QWdncmVnYXRlZCBSb2xlczoKLQotVGVhbVByb2ZpbGVfUm9sZV9TZWN0aW9uVGl0bGU9Um9sZXMKLVRlYW1Qcm9maWxlX1JvbGVfU2VjdGlvbkRlc2NyaXB0aW9uPUFkZCBvciByZW1vdmUgcm9sZXMgdG8vZnJvbSB0aGUgdGVhbSBwcm9maWxlLgotVGVhbVByb2ZpbGVfUm9sZV9UYWJsZTE9Um9sZXM6Ci0KLVByb2Nlc3NfUmljaFRleHRfQ29sbGFwc2VJbWFnZT1jb2xsYXBzZWQuZ2lmCi1Qcm9jZXNzX1JpY2hUZXh0X0V4cGFuZEltYWdlPWV4cGFuZGVkLmdpZgotUHJvY2Vzc19BZGQ9QWRkLi4uCi1Qcm9jZXNzX0FkZEZyb21Qcm9jZXNzPUFkZCBmcm9tIFByb2Nlc3MuLi4KLVByb2Nlc3NfUmVuYW1lX01lc3NhZ2U9WW91IGFyZSBhYm91dCB0byBjaGFuZ2UgdGhlIG5hbWUgb2YgdGhpcyBwcm9jZXNzLiBUaGlzIHdpbGwgc2F2ZSB0aGlzIGVkaXRvciBhbmQgcmVuYW1lIHRoZSBwcm9jZXNzIGZvbGRlciB0byB0aGUgbmV3IG5hbWUuIERvIHlvdSB3YW50IHRvIGNvbnRpbnVlPwotUHJvY2Vzc19SZW1vdmU9UmVtb3ZlCi1Qcm9jZXNzX1VwPVVwCi1Qcm9jZXNzX0Rvd249RG93bgotUHJvY2Vzc19NdWx0aXBsZVNlbGVjdGlvbj1NdWx0aXBsZSBTZWxlY3Rpb24KLVByb2Nlc3NfQnV0dG9uX0xpbmtNZXRob2RFbGVtZW50PUxpbmsgTWV0aG9kIEVsZW1lbnQuLi4KLVByb2Nlc3NfQnV0dG9uX0NsZWFyTWV0aG9kRWxlbWVudD1DbGVhcgotCi0jIyBFcnJvci9XYXJuaW5nCi1Qcm9jZXNzX0ludmFsaWROYW1lVGl0bGU9SW52YWxpZCBuYW1lCi1Qcm9jZXNzX0ludmFsaWROYW1lPUlVUEEwMDgxRTogVGhlIG5hbWUgY2Fubm90IGJlIGVtcHR5LiBQbGVhc2Ugc3BlY2lmeSBhIHZhbGlkIG5hbWUuCi1Qcm9jZXNzX1JlbmFtZV9UaXRsZT1SZW5hbWUKLVByb2Nlc3NfSW52YWxpZFByZXNlbnRhdGlvbk5hbWU9SVVQQTAwODJFOiBUaGUgcHJlc2VudGF0aW9uIG5hbWUgY2Fubm90IGJlIGVtcHR5LiBQbGVhc2Ugc3BlY2lmeSBhIHZhbGlkIHByZXNlbnRhdGlvbiBuYW1lLgotUHJvY2Vzc19MaW5rTWV0aG9kRWxlbWVudFRpdGxlPUxpbmsgTWV0aG9kIEVsZW1lbnQKLVByb2Nlc3NfSW52YWxpZExpbmtNZXRob2RFbGVtZW50PUlVUEEwMDgzRTogQ2Fubm90IGxpbmsgdG8gJyd7MH0nJyBzaW5jZSB0aGlzIE1ldGhvZEVsZW1lbnQgaXMgYWxyZWFkeSBiZWluZyB1c2VkIGZvciBhbm90aGVyIGRlc2NyaXB0b3IgdW5kZXIgdGhlIHNhbWUgcGFyZW50LgotUHJvY2Vzc19Bc3NpZ25tZW50SW5mb1RpdGxlPUluZm9ybWF0aW9uCi1Qcm9jZXNzX1RlYW1Bc3NpZ25FcnJvcj1JVVBBMDA4NEU6IENhbm5vdCBhZGQgJyd7MH0nJyB0byB0aGUgdGVhbSAnJ3sxfScnIFxuXG5Sb2xlIGRlc2NyaXB0b3IocykgbXVzdCBoYXZlIG1ldGhvZCBlbGVtZW50IHJvbGUgYXNzb2NpYXRlZCB3aXRoIGl0IHRvIGJlIGFzc2lnbmVkIHRvIHRlYW0uXG5cbiBGaXggdGhlIGFzc29jaWF0aW9uIGZpcnN0IGFuZCB0cnkgYWdhaW4uCi1Qcm9jZXNzX1RlYW1EaWFsb2dNZXNzYWdlPVNlbGVjdCB0ZWFtcwotUHJvY2Vzc19UZWFtRGlhbG9nVGl0bGU9VGVhbXMKLQotUHJvY2Vzc19EZWxpdmVyYWJsZUFzc2lnbkVycm9yPUlVUEEwMDg1RTogQ2Fubm90IGFkZCAnJ3swfScnIHRvIHRoZSBkZWxpdmVyYWJsZSAnJ3sxfScnIHNpbmNlIGl0IGRvZXMgbm90IGhhdmUgbWV0aG9kIGVsZW1lbnQgd29ya3Byb2R1Y3QgYXNzb2NpYXRlZCB3aXRoIGl0LgotUHJvY2Vzc19Db21wb3NpdGVSb2xlQXNzaWduRXJyb3I9SVVQQTAwODZFOiBDYW5ub3QgYWRkICAnJ3swfScnIHRvIHRoZSBDb21wb3NpdGUgcm9sZSAnJ3sxfScnIHNpbmNlIGl0IGRvZXMgbm90IGhhdmUgbWV0aG9kIGVsZW1lbnQgcm9sZSBhc3NvY2lhdGVkIHdpdGggaXQuCi1Qcm9jZXNzX3ByZWRlY2Vzc29yc192YWxpZE51bWJlck1lc3NhZ2U9SVVQQTAwODdXOiBQbGVhc2UgZW50ZXIgdmFsaWQgbnVtYmVyIGZvciBwcmVkZWNlc3NvcnMuCi1Qcm9jZXNzX3ByZWRlY2Vzc29yc192YWxpZE51bWJlclRpdGxlPUludmFsaWQgUHJlZGVjZXNzb3IgSWQKLQotUHJvY2Vzc19Ob0l0ZW1zPU5vIGl0ZW1zIHNlbGVjdGVkCi1Qcm9jZXNzX0l0ZW1zU2VsZWN0ZWQ9ezB9IGl0ZW1zIHNlbGVjdGVkCi1Qcm9jZXNzX05vUHJvcGVydGllc0F2YWlsYWJsZT1ObyBQcm9wZXJ0aWVzIGF2YWlsYWJsZQotCi1QcmVkZWNlc3NvckRpYWxvZ19UaXRsZT1QcmVkZWNlc3NvciBEZXBlbmRlbmN5Ci1QcmVkZWNlc3NvckRpYWxvZ19IZWFkZXJNZXNzYWdlPUVudGVyIGRlcGVuZGVuY3kgdHlwZSBmb3IgcHJlZGVjZXNzb3I6Ci1QcmVkZWNlc3NvckRpYWxvZ19JbmRleD1JbmRleDoKLVByZWRlY2Vzc29yRGlhbG9nX1ByZXNlbnRhdGlvbk5hbWU9UHJlc2VudGF0aW9uIE5hbWU6Ci1QcmVkZWNlc3NvckRpYWxvZ19EZXBlbmRlbmN5PURlcGVuZGVuY3k6Ci1QcmVkZWNlc3NvckRpYWxvZ19QcmVkZWNlc3NvckVycm9yRGlhbG9nVGl0bGU9UHJlZGVjZXNzb3IKLVByZWRlY2Vzc29yRGlhbG9nX1ByZWRlY2Vzc29yRXJyb3JNZXNzYWdlPUlVUEEwMDg4RTogUHJlZGVjZXNzb3Igd2l0aCB0aGF0IElkIGFscmVhZHkgZXhpc3RzIGZvciB0aGlzIHdvcmsgYnJlYWtkb3duIGVsZW1lbnQuCi0KLVByb2Nlc3NFZGl0b3JGb3JtUHJvcGVydGllc190ZXh0RWRpdENlbGxfcHJvYmxlbV9tc2c9SVVQQTAwOTBFOiBUaGVyZSB3YXMgYW4gZXJyb3IgZWRpdGluZyBhIHByb3BlcnR5LgotUHJvY2Vzc0VkaXRvckZvcm1Qcm9wZXJ0aWVzX2NlbGxFZGl0b3JfaW52YWxpZFByZWRjZXNzb3JfcHJvYmxlbV9tc2c9SVVQQTAwODlXOiBJbnZhbGlkIHByZWRlY2Vzc29yIGxpc3QKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9Sb2xlRGVzY3JpcHRvckdlbmVyYWxTZWN0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvUm9sZURlc2NyaXB0b3JHZW5lcmFsU2VjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZDE2YzdlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9Sb2xlRGVzY3JpcHRvckdlbmVyYWxTZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzOwotCi1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5kaWFsb2dzLkl0ZW1zRmlsdGVyRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZmlsdGVycy5Qcm9jZXNzUm9sZUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklBY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuRmlsdGVyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kLkxpbmtNZXRob2RFbGVtZW50Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5MaWJyYXJ5VUlUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29tcG9zaXRlUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLQotCi0vKioKLSAqIFRoZSBnZW5lcmFsIHRhYiBzZWN0aW9uIGZvciBSb2xlIERlc2NyaXB0b3IKLSAqIAotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjAKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgUm9sZURlc2NyaXB0b3JHZW5lcmFsU2VjdGlvbiBleHRlbmRzIERlc2NyaXB0b3JHZW5lcmFsU2VjdGlvbiB7Ci0JcHJvdGVjdGVkIFJvbGVEZXNjcmlwdG9yIGVsZW1lbnQ7Ci0KLQlwcml2YXRlIExhYmVsIGN0cmxfbWV0aG9kX2VsZW1lbnRfbGFiZWw7Ci0KLQlwcml2YXRlIFRleHQgY3RybF9tZXRob2RfZWxlbWVudDsKLQotCXByaXZhdGUgQnV0dG9uIGxpbmtCdXR0b247Ci0JCi0JcHJpdmF0ZSBCdXR0b24gY2xlYXJCdXR0b247Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuRGVzY3JpcHRvckdlbmVyYWxTZWN0aW9uI2luaXQoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXQoKSB7Ci0JCXN1cGVyLmluaXQoKTsKLQkJLy8gZ2V0IFJvbGVEZXNjcmlwdG9yIG9iamVjdAotCQllbGVtZW50ID0gKFJvbGVEZXNjcmlwdG9yKSBnZXRFbGVtZW50KCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLkRlc2NyaXB0b3JHZW5lcmFsU2VjdGlvbiNjcmVhdGVHZW5lcmFsU2VjdGlvbihvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlR2VuZXJhbFNlY3Rpb24oQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotCQlzdXBlci5jcmVhdGVHZW5lcmFsU2VjdGlvbihjb21wb3NpdGUpOwotCi0JCS8vIG1ldGhvZCBlbGVtZW50Ci0JCWN0cmxfbWV0aG9kX2VsZW1lbnRfbGFiZWwgPSBGb3JtVUkuY3JlYXRlTGFiZWwodG9vbGtpdCwKLQkJCQlnZW5lcmFsQ29tcG9zaXRlLCBQcm9wZXJ0aWVzUmVzb3VyY2VzLlByb2Nlc3NfVHlwZV9Sb2xlKTsgCi0KLQkJY3RybF9tZXRob2RfZWxlbWVudCA9IEZvcm1VSS5jcmVhdGVUZXh0KHRvb2xraXQsIGdlbmVyYWxDb21wb3NpdGUsCi0JCQkJU1dULkRFRkFVTFQsIDEpOwotCQljdHJsX21ldGhvZF9lbGVtZW50LnNldFRleHQoZ2V0TWV0aG9kRWxlbWVudE5hbWUoZWxlbWVudCkpOwotCQljdHJsX21ldGhvZF9lbGVtZW50LnNldEVuYWJsZWQoZmFsc2UpOwotCi0JCUNvbXBvc2l0ZSBidXR0b25Db21wb3NpdGUgPSBGb3JtVUkuY3JlYXRlQ29tcG9zaXRlKHRvb2xraXQsCi0JCQkJZ2VuZXJhbENvbXBvc2l0ZSwgU1dULk5PTkUsIDIsIHRydWUpOwotCQlsaW5rQnV0dG9uID0gRm9ybVVJLmNyZWF0ZUJ1dHRvbih0b29sa2l0LCBidXR0b25Db21wb3NpdGUsIFNXVC5QVVNILCAxKTsKLQkJbGlua0J1dHRvbgotCQkJCS5zZXRUZXh0KFByb3BlcnRpZXNSZXNvdXJjZXMuUHJvY2Vzc19CdXR0b25fTGlua01ldGhvZEVsZW1lbnQpOyAKLQotCQljbGVhckJ1dHRvbiA9IEZvcm1VSS5jcmVhdGVCdXR0b24odG9vbGtpdCwgYnV0dG9uQ29tcG9zaXRlLCBTV1QuUFVTSCwgMSk7Ci0JCWNsZWFyQnV0dG9uCi0JCQkJLnNldFRleHQoUHJvcGVydGllc1Jlc291cmNlcy5Qcm9jZXNzX0J1dHRvbl9DbGVhck1ldGhvZEVsZW1lbnQpOyAKLQotCQkvLyBzaG93L2hpZGUgbWV0aG9kIHJvbGUKLQkJdG9nZ2xlTWV0aG9kUm9sZSgpOwotCX0KLQotCXByaXZhdGUgdm9pZCB0b2dnbGVNZXRob2RSb2xlKCkgewotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIENvbXBvc2l0ZVJvbGUpIHsKLQkJCWN0cmxfbWV0aG9kX2VsZW1lbnRfbGFiZWwuc2V0VmlzaWJsZShmYWxzZSk7Ci0JCQljdHJsX21ldGhvZF9lbGVtZW50LnNldFZpc2libGUoZmFsc2UpOwotCQkJbGlua0J1dHRvbi5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJCWNsZWFyQnV0dG9uLnNldFZpc2libGUoZmFsc2UpOwotCQl9IGVsc2UgewotCQkJY3RybF9tZXRob2RfZWxlbWVudF9sYWJlbC5zZXRWaXNpYmxlKHRydWUpOwotCQkJY3RybF9tZXRob2RfZWxlbWVudC5zZXRWaXNpYmxlKHRydWUpOwotCQkJbGlua0J1dHRvbi5zZXRWaXNpYmxlKHRydWUpOwotCQkJY2xlYXJCdXR0b24uc2V0VmlzaWJsZSh0cnVlKTsKLQkJfQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5EZXNjcmlwdG9yR2VuZXJhbFNlY3Rpb24jYWRkTGlzdGVuZXJzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRMaXN0ZW5lcnMoKSB7Ci0JCXN1cGVyLmFkZExpc3RlbmVycygpOwotCi0JCWxpbmtCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJSUZpbHRlciBmaWx0ZXIgPSBuZXcgUHJvY2Vzc1JvbGVGaWx0ZXIoCi0JCQkJCQlnZXRDb25maWd1cmF0aW9uKCksIG51bGwsIEZpbHRlckNvbnN0YW50cy5ST0xFUyk7Ci0JCQkJTGlzdCBleGlzdGluZ0VsZW1lbnRzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCWlmIChlbGVtZW50LmdldFJvbGUoKSAhPSBudWxsKSB7Ci0JCQkJCWV4aXN0aW5nRWxlbWVudHMuYWRkKGVsZW1lbnQuZ2V0Um9sZSgpKTsKLQkJCQl9Ci0JCQkJSXRlbXNGaWx0ZXJEaWFsb2cgZmQgPSBuZXcgSXRlbXNGaWx0ZXJEaWFsb2coUGxhdGZvcm1VSQotCQkJCQkJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldFNoZWxsKCksCi0JCQkJCQlmaWx0ZXIsIGVsZW1lbnQsIEZpbHRlckNvbnN0YW50cy5ST0xFUywKLQkJCQkJCWV4aXN0aW5nRWxlbWVudHMpOwotCi0JCQkJZmQuc2V0QmxvY2tPbk9wZW4odHJ1ZSk7Ci0JCQkJZmQuc2V0Vmlld2VyU2VsZWN0aW9uU2luZ2xlKHRydWUpOwotCQkJCWZkLnNldFRpdGxlKEZpbHRlckNvbnN0YW50cy5ST0xFUyk7Ci0JCQkJZmQub3BlbigpOwotCQkJCXNldE1ldGhvZEVsZW1lbnQoZmQuZ2V0U2VsZWN0ZWRJdGVtcygpKTsKLQotCQkJCS8vIHVwZGF0ZSBtZXRob2QgZWxlbWVudCBjb250cm9sCi0JCQkJY3RybF9tZXRob2RfZWxlbWVudC5zZXRUZXh0KGdldE1ldGhvZEVsZW1lbnROYW1lKGVsZW1lbnQpKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUxKSB7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJY2xlYXJCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlNFVCwgZWxlbWVudCwKLQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCS5nZXRSb2xlRGVzY3JpcHRvcl9Sb2xlKCksCi0JCQkJCQludWxsLCAtMSk7Ci0JCQkJLy8gdXBkYXRlIG1ldGhvZCBlbGVtZW50IGNvbnRyb2wKLQkJCQljdHJsX21ldGhvZF9lbGVtZW50LnNldFRleHQoZ2V0TWV0aG9kRWxlbWVudE5hbWUoZWxlbWVudCkpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZTEpIHsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldE1ldGhvZEVsZW1lbnQoTGlzdCBpdGVtcykgewotCQlpZiAoKGl0ZW1zICE9IG51bGwpICYmIChpdGVtcy5zaXplKCkgPj0gMSkpIHsKLQkJCWlmIChpdGVtcy5nZXQoMCkgaW5zdGFuY2VvZiBSb2xlKSB7Ci0JCQkJUm9sZSByb2xlID0gKFJvbGUpIGl0ZW1zLmdldCgwKTsKLQotLy8JCQkJTGlzdCBsaXN0ID0gUHJvY2Vzc1V0aWwKLS8vCQkJCQkJLmdldFNpYmxpbmdzKFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0vLwkJCQkJCQkJLmdldE9CU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCksIGdldEFkYXB0ZXIoKSwKLS8vCQkJCQkJCQllbGVtZW50KTsKLQkJCQlib29sZWFuIGNhbkFzc2lnbiA9IHRydWU7Ci0vLwkJCQlmb3IgKEl0ZXJhdG9yIGl0b3IgPSBsaXN0Lml0ZXJhdG9yKCk7IGl0b3IuaGFzTmV4dCgpOykgewotLy8JCQkJCU9iamVjdCBvYmogPSBpdG9yLm5leHQoKTsKLS8vCQkJCQlpZiAob2JqIGluc3RhbmNlb2YgUm9sZURlc2NyaXB0b3IpIHsKLS8vCQkJCQkJUm9sZURlc2NyaXB0b3Igcm9sZURlc2MgPSAoUm9sZURlc2NyaXB0b3IpIG9iajsKLS8vCQkJCQkJaWYgKCghcm9sZURlc2MuZXF1YWxzKGVsZW1lbnQpKQotLy8JCQkJCQkJCSYmICghcm9sZURlc2MuZ2V0U3VwcHJlc3NlZCgpLmJvb2xlYW5WYWx1ZSgpKSkgewotLy8JCQkJCQkJUm9sZSBleGlzaW5nUm9sZSA9IHJvbGVEZXNjLmdldFJvbGUoKTsKLS8vCQkJCQkJCWlmIChyb2xlLmVxdWFscyhleGlzaW5nUm9sZSkpIHsKLS8vCQkJCQkJCQljYW5Bc3NpZ24gPSBmYWxzZTsKLS8vCQkJCQkJCQlicmVhazsKLS8vCQkJCQkJCX0KLS8vCQkJCQkJfQotLy8JCQkJCX0KLS8vCQkJCX0KLQkJCQlpZiAoY2FuQXNzaWduKSB7Ci0JCQkJCUxpbmtNZXRob2RFbGVtZW50Q29tbWFuZCBjbWQgPSBuZXcgTGlua01ldGhvZEVsZW1lbnRDb21tYW5kKAotCQkJCQkJCWVsZW1lbnQsIHJvbGUsIFVtYVBhY2thZ2UuUk9MRV9ERVNDUklQVE9SX19ST0xFKTsKLQkJCQkJYWN0aW9uTWdyLmV4ZWN1dGUoY21kKTsKLQotCQkJCQkvLyBzZXQgc2VsZWN0aW9uIHRvIHNhbWUgZWxlbWVudCB0byBlbmFibGUgY29ycmVjdCBhY3Rpb25zCi0JCQkJCWdldEVkaXRvcigpLnNldFNlbGVjdGlvbihnZXRTZWxlY3Rpb24oKSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJTWVzc2FnZUZvcm1hdCBtZiA9IG5ldyBNZXNzYWdlRm9ybWF0KFByb3BlcnRpZXNSZXNvdXJjZXMuUHJvY2Vzc19JbnZhbGlkTGlua01ldGhvZEVsZW1lbnQpOyAKLQkJCQkJT2JqZWN0W10gYXJncyA9IHsgcm9sZS5nZXROYW1lKCkgfTsKLQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4KLQkJCQkJCQkuZ2V0RGVmYXVsdCgpCi0JCQkJCQkJLmdldE1zZ0RpYWxvZygpCi0JCQkJCQkJLmRpc3BsYXlJbmZvKAotCQkJCQkJCQkJUHJvcGVydGllc1Jlc291cmNlcy5Qcm9jZXNzX0xpbmtNZXRob2RFbGVtZW50VGl0bGUsIG1mLmZvcm1hdChhcmdzKSk7IAotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldE1ldGhvZEVsZW1lbnROYW1lKFJvbGVEZXNjcmlwdG9yIGVsZW1lbnQpIHsKLQkJU3RyaW5nIHN0ciA9IFByb3BlcnRpZXNSZXNvdXJjZXMuUHJvY2Vzc19Ob25lOyAKLQkJaWYgKGVsZW1lbnQuZ2V0Um9sZSgpICE9IG51bGwpIHsKLQkJCXN0ciA9IGVsZW1lbnQuZ2V0Um9sZSgpLmdldE5hbWUoKTsKLQkJfQotCi0JCXJldHVybiBzdHI7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLkRlc2NyaXB0b3JHZW5lcmFsU2VjdGlvbiN1cGRhdGVDb250cm9scygpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlQ29udHJvbHMoKSB7Ci0JCXN1cGVyLnVwZGF0ZUNvbnRyb2xzKCk7Ci0KLQkJbGlua0J1dHRvbi5zZXRFbmFibGVkKGVkaXRhYmxlKTsKLQkJY2xlYXJCdXR0b24uc2V0RW5hYmxlZChlZGl0YWJsZSk7Ci0JCU9iamVjdCBvYmogPSBnZXRFbGVtZW50KCk7Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBSb2xlRGVzY3JpcHRvcikgewotCQkJUm9sZURlc2NyaXB0b3Igcm9sZURlc2MgPSAoUm9sZURlc2NyaXB0b3IpIG9iajsKLQkJCWlmICgocm9sZURlc2MuZ2V0U3VwZXJBY3Rpdml0aWVzKCkgPT0gbnVsbCkKLQkJCQkJfHwgKHJvbGVEZXNjLmdldFN1cGVyQWN0aXZpdGllcygpID09IG51bGwpKSB7Ci0JCQkJbmFtZVRleHQuc2V0RWRpdGFibGUodHJ1ZSk7Ci0JCQkJcHJlc2VudGF0aW9uTmFtZVRleHQuc2V0RWRpdGFibGUodHJ1ZSk7Ci0JCQl9IGVsc2UgewotCQkJCW5hbWVUZXh0LnNldEVkaXRhYmxlKGVkaXRhYmxlKTsKLQkJCQlwcmVzZW50YXRpb25OYW1lVGV4dC5zZXRFZGl0YWJsZShlZGl0YWJsZSk7Ci0JCQl9Ci0JCX0KLQotCX0KLQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLkRlc2NyaXB0b3JHZW5lcmFsU2VjdGlvbiNyZWZyZXNoKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWZyZXNoKCkgewotCQl0cnkgewotCQkJc3VwZXIucmVmcmVzaCgpOwotCi0JCQlpZiAoZ2V0RWxlbWVudCgpIGluc3RhbmNlb2YgUm9sZURlc2NyaXB0b3IpIHsKLQkJCQllbGVtZW50ID0gKFJvbGVEZXNjcmlwdG9yKSBnZXRFbGVtZW50KCk7Ci0JCQkJY3RybF9tZXRob2RfZWxlbWVudC5zZXRUZXh0KGdldE1ldGhvZEVsZW1lbnROYW1lKGVsZW1lbnQpKTsKLQotCQkJCS8vIHNob3cvaGlkZSBtZXRob2Qgcm9sZQotCQkJCXRvZ2dsZU1ldGhvZFJvbGUoKTsKLQotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCWxvZ2dlci5sb2dFcnJvcigKLQkJCQkJIkVycm9yIHJlZnJlc2hpbmcgUm9sZURlc2NyaXB0b3IgZ2VuZXJhbCBzZWN0aW9uOiAiLCBleCk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5EZXNjcmlwdG9yR2VuZXJhbFNlY3Rpb24jZ2V0TmFtZVByZWZpeCgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lUHJlZml4KCkgewotCQlpZiAoZ2V0RWxlbWVudCgpIGluc3RhbmNlb2YgQ29tcG9zaXRlUm9sZSkgewotCQkJcmV0dXJuIExpYnJhcnlVSVRleHQuVEVYVF9DT01QT1NJVEVfUk9MRSArICI6ICI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gTGlicmFyeVVJVGV4dC5URVhUX1JPTEVfREVTQ1JJUFRPUiArICI6ICI7IC8vJE5PTi1OTFMtMSQKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvUm9sZURlc2NyaXB0b3JUZWFtU2VjdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL1JvbGVEZXNjcmlwdG9yVGVhbVNlY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzM3YjQwNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvUm9sZURlc2NyaXB0b3JUZWFtU2VjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllczsKLQotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS51dGlsLk1zZ0RpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JQWN0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuUm9sZURlc2NyaXB0b3JXcmFwcGVySXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Qcm9jZXNzVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbXBvc2l0ZVJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZWFtUHJvZmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuTGlzdFNlbGVjdGlvbkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5UYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZTsKLQotCi0vKioKLSAqIFRoZSBSb2xlIGRlc2NyaXB0b3IgLSB0ZWFtIHByb2ZpbGUgc2VjdGlvbgotICogCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMAotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBSb2xlRGVzY3JpcHRvclRlYW1TZWN0aW9uIGV4dGVuZHMgT0JTUmVsYXRpb25TZWN0aW9uIHsKLQlwcml2YXRlIEltYWdlIHRpdGxlSW1hZ2UgPSBudWxsOwotCi0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5PQlNSZWxhdGlvblNlY3Rpb24jY3JlYXRlQ29udHJvbHMob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlLCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5UYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9scyhDb21wb3NpdGUgcGFyZW50LAotCQkJVGFiYmVkUHJvcGVydHlTaGVldFBhZ2UgdGFiYmVkUHJvcGVydHlTaGVldFBhZ2UpIHsKLQkJc3VwZXIuY3JlYXRlQ29udHJvbHMocGFyZW50LCB0YWJiZWRQcm9wZXJ0eVNoZWV0UGFnZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuT0JTUmVsYXRpb25TZWN0aW9uI2luaXRDb250ZW50UHJvdmlkZXIoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRDb250ZW50UHJvdmlkZXIoKSB7Ci0JCWNvbnRlbnRQcm92aWRlciA9IG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcigKLQkJCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkJLmdldE5hdmlnYXRvclZpZXdfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKSB7Ci0JCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IG9iamVjdCkgewotCQkJCXJldHVybiBnZXRTZWxlY3RlZFRlYW1zKGVsZW1lbnQpLnRvQXJyYXkoKTsKLQkJCX0KLQkJfTsKLQotCQl2aWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKGNvbnRlbnRQcm92aWRlcik7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuT0JTUmVsYXRpb25TZWN0aW9uI2luaXQoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXQoKSB7Ci0JCXN1cGVyLmluaXQoKTsKLQkJZWxlbWVudCA9IChSb2xlRGVzY3JpcHRvcikgZWxlbWVudDsKLQotCQkKLQkJc2V0VGFiRGF0YShQcm9wZXJ0aWVzUmVzb3VyY2VzLlJvbGVEZXNjcmlwdG9yX1RlYW1fU2VjdGlvblRpdGxlLCAKLQkJCQlQcm9wZXJ0aWVzUmVzb3VyY2VzLlJvbGVEZXNjcmlwdG9yX1RlYW1fU2VjdGlvbkRlc2NyaXB0aW9uLAotCQkJCVByb3BlcnRpZXNSZXNvdXJjZXMuUm9sZURlc2NyaXB0b3JfVGVhbV9UYWJsZTEpOyAKLQl9Ci0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5PQlNSZWxhdGlvblNlY3Rpb24jcmVmcmVzaCgpCi0JICovCi0JcHVibGljIHZvaWQgcmVmcmVzaCgpIHsKLQkJdHJ5IHsKLQkJCWlmIChnZXRFbGVtZW50KCkgaW5zdGFuY2VvZiBSb2xlRGVzY3JpcHRvcikgewotCQkJCXN1cGVyLnJlZnJlc2goKTsKLQotCQkJCWVsZW1lbnQgPSAoUm9sZURlc2NyaXB0b3IpIGdldEVsZW1lbnQoKTsKLQkJCQl2aWV3ZXIucmVmcmVzaCgpOwotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCWxvZ2dlci5sb2dFcnJvcigKLQkJCQkJIkVycm9yIHJlZnJlc2hpbmcgUm9sZSBEZXNjcmlwdG9yIHRlYW0gc2VjdGlvbiAiLCBleCk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBhZGQoT2JqZWN0W10gaXRlbXMpIHsKLQkJLy8gdXBkYXRlIHRoZSBtb2RlbAotCQlpZiAoaXRlbXMgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykgewotCQkJCVRlYW1Qcm9maWxlIHRlYW0gPSAoVGVhbVByb2ZpbGUpIGl0ZW1zW2ldOwotCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgQ29tcG9zaXRlUm9sZSkgewotCQkJCQlDb21wb3NpdGVSb2xlIGNvbXBSb2xlID0gUHJvY2Vzc1V0aWwKLQkJCQkJCQkuY3JlYXRlQ29tcG9zaXRlUm9sZSgoQ29tcG9zaXRlUm9sZSkgZWxlbWVudCk7Ci0JCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5BREQsIHRlYW0sCi0JCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGVhbVByb2ZpbGVfVGVhbVJvbGVzKCksCi0JCQkJCQkJY29tcFJvbGUsIC0xKTsKLQkJCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBSb2xlRGVzY3JpcHRvcikgewotCQkJCQlSb2xlIHJvbGUgPSAoKFJvbGVEZXNjcmlwdG9yKSBlbGVtZW50KS5nZXRSb2xlKCk7Ci0JCQkJCWlmIChyb2xlICE9IG51bGwpIHsKLQkJCQkJCWlmICghaXNQYXJ0T2ZUZWFtKHJvbGUsIHRlYW0pKSB7Ci0JCQkJCQkJUm9sZURlc2NyaXB0b3Igcm9sZURlc2MgPSBQcm9jZXNzVXRpbAotCQkJCQkJCQkJLmNyZWF0ZVJvbGVEZXNjcmlwdG9yKHJvbGUpOwotCQkJCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5BREQsIHRlYW0sCi0JCQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJCQkuZ2V0VGVhbVByb2ZpbGVfVGVhbVJvbGVzKCksCi0JCQkJCQkJCQlyb2xlRGVzYywgLTEpOwotCQkJCQkJfQotCQkJCQl9IGVsc2UgewotCQkJCQkJTWVzc2FnZUZvcm1hdCBtZiA9IG5ldyBNZXNzYWdlRm9ybWF0KAotCQkJCQkJCQlQcm9wZXJ0aWVzUmVzb3VyY2VzLlByb2Nlc3NfVGVhbUFzc2lnbkVycm9yKTsgCi0JCQkJCQlPYmplY3RbXSBhcmdzID0geyBlbGVtZW50LmdldE5hbWUoKSwgdGVhbS5nZXROYW1lKCkgfTsKLQkJCQkJCVN0cmluZyBtZXNzYWdlID0gbWYuZm9ybWF0KGFyZ3MpOwotCQkJCQkJU3RyaW5nIHRpdGxlID0gZ2V0RWRpdG9yKCkuZ2V0VGl0bGUoKTsKLQkJCQkJCU1zZ0RpYWxvZyBkaWFsb2cgPSBBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCQkJCQkJLmdldE1zZ0RpYWxvZygpOwotCQkJCQkJZGlhbG9nLmRpc3BsYXlFcnJvcih0aXRsZSwgbWVzc2FnZSwgIiIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQlyZXR1cm47Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLkFERCwgdGVhbSwKLQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRlYW1Qcm9maWxlX1RlYW1Sb2xlcygpLAotCQkJCQkJZWxlbWVudCwgLTEpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuT0JTUmVsYXRpb25TZWN0aW9uI3JlbW92ZShqYXZhLnV0aWwuQXJyYXlMaXN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbW92ZShBcnJheUxpc3Qgcm1JdGVtcykgewotCQkvLyB1cGRhdGUgdGhlIG1vZGVsCi0JCWlmICghcm1JdGVtcy5pc0VtcHR5KCkpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRvciA9IHJtSXRlbXMuaXRlcmF0b3IoKTsgaXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJVGVhbVByb2ZpbGUgdGVhbSA9IChUZWFtUHJvZmlsZSkgaXRvci5uZXh0KCk7Ci0JCQkJUm9sZSByb2xlID0gKChSb2xlRGVzY3JpcHRvcikgZWxlbWVudCkuZ2V0Um9sZSgpOwotCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5SRU1PVkUsIHRlYW0sCi0JCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUZWFtUHJvZmlsZV9UZWFtUm9sZXMoKSwKLQkJCQkJCWVsZW1lbnQsIC0xKTsKLQotCQkJCS8vIEdldCB0aGUgbGlzdCBvZiByb2xlRGVzY3JpcHRvcnMgZnJvbSB0ZWFtIHByb2ZpbGUgd2hpY2gKLQkJCQkvLyBoYXMgc2FtZSByb2xlIG9yaWdpbmFsIHJvbGUgZGVzY3JpcHRvcgotCQkJCUxpc3QgdGVhbVJvbGVzID0gdGVhbS5nZXRUZWFtUm9sZXMoKTsKLQkJCQlMaXN0IHJvbGVEZXNjTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHRlYW1Sb2xlcy5zaXplKCk7IGkrKykgewotCQkJCQlSb2xlRGVzY3JpcHRvciByb2xlRGVzYyA9IChSb2xlRGVzY3JpcHRvcikgdGVhbVJvbGVzLmdldChpKTsKLQotCQkJCQlpZiAocm9sZURlc2MuZ2V0Um9sZSgpLmVxdWFscyhyb2xlKSkKLQkJCQkJewotCQkJCQkJcm9sZURlc2NMaXN0LmFkZChyb2xlRGVzYyk7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQkvLyBpZiByb2xlRGVzY3JpcG9yIGp1c3QgaGFzIG9uZSBlbGVtZW50LCBkZWxldGUgdGhhdCBvbmUgdG9vLgotCQkJCS8vIHNpbmNlIHRoYXQgd291bGQgYmUgdGhlIGxhc3Qgb25lCi0JCQkJaWYgKHJvbGVEZXNjTGlzdC5zaXplKCkgPT0gMSkgewotCQkJCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuUkVNT1ZFLCB0ZWFtLAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRlYW1Qcm9maWxlX1RlYW1Sb2xlcygpLAotCQkJCQkJCShSb2xlRGVzY3JpcHRvcikgcm9sZURlc2NMaXN0LmdldCgwKSwgLTEpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkKLQkKLQlwcml2YXRlIGJvb2xlYW4gaXNQYXJ0T2ZUZWFtKFJvbGUgcm9sZSwgVGVhbVByb2ZpbGUgdGVhbSkgewotCQlMaXN0IHRlYW1Sb2xlcyA9IHRlYW0uZ2V0VGVhbVJvbGVzKCk7Ci0JCUxpc3Qgcm9sZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRvciA9IHRlYW1Sb2xlcy5pdGVyYXRvcigpOyBpdG9yLmhhc05leHQoKTspIHsKLQkJCVJvbGVEZXNjcmlwdG9yIHJvbGVEZXNjID0gKFJvbGVEZXNjcmlwdG9yKSBpdG9yLm5leHQoKTsKLQkJCXJvbGVzLmFkZChyb2xlRGVzYy5nZXRSb2xlKCkpOwotCQl9Ci0KLQkJaWYgKHJvbGVzLmNvbnRhaW5zKHJvbGUpKQotCQkJcmV0dXJuIHRydWU7Ci0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLk9CU1JlbGF0aW9uU2VjdGlvbiNvcGVuQWRkRGlhbG9nKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBvcGVuQWRkRGlhbG9nKCkgewotCQlJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciB0ZWFtQ29udGVudFByb3ZpZGVyID0gbmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKAotCQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpIHsKLQkJCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJTGlzdCBpdGVtcyA9IGdldFRlYW1zKCk7Ci0JCQkJaXRlbXMucmVtb3ZlQWxsKGdldFNlbGVjdGVkVGVhbXMoZWxlbWVudCkpOwotCQkJCXJldHVybiBpdGVtcy50b0FycmF5KCk7Ci0JCQl9Ci0JCX07Ci0KLQkJSUxhYmVsUHJvdmlkZXIgdGVhbUxhYmVsUHJvdmlkZXIgPSBuZXcgQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyKAotCQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFLmdldE9CU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpOwotCi0JCUxpc3RTZWxlY3Rpb25EaWFsb2cgZGxnID0gbmV3IExpc3RTZWxlY3Rpb25EaWFsb2coUGxhdGZvcm1VSQotCQkJCS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRTaGVsbCgpLCBlbGVtZW50LAotCQkJCXRlYW1Db250ZW50UHJvdmlkZXIsIHRlYW1MYWJlbFByb3ZpZGVyLCBQcm9wZXJ0aWVzUmVzb3VyY2VzLlByb2Nlc3NfVGVhbURpYWxvZ01lc3NhZ2UpOyAKLQkJdGl0bGVJbWFnZSA9IERpc3BsYXkuZ2V0Q3VycmVudCgpLmdldEFjdGl2ZVNoZWxsKCkuZ2V0SW1hZ2UoKTsKLQkJTGlzdFNlbGVjdGlvbkRpYWxvZy5zZXREZWZhdWx0SW1hZ2UodGl0bGVJbWFnZSk7Ci0KLQkJZGxnLnNldFRpdGxlKFByb3BlcnRpZXNSZXNvdXJjZXMuUHJvY2Vzc19UZWFtRGlhbG9nVGl0bGUpOyAKLQkJZGxnLnNldEJsb2NrT25PcGVuKHRydWUpOwotCQlkbGcub3BlbigpOwotCQlhZGQoZGxnLmdldFJlc3VsdCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlzdXBlci5kaXNwb3NlKCk7Ci0KLQkJaWYgKGNvbnRlbnRQcm92aWRlciAhPSBudWxsKSB7Ci0JCQljb250ZW50UHJvdmlkZXIuZGlzcG9zZSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogR2V0IHBhcmVudAotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogQHJldHVybgotCSAqIAkJUGFyZW50IG9mIHRoZSBlbGVtZW50Ci0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBnZXRQYXJlbnQoQnJlYWtkb3duRWxlbWVudCBlbGVtZW50KSB7Ci0JCUFkYXB0ZXJGYWN0b3J5IGFGYWN0b3J5ID0gVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkuZ2V0T0JTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKTsKLQkJSXRlbVByb3ZpZGVyQWRhcHRlciBhZGFwdGVyID0gKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIGFGYWN0b3J5LmFkYXB0KAotCQkJCWVsZW1lbnQsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCU9iamVjdCBwYXJlbnQgPSBhZGFwdGVyLmdldFBhcmVudChlbGVtZW50KTsKLQotCQlyZXR1cm4gcGFyZW50OwotCX0KLQotCS8qKgotCSAqIEdldCBUZWFtcyBmcm9tIHBhcmVudAotCSAqIAotCSAqIEByZXR1cm4KLQkgKiAJCQlMaXN0IG9mIHRlYW1zCi0JICovCi0JcHJpdmF0ZSBMaXN0IGdldFRlYW1zKCkgewotCQlBcnJheUxpc3QgaXRlbXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCU9iamVjdCBwYXJlbnQgPSBnZXRQYXJlbnQoZWxlbWVudCk7Ci0JCXdoaWxlIChwYXJlbnQgIT0gbnVsbCkgewotCQkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJQWN0aXZpdHkgYWN0ID0gKEFjdGl2aXR5KSBwYXJlbnQ7Ci0JCQkJTGlzdCBicmVha2Rvd25FbGVtZW50cyA9IGFjdC5nZXRCcmVha2Rvd25FbGVtZW50cygpOwotCQkJCWZvciAoSXRlcmF0b3IgaXQgPSBicmVha2Rvd25FbGVtZW50cy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJCUJyZWFrZG93bkVsZW1lbnQgZWxlbWVudCA9IChCcmVha2Rvd25FbGVtZW50KSBpdC5uZXh0KCk7Ci0JCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgVGVhbVByb2ZpbGUpIHsKLQkJCQkJCVRlYW1Qcm9maWxlIHRlYW0gPSAoVGVhbVByb2ZpbGUpIGVsZW1lbnQ7Ci0JCQkJCQlpdGVtcy5hZGQodGVhbSk7Ci0JCQkJCQkvLyBhZGQgYW55IHN1YiB0ZWFtcyBpZiB0aGVyZQotCQkJCQkJTGlzdCBzdWJUZWFtcyA9IHRlYW0uZ2V0U3ViVGVhbSgpOwotCQkJCQkJaXRlbXMuYWRkQWxsKHN1YlRlYW1zKTsKLQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQlwYXJlbnQgPSBnZXRQYXJlbnQoKEJyZWFrZG93bkVsZW1lbnQpIHBhcmVudCk7Ci0JCX0KLQotCQlyZXR1cm4gaXRlbXM7Ci0JfQotCi0JLyoqCi0JICogR2V0IHNlbGVjdGVkIHRlYW1zIGZvciB0aGF0IHJvbGUgZGVzY3JpcHRvcgotCSAqIAotCSAqIEBwYXJhbSBvYmplY3QKLQkgKiBAcmV0dXJuCi0JICogCQlMaXN0IG9mIHNlbGVjdGVkIHRlYW0gCi0JICovCi0JcHJpdmF0ZSBMaXN0IGdldFNlbGVjdGVkVGVhbXMoRU9iamVjdCBvYmplY3QpIHsKLQkJT2JqZWN0IGlucHV0ID0gZ2V0SW5wdXQoKTsKLQkJCi0JCWlmIChpbnB1dCBpbnN0YW5jZW9mIFJvbGVEZXNjcmlwdG9yV3JhcHBlckl0ZW1Qcm92aWRlcikgewotCQkJcmV0dXJuIFByb2Nlc3NVdGlsCi0JCQkJCS5nZXRUZWFtUHJvZmlsZXMoKFJvbGVEZXNjcmlwdG9yV3JhcHBlckl0ZW1Qcm92aWRlcikgaW5wdXQpOwotCQl9IGVsc2UgewotCQkJUm9sZURlc2NyaXB0b3Igcm9sZURlc2MgPSAoUm9sZURlc2NyaXB0b3IpIG9iamVjdDsKLQkJCXJldHVybiBQcm9jZXNzVXRpbC5nZXRUZWFtUHJvZmlsZXMocm9sZURlc2MsIGdldEFkYXB0ZXJGYWN0b3J5KCkpOwotCQl9Ci0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL1JvbGVEZXNjcmlwdG9yV29ya1Byb2R1Y3RTZWN0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvUm9sZURlc2NyaXB0b3JXb3JrUHJvZHVjdFNlY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDE1ZmVhNS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvUm9sZURlc2NyaXB0b3JXb3JrUHJvZHVjdFNlY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZmlsdGVycy5EZXNjcmlwdG9yUHJvY2Vzc0ZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZpbHRlcnMuUHJvY2Vzc1dvcmtQcm9kdWN0RmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JQWN0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLkZpbHRlckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZC5Bc3NpZ25XUFRvUm9sZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQuSUFjdGlvblR5cGVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlByb2Nlc3NVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5UYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZTsKLQotCi0vKioKLSAqIFJvbGUgRGVzY3JpcHRvciAtIHdvcmsgcHJvZHVjdCBzZWN0aW9uCi0gKiAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4wCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFJvbGVEZXNjcmlwdG9yV29ya1Byb2R1Y3RTZWN0aW9uIGV4dGVuZHMgUmVsYXRpb25TZWN0aW9uIHsKLQlwcml2YXRlIElGaWx0ZXIgZmlsdGVyID0gbnVsbDsKLQotCS8qKgotCSAqIEdldCBwcm9jZXNzIHdvcmsgcHJvZHVjdCBmaWx0ZXIKLQkgKi8KLQlwdWJsaWMgSUZpbHRlciBnZXRGaWx0ZXIoKSB7Ci0JCWlmIChmaWx0ZXIgPT0gbnVsbCkgewotCQkJZmlsdGVyID0gbmV3IFByb2Nlc3NXb3JrUHJvZHVjdEZpbHRlcihnZXRDb25maWd1cmF0aW9uKCksCi0JCQkJCW51bGwsIEZpbHRlckNvbnN0YW50cy5XT1JLUFJPRFVDVFMpOwotCQl9Ci0JCXJldHVybiBmaWx0ZXI7Ci0JfQotCi0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5SZWxhdGlvblNlY3Rpb24jY3JlYXRlQ29udHJvbHMob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlLCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5UYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9scyhDb21wb3NpdGUgcGFyZW50LAotCQkJVGFiYmVkUHJvcGVydHlTaGVldFBhZ2UgdGFiYmVkUHJvcGVydHlTaGVldFBhZ2UpIHsKLQotCQlzdXBlci5jcmVhdGVDb250cm9scyhwYXJlbnQsIHRhYmJlZFByb3BlcnR5U2hlZXRQYWdlKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5SZWxhdGlvblNlY3Rpb24jaW5pdENvbnRlbnRQcm92aWRlcjEoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRDb250ZW50UHJvdmlkZXIxKCkgewotCQljb250ZW50UHJvdmlkZXIgPSBuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoZ2V0QWRhcHRlckZhY3RvcnkoKSkgewotCQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gZ2V0RmlsdGVyZWRMaXN0KAotCQkJCQkJKChSb2xlRGVzY3JpcHRvcikgZWxlbWVudCkuZ2V0UmVzcG9uc2libGVGb3IoKSkKLQkJCQkJCS50b0FycmF5KCk7Ci0JCQl9Ci0JCX07Ci0JCXRhYmxlVmlld2VyMS5zZXRDb250ZW50UHJvdmlkZXIoY29udGVudFByb3ZpZGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5SZWxhdGlvblNlY3Rpb24jaW5pdENvbnRlbnRQcm92aWRlcjIoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRDb250ZW50UHJvdmlkZXIyKCkgewotCQljb250ZW50UHJvdmlkZXIgPSBuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoZ2V0QWRhcHRlckZhY3RvcnkoKSkgewotCQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gZ2V0RmlsdGVyZWRMaXN0KCgoUm9sZURlc2NyaXB0b3IpIGVsZW1lbnQpLmdldE1vZGlmaWVzKCkpCi0JCQkJCQkudG9BcnJheSgpOwotCQkJfQotCQl9OwotCQl0YWJsZVZpZXdlcjIuc2V0Q29udGVudFByb3ZpZGVyKGNvbnRlbnRQcm92aWRlcik7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuUmVsYXRpb25TZWN0aW9uI2luaXQoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXQoKSB7Ci0JCXN1cGVyLmluaXQoKTsKLQotCQlsYWJlbFByb3ZpZGVyID0gbmV3IEFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcigKLQkJCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRS5nZXRXQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKTsKLQotCQlpbnQgbnVtT2ZUYWJsZXMgPSAyOwotCQkKLQkJc2V0VGFiRGF0YShQcm9wZXJ0aWVzUmVzb3VyY2VzLlJvbGVEZXNjcmlwdG9yX1dvcmtQcm9kdWN0c19TZWN0aW9uVGl0bGUsCi0JCQkJUHJvcGVydGllc1Jlc291cmNlcy5Sb2xlRGVzY3JpcHRvcl9Xb3JrUHJvZHVjdHNfU2VjdGlvbkRlc2NyaXB0aW9uLAotCQkJCVByb3BlcnRpZXNSZXNvdXJjZXMuUm9sZURlc2NyaXB0b3JfV29ya1Byb2R1Y3RzX1RhYmxlMSwKLQkJCQlQcm9wZXJ0aWVzUmVzb3VyY2VzLlJvbGVEZXNjcmlwdG9yX1dvcmtQcm9kdWN0c19UYWJsZTIsCi0JCQkJbnVsbCwKLQkJCQludWxsLAotCQkJCUZpbHRlckNvbnN0YW50cy5XT1JLUFJPRFVDVFMpOyAKLQotCQlib29sZWFuW10gY2hhbmdlc0FsbG93ZWQgPSB7IHRydWUsIGZhbHNlIH07Ci0JCXNldFRhYmxlRGF0YShudW1PZlRhYmxlcywgY2hhbmdlc0FsbG93ZWQpOwotCX0KLQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuUmVsYXRpb25TZWN0aW9uI3JlZnJlc2goKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlZnJlc2goKSB7Ci0JCWlmIChnZXRFbGVtZW50KCkgaW5zdGFuY2VvZiBSb2xlRGVzY3JpcHRvcikgewotCQkJZWxlbWVudCA9IChSb2xlRGVzY3JpcHRvcikgZ2V0RWxlbWVudCgpOwotCQl9Ci0JCXN1cGVyLnJlZnJlc2goKTsKLQl9Ci0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLlJlbGF0aW9uU2VjdGlvbiNnZXREZXNjcmlwdG9yc0Zyb21Qcm9jZXNzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBnZXREZXNjcmlwdG9yc0Zyb21Qcm9jZXNzKCkgewotCQlMaXN0IGl0ZW1zID0gbmV3IEFycmF5TGlzdCgpOwotCQlyZXR1cm4gUHJvY2Vzc1V0aWwuZ2V0RWxlbWVudHNJblNjb3BlKGdldEFkYXB0ZXJGYWN0b3J5KCksIGVsZW1lbnQsCi0JCQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yLmNsYXNzLCBpdGVtcyk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuUmVsYXRpb25TZWN0aW9uI2FkZEl0ZW1zMShqYXZhLnV0aWwuTGlzdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRJdGVtczEoTGlzdCBpdGVtcykgewotCQlpZiAoIWl0ZW1zLmlzRW1wdHkoKSkgewotCQkJQXNzaWduV1BUb1JvbGVEZXNjcmlwdG9yIGNtZCA9IG5ldyBBc3NpZ25XUFRvUm9sZURlc2NyaXB0b3IoCi0JCQkJCShSb2xlRGVzY3JpcHRvcikgZWxlbWVudCwgaXRlbXMsCi0JCQkJCUlBY3Rpb25UeXBlQ29uc3RhbnRzLkFERF9SRVNQT05TSUJMRV9GT1IsIGdldENvbmZpZ3VyYXRpb24oKSk7Ci0JCQlhY3Rpb25NZ3IuZXhlY3V0ZShjbWQpOwotCQl9Ci0JfTsKLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLlJlbGF0aW9uU2VjdGlvbiNyZW1vdmVJdGVtczEoamF2YS51dGlsLkxpc3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlSXRlbXMxKExpc3QgaXRlbXMpIHsKLQkJaWYgKCFpdGVtcy5pc0VtcHR5KCkpIHsKLQkJCVJlbW92ZURlc2NyaXB0b3JDb21tYW5kIGNtZCA9IG5ldyBSZW1vdmVEZXNjcmlwdG9yQ29tbWFuZChlbGVtZW50LAotCQkJCQlpdGVtcywgVW1hUGFja2FnZS5ST0xFX0RFU0NSSVBUT1JfX1JFU1BPTlNJQkxFX0ZPUik7Ci0JCQlhY3Rpb25NZ3IuZXhlY3V0ZShjbWQpOwotCQl9Ci0JfTsKLQotCXByaXZhdGUgTGlzdCBnZXRXb3JrUHJvZHVjdHMoTGlzdCBpdGVtcykgewotCQlMaXN0IHdwTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJaWYgKCFpdGVtcy5pc0VtcHR5KCkpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaXRlbXMuc2l6ZSgpOyBpKyspIHsKLQkJCQl3cExpc3QuYWRkKCgoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBpdGVtcy5nZXQoaSkpCi0JCQkJCQkuZ2V0V29ya1Byb2R1Y3QoKSk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gd3BMaXN0OwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLlJlbGF0aW9uU2VjdGlvbiNnZXRFeGlzdGluZ0VsZW1lbnRzMSgpCi0JICovCi0JcHJvdGVjdGVkIExpc3QgZ2V0RXhpc3RpbmdFbGVtZW50czEoKSB7Ci0JCXJldHVybiBnZXRXb3JrUHJvZHVjdHMoKChSb2xlRGVzY3JpcHRvcikgZWxlbWVudCkuZ2V0UmVzcG9uc2libGVGb3IoKSk7Ci0JfTsKLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLlJlbGF0aW9uU2VjdGlvbiNnZXRQcm9jZXNzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgUHJvY2VzcyBnZXRQcm9jZXNzKCkgewotCQlBZGFwdGVyRmFjdG9yeSBhRmFjdG9yeSA9IFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJLmdldE9CU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCk7Ci0JCUl0ZW1Qcm92aWRlckFkYXB0ZXIgYWRhcHRlciA9IChJdGVtUHJvdmlkZXJBZGFwdGVyKSBhRmFjdG9yeS5hZGFwdCgKLQkJCQllbGVtZW50LCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQlPYmplY3Qgb2JqID0gUHJvY2Vzc1V0aWwuZ2V0Um9vdFByb2Nlc3MoYUZhY3RvcnksIGFkYXB0ZXIsIGVsZW1lbnQpOwotCQlyZXR1cm4gKFByb2Nlc3MpIG9iajsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5SZWxhdGlvblNlY3Rpb24jZ2V0RmlsdGVyRm9yRGVzY3JpcHRvcnMoKQotCSAqLwotCXByb3RlY3RlZCBJRmlsdGVyIGdldEZpbHRlckZvckRlc2NyaXB0b3JzKCkgewotCQlyZXR1cm4gbmV3IERlc2NyaXB0b3JQcm9jZXNzRmlsdGVyKGdldENvbmZpZ3VyYXRpb24oKSkgewotCQkJcHJvdGVjdGVkIGJvb2xlYW4gY2hpbGRBY2NlcHQoT2JqZWN0IG9iaikgewotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCQlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCWdldEFjdGl2aXRpZXNJblNjb3BlKFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkJLmdldE9CU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCksIGVsZW1lbnQsIGxpc3QpOwotCQkJCQlpZiAobGlzdC5jb250YWlucyhvYmopKQotCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCWVsc2UKLQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQkJLy8gVW5jb21tZW50IHRvIHNob3cgZXh0ZW5kZWQgYWN0aXZpdHkncyB3b3JrcHJvZHVjdHMKLQkJCQkvLyBpZihvYmogaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3JXcmFwcGVySXRlbVByb3ZpZGVyKXsKLQkJCQkvLyBPYmplY3Qgb2JqZWN0ID0KLQkJCQkvLyAoKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKW9iaikuZ2V0UGFyZW50KG9iaik7Ci0JCQkJLy8gTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCS8vIGdldEFjdGl2aXRpZXNJblNjb3BlKAotCQkJCS8vIFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFLmdldE9CU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJLy8gZWxlbWVudCwgbGlzdCk7Ci0JCQkJLy8gaWYobGlzdC5jb250YWlucyhvYmplY3QpKSByZXR1cm4gdHJ1ZTsKLQkJCQkvLyB9Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0RGVzY3JpcHRvcikKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9OwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLlJlbGF0aW9uU2VjdGlvbiNnZXREZXNjcmlwdG9yVGFiTmFtZSgpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREZXNjcmlwdG9yVGFiTmFtZSgpIHsKLQkJcmV0dXJuIEZpbHRlckNvbnN0YW50cy5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUlM7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuUmVsYXRpb25TZWN0aW9uI2FkZEZyb21Qcm9jZXNzSXRlbXMxKGphdmEudXRpbC5MaXN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEZyb21Qcm9jZXNzSXRlbXMxKExpc3QgaXRlbXMpIHsKLQkJaWYgKCFpdGVtcy5pc0VtcHR5KCkpIHsKLQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5BRERfTUFOWSwgZWxlbWVudCwKLQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Um9sZURlc2NyaXB0b3JfUmVzcG9uc2libGVGb3IoKSwKLQkJCQkJaXRlbXMsIC0xKTsKLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvVGFza0Rlc2NyaXB0b3JHZW5lcmFsU2VjdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL1Rhc2tEZXNjcmlwdG9yR2VuZXJhbFNlY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2JkZTEwMy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvVGFza0Rlc2NyaXB0b3JHZW5lcmFsU2VjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjU1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllczsKLQotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZGlhbG9ncy5JdGVtc0ZpbHRlckRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZpbHRlcnMuUHJvY2Vzc1Rhc2tGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JQWN0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLkZpbHRlckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZC5MaW5rTWV0aG9kRWxlbWVudENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuTGlicmFyeVVJVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotCi0KLS8qKgotICogVGhlIGdlbmVyYWwgdGFiIHNlY3Rpb24gZm9yIFRhc2sgRGVzY3JpcHRvcgotICogCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMAotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBUYXNrRGVzY3JpcHRvckdlbmVyYWxTZWN0aW9uIGV4dGVuZHMKLQkJV29ya0JyZWFrZG93bkVsZW1lbnRHZW5lcmFsU2VjdGlvbiB7Ci0JcHJvdGVjdGVkIFRhc2tEZXNjcmlwdG9yIGVsZW1lbnQ7Ci0KLQlwcml2YXRlIEJ1dHRvbiBzeW5jaHJvbml6ZWRCdXR0b247Ci0KLQlwcml2YXRlIFRleHQgY3RybF9tZXRob2RfZWxlbWVudDsKLQotCXByaXZhdGUgQnV0dG9uIGxpbmtCdXR0b247Ci0JCi0JcHJpdmF0ZSBCdXR0b24gY2xlYXJCdXR0b247Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5Xb3JrQnJlYWtkb3duRWxlbWVudEdlbmVyYWxTZWN0aW9uI2luaXQoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXQoKSB7Ci0JCXN1cGVyLmluaXQoKTsKLQkJLy8gZ2V0IFRhc2tEZXNjcmlwdG9yIG9iamVjdAotCQllbGVtZW50ID0gKFRhc2tEZXNjcmlwdG9yKSBnZXRFbGVtZW50KCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuV29ya0JyZWFrZG93bkVsZW1lbnRHZW5lcmFsU2VjdGlvbiNjcmVhdGVHZW5lcmFsU2VjdGlvbihvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlR2VuZXJhbFNlY3Rpb24oQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotCQlzdXBlci5jcmVhdGVHZW5lcmFsU2VjdGlvbihjb21wb3NpdGUpOwotCi0JCS8vIGNyZWF0ZSBjb21wb3NpdGUgZm9yIGNoZWNrYm94Ci0JCWNoZWNrQm94Q29tcG9zaXRlID0gRm9ybVVJLmNyZWF0ZUNvbXBvc2l0ZSh0b29sa2l0LCBnZW5lcmFsQ29tcG9zaXRlLAotCQkJCUdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCwgbnVtT2ZDb2x1bW5zLCB0cnVlKTsKLQotCQkvLyBzeW5jaHJvbml6ZWQgd2l0aCBzb3VyY2UKLQkJc3luY2hyb25pemVkQnV0dG9uID0gRm9ybVVJLmNyZWF0ZUNoZWNrQnV0dG9uKHRvb2xraXQsIGNoZWNrQm94Q29tcG9zaXRlLAotCQkJCTEpOwotCQlzeW5jaHJvbml6ZWRCdXR0b24uc2V0VGV4dChQcm9wZXJ0aWVzUmVzb3VyY2VzLkJyZWFrZG93bkVsZW1lbnRfT3B0aW9uX1N5bmNocm9uaXplZCk7IAotCi0JCS8vIG1ldGhvZCBlbGVtZW50Ci0JCUZvcm1VSS5jcmVhdGVMYWJlbCh0b29sa2l0LCBnZW5lcmFsQ29tcG9zaXRlLCBQcm9wZXJ0aWVzUmVzb3VyY2VzLlByb2Nlc3NfVHlwZV9UYXNrKTsgCi0JCWN0cmxfbWV0aG9kX2VsZW1lbnQgPSBGb3JtVUkuY3JlYXRlVGV4dCh0b29sa2l0LCBnZW5lcmFsQ29tcG9zaXRlLAotCQkJCVNXVC5ERUZBVUxULCAxKTsKLQotCQljdHJsX21ldGhvZF9lbGVtZW50LnNldFRleHQoZ2V0TWV0aG9kRWxlbWVudE5hbWUoZWxlbWVudCkpOwotCQljdHJsX21ldGhvZF9lbGVtZW50LnNldEVuYWJsZWQoZmFsc2UpOwotCi0JCUNvbXBvc2l0ZSBidXR0b25Db21wb3NpdGUgPSBGb3JtVUkuY3JlYXRlQ29tcG9zaXRlKHRvb2xraXQsCi0JCQkJZ2VuZXJhbENvbXBvc2l0ZSwgU1dULk5PTkUsIDIsIHRydWUpOwotCQlsaW5rQnV0dG9uID0gRm9ybVVJLmNyZWF0ZUJ1dHRvbih0b29sa2l0LCBidXR0b25Db21wb3NpdGUsIFNXVC5QVVNILCAxKTsKLQkJbGlua0J1dHRvbgotCQkJCS5zZXRUZXh0KFByb3BlcnRpZXNSZXNvdXJjZXMuUHJvY2Vzc19CdXR0b25fTGlua01ldGhvZEVsZW1lbnQpOyAKLQotCQljbGVhckJ1dHRvbiA9IEZvcm1VSS5jcmVhdGVCdXR0b24odG9vbGtpdCwgYnV0dG9uQ29tcG9zaXRlLCBTV1QuUFVTSCwgMSk7Ci0JCWNsZWFyQnV0dG9uCi0JCQkJLnNldFRleHQoUHJvcGVydGllc1Jlc291cmNlcy5Qcm9jZXNzX0J1dHRvbl9DbGVhck1ldGhvZEVsZW1lbnQpOyAKLQotCi0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldE1ldGhvZEVsZW1lbnQoTGlzdCBpdGVtcykgewotCQlpZiAoKGl0ZW1zICE9IG51bGwpICYmIChpdGVtcy5zaXplKCkgPj0gMSkpIHsKLQkJCWlmIChpdGVtcy5nZXQoMCkgaW5zdGFuY2VvZiBUYXNrKSB7Ci0JCQkJVGFzayB0YXNrID0gKFRhc2spIGl0ZW1zLmdldCgwKTsKLQotLy8JCQkJTGlzdCBzaWJsaW5ncyA9IFByb2Nlc3NVdGlsCi0vLwkJCQkJCS5nZXRTaWJsaW5ncyhUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotLy8JCQkJCQkJCS5nZXRXQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpLCBnZXRBZGFwdGVyKCksCi0vLwkJCQkJCQkJZWxlbWVudCk7Ci0JCQkJYm9vbGVhbiBjYW5Bc3NpZ24gPSB0cnVlOwotLy8JCQkKLS8vCi0vLwkJCQlmb3IgKEl0ZXJhdG9yIGl0b3IgPSBsaXN0Lml0ZXJhdG9yKCk7IGl0b3IuaGFzTmV4dCgpOykgewotLy8JCQkJCU9iamVjdCBvYmogPSBpdG9yLm5leHQoKTsKLS8vCQkJCQlpZiAob2JqIGluc3RhbmNlb2YgVGFza0Rlc2NyaXB0b3IpIHsKLS8vCQkJCQkJVGFza0Rlc2NyaXB0b3IgdGFza0Rlc2MgPSAoVGFza0Rlc2NyaXB0b3IpIG9iajsKLS8vCQkJCQkJaWYgKCghdGFza0Rlc2MuZXF1YWxzKGVsZW1lbnQpKQotLy8JCQkJCQkJCSYmICghdGFza0Rlc2MuZ2V0U3VwcHJlc3NlZCgpLmJvb2xlYW5WYWx1ZSgpKSkgewotLy8JCQkJCQkJVGFzayBleGlzaW5nVGFzayA9IHRhc2tEZXNjLmdldFRhc2soKTsKLS8vCQkJCQkJCWlmICh0YXNrLmVxdWFscyhleGlzaW5nVGFzaykpIHsKLS8vCQkJCQkJCQljYW5Bc3NpZ24gPSBmYWxzZTsKLS8vCQkJCQkJCQlicmVhazsKLS8vCQkJCQkJCX0KLS8vCQkJCQkJfQotLy8JCQkJCX0KLS8vCQkJCX0KLQkJCQlpZiAoY2FuQXNzaWduKSB7Ci0JCQkJCUxpbmtNZXRob2RFbGVtZW50Q29tbWFuZCBjbWQgPSBuZXcgTGlua01ldGhvZEVsZW1lbnRDb21tYW5kKAotCQkJCQkJCWVsZW1lbnQsIHRhc2ssIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19UQVNLKTsKLQkJCQkJYWN0aW9uTWdyLmV4ZWN1dGUoY21kKTsKLQotCQkJCQkvLyBzZXQgc2VsZWN0aW9uIHRvIHNhbWUgZWxlbWVudCB0byBlbmFibGUgY29ycmVjdCBhY3Rpb25zCi0JCQkJCWdldEVkaXRvcigpLnNldFNlbGVjdGlvbihnZXRTZWxlY3Rpb24oKSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJTWVzc2FnZUZvcm1hdCBtZiA9IG5ldyBNZXNzYWdlRm9ybWF0KFByb3BlcnRpZXNSZXNvdXJjZXMuUHJvY2Vzc19JbnZhbGlkTGlua01ldGhvZEVsZW1lbnQpOyAKLQkJCQkJT2JqZWN0W10gYXJncyA9IHsgdGFzay5nZXROYW1lKCkgfTsKLQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4KLQkJCQkJCQkuZ2V0RGVmYXVsdCgpCi0JCQkJCQkJLmdldE1zZ0RpYWxvZygpCi0JCQkJCQkJLmRpc3BsYXlJbmZvKAotCQkJCQkJCQkJUHJvcGVydGllc1Jlc291cmNlcy5Qcm9jZXNzX0xpbmtNZXRob2RFbGVtZW50VGl0bGUsIG1mLmZvcm1hdChhcmdzKSk7IAotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldE1ldGhvZEVsZW1lbnROYW1lKFRhc2tEZXNjcmlwdG9yIGVsZW1lbnQpIHsKLQkJU3RyaW5nIHN0ciA9IFByb3BlcnRpZXNSZXNvdXJjZXMuUHJvY2Vzc19Ob25lOyAKLQkJaWYgKGVsZW1lbnQuZ2V0VGFzaygpICE9IG51bGwpIHsKLQkJCXN0ciA9IGVsZW1lbnQuZ2V0VGFzaygpLmdldE5hbWUoKTsKLQkJfQotCi0JCXJldHVybiBzdHI7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuV29ya0JyZWFrZG93bkVsZW1lbnRHZW5lcmFsU2VjdGlvbiNhZGRMaXN0ZW5lcnMoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZExpc3RlbmVycygpIHsKLQkJc3VwZXIuYWRkTGlzdGVuZXJzKCk7Ci0KLQkJc3luY2hyb25pemVkQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5TRVQsIGVsZW1lbnQsCi0JCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkuZ2V0RGVzY3JpcHRvcl9Jc1N5bmNocm9uaXplZFdpdGhTb3VyY2UoKSwKLQkJCQkJCUJvb2xlYW4udmFsdWVPZihzeW5jaHJvbml6ZWRCdXR0b24uZ2V0U2VsZWN0aW9uKCkpLCAtMSk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQl9Ci0JCX0pOwotCi0JCWxpbmtCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJSUZpbHRlciBmaWx0ZXIgPSBuZXcgUHJvY2Vzc1Rhc2tGaWx0ZXIoCi0JCQkJCQlnZXRDb25maWd1cmF0aW9uKCksIG51bGwsIEZpbHRlckNvbnN0YW50cy5UQVNLUyk7Ci0JCQkJTGlzdCBleGlzdGluZ0VsZW1lbnRzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCWlmIChlbGVtZW50LmdldFRhc2soKSAhPSBudWxsKSB7Ci0JCQkJCWV4aXN0aW5nRWxlbWVudHMuYWRkKGVsZW1lbnQuZ2V0VGFzaygpKTsKLQkJCQl9Ci0JCQkJSXRlbXNGaWx0ZXJEaWFsb2cgZmQgPSBuZXcgSXRlbXNGaWx0ZXJEaWFsb2coUGxhdGZvcm1VSQotCQkJCQkJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldFNoZWxsKCksCi0JCQkJCQlmaWx0ZXIsIGVsZW1lbnQsIEZpbHRlckNvbnN0YW50cy5UQVNLUywKLQkJCQkJCWV4aXN0aW5nRWxlbWVudHMpOwotCi0JCQkJZmQuc2V0QmxvY2tPbk9wZW4odHJ1ZSk7Ci0JCQkJZmQuc2V0Vmlld2VyU2VsZWN0aW9uU2luZ2xlKHRydWUpOwotCQkJCWZkLnNldFRpdGxlKEZpbHRlckNvbnN0YW50cy5UQVNLUyk7Ci0JCQkJZmQub3BlbigpOwotCQkJCXNldE1ldGhvZEVsZW1lbnQoZmQuZ2V0U2VsZWN0ZWRJdGVtcygpKTsKLQotCQkJCS8vIHVwZGF0ZSBtZXRob2QgZWxlbWVudCBjb250cm9sCi0JCQkJY3RybF9tZXRob2RfZWxlbWVudC5zZXRUZXh0KGdldE1ldGhvZEVsZW1lbnROYW1lKGVsZW1lbnQpKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUxKSB7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJCi0JCWNsZWFyQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5TRVQsIGVsZW1lbnQsCi0JCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkuZ2V0VGFza0Rlc2NyaXB0b3JfVGFzaygpLAotCQkJCQkJbnVsbCwgLTEpOwotCQkJCS8vIHVwZGF0ZSBtZXRob2QgZWxlbWVudCBjb250cm9sCi0JCQkJY3RybF9tZXRob2RfZWxlbWVudC5zZXRUZXh0KGdldE1ldGhvZEVsZW1lbnROYW1lKGVsZW1lbnQpKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUxKSB7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLldvcmtCcmVha2Rvd25FbGVtZW50R2VuZXJhbFNlY3Rpb24jdXBkYXRlQ29udHJvbHMoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZUNvbnRyb2xzKCkgewotCQlzdXBlci51cGRhdGVDb250cm9scygpOwotCQlzeW5jaHJvbml6ZWRCdXR0b24uc2V0RW5hYmxlZChlZGl0YWJsZSk7Ci0JCWxpbmtCdXR0b24uc2V0RW5hYmxlZChlZGl0YWJsZSk7Ci0JCWNsZWFyQnV0dG9uLnNldEVuYWJsZWQoZWRpdGFibGUpOwotCX0KLQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLldvcmtCcmVha2Rvd25FbGVtZW50R2VuZXJhbFNlY3Rpb24jcmVmcmVzaCgpCi0JICovCi0JcHVibGljIHZvaWQgcmVmcmVzaCgpIHsKLQkJdHJ5IHsKLQkJCWlmIChnZXRFbGVtZW50KCkgaW5zdGFuY2VvZiBUYXNrRGVzY3JpcHRvcikgewotCQkJCXN1cGVyLnJlZnJlc2goKTsKLQotCQkJCWVsZW1lbnQgPSAoVGFza0Rlc2NyaXB0b3IpIGdldEVsZW1lbnQoKTsKLQkJCQlzeW5jaHJvbml6ZWRCdXR0b24uc2V0U2VsZWN0aW9uKGVsZW1lbnQKLQkJCQkJCS5nZXRJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UoKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJY3RybF9tZXRob2RfZWxlbWVudC5zZXRUZXh0KGdldE1ldGhvZEVsZW1lbnROYW1lKGVsZW1lbnQpKTsKLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQlsb2dnZXIKLQkJCQkJLmxvZ0Vycm9yKAotCQkJCQkJCSJFcnJvciByZWZyZXNoaW5nIFRhc2tEZXNjcmlwdG9yIGdlbmVyYWwgc2VjdGlvbjogIiArIGVsZW1lbnQsIGV4KTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuV29ya0JyZWFrZG93bkVsZW1lbnRHZW5lcmFsU2VjdGlvbiNnZXROYW1lUHJlZml4KCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWVQcmVmaXgoKSB7Ci0JCXJldHVybiBMaWJyYXJ5VUlUZXh0LlRFWFRfVEFTS19ERVNDUklQVE9SICsgIjogIjsgLy8kTk9OLU5MUy0xJAotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9UYXNrRGVzY3JpcHRvclJvbGVTZWN0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvVGFza0Rlc2NyaXB0b3JSb2xlU2VjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZjNkNDE4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9UYXNrRGVzY3JpcHRvclJvbGVTZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOTggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZpbHRlcnMuRGVzY3JpcHRvclByb2Nlc3NGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5maWx0ZXJzLlByb2Nlc3NSb2xlRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JQWN0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLkZpbHRlckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZC5Bc3NpZ25Sb2xlVG9UYXNrRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZC5JQWN0aW9uVHlwZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuUHJvY2Vzc1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLlRhYmJlZFByb3BlcnR5U2hlZXRQYWdlOwotCi0KLS8qKgotICogVGhlIFRhc2sgZGVzY3JpcHRvciAtIHJvbGUgdGFiIHNlY3Rpb24KLSAqIAotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjAKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgVGFza0Rlc2NyaXB0b3JSb2xlU2VjdGlvbiBleHRlbmRzIFJlbGF0aW9uU2VjdGlvbiB7Ci0JcHJpdmF0ZSBJRmlsdGVyIHJvbGVGaWx0ZXIgPSBudWxsOwotCi0JLyoqCi0JICogR2V0IHByb2Nlc3Mgcm9sZWRlc2NyaXB0b3IgZmlsdGVyCi0JICovCi0JcHVibGljIElGaWx0ZXIgZ2V0RmlsdGVyKCkgewotCQlpZiAocm9sZUZpbHRlciA9PSBudWxsKSB7Ci0JCQlyb2xlRmlsdGVyID0gbmV3IFByb2Nlc3NSb2xlRmlsdGVyKGdldENvbmZpZ3VyYXRpb24oKSwgbnVsbCwKLQkJCQkJRmlsdGVyQ29uc3RhbnRzLlJPTEVTKTsKLQkJfQotCQlyZXR1cm4gcm9sZUZpbHRlcjsKLQl9Ci0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLlJlbGF0aW9uU2VjdGlvbiNjcmVhdGVDb250cm9scyhvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUsIG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLlRhYmJlZFByb3BlcnR5U2hlZXRQYWdlKQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2xzKENvbXBvc2l0ZSBwYXJlbnQsCi0JCQlUYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZSB0YWJiZWRQcm9wZXJ0eVNoZWV0UGFnZSkgewotCi0JCXN1cGVyLmNyZWF0ZUNvbnRyb2xzKHBhcmVudCwgdGFiYmVkUHJvcGVydHlTaGVldFBhZ2UpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLlJlbGF0aW9uU2VjdGlvbiNpbml0Q29udGVudFByb3ZpZGVyMSgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdENvbnRlbnRQcm92aWRlcjEoKSB7Ci0JCWNvbnRlbnRQcm92aWRlciA9IG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcihnZXRBZGFwdGVyRmFjdG9yeSgpKSB7Ci0JCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IG9iamVjdCkgewotCQkJCXJldHVybiBnZXRGaWx0ZXJlZExpc3QoCi0JCQkJCQkoKFRhc2tEZXNjcmlwdG9yKSBlbGVtZW50KS5nZXRQZXJmb3JtZWRQcmltYXJpbHlCeSgpKQotCQkJCQkJLnRvQXJyYXkoKTsKLQkJCX0KLQkJfTsKLQkJdGFibGVWaWV3ZXIxLnNldENvbnRlbnRQcm92aWRlcihjb250ZW50UHJvdmlkZXIpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLlJlbGF0aW9uU2VjdGlvbiNpbml0Q29udGVudFByb3ZpZGVyMigpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdENvbnRlbnRQcm92aWRlcjIoKSB7Ci0JCWNvbnRlbnRQcm92aWRlciA9IG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcihnZXRBZGFwdGVyRmFjdG9yeSgpKSB7Ci0JCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IG9iamVjdCkgewotCQkJCXJldHVybiBnZXRGaWx0ZXJlZExpc3QoCi0JCQkJCQkoKFRhc2tEZXNjcmlwdG9yKSBlbGVtZW50KS5nZXRBZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSgpKQotCQkJCQkJLnRvQXJyYXkoKTsKLQkJCX0KLQkJfTsKLQkJdGFibGVWaWV3ZXIyLnNldENvbnRlbnRQcm92aWRlcihjb250ZW50UHJvdmlkZXIpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLlJlbGF0aW9uU2VjdGlvbiNpbml0Q29udGVudFByb3ZpZGVyMygpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdENvbnRlbnRQcm92aWRlcjMoKSB7Ci0JCWNvbnRlbnRQcm92aWRlciA9IG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcihnZXRBZGFwdGVyRmFjdG9yeSgpKSB7Ci0JCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IG9iamVjdCkgewotCQkJCXJldHVybiBnZXRGaWx0ZXJlZExpc3QoCi0JCQkJCQkoKFRhc2tEZXNjcmlwdG9yKSBlbGVtZW50KS5nZXRBc3Npc3RlZEJ5KCkpLnRvQXJyYXkoKTsKLQkJCX0KLQkJfTsKLQkJdGFibGVWaWV3ZXIzLnNldENvbnRlbnRQcm92aWRlcihjb250ZW50UHJvdmlkZXIpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLlJlbGF0aW9uU2VjdGlvbiNpbml0KCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0KCkgewotCQlzdXBlci5pbml0KCk7Ci0KLQkJbGFiZWxQcm92aWRlciA9IG5ldyBBZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIoCi0JCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UuZ2V0T0JTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSk7Ci0KLQkJaW50IG51bU9mVGFibGVzID0gMzsKLQkJCi0JCXNldFRhYkRhdGEoUHJvcGVydGllc1Jlc291cmNlcy5UYXNrRGVzY3JpcHRvcl9Sb2xlc19TZWN0aW9uVGl0bGUsCi0JCQkJUHJvcGVydGllc1Jlc291cmNlcy5UYXNrRGVzY3JpcHRvcl9Sb2xlc19TZWN0aW9uRGVzY3JpcHRpb24sCi0JCQkJUHJvcGVydGllc1Jlc291cmNlcy5UYXNrRGVzY3JpcHRvcl9Sb2xlc19UYWJsZTEsCi0JCQkJUHJvcGVydGllc1Jlc291cmNlcy5UYXNrRGVzY3JpcHRvcl9Sb2xlc19UYWJsZTIsCi0JCQkJUHJvcGVydGllc1Jlc291cmNlcy5UYXNrRGVzY3JpcHRvcl9Sb2xlc19UYWJsZTMsCi0JCQkJbnVsbCwKLQkJCQlGaWx0ZXJDb25zdGFudHMuUk9MRVMpOwotCQkKLQkJYm9vbGVhbltdIGNoYW5nZXNBbGxvd2VkID0geyB0cnVlLCB0cnVlLCB0cnVlIH07Ci0JCXNldFRhYmxlRGF0YShudW1PZlRhYmxlcywgY2hhbmdlc0FsbG93ZWQpOwotCi0JfQotCi0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5SZWxhdGlvblNlY3Rpb24jcmVmcmVzaCgpCi0JICovCi0JcHVibGljIHZvaWQgcmVmcmVzaCgpIHsKLQkJaWYgKGdldEVsZW1lbnQoKSBpbnN0YW5jZW9mIFRhc2tEZXNjcmlwdG9yKSB7Ci0JCQllbGVtZW50ID0gKFRhc2tEZXNjcmlwdG9yKSBnZXRFbGVtZW50KCk7Ci0JCX0KLQkJc3VwZXIucmVmcmVzaCgpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLlJlbGF0aW9uU2VjdGlvbiNnZXREZXNjcmlwdG9yc0Zyb21Qcm9jZXNzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBnZXREZXNjcmlwdG9yc0Zyb21Qcm9jZXNzKCkgewotCQlMaXN0IGl0ZW1zID0gbmV3IEFycmF5TGlzdCgpOwotCQlyZXR1cm4gUHJvY2Vzc1V0aWwuZ2V0RWxlbWVudHNJblNjb3BlKGdldEFkYXB0ZXJGYWN0b3J5KCksIGVsZW1lbnQsCi0JCQkJUm9sZURlc2NyaXB0b3IuY2xhc3MsIGl0ZW1zKTsKLQotCX0KLQotCXByaXZhdGUgTGlzdCBnZXRSb2xlcyhMaXN0IGl0ZW1zKSB7Ci0JCUxpc3Qgcm9sZUxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWlmICghaXRlbXMuaXNFbXB0eSgpKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLnNpemUoKTsgaSsrKSB7Ci0JCQkJcm9sZUxpc3QuYWRkKCgoUm9sZURlc2NyaXB0b3IpIGl0ZW1zLmdldChpKSkuZ2V0Um9sZSgpKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiByb2xlTGlzdDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5SZWxhdGlvblNlY3Rpb24jYWRkSXRlbXMxKGphdmEudXRpbC5MaXN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEl0ZW1zMShMaXN0IGl0ZW1zKSB7Ci0JCWlmICghaXRlbXMuaXNFbXB0eSgpKSB7Ci0JCQlMaXN0IGVsZW1lbnRMaXN0ID0gZ2V0Um9sZXMoKChUYXNrRGVzY3JpcHRvcikgZWxlbWVudCkKLQkJCQkJLmdldEFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5KCkpOwotCQkJZWxlbWVudExpc3QuYWRkQWxsKGdldFJvbGVzKCgoVGFza0Rlc2NyaXB0b3IpIGVsZW1lbnQpCi0JCQkJCS5nZXRBc3Npc3RlZEJ5KCkpKTsKLQotCQkJTGlzdCBuZXdMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtcy5zaXplKCk7IGkrKykgewotCQkJCU9iamVjdCBvYmogPSBpdGVtcy5nZXQoaSk7Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFJvbGUpIHsKLQkJCQkJUm9sZSByb2xlID0gKFJvbGUpIG9iajsKLQkJCQkJaWYgKCFlbGVtZW50TGlzdC5jb250YWlucyhyb2xlKSkKLQkJCQkJCW5ld0xpc3QuYWRkKHJvbGUpOwotCQkJCX0KLQkJCX0KLQotCQkJaWYgKG5ld0xpc3Quc2l6ZSgpID4gMCkgewotCQkJCUFzc2lnblJvbGVUb1Rhc2tEZXNjcmlwdG9yIGNtZCA9IG5ldyBBc3NpZ25Sb2xlVG9UYXNrRGVzY3JpcHRvcigKLQkJCQkJCShUYXNrRGVzY3JpcHRvcikgZWxlbWVudCwgbmV3TGlzdCwKLQkJCQkJCUlBY3Rpb25UeXBlQ29uc3RhbnRzLkFERF9QUklNQVJZX1BFUkZPUk1FUiwgZ2V0Q29uZmlndXJhdGlvbigpKTsKLQkJCQlhY3Rpb25NZ3IuZXhlY3V0ZShjbWQpOwotCQkJfQotCQl9Ci0JfTsKLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLlJlbGF0aW9uU2VjdGlvbiNhZGRJdGVtczIoamF2YS51dGlsLkxpc3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkSXRlbXMyKExpc3QgaXRlbXMpIHsKLQkJaWYgKCFpdGVtcy5pc0VtcHR5KCkpIHsKLQkJCUxpc3QgZWxlbWVudExpc3QgPSBnZXRSb2xlcygoKFRhc2tEZXNjcmlwdG9yKSBlbGVtZW50KQotCQkJCQkuZ2V0UGVyZm9ybWVkUHJpbWFyaWx5QnkoKSk7Ci0JCQllbGVtZW50TGlzdC5hZGRBbGwoZ2V0Um9sZXMoKChUYXNrRGVzY3JpcHRvcikgZWxlbWVudCkKLQkJCQkJLmdldEFzc2lzdGVkQnkoKSkpOwotCQkKLQotCQkJTGlzdCBuZXdMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtcy5zaXplKCk7IGkrKykgewotCQkJCU9iamVjdCBvYmogPSBpdGVtcy5nZXQoaSk7Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFJvbGUpIHsKLQkJCQkJUm9sZSByb2xlID0gKFJvbGUpIG9iajsKLQkJCQkJaWYgKCFlbGVtZW50TGlzdC5jb250YWlucyhyb2xlKSkKLQkJCQkJCW5ld0xpc3QuYWRkKHJvbGUpOwotCQkJCX0KLQkJCX0KLQkJCWlmIChuZXdMaXN0LnNpemUoKSA+IDApIHsKLQkJCQlBc3NpZ25Sb2xlVG9UYXNrRGVzY3JpcHRvciBjbWQgPSBuZXcgQXNzaWduUm9sZVRvVGFza0Rlc2NyaXB0b3IoCi0JCQkJCQkoVGFza0Rlc2NyaXB0b3IpIGVsZW1lbnQsIG5ld0xpc3QsCi0JCQkJCQlJQWN0aW9uVHlwZUNvbnN0YW50cy5BRERfQURESVRJT05BTF9QRVJGT1JNRVIsIGdldENvbmZpZ3VyYXRpb24oKSk7Ci0JCQkJYWN0aW9uTWdyLmV4ZWN1dGUoY21kKTsKLQkJCX0KLQkJfQotCX07Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5SZWxhdGlvblNlY3Rpb24jYWRkSXRlbXMzKGphdmEudXRpbC5MaXN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEl0ZW1zMyhMaXN0IGl0ZW1zKSB7Ci0JCWlmICghaXRlbXMuaXNFbXB0eSgpKSB7Ci0JCQlMaXN0IGVsZW1lbnRMaXN0ID0gZ2V0Um9sZXMoKChUYXNrRGVzY3JpcHRvcikgZWxlbWVudCkKLQkJCQkJLmdldFBlcmZvcm1lZFByaW1hcmlseUJ5KCkpOwotCQkJZWxlbWVudExpc3QuYWRkQWxsKGdldFJvbGVzKCgoVGFza0Rlc2NyaXB0b3IpIGVsZW1lbnQpCi0JCQkJCS5nZXRBZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSgpKSk7Ci0KLQkJCUxpc3QgbmV3TGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaXRlbXMuc2l6ZSgpOyBpKyspIHsKLQkJCQlPYmplY3Qgb2JqID0gaXRlbXMuZ2V0KGkpOwotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBSb2xlKSB7Ci0JCQkJCVJvbGUgcm9sZSA9IChSb2xlKSBvYmo7Ci0JCQkJCWlmICghZWxlbWVudExpc3QuY29udGFpbnMocm9sZSkpCi0JCQkJCQluZXdMaXN0LmFkZChyb2xlKTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAobmV3TGlzdC5zaXplKCkgPiAwKSB7Ci0JCQkJQXNzaWduUm9sZVRvVGFza0Rlc2NyaXB0b3IgY21kID0gbmV3IEFzc2lnblJvbGVUb1Rhc2tEZXNjcmlwdG9yKAotCQkJCQkJKFRhc2tEZXNjcmlwdG9yKSBlbGVtZW50LCBuZXdMaXN0LAotCQkJCQkJSUFjdGlvblR5cGVDb25zdGFudHMuQUREX0FTU0lTVEVEX0JZLCBnZXRDb25maWd1cmF0aW9uKCkpOwotCQkJCWFjdGlvbk1nci5leGVjdXRlKGNtZCk7Ci0JCQl9Ci0JCX0KLQl9OwotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuUmVsYXRpb25TZWN0aW9uI2FkZEZyb21Qcm9jZXNzSXRlbXMxKGphdmEudXRpbC5MaXN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEZyb21Qcm9jZXNzSXRlbXMxKExpc3QgaXRlbXMpIHsKLQkJaWYgKCFpdGVtcy5pc0VtcHR5KCkpIHsKLQkJCWl0ZW1zLnJlbW92ZUFsbCgoKFRhc2tEZXNjcmlwdG9yKSBlbGVtZW50KQotCQkJCQkuZ2V0QWRkaXRpb25hbGx5UGVyZm9ybWVkQnkoKSk7Ci0JCQlpdGVtcy5yZW1vdmVBbGwoKChUYXNrRGVzY3JpcHRvcikgZWxlbWVudCkuZ2V0QXNzaXN0ZWRCeSgpKTsKLQotCQkJaWYgKGl0ZW1zLnNpemUoKSA+IDApIHsKLQkJCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuQUREX01BTlksIGVsZW1lbnQsCi0JCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkuZ2V0VGFza0Rlc2NyaXB0b3JfUGVyZm9ybWVkUHJpbWFyaWx5QnkoKSwKLQkJCQkJCWl0ZW1zLCAtMSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5SZWxhdGlvblNlY3Rpb24jYWRkRnJvbVByb2Nlc3NJdGVtczIoamF2YS51dGlsLkxpc3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkRnJvbVByb2Nlc3NJdGVtczIoTGlzdCBpdGVtcykgewotCQlpZiAoIWl0ZW1zLmlzRW1wdHkoKSkgewotCQkJaXRlbXMucmVtb3ZlQWxsKCgoVGFza0Rlc2NyaXB0b3IpIGVsZW1lbnQpLmdldEFzc2lzdGVkQnkoKSk7Ci0JCQlpdGVtcy5yZW1vdmVBbGwoKChUYXNrRGVzY3JpcHRvcikgZWxlbWVudCkuZ2V0UGVyZm9ybWVkUHJpbWFyaWx5QnkoKSk7Ci0KLQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5BRERfTUFOWSwgZWxlbWVudCwKLQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkuZ2V0VGFza0Rlc2NyaXB0b3JfQWRkaXRpb25hbGx5UGVyZm9ybWVkQnkoKSwKLQkJCQkJaXRlbXMsIC0xKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLlJlbGF0aW9uU2VjdGlvbiNhZGRGcm9tUHJvY2Vzc0l0ZW1zMyhqYXZhLnV0aWwuTGlzdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRGcm9tUHJvY2Vzc0l0ZW1zMyhMaXN0IGl0ZW1zKSB7Ci0JCWlmICghaXRlbXMuaXNFbXB0eSgpKSB7Ci0JCQlpdGVtcy5yZW1vdmVBbGwoKChUYXNrRGVzY3JpcHRvcikgZWxlbWVudCkKLQkJCQkJLmdldEFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5KCkpOwotCQkJaXRlbXMucmVtb3ZlQWxsKCgoVGFza0Rlc2NyaXB0b3IpIGVsZW1lbnQpLmdldFBlcmZvcm1lZFByaW1hcmlseUJ5KCkpOwotCi0JCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuQUREX01BTlksIGVsZW1lbnQsCi0JCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tEZXNjcmlwdG9yX0Fzc2lzdGVkQnkoKSwgaXRlbXMsCi0JCQkJCS0xKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLlJlbGF0aW9uU2VjdGlvbiNyZW1vdmVJdGVtczEoamF2YS51dGlsLkxpc3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlSXRlbXMxKExpc3QgaXRlbXMpIHsKLQkJaWYgKCFpdGVtcy5pc0VtcHR5KCkpIHsKLQkJCVJlbW92ZURlc2NyaXB0b3JDb21tYW5kIGNtZCA9IG5ldyBSZW1vdmVEZXNjcmlwdG9yQ29tbWFuZChlbGVtZW50LAotCQkJCQlpdGVtcywgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX1BFUkZPUk1FRF9QUklNQVJJTFlfQlkpOwotCQkJYWN0aW9uTWdyLmV4ZWN1dGUoY21kKTsKLQkJfQotCX07Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5SZWxhdGlvblNlY3Rpb24jcmVtb3ZlSXRlbXMyKGphdmEudXRpbC5MaXN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbW92ZUl0ZW1zMihMaXN0IGl0ZW1zKSB7Ci0JCWlmICghaXRlbXMuaXNFbXB0eSgpKSB7Ci0JCQlSZW1vdmVEZXNjcmlwdG9yQ29tbWFuZCBjbWQgPSBuZXcgUmVtb3ZlRGVzY3JpcHRvckNvbW1hbmQoZWxlbWVudCwKLQkJCQkJaXRlbXMsCi0JCQkJCVVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19BRERJVElPTkFMTFlfUEVSRk9STUVEX0JZKTsKLQkJCWFjdGlvbk1nci5leGVjdXRlKGNtZCk7Ci0JCX0KLQl9OwotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuUmVsYXRpb25TZWN0aW9uI3JlbW92ZUl0ZW1zMyhqYXZhLnV0aWwuTGlzdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVJdGVtczMoTGlzdCBpdGVtcykgewotCQlpZiAoIWl0ZW1zLmlzRW1wdHkoKSkgewotCQkJUmVtb3ZlRGVzY3JpcHRvckNvbW1hbmQgY21kID0gbmV3IFJlbW92ZURlc2NyaXB0b3JDb21tYW5kKGVsZW1lbnQsCi0JCQkJCWl0ZW1zLCBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fQVNTSVNURURfQlkpOwotCQkJYWN0aW9uTWdyLmV4ZWN1dGUoY21kKTsKLQkJfQotCX07Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5SZWxhdGlvblNlY3Rpb24jZ2V0RXhpc3RpbmdFbGVtZW50czEoKQotCSAqLwotCXByb3RlY3RlZCBMaXN0IGdldEV4aXN0aW5nRWxlbWVudHMxKCkgewotCQlyZXR1cm4gKChUYXNrRGVzY3JpcHRvcikgZWxlbWVudCkuZ2V0UGVyZm9ybWVkUHJpbWFyaWx5QnkoKTsKLQl9OwotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuUmVsYXRpb25TZWN0aW9uI2dldEV4aXN0aW5nRWxlbWVudHMyKCkKLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBnZXRFeGlzdGluZ0VsZW1lbnRzMigpIHsKLQkJcmV0dXJuICgoVGFza0Rlc2NyaXB0b3IpIGVsZW1lbnQpLmdldEFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5KCk7Ci0JfTsKLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLlJlbGF0aW9uU2VjdGlvbiNnZXRFeGlzdGluZ0VsZW1lbnRzMygpCi0JICovCi0JcHJvdGVjdGVkIExpc3QgZ2V0RXhpc3RpbmdFbGVtZW50czMoKSB7Ci0JCXJldHVybiAoKFRhc2tEZXNjcmlwdG9yKSBlbGVtZW50KS5nZXRBc3Npc3RlZEJ5KCk7Ci0JfTsKLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLlJlbGF0aW9uU2VjdGlvbiNnZXRGaWx0ZXJGb3JEZXNjcmlwdG9ycygpCi0JICovCi0JcHJvdGVjdGVkIElGaWx0ZXIgZ2V0RmlsdGVyRm9yRGVzY3JpcHRvcnMoKSB7Ci0JCXJldHVybiBuZXcgRGVzY3JpcHRvclByb2Nlc3NGaWx0ZXIoZ2V0Q29uZmlndXJhdGlvbigpKSB7Ci0JCQlwcm90ZWN0ZWQgYm9vbGVhbiBjaGlsZEFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJCUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJZ2V0QWN0aXZpdGllc0luU2NvcGUoVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJCQkuZ2V0V0JTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSwgZWxlbWVudCwgbGlzdCk7Ci0JCQkJCWlmIChsaXN0LmNvbnRhaW5zKG9iaikpCi0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJZWxzZQotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgUm9sZURlc2NyaXB0b3IpCi0JCQkJCXJldHVybiB0cnVlOwotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5SZWxhdGlvblNlY3Rpb24jZ2V0UHJvY2VzcygpCi0JICovCi0JcHJvdGVjdGVkIFByb2Nlc3MgZ2V0UHJvY2VzcygpIHsKLQkJQWRhcHRlckZhY3RvcnkgYUZhY3RvcnkgPSBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCS5nZXRXQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpOwotCQlJdGVtUHJvdmlkZXJBZGFwdGVyIGFkYXB0ZXIgPSAoSXRlbVByb3ZpZGVyQWRhcHRlcikgYUZhY3RvcnkuYWRhcHQoCi0JCQkJZWxlbWVudCwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJT2JqZWN0IG9iaiA9IFByb2Nlc3NVdGlsLmdldFJvb3RQcm9jZXNzKGFGYWN0b3J5LCBhZGFwdGVyLCBlbGVtZW50KTsKLQkJcmV0dXJuIChQcm9jZXNzKSBvYmo7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuUmVsYXRpb25TZWN0aW9uI2dldERlc2NyaXB0b3JUYWJOYW1lKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERlc2NyaXB0b3JUYWJOYW1lKCkgewotCQlyZXR1cm4gRmlsdGVyQ29uc3RhbnRzLlJPTEVfREVTQ1JJUFRPUlM7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL1Rhc2tEZXNjcmlwdG9yU3RlcFNlY3Rpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9UYXNrRGVzY3JpcHRvclN0ZXBTZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5ZmFjN2YuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL1Rhc2tEZXNjcmlwdG9yU3RlcFNlY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzOSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5CYXNpY0VMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3ZpZGVycy5WYXJpYWJpbGl0eUVsZW1lbnRMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYXRpb25BcHBsaWNhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuUHJvdmlkZXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklBY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Gb2N1c0FkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Gb2N1c0V2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLkxpc3RTZWxlY3Rpb25EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5Gb3JtVG9vbGtpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLlNlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuVGFiYmVkUHJvcGVydHlTaGVldFBhZ2U7Ci0KLQotLyoqCi0gKiBUaGUgdGFzayBkZXNjcmlwdG9yIC0gc3RlcCBzZWN0aW9uCi0gKiAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4wCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFRhc2tEZXNjcmlwdG9yU3RlcFNlY3Rpb24gZXh0ZW5kcyBBYnN0cmFjdFNlY3Rpb24gewotCi0JcHJvdGVjdGVkIElMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIgPSBuZXcgQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyKAotCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJLmdldE5hdmlnYXRvclZpZXdfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKTsKLQotCXByaXZhdGUgVGFza0Rlc2NyaXB0b3IgZWxlbWVudDsKLQotCXByaXZhdGUgSUFjdGlvbk1hbmFnZXIgYWN0aW9uTWdyOwotCi0JcHJpdmF0ZSBGb3JtVG9vbGtpdCB0b29sa2l0OwotCi0JcHJpdmF0ZSBCdXR0b24gY3RybF9hZGQsIGN0cmxfcmVtb3ZlLCBjdHJsX3VwLCBjdHJsX2Rvd247Ci0KLQlwcml2YXRlIFRhYmxlIGN0cmxfc2VsZWN0ZWQ7Ci0KLQlwcml2YXRlIFRhYmxlVmlld2VyIHZpZXdlcjsKLQotCS8vIHByaXZhdGUgVGV4dCBjdHJsX2JyaWVmX2Rlc2M7Ci0JcHJpdmF0ZSBJbWFnZSB0aXRsZUltYWdlOwotCi0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuQWJzdHJhY3RTZWN0aW9uI2NyZWF0ZUNvbnRyb2xzKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSwgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuVGFiYmVkUHJvcGVydHlTaGVldFBhZ2UpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbHMoQ29tcG9zaXRlIHBhcmVudCwKLQkJCVRhYmJlZFByb3BlcnR5U2hlZXRQYWdlIHRhYmJlZFByb3BlcnR5U2hlZXRQYWdlKSB7Ci0KLQkJc3VwZXIuY3JlYXRlQ29udHJvbHMocGFyZW50LCB0YWJiZWRQcm9wZXJ0eVNoZWV0UGFnZSk7Ci0JCWluaXQoKTsKLQotCQlwYXJlbnQuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQlwYXJlbnQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0KLQkJLy8gY3JlYXRlIHN0ZXBzIHNlY3Rpb24KLQkJY3JlYXRlU3RlcFNlY3Rpb24ocGFyZW50KTsKLQotCQlhZGRMaXN0ZW5lcnMoKTsKLQotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemUKLQkgKgotCSAqLwotCXByaXZhdGUgdm9pZCBpbml0KCkgewotCQkvLyBnZXQgYWN0aXZpdHkgb2JqZWN0Ci0JCWVsZW1lbnQgPSAoVGFza0Rlc2NyaXB0b3IpIGdldEVsZW1lbnQoKTsKLQotCQkvLyBnZXQgdG9vbGtpdAotCQl0b29sa2l0ID0gZ2V0V2lkZ2V0RmFjdG9yeSgpOwotCi0JCS8vIGdldCBhY3Rpb24gbWFuYWdlcgotCQlhY3Rpb25NZ3IgPSBFUEZQcm9wZXJ0eVNoZWV0UGFnZS5nZXRBY3Rpb25NYW5hZ2VyKCk7Ci0JfQotCi0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5BYnN0cmFjdFByb3BlcnR5U2VjdGlvbiNyZWZyZXNoKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWZyZXNoKCkgewotCQl0cnkgewotCQkJaWYgKGdldEVsZW1lbnQoKSBpbnN0YW5jZW9mIFRhc2tEZXNjcmlwdG9yKSB7Ci0JCQkJZWxlbWVudCA9IChUYXNrRGVzY3JpcHRvcikgZ2V0RWxlbWVudCgpOwotCQkJCXZpZXdlci5yZWZyZXNoKCk7Ci0KLQkJCQkvLyBoaWRlL3JlZnJlc2ggY29udHJvbHMKLQkJCQl1cGRhdGVDb250cm9scygpOwotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCWxvZ2dlci5sb2dFcnJvcigiRXJyb3IgcmVmcmVzaGluZyBUYXNrRGVzY3JpcHRvciBzdGVwIHNlY3Rpb24iICsgZWxlbWVudCwgZXgpOyAgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLkFic3RyYWN0U2VjdGlvbiNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlzdXBlci5kaXNwb3NlKCk7Ci0KLQkJaWYgKGxhYmVsUHJvdmlkZXIgIT0gbnVsbCkgewotCQkJbGFiZWxQcm92aWRlci5kaXNwb3NlKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBVcGRhdGUgY29udHJvbHMgYmFzZWQgb24gZWRpdGFibGUgZmxhZy4gQ29udHJvbHMgd2lsbCBiZSBlaXRoZXIgZWRpdGFibGUgCi0JICogb3IgcmVhZC1vbmx5IGFmdGVyIHVwZGF0aW5nIHRoaXMuCi0JICovCi0JcHVibGljIHZvaWQgdXBkYXRlQ29udHJvbHMoKSB7Ci0JCWN0cmxfYWRkLnNldEVuYWJsZWQoZWRpdGFibGUpOwotCQlpZiAoZWxlbWVudC5nZXRUYXNrKCkgPT0gbnVsbCkKLQkJCWN0cmxfYWRkLnNldEVuYWJsZWQoZmFsc2UpOwotCQllbHNlIHsKLQkJCUxpc3Qgc3RlcHMgPSBnZXRTdGVwcygpOwotCQkJaWYgKHN0ZXBzICE9IG51bGwgJiYgc3RlcHMuc2l6ZSgpID4gMCkgCi0JCQkJY3RybF9hZGQuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCWVsc2UgCi0JCQkJY3RybF9hZGQuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCX0KLQkJCi0JCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgdmlld2VyCi0JCQkJLmdldFNlbGVjdGlvbigpOwotCQlpZiAoc2VsZWN0aW9uLnNpemUoKSA+IDAgJiYgZWRpdGFibGUpIHsKLQkJCWN0cmxfcmVtb3ZlLnNldEVuYWJsZWQoZWRpdGFibGUpOwotCQkJY3RybF91cC5zZXRFbmFibGVkKGVkaXRhYmxlKTsKLQkJCWN0cmxfZG93bi5zZXRFbmFibGVkKGVkaXRhYmxlKTsKLQkJfSBlbHNlIHsKLQkJCWN0cmxfcmVtb3ZlLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJY3RybF91cC5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCWN0cmxfZG93bi5zZXRFbmFibGVkKGZhbHNlKTsKLQotCQl9Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIFN0ZXAgc2VjdGlvbiBvbiB0aGUgZ2l2ZW4gY29tcG9zaXRlCi0JICogQHBhcmFtIGNvbXBvc2l0ZQotCSAqLwotCXByaXZhdGUgdm9pZCBjcmVhdGVTdGVwU2VjdGlvbihDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JCS8vIGNyZWF0ZSBzdGVwIHNlY3Rpb24KLQkJU2VjdGlvbiBzdGVwU2VjdGlvbiA9IEZvcm1VSQotCQkJCS5jcmVhdGVTZWN0aW9uKAotCQkJCQkJdG9vbGtpdCwKLQkJCQkJCWNvbXBvc2l0ZSwKLQkJCQkJCVByb3BlcnRpZXNSZXNvdXJjZXMuVGFza0Rlc2NyaXB0b3Jfc3RlcEluZm9ybWF0aW9uVGl0bGUsIAotCQkJCQkJUHJvcGVydGllc1Jlc291cmNlcy5UYXNrRGVzY3JpcHRvcl9zdGVwSW5mb3JtYXRpb25EZXNjcmlwdGlvbik7IAotCi0JCS8vIGNyZWF0ZSBzdGVwIGNvbXBvc2l0ZQotCQlDb21wb3NpdGUgc3RlcENvbXBvc2l0ZSA9IEZvcm1VSS5jcmVhdGVDb21wb3NpdGUodG9vbGtpdCwgc3RlcFNlY3Rpb24sCi0JCQkJMiwgZmFsc2UpOwotCi0JCS8vIGNyZWF0ZSB0YWJsZSBjb21wb3NpdGUKLQkJQ29tcG9zaXRlIHBhbmUxID0gRm9ybVVJLmNyZWF0ZUNvbXBvc2l0ZSh0b29sa2l0LCBzdGVwQ29tcG9zaXRlLAotCQkJCUdyaWREYXRhLkZJTExfQk9USCk7Ci0JCUZvcm1VSS5jcmVhdGVMYWJlbCh0b29sa2l0LCBwYW5lMSwgUHJvcGVydGllc1Jlc291cmNlcy5UYXNrRGVzY3JpcHRvcl9TZWxlY3RlZF9TdGVwcyk7IAotCi0JCWN0cmxfc2VsZWN0ZWQgPSBGb3JtVUkuY3JlYXRlVGFibGUodG9vbGtpdCwgcGFuZTEpOwotCQl2aWV3ZXIgPSBuZXcgVGFibGVWaWV3ZXIoY3RybF9zZWxlY3RlZCk7Ci0KLQkJSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIgY29udGVudFByb3ZpZGVyID0gbmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKAotCQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpIHsKLQkJCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGVsZW1lbnQuZ2V0U2VsZWN0ZWRTdGVwcygpLnRvQXJyYXkoKTsKLQkJCX0KLQkJfTsKLQotCQl2aWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKGNvbnRlbnRQcm92aWRlcik7Ci0JCXZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKGxhYmVsUHJvdmlkZXIpOwotCQl2aWV3ZXIuc2V0SW5wdXQoZWxlbWVudCk7Ci0KLQkJLy8gY3JlYXRlIGJ1dHRvbiBjb21wb3NpdGUKLQkJQ29tcG9zaXRlIHBhbmUyID0gRm9ybVVJLmNyZWF0ZUNvbXBvc2l0ZSh0b29sa2l0LCBzdGVwQ29tcG9zaXRlLAotCQkJCUdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0NFTlRFUgotCQkJCQkJfCBHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0NFTlRFUik7Ci0KLQkJLy8gY3JlYXRlIGJ1dHRvbnMKLQkJY3RybF9hZGQgPSBGb3JtVUkuY3JlYXRlQnV0dG9uKHRvb2xraXQsIHBhbmUyLCBQcm9wZXJ0aWVzUmVzb3VyY2VzLlByb2Nlc3NfQWRkKTsKLQkJY3RybF9hZGQuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCWN0cmxfcmVtb3ZlID0gRm9ybVVJLmNyZWF0ZUJ1dHRvbih0b29sa2l0LCBwYW5lMiwgUHJvcGVydGllc1Jlc291cmNlcy5Qcm9jZXNzX1JlbW92ZSk7IAotCQljdHJsX3JlbW92ZS5zZXRFbmFibGVkKGZhbHNlKTsKLQkJY3RybF91cCA9IEZvcm1VSS5jcmVhdGVCdXR0b24odG9vbGtpdCwgcGFuZTIsIFByb3BlcnRpZXNSZXNvdXJjZXMuUHJvY2Vzc19VcCk7IAotCQljdHJsX2Rvd24gPSBGb3JtVUkuY3JlYXRlQnV0dG9uKHRvb2xraXQsIHBhbmUyLCBQcm9wZXJ0aWVzUmVzb3VyY2VzLlByb2Nlc3NfRG93bik7IAotCi0JCWlmIChlbGVtZW50LmdldFRhc2soKSAhPSBudWxsKSB7Ci0JCQlMaXN0IHN0ZXBzID0gZ2V0U3RlcHMoKTsKLQkJCWlmIChzdGVwcyAhPSBudWxsICYmIHN0ZXBzLnNpemUoKSA+IDApIHsKLQkJCQljdHJsX2FkZC5zZXRFbmFibGVkKHRydWUpOwotCQkJfQotCQl9Ci0JCS8vIGNyZWF0ZSBicmllZiBkZXNjcmlwdGlvbgotCQkvLyBpbnQgaGVpZ2h0SGludCA9IDQwOwotCQkvLyBpbnQgaG9yaXpvbnRhbFNwYW4gPSAyOwotCQkvLyBMYWJlbCBsYWJlbCA9IEZvcm1VSS5jcmVhdGVMYWJlbCh0b29sa2l0LCBzdGVwQ29tcG9zaXRlLAotCQkvLyBQcm9wZXJ0aWVzUmVzb3VyY2VzLmdldFN0cmluZygiUHJvY2Vzcy5icmllZkRlc2NyaXB0aW9uIiksCi0JCS8vIGhlaWdodEhpbnQpOwotCQkvLyBjdHJsX2JyaWVmX2Rlc2MgPSBGb3JtVUkuY3JlYXRlVGV4dCh0b29sa2l0LCBzdGVwQ29tcG9zaXRlLAotCQkvLyBoZWlnaHRIaW50LCBoZWlnaHRIaW50KTsKLQkJLy8gY3RybF9icmllZl9kZXNjLnNldEVkaXRhYmxlKGZhbHNlKTsKLQkJLy8JCQotCQl0b29sa2l0LnBhaW50Qm9yZGVyc0ZvcihzdGVwQ29tcG9zaXRlKTsKLQkJdG9vbGtpdC5wYWludEJvcmRlcnNGb3IocGFuZTEpOwotCi0JfQotCi0JLyoqCi0JICogQWRkIGxpc3RlbmVycwotCSAqLwotCXByaXZhdGUgdm9pZCBhZGRMaXN0ZW5lcnMoKSB7Ci0JCS8vIEFkZCBmb2N1cyBsaXN0ZW5lciBvbiBwcmltYXJ5IHRhc2tzIGxpc3QKLQkJY3RybF9zZWxlY3RlZC5hZGRGb2N1c0xpc3RlbmVyKG5ldyBGb2N1c0FkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBmb2N1c0dhaW5lZChGb2N1c0V2ZW50IGUpIHsKLQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHZpZXdlcgotCQkJCQkJLmdldFNlbGVjdGlvbigpOwotCQkJCWlmICgoc2VsZWN0aW9uLnNpemUoKSA+IDApICYmIGVkaXRhYmxlKSB7Ci0JCQkJCWN0cmxfcmVtb3ZlLnNldEVuYWJsZWQoZWRpdGFibGUpOwotCQkJCQljdHJsX3VwLnNldEVuYWJsZWQoZWRpdGFibGUpOwotCQkJCQljdHJsX2Rvd24uc2V0RW5hYmxlZChlZGl0YWJsZSk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQotCQl2aWV3ZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewotCi0JCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgdmlld2VyCi0JCQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJaWYgKChzZWxlY3Rpb24uc2l6ZSgpID4gMCkgJiYgZWRpdGFibGUpIHsKLQkJCQkJY3RybF9yZW1vdmUuc2V0RW5hYmxlZCh0cnVlKTsKLQotCQkJCQlpZiAodmlld2VyLmdldFRhYmxlKCkuZ2V0U2VsZWN0aW9uSW5kZXgoKSA+IDAKLQkJCQkJCQkmJiBzZWxlY3Rpb24uc2l6ZSgpID09IDEpIHsKLQkJCQkJCWN0cmxfdXAuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQkJfSBlbHNlCi0JCQkJCQljdHJsX3VwLnNldEVuYWJsZWQoZmFsc2UpOwotCi0JCQkJCWlmICh2aWV3ZXIuZ2V0VGFibGUoKS5nZXRTZWxlY3Rpb25JbmRleCgpIDwgdmlld2VyCi0JCQkJCQkJLmdldFRhYmxlKCkuZ2V0SXRlbUNvdW50KCkgLSAxCi0JCQkJCQkJJiYgc2VsZWN0aW9uLnNpemUoKSA9PSAxKSB7Ci0JCQkJCQljdHJsX2Rvd24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQkJfSBlbHNlCi0JCQkJCQljdHJsX2Rvd24uc2V0RW5hYmxlZChmYWxzZSk7Ci0KLQkJCQl9Ci0KLQkJCQlpZiAoc2VsZWN0aW9uLnNpemUoKSA9PSAxKSB7Ci0JCQkJCVN0cmluZyBkZXNjID0gKChNZXRob2RFbGVtZW50KSBzZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCkpCi0JCQkJCQkJLmdldEJyaWVmRGVzY3JpcHRpb24oKTsKLQkJCQkJaWYgKGRlc2MgPT0gbnVsbCkgewotCQkJCQkJZGVzYyA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQkJLy8gY3RybF9icmllZl9kZXNjLnNldFRleHQoZGVzYyk7Ci0JCQkJfSBlbHNlIGlmIChzZWxlY3Rpb24uc2l6ZSgpID4gMSkgewotCQkJCQkvLyBjdHJsX2JyaWVmX2Rlc2Muc2V0VGV4dChQcm9wZXJ0aWVzUmVzb3VyY2VzLmdldFN0cmluZygiUHJvY2Vzcy5NdWx0aXBsZVNlbGVjdGlvbiIpCi0JCQkJCS8vICsgIiAtICIgKyBzZWxlY3Rpb24uc2l6ZSgpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JCWN0cmxfYWRkLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCUlTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyIHN0ZXBDb250ZW50UHJvdmlkZXIgPSBuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoCi0JCQkJCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkJCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpIHsKLQkJCQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBvYmplY3QpIHsKLQotCQkJCQkJcmV0dXJuIGdldFN0ZXBzKCkudG9BcnJheSgpOwotLy8JCQkJCQkvLyBnZXQgYWxsIHN0ZXBzCi0vLwkJCQkJCUlDb25maWd1cmF0aW9uQXBwbGljYXRvciBjb25maWdBcHBsaWNhdG9yID0gUHJvdmlkZXJzCi0vLwkJCQkJCQkJLmdldENvbmZpZ3VyYXRpb25BcHBsaWNhdG9yKCk7Ci0vLwkJCQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gVG5nVXRpbC5nZXRPd25pbmdQcm9jZXNzKAotLy8JCQkJCQkJCWVsZW1lbnQpLmdldERlZmF1bHRDb250ZXh0KCk7Ci0vLwkJCQkJCUxpc3Qgc3RlcHMgPSAoTGlzdCkgY29uZmlnQXBwbGljYXRvci5nZXRSZWZlcmVuY2UoCi0vLwkJCQkJCQkJZWxlbWVudC5nZXRUYXNrKCksIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0vLwkJCQkJCQkJCQkuZ2V0VGFza19TdGVwcygpLCBjb25maWcpOwotLy8KLS8vCQkJCQkJLy8gcmVtb3ZlIGFscmVhZHkgZXhpc3Rpbmcgc3RlcHMKLS8vCQkJCQkJc3RlcHMucmVtb3ZlQWxsKGVsZW1lbnQuZ2V0U2VsZWN0ZWRTdGVwcygpKTsKLS8vCQkJCQkJcmV0dXJuIHN0ZXBzLnRvQXJyYXkoKTsKLQkJCQkJfQotCQkJCX07Ci0KLQkJCQlJTGFiZWxQcm92aWRlciBzdGVwTGFiZWxQcm92aWRlciA9IG5ldyBWYXJpYWJpbGl0eUVsZW1lbnRMYWJlbFByb3ZpZGVyKAotCQkJCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJCQkJLmdldE5hdmlnYXRvclZpZXdfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKSB7Ci0KLQkJCQkJcHVibGljIGJvb2xlYW4gaXNFeHRlcm5hbChPYmplY3Qgb2JqKSB7Ci0KLQkJCQkJCWJvb2xlYW4gZmxhZyA9ICFlbGVtZW50LmdldFRhc2soKS5nZXRQcmVzZW50YXRpb24oKQotCQkJCQkJCQkuZ2V0U2VjdGlvbnMoKS5jb250YWlucyhvYmopOwotCQkJCQkJcmV0dXJuIGZsYWc7Ci0JCQkJCX0KLQkJCQl9OwotCi0JCQkJTGlzdFNlbGVjdGlvbkRpYWxvZyBkbGcgPSBuZXcgTGlzdFNlbGVjdGlvbkRpYWxvZyhQbGF0Zm9ybVVJCi0JCQkJCQkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0U2hlbGwoKSwKLQkJCQkJCWVsZW1lbnQuZ2V0VGFzaygpLCBzdGVwQ29udGVudFByb3ZpZGVyLAotCQkJCQkJc3RlcExhYmVsUHJvdmlkZXIsIFByb3BlcnRpZXNSZXNvdXJjZXMuVGFza0Rlc2NyaXB0b3JfU3RlcERpYWxvZ01lc3NhZ2UpOyAKLQkJCQl0aXRsZUltYWdlID0gRGlzcGxheS5nZXRDdXJyZW50KCkuZ2V0QWN0aXZlU2hlbGwoKS5nZXRJbWFnZSgpOwotCQkJCUxpc3RTZWxlY3Rpb25EaWFsb2cuc2V0RGVmYXVsdEltYWdlKHRpdGxlSW1hZ2UpOwotCQkJCWRsZy5zZXRUaXRsZShQcm9wZXJ0aWVzUmVzb3VyY2VzLlRhc2tEZXNjcmlwdG9yX1N0ZXBEaWFsb2dUaXRsZSk7Ci0JCQkJZGxnLnNldEJsb2NrT25PcGVuKHRydWUpOwotCQkJCWRsZy5vcGVuKCk7Ci0KLQkJCQlhZGRTdGVwcyhkbGcuZ2V0UmVzdWx0KCkpOwotCQkJCQotCQkJCS8vIGVuYWJsZS9kaXNhYmxlIGFkZCBidXR0b24KLQkJCQlMaXN0IHN0ZXBzID0gZ2V0U3RlcHMoKTsKLQkJCQlpZiAoc3RlcHMgIT0gbnVsbCAmJiBzdGVwcy5zaXplKCkgPiAwKSAKLQkJCQkJY3RybF9hZGQuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQllbHNlIAotCQkJCQljdHJsX2FkZC5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQkKLQkJCQl2aWV3ZXIucmVmcmVzaCgpOwotCQkJfQotCQl9KTsKLQotCQljdHJsX3JlbW92ZS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHZpZXdlcgotCQkJCQkJLmdldFNlbGVjdGlvbigpOwotCQkJCWlmIChzZWxlY3Rpb24uc2l6ZSgpID4gMCkgewotCQkJCQkvLyB1cGRhdGUgdGhlIG1vZGVsCi0JCQkJCUFycmF5TGlzdCBybUl0ZW1zID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQlybUl0ZW1zLmFkZEFsbChzZWxlY3Rpb24udG9MaXN0KCkpOwotCQkJCQlyZW1vdmVTdGVwcyhybUl0ZW1zKTsKLQkJCQkJdmlld2VyLnJlZnJlc2goKTsKLQotCQkJCQkvLyBjbGVhciB0aGUgc2VsZWN0aW9uCi0JCQkJCXZpZXdlci5zZXRTZWxlY3Rpb24obnVsbCwgdHJ1ZSk7Ci0JCQkJCS8vIGN0cmxfYnJpZWZfZGVzYy5zZXRUZXh0KCIiKTsKLQkJCQl9Ci0JCQkJLy8gY3RybF9yZW1vdmUuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJCi0JCQkJLy8gZW5hYmxlL2Rpc2FibGUgYWRkIGJ1dHRvbgotCQkJCUxpc3Qgc3RlcHMgPSBnZXRTdGVwcygpOwotCQkJCWlmIChzdGVwcyAhPSBudWxsICYmIHN0ZXBzLnNpemUoKSA+IDApIAotCQkJCQljdHJsX2FkZC5zZXRFbmFibGVkKHRydWUpOwotCQkJCWVsc2UgCi0JCQkJCWN0cmxfYWRkLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJfQotCQl9KTsKLQotCQljdHJsX3VwLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCUFycmF5TGlzdCBzdGVwcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHZpZXdlcgotCQkJCQkJLmdldFNlbGVjdGlvbigpOwotCQkJCWlmIChzZWxlY3Rpb24uc2l6ZSgpID4gMCkgewotCQkJCQlBcnJheUxpc3QgaXRlbXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCWl0ZW1zLmFkZEFsbChzZWxlY3Rpb24udG9MaXN0KCkpOwotCQkJCQlCYXNpY0VMaXN0IHN0ZXBMaXN0ID0gKEJhc2ljRUxpc3QpIGVsZW1lbnQKLQkJCQkJCQkuZ2V0U2VsZWN0ZWRTdGVwcygpOwotCi0JCQkJCWZvciAoSXRlcmF0b3IgaXQgPSBpdGVtcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlPYmplY3Qgb2JqZWN0ID0gaXQubmV4dCgpOwotCQkJCQkJaW50IGluZGV4ID0gc3RlcExpc3QuaW5kZXhPZihvYmplY3QpOwotCQkJCQkJaWYgKGluZGV4ID4gMCkKLQkJCQkJCQlzdGVwTGlzdC5tb3ZlKGluZGV4IC0gMSwgb2JqZWN0KTsKLQotCQkJCQl9Ci0JCQkJCXN0ZXBzLmFkZEFsbChzdGVwTGlzdCk7Ci0JCQkJCS8vIFRPRE8gLSB3cml0ZSBhIGNvbW1hbmQuIAotCQkJCQkvLyBhY3RpdmF0ZSBkaXJ0eSBmbGFnCi0JCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5SRU1PVkVfTUFOWSwgZWxlbWVudCwKLQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJLmdldFRhc2tEZXNjcmlwdG9yX1NlbGVjdGVkU3RlcHMoKSwKLQkJCQkJCQlzdGVwTGlzdCwgLTEpOwotCQkJCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuQUREX01BTlksIGVsZW1lbnQsCi0JCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCS5nZXRUYXNrRGVzY3JpcHRvcl9TZWxlY3RlZFN0ZXBzKCksIHN0ZXBzLAotCQkJCQkJCS0xKTsKLQotCQkJCQl2aWV3ZXIucmVmcmVzaCgpOwotCQkJCX0KLQotCQkJCWlmICh2aWV3ZXIuZ2V0VGFibGUoKS5nZXRTZWxlY3Rpb25JbmRleCgpID4gMCAmJiBlZGl0YWJsZSkKLQkJCQkJY3RybF91cC5zZXRFbmFibGVkKHRydWUpOwotCQkJCWVsc2UKLQkJCQkJY3RybF91cC5zZXRFbmFibGVkKGZhbHNlKTsKLQotCQkJCWlmICh2aWV3ZXIuZ2V0VGFibGUoKS5nZXRTZWxlY3Rpb25JbmRleCgpIDwgdmlld2VyLmdldFRhYmxlKCkKLQkJCQkJCS5nZXRJdGVtQ291bnQoKSAtIDEKLQkJCQkJCSYmIGVkaXRhYmxlKQotCQkJCQljdHJsX2Rvd24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQllbHNlCi0JCQkJCWN0cmxfZG93bi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCX0KLQotCQl9KTsKLQotCQljdHJsX2Rvd24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJQXJyYXlMaXN0IHN0ZXBzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgdmlld2VyCi0JCQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJaWYgKHNlbGVjdGlvbi5zaXplKCkgPiAwKSB7Ci0JCQkJCUFycmF5TGlzdCBpdGVtcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJaXRlbXMuYWRkQWxsKHNlbGVjdGlvbi50b0xpc3QoKSk7Ci0JCQkJCUJhc2ljRUxpc3Qgc3RlcExpc3QgPSAoQmFzaWNFTGlzdCkgZWxlbWVudAotCQkJCQkJCS5nZXRTZWxlY3RlZFN0ZXBzKCk7Ci0KLQkJCQkJZm9yIChJdGVyYXRvciBpdCA9IGl0ZW1zLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQkJCU9iamVjdCBvYmplY3QgPSBpdC5uZXh0KCk7Ci0JCQkJCQlpbnQgaW5kZXggPSBzdGVwTGlzdC5pbmRleE9mKG9iamVjdCk7Ci0KLQkJCQkJCWlmIChpbmRleCA8IHN0ZXBMaXN0LnNpemUoKSAtIDEpCi0JCQkJCQkJc3RlcExpc3QubW92ZShpbmRleCArIGl0ZW1zLnNpemUoKSwgb2JqZWN0KTsKLQotCQkJCQl9Ci0JCQkJCXN0ZXBzLmFkZEFsbChzdGVwTGlzdCk7Ci0KLQkJCQkJLy8gVE9ETyAtIHdyaXRlIGEgY21tYW5kLiBIYWNraW5nIGl0IGZvciBub3cgdG8gYWN0aXZhdGUKLQkJCQkJLy8gZGlydHkgZmxhZwotCQkJCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuUkVNT1ZFX01BTlksIGVsZW1lbnQsCi0JCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCS5nZXRUYXNrRGVzY3JpcHRvcl9TZWxlY3RlZFN0ZXBzKCksCi0JCQkJCQkJc3RlcExpc3QsIC0xKTsKLQkJCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLkFERF9NQU5ZLCBlbGVtZW50LAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkuZ2V0VGFza0Rlc2NyaXB0b3JfU2VsZWN0ZWRTdGVwcygpLCBzdGVwcywKLQkJCQkJCQktMSk7Ci0KLQkJCQkJdmlld2VyLnJlZnJlc2goKTsKLQkJCQl9Ci0KLQkJCQlpZiAodmlld2VyLmdldFRhYmxlKCkuZ2V0U2VsZWN0aW9uSW5kZXgoKSA+IDAgJiYgZWRpdGFibGUpCi0JCQkJCWN0cmxfdXAuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQllbHNlCi0JCQkJCWN0cmxfdXAuc2V0RW5hYmxlZChmYWxzZSk7Ci0KLQkJCQlpZiAodmlld2VyLmdldFRhYmxlKCkuZ2V0U2VsZWN0aW9uSW5kZXgoKSA8IHZpZXdlci5nZXRUYWJsZSgpCi0JCQkJCQkuZ2V0SXRlbUNvdW50KCkgLSAxCi0JCQkJCQkmJiBlZGl0YWJsZSkKLQkJCQkJY3RybF9kb3duLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJZWxzZQotCQkJCQljdHJsX2Rvd24uc2V0RW5hYmxlZChmYWxzZSk7Ci0KLQkJCX0KLQotCQl9KTsKLQl9Ci0KLQkvKioKLQkgKiBBc3NpZ24gU3RlcHMgdG8gdGFzayBkZXNjcmlwdG9yCi0JICogQHBhcmFtIGFkZEl0ZW1zCi0JICogCQkJTGlzdCBvZiBzdGVwcwotCSAqLwotCXByaXZhdGUgdm9pZCBhZGRTdGVwcyhPYmplY3RbXSBhZGRJdGVtcykgewotCQkvLyB1cGRhdGUgdGhlIG1vZGVsCi0JCWlmIChhZGRJdGVtcyAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGFkZEl0ZW1zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5TZWN0aW9uIGl0ZW0gPSAob3JnLmVjbGlwc2UuZXBmLnVtYS5TZWN0aW9uKSBhZGRJdGVtc1tpXTsKLQotCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5BREQsIGVsZW1lbnQsCi0JCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrRGVzY3JpcHRvcl9TZWxlY3RlZFN0ZXBzKCksCi0JCQkJCQlpdGVtLCAtMSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgYXNzaWduZWQgc3RlcHMgZm9yIHRoZSB0YXNrIGRlc2NyaXB0b3IKLQkgKiBAcGFyYW0gcm1JdGVtcwotCSAqIAkJCUxpc3Qgb2Ygc3RlcHMgCi0JICovCi0JcHJpdmF0ZSB2b2lkIHJlbW92ZVN0ZXBzKExpc3Qgcm1JdGVtcykgewotCQkvLyB1cGRhdGUgdGhlIG1vZGVsCi0JCWlmICghcm1JdGVtcy5pc0VtcHR5KCkpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBybUl0ZW1zLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlvcmcuZWNsaXBzZS5lcGYudW1hLlNlY3Rpb24gaXRlbSA9IChvcmcuZWNsaXBzZS5lcGYudW1hLlNlY3Rpb24pIGl0Lm5leHQoKTsKLQotCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5SRU1PVkUsIGVsZW1lbnQsCi0JCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrRGVzY3JpcHRvcl9TZWxlY3RlZFN0ZXBzKCksCi0JCQkJCQlpdGVtLCAtMSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogR2V0IHN0ZXBzIHRoYXQgY291bGQgYmUgYXNzaWduZWQgdG8gdGhpcyB0YXNrIGRlc2NyaXB0b3IKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBMaXN0IGdldFN0ZXBzKCl7Ci0JCS8vCWdldCBhbGwgc3RlcHMKLQkJSUNvbmZpZ3VyYXRpb25BcHBsaWNhdG9yIGNvbmZpZ0FwcGxpY2F0b3IgPSBQcm92aWRlcnMKLQkJCQkuZ2V0Q29uZmlndXJhdGlvbkFwcGxpY2F0b3IoKTsKLQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSBUbmdVdGlsLmdldE93bmluZ1Byb2Nlc3MoCi0JCQkJZWxlbWVudCkuZ2V0RGVmYXVsdENvbnRleHQoKTsKLQkJTGlzdCBzdGVwcyA9IChMaXN0KSBjb25maWdBcHBsaWNhdG9yLmdldFJlZmVyZW5jZSgKLQkJCQllbGVtZW50LmdldFRhc2soKSwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCS5nZXRUYXNrX1N0ZXBzKCksIGNvbmZpZyk7Ci0KLQkJLy8gcmVtb3ZlIGFscmVhZHkgZXhpc3Rpbmcgc3RlcHMKLQkJc3RlcHMucmVtb3ZlQWxsKGVsZW1lbnQuZ2V0U2VsZWN0ZWRTdGVwcygpKTsKLQkJcmV0dXJuIHN0ZXBzOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvVGFza0Rlc2NyaXB0b3JXb3JrUHJvZHVjdFNlY3Rpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9UYXNrRGVzY3JpcHRvcldvcmtQcm9kdWN0U2VjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOGMxYjFjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9UYXNrRGVzY3JpcHRvcldvcmtQcm9kdWN0U2VjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQ0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5maWx0ZXJzLkRlc2NyaXB0b3JQcm9jZXNzRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZmlsdGVycy5Qcm9jZXNzV29ya1Byb2R1Y3RGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklBY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuRmlsdGVyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kLkFzc2lnbldQVG9UYXNrRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZC5JQWN0aW9uVHlwZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuUHJvY2Vzc1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuVGFiYmVkUHJvcGVydHlTaGVldFBhZ2U7Ci0KLQotLyoqCi0gKiBUaGUgdGFzayBkZXNjcmlwdG9yIC0gd29yayBwcm9kdWN0IHNlY3Rpb24KLSAqIAotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjAKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgVGFza0Rlc2NyaXB0b3JXb3JrUHJvZHVjdFNlY3Rpb24gZXh0ZW5kcyBSZWxhdGlvblNlY3Rpb24gewotCXByaXZhdGUgSUZpbHRlciBmaWx0ZXIgPSBudWxsOwotCi0JLyoqCi0JICogR2V0IHByb2Nlc3Mgd29yayBwcm9kdWN0IGZpbHRlcgotCSAqLwotCXB1YmxpYyBJRmlsdGVyIGdldEZpbHRlcigpIHsKLQkJaWYgKGZpbHRlciA9PSBudWxsKSB7Ci0JCQlmaWx0ZXIgPSBuZXcgUHJvY2Vzc1dvcmtQcm9kdWN0RmlsdGVyKGdldENvbmZpZ3VyYXRpb24oKSwgbnVsbCwKLQkJCQkJRmlsdGVyQ29uc3RhbnRzLldPUktQUk9EVUNUUyk7Ci0JCX0KLQkJcmV0dXJuIGZpbHRlcjsKLQl9Ci0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLlJlbGF0aW9uU2VjdGlvbiNjcmVhdGVDb250cm9scyhvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUsIG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLlRhYmJlZFByb3BlcnR5U2hlZXRQYWdlKQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2xzKENvbXBvc2l0ZSBwYXJlbnQsCi0JCQlUYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZSB0YWJiZWRQcm9wZXJ0eVNoZWV0UGFnZSkgewotCi0JCXN1cGVyLmNyZWF0ZUNvbnRyb2xzKHBhcmVudCwgdGFiYmVkUHJvcGVydHlTaGVldFBhZ2UpOwotCi0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuUmVsYXRpb25TZWN0aW9uI2luaXRDb250ZW50UHJvdmlkZXIxKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0Q29udGVudFByb3ZpZGVyMSgpIHsKLQkJY29udGVudFByb3ZpZGVyID0gbmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKGdldEFkYXB0ZXJGYWN0b3J5KCkpIHsKLQkJCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGdldEZpbHRlcmVkTGlzdCgKLQkJCQkJCSgoVGFza0Rlc2NyaXB0b3IpIGVsZW1lbnQpLmdldE1hbmRhdG9yeUlucHV0KCkpCi0JCQkJCQkudG9BcnJheSgpOwotCQkJfQotCQl9OwotCQl0YWJsZVZpZXdlcjEuc2V0Q29udGVudFByb3ZpZGVyKGNvbnRlbnRQcm92aWRlcik7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuUmVsYXRpb25TZWN0aW9uI2luaXRDb250ZW50UHJvdmlkZXIyKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0Q29udGVudFByb3ZpZGVyMigpIHsKLQkJY29udGVudFByb3ZpZGVyID0gbmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKGdldEFkYXB0ZXJGYWN0b3J5KCkpIHsKLQkJCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGdldEZpbHRlcmVkTGlzdCgKLQkJCQkJCSgoVGFza0Rlc2NyaXB0b3IpIGVsZW1lbnQpLmdldE9wdGlvbmFsSW5wdXQoKSkKLQkJCQkJCS50b0FycmF5KCk7Ci0JCQl9Ci0JCX07Ci0JCXRhYmxlVmlld2VyMi5zZXRDb250ZW50UHJvdmlkZXIoY29udGVudFByb3ZpZGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5SZWxhdGlvblNlY3Rpb24jaW5pdENvbnRlbnRQcm92aWRlcjMoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRDb250ZW50UHJvdmlkZXIzKCkgewotCQljb250ZW50UHJvdmlkZXIgPSBuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoZ2V0QWRhcHRlckZhY3RvcnkoKSkgewotCQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gZ2V0RmlsdGVyZWRMaXN0KAotCQkJCQkJKChUYXNrRGVzY3JpcHRvcikgZWxlbWVudCkuZ2V0RXh0ZXJuYWxJbnB1dCgpKQotCQkJCQkJLnRvQXJyYXkoKTsKLQkJCX0KLQkJfTsKLQkJdGFibGVWaWV3ZXIzLnNldENvbnRlbnRQcm92aWRlcihjb250ZW50UHJvdmlkZXIpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLlJlbGF0aW9uU2VjdGlvbiNpbml0Q29udGVudFByb3ZpZGVyNCgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdENvbnRlbnRQcm92aWRlcjQoKSB7Ci0JCWNvbnRlbnRQcm92aWRlciA9IG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcihnZXRBZGFwdGVyRmFjdG9yeSgpKSB7Ci0JCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IG9iamVjdCkgewotCQkJCXJldHVybiBnZXRGaWx0ZXJlZExpc3QoKChUYXNrRGVzY3JpcHRvcikgZWxlbWVudCkuZ2V0T3V0cHV0KCkpCi0JCQkJCQkudG9BcnJheSgpOwotCQkJfQotCQl9OwotCQl0YWJsZVZpZXdlcjQuc2V0Q29udGVudFByb3ZpZGVyKGNvbnRlbnRQcm92aWRlcik7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuUmVsYXRpb25TZWN0aW9uI2luaXQoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXQoKSB7Ci0JCXN1cGVyLmluaXQoKTsKLQotCQlsYWJlbFByb3ZpZGVyID0gbmV3IEFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcigKLQkJCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRS5nZXRQQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKTsKLQotCQlpbnQgbnVtT2ZUYWJsZXMgPSA0OwotCQlzZXRUYWJEYXRhKFByb3BlcnRpZXNSZXNvdXJjZXMuVGFza0Rlc2NyaXB0b3JfV29ya1Byb2R1Y3RzX1NlY3Rpb25UaXRsZSwKLQkJCQlQcm9wZXJ0aWVzUmVzb3VyY2VzLlRhc2tEZXNjcmlwdG9yX1dvcmtQcm9kdWN0c19TZWN0aW9uRGVzY3JpcHRpb24sCi0JCQkJUHJvcGVydGllc1Jlc291cmNlcy5UYXNrRGVzY3JpcHRvcl9Xb3JrUHJvZHVjdHNfVGFibGUxLAotCQkJCVByb3BlcnRpZXNSZXNvdXJjZXMuVGFza0Rlc2NyaXB0b3JfV29ya1Byb2R1Y3RzX1RhYmxlMiwKLQkJCQlQcm9wZXJ0aWVzUmVzb3VyY2VzLlRhc2tEZXNjcmlwdG9yX1dvcmtQcm9kdWN0c19UYWJsZTMsCi0JCQkJUHJvcGVydGllc1Jlc291cmNlcy5UYXNrRGVzY3JpcHRvcl9Xb3JrUHJvZHVjdHNfVGFibGU0LAotCQkJCUZpbHRlckNvbnN0YW50cy5XT1JLUFJPRFVDVFMpOwotCQkKLQkJYm9vbGVhbltdIGNoYW5nZXNBbGxvd2VkID0geyB0cnVlLCB0cnVlLCB0cnVlLCB0cnVlIH07Ci0JCXNldFRhYmxlRGF0YShudW1PZlRhYmxlcywgY2hhbmdlc0FsbG93ZWQpOwotCi0JfQotCi0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5SZWxhdGlvblNlY3Rpb24jcmVmcmVzaCgpCi0JICovCi0JcHVibGljIHZvaWQgcmVmcmVzaCgpIHsKLQkJaWYgKGdldEVsZW1lbnQoKSBpbnN0YW5jZW9mIFRhc2tEZXNjcmlwdG9yKSB7Ci0JCQllbGVtZW50ID0gKFRhc2tEZXNjcmlwdG9yKSBnZXRFbGVtZW50KCk7Ci0JCX0KLQkJc3VwZXIucmVmcmVzaCgpOwotCX0KLQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuUmVsYXRpb25TZWN0aW9uI2dldERlc2NyaXB0b3JzRnJvbVByb2Nlc3MoKQotCSAqLwotCXByb3RlY3RlZCBMaXN0IGdldERlc2NyaXB0b3JzRnJvbVByb2Nlc3MoKSB7Ci0JCUxpc3QgaXRlbXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXJldHVybiBQcm9jZXNzVXRpbC5nZXRFbGVtZW50c0luU2NvcGUoZ2V0QWRhcHRlckZhY3RvcnkoKSwgZWxlbWVudCwKLQkJCQlXb3JrUHJvZHVjdERlc2NyaXB0b3IuY2xhc3MsIGl0ZW1zKTsKLQl9Ci0KLQlwcml2YXRlIExpc3QgZ2V0V29ya1Byb2R1Y3RzKExpc3QgaXRlbXMpIHsKLQkJTGlzdCB3cExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWlmICghaXRlbXMuaXNFbXB0eSgpKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLnNpemUoKTsgaSsrKSB7Ci0JCQkJd3BMaXN0LmFkZCgoKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgaXRlbXMuZ2V0KGkpKQotCQkJCQkJLmdldFdvcmtQcm9kdWN0KCkpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHdwTGlzdDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5SZWxhdGlvblNlY3Rpb24jYWRkSXRlbXMxKGphdmEudXRpbC5MaXN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEl0ZW1zMShMaXN0IGl0ZW1zKSB7Ci0JCWlmICghaXRlbXMuaXNFbXB0eSgpKSB7Ci0JCQlMaXN0IGVsZW1lbnRMaXN0ID0gZ2V0V29ya1Byb2R1Y3RzKCgoVGFza0Rlc2NyaXB0b3IpIGVsZW1lbnQpCi0JCQkJCS5nZXRPcHRpb25hbElucHV0KCkpOwotCQkJZWxlbWVudExpc3QuYWRkQWxsKGdldFdvcmtQcm9kdWN0cygoKFRhc2tEZXNjcmlwdG9yKSBlbGVtZW50KQotCQkJCQkuZ2V0RXh0ZXJuYWxJbnB1dCgpKSk7Ci0JCQlMaXN0IG5ld0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLnNpemUoKTsgaSsrKSB7Ci0JCQkJT2JqZWN0IG9iaiA9IGl0ZW1zLmdldChpKTsKLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgV29ya1Byb2R1Y3QpIHsKLQkJCQkJV29ya1Byb2R1Y3Qgd3AgPSAoV29ya1Byb2R1Y3QpIG9iajsKLQkJCQkJaWYgKCFlbGVtZW50TGlzdC5jb250YWlucyh3cCkpCi0JCQkJCQluZXdMaXN0LmFkZCh3cCk7Ci0JCQkJfQotCQkJfQotCQkJaWYgKG5ld0xpc3Quc2l6ZSgpID4gMCkgewotCQkJCUFzc2lnbldQVG9UYXNrRGVzY3JpcHRvciBjbWQgPSBuZXcgQXNzaWduV1BUb1Rhc2tEZXNjcmlwdG9yKAotCQkJCQkJKFRhc2tEZXNjcmlwdG9yKSBlbGVtZW50LCBuZXdMaXN0LAotCQkJCQkJSUFjdGlvblR5cGVDb25zdGFudHMuQUREX01BTkRBVE9SWV9JTlBVVCwKLQkJCQkJCWdldENvbmZpZ3VyYXRpb24oKSk7Ci0JCQkJYWN0aW9uTWdyLmV4ZWN1dGUoY21kKTsKLQkJCX0KLQkJfQotCX07Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5SZWxhdGlvblNlY3Rpb24jYWRkSXRlbXMyKGphdmEudXRpbC5MaXN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEl0ZW1zMihMaXN0IGl0ZW1zKSB7Ci0JCWlmICghaXRlbXMuaXNFbXB0eSgpKSB7Ci0JCQlMaXN0IGVsZW1lbnRMaXN0ID0gZ2V0V29ya1Byb2R1Y3RzKCgoVGFza0Rlc2NyaXB0b3IpIGVsZW1lbnQpCi0JCQkJCS5nZXRNYW5kYXRvcnlJbnB1dCgpKTsKLQkJCWVsZW1lbnRMaXN0LmFkZEFsbChnZXRXb3JrUHJvZHVjdHMoKChUYXNrRGVzY3JpcHRvcikgZWxlbWVudCkKLQkJCQkJLmdldEV4dGVybmFsSW5wdXQoKSkpOwotCi0JCQlMaXN0IG5ld0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLnNpemUoKTsgaSsrKSB7Ci0JCQkJT2JqZWN0IG9iaiA9IGl0ZW1zLmdldChpKTsKLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgV29ya1Byb2R1Y3QpIHsKLQkJCQkJV29ya1Byb2R1Y3Qgd3AgPSAoV29ya1Byb2R1Y3QpIG9iajsKLQkJCQkJaWYgKCFlbGVtZW50TGlzdC5jb250YWlucyh3cCkpCi0JCQkJCQluZXdMaXN0LmFkZCh3cCk7Ci0JCQkJfQotCQkJfQotCi0JCQlpZiAobmV3TGlzdC5zaXplKCkgPiAwKSB7Ci0JCQkJQXNzaWduV1BUb1Rhc2tEZXNjcmlwdG9yIGNtZCA9IG5ldyBBc3NpZ25XUFRvVGFza0Rlc2NyaXB0b3IoCi0JCQkJCQkoVGFza0Rlc2NyaXB0b3IpIGVsZW1lbnQsIG5ld0xpc3QsCi0JCQkJCQlJQWN0aW9uVHlwZUNvbnN0YW50cy5BRERfT1BUSU9OQUxfSU5QVVQsCi0JCQkJCQlnZXRDb25maWd1cmF0aW9uKCkpOwotCQkJCWFjdGlvbk1nci5leGVjdXRlKGNtZCk7Ci0JCQl9Ci0JCX0KLQl9OwotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuUmVsYXRpb25TZWN0aW9uI2FkZEl0ZW1zMyhqYXZhLnV0aWwuTGlzdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRJdGVtczMoTGlzdCBpdGVtcykgewotCQlpZiAoIWl0ZW1zLmlzRW1wdHkoKSkgewotCQkJTGlzdCBlbGVtZW50TGlzdCA9IGdldFdvcmtQcm9kdWN0cygoKFRhc2tEZXNjcmlwdG9yKSBlbGVtZW50KQotCQkJCQkuZ2V0TWFuZGF0b3J5SW5wdXQoKSk7Ci0JCQllbGVtZW50TGlzdC5hZGRBbGwoZ2V0V29ya1Byb2R1Y3RzKCgoVGFza0Rlc2NyaXB0b3IpIGVsZW1lbnQpCi0JCQkJCS5nZXRPcHRpb25hbElucHV0KCkpKTsKLQotCQkJTGlzdCBuZXdMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtcy5zaXplKCk7IGkrKykgewotCQkJCU9iamVjdCBvYmogPSBpdGVtcy5nZXQoaSk7Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0KSB7Ci0JCQkJCVdvcmtQcm9kdWN0IHdwID0gKFdvcmtQcm9kdWN0KSBvYmo7Ci0JCQkJCWlmICghZWxlbWVudExpc3QuY29udGFpbnMod3ApKQotCQkJCQkJbmV3TGlzdC5hZGQod3ApOwotCQkJCX0KLQkJCX0KLQkJCWlmIChuZXdMaXN0LnNpemUoKSA+IDApIHsKLQkJCQlBc3NpZ25XUFRvVGFza0Rlc2NyaXB0b3IgY21kID0gbmV3IEFzc2lnbldQVG9UYXNrRGVzY3JpcHRvcigKLQkJCQkJCShUYXNrRGVzY3JpcHRvcikgZWxlbWVudCwgbmV3TGlzdCwKLQkJCQkJCUlBY3Rpb25UeXBlQ29uc3RhbnRzLkFERF9FWFRFUk5BTF9JTlBVVCwKLQkJCQkJCWdldENvbmZpZ3VyYXRpb24oKSk7Ci0JCQkJYWN0aW9uTWdyLmV4ZWN1dGUoY21kKTsKLQkJCX0KLQkJfQotCX07Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5SZWxhdGlvblNlY3Rpb24jYWRkSXRlbXM0KGphdmEudXRpbC5MaXN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEl0ZW1zNChMaXN0IGl0ZW1zKSB7Ci0JCWlmICghaXRlbXMuaXNFbXB0eSgpKSB7Ci0JCQlBc3NpZ25XUFRvVGFza0Rlc2NyaXB0b3IgY21kID0gbmV3IEFzc2lnbldQVG9UYXNrRGVzY3JpcHRvcigKLQkJCQkJKFRhc2tEZXNjcmlwdG9yKSBlbGVtZW50LCBpdGVtcywKLQkJCQkJSUFjdGlvblR5cGVDb25zdGFudHMuQUREX09VVFBVVCwgZ2V0Q29uZmlndXJhdGlvbigpKTsKLQkJCWFjdGlvbk1nci5leGVjdXRlKGNtZCk7Ci0JCX0KLQl9OwotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuUmVsYXRpb25TZWN0aW9uI3JlbW92ZUl0ZW1zMShqYXZhLnV0aWwuTGlzdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVJdGVtczEoTGlzdCBpdGVtcykgewotCQlpZiAoIWl0ZW1zLmlzRW1wdHkoKSkgewotCQkJUmVtb3ZlRGVzY3JpcHRvckNvbW1hbmQgY21kID0gbmV3IFJlbW92ZURlc2NyaXB0b3JDb21tYW5kKGVsZW1lbnQsCi0JCQkJCWl0ZW1zLCBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fTUFOREFUT1JZX0lOUFVUKTsKLQkJCWFjdGlvbk1nci5leGVjdXRlKGNtZCk7Ci0JCX0KLQl9OwotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuUmVsYXRpb25TZWN0aW9uI3JlbW92ZUl0ZW1zMihqYXZhLnV0aWwuTGlzdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVJdGVtczIoTGlzdCBpdGVtcykgewotCQlpZiAoIWl0ZW1zLmlzRW1wdHkoKSkgewotCQkJUmVtb3ZlRGVzY3JpcHRvckNvbW1hbmQgY21kID0gbmV3IFJlbW92ZURlc2NyaXB0b3JDb21tYW5kKGVsZW1lbnQsCi0JCQkJCWl0ZW1zLCBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fT1BUSU9OQUxfSU5QVVQpOwotCQkJYWN0aW9uTWdyLmV4ZWN1dGUoY21kKTsKLQkJfQotCX07Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5SZWxhdGlvblNlY3Rpb24jcmVtb3ZlSXRlbXMzKGphdmEudXRpbC5MaXN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbW92ZUl0ZW1zMyhMaXN0IGl0ZW1zKSB7Ci0JCWlmICghaXRlbXMuaXNFbXB0eSgpKSB7Ci0JCQlSZW1vdmVEZXNjcmlwdG9yQ29tbWFuZCBjbWQgPSBuZXcgUmVtb3ZlRGVzY3JpcHRvckNvbW1hbmQoZWxlbWVudCwKLQkJCQkJaXRlbXMsIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19FWFRFUk5BTF9JTlBVVCk7Ci0JCQlhY3Rpb25NZ3IuZXhlY3V0ZShjbWQpOwotCQl9Ci0JfTsKLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLlJlbGF0aW9uU2VjdGlvbiNyZW1vdmVJdGVtczQoamF2YS51dGlsLkxpc3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlSXRlbXM0KExpc3QgaXRlbXMpIHsKLQkJaWYgKCFpdGVtcy5pc0VtcHR5KCkpIHsKLQkJCVJlbW92ZURlc2NyaXB0b3JDb21tYW5kIGNtZCA9IG5ldyBSZW1vdmVEZXNjcmlwdG9yQ29tbWFuZChlbGVtZW50LAotCQkJCQlpdGVtcywgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX09VVFBVVCk7Ci0JCQlhY3Rpb25NZ3IuZXhlY3V0ZShjbWQpOwotCQl9Ci0JfTsKLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLlJlbGF0aW9uU2VjdGlvbiNnZXRFeGlzdGluZ0VsZW1lbnRzMSgpCi0JICovCi0JcHJvdGVjdGVkIExpc3QgZ2V0RXhpc3RpbmdFbGVtZW50czEoKSB7Ci0JCXJldHVybiAoKFRhc2tEZXNjcmlwdG9yKSBlbGVtZW50KS5nZXRNYW5kYXRvcnlJbnB1dCgpOwotCX07Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5SZWxhdGlvblNlY3Rpb24jZ2V0RXhpc3RpbmdFbGVtZW50czIoKQotCSAqLwotCXByb3RlY3RlZCBMaXN0IGdldEV4aXN0aW5nRWxlbWVudHMyKCkgewotCQlyZXR1cm4gKChUYXNrRGVzY3JpcHRvcikgZWxlbWVudCkuZ2V0T3B0aW9uYWxJbnB1dCgpOwotCX07Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5SZWxhdGlvblNlY3Rpb24jZ2V0RXhpc3RpbmdFbGVtZW50czMoKQotCSAqLwotCXByb3RlY3RlZCBMaXN0IGdldEV4aXN0aW5nRWxlbWVudHMzKCkgewotCQlyZXR1cm4gKChUYXNrRGVzY3JpcHRvcikgZWxlbWVudCkuZ2V0RXh0ZXJuYWxJbnB1dCgpOwotCX07Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5SZWxhdGlvblNlY3Rpb24jZ2V0RXhpc3RpbmdFbGVtZW50czQoKQotCSAqLwotCXByb3RlY3RlZCBMaXN0IGdldEV4aXN0aW5nRWxlbWVudHM0KCkgewotCQlyZXR1cm4gKChUYXNrRGVzY3JpcHRvcikgZWxlbWVudCkuZ2V0T3V0cHV0KCk7Ci0JfTsKLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLlJlbGF0aW9uU2VjdGlvbiNnZXRQcm9jZXNzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgUHJvY2VzcyBnZXRQcm9jZXNzKCkgewotCQlBZGFwdGVyRmFjdG9yeSBhRmFjdG9yeSA9IFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJLmdldFdCU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCk7Ci0JCUl0ZW1Qcm92aWRlckFkYXB0ZXIgYWRhcHRlciA9IChJdGVtUHJvdmlkZXJBZGFwdGVyKSBhRmFjdG9yeS5hZGFwdCgKLQkJCQllbGVtZW50LCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQlPYmplY3Qgb2JqID0gUHJvY2Vzc1V0aWwuZ2V0Um9vdFByb2Nlc3MoYUZhY3RvcnksIGFkYXB0ZXIsIGVsZW1lbnQpOwotCQlyZXR1cm4gKFByb2Nlc3MpIG9iajsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5SZWxhdGlvblNlY3Rpb24jZ2V0RmlsdGVyRm9yRGVzY3JpcHRvcnMoKQotCSAqLwotCXByb3RlY3RlZCBJRmlsdGVyIGdldEZpbHRlckZvckRlc2NyaXB0b3JzKCkgewotCQlyZXR1cm4gbmV3IERlc2NyaXB0b3JQcm9jZXNzRmlsdGVyKGdldENvbmZpZ3VyYXRpb24oKSkgewotCQkJcHJvdGVjdGVkIGJvb2xlYW4gY2hpbGRBY2NlcHQoT2JqZWN0IG9iaikgewotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCQlMaXN0IGxpc3QxID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQlnZXRBY3Rpdml0aWVzSW5TY29wZShUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkJCS5nZXRXQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpLCBlbGVtZW50LCBsaXN0MSk7Ci0JCQkJCWlmIChsaXN0MS5jb250YWlucyhvYmopKQotCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCWVsc2UKLQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0RGVzY3JpcHRvcikKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9OwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLlJlbGF0aW9uU2VjdGlvbiNhZGRGcm9tUHJvY2Vzc0l0ZW1zMShqYXZhLnV0aWwuTGlzdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRGcm9tUHJvY2Vzc0l0ZW1zMShMaXN0IGl0ZW1zKSB7Ci0JCWlmICghaXRlbXMuaXNFbXB0eSgpKSB7Ci0JCQlpdGVtcy5yZW1vdmVBbGwoKChUYXNrRGVzY3JpcHRvcikgZWxlbWVudCkuZ2V0T3B0aW9uYWxJbnB1dCgpKTsKLQkJCWl0ZW1zLnJlbW92ZUFsbCgoKFRhc2tEZXNjcmlwdG9yKSBlbGVtZW50KS5nZXRFeHRlcm5hbElucHV0KCkpOwotCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLkFERF9NQU5ZLCBlbGVtZW50LAotCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrRGVzY3JpcHRvcl9NYW5kYXRvcnlJbnB1dCgpLAotCQkJCQlpdGVtcywgLTEpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuUmVsYXRpb25TZWN0aW9uI2FkZEZyb21Qcm9jZXNzSXRlbXMyKGphdmEudXRpbC5MaXN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEZyb21Qcm9jZXNzSXRlbXMyKExpc3QgaXRlbXMpIHsKLQkJaWYgKCFpdGVtcy5pc0VtcHR5KCkpIHsKLQkJCWl0ZW1zLnJlbW92ZUFsbCgoKFRhc2tEZXNjcmlwdG9yKSBlbGVtZW50KS5nZXRNYW5kYXRvcnlJbnB1dCgpKTsKLQkJCWl0ZW1zLnJlbW92ZUFsbCgoKFRhc2tEZXNjcmlwdG9yKSBlbGVtZW50KS5nZXRFeHRlcm5hbElucHV0KCkpOwotCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLkFERF9NQU5ZLCBlbGVtZW50LAotCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrRGVzY3JpcHRvcl9PcHRpb25hbElucHV0KCksCi0JCQkJCWl0ZW1zLCAtMSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5SZWxhdGlvblNlY3Rpb24jYWRkRnJvbVByb2Nlc3NJdGVtczMoamF2YS51dGlsLkxpc3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkRnJvbVByb2Nlc3NJdGVtczMoTGlzdCBpdGVtcykgewotCQlpZiAoIWl0ZW1zLmlzRW1wdHkoKSkgewotCQkJaXRlbXMucmVtb3ZlQWxsKCgoVGFza0Rlc2NyaXB0b3IpIGVsZW1lbnQpLmdldE1hbmRhdG9yeUlucHV0KCkpOwotCQkJaXRlbXMucmVtb3ZlQWxsKCgoVGFza0Rlc2NyaXB0b3IpIGVsZW1lbnQpLmdldE9wdGlvbmFsSW5wdXQoKSk7Ci0JCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuQUREX01BTlksIGVsZW1lbnQsCi0JCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tEZXNjcmlwdG9yX0V4dGVybmFsSW5wdXQoKSwKLQkJCQkJaXRlbXMsIC0xKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLlJlbGF0aW9uU2VjdGlvbiNhZGRGcm9tUHJvY2Vzc0l0ZW1zNChqYXZhLnV0aWwuTGlzdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRGcm9tUHJvY2Vzc0l0ZW1zNChMaXN0IGl0ZW1zKSB7Ci0JCWlmICghaXRlbXMuaXNFbXB0eSgpKSB7Ci0JCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuQUREX01BTlksIGVsZW1lbnQsCi0JCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tEZXNjcmlwdG9yX091dHB1dCgpLCBpdGVtcywgLTEpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuUmVsYXRpb25TZWN0aW9uI2dldERlc2NyaXB0b3JUYWJOYW1lKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERlc2NyaXB0b3JUYWJOYW1lKCkgewotCQlyZXR1cm4gRmlsdGVyQ29uc3RhbnRzLldPUktfUFJPRFVDVF9ERVNDUklQVE9SUzsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvVGVhbVByb2ZpbGVSb2xlU2VjdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL1RlYW1Qcm9maWxlUm9sZVNlY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTY4NGFmOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvVGVhbVByb2ZpbGVSb2xlU2VjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTY4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllczsKLQotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuV3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZGlhbG9ncy5JdGVtc0ZpbHRlckRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZpbHRlcnMuRGVzY3JpcHRvclByb2Nlc3NGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklBY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuRmlsdGVyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuRmlsdGVySGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5BY3Rpdml0eVdyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5Db21wb3NpdGVSb2xlV3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuUm9sZURlc2NyaXB0b3JXcmFwcGVySXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kLkFkZFJvbGVUb1RlYW1Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Qcm9jZXNzVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbXBvc2l0ZVJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRlYW1Qcm9maWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5UYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZTsKLQotCi0vKioKLSAqIFRoZSB0ZWFtIHByb2ZpbGUgLSByb2xlL2NvbXBvc2l0ZSByb2xlIHNlY3Rpb24KLSAqIAotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjAKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgVGVhbVByb2ZpbGVSb2xlU2VjdGlvbiBleHRlbmRzIE9CU1JlbGF0aW9uU2VjdGlvbiB7Ci0KLQlMaXN0IHJvbGVMaXN0ID0gbnVsbDsKLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLk9CU1JlbGF0aW9uU2VjdGlvbiNjcmVhdGVDb250cm9scyhvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUsIG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLlRhYmJlZFByb3BlcnR5U2hlZXRQYWdlKQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2xzKENvbXBvc2l0ZSBwYXJlbnQsCi0JCQlUYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZSB0YWJiZWRQcm9wZXJ0eVNoZWV0UGFnZSkgewotCQlzdXBlci5jcmVhdGVDb250cm9scyhwYXJlbnQsIHRhYmJlZFByb3BlcnR5U2hlZXRQYWdlKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5PQlNSZWxhdGlvblNlY3Rpb24jaW5pdENvbnRlbnRQcm92aWRlcigpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdENvbnRlbnRQcm92aWRlcigpIHsKLQkJY29udGVudFByb3ZpZGVyID0gbmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKGdldEFkYXB0ZXJGYWN0b3J5KCkpIHsKLQkJCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJTGlzdCBuZXdMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCUxpc3QgdGVhbVJvbGVzID0gKChUZWFtUHJvZmlsZSkgZWxlbWVudCkuZ2V0VGVhbVJvbGVzKCk7Ci0JCQkJZm9yIChJdGVyYXRvciBpdG9yID0gdGVhbVJvbGVzLml0ZXJhdG9yKCk7IGl0b3IuaGFzTmV4dCgpOykgewotCQkJCQlSb2xlRGVzY3JpcHRvciByb2xlRGVzYyA9IChSb2xlRGVzY3JpcHRvcikgaXRvci5uZXh0KCk7Ci0JCQkJCWlmICgocm9sZURlc2MuZ2V0U3VwZXJBY3Rpdml0aWVzKCkgPT0gbnVsbCkKLQkJCQkJCQl8fCAocm9sZURlc2MuZ2V0U3VwZXJBY3Rpdml0aWVzKCkgPT0gbnVsbCkpCi0JCQkJCQluZXdMaXN0LmFkZChyb2xlRGVzYyk7Ci0JCQkJfQotCi0JCQkJLy8gcmV0dXJuICgoVGVhbVByb2ZpbGUpZWxlbWVudCkuZ2V0VGVhbVJvbGVzKCkudG9BcnJheSgpOwotCQkJCXJldHVybiBnZXRGaWx0ZXJlZExpc3QobmV3TGlzdCkudG9BcnJheSgpOwotCQkJfQotCQl9OwotCi0JCXZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIoY29udGVudFByb3ZpZGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5PQlNSZWxhdGlvblNlY3Rpb24jaW5pdCgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdCgpIHsKLQkJc3VwZXIuaW5pdCgpOwotCQllbGVtZW50ID0gKFRlYW1Qcm9maWxlKSBlbGVtZW50OwotCi0JCXNldFRhYkRhdGEoUHJvcGVydGllc1Jlc291cmNlcy5UZWFtUHJvZmlsZV9Sb2xlX1NlY3Rpb25UaXRsZSwgCi0JCQkJUHJvcGVydGllc1Jlc291cmNlcy5UZWFtUHJvZmlsZV9Sb2xlX1NlY3Rpb25EZXNjcmlwdGlvbiwKLQkJCQlQcm9wZXJ0aWVzUmVzb3VyY2VzLlRlYW1Qcm9maWxlX1JvbGVfVGFibGUxKTsgCi0JCXNob3dBZGRGcm9tUHJvY2Vzc0J1dHRvbiA9IHRydWU7Ci0JfQotCi0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5PQlNSZWxhdGlvblNlY3Rpb24jcmVmcmVzaCgpCi0JICovCi0JcHVibGljIHZvaWQgcmVmcmVzaCgpIHsKLQkJdHJ5IHsKLQkJCWlmIChnZXRFbGVtZW50KCkgaW5zdGFuY2VvZiBUZWFtUHJvZmlsZSkgewotCQkJCXN1cGVyLnJlZnJlc2goKTsKLQkJCQllbGVtZW50ID0gKFRlYW1Qcm9maWxlKSBnZXRFbGVtZW50KCk7Ci0JCQkJdmlld2VyLnJlZnJlc2goKTsKLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQlsb2dnZXIubG9nRXJyb3IoIkVycm9yIHJlZnJlc2hpbmcgVGVhbSBQcm9maWxlIHJvbGUgc2VjdGlvbiAiLCBleCk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc1BhcnRPZlRlYW0oUm9sZSByb2xlLCBUZWFtUHJvZmlsZSB0ZWFtKSB7Ci0JCUxpc3QgdGVhbVJvbGVzID0gdGVhbS5nZXRUZWFtUm9sZXMoKTsKLQkJTGlzdCByb2xlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChJdGVyYXRvciBpdG9yID0gdGVhbVJvbGVzLml0ZXJhdG9yKCk7IGl0b3IuaGFzTmV4dCgpOykgewotCQkJUm9sZURlc2NyaXB0b3Igcm9sZURlc2MgPSAoUm9sZURlc2NyaXB0b3IpIGl0b3IubmV4dCgpOwotCQkJcm9sZXMuYWRkKHJvbGVEZXNjLmdldFJvbGUoKSk7Ci0JCX0KLQotCQlpZiAocm9sZXMuY29udGFpbnMocm9sZSkpCi0JCQlyZXR1cm4gdHJ1ZTsKLQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZChMaXN0IGl0ZW1zKSB7Ci0JCWlmIChpdGVtcyAhPSBudWxsKSB7Ci0JCQlMaXN0IHJvbGVzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCQlmb3IgKEl0ZXJhdG9yIGl0b3IgPSBpdGVtcy5pdGVyYXRvcigpOyBpdG9yLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3Qgb2JqID0gaXRvci5uZXh0KCk7Ci0JCQkJaWYgKChvYmogaW5zdGFuY2VvZiBSb2xlKQotCQkJCQkJJiYgKCFpc1BhcnRPZlRlYW0oKFJvbGUpIG9iaiwgKFRlYW1Qcm9maWxlKSBlbGVtZW50KSkpIHsKLQkJCQkJcm9sZXMuYWRkKChSb2xlKSBvYmopOwotCQkJCX0KLQkJCX0KLQotCQkJaWYgKCFyb2xlcy5pc0VtcHR5KCkpIHsKLQkJCQlBZGRSb2xlVG9UZWFtQ29tbWFuZCBjbWQgPSBuZXcgQWRkUm9sZVRvVGVhbUNvbW1hbmQoCi0JCQkJCQkoVGVhbVByb2ZpbGUpIGVsZW1lbnQsIHJvbGVzKTsKLQkJCQlhY3Rpb25NZ3IuZXhlY3V0ZShjbWQpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZEZyb21Qcm9jZXNzKExpc3QgaXRlbXMpIHsKLQkJLy8gdXBkYXRlIHRoZSBtb2RlbAotCQlpZiAoaXRlbXMgIT0gbnVsbCkgewotCQkJZm9yIChJdGVyYXRvciBpdG9yID0gaXRlbXMuaXRlcmF0b3IoKTsgaXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IG9iaiA9IGl0b3IubmV4dCgpOwotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBDb21wb3NpdGVSb2xlKSB7Ci0JCQkJCUNvbXBvc2l0ZVJvbGUgY29tcFJvbGUgPSBQcm9jZXNzVXRpbAotCQkJCQkJCS5jcmVhdGVDb21wb3NpdGVSb2xlKChDb21wb3NpdGVSb2xlKSBvYmopOwotCQkJCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuQURELCBlbGVtZW50LAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRlYW1Qcm9maWxlX1RlYW1Sb2xlcygpLAotCQkJCQkJCWNvbXBSb2xlLCAtMSk7Ci0JCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5BREQsIGVsZW1lbnQsCi0JCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGVhbVByb2ZpbGVfVGVhbVJvbGVzKCksCi0JCQkJCQkJb2JqLCAtMSk7Ci0JCQkJfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBSb2xlRGVzY3JpcHRvcikgewotCQkJCQlSb2xlIHJvbGUgPSAoKFJvbGVEZXNjcmlwdG9yKSBvYmopLmdldFJvbGUoKTsKLQkJCQkJaWYgKHJvbGUgIT0gbnVsbCkgewotCQkJCQkJaWYgKCFpc1BhcnRPZlRlYW0ocm9sZSwgKFRlYW1Qcm9maWxlKSBlbGVtZW50KSkgewotCQkJCQkJCVJvbGVEZXNjcmlwdG9yIHJvbGVEZXNjID0gUHJvY2Vzc1V0aWwKLQkJCQkJCQkJCS5jcmVhdGVSb2xlRGVzY3JpcHRvcihyb2xlKTsKLQkJCQkJCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuQURELCBlbGVtZW50LAotCQkJCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCQkJLmdldFRlYW1Qcm9maWxlX1RlYW1Sb2xlcygpLAotCQkJCQkJCQkJcm9sZURlc2MsIC0xKTsKLQkJCQkJCX0KLQkJCQkJCWFjdGlvbk1ncgotCQkJCQkJCQkuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuQURELCBlbGVtZW50LAotCQkJCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJCQkuZ2V0VGVhbVByb2ZpbGVfVGVhbVJvbGVzKCksCi0JCQkJCQkJCQkJb2JqLCAtMSk7Ci0KLQkJCQkJCS8vIGZpcmUgTm90aWZpY2F0aW9uCi0JCQkJCQlBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSA9IFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkJCS5nZXRPQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpOwotCQkJCQkJQWN0aXZpdHkgcGFyZW50ID0gKEFjdGl2aXR5KSBnZXRQYXJlbnRBY3Rpdml0eShlbGVtZW50KTsKLQkJCQkJCUl0ZW1Qcm92aWRlckFkYXB0ZXIgYWRhcHRlciA9IChJdGVtUHJvdmlkZXJBZGFwdGVyKSBhZGFwdGVyRmFjdG9yeQotCQkJCQkJCQkuYWRhcHQocGFyZW50LCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkJCQkJQ29sbGVjdGlvbiBjaGlsZHJlbiA9IGFkYXB0ZXIuZ2V0Q2hpbGRyZW4ocGFyZW50KTsKLQotCQkJCQkJZmlyZU5vdGlmaWNhdGlvbihjaGlsZHJlbiwgKFJvbGVEZXNjcmlwdG9yKSBvYmopOwotCi0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlNZXNzYWdlRm9ybWF0IG1mID0gbmV3IE1lc3NhZ2VGb3JtYXQoCi0JCQkJCQkJCVByb3BlcnRpZXNSZXNvdXJjZXMuUHJvY2Vzc19UZWFtQXNzaWduRXJyb3IpOyAKLQkJCQkJCU9iamVjdFtdIGFyZ3MgPSB7ICgoUm9sZURlc2NyaXB0b3IpIG9iaikuZ2V0TmFtZSgpLAotCQkJCQkJCQkoKFRlYW1Qcm9maWxlKSBlbGVtZW50KS5nZXROYW1lKCkgfTsKLQkJCQkJCUF1dGhvcmluZ1VJUGx1Z2luCi0JCQkJCQkJCS5nZXREZWZhdWx0KCkKLQkJCQkJCQkJLmdldE1zZ0RpYWxvZygpCi0JCQkJCQkJCS5kaXNwbGF5SW5mbygKLQkJCQkJCQkJCQlQcm9wZXJ0aWVzUmVzb3VyY2VzLlByb2Nlc3NfQXNzaWdubWVudEluZm9UaXRsZSwgbWYuZm9ybWF0KGFyZ3MpKTsgCi0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgZmlyZU5vdGlmaWNhdGlvbihDb2xsZWN0aW9uIGNoaWxkcmVuLCBSb2xlRGVzY3JpcHRvciByb2xlRGVzYykgewotCQlmb3IgKEl0ZXJhdG9yIGl0b3IgPSBjaGlsZHJlbi5pdGVyYXRvcigpOyBpdG9yLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBvYmogPSBpdG9yLm5leHQoKTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCUFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5ID0gVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJCS5nZXRPQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpOwotCQkJCUl0ZW1Qcm92aWRlckFkYXB0ZXIgYWRhcHRlciA9IChJdGVtUHJvdmlkZXJBZGFwdGVyKSBhZGFwdGVyRmFjdG9yeQotCQkJCQkJLmFkYXB0KChBY3Rpdml0eSkgb2JqLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkJCWNoaWxkcmVuID0gYWRhcHRlci5nZXRDaGlsZHJlbigoQWN0aXZpdHkpIG9iaik7Ci0JCQkJZmlyZU5vdGlmaWNhdGlvbihjaGlsZHJlbiwgcm9sZURlc2MpOwotCQkJfQotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIEFjdGl2aXR5V3JhcHBlckl0ZW1Qcm92aWRlcikgewotCQkJCU9iamVjdCBvMSA9ICgoV3JhcHBlckl0ZW1Qcm92aWRlcikgb2JqKS5nZXRWYWx1ZSgpOwotCQkJCUFjdGl2aXR5V3JhcHBlckl0ZW1Qcm92aWRlciBhY3Rpdml0eUFkYXB0ZXIgPSAoQWN0aXZpdHlXcmFwcGVySXRlbVByb3ZpZGVyKSBvYmo7Ci0JCQkJZmlyZU5vdGlmaWNhdGlvbihhY3Rpdml0eUFkYXB0ZXIuZ2V0Q2hpbGRyZW4obzEpLCByb2xlRGVzYyk7Ci0JCQl9Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgUm9sZURlc2NyaXB0b3JXcmFwcGVySXRlbVByb3ZpZGVyKSB7Ci0JCQkJUm9sZURlc2NyaXB0b3JXcmFwcGVySXRlbVByb3ZpZGVyIHByb3ZpZGVyID0gKFJvbGVEZXNjcmlwdG9yV3JhcHBlckl0ZW1Qcm92aWRlcikgb2JqOwotCQkJCWlmICgoKFJvbGVEZXNjcmlwdG9yKSBwcm92aWRlci5nZXRWYWx1ZSgpKS5nZXRSb2xlKCkuZXF1YWxzKAotCQkJCQkJcm9sZURlc2MuZ2V0Um9sZSgpKSkgewotCQkJCQlwcm92aWRlci5maXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKAotCQkJCQkJCW5ldyBOb3RpZmljYXRpb25JbXBsKE5vdGlmaWNhdGlvbi5TRVQsIHByb3ZpZGVyLAotCQkJCQkJCQkJcHJvdmlkZXIpLCBwcm92aWRlciwgZmFsc2UsIHRydWUpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuT0JTUmVsYXRpb25TZWN0aW9uI3JlbW92ZShqYXZhLnV0aWwuQXJyYXlMaXN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbW92ZShBcnJheUxpc3Qgcm1JdGVtcykgewotCQkvLyB1cGRhdGUgdGhlIG1vZGVsCi0JCWlmICghcm1JdGVtcy5pc0VtcHR5KCkpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRvciA9IHJtSXRlbXMuaXRlcmF0b3IoKTsgaXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IG9iaiA9IChPYmplY3QpIGl0b3IubmV4dCgpOwotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBSb2xlRGVzY3JpcHRvcikgewotCQkJCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuUkVNT1ZFLCBlbGVtZW50LAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRlYW1Qcm9maWxlX1RlYW1Sb2xlcygpLAotCQkJCQkJCShSb2xlRGVzY3JpcHRvcikgb2JqLCAtMSk7Ci0JCQkJfQotCi0JCQkJLy8gZmluZCBtYXRjaGluZyByb2xlRGVzY3JpcHRvciBpbiB0ZWFtIHJvbGVzCi0JCQkJTGlzdCByb2xlRGVzY0xpc3QgPSBmaW5kUm9sZURlc2NyaXB0b3IoKE9iamVjdCkgb2JqKTsKLQkJCQlmb3IgKEl0ZXJhdG9yIHJvbGVEZXNjSXRvciA9IHJvbGVEZXNjTGlzdC5pdGVyYXRvcigpOyByb2xlRGVzY0l0b3IKLQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCVJvbGVEZXNjcmlwdG9yIHJvbGVEZXNjID0gKFJvbGVEZXNjcmlwdG9yKSByb2xlRGVzY0l0b3IKLQkJCQkJCQkubmV4dCgpOwotCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5SRU1PVkUsIGVsZW1lbnQsCi0JCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUZWFtUHJvZmlsZV9UZWFtUm9sZXMoKSwKLQkJCQkJCXJvbGVEZXNjLCAtMSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBMaXN0IGZpbmRSb2xlRGVzY3JpcHRvcihPYmplY3Qgb2JqKSB7Ci0JCUxpc3QgdGVhbVJvbGVzID0gKChUZWFtUHJvZmlsZSkgZWxlbWVudCkuZ2V0VGVhbVJvbGVzKCk7Ci0JCUxpc3Qgcm9sZURlc2NMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0b3IgPSB0ZWFtUm9sZXMuaXRlcmF0b3IoKTsgaXRvci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgaXRvck9iamVjdCA9IGl0b3IubmV4dCgpOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIENvbXBvc2l0ZVJvbGUpIHsKLQkJCQlpZiAoaXRvck9iamVjdCBpbnN0YW5jZW9mIENvbXBvc2l0ZVJvbGUpIHsKLQkJCQkJTGlzdCBmaXJzdE9iamVjdEFnZ1JvbGVzID0gKChDb21wb3NpdGVSb2xlKSBvYmopCi0JCQkJCQkJLmdldEFnZ3JlZ2F0ZWRSb2xlcygpOwotCQkJCQlMaXN0IHNlY29uZE9iamVjdEFnZ1JvbGVzID0gKChDb21wb3NpdGVSb2xlKSBpdG9yT2JqZWN0KQotCQkJCQkJCS5nZXRBZ2dyZWdhdGVkUm9sZXMoKTsKLQkJCQkJaWYgKGZpcnN0T2JqZWN0QWdnUm9sZXMuZXF1YWxzKHNlY29uZE9iamVjdEFnZ1JvbGVzKSkgewotCQkJCQkJcm9sZURlc2NMaXN0LmFkZChpdG9yT2JqZWN0KTsKLQkJCQkJfQotCQkJCX0KLQkJCX0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgUm9sZURlc2NyaXB0b3IpIHsKLQkJCQlpZiAoKGl0b3JPYmplY3QgaW5zdGFuY2VvZiBSb2xlRGVzY3JpcHRvcikKLQkJCQkJCSYmICghKGl0b3JPYmplY3QgaW5zdGFuY2VvZiBDb21wb3NpdGVSb2xlKSkpIHsKLQkJCQkJT2JqZWN0IG9ialJvbGUgPSAoKFJvbGVEZXNjcmlwdG9yKSBvYmopLmdldFJvbGUoKTsKLQkJCQkJT2JqZWN0IGl0b3JPYmpSb2xlID0gKChSb2xlRGVzY3JpcHRvcikgaXRvck9iamVjdCkKLQkJCQkJCQkuZ2V0Um9sZSgpOwotCQkJCQlpZiAob2JqUm9sZS5lcXVhbHMoaXRvck9ialJvbGUpKSB7Ci0JCQkJCQlyb2xlRGVzY0xpc3QuYWRkKGl0b3JPYmplY3QpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHJvbGVEZXNjTGlzdDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5PQlNSZWxhdGlvblNlY3Rpb24jb3BlbkFkZERpYWxvZygpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgb3BlbkFkZERpYWxvZygpIHsKLQkJTGlzdCBleGlzdGluZ0VsZW1lbnRzID0gUHJvY2Vzc1V0aWwKLQkJCQkuZ2V0QXNzb2NpYXRlZEVsZW1lbnRMaXN0KCgoVGVhbVByb2ZpbGUpIGVsZW1lbnQpCi0JCQkJCQkuZ2V0VGVhbVJvbGVzKCkpOwotCQlJdGVtc0ZpbHRlckRpYWxvZyBmZCA9IG5ldyBJdGVtc0ZpbHRlckRpYWxvZyhQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpCi0JCQkJLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldFNoZWxsKCksIGdldEZpbHRlcigpLCBlbGVtZW50LAotCQkJCUZpbHRlckNvbnN0YW50cy5ST0xFX0RFU0NSSVBUT1JTLCBleGlzdGluZ0VsZW1lbnRzKTsKLQkJZmQuc2V0QmxvY2tPbk9wZW4odHJ1ZSk7Ci0JCWZkLnNldFRpdGxlKEZpbHRlckNvbnN0YW50cy5ST0xFUyk7Ci0JCVN0cmluZ1tdIHN0ciA9IG5ldyBTdHJpbmdbXXtGaWx0ZXJDb25zdGFudHMuUk9MRVN9OwotCQlmZC5zZXRUeXBlcyhzdHIpOwotCQlmZC5vcGVuKCk7Ci0JCWFkZChmZC5nZXRTZWxlY3RlZEl0ZW1zKCkpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLk9CU1JlbGF0aW9uU2VjdGlvbiNvcGVuQWRkRnJvbVByb2Nlc3NEaWFsb2coKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIG9wZW5BZGRGcm9tUHJvY2Vzc0RpYWxvZygpIHsKLQkJTGlzdCBleGlzdGluZ0VsZW1lbnRzID0gKChUZWFtUHJvZmlsZSkgZWxlbWVudCkuZ2V0VGVhbVJvbGVzKCk7Ci0JCVByb2Nlc3MgcHJvY2VzcyA9IChQcm9jZXNzKSBnZXRQcm9jZXNzKGVsZW1lbnQpOwotCQlJRmlsdGVyIGRlc2NyaXB0b3JGaWx0ZXIgPSBnZXREZXNjcmlwdG9yRmlsdGVyKCk7Ci0KLQkJaWYgKGRlc2NyaXB0b3JGaWx0ZXIgIT0gbnVsbCAmJiBwcm9jZXNzICE9IG51bGwpIHsKLQkJCUl0ZW1zRmlsdGVyRGlhbG9nIGZkID0gbmV3IEl0ZW1zRmlsdGVyRGlhbG9nKFBsYXRmb3JtVUkKLQkJCQkJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldFNoZWxsKCksCi0JCQkJCWRlc2NyaXB0b3JGaWx0ZXIsIHByb2Nlc3MsCi0JCQkJCUZpbHRlckNvbnN0YW50cy5ST0xFX0RFU0NSSVBUT1JTLCBleGlzdGluZ0VsZW1lbnRzKTsKLQkJCWZkLnNldEJsb2NrT25PcGVuKHRydWUpOwotCQkJZmQuc2V0VGl0bGUoRmlsdGVyQ29uc3RhbnRzLlJPTEVfREVTQ1JJUFRPUlMpOwotCQkJZmQub3BlbigpOwotCQkJYWRkRnJvbVByb2Nlc3MoZmQuZ2V0U2VsZWN0ZWRJdGVtcygpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEdldCBwYXJlbnQgRmluZCBwYXJlbnQgdW50aWwgaXQncyBhY3Rpdml0eS4KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqIEByZXR1cm4KLQkgKiAJCQlQcm9jZXNzCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBnZXRQcm9jZXNzKEJyZWFrZG93bkVsZW1lbnQgZWxlbWVudCkgewotCQlBZGFwdGVyRmFjdG9yeSBhRmFjdG9yeSA9IFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJLmdldE9CU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCk7Ci0JCUl0ZW1Qcm92aWRlckFkYXB0ZXIgYWRhcHRlciA9IChJdGVtUHJvdmlkZXJBZGFwdGVyKSBhRmFjdG9yeS5hZGFwdCgKLQkJCQllbGVtZW50LCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQlPYmplY3QgcGFyZW50ID0gYWRhcHRlci5nZXRQYXJlbnQoZWxlbWVudCk7Ci0JCWlmIChwYXJlbnQgaW5zdGFuY2VvZiBQcm9jZXNzKSB7Ci0JCQlyZXR1cm4gcGFyZW50OwotCi0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gZ2V0UHJvY2VzcygoQnJlYWtkb3duRWxlbWVudCkgcGFyZW50KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEdldCBkZXNjcmlwdG9yIGZpbHRlcgotCSAqLwotCXByb3RlY3RlZCBJRmlsdGVyIGdldERlc2NyaXB0b3JGaWx0ZXIoKSB7Ci0JCXJldHVybiBuZXcgRGVzY3JpcHRvclByb2Nlc3NGaWx0ZXIoZ2V0Q29uZmlndXJhdGlvbigpKSB7Ci0JCQlwcm90ZWN0ZWQgYm9vbGVhbiBjaGlsZEFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJCUFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5ID0gVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJCQkuZ2V0T0JTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKTsKLQkJCQkJTGlzdCBwYXJlbnRzTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJZ2V0QWN0aXZpdGllc0luU2NvcGUoYWRhcHRlckZhY3RvcnksIGVsZW1lbnQsIHBhcmVudHNMaXN0KTsKLQkJCQkJaWYgKHBhcmVudHNMaXN0LmNvbnRhaW5zKG9iaikpCi0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJaWYgKG9iai5lcXVhbHMoZ2V0UGFyZW50QWN0aXZpdHkoZWxlbWVudCkpKQotCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCUxpc3QgY2hpbGRMaXN0ID0gKChBY3Rpdml0eSkgb2JqKS5nZXRCcmVha2Rvd25FbGVtZW50cygpOwotCQkJCQlpZiAoY2hpbGRMaXN0LmNvbnRhaW5zKGdldFBhcmVudEFjdGl2aXR5KGVsZW1lbnQpKSkKLQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQlMaXN0IGxpc3QgPSBnZXRBbGxvd2FibGVBY3Rpdml0aWVzKCk7Ci0JCQkJCWlmIChsaXN0LmNvbnRhaW5zKG9iaikpewotCQkJCQkJcmV0dXJuIHRydWU7Ci0vLwkJCQkJCUxpc3QgYmVsZW1lbnRzID0gKChBY3Rpdml0eSlvYmopLmdldEJyZWFrZG93bkVsZW1lbnRzKCk7Ci0vLwkJCQkJCWlmKCFiZWxlbWVudHMuaXNFbXB0eSgpKXsKLS8vCQkJCQkJCWlmKGNvbnRhaW5zVHlwZShiZWxlbWVudHMsIFJvbGVEZXNjcmlwdG9yLmNsYXNzLAotLy8JCQkJCQkJCQkJCWdldEhlbHBlcigpKSkKLS8vCQkJCQkJCXJldHVybiB0cnVlOwotLy8JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFJvbGVEZXNjcmlwdG9yKSB7Ci0JCQkJCU9iamVjdCBwYXJlbnRBY3Rpdml0eSA9IGdldFBhcmVudEFjdGl2aXR5KChCcmVha2Rvd25FbGVtZW50KSBvYmopOwotCQkJCQlPYmplY3QgcGFyZW50ID0gZ2V0UGFyZW50QWN0aXZpdHkoZWxlbWVudCk7Ci0JCQkJCWlmIChwYXJlbnQuZXF1YWxzKHBhcmVudEFjdGl2aXR5KSkKLQkJCQkJCXJldHVybiB0cnVlOwotCi0JCQkJCWlmIChwYXJlbnRBY3Rpdml0eSBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJCQlpZiAoZ2V0QmFzZUFjdGl2aXRpZXMoKEFjdGl2aXR5KSBwYXJlbnQpLmNvbnRhaW5zKAotCQkJCQkJCQlwYXJlbnRBY3Rpdml0eSkpCi0JCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCQlpZiAoZ2V0QWxsb3dhYmxlQWN0aXZpdGllcygpLmNvbnRhaW5zKHBhcmVudEFjdGl2aXR5KSkKLQkJCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgUm9sZURlc2NyaXB0b3JXcmFwcGVySXRlbVByb3ZpZGVyCi0JCQkJCQl8fCBvYmogaW5zdGFuY2VvZiBDb21wb3NpdGVSb2xlV3JhcHBlckl0ZW1Qcm92aWRlcikgewotCQkJCQlPYmplY3Qgb2JqZWN0ID0gKChCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgb2JqKQotCQkJCQkJCS5nZXRQYXJlbnQob2JqKTsKLQkJCQkJaWYgKGdldFBhcmVudEFjdGl2aXR5KGVsZW1lbnQpLmVxdWFscyhvYmplY3QpKQotCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCWlmIChvYmplY3QgaW5zdGFuY2VvZiBBY3Rpdml0eQotCQkJCQkJCXx8IG9iamVjdCBpbnN0YW5jZW9mIEFjdGl2aXR5V3JhcHBlckl0ZW1Qcm92aWRlcikgewotCQkJCQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIEFjdGl2aXR5V3JhcHBlckl0ZW1Qcm92aWRlcikgewotCQkJCQkJCW9iamVjdCA9ICgoQWN0aXZpdHlXcmFwcGVySXRlbVByb3ZpZGVyKSBvYmplY3QpCi0JCQkJCQkJCQkuZ2V0VmFsdWUoKTsKLQkJCQkJCX0KLQkJCQkJCWlmIChnZXRBbGxvd2FibGVBY3Rpdml0aWVzKCkuY29udGFpbnMob2JqZWN0KSkKLQkJCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgQWN0aXZpdHlXcmFwcGVySXRlbVByb3ZpZGVyKSB7Ci0JCQkJCU9iamVjdCBwYXJlbnQgPSAoKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSBvYmopCi0JCQkJCQkJLmdldFBhcmVudChvYmopOwotCQkJCQlpZiAoZ2V0UGFyZW50QWN0aXZpdHkoZWxlbWVudCkuZXF1YWxzKHBhcmVudCkpCi0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJT2JqZWN0IG9iamVjdCA9ICgoQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIG9iaikKLQkJCQkJCQkuZ2V0VmFsdWUoKTsKLQkJCQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJCQlMaXN0IGxpc3QgPSBnZXRBbGxvd2FibGVBY3Rpdml0aWVzKCk7Ci0JCQkJCQlpZiAobGlzdC5jb250YWlucyhvYmplY3QpKXsKLQkJCQkJCQlyZXR1cm4gdHJ1ZTsKLS8vCQkJCQkJCUxpc3QgYmVsZW1lbnRzID0gKChBY3Rpdml0eSlvYmopLmdldEJyZWFrZG93bkVsZW1lbnRzKCk7Ci0vLwkJCQkJCQlpZighYmVsZW1lbnRzLmlzRW1wdHkoKSl7Ci0vLwkJCQkJCQkJaWYoY29udGFpbnNUeXBlKGJlbGVtZW50cywgUm9sZURlc2NyaXB0b3IuY2xhc3MsZ2V0SGVscGVyKCkpKQotLy8JCQkJCQkJCXJldHVybiB0cnVlOwotLy8JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JCi0JcHJpdmF0ZSBMaXN0IGdldEJhc2VBY3Rpdml0aWVzKEFjdGl2aXR5IGFjdGl2aXR5KSB7Ci0JCUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJd2hpbGUgKCFhY3Rpdml0eS5nZXRWYXJpYWJpbGl0eVR5cGUoKQotCQkJCS5lcXVhbHMoVmFyaWFiaWxpdHlUeXBlLk5BKSkgewotCQkJVmFyaWFiaWxpdHlFbGVtZW50IHZlID0gYWN0aXZpdHkuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpOwotCi0JCQlpZiAoKHZlICE9IG51bGwpICYmICh2ZSBpbnN0YW5jZW9mIEFjdGl2aXR5KSkgewotCi0JCQkJbGlzdC5hZGQodmUpOwotCi0JCQkJYWN0aXZpdHkgPSAoQWN0aXZpdHkpIHZlOwotCQkJfSBlbHNlIHsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbGlzdDsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgcGFyZW50IGFjdGl2aXR5IGZvciBicmVha2Rvd25lbGVtZW50Ci0JICogCi0JICogQHBhcmFtIGJyRWxlbWVudAotCSAqIEByZXR1cm4KLQkgKiAJCQlQYXJlbnQgYWN0aXZpdHkKLQkgKi8KLQlwcml2YXRlIE9iamVjdCBnZXRQYXJlbnRBY3Rpdml0eShCcmVha2Rvd25FbGVtZW50IGJyRWxlbWVudCkgewotCQlBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSA9IFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJLmdldE9CU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCk7Ci0JCUl0ZW1Qcm92aWRlckFkYXB0ZXIgYWRhcHRlciA9IChJdGVtUHJvdmlkZXJBZGFwdGVyKSBhZGFwdGVyRmFjdG9yeQotCQkJCS5hZGFwdChickVsZW1lbnQsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCU9iamVjdCBwYXJlbnQgPSBhZGFwdGVyLmdldFBhcmVudChickVsZW1lbnQpOwotCQl3aGlsZSAoIShwYXJlbnQgaW5zdGFuY2VvZiBBY3Rpdml0eSkpIHsKLQkJCWJyRWxlbWVudCA9IChCcmVha2Rvd25FbGVtZW50KSBwYXJlbnQ7Ci0JCQlhZGFwdGVyID0gKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIGFkYXB0ZXJGYWN0b3J5LmFkYXB0KGJyRWxlbWVudCwKLQkJCQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCXBhcmVudCA9IGFkYXB0ZXIuZ2V0UGFyZW50KGJyRWxlbWVudCk7Ci0JCX0KLQotCQlyZXR1cm4gcGFyZW50OwotCX0KLQotCS8qKgotCSAqIEdldCBhbGwgY2hpbGRyZW4gb2YgdGhlIGFjdGl2aXR5IHBhcmVudCByZWN1cnNpdmVseS4KLQkgKiAKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogQHBhcmFtIGFjdGl2aXR5TGlzdAotCSAqLwotCXByaXZhdGUgdm9pZCBnZXRDaGlsZEFjdGl2aXRpZXNJblNjb3BlKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LAotCQkJQWN0aXZpdHkgcGFyZW50LCBMaXN0IGFjdGl2aXR5TGlzdCkgewotCQlJdGVtUHJvdmlkZXJBZGFwdGVyIGFkYXB0ZXIgPSAoSXRlbVByb3ZpZGVyQWRhcHRlcikgYWRhcHRlckZhY3RvcnkKLQkJCQkuYWRhcHQocGFyZW50LCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCi0JCU9iamVjdCBvID0gYWRhcHRlci5nZXRDaGlsZHJlbihwYXJlbnQpOwotCQlpZiAobyBpbnN0YW5jZW9mIExpc3QpIHsKLQkJCUxpc3QgY2hpbGRyZW4gPSAoTGlzdCkgbzsKLQkJZm9yIChJdGVyYXRvciBpdG9yID0gY2hpbGRyZW4uaXRlcmF0b3IoKTsgaXRvci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3Qgb2JqID0gaXRvci5uZXh0KCk7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQlhY3Rpdml0eUxpc3QuYWRkKG9iaik7Ci0JCQkJZ2V0Q2hpbGRBY3Rpdml0aWVzSW5TY29wZShhZGFwdGVyRmFjdG9yeSwgKEFjdGl2aXR5KSBvYmosCi0JCQkJCQlhY3Rpdml0eUxpc3QpOwotCQkJCX0KLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgQWN0aXZpdHlXcmFwcGVySXRlbVByb3ZpZGVyKSB7Ci0JCQkJCU9iamVjdCBvMSA9ICgoV3JhcHBlckl0ZW1Qcm92aWRlcikgb2JqKS5nZXRWYWx1ZSgpOwotCQkJCQlhY3Rpdml0eUxpc3QuYWRkKG8xKTsKLQkJCQkJZ2V0Q2hpbGRBY3Rpdml0aWVzSW5TY29wZShhZGFwdGVyRmFjdG9yeSwgKEFjdGl2aXR5KSBvMSwKLQkJCQkJCQlhY3Rpdml0eUxpc3QpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBjb250YWluc1R5cGUoTGlzdCBsaXN0LCBDbGFzcyBjbGFzczEsIEZpbHRlckhlbHBlciBoZWxwZXIpIHsKLQkJZm9yKEl0ZXJhdG9yIGl0ZXJhdG9yID0gbGlzdC5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KXsKLQkJCU9iamVjdCBvYmogPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZihvYmogaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50IAotCQkJCQkmJiBjbGFzczEuaXNJbnN0YW5jZShvYmopCi0JCQkJCSYmIGhlbHBlci5tYXRjaGVyKG9iaikpIAotCQkJCXJldHVybiB0cnVlOwotCQkJaWYob2JqIGluc3RhbmNlb2YgQWN0aXZpdHkpewotCQkJCXJldHVybiBjb250YWluc1R5cGUoKChBY3Rpdml0eSlvYmopLmdldEJyZWFrZG93bkVsZW1lbnRzKCksCi0JCQkJCQljbGFzczEsIGhlbHBlcik7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEdldCBhbGwgYWN0aXZpdGllcyBpbiBzY29wZQotCSAqIAotCSAqIEByZXR1cm4KLQkgKiAJCUxpc3Qgb2YgYWN0aXZpdGllcyBpbiBzY29wZQotCSAqLwotCXByaXZhdGUgTGlzdCBnZXRBbGxvd2FibGVBY3Rpdml0aWVzKCkgewotCQlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCS8vIHBhcmVudCBhY3Rpdml0eQotCQlPYmplY3Qgb2JqZWN0ID0gZ2V0UGFyZW50QWN0aXZpdHkoZWxlbWVudCk7Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkgPSBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkuZ2V0T0JTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKTsKLQkJCS8vIGdldCBhbGwgY2hpbGQgYWN0aXZpdGllcyBpbiBzY29wZQotCQkJZ2V0Q2hpbGRBY3Rpdml0aWVzSW5TY29wZShhZGFwdGVyRmFjdG9yeSwgKEFjdGl2aXR5KSBvYmplY3QsIGxpc3QpOwotCQl9Ci0JCS8vIGdldCBiYXNlIGFjdGl2aXRpZXMgZm9yIGFsbCBhY3Rpdml0aWVzIGluIHNjb3BlCi0JCUhhc2hTZXQgYmFzZUFjdGl2dGllcyA9IG5ldyBIYXNoU2V0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRvciA9IGxpc3QuaXRlcmF0b3IoKTsgaXRvci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3Qgb2JqID0gaXRvci5uZXh0KCk7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQliYXNlQWN0aXZ0aWVzLmFkZEFsbChnZXRCYXNlQWN0aXZpdGllcygoQWN0aXZpdHkpIG9iaikpOwotCQkJfQotCQl9Ci0KLQkJLy8gcmV0dXJuIGNvbXBsZXRlIGxpc3Qgb2YgY2hpbGQgYWN0aXZpdGllcyBhbmQgaXQncyBiYXNlIGFjdGl2aXRpZXMKLQkJbGlzdC5hZGRBbGwoYmFzZUFjdGl2dGllcyk7Ci0JCXJldHVybiBsaXN0OwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvV29ya0JyZWFrZG93bkVsZW1lbnRHZW5lcmFsU2VjdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL1dvcmtCcmVha2Rvd25FbGVtZW50R2VuZXJhbFNlY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTg5ZDI2My4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvV29ya0JyZWFrZG93bkVsZW1lbnRHZW5lcmFsU2VjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE3NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLldyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLkNvbHVtbkRlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLlByb2Nlc3NFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS51dGlsLk1zZ0RpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLlN0clV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklBY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuSUJTSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5QcmVkZWNlc3Nvckxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlByb2Nlc3NVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLkxpYnJhcnlVSVRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NaWxlc3RvbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZWFtUHJvZmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya0JyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrT3JkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrT3JkZXJUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2VsbEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNvbWJvQm94Q2VsbEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDZWxsRWRpdG9yVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNlbGxNb2RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UZXh0Q2VsbEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci0KLQotLyoqCi0gKiBUaGUgZ2VuZXJhbCB0YWIgc2VjdGlvbiBmb3IgV29ya0JyZWFrZG93bkVsZW1lbnQKLSAqIAotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjAKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgV29ya0JyZWFrZG93bkVsZW1lbnRHZW5lcmFsU2VjdGlvbiBleHRlbmRzCi0JCUJyZWFrZG93bkVsZW1lbnRHZW5lcmFsU2VjdGlvbiB7Ci0JcHJvdGVjdGVkIFdvcmtCcmVha2Rvd25FbGVtZW50IGVsZW1lbnQ7Ci0KLQlwcm90ZWN0ZWQgQnV0dG9uIGV2ZW50RHJpdmVuQnV0dG9uLCBvbmdvaW5nQnV0dG9uLCByZXBlYXRhYmxlQnV0dG9uOwotCi0JLy8gcHJvdGVjdGVkIFRleHQgcHJlZGVjZXNzb3JUZXh0OwotCXByb3RlY3RlZCBCdXR0b24gYWRkQnV0dG9uLCBlZGl0QnV0dG9uLCByZW1vdmVCdXR0b247Ci0KLQkvLyBwcml2YXRlIFNlbGVjdGlvbkxpc3RlbmVyIGV2ZW50RHJpdmVuQnV0dG9uU2VsZWN0aW9uTGlzdGVuZXI7Ci0JLy8gcHJpdmF0ZSBTZWxlY3Rpb25MaXN0ZW5lciBvbmdvaW5nQnV0dG9uU2VsZWN0aW9uTGlzdGVuZXI7Ci0JLy8gcHJpdmF0ZSBTZWxlY3Rpb25MaXN0ZW5lciByZXBlYXRhYmxlQnV0dG9uU2VsZWN0aW9uTGlzdGVuZXI7Ci0KLQkvLyBwcml2YXRlIExpc3RlbmVyIHByZWRlY2Vzc29yc0xpc3RlbmVyOwotCi0JLy8gcHJpdmF0ZSBDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5OwotCi0JcHJpdmF0ZSBUYWJsZVZpZXdlciB2aWV3ZXI7Ci0KLQkvLyBwcml2YXRlIFRhYmxlIHRhYmxlOwotCXByaXZhdGUgVGV4dENlbGxFZGl0b3IgdGV4dENlbGxFZGl0b3I7Ci0KLQlwcml2YXRlIFZhbGlkYXRpbmdUZXh0Q2VsbEVkaXRvciBpZENlbGxFZGl0b3I7Ci0KLQlwcml2YXRlIENvbWJvQm94Q2VsbEVkaXRvciBjb21ib0JveENlbGxFZGl0b3I7Ci0KLQkvLyBwcmVkZWNlc3NvciBtYXAgbGlzdAotCXByaXZhdGUgTGlzdCBwcmVkTWFwTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQotCXByaXZhdGUgY2xhc3MgVmFsaWRhdGluZ1RleHRDZWxsRWRpdG9yIGV4dGVuZHMgVGV4dENlbGxFZGl0b3IgewotCQlwcm90ZWN0ZWQgT2JqZWN0IGxhc3RJbnZhbGlkRWxlbWVudDsKLQotCQlwcml2YXRlIGludCBjb2x1bW5JbmRleDsKLQotCQkvKioKLQkJICogQHBhcmFtIHBhcmVudAotCQkgKi8KLQkJcHVibGljIFZhbGlkYXRpbmdUZXh0Q2VsbEVkaXRvcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCQlzdXBlcihwYXJlbnQpOwotCQl9Ci0KLQkJdm9pZCBzZXRDb2x1bW5JbmRleChpbnQgY29sdW1uSW5kZXgpIHsKLQkJCXRoaXMuY29sdW1uSW5kZXggPSBjb2x1bW5JbmRleDsKLQkJfQotCi0JCXB1YmxpYyBpbnQgZ2V0Q29sdW1uSW5kZXgoKSB7Ci0JCQlyZXR1cm4gY29sdW1uSW5kZXg7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGdldExhc3RJbnZhbGlkRWxlbWVudCgpIHsKLQkJCXJldHVybiBsYXN0SW52YWxpZEVsZW1lbnQ7Ci0JCX0KLQotCQlTdHJpbmcgaXNWYWxpZChTdHJpbmcgdHh0KSB7Ci0JCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHZpZXdlcgotCQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQlpZiAoc2VsZWN0aW9uLnNpemUoKSA9PSAxKSB7Ci0JCQkJT2JqZWN0IGUgPSBzZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCQkJU3RyaW5nIG1zZyA9IGlzVmFsaWQoZSwgdHh0KTsKLQkJCQlpZiAobXNnICE9IG51bGwpIHsKLQkJCQkJbGFzdEludmFsaWRFbGVtZW50ID0gZTsKLQkJCQl9IGVsc2UgewotCQkJCQlsYXN0SW52YWxpZEVsZW1lbnQgPSBudWxsOwotCQkJCX0KLQkJCQlyZXR1cm4gbXNnOwotCQkJfQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgU3RyaW5nIGlzVmFsaWQoT2JqZWN0IGUsIFN0cmluZyB0eHQpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JLyoqIERlcGVuZGVuY3kgTGl0ZXJhbHMgKiAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGSU5JU0hfVE9fU1RBUlQgPSBQcm9wZXJ0aWVzUmVzb3VyY2VzLldvcmtPcmRlclR5cGVfRklOSVNIX1RPX1NUQVJUOyAKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGSU5JU0hfVE9fRklOSVNIID0gUHJvcGVydGllc1Jlc291cmNlcy5Xb3JrT3JkZXJUeXBlX0ZJTklTSF9UT19GSU5JU0g7IAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNUQVJUX1RPX1NUQVJUID0gUHJvcGVydGllc1Jlc291cmNlcy5Xb3JrT3JkZXJUeXBlX1NUQVJUX1RPX1NUQVJUOyAKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTVEFSVF9UT19GSU5JU0ggPSBQcm9wZXJ0aWVzUmVzb3VyY2VzLldvcmtPcmRlclR5cGVfU1RBUlRfVE9fRklOSVNIOyAKLQotCS8qKiBDb2x1bW4gaWRzICogKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09MX0lEID0gSUJTSXRlbVByb3ZpZGVyLkNPTF9JRDsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT0xfUFJFU0VOVEFUSU9OX05BTUUgPSBJQlNJdGVtUHJvdmlkZXIuQ09MX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENPTF9ERVBFTkRFTkNZID0gImRlcGVuZGVuY3kiOyAvLyROT04tTkxTLTEkCi0KLQkvKiogQ29sdW1uIGRlc2NyaXB0b3IgY29uc3RhbnRzICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDb2x1bW5EZXNjcmlwdG9yIENPTF9ERVNDX0lEID0gbmV3IENvbHVtbkRlc2NyaXB0b3IoCi0JCQlDT0xfSUQsCi0JCQlQcm9wZXJ0aWVzUmVzb3VyY2VzLldvcmtCcmVha2Rvd25FbGVtZW50X0RlcGVuZGVuY3lfQ09MX0lEX1RFWFQsIDAsIDEwMCwgdHJ1ZSwgQ29sdW1uRGVzY3JpcHRvci5DRUxMX0VESVRPUl9UWVBFX1RFWFQsIFNXVC5DRU5URVIpOyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29sdW1uRGVzY3JpcHRvciBDT0xfREVTQ19QUkVTRU5UQVRJT05fTkFNRSA9IG5ldyBDb2x1bW5EZXNjcmlwdG9yKAotCQkJQ09MX1BSRVNFTlRBVElPTl9OQU1FLAotCQkJUHJvcGVydGllc1Jlc291cmNlcy5Xb3JrQnJlYWtkb3duRWxlbWVudF9EZXBlbmRlbmN5X0NPTF9QUkVTRU5UQVRJT05fTkFNRV9URVhULCAxLCAyNTAsIHRydWUsIENvbHVtbkRlc2NyaXB0b3IuQ0VMTF9FRElUT1JfVFlQRV9OT05FKTsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENvbHVtbkRlc2NyaXB0b3IgQ09MX0RFU0NfREVQRU5ERU5DWSA9IG5ldyBDb2x1bW5EZXNjcmlwdG9yKAotCQkJQ09MX0RFUEVOREVOQ1ksCi0JCQlQcm9wZXJ0aWVzUmVzb3VyY2VzLldvcmtCcmVha2Rvd25FbGVtZW50X0RlcGVuZGVuY3lfQ09MX0RFUEVOREVOQ1lfVEVYVCwgMiwgMTAwLCB0cnVlLCBDb2x1bW5EZXNjcmlwdG9yLkNFTExfRURJVE9SX1RZUEVfQ09NQk9fQk9PTEVBTik7IAotCi0JQ29sdW1uRGVzY3JpcHRvcltdIGNvbHVtbkRlc2NyaXB0b3JzID0gbmV3IENvbHVtbkRlc2NyaXB0b3JbXSB7Ci0JCQlDT0xfREVTQ19JRCwgQ09MX0RFU0NfUFJFU0VOVEFUSU9OX05BTUUsIENPTF9ERVNDX0RFUEVOREVOQ1kgfTsKLQotCXByaXZhdGUgc3RhdGljIGNsYXNzIENlbGxFZGl0b3JWYWxpZGF0b3IgaW1wbGVtZW50cyBJQ2VsbEVkaXRvclZhbGlkYXRvciB7Ci0KLQkJcHJpdmF0ZSBWYWxpZGF0aW5nVGV4dENlbGxFZGl0b3IgY2VsbEVkaXRvcjsKLQotCQkvKioKLQkJICogCi0JCSAqLwotCQlwdWJsaWMgQ2VsbEVkaXRvclZhbGlkYXRvcihWYWxpZGF0aW5nVGV4dENlbGxFZGl0b3IgY2VsbEVkaXRvcikgewotCQkJdGhpcy5jZWxsRWRpdG9yID0gY2VsbEVkaXRvcjsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ2VsbEVkaXRvclZhbGlkYXRvciNpc1ZhbGlkKGphdmEubGFuZy5PYmplY3QpCi0JCSAqLwotCQlwdWJsaWMgU3RyaW5nIGlzVmFsaWQoT2JqZWN0IHZhbHVlKSB7Ci0JCQlyZXR1cm4gY2VsbEVkaXRvci5pc1ZhbGlkKChTdHJpbmcpIHZhbHVlKTsKLQkJfQotCi0JfQotCi0JcHJpdmF0ZSBjbGFzcyBWYWxpZGF0aW5nRGVhY3RpdmF0ZUxpc3RlbmVyIGltcGxlbWVudHMgTGlzdGVuZXIgewotCQlwcml2YXRlIFZhbGlkYXRpbmdUZXh0Q2VsbEVkaXRvciBjZWxsRWRpdG9yOwotCi0JCVZhbGlkYXRpbmdEZWFjdGl2YXRlTGlzdGVuZXIoVmFsaWRhdGluZ1RleHRDZWxsRWRpdG9yIGNlbGxFZGl0b3IpIHsKLQkJCXRoaXMuY2VsbEVkaXRvciA9IGNlbGxFZGl0b3I7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQlEaXNwbGF5LmdldEN1cnJlbnQoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJWYWxpZGF0RGVhY3RpdmF0ZWU6OnJ1biIpOwotCQkJCQlpZiAoY2VsbEVkaXRvci5nZXRMYXN0SW52YWxpZEVsZW1lbnQoKSAhPSBudWxsKSB7Ci0JCQkJCQlTdHJpbmcgbWVzc2FnZSA9IGNlbGxFZGl0b3IuZ2V0RXJyb3JNZXNzYWdlKCk7Ci0JCQkJCQlTdHJpbmcgdGl0bGUgPSBnZXRFZGl0b3IoKS5nZXRUaXRsZSgpOwotCQkJCQkJU3RyaW5nIHByb2JsZW0gPSBQcm9wZXJ0aWVzUmVzb3VyY2VzLlByb2Nlc3NFZGl0b3JGb3JtUHJvcGVydGllc190ZXh0RWRpdENlbGxfcHJvYmxlbV9tc2c7IAotCQkJCQkJTXNnRGlhbG9nIGRpYWxvZyA9IEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKQotCQkJCQkJCQkuZ2V0TXNnRGlhbG9nKCk7Ci0JCQkJCQlkaWFsb2cuZGlzcGxheUVycm9yKHRpdGxlLCBwcm9ibGVtLCBtZXNzYWdlKTsgCi0JCQkJCQl2aWV3ZXIuZWRpdEVsZW1lbnQoY2VsbEVkaXRvci5nZXRMYXN0SW52YWxpZEVsZW1lbnQoKSwKLQkJCQkJCQkJY2VsbEVkaXRvci5nZXRDb2x1bW5JbmRleCgpKTsKLQkJCQkJfQotCQkJCX0KLQotCQkJfSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5CcmVha2Rvd25FbGVtZW50R2VuZXJhbFNlY3Rpb24jaW5pdCgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdCgpIHsKLQkJc3VwZXIuaW5pdCgpOwotCi0JCS8vIGdldCB3b3JrYnJlYWtkb3duZWxlbWVudCBvYmplY3QKLQkJZWxlbWVudCA9IChXb3JrQnJlYWtkb3duRWxlbWVudCkgZ2V0RWxlbWVudCgpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLkJyZWFrZG93bkVsZW1lbnRHZW5lcmFsU2VjdGlvbiNjcmVhdGVHZW5lcmFsU2VjdGlvbihvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlR2VuZXJhbFNlY3Rpb24oQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotCQlzdXBlci5jcmVhdGVHZW5lcmFsU2VjdGlvbihjb21wb3NpdGUpOwotCi0JCS8vIEV2ZW50IERyaXZlbgotCQlldmVudERyaXZlbkJ1dHRvbiA9IEZvcm1VSS5jcmVhdGVDaGVja0J1dHRvbih0b29sa2l0LCBjaGVja0JveENvbXBvc2l0ZSwKLQkJCQkxKTsKLQkJZXZlbnREcml2ZW5CdXR0b24uc2V0VGV4dChQcm9wZXJ0aWVzUmVzb3VyY2VzLldvcmtCcmVha2Rvd25FbGVtZW50X0V2ZW50RHJpdmVuKTsgCi0KLQkJLy8gT25nb2luZwotCQlvbmdvaW5nQnV0dG9uID0gRm9ybVVJLmNyZWF0ZUNoZWNrQnV0dG9uKHRvb2xraXQsIGNoZWNrQm94Q29tcG9zaXRlLAotCQkJCTEpOwotCQlvbmdvaW5nQnV0dG9uLnNldFRleHQoUHJvcGVydGllc1Jlc291cmNlcy5Xb3JrQnJlYWtkb3duRWxlbWVudF9PbmdvaW5nKTsgCi0KLQkJLy8gcmVwZWF0YWJsZQotCQlyZXBlYXRhYmxlQnV0dG9uID0gRm9ybVVJLmNyZWF0ZUNoZWNrQnV0dG9uKHRvb2xraXQsIGNoZWNrQm94Q29tcG9zaXRlLAotCQkJCTIpOwotCQlyZXBlYXRhYmxlQnV0dG9uLnNldFRleHQoUHJvcGVydGllc1Jlc291cmNlcy5Xb3JrQnJlYWtkb3duRWxlbWVudF9SZXBlYXRhYmxlKTsgCi0KLQkJLy8gcHJlZGVjZXNzb3JzCi0JCS8vIEZvcm1VSS5jcmVhdGVMYWJlbCh0b29sa2l0LCBnZW5lcmFsQ29tcG9zaXRlLAotCQkvLyBQcm9wZXJ0aWVzUmVzb3VyY2VzLmdldFN0cmluZygiV29ya0JyZWFrZG93bkVsZW1lbnQuUHJlZGVjZXNzb3JzIikpOwotCQkvLyBwcmVkZWNlc3NvclRleHQgPSBGb3JtVUkuY3JlYXRlVGV4dCh0b29sa2l0LCBnZW5lcmFsQ29tcG9zaXRlLAotCQkvLyBTV1QuREVGQVVMVCwgaG9yaXpvbnRhbFNwYW4pOwotCQkvLyBwcmVkZWNlc3NvclRleHQuc2V0VGV4dChnZXRQcmVkZWNlc3NvcnNMaXN0KCkpOwotCi0JCS8vIGRlcGVuZW5jeSB0eXBlCi0KLQkJRm9ybVVJLmNyZWF0ZUxhYmVsKHRvb2xraXQsIGdlbmVyYWxDb21wb3NpdGUsIFByb3BlcnRpZXNSZXNvdXJjZXMuV29ya0JyZWFrZG93bkVsZW1lbnRfRGVwZW5kZW5jeSk7IAotCi0JCXRyeSB7Ci0JCQkvLyBjcmVhdGUgdmlld2VyCi0JCQljcmVhdGVWaWV3ZXIoZ2VuZXJhbENvbXBvc2l0ZSwgMik7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJbG9nZ2VyCi0JCQkJCS5sb2dFcnJvcigKLQkJCQkJCQkiRXJyb3IgY3JlYXRpbmcgdmlld2VyIGZvciB3b3JrYnJlYWtkb3duIGVsZW1lbnQgZ2VuZXJhbCBzZWN0aW9uOiAiLCBleCk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCS8vIGNyZWF0ZSBidXR0b24gcGFuZQotCQlDb21wb3NpdGUgYnV0dG9uUGFuZSA9IHRvb2xraXQuY3JlYXRlQ29tcG9zaXRlKGdlbmVyYWxDb21wb3NpdGUpOwotCQlidXR0b25QYW5lLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfVkVSVElDQUwpKTsKLQkJYnV0dG9uUGFuZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0KLQkJRm9ybVVJLmNyZWF0ZUxhYmVsKHRvb2xraXQsIGJ1dHRvblBhbmUsICIiKTsgLy8kTk9OLU5MUy0xJAotCQlhZGRCdXR0b24gPSBGb3JtVUkuY3JlYXRlQnV0dG9uKHRvb2xraXQsIGJ1dHRvblBhbmUsCi0JCQkJUHJvcGVydGllc1Jlc291cmNlcy5Xb3JrQnJlYWtkb3duRWxlbWVudF9EZXBlbmRlbmN5X0FkZCk7IAotCQllZGl0QnV0dG9uID0gRm9ybVVJLmNyZWF0ZUJ1dHRvbih0b29sa2l0LCBidXR0b25QYW5lLAotCQkJCVByb3BlcnRpZXNSZXNvdXJjZXMuV29ya0JyZWFrZG93bkVsZW1lbnRfRGVwZW5kZW5jeV9FZGl0KTsgCi0JCXJlbW92ZUJ1dHRvbiA9IEZvcm1VSS5jcmVhdGVCdXR0b24odG9vbGtpdCwgYnV0dG9uUGFuZSwKLQkJCQlQcm9wZXJ0aWVzUmVzb3VyY2VzLldvcmtCcmVha2Rvd25FbGVtZW50X0RlcGVuZGVuY3lfUmVtb3ZlKTsgCi0JCWVkaXRCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCXJlbW92ZUJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRMaXN0ZW5lcnMoKSB7Ci0JCXN1cGVyLmFkZExpc3RlbmVycygpOwotCi0JCWV2ZW50RHJpdmVuQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQllbGVtZW50ID0gKFdvcmtCcmVha2Rvd25FbGVtZW50KSBnZXRFbGVtZW50KCk7Ci0JCQkJYm9vbGVhbiBzdGF0dXMgPSBhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuU0VULAotCQkJCQkJZWxlbWVudCwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJLmdldFdvcmtCcmVha2Rvd25FbGVtZW50X0lzRXZlbnREcml2ZW4oKSwKLQkJCQkJCUJvb2xlYW4udmFsdWVPZihldmVudERyaXZlbkJ1dHRvbi5nZXRTZWxlY3Rpb24oKSksIC0xKTsKLQkJCQlpZiAoIXN0YXR1cykKLQkJCQkJZXZlbnREcml2ZW5CdXR0b24uc2V0U2VsZWN0aW9uKGVsZW1lbnQuZ2V0SXNFdmVudERyaXZlbigpCi0JCQkJCQkJLmJvb2xlYW5WYWx1ZSgpKTsKLQotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJfQotCQl9KTsKLQotCQlvbmdvaW5nQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQllbGVtZW50ID0gKFdvcmtCcmVha2Rvd25FbGVtZW50KSBnZXRFbGVtZW50KCk7Ci0JCQkJYm9vbGVhbiBzdGF0dXMgPSBhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuU0VULAotCQkJCQkJZWxlbWVudCwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJLmdldFdvcmtCcmVha2Rvd25FbGVtZW50X0lzT25nb2luZygpLCBCb29sZWFuCi0JCQkJCQkJCS52YWx1ZU9mKG9uZ29pbmdCdXR0b24uZ2V0U2VsZWN0aW9uKCkpLCAtMSk7Ci0JCQkJaWYgKCFzdGF0dXMpCi0JCQkJCW9uZ29pbmdCdXR0b24uc2V0U2VsZWN0aW9uKGVsZW1lbnQuZ2V0SXNPbmdvaW5nKCkKLQkJCQkJCQkuYm9vbGVhblZhbHVlKCkpOwotCi0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQl9Ci0JCX0pOwotCi0JCXJlcGVhdGFibGVCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWVsZW1lbnQgPSAoV29ya0JyZWFrZG93bkVsZW1lbnQpIGdldEVsZW1lbnQoKTsKLQkJCQlib29sZWFuIHN0YXR1cyA9IGFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5TRVQsCi0JCQkJCQllbGVtZW50LCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkuZ2V0V29ya0JyZWFrZG93bkVsZW1lbnRfSXNSZXBlYXRhYmxlKCksCi0JCQkJCQlCb29sZWFuLnZhbHVlT2YocmVwZWF0YWJsZUJ1dHRvbi5nZXRTZWxlY3Rpb24oKSksIC0xKTsKLQkJCQlpZiAoIXN0YXR1cykKLQkJCQkJcmVwZWF0YWJsZUJ1dHRvbi5zZXRTZWxlY3Rpb24oZWxlbWVudC5nZXRJc1JlcGVhdGFibGUoKQotCQkJCQkJCS5ib29sZWFuVmFsdWUoKSk7Ci0KLQkJCX0KLQotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCX0KLQkJfSk7Ci0KLQkJYWRkQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkvLyBMaXN0IHByZWRMaXN0ID0gZWxlbWVudC5nZXRMaW5rVG9QcmVkZWNlc3NvcigpOwotCQkJCVdvcmtPcmRlciBvID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlV29ya09yZGVyKCk7Ci0JCQkJby5zZXRMaW5rVHlwZShXb3JrT3JkZXJUeXBlLkZJTklTSF9UT19TVEFSVCk7Ci0KLQkJCQkvLyBwcmVkTGlzdC5hZGQobyk7Ci0KLQkJCQlQcmVkZWNlc3Nvck1hcCBtYXAgPSBuZXcgUHJlZGVjZXNzb3JNYXAoLTEsIChXb3JrT3JkZXIpIG8pOwotCQkJCXByZWRNYXBMaXN0LmFkZChtYXApOwotCi0JCQkJdmlld2VyLnJlZnJlc2goKTsKLQkJCQl2aWV3ZXIuZWRpdEVsZW1lbnQobWFwLCAwKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCX0KLQkJfSk7Ci0KLQkJZWRpdEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJLy8gZ2V0IHNlbGVjdGlvbgotCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgdmlld2VyCi0JCQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJaWYgKHNlbGVjdGlvbi5zaXplKCkgPiAwKSB7Ci0JCQkJCVByZWRlY2Vzc29yTWFwIHByZWRNYXAgPSAoUHJlZGVjZXNzb3JNYXApIHNlbGVjdGlvbgotCQkJCQkJCS5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCQkJSUJTSXRlbVByb3ZpZGVyIGFkYXB0ZXIgPSAoSUJTSXRlbVByb3ZpZGVyKSBnZXRCU0FkYXB0ZXIoKTsKLQkJCQkJT2JqZWN0IHByb2Nlc3MgPSBhZGFwdGVyLmdldFRvcEl0ZW0oKTsKLQotCQkJCQlQcmVkZWNlc3NvckRpYWxvZyBkbGcgPSBuZXcgUHJlZGVjZXNzb3JEaWFsb2coUGxhdGZvcm1VSQotCQkJCQkJCS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKQotCQkJCQkJCS5nZXRTaGVsbCgpLCBlbGVtZW50LCBwcm9jZXNzLCBnZXRBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJCXByZWRNYXAsIHByZWRNYXBMaXN0LCBhY3Rpb25NZ3IpOwotCQkJCQlkbGcub3BlbigpOwotCi0JCQkJCXZpZXdlci5yZWZyZXNoKCk7Ci0KLQkJCQl9Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQl9Ci0JCX0pOwotCi0JCXJlbW92ZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB2aWV3ZXIKLQkJCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQkJCQlpZiAoc2VsZWN0aW9uLnNpemUoKSA+IDApIHsKLQkJCQkJUHJlZGVjZXNzb3JNYXAgbWFwID0gKFByZWRlY2Vzc29yTWFwKSBzZWxlY3Rpb24KLQkJCQkJCQkuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCQkJCXByZWRNYXBMaXN0LnJlbW92ZShtYXApOwotCi0JCQkJCVdvcmtPcmRlciB3byA9IG1hcC5nZXRXb3JrT3JkZXIoKTsKLQkJCQkJV29ya0JyZWFrZG93bkVsZW1lbnQgd2JlID0gKFdvcmtCcmVha2Rvd25FbGVtZW50KSBnZXRFbGVtZW50KCk7Ci0JCQkJCWFjdGlvbk1ncgotCQkJCQkJCS5kb0FjdGlvbigKLQkJCQkJCQkJCUlBY3Rpb25NYW5hZ2VyLlJFTU9WRSwKLQkJCQkJCQkJCXdiZSwKLQkJCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJCS5nZXRXb3JrQnJlYWtkb3duRWxlbWVudF9MaW5rVG9QcmVkZWNlc3NvcigpLAotCQkJCQkJCQkJd28sIC0xKTsKLQkJCQkJdmlld2VyLnJlZnJlc2goKTsKLQotCQkJCX0KLQotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJfQotCQl9KTsKLQotCQl2aWV3ZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewotCi0JCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgdmlld2VyCi0JCQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJaWYgKHNlbGVjdGlvbi5zaXplKCkgPT0gMSAmJiBlZGl0YWJsZSkgewotCQkJCQlyZW1vdmVCdXR0b24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQkJZWRpdEJ1dHRvbi5zZXRFbmFibGVkKHRydWUpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGNvbW1hIHNlcGFyYXRlZCBsaXN0IG9mIHByZWRlY2Vzc29ycwotCSAqIAotCSAqIEByZXR1cm4KLQkgKi8KLQkvLyBwcml2YXRlIFN0cmluZyBnZXRQcmVkZWNlc3NvcnNMaXN0KCkKLQkvLyB7Ci0JLy8gSUJTSXRlbVByb3ZpZGVyIGFkYXB0ZXIgPSAoSUJTSXRlbVByb3ZpZGVyKSBnZXRCU0FkYXB0ZXIoKTsKLQkvLyByZXR1cm4gYWRhcHRlci5nZXRBdHRyaWJ1dGUoZWxlbWVudCwgSUJTSXRlbVByb3ZpZGVyLkNPTF9QUkVERUNFU1NPUlMpOwotCS8vIH0KLQkvLyBwcm90ZWN0ZWQgdm9pZCBhZGRMaXN0ZW5lcnMoKQotCS8vIHsKLQkvLyBzdXBlci5hZGRMaXN0ZW5lcnMoKTsKLQkvLwkJCi0JLy8gZXZlbnREcml2ZW5CdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIoZXZlbnREcml2ZW5CdXR0b25TZWxlY3Rpb25MaXN0ZW5lcik7Ci0JLy8gb25nb2luZ0J1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihvbmdvaW5nQnV0dG9uU2VsZWN0aW9uTGlzdGVuZXIpOwotCS8vIHJlcGVhdGFibGVCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIocmVwZWF0YWJsZUJ1dHRvblNlbGVjdGlvbkxpc3RlbmVyKTsKLQkvLyAvL3ByZWRlY2Vzc29yVGV4dC5hZGRMaXN0ZW5lcihTV1QuRGVhY3RpdmF0ZSwgcHJlZGVjZXNzb3JzTGlzdGVuZXIpOwotCS8vIH0KLQkvLwkKLQkvLyBwcm90ZWN0ZWQgdm9pZCByZW1vdmVMaXN0ZW5lcnMoKQotCS8vIHsKLQkvLyBzdXBlci5yZW1vdmVMaXN0ZW5lcnMoKTsKLQkvLwkJCQotCS8vIGV2ZW50RHJpdmVuQnV0dG9uLnJlbW92ZVNlbGVjdGlvbkxpc3RlbmVyKGV2ZW50RHJpdmVuQnV0dG9uU2VsZWN0aW9uTGlzdGVuZXIpOwotCS8vIG9uZ29pbmdCdXR0b24ucmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXIob25nb2luZ0J1dHRvblNlbGVjdGlvbkxpc3RlbmVyKTsKLQkvLyByZXBlYXRhYmxlQnV0dG9uLnJlbW92ZVNlbGVjdGlvbkxpc3RlbmVyKHJlcGVhdGFibGVCdXR0b25TZWxlY3Rpb25MaXN0ZW5lcik7Ci0JLy8gLy9wcmVkZWNlc3NvclRleHQucmVtb3ZlTGlzdGVuZXIoU1dULkRlYWN0aXZhdGUsIHByZWRlY2Vzc29yc0xpc3RlbmVyKTsKLQkvLyB9Ci0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlQ29udHJvbHMoKSB7Ci0JCXN1cGVyLnVwZGF0ZUNvbnRyb2xzKCk7Ci0JCWV2ZW50RHJpdmVuQnV0dG9uLnNldEVuYWJsZWQoZWRpdGFibGUpOwotCQlvbmdvaW5nQnV0dG9uLnNldEVuYWJsZWQoZWRpdGFibGUpOwotCQlyZXBlYXRhYmxlQnV0dG9uLnNldEVuYWJsZWQoZWRpdGFibGUpOwotCQl2aWV3ZXIuZ2V0VGFibGUoKS5zZXRFbmFibGVkKGVkaXRhYmxlKTsKLQkJYWRkQnV0dG9uLnNldEVuYWJsZWQoZWRpdGFibGUpOwotCi0JCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgdmlld2VyCi0JCQkJLmdldFNlbGVjdGlvbigpOwotCQlpZiAoc2VsZWN0aW9uLnNpemUoKSA9PSAxICYmIGVkaXRhYmxlKSB7Ci0JCQlyZW1vdmVCdXR0b24uc2V0RW5hYmxlZChlZGl0YWJsZSk7Ci0JCQllZGl0QnV0dG9uLnNldEVuYWJsZWQoZWRpdGFibGUpOwotCQl9IGVsc2UgewotCQkJcmVtb3ZlQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJZWRpdEJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJfQotCi0vLwkJaWYgKChFUEZQcm9wZXJ0eVNoZWV0UGFnZS5mb3JtUGFnZUlECi0vLwkJCQkuZXF1YWxzKFByb2Nlc3NFZGl0b3IuVEFfRk9STV9JRCkpCi0vLwkJCQl8fCAoRVBGUHJvcGVydHlTaGVldFBhZ2UuZm9ybVBhZ2VJRAotLy8JCQkJCQkuZXF1YWxzKFByb2Nlc3NFZGl0b3IuV1BCU19GT1JNX0lEKSkpIHsKLQkJaWYgKCEoRVBGUHJvcGVydHlTaGVldFBhZ2UuZm9ybVBhZ2VJRC5lcXVhbHMoUHJvY2Vzc0VkaXRvci5XQlNfRk9STV9JRCkgfHwgRVBGUHJvcGVydHlTaGVldFBhZ2UuZm9ybVBhZ2VJRAotCQkJCS5lcXVhbHMoUHJvY2Vzc0VkaXRvci5DT05TT0xJREFURURfRk9STV9JRCkpKSB7Ci0JCQlhZGRCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQlyZW1vdmVCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQllZGl0QnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJdmlld2VyLmdldFRhYmxlKCkuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCX0KLQl9Ci0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5CcmVha2Rvd25FbGVtZW50R2VuZXJhbFNlY3Rpb24jcmVmcmVzaCgpCi0JICovCi0JcHVibGljIHZvaWQgcmVmcmVzaCgpIHsKLQkJdHJ5IHsKLQkJCWlmIChnZXRFbGVtZW50KCkgaW5zdGFuY2VvZiBXb3JrQnJlYWtkb3duRWxlbWVudCkgewotCQkJCXN1cGVyLnJlZnJlc2goKTsKLQkJCQllbGVtZW50ID0gKFdvcmtCcmVha2Rvd25FbGVtZW50KSBnZXRFbGVtZW50KCk7Ci0KLQkJCQlldmVudERyaXZlbkJ1dHRvbi5zZXRTZWxlY3Rpb24oZWxlbWVudC5nZXRJc0V2ZW50RHJpdmVuKCkKLQkJCQkJCS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJb25nb2luZ0J1dHRvbi5zZXRTZWxlY3Rpb24oZWxlbWVudC5nZXRJc09uZ29pbmcoKQotCQkJCQkJLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXBlYXRhYmxlQnV0dG9uLnNldFNlbGVjdGlvbihlbGVtZW50LmdldElzUmVwZWF0YWJsZSgpCi0JCQkJCQkuYm9vbGVhblZhbHVlKCkpOwotCQkJCS8vIHByZWRlY2Vzc29yVGV4dC5zZXRUZXh0KGdldFByZWRlY2Vzc29yc0xpc3QoKSk7Ci0KLQkJCQkvLyByZS1pbml0aWFsaXplIHByZWRMaXN0Ci0JCQkJcHJlZE1hcExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJaW5pdGlhbGl6ZVByZWRMaXN0KCk7Ci0JCQkJdmlld2VyLnJlZnJlc2goKTsKLQkJCX0KLQotCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCWxvZ2dlcgotCQkJCQkubG9nRXJyb3IoCi0JCQkJCQkJIkVycm9yIHJlZnJlc2hpbmcgV29ya2JyZWFrZG93biBlbGVtZW50IGdlbmVyYWwgc2VjdGlvbjoiLCBleCk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVWaWV3ZXIoQ29tcG9zaXRlIHBhcmVudCwgaW50IGhvcml6b250YWxTcGFuKSB7Ci0JCS8vIGNyZWF0ZSBwcm9jZXNzIHZpZXdlcgotCQl2aWV3ZXIgPSBuZXcgVGFibGVWaWV3ZXIocGFyZW50LCBTV1QuU0lOR0xFIHwgU1dULkhfU0NST0xMCi0JCQkJfCBTV1QuVl9TQ1JPTEwgfCBTV1QuQk9SREVSIHwgU1dULkZVTExfU0VMRUNUSU9OKTsKLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlKTsKLQkJZ3JpZERhdGEudmVydGljYWxJbmRlbnQgPSAxMDsKLQkJZ3JpZERhdGEuaGVpZ2h0SGludCA9IDUwOwotCQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IGhvcml6b250YWxTcGFuOwotCQl2aWV3ZXIuZ2V0Q29udHJvbCgpLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0JCS8vIHNldCB1cCBjb2x1bW5zCi0JCVN0cmluZ1tdIGNvbFByb3BzID0gbmV3IFN0cmluZ1tjb2x1bW5EZXNjcmlwdG9ycy5sZW5ndGhdOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbHVtbkRlc2NyaXB0b3JzLmxlbmd0aDsgaSsrKSB7Ci0JCQljb2xQcm9wc1tpXSA9IGNvbHVtbkRlc2NyaXB0b3JzW2ldLmlkOwotCQkJVGFibGVDb2x1bW4gY29sdW1uID0gbmV3IFRhYmxlQ29sdW1uKHZpZXdlci5nZXRUYWJsZSgpLAotCQkJCQljb2x1bW5EZXNjcmlwdG9yc1tpXS5hbGlnbm1lbnQpOwotCQkJY29sdW1uLnNldFRleHQoY29sdW1uRGVzY3JpcHRvcnNbaV0ubGFiZWwpOwotCQkJY29sdW1uLnNldFJlc2l6YWJsZShjb2x1bW5EZXNjcmlwdG9yc1tpXS5yZXNpemFibGUpOwotCQkJY29sdW1uLnNldFdpZHRoKGNvbHVtbkRlc2NyaXB0b3JzW2ldLndpZHRoKTsKLQotCQl9Ci0JCXZpZXdlci5nZXRUYWJsZSgpLnNldEhlYWRlclZpc2libGUodHJ1ZSk7Ci0JCXZpZXdlci5zZXRDb2x1bW5Qcm9wZXJ0aWVzKGNvbFByb3BzKTsKLQotCQkvLyB0YWJsZSA9IHZpZXdlci5nZXRUYWJsZSgpOwotCi0JCS8vIGZpbmFsIFRhYmxlQ3Vyc29yIGN1cnNvciA9IG5ldyBUYWJsZUN1cnNvcih0YWJsZSwgU1dULk5PTkUpOwotCQkvLyBmaW5hbCBDb250cm9sRWRpdG9yIGVkaXRvciA9IG5ldyBDb250cm9sRWRpdG9yKGN1cnNvcik7Ci0JCS8vIGVkaXRvci5ncmFiSG9yaXpvbnRhbCA9IHRydWU7Ci0JCS8vIGVkaXRvci5ncmFiVmVydGljYWwgPSB0cnVlOwotCi0JCS8vIGZpbmFsIFRhYmxlQ3Vyc29yIGN1cnNvciA9IG5ldyBUYWJsZUN1cnNvcih0YWJsZSwgU1dULk5PTkUpOwotCQkvLyAvLyBjcmVhdGUgYW4gZWRpdG9yIHRvIGVkaXQgdGhlIGNlbGwgd2hlbiB0aGUgdXNlciBoaXRzICJFTlRFUiIKLQkJLy8gLy8gd2hpbGUgb3ZlciBhIGNlbGwgaW4gdGhlIHRhYmxlCi0JCS8vIGZpbmFsIENvbnRyb2xFZGl0b3IgZWRpdG9yID0gbmV3IENvbnRyb2xFZGl0b3IoY3Vyc29yKTsKLQkJLy8gZWRpdG9yLmdyYWJIb3Jpem9udGFsID0gdHJ1ZTsKLQkJLy8gZWRpdG9yLmdyYWJWZXJ0aWNhbCA9IHRydWU7Ci0JCS8vCi0JCS8vIGN1cnNvci5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJLy8gLy8gd2hlbiB0aGUgVGFibGVFZGl0b3IgaXMgb3ZlciBhIGNlbGwsIHNlbGVjdCB0aGUgY29ycmVzcG9uZGluZyByb3cKLQkJLy8gaW4KLQkJLy8gLy8gdGhlIHRhYmxlCi0JCS8vIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJLy8gdGFibGUuc2V0U2VsZWN0aW9uKG5ldyBUYWJsZUl0ZW1bXSB7IGN1cnNvci5nZXRSb3coKX0pOwotCQkvLyB9Ci0JCS8vIC8vIHdoZW4gdGhlIHVzZXIgaGl0cyAiRU5URVIiIGluIHRoZSBUYWJsZUN1cnNvciwgcG9wIHVwIGEgdGV4dAotCQkvLyBlZGl0b3Igc28gdGhhdAotCQkvLyAvLyB0aGV5IGNhbiBjaGFuZ2UgdGhlIHRleHQgb2YgdGhlIGNlbGwKLQkJLy8gcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJLy8gZmluYWwgVGV4dCB0ZXh0ID0gbmV3IFRleHQoY3Vyc29yLCBTV1QuTk9ORSk7Ci0JCS8vIFRhYmxlSXRlbSByb3cgPSBjdXJzb3IuZ2V0Um93KCk7Ci0JCS8vIGludCBjb2x1bW4gPSBjdXJzb3IuZ2V0Q29sdW1uKCk7Ci0JCS8vIHRleHQuc2V0VGV4dChyb3cuZ2V0VGV4dChjb2x1bW4pKTsKLQkJLy8gdGV4dC5hZGRLZXlMaXN0ZW5lcihuZXcgS2V5QWRhcHRlcigpIHsKLQkJLy8gcHVibGljIHZvaWQga2V5UHJlc3NlZChLZXlFdmVudCBlKSB7Ci0JCS8vIC8vIGNsb3NlIHRoZSB0ZXh0IGVkaXRvciBhbmQgY29weSB0aGUgZGF0YSBvdmVyCi0JCS8vIC8vIHdoZW4gdGhlIHVzZXIgaGl0cyAiRU5URVIiCi0JCS8vIGlmIChlLmNoYXJhY3RlciA9PSBTV1QuQ1IpIHsKLQkJLy8gVGFibGVJdGVtIHJvdyA9IGN1cnNvci5nZXRSb3coKTsKLQkJLy8gaW50IGNvbHVtbiA9IGN1cnNvci5nZXRDb2x1bW4oKTsKLQkJLy8gaWYgKGNvbHVtbiA9PSAxKSByZXR1cm47Ci0JCS8vIHJvdy5zZXRUZXh0KGNvbHVtbiwgdGV4dC5nZXRUZXh0KCkpOwotCQkvLyB0ZXh0LmRpc3Bvc2UoKTsKLQkJLy8gfQotCQkvLyAvLyBjbG9zZSB0aGUgdGV4dCBlZGl0b3Igd2hlbiB0aGUgdXNlciBoaXRzICJFU0MiCi0JCS8vIGlmIChlLmNoYXJhY3RlciA9PSBTV1QuRVNDKSB7Ci0JCS8vIHRleHQuZGlzcG9zZSgpOwotCQkvLyB9Ci0JCS8vIH0KLQkJLy8gfSk7Ci0JCS8vIGVkaXRvci5zZXRFZGl0b3IodGV4dCk7Ci0JCS8vIHRleHQuc2V0Rm9jdXMoKTsKLQkJLy8gfQotCQkvLyB9KTsKLQkJLy8gLy8gSGlkZSB0aGUgVGFibGVDdXJzb3Igd2hlbiB0aGUgdXNlciBoaXRzIHRoZSAiQ1RSTCIgb3IgIlNISUZUIiBrZXkuCi0JCS8vIC8vIFRoaXMgYWxvd3MgdGhlIHVzZXIgdG8gc2VsZWN0IG11bHRpcGxlIGl0ZW1zIGluIHRoZSB0YWJsZS4KLQkJLy8gY3Vyc29yLmFkZEtleUxpc3RlbmVyKG5ldyBLZXlBZGFwdGVyKCkgewotCQkvLyBwdWJsaWMgdm9pZCBrZXlQcmVzc2VkKEtleUV2ZW50IGUpIHsKLQkJLy8gaWYgKGUua2V5Q29kZSA9PSBTV1QuQ1RSTAotCQkvLyB8fCBlLmtleUNvZGUgPT0gU1dULlNISUZUCi0JCS8vIHx8IChlLnN0YXRlTWFzayAmIFNXVC5DT05UUk9MKSAhPSAwCi0JCS8vIHx8IChlLnN0YXRlTWFzayAmIFNXVC5TSElGVCkgIT0gMCkgewotCQkvLyBjdXJzb3Iuc2V0VmlzaWJsZShmYWxzZSk7Ci0JCS8vIH0KLQkJLy8gfQotCQkvLyB9KTsKLQkJLy8gLy8gU2hvdyB0aGUgVGFibGVDdXJzb3Igd2hlbiB0aGUgdXNlciByZWxlYXNlcyB0aGUgIlNISUZUIiBvciAiQ1RSTCIKLQkJLy8ga2V5LgotCQkvLyAvLyBUaGlzIHNpZ25hbHMgdGhlIGVuZCBvZiB0aGUgbXVsdGlwbGUgc2VsZWN0aW9uIHRhc2suCi0JCS8vIHRhYmxlLmFkZEtleUxpc3RlbmVyKG5ldyBLZXlBZGFwdGVyKCkgewotCQkvLyBwdWJsaWMgdm9pZCBrZXlSZWxlYXNlZChLZXlFdmVudCBlKSB7Ci0JCS8vIGlmIChlLmtleUNvZGUgPT0gU1dULkNPTlRST0wgJiYgKGUuc3RhdGVNYXNrICYgU1dULlNISUZUKSAhPSAwKQotCQkvLyByZXR1cm47Ci0JCS8vIGlmIChlLmtleUNvZGUgPT0gU1dULlNISUZUICYmIChlLnN0YXRlTWFzayAmIFNXVC5DT05UUk9MKSAhPSAwKQotCQkvLyByZXR1cm47Ci0JCS8vIGlmIChlLmtleUNvZGUgIT0gU1dULkNPTlRST0wKLQkJLy8gJiYgKGUuc3RhdGVNYXNrICYgU1dULkNPTlRST0wpICE9IDApCi0JCS8vIHJldHVybjsKLQkJLy8gaWYgKGUua2V5Q29kZSAhPSBTV1QuU0hJRlQgJiYgKGUuc3RhdGVNYXNrICYgU1dULlNISUZUKSAhPSAwKQotCQkvLyByZXR1cm47Ci0JCS8vCi0JCS8vIFRhYmxlSXRlbVtdIHNlbGVjdGlvbiA9IHRhYmxlLmdldFNlbGVjdGlvbigpOwotCQkvLyBUYWJsZUl0ZW0gcm93ID0gKHNlbGVjdGlvbi5sZW5ndGggPT0gMCkgPwotCQkvLyB0YWJsZS5nZXRJdGVtKHRhYmxlLmdldFRvcEluZGV4KCkpIDogc2VsZWN0aW9uWzBdOwotCQkvLyB0YWJsZS5zaG93SXRlbShyb3cpOwotCQkvLyBjdXJzb3Iuc2V0U2VsZWN0aW9uKHJvdywgMCk7Ci0JCS8vIGN1cnNvci5zZXRWaXNpYmxlKHRydWUpOwotCQkvLyBjdXJzb3Iuc2V0Rm9jdXMoKTsKLQkJLy8gfQotCQkvLyB9KTsKLQotCQlJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciBjb250ZW50UHJvdmlkZXIgPSBuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoCi0JCQkJZ2V0QWRhcHRlckZhY3RvcnkoKSkgewotCQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBvYmopIHsKLQkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlByZWRNYXBMaXN0OjoiK3ByZWRNYXBMaXN0KTsKLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgTGlzdCkgewotCQkJCQlyZXR1cm4gKChMaXN0KSBwcmVkTWFwTGlzdCkudG9BcnJheSgpOwotCQkJCX0KLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJfTsKLQotCQl2aWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKGNvbnRlbnRQcm92aWRlcik7Ci0JCUlMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIgPSBuZXcgQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyKAotCQkJCWdldEFkYXB0ZXJGYWN0b3J5KCkpIHsKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uVGV4dChPYmplY3Qgb2JqLCBpbnQgaSkgewotCQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiV29ya0JyZWFrZG93bkVsZW1lbnRHZW5lcmFsU2VjdGlvbjo6bGFiZWxQcm92aWRlcgotCQkJCS8vIE9iamVjdC0gIiArIG9iaik7Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFByZWRlY2Vzc29yTWFwKSB7Ci0JCQkJCWludCBpZCA9ICgoUHJlZGVjZXNzb3JNYXApIG9iaikuZ2V0SWQoKTsKLQkJCQkJV29ya09yZGVyIHdvID0gKChQcmVkZWNlc3Nvck1hcCkgb2JqKS5nZXRXb3JrT3JkZXIoKTsKLQotCQkJCQlpZiAoaSA9PSAwKSB7Ci0JCQkJCQlyZXR1cm4gU3RyaW5nLnZhbHVlT2YoaWQpOwotCQkJCQl9Ci0JCQkJCWlmIChpID09IDEpIHsKLQkJCQkJCVN0cmluZyBuYW1lID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCWlmICh3by5nZXRQcmVkKCkgIT0gbnVsbCkgewotCQkJCQkJCW5hbWUgPSB3by5nZXRQcmVkKCkuZ2V0UHJlc2VudGF0aW9uTmFtZSgpOwotCQkJCQkJCWlmIChTdHJVdGlsLmlzQmxhbmsobmFtZSkpIHsKLQkJCQkJCQkJcmV0dXJuIHdvLmdldFByZWQoKS5nZXROYW1lKCk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJcmV0dXJuIG5hbWU7Ci0JCQkJCX0KLQkJCQkJaWYgKGkgPT0gMikgewotCQkJCQkJaWYgKHdvLmdldExpbmtUeXBlKCkgPT0gV29ya09yZGVyVHlwZS5GSU5JU0hfVE9fRklOSVNIKQotCQkJCQkJCXJldHVybiBGSU5JU0hfVE9fRklOSVNIOwotCQkJCQkJZWxzZSBpZiAod28uZ2V0TGlua1R5cGUoKSA9PSBXb3JrT3JkZXJUeXBlLkZJTklTSF9UT19TVEFSVCkKLQkJCQkJCQlyZXR1cm4gRklOSVNIX1RPX1NUQVJUOwotCQkJCQkJZWxzZSBpZiAod28uZ2V0TGlua1R5cGUoKSA9PSBXb3JrT3JkZXJUeXBlLlNUQVJUX1RPX1NUQVJUKQotCQkJCQkJCXJldHVybiBTVEFSVF9UT19TVEFSVDsKLQkJCQkJCWVsc2UgaWYgKHdvLmdldExpbmtUeXBlKCkgPT0gV29ya09yZGVyVHlwZS5TVEFSVF9UT19GSU5JU0gpCi0JCQkJCQkJcmV0dXJuIFNUQVJUX1RPX0ZJTklTSDsKLQkJCQkJCXJldHVybiB3by5nZXRMaW5rVHlwZSgpLmdldE5hbWUoKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfTsKLQotCQl2aWV3ZXIuc2V0TGFiZWxQcm92aWRlcihsYWJlbFByb3ZpZGVyKTsKLQotCQl0ZXh0Q2VsbEVkaXRvciA9IG5ldyBUZXh0Q2VsbEVkaXRvcih2aWV3ZXIuZ2V0VGFibGUoKSk7Ci0JCWNvbWJvQm94Q2VsbEVkaXRvciA9IG5ldyBDb21ib0JveENlbGxFZGl0b3Iodmlld2VyLmdldFRhYmxlKCksCi0JCQkJbmV3IFN0cmluZ1tdIHsgRklOSVNIX1RPX1NUQVJULCBGSU5JU0hfVE9fRklOSVNILAotCQkJCQkJU1RBUlRfVE9fU1RBUlQsIFNUQVJUX1RPX0ZJTklTSCB9KTsKLQotCQlzZXRDZWxsRWRpdG9ycygpOwotCQlzZXRDZWxsTW9kaWZpZXJzKCk7Ci0KLQkJaW5pdGlhbGl6ZVByZWRMaXN0KCk7Ci0JCXZpZXdlci5zZXRJbnB1dChwcmVkTWFwTGlzdCk7Ci0JCXZpZXdlci5yZWZyZXNoKCk7Ci0KLQl9Ci0KLQlwcml2YXRlIGludCBnZXRDZWxsRWRpdG9yVHlwZShTdHJpbmcgcHJvcGVydHkpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb2x1bW5EZXNjcmlwdG9ycy5sZW5ndGg7IGkrKykgewotCQkJQ29sdW1uRGVzY3JpcHRvciBkZXNjID0gY29sdW1uRGVzY3JpcHRvcnNbaV07Ci0JCQlpZiAoZGVzYy5pZCA9PSBwcm9wZXJ0eSkgewotCQkJCXJldHVybiBkZXNjLmNlbGxFZGl0b3JUeXBlOwotCQkJfQotCQl9Ci0JCXJldHVybiBDb2x1bW5EZXNjcmlwdG9yLkNFTExfRURJVE9SX1RZUEVfTk9ORTsKLQl9Ci0KLQlwdWJsaWMgQ2VsbEVkaXRvciBnZXRDZWxsRWRpdG9yKFN0cmluZyBjb2x1bW5JRCwgaW50IGNvbHVtbkluZGV4KSB7Ci0JCWlmIChjb2x1bW5JRCA9PSBDT0xfSUQpIHsKLQkJCWlmIChpZENlbGxFZGl0b3IgPT0gbnVsbCkgewotCQkJCWlkQ2VsbEVkaXRvciA9IG5ldyBWYWxpZGF0aW5nVGV4dENlbGxFZGl0b3Iodmlld2VyLmdldFRhYmxlKCkpIHsKLQkJCQkJcHJvdGVjdGVkIFN0cmluZyBpc1ZhbGlkKE9iamVjdCBlLCBTdHJpbmcgdHh0KSB7Ci0JCQkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlZhbGlkYXRpbmdUZXh0Q2VsbEVkaXRvcjo6aXNWYWxpZCIpOwotCQkJCQkJZSA9IFRuZ1V0aWwudW53cmFwKGUpOwotCi0JCQkJCQlJQlNJdGVtUHJvdmlkZXIgYWRhcHRlciA9IChJQlNJdGVtUHJvdmlkZXIpIGdldEJTQWRhcHRlcigpOwotCQkJCQkJT2JqZWN0IHByb2Nlc3MgPSBhZGFwdGVyLmdldFRvcEl0ZW0oKTsKLQotCQkJCQkJTGlzdCBwcmVkZWNlc3NvcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCQlXb3JrQnJlYWtkb3duRWxlbWVudCB3YmUgPSAoV29ya0JyZWFrZG93bkVsZW1lbnQpIGdldEVsZW1lbnQoKTsKLQkJCQkJCVN0cmluZyBzdHIgPSBnZXRQcmVkSWQoKTsKLQkJCQkJCVN0cmluZyByZXN1bHQgPSBQcm9jZXNzVXRpbAotCQkJCQkJCQkuY2hlY2tQcmVkZWNlc3Nvckxpc3Qod2JlLCBzdHIsCi0JCQkJCQkJCQkJZ2V0QWRhcHRlckZhY3RvcnkoKSwgcHJvY2VzcywKLQkJCQkJCQkJCQlwcmVkZWNlc3NvcnMpOwotCi0JCQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJCQl9Ci0JCQkJfTsKLQotCQkJCWlkQ2VsbEVkaXRvcgotCQkJCQkJLnNldFZhbGlkYXRvcihuZXcgQ2VsbEVkaXRvclZhbGlkYXRvcihpZENlbGxFZGl0b3IpKTsKLQkJCQlpZENlbGxFZGl0b3IuZ2V0Q29udHJvbCgpLmFkZExpc3RlbmVyKFNXVC5EZWFjdGl2YXRlLAotCQkJCQkJbmV3IFZhbGlkYXRpbmdEZWFjdGl2YXRlTGlzdGVuZXIoaWRDZWxsRWRpdG9yKSk7Ci0JCQl9Ci0JCQlpZENlbGxFZGl0b3Iuc2V0Q29sdW1uSW5kZXgoY29sdW1uSW5kZXgpOwotCi0JCQlyZXR1cm4gaWRDZWxsRWRpdG9yOwotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldENlbGxFZGl0b3JzKCkgewotCQlDZWxsRWRpdG9yW10gY2VsbEVkaXRvcnMgPSBuZXcgQ2VsbEVkaXRvcltjb2x1bW5EZXNjcmlwdG9ycy5sZW5ndGhdOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbHVtbkRlc2NyaXB0b3JzLmxlbmd0aDsgaSsrKSB7Ci0JCQlDZWxsRWRpdG9yIGNlbGxFZGl0b3IgPSBnZXRDZWxsRWRpdG9yKGNvbHVtbkRlc2NyaXB0b3JzW2ldLmlkLCBpKTsKLQkJCWlmIChjZWxsRWRpdG9yICE9IG51bGwpIHsKLQkJCQljZWxsRWRpdG9yc1tpXSA9IGNlbGxFZGl0b3I7Ci0JCQl9IGVsc2UgewotCQkJCXN3aXRjaCAoY29sdW1uRGVzY3JpcHRvcnNbaV0uY2VsbEVkaXRvclR5cGUpIHsKLQkJCQljYXNlIENvbHVtbkRlc2NyaXB0b3IuQ0VMTF9FRElUT1JfVFlQRV9URVhUOgotCQkJCQljZWxsRWRpdG9yc1tpXSA9IHRleHRDZWxsRWRpdG9yOwotCQkJCQlicmVhazsKLQkJCQljYXNlIENvbHVtbkRlc2NyaXB0b3IuQ0VMTF9FRElUT1JfVFlQRV9DT01CT19CT09MRUFOOgotCQkJCQljZWxsRWRpdG9yc1tpXSA9IGNvbWJvQm94Q2VsbEVkaXRvcjsKLQkJCQkJYnJlYWs7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJY2VsbEVkaXRvcnNbaV0gPSBudWxsOwotCQkJCX0KLQkJCX0KLQkJfQotCQl2aWV3ZXIuc2V0Q2VsbEVkaXRvcnMoY2VsbEVkaXRvcnMpOwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRDZWxsTW9kaWZpZXJzKCkgewotCQkvLyBTZXQgdGhlIGNlbGwgbW9kaWZpZXIKLQkJdmlld2VyLnNldENlbGxNb2RpZmllcihuZXcgSUNlbGxNb2RpZmllcigpIHsKLQkJCXB1YmxpYyBib29sZWFuIGNhbk1vZGlmeShPYmplY3QgZWxlbWVudCwgU3RyaW5nIHByb3BlcnR5KSB7Ci0JCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJjYW5Nb2RpZnk6IGVsZW1lbnQ9IitlbGVtZW50KyIsCi0JCQkJLy8gcHJvcGVydHk9Iitwcm9wZXJ0eSk7Ci0JCQkJaWYgKCEoZWxlbWVudCBpbnN0YW5jZW9mIFByZWRlY2Vzc29yTWFwKSkKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCWlmIChwcm9wZXJ0eSA9PSBDT0xfUFJFU0VOVEFUSU9OX05BTUUpIHsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCi0JCQlwdWJsaWMgT2JqZWN0IGdldFZhbHVlKE9iamVjdCBlbGVtZW50LCBTdHJpbmcgcHJvcGVydHkpIHsKLQkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oImdldFZhbHVlOiBlbGVtZW50PSIrZWxlbWVudCsiLAotCQkJCS8vIHByb3BlcnR5PSIrcHJvcGVydHkpOwotCi0JCQkJU3RyaW5nIHZhbCA9IG51bGw7Ci0JCQkJc3dpdGNoIChnZXRDZWxsRWRpdG9yVHlwZShwcm9wZXJ0eSkpIHsKLQkJCQljYXNlIENvbHVtbkRlc2NyaXB0b3IuQ0VMTF9FRElUT1JfVFlQRV9URVhUOgotCQkJCQl2YWwgPSBuZXcgSW50ZWdlcigoKFByZWRlY2Vzc29yTWFwKSBlbGVtZW50KS5nZXRJZCgpKQotCQkJCQkJCS50b1N0cmluZygpOwotCQkJCQlyZXR1cm4gdmFsOwotCQkJCWNhc2UgQ29sdW1uRGVzY3JpcHRvci5DRUxMX0VESVRPUl9UWVBFX0NPTUJPX0JPT0xFQU46Ci0JCQkJCWludCB2YWx1ZSA9ICgoKFByZWRlY2Vzc29yTWFwKSBlbGVtZW50KS5nZXRXb3JrT3JkZXIoKSkKLQkJCQkJCQkuZ2V0TGlua1R5cGUoKS5nZXRWYWx1ZSgpOwotCQkJCQlpZiAoV29ya09yZGVyVHlwZS5GSU5JU0hfVE9fU1RBUlRfVkFMVUUgPT0gdmFsdWUpIHsKLQkJCQkJCXJldHVybiBuZXcgSW50ZWdlcigwKTsKLQkJCQkJfSBlbHNlIGlmIChXb3JrT3JkZXJUeXBlLkZJTklTSF9UT19GSU5JU0hfVkFMVUUgPT0gdmFsdWUpIHsKLQkJCQkJCXJldHVybiBuZXcgSW50ZWdlcigxKTsKLQkJCQkJfSBlbHNlIGlmIChXb3JrT3JkZXJUeXBlLlNUQVJUX1RPX1NUQVJUX1ZBTFVFID09IHZhbHVlKSB7Ci0JCQkJCQlyZXR1cm4gbmV3IEludGVnZXIoMik7Ci0JCQkJCX0gZWxzZQotCQkJCQkJcmV0dXJuIG5ldyBJbnRlZ2VyKDMpOwotCi0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBtb2RpZnkoZmluYWwgT2JqZWN0IGVsZW1lbnQsIFN0cmluZyBwcm9wZXJ0eSwKLQkJCQkJT2JqZWN0IHZhbHVlKSB7Ci0JCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJtb2RpZnk6IGVsZW1lbnQ9IitlbGVtZW50KyIsCi0JCQkJLy8gcHJvcGVydHk9Iitwcm9wZXJ0eSsiLCB2YWx1ZT0iK3ZhbHVlKTsKLQkJCQlUYWJsZUl0ZW0gaXRlbSA9IChUYWJsZUl0ZW0pIGVsZW1lbnQ7Ci0JCQkJUHJlZGVjZXNzb3JNYXAgcHJlZE1hcCA9IChQcmVkZWNlc3Nvck1hcCkgaXRlbS5nZXREYXRhKCk7Ci0JCQkJV29ya09yZGVyIHdvID0gcHJlZE1hcC5nZXRXb3JrT3JkZXIoKTsKLQotCQkJCWlmIChwcm9wZXJ0eS5lcXVhbHMoQ09MX0lEKSkgewotCQkJCQlpdGVtLnNldFRleHQoMCwgdmFsdWUudG9TdHJpbmcoKSk7Ci0KLQkJCQkJaW50IHByZWRJZDsKLQkJCQkJdHJ5IHsKLQkJCQkJCXByZWRJZCA9IG5ldyBJbnRlZ2VyKHZhbHVlLnRvU3RyaW5nKCkpLmludFZhbHVlKCk7Ci0JCQkJCQlpZiAocHJlZElkIDwgMCkKLQkJCQkJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKCk7Ci0JCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlBdXRob3JpbmdVSVBsdWdpbgotCQkJCQkJCQkuZ2V0RGVmYXVsdCgpCi0JCQkJCQkJCS5nZXRNc2dEaWFsb2coKQotCQkJCQkJCQkuZGlzcGxheVdhcm5pbmcoCi0JCQkJCQkJCQkJUHJvcGVydGllc1Jlc291cmNlcy5Qcm9jZXNzX3ByZWRlY2Vzc29yc192YWxpZE51bWJlclRpdGxlLCAKLQkJCQkJCQkJCQlQcm9wZXJ0aWVzUmVzb3VyY2VzLlByb2Nlc3NfcHJlZGVjZXNzb3JzX3ZhbGlkTnVtYmVyTWVzc2FnZSk7IAotCQkJCQkJcHJlZE1hcExpc3QucmVtb3ZlKHByZWRNYXApOwotCQkJCQkJdmlld2VyLnJlZnJlc2goKTsKLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCQlwcmVkTWFwLnNldElkKHByZWRJZCk7Ci0JCQkJfQotCi0JCQkJZmluYWwgaW50IGNvbHVtbkluZGV4ID0gZ2V0Q29sdW1uSW5kZXgocHJvcGVydHkpOwotCQkJCUNlbGxFZGl0b3IgY2VsbEVkaXRvciA9IHZpZXdlci5nZXRDZWxsRWRpdG9ycygpW2NvbHVtbkluZGV4XTsKLQkJCQlTdHJpbmcgZXJyTXNnID0gY2VsbEVkaXRvci5nZXRFcnJvck1lc3NhZ2UoKTsKLQkJCQlpZiAoZXJyTXNnICE9IG51bGwpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQotCQkJCVdvcmtPcmRlclR5cGUgdHlwZTsKLQkJCQlJQlNJdGVtUHJvdmlkZXIgYWRhcHRlciA9IChJQlNJdGVtUHJvdmlkZXIpIGdldEJTQWRhcHRlcigpOwotCQkJCVdvcmtCcmVha2Rvd25FbGVtZW50IHdiZSA9IChXb3JrQnJlYWtkb3duRWxlbWVudCkgZ2V0RWxlbWVudCgpOwotCQkJCQotCQkJCXN3aXRjaCAoZ2V0Q2VsbEVkaXRvclR5cGUocHJvcGVydHkpKSB7Ci0JCQkJY2FzZSBDb2x1bW5EZXNjcmlwdG9yLkNFTExfRURJVE9SX1RZUEVfVEVYVDoJCQkJCQotCQkJCQlPYmplY3QgcHJvY2VzcyA9IGFkYXB0ZXIuZ2V0VG9wSXRlbSgpOwotCi0JCQkJCUxpc3Q8T2JqZWN0PiBwcmVkZWNlc3NvcnMgPSBuZXcgQXJyYXlMaXN0PE9iamVjdD4oKTsJCQkJCQotCQkJCQlTdHJpbmcgc3RyID0gZ2V0UHJlZElkKCk7Ci0JCQkJCVN0cmluZyByZXN1bHQgPSBQcm9jZXNzVXRpbC5jaGVja1ByZWRlY2Vzc29yTGlzdCh3YmUsIHN0ciwKLQkJCQkJCQlnZXRBZGFwdGVyRmFjdG9yeSgpLCBwcm9jZXNzLCBwcmVkZWNlc3NvcnMpOwotCi0JCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgewotCQkJCQkJTGlzdDxXb3JrT3JkZXI+IGFkZExpc3QgPSBuZXcgQXJyYXlMaXN0PFdvcmtPcmRlcj4oKTsKLQkJCQkJCUxpc3Q8V29ya09yZGVyPiBwcmVkVG9CZURlbGV0ZWQgPSBuZXcgQXJyYXlMaXN0PFdvcmtPcmRlcj4oKTsKLQkJCQkJCVByZWRlY2Vzc29yTGlzdC5wcmVwYXJlVXBkYXRlUHJlZGVjZXNzb3JzKGdldEFkYXB0ZXJGYWN0b3J5KCksIHdiZSwgcHJlZGVjZXNzb3JzLCBhZGRMaXN0LCBwcmVkVG9CZURlbGV0ZWQpOwotCQkJCQkJaWYoIXByZWRUb0JlRGVsZXRlZC5pc0VtcHR5KCkpIHsKLQkJCQkJCQlhY3Rpb25NZ3IuZG9BY3Rpb24oCi0JCQkJCQkJCQlJQWN0aW9uTWFuYWdlci5SRU1PVkVfTUFOWSwKLQkJCQkJCQkJCXdiZSwKLQkJCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFdvcmtCcmVha2Rvd25FbGVtZW50X0xpbmtUb1ByZWRlY2Vzc29yKCksCi0JCQkJCQkJCQlwcmVkVG9CZURlbGV0ZWQsIC0xKTsKLQkJCQkJCX0KLQkJCQkJCWlmKCFhZGRMaXN0LmlzRW1wdHkoKSkgewotCQkJCQkJCWJvb2xlYW4gc3RhdHVzID0gYWN0aW9uTWdyCi0JCQkJCQkJCQkuZG9BY3Rpb24oCi0JCQkJCQkJCQkJCUlBY3Rpb25NYW5hZ2VyLkFERF9NQU5ZLAotCQkJCQkJCQkJCQl3YmUsCi0JCQkJCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJCQkJLmdldFdvcmtCcmVha2Rvd25FbGVtZW50X0xpbmtUb1ByZWRlY2Vzc29yKCksCi0JCQkJCQkJCQkJCWFkZExpc3QsIC0xKTsKLQkJCQkJCQlpZihzdGF0dXMpIHsKLQkJCQkJCQkJLy9UT0RPOiByZXZpZXcgdGhpcwotCQkJCQkJCQlwcmVkTWFwLnNldFdvcmtPcmRlcihhZGRMaXN0LmdldChhZGRMaXN0LnNpemUoKSAtIDEpKTsKLQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQlwcmVkTWFwTGlzdC5yZW1vdmUocHJlZE1hcCk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9IGVsc2UgewotCQkJCQkJLy8gc2hvdyBlcnJvciBtZXNzYWdlIGJveAotCQkJCQkJU3RyaW5nIHRpdGxlID0gZ2V0RWRpdG9yKCkuZ2V0VGl0bGUoKTsKLQkJCQkJCVN0cmluZyBwcm9ibGVtID0gUHJvcGVydGllc1Jlc291cmNlcy5Qcm9jZXNzRWRpdG9yRm9ybVByb3BlcnRpZXNfY2VsbEVkaXRvcl9pbnZhbGlkUHJlZGNlc3Nvcl9wcm9ibGVtX21zZzsgCi0JCQkJCQlNc2dEaWFsb2cgZGlhbG9nID0gQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpCi0JCQkJCQkJCS5nZXRNc2dEaWFsb2coKTsKLQkJCQkJCWRpYWxvZy5kaXNwbGF5V2FybmluZyh0aXRsZSwgcHJvYmxlbSwgcmVzdWx0KTsgCi0JCQkJCQlwcmVkTWFwTGlzdC5yZW1vdmUocHJlZE1hcCk7Ci0JCQkJCX0KLQotCQkJCQlicmVhazsKLQkJCQljYXNlIENvbHVtbkRlc2NyaXB0b3IuQ0VMTF9FRElUT1JfVFlQRV9DT01CT19CT09MRUFOOgotCQkJCQlib29sZWFuIHJlbW92ZWQgPSBmYWxzZTsKLQkJCQkJV29ya0JyZWFrZG93bkVsZW1lbnQgd2JlQ29weSA9IG51bGw7Ci0JCQkJCVdvcmtPcmRlciBvID0gbnVsbDsKLQkJCQkJaW50IGluZGV4ID0gKChOdW1iZXIpIHZhbHVlKS5pbnRWYWx1ZSgpOwotCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB3YmUuZ2V0TGlua1RvUHJlZGVjZXNzb3IoKQotCQkJCQkJCS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJCW8gPSAoV29ya09yZGVyKSBpdGVyLm5leHQoKTsKLQkJCQkJCWlmIChvLmdldFByZWQoKSA9PSB3by5nZXRQcmVkKCkpCi0JCQkJCQl7CQkJCQkJCQotCQkJCQkJCWlmIChvLmdldExpbmtUeXBlKCkuZ2V0VmFsdWUoKSAhPSBpbmRleCkgewotCQkJCQkJCQl3YmVDb3B5ID0gby5nZXRQcmVkKCk7Ci0JCQkJCQkJCWl0ZXIucmVtb3ZlKCk7Ci0JCQkJCQkJCXJlbW92ZWQgPSB0cnVlOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQkJCQkJCi0JCQkJCQkJCQkJCi0JCQkJCWlmIChpbmRleCA9PSAwKSB7Ci0JCQkJCQl0eXBlID0gV29ya09yZGVyVHlwZS5GSU5JU0hfVE9fU1RBUlQ7Ci0JCQkJCX0gZWxzZSBpZiAoaW5kZXggPT0gMSkgewotCQkJCQkJdHlwZSA9IFdvcmtPcmRlclR5cGUuRklOSVNIX1RPX0ZJTklTSDsKLQkJCQkJfSBlbHNlIGlmIChpbmRleCA9PSAyKSB7Ci0JCQkJCQl0eXBlID0gV29ya09yZGVyVHlwZS5TVEFSVF9UT19TVEFSVDsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCXR5cGUgPSBXb3JrT3JkZXJUeXBlLlNUQVJUX1RPX0ZJTklTSDsKLQkJCQkJfQotCQkJCQkKLQkJCQkJaWYgKHJlbW92ZWQgJiYgd2JlQ29weSAhPSBudWxsKSB7CQkJCQkKLQkJCQkJCXdvLnNldFByZWQod2JlQ29weSk7Ci0JCQkJCQl3by5zZXRMaW5rVHlwZSh0eXBlKTsKLQkJCQkJCWJvb2xlYW4gc3RhdHVzID0gYWN0aW9uTWdyCi0JCQkJCQkJCS5kb0FjdGlvbigKLQkJCQkJCQkJCQlJQWN0aW9uTWFuYWdlci5BREQsCi0JCQkJCQkJCQkJd2JlLAotCQkJCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJCQkuZ2V0V29ya0JyZWFrZG93bkVsZW1lbnRfTGlua1RvUHJlZGVjZXNzb3IoKSwKLQkJCQkJCQkJCQl3bywgLTEpOwotCQkJCQkJaWYgKHN0YXR1cykKLQkJCQkJCQlwcmVkTWFwLnNldFdvcmtPcmRlcihvKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5TRVQsIHdvLAotCQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRXb3JrT3JkZXJfTGlua1R5cGUoKSwgdHlwZSwKLQkJCQkJCQkJLTEpOwotCQkJCQl9CQkJCQkJCi0JCQkJCQotCQkJCQlicmVhazsKLQotCQkJCWRlZmF1bHQ6Ci0JCQkJCXR5cGUgPSBXb3JrT3JkZXJUeXBlLkZJTklTSF9UT19GSU5JU0g7Ci0JCQkJfQotCi0JCQkJdmlld2VyLnJlZnJlc2goKTsKLQkJCX0KLQkJfSk7Ci0KLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCByZXR1cm5zIGxpc3Qgb2YgaXRlbSBwcm92aWRlcnMgZm9yIHByZWRlY2Vzc29ycwotCSAqIAotCSAqIEByZXR1cm4KLQkgKi8KLQkvLyBwcml2YXRlIE9iamVjdCBnZXRQcmVkSXRlbVByb3ZpZGVycygpCi0JLy8gewotCS8vIElCU0l0ZW1Qcm92aWRlciBhZGFwdGVyID0gKElCU0l0ZW1Qcm92aWRlcikgZ2V0QlNBZGFwdGVyKCk7Ci0JLy8gaWYgKGFkYXB0ZXIgIT0gbnVsbCkKLQkvLyByZXR1cm4gYWRhcHRlci5nZXRQcmVkZWNlc3NvcnMoKTsKLQkvLyAgICAJCi0JLy8gcmV0dXJuIG51bGw7Ci0JLy8gfQotCXByaXZhdGUgSXRlbVByb3ZpZGVyQWRhcHRlciBnZXRCU0FkYXB0ZXIoKSB7Ci0JCXRyeSB7Ci0JCQlBZGFwdGVyRmFjdG9yeSBmYWN0b3J5ID0gZ2V0QWRhcHRlckZhY3RvcnkoKTsvLyBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRS5nZXRQcm9jZXNzQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpOwotCi0JCQllbGVtZW50ID0gKFdvcmtCcmVha2Rvd25FbGVtZW50KSBnZXRFbGVtZW50KCk7Ci0KLQkJCUl0ZW1Qcm92aWRlckFkYXB0ZXIgcHJvdmlkZXIgPSAoSXRlbVByb3ZpZGVyQWRhcHRlcikgZmFjdG9yeS5hZGFwdCgKLQkJCQkJZWxlbWVudCwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCXJldHVybiBwcm92aWRlcjsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JfQotCi0JLyoqCi0JICogUmV0dXJuIGNvbHVtbiBpbmRleCBmb3IgcHJvcGVydHkKLQkgKiAKLQkgKiBAcGFyYW0gcHJvcGVydHkKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBpbnQgZ2V0Q29sdW1uSW5kZXgoU3RyaW5nIHByb3BlcnR5KSB7Ci0JCU9iamVjdFtdIGNvbFByb3BzID0gdmlld2VyLmdldENvbHVtblByb3BlcnRpZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb2xQcm9wcy5sZW5ndGg7IGkrKykgewotCQkJaWYgKGNvbFByb3BzW2ldID09IHByb3BlcnR5KQotCQkJCXJldHVybiBpOwotCQl9Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5BYnN0cmFjdFNlY3Rpb24jZ2V0TmFtZVByZWZpeCgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lUHJlZml4KCkgewotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFRlYW1Qcm9maWxlKSB7Ci0JCQlyZXR1cm4gTGlicmFyeVVJVGV4dC5URVhUX1RFQU1fUFJPRklMRSArICI6ICI7IC8vJE5PTi1OTFMtMSQKLQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgTWlsZXN0b25lKSB7Ci0JCQlyZXR1cm4gTGlicmFyeVVJVGV4dC5URVhUX01JTEVTVE9ORSArICI6ICI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gTGlicmFyeVVJVGV4dC5URVhUX1dPUktfUFJPRFVDVF9FTEVNRU5UICsgIjogIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldFByZWRJZCgpIHsKLQkJU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQotCQlmb3IgKEl0ZXJhdG9yIGl0b3IgPSBwcmVkTWFwTGlzdC5pdGVyYXRvcigpOyBpdG9yLmhhc05leHQoKTspIHsKLQkJCVByZWRlY2Vzc29yTWFwIG1hcCA9IChQcmVkZWNlc3Nvck1hcCkgaXRvci5uZXh0KCk7Ci0JCQlidWYuYXBwZW5kKG1hcC5nZXRJZCgpKTsKLQkJCWJ1Zi5hcHBlbmQoIiwiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBidWYudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplIHByZWQgbGlzdAotCSAqIAotCSAqLwotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplUHJlZExpc3QoKSB7Ci0JCXRyeSB7Ci0JCQlMaXN0IHByZWRQcm92aWRlcnMgPSBudWxsOwotCi0JCQkvLyBnZXQgd29yayBicmVha2Rvd24gZWxlbWVudAotCQkJZWxlbWVudCA9IChXb3JrQnJlYWtkb3duRWxlbWVudCkgZ2V0RWxlbWVudCgpOwotCi0JCQkvLyBnZXQgcHJlZGVjZXNzb3IgaXRlbSBwcm92aWRlcnMKLQkJCUFkYXB0ZXJGYWN0b3J5IGZhY3RvcnkgPSBnZXRBZGFwdGVyRmFjdG9yeSgpOwotCi0JCQlpZiAoZmFjdG9yeSAhPSBudWxsKSB7Ci0JCQkJSXRlbVByb3ZpZGVyQWRhcHRlciBwcm92aWRlciA9IChJdGVtUHJvdmlkZXJBZGFwdGVyKSBmYWN0b3J5Ci0JCQkJCQkuYWRhcHQoZWxlbWVudCwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCQlpZiAocHJvdmlkZXIgaW5zdGFuY2VvZiBJQlNJdGVtUHJvdmlkZXIpIHsKLQkJCQkJcHJlZFByb3ZpZGVycyA9ICgoSUJTSXRlbVByb3ZpZGVyKSBwcm92aWRlcikKLQkJCQkJCQkuZ2V0UHJlZGVjZXNzb3JzKCk7Ci0JCQkJfQotCQkJfQotCi0JCQkvLyBuZWVkIGZvbGxvd2luZyBmb3Igc3BlY2lhbCBjYXNlIChXcmFwcGVySXRlbVByb3ZpZGVycykuCi0JCQlJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IGdldFNlbGVjdGlvbigpOwotCQkJaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7Ci0JCQkJT2JqZWN0IGlucHV0ID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uKQotCQkJCQkJLmdldEZpcnN0RWxlbWVudCgpOwotCQkJCWlmIChpbnB1dCBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSB7Ci0JCQkJCXByZWRQcm92aWRlcnMgPSAoKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSBpbnB1dCkKLQkJCQkJCQkuZ2V0UHJlZGVjZXNzb3JzKCk7Ci0JCQkJfQotCQkJfQotCi0JCQkvLyBnZXQgbGluayB0byBwcmVkZWNlc3NvcnMKLQkJCWlmICgoZWxlbWVudCAhPSBudWxsKSAmJiAocHJlZFByb3ZpZGVycyAhPSBudWxsKSkgewotCQkJCUxpc3QgcHJlZExpc3QgPSBlbGVtZW50LmdldExpbmtUb1ByZWRlY2Vzc29yKCk7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVtSXRlcmF0b3IgPSBwcmVkUHJvdmlkZXJzLml0ZXJhdG9yKCk7IGl0ZW1JdGVyYXRvcgotCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJYm9vbGVhbiBmb3VuZCA9IGZhbHNlOwotCQkJCQlPYmplY3QgaXRlbU9iaiA9IChPYmplY3QpIGl0ZW1JdGVyYXRvci5uZXh0KCk7Ci0JCQkJCU9iamVjdCB0YXJnZXRPYmogPSBudWxsOwotCQkJCQlpZiAoaXRlbU9iaiBpbnN0YW5jZW9mIFdyYXBwZXJJdGVtUHJvdmlkZXIpIHsKLQkJCQkJCXRhcmdldE9iaiA9ICgoV3JhcHBlckl0ZW1Qcm92aWRlcikgaXRlbU9iaikuZ2V0VmFsdWUoKTsKLQkJCQkJfQotCQkJCQlpZiAoaXRlbU9iaiBpbnN0YW5jZW9mIEl0ZW1Qcm92aWRlckFkYXB0ZXIpIHsKLQkJCQkJCXRhcmdldE9iaiA9ICgoSXRlbVByb3ZpZGVyQWRhcHRlcikgaXRlbU9iaikuZ2V0VGFyZ2V0KCk7Ci0JCQkJCX0KLQkJCQkJaWYgKHRhcmdldE9iaiAhPSBudWxsKSB7Ci0JCQkJCQlpbnQgaWQgPSAoKElCU0l0ZW1Qcm92aWRlcikgaXRlbU9iaikuZ2V0SWQoKTsKLQkJCQkJCWZvdW5kID0gYWRkUHJlZGVjZXNzb3IocHJlZExpc3QsIGlkLCB0YXJnZXRPYmopOwotCi0JCQkJCQlpZiAoKCFmb3VuZCkKLQkJCQkJCQkJJiYgKHRhcmdldE9iaiBpbnN0YW5jZW9mIFZhcmlhYmlsaXR5RWxlbWVudCkpIHsKLQkJCQkJCQlWYXJpYWJpbGl0eUVsZW1lbnQgdmUgPSAoVmFyaWFiaWxpdHlFbGVtZW50KSB0YXJnZXRPYmo7Ci0JCQkJCQkJaWYgKHZlLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSAhPSBudWxsKSB7Ci0JCQkJCQkJCVZhcmlhYmlsaXR5RWxlbWVudCBlbCA9IHZlCi0JCQkJCQkJCQkJLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsKLQkJCQkJCQkJdGFyZ2V0T2JqID0gZWw7Ci0KLQkJCQkJCQkJLy8gYWRkIGJhc2UgdmFyaWFiaWxpdHkgb2JqZWN0Ci0JCQkJCQkJCWFkZFByZWRlY2Vzc29yKHByZWRMaXN0LCBpZCwgdGFyZ2V0T2JqKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQkvLyBmb3IgKEl0ZXJhdG9yIGl0b3I9cHJlZExpc3QuaXRlcmF0b3IoKTsgaXRvci5oYXNOZXh0KCk7KQotCQkJCS8vIHsKLQkJCQkvLyBib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0JCQkJLy8gT2JqZWN0IG8gPSAoT2JqZWN0KSBpdG9yLm5leHQoKTsKLQkJCQkvLyBpZiAobyBpbnN0YW5jZW9mIFdvcmtPcmRlcikKLQkJCQkvLyB7Ci0JCQkJLy8gLy9TeXN0ZW0ub3V0LnByaW50bG4oImdldEVsZW1lbnQ6OldvcmtPcmRlciA9ICIrICgoV29ya09yZGVyKQotCQkJCS8vIG8pLmdldFByZWQoKSk7Ci0JCQkJLy8gV29ya0JyZWFrZG93bkVsZW1lbnQgd2JlID0gKChXb3JrT3JkZXIpIG8pLmdldFByZWQoKTsKLQkJCQkvLyBpZiAod2JlICE9IG51bGwpCi0JCQkJLy8gewotCQkJCS8vIGZvciAoSXRlcmF0b3IgaXRlbUl0ZXJhdG9yPXByZWRQcm92aWRlcnMuaXRlcmF0b3IoKTsKLQkJCQkvLyBpdGVtSXRlcmF0b3IuaGFzTmV4dCgpOykKLQkJCQkvLyB7Ci0JCQkJLy8gT2JqZWN0IGl0ZW1PYmogPSAoT2JqZWN0KSBpdGVtSXRlcmF0b3IubmV4dCgpOwotCQkJCS8vIE9iamVjdCB0YXJnZXRPYmogPSBudWxsOwotCQkJCS8vIGlmIChpdGVtT2JqIGluc3RhbmNlb2YgV3JhcHBlckl0ZW1Qcm92aWRlcikKLQkJCQkvLyB7Ci0JCQkJLy8gdGFyZ2V0T2JqID0gKChXcmFwcGVySXRlbVByb3ZpZGVyKSBpdGVtT2JqKS5nZXRWYWx1ZSgpOwotCQkJCS8vIH0KLQkJCQkvLyBpZiAoaXRlbU9iaiBpbnN0YW5jZW9mIEl0ZW1Qcm92aWRlckFkYXB0ZXIpCi0JCQkJLy8gewotCQkJCS8vIHRhcmdldE9iaiA9ICgoSXRlbVByb3ZpZGVyQWRhcHRlcilpdGVtT2JqKS5nZXRUYXJnZXQoKTsKLQkJCQkvLyB9Ci0JCQkJLy8gaWYgKHRhcmdldE9iaiAhPSBudWxsKQotCQkJCS8vIHsKLQkJCQkvLyBpZiAodGFyZ2V0T2JqLmVxdWFscyh3YmUpKQotCQkJCS8vIHsKLQkJCQkvLyAvLyBjcmVhdGUgbWFwT2JqZWN0TGlzdAotCQkJCS8vIGludCBpZCA9ICgoSUJTSXRlbVByb3ZpZGVyKSBpdGVtT2JqKS5nZXRJZCgpOwotCQkJCS8vIFByZWRlY2Vzc29yTWFwIG1hcCA9IG5ldyBQcmVkZWNlc3Nvck1hcChpZCwgKFdvcmtPcmRlcikgbyk7Ci0JCQkJLy8gcHJlZE1hcExpc3QuYWRkKG1hcCk7Ci0JCQkJLy8JCQotCQkJCS8vIGZvdW5kPXRydWU7Ci0JCQkJLy8gYnJlYWs7Ci0JCQkJLy8gfQotCQkJCS8vIH0KLQkJCQkvLyB9Ci0JCQkJLy8gaWYgKCFmb3VuZCkKLQkJCQkvLyB7Ci0JCQkJLy8gLy8gaWYgcHJvdmlkZXIgaXMgbm90IGZvdW5kLCB0aGVuIGFkZCB3aXRoIGlkPTAKLQkJCQkvLyAvLyBkbyBpdCBvbmx5IGZvciBUZWFtQWxsb2NhdGlvbiBhbmQgV29ya1Byb2R1Y3RVc2FnZSB2aWV3Ci0JCQkJLy8gLy8gaWYKLQkJCQkvLyAoKEVQRlByb3BlcnR5U2hlZXRQYWdlLmZvcm1QYWdlSUQuZXF1YWxzKFByb2Nlc3NGb3JtRWRpdG9yLlRBX0ZPUk1fSUQpKQotCQkJCS8vIHx8Ci0JCQkJLy8gLy8KLQkJCQkvLyAoRVBGUHJvcGVydHlTaGVldFBhZ2UuZm9ybVBhZ2VJRC5lcXVhbHMoUHJvY2Vzc0Zvcm1FZGl0b3IuV1BCU19GT1JNX0lEKSkpCi0JCQkJLy8gewotCQkJCS8vIFByZWRlY2Vzc29yTWFwIG1hcCA9IG5ldyBQcmVkZWNlc3Nvck1hcCgwLCAoV29ya09yZGVyKSBvKTsKLQkJCQkvLyBwcmVkTWFwTGlzdC5hZGQobWFwKTsKLQkJCQkvLyB9Ci0JCQkJLy8gfQotCQkJCS8vIH0KLQkJCQkvLyB9Ci0JCQkJLy8gfQotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJbG9nZ2VyLmxvZ0Vycm9yKCJJbml0aWFsaXppbmcgUHJlZGVjZXNzb3IgTGlzdCIsIGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gYWRkUHJlZGVjZXNzb3IoTGlzdCBwcmVkTGlzdCwgaW50IGlkLCBPYmplY3QgdGFyZ2V0T2JqKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRvciA9IHByZWRMaXN0Lml0ZXJhdG9yKCk7IGl0b3IuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IG8gPSAoT2JqZWN0KSBpdG9yLm5leHQoKTsKLQkJCWlmIChvIGluc3RhbmNlb2YgV29ya09yZGVyKSB7Ci0JCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJnZXRFbGVtZW50OjpXb3JrT3JkZXIgPSAiKyAoKFdvcmtPcmRlcikKLQkJCQkvLyBvKS5nZXRQcmVkKCkpOwotCQkJCVdvcmtCcmVha2Rvd25FbGVtZW50IHdiZSA9ICgoV29ya09yZGVyKSBvKS5nZXRQcmVkKCk7Ci0KLQkJCQlpZiAodGFyZ2V0T2JqLmVxdWFscyh3YmUpKSB7Ci0JCQkJCS8vIGNyZWF0ZSBtYXBPYmplY3RMaXN0Ci0JCQkJCVByZWRlY2Vzc29yTWFwIG1hcCA9IG5ldyBQcmVkZWNlc3Nvck1hcChpZCwgKFdvcmtPcmRlcikgbyk7Ci0JCQkJCXByZWRNYXBMaXN0LmFkZChtYXApOwotCi0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiBmYWxzZTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL1dvcmtQcm9kdWN0RGVzY3JpcHRvckdlbmVyYWxTZWN0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvV29ya1Byb2R1Y3REZXNjcmlwdG9yR2VuZXJhbFNlY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjllZjgzNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvV29ya1Byb2R1Y3REZXNjcmlwdG9yR2VuZXJhbFNlY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg3NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXM7Ci0KLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZGlhbG9ncy5JdGVtc0ZpbHRlckRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuTWV0aG9kRWxlbWVudEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuTWV0aG9kRWxlbWVudEVkaXRvci5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZpbHRlcnMuRGVzY3JpcHRvclByb2Nlc3NGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5maWx0ZXJzLlByb2Nlc3NTcGVjaWZpY1dvcmtQcm9kdWN0RmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZmlsdGVycy5Qcm9jZXNzV29ya1Byb2R1Y3RGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5TdHJVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JQWN0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLkZpbHRlckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZC5Bc3NpZ25XUFRvRGVsaXZlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQuTGlua01ldGhvZEVsZW1lbnRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Qcm9jZXNzVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5MaWJyYXJ5VUlUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BcnRpZmFjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRm9jdXNBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRm9jdXNFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuU2VjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5UYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZTsKLQotCi0vKioKLSAqIFRoZSBnZW5lcmFsIHRhYiBzZWN0aW9uIGZvciBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvcgotICogCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMAotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBXb3JrUHJvZHVjdERlc2NyaXB0b3JHZW5lcmFsU2VjdGlvbiBleHRlbmRzCi0JCURlc2NyaXB0b3JHZW5lcmFsU2VjdGlvbiB7Ci0JcHJvdGVjdGVkIFdvcmtQcm9kdWN0RGVzY3JpcHRvciBlbGVtZW50OwotCi0JcHJpdmF0ZSBUZXh0IGN0cmxfbWV0aG9kX2VsZW1lbnQ7Ci0KLQlwcml2YXRlIFRleHQgY3RybF93b3JrUHJvZHVjdF90eXBlOwotCi0JcHJpdmF0ZSBUZXh0IGFjdGl2aXR5RW50cnlTdGF0ZSwgYWN0aXZpdHlFeGl0U3RhdGU7Ci0KLQlwcml2YXRlIEJ1dHRvbiBsaW5rQnV0dG9uOwotCi0JcHJpdmF0ZSBCdXR0b24gY2xlYXJCdXR0b247Ci0JCi0JcHJpdmF0ZSBUYWJsZSBjdHJsX3RhYmxlXzE7Ci0KLQlwcml2YXRlIFRhYmxlVmlld2VyIHZpZXdlcl8xOwotCi0JcHJpdmF0ZSBCdXR0b24gY3RybF9hZGRfMSwgY3RybF9hZGRfcHJvY18xLCBjdHJsX3JlbW92ZV8xOwotCi0JcHJpdmF0ZSBTZWN0aW9uIGRlbGl2ZXJhYmxlU2VjdGlvbjsKLQotCXByaXZhdGUgTW9kaWZ5TGlzdGVuZXIgd3BNb2RlbE1vZGlmeUxpc3RlbmVyOwotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuRGVzY3JpcHRvckdlbmVyYWxTZWN0aW9uI2luaXQoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXQoKSB7Ci0JCXN1cGVyLmluaXQoKTsKLQkJLy8gZ2V0IFdvcmtQcm9kdWN0RGVzY3JpcHRvciBvYmplY3QKLQkJZWxlbWVudCA9IChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIGdldEVsZW1lbnQoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5CcmVha2Rvd25FbGVtZW50R2VuZXJhbFNlY3Rpb24jY3JlYXRlQ29udHJvbHMob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlLCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5UYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9scyhDb21wb3NpdGUgcGFyZW50LAotCQkJVGFiYmVkUHJvcGVydHlTaGVldFBhZ2UgdGFiYmVkUHJvcGVydHlTaGVldFBhZ2UpIHsKLQkJc3VwZXIuY3JlYXRlQ29udHJvbHMocGFyZW50LCB0YWJiZWRQcm9wZXJ0eVNoZWV0UGFnZSk7Ci0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgdG9nZ2xlU2VjdGlvbigpIHsKLQkJaWYgKCEoZWxlbWVudC5nZXRXb3JrUHJvZHVjdCgpIGluc3RhbmNlb2YgRGVsaXZlcmFibGUpKSB7Ci0JCQlpZiAoZGVsaXZlcmFibGVTZWN0aW9uLmlzRXhwYW5kZWQoKSkKLQkJCQlkZWxpdmVyYWJsZVNlY3Rpb24uc2V0RXhwYW5kZWQoZmFsc2UpOwotCQkJaWYgKGRlbGl2ZXJhYmxlU2VjdGlvbi5pc1Zpc2libGUoKSkKLQkJCQlkZWxpdmVyYWJsZVNlY3Rpb24uc2V0VmlzaWJsZShmYWxzZSk7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoIWRlbGl2ZXJhYmxlU2VjdGlvbi5pc0V4cGFuZGVkKCkpCi0JCQkJZGVsaXZlcmFibGVTZWN0aW9uLnNldEV4cGFuZGVkKHRydWUpOwotCQkJaWYgKCFkZWxpdmVyYWJsZVNlY3Rpb24uaXNWaXNpYmxlKCkpCi0JCQkJZGVsaXZlcmFibGVTZWN0aW9uLnNldFZpc2libGUodHJ1ZSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlRGVsaXZlcmFibGVTZWN0aW9uKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQkJU3RyaW5nIHNlY3Rpb25UaXRsZSA9IFByb3BlcnRpZXNSZXNvdXJjZXMuV1BEZXNjcmlwdG9yX0RlbGl2ZXJhYmxlUGFydF9TZWN0aW9uVGl0bGU7IAotCQlTdHJpbmcgc2VjdGlvbkRlc2MgPSBQcm9wZXJ0aWVzUmVzb3VyY2VzLldQRGVzY3JpcHRvcl9EZWxpdmVyYWJsZVBhcnRfU2VjdGlvbkRlc2NyaXB0aW9uOyAKLQkJU3RyaW5nIHRhYmxlVGl0bGUgPSBQcm9wZXJ0aWVzUmVzb3VyY2VzLldQRGVzY3JpcHRvcl9EZWxpdmVyYWJsZVBhcnRfVGFibGUxOyAKLQotCQlTZWN0aW9uIHNlY3Rpb24gPSBGb3JtVUkuY3JlYXRlU2VjdGlvbih0b29sa2l0LCBjb21wb3NpdGUsCi0JCQkJc2VjdGlvblRpdGxlLCBzZWN0aW9uRGVzYyk7Ci0KLQkJLy8gY3JlYXRlIGNvbXBvc2l0ZQotCQlDb21wb3NpdGUgc2VjdGlvbkNvbXBvc2l0ZSA9IEZvcm1VSS5jcmVhdGVDb21wb3NpdGUodG9vbGtpdCwgc2VjdGlvbiwKLQkJCQkyLCBmYWxzZSk7Ci0KLQkJQ29tcG9zaXRlIHBhbmUxID0gRm9ybVVJLmNyZWF0ZUNvbXBvc2l0ZSh0b29sa2l0LCBzZWN0aW9uQ29tcG9zaXRlLAotCQkJCUdyaWREYXRhLkZJTExfQk9USCk7Ci0JCUZvcm1VSS5jcmVhdGVMYWJlbCh0b29sa2l0LCBwYW5lMSwgdGFibGVUaXRsZSk7Ci0KLQkJaW50IHRhYmxlSGVpZ2h0ID0gODA7Ci0JCWN0cmxfdGFibGVfMSA9IEZvcm1VSS5jcmVhdGVUYWJsZSh0b29sa2l0LCBwYW5lMSwgdGFibGVIZWlnaHQpOwotCQl2aWV3ZXJfMSA9IG5ldyBUYWJsZVZpZXdlcihjdHJsX3RhYmxlXzEpOwotCQlJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciBjb250ZW50UHJvdmlkZXIgPSBuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoCi0JCQkJZ2V0QWRhcHRlckZhY3RvcnkoKSkgewotCQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBvYmplY3QpIHsKLQkJCQlMaXN0IG5ld0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJTGlzdCBkZWxpdmVyYWJsZVBhcnRzID0gZWxlbWVudC5nZXREZWxpdmVyYWJsZVBhcnRzKCk7Ci0JCQkJZm9yIChJdGVyYXRvciBpdG9yID0gZGVsaXZlcmFibGVQYXJ0cy5pdGVyYXRvcigpOyBpdG9yCi0JCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQlXb3JrUHJvZHVjdERlc2NyaXB0b3Igd3BEZXNjID0gKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgaXRvcgotCQkJCQkJCS5uZXh0KCk7Ci0JCQkJCWlmICh3cERlc2MuZ2V0U3VwZXJBY3Rpdml0aWVzKCkgPT0gbnVsbAotCQkJCQkJCXx8IHdwRGVzYy5nZXRTdXBlckFjdGl2aXRpZXMoKSA9PSBudWxsKQotCQkJCQkJbmV3TGlzdC5hZGQod3BEZXNjKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIGdldEZpbHRlcmVkTGlzdChuZXdMaXN0KS50b0FycmF5KCk7Ci0JCQl9Ci0JCX07Ci0KLQkJSUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlciA9IG5ldyBBZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIoCi0JCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UuZ2V0UEJTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSk7Ci0JCXZpZXdlcl8xLnNldENvbnRlbnRQcm92aWRlcihjb250ZW50UHJvdmlkZXIpOwotCQl2aWV3ZXJfMS5zZXRMYWJlbFByb3ZpZGVyKGxhYmVsUHJvdmlkZXIpOwotCQl2aWV3ZXJfMS5zZXRJbnB1dChlbGVtZW50KTsKLQotCQkvLyBjcmVhdGUgYnV0dG9ucyBmb3IgdGFibGUyCi0JCUNvbXBvc2l0ZSBwYW5lMiA9IEZvcm1VSS5jcmVhdGVDb21wb3NpdGUodG9vbGtpdCwgc2VjdGlvbkNvbXBvc2l0ZSwKLQkJCQlHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9DRU5URVIKLQkJCQkJCXwgR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9DRU5URVIpOwotCi0JCWN0cmxfYWRkXzEgPSBGb3JtVUkuY3JlYXRlQnV0dG9uKHRvb2xraXQsIHBhbmUyLCBQcm9wZXJ0aWVzUmVzb3VyY2VzLlByb2Nlc3NfQWRkKTsgCi0JCWN0cmxfYWRkX3Byb2NfMSA9IEZvcm1VSS5jcmVhdGVCdXR0b24odG9vbGtpdCwgcGFuZTIsCi0JCQkJUHJvcGVydGllc1Jlc291cmNlcy5Qcm9jZXNzX0FkZEZyb21Qcm9jZXNzKTsgCi0JCWN0cmxfcmVtb3ZlXzEgPSBGb3JtVUkuY3JlYXRlQnV0dG9uKHRvb2xraXQsIHBhbmUyLCBQcm9wZXJ0aWVzUmVzb3VyY2VzLlByb2Nlc3NfUmVtb3ZlKTsgCi0KLQkJdG9vbGtpdC5wYWludEJvcmRlcnNGb3IocGFuZTEpOwotCi0JCWRlbGl2ZXJhYmxlU2VjdGlvbiA9IHNlY3Rpb247Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuQnJlYWtkb3duRWxlbWVudEdlbmVyYWxTZWN0aW9uI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQotCQkvLyBpZiAobGFiZWxQcm92aWRlciAhPSBudWxsKQotCQkvLyB7Ci0JCS8vIGxhYmVsUHJvdmlkZXIuZGlzcG9zZSgpOwotCQkvLyB9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuRGVzY3JpcHRvckdlbmVyYWxTZWN0aW9uI2NyZWF0ZUdlbmVyYWxTZWN0aW9uKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVHZW5lcmFsU2VjdGlvbihDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JCXN1cGVyLmNyZWF0ZUdlbmVyYWxTZWN0aW9uKGNvbXBvc2l0ZSk7Ci0KLQkJLy8gbWV0aG9kIGVsZW1lbnQKLQkJRm9ybVVJLmNyZWF0ZUxhYmVsKHRvb2xraXQsIGdlbmVyYWxDb21wb3NpdGUsIFByb3BlcnRpZXNSZXNvdXJjZXMuUHJvY2Vzc19UeXBlX1dvcmtQcm9kdWN0KTsgCi0JCWN0cmxfbWV0aG9kX2VsZW1lbnQgPSBGb3JtVUkuY3JlYXRlVGV4dCh0b29sa2l0LCBnZW5lcmFsQ29tcG9zaXRlLAotCQkJCVNXVC5ERUZBVUxULCAxKTsKLQkJY3RybF9tZXRob2RfZWxlbWVudC5zZXRUZXh0KGdldE1ldGhvZEVsZW1lbnROYW1lKGVsZW1lbnQpKTsKLQkJY3RybF9tZXRob2RfZWxlbWVudC5zZXRFbmFibGVkKGZhbHNlKTsKLQotCQlDb21wb3NpdGUgYnV0dG9uQ29tcG9zaXRlID0gRm9ybVVJLmNyZWF0ZUNvbXBvc2l0ZSh0b29sa2l0LAotCQkJCWdlbmVyYWxDb21wb3NpdGUsIFNXVC5OT05FLCAyLCB0cnVlKTsKLQkJbGlua0J1dHRvbiA9IEZvcm1VSS5jcmVhdGVCdXR0b24odG9vbGtpdCwgYnV0dG9uQ29tcG9zaXRlLCBTV1QuUFVTSCwgMSk7Ci0JCWxpbmtCdXR0b24KLQkJCQkuc2V0VGV4dChQcm9wZXJ0aWVzUmVzb3VyY2VzLlByb2Nlc3NfQnV0dG9uX0xpbmtNZXRob2RFbGVtZW50KTsgCi0KLQkJY2xlYXJCdXR0b24gPSBGb3JtVUkuY3JlYXRlQnV0dG9uKHRvb2xraXQsIGJ1dHRvbkNvbXBvc2l0ZSwgU1dULlBVU0gsIDEpOwotCQljbGVhckJ1dHRvbgotCQkJCS5zZXRUZXh0KFByb3BlcnRpZXNSZXNvdXJjZXMuUHJvY2Vzc19CdXR0b25fQ2xlYXJNZXRob2RFbGVtZW50KTsgCi0KLQkJLy8gdHlwZQotCQlGb3JtVUkuY3JlYXRlTGFiZWwodG9vbGtpdCwgZ2VuZXJhbENvbXBvc2l0ZSwgUHJvcGVydGllc1Jlc291cmNlcy5Xb3JrUHJvZHVjdF9UeXBlKTsgCi0JCWN0cmxfd29ya1Byb2R1Y3RfdHlwZSA9IEZvcm1VSS5jcmVhdGVUZXh0KHRvb2xraXQsIGdlbmVyYWxDb21wb3NpdGUsCi0JCQkJU1dULkRFRkFVTFQsIGhvcml6b250YWxTcGFuKTsKLQkJY3RybF93b3JrUHJvZHVjdF90eXBlLnNldFRleHQoZ2V0TWV0aG9kRWxlbWVudFR5cGUoZWxlbWVudCkpOwotCQljdHJsX3dvcmtQcm9kdWN0X3R5cGUuc2V0RW5hYmxlZChmYWxzZSk7Ci0KLQkJLy8gYWN0aXZpdHlFbnRyeXN0YXRlCi0JCUZvcm1VSS5jcmVhdGVMYWJlbCh0b29sa2l0LCBnZW5lcmFsQ29tcG9zaXRlLCBQcm9wZXJ0aWVzUmVzb3VyY2VzLldvcmtQcm9kdWN0RGVzY3JpcHRvcl9BY3Rpdml0eUVudHJ5U3RhdGUpOyAKLQkJYWN0aXZpdHlFbnRyeVN0YXRlID0gRm9ybVVJLmNyZWF0ZVRleHQodG9vbGtpdCwgZ2VuZXJhbENvbXBvc2l0ZSwKLQkJCQlTV1QuREVGQVVMVCwgaG9yaXpvbnRhbFNwYW4pOwotCi0JCS8vIGFjdGl2aXR5RXhpdHN0YXRlCi0JCUZvcm1VSS5jcmVhdGVMYWJlbCh0b29sa2l0LCBnZW5lcmFsQ29tcG9zaXRlLCBQcm9wZXJ0aWVzUmVzb3VyY2VzLldvcmtQcm9kdWN0RGVzY3JpcHRvcl9BY3Rpdml0eUV4aXRTdGF0ZSk7IAotCQlhY3Rpdml0eUV4aXRTdGF0ZSA9IEZvcm1VSS5jcmVhdGVUZXh0KHRvb2xraXQsIGdlbmVyYWxDb21wb3NpdGUsCi0JCQkJU1dULkRFRkFVTFQsIGhvcml6b250YWxTcGFuKTsKLQotCQkvLyBDUkVBVEUgREVMSVZFUkFCTEUgU0VDVElPTgotCQljcmVhdGVEZWxpdmVyYWJsZVNlY3Rpb24oY29tcG9zaXRlKTsKLQkJdG9nZ2xlU2VjdGlvbigpOwotCi0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0TWV0aG9kRWxlbWVudE5hbWUoV29ya1Byb2R1Y3REZXNjcmlwdG9yIGVsZW1lbnQpIHsKLQkJU3RyaW5nIHN0ciA9IFByb3BlcnRpZXNSZXNvdXJjZXMuUHJvY2Vzc19Ob25lOyAKLQkJaWYgKGVsZW1lbnQuZ2V0V29ya1Byb2R1Y3QoKSAhPSBudWxsKSB7Ci0JCQlzdHIgPSBlbGVtZW50LmdldFdvcmtQcm9kdWN0KCkuZ2V0TmFtZSgpOwotCQl9Ci0KLQkJcmV0dXJuIHN0cjsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBnZXRNZXRob2RFbGVtZW50VHlwZShXb3JrUHJvZHVjdERlc2NyaXB0b3IgZWxlbWVudCkgewotCQlTdHJpbmcgc3RyID0gUHJvcGVydGllc1Jlc291cmNlcy5Qcm9jZXNzX05vbmU7IAotCQlpZiAoZWxlbWVudC5nZXRXb3JrUHJvZHVjdCgpICE9IG51bGwpIHsKLQkJCXN0ciA9IFByb3BlcnRpZXNVdGlsLmdldFR5cGUoZWxlbWVudC5nZXRXb3JrUHJvZHVjdCgpKTsKLQkJfQotCi0JCXJldHVybiBzdHI7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuRGVzY3JpcHRvckdlbmVyYWxTZWN0aW9uI2FkZExpc3RlbmVycygpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkTGlzdGVuZXJzKCkgewotCQlzdXBlci5hZGRMaXN0ZW5lcnMoKTsKLQotCQlhY3Rpdml0eUVudHJ5U3RhdGUuYWRkRm9jdXNMaXN0ZW5lcihuZXcgRm9jdXNBZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgZm9jdXNHYWluZWQoRm9jdXNFdmVudCBlKSB7Ci0JCQkJKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkuc2V0Q3VycmVudEZlYXR1cmVFZGl0b3IoZS53aWRnZXQsCi0JCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JfQWN0aXZpdHlFbnRyeVN0YXRlKCkpOwotCQkJfQotCQkKLQkJCXB1YmxpYyB2b2lkIGZvY3VzTG9zdChGb2N1c0V2ZW50IGUpIHsKLQkJCQlXb3JrUHJvZHVjdERlc2NyaXB0b3IgZWxlbWVudCA9IChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIGdldEVsZW1lbnQoKTsKLQkJCQlTdHJpbmcgb2xkQ29udGVudCA9IGVsZW1lbnQuZ2V0QWN0aXZpdHlFbnRyeVN0YXRlKCk7Ci0JCQkJaWYgKCgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpLm11c3RSZXN0b3JlVmFsdWUoCi0JCQkJCQlhY3Rpdml0eUVudHJ5U3RhdGUsIG9sZENvbnRlbnQpKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJU3RyaW5nIG5ld0NvbnRlbnQgPSBTdHJVdGlsLmdldFBsYWluVGV4dChhY3Rpdml0eUVudHJ5U3RhdGUKLQkJCQkJCS5nZXRUZXh0KCkpOwotCQkJCWlmICghbmV3Q29udGVudC5lcXVhbHMob2xkQ29udGVudCkpIHsKLQkJCQkJYm9vbGVhbiBzdGF0dXMgPSBhY3Rpb25NZ3IKLQkJCQkJCQkuZG9BY3Rpb24oCi0JCQkJCQkJCQlJQWN0aW9uTWFuYWdlci5TRVQsCi0JCQkJCQkJCQllbGVtZW50LAotCQkJCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCQkJLmdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9BY3Rpdml0eUVudHJ5U3RhdGUoKSwKLQkJCQkJCQkJCW5ld0NvbnRlbnQsIC0xKTsKLQkJCQkJaWYgKHN0YXR1cykgewotCQkJCQkJYWN0aXZpdHlFbnRyeVN0YXRlLnNldFRleHQobmV3Q29udGVudCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JCWFjdGl2aXR5RXhpdFN0YXRlLmFkZEZvY3VzTGlzdGVuZXIobmV3IEZvY3VzQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGZvY3VzR2FpbmVkKEZvY3VzRXZlbnQgZSkgewotCQkJCSgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpLnNldEN1cnJlbnRGZWF0dXJlRWRpdG9yKGUud2lkZ2V0LAotCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX0FjdGl2aXR5RXhpdFN0YXRlKCkpOwotCQkJfQotCQkJCi0JCQlwdWJsaWMgdm9pZCBmb2N1c0xvc3QoRm9jdXNFdmVudCBlKSB7Ci0JCQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yIGVsZW1lbnQgPSAoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBnZXRFbGVtZW50KCk7Ci0JCQkJU3RyaW5nIG9sZENvbnRlbnQgPSBlbGVtZW50LmdldEFjdGl2aXR5RXhpdFN0YXRlKCk7Ci0JCQkJaWYgKCgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpLm11c3RSZXN0b3JlVmFsdWUoCi0JCQkJCQlhY3Rpdml0eUV4aXRTdGF0ZSwgb2xkQ29udGVudCkpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlTdHJpbmcgbmV3Q29udGVudCA9IFN0clV0aWwuZ2V0UGxhaW5UZXh0KGFjdGl2aXR5RXhpdFN0YXRlCi0JCQkJCQkuZ2V0VGV4dCgpKTsKLQkJCQlpZiAoIW5ld0NvbnRlbnQuZXF1YWxzKG9sZENvbnRlbnQpKSB7Ci0JCQkJCWJvb2xlYW4gc3RhdHVzID0gYWN0aW9uTWdyCi0JCQkJCQkJLmRvQWN0aW9uKAotCQkJCQkJCQkJSUFjdGlvbk1hbmFnZXIuU0VULAotCQkJCQkJCQkJZWxlbWVudCwKLQkJCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJCS5nZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JfQWN0aXZpdHlFeGl0U3RhdGUoKSwKLQkJCQkJCQkJCW5ld0NvbnRlbnQsIC0xKTsKLQkJCQkJaWYgKHN0YXR1cykgewotCQkJCQkJYWN0aXZpdHlFeGl0U3RhdGUuc2V0VGV4dChuZXdDb250ZW50KTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJY3RybF90YWJsZV8xLmFkZEZvY3VzTGlzdGVuZXIobmV3IEZvY3VzQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGZvY3VzR2FpbmVkKEZvY3VzRXZlbnQgZSkgewotCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgdmlld2VyXzEKLQkJCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQkJCQlpZiAoc2VsZWN0aW9uLnNpemUoKSA+IDApCi0JCQkJCWN0cmxfcmVtb3ZlXzEuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCX0KLQkJfSk7Ci0KLQkJY3RybF9hZGRfMS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlJRmlsdGVyIGZpbHRlciA9IG5ldyBQcm9jZXNzV29ya1Byb2R1Y3RGaWx0ZXIoCi0JCQkJCQlnZXRDb25maWd1cmF0aW9uKCksIG51bGwsIEZpbHRlckNvbnN0YW50cy5XT1JLUFJPRFVDVFMpOyAKLQkJCQkvLyBibG9jayBpdCdzIGRlbGl2ZXJhYmxlIHBhcnRzCi0JCQkJTGlzdCBleGlzdGluZ0VsZW1lbnRzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCWV4aXN0aW5nRWxlbWVudHMKLQkJCQkJCS5hZGRBbGwoUHJvY2Vzc1V0aWwKLQkJCQkJCQkJLmdldEFzc29jaWF0ZWRFbGVtZW50TGlzdCgoKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgZWxlbWVudCkKLQkJCQkJCQkJCQkuZ2V0RGVsaXZlcmFibGVQYXJ0cygpKSk7Ci0JCQkJLy8gYmxvY2sgaXRzZWxmCi0JCQkJZXhpc3RpbmdFbGVtZW50cy5hZGQoUHJvY2Vzc1V0aWwKLQkJCQkJCS5nZXRBc3NvY2lhdGVkRWxlbWVudCgoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBlbGVtZW50KSk7Ci0JCQkJLy8gYWxzbyBibG9jayBpdCdzIHBhcmVudCB3b3JrIHByb2R1Y3RzLCBpZiBhbnkKLQkJCQlleGlzdGluZ0VsZW1lbnRzCi0JCQkJCQkuYWRkQWxsKChDb2xsZWN0aW9uKSBnZXRQYXJlbnRXb3JrUHJvZHVjdHMoKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgZWxlbWVudCkpOwotCi0JCQkJSXRlbXNGaWx0ZXJEaWFsb2cgZmQgPSBuZXcgSXRlbXNGaWx0ZXJEaWFsb2coUGxhdGZvcm1VSQotCQkJCQkJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldFNoZWxsKCksCi0JCQkJCQlmaWx0ZXIsIGVsZW1lbnQsIEZpbHRlckNvbnN0YW50cy5XT1JLUFJPRFVDVFMsCi0JCQkJCQlleGlzdGluZ0VsZW1lbnRzKTsKLQkJCQlmZC5zZXRCbG9ja09uT3Blbih0cnVlKTsKLQkJCQlmZC5zZXRUaXRsZShGaWx0ZXJDb25zdGFudHMuV09SS1BST0RVQ1RTKTsKLQkJCQlmZC5vcGVuKCk7Ci0JCQkJYWRkSXRlbXMoZmQuZ2V0U2VsZWN0ZWRJdGVtcygpKTsKLQkJCQl2aWV3ZXJfMS5yZWZyZXNoKCk7Ci0KLQkJCX0KLQkJfSk7Ci0KLQkJY3RybF9hZGRfcHJvY18xLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCVN0cmluZyB0YWJOYW1lID0gRmlsdGVyQ29uc3RhbnRzLldPUktfUFJPRFVDVF9ERVNDUklQVE9SUzsKLQkJCQlMaXN0IGV4aXN0aW5nRWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJZXhpc3RpbmdFbGVtZW50cy5hZGRBbGwoKChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIGVsZW1lbnQpCi0JCQkJCQkuZ2V0RGVsaXZlcmFibGVQYXJ0cygpKTsKLQkJCQlleGlzdGluZ0VsZW1lbnRzLmFkZChlbGVtZW50KTsKLQotCQkJCWV4aXN0aW5nRWxlbWVudHMKLQkJCQkJCS5hZGRBbGwoZ2V0UGFyZW50RGVsaXZlcmFibGVzKChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIGVsZW1lbnQpKTsKLQkJCQlQcm9jZXNzIHByb2Nlc3MgPSBUbmdVdGlsLmdldE93bmluZ1Byb2Nlc3MoZWxlbWVudCk7Ci0KLQkJCQlJRmlsdGVyIGRlc2NyaXB0b3JGaWx0ZXIgPSBnZXREZXNjcmlwdG9yRmlsdGVyKCk7Ci0JCQkJaWYgKGRlc2NyaXB0b3JGaWx0ZXIgIT0gbnVsbCAmJiBwcm9jZXNzICE9IG51bGwpIHsKLQkJCQkJSXRlbXNGaWx0ZXJEaWFsb2cgZmQgPSBuZXcgSXRlbXNGaWx0ZXJEaWFsb2coUGxhdGZvcm1VSQotCQkJCQkJCS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKQotCQkJCQkJCS5nZXRTaGVsbCgpLCBkZXNjcmlwdG9yRmlsdGVyLCBwcm9jZXNzLCB0YWJOYW1lLAotCQkJCQkJCWV4aXN0aW5nRWxlbWVudHMpOwotCQkJCQlmZC5zZXRCbG9ja09uT3Blbih0cnVlKTsKLQkJCQkJZmQuc2V0VGl0bGUodGFiTmFtZSk7Ci0JCQkJCWZkLm9wZW4oKTsKLQkJCQkJYWRkRnJvbVByb2Nlc3NJdGVtcyhmZC5nZXRTZWxlY3RlZEl0ZW1zKCkpOwotCQkJCQl2aWV3ZXJfMS5yZWZyZXNoKCk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQotCQljdHJsX3JlbW92ZV8xLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgdmlld2VyXzEKLQkJCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQkJCQlpZiAoc2VsZWN0aW9uLnNpemUoKSA+IDApIHsKLQkJCQkJLy8gdXBkYXRlIHRoZSBtb2RlbAotCQkJCQlBcnJheUxpc3Qgcm1JdGVtcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJcm1JdGVtcy5hZGRBbGwoc2VsZWN0aW9uLnRvTGlzdCgpKTsKLQkJCQkJcmVtb3ZlSXRlbXMocm1JdGVtcyk7Ci0JCQkJCXZpZXdlcl8xLnJlZnJlc2goKTsKLQotCQkJCQkvLyBjbGVhciB0aGUgc2VsZWN0aW9uCi0JCQkJCXZpZXdlcl8xLnNldFNlbGVjdGlvbihudWxsLCB0cnVlKTsKLQotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJbGlua0J1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlTdHJpbmcgdGFiTmFtZSA9IEZpbHRlckNvbnN0YW50cy5XT1JLUFJPRFVDVFM7IAotCQkJCUNsYXNzIHdvcmtQcm9kdWN0VHlwZSA9IG51bGw7Ci0JCQkJaWYgKGVsZW1lbnQuZ2V0V29ya1Byb2R1Y3QoKSAhPSBudWxsKSB7Ci0JCQkJCXdvcmtQcm9kdWN0VHlwZSA9IGVsZW1lbnQuZ2V0V29ya1Byb2R1Y3QoKS5nZXRDbGFzcygpOwotCQkJCX0KLQkJCQlMaXN0IGV4aXN0aW5nRWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJaWYgKGVsZW1lbnQuZ2V0V29ya1Byb2R1Y3QoKSAhPSBudWxsKSB7Ci0JCQkJCVdvcmtQcm9kdWN0IHdwID0gZWxlbWVudC5nZXRXb3JrUHJvZHVjdCgpOwotCQkJCQlleGlzdGluZ0VsZW1lbnRzLmFkZCh3cCk7Ci0JCQkJCWlmICh3cCBpbnN0YW5jZW9mIEFydGlmYWN0KSB7Ci0JCQkJCQlMaXN0IHN1YkFydGlmYWN0cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJCWdldEFsbFN1YkFydGlmYWN0cygoQXJ0aWZhY3QpIHdwLCBzdWJBcnRpZmFjdHMsCi0JCQkJCQkJCSgoQXJ0aWZhY3QpIHdwKS5nZXRDb250YWluZWRBcnRpZmFjdHMoKSk7Ci0JCQkJCQlleGlzdGluZ0VsZW1lbnRzLmFkZEFsbChzdWJBcnRpZmFjdHMpOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJTGlzdCBsaXN0ID0gUHJvY2Vzc1V0aWwKLQkJCQkJCS5nZXRTaWJsaW5ncyhUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkJCQkuZ2V0UEJTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSwgZ2V0QWRhcHRlcigpLAotCQkJCQkJCQllbGVtZW50KTsKLQotCQkJCWZvciAoSXRlcmF0b3IgaXRvciA9IGxpc3QuaXRlcmF0b3IoKTsgaXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJCU9iamVjdCBvYmogPSBpdG9yLm5leHQoKTsKLQkJCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgewotCQkJCQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yIHdwRGVzYyA9IChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIG9iajsKLQkJCQkJCWlmICgoIXdwRGVzYy5lcXVhbHMoZWxlbWVudCkpCi0JCQkJCQkJCSYmICghd3BEZXNjLmdldFN1cHByZXNzZWQoKS5ib29sZWFuVmFsdWUoKSkpIHsKLQkJCQkJCQlXb3JrUHJvZHVjdCB3cCA9IHdwRGVzYy5nZXRXb3JrUHJvZHVjdCgpOwotCi0JCQkJCQkJaWYgKHdwICE9IG51bGwpIHsKLQkJCQkJCQkJZXhpc3RpbmdFbGVtZW50cy5hZGQod3ApOwotCi0JCQkJCQkJCWlmICh3cCBpbnN0YW5jZW9mIEFydGlmYWN0KSB7Ci0JCQkJCQkJCQlMaXN0IHN1YkFydGlmYWN0cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJCQkJCWdldEFsbFN1YkFydGlmYWN0cygoQXJ0aWZhY3QpIHdwLAotCQkJCQkJCQkJCQlzdWJBcnRpZmFjdHMsICgoQXJ0aWZhY3QpIHdwKQotCQkJCQkJCQkJCQkJCS5nZXRDb250YWluZWRBcnRpZmFjdHMoKSk7Ci0JCQkJCQkJCQlleGlzdGluZ0VsZW1lbnRzLmFkZEFsbChzdWJBcnRpZmFjdHMpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCUlGaWx0ZXIgZmlsdGVyID0gbmV3IFByb2Nlc3NTcGVjaWZpY1dvcmtQcm9kdWN0RmlsdGVyKAotCQkJCQkJZ2V0Q29uZmlndXJhdGlvbigpLCBudWxsLCB0YWJOYW1lLCB3b3JrUHJvZHVjdFR5cGUpOwotCi0JCQkJSXRlbXNGaWx0ZXJEaWFsb2cgZmQgPSBuZXcgSXRlbXNGaWx0ZXJEaWFsb2coUGxhdGZvcm1VSQotCQkJCQkJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldFNoZWxsKCksCi0JCQkJCQlmaWx0ZXIsIGVsZW1lbnQsIHRhYk5hbWUsIGV4aXN0aW5nRWxlbWVudHMpOwotCi0JCQkJZmQuc2V0QmxvY2tPbk9wZW4odHJ1ZSk7Ci0JCQkJZmQuc2V0Vmlld2VyU2VsZWN0aW9uU2luZ2xlKHRydWUpOwotCQkJCWZkLnNldFRpdGxlKHRhYk5hbWUpOwotCQkJCWZkLm9wZW4oKTsKLQkJCQlzZXRNZXRob2RFbGVtZW50KGZkLmdldFNlbGVjdGVkSXRlbXMoKSk7Ci0KLQkJCQkvLyB1cGRhdGUgbWV0aG9kIGVsZW1lbnQgY29udHJvbAotCQkJCWN0cmxfbWV0aG9kX2VsZW1lbnQuc2V0VGV4dChnZXRNZXRob2RFbGVtZW50TmFtZShlbGVtZW50KSk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlMSkgewotCQkJfQotCQl9KTsKLQkJCi0JCWNsZWFyQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5TRVQsIGVsZW1lbnQsCi0JCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkuZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX1dvcmtQcm9kdWN0KCksCi0JCQkJCQludWxsLCAtMSk7Ci0JCQkJLy8gdXBkYXRlIG1ldGhvZCBlbGVtZW50IGNvbnRyb2wKLQkJCQljdHJsX21ldGhvZF9lbGVtZW50LnNldFRleHQoZ2V0TWV0aG9kRWxlbWVudE5hbWUoZWxlbWVudCkpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZTEpIHsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGdldEFsbFN1YkFydGlmYWN0cyhBcnRpZmFjdCBhcnRpZmFjdCwgTGlzdCBzdWJBcnRpZmFjdHMsCi0JCQlMaXN0IGNvbnRhaW5lZEFydGlmYWN0cykgewotCQlmb3IgKEl0ZXJhdG9yIGl0b3IgPSBjb250YWluZWRBcnRpZmFjdHMuaXRlcmF0b3IoKTsgaXRvci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3Qgb2JqID0gKE9iamVjdCkgaXRvci5uZXh0KCk7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgQXJ0aWZhY3QpIHsKLQkJCQlpZiAoIXN1YkFydGlmYWN0cy5jb250YWlucyhvYmopKQotCQkJCQlzdWJBcnRpZmFjdHMuYWRkKG9iaik7Ci0JCQkJZ2V0QWxsU3ViQXJ0aWZhY3RzKChBcnRpZmFjdCkgb2JqLCBzdWJBcnRpZmFjdHMsCi0JCQkJCQkoKEFydGlmYWN0KSBvYmopLmdldENvbnRhaW5lZEFydGlmYWN0cygpKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLkRlc2NyaXB0b3JHZW5lcmFsU2VjdGlvbiN1cGRhdGVDb250cm9scygpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlQ29udHJvbHMoKSB7Ci0JCXN1cGVyLnVwZGF0ZUNvbnRyb2xzKCk7Ci0JCWFjdGl2aXR5RW50cnlTdGF0ZS5zZXRFZGl0YWJsZShlZGl0YWJsZSk7Ci0JCWFjdGl2aXR5RXhpdFN0YXRlLnNldEVkaXRhYmxlKGVkaXRhYmxlKTsKLQkJbGlua0J1dHRvbi5zZXRFbmFibGVkKGVkaXRhYmxlKTsKLQkJY2xlYXJCdXR0b24uc2V0RW5hYmxlZChlZGl0YWJsZSk7Ci0JCWFjdGl2aXR5RW50cnlTdGF0ZS5zZXRFbmFibGVkKGVkaXRhYmxlKTsKLQkJYWN0aXZpdHlFeGl0U3RhdGUuc2V0RW5hYmxlZChlZGl0YWJsZSk7Ci0KLQkJaWYgKGN0cmxfYWRkXzEgIT0gbnVsbCkKLQkJCWN0cmxfYWRkXzEuc2V0RW5hYmxlZChlZGl0YWJsZSk7Ci0JCWlmIChjdHJsX2FkZF9wcm9jXzEgIT0gbnVsbCkKLQkJCWN0cmxfYWRkX3Byb2NfMS5zZXRFbmFibGVkKGVkaXRhYmxlKTsKLQkJaWYgKGN0cmxfcmVtb3ZlXzEgIT0gbnVsbCkKLQkJCWN0cmxfcmVtb3ZlXzEuc2V0RW5hYmxlZChlZGl0YWJsZSk7Ci0JfQotCi0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5EZXNjcmlwdG9yR2VuZXJhbFNlY3Rpb24jcmVmcmVzaCgpCi0JICovCi0JcHVibGljIHZvaWQgcmVmcmVzaCgpIHsKLQkJdHJ5IHsKLQkJCWlmIChnZXRFbGVtZW50KCkgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3IpIHsKLQkJCQllbGVtZW50ID0gKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgZ2V0RWxlbWVudCgpOwotCi0JCQkJc3VwZXIucmVmcmVzaCgpOwotCi0JCQkJLy8gTW9kZWwgTW9kaWZ5IGxpc3RlbmVyIGZvciBhY3Rpdml0eSBlbnRyeSBzdGF0ZSBhbmQgYWN0aXZpdHkKLQkJCQkvLyBleGl0IHN0YXRlCi0JCQkJaWYgKHdwTW9kZWxNb2RpZnlMaXN0ZW5lciAhPSBudWxsKSB7Ci0JCQkJCWFjdGl2aXR5RW50cnlTdGF0ZQotCQkJCQkJCS5yZW1vdmVNb2RpZnlMaXN0ZW5lcih3cE1vZGVsTW9kaWZ5TGlzdGVuZXIpOwotCQkJCQlhY3Rpdml0eUV4aXRTdGF0ZQotCQkJCQkJCS5yZW1vdmVNb2RpZnlMaXN0ZW5lcih3cE1vZGVsTW9kaWZ5TGlzdGVuZXIpOwotCi0JCQkJfQotCi0JCQkJd3BNb2RlbE1vZGlmeUxpc3RlbmVyID0gZ2V0RWRpdG9yKCkuY3JlYXRlTW9kaWZ5TGlzdGVuZXIoCi0JCQkJCQkoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBlbGVtZW50KTsKLQotCQkJCWlmICh3cE1vZGVsTW9kaWZ5TGlzdGVuZXIgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50RWRpdG9yLk1vZGlmeUxpc3RlbmVyKSB7Ci0JCQkJCSgoTWV0aG9kRWxlbWVudEVkaXRvci5Nb2RpZnlMaXN0ZW5lcikgd3BNb2RlbE1vZGlmeUxpc3RlbmVyKQotCQkJCQkJCS5zZXRFbGVtZW50KGVsZW1lbnQpOwotCQkJCQkoKE1ldGhvZEVsZW1lbnRFZGl0b3IuTW9kaWZ5TGlzdGVuZXIpIHdwTW9kZWxNb2RpZnlMaXN0ZW5lcikKLQkJCQkJCQkuc2V0RGlzYWJsZSh0cnVlKTsKLQkJCQl9Ci0KLQkJCQljdHJsX21ldGhvZF9lbGVtZW50LnNldFRleHQoZ2V0TWV0aG9kRWxlbWVudE5hbWUoZWxlbWVudCkpOwotCQkJCWN0cmxfd29ya1Byb2R1Y3RfdHlwZS5zZXRUZXh0KGdldE1ldGhvZEVsZW1lbnRUeXBlKGVsZW1lbnQpKTsKLQkJCQlhY3Rpdml0eUVudHJ5U3RhdGUuc2V0VGV4dChlbGVtZW50LmdldEFjdGl2aXR5RW50cnlTdGF0ZSgpKTsKLQkJCQlhY3Rpdml0eUV4aXRTdGF0ZS5zZXRUZXh0KGVsZW1lbnQuZ2V0QWN0aXZpdHlFeGl0U3RhdGUoKSk7Ci0KLQkJCQlpZiAod3BNb2RlbE1vZGlmeUxpc3RlbmVyIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudEVkaXRvci5Nb2RpZnlMaXN0ZW5lcikgewotCQkJCQkoKE1ldGhvZEVsZW1lbnRFZGl0b3IuTW9kaWZ5TGlzdGVuZXIpIHdwTW9kZWxNb2RpZnlMaXN0ZW5lcikKLQkJCQkJCQkuc2V0RGlzYWJsZShmYWxzZSk7Ci0JCQkJfQotCi0JCQkJYWN0aXZpdHlFbnRyeVN0YXRlLmFkZE1vZGlmeUxpc3RlbmVyKHdwTW9kZWxNb2RpZnlMaXN0ZW5lcik7Ci0JCQkJYWN0aXZpdHlFeGl0U3RhdGUuYWRkTW9kaWZ5TGlzdGVuZXIod3BNb2RlbE1vZGlmeUxpc3RlbmVyKTsKLQotCQkJCWlmICh2aWV3ZXJfMSAhPSBudWxsKSB7Ci0JCQkJCXZpZXdlcl8xLnJlZnJlc2goKTsKLQkJCQl9Ci0KLQkJCQkvLyBoaWRlL3Nob3cgY2VydGFpbiBzZWN0aW9ucy4KLQkJCQl0b2dnbGVTZWN0aW9uKCk7Ci0KLQkJCX0KLQotCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCWxvZ2dlcgotCQkJCQkubG9nRXJyb3IoCi0JCQkJCQkJIkVycm9yIHJlZnJlc2hpbmcgV29ya1Byb2R1Y3REZXNjcmlwdG9yIGdlbmVyYWwgc2VjdGlvbiA6ICIgKyBlbGVtZW50LCBleCk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBhZGRJdGVtcyhMaXN0IGl0ZW1zKSB7Ci0JCWlmIChpdGVtcyAhPSBudWxsKSB7Ci0JCQlMaXN0IHdwcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQkJZm9yIChJdGVyYXRvciBpdG9yID0gaXRlbXMuaXRlcmF0b3IoKTsgaXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IG9iaiA9IGl0b3IubmV4dCgpOwotCQkJCWlmICgob2JqIGluc3RhbmNlb2YgV29ya1Byb2R1Y3QpCi0JCQkJCQkmJiAoIWlzUGFydE9mRGVsaXZlcmFibGUoKFdvcmtQcm9kdWN0KSBvYmosCi0JCQkJCQkJCShXb3JrUHJvZHVjdERlc2NyaXB0b3IpIGVsZW1lbnQpKSkgewotCQkJCQl3cHMuYWRkKChXb3JrUHJvZHVjdCkgb2JqKTsKLQotCQkJCX0KLQkJCX0KLQkJCWlmICghd3BzLmlzRW1wdHkoKSkgewotCQkJCUFzc2lnbldQVG9EZWxpdmVyYWJsZSBjbWQgPSBuZXcgQXNzaWduV1BUb0RlbGl2ZXJhYmxlKAotCQkJCQkJKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgZWxlbWVudCwgd3BzKTsKLQkJCQlhY3Rpb25NZ3IuZXhlY3V0ZShjbWQpOwotCQkJfQotCQl9Ci0JCXZpZXdlcl8xLnJlZnJlc2goKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSUZpbHRlciBnZXREZXNjcmlwdG9yRmlsdGVyKCkgewotCi0JCXJldHVybiBuZXcgRGVzY3JpcHRvclByb2Nlc3NGaWx0ZXIoZ2V0Q29uZmlndXJhdGlvbigpKSB7Ci0JCQlwcm90ZWN0ZWQgYm9vbGVhbiBjaGlsZEFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJCUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJZ2V0QWN0aXZpdGllc0luU2NvcGUoVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJCQkuZ2V0UEJTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSwgZWxlbWVudCwgbGlzdCk7Ci0JCQkJCWlmIChsaXN0LmNvbnRhaW5zKG9iaikpCi0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJZWxzZQotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yKQotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZEZyb21Qcm9jZXNzSXRlbXMoTGlzdCBpdGVtcykgewotCQlpZiAoaXRlbXMgIT0gbnVsbCkgewotCQkJZm9yIChJdGVyYXRvciBpdG9yID0gaXRlbXMuaXRlcmF0b3IoKTsgaXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IG9iaiA9IGl0b3IubmV4dCgpOwotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3IpIHsKLQkJCQkJV29ya1Byb2R1Y3Qgd3AgPSAoKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgb2JqKQotCQkJCQkJCS5nZXRXb3JrUHJvZHVjdCgpOwotCQkJCQlpZiAod3AgIT0gbnVsbCkgewotCQkJCQkJaWYgKCFpc1BhcnRPZkRlbGl2ZXJhYmxlKHdwLAotCQkJCQkJCQkoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBlbGVtZW50KSkgewotCQkJCQkJCVdvcmtQcm9kdWN0RGVzY3JpcHRvciB3cERlc2MgPSBQcm9jZXNzVXRpbAotCQkJCQkJCQkJLmNyZWF0ZVdvcmtQcm9kdWN0RGVzY3JpcHRvcih3cCk7Ci0JCQkJCQkJYWN0aW9uTWdyCi0JCQkJCQkJCQkuZG9BY3Rpb24oCi0JCQkJCQkJCQkJCUlBY3Rpb25NYW5hZ2VyLkFERCwKLQkJCQkJCQkJCQkJZWxlbWVudCwKLQkJCQkJCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCQkJCQkuZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX0RlbGl2ZXJhYmxlUGFydHMoKSwKLQkJCQkJCQkJCQkJd3BEZXNjLCAtMSk7Ci0JCQkJCQl9Ci0JCQkJCQlhY3Rpb25NZ3IKLQkJCQkJCQkJLmRvQWN0aW9uKAotCQkJCQkJCQkJCUlBY3Rpb25NYW5hZ2VyLkFERCwKLQkJCQkJCQkJCQllbGVtZW50LAotCQkJCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJCQkuZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX0RlbGl2ZXJhYmxlUGFydHMoKSwKLQkJCQkJCQkJCQlvYmosIC0xKTsKLQkJCQkJCQotCQkJCQl9IGVsc2UgewotCQkJCQkJTWVzc2FnZUZvcm1hdCBtZiA9IG5ldyBNZXNzYWdlRm9ybWF0KAotCQkJCQkJCQlQcm9wZXJ0aWVzUmVzb3VyY2VzLlByb2Nlc3NfRGVsaXZlcmFibGVBc3NpZ25FcnJvcik7IAotCQkJCQkJT2JqZWN0W10gYXJncyA9IHsKLQkJCQkJCQkJKChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIG9iaikuZ2V0TmFtZSgpLAotCQkJCQkJCQkoKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgZWxlbWVudCkuZ2V0TmFtZSgpIH07Ci0JCQkJCQlBdXRob3JpbmdVSVBsdWdpbgotCQkJCQkJCQkuZ2V0RGVmYXVsdCgpCi0JCQkJCQkJCS5nZXRNc2dEaWFsb2coKQotCQkJCQkJCQkuZGlzcGxheUluZm8oCi0JCQkJCQkJCQkJUHJvcGVydGllc1Jlc291cmNlcy5Qcm9jZXNzX0Fzc2lnbm1lbnRJbmZvVGl0bGUsIG1mLmZvcm1hdChhcmdzKSk7IAotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgcmVtb3ZlSXRlbXMoTGlzdCBpdGVtcykgewotCQlpZiAoIWl0ZW1zLmlzRW1wdHkoKSkgewotCQkJZm9yIChJdGVyYXRvciBpdG9yID0gaXRlbXMuaXRlcmF0b3IoKTsgaXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IG9iaiA9IChPYmplY3QpIGl0b3IubmV4dCgpOwotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3IpIHsKLQkJCQkJYWN0aW9uTWdyCi0JCQkJCQkJLmRvQWN0aW9uKAotCQkJCQkJCQkJSUFjdGlvbk1hbmFnZXIuUkVNT1ZFLAotCQkJCQkJCQkJZWxlbWVudCwKLQkJCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJCS5nZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JfRGVsaXZlcmFibGVQYXJ0cygpLAotCQkJCQkJCQkJKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgb2JqLCAtMSk7Ci0JCQkJfQotCi0JCQkJLy8gZmluZCBtYXRjaGluZyBkZWxpdmVyYWJsZSBwYXJ0cwotCQkJCU9iamVjdCB3cERlc2MgPSBmaW5kRGVsaXZlcmFibGVQYXJ0cygoT2JqZWN0KSBvYmopOwotCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5SRU1PVkUsIGVsZW1lbnQsCi0JCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkuZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX0RlbGl2ZXJhYmxlUGFydHMoKSwKLQkJCQkJCXdwRGVzYywgLTEpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBPYmplY3QgZmluZERlbGl2ZXJhYmxlUGFydHMoT2JqZWN0IG9iaikgewotCQlMaXN0IHBhcnRzID0gKChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIGVsZW1lbnQpLmdldERlbGl2ZXJhYmxlUGFydHMoKTsKLQotCQlmb3IgKEl0ZXJhdG9yIGl0b3IgPSBwYXJ0cy5pdGVyYXRvcigpOyBpdG9yLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBpdG9yT2JqZWN0ID0gaXRvci5uZXh0KCk7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yKSB7Ci0JCQkJaWYgKGl0b3JPYmplY3QgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3IpIHsKLQkJCQkJT2JqZWN0IG9ialdQID0gKChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIG9iaikKLQkJCQkJCQkuZ2V0V29ya1Byb2R1Y3QoKTsKLQkJCQkJT2JqZWN0IGl0b3JXUCA9ICgoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBpdG9yT2JqZWN0KQotCQkJCQkJCS5nZXRXb3JrUHJvZHVjdCgpOwotCQkJCQlpZiAob2JqV1AuZXF1YWxzKGl0b3JXUCkpIHsKLQkJCQkJCXJldHVybiBpdG9yT2JqZWN0OwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogRmluZCBwYXJlbnQgcHJvY2VzcwotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZ2V0UHJvY2VzcyhCcmVha2Rvd25FbGVtZW50IGJyRWxlbWVudCkgewotCQlBZGFwdGVyRmFjdG9yeSBhRmFjdG9yeSA9IFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJLmdldFBCU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCk7Ci0JCUl0ZW1Qcm92aWRlckFkYXB0ZXIgYWRhcHRlciA9IChJdGVtUHJvdmlkZXJBZGFwdGVyKSBhRmFjdG9yeS5hZGFwdCgKLQkJCQlickVsZW1lbnQsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCU9iamVjdCBwYXJlbnQgPSBhZGFwdGVyLmdldFBhcmVudChickVsZW1lbnQpOwotCQl3aGlsZSAoIShwYXJlbnQgaW5zdGFuY2VvZiBQcm9jZXNzKSkgewotCQkJYnJFbGVtZW50ID0gKEJyZWFrZG93bkVsZW1lbnQpIHBhcmVudDsKLQkJCWFkYXB0ZXIgPSAoSXRlbVByb3ZpZGVyQWRhcHRlcikgYUZhY3RvcnkuYWRhcHQoYnJFbGVtZW50LAotCQkJCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkJcGFyZW50ID0gYWRhcHRlci5nZXRQYXJlbnQoYnJFbGVtZW50KTsKLQkJfQotCQlyZXR1cm4gcGFyZW50OwotCX0KLQotCS8qKgotCSAqIEdldCBwYXJlbnQgZGVsaXZlcmFibGVzCi0JICogCi0JICogQHBhcmFtIGJyRWxlbWVudAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIExpc3QgZ2V0UGFyZW50RGVsaXZlcmFibGVzKEJyZWFrZG93bkVsZW1lbnQgYnJFbGVtZW50KSB7Ci0JCUxpc3QgcGFyZW50RGVsaXZlcmFibGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlBZGFwdGVyRmFjdG9yeSBhRmFjdG9yeSA9IFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJLmdldFBCU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCk7Ci0JCUl0ZW1Qcm92aWRlckFkYXB0ZXIgYWRhcHRlciA9IChJdGVtUHJvdmlkZXJBZGFwdGVyKSBhRmFjdG9yeS5hZGFwdCgKLQkJCQlickVsZW1lbnQsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCU9iamVjdCBwYXJlbnQgPSBhZGFwdGVyLmdldFBhcmVudChickVsZW1lbnQpOwotCQl3aGlsZSAoIShwYXJlbnQgaW5zdGFuY2VvZiBBY3Rpdml0eSkpIHsKLQkJCWJyRWxlbWVudCA9IChCcmVha2Rvd25FbGVtZW50KSBwYXJlbnQ7Ci0JCQlpZiAocGFyZW50IGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yKSB7Ci0JCQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yIHdwZGVzYyA9IChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIHBhcmVudDsKLQkJCQlpZiAod3BkZXNjLmdldFdvcmtQcm9kdWN0KCkgaW5zdGFuY2VvZiBEZWxpdmVyYWJsZSkgewotCQkJCQlwYXJlbnREZWxpdmVyYWJsZXMuYWRkKHdwZGVzYyk7Ci0JCQkJfQotCQkJfQotCQkJYWRhcHRlciA9IChJdGVtUHJvdmlkZXJBZGFwdGVyKSBhRmFjdG9yeS5hZGFwdChickVsZW1lbnQsCi0JCQkJCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCQlwYXJlbnQgPSBhZGFwdGVyLmdldFBhcmVudChickVsZW1lbnQpOwotCQl9Ci0JCXJldHVybiBwYXJlbnREZWxpdmVyYWJsZXM7Ci0JfQotCS8qKgotCSAqIEZpbmQgYWxsIHNpYmxpbmcgd29yayBwcm9kdWN0cwotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgT2JqZWN0IGdldFBhcmVudFdvcmtQcm9kdWN0cyhCcmVha2Rvd25FbGVtZW50IGJyRWxlbWVudCkgewotCQlIYXNoU2V0IHdvcmtQcm9kdWN0cyA9IG5ldyBIYXNoU2V0KCk7Ci0KLQkJQWRhcHRlckZhY3RvcnkgYUZhY3RvcnkgPSBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCS5nZXRQQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpOwotCQlJdGVtUHJvdmlkZXJBZGFwdGVyIGFkYXB0ZXIgPSAoSXRlbVByb3ZpZGVyQWRhcHRlcikgYUZhY3RvcnkuYWRhcHQoCi0JCQkJYnJFbGVtZW50LCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQlPYmplY3QgcGFyZW50ID0gYWRhcHRlci5nZXRQYXJlbnQoYnJFbGVtZW50KTsKLQkJd2hpbGUgKCEocGFyZW50IGluc3RhbmNlb2YgQWN0aXZpdHkpKSB7Ci0JCQlickVsZW1lbnQgPSAoQnJlYWtkb3duRWxlbWVudCkgcGFyZW50OwotCQkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgewotCQkJCVdvcmtQcm9kdWN0RGVzY3JpcHRvciB3cGRlc2MgPSAoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBwYXJlbnQ7Ci0JCQkJaWYgKHdwZGVzYy5nZXRXb3JrUHJvZHVjdCgpIGluc3RhbmNlb2YgRGVsaXZlcmFibGUpIHsKLQkJCQkJd29ya1Byb2R1Y3RzLmFkZCh3cGRlc2MuZ2V0V29ya1Byb2R1Y3QoKSk7Ci0JCQkJfQotCQkJfQotCQkJYWRhcHRlciA9IChJdGVtUHJvdmlkZXJBZGFwdGVyKSBhRmFjdG9yeS5hZGFwdChickVsZW1lbnQsCi0JCQkJCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCQlwYXJlbnQgPSBhZGFwdGVyLmdldFBhcmVudChickVsZW1lbnQpOwotCQl9Ci0KLQkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQlMaXN0IGJyRWxlbWVudHMgPSAoKEFjdGl2aXR5KSBwYXJlbnQpLmdldEJyZWFrZG93bkVsZW1lbnRzKCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0b3IgPSBickVsZW1lbnRzLml0ZXJhdG9yKCk7IGl0b3IuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBvYmogPSAoT2JqZWN0KSBpdG9yLm5leHQoKTsKLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yKSB7Ci0JCQkJCVdvcmtQcm9kdWN0IHdwID0gKChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIG9iaikKLQkJCQkJCQkuZ2V0V29ya1Byb2R1Y3QoKTsKLQkJCQkJaWYgKHdwICE9IG51bGwpCi0JCQkJCQl3b3JrUHJvZHVjdHMuYWRkKHdwKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHdvcmtQcm9kdWN0czsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5EZXNjcmlwdG9yR2VuZXJhbFNlY3Rpb24jZ2V0TmFtZVByZWZpeCgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lUHJlZml4KCkgewotCQlyZXR1cm4gTGlicmFyeVVJVGV4dC5URVhUX1dPUktfUFJPRFVDVF9ERVNDUklQVE9SICsgIjogIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRNZXRob2RFbGVtZW50KExpc3QgaXRlbXMpIHsKLQkJaWYgKChpdGVtcyAhPSBudWxsKSAmJiAoaXRlbXMuc2l6ZSgpID49IDEpKSB7Ci0JCQlpZiAoaXRlbXMuZ2V0KDApIGluc3RhbmNlb2YgV29ya1Byb2R1Y3QpIHsKLQkJCQlXb3JrUHJvZHVjdCB3cCA9IChXb3JrUHJvZHVjdCkgaXRlbXMuZ2V0KDApOwotCi0vLwkJCQlMaXN0IGxpc3QgPSBQcm9jZXNzVXRpbAotLy8JCQkJCQkuZ2V0U2libGluZ3MoVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLS8vCQkJCQkJCQkuZ2V0UEJTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSwgZ2V0QWRhcHRlcigpLAotLy8JCQkJCQkJCWVsZW1lbnQpOwotCQkJCWJvb2xlYW4gY2FuQXNzaWduID0gdHJ1ZTsKLS8vCQkJCWZvciAoSXRlcmF0b3IgaXRvciA9IGxpc3QuaXRlcmF0b3IoKTsgaXRvci5oYXNOZXh0KCk7KSB7Ci0vLwkJCQkJT2JqZWN0IG9iaiA9IGl0b3IubmV4dCgpOwotLy8JCQkJCWlmIChvYmogaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3IpIHsKLS8vCQkJCQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yIHdwRGVzYyA9IChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIG9iajsKLS8vCQkJCQkJaWYgKCghd3BEZXNjLmVxdWFscyhlbGVtZW50KSkKLS8vCQkJCQkJCQkmJiAoIXdwRGVzYy5nZXRTdXBwcmVzc2VkKCkuYm9vbGVhblZhbHVlKCkpKSB7Ci0vLwkJCQkJCQlXb3JrUHJvZHVjdCBleGlzaW5nV1AgPSB3cERlc2MuZ2V0V29ya1Byb2R1Y3QoKTsKLS8vCQkJCQkJCWlmICh3cC5lcXVhbHMoZXhpc2luZ1dQKSkgewotLy8JCQkJCQkJCWNhbkFzc2lnbiA9IGZhbHNlOwotLy8JCQkJCQkJCWJyZWFrOwotLy8JCQkJCQkJfQotLy8JCQkJCQl9Ci0vLwkJCQkJfQotLy8JCQkJfQotCQkJCWlmIChjYW5Bc3NpZ24pIHsKLQkJCQkJTGlua01ldGhvZEVsZW1lbnRDb21tYW5kIGNtZCA9IG5ldyBMaW5rTWV0aG9kRWxlbWVudENvbW1hbmQoCi0JCQkJCQkJZWxlbWVudCwgd3AsCi0JCQkJCQkJVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fV09SS19QUk9EVUNUKTsKLQkJCQkJYWN0aW9uTWdyLmV4ZWN1dGUoY21kKTsKLQotCQkJCQkvLyBzZXQgc2VsZWN0aW9uIHRvIHNhbWUgZWxlbWVudCB0byBlbmFibGUgY29ycmVjdCBhY3Rpb25zCi0JCQkJCWdldEVkaXRvcigpLnNldFNlbGVjdGlvbihnZXRTZWxlY3Rpb24oKSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJTWVzc2FnZUZvcm1hdCBtZiA9IG5ldyBNZXNzYWdlRm9ybWF0KFByb3BlcnRpZXNSZXNvdXJjZXMuUHJvY2Vzc19JbnZhbGlkTGlua01ldGhvZEVsZW1lbnQpOyAKLQkJCQkJT2JqZWN0W10gYXJncyA9IHsgd3AuZ2V0TmFtZSgpIH07Ci0JCQkJCUF1dGhvcmluZ1VJUGx1Z2luCi0JCQkJCQkJLmdldERlZmF1bHQoKQotCQkJCQkJCS5nZXRNc2dEaWFsb2coKQotCQkJCQkJCS5kaXNwbGF5SW5mbygKLQkJCQkJCQkJCVByb3BlcnRpZXNSZXNvdXJjZXMuUHJvY2Vzc19MaW5rTWV0aG9kRWxlbWVudFRpdGxlLCBtZi5mb3JtYXQoYXJncykpOyAKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNQYXJ0T2ZEZWxpdmVyYWJsZShXb3JrUHJvZHVjdCB3cCwKLQkJCVdvcmtQcm9kdWN0RGVzY3JpcHRvciBkZWxpdmVyYWJsZSkgewotCi0JCUxpc3QgZGVsaXZlcmFibGVQYXJ0cyA9IFByb2Nlc3NVdGlsCi0JCQkJLmdldEFzc29jaWF0ZWRFbGVtZW50TGlzdChkZWxpdmVyYWJsZS5nZXREZWxpdmVyYWJsZVBhcnRzKCkpOwotCQlpZiAoZGVsaXZlcmFibGVQYXJ0cy5jb250YWlucyh3cCkpCi0JCQlyZXR1cm4gdHJ1ZTsKLQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL3BhY2thZ2UuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3YWE3YzcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIHRhYmJlZCBwYWdlcyBmb3IgdGhlIGJyZWFrZG93biBlbGVtZW50cyBQcm9wZXJ0aWVzIHZpZXcuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm92aWRlcnMvQ2F0ZWdvcnlDb250ZW50UHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvdmlkZXJzL0NhdGVnb3J5Q29udGVudFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmNTZkNzkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm92aWRlcnMvQ2F0ZWdvcnlDb250ZW50UHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3ZpZGVyczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVZpZXdlck5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkZlYXR1cmVWYWx1ZVdyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UcmFuc2llbnRHcm91cEl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNhdGVnb3J5LkRpc2NpcGxpbmVDYXRlZ29yaWVzSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY2F0ZWdvcnkuRG9tYWluc0l0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNhdGVnb3J5LlJvbGVTZXRzSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY2F0ZWdvcnkuVG9vbHNJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jYXRlZ29yeS5Xb3JrUHJvZHVjdFR5cGVzSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQubmF2aWdhdG9yLkNvbmZpZ3VyYXRpb25zSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQubmF2aWdhdG9yLlBsdWdpblVJUGFja2FnZXNJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuc2VydmljZXMuU2FmZVVwZGF0ZUNvbnRyb2xsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50Q2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DdXN0b21DYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2hlY2tib3hUcmVlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotCi0vKioKLSAqIENvbnRlbnQgcHJvdmlkZXIgZm9yIEN1c3RvbSBDYXRlZ29yeSB2aWV3IG9mIGNvbmZpZ3VyYXRpb24gcGFnZQotICogCi0gKiBAYXV0aG9yIEplZmYgSGFyZHkKLSAqLwotCi1wdWJsaWMgY2xhc3MgQ2F0ZWdvcnlDb250ZW50UHJvdmlkZXIgZXh0ZW5kcyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlciB7Ci0KLQkvLyB0aGVyZSBpcyBhIHByb2JsZW0gaW4gdGhlIHBhc3NlZCBpbiBBZGFwdGVyRmFjdG9yeQotCS8vIGl0IGNhbid0IGZpbmQgdGhlIGNvcnJlY3QgcGFyZW50IGZyb20gdGhlIGNoaWxkCi0JLy8gbmVlZCB0byBidWlsZCBhIG1hcCBvZiBjaGlsZCB0byBpdCdzIHBhcmVudCBpZiB0aGUgY2hpbGQgaXMgYSBVSQotCS8vIGZvbGRlcgotCS8vIGNsZWFyIHRoZSBtYXAgd2hlbiB0aGUgaW5wdXQgaXMgc2V0Ci0JcHJpdmF0ZSBNYXA8T2JqZWN0LCBPYmplY3Q+IGNoaWxkVUlQYXJlbnRNYXAgPSBuZXcgSGFzaE1hcDxPYmplY3QsIE9iamVjdD4oKTsKLQkKLQlwcml2YXRlIE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnOwotCi0JLyoqCi0JICogQ3JlYXRlIGFuIGluc3RhbmNlCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICovCi0JcHVibGljIENhdGVnb3J5Q29udGVudFByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LCBNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZykgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JCXRoaXMuY29uZmlnID0gY29uZmlnOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIjZ2V0Q2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0W10gZ2V0Q2hpbGRyZW4oT2JqZWN0IHBhcmVudEVsZW1lbnQpIHsKLQkJQ29sbGVjdGlvbjxPYmplY3Q+IGNoaWxkcmVuID0gbmV3IEFycmF5TGlzdDxPYmplY3Q+KCk7Ci0JCWlmIChwYXJlbnRFbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luKSB7Ci0JCQkvLyBhZGQgc3RhbmRhcmQgY2F0ZWdvcmllcyBVSSBmb2xkZXJzIGFzIGFwcHJvcHJpYXRlCi0JCQlEaXNjaXBsaW5lQ2F0ZWdvcmllc0l0ZW1Qcm92aWRlciBkaXNjaXBsaW5lcyA9IChEaXNjaXBsaW5lQ2F0ZWdvcmllc0l0ZW1Qcm92aWRlcilUbmdVdGlsLmdldERpc2NpcGxpbmVDYXRlZ29yaWVzSXRlbVByb3ZpZGVyKChNZXRob2RQbHVnaW4pcGFyZW50RWxlbWVudCk7Ci0JCQlpZiAoZGlzY2lwbGluZXMgIT0gbnVsbCAmJiAhZGlzY2lwbGluZXMuZ2V0Q2hpbGRyZW4oZGlzY2lwbGluZXMpLmlzRW1wdHkoKSkgewotCQkJCWNoaWxkcmVuLmFkZChkaXNjaXBsaW5lcyk7Ci0JCQl9Ci0JCQlEb21haW5zSXRlbVByb3ZpZGVyIGRvbWFpbnMgPSAoRG9tYWluc0l0ZW1Qcm92aWRlcilUbmdVdGlsLmdldERvbWFpbnNJdGVtUHJvdmlkZXIoKE1ldGhvZFBsdWdpbilwYXJlbnRFbGVtZW50KTsKLQkJCWlmIChkb21haW5zICE9IG51bGwgJiYgIWRvbWFpbnMuZ2V0Q2hpbGRyZW4oZG9tYWlucykuaXNFbXB0eSgpKSB7Ci0JCQkJY2hpbGRyZW4uYWRkKGRvbWFpbnMpOwotCQkJfQotCQkJV29ya1Byb2R1Y3RUeXBlc0l0ZW1Qcm92aWRlciB3cFR5cGVzID0gKFdvcmtQcm9kdWN0VHlwZXNJdGVtUHJvdmlkZXIpVG5nVXRpbC5nZXRXb3JrUHJvZHVjdFR5cGVzSXRlbVByb3ZpZGVyKChNZXRob2RQbHVnaW4pcGFyZW50RWxlbWVudCk7Ci0JCQlpZiAod3BUeXBlcyAhPSBudWxsICYmICF3cFR5cGVzLmdldENoaWxkcmVuKHdwVHlwZXMpLmlzRW1wdHkoKSkgewotCQkJCWNoaWxkcmVuLmFkZCh3cFR5cGVzKTsKLQkJCX0KLQkJCVJvbGVTZXRzSXRlbVByb3ZpZGVyIHJvbGVTZXRzID0gKFJvbGVTZXRzSXRlbVByb3ZpZGVyKVRuZ1V0aWwuZ2V0Um9sZVNldHNJdGVtUHJvdmlkZXIoKE1ldGhvZFBsdWdpbilwYXJlbnRFbGVtZW50KTsKLQkJCWlmIChyb2xlU2V0cyAhPSBudWxsICYmICFyb2xlU2V0cy5nZXRDaGlsZHJlbihyb2xlU2V0cykuaXNFbXB0eSgpKSB7Ci0JCQkJY2hpbGRyZW4uYWRkKHJvbGVTZXRzKTsKLQkJCX0KLQkJCVRvb2xzSXRlbVByb3ZpZGVyIHRvb2xzID0gKFRvb2xzSXRlbVByb3ZpZGVyKVRuZ1V0aWwuZ2V0VG9vbHNJdGVtUHJvdmlkZXIoKE1ldGhvZFBsdWdpbilwYXJlbnRFbGVtZW50KTsKLQkJCWlmICh0b29scyAhPSBudWxsICYmICF0b29scy5nZXRDaGlsZHJlbih0b29scykuaXNFbXB0eSgpKSB7Ci0JCQkJY2hpbGRyZW4uYWRkKHRvb2xzKTsKLQkJCX0KLQkJCQotCQkJLy8gYWRkIEN1c3RvbUNhdGVnb3JpZXMgcHJvdmlkZXIKLQkJCS8vIGdldCByb290IENDIG9mIHBsdWdpbgotCQkJQ3VzdG9tQ2F0ZWdvcnkgcm9vdENDID0gKFRuZ1V0aWwuZ2V0Um9vdEN1c3RvbUNhdGVnb3J5KChNZXRob2RQbHVnaW4pcGFyZW50RWxlbWVudCkpOwotCQkJaWYgKHJvb3RDQyAhPSBudWxsICYmICFyb290Q0MuZ2V0Q2F0ZWdvcml6ZWRFbGVtZW50cygpLmlzRW1wdHkoKSkgewotCQkJCWNoaWxkcmVuLmFkZChyb290Q0MpOwotCQkJfQotLy8JCQljaGlsZHJlbiA9IHVud3JhcEZWV0lQcyhjaGlsZHJlbik7Ci0vLwkJCWNoaWxkcmVuID0gZmlsdGVyQ2F0ZWdvcnlFbGVtZW50cyhwYXJlbnRFbGVtZW50LCBjaGlsZHJlbik7Ci0JCX0gZWxzZSBpZiAocGFyZW50RWxlbWVudCBpbnN0YW5jZW9mIFBsdWdpblVJUGFja2FnZXNJdGVtUHJvdmlkZXIpIHsKLQkJCWNoaWxkcmVuLmFkZEFsbChBcnJheXMuYXNMaXN0KHN1cGVyLmdldENoaWxkcmVuKHBhcmVudEVsZW1lbnQpKSk7Ci0JCQljaGlsZHJlbiA9IGZpbHRlclBsdWdpbihjaGlsZHJlbik7Ci0JCX0gZWxzZSBpZiAocGFyZW50RWxlbWVudCBpbnN0YW5jZW9mIENvbnRlbnRDYXRlZ29yeSkgewotCQkJY2hpbGRyZW4uYWRkQWxsKEFycmF5cy5hc0xpc3Qoc3VwZXIuZ2V0Q2hpbGRyZW4ocGFyZW50RWxlbWVudCkpKTsKLS8vCQkJY2hpbGRyZW4gPSB1bndyYXBGVldJUHMoY2hpbGRyZW4pOwotCQkJY2hpbGRyZW4gPSBmaWx0ZXJDYXRlZ29yeUVsZW1lbnRzKHBhcmVudEVsZW1lbnQsIGNoaWxkcmVuKTsKLQkJfSBlbHNlIGlmIChwYXJlbnRFbGVtZW50IGluc3RhbmNlb2YgRmVhdHVyZVZhbHVlV3JhcHBlckl0ZW1Qcm92aWRlcikgewotCQkJY2hpbGRyZW4uYWRkQWxsKEFycmF5cy5hc0xpc3Qoc3VwZXIuZ2V0Q2hpbGRyZW4ocGFyZW50RWxlbWVudCkpKTsKLS8vCQkJY2hpbGRyZW4gPSB1bndyYXBGVldJUHMoY2hpbGRyZW4pOwotCQkJY2hpbGRyZW4gPSBmaWx0ZXJDYXRlZ29yeUVsZW1lbnRzKHBhcmVudEVsZW1lbnQsIGNoaWxkcmVuKTsKLQkJfSBlbHNlIGlmIChwYXJlbnRFbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kTGlicmFyeSkgewotCQkJY2hpbGRyZW4uYWRkQWxsKEFycmF5cy5hc0xpc3Qoc3VwZXIuZ2V0RWxlbWVudHMocGFyZW50RWxlbWVudCkpKTsKLQkJCWNoaWxkcmVuID0gZmlsdGVyUGx1Z2luKGNoaWxkcmVuKTsKLQkJfSBlbHNlIGlmIChwYXJlbnRFbGVtZW50IGluc3RhbmNlb2YgVHJhbnNpZW50R3JvdXBJdGVtUHJvdmlkZXIpIHsKLQkJCWNoaWxkcmVuLmFkZEFsbChBcnJheXMuYXNMaXN0KHN1cGVyLmdldENoaWxkcmVuKHBhcmVudEVsZW1lbnQpKSk7Ci0JCX0KLQkJY3JlYXRlQ2hpbGRQYXJlbnRNYXAocGFyZW50RWxlbWVudCwgY2hpbGRyZW4pOwotCQlyZXR1cm4gY2hpbGRyZW4udG9BcnJheSgpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlQ2hpbGRQYXJlbnRNYXAoT2JqZWN0IHBhcmVudCwgQ29sbGVjdGlvbiBjaGlsZHJlbikgewotCQlpZiAoY2hpbGRyZW4gPT0gbnVsbCB8fCBjaGlsZHJlbi5zaXplKCkgPT0gMCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGNoaWxkcmVuLml0ZXJhdG9yKCk7aXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgY2hpbGQgPSBpdGVyLm5leHQoKTsKLQkJCS8vIGlmIHRoZSBwYXJlbnQgaXMgYSBVSSBmb2xkZXIsIG1hcCB0aGUgY2hpbGQgdG8gdGhlIHBhcmVudAotCQkJLy8gc28gdGhhdCB3ZSBjYW4gZ2V0IHRoZSBwYXJlbnQgbGF0ZXIKLQkJCS8vIGlmICggIShwYXJlbnQgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSApCi0JCQl7Ci0JCQkJY2hpbGRVSVBhcmVudE1hcC5wdXQoY2hpbGQsIHBhcmVudCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyI2dldEVsZW1lbnRzKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dEVsZW1lbnQpIHsKLQkJcmV0dXJuIGdldENoaWxkcmVuKGlucHV0RWxlbWVudCk7Ci0JfQotCQotCXByaXZhdGUgQ29sbGVjdGlvbjxPYmplY3Q+IGZpbHRlclBsdWdpbihDb2xsZWN0aW9uPE9iamVjdD4gZWxlbWVudHMpIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZWxlbWVudHMuaXRlcmF0b3IoKTtpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikgewotCQkJCS8vIGZpbHRlciBvdXQgcGx1Z2lucyB0aGF0IGhhdmUgbm8gQ0MncwotCQkJCWlmICghaGFzQ2hpbGRyZW4oKE1ldGhvZFBsdWdpbillbGVtZW50KSB8fCAhY29uZmlnLmdldE1ldGhvZFBsdWdpblNlbGVjdGlvbigpLmNvbnRhaW5zKGVsZW1lbnQpKSB7Ci0JCQkJCWl0ZXIucmVtb3ZlKCk7Ci0JCQkJfQotCQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgUGx1Z2luVUlQYWNrYWdlc0l0ZW1Qcm92aWRlcikgewotCQkJCS8vIGZpbHRlciBvdXQgcGx1Z2luIHBhY2thZ2VzIHRoYXQgaGF2ZSBubyBwbHVnaW5zIHdpdGggQ0MncwotCQkJCWlmICghaGFzQ2hpbGRyZW4oKFBsdWdpblVJUGFja2FnZXNJdGVtUHJvdmlkZXIpZWxlbWVudCkpIHsKLQkJCQkJaXRlci5yZW1vdmUoKTsKLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBDb25maWd1cmF0aW9uc0l0ZW1Qcm92aWRlcikgewotCQkJCS8vIHJlbW92ZSAiQ29uZmlndXJhdGlvbnMiIGZvbGRlcgotCQkJCWl0ZXIucmVtb3ZlKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVsZW1lbnRzOwotCX0KLQkKLQlwcml2YXRlIENvbGxlY3Rpb248T2JqZWN0PiBmaWx0ZXJDYXRlZ29yeUVsZW1lbnRzKE9iamVjdCBwYXJlbnQsIENvbGxlY3Rpb248T2JqZWN0PiBlbGVtZW50cykgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBlbGVtZW50cy5pdGVyYXRvcigpO2l0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyLm5leHQoKTsKLQkJCWVsZW1lbnQgPSBUbmdVdGlsLnVud3JhcChlbGVtZW50KTsKLQkJCWlmICghKGVsZW1lbnQgaW5zdGFuY2VvZiBDb250ZW50Q2F0ZWdvcnkpKSB7Ci0JCQkJLy8gcmVtb3ZlIG5vbi1Db250ZW50Q2F0ZWdvcnkKLQkJCQlpdGVyLnJlbW92ZSgpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlbGVtZW50czsKLQl9Ci0JCi0vLwlwcml2YXRlIENvbGxlY3Rpb248T2JqZWN0PiB1bndyYXBGVldJUHMoQ29sbGVjdGlvbjxPYmplY3Q+IGVsZW1lbnRzKSB7Ci0vLwkJQ29sbGVjdGlvbjxPYmplY3Q+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PigpOwotLy8JCWZvciAoSXRlcmF0b3IgaXRlciA9IGVsZW1lbnRzLml0ZXJhdG9yKCk7aXRlci5oYXNOZXh0KCk7KSB7Ci0vLwkJCU9iamVjdCBlbGVtZW50ID0gaXRlci5uZXh0KCk7Ci0vLwkJCWVsZW1lbnQgPSBUbmdVdGlsLnVud3JhcChlbGVtZW50KTsKLS8vCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBDdXN0b21DYXRlZ29yeSkgewotLy8JCQkJcmVzdWx0LmFkZChnZXRGaXJzdFRyZWVJdGVtRm9yQ0MoKEN1c3RvbUNhdGVnb3J5KWVsZW1lbnQpKTsKLS8vCQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgQ29udGVudENhdGVnb3J5KSB7Ci0vLwkJCQlyZXN1bHQuYWRkKGVsZW1lbnQpOwotLy8JCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBUcmFuc2llbnRDYXRlZ29yeVBhY2thZ2VJdGVtUHJvdmlkZXIpIHsKLS8vCQkJCXJlc3VsdC5hZGQoZWxlbWVudCk7Ci0vLwkJCX0KLS8vCQl9Ci0vLwkJcmV0dXJuIHJlc3VsdDsKLS8vCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIjZ2V0UGFyZW50KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJaWYgKGNoaWxkVUlQYXJlbnRNYXAuY29udGFpbnNLZXkoZWxlbWVudCkpIHsKLQkJCXJldHVybiBjaGlsZFVJUGFyZW50TWFwLmdldChlbGVtZW50KTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBudWxsOwotCQkJLy8gdHJ5IHRvIGRldGVybWluZSBwYXJlbnQKLS8vCQkJT2JqZWN0IHBhcmVudCA9IHN1cGVyLmdldFBhcmVudChlbGVtZW50KTsKLS8vCQkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIENvbnRlbnRQYWNrYWdlICYmIAotLy8JCQkJCWVsZW1lbnQgaW5zdGFuY2VvZiBDb250ZW50Q2F0ZWdvcnkpIHsKLS8vCQkJCXJldHVybiBMaWJyYXJ5VXRpbC5nZXRNZXRob2RQbHVnaW4oKENvbnRlbnRDYXRlZ29yeSllbGVtZW50KTsKLS8vCQkJfSBlbHNlIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBDdXN0b21DYXRlZ29yeSkgewotLy8JCQkJcGFyZW50ID0gZ2V0Rmlyc3RUcmVlSXRlbUZvckNDKChDdXN0b21DYXRlZ29yeSlwYXJlbnQpOwotLy8JCQl9Ci0vLwkJCWVsc2UgaWYgKHBhcmVudCBpbnN0YW5jZW9mIEZlYXR1cmVWYWx1ZVdyYXBwZXJJdGVtUHJvdmlkZXIpIHsKLS8vCQkJCXBhcmVudCA9IFRuZ1V0aWwudW53cmFwKHBhcmVudCk7Ci0vLwkJCX0KLS8vCQkJcmV0dXJuIHBhcmVudDsKLQkJfQotCX0KLQkKLQlwdWJsaWMgQ29sbGVjdGlvbjxPYmplY3Q+IGdldFRyZWVJdGVtcyhPYmplY3QgaXRlbSkgewotCQlMaXN0PE9iamVjdD4gcmVzdWx0ID0gbmV3IEFycmF5TGlzdDxPYmplY3Q+KCk7Ci0JCS8vIGdldCBJVHJlZUNvbnRlbnRQcm92aWRlciBhZGFwYXRlcgotCQlMaXN0IG5vdGlmeUNoYW5nZWRMaXN0ZW5lcnMgPSBUbmdVdGlsLmdldE5vdGlmeUNoYW5nZWRMaXN0ZW5lcnMoYWRhcHRlckZhY3RvcnksIGl0ZW0pOwotCQlpZiAoIW5vdGlmeUNoYW5nZWRMaXN0ZW5lcnMuaXNFbXB0eSgpKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gbm90aWZ5Q2hhbmdlZExpc3RlbmVycy5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IGxpc3RlbmVyID0gaXRlcmF0b3IubmV4dCgpOwotCQkJCWlmKGxpc3RlbmVyIGluc3RhbmNlb2YgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyCi0JCQkJCQkmJiBUbmdVdGlsLnVud3JhcChsaXN0ZW5lcikgPT0gaXRlbSkgewotCQkJCQlyZXN1bHQuYWRkKGxpc3RlbmVyKTsKLQkJCQl9Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlyZXN1bHQuYWRkKGl0ZW0pOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyI2hhc0NoaWxkcmVuKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oT2JqZWN0IGVsZW1lbnQpIHsKLQkJT2JqZWN0W10gY2hpbGRyZW4gPSBnZXRDaGlsZHJlbihlbGVtZW50KTsKLQkJcmV0dXJuIChjaGlsZHJlbiAhPSBudWxsICYmIGNoaWxkcmVuLmxlbmd0aCA+IDApOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIjaW5wdXRDaGFuZ2VkKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyLCBqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkgewotCQlzdXBlci5pbnB1dENoYW5nZWQodmlld2VyLCBvbGRJbnB1dCwgbmV3SW5wdXQpOwotCQljaGlsZFVJUGFyZW50TWFwLmNsZWFyKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlciNub3RpZnlDaGFuZ2VkKG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCi0JCWlmICgobm90aWZpY2F0aW9uIGluc3RhbmNlb2YgSVZpZXdlck5vdGlmaWNhdGlvbikpIHsKLQkJCWZpbmFsIElWaWV3ZXJOb3RpZmljYXRpb24gdm50ID0gKElWaWV3ZXJOb3RpZmljYXRpb24pIG5vdGlmaWNhdGlvbjsKLQkJCWZpbmFsIE9iamVjdCBlbGVtZW50ID0gdm50LmdldEVsZW1lbnQoKTsKLQkJCWZpbmFsIENoZWNrYm94VHJlZVZpZXdlciBjdHJsID0gKChDaGVja2JveFRyZWVWaWV3ZXIpIHN1cGVyLnZpZXdlcik7Ci0JCQlpZiAoZWxlbWVudCAhPSBudWxsICYmICh2bnQuZ2V0RXZlbnRUeXBlKCkgPT0gTm90aWZpY2F0aW9uLkFERAotCQkJCQl8fCB2bnQuZ2V0RXZlbnRUeXBlKCkgPT0gTm90aWZpY2F0aW9uLlNFVCkpIHsKLQotCQkJCVNhZmVVcGRhdGVDb250cm9sbGVyLnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJY3RybC5yZWZyZXNoKCk7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJc3VwZXIuZGlzcG9zZSgpOwotCQljaGlsZFVJUGFyZW50TWFwLmNsZWFyKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm92aWRlcnMvQ2F0ZWdvcnlMYWJlbFByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3ZpZGVycy9DYXRlZ29yeUxhYmVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWM0ZjY3NC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3ZpZGVycy9DYXRlZ29yeUxhYmVsUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvdmlkZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5FeHRlbmRlZEltYWdlUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotCi0vKioKLSAqIExhYmVsIHByb3ZpZGVyIGZvciBDdXN0b20gQ2F0ZWdvcnkgdmlldyBvZiBjb25maWd1cmF0aW9uIHBhZ2UKLSAqIAotICogQGF1dGhvciBKZWZmIEhhcmR5Ci0gKi8KLQotcHVibGljIGNsYXNzIENhdGVnb3J5TGFiZWxQcm92aWRlciBleHRlbmRzIEFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlciB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlCi0JICogQHBhcmFtIGNvbnRlbnRQcm92aWRlcgotCSAqLwotCXB1YmxpYyBDYXRlZ29yeUxhYmVsUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCXByb3RlY3RlZCBJbWFnZSBnZXRJbWFnZUZyb21PYmplY3QoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gRXh0ZW5kZWRJbWFnZVJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0SW1hZ2Uob2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGltcGxlbWVudHMge0BsaW5rIElMYWJlbFByb3ZpZGVyfS5nZXRUZXh0IGJ5IGZvcndhcmRpbmcgaXQgdG8KLQkgKiBhbiBvYmplY3QgdGhhdCBpbXBsZW1lbnRzCi0JICoge0BsaW5rIElJdGVtTGFiZWxQcm92aWRlciNnZXRUZXh0IElJdGVtTGFiZWxQcm92aWRlci5nZXRUZXh0fQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50KSB7Ci0JCQlQcm9jZXNzIHByb2MgPSAoUHJvY2VzcykgKChQcm9jZXNzQ29tcG9uZW50KSBvYmplY3QpCi0JCQkJCS5nZXRQcm9jZXNzKCk7Ci0JCQlpZiAocHJvYyAhPSBudWxsKQotCQkJCXJldHVybiBwcm9jLmdldFByZXNlbnRhdGlvbk5hbWUoKTsKLQkJCWVsc2UKLQkJCQkvLyBpZiBwcm9jZXNzIGlzIG51bGwsIHJldHVybiBwcm9jZXNzY29tcG9uZW50IG5hbWUKLQkJCQlyZXR1cm4gKChQcm9jZXNzQ29tcG9uZW50KSBvYmplY3QpLmdldE5hbWUoKTsKLQkJfSBlbHNlCi0JCQlyZXR1cm4gc3VwZXIuZ2V0VGV4dChvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3ZpZGVycy9Db2x1bW5FbGVtZW50LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3ZpZGVycy9Db2x1bW5FbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4YTk4ZjYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm92aWRlcnMvQ29sdW1uRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm92aWRlcnM7Ci0KLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwotCi0KLS8qKgotICogTW9kZWxzIGEgPGNvbHVtbj4gZWxlbWVudCBpbiB0aGUgIm9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZGVzY3JpcHRpb25QYWdlQ29sdW1uUHJvdmlkZXIiCi0gKiBleHRlbnNpb24gcG9pbnQuCi0gKiAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS41Ci0gKi8KLXB1YmxpYyBjbGFzcyBDb2x1bW5FbGVtZW50IHsKLQotCS8vIHBsdWdpbiBidW5kbGUKLQlCdW5kbGUgYnVuZGxlOwotCQotCS8vIFRoZSBjb2x1bW4gSUQuCi0JcHJpdmF0ZSBTdHJpbmcgaWQ7Ci0JCi0JLy8gVGhlIGNvbHVtbiB3aWR0aC4KLQlwcml2YXRlIGludCB3aWR0aDsKLQkKLQkvLyBUaGUgY29sdW1uIGFsaWdubWVudAotCXByaXZhdGUgU3RyaW5nIGFsaWdubWVudDsKLQotCS8vIFRoZSBjb250cmlidXRvciBjbGFzcyBmb3IgdGhlIGNvbHVtbi4KLQlwcml2YXRlIFN0cmluZyBjb250cmlidXRvckNsYXNzOwotCQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICogCi0JICogQHBhcmFtIGJ1bmRsZQotCSAqIAkJCSAgSW5zdGFsbGVkIEJ1bmRsZQotCSAqIEBwYXJhbSBpZAotCSAqICAgICAgICAgICAgVGhlIGNvbHVtbiBJRC4KLQkgKiBAcGFyYW0gbmFtZQotCSAqICAgICAgICAgICAgVGhlIHdpZHRoIG9mIHRoZSBjb2x1bW4gICAgIAotCSAqIEBwYXJhbSBjb250cmlidXRvckNsYXNzCi0JICogICAgICAgICAgICBUaGUgY29sdW1uIGNvbnRyaWJ1dG9yIGNsYXNzLgotCSAqLwotCXB1YmxpYyBDb2x1bW5FbGVtZW50KEJ1bmRsZSBidW5kbGUsIFN0cmluZyBpZCwgaW50IHdpZHRoLCBTdHJpbmcgYWxpZ25tZW50LCBTdHJpbmcgY29udHJpYnV0b3JDbGFzcykgewotCQl0aGlzLmJ1bmRsZSA9IGJ1bmRsZTsKLQkJdGhpcy5pZCA9IGlkOwotCQl0aGlzLndpZHRoID0gd2lkdGg7Ci0JCXRoaXMuYWxpZ25tZW50ID0gYWxpZ25tZW50OwotCQl0aGlzLmNvbnRyaWJ1dG9yQ2xhc3MgPSBjb250cmlidXRvckNsYXNzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGNvbHVtbiBJRC4KLQkgKiAKLQkgKiBAcmV0dXJuIFRoZSBjb2x1bW4gSUQuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJcmV0dXJuIGlkOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjb2x1bW4gd2lkdGgKLQkgKiAKLQkgKiBAcmV0dXJuIFRoZSBjb2x1bW4gd2lkdGgKLQkgKi8KLQlwdWJsaWMgaW50IGdldFdpZHRoKCkgewotCQlyZXR1cm4gd2lkdGg7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIGNvbHVtbiBhbGlnbm1lbnQKLQkgKiAKLQkgKiBAcmV0dXJuIFRoZSBjb2x1bW4gYWxpZ25tZW50Ci0JICovCi0JcHVibGljIFN0cmluZyBnZXRBbGlnbm1lbnQoKSB7Ci0JCXJldHVybiBhbGlnbm1lbnQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY29sdW1uIGNvbnRyaWJ1dG9yIGNsYXNzLgotCSAqIAotCSAqIEByZXR1cm4gVGhlIGNvbHVtbiBjb250cmlidXRvciBjbGFzcy4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldENvbnRyaWJ1dG9yQ2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJCi0JCUNsYXNzIGNsYXp6ID0gYnVuZGxlLmxvYWRDbGFzcyhjb250cmlidXRvckNsYXNzKTsKLQkJcmV0dXJuIGNsYXp6Lm5ld0luc3RhbmNlKCk7CQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3ZpZGVycy9Db25maWdQYWNrYWdlQ29udGVudFByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3ZpZGVycy9Db25maWdQYWNrYWdlQ29udGVudFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmMzllMGMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm92aWRlcnMvQ29uZmlnUGFja2FnZUNvbnRlbnRQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg1ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm92aWRlcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVZpZXdlck5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudmlld3MuQ29uZmlndXJhdGlvblZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lm5hdmlnYXRvci5Db250ZW50SXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQubmF2aWdhdG9yLk1ldGhvZFBhY2thZ2VzSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQubmF2aWdhdG9yLlBsdWdpblVJUGFja2FnZXNJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5uYXZpZ2F0b3IuUHJvY2Vzc2VzSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnNlcnZpY2VzLlNhZmVVcGRhdGVDb250cm9sbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuTGlicmFyeVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DdXN0b21DYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuQ29udGFpbmVyQ2hlY2tlZFRyZWVWaWV3ZXI7Ci0KLXB1YmxpYyBjbGFzcyBDb25maWdQYWNrYWdlQ29udGVudFByb3ZpZGVyIGV4dGVuZHMgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIgewotCi0JLy8gdGhlcmUgaXMgYSBwcm9ibGVtIGluIHRoZSBwYXNzZWQgaW4gQWRhcHRlckZhY3RvcnkKLQkvLyBpdCBjYW4ndCBmaW5kIHRoZSBjb3JyZWN0IHBhcmVudCBmcm9tIHRoZSBjaGlsZAotCS8vIG5lZWQgdG8gYnVpbGQgYSBtYXAgb2YgY2hpbGQgdG8gaXQncyBwYXJlbnQgaWYgdGhlIGNoaWxkIGlzIGEgVUkKLQkvLyBmb2xkZXIKLQkvLyBjbGVhciB0aGUgbWFwIHdoZW4gdGhlIGlucHV0IGlzIHNldAotCU1hcDxPYmplY3QsIE9iamVjdD4gY2hpbGRVSVBhcmVudE1hcCA9IG5ldyBIYXNoTWFwPE9iamVjdCwgT2JqZWN0PigpOwotCi0JTGlzdDxPYmplY3Q+IHVpRm9sZGVycyA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PigpOwotCi0JcHVibGljIExpc3Q8T2JqZWN0PiBnZXRVSUVsZW1lbnRzKCkgewotCQlyZXR1cm4gdWlGb2xkZXJzOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhbiBpbnN0YW5jZQotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqLwotCXB1YmxpYyBDb25maWdQYWNrYWdlQ29udGVudFByb3ZpZGVyKC8vQ29uZmlndXJhdGlvbkZhY3RvcnkgY29uZmlnRmFjdG9yeSwKLQkJCUFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LyogLCBib29sZWFuIHNob3dNZXRob2RNb2RlbE9ubHkgKi8pIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIjZ2V0Q2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0W10gZ2V0Q2hpbGRyZW4oT2JqZWN0IHBhcmVudEVsZW1lbnQpIHsKLQkJT2JqZWN0W10gaXRlbXMgPSBnZXRWYWxpZEl0ZW1zKHBhcmVudEVsZW1lbnQsIHN1cGVyCi0JCQkJLmdldENoaWxkcmVuKHBhcmVudEVsZW1lbnQpKTsKLQkJcmV0dXJuIGl0ZW1zOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIjZ2V0RWxlbWVudHMoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGlucHV0RWxlbWVudCkgewotCi0JCU9iamVjdFtdIGl0ZW1zID0gZ2V0VmFsaWRJdGVtcyhpbnB1dEVsZW1lbnQsIHN1cGVyCi0JCQkJLmdldEVsZW1lbnRzKGlucHV0RWxlbWVudCkpOwotCQlyZXR1cm4gaXRlbXM7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzVUlGb2xkZXIoT2JqZWN0IGUpIHsKLQkJcmV0dXJuIChlIGluc3RhbmNlb2YgQ29udGVudEl0ZW1Qcm92aWRlcgotCQkJCXx8IGUgaW5zdGFuY2VvZiBQcm9jZXNzZXNJdGVtUHJvdmlkZXIgfHwgZSBpbnN0YW5jZW9mIE1ldGhvZFBhY2thZ2VzSXRlbVByb3ZpZGVyIHx8Ci0JCQkJZSBpbnN0YW5jZW9mIFBsdWdpblVJUGFja2FnZXNJdGVtUHJvdmlkZXIKLQkJKTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldFVJVGFyZ2V0RWxlbWVudChPYmplY3QgZSkgewotCQlpZiAoZSBpbnN0YW5jZW9mIEN1c3RvbUNhdGVnb3J5KSB7Ci0JCQlyZXR1cm4gKChDdXN0b21DYXRlZ29yeSkgZSkuZUNvbnRhaW5lcigpOwotCQl9IGVsc2UgaWYgKGUgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQlyZXR1cm4gZTsKLQkJfSBlbHNlIGlmIChlIGluc3RhbmNlb2YgQ29udGVudEl0ZW1Qcm92aWRlcikgewotCQkJcmV0dXJuICgoQ29udGVudEl0ZW1Qcm92aWRlcikgZSkuZ2V0UGFyZW50KG51bGwpOwotCQl9IGVsc2UgaWYgKGUgaW5zdGFuY2VvZiBQcm9jZXNzZXNJdGVtUHJvdmlkZXIpIHsKLQkJCXJldHVybiAoKFByb2Nlc3Nlc0l0ZW1Qcm92aWRlcikgZSkuZ2V0UGFyZW50KG51bGwpOwotCQl9IGVsc2UgaWYgKGUgaW5zdGFuY2VvZiBJdGVtUHJvdmlkZXJBZGFwdGVyKSB7Ci0JCQlPYmplY3QgdGFyZ2V0ID0gKChJdGVtUHJvdmlkZXJBZGFwdGVyKSBlKS5nZXRUYXJnZXQoKTsKLQkJCWlmICh0YXJnZXQgIT0gbnVsbCAmJiB0YXJnZXQgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQkJcmV0dXJuIHRhcmdldDsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgT2JqZWN0W10gZ2V0VmFsaWRJdGVtcyhPYmplY3QgcGFyZW50LCBPYmplY3RbXSBlbGVtZW50cykgewotCQlpZiAoZWxlbWVudHMgPT0gbnVsbCB8fCBlbGVtZW50cy5sZW5ndGggPT0gMCkgewotCQkJcmV0dXJuIGVsZW1lbnRzOwotCQl9Ci0KLQkJTGlzdDxPYmplY3Q+IHBrZ3MgPSBuZXcgQXJyYXlMaXN0PE9iamVjdD4oKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykgewotCQkJT2JqZWN0IGUgPSBMaWJyYXJ5VXRpbC51bndyYXAoZWxlbWVudHNbaV0pOwotCQkJYm9vbGVhbiB1aUZvbGRlciA9IGlzVUlGb2xkZXIoZSk7Ci0JCQlpZiAodWlGb2xkZXIgfHwgZSBpbnN0YW5jZW9mIE1ldGhvZFBhY2thZ2UKLQkJCQkJfHwgZSBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikgewotCQkJCXBrZ3MuYWRkKGUpOwotCi0JCQkJaWYgKHVpRm9sZGVyKSB7Ci0JCQkJCXVpRm9sZGVycy5hZGQoZSk7Ci0JCQkJfQotCi0JCQkJLy8gaWYgdGhlIHBhcmVudCBpcyBhIFVJIGZvbGRlciwgbWFwIHRoZSBjaGlsZCB0byB0aGUgcGFyZW50Ci0JCQkJLy8gc28gdGhhdCB3ZSBjYW4gZ2V0IHRoZSBwYXJlbnQgbGF0ZXIKLQkJCQkvLyBpZiAoICEocGFyZW50IGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgKQotCQkJCXsKLQkJCQkJY2hpbGRVSVBhcmVudE1hcC5wdXQoZSwgcGFyZW50KTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHBrZ3MudG9BcnJheSgpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIjZ2V0UGFyZW50KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJaWYgKGNoaWxkVUlQYXJlbnRNYXAuY29udGFpbnNLZXkoZWxlbWVudCkpIHsKLQkJCXJldHVybiBjaGlsZFVJUGFyZW50TWFwLmdldChlbGVtZW50KTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBzdXBlci5nZXRQYXJlbnQoZWxlbWVudCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyI2hhc0NoaWxkcmVuKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oT2JqZWN0IGVsZW1lbnQpIHsKLQkJT2JqZWN0W10gY2hpbGRyZW4gPSBnZXRDaGlsZHJlbihlbGVtZW50KTsKLQkJcmV0dXJuIChjaGlsZHJlbiAhPSBudWxsICYmIGNoaWxkcmVuLmxlbmd0aCA+IDApOwotCi0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlciNpbnB1dENoYW5nZWQob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXIsIGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvbGRJbnB1dCwgT2JqZWN0IG5ld0lucHV0KSB7Ci0JCXN1cGVyLmlucHV0Q2hhbmdlZCh2aWV3ZXIsIG9sZElucHV0LCBuZXdJbnB1dCk7Ci0JCWNoaWxkVUlQYXJlbnRNYXAuY2xlYXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyI25vdGlmeUNoYW5nZWQob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0KLQkJaWYgKChub3RpZmljYXRpb24gaW5zdGFuY2VvZiBJVmlld2VyTm90aWZpY2F0aW9uKSkgewotCQkJZmluYWwgSVZpZXdlck5vdGlmaWNhdGlvbiB2bnQgPSAoSVZpZXdlck5vdGlmaWNhdGlvbikgbm90aWZpY2F0aW9uOwotCQkJZmluYWwgT2JqZWN0IGVsZW1lbnQgPSB2bnQuZ2V0RWxlbWVudCgpOwotCQkJZmluYWwgQ29udGFpbmVyQ2hlY2tlZFRyZWVWaWV3ZXIgY3RybCA9ICgoQ29udGFpbmVyQ2hlY2tlZFRyZWVWaWV3ZXIpIHN1cGVyLnZpZXdlcik7Ci0JCQlpZiAoZWxlbWVudCAhPSBudWxsICYmICh2bnQuZ2V0RXZlbnRUeXBlKCkgPT0gTm90aWZpY2F0aW9uLkFERAotCQkJCQkvKnx8IHZudC5nZXRFdmVudFR5cGUoKSA9PSBOb3RpZmljYXRpb24uU0VUKi8pKSB7Ci0KLQkJCQlTYWZlVXBkYXRlQ29udHJvbGxlci5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCWN0cmwuc2V0Q2hlY2tlZChlbGVtZW50LCB0cnVlKTsKLQkJCQkJfQotCQkJCX0pOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlciNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlzdXBlci5kaXNwb3NlKCk7Ci0JCXVpRm9sZGVycy5jbGVhcigpOwotCQljaGlsZFVJUGFyZW50TWFwLmNsZWFyKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3ZpZGVycy9Db25maWdQYWNrYWdlTGFiZWxQcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm92aWRlcnMvQ29uZmlnUGFja2FnZUxhYmVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDEwZGYzMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3ZpZGVycy9Db25maWdQYWNrYWdlTGFiZWxQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIxICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm92aWRlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuRXh0ZW5kZWRJbWFnZVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uY2xvc3VyZS5Db25maWd1cmF0aW9uQ2xvc3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLmNsb3N1cmUuRWxlbWVudERlcGVuZGVuY3lFcnJvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JU2hhcmVkSW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci0KLXB1YmxpYyBjbGFzcyBDb25maWdQYWNrYWdlTGFiZWxQcm92aWRlciBleHRlbmRzIExhYmVsUHJvdmlkZXIgewotCi0JcHJpdmF0ZSBDb25maWd1cmF0aW9uQ2xvc3VyZSBjbG9zdXJlID0gbnVsbDsKLQlwcml2YXRlIENvbmZpZ1BhY2thZ2VDb250ZW50UHJvdmlkZXIgY29udGVudFByb3ZpZGVyOwotCXByaXZhdGUgQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyIGFmUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlCi0JICogQHBhcmFtIGNvbnRlbnRQcm92aWRlcgotCSAqLwotCXB1YmxpYyBDb25maWdQYWNrYWdlTGFiZWxQcm92aWRlcigKLQkJCUNvbmZpZ1BhY2thZ2VDb250ZW50UHJvdmlkZXIgY29udGVudFByb3ZpZGVyKSB7Ci0JCXRoaXMuY29udGVudFByb3ZpZGVyID0gY29udGVudFByb3ZpZGVyOwotCQlhZlByb3ZpZGVyID0gbmV3IEFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcihjb250ZW50UHJvdmlkZXIKLQkJCQkuZ2V0QWRhcHRlckZhY3RvcnkoKSk7Ci0JfQotCi0JcHJpdmF0ZSBFbGVtZW50RGVwZW5kZW5jeUVycm9yIGdldEZpcnN0Q2hpbGRFcnJvcihPYmplY3QgZSkgewotCQlFbGVtZW50RGVwZW5kZW5jeUVycm9yIGVycm9yID0gbnVsbDsKLQkJT2JqZWN0W10gY2hpbGRyZW4gPSBjb250ZW50UHJvdmlkZXIuZ2V0Q2hpbGRyZW4oZSk7Ci0JCWlmIChjaGlsZHJlbiA9PSBudWxsIHx8IGNoaWxkcmVuLmxlbmd0aCA9PSAwKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKLQkJCU9iamVjdCBvYmplY3QgPSBjaGlsZHJlbltpXTsKLQkJCWlmIChvYmplY3QgaW5zdGFuY2VvZiBJdGVtUHJvdmlkZXJBZGFwdGVyKSB7Ci0JCQkJcmV0dXJuIGdldEZpcnN0Q2hpbGRFcnJvcihvYmplY3QpOwotCQkJfSBlbHNlIHsKLQkJCQllcnJvciA9IGNsb3N1cmUuZ2V0RXJyb3Iob2JqZWN0KTsKLQkJCQlpZiAoZXJyb3IgIT0gbnVsbCkgewotCQkJCQlyZXR1cm4gZXJyb3I7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGVycm9yOwotCX0KLQotCS8qKgotCSAqIFRoaXMgaW1wbGVtZW50cyB7QGxpbmsgSUxhYmVsUHJvdmlkZXJ9LmdldEltYWdlIGJ5IGZvcndhcmRpbmcgaXQgdG8KLQkgKiBhbiBvYmplY3QgdGhhdCBpbXBsZW1lbnRzCi0JICoge0BsaW5rIElJdGVtTGFiZWxQcm92aWRlciNnZXRJbWFnZSBJSXRlbUxhYmVsUHJvdmlkZXIuZ2V0SW1hZ2V9Ci0JICovCi0JcHVibGljIEltYWdlIGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGNsb3N1cmUgIT0gbnVsbCkgewotCi0JCQlFbGVtZW50RGVwZW5kZW5jeUVycm9yIGVycm9yID0gbnVsbDsKLQkJCWlmIChvYmplY3QgaW5zdGFuY2VvZiBJdGVtUHJvdmlkZXJBZGFwdGVyKSB7Ci0JCQkJZXJyb3IgPSBnZXRGaXJzdENoaWxkRXJyb3Iob2JqZWN0KTsKLQkJCX0gZWxzZSB7Ci0JCQkJZXJyb3IgPSBjbG9zdXJlLmdldEVycm9yKG9iamVjdCk7Ci0JCQl9Ci0KLQkJCWlmIChlcnJvciAhPSBudWxsKSB7Ci0JCQkJaWYgKGVycm9yLmlzRXJyb3IoKSB8fCBlcnJvci5pc0NoaWxkRXJyb3IoKSkgewotCQkJCQlyZXR1cm4gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRTaGFyZWRJbWFnZXMoKQotCQkJCQkJCS5nZXRJbWFnZShJU2hhcmVkSW1hZ2VzLklNR19PQkpTX0VSUk9SX1RTSyk7IAotCQkJCX0gZWxzZSBpZiAoZXJyb3IuaXNXYXJuaW5nKCkgfHwgZXJyb3IuaXNDaGlsZFdhcm5pbmcoKSkgewotCQkJCQlyZXR1cm4gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRTaGFyZWRJbWFnZXMoKQotCQkJCQkJCS5nZXRJbWFnZShJU2hhcmVkSW1hZ2VzLklNR19PQkpTX1dBUk5fVFNLKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gYWZQcm92aWRlci5nZXRJbWFnZShvYmplY3QpOwotCX0KLQotCXByb3RlY3RlZCBJbWFnZSBnZXRJbWFnZUZyb21PYmplY3QoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gRXh0ZW5kZWRJbWFnZVJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0SW1hZ2Uob2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGltcGxlbWVudHMge0BsaW5rIElMYWJlbFByb3ZpZGVyfS5nZXRUZXh0IGJ5IGZvcndhcmRpbmcgaXQgdG8KLQkgKiBhbiBvYmplY3QgdGhhdCBpbXBsZW1lbnRzCi0JICoge0BsaW5rIElJdGVtTGFiZWxQcm92aWRlciNnZXRUZXh0IElJdGVtTGFiZWxQcm92aWRlci5nZXRUZXh0fQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50KSB7Ci0JCQlQcm9jZXNzIHByb2MgPSAoUHJvY2VzcykgKChQcm9jZXNzQ29tcG9uZW50KSBvYmplY3QpCi0JCQkJCS5nZXRQcm9jZXNzKCk7Ci0JCQlpZiAocHJvYyAhPSBudWxsKQotCQkJCXJldHVybiBwcm9jLmdldFByZXNlbnRhdGlvbk5hbWUoKTsKLQkJCWVsc2UKLQkJCQkvLyBpZiBwcm9jZXNzIGlzIG51bGwsIHJldHVybiBwcm9jZXNzY29tcG9uZW50IG5hbWUKLQkJCQlyZXR1cm4gKChQcm9jZXNzQ29tcG9uZW50KSBvYmplY3QpLmdldE5hbWUoKTsKLQkJfSBlbHNlCi0JCQlyZXR1cm4gYWZQcm92aWRlci5nZXRUZXh0KG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXIjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJc3VwZXIuZGlzcG9zZSgpOwotCi0JCWNvbnRlbnRQcm92aWRlciA9IG51bGw7Ci0JCWFmUHJvdmlkZXIgPSBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldENsb3N1cmUoQ29uZmlndXJhdGlvbkNsb3N1cmUgY2xvc3VyZSkgewotCQl0aGlzLmNsb3N1cmUgPSBjbG9zdXJlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm92aWRlcnMvQ29uZmlndXJhdGlvbkVkaXRvckRlZmF1bHRQYWdlUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvdmlkZXJzL0NvbmZpZ3VyYXRpb25FZGl0b3JEZWZhdWx0UGFnZVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlMzE4MmIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm92aWRlcnMvQ29uZmlndXJhdGlvbkVkaXRvckRlZmF1bHRQYWdlUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm92aWRlcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Db25maWdWaWV3UGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkNvbmZpZ3VyYXRpb25EZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkNvbmZpZ3VyYXRpb25QYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuRm9ybUVkaXRvcjsKLQotcHVibGljIGNsYXNzIENvbmZpZ3VyYXRpb25FZGl0b3JEZWZhdWx0UGFnZVByb3ZpZGVyIGltcGxlbWVudHMKLQkJSU1ldGhvZEVsZW1lbnRFZGl0b3JQYWdlUHJvdmlkZXJFeHRlbnNpb24gewotCi0JcHVibGljIE1hcDxPYmplY3QsIFN0cmluZz4gZ2V0UGFnZXMoTWFwPE9iamVjdCwgU3RyaW5nPiBwYWdlTWFwLAotCQkJRm9ybUVkaXRvciBlZGl0b3IsIE9iamVjdCBpbnB1dCkgewotCQlpZiAoaW5wdXQgaW5zdGFuY2VvZiBNZXRob2RDb25maWd1cmF0aW9uKSB7Ci0JCQlwYWdlTWFwLnB1dChuZXcgQ29uZmlndXJhdGlvbkRlc2NyaXB0aW9uKGVkaXRvciksIG51bGwpOwotCQkJcGFnZU1hcC5wdXQobmV3IENvbmZpZ3VyYXRpb25QYWdlKGVkaXRvciksIG51bGwpOwotCQkJcGFnZU1hcC5wdXQobmV3IENvbmZpZ1ZpZXdQYWdlKGVkaXRvciksIG51bGwpOwotCQl9Ci0JCXJldHVybiBwYWdlTWFwOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm92aWRlcnMvQ29uZmlndXJhdGlvbkxhYmVsUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvdmlkZXJzL0NvbmZpZ3VyYXRpb25MYWJlbFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzMmIwOTAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm92aWRlcnMvQ29uZmlndXJhdGlvbkxhYmVsUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3ZpZGVyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JV3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5maWd1cmVzLkNvbG9yczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLlN0clV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuRmVhdHVyZVZhbHVlV3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlByb2Nlc3NVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5TdXBwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ29sb3JQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubW9kZWwuSVdvcmtiZW5jaEFkYXB0ZXI7Ci0KLS8qKgotICogVGhlIGxhYmVsIHByb3ZpZGVyIGZvciB0aGUgQ29uZmlndXJhdGlvbiB2aWV3IHRyZWUsCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIENvbmZpZ3VyYXRpb25MYWJlbFByb3ZpZGVyIGV4dGVuZHMgVmFyaWFiaWxpdHlFbGVtZW50TGFiZWxQcm92aWRlciBpbXBsZW1lbnRzIElDb2xvclByb3ZpZGVyIHsKLQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IG51bGw7Ci0KLQlwdWJsaWMgQ29uZmlndXJhdGlvbkxhYmVsUHJvdmlkZXIoTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcsCi0JCQlBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JCXRoaXMuY29uZmlnID0gY29uZmlnOwotCX0KLQotCS8qKgotCSAqIFRoaXMgaW1wbGVtZW50cyB7QGxpbmsgSUxhYmVsUHJvdmlkZXJ9LmdldEltYWdlIGJ5IGZvcndhcmRpbmcgaXQgdG8gYW4KLQkgKiBvYmplY3QgdGhhdCBpbXBsZW1lbnRzCi0JICoge0BsaW5rIElJdGVtTGFiZWxQcm92aWRlciNnZXRJbWFnZSBJSXRlbUxhYmVsUHJvdmlkZXIuZ2V0SW1hZ2V9Ci0JICovCi0JcHVibGljIEltYWdlIGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJLy8gYnkgZGVmYXVsdCwgcmV0dXJuIHRoZSBkZWZhdWx0IGltYWdlCi0JCXJldHVybiBzdXBlci5nZXRJbWFnZShvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgaW1wbGVtZW50cyB7QGxpbmsgSUxhYmVsUHJvdmlkZXJ9LmdldFRleHQgYnkgZm9yd2FyZGluZyBpdCB0byBhbgotCSAqIG9iamVjdCB0aGF0IGltcGxlbWVudHMKLQkgKiB7QGxpbmsgSUl0ZW1MYWJlbFByb3ZpZGVyI2dldFRleHQgSUl0ZW1MYWJlbFByb3ZpZGVyLmdldFRleHR9Ci0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIG5hbWUgPSBudWxsOwotCQlPYmplY3QgZWxlbWVudCA9IG51bGw7Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQllbGVtZW50ID0gQ29uZmlndXJhdGlvbkhlbHBlci5nZXRDYWxjdWxhdGVkRWxlbWVudCgKLQkJCQkJKE1ldGhvZEVsZW1lbnQpIG9iamVjdCwgY29uZmlnKTsKLQkJfQotCQllbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBGZWF0dXJlVmFsdWVXcmFwcGVySXRlbVByb3ZpZGVyKSB7Ci0JCQllbGVtZW50ID0gKChGZWF0dXJlVmFsdWVXcmFwcGVySXRlbVByb3ZpZGVyKSBvYmplY3QpCi0JCQkJCS5nZXRWYWx1ZSgpOwotCQl9Ci0JCWlmKG9iamVjdCBpbnN0YW5jZW9mIElXcmFwcGVySXRlbVByb3ZpZGVyKXsKLQkJCWVsZW1lbnQgPSBUbmdVdGlsLnVud3JhcChvYmplY3QpOwotCQl9Ci0JCQotCQlpZihlbGVtZW50ICE9IG51bGwpIHsKLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudCkgewotCQkJCW5hbWUgPSBQcm9jZXNzVXRpbAotCQkJCS5nZXRQcmVzZW50YXRpb25OYW1lKChCcmVha2Rvd25FbGVtZW50KSBlbGVtZW50KTsKLQkJCX0gZWxzZSB7Ci0JCQkJbmFtZSA9IFRuZ1V0aWwuZ2V0UHJlc2VudGF0aW9uTmFtZShlbGVtZW50KTsKLQkJCX0KLQotCQkJLy8gbmFtZSA9IENvbmZpZ3VyYXRpb25IZWxwZXIuZ2V0TmFtZSgoTWV0aG9kRWxlbWVudClvYmplY3QsCi0JCQkvLyBjb25maWcpOwotCQl9Ci0JCQotCQlJV29ya2JlbmNoQWRhcHRlciBhZGFwdGVyID0gKElXb3JrYmVuY2hBZGFwdGVyKSAob2JqZWN0IGluc3RhbmNlb2YgSVdvcmtiZW5jaEFkYXB0ZXIgPwotCQkJCW9iamVjdCA6IChvYmplY3QgaW5zdGFuY2VvZiBJQWRhcHRhYmxlID8gKChJQWRhcHRhYmxlKSBvYmplY3QpLmdldEFkYXB0ZXIoSVdvcmtiZW5jaEFkYXB0ZXIuY2xhc3MpIDogbnVsbCkpOwotCQlpZihhZGFwdGVyICE9IG51bGwpIHsKLQkJCXJldHVybiBhZGFwdGVyLmdldExhYmVsKG9iamVjdCk7Ci0JCX0KLQkJCi0JCWlmIChuYW1lID09IG51bGwpIHsKLQkJCW5hbWUgPSBzdXBlci5nZXRUZXh0KG9iamVjdCk7Ci0JCX0KLQotCQlyZXR1cm4gbmFtZTsKLQl9Ci0JCi0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIjZ2V0Q29sdW1uVGV4dChqYXZhLmxhbmcuT2JqZWN0LCBpbnQpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDb2x1bW5UZXh0KE9iamVjdCBvYmplY3QsIGludCBpbmRleCkgewotCQlyZXR1cm4gZ2V0VGV4dChvYmplY3QpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlciNnZXRDb2x1bW5JbWFnZShqYXZhLmxhbmcuT2JqZWN0LCBpbnQpCi0JICovCi0JcHVibGljIEltYWdlIGdldENvbHVtbkltYWdlKE9iamVjdCBvYmplY3QsIGludCBpbmRleCkgewotCQkvLyBieSBkZWZhdWx0LCByZXR1cm4gdGhlIGRlZmF1bHQgaW1hZ2UKLQkJcmV0dXJuIGdldEltYWdlKG9iamVjdCk7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWNvbmZpZyA9IG51bGw7Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNvbG9yUHJvdmlkZXIjZ2V0Rm9yZWdyb3VuZChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xvciBnZXRGb3JlZ3JvdW5kKE9iamVjdCBlbGVtZW50KSB7Ci0JCWlmIChpc1N1cHByZXNzZWQoZWxlbWVudCkpIHsKLQkJCXJldHVybiBDb2xvcnMuU1VQUkVTU0VEX0VMRU1FTlRfTEFCRUw7Ci0JCX0KLQkJZWxzZSBpZiAoaXNFeHRlcm5hbChlbGVtZW50KSkgewotCQkJcmV0dXJuIENvbG9ycy5JTkhFUklURURfRUxFTUVOVF9MQUJFTDsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNTdXBwcmVzc2VkKE9iamVjdCBlbGVtZW50KSB7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudCkgewotCQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzIHByb2MgPSBUbmdVdGlsLmdldE93bmluZ1Byb2Nlc3MoKEJyZWFrZG93bkVsZW1lbnQpIGVsZW1lbnQpOwotCQkJaWYocHJvYyAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIFN1cHByZXNzaW9uLmdldFN1cHByZXNzaW9uKHByb2MpLmlzU3VwcHJlc3NlZChlbGVtZW50KTsKLQkJCX0KLQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIHsKLQkJCU9iamVjdCB0b3AgPSAoKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKWVsZW1lbnQpLmdldFRvcEl0ZW0oKTsKLQkJCWlmKHRvcCBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzcykgewotCQkJCXJldHVybiBTdXBwcmVzc2lvbi5nZXRTdXBwcmVzc2lvbigoUHJvY2VzcykgdG9wKS5pc1N1cHByZXNzZWQoZWxlbWVudCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ29sb3JQcm92aWRlciNnZXRCYWNrZ3JvdW5kKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbG9yIGdldEJhY2tncm91bmQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJLy8gbGV0IE9TIHRha2UgY29udHJvbCBvdmVyIHRyZWUgd2lkZ2V0IGJhY2tncm91bmQKLQkJLy8gcmF0aGVyIHRoYW4gc2VuZGluZyBvbmUgZml4ZWQgYmFja2dyb3VuZC4KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5WYXJpYWJpbGl0eUVsZW1lbnRMYWJlbFByb3ZpZGVyI2lzRXh0ZXJuYWwoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0V4dGVybmFsKE9iamVjdCBlbGVtZW50KSB7Ci0JCXJldHVybiBQcm9jZXNzVXRpbC5pc0luaGVyaXRlZChlbGVtZW50KSB8fCBQcm9jZXNzVXRpbC5pc0NvbnRyaWJ1dGVkKGVsZW1lbnQpOwotCX0KLQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVmFyaWFiaWxpdHlFbGVtZW50TGFiZWxQcm92aWRlciNnZXRGb250KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIEZvbnQgZ2V0Rm9udChPYmplY3QgZWxlbWVudCkgewotCQlpZiAoUHJvY2Vzc1V0aWwuaXNJbmhlcml0ZWQoZWxlbWVudCkpIHsKLQkJCXJldHVybiBpdGFsaWNGb250OwotCQl9Ci0JCWVsc2UgaWYoUHJvY2Vzc1V0aWwuaXNDb250cmlidXRlZChlbGVtZW50KSkgewotCQkJcmV0dXJuIGJvbGRJdGFsaWNGb250OwotCQl9Ci0JCXJldHVybiByZWd1bGFyRm9udDsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3ZpZGVycy9EZXNjcmlwdGlvblBhZ2VDb2x1bW5Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm92aWRlcnMvRGVzY3JpcHRpb25QYWdlQ29sdW1uUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTU1ODUwMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3ZpZGVycy9EZXNjcmlwdGlvblBhZ2VDb2x1bW5Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvdmlkZXJzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUGx1Z2luOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci0KLS8qKgotICogTWFuYWdlcyB0aGUgPENvbHVtbkVsZW1lbnQ+IGVsZW1lbnRzIGRlZmluZWQgdmlhIHRoZQotICogIm9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZGVzY3JpcHRpb25QYWdlQ29sdW1uUHJvdmlkZXIiIGV4dGVuc2lvbiBwb2ludC4KLSAqIAotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjUKLSAqLwotcHVibGljIGNsYXNzIERlc2NyaXB0aW9uUGFnZUNvbHVtblByb3ZpZGVyIHsKLQotCS8qKgotCSAqIFRoZSBleHRlbnNpb24gbmFtZXNwYWNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTFVNTl9QUk9WSURFUlNfRVhURU5TSU9OX05BTUVTUEFDRSA9ICJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlIGV4dGVuc2lvbiBuYW1lLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTFVNTl9QUk9WSURFUlNfRVhURU5TSU9OX05BTUUgPSAiZGVzY3JpcHRpb25QYWdlQ29sdW1uUHJvdmlkZXIiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgZXh0ZW5zaW9uIEF0dHJpYnV0ZXMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT0xVTU5fUFJPVklERVJfRVhURU5TSU9OX0FUVFJfSUQgPSAiaWQiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT0xVTU5fUFJPVklERVJfRVhURU5TSU9OX0FUVFJfV0lEVEggPSAid2lkdGgiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT0xVTU5fUFJPVklERVJfRVhURU5TSU9OX0FUVFJfQUxJR05NRU5UID0gImFsaWduIjsgLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTFVNTl9QUk9WSURFUl9FWFRFTlNJT05fQVRUUl9DTEFTUyA9ICJjbGFzcyI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ09MVU1OX0RFRkFVTFRfV0lEVEggPSAyMDsgLy8kTk9OLU5MUy0xJAotCi0JLy8gQ29udGFpbnMgdGhlIGVkaXRvciBjb2x1bW4gcHJvdmlkZXJzIGxvYWRlZCB2aWEgdGhlCi0JLy8gIm9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZGVzY3JpcHRpb25QYWdlQ29sdW1uUHJvdmlkZXIiIGV4dGVuc2lvbiBwb2ludC4KLQlwcml2YXRlIEFycmF5TGlzdCBjb2x1bW5Qcm92aWRlcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkvLwkgVGhlIHNoYXJlZCBpbnN0YW5jZS4KLQlwcml2YXRlIHN0YXRpYyBEZXNjcmlwdGlvblBhZ2VDb2x1bW5Qcm92aWRlciBpbnN0YW5jZSA9IG51bGw7Ci0JCi0JcHVibGljIHN0YXRpYyBEZXNjcmlwdGlvblBhZ2VDb2x1bW5Qcm92aWRlciBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKGluc3RhbmNlID09IG51bGwpIHsKLQkJCXN5bmNocm9uaXplZCAoRGVzY3JpcHRpb25QYWdlQ29sdW1uUHJvdmlkZXIuY2xhc3MpIHsKLQkJCQlpZiAoaW5zdGFuY2UgPT0gbnVsbCkgewotCQkJCQlpbnN0YW5jZSA9IG5ldyBEZXNjcmlwdGlvblBhZ2VDb2x1bW5Qcm92aWRlcigpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotCi0JCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwcml2YXRlIERlc2NyaXB0aW9uUGFnZUNvbHVtblByb3ZpZGVyKCkgewotCi0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhbGwgdGhlIGNvbHVtbiBwcm92aWRlcnMKLQkgKiAKLQkgKiBAcmV0dXJuIGFsbCB0aGUgY29sdW1uIHByb3ZpZGVycy4KLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRDb2x1bW5Qcm92aWRlcnMoKSB7Ci0vLwkJTGlzdCBjb2x1bW5zID0gbmV3IEFycmF5TGlzdCgpOwotLy8JCWZvciAoaW50IGkgPSAwOyBpIDwgY29sdW1uUHJvdmlkZXJzLnNpemUoKTsgaSsrKSB7Ci0vLwkJCUNvbHVtbkVsZW1lbnQgZWxlbWVudCA9IChDb2x1bW5FbGVtZW50KSBjb2x1bW5Qcm92aWRlcnMKLS8vCQkJCQkuZ2V0KGkpOwotLy8JCQlPYmplY3QgY29udHJpYnV0b3JDbGFzcyA9IG51bGw7Ci0vLwkJCXRyeSB7Ci0vLwkJCQljb250cmlidXRvckNsYXNzID0gZWxlbWVudC5nZXRDb250cmlidXRvckNsYXNzKCk7Ci0vLwkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0vLwkJCX0KLS8vCQkJY29sdW1ucy5hZGQoY29udHJpYnV0b3JDbGFzcyk7Ci0vLwkJfQotLy8JCXJldHVybiBjb2x1bW5zOwotCQlyZXR1cm4gY29sdW1uUHJvdmlkZXJzOwotCX0KLQkKLQkvKioKLQkgKiBMb2FkcyB0aGUgY29uZmlndXJhdGlvbiBwcm92aWRlcnMgc3BlY2lmaWVkIHZpYSB0aGUKLQkgKiAiZGVzY3JpcHRpb25QYWdlQ29sdW1uUHJvdmlkZXIiIGV4dGVuc2lvbiBwb2ludC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBsb2FkUHJvdmlkZXJzKCkgewotCQlJRXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpOwotCQlJRXh0ZW5zaW9uUG9pbnQgZXh0ZW5zaW9uUG9pbnQgPSBleHRlbnNpb25SZWdpc3RyeS5nZXRFeHRlbnNpb25Qb2ludCgKLQkJCQlDT0xVTU5fUFJPVklERVJTX0VYVEVOU0lPTl9OQU1FU1BBQ0UsCi0JCQkJQ09MVU1OX1BST1ZJREVSU19FWFRFTlNJT05fTkFNRSk7Ci0JCWlmIChleHRlbnNpb25Qb2ludCAhPSBudWxsKSB7Ci0JCQlJRXh0ZW5zaW9uW10gZXh0ZW5zaW9ucyA9IGV4dGVuc2lvblBvaW50LmdldEV4dGVuc2lvbnMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZXh0ZW5zaW9ucy5sZW5ndGg7IGkrKykgewotCQkJCUlFeHRlbnNpb24gZXh0ZW5zaW9uID0gZXh0ZW5zaW9uc1tpXTsKLQkJCQlTdHJpbmcgcGx1Z2luSWQgPSBleHRlbnNpb24uZ2V0TmFtZXNwYWNlSWRlbnRpZmllcigpOwotCQkJCUJ1bmRsZSBidW5kbGUgPSBQbGF0Zm9ybS5nZXRCdW5kbGUocGx1Z2luSWQpOwotCQkJCQotCQkJCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGNvbmZpZ0VsZW1lbnRzID0gZXh0ZW5zaW9uLmdldENvbmZpZ3VyYXRpb25FbGVtZW50cygpOwotCQkJCWZvciAoaW50IGogPSAwOyBqIDwgY29uZmlnRWxlbWVudHMubGVuZ3RoOyBqKyspIHsKLQkJCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNvbmZpZ0VsZW1lbnQgPSBjb25maWdFbGVtZW50c1tqXTsKLQkJCQkJdHJ5IHsKLQkJCQkJCVN0cmluZyBpZCA9IGNvbmZpZ0VsZW1lbnQKLQkJCQkJCQkJLmdldEF0dHJpYnV0ZShDT0xVTU5fUFJPVklERVJfRVhURU5TSU9OX0FUVFJfSUQpOwotCQkJCQkJU3RyaW5nIHdpZHRoU3RyID0gY29uZmlnRWxlbWVudAotCQkJCQkJCQkuZ2V0QXR0cmlidXRlKENPTFVNTl9QUk9WSURFUl9FWFRFTlNJT05fQVRUUl9XSURUSCk7Ci0JCQkJCQlpbnQgd2lkdGggPSBwYXJzZVdpZHRoKHdpZHRoU3RyKTsKLQkJCQkJCVN0cmluZyBhbGlnbm1lbnQgPSBjb25maWdFbGVtZW50LmdldEF0dHJpYnV0ZShDT0xVTU5fUFJPVklERVJfRVhURU5TSU9OX0FUVFJfQUxJR05NRU5UKTsKLQkJCQkJCVN0cmluZyBjb250cmlidXRvckNsYXNzID0gY29uZmlnRWxlbWVudAotCQkJCQkJCQkuZ2V0QXR0cmlidXRlKENPTFVNTl9QUk9WSURFUl9FWFRFTlNJT05fQVRUUl9DTEFTUyk7IAotCQkJCQkJQ29sdW1uRWxlbWVudCBlbGVtZW50ID0gbmV3IENvbHVtbkVsZW1lbnQoYnVuZGxlLAotCQkJCQkJCQlpZCwgd2lkdGgsIGFsaWdubWVudCwgY29udHJpYnV0b3JDbGFzcyk7Ci0JCQkJCQljb2x1bW5Qcm92aWRlcnMuYWRkKGVsZW1lbnQpOwotCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKAotCQkJCQkJCQkiRmFpbGVkIHRvIGxvYWQgRWRpdG9yIGNvbHVtbiBQcm92aWRlciIsIGUpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JCi0JcHJpdmF0ZSBzdGF0aWMgaW50IHBhcnNlV2lkdGgoU3RyaW5nIHN0cikgewotCQl0cnkgewotCQkJcmV0dXJuIEludGVnZXIucGFyc2VJbnQoc3RyKTsKLQkJfQotCQljYXRjaChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJcmV0dXJuIENPTFVNTl9ERUZBVUxUX1dJRFRIOwotCQl9CQkKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3ZpZGVycy9FZGl0b3JQYWdlRWxlbWVudC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm92aWRlcnMvRWRpdG9yUGFnZUVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2JkYTg3ZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3ZpZGVycy9FZGl0b3JQYWdlRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24uICBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm92aWRlcnM7Ci0KLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwotCi0KLS8qKgotICogTW9kZWxzIGEgPGVkaXRvclBhZ2U+IGVsZW1lbnQgaW4gdGhlICJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkVkaXRvclBhZ2VQcm92aWRlciIKLSAqIGV4dGVuc2lvbiBwb2ludC4KLSAqIAotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEVkaXRvclBhZ2VFbGVtZW50IHsKLQotCS8vIHBsdWdpbiBidW5kbGUKLQlCdW5kbGUgYnVuZGxlOwotCQotCS8vIFRoZSBwYWdlIElELgotCXByaXZhdGUgU3RyaW5nIGlkOwotCQotCS8vIFRoZSBwYWdlIG5hbWUuCi0JcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLQotCS8vIFRoZSBjb250cmlidXRvciBjbGFzcyBmb3IgdGhlIHBhZ2UuCi0JcHJpdmF0ZSBTdHJpbmcgY29udHJpYnV0b3JDbGFzczsKLQkKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqIAotCSAqIEBwYXJhbSBidW5kbGUKLQkgKiAJCQkgIEluc3RhbGxlZCBCdW5kbGUKLQkgKiBAcGFyYW0gaWQKLQkgKiAgICAgICAgICAgIFRoZSBwYWdlIElELgotCSAqIEBwYXJhbSBuYW1lCi0JICogICAgICAgICAgICBUaGUgcGFnZSBuYW1lLiAgICAgICAgICAgIAotCSAqIEBwYXJhbSBjb250cmlidXRvckNsYXNzCi0JICogICAgICAgICAgICBUaGUgcGFnZSBjb250cmlidXRvciBjbGFzcy4KLQkgKi8KLQlwdWJsaWMgRWRpdG9yUGFnZUVsZW1lbnQoQnVuZGxlIGJ1bmRsZSwgU3RyaW5nIGlkLCBTdHJpbmcgbmFtZSwgU3RyaW5nIGNvbnRyaWJ1dG9yQ2xhc3MpIHsKLQkJdGhpcy5idW5kbGUgPSBidW5kbGU7Ci0JCXRoaXMuaWQgPSBpZDsKLQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJdGhpcy5jb250cmlidXRvckNsYXNzID0gY29udHJpYnV0b3JDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwYWdlIElELgotCSAqIAotCSAqIEByZXR1cm4gVGhlIHBhZ2UgSUQuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJcmV0dXJuIGlkOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwYWdlIG5hbWUuCi0JICogCi0JICogQHJldHVybiBUaGUgcGFnZSBuYW1lLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcGFnZSBjb250cmlidXRvciBjbGFzcy4KLQkgKiAKLQkgKiBAcmV0dXJuIFRoZSBwYWdlIGNvbnRyaWJ1dG9yIGNsYXNzLgotCSAqLwotCXB1YmxpYyBJTWV0aG9kRWxlbWVudEVkaXRvclBhZ2VQcm92aWRlckV4dGVuc2lvbiBnZXRDb250cmlidXRvckNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCQotCQlDbGFzcyBjbGF6eiA9IGJ1bmRsZS5sb2FkQ2xhc3MoY29udHJpYnV0b3JDbGFzcyk7Ci0JCXJldHVybiAoSU1ldGhvZEVsZW1lbnRFZGl0b3JQYWdlUHJvdmlkZXJFeHRlbnNpb24pY2xhenoubmV3SW5zdGFuY2UoKTsJCi0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm92aWRlcnMvRXhwb3NlZEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3ZpZGVycy9FeHBvc2VkQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmMwMTY0Ny4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3ZpZGVycy9FeHBvc2VkQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvdmlkZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51aS52aWV3ZXIuSVZpZXdlclByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBFeHBvc2VkQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIgZXh0ZW5kcwotCQlBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlciBpbXBsZW1lbnRzIElWaWV3ZXJQcm92aWRlciB7Ci0KLQkvKioKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgRXhwb3NlZEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQlwdWJsaWMgVmlld2VyIGdldFZpZXdlcigpIHsKLQkJcmV0dXJuIHZpZXdlcjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvdmlkZXJzL0hpZGVVbmNoZWNrZWRWaWV3ZXJGaWx0ZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvdmlkZXJzL0hpZGVVbmNoZWNrZWRWaWV3ZXJGaWx0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzI4MWYzMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3ZpZGVycy9IaWRlVW5jaGVja2VkVmlld2VyRmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3ZpZGVyczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlckZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLkNvbnRhaW5lckNoZWNrZWRUcmVlVmlld2VyOwotCi0vKioKLSAqIEZpbHRlciBmb3Igdmlld2VycyBvZiBjb25maWd1cmF0aW9uIHBhZ2UuCi0gKiBJZiBoaWRlVW5jaGVja2VkIGlzIHNldCwgaXQgd2lsbCBmaWx0ZXIgdW5jaGVja2VkIGVsZW1lbnRzCi0gKiAKLSAqIEBhdXRob3IgSmVmZiBIYXJkeQotICovCi1wdWJsaWMgY2xhc3MgSGlkZVVuY2hlY2tlZFZpZXdlckZpbHRlciBleHRlbmRzIFZpZXdlckZpbHRlciB7Ci0JCi0JcHJpdmF0ZSBDb250YWluZXJDaGVja2VkVHJlZVZpZXdlciB2aWV3ZXI7Ci0JCi0JcHJpdmF0ZSBib29sZWFuIGhpZGVVbmNoZWNrZWQgPSBmYWxzZTsKLQkKLQlwdWJsaWMgSGlkZVVuY2hlY2tlZFZpZXdlckZpbHRlcihDb250YWluZXJDaGVja2VkVHJlZVZpZXdlciB2aWV3ZXIpIHsKLQkJdGhpcy52aWV3ZXIgPSB2aWV3ZXI7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gc2VsZWN0KFZpZXdlciB2aWV3ZXIsIE9iamVjdCBwYXJlbnRFbGVtZW50LCBPYmplY3QgZWxlbWVudCkgewotCQlpZiAoaGlkZVVuY2hlY2tlZCAmJiAhaXNDaGVja2VkKGVsZW1lbnQpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0hpZGVVbmNoZWNrZWQoKSB7Ci0JCXJldHVybiBoaWRlVW5jaGVja2VkOwotCX0KLQotCXB1YmxpYyB2b2lkIHRvZ2dsZUhpZGVVbmNoZWNrZWQoKSB7Ci0JCWhpZGVVbmNoZWNrZWQgPSAhaGlkZVVuY2hlY2tlZDsKLQl9Ci0JCi0JcHJpdmF0ZSBib29sZWFuIGlzQ2hlY2tlZChPYmplY3QgZWxlbWVudCkgewotCQlMaXN0PE9iamVjdD4gY2hlY2tlZEl0ZW1zID0gQXJyYXlzLmFzTGlzdCh2aWV3ZXIuZ2V0Q2hlY2tlZEVsZW1lbnRzKCkpOwotCQlyZXR1cm4gY2hlY2tlZEl0ZW1zLmNvbnRhaW5zKGVsZW1lbnQpOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvdmlkZXJzL0lDb250ZW50UHJvdmlkZXJGYWN0b3J5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3ZpZGVycy9JQ29udGVudFByb3ZpZGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYmI0N2EzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvdmlkZXJzL0lDb250ZW50UHJvdmlkZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3ZpZGVyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklWaWV3UGFydDsKLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuNQotICoKLSAqLwotcHVibGljIGludGVyZmFjZSBJQ29udGVudFByb3ZpZGVyRmFjdG9yeSB7Ci0JSUNvbnRlbnRQcm92aWRlciBjcmVhdGVQcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwgSVZpZXdQYXJ0IHZpZXcpOwotCUlGaWx0ZXIgY3JlYXRlRmlsdGVyKE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnLCBWaWV3ZXIgdmlld2VyKTsKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvdmlkZXJzL0lNZXRob2RFbGVtZW50RWRpdG9yUGFnZVByb3ZpZGVyRXh0ZW5zaW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3ZpZGVycy9JTWV0aG9kRWxlbWVudEVkaXRvclBhZ2VQcm92aWRlckV4dGVuc2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNmI0OWYzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvdmlkZXJzL0lNZXRob2RFbGVtZW50RWRpdG9yUGFnZVByb3ZpZGVyRXh0ZW5zaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3ZpZGVyczsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuRm9ybUVkaXRvcjsKLQotLyoqCi0gKiBJbnRlcmZhY2UgdG8gYmUgdXNlZCBmb3IgYWxsIHBhZ2VzIGFkZGVkIHRocm91Z2ggZXh0ZW5zaW9uIHBvaW50cwotICogCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQGF1dGhvciBKZWZmIEhhcmR5Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSU1ldGhvZEVsZW1lbnRFZGl0b3JQYWdlUHJvdmlkZXJFeHRlbnNpb24gewotCi0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbWFwIG9mIHBhZ2VzIHRvIG5hbWVzLgotCSAqIFBhZ2VzIHNob3VsZCBiZSBDb250cm9sLCBJRm9ybVBhZ2UsIG9yIElFZGl0b3JQYXJ0Ci0JICogTmFtZXMgYXJlIHRoZSBwYXJ0TmFtZSAoZm9yIHRoZSBJRWRpdG9yUGFydCBvciBDb250cm9sIC0tIElGb3JtUGFnZXMgZG8gbm90IG5lZWQgdG8gcHJvdmlkZSBhIG5hbWUgaW4gdGhlIG1hcCkuCi0JICogCi0JICogQHBhcmFtIHBhZ2VNYXAgbWFwIG9mIHBhZ2VzIHRvIG5hbWVzCi0JICogQHBhcmFtIGVkaXRvciBlZGl0b3IgdGhhdCBwYWdlcyBhcmUgYWRkZWQgdG8KLQkgKiBAcGFyYW0gaW5wdXQgb2JqZWN0IGJlaW5nIGVkaXRlZAotCSAqIEByZXR1cm4gYSBtYXAKLQkgKiAgCi0JICovCi0JcHVibGljIE1hcDxPYmplY3QsU3RyaW5nPiBnZXRQYWdlcyhNYXA8T2JqZWN0LFN0cmluZz4gcGFnZU1hcCwgRm9ybUVkaXRvciBlZGl0b3IsIE9iamVjdCBpbnB1dCk7Ci0KLQkKLQkKLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm92aWRlcnMvTWV0aG9kRWxlbWVudEVkaXRvckRlZmF1bHRQYWdlUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvdmlkZXJzL01ldGhvZEVsZW1lbnRFZGl0b3JEZWZhdWx0UGFnZVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0OTRhNTQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm92aWRlcnMvTWV0aG9kRWxlbWVudEVkaXRvckRlZmF1bHRQYWdlUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzOSArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvdmlkZXJzOwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQ2hlY2tsaXN0SXRlbXNQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQ29udGVudEVsZW1lbnRHdWlkYW5jZVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Db250ZW50UGFja2FnZURlc2NyaXB0aW9uUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkN1c3RvbUNhdGVnb3J5QXNzaWduUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkN1c3RvbUNhdGVnb3J5RGVzY3JpcHRpb25QYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGlzY2lwbGluZURlc2NyaXB0aW9uUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRpc2NpcGxpbmVHcm91cGluZ0Rlc2NyaXB0aW9uUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRpc2NpcGxpbmVHcm91cGluZ0Rpc2NpcGxpbmVzUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRpc2NpcGxpbmVSZWZlcmVuY2VXb3JrZmxvd1BhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EaXNjaXBsaW5lVGFza3NQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRG9tYWluRGVzY3JpcHRpb25QYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRG9tYWluV29ya1Byb2R1Y3RzUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkd1aWRhbmNlRGVzY3JpcHRpb25QYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuR3VpZGFuY2VXaXRoQXR0YWNobWVudHNEZXNjcmlwdGlvblBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5NZXRob2RMaWJyYXJ5RGVzY3JpcHRpb25Gb3JtUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLk1ldGhvZFBsdWdpbkRlc2NyaXB0aW9uUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLlByYWN0aWNlRGVzY3JpcHRpb25QYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuUHJhY3RpY2VSZWZlcmVuY2VzUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLlJvbGVDYXRlZ29yaWVzUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLlJvbGVEZXNjcmlwdGlvblBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Sb2xlU2V0RGVzY3JpcHRpb25QYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuUm9sZVNldEdyb3VwaW5nRGVzY3JpcHRpb25QYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuUm9sZVNldEdyb3VwaW5nUm9sZVNldHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Sb2xlU2V0Um9sZXNQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuUm9sZVdvcmtQcm9kdWN0c1BhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5UYXNrQ2F0ZWdvcmllc1BhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5UYXNrRGVzY3JpcHRpb25QYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuVGFza1JvbGVzUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLlRhc2tTdGVwc1BhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5UYXNrV29ya1Byb2R1Y3RzUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLlRvb2xEZXNjcmlwdGlvblBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Ub29sVG9vbE1lbnRvcnNQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuV29ya1Byb2R1Y3RDYXRlZ29yaWVzUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLldvcmtQcm9kdWN0RGVsaXZlcmFibGVQYXJ0c1BhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Xb3JrUHJvZHVjdERlc2NyaXB0aW9uUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLldvcmtQcm9kdWN0VHlwZURlc2NyaXB0aW9uUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLldvcmtQcm9kdWN0VHlwZVdvcmtQcm9kdWN0c1BhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DaGVja2xpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkN1c3RvbUNhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaXNjaXBsaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGlzY2lwbGluZUdyb3VwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3VpZGFuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJhY3RpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVTZXRHcm91cGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Ub29sOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuZWRpdG9yLkZvcm1FZGl0b3I7Ci0KLXB1YmxpYyBjbGFzcyBNZXRob2RFbGVtZW50RWRpdG9yRGVmYXVsdFBhZ2VQcm92aWRlciBpbXBsZW1lbnRzCi0JCUlNZXRob2RFbGVtZW50RWRpdG9yUGFnZVByb3ZpZGVyRXh0ZW5zaW9uIHsKLQotCXB1YmxpYyBNYXA8T2JqZWN0LCBTdHJpbmc+IGdldFBhZ2VzKE1hcDxPYmplY3QsU3RyaW5nPiBwYWdlTWFwLCBGb3JtRWRpdG9yIGVkaXRvciwgT2JqZWN0IGlucHV0KSB7Ci0JCWlmIChpbnB1dCBpbnN0YW5jZW9mIE1ldGhvZExpYnJhcnkpIHsKLQkJCXBhZ2VNYXAucHV0KG5ldyBNZXRob2RMaWJyYXJ5RGVzY3JpcHRpb25Gb3JtUGFnZShlZGl0b3IpLCBudWxsKTsKLQkJfSBlbHNlIGlmIChpbnB1dCBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikgewotCQkJcGFnZU1hcC5wdXQobmV3IE1ldGhvZFBsdWdpbkRlc2NyaXB0aW9uUGFnZShlZGl0b3IpLCBudWxsKTsKLQkJfSBlbHNlIGlmIChpbnB1dCBpbnN0YW5jZW9mIENvbnRlbnRQYWNrYWdlKSB7Ci0JCQlwYWdlTWFwLnB1dChuZXcgQ29udGVudFBhY2thZ2VEZXNjcmlwdGlvblBhZ2UoZWRpdG9yKSwgbnVsbCk7Ci0JCX0gZWxzZSBpZiAoaW5wdXQgaW5zdGFuY2VvZiBSb2xlKSB7Ci0JCQlwYWdlTWFwLnB1dChuZXcgUm9sZURlc2NyaXB0aW9uUGFnZShlZGl0b3IpLCBudWxsKTsKLQkJCXBhZ2VNYXAucHV0KG5ldyBSb2xlV29ya1Byb2R1Y3RzUGFnZShlZGl0b3IpLCBudWxsKTsKLQkJCXBhZ2VNYXAucHV0KG5ldyBDb250ZW50RWxlbWVudEd1aWRhbmNlUGFnZShlZGl0b3IpLCBudWxsKTsKLQkJCXBhZ2VNYXAucHV0KG5ldyBSb2xlQ2F0ZWdvcmllc1BhZ2UoZWRpdG9yKSwgbnVsbCk7Ci0JCX0gZWxzZSBpZiAoaW5wdXQgaW5zdGFuY2VvZiBUYXNrKSB7Ci0JCQlwYWdlTWFwLnB1dChuZXcgVGFza0Rlc2NyaXB0aW9uUGFnZShlZGl0b3IpLCBudWxsKTsKLQkJCXBhZ2VNYXAucHV0KG5ldyBUYXNrU3RlcHNQYWdlKGVkaXRvciksIG51bGwpOwotCQkJcGFnZU1hcC5wdXQobmV3IFRhc2tSb2xlc1BhZ2UoZWRpdG9yKSwgbnVsbCk7Ci0JCQlwYWdlTWFwLnB1dChuZXcgVGFza1dvcmtQcm9kdWN0c1BhZ2UoZWRpdG9yKSwgbnVsbCk7Ci0JCQlwYWdlTWFwLnB1dChuZXcgQ29udGVudEVsZW1lbnRHdWlkYW5jZVBhZ2UoZWRpdG9yKSwgbnVsbCk7Ci0JCQlwYWdlTWFwLnB1dChuZXcgVGFza0NhdGVnb3JpZXNQYWdlKGVkaXRvciksIG51bGwpOwotCQl9IGVsc2UgaWYgKGlucHV0IGluc3RhbmNlb2YgV29ya1Byb2R1Y3QpIHsKLQkJCXBhZ2VNYXAucHV0KG5ldyBXb3JrUHJvZHVjdERlc2NyaXB0aW9uUGFnZShlZGl0b3IpLCBudWxsKTsKLQkJCWlmIChpbnB1dCBpbnN0YW5jZW9mIERlbGl2ZXJhYmxlKSB7Ci0JCQkJcGFnZU1hcC5wdXQobmV3IFdvcmtQcm9kdWN0RGVsaXZlcmFibGVQYXJ0c1BhZ2UoZWRpdG9yKSwgbnVsbCk7Ci0JCQl9Ci0JCQlwYWdlTWFwLnB1dChuZXcgQ29udGVudEVsZW1lbnRHdWlkYW5jZVBhZ2UoZWRpdG9yKSwgbnVsbCk7Ci0JCQlwYWdlTWFwLnB1dChuZXcgV29ya1Byb2R1Y3RDYXRlZ29yaWVzUGFnZShlZGl0b3IpLCBudWxsKTsKLQkJfSBlbHNlIGlmIChpbnB1dCBpbnN0YW5jZW9mIEd1aWRhbmNlKSB7Ci0JCQlpZiAoVG5nVXRpbC5pc0FsbG93ZWRBdHRhY2htZW50cygoR3VpZGFuY2UpaW5wdXQpKSB7Ci0JCQkJcGFnZU1hcC5wdXQobmV3IEd1aWRhbmNlV2l0aEF0dGFjaG1lbnRzRGVzY3JpcHRpb25QYWdlKGVkaXRvciksIG51bGwpOwotCQkJfSBlbHNlIGlmIChpbnB1dCBpbnN0YW5jZW9mIFByYWN0aWNlKSB7Ci0JCQkJcGFnZU1hcC5wdXQobmV3IFByYWN0aWNlRGVzY3JpcHRpb25QYWdlKGVkaXRvciksIG51bGwpOwotCQkJCXBhZ2VNYXAucHV0KG5ldyBQcmFjdGljZVJlZmVyZW5jZXNQYWdlKGVkaXRvciksIG51bGwpOwotCQkJfSBlbHNlIGlmIChpbnB1dCBpbnN0YW5jZW9mIENoZWNrbGlzdCkgewotCQkJCXBhZ2VNYXAucHV0KG5ldyBHdWlkYW5jZURlc2NyaXB0aW9uUGFnZShlZGl0b3IpLCBudWxsKTsKLQkJCQlwYWdlTWFwLnB1dChuZXcgQ2hlY2tsaXN0SXRlbXNQYWdlKGVkaXRvciksIG51bGwpOwotCQkJfSBlbHNlIHsKLQkJCQlwYWdlTWFwLnB1dChuZXcgR3VpZGFuY2VEZXNjcmlwdGlvblBhZ2UoZWRpdG9yKSwgbnVsbCk7Ci0JCQl9Ci0JCQlpZiAoIShpbnB1dCBpbnN0YW5jZW9mIFByYWN0aWNlKSkKLQkJCQlwYWdlTWFwLnB1dChuZXcgQ29udGVudEVsZW1lbnRHdWlkYW5jZVBhZ2UoZWRpdG9yKSwgbnVsbCk7Ci0JCX0gZWxzZSBpZiAoaW5wdXQgaW5zdGFuY2VvZiBEaXNjaXBsaW5lKSB7Ci0JCQlwYWdlTWFwLnB1dChuZXcgRGlzY2lwbGluZURlc2NyaXB0aW9uUGFnZShlZGl0b3IpLCBudWxsKTsKLQkJCXBhZ2VNYXAucHV0KG5ldyBEaXNjaXBsaW5lVGFza3NQYWdlKGVkaXRvciksIG51bGwpOwotCQkJcGFnZU1hcC5wdXQobmV3IERpc2NpcGxpbmVSZWZlcmVuY2VXb3JrZmxvd1BhZ2UoZWRpdG9yKSwgbnVsbCk7Ci0JCQlwYWdlTWFwLnB1dChuZXcgQ29udGVudEVsZW1lbnRHdWlkYW5jZVBhZ2UoZWRpdG9yKSwgbnVsbCk7Ci0JCX0gZWxzZSBpZiAoaW5wdXQgaW5zdGFuY2VvZiBEaXNjaXBsaW5lR3JvdXBpbmcpIHsKLQkJCXBhZ2VNYXAucHV0KG5ldyBEaXNjaXBsaW5lR3JvdXBpbmdEZXNjcmlwdGlvblBhZ2UoZWRpdG9yKSwgbnVsbCk7Ci0JCQlwYWdlTWFwLnB1dChuZXcgRGlzY2lwbGluZUdyb3VwaW5nRGlzY2lwbGluZXNQYWdlKGVkaXRvciksIG51bGwpOwotCQl9IGVsc2UgaWYgKGlucHV0IGluc3RhbmNlb2YgRG9tYWluKSB7Ci0JCQlwYWdlTWFwLnB1dChuZXcgRG9tYWluRGVzY3JpcHRpb25QYWdlKGVkaXRvciksIG51bGwpOwotCQkJcGFnZU1hcC5wdXQobmV3IERvbWFpbldvcmtQcm9kdWN0c1BhZ2UoZWRpdG9yKSwgbnVsbCk7Ci0JCQlwYWdlTWFwLnB1dChuZXcgQ29udGVudEVsZW1lbnRHdWlkYW5jZVBhZ2UoZWRpdG9yKSwgbnVsbCk7Ci0JCX0gZWxzZSBpZiAoaW5wdXQgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdFR5cGUpIHsKLQkJCXBhZ2VNYXAucHV0KG5ldyBXb3JrUHJvZHVjdFR5cGVEZXNjcmlwdGlvblBhZ2UoZWRpdG9yKSwgbnVsbCk7Ci0JCQlwYWdlTWFwLnB1dChuZXcgV29ya1Byb2R1Y3RUeXBlV29ya1Byb2R1Y3RzUGFnZShlZGl0b3IpLCBudWxsKTsKLQkJCXBhZ2VNYXAucHV0KG5ldyBDb250ZW50RWxlbWVudEd1aWRhbmNlUGFnZShlZGl0b3IpLCBudWxsKTsKLQkJfSBlbHNlIGlmIChpbnB1dCBpbnN0YW5jZW9mIFJvbGVTZXQpIHsKLQkJCXBhZ2VNYXAucHV0KG5ldyBSb2xlU2V0RGVzY3JpcHRpb25QYWdlKGVkaXRvciksIG51bGwpOwotCQkJcGFnZU1hcC5wdXQobmV3IFJvbGVTZXRSb2xlc1BhZ2UoZWRpdG9yKSwgbnVsbCk7Ci0JCQlwYWdlTWFwLnB1dChuZXcgQ29udGVudEVsZW1lbnRHdWlkYW5jZVBhZ2UoZWRpdG9yKSwgbnVsbCk7Ci0JCX0gZWxzZSBpZiAoaW5wdXQgaW5zdGFuY2VvZiBSb2xlU2V0R3JvdXBpbmcpIHsKLQkJCXBhZ2VNYXAucHV0KG5ldyBSb2xlU2V0R3JvdXBpbmdEZXNjcmlwdGlvblBhZ2UoZWRpdG9yKSwgbnVsbCk7Ci0JCQlwYWdlTWFwLnB1dChuZXcgUm9sZVNldEdyb3VwaW5nUm9sZVNldHMoZWRpdG9yKSwgbnVsbCk7Ci0JCX0gZWxzZSBpZiAoaW5wdXQgaW5zdGFuY2VvZiBUb29sKSB7Ci0JCQlwYWdlTWFwLnB1dChuZXcgVG9vbERlc2NyaXB0aW9uUGFnZShlZGl0b3IpLCBudWxsKTsKLQkJCXBhZ2VNYXAucHV0KG5ldyBUb29sVG9vbE1lbnRvcnNQYWdlKGVkaXRvciksIG51bGwpOwotCQkJcGFnZU1hcC5wdXQobmV3IENvbnRlbnRFbGVtZW50R3VpZGFuY2VQYWdlKGVkaXRvciksIG51bGwpOwotCQl9IGVsc2UgaWYgKGlucHV0IGluc3RhbmNlb2YgQ3VzdG9tQ2F0ZWdvcnkpIHsKLQkJCXBhZ2VNYXAucHV0KG5ldyBDdXN0b21DYXRlZ29yeURlc2NyaXB0aW9uUGFnZShlZGl0b3IpLCBudWxsKTsKLQkJCXBhZ2VNYXAucHV0KG5ldyBDdXN0b21DYXRlZ29yeUFzc2lnblBhZ2UoZWRpdG9yKSwgbnVsbCk7Ci0JCX0KLQkJcmV0dXJuIHBhZ2VNYXA7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm92aWRlcnMvTWV0aG9kRWxlbWVudExhYmVsRGVjb3JhdG9yLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3ZpZGVycy9NZXRob2RFbGVtZW50TGFiZWxEZWNvcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDQ4YjZlNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3ZpZGVycy9NZXRob2RFbGVtZW50TGFiZWxEZWNvcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3ZpZGVyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UudXRpbC5QZXJzaXN0ZW5jZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsRGVjb3JhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXJMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSURlY29yYXRvck1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLQotLyoqCi0gKiBMYWJlbCBkZWNvcmF0b3IgZm9yIG1ldGhvZCBlbGVtZW50Ci0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTWV0aG9kRWxlbWVudExhYmVsRGVjb3JhdG9yIGltcGxlbWVudHMgSUxhYmVsRGVjb3JhdG9yIHsKLQlwcml2YXRlIHN0YXRpYyBJTGFiZWxEZWNvcmF0b3IgZGVsZWdhdGVEZWNvcmF0b3I7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgSUxhYmVsRGVjb3JhdG9yIGdldERlbGVnYXRlRGVjb3JhdG9yKCkgewotCQlpZiAoZGVsZWdhdGVEZWNvcmF0b3IgPT0gbnVsbCkgewotCQkJZGVsZWdhdGVEZWNvcmF0b3IgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldERlY29yYXRvck1hbmFnZXIoKS5nZXRMYWJlbERlY29yYXRvcigpOwotCQl9Ci0JCXJldHVybiBkZWxlZ2F0ZURlY29yYXRvcjsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgSVJlc291cmNlIGdldFdvcmtzcGFjZVJlc291cmNlKE9iamVjdCBlbGVtZW50KSB7Ci0JCWVsZW1lbnQgPSBUbmdVdGlsLnVud3JhcChlbGVtZW50KTsKLQkJLy8gZG9uJ3QgZGVjb3JhdGUgaWNvbiBvZiBwcmVkZWZpbmVkIGVsZW1lbnRzIGluIGxpYnJhcnkgdmlldyBiL2Mgc29tZSBvZiB0aGVtIGFyZSBzaG93biBhcyBVSSBmb2xkZXIKLQkJLy8KLQkJaWYoZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQgJiYgVG5nVXRpbC5pc1ByZWRlZmluZWQoKE1ldGhvZEVsZW1lbnQpIGVsZW1lbnQpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gUGVyc2lzdGVuY2VVdGlsLmdldFdvcmtzcGFjZVJlc291cmNlKGVsZW1lbnQpOwotCX0KLQkKLQlwdWJsaWMgTWV0aG9kRWxlbWVudExhYmVsRGVjb3JhdG9yKCkgewotCQkKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsRGVjb3JhdG9yI2RlY29yYXRlSW1hZ2Uob3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlLCBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBJbWFnZSBkZWNvcmF0ZUltYWdlKEltYWdlIGltYWdlLCBPYmplY3QgZWxlbWVudCkgewkJCi0JCUlSZXNvdXJjZSB3c1JlcyA9IGdldFdvcmtzcGFjZVJlc291cmNlKGVsZW1lbnQpOwotCQlpZih3c1JlcyAhPSBudWxsKSB7Ci0JCQlpbWFnZSA9IGdldERlbGVnYXRlRGVjb3JhdG9yKCkuZGVjb3JhdGVJbWFnZShpbWFnZSwgd3NSZXMpOwotCQl9Ci0JCXJldHVybiBnZXREZWxlZ2F0ZURlY29yYXRvcigpLmRlY29yYXRlSW1hZ2UoaW1hZ2UsIGVsZW1lbnQpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxEZWNvcmF0b3IjZGVjb3JhdGVUZXh0KGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIFN0cmluZyBkZWNvcmF0ZVRleHQoU3RyaW5nIHRleHQsIE9iamVjdCBlbGVtZW50KSB7Ci0JCXJldHVybiB0ZXh0OwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQmFzZUxhYmVsUHJvdmlkZXIjYWRkTGlzdGVuZXIob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlckxpc3RlbmVyKQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKElMYWJlbFByb3ZpZGVyTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJZ2V0RGVsZWdhdGVEZWNvcmF0b3IoKS5hZGRMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklCYXNlTGFiZWxQcm92aWRlciNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQmFzZUxhYmVsUHJvdmlkZXIjaXNMYWJlbFByb3BlcnR5KGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNMYWJlbFByb3BlcnR5KE9iamVjdCBlbGVtZW50LCBTdHJpbmcgcHJvcGVydHkpIHsKLQkJSVJlc291cmNlIHdzUmVzID0gZ2V0V29ya3NwYWNlUmVzb3VyY2UoZWxlbWVudCk7Ci0JCWlmKHdzUmVzICE9IG51bGwpIHsKLQkJCXJldHVybiBnZXREZWxlZ2F0ZURlY29yYXRvcigpLmlzTGFiZWxQcm9wZXJ0eSh3c1JlcywgcHJvcGVydHkpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUJhc2VMYWJlbFByb3ZpZGVyI3JlbW92ZUxpc3RlbmVyKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXJMaXN0ZW5lcikKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVMaXN0ZW5lcihJTGFiZWxQcm92aWRlckxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWdldERlbGVnYXRlRGVjb3JhdG9yKCkucmVtb3ZlTGlzdGVuZXIobGlzdGVuZXIpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBjbGVhckRlY29yYXRpb25DYWNoZSgpIHsKLQkJSURlY29yYXRvck1hbmFnZXIgZGVjb3JhdG9yTWFuYWdlciA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0RGVjb3JhdG9yTWFuYWdlcigpOwotCQlkZWNvcmF0b3JNYW5hZ2VyLnVwZGF0ZSgib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm92aWRlcnMuTWV0aG9kRWxlbWVudExpZ2h0d2VpZ2h0TGFiZWxEZWNvcmF0b3IiKTsgLy8kTk9OLU5MUy0xJAotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvdmlkZXJzL01ldGhvZEVsZW1lbnRMaWdodHdlaWdodExhYmVsRGVjb3JhdG9yLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3ZpZGVycy9NZXRob2RFbGVtZW50TGlnaHR3ZWlnaHRMYWJlbERlY29yYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDE5NzRhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvdmlkZXJzL01ldGhvZEVsZW1lbnRMaWdodHdlaWdodExhYmVsRGVjb3JhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3ZpZGVyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS51dGlsLkxpYnJhcnlWYWxpZGF0aW9uTWFya2VySGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudXRpbC5NZXRob2RSaWNoVGV4dE1hcmtlckhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JRGVjb3JhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGlnaHR3ZWlnaHRMYWJlbERlY29yYXRvcjsKLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlICAxLjEKLSAqLwotcHVibGljIGNsYXNzIE1ldGhvZEVsZW1lbnRMaWdodHdlaWdodExhYmVsRGVjb3JhdG9yIGltcGxlbWVudHMKLQkJSUxpZ2h0d2VpZ2h0TGFiZWxEZWNvcmF0b3IgewotCXByaXZhdGUgc3RhdGljIEltYWdlRGVzY3JpcHRvciBvdmVybGF5ID0gbnVsbDsKLQkKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFQ09SQVRPUl9JRCA9ICJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3ZpZGVycy5NZXRob2RFbGVtZW50TGlnaHR3ZWlnaHRMYWJlbERlY29yYXRvciI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxpZ2h0d2VpZ2h0TGFiZWxEZWNvcmF0b3IjZGVjb3JhdGUoamF2YS5sYW5nLk9iamVjdCwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSURlY29yYXRpb24pCi0JICovCi0JcHVibGljIHZvaWQgZGVjb3JhdGUoT2JqZWN0IGVsZW1lbnQsIElEZWNvcmF0aW9uIGRlY29yYXRpb24pIHsKLQkJdHJ5IHsKLQkJCWlmKExpYnJhcnlWYWxpZGF0aW9uTWFya2VySGVscGVyLmlzSW52YWxpZChlbGVtZW50KQotLy8JCQkJCXx8IE1ldGhvZFJpY2hUZXh0TWFya2VySGVscGVyLmlzSW52YWxpZChlbGVtZW50KQotCQkJCQkpIHsKLQkJCQlkZWNvcmF0aW9uLmFkZE92ZXJsYXkoZ2V0RXJyb3JPdmVybGF5KCkpOwotCQkJfQotCQl9Ci0JCWNhdGNoKEV4Y2VwdGlvbiBlKSB7Ci0JCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCX0KLQl9CQotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgc3RhdGljIEltYWdlRGVzY3JpcHRvciBnZXRFcnJvck92ZXJsYXkoKSB7Ci0JCWlmKG92ZXJsYXkgPT0gbnVsbCkgewotCQkJb3ZlcmxheSA9IEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoImZ1bGwvb3ZyMTYvZXJyb3Jfb3ZyLmdpZiIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIG92ZXJsYXk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQmFzZUxhYmVsUHJvdmlkZXIjYWRkTGlzdGVuZXIob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlckxpc3RlbmVyKQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKElMYWJlbFByb3ZpZGVyTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCi0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQmFzZUxhYmVsUHJvdmlkZXIjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCi0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQmFzZUxhYmVsUHJvdmlkZXIjaXNMYWJlbFByb3BlcnR5KGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNMYWJlbFByb3BlcnR5KE9iamVjdCBlbGVtZW50LCBTdHJpbmcgcHJvcGVydHkpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQmFzZUxhYmVsUHJvdmlkZXIjcmVtb3ZlTGlzdGVuZXIob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlckxpc3RlbmVyKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKElMYWJlbFByb3ZpZGVyTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCi0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3ZpZGVycy9NZXRob2RFbGVtZW50VUlMYWJlbFByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3ZpZGVycy9NZXRob2RFbGVtZW50VUlMYWJlbFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3ZGJlNDIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm92aWRlcnMvTWV0aG9kRWxlbWVudFVJTGFiZWxQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvdmlkZXJzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5MaXN0ZW5lckxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlNhZmVSdW5uZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5TYWZlUnVubmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxEZWNvcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotLyoqCi0gKiBDb2RlIHRha2VuIGZyb20gb3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLnZpZXdzdXBwb3J0LkphdmFVSUxhYmVsUHJvdmlkZXIKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgTWV0aG9kRWxlbWVudFVJTGFiZWxQcm92aWRlciBpbXBsZW1lbnRzIElMYWJlbFByb3ZpZGVyIHsKLQkKLQlwcm90ZWN0ZWQgTGlzdGVuZXJMaXN0IGZMaXN0ZW5lcnMgPSBuZXcgTGlzdGVuZXJMaXN0KCk7Ci0JCi0JSUxhYmVsUHJvdmlkZXIgZkxhYmVsUHJvdmlkZXIgPSBuZXcgQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyKAotCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCS5nZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSk7Ci0JCi0JcHJpdmF0ZSBBcnJheUxpc3Q8SUxhYmVsRGVjb3JhdG9yPiBmTGFiZWxEZWNvcmF0b3JzOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBsYWJlbCBwcm92aWRlciB3aXRoIGRlZmF1bHQgZmxhZ3MuCi0JICovCi0JcHVibGljIE1ldGhvZEVsZW1lbnRVSUxhYmVsUHJvdmlkZXIoKSB7Ci0JCWZMYWJlbERlY29yYXRvcnM9IG51bGw7IAotCX0KLQkKLQkvKioKLQkgKiBBZGRzIGEgZGVjb3JhdG9yIHRvIHRoZSBsYWJlbCBwcm92aWRlcgotCSAqLwotCXB1YmxpYyB2b2lkIGFkZExhYmVsRGVjb3JhdG9yKElMYWJlbERlY29yYXRvciBkZWNvcmF0b3IpIHsKLQkJaWYgKGZMYWJlbERlY29yYXRvcnMgPT0gbnVsbCkgewotCQkJZkxhYmVsRGVjb3JhdG9ycz0gbmV3IEFycmF5TGlzdDxJTGFiZWxEZWNvcmF0b3I+KDIpOwotCQl9Ci0JCWZMYWJlbERlY29yYXRvcnMuYWRkKGRlY29yYXRvcik7Ci0JfQotCQotCXByb3RlY3RlZCBJbWFnZSBkZWNvcmF0ZUltYWdlKEltYWdlIGltYWdlLCBPYmplY3QgZWxlbWVudCkgewotCQlpZiAoZkxhYmVsRGVjb3JhdG9ycyAhPSBudWxsICYmIGltYWdlICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGk9IDA7IGkgPCBmTGFiZWxEZWNvcmF0b3JzLnNpemUoKTsgaSsrKSB7Ci0JCQkJSUxhYmVsRGVjb3JhdG9yIGRlY29yYXRvcj0gKElMYWJlbERlY29yYXRvcikgZkxhYmVsRGVjb3JhdG9ycy5nZXQoaSk7Ci0JCQkJaW1hZ2U9IGRlY29yYXRvci5kZWNvcmF0ZUltYWdlKGltYWdlLCBlbGVtZW50KTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gaW1hZ2U7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgSUxhYmVsUHJvdmlkZXIjZ2V0SW1hZ2UKLQkgKi8KLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IGVsZW1lbnQpIHsKLQkJSW1hZ2UgcmVzdWx0PSBmTGFiZWxQcm92aWRlci5nZXRJbWFnZShlbGVtZW50KTsKLQkJcmV0dXJuIGRlY29yYXRlSW1hZ2UocmVzdWx0LCBlbGVtZW50KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGRlY29yYXRlVGV4dChTdHJpbmcgdGV4dCwgT2JqZWN0IGVsZW1lbnQpIHsKLQkJaWYgKGZMYWJlbERlY29yYXRvcnMgIT0gbnVsbCAmJiB0ZXh0Lmxlbmd0aCgpID4gMCkgewotCQkJZm9yIChpbnQgaT0gMDsgaSA8IGZMYWJlbERlY29yYXRvcnMuc2l6ZSgpOyBpKyspIHsKLQkJCQlJTGFiZWxEZWNvcmF0b3IgZGVjb3JhdG9yPSAoSUxhYmVsRGVjb3JhdG9yKSBmTGFiZWxEZWNvcmF0b3JzLmdldChpKTsKLQkJCQl0ZXh0PSBkZWNvcmF0b3IuZGVjb3JhdGVUZXh0KHRleHQsIGVsZW1lbnQpOwotCQkJfQotCQl9CQotCQlyZXR1cm4gdGV4dDsKLQl9Ci0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIElMYWJlbFByb3ZpZGVyI2dldFRleHQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJU3RyaW5nIHJlc3VsdD0gZkxhYmVsUHJvdmlkZXIuZ2V0VGV4dChlbGVtZW50KTsKLQkJcmV0dXJuIGRlY29yYXRlVGV4dChyZXN1bHQsIGVsZW1lbnQpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIElCYXNlTGFiZWxQcm92aWRlciNkaXNwb3NlCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJaWYgKGZMYWJlbERlY29yYXRvcnMgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaT0gMDsgaSA8IGZMYWJlbERlY29yYXRvcnMuc2l6ZSgpOyBpKyspIHsKLQkJCQlJTGFiZWxEZWNvcmF0b3IgZGVjb3JhdG9yPSAoSUxhYmVsRGVjb3JhdG9yKSBmTGFiZWxEZWNvcmF0b3JzLmdldChpKTsKLQkJCQlkZWNvcmF0b3IuZGlzcG9zZSgpOwotCQkJfQotCQkJZkxhYmVsRGVjb3JhdG9ycz0gbnVsbDsKLQkJfQotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBJQmFzZUxhYmVsUHJvdmlkZXIjYWRkTGlzdGVuZXIoSUxhYmVsUHJvdmlkZXJMaXN0ZW5lcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcihJTGFiZWxQcm92aWRlckxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWlmIChmTGFiZWxEZWNvcmF0b3JzICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGk9IDA7IGkgPCBmTGFiZWxEZWNvcmF0b3JzLnNpemUoKTsgaSsrKSB7Ci0JCQkJSUxhYmVsRGVjb3JhdG9yIGRlY29yYXRvcj0gKElMYWJlbERlY29yYXRvcikgZkxhYmVsRGVjb3JhdG9ycy5nZXQoaSk7Ci0JCQkJZGVjb3JhdG9yLmFkZExpc3RlbmVyKGxpc3RlbmVyKTsKLQkJCX0KLQkJfQotCQlmTGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7CQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIElCYXNlTGFiZWxQcm92aWRlciNpc0xhYmVsUHJvcGVydHkoT2JqZWN0LCBTdHJpbmcpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNMYWJlbFByb3BlcnR5KE9iamVjdCBlbGVtZW50LCBTdHJpbmcgcHJvcGVydHkpIHsKLQkJcmV0dXJuIHRydWU7CQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIElCYXNlTGFiZWxQcm92aWRlciNyZW1vdmVMaXN0ZW5lcihJTGFiZWxQcm92aWRlckxpc3RlbmVyKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKElMYWJlbFByb3ZpZGVyTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJaWYgKGZMYWJlbERlY29yYXRvcnMgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaT0gMDsgaSA8IGZMYWJlbERlY29yYXRvcnMuc2l6ZSgpOyBpKyspIHsKLQkJCQlJTGFiZWxEZWNvcmF0b3IgZGVjb3JhdG9yPSAoSUxhYmVsRGVjb3JhdG9yKSBmTGFiZWxEZWNvcmF0b3JzLmdldChpKTsKLQkJCQlkZWNvcmF0b3IucmVtb3ZlTGlzdGVuZXIobGlzdGVuZXIpOwotCQkJfQotCQl9Ci0JCWZMaXN0ZW5lcnMucmVtb3ZlKGxpc3RlbmVyKTsJCi0JfQotCQotCXB1YmxpYyBzdGF0aWMgSUxhYmVsRGVjb3JhdG9yW10gZ2V0RGVjb3JhdG9ycyhib29sZWFuIGVycm9ydGljaywgSUxhYmVsRGVjb3JhdG9yIGV4dHJhKSB7Ci0JCWlmIChlcnJvcnRpY2spIHsKLQkJCWlmIChleHRyYSA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIG5ldyBJTGFiZWxEZWNvcmF0b3JbXSB7fTsKLQkJCX0gZWxzZSB7Ci0JCQkJcmV0dXJuIG5ldyBJTGFiZWxEZWNvcmF0b3JbXSB7IGV4dHJhIH07Ci0JCQl9Ci0JCX0KLQkJaWYgKGV4dHJhICE9IG51bGwpIHsKLQkJCXJldHVybiBuZXcgSUxhYmVsRGVjb3JhdG9yW10geyBleHRyYSB9OwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLSAgICAvKioKLSAgICAgKiBGaXJlcyBhIGxhYmVsIHByb3ZpZGVyIGNoYW5nZWQgZXZlbnQgdG8gYWxsIHJlZ2lzdGVyZWQgbGlzdGVuZXJzCi0gICAgICogT25seSBsaXN0ZW5lcnMgcmVnaXN0ZXJlZCBhdCB0aGUgdGltZSB0aGlzIG1ldGhvZCBpcyBjYWxsZWQgYXJlIG5vdGlmaWVkLgotICAgICAqCi0gICAgICogQHBhcmFtIGV2ZW50IGEgbGFiZWwgcHJvdmlkZXIgY2hhbmdlZCBldmVudAotICAgICAqCi0gICAgICogQHNlZSBJTGFiZWxQcm92aWRlckxpc3RlbmVyI2xhYmVsUHJvdmlkZXJDaGFuZ2VkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgZmlyZUxhYmVsUHJvdmlkZXJDaGFuZ2VkKGZpbmFsIExhYmVsUHJvdmlkZXJDaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgT2JqZWN0W10gbGlzdGVuZXJzID0gZkxpc3RlbmVycy5nZXRMaXN0ZW5lcnMoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0ZW5lcnMubGVuZ3RoOyArK2kpIHsKLSAgICAgICAgICAgIGZpbmFsIElMYWJlbFByb3ZpZGVyTGlzdGVuZXIgbCA9IChJTGFiZWxQcm92aWRlckxpc3RlbmVyKSBsaXN0ZW5lcnNbaV07Ci0gICAgICAgICAgICBTYWZlUnVubmVyLnJ1bihuZXcgU2FmZVJ1bm5hYmxlKCkgewotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICAgICAgbC5sYWJlbFByb3ZpZGVyQ2hhbmdlZChldmVudCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvdmlkZXJzL1Byb2JsZW1zTGFiZWxEZWNvcmF0b3IuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvdmlkZXJzL1Byb2JsZW1zTGFiZWxEZWNvcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmYxYzMyZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3ZpZGVycy9Qcm9ibGVtc0xhYmVsRGVjb3JhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm92aWRlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkxpc3RlbmVyTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJSW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5pbnRlcm5hbC5JUHJvYmxlbUNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmludGVybmFsLkltYWdlRGVzY3JpcHRvclJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuaW50ZXJuYWwuSW1hZ2VJbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5pbnRlcm5hbC5NZXRob2RFbGVtZW50SW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudXRpbC5MaWJyYXJ5VmFsaWRhdGlvbk1hcmtlckhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UudXRpbC5QZXJzaXN0ZW5jZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklCYXNlTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklEZWNvcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsRGVjb3JhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXJMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMaWdodHdlaWdodExhYmVsRGVjb3JhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlckNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SZWN0YW5nbGU7Ci0KLS8qKgotICogQ29kZSB0YWtlbiBmcm9tIG9yZy5lY2xpcHNlLmpkdC51aS5Qcm9ibGVtc0xhYmVsRGVjb3JhdG9yIAotICoKLSAqLwotcHVibGljIGNsYXNzIFByb2JsZW1zTGFiZWxEZWNvcmF0b3IgaW1wbGVtZW50cyBJTGFiZWxEZWNvcmF0b3IsIElMaWdodHdlaWdodExhYmVsRGVjb3JhdG9yIHsKLQkKLQkvKioKLQkgKiBUaGlzIGlzIGEgc3BlY2lhbCA8Y29kZT5MYWJlbFByb3ZpZGVyQ2hhbmdlZEV2ZW50PC9jb2RlPiBjYXJyeWluZyBhZGRpdGlvbmFsIAotCSAqIGluZm9ybWF0aW9uIHdoZXRoZXIgdGhlIGV2ZW50IG9yaWdpbnMgZnJvbSBhIG1ha2VyIGNoYW5nZS4KLQkgKiA8cD4KLQkgKiA8Y29kZT5Qcm9ibGVtc0xhYmVsQ2hhbmdlZEV2ZW50PC9jb2RlPnMgYXJlIG9ubHkgZ2VuZXJhdGVkIGJ5IDxjb2RlPgotCSAqIFByb2JsZW1zTGFiZWxEZWNvcmF0b3I8L2NvZGU+cy4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHN0YXRpYyBjbGFzcyBQcm9ibGVtc0xhYmVsQ2hhbmdlZEV2ZW50IGV4dGVuZHMgTGFiZWxQcm92aWRlckNoYW5nZWRFdmVudCB7Ci0KLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEPSAxTDsKLQkJCi0JCXByaXZhdGUgYm9vbGVhbiBmTWFya2VyQ2hhbmdlOwotCi0JCS8qKgotCQkgKiBOb3RlOiBUaGlzIGNvbnN0cnVjdG9yIGlzIGZvciBpbnRlcm5hbCB1c2Ugb25seS4gQ2xpZW50cyBzaG91bGQgbm90IGNhbGwgdGhpcyBjb25zdHJ1Y3Rvci4KLQkJICogCi0JCSAqIEBwYXJhbSBldmVudFNvdXJjZSB0aGUgYmFzZSBsYWJlbCBwcm92aWRlcgotCQkgKiBAcGFyYW0gY2hhbmdlZFJlc291cmNlIHRoZSBjaGFuZ2VkIHJlc291cmNlcwotCQkgKiBAcGFyYW0gaXNNYXJrZXJDaGFuZ2UgPGNvZGU+dHJ1ZTxjb2RlPiBpZiB0aGUgY2hhbmdlIGlzIGEgbWFya2VyIGNoYW5nZTsgb3RoZXJ3aXNlCi0JCSAqICA8Y29kZT5mYWxzZTwvY29kZT4gCi0JCSAqLwotCQlwdWJsaWMgUHJvYmxlbXNMYWJlbENoYW5nZWRFdmVudChJQmFzZUxhYmVsUHJvdmlkZXIgZXZlbnRTb3VyY2UsIElSZXNvdXJjZVtdIGNoYW5nZWRSZXNvdXJjZSwgYm9vbGVhbiBpc01hcmtlckNoYW5nZSkgewotCQkJc3VwZXIoZXZlbnRTb3VyY2UsIGNoYW5nZWRSZXNvdXJjZSk7Ci0JCQlmTWFya2VyQ2hhbmdlPSBpc01hcmtlckNoYW5nZTsKLQkJfQotCQkKLQkJLyoqCi0JCSAqIFJldHVybnMgd2hldGhlciB0aGlzIGV2ZW50IG9yaWdpbnMgZnJvbSBtYXJrZXIgY2hhbmdlcy4gSWYgPGNvZGU+ZmFsc2U8L2NvZGU+IGFuIGFubm90YXRpb24gCi0JCSAqIG1vZGVsIGNoYW5nZSBpcyB0aGUgb3JpZ2luLiBJbiB0aGlzIGNhc2Ugdmlld2VycyBub3QgZGlzcGxheWluZyB3b3JraW5nIGNvcGllcyBjYW4gaWdub3JlIHRoZXNlIAotCQkgKiBldmVudHMuCi0JCSAqIAotCQkgKiBAcmV0dXJuIGlmIHRoaXMgZXZlbnQgb3JpZ2lucyBmcm9tIGEgbWFya2VyIGNoYW5nZS4KLQkJICovCi0JCXB1YmxpYyBib29sZWFuIGlzTWFya2VyQ2hhbmdlKCkgewotCQkJcmV0dXJuIGZNYXJrZXJDaGFuZ2U7Ci0JCX0KLQotCX0KLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFUlJPUlRJQ0tfRVJST1I9IE1ldGhvZEVsZW1lbnRJbWFnZURlc2NyaXB0b3IuRVJST1I7CQotCi0JcHJpdmF0ZSBJbWFnZURlc2NyaXB0b3JSZWdpc3RyeSBmUmVnaXN0cnk7Ci0JcHJpdmF0ZSBib29sZWFuIGZVc2VOZXdSZWdpc3RyeT0gZmFsc2U7Ci0JcHJpdmF0ZSBJUHJvYmxlbUNoYW5nZWRMaXN0ZW5lciBmUHJvYmxlbUNoYW5nZWRMaXN0ZW5lcjsKLQkKLQlwcml2YXRlIExpc3RlbmVyTGlzdCBmTGlzdGVuZXJzOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5Qcm9ibGVtc0xhYmVsRGVjb3JhdG9yPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgUHJvYmxlbXNMYWJlbERlY29yYXRvcigpIHsKLQkJdGhpcyhudWxsKTsKLQkJZlVzZU5ld1JlZ2lzdHJ5PSB0cnVlOwotCX0KLQkKLQkvKioKLQkgKiBOb3RlOiBUaGlzIGNvbnN0cnVjdG9yIGlzIGZvciBpbnRlcm5hbCB1c2Ugb25seS4gQ2xpZW50cyBzaG91bGQgbm90IGNhbGwgdGhpcyBjb25zdHJ1Y3Rvci4KLQkgKiAKLQkgKiBAcGFyYW0gcmVnaXN0cnkgVGhlIHJlZ2lzdHJ5IHRvIHVzZSBvciA8Y29kZT5udWxsPC9jb2RlPiB0byB1c2UgdGhlIEphdmEgcGx1Z2luJ3MKLQkgKiAgaW1hZ2UgcmVnaXN0cnkKLQkgKi8KLQlwdWJsaWMgUHJvYmxlbXNMYWJlbERlY29yYXRvcihJbWFnZURlc2NyaXB0b3JSZWdpc3RyeSByZWdpc3RyeSkgewotCQlmUmVnaXN0cnk9IHJlZ2lzdHJ5OwotCQlmUHJvYmxlbUNoYW5nZWRMaXN0ZW5lcj0gbnVsbDsKLQl9Ci0JCi0JcHJpdmF0ZSBJbWFnZURlc2NyaXB0b3JSZWdpc3RyeSBnZXRSZWdpc3RyeSgpIHsKLQkJaWYgKGZSZWdpc3RyeSA9PSBudWxsKSB7Ci0JCQlmUmVnaXN0cnk9IGZVc2VOZXdSZWdpc3RyeSA/IG5ldyBJbWFnZURlc2NyaXB0b3JSZWdpc3RyeSgpIDogQXV0aG9yaW5nVUlQbHVnaW4uZ2V0SW1hZ2VEZXNjcmlwdG9yUmVnaXN0cnkoKTsKLQkJfQotCQlyZXR1cm4gZlJlZ2lzdHJ5OwotCX0KLQkKLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIElMYWJlbERlY29yYXRvciNkZWNvcmF0ZVRleHQoU3RyaW5nLCBPYmplY3QpCi0JICovCi0JcHVibGljIFN0cmluZyBkZWNvcmF0ZVRleHQoU3RyaW5nIHRleHQsIE9iamVjdCBlbGVtZW50KSB7Ci0JCXJldHVybiB0ZXh0OwotCX0JCi0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBJTGFiZWxEZWNvcmF0b3IjZGVjb3JhdGVJbWFnZShJbWFnZSwgT2JqZWN0KQotCSAqLwotCXB1YmxpYyBJbWFnZSBkZWNvcmF0ZUltYWdlKEltYWdlIGltYWdlLCBPYmplY3Qgb2JqKSB7Ci0JCWludCBhZG9ybm1lbnRGbGFncz0gY29tcHV0ZUFkb3JubWVudEZsYWdzKG9iaik7Ci0JCWlmIChhZG9ybm1lbnRGbGFncyAhPSAwKSB7Ci0JCQlJbWFnZURlc2NyaXB0b3IgYmFzZUltYWdlPSBuZXcgSW1hZ2VJbWFnZURlc2NyaXB0b3IoaW1hZ2UpOwotCQkJUmVjdGFuZ2xlIGJvdW5kcz0gaW1hZ2UuZ2V0Qm91bmRzKCk7Ci0JCQlyZXR1cm4gZ2V0UmVnaXN0cnkoKS5nZXQobmV3IE1ldGhvZEVsZW1lbnRJbWFnZURlc2NyaXB0b3IoYmFzZUltYWdlLCBhZG9ybm1lbnRGbGFncywgbmV3IFBvaW50KGJvdW5kcy53aWR0aCwgYm91bmRzLmhlaWdodCkpKTsKLQkJfQotCQlyZXR1cm4gaW1hZ2U7Ci0JfQotCi0JLyoqCi0JICogTm90ZTogVGhpcyBtZXRob2QgaXMgZm9yIGludGVybmFsIHVzZSBvbmx5LiBDbGllbnRzIHNob3VsZCBub3QgY2FsbCB0aGlzIG1ldGhvZC4KLQkgKiAKLQkgKiBAcGFyYW0gb2JqIHRoZSBlbGVtZW50IHRvIGNvbXB1dGUgdGhlIGZsYWdzIGZvcgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGFkb3JubWVudCBmbGFncwotCSAqLwotCXByb3RlY3RlZCBpbnQgY29tcHV0ZUFkb3JubWVudEZsYWdzKE9iamVjdCBvYmopIHsKLQkJdHJ5IHsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQkJcmV0dXJuIGdldEVycm9yVGlja3NGcm9tTWFya2VycygoTWV0aG9kRWxlbWVudCkgb2JqLCBQZXJzaXN0ZW5jZVV0aWwuZ2V0V29ya3NwYWNlUmVzb3VyY2Uob2JqKSwgSVJlc291cmNlLkRFUFRIX0lORklOSVRFKTsKLQkJCX0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgSVJlc291cmNlKSB7Ci0JCQkJcmV0dXJuIGdldEVycm9yVGlja3NGcm9tTWFya2VycyhudWxsLCAoSVJlc291cmNlKSBvYmosIElSZXNvdXJjZS5ERVBUSF9JTkZJTklURSk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJaWYgKGUuZ2V0U3RhdHVzKCkuZ2V0Q29kZSgpID09IElSZXNvdXJjZVN0YXR1cy5NQVJLRVJfTk9UX0ZPVU5EKSB7Ci0JCQkJcmV0dXJuIDA7Ci0JCQl9Ci0JCQkKLQkJCUF1dGhvcmluZ1VJUGx1Z2luLmxvZyhlKTsKLQkJfQotCQlyZXR1cm4gMDsKLQl9Ci0KLQlwcml2YXRlIGludCBnZXRFcnJvclRpY2tzRnJvbU1hcmtlcnMoTWV0aG9kRWxlbWVudCBlLCBJUmVzb3VyY2UgcmVzLAotCQkJaW50IGRlcHRoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmIChyZXMgPT0gbnVsbCB8fCAhcmVzLmlzQWNjZXNzaWJsZSgpKSB7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCQlpbnQgaW5mbyA9IDA7Ci0KLQkJSU1hcmtlcltdIG1hcmtlcnMgPSByZXMuZmluZE1hcmtlcnMoSU1hcmtlci5QUk9CTEVNLCB0cnVlLCBkZXB0aCk7Ci0JCWlmIChtYXJrZXJzICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbWFya2Vycy5sZW5ndGggJiYgKGluZm8gIT0gRVJST1JUSUNLX0VSUk9SKTsgaSsrKSB7Ci0JCQkJSU1hcmtlciBjdXJyID0gbWFya2Vyc1tpXTsKLQkJCQlpbnQgcHJpb3JpdHkgPSBjdXJyLmdldEF0dHJpYnV0ZShJTWFya2VyLlNFVkVSSVRZLCAtMSk7Ci0JCQkJaWYgKHByaW9yaXR5ID09IElNYXJrZXIuU0VWRVJJVFlfRVJST1IKLQkJCQkJCSYmIChlID09IG51bGwgfHwgZQotCQkJCQkJCQkuZ2V0R3VpZCgpCi0JCQkJCQkJCS5lcXVhbHMoCi0JCQkJCQkJCQkJY3VycgotCQkJCQkJCQkJCQkJLmdldEF0dHJpYnV0ZShMaWJyYXJ5VmFsaWRhdGlvbk1hcmtlckhlbHBlci5HVUlEKSkpKSB7Ci0JCQkJCWluZm8gPSBFUlJPUlRJQ0tfRVJST1I7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBpbmZvOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBJQmFzZUxhYmVsUHJvdmlkZXIjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJaWYgKGZQcm9ibGVtQ2hhbmdlZExpc3RlbmVyICE9IG51bGwpIHsKLQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcm9ibGVtTWFya2VyTWFuYWdlcigpLnJlbW92ZUxpc3RlbmVyKGZQcm9ibGVtQ2hhbmdlZExpc3RlbmVyKTsKLQkJCWZQcm9ibGVtQ2hhbmdlZExpc3RlbmVyPSBudWxsOwotCQl9Ci0JCWlmIChmUmVnaXN0cnkgIT0gbnVsbCAmJiBmVXNlTmV3UmVnaXN0cnkpIHsKLQkJCWZSZWdpc3RyeS5kaXNwb3NlKCk7Ci0JCX0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBJQmFzZUxhYmVsUHJvdmlkZXIjaXNMYWJlbFByb3BlcnR5KE9iamVjdCwgU3RyaW5nKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzTGFiZWxQcm9wZXJ0eShPYmplY3QgZWxlbWVudCwgU3RyaW5nIHByb3BlcnR5KSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBJQmFzZUxhYmVsUHJvdmlkZXIjYWRkTGlzdGVuZXIoSUxhYmVsUHJvdmlkZXJMaXN0ZW5lcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcihJTGFiZWxQcm92aWRlckxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWlmIChmTGlzdGVuZXJzID09IG51bGwpIHsKLQkJCWZMaXN0ZW5lcnM9IG5ldyBMaXN0ZW5lckxpc3QoKTsKLQkJfQotCQlmTGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7Ci0JCWlmIChmUHJvYmxlbUNoYW5nZWRMaXN0ZW5lciA9PSBudWxsKSB7Ci0JCQlmUHJvYmxlbUNoYW5nZWRMaXN0ZW5lcj0gbmV3IElQcm9ibGVtQ2hhbmdlZExpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHByb2JsZW1zQ2hhbmdlZChJUmVzb3VyY2VbXSBjaGFuZ2VkUmVzb3VyY2VzLCBib29sZWFuIGlzTWFya2VyQ2hhbmdlKSB7Ci0JCQkJCWZpcmVQcm9ibGVtc0NoYW5nZWQoY2hhbmdlZFJlc291cmNlcywgaXNNYXJrZXJDaGFuZ2UpOwotCQkJCX0KLQkJCX07Ci0JCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJvYmxlbU1hcmtlck1hbmFnZXIoKS5hZGRMaXN0ZW5lcihmUHJvYmxlbUNoYW5nZWRMaXN0ZW5lcik7Ci0JCX0KLQl9CQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgSUJhc2VMYWJlbFByb3ZpZGVyI3JlbW92ZUxpc3RlbmVyKElMYWJlbFByb3ZpZGVyTGlzdGVuZXIpCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoSUxhYmVsUHJvdmlkZXJMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlpZiAoZkxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQlmTGlzdGVuZXJzLnJlbW92ZShsaXN0ZW5lcik7Ci0JCQlpZiAoZkxpc3RlbmVycy5pc0VtcHR5KCkgJiYgZlByb2JsZW1DaGFuZ2VkTGlzdGVuZXIgIT0gbnVsbCkgewotCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcm9ibGVtTWFya2VyTWFuYWdlcigpLnJlbW92ZUxpc3RlbmVyKGZQcm9ibGVtQ2hhbmdlZExpc3RlbmVyKTsKLQkJCQlmUHJvYmxlbUNoYW5nZWRMaXN0ZW5lcj0gbnVsbDsKLQkJCX0KLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgZmlyZVByb2JsZW1zQ2hhbmdlZChJUmVzb3VyY2VbXSBjaGFuZ2VkUmVzb3VyY2VzLCBib29sZWFuIGlzTWFya2VyQ2hhbmdlKSB7Ci0JCWlmIChmTGlzdGVuZXJzICE9IG51bGwgJiYgIWZMaXN0ZW5lcnMuaXNFbXB0eSgpKSB7Ci0JCQlMYWJlbFByb3ZpZGVyQ2hhbmdlZEV2ZW50IGV2ZW50PSBuZXcgUHJvYmxlbXNMYWJlbENoYW5nZWRFdmVudCh0aGlzLCBjaGFuZ2VkUmVzb3VyY2VzLCBpc01hcmtlckNoYW5nZSk7Ci0JCQlPYmplY3RbXSBsaXN0ZW5lcnM9IGZMaXN0ZW5lcnMuZ2V0TGlzdGVuZXJzKCk7Ci0JCQlmb3IgKGludCBpPSAwOyBpIDwgbGlzdGVuZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJKChJTGFiZWxQcm92aWRlckxpc3RlbmVyKSBsaXN0ZW5lcnNbaV0pLmxhYmVsUHJvdmlkZXJDaGFuZ2VkKGV2ZW50KTsKLQkJCX0KLQkJfQotCX0KLQkJCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGlnaHR3ZWlnaHRMYWJlbERlY29yYXRvciNkZWNvcmF0ZShqYXZhLmxhbmcuT2JqZWN0LCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklEZWNvcmF0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIGRlY29yYXRlKE9iamVjdCBlbGVtZW50LCBJRGVjb3JhdGlvbiBkZWNvcmF0aW9uKSB7IAotCQlpbnQgYWRvcm5tZW50RmxhZ3M9IGNvbXB1dGVBZG9ybm1lbnRGbGFncyhlbGVtZW50KTsKLQkJaWYgKGFkb3JubWVudEZsYWdzID09IEVSUk9SVElDS19FUlJPUikgewotCQkJZGVjb3JhdGlvbi5hZGRPdmVybGF5KEF1dGhvcmluZ1VJSW1hZ2VzLklNR19ERVNDX09WUl9FUlJPUik7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvdmlkZXJzL1ZhcmlhYmlsaXR5RWxlbWVudExhYmVsUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvdmlkZXJzL1ZhcmlhYmlsaXR5RWxlbWVudExhYmVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTU3MjdjZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3ZpZGVycy9WYXJpYWJpbGl0eUVsZW1lbnRMYWJlbFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3ZpZGVyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5KRmFjZVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklGb250UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgVmFyaWFiaWxpdHlFbGVtZW50TGFiZWxQcm92aWRlciBleHRlbmRzCi0JCUFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlciBpbXBsZW1lbnRzIElGb250UHJvdmlkZXIgewotCi0JcHJvdGVjdGVkIHN0YXRpYyBGb250IHJlZ3VsYXJGb250OwotCi0JcHJvdGVjdGVkIHN0YXRpYyBGb250IGJvbGRGb250OwotCi0JcHJvdGVjdGVkIHN0YXRpYyBGb250IGl0YWxpY0ZvbnQ7Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBGb250IGJvbGRJdGFsaWNGb250OwotCi0JcHJvdGVjdGVkIHN0YXRpYyBGb250IHN0cmlrZW91dEZvbnQ7CQotCi0Jc3RhdGljIHsKLQkJRm9udCBkZWZhdWx0Rm9udCA9IEpGYWNlUmVzb3VyY2VzLmdldERlZmF1bHRGb250KCk7Ci0JCXJlZ3VsYXJGb250ID0gZGVmYXVsdEZvbnQ7Ci0JCUZvbnREYXRhW10gZmRzID0gSkZhY2VSZXNvdXJjZXMuZ2V0RGVmYXVsdEZvbnQoKS5nZXRGb250RGF0YSgpOwotCQlpZiAoZmRzLmxlbmd0aCA+IDApIHsKLQkJCUZvbnREYXRhIGZkID0gZmRzWzBdOwotCQkJaW50IGggPSBmZC5nZXRIZWlnaHQoKTsKLQkJCURpc3BsYXkgZGlzcGxheSA9IERpc3BsYXkuZ2V0RGVmYXVsdCgpOwotCQkJYm9sZEZvbnQgPSBuZXcgRm9udChkaXNwbGF5LCBmZC5nZXROYW1lKCksIGgsIGZkLmdldFN0eWxlKCkKLQkJCQkJfCBTV1QuQk9MRCk7Ci0JCQlpdGFsaWNGb250ID0gbmV3IEZvbnQoZGlzcGxheSwgZmQuZ2V0TmFtZSgpLCBoLCBmZC5nZXRTdHlsZSgpCi0JCQkJCXwgU1dULklUQUxJQyk7Ci0JCQlib2xkSXRhbGljRm9udCA9IG5ldyBGb250KGRpc3BsYXksIGZkLmdldE5hbWUoKSwgaCwgZmQuZ2V0U3R5bGUoKQotCQkJCQl8IFNXVC5CT0xEIHwgU1dULklUQUxJQyk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEZvbnQgZ2V0SXRhbGljRm9udCgpIHsKLQkJcmV0dXJuIGl0YWxpY0ZvbnQ7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBGb250IGdldERlZmF1bHRGb250KCkgewotCQlyZXR1cm4gcmVndWxhckZvbnQ7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICovCi0JcHVibGljIFZhcmlhYmlsaXR5RWxlbWVudExhYmVsUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCi0JfQotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KLQotCXB1YmxpYyBGb250IGdldEZvbnQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJaWYgKGlzRXh0ZXJuYWwoZWxlbWVudCkpIHsKLQkJCXJldHVybiBpdGFsaWNGb250OwotCQl9Ci0JCXJldHVybiBib2xkRm9udDsKLQl9Ci0KLQlwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBpc0V4dGVybmFsKE9iamVjdCBlbGVtZW50KTsKLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm92aWRlcnMvcGFja2FnZS5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm92aWRlcnMvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMjZmM2U3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvdmlkZXJzL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIGV4dGVuc2lvbiBwb2ludCBtYW5hZ2VtZW50IGZvciB0aGUgQXV0aG9yaW5nIFVJLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcmljaHRleHQvSU1ldGhvZFJpY2hUZXh0LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3JpY2h0ZXh0L0lNZXRob2RSaWNoVGV4dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNzRhNjQzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcmljaHRleHQvSU1ldGhvZFJpY2hUZXh0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnJpY2h0ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuSVJpY2hUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLQotCi0vKioKLSAqIFRoZSBpbnRlcmZhY2UgZm9yIGEgUmljaCBUZXh0IGNvbnRyb2wgdXNlZCBpbiB0aGUgTWV0aG9kIGVkaXRvcnMuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElNZXRob2RSaWNoVGV4dCBleHRlbmRzIElSaWNoVGV4dCB7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRob2QgZWxlbWVudCBhc3NvY2lhdGVkIHdpdGggdGhpcyByaWNoIHRleHQgY29udHJvbC4KLQkgKi8KLQlwdWJsaWMgTWV0aG9kRWxlbWVudCBnZXRNZXRob2RFbGVtZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtb2RhbCBvYmplY3QgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcmljaCB0ZXh0IGNvbnRyb2wuCi0JICovCi0JcHVibGljIEVPYmplY3QgZ2V0TW9kYWxPYmplY3QoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIG1vZGFsIG9iamVjdCBhc3NvY2lhdGVkIHdpdGggdGhpcyByaWNoIHRleHQgY29udHJvbC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNb2RhbE9iamVjdChFT2JqZWN0IG1vZGFsT2JqZWN0KTsKLQotCS8qKgotCSAqIFJldHVybnMgbW9kYWwgb2JqZWN0IGZlYXR1cmUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcmljaCB0ZXh0IGNvbnRyb2wuCi0JICovCi0JcHVibGljIEVTdHJ1Y3R1cmFsRmVhdHVyZSBnZXRNb2RhbE9iamVjdEZlYXR1cmUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIG1vZGFsIG9iamVjdCBmZWF0dXJlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHJpY2ggdGV4dCBjb250cm9sLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1vZGFsT2JqZWN0RmVhdHVyZShFU3RydWN0dXJhbEZlYXR1cmUgbW9kYWxPYmplY3RGZWF0dXJlKTsKLQotCS8qKgotCSAqIEluaXRpYWxpemUgdGhlIE1ldGhvZFJpY2hUZXh0IHdpdGggdGhlIGVkaXRlZCBNZXRob2RFbGVtbnQgYW5kIG5hbWUgb2YgdGhlIGZpZWxkCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiBAcGFyYW0gZmllbGROYW1lCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChNZXRob2RFbGVtZW50IGVsZW1lbnQsIExhYmVsIGxhYmVsKTsKLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9yaWNodGV4dC9JTWV0aG9kUmljaFRleHRFZGl0b3IuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcmljaHRleHQvSU1ldGhvZFJpY2hUZXh0RWRpdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5ZjUzOWQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9yaWNodGV4dC9JTWV0aG9kUmljaFRleHRFZGl0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucmljaHRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuSVJpY2hUZXh0RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5JUmljaFRleHRUb29sQmFyOwotCi0vKioKLSAqIFRoZSBpbnRlcmZhY2UgZm9yIGEgUmljaCBUZXh0IGVkaXRvciB1c2VkIGluIHRoZSBNZXRob2QgZWRpdG9ycy4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSU1ldGhvZFJpY2hUZXh0RWRpdG9yIGV4dGVuZHMgSU1ldGhvZFJpY2hUZXh0LCBJUmljaFRleHRFZGl0b3IgewotCi0JLyoqCi0JICogRmlsbHMgdGhlIFJpY2ggVGV4dCBlZGl0b3IgdG9vbCBiYXIgd2l0aCBhY3Rpb24gaXRlbXMuCi0JICogCi0JICogQHBhcmFtIHRvb2xCYXIKLQkgKiAgICAgICAgICAgIFRoZSBSaWNoIHRleHQgZWRpdG9yIHRvb2wgYmFyLgotCSAqLwotCXB1YmxpYyB2b2lkIGZpbGxUb29sQmFyKElSaWNoVGV4dFRvb2xCYXIgdG9vbEJhcik7Ci0JCi0JLyoqCi0JICogU2VsZWN0cyB0aGUgUmljaCBUZXh0IG9yIEhUTUwgdGFiLgotCSAqIAotCSAqIEBwYXJhbSBpbmRleAotCSAqICAgICAgICAgICAgMCBmb3IgdGhlIFJpY2ggVGV4dCB0YWIsIDEgZm9yIHRoZSBIVE1MIHRhYi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTZWxlY3Rpb24oaW50IGluZGV4KTsJCi0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcmljaHRleHQvTWV0aG9kUmljaFRleHRDb250ZXh0LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3JpY2h0ZXh0L01ldGhvZFJpY2hUZXh0Q29udGV4dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MDNkYzI4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcmljaHRleHQvTWV0aG9kUmljaFRleHRDb250ZXh0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnJpY2h0ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi1wdWJsaWMgY2xhc3MgTWV0aG9kUmljaFRleHRDb250ZXh0IHsKLQotCXByaXZhdGUgQ29tcG9zaXRlIHBhcmVudDsKLQlwcml2YXRlIGludCBzdHlsZTsKLQlwcml2YXRlIFN0cmluZyBiYXNlUGF0aDsKLQkKLQlwdWJsaWMgTWV0aG9kUmljaFRleHRDb250ZXh0KENvbXBvc2l0ZSBwYXJlbnQsIGludCBzdHlsZSwgU3RyaW5nIGJhc2VQYXRoKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMucGFyZW50ID0gcGFyZW50OwotCQl0aGlzLnN0eWxlID0gc3R5bGU7Ci0JCXRoaXMuYmFzZVBhdGggPSBiYXNlUGF0aDsKLQl9Ci0KLQlwdWJsaWMgQ29tcG9zaXRlIGdldFBhcmVudCgpIHsKLQkJcmV0dXJuIHBhcmVudDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRQYXJlbnQoQ29tcG9zaXRlIHBhcmVudCkgewotCQl0aGlzLnBhcmVudCA9IHBhcmVudDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFN0eWxlKCkgewotCQlyZXR1cm4gc3R5bGU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U3R5bGUoaW50IHN0eWxlKSB7Ci0JCXRoaXMuc3R5bGUgPSBzdHlsZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEJhc2VQYXRoKCkgewotCQlyZXR1cm4gYmFzZVBhdGg7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0QmFzZVBhdGgoU3RyaW5nIGJhc2VQYXRoKSB7Ci0JCXRoaXMuYmFzZVBhdGggPSBiYXNlUGF0aDsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3JpY2h0ZXh0L01ldGhvZFJpY2hUZXh0RWRpdG9yQ29udGV4dC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9yaWNodGV4dC9NZXRob2RSaWNoVGV4dEVkaXRvckNvbnRleHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODczZDNkYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3JpY2h0ZXh0L01ldGhvZFJpY2hUZXh0RWRpdG9yQ29udGV4dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5yaWNodGV4dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGU7Ci0KLXB1YmxpYyBjbGFzcyBNZXRob2RSaWNoVGV4dEVkaXRvckNvbnRleHQgZXh0ZW5kcyBNZXRob2RSaWNoVGV4dENvbnRleHQgewotCi0JcHJpdmF0ZSBNZXRob2RFbGVtZW50IG1ldGhvZEVsZW1lbnQ7Ci0JcHJpdmF0ZSBMYWJlbCBsYWJlbDsKLQlwcml2YXRlIElFZGl0b3JTaXRlIGVkaXRvclNpdGU7Ci0JCi0JcHVibGljIE1ldGhvZFJpY2hUZXh0RWRpdG9yQ29udGV4dChDb21wb3NpdGUgcGFyZW50LCBpbnQgc3R5bGUsIFN0cmluZyBiYXNlUGF0aCwgTWV0aG9kRWxlbWVudCBtZXRob2RFbGVtZW50LCBMYWJlbCBsYWJlbCwgSUVkaXRvclNpdGUgZWRpdG9yU2l0ZSkgewotCQlzdXBlcihwYXJlbnQsIHN0eWxlLCBiYXNlUGF0aCk7Ci0JCXRoaXMubWV0aG9kRWxlbWVudCA9IG1ldGhvZEVsZW1lbnQ7Ci0JCXRoaXMubGFiZWwgPSBsYWJlbDsKLQkJdGhpcy5lZGl0b3JTaXRlID0gZWRpdG9yU2l0ZTsKLQl9Ci0KLQlwdWJsaWMgTWV0aG9kRWxlbWVudCBnZXRNZXRob2RFbGVtZW50KCkgewotCQlyZXR1cm4gbWV0aG9kRWxlbWVudDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRNZXRob2RFbGVtZW50KE1ldGhvZEVsZW1lbnQgbWV0aG9kRWxlbWVudCkgewotCQl0aGlzLm1ldGhvZEVsZW1lbnQgPSBtZXRob2RFbGVtZW50OwotCX0KLQotCXB1YmxpYyBMYWJlbCBnZXRMYWJlbCgpIHsKLQkJcmV0dXJuIGxhYmVsOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldExhYmVsKExhYmVsIGxhYmVsKSB7Ci0JCXRoaXMubGFiZWwgPSBsYWJlbDsKLQl9Ci0KLQlwdWJsaWMgSUVkaXRvclNpdGUgZ2V0RWRpdG9yU2l0ZSgpIHsKLQkJcmV0dXJuIGVkaXRvclNpdGU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RWRpdG9yU2l0ZShJRWRpdG9yU2l0ZSBlZGl0b3JTaXRlKSB7Ci0JCXRoaXMuZWRpdG9yU2l0ZSA9IGVkaXRvclNpdGU7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3JpY2h0ZXh0L3BhY2thZ2UuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcmljaHRleHQvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZDhlZmY5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcmljaHRleHQvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgcmljaCB0ZXh0IGVkaXRpbmcgc3VwcG9ydCBmb3IgdGhlIGVkaXRvcnMgYW5kIFByb3BlcnRpZXMgdmlldy4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3V0aWwvQXV0aG9yaW5nQWNjZXNzaWJsZUxpc3RlbmVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3V0aWwvQXV0aG9yaW5nQWNjZXNzaWJsZUxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmNGJjZmUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS91dGlsL0F1dGhvcmluZ0FjY2Vzc2libGVMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJsZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2libGVMaXN0ZW5lcjsKLQotLyoqCi0gKiBBY2Nlc3NpYmxlIGxpc3RlbmVyIHdoaWxlIGF1dGhvcmluZyB0aGUgY29udGVudAotICogCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBzaW5jZSAxLjAKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBBdXRob3JpbmdBY2Nlc3NpYmxlTGlzdGVuZXIgaW1wbGVtZW50cyBBY2Nlc3NpYmxlTGlzdGVuZXIgewotCQotCXByaXZhdGUgU3RyaW5nIGRlc2NyaXB0aW9uOwotCXByaXZhdGUgU3RyaW5nIG5hbWU7Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZQotCSAqIEBwYXJhbSBuYW1lCi0JICovCi0JcHVibGljIEF1dGhvcmluZ0FjY2Vzc2libGVMaXN0ZW5lcihTdHJpbmcgbmFtZSl7Ci0JCXRoaXMubmFtZSA9IG5hbWU7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZSBhbiBpbnN0YW5jZQotCSAqIEBwYXJhbSBuYW1lCi0JICogQHBhcmFtIGRlc2NyaXB0aW9uCi0JICovCi0JcHVibGljIEF1dGhvcmluZ0FjY2Vzc2libGVMaXN0ZW5lcihTdHJpbmcgbmFtZSwgU3RyaW5nIGRlc2NyaXB0aW9uKXsKLQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJdGhpcy5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2libGVMaXN0ZW5lciNnZXREZXNjcmlwdGlvbihvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmxlRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgZ2V0RGVzY3JpcHRpb24oQWNjZXNzaWJsZUV2ZW50IGUpIHsKLQkJZS5yZXN1bHQgPSB0aGlzLmRlc2NyaXB0aW9uOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJsZUxpc3RlbmVyI2dldEhlbHAob3JnLmVjbGlwc2Uuc3d0LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJsZUV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGdldEhlbHAoQWNjZXNzaWJsZUV2ZW50IGUpIHsKLQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJsZUxpc3RlbmVyI2dldEtleWJvYXJkU2hvcnRjdXQob3JnLmVjbGlwc2Uuc3d0LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJsZUV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGdldEtleWJvYXJkU2hvcnRjdXQoQWNjZXNzaWJsZUV2ZW50IGUpIHsKLQkKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2libGVMaXN0ZW5lciNnZXROYW1lKG9yZy5lY2xpcHNlLnN3dC5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2libGVFdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBnZXROYW1lKEFjY2Vzc2libGVFdmVudCBlKSB7CQkKLQkJZS5yZXN1bHQgPSB0aGlzLm5hbWU7Ci0JfQotCQotCQotCS8qKgotCSAqIFNldCBuYW1lIGZvciB0aGUgbGlzdGVuZXIKLQkgKiBAcGFyYW0gbmFtZQotCSAqLwotCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpewotCQl0aGlzLm5hbWUgPSBuYW1lOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvdXRpbC9Db25maWd1cmF0aW9uTWFya2VySGVscGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3V0aWwvQ29uZmlndXJhdGlvbk1hcmtlckhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYWExOTIxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvdXRpbC9Db25maWd1cmF0aW9uTWFya2VySGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOTQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5FeHRlbnNpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5JTWFya2VyQXR0cmlidXRlQ29udHJpYnV0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLmNsb3N1cmUuSUNvbmZpZ3VyYXRpb25FcnJvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lm5hdmlnYXRvci5Db25maWd1cmF0aW9uc0l0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wcm9qZWN0Lk1ldGhvZExpYnJhcnlQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5GaWxlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pZGUuSURFOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLm1hcmtlcnMuTWFya2VyVmlld1V0aWw7Ci0KLS8qKgotICogIEhlbHBlciBjbGFzcyB0byBoYW5kbGUgQ29uZmlndXJhdGlvbiBlcnJvciBtYXJrZXJzCi0gKiBAYXV0aG9yIEplZmYgSGFyZHkKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKgotICovCi1wdWJsaWMgY2xhc3MgQ29uZmlndXJhdGlvbk1hcmtlckhlbHBlciB7CQotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29uZmlndXJhdGlvbk1hcmtlckhlbHBlciBJTlNUQU5DRSA9IG5ldyBDb25maWd1cmF0aW9uTWFya2VySGVscGVyKCk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9FUlJPUl9JRCA9ICJlcnJvcklEIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfQ09ORklHX0dVSUQgPSAiY29uZmlnR3VpZCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX01FU1NBR0VfSUQgPSAibWVzc2FnZUlkIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfRVJST1JfRUxFTUVOVF9HVUlEID0gImVsZW1lbnRHdWlkIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfQ0FVU0VfRUxFTUVOVF9HVUlEID0gImNhdXNlR3VpZCI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIG1hcmtlciBJRAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1BUktFUl9JRCA9ICJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmNvbmZpZ3VyYXRpb24iOyAvLyROT04tTkxTLTEkCi0KLQkKLS8vCXByaXZhdGUgTWFwPEVsZW1lbnREZXBlbmRlbmN5RXJyb3IsIElNYXJrZXI+IGVycm9yTWFya2VyTWFwID0gbmV3IEhhc2hNYXA8RWxlbWVudERlcGVuZGVuY3lFcnJvciwgSU1hcmtlcj4oKTsKLQkKLQkvLyBwcml2YXRlIGNvbnN0cnVjdG9yCi0JcHJpdmF0ZSBDb25maWd1cmF0aW9uTWFya2VySGVscGVyKCkgewotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBDb250YWluZXJNYXAgZXh0ZW5kcyBIYXNoTWFwPE9iamVjdCwgSW50ZWdlcj4gewotCQkvKioKLQkJICogCi0JCSAqLwotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCQlwdWJsaWMgQ29udGFpbmVyTWFwKCkgewotCQkJc3VwZXIoKTsKLQkJCWluaXRNYXAoKTsKLQkJCUxpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuYWRkTGlzdGVuZXIobmV3IExpYnJhcnlTZXJ2aWNlTGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgbGlicmFyeU9wZW5lZChNZXRob2RMaWJyYXJ5IGxpYnJhcnkpIHsKLQkJCQkJaW5pdE1hcCgpOwotCQkJCX0KLQkJCQkKLQkJCQlwdWJsaWMgdm9pZCBsaWJyYXJ5Q2xvc2VkKE1ldGhvZExpYnJhcnkgbGlicmFyeSkgewotCQkJCQljbGVhcigpOwotCQkJCX0KLQkJCQkKLQkJCQlwdWJsaWMgdm9pZCBsaWJyYXJ5UmVvcGVuZWQoTWV0aG9kTGlicmFyeSBsaWJyYXJ5KSB7Ci0JCQkJCWluaXRNYXAoKTsKLQkJCQl9CQkJCQotCQkJfSk7Ci0JCX0KLQkJCi0JCXByaXZhdGUgdm9pZCBpbml0TWFwKCkgewotCQkJY2xlYXIoKTsKLQkJCQotCQkJLy8gZmlsbCB0aGlzIHNldCB3aXRoIGNvbnRhaW5lcnMgb2YgbWFya2VkIG9iamVjdHMKLQkJCS8vCi0JCQlNZXRob2RMaWJyYXJ5IGxpYiA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKTsKLQkJCWlmKGxpYiAhPSBudWxsKSB7Ci0JCQkJSVByb2plY3QgcHJqID0gTWV0aG9kTGlicmFyeVByb2plY3QuZmluZFByb2plY3QobGliKTsKLQkJCQlpZihwcmogIT0gbnVsbCkgewotCQkJCQl0cnkgewotCQkJCQkJSU1hcmtlcltdIG1hcmtlcnMgPSBwcmouZmluZE1hcmtlcnMoSU5TVEFOQ0UuZ2V0TWFya2VySUQoKSwgZmFsc2UsIElSZXNvdXJjZS5ERVBUSF9JTkZJTklURSk7Ci0JCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IG1hcmtlcnMubGVuZ3RoOyBpKyspIHsKLQkJCQkJCQlJTWFya2VyIG1hcmtlciA9IG1hcmtlcnNbaV07Ci0JCQkJCQkJU3RyaW5nIGd1aWQgPSAoU3RyaW5nKSBtYXJrZXIuZ2V0QXR0cmlidXRlKEFUVFJfQ09ORklHX0dVSUQpOwotCQkJCQkJCU1ldGhvZEVsZW1lbnQgZSA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudExpYnJhcnlNYW5hZ2VyKCkuZ2V0TWV0aG9kRWxlbWVudChndWlkKTsKLQkJCQkJCQlpZihlICE9IG51bGwpIHsKLQkJCQkJCQkJLy8gcmVtb3ZlIGl0cyBjb250YWluZXJzIGZyb20gY29udGFpbmVyc09mTWFya2VkT2JqZWN0cwotCQkJCQkJCQkvLwotCQkJCQkJCQltYXJrQ29udGFpbmVycyhlKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQlwcml2YXRlIHZvaWQgaW5jcmVtZW50KE9iamVjdCBvYmplY3QpIHsKLQkJCUludGVnZXIgY291bnQ7Ci0JCQlpZiAoY29udGFpbnNLZXkob2JqZWN0KSkgewotCQkJCWNvdW50ID0gZ2V0KG9iamVjdCk7Ci0JCQl9IGVsc2UgewotCQkJCWNvdW50ID0gbmV3IEludGVnZXIoMCk7Ci0JCQl9Ci0JCQljb3VudCsrOwotCQkJcHV0KG9iamVjdCwgY291bnQpOwotCQl9Ci0KLQkJcHJpdmF0ZSB2b2lkIGRlY3JlbWVudChPYmplY3Qgb2JqZWN0KSB7Ci0JCQlpZiAoY29udGFpbnNLZXkob2JqZWN0KSkgewotCQkJCUludGVnZXIgY291bnQgPSBnZXQob2JqZWN0KTsKLQkJCQlpZiAoY291bnQgPT0gMSkgewotCQkJCQkvLyByZW1vdmUgb2JqZWN0Ci0JCQkJCXJlbW92ZShvYmplY3QpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWNvdW50LS07Ci0JCQkJCXB1dChvYmplY3QsIGNvdW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCXByaXZhdGUgdm9pZCBtYXJrQ29udGFpbmVycyhNZXRob2RFbGVtZW50IGUpIHsKLQkJCWZvcihFT2JqZWN0IGNvbnRhaW5lciA9IGUuZUNvbnRhaW5lcigpOyBjb250YWluZXIgIT0gbnVsbDsgY29udGFpbmVyID0gY29udGFpbmVyLmVDb250YWluZXIoKSkgewotCQkJCWluY3JlbWVudChjb250YWluZXIpOwotCQkJfQotCQl9Ci0KLQkJcHJpdmF0ZSB2b2lkIHVubWFya0NvbnRhaW5lcnMoTWV0aG9kRWxlbWVudCBlKSB7Ci0JCQlmb3IoRU9iamVjdCBjb250YWluZXIgPSBlLmVDb250YWluZXIoKTsgY29udGFpbmVyICE9IG51bGw7IGNvbnRhaW5lciA9IGNvbnRhaW5lci5lQ29udGFpbmVyKCkpIHsKLQkJCQlkZWNyZW1lbnQoY29udGFpbmVyKTsKLQkJCX0KLQkJfQotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBDb250YWluZXJNYXAgY29udGFpbmVyc09mTWFya2VkT2JqZWN0cyA9IG5ldyBDb250YWluZXJNYXAoKTsJCi0JCi0JCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRNYXJrZXJJRCgpIHsKLQkJcmV0dXJuIE1BUktFUl9JRDsKLQl9Ci0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnVpLk1hcmtlckhlbHBlciNnZXRGaWxlKG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkkpCi0JICovCi0JcHJvdGVjdGVkIElGaWxlIGdldEZpbGUoVVJJIHVyaSkgewotCQlpZih1cmkuaXNGaWxlKCkpIHsKLQkJCXJldHVybiAoSUZpbGUpIEZpbGVNYW5hZ2VyLmdldFJlc291cmNlRm9yTG9jYXRpb24odXJpLnRvRmlsZVN0cmluZygpKTsKLQkJfQotCSAgICBTdHJpbmcgc2NoZW1lID0gdXJpLnNjaGVtZSgpOwotCSAgICBpZiAoInBsYXRmb3JtIi5lcXVhbHMoc2NoZW1lKSAmJiB1cmkuc2VnbWVudENvdW50KCkgPiAxICYmICJyZXNvdXJjZSIuZXF1YWxzKHVyaS5zZWdtZW50KDApKSkgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JICAgIHsKLQkgICAgICBTdHJpbmdCdWZmZXIgcGxhdGZvcm1SZXNvdXJjZVBhdGggPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JICAgICAgZm9yIChpbnQgaiA9IDEsIHNpemUgPSB1cmkuc2VnbWVudENvdW50KCk7IGogPCBzaXplOyArK2opCi0JICAgICAgewotCSAgICAgICAgcGxhdGZvcm1SZXNvdXJjZVBhdGguYXBwZW5kKCcvJyk7Ci0JICAgICAgICBwbGF0Zm9ybVJlc291cmNlUGF0aC5hcHBlbmQoVVJJLmRlY29kZSh1cmkuc2VnbWVudChqKSkpOwotCSAgICAgIH0KLQkgICAgICByZXR1cm4gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGaWxlKG5ldyBQYXRoKHBsYXRmb3JtUmVzb3VyY2VQYXRoLnRvU3RyaW5nKCkpKTsKLQkgICAgfQotCSAgICByZXR1cm4gbnVsbDsKLQl9Ci0JCQotCS8qKgotCSAqIFVzZWQgYnkgZGVjb3JhdG9ycyB0byBkZXRlcm1pbmUgdG8gcHV0IGFuIGVycm9yIHRpY2sgb24gdGhlIE9iamVjdAotCSAqIEBwYXJhbSBvYmplY3QKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzSW52YWxpZChPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBDb25maWd1cmF0aW9uc0l0ZW1Qcm92aWRlcikgewotCQkJQ29sbGVjdGlvbiBjaGlsZHJlbiA9ICgoQ29uZmlndXJhdGlvbnNJdGVtUHJvdmlkZXIpb2JqZWN0KS5nZXRDaGlsZHJlbihvYmplY3QpOwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gY2hpbGRyZW4uaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IG9iaiA9IFRuZ1V0aWwudW53cmFwKGl0ZXIubmV4dCgpKTsKLQkJCQlpZihjb250YWluZXJzT2ZNYXJrZWRPYmplY3RzLmNvbnRhaW5zS2V5KG9iaikpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQkJCQkKLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgTWV0aG9kQ29uZmlndXJhdGlvbikgewotCQkJCQlpZiAoSU5TVEFOQ0UuaGFzTWFya2VycygoTWV0aG9kQ29uZmlndXJhdGlvbilvYmopKSB7Ci0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBmYWxzZTsKLQkJfSBlbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBNZXRob2RDb25maWd1cmF0aW9uKSB7Ci0JCQlpZiAoSU5TVEFOQ0UuaGFzTWFya2VycygoTWV0aG9kQ29uZmlndXJhdGlvbilvYmplY3QpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGNvbnRhaW5lcnNPZk1hcmtlZE9iamVjdHMuY29udGFpbnNLZXkob2JqZWN0KTsKLQl9Ci0JCSAgICAKLSAgICBwdWJsaWMgdm9pZCBkZWxldGVNYXJrZXIoTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcsIElDb25maWd1cmF0aW9uRXJyb3IgZXJyb3IpIHsKLSAgICAJdHJ5IHsKLQkgICAgCUlNYXJrZXIgbWFya2VyID0gZ2V0TWFya2VyKGNvbmZpZywgZXJyb3IpOwotCSAgICAJaWYgKG1hcmtlciAhPSBudWxsKSB7Ci0JICAgIAkJbWFya2VyLmRlbGV0ZSgpOwotCSAgICAJCWNvbnRhaW5lcnNPZk1hcmtlZE9iamVjdHMudW5tYXJrQ29udGFpbmVycyhjb25maWcpOwotCSAgICAJfQotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJfQotICAgIH0KLQkKLSAgICBwdWJsaWMgSU1hcmtlciBjcmVhdGVNYXJrZXIoTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcsIElDb25maWd1cmF0aW9uRXJyb3IgZXJyb3IpIHsKLS8vICAgIAlpZiAoZXJyb3IuZ2V0RXJyb3JNZXRob2RFbGVtZW50KCkgPT0gbnVsbCkgcmV0dXJuIG51bGw7Ci0vLyAgICAJaWYgKGVycm9yLmdldENhdXNlTWV0aG9kRWxlbWVudCgpID09IG51bGwpIHJldHVybiBudWxsOwotICAgIAkKLSAgICAJSU1hcmtlciBleGlzdGluZ01hcmtlciA9IGdldE1hcmtlcihjb25maWcsIGVycm9yKTsKLSAgICAJaWYgKGV4aXN0aW5nTWFya2VyICE9IG51bGwpIHsKLSAgICAJCWFkanVzdE1hcmtlcihleGlzdGluZ01hcmtlciwgY29uZmlnLCBlcnJvcik7Ci0gICAgCQlyZXR1cm4gZXhpc3RpbmdNYXJrZXI7Ci0gICAgCX0KLSAgICAJdHJ5IHsKLQkgICAgCUlSZXNvdXJjZSByZXNvdXJjZSA9IGdldElSZXNvdXJjZShjb25maWcpOwotCSAgICAJaWYgKHJlc291cmNlICE9IG51bGwgJiYgcmVzb3VyY2UuZXhpc3RzKCkpIHsKLQkgICAgCQlJTWFya2VyIG1hcmtlciA9IHJlc291cmNlLmNyZWF0ZU1hcmtlcihnZXRNYXJrZXJJRCgpKTsKLQkgICAgCQltYXJrZXIuc2V0QXR0cmlidXRlKElERS5FRElUT1JfSURfQVRUUiwgIm9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5Db25maWd1cmF0aW9uRWRpdG9yIik7IC8vJE5PTi1OTFMtMSQKLQkgICAgCQlhZGp1c3RNYXJrZXIobWFya2VyLCBjb25maWcsIGVycm9yKTsKLQkgICAgCQljb250YWluZXJzT2ZNYXJrZWRPYmplY3RzLm1hcmtDb250YWluZXJzKGNvbmZpZyk7Ci0JICAgIAkJcmV0dXJuIG1hcmtlcjsKLQkgICAgCX0KLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIGFkanVzdE1hcmtlcihJTWFya2VyIG1hcmtlciwgTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcsIElDb25maWd1cmF0aW9uRXJyb3IgZXJyb3IpIHsKLSAgICAJaWYgKGNvbmZpZyA9PSBudWxsIHx8IGVycm9yID09IG51bGwpIHJldHVybjsKLSAgICAgICAJdHJ5IHsKLSAgICAgICAJCWlmIChtYXJrZXIgPT0gbnVsbCkgewotICAgICAgIAkJCS8vIHRyeSB0byBmaW5kIG1hcmtlcgotICAgICAgIAkJCW1hcmtlciA9IGdldE1hcmtlcihjb25maWcsIGVycm9yKTsKLSAgICAgICAJCX0KLSAgICAgICAJCWlmIChtYXJrZXIgPT0gbnVsbCkgcmV0dXJuOwotCQkJbWFya2VyLnNldEF0dHJpYnV0ZShJTWFya2VyLlNFVkVSSVRZLCBlcnJvci5nZXRTZXZlcml0eSgpKTsKLQkgICAgCVN0cmluZyBtZXNzYWdlID0gZ2V0TWVzc2FnZShlcnJvcik7Ci0JCQltYXJrZXIuc2V0QXR0cmlidXRlKElNYXJrZXIuTUVTU0FHRSwgbWVzc2FnZSk7Ci0JCQltYXJrZXIuc2V0QXR0cmlidXRlKElNYXJrZXIuTElORV9OVU1CRVIsIDApOwotCQkJbWFya2VyLnNldEF0dHJpYnV0ZShBVFRSX0NPTkZJR19HVUlELCBjb25maWcuZ2V0R3VpZCgpKTsKLQkJCW1hcmtlci5zZXRBdHRyaWJ1dGUoQVRUUl9FUlJPUl9JRCwgZXJyb3IuZ2V0SWQoKSk7Ci0JCQltYXJrZXIuc2V0QXR0cmlidXRlKEFUVFJfTUVTU0FHRV9JRCwgZXJyb3IuZ2V0TWVzc2FnZUlkKCkpOwotCQkJCi0JICAgIAlpZiAoZXJyb3IuZ2V0RXJyb3JNZXRob2RFbGVtZW50KCkgIT0gbnVsbCkgewotCQkJCW1hcmtlci5zZXRBdHRyaWJ1dGUoSU1hcmtlci5MT0NBVElPTiwgVG5nVXRpbC5nZXRMYWJlbFdpdGhQYXRoKGVycm9yLmdldEVycm9yTWV0aG9kRWxlbWVudCgpKSk7Ci0JCQkJbWFya2VyLnNldEF0dHJpYnV0ZShBVFRSX0VSUk9SX0VMRU1FTlRfR1VJRCwgZXJyb3IuZ2V0RXJyb3JNZXRob2RFbGVtZW50KCkuZ2V0R3VpZCgpKTsKLQkJCQltYXJrZXIuc2V0QXR0cmlidXRlKE1hcmtlclZpZXdVdGlsLk5BTUVfQVRUUklCVVRFLCBlcnJvci5nZXRFcnJvck1ldGhvZEVsZW1lbnQoKS5nZXROYW1lKCkpOwotCSAgICAJfQotCSAgICAJaWYgKGVycm9yLmdldENhdXNlTWV0aG9kRWxlbWVudCgpICE9IG51bGwpIHsKLQkgICAgCQltYXJrZXIuc2V0QXR0cmlidXRlKEFUVFJfQ0FVU0VfRUxFTUVOVF9HVUlELCBlcnJvci5nZXRDYXVzZU1ldGhvZEVsZW1lbnQoKS5nZXRHdWlkKCkpOwotCSAgICAJfQotCSAgICAJCi0JCQlJTWFya2VyQXR0cmlidXRlQ29udHJpYnV0ZXIgYXR0QWRkZXIgPSBFeHRlbnNpb25IZWxwZXIuZ2V0TWFya2VyQXR0cmlidXRlQ29udHJpYnV0ZXIoKTsKLQkJCWlmIChhdHRBZGRlciAhPSBudWxsKSB7Ci0JCQkJYXR0QWRkZXIuYWRkQWRkdGlvbmFsQXR0cmlidXRlcyhtYXJrZXIsIGVycm9yKTsKLQkJCX0KLQkJCQotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJfQotICAgfQotICAgIAkKLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNNYXJrZXIoTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcsIElDb25maWd1cmF0aW9uRXJyb3IgZXJyb3IpIHsKLQkJaWYgKGdldE1hcmtlcihjb25maWcsIGVycm9yKSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotICAgCQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIAotICAgIC8qKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgYSBtYWtlciB3aXRoIGlkIGVxdWFscyB0byB0aGUgcmV0dXJuIG9mIHtAbGluayAjZ2V0TWFya2VySUQoKX0gICAgICAgICAgICAgIAotICAgICAqIGlzIGF2YWlsYWJsZSBpbiB0aGUgSVJlc291cmNlIGNvbXB1dGVkIGZyb20gdGhlIHNwZWNpZmllZCBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAqIEBwYXJhbSBvYmplY3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAqIEByZXR1cm4gYm9vbGVhbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGhhc01hcmtlcnMoTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLSAgICAJSVJlc291cmNlIHJlc291cmNlID0gZ2V0SVJlc291cmNlKGNvbmZpZyk7Ci0gICAgICAgIGlmIChyZXNvdXJjZSAhPSBudWxsICYmIHJlc291cmNlLmV4aXN0cygpKSB7Ci0gICAgICAgIAl0cnkgewotCQkJCUlNYXJrZXJbXSBtYXJrZXJzID0gcmVzb3VyY2UuZmluZE1hcmtlcnMoZ2V0TWFya2VySUQoKSwgdHJ1ZSwgSVJlc291cmNlLkRFUFRIX1pFUk8pOwotCQkJCXJldHVybiBtYXJrZXJzLmxlbmd0aCA+IDA7Ci0JICAJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCX0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBJTWFya2VyIGdldE1hcmtlcihNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZywgSUNvbmZpZ3VyYXRpb25FcnJvciBlcnJvcikgewotICAgIAlpZiAoY29uZmlnID09IG51bGwgfHwgZXJyb3IgPT0gbnVsbCkgewotICAgIAkJcmV0dXJuIG51bGw7Ci0gICAgCX0KLSAgICAJdHJ5IHsKLQkgICAgCUlSZXNvdXJjZSByZXNvdXJjZSA9IGdldElSZXNvdXJjZShjb25maWcpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICAgICAgICBpZiAocmVzb3VyY2UgIT0gbnVsbCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JCQkJSU1hcmtlcltdIG1hcmtlcnMgPSByZXNvdXJjZS5maW5kTWFya2VycyhnZXRNYXJrZXJJRCgpLCBmYWxzZSwgSVJlc291cmNlLkRFUFRIX1pFUk8pOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbWFya2Vycy5sZW5ndGg7IGkrKykgewotCQkJCQlJTWFya2VyIG1hcmtlciA9IG1hcmtlcnNbaV07Ci0JCQkJCVN0cmluZyBtYXJrZXJFcnJvcklkID0gKFN0cmluZykgbWFya2VyLmdldEF0dHJpYnV0ZShBVFRSX0VSUk9SX0lEKTsKLQkJCQkJaWYgKGVycm9yLmdldElkKCkuZXF1YWxzKG1hcmtlckVycm9ySWQpKSB7Ci0JCQkJCQlyZXR1cm4gbWFya2VyOwotCQkJCQl9Ci0JCQkJfQotCSAgICAgICAgfQotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0TWVzc2FnZShJQ29uZmlndXJhdGlvbkVycm9yIGVycm9yKSB7Ci0gICAgCXJldHVybiBlcnJvci5nZXRFcnJvck1lc3NhZ2UoKTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBJUmVzb3VyY2UgZ2V0SVJlc291cmNlKE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0gICAgCVJlc291cmNlIHJlc291cmNlID0gY29uZmlnLmVSZXNvdXJjZSgpOwotICAgICAgICBVUkkgdXJpID0gcmVzb3VyY2UuZ2V0VVJJKCk7Ci0gICAgICAgIHVyaSA9IHJlc291cmNlLmdldFJlc291cmNlU2V0KCkuZ2V0VVJJQ29udmVydGVyKCkubm9ybWFsaXplKHVyaSk7Ci0gICAgICAgIHJldHVybiBnZXRGaWxlKHVyaSk7Ci0KLSAgICB9Ci0JCi0JcHVibGljIE1ldGhvZENvbmZpZ3VyYXRpb24gZ2V0Q29uZmlnKElNYXJrZXIgbWFya2VyKSB7Ci0JCWlmIChtYXJrZXIgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJdHJ5IHsKLQkJCVN0cmluZyBjb25maWdHdWlkID0gKFN0cmluZykgbWFya2VyLmdldEF0dHJpYnV0ZShBVFRSX0NPTkZJR19HVUlEKTsKLQkJCU1ldGhvZEVsZW1lbnQgZSA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudExpYnJhcnlNYW5hZ2VyKCkuZ2V0TWV0aG9kRWxlbWVudChjb25maWdHdWlkKTsKLQkJCWlmIChlIGluc3RhbmNlb2YgTWV0aG9kQ29uZmlndXJhdGlvbikgewotCQkJCXJldHVybiAoTWV0aG9kQ29uZmlndXJhdGlvbillOwotCQkJfQotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIE1ldGhvZEVsZW1lbnQgZ2V0RXJyb3JNZXRob2RFbGVtZW50KElNYXJrZXIgbWFya2VyKSB7Ci0JCWlmIChtYXJrZXIgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJdHJ5IHsKLQkJCVN0cmluZyBlcnJvckd1aWQgPSAoU3RyaW5nKSBtYXJrZXIuZ2V0QXR0cmlidXRlKEFUVFJfRVJST1JfRUxFTUVOVF9HVUlEKTsKLQkJCWlmIChlcnJvckd1aWQgIT0gbnVsbCkgewotCQkJCU1ldGhvZEVsZW1lbnQgZSA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudExpYnJhcnlNYW5hZ2VyKCkuZ2V0TWV0aG9kRWxlbWVudChlcnJvckd1aWQpOwotCQkJCWlmIChlIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJCQlyZXR1cm4gKE1ldGhvZEVsZW1lbnQpZTsKLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBNZXRob2RFbGVtZW50IGdldENhdXNlTWV0aG9kRWxlbWVudChJTWFya2VyIG1hcmtlcikgewotCQlpZiAobWFya2VyID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXRyeSB7Ci0JCQlTdHJpbmcgY2F1c2VHdWlkID0gKFN0cmluZykgbWFya2VyLmdldEF0dHJpYnV0ZShBVFRSX0NBVVNFX0VMRU1FTlRfR1VJRCk7Ci0JCQlpZiAoY2F1c2VHdWlkICE9IG51bGwpIHsKLQkJCQlNZXRob2RFbGVtZW50IGUgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRMaWJyYXJ5TWFuYWdlcigpLmdldE1ldGhvZEVsZW1lbnQoY2F1c2VHdWlkKTsKLQkJCQlpZiAoZSBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCQkJcmV0dXJuIChNZXRob2RFbGVtZW50KWU7Ci0JCQkJfQotCQkJfQotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvdXRpbC9Db25maWd1cmF0aW9uTWFya2VyUmVzb2x1dGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS91dGlsL0NvbmZpZ3VyYXRpb25NYXJrZXJSZXNvbHV0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyYzI2NTIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS91dGlsL0NvbmZpZ3VyYXRpb25NYXJrZXJSZXNvbHV0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLkNvbmZpZ3VyYXRpb25FZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLkVkaXRvckNob29zZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLnV0aWwuUGVyc2lzdGVuY2VVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSU1hcmtlclJlc29sdXRpb247Ci0KLS8qKgotICogIE1hcmtlclJlc29sdXRpb24gZm9yIENvbmZpZ3VyYXRpb24gZXJyb3JzCi0gKiBAYXV0aG9yIEplZmYgSGFyZHkKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKgotICovCi1wdWJsaWMgY2xhc3MgQ29uZmlndXJhdGlvbk1hcmtlclJlc29sdXRpb24gaW1wbGVtZW50cyBJTWFya2VyUmVzb2x1dGlvbiB7Ci0JCi0JcHJvdGVjdGVkIE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnOwotCQotCXByb3RlY3RlZCBNZXRob2RFbGVtZW50IGVycm9yRWxlbWVudDsKLQotCXByb3RlY3RlZCBNZXRob2RFbGVtZW50IGNhdXNlRWxlbWVudDsKLQotCXB1YmxpYyBDb25maWd1cmF0aW9uTWFya2VyUmVzb2x1dGlvbihNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZywgTWV0aG9kRWxlbWVudCBlcnJvckVsZW1lbnQsIE1ldGhvZEVsZW1lbnQgY2F1c2VFbGVtZW50KSB7Ci0JCXRoaXMuY29uZmlnID0gY29uZmlnOwotCQl0aGlzLmVycm9yRWxlbWVudCA9IGVycm9yRWxlbWVudDsKLQkJdGhpcy5jYXVzZUVsZW1lbnQgPSBjYXVzZUVsZW1lbnQ7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRMYWJlbCgpIHsKLQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLkNvbmZpZ3VyYXRpb25NYXJrZXJSZXNvbHV0aW9uR2VuZXJhdG9yX3Jlc29sdmVNaXNzaW5nUmVmZXJlbmNlOwotCX0KLQotCXB1YmxpYyB2b2lkIHJ1bihJTWFya2VyIG1hcmtlcikgewotCQkvL1N5c3RlbS5vdXQucHJpbnRsbigicXVpY2sgZml4IG1lIik7Ci0JCXRyeSB7Ci0JCQkgICAvLyBnZXQgdGhlIG1hcmtlciByZXNvdXJjZSBmaWxlCi0JICAgICAgICBpZiAoKG1hcmtlci5nZXRSZXNvdXJjZSgpIGluc3RhbmNlb2YgSUZpbGUpKSB7Ci0JICAgICAgCi0JICAgICAgICAJSUZpbGUgZmlsZSA9IChJRmlsZSkgbWFya2VyLmdldFJlc291cmNlKCk7Ci0JICAgICAgICAJCi0JICAgICAgICAJUmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCkuZVJlc291cmNlKCkuZ2V0UmVzb3VyY2VTZXQoKTsKLQkgICAgICAgIAlNZXRob2RFbGVtZW50IGNvbmZpZyA9IFBlcnNpc3RlbmNlVXRpbC5nZXRNZXRob2RFbGVtZW50KGZpbGUsIHJlc291cmNlU2V0KTsKLQkgICAgICAgIAlJRWRpdG9yUGFydCBlZGl0b3IgPSBFZGl0b3JDaG9vc2VyLmdldEluc3RhbmNlKCkuZmluZEVkaXRvcihjb25maWcpOwotCSAgICAgICAgCWlmICggZWRpdG9yIGluc3RhbmNlb2YgQ29uZmlndXJhdGlvbkVkaXRvciApIHsKLQkgICAgICAgIAkJKChDb25maWd1cmF0aW9uRWRpdG9yKWVkaXRvcikuZG9RdWlja0ZpeChtYXJrZXIpOwotCSAgICAgICAgCX0KLQkgICAgICAgIAkKLQkgICAgICAgIH0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4ICkgewotCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGV4KTsKLQkJfQotICAgICAgICAKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvdXRpbC9Db25maWd1cmF0aW9uTWFya2VyUmVzb2x1dGlvbkdlbmVyYXRvci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS91dGlsL0NvbmZpZ3VyYXRpb25NYXJrZXJSZXNvbHV0aW9uR2VuZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0OTZkNjcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS91dGlsL0NvbmZpZ3VyYXRpb25NYXJrZXJSZXNvbHV0aW9uR2VuZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JTWFya2VyUmVzb2x1dGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JTWFya2VyUmVzb2x1dGlvbkdlbmVyYXRvcjsKLQotLyoqCi0gKiBHZW5lcmF0ZXMgQ29uZmlndXJhdGlvbk1hcmtlclJlc29sdXRpb24ncwotICogQGF1dGhvciBKZWZmIEhhcmR5Ci0gKgotICovCi1wdWJsaWMgY2xhc3MgQ29uZmlndXJhdGlvbk1hcmtlclJlc29sdXRpb25HZW5lcmF0b3IgaW1wbGVtZW50cyBJTWFya2VyUmVzb2x1dGlvbkdlbmVyYXRvciB7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSU1hcmtlclJlc29sdXRpb25bXSBFTVBUWV9SRVNPTFVUSU9OUyA9IG5ldyBJTWFya2VyUmVzb2x1dGlvblswXTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIENvbmZpZ3VyYXRpb25NYXJrZXJIZWxwZXIgbWFya2VySGVscGVyID0gQ29uZmlndXJhdGlvbk1hcmtlckhlbHBlci5JTlNUQU5DRTsKLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklNYXJrZXJSZXNvbHV0aW9uR2VuZXJhdG9yI2dldFJlc29sdXRpb25zKG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXIpCi0JICovCi0JcHVibGljIElNYXJrZXJSZXNvbHV0aW9uW10gZ2V0UmVzb2x1dGlvbnMoSU1hcmtlciBtYXJrZXIpIHsKLQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSBtYXJrZXJIZWxwZXIuZ2V0Q29uZmlnKG1hcmtlcik7Ci0JCU1ldGhvZEVsZW1lbnQgZXJyb3JFbGVtZW50ID0gbWFya2VySGVscGVyLmdldEVycm9yTWV0aG9kRWxlbWVudChtYXJrZXIpOwotCQlNZXRob2RFbGVtZW50IGNhdXNlRWxlbWVudCA9IG1hcmtlckhlbHBlci5nZXRDYXVzZU1ldGhvZEVsZW1lbnQobWFya2VyKTsKLQkJdHJ5IHsKLQkJCQotCQkJLy8gY3JlYXRlIE1hcmtlclJlc29sdXRpb25zCi0JCQlyZXR1cm4gbmV3IElNYXJrZXJSZXNvbHV0aW9uW10ge25ldyBDb25maWd1cmF0aW9uTWFya2VyUmVzb2x1dGlvbihjb25maWcsIGVycm9yRWxlbWVudCwgY2F1c2VFbGVtZW50KX07Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCX0KLQkJcmV0dXJuIEVNUFRZX1JFU09MVVRJT05TOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvdXRpbC9FZGl0b3JzQ29udGV4dEhlbHBlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS91dGlsL0VkaXRvcnNDb250ZXh0SGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1MDg3MmUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS91dGlsL0VkaXRvcnNDb250ZXh0SGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSUhlbHBDb250ZXh0czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLkxpYnJhcnlVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DdXN0b21DYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpc2NpcGxpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaXNjaXBsaW5lR3JvdXBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Eb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HdWlkYW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVTZXRHcm91cGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Ub29sOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotCi0vKioKLSAqIEVkaXRvcnMgY29udGV4dCBoZWxwZXIKLSAqIAotICogQGF1dGhvciBCaW5nWHVlIFh1Ci0gKiBAc2luY2UgMS4wCi0gKgotICovCi1wdWJsaWMgY2xhc3MgRWRpdG9yc0NvbnRleHRIZWxwZXIgewotCi0JLyoqCi0JICogU2V0IGNvbnRleHQgaGVscCBmb3IgbWV0aG9kIGVsZW1lbnQKLQkgKiBAcGFyYW0gdWlDb21wb3NpdGUKLQkgKiBAcGFyYW0gb2JqCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldEhlbHAoQ29udHJvbCB1aUNvbXBvc2l0ZSwgT2JqZWN0IG9iaikgewotCQlpZiAob2JqID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJb2JqID0gTGlicmFyeVV0aWwudW53cmFwKG9iaik7Ci0KLQkJaWYgKChvYmogaW5zdGFuY2VvZiBSb2xlKSkgewotCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscCh1aUNvbXBvc2l0ZSwKLQkJCQkJQXV0aG9yaW5nVUlIZWxwQ29udGV4dHMuRURJVE9SX1JPTEVfQ09OVEVYVF9IRUxQX0lEKTsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAoKG9iaiBpbnN0YW5jZW9mIFRhc2spKSB7Ci0JCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHVpQ29tcG9zaXRlLAotCQkJCQlBdXRob3JpbmdVSUhlbHBDb250ZXh0cy5FRElUT1JfVEFTS19DT05URVhUX0hFTFBfSUQpOwotCQkJcmV0dXJuOwotCQl9Ci0JCWlmICgob2JqIGluc3RhbmNlb2YgV29ya1Byb2R1Y3QpKSB7Ci0JCQlQbGF0Zm9ybVVJCi0JCQkJCS5nZXRXb3JrYmVuY2goKQotCQkJCQkuZ2V0SGVscFN5c3RlbSgpCi0JCQkJCS5zZXRIZWxwKAotCQkJCQkJCXVpQ29tcG9zaXRlLAotCQkJCQkJCUF1dGhvcmluZ1VJSGVscENvbnRleHRzLkVESVRPUl9XT1JLX1BST0RVQ1RfQ09OVEVYVF9IRUxQX0lEKTsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAoKG9iaiBpbnN0YW5jZW9mIEd1aWRhbmNlKSkgewotCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscCh1aUNvbXBvc2l0ZSwKLQkJCQkJQXV0aG9yaW5nVUlIZWxwQ29udGV4dHMuRURJVE9SX0dVSURBTkNFX0NPTlRFWFRfSEVMUF9JRCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKChvYmogaW5zdGFuY2VvZiBEaXNjaXBsaW5lKSkgewotCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscCh1aUNvbXBvc2l0ZSwKLQkJCQkJQXV0aG9yaW5nVUlIZWxwQ29udGV4dHMuRURJVE9SX0RJU0NJUExJTkVfQ09OVEVYVF9IRUxQX0lEKTsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAoKG9iaiBpbnN0YW5jZW9mIERpc2NpcGxpbmVHcm91cGluZykpIHsKLQkJCVBsYXRmb3JtVUkKLQkJCQkJLmdldFdvcmtiZW5jaCgpCi0JCQkJCS5nZXRIZWxwU3lzdGVtKCkKLQkJCQkJLnNldEhlbHAoCi0JCQkJCQkJdWlDb21wb3NpdGUsCi0JCQkJCQkJQXV0aG9yaW5nVUlIZWxwQ29udGV4dHMuRURJVE9SX0RJU0NJUExJTkVfR1JPVVBJTkdfQ09OVEVYVF9IRUxQX0lEKTsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAoKG9iaiBpbnN0YW5jZW9mIERvbWFpbikpIHsKLQkJCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAodWlDb21wb3NpdGUsCi0JCQkJCUF1dGhvcmluZ1VJSGVscENvbnRleHRzLkVESVRPUl9ET01BSU5fQ09OVEVYVF9IRUxQX0lEKTsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAoKG9iaiBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0VHlwZSkpIHsKLQkJCVBsYXRmb3JtVUkKLQkJCQkJLmdldFdvcmtiZW5jaCgpCi0JCQkJCS5nZXRIZWxwU3lzdGVtKCkKLQkJCQkJLnNldEhlbHAoCi0JCQkJCQkJdWlDb21wb3NpdGUsCi0JCQkJCQkJQXV0aG9yaW5nVUlIZWxwQ29udGV4dHMuRURJVE9SX1dPUktfUFJPRFVDVF9UWVBFX0NPTlRFWFRfSEVMUF9JRCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKChvYmogaW5zdGFuY2VvZiBSb2xlU2V0KSkgewotCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscCh1aUNvbXBvc2l0ZSwKLQkJCQkJQXV0aG9yaW5nVUlIZWxwQ29udGV4dHMuRURJVE9SX1JPTEVfU0VUX0NPTlRFWFRfSEVMUF9JRCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKChvYmogaW5zdGFuY2VvZiBSb2xlU2V0R3JvdXBpbmcpKSB7Ci0JCQlQbGF0Zm9ybVVJCi0JCQkJCS5nZXRXb3JrYmVuY2goKQotCQkJCQkuZ2V0SGVscFN5c3RlbSgpCi0JCQkJCS5zZXRIZWxwKAotCQkJCQkJCXVpQ29tcG9zaXRlLAotCQkJCQkJCUF1dGhvcmluZ1VJSGVscENvbnRleHRzLkVESVRPUl9ST0xTRV9TRVRfR1JPVVBJTkdfQ09OVEVYVF9IRUxQX0lEKTsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAoKG9iaiBpbnN0YW5jZW9mIFRvb2wpKSB7Ci0JCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHVpQ29tcG9zaXRlLAotCQkJCQlBdXRob3JpbmdVSUhlbHBDb250ZXh0cy5FRElUT1JfVE9PTF9DT05URVhUX0hFTFBfSUQpOwotCQkJcmV0dXJuOwotCQl9Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBDdXN0b21DYXRlZ29yeSkgewotCQkJUGxhdGZvcm1VSQotCQkJCQkuZ2V0V29ya2JlbmNoKCkKLQkJCQkJLmdldEhlbHBTeXN0ZW0oKQotCQkJCQkuc2V0SGVscCgKLQkJCQkJCQl1aUNvbXBvc2l0ZSwKLQkJCQkJCQlBdXRob3JpbmdVSUhlbHBDb250ZXh0cy5FRElUT1JfQ1VTVE9NX0NBVEVHT1JZX0NPTlRFWFRfSEVMUF9JRCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKChvYmogaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pKSB7Ci0JCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHVpQ29tcG9zaXRlLAotCQkJCQlBdXRob3JpbmdVSUhlbHBDb250ZXh0cy5QTFVHSU5fRURJVE9SX0RFU0NSSVBUSU9OX0FMTF9DT05URVhUKTsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAob2JqIGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UpIHsKLQkJCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAodWlDb21wb3NpdGUsCi0JCQkJCUF1dGhvcmluZ1VJSGVscENvbnRleHRzLkNPTlRFTlRfUEFDS0FHRV9FRElUT1JfQUxMX0NPTlRFWFQpOwotCQkJcmV0dXJuOwotCQl9Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBNZXRob2RDb25maWd1cmF0aW9uKSB7Ci0JCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHVpQ29tcG9zaXRlLAotCQkJCQlBdXRob3JpbmdVSUhlbHBDb250ZXh0cy5DT05GSUdVUkFUSU9OX0VESVRPUl9BTExfQ09OVEVYVCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JfQotCi0JLyoqCi0JICogU2V0IGNvbnRleHQgaGVscCBmb3IgcHJvY2VzcyB0eXBlCi0JICogCi0JICogQHBhcmFtIHVpQ29tcG9zaXRlCi0JICogQHBhcmFtIHByb2NUeXBlCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldEhlbHAoQ29udHJvbCB1aUNvbXBvc2l0ZSwgU3RyaW5nIHByb2NUeXBlKSB7Ci0JCWlmICgocHJvY1R5cGUgIT0gbnVsbCAmJiBwcm9jVHlwZQotCQkJCS5lcXVhbHNJZ25vcmVDYXNlKCJjYXBhYmlsaXR5IHBhdHRlcm4iKSkpIHsgLy8kTk9OLU5MUy0xJAotCQkJUGxhdGZvcm1VSQotCQkJCQkuZ2V0V29ya2JlbmNoKCkKLQkJCQkJLmdldEhlbHBTeXN0ZW0oKQotCQkJCQkuc2V0SGVscCgKLQkJCQkJCQl1aUNvbXBvc2l0ZSwKLQkJCQkJCQlBdXRob3JpbmdVSUhlbHBDb250ZXh0cy5FRElUT1JfQ1BfREVTQ1JJUFRJT05fQ09OVEVYVF9IRUxQX0lEKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCWlmICgocHJvY1R5cGUgIT0gbnVsbCAmJiBwcm9jVHlwZS5lcXVhbHNJZ25vcmVDYXNlKCJkZWxpdmVyeSBwcm9jZXNzIikpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCVBsYXRmb3JtVUkKLQkJCQkJLmdldFdvcmtiZW5jaCgpCi0JCQkJCS5nZXRIZWxwU3lzdGVtKCkKLQkJCQkJLnNldEhlbHAoCi0JCQkJCQkJdWlDb21wb3NpdGUsCi0JCQkJCQkJQXV0aG9yaW5nVUlIZWxwQ29udGV4dHMuRURJVE9SX0RQX0RFU0NSSVBUSU9OX0NPTlRFWFRfSEVMUF9JRCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHVpQ29tcG9zaXRlLAotCQkJCUF1dGhvcmluZ1VJSGVscENvbnRleHRzLkVESVRPUl9EUF9ERVNDUklQVElPTl9DT05URVhUX0hFTFBfSUQpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS91dGlsL0xpYnJhcnlQcm9ibGVtTWFya2VyUmVzb2x1dGlvbkdlbmVyYXRvci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS91dGlsL0xpYnJhcnlQcm9ibGVtTWFya2VyUmVzb2x1dGlvbkdlbmVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYzdhNDdmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvdXRpbC9MaWJyYXJ5UHJvYmxlbU1hcmtlclJlc29sdXRpb25HZW5lcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxMCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5JTGlicmFyeU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2VVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uY2xvc3VyZS5Db25maWd1cmF0aW9uQ2xvc3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuZWxlbWVudHMuQWJzdHJhY3RQcm9jZXNzRWxlbWVudExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLkxpYnJhcnlQcm9ibGVtTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VydmljZXMuSUxpYnJhcnlQZXJzaXN0ZXIuRmFpbFNhZmVNZXRob2RMaWJyYXJ5UGVyc2lzdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklNYXJrZXJSZXNvbHV0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklNYXJrZXJSZXNvbHV0aW9uR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLm1hcmtlcnMuV29ya2JlbmNoTWFya2VyUmVzb2x1dGlvbjsKLQotLyoqCi0gKiBHZW5lcmF0ZXMgTGlicmFyeVByb2JsZW1NYXJrZXJSZXNvbHV0aW9uJ3MKLSAqIEBhdXRob3IgV2VpcGluZyBMdQotICogQHNpbmNlICAxLjUKLSAqLwotcHVibGljIGNsYXNzIExpYnJhcnlQcm9ibGVtTWFya2VyUmVzb2x1dGlvbkdlbmVyYXRvciBpbXBsZW1lbnRzIElNYXJrZXJSZXNvbHV0aW9uR2VuZXJhdG9yIHsKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBJTWFya2VyUmVzb2x1dGlvbltdIEVNUFRZX1JFU09MVVRJT05TID0gbmV3IElNYXJrZXJSZXNvbHV0aW9uWzBdOwotCQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gbG9jYWxEZWJ1ZyA9IHRydWU7Ci0KLQlwdWJsaWMgSU1hcmtlclJlc29sdXRpb25bXSBnZXRSZXNvbHV0aW9ucyhJTWFya2VyIG1hcmtlcikgewotCQl0cnkgewotCQkJaWYgKG1hcmtlci5nZXRUeXBlKCkgPT0gTGlicmFyeVByb2JsZW1Nb25pdG9yLlVucmVzb2x2ZWRCYXNlZFBsdWdpbk1BUktFUl9JRCkgewotCQkJCXJldHVybiBuZXcgSU1hcmtlclJlc29sdXRpb25bXSB7Ci0JCQkJCQluZXcgTWlzc2luZ1BsdWdpblJlc29sdXRpb24obWFya2VyKSwKLQkJCQkJCX07Ci0JCQl9IGVsc2UgaWYgKG1hcmtlci5nZXRUeXBlKCkgPT0gQ29uZmlndXJhdGlvbkNsb3N1cmUubXVsdGlwbGVSZXBsYWNlcnNNQVJLRVJfSUQpIHsKLQkJCQlyZXR1cm4gbmV3IElNYXJrZXJSZXNvbHV0aW9uW10gewotCQkJCQkJbmV3IE11bHRpcGxlUmVwbGFjZXJSZXNvbHV0aW9uKG1hcmtlciksCi0JCQkJCQl9OwotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQl9Ci0JCXJldHVybiBFTVBUWV9SRVNPTFVUSU9OUzsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGFic3RyYWN0IGNsYXNzIExpYnJhcnlQcm9ibGVtTWFya2VyUmVzb2x1dGlvbiBleHRlbmRzIFdvcmtiZW5jaE1hcmtlclJlc29sdXRpb24gewotCQlwcml2YXRlIElNYXJrZXIgY3VycmVudE1hcmtlcjsKLQotCQlwdWJsaWMgTGlicmFyeVByb2JsZW1NYXJrZXJSZXNvbHV0aW9uKElNYXJrZXIgY3VycmVudE1hcmtlcikgewotCQkJdGhpcy5jdXJyZW50TWFya2VyID0gY3VycmVudE1hcmtlcjsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgSU1hcmtlcltdIGZpbmRPdGhlck1hcmtlcnMoSU1hcmtlcltdIG1hcmtlcnMpIHsKLQkJCUFycmF5TGlzdDxJTWFya2VyPiBzaW1pbGFyTWFya2VyTGlzdCA9IG5ldyBBcnJheUxpc3Q8SU1hcmtlcj4oKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbWFya2Vycy5sZW5ndGg7IGkrKykgewotCQkJCUlNYXJrZXIgbWFya2VyID0gbWFya2Vyc1tpXTsKLQkJCQlpZighIGN1cnJlbnRNYXJrZXIuZXF1YWxzKG1hcmtlcikpIHsKLQkJCQkJaWYoYWNjZXB0ZWRUeXBlKG1hcmtlcikpIHsKLQkJCQkJCXNpbWlsYXJNYXJrZXJMaXN0LmFkZChtYXJrZXIpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJSU1hcmtlcltdIHNpbWlsYXJNYXJrZXJzID0gbmV3IElNYXJrZXJbc2ltaWxhck1hcmtlckxpc3Quc2l6ZSgpXTsKLQkJCXNpbWlsYXJNYXJrZXJMaXN0LnRvQXJyYXkoc2ltaWxhck1hcmtlcnMpOwotCQkJcmV0dXJuIHNpbWlsYXJNYXJrZXJzOwotCQl9Ci0JCQotCQlwcm90ZWN0ZWQgYWJzdHJhY3QgYm9vbGVhbiBhY2NlcHRlZFR5cGUoSU1hcmtlciBtYXJrZXIpOwotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7Ci0JCQkvLyBUT0RPIHByb3ZpZGUgZGV0YWlsZWQgZGVzY3JpcHRpb24KLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJcHVibGljIEltYWdlIGdldEltYWdlKCkgewotCQkJLy8gVE9ETyBwcm92aWRlIGltYWdlCi0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQkJCQotCQlwcm90ZWN0ZWQgdm9pZCBzYXZlKFNldDxSZXNvdXJjZT4gcmVzb3VyZXNUb1NhdmUpIHsKLQkJCWlmIChyZXNvdXJlc1RvU2F2ZSA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJRmFpbFNhZmVNZXRob2RMaWJyYXJ5UGVyc2lzdGVyIHBlcnNpc3RlciA9IExpYnJhcnlTZXJ2aWNlVXRpbC5nZXRDdXJyZW50UGVyc2lzdGVyKCkuZ2V0RmFpbFNhZmVQZXJzaXN0ZXIoKTsJCQkKLQkJCWZvciAoUmVzb3VyY2UgcmVzOiByZXNvdXJlc1RvU2F2ZSkgewotCQkJCXRyeSB7Ci0JCQkJCXBlcnNpc3Rlci5zYXZlKHJlcyk7Ci0JCQkJCXBlcnNpc3Rlci5jb21taXQoKTsKLQkJCQl9IGNhdGNoKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCQkJcGVyc2lzdGVyLnJvbGxiYWNrKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCX0KLQkJCQotCXByaXZhdGUgc3RhdGljIGNsYXNzIE1pc3NpbmdQbHVnaW5SZXNvbHV0aW9uIGV4dGVuZHMgTGlicmFyeVByb2JsZW1NYXJrZXJSZXNvbHV0aW9uIHsKLQkJCi0JCXB1YmxpYyBNaXNzaW5nUGx1Z2luUmVzb2x1dGlvbihJTWFya2VyIGN1cnJlbnRNYXJrZXIpIHsKLQkJCXN1cGVyKGN1cnJlbnRNYXJrZXIpOwotCQl9Ci0JCQotCQkvKioKLQkJICogQHNlZSBvcmcuZWNsaXBzZS51aS5JTWFya2VyUmVzb2x1dGlvbiNnZXRMYWJlbCgpCi0JCSAqLwotCQlwdWJsaWMgU3RyaW5nIGdldExhYmVsKCkgewotCQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLkxwbVJlc29sdXRpb25HZW5lcmF0b3JfcmVtb3ZlVW5yZXNvbHZlZEJhc2VQbHVnaW5zOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgcnVuKElNYXJrZXIgbWFya2VyKSB7CQkJCi0JCQlMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmdldExpYnJhcnlQcm9ibGVtTW9uaXRvcigpLmZpeFByb2JsZW0obWFya2VyKTsKLQkJfQotCi0JCXByb3RlY3RlZCBib29sZWFuIGFjY2VwdGVkVHlwZShJTWFya2VyIG1hcmtlcikgewotCQkJYm9vbGVhbiByZXQgPSBmYWxzZTsKLQkJCXRyeSB7Ci0JCQkJcmV0ID0gTGlicmFyeVByb2JsZW1Nb25pdG9yLlVucmVzb2x2ZWRCYXNlZFBsdWdpbk1BUktFUl9JRC5lcXVhbHMobWFya2VyLmdldFR5cGUoKSk7Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQl9Ci0JCQkKLQkJCXJldHVybiByZXQ7Ci0JCX0KLQkJCi0JfQotCQotCQotCXByaXZhdGUgc3RhdGljIGNsYXNzIE11bHRpcGxlUmVwbGFjZXJSZXNvbHV0aW9uIGV4dGVuZHMgTGlicmFyeVByb2JsZW1NYXJrZXJSZXNvbHV0aW9uIHsKLQkJCi0JCXB1YmxpYyBNdWx0aXBsZVJlcGxhY2VyUmVzb2x1dGlvbihJTWFya2VyIGN1cnJlbnRNYXJrZXIpIHsKLQkJCXN1cGVyKGN1cnJlbnRNYXJrZXIpOwotCQl9Ci0JCQotCQkvKioKLQkJICogQHNlZSBvcmcuZWNsaXBzZS51aS5JTWFya2VyUmVzb2x1dGlvbiNnZXRMYWJlbCgpCi0JCSAqLwotCQlwdWJsaWMgU3RyaW5nIGdldExhYmVsKCkgewotCQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLkxwbVJlc29sdXRpb25HZW5lcmF0b3JfcmVtb3ZlTXVsdGlwbGVSZXBhY2VyczsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHJ1bihJTWFya2VyIG1hcmtlcikgewotCQkJdHJ5IHsKLQkJCQlJTGlicmFyeU1hbmFnZXIgbGliTWdyID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TGlicmFyeU1hbmFnZXIoKTsKLQkJCQlpZiAobGliTWdyICE9IG51bGwpIHsKLQkJCQkJU3RyaW5nIHJlcGxhY2VyR3VpZHMgPSAoU3RyaW5nKSBtYXJrZXIuZ2V0QXR0cmlidXRlKENvbmZpZ3VyYXRpb25DbG9zdXJlLnJlcGxhY2VyR3VpZHMpOwotCQkJCQlTdHJpbmdbXSBndWlkcyA9IEFic3RyYWN0UHJvY2Vzc0VsZW1lbnRMYXlvdXQuZ2V0UGF0aEFycmF5KHJlcGxhY2VyR3VpZHMpOwotCQkJCQlpZiAoZ3VpZHMgPT0gbnVsbCB8fCBndWlkcy5sZW5ndGggPT0gMCkgewotCQkJCQkJcmV0dXJuOwotCQkJCQl9Ci0JCQkJCVNldDxSZXNvdXJjZT4gcmVzb3VyZXNUb1NhdmUgPSBuZXcgSGFzaFNldDxSZXNvdXJjZT4oKTsKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBndWlkcy5sZW5ndGg7IGkrKykgewotCQkJCQkJTWV0aG9kRWxlbWVudCBlbGVtZW50ID0gbGliTWdyLmdldE1ldGhvZEVsZW1lbnQoZ3VpZHNbaV0pOwotCQkJCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBWYXJpYWJpbGl0eUVsZW1lbnQpIHsKLQkJCQkJCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFZhcmlhYmlsaXR5RWxlbWVudF9WYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCk7Ci0JCQkJCQkJZWxlbWVudC5lU2V0KGZlYXR1cmUsIG51bGwpOwotCQkJCQkJCWZlYXR1cmUgPSBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRWYXJpYWJpbGl0eUVsZW1lbnRfVmFyaWFiaWxpdHlUeXBlKCk7Ci0JCQkJCQkJZWxlbWVudC5lU2V0KGZlYXR1cmUsIFZhcmlhYmlsaXR5VHlwZS5OQSk7Ci0JCQkJCQkJbWFya2VyLmRlbGV0ZSgpOwotCQkJCQkJCVJlc291cmNlIHJlcyA9IGVsZW1lbnQuZVJlc291cmNlKCk7Ci0JCQkJCQkJaWYgKHJlcyAhPSBudWxsKSB7Ci0JCQkJCQkJCXJlc291cmVzVG9TYXZlLmFkZChyZXMpOwotCQkJCQkJCX0KLQkJCQkJCX0JCQkJCQkKLQkJCQkJfQotCQkJCQlzYXZlKHJlc291cmVzVG9TYXZlKTsKLQkJCQl9Ci0KLQkJCQotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQl9Ci0JCX0KLQotCQlwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHRlZFR5cGUoSU1hcmtlciBtYXJrZXIpIHsKLQkJCWJvb2xlYW4gcmV0ID0gZmFsc2U7Ci0JCQl0cnkgewotCQkJCXJldCA9IENvbmZpZ3VyYXRpb25DbG9zdXJlLm11bHRpcGxlUmVwbGFjZXJzTUFSS0VSX0lELmVxdWFscyhtYXJrZXIuZ2V0VHlwZSgpKTsKLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCX0KLQkJCQotCQkJcmV0dXJuIHJldDsKLQkJfQotCQkKLQl9CQotCQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS91dGlsL0xpYnJhcnlWYWxpZGF0aW9uTWFya2VySGVscGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3V0aWwvTGlicmFyeVZhbGlkYXRpb25NYXJrZXJIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTc4YzE5OC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3V0aWwvTGlicmFyeVZhbGlkYXRpb25NYXJrZXJIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyOCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRGlhZ25vc3RpYzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLlZhbGlkYXRlQWN0aW9uLkVjbGlwc2VSZXNvdXJjZXNVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRyYW5zaWVudEdyb3VwSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuZWxlbWVudC5UcmFuc2llbnRDb250ZW50UGFja2FnZUl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lm5hdmlnYXRvci5Db250ZW50SXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQubmF2aWdhdG9yLk1ldGhvZFBhY2thZ2VzSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQubmF2aWdhdG9yLlByb2Nlc3Nlc0l0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuTW9kZWxTdHJ1Y3R1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLkZpbGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS51dGlsLlBlcnNpc3RlbmNlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRDYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ3VzdG9tQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaXNjaXBsaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5Bc3NvY2lhdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pZGUuSURFOwotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgIDEuMQotICovCi1wdWJsaWMgY2xhc3MgTGlicmFyeVZhbGlkYXRpb25NYXJrZXJIZWxwZXIgZXh0ZW5kcyBFY2xpcHNlUmVzb3VyY2VzVXRpbCB7CQotCXB1YmxpYyBzdGF0aWMgZmluYWwgTGlicmFyeVZhbGlkYXRpb25NYXJrZXJIZWxwZXIgSU5TVEFOQ0UgPSBuZXcgTGlicmFyeVZhbGlkYXRpb25NYXJrZXJIZWxwZXIoKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHVUlEID0gImd1aWQiOyAvLyROT04tTkxTLTEkCi0JCi0JcHJpdmF0ZSBzdGF0aWMgaW50ZXJmYWNlIElQYXJlbnRQcm92aWRlciB7Ci0JCWZpbmFsIElQYXJlbnRQcm92aWRlciBjb250YWluZXJQcm92aWRlciA9IG5ldyBJUGFyZW50UHJvdmlkZXIoKSB7Ci0KLQkJCXB1YmxpYyBDb2xsZWN0aW9uPD8+IGdldFBhcmVudHMoT2JqZWN0IG9iamVjdCkgewotCQkJCWlmKG9iamVjdCBpbnN0YW5jZW9mIEVPYmplY3QpIHsKLQkJCQlyZXR1cm4gQ29sbGVjdGlvbnMuc2luZ2xldG9uKCgoRU9iamVjdClvYmplY3QpLmVDb250YWluZXIoKSk7Ci0JCQkJfQotCQkJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsKLQkJCX0KLQkJCQotCQl9OwotCQkKLQkJZmluYWwgSVBhcmVudFByb3ZpZGVyIHBhcmVudEN1c3RvbUNhdGVnb3J5UHJvdmlkZXIgPSBuZXcgSVBhcmVudFByb3ZpZGVyKCkgewotCi0JCQlwdWJsaWMgQ29sbGVjdGlvbjw/PiBnZXRQYXJlbnRzKE9iamVjdCBvYmplY3QpIHsKLQkJCQlpZihvYmplY3QgaW5zdGFuY2VvZiBDdXN0b21DYXRlZ29yeSkgewotCQkJCQlyZXR1cm4gQXNzb2NpYXRpb25IZWxwZXIuZ2V0Q3VzdG9tQ2F0ZWdvcmllcygoQ3VzdG9tQ2F0ZWdvcnkpb2JqZWN0KTsKLQkJCQl9Ci0JCQkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOwotCQkJfQotCQkJCi0JCX07Ci0JCQotCQlmaW5hbCBJUGFyZW50UHJvdmlkZXIgcGFyZW50U3RhbmRhcmRDYXRlZ29yeVByb3ZpZGVyID0gbmV3IElQYXJlbnRQcm92aWRlcigpIHsKLQotCQkJcHVibGljIENvbGxlY3Rpb248Pz4gZ2V0UGFyZW50cyhPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJaWYob2JqZWN0IGluc3RhbmNlb2YgRGlzY2lwbGluZSkgewotCQkJCQlEaXNjaXBsaW5lIGRpc2NpcGxpbmUgPSAoRGlzY2lwbGluZSkgb2JqZWN0OwotCQkJCQlMaXN0IHBhcmVudERpc2NpcGxpbmVzID0gQXNzb2NpYXRpb25IZWxwZXIuZ2V0RGlzY2lwbGluZShkaXNjaXBsaW5lKTsKLQkJCQkJTGlzdCBkaXNjaXBsaW5lR3JvdXBpbmdzID0gQXNzb2NpYXRpb25IZWxwZXIuZ2V0RGlzY2lwbGluZUdyb3VwcyhkaXNjaXBsaW5lKTsKLQkJCQkJaWYoIXBhcmVudERpc2NpcGxpbmVzLmlzRW1wdHkoKSAmJiAhZGlzY2lwbGluZUdyb3VwaW5ncy5pc0VtcHR5KCkpIHsKLQkJCQkJCUNvbGxlY3Rpb248T2JqZWN0PiBwYXJlbnRzID0gbmV3IEFycmF5TGlzdDxPYmplY3Q+KGRpc2NpcGxpbmVHcm91cGluZ3MpOwotCQkJCQkJcGFyZW50cy5hZGRBbGwocGFyZW50RGlzY2lwbGluZXMpOwotCQkJCQkJcmV0dXJuIHBhcmVudHM7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQlyZXR1cm4gcGFyZW50RGlzY2lwbGluZXMuaXNFbXB0eSgpID8gZGlzY2lwbGluZUdyb3VwaW5ncyA6IHBhcmVudERpc2NpcGxpbmVzOwotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgaWYob2JqZWN0IGluc3RhbmNlb2YgUm9sZVNldCkgewotCQkJCQlyZXR1cm4gQXNzb2NpYXRpb25IZWxwZXIuZ2V0Um9sZVNldEdyb3VwcygoUm9sZVNldCkgb2JqZWN0KTsKLQkJCQl9Ci0JCQkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOwotCQkJfQotCQkJCi0JCX07Ci0JCQotCQlDb2xsZWN0aW9uPD8+IGdldFBhcmVudHMoT2JqZWN0IG9iamVjdCk7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIGNsYXNzIEVycm9yQ2FsY3VsYXRvciBleHRlbmRzIEhhc2hNYXA8TWV0aG9kUGx1Z2luLCBTZXQ8TWV0aG9kRWxlbWVudD4+IHsJCQotCQkvKioKLQkJICogCi0JCSAqLwotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCQlwdWJsaWMgRXJyb3JDYWxjdWxhdG9yKCkgewotCQkJc3VwZXIoKTsKLQkJCWluaXRpYWxpemUoKTsKLQkJCUxpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuYWRkTGlzdGVuZXIobmV3IExpYnJhcnlTZXJ2aWNlTGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgbGlicmFyeU9wZW5lZChNZXRob2RMaWJyYXJ5IGxpYnJhcnkpIHsKLQkJCQkJaW5pdGlhbGl6ZSgpOwotCQkJCX0KLQkJCQkKLQkJCQlwdWJsaWMgdm9pZCBsaWJyYXJ5Q2xvc2VkKE1ldGhvZExpYnJhcnkgbGlicmFyeSkgewotCQkJCQljbGVhcigpOwotCQkJCX0KLQkJCQkKLQkJCQlwdWJsaWMgdm9pZCBsaWJyYXJ5UmVvcGVuZWQoTWV0aG9kTGlicmFyeSBsaWJyYXJ5KSB7Ci0JCQkJCWluaXRpYWxpemUoKTsKLQkJCQl9CQkJCQotCQkJfSk7Ci0JCX0KLQkJCi0JCXByaXZhdGUgdm9pZCBpbml0aWFsaXplKCkgewotCQkJY2xlYXIoKTsKLQkJCQotCQkJLy8gZmlsbCB0aGlzIHNldCB3aXRoIGNvbnRhaW5lcnMgb2YgbWFya2VkIG9iamVjdHMKLQkJCS8vCi0JCQlNZXRob2RMaWJyYXJ5IGxpYiA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKTsKLQkJCWlmKGxpYiAhPSBudWxsKSB7Ci0JCQkJSVdvcmtzcGFjZVJvb3Qgd3NSb290ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKLQkJCQl0cnkgewotCQkJCQlJTWFya2VyW10gbWFya2VycyA9IHdzUm9vdC5maW5kTWFya2VycyhJTlNUQU5DRS5nZXRNYXJrZXJJRCgpLCBmYWxzZSwgSVJlc291cmNlLkRFUFRIX0lORklOSVRFKTsKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtYXJrZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQlJTWFya2VyIG1hcmtlciA9IG1hcmtlcnNbaV07Ci0JCQkJCQlTdHJpbmcgZ3VpZCA9IChTdHJpbmcpIG1hcmtlci5nZXRBdHRyaWJ1dGUoR1VJRCk7Ci0JCQkJCQlNZXRob2RFbGVtZW50IGUgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRMaWJyYXJ5TWFuYWdlcigpLmdldE1ldGhvZEVsZW1lbnQoZ3VpZCk7Ci0JCQkJCQlpZihlICE9IG51bGwpIHsKLQkJCQkJCQlpZihlLmVJc1Byb3h5KCkpIHsKLQkJCQkJCQkJZSA9IChNZXRob2RFbGVtZW50KSBQZXJzaXN0ZW5jZVV0aWwucmVzb2x2ZShlLAotCQkJCQkJCQkJCUxpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLQkJCQkJCQkJCQkJCS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpCi0JCQkJCQkJCQkJCQkuZVJlc291cmNlKCkuZ2V0UmVzb3VyY2VTZXQoKSk7Ci0JCQkJCQkJfQotCQkJCQkJCS8vIGFkZCB0aGUgZWxlbWVudCB0byB0aGlzIHNldAotCQkJCQkJCS8vCi0JCQkJCQkJYWRkRXJyb3IoZSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIGFkZEVycm9yKE1ldGhvZEVsZW1lbnQgZSkgewotCQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IFVtYVV0aWwuZ2V0TWV0aG9kUGx1Z2luKGUpOwotCQkJaWYocGx1Z2luICE9IG51bGwpIHsKLQkJCQlTZXQ8TWV0aG9kRWxlbWVudD4gZWxlbWVudHMgPSBnZXQocGx1Z2luKTsKLQkJCQlpZihlbGVtZW50cyA9PSBudWxsKSB7Ci0JCQkJCWVsZW1lbnRzID0gbmV3IEhhc2hTZXQ8TWV0aG9kRWxlbWVudD4oKTsKLQkJCQkJcHV0KHBsdWdpbiwgZWxlbWVudHMpOwotCQkJCX0KLQkJCQllbGVtZW50cy5hZGQoZSk7Ci0JCQl9Ci0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIHJlbW92ZUVycm9yKE1ldGhvZEVsZW1lbnQgZSkgewotCQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IFVtYVV0aWwuZ2V0TWV0aG9kUGx1Z2luKGUpOwotCQkJaWYocGx1Z2luICE9IG51bGwpIHsKLQkJCQlTZXQ8TWV0aG9kRWxlbWVudD4gZWxlbWVudHMgPSBnZXQocGx1Z2luKTsKLQkJCQlpZihlbGVtZW50cyAhPSBudWxsKSB7Ci0JCQkJCWVsZW1lbnRzLnJlbW92ZShlKTsKLQkJCQkJaWYoZWxlbWVudHMuaXNFbXB0eSgpKSB7Ci0JCQkJCQlyZW1vdmUocGx1Z2luKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQkJcHVibGljIGJvb2xlYW4gaGFzRXJyb3JzKE1ldGhvZEVsZW1lbnQgZSkgewotCQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IFVtYVV0aWwuZ2V0TWV0aG9kUGx1Z2luKGUpOwotCQkJaWYocGx1Z2luICE9IG51bGwpIHsKLQkJCQlTZXQ8TWV0aG9kRWxlbWVudD4gZWxlbWVudHMgPSBnZXQocGx1Z2luKTsKLQkJCQlpZihlbGVtZW50cyAhPSBudWxsKSB7Ci0JCQkJCWlmKGVsZW1lbnRzLmNvbnRhaW5zKGUpKSB7Ci0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJfQotCi0JCQkJCS8vIGNoZWNrIGlmIGUgaXMgY29udGFpbmVyIG9mIGFueSBlcnJvciBlbGVtZW50Ci0JCQkJCS8vCi0JCQkJCUhhc2hTZXQ8T2JqZWN0PiBwcm9jZXNzZWRDaGlsZHJlbiA9IG51bGw7Ci0JCQkJCWZvciAoTWV0aG9kRWxlbWVudCBtZSA6IGVsZW1lbnRzKSB7Ci0JCQkJCQlpZihVbWFVdGlsLmlzQ29udGFpbmVkQnkobWUsIGUpKSB7Ci0JCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCQl9Ci0JCQkJCQlpZihtZSBpbnN0YW5jZW9mIEN1c3RvbUNhdGVnb3J5KSB7Ci0JCQkJCQkJaWYocHJvY2Vzc2VkQ2hpbGRyZW4gPT0gbnVsbCkgewotCQkJCQkJCQlwcm9jZXNzZWRDaGlsZHJlbiA9IG5ldyBIYXNoU2V0PE9iamVjdD4oKTsKLQkJCQkJCQl9Ci0JCQkJCQkJZWxzZSB7Ci0JCQkJCQkJCXByb2Nlc3NlZENoaWxkcmVuLmNsZWFyKCk7Ci0JCQkJCQkJfQotCQkJCQkJCWlmKGlzUGFyZW50T2YobWUsIGUsIElQYXJlbnRQcm92aWRlci5wYXJlbnRDdXN0b21DYXRlZ29yeVByb3ZpZGVyLCBwcm9jZXNzZWRDaGlsZHJlbikpIHsKLQkJCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJZWxzZSBpZihtZSBpbnN0YW5jZW9mIENvbnRlbnRDYXRlZ29yeSkgewotCQkJCQkJCS8vIG1lIG11c3QgYmUgYSBzdGFuZGFyZCBjYXRlZ29yeQotCQkJCQkJCS8vIGN1cnJlbnRseSBhbGwgY29udGVudCBwYWNrYWdlcyB0aGF0IGNvbnRhaW4KLQkJCQkJCQkvLyBzdGFuZGFyZCBjYXRlZ29yaWVzIGFyZSBub3QgY29udGFpbmVkIGJ5Ci0JCQkJCQkJLy8gcHJlZGVmaW5lZCBjb250ZW50IHBhY2thZ2UgIlN0YW5kYXJkIENhdGVnb3JpZXMiCi0JCQkJCQkJLy8gd2UgbmVlZCB0byBoYW5kbGUgdGhpcyBzcGVjaWFsbHkgaGVyZQotCQkJCQkJCS8vCi0JCQkJCQkJaWYoZSBpbnN0YW5jZW9mIENvbnRlbnRQYWNrYWdlICYmIGUgPT0gVW1hVXRpbC5maW5kQ29udGVudFBhY2thZ2UocGx1Z2luLCBNb2RlbFN0cnVjdHVyZS5ERUZBVUxULnN0YW5kYXJkQ2F0ZWdvcnlQYXRoKSkgewotCQkJCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJCQl9Ci0JCQkJCQkJaWYocHJvY2Vzc2VkQ2hpbGRyZW4gPT0gbnVsbCkgewotCQkJCQkJCQlwcm9jZXNzZWRDaGlsZHJlbiA9IG5ldyBIYXNoU2V0PE9iamVjdD4oKTsKLQkJCQkJCQl9Ci0JCQkJCQkJZWxzZSB7Ci0JCQkJCQkJCXByb2Nlc3NlZENoaWxkcmVuLmNsZWFyKCk7Ci0JCQkJCQkJfQotCQkJCQkJCWlmKGlzUGFyZW50T2YobWUsIGUsIElQYXJlbnRQcm92aWRlci5wYXJlbnRTdGFuZGFyZENhdGVnb3J5UHJvdmlkZXIsIHByb2Nlc3NlZENoaWxkcmVuKSkgewotCQkJCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJCi0JCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNQYXJlbnRPZihPYmplY3QgY2hpbGQsIE9iamVjdCBwYXJlbnQsIElQYXJlbnRQcm92aWRlciBwYXJlbnRQcm92aWRlciwgU2V0PE9iamVjdD4gcHJvY2Vzc2VkQ2hpbGRyZW4pIHsKLQkJCXByb2Nlc3NlZENoaWxkcmVuLmFkZChjaGlsZCk7Ci0JCQlmb3IgKE9iamVjdCBteVBhcmVudCA6IHBhcmVudFByb3ZpZGVyLmdldFBhcmVudHMoY2hpbGQpKSB7CQkJCQotCQkJCWlmKG15UGFyZW50ID09IHBhcmVudCkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQkJaWYoIXByb2Nlc3NlZENoaWxkcmVuLmNvbnRhaW5zKG15UGFyZW50KSAmJiBpc1BhcmVudE9mKG15UGFyZW50LCBwYXJlbnQsIHBhcmVudFByb3ZpZGVyLCBwcm9jZXNzZWRDaGlsZHJlbikpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQkJCQkKLQkJCX0KLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBFcnJvckNhbGN1bGF0b3IgZXJyb3JDYWxjdWxhdG9yID0gbmV3IEVycm9yQ2FsY3VsYXRvcigpOwkKLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnVpLk1hcmtlckhlbHBlciNnZXRGaWxlKG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkkpCi0JICovCi0JcHJvdGVjdGVkIElGaWxlIGdldEZpbGUoVVJJIHVyaSkgewotCQlpZih1cmkuaXNGaWxlKCkpIHsKLQkJCXJldHVybiAoSUZpbGUpIEZpbGVNYW5hZ2VyLmdldFJlc291cmNlRm9yTG9jYXRpb24odXJpLnRvRmlsZVN0cmluZygpKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0RmlsZSh1cmkpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS51dGlsLkVkaXRVSU1hcmtlckhlbHBlciNhZGp1c3RNYXJrZXIob3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlciwgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkRpYWdub3N0aWMpCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gYWRqdXN0TWFya2VyKElNYXJrZXIgbWFya2VyLCBEaWFnbm9zdGljIGRpYWdub3N0aWMpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJYm9vbGVhbiByZXQgPSBzdXBlci5hZGp1c3RNYXJrZXIobWFya2VyLCBkaWFnbm9zdGljKTsKLQkJaWYoIWRpYWdub3N0aWMuZ2V0RGF0YSgpLmlzRW1wdHkoKSkgewotCQkJT2JqZWN0IG8gPSBkaWFnbm9zdGljLmdldERhdGEoKS5nZXQoMCk7Ci0JCQlpZihvIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJCW1hcmtlci5zZXRBdHRyaWJ1dGUoR1VJRCwgKChNZXRob2RFbGVtZW50KW8pLmdldEd1aWQoKSk7Ci0JCQkJbWFya2VyLnNldEF0dHJpYnV0ZShJTWFya2VyLkxPQ0FUSU9OLCBUbmdVdGlsLmdldExhYmVsV2l0aFBhdGgobykpOwotCSAgICAJCW1hcmtlci5zZXRBdHRyaWJ1dGUoSURFLkVESVRPUl9JRF9BVFRSLCAib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLk1ldGhvZEVsZW1lbnRFZGl0b3IiKTsgLy8kTk9OLU5MUy0xJAotCSAgICAJCWVycm9yQ2FsY3VsYXRvci5hZGRFcnJvcigoTWV0aG9kRWxlbWVudCkgbyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJldDsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzSW52YWxpZChPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmKG9iamVjdCBpbnN0YW5jZW9mIFByb2Nlc3Nlc0l0ZW1Qcm92aWRlcikgewotCQkJLy8gdGhpcyBpcyBhbiBVSSBvYmplY3Q6IFByb2Nlc3NlcwotCQkJLy8KLQkJCVByb2Nlc3Nlc0l0ZW1Qcm92aWRlciBpcCA9IChQcm9jZXNzZXNJdGVtUHJvdmlkZXIpIG9iamVjdDsKLQkJCU1ldGhvZEVsZW1lbnQgbzsJCQkKLQkJCXJldHVybiAoKG8gPSBpcC5nZXRDYXBhYmlsaXR5UGF0dGVyblBhY2thZ2UoKSkgIT0gbnVsbCAmJiBlcnJvckNhbGN1bGF0b3IuaGFzRXJyb3JzKG8pKQotCQkJCXx8ICgobyA9IGlwLmdldERlbGl2ZXJ5UHJvY2Vzc1BhY2thZ2UoKSkgIT0gbnVsbCAmJiBlcnJvckNhbGN1bGF0b3IuaGFzRXJyb3JzKG8pKTsKLQkJfQotCQllbHNlIGlmKG9iamVjdCBpbnN0YW5jZW9mIE1ldGhvZFBhY2thZ2VzSXRlbVByb3ZpZGVyKSB7Ci0JCQkvLyB0aGlzIGlzIGFuIFVJIG9iamVjdAotCQkJLy8KLQkJCW9iamVjdCA9ICgoSXRlbVByb3ZpZGVyQWRhcHRlcilvYmplY3QpLmdldFRhcmdldCgpOwkJCQotCQl9Ci0JCWVsc2UgaWYob2JqZWN0IGluc3RhbmNlb2YgQ29udGVudEl0ZW1Qcm92aWRlcikgewotCQkJQ29udGVudFBhY2thZ2UgY29yZUNvbnRlbnRQa2cgPSAoKENvbnRlbnRJdGVtUHJvdmlkZXIpb2JqZWN0KS5nZXRDb3JlQ29udGVudFBhY2thZ2UoKTsKLQkJCWlmKGNvcmVDb250ZW50UGtnICE9IG51bGwpIHsKLQkJCQlvYmplY3QgPSBjb3JlQ29udGVudFBrZy5lQ29udGFpbmVyKCk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZihvYmplY3QgaW5zdGFuY2VvZiBUcmFuc2llbnRDb250ZW50UGFja2FnZUl0ZW1Qcm92aWRlcikgewotCQkJLy8gdGhpcyBpcyBhbiBVSSBvYmplY3Q6IGVpdGhlciBUYXNrcywgUm9sZXMsIFdvcmsgUHJvZHVjdHMsIG9yIEd1aWRhbmNlCi0JCQkvLwotCQkJQ29sbGVjdGlvbjw/PiBjaGlsZHJlbiA9ICgoVHJhbnNpZW50Q29udGVudFBhY2thZ2VJdGVtUHJvdmlkZXIpb2JqZWN0KS5nZXRDaGlsZHJlbihvYmplY3QpOwotCQkJZm9yIChJdGVyYXRvcjw/PiBpdGVyID0gY2hpbGRyZW4uaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IGNoaWxkID0gVG5nVXRpbC51bndyYXAoaXRlci5uZXh0KCkpOwotCQkJCWlmKGNoaWxkIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCAmJiBlcnJvckNhbGN1bGF0b3IuaGFzRXJyb3JzKChNZXRob2RFbGVtZW50KSBjaGlsZCkpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQkJCQkKLQkJCX0KLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQllbHNlIGlmKG9iamVjdCBpbnN0YW5jZW9mIFRyYW5zaWVudEdyb3VwSXRlbVByb3ZpZGVyKSB7Ci0JCQlvYmplY3QgPSAoKFRyYW5zaWVudEdyb3VwSXRlbVByb3ZpZGVyKW9iamVjdCkuZ2V0VGFyZ2V0KCk7Ci0JCX0KLQkJcmV0dXJuICgob2JqZWN0ID0gVG5nVXRpbC51bndyYXAob2JqZWN0KSkgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50ICYmIGVycm9yQ2FsY3VsYXRvcgotCQkJCS5oYXNFcnJvcnMoKE1ldGhvZEVsZW1lbnQpIG9iamVjdCkpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnVpLk1hcmtlckhlbHBlciNoYXNNYXJrZXJzKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzTWFya2VycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmKG9iamVjdCBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsJCQkKLQkJCUlSZXNvdXJjZSByZXNvdXJjZSA9IGdldEZpbGUob2JqZWN0KTsKLQkJCWlmIChyZXNvdXJjZSAhPSBudWxsICYmIHJlc291cmNlLmV4aXN0cygpKQotCQkJewotCQkJCXRyeQotCQkJCXsKLQkJCQkJU3RyaW5nIGd1aWQgPSAoKE1ldGhvZEVsZW1lbnQpb2JqZWN0KS5nZXRHdWlkKCk7Ci0JCQkJCUlNYXJrZXJbXSBtYXJrZXJzID0gcmVzb3VyY2UuZmluZE1hcmtlcnMoZ2V0TWFya2VySUQoKSwgZmFsc2UsIElSZXNvdXJjZS5ERVBUSF9aRVJPKTsKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtYXJrZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQlJTWFya2VyIG1hcmtlciA9IG1hcmtlcnNbaV07Ci0JCQkJCQlpZihndWlkLmVxdWFscyhtYXJrZXIuZ2V0QXR0cmlidXRlKEdVSUQpKSkgewotCQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpCi0JCQkJewotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCXJldHVybiBzdXBlci5oYXNNYXJrZXJzKG9iamVjdCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBJRmlsZSBnZXRGaWxlKE9iamVjdCBkYXR1bSkgewotCQl0cnkgewotCQkJcmV0dXJuIHN1cGVyLmdldEZpbGUoZGF0dW0pOwotCQl9Ci0JCWNhdGNoKEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCBkZWxldGVNYXJrZXJzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYob2JqZWN0IGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJSVJlc291cmNlIHJlc291cmNlID0gZ2V0RmlsZShvYmplY3QpOwotCQkJaWYgKHJlc291cmNlICE9IG51bGwgJiYgcmVzb3VyY2UuZXhpc3RzKCkpCi0JCQl7Ci0JCQkJdHJ5Ci0JCQkJewotCQkJCQlNZXRob2RFbGVtZW50IGUgPSAoTWV0aG9kRWxlbWVudCkgb2JqZWN0OwotCQkJCQlTdHJpbmcgZ3VpZCA9IGUuZ2V0R3VpZCgpOwotCQkJCQlJTWFya2VyW10gbWFya2VycyA9IHJlc291cmNlLmZpbmRNYXJrZXJzKGdldE1hcmtlcklEKCksIGZhbHNlLCBJUmVzb3VyY2UuREVQVEhfWkVSTyk7Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbWFya2Vycy5sZW5ndGg7IGkrKykgewotCQkJCQkJSU1hcmtlciBtYXJrZXIgPSBtYXJrZXJzW2ldOwkJCQkJCQotCQkJCQkJaWYoZ3VpZC5lcXVhbHMobWFya2VyLmdldEF0dHJpYnV0ZShHVUlEKSkpIHsKLQkJCQkJCQltYXJrZXIuZGVsZXRlKCk7Ci0JCQkJCQkJZXJyb3JDYWxjdWxhdG9yLnJlbW92ZUVycm9yKGUpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpCi0JCQkJewotCQkJCX0KLQkJCX0KLQkJCXJldHVybjsKLQkJfQotCQkKLQkJc3VwZXIuZGVsZXRlTWFya2VycyhvYmplY3QpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGRlbGV0ZU1hcmtlcnMoSVJlc291cmNlIHJlc291cmNlLCBib29sZWFuIGluY2x1ZGVTdWJ0eXBlcywgaW50IGRlcHRoKSB7Ci0JCWlmIChyZXNvdXJjZSAhPSBudWxsICYmIHJlc291cmNlLmV4aXN0cygpKSB7Ci0JCQl0cnkgewkJCQkKLQkJCQlJTWFya2VyW10gbWFya2VycyA9IHJlc291cmNlLmZpbmRNYXJrZXJzKGdldE1hcmtlcklEKCksIGZhbHNlLCBJUmVzb3VyY2UuREVQVEhfWkVSTyk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtYXJrZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCUlNYXJrZXIgbWFya2VyID0gbWFya2Vyc1tpXTsKLQkJCQkJU3RyaW5nIGd1aWQgPSAoU3RyaW5nKSBtYXJrZXIuZ2V0QXR0cmlidXRlKEdVSUQpOwotCQkJCQlNZXRob2RFbGVtZW50IGUgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRMaWJyYXJ5TWFuYWdlcigpLmdldE1ldGhvZEVsZW1lbnQoZ3VpZCk7Ci0JCQkJCWlmKGUgIT0gbnVsbCkgewotCQkJCQkJZXJyb3JDYWxjdWxhdG9yLnJlbW92ZUVycm9yKGUpOwotCQkJCQl9Ci0JCQkJfQotCi0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkKLQkJCX0JCQkKLQkJfQotCQkJCi0JCXN1cGVyLmRlbGV0ZU1hcmtlcnMocmVzb3VyY2UsIGluY2x1ZGVTdWJ0eXBlcywgZGVwdGgpOwotCX0KLQotCS8vT3ZlcnJpZGUgdG8gc2VwZXJhdGUgZXJyb3IgbWVzc2FnZSBpbiBlcnJvciBkaWFsb2cgYW5kIHByb2JsZW1zIHZpZXcgKGJ1ZyAxNzQzNTEpCi0JLy9Ob3RlOiBiZXR0ZXIgZml4IGlzIHRvIGV4dGVuZCBCYXNpY0RpYWdub3N0aWMgdG8gZW5jYXBzdWxhdGUgYm90aCB0eXBlcyBvZiBtc2dzIC0+IHRvIGRvIGxhdGVyCi0JcHJvdGVjdGVkIFN0cmluZyBjb21wb3NlTWVzc2FnZShEaWFnbm9zdGljIGRpYWdub3N0aWMsIERpYWdub3N0aWMgcGFyZW50RGlhZ25vc3RpYykgewotCQlpbnQgaXggPSBkaWFnbm9zdGljLmdldE1lc3NhZ2UoKS5pbmRleE9mKExpYnJhcnlFZGl0UmVzb3VyY2VzLmR1cGxpY2F0ZUVsZW1lbnROYW1lRXJyb3JfbXNnMik7Ci0JCWlmIChpeCA+IDApIHsKLQkJCXJldHVybiBkaWFnbm9zdGljLmdldE1lc3NhZ2UoKS5zdWJzdHJpbmcoMCwgaXgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5jb21wb3NlTWVzc2FnZShkaWFnbm9zdGljLCBwYXJlbnREaWFnbm9zdGljKTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3V0aWwvTWFya2VyUmVzb2x1dGlvbkdlbmVyYXRvci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS91dGlsL01hcmtlclJlc29sdXRpb25HZW5lcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjQxMjU5ZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3V0aWwvTWFya2VyUmVzb2x1dGlvbkdlbmVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjg4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnZpZXdzLkxpYnJhcnlWaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UuTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5yZWZyZXNoLlJlZnJlc2hKb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLnV0aWwuUGVyc2lzdGVuY2VVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS51dGlsLlVucmVzb2x2ZWRQcm94eU1hcmtlck1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzLklMaWJyYXJ5UGVyc2lzdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc1BhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklNYXJrZXJSZXNvbHV0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklNYXJrZXJSZXNvbHV0aW9uR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLm1hcmtlcnMuV29ya2JlbmNoTWFya2VyUmVzb2x1dGlvbjsKLQotLyoqCi0gKiBDcmVhdGUgcmVzb2x1dGlvbnMgZm9yIHRoZSBnaXZlbiBtYXJrZXIKLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBNYXJrZXJSZXNvbHV0aW9uR2VuZXJhdG9yIGltcGxlbWVudHMgSU1hcmtlclJlc29sdXRpb25HZW5lcmF0b3IgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIElNYXJrZXJSZXNvbHV0aW9uW10gRU1QVFlfUkVTT0xVVElPTlMgPSBuZXcgSU1hcmtlclJlc29sdXRpb25bMF07Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgU2hvd093bmVySW5MaWJyYXJ5VmlldyBpbXBsZW1lbnRzIElNYXJrZXJSZXNvbHV0aW9uIHsKLQotCQlwcml2YXRlIE9iamVjdCBvd25lcjsKLQotCQkvKioKLQkJICogQHBhcmFtIG93bmVyCi0JCSAqLwotCQlwcml2YXRlIFNob3dPd25lckluTGlicmFyeVZpZXcoT2JqZWN0IG93bmVyKSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5vd25lciA9IG93bmVyOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSU1hcmtlclJlc29sdXRpb24jZ2V0TGFiZWwoKQotCQkgKi8KLQkJcHVibGljIFN0cmluZyBnZXRMYWJlbCgpIHsKLQkJCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy5NYXJrZXJSZXNvbHV0aW9uR2VuZXJhdG9yX3Nob3dPd25lckluTGlicmFyeVZpZXc7Ci0JCX0KLQotCQkvKioKLQkJICogQHNlZSBvcmcuZWNsaXBzZS51aS5JTWFya2VyUmVzb2x1dGlvbiNydW4ob3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcikKLQkJICovCi0JCXB1YmxpYyB2b2lkIHJ1bihJTWFya2VyIG1hcmtlcikgewotCQkJTGlicmFyeVZpZXcuZ2V0VmlldygpLnNldFNlbGVjdGlvblRvVmlld2VyKG93bmVyKTsKLQkJfQotCQkKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTWFya2VyUmVzb2x1dGlvbiBleHRlbmRzIFdvcmtiZW5jaE1hcmtlclJlc29sdXRpb24gewotCQlwcml2YXRlIElNYXJrZXIgY3VycmVudE1hcmtlcjsKLQkJcHJpdmF0ZSBSZWZlcmVuY2VJbmZvIHJlZmVyZW5jZUluZm87Ci0KLQkJcHVibGljIE1hcmtlclJlc29sdXRpb24oSU1hcmtlciBjdXJyZW50TWFya2VyLCBSZWZlcmVuY2VJbmZvIHJlZmVyZW5jZUluZm8pIHsKLQkJCXRoaXMuY3VycmVudE1hcmtlciA9IGN1cnJlbnRNYXJrZXI7Ci0JCQl0aGlzLnJlZmVyZW5jZUluZm8gPSByZWZlcmVuY2VJbmZvOwotCQl9Ci0JCQotCQkvKioKLQkJICogQHNlZSBvcmcuZWNsaXBzZS51aS5JTWFya2VyUmVzb2x1dGlvbiNnZXRMYWJlbCgpCi0JCSAqLwotCQlwdWJsaWMgU3RyaW5nIGdldExhYmVsKCkgewotCQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLk1hcmtlclJlc29sdXRpb25HZW5lcmF0b3JfcmVtb3ZlVW5yZXNvbHZlZFJlZmVyZW5jZTsKLQkJfQotCi0JCS8qKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklNYXJrZXJSZXNvbHV0aW9uI3J1bihvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyKQotCQkgKi8KLQkJcHVibGljIHZvaWQgcnVuKElNYXJrZXIgbWFya2VyKSB7Ci0JCQlSZWZlcmVuY2VJbmZvIHJlZkluZm8gPSBjdXJyZW50TWFya2VyLmVxdWFscyhtYXJrZXIpID8gcmVmZXJlbmNlSW5mbyA6IGdldFJlZmVyZW5jZUluZm8obWFya2VyKTsKLQkJCWlmKHJlZkluZm8gPT0gbnVsbCkgewotCQkJCXJldHVybjsKLQkJCX0KLQkJCWlmKHJlZkluZm8ucmVmZXJlbmNlLmlzTWFueSgpKSB7Ci0JCQkJKChMaXN0PD8+KXJlZkluZm8ub3duZXIuZUdldChyZWZJbmZvLnJlZmVyZW5jZSkpLnJlbW92ZShyZWZJbmZvLmluZGV4KTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXJlZkluZm8ub3duZXIuZVNldChyZWZJbmZvLnJlZmVyZW5jZSwgbnVsbCk7Ci0JCQl9Ci0JCQlib29sZWFuIHZhbGlkYXRlID0gZmFsc2U7Ci0JCQlSZXNvdXJjZSByZXNvdXJjZSA9IHJlZkluZm8ub3duZXIuZVJlc291cmNlKCk7Ci0JCQlJTGlicmFyeVBlcnNpc3Rlci5GYWlsU2FmZU1ldGhvZExpYnJhcnlQZXJzaXN0ZXIgcGVyc2lzdGVyID0gTGlicmFyeVNlcnZpY2VVdGlsCi0JCQkJCS5nZXRQZXJzaXN0ZXJGb3IocmVzb3VyY2UpLmdldEZhaWxTYWZlUGVyc2lzdGVyKCk7Ci0JCQl0cnkgewotCQkJCXBlcnNpc3Rlci5zYXZlKHJlc291cmNlKTsKLQkJCQlwZXJzaXN0ZXIuY29tbWl0KCk7Ci0JCQkJdmFsaWRhdGUgPSB0cnVlOwotCQkJfQotCQkJY2F0Y2goRXhjZXB0aW9uIGUpIHsKLQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkJcGVyc2lzdGVyLnJvbGxiYWNrKCk7Ci0JCQl9Ci0JCQlpZih2YWxpZGF0ZSkgeyAJCQkJCi0JCQkJUmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQgPSByZXNvdXJjZS5nZXRSZXNvdXJjZVNldCgpOwotCQkJCWlmKHJlc291cmNlU2V0IGluc3RhbmNlb2YgTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsKSB7Ci0JCQkJCSgoTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsKXJlc291cmNlU2V0KS5nZXRNYXJrZXJNYW5hbmdlcigpLmRvVmFsaWRhdGVNYXJrZXJzKHJlc291cmNlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIElNYXJrZXJbXSBmaW5kT3RoZXJNYXJrZXJzKElNYXJrZXJbXSBtYXJrZXJzKSB7Ci0JCQlBcnJheUxpc3Q8SU1hcmtlcj4gc2ltaWxhck1hcmtlckxpc3QgPSBuZXcgQXJyYXlMaXN0PElNYXJrZXI+KCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IG1hcmtlcnMubGVuZ3RoOyBpKyspIHsKLQkJCQlJTWFya2VyIG1hcmtlciA9IG1hcmtlcnNbaV07Ci0JCQkJaWYoIWN1cnJlbnRNYXJrZXIuZXF1YWxzKG1hcmtlcikpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCWlmKFVucmVzb2x2ZWRQcm94eU1hcmtlck1hbmFnZXIuTUFSS0VSX0lELmVxdWFscyhtYXJrZXIuZ2V0VHlwZSgpKSkgewotCQkJCQkJCXNpbWlsYXJNYXJrZXJMaXN0LmFkZChtYXJrZXIpOwotCQkJCQkJfQotCQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJCS8vCi0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlJTWFya2VyW10gc2ltaWxhck1hcmtlcnMgPSBuZXcgSU1hcmtlcltzaW1pbGFyTWFya2VyTGlzdC5zaXplKCldOwotCQkJc2ltaWxhck1hcmtlckxpc3QudG9BcnJheShzaW1pbGFyTWFya2Vycyk7Ci0JCQlyZXR1cm4gc2ltaWxhck1hcmtlcnM7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotCQkJLy8gVE9ETyBwcm92aWRlIGRldGFpbGVkIGRlc2NyaXB0aW9uCi0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpIHsKLQkJCS8vIFRPRE8gcHJvdmlkZSBpbWFnZQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJCi0JfQotCQotCXByaXZhdGUgc3RhdGljIGNsYXNzIFJlZmVyZW5jZUluZm8gewotCQlwcml2YXRlIEVPYmplY3Qgb3duZXI7Ci0JCXByaXZhdGUgRVJlZmVyZW5jZSByZWZlcmVuY2U7Ci0JCXByaXZhdGUgaW50IGluZGV4OwotCQkKLQkJcHVibGljIFJlZmVyZW5jZUluZm8oRU9iamVjdCBvd25lciwgRVJlZmVyZW5jZSByZWZlcmVuY2UsIGludCBpbmRleCkgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMub3duZXIgPSBvd25lcjsKLQkJCXRoaXMucmVmZXJlbmNlID0gcmVmZXJlbmNlOwotCQkJdGhpcy5pbmRleCA9IGluZGV4OwotCQl9Ci0JCQkJCi0JfQotCQotCXByaXZhdGUgc3RhdGljIFJlZmVyZW5jZUluZm8gZ2V0UmVmZXJlbmNlSW5mbyhJTWFya2VyIG1hcmtlcikgewotCQl0cnkgewotCQkJU3RyaW5nIHByb3h5VVJJID0gKFN0cmluZykgbWFya2VyLmdldEF0dHJpYnV0ZShVbnJlc29sdmVkUHJveHlNYXJrZXJNYW5hZ2VyLlBST1hZX1VSSSk7Ci0JCQlTdHJpbmcgb3duZXJHVUlEID0gKFN0cmluZykgbWFya2VyLmdldEF0dHJpYnV0ZShVbnJlc29sdmVkUHJveHlNYXJrZXJNYW5hZ2VyLk9XTkVSX0dVSUQpOwotCQkJaWYocHJveHlVUkkgIT0gbnVsbCAmJiBvd25lckdVSUQgIT0gbnVsbCkgewotCQkJCVJlc291cmNlIHJlc291cmNlID0gUmVmcmVzaEpvYi5nZXRJbnN0YW5jZSgpLmdldFJlc291cmNlKG1hcmtlci5nZXRSZXNvdXJjZSgpKTsKLQkJCQlpZihyZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQkJCUVPYmplY3Qgb3duZXIgPSByZXNvdXJjZS5nZXRFT2JqZWN0KG93bmVyR1VJRCk7Ci0JCQkJCWlmKG93bmVyICE9IG51bGwpIHsKLQkJCQkJCVVSSSB1cmkgPSBVUkkuY3JlYXRlVVJJKHByb3h5VVJJKTsKLQkJCQkJCS8vIGZpbmQgdGhlIHByb3h5Ci0JCQkJCQkvLwotCQkJCQkJaW50IGluZGV4ID0gLTE7Ci0JCQkJCQlFUmVmZXJlbmNlIHJlZmVyZW5jZSA9IG51bGw7Ci0JCQkJCQlmaW5kX3Byb3h5X2xvb3A6Ci0JCQkJCQlmb3IgKEVSZWZlcmVuY2UgcmVmIDogb3duZXIuZUNsYXNzKCkuZ2V0RUFsbFJlZmVyZW5jZXMoKSkgewotCQkJCQkJCWlmKHJlZi5pc0NoYW5nZWFibGUoKSAmJiAhcmVmLmlzRGVyaXZlZCgpKSB7Ci0JCQkJCQkJCWlmKHJlZi5pc01hbnkoKSkgewotCQkJCQkJCQkJSW50ZXJuYWxFTGlzdCBsaXN0ID0gKEludGVybmFsRUxpc3QpIG93bmVyLmVHZXQocmVmKTsKLQkJCQkJCQkJCWludCBpZCA9IDA7Ci0JCQkJCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gbGlzdC5iYXNpY0l0ZXJhdG9yKCk7IGl0ZXJhdG9yCi0JCQkJCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJCQkJSW50ZXJuYWxFT2JqZWN0IG8gPSAoSW50ZXJuYWxFT2JqZWN0KSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCQkJCQkJaWYoby5lSXNQcm94eSgpICYmIHVyaS5lcXVhbHMoby5lUHJveHlVUkkoKSkpIHsKLQkJCQkJCQkJCQkJaW5kZXggPSBpZDsKLQkJCQkJCQkJCQkJcmVmZXJlbmNlID0gcmVmOwotCQkJCQkJCQkJCQlicmVhayBmaW5kX3Byb3h5X2xvb3A7Ci0JCQkJCQkJCQkJfQotCQkJCQkJCQkJCWlkKys7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQkJCQkJCQkJZWxzZSB7Ci0JCQkJCQkJCQlJbnRlcm5hbEVPYmplY3QgbyA9IChJbnRlcm5hbEVPYmplY3QpIG93bmVyLmVHZXQocmVmLCBmYWxzZSk7Ci0JCQkJCQkJCQlpZihvICE9IG51bGwgJiYgby5lSXNQcm94eSgpICYmIHVyaS5lcXVhbHMoby5lUHJveHlVUkkoKSkpIHsKLQkJCQkJCQkJCQlyZWZlcmVuY2UgPSByZWY7Ci0JCQkJCQkJCQkJYnJlYWsgZmluZF9wcm94eV9sb29wOwotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJaWYocmVmZXJlbmNlICE9IG51bGwpIHsKLQkJCQkJCQlyZXR1cm4gbmV3IFJlZmVyZW5jZUluZm8ob3duZXIsIHJlZmVyZW5jZSwgaW5kZXgpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSU1hcmtlclJlc29sdXRpb25HZW5lcmF0b3IjZ2V0UmVzb2x1dGlvbnMob3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcikKLQkgKi8KLQlwdWJsaWMgSU1hcmtlclJlc29sdXRpb25bXSBnZXRSZXNvbHV0aW9ucyhJTWFya2VyIG1hcmtlcikgewotCQlSZWZlcmVuY2VJbmZvIHJlZkluZm8gPSBnZXRSZWZlcmVuY2VJbmZvKG1hcmtlcik7Ci0JCWlmKHJlZkluZm8gIT0gbnVsbCkgewotCQkJT2JqZWN0IHNlbGVjdGFibGVPd25lciA9IGdldFNlbGVjdGFibGVPYmplY3QocmVmSW5mby5vd25lcik7Ci0JCQlJTWFya2VyUmVzb2x1dGlvbiBtYXJrZXJSZXNvbHV0aW9uID0gbmV3IE1hcmtlclJlc29sdXRpb24obWFya2VyLCByZWZJbmZvKTsKLQkJCWlmKHNlbGVjdGFibGVPd25lciAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIG5ldyBJTWFya2VyUmVzb2x1dGlvbltdIHsKLQkJCQkJCW1hcmtlclJlc29sdXRpb24sCi0JCQkJCQluZXcgU2hvd093bmVySW5MaWJyYXJ5VmlldyhzZWxlY3RhYmxlT3duZXIpCi0JCQkJfTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXJldHVybiBuZXcgSU1hcmtlclJlc29sdXRpb25bXSB7Ci0JCQkJCQltYXJrZXJSZXNvbHV0aW9uCi0JCQkJfTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gRU1QVFlfUkVTT0xVVElPTlM7Ci0JfQotCi0JLyoqCi0JICogR2V0IHNlbGVjdGFibGUgb2JqZWN0IAotCSAqIEBwYXJhbSBvd25lcgotCSAqIEByZXR1cm4KLQkgKiAJCQlvYmplY3QgaXRzZWxmCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgT2JqZWN0IGdldFNlbGVjdGFibGVPYmplY3QoRU9iamVjdCBvd25lcikgewotCQlpZihvd25lciBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbiB8fCBvd25lciBpbnN0YW5jZW9mIENvbnRlbnRFbGVtZW50IHx8IG93bmVyIGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UgCi0JCQkJfHwgb3duZXIgaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50KSB7Ci0JCQlyZXR1cm4gb3duZXI7Ci0JCX0KLQkJaWYob3duZXIgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQlQcm9jZXNzQ29tcG9uZW50IHByb2NDb21wID0gVW1hVXRpbC5nZXRQcm9jZXNzQ29tcG9uZW50KChNZXRob2RFbGVtZW50KSBvd25lcik7Ci0JCQlpZihwcm9jQ29tcCAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIHByb2NDb21wOwotCQkJfQotCQl9Ci0JCWlmKG93bmVyIGluc3RhbmNlb2YgUHJvY2Vzc1BhY2thZ2UpIHsKLQkJCXJldHVybiBvd25lcjsKLQkJfQotCQlpZihvd25lciBpbnN0YW5jZW9mIENvbnRlbnREZXNjcmlwdGlvbiAmJiBvd25lci5lQ29udGFpbmVyKCkgaW5zdGFuY2VvZiBDb250ZW50RWxlbWVudCkgewotCQkJcmV0dXJuIG93bmVyLmVDb250YWluZXIoKTsgCi0JCX0KLQkJUmVzb3VyY2UgcmVzb3VyY2UgPSBvd25lci5lUmVzb3VyY2UoKTsKLQkJTWV0aG9kRWxlbWVudCBlID0gUGVyc2lzdGVuY2VVdGlsLmdldE1ldGhvZEVsZW1lbnQocmVzb3VyY2UpOwotCQlpZihlICE9IG93bmVyKSB7Ci0JCQlyZXR1cm4gZ2V0U2VsZWN0YWJsZU9iamVjdChlKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3V0aWwvTWV0aG9kUmljaFRleHRNYXJrZXJIZWxwZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvdXRpbC9NZXRob2RSaWNoVGV4dE1hcmtlckhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYTRlNDNhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvdXRpbC9NZXRob2RSaWNoVGV4dE1hcmtlckhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzU3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5EaWFnbm9zdGljOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uVmFsaWRhdGVBY3Rpb24uRWNsaXBzZVJlc291cmNlc1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmVsZW1lbnQuVHJhbnNpZW50Q29udGVudFBhY2thZ2VJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5uYXZpZ2F0b3IuQ29udGVudEl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lm5hdmlnYXRvci5NZXRob2RQYWNrYWdlc0l0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lm5hdmlnYXRvci5Qcm9jZXNzZXNJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucHJvamVjdC5NZXRob2RMaWJyYXJ5UHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UuRmlsZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pZGUuSURFOwotCi0vKioKLSAqIGJhc2VkIG9uIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudXRpbC5MaWJyYXJ5VmFsaWRhdGlvbk1hcmtlckhlbHBlciAKLSAqIEBhdXRob3IgSmVmZiBIYXJkeQotICoKLSAqLwotcHVibGljIGNsYXNzIE1ldGhvZFJpY2hUZXh0TWFya2VySGVscGVyIGV4dGVuZHMgRWNsaXBzZVJlc291cmNlc1V0aWwgewkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIE1ldGhvZFJpY2hUZXh0TWFya2VySGVscGVyIElOU1RBTkNFID0gbmV3IE1ldGhvZFJpY2hUZXh0TWFya2VySGVscGVyKCk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgR1VJRCA9ICJndWlkIjsgLy8kTk9OLU5MUy0xJAotCi0JLy8gbWFya2VyIElECi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFSS0VSX0lEID0gIm9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkubWV0aG9kUmljaFRleHQiOyAvLyROT04tTkxTLTEkCi0JCi0JLy8gbWFya2VyIGF0dHJpYnV0ZQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBNRVRIT0RfRklFTEROQU1FID0gIk1ldGhvZEZpZWxkTmFtZSI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIHByaXZhdGUgY29uc3RydWN0b3IKLQlwcml2YXRlIE1ldGhvZFJpY2hUZXh0TWFya2VySGVscGVyKCkgewotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBDb250YWluZXJNYXAgZXh0ZW5kcyBIYXNoTWFwPE9iamVjdCwgSW50ZWdlcj4gewotCQkvKioKLQkJICogCi0JCSAqLwotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCQlwdWJsaWMgQ29udGFpbmVyTWFwKCkgewotCQkJc3VwZXIoKTsKLQkJCWluaXRNYXAoKTsKLQkJCUxpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuYWRkTGlzdGVuZXIobmV3IExpYnJhcnlTZXJ2aWNlTGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgbGlicmFyeU9wZW5lZChNZXRob2RMaWJyYXJ5IGxpYnJhcnkpIHsKLQkJCQkJaW5pdE1hcCgpOwotCQkJCX0KLQkJCQkKLQkJCQlwdWJsaWMgdm9pZCBsaWJyYXJ5Q2xvc2VkKE1ldGhvZExpYnJhcnkgbGlicmFyeSkgewotCQkJCQljbGVhcigpOwotCQkJCX0KLQkJCQkKLQkJCQlwdWJsaWMgdm9pZCBsaWJyYXJ5UmVvcGVuZWQoTWV0aG9kTGlicmFyeSBsaWJyYXJ5KSB7Ci0JCQkJCWluaXRNYXAoKTsKLQkJCQl9CQkJCQotCQkJfSk7Ci0JCX0KLQkJCi0JCXByaXZhdGUgdm9pZCBpbml0TWFwKCkgewotCQkJY2xlYXIoKTsKLQkJCQotCQkJLy8gZmlsbCB0aGlzIHNldCB3aXRoIGNvbnRhaW5lcnMgb2YgbWFya2VkIG9iamVjdHMKLQkJCS8vCi0vLwkJCU1ldGhvZExpYnJhcnkgbGliID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpOwotLy8JCQlpZihsaWIgIT0gbnVsbCkgewotLy8JCQkJSVByb2plY3QgcHJqID0gTWV0aG9kTGlicmFyeVByb2plY3QuZmluZFByb2plY3QobGliKTsKLS8vCQkJCWlmKHByaiAhPSBudWxsKSB7Ci0vLwkJCQkJdHJ5IHsKLS8vCQkJCQkJSU1hcmtlcltdIG1hcmtlcnMgPSBwcmouZmluZE1hcmtlcnMoSU5TVEFOQ0UuZ2V0TWFya2VySUQoKSwgZmFsc2UsIElSZXNvdXJjZS5ERVBUSF9JTkZJTklURSk7Ci0vLwkJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbWFya2Vycy5sZW5ndGg7IGkrKykgewotLy8JCQkJCQkJSU1hcmtlciBtYXJrZXIgPSBtYXJrZXJzW2ldOwotLy8JCQkJCQkJU3RyaW5nIGd1aWQgPSAoU3RyaW5nKSBtYXJrZXIuZ2V0QXR0cmlidXRlKEdVSUQpOwotLy8JCQkJCQkJTWV0aG9kRWxlbWVudCBlID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TGlicmFyeU1hbmFnZXIoKS5nZXRNZXRob2RFbGVtZW50KGd1aWQpOwotLy8JCQkJCQkJaWYoZSAhPSBudWxsKSB7Ci0vLwkJCQkJCQkJLy8gcmVtb3ZlIGl0cyBjb250YWluZXJzIGZyb20gY29udGFpbmVyc09mTWFya2VkT2JqZWN0cwotLy8JCQkJCQkJCS8vCi0vLwkJCQkJCQkJbWFya0NvbnRhaW5lcnMoZSk7Ci0vLwkJCQkJCQl9Ci0vLwkJCQkJCX0KLS8vCQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLS8vCQkJCQl9Ci0vLwkJCQl9Ci0vLwkJCX0KLQkJfQotCQkKLQkJcHJpdmF0ZSB2b2lkIGluY3JlbWVudChPYmplY3Qgb2JqZWN0KSB7Ci0JCQlJbnRlZ2VyIGNvdW50OwotCQkJaWYgKGNvbnRhaW5zS2V5KG9iamVjdCkpIHsKLQkJCQljb3VudCA9IGdldChvYmplY3QpOwotCQkJfSBlbHNlIHsKLQkJCQljb3VudCA9IG5ldyBJbnRlZ2VyKDApOwotCQkJfQotCQkJY291bnQrKzsKLQkJCXB1dChvYmplY3QsIGNvdW50KTsKLQkJfQotCi0JCXByaXZhdGUgdm9pZCBkZWNyZW1lbnQoT2JqZWN0IG9iamVjdCkgewotCQkJaWYgKGNvbnRhaW5zS2V5KG9iamVjdCkpIHsKLQkJCQlJbnRlZ2VyIGNvdW50ID0gZ2V0KG9iamVjdCk7Ci0JCQkJaWYgKGNvdW50ID09IDEpIHsKLQkJCQkJLy8gcmVtb3ZlIG9iamVjdAotCQkJCQlyZW1vdmUob2JqZWN0KTsKLQkJCQl9IGVsc2UgewotCQkJCQljb3VudC0tOwotCQkJCQlwdXQob2JqZWN0LCBjb3VudCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQlwcml2YXRlIHZvaWQgbWFya0NvbnRhaW5lcnMoTWV0aG9kRWxlbWVudCBlKSB7Ci0JCQlmb3IoRU9iamVjdCBjb250YWluZXIgPSBlLmVDb250YWluZXIoKTsgY29udGFpbmVyICE9IG51bGw7IGNvbnRhaW5lciA9IGNvbnRhaW5lci5lQ29udGFpbmVyKCkpIHsKLQkJCQlpbmNyZW1lbnQoY29udGFpbmVyKTsKLQkJCX0KLQkJfQotCi0JCXByaXZhdGUgdm9pZCB1bm1hcmtDb250YWluZXJzKE1ldGhvZEVsZW1lbnQgZSkgewotCQkJZm9yKEVPYmplY3QgY29udGFpbmVyID0gZS5lQ29udGFpbmVyKCk7IGNvbnRhaW5lciAhPSBudWxsOyBjb250YWluZXIgPSBjb250YWluZXIuZUNvbnRhaW5lcigpKSB7Ci0JCQkJZGVjcmVtZW50KGNvbnRhaW5lcik7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgQ29udGFpbmVyTWFwIGNvbnRhaW5lcnNPZk1hcmtlZE9iamVjdHMgPSBuZXcgQ29udGFpbmVyTWFwKCk7CQotCQotCQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TWFya2VySUQoKSB7Ci0JCXJldHVybiBNQVJLRVJfSUQ7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24udWkuTWFya2VySGVscGVyI2dldEZpbGUob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSSkKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpbGUgZ2V0RmlsZShVUkkgdXJpKSB7Ci0JCWlmKHVyaS5pc0ZpbGUoKSkgewotCQkJcmV0dXJuIChJRmlsZSkgRmlsZU1hbmFnZXIuZ2V0UmVzb3VyY2VGb3JMb2NhdGlvbih1cmkudG9GaWxlU3RyaW5nKCkpOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRGaWxlKHVyaSk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnV0aWwuRWRpdFVJTWFya2VySGVscGVyI2FkanVzdE1hcmtlcihvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyLCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRGlhZ25vc3RpYykKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBhZGp1c3RNYXJrZXIoSU1hcmtlciBtYXJrZXIsIERpYWdub3N0aWMgZGlhZ25vc3RpYykgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlib29sZWFuIHJldCA9IHN1cGVyLmFkanVzdE1hcmtlcihtYXJrZXIsIGRpYWdub3N0aWMpOwotCQlpZighZGlhZ25vc3RpYy5nZXREYXRhKCkuaXNFbXB0eSgpKSB7Ci0JCQlPYmplY3QgbyA9IGRpYWdub3N0aWMuZ2V0RGF0YSgpLmdldCgwKTsKLQkJCU9iamVjdCBzdHIgPSBkaWFnbm9zdGljLmdldERhdGEoKS5nZXQoMSk7Ci0JCQlpZihvIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJCW1hcmtlci5zZXRBdHRyaWJ1dGUoR1VJRCwgKChNZXRob2RFbGVtZW50KW8pLmdldEd1aWQoKSk7Ci0JCQkJbWFya2VyLnNldEF0dHJpYnV0ZShJTWFya2VyLkxPQ0FUSU9OLCBUbmdVdGlsLmdldExhYmVsKG8pICsgIiwgIiArIHN0cik7IC8vJE5PTi1OTFMtMSQKLQkgICAgCQltYXJrZXIuc2V0QXR0cmlidXRlKElERS5FRElUT1JfSURfQVRUUiwgIm9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5NZXRob2RFbGVtZW50RWRpdG9yIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWlmIChzdHIgaW5zdGFuY2VvZiBTdHJpbmcpIHsKLQkJCQltYXJrZXIuc2V0QXR0cmlidXRlKE1FVEhPRF9GSUVMRE5BTUUsIChTdHJpbmcpc3RyKTsKLQkJCX0KLQotCQl9Ci0JCXJldHVybiByZXQ7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0ludmFsaWQoT2JqZWN0IG9iamVjdCkgewotCQlpZihvYmplY3QgaW5zdGFuY2VvZiBQcm9jZXNzZXNJdGVtUHJvdmlkZXIpIHsKLQkJCS8vIHRoaXMgaXMgYW4gVUkgb2JqZWN0OiBQcm9jZXNzZXMKLQkJCS8vCi0JCQlQcm9jZXNzZXNJdGVtUHJvdmlkZXIgaXAgPSAoUHJvY2Vzc2VzSXRlbVByb3ZpZGVyKSBvYmplY3Q7Ci0JCQlPYmplY3QgbzsKLQkJCXJldHVybiAoKG8gPSBpcC5nZXRDYXBhYmlsaXR5UGF0dGVyblBhY2thZ2UoKSkgIT0gbnVsbCAmJiBjb250YWluZXJzT2ZNYXJrZWRPYmplY3RzLmNvbnRhaW5zS2V5KG8pKQotCQkJCXx8ICgobyA9IGlwLmdldERlbGl2ZXJ5UHJvY2Vzc1BhY2thZ2UoKSkgIT0gbnVsbCAmJiBjb250YWluZXJzT2ZNYXJrZWRPYmplY3RzLmNvbnRhaW5zS2V5KG8pKTsKLQkJfQotCQllbHNlIGlmKG9iamVjdCBpbnN0YW5jZW9mIE1ldGhvZFBhY2thZ2VzSXRlbVByb3ZpZGVyCi0JCQkJfHwgb2JqZWN0IGluc3RhbmNlb2YgQ29udGVudEl0ZW1Qcm92aWRlcikgewotCQkJLy8gdGhpcyBpcyBhbiBVSSBvYmplY3QKLQkJCS8vCi0JCQlvYmplY3QgPSAoKEl0ZW1Qcm92aWRlckFkYXB0ZXIpb2JqZWN0KS5nZXRUYXJnZXQoKTsKLQkJfQotCQllbHNlIGlmKG9iamVjdCBpbnN0YW5jZW9mIFRyYW5zaWVudENvbnRlbnRQYWNrYWdlSXRlbVByb3ZpZGVyKSB7Ci0JCQkvLyB0aGlzIGlzIGFuIFVJIG9iamVjdDogZWl0aGVyIFRhc2tzLCBSb2xlcywgV29yayBQcm9kdWN0cywgb3IgR3VpZGFuY2UKLQkJCS8vCi0JCQlDb2xsZWN0aW9uIGNoaWxkcmVuID0gKChUcmFuc2llbnRDb250ZW50UGFja2FnZUl0ZW1Qcm92aWRlcilvYmplY3QpLmdldENoaWxkcmVuKG9iamVjdCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjaGlsZHJlbi5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3Qgb2JqID0gaXRlci5uZXh0KCk7Ci0JCQkJaWYoY29udGFpbmVyc09mTWFya2VkT2JqZWN0cy5jb250YWluc0tleShvYmopIHx8IElOU1RBTkNFLmhhc01hcmtlcnMob2JqKSkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9CQkJCQotCQkJfQotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiBjb250YWluZXJzT2ZNYXJrZWRPYmplY3RzLmNvbnRhaW5zS2V5KG9iamVjdCkgfHwgSU5TVEFOQ0UuaGFzTWFya2VycyhvYmplY3QpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnVpLk1hcmtlckhlbHBlciNoYXNNYXJrZXJzKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzTWFya2VycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmKG9iamVjdCBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCUlSZXNvdXJjZSByZXNvdXJjZSA9IGdldEZpbGUob2JqZWN0KTsKLQkJCWlmIChyZXNvdXJjZSAhPSBudWxsICYmIHJlc291cmNlLmV4aXN0cygpKQotCQkJewotCQkJCXRyeQotCQkJCXsKLQkJCQkJU3RyaW5nIGd1aWQgPSAoKE1ldGhvZEVsZW1lbnQpb2JqZWN0KS5nZXRHdWlkKCk7Ci0JCQkJCUlNYXJrZXJbXSBtYXJrZXJzID0gcmVzb3VyY2UuZmluZE1hcmtlcnMoZ2V0TWFya2VySUQoKSwgZmFsc2UsIElSZXNvdXJjZS5ERVBUSF9aRVJPKTsKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtYXJrZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQlJTWFya2VyIG1hcmtlciA9IG1hcmtlcnNbaV07Ci0JCQkJCQlpZihndWlkLmVxdWFscyhtYXJrZXIuZ2V0QXR0cmlidXRlKEdVSUQpKSkgewotCQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpCi0JCQkJewotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCXJldHVybiBzdXBlci5oYXNNYXJrZXJzKG9iamVjdCk7Ci0JfQotCQotCS8qKgotCSAqIE92ZXJyaWRlZCB0byBoYW5kbGUgZXhjZXB0aW9uIHRoYXQgaXMgdGhyb3duIGlmIHRoZSBvYmplY3QgYWxyZWFkeSBoYXMgYmVlbiB1bmxvYWRlZAotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkudXRpbC5FZGl0VUlNYXJrZXJIZWxwZXIjZ2V0RmlsZShqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBJRmlsZSBnZXRGaWxlKE9iamVjdCBkYXR1bSkgewotCQl0cnkgewotCQkJcmV0dXJuIHN1cGVyLmdldEZpbGUoZGF0dW0pOwotCQl9Ci0JCWNhdGNoKEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCBkZWxldGVNYXJrZXJzKE9iamVjdCBvYmplY3QsIFN0cmluZyBmaWVsZE5hbWUpIHsKLQkJaWYob2JqZWN0IGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJSVJlc291cmNlIHJlc291cmNlID0gZ2V0RmlsZShvYmplY3QpOwotCQkJaWYgKHJlc291cmNlICE9IG51bGwpCi0JCQl7Ci0JCQkJdHJ5Ci0JCQkJewotCQkJCQlTdHJpbmcgZ3VpZCA9ICgoTWV0aG9kRWxlbWVudClvYmplY3QpLmdldEd1aWQoKTsKLQkJCQkJSU1hcmtlcltdIG1hcmtlcnMgPSByZXNvdXJjZS5maW5kTWFya2VycyhnZXRNYXJrZXJJRCgpLCBmYWxzZSwgSVJlc291cmNlLkRFUFRIX1pFUk8pOwotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IG1hcmtlcnMubGVuZ3RoOyBpKyspIHsKLQkJCQkJCUlNYXJrZXIgbWFya2VyID0gbWFya2Vyc1tpXTsKLQkJCQkJCWlmKGd1aWQuZXF1YWxzKG1hcmtlci5nZXRBdHRyaWJ1dGUoR1VJRCkpICYmIChmaWVsZE5hbWUgPT0gbnVsbCB8fAotCQkJCQkJCQlmaWVsZE5hbWUuZXF1YWxzKG1hcmtlci5nZXRBdHRyaWJ1dGUoTUVUSE9EX0ZJRUxETkFNRSkpKSkgewotCQkJCQkJCW1hcmtlci5kZWxldGUoKTsKLS8vCQkJCQkJCU1ldGhvZEVsZW1lbnQgZSA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudExpYnJhcnlNYW5hZ2VyKCkuZ2V0TWV0aG9kRWxlbWVudChndWlkKTsKLS8vCQkJCQkJCWlmKGUgIT0gbnVsbCkgewotLy8JCQkJCQkJCS8vIHJlbW92ZSBpdHMgY29udGFpbmVycyBmcm9tIGNvbnRhaW5lcnNPZk1hcmtlZE9iamVjdHMKLS8vCQkJCQkJCQkvLwotLy8JCQkJCQkJCWNvbnRhaW5lcnNPZk1hcmtlZE9iamVjdHMudW5tYXJrQ29udGFpbmVycyhlKTsKLS8vCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKQotCQkJCXsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCXN1cGVyLmRlbGV0ZU1hcmtlcnMob2JqZWN0KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBkZWxldGVNYXJrZXJzKElSZXNvdXJjZSByZXNvdXJjZSwgYm9vbGVhbiBpbmNsdWRlU3VidHlwZXMsIGludCBkZXB0aCkgewotLy8JCWlmIChyZXNvdXJjZSAhPSBudWxsKSB7Ci0vLwkJCXRyeSB7CQkJCQotLy8JCQkJSU1hcmtlcltdIG1hcmtlcnMgPSByZXNvdXJjZS5maW5kTWFya2VycyhnZXRNYXJrZXJJRCgpLCBmYWxzZSwgSVJlc291cmNlLkRFUFRIX1pFUk8pOwotLy8JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtYXJrZXJzLmxlbmd0aDsgaSsrKSB7Ci0vLwkJCQkJSU1hcmtlciBtYXJrZXIgPSBtYXJrZXJzW2ldOwotLy8JCQkJCVN0cmluZyBndWlkID0gKFN0cmluZykgbWFya2VyLmdldEF0dHJpYnV0ZShHVUlEKTsKLS8vCQkJCQlNZXRob2RFbGVtZW50IGUgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRMaWJyYXJ5TWFuYWdlcigpLmdldE1ldGhvZEVsZW1lbnQoZ3VpZCk7Ci0vLwkJCQkJaWYoZSAhPSBudWxsKSB7Ci0vLwkJCQkJCS8vIHJlbW92ZSBpdHMgY29udGFpbmVycyBmcm9tIGNvbnRhaW5lcnNPZk1hcmtlZE9iamVjdHMKLS8vCQkJCQkJLy8KLS8vCQkJCQkJY29udGFpbmVyc09mTWFya2VkT2JqZWN0cy51bm1hcmtDb250YWluZXJzKGUpOwotLy8JCQkJCX0KLS8vCQkJCX0KLS8vCi0vLwkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotLy8JCQkJCi0vLwkJCX0JCQkKLS8vCQl9Ci0JCQkKLQkJc3VwZXIuZGVsZXRlTWFya2VycyhyZXNvdXJjZSwgaW5jbHVkZVN1YnR5cGVzLCBkZXB0aCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZU1hcmtlcnMoSVJlc291cmNlIHJlc291cmNlLCBEaWFnbm9zdGljIGRpYWdub3N0aWMsIERpYWdub3N0aWMgcGFyZW50RGlhZ25vc3RpYykgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlzdXBlci5jcmVhdGVNYXJrZXJzKHJlc291cmNlLCBkaWFnbm9zdGljLCBwYXJlbnREaWFnbm9zdGljKTsKLS8vCQlTdHJpbmcgZmllbGROYW1lID0gbnVsbDsKLS8vCQlpZighZGlhZ25vc3RpYy5nZXREYXRhKCkuaXNFbXB0eSgpICYmIGRpYWdub3N0aWMuZ2V0RGF0YSgpLnNpemUoKSA+IDEpIHsKLS8vCQkJZmllbGROYW1lID0gKFN0cmluZylkaWFnbm9zdGljLmdldERhdGEoKS5nZXQoMSk7Ci0vLwkJfQotLy8JCWlmIChyZXNvdXJjZSAhPSBudWxsICYmIGZpZWxkTmFtZSAhPSBudWxsKSB7Ci0vLwkJCXRyeSB7CQkJCQotLy8JCQkJSU1hcmtlcltdIG1hcmtlcnMgPSByZXNvdXJjZS5maW5kTWFya2VycyhnZXRNYXJrZXJJRCgpLCBmYWxzZSwgSVJlc291cmNlLkRFUFRIX1pFUk8pOwotLy8JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtYXJrZXJzLmxlbmd0aDsgaSsrKSB7Ci0vLwkJCQkJSU1hcmtlciBtYXJrZXIgPSBtYXJrZXJzW2ldOwotLy8JCQkJCVN0cmluZyBndWlkID0gKFN0cmluZykgbWFya2VyLmdldEF0dHJpYnV0ZShHVUlEKTsKLS8vCQkJCQlpZihmaWVsZE5hbWUuZXF1YWxzKG1hcmtlci5nZXRBdHRyaWJ1dGUoTUVUSE9EX0ZJRUxETkFNRSkpKSB7Ci0vLwkJCQkJCU1ldGhvZEVsZW1lbnQgZSA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudExpYnJhcnlNYW5hZ2VyKCkuZ2V0TWV0aG9kRWxlbWVudChndWlkKTsKLS8vCQkJCQkJaWYoZSAhPSBudWxsKSB7Ci0vLwkJCQkJCQkvLyBhZGQgaXRzIGNvbnRhaW5lcnMgdG8gY29udGFpbmVyc09mTWFya2VkT2JqZWN0cwotLy8JCQkJCQkJLy8KLS8vCQkJCQkJCWNvbnRhaW5lcnNPZk1hcmtlZE9iamVjdHMubWFya0NvbnRhaW5lcnMoZSk7Ci0vLwkJCQkJCX0KLS8vCQkJCQl9Ci0vLwkJCQl9Ci0vLwotLy8JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLS8vCQkJCQotLy8JCQl9CQkJCi0vLwkJfQotCi0JfQotCQotICAgIHByb3RlY3RlZCBTdHJpbmcgY29tcG9zZU1lc3NhZ2UoRGlhZ25vc3RpYyBkaWFnbm9zdGljLCBEaWFnbm9zdGljIHBhcmVudERpYWdub3N0aWMpCi0gICAgewotICAgICAgU3RyaW5nIG1lc3NhZ2UgPSBkaWFnbm9zdGljLmdldE1lc3NhZ2UoKTsKLSAgICAgIGlmIChwYXJlbnREaWFnbm9zdGljICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyBwYXJlbnRNZXNzYWdlID0gcGFyZW50RGlhZ25vc3RpYy5nZXRNZXNzYWdlKCk7Ci0gICAgICAgIGlmIChwYXJlbnRNZXNzYWdlICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBtZXNzYWdlID0gbWVzc2FnZSAhPSBudWxsID8gcGFyZW50TWVzc2FnZSArICIgIiArIG1lc3NhZ2UgOiBwYXJlbnRNZXNzYWdlOyAvLyROT04tTkxTLTEkCi0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHJldHVybiBtZXNzYWdlOwotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3V0aWwvUmVmcmVzaEhhbmRsZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvdXRpbC9SZWZyZXNoSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YTIwYWFjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvdXRpbC9SZWZyZXNoSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudXRpbDsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51aS52aWV3ZXIuSVZpZXdlclByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5NZXRob2RFbGVtZW50RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5NZXRob2RFbGVtZW50RWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuSUxpYnJhcnlNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5NdWx0aUZpbGVSZXNvdXJjZVNldEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLnJlZnJlc2guSVJlZnJlc2hIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5yZWZyZXNoLlJlZnJlc2hKb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLnV0aWwuTGlicmFyeVNjaGVkdWxpbmdSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS51dGlsLlBlcnNpc3RlbmNlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLlByb2dyZXNzTW9uaXRvckRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uSVJ1bm5hYmxlQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uSVJ1bm5hYmxlV2l0aFByb2dyZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLkxpc3RTZWxlY3Rpb25EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5WaWV3UGFydDsKLQotLyoqCi0gKiBOb3RpZnkgY2hhbmdlcyBpbiByZXNvdXJjZXMgdG8gcmVmcmVzaAotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUmVmcmVzaEhhbmRsZXIgaW1wbGVtZW50cyBJUmVmcmVzaEhhbmRsZXIgewotCQotCXByaXZhdGUgVmlld1BhcnQgdmlldzsKLQotCi0JcHVibGljIFJlZnJlc2hIYW5kbGVyKFZpZXdQYXJ0IHZpZXcpIHsKLQkJdGhpcy52aWV3ID0gdmlldzsKLQl9Ci0JCi0JcHJpdmF0ZSBDb250cm9sIGdldENvbnRyb2woKSB7Ci0JCWlmKHZpZXcgaW5zdGFuY2VvZiBJVmlld2VyUHJvdmlkZXIpIHsKLQkJCVZpZXdlciB2aWV3ZXIgPSAoKElWaWV3ZXJQcm92aWRlcil2aWV3KS5nZXRWaWV3ZXIoKTsKLQkJCWlmKHZpZXdlciAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIHZpZXdlci5nZXRDb250cm9sKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVmcmVzaChJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJQ29udHJvbCBjdHJsID0gZ2V0Q29udHJvbCgpOwotCQlpZiAoY3RybCA9PSBudWxsIHx8IGN0cmwuaXNEaXNwb3NlZCgpKQotCQkJcmV0dXJuOwotCi0JCWlmIChjdHJsLmdldERpc3BsYXkoKS5nZXRUaHJlYWQoKSA9PSBUaHJlYWQuY3VycmVudFRocmVhZCgpKSB7Ci0JCQlkb1JlZnJlc2godmlldy5nZXRTaXRlKCkuZ2V0U2hlbGwoKSk7Ci0JCX0gZWxzZSB7Ci0JCQljdHJsLmdldERpc3BsYXkoKS5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0KLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCWRvUmVmcmVzaChudWxsKTsKLQkJCQl9Ci0KLQkJCX0pOwotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCBkb1JlZnJlc2goU2hlbGwgc2hlbGwpIHsKLQkJZmluYWwgYm9vbGVhbiByZWZyZXNoVmlld3MgPSAhUmVmcmVzaEpvYi5nZXRJbnN0YW5jZSgpCi0JCQkJLmdldFJlbG9hZGVkQmVmb3JlUmVmcmVzaFJlc291cmNlcygpLmlzRW1wdHkoKQotCQkJCXx8ICFSZWZyZXNoSm9iLmdldEluc3RhbmNlKCkuZ2V0QWRkZWRSZXNvdXJjZXMoKS5pc0VtcHR5KCk7Ci0JCUFycmF5TGlzdDxSZXNvdXJjZT4gcmVtb3ZlZFJlc291cmNlcyA9IG5ldyBBcnJheUxpc3Q8UmVzb3VyY2U+KFJlZnJlc2hKb2IuZ2V0SW5zdGFuY2UoKQotCQkJCS5nZXRSZW1vdmVkUmVzb3VyY2VzKCkpOwotCQlBcnJheUxpc3Q8UmVzb3VyY2U+IGNoYW5nZWRSZXNvdXJjZXMgPSBuZXcgQXJyYXlMaXN0PFJlc291cmNlPihSZWZyZXNoSm9iLmdldEluc3RhbmNlKCkKLQkJCQkuZ2V0Q2hhbmdlZFJlc291cmNlcygpKTsKLQkJQXJyYXlMaXN0PElSZXNvdXJjZT4gYWRkZWRXc1Jlc291cmNlcyA9IG5ldyBBcnJheUxpc3Q8SVJlc291cmNlPihSZWZyZXNoSm9iLmdldEluc3RhbmNlKCkKLQkJCQkuZ2V0QWRkZWRXb3Jrc3BhY2VSZXNvdXJjZXMoKSk7Ci0KLQkJaWYgKCFyZW1vdmVkUmVzb3VyY2VzLmlzRW1wdHkoKSB8fCAhY2hhbmdlZFJlc291cmNlcy5pc0VtcHR5KCkKLQkJCQl8fCAhYWRkZWRXc1Jlc291cmNlcy5pc0VtcHR5KCkgfHwgcmVmcmVzaFZpZXdzKSB7Ci0JCQlibG9ja2luZ1JlZnJlc2gocmVtb3ZlZFJlc291cmNlcywgY2hhbmdlZFJlc291cmNlcywKLQkJCQkJYWRkZWRXc1Jlc291cmNlcywgc2hlbGwpOwotCQl9Ci0KLQkJaWYgKCFyZW1vdmVkUmVzb3VyY2VzLmlzRW1wdHkoKSkgewotCQkJUmVmcmVzaEpvYi5nZXRJbnN0YW5jZSgpLmdldFJlbW92ZWRSZXNvdXJjZXMoKS5yZW1vdmVBbGwoCi0JCQkJCXJlbW92ZWRSZXNvdXJjZXMpOwotCQl9Ci0JCWlmICghY2hhbmdlZFJlc291cmNlcy5pc0VtcHR5KCkpIHsKLQkJCVJlZnJlc2hKb2IuZ2V0SW5zdGFuY2UoKS5nZXRDaGFuZ2VkUmVzb3VyY2VzKCkucmVtb3ZlQWxsKAotCQkJCQljaGFuZ2VkUmVzb3VyY2VzKTsKLQkJfQotCQlpZiAoIWFkZGVkV3NSZXNvdXJjZXMuaXNFbXB0eSgpKSB7Ci0JCQlSZWZyZXNoSm9iLmdldEluc3RhbmNlKCkuZ2V0QWRkZWRXb3Jrc3BhY2VSZXNvdXJjZXMoKS5yZW1vdmVBbGwoCi0JCQkJCWFkZGVkV3NSZXNvdXJjZXMpOwotCQl9Ci0JCWlmIChyZWZyZXNoVmlld3MpIHsKLQkJCVJlZnJlc2hKb2IuZ2V0SW5zdGFuY2UoKS5nZXRSZWxvYWRlZEJlZm9yZVJlZnJlc2hSZXNvdXJjZXMoKQotCQkJCQkuY2xlYXIoKTsKLQkJCVJlZnJlc2hKb2IuZ2V0SW5zdGFuY2UoKS5nZXRBZGRlZFJlc291cmNlcygpLmNsZWFyKCk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGJsb2NraW5nUmVmcmVzaChmaW5hbCBBcnJheUxpc3Q8UmVzb3VyY2U+IHJlbW92ZWRSZXNvdXJjZXMsCi0JCQlmaW5hbCBBcnJheUxpc3Q8UmVzb3VyY2U+IGNoYW5nZWRSZXNvdXJjZXMsCi0JCQlmaW5hbCBDb2xsZWN0aW9uPElSZXNvdXJjZT4gYWRkZWRXb3Jrc3BhY2VSZXNvdXJjZXMsCi0JCQlTaGVsbCBzaGVsbCkgewotCQlmaW5hbCBJUnVubmFibGVXaXRoUHJvZ3Jlc3MgcnVubmFibGUgPSBuZXcgSVJ1bm5hYmxlV2l0aFByb2dyZXNzKCkgewotCi0JCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQotCQkJCQl0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQkJCW1vbml0b3IuYmVnaW5UYXNrKCIiLCBJUHJvZ3Jlc3NNb25pdG9yLlVOS05PV04pOyAvLyROT04tTkxTLTEkCi0JCQkJbW9uaXRvcgotCQkJCQkJLnN1YlRhc2soQXV0aG9yaW5nVUlSZXNvdXJjZXMuX1VJX1JlZnJlc2hWaWV3ZXJfbWVudV9pdGVtKTsKLQkJCQltb25pdG9yLndvcmtlZCgxKTsKLQkJCQl0cnkgewotCQkJCQkvLyBtb25pdG9yLndvcmtlZCgxKTsKLQkJCQkJZG9SZWZyZXNoKHJlbW92ZWRSZXNvdXJjZXMsIGNoYW5nZWRSZXNvdXJjZXMsCi0JCQkJCQkJYWRkZWRXb3Jrc3BhY2VSZXNvdXJjZXMpOwotCQkJCX0gZmluYWxseSB7Ci0JCQkJCW1vbml0b3IuZG9uZSgpOwotCQkJCX0KLQkJCX0KLQotCQl9OwotCi0JCUlSdW5uYWJsZUNvbnRleHQgY29udGV4dCA9IG5ldyBQcm9ncmVzc01vbml0b3JEaWFsb2coc2hlbGwpOwotCQl0cnkgewotCQkJdmlldy5nZXRTaXRlKCkuZ2V0V29ya2JlbmNoV2luZG93KCkuZ2V0V29ya2JlbmNoKCkuZ2V0UHJvZ3Jlc3NTZXJ2aWNlKCkKLQkJCQkJLnJ1bkluVUkoCi0JCQkJCQkJY29udGV4dCwKLQkJCQkJCQlydW5uYWJsZSwKLQkJCQkJCQluZXcgTGlicmFyeVNjaGVkdWxpbmdSdWxlKExpYnJhcnlTZXJ2aWNlCi0JCQkJCQkJCQkuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpKSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQlTdHJpbmcgdGl0bGUgPSBBdXRob3JpbmdVSVJlc291cmNlcy5Qcm9jZXNzRWRpdG9yX3JlZnJlc2hFcnJvclRpdGxlOwotCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpLmRpc3BsYXlFcnJvcih0aXRsZSwKLQkJCQkJZS50b1N0cmluZygpLCBlKTsKLQkJfQotCX0KLQotCQotCS8qKgotCSAqIE11c3QgYmUgc3luY2hyb25pemVkIHRvIGF2b2lkIHN0ZXBwaW5nIG9uIGVhY2ggb3RoZXIgaW4gcmVsb2FkaW5nCi0JICogcmVzb3VyY2VzL3JlZnJlc2hpbmcgVUkKLQkgKiAKLQkgKiBAcGFyYW0gcmVtb3ZlZFJlc291cmNlcwotCSAqIEBwYXJhbSBjaGFuZ2VkUmVzb3VyY2VzCi0JICogQHBhcmFtIGFkZGVkV29ya3NwYWNlUmVzb3VyY2VzCi0JICogICAgICAgICAgICBjb2xsZWN0aW9uIG9mIElSZXNvdXJjZSBvYmplY3RzIHRoYXQgYXJlIGp1c3QgbmV3bHkgYWRkZWQgdG8KLQkgKiAgICAgICAgICAgIHRoZSBsaWJyYXJ5Ci0JICogQHBhcmFtIHJlZnJlc2hWaWV3cwotCSAqLwotCXByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgZG9SZWZyZXNoKENvbGxlY3Rpb248UmVzb3VyY2U+IHJlbW92ZWRSZXNvdXJjZXMsCi0JCQlDb2xsZWN0aW9uPFJlc291cmNlPiBjaGFuZ2VkUmVzb3VyY2VzLCBDb2xsZWN0aW9uPElSZXNvdXJjZT4gYWRkZWRXb3Jrc3BhY2VSZXNvdXJjZXMpIHsKLQkJSGFzaFNldDxJRWRpdG9yUGFydD4gZWRpdG9yc1RvUmVmcmVzaCA9IG5ldyBIYXNoU2V0PElFZGl0b3JQYXJ0PigpOwotCQlpZiAoIXJlbW92ZWRSZXNvdXJjZXMuaXNFbXB0eSgpKSB7Ci0JCQloYW5kbGVSZW1vdmVkUmVzb3VyY2VzKHJlbW92ZWRSZXNvdXJjZXMsIGVkaXRvcnNUb1JlZnJlc2gpOwotCQl9Ci0JCWlmICghY2hhbmdlZFJlc291cmNlcy5pc0VtcHR5KCkpIHsKLQkJCWhhbmRsZUNoYW5nZWRSZXNvdXJjZXMoY2hhbmdlZFJlc291cmNlcywgZWRpdG9yc1RvUmVmcmVzaCk7Ci0JCX0KLQkJaWYgKGFkZGVkV29ya3NwYWNlUmVzb3VyY2VzICE9IG51bGwKLQkJCQkmJiAhYWRkZWRXb3Jrc3BhY2VSZXNvdXJjZXMuaXNFbXB0eSgpKSB7Ci0JCQlJTGlicmFyeU1hbmFnZXIgbWdyID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKQotCQkJCQkuZ2V0Q3VycmVudExpYnJhcnlNYW5hZ2VyKCk7Ci0JCQlpZiAobWdyICE9IG51bGwpIHsKLQkJCQlSZXNvdXJjZVNldCByZXNvdXJjZVNldCA9IG1nci5nZXRFZGl0aW5nRG9tYWluKCkKLQkJCQkJCS5nZXRSZXNvdXJjZVNldCgpOwotCQkJCWlmIChyZXNvdXJjZVNldCBpbnN0YW5jZW9mIE11bHRpRmlsZVJlc291cmNlU2V0SW1wbCkgewotCQkJCQkoKE11bHRpRmlsZVJlc291cmNlU2V0SW1wbCkgcmVzb3VyY2VTZXQpCi0JCQkJCQkJLmxvYWROZXdSZXNvdXJjZXMoYWRkZWRXb3Jrc3BhY2VSZXNvdXJjZXMpOwotCQkJCQkoKE11bHRpRmlsZVJlc291cmNlU2V0SW1wbCkgcmVzb3VyY2VTZXQpLmdldFVucmVzb2x2ZWRQcm94eU1hcmtlck1hbmFnZXIoKS52YWxpZGF0ZUFsbE1hcmtlcnMoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBDb2xsZWN0aW9uPFJlc291cmNlPiBoYW5kbGVDaGFuZ2VkUmVzb3VyY2VzKENvbGxlY3Rpb248UmVzb3VyY2U+IGNoYW5nZWRSZXNvdXJjZXMsCi0JCQlDb2xsZWN0aW9uPElFZGl0b3JQYXJ0PiBlZGl0b3JzVG9SZWZyZXNoKSB7Ci0JCXJldHVybiBoYW5kbGVDaGFuZ2VkUmVzb3VyY2VzKGNoYW5nZWRSZXNvdXJjZXMsIG51bGwsIGVkaXRvcnNUb1JlZnJlc2gpOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSByZW1vdmVkUmVzb3VyY2VzCi0JICogQHBhcmFtIGVkaXRvcnNUb1JlZnJlc2gKLQkgKiBAcmV0dXJuIHJlc291cmNlcyB0aGF0IGhhdmUgYmVlbiB1bmxvYWRlZAotCSAqLwotCXByaXZhdGUgQ29sbGVjdGlvbjxSZXNvdXJjZT4gaGFuZGxlUmVtb3ZlZFJlc291cmNlcyhDb2xsZWN0aW9uPFJlc291cmNlPiByZW1vdmVkUmVzb3VyY2VzLAotCQkJQ29sbGVjdGlvbjxJRWRpdG9yUGFydD4gZWRpdG9yc1RvUmVmcmVzaCkgewotCQlJV29ya2JlbmNoUGFnZSB3b3JrYmVuY2hQYWdlID0gdmlldy5nZXRTaXRlKCkuZ2V0UGFnZSgpOwotCQlJRWRpdG9yUmVmZXJlbmNlW10gZWRpdG9yUmVmZXJlbmNlcyA9IHdvcmtiZW5jaFBhZ2UKLQkJCQkuZ2V0RWRpdG9yUmVmZXJlbmNlcygpOwotCQlBcnJheUxpc3Q8SUVkaXRvclBhcnQ+IGRpcnR5RWRpdG9yc1dpdGhDb25mbGljdCA9IG5ldyBBcnJheUxpc3Q8SUVkaXRvclBhcnQ+KCk7Ci0JCUFycmF5TGlzdDxSZXNvdXJjZT4gcmVtb3ZlZFJlc291cmNlTGlzdCA9IG5ldyBBcnJheUxpc3Q8UmVzb3VyY2U+KHJlbW92ZWRSZXNvdXJjZXMpOwotCQlpZiAoZWRpdG9yc1RvUmVmcmVzaCA9PSBudWxsKSB7Ci0JCQllZGl0b3JzVG9SZWZyZXNoID0gbmV3IEFycmF5TGlzdDxJRWRpdG9yUGFydD4oKTsKLQkJfQotCQkvLyBmaW5kIGFsbCBlZGl0b3Igd2l0aCBkaXJ0eSBjb25mbGljdAotCQkvLwotCQlmb3IgKGludCBpID0gMDsgaSA8IGVkaXRvclJlZmVyZW5jZXMubGVuZ3RoOyBpKyspIHsKLQkJCUlFZGl0b3JSZWZlcmVuY2UgcmVmZXJlbmNlID0gZWRpdG9yUmVmZXJlbmNlc1tpXTsKLQkJCUlFZGl0b3JQYXJ0IGVkaXRvciA9IHJlZmVyZW5jZS5nZXRFZGl0b3IodHJ1ZSk7Ci0JCQlpZiAoZWRpdG9yIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudEVkaXRvciAmJiBlZGl0b3IuaXNEaXJ0eSgpKSB7Ci0JCQkJTWV0aG9kRWxlbWVudEVkaXRvcklucHV0IGlucHV0ID0gKE1ldGhvZEVsZW1lbnRFZGl0b3JJbnB1dCkgZWRpdG9yCi0JCQkJCQkuZ2V0RWRpdG9ySW5wdXQoKTsKLQkJCQlSZXNvdXJjZSByZXNvdXJjZSA9IGlucHV0LmdldE1ldGhvZEVsZW1lbnQoKSAhPSBudWxsID8gaW5wdXQKLQkJCQkJCS5nZXRNZXRob2RFbGVtZW50KCkuZVJlc291cmNlKCkgOiBudWxsOwotCQkJCWlmICghcmVtb3ZlZFJlc291cmNlcy5jb250YWlucyhyZXNvdXJjZSkpIHsKLQkJCQkJQ29sbGVjdGlvbjxSZXNvdXJjZT4gdXNlZFJlc291cmNlcyA9ICgoTWV0aG9kRWxlbWVudEVkaXRvcikgZWRpdG9yKQotCQkJCQkJCS5nZXRVc2VkUmVzb3VyY2VzKCk7Ci0JCQkJCWNoZWNrX3Jlc291cmNlOiBmb3IgKGludCBqID0gMDsgaiA8IHJlbW92ZWRSZXNvdXJjZUxpc3QKLQkJCQkJCQkuc2l6ZSgpOyBqKyspIHsKLQkJCQkJCXJlc291cmNlID0gKFJlc291cmNlKSByZW1vdmVkUmVzb3VyY2VMaXN0LmdldChqKTsKLQkJCQkJCWlmICh1c2VkUmVzb3VyY2VzLmNvbnRhaW5zKHJlc291cmNlKSkgewotCQkJCQkJCWRpcnR5RWRpdG9yc1dpdGhDb25mbGljdC5hZGQoZWRpdG9yKTsKLQkJCQkJCQlicmVhayBjaGVja19yZXNvdXJjZTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCWVkaXRvcnNUb1JlZnJlc2guYWRkKGVkaXRvcik7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJaWYgKCFkaXJ0eUVkaXRvcnNXaXRoQ29uZmxpY3QuaXNFbXB0eSgpKSB7Ci0JCQlPYmplY3RbXSBzZWxlY3RlZCA9IHNlbGVjdERpcnR5RWRpdG9ycyhkaXJ0eUVkaXRvcnNXaXRoQ29uZmxpY3QpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzZWxlY3RlZC5sZW5ndGg7IGkrKykgewotCQkJCWVkaXRvcnNUb1JlZnJlc2guYWRkKChJRWRpdG9yUGFydCkgc2VsZWN0ZWRbaV0pOwotCQkJfQotCQl9Ci0KLQkJLy8gVW5sb2FkIHRoZSByZW1vdmVkIHJlc291cmNlcy4KLQkJUGVyc2lzdGVuY2VVdGlsLnVubG9hZChyZW1vdmVkUmVzb3VyY2VzKTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IGVkaXRvclJlZmVyZW5jZXMubGVuZ3RoOyBpKyspIHsKLQkJCUlFZGl0b3JSZWZlcmVuY2UgcmVmZXJlbmNlID0gZWRpdG9yUmVmZXJlbmNlc1tpXTsKLQkJCUlFZGl0b3JQYXJ0IGVkaXRvciA9IHJlZmVyZW5jZS5nZXRFZGl0b3IodHJ1ZSk7Ci0JCQlpZiAoZWRpdG9yIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudEVkaXRvciAmJiAhZWRpdG9yLmlzRGlydHkoKSkgewotCQkJCUNvbGxlY3Rpb248UmVzb3VyY2U+IHVzZWRSZXNvdXJjZXMgPSAoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGVkaXRvcikKLQkJCQkJCS5nZXRVc2VkUmVzb3VyY2VzKCk7Ci0JCQkJY2hlY2tfcmVzb3VyY2U6IGZvciAoaW50IGogPSAwOyBqIDwgcmVtb3ZlZFJlc291cmNlTGlzdC5zaXplKCk7IGorKykgewotCQkJCQlSZXNvdXJjZSByZXNvdXJjZSA9IChSZXNvdXJjZSkgcmVtb3ZlZFJlc291cmNlTGlzdC5nZXQoaik7Ci0JCQkJCWlmICh1c2VkUmVzb3VyY2VzLmNvbnRhaW5zKHJlc291cmNlKSkgewotCQkJCQkJZWRpdG9yc1RvUmVmcmVzaC5hZGQoZWRpdG9yKTsKLQkJCQkJCWJyZWFrIGNoZWNrX3Jlc291cmNlOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHJlbW92ZWRSZXNvdXJjZXM7Ci0JfQotCi0KLQkvKioKLQkgKiBSZWxvYWQgdGhlIGNoYW5nZWQgcmVzb3VyY2VzCi0JICogCi0JICogQHBhcmFtIGNoYW5nZWRSZXNvdXJjZXMKLQkgKiBAcGFyYW0gZWRpdG9yc05vdFRvUmVmcmVzaAotCSAqIEBwYXJhbSBlZGl0b3JzVG9SZWZyZXNoCi0JICogQHJldHVybiBMaXN0IG9mIGNoYW5nZWQgcmVzb3VyY2VzIHRoYXQgaGF2ZSBiZWVuIHJlbG9hZGVkCi0JICovCi0JcHVibGljIENvbGxlY3Rpb248UmVzb3VyY2U+IGhhbmRsZUNoYW5nZWRSZXNvdXJjZXMoQ29sbGVjdGlvbjxSZXNvdXJjZT4gY2hhbmdlZFJlc291cmNlcywKLQkJCUNvbGxlY3Rpb248SUVkaXRvclBhcnQ+IGVkaXRvcnNOb3RUb1JlZnJlc2gsIENvbGxlY3Rpb248SUVkaXRvclBhcnQ+IGVkaXRvcnNUb1JlZnJlc2gpIHsKLQkJQ29udHJvbCBjdHJsID0gZ2V0Q29udHJvbCgpOwotCQlpZiAoY3RybCA9PSBudWxsIHx8IGN0cmwuaXNEaXNwb3NlZCgpKQotCQkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOwotCi0JCUlXb3JrYmVuY2hQYWdlIHdvcmtiZW5jaFBhZ2UgPSB2aWV3LmdldFNpdGUoKS5nZXRQYWdlKCk7Ci0JCUlFZGl0b3JSZWZlcmVuY2VbXSBlZGl0b3JSZWZlcmVuY2VzID0gd29ya2JlbmNoUGFnZQotCQkJCS5nZXRFZGl0b3JSZWZlcmVuY2VzKCk7Ci0JCUFycmF5TGlzdDxJRWRpdG9yUGFydD4gZGlydHlFZGl0b3JzV2l0aENvbmZsaWN0ID0gbmV3IEFycmF5TGlzdDxJRWRpdG9yUGFydD4oKTsKLQkJQXJyYXlMaXN0PFJlc291cmNlPiBjaGFuZ2VkUmVzb3VyY2VMaXN0ID0gbmV3IEFycmF5TGlzdDxSZXNvdXJjZT4oY2hhbmdlZFJlc291cmNlcyk7Ci0JCS8vIGZpbmQgYWxsIGVkaXRvciB3aXRoIGRpcnR5IGNvbmZsaWN0Ci0JCS8vCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgZWRpdG9yUmVmZXJlbmNlcy5sZW5ndGg7IGkrKykgewotCQkJSUVkaXRvclJlZmVyZW5jZSByZWZlcmVuY2UgPSBlZGl0b3JSZWZlcmVuY2VzW2ldOwotCQkJSUVkaXRvclBhcnQgZWRpdG9yID0gcmVmZXJlbmNlLmdldEVkaXRvcih0cnVlKTsKLQkJCWlmIChlZGl0b3IgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50RWRpdG9yICYmIGVkaXRvci5pc0RpcnR5KCkpIHsKLQkJCQlDb2xsZWN0aW9uPFJlc291cmNlPiB1c2VkUmVzb3VyY2VzID0gKChNZXRob2RFbGVtZW50RWRpdG9yKSBlZGl0b3IpCi0JCQkJCQkuZ2V0VXNlZFJlc291cmNlcygpOwotCQkJCWNoZWNrX3Jlc291cmNlOiBmb3IgKGludCBqID0gMDsgaiA8IGNoYW5nZWRSZXNvdXJjZUxpc3Quc2l6ZSgpOyBqKyspIHsKLQkJCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSAoUmVzb3VyY2UpIGNoYW5nZWRSZXNvdXJjZUxpc3QuZ2V0KGopOwotCQkJCQlpZiAodXNlZFJlc291cmNlcy5jb250YWlucyhyZXNvdXJjZSkpIHsKLQkJCQkJCWRpcnR5RWRpdG9yc1dpdGhDb25mbGljdC5hZGQoZWRpdG9yKTsKLQkJCQkJCWJyZWFrIGNoZWNrX3Jlc291cmNlOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmICghZGlydHlFZGl0b3JzV2l0aENvbmZsaWN0LmlzRW1wdHkoKSkgewotCQkJT2JqZWN0W10gcmVzdWx0ID0gc2VsZWN0RGlydHlFZGl0b3JzKGRpcnR5RWRpdG9yc1dpdGhDb25mbGljdCk7Ci0JCQlpZihyZXN1bHQgIT0gbnVsbCkgewotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVzdWx0Lmxlbmd0aDsgaSsrKSB7Ci0JCQkJCU9iamVjdCBlZGl0b3IgPSByZXN1bHRbaV07Ci0JCQkJCWlmICgoZWRpdG9yc05vdFRvUmVmcmVzaCA9PSBudWxsIHx8ICFlZGl0b3JzTm90VG9SZWZyZXNoCi0JCQkJCQkJLmNvbnRhaW5zKGVkaXRvcikpCi0JCQkJCQkJJiYgKGVkaXRvcnNUb1JlZnJlc2ggPT0gbnVsbCB8fCAhZWRpdG9yc1RvUmVmcmVzaAotCQkJCQkJCQkJLmNvbnRhaW5zKGVkaXRvcikpKSB7Ci0JCQkJCQlkaXJ0eUVkaXRvcnNXaXRoQ29uZmxpY3QucmVtb3ZlKGVkaXRvcik7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQkvLyByZW1vdmUgYWxsIHJlc291cmNlcyB1c2VkIGJ5IGRpcnR5IGVkaXRvcnMgd2l0aCBjb25mbGljdCBmcm9tIHRoZQotCQkJLy8gY29sbGVjdGlvbiBvZiBjaGFuZ2VkIHJlc291cmNlcyBhZnRlciB1cGRhdGluZyBjYWNoZWQgbW9kaWZpY2F0aW9uIHN0YW1wCi0JCQkvLyBzbyB0aGV5IHdpbGwgbm90IGJlIHByb21wdGVkIHRvIHJlbG9hZCBhZ2FpbiB1bnRpbCB0aGUgbmV4dCBleHRlcm5hbCBjaGFuZ2UKLQkJCS8vCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IGRpcnR5RWRpdG9yc1dpdGhDb25mbGljdC5zaXplKCk7IGkrKykgewotCQkJCU1ldGhvZEVsZW1lbnRFZGl0b3IgZWRpdG9yID0gKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGRpcnR5RWRpdG9yc1dpdGhDb25mbGljdAotCQkJCQkJLmdldChpKTsJCQkJCi0JCQkJQ29sbGVjdGlvbjxSZXNvdXJjZT4gdXNlZFJlc291cmNlcyA9IGVkaXRvci5nZXRVc2VkUmVzb3VyY2VzKCk7Ci0JCQkJdXNlZFJlc291cmNlcy5yZXRhaW5BbGwoY2hhbmdlZFJlc291cmNlTGlzdCk7Ci0JCQkJZWRpdG9yLnVwZGF0ZVJlc291cmNlSW5mb3ModXNlZFJlc291cmNlcyk7Ci0JCQkJZWRpdG9yLm92ZXdyaXRlUmVzb3VyY2VzKHVzZWRSZXNvdXJjZXMpOwotCQkJCWNoYW5nZWRSZXNvdXJjZUxpc3QucmVtb3ZlQWxsKHVzZWRSZXNvdXJjZXMpOwotCQkJfQotCQl9Ci0KLQkJaWYgKCFjaGFuZ2VkUmVzb3VyY2VMaXN0LmlzRW1wdHkoKSkgewotCQkJLy8gUmVsb2FkIHRoZSBzZWxlY3RlZCBjaGFuZ2VkIHJlc291cmNlcy4KLQkJCUlMaWJyYXJ5TWFuYWdlciBtYW5hZ2VyID0gKElMaWJyYXJ5TWFuYWdlcikgTGlicmFyeVNlcnZpY2UKLQkJCQkJLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudExpYnJhcnlNYW5hZ2VyKCk7Ci0JCQlpZiAobWFuYWdlciAhPSBudWxsKSB7Ci0JCQkJbWFuYWdlci5yZWxvYWRSZXNvdXJjZXMoY2hhbmdlZFJlc291cmNlTGlzdCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGNoYW5nZWRSZXNvdXJjZUxpc3Q7Ci0JfQotCi0JcHJpdmF0ZSBPYmplY3RbXSBzZWxlY3REaXJ0eUVkaXRvcnMoCi0JCQlBcnJheUxpc3Q8SUVkaXRvclBhcnQ+IGRpcnR5RWRpdG9yc1dpdGhDb25mbGljdCkgewotCQlyZXR1cm4gc2VsZWN0RGlydHlFZGl0b3JzKGRpcnR5RWRpdG9yc1dpdGhDb25mbGljdCwgdmlldy5nZXRTaXRlKCkuZ2V0U2hlbGwoKSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBPYmplY3RbXSBzZWxlY3REaXJ0eUVkaXRvcnMoTGlzdDw/PiBkaXJ0eUVkaXRvcnMsIFNoZWxsIHNoZWxsKSB7Ci0JCVN0cmluZyB0aXRsZSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLl9VSV9GaWxlQ29uZmxpY3RfbGFiZWw7Ci0JCVN0cmluZyBtc2cgPSBBdXRob3JpbmdVSVJlc291cmNlcy5zZWxlY3RFZGl0b3JzVG9EaXNjYXJkQ29uZmxpY3RDaGFuZ2VzOwotCQlyZXR1cm4gc2VsZWN0RWRpdG9ycyhkaXJ0eUVkaXRvcnMsIHRpdGxlLCBtc2csIHNoZWxsKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBPYmplY3RbXSBzZWxlY3RFZGl0b3JzKExpc3Q8Pz4gZWRpdG9ycywgU3RyaW5nIHRpdGxlLCBTdHJpbmcgbXNnLCBTaGVsbCBzaGVsbCkgewotCQkvLyBwcm9tcHQgdXNlciB0byBkaXNjYXJkIGNoYW5nZXMgaW4gZWRpdG9ycyB0aGF0IGNvbmZsaWN0IHdpdGggb3V0c2lkZQotCQkvLyBjaGFuZ2UKLQkJLy8KLQkJSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIgY29udGVudFByb3ZpZGVyID0gbmV3IElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyKCkgewotCQkJTGlzdDw/PiBmQ29udGVudHM7Ci0KLQkJCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgaW5wdXRFbGVtZW50KSB7Ci0JCQkJaWYgKGZDb250ZW50cyAhPSBudWxsICYmIGZDb250ZW50cyA9PSBpbnB1dEVsZW1lbnQpCi0JCQkJCXJldHVybiBmQ29udGVudHMudG9BcnJheSgpOwotCQkJCXJldHVybiBuZXcgT2JqZWN0WzBdOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LAotCQkJCQlPYmplY3QgbmV3SW5wdXQpIHsKLQkJCQlpZiAobmV3SW5wdXQgaW5zdGFuY2VvZiBMaXN0KQotCQkJCQlmQ29udGVudHMgPSAoTGlzdDw/PikgbmV3SW5wdXQ7Ci0JCQkJZWxzZQotCQkJCQlmQ29udGVudHMgPSBudWxsOwotCi0JCQl9Ci0KLQkJfTsKLQkJSUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlciA9IG5ldyBMYWJlbFByb3ZpZGVyKCkgewotCQkJLyoKLQkJCSAqIChub24tSmF2YWRvYykKLQkJCSAqIAotCQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXIjZ2V0VGV4dChqYXZhLmxhbmcuT2JqZWN0KQotCQkJICovCi0JCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElFZGl0b3JQYXJ0KSB7Ci0JCQkJCXJldHVybiAoKElFZGl0b3JQYXJ0KSBlbGVtZW50KS5nZXRUaXRsZSgpOwotCQkJCX0KLQkJCQlyZXR1cm4gc3VwZXIuZ2V0VGV4dChlbGVtZW50KTsKLQkJCX0KLQotCQkJLyoKLQkJCSAqIChub24tSmF2YWRvYykKLQkJCSAqIAotCQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXIjZ2V0SW1hZ2UoamF2YS5sYW5nLk9iamVjdCkKLQkJCSAqLwotCQkJcHVibGljIEltYWdlIGdldEltYWdlKE9iamVjdCBlbGVtZW50KSB7Ci0JCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJRWRpdG9yUGFydCkgewotCQkJCQlyZXR1cm4gKChJRWRpdG9yUGFydCkgZWxlbWVudCkuZ2V0VGl0bGVJbWFnZSgpOwotCQkJCX0KLQkJCQlyZXR1cm4gc3VwZXIuZ2V0SW1hZ2UoZWxlbWVudCk7Ci0JCQl9Ci0JCX07Ci0JCUxpc3RTZWxlY3Rpb25EaWFsb2cgZGxnID0gbmV3IExpc3RTZWxlY3Rpb25EaWFsb2coc2hlbGwsCi0JCQkJZWRpdG9ycywgY29udGVudFByb3ZpZGVyLCBsYWJlbFByb3ZpZGVyLCBtc2cpOwotCQlkbGcuc2V0VGl0bGUodGl0bGUpOwotCQlkbGcuc2V0QmxvY2tPbk9wZW4odHJ1ZSk7Ci0JCWRsZy5vcGVuKCk7Ci0JCXJldHVybiBkbGcuZ2V0UmVzdWx0KCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3V0aWwvUmljaFRleHRJbWFnZUxpbmtDb250YWluZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvdXRpbC9SaWNoVGV4dEltYWdlTGlua0NvbnRhaW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YTMwMjE2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvdXRpbC9SaWNoVGV4dEltYWdlTGlua0NvbnRhaW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5yaWNodGV4dC5JTWV0aG9kUmljaFRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLkltYWdlSHlwZXJsaW5rOwotCi0vKioKLSAqIFNpbXBsZSBjb250YWluZXIgY2xhc3MgdXNlZCBhcyBhIHJldHVybiB2YWx1ZSBmb3IgRm9ybVVJIGNvbnZlbmllbmNlIG1ldGhvZHMKLSAqIEBhdXRob3IgSmVmZiBIYXJkeQotICoKLSAqLwotcHVibGljIGNsYXNzIFJpY2hUZXh0SW1hZ2VMaW5rQ29udGFpbmVyIHsKLQlwdWJsaWMgSU1ldGhvZFJpY2hUZXh0IHJpY2hUZXh0OwotCXB1YmxpYyBJbWFnZUh5cGVybGluayBsaW5rOwotCXB1YmxpYyBMYWJlbCBsYWJlbDsKLQkKLQlwdWJsaWMgUmljaFRleHRJbWFnZUxpbmtDb250YWluZXIoSU1ldGhvZFJpY2hUZXh0IHJpY2hUZXh0LCBJbWFnZUh5cGVybGluayBsaW5rLCBMYWJlbCBsYWJlbCkgewotCQl0aGlzLnJpY2hUZXh0ID0gcmljaFRleHQ7Ci0JCXRoaXMubGluayA9IGxpbms7Ci0JCXRoaXMubGFiZWwgPSBsYWJlbDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0VmlzaWJsZShib29sZWFuIHZpc2libGUpIHsKLQkJaWYgKHJpY2hUZXh0ICE9IG51bGwpIHsKLQkJCXJpY2hUZXh0LmdldENvbnRyb2woKS5zZXRWaXNpYmxlKHZpc2libGUpOwotCQl9Ci0JCWlmIChsaW5rICE9IG51bGwpIHsKLQkJCWxpbmsuc2V0VmlzaWJsZSh2aXNpYmxlKTsKLQkJfQotCQlpZiAobGFiZWwgIT0gbnVsbCkgewotCQkJbGFiZWwuc2V0VmlzaWJsZSh2aXNpYmxlKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCBtb3ZlQmVsb3coQ29udHJvbCBjb250cm9sKSB7Ci0JCWlmIChsaW5rICE9IG51bGwpIHsKLQkJCWxpbmsubW92ZUJlbG93KGNvbnRyb2wpOwotCQl9Ci0JCWlmIChsYWJlbCAhPSBudWxsKSB7Ci0JCQlsYWJlbC5tb3ZlQmVsb3cobGluayk7Ci0JCX0KLQkJaWYgKHJpY2hUZXh0ICE9IG51bGwpIHsKLQkJCXJpY2hUZXh0LmdldENvbnRyb2woKS5tb3ZlQmVsb3cobGFiZWwpOwotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJlZHJhdygpIHsKLQkJaWYgKGxpbmsgIT0gbnVsbCkgewotCQkJbGluay5yZWRyYXcoKTsKLQkJfQotCQlpZiAobGFiZWwgIT0gbnVsbCkgewotCQkJbGFiZWwucmVkcmF3KCk7Ci0JCX0KLQkJaWYgKHJpY2hUZXh0ICE9IG51bGwpIHsKLQkJCXJpY2hUZXh0LmdldENvbnRyb2woKS5yZWRyYXcoKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvdXRpbC9VSUhlbHBlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS91dGlsL1VJSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjNjllYWUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS91dGlsL1VJSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1ODYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5CcmVha2Rvd25FbGVtZW50RWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLkVkaXRvckNob29zZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS51dGlsLk1zZ0JveDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLlN0clV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5wYXJ0LkFic3RyYWN0RGlhZ3JhbUVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnBhcnQuRGlhZ3JhbUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUucGFydC5EaWFncmFtRWRpdG9ySW5wdXRQcm94eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS51aS5zZXJ2aWNlLkRpYWdyYW1FZGl0b3JIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLk1ldGhvZEVsZW1lbnRVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Qcm9jZXNzVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb24uRGVwZW5kZW5jeUNoZWNrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLklWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLmludGVybmFsLkNvbnRlbnRFbGVtZW50TmFtZVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb24uaW50ZXJuYWwuVmFsaWRhdG9yRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5zZXJ2aWNlcy5TYWZlVXBkYXRlQ29udHJvbGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5MaWJyYXJ5VUlUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3VpZGFuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJhY3RpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JSW5wdXRWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JbnB1dERpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVBhZ2VMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVZpZXdQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5Gb3JtVG9vbGtpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLlNjcm9sbGVkRm9ybTsKLQotCi0vKioKLSAqIEhlbHBlciBVdGlsaXR5IGNsYXNzIGZvciBVSQotICogCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFVJSGVscGVyIHsKLQotCS8qKgotCSAqIFNldHRpbmcgaXRlbXMgaW4gYSB0YWJsZQotCSAqIAotCSAqIEBwYXJhbSB0YWJsZQotCSAqIEBwYXJhbSBpdGVtcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRJdGVtcyhUYWJsZSB0YWJsZSwgQXJyYXlMaXN0IGl0ZW1zKSB7Ci0JCXRhYmxlLnJlbW92ZUFsbCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLnNpemUoKTsgaSsrKSB7Ci0JCQlUYWJsZUl0ZW0gaXRlbSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIFNXVC5OT05FKTsKLQkJCWl0ZW0uc2V0VGV4dCgoU3RyaW5nKSBpdGVtcy5nZXQoaSkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGxpc3Qgb24gdGhlIGdpdmVuIGNvbXBvc2l0ZSB3aXRoIGdpdmVuIHN0eWxlCi0JICogQHBhcmFtIHRvb2xraXQKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogQHBhcmFtIHN0eWxlCi0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0IGNyZWF0ZUxpc3QoRm9ybVRvb2xraXQgdG9vbGtpdCwgQ29tcG9zaXRlIHBhcmVudCwKLQkJCWludCBzdHlsZSkgewotCQlMaXN0IGxpc3QgPSBuZXcgTGlzdChwYXJlbnQsIHN0eWxlIHwgU1dULk5VTEwpOwotCQl0b29sa2l0LmFkYXB0KGxpc3QsIHRydWUsIHRydWUpOwotCQlyZXR1cm4gbGlzdDsKLQl9Ci0KLQkvKgotCSAqIE1ldGhvZCB3aWxsIHJldHVybiBPYmplY3RbXSBvZiBndWlkYW5jZSBleGNsdWRpbmcgUHJhY3RpY2UuCi0JICogTWV0aG9kRWxlbWVudFV0aWwjZ2V0U2VsZWN0ZWRHdWlkYW5jZXMoRU9iamVjdCkgY2FsY3VsYXRlcyBhbGwgZ3VpZGFuY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBPYmplY3RbXSBnZXRTZWxlY3RlZEd1aWRhbmNlcyhDb250ZW50RWxlbWVudCBjb250ZW50RWxlbWVudCkgewotCQlqYXZhLnV0aWwuTGlzdCBsaXN0ID0gTWV0aG9kRWxlbWVudFV0aWwKLQkJCQkuZ2V0U2VsZWN0ZWRHdWlkYW5jZXMoY29udGVudEVsZW1lbnQpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gbGlzdC5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3Qgb2JqID0gaXQubmV4dCgpOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFByYWN0aWNlKQotCQkJCWl0LnJlbW92ZSgpOwotCQl9Ci0JCXJldHVybiBsaXN0LnRvQXJyYXkoKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0Rm9ybVBhZ2VUaXRsZVByZWZpeEZvcihNZXRob2RFbGVtZW50IG1ldGhvZEVsZW1lbnQpIHsKLQkJU3RyaW5nIGVsZW1lbnRMYWJlbCA9IExpYnJhcnlVSVRleHQuZ2V0VUlUZXh0KG1ldGhvZEVsZW1lbnQpOwotCQlpZiAobWV0aG9kRWxlbWVudCBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0KSB7Ci0JCQlyZXR1cm4gTGlicmFyeVVJVGV4dC5URVhUX1dPUktfUFJPRFVDVCArICIgKCIgKyBlbGVtZW50TGFiZWwgKyAiKSI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9IGVsc2UgaWYgKG1ldGhvZEVsZW1lbnQgaW5zdGFuY2VvZiBHdWlkYW5jZSkgewotCQkJcmV0dXJuIExpYnJhcnlVSVRleHQuVEVYVF9HVUlEQU5DRSArICIgKCIgKyBlbGVtZW50TGFiZWwgKyAiKSI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9IGVsc2UgewotCQkJcmV0dXJuIGVsZW1lbnRMYWJlbDsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNldHMgdGV4dCBmb3IgdGhlIGdpdmVuIGZvcm0gYmFzZWQgb24gdGhlIGdpdmVuIGVsZW1lbnQsIGluY2x1ZGluZyB2YXJpYWJsZSBpbmZvcm1hdGlvbiBvZiB0aGUgZWxlbWVudAotCSAqIGlmIHRoZXJlIGlzIGFueS4KLQkgKiAKLQkgKiBAcGFyYW0gZm9ybQotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldEZvcm1UZXh0KFNjcm9sbGVkRm9ybSBmb3JtLCBNZXRob2RFbGVtZW50IGVsZW1lbnQpIHsKLQkJaWYgKGZvcm0gIT0gbnVsbCAmJiAhZm9ybS5pc0Rpc3Bvc2VkKCkpIHsKLQkJCVN0cmluZ0J1ZmZlciBzdHIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQlzdHIuYXBwZW5kKGdldEZvcm1QYWdlVGl0bGVQcmVmaXhGb3IoZWxlbWVudCkpOwotCQkJc3RyLmFwcGVuZChBdXRob3JpbmdVSVJlc291cmNlcy5lZGl0b3JfdGl0bGVfY29sb25fd2l0aF9zcGFjZXMpOwotCQkJCi0JCQlpZihlbGVtZW50IGluc3RhbmNlb2YgVmFyaWFiaWxpdHlFbGVtZW50KSB7Ci0JCQkJc3RyLmFwcGVuZChUbmdVdGlsLmdldExhYmVsKChWYXJpYWJpbGl0eUVsZW1lbnQpIGVsZW1lbnQsCi0JCQkJCQkiIiwgdHJ1ZSkpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQllbHNlIGlmKGVsZW1lbnQuZ2V0TmFtZSgpICE9IG51bGwpewotCQkJCXN0ci5hcHBlbmQoZWxlbWVudC5nZXROYW1lKCkpOwotCQkJfQotCQkJZm9ybS5zZXRUZXh0KHN0ci50b1N0cmluZygpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENoZWNrIHdoZXRoZXIgZ2l2ZW4gZGVsaXZlcmFibGVzIGxlYWRzIHRvIGNpcmN1bGFyIGRlcGVuZGVuY3kKLQkgKiBAcGFyYW0gdG9CZVBhcnQKLQkgKiBAcGFyYW0gZGVsaXZlcmFibGUKLQkgKiBAcmV0dXJuCi0JICogCQkJQm9vbGVhbiB2YWx1ZSB0byBpbmRpY2F0ZSB3aGV0aGVyIGNpY3VsYXIgZGVwZW5kZW5jeSBpcyBkZXRlY3RlZAotCSAqIEBkZXByZWNhdGVkIG1vdmVkIHRvIHtAbGluayBEZXBlbmRlbmN5Q2hlY2tlciNjaGVja0NpcmN1bGFyRGVsaXZlcmFibGVzKERlbGl2ZXJhYmxlLCBEZWxpdmVyYWJsZSl9Ci0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNoZWNrQ2lyY3VsYXJEZWxpdmVyYWJsZXMoRGVsaXZlcmFibGUgdG9CZVBhcnQsCi0JCQlEZWxpdmVyYWJsZSBkZWxpdmVyYWJsZSkgewotCQlyZXR1cm4gRGVwZW5kZW5jeUNoZWNrZXIuY2hlY2tDaXJjdWxhckRlbGl2ZXJhYmxlcyh0b0JlUGFydCwgZGVsaXZlcmFibGUpOwotCX0KLQotCS8qKgotCSAqIENoZWNrIHdoZXRoZXIgZGVsaXZlcmFibGUgcGFydHMgYXJlIGluIGNoYWluCi0JICogCi0JICogQHBhcmFtIGUKLQkgKiBAcGFyYW0gcm9vdHMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgZGVsaXZlcmFibGVQYXJ0c0NoYWluKERlbGl2ZXJhYmxlIGUsIGphdmEudXRpbC5MaXN0IHJvb3RzKSB7Ci0JCWphdmEudXRpbC5MaXN0IGxpc3QgPSBlLmdldERlbGl2ZXJlZFdvcmtQcm9kdWN0cygpOwotCQlpZiAobGlzdCAhPSBudWxsICYmIGxpc3Quc2l6ZSgpID4gMCkgewotCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGxpc3QuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBvYmogPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIERlbGl2ZXJhYmxlKSB7Ci0JCQkJCXJvb3RzLmFkZChvYmopOwotCQkJCQlkZWxpdmVyYWJsZVBhcnRzQ2hhaW4oKERlbGl2ZXJhYmxlKSBvYmosIHJvb3RzKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0KLQkvKioKLQkgKiBSZXNvbHZlIGNvbnRlbnQgZWxlbWVudCBuYW1lIGNvbmZsaWN0cwotCSAqIEBwYXJhbSBjb250YWluZXIKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqIEBwYXJhbSByZWZlcmVuY2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZXNvbHZlQ29udGVudEVsZW1lbnROYW1lQ29uZmxpY3QoRU9iamVjdCBjb250YWluZXIsIE1ldGhvZEVsZW1lbnQgZWxlbWVudCwgRVJlZmVyZW5jZQotCQkJcmVmZXJlbmNlKSB7Ci0KLQkJZmluYWwgSVZhbGlkYXRvciB2YWxpZGF0b3IgPSBuZXcgQ29udGVudEVsZW1lbnROYW1lVmFsaWRhdG9yKGNvbnRhaW5lcgotCQkJCSwgcmVmZXJlbmNlLAotCQkJCShDb250ZW50RWxlbWVudCkgZWxlbWVudCwgbmV3IFZhbGlkYXRvckZhY3RvcnkuVHlwZUZpbHRlcihlbGVtZW50KSk7Ci0JCQotCQlTdHJpbmcgbXNnID0gdmFsaWRhdG9yLmlzVmFsaWQoZWxlbWVudC5nZXROYW1lKCkpOwotCQkKLQkJaWYgKG1zZyAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgZmVhdHVyZVR4dCA9IFRuZ1V0aWwuZ2V0RmVhdHVyZVRleHQoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJLmdldE5hbWVkRWxlbWVudF9OYW1lKCkpOwotCQkJU3RyaW5nIHRpdGxlID0gTGlicmFyeUVkaXRSZXNvdXJjZXMucmVzb2x2ZU5hbWVDb25mbGljdERpYWxvZ190aXRsZTsgCi0JCQlTdHJpbmcgZGxnTXNnID0gTkxTLmJpbmQoCi0JCQkJCUxpYnJhcnlFZGl0UmVzb3VyY2VzLnJlc29sdmVOYW1lQ29uZmxpY3REaWFsb2dfdGV4dCwKLQkJCQkJU3RyVXRpbC50b0xvd2VyKGZlYXR1cmVUeHQpLCBlbGVtZW50LmdldE5hbWUoKSk7Ci0JCQlTdHJpbmcgY3VycmVudFZhbHVlID0gKFN0cmluZykgZWxlbWVudC5lR2V0KFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCS5nZXROYW1lZEVsZW1lbnRfTmFtZSgpKTsKLQotCQkJSUlucHV0VmFsaWRhdG9yIGlucHV0VmFsaWRhdG9yID0gbmV3IElJbnB1dFZhbGlkYXRvcigpIHsKLQkJCQlwdWJsaWMgU3RyaW5nIGlzVmFsaWQoU3RyaW5nIG5ld1RleHQpIHsKLQkJCQkJcmV0dXJuIHZhbGlkYXRvci5pc1ZhbGlkKG5ld1RleHQpOwotCQkJCX0KLQkJCX07Ci0KLQkJCUlucHV0RGlhbG9nIGlucHV0RGxnID0gbmV3IElucHV0RGlhbG9nKAotCQkJCQlNc2dCb3guZ2V0RGVmYXVsdFNoZWxsKCksIHRpdGxlLCBkbGdNc2csIGN1cnJlbnRWYWx1ZSwKLQkJCQkJaW5wdXRWYWxpZGF0b3IpOwotCQkJaWYgKGlucHV0RGxnLm9wZW4oKSA9PSBXaW5kb3cuQ0FOQ0VMKSB7Ci0JCQkJdGhyb3cgbmV3IE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uKCk7Ci0JCQl9Ci0JCQlyZXR1cm4gaW5wdXREbGcuZ2V0VmFsdWUoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JCi0JLyoqCi0JICogRGlhZ3JhbSBlZGl0b3JzIG9mIG9iamVjdCBpdHNlbGYgd2lsbCBiZSBjbG9zZWQuIEFuZCBQYXJlbnQgZGlhZ3JhbSBlZGl0b3JzIAotCSAqIHdpbGwgYmUgcmVmcmVzaGVkLiAgCi0JICogIEBkZXByZWNhdGVkICAoc2VlOiAge0BsaW5rIERpYWdyYW1FZGl0b3JIZWxwZXJ9IC0gcmVmcmVzaFBhcmVudERpYWdyYW1FZGl0b3JzKCkpCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlZnJlc2hPcGVuRGlhZ3JhbUVkaXRvcnNPZlBhcmVudChPYmplY3QgcmVmcmVzaEVsZW1lbnQsIGphdmEudXRpbC5MaXN0IG9wZW5FZGl0b3JSZWZzKSB7Ci0JCW9wZW5FZGl0b3JSZWZzID0gbmV3IEFycmF5TGlzdCgpOwotCQkvLyBOb3cgcmVmcmVzaCBvYmplY3QncyBwYXJlbnQncyBkaWFncmFtcy4KLQkJSVdvcmtiZW5jaFBhZ2Ugd29ya2JlbmNoUGFnZSA9IEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKQotCQkJCS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKQotCQkJCS5nZXRBY3RpdmVQYWdlKCk7Ci0JCUlFZGl0b3JSZWZlcmVuY2VbXSBlZGl0b3JSZWZlcmVuY2VzID0gd29ya2JlbmNoUGFnZQotCQkJCS5nZXRFZGl0b3JSZWZlcmVuY2VzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZWRpdG9yUmVmZXJlbmNlcy5sZW5ndGg7IGkrKykgewotCQkJSUVkaXRvclJlZmVyZW5jZSByZWZlcmVuY2UgPSBlZGl0b3JSZWZlcmVuY2VzW2ldOwotCQkJSUVkaXRvclBhcnQgZWRpdG9yID0gcmVmZXJlbmNlLmdldEVkaXRvcih0cnVlKTsKLQkJCWlmIChlZGl0b3IgIT0gbnVsbCkgewotCQkJCUlFZGl0b3JJbnB1dCBpbnB1dCA9IGVkaXRvci5nZXRFZGl0b3JJbnB1dCgpOwotCQkJCU9iamVjdCBlbGVtZW50ID0gbnVsbDsKLQkJCQlpZiAoaW5wdXQgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50RWRpdG9ySW5wdXQpIHsKLQkJCQkJQnJlYWtkb3duRWxlbWVudEVkaXRvcklucHV0IGJpbnB1dCA9IChCcmVha2Rvd25FbGVtZW50RWRpdG9ySW5wdXQpaW5wdXQ7Ci0JCQkJCWlmIChiaW5wdXQuZ2V0V3JhcHBlcigpICE9IG51bGwpIHsKLQkJCQkJCWVsZW1lbnQgPSBiaW5wdXQuZ2V0V3JhcHBlcigpOwotCQkJCQkJaWYoZWxlbWVudCBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKXsKLQkJCQkJCQlPYmplY3QgcGFyZW50ID0gKChCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcillbGVtZW50KS5nZXRQYXJlbnQobnVsbCk7Ci0JCQkJCQkJaWYocGFyZW50IGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpewotCQkJCQkJCQlpZihlbGVtZW50LmVxdWFscyhyZWZyZXNoRWxlbWVudCkpCi0JCQkJCQkJCQlyZWZyZXNoT3BlbkRpYWdyYW1FZGl0b3JzT2ZQYXJlbnQocGFyZW50LCBvcGVuRWRpdG9yUmVmcyk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9IGVsc2UgewotCQkJCQkJZWxlbWVudCA9IGJpbnB1dC5nZXRNZXRob2RFbGVtZW50KCk7Ci0JCQkJCX0KLQkJCQl9IAotCQkJCWVsc2UgaWYgKGlucHV0IGluc3RhbmNlb2YgRGlhZ3JhbUVkaXRvcklucHV0UHJveHkpIHsKLQkJCQkJRGlhZ3JhbUVkaXRvcklucHV0IGRpYWdyYW1JbnB1dCA9ICgoRGlhZ3JhbUVkaXRvcklucHV0UHJveHkpIGlucHV0KS5nZXREaWFncmFtRWRpdG9ySW5wdXQoKTsKLQkJCQkJaWYgKGRpYWdyYW1JbnB1dCAhPSBudWxsKSB7Ci0JCQkJCQllbGVtZW50ID0gZGlhZ3JhbUlucHV0LmdldE1ldGhvZEVsZW1lbnQoKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAoZWxlbWVudCAhPSBudWxsKQotCQkJCXsKLQkJCQkJaWYoZWxlbWVudCBpbnN0YW5jZW9mIEFjdGl2aXR5KXsKLQkJCQkJCWlmKCgoQWN0aXZpdHkpZWxlbWVudCkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5jb250YWlucyhyZWZyZXNoRWxlbWVudCkpCi0JCQkJCQkJb3BlbkVkaXRvclJlZnMuYWRkKHJlZmVyZW5jZSk7Ci0JCQkJCQllbHNlIGlmKHJlZnJlc2hFbGVtZW50IGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpewotCQkJCQkJCU9iamVjdCBsb2NhbFJlZnJlc2hFbGVtZW50ID0gcmVmcmVzaEVsZW1lbnQ7Ci0JCQkJCQkJd2hpbGUoKGxvY2FsUmVmcmVzaEVsZW1lbnQgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikKLQkJCQkJCQkJCSYmICgoQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpbG9jYWxSZWZyZXNoRWxlbWVudCkuZ2V0T3duZXIoKSE9IG51bGwpewotCQkJCQkJCQlpZigoKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKWxvY2FsUmVmcmVzaEVsZW1lbnQpLmdldE93bmVyKCkKLQkJCQkJCQkJCQkuZXF1YWxzKGVsZW1lbnQpKXsKLQkJCQkJCQkJCW9wZW5FZGl0b3JSZWZzLmFkZChyZWZlcmVuY2UpOwotCQkJCQkJCQl9Ci0JCQkJCQkJCWxvY2FsUmVmcmVzaEVsZW1lbnQgPSAoKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKWxvY2FsUmVmcmVzaEVsZW1lbnQpLmdldE93bmVyKCk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9ZWxzZSBpZihlbGVtZW50IGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpewotCQkJCQkJQ29sbGVjdGlvbiBjID0gKChCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcillbGVtZW50KS5nZXRDaGlsZHJlbihlbGVtZW50KTsKLQkJCQkJCWlmKGMgIT0gbnVsbCAmJiBjLmNvbnRhaW5zKHJlZnJlc2hFbGVtZW50KSl7Ci0JCQkJCQkJb3BlbkVkaXRvclJlZnMuYWRkKHJlZmVyZW5jZSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJCi0JCQkJfQotCQkJfQotCQl9Ci0JCWludCBzaXplID0gb3BlbkVkaXRvclJlZnMuc2l6ZSgpOwotCQkvL0lFZGl0b3JSZWZlcmVuY2VbXSByZWZlcmVuY2VzID0gbmV3IElFZGl0b3JSZWZlcmVuY2Vbc2l6ZV07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlJRWRpdG9yUmVmZXJlbmNlIHJlZmVyZW5jZSA9IChJRWRpdG9yUmVmZXJlbmNlKSBvcGVuRWRpdG9yUmVmcy5nZXQoaSk7Ci0JCQlJRWRpdG9yUGFydCBlZGl0b3IgPSByZWZlcmVuY2UuZ2V0RWRpdG9yKHRydWUpOwotCQkJaWYoZWRpdG9yIGluc3RhbmNlb2YgQWJzdHJhY3REaWFncmFtRWRpdG9yICl7Ci0JCQkJKChBYnN0cmFjdERpYWdyYW1FZGl0b3IpZWRpdG9yKS5yZWZyZXNoRGlhZ3JhbSgpOwotCQkJfQotCQl9Ci0JfQotCQotCS8qKgotCSAqIENsb3NlIGRpYWdyYW0gZWRpdG9ycyBpbmNsdWRpbmcgcGFyZW50IGVkaXRvcnMKLQkgKiBAcGFyYW0gY2xvc2VFbGVtZW50Ci0JICogQHBhcmFtIGNsb3NlRWRpdG9yUmVmcwotCSAqIEBkZXByZWNhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGNsb3NlRGlhZ3JhbUVkaXRvcnNJbmNsdWRpbmdQYXJlbnQoT2JqZWN0IGNsb3NlRWxlbWVudCwgamF2YS51dGlsLkxpc3QgY2xvc2VFZGl0b3JSZWZzKSB7Ci0JCWNsb3NlRWRpdG9yUmVmcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJSVdvcmtiZW5jaFBhZ2Ugd29ya2JlbmNoUGFnZSA9IEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKQotCQkJCS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKQotCQkJCS5nZXRBY3RpdmVQYWdlKCk7Ci0JCUlFZGl0b3JSZWZlcmVuY2VbXSBlZGl0b3JSZWZlcmVuY2VzID0gd29ya2JlbmNoUGFnZQotCQkJCS5nZXRFZGl0b3JSZWZlcmVuY2VzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZWRpdG9yUmVmZXJlbmNlcy5sZW5ndGg7IGkrKykgewotCQkJSUVkaXRvclJlZmVyZW5jZSByZWZlcmVuY2UgPSBlZGl0b3JSZWZlcmVuY2VzW2ldOwotCQkJSUVkaXRvclBhcnQgZWRpdG9yID0gcmVmZXJlbmNlLmdldEVkaXRvcih0cnVlKTsKLQkJCWlmIChlZGl0b3IgIT0gbnVsbCkgewotCQkJCUlFZGl0b3JJbnB1dCBpbnB1dCA9IGVkaXRvci5nZXRFZGl0b3JJbnB1dCgpOwotCQkJCU9iamVjdCBlbGVtZW50ID0gbnVsbDsKLQkJCQlpZiAoaW5wdXQgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50RWRpdG9ySW5wdXQpIHsKLQkJCQkJQnJlYWtkb3duRWxlbWVudEVkaXRvcklucHV0IGJpbnB1dCA9IChCcmVha2Rvd25FbGVtZW50RWRpdG9ySW5wdXQpaW5wdXQ7Ci0JCQkJCWlmIChiaW5wdXQuZ2V0V3JhcHBlcigpICE9IG51bGwpIHsKLQkJCQkJCWVsZW1lbnQgPSBiaW5wdXQuZ2V0V3JhcHBlcigpOwotCQkJCQkJaWYoZWxlbWVudCBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKXsKLQkJCQkJCQlPYmplY3QgcGFyZW50ID0gKChCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcillbGVtZW50KS5nZXRQYXJlbnQobnVsbCk7Ci0JCQkJCQkJaWYocGFyZW50IGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpewotCQkJCQkJCQlpZihlbGVtZW50LmVxdWFscyhjbG9zZUVsZW1lbnQpKQotCQkJCQkJCQkJY2xvc2VEaWFncmFtRWRpdG9yc0luY2x1ZGluZ1BhcmVudChwYXJlbnQsIGNsb3NlRWRpdG9yUmVmcyk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9IGVsc2UgewotCQkJCQkJZWxlbWVudCA9IGJpbnB1dC5nZXRNZXRob2RFbGVtZW50KCk7Ci0JCQkJCX0KLQkJCQl9IAotCQkJCWVsc2UgaWYgKGlucHV0IGluc3RhbmNlb2YgRGlhZ3JhbUVkaXRvcklucHV0UHJveHkpIHsKLQkJCQkJRGlhZ3JhbUVkaXRvcklucHV0IGRpYWdyYW1JbnB1dCA9ICgoRGlhZ3JhbUVkaXRvcklucHV0UHJveHkpIGlucHV0KS5nZXREaWFncmFtRWRpdG9ySW5wdXQoKTsKLQkJCQkJaWYgKGRpYWdyYW1JbnB1dCAhPSBudWxsKSB7Ci0JCQkJCQllbGVtZW50ID0gZGlhZ3JhbUlucHV0LmdldE1ldGhvZEVsZW1lbnQoKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAoZWxlbWVudCAhPSBudWxsKQotCQkJCXsKLQkJCQkJCS8vY2xvc2VFZGl0b3JSZWZzLmFkZChyZWZlcmVuY2UpOwotCQkJCQlpZihlbGVtZW50IGluc3RhbmNlb2YgQWN0aXZpdHkpewotCQkJCQkJaWYoZWxlbWVudC5lcXVhbHMoY2xvc2VFbGVtZW50KSkKLQkJCQkJCQljbG9zZUVkaXRvclJlZnMuYWRkKHJlZmVyZW5jZSk7Ci0JCQkJCQkKLQkJCQkJCWlmKCgoQWN0aXZpdHkpZWxlbWVudCkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5jb250YWlucyhjbG9zZUVsZW1lbnQpKQotCQkJCQkJCWNsb3NlRWRpdG9yUmVmcy5hZGQocmVmZXJlbmNlKTsKLQkJCQkJCWVsc2UgaWYoY2xvc2VFbGVtZW50IGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpewotCQkJCQkJCWlmKCgoQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpY2xvc2VFbGVtZW50KS5nZXRPd25lcigpCi0JCQkJCQkJCQkhPSBudWxsKQotCQkJCQkJCQlpZigoKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKWNsb3NlRWxlbWVudCkuZ2V0T3duZXIoKQotCQkJCQkJCQkJLmVxdWFscyhlbGVtZW50KSl7Ci0JCQkJCQkJCQljbG9zZUVkaXRvclJlZnMuYWRkKHJlZmVyZW5jZSk7Ci0JCQkJCQkJCWlmKCgoQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpY2xvc2VFbGVtZW50KS5nZXRPd25lcigpCi0JCQkJCQkJCQlpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKXsKLQkJCQkJCQkJCWlmKCgoQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpKChCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikKLQkJCQkJCQkJCQkJY2xvc2VFbGVtZW50KS5nZXRPd25lcigpKS5nZXRPd25lcigpLmVxdWFscyhlbGVtZW50KSkKLQkJCQkJCQkJCQljbG9zZUVkaXRvclJlZnMuYWRkKHJlZmVyZW5jZSk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX1lbHNlIGlmKGVsZW1lbnQgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcil7Ci0JCQkJCQlDb2xsZWN0aW9uIGMgPSAoKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKWVsZW1lbnQpLmdldENoaWxkcmVuKGVsZW1lbnQpOwotCQkJCQkJaWYoYyAhPSBudWxsICYmIGMuY29udGFpbnMoY2xvc2VFbGVtZW50KSl7Ci0JCQkJCQkJY2xvc2VFZGl0b3JSZWZzLmFkZChyZWZlcmVuY2UpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWludCBzaXplID0gY2xvc2VFZGl0b3JSZWZzLnNpemUoKTsKLQkJSUVkaXRvclJlZmVyZW5jZVtdIHJlZmVyZW5jZXMgPSBuZXcgSUVkaXRvclJlZmVyZW5jZVtzaXplXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCXJlZmVyZW5jZXNbaV0gPSAoSUVkaXRvclJlZmVyZW5jZSkgY2xvc2VFZGl0b3JSZWZzLmdldChpKTsKLQkJfQotCQl3b3JrYmVuY2hQYWdlLmNsb3NlRWRpdG9ycyhyZWZlcmVuY2VzLCBmYWxzZSk7Ci0JfQotCQotCS8qKgotCSAqIEdldCBiYXNlIGFjdGl2aXR5IGZvciB0aGUgZ2l2ZW4gYWN0aXZpdHkKLQkgKiBAcGFyYW0gYWN0aXZpdHkKLQkgKiBAcmV0dXJuCi0JICogCQkJQmFzZSBhY3Rpdml0eQotCSAqLwotCXB1YmxpYyBzdGF0aWMgVmFyaWFiaWxpdHlFbGVtZW50IGdldEJhc2VBY3Rpdml0eShBY3Rpdml0eSBhY3Rpdml0eSl7Ci0JCXdoaWxlICghYWN0aXZpdHkuZ2V0VmFyaWFiaWxpdHlUeXBlKCkuZXF1YWxzKAotCQkJCVZhcmlhYmlsaXR5VHlwZS5OQSkpIHsKLQotCQkJVmFyaWFiaWxpdHlFbGVtZW50IHZlID0gYWN0aXZpdHkKLQkJCQkJLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsKLQkJCWlmICgodmUgIT0gbnVsbCkgJiYgKHZlIGluc3RhbmNlb2YgQWN0aXZpdHkpKSB7Ci0JCQkJYWN0aXZpdHkgPSAoQWN0aXZpdHkpIHZlOwotCQkJfSBlbHNlIHsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlyZXR1cm4gYWN0aXZpdHk7Ci0JfQotCQotCS8qKgotCSAqIENsb3NlIGRpYWdyYW0gZWRpdG9ycwotCSAqIAotCSAqIEBwYXJhbSBjbG9zZUVsZW1lbnQKLQkgKiBAcGFyYW0gY2xvc2VFZGl0b3JSZWZzCi0JICogIEBkZXByZWNhdGVkIChzZWU6ICB7QGxpbmsgRGlhZ3JhbUVkaXRvckhlbHBlcn0pCi0JICogIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBjbG9zZURpYWdyYW1FZGl0b3JzKE9iamVjdCBjbG9zZUVsZW1lbnQsIGphdmEudXRpbC5MaXN0IGNsb3NlRWRpdG9yUmVmcykgewotCQljbG9zZUVkaXRvclJlZnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUlXb3JrYmVuY2hQYWdlIHdvcmtiZW5jaFBhZ2UgPSBBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCQkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkKLQkJCQkuZ2V0QWN0aXZlUGFnZSgpOwotCQlJRWRpdG9yUmVmZXJlbmNlW10gZWRpdG9yUmVmZXJlbmNlcyA9IHdvcmtiZW5jaFBhZ2UKLQkJCQkuZ2V0RWRpdG9yUmVmZXJlbmNlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGVkaXRvclJlZmVyZW5jZXMubGVuZ3RoOyBpKyspIHsKLQkJCUlFZGl0b3JSZWZlcmVuY2UgcmVmZXJlbmNlID0gZWRpdG9yUmVmZXJlbmNlc1tpXTsKLQkJCUlFZGl0b3JQYXJ0IGVkaXRvciA9IHJlZmVyZW5jZS5nZXRFZGl0b3IodHJ1ZSk7Ci0JCQlpZiAoZWRpdG9yICE9IG51bGwpIHsKLQkJCQlJRWRpdG9ySW5wdXQgaW5wdXQgPSBlZGl0b3IuZ2V0RWRpdG9ySW5wdXQoKTsKLQkJCQlPYmplY3QgZWxlbWVudCA9IG51bGw7Ci0JCQkJaWYgKGlucHV0IGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudEVkaXRvcklucHV0KSB7Ci0JCQkJCUJyZWFrZG93bkVsZW1lbnRFZGl0b3JJbnB1dCBiaW5wdXQgPSAoQnJlYWtkb3duRWxlbWVudEVkaXRvcklucHV0KWlucHV0OwotCQkJCQlpZiAoYmlucHV0LmdldFdyYXBwZXIoKSAhPSBudWxsKSB7Ci0JCQkJCQllbGVtZW50ID0gYmlucHV0LmdldFdyYXBwZXIoKTsKLQkJCQkJCWlmKGVsZW1lbnQgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcil7Ci0JCQkJCQkJT2JqZWN0IHBhcmVudCA9ICgoQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpZWxlbWVudCkuZ2V0UGFyZW50KGVsZW1lbnQpOwotCQkJCQkJCWlmKHBhcmVudCBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKXsKLQkJCQkJCQkJaWYoZWxlbWVudC5lcXVhbHMoY2xvc2VFbGVtZW50KSkKLQkJCQkJCQkJCWNsb3NlRGlhZ3JhbUVkaXRvcnMocGFyZW50LCBjbG9zZUVkaXRvclJlZnMpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfSBlbHNlIHsKLQkJCQkJCWVsZW1lbnQgPSBiaW5wdXQuZ2V0TWV0aG9kRWxlbWVudCgpOwotCQkJCQl9Ci0JCQkJfSAKLQkJCQllbHNlIGlmIChpbnB1dCBpbnN0YW5jZW9mIERpYWdyYW1FZGl0b3JJbnB1dFByb3h5KSB7Ci0JCQkJCURpYWdyYW1FZGl0b3JJbnB1dCBkaWFncmFtSW5wdXQgPSAoKERpYWdyYW1FZGl0b3JJbnB1dFByb3h5KSBpbnB1dCkuZ2V0RGlhZ3JhbUVkaXRvcklucHV0KCk7Ci0JCQkJCWlmIChkaWFncmFtSW5wdXQgIT0gbnVsbCkgewotCQkJCQkJZWxlbWVudCA9IGRpYWdyYW1JbnB1dC5nZXRNZXRob2RFbGVtZW50KCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKGVsZW1lbnQgIT0gbnVsbCkgewotCQkJCQlpZiAoZWxlbWVudC5lcXVhbHMoY2xvc2VFbGVtZW50KSkgewotCQkJCQkJY2xvc2VFZGl0b3JSZWZzLmFkZChyZWZlcmVuY2UpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJLy8gY2hlY2sgd2hldGhlciBlbGVtZW50IGlzIGNoaWxkIG9mIGNsb3NlRWxlbWVudAotCQkJCQkJLy8gZGlyZWN0bHkvaW5kaXJlY3RseQotCQkJCQkJaWYgKGNsb3NlRWxlbWVudCBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJCQkJQ29sbGVjdGlvbiBjb2xsZWN0aW9uID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQkJCVByb2Nlc3NVdGlsLmdldENoaWxkRWxlbWVudHMoCi0JCQkJCQkJCQkoQWN0aXZpdHkpIGNsb3NlRWxlbWVudCwgQWN0aXZpdHkuY2xhc3MsCi0JCQkJCQkJCQljb2xsZWN0aW9uKTsKLQkJCQkJCQlpZiAoY29sbGVjdGlvbi5jb250YWlucyhlbGVtZW50KSkgewotCQkJCQkJCQljbG9zZUVkaXRvclJlZnMuYWRkKHJlZmVyZW5jZSk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWludCBzaXplID0gY2xvc2VFZGl0b3JSZWZzLnNpemUoKTsKLQkJSUVkaXRvclJlZmVyZW5jZVtdIHJlZmVyZW5jZXMgPSBuZXcgSUVkaXRvclJlZmVyZW5jZVtzaXplXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCXJlZmVyZW5jZXNbaV0gPSAoSUVkaXRvclJlZmVyZW5jZSkgY2xvc2VFZGl0b3JSZWZzLmdldChpKTsKLQkJfQotCQl3b3JrYmVuY2hQYWdlLmNsb3NlRWRpdG9ycyhyZWZlcmVuY2VzLCBmYWxzZSk7Ci0JCXJlZmVyZW5jZXMgPSBudWxsOwotCX0KLQkKLQkvKioKLQkgKiBEaWFncmFtIGVkaXRvcnMgb2Ygb2JqZWN0IGl0c2VsZiB3aWxsIGJlIGNsb3NlZC4gQW5kIFBhcmVudCBkaWFncmFtIGVkaXRvcnMgCi0JICogd2lsbCBiZSByZWZyZXNoZWQuICBjb2RlIG5vdCB0ZXN0ZWQgdXNlIHJlZnJlc2hPcGVuRGlhZ3JhbUVkaXRvcnMgbWV0aG9kLgotCSAqIE5vdCB1c2VkIGN1cnJlbnRseQotCSAqIEBwYXJhbSBvYmplY3QKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc3luY0RpYWdyYW1FZGl0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJamF2YS51dGlsLkxpc3QgY2xvc2VFZGl0b3JzID0gbmV3IEFycmF5TGlzdCgpOwotCQlqYXZhLnV0aWwuTGlzdCByZWZyZXNoRWRpdG9ycyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCi0JCUlXb3JrYmVuY2hQYWdlIHdvcmtiZW5jaFBhZ2UgPSBBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCQkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0QWN0aXZlUGFnZSgpOwotCQlJRWRpdG9yUmVmZXJlbmNlW10gZWRpdG9yUmVmZXJlbmNlcyA9IHdvcmtiZW5jaFBhZ2UKLQkJCQkuZ2V0RWRpdG9yUmVmZXJlbmNlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGVkaXRvclJlZmVyZW5jZXMubGVuZ3RoOyBpKyspIHsKLQkJCUlFZGl0b3JSZWZlcmVuY2UgcmVmZXJlbmNlID0gZWRpdG9yUmVmZXJlbmNlc1tpXTsKLQkJCUlFZGl0b3JQYXJ0IGVkaXRvciA9IHJlZmVyZW5jZS5nZXRFZGl0b3IodHJ1ZSk7Ci0JCQlpZiAoZWRpdG9yICE9IG51bGwpIHsKLQkJCQlJRWRpdG9ySW5wdXQgaW5wdXQgPSBlZGl0b3IuZ2V0RWRpdG9ySW5wdXQoKTsKLQkJCQlPYmplY3QgZWRpdG9yRWxlbWVudCA9IG51bGw7Ci0JCQkJaWYgKGlucHV0IGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudEVkaXRvcklucHV0KSB7Ci0JCQkJCUJyZWFrZG93bkVsZW1lbnRFZGl0b3JJbnB1dCBiaW5wdXQgPSAoQnJlYWtkb3duRWxlbWVudEVkaXRvcklucHV0KWlucHV0OwotCQkJCQlpZihiaW5wdXQuZ2V0V3JhcHBlcigpICE9IG51bGwpewotCQkJCQkJZWRpdG9yRWxlbWVudCA9IGJpbnB1dC5nZXRXcmFwcGVyKCk7Ci0JCQkJCX1lbHNlewotCQkJCQkJZWRpdG9yRWxlbWVudCA9IGJpbnB1dC5nZXRNZXRob2RFbGVtZW50KCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSBpZiAoaW5wdXQgaW5zdGFuY2VvZiBEaWFncmFtRWRpdG9ySW5wdXRQcm94eSkgewotCQkJCQlEaWFncmFtRWRpdG9ySW5wdXQgZGlhZ3JhbUlucHV0ID0gKChEaWFncmFtRWRpdG9ySW5wdXRQcm94eSkgaW5wdXQpLmdldERpYWdyYW1FZGl0b3JJbnB1dCgpOwotCQkJCQlpZiAoZGlhZ3JhbUlucHV0ICE9IG51bGwpIHsKLQkJCQkJCWVkaXRvckVsZW1lbnQgPSBkaWFncmFtSW5wdXQuZ2V0TWV0aG9kRWxlbWVudCgpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWlmKGVkaXRvckVsZW1lbnQgIT0gbnVsbCl7Ci0JCQkJCWlmKGVkaXRvckVsZW1lbnQuZXF1YWxzKG9iamVjdCkpewotCQkJCQkJY2xvc2VFZGl0b3JzLmFkZChyZWZlcmVuY2UpOwotCQkJCQl9ZWxzZXsKLQkJCQkJCWlmKGVkaXRvckVsZW1lbnQgaW5zdGFuY2VvZiBBY3Rpdml0eSl7Ci0JCQkJCQkJaWYoKChBY3Rpdml0eSllZGl0b3JFbGVtZW50KS5nZXRCcmVha2Rvd25FbGVtZW50cygpLmNvbnRhaW5zKG9iamVjdCkpCi0JCQkJCQkJCXJlZnJlc2hFZGl0b3JzLmFkZChyZWZlcmVuY2UpOwotCQkJCQkJCWVsc2UgaWYob2JqZWN0IGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpewotCQkJCQkJCQlPYmplY3QgbG9jYWwgPSBvYmplY3Q7Ci0JCQkJCQkJCXdoaWxlKChsb2NhbCBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKQotCQkJCQkJCQkJCSYmICgoQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpbG9jYWwpLmdldE93bmVyKCkhPSBudWxsKXsKLQkJCQkJCQkJCWlmKCgoQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpbG9jYWwpLmdldE93bmVyKCkKLQkJCQkJCQkJCQkJLmVxdWFscyhlZGl0b3JFbGVtZW50KSl7Ci0JCQkJCQkJCQkJcmVmcmVzaEVkaXRvcnMuYWRkKHJlZmVyZW5jZSk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCQlsb2NhbCA9ICgoQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpbG9jYWwpLmdldE93bmVyKCk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9ZWxzZSBpZihlZGl0b3JFbGVtZW50IGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpewotCQkJCQkJCUNvbGxlY3Rpb24gYyA9ICgoQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpZWRpdG9yRWxlbWVudCkuZ2V0Q2hpbGRyZW4oZWRpdG9yRWxlbWVudCk7Ci0JCQkJCQkJaWYoYyAhPSBudWxsICYmIGMuY29udGFpbnMob2JqZWN0KSl7Ci0JCQkJCQkJCXJlZnJlc2hFZGl0b3JzLmFkZChyZWZlcmVuY2UpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQkvLyBDbG9zZSBlZGl0b3IgcmVmZXJlbmNlcyBhbmQgcmVmcmVzaCBlZGl0b3JzLgotCQlpbnQgc2l6ZSA9IGNsb3NlRWRpdG9ycy5zaXplKCk7Ci0JCUlFZGl0b3JSZWZlcmVuY2VbXSByZWZlcmVuY2VzID0gbmV3IElFZGl0b3JSZWZlcmVuY2Vbc2l6ZV07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlyZWZlcmVuY2VzW2ldID0gKElFZGl0b3JSZWZlcmVuY2UpIGNsb3NlRWRpdG9ycy5nZXQoaSk7Ci0JCX0KLQkJd29ya2JlbmNoUGFnZS5jbG9zZUVkaXRvcnMocmVmZXJlbmNlcywgZmFsc2UpOwotCQlyZWZlcmVuY2VzID0gbnVsbDsKLQkJCi0JCXNpemUgPSByZWZyZXNoRWRpdG9ycy5zaXplKCk7Ci0JCS8vSUVkaXRvclJlZmVyZW5jZVtdIHJlZmVyZW5jZXMgPSBuZXcgSUVkaXRvclJlZmVyZW5jZVtzaXplXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCUlFZGl0b3JSZWZlcmVuY2UgcmVmZXJlbmNlID0gKElFZGl0b3JSZWZlcmVuY2UpIHJlZnJlc2hFZGl0b3JzLmdldChpKTsKLQkJCUlFZGl0b3JQYXJ0IGVkaXRvciA9IHJlZmVyZW5jZS5nZXRFZGl0b3IodHJ1ZSk7Ci0JCQlpZihlZGl0b3IgaW5zdGFuY2VvZiBBYnN0cmFjdERpYWdyYW1FZGl0b3IgKXsKLQkJCQkoKEFic3RyYWN0RGlhZ3JhbUVkaXRvcillZGl0b3IpLnJlZnJlc2hEaWFncmFtKCk7Ci0JCQl9Ci0JCX0KLQkJCi0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBzaG93UHJvYmxlbXNWaWV3KCkgewotIAkJU2FmZVVwZGF0ZUNvbnRyb2xsZXIKLQkJLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJaWYgKFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkgIT0gbnVsbCAmJgotCQkJCQkJCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0QWN0aXZlUGFnZSgpICE9IG51bGwpIHsKLQkJCQkJCUlXb3JrYmVuY2hQYWdlIHBhZ2UgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKTsKLQkJCQkJCUlWaWV3UGFydCB2aWV3ID0gcGFnZS5maW5kVmlldyhJUGFnZUxheW91dC5JRF9QUk9CTEVNX1ZJRVcpOwotCQkJCQkJaWYgKHZpZXcgPT0gbnVsbCkgewotCQkJCQkJCXBhZ2Uuc2hvd1ZpZXcoSVBhZ2VMYXlvdXQuSURfUFJPQkxFTV9WSUVXLCBudWxsLCBJV29ya2JlbmNoUGFnZS5WSUVXX1ZJU0lCTEUpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJLy8gY291bGRuJ3Qgb3BlbiB0aGUKLQkJCQkJLy8gcHJvYmxlbSB2aWV3LCB0b28KLQkJCQkJLy8gYmFkLi4KLQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS91dGlsL1VJTGF5b3V0SGVscGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3V0aWwvVUlMYXlvdXRIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTVmZTBjOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3V0aWwvVUlMYXlvdXRIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ1RhYkZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNUYWJJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuRm9ybUNvbG9yczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLkZvcm1Ub29sa2l0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuU2Nyb2xsZWRGb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuVGFibGVXcmFwRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLlRhYmxlV3JhcExheW91dDsKLQotCi0vKioKLSAqIExheW91dCBIZWxwZXIgZm9yIFVJLiAKLSAqIAotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFVJTGF5b3V0SGVscGVyIHsKLQotCXByaXZhdGUgc3RhdGljIENvbXBvc2l0ZSBlZGl0b3JDb21wb3NpdGUsIHByZXZpZXdDb21wb3NpdGU7Ci0KLQlwcml2YXRlIHN0YXRpYyBDVGFiRm9sZGVyIHRhYkZvbGRlcjsKLQotCS8qKgotCSAqIENyZWF0ZSB0YWJzIGluIGZvcm0gCi0JICogQHBhcmFtIGZvcm0KLQkgKiBAcGFyYW0gdG9vbGtpdAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBjcmVhdGVUYWJzKFNjcm9sbGVkRm9ybSBmb3JtLCBGb3JtVG9vbGtpdCB0b29sa2l0KSB7Ci0JCS8vIGNyZWF0ZSB0YWJmb2xkZXIKLQkJdGFiRm9sZGVyID0gbmV3IENUYWJGb2xkZXIoZm9ybS5nZXRCb2R5KCksIFNXVC5GTEFUIHwgU1dULlRPUCk7Ci0JCVRhYmxlV3JhcERhdGEgdGQgPSBuZXcgVGFibGVXcmFwRGF0YShUYWJsZVdyYXBEYXRhLkZJTExfR1JBQik7Ci0JCXRhYkZvbGRlci5zZXRMYXlvdXREYXRhKHRkKTsKLQotCQkvLyBzZXQgdGFiZm9sZGVyIGJhY2tncm91bmQgY29sb3IKLQkJQ29sb3Igc2VsZWN0ZWRDb2xvciA9IHRvb2xraXQuZ2V0Q29sb3JzKCkKLQkJCQkuZ2V0Q29sb3IoRm9ybUNvbG9ycy5TRVBBUkFUT1IpOwotCQl0YWJGb2xkZXIuc2V0U2VsZWN0aW9uQmFja2dyb3VuZChuZXcgQ29sb3JbXSB7IHNlbGVjdGVkQ29sb3IsCi0JCQkJdG9vbGtpdC5nZXRDb2xvcnMoKS5nZXRCYWNrZ3JvdW5kKCkgfSwgbmV3IGludFtdIHsgNTAgfSk7Ci0KLQkJLy8gY3JlYXRlIGVkaXRvciB0YWIgaXRlbSBhbmQgdGhlIGNvcnJlc3BvbmRpbmcgY29tcG9zaXRlCi0JCUNUYWJJdGVtIGVkaXRvckl0ZW0gPSBuZXcgQ1RhYkl0ZW0odGFiRm9sZGVyLCBTV1QuTlVMTCk7Ci0JCWVkaXRvckl0ZW0uc2V0VGV4dChBdXRob3JpbmdVSVRleHQuRURJVE9SX1RFWFQpOwotCQllZGl0b3JDb21wb3NpdGUgPSBjcmVhdGVDb21wb3NpdGUodG9vbGtpdCk7Ci0JCWVkaXRvckl0ZW0uc2V0Q29udHJvbChlZGl0b3JDb21wb3NpdGUpOwotCi0JCS8vIGNyZWF0ZSBwcmV2aWV3IHRhYiBpdGVtIGFuZCB0aGUgY29ycmVzcG9uZGluZyBjb21wb3NpdGUKLQkJQ1RhYkl0ZW0gcHJldmlld0l0ZW0gPSBuZXcgQ1RhYkl0ZW0odGFiRm9sZGVyLCBTV1QuTlVMTCk7Ci0JCXByZXZpZXdJdGVtLnNldFRleHQoQXV0aG9yaW5nVUlUZXh0LlBSRVZJRVdfUEFHRV9USVRMRSk7Ci0JCXByZXZpZXdDb21wb3NpdGUgPSBjcmVhdGVDb21wb3NpdGUodG9vbGtpdCk7Ci0JCXByZXZpZXdJdGVtLnNldENvbnRyb2wocHJldmlld0NvbXBvc2l0ZSk7Ci0KLQkJdG9vbGtpdC5wYWludEJvcmRlcnNGb3IodGFiRm9sZGVyKTsKLQotCQl0b29sa2l0LmFkYXB0KHRhYkZvbGRlciwgdHJ1ZSwgdHJ1ZSk7Ci0KLQkJdGFiRm9sZGVyLnNldFNlbGVjdGlvbigwKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgY29tcG9zaXRlIG9uIHRoZSBmb3JtCi0JICogCi0JICogQHBhcmFtIHRvb2xraXQKLQkgKiBAcmV0dXJuCi0JICogCQkJVUkgY29tcG9zaXRlCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgQ29tcG9zaXRlIGNyZWF0ZUNvbXBvc2l0ZShGb3JtVG9vbGtpdCB0b29sa2l0KSB7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSB0b29sa2l0LmNyZWF0ZUNvbXBvc2l0ZSh0YWJGb2xkZXIpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgVGFibGVXcmFwRGF0YShUYWJsZVdyYXBEYXRhLkZJTExfR1JBQikpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBUYWJsZVdyYXBMYXlvdXQoKSk7Ci0KLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gZWRpdG9yIGNvbXBvc2l0ZQotCSAqIAotCSAqIEByZXR1cm4KLQkgKiAJCVVJIENvbXBvc2l0ZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ29tcG9zaXRlIGdldEVkaXRvckNvbXBvc2l0ZSgpIHsKLQkJcmV0dXJuIGVkaXRvckNvbXBvc2l0ZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gcHJldmlldyBjb21wb3NpdGUKLQkgKiAKLQkgKiBAcmV0dXJuCi0JICogCQlQcmV2aWV3IGNvbXBvc2l0ZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ29tcG9zaXRlIGdldFByZXZpZXdDb21wb3NpdGUoKSB7Ci0JCXJldHVybiBwcmV2aWV3Q29tcG9zaXRlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS91dGlsL3BhY2thZ2UuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvdXRpbC9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2NDU2NTcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS91dGlsL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIGltcGxlbWVudGF0aW9uIHN1cHBvcnQgZm9yIHRoZSBBdXRob3JpbmcgVUkuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS92aWV3cy9BYnN0cmFjdEJhc2VWaWV3LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3ZpZXdzL0Fic3RyYWN0QmFzZVZpZXcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzBkNWJlMS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3ZpZXdzL0Fic3RyYWN0QmFzZVZpZXcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnZpZXdzOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25SZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51aS52aWV3ZXIuSVZpZXdlclByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uSUVkaXRpbmdEb21haW5Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlZEFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLlVJQWN0aW9uRGlzcGF0Y2hlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnMuSUxpYnJhcnlBY3Rpb25CYXJDb250cmlidXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3ZpZGVycy5JQ29udGVudFByb3ZpZGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5JTGlicmFyeU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuSUxpYnJhcnlTZXJ2aWNlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuTGlicmFyeVVJTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5MaWJyYXJ5VUlVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSVN0YXR1c0xpbmVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JVG9vbEJhck1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLk1lbnVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5TZXBhcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTWVudTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JQWN0aW9uQmFyczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JUGFydExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklWaWV3U2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV2luZG93TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmlkZS5JR290b01hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLklQcm9wZXJ0eVNoZWV0UGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLlByb3BlcnR5U2hlZXRQYWdlOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci0KLS8qKgotICogVGhlIGFic3RyYWN0IGJhc2UgY2xhc3MgZm9yIGFsbCBNZXRob2QgTGlicmFyeSB2aWV3cy4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0QmFzZVZpZXcgZXh0ZW5kcyBTYXZlYWJsZUxpYnJhcnlWaWV3UGFydAotCQlpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluUHJvdmlkZXIsIElTZWxlY3Rpb25Qcm92aWRlciwKLQkJSUxpYnJhcnlTZXJ2aWNlTGlzdGVuZXIsIElNZW51TGlzdGVuZXIsIElWaWV3ZXJQcm92aWRlciwgSUdvdG9NYXJrZXIgewotCi0JcHJvdGVjdGVkIEFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbiBlZGl0aW5nRG9tYWluOwotCi0JcHJvdGVjdGVkIFByb3BlcnR5U2hlZXRQYWdlIHByb3BlcnR5U2hlZXRQYWdlOwotCi0JcHJvdGVjdGVkIFVJQWN0aW9uRGlzcGF0Y2hlciBhY3Rpb25EaXNwYXRjaGVyID0gbnVsbDsKLQotCXByb3RlY3RlZCBBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeTsKLQotCXByb3RlY3RlZCBJTGlicmFyeUFjdGlvbkJhckNvbnRyaWJ1dG9yIGFjdGlvbkJhckNvbnRyaWJ1dG9yOwotCi0JcHJvdGVjdGVkIElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgc2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotCi0JcHJvdGVjdGVkIElQYXJ0TGlzdGVuZXIgcGFydExpc3RlbmVyID0gbmV3IElQYXJ0TGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHBhcnRBY3RpdmF0ZWQoSVdvcmtiZW5jaFBhcnQgcGFydCkgewotCQkJaWYgKHBhcnQgPT0gQWJzdHJhY3RCYXNlVmlldy50aGlzKSB7Ci0JCQkJaGFuZGxlQWN0aXZhdGUocGFydCk7Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBwYXJ0QnJvdWdodFRvVG9wKElXb3JrYmVuY2hQYXJ0IHBhcnQpIHsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHBhcnRDbG9zZWQoSVdvcmtiZW5jaFBhcnQgcGFydCkgewotCQl9Ci0KLQkJcHVibGljIHZvaWQgcGFydERlYWN0aXZhdGVkKElXb3JrYmVuY2hQYXJ0IHBhcnQpIHsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHBhcnRPcGVuZWQoSVdvcmtiZW5jaFBhcnQgcGFydCkgewotCQl9Ci0JfTsKLQkJCi0JLyoqCi0JICogSGFuZGxlcyB0aGUgYWN0aXZhdGlvbiBvZiB0aGlzIHZpZXcuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlQWN0aXZhdGUoSVdvcmtiZW5jaFBhcnQgcGFydCkgewotCQkvLyBTZXQgdGhlIHJpZ2h0IGFkYXB0ZXIgZmFjdG9yeSBmb3IgdGhlIGVkaXRpbmcgZG9tYWluLgotCQllZGl0aW5nRG9tYWluLnNldEFkYXB0ZXJGYWN0b3J5KGFkYXB0ZXJGYWN0b3J5KTsKLQotCQkvLyBSZWNvbXB1dGUgdGhlIHJlYWQgb25seSBzdGF0ZS4KLQkJaWYgKGVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VUb1JlYWRPbmx5TWFwKCkgIT0gbnVsbCkgewotCQkJZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVRvUmVhZE9ubHlNYXAoKS5jbGVhcigpOwotCi0JCQkvLyBSZWZyZXNoIGFueSBhY3Rpb25zIHRoYXQgbWF5IGJlY29tZSBlbmFibGVkIG9yIGRpc2FibGVkLgotCQkJc2V0U2VsZWN0aW9uKGdldFNlbGVjdGlvbigpKTsKLQkJfQotCX0KLQotCS8vIHRoaXMgd2luZG93IGxpc3RlbmVyIGlzIGZvciBvcGVuaW5nIHRoZSBsaWJyYXJ5IHdoZW4gdGhlIAotCS8vIHZpZXcgZmlyc3QgYmVjb21lcyB2aXNpYmxlCi0JcHJpdmF0ZSBJV2luZG93TGlzdGVuZXIgd2luZG93TGlzdGVuZXIgPSBuZXcgSVdpbmRvd0xpc3RlbmVyKCkgewotCi0JCXB1YmxpYyB2b2lkIHdpbmRvd0FjdGl2YXRlZChJV29ya2JlbmNoV2luZG93IHdpbmRvdykgewotCQl9Ci0KLQkJcHVibGljIHZvaWQgd2luZG93Q2xvc2VkKElXb3JrYmVuY2hXaW5kb3cgd2luZG93KSB7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCB3aW5kb3dEZWFjdGl2YXRlZChJV29ya2JlbmNoV2luZG93IHdpbmRvdykgewotCQl9Ci0KLQkJcHVibGljIHZvaWQgd2luZG93T3BlbmVkKElXb3JrYmVuY2hXaW5kb3cgd2luZG93KSB7Ci0JCQl3aW5kb3cuZ2V0V29ya2JlbmNoKCkucmVtb3ZlV2luZG93TGlzdGVuZXIodGhpcyk7Ci0JCQlib29sZWFuIGlzVmlzaWJsZSA9IGdldFNpdGUoKS5nZXRQYWdlKCkuaXNQYXJ0VmlzaWJsZShBYnN0cmFjdEJhc2VWaWV3LnRoaXMpOwotCQkJaWYgKGlzVmlzaWJsZSkgewotCQkJCUxpYnJhcnlVSU1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5zdGFydHVwT3BlbkxpYnJhcnkoKTsKLQkJCX0gZWxzZSB7Ci0JCQkJTGlicmFyeVVJTWFuYWdlci5nZXRJbnN0YW5jZSgpLmFkZE1ldGhvZFZpZXdQYXJ0TGlzdGVuZXIoZ2V0Vmlld0lkKCkpOwotCQkJfQotCQl9Ci0JfTsKLQotCXByaXZhdGUgSUNvbnRlbnRQcm92aWRlckZhY3RvcnkgY29udGVudFByb3ZpZGVyRmFjdG9yeTsKLQotCS8qKgotCSAqIERpc3BsYXlzIGEgZGlhbG9nIHRoYXQgYXNrcyBpZiBjb25mbGljdGluZyBjaGFuZ2VzIHNob3VsZCBiZSBkaXNjYXJkZWQuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaGFuZGxlRGlydHlDb25mbGljdCgpIHsKLQkJU3RyaW5nIHRpdGxlID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuX1VJX0ZpbGVDb25mbGljdF9sYWJlbDsgCi0JCVN0cmluZyBtc2cgPSBBdXRob3JpbmdVSVJlc291cmNlcy5fV0FSTl9GaWxlQ29uZmxpY3Q7IAotCQlyZXR1cm4gQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpLmRpc3BsYXlQcm9tcHQoCi0JCQkJdGl0bGUsIG1zZyk7Ci0JfQotCi0JLyoqCi0JICogSGFuZGxlcyBjaGFuZ2VkIHJlc291cmNlcyB3aGVuIHRoaXMgdmlldyBpcyBhY3RpdmF0ZWQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlQ2hhbmdlZFJlc291cmNlcygpIHsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBhcnQuV29ya2JlbmNoUGFydCNjcmVhdGVQYXJ0Q29udHJvbChDb21wb3NpdGUpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlUGFydENvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCQlpbml0KCk7Ci0KLQkJYWN0aW9uRGlzcGF0Y2hlciA9IG5ldyBVSUFjdGlvbkRpc3BhdGNoZXIodGhpcyk7Ci0KLQkJLy8gQ3JlYXRlIHRoZSB2aWV3ZXIuCi0JCWNyZWF0ZVZpZXdlcihwYXJlbnQpOwotCi0JCS8vIENyZWF0ZSBhbmQgaW5pdGlhbGl6ZSB0aGUgYWN0aW9uIGJhciBjb250cmlidXRvci4KLQkJdHJ5IHsKLQkJCWFjdGlvbkJhckNvbnRyaWJ1dG9yID0gY3JlYXRlQWN0aW9uQmFyQ29udHJpYnV0b3IoKTsKLQkJCWFjdGlvbkJhckNvbnRyaWJ1dG9yLmluaXQoZ2V0Vmlld1NpdGUoKS5nZXRBY3Rpb25CYXJzKCksIGdldFNpdGUoKQotCQkJCQkuZ2V0UGFnZSgpKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJfQotCi0JCS8vIEFkZCBhIHNlbGVjdGlvbiBjaGFuZ2UgbGlzdGVuZXIgZm9yIHRoZSB2aWV3ZXIuCi0JCVZpZXdlciB2aWV3ZXIgPSBnZXRWaWV3ZXIoKTsKLQkJaWYgKHZpZXdlciAhPSBudWxsKSB7Ci0JCQlpZiAoc2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyID09IG51bGwpIHsKLQkJCQlzZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgPSBuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQkJCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZCgKLQkJCQkJCQlTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgc2VsZWN0aW9uQ2hhbmdlZEV2ZW50KSB7Ci0JCQkJCQlzZXRTZWxlY3Rpb24oc2VsZWN0aW9uQ2hhbmdlZEV2ZW50LmdldFNlbGVjdGlvbigpKTsKLQkJCQkJfQotCQkJCX07Ci0JCQl9Ci0JCQl2aWV3ZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKHNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcik7Ci0JCX0KLQotCQkvLyBBZGQgYSBsaWJyYXJ5IHNlcnZpY2UgbGlzdGVuZXIuCi0JCUxpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuYWRkTGlzdGVuZXIodGhpcyk7Ci0KLQkJT2JqZWN0IGxpYnJhcnkgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCk7Ci0JCWlmIChsaWJyYXJ5ICE9IG51bGwpIHsKLQkJCXNldElucHV0Rm9yVmlld2VyKGxpYnJhcnkpOwotCQkJTGlicmFyeVVJVXRpbC51cGRhdGVTaGVsbFRpdGxlKCk7Ci0JCX0KLQkJSVdvcmtiZW5jaCB3b3JrYmVuY2ggPSBBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0V29ya2JlbmNoKCk7Ci0JCWlmICh3b3JrYmVuY2ggIT0gbnVsbCkgewotCQkJd29ya2JlbmNoLmFkZFdpbmRvd0xpc3RlbmVyKHdpbmRvd0xpc3RlbmVyKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBpbml0KCkgewotCQlJTGlicmFyeU1hbmFnZXIgbWFuYWdlciA9IChJTGlicmFyeU1hbmFnZXIpIExpYnJhcnlTZXJ2aWNlCi0JCQkJLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudExpYnJhcnlNYW5hZ2VyKCk7Ci0JCWlmIChtYW5hZ2VyICE9IG51bGwpIHsKLQkJCWVkaXRpbmdEb21haW4gPSBtYW5hZ2VyLmdldEVkaXRpbmdEb21haW4oKTsKLQkJCWFkYXB0ZXJGYWN0b3J5ID0gKENvbXBvc2VkQWRhcHRlckZhY3RvcnkpIGVkaXRpbmdEb21haW4KLQkJCQkJLmdldEFkYXB0ZXJGYWN0b3J5KCk7Ci0JCX0KLQotCQlJVmlld1NpdGUgc2l0ZSA9IChJVmlld1NpdGUpIHRoaXMuZ2V0U2l0ZSgpOwotCQlzaXRlLnNldFNlbGVjdGlvblByb3ZpZGVyKHRoaXMpOwotCQlzaXRlLmdldFBhZ2UoKS5hZGRQYXJ0TGlzdGVuZXIocGFydExpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBjcmVhdGVzIGEgY29udGV4dCBtZW51IGZvciB0aGUgdmlld2VyCi0JICogQHBhcmFtIHZpZXdlcgotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRleHRNZW51Rm9yKGZpbmFsIFN0cnVjdHVyZWRWaWV3ZXIgdmlld2VyKSB7Ci0JCU1lbnVNYW5hZ2VyIGNvbnRleHRNZW51ID0gbmV3IE1lbnVNYW5hZ2VyKCIjUG9wVXAiKTsgLy8kTk9OLU5MUy0xJAotCQljb250ZXh0TWVudS5hZGQobmV3IFNlcGFyYXRvcigiYWRkaXRpb25zIikpOyAvLyROT04tTkxTLTEkCi0JCWNvbnRleHRNZW51LnNldFJlbW92ZUFsbFdoZW5TaG93bih0cnVlKTsKLQkJY29udGV4dE1lbnUuYWRkTWVudUxpc3RlbmVyKHRoaXMpOwotCQlNZW51IG1lbnUgPSBjb250ZXh0TWVudS5jcmVhdGVDb250ZXh0TWVudSh2aWV3ZXIuZ2V0Q29udHJvbCgpKTsKLQkJdmlld2VyLmdldENvbnRyb2woKS5zZXRNZW51KG1lbnUpOwotCQlnZXRTaXRlKCkucmVnaXN0ZXJDb250ZXh0TWVudShjb250ZXh0TWVudSwgdmlld2VyKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudUxpc3RlbmVyI21lbnVBYm91dFRvU2hvdyhvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVNYW5hZ2VyKQotCSAqLwotCXB1YmxpYyB2b2lkIG1lbnVBYm91dFRvU2hvdyhJTWVudU1hbmFnZXIgbWVudU1hbmFnZXIpIHsKLQkJdHJ5IHsKLQkJCWFjdGlvbkJhckNvbnRyaWJ1dG9yLnNldEFjdGl2ZVZpZXcodGhpcyk7Ci0JCQlhY3Rpb25CYXJDb250cmlidXRvci5tZW51QWJvdXRUb1Nob3cobWVudU1hbmFnZXIpOwotCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCXRocm93IGU7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBhcnQuV29ya2JlbmNoUGFydCNzZXRGb2N1cygpCi0JICovCi0JcHVibGljIHZvaWQgc2V0Rm9jdXMoKSB7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uSUVkaXRpbmdEb21haW5Qcm92aWRlciNnZXRFZGl0aW5nRG9tYWluKCkKLQkgKi8KLQlwdWJsaWMgRWRpdGluZ0RvbWFpbiBnZXRFZGl0aW5nRG9tYWluKCkgewotCQlyZXR1cm4gZWRpdGluZ0RvbWFpbjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyI2FkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIpCi0JICovCi0JcHVibGljIHZvaWQgYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJYWN0aW9uRGlzcGF0Y2hlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobGlzdGVuZXIpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXIjcmVtb3ZlU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcikKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoCi0JCQlJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWFjdGlvbkRpc3BhdGNoZXIucmVtb3ZlU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKGxpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBhcnQuV29ya2JlbmNoUGFydCNnZXRBZGFwdGVyKENsYXNzKQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihDbGFzcyBrZXkpIHsKLQkJaWYgKGtleS5lcXVhbHMoSUdvdG9NYXJrZXIuY2xhc3MpKSB7Ci0JCQlyZXR1cm4gdGhpczsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBzdXBlci5nZXRBZGFwdGVyKGtleSk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyI2dldFNlbGVjdGlvbigpCi0JICovCi0JcHVibGljIElTZWxlY3Rpb24gZ2V0U2VsZWN0aW9uKCkgewotCQlyZXR1cm4gYWN0aW9uRGlzcGF0Y2hlci5nZXRTZWxlY3Rpb24oKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyI3NldFNlbGVjdGlvbihvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb24pCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2VsZWN0aW9uKElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCXNldFNlbGVjdGlvbih0aGlzLCBzZWxlY3Rpb24pOwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRTZWxlY3Rpb24oSVNlbGVjdGlvblByb3ZpZGVyIHNvdXJjZSwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJYWN0aW9uRGlzcGF0Y2hlci5zZXRTZWxlY3Rpb24oc291cmNlLCBzZWxlY3Rpb24pOwotCQlVSUFjdGlvbkRpc3BhdGNoZXIuZ2V0SW5zdGFuY2UoKS5zZXRTZWxlY3Rpb24oc291cmNlLCBzZWxlY3Rpb24pOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuSUxpYnJhcnlTZXJ2aWNlTGlzdGVuZXIjbGlicmFyeUNyZWF0ZWQoTWV0aG9kTGlicmFyeSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBsaWJyYXJ5Q3JlYXRlZChNZXRob2RMaWJyYXJ5IGxpYnJhcnkpIHsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LklMaWJyYXJ5U2VydmljZUxpc3RlbmVyI2xpYnJhcnlPcGVuZWQoTWV0aG9kTGlicmFyeSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBsaWJyYXJ5T3BlbmVkKE1ldGhvZExpYnJhcnkgbGlicmFyeSkgewotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuSUxpYnJhcnlTZXJ2aWNlTGlzdGVuZXIjbGlicmFyeVJlb3BlbmVkKE1ldGhvZExpYnJhcnkpCi0JICovCi0JcHVibGljIHZvaWQgbGlicmFyeVJlb3BlbmVkKE1ldGhvZExpYnJhcnkgbGlicmFyeSkgewotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuSUxpYnJhcnlTZXJ2aWNlTGlzdGVuZXIjbGlicmFyeUNsb3NlZChNZXRob2RMaWJyYXJ5KQotCSAqLwotCXB1YmxpYyB2b2lkIGxpYnJhcnlDbG9zZWQoTWV0aG9kTGlicmFyeSBsaWJyYXJ5KSB7Ci0JCXNldElucHV0Rm9yVmlld2VyKG51bGwpOwotCQlpZiAoYWRhcHRlckZhY3RvcnkgaW5zdGFuY2VvZiBDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KSB7Ci0JCQkoKENvbXBvc2VkQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5kaXNwb3NlKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LklMaWJyYXJ5U2VydmljZUxpc3RlbmVyI2xpYnJhcnlTZXQoTWV0aG9kTGlicmFyeSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBsaWJyYXJ5U2V0KE1ldGhvZExpYnJhcnkgbGlicmFyeSkgewotCQlzZXRJbnB1dEZvclZpZXdlcihsaWJyYXJ5KTsKLQkJaWYgKGxpYnJhcnkgIT0gbnVsbCkgewotCQkJYWN0aW9uQmFyQ29udHJpYnV0b3Iuc2V0QWN0aXZlVmlldyhBYnN0cmFjdEJhc2VWaWV3LnRoaXMpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5JTGlicmFyeVNlcnZpY2VMaXN0ZW5lciNjb25maWd1cmF0aW9uU2V0KE1ldGhvZENvbmZpZ3VyYXRpb24pCi0JICovCi0JcHVibGljIHZvaWQgY29uZmlndXJhdGlvblNldChNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZykgewotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGFydC5Xb3JrYmVuY2hQYXJ0I2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCS8vIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5yZW1vdmVSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKAotCQkvLyByZXNvdXJjZUNoYW5nZUxpc3RlbmVyKTsKLQotCQlnZXRTaXRlKCkuZ2V0UGFnZSgpLnJlbW92ZVBhcnRMaXN0ZW5lcihwYXJ0TGlzdGVuZXIpOwotCi0JCWlmIChhZGFwdGVyRmFjdG9yeSBpbnN0YW5jZW9mIENvbXBvc2VkQWRhcHRlckZhY3RvcnkpIHsKLQkJCSgoQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmRpc3Bvc2UoKTsKLQkJfQotCi0JCWlmIChhY3Rpb25CYXJDb250cmlidXRvci5nZXRBY3RpdmVWaWV3KCkgPT0gdGhpcykgewotCQkJYWN0aW9uQmFyQ29udHJpYnV0b3Iuc2V0QWN0aXZlVmlldyhudWxsKTsKLQkJfQotCi0JCWlmIChwcm9wZXJ0eVNoZWV0UGFnZSAhPSBudWxsKSB7Ci0JCQlwcm9wZXJ0eVNoZWV0UGFnZS5kaXNwb3NlKCk7Ci0JCX0KLQotCQlJV29ya2JlbmNoIHdvcmtiZW5jaCA9IEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRXb3JrYmVuY2goKTsKLQkJaWYgKHdvcmtiZW5jaCAhPSBudWxsKSB7Ci0JCQl3b3JrYmVuY2gucmVtb3ZlV2luZG93TGlzdGVuZXIod2luZG93TGlzdGVuZXIpOwotCQl9Ci0KLQkJTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5yZW1vdmVMaXN0ZW5lcih0aGlzKTsKLQotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhY2Nlc3NlcyBhIGNhY2hlZCB2ZXJzaW9uIG9mIHRoZSBwcm9wZXJ0eSBzaGVldC4KLQkgKi8KLQlwdWJsaWMgSVByb3BlcnR5U2hlZXRQYWdlIGdldFByb3BlcnR5U2hlZXRQYWdlKCkgewotCQlpZiAocHJvcGVydHlTaGVldFBhZ2UgPT0gbnVsbCkgewotCQkJcHJvcGVydHlTaGVldFBhZ2UgPSBuZXcgUHJvcGVydHlTaGVldFBhZ2UoKSB7Ci0JCQkJcHVibGljIHZvaWQgbWFrZUNvbnRyaWJ1dGlvbnMoSU1lbnVNYW5hZ2VyIG1lbnVNYW5hZ2VyLAotCQkJCQkJSVRvb2xCYXJNYW5hZ2VyIHRvb2xCYXJNYW5hZ2VyLAotCQkJCQkJSVN0YXR1c0xpbmVNYW5hZ2VyIHN0YXR1c0xpbmVNYW5hZ2VyKSB7Ci0JCQkJCXN1cGVyLm1ha2VDb250cmlidXRpb25zKG1lbnVNYW5hZ2VyLCB0b29sQmFyTWFuYWdlciwKLQkJCQkJCQlzdGF0dXNMaW5lTWFuYWdlcik7Ci0JCQkJfQotCi0JCQkJcHVibGljIHZvaWQgc2V0QWN0aW9uQmFycyhJQWN0aW9uQmFycyBhY3Rpb25CYXJzKSB7Ci0JCQkJCXN1cGVyLnNldEFjdGlvbkJhcnMoYWN0aW9uQmFycyk7Ci0JCQkJCWlmIChhY3Rpb25CYXJDb250cmlidXRvciAhPSBudWxsKSB7Ci0JCQkJCQlhY3Rpb25CYXJDb250cmlidXRvci5zaGFyZUdsb2JhbEFjdGlvbnModGhpcywKLQkJCQkJCQkJYWN0aW9uQmFycyk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9OwotCQkJcHJvcGVydHlTaGVldFBhZ2UKLQkJCQkJLnNldFByb3BlcnR5U291cmNlUHJvdmlkZXIobmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKAotCQkJCQkJCWFkYXB0ZXJGYWN0b3J5KSk7Ci0JCX0KLQkJcmV0dXJuIHByb3BlcnR5U2hlZXRQYWdlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuaWRlLklHb3RvTWFya2VyI2dvdG9NYXJrZXIoSU1hcmtlcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBnb3RvTWFya2VyKElNYXJrZXIgbWFya2VyKSB7Ci0JCXRyeSB7Ci0JCQlpZiAobWFya2VyLmdldFR5cGUoKS5lcXVhbHMoRVZhbGlkYXRvci5NQVJLRVIpKSB7Ci0JCQkJU3RyaW5nIHVyaUF0dHJpYnV0ZSA9IG1hcmtlci5nZXRBdHRyaWJ1dGUoCi0JCQkJCQlFVmFsaWRhdG9yLlVSSV9BVFRSSUJVVEUsIG51bGwpOwotCQkJCWlmICh1cmlBdHRyaWJ1dGUgIT0gbnVsbCkgewotCQkJCQlVUkkgdXJpID0gVVJJLmNyZWF0ZVVSSSh1cmlBdHRyaWJ1dGUpOwotCQkJCQlFT2JqZWN0IGVPYmplY3QgPSBlZGl0aW5nRG9tYWluLmdldFJlc291cmNlU2V0KCkKLQkJCQkJCQkuZ2V0RU9iamVjdCh1cmksIHRydWUpOwotCQkJCQlpZiAoZU9iamVjdCAhPSBudWxsKSB7Ci0JCQkJCQlzZXRTZWxlY3Rpb25Ub1ZpZXdlcihDb2xsZWN0aW9ucwotCQkJCQkJCQkuc2luZ2xldG9uKGVkaXRpbmdEb21haW4uZ2V0V3JhcHBlcihlT2JqZWN0KSkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFRoaXMgc2V0cyB0aGUgc2VsZWN0aW9uIGludG8gd2hpY2hldmVyIHZpZXdlciBpcyBhY3RpdmUuCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2VsZWN0aW9uVG9WaWV3ZXIoQ29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCWZpbmFsIENvbGxlY3Rpb24gdGhlU2VsZWN0aW9uID0gY29sbGVjdGlvbjsKLQkJaWYgKHRoZVNlbGVjdGlvbiAhPSBudWxsICYmICF0aGVTZWxlY3Rpb24uaXNFbXB0eSgpKSB7Ci0JCQlSdW5uYWJsZSBydW5uYWJsZSA9IG5ldyBSdW5uYWJsZSgpIHsKLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCS8vIFRyeSB0byBzZWxlY3QgdGhlIGl0ZW1zIGluIHRoZSBjdXJyZW50IGNvbnRlbnQgdmlld2VyIG9mCi0JCQkJCS8vIHRoZSBlZGl0b3IuCi0JCQkJCVZpZXdlciB2aWV3ZXIgPSBnZXRWaWV3ZXIoKTsKLQkJCQkJaWYgKHZpZXdlciAhPSBudWxsKSB7Ci0JCQkJCQl2aWV3ZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKAotCQkJCQkJCQl0aGVTZWxlY3Rpb24udG9BcnJheSgpKSwgdHJ1ZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9OwotCQkJcnVubmFibGUucnVuKCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgSUNvbnRlbnRQcm92aWRlckZhY3RvcnkgZ2V0Q29udGVudFByb3ZpZGVyRmFjdG9yeSgpIHsKLQkJaWYoY29udGVudFByb3ZpZGVyRmFjdG9yeSA9PSBudWxsKSB7Ci0JCQkvLyBQcm9jZXNzIHRoZSBjb250cmlidXRvcnMuCi0JCQkvLwotCQkJSUV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5ID0gUGxhdGZvcm0KLQkJCQkJLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCk7Ci0JCQlJRXh0ZW5zaW9uUG9pbnQgZXh0ZW5zaW9uUG9pbnQgPSBleHRlbnNpb25SZWdpc3RyeQotCQkJCQkuZ2V0RXh0ZW5zaW9uUG9pbnQoQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldElkKCksCi0JCQkJCQkJImNvbnRlbnRQcm92aWRlckZhY3RvcmllcyIpOyAvLyROT04tTkxTLTEkCi0JCQlpZiAoZXh0ZW5zaW9uUG9pbnQgIT0gbnVsbCkgewotCQkJCUlFeHRlbnNpb25bXSBleHRlbnNpb25zID0gZXh0ZW5zaW9uUG9pbnQuZ2V0RXh0ZW5zaW9ucygpOwotCQkJCU9iamVjdCBleHQgPSBudWxsOwotCQkJCWV4dF93YWxrOgotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZXh0ZW5zaW9ucy5sZW5ndGg7IGkrKykgewotCQkJCQlJRXh0ZW5zaW9uIGV4dGVuc2lvbiA9IGV4dGVuc2lvbnNbaV07Ci0JCQkJCVN0cmluZyBwbHVnaW5JZCA9IGV4dGVuc2lvbi5nZXROYW1lc3BhY2VJZGVudGlmaWVyKCk7Ci0JCQkJCUJ1bmRsZSBidW5kbGUgPSBQbGF0Zm9ybS5nZXRCdW5kbGUocGx1Z2luSWQpOwotCQkJCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjb25maWdFbGVtZW50cyA9IGV4dGVuc2lvbgotCQkJCQkJCS5nZXRDb25maWd1cmF0aW9uRWxlbWVudHMoKTsKLQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBjb25maWdFbGVtZW50cy5sZW5ndGg7IGorKykgewotCQkJCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNvbmZpZ0VsZW1lbnQgPSBjb25maWdFbGVtZW50c1tqXTsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJU3RyaW5nIHZpZXdJZCA9IGNvbmZpZ0VsZW1lbnQuZ2V0QXR0cmlidXRlKCJ2aWV3Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQlpZiAoZ2V0Vmlld0lkKCkuZXF1YWxzKHZpZXdJZCkpIHsKLQkJCQkJCQkJU3RyaW5nIGNsYXNzTmFtZSA9IGNvbmZpZ0VsZW1lbnQKLQkJCQkJCQkJCQkuZ2V0QXR0cmlidXRlKCJjbGFzcyIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJCWlmIChjbGFzc05hbWUgIT0gbnVsbCkgewotCQkJCQkJCQkJZXh0ID0gYnVuZGxlLmxvYWRDbGFzcyhjbGFzc05hbWUpCi0JCQkJCQkJCQkJCS5uZXdJbnN0YW5jZSgpOwotCQkJCQkJCQkJaWYgKGV4dCBpbnN0YW5jZW9mIElDb250ZW50UHJvdmlkZXJGYWN0b3J5KSB7Ci0JCQkJCQkJCQkJY29udGVudFByb3ZpZGVyRmFjdG9yeSA9IChJQ29udGVudFByb3ZpZGVyRmFjdG9yeSkgZXh0OwotCQkJCQkJCQkJCWJyZWFrIGV4dF93YWxrOwotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkKLQkJCQkJCQkJCS5sb2dFcnJvcihlKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIGNvbnRlbnRQcm92aWRlckZhY3Rvcnk7CQkKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGEgbmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyCi0JICovCi0JcHJvdGVjdGVkIEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyIGNyZWF0ZUNvbnRlbnRQcm92aWRlcigpIHsKLQkJSUNvbnRlbnRQcm92aWRlckZhY3RvcnkgZmFjdG9yeSA9IGdldENvbnRlbnRQcm92aWRlckZhY3RvcnkoKTsJCQotCQlBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlciBjcCA9IG51bGw7Ci0JCWlmKGZhY3RvcnkgIT0gbnVsbCkgewotCQkJSUNvbnRlbnRQcm92aWRlciBjb250ZW50UHJvdmlkZXIgPSBmYWN0b3J5LmNyZWF0ZVByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5LCB0aGlzKTsKLQkJCWlmKGNvbnRlbnRQcm92aWRlciBpbnN0YW5jZW9mIEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKSB7Ci0JCQkJY3AgPSAoQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIpIGNvbnRlbnRQcm92aWRlcjsKLQkJCX0KLQkJfQotCQlyZXR1cm4gY3AgIT0gbnVsbCA/IGNwIDogbmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHRoZSB2aWV3ZXIKLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgVmlld2VyIGdldFZpZXdlcigpOwotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgdmlld2VyIGluIHRoZSBnaXZlbiBwYXJlbnQKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICovCi0JcHVibGljIGFic3RyYWN0IHZvaWQgY3JlYXRlVmlld2VyKENvbXBvc2l0ZSBwYXJlbnQpOwotCi0JLyoqCi0JICogQHJldHVybiBhIG5ldyBhY3Rpb25CYXJDb250cmlidXRlcgotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBJTGlicmFyeUFjdGlvbkJhckNvbnRyaWJ1dG9yIGNyZWF0ZUFjdGlvbkJhckNvbnRyaWJ1dG9yKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBpbnB1dCBmb3IgdGhlIHZpZXdlcgotCSAqIEBwYXJhbSBtb2RlbCBuZXcgaW5wdXQgZm9yIHRoZSB2aWV3ZXIKLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRJbnB1dEZvclZpZXdlcihPYmplY3QgbW9kZWwpOwotCi0JcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXRWaWV3SWQoKTsKLQkKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvdmlld3MvQWJzdHJhY3RMb2NrZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvdmlld3MvQWJzdHJhY3RMb2NrZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2Q2MDA0MC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3ZpZXdzL0Fic3RyYWN0TG9ja2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS52aWV3czsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0TG9ja2VyIHsKLQkKLQlwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBpc0xvY2tlZChPYmplY3Qgc2VsZWN0aW9uKTsgCi0JCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3ZpZXdzL0NvbmZpZ3VyYXRpb25WaWV3LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3ZpZXdzL0NvbmZpZ3VyYXRpb25WaWV3LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlZDgzMWMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS92aWV3cy9Db25maWd1cmF0aW9uVmlldy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudmlld3M7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQmFzaWNDb21tYW5kU3RhY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLklkZW50aXR5Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VkQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSURpc3Bvc2FibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkNvcHlBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuZG5kLkxvY2FsVHJhbnNmZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSUhlbHBDb250ZXh0czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5QZXJzcGVjdGl2ZUxpc3RVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuVUlBY3Rpb25EaXNwYXRjaGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9ucy5Db25maWd1cmF0aW9uVmlld0VkaXRBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zLklMaWJyYXJ5QWN0aW9uQmFyQ29udHJpYnV0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zLklNZW51QWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9ucy5MaWJyYXJ5QWN0aW9uQmFyQ29udHJpYnV0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zLkxpYnJhcnlWaWV3Q29weUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnMuTGlicmFyeVZpZXdGaW5kRWxlbWVudEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmRuZC5MaWJyYXJ5Vmlld2VyRHJhZ0FkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm92aWRlcnMuQ29uZmlndXJhdGlvbkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm92aWRlcnMuSUNvbnRlbnRQcm92aWRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS51dGlsLkNsaXBib2FyZFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5TdHJVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LklMaWJyYXJ5TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkV4dGVuc2lvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZXZlbnRzLklMaWJyYXJ5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuTGlicmFyeVVJTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLlJlc291cmNlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSVRvb2xCYXJNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5TZXBhcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5Eb3VibGVDbGlja0V2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUJhc2VMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklEb3VibGVDbGlja0xpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLkRORDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLkhUTUxUcmFuc2ZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLlRyYW5zZmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklBY3Rpb25CYXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklTaGFyZWRJbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVZpZXdTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBhcnRJbml0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5BY3Rpb25GYWN0b3J5OwotCi0vKioKLSAqIERpc3BsYXlzIHRoZSBjb250ZW50IG9mIHRoZSBjdXJyZW50IG1ldGhvZCBjb25maWd1cmF0aW9uLgotICogPHA+Ci0gKiBUaGUgY3VycmVudCBjb25maWd1cmF0aW9uIGlzIHNldCB2aWEgdGhlIENvbmZpZ3VyYXRpb24gY29tYm9ib3ggaW4gdGhlIHN5c3RlbQotICogdG9vbGJhci4KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIENvbmZpZ3VyYXRpb25WaWV3IGV4dGVuZHMgQWJzdHJhY3RCYXNlVmlldyBpbXBsZW1lbnRzCi0JCUlMaWJyYXJ5Q2hhbmdlTGlzdGVuZXIgewotCi0JLyoqCi0JICogVGhlIHZpZXcgSUQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVklFV19JRCA9IENvbmZpZ3VyYXRpb25WaWV3LmNsYXNzLmdldE5hbWUoKTsKLQotCXByaXZhdGUgU3RyaW5nIGNvbmZpZ05hbWU7Ci0KLQlwcml2YXRlIFRyZWVWaWV3ZXIgdHJlZVZpZXdlcjsKLQotCXByaXZhdGUgSURvdWJsZUNsaWNrTGlzdGVuZXIgZG91YmxlQ2xpY2tMaXN0ZW5lcjsKLQotCXByaXZhdGUgSUZpbHRlciBjb25maWdGaWx0ZXI7Ci0KLQlwcml2YXRlIExpc3Q8QWN0aW9uPiBtZW51QWN0aW9uUHJvdmlkZXJzOwotCQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgQ29uZmlndXJhdGlvblZpZXcoKSB7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5wYXJ0LlZpZXdQYXJ0I2luaXQoSVZpZXdTaXRlKQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSVZpZXdTaXRlIHNpdGUpIHRocm93cyBQYXJ0SW5pdEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLmluaXQoc2l0ZSk7Ci0JCWNyZWF0ZUFjdGlvbnMoc2l0ZSk7Ci0JCUxpYnJhcnlVSU1hbmFnZXIuZ2V0SW5zdGFuY2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBhcnQuV29ya2JlbmNoUGFydCNjcmVhdGVQYXJ0Q29udHJvbChDb21wb3NpdGUpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlUGFydENvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCQlzdXBlci5jcmVhdGVQYXJ0Q29udHJvbChwYXJlbnQpOwotCi0JCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAocGFyZW50LAotCQkJCUF1dGhvcmluZ1VJSGVscENvbnRleHRzLkNPTkZJR1VSQVRJT05fVklFV19DT05URVhUKTsKLQotCQllZGl0aW5nRG9tYWluID0gbmV3IEFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbihhZGFwdGVyRmFjdG9yeSwKLQkJCQluZXcgQmFzaWNDb21tYW5kU3RhY2soKSk7Ci0JCWFkYXB0ZXJGYWN0b3J5ID0gKENvbXBvc2VkQWRhcHRlckZhY3RvcnkpIGVkaXRpbmdEb21haW4KLQkJCQkuZ2V0QWRhcHRlckZhY3RvcnkoKTsKLQotCQkvLyBPcGVuIHRoZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24uCi0JCXNldENvbmZpZ3VyYXRpb24obnVsbCk7Ci0JCQotCQlsb2FkTWVudUFjdGlvblByb3ZpZGVycygpOwotCQlJVG9vbEJhck1hbmFnZXIgbWdyPSBnZXRWaWV3U2l0ZSgpLmdldEFjdGlvbkJhcnMoKS5nZXRUb29sQmFyTWFuYWdlcigpOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgbWVudUFjdGlvblByb3ZpZGVycy5zaXplKCk7IGkrKykgewotCQkJdHJ5IHsKLQkJCQlPYmplY3QgYWN0aW9uUHJvdmlkZXIgID0gbWVudUFjdGlvblByb3ZpZGVycy5nZXQoaSk7Ci0JCQkJaWYgKGFjdGlvblByb3ZpZGVyIGluc3RhbmNlb2YgQWN0aW9uKSB7Ci0JCQkJCW1nci5hZGQoKEFjdGlvbilhY3Rpb25Qcm92aWRlcik7Ci0JCQkJCWlmIChhY3Rpb25Qcm92aWRlciBpbnN0YW5jZW9mIElNZW51QWN0aW9uKQotCQkJCQkJKChJTWVudUFjdGlvbikgYWN0aW9uUHJvdmlkZXIpLmluaXQodGhpcyk7Ci0JCQkJfQotCQkJCQotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JLyoqIAotCSAqIEdldCBhbGwgbWVudSBwcm92aWRlcnMKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBMaXN0PEFjdGlvbj4gbG9hZE1lbnVBY3Rpb25Qcm92aWRlcnMoKSB7Ci0JCWlmIChtZW51QWN0aW9uUHJvdmlkZXJzID09IG51bGwpIHsKLQkJCW1lbnVBY3Rpb25Qcm92aWRlcnMgPSBFeHRlbnNpb25NYW5hZ2VyLmdldEV4dGVuc2lvbnMoQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldElkKCksICJjb25maWd1cmF0aW9uVmlld01lbnVQcm92aWRlciIsIEFjdGlvbi5jbGFzcyk7IC8vJE5PTi1OTFMtMSQJCi0JCX0KLQkJcmV0dXJuIG1lbnVBY3Rpb25Qcm92aWRlcnM7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5JTGlicmFyeVNlcnZpY2VMaXN0ZW5lciNsaWJyYXJ5Q3JlYXRlZChNZXRob2RMaWJyYXJ5KQotCSAqLwotCXB1YmxpYyB2b2lkIGxpYnJhcnlDcmVhdGVkKE1ldGhvZExpYnJhcnkgbGlicmFyeSkgewotCX0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LklMaWJyYXJ5U2VydmljZUxpc3RlbmVyI2xpYnJhcnlPcGVuZWQoTWV0aG9kTGlicmFyeSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBsaWJyYXJ5T3BlbmVkKE1ldGhvZExpYnJhcnkgbGlicmFyeSkgewotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuSUxpYnJhcnlTZXJ2aWNlTGlzdGVuZXIjbGlicmFyeUNsb3NlZChNZXRob2RMaWJyYXJ5KQotCSAqLwotCXB1YmxpYyB2b2lkIGxpYnJhcnlDbG9zZWQoTWV0aG9kTGlicmFyeSBsaWJyYXJ5KSB7Ci0JCXNldElucHV0Rm9yVmlld2VyKG51bGwpOwotCQlpZiAoYWRhcHRlckZhY3RvcnkgaW5zdGFuY2VvZiBDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KSB7Ci0JCQkoKENvbXBvc2VkQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5kaXNwb3NlKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LklMaWJyYXJ5U2VydmljZUxpc3RlbmVyI2xpYnJhcnlTZXQoTWV0aG9kTGlicmFyeSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBsaWJyYXJ5U2V0KE1ldGhvZExpYnJhcnkgbGlicmFyeSkgewotCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudE1ldGhvZENvbmZpZ3VyYXRpb24oKTsKLQkJaWYoY29uZmlnICE9IG51bGwgJiYgY29uZmlnLmVDb250YWluZXIoKSAhPSBsaWJyYXJ5KSB7Ci0JCQlzZXRNZXRob2RDb25maWd1cmF0aW9uKG51bGwpOwotCQl9Ci0JCS8vIEFkZCBhIGxpYnJhcnkgY2hhbmdlIGxpc3RlbmVyLgotCQlJTGlicmFyeU1hbmFnZXIgbWFuYWdlciA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLQkJCQkuZ2V0Q3VycmVudExpYnJhcnlNYW5hZ2VyKCk7Ci0JCWlmIChtYW5hZ2VyICE9IG51bGwpIHsKLQkJCW1hbmFnZXIuYWRkTGlzdGVuZXIodGhpcyk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmV2ZW50cy5JTGlicmFyeUNoYW5nZUxpc3RlbmVyI2xpYnJhcnlDaGFuZ2VkKGludCwKLQkgKiAgICAgIENvbGxlY3Rpb24pCi0JICovCi0JcHVibGljIHZvaWQgbGlicmFyeUNoYW5nZWQoaW50IG9wdGlvbiwgQ29sbGVjdGlvbiBjaGFuZ2VkSXRlbXMpIHsKLQkJc3dpdGNoIChvcHRpb24pIHsKLQkJY2FzZSBJTGlicmFyeUNoYW5nZUxpc3RlbmVyLk9QVElPTl9ERUxFVEVEOgotCQkJaWYgKGNoYW5nZWRJdGVtcyAhPSBudWxsKSB7Ci0JCQkJZm9yIChJdGVyYXRvciBpdCA9IGNoYW5nZWRJdGVtcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJCU9iamVjdCBlbGVtZW50ID0gaXQubmV4dCgpOwotCQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZENvbmZpZ3VyYXRpb24pIHsKLQkJCQkJCWlmICgoKE1ldGhvZENvbmZpZ3VyYXRpb24pIGVsZW1lbnQpLmdldE5hbWUoKS5lcXVhbHMoCi0JCQkJCQkJCWdldEN1cnJlbnRDb25maWcoKSkpIHsKLQkJCQkJCQlzZXRNZXRob2RDb25maWd1cmF0aW9uKG51bGwpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCQkJLy8gQnVnemlsbGEgZGVmZWN0IDE2NDczOSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JCWNhc2UgSUxpYnJhcnlDaGFuZ2VMaXN0ZW5lci5PUFRJT05fQ0hBTkdFRDogICAgICAgICAgICAgICAgICAgICAgIAotCQkJaWYgKGNoYW5nZWRJdGVtcyAhPSBudWxsKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCQkJCWZvciAoSXRlcmF0b3IgaXQgPSBjaGFuZ2VkSXRlbXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgeyAgCi0JCQkJCU9iamVjdCBlbGVtZW50ID0gaXQubmV4dCgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZENvbmZpZ3VyYXRpb24pIHsgICAgICAgICAgICAgICAKLQkJCQkJCWlmICgoKE1ldGhvZENvbmZpZ3VyYXRpb24pIGVsZW1lbnQpICAgICAgICAgICAgICAgICAgICAgICAKLQkJCQkJCQkJLmVxdWFscyhMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpICAgICAgICAgICAgICAgICAgCi0JCQkJCQkJCQkJLmdldEN1cnJlbnRNZXRob2RDb25maWd1cmF0aW9uKCkpKSB7ICAgICAgICAgICAgICAKLQkJCQkJCQlzZXRDb250ZW50RGVzY3JpcHRpb24oKChNZXRob2RDb25maWd1cmF0aW9uKSBlbGVtZW50KSAgIAotCQkJCQkJCQkJLmdldE5hbWUoKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCQkJCQkJfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCQkJCQl9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkJCQl9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCQkJfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCQkJYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5JTGlicmFyeVNlcnZpY2VMaXN0ZW5lciNjb25maWd1cmF0aW9uU2V0KE1ldGhvZENvbmZpZ3VyYXRpb24pCi0JICovCi0JcHVibGljIHZvaWQgY29uZmlndXJhdGlvblNldChNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZykgewotCQlzZXRNZXRob2RDb25maWd1cmF0aW9uKGNvbmZpZyk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiB0aGUgbmFtZSBvZiB0aGUgY3VycmVudGx5IHZpZXdlZCBjb25maWd1cmF0aW9uCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDdXJyZW50Q29uZmlnKCkgewotCQlyZXR1cm4gY29uZmlnTmFtZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudmlld3MuQWJzdHJhY3RCYXNlVmlldyNzZXRGb2N1cygpCi0JICovCi0JcHVibGljIHZvaWQgc2V0Rm9jdXMoKSB7Ci0JCWFjdGlvbkJhckNvbnRyaWJ1dG9yLnNldEFjdGl2ZVZpZXcodGhpcyk7Ci0KLQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0ZWQgPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGdldFNlbGVjdGlvbigpOwotCQlpZiAoc2VsZWN0ZWQuaXNFbXB0eSgpKQotCQkJYWN0aW9uQmFyQ29udHJpYnV0b3IuZGlzYWJsZUdsb2JhbEVkaXRNZW51KCk7Ci0JCWVsc2UKLQkJCWFjdGlvbkJhckNvbnRyaWJ1dG9yLmVuYWJsZUdsb2JhbEVkaXRNZW51KCk7Ci0KLQkJaWYgKHRyZWVWaWV3ZXIgIT0gbnVsbCkgewotCQkJdHJlZVZpZXdlci5nZXRDb250cm9sKCkuc2V0Rm9jdXMoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIHZpZXdlci4KLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVWaWV3ZXIoQ29tcG9zaXRlIHBhcmVudCkgewotCQkvLyBDcmVhdGUgdGhlIGNvbnRyb2xzLgotCQlDb21wb3NpdGUgY29udGVudCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCWNvbnRlbnQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJY29udGVudC5zZXRMYXlvdXQobGF5b3V0KTsKLQotCQl0cmVlVmlld2VyID0gbmV3IFRyZWVWaWV3ZXIoY29udGVudCk7Ci0JCXRyZWVWaWV3ZXIuc2V0VXNlSGFzaGxvb2t1cCh0cnVlKTsKLQkJdHJlZVZpZXdlci5nZXRUcmVlKCkuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0KLQkJLy8gQWRkIGRyYWctYW5kLWRyb3Agc3VwcG9ydC4KLQkJaW50IGRuZE9wZXJhdGlvbnMgPSBETkQuRFJPUF9DT1BZIHwgRE5ELkRST1BfTU9WRTsKLQkJVHJhbnNmZXJbXSB0cmFuc2ZlcnMgPSBuZXcgVHJhbnNmZXJbXSB7IEhUTUxUcmFuc2Zlci5nZXRJbnN0YW5jZSgpLAotCQkJCUxvY2FsVHJhbnNmZXIuZ2V0SW5zdGFuY2UoKSB9OwotCQl0cmVlVmlld2VyLmFkZERyYWdTdXBwb3J0KGRuZE9wZXJhdGlvbnMsIHRyYW5zZmVycywKLQkJCQluZXcgTGlicmFyeVZpZXdlckRyYWdBZGFwdGVyKHRyZWVWaWV3ZXIpKTsKLQotCQkvLyBBZGQgYSBkb3VibGUgY2xpY2sgbGlzdGVuZXIuCi0JCWRvdWJsZUNsaWNrTGlzdGVuZXIgPSBuZXcgSURvdWJsZUNsaWNrTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBkb3VibGVDbGljayhEb3VibGVDbGlja0V2ZW50IGV2ZW50KSB7Ci0JCQkJVUlBY3Rpb25EaXNwYXRjaGVyLmdldEluc3RhbmNlKCkuaGFuZGxlRG91YmxlQ2xpY2tFdmVudChldmVudCk7Ci0JCQl9Ci0JCX07Ci0JCXRyZWVWaWV3ZXIuYWRkRG91YmxlQ2xpY2tMaXN0ZW5lcihkb3VibGVDbGlja0xpc3RlbmVyKTsKLQotCQljcmVhdGVDb250ZXh0TWVudUZvcih0cmVlVmlld2VyKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBhY3Rpb25zLgotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUFjdGlvbnMoSVZpZXdTaXRlIHZpZXdTaXRlKSB7Ci0JCUlBY3Rpb24gZWRpdEFjdGlvbiA9IG5ldyBBY3Rpb24oQXV0aG9yaW5nVUlSZXNvdXJjZXMuYWN0aW9uTGFiZWxfZWRpdCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCVVJQWN0aW9uRGlzcGF0Y2hlci5lZGl0Q29uZmlndXJhdGlvbihjb25maWdOYW1lKTsKLQkJCX0KLQkJfTsKLQkJZWRpdEFjdGlvbgotCQkJCS5zZXRUb29sVGlwVGV4dChBdXRob3JpbmdVSVJlc291cmNlcy5lZGl0Q29uZmlndXJhdGlvbl90b29sdGlwKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcmVzZXQoKSB7Ci0JCS8vIFByZXZlbnQgbWVtb3J5IGxlYWsuCi0JCWNvbmZpZ05hbWUgPSBudWxsOwotCQlpZiAoYWRhcHRlckZhY3RvcnkgIT0gbnVsbCkgewotCQkJaWYgKGFkYXB0ZXJGYWN0b3J5IGluc3RhbmNlb2YgSURpc3Bvc2FibGUpIHsKLQkJCQkoKElEaXNwb3NhYmxlKSBhZGFwdGVyRmFjdG9yeSkuZGlzcG9zZSgpOwotCQkJfQotCQkJYWRhcHRlckZhY3RvcnkgPSBudWxsOwotCQl9Ci0JCWVkaXRpbmdEb21haW4uc2V0QWRhcHRlckZhY3RvcnkobnVsbCk7Ci0JCUlDb250ZW50UHJvdmlkZXIgY29udGVudFByb3ZpZGVyID0gdHJlZVZpZXdlci5nZXRDb250ZW50UHJvdmlkZXIoKTsKLQkJaWYgKGNvbnRlbnRQcm92aWRlciAhPSBudWxsKSB7Ci0JCQljb250ZW50UHJvdmlkZXIuZGlzcG9zZSgpOwotCQl9Ci0JCUlCYXNlTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyID0gdHJlZVZpZXdlci5nZXRMYWJlbFByb3ZpZGVyKCk7Ci0JCWlmIChsYWJlbFByb3ZpZGVyICE9IG51bGwpIHsKLQkJCWxhYmVsUHJvdmlkZXIuZGlzcG9zZSgpOwotCQl9Ci0JCVN0cnVjdHVyZWRTZWxlY3Rpb24gZW1wdHlTZWxlY3Rpb24gPSBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbigpOwotCQlhY3Rpb25EaXNwYXRjaGVyLnNldFNlbGVjdGlvbihlbXB0eVNlbGVjdGlvbik7Ci0JCVVJQWN0aW9uRGlzcGF0Y2hlci5nZXRJbnN0YW5jZSgpLnNldFNlbGVjdGlvbihlbXB0eVNlbGVjdGlvbik7Ci0JfQotCQotCXByaXZhdGUgSUZpbHRlciBjcmVhdGVGaWx0ZXIoTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLQkJSUNvbnRlbnRQcm92aWRlckZhY3RvcnkgY3BGYWN0b3J5ID0gZ2V0Q29udGVudFByb3ZpZGVyRmFjdG9yeSgpOwotCQlJRmlsdGVyIGZpbHRlciA9IG51bGw7Ci0JCWlmKGNwRmFjdG9yeSAhPSBudWxsKSB7Ci0JCQlmaWx0ZXIgPSBjcEZhY3RvcnkuY3JlYXRlRmlsdGVyKGNvbmZpZywgdHJlZVZpZXdlcik7Ci0JCX0KLQkJcmV0dXJuIGZpbHRlciAhPSBudWxsID8gZmlsdGVyIDogbmV3IENvbmZpZ3VyYXRpb25WaWV3RmlsdGVyKGNvbmZpZywgdHJlZVZpZXdlcik7Ci0JfQotCQotCS8qKgotCSAqIFNldHMgdGhlIGdpdmVuIE1ldGhvZCBDb25maWd1cmF0aW9uIGFzIHRoaXMgdmlld2VyJ3MgaW5wdXQKLQkgKiAKLQkgKiBAcGFyYW0gY29uZmlnCi0JICovCi0JcHVibGljIHZvaWQgc2V0TWV0aG9kQ29uZmlndXJhdGlvbihNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZykgewotCQlDb250cm9sIGN0cmwgPSB0aGlzLmdldFZpZXdlcigpLmdldENvbnRyb2woKTsKLQkJaWYgKGN0cmwgPT0gbnVsbCB8fCBjdHJsLmlzRGlzcG9zZWQoKSkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJaWYgKHRyZWVWaWV3ZXIuZ2V0SW5wdXQoKSA9PSBjb25maWcpCi0JCQlyZXR1cm47Ci0JCVN0cmluZyB0aXRsZSA9ICIiOyAvLyROT04tTkxTLTEkCi0KLQkJaWYgKGNvbmZpZyAhPSBudWxsKSB7Ci0JCQl0aGlzLmNvbmZpZ05hbWUgPSBjb25maWcuZ2V0TmFtZSgpOwotCQkJY29uZmlnRmlsdGVyID0gY3JlYXRlRmlsdGVyKGNvbmZpZyk7Ci0JCQlhZGFwdGVyRmFjdG9yeSA9IFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCS5nZXRDb25maWd1cmF0aW9uVmlld19BZGFwdGVyRmFjdG9yeShjb25maWdGaWx0ZXIpOwotCQkJZWRpdGluZ0RvbWFpbi5zZXRBZGFwdGVyRmFjdG9yeShhZGFwdGVyRmFjdG9yeSk7Ci0JCQlBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlciBjb250ZW50UHJvdmlkZXIgPSAoQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIpIHRyZWVWaWV3ZXIuZ2V0Q29udGVudFByb3ZpZGVyKCk7CQkJCi0JCQlpZihjb250ZW50UHJvdmlkZXIgPT0gbnVsbCkgewotCQkJCWNvbnRlbnRQcm92aWRlciA9IGNyZWF0ZUNvbnRlbnRQcm92aWRlcigpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJY29udGVudFByb3ZpZGVyLnNldEFkYXB0ZXJGYWN0b3J5KGFkYXB0ZXJGYWN0b3J5KTsKLQkJCX0KLQkJCXRyZWVWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKGNvbnRlbnRQcm92aWRlcik7Ci0JCQl0cmVlVmlld2VyLnNldExhYmVsUHJvdmlkZXIobmV3IENvbmZpZ3VyYXRpb25MYWJlbFByb3ZpZGVyKGNvbmZpZywKLQkJCQkJYWRhcHRlckZhY3RvcnkpKTsKLQkJCXRpdGxlID0gY29uZmlnLmdldE5hbWUoKTsKLQkJfSBlbHNlIHsKLQkJCS8vIFByZXZlbnQgbWVtb3J5IGxlYWsuCi0JCQljb25maWdOYW1lID0gbnVsbDsKLQkJCWlmIChhZGFwdGVyRmFjdG9yeSAhPSBudWxsKSB7Ci0JCQkJaWYgKGFkYXB0ZXJGYWN0b3J5IGluc3RhbmNlb2YgSURpc3Bvc2FibGUpIHsKLQkJCQkJKChJRGlzcG9zYWJsZSkgYWRhcHRlckZhY3RvcnkpLmRpc3Bvc2UoKTsKLQkJCQl9Ci0JCQkJYWRhcHRlckZhY3RvcnkgPSBudWxsOwotCQkJfQotCQkJZWRpdGluZ0RvbWFpbi5zZXRBZGFwdGVyRmFjdG9yeShudWxsKTsKLQkJCUlDb250ZW50UHJvdmlkZXIgY29udGVudFByb3ZpZGVyID0gdHJlZVZpZXdlci5nZXRDb250ZW50UHJvdmlkZXIoKTsKLQkJCWlmIChjb250ZW50UHJvdmlkZXIgIT0gbnVsbCkgewotCQkJCWNvbnRlbnRQcm92aWRlci5kaXNwb3NlKCk7Ci0JCQl9Ci0JCQlJQmFzZUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlciA9IHRyZWVWaWV3ZXIuZ2V0TGFiZWxQcm92aWRlcigpOwotCQkJaWYgKGxhYmVsUHJvdmlkZXIgIT0gbnVsbCkgewotCQkJCWxhYmVsUHJvdmlkZXIuZGlzcG9zZSgpOwotCQkJfQotCQkJU3RydWN0dXJlZFNlbGVjdGlvbiBlbXB0eVNlbGVjdGlvbiA9IG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKCk7Ci0JCQlhY3Rpb25EaXNwYXRjaGVyLnNldFNlbGVjdGlvbihlbXB0eVNlbGVjdGlvbik7Ci0JCQlVSUFjdGlvbkRpc3BhdGNoZXIuZ2V0SW5zdGFuY2UoKS5zZXRTZWxlY3Rpb24oZW1wdHlTZWxlY3Rpb24pOwotCQl9Ci0KLQkJdHJlZVZpZXdlci5zZXRJbnB1dChjb25maWcpOwotCQlzZXRDb250ZW50RGVzY3JpcHRpb24odGl0bGUpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhpcyB2aWV3ZXIncyBpbnB1dCB0byB0aGUgTWV0aG9kIENvbmZpZ3VyYXRpb24gd2l0aCB0aGUgZ2l2ZW4gbmFtZQotCSAqIAotCSAqIEBwYXJhbSBuYW1lCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29uZmlndXJhdGlvbihTdHJpbmcgbmFtZSkgewotCQljb25maWdOYW1lID0gbmFtZTsKLQotCQlpZiAobmFtZSA9PSBudWxsKSB7Ci0JCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLQkJCQkJLmdldEN1cnJlbnRNZXRob2RDb25maWd1cmF0aW9uKCk7Ci0JCQlpZiAoY29uZmlnICE9IG51bGwpIHsKLQkJCQljb25maWdOYW1lID0gY29uZmlnLmdldE5hbWUoKTsKLQkJCX0KLQkJfQotCi0JCWlmIChjb25maWdOYW1lICE9IG51bGwpIHsKLQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gTGlicmFyeVNlcnZpY2VVdGlsCi0JCQkJCS5nZXRNZXRob2RDb25maWd1cmF0aW9uKExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLQkJCQkJCQkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKSwgY29uZmlnTmFtZSk7Ci0JCQlpZiAoY29uZmlnICE9IG51bGwpIHsKLQkJCQlzZXRNZXRob2RDb25maWd1cmF0aW9uKGNvbmZpZyk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0KLQkJdGhpcy5jb25maWdOYW1lID0gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudmlld3MuQWJzdHJhY3RCYXNlVmlldyNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlzdXBlci5kaXNwb3NlKCk7Ci0JCWlmIChkb3VibGVDbGlja0xpc3RlbmVyICE9IG51bGwpIHsKLQkJCXRyZWVWaWV3ZXIucmVtb3ZlRG91YmxlQ2xpY2tMaXN0ZW5lcihkb3VibGVDbGlja0xpc3RlbmVyKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gdGhlIENvbmZpZ3VyYXRpb25WaWV3IG9iamVjdAotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ29uZmlndXJhdGlvblZpZXcgZ2V0VmlldygpIHsKLS8vCQl0cnkgewotLy8JCQlJV29ya2JlbmNoUGFnZSBhY3RpdmVQYWdlID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKQotLy8JCQkJCS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRBY3RpdmVQYWdlKCk7Ci0vLwkJCWlmIChhY3RpdmVQYWdlICE9IG51bGwpIHsKLS8vCQkJCUlWaWV3UGFydCB2aWV3ID0gYWN0aXZlUGFnZS5maW5kVmlldyhWSUVXX0lEKTsKLS8vCQkJCWlmICh2aWV3ID09IG51bGwpIHsKLS8vCQkJCQl2aWV3ID0gYWN0aXZlUGFnZS5zaG93VmlldyhWSUVXX0lEKTsKLS8vCQkJCX0KLS8vCQkJCXJldHVybiAoQ29uZmlndXJhdGlvblZpZXcpIHZpZXc7Ci0vLwkJCX0KLS8vCi0vLwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLS8vCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotLy8JCX0KLS8vCi0vLwkJcmV0dXJuIG51bGw7Ci0JCQotCQlib29sZWFuIHNob3cgPSBWaWV3SGVscGVyLmlzVmlld0luQ3VycmVudFBlcnNwZWN0aXZlKFZJRVdfSUQpOwotCQlyZXR1cm4gKENvbmZpZ3VyYXRpb25WaWV3KVZpZXdIZWxwZXIuZmluZFZpZXcoVklFV19JRCwgc2hvdyk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnZpZXdzLkFic3RyYWN0QmFzZVZpZXcjZ2V0Vmlld2VyKCkKLQkgKi8KLQlwdWJsaWMgVmlld2VyIGdldFZpZXdlcigpIHsKLQkJcmV0dXJuIHRyZWVWaWV3ZXI7Ci0JfQotCi0JcHJpdmF0ZSBjbGFzcyBDb25maWd1cmF0aW9uVmlld0FjdGlvbkJhckNvbnRyaWJ1dG9yIGV4dGVuZHMKLQkJCUxpYnJhcnlBY3Rpb25CYXJDb250cmlidXRvciB7Ci0KLQkJcHJpdmF0ZSBMaWJyYXJ5Vmlld0ZpbmRFbGVtZW50QWN0aW9uIGxpYnJhcnlWaWV3RmluZEVsZW1lbnRBY3Rpb247Ci0KLQkJcHVibGljIENvbmZpZ3VyYXRpb25WaWV3QWN0aW9uQmFyQ29udHJpYnV0b3IoRWRpdGluZ0RvbWFpbiBlZGl0aW5nRG9tYWluKSB7Ci0JCQlzdXBlcihlZGl0aW5nRG9tYWluKTsKLQkJCQotCQkJLy8gZG9uJ3Qgc2hvdyB2YWxpZGF0ZSBhY3Rpb24KLQkJCS8vCi0JCQl2YWxpZGF0ZUFjdGlvbiA9IG51bGw7Ci0JCX0KLQotCQkvKioKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnMuTGlicmFyeUFjdGlvbkJhckNvbnRyaWJ1dG9yI2luaXQoSUFjdGlvbkJhcnMpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBpbml0KElBY3Rpb25CYXJzIGFjdGlvbkJhcnMpIHsKLQkJCUlTaGFyZWRJbWFnZXMgc2hhcmVkSW1hZ2VzID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKQotCQkJCQkuZ2V0U2hhcmVkSW1hZ2VzKCk7Ci0JCQljb3B5QWN0aW9uID0gY3JlYXRlQ29weUFjdGlvbigpOwotCQkJY29weUFjdGlvbi5zZXRJbWFnZURlc2NyaXB0b3Ioc2hhcmVkSW1hZ2VzCi0JCQkJCS5nZXRJbWFnZURlc2NyaXB0b3IoSVNoYXJlZEltYWdlcy5JTUdfVE9PTF9DT1BZKSk7Ci0JCQlhY3Rpb25CYXJzLnNldEdsb2JhbEFjdGlvbkhhbmRsZXIoQWN0aW9uRmFjdG9yeS5DT1BZLmdldElkKCksCi0JCQkJCWNvcHlBY3Rpb24pOwotCi0JCQl2aWV3QWN0aW9uQmFycyA9IGFjdGlvbkJhcnM7Ci0JCQljb25maWdWaWV3RWRpdEFjdGlvbiA9IG5ldyBDb25maWd1cmF0aW9uVmlld0VkaXRBY3Rpb24oCi0JCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLmFjdGlvbkxhYmVsX2VkaXQpOwotCQkJYWN0aW9uQmFycy5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKAotCQkJCQkib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zLm9wZW5FbGVtZW50IiwgLy8kTk9OLU5MUy0xJAotCQkJCQljb25maWdWaWV3RWRpdEFjdGlvbik7Ci0JCQlsaWJyYXJ5Vmlld0ZpbmRFbGVtZW50QWN0aW9uID0gbmV3IExpYnJhcnlWaWV3RmluZEVsZW1lbnRBY3Rpb24oCi0JCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLmFjdGlvbkxhYmVsX2ZpbmRFbGVtZW50SW5MaWJOYXYpOwotCQkJYWN0aW9uQmFycy5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKAotCQkJCQlMaWJyYXJ5Vmlld0ZpbmRFbGVtZW50QWN0aW9uLkFDVElPTl9JRCwKLQkJCQkJbGlicmFyeVZpZXdGaW5kRWxlbWVudEFjdGlvbik7Ci0JCX0KLQotCQkvKioKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnMuTGlicmFyeUFjdGlvbkJhckNvbnRyaWJ1dG9yI2FjdGl2YXRlKCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIGFjdGl2YXRlKCkgewotCQkJYWN0aXZlVmlld1BhcnQuYWRkUHJvcGVydHlMaXN0ZW5lcih0aGlzKTsKLQkJCUlTZWxlY3Rpb25Qcm92aWRlciBzZWxlY3Rpb25Qcm92aWRlciA9IGFjdGl2ZVZpZXdQYXJ0IGluc3RhbmNlb2YgSVNlbGVjdGlvblByb3ZpZGVyID8gKElTZWxlY3Rpb25Qcm92aWRlcikgYWN0aXZlVmlld1BhcnQKLQkJCQkJOiBhY3RpdmVWaWV3UGFydC5nZXRTaXRlKCkuZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKTsKLQkJCXNlbGVjdGlvblByb3ZpZGVyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihjb25maWdWaWV3RWRpdEFjdGlvbik7Ci0JCQlzZWxlY3Rpb25Qcm92aWRlcgotCQkJCQkuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKGxpYnJhcnlWaWV3RmluZEVsZW1lbnRBY3Rpb24pOwotCQkJY29weUFjdGlvbi5zZXRFZGl0aW5nRG9tYWluKGVkaXRpbmdEb21haW4pOwotCQkJc2VsZWN0aW9uUHJvdmlkZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKGNvcHlBY3Rpb24pOwotCQkJdXBkYXRlKCk7Ci0JCX0KLQotCQkvKioKLQkJICogQHNlZSBMaWJyYXJ5QWN0aW9uQmFyQ29udHJpYnV0b3IjZGVhY3RpdmF0ZSgpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBkZWFjdGl2YXRlKCkgewotCQkJYWN0aXZlVmlld1BhcnQucmVtb3ZlUHJvcGVydHlMaXN0ZW5lcih0aGlzKTsKLQkJCUlTZWxlY3Rpb25Qcm92aWRlciBzZWxlY3Rpb25Qcm92aWRlciA9IGFjdGl2ZVZpZXdQYXJ0IGluc3RhbmNlb2YgSVNlbGVjdGlvblByb3ZpZGVyID8gKElTZWxlY3Rpb25Qcm92aWRlcikgYWN0aXZlVmlld1BhcnQKLQkJCQkJOiBhY3RpdmVWaWV3UGFydC5nZXRTaXRlKCkuZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKTsKLQkJCXNlbGVjdGlvblByb3ZpZGVyCi0JCQkJCS5yZW1vdmVTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoY29uZmlnVmlld0VkaXRBY3Rpb24pOwotCQkJc2VsZWN0aW9uUHJvdmlkZXIKLQkJCQkJLnJlbW92ZVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihsaWJyYXJ5Vmlld0ZpbmRFbGVtZW50QWN0aW9uKTsKLQkJCWNvcHlBY3Rpb24uc2V0RWRpdGluZ0RvbWFpbihudWxsKTsKLQkJCXNlbGVjdGlvblByb3ZpZGVyLnJlbW92ZVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihjb3B5QWN0aW9uKTsKLQkJfQotCi0JCS8qKgotCQkgKiBAc2VlIExpYnJhcnlBY3Rpb25CYXJDb250cmlidXRvciN1cGRhdGUoKQotCQkgKi8KLQkJcHVibGljIHZvaWQgdXBkYXRlKCkgewotCQkJSVNlbGVjdGlvblByb3ZpZGVyIHNlbGVjdGlvblByb3ZpZGVyID0gYWN0aXZlVmlld1BhcnQgaW5zdGFuY2VvZiBJU2VsZWN0aW9uUHJvdmlkZXIgPyAoSVNlbGVjdGlvblByb3ZpZGVyKSBhY3RpdmVWaWV3UGFydAotCQkJCQk6IGFjdGl2ZVZpZXdQYXJ0LmdldFNpdGUoKS5nZXRTZWxlY3Rpb25Qcm92aWRlcigpOwotCQkJSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSBzZWxlY3Rpb25Qcm92aWRlci5nZXRTZWxlY3Rpb24oKTsKLQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHN0cnVjdHVyZWRTZWxlY3Rpb24gPSBzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbiA/IChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uCi0JCQkJCTogU3RydWN0dXJlZFNlbGVjdGlvbi5FTVBUWTsKLQkJCWNvbmZpZ1ZpZXdFZGl0QWN0aW9uLnNlbGVjdGlvbkNoYW5nZWQoc3RydWN0dXJlZFNlbGVjdGlvbik7Ci0JCQlsaWJyYXJ5Vmlld0ZpbmRFbGVtZW50QWN0aW9uLnNlbGVjdGlvbkNoYW5nZWQoc3RydWN0dXJlZFNlbGVjdGlvbik7Ci0JCQljb3B5QWN0aW9uLnVwZGF0ZVNlbGVjdGlvbihzdHJ1Y3R1cmVkU2VsZWN0aW9uKTsKLQkJfQotCi0JCS8qKgotCQkgKiBAc2VlIExpYnJhcnlBY3Rpb25CYXJDb250cmlidXRvciNzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCX0KLQotCQkvKioKLQkJICogQHNlZSBMaWJyYXJ5QWN0aW9uQmFyQ29udHJpYnV0b3IjZGlzYWJsZUdsb2JhbEVkaXRNZW51KCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIGRpc2FibGVHbG9iYWxFZGl0TWVudSgpIHsKLQkJCWNvbmZpZ1ZpZXdFZGl0QWN0aW9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBzZWUgTGlicmFyeUFjdGlvbkJhckNvbnRyaWJ1dG9yI2VuYWJsZUdsb2JhbEVkaXRNZW51KCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIGVuYWJsZUdsb2JhbEVkaXRNZW51KCkgewotCQkJY29uZmlnVmlld0VkaXRBY3Rpb24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJfQotCi0JCS8qKgotCQkgKiBAc2VlIExpYnJhcnlBY3Rpb25CYXJDb250cmlidXRvciNtZW51QWJvdXRUb1Nob3coSU1lbnVNYW5hZ2VyKQotCQkgKi8KLQkJcHVibGljIHZvaWQgbWVudUFib3V0VG9TaG93KElNZW51TWFuYWdlciBtZW51TWFuYWdlcikgewotCQkJLy8gQWRkIG91ciBzdGFuZGFyZCBtYXJrZXJzLgotCQkJbWVudU1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoImFkZGl0aW9ucyIpKTsgLy8kTk9OLU5MUy0xJAotCQkJbWVudU1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoImVkaXQiKSk7IC8vJE5PTi1OTFMtMSQKLQotCQkJLy8gQWRkIG91ciBvdGhlciBzdGFuZGFyZCBtYXJrZXIuCi0JCQltZW51TWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcigiYWRkaXRpb25zLWVuZCIpKTsgLy8kTk9OLU5MUy0xJAotCi0JCQlhZGRHbG9iYWxBY3Rpb25zKG1lbnVNYW5hZ2VyKTsKLQotCQkJbWVudU1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoKSk7Ci0JCQltZW51TWFuYWdlci5hZGQobmV3IEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0oY29uZmlnVmlld0VkaXRBY3Rpb24pKTsKLQkJCWlmIChQZXJzcGVjdGl2ZUxpc3RVdGlsLmlzQXV0aG9yaW5nUGVyc3BlY3RpdmUoKSkgewotCQkJCW1lbnVNYW5hZ2VyLmFkZChuZXcgQWN0aW9uQ29udHJpYnV0aW9uSXRlbSgKLQkJCQkJCWxpYnJhcnlWaWV3RmluZEVsZW1lbnRBY3Rpb24pKTsKLQkJCX0KLQkJfQotCi0JCS8qKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9ucy5MaWJyYXJ5QWN0aW9uQmFyQ29udHJpYnV0b3IjY3JlYXRlQ29weUFjdGlvbigpCi0JCSAqLwotCQlwcm90ZWN0ZWQgQ29weUFjdGlvbiBjcmVhdGVDb3B5QWN0aW9uKCkgewotCQkJcmV0dXJuIG5ldyBMaWJyYXJ5Vmlld0NvcHlBY3Rpb24oKSB7Ci0JCQkJQE92ZXJyaWRlCi0JCQkJcHVibGljIENvbW1hbmQgY3JlYXRlQ29tbWFuZChDb2xsZWN0aW9uIHNlbGVjdGlvbikgewotCQkJCQlyZXR1cm4gbmV3IElkZW50aXR5Q29tbWFuZChzZWxlY3Rpb24pOwotCQkJCX0KLQotCQkJCUBPdmVycmlkZQotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJU3RyaW5nIGxpbmtzID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gKChJZGVudGl0eUNvbW1hbmQpIGNvbW1hbmQpCi0JCQkJCQkJLmdldFJlc3VsdCgpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQkJT2JqZWN0IGl0ZW0gPSBUbmdVdGlsLnVud3JhcChpdGVyLm5leHQoKSk7Ci0JCQkJCQlpZiAoaXRlbSBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCQkJCQlNZXRob2RFbGVtZW50IGUgPSAoTWV0aG9kRWxlbWVudCkgaXRlbTsKLQkJCQkJCQlTdHJpbmcgaHJlZiA9IFJlc291cmNlSGVscGVyCi0JCQkJCQkJCQkuZ2V0VXJsKGUsIG51bGwsICJodG1sIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQlpZiAobGlua3MubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJCQkJCWxpbmtzICs9IFN0clV0aWwuTElORV9GRUVEOwotCQkJCQkJCX0KLQkJCQkJCQlsaW5rcyArPSBSZXNvdXJjZUhlbHBlci5nZXRFbGVtZW50TGluayhlLCB0cnVlLAotCQkJCQkJCQkJImZpbGU6Ly8iICsgaHJlZik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlpZiAobGlua3MubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJCQlDbGlwYm9hcmRVdGlsLmNvcHlUZXh0SFRNTFRvQ2xpcGJvYXJkKGxpbmtzKTsKLQkJCQkJfQotCQkJCX0KLQkJCX07Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFZpZXdlcihWaWV3ZXIgdmlld2VyKSB7Ci0JCQlyZWZyZXNoKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudmlld3MuQWJzdHJhY3RCYXNlVmlldyNjcmVhdGVBY3Rpb25CYXJDb250cmlidXRvcigpCi0JICovCi0JcHVibGljIElMaWJyYXJ5QWN0aW9uQmFyQ29udHJpYnV0b3IgY3JlYXRlQWN0aW9uQmFyQ29udHJpYnV0b3IoKSB7Ci0JCXJldHVybiBuZXcgQ29uZmlndXJhdGlvblZpZXdBY3Rpb25CYXJDb250cmlidXRvcihlZGl0aW5nRG9tYWluKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudmlld3MuQWJzdHJhY3RCYXNlVmlldyNzZXRJbnB1dEZvclZpZXdlcihPYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgc2V0SW5wdXRGb3JWaWV3ZXIoT2JqZWN0IG1vZGVsKSB7Ci0JCWlmICgobW9kZWwgPT0gbnVsbCkgfHwgKG1vZGVsIGluc3RhbmNlb2YgTWV0aG9kQ29uZmlndXJhdGlvbikpIHsKLQkJCXNldE1ldGhvZENvbmZpZ3VyYXRpb24oKE1ldGhvZENvbmZpZ3VyYXRpb24pIG1vZGVsKTsKLQkJfSBlbHNlIHsKLQkJCXJlc2V0KCk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVmcmVzaCgpIHsKLQkJaWYoY29uZmlnRmlsdGVyIGluc3RhbmNlb2YgQ29uZmlndXJhdGlvblZpZXdGaWx0ZXIpIHsKLQkJCSgoQ29uZmlndXJhdGlvblZpZXdGaWx0ZXIpY29uZmlnRmlsdGVyKS5yZWZyZXNoVmlld2VyKCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlnZXRWaWV3ZXIoKS5yZWZyZXNoKCk7Ci0JCX0KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldFZpZXdJZCgpIHsKLQkJcmV0dXJuIFZJRVdfSUQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS92aWV3cy9Db25maWd1cmF0aW9uVmlld0ZpbHRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS92aWV3cy9Db25maWd1cmF0aW9uVmlld0ZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMGM5YjgzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvdmlld3MvQ29uZmlndXJhdGlvblZpZXdGaWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS52aWV3czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb25GaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuc2VydmljZXMuU2FmZVVwZGF0ZUNvbnRyb2xsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotCi1wdWJsaWMgY2xhc3MgQ29uZmlndXJhdGlvblZpZXdGaWx0ZXIgZXh0ZW5kcyBDb25maWd1cmF0aW9uRmlsdGVyIHsKLQotCXByb3RlY3RlZCBWaWV3ZXIgdmlld2VyOwotCQotCXB1YmxpYyBDb25maWd1cmF0aW9uVmlld0ZpbHRlcihNZXRob2RDb25maWd1cmF0aW9uIG1ldGhvZENvbmZpZywgVmlld2VyIHZpZXdlcikgewotCQlzdXBlcihtZXRob2RDb25maWcpOwotCQl0aGlzLnZpZXdlciA9IHZpZXdlcjsKLQl9Ci0JCi0JcHJpdmF0ZSBib29sZWFuIGlzVmFsaWRWaWV3ZXIoKSB7Ci0JCXJldHVybiB2aWV3ZXIgIT0gbnVsbCAmJiAgdmlld2VyLmdldENvbnRyb2woKSAhPSBudWxsICYmICF2aWV3ZXIuZ2V0Q29udHJvbCgpLmlzRGlzcG9zZWQoKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChmaW5hbCBOb3RpZmljYXRpb24gbXNnKSB7Ci0vLwkJaWYgKHZpZXdlciA9PSBudWxsKSB7Ci0vLwkJCXJldHVybjsKLS8vCQl9Ci0JCWlmICghaXNWYWxpZFZpZXdlcigpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkKLQkJCi0JCVNhZmVVcGRhdGVDb250cm9sbGVyLnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlzd2l0Y2ggKG1zZy5nZXRFdmVudFR5cGUoKSkgewotCQkJCWNhc2UgTm90aWZpY2F0aW9uLkFERDoKLQkJCQljYXNlIE5vdGlmaWNhdGlvbi5BRERfTUFOWToKLQkJCQljYXNlIE5vdGlmaWNhdGlvbi5SRU1PVkU6Ci0JCQkJY2FzZSBOb3RpZmljYXRpb24uUkVNT1ZFX01BTlk6Ci0JCQkJCXJlZnJlc2hWaWV3ZXIoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwdWJsaWMgdm9pZCByZWZyZXNoVmlld2VyKCkgewotCQl2aWV3ZXIucmVmcmVzaCgpOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvdmlld3MvQ29uZmlndXJhdGlvblZpZXdlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS92aWV3cy9Db25maWd1cmF0aW9uVmlld2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiZjk4ZTQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS92aWV3cy9Db25maWd1cmF0aW9uVmlld2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnZpZXdzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2hlY2tib3hUcmVlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5XaWRnZXQ7Ci0KLS8qKgotICogRGlzcGxheXMgdGhlIHNlbGVjdGFibGUgcGx1Zy1pbnMgYW5kIHBhY2thZ2VzIG9mIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24gaW4gYQotICogdHJlZSB2aWV3ZXIuCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIENvbmZpZ3VyYXRpb25WaWV3ZXIgZXh0ZW5kcyBDaGVja2JveFRyZWVWaWV3ZXIgewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgQ29uZmlndXJhdGlvblZpZXdlcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgQ29uZmlndXJhdGlvblZpZXdlcihDb21wb3NpdGUgcGFyZW50LCBpbnQgc3R5bGUpIHsKLQkJc3VwZXIocGFyZW50LCBzdHlsZSk7Ci0JfQotCi0JLyoqCi0JICogU2VsZWN0cyB0aGUgZ2l2ZW4gZWxlbWVudCBpbiB0aGUgdHJlZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTZWxlY3Rpb24oT2JqZWN0IGVsZW1lbnQpIHsKLQkJc3VwZXIuZXhwYW5kVG9MZXZlbChlbGVtZW50LCAwKTsKLQkJV2lkZ2V0IGN0cmwgPSBzdXBlci5maW5kSXRlbShlbGVtZW50KTsKLQkJaWYgKGN0cmwgIT0gbnVsbCkgewotCQkJTGlzdCBpdGVtcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWl0ZW1zLmFkZChjdHJsKTsKLQkJCXN1cGVyLnNldFNlbGVjdGlvbihpdGVtcyk7Ci0JCQl0aGlzLmdldFRyZWUoKS5zZXRGb2N1cygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVmcmVzaGVzIHRoZSBjb250ZW50IG9mIHRoZSB2aWV3ZXIuCi0JICovCi0JcHVibGljIHZvaWQgcmVmcmVzaChmaW5hbCBPYmplY3QgZWxlbWVudCwgZmluYWwgYm9vbGVhbiB1cGRhdGVMYWJlbHMpIHsKLQkJT2JqZWN0W10gY2hlY2tlZCA9IHRoaXMuZ2V0Q2hlY2tlZEVsZW1lbnRzKCk7Ci0JCXN1cGVyLnJlZnJlc2goZWxlbWVudCwgdXBkYXRlTGFiZWxzKTsKLQkJdGhpcy5zZXRDaGVja2VkRWxlbWVudHMoY2hlY2tlZCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3ZpZXdzL0NvbnRlbnRWaWV3LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3ZpZXdzL0NvbnRlbnRWaWV3LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzODhhYjkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS92aWV3cy9Db250ZW50Vmlldy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTI0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudmlld3M7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi52aWV3ZXIuQWN0aXZpdHlEaWFncmFtU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJSW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkJyb3dzaW5nUGVyc3BlY3RpdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5VSUFjdGlvbkRpc3BhdGNoZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS51dGlsLlBlcnNwZWN0aXZlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS51aS5zZXJ2aWNlLkRpYWdyYW1JbWFnZVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuSUxpYnJhcnlNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LklMaWJyYXJ5U2VydmljZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmV2ZW50cy5JTGlicmFyeUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5FbGVtZW50TGF5b3V0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuSHRtbEJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkucHJlZmVyZW5jZXMuTGlicmFyeVVJUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5MaWJyYXJ5VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklUb29sQmFyTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYnJvd3Nlci5Ccm93c2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JQWN0aW9uQmFyczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JUGFydExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklQZXJzcGVjdGl2ZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVBlcnNwZWN0aXZlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVNoYXJlZEltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JVmlld1BhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LlZpZXdQYXJ0OwotCi0vKioKLSAqIFRoZSBDb250ZW50IHZpZXcuCi0gKiA8cD4KLSAqIERpc3BsYXlzIHRoZSBIVE1MIHJlcHJlc2VudGF0aW9uIG9mIGEgTWV0aG9kIGVsZW1lbnQuCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIENvbnRlbnRWaWV3IGV4dGVuZHMgVmlld1BhcnQgewotCi0JLyoqCi0JICogVGhlIHZpZXcgSUQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVklFV19JRCA9IENvbnRlbnRWaWV3LmNsYXNzLmdldE5hbWUoKTsKLQotCXByaXZhdGUgRWxlbWVudEhUTUxWaWV3ZXIgY29udGVudFZpZXdlcjsKLQotCXByaXZhdGUgT2JqZWN0IGRpc3BsYXllZEVsZW1lbnQ7Ci0KLQlwcml2YXRlIElQYXJ0TGlzdGVuZXIgcGFydExpc3RlbmVyID0gbmV3IElQYXJ0TGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHBhcnRBY3RpdmF0ZWQoSVdvcmtiZW5jaFBhcnQgcGFydCkgewotCQkJaWYgKHBhcnQgaW5zdGFuY2VvZiBDb250ZW50VmlldyAmJiBwYXJ0ID09IENvbnRlbnRWaWV3LnRoaXMpIHsKLQkJCQloYW5kbGVTZWxlY3Rpb24oVUlBY3Rpb25EaXNwYXRjaGVyLmdldEluc3RhbmNlKCkuZ2V0U2VsZWN0aW9uU291cmNlKCksIFVJQWN0aW9uRGlzcGF0Y2hlci5nZXRJbnN0YW5jZSgpCi0JCQkJICAgICAgICAuZ2V0U2VsZWN0aW9uKCkpOwotCQkJfQotCQl9Ci0KLQkJcHVibGljIHZvaWQgcGFydEJyb3VnaHRUb1RvcChJV29ya2JlbmNoUGFydCBwYXJ0KSB7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBwYXJ0Q2xvc2VkKElXb3JrYmVuY2hQYXJ0IHBhcnQpIHsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHBhcnREZWFjdGl2YXRlZChJV29ya2JlbmNoUGFydCBwYXJ0KSB7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBwYXJ0T3BlbmVkKElXb3JrYmVuY2hQYXJ0IHBhcnQpIHsKLQkJfQotCX07Ci0KLQlwcml2YXRlIElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgc2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXIgPSBuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCWhhbmRsZVNlbGVjdGlvbihldmVudC5nZXRTb3VyY2UoKSwgZXZlbnQuZ2V0U2VsZWN0aW9uKCkpOwotCQl9Ci0JfTsKLQotCXByaXZhdGUgSUxpYnJhcnlDaGFuZ2VMaXN0ZW5lciBsaWJyYXJ5Q2hhbmdlTGlzdGVuZXIgPSBuZXcgSUxpYnJhcnlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgbGlicmFyeUNoYW5nZWQoaW50IG9wdGlvbiwgQ29sbGVjdGlvbiBjaGFuZ2VkSXRlbXMpIHsKLS8vCQkJaWYgKG9wdGlvbiA9PSBJTGlicmFyeUNoYW5nZUxpc3RlbmVyLk9QVElPTl9MT0FERUQKLS8vCQkJCQl8fCBvcHRpb24gPT0gSUxpYnJhcnlDaGFuZ2VMaXN0ZW5lci5PUFRJT05fQ1JFQVRFRCkgewotLy8JCQkJaWYgKGNvbnRlbnRWaWV3ZXIgIT0gbnVsbCkgewotLy8JCQkJCWNvbnRlbnRWaWV3ZXIuc2V0SHRtbEJ1aWxkZXIobmV3IEh0bWxCdWlsZGVyKCkpOwotLy8JCQkJCWNvbnRlbnRWaWV3ZXIuZ2V0QnJvd3NlcigpLnJlZHJhdygpOwotLy8JCQkJfQotLy8JCQl9Ci0KLQkJCWlmIChjaGFuZ2VkSXRlbXMgIT0gbnVsbCAmJiBkaXNwbGF5ZWRFbGVtZW50ICE9IG51bGwpIHsKLQkJCQlpZiAoY2hhbmdlZEl0ZW1zLmNvbnRhaW5zKGRpc3BsYXllZEVsZW1lbnQpKSB7Ci0JCQkJCWRpc3BsYXllZEVsZW1lbnQgPSBudWxsOwotCQkJCX0KLQkJCX0KLQkJfQotCX07Ci0KLQlwcml2YXRlIElMaWJyYXJ5U2VydmljZUxpc3RlbmVyIGxpYlN2Y0xpc3RlbmVyID0gbmV3IElMaWJyYXJ5U2VydmljZUxpc3RlbmVyKCkgewotCi0JCXB1YmxpYyB2b2lkIGNvbmZpZ3VyYXRpb25TZXQoTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLQkJCWNvbnRlbnRWaWV3ZXIuZ2V0QnJvd3NlcigpLnNldFVybCgiYWJvdXQ6YmxhbmsiKTsgLy8kTk9OLU5MUy0xJAotCQkJZGlzcGxheWVkRWxlbWVudCA9IG51bGw7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBsaWJyYXJ5Q2xvc2VkKE1ldGhvZExpYnJhcnkgbGlicmFyeSkgewotCQl9Ci0KLQkJcHVibGljIHZvaWQgbGlicmFyeUNyZWF0ZWQoTWV0aG9kTGlicmFyeSBsaWJyYXJ5KSB7Ci0JCQljbGVhbnVwKCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBsaWJyYXJ5T3BlbmVkKE1ldGhvZExpYnJhcnkgbGlicmFyeSkgewotCQkJY2xlYW51cCgpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgbGlicmFyeVJlb3BlbmVkKE1ldGhvZExpYnJhcnkgbGlicmFyeSkgewotCQkJY2xlYW51cCgpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgbGlicmFyeVNldChNZXRob2RMaWJyYXJ5IGxpYnJhcnkpIHsKLQkJfQotCQkKLQkJcHJpdmF0ZSB2b2lkIGNsZWFudXAoKSB7Ci0JCQlpZiAoY29udGVudFZpZXdlciAhPSBudWxsKSB7Ci0JCQkJY29udGVudFZpZXdlci5zZXRIdG1sQnVpbGRlcihuZXcgSHRtbEJ1aWxkZXIoKSk7Ci0JCQkJY29udGVudFZpZXdlci5nZXRCcm93c2VyKCkucmVkcmF3KCk7Ci0JCQl9Ci0JCX0KLQl9OwotCQotCS8vIFBhZ2UgbmF2aWdhdGlvbiBhY3Rpb25zLgotCXByaXZhdGUgQWN0aW9uIGJhY2tBY3Rpb247Ci0KLQlwcml2YXRlIEFjdGlvbiBmb3J3YXJkQWN0aW9uOwotCi0JcHJpdmF0ZSBBY3Rpb24gc3RvcEFjdGlvbjsKLQotCXByaXZhdGUgQWN0aW9uIHJlZnJlc2hBY3Rpb247Ci0KLQlwcml2YXRlIEFjdGlvbiBwcmludEFjdGlvbjsKLQotCS8vIEEgaGlkZGVuIGNvbXBvc2l0ZSB0byBob2xkIHRoZSBkaWFncmFtIHZpZXdlciBmb3IgZGlhZ3JhbSBpbWFnZQotCS8vIGdlbmVyYXRpb24uCi0JcHJpdmF0ZSBDb21wb3NpdGUgZGlhZ3JhbVZpZXdlckhvbGRlcjsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIENvbnRlbnRWaWV3KCkgewotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGFydC5Xb3JrYmVuY2hQYXJ0I2NyZWF0ZVBhcnRDb250cm9sKENvbXBvc2l0ZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVQYXJ0Q29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXRyeSB7Ci0JCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCQlsYXlvdXQuaG9yaXpvbnRhbFNwYWNpbmcgPSAwOwotCQkJbGF5b3V0LnZlcnRpY2FsU3BhY2luZyA9IDA7Ci0JCQlwYXJlbnQuc2V0TGF5b3V0KGxheW91dCk7Ci0JCQlwYXJlbnQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0KLQkJCWNvbnRlbnRWaWV3ZXIgPSBuZXcgRWxlbWVudEhUTUxWaWV3ZXIocGFyZW50KTsKLQkJCWRpYWdyYW1WaWV3ZXJIb2xkZXIgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQkJZGlhZ3JhbVZpZXdlckhvbGRlci5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YSgxLCAxKSk7IC8vIHNpemUKLQkJCS8vIGNhbid0IGJlCi0JCQkvLyAwLDAKLQkJCS8vIG90aGVyd2lzZQotCQkJLy8gdGhlCi0JCQkvLyBkaWFncmFtCi0JCQkvLyB3aWxsIG5vdAotCQkJLy8gYmUKLQkJCS8vIHBhaW50ZWQKLQkJCWRpYWdyYW1WaWV3ZXJIb2xkZXIuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQkJZGlhZ3JhbVZpZXdlckhvbGRlci5zZXRWaXNpYmxlKGZhbHNlKTsKLQotCQkJLy8gQ3JlYXRlIHRoZSBwYWdlIG5hdmlnYXRpb24gdG9vbCBidXR0b25zLgotCQkJY3JlYXRlQWN0aW9ucygpOwotCi0JCQkvLyBBZGQgYSBwYXJ0IGxpc3RlbmVyIHRvIG1vbml0b3IgcGFydCBhY3RpdmF0aW9uIGFuZCB1cGRhdGUgdGhpcwotCQkJLy8gdmlldwotCQkJLy8gYXMgYW5kIHdoZW4gbmVlZGVkLgotCQkJZ2V0U2l0ZSgpLmdldFdvcmtiZW5jaFdpbmRvdygpLmdldFBhcnRTZXJ2aWNlKCkuYWRkUGFydExpc3RlbmVyKAotCQkJCQlwYXJ0TGlzdGVuZXIpOwotCi0JCQlnZXRTaXRlKCkuZ2V0V29ya2JlbmNoV2luZG93KCkuYWRkUGVyc3BlY3RpdmVMaXN0ZW5lcigKLQkJCQkJbmV3IElQZXJzcGVjdGl2ZUxpc3RlbmVyKCkgewotCQkJCQkJcHVibGljIHZvaWQgcGVyc3BlY3RpdmVBY3RpdmF0ZWQoSVdvcmtiZW5jaFBhZ2UgcGFnZSwKLQkJCQkJCQkJSVBlcnNwZWN0aXZlRGVzY3JpcHRvciBkZXNjKSB7Ci0JCQkJCQl9Ci0KLQkJCQkJCXB1YmxpYyB2b2lkIHBlcnNwZWN0aXZlQ2hhbmdlZChJV29ya2JlbmNoUGFnZSBwYWdlLAotCQkJCQkJCQlJUGVyc3BlY3RpdmVEZXNjcmlwdG9yIGRlc2MsIFN0cmluZyBpZCkgewotCQkJCQkJCWlmIChkZXNjLmdldElkKCkuZXF1YWxzKAotCQkJCQkJCQkJQnJvd3NpbmdQZXJzcGVjdGl2ZS5QRVJTUEVDVElWRV9JRCkpIHsKLQkJCQkJCQkJaWYgKGlkCi0JCQkJCQkJCQkJLmVxdWFscyhJV29ya2JlbmNoUGFnZS5DSEFOR0VfRURJVE9SX0FSRUFfU0hPVykpIHsKLQkJCQkJCQkJCXBhZ2Uuc2V0RWRpdG9yQXJlYVZpc2libGUoZmFsc2UpOwotCQkJCQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4KLQkJCQkJCQkJCQkJLmdldERlZmF1bHQoKQotCQkJCQkJCQkJCQkuZ2V0TXNnRGlhbG9nKCkKLQkJCQkJCQkJCQkJLmRpc3BsYXlXYXJuaW5nKAotCQkJCQkJCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLndhcm5pbmdEaWFsb2dfdGl0bGUsIAotCQkJCQkJCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLmFkZEVkaXRvclRvUGVyc3BlY3RpdmVXYXJuaW5nX21zZyk7IAotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9KTsKLQotCQkJLy8gQWRkIHNlbGVjdGlvbiBjaGFuZ2UgbGlzdGVuZXIgdG8gdXBkYXRlIHRoaXMgdmlldyBhcyBhbmQgd2hlbgotCQkJLy8gbmVlZGVkLgotCQkJVUlBY3Rpb25EaXNwYXRjaGVyLmdldEluc3RhbmNlKCkuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKAotCQkJCQlzZWxlY3Rpb25DaGFuZ2VMaXN0ZW5lcik7Ci0KLQkJCUxpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuYWRkTGlzdGVuZXIobGliU3ZjTGlzdGVuZXIpOwotCi0JCQlJTGlicmFyeU1hbmFnZXIgbWFuYWdlciA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudExpYnJhcnlNYW5hZ2VyKCk7Ci0JCQlpZiAobWFuYWdlciAhPSBudWxsKSB7Ci0JCQkJbWFuYWdlci5hZGRMaXN0ZW5lcihsaWJyYXJ5Q2hhbmdlTGlzdGVuZXIpOwotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLy8gVE9ETzogRGlzcGxheSBhbiBlcnJvciBkaWFsb2cuCi0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5wYXJ0LldvcmtiZW5jaFBhcnQjc2V0Rm9jdXMKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGb2N1cygpIHsKLQkJY29udGVudFZpZXdlci5zZXRGb2N1cygpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGFydC5Xb3JrYmVuY2hQYXJ0I2Rpc3Bvc2UKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLnJlbW92ZUxpc3RlbmVyKGxpYlN2Y0xpc3RlbmVyKTsKLQotCQlJTGlicmFyeU1hbmFnZXIgbWFuYWdlciA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudExpYnJhcnlNYW5hZ2VyKCk7Ci0JCWlmIChtYW5hZ2VyICE9IG51bGwpIHsKLQkJCW1hbmFnZXIucmVtb3ZlTGlzdGVuZXIobGlicmFyeUNoYW5nZUxpc3RlbmVyKTsKLQkJfQotCQlVSUFjdGlvbkRpc3BhdGNoZXIuZ2V0SW5zdGFuY2UoKS5yZW1vdmVTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoCi0JCQkJc2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXIpOwotCQlnZXRTaXRlKCkuZ2V0V29ya2JlbmNoV2luZG93KCkuZ2V0UGFydFNlcnZpY2UoKS5yZW1vdmVQYXJ0TGlzdGVuZXIoCi0JCQkJcGFydExpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBhY3Rpb25zIGZvciB0aGlzIHZpZXcuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQWN0aW9ucygpIHsKLQkJYmFja0FjdGlvbiA9IG5ldyBBY3Rpb24oKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJQnJvd3NlciBicm93c2VyID0gY29udGVudFZpZXdlci5nZXRCcm93c2VyKCk7Ci0JCQkJaWYgKGJyb3dzZXIgIT0gbnVsbCkgewotCQkJCQlicm93c2VyLmJhY2soKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JCWJhY2tBY3Rpb24uc2V0VGV4dChBdXRob3JpbmdVSVJlc291cmNlcy5iYWNrX3RleHQpOyAKLQkJYmFja0FjdGlvbi5zZXRUb29sVGlwVGV4dChBdXRob3JpbmdVSVJlc291cmNlcy5iYWNrX3RleHQpOyAKLQkJYmFja0FjdGlvbi5zZXRJbWFnZURlc2NyaXB0b3IoUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKQotCQkJCS5nZXRTaGFyZWRJbWFnZXMoKS5nZXRJbWFnZURlc2NyaXB0b3IoCi0JCQkJCQlJU2hhcmVkSW1hZ2VzLklNR19UT09MX0JBQ0spKTsKLQotCQlmb3J3YXJkQWN0aW9uID0gbmV3IEFjdGlvbigpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlCcm93c2VyIGJyb3dzZXIgPSBjb250ZW50Vmlld2VyLmdldEJyb3dzZXIoKTsKLQkJCQlpZiAoYnJvd3NlciAhPSBudWxsKSB7Ci0JCQkJCWJyb3dzZXIuZm9yd2FyZCgpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQkJZm9yd2FyZEFjdGlvbi5zZXRUZXh0KEF1dGhvcmluZ1VJUmVzb3VyY2VzLmZvcndhcmRfdGV4dCk7IAotCQlmb3J3YXJkQWN0aW9uLnNldFRvb2xUaXBUZXh0KEF1dGhvcmluZ1VJUmVzb3VyY2VzLmZvcndhcmRfdGV4dCk7IAotCQlmb3J3YXJkQWN0aW9uLnNldEltYWdlRGVzY3JpcHRvcihQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpCi0JCQkJLmdldFNoYXJlZEltYWdlcygpLmdldEltYWdlRGVzY3JpcHRvcigKLQkJCQkJCUlTaGFyZWRJbWFnZXMuSU1HX1RPT0xfRk9SV0FSRCkpOwotCi0JCXN0b3BBY3Rpb24gPSBuZXcgQWN0aW9uKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCUJyb3dzZXIgYnJvd3NlciA9IGNvbnRlbnRWaWV3ZXIuZ2V0QnJvd3NlcigpOwotCQkJCWlmIChicm93c2VyICE9IG51bGwpIHsKLQkJCQkJYnJvd3Nlci5zdG9wKCk7Ci0JCQkJfQotCQkJfQotCQl9OwotCQlzdG9wQWN0aW9uLnNldFRleHQoQXV0aG9yaW5nVUlSZXNvdXJjZXMuc3RvcF90ZXh0KTsgCi0JCXN0b3BBY3Rpb24uc2V0VG9vbFRpcFRleHQoQXV0aG9yaW5nVUlSZXNvdXJjZXMuc3RvcF90ZXh0KTsgCi0JCXN0b3BBY3Rpb24uc2V0SW1hZ2VEZXNjcmlwdG9yKEF1dGhvcmluZ1VJSW1hZ2VzLklNR19ERVNDX1NUT1ApOwotCi0JCXJlZnJlc2hBY3Rpb24gPSBuZXcgQWN0aW9uKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCS8vIEJyb3dzZXIgYnJvd3NlciA9IGNvbnRlbnRWaWV3ZXIuZ2V0QnJvd3NlcigpOwotCQkJCS8vIGlmIChicm93c2VyICE9IG51bGwpIHsKLQkJCQkvLyBicm93c2VyLnJlZnJlc2goKTsKLQkJCQkvLyB9Ci0KLQkJCQkvLyBuZWVkIHRvIHJlZ2VuZXJhdGUgdGhlIGNvbnRlbnQKLQkJCQljb250ZW50Vmlld2VyLnJlZnJlc2goKTsKLQkJCX0KLQkJfTsKLQkJcmVmcmVzaEFjdGlvbi5zZXRUZXh0KEF1dGhvcmluZ1VJUmVzb3VyY2VzLnJlZnJlc2hfdGV4dCk7IAotCQlyZWZyZXNoQWN0aW9uLnNldFRvb2xUaXBUZXh0KEF1dGhvcmluZ1VJUmVzb3VyY2VzLnJlZnJlc2hfdGV4dCk7IAotCQlyZWZyZXNoQWN0aW9uLnNldEltYWdlRGVzY3JpcHRvcihBdXRob3JpbmdVSUltYWdlcy5JTUdfREVTQ19SRUZSRVNIKTsKLQotCQlwcmludEFjdGlvbiA9IG5ldyBBY3Rpb24oKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJY29udGVudFZpZXdlci5wcmludCgpOwotCQkJfQotCQl9OwotCQlwcmludEFjdGlvbi5zZXRUZXh0KEF1dGhvcmluZ1VJUmVzb3VyY2VzLnByaW50X3RleHQpOyAKLQkJcHJpbnRBY3Rpb24uc2V0VG9vbFRpcFRleHQoQXV0aG9yaW5nVUlSZXNvdXJjZXMucHJpbnRfdGV4dCk7IAotCQlwcmludEFjdGlvbi5zZXRJbWFnZURlc2NyaXB0b3IoQXV0aG9yaW5nVUlJbWFnZXMuSU1HX0RFU0NfUFJJTlQpOwotCi0JCUlBY3Rpb25CYXJzIGJhcnMgPSBnZXRWaWV3U2l0ZSgpLmdldEFjdGlvbkJhcnMoKTsKLQkJSVRvb2xCYXJNYW5hZ2VyIG1hbmFnZXIgPSBiYXJzLmdldFRvb2xCYXJNYW5hZ2VyKCk7Ci0JCW1hbmFnZXIuYWRkKGJhY2tBY3Rpb24pOwotCQltYW5hZ2VyLmFkZChmb3J3YXJkQWN0aW9uKTsKLQkJbWFuYWdlci5hZGQoc3RvcEFjdGlvbik7Ci0JCW1hbmFnZXIuYWRkKHJlZnJlc2hBY3Rpb24pOwotCQltYW5hZ2VyLmFkZChwcmludEFjdGlvbik7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNWaWV3VmlzaWJsZSgpIHsKLQkJSVdvcmtiZW5jaFBhZ2UgYWN0aXZlUGFnZSA9IGdldFNpdGUoKS5nZXRXb3JrYmVuY2hXaW5kb3coKQotCQkuZ2V0QWN0aXZlUGFnZSgpOwotCQlpZiAoYWN0aXZlUGFnZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJCi0JCUlWaWV3UGFydCB2aWV3ID0gYWN0aXZlUGFnZS5maW5kVmlldyhnZXRWaWV3SWQoKSk7Ci0JCWlmICh2aWV3ID09IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQkKLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCS8qKgotCSAqIEhhbmRsZXMgdGhlIGdpdmVuIHNlbGVjdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gc291cmNlCi0JICogICAgICAgICAgICBUaGUgTGlicmFyeSBvciBDb25maWd1cmF0aW9uIHZpZXcuCi0JICogQHBhcmFtIHNlbGVjdGlvbgotCSAqICAgICAgICAgICAgVGhlIHNlbGVjdGlvbiBpbiB0aGUgTGlicmFyeSBvciBDb25maWd1cmF0aW9uIHZpZXcuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlU2VsZWN0aW9uKE9iamVjdCBzb3VyY2UsIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCWlmIChzZWxlY3Rpb24gPT0gbnVsbCB8fCAhaXNWaWV3VmlzaWJsZSgpICkgewotCQkJcmV0dXJuOwotCQl9Ci0JCi0JCWlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgewotCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb247Ci0JCQlPYmplY3RbXSBzZWxlY3RlZEVsZW1lbnRzID0gc2VsLnRvQXJyYXkoKTsKLQkJCWlmIChzZWxlY3RlZEVsZW1lbnRzICE9IG51bGwgJiYgc2VsZWN0ZWRFbGVtZW50cy5sZW5ndGggPiAwKSB7Ci0JCQkJT2JqZWN0IGVsZW1lbnQgPSBzZWxlY3RlZEVsZW1lbnRzWzBdOwotCQkJCQotCQkJCS8vIGRvbid0IHVud3JhcCB0aGUgb2JqZWN0LiAKLQkJCQkvLyBGb3IgYWN0aXZpdHksIHdlIG5lZWQgdG8gd3JhcHBlZCBpdGVtIHByb3ZpZGVyIHRvIGdldCB0aGUgc3VwcHJlc3Mgc3RhdHVzLgotCQkJCS8vIE9iamVjdCBlbGVtZW50ID0gTGlicmFyeVV0aWwudW53cmFwKHNlbGVjdGVkRWxlbWVudCk7Ci0JCQkJaWYgKGRpc3BsYXllZEVsZW1lbnQgIT0gbnVsbCAmJiBkaXNwbGF5ZWRFbGVtZW50ID09IGVsZW1lbnQpIHsKLQkJCQkJZGlzcGxheWVkRWxlbWVudCA9IG51bGw7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJaWYgKGRpc3BsYXlDb250ZW50UGFnZShzb3VyY2UsIGVsZW1lbnQpKSB7Ci0JCQkJCWRpc3BsYXllZEVsZW1lbnQgPSBlbGVtZW50OwotCQkJCX0KLQkJCX1lbHNlewotCQkJCWNvbnRlbnRWaWV3ZXIuZ2V0QnJvd3NlcigpLnNldFVybCgiYWJvdXQ6YmxhbmsiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWRpc3BsYXllZEVsZW1lbnQgPSBudWxsOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNDb25maWdTb3VyY2UoT2JqZWN0IHNvdXJjZSkgewotCQlyZXR1cm4gKHNvdXJjZSAhPSBudWxsKSAmJiAoc291cmNlIGluc3RhbmNlb2YgQ29uZmlndXJhdGlvblZpZXcpOwotCX0KLQkKLQlwcm90ZWN0ZWQgRWxlbWVudExheW91dE1hbmFnZXIgZ2V0TGF5b3V0TWdyKCkgewotCQlyZXR1cm4gCUxpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLQkJCS5nZXRDdXJyZW50Q29uZmlndXJhdGlvbk1hbmFnZXIoKS5nZXRFbGVtZW50TGF5b3V0TWFuYWdlcigpOwotCX0KLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFZpZXdJZCgpIHsKLQkJcmV0dXJuIFZJRVdfSUQ7Ci0JfQotCQotCS8qKgotCSAqIERpc3BsYXlzIHRoZSBjb250ZW50IHBhZ2UgZm9yIHRoZSBnaXZlbiBDb250ZW50RWxlbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gc291cmNlCi0JICogICAgICAgICAgICBUaGUgTGlicmFyeSBvciBDb25maWd1cmF0aW9uIHZpZXcuCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiAgICAgICAgICAgIFRoZSBzZWxlY3RlZCBNZXRob2QgZWxlbWVudC4KLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBjb250ZW50IHBhZ2UgaXMgZGlzcGxheWVkCi0JICogICAgICAgICBzdWNjZXNzZnVsbHkuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gZGlzcGxheUNvbnRlbnRQYWdlKE9iamVjdCBzb3VyY2UsIE9iamVjdCByYXdfZWxlbWVudCkgewotCQlPYmplY3QgZWxlbWVudCA9IExpYnJhcnlVdGlsLnVud3JhcChyYXdfZWxlbWVudCk7Ci0JCWVsZW1lbnQgPSBWaWV3SGVscGVyLmhhbmRsZURhbmdsaW5nKGVsZW1lbnQpOwotCQlpZiAoZWxlbWVudCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlFbGVtZW50TGF5b3V0TWFuYWdlciBsYXlvdXRNZ3IgPSBudWxsOwotCQlib29sZWFuIGlzQnJvd3NpbmcgPSBQZXJzcGVjdGl2ZVV0aWwKLQkJCQkuaXNBY3RpdmVQZXJzcGVjdGl2ZShCcm93c2luZ1BlcnNwZWN0aXZlLlBFUlNQRUNUSVZFX0lEKTsKLQkJYm9vbGVhbiBpc0NvbmZpZ1NvdXJjZSA9IGlzQ29uZmlnU291cmNlKHNvdXJjZSk7Ci0KLQkJLy8gaWYgaW4gYnJvd3NpbmcgYnV0IHRoZSBzb3VyY2UgaXMgbm90IGZyb20gY29uZmlncnVhdGlvbiB2aWV3Ci0JCS8vIGlnbm9yZSBpdAotCQlpZiAoaXNCcm93c2luZyAmJiAhaXNDb25maWdTb3VyY2UpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCWlmIChpc0NvbmZpZ1NvdXJjZSkgewotCQkJLy8gR2V0IHRoZSBFbGVtZW50IExheW91dCBNYW5hZ2VyIGZvciB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uLgotCQkJbGF5b3V0TWdyID0gZ2V0TGF5b3V0TWdyKCk7Ci0JCQlpZiAoIGxheW91dE1nciA9PSBudWxsICkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCQotCQkJLy8gQWRkIHRoZSBhY3Rpdml0eSBkaWFncmFtIHNlcnZpY2UgdG8gZ2VuZXJhdGUgZGlhZ3JhbSBpbWFnZXMuCi0JCQkKLQkJCVN0cmluZyBuZXdEaWFncmFtcyA9IEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKS5nZXRTdHJpbmcoIlBVQkxJU0hfTkVXX0RJQUdSQU0iKTsgLy8kTk9OLU5MUy0xJAotCQkJQm9vbGVhbiBuZXdEaWFncmFtID0gbmV3IEJvb2xlYW4odHJ1ZSk7Ci0JCQlpZihuZXdEaWFncmFtcyAhPSBudWxsICYmIG5ld0RpYWdyYW1zLmxlbmd0aCgpID4gMCl7Ci0JCQkJbmV3RGlhZ3JhbSA9IG5ldyBCb29sZWFuKG5ld0RpYWdyYW1zKTsKLQkJCX0KLQkJCWlmKG5ld0RpYWdyYW0uYm9vbGVhblZhbHVlKCkpewotCQkJCURpYWdyYW1JbWFnZVNlcnZpY2UgZGlhZ3JhbVNlcnZpY2UgPSAoRGlhZ3JhbUltYWdlU2VydmljZSkgbGF5b3V0TWdyCi0JCQkJCS5nZXRBY3Rpdml0eURpYWdyYW1TZXJ2aWNlKCk7Ci0JCQkJaWYgKGRpYWdyYW1TZXJ2aWNlID09IG51bGwpIHsKLQkJCQkJZGlhZ3JhbVNlcnZpY2UgPSBuZXcgRGlhZ3JhbUltYWdlU2VydmljZSgKLQkJCQkJCWRpYWdyYW1WaWV3ZXJIb2xkZXIsCi0JCQkJCQluZXcgRmlsZShsYXlvdXRNZ3IuZ2V0UHVibGlzaERpcigpKSk7Ci0JCQkJCWRpYWdyYW1TZXJ2aWNlLnNldENvbmZpZyhsYXlvdXRNZ3IuZ2V0Q29uZmlndXJhdGlvbigpKTsKLQkJCQkJbGF5b3V0TWdyLnNldEFjdGl2aXR5RGlhZ3JhbVNlcnZpY2UoZGlhZ3JhbVNlcnZpY2UpOwotCQkJCX0KLS8vCQkJCSBGb3IgQWN0aXZpdHkgRGV0YWlsIERpYWdyYW0gCi0JCQkJYm9vbGVhbiBvcHRpb24gPSBMaWJyYXJ5VUlQcmVmZXJlbmNlcy5nZXRQdWJsaXNoVW5vcGVuQWN0aXZpdHlkZCgpOwotCQkJCWRpYWdyYW1TZXJ2aWNlLnNldFB1Ymxpc2hlZFVuQ3JlYXRlZEFERChvcHRpb24pOwotCQkJCQotCQkJCS8vIEZvciBBY3Rpdml0eSBEaWFncmFtIAotCQkJCW9wdGlvbiA9IExpYnJhcnlVSVByZWZlcmVuY2VzLmdldFB1Ymxpc2hBREZvckFjdGl2aXR5RXh0ZW5zaW9uKCk7Ci0JCQkJZGlhZ3JhbVNlcnZpY2Uuc2V0UHVibGlzaEFERm9yQWN0aXZpdHlFeHRlbnNpb24ob3B0aW9uKTsKLQkJCX1lbHNlewotLy8JCQkJIEFkZCB0aGUgYWN0aXZpdHkgZGlhZ3JhbSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGRpYWdyYW0gaW1hZ2VzLgotCQkJCUFjdGl2aXR5RGlhZ3JhbVNlcnZpY2UgZGlhZ3JhbVNlcnZpY2UgPSAoQWN0aXZpdHlEaWFncmFtU2VydmljZSkgbGF5b3V0TWdyCi0JCQkJCQkuZ2V0QWN0aXZpdHlEaWFncmFtU2VydmljZSgpOwotCQkJCWlmIChkaWFncmFtU2VydmljZSA9PSBudWxsKSB7Ci0JCQkJCWRpYWdyYW1TZXJ2aWNlID0gbmV3IEFjdGl2aXR5RGlhZ3JhbVNlcnZpY2UoCi0JCQkJCQkJZGlhZ3JhbVZpZXdlckhvbGRlciwKLQkJCQkJCQluZXcgRmlsZShsYXlvdXRNZ3IuZ2V0UHVibGlzaERpcigpKSk7Ci0JCQkJCWxheW91dE1nci5zZXRBY3Rpdml0eURpYWdyYW1TZXJ2aWNlKGRpYWdyYW1TZXJ2aWNlKTsKLQkJCQl9Ci0JCQkJCi0JCQkJLy8gRm9yIEFjdGl2aXR5IERldGFpbCBEaWFncmFtIAotCQkJCWJvb2xlYW4gb3B0aW9uID0gTGlicmFyeVVJUHJlZmVyZW5jZXMuZ2V0UHVibGlzaFVub3BlbkFjdGl2aXR5ZGQoKTsKLQkJCQlkaWFncmFtU2VydmljZS5zZXRQdWJsaXNoZWRVbkNyZWF0ZWRBREQob3B0aW9uKTsKLQkJCQkKLQkJCQkvLyBGb3IgQWN0aXZpdHkgRGlhZ3JhbSAKLQkJCQlvcHRpb24gPSBMaWJyYXJ5VUlQcmVmZXJlbmNlcy5nZXRQdWJsaXNoQURGb3JBY3Rpdml0eUV4dGVuc2lvbigpOwotCQkJCWRpYWdyYW1TZXJ2aWNlLnNldFB1Ymxpc2hBREZvckFjdGl2aXR5RXh0ZW5zaW9uKG9wdGlvbik7Ci0JCQl9Ci0JCQkKLQkJCQotCQkJCi0JCX0KLQotCQljb250ZW50Vmlld2VyLnNldExheW91dE1hbmFnZXIobGF5b3V0TWdyKTsKLQkJY29udGVudFZpZXdlci5zaG93RWxlbWVudENvbnRlbnQocmF3X2VsZW1lbnQpOwotCi0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIERpc3BsYXlzIHRoZSBIVE1MIGNvbnRlbnQgcGFnZSBmb3IgYSBNZXRob2QgZWxlbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqICAgICAgICAgICAgQSBNZXRob2QgZWxlbWVudC4KLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBIVE1MIGNvbnRlbnQgcGFnZSBpcyBkaXNwbGF5ZWQKLQkgKiAgICAgICAgIHN1Y2Nlc3NmdWxseS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBkaXNwbGF5SFRNTENvbnRlbnRQYWdlKE9iamVjdCBlbGVtZW50KSB7Ci0JCWVsZW1lbnQgPSBMaWJyYXJ5VXRpbC51bndyYXAoZWxlbWVudCk7Ci0JCWVsZW1lbnQgPSBWaWV3SGVscGVyLmhhbmRsZURhbmdsaW5nKGVsZW1lbnQpOwotCQlpZiAoZWxlbWVudCAhPSBudWxsKSB7Ci0JCQljb250ZW50Vmlld2VyLnNldExheW91dE1hbmFnZXIobnVsbCk7Ci0JCQljb250ZW50Vmlld2VyLnNob3dFbGVtZW50Q29udGVudChlbGVtZW50KTsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvdmlld3MvRWxlbWVudEhUTUxWaWV3ZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvdmlld3MvRWxlbWVudEhUTUxWaWV3ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODA0YjU0ZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3ZpZXdzL0VsZW1lbnRIVE1MVmlld2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NDIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS52aWV3czsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMRGVjb2RlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5Ccm93c2luZ0xheW91dFNldHRpbmdzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5FbGVtZW50TGF5b3V0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuSHRtbEJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5SZXNvdXJjZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5icm93c2VyLkJyb3dzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmJyb3dzZXIuTG9jYXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5icm93c2VyLkxvY2F0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmJyb3dzZXIuT3BlbldpbmRvd0xpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5icm93c2VyLlN0YXR1c1RleHRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYnJvd3Nlci5TdGF0dXNUZXh0TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmJyb3dzZXIuV2luZG93RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkN1cnNvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLQotCi0vKioKLSAqIERpc3BsYXlzIHRoZSBIVE1MIHJlcHJlc2VudGF0aW9uIG9mIGEgTWV0aG9kIGVsZW1lbnQgaW4gYSBTV1QgQnJvd3Nlci4KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRWxlbWVudEhUTUxWaWV3ZXIgewotCi0vLwkvLyBUaGUgZGVmYXVsdCBIVE1MIHdyYXBwZXJzIGZvciBkaXNhYmxpbmcgdGhlICJEaXNwbGF5IFRyZWUgQnJvd3NlciIgbGluawotLy8JLy8gaW4gdGhlIEhUTUwgY29udGVudCBwYWdlcy4KLS8vCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0NPTlRFTlRfV1JBUFBFUl9TVEFSVCA9ICI8aHRtbD48aGVhZD4gPG1ldGEgaHR0cC1lcXVpdj1cIkNvbnRlbnQtVHlwZVwiIGNvbnRlbnQ9XCJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLThcIj48L2hlYWQ+PHRpdGxlPlJhdGlvbmFsIFVuZmllZCBQcm9jZXNzPC90aXRsZT4iIC8vJE5PTi1OTFMtMSQKLS8vCQkJKyAiPHNjcmlwdCBsYW5ndWFnZT1cImphdmFzY3JpcHRcIj5mdW5jdGlvbiBpbml0KCkgeyBwYXJlbnQub3J5X3RvYz1cImRpc2FibGVcIjsgcGFyZW50LmNvbnRlbnRmcmFtZS5sb2NhdGlvbj1cIiI7IC8vJE5PTi1OTFMtMSQKLS8vCi0vLwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9DT05URU5UX1dSQVBQRVJfRU5EID0gIlwiOyB9PC9zY3JpcHQ+PC9oZWFkPiIgLy8kTk9OLU5MUy0xJAotLy8JCQkrICI8ZnJhbWVzZXQgcm93cz1cIjEwMCUsKlwiIGZyYW1lYm9yZGVyPVwibm9cIiBib3JkZXI9XCIwXCIgZnJhbWVzcGFjaW5nPVwiMFwiIGlkPVwiY29udGVudGZyYW1lc2V0XCIgbmFtZT1cImNvbnRlbnRmcmFtZXNldFwiPiIgLy8kTk9OLU5MUy0xJAotLy8JCQkrICI8ZnJhbWUgc3JjPVwiYWJvdXQ6YmxhbmtcIiBpZD1cImNvbnRlbnRmcmFtZVwiIG5hbWU9XCJjb250ZW50ZnJhbWVcIiBzY3JvbGxpbmc9XCJhdXRvXCIvPiIgLy8kTk9OLU5MUy0xJAotLy8JCQkrICI8ZnJhbWUgc3JjPVwiYWJvdXQ6YmxhbmtcIiBpZD1cImJsYW5rZnJhbWVcIiBuYW1lPVwiYmxhbmtmcmFtZVwiIG9ubG9hZD1cImluaXQoKVwiLz4iIC8vJE5PTi1OTFMtMSQKLS8vCQkJKyAiPC9mcmFtZXNldD48L2h0bWw+IjsgLy8kTk9OLU5MUy0xJAotCi0vLwkvLyBUaGUgZGVmYXVsdCBIVE1MIHdyYXBwZXJzIGZvciBwcmludGluZyB0aGUgcHJvY2VzcyBjb250ZW50IHBhZ2VzLgotLy8JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfUFJJTlRfV1JBUFBFUl9TVEFSVCA9IERFRkFVTFRfQ09OVEVOVF9XUkFQUEVSX1NUQVJUCi0vLwkJCSsgInByaW50KCk7IjsgLy8kTk9OLU5MUy0xJAotLy8KLS8vCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX1BSSU5UX1dSQVBQRVJfRU5EID0gREVGQVVMVF9DT05URU5UX1dSQVBQRVJfRU5EOwotLy8KLS8vCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUklOVF9GSUxFID0gInByaW50Lmh0bWwiOyAvLyROT04tTkxTLTEkCi0KLQkvLyBUaGUgSFRNTCB3cmFwcGVycyBmb3IgZGlzYWJsaW5nIHRoZSAiRGlzcGxheSBUcmVlIEJyb3dzZXIiIGxpbmsgaW4gdGhlCi0JLy8gSFRNTCBjb250ZW50IHBhZ2VzLgotLy8JcHJpdmF0ZSBTdHJpbmcgY29udGVudFdyYXBwZXJTYXJ0OwotLy8KLS8vCXByaXZhdGUgU3RyaW5nIGNvbnRlbnRXcmFwcGVyRW5kOwotCi0vLwkvLyBUaGUgSFRNTCB3cmFwcGVycyBmb3IgcHJpbnRpbmcgdGhlIEhUTUwgY29udGVudCBwYWdlcy4KLS8vCXByaXZhdGUgU3RyaW5nIHByaW50V3JhcHBlclNhcnQ7Ci0vLwotLy8JcHJpdmF0ZSBTdHJpbmcgcHJpbnRXcmFwcGVyRW5kOwotLy8KLS8vCS8vIFRoZSBidWlsdC1pbiBicm93c2VyIGZvciBwcmludGluZyB0aGUgSFRNTCBwYWdlcy4KLS8vCS8vIGRvbid0IHVzZSBhIHNlY29uZCAKLS8vCXByaXZhdGUgQnJvd3NlciBwcmludEJyb3dzZXI7Ci0KLQlwcm90ZWN0ZWQgQnJvd3NlciBicm93c2VyID0gbnVsbDsKLQotCXByb3RlY3RlZCBDb21wb3NpdGUgcGFyZW50OwotCi0JcHJpdmF0ZSBTdHJpbmcgY3VycmVudExvY2F0aW9uID0gbnVsbDsKLQotCS8vIHNhdmUgdGhlIGN1cnJlbnQgdGV4dCBmcm9tIHRoZSBzdGF0dXMgbGlzdGVuZXIKLQkvLyB3ZSBuZWVkIHRoaXMgdG8gb3BlbiBicm93c2VyIHdpdGggdGhpcyB1cmwgCi0JLy8gc2luY2UgdW5kZXIgbGludXggYnJvd3NlciBjYW4ndCBiZSBvcGVuZWQgYXV0b21hdGljYWxseSwgd2hpY2ggaXMgcmVhbGx5IGJhZAotCXByaXZhdGUgU3RyaW5nIGN1cnJlbnRUZXh0ID0gbnVsbDsKLQlwcml2YXRlIEh0bWxCdWlsZGVyIGh0bWxCdWlsZGVyOwotCi0JcHJpdmF0ZSBDdXJzb3Igd2FpdEN1cnNvciA9IG51bGw7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBFbGVtZW50SFRNTFZpZXdlcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXRoaXMucGFyZW50ID0gcGFyZW50OwotCQlodG1sQnVpbGRlciA9IG5ldyBIdG1sQnVpbGRlcigpOwotCQljcmVhdGVDb250cm9sKCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgU1dUIGJyb3dzZXIgY29udHJvbHMgZm9yIHZpZXdpbmcgYW5kIHByaW50aW5nIHRoZSBIVE1MCi0JICogY29udGVudCBwYWdlcy4KLQkgKi8KLQlwcml2YXRlIHZvaWQgY3JlYXRlQ29udHJvbCgpIHsKLQkJdHJ5IHsKLQkJCWJyb3dzZXIgPSBuZXcgQnJvd3NlcihwYXJlbnQsIFNXVC5OT05FKTsKLQkJCWJyb3dzZXIuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIfEdyaWREYXRhLkdSQUJfVkVSVElDQUwpKTsKLQkJCWJyb3dzZXIuYWRkTG9jYXRpb25MaXN0ZW5lcihuZXcgTG9jYXRpb25BZGFwdGVyKCkgewotCQkJCXB1YmxpYyB2b2lkIGNoYW5nZWQoTG9jYXRpb25FdmVudCBlKSB7Ci0JCQkJCS8vU3lzdGVtLm91dC5wcmludGxuKCJsb2NhdGlvbiBjaGFuZ2VkIik7Ci0JCQkJfQotCi0JCQkJcHVibGljIHZvaWQgY2hhbmdpbmcoTG9jYXRpb25FdmVudCBlKSB7Ci0JCQkJCS8vU3lzdGVtLm91dC5wcmludGxuKCJsb2NhdGlvbiBjaGFuZ2luZy4uLiIpOwotCQkJCQkvLyBHZXQgdGhlIGN1cnJlbnQgbG9jYXRpb24uCi0JCQkJCVN0cmluZyBsb2NhdGlvbiA9IGdldEVsZW1lbnRVcmwoZS5sb2NhdGlvbik7Ci0JCQkJCWlmICggbG9jYXRpb24gPT0gbnVsbCB8fCBsb2NhdGlvbi5zdGFydHNXaXRoKFJlc291cmNlSGVscGVyLlVSTF9TVFJfSkFWQVNDUklQVCkpCi0JCQkJCXsKLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCQlpZiAoaXNMb2NhdGlvbkNoYW5nZWQobG9jYXRpb24pKSB7Ci0JCQkJCQkvLyBTYXZlIHRoZSBjdXJyZW50IGxvY2F0aW9uIGZvciBwcmludGluZyBwdXJwb3Nlcy4KLQkJCQkJCWN1cnJlbnRMb2NhdGlvbiA9IGxvY2F0aW9uOwotCQkJCQkJZ2VuZXJhdGVIdG1sKGN1cnJlbnRMb2NhdGlvbik7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9KTsKLQotCQkJYnJvd3Nlci5hZGRTdGF0dXNUZXh0TGlzdGVuZXIobmV3IFN0YXR1c1RleHRMaXN0ZW5lcigpCi0JCQl7Ci0JCQkJcHVibGljIHZvaWQgY2hhbmdlZChTdGF0dXNUZXh0RXZlbnQgZXZlbnQpCi0JCQkJewotCQkJCQkvLyBHZXQgdGhlIGN1cnJlbnQgdGV4dC4KLQkJCQkJU3RyaW5nIHRleHQgPSBldmVudC50ZXh0OwotCQkJCQlpZiAodGV4dCAhPSBudWxsICYmIHRleHQubGVuZ3RoKCkgPiAwKQotCQkJCQl7Ci0JCQkJCQkvLyBTYXZlIHRoZSBjdXJyZW50IHRleHQgZm9yIGFwcGxpY2F0aW9uIGxhdW5jaGluZyBwdXJwb3Nlcy4KLQkJCQkJCWN1cnJlbnRUZXh0ID0gdGV4dDsKLQkJCQkJCS8vU3lzdGVtLm91dC5wcmludGxuKCJTdGF0dXMgY2hhbmdlZDogIiArIHRleHQpOwotCQkJCQl9Ci0JCQkJfQotCQkJfSk7Ci0JCQkKLQkJCWJyb3dzZXIuYWRkT3BlbldpbmRvd0xpc3RlbmVyKG5ldyBPcGVuV2luZG93TGlzdGVuZXIoKXsKLQotCQkJCXB1YmxpYyB2b2lkIG9wZW4oV2luZG93RXZlbnQgZXZlbnQpIHsKLQkJCQkJLy8gaGFuZGxlIG9wZW4gd2luZG93LgotCQkJCQkvLyB3aXRoIG1vemlsbGEgaW4gbGludXgsIG9wZW4gd2luZG93IGRvZXMgbm90IHdvcmsKLQkJCQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oIk9wZW4gd2luZG93IGV2ZW50OiAiICsgZXZlbnQpOwotCQkJCQkKLQkJCQkJLy8gd2luZG93cyBjYW4gbGF1bmNoIHRoZSBicm93c2VyIHdpdGhvdXQgcHJvYmxlbQotCQkJCQkvLyBsaW51eCBuZWVkcyBtb3JlIGNhcmUKLQkJCQkJaWYgKFNXVC5nZXRQbGF0Zm9ybSgpLmVxdWFscygid2luMzIiKSkgLy8kTk9OLU5MUy0xJAotCQkJCQl7Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCX0KLQkJCQkJCi0JCQkJCURpc3BsYXkuZ2V0Q3VycmVudCgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKQotCQkJCQl7Ci0JCQkJCSAgICBwdWJsaWMgdm9pZCBydW4oKQotCQkJCQkJewotCQkJCQkJCXRyeQotCQkJCQkJCXsKLS8vCQkJCQkJCQkvLyBpZiB0aGUgdXJsIGlzIGEgcmVzb3VyY2Ugd2l0aCByZWxhdGl2ZSBwYXRoLCBmaW5kIHRoZSBhYnNvbHV0ZSBwYXRoCi0vLwkJCQkJCQkJaWYgKCBjdXJyZW50VGV4dC5zdGFydHNXaXRoKCJmaWxlOiIpICkKLS8vCQkJCQkJCQl7Ci0vLwkJCQkJCQkJCS8vIGdldCB0aGUgZmlsZSBwYXRoIGZyb20gdGhlIAotLy8JCQkJCQkJCX0KLQkJCQkJCQkJCQkJCQkJCQkKLS8vCQkJCQkJCQkvLyBvcGVuIGFub3RoZXIgc3d0IGJyb3dzZXIgc2luY2Ugd2UgaGF2ZSBubyAoc2ltcGxlKSB3YXkgb2YgY3JlYXRpbmcgYSBzeXN0ZW0gZGVmYXVsdCBicm93c2VyCi0vLwkJCQkJCQkJLy8gdGhlIEVjbGlwc2UgZ3V5cyBoaWRlIGFsbCB0aGUgZ29vZCBhcGlzIGFzIGludGVybmFsCi0JCQkJCQkJCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKCk7Ci0JCQkJCQkJCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJCQkJCQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCQkJCQkJCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCQkJCQkJCXNoZWxsLnNldExheW91dChsYXlvdXQpOwotCQkJCQkJCQlCcm93c2VyIHBvcHVwX2Jyb3dzZXIgPSBuZXcgQnJvd3NlcihzaGVsbCwgU1dULk5PTkUpOwotCQkJCQkJCQlwb3B1cF9icm93c2VyLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USHxHcmlkRGF0YS5HUkFCX0hPUklaT05UQUx8R3JpZERhdGEuR1JBQl9WRVJUSUNBTCkpOwotCQkJCQkJCQlwb3B1cF9icm93c2VyLnNldFVybChjdXJyZW50VGV4dCk7Ci0JCQkJCQkJCQkJCQkJCQkJCi0JCQkJCQkJCXNoZWxsLm9wZW4oKTsKLQotCQkJCQkJCX0KLQkJCQkJCQljYXRjaCAoRXhjZXB0aW9uIGUpCi0JCQkJCQkJewotCQkJCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfSk7Ci0JCQkJfX0pOwotCQkJCi0vLwkJCS8vIGRvbid0IHVzZSBhIHNlcGVyYXRlIGJyb3dzZXIgZm9yIHByaW50aW5nIHNpbmNlIHRoaXMgd2lsbCBsb3NlIHRoZSAKLS8vCQkJLy8gc3RhdGVzIG9mIHRoZSBjdXJyZW50IHBhZ2UsIGZvciBleGFtcGxlLCB0aGUgZXhwYW5kZWQgc2VjdGlvbnMsIGV0Yy4KLS8vCQkJLy8gSmluaHVhIFhpLCAgMy81LzIwMDcKLS8vCQkJLy8gQ3JlYXRlIHRoZSBoaWRkZW4gYnJvd3NlciB1c2VkIGZvciBwcmludGluZyB0aGUgSFRNTCBjb250ZW50Ci0vLwkJCS8vIHBhZ2VzLgotLy8JCQlwcmludEJyb3dzZXIgPSBuZXcgQnJvd3NlcihwYXJlbnQsIFNXVC5OT05FKTsKLS8vCQkJcHJpbnRCcm93c2VyLnNldFNpemUoMSwgMSk7Ci0vLwkJCXByaW50QnJvd3Nlci5zZXRWaXNpYmxlKGZhbHNlKTsKLS8vCi0vLwkJCS8vIExpbnV4OiBUaGVyZSBpcyB1bnVzZWQgc3BhY2UgaW4gcHJldmlldy9icm93c2luZywgd2hpY2ggaXMgaW4gZ3JleS4KLS8vCQkJLy8gdGhpcyBpcyBuZWVkZWQgZm9yIGxpbnV4Ci0vLwkJCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKCk7Ci0vLwkJCWdkLmhlaWdodEhpbnQgPSAxOwotLy8JCQlwcmludEJyb3dzZXIuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCQkKLQkJCQotCQkJLy8gUmVhZCB0aGUgSFRNTCB3cmFwcGVycyBmb3IgZGlzYWJsaW5nIHRoZSAiRGlzcGxheSBUcmVlIEJyb3dzZXIiCi0JCQkvLyBsaW5rIGluIHRoZSBIVE1MIGNvbnRlbnQgcGFnZXMuCi0vLwkJCWNvbnRlbnRXcmFwcGVyU2FydCA9IEhUTUxXcmFwcGVycwotLy8JCQkJCS5nZXRTdHJpbmcoIkNPTlRFTlRfV1JBUFBFUl9TVEFSVCIpOyAvLyROT04tTkxTLTEkCi0vLwkJCWlmIChjb250ZW50V3JhcHBlclNhcnQgPT0gbnVsbCkgewotLy8JCQkJY29udGVudFdyYXBwZXJTYXJ0ID0gREVGQVVMVF9DT05URU5UX1dSQVBQRVJfU1RBUlQ7Ci0vLwkJCX0KLS8vCQkJY29udGVudFdyYXBwZXJFbmQgPSBIVE1MV3JhcHBlcnMuZ2V0U3RyaW5nKCJDT05URU5UX1dSQVBQRVJfRU5EIik7IC8vJE5PTi1OTFMtMSQKLS8vCQkJaWYgKGNvbnRlbnRXcmFwcGVyRW5kID09IG51bGwpIHsKLS8vCQkJCWNvbnRlbnRXcmFwcGVyRW5kID0gREVGQVVMVF9DT05URU5UX1dSQVBQRVJfU1RBUlQ7Ci0vLwkJCX0KLQotLy8JCQkvLyBSZWFkIHRoZSBIVE1MIHdyYXBwZXJzIGZvciBwcmludGluZyB0aGUgSFRNTCBjb250ZW50IHBhZ2VzLgotLy8JCQlwcmludFdyYXBwZXJTYXJ0ID0gSFRNTFdyYXBwZXJzLmdldFN0cmluZygiUFJJTlRfV1JBUFBFUl9TVEFSVCIpOyAvLyROT04tTkxTLTEkCi0vLwkJCWlmIChwcmludFdyYXBwZXJTYXJ0ID09IG51bGwpIHsKLS8vCQkJCXByaW50V3JhcHBlclNhcnQgPSBERUZBVUxUX1BSSU5UX1dSQVBQRVJfU1RBUlQ7Ci0vLwkJCX0KLS8vCQkJcHJpbnRXcmFwcGVyRW5kID0gSFRNTFdyYXBwZXJzLmdldFN0cmluZygiUFJJTlRfV1JBUFBFUl9FTkQiKTsgLy8kTk9OLU5MUy0xJAotLy8JCQlpZiAocHJpbnRXcmFwcGVyRW5kID09IG51bGwpIHsKLS8vCQkJCXByaW50V3JhcHBlckVuZCA9IERFRkFVTFRfUFJJTlRfV1JBUFBFUl9FTkQ7Ci0vLwkJCX0KLQotCQkJd2FpdEN1cnNvciA9IHBhcmVudC5nZXRTaGVsbCgpLmdldERpc3BsYXkoKS5nZXRTeXN0ZW1DdXJzb3IoCi0JCQkJCVNXVC5DVVJTT1JfV0FJVCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlicm93c2VyID0gbnVsbDsKLQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJfQotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc0xvY2F0aW9uQ2hhbmdlZChTdHJpbmcgbG9jYXRpb24pIHsKLQkJaWYgKGxvY2F0aW9uID09IG51bGwgfHwgY3VycmVudExvY2F0aW9uID09IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCWlmIChGaWxlLnNlcGFyYXRvckNoYXIgIT0gJy8nKSB7Ci0JCQlsb2NhdGlvbiA9IGxvY2F0aW9uLnJlcGxhY2UoRmlsZS5zZXBhcmF0b3JDaGFyLCAnLycpOwotCQkJU3RyaW5nIG9sZExvY2F0aW9uID0gZ2V0VXJsKGN1cnJlbnRMb2NhdGlvbik7Ci0KLQkJCS8vIFNvbWUgdGltZXMgdGhlIGN1cnJlbnQgVVJMIGlzIGEgZnVsbCBwYXRoLCBzbyBqdXN0IGNvbXBhcmUgdGhlIGVuZC4KLQkJCQotCQkJLy8gIGJ1ZyBpbiBJRTYsIHRoZSBsb2NhdGlvbiBpbiB0aGUgbG9jYXRpb24gY2hhbmdlIGV2ZW50IG1pZ2h0IGJlIHRydW5jYXRlZCBpZiB0aGUgdXJsIGlzIHRvbyBsb25nLCAKLQkJCS8vIGNvdWxkIGJlIHVwIHRvIDE1OSBjaGFyYWN0ZXJzLgotCQkJCi0JCQlyZXR1cm4gb2xkTG9jYXRpb24uaW5kZXhPZihsb2NhdGlvbikgIT0gMDsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiAhbG9jYXRpb24uZW5kc1dpdGgoY3VycmVudExvY2F0aW9uKQotCQkJCQkmJiAhY3VycmVudExvY2F0aW9uLmVuZHNXaXRoKGxvY2F0aW9uKTsKLQkJfQotCi0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgU1dUIGJyb3dzZXIgdGhhdCBkaXNwbGF5cyB0aGUgSFRNTCBjb250ZW50IHBhZ2VzLgotCSAqLwotCXB1YmxpYyBCcm93c2VyIGdldEJyb3dzZXIoKSB7Ci0JCXJldHVybiBicm93c2VyOwotCX0KLQotCS8qKgotCSAqIFNldHMgZm9jdXMgdG8gdGhpcyBjb250cm9sLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZvY3VzKCkgewotCQlpZiAoYnJvd3NlciAhPSBudWxsKSB7Ci0JCQlicm93c2VyLnNldEZvY3VzKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBIVE1MIEJ1aWxkZXIuCi0JICovCi0JcHVibGljIEh0bWxCdWlsZGVyIGdldEh0bWxCdWlsZGVyKCkgewotCQkKLQkJaWYgKCBodG1sQnVpbGRlciAhPSBudWxsICkgewotCQkJQnJvd3NpbmdMYXlvdXRTZXR0aW5ncy5JTlNUQU5DRS51cGRhdGUoaHRtbEJ1aWxkZXIpOwotCQl9Ci0JCXJldHVybiBodG1sQnVpbGRlcjsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBIVE1MIEJ1aWxkZXIuCi0JICovCi0JcHVibGljIHZvaWQgc2V0SHRtbEJ1aWxkZXIoSHRtbEJ1aWxkZXIgYnVpbGRlcikgewotCQl0aGlzLmh0bWxCdWlsZGVyID0gYnVpbGRlcjsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBFbGVtZW50IExheW91dCBNYW5hZ2VyLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldExheW91dE1hbmFnZXIoRWxlbWVudExheW91dE1hbmFnZXIgbGF5b3V0TWdyKSB7Ci0JCWh0bWxCdWlsZGVyLnNldExheW91dE1hbmFnZXIobGF5b3V0TWdyKTsKLQl9Ci0KLQotCQotCS8qKgotCSAqIERpc3BsYXlzIHRoZSBIVE1MIHJlcHJlc2VudGF0aW9uIGZvciBhIE1ldGhvZCBlbGVtZW50LgotCSAqLwotCXB1YmxpYyB2b2lkIHNob3dFbGVtZW50Q29udGVudChPYmplY3QgcmF3X2VsZW1lbnQpIHsKLQotCQlzdGFydFdhaXQoKTsKLQotCQl0cnkgewotCQkJU3RyaW5nIGZpbGVfdXJsID0gZ2VuZXJhdGVIdG1sKHJhd19lbGVtZW50LCBnZXRIdG1sQnVpbGRlcigpKTsKLQkJCi0JCQkvLyBTZXQgdGhlIGN1cnJlbnQgbG9jYXRpb24gdG8gYXZvaWQgcmUtZ2VuZXJhdGluZyB0aGUgSFRNTCBmaWxlIGluCi0JCQkvLyByZXNwb25kIHRvIGEgbG9jYXRpb24gY2hhbmdlLgotCQkJY3VycmVudExvY2F0aW9uID0gZmlsZV91cmw7Ci0JCQlicm93c2VyLnNldFVybChmaWxlX3VybCk7Ci0JCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQl9Ci0KLQkJZW5kV2FpdCgpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdlbmVyYXRlSHRtbChPYmplY3QgcmF3X2VsZW1lbnQsIEh0bWxCdWlsZGVyIGh0bWxCdWlsZGVyKSB7Ci0JCXJldHVybiBDb25maWd1cmF0aW9uSGVscGVyLmdldERlbGVnYXRlKCkuZ2VuZXJhdGVIdG1sKHJhd19lbGVtZW50LCBodG1sQnVpbGRlcik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGdlbmVyYXRlSHRtbChTdHJpbmcgdXJsKSB7Ci0JCXN0YXJ0V2FpdCgpOwotCQl0cnkgewotCQkJZ2V0SHRtbEJ1aWxkZXIoKS5nZW5lcmF0ZUh0bWwodXJsKTsKLQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCX0KLQotCQllbmRXYWl0KCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZWxlbWVudCBVUkwuCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0RWxlbWVudFVybChTdHJpbmcgbG9jYXRpb24pIHsKLQkJaWYgKGxvY2F0aW9uID09IG51bGwgfHwgbG9jYXRpb24ubGVuZ3RoKCkgPT0gMAotCQkJCXx8IGxvY2F0aW9uLmVxdWFscygiYWJvdXQ6YmxhbmsiKSAgLy8kTk9OLU5MUy0xJAotCQkJCXx8IGxvY2F0aW9uLnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aChSZXNvdXJjZUhlbHBlci5VUkxfU1RSX0pBVkFTQ1JJUFQpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCWxvY2F0aW9uID0gZ2V0VXJsKGxvY2F0aW9uKTsKLQkJaWYgKGxvY2F0aW9uLmluZGV4T2YoUmVzb3VyY2VIZWxwZXIuTUlTU0lOR19QQUdFU19GT0xERVIpID49IDApIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJLy8gbWFrZSBzdXJlIHRoZSB1cmwgaXMgYW4gZWxlbWVudCB1cmwsIGNoZWNrIHRoZSBndWlkCi0JCWlmICggUmVzb3VyY2VIZWxwZXIuZ2V0R3VpZEZyb21GaWxlTmFtZShsb2NhdGlvbikgPT0gbnVsbCApCi0JCXsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiBsb2NhdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBVUkwgZm9yIHRoZSBnaXZlbiBsb2NhdGlvbi4KLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXRVcmwoU3RyaW5nIGxvY2F0aW9uKSB7Ci0JCVN0cmluZyBwdWJsaXNoX2RpciA9IGdldEh0bWxCdWlsZGVyKCkuZ2V0UHVibGlzaERpcigpOwotCQlTdHJpbmcgdXJsID0gZml4UGF0aChsb2NhdGlvbik7Ci0JCWludCBpbmRleCA9IHVybC50b0xvd2VyQ2FzZSgpLmluZGV4T2YoCi0JCQkJZml4UGF0aChwdWJsaXNoX2RpcikudG9Mb3dlckNhc2UoKSk7Ci0JCWlmIChpbmRleCA+PSAwKSB7Ci0JCQl1cmwgPSB1cmwuc3Vic3RyaW5nKGluZGV4ICsgcHVibGlzaF9kaXIubGVuZ3RoKCkpOwotCQl9Ci0JCWluZGV4ID0gdXJsLmluZGV4T2YoIiMiKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAoaW5kZXggPiAwKSB7Ci0JCQl1cmwgPSB1cmwuc3Vic3RyaW5nKDAsIGluZGV4KTsKLQkJfQotCQlyZXR1cm4gdXJsOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGZpeFBhdGgoU3RyaW5nIHBhdGgpIHsKLQkJdHJ5IHsKLQkJCVN0cmluZyBwbGF0Zm9ybSA9IFNXVC5nZXRQbGF0Zm9ybSgpOwotCQkJaWYgKCJ3aW4zMiIuZXF1YWxzKHBsYXRmb3JtKSB8fCAid3BmIi5lcXVhbHMocGxhdGZvcm0pKSB7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJLy8gb3JnLmVjbGlwc2Uuc3d0LmJyb3dzZXIuSUUKLQkJCQlwYXRoID0gVVJMRGVjb2Rlci5kZWNvZGUocGF0aCwgIklTTy04ODU5LTEiKTsgLy8kTk9OLU5MUy0xJAotCQkJfSBlbHNlIHsKLQkJCQkvLyBvcmcuZWNsaXBzZS5zd3QuYnJvd3Nlci5Nb3ppbGxhCi0JCQkJcGF0aCA9IFVSTERlY29kZXIuZGVjb2RlKHBhdGgsICJVVEYtOCIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlpZiAoRmlsZS5zZXBhcmF0b3JDaGFyICE9ICcvJykgewotCQkJCXJldHVybiBwYXRoLnJlcGxhY2UoRmlsZS5zZXBhcmF0b3JDaGFyLCAnLycpOwotCQkJfQotCQkJcmV0dXJuIHBhdGg7Ci0JCX0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBQcmludHMgdGhlIGN1cnJlbnQgSFRNTCBwYWdlLgotCSAqLwotCXB1YmxpYyB2b2lkIHByaW50KCkgewotCQlib29sZWFuIGIgPSB0aGlzLmJyb3dzZXIuZXhlY3V0ZSgid2luZG93LnByaW50KCk7Iik7IC8vJE5PTi1OTFMtMSQKLS8vCQlpZiAoICFiICkgewotLy8JCQlmaW5hbCBTdHJpbmcgcHJpbnRGaWxlID0gaHRtbEJ1aWxkZXIuZ2V0UHVibGlzaERpcigpICsgUFJJTlRfRklMRTsKLS8vCQkJaWYgKGN1cnJlbnRMb2NhdGlvbiAhPSBudWxsKSB7Ci0vLwkJCQlTdHJpbmdCdWZmZXIgd3JhcHBlckhUTUwgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0vLwkJCQl3cmFwcGVySFRNTC5hcHBlbmQocHJpbnRXcmFwcGVyU2FydCkuYXBwZW5kKGN1cnJlbnRMb2NhdGlvbikKLS8vCQkJCQkJLmFwcGVuZChwcmludFdyYXBwZXJFbmQpOwotLy8JCQkJU3RyaW5nIGh0bWxUZXh0ID0gd3JhcHBlckhUTUwudG9TdHJpbmcoKTsKLS8vCQkJCWlmIChGaWxlVXRpbC53cml0ZVVURjhGaWxlKHByaW50RmlsZSwgaHRtbFRleHQpKSB7Ci0vLwkJCQkJcHJpbnRCcm93c2VyLnNldFVybChwcmludEZpbGUpOwotLy8JCQkJfQotLy8JCQl9Ci0vLwkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBzdGFydFdhaXQoKSB7Ci0JCXBhcmVudC5nZXRTaGVsbCgpLnNldEN1cnNvcih3YWl0Q3Vyc29yKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZW5kV2FpdCgpIHsKLQkJcGFyZW50LmdldFNoZWxsKCkuc2V0Q3Vyc29yKG51bGwpOwotCX0KLQotCS8qKgotCSAqIFJlZnJlc2hlcyB0aGUgY29udGVudC4KLQkgKiA8cD4KLQkgKiBSZWdlbmVyYXRlcyB0aGUgY29udGVudCBiZWZvcmUgcmVmcmVzaGluZyB0aGUgYnJvd3Nlci4KLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWZyZXNoKCkgewotCQlnZW5lcmF0ZUh0bWwoY3VycmVudExvY2F0aW9uKTsKLQkJYnJvd3Nlci5yZWZyZXNoKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3ZpZXdzL0VsZW1lbnRzVmlld0NvbnRleHRIZWxwLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3ZpZXdzL0VsZW1lbnRzVmlld0NvbnRleHRIZWxwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhYjIwNTkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS92aWV3cy9FbGVtZW50c1ZpZXdDb250ZXh0SGVscC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudmlld3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJSGVscENvbnRleHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuTGlicmFyeVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkN1c3RvbUNhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGlzY2lwbGluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpc2NpcGxpbmVHcm91cGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkd1aWRhbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlU2V0R3JvdXBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVG9vbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3RUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotCi0vKioKLSAqIAotICogQ29udGV4dCBIZWxwIGZvciBlbGVtZW50Ci0gKiAKLSAqIEBhdXRob3IgQmluZ1h1ZSBYdQotICogQHNpbmNlIDEuMAotICoKLSAqLwotcHVibGljIGNsYXNzIEVsZW1lbnRzVmlld0NvbnRleHRIZWxwIHsKLQotCS8qKgotCSAqIFNldHMgdGhlIGhlbHAgb2YgdGhlIGdpdmVuIHNlbGVjdGlvbgotCSAqIEBwYXJhbSBzZWxlY3Rpb24KLQkgKiBAcGFyYW0gdWlDb21wb3NpdGUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0SGVscChJU2VsZWN0aW9uIHNlbGVjdGlvbiwgQ29tcG9zaXRlIHVpQ29tcG9zaXRlKSB7Ci0JCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGVkID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb247Ci0JCS8vIGlmIG11bHRpcGxlIGl0ZW1zIHNlbGVjdGVkLCBvbmx5IHRoZSBmaXJzdCBpdGVtJ3MgY29udGV4dCBoZWxwIHdpbGwKLQkJLy8gYmUgZGlzcGxheWVkCi0JCU9iamVjdCBvYmogPSBzZWxlY3RlZC5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCIkJCQgU2V0dGluZyBoZWxwIGZvciB0aGUgc2VsZWN0aW9uIG9iaiA9ICIgKwotCQkvLyBvYmopOwotCQlzZXRIZWxwKG9iaiwgdWlDb21wb3NpdGUpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGhlbHAgb2YgdGhlIG9iamVjdAotCSAqIEBwYXJhbSBvYmoKLQkgKiBAcGFyYW0gdWlDb21wb3NpdGUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0SGVscChPYmplY3Qgb2JqLCBDb21wb3NpdGUgdWlDb21wb3NpdGUpIHsKLQkJaWYgKG9iaiA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCW9iaiA9IExpYnJhcnlVdGlsLnVud3JhcChvYmopOwotCi0JCWlmICgob2JqIGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luKSkgewotCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscCh1aUNvbXBvc2l0ZSwKLQkJCQkJQXV0aG9yaW5nVUlIZWxwQ29udGV4dHMuTElCUkFSWV9WSUVXX05PREVfQ09OVEVYVF9OT1RfSU1QTEVNRU5URUQpOwotCQkJcmV0dXJuOwotCQl9Ci0JCWlmICgob2JqIGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UpKSB7Ci0JCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHVpQ29tcG9zaXRlLAotCQkJCQlBdXRob3JpbmdVSUhlbHBDb250ZXh0cy5MSUJSQVJZX1ZJRVdfTk9ERV9DT05URVhUX05PVF9JTVBMRU1FTlRFRCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKChvYmogaW5zdGFuY2VvZiBSb2xlKSkgewotCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscCh1aUNvbXBvc2l0ZSwKLQkJCQkJQXV0aG9yaW5nVUlIZWxwQ29udGV4dHMuTElCUkFSWV9WSUVXX05PREVfQ09OVEVYVF9OT1RfSU1QTEVNRU5URUQpOwotCQkJcmV0dXJuOwotCQl9Ci0JCWlmICgob2JqIGluc3RhbmNlb2YgVGFzaykpIHsKLQkJCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAodWlDb21wb3NpdGUsCi0JCQkJCUF1dGhvcmluZ1VJSGVscENvbnRleHRzLkxJQlJBUllfVklFV19OT0RFX0NPTlRFWFRfTk9UX0lNUExFTUVOVEVEKTsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAoKG9iaiBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0KSkgewotCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscCh1aUNvbXBvc2l0ZSwKLQkJCQkJQXV0aG9yaW5nVUlIZWxwQ29udGV4dHMuTElCUkFSWV9WSUVXX05PREVfQ09OVEVYVF9OT1RfSU1QTEVNRU5URUQpOwotCQkJcmV0dXJuOwotCQl9Ci0JCWlmICgob2JqIGluc3RhbmNlb2YgR3VpZGFuY2UpKSB7Ci0JCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHVpQ29tcG9zaXRlLAotCQkJCQlBdXRob3JpbmdVSUhlbHBDb250ZXh0cy5MSUJSQVJZX1ZJRVdfTk9ERV9DT05URVhUX05PVF9JTVBMRU1FTlRFRCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKChvYmogaW5zdGFuY2VvZiBEaXNjaXBsaW5lKSkgewotCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscCh1aUNvbXBvc2l0ZSwKLQkJCQkJQXV0aG9yaW5nVUlIZWxwQ29udGV4dHMuTElCUkFSWV9WSUVXX05PREVfQ09OVEVYVF9OT1RfSU1QTEVNRU5URUQpOwotCQkJcmV0dXJuOwotCQl9Ci0JCWlmICgob2JqIGluc3RhbmNlb2YgRGlzY2lwbGluZUdyb3VwaW5nKSkgewotCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscCgKLQkJCQkJdWlDb21wb3NpdGUsCi0JCQkJCUF1dGhvcmluZ1VJSGVscENvbnRleHRzLkxJQlJBUllfVklFV19OT0RFX0NPTlRFWFRfTk9UX0lNUExFTUVOVEVEKTsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAoKG9iaiBpbnN0YW5jZW9mIERvbWFpbikpIHsKLQkJCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAodWlDb21wb3NpdGUsCi0JCQkJCUF1dGhvcmluZ1VJSGVscENvbnRleHRzLkxJQlJBUllfVklFV19OT0RFX0NPTlRFWFRfTk9UX0lNUExFTUVOVEVEKTsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAoKG9iaiBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0VHlwZSkpIHsKLQkJCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAodWlDb21wb3NpdGUsCi0JCQkJCUF1dGhvcmluZ1VJSGVscENvbnRleHRzLkxJQlJBUllfVklFV19OT0RFX0NPTlRFWFRfTk9UX0lNUExFTUVOVEVEKTsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAoKG9iaiBpbnN0YW5jZW9mIFJvbGVTZXQpKSB7Ci0JCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHVpQ29tcG9zaXRlLAotCQkJCQlBdXRob3JpbmdVSUhlbHBDb250ZXh0cy5MSUJSQVJZX1ZJRVdfTk9ERV9DT05URVhUX05PVF9JTVBMRU1FTlRFRCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKChvYmogaW5zdGFuY2VvZiBUb29sKSkgewotCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscCh1aUNvbXBvc2l0ZSwKLQkJCQkJQXV0aG9yaW5nVUlIZWxwQ29udGV4dHMuTElCUkFSWV9WSUVXX05PREVfQ09OVEVYVF9OT1RfSU1QTEVNRU5URUQpOwotCQkJcmV0dXJuOwotCQl9Ci0JCWlmICgob2JqIGluc3RhbmNlb2YgUm9sZVNldEdyb3VwaW5nKSkgewotCQkJUGxhdGZvcm1VSQotCQkJCQkuZ2V0V29ya2JlbmNoKCkKLQkJCQkJLmdldEhlbHBTeXN0ZW0oKQotCQkJCQkuc2V0SGVscCgKLQkJCQkJCQl1aUNvbXBvc2l0ZSwKLQkJCQkJCQlBdXRob3JpbmdVSUhlbHBDb250ZXh0cy5MSUJSQVJZX1ZJRVdfTk9ERV9DT05URVhUX05PVF9JTVBMRU1FTlRFRCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlpZiAob2JqIGluc3RhbmNlb2YgQ3VzdG9tQ2F0ZWdvcnkpIHsKLQkJCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAodWlDb21wb3NpdGUsCi0JCQkJCUF1dGhvcmluZ1VJSGVscENvbnRleHRzLkxJQlJBUllfVklFV19OT0RFX0NPTlRFWFRfTk9UX0lNUExFTUVOVEVEKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCWlmIChvYmogaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50KSB7Ci0JCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHVpQ29tcG9zaXRlLAotCQkJCQlBdXRob3JpbmdVSUhlbHBDb250ZXh0cy5MSUJSQVJZX1ZJRVdfTk9ERV9DT05URVhUX05PVF9JTVBMRU1FTlRFRCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlpZiAob2JqIGluc3RhbmNlb2YgUHJvY2VzcykgewotCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscCh1aUNvbXBvc2l0ZSwKLQkJCQkJQXV0aG9yaW5nVUlIZWxwQ29udGV4dHMuTElCUkFSWV9WSUVXX05PREVfQ09OVEVYVF9OT1RfSU1QTEVNRU5URUQpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJaWYgKG9iaiBpbnN0YW5jZW9mIE1ldGhvZENvbmZpZ3VyYXRpb24pIHsKLQkJCVBsYXRmb3JtVUkKLQkJCQkJLmdldFdvcmtiZW5jaCgpCi0JCQkJCS5nZXRIZWxwU3lzdGVtKCkKLQkJCQkJLnNldEhlbHAoCi0JCQkJCQkJdWlDb21wb3NpdGUsCi0JCQkJCQkJQXV0aG9yaW5nVUlIZWxwQ29udGV4dHMuTElCUkFSWV9WSUVXX05PREVfQ09OVEVYVF9OT1RfSU1QTEVNRU5URUQpOwotCQkJcmV0dXJuOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS92aWV3cy9IVE1MV3JhcHBlcnMuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvdmlld3MvSFRNTFdyYXBwZXJzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzMmM5OWQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS92aWV3cy9IVE1MV3JhcHBlcnMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudmlld3M7Ci0KLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLWltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLQotLyoqCi0gKiBUaGUgcmVzb3VyY2UgYnVuZGxlIGZvciB0aGUgSFRNTCB3cmFwcGVycy4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBIVE1MV3JhcHBlcnMgewotCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgUmVzb3VyY2VCdW5kbGUgUkVTT1VSQ0VfQlVORExFID0gUmVzb3VyY2VCdW5kbGUKLQkJCS5nZXRCdW5kbGUoSFRNTFdyYXBwZXJzLmNsYXNzLmdldE5hbWUoKSk7Ci0KLQkvKioKLQkgKiBEZWZhdWx0IHByaXZhdGUgY29uc3RydWN0b3IgdG8gcHJldmVudCB0aGlzIGNsYXNzIGZvcm0gYmVpbmcKLQkgKiBpbnN0YW50aWF0ZWQuCi0JICovCi0JcHJpdmF0ZSBIVE1MV3JhcHBlcnMoKSB7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbG9jYWxpemVkIHN0cmluZyBnaXZlbiB0aGUgcmVzb3VyY2Uga2V5LgotCSAqIAotCSAqIEBwYXJhbSBrZXkKLQkgKiAgICAgICAgICAgIFRoZSByZXNvdXJjZSBrZXkuCi0JICogQHJldHVybiBUaGUgbG9jYWxpemVkIHN0cmluZy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIGtleSkgewotCQl0cnkgewotCQkJcmV0dXJuIFJFU09VUkNFX0JVTkRMRS5nZXRTdHJpbmcoa2V5KTsKLQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbG9jYWxpemVkIGZvcm1hdHRlZCBtZXNzYWdlIGZvciB0aGUgZ2l2ZW4gcmVzb3VyY2Uga2V5LgotCSAqIAotCSAqIEBwYXJhbSBrZXkKLQkgKiAgICAgICAgICAgIFRoZSByZXNvdXJjZSBrZXkuCi0JICogQHBhcmFtIGFyZ3MKLQkgKiAgICAgICAgICAgIFRoZSBtZXNzYWdlIGFyZ3VtZW50cy4KLQkgKiBAcmV0dXJuIFRoZSBsb2NhbGl6ZWQgZm9ybWF0dGVkIG1lc3NhZ2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZm9ybWF0KFN0cmluZyBrZXksIE9iamVjdFtdIGFyZ3MpIHsKLQkJcmV0dXJuIE1lc3NhZ2VGb3JtYXQuZm9ybWF0KGdldFN0cmluZyhrZXkpLCBhcmdzKTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3ZpZXdzL0hUTUxXcmFwcGVycy5wcm9wZXJ0aWVzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS92aWV3cy9IVE1MV3JhcHBlcnMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGUzMDY3MS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3ZpZXdzL0hUTUxXcmFwcGVycy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1DT05URU5UX1dSQVBQRVJfU1RBUlQ9XAotICA8aHRtbD5cCi0gIDxoZWFkPlwKLSAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPlwKLSAgPC9oZWFkPlwKLSAgPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCI+XAotICBmdW5jdGlvbiBpbml0KCkgeyBwYXJlbnQub3J5X3RvYz0iZGlzYWJsZSI7IHBhcmVudC5jb250ZW50ZnJhbWUubG9jYXRpb249IgotICAKLUNPTlRFTlRfV1JBUFBFUl9FTkQ9XAotICAiOyB9XAotICA8L3NjcmlwdD5cCi0gIDwvaGVhZD5cCi0gIDxmcmFtZXNldCByb3dzPSIxMDAlLCoiIGZyYW1lYm9yZGVyPSJubyIgYm9yZGVyPSIwIiBmcmFtZXNwYWNpbmc9IjAiIGlkPSJjb250ZW50ZnJhbWVzZXQiIG5hbWU9ImNvbnRlbnRmcmFtZXNldCI+XAotICA8ZnJhbWUgc3JjPSJhYm91dDpibGFuayIgaWQ9ImNvbnRlbnRmcmFtZSIgbmFtZT0iY29udGVudGZyYW1lIiBzY3JvbGxpbmc9ImF1dG8iLz5cCi0gIDxmcmFtZSBzcmM9ImFib3V0OmJsYW5rIiBpZD0iYmxhbmtmcmFtZSIgbmFtZT0iYmxhbmtmcmFtZSIgb25sb2FkPSJpbml0KCkiLz5cCi0gIDwvZnJhbWVzZXQ+XAotICA8L2h0bWw+Ci0KLVBSSU5UX1dSQVBQRVJfU1RBUlQ9XAotICA8aHRtbD5cCi0gIDxoZWFkPlwKLSAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPlwKLSAgPC9oZWFkPlwKLSAgPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCI+XAotICBmdW5jdGlvbiBpbml0KCkgeyBwYXJlbnQub3J5X3RvYz0iZGlzYWJsZSI7IH1cCi0gIDwvc2NyaXB0PlwKLSAgPC9oZWFkPlwKLSAgPGZyYW1lc2V0IHJvd3M9IjEwMCUsKiIgZnJhbWVib3JkZXI9Im5vIiBib3JkZXI9IjAiIGZyYW1lc3BhY2luZz0iMCIgaWQ9InByaW50ZnJhbWVzZXQiIG5hbWU9InByaW50ZnJhbWVzZXQiIG9ubG9hZD0iamF2YXNjcmlwdDpwcmludCgpIj5cCi0gIDxmcmFtZSBzcmM9ImFib3V0OmJsYW5rIiBpZD0iYmxhbmtmcmFtZSIgbmFtZT0iYmxhbmtmcmFtZSIgb25sb2FkPSJpbml0KCkiLz5cCi0gIDxmcmFtZSBzcmM9IgotCi1QUklOVF9XUkFQUEVSX0VORD1cCi0gICIgaWQ9InByaW50ZnJhbWUiIG5hbWU9InByaW50ZnJhbWUiIHNjcm9sbGluZz0iYXV0byIgb25sb2FkPSJqYXZhc2NyaXB0OnBhcmVudC5wcmludGZyYW1lLmZvY3VzKCkiLz5cCi0gIDwvZnJhbWVzZXQ+XAotICA8aHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3ZpZXdzL0xpYnJhcnlWaWV3LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3ZpZXdzL0xpYnJhcnlWaWV3LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5ZTc4NTkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS92aWV3cy9MaWJyYXJ5Vmlldy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI4MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnZpZXdzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5FdmVudE9iamVjdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YVZpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uQ29tbW9uUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5CYXNpY0NvbW1hbmRTdGFjazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZFN0YWNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kU3RhY2tMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnVpLnZpZXdlci5JVmlld2VyUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuV3JhcHBlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5Db3B5QWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5DdXRBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkRlbGV0ZUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uUGFzdGVBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuZG5kLkxvY2FsVHJhbnNmZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlIZWxwQ29udGV4dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuVUlBY3Rpb25EaXNwYXRjaGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9ucy5Bc3NpZ25BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zLkNyZWF0ZU1ldGhvZEVsZW1lbnRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9ucy5DdXN0b21DYXRlZ29yeURlZXBDb3B5QWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9ucy5JTGlicmFyeUFjdGlvbkJhckNvbnRyaWJ1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9ucy5MYXlvdXRBY3Rpb25Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnMuTGlicmFyeUFjdGlvbkJhckNvbnRyaWJ1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9ucy5MaWJyYXJ5Vmlld0NvcHlBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zLkxpYnJhcnlWaWV3Q3V0QWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9ucy5MaWJyYXJ5Vmlld0RlbGV0ZUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnMuTGlicmFyeVZpZXdQYXN0ZUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnMuTGlicmFyeVZpZXdTaW1wbGVBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zLk5ld1BsdWdpbkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnMuUmVhc3NpZ25BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zLlJlbmFtZUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnMuVW5hc3NpZ25BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5kaWFsb2dzLk1vdmVEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5kaWFsb2dzLlN3aXRjaENvbmZpZ0RpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmRpYWxvZ3MuVmFyaWFiaWxpdHlTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5kbmQuTGlicmFyeVZpZXdlckRyYWdBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5FZGl0b3JDaG9vc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5JRWRpdG9yS2VlcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5NZXRob2RFbGVtZW50RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5NZXRob2RFbGVtZW50RWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLlByb2Nlc3NFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcmVmZXJlbmNlcy5BcHBsaWNhdGlvblByZWZlcmVuY2VDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcmVmZXJlbmNlcy5BdXRob3JpbmdVSVByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvdmlkZXJzLk1ldGhvZEVsZW1lbnRMYWJlbERlY29yYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnV0aWwuTGlicmFyeVZhbGlkYXRpb25NYXJrZXJIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS51dGlsLlJlZnJlc2hIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudXRpbC5VSUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpLnV0aWwuTXNnQm94OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LklMaWJyYXJ5TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuRmVhdHVyZVZhbHVlV3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JTmFtZWRGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5QbHVnaW5VSVBhY2thZ2VDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5uYXZpZ2F0b3IuTWV0aG9kTGlicmFyeUl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lm5hdmlnYXRvci5QbHVnaW5VSVBhY2thZ2VzSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudWkuVXNlckludGVyYWN0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Db25maWd1cmFibGVDb21wb3NlZEFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLklMaWJyYXJ5UmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UuSUxpYnJhcnlSZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucHJvamVjdC5NZXRob2RMaWJyYXJ5UHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wcm9qZWN0Lk1ldGhvZExpYnJhcnlQcm9qZWN0TmF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLkxpYnJhcnlVSU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuYWN0aW9ucy5MaWJyYXJ5TG9ja2luZ09wZXJhdGlvblJ1bm5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5wcmVmZXJlbmNlcy5MaWJyYXJ5VUlQcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLkltcG9ydEV4cG9ydFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pLlhNSUxpYnJhcnlNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS5YTUlMaWJyYXJ5VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UuRmlsZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLk11bHRpRmlsZVJlc291cmNlU2V0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UucmVmcmVzaC5JUmVmcmVzaEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5yZWZyZXNoLklSZWZyZXNoSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UucmVmcmVzaC5JUmVmcmVzaExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5yZWZyZXNoLlJlZnJlc2hKb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLnV0aWwuTGlicmFyeVNjaGVkdWxpbmdSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS51dGlsLlBlcnNpc3RlbmNlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VydmljZXMuU2VydmljZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ2FwYWJpbGl0eVBhdHRlcm47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50Q2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ3VzdG9tQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyeVByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaXNjaXBsaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGlzY2lwbGluZUdyb3VwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTmFtZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZVNldEdyb3VwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGVhbVByb2ZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0LmRvbWFpbi5UcmFjZWFibGVBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5NZXRob2RQbHVnaW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkFzc29jaWF0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5NZXNzYWdlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5VbWFVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklDb250cmlidXRpb25JdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklTdGF0dXNMaW5lTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSVRvb2xCYXJNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5NZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uU2VwYXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuUHJvZ3Jlc3NNb25pdG9yRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVXaXRoUHJvZ3Jlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5JUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5EZWNvcmF0aW5nTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkRvdWJsZUNsaWNrRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JRG91YmxlQ2xpY2tMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbERlY29yYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXJDaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5ETkQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5IVE1MVHJhbnNmZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5UZXh0VHJhbnNmZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5UcmFuc2ZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXJlY3RvcnlEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JQWN0aW9uQmFyczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklQYXJ0TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVByb3BlcnR5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVZpZXdQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklWaWV3U2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuV29ya3NwYWNlTW9kaWZ5T3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuSVNob3dJblRhcmdldDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LlNob3dJbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MubWFya2Vycy5pbnRlcm5hbC5NYXJrZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLm5hdmlnYXRvci5SZXNvdXJjZU5hdmlnYXRvcjsKLQotLyoqCi0gKiBUaGUgTGlicmFyeSB2aWV3LgotICogPHA+Ci0gKiBEaXNwbGF5cyB0aGUgcGh5c2ljYWwgcmVwcmVzZW50YXRpb24gb2YgYSBNZXRob2QgTGlicmFyeS4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAYXV0aG9yIFdlaXBpbmcgTHUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIExpYnJhcnlWaWV3IGV4dGVuZHMgQWJzdHJhY3RCYXNlVmlldyBpbXBsZW1lbnRzIElSZWZyZXNoSGFuZGxlciwKLQkJSVNob3dJblRhcmdldCB7Ci0KLQkvKioKLQkgKiBUaGUgdmlldyBJRC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWSUVXX0lEID0gTGlicmFyeVZpZXcuY2xhc3MuZ2V0TmFtZSgpOwotCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBERUJVRyA9IEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5pc0RlYnVnZ2luZygpOwotCi0JcHJvdGVjdGVkIFRyZWVWaWV3ZXIgdHJlZVZpZXdlcjsKLQotCXByb3RlY3RlZCBJRG91YmxlQ2xpY2tMaXN0ZW5lciBkb3VibGVDbGlja0xpc3RlbmVyID0gbnVsbDsKLQotCXByaXZhdGUgSVNlbGVjdGlvbiBzZWxlY3Rpb247Ci0JCi0JcHJpdmF0ZSBMYXlvdXRBY3Rpb25Hcm91cCBmTGF5b3V0QWN0aW9uU2V0OwotCQotCXByaXZhdGUgU3RyaW5nIFBFUkZPUk1fSUQgPSAib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy52aWV3LkxpYnJhcnlWaWV3LnBlcmZvcm1WYWxpZGF0b3JBY3Rpb24iOyAvLyROT04tTkxTLTEkCi0JCi0JcHJpdmF0ZSBJQWN0aW9uIHBlcmZvcm1MaWJyYXJ5VmFsaWRhdGlvbkFjdGlvbiA9IG5ldyBBY3Rpb24oCi0JCQlBdXRob3JpbmdVSVJlc291cmNlcy5WYWxpZGF0ZV9tZXRob2RfbGlicmFyeSwgQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcigKLQkJCSJmdWxsL2V0b29sMTYvdmFsaWRhdGVfbWV0aG9kX2xpYi5naWYiKSkgeyAvLyROT04tTkxTLTEkCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbiNydW4oKQotCQkgKi8KLQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJdHJ5IHsKLQkJCQlWaWV3SGVscGVyLmNoZWNrTGlicmFyeUhlYWx0aCgpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQl9Ci0JCX0JCQotCX07Ci0JCi0JLy8gTGlzdGVuIHRvIHByb2Nlc3MgZWRpdG9yIGFjdGl2YXRpb24gYW5kIHByb21wdCB0aGUgdXNlciB0byBsb2FkIHRoZQotCS8vIHRoZSBwcm9jZXNzJ3MgZGVmYXVsdCBDb25maWd1cmF0aW9uIGludG8gdGhlIENvbmZpZ3VyYXRpb24gdmlldy4KLQlwcml2YXRlIElQYXJ0TGlzdGVuZXIgZWRpdG9yUGFydExpc3RlbmVyID0gbmV3IElQYXJ0TGlzdGVuZXIoKSB7Ci0KLQkJcHVibGljIHZvaWQgcGFydE9wZW5lZChJV29ya2JlbmNoUGFydCBwYXJ0KSB7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBwYXJ0RGVhY3RpdmF0ZWQoSVdvcmtiZW5jaFBhcnQgcGFydCkgewotCQl9Ci0KLQkJcHVibGljIHZvaWQgcGFydENsb3NlZChJV29ya2JlbmNoUGFydCBwYXJ0KSB7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBwYXJ0QnJvdWdodFRvVG9wKElXb3JrYmVuY2hQYXJ0IHBhcnQpIHsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHBhcnRBY3RpdmF0ZWQoSVdvcmtiZW5jaFBhcnQgcGFydCkgewotCQkJaWYgKHBhcnQgaW5zdGFuY2VvZiBJRWRpdG9yUGFydCkgewotCQkJCVN3aXRjaENvbmZpZ0RpYWxvZy5ydW4oRGlzcGxheQotCQkJCQkJLmdldEN1cnJlbnQoKS5nZXRBY3RpdmVTaGVsbCgpLCAoSUVkaXRvclBhcnQpcGFydCk7Ci0JCQl9Ci0JCX0KLQotCX07Ci0KLQlwcml2YXRlIGxvbmcgbGFzdFJlZnJlc2hUaW1lU3RhbXA7Ci0KLQlwcml2YXRlIElSZXNvdXJjZUNoYW5nZUxpc3RlbmVyIHJlc291cmNlTGlzdGVuZXIgPSBuZXcgSVJlc291cmNlQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHJlc291cmNlQ2hhbmdlZChJUmVzb3VyY2VDaGFuZ2VFdmVudCBldmVudCkgewotCQkJaWYgKGV2ZW50LmdldFR5cGUoKSA9PSBJUmVzb3VyY2VDaGFuZ2VFdmVudC5QUkVfQ0xPU0UgfHwKLQkJCQkJZXZlbnQuZ2V0VHlwZSgpID09IElSZXNvdXJjZUNoYW5nZUV2ZW50LlBSRV9ERUxFVEUpIHsKLQkJCQkvLyBwcm9qZWN0IGFib3V0IHRvIGJlIGNsb3NlZCBvciBkZWxldGVkCi0JCQkJSVByb2plY3QgcHJvamVjdCA9IChJUHJvamVjdClldmVudC5nZXRSZXNvdXJjZSgpOwotCQkJCXRyeSB7Ci0JCQkJCWlmIChwcm9qZWN0LmV4aXN0cygpICYmIHByb2plY3QuaXNPcGVuKCkgJiYgcHJvamVjdC5oYXNOYXR1cmUoTWV0aG9kTGlicmFyeVByb2plY3ROYXR1cmUuTkFUVVJFX0lEKSkgewotCQkJCQkJRWRpdG9yQ2hvb3Nlci5nZXRJbnN0YW5jZSgpLmNsb3NlQWxsTWV0aG9kRWRpdG9ycygpOwotCQkJCQkJSVByb2plY3QgY3VyclByb2plY3QgPSBNZXRob2RMaWJyYXJ5UHJvamVjdC5maW5kUHJvamVjdChMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5TG9jYXRpb24oKSk7Ci0JCQkJCQlpZiAocHJvamVjdCA9PSBjdXJyUHJvamVjdCkgewotCQkJCQkJCUxpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuY2xvc2VDdXJyZW50TWV0aG9kTGlicmFyeSgpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZXgpIHsKLQkJCQkJTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoY2V4KTsKLQkJCQl9IGNhdGNoIChMaWJyYXJ5U2VydmljZUV4Y2VwdGlvbiBsZXgpIHsKLQkJCQkJTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IobGV4KTsKLQkJCQl9Ci0JCQkJcmV0dXJuOwotCQkJCQotCQkJfQotCQkJSVJlc291cmNlRGVsdGEgZGVsdGEgPSBldmVudC5nZXREZWx0YSgpOwotCQkJaWYgKGRlbHRhID09IG51bGwpCi0JCQkJcmV0dXJuOwotCQkJCQkJCi0JCQl0cnkgewotCQkJCWNsYXNzIFJlc291cmNlRGVsdGFWaXNpdG9yIGltcGxlbWVudHMgSVJlc291cmNlRGVsdGFWaXNpdG9yIHsKLQkJCQkJcHVibGljIGJvb2xlYW4gdmlzaXQoSVJlc291cmNlRGVsdGEgZGVsdGEpCi0JCQkJCQkJdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkJCQkJaWYgKChkZWx0YS5nZXRGbGFncygpICYgSVJlc291cmNlRGVsdGEuTUFSS0VSUykgPT0gSVJlc291cmNlRGVsdGEuTUFSS0VSUykgewotCQkJCQkJCXN3aXRjaCAoZGVsdGEuZ2V0S2luZCgpKSB7Ci0JCQkJCQkJY2FzZSBJUmVzb3VyY2VEZWx0YS5BRERFRDoKLQkJCQkJCQljYXNlIElSZXNvdXJjZURlbHRhLkNIQU5HRUQ6Ci0JCQkJCQkJCS8vIHNob3cgUHJvYmxlbXMgVmlldwotCQkJCQkJCQlVSUhlbHBlci5zaG93UHJvYmxlbXNWaWV3KCk7Ci0JCQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQkvLyB3YXRjaCBmb3IgcHJvamVjdCBtb3ZlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JCQkJCQllbHNlIGlmIChkZWx0YS5nZXRSZXNvdXJjZSgpLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuUFJPSkVDVCkgeyAgCi0JCQkJCQkJaWYgKGRlbHRhLmdldEtpbmQoKSA9PSBJUmVzb3VyY2VEZWx0YS5DSEFOR0VEKSB7Ci0JCQkJCQkJCWlmICgoKGRlbHRhLmdldEZsYWdzKCkgJiBJUmVzb3VyY2VEZWx0YS5SRVBMQUNFRCkgPT0gMCkgJiYgICAgICAgICAgICAgICAgCi0JCQkJCQkJCQkJKChkZWx0YS5nZXRGbGFncygpICYgSVJlc291cmNlRGVsdGEuREVTQ1JJUFRJT04pICE9IDApKSB7Ci0JCQkJCQkJCQkvLyB0ZXN0ZWQgdXNpbmcgdGhlIE1vdmUuLiBjb21tYW5kIGluIHRoZSBSZXNvdXJjZSBOYXZpZ2F0b3IgdmlldyAgICAgICAgICAgICAKLQkJCQkJCQkJCS8vIHRoZSBSRVBMQUNFRCBmbGFnIG9ubHkgc2VlbWVkIHRvIG9jY3VyIHdoZW4gdGhlIGxpYnJhcnkgd2FzIG1vdmVkICAgICAgICAgIAotCQkJCQkJCQkJLy8gb3V0c2lkZSBvZiBFUEYgYW5kIEVQRiB3YXMgcmUtc3RhcnRlZCwgc28gbWFrZSBzdXJlIGl0J3MgY2xlYXIsIG90aGVyd2lzZSAgCi0JCQkJCQkJCQkvLyB3ZSByZWxvYWQgdGhlIGxpYnJhcnkgcmlnaHQgYWZ0ZXIgbG9hZGluZyBpdCB3aGVuIHN0YXJ0aW5nIEVQRiAgICAgICAgICAgICAKLQkJCQkJCQkJCUlQcm9qZWN0IHByb2plY3QgPSAoSVByb2plY3QpIGRlbHRhLmdldFJlc291cmNlKCk7Ci0JCQkJCQkJCQlJTGlicmFyeU1hbmFnZXIgbGliTWdyID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TGlicmFyeU1hbmFnZXIoKTsKLQkJCQkJCQkJCWlmKGxpYk1nciBpbnN0YW5jZW9mIFhNSUxpYnJhcnlNYW5hZ2VyKSB7Ci0JCQkJCQkJCQkJWE1JTGlicmFyeU1hbmFnZXIgeG1pTGliTWdyID0gKChYTUlMaWJyYXJ5TWFuYWdlcilsaWJNZ3IpOwotCQkJCQkJCQkJCWlmKHByb2plY3QuZXF1YWxzKHhtaUxpYk1nci5nZXRNZXRob2RMaWJyYXJ5UHJvamVjdCgpKSkgewkKLQkJCQkJCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCk7Ci0JCQkJCQkJCQkJCXhtaUxpYk1nci5oYW5kbGVMaWJyYXJ5TW92ZWQoKTsKLQkJCQkJCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQkJCQkJCX0KLQkJCQkJCQkJCX0KLQkJCQkJCQkJfSBlbHNlIGlmICgoZGVsdGEuZ2V0RmxhZ3MoKSAmIElSZXNvdXJjZURlbHRhLk9QRU4pICE9IDApIHsKLQkJCQkJCQkJCS8vIHByb2plY3QncyBvcGVuIHN0YXRlIHdhcyBjaGFuZ2VkCi0JCQkJCQkJCQlJUHJvamVjdCBwcm9qZWN0ID0gKElQcm9qZWN0KSBkZWx0YS5nZXRSZXNvdXJjZSgpOwotCQkJCQkJCQkJaWYgKHByb2plY3QuaXNPcGVuKCkgJiYgcHJvamVjdC5oYXNOYXR1cmUoTWV0aG9kTGlicmFyeVByb2plY3ROYXR1cmUuTkFUVVJFX0lEKSAmJgotCQkJCQkJCQkJCQlMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCkgPT0gbnVsbCkgewotCQkJCQkJCQkJCS8vIHByb2plY3QgaXMgbm93IG9wZW4sIG9wZW4gdGhlIGxpYnJhcnkKLQkJCQkJCQkJCQlqYXZhLm5ldC5VUkkgcHJvamVjdExvY2F0aW9uID0gcHJvamVjdC5nZXRMb2NhdGlvblVSSSgpOwotCQkJCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCQkJCUxpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkub3Blbk1ldGhvZExpYnJhcnkoInhtaSIsIHByb2plY3RMb2NhdGlvbik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJCQkJCQlMaWJyYXJ5UGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCX0JCQkJCi0JCQkJfTsKLQkJCQkKLQkJCQlSZXNvdXJjZURlbHRhVmlzaXRvciB2aXNpdG9yID0gbmV3IFJlc291cmNlRGVsdGFWaXNpdG9yKCk7Ci0JCQkJZGVsdGEuYWNjZXB0KHZpc2l0b3IpOwotCi0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQlDb21tb25QbHVnaW4uSU5TVEFOQ0UubG9nKGUpOwotCQkJfQotCi0JCX0KLQotCX07Ci0KLQlwcml2YXRlIElSZWZyZXNoTGlzdGVuZXIgcmVmcmVzaExpc3RlbmVyID0gbmV3IElSZWZyZXNoTGlzdGVuZXIoKSB7Ci0KLQkJcHVibGljIHZvaWQgbm90aWZ5UmVmcmVzaGVkKElSZWZyZXNoRXZlbnQgZXZlbnQpIHsKLQkJCWlmIChldmVudC5nZXRSZWZyZXNoZWRPYmplY3RzKCkgIT0gbnVsbAotCQkJCQkmJiAhZXZlbnQuZ2V0UmVmcmVzaGVkT2JqZWN0cygpLmlzRW1wdHkoKSkgewotCQkJCUNvbnRyb2wgY3RybCA9IGdldFZpZXdlcigpLmdldENvbnRyb2woKTsKLQkJCQlpZiAoY3RybCA9PSBudWxsIHx8IGN0cmwuaXNEaXNwb3NlZCgpKQotCQkJCQlyZXR1cm47Ci0KLQkJCQlpZiAoY3RybC5nZXREaXNwbGF5KCkuZ2V0VGhyZWFkKCkgPT0gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKSkgewotCQkJCQlkb1JlZnJlc2goZ2V0U2l0ZSgpLmdldFNoZWxsKCkpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWN0cmwuZ2V0RGlzcGxheSgpLnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQotCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCWRvUmVmcmVzaChudWxsKTsKLQkJCQkJCX0KLQotCQkJCQl9KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCX07Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBMaWJyYXJ5VmlldygpIHsKLQkJLy8gcmVhZCBsYXlvdXQgcHJlZgotCQlpZiAoUGx1Z2luVUlQYWNrYWdlQ29udGV4dC5GTEFUX0xBWU9VVC5lcXVhbHMoQXBwbGljYXRpb25QcmVmZXJlbmNlQ29uc3RhbnRzLmdldExheW91dCgpKSkgewotCQkJUGx1Z2luVUlQYWNrYWdlQ29udGV4dC5JTlNUQU5DRS5zZXRMYXlvdXRGbGF0KCk7Ci0JCX0gZWxzZSBpZiAoUGx1Z2luVUlQYWNrYWdlQ29udGV4dC5ISUVSQVJDSElDQUxfTEFZT1VULmVxdWFscyhBcHBsaWNhdGlvblByZWZlcmVuY2VDb25zdGFudHMuZ2V0TGF5b3V0KCkpKSB7Ci0JCQlQbHVnaW5VSVBhY2thZ2VDb250ZXh0LklOU1RBTkNFLnNldExheW91dEhpZXJhcmNoaWNhbCgpOwotCQl9Ci0KLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5wYXJ0LldvcmtiZW5jaFBhcnQjY3JlYXRlUGFydENvbnRyb2woQ29tcG9zaXRlKQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZVBhcnRDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJc3VwZXIuY3JlYXRlUGFydENvbnRyb2wocGFyZW50KTsKLQkJCi0JCW1ha2VBY3Rpb25zKCk7Ci0JCQotCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHBhcmVudCwKLQkJCQlBdXRob3JpbmdVSUhlbHBDb250ZXh0cy5MSUJSQVJZX05BVklHQVRPUl9WSUVXX0NPTlRFWFQpOwotCi0JCVJlZnJlc2hKb2IuZ2V0SW5zdGFuY2UoKS5zZXRSZWZyZXNoSGFuZGxlcih0aGlzKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIG1ha2VBY3Rpb25zKCkgewotCQlmTGF5b3V0QWN0aW9uU2V0PSBuZXcgTGF5b3V0QWN0aW9uR3JvdXAodGhpcyk7Ci0JCUlBY3Rpb25CYXJzIGFjdGlvbkJhcnM9IGdldFZpZXdTaXRlKCkuZ2V0QWN0aW9uQmFycygpOwotCQlmTGF5b3V0QWN0aW9uU2V0LmZpbGxBY3Rpb25CYXJzKGFjdGlvbkJhcnMpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGFydC5Xb3JrYmVuY2hQYXJ0I3NldEZvY3VzKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGb2N1cygpIHsKLQkJLy8gVGhpcyBpcyByZXF1aXJlZCB0byBtYWtlIHRoZSBnbG9iYWwgZWRpdCBhY3Rpb24gd29yayB0aGUgZmlyc3QgdGltZS4KLQkJYWN0aW9uQmFyQ29udHJpYnV0b3Iuc2V0QWN0aXZlVmlldyh0aGlzKTsKLQotCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3RlZCA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgZ2V0U2VsZWN0aW9uKCk7Ci0JCWlmIChzZWxlY3RlZC5pc0VtcHR5KCkpCi0JCQlhY3Rpb25CYXJDb250cmlidXRvci5kaXNhYmxlR2xvYmFsRWRpdE1lbnUoKTsKLQkJZWxzZQotCQkJYWN0aW9uQmFyQ29udHJpYnV0b3IuZW5hYmxlR2xvYmFsRWRpdE1lbnUoKTsKLQotCQlpZiAodHJlZVZpZXdlciAhPSBudWxsKSB7Ci0JCQl0cmVlVmlld2VyLmdldENvbnRyb2woKS5zZXRGb2N1cygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdW5kZXJseWluZyB0cmVlIHZpZXdlci4KLQkgKi8KLQlwdWJsaWMgVmlld2VyIGdldFZpZXdlcigpIHsKLQkJcmV0dXJuIHRyZWVWaWV3ZXI7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgdW5kZXJseWluZyB0cmVlIHZpZXdlci4KLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVWaWV3ZXIoQ29tcG9zaXRlIHBhcmVudCkgewotCQl0cmVlVmlld2VyID0gbmV3IFRyZWVWaWV3ZXIocGFyZW50KSB7Ci0JCQkvKgotCQkJICogKG5vbi1KYXZhZG9jKQotCQkJICogCi0JCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFZpZXdlciNoYW5kbGVMYWJlbFByb3ZpZGVyQ2hhbmdlZChvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXJDaGFuZ2VkRXZlbnQpCi0JCQkgKi8KLQkJCXByb3RlY3RlZCB2b2lkIGhhbmRsZUxhYmVsUHJvdmlkZXJDaGFuZ2VkKAotCQkJCQlMYWJlbFByb3ZpZGVyQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJaWYgKGV2ZW50LmdldEVsZW1lbnQoKSBpbnN0YW5jZW9mIElSZXNvdXJjZQotCQkJCQkJJiYgZXZlbnQuZ2V0U291cmNlKCkgaW5zdGFuY2VvZiBJTGFiZWxEZWNvcmF0b3IpIHsKLQkJCQkJdGhpcy5yZWZyZXNoKCk7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJc3VwZXIuaGFuZGxlTGFiZWxQcm92aWRlckNoYW5nZWQoZXZlbnQpOwotCQkJfQotCQl9OwotCi0JCWFkYXB0ZXJGYWN0b3J5ID0gVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCk7Ci0KLQkJLy8gQ3JlYXRlIHRoZSBjb21tYW5kIHN0YWNrIHRoYXQgd2lsbCBub3RpZnkgdGhpcyBlZGl0b3IgYXMgY29tbWFuZHMgYXJlCi0JCS8vIGV4ZWN1dGVkLgotCQlCYXNpY0NvbW1hbmRTdGFjayBjb21tYW5kU3RhY2sgPSBuZXcgQmFzaWNDb21tYW5kU3RhY2soKTsKLQotCQkvLyBBZGQgYSBsaXN0ZW5lciB0byBzZXQgdGhlIG1vc3QgcmVjZW50IGNvbW1hbmQncyBhZmZlY3RlZCBvYmplY3RzIHRvCi0JCS8vIGJlIHRoZSBzZWxlY3Rpb24gb2YgdGhlIHZpZXdlciB3aXRoIGZvY3VzLgotCQljb21tYW5kU3RhY2suYWRkQ29tbWFuZFN0YWNrTGlzdGVuZXIobmV3IENvbW1hbmRTdGFja0xpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgY29tbWFuZFN0YWNrQ2hhbmdlZChmaW5hbCBFdmVudE9iamVjdCBldmVudCkgewotCQkJCVJ1bm5hYmxlIHJ1bm5hYmxlID0gbmV3IFJ1bm5hYmxlKCkgewotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQlmaXJlUHJvcGVydHlDaGFuZ2UoSUVkaXRvclBhcnQuUFJPUF9ESVJUWSk7Ci0KLQkJCQkJCS8vIFRyeSB0byBzZWxlY3QgdGhlIGFmZmVjdGVkIG9iamVjdHMuCi0JCQkJCQlDb21tYW5kIG1vc3RSZWNlbnRDb21tYW5kID0gKChDb21tYW5kU3RhY2spIGV2ZW50Ci0JCQkJCQkJCS5nZXRTb3VyY2UoKSkuZ2V0TW9zdFJlY2VudENvbW1hbmQoKTsKLQkJCQkJCWlmIChtb3N0UmVjZW50Q29tbWFuZCAhPSBudWxsKSB7Ci0JCQkJCQkJc2V0U2VsZWN0aW9uVG9WaWV3ZXIobW9zdFJlY2VudENvbW1hbmQKLQkJCQkJCQkJCS5nZXRBZmZlY3RlZE9iamVjdHMoKSk7Ci0JCQkJCQkJCi0JCQkJCQkJaWYobW9zdFJlY2VudENvbW1hbmQgaW5zdGFuY2VvZiBDcmVhdGVNZXRob2RFbGVtZW50Q29tbWFuZCkgewkJCQkJCQkJCi0JCQkJCQkJCS8vIFdvcmstYXJvdW5kIHRvIHJlZnJlc2ggaWNvbnMgb2YgbmV3bHkgY3JlYXRlZCBlbGVtZW50cywgd2hvc2UgZGVjb3JhdGlvbgotCQkJCQkJCQkvLyBzb21ldGltZXMgZ290IG91dCBvZiBzeW5jLgotCQkJCQkJCQkvLwotCQkJCQkJCQlWaWV3ZXIgdmlld2VyID0gZ2V0Vmlld2VyKCk7Ci0JCQkJCQkJCWlmKHZpZXdlciBpbnN0YW5jZW9mIFN0cnVjdHVyZWRWaWV3ZXIpIHsKLQkJCQkJCQkJCU9iamVjdFtdIGVsZW1lbnRzID0gbW9zdFJlY2VudENvbW1hbmQKLQkJCQkJCQkJCQkJLmdldEFmZmVjdGVkT2JqZWN0cygpLnRvQXJyYXkoKTsKLQkJCQkJCQkJCSgoU3RydWN0dXJlZFZpZXdlcil2aWV3ZXIpLnVwZGF0ZShlbGVtZW50cywgbnVsbCk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQlpZiAocHJvcGVydHlTaGVldFBhZ2UgIT0gbnVsbAotCQkJCQkJCQkmJiBwcm9wZXJ0eVNoZWV0UGFnZS5nZXRDb250cm9sKCkgIT0gbnVsbAotCQkJCQkJCQkmJiAhcHJvcGVydHlTaGVldFBhZ2UuZ2V0Q29udHJvbCgpLmlzRGlzcG9zZWQoKQotCQkJCQkJCQkmJiBwcm9wZXJ0eVNoZWV0UGFnZS5nZXRDb250cm9sKCkuaXNWaXNpYmxlKCkpIHsKLQkJCQkJCQlwcm9wZXJ0eVNoZWV0UGFnZS5yZWZyZXNoKCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9OwotCQkJCWlmIChEaXNwbGF5LmdldEN1cnJlbnQoKSAhPSBudWxsKSB7Ci0JCQkJCURpc3BsYXkuZ2V0Q3VycmVudCgpLmFzeW5jRXhlYyhydW5uYWJsZSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJcnVubmFibGUucnVuKCk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQotCQkvLyBDcmVhdGUgdGhlIGVkaXRpbmcgZG9tYWluIHdpdGggYSBzcGVjaWFsIGNvbW1hbmQgc3RhY2suCi0JCVJlc291cmNlU2V0IHJlc291cmNlU2V0ID0gUGVyc2lzdGVuY2VTZXJ2aWNlLklOU1RBTkNFCi0JCQkJLmNyZWF0ZVJlc291cmNlU2V0KFNlcnZpY2VzLmdldERlZmF1bHRMaWJyYXJ5UGVyc2lzdGVuY2VUeXBlKCkpOwotCi0JCWVkaXRpbmdEb21haW4gPSBuZXcgVHJhY2VhYmxlQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluKAotCQkJCWFkYXB0ZXJGYWN0b3J5LCBjb21tYW5kU3RhY2ssIHJlc291cmNlU2V0KTsKLQotCi0JCXRyZWVWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcigKLQkJCQlhZGFwdGVyRmFjdG9yeSkpOwotCi0JCS8vIHRyZWVWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihuZXcKLQkJLy8gQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5KSk7Ci0JCXRyZWVWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihuZXcgRGVjb3JhdGluZ0xhYmVsUHJvdmlkZXIoCi0JCQkJbmV3IEFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcihhZGFwdGVyRmFjdG9yeSksCi0JCQkJbmV3IE1ldGhvZEVsZW1lbnRMYWJlbERlY29yYXRvcigpKSk7Ci0KLQkJLy8gQWRkIGEgZG91YmxlIGNsaWNrIGxpc3RlbmVyIGZvciBsYXVuY2hpbmcgdGhlIE1ldGhvZCBlZGl0b3JzLgotCQlkb3VibGVDbGlja0xpc3RlbmVyID0gbmV3IElEb3VibGVDbGlja0xpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgZG91YmxlQ2xpY2soRG91YmxlQ2xpY2tFdmVudCBldmVudCkgewotCQkJCVVJQWN0aW9uRGlzcGF0Y2hlci5nZXRJbnN0YW5jZSgpLmhhbmRsZURvdWJsZUNsaWNrRXZlbnQoZXZlbnQpOwotCQkJfQotCQl9OwotCQl0cmVlVmlld2VyLmFkZERvdWJsZUNsaWNrTGlzdGVuZXIoZG91YmxlQ2xpY2tMaXN0ZW5lcik7Ci0KLQkJZ2V0U2l0ZSgpLmdldFBhZ2UoKS5hZGRQYXJ0TGlzdGVuZXIoZWRpdG9yUGFydExpc3RlbmVyKTsKLQotCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkKLQkJCQkuYWRkUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcihyZXNvdXJjZUxpc3RlbmVyKTsKLQkJCi0JCWNyZWF0ZUNvbnRleHRNZW51Rm9yKHRyZWVWaWV3ZXIpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS52aWV3cy5BYnN0cmFjdEJhc2VWaWV3I3NldElucHV0Rm9yVmlld2VyKE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJbnB1dEZvclZpZXdlcihPYmplY3QgbW9kZWwpIHsKLQkJQ29udHJvbCBjdHJsID0gdGhpcy5nZXRWaWV3ZXIoKS5nZXRDb250cm9sKCk7Ci0JCWlmIChjdHJsLmlzRGlzcG9zZWQoKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWlmIChtb2RlbCA9PSBudWxsIHx8IG1vZGVsIGluc3RhbmNlb2YgTWV0aG9kTGlicmFyeSkgewotCQkJLy8gUHJldmVudCBtZW1vcnkgbGVhay4KLQkJCVN0cnVjdHVyZWRTZWxlY3Rpb24gZW1wdHlTZWxlY3Rpb24gPSBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbigpOwotCQkJYWN0aW9uRGlzcGF0Y2hlci5zZXRTZWxlY3Rpb24oZW1wdHlTZWxlY3Rpb24pOwotCQkJVUlBY3Rpb25EaXNwYXRjaGVyLmdldEluc3RhbmNlKCkuc2V0U2VsZWN0aW9uKGVtcHR5U2VsZWN0aW9uKTsKLQotCQkJZ2V0Vmlld2VyKCkuc2V0SW5wdXQobW9kZWwpOwotCQkJCi0JCQlpZihhZGFwdGVyRmFjdG9yeSBpbnN0YW5jZW9mIENvbmZpZ3VyYWJsZUNvbXBvc2VkQWRhcHRlckZhY3RvcnkpIHsKLQkJCQlJRmlsdGVyIGZpbHRlciA9ICgoQ29uZmlndXJhYmxlQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldEZpbHRlcigpOwotCQkJCWlmKGZpbHRlciBpbnN0YW5jZW9mIElOYW1lZEZpbHRlcikgewotCQkJCQlTdHJpbmcgbmFtZSA9ICgoSU5hbWVkRmlsdGVyKSBmaWx0ZXIpLmdldE5hbWUoKTsKLQkJCQkJaWYobmFtZSAhPSBudWxsKSB7Ci0JCQkJCQlzZXRDb250ZW50RGVzY3JpcHRpb24obmFtZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQl1cGRhdGVMYXN0UmVmcmVzaFRpbWVzdGFtcCgpOwotCQl9IGVsc2UgewotCQkJQXV0aG9yaW5nVUlQbHVnaW4KLQkJCQkJLmdldERlZmF1bHQoKQotCQkJCQkuZ2V0TG9nZ2VyKCkKLQkJCQkJLmxvZ0Vycm9yKAotCQkJCQkJCSJMaWJyYXJ5IHZpZXdlciBpbnB1dCBpcyBub3QgYSBNZXRob2RMaWJyYXJ5IG9iamVjdDogIiArIG1vZGVsKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZUxhc3RSZWZyZXNoVGltZXN0YW1wKCkgewotCQlsYXN0UmVmcmVzaFRpbWVTdGFtcCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCX0KLQotCQotCS8qKgotCSAqIFJldHVybnMgdGhpcyB2aWV3LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlicmFyeVZpZXcgZ2V0VmlldygpIHsKLS8vCQlyZXR1cm4gKExpYnJhcnlWaWV3KSBWaWV3SGVscGVyLm9wZW5WaWV3KFZJRVdfSUQpOwotCQlib29sZWFuIHNob3cgPSBWaWV3SGVscGVyLmlzVmlld0luQ3VycmVudFBlcnNwZWN0aXZlKFZJRVdfSUQpOwotCQlyZXR1cm4gKExpYnJhcnlWaWV3KVZpZXdIZWxwZXIuZmluZFZpZXcoVklFV19JRCwgc2hvdyk7Ci0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudmlld3MuQWJzdHJhY3RCYXNlVmlldyNzZXRTZWxlY3Rpb24oSVNlbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTZWxlY3Rpb24oSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJKChMaWJyYXJ5Vmlld0FjdGlvbkJhckNvbnRyaWJ1dG9yKSBhY3Rpb25CYXJDb250cmlidXRvcikKLQkJCQkudXBkYXRlU2VsZWN0aW9uKHNlbGVjdGlvbik7Ci0KLQkJc3VwZXIuc2V0U2VsZWN0aW9uKHNlbGVjdGlvbik7Ci0JCXRoaXMuc2VsZWN0aW9uID0gc2VsZWN0aW9uOwkJCi0KLS8vCQkoKExpYnJhcnlWaWV3QWN0aW9uQmFyQ29udHJpYnV0b3IpIGFjdGlvbkJhckNvbnRyaWJ1dG9yKS5jaGVja0xvY2tlZCgpOwotCQkKLQkJLy8gaWYgb25seSBvbmUgZWxlbWVudCBpcyBzZWxlY3RlZCwgc2hvdyBwYXRoIHRvIGl0cyBmaWxlIGluIHN0YXR1cyBsaW5lCi0JCS8vCi0JCUlTdGF0dXNMaW5lTWFuYWdlciBzdGF0dXNMaW5lTWFuYWdlciA9IGdldFZpZXdTaXRlKCkuZ2V0QWN0aW9uQmFycygpCi0JCQkJLmdldFN0YXR1c0xpbmVNYW5hZ2VyKCk7Ci0JCWlmIChzdGF0dXNMaW5lTWFuYWdlciAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgcGF0aCA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQlpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKLQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzdHJ1Y3R1cmVkU2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb247Ci0JCQkJaWYgKHN0cnVjdHVyZWRTZWxlY3Rpb24uc2l6ZSgpID09IDEpIHsKLQkJCQkJT2JqZWN0IG8gPSBUbmdVdGlsLnVud3JhcChzdHJ1Y3R1cmVkU2VsZWN0aW9uCi0JCQkJCQkJLmdldEZpcnN0RWxlbWVudCgpKTsKLQkJCQkJaWYgKG8gaW5zdGFuY2VvZiBFT2JqZWN0KSB7Ci0JCQkJCQlSZXNvdXJjZSByZXNvdXJjZSA9ICgoRU9iamVjdCkgbykuZVJlc291cmNlKCk7Ci0JCQkJCQlpZiAocmVzb3VyY2UgIT0gbnVsbCkgewotCQkJCQkJCVVSSSB1cmkgPSByZXNvdXJjZS5nZXRVUkkoKTsKLQkJCQkJCQlpZiAodXJpICE9IG51bGwgJiYgdXJpLmlzRmlsZSgpKSB7Ci0JCQkJCQkJCXBhdGggPSB1cmkudG9GaWxlU3RyaW5nKCk7Ci0JCQkJCQkJCWlmIChvIGluc3RhbmNlb2YgQ29udGVudEVsZW1lbnQpIHsKLQkJCQkJCQkJCUNvbnRlbnREZXNjcmlwdGlvbiBjb250ZW50ID0gKChDb250ZW50RWxlbWVudCkgbykKLQkJCQkJCQkJCQkJLmdldFByZXNlbnRhdGlvbigpOwotCQkJCQkJCQkJaWYgKGNvbnRlbnQgIT0gbnVsbCkgewotCQkJCQkJCQkJCXJlc291cmNlID0gY29udGVudC5lUmVzb3VyY2UoKTsKLQkJCQkJCQkJCQlpZiAocmVzb3VyY2UgIT0gbnVsbCkgewotCQkJCQkJCQkJCQlVUkkgY29udGVudFVSSSA9IHJlc291cmNlLmdldFVSSSgpOwotCQkJCQkJCQkJCQlpZiAoY29udGVudFVSSSAhPSBudWxsKSB7Ci0JCQkJCQkJCQkJCQlwYXRoID0gcGF0aAotCQkJCQkJCQkJCQkJCQkrICIsLiIgKyBGaWxlLnNlcGFyYXRvckNoYXIgKyBjb250ZW50VVJJLmRlcmVzb2x2ZSh1cmkpLnRvRmlsZVN0cmluZygpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQkJCX0KLQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlzdGF0dXNMaW5lTWFuYWdlci5zZXRNZXNzYWdlKHBhdGgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5JTGlicmFyeVNlcnZpY2VMaXN0ZW5lciNsaWJyYXJ5UmVvcGVuZWQoTWV0aG9kTGlicmFyeSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBsaWJyYXJ5UmVvcGVuZWQoTWV0aG9kTGlicmFyeSBsaWJyYXJ5KSB7Ci0JCXJlZnJlc2hWaWV3cygpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBsaWJyYXJ5U2V0KE1ldGhvZExpYnJhcnkgbGlicmFyeSkgewotCQlzdXBlci5saWJyYXJ5U2V0KGxpYnJhcnkpOwotCQlJTGlicmFyeU1hbmFnZXIgbWFuYWdlciA9IChJTGlicmFyeU1hbmFnZXIpIExpYnJhcnlTZXJ2aWNlCi0JCS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRMaWJyYXJ5TWFuYWdlcigpOwotCQlpZiAobWFuYWdlciAhPSBudWxsKSB7Ci0JCQltYW5hZ2VyLnJlZ2lzdGVyRWRpdGluZ0RvbWFpbihlZGl0aW5nRG9tYWluKTsKLQkJCi0JCQltYW5hZ2VyLmFkZFByb3BlcnR5TGlzdGVuZXIobmV3IElQcm9wZXJ0eUxpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChPYmplY3Qgc291cmNlLCBpbnQgcHJvcElkKSB7Ci0JCQkJCS8vIFRPRE86IFJlcGxhY2UgaGFyZGNvZGVkIGNvbnN0YW50IHdpdGggdmFyaWFibGUuCi0JCQkJCWlmIChwcm9wSWQgPT0gMSkgewotCQkJCQkJZmlyZVByb3BlcnR5Q2hhbmdlKFBST1BfRElSVFkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGUgYWN0aW9uIGJhciBmb3IgdGhlIGxpYnJhcnkgdmlldwotCSAqLwotCWNsYXNzIExpYnJhcnlWaWV3QWN0aW9uQmFyQ29udHJpYnV0b3IgZXh0ZW5kcyBMaWJyYXJ5QWN0aW9uQmFyQ29udHJpYnV0b3IgewotCi0JCXByaXZhdGUgSUFjdGlvbiBuZXdQbHVnaW5BY3Rpb24gPSBuZXcgTmV3UGx1Z2luQWN0aW9uKAotCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLm5ld19wbHVnaW4pOwotCi0JCXByaXZhdGUgSUFjdGlvbiBtb3ZlQWN0aW9uID0gbmV3IEFjdGlvbihBdXRob3JpbmdVSVJlc291cmNlcy5tb3ZlKSB7Ci0KLQkJCXByaXZhdGUgdm9pZCBkb01vdmUoKSB7Ci0JCQkJQ29sbGVjdGlvbiBlbGVtZW50c1RvTW92ZSA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIExpYnJhcnlWaWV3LnRoaXMuc2VsZWN0aW9uOwotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHNlbGVjdGlvbi5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyLm5leHQoKTsKLQkJCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50Ci0JCQkJCQkJfHwgKGVsZW1lbnQgPSBUbmdVdGlsLnVud3JhcChlbGVtZW50KSkgaW5zdGFuY2VvZiBDdXN0b21DYXRlZ29yeSkgewotCQkJCQkJLy8gSGFuZGxlIEN1c3RvbUNhdGVnb3J5IHNwZWNpYWxseS4KLQkJCQkJCUVPYmplY3QgY29udGFpbmVyID0gKChFT2JqZWN0KSBlbGVtZW50KS5lQ29udGFpbmVyKCk7Ci0JCQkJCQlJU3RhdHVzIHN0YXR1cyA9IFVzZXJJbnRlcmFjdGlvbkhlbHBlci5jaGVja01vZGlmeSgKLQkJCQkJCQkJY29udGFpbmVyLCBnZXRTaXRlKCkuZ2V0U2hlbGwoKSk7Ci0JCQkJCQlpZiAoY29udGFpbmVyICE9IG51bGwgJiYgIXN0YXR1cy5pc09LKCkpIHsKLQkJCQkJCQlBdXRob3JpbmdVSVBsdWdpbgotCQkJCQkJCQkJLmdldERlZmF1bHQoKQotCQkJCQkJCQkJLmdldE1zZ0RpYWxvZygpCi0JCQkJCQkJCQkuZGlzcGxheUVycm9yKAotCQkJCQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5lcnJvckRpYWxvZ190aXRsZSwKLQkJCQkJCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuZXJyb3JEaWFsb2dfbW92ZUVycm9yLAotCQkJCQkJCQkJCQlzdGF0dXMpOwotCQkJCQkJCXJldHVybjsKLQkJCQkJCX0KLQkJCQkJCWVsZW1lbnRzVG9Nb3ZlLmFkZChlbGVtZW50KTsKLQkJCQkJfQotCQkJCX0KLQotCQkJCS8vIFRPRE86IFByb21wdCB0aGUgdXNlciB0aGUgc2F2ZSBlZGl0aW5nIGNoYW5nZXMgZm9yCi0JCQkJLy8gZWxlbWVudHMgdGhhdCB3aWxsIGJlIG1vdmVkLgotCi0JCQkJLy8gUmVtb3ZlIGVsZW1lbnRzIGZyb20gdGhlIG1vdmUgbGlzdCBpZiB0aGVpciBjb250YWluZXJzIGFyZQotCQkJCS8vIGFscmVhZHkgaW4gdGhlIG1vdmUgbGlzdC4KLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gZWxlbWVudHNUb01vdmUuaXRlcmF0b3IoKTsgaXRlcmF0b3IKLQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCUVPYmplY3QgZWxlbWVudCA9IChFT2JqZWN0KSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCWJvb2xlYW4gaXNDb250YWluZWQgPSBmYWxzZTsKLQkJCQkJY2hlY2tfY29udGFpbmVkOiBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBlbGVtZW50c1RvTW92ZQotCQkJCQkJCS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJCU9iamVjdCBlID0gKE9iamVjdCkgaXRlci5uZXh0KCk7Ci0JCQkJCQlpZiAoVW1hVXRpbC5pc0NvbnRhaW5lZEJ5KGVsZW1lbnQsIGUpKSB7Ci0JCQkJCQkJaXNDb250YWluZWQgPSB0cnVlOwotCQkJCQkJCWJyZWFrIGNoZWNrX2NvbnRhaW5lZDsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlpZiAoaXNDb250YWluZWQpIHsKLQkJCQkJCWl0ZXJhdG9yLnJlbW92ZSgpOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJTW92ZURpYWxvZyBkbGcgPSBuZXcgTW92ZURpYWxvZyhnZXRTaXRlKCkuZ2V0U2hlbGwoKSwKLQkJCQkJCWVsZW1lbnRzVG9Nb3ZlLCBlZGl0aW5nRG9tYWluKTsKLQkJCQlkbGcub3BlbigpOwotCQkJfQotCi0JCQkvKgotCQkJICogKG5vbi1KYXZhZG9jKQotCQkJICogCi0JCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb24jcnVuKCkKLQkJCSAqLwotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCUxpYnJhcnlMb2NraW5nT3BlcmF0aW9uUnVubmVyIHJ1bm5lciA9IG5ldyBMaWJyYXJ5TG9ja2luZ09wZXJhdGlvblJ1bm5lcigpOwotCQkJCXJ1bm5lci5zZXRQcm9ncmVzc01vbml0b3IoZ2V0QWN0aW9uQmFycygpCi0JCQkJCQkuZ2V0U3RhdHVzTGluZU1hbmFnZXIoKS5nZXRQcm9ncmVzc01vbml0b3IoKSk7Ci0JCQkJcnVubmVyLnJ1bihuZXcgSVJ1bm5hYmxlV2l0aFByb2dyZXNzKCkgewotCi0JCQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCi0JCQkJCQkJdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sCi0JCQkJCQkJSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQkJCQkJZG9Nb3ZlKCk7Ci0JCQkJCX0KLQotCQkJCX0pOwotCQkJfQotCQl9OwotCi0JCXByaXZhdGUgTGlicmFyeVZpZXdTaW1wbGVBY3Rpb24gYXNzaWduQWN0aW9uID0gbmV3IEFzc2lnbkFjdGlvbihMaWJyYXJ5Vmlldy50aGlzKTsKLQkJCi0JCXByaXZhdGUgTGlicmFyeVZpZXdTaW1wbGVBY3Rpb24gdW5hc3NpZ25BY3Rpb24gPSBuZXcgVW5hc3NpZ25BY3Rpb24oTGlicmFyeVZpZXcudGhpcyk7Ci0JCQotCQlwcml2YXRlIExpYnJhcnlWaWV3U2ltcGxlQWN0aW9uIHJlYXNzaWduQWN0aW9uID0gbmV3IFJlYXNzaWduQWN0aW9uKExpYnJhcnlWaWV3LnRoaXMpOwotCi0JCXByaXZhdGUgTGlicmFyeVZpZXdTaW1wbGVBY3Rpb24gY3VzdG9tQ2F0ZWdvcnlEZWVwQ29weUFjdGlvbiA9IG5ldyBDdXN0b21DYXRlZ29yeURlZXBDb3B5QWN0aW9uKExpYnJhcnlWaWV3LnRoaXMpOwotCQkKLQkJcHJpdmF0ZSBSZW5hbWVBY3Rpb24gcmVuYW1lQWN0aW9uID0gbmV3IFJlbmFtZUFjdGlvbigpOwotCi0JCXByaXZhdGUgSUFjdGlvbiByZXBsYWNlQWN0aW9uID0gbmV3IEFjdGlvbigKLQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5FbGVtZW50c1ZpZXdfcmVwbGFjZUFjdGlvbl90ZXh0KSB7Ci0KLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlpZiAoIWdldFBhZ2UoKS5jbG9zZUFsbEVkaXRvcnModHJ1ZSkpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQotCQkJCWZpbmFsIFByb2Nlc3NDb21wb25lbnQgcHJvY0NvbXAgPSAoUHJvY2Vzc0NvbXBvbmVudCkgKChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uKQotCQkJCQkJLmdldEZpcnN0RWxlbWVudCgpOwotCQkJCVByb2Nlc3MgcHJvYyA9IHByb2NDb21wLmdldFByb2Nlc3MoKTsKLQkJCQlmaW5hbCBTdHJpbmcgdHlwZVN0cjsKLQkJCQlpZiAocHJvYyBpbnN0YW5jZW9mIENhcGFiaWxpdHlQYXR0ZXJuKSB7Ci0JCQkJCXR5cGVTdHIgPSBBdXRob3JpbmdVSVJlc291cmNlcy5FbGVtZW50c1ZpZXdfMjA7Ci0JCQkJfSBlbHNlIGlmIChwcm9jIGluc3RhbmNlb2YgRGVsaXZlcnlQcm9jZXNzKSB7Ci0JCQkJCXR5cGVTdHIgPSBBdXRob3JpbmdVSVJlc291cmNlcy5FbGVtZW50c1ZpZXdfMjE7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJdHlwZVN0ciA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLkVsZW1lbnRzVmlld18yMjsKLQkJCQl9Ci0JCQkJRGlyZWN0b3J5RGlhbG9nIGRpckRsZyA9IG5ldyBEaXJlY3RvcnlEaWFsb2coZ2V0U2l0ZSgpCi0JCQkJCQkuZ2V0U2hlbGwoKSk7Ci0JCQkJZGlyRGxnLnNldFRleHQoQXV0aG9yaW5nVUlSZXNvdXJjZXMuRWxlbWVudHNWaWV3X3JlcGxhY2VfdGV4dCk7Ci0JCQkJZGlyRGxnCi0JCQkJCQkuc2V0TWVzc2FnZShNZXNzYWdlRm9ybWF0Ci0JCQkJCQkJCS5mb3JtYXQoCi0JCQkJCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuRWxlbWVudHNWaWV3X21pZ3JhdGlvbl9kaXJfZGxnX2Rlc2NyaXB0aW9uX3RleHQsCi0JCQkJCQkJCQkJbmV3IE9iamVjdFtdIHsgdHlwZVN0ciB9KSk7Ci0JCQkJZmluYWwgU3RyaW5nIGRpciA9IGRpckRsZy5vcGVuKCk7Ci0JCQkJaWYgKGRpciA9PSBudWxsKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0KLQkJCQlib29sZWFuIHJldCA9IFVzZXJJbnRlcmFjdGlvbkhlbHBlcgotCQkJCQkJLnJ1bldpdGhQcm9ncmVzcygKLQkJCQkJCQkJbmV3IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5JUnVubmFibGVXaXRoUHJvZ3Jlc3MoKSB7Ci0KLQkJCQkJCQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCi0JCQkJCQkJCQkJCXRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLAotCQkJCQkJCQkJCQlJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCQkJCQkJCQkJdHJ5IHsKLQkJCQkJCQkJCQkJSW1wb3J0RXhwb3J0VXRpbC5yZXBsYWNlKHByb2NDb21wLAotCQkJCQkJCQkJCQkJCWRpcik7Ci0JCQkJCQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQkJCQkJdGhyb3cgbmV3IFdyYXBwZWRFeGNlcHRpb24oZSk7Ci0JCQkJCQkJCQkJfQotCQkJCQkJCQkJfQotCQkJCQkJCQl9LAotCQkJCQkJCQlNZXNzYWdlRm9ybWF0Ci0JCQkJCQkJCQkJLmZvcm1hdCgKLQkJCQkJCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLkVsZW1lbnRzVmlld19yZXBsYWNlaW5nd2l0aGZvcm1hdF90ZXh0LAotCQkJCQkJCQkJCQkJbmV3IE9iamVjdFtdIHsgdHlwZVN0ciB9KSk7Ci0KLQkJCQlpZiAocmV0KSB7Ci0JCQkJCS8vIFJlb3BlbiB0aGUgbGlicmFyeS4KLQkJCQkJTGlicmFyeVVJTWFuYWdlci5nZXRJbnN0YW5jZSgpLm9wZW5MaWJyYXJ5KAotCQkJCQkJCUxpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLQkJCQkJCQkJCS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeUxvY2F0aW9uKCkpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQotCQlwcml2YXRlIElBY3Rpb24gb3BlblZhcmlhYmlsaXR5RGlhbG9nQWN0aW9uID0gbmV3IEFjdGlvbigKLQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5FbGVtZW50c1ZpZXdfb3BlblZhcmlhYmlsaXR5RGlhbG9nQWN0aW9uX3RleHQpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlPYmplY3Qgb2JqID0gVG5nVXRpbC51bndyYXAoKChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uKQotCQkJCQkJLmdldEZpcnN0RWxlbWVudCgpKTsKLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgVmFyaWFiaWxpdHlFbGVtZW50KSB7Ci0JCQkJCVZhcmlhYmlsaXR5RWxlbWVudCBlbGVtZW50ID0gKFZhcmlhYmlsaXR5RWxlbWVudCkgb2JqOwotCQkJCQlWYXJpYWJpbGl0eVNlbGVjdGlvbiB2YXJpYWJpbGl0eVNlbGVjdGlvbiA9IG5ldyBWYXJpYWJpbGl0eVNlbGVjdGlvbigpOwotCQkJCQlPYmplY3Qgc2VsZWN0ZWRPYmplY3QgPSB2YXJpYWJpbGl0eVNlbGVjdGlvbgotCQkJCQkJCS5nZXRTZWxlY3RlZFZhcmlhYmlsaXR5KGVsZW1lbnQpOwotCQkJCQlpZiAoc2VsZWN0ZWRPYmplY3QgIT0gbnVsbCkgewotCQkJCQkJRWRpdG9yQ2hvb3Nlci5nZXRJbnN0YW5jZSgpLm9wZW5FZGl0b3Ioc2VsZWN0ZWRPYmplY3QpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9OwotCi0JCXByaXZhdGUgYm9vbGVhbiBsb2NrZWQ7Ci0KLQkJcHJpdmF0ZSBib29sZWFuIGNhbk1vdmU7Ci0JCQotCQlwcml2YXRlIGJvb2xlYW4gY2FuQXNzaWduOwotCi0JCXByaXZhdGUgSUFjdGlvbiBzaG93SW5SZXNvdXJjZU5hdmlnYXRvckFjdGlvbiA9IG5ldyBBY3Rpb24oCi0JCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuc2hvd0luUmVzb3VyY2VOYXZpZ2F0b3JBY3Rpb25fbGFiZWwpIHsKLQkJCS8qCi0JCQkgKiAobm9uLUphdmFkb2MpCi0JCQkgKiAKLQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbiNydW4oKQotCQkJICovCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJUmVzb3VyY2VOYXZpZ2F0b3IgbmF2aWdhdG9yOwotCQkJCXRyeSB7Ci0JCQkJCW5hdmlnYXRvciA9IChSZXNvdXJjZU5hdmlnYXRvcikgZ2V0UGFnZSgpLnNob3dWaWV3KAotCQkJCQkJCSJvcmcuZWNsaXBzZS51aS52aWV3cy5SZXNvdXJjZU5hdmlnYXRvciIpOyAvLyROT04tTkxTLTEkCi0JCQkJCU9iamVjdCBvYmogPSBUbmdVdGlsCi0JCQkJCQkJLnVud3JhcCgoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb24pCi0JCQkJCQkJCQkuZ2V0Rmlyc3RFbGVtZW50KCkpOwotCQkJCQlJUmVzb3VyY2Ugd3NSZXMgPSBQZXJzaXN0ZW5jZVV0aWwuZ2V0V29ya3NwYWNlUmVzb3VyY2Uob2JqKTsKLQkJCQkJaWYgKHdzUmVzICE9IG51bGwpIHsKLQkJCQkJCW5hdmlnYXRvci5nZXRWaWV3ZXIoKS5zZXRTZWxlY3Rpb24oCi0JCQkJCQkJCW5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKHdzUmVzKSwgdHJ1ZSk7Ci0JCQkJCX0KLQkJCQl9IGNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JCQotCQlwcml2YXRlIGJvb2xlYW4gY2FuUmVuYW1lOwotCi0JCS8qKgotCQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCQkgKi8KLQkJcHVibGljIExpYnJhcnlWaWV3QWN0aW9uQmFyQ29udHJpYnV0b3IoRWRpdGluZ0RvbWFpbiBlZGl0aW5nRG9tYWluKSB7Ci0JCQlzdXBlcihlZGl0aW5nRG9tYWluKTsKLQkJfQotCi0JCS8qKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9ucy5MaWJyYXJ5QWN0aW9uQmFyQ29udHJpYnV0b3IjY3JlYXRlRGVsZXRlQWN0aW9uKCkKLQkJICovCi0JCXByb3RlY3RlZCBEZWxldGVBY3Rpb24gY3JlYXRlRGVsZXRlQWN0aW9uKCkgewotCQkJTGlicmFyeVZpZXdEZWxldGVBY3Rpb24gYWN0aW9uID0gbmV3IExpYnJhcnlWaWV3RGVsZXRlQWN0aW9uKCkgewotCQkJCS8qKgotCQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zLkVsZW1lbnRzVmlld1Bhc3RlQWN0aW9uI3VwZGF0ZVNlbGVjdGlvbihJU3RydWN0dXJlZFNlbGVjdGlvbikKLQkJCQkgKi8KLQkJCQlwdWJsaWMgYm9vbGVhbiB1cGRhdGVTZWxlY3Rpb24oSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCQkJCWlmIChsb2NrZWQpIHsKLQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJfQotCQkJCQlyZXR1cm4gc3VwZXIudXBkYXRlU2VsZWN0aW9uKHNlbGVjdGlvbik7Ci0JCQkJfQotCi0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQlTdHJpbmcgdGl0bGUgPSBBdXRob3JpbmdVSVJlc291cmNlcy5hY3Rpb25zX0xpYnJhcnlBY3Rpb25CYXJDb250cmlidXRvcl9kZWxldGVFcnJvclRpdGxlOwotCQkJCQl0cnkgewotCQkJCQkJc3VwZXIucnVuKCk7Ci0JCQkJCX0gY2F0Y2ggKE1lc3NhZ2VFeGNlcHRpb24gZSkgewotCQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpCi0JCQkJCQkJCS5kaXNwbGF5RXJyb3IodGl0bGUsIGUuZ2V0TWVzc2FnZSgpKTsKLQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCVN0cmluZyBkZXRhaWxzID0gVG5nVXRpbC50b1N0YWNrVHJhY2VTdHJpbmcoZSk7Ci0JCQkJCQlTdHJpbmcgbWVzc2FnZSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmFjdGlvbnNfTGlicmFyeUFjdGlvbkJhckNvbnRyaWJ1dG9yX2RlbGV0ZUVycm9yTWVzc2FnZTsKLQkJCQkJCVN0cmluZyByZWFzb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy5hY3Rpb25zX0xpYnJhcnlBY3Rpb25CYXJDb250cmlidXRvcl9kZWxldGVFcnJvclJlYXNvbjsKLQkJCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKQotCQkJCQkJCQkuZGlzcGxheUVycm9yKHRpdGxlLCBtZXNzYWdlLCByZWFzb24sIGRldGFpbHMsCi0JCQkJCQkJCQkJZSk7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQlwcm90ZWN0ZWQgdm9pZCBkZWxldGVGYWlsZWQoKSB7Ci0JCQkJCS8vIExpYnJhcnkgbmVlZCB0byBiZSByZWxvYWRlZC4KLQkJCQkJVmlld0hlbHBlci5yZWxvYWRDdXJyZW50TGlicmFyeShnZXRTaXRlKCkuZ2V0U2hlbGwoKSwgQXV0aG9yaW5nVUlSZXNvdXJjZXMubXNnX3JlbG9hZExpYnJhcnkpOwotCi0JCQkJCS8vIFVzZXIgdHJpZWQgdG8gc2VsZWN0IHRoZSBvbGQgc2VsZWN0aW9uLgotCQkJCQlpZiAoYWN0aXZlVmlld1BhcnQgaW5zdGFuY2VvZiBJVmlld2VyUHJvdmlkZXIpIHsKLQkJCQkJCWZpbmFsIEFycmF5TGlzdCBlbGVtZW50cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHNlbGVjdGlvbi5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJT2JqZWN0IGUgPSBpdGVyLm5leHQoKTsKLQkJCQkJCQlpZiAoZSBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCQkJCQkJU3RyaW5nIGd1aWQgPSAoKE1ldGhvZEVsZW1lbnQpIGUpLmdldEd1aWQoKTsKLQkJCQkJCQkJSUxpYnJhcnlNYW5hZ2VyIG1hbmFnZXIgPSBMaWJyYXJ5U2VydmljZQotCQkJCQkJCQkJCS5nZXRJbnN0YW5jZSgpCi0JCQkJCQkJCQkJLmdldEN1cnJlbnRMaWJyYXJ5TWFuYWdlcigpOwotCQkJCQkJCQlpZiAobWFuYWdlciAhPSBudWxsKSB7Ci0JCQkJCQkJCQlNZXRob2RFbGVtZW50IGVsZW1lbnQgPSBtYW5hZ2VyCi0JCQkJCQkJCQkJCS5nZXRNZXRob2RFbGVtZW50KGd1aWQpOwotCQkJCQkJCQkJaWYgKGVsZW1lbnQgIT0gbnVsbCkgewotCQkJCQkJCQkJCWVsZW1lbnRzLmFkZChlbGVtZW50KTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCWlmICghZWxlbWVudHMuaXNFbXB0eSgpKSB7Ci0JCQkJCQkJVmlld2VyIHZpZXdlciA9ICgoSVZpZXdlclByb3ZpZGVyKSBhY3RpdmVWaWV3UGFydCkKLQkJCQkJCQkJCS5nZXRWaWV3ZXIoKTsKLQkJCQkJCQl2aWV3ZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKAotCQkJCQkJCQkJZWxlbWVudHMpLCB0cnVlKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX07Ci0JCQlhY3Rpb24uc2V0UHJvZ3Jlc3NNb25pdG9yKGdldEFjdGlvbkJhcnMoKS5nZXRTdGF0dXNMaW5lTWFuYWdlcigpCi0JCQkJCS5nZXRQcm9ncmVzc01vbml0b3IoKSk7Ci0JCQlyZXR1cm4gYWN0aW9uOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zLkxpYnJhcnlBY3Rpb25CYXJDb250cmlidXRvciNjcmVhdGVDdXRBY3Rpb24oKQotCQkgKi8KLQkJcHJvdGVjdGVkIEN1dEFjdGlvbiBjcmVhdGVDdXRBY3Rpb24oKSB7Ci0JCQlyZXR1cm4gbmV3IExpYnJhcnlWaWV3Q3V0QWN0aW9uKCkgewotCQkJCS8qKgotCQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zLkVsZW1lbnRzVmlld1Bhc3RlQWN0aW9uI3VwZGF0ZVNlbGVjdGlvbihJU3RydWN0dXJlZFNlbGVjdGlvbikKLQkJCQkgKi8KLQkJCQlwdWJsaWMgYm9vbGVhbiB1cGRhdGVTZWxlY3Rpb24oSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCQkJCWlmIChsb2NrZWQpIHsKLQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJfQotCQkJCQlyZXR1cm4gc3VwZXIudXBkYXRlU2VsZWN0aW9uKHNlbGVjdGlvbik7Ci0JCQkJfQotCQkJfTsKLQkJfQotCi0JCS8qKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9ucy5MaWJyYXJ5QWN0aW9uQmFyQ29udHJpYnV0b3IjY3JlYXRlQ29weUFjdGlvbigpCi0JCSAqLwotCQlwcm90ZWN0ZWQgQ29weUFjdGlvbiBjcmVhdGVDb3B5QWN0aW9uKCkgewotCQkJcmV0dXJuIG5ldyBMaWJyYXJ5Vmlld0NvcHlBY3Rpb24oKXsKLQotCQkJCUBPdmVycmlkZQotCQkJCXB1YmxpYyBib29sZWFuIHVwZGF0ZVNlbGVjdGlvbihJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJCQkJaWYoIFZpZXdIZWxwZXIuaGFzQ3VzdG9taXplZExvY2tlcigoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbikgJiYgbG9ja2VkICl7CQotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQl9Ci0JCQkJCXJldHVybiBzdXBlci51cGRhdGVTZWxlY3Rpb24oc2VsZWN0aW9uKTsKLQkJCQl9Ci0JCQkJCi0JCQl9OwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zLkxpYnJhcnlBY3Rpb25CYXJDb250cmlidXRvciNjcmVhdGVQYXN0ZUFjdGlvbigpCi0JCSAqLwotCQlwcm90ZWN0ZWQgUGFzdGVBY3Rpb24gY3JlYXRlUGFzdGVBY3Rpb24oKSB7Ci0JCQlMaWJyYXJ5Vmlld1Bhc3RlQWN0aW9uIGFjdGlvbiA9IG5ldyBMaWJyYXJ5Vmlld1Bhc3RlQWN0aW9uKCkgewotCQkJCS8qKgotCQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zLkVsZW1lbnRzVmlld1Bhc3RlQWN0aW9uI3VwZGF0ZVNlbGVjdGlvbihJU3RydWN0dXJlZFNlbGVjdGlvbikKLQkJCQkgKi8KLQkJCQlwdWJsaWMgYm9vbGVhbiB1cGRhdGVTZWxlY3Rpb24oSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCQkJCWlmIChsb2NrZWQpIHsKLQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJfQotCQkJCQlyZXR1cm4gc3VwZXIudXBkYXRlU2VsZWN0aW9uKHNlbGVjdGlvbik7Ci0JCQkJfQotCQkJfTsKLQkJCWFjdGlvbi5zZXRQcm9ncmVzc01vbml0b3IoZ2V0QWN0aW9uQmFycygpLmdldFN0YXR1c0xpbmVNYW5hZ2VyKCkKLQkJCQkJLmdldFByb2dyZXNzTW9uaXRvcigpKTsKLQkJCXJldHVybiBhY3Rpb247Ci0JCX0KLQotCQlwcml2YXRlIHZvaWQgY2hlY2tMb2NrZWQoKSB7Ci0JCQlpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKLQkJCQlib29sZWFuIHdhc0xvY2tlZCA9IGxvY2tlZDsKLS8vCQkJCWxvY2tlZCA9IFZpZXdIZWxwZXIuaXNMb2NrZWQoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb24pOwotCQkJCWlmKFZpZXdIZWxwZXIuaGFzQ3VzdG9taXplZExvY2tlcigoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbikgKXsJCQkJCQotCQkJCQlsb2NrZWQgPSBWaWV3SGVscGVyLmlzTG9ja2VkV2l0aEN1c3RvbWl6ZWRMb2NrZXIoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb24pOwkJCQkJCi0JCQkJfWVsc2V7Ci0JCQkJCWxvY2tlZCA9IFZpZXdIZWxwZXIuaXNMb2NrZWQoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb24pOwotCQkJCX0KLQkJCQlpZiAod2FzTG9ja2VkICE9IGxvY2tlZCkgewotCQkJCQlkZWxldGVBY3Rpb24uc2V0RW5hYmxlZChkZWxldGVBY3Rpb24KLQkJCQkJCQkudXBkYXRlU2VsZWN0aW9uKChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uKSk7Ci0JCQkJCWN1dEFjdGlvbi5zZXRFbmFibGVkKGN1dEFjdGlvbgotCQkJCQkJCS51cGRhdGVTZWxlY3Rpb24oKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb24pKTsKLQkJCQkJcGFzdGVBY3Rpb24uc2V0RW5hYmxlZChwYXN0ZUFjdGlvbgotCQkJCQkJCS51cGRhdGVTZWxlY3Rpb24oKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb24pKTsKLQkJCQkJYm9vbGVhbiBlbmFibGVkID0gIWxvY2tlZDsKLQkJCQkJcmVuYW1lQWN0aW9uLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0JCQkJCW1vdmVBY3Rpb24uc2V0RW5hYmxlZChlbmFibGVkKTsKLQkJCQkJCi0JCQkJCS8vYXNzaWduQWN0aW9uLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0JCQkJCXVuYXNzaWduQWN0aW9uLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0JCQkJCXJlYXNzaWduQWN0aW9uLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0JCQkJCS8vY3VzdG9tQ2F0ZWdvcnlEZWVwQ29weUFjdGlvbi5zZXRFbmFibGVkKGVuYWJsZWQpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXZvaWQgdXBkYXRlU2VsZWN0aW9uKElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7CQkJCi0JCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWwgPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbjsKLQkJCQotCQkJcmVuYW1lQWN0aW9uLnNldEFjdGl2ZVdvcmtiZW5jaFBhcnQoTGlicmFyeVZpZXcudGhpcyk7Ci0JCQljYW5SZW5hbWUgPSByZW5hbWVBY3Rpb24udXBkYXRlU2VsZWN0aW9uKHNlbCk7Ci0KLS8vCQkJbG9ja2VkID0gVmlld0hlbHBlci5pc0xvY2tlZChzZWwpOwotCQkJaWYoVmlld0hlbHBlci5oYXNDdXN0b21pemVkTG9ja2VyKHNlbCkgKXsJCQkJCQotCQkJCWxvY2tlZCA9IFZpZXdIZWxwZXIuaXNMb2NrZWRXaXRoQ3VzdG9taXplZExvY2tlcihzZWwpOwotCQkJfWVsc2V7Ci0JCQkJbG9ja2VkID0gVmlld0hlbHBlci5pc0xvY2tlZChzZWwpOwotCQkJfQotCQkJCi0JCQlib29sZWFuIGVuYWJsZWQgPSAhbG9ja2VkOwotCQkJaWYoY2FuUmVuYW1lICYmICFlbmFibGVkKSB7Ci0JCQkJcmVuYW1lQWN0aW9uLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0JCQl9Ci0JCQltb3ZlQWN0aW9uLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0JCQkKLQkJCXVuYXNzaWduQWN0aW9uLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0JCQlyZWFzc2lnbkFjdGlvbi5zZXRFbmFibGVkKGVuYWJsZWQpOwotCi0JCQljYW5Nb3ZlID0gY2FuTW92ZShzZWwpOwotCQkJCi0JCQljYW5Bc3NpZ24gPSBhc3NpZ25BY3Rpb24udXBkYXRlU2VsZWN0aW9uKHNlbCk7Ci0KLQkJCWlmICghbG9ja2VkICYmIHNlbC5zaXplKCkgPT0gMQotCQkJCQkmJiBzZWwuZ2V0Rmlyc3RFbGVtZW50KCkgaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50KSB7Ci0JCQkJcmVwbGFjZUFjdGlvbi5zZXRFbmFibGVkKHRydWUpOwotCQkJfSBlbHNlIHsKLQkJCQlyZXBsYWNlQWN0aW9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJfQotCi0JCQlpZiAoc2VsLnNpemUoKSA9PSAxKSB7Ci0JCQkJT2JqZWN0IG9iaiA9IFRuZ1V0aWwudW53cmFwKCgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbikKLQkJCQkJCS5nZXRGaXJzdEVsZW1lbnQoKSk7Ci0JCQkJb3BlblZhcmlhYmlsaXR5RGlhbG9nQWN0aW9uCi0JCQkJCQkuc2V0RW5hYmxlZChvYmogaW5zdGFuY2VvZiBWYXJpYWJpbGl0eUVsZW1lbnQKLQkJCQkJCQkJJiYgIVRuZ1V0aWwuaXNQcmVkZWZpbmVkKChNZXRob2RFbGVtZW50KSBvYmopKTsKLQkJCQlzaG93SW5SZXNvdXJjZU5hdmlnYXRvckFjdGlvbgotCQkJCQkJLnNldEVuYWJsZWQob2JqIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCk7Ci0JCQl9Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9ucy5MaWJyYXJ5QWN0aW9uQmFyQ29udHJpYnV0b3IjZW5hYmxlR2xvYmFsRWRpdE1lbnUoKQotCQkgKi8KLQkJcHVibGljIHZvaWQgZW5hYmxlR2xvYmFsRWRpdE1lbnUoKSB7Ci0JCX0KLQotCQkvKioKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uRWRpdGluZ0RvbWFpbkFjdGlvbkJhckNvbnRyaWJ1dG9yI2FkZEdsb2JhbEFjdGlvbnMoSU1lbnVNYW5hZ2VyKQotCQkgKi8KLQkJcHJvdGVjdGVkIHZvaWQgYWRkR2xvYmFsQWN0aW9ucyhJTWVudU1hbmFnZXIgbWVudU1hbmFnZXIpIHsKLQkJCXN1cGVyLmFkZEdsb2JhbEFjdGlvbnMobWVudU1hbmFnZXIpOwotCQkJbWVudU1hbmFnZXIuaW5zZXJ0QWZ0ZXIoImZpeGVkLWFkZGl0aW9ucyIsIG5ld1BsdWdpbkFjdGlvbik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCXByaXZhdGUgYm9vbGVhbiBjYW5Nb3ZlKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gc2VsZWN0aW9uLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBlbGVtZW50ID0gaXRlci5uZXh0KCk7Ci0JCQkJaWYgKChlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkKLQkJCQkJCSYmICEoZWxlbWVudCBpbnN0YW5jZW9mIENvbnRlbnRDYXRlZ29yeSkKLQkJCQkJCSYmICEoZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikKLQkJCQkJCSYmICEoZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZENvbmZpZ3VyYXRpb24pCi0JCQkJCQkmJiAhVG5nVXRpbC5pc1ByZWRlZmluZWQoKE1ldGhvZEVsZW1lbnQpIGVsZW1lbnQpKSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCS8qKgotCQkgKiBBZGRzIFNlcGFyYXRvcnMgZm9yIGVkaXRvciBhZGRpdGlvbnMgdG8gdGhlIHRvb2wgYmFyLgotCQkgKi8KLQkJcHVibGljIHZvaWQgY29udHJpYnV0ZVRvVG9vbEJhcihJVG9vbEJhck1hbmFnZXIgdG9vbEJhck1hbmFnZXIpIHsKLS8vCQkJdG9vbEJhck1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoIm1ldGhvZC1zZXR0aW5ncyIpKTsgLy8kTk9OLU5MUy0xJAotLy8JCQl0b29sQmFyTWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcigibWV0aG9kLWFkZGl0aW9ucyIpKTsgLy8kTk9OLU5MUy0xJAotCQkJcGVyZm9ybUxpYnJhcnlWYWxpZGF0aW9uQWN0aW9uLnNldElkKFBFUkZPUk1fSUQpOwotCQkJaWYgKEF1dGhvcmluZ1VJUHJlZmVyZW5jZXMuZ2V0RW5hYmxlTGlicmFyeVZhbGlkYXRpb24oKSkgewotCQkJCXRvb2xCYXJNYW5hZ2VyLmFkZChwZXJmb3JtTGlicmFyeVZhbGlkYXRpb25BY3Rpb24pOwotCQkJfQotCQkJCi0JCX0KLQkJCi0JCS8qKgotCQkgKiBAc2VlIExpYnJhcnlBY3Rpb25CYXJDb250cmlidXRvciNtZW51QWJvdXRUb1Nob3coSU1lbnVNYW5hZ2VyKQotCQkgKi8KLQkJcHVibGljIHZvaWQgbWVudUFib3V0VG9TaG93KElNZW51TWFuYWdlciBtZW51TWFuYWdlcikgewotCQkJY2hlY2tMb2NrZWQoKTsKLQkJCQotCQkJCi0KLQkJCS8vIEFkZCBvdXIgc3RhbmRhcmQgbWFya2VyLgotCQkJbWVudU1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoImZpeGVkLWFkZGl0aW9ucyIpKTsgLy8kTk9OLU5MUy0xJAotCQkJbWVudU1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoImZpeGVkLWFkZGl0aW9ucy1lbmQiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCW1lbnVNYW5hZ2VyLmFkZChuZXcgU2VwYXJhdG9yKCJlZGl0IikpOyAvLyROT04tTkxTLTEkCi0KLQkJCS8vIEFkZCB0aGUgZWRpdCBtZW51IGFjdGlvbnMuCi0JCQltZW51TWFuYWdlci5hZGQobmV3IEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0obGlicmFyeVZpZXdFZGl0QWN0aW9uKSk7Ci0JCQltZW51TWFuYWdlci5hZGQobmV3IEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0oY29weUFjdGlvbikpOwotCQkJbWVudU1hbmFnZXIuYWRkKG5ldyBBY3Rpb25Db250cmlidXRpb25JdGVtKHBhc3RlQWN0aW9uKSk7Ci0JCQltZW51TWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcigpKTsKLQkJCW1lbnVNYW5hZ2VyLmFkZChuZXcgQWN0aW9uQ29udHJpYnV0aW9uSXRlbShkZWxldGVBY3Rpb24pKTsKLQkJCWlmIChjYW5SZW5hbWUpIHsKLQkJCQltZW51TWFuYWdlci5hZGQobmV3IEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0ocmVuYW1lQWN0aW9uKSk7Ci0JCQl9Ci0JCQlpZiAoY2FuTW92ZSkgewotCQkJCW1lbnVNYW5hZ2VyLmFkZChuZXcgQWN0aW9uQ29udHJpYnV0aW9uSXRlbShtb3ZlQWN0aW9uKSk7Ci0JCQl9Ci0JCQkKLQkJCWlmIChjYW5Bc3NpZ24pIHsKLQkJCQltZW51TWFuYWdlci5hZGQobmV3IEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0oYXNzaWduQWN0aW9uKSk7Ci0JCQkJbWVudU1hbmFnZXIuYWRkKG5ldyBBY3Rpb25Db250cmlidXRpb25JdGVtKHVuYXNzaWduQWN0aW9uKSk7Ci0JCQkJbWVudU1hbmFnZXIuYWRkKG5ldyBBY3Rpb25Db250cmlidXRpb25JdGVtKHJlYXNzaWduQWN0aW9uKSk7Ci0JCQkJbWVudU1hbmFnZXIuYWRkKG5ldyBBY3Rpb25Db250cmlidXRpb25JdGVtKGN1c3RvbUNhdGVnb3J5RGVlcENvcHlBY3Rpb24pKTsJCQkJCi0JCQl9Ci0KLQkJCW1lbnVNYW5hZ2VyLmFkZChuZXcgU2VwYXJhdG9yKCJ2aWV3IikpOyAvLyROT04tTkxTLTEkCi0JCQlpZiAob3BlblZhcmlhYmlsaXR5RGlhbG9nQWN0aW9uLmlzRW5hYmxlZCgpKSB7Ci0JCQkJbWVudU1hbmFnZXIuYWRkKG5ldyBBY3Rpb25Db250cmlidXRpb25JdGVtKAotCQkJCQkJb3BlblZhcmlhYmlsaXR5RGlhbG9nQWN0aW9uKSk7Ci0JCQl9Ci0JCQlpZiAoc2hvd0luUmVzb3VyY2VOYXZpZ2F0b3JBY3Rpb24uaXNFbmFibGVkKCkpIHsKLQkJCQltZW51TWFuYWdlci5hZGQobmV3IEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0oCi0JCQkJCQlzaG93SW5SZXNvdXJjZU5hdmlnYXRvckFjdGlvbikpOwotCQkJfQotCQkJbWVudU1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoKSk7Ci0KLQkJCS8vIEFkZCBvdXIgb3RoZXIgc3RhbmRhcmQgbWFya2VyIHdoZXJlIG90aGVyIHBsdWdpbnMgd2lsbCBjb250cmlidXRlCi0JCQkvLyBtZW51Ci0JCQkvLwotCQkJbWVudU1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoImFkZGl0aW9ucyIpKTsgLy8kTk9OLU5MUy0xJAotCQkJbWVudU1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoImFkZGl0aW9ucy1lbmQiKSk7IC8vJE5PTi1OTFMtMSQKLQotCQkJYWRkR2xvYmFsQWN0aW9ucyhtZW51TWFuYWdlcik7Ci0KLQkJCWlmICghbG9ja2VkKSB7Ci0JCQkJTWVudU1hbmFnZXIgc3VibWVudU1hbmFnZXIgPSBudWxsOwotCQkJCXN1Ym1lbnVNYW5hZ2VyID0gbmV3IE1lbnVNYW5hZ2VyKAotCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuX1VJX0NyZWF0ZUNoaWxkX21lbnVfaXRlbSk7Ci0JCQkJcG9wdWxhdGVNYW5hZ2VyKHN1Ym1lbnVNYW5hZ2VyLCBjcmVhdGVDaGlsZEFjdGlvbnMsIG51bGwpOwotCQkJCW1lbnVNYW5hZ2VyLmluc2VydEJlZm9yZSgiZml4ZWQtYWRkaXRpb25zIiwgc3VibWVudU1hbmFnZXIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0KLS8vCQkJbWVudU1hbmFnZXIuYWRkKG5ldyBBY3Rpb24oIlRlc3QiKSB7Ci0vLwkJCQkvKgotLy8JCQkJICogKG5vbi1KYXZhZG9jKQotLy8JCQkJICoKLS8vCQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbiNydW4oKQotLy8JCQkJICovCi0vLwkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0vLwkJCQkJLy8gcmVsb2FkCi0vLwkJCQkJLy8KLS8vLy8JCQkJCUlTZWxlY3Rpb24gc2VsZWN0aW9uID0gZ2V0U2VsZWN0aW9uKCk7Ci0vLy8vCQkJCQlpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKLS8vLy8JCQkJCQlPYmplY3Qgb2JqZWN0ID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uKQotLy8vLwkJCQkJCS5nZXRGaXJzdEVsZW1lbnQoKTsKLS8vLy8JCQkJCQlvYmplY3QgPSBUbmdVdGlsLnVud3JhcChvYmplY3QpOwotLy8vLwkJCQkJCWlmIChvYmplY3QgaW5zdGFuY2VvZiBJbnRlcm5hbEVPYmplY3QpIHsKLS8vLy8JCQkJCQkJSW50ZXJuYWxFT2JqZWN0IGUgPSAoKEludGVybmFsRU9iamVjdCkgb2JqZWN0KTsKLS8vLy8JCQkJCQkJSUxpYnJhcnlSZXNvdXJjZVNldCByZXNvdXJjZVNldCA9IChJTGlicmFyeVJlc291cmNlU2V0KSBlCi0vLy8vCQkJCQkJCS5lUmVzb3VyY2UoKS5nZXRSZXNvdXJjZVNldCgpOwotLy8vLwkJCQkJCQlyZXNvdXJjZVNldC51bmxvYWQoZSk7Ci0vLy8vCQkJCQkJCVVSSSB1cmkgPSBlLmVQcm94eVVSSSgpOwotLy8vLwkJCQkJCQlFT2JqZWN0IG5ld09iamVjdCA9IHJlc291cmNlU2V0LmdldEVPYmplY3QoZSwgdXJpLAotLy8vLwkJCQkJCQkJCXRydWUpOwotLy8vLwkJCQkJCQlyZWZyZXNoVmlld3MoKTsKLS8vLy8JCQkJCQl9Ci0vLy8vCQkJCQl9Ci0vLwkJCQkJCi0vLwkJCQkJLy8gcGx1Z2luL2NvbmZpZyBmb2xkZXIKLS8vCQkJCQkvLwotLy8JCQkJCUlMaWJyYXJ5UGVyc2lzdGVyIHBlcnNpc3RlciA9IExpYnJhcnlTZXJ2aWNlVXRpbC5nZXRDdXJyZW50UGVyc2lzdGVyKCk7Ci0vLwkJCQkJaWYocGVyc2lzdGVyIGluc3RhbmNlb2YgSUZpbGVCYXNlZExpYnJhcnlQZXJzaXN0ZXIpIHsKLS8vCQkJCQkJSUZpbGVCYXNlZExpYnJhcnlQZXJzaXN0ZXIgZmlsZVBlcnNpc3RlciA9IChJRmlsZUJhc2VkTGlicmFyeVBlcnNpc3RlcikgcGVyc2lzdGVyOwotLy8JCQkJCQlNZXRob2RMaWJyYXJ5IGxpYnJhcnkgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCk7Ci0vLwkJCQkJCXRyeSB7Ci0vLwkJCQkJCQlGaWxlIGZpbGUgPSBmaWxlUGVyc2lzdGVyLmNyZWF0ZU1ldGhvZFBsdWdpbkZvbGRlcigicGx1Z2luMTAwIiwgbGlicmFyeSk7Ci0vLwkJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oInBsdWdpbiBkaXI6ICIgKyBmaWxlKTsKLS8vCQkJCQkJfQotLy8JCQkJCQljYXRjaChFeGNlcHRpb24gZSkgewotLy8JCQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLS8vCQkJCQkJfQotLy8JCQkJCQl0cnkgewotLy8JCQkJCQkJRmlsZSBmaWxlID0gZmlsZVBlcnNpc3Rlci5nZXREZWZhdWx0TWV0aG9kQ29uZmlndXJhdGlvbkZvbGRlcihsaWJyYXJ5KTsKLS8vCQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiY29uZmlnIGRpcjogIiArIGZpbGUpOwotLy8JCQkJCQl9Ci0vLwkJCQkJCWNhdGNoKEV4Y2VwdGlvbiBlKSB7Ci0vLwkJCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotLy8JCQkJCQl9Ci0vLwkJCQkJfQotLy8JCQkJfQotLy8JCQl9KTsKLQkJCQotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnMuTGlicmFyeUFjdGlvbkJhckNvbnRyaWJ1dG9yI3JlZnJlc2hWaWV3ZXIob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXIpCi0JCSAqLwotCQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoVmlld2VyKGZpbmFsIFZpZXdlciB2aWV3ZXIpIHsKLQkJCWlmICh2aWV3ZXIgPT0gTGlicmFyeVZpZXcudGhpcy5nZXRWaWV3ZXIoKSkgewotCQkJCUlSdW5uYWJsZVdpdGhQcm9ncmVzcyBydW5uYWJsZSA9IG5ldyBJUnVubmFibGVXaXRoUHJvZ3Jlc3MoKSB7Ci0KLQkJCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLQkJCQkJCQl0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwKLQkJCQkJCQlJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCQkJCQltb25pdG9yLmJlZ2luVGFzaygiIiwgMyk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCW1vbml0b3IKLQkJCQkJCQkJLnN1YlRhc2soQXV0aG9yaW5nVUlSZXNvdXJjZXMuX1VJX1JlZnJlc2hWaWV3ZXJfbWVudV9pdGVtKTsKLQkJCQkJCW1vbml0b3Iud29ya2VkKDEpOwotCQkJCQkJdHJ5IHsKLQkJCQkJCQkvLyBSZWZyZXNoIGFsbCBsb2FkZWQgcmVzb3VyY2VzIGFuZCBsb2FkIG5ld2x5IGFkZGVkIHJlc291cmNlcwotCQkJCQkJCS8vCi0JCQkJCQkJSUxpYnJhcnlNYW5hZ2VyIG1hbmFnZXIgPSAoSUxpYnJhcnlNYW5hZ2VyKSBMaWJyYXJ5U2VydmljZQotCQkJCQkJCQkJLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudExpYnJhcnlNYW5hZ2VyKCk7Ci0JCQkJCQkJaWYgKG1hbmFnZXIgIT0gbnVsbCkgewotCQkJCQkJCQlSZXNvdXJjZVNldCByZXNvdXJjZVNldCA9IG1hbmFnZXIKLQkJCQkJCQkJCQkuZ2V0RWRpdGluZ0RvbWFpbigpLmdldFJlc291cmNlU2V0KCk7Ci0JCQkJCQkJCUlMaWJyYXJ5UmVzb3VyY2VTZXQgbGliUmVzb3VyY2VTZXQ7Ci0JCQkJCQkJCWlmIChyZXNvdXJjZVNldCBpbnN0YW5jZW9mIElMaWJyYXJ5UmVzb3VyY2VTZXQKLQkJCQkJCQkJCQkmJiAobGliUmVzb3VyY2VTZXQgPSAoSUxpYnJhcnlSZXNvdXJjZVNldCkgcmVzb3VyY2VTZXQpCi0JCQkJCQkJCQkJCQkuZ2V0UGVyc2lzdGVuY2VUeXBlKCkKLQkJCQkJCQkJCQkJCS5lcXVhbHMoCi0JCQkJCQkJCQkJCQkJCVNlcnZpY2VzLlhNSV9QRVJTSVNURU5DRV9UWVBFKSkgewotCQkJCQkJCQkJCi0JCQkJCQkJCQlsaWJSZXNvdXJjZVNldC5sb2FkTmV3UmVzb3VyY2VzKCk7Ci0JCQkJCQkJCQkKLQkJCQkJCQkJCUxpc3QgcmVtb3ZlZFJlc291cmNlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJCQkJCUxpc3QgY2hhbmdlZFJlc291cmNlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IG5ldyBBcnJheUxpc3QoCi0JCQkJCQkJCQkJCXJlc291cmNlU2V0LmdldFJlc291cmNlcygpKQotCQkJCQkJCQkJCQkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSAoUmVzb3VyY2UpIGl0ZXIKLQkJCQkJCQkJCQkJCS5uZXh0KCk7Ci0JCQkJCQkJCQkJU3RyaW5nIGxvYyA9IHJlc291cmNlLmdldFVSSSgpCi0JCQkJCQkJCQkJCQkudG9GaWxlU3RyaW5nKCk7Ci0JCQkJCQkJCQkJSVJlc291cmNlIHdzUmVzID0gRmlsZU1hbmFnZXIKLQkJCQkJCQkJCQkJCS5nZXRSZXNvdXJjZUZvckxvY2F0aW9uKGxvYyk7Ci0JCQkJCQkJCQkJaWYgKHdzUmVzID09IG51bGwpIHsKLQkJCQkJCQkJCQkJcmVtb3ZlZFJlc291cmNlcy5hZGQocmVzb3VyY2UpOwotCQkJCQkJCQkJCX0gZWxzZSBpZiAoIXdzUmVzCi0JCQkJCQkJCQkJCQkuaXNTeW5jaHJvbml6ZWQoSVJlc291cmNlLkRFUFRIX1pFUk8pKSB7Ci0JCQkJCQkJCQkJCWNoYW5nZWRSZXNvdXJjZXMuYWRkKHJlc291cmNlKTsKLQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCQltb25pdG9yLndvcmtlZCgyKTsKLQkJCQkJCQkJCWlmIChyZW1vdmVkUmVzb3VyY2VzLmlzRW1wdHkoKQotCQkJCQkJCQkJCQkmJiBjaGFuZ2VkUmVzb3VyY2VzLmlzRW1wdHkoKSkgewotCQkJCQkJCQkJCXZpZXdlci5yZWZyZXNoKCk7Ci0JCQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQkJCWRvUmVmcmVzaChyZW1vdmVkUmVzb3VyY2VzLAotCQkJCQkJCQkJCQkJY2hhbmdlZFJlc291cmNlcywgbnVsbCwgZmFsc2UpOwotCQkJCQkJCQkJfQotCQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQkJdmlld2VyLnJlZnJlc2goKTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0gZmluYWxseSB7Ci0JCQkJCQkJbW9uaXRvci5kb25lKCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQotCQkJCX07Ci0JCQkJSVJ1bm5hYmxlQ29udGV4dCBjb250ZXh0ID0gbmV3IFByb2dyZXNzTW9uaXRvckRpYWxvZyhnZXRTaXRlKCkKLQkJCQkJCS5nZXRTaGVsbCgpKTsKLQkJCQl0cnkgewotCQkJCQlnZXRTaXRlKCkuZ2V0V29ya2JlbmNoV2luZG93KCkuZ2V0V29ya2JlbmNoKCkKLQkJCQkJCQkuZ2V0UHJvZ3Jlc3NTZXJ2aWNlKCkucnVuSW5VSShjb250ZXh0LCBydW5uYWJsZSwKLQkJCQkJCQkJCW51bGwpOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCQkJU3RyaW5nIHRpdGxlID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuUHJvY2Vzc0VkaXRvcl9yZWZyZXNoRXJyb3JUaXRsZTsKLQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpLmRpc3BsYXlFcnJvcigKLQkJCQkJCQl0aXRsZSwgZS50b1N0cmluZygpLCBlKTsKLQkJCQl9Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJc3VwZXIucmVmcmVzaFZpZXdlcih2aWV3ZXIpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnZpZXdzLkFic3RyYWN0QmFzZVZpZXcjY3JlYXRlQWN0aW9uQmFyQ29udHJpYnV0b3IoKQotCSAqLwotCXB1YmxpYyBJTGlicmFyeUFjdGlvbkJhckNvbnRyaWJ1dG9yIGNyZWF0ZUFjdGlvbkJhckNvbnRyaWJ1dG9yKCkgewotCQlJTGlicmFyeUFjdGlvbkJhckNvbnRyaWJ1dG9yIGFjdGlvbkJhciA9IG5ldyBMaWJyYXJ5Vmlld0FjdGlvbkJhckNvbnRyaWJ1dG9yKAotCQkJCWVkaXRpbmdEb21haW4pOwotCQlyZXR1cm4gYWN0aW9uQmFyOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS52aWV3cy5BYnN0cmFjdEJhc2VWaWV3I2NyZWF0ZUNvbnRleHRNZW51Rm9yKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFZpZXdlcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250ZXh0TWVudUZvcihmaW5hbCBTdHJ1Y3R1cmVkVmlld2VyIHZpZXdlcikgewotCQlzdXBlci5jcmVhdGVDb250ZXh0TWVudUZvcih2aWV3ZXIpOwotCQlpbnQgZG5kT3BlcmF0aW9ucyA9IERORC5EUk9QX01PVkUgfCBETkQuRFJPUF9DT1BZIHwgRE5ELkRST1BfTElOSzsKLQkJVHJhbnNmZXJbXSB0cmFuc2ZlcnMgPSBuZXcgVHJhbnNmZXJbXSB7IEhUTUxUcmFuc2Zlci5nZXRJbnN0YW5jZSgpLAotCQkJCVRleHRUcmFuc2Zlci5nZXRJbnN0YW5jZSgpLCBMb2NhbFRyYW5zZmVyLmdldEluc3RhbmNlKCkgfTsKLQkJdmlld2VyLmFkZERyYWdTdXBwb3J0KGRuZE9wZXJhdGlvbnMsIHRyYW5zZmVycywKLQkJCQluZXcgTGlicmFyeVZpZXdlckRyYWdBZGFwdGVyKHZpZXdlcikpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS52aWV3cy5BYnN0cmFjdEJhc2VWaWV3I21lbnVBYm91dFRvU2hvdyhvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVNYW5hZ2VyKQotCSAqLwotCXB1YmxpYyB2b2lkIG1lbnVBYm91dFRvU2hvdyhJTWVudU1hbmFnZXIgbWVudU1hbmFnZXIpIHsKLQkJc3VwZXIubWVudUFib3V0VG9TaG93KG1lbnVNYW5hZ2VyKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBhcnQuVmlld1BhcnQjaW5pdChvcmcuZWNsaXBzZS51aS5JVmlld1NpdGUpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJVmlld1NpdGUgc2l0ZSkgdGhyb3dzIFBhcnRJbml0RXhjZXB0aW9uIHsKLQkJc3VwZXIuaW5pdChzaXRlKTsKLQkKLQkJLy8gYWRkIHByb3BlcnR5IGNoYW5nZSBsaXN0ZW5lciBmb3IgbGlicmFyeSB2YWxpZGF0aW9uIHByZWZlcmVuY2UKLQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpCi0JCQkJLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIobmV3IElQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQkJCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZShQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJCQlpZiAoZXZlbnQKLQkJCQkJCQkJLmdldFByb3BlcnR5KCkKLQkJCQkJCQkJLmVxdWFscygKLQkJCQkJCQkJCQlBdXRob3JpbmdVSVByZWZlcmVuY2VzLkVOQUJMRV9MSUJSQVJZX1ZBTElEQVRJT04pKSB7Ci0JCQkJCQkJQm9vbGVhbiBlbmFibGVkID0gKEJvb2xlYW4pIGV2ZW50LmdldE5ld1ZhbHVlKCk7Ci0JCQkJCQkJSVRvb2xCYXJNYW5hZ2VyIHRvb2xCYXJNYW5hZ2VyID0gZ2V0Vmlld1NpdGUoKQotCQkJCQkJCQkuZ2V0QWN0aW9uQmFycygpLmdldFRvb2xCYXJNYW5hZ2VyKCk7Ci0JCQkJCQotCQkJCQkJCWlmIChlbmFibGVkICE9IG51bGwgJiYgZW5hYmxlZC5ib29sZWFuVmFsdWUoKSkgewotCQkJCQkJCQlwZXJmb3JtTGlicmFyeVZhbGlkYXRpb25BY3Rpb24KLQkJCQkJCQkJCQkuc2V0SWQoUEVSRk9STV9JRCk7Ci0JCQkJCQkJCXRvb2xCYXJNYW5hZ2VyLmluc2VydEFmdGVyKCJhZGRpdGlvbnMiLCBwZXJmb3JtTGlicmFyeVZhbGlkYXRpb25BY3Rpb24pOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJSUNvbnRyaWJ1dGlvbkl0ZW1bXSBpdGVtcyA9IHRvb2xCYXJNYW5hZ2VyLmdldEl0ZW1zKCk7Ci0JCQkJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHsKLQkJCQkJCQkJCUlDb250cmlidXRpb25JdGVtIGl0ZW0gPSAoSUNvbnRyaWJ1dGlvbkl0ZW0pIGl0ZW1zW2ldOwotCQkJCQkJCQkJaWYgKGl0ZW0uZ2V0SWQoKS5lcXVhbHMoUEVSRk9STV9JRCkpCi0JCQkJCQkJCQkJdG9vbEJhck1hbmFnZXIucmVtb3ZlKGl0ZW0pOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJCXRvb2xCYXJNYW5hZ2VyLnVwZGF0ZSh0cnVlKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0pOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS52aWV3cy5BYnN0cmFjdEJhc2VWaWV3I2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCVJlZnJlc2hKb2IuZ2V0SW5zdGFuY2UoKS5zZXRSZWZyZXNoSGFuZGxlcihudWxsKTsKLQotCQlpZiAoZkxheW91dEFjdGlvblNldCAhPSBudWxsKQkKLQkJCWZMYXlvdXRBY3Rpb25TZXQuZGlzcG9zZSgpOwotCi0JCXN1cGVyLmRpc3Bvc2UoKTsKLQkJaWYgKGRvdWJsZUNsaWNrTGlzdGVuZXIgIT0gbnVsbCkgewotCQkJdHJlZVZpZXdlci5yZW1vdmVEb3VibGVDbGlja0xpc3RlbmVyKGRvdWJsZUNsaWNrTGlzdGVuZXIpOwotCQl9Ci0JCQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBvYmoKLQkgKiAgICAgICAgICAgIEl0ZW1Qcm92aWRlcgotCSAqIEByZXR1cm4gUHJvY2Vzc0NvbXBvbmVudCBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIG9iagotCSAqLwotCXB1YmxpYyBQcm9jZXNzQ29tcG9uZW50IGdldFByb2Nlc3NDb21wb25lbnQoT2JqZWN0IG9iaikgewotCQlPYmplY3QgcGFyZW50OwotCQlmb3IgKHBhcmVudCA9IG9iajsgKHBhcmVudCAhPSBudWxsICYmICEocGFyZW50IGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkpOykgewotCQkJSXRlbVByb3ZpZGVyQWRhcHRlciBhZGFwdGVyID0gKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIGFkYXB0ZXJGYWN0b3J5Ci0JCQkJCS5hZGFwdChwYXJlbnQsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCQlwYXJlbnQgPSBhZGFwdGVyLmdldFBhcmVudChwYXJlbnQpOwotCQl9Ci0JCXJldHVybiAoUHJvY2Vzc0NvbXBvbmVudCkgcGFyZW50OwotCX0KLQotCXByaXZhdGUgc3RhdGljIGFic3RyYWN0IGNsYXNzIFN0YXR1c1dvcmtzcGFjZU1vZGlmeU9wZXJhdGlvbiBleHRlbmRzCi0JCQlXb3Jrc3BhY2VNb2RpZnlPcGVyYXRpb24gewotCi0JCXByb3RlY3RlZCBTdHJpbmcgZXJyTXNnOwotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0RXJyb3JNZXNzYWdlKCkgewotCQkJcmV0dXJuIGVyck1zZzsKLQkJfQotCX0KLQotCS8qKgotCSAqIG9wZW5zIGEgTWV0aG9kIExpYnJhcnkKLQkgKiAKLQkgKiBAcGFyYW0gcGF0aAotCSAqICAgICAgICAgICAgcGF0aCB0byB0aGUgbGlicmFyeQotCSAqLwotCXB1YmxpYyB2b2lkIG9wZW5MaWJyYXJ5KGZpbmFsIFN0cmluZyBwYXRoKSB7Ci0JCS8vIERvIHRoZSB3b3JrIHdpdGhpbiBhbiBvcGVyYXRpb24gYmVjYXVzZSB0aGlzIGlzIGEgbG9uZyBydW5uaW5nCi0JCS8vIGFjdGl2aXR5IHRoYXQgbW9kaWZpZXMgdGhlIHdvcmtiZW5jaC4KLQkJU3RhdHVzV29ya3NwYWNlTW9kaWZ5T3BlcmF0aW9uIG9wZXJhdGlvbiA9IG5ldyBTdGF0dXNXb3Jrc3BhY2VNb2RpZnlPcGVyYXRpb24oKSB7Ci0KLQkJCS8vIFRoaXMgaXMgdGhlIG1ldGhvZCB0aGF0IGdldHMgaW52b2tlZCB3aGVuIHRoZSBvcGVyYXRpb24gcnVucy4KLQkJCXB1YmxpYyB2b2lkIGV4ZWN1dGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCQkJbW9uaXRvci5iZWdpblRhc2soQXV0aG9yaW5nVUlSZXNvdXJjZXMub3BlbmluZ0xpYnJhcnlUYXNrX25hbWUsCi0JCQkJCQkyKTsKLQkJCQl0cnkgewotCQkJCQltb25pdG9yLndvcmtlZCgxKTsKLQkJCQkJTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5jbG9zZUN1cnJlbnRNZXRob2RMaWJyYXJ5KCk7Ci0JCQkJCU1ldGhvZExpYnJhcnkgbGlicmFyeSA9IFhNSUxpYnJhcnlVdGlsCi0JCQkJCQkJLm9wZW5NZXRob2RMaWJyYXJ5KHBhdGgpOwotCQkJCQlMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLnNldEN1cnJlbnRNZXRob2RMaWJyYXJ5KAotCQkJCQkJCWxpYnJhcnkpOwotCQkJCQlMaWJyYXJ5VUlQcmVmZXJlbmNlcy5zZXRTYXZlZExpYnJhcnlQYXRoKHBhdGgpOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJCQlpZiAoZXggaW5zdGFuY2VvZiBJT0V4Y2VwdGlvbikgewotCQkJCQkJU3RyaW5nIG1lc3NhZ2UgPSBleC5nZXRNZXNzYWdlKCk7Ci0JCQkJCQlpZiAobWVzc2FnZS5zdGFydHNXaXRoKCIjIyMiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCQkJU3RyaW5nIHByb2plY3RGaWxlTmFtZSA9IG1lc3NhZ2Uuc3Vic3RyaW5nKDMpOwotCQkJCQkJCVN0cmluZyBwcm9tcHQgPSBBdXRob3JpbmdVSVJlc291cmNlcy5iaW5kKAotCQkJCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuRWxlbWVudHNWaWV3XzM1LAotCQkJCQkJCQkJKG5ldyBPYmplY3RbXSB7IHByb2plY3RGaWxlTmFtZSB9KSk7Ci0JCQkJCQkJaWYgKE1zZ0JveC5wcm9tcHQocHJvbXB0LCBTV1QuUkVUUlkgfCBTV1QuQ0FOQ0VMKSA9PSBTV1QuUkVUUlkpIHsKLQkJCQkJCQkJb3BlbkxpYnJhcnkocGF0aCk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9IGVsc2UgewotCQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4KLQkJCQkJCQkJLmdldERlZmF1bHQoKQotCQkJCQkJCQkuZ2V0TXNnRGlhbG9nKCkKLQkJCQkJCQkJLmRpc3BsYXlFcnJvcigKLQkJCQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5lcnJvckRpYWxvZ190aXRsZSwKLQkJCQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5vcGVuTGlicmFyeUVycm9yX21zZywKLQkJCQkJCQkJCQlleCk7Ci0JCQkJCX0KLQkJCQl9IGZpbmFsbHkgewotCQkJCQltb25pdG9yLmRvbmUoKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0KLQkJdHJ5IHsKLQkJCS8vIFRoaXMgcnVucyB0aGUgb3B0aW9ucywgYW5kIHNob3dzIHByb2dyZXNzLgotCQkJbmV3IFByb2dyZXNzTW9uaXRvckRpYWxvZyhnZXRTaXRlKCkuZ2V0U2hlbGwoKSkucnVuKHRydWUsIGZhbHNlLAotCQkJCQlvcGVyYXRpb24pOwotCQkJaWYgKG9wZXJhdGlvbi5nZXRFcnJvck1lc3NhZ2UoKSA9PSBudWxsKSB7Ci0JCQkJZ2V0U2l0ZSgpLmdldFBhZ2UoKS5jbG9zZUFsbEVkaXRvcnMoZmFsc2UpOwotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnZpZXdzLkFic3RyYWN0QmFzZVZpZXcjaGFuZGxlQWN0aXZhdGUob3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlQWN0aXZhdGUoSVdvcmtiZW5jaFBhcnQgcGFydCkgewotCQlzdXBlci5oYW5kbGVBY3RpdmF0ZShwYXJ0KTsKLQotCQkvLyBUT0RPOiBSZXZpZXcgaW1wbGVtZW50YXRpb24uCi0JCS8vIE1ha2Ugc3VyZSB0aGF0IHRoZSBtZXRob2QgbGlicmFyeSBvcGVuIGlzIG5vdCBjbG9zZWQuCi0JCVhNSUxpYnJhcnlVdGlsLm9wZW5NZXRob2RMaWJyYXJ5UHJvamVjdChMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCksIGdldFZpZXdTaXRlKCkuZ2V0QWN0aW9uQmFycygpCi0JCQkJLmdldFN0YXR1c0xpbmVNYW5hZ2VyKCkuZ2V0UHJvZ3Jlc3NNb25pdG9yKCkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS52aWV3cy5TYXZlYWJsZUxpYnJhcnlWaWV3UGFydCNpc1NhdmVBc0FsbG93ZWQoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2F2ZUFzQWxsb3dlZCgpIHsKLQkJLy8gVGhpcyB2aWV3IHNob3VsZCBub3QgcGFydGljaXBhdGUgaW4gYWxsIHRoZSBzYXZlIGNvbW1hbmRzLgotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnZpZXdzLlNhdmVhYmxlTGlicmFyeVZpZXdQYXJ0I2RvU2F2ZUFzKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkb1NhdmVBcygpIHsKLQl9Ci0JCi0JLyoqCi0JICogVXNlZCBieSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnMuTGlua1dpdGhFZGl0b3IgR2l2ZW4gYW4KLQkgKiBvYmplY3QgdGhhdCBpcyBhIE1ldGhvZEVsZW1lbnQsIHNlbGVjdHMgdGhhdCBvYmplY3QgaW4gdGhlIExpYiBOYXYKLQkgKiAKLQkgKiBAcGFyYW0gbwotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNlbGVjdGlvblRvVmlld2VyKE9iamVjdCBvYmplY3QpIHsKLQkJT2JqZWN0IG8gPSBUbmdVdGlsLnVud3JhcChvYmplY3QpOwotCQlpZiAoIShvIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkpCi0JCQlyZXR1cm47Ci0JCWlmIChvIGluc3RhbmNlb2YgTWV0aG9kQ29uZmlndXJhdGlvbikgewotCQkJc3VwZXIuc2V0U2VsZWN0aW9uVG9WaWV3ZXIoQXJyYXlzLmFzTGlzdChuZXcgT2JqZWN0W10geyBvIH0pKTsKLQkJCXJldHVybjsKLQkJfQotCQl0cnkgewotCQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IFVtYVV0aWwuZ2V0TWV0aG9kUGx1Z2luKChNZXRob2RFbGVtZW50KSBvKTsKLQotCQkJTWV0aG9kUGx1Z2luSXRlbVByb3ZpZGVyIHBsdWdpbkFkYXB0ZXIgPSAoTWV0aG9kUGx1Z2luSXRlbVByb3ZpZGVyKSBUbmdVdGlsCi0JCQkJCS5nZXRBZGFwdGVyKHBsdWdpbiwgTWV0aG9kUGx1Z2luSXRlbVByb3ZpZGVyLmNsYXNzKTsKLQotCQkJTWV0aG9kTGlicmFyeUl0ZW1Qcm92aWRlciBsaWJyYXJ5QWRhcHRlciA9IChNZXRob2RMaWJyYXJ5SXRlbVByb3ZpZGVyKSBUbmdVdGlsCi0JCQkJCS5nZXRBZGFwdGVyKExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKSwgTWV0aG9kTGlicmFyeUl0ZW1Qcm92aWRlci5jbGFzcyk7Ci0KLQkJCS8vIGV4cGFuZCBwbHVnaW4gcGFja2FnZXMKLQkJCUl0ZW1Qcm92aWRlckFkYXB0ZXIgcGx1Z2luVHJlZUFkYXB0ZXIgPSBsaWJyYXJ5QWRhcHRlci5nZXRQbHVnaW5JdGVtUHJvdmlkZXIocGx1Z2luKTsKLQkJCXdoaWxlIChwbHVnaW5UcmVlQWRhcHRlciBpbnN0YW5jZW9mIFBsdWdpblVJUGFja2FnZXNJdGVtUHJvdmlkZXIpIHsKLQkJCQl0cmVlVmlld2VyLnNldEV4cGFuZGVkU3RhdGUocGx1Z2luVHJlZUFkYXB0ZXIsIHRydWUpOwotCQkJCXBsdWdpblRyZWVBZGFwdGVyID0gKChQbHVnaW5VSVBhY2thZ2VzSXRlbVByb3ZpZGVyKXBsdWdpblRyZWVBZGFwdGVyKS5nZXRQbHVnaW5JdGVtUHJvdmlkZXIocGx1Z2luKTsKLQkJCX0KLQkJCXRyZWVWaWV3ZXIuc2V0RXhwYW5kZWRTdGF0ZShwbHVnaW4sIHRydWUpOwotCi0JCQkKLQkJCWlmIChvIGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudCkgewkJCQkKLQkJCQlQcm9jZXNzIHByb2MgPSBUbmdVdGlsLmdldE93bmluZ1Byb2Nlc3MoKEJyZWFrZG93bkVsZW1lbnQpbyk7Ci0JCQkJaWYocHJvYyAhPSBudWxsKSB7Ci0JCQkJCW8gPSBwcm9jLmVDb250YWluZXIoKTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAobyBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQgfHwgbyBpbnN0YW5jZW9mIFByb2Nlc3NQYWNrYWdlKSB7Ci0KLQkJCQl0cmVlVmlld2VyLnNldEV4cGFuZGVkU3RhdGUocGx1Z2luQWRhcHRlci5nZXRDaGlsZHJlbihwbHVnaW4pCi0JCQkJCQkudG9BcnJheSgpWzFdLCB0cnVlKTsKLQkJCQkvLyBFeHBhbmQgdGhlIHByb2Nlc3MgcGFja2FnZXMuCi0JCQkJZXhwYW5kVHJlZVZpZXdlclBhY2thZ2VzKCgoTWV0aG9kRWxlbWVudCkgbykuZUNvbnRhaW5lcigpKTsKLQotCQkJfSBlbHNlIHsKLQkJCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIgbWV0aG9kQ29udGVudFBrZyA9IChJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIpIHBsdWdpbkFkYXB0ZXIKLQkJCQkJCS5nZXRDaGlsZHJlbihwbHVnaW4pLnRvQXJyYXkoKVswXTsKLQkJCQl0cmVlVmlld2VyLnNldEV4cGFuZGVkU3RhdGUobWV0aG9kQ29udGVudFBrZywgdHJ1ZSk7Ci0KLQkJCQlpZiAobyBpbnN0YW5jZW9mIEN1c3RvbUNhdGVnb3J5KSB7CQkJCQkKLQkJCQkJQ3VzdG9tQ2F0ZWdvcnkgcm9vdENDID0gVG5nVXRpbAotCQkJCQkJCS5nZXRSb290Q3VzdG9tQ2F0ZWdvcnkocGx1Z2luKTsKLQkJCQkJCQkJCQkKLQkJCQkJLy8gZmluZCB0aGUgdHJlZSBwYXRoIHRvIHRoZSBjdXN0b20gY2F0ZWdvcnkgZnJvbSB0aGUgcm9vdCBjdXN0b20gY2F0ZWdvcnkKLQkJCQkJLy8KLQkJCQkJZmluYWwgTGlzdDxPYmplY3Q+IHRyZWVQYXRoID0gbmV3IEFycmF5TGlzdDxPYmplY3Q+KCk7Ci0JCQkJCWZvcihDdXN0b21DYXRlZ29yeSBjYyA9IChDdXN0b21DYXRlZ29yeSkgbzsgY2MgIT0gcm9vdENDOykgewotCQkJCQkJdHJlZVBhdGguYWRkKDAsIGNjKTsKLQkJCQkJCWNjID0gKEN1c3RvbUNhdGVnb3J5KSBBc3NvY2lhdGlvbkhlbHBlci5nZXRDdXN0b21DYXRlZ29yaWVzKGNjKS5nZXQoMCk7CQkJCQkJIAotCQkJCQl9Ci0JCQkJCQotCQkJCQlvID0gZXhwYW5kVHJlZShyb290Q0MsIHRyZWVQYXRoKTsKLQkJCQkJCi0JCQkJfSBlbHNlIGlmIChvIGluc3RhbmNlb2YgQ29udGVudENhdGVnb3J5KSB7Ci0JCQkJCU9iamVjdCBzdGRDYXRzID0gbWV0aG9kQ29udGVudFBrZy5nZXRDaGlsZHJlbihvKS50b0FycmF5KClbMV07Ci0JCQkJCQkJCQotCQkJCQkvLyBmaW5kIHRoZSB0cmVlIHBhdGggdG8gdGhlIGNhdGVnb3J5IGZyb20gdGhlIHJvb3QgIlN0YW5kYXJkIENhdGVnb3JpZXMiIGNhdGVnb3J5Ci0JCQkJCS8vCi0JCQkJCWZpbmFsIExpc3Q8T2JqZWN0PiB0cmVlUGF0aCA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PigpOwotCQkJCQlpZiAobyBpbnN0YW5jZW9mIERpc2NpcGxpbmUpIHsKLQkJCQkJCS8vIGRpc2NpcGxpbmVzIGNhbiBuZXN0Ci0JCQkJCQlPYmplY3QgZGlzID0gbzsKLQkJCQkJCWRvIHsKLQkJCQkJCQl0cmVlUGF0aC5hZGQoMCwgZGlzKTsKLQkJCQkJCQlMaXN0IHBhcmVudERpc2MgPSBBc3NvY2lhdGlvbkhlbHBlci5nZXREaXNjaXBsaW5lKChEaXNjaXBsaW5lKWRpcyk7Ci0JCQkJCQkJaWYgKHBhcmVudERpc2MuaXNFbXB0eSgpKSBicmVhazsKLQkJCQkJCQlkaXMgPSBwYXJlbnREaXNjLmdldCgwKTsJCQkJCQkgCi0JCQkJCQl9IHdoaWxlICh0cnVlKTsKLQkJCQkJCS8vIGdldCBkaXNjaXBsaW5lIGdyb3VwCi0JCQkJCQlpZiAoIUFzc29jaWF0aW9uSGVscGVyLmdldERpc2NpcGxpbmVHcm91cHMoKERpc2NpcGxpbmUpZGlzKS5pc0VtcHR5KCkpIHsKLQkJCQkJCQlEaXNjaXBsaW5lR3JvdXBpbmcgZGcgPSAoRGlzY2lwbGluZUdyb3VwaW5nKSBBc3NvY2lhdGlvbkhlbHBlci5nZXREaXNjaXBsaW5lR3JvdXBzKChEaXNjaXBsaW5lKWRpcykuZ2V0KDApOwotCQkJCQkJCXRyZWVQYXRoLmFkZCgwLCBkZyk7Ci0JCQkJCQl9Ci0JCQkJCQkvLyBnZXQgIkRpc2NpcGxpbmVzIgotCQkJCQkJdHJlZVBhdGguYWRkKDAsIFRuZ1V0aWwuZ2V0RGlzY2lwbGluZUNhdGVnb3JpZXNJdGVtUHJvdmlkZXIocGx1Z2luKSk7Ci0JCQkJCQlvID0gZXhwYW5kVHJlZShzdGRDYXRzLCB0cmVlUGF0aCk7Ci0JCQkJCX0gZWxzZSBpZiAobyBpbnN0YW5jZW9mIFJvbGVTZXQpIHsKLQkJCQkJCS8vIHJvbGVzZXRzIGNhbm5vdCBuZXN0Ci0JCQkJCQl0cmVlUGF0aC5hZGQoMCwgbyk7Ci0JCQkJCQlSb2xlU2V0R3JvdXBpbmcgcnNnID0gKFJvbGVTZXRHcm91cGluZykgQXNzb2NpYXRpb25IZWxwZXIuZ2V0Um9sZVNldEdyb3VwcygoUm9sZVNldClvKS5nZXQoMCk7CQkJCQkJIAotCQkJCQkJdHJlZVBhdGguYWRkKDAsIHJzZyk7Ci0JCQkJCQkvLyBnZXQgIlJvbGVTZXRzIgotCQkJCQkJdHJlZVBhdGguYWRkKDAsIFRuZ1V0aWwuZ2V0Um9sZVNldHNJdGVtUHJvdmlkZXIocGx1Z2luKSk7Ci0JCQkJCQlvID0gZXhwYW5kVHJlZShzdGRDYXRzLCB0cmVlUGF0aCk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQl0cmVlVmlld2VyLnNldEV4cGFuZGVkU3RhdGUoc3RkQ2F0cywgdHJ1ZSk7Ci0JCQkJCX0KLQotCQkJCX0gZWxzZSB7Ci0JCQkJCU9iamVjdCBjb3JlQ29udGVudCA9IG1ldGhvZENvbnRlbnRQa2cuZ2V0Q2hpbGRyZW4obykKLQkJCQkJCQkudG9BcnJheSgpWzBdOwotCQkJCQl0cmVlVmlld2VyLnNldEV4cGFuZGVkU3RhdGUoY29yZUNvbnRlbnQsIHRydWUpOwotCi0JCQkJCS8vIEV4cGFuZCB0aGUgY29udGVudCBwYWNrYWdlcy4KLQkJCQkJZXhwYW5kVHJlZVZpZXdlclBhY2thZ2VzKCgoTWV0aG9kRWxlbWVudCkgbykuZUNvbnRhaW5lcigpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGV4KTsKLQkJfQotCi0JCXN1cGVyLnNldFNlbGVjdGlvblRvVmlld2VyKEFycmF5cy5hc0xpc3QobmV3IE9iamVjdFtdIHsgbyB9KSk7Ci0KLQkJaWYobyBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQgJiYgb2JqZWN0IGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudCkgewotCQkJLy8gb3BlbiB0aGUgcHJvY2VzcyBpbiBpdHMgZWRpdG9yIGFuZCBzZWxlY3QgdGhlIGJyZWFrZG93biBlbGVtZW50Ci0JCQkvLwotCQkJSUVkaXRvcktlZXBlci5SRUZFUkVOQ0UuZ2V0RWRpdG9yS2VlcGVyKCkub3BlbkVkaXRvcihvKTsKLQkJCUlFZGl0b3JQYXJ0IGVkaXRvciA9IGdldFNpdGUoKS5nZXRQYWdlKCkuZmluZEVkaXRvcihuZXcgTWV0aG9kRWxlbWVudEVkaXRvcklucHV0KChNZXRob2RFbGVtZW50KSBvKSk7Ci0JCQlpZihlZGl0b3IgaW5zdGFuY2VvZiBQcm9jZXNzRWRpdG9yKSB7Ci0JCQkJUHJvY2Vzc0VkaXRvciBwcm9jRWRpdG9yID0gKChQcm9jZXNzRWRpdG9yKWVkaXRvcik7Ci0JCQkJU3RyaW5nIHBhZ2VJZDsKLQkJCQlpZihvYmplY3QgaW5zdGFuY2VvZiBSb2xlRGVzY3JpcHRvciB8fCBvYmplY3QgaW5zdGFuY2VvZiBUZWFtUHJvZmlsZSkgewotCQkJCQlwYWdlSWQgPSBQcm9jZXNzRWRpdG9yLlRBX0ZPUk1fSUQ7Ci0JCQkJfQotCQkJCWVsc2UgaWYob2JqZWN0IGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yKSB7Ci0JCQkJCXBhZ2VJZCA9IFByb2Nlc3NFZGl0b3IuV1BCU19GT1JNX0lEOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJcGFnZUlkID0gUHJvY2Vzc0VkaXRvci5XQlNfRk9STV9JRDsKLQkJCQl9Ci0JCQkJcHJvY0VkaXRvci5zZXRBY3RpdmVQYWdlKHBhZ2VJZCk7Ci0JCQkJcHJvY0VkaXRvci5zZXRTZWxlY3Rpb25Ub1ZpZXdlcihDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KG9iamVjdCkpOwotCQkJfQotCQl9Ci0JfQotCQotCXByaXZhdGUgT2JqZWN0IGV4cGFuZFRyZWUoT2JqZWN0IHJvb3QsIExpc3QgdHJlZVBhdGgpIHsKLQkJT2JqZWN0IHBhcmVudCA9IHJvb3Q7Ci0JCWludCBzaXplID0gdHJlZVBhdGguc2l6ZSgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJT2JqZWN0IGUgPSB0cmVlUGF0aC5nZXQoaSk7Ci0JCQl0cmVlVmlld2VyLnNldEV4cGFuZGVkU3RhdGUocGFyZW50LCB0cnVlKTsKLQkJCS8vIGdldCB3cmFwcGVyCi0JCQkvLwotCQkJTGlzdCBub3RpZnlDaGFuZ2VkTGlzdGVuZXJzID0gVG5nVXRpbC5nZXROb3RpZnlDaGFuZ2VkTGlzdGVuZXJzKGFkYXB0ZXJGYWN0b3J5LCBlKTsKLQkJCWlmICghbm90aWZ5Q2hhbmdlZExpc3RlbmVycy5pc0VtcHR5KCkpIHsKLQkJCQlmaW5kX3dyYXBwZXI6Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IG5vdGlmeUNoYW5nZWRMaXN0ZW5lcnMuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJCQlPYmplY3QgbGlzdGVuZXIgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCWlmKGxpc3RlbmVyIGluc3RhbmNlb2YgRmVhdHVyZVZhbHVlV3JhcHBlckl0ZW1Qcm92aWRlcgotCQkJCQkJCSYmIFRuZ1V0aWwudW53cmFwKGxpc3RlbmVyKSA9PSBlKSB7Ci0JCQkJCQlGZWF0dXJlVmFsdWVXcmFwcGVySXRlbVByb3ZpZGVyIHdyYXBwZXIgPSAoRmVhdHVyZVZhbHVlV3JhcHBlckl0ZW1Qcm92aWRlcikgbGlzdGVuZXI7Ci0JCQkJCQlmb3IoO3dyYXBwZXIgIT0gbnVsbCAmJiB3cmFwcGVyLmdldE93bmVyKCkgIT0gcGFyZW50OyAKLQkJCQkJCQl3cmFwcGVyID0gVG5nVXRpbC5nZXRXcmFwcGVyKHdyYXBwZXIuZ2V0Tm90aWZ5Q2hhbmdlZExpc3RlbmVycygpLCBlKSkgewkJCQkJCQkJCQotCQkJCQkJfQotCQkJCQkJaWYod3JhcHBlciAhPSBudWxsKSB7Ci0JCQkJCQkJcGFyZW50ID0gd3JhcHBlcjsKLQkJCQkJCQlicmVhayBmaW5kX3dyYXBwZXI7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCXBhcmVudCA9IGU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHBhcmVudDsKLQotCX0KLQkKLQlwcml2YXRlIHZvaWQgZXhwYW5kVHJlZVZpZXdlclBhY2thZ2VzKEVPYmplY3QgZSkgewotCQlpZiAoZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpZiAoZSBpbnN0YW5jZW9mIENvbnRlbnRQYWNrYWdlIHx8IGUgaW5zdGFuY2VvZiBQcm9jZXNzUGFja2FnZSkgewotCQkJZXhwYW5kVHJlZVZpZXdlclBhY2thZ2VzKGUuZUNvbnRhaW5lcigpKTsKLQkJCXRyZWVWaWV3ZXIuc2V0RXhwYW5kZWRTdGF0ZShlLCB0cnVlKTsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLnV0aWwuSVJlZnJlc2hIYW5kbGVyI3JlZnJlc2gob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHVibGljIHZvaWQgcmVmcmVzaChmaW5hbCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJQ29udHJvbCBjdHJsID0gZ2V0Vmlld2VyKCkuZ2V0Q29udHJvbCgpOwotCQlpZiAoY3RybCA9PSBudWxsIHx8IGN0cmwuaXNEaXNwb3NlZCgpKQotCQkJcmV0dXJuOwotCi0JCWlmIChjdHJsLmdldERpc3BsYXkoKS5nZXRUaHJlYWQoKSA9PSBUaHJlYWQuY3VycmVudFRocmVhZCgpKSB7Ci0JCQlkb1JlZnJlc2goZ2V0U2l0ZSgpLmdldFNoZWxsKCkpOwotCQl9IGVsc2UgewotCQkJY3RybC5nZXREaXNwbGF5KCkuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCi0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQlkb1JlZnJlc2gobnVsbCk7Ci0JCQkJfQotCi0JCQl9KTsKLQkJfQotCi0JfQotCi0JcHJpdmF0ZSB2b2lkIGJsb2NraW5nUmVmcmVzaChmaW5hbCBBcnJheUxpc3QgcmVtb3ZlZFJlc291cmNlcywKLQkJCWZpbmFsIEFycmF5TGlzdCBjaGFuZ2VkUmVzb3VyY2VzLAotCQkJZmluYWwgQ29sbGVjdGlvbiBhZGRlZFdvcmtzcGFjZVJlc291cmNlcywKLQkJCWZpbmFsIGJvb2xlYW4gcmVmcmVzaFZpZXdzLCBTaGVsbCBzaGVsbCkgewotCQlmaW5hbCBJUnVubmFibGVXaXRoUHJvZ3Jlc3MgcnVubmFibGUgPSBuZXcgSVJ1bm5hYmxlV2l0aFByb2dyZXNzKCkgewotCi0JCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQotCQkJCQl0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQkJCW1vbml0b3IuYmVnaW5UYXNrKCIiLCBJUHJvZ3Jlc3NNb25pdG9yLlVOS05PV04pOyAvLyROT04tTkxTLTEkCi0JCQkJbW9uaXRvcgotCQkJCQkJLnN1YlRhc2soQXV0aG9yaW5nVUlSZXNvdXJjZXMuX1VJX1JlZnJlc2hWaWV3ZXJfbWVudV9pdGVtKTsKLQkJCQltb25pdG9yLndvcmtlZCgxKTsKLQkJCQl0cnkgewotCQkJCQkvLyBtb25pdG9yLndvcmtlZCgxKTsKLQkJCQkJZG9SZWZyZXNoKHJlbW92ZWRSZXNvdXJjZXMsIGNoYW5nZWRSZXNvdXJjZXMsCi0JCQkJCQkJYWRkZWRXb3Jrc3BhY2VSZXNvdXJjZXMsIHJlZnJlc2hWaWV3cyk7Ci0JCQkJfSBmaW5hbGx5IHsKLQkJCQkJbW9uaXRvci5kb25lKCk7Ci0JCQkJfQotCQkJfQotCi0JCX07Ci0KLQkJSVJ1bm5hYmxlQ29udGV4dCBjb250ZXh0ID0gbmV3IFByb2dyZXNzTW9uaXRvckRpYWxvZyhzaGVsbCk7Ci0JCXRyeSB7Ci0JCQlnZXRTaXRlKCkuZ2V0V29ya2JlbmNoV2luZG93KCkuZ2V0V29ya2JlbmNoKCkuZ2V0UHJvZ3Jlc3NTZXJ2aWNlKCkKLQkJCQkJLnJ1bkluVUkoCi0JCQkJCQkJY29udGV4dCwKLQkJCQkJCQlydW5uYWJsZSwKLQkJCQkJCQluZXcgTGlicmFyeVNjaGVkdWxpbmdSdWxlKExpYnJhcnlTZXJ2aWNlCi0JCQkJCQkJCQkuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpKSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQlTdHJpbmcgdGl0bGUgPSBBdXRob3JpbmdVSVJlc291cmNlcy5Qcm9jZXNzRWRpdG9yX3JlZnJlc2hFcnJvclRpdGxlOwotCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpLmRpc3BsYXlFcnJvcih0aXRsZSwKLQkJCQkJZS50b1N0cmluZygpLCBlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIE11c3QgYmUgc3luY2hyb25pemVkIHRvIGF2b2lkIHN0ZXBwaW5nIG9uIGVhY2ggb3RoZXIgaW4gcmVsb2FkaW5nCi0JICogcmVzb3VyY2VzL3JlZnJlc2hpbmcgVUkKLQkgKiAKLQkgKiBAcGFyYW0gcmVtb3ZlZFJlc291cmNlcwotCSAqIEBwYXJhbSBjaGFuZ2VkUmVzb3VyY2VzCi0JICogQHBhcmFtIGFkZGVkV29ya3NwYWNlUmVzb3VyY2VzCi0JICogICAgICAgICAgICBjb2xsZWN0aW9uIG9mIElSZXNvdXJjZSBvYmplY3RzIHRoYXQgYXJlIGp1c3QgbmV3bHkgYWRkZWQgdG8KLQkgKiAgICAgICAgICAgIHRoZSBsaWJyYXJ5Ci0JICogQHBhcmFtIHJlZnJlc2hWaWV3cwotCSAqLwotCXByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgZG9SZWZyZXNoKENvbGxlY3Rpb24gcmVtb3ZlZFJlc291cmNlcywKLQkJCUNvbGxlY3Rpb24gY2hhbmdlZFJlc291cmNlcywgQ29sbGVjdGlvbiBhZGRlZFdvcmtzcGFjZVJlc291cmNlcywKLQkJCWJvb2xlYW4gcmVmcmVzaFZpZXdzKSB7Ci0JCUhhc2hTZXQgZWRpdG9yc1RvUmVmcmVzaCA9IG5ldyBIYXNoU2V0KCk7Ci0JCWlmICghcmVtb3ZlZFJlc291cmNlcy5pc0VtcHR5KCkpIHsKLQkJCWhhbmRsZVJlbW92ZWRSZXNvdXJjZXMocmVtb3ZlZFJlc291cmNlcywgZWRpdG9yc1RvUmVmcmVzaCk7Ci0JCQlyZWZyZXNoVmlld3MgPSB0cnVlOwotCQl9Ci0JCWlmICghY2hhbmdlZFJlc291cmNlcy5pc0VtcHR5KCkpIHsKLQkJCWhhbmRsZUNoYW5nZWRSZXNvdXJjZXMoY2hhbmdlZFJlc291cmNlcywgZWRpdG9yc1RvUmVmcmVzaCwKLQkJCQkJcmVmcmVzaFZpZXdzKTsKLQkJfSBlbHNlIHsKLQkJCWlmIChyZWZyZXNoVmlld3MpIHsKLQkJCQlyZWZyZXNoVmlld3MoKTsKLQkJCX0KLQotCQkJaWYgKCFlZGl0b3JzVG9SZWZyZXNoLmlzRW1wdHkoKSkgewotCQkJCS8vIHJlZnJlc2ggdGhlIGVkaXRvcnMgdGhhdCBoYW5kbGVSZW1vdmVkUmVzb3VyY2VzIHJlcXVlc3RlZAotCQkJCS8vCi0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gZWRpdG9yc1RvUmVmcmVzaC5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQlPYmplY3QgZWRpdG9yID0gaXRlci5uZXh0KCk7Ci0JCQkJCWlmIChlZGl0b3IgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50RWRpdG9yKSB7Ci0JCQkJCQkoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGVkaXRvcikucmVmcmVzaCgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmIChhZGRlZFdvcmtzcGFjZVJlc291cmNlcyAhPSBudWxsCi0JCQkJJiYgIWFkZGVkV29ya3NwYWNlUmVzb3VyY2VzLmlzRW1wdHkoKSkgewotCQkJSUxpYnJhcnlNYW5hZ2VyIG1nciA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLQkJCQkJLmdldEN1cnJlbnRMaWJyYXJ5TWFuYWdlcigpOwotCQkJaWYgKG1nciAhPSBudWxsKSB7Ci0JCQkJUmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQgPSBtZ3IuZ2V0RWRpdGluZ0RvbWFpbigpCi0JCQkJCQkuZ2V0UmVzb3VyY2VTZXQoKTsKLQkJCQlpZiAocmVzb3VyY2VTZXQgaW5zdGFuY2VvZiBNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwpIHsKLQkJCQkJKChNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwpIHJlc291cmNlU2V0KQotCQkJCQkJCS5sb2FkTmV3UmVzb3VyY2VzKGFkZGVkV29ya3NwYWNlUmVzb3VyY2VzKTsKLQkJCQkJKChNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwpIHJlc291cmNlU2V0KS5nZXRVbnJlc29sdmVkUHJveHlNYXJrZXJNYW5hZ2VyKCkudmFsaWRhdGVBbGxNYXJrZXJzKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzVmlld09iamVjdChPYmplY3QgbykgewotCQlyZXR1cm4gbyBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQKLQkJCQkmJiAhKG8gaW5zdGFuY2VvZiBDb250ZW50RGVzY3JpcHRpb24KLQkJCQkJCXx8IG8gaW5zdGFuY2VvZiBQcm9jZXNzRWxlbWVudCB8fCAobyBpbnN0YW5jZW9mIFByb2Nlc3NQYWNrYWdlICYmIFVtYVV0aWwKLQkJCQkJCS5nZXRQcm9jZXNzQ29tcG9uZW50KChNZXRob2RFbGVtZW50KSBvKSA9PSBudWxsKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGRvUmVmcmVzaChJUmVmcmVzaEV2ZW50IGV2ZW50LCBTaGVsbCBzaGVsbCkgewotCQlpZiAoREVCVUcpIHsKLQkJCVN5c3RlbS5vdXQKLQkJCQkJLnByaW50bG4oIlJlZnJlc2hlZCBvYmplY3RzOiAiICsgZXZlbnQuZ2V0UmVmcmVzaGVkT2JqZWN0cygpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWJvb2xlYW4gcmVmcmVzaCA9IGZhbHNlOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBldmVudC5nZXRSZWZyZXNoZWRPYmplY3RzKCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZSA9IGl0ZXIubmV4dCgpOwotCQkJaWYgKGlzVmlld09iamVjdChlKSkgewotCQkJCXJlZnJlc2ggPSB0cnVlOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCWlmIChyZWZyZXNoKSB7Ci0JCQlyZWZyZXNoVmlld3MoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJlZnJlc2hlcyB0aGUgTGlicmFyeSBWaWV3Ci0JICogCi0JICogQHBhcmFtIHNoZWxsCi0JICovCi0JcHJpdmF0ZSB2b2lkIGRvUmVmcmVzaChTaGVsbCBzaGVsbCkgewotCQlmaW5hbCBib29sZWFuIHJlZnJlc2hWaWV3cyA9ICFSZWZyZXNoSm9iLmdldEluc3RhbmNlKCkKLQkJCQkuZ2V0UmVsb2FkZWRCZWZvcmVSZWZyZXNoUmVzb3VyY2VzKCkuaXNFbXB0eSgpCi0JCQkJfHwgIVJlZnJlc2hKb2IuZ2V0SW5zdGFuY2UoKS5nZXRBZGRlZFJlc291cmNlcygpLmlzRW1wdHkoKTsKLQkJQXJyYXlMaXN0IHJlbW92ZWRSZXNvdXJjZXMgPSBuZXcgQXJyYXlMaXN0KFJlZnJlc2hKb2IuZ2V0SW5zdGFuY2UoKQotCQkJCS5nZXRSZW1vdmVkUmVzb3VyY2VzKCkpOwotCQlBcnJheUxpc3QgY2hhbmdlZFJlc291cmNlcyA9IG5ldyBBcnJheUxpc3QoUmVmcmVzaEpvYi5nZXRJbnN0YW5jZSgpCi0JCQkJLmdldENoYW5nZWRSZXNvdXJjZXMoKSk7Ci0JCUFycmF5TGlzdCBhZGRlZFdzUmVzb3VyY2VzID0gbmV3IEFycmF5TGlzdChSZWZyZXNoSm9iLmdldEluc3RhbmNlKCkKLQkJCQkuZ2V0QWRkZWRXb3Jrc3BhY2VSZXNvdXJjZXMoKSk7Ci0KLQkJaWYgKCFyZW1vdmVkUmVzb3VyY2VzLmlzRW1wdHkoKSB8fCAhY2hhbmdlZFJlc291cmNlcy5pc0VtcHR5KCkKLQkJCQl8fCAhYWRkZWRXc1Jlc291cmNlcy5pc0VtcHR5KCkgfHwgcmVmcmVzaFZpZXdzKSB7Ci0JCQlibG9ja2luZ1JlZnJlc2gocmVtb3ZlZFJlc291cmNlcywgY2hhbmdlZFJlc291cmNlcywKLQkJCQkJYWRkZWRXc1Jlc291cmNlcywgcmVmcmVzaFZpZXdzLCBzaGVsbCk7Ci0JCX0KLQotCQlpZiAoIXJlbW92ZWRSZXNvdXJjZXMuaXNFbXB0eSgpKSB7Ci0JCQlSZWZyZXNoSm9iLmdldEluc3RhbmNlKCkuZ2V0UmVtb3ZlZFJlc291cmNlcygpLnJlbW92ZUFsbCgKLQkJCQkJcmVtb3ZlZFJlc291cmNlcyk7Ci0JCX0KLQkJaWYgKCFjaGFuZ2VkUmVzb3VyY2VzLmlzRW1wdHkoKSkgewotCQkJUmVmcmVzaEpvYi5nZXRJbnN0YW5jZSgpLmdldENoYW5nZWRSZXNvdXJjZXMoKS5yZW1vdmVBbGwoCi0JCQkJCWNoYW5nZWRSZXNvdXJjZXMpOwotCQl9Ci0JCWlmICghYWRkZWRXc1Jlc291cmNlcy5pc0VtcHR5KCkpIHsKLQkJCVJlZnJlc2hKb2IuZ2V0SW5zdGFuY2UoKS5nZXRBZGRlZFdvcmtzcGFjZVJlc291cmNlcygpLnJlbW92ZUFsbCgKLQkJCQkJYWRkZWRXc1Jlc291cmNlcyk7Ci0JCX0KLQkJaWYgKHJlZnJlc2hWaWV3cykgewotCQkJUmVmcmVzaEpvYi5nZXRJbnN0YW5jZSgpLmdldFJlbG9hZGVkQmVmb3JlUmVmcmVzaFJlc291cmNlcygpCi0JCQkJCS5jbGVhcigpOwotCQkJUmVmcmVzaEpvYi5nZXRJbnN0YW5jZSgpLmdldEFkZGVkUmVzb3VyY2VzKCkuY2xlYXIoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSByZW1vdmVkUmVzb3VyY2VzMgotCSAqLwotCXByaXZhdGUgQ29sbGVjdGlvbiBoYW5kbGVSZW1vdmVkUmVzb3VyY2VzKENvbGxlY3Rpb24gcmVtb3ZlZFJlc291cmNlcywKLQkJCUNvbGxlY3Rpb24gZWRpdG9yc1RvUmVmcmVzaCkgewotCQlJV29ya2JlbmNoUGFnZSB3b3JrYmVuY2hQYWdlID0gZ2V0U2l0ZSgpLmdldFBhZ2UoKTsKLQkJSUVkaXRvclJlZmVyZW5jZVtdIGVkaXRvclJlZmVyZW5jZXMgPSB3b3JrYmVuY2hQYWdlCi0JCQkJLmdldEVkaXRvclJlZmVyZW5jZXMoKTsKLQkJQXJyYXlMaXN0IGRpcnR5RWRpdG9yc1dpdGhDb25mbGljdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJQXJyYXlMaXN0IHJlbW92ZWRSZXNvdXJjZUxpc3QgPSBuZXcgQXJyYXlMaXN0KHJlbW92ZWRSZXNvdXJjZXMpOwotCQlpZiAoZWRpdG9yc1RvUmVmcmVzaCA9PSBudWxsKSB7Ci0JCQllZGl0b3JzVG9SZWZyZXNoID0gbmV3IEFycmF5TGlzdCgpOwotCQl9Ci0JCS8vIGZpbmQgYWxsIGVkaXRvciB3aXRoIGRpcnR5IGNvbmZsaWN0Ci0JCS8vCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgZWRpdG9yUmVmZXJlbmNlcy5sZW5ndGg7IGkrKykgewotCQkJSUVkaXRvclJlZmVyZW5jZSByZWZlcmVuY2UgPSBlZGl0b3JSZWZlcmVuY2VzW2ldOwotCQkJSUVkaXRvclBhcnQgZWRpdG9yID0gcmVmZXJlbmNlLmdldEVkaXRvcih0cnVlKTsKLQkJCWlmIChlZGl0b3IgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50RWRpdG9yICYmIGVkaXRvci5pc0RpcnR5KCkpIHsKLQkJCQlNZXRob2RFbGVtZW50RWRpdG9ySW5wdXQgaW5wdXQgPSAoTWV0aG9kRWxlbWVudEVkaXRvcklucHV0KSBlZGl0b3IKLQkJCQkJCS5nZXRFZGl0b3JJbnB1dCgpOwotCQkJCVJlc291cmNlIHJlc291cmNlID0gaW5wdXQuZ2V0TWV0aG9kRWxlbWVudCgpICE9IG51bGwgPyBpbnB1dAotCQkJCQkJLmdldE1ldGhvZEVsZW1lbnQoKS5lUmVzb3VyY2UoKSA6IG51bGw7Ci0JCQkJaWYgKCFyZW1vdmVkUmVzb3VyY2VzLmNvbnRhaW5zKHJlc291cmNlKSkgewotCQkJCQlDb2xsZWN0aW9uIHVzZWRSZXNvdXJjZXMgPSAoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGVkaXRvcikKLQkJCQkJCQkuZ2V0VXNlZFJlc291cmNlcygpOwotCQkJCQljaGVja19yZXNvdXJjZTogZm9yIChpbnQgaiA9IDA7IGogPCByZW1vdmVkUmVzb3VyY2VMaXN0Ci0JCQkJCQkJLnNpemUoKTsgaisrKSB7Ci0JCQkJCQlyZXNvdXJjZSA9IChSZXNvdXJjZSkgcmVtb3ZlZFJlc291cmNlTGlzdC5nZXQoaik7Ci0JCQkJCQlpZiAodXNlZFJlc291cmNlcy5jb250YWlucyhyZXNvdXJjZSkpIHsKLQkJCQkJCQlkaXJ0eUVkaXRvcnNXaXRoQ29uZmxpY3QuYWRkKGVkaXRvcik7Ci0JCQkJCQkJYnJlYWsgY2hlY2tfcmVzb3VyY2U7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQllZGl0b3JzVG9SZWZyZXNoLmFkZChlZGl0b3IpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWlmICghZGlydHlFZGl0b3JzV2l0aENvbmZsaWN0LmlzRW1wdHkoKSkgewotCQkJT2JqZWN0W10gc2VsZWN0ZWQgPSBzZWxlY3REaXJ0eUVkaXRvcnMoZGlydHlFZGl0b3JzV2l0aENvbmZsaWN0KTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2VsZWN0ZWQubGVuZ3RoOyBpKyspIHsKLQkJCQllZGl0b3JzVG9SZWZyZXNoLmFkZChzZWxlY3RlZFtpXSk7Ci0JCQl9Ci0JCX0KLQotCQkvLyBVbmxvYWQgdGhlIHJlbW92ZWQgcmVzb3VyY2VzLgotCQlQZXJzaXN0ZW5jZVV0aWwudW5sb2FkKHJlbW92ZWRSZXNvdXJjZXMpOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgZWRpdG9yUmVmZXJlbmNlcy5sZW5ndGg7IGkrKykgewotCQkJSUVkaXRvclJlZmVyZW5jZSByZWZlcmVuY2UgPSBlZGl0b3JSZWZlcmVuY2VzW2ldOwotCQkJSUVkaXRvclBhcnQgZWRpdG9yID0gcmVmZXJlbmNlLmdldEVkaXRvcih0cnVlKTsKLQkJCWlmIChlZGl0b3IgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50RWRpdG9yICYmICFlZGl0b3IuaXNEaXJ0eSgpKSB7Ci0JCQkJQ29sbGVjdGlvbiB1c2VkUmVzb3VyY2VzID0gKChNZXRob2RFbGVtZW50RWRpdG9yKSBlZGl0b3IpCi0JCQkJCQkuZ2V0VXNlZFJlc291cmNlcygpOwotCQkJCWNoZWNrX3Jlc291cmNlOiBmb3IgKGludCBqID0gMDsgaiA8IHJlbW92ZWRSZXNvdXJjZUxpc3Quc2l6ZSgpOyBqKyspIHsKLQkJCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSAoUmVzb3VyY2UpIHJlbW92ZWRSZXNvdXJjZUxpc3QuZ2V0KGopOwotCQkJCQlpZiAodXNlZFJlc291cmNlcy5jb250YWlucyhyZXNvdXJjZSkpIHsKLQkJCQkJCWVkaXRvcnNUb1JlZnJlc2guYWRkKGVkaXRvcik7Ci0JCQkJCQlicmVhayBjaGVja19yZXNvdXJjZTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiByZW1vdmVkUmVzb3VyY2VzOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBjaGFuZ2VkUmVzb3VyY2VzCi0JICogQHJldHVybiByZXNvdXJjZXMgdGhhdCBoYXZlIGJlZW4gcmVsb2FkZWQKLQkgKi8KLQlwcml2YXRlIENvbGxlY3Rpb24gaGFuZGxlQ2hhbmdlZFJlc291cmNlcyhDb2xsZWN0aW9uIGNoYW5nZWRSZXNvdXJjZXMsCi0JCQlDb2xsZWN0aW9uIGVkaXRvcnNUb1JlZnJlc2gsIGJvb2xlYW4gZm9yY2VSZWZyZXNoVmlld3MpIHsKLQkJaWYgKCFmb3JjZVJlZnJlc2hWaWV3cykgewotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gY2hhbmdlZFJlc291cmNlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlSZXNvdXJjZSByZXNvdXJjZSA9IChSZXNvdXJjZSkgaXRlci5uZXh0KCk7Ci0JCQkJaWYgKHJlc291cmNlIGluc3RhbmNlb2YgSUxpYnJhcnlSZXNvdXJjZQotCQkJCQkJJiYgKChJTGlicmFyeVJlc291cmNlKSByZXNvdXJjZSkuZ2V0TG9hZFN0YW1wKCkgPiBsYXN0UmVmcmVzaFRpbWVTdGFtcCkgewotCQkJCQlmb3JjZVJlZnJlc2hWaWV3cyA9IHRydWU7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gaGFuZGxlQ2hhbmdlZFJlc291cmNlcyhjaGFuZ2VkUmVzb3VyY2VzLCBudWxsLAotCQkJCWZvcmNlUmVmcmVzaFZpZXdzLCBlZGl0b3JzVG9SZWZyZXNoKTsKLQl9Ci0KLQkvKioKLQkgKiB1cGRhdGVzIExpYnJhcnkgVmlldyB3aGVuIHJlc291cmNlcyBjaGFuZ2UKLQkgKiAKLQkgKiBAcGFyYW0gY2hhbmdlZFJlc291cmNlcwotCSAqIEBwYXJhbSBlZGl0b3JzTm90VG9SZWZyZXNoCi0JICogQHBhcmFtIGZvcmNlUmVmcmVzaFZpZXdzCi0JICogQHBhcmFtIGVkaXRvcnNUb1JlZnJlc2gKLQkgKiBAcmV0dXJuIExpc3Qgb2YgY2hhbmdlZCByZXNvdXJjZXMKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBoYW5kbGVDaGFuZ2VkUmVzb3VyY2VzKENvbGxlY3Rpb24gY2hhbmdlZFJlc291cmNlcywKLQkJCUNvbGxlY3Rpb24gZWRpdG9yc05vdFRvUmVmcmVzaCwgYm9vbGVhbiBmb3JjZVJlZnJlc2hWaWV3cywKLQkJCUNvbGxlY3Rpb24gZWRpdG9yc1RvUmVmcmVzaCkgewotCQlDb250cm9sIGN0cmwgPSBnZXRWaWV3ZXIoKS5nZXRDb250cm9sKCk7Ci0JCWlmIChjdHJsID09IG51bGwgfHwgY3RybC5pc0Rpc3Bvc2VkKCkpCi0JCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQotCQlJV29ya2JlbmNoUGFnZSB3b3JrYmVuY2hQYWdlID0gZ2V0U2l0ZSgpLmdldFBhZ2UoKTsKLQkJSUVkaXRvclJlZmVyZW5jZVtdIGVkaXRvclJlZmVyZW5jZXMgPSB3b3JrYmVuY2hQYWdlCi0JCQkJLmdldEVkaXRvclJlZmVyZW5jZXMoKTsKLQkJQXJyYXlMaXN0PElFZGl0b3JQYXJ0PiBkaXJ0eUVkaXRvcnNXaXRoQ29uZmxpY3QgPSBuZXcgQXJyYXlMaXN0PElFZGl0b3JQYXJ0PigpOwotCQlBcnJheUxpc3Q8UmVzb3VyY2U+IGNoYW5nZWRSZXNvdXJjZUxpc3QgPSBuZXcgQXJyYXlMaXN0PFJlc291cmNlPihjaGFuZ2VkUmVzb3VyY2VzKTsKLQkJLy8gZmluZCBhbGwgZWRpdG9yIHdpdGggZGlydHkgY29uZmxpY3QKLQkJLy8KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlZGl0b3JSZWZlcmVuY2VzLmxlbmd0aDsgaSsrKSB7Ci0JCQlJRWRpdG9yUmVmZXJlbmNlIHJlZmVyZW5jZSA9IGVkaXRvclJlZmVyZW5jZXNbaV07Ci0JCQlJRWRpdG9yUGFydCBlZGl0b3IgPSByZWZlcmVuY2UuZ2V0RWRpdG9yKHRydWUpOwotCQkJaWYgKGVkaXRvciBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnRFZGl0b3IgJiYgZWRpdG9yLmlzRGlydHkoKSkgewotCQkJCUNvbGxlY3Rpb248UmVzb3VyY2U+IHVzZWRSZXNvdXJjZXMgPSAoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGVkaXRvcikKLQkJCQkJCS5nZXRVc2VkUmVzb3VyY2VzKCk7Ci0JCQkJY2hlY2tfcmVzb3VyY2U6IGZvciAoaW50IGogPSAwOyBqIDwgY2hhbmdlZFJlc291cmNlTGlzdC5zaXplKCk7IGorKykgewotCQkJCQlSZXNvdXJjZSByZXNvdXJjZSA9IChSZXNvdXJjZSkgY2hhbmdlZFJlc291cmNlTGlzdC5nZXQoaik7Ci0JCQkJCWlmICh1c2VkUmVzb3VyY2VzLmNvbnRhaW5zKHJlc291cmNlKSkgewotCQkJCQkJZGlydHlFZGl0b3JzV2l0aENvbmZsaWN0LmFkZChlZGl0b3IpOwotCQkJCQkJYnJlYWsgY2hlY2tfcmVzb3VyY2U7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZmluYWwgQXJyYXlMaXN0IGVkaXRvckxpc3RUb1JlZnJlc2ggPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWlmIChlZGl0b3JzVG9SZWZyZXNoICE9IG51bGwpIHsKLQkJCWVkaXRvckxpc3RUb1JlZnJlc2guYWRkQWxsKGVkaXRvcnNUb1JlZnJlc2gpOwotCQl9Ci0JCWlmICghZGlydHlFZGl0b3JzV2l0aENvbmZsaWN0LmlzRW1wdHkoKSkgewotCQkJT2JqZWN0W10gcmVzdWx0ID0gc2VsZWN0RGlydHlFZGl0b3JzKGRpcnR5RWRpdG9yc1dpdGhDb25mbGljdCk7Ci0JCQlpZihyZXN1bHQgIT0gbnVsbCkgewotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVzdWx0Lmxlbmd0aDsgaSsrKSB7Ci0JCQkJCU9iamVjdCBlZGl0b3IgPSByZXN1bHRbaV07Ci0JCQkJCWlmICgoZWRpdG9yc05vdFRvUmVmcmVzaCA9PSBudWxsIHx8ICFlZGl0b3JzTm90VG9SZWZyZXNoCi0JCQkJCQkJLmNvbnRhaW5zKGVkaXRvcikpCi0JCQkJCQkJJiYgKGVkaXRvcnNUb1JlZnJlc2ggPT0gbnVsbCB8fCAhZWRpdG9yc1RvUmVmcmVzaAotCQkJCQkJCQkJLmNvbnRhaW5zKGVkaXRvcikpKSB7Ci0JCQkJCQllZGl0b3JMaXN0VG9SZWZyZXNoLmFkZChlZGl0b3IpOwotCQkJCQkJZGlydHlFZGl0b3JzV2l0aENvbmZsaWN0LnJlbW92ZShlZGl0b3IpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJLy8gcmVtb3ZlIGFsbCByZXNvdXJjZXMgdXNlZCBieSBkaXJ0eSBlZGl0b3JzIHdpdGggY29uZmxpY3QgZnJvbSB0aGUKLQkJCS8vIGNvbGxlY3Rpb24gb2YgY2hhbmdlZCByZXNvdXJjZXMgYWZ0ZXIgdXBkYXRpbmcgY2FjaGVkIG1vZGlmaWNhdGlvbiBzdGFtcAotCQkJLy8gc28gdGhleSB3aWxsIG5vdCBiZSBwcm9tcHRlZCB0byByZWxvYWQgYWdhaW4gdW50aWwgdGhlIG5leHQgZXh0ZXJuYWwgY2hhbmdlCi0JCQkvLwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkaXJ0eUVkaXRvcnNXaXRoQ29uZmxpY3Quc2l6ZSgpOyBpKyspIHsKLQkJCQlNZXRob2RFbGVtZW50RWRpdG9yIGVkaXRvciA9IChNZXRob2RFbGVtZW50RWRpdG9yKSBkaXJ0eUVkaXRvcnNXaXRoQ29uZmxpY3QKLQkJCQkJCS5nZXQoaSk7CQkJCQotCQkJCUNvbGxlY3Rpb248UmVzb3VyY2U+IHVzZWRSZXNvdXJjZXMgPSBlZGl0b3IuZ2V0VXNlZFJlc291cmNlcygpOwotCQkJCXVzZWRSZXNvdXJjZXMucmV0YWluQWxsKGNoYW5nZWRSZXNvdXJjZUxpc3QpOwotCQkJCWVkaXRvci51cGRhdGVSZXNvdXJjZUluZm9zKHVzZWRSZXNvdXJjZXMpOwotCQkJCWVkaXRvci5vdmV3cml0ZVJlc291cmNlcyh1c2VkUmVzb3VyY2VzKTsKLQkJCQljaGFuZ2VkUmVzb3VyY2VMaXN0LnJlbW92ZUFsbCh1c2VkUmVzb3VyY2VzKTsKLQkJCX0KLQkJfQotCi0JCWJvb2xlYW4gcmVmcmVzaFZpZXdzID0gZmFsc2U7Ci0JCWlmICghY2hhbmdlZFJlc291cmNlTGlzdC5pc0VtcHR5KCkpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZWRpdG9yUmVmZXJlbmNlcy5sZW5ndGg7IGkrKykgewotCQkJCUlFZGl0b3JSZWZlcmVuY2UgcmVmZXJlbmNlID0gZWRpdG9yUmVmZXJlbmNlc1tpXTsKLQkJCQlJRWRpdG9yUGFydCBlZGl0b3IgPSByZWZlcmVuY2UuZ2V0RWRpdG9yKHRydWUpOwotCQkJCWlmIChlZGl0b3IgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50RWRpdG9yICYmICFlZGl0b3IuaXNEaXJ0eSgpKSB7Ci0JCQkJCUNvbGxlY3Rpb248UmVzb3VyY2U+IHVzZWRSZXNvdXJjZXMgPSAoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGVkaXRvcikKLQkJCQkJCQkuZ2V0VXNlZFJlc291cmNlcygpOwotCQkJCQljaGVja19yZXNvdXJjZTogZm9yIChpbnQgaiA9IDA7IGogPCBjaGFuZ2VkUmVzb3VyY2VMaXN0Ci0JCQkJCQkJLnNpemUoKTsgaisrKSB7Ci0JCQkJCQlSZXNvdXJjZSByZXNvdXJjZSA9IChSZXNvdXJjZSkgY2hhbmdlZFJlc291cmNlTGlzdAotCQkJCQkJCQkuZ2V0KGopOwotCQkJCQkJaWYgKHVzZWRSZXNvdXJjZXMuY29udGFpbnMocmVzb3VyY2UpKSB7Ci0JCQkJCQkJZWRpdG9yTGlzdFRvUmVmcmVzaC5hZGQoZWRpdG9yKTsKLQkJCQkJCQlicmVhayBjaGVja19yZXNvdXJjZTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJLy8gUmVsb2FkIHRoZSBzZWxlY3RlZCBjaGFuZ2VkIHJlc291cmNlcy4KLQkJCUlMaWJyYXJ5TWFuYWdlciBtYW5hZ2VyID0gKElMaWJyYXJ5TWFuYWdlcikgTGlicmFyeVNlcnZpY2UKLQkJCQkJLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudExpYnJhcnlNYW5hZ2VyKCk7Ci0JCQlpZiAobWFuYWdlciAhPSBudWxsKSB7Ci0JCQkJQ29sbGVjdGlvbjxSZXNvdXJjZT4gcmVsb2FkZWRSZXNvdXJjZXMgPSBtYW5hZ2VyCi0JCQkJCQkucmVsb2FkUmVzb3VyY2VzKGNoYW5nZWRSZXNvdXJjZUxpc3QpOwotCi0JCQkJcmVmcmVzaFZpZXdzID0gIXJlbG9hZGVkUmVzb3VyY2VzLmlzRW1wdHkoKTsKLQkJCX0KLQkJfQotCQlpZiAoZm9yY2VSZWZyZXNoVmlld3MgfHwgcmVmcmVzaFZpZXdzKSB7Ci0JCQlyZWZyZXNoVmlld3MoKTsKLQkJfQotCQlpZiAoIWVkaXRvckxpc3RUb1JlZnJlc2guaXNFbXB0eSgpKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGVkaXRvckxpc3RUb1JlZnJlc2guc2l6ZSgpOyBpKyspIHsKLQkJCQlNZXRob2RFbGVtZW50RWRpdG9yIGVkaXRvciA9IChNZXRob2RFbGVtZW50RWRpdG9yKSBlZGl0b3JMaXN0VG9SZWZyZXNoCi0JCQkJCQkuZ2V0KGkpOwotCQkJCXRyeSB7Ci0JCQkJCWVkaXRvci5yZWZyZXNoKCk7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gY2hhbmdlZFJlc291cmNlTGlzdDsKLQl9Ci0KLQkvKioKLQkgKiBSZWZyZXNoZXMgTGlicmFyeSBhbmQgQ29uZmlndXJhdGlvbiB2aWV3cyBpZiBuZWNlc3NhcnkKLQkgKiAKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgcmVmcmVzaFZpZXdzKCkgewotCQlFT2JqZWN0IGlucHV0ID0gKEVPYmplY3QpIGdldFZpZXdlcigpLmdldElucHV0KCk7Ci0JCWlmIChpbnB1dCAhPSBudWxsKSB7Ci0JCQlpZiAoaW5wdXQuZUlzUHJveHkoKSkgewotCQkJCXNldElucHV0Rm9yVmlld2VyKFJlZnJlc2hKb2IuZ2V0SW5zdGFuY2UoKS5yZXNvbHZlKGlucHV0KSk7Ci0JCQl9IGVsc2UgewotCQkJCUlTZWxlY3Rpb24gc2VsZWN0aW9uID0gZ2V0Vmlld2VyKCkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJZ2V0Vmlld2VyKCkucmVmcmVzaCgpOwotCQkJCXVwZGF0ZUxhc3RSZWZyZXNoVGltZXN0YW1wKCk7Ci0JCQkJaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7Ci0JCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHN0cnVjdHVyZWRTZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbjsKLQkJCQkJT2JqZWN0IG8gPSBudWxsOwotCQkJCQlpZiAoc3RydWN0dXJlZFNlbGVjdGlvbi5zaXplKCkgPT0gMQotCQkJCQkJCSYmIChvID0gc3RydWN0dXJlZFNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKSkgaW5zdGFuY2VvZiBFT2JqZWN0Ci0JCQkJCQkJJiYgKChFT2JqZWN0KSBvKS5lSXNQcm94eSgpKSB7Ci0JCQkJCQlvID0gUmVmcmVzaEpvYi5nZXRJbnN0YW5jZSgpLnJlc29sdmUoKEVPYmplY3QpIG8pOwotCQkJCQkJdHJ5IHsKLQkJCQkJCQlzZXRTZWxlY3Rpb25Ub1ZpZXdlcihvKTsKLQkJCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpCi0JCQkJCQkJCQkubG9nRXJyb3IoZSk7Ci0JCQkJCQl9Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlWaWV3SGVscGVyLnJlc3RvcmVTZWxlY3Rpb24oZ2V0Vmlld2VyKCksIHNlbGVjdGlvbik7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlDb25maWd1cmF0aW9uVmlldyBjb25maWdWaWV3ID0gQ29uZmlndXJhdGlvblZpZXcuZ2V0VmlldygpOwotCQlpZiAoY29uZmlnVmlldyAhPSBudWxsKSB7Ci0JCQlDb250cm9sIGN0cmwgPSBjb25maWdWaWV3LmdldFZpZXdlcigpLmdldENvbnRyb2woKTsKLQkJCWlmIChjdHJsICE9IG51bGwgJiYgIWN0cmwuaXNEaXNwb3NlZCgpKSB7Ci0JCQkJaW5wdXQgPSAoRU9iamVjdCkgY29uZmlnVmlldy5nZXRWaWV3ZXIoKS5nZXRJbnB1dCgpOwotCQkJCWlmIChpbnB1dCAhPSBudWxsKSB7Ci0JCQkJCWlmIChpbnB1dC5lSXNQcm94eSgpKSB7Ci0JCQkJCQljb25maWdWaWV3LnNldElucHV0Rm9yVmlld2VyKFJlZnJlc2hKb2IuZ2V0SW5zdGFuY2UoKQotCQkJCQkJCQkucmVzb2x2ZShpbnB1dCkpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSBjb25maWdWaWV3LmdldFZpZXdlcigpCi0JCQkJCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQkJCQkJCWNvbmZpZ1ZpZXcuZ2V0Vmlld2VyKCkucmVmcmVzaCgpOwotCQkJCQkJVmlld0hlbHBlci5yZXN0b3JlU2VsZWN0aW9uKGNvbmZpZ1ZpZXcuZ2V0Vmlld2VyKCksIHNlbGVjdGlvbik7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIE9iamVjdFtdIHNlbGVjdERpcnR5RWRpdG9ycyhMaXN0PD8+IGRpcnR5RWRpdG9ycykgewotCQlyZXR1cm4gUmVmcmVzaEhhbmRsZXIuc2VsZWN0RGlydHlFZGl0b3JzKGRpcnR5RWRpdG9ycywgZ2V0U2l0ZSgpLmdldFNoZWxsKCkpOwotCX0KLQotCS8qKgotCSAqIHJlbmFtZSBhbiBlbGVtZW50Ci0JICogCi0JICogQHBhcmFtIGUKLQkgKiAgICAgICAgICAgIGVsZW1lbnQgdG8gcmVuYW1lCi0JICogQHBhcmFtIG5ld05hbWUKLQkgKiAgICAgICAgICAgIHRoZSBuZXcgbmFtZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBydW5SZW5hbWUoZmluYWwgTmFtZWRFbGVtZW50IGUsIGZpbmFsIFN0cmluZyBuZXdOYW1lKSB7Ci0JCURpc3BsYXkuZ2V0RGVmYXVsdCgpLnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlSZW5hbWVBY3Rpb24uZG9SZW5hbWUoZSwgbmV3TmFtZSk7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGFydC5JU2hvd0luVGFyZ2V0I3Nob3cob3JnLmVjbGlwc2UudWkucGFydC5TaG93SW5Db250ZXh0KQotCSAqLwotCXB1YmxpYyBib29sZWFuIHNob3coU2hvd0luQ29udGV4dCBjb250ZXh0KSB7Ci0JCS8vIHNwZWNpYWwgaGFuZGxpbmcgZm9yIFNob3dJbkNvbnRleHQgZnJvbSBwcm9ibGVtcyB2aWV3Ci0JCS8vCi0JCWlmIChjb250ZXh0LmdldElucHV0KCkgaW5zdGFuY2VvZiBNYXJrZXJBZGFwdGVyKSB7Ci0JCQlJVmlld1BhcnQgdmlldyA9IGdldFZpZXdTaXRlKCkuZ2V0UGFnZSgpLmZpbmRWaWV3KAotCQkJCQkib3JnLmVjbGlwc2UudWkudmlld3MuUHJvYmxlbVZpZXciKTsgLy8kTk9OLU5MUy0xJAotCQkJSVNlbGVjdGlvblByb3ZpZGVyIHNlbGVjdGlvblByb3ZpZGVyID0gdmlldy5nZXRWaWV3U2l0ZSgpCi0JCQkJCS5nZXRTZWxlY3Rpb25Qcm92aWRlcigpOwotCQkJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uUHJvdmlkZXIKLQkJCQkJLmdldFNlbGVjdGlvbigpOwotCQkJT2JqZWN0IG8gPSBzZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCQlpZiAobyBpbnN0YW5jZW9mIElNYXJrZXIpIHsKLQkJCQlJTWFya2VyIG1hcmtlciA9IChJTWFya2VyKSBvOwotCQkJCXRyeSB7Ci0JCQkJCVN0cmluZyBndWlkID0gKFN0cmluZykgbWFya2VyCi0JCQkJCQkJLmdldEF0dHJpYnV0ZShMaWJyYXJ5VmFsaWRhdGlvbk1hcmtlckhlbHBlci5HVUlEKTsKLQkJCQkJaWYgKGd1aWQgIT0gbnVsbCkgewotCQkJCQkJSVJlc291cmNlIHdzUmVzID0gbWFya2VyLmdldFJlc291cmNlKCk7Ci0JCQkJCQlJTGlicmFyeU1hbmFnZXIgbGliTWdyID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TGlicmFyeU1hbmFnZXIoKTsJCQkJCQkKLQkJCQkJCVJlc291cmNlIHJlc291cmNlID0gbGliTWdyLmdldEVkaXRpbmdEb21haW4oKS5nZXRSZXNvdXJjZVNldCgpCi0JCQkJCQkJCS5nZXRSZXNvdXJjZSgKLQkJCQkJCQkJCQlVUkkuY3JlYXRlRmlsZVVSSSh3c1Jlcy5nZXRMb2NhdGlvbigpCi0JCQkJCQkJCQkJCQkudG9TdHJpbmcoKSksIGZhbHNlKTsKLQkJCQkJCU9iamVjdCBlbGVtZW50OwotCQkJCQkJaWYocmVzb3VyY2UgIT0gbnVsbCkgewotCQkJCQkJCWVsZW1lbnQgPSByZXNvdXJjZS5nZXRFT2JqZWN0KGd1aWQpOwotCQkJCQkJfQotCQkJCQkJZWxzZSB7Ci0JCQkJCQkJZWxlbWVudCA9IGxpYk1nci5nZXRNZXRob2RFbGVtZW50KGd1aWQpOwotCQkJCQkJfQotCQkJCQkJaWYoZWxlbWVudCAhPSBudWxsKSB7Ci0JCQkJCQkJc2V0U2VsZWN0aW9uVG9WaWV3ZXIoZWxlbWVudCk7Ci0JCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlJU2VsZWN0aW9uIGNvbnRleHRTZWxlY3Rpb24gPSBjb250ZXh0LmdldFNlbGVjdGlvbigpOwotCQlpZiAoY29udGV4dC5nZXRTZWxlY3Rpb24oKSBpbnN0YW5jZW9mIFRyZWVTZWxlY3Rpb24pIHsKLQkJCS8vIGZyb20gc2VhcmNoIHJlc3VsdHMgdmlldwotCQkJVHJlZVNlbGVjdGlvbiBzZWwgPSAoVHJlZVNlbGVjdGlvbiljb250ZXh0LmdldFNlbGVjdGlvbigpOwotCQkJc2V0U2VsZWN0aW9uVG9WaWV3ZXIoc2VsLmdldEZpcnN0RWxlbWVudCgpKTsKLQkJfSBlbHNlIGlmIChjb250ZXh0U2VsZWN0aW9uIGluc3RhbmNlb2YgU3RydWN0dXJlZFNlbGVjdGlvbikgewotCQkJLy8gZnJvbSBwcm9ibGVtcyB2aWV3LCBwZXJoYXBzIG90aGVycz8KLQkJCVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsID0gKFN0cnVjdHVyZWRTZWxlY3Rpb24pY29udGV4dFNlbGVjdGlvbjsKLQkJCU9iamVjdCBmaXJzdE9iaiA9IHNlbC5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCWlmIChmaXJzdE9iaiBpbnN0YW5jZW9mIElSZXNvdXJjZSkgewotCQkJCUlSZXNvdXJjZSB3c1JlcyA9IChJUmVzb3VyY2UpZmlyc3RPYmo7Ci0JCQkJSUxpYnJhcnlNYW5hZ2VyIGxpYk1nciA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudExpYnJhcnlNYW5hZ2VyKCk7CQkJCQkJCi0JCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSBsaWJNZ3IuZ2V0RWRpdGluZ0RvbWFpbigpLmdldFJlc291cmNlU2V0KCkKLQkJCQkJCS5nZXRSZXNvdXJjZSgKLQkJCQkJCQkJVVJJLmNyZWF0ZUZpbGVVUkkod3NSZXMuZ2V0TG9jYXRpb24oKQotCQkJCQkJCQkJCS50b1N0cmluZygpKSwgZmFsc2UpOwotCQkJCU9iamVjdCBlbGVtZW50ID0gUGVyc2lzdGVuY2VVdGlsLmdldE1ldGhvZEVsZW1lbnQocmVzb3VyY2UpOwotCQkJCWlmKGVsZW1lbnQgIT0gbnVsbCkgewotCQkJCQlzZXRTZWxlY3Rpb25Ub1ZpZXdlcihlbGVtZW50KTsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldFZpZXdJZCgpIHsKLQkJcmV0dXJuIFZJRVdfSUQ7Ci0JfQotCi0JcHVibGljIFRyZWVWaWV3ZXIgZ2V0VHJlZVZpZXdlcigpIHsKLQkJcmV0dXJuIHRyZWVWaWV3ZXI7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHNldENvbnRlbnREZXNjcmlwdGlvbihTdHJpbmcgZGVzY3JpcHRpb24pIHsKLQkJc3VwZXIuc2V0Q29udGVudERlc2NyaXB0aW9uKGRlc2NyaXB0aW9uKTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3ZpZXdzL0xvY2tlckZhY3RvcnkuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvdmlld3MvTG9ja2VyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyODk4NGViLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvdmlld3MvTG9ja2VyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY0ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS52aWV3czsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudFByb3BlcnR5OwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci0KLXB1YmxpYyBjbGFzcyBMb2NrZXJGYWN0b3J5IHsKLQotCS8qKgotCSAqIFRoZSBleHRlbnNpb24gcG9pbnQgbmFtZXNwYWNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVEVOU0lPTl9QT0lOVF9OQU1FU1BBQ0UgPSAib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSBleHRlbnNpb24gcG9pbnQgbmFtZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRFTlNJT05fUE9JTlRfTkFNRSA9ICJDdXN0b21pemVkTG9ja2VyIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlICJjbGFzcyIgYXR0cmlidXRlIG5hbWUuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xBU1NfQVRUUklCX05BTUUgPSAiY2xhc3MiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgImlkIiBhdHRyaWJ1dGUgbmFtZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJRF9BVFRSSUJfTkFNRSA9ICJpZCI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIFRoZSBzaGFyZWQgaW5zdGFuY2UuCi0JcHJpdmF0ZSBzdGF0aWMgTG9ja2VyRmFjdG9yeSBpbnN0YW5jZSA9IG51bGw7Ci0KLQkvLyBBIG1hcCBvZiBsaWJyYXJ5IG1hbmFnZXIgY29uZmlndXJhdGlvbiBlbGVtZW50cy4KLQlwcml2YXRlIE1hcDxTdHJpbmcsIExvY2tlckVsZW1lbnQ+IGxvY2tlckVsZW1lbnRzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBMb2NrZXJFbGVtZW50PigpOwotCQotCS8vQSBtYXAgdG8gbWFuYWdlIGlkIGFuZCBsb2NrZXIgcGFpcnMuCi0JcHJpdmF0ZSBNYXA8U3RyaW5nLCBBYnN0cmFjdExvY2tlcj4gbG9ja2VyTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBBYnN0cmFjdExvY2tlcj4oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNoYXJlZCBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIExvY2tlckZhY3RvcnkgZ2V0SW5zdGFuY2UoKSB7Ci0JCWlmKGluc3RhbmNlID09IG51bGwpewotCQkJc3luY2hyb25pemVkKExvY2tlckZhY3RvcnkuY2xhc3MpewotCQkJCWlmIChpbnN0YW5jZSA9PSBudWxsKSB7Ci0JCQkJCWluc3RhbmNlID0gbmV3IExvY2tlckZhY3RvcnkoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHJpdmF0ZSBMb2NrZXJGYWN0b3J5KCkgewotCQlpbml0KCk7Ci0JfQotCi0JLyoqCi0JICogUGVyZm9ybXMgdGhlIG5lY2Vzc2FyeSBpbml0aWFsaXphdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0KCkgewotCQlJRXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpOwotCQlJRXh0ZW5zaW9uUG9pbnQgZXh0ZW5zaW9uUG9pbnQgPSBleHRlbnNpb25SZWdpc3RyeS5nZXRFeHRlbnNpb25Qb2ludCgKLQkJCQlFWFRFTlNJT05fUE9JTlRfTkFNRVNQQUNFLCBFWFRFTlNJT05fUE9JTlRfTkFNRSk7Ci0JCWlmIChleHRlbnNpb25Qb2ludCAhPSBudWxsKSB7Ci0JCQlJRXh0ZW5zaW9uW10gZXh0ZW5zaW9ucyA9IGV4dGVuc2lvblBvaW50LmdldEV4dGVuc2lvbnMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZXh0ZW5zaW9ucy5sZW5ndGg7IGkrKykgewotCQkJCUlFeHRlbnNpb24gZXh0ZW5zaW9uID0gZXh0ZW5zaW9uc1tpXTsKLQkJCQlTdHJpbmcgcGx1Z2luSWQgPSBleHRlbnNpb24uZ2V0TmFtZXNwYWNlSWRlbnRpZmllcigpOwotCQkJCUJ1bmRsZSBidW5kbGUgPSBQbGF0Zm9ybS5nZXRCdW5kbGUocGx1Z2luSWQpOwotCQkJCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGNvbmZpZ0VsZW1lbnRzID0gZXh0ZW5zaW9uCi0JCQkJLmdldENvbmZpZ3VyYXRpb25FbGVtZW50cygpOwotCQkJCWZvciAoaW50IGogPSAwOyBqIDwgY29uZmlnRWxlbWVudHMubGVuZ3RoOyBqKyspIHsKLQkJCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNvbmZpZ0VsZW1lbnQgPSBjb25maWdFbGVtZW50c1tqXTsKLQkJCQkJdHJ5IHsKLQkJCQkJCVN0cmluZyBjbGFzc05hbWUgPSBjb25maWdFbGVtZW50Ci0JCQkJCQkuZ2V0QXR0cmlidXRlKENMQVNTX0FUVFJJQl9OQU1FKTsKLQkJCQkJCVN0cmluZyBpZCA9IGNvbmZpZ0VsZW1lbnQKLQkJCQkJCS5nZXRBdHRyaWJ1dGUoSURfQVRUUklCX05BTUUpOwotCQkJCQkJaWYgKGNsYXNzTmFtZSAhPSBudWxsICYmIGNsYXNzTmFtZS50cmltKCkubGVuZ3RoKCkgPiAwCi0JCQkJCQkJCSYmIGlkICE9IG51bGwgJiYgaWQudHJpbSgpLmxlbmd0aCgpID4gMCkgewkJCQkJCQkKLQkJCQkJCQlMb2NrZXJFbGVtZW50IHByb3ZpZGVyID0gbG9ja2VyRWxlbWVudHMuZ2V0KGlkKTsKLQkJCQkJCQlpZihwcm92aWRlciA9PSBudWxsICkgewotCQkJCQkJCQlwcm92aWRlciA9IG5ldyBMb2NrZXJFbGVtZW50KAotCQkJCQkJCQkJCWJ1bmRsZSwgY2xhc3NOYW1lLCBpZCk7Ci0JCQkJCQkJCWxvY2tlckVsZW1lbnRzLnB1dChpZCwgcHJvdmlkZXIpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCUxpYnJhcnlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIEFic3RyYWN0TG9ja2VyIGdldExvY2tlcihPYmplY3Qgb2JqKSB7Ci0JCWlmICggb2JqIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCApIHsKLQkJCU1ldGhvZEVsZW1lbnQgZSA9ICgoTWV0aG9kRWxlbWVudClvYmopOwkJCQotCQkJaWYgKGUgIT0gbnVsbCApIHsKLQkJCQlMaXN0IHByb3BzID0gZS5nZXRNZXRob2RFbGVtZW50UHJvcGVydHkoKTsKLQkJCQlpZiAoIHByb3BzICE9IG51bGwgJiYgcHJvcHMuc2l6ZSgpID4gMCApIHsKLQkJCQkJZm9yIChJdGVyYXRvciBpdHAgPSBwcm9wcy5pdGVyYXRvcigpOyBpdHAuaGFzTmV4dCgpOyApIHsKLQkJCQkJCU1ldGhvZEVsZW1lbnRQcm9wZXJ0eSBwcm9wID0gKE1ldGhvZEVsZW1lbnRQcm9wZXJ0eSlpdHAubmV4dCgpOwotCQkJCQkJU3RyaW5nIGlkID0gcHJvcC5nZXROYW1lKCk7Ci0JCQkJCQlBYnN0cmFjdExvY2tlciBsb2NrZXI9IGdldExvY2tlcihpZCk7Ci0JCQkJCQlpZiAoIGxvY2tlciAhPSBudWxsICkgewkJCQkJCQotCQkJCQkJCXJldHVybiBsb2NrZXI7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9CQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgQWJzdHJhY3RMb2NrZXIgZ2V0TG9ja2VyKFN0cmluZyBpZCkgewotCi0JCWlmICggIWxvY2tlckVsZW1lbnRzLmNvbnRhaW5zS2V5KGlkKSApIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJLy9yZXR1cm4gY3JlYXRlZCBpbnN0YW5jZQotCQlpZihsb2NrZXJNYXAuY29udGFpbnNLZXkoaWQpICl7Ci0JCQlyZXR1cm4gbG9ja2VyTWFwLmdldChpZCk7Ci0JCX0KLQkJCi0JCUxvY2tlckVsZW1lbnQgcHJvdmlkZXIgPSAoTG9ja2VyRWxlbWVudCkgbG9ja2VyRWxlbWVudHMuZ2V0KGlkKTsKLQkJdHJ5IHsKLQkJCUNsYXNzIGNsYXp6ID0gcHJvdmlkZXIuYnVuZGxlLmxvYWRDbGFzcyhwcm92aWRlci5jbGFzc05hbWUpOwotCQkJQWJzdHJhY3RMb2NrZXIgbG9ja2VySW5zdGFuY2UgPSAoQWJzdHJhY3RMb2NrZXIpIGNsYXp6Lm5ld0luc3RhbmNlKCk7Ci0JCQlsb2NrZXJNYXAucHV0KGlkLCBsb2NrZXJJbnN0YW5jZSk7Ci0JCQlyZXR1cm4gbG9ja2VySW5zdGFuY2U7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlMaWJyYXJ5UGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgY2xhc3MgTG9ja2VyRWxlbWVudCB7Ci0JCUJ1bmRsZSBidW5kbGU7Ci0JCVN0cmluZyBjbGFzc05hbWU7Ci0JCVN0cmluZyBpZDsKLQkJcHJpdmF0ZSBMb2NrZXJFbGVtZW50KEJ1bmRsZSBidW5kbGUsIFN0cmluZyBjbGFzc05hbWUsIFN0cmluZyBpZCkgewotCQkJdGhpcy5idW5kbGUgPSBidW5kbGU7Ci0JCQl0aGlzLmNsYXNzTmFtZSA9IGNsYXNzTmFtZTsKLQkJCXRoaXMuaWQgPSBpZDsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS92aWV3cy9NZXRob2RDb250YWluZXJDaGVja2VkVHJlZVZpZXdlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS92aWV3cy9NZXRob2RDb250YWluZXJDaGVja2VkVHJlZVZpZXdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYmU4ZGQ2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvdmlld3MvTWV0aG9kQ29udGFpbmVyQ2hlY2tlZFRyZWVWaWV3ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5MCArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudmlld3M7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkxpc3RlbmVyTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU2FmZVJ1bm5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkN1c3RvbUNhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuU2FmZVJ1bm5hYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2hlY2tTdGF0ZUNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNoZWNrYm94VHJlZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDaGVja1N0YXRlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVHJlZVZpZXdlckxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZUV4cGFuc2lvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVHJlZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UcmVlSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5XaWRnZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5Db250YWluZXJDaGVja2VkVHJlZVZpZXdlcjsKLQotLyoqCi0gKiBDb250YWluZXJDaGVja2VkVHJlZVZpZXdlciBjbGFzcyB0aGF0IHN1cHBvcnRzIE1ldGhvZEVsZW1lbnRzLgotICogU3BlY2lmaWNhbGx5LCBoYXMgY2hhbmdlcyB0byBzdXBwb3J0IEZlYXR1cmVWYWx1ZVdyYXBwZXJJdGVtUHJvdmlkZXJzLgotICogCi0gKiBBbHNvLCBleHBhbmRzIHRoZSB0cmVlIGZvciBjaGVja2VkIGl0ZW1zIHdoZW4gdGhleSBhcmUgc2V0IHZpYQotICogc2V0Q2hlY2tlZEVsZW1lbnRzKC4uKSBpZmYgZXhwYW5kV2hlbkNoZWNraW5nIGlzIHRydWUuCi0gKiBAYXV0aG9yIEplZmYgSGFyZHkKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXRob2RDb250YWluZXJDaGVja2VkVHJlZVZpZXdlciBleHRlbmRzCi0JCUNvbnRhaW5lckNoZWNrZWRUcmVlVmlld2VyIHsKLQkKLQlwcm90ZWN0ZWQgYm9vbGVhbiBleHBhbmRXaGVuQ2hlY2tpbmcgPSBmYWxzZTsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBpbml0aWFsaXppbmdUcmVlQ2hlY2tTdGF0ZSA9IGZhbHNlOwotCi0JcHJvdGVjdGVkIExpc3RlbmVyTGlzdCBjaGlsZHJlbkNoZWNrU3RhdGVMaXN0ZW5lcnMgPSBuZXcgTGlzdGVuZXJMaXN0KCk7Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvciBmb3IgTWV0aG9kQ29udGFpbmVyQ2hlY2tlZFRyZWVWaWV3ZXIuCi0gICAgICogQHNlZSBDaGVja2JveFRyZWVWaWV3ZXIjQ2hlY2tib3hUcmVlVmlld2VyKENvbXBvc2l0ZSkKLSAgICAgKi8KLSAgICBwdWJsaWMgTWV0aG9kQ29udGFpbmVyQ2hlY2tlZFRyZWVWaWV3ZXIoQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICBzdXBlcihwYXJlbnQpOwotICAgICAgICBpbml0Vmlld2VyKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IgZm9yIE1ldGhvZENvbnRhaW5lckNoZWNrZWRUcmVlVmlld2VyLgotICAgICAqIEBzZWUgQ2hlY2tib3hUcmVlVmlld2VyI0NoZWNrYm94VHJlZVZpZXdlcihDb21wb3NpdGUsaW50KQotICAgICAqLwotICAgIHB1YmxpYyBNZXRob2RDb250YWluZXJDaGVja2VkVHJlZVZpZXdlcihDb21wb3NpdGUgcGFyZW50LCBpbnQgc3R5bGUpIHsKLSAgICAgICAgc3VwZXIocGFyZW50LCBzdHlsZSk7Ci0gICAgICAgIGluaXRWaWV3ZXIoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvciBmb3IgTWV0aG9kQ29udGFpbmVyQ2hlY2tlZFRyZWVWaWV3ZXIuCi0gICAgICogQHNlZSBDaGVja2JveFRyZWVWaWV3ZXIjQ2hlY2tib3hUcmVlVmlld2VyKFRyZWUpCi0gICAgICovCi0gICAgcHVibGljIE1ldGhvZENvbnRhaW5lckNoZWNrZWRUcmVlVmlld2VyKFRyZWUgdHJlZSkgewotICAgICAgICBzdXBlcih0cmVlKTsKLSAgICAgICAgaW5pdFZpZXdlcigpOwotICAgIH0KLSAgICAKLSAgICBwcm90ZWN0ZWQgdm9pZCBpbml0Vmlld2VyKCkgewotICAgICAgICBzZXRVc2VIYXNobG9va3VwKHRydWUpOwotICAgICAgICBhZGRDaGVja1N0YXRlTGlzdGVuZXIobmV3IElDaGVja1N0YXRlTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBjaGVja1N0YXRlQ2hhbmdlZChDaGVja1N0YXRlQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJdXBkYXRlV3JhcHBlcnMoZXZlbnQuZ2V0RWxlbWVudCgpKTsKLQkJCQlkb0NoZWNrU3RhdGVDaGFuZ2VkKGV2ZW50LmdldEVsZW1lbnQoKSk7Ci0JCQl9Ci0gICAgICAgIH0pOwotICAgICAgICBhZGRUcmVlTGlzdGVuZXIobmV3IElUcmVlVmlld2VyTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCB0cmVlQ29sbGFwc2VkKFRyZWVFeHBhbnNpb25FdmVudCBldmVudCkgewotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCB0cmVlRXhwYW5kZWQoVHJlZUV4cGFuc2lvbkV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICAgICAgV2lkZ2V0IGl0ZW0gPSBmaW5kSXRlbShldmVudC5nZXRFbGVtZW50KCkpOwotICAgICAgICAgICAgICAgIGlmIChpdGVtIGluc3RhbmNlb2YgVHJlZUl0ZW0pIHsKLSAgICAgICAgICAgICAgICAgICAgaW5pdGlhbGl6ZUl0ZW0oKFRyZWVJdGVtKSBpdGVtKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBUaGUgaXRlbSBoYXMgZXhwYW5kZWQuIFVwZGF0ZXMgdGhlIGNoZWNrZWQgc3RhdGUgb2YgaXRzIGNoaWxkcmVuLiAKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplSXRlbShUcmVlSXRlbSBpdGVtKSB7Ci0gICAgICAgIGlmIChpdGVtLmdldENoZWNrZWQoKSAmJiAhaXRlbS5nZXRHcmF5ZWQoKSkgewotICAgICAgICAgICAgdXBkYXRlQ2hpbGRyZW5JdGVtcyhpdGVtKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBVcGRhdGVzIHRoZSBjaGVjayBzdGF0ZSBvZiBhbGwgY3JlYXRlZCBjaGlsZHJlbgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHVwZGF0ZUNoaWxkcmVuSXRlbXMoVHJlZUl0ZW0gcGFyZW50KSB7Ci0gICAgICAgIEl0ZW1bXSBjaGlsZHJlbiA9IGdldENoaWxkcmVuKHBhcmVudCk7Ci0gICAgICAgIGJvb2xlYW4gc3RhdGUgPSBwYXJlbnQuZ2V0Q2hlY2tlZCgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBUcmVlSXRlbSBjdXJyID0gKFRyZWVJdGVtKSBjaGlsZHJlbltpXTsKLSAgICAgICAgICAgIGlmIChjdXJyLmdldERhdGEoKSAhPSBudWxsCi0gICAgICAgICAgICAgICAgICAgICYmICgoY3Vyci5nZXRDaGVja2VkKCkgIT0gc3RhdGUpIHx8IGN1cnIuZ2V0R3JheWVkKCkpKSB7Ci0gICAgICAgICAgICAgICAgY3Vyci5zZXRDaGVja2VkKHN0YXRlKTsKLSAgICAgICAgICAgICAgICBjdXJyLnNldEdyYXllZChmYWxzZSk7Ci0gICAgICAgICAgICAgICAgbm90aWZ5Q2hpbGRyZW5DaGVja1N0YXRlTGlzdGVuZXJzKG5ldyBDaGVja1N0YXRlQ2hhbmdlZEV2ZW50KHRoaXMsIGN1cnIuZ2V0RGF0YSgpLAotICAgICAgICAgICAgICAgIAkJc3RhdGUpKTsgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgdXBkYXRlQ2hpbGRyZW5JdGVtcyhjdXJyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBkb0NoZWNrU3RhdGVDaGFuZ2VkKE9iamVjdCBlbGVtZW50KSB7Ci0gICAgCWlmIChpbml0aWFsaXppbmdUcmVlQ2hlY2tTdGF0ZSkgewotICAgIAkJLy8gd2hlbiBpbml0aWFsaXppbmcsIGRvbid0IHVwZGF0ZSBjaGlsZHJlbjoKLSAgICAJCS8vIHBhcmVudCBtYXkgaGF2ZSBiZWVuIGdyYXktY2hlY2tlZCBhbmQgd2UgZG9uJ3QKLSAgICAJCS8vIHdhbnQgdG8gd2hpdGUtY2hlY2sgYWxsIGNoaWxkcmVuCi0gICAgCQkvLyBjaGlsZHJlbiB3aWxsIGJlIGNoZWNrZWQgYmVjYXVzZSBzZXRDaGVja2VkRWxlbWVudHMoLi4pCi0gICAgCQkvLyB0eXBpY2FsbHkgcmVjZWl2ZXMgbGlzdCBvZiBhbGwgY2hlY2tlZCBlbGVtZW50cwotCQkJV2lkZ2V0IGl0ZW0gPSBmaW5kSXRlbShlbGVtZW50KTsKLQkJCWlmIChpdGVtIGluc3RhbmNlb2YgVHJlZUl0ZW0pIHsKLQkJCQlUcmVlSXRlbSB0cmVlSXRlbSA9IChUcmVlSXRlbSkgaXRlbTsKLQkJCQl0cmVlSXRlbS5zZXRHcmF5ZWQoZmFsc2UpOwotCQkJCXVwZGF0ZVBhcmVudEl0ZW1zKHRyZWVJdGVtLmdldFBhcmVudEl0ZW0oKSk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlzdXBlci5kb0NoZWNrU3RhdGVDaGFuZ2VkKGVsZW1lbnQpOwotCQl9Ci0gICAgfQotICAgICAgICAKLSAgICBwdWJsaWMgdm9pZCB1cGRhdGVQYXJlbnRzKE9iamVjdCBlbGVtZW50KSB7Ci0gICAgICAgIFdpZGdldCBpdGVtID0gZmluZEl0ZW0oZWxlbWVudCk7Ci0gICAgICAgIGlmIChpdGVtIGluc3RhbmNlb2YgVHJlZUl0ZW0pIHsKLSAgICAgICAgICAgIFRyZWVJdGVtIHRyZWVJdGVtID0gKFRyZWVJdGVtKSBpdGVtOwotICAgICAgICAgICAgdXBkYXRlUGFyZW50SXRlbXModHJlZUl0ZW0uZ2V0UGFyZW50SXRlbSgpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFVwZGF0ZXMgdGhlIGNoZWNrIC8gZ3JheSBzdGF0ZSBvZiBhbGwgcGFyZW50IGl0ZW1zCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgdXBkYXRlUGFyZW50SXRlbXMoVHJlZUl0ZW0gaXRlbSkgewotICAgICAgICBpZiAoaXRlbSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBJdGVtW10gY2hpbGRyZW4gPSBnZXRDaGlsZHJlbihpdGVtKTsKLSAgICAgICAgICAgIGJvb2xlYW4gY29udGFpbnNDaGVja2VkID0gZmFsc2U7Ci0gICAgICAgICAgICBib29sZWFuIGNvbnRhaW5zVW5jaGVja2VkID0gZmFsc2U7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgVHJlZUl0ZW0gY3VyciA9IChUcmVlSXRlbSkgY2hpbGRyZW5baV07Ci0gICAgICAgICAgICAgICAgY29udGFpbnNDaGVja2VkIHw9IGN1cnIuZ2V0Q2hlY2tlZCgpOwotICAgICAgICAgICAgICAgIGNvbnRhaW5zVW5jaGVja2VkIHw9ICghY3Vyci5nZXRDaGVja2VkKCkgfHwgY3Vyci5nZXRHcmF5ZWQoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpdGVtLnNldENoZWNrZWQoY29udGFpbnNDaGVja2VkKTsKLSAgICAgICAgICAgIGl0ZW0uc2V0R3JheWVkKGNvbnRhaW5zQ2hlY2tlZCAmJiBjb250YWluc1VuY2hlY2tlZCk7Ci0gICAgICAgICAgICBpZiAoZXhwYW5kV2hlbkNoZWNraW5nICYmIGl0ZW0uZ2V0Q2hlY2tlZCgpKSB7Ci0gICAgICAgICAgICAJaXRlbS5zZXRFeHBhbmRlZCh0cnVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHVwZGF0ZVBhcmVudEl0ZW1zKGl0ZW0uZ2V0UGFyZW50SXRlbSgpKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHZvaWQgdXBkYXRlV3JhcHBlcnMoT2JqZWN0IG9iamVjdCkgewotICAgIAlib29sZWFuIHN0YXRlID0gZ2V0Q2hlY2tlZChvYmplY3QpOwotICAgIAlPYmplY3QgZWxlbWVudCA9IFRuZ1V0aWwudW53cmFwKG9iamVjdCk7Ci0gICAgCWlmKG9iamVjdCAhPSBlbGVtZW50KSB7Ci0gICAgCQlzZXRDaGVja2VkKGVsZW1lbnQsIHN0YXRlKTsKLSAgICAJfQotCQlBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSA9IG51bGw7Ci0JCWlmIChnZXRDb250ZW50UHJvdmlkZXIoKSBpbnN0YW5jZW9mIEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKSB7Ci0JCQlhZGFwdGVyRmFjdG9yeSA9ICgoQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIpIGdldENvbnRlbnRQcm92aWRlcigpKQotCQkJCQkuZ2V0QWRhcHRlckZhY3RvcnkoKTsKLQkJfQotCQlpZiAoYWRhcHRlckZhY3RvcnkgIT0gbnVsbCkgewotCQkJQ29sbGVjdGlvbjw/PiB3cmFwcGVycyA9IFRuZ1V0aWwuZ2V0V3JhcHBlcnMoYWRhcHRlckZhY3RvcnksCi0JCQkJCWVsZW1lbnQpOwotCQkJaWYgKCF3cmFwcGVycy5pc0VtcHR5KCkpIHsKLQkJCQlmb3IgKE9iamVjdCB3cmFwcGVyIDogd3JhcHBlcnMpIHsKLQkJCQkJc2V0Q2hlY2tlZCh3cmFwcGVyLCBzdGF0ZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotICAgIAotICAgIC8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DaGVja2JveFRyZWVWaWV3ZXIjc2V0Q2hlY2tlZEVsZW1lbnRzKGphdmEubGFuZy5PYmplY3RbXSkKLQkgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRDaGVja2VkRWxlbWVudHMoT2JqZWN0W10gZWxlbWVudHMpIHsKLSAgICAJLy8gZml4IGVsZW1lbnRzIGxpc3QgdG8gdXNlIEVQRidzIHdyYXBwZXJzCi0gICAgCUxpc3Q8T2JqZWN0PiB0cmVlRWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0PE9iamVjdD4oKTsKLSAgICAJQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkgPSBudWxsOwotICAgIAlpZiAoZ2V0Q29udGVudFByb3ZpZGVyKCkgaW5zdGFuY2VvZiBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcikgewotICAgIAkJYWRhcHRlckZhY3RvcnkgPSAoKEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKWdldENvbnRlbnRQcm92aWRlcigpKS5nZXRBZGFwdGVyRmFjdG9yeSgpOwotICAgIAl9Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gZWxlbWVudHNbaV07Ci0JCQlpZiAoYWRhcHRlckZhY3RvcnkgIT0gbnVsbCkgewotCQkJCXRyZWVFbGVtZW50cy5hZGRBbGwoVG5nVXRpbC5nZXRXcmFwcGVycyhhZGFwdGVyRmFjdG9yeSwgZWxlbWVudCkpOwotCQkJfQotCQkJaWYoIShlbGVtZW50IGluc3RhbmNlb2YgQ3VzdG9tQ2F0ZWdvcnkpKSB7Ci0JCQkJdHJlZUVsZW1lbnRzLmFkZChlbGVtZW50KTsKLQkJCX0KLQkJfQotICAgIAlpbml0aWFsaXppbmdUcmVlQ2hlY2tTdGF0ZSA9IHRydWU7Ci0gICAgICAgIHN1cGVyLnNldENoZWNrZWRFbGVtZW50cyh0cmVlRWxlbWVudHMudG9BcnJheSgpKTsKLSAgICAJaW5pdGlhbGl6aW5nVHJlZUNoZWNrU3RhdGUgPSBmYWxzZTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIGxpc3Qgb2YgdG9wLW1vc3QgY2hlY2tlZCBlbGVtZW50cyBpbiB0aGlzIHZpZXdlcidzIHRyZWUsIAotICAgICAqIGluY2x1ZGluZyBjdXJyZW50bHkgaGlkZGVuIG9uZXMgdGhhdCBhcmUgbWFya2VkIGFzCi0gICAgICogY2hlY2tlZCBidXQgYXJlIHVuZGVyIGEgY29sbGFwc2VkIGFuY2VzdG9yLgotICAgICAqCi0gICAgICogT25seSByZXR1cm5zIHdoaXRlLWNoZWNrZWQgaXRlbXMsIG5vdCBncmF5ZWQgaXRlbXMKLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIGFycmF5IG9mIGNoZWNrZWQgZWxlbWVudHMKLSAgICAgKgotICAgICAqIEBzZWUgI3NldENoZWNrZWRFbGVtZW50cwotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3RbXSBnZXRUb3BDaGVja2VkRWxlbWVudHMoKSB7Ci0gICAgICAgIEFycmF5TGlzdCB2ID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBDb250cm9sIHRyZWUgPSBnZXRDb250cm9sKCk7Ci0gICAgICAgIGludGVybmFsQ29sbGVjdFRvcENoZWNrZWQodiwgdHJlZSk7Ci0gICAgICAgIHJldHVybiB2LnRvQXJyYXkoKTsKLSAgICB9Ci0gICAgCi0gICAgCi0gICAgLyoqCi0gICAgICogR2F0aGVycyB0aGUgdG9wLW1vc3QgY2hlY2tlZCBzdGF0ZXMgb2YgdGhlIGdpdmVuIHdpZGdldCBhbmQgaXRzCi0gICAgICogZGVzY2VuZGVudHMsIGZvbGxvd2luZyBhIHByZS1vcmRlciB0cmF2ZXJzYWwgb2YgdGhlIHRyZWUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcmVzdWx0IGEgd3JpdGFibGUgbGlzdCBvZiBlbGVtZW50cyAoZWxlbWVudCB0eXBlOiA8Y29kZT5PYmplY3Q8L2NvZGU+KQotICAgICAqIEBwYXJhbSB3aWRnZXQgdGhlIHdpZGdldAotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBpbnRlcm5hbENvbGxlY3RUb3BDaGVja2VkKExpc3QgcmVzdWx0LCBXaWRnZXQgd2lkZ2V0KSB7Ci0gICAgICAgIEl0ZW1bXSBpdGVtcyA9IGdldENoaWxkcmVuKHdpZGdldCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIEl0ZW0gaXRlbSA9IGl0ZW1zW2ldOwotICAgICAgICAgICAgaWYgKGl0ZW0gaW5zdGFuY2VvZiBUcmVlSXRlbSAmJiAoKFRyZWVJdGVtKSBpdGVtKS5nZXRDaGVja2VkKCkgJiYgISgoVHJlZUl0ZW0pIGl0ZW0pLmdldEdyYXllZCgpKSB7Ci0gICAgICAgICAgICAgICAgT2JqZWN0IGRhdGEgPSBpdGVtLmdldERhdGEoKTsKLSAgICAgICAgICAgICAgICBpZiAoZGF0YSAhPSBudWxsKSB7Ci0JCQkJCXJlc3VsdC5hZGQoZGF0YSk7Ci0JCQkJfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGl0ZW0gaW5zdGFuY2VvZiBUcmVlSXRlbSAmJiAoISgoVHJlZUl0ZW0pIGl0ZW0pLmdldENoZWNrZWQoKSB8fCAoKFRyZWVJdGVtKSBpdGVtKS5nZXRHcmF5ZWQoKSkpIHsKLSAgICAgICAgICAgIAlpbnRlcm5hbENvbGxlY3RUb3BDaGVja2VkKHJlc3VsdCwgaXRlbSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotCXB1YmxpYyBib29sZWFuIGlzRXhwYW5kV2hlbkNoZWNraW5nKCkgewotCQlyZXR1cm4gZXhwYW5kV2hlbkNoZWNraW5nOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEV4cGFuZFdoZW5DaGVja2luZyhib29sZWFuIGV4cGFuZFdoZW5DaGVja2luZykgewotCQl0aGlzLmV4cGFuZFdoZW5DaGVja2luZyA9IGV4cGFuZFdoZW5DaGVja2luZzsKLQl9Ci0JCi0JLyoqCi0JICogbm90aWZpZWQgd2hlbiBjaGlsZHJlbiBjaGVja3N0YXRlIGlzIGNoYW5nZWQgKGJ5IGNoZWNraW5nIGEgcGFyZW50KQotCSAqIEBwYXJhbSBsaXN0ZW5lcgotCSAqLwotCXB1YmxpYyB2b2lkIGFkZENoaWxkcmVuQ2hlY2tTdGF0ZUxpc3RlbmVyKElDaGVja1N0YXRlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJY2hpbGRyZW5DaGVja1N0YXRlTGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJlbW92ZUNoaWxkcmVuQ2hlY2tTdGF0ZUxpc3RlbmVyKElDaGVja1N0YXRlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJY2hpbGRyZW5DaGVja1N0YXRlTGlzdGVuZXJzLnJlbW92ZShsaXN0ZW5lcik7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIG5vdGlmeUNoaWxkcmVuQ2hlY2tTdGF0ZUxpc3RlbmVycyhmaW5hbCBDaGVja1N0YXRlQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCWZvciAoZmluYWwgT2JqZWN0IGxpc3RlbmVyIDogY2hpbGRyZW5DaGVja1N0YXRlTGlzdGVuZXJzLmdldExpc3RlbmVycygpKSB7Ci0gICAgICAgICAgICBTYWZlUnVubmVyLnJ1bihuZXcgU2FmZVJ1bm5hYmxlKCkgewotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICAJKChJQ2hlY2tTdGF0ZUxpc3RlbmVyKWxpc3RlbmVyKS5jaGVja1N0YXRlQ2hhbmdlZChldmVudCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvdmlld3MvTWV0aG9kQ29udGFpbmVyQ2hlY2tlZFRyZWVWaWV3ZXIyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3ZpZXdzL01ldGhvZENvbnRhaW5lckNoZWNrZWRUcmVlVmlld2VyMi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MGY2ZGViLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvdmlld3MvTWV0aG9kQ29udGFpbmVyQ2hlY2tlZFRyZWVWaWV3ZXIyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudmlld3M7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DaGVja2JveFRyZWVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVHJlZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UcmVlSXRlbTsKLQotLyoqCi0gKiBDb250YWluZXJDaGVja2VkVHJlZVZpZXdlciB0aGF0IGRvZXMgbm90IGNoZWNrIGEgcGFyZW50IHdoZW4gYWxsIGNoaWxkcmVuIGFyZSBjaGVja2VkLgotICogUGFyZW50IHdpbGwgcmVtYWluIGdyYXllZCB1bnRpbCBjaGVja2VkIGJ5IHRoZSB1c2VyLgotICogQGF1dGhvciBKZWZmIEhhcmR5Ci0gKgotICovCi1wdWJsaWMgY2xhc3MgTWV0aG9kQ29udGFpbmVyQ2hlY2tlZFRyZWVWaWV3ZXIyIGV4dGVuZHMgTWV0aG9kQ29udGFpbmVyQ2hlY2tlZFRyZWVWaWV3ZXIgewotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IgZm9yIENvbnRhaW5lckNoZWNrZWRUcmVlVmlld2VyMi4KLSAgICAgKiBAc2VlIENoZWNrYm94VHJlZVZpZXdlciNDaGVja2JveFRyZWVWaWV3ZXIoQ29tcG9zaXRlKQotICAgICAqLwotICAgIHB1YmxpYyBNZXRob2RDb250YWluZXJDaGVja2VkVHJlZVZpZXdlcjIoQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICBzdXBlcihwYXJlbnQpOwotICAgICAgICBpbml0Vmlld2VyKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IgZm9yIENvbnRhaW5lckNoZWNrZWRUcmVlVmlld2VyMi4KLSAgICAgKiBAc2VlIENoZWNrYm94VHJlZVZpZXdlciNDaGVja2JveFRyZWVWaWV3ZXIoQ29tcG9zaXRlLGludCkKLSAgICAgKi8KLSAgICBwdWJsaWMgTWV0aG9kQ29udGFpbmVyQ2hlY2tlZFRyZWVWaWV3ZXIyKENvbXBvc2l0ZSBwYXJlbnQsIGludCBzdHlsZSkgewotICAgICAgICBzdXBlcihwYXJlbnQsIHN0eWxlKTsKLSAgICAgICAgaW5pdFZpZXdlcigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yIGZvciBDb250YWluZXJDaGVja2VkVHJlZVZpZXdlcjIuCi0gICAgICogQHNlZSBDaGVja2JveFRyZWVWaWV3ZXIjQ2hlY2tib3hUcmVlVmlld2VyKFRyZWUpCi0gICAgICovCi0gICAgcHVibGljIE1ldGhvZENvbnRhaW5lckNoZWNrZWRUcmVlVmlld2VyMihUcmVlIHRyZWUpIHsKLSAgICAgICAgc3VwZXIodHJlZSk7Ci0gICAgICAgIGluaXRWaWV3ZXIoKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogVXBkYXRlcyB0aGUgY2hlY2sgLyBncmF5IHN0YXRlIG9mIGFsbCBwYXJlbnQgaXRlbXMKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCB1cGRhdGVQYXJlbnRJdGVtcyhUcmVlSXRlbSBpdGVtKSB7Ci0gICAgICAgIGlmIChpdGVtICE9IG51bGwpIHsKLSAgICAgICAgICAgIEl0ZW1bXSBjaGlsZHJlbiA9IGdldENoaWxkcmVuKGl0ZW0pOwotICAgICAgICAgICAgYm9vbGVhbiBjb250YWluc0NoZWNrZWQgPSBmYWxzZTsKLSAgICAgICAgICAgIGJvb2xlYW4gY29udGFpbnNVbmNoZWNrZWQgPSBmYWxzZTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBUcmVlSXRlbSBjdXJyID0gKFRyZWVJdGVtKSBjaGlsZHJlbltpXTsKLSAgICAgICAgICAgICAgICBjb250YWluc0NoZWNrZWQgfD0gY3Vyci5nZXRDaGVja2VkKCk7Ci0gICAgICAgICAgICAgICAgY29udGFpbnNVbmNoZWNrZWQgfD0gKCFjdXJyLmdldENoZWNrZWQoKSB8fCBjdXJyLmdldEdyYXllZCgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGl0ZW0uc2V0Q2hlY2tlZChjb250YWluc0NoZWNrZWQpOwotLy8gICAgICAgICAgICBpdGVtLnNldEdyYXllZChjb250YWluc0NoZWNrZWQgJiYgY29udGFpbnNVbmNoZWNrZWQpOwotICAgICAgICAgICAgaXRlbS5zZXRHcmF5ZWQoY29udGFpbnNDaGVja2VkKTsKLSAgICAgICAgICAgIGlmIChleHBhbmRXaGVuQ2hlY2tpbmcgJiYgaXRlbS5nZXRDaGVja2VkKCkpIHsKLSAgICAgICAgICAgIAlpdGVtLnNldEV4cGFuZGVkKHRydWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdXBkYXRlUGFyZW50SXRlbXMoaXRlbS5nZXRQYXJlbnRJdGVtKCkpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBPYmplY3RbXSBnZXRDaGVja0J1dE5vdEdyYXllZEVsZW1lbnRzKCkgewotICAgIAlPYmplY3RbXSBjaGVja2VkID0gZ2V0Q2hlY2tlZEVsZW1lbnRzKCk7Ci0gICAgCUFycmF5TGlzdDxPYmplY3Q+IGVsZW1lbnRzID0gbmV3IEFycmF5TGlzdDxPYmplY3Q+KCk7Ci0gICAgCWZvciAoaW50IGkgPSAwOyBpIDwgY2hlY2tlZC5sZW5ndGg7IGkrKykgewotCQkJT2JqZWN0IGVsZW1lbnQgPSBjaGVja2VkW2ldOwotCQkJaWYoIWdldEdyYXllZChlbGVtZW50KSkgewotCQkJCWVsZW1lbnRzLmFkZChlbGVtZW50KTsKLQkJCX0KLQkJfQotICAgIAlyZXR1cm4gZWxlbWVudHMudG9BcnJheSgpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvdmlld3MvUHJvY2Vzc1RyZWVWaWV3ZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvdmlld3MvUHJvY2Vzc1RyZWVWaWV3ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2Y3OGQ4MC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3ZpZXdzL1Byb2Nlc3NUcmVlVmlld2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNTAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS52aWV3czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5Db2x1bW5EZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uQWN0aXZpdHlEZWVwQ29weUNvbmZpZ3VyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSUFjdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklSZXNvdXJjZUF3YXJlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuSUJTSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kLkFjdGl2aXR5RHJvcENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51aS5JQWN0aW9uVHlwZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ29sdW1uVmlld2VyRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ29sdW1uVmlld2VyRWRpdG9yQWN0aXZhdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ29sdW1uVmlld2VyRWRpdG9yQWN0aXZhdGlvblN0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRyZWVWaWV3ZXJMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVFeHBhbnNpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlVmlld2VyRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmxlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmxlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5NZW51OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLk1lbnVJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRyZWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVHJlZUNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UcmVlSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5XaWRnZXQ7Ci0KLQotLyoqCi0gKiBEaXNwbGF5cyB0aGUgUHJvY2VzcyBlbGVtZW50cyBpbiBhIHRyZWUgdGFibGUgdmlld2VyLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFByb2Nlc3NUcmVlVmlld2VyIGV4dGVuZHMgVHJlZVZpZXdlciBpbXBsZW1lbnRzCi0JCUlBY3Rpb25UeXBlUHJvdmlkZXIgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT1BZX1RYVCA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmNvcHlfdGV4dDsgCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVEVORF9UWFQgPSBBdXRob3JpbmdVSVJlc291cmNlcy5leHRlbmRfdGV4dDsgCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFRVBfQ09QWV9UWFQgPSBBdXRob3JpbmdVSVJlc291cmNlcy5kZWVwQ29weV90ZXh0OyAKLQkKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0QWN0aW9uVGV4dChpbnQgYWN0aW9uVHlwZSkgewotCQlzd2l0Y2ggKGFjdGlvblR5cGUpIHsKLQkJY2FzZSBDT1BZOgotCQkJcmV0dXJuIENPUFlfVFhUOwotCQljYXNlIEVYVEVORDoKLQkJCXJldHVybiBFWFRFTkRfVFhUOwotCQljYXNlIERFRVBfQ09QWToKLQkJCXJldHVybiBERUVQX0NPUFlfVFhUOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgaW50IGFjdGlvblR5cGUgPSBJQWN0aW9uVHlwZVByb3ZpZGVyLkNPUFk7Ci0KLQlwcml2YXRlIE1lbnUgYWN0aW9uVHlwZVBvcHVwOwotCi0JcHJpdmF0ZSBQb2ludCBhY3Rpb25UeXBlUG9wdXBMb2NhdGlvbjsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFByb2Nlc3NUcmVlVmlld2VyKENvbXBvc2l0ZSBwYXJlbnQsIGludCBzdHlsZSkgewotCQlzdXBlcihwYXJlbnQsIHN0eWxlKTsKLQotCQlmaW5hbCBUcmVlIHRyZWUgPSBnZXRUcmVlKCk7Ci0JCXRyZWUuc2V0SGVhZGVyVmlzaWJsZSh0cnVlKTsKLQkJdHJlZS5zZXRMaW5lc1Zpc2libGUodHJ1ZSk7Ci0KLQkJYWRkVHJlZUxpc3RlbmVyKG5ldyBJVHJlZVZpZXdlckxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgdHJlZUNvbGxhcHNlZChUcmVlRXhwYW5zaW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlzZXRJdGVtUHJvdmlkZXJFeHBhbmRlZChldmVudC5nZXRFbGVtZW50KCksIGZhbHNlKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgdHJlZUV4cGFuZGVkKFRyZWVFeHBhbnNpb25FdmVudCBldmVudCkgewotCQkJCXNldEl0ZW1Qcm92aWRlckV4cGFuZGVkKGV2ZW50LmdldEVsZW1lbnQoKSwgdHJ1ZSk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJQWNjZXNzaWJsZSBhY2Nlc3NpYmxlID0gdHJlZS5nZXRBY2Nlc3NpYmxlKCk7Ci0JCWFjY2Vzc2libGUuYWRkQWNjZXNzaWJsZUxpc3RlbmVyIChuZXcgQWNjZXNzaWJsZUFkYXB0ZXIgKCkgewotCQkJcHVibGljIHZvaWQgZ2V0TmFtZSAoQWNjZXNzaWJsZUV2ZW50IGUpIHsKLQkJCQlzdXBlci5nZXROYW1lKGUpOwotCQkJCWlmIChlLmNoaWxkSUQgPj0gMCkgewotCQkJCQlUcmVlSXRlbVtdIGl0ZW1zID0gdHJlZS5nZXRTZWxlY3Rpb24oKTsKLQkJCQkJaWYgKGl0ZW1zICE9IG51bGwgJiYgaXRlbXMubGVuZ3RoID09IDEpIHsKLQkJCQkJCVN0cmluZyBzdHJpbmdUb1JlYWQgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJCQkJVHJlZUl0ZW0gaXRlbSA9IChUcmVlSXRlbSkgaXRlbXNbMF07Ci0JCQkJCQlpZiAoaXRlbSAhPSBudWxsKSB7Ci0JCQkJCQkJVHJlZUNvbHVtbltdIGNvbHVtbnMgPSB0cmVlLmdldENvbHVtbnMoKTsKLQkJCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbHVtbnMubGVuZ3RoOyBpKyspIHsKLQkJCQkJCQkJVHJlZUNvbHVtbiBjb2x1bW4gPSBjb2x1bW5zW2ldOwotCQkJCQkJCQlzdHJpbmdUb1JlYWQgKz0gY29sdW1uLmdldFRleHQoKSArICIgIiAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQkJKyBpdGVtLmdldFRleHQoaSk7Ci0JCQkJCQkJfQotCQkJCQkJCWUucmVzdWx0ID0gc3RyaW5nVG9SZWFkOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9KTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdXAgY29sdW5tcyBhY2NvcmRpbmcgdG8gdGhlIGdpdmVuIGFycmF5IG9mIGRlc2NyaXB0b3JzCi0JICogQHBhcmFtIGNvbHVtbkRlc2NyaXB0b3JzCi0JICovCi0JcHVibGljIHZvaWQgc2V0dXBDb2x1bW5zKENvbHVtbkRlc2NyaXB0b3JbXSBjb2x1bW5EZXNjcmlwdG9ycykgewotCQkvLyBSZW1vdmUgYWxsIG9sZCBUcmVlQ29sdW1ucy4KLQkJVHJlZUNvbHVtbltdIGNvbHMgPSBnZXRUcmVlKCkuZ2V0Q29sdW1ucygpOwotCQlpbnQgc2l6ZSA9IGNvbHMubGVuZ3RoOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJY29sc1tpXS5kaXNwb3NlKCk7Ci0JCX0KLQotCQlTdHJpbmdbXSBjb2xQcm9wcyA9IG5ldyBTdHJpbmdbY29sdW1uRGVzY3JpcHRvcnMubGVuZ3RoXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb2x1bW5EZXNjcmlwdG9ycy5sZW5ndGg7IGkrKykgewotCQkJY29sUHJvcHNbaV0gPSBjb2x1bW5EZXNjcmlwdG9yc1tpXS5pZDsKLQkJCVRyZWVDb2x1bW4gY29sdW1uID0gbmV3IFRyZWVDb2x1bW4oZ2V0VHJlZSgpLAotCQkJCQljb2x1bW5EZXNjcmlwdG9yc1tpXS5hbGlnbm1lbnQpOwotCQkJY29sdW1uLnNldFRleHQoY29sdW1uRGVzY3JpcHRvcnNbaV0ubGFiZWwpOwotCQkJY29sdW1uLnNldFJlc2l6YWJsZShjb2x1bW5EZXNjcmlwdG9yc1tpXS5yZXNpemFibGUpOwotCQkJY29sdW1uLnNldFdpZHRoKGNvbHVtbkRlc2NyaXB0b3JzW2ldLndpZHRoKTsKLQkJfQotCi0JCXNldENvbHVtblByb3BlcnRpZXMoY29sUHJvcHMpOwotCi0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldEl0ZW1Qcm92aWRlckV4cGFuZGVkKE9iamVjdCBlbGVtZW50LCBib29sZWFuIGV4cGFuZCkgewotCQlPYmplY3QgYWRhcHRlciA9IGdldEFkYXB0ZXJGYWN0b3J5KCkuYWRhcHQoZWxlbWVudCwKLQkJCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQlpZiAoYWRhcHRlciBpbnN0YW5jZW9mIElCU0l0ZW1Qcm92aWRlcikgewotCQkJKChJQlNJdGVtUHJvdmlkZXIpIGFkYXB0ZXIpLnNldEV4cGFuZGVkKEJvb2xlYW4udmFsdWVPZihleHBhbmQpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gdGhlIEFkYXB0ZXJGYWN0b3J5Ci0JICovCi0JcHVibGljIEFkYXB0ZXJGYWN0b3J5IGdldEFkYXB0ZXJGYWN0b3J5KCkgewotCQlyZXR1cm4gZ2V0Q29udGVudFByb3ZpZGVyKCkgPT0gbnVsbCA/IG51bGwKLQkJCQk6ICgoQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIpIGdldENvbnRlbnRQcm92aWRlcigpKQotCQkJCQkJLmdldEFkYXB0ZXJGYWN0b3J5KCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlVHJlZVZpZXdlciNzZXRFeHBhbmRlZChJdGVtLCBib29sZWFuKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldEV4cGFuZGVkKEl0ZW0gbm9kZSwgYm9vbGVhbiBleHBhbmQpIHsKLQkJc3VwZXIuc2V0RXhwYW5kZWQobm9kZSwgZXhwYW5kKTsKLQkJT2JqZWN0IGFkYXB0ZXIgPSBnZXRBZGFwdGVyRmFjdG9yeSgpLmFkYXB0KG5vZGUuZ2V0RGF0YSgpLAotCQkJCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCWlmIChhZGFwdGVyIGluc3RhbmNlb2YgSUJTSXRlbVByb3ZpZGVyKSB7Ci0JCQlJQlNJdGVtUHJvdmlkZXIgYnNJdGVtUHJvdmlkZXIgPSAoKElCU0l0ZW1Qcm92aWRlcikgYWRhcHRlcik7Ci0JCQlpZiAoYnNJdGVtUHJvdmlkZXIuaXNFeHBhbmRlZCgpID09IG51bGwpIHsKLQkJCQlic0l0ZW1Qcm92aWRlci5zZXRFeHBhbmRlZCgoQm9vbGVhbi52YWx1ZU9mKGV4cGFuZCkpKTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRFeHBhbmRlZChJdGVtIGl0ZW0sIE9iamVjdCBlbGVtZW50KSB7Ci0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciBhZGFwdGVyID0gKElUcmVlSXRlbUNvbnRlbnRQcm92aWRlcikgZ2V0QWRhcHRlckZhY3RvcnkoKS5hZGFwdChlbGVtZW50LAotCQkJCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCWlmKGFkYXB0ZXIuaGFzQ2hpbGRyZW4oZWxlbWVudCkpIHsKLQkJCWlmIChhZGFwdGVyIGluc3RhbmNlb2YgSUJTSXRlbVByb3ZpZGVyKSB7Ci0JCQkJQm9vbGVhbiBleHBhbmQgPSAoKElCU0l0ZW1Qcm92aWRlcikgYWRhcHRlcikuaXNFeHBhbmRlZCgpOwotCQkJCWlmIChleHBhbmQgIT0gbnVsbCkgewotCQkJCQlzZXRFeHBhbmRlZFN0YXRlKGl0ZW0sIGV4cGFuZC5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkFic3RyYWN0VHJlZVZpZXdlciNpbnRlcm5hbFJlZnJlc2goV2lkZ2V0LAotCSAqICAgICAgT2JqZWN0LCBib29sZWFuLCBib29sZWFuKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGludGVybmFsUmVmcmVzaChXaWRnZXQgd2lkZ2V0LCBPYmplY3QgZWxlbWVudCwKLQkJCWJvb2xlYW4gZG9TdHJ1Y3QsIGJvb2xlYW4gdXBkYXRlTGFiZWxzKSB7Ci0JCXN1cGVyLmludGVybmFsUmVmcmVzaCh3aWRnZXQsIGVsZW1lbnQsIGRvU3RydWN0LCB1cGRhdGVMYWJlbHMpOwotCi0JCWlmIChkb1N0cnVjdCkgewotCQkJcHJlc2VydmVFeHBhbmRlZFN0YXRlKHdpZGdldCk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHByZXNlcnZlRXhwYW5kZWRTdGF0ZShXaWRnZXQgd2lkZ2V0KSB7Ci0JCWlmICh3aWRnZXQgaW5zdGFuY2VvZiBJdGVtKSB7Ci0JCQlJdGVtIGl0ZW0gPSAoSXRlbSkgd2lkZ2V0OwotCQkJc2V0RXhwYW5kZWQoaXRlbSwgaXRlbS5nZXREYXRhKCkpOwotCQl9IGVsc2UgewotCQkJSXRlbVtdIGNoaWxkcmVuID0gZ2V0Q2hpbGRyZW4od2lkZ2V0KTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKLQkJCQlJdGVtIGNoaWxkID0gY2hpbGRyZW5baV07Ci0JCQkJaWYgKGNoaWxkIGluc3RhbmNlb2YgSXRlbSkgewotCQkJCQlJdGVtIGl0ZW0gPSAoSXRlbSkgY2hpbGQ7Ci0JCQkJCXNldEV4cGFuZGVkKGl0ZW0sIGl0ZW0uZ2V0RGF0YSgpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW50ZXJuYWxJbml0aWFsaXplVHJlZShDb250cm9sIHdpZGdldCkgewotCQlzdXBlci5pbnRlcm5hbEluaXRpYWxpemVUcmVlKHdpZGdldCk7Ci0JCXByZXNlcnZlRXhwYW5kZWRTdGF0ZSh3aWRnZXQpOwotCX0KLQotCXByaXZhdGUgQ29tbWFuZCBjb21tYW5kOwotCi0JcHJpdmF0ZSBJQWN0aW9uTWFuYWdlciBhY3Rpb25NYW5hZ2VyOwotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnVpLklBY3Rpb25UeXBlUHJvdmlkZXIjZ2V0QWN0aW9uVHlwZSgpCi0JICovCi0vLwlwdWJsaWMgaW50IGdldEFjdGlvblR5cGUoKSB7Ci0vLwkJaWYgKGFjdGlvblR5cGVQb3B1cCA9PSBudWxsKSB7Ci0vLwkJCWNyZWF0ZUFjdGlvblR5cGVQb3B1cCgpOwotLy8JCX0KLS8vCi0vLwkJRGlzcGxheS5nZXRDdXJyZW50KCkuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotLy8KLS8vCQkJcHVibGljIHZvaWQgcnVuKCkgewotLy8JCQkJYWN0aW9uVHlwZSA9IDA7Ci0vLwkJCQlhY3Rpb25UeXBlUG9wdXAuc2V0TG9jYXRpb24oYWN0aW9uVHlwZVBvcHVwTG9jYXRpb24pOwotLy8JCQkJYWN0aW9uVHlwZVBvcHVwLnNldFZpc2libGUodHJ1ZSk7Ci0vLwkJCX0KLS8vCi0vLwkJfSk7Ci0vLwotLy8JCXJldHVybiBhY3Rpb25UeXBlOwotLy8JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUFjdGlvblR5cGVQb3B1cChpbnRbXSBjaG9pY2VzKSB7Ci0JCWFjdGlvblR5cGVQb3B1cCA9IG5ldyBNZW51KGdldENvbnRyb2woKSk7Ci0JCVNlbGVjdGlvbkxpc3RlbmVyIHNlbGVjdGlvbkxpc3RlbmVyID0gbmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlNZW51SXRlbSBpdGVtID0gKChNZW51SXRlbSkgZS5nZXRTb3VyY2UoKSk7Ci0JCQkJU3RyaW5nIHRleHQgPSBpdGVtLmdldFRleHQoKTsKLQkJCQlpZiAodGV4dCA9PSBDT1BZX1RYVCkgewotCQkJCQlQcm9jZXNzVHJlZVZpZXdlci50aGlzLmFjdGlvblR5cGUgPSBJQWN0aW9uVHlwZVByb3ZpZGVyLkNPUFk7Ci0JCQkJfSBlbHNlIGlmICh0ZXh0ID09IEVYVEVORF9UWFQpIHsKLQkJCQkJUHJvY2Vzc1RyZWVWaWV3ZXIudGhpcy5hY3Rpb25UeXBlID0gSUFjdGlvblR5cGVQcm92aWRlci5FWFRFTkQ7Ci0JCQkJfSBlbHNlIGlmICh0ZXh0ID09IERFRVBfQ09QWV9UWFQpIHsKLQkJCQkJUHJvY2Vzc1RyZWVWaWV3ZXIudGhpcy5hY3Rpb25UeXBlID0gREVFUF9DT1BZOwotCQkJCX0KLQotCQkJCWlmIChjb21tYW5kIGluc3RhbmNlb2YgQWN0aXZpdHlEcm9wQ29tbWFuZCkgewotCQkJCQlBY3Rpdml0eURyb3BDb21tYW5kIGNtZCA9ICgoQWN0aXZpdHlEcm9wQ29tbWFuZCkgY29tbWFuZCk7Ci0JCQkJCWNtZC5zZXRUeXBlKFByb2Nlc3NUcmVlVmlld2VyLnRoaXMuYWN0aW9uVHlwZSk7Ci0JCQkJCWNtZC5zZXRMYWJlbCh0ZXh0KTsKLQkJCQkJCi0JCQkJCWlmIChQcm9jZXNzVHJlZVZpZXdlci50aGlzLmFjdGlvblR5cGUgPT0gREVFUF9DT1BZICkgewotCQkJCQkJY21kLnNldEFjdGl2aXR5RGVlcENvcHlDb25maWd1cmF0b3IobmV3IEFjdGl2aXR5RGVlcENvcHlDb25maWd1cmF0b3IoKSk7Ci0JCQkJCX0KLQkJCQkJCi0JCQkJfQotCi0JCQkJaWYgKGFjdGlvbk1hbmFnZXIgIT0gbnVsbAotCQkJCQkJJiYgY29tbWFuZCBpbnN0YW5jZW9mIElSZXNvdXJjZUF3YXJlQ29tbWFuZCkgewotCQkJCQlhY3Rpb25NYW5hZ2VyLmV4ZWN1dGUoKElSZXNvdXJjZUF3YXJlQ29tbWFuZCkgY29tbWFuZCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJY29tbWFuZC5leGVjdXRlKCk7Ci0JCQkJfQotCi0JCQkJYWN0aW9uVHlwZVBvcHVwLnNldFZpc2libGUoZmFsc2UpOwotCQkJfQotCi0JCX07Ci0JCQotCQlmb3IgKGludCBhY3Rpb25UeXBlIDogY2hvaWNlcykgewotCQkJTWVudUl0ZW0gbWVudUl0ZW0gPSBuZXcgTWVudUl0ZW0oYWN0aW9uVHlwZVBvcHVwLCBTV1QuQ0FTQ0FERSk7Ci0JCQltZW51SXRlbS5zZXRUZXh0KGdldEFjdGlvblRleHQoYWN0aW9uVHlwZSkpOwotCQkJbWVudUl0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIoc2VsZWN0aW9uTGlzdGVuZXIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnVpLklBY3Rpb25UeXBlUHJvdmlkZXIjc2V0SW5wdXREYXRhKE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJbnB1dERhdGEoT2JqZWN0IG9iamVjdCkgewotCQlhY3Rpb25UeXBlUG9wdXBMb2NhdGlvbiA9IChQb2ludCkgb2JqZWN0OwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51aS5JQWN0aW9uVHlwZVByb3ZpZGVyI2V4ZWN1dGUob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQsIGJvb2xlYW4pCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZShDb21tYW5kIGNtZCwgaW50W10gY2hvaWNlcykgewotCQljcmVhdGVBY3Rpb25UeXBlUG9wdXAoY2hvaWNlcyk7Ci0KLQkJdGhpcy5jb21tYW5kID0gY21kOwotCQlhY3Rpb25UeXBlUG9wdXAuc2V0TG9jYXRpb24oYWN0aW9uVHlwZVBvcHVwTG9jYXRpb24pOwotCQlhY3Rpb25UeXBlUG9wdXAuc2V0VmlzaWJsZSh0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiBDaGFuZ2VzIGRlZmF1bHQgYmVoYXZpb3Igb2YgYWN0aXZhdGluZyB0ZXh0IGNlbGwgZWRpdG9yIGZyb20gc2luZ2xlIG1vdXNlIGNsaWNrIHRvIGRvdWJsZSBtb3VzZSBjbGljawotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGhvb2tFZGl0aW5nU3VwcG9ydChDb250cm9sIGNvbnRyb2wpIHsKLQkJdHJ5IHsKLQkJCVRyZWVWaWV3ZXJFZGl0b3IuY3JlYXRlKHRoaXMsIG5ldyBDb2x1bW5WaWV3ZXJFZGl0b3JBY3RpdmF0aW9uU3RyYXRlZ3kodGhpcykgewotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCBib29sZWFuIGlzRWRpdG9yQWN0aXZhdGlvbkV2ZW50KAotCQkJCQkJQ29sdW1uVmlld2VyRWRpdG9yQWN0aXZhdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJCXJldHVybiBldmVudC5ldmVudFR5cGUgPT0gQ29sdW1uVmlld2VyRWRpdG9yQWN0aXZhdGlvbkV2ZW50Lk1PVVNFX0RPVUJMRV9DTElDS19TRUxFQ1RJT04KLQkJCQkJfHwgZXZlbnQuZXZlbnRUeXBlID09IENvbHVtblZpZXdlckVkaXRvckFjdGl2YXRpb25FdmVudC5QUk9HUkFNTUFUSUMKLQkJCQkJfHwgZXZlbnQuZXZlbnRUeXBlID09IENvbHVtblZpZXdlckVkaXRvckFjdGl2YXRpb25FdmVudC5UUkFWRVJTQUw7Ci0JCQkJfQotCQkJfSxDb2x1bW5WaWV3ZXJFZGl0b3IuREVGQVVMVCk7Ci0JCX0KLQkJY2F0Y2goTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgewotCQkJLy8gd29yay1hcm91bmQgZm9yIGEgYnVnIGluIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVZpZXdlckVkaXRvci5jcmVhdGUoVHJlZVZpZXdlciwgU1dURm9jdXNDZWxsTWFuYWdlciwgQ29sdW1uVmlld2VyRWRpdG9yQWN0aXZhdGlvblN0cmF0ZWd5LCBpbnQpCi0JCQkvLyB0aGF0IHRyaWVkIHRvIGNhbGwgU1dURm9jdXNDZWxsTWFuYWdlci5pbml0KCkgZXZlbiBTV1RGb2N1c0NlbGxNYW5hZ2VyIGlzIG51bGwJCQotCQl9Ci0JCXN1cGVyLmhvb2tFZGl0aW5nU3VwcG9ydChjb250cm9sKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudWkuSUFjdGlvblR5cGVQcm92aWRlciNzZXRBY3Rpb25NYW5hZ2VyKElBY3Rpb25NYW5hZ2VyKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFjdGlvbk1hbmFnZXIoSUFjdGlvbk1hbmFnZXIgYWN0aW9uTWdyKSB7Ci0JCWFjdGlvbk1hbmFnZXIgPSBhY3Rpb25NZ3I7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS92aWV3cy9Qcm9jZXNzVmlld2VyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3ZpZXdzL1Byb2Nlc3NWaWV3ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTczYmZiNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3ZpZXdzL1Byb2Nlc3NWaWV3ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnZpZXdzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5jZWxsZWRpdG9ycy5BYnN0cmFjdENoZWNrQm94Q2VsbEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDZWxsTW9kaWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vdXNlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vdXNlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVHJlZUNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UcmVlSXRlbTsKLQotLyoqCi0gKiBEaXNwbGF5cyB0aGUgUHJvY2VzcyBlbGVtZW50cyBpbiBhIHRyZWUgdGFibGUgdmlld2VyLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFByb2Nlc3NWaWV3ZXIgZXh0ZW5kcyBQcm9jZXNzVHJlZVZpZXdlciB7Ci0KLQlwcml2YXRlIFN0cmluZ1tdIGNvbHVtblByb3BlcnRpZXM7Ci0KLQlwcml2YXRlIEFic3RyYWN0Q2hlY2tCb3hDZWxsRWRpdG9yW10gY2hlY2tCb3hDZWxsRWRpdG9ycyA9IG51bGw7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBQcm9jZXNzVmlld2VyKENvbXBvc2l0ZSBwYXJlbnQsIGludCBzdHlsZSkgewotCQlzdXBlcihwYXJlbnQsIHN0eWxlKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gcGFyZW50IC0gdW5kZXJseWluZyB0cmVlCi0JICogCi0JICogQHJldHVybiBwYXJlbnQKLQkgKi8KLQlwdWJsaWMgQ29tcG9zaXRlIGdldENlbGxFZGl0b3JQYXJlbnQoKSB7Ci0JCXJldHVybiBnZXRUcmVlKCk7Ci0JfQotCi0JLyoqCi0JICogU2V0IGNoZWNrIGJveCBjZWxsIGVkaXRvcnMKLQkgKiAKLQkgKiBAcGFyYW0gY2hlY2tCb3hDZWxsRWRpdG9ycwotCSAqLwotCXB1YmxpYyB2b2lkIHNldENoZWNrQm94Q2VsbEVkaXRvcnMoCi0JCQlBYnN0cmFjdENoZWNrQm94Q2VsbEVkaXRvcltdIGNoZWNrQm94Q2VsbEVkaXRvcnMpIHsKLQkJdGhpcy5jaGVja0JveENlbGxFZGl0b3JzID0gY2hlY2tCb3hDZWxsRWRpdG9yczsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGVja0JveENlbGxFZGl0b3JzLmxlbmd0aDsgaSsrKSB7Ci0JCQlBYnN0cmFjdENoZWNrQm94Q2VsbEVkaXRvciBlZGl0b3IgPSBjaGVja0JveENlbGxFZGl0b3JzW2ldOwotCQkJaWYgKGVkaXRvciA9PSBudWxsKQotCQkJCWNvbnRpbnVlOwotCQkJZWRpdG9yLnNldENvbHVtbkluZGV4KGkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnZpZXdzLlByb2Nlc3NUcmVlVmlld2VyI2hvb2tDb250cm9sKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2wpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaG9va0NvbnRyb2woQ29udHJvbCBjb250cm9sKSB7Ci0JCXN1cGVyLmhvb2tDb250cm9sKGNvbnRyb2wpOwotCQlnZXRUcmVlKCkuYWRkTW91c2VMaXN0ZW5lcihuZXcgTW91c2VBZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgbW91c2VEb3duKE1vdXNlRXZlbnQgZSkgewotCQkJCW1vZGlmeUl0ZW0oZSk7Ci0JCQl9Ci0JCX0pOwotCQkvLyBnZXRUcmVlKCkuYWRkTW91c2VNb3ZlTGlzdGVuZXIobmV3IE1vdXNlTW92ZUxpc3RlbmVyKCl7Ci0JCS8vIHB1YmxpYyB2b2lkIG1vdXNlTW92ZShNb3VzZUV2ZW50IGUpewotCQkvLyBzZXRVbnNldEVkaXRvcihlKTsKLQkJLy8gfQotCQkvLyB9KTsKLQkJTGlzdGVuZXIgcGFpbnRMaXN0ZW5lciA9IG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQkJc3dpdGNoIChldmVudC50eXBlKSB7Ci0JCQkJY2FzZSBTV1QuUGFpbnRJdGVtOiB7Ci0JCQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiZXZlbnQuaW5kZXggPSAiKyBldmVudC5pbmRleCk7Ci0JCQkJCUltYWdlIGltYWdlID0gZ2V0Q2hlY2tCb3hDZWxsRWRpdG9ySW1hZ2UoZXZlbnQpOwotCQkJCQlpZiAoaW1hZ2UgPT0gbnVsbCkKLQkJCQkJCXJldHVybjsKLQkJCQkJVHJlZUNvbHVtbiBjb2wgPSBnZXRUcmVlKCkuZ2V0Q29sdW1uKGV2ZW50LmluZGV4KTsKLQkJCQkJaW50IHggPSBldmVudC54ICsgY29sLmdldFdpZHRoKCkgLyAyOwotCQkJCQlSZWN0YW5nbGUgcmVjdCA9IGltYWdlLmdldEJvdW5kcygpOwotCQkJCQlpbnQgb2Zmc2V0ID0gTWF0aC5tYXgoMCwgKGV2ZW50LmhlaWdodCAtIHJlY3QuaGVpZ2h0KSAvIDIpOwotCQkJCQlldmVudC5nYy5kcmF3SW1hZ2UoaW1hZ2UsIHggLSByZWN0LndpZHRoIC8gMiwgZXZlbnQueQotCQkJCQkJCSsgb2Zmc2V0KTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCX0KLQkJCX0KLQkJfTsKLQkJZ2V0VHJlZSgpLmFkZExpc3RlbmVyKFNXVC5QYWludEl0ZW0sIHBhaW50TGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS52aWV3cy5Qcm9jZXNzVHJlZVZpZXdlciNkb1VwZGF0ZUl0ZW0ob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuSXRlbSwKLQkgKiAgICAgIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZG9VcGRhdGVJdGVtKEl0ZW0gaXRlbSwgT2JqZWN0IGVsZW1lbnQpIHsKLQkJc3VwZXIuZG9VcGRhdGVJdGVtKGl0ZW0sIGVsZW1lbnQpOwotCi0JCWlmIChjaGVja0JveENlbGxFZGl0b3JzICE9IG51bGwgJiYgY29sdW1uUHJvcGVydGllcyAhPSBudWxsCi0JCQkJJiYgY29sdW1uUHJvcGVydGllcy5sZW5ndGggPiAwKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGNoZWNrQm94Q2VsbEVkaXRvcnMubGVuZ3RoOyBpKyspIHsKLQkJCQlBYnN0cmFjdENoZWNrQm94Q2VsbEVkaXRvciBlZGl0b3IgPSBjaGVja0JveENlbGxFZGl0b3JzW2ldOwotCQkJCWlmIChlZGl0b3IgPT0gbnVsbCkKLQkJCQkJY29udGludWU7Ci0JCQkJKChUcmVlSXRlbSkgaXRlbSkuc2V0VGV4dChpLCAiIik7IC8vJE5PTi1OTFMtMSQKLQotCQkJfQotCQl9Ci0KLQl9Ci0KLQlwcml2YXRlIEltYWdlIGdldENoZWNrQm94Q2VsbEVkaXRvckltYWdlKEV2ZW50IGV2ZW50KSB7Ci0JCXJldHVybiBnZXRDaGVja0JveENlbGxFZGl0b3JJbWFnZShldmVudC5pbmRleCwgKFRyZWVJdGVtKSBldmVudC5pdGVtKTsKLQl9Ci0KLQlwcml2YXRlIEltYWdlIGdldENoZWNrQm94Q2VsbEVkaXRvckltYWdlKGludCBjb2x1bW5JbmRleCwgVHJlZUl0ZW0gaXRlbSkgewotCQlpZiAoY2hlY2tCb3hDZWxsRWRpdG9ycyA9PSBudWxsCi0JCQkJfHwgY2hlY2tCb3hDZWxsRWRpdG9yc1tjb2x1bW5JbmRleF0gPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gY2hlY2tCb3hDZWxsRWRpdG9yc1tjb2x1bW5JbmRleF0uZ2V0SW1hZ2UoaXRlbSwKLQkJCQljb2x1bW5Qcm9wZXJ0aWVzW2NvbHVtbkluZGV4XSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVWaWV3ZXIjc2V0Q2VsbE1vZGlmaWVyKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNlbGxNb2RpZmllcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDZWxsTW9kaWZpZXIoSUNlbGxNb2RpZmllciBtb2RpZmllcikgewotCQlzdXBlci5zZXRDZWxsTW9kaWZpZXIobW9kaWZpZXIpOwotCi0JCWlmIChjaGVja0JveENlbGxFZGl0b3JzICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY2hlY2tCb3hDZWxsRWRpdG9ycy5sZW5ndGg7IGkrKykgewotCQkJCUFic3RyYWN0Q2hlY2tCb3hDZWxsRWRpdG9yIGVkaXRvciA9IGNoZWNrQm94Q2VsbEVkaXRvcnNbaV07Ci0JCQkJaWYgKGVkaXRvciA9PSBudWxsKQotCQkJCQljb250aW51ZTsKLQkJCQllZGl0b3Iuc2V0Q2VsbE1vZGlmaWVyKG1vZGlmaWVyKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIHVzZWQgZm9yIG1vdXNlIGRvd24gbGlzdGVuZXIKLQkgKiAKLQkgKiBAcGFyYW0gZXZlbnQKLQkgKi8KLQlwcml2YXRlIHZvaWQgbW9kaWZ5SXRlbShNb3VzZUV2ZW50IGV2ZW50KSB7Ci0JCVBvaW50IHB0ID0gbmV3IFBvaW50KGV2ZW50LngsIGV2ZW50LnkpOwotCQlUcmVlSXRlbSBpdGVtID0gZ2V0VHJlZSgpLmdldEl0ZW0ocHQpOwotCQlpZiAoaXRlbSA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgZ2V0VHJlZSgpLmdldENvbHVtbkNvdW50KCk7IGkrKykgewotCQkJUmVjdGFuZ2xlIHJlY3QgPSBpdGVtLmdldEJvdW5kcyhpKTsKLQkJCWlmIChyZWN0LmNvbnRhaW5zKHB0KSkgewotCQkJCUltYWdlIGltYWdlID0gZ2V0Q2hlY2tCb3hDZWxsRWRpdG9ySW1hZ2UoaSwgaXRlbSk7Ci0JCQkJaWYgKGltYWdlID09IG51bGwpCi0JCQkJCXJldHVybjsKLQkJCQlSZWN0YW5nbGUgaW1nUmVjdCA9IGltYWdlLmdldEJvdW5kcygpOwotCQkJCWludCBvZmZzZXQgPSBNYXRoLm1heCgwLCAocmVjdC5oZWlnaHQgLSBpbWdSZWN0LmhlaWdodCkgLyAyKTsKLQkJCQlpbnQgeCA9IHJlY3QueCArIHJlY3Qud2lkdGggLyAyIC0gaW1nUmVjdC53aWR0aCAvIDI7Ci0JCQkJaW50IHkgPSByZWN0LnkgKyBvZmZzZXQ7Ci0JCQkJaW1nUmVjdCA9IG5ldyBSZWN0YW5nbGUoeCwgeSwgaW1nUmVjdC53aWR0aCwgaW1nUmVjdC5oZWlnaHQpOwotCQkJCWlmIChpbWdSZWN0LmNvbnRhaW5zKHB0KSkgewotCQkJCQljaGVja0JveENlbGxFZGl0b3JzW2ldLm1vZGlmeShpdGVtLCBjb2x1bW5Qcm9wZXJ0aWVzW2ldKTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlVmlld2VyI3NldENvbHVtblByb3BlcnRpZXMoamF2YS5sYW5nLlN0cmluZ1tdKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvbHVtblByb3BlcnRpZXMoU3RyaW5nW10gY29sdW1uUHJvcGVydGllcykgewotCQlzdXBlci5zZXRDb2x1bW5Qcm9wZXJ0aWVzKGNvbHVtblByb3BlcnRpZXMpOwotCQl0aGlzLmNvbHVtblByb3BlcnRpZXMgPSBjb2x1bW5Qcm9wZXJ0aWVzOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3ZpZXdzL1NhdmVhYmxlTGlicmFyeVZpZXdQYXJ0LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3ZpZXdzL1NhdmVhYmxlTGlicmFyeVZpZXdQYXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExZDM4ZmQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS92aWV3cy9TYXZlYWJsZUxpYnJhcnlWaWV3UGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS52aWV3czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JU2F2ZWFibGVQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuVmlld1BhcnQ7Ci0KLS8qKgotICogVGhlIGFic3RyYWN0IGNsYXNzIGZvciBhbGwgdmlld3MgdGhhdCByZXF1aXJlcyB0aGUgc3VwcG9ydCBvZiBzYXZpbmcgYSBNZXRob2QKLSAqIExpYnJhcnkgdmlhIHRoZSBTYXZlIGFjdGlvbi4KLSAqIAotICogQGF1dGhvciBQaG9uZyBMZQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBTYXZlYWJsZUxpYnJhcnlWaWV3UGFydCBleHRlbmRzIFZpZXdQYXJ0IGltcGxlbWVudHMKLQkJSVNhdmVhYmxlUGFydCB7Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklTYXZlYWJsZVBhcnQjZG9TYXZlKElQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHVibGljIHZvaWQgZG9TYXZlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlpZiAobW9uaXRvciAhPSBudWxsKSB7Ci0JCQltb25pdG9yCi0JCQkJCS5iZWdpblRhc2soCi0JCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuc2F2aW5nTGlicmFyeVRhc2tfbmFtZSwgSVByb2dyZXNzTW9uaXRvci5VTktOT1dOKTsgCi0JCQlTdHJpbmcgbGliUGF0aCA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLQkJCQkJLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5TG9jYXRpb24oKTsKLQkJCXRyeSB7Ci0JCQkJTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5zYXZlQ3VycmVudE1ldGhvZExpYnJhcnkoKTsKLQkJCQlmaXJlUHJvcGVydHlDaGFuZ2UoSUVkaXRvclBhcnQuUFJPUF9ESVJUWSk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCUF1dGhvcmluZ1VJUGx1Z2luCi0JCQkJCQkuZ2V0RGVmYXVsdCgpCi0JCQkJCQkuZ2V0TXNnRGlhbG9nKCkKLQkJCQkJCS5kaXNwbGF5RXJyb3IoCi0JCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLnNhdmVMaWJyYXJ5RGlhbG9nX3RpdGxlLCAKLQkJCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuYmluZChBdXRob3JpbmdVSVJlc291cmNlcy5zYXZlTGlicmFyeVRvRXJyb3JfbXNnLCBsaWJQYXRoKSwgCi0JCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLmVycm9yX3JlYXNvbiwgCi0JCQkJCQkJCWUpOwotCQkJfSBmaW5hbGx5IHsKLQkJCQltb25pdG9yLmRvbmUoKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVNhdmVhYmxlUGFydCNkb1NhdmVBcygpCi0JICovCi0JcHVibGljIHZvaWQgZG9TYXZlQXMoKSB7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JU2F2ZWFibGVQYXJ0I2lzRGlydHkoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRGlydHkoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklTYXZlYWJsZVBhcnQjaXNTYXZlQXNBbGxvd2VkKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NhdmVBc0FsbG93ZWQoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklTYXZlYWJsZVBhcnQjaXNTYXZlT25DbG9zZU5lZWRlZCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTYXZlT25DbG9zZU5lZWRlZCgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3ZpZXdzL1ZpZXdIZWxwZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvdmlld3MvVmlld0hlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNmVjN2UyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvdmlld3MvVmlld0hlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTg3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudmlld3M7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLlN0cmluZ1dyaXRlcjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5XcmFwcGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS51dGlsLk1zZ0JveDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpLnV0aWwuTXNnRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udWkudXRpbC5QZXJzcGVjdGl2ZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuSUxpYnJhcnlNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkZlYXR1cmVWYWx1ZVdyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51aS5Vc2VySW50ZXJhY3Rpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLk1pc2M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuTGlicmFyeVVJTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UucmVmcmVzaC5SZWZyZXNoSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy5JTGlicmFyeVBlcnNpc3RlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaWJhYmxlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk5hbWVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklWaWV3UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotCi0vKioKLSAqIEEgaGVscGVyIGNsYXNzIGZvciBtYW5hZ2luZyB0aGUgdmlld3MgYW5kIGVkaXRvcnMgaW4gdGhlIEF1dGhvcmluZwotICogcGVyc3BlY3RpdmUuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBWaWV3SGVscGVyIHsKLQotCS8qKgotCSAqIFByb21wdHMgdGhlIHVzZXIgdG8gc2F2ZSB0aGUgb3BlbiBsaWJyYXJ5IGlmIGl0IGhhcyBiZWVuIG1vZGlmaWVkLgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTxjb2RlPiBpZiB0aGUgdXNlciBzYXZlZCBvciBkaXNjYXJkZWQgdGhlIGNoYW5nZSwKLQkgKiAJCSAgIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiB0aGUgdXNlciBjYW5jZWxsZWQgdGhlIGFjdGlvbiB0aGF0Ci0JICogICAgICAgICB0cmlnZ2VyZWQgdGhpcyBjYWxsLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBwcm9tcHRTYXZlKCkgewotCQlJTGlicmFyeU1hbmFnZXIgbWFuYWdlciA9IChJTGlicmFyeU1hbmFnZXIpIExpYnJhcnlTZXJ2aWNlCi0JCQkJLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudExpYnJhcnlNYW5hZ2VyKCk7Ci0JCWlmIChtYW5hZ2VyICE9IG51bGwgJiYgbWFuYWdlci5pc01ldGhvZExpYnJhcnlNb2RpZmllZCgpKSB7Ci0JCQlpbnQgcmV0ID0gTXNnQm94LnByb21wdChBdXRob3JpbmdVSVJlc291cmNlcy5zYXZlTGlicmFyeURpYWxvZ190aXRsZSwgCi0JCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLnNhdmVMaWJyYXJ5RGlhbG9nX3RleHQsIAotCQkJCQlTV1QuWUVTIHwgU1dULk5PIHwgU1dULkNBTkNFTCk7Ci0JCQlzd2l0Y2ggKHJldCkgewotCQkJY2FzZSBTV1QuWUVTOgotCQkJCXRyeSB7Ci0JCQkJCUxpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuc2F2ZUN1cnJlbnRNZXRob2RMaWJyYXJ5KCk7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJTXNnRGlhbG9nIGRpYWxvZyA9IEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKQotCQkJCQkJCS5nZXRNc2dEaWFsb2coKTsKLQkJCQkJZGlhbG9nCi0JCQkJCQkJLmRpc3BsYXlFcnJvcigKLQkJCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLnNhdmVMaWJyYXJ5RGlhbG9nX3RpdGxlLCAKLQkJCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLnNhdmVMaWJyYXJ5RXJyb3JfbXNnLCAKLQkJCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLmVycm9yX3JlYXNvbiwgZSk7IAotCi0JCQkJCXJldHVybiBkaWFsb2cKLQkJCQkJCQkuZGlzcGxheVByb21wdCgKLQkJCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLm9wZW5MaWJyYXJ5RGlhbG9nX3RpdGxlLCAKLQkJCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLm9wZW5MaWJyYXJ5RGlhbG9nX3RleHQpOyAKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFNXVC5OTzoKLQkJCQkvLyBEaXNjYXJkIGFsbCBjaGFuZ2VzIGJ5IHJlc2V0dGluZyBhbGwgcmVzb3VyY2VzIGFzIHVuY2hhbmdlZC4KLQkJCQltYW5hZ2VyLmRpc2NhcmRNZXRob2RMaWJyYXJ5Q2hhbmdlcygpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBTV1QuQ0FOQ0VMOgotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBQcm9tcHRzIHRoZSB1c2VyIHRvIHNhdmUgdGhlIG9wZW4gbGlicmFyeSBpZiBpdCBoYXMgYmVlbiBtb2RpZmllZC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBjaG9pY2UgdGhlIHVzZXIgbWFkZSB3aGVuIHByb21wdGVkIHRvIHNhdmUgLSBvbmUgb2YgU1dULllFUywgU1dULk5PLCBTV1QuQ0FOQ0VMCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgcHJvbXB0U2F2ZUludCgpIHsKLQkJSUxpYnJhcnlNYW5hZ2VyIG1hbmFnZXIgPSAoSUxpYnJhcnlNYW5hZ2VyKSBMaWJyYXJ5U2VydmljZQotCQkJCS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRMaWJyYXJ5TWFuYWdlcigpOwotCQlpZiAobWFuYWdlciAhPSBudWxsICYmIG1hbmFnZXIuaXNNZXRob2RMaWJyYXJ5TW9kaWZpZWQoKSkgewotCQkJaW50IHJldCA9IE1zZ0JveC5wcm9tcHQoQXV0aG9yaW5nVUlSZXNvdXJjZXMuc2F2ZUxpYnJhcnlEaWFsb2dfdGl0bGUsIAotCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5zYXZlTGlicmFyeURpYWxvZ190ZXh0LCAKLQkJCQkJU1dULllFUyB8IFNXVC5OTyB8IFNXVC5DQU5DRUwpOwotCQkJc3dpdGNoIChyZXQpIHsKLQkJCWNhc2UgU1dULllFUzoKLQkJCQl0cnkgewotCQkJCQlMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLnNhdmVDdXJyZW50TWV0aG9kTGlicmFyeSgpOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCU1zZ0RpYWxvZyBkaWFsb2cgPSBBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCQkJCQkuZ2V0TXNnRGlhbG9nKCk7Ci0JCQkJCWRpYWxvZwotCQkJCQkJCS5kaXNwbGF5RXJyb3IoCi0JCQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5zYXZlTGlicmFyeURpYWxvZ190aXRsZSwgCi0JCQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5zYXZlTGlicmFyeUVycm9yX21zZywgCi0JCQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5lcnJvcl9yZWFzb24sIGUpOyAKLQkJCQl9Ci0JCQkJcmV0dXJuIFNXVC5ZRVM7Ci0JCQljYXNlIFNXVC5OTzoKLQkJCQkvLyBEaXNjYXJkIGFsbCBjaGFuZ2VzIGJ5IHJlc2V0dGluZyBhbGwgcmVzb3VyY2VzIGFzIHVuY2hhbmdlZC4KLQkJCQltYW5hZ2VyLmRpc2NhcmRNZXRob2RMaWJyYXJ5Q2hhbmdlcygpOwotCQkJCXJldHVybiBTV1QuTk87Ci0JCQljYXNlIFNXVC5DQU5DRUw6Ci0JCQkJcmV0dXJuIFNXVC5DQU5DRUw7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gU1dULkNBTkNFTDsKLQl9Ci0KLQkvKioKLQkgKiBjbG9zZXMgYWxsIGVkaXRvcnMgb24gdGhlIGFjdGl2ZSBwYWdlCi0JICoKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgY2xvc2VBbGxFZGl0b3JzKCkgewotCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKQotCQkJCS5jbG9zZUFsbEVkaXRvcnModHJ1ZSk7Ci0JfQotCi0vLwkvKioKLS8vCSAqIGNsb3NlcyB0aGUgTWVzc2FnZVZpZXcgKGVycm9yIHZpZXcpCi0vLwkgKgotLy8JICovCi0vLwlwdWJsaWMgc3RhdGljIHZvaWQgY2xvc2VNZXNzYWdlVmlldygpIHsKLS8vCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKQotLy8JCQkJLmhpZGVWaWV3KE1lc3NhZ2VWaWV3LmdldFZpZXcoKSk7Ci0vLwl9Ci0KLQkvKioKLQkgKiBoYW5kbGVzIGEgZGFuZ2xpbmcgb2JqZWN0Ci0JICogQHBhcmFtIG9iamVjdAotCSAqIEByZXR1cm4KLQkgKiAJCQlPYmplY3QKLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9iamVjdCBoYW5kbGVEYW5nbGluZyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50Ci0JCQkJJiYgKChFT2JqZWN0KSBvYmplY3QpLmVSZXNvdXJjZSgpID09IG51bGwpIHsKLQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKS5kaXNwbGF5RXJyb3IoCi0JCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLmVycm9yRGlhbG9nX3RpdGxlLCAKLQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuYmluZChBdXRob3JpbmdVSVJlc291cmNlcy5lbGVtZW50QWxyZWFkeURlbGV0ZWRFcnJvcl9tc2csICgoTWV0aG9kRWxlbWVudCkgb2JqZWN0KS5nZXROYW1lKCkpKTsKLQkJCXJldHVybiBudWxsOwotCQl9IGVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIEZlYXR1cmVWYWx1ZVdyYXBwZXJJdGVtUHJvdmlkZXIpIHsKLQkJCUZlYXR1cmVWYWx1ZVdyYXBwZXJJdGVtUHJvdmlkZXIgYWRhcHRlciA9IChGZWF0dXJlVmFsdWVXcmFwcGVySXRlbVByb3ZpZGVyKSBvYmplY3Q7Ci0JCQlPYmplY3QgdmFsdWUgPSBhZGFwdGVyLmdldFZhbHVlKCk7Ci0JCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50Ci0JCQkJCSYmICgoRU9iamVjdCkgdmFsdWUpLmVSZXNvdXJjZSgpID09IG51bGwpIHsKLQkJCQlPYmplY3Qgb3duZXIgPSBUbmdVdGlsLnVud3JhcChhZGFwdGVyLmdldFBhcmVudCh2YWx1ZSkpOwotCQkJCWlmIChvd25lciBpbnN0YW5jZW9mIEl0ZW1Qcm92aWRlckFkYXB0ZXIpIHsKLQkJCQkJLy8gVGhpcyBpcyBhIFVJIGl0ZW0gcHJvdmlkZXIuCi0JCQkJCW93bmVyID0gKChJdGVtUHJvdmlkZXJBZGFwdGVyKSBvd25lcikuZ2V0VGFyZ2V0KCk7Ci0JCQkJfQotCQkJCVN0cmluZyBvd25lck5hbWUgPSAoKE1ldGhvZEVsZW1lbnQpIG93bmVyKS5nZXROYW1lKCk7Ci0JCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBhZGFwdGVyLmdldEZlYXR1cmUoKTsKLQkJCQlpZiAoZmVhdHVyZSAhPSBudWxsKSB7Ci0JCQkJCWlmIChBdXRob3JpbmdVSVBsdWdpbgotCQkJCQkJCS5nZXREZWZhdWx0KCkKLQkJCQkJCQkuZ2V0TXNnRGlhbG9nKCkKLQkJCQkJCQkuZGlzcGxheVByb21wdCgKLQkJCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLmRlbGV0ZURpYWxvZ190aXRsZSwgCi0JCQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5iaW5kKEF1dGhvcmluZ1VJUmVzb3VyY2VzLlZpZXdIZWxwZXJfYWxyZWFkeWRlbGV0ZWRjb25maXJtX3RleHQsICgoTWV0aG9kRWxlbWVudCkgdmFsdWUpCi0JCQkJCQkJCQkuZ2V0TmFtZSgpLCBvd25lck5hbWUpKSkgeyAKLQkJCQkJCS8vIFJlbW92ZSB0aGUgYXNzb2NpYXRpb24uCi0JCQkJCQlpZiAoZmVhdHVyZS5pc01hbnkoKSkgewotCQkJCQkJCSgoQ29sbGVjdGlvbikgKChFT2JqZWN0KSBvd25lcikuZUdldChmZWF0dXJlKSkKLQkJCQkJCQkJCS5yZW1vdmUodmFsdWUpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4KLQkJCQkJCQkuZ2V0RGVmYXVsdCgpCi0JCQkJCQkJLmdldE1zZ0RpYWxvZygpCi0JCQkJCQkJLmRpc3BsYXlFcnJvcigKLQkJCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLmVycm9yRGlhbG9nX3RpdGxlLCAKLQkJCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLmJpbmQoQXV0aG9yaW5nVUlSZXNvdXJjZXMuZWxlbWVudEFscmVhZHlEZWxldGVkRXJyb3JfbXNnLCAoKE1ldGhvZEVsZW1lbnQpIHZhbHVlKQotCQkJCQkJCQkJLmdldE5hbWUoKSkpOwotCQkJCX0KLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gb2JqZWN0OwotCX0KLQotCS8qIFRPRE86IElzIHRoaXMgc3RpbGwgbmVlZGVkPwotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2FkQWxsQW5kU2F2ZUFsbCgpIHsKLQkJZmluYWwgTWV0aG9kTGlicmFyeSBsaWIgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCk7Ci0JCWlmIChsaWIgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQkvLyBEbyB0aGUgd29yayB3aXRoaW4gYW4gb3BlcmF0aW9uIGJlY2F1c2UgdGhpcyBpcyBhIGxvbmcgcnVubmluZwotCQkvLyBhY3Rpdml0eSB0aGF0IG1vZGlmaWVzIHRoZSB3b3JrYmVuY2guCi0JCVdvcmtzcGFjZU1vZGlmeU9wZXJhdGlvbiBvcGVyYXRpb24gPSBuZXcgV29ya3NwYWNlTW9kaWZ5T3BlcmF0aW9uKCkgewotCQkJLy8gVGhpcyBpcyB0aGUgbWV0aG9kIHRoYXQgZ2V0cyBpbnZva2VkIHdoZW4gdGhlIG9wZXJhdGlvbiBydW5zLgotCQkJcHVibGljIHZvaWQgZXhlY3V0ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJCQltb25pdG9yLmJlZ2luVGFzayhBdXRob3JpbmdVSVJlc291cmNlcwotCQkJCQkJLmdldFN0cmluZygiQXV0aG9yaW5nVUkudXBncmFkaW5nTGlicmFyeVRhc2submFtZSIpLCAzKTsgLy8kTk9OLU5MUy0xJAotCQkJCXRyeSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQltb25pdG9yLndvcmtlZCgxKTsKLQkJCQkJCW1vbml0b3IKLQkJCQkJCQkJLnNldFRhc2tOYW1lKEF1dGhvcmluZ1VJUmVzb3VyY2VzCi0JCQkJCQkJCQkJLmdldFN0cmluZygiQXV0aG9yaW5nVUkubG9hZGluZ0xpYnJhcnlFbGVtZW50c1Rhc2submFtZSIpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJTW9kZWxTdG9yYWdlLmxvYWRBbGxQcm94aWVzKGxpYik7Ci0JCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlBdXRob3JpbmdVSVBsdWdpbgotCQkJCQkJCQkuZ2V0RGVmYXVsdCgpCi0JCQkJCQkJCS5nZXRNc2dEaWFsb2coKQotCQkJCQkJCQkuZGlzcGxheUVycm9yKAotCQkJCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzCi0JCQkJCQkJCQkJCQkuZ2V0U3RyaW5nKCJBdXRob3JpbmdVSS51cGdyYWRlTGlicmFyeURpYWxvZy50aXRsZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMKLQkJCQkJCQkJCQkJCS5nZXRTdHJpbmcoIkF1dGhvcmluZ1VJLnVwZ3JhZGVMaWJyYXJ5RXJyb3IubXNnIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcwotCQkJCQkJCQkJCQkJLmdldFN0cmluZygiQXV0aG9yaW5nVUkudXBncmFkZUxpYnJhcnlFcnJvci5yZWFzb24iKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJCWUpOwotCQkJCQkJcmV0dXJuOwotCQkJCQl9Ci0JCQkJCXRyeSB7Ci0JCQkJCQltb25pdG9yLndvcmtlZCgxKTsKLQkJCQkJCW1vbml0b3IKLQkJCQkJCQkJLnNldFRhc2tOYW1lKEF1dGhvcmluZ1VJUmVzb3VyY2VzCi0JCQkJCQkJCQkJLmdldFN0cmluZygiQXV0aG9yaW5nVUkuc2F2aW5nVXBncmFkZWRFbGVtZW50c1Rhc2submFtZSIpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsIHJlc291cmNlU2V0ID0gKE11bHRpRmlsZVJlc291cmNlU2V0SW1wbCkgbGliCi0JCQkJCQkJCS5lUmVzb3VyY2UoKS5nZXRSZXNvdXJjZVNldCgpOwotCQkJCQkJcmVzb3VyY2VTZXQuc2F2ZShMaWJyYXJ5UHJvY2Vzc29yLmdldEluc3RhbmNlKCkKLQkJCQkJCQkJLmdldFNhdmVPcHRpb25zKCksIHRydWUpOwotCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4KLQkJCQkJCQkJLmdldERlZmF1bHQoKQotCQkJCQkJCQkuZ2V0TXNnRGlhbG9nKCkKLQkJCQkJCQkJLmRpc3BsYXlFcnJvcigKLQkJCQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcwotCQkJCQkJCQkJCQkJLmdldFN0cmluZygiQXV0aG9yaW5nVUkudXBncmFkZUxpYnJhcnlEaWFsb2cudGl0bGUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzCi0JCQkJCQkJCQkJCQkuZ2V0U3RyaW5nKCJBdXRob3JpbmdVSS51cGdyYWRlTGlicmFyeUVycm9yLm1zZyIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMKLQkJCQkJCQkJCQkJCS5nZXRTdHJpbmcoIkF1dGhvcmluZ1VJLnNhdmVVcGdyYWRlZExpYnJhcnlFcnJvci5yZWFzb24iKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJCWUpOwotCQkJCQl9Ci0JCQkJfSBmaW5hbGx5IHsKLQkJCQkJbW9uaXRvci5kb25lKCk7Ci0JCQkJfQotCQkJfQotCQl9OwotCi0JCXRyeSB7Ci0JCQkvLyBSdW4gdGhlIG9wZXJhdGlvbiBhbmQgZGlzcGxheSB0aGUgcHJvZ3Jlc3MuCi0JCQluZXcgUHJvZ3Jlc3NNb25pdG9yRGlhbG9nKERpc3BsYXkuZ2V0RGVmYXVsdCgpLmdldEFjdGl2ZVNoZWxsKCkpCi0JCQkJCS5ydW4odHJ1ZSwgZmFsc2UsIG9wZXJhdGlvbik7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlBdXRob3JpbmdVSVBsdWdpbgotCQkJCQkuZ2V0RGVmYXVsdCgpCi0JCQkJCS5nZXRNc2dEaWFsb2coKQotCQkJCQkuZGlzcGxheUVycm9yKAotCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzCi0JCQkJCQkJCQkuZ2V0U3RyaW5nKCJBdXRob3JpbmdVSS51cGdyYWRlTGlicmFyeURpYWxvZy50aXRsZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMKLQkJCQkJCQkJCS5nZXRTdHJpbmcoIkF1dGhvcmluZ1VJLnVwZ3JhZGVMaWJyYXJ5RXJyb3IubXNnIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcwotCQkJCQkJCQkJLmdldFN0cmluZygiQXV0aG9yaW5nVUkuaW50ZXJuYWxFcnJvci5yZWFzb24iKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJCWUpOwotCQl9Ci0JfQotCSovCi0KLQkvKioKLQkgKiBDaGVja3MgaWYgdGhlIGN1cnJlbnQgc2VsZWN0aW9uIGlzIGxvY2tlZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNMb2NrZWQoSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHNlbGVjdGlvbi5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gaXRlci5uZXh0KCk7Ci0JCQl3aGlsZSAoZWxlbWVudCBpbnN0YW5jZW9mIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlcikgewotCQkJCWVsZW1lbnQgPSAoKElUcmVlSXRlbUNvbnRlbnRQcm92aWRlcikgZWxlbWVudCkuZ2V0UGFyZW50KG51bGwpOwotCQkJfQotCQkJZWxlbWVudCA9IFRuZ1V0aWwudW53cmFwKGVsZW1lbnQpOwotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBFT2JqZWN0Ci0JCQkJCSYmIFRuZ1V0aWwuaXNMb2NrZWQoKEVPYmplY3QpIGVsZW1lbnQpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCS8qKgotCSAqIEp1ZGdlIGlmIHRoZXJlIGlzIGEgZGVmaW5lZCBjdXN0b21pemVkIGxvY2tlcgotCSAqIEByZXR1cm4gdHJ1ZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBoYXNDdXN0b21pemVkTG9ja2VyKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbil7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHNlbGVjdGlvbi5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gaXRlci5uZXh0KCk7Ci0JCQl3aGlsZSAoZWxlbWVudCBpbnN0YW5jZW9mIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlcikgewotCQkJCWVsZW1lbnQgPSAoKElUcmVlSXRlbUNvbnRlbnRQcm92aWRlcikgZWxlbWVudCkuZ2V0UGFyZW50KG51bGwpOwotCQkJfQkJCQotCQkJZWxlbWVudCA9IFRuZ1V0aWwudW53cmFwKGVsZW1lbnQpOwkJCQotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBFT2JqZWN0ICkgewkKLQkJCQlBYnN0cmFjdExvY2tlciBsb2NrZXIgPSBudWxsOwotCQkJCWlmKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RDb25maWd1cmF0aW9uICl7Ci0JCQkJCWxvY2tlciA9IExvY2tlckZhY3RvcnkuZ2V0SW5zdGFuY2UoKS5nZXRMb2NrZXIoZWxlbWVudCk7CQotCQkJCX1lbHNlewotCQkJCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4oKEVPYmplY3QpZWxlbWVudCk7Ci0JCQkJCWlmKHBsdWdpbiAhPSBudWxsICApewotCQkJCQkJbG9ja2VyID0gTG9ja2VyRmFjdG9yeS5nZXRJbnN0YW5jZSgpLmdldExvY2tlcihwbHVnaW4pOwkJCQkJCQotCQkJCQl9Ci0JCQkJfQkJCQkKLQkJCQlpZihsb2NrZXIgIT0gbnVsbCApewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9CQkJCQotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBDaGVja3MgaWYgdGhlIGN1cnJlbnQgc2VsZWN0aW9uIGlzIGxvY2tlZC4KLQkgKiBJZiB0aGVyZSBpcyBhIGN1c3RvbWl6ZWQgbG9ja2VyLCB1c2UgaXQsIG90aGVyd2lzZSBjaGVjayBpdCB3aXRoIHRoZSBsb2NrZWQgZmxhZyBvZiAKLQkgKiBNZXRob2QgcGx1Z2luCi0JICogQHBhcmFtIHNlbGVjdGlvbgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNMb2NrZWRXaXRoQ3VzdG9taXplZExvY2tlcihJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gc2VsZWN0aW9uLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewkJCQotCQkJT2JqZWN0IHNlbGVjdGVkSXRlbSA9IGl0ZXIubmV4dCgpOwotCQkJT2JqZWN0IGVsZW1lbnQgPSBzZWxlY3RlZEl0ZW07Ci0JCQl3aGlsZSAoZWxlbWVudCBpbnN0YW5jZW9mIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlcikgewotCQkJCWVsZW1lbnQgPSAoKElUcmVlSXRlbUNvbnRlbnRQcm92aWRlcikgZWxlbWVudCkuZ2V0UGFyZW50KG51bGwpOwotCQkJfQkJCQotCQkJT2JqZWN0IHVud3JhcEVsZW1lbnQgPSBUbmdVdGlsLnVud3JhcChlbGVtZW50KTsKLQkJCQotCQkJaWYgKHVud3JhcEVsZW1lbnQgaW5zdGFuY2VvZiBFT2JqZWN0ICkgewkKLQkJCQkKLQkJCQlpZihlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kQ29uZmlndXJhdGlvbiApewotCQkJCQlBYnN0cmFjdExvY2tlciBsb2NrZXIgPSBMb2NrZXJGYWN0b3J5LmdldEluc3RhbmNlKCkuZ2V0TG9ja2VyKGVsZW1lbnQpOwkJCQkJCi0JCQkJCWlmKGxvY2tlciAhPSBudWxsICl7Ci0JCQkJCQlpZiggbG9ja2VyLmlzTG9ja2VkKGVsZW1lbnQpKXsKLQkJCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQkKLQkJCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4oKEVPYmplY3QpdW53cmFwRWxlbWVudCk7Ci0JCQkJaWYocGx1Z2luICE9IG51bGwgKXsKLQkJCQkJQWJzdHJhY3RMb2NrZXIgbG9ja2VyID0gTG9ja2VyRmFjdG9yeS5nZXRJbnN0YW5jZSgpLmdldExvY2tlcihwbHVnaW4pOwkJCQkJCi0JCQkJCWlmKGxvY2tlciAhPSBudWxsICl7Ci0JCQkJCQlpZiggbG9ja2VyLmlzTG9ja2VkKHNlbGVjdGVkSXRlbSkpewotCQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQkJfQotCQkJCQl9ZWxzZSBpZiggVG5nVXRpbC5pc0xvY2tlZCgoRU9iamVjdCkgdW53cmFwRWxlbWVudCkpewotCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCX0KLQkJCQl9CQkJCQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQkvKioKLQkgKiBDaGVjayB3aGV0aGVyIHRoZSBkZXN0aW5hdGlvbiBpcyBsb2NrZWQgYnkgYSBjdXN0b21pemVkIGxvY2tlci4KLQkgKiBOb3RlOiBTb21lIGl0ZW0gY291bGQgYmUgbG9ja2VkIGJ5IGEgZXh0ZW50ZWQgbG9ja2VyLgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNFeHRlbmRlZExvY2tlZChPYmplY3QgZGVzdGluYXRpb24pIHsKLQkJdHJ5IHsKLQkJCWlmIChkZXN0aW5hdGlvbiA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJT2JqZWN0IGVsZW1lbnQgPSBkZXN0aW5hdGlvbjsKLQkJCXdoaWxlIChlbGVtZW50IGluc3RhbmNlb2YgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyKSB7Ci0JCQkJZWxlbWVudCA9ICgoSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyKSBlbGVtZW50KS5nZXRQYXJlbnQobnVsbCk7Ci0JCQl9Ci0JCQllbGVtZW50ID0gVG5nVXRpbC51bndyYXAoZWxlbWVudCk7Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEVPYmplY3QpIHsKLQkJCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gVW1hVXRpbAotCQkJCS5nZXRNZXRob2RQbHVnaW4oKEVPYmplY3QpIGVsZW1lbnQpOwotCQkJCWlmIChwbHVnaW4gIT0gbnVsbCkgewotCQkJCQlBYnN0cmFjdExvY2tlciBsb2NrZXIgPSBMb2NrZXJGYWN0b3J5LmdldEluc3RhbmNlKCkKLQkJCQkJLmdldExvY2tlcihwbHVnaW4pOwotCQkJCQlpZiAobG9ja2VyICE9IG51bGwgJiYgbG9ja2VyLmlzTG9ja2VkKGRlc3RpbmF0aW9uKSkgewotCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEZpeGVzIHRoZSBjb250ZW50IGRlc2NyaXB0aW9uIEdVSURzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBmaXhDb250ZW50RGVzY3JpcHRpb25HVUlEcygpIHsKLQkJZmluYWwgTWV0aG9kTGlicmFyeSBsaWIgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCk7Ci0JCWlmIChsaWIgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuSVJ1bm5hYmxlV2l0aFByb2dyZXNzIHJ1bm5hYmxlID0gbmV3IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5JUnVubmFibGVXaXRoUHJvZ3Jlc3MoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQotCQkJCQl0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQkJCUhhc2hTZXQgbW9kaWZpZWRSZXNvdXJjZXMgPSBuZXcgSGFzaFNldCgpOwotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGxpYi5lQWxsQ29udGVudHMoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCUludGVybmFsRU9iamVjdCBlbGVtZW50ID0gKEludGVybmFsRU9iamVjdCkgaXRlci5uZXh0KCk7Ci0JCQkJCWlmIChlbGVtZW50LmVQcm94eVVSSSgpID09IG51bGwpIHsKLQkJCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgQ29udGVudERlc2NyaXB0aW9uKSB7Ci0JCQkJCQkJQ29udGVudERlc2NyaXB0aW9uIGNvbnRlbnQgPSAoQ29udGVudERlc2NyaXB0aW9uKSBlbGVtZW50OwotCQkJCQkJCURlc2NyaWJhYmxlRWxlbWVudCBjb250YWluZXIgPSAoRGVzY3JpYmFibGVFbGVtZW50KSBlbGVtZW50Ci0JCQkJCQkJCQkuZUNvbnRhaW5lcigpOwotCQkJCQkJCWlmIChjb250YWluZXIgIT0gbnVsbCkgewotCQkJCQkJCQlTdHJpbmcgZ3VpZCA9IFVtYVV0aWwuZ2VuZXJhdGVHVUlEKGNvbnRhaW5lcgotCQkJCQkJCQkJCS5nZXRHdWlkKCkpOwotCQkJCQkJCQlpZiAoIWd1aWQuZXF1YWxzKGNvbnRlbnQuZ2V0R3VpZCgpKSkgewotCQkJCQkJCQkJY29udGVudC5zZXRHdWlkKGd1aWQpOwotCQkJCQkJCQkJbW9kaWZpZWRSZXNvdXJjZXMuYWRkKGNvbnRlbnQuZVJlc291cmNlKCkpOwotCQkJCQkJCQkJbW9kaWZpZWRSZXNvdXJjZXMKLQkJCQkJCQkJCQkJLmFkZChjb250YWluZXIuZVJlc291cmNlKCkpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9IGVsc2UgewotCQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4KLQkJCQkJCQkJLmdldERlZmF1bHQoKQotCQkJCQkJCQkuZ2V0TG9nZ2VyKCkKLQkJCQkJCQkJLmxvZ0Vycm9yKAotCQkJCQkJCQkJCSJVbnJlc29sdmVkIHByb3h5IGluICciICsgZWxlbWVudC5lUmVzb3VyY2UoKS5nZXRVUkkoKS50b0ZpbGVTdHJpbmcoKSArICInOiAiICsgZWxlbWVudCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQl9Ci0JCQkJfQotCi0JCQkJbW9uaXRvci5zdWJUYXNrKEF1dGhvcmluZ1VJUmVzb3VyY2VzLnNhdmluZ0ZpbGVzVGFza19uYW1lKTsKLQkJCQlJTGlicmFyeVBlcnNpc3Rlci5GYWlsU2FmZU1ldGhvZExpYnJhcnlQZXJzaXN0ZXIgcGVyc2lzdGVyID0gTGlicmFyeVNlcnZpY2VVdGlsLmdldEN1cnJlbnRQZXJzaXN0ZXIoKS5nZXRGYWlsU2FmZVBlcnNpc3RlcigpOwotCQkJCXRyeSB7Ci0JCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IG1vZGlmaWVkUmVzb3VyY2VzLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSAoUmVzb3VyY2UpIGl0ZXIubmV4dCgpOwotCQkJCQkJbW9uaXRvci5zdWJUYXNrKEF1dGhvcmluZ1VJUmVzb3VyY2VzLmJpbmQoQXV0aG9yaW5nVUlSZXNvdXJjZXMuc2F2aW5nVGFza19uYW1lLCByZXNvdXJjZS5nZXRVUkkoKS50b0ZpbGVTdHJpbmcoKSkpOwotCQkJCQkJcGVyc2lzdGVyLnNhdmUocmVzb3VyY2UpOwotCQkJCQl9Ci0JCQkJCXBlcnNpc3Rlci5jb21taXQoKTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQlwZXJzaXN0ZXIucm9sbGJhY2soKTsKLQkJCQkJdGhyb3cgbmV3IFdyYXBwZWRFeGNlcHRpb24oZSk7Ci0JCQkJfQotCQkJfQotCi0JCX07Ci0JCVVzZXJJbnRlcmFjdGlvbkhlbHBlcgotCQkJCS5ydW5XaXRoUHJvZ3Jlc3MoCi0JCQkJCQlydW5uYWJsZSwKLQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLmZpeGluZ0NvbnRlbnREZXNjcmlwdGlvbkdVSURzVGFza19uYW1lKTsgCi0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGNoZWNrUHJveHkoSW50ZXJuYWxFT2JqZWN0IGVsZW1lbnQsIEVSZWZlcmVuY2UgcmVmLAotCQkJT2JqZWN0IHZhbHVlKSB7Ci0JCWlmICh2YWx1ZSBpbnN0YW5jZW9mIEludGVybmFsRU9iamVjdCkgewotCQkJSW50ZXJuYWxFT2JqZWN0IGVPYmogPSAoSW50ZXJuYWxFT2JqZWN0KSB2YWx1ZTsKLQkJCWlmIChlT2JqLmVJc1Byb3h5KCkpIHsKLQkJCQlFT2JqZWN0IHJlc29sdmVkID0gZWxlbWVudC5lUmVzb2x2ZVByb3h5KGVPYmopOwotCQkJCVN0cmluZyBlcnJNc2cgPSBudWxsOwotCQkJCWlmIChyZXNvbHZlZCA9PSBlT2JqKSB7Ci0JCQkJCWVyck1zZyA9ICJVbnJlc29sdmVkIHByb3h5IjsgLy8kTk9OLU5MUy0xJAotCQkJCX0gZWxzZSBpZiAoIXJlZi5nZXRFVHlwZSgpLmlzSW5zdGFuY2UocmVzb2x2ZWQpKSB7Ci0JCQkJCWVyck1zZyA9ICJJbnZhbGlkIGRhdGEiOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJCWlmIChlcnJNc2cgIT0gbnVsbCkgewotCQkJCQlTdHJpbmcgcGF0aDsKLQkJCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBOYW1lZEVsZW1lbnQpIHsKLQkJCQkJCXBhdGggPSByZWYuZ2V0RVR5cGUoKS5nZXROYW1lKCkKLQkJCQkJCQkJKyAiKCIgKyBNaXNjLmdldFBhdGhSZWxhdGl2ZVRvTGlicmFyeSgoTmFtZWRFbGVtZW50KSBlbGVtZW50KSArICIpLiIgKyByZWYuZ2V0TmFtZSgpICsgIiA9ICI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlwYXRoID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCQlyZXR1cm4gZXJyTXNnCi0JCQkJCQkJKyAiIGluICciICsgZWxlbWVudC5lUmVzb3VyY2UoKS5nZXRVUkkoKS50b0ZpbGVTdHJpbmcoKSArICInOiAiICsgcGF0aCArIHJlc29sdmVkOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogTGlicmFyeSBoZWFsdGggY2hlY2sKLQkgKgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBjaGVja0xpYnJhcnlIZWFsdGgoKSB7Ci0JCWZpbmFsIE1ldGhvZExpYnJhcnkgbGliID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKQotCQkJCS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpOwotCQlpZiAobGliID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLklSdW5uYWJsZVdpdGhQcm9ncmVzcyBydW5uYWJsZSA9IG5ldyBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuSVJ1bm5hYmxlV2l0aFByb2dyZXNzKCkgewotCi0JCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQotCQkJCQl0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dJbmZvKAotCQkJCQkJIisrKysgTElCUkFSWSBIRUFMVEggQ0hFQ0sgUkVQT1JUIC0gU1RBUlQgKysrIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlTdHJpbmdXcml0ZXIgc3RyV3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOwotCQkJCVByaW50V3JpdGVyIHByaW50V3JpdGVyID0gbmV3IFByaW50V3JpdGVyKHN0cldyaXRlcik7Ci0JCQkJcHJpbnRXcml0ZXIucHJpbnRsbigpOwotCQkJCXByaW50V3JpdGVyCi0JCQkJCQkucHJpbnRsbigiVU5SRVNPTFZFRC9JTlZBTElEIFBST1hJRVMgSU4gWC1SRUZFUkVOQ0VTIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlwcmludFdyaXRlcgotCQkJCQkJLnByaW50bG4oIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOyAvLyROT04tTkxTLTEkCi0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gbGliLmVBbGxDb250ZW50cygpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJSW50ZXJuYWxFT2JqZWN0IGVsZW1lbnQgPSAoSW50ZXJuYWxFT2JqZWN0KSBpdGVyLm5leHQoKTsKLQkJCQkJaWYgKGVsZW1lbnQuZVByb3h5VVJJKCkgPT0gbnVsbCkgewotCQkJCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBDb250ZW50RGVzY3JpcHRpb24pIHsKLQkJCQkJCQlDb250ZW50RGVzY3JpcHRpb24gY29udGVudCA9IChDb250ZW50RGVzY3JpcHRpb24pIGVsZW1lbnQ7Ci0JCQkJCQkJRGVzY3JpYmFibGVFbGVtZW50IGNvbnRhaW5lciA9IChEZXNjcmliYWJsZUVsZW1lbnQpIGVsZW1lbnQKLQkJCQkJCQkJCS5lQ29udGFpbmVyKCk7Ci0JCQkJCQkJaWYgKGNvbnRhaW5lciAhPSBudWxsKSB7Ci0JCQkJCQkJCVN0cmluZyBndWlkID0gVW1hVXRpbC5nZW5lcmF0ZUdVSUQoY29udGFpbmVyCi0JCQkJCQkJCQkJLmdldEd1aWQoKSk7Ci0JCQkJCQkJCWlmICghZ3VpZC5lcXVhbHMoY29udGVudC5nZXRHdWlkKCkpKSB7Ci0JCQkJCQkJCQlBdXRob3JpbmdVSVBsdWdpbgotCQkJCQkJCQkJCQkuZ2V0RGVmYXVsdCgpCi0JCQkJCQkJCQkJCS5nZXRMb2dnZXIoKQotCQkJCQkJCQkJCQkubG9nRXJyb3IoCi0JCQkJCQkJCQkJCQkJIkNvbnRlbnREZXNjcmlwdGlvbiB3aXRoIGludmFsaWQgR1VJRDogIiArIGNvbnRlbnQuZ2V0R3VpZCgpICsgIiBpbiAnIiArIGNvbnRlbnQuZVJlc291cmNlKCkuZ2V0VVJJKCkudG9GaWxlU3RyaW5nKCkgKyAiJyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJCQl9Ci0JCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4KLQkJCQkJCQkJCQkuZ2V0RGVmYXVsdCgpCi0JCQkJCQkJCQkJLmdldExvZ2dlcigpCi0JCQkJCQkJCQkJLmxvZ0Vycm9yKAotCQkJCQkJCQkJCQkJIkNvbnRlbnREZXNjcmlwdGlvbiB3aXRob3V0IGEgY29udGFpbmVyOiAiICsgY29udGVudCk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQl9Ci0KLQkJCQkJCQlpZiAoY29udGVudCBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbikgewotCQkJCQkJCQkvLyBjaGVjayBpZiB0aGUgY29udGVudC54bWkgb2YgdGhlIHByb2Nlc3MgaXMgaW4KLQkJCQkJCQkJLy8gdGhlIHJpZ2h0IHBsYWNlCi0JCQkJCQkJCVByb2Nlc3NDb21wb25lbnQgcHJvY0NvbXAgPSBVbWFVdGlsCi0JCQkJCQkJCQkJLmdldFByb2Nlc3NDb21wb25lbnQoY29udGVudCk7Ci0JCQkJCQkJCWlmIChwcm9jQ29tcCAhPSBudWxsKSB7Ci0JCQkJCQkJCQlTdHJpbmcgbW9kZWxQYXRoID0gcHJvY0NvbXAuZVJlc291cmNlKCkKLQkJCQkJCQkJCQkJLmdldFVSSSgpLnRvRmlsZVN0cmluZygpOwotCQkJCQkJCQkJRmlsZSBkaXIgPSBuZXcgRmlsZShtb2RlbFBhdGgpCi0JCQkJCQkJCQkJCS5nZXRQYXJlbnRGaWxlKCk7Ci0JCQkJCQkJCQlTdHJpbmcgY29udGVudFBhdGggPSBjb250ZW50LmVSZXNvdXJjZSgpCi0JCQkJCQkJCQkJCS5nZXRVUkkoKS50b0ZpbGVTdHJpbmcoKTsKLQotCQkJCQkJCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJtb2RlbCBwYXRoOiAiICsKLQkJCQkJCQkJCS8vIG1vZGVsUGF0aCk7Ci0JCQkJCQkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oImNvbnRlbnQgcGF0aDogIiArCi0JCQkJCQkJCQkvLyBjb250ZW50UGF0aCk7Ci0JCQkJCQkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oKTsKLQotCQkJCQkJCQkJRmlsZSBjb250ZW50RGlyID0gbmV3IEZpbGUoY29udGVudFBhdGgpCi0JCQkJCQkJCQkJCS5nZXRQYXJlbnRGaWxlKCk7Ci0JCQkJCQkJCQlpZiAoIWRpci5lcXVhbHMoY29udGVudERpcikpIHsKLQkJCQkJCQkJCQlBdXRob3JpbmdVSVBsdWdpbgotCQkJCQkJCQkJCQkJLmdldERlZmF1bHQoKQotCQkJCQkJCQkJCQkJLmdldExvZ2dlcigpCi0JCQkJCQkJCQkJCQkubG9nRXJyb3IoCi0JCQkJCQkJCQkJCQkJCSJDb250ZW50IGZpbGUgb2YgIiArIGNvbnRhaW5lci5lQ2xhc3MoKS5nZXROYW1lKCkgKyAiICciICsgY29udGFpbmVyLmdldE5hbWUoKSArICInIGluICciICsgbW9kZWxQYXRoICsgIiBpcyBtaXNwbGFjZWQ6ICIgKyBjb250ZW50UGF0aCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQotCQkJCQkJLy8gY2hlY2sgZm9yIHVucmVzb2x2ZWQgcHJveGllcyBpbiBjcm9zcyByZWZlcmVuY2VzCi0JCQkJCQlBcnJheUxpc3QgeFJlZmVyZW5jZXMgPSBuZXcgQXJyYXlMaXN0KGVsZW1lbnQuZUNsYXNzKCkKLQkJCQkJCQkJLmdldEVBbGxSZWZlcmVuY2VzKCkpOwotCQkJCQkJeFJlZmVyZW5jZXMucmVtb3ZlQWxsKGVsZW1lbnQuZUNsYXNzKCkKLQkJCQkJCQkJLmdldEVBbGxDb250YWlubWVudHMoKSk7Ci0JCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0geFJlZmVyZW5jZXMuaXRlcmF0b3IoKTsgaXRlcmF0b3IKLQkJCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCQlFUmVmZXJlbmNlIHJlZiA9IChFUmVmZXJlbmNlKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCQkJT2JqZWN0IHZhbHVlID0gZWxlbWVudC5lR2V0KHJlZiwgZmFsc2UpOwotCQkJCQkJCWlmIChyZWYuaXNNYW55KCkpIHsKLQkJCQkJCQkJaWYgKHZhbHVlIGluc3RhbmNlb2YgSW50ZXJuYWxFTGlzdCkgewotCQkJCQkJCQkJSW50ZXJuYWxFTGlzdCBsaXN0ID0gKEludGVybmFsRUxpc3QpIHZhbHVlOwotCQkJCQkJCQkJZm9yIChJdGVyYXRvciBpdGVyMSA9IGxpc3QuYmFzaWNJdGVyYXRvcigpOyBpdGVyMQotCQkJCQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJCQkJCVN0cmluZyBtc2cgPSBjaGVja1Byb3h5KGVsZW1lbnQsIHJlZiwKLQkJCQkJCQkJCQkJCWl0ZXIxLm5leHQoKSk7Ci0JCQkJCQkJCQkJaWYgKG1zZyAhPSBudWxsKSB7Ci0JCQkJCQkJCQkJCXByaW50V3JpdGVyLnByaW50bG4obXNnKTsKLQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQlTdHJpbmcgbXNnID0gY2hlY2tQcm94eShlbGVtZW50LCByZWYsIHZhbHVlKTsKLQkJCQkJCQkJaWYgKG1zZyAhPSBudWxsKSB7Ci0JCQkJCQkJCQlwcmludFdyaXRlci5wcmludGxuKG1zZyk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlBdXRob3JpbmdVSVBsdWdpbgotCQkJCQkJCQkuZ2V0RGVmYXVsdCgpCi0JCQkJCQkJCS5nZXRMb2dnZXIoKQotCQkJCQkJCQkubG9nRXJyb3IoCi0JCQkJCQkJCQkJIlVucmVzb2x2ZWQgcHJveHkgaW4gJyIgKyBlbGVtZW50LmVSZXNvdXJjZSgpLmdldFVSSSgpLnRvRmlsZVN0cmluZygpICsgIic6ICIgKyBlbGVtZW50KTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCX0KLQotCQkJCX0KLQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoCi0JCQkJCQlzdHJXcml0ZXIudG9TdHJpbmcoKSk7Ci0JCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0luZm8oCi0JCQkJCQkiKysrKyBMSUJSQVJZIEhFQUxUSCBDSEVDSyBSRVBPUlQgLSBFTkQgKysrIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQotCQl9OwotCQlpZiAoVXNlckludGVyYWN0aW9uSGVscGVyCi0JCQkJLnJ1bldpdGhQcm9ncmVzcyhydW5uYWJsZSwgQXV0aG9yaW5nVUlSZXNvdXJjZXMudmlld0hlbHBlcl9wZXJmb3JtSGVhbHRoQ2hlY2spKSB7IAotCQkJU3RyaW5nIHRpdGxlID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMudmlld0hlbHBlckhlYWx0aENoZWNrRGlhbG9nX3RpdGxlOyAKLQkJCVN0cmluZyBtZXNzYWdlID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMudmlld0hlbHBlckhlYWx0aENoZWNrRGlhbG9nX21lc3NhZ2U7IAotCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpLmRpc3BsYXlJbmZvKHRpdGxlLAotCQkJCQltZXNzYWdlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIHJlbW92ZXMgaW52YWxpZCByZWZlcmVuY2UgaW4gdGhlIG9wZW4gbGlicmFyeQotCSAqCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZUludmFsaWRSZWZlcmVuY2VzKCkgewotCQlmaW5hbCBNZXRob2RMaWJyYXJ5IGxpYiA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLQkJCQkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKTsKLQkJaWYgKGxpYiA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCW9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5JUnVubmFibGVXaXRoUHJvZ3Jlc3MgcnVubmFibGUgPSBuZXcgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLklSdW5uYWJsZVdpdGhQcm9ncmVzcygpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCi0JCQkJCXRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCQkJSGFzaFNldCBtb2RpZmllZFJlc291cmNlcyA9IG5ldyBIYXNoU2V0KCk7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gbGliLmVBbGxDb250ZW50cygpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJSW50ZXJuYWxFT2JqZWN0IGVsZW1lbnQgPSAoSW50ZXJuYWxFT2JqZWN0KSBpdGVyLm5leHQoKTsKLQkJCQkJaWYgKGVsZW1lbnQuZVByb3h5VVJJKCkgPT0gbnVsbCkgewotCQkJCQkJQXJyYXlMaXN0IHhSZWZlcmVuY2VzID0gbmV3IEFycmF5TGlzdChlbGVtZW50LmVDbGFzcygpCi0JCQkJCQkJCS5nZXRFQWxsUmVmZXJlbmNlcygpKTsKLQkJCQkJCXhSZWZlcmVuY2VzLnJlbW92ZUFsbChlbGVtZW50LmVDbGFzcygpCi0JCQkJCQkJCS5nZXRFQWxsQ29udGFpbm1lbnRzKCkpOwotCQkJCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IHhSZWZlcmVuY2VzLml0ZXJhdG9yKCk7IGl0ZXJhdG9yCi0JCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJRVJlZmVyZW5jZSByZWYgPSAoRVJlZmVyZW5jZSkgaXRlcmF0b3IubmV4dCgpOwotCQkJCQkJCU9iamVjdCB2YWx1ZSA9IGVsZW1lbnQuZUdldChyZWYsIGZhbHNlKTsKLQkJCQkJCQlpZiAocmVmLmlzTWFueSgpKSB7Ci0JCQkJCQkJCWlmICh2YWx1ZSBpbnN0YW5jZW9mIEludGVybmFsRUxpc3QpIHsKLQkJCQkJCQkJCUludGVybmFsRUxpc3QgbGlzdCA9IChJbnRlcm5hbEVMaXN0KSB2YWx1ZTsKLQkJCQkJCQkJCUFycmF5TGlzdCBpbnZhbGlkUHJveGllcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJCQkJCWZvciAoSXRlcmF0b3IgaXRlcjEgPSBsaXN0LmJhc2ljSXRlcmF0b3IoKTsgaXRlcjEKLQkJCQkJCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCQkJCQlPYmplY3QgdiA9IGl0ZXIxLm5leHQoKTsKLQkJCQkJCQkJCQlpZiAoaXNJbnZhbGlkUmVmZXJlbmNlKGVsZW1lbnQsIHJlZiwgdikpIHsKLQkJCQkJCQkJCQkJaW52YWxpZFByb3hpZXMuYWRkKHYpOwotCQkJCQkJCQkJCX0KLQkJCQkJCQkJCX0KLQkJCQkJCQkJCWlmICghaW52YWxpZFByb3hpZXMuaXNFbXB0eSgpKSB7Ci0JCQkJCQkJCQkJcmVtb3ZlSW52YWxpZFJlZmVyZW5jZXMoZWxlbWVudCwgbGlzdCwKLQkJCQkJCQkJCQkJCWludmFsaWRQcm94aWVzKTsKLQkJCQkJCQkJCQltb2RpZmllZFJlc291cmNlcy5hZGQoZWxlbWVudAotCQkJCQkJCQkJCQkJLmVSZXNvdXJjZSgpKTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCWlmIChpc0ludmFsaWRSZWZlcmVuY2UoZWxlbWVudCwgcmVmLCB2YWx1ZSkpIHsKLQkJCQkJCQkJCWVsZW1lbnQuZVNldChyZWYsIG51bGwpOwotCQkJCQkJCQkJbW9kaWZpZWRSZXNvdXJjZXMuYWRkKGVsZW1lbnQuZVJlc291cmNlKCkpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9IGVsc2UgewotCQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4KLQkJCQkJCQkJLmdldERlZmF1bHQoKQotCQkJCQkJCQkuZ2V0TG9nZ2VyKCkKLQkJCQkJCQkJLmxvZ0Vycm9yKAotCQkJCQkJCQkJCSJVbnJlc29sdmVkIHByb3h5IGluICciICsgZWxlbWVudC5lUmVzb3VyY2UoKS5nZXRVUkkoKS50b0ZpbGVTdHJpbmcoKSArICInOiAiICsgZWxlbWVudCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQl9Ci0JCQkJfQotCi0JCQkJbW9uaXRvci5zdWJUYXNrKEF1dGhvcmluZ1VJUmVzb3VyY2VzLnNhdmluZ0ZpbGVzVGFza19uYW1lKTsgCi0JCQkJSUxpYnJhcnlQZXJzaXN0ZXIuRmFpbFNhZmVNZXRob2RMaWJyYXJ5UGVyc2lzdGVyIHBlcnNpc3RlciA9IExpYnJhcnlTZXJ2aWNlVXRpbC5nZXRDdXJyZW50UGVyc2lzdGVyKCkuZ2V0RmFpbFNhZmVQZXJzaXN0ZXIoKTsKLQkJCQl0cnkgewotCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBtb2RpZmllZFJlc291cmNlcy5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCVJlc291cmNlIHJlc291cmNlID0gKFJlc291cmNlKSBpdGVyLm5leHQoKTsKLQkJCQkJCW1vbml0b3Iuc3ViVGFzayhBdXRob3JpbmdVSVJlc291cmNlcy5iaW5kKEF1dGhvcmluZ1VJUmVzb3VyY2VzLnNhdmluZ1Rhc2tfbmFtZSwgcmVzb3VyY2UuZ2V0VVJJKCkudG9GaWxlU3RyaW5nKCkpKTsKLQkJCQkJCXBlcnNpc3Rlci5zYXZlKHJlc291cmNlKTsKLQkJCQkJfQotCQkJCQlwZXJzaXN0ZXIuY29tbWl0KCk7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJcGVyc2lzdGVyLnJvbGxiYWNrKCk7Ci0JCQkJCXRocm93IG5ldyBXcmFwcGVkRXhjZXB0aW9uKGUpOwotCQkJCX0KLQkJCX0KLQotCQkJcHJpdmF0ZSBib29sZWFuIGlzSW52YWxpZFJlZmVyZW5jZShJbnRlcm5hbEVPYmplY3QgZWxlbWVudCwKLQkJCQkJRVJlZmVyZW5jZSByZWYsIE9iamVjdCB2YWx1ZSkgewotCQkJCWlmICh2YWx1ZSBpbnN0YW5jZW9mIEludGVybmFsRU9iamVjdCkgewotCQkJCQlJbnRlcm5hbEVPYmplY3QgZU9iaiA9IChJbnRlcm5hbEVPYmplY3QpIHZhbHVlOwotCQkJCQlpZiAoZU9iai5lSXNQcm94eSgpKSB7Ci0JCQkJCQlFT2JqZWN0IHJlc29sdmVkID0gZWxlbWVudC5lUmVzb2x2ZVByb3h5KGVPYmopOwotCQkJCQkJaWYgKCFyZWYuZ2V0RVR5cGUoKS5pc0luc3RhbmNlKHJlc29sdmVkKSkgewotCQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQotCQkJcHJpdmF0ZSB2b2lkIHJlbW92ZUludmFsaWRSZWZlcmVuY2VzKEludGVybmFsRU9iamVjdCBlbGVtZW50LAotCQkJCQlJbnRlcm5hbEVMaXN0IHZhbHVlcywgQ29sbGVjdGlvbiBpbnZhbGlkUHJveGllcykgewotCQkJCUFycmF5TGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCh2YWx1ZXMuYmFzaWNMaXN0KCkpOwotCQkJCWxpc3QucmVtb3ZlQWxsKGludmFsaWRQcm94aWVzKTsKLQkJCQl2YWx1ZXMuY2xlYXIoKTsKLQkJCQlpbnQgbWF4ID0gbGlzdC5zaXplKCkgLSAxOwotCQkJCWZvciAoaW50IGkgPSBtYXg7IGkgPiAtMTsgaS0tKSB7Ci0JCQkJCWxpc3Quc2V0KGksIGVsZW1lbnQuZVJlc29sdmVQcm94eSgoSW50ZXJuYWxFT2JqZWN0KSBsaXN0Ci0JCQkJCQkJLmdldChpKSkpOwotCQkJCX0KLQkJCQl2YWx1ZXMuYWRkQWxsKGxpc3QpOwotCQkJfQotCi0JCX07Ci0JCVVzZXJJbnRlcmFjdGlvbkhlbHBlci5ydW5XaXRoUHJvZ3Jlc3MocnVubmFibGUsIEF1dGhvcmluZ1VJUmVzb3VyY2VzLmRlbGV0aW5nSW52YWxpZFJlZmVyZW5jZXNUYXNrX25hbWUpOyAKLQotCX0KLQotCS8qKgotCSAqIHJlbG9hZHMgdGhlIGN1cnJlbnQgbGlicmFyeS4gIFVzZWQgb24gYSByb2xsYmFjayBlcnJvcgotCSAqIEBwYXJhbSBzaGVsbAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZWxvYWRDdXJyZW50TGliYXJ5T25Sb2xsYmFja0Vycm9yKFNoZWxsIHNoZWxsKSB7Ci0JCXJlbG9hZEN1cnJlbnRMaWJyYXJ5KHNoZWxsLCBBdXRob3JpbmdVSVJlc291cmNlcy5WaWV3SGVscGVyX3JlbG9hZExpYk9uUm9sbGJhY2tFcnJvcik7Ci0JfQotCi0JLyoqCi0JICogZGlzcGxheXMgdGhlIG1lc3NhZ2UgYW5kIHJlbG9hZHMgdGhlIGN1cnJlbnQgbGlicmFyeSAKLQkgKiBAcGFyYW0gc2hlbGwKLQkgKiBAcGFyYW0gbWVzc2FnZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZWxvYWRDdXJyZW50TGlicmFyeShmaW5hbCBTaGVsbCBzaGVsbCwgZmluYWwgU3RyaW5nIG1lc3NhZ2UpIHsKLQkJRGlzcGxheSBkaXNwbGF5ID0gTXNnQm94LmdldERpc3BsYXkoKTsKLQkJUnVubmFibGUgcnVubmFibGUgPSBuZXcgUnVubmFibGUoKSB7Ci0KLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlkb1JlbG9hZEN1cnJlbnRMaWJyYXJ5KHNoZWxsLCBtZXNzYWdlKTsgCi0JCQl9Ci0JCQkKLQkJfTsKLQkJaWYoZGlzcGxheSAhPSBudWxsKSB7Ci0JCQlkaXNwbGF5LmFzeW5jRXhlYyhydW5uYWJsZSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlydW5uYWJsZS5ydW4oKTsKLQkJfQkJCi0KLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBkb1JlbG9hZEN1cnJlbnRMaWJyYXJ5KFNoZWxsIHNoZWxsLCBTdHJpbmcgbWVzc2FnZSkgewotCQlpZiAoc2hlbGwgPT0gbnVsbCkgewotCQkJTXNnQm94LmdldERlZmF1bHRTaGVsbCgpOwotCQl9Ci0JCVN0cmluZyB0aXRsZSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLnJlbG9hZERpYWxvZ190aXRsZTsgCi0JCWlmIChtZXNzYWdlID09IG51bGwpIHsKLQkJCW1lc3NhZ2UgPSBBdXRob3JpbmdVSVJlc291cmNlcy5yZWxvYWREaWFsb2dfbWVzc2FnZTsgCi0JCX0KLQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpLmRpc3BsYXlJbmZvKHRpdGxlLAotCQkJCW1lc3NhZ2UpOwotCi0JCS8vIFRoZSBsaWJyYXJ5IG5lZWRzIHRvIGJlIHJlbG9hZGVkLgotCQlTdHJpbmcgbGliRGlyID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKQotCQkJCS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeUxvY2F0aW9uKCk7Ci0JCUxpYnJhcnlVSU1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5vcGVuTGlicmFyeShsaWJEaXIpOwotCX0KLQotCS8qKgotCSAqIG9wZW5zIHRoZSBnaXZlbiB2aWV3SWQKLQkgKiBAcGFyYW0gdmlld0lkCi0JICogQHJldHVybgotCSAqIAkJCVZpZXcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElWaWV3UGFydCBvcGVuVmlldyhTdHJpbmcgdmlld0lkKSB7Ci0JCXJldHVybiBmaW5kVmlldyh2aWV3SWQsIHRydWUpOwotCX0KLQkKLQkKLQkvKioKLQkgKiBvcGVucyB0aGUgZ2l2ZW4gdmlld0lkCi0JICogQHBhcmFtIHZpZXdJZAotCSAqIEByZXR1cm4KLQkgKiAJCQlWaWV3Ci0JICovCi0JcHVibGljIHN0YXRpYyBJVmlld1BhcnQgZmluZFZpZXcoU3RyaW5nIHZpZXdJZCwgYm9vbGVhbiBzaG93KSB7Ci0JCXRyeSB7Ci0JCQlJV29ya2JlbmNoUGFnZSBhY3RpdmVQYWdlID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKQotCQkJCQkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0QWN0aXZlUGFnZSgpOwotCQkJaWYgKGFjdGl2ZVBhZ2UgIT0gbnVsbCkgewotCQkJCUlWaWV3UGFydCB2aWV3ID0gYWN0aXZlUGFnZS5maW5kVmlldyh2aWV3SWQpOwotCQkJCWlmICh2aWV3ID09IG51bGwpIHsKLQkJCQkJCi0JCQkJCS8vIGFsd2F5cyBjcmVhdGUgdGhlIHZpZXcKLQkJCQkJdmlldyA9IGFjdGl2ZVBhZ2Uuc2hvd1ZpZXcodmlld0lkKTsJCQkJCQotCQkJCX0KLQkJCQkKLQkJCQlpZiAoICFzaG93ICkgewotCQkJCQlhY3RpdmVQYWdlLmhpZGVWaWV3KHZpZXcpOwotCQkJCX0KLQkJCQkKLQkJCQlyZXR1cm4gdmlldzsKLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKS5kaXNwbGF5RXJyb3IoCi0JCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLmVycm9yRGlhbG9nX3RpdGxlLCAKLQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuaW50ZXJuYWxFcnJvcl9tc2csIAotCQkJCQllKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNWaWV3SW5DdXJyZW50UGVyc3BlY3RpdmUoU3RyaW5nIHZpZXdJZCkgewkJCi0JCVN0cmluZyBwZXJzcGVjdGl2ZUlkID0gUGVyc3BlY3RpdmVVdGlsLmdldEFjdGl2ZVBlcnNwZWN0aXZlSWQoKTsKLQkJcmV0dXJuIGlzVmlld0luUGVyc3BlY3RpdmUodmlld0lkLCBwZXJzcGVjdGl2ZUlkKTsKLQl9Ci0JCi0JLyoqCi0JICogRGVjaWVkZSB3aGV0aGVyIHRoZSB2aWV3IGRlZmluZGVkIGluIHRoZSBwZXJzcGVjdGl2ZSBvciBub3QKLQkgKiAKLQkgKiBAYXV0aG9yIGRhdmlkIHpob25nd2VpCi0JICogQHBhcmFtIHZpZXdJZAotCSAqIEBwYXJhbSBwZXJwZWN0aXZlSWQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzVmlld0luUGVyc3BlY3RpdmUoU3RyaW5nIHZpZXdJZCwgU3RyaW5nIHBlcnNwZWN0aXZlSWQpIHsKLQkJaWYgKHZpZXdJZCA9PSBudWxsIHx8IHBlcnNwZWN0aXZlSWQgPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJZmluYWwgU3RyaW5nIE5BTUVTUEFDRSA9ICJvcmcuZWNsaXBzZS51aSI7Ly8kTk9OLU5MUy0xJAotCQlmaW5hbCBTdHJpbmcgRVhURU5TSU9OUE9JTlRfSUQgPSAicGVyc3BlY3RpdmVFeHRlbnNpb25zIjsvLyROT04tTkxTLTEkCi0JCWZpbmFsIFN0cmluZyBUQVJHRVRfSUQgPSAidGFyZ2V0SUQiOy8vJE5PTi1OTFMtMSQKLQkJZmluYWwgU3RyaW5nIFZJRVcgPSAidmlldyI7Ly8kTk9OLU5MUy0xJAotCQlmaW5hbCBTdHJpbmcgSUQgPSAiaWQiOy8vJE5PTi1OTFMtMSQKLQkJZmluYWwgU3RyaW5nIFZJRVdTSE9SVENVVCA9ICJ2aWV3U2hvcnRjdXQiOy8vJE5PTi1OTFMtMSQKLQotCQlJRXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpOwotCQlJRXh0ZW5zaW9uUG9pbnQgZXh0ZW5zaW9uUG9pbnQgPSBudWxsOwotCQlpZiAoZXh0ZW5zaW9uUmVnaXN0cnkgIT0gbnVsbCkgewotCQkJZXh0ZW5zaW9uUG9pbnQgPSBleHRlbnNpb25SZWdpc3RyeS5nZXRFeHRlbnNpb25Qb2ludChOQU1FU1BBQ0UsIEVYVEVOU0lPTlBPSU5UX0lEKTsKLQkJfQotCi0JCWlmIChleHRlbnNpb25Qb2ludCAhPSBudWxsKSB7Ci0JCQlJRXh0ZW5zaW9uW10gZXh0ZW5zaW9ucyA9IGV4dGVuc2lvblBvaW50LmdldEV4dGVuc2lvbnMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZXh0ZW5zaW9ucy5sZW5ndGg7IGkrKykgewotCQkJCUlFeHRlbnNpb24gZXh0ZW5zaW9uID0gZXh0ZW5zaW9uc1tpXTsKLQkJCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjb25maWdFbGVtZW50cyA9IGV4dGVuc2lvbi5nZXRDb25maWd1cmF0aW9uRWxlbWVudHMoKTsKLQkJCQlmb3IgKGludCBqID0gMDsgaiA8IGNvbmZpZ0VsZW1lbnRzLmxlbmd0aDsgaisrKSB7Ci0JCQkJCUlDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWdFbGVtZW50ID0gY29uZmlnRWxlbWVudHNbal07Ci0JCQkJCXRyeSB7Ci0JCQkJCQlTdHJpbmcgaWQgPSBjb25maWdFbGVtZW50LmdldEF0dHJpYnV0ZShUQVJHRVRfSUQpOwotCQkJCQkJaWYgKHBlcnNwZWN0aXZlSWQuZXF1YWxzKGlkKSkgewotCi0JCQkJCQkJLy8gZGVjaWRlIHdoZXRoZXIgaXMgZGVmaW5lZCBpbiAidmlldyIKLQkJCQkJCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjb25maWdFbGVtZW50c0ZvclZpZXcgPSBjb25maWdFbGVtZW50LmdldENoaWxkcmVuKFZJRVcpOwotCQkJCQkJCWZvciAoaW50IGsgPSAwOyBrIDwgY29uZmlnRWxlbWVudHNGb3JWaWV3Lmxlbmd0aDsgaysrKSB7Ci0JCQkJCQkJCUlDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWd1cmF0aW9uRWxlbWVudCA9IGNvbmZpZ0VsZW1lbnRzRm9yVmlld1trXTsKLQkJCQkJCQkJaWYgKHZpZXdJZC5lcXVhbHMoY29uZmlndXJhdGlvbkVsZW1lbnQuZ2V0QXR0cmlidXRlKElEKSkpIHsKLQkJCQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCi0JCQkJCQkJLy8gZGVjaWRlIHdoZXRoZXIgaXMgZGVmaW5lZCBpbiAidmlld1Nob3J0Y3V0IgotCQkJCQkJCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGNvbmZpZ0VsZW1lbnRzRm9yVmlld1Nob3J0Y3V0ID0gY29uZmlnRWxlbWVudAotCQkJCQkJCSAgICAgICAgLmdldENoaWxkcmVuKFZJRVdTSE9SVENVVCk7Ci0JCQkJCQkJZm9yIChpbnQgbCA9IDA7IGwgPCBjb25maWdFbGVtZW50c0ZvclZpZXdTaG9ydGN1dC5sZW5ndGg7IGwrKykgewotCQkJCQkJCQlJQ29uZmlndXJhdGlvbkVsZW1lbnQgY29uZmlndXJhdGlvbkVsZW1lbnQgPSBjb25maWdFbGVtZW50c0ZvclZpZXdTaG9ydGN1dFtsXTsKLQkJCQkJCQkJaWYgKHZpZXdJZC5lcXVhbHMoY29uZmlndXJhdGlvbkVsZW1lbnQuZ2V0QXR0cmlidXRlKElEKSkpIHsKLQkJCQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCi0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVmcmVzaFZpZXcoQWJzdHJhY3RCYXNlVmlldyBjb25maWdWaWV3KSB7Ci0JCUNvbnRyb2wgY3RybCA9IGNvbmZpZ1ZpZXcuZ2V0Vmlld2VyKCkuZ2V0Q29udHJvbCgpOwotCQlpZiAoY3RybCAhPSBudWxsICYmICFjdHJsLmlzRGlzcG9zZWQoKSkgewotCQkJT2JqZWN0IGlucHV0ID0gIGNvbmZpZ1ZpZXcuZ2V0Vmlld2VyKCkuZ2V0SW5wdXQoKTsKLQkJCWlmIChpbnB1dCBpbnN0YW5jZW9mIEVPYmplY3QpIHsKLQkJCQlFT2JqZWN0IGVPYmplY3QgPSAoRU9iamVjdCkgaW5wdXQ7Ci0JCQkJaWYgKGVPYmplY3QuZUlzUHJveHkoKSkgewotCQkJCQljb25maWdWaWV3LnNldElucHV0Rm9yVmlld2VyKFJlZnJlc2hKb2IuZ2V0SW5zdGFuY2UoKQotCQkJCQkJCS5yZXNvbHZlKGVPYmplY3QpKTsKLQkJCQl9IGVsc2UgewotCQkJCQlJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IGNvbmZpZ1ZpZXcuZ2V0Vmlld2VyKCkKLQkJCQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJCWNvbmZpZ1ZpZXcuZ2V0Vmlld2VyKCkucmVmcmVzaCgpOwotCQkJCQlyZXN0b3JlU2VsZWN0aW9uKGNvbmZpZ1ZpZXcuZ2V0Vmlld2VyKCksIHNlbGVjdGlvbik7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVzdG9yZVNlbGVjdGlvbihWaWV3ZXIgdmlld2VyLCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24gJiYgIXNlbGVjdGlvbi5pc0VtcHR5KCkpIHsKLQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHN0cnVjdHVyZWRTZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbjsKLQkJCWJvb2xlYW4gcmVzdG9yZSA9IGZhbHNlOwotCQkJQXJyYXlMaXN0IHJlc29sdmVkTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHN0cnVjdHVyZWRTZWxlY3Rpb24uaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IG9iamVjdCA9IGl0ZXIubmV4dCgpOwotCQkJCWlmIChvYmplY3QgaW5zdGFuY2VvZiBFT2JqZWN0KSB7Ci0JCQkJCUVPYmplY3QgZU9iaiA9IChFT2JqZWN0KSBvYmplY3Q7Ci0JCQkJCWlmIChlT2JqLmVJc1Byb3h5KCkpIHsKLQkJCQkJCWVPYmogPSBSZWZyZXNoSm9iLmdldEluc3RhbmNlKCkucmVzb2x2ZShlT2JqKTsKLQkJCQkJCXJlc3RvcmUgPSB0cnVlOwotCQkJCQl9Ci0JCQkJCWlmICghZU9iai5lSXNQcm94eSgpKSB7Ci0JCQkJCQlyZXNvbHZlZExpc3QuYWRkKGVPYmopOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJaWYgKHJlc3RvcmUpIHsKLQkJCQl2aWV3ZXIKLQkJCQkJCS5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24ocmVzb2x2ZWRMaXN0KSwKLQkJCQkJCQkJdHJ1ZSk7Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3ZpZXdzL3BhY2thZ2UuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvdmlld3MvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MzM5YmM5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvdmlld3MvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgdmlld3MgZm9yIHRoZSBBdXRob3JpbmcgYW5kIEJyb3dzaW5nIHBlcnNwZWN0aXZlcy4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3dpemFyZHMvQ29uZmlndXJhdGlvblRhYmxlTGFiZWxQcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS93aXphcmRzL0NvbmZpZ3VyYXRpb25UYWJsZUxhYmVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjFhOGRkMy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3dpemFyZHMvQ29uZmlndXJhdGlvblRhYmxlTGFiZWxQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS53aXphcmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRhYmxlTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotCi0KLS8qKgotICogVGhlIGxhYmVsIHByb3ZpZGVyIGZvciB0aGUgQ29uZmlndXJhdGlvbiB0YWJsZSBpbiB0aGUgT3BlbiBDb25maWd1cmF0aW9uCi0gKiB3aXphcmQuCi0gKiAKLSAqIEBhdXRob3IgQmluZ3h1ZSBYdQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQ29uZmlndXJhdGlvblRhYmxlTGFiZWxQcm92aWRlciBleHRlbmRzIExhYmVsUHJvdmlkZXIgaW1wbGVtZW50cwotCQlJVGFibGVMYWJlbFByb3ZpZGVyIHsKLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVGFibGVMYWJlbFByb3ZpZGVyI2dldENvbHVtbkltYWdlKGphdmEubGFuZy5PYmplY3QsIGludCkKLQkgKi8KLQlwdWJsaWMgSW1hZ2UgZ2V0Q29sdW1uSW1hZ2UoT2JqZWN0IGVsZW1lbnQsIGludCBpbmRleCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRhYmxlTGFiZWxQcm92aWRlciNnZXRDb2x1bW5UZXh0KGphdmEubGFuZy5PYmplY3QsIGludCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENvbHVtblRleHQoT2JqZWN0IGVsZW1lbnQsIGludCBpbmRleCkgewotCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IChNZXRob2RDb25maWd1cmF0aW9uKSBlbGVtZW50OwotCQlyZXR1cm4gY29uZmlnLmdldE5hbWUoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvd2l6YXJkcy9OZXdDb25maWd1cmF0aW9uTWFpblBhZ2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvd2l6YXJkcy9OZXdDb25maWd1cmF0aW9uTWFpblBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGYzN2JkZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3dpemFyZHMvTmV3Q29uZmlndXJhdGlvbk1haW5QYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS53aXphcmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLkxpYnJhcnlVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5MaWJyYXJ5VUlUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51aS53aXphcmRzLkJhc2VXaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci0KLS8qKgotICogQSB3aXphcmQgcGFnZSB0aGF0IHByb21wdHMgdGhlIHVzZXIgdG8gZW50ZXIgYSBuYW1lIGFuZCBkZXNjcmlwdGlvbiBmb3IgYSBuZXcKLSAqIG1ldGhvZCBjb25maWd1cmF0aW9uLgotICogCi0gKiBAYXV0aG9yIEJpbmd4dWUgWHUKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIE5ld0NvbmZpZ3VyYXRpb25NYWluUGFnZSBleHRlbmRzIEJhc2VXaXphcmRQYWdlIHsKLQotCS8qKgotCSAqIFRoZSB3aXphcmQgcGFnZSBuYW1lLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBR0VfTkFNRSA9IE5ld0NvbmZpZ3VyYXRpb25NYWluUGFnZS5jbGFzcwotCQkJLmdldE5hbWUoKTsKLQotCXByb3RlY3RlZCBDb21wb3NpdGUgY29tcG9zaXRlOwotCi0JcHJvdGVjdGVkIFRleHQgbmFtZVRleHQ7Ci0KLQlwcm90ZWN0ZWQgVGV4dCBicmllZkRlc2NUZXh0OwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgTmV3Q29uZmlndXJhdGlvbk1haW5QYWdlKFN0cmluZyBwYWdlTmFtZSkgewotCQlzdXBlcihwYWdlTmFtZSk7Ci0JCXNldFRpdGxlKEF1dGhvcmluZ1VJUmVzb3VyY2VzLkF1dGhvcmluZ1VJUGx1Z2luX05ld0NvbmZpZ3VyYXRpb25NYWluUGFnZV9wYWdlVGl0bGUpOwotCQlzZXREZXNjcmlwdGlvbihBdXRob3JpbmdVSVJlc291cmNlcy5BdXRob3JpbmdVSVBsdWdpbl9OZXdDb25maWd1cmF0aW9uTWFpblBhZ2VfcGFnZURlc2NyaXB0aW9uKTsKLQkJc2V0SW1hZ2VEZXNjcmlwdG9yKEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoCi0JCQkJImZ1bGwvd2l6YmFuL05ldy5naWYiKSk7IC8vJE5PTi1OTFMtMSQJCQotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIE5ld0NvbmZpZ3VyYXRpb25NYWluUGFnZSgpIHsKLQkJdGhpcyhQQUdFX05BTUUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nUGFnZSNjcmVhdGVDb250cm9sKENvbXBvc2l0ZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJY29tcG9zaXRlID0gY3JlYXRlR3JpZExheW91dENvbXBvc2l0ZShwYXJlbnQsIDMpOwotCi0JCWNyZWF0ZVZlcnRpY2FsbHlBbGlnbmVkTGFiZWwoY29tcG9zaXRlLCBBdXRob3JpbmdVSVRleHQuTkFNRV9URVhUKTsKLQotCQluYW1lVGV4dCA9IGNyZWF0ZUVkaXRhYmxlVGV4dChjb21wb3NpdGUsIDIpOwotCi0JCWNyZWF0ZVZlcnRpY2FsbHlBbGlnbmVkTGFiZWwoY29tcG9zaXRlLAotCQkJCUF1dGhvcmluZ1VJVGV4dC5ERVNDUklQVElPTl9URVhUKTsKLQotCQlicmllZkRlc2NUZXh0ID0gY3JlYXRlRWRpdGFibGVUZXh0KGNvbXBvc2l0ZSwgNDAwLCA4MCwgMik7Ci0KLQkJaW5pdENvbnRyb2xzKCk7Ci0KLQkJYWRkTGlzdGVuZXJzKCk7Ci0KLQkJc2V0Q29udHJvbChjb21wb3NpdGUpOwotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemVzIHRoZSB3aXphcmQgcGFnZSBjb250cm9scyB3aXRoIGRhdGEuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdENvbnRyb2xzKCkgewotCQlNZXRob2RMaWJyYXJ5IGxpYiA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKTsKLQkJU3RyaW5nIG5hbWUgPSAibmV3X2NvbmZpZyI7IC8vJE5PTi1OTFMtMSQKLQkJaWYobGliICE9IG51bGwpIHsKLQkJCW5hbWUgPSBUbmdVdGlsLmdldE5leHRBdmFpbGFibGVOYW1lKGxpYi5nZXRQcmVkZWZpbmVkQ29uZmlndXJhdGlvbnMoKSwgbmFtZSk7Ci0JCX0KLQkJbmFtZVRleHQuc2V0VGV4dChuYW1lKTsgCi0JfQotCi0JLyoqCi0JICogQWRkcyBldmVudCBoYW5kbGVycyB0byB0aGUgd2l6YXJkIHBhZ2UgY29udHJvbHMuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkTGlzdGVuZXJzKCkgewotCQluYW1lVGV4dC5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJCQlzZXRQYWdlQ29tcGxldGUoaXNQYWdlQ29tcGxldGUoKSk7Ci0JCQkJZ2V0V2l6YXJkKCkuZ2V0Q29udGFpbmVyKCkudXBkYXRlQnV0dG9ucygpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51aS53aXphcmRzLkJhc2VXaXphcmRQYWdlI29uRW50ZXJQYWdlKE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBvbkVudGVyUGFnZShPYmplY3Qgb2JqKSB7Ci0JCWlmIChuYW1lVGV4dCAhPSBudWxsKSB7Ci0JCQluYW1lVGV4dC5zZXRGb2N1cygpOwotCQkJbmFtZVRleHQuc2VsZWN0QWxsKCk7Ci0JCX0KLQkJc2V0UGFnZUNvbXBsZXRlKGlzUGFnZUNvbXBsZXRlKCkpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2UjaXNQYWdlQ29tcGxldGUoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUGFnZUNvbXBsZXRlKCkgewotCQlpZiAoTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpID09IG51bGwpIHsKLQkJCXNldEVycm9yTWVzc2FnZShMaWJyYXJ5VUlSZXNvdXJjZXMubm9PcGVuTGlicmFyeVdhcm5pbmdfbXNnKTsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCVN0cmluZyBjb25maWdOYW1lID0gZ2V0Q29uZmlndXJhdGlvbk5hbWUoKTsKLQotCQlpZiAoIXZhbGlkYXRlQ29uZmlndXJhdGlvbk5hbWUoY29uZmlnTmFtZSkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCWlmIChjb25maWd1cmF0aW9uRXhpc3RzKGNvbmZpZ05hbWUpKSB7Ci0JCQlzZXRFcnJvck1lc3NhZ2UoTGlicmFyeUVkaXRSZXNvdXJjZXMuZHVwbGljYXRlRWxlbWVudE5hbWVFcnJvcl9zaW1wbGVfbXNnKTsKLQkJCXJldHVybiBmYWxzZTsKLQkJfSBlbHNlIHsKLQkJCXNldEVycm9yTWVzc2FnZShudWxsKTsKLQkJfQotCi0JCXJldHVybiBnZXRFcnJvck1lc3NhZ2UoKSA9PSBudWxsOwotCX0KLQotCS8qKgotCSAqIENoZWNrcyB3aGV0aGVyIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24gd2l0aCB0aGUgc2FtZSBuYW1lIGFscmVhZHkgZXhpc3RzCi0JICogaW4gdGhlIGN1cnJlbnQgbWV0aG9kIGxpYnJhcnkuCi0JICogCi0JICogQHBhcmFtIGNvbmZpZ05hbWUKLQkgKiAgICAgICAgICAgIHRoZSBuYW1lIGZvciBhIG1ldGhvZCBjb25maWd1cmF0aW9uCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBhIG1ldGhvZCBjb25maWd1cmF0aW9uIHdpdGggdGhlIHNhbWUgbmFtZQotCSAqICAgICAgICAgYWxyZWFkeSBleGlzdHMKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBjb25maWd1cmF0aW9uRXhpc3RzKFN0cmluZyBjb25maWdOYW1lKSB7Ci0JCVN0cmluZ1tdIGNvbmZpZ05hbWVzID0gTGlicmFyeVNlcnZpY2VVdGlsCi0JCQkJLmdldE1ldGhvZENvbmZpZ3VyYXRpb25OYW1lcyhMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJCQkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKSk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY29uZmlnTmFtZXMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChjb25maWdOYW1lLmVxdWFsc0lnbm9yZUNhc2UoY29uZmlnTmFtZXNbaV0pKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFZhbGlkYXRlcyBhIG1ldGhvZCBjb25maWd1cmF0aW9uIG5hbWUuCi0JICogCi0JICogQHBhcmFtIG5hbWUKLQkgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBjb25maWd1cmF0aW9uIG5hbWUgaXMgdmFsaWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiB2YWxpZGF0ZUNvbmZpZ3VyYXRpb25OYW1lKFN0cmluZyBuYW1lKSB7Ci0JCS8vIFRPRE86IENhbGwgdGhlIGNvbmZpZ3VyYXRpb24gbmFtZSB2YWxpZGF0b3Igd2hlbiBpdCBpcyByZWFkeS4KLQkJU3RyaW5nIGVycm1zZyA9IFRuZ1V0aWwuY2hlY2tFbGVtZW50TmFtZShuYW1lLAotCQkJCUxpYnJhcnlVSVRleHQuVEVYVF9NRVRIT0RfQ09ORklHVVJBVE9OKTsKLQkJaWYgKGVycm1zZyAhPSBudWxsKSB7Ci0JCQllcnJtc2cgPSBlcnJtc2cucmVwbGFjZUFsbCgiXG5cbiIsICIgIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JCXNldEVycm9yTWVzc2FnZShlcnJtc2cpOwotCQlyZXR1cm4gZXJybXNnID09IG51bGw7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgdXNlciBzcGVjaWZpZWQgdGhlIG1ldGhvZCBjb25maWd1cmF0aW9uIG5hbWUuCi0JICogCi0JICogQHJldHVybiB0aGUgbmFtZSBmb3IgdGhlIG5ldyBtZXRob2QgY29uZmlndXJhdGlvbgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q29uZmlndXJhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBuYW1lVGV4dC5nZXRUZXh0KCkudHJpbSgpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHVzZXIgc3BlY2lmaWVkIG1ldGhvZCBjb25maWd1cmF0aW9uIGJyaWVmIGRlc2NyaXB0aW9uLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGJyaWVmIGRlc2NyaXB0aW9uIGZvciB0aGUgbmV3IG1ldGhvZCBjb25maWd1cmF0aW9uCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRCcmllZkRlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gYnJpZWZEZXNjVGV4dC5nZXRUZXh0KCkudHJpbSgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS93aXphcmRzL05ld0NvbmZpZ3VyYXRpb25XaXphcmQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvd2l6YXJkcy9OZXdDb25maWd1cmF0aW9uV2l6YXJkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0MzlmYmQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS93aXphcmRzL05ld0NvbmZpZ3VyYXRpb25XaXphcmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLndpemFyZHM7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbi5JVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbi5JVmFsaWRhdG9yRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5hY3Rpb25zLkxpYnJhcnlMb2NraW5nT3BlcmF0aW9uUnVubmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy5JTGlicmFyeVBlcnNpc3RlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudWkud2l6YXJkcy5CYXNlV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVXaXRoUHJvZ3Jlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSU5ld1dpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotCi0vKioKLSAqIEEgd2l6YXJkIHRoYXQgZ3VpZGVzIHRoZSB1c2VyIHRvIGNyZWF0ZSBhIG5ldyBNZXRob2QgQ29uZmlndXJhdGlvbi4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAYXV0aG9yIEJpbmd4dWUgWHUKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBOZXdDb25maWd1cmF0aW9uV2l6YXJkIGV4dGVuZHMgQmFzZVdpemFyZCBpbXBsZW1lbnRzIElOZXdXaXphcmQgewotCi0JLyoqCi0JICogVGhlIHdpemFyZCBJRC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXSVpBUkRfSUQgPSBOZXdDb25maWd1cmF0aW9uV2l6YXJkLmNsYXNzCi0JCQkuZ2V0TmFtZSgpOwotCi0JLyoqCi0JICogVGhlIE5ldyBNZXRob2QgQ29uZmlndXJhdGlvbiB3aXphcmQgZXh0ZW5zaW9uIHBvaW50IElELgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdJWkFSRF9FWFRFTlNJT05fUE9JTlRfSUQgPSAib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5uZXdDb25maWd1cmF0aW9uV2l6YXJkIjsgLy8kTk9OLU5MUy0xJAkKLQotCS8vIFRoZSBtYWluIHdpemFyZCBwYWdlLgotCXByb3RlY3RlZCBOZXdDb25maWd1cmF0aW9uTWFpblBhZ2UgbWFpblBhZ2U7Ci0KLQkvLyBUaGUgbmV3IG1ldGhvZCBjb25maWd1cmF0aW9uLgotCXByb3RlY3RlZCBNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZzsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIE5ld0NvbmZpZ3VyYXRpb25XaXphcmQoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudWkud2l6YXJkcy5CYXNlV2l6YXJkI2dldFdpemFyZEV4dGVuZGVyRXh0ZW5zaW9uUG9pbnRJZCgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRXaXphcmRFeHRlbmRlckV4dGVuc2lvblBvaW50SWQoKSB7Ci0JCXJldHVybiBXSVpBUkRfRVhURU5TSU9OX1BPSU5UX0lEOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVpLndpemFyZHMuQmFzZVdpemFyZCNpbml0KElXb3JrYmVuY2gsCi0JICogICAgICBJU3RydWN0dXJlZFNlbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2ggd29ya2JlbmNoLCBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJc3VwZXIuaW5pdCh3b3JrYmVuY2gsIHNlbGVjdGlvbik7Ci0JCXNldFdpbmRvd1RpdGxlKEF1dGhvcmluZ1VJUmVzb3VyY2VzLm5ld0NvbmZpZ3VyYXRpb25XaXphcmRfdGl0bGUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZCNhZGRQYWdlcygpCi0JICovCi0JcHVibGljIHZvaWQgYWRkUGFnZXMoKSB7Ci0JCWlmICh3aXphcmRFeHRlbmRlciA9PSBudWxsKSB7Ci0JCQltYWluUGFnZSA9IGNyZWF0ZU1haW5QYWdlKCk7Ci0JCQlzdXBlci5hZGRQYWdlKG1haW5QYWdlKTsKLQkJfSBlbHNlIHsKLQkJCUxpc3Q8SVdpemFyZFBhZ2U+IHdpemFyZFBhZ2VzID0gbmV3IEFycmF5TGlzdDxJV2l6YXJkUGFnZT4oKTsKLQotCQkJSVdpemFyZFBhZ2UgcGFnZSA9IHdpemFyZEV4dGVuZGVyCi0JCQkJCS5nZXRSZXBsYWNlV2l6YXJkUGFnZShOZXdDb25maWd1cmF0aW9uTWFpblBhZ2UuUEFHRV9OQU1FKTsKLQkJCWlmIChwYWdlICE9IG51bGwpIHsKLQkJCQl3aXphcmRQYWdlcy5hZGQocGFnZSk7Ci0JCQl9IGVsc2UgewotCQkJCW1haW5QYWdlID0gY3JlYXRlTWFpblBhZ2UoKTsKLQkJCQl3aXphcmRQYWdlcy5hZGQobWFpblBhZ2UpOwotCQkJfQotCi0JCQlzdXBlci5nZXROZXdXaXphcmRQYWdlcyh3aXphcmRQYWdlcyk7Ci0KLQkJCWZvciAoSXRlcmF0b3IgaXQgPSB3aXphcmRQYWdlcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJSVdpemFyZFBhZ2Ugd2l6YXJkUGFnZSA9IChJV2l6YXJkUGFnZSkgaXQubmV4dCgpOwotCQkJCXN1cGVyLmFkZFBhZ2Uod2l6YXJkUGFnZSk7Ci0JCQl9Ci0KLQkJCXdpemFyZEV4dGVuZGVyLmluaXRXaXphcmRQYWdlcyh3aXphcmRQYWdlcyk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBtYWluIHdpemFyZCBwYWdlLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG1haW4gd2l6YXJkIHBhZ2UKLQkgKi8KLQlwcm90ZWN0ZWQgTmV3Q29uZmlndXJhdGlvbk1haW5QYWdlIGNyZWF0ZU1haW5QYWdlKCkgewotCQlyZXR1cm4gbmV3IE5ld0NvbmZpZ3VyYXRpb25NYWluUGFnZSgpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZCNjcmVhdGVQYWdlQ29udHJvbHMoQ29tcG9zaXRlKQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZVBhZ2VDb250cm9scyhDb21wb3NpdGUgcGFnZUNvbnRhaW5lcikgewotCQlzdXBlci5jcmVhdGVQYWdlQ29udHJvbHMocGFnZUNvbnRhaW5lcik7Ci0JCXBhZ2VDb250YWluZXIuZ2V0U2hlbGwoKS5zZXRJbWFnZSgKLQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0U2hhcmVkSW1hZ2UoCi0JCQkJCQkiZnVsbC9vYmoxNi9NZXRob2RDb25maWd1cmF0aW9uLmdpZiIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIG1ldGhvZCBjb25maWd1cmF0aW9uLiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiBhIG1ldGhvZAotCSAqIGNvbmZpZ3VyYXRpb24gaXMgY3JlYXRlZCBpbiB0aGUgTGlicmFyeSB2aWV3IHZpYSB0aGUgY29udGV4dCBtZW51LiBVcG9uCi0JICogY29tcGxldGluZyB0aGlzIHdpemFyZCwgdGhlIG5ld2x5IGNyZWF0ZWQgbWV0aG9kIGNvbmZpZ3VyYXRpb24gd2lsbCBiZQotCSAqIGluaXRpYWxpemVkIHdpdGggdGhlIG5hbWUgYW5kIGJyaWVmIGRlc2NyaXB0aW9uIGVudGVyZWQgYnkgdGhlIHVzZXIgaW4KLQkgKiB0aXMgd2l6YXJkLgotCSAqIAotCSAqIEBwYXJhbSBjb25maWcKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNZXRob2RDb25maWd1cmF0aW9uKE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0JCXRoaXMuY29uZmlnID0gY29uZmlnOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVpLndpemFyZHMuQmFzZVdpemFyZCNkb0ZpbmlzaCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gZG9GaW5pc2goKSB7Ci0JCWJvb2xlYW4gcmV0ID0gY3JlYXRlTWV0aG9kQ29uZmlndXJhdGlvbihtYWluUGFnZS5nZXRDb25maWd1cmF0aW9uTmFtZSgpLAotCQkJCW1haW5QYWdlLmdldEJyaWVmRGVzY3JpcHRpb24oKSwgbWFpblBhZ2UpOwotCQlpZihyZXQpIHsKLQkJCU1ldGhvZExpYnJhcnkgbGlicmFyeSA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLQkJCQkJLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCk7Ci0JCQlJTGlicmFyeVBlcnNpc3Rlci5GYWlsU2FmZU1ldGhvZExpYnJhcnlQZXJzaXN0ZXIgcGVyc2lzdGVyID0gTGlicmFyeVNlcnZpY2VVdGlsCi0JCQkJCS5nZXRDdXJyZW50UGVyc2lzdGVyKCkuZ2V0RmFpbFNhZmVQZXJzaXN0ZXIoKTsKLQkJCXRyeSB7Ci0JCQkJcGVyc2lzdGVyLnNhdmUobGlicmFyeS5lUmVzb3VyY2UoKSk7Ci0JCQkJcGVyc2lzdGVyLmNvbW1pdCgpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQl0cnkgewotCQkJCQlwZXJzaXN0ZXIucm9sbGJhY2soKTsKLQkJCQl9Ci0JCQkJY2F0Y2goRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihleCk7Ci0JCQkJfQotCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkuZGlzcGxheUVycm9yKAotCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMubmV3Q29uZmlndXJhdGlvbldpemFyZF90aXRsZSwKLQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLmludGVybmFsRXJyb3JfbXNnLCBlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmV0OwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgbWV0aG9kIGNvbmZpZ3VyYXRpb24uCi0JICogCi0JICogQHBhcmFtIG5hbWUKLQkgKiAgICAgICAgICAgIHRoZSBuYW1lIGZvciB0aGUgbmV3IGNvbmZpZ3VyYXRpb24KLQkgKiBAcGFyYW0gYnJpZWZEZXNjCi0JICogICAgICAgICAgICB0aGUgYnJpZWYgZGVzY3JpcHRpb24gZm9yIHRoZSBuZXcgY29uZmlndXJhdGlvbgotCSAqIEBwYXJhbSB3aXphcmRQYWdlCi0JICogICAgICAgICAgICB0aGUgd2l6YXJkIHBhZ2UgdXNlZCBmb3IgZGlzcGxheWluZyBlcnJvciBtZXNzYWdlcwotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIG1ldGhvZCBjb25maWd1cmF0aW9uIGlzIGNyZWF0ZWQKLQkgKiAgICAgICAgIHN1Y2Nlc3NmdWxseQotCSAqLwotCXB1YmxpYyBib29sZWFuIGNyZWF0ZU1ldGhvZENvbmZpZ3VyYXRpb24oU3RyaW5nIG5hbWUsIFN0cmluZyBicmllZkRlc2MsCi0JCQlXaXphcmRQYWdlIHdpemFyZFBhZ2UpIHsKLQkJaWYgKG5hbWUgPT0gbnVsbCB8fCBuYW1lLmxlbmd0aCgpID09IDApIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLQkJfQotCi0JCXRyeSB7Ci0JCQlNZXRob2RMaWJyYXJ5IGxpYnJhcnkgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJCS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpOwotCi0JCQlNZXRob2RDb25maWd1cmF0aW9uIGMgPSBjb25maWcgPT0gbnVsbCA/IFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZU1ldGhvZENvbmZpZ3VyYXRpb24oKSA6IGNvbmZpZzsKLQkJCWMuc2V0TmFtZShuYW1lKTsKLQkJCQotCQkJaWYgKCEgbmFtZUNoZWNrKG5hbWUsIHdpemFyZFBhZ2UsIGxpYnJhcnksIGMpKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJCi0JCQlpZiAoY29uZmlnID09IG51bGwpIHsKLQkJCQljb25maWcgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJCQkuY3JlYXRlTWV0aG9kQ29uZmlndXJhdGlvbihuYW1lLCBsaWJyYXJ5KTsKLQkJCX0KLQotCQkJaWYgKGJyaWVmRGVzYyAhPSBudWxsKSB7Ci0JCQkJY29uZmlnLnNldEJyaWVmRGVzY3JpcHRpb24oYnJpZWZEZXNjKTsKLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKS5kaXNwbGF5RXJyb3IoCi0JCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLm5ld0NvbmZpZ3VyYXRpb25XaXphcmRfdGl0bGUsCi0JCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLmludGVybmFsRXJyb3JfbXNnLCBlKTsKLQkJfQotCi0JCXJldHVybiB0cnVlOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBuYW1lQ2hlY2soU3RyaW5nIG5hbWUsIFdpemFyZFBhZ2Ugd2l6YXJkUGFnZSwgCi0JCQlNZXRob2RMaWJyYXJ5IGxpYnJhcnksIE1ldGhvZENvbmZpZ3VyYXRpb24gbWV0aG9kQ29uZmlnKSB7Ci0JCS8vIEZpeCBmb3IgYnVnemlsbGEgMTc4NDYyLgotCQlTdHJpbmcgZXJybXNnID0gbnVsbDsKLQkJaWYgKG5hbWUuaW5kZXhPZigiJiIpID4gLTEpIHsgLy8kTk9OLU5MUy0xJAotCQkJZXJybXNnID0gTkxTCi0JCQkJCS5iaW5kKAotCQkJCQkJCUxpYnJhcnlFZGl0UmVzb3VyY2VzLmludmFsaWRFbGVtZW50TmFtZUVycm9yNF9tc2csCi0JCQkJCQkJbmFtZSk7Ci0JCX0gZWxzZSB7Ci0JCQlJVmFsaWRhdG9yIHZhbGlkYXRvciA9IElWYWxpZGF0b3JGYWN0b3J5LklOU1RBTkNFCi0JCQkJCS5jcmVhdGVOYW1lVmFsaWRhdG9yKGxpYnJhcnksIG1ldGhvZENvbmZpZyk7Ci0JCQllcnJtc2cgPSB2YWxpZGF0b3IuaXNWYWxpZChuYW1lKTsKLQkJfQotCi0JCWlmIChlcnJtc2cgIT0gbnVsbCkgewotCQkJd2l6YXJkUGFnZS5zZXRFcnJvck1lc3NhZ2UoZXJybXNnKTsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBuZXdseSBjcmVhdGVkIG1ldGhvZCBjb25mZ3VyYXRpb24uCi0JICogCi0JICogQHJldHVybiBhIG5ldyBtZXRob2QgY29uZmlndXJhdGlvbgotCSAqLwotCXB1YmxpYyBNZXRob2RDb25maWd1cmF0aW9uIGdldE1ldGhvZENvbmZpZ3VyYXRpb24oKSB7Ci0JCXJldHVybiBjb25maWc7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIHN1cGVyUGVyZm9ybUZpbmlzaCgpIHsKLQkJcmV0dXJuIHN1cGVyLnBlcmZvcm1GaW5pc2goKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtRmluaXNoKCkgewotCQlmaW5hbCBib29sZWFuW10gcmVzdWx0SG9sZGVyID0gbmV3IGJvb2xlYW5bMV07Ci0JCUxpYnJhcnlMb2NraW5nT3BlcmF0aW9uUnVubmVyIHJ1bm5lciA9IG5ldyBMaWJyYXJ5TG9ja2luZ09wZXJhdGlvblJ1bm5lcigpOwotCQlydW5uZXIucnVuKG5ldyBJUnVubmFibGVXaXRoUHJvZ3Jlc3MoKSB7Ci0KLQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCi0JCQkJCXRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCQkJcmVzdWx0SG9sZGVyWzBdID0gc3VwZXJQZXJmb3JtRmluaXNoKCk7Ci0JCQl9Ci0JCQkKLQkJfSk7Ci0JCXJldHVybiByZXN1bHRIb2xkZXJbMF07Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3dpemFyZHMvTmV3TGlicmFyeU1haW5QYWdlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3dpemFyZHMvTmV3TGlicmFyeU1haW5QYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmNmFjOWUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS93aXphcmRzL05ld0xpYnJhcnlNYWluUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkud2l6YXJkczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5TWFuYWdlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkucHJlZmVyZW5jZXMuTGlicmFyeVVJUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVpLndpemFyZHMuQmFzZVdpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXJlY3RvcnlEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLQotLyoqCi0gKiBBIHdpemFyZCBwYWdlIHRoYXQgcHJvbXB0cyB0aGUgdXNlciB0byBlbnRlciB0aGUgbmFtZSBhbmQgYnJpZWYgZGVzY3JpcHRpb24KLSAqIGZvciBhIG5ldyBtZXRob2QgbGlicmFyeS4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBOZXdMaWJyYXJ5TWFpblBhZ2UgZXh0ZW5kcyBCYXNlV2l6YXJkUGFnZSB7Ci0KLQkvKioKLQkgKiBUaGUgd2l6YXJkIHBhZ2UgbmFtZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQUdFX05BTUUgPSBOZXdMaWJyYXJ5TWFpblBhZ2UuY2xhc3MuZ2V0TmFtZSgpOwotCi0JcHJpdmF0ZSBTaGVsbCBzaGVsbDsKLQotCXByaXZhdGUgQ29tYm8gbGlicmFyeVBhdGhDb21ibzsKLQotCXByaXZhdGUgQnV0dG9uIGJyb3dzZUJ1dHRvbjsKLQotCXByaXZhdGUgVGV4dCBicmllZkRlc2NUZXh0OwotCi0JcHJpdmF0ZSBTdHJpbmcgbGlicmFyeVR5cGU7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBOZXdMaWJyYXJ5TWFpblBhZ2UoKSB7Ci0JCXN1cGVyKFBBR0VfTkFNRSk7Ci0JCXNldFRpdGxlKEF1dGhvcmluZ1VJUmVzb3VyY2VzLm5ld0xpYnJhcnlXaXphcmRNYWluUGFnZV90aXRsZSk7Ci0JCXNldERlc2NyaXB0aW9uKEF1dGhvcmluZ1VJUmVzb3VyY2VzLm5ld0xpYnJhcnlXaXphcmRNYWluUGFnZV9kZXNjcmlwdGlvbik7Ci0JCXNldEltYWdlRGVzY3JpcHRvcihBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKAotCQkJCSJmdWxsL3dpemJhbi9OZXcuZ2lmIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dQYWdlI2NyZWF0ZUNvbnRyb2woQ29tcG9zaXRlKQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCQlzaGVsbCA9IHBhcmVudC5nZXRTaGVsbCgpOwotCi0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBjcmVhdGVHcmlkTGF5b3V0Q29tcG9zaXRlKHBhcmVudCwgMyk7Ci0KLQkJY3JlYXRlTGFiZWwoY29tcG9zaXRlLCBBdXRob3JpbmdVSVJlc291cmNlcy5saWJyYXJ5UGF0aExhYmVsX3RleHQpOwotCi0JCWxpYnJhcnlQYXRoQ29tYm8gPSBjcmVhdGVDb21ib2JveChjb21wb3NpdGUpOwotCi0JCWJyb3dzZUJ1dHRvbiA9IGNyZWF0ZUJ1dHRvbihjb21wb3NpdGUsCi0JCQkJQXV0aG9yaW5nVUlUZXh0LkJST1dTRV9CVVRUT05fVEVYVCk7Ci0KLQkJY3JlYXRlVmVydGljYWxseUFsaWduZWRMYWJlbChjb21wb3NpdGUsCi0JCQkJQXV0aG9yaW5nVUlUZXh0LkRFU0NSSVBUSU9OX1RFWFQpOwotCi0JCWJyaWVmRGVzY1RleHQgPSBjcmVhdGVFZGl0YWJsZVRleHQoY29tcG9zaXRlLCA0MDAsIDgwLCAxKTsKLQotCQlNYXAgdHlwZXMgPSBMaWJyYXJ5TWFuYWdlckZhY3RvcnkuZ2V0SW5zdGFuY2UoKS5nZXRMaWJyYXJ5VHlwZXMoKTsKLQkJZm9yIChJdGVyYXRvciBpdCA9IHR5cGVzLmtleVNldCgpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCWxpYnJhcnlUeXBlID0gKFN0cmluZykgaXQubmV4dCgpOwotCQkJYnJlYWs7Ci0JCX0KLQotCQlpbml0Q29udHJvbHMoKTsKLQotCQlhZGRMaXN0ZW5lcnMoKTsKLQotCQlzZXRDb250cm9sKGNvbXBvc2l0ZSk7Ci0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZXMgdGhlIHdpemFyZCBwYWdlIGNvbnRyb2xzIHdpdGggZGF0YS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0Q29udHJvbHMoKSB7Ci0JCVN0cmluZyBkZWZhdWx0TGlicmFyeVBhdGggPSBMaWJyYXJ5VUlQcmVmZXJlbmNlcwotCQkJCS5nZXREZWZhdWx0TGlicmFyeVBhdGgoKTsKLQkJRmlsZSBkZWZhdWx0TGlicmFyeURpciA9IG5ldyBGaWxlKGRlZmF1bHRMaWJyYXJ5UGF0aCk7Ci0JCVN0cmluZyBuZXdMaWJyYXJ5UGF0aCA9IG51bGw7Ci0JCWZvciAoaW50IGkgPSAxOzsgaSsrKSB7Ci0JCQlGaWxlIG5ld0xpYnJhcnlEaXIgPSBuZXcgRmlsZShkZWZhdWx0TGlicmFyeURpciwgIkxpYnJhcnkiICsgaSk7IC8vJE5PTi1OTFMtMSQKLQkJCWlmICghbmV3TGlicmFyeURpci5leGlzdHMoKSkgewotCQkJCW5ld0xpYnJhcnlQYXRoID0gbmV3TGlicmFyeURpci5nZXRBYnNvbHV0ZVBhdGgoKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCi0JCUxpc3Q8U3RyaW5nPiBuZXdMaWJyYXJ5UGF0aHNMaXN0ID0gTGlicmFyeVVJUHJlZmVyZW5jZXMKLQkJCQkuZ2V0TmV3TGlicmFyeVBhdGhzTGlzdCgpOwotCQlpZiAobmV3TGlicmFyeVBhdGggIT0gbnVsbCAmJiBuZXdMaWJyYXJ5UGF0aC5sZW5ndGgoKSA+IDApIHsKLQkJCW5ld0xpYnJhcnlQYXRoc0xpc3QuYWRkKDAsIG5ld0xpYnJhcnlQYXRoKTsKLQkJfQotCQlpZiAobmV3TGlicmFyeVBhdGhzTGlzdC5zaXplKCkgPiAwKSB7Ci0JCQlTdHJpbmdbXSBuZXdMaWJyYXJ5UGF0aHMgPSBuZXcgU3RyaW5nW25ld0xpYnJhcnlQYXRoc0xpc3Quc2l6ZSgpXTsKLQkJCW5ld0xpYnJhcnlQYXRoc0xpc3QudG9BcnJheShuZXdMaWJyYXJ5UGF0aHMpOwotCQkJbGlicmFyeVBhdGhDb21iby5zZXRJdGVtcyhuZXdMaWJyYXJ5UGF0aHMpOwotCQkJbGlicmFyeVBhdGhDb21iby5zZXRUZXh0KG5ld0xpYnJhcnlQYXRoc1swXSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBZGRzIGV2ZW50IGxpc3RlbmVycyB0byB0aGUgd2l6YXJkIHBhZ2UgY29udHJvbHMuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkTGlzdGVuZXJzKCkgewotCQlsaWJyYXJ5UGF0aENvbWJvLmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotCQkJCXNldFBhZ2VDb21wbGV0ZShpc1BhZ2VDb21wbGV0ZSgpKTsKLQkJCQlnZXRXaXphcmQoKS5nZXRDb250YWluZXIoKS51cGRhdGVCdXR0b25zKCk7Ci0JCQl9Ci0JCX0pOwotCi0JCWxpYnJhcnlQYXRoQ29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCXNldFBhZ2VDb21wbGV0ZShpc1BhZ2VDb21wbGV0ZSgpKTsKLQkJCQlnZXRXaXphcmQoKS5nZXRDb250YWluZXIoKS51cGRhdGVCdXR0b25zKCk7Ci0JCQl9Ci0JCX0pOwotCi0JCWJyb3dzZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJRGlyZWN0b3J5RGlhbG9nIGRpYWxvZyA9IG5ldyBEaXJlY3RvcnlEaWFsb2coc2hlbGwsIFNXVC5OT05FKTsKLQkJCQlkaWFsb2cuc2V0RmlsdGVyUGF0aChnZXRMaWJyYXJ5UGF0aCgpKTsKLQkJCQlTdHJpbmcgc2VsZWN0ZWREaXIgPSBkaWFsb2cub3BlbigpOwotCQkJCWlmIChzZWxlY3RlZERpciAhPSBudWxsKSB7Ci0JCQkJCWxpYnJhcnlQYXRoQ29tYm8uYWRkKHNlbGVjdGVkRGlyLCAwKTsKLQkJCQkJbGlicmFyeVBhdGhDb21iby5zZXRUZXh0KHNlbGVjdGVkRGlyKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2UjaXNDb21wbGV0ZWQoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUGFnZUNvbXBsZXRlKCkgewotCQlyZXR1cm4gZ2V0TGlicmFyeU5hbWUoKS5sZW5ndGgoKSA+IDA7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgbGlicmFyeSBuYW1lLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TGlicmFyeU5hbWUoKSB7Ci0JCVN0cmluZyBsaWJQYXRoID0gZ2V0TGlicmFyeVBhdGgoKTsKLQkJU3RyaW5nIGxpYk5hbWUgPSBuZXcgRmlsZShsaWJQYXRoKS5nZXROYW1lKCk7Ci0JCWlmICghbGliUGF0aC5lcXVhbHMobGliTmFtZSkpIHsKLQkJCXJldHVybiBsaWJOYW1lOwotCQl9IGVsc2UgewotCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSB1c2VyIHNwZWNpZmllZCBsaWJyYXJ5IHBhdGguCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMaWJyYXJ5UGF0aCgpIHsKLQkJcmV0dXJuIGxpYnJhcnlQYXRoQ29tYm8uZ2V0VGV4dCgpLnRyaW0oKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSB1c2VyIHNwZWNpZmllZCBtZXRob2QgbGlicmFyeSBkZXNjcmlwdGlvbi4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExpYnJhcnlEZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIGJyaWVmRGVzY1RleHQuZ2V0VGV4dCgpLnRyaW0oKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSB1c2VyIHNwZWNpZmllZCBtZXRob2QgbGlicmFyeSB0eXBlLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TGlicmFyeVR5cGUoKSB7Ci0JCXJldHVybiBsaWJyYXJ5VHlwZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvd2l6YXJkcy9OZXdMaWJyYXJ5V2l6YXJkLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3dpemFyZHMvTmV3TGlicmFyeVdpemFyZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MTBmYzY5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvd2l6YXJkcy9OZXdMaWJyYXJ5V2l6YXJkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS53aXphcmRzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1BlcnNwZWN0aXZlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpLnV0aWwuUGVyc3BlY3RpdmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLkxpYnJhcnlVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5MaWJyYXJ5VUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkucHJlZmVyZW5jZXMuTGlicmFyeVVJUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pLlhNSUxpYnJhcnlNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS5YTUlMaWJyYXJ5VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JTmV3V2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci0KLS8qKgotICogQSB3aXphcmQgdGhhdCBndWlkZXMgdGhlIHVzZXIgdG8gY3JlYXRlIGEgbmV3IG1ldGhvZCBsaWJyYXJ5LgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIE5ld0xpYnJhcnlXaXphcmQgZXh0ZW5kcyBXaXphcmQgaW1wbGVtZW50cyBJTmV3V2l6YXJkIHsKLQotCS8qKgotCSAqIFRoZSB3aXphcmQgSUQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0laQVJEX0lEID0gTmV3TGlicmFyeVdpemFyZC5jbGFzcy5nZXROYW1lKCk7Ci0KLQkvLyBUaGUgbWFpbiB3aXphcmQgcGFnZS4KLQlwcml2YXRlIE5ld0xpYnJhcnlNYWluUGFnZSBtYWluUGFnZTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIE5ld0xpYnJhcnlXaXphcmQoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2l6YXJkI2luaXQoSVdvcmtiZW5jaCwKLQkgKiAgICAgIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaCB3b3JrYmVuY2gsIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlzZXRXaW5kb3dUaXRsZShBdXRob3JpbmdVSVJlc291cmNlcy5uZXdMaWJyYXJ5V2l6YXJkX3RpdGxlKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmQjYWRkUGFnZXMoKQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFBhZ2VzKCkgewotCQlTYXZlQWxsRWRpdG9yc1BhZ2UuYWRkUGFnZUlmTmVlZGVkKHRoaXMsIHRydWUsIG51bGwsIG51bGwsIG51bGwpOwotCQltYWluUGFnZSA9IG5ldyBOZXdMaWJyYXJ5TWFpblBhZ2UoKTsKLQkJYWRkUGFnZShtYWluUGFnZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkI2NyZWF0ZVBhZ2VDb250cm9scyhDb21wb3NpdGUpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlUGFnZUNvbnRyb2xzKENvbXBvc2l0ZSBwYWdlQ29udGFpbmVyKSB7Ci0JCXN1cGVyLmNyZWF0ZVBhZ2VDb250cm9scyhwYWdlQ29udGFpbmVyKTsKLQkJcGFnZUNvbnRhaW5lci5nZXRTaGVsbCgpLnNldEltYWdlKAotCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRTaGFyZWRJbWFnZSgKLQkJCQkJCSJmdWxsL29iajE2L01ldGhvZExpYnJhcnkuZ2lmIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkI3BlcmZvcm1GaW5pc2goKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHBlcmZvcm1GaW5pc2goKSB7Ci0JCXRyeSB7Ci0JCQlTdHJpbmcgbmFtZSA9IG1haW5QYWdlLmdldExpYnJhcnlOYW1lKCk7Ci0JCQlTdHJpbmcgZGVzYyA9IG1haW5QYWdlLmdldExpYnJhcnlEZXNjcmlwdGlvbigpOwotCQkJU3RyaW5nIHR5cGUgPSBtYWluUGFnZS5nZXRMaWJyYXJ5VHlwZSgpOwotCQkJTWFwPFN0cmluZywgT2JqZWN0PiBvcHRpb25zID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7Ci0JCQlGaWxlIGxpYnJhcnlQYXRoID0gbmV3IEZpbGUobWFpblBhZ2UuZ2V0TGlicmFyeVBhdGgoKSk7Ci0JCQlvcHRpb25zLnB1dChYTUlMaWJyYXJ5TWFuYWdlci5BUkdfTElCUkFSWV9QQVRILCBsaWJyYXJ5UGF0aAotCQkJCQkuZ2V0QWJzb2x1dGVQYXRoKCkpOwotCi0JCQlpZiAoWE1JTGlicmFyeVV0aWwuY29udGFpbnNQbHVnaW5PckNvbmZpZ1NwZWNFeHBvcnRGaWxlKGxpYnJhcnlQYXRoCi0JCQkJCS5nZXRBYnNvbHV0ZVBhdGgoKSkpIHsKLQkJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKExpYnJhcnlVSVJlc291cmNlcy5vcGVuTGlicmFyeUVycm9yX3JlYXNvbjQpOwotCQkJfQotCi0JCQlNZXRob2RMaWJyYXJ5IGxpYnJhcnkgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJCS5jcmVhdGVNZXRob2RMaWJyYXJ5KG5hbWUsIHR5cGUsIG9wdGlvbnMpOwotCQkJaWYgKGxpYnJhcnkgIT0gbnVsbCkgewotCQkJCWlmIChkZXNjLmxlbmd0aCgpID4gMCkgewotCQkJCQlsaWJyYXJ5LnNldEJyaWVmRGVzY3JpcHRpb24oZGVzYyk7Ci0JCQkJfQotCQkJCUxpYnJhcnlVSVByZWZlcmVuY2VzLmFkZE5ld0xpYnJhcnlQYXRoKGxpYnJhcnlQYXRoCi0JCQkJCQkuZ2V0QWJzb2x1dGVQYXRoKCkpOwotCQkJCVBlcnNwZWN0aXZlVXRpbAotCQkJCQkJLm9wZW5QZXJzcGVjdGl2ZShBdXRob3JpbmdQZXJzcGVjdGl2ZS5QRVJTUEVDVElWRV9JRCk7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlTdHJpbmcgcmVhc29uID0gZS5nZXRNZXNzYWdlKCk7Ci0JCQlpZiAocmVhc29uID09IG51bGwpIHsKLQkJCQlyZWFzb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy5uZXdMaWJyYXJ5SW50ZXJubEVycm9yX3JlYXNvbjsKLQkJCX0KLQkJCXJlYXNvbiArPSAiXG5cbiIgKyBBdXRob3JpbmdVSVJlc291cmNlcy5uZXdMaWJyYXJ5RXJyb3JfYWR2aWNlOyAvLyROT04tTkxTLTEkCi0JCQlpZiAoZS5nZXRNZXNzYWdlKCkgIT0gbnVsbCkgewotCQkJCUxpYnJhcnlVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkuZGlzcGxheUVycm9yKAotCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMubmV3TGlicmFyeVdpemFyZF90aXRsZSwKLQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLm5ld0xpYnJhcnlFcnJvcl9tc2csIHJlYXNvbik7Ci0JCQl9IGVsc2UgewotCQkJCUxpYnJhcnlVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkuZGlzcGxheUVycm9yKAotCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMubmV3TGlicmFyeVdpemFyZF90aXRsZSwKLQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLm5ld0xpYnJhcnlFcnJvcl9tc2csIHJlYXNvbiwgZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS93aXphcmRzL05ld1BsdWdpbk1haW5QYWdlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3dpemFyZHMvTmV3UGx1Z2luTWFpblBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjBhZmRmZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3dpemFyZHMvTmV3UGx1Z2luTWFpblBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLndpemFyZHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuTGlicmFyeVVJSW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLkxpYnJhcnlVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLkxpYnJhcnlVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuTW9kZWxTdG9yYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51aS53aXphcmRzLkJhc2VXaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2hlY2tib3hUYWJsZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlclNvcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLQotLyoqCi0gKiBBIHdpemFyZCBwYWdlIHRoYXQgcHJvbXB0cyB0aGUgdXNlciB0byBzcGVjaWZ5IHRoZSBuYW1lLCBicmllZiBkZXNjcmlwdGlvbiwKLSAqIGF1dGhvcnMgYW5kIHJlZmVyZW5jZWQgbWF0aG9kIHBsdWctaW5zIGZvciBhIG5ldyBtZXRob2QgcGx1Zy1pbi4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBOZXdQbHVnaW5NYWluUGFnZSBleHRlbmRzIEJhc2VXaXphcmRQYWdlIHsKLQotCS8qKgotCSAqIFRoZSB3aXphcmQgcGFnZSBuYW1lLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBR0VfTkFNRSA9IE5ld1BsdWdpbk1haW5QYWdlLmNsYXNzLmdldE5hbWUoKTsKLQkKLQlwcm90ZWN0ZWQgQ29tcG9zaXRlIGNvbXBvc2l0ZTsKLQotCXByb3RlY3RlZCBMYWJlbCBuYW1lVGV4dExhYmVsOwotCi0JcHJvdGVjdGVkIFRleHQgbmFtZVRleHQ7Ci0KLQlwcm90ZWN0ZWQgVGV4dCBicmllZkRlc2NUZXh0OwotCi0JcHJvdGVjdGVkIFRleHQgYXV0aG9yc1RleHQ7Ci0KLQlwcm90ZWN0ZWQgTGFiZWwgcmVmZXJlbmNlZFBsdWdpbnNMYWJlbDsKLQkKLQlwcm90ZWN0ZWQgQ2hlY2tib3hUYWJsZVZpZXdlciByZWZlcmVuY2VkUGx1Z2luc1ZpZXdlcjsKLQotCXByb3RlY3RlZCBMaXN0PE1ldGhvZFBsdWdpbj4gcGx1Z2luczsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIE5ld1BsdWdpbk1haW5QYWdlKFN0cmluZyBwYWdlTmFtZSkgewotCQlzdXBlcihwYWdlTmFtZSk7Ci0JCXNldFRpdGxlKEF1dGhvcmluZ1VJUmVzb3VyY2VzLm5ld1BsdWdpbldpemFyZFBhZ2VfdGl0bGUpOwotCQlzZXREZXNjcmlwdGlvbihBdXRob3JpbmdVSVJlc291cmNlcy5uZXdQbHVnaW5XaXphcmRQYWdlX3RleHQpOwotCQlzZXRJbWFnZURlc2NyaXB0b3IoQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcigKLQkJCQkiZnVsbC93aXpiYW4vTmV3LmdpZiIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIE5ld1BsdWdpbk1haW5QYWdlKCkgewotCQl0aGlzKFBBR0VfTkFNRSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dQYWdlI2NyZWF0ZUNvbnRyb2woQ29tcG9zaXRlKQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCQljb21wb3NpdGUgPSBjcmVhdGVHcmlkTGF5b3V0Q29tcG9zaXRlKHBhcmVudCwgMik7Ci0KLQkJY3JlYXRlTmFtZUZpZWxkKGNvbXBvc2l0ZSk7Ci0KLQkJY3JlYXRlQnJpZWZEZXNjRmllbGQoY29tcG9zaXRlKTsKLQotCQljcmVhdGVBdXRob3JzRmllbGQoY29tcG9zaXRlKTsKLQotCQljcmVhdGVSZWZlcmVuY2VkTW9kZWxzVmlld2VyKGNvbXBvc2l0ZSk7Ci0KLQkJaW5pdENvbnRyb2xzKCk7Ci0KLQkJYWRkTGlzdGVuZXJzKCk7Ci0KLQkJc2V0Q29udHJvbChjb21wb3NpdGUpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZVJlZmVyZW5jZWRNb2RlbHNWaWV3ZXIoQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotCQlyZWZlcmVuY2VkUGx1Z2luc0xhYmVsID0gY3JlYXRlVmVydGljYWxseUFsaWduZWRMYWJlbChjb21wb3NpdGUsCi0JCQkJQXV0aG9yaW5nVUlUZXh0LlJFRkVSRU5DRURfUExVR0lOU19TRUNUSU9OX05BTUUpOwotCi0JCXJlZmVyZW5jZWRQbHVnaW5zVmlld2VyID0gQ2hlY2tib3hUYWJsZVZpZXdlci5uZXdDaGVja0xpc3QoY29tcG9zaXRlLAotCQkJCVNXVC5CT1JERVIgfCBTV1QuRklMTCB8IFNXVC5IT1JJWk9OVEFMKTsKLQkJR3JpZERhdGEgcmVmZXJlbmNlZFBsdWdpbnNHcmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgKLQkJCQlHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlyZWZlcmVuY2VkUGx1Z2luc0dyaWREYXRhLmhlaWdodEhpbnQgPSAxNTA7Ci0JCXJlZmVyZW5jZWRQbHVnaW5zVmlld2VyLmdldFRhYmxlKCkuc2V0TGF5b3V0RGF0YSgKLQkJCQlyZWZlcmVuY2VkUGx1Z2luc0dyaWREYXRhKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdXRob3JzRmllbGQoQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotCQljcmVhdGVWZXJ0aWNhbGx5QWxpZ25lZExhYmVsKGNvbXBvc2l0ZSwgQXV0aG9yaW5nVUlUZXh0LkFVVEhPUlNfVEVYVCk7Ci0KLQkJYXV0aG9yc1RleHQgPSBjcmVhdGVFZGl0YWJsZVRleHQoY29tcG9zaXRlLCA0MDAsIDQwLCAxKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVCcmllZkRlc2NGaWVsZChDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JCWNyZWF0ZVZlcnRpY2FsbHlBbGlnbmVkTGFiZWwoY29tcG9zaXRlLAotCQkJCUF1dGhvcmluZ1VJVGV4dC5CUklFRl9ERVNDUklQVElPTl9URVhUKTsKLQotCQlicmllZkRlc2NUZXh0ID0gY3JlYXRlRWRpdGFibGVUZXh0KGNvbXBvc2l0ZSwgNDAwLCA4MCwgMSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlTmFtZUZpZWxkKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQkJbmFtZVRleHRMYWJlbCA9IGNyZWF0ZVZlcnRpY2FsbHlBbGlnbmVkTGFiZWwoY29tcG9zaXRlLCBBdXRob3JpbmdVSVRleHQuTkFNRV9URVhUKTsKLQotCQluYW1lVGV4dCA9IGNyZWF0ZUVkaXRhYmxlVGV4dChjb21wb3NpdGUpOwotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemVzIHRoZSB3aXphcmQgcGFnZSBjb250cm9scyB3aXRoIGRhdGEuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdENvbnRyb2xzKCkgewotCQlpbml0TmFtZUZpZWxkKCk7Ci0JCQotCQlpbml0UmVmZXJlbmNlZE1vZGVsc1ZpZXdlcigpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXROYW1lRmllbGQoKSB7Ci0JCVN0cmluZyBuYW1lID0gIm5ld19wbHVnLWluIjsgLy8kTk9OLU5MUy0xJAotCQlpZiAoTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpICE9IG51bGwpIHsKLQkJCW5hbWUgPSBUbmdVdGlsLmdldE5leHRBdmFpbGFibGVOYW1lKExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLQkJCQkJLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCkuZ2V0TWV0aG9kUGx1Z2lucygpLCBuYW1lKTsKLQkJfQotCQluYW1lVGV4dC5zZXRUZXh0KG5hbWUpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXRSZWZlcmVuY2VkTW9kZWxzVmlld2VyKCkgewotCQlJTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyID0gbmV3IExhYmVsUHJvdmlkZXIoKSB7Ci0JCQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCQlyZXR1cm4gTGlicmFyeVVJSW1hZ2VzLklNR19NRVRIT0RfUExVR0lOOwotCQkJfQotCi0JCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikgewotCQkJCQlyZXR1cm4gKChNZXRob2RQbHVnaW4pIGVsZW1lbnQpLmdldE5hbWUoKTsKLQkJCQl9IGVsc2UgewotCQkJCQlyZXR1cm4gZWxlbWVudC50b1N0cmluZygpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQotCQlyZWZlcmVuY2VkUGx1Z2luc1ZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKGxhYmVsUHJvdmlkZXIpOwotCQlyZWZlcmVuY2VkUGx1Z2luc1ZpZXdlci5zZXRTb3J0ZXIobmV3IFZpZXdlclNvcnRlcigpKTsKLQotCQlwbHVnaW5zID0gTW9kZWxTdG9yYWdlLmdldEJhc2VNb2RlbHMoKTsKLQkJU3RyaW5nW10gaXRlbXMgPSBuZXcgU3RyaW5nW3BsdWdpbnMuc2l6ZSgpXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwbHVnaW5zLnNpemUoKTsgaSsrKSB7Ci0JCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gKE1ldGhvZFBsdWdpbikgcGx1Z2lucy5nZXQoaSk7Ci0JCQlpdGVtc1tpXSA9IHBsdWdpbi5nZXROYW1lKCk7Ci0JCX0KLQotCQlpZiAocGx1Z2lucyAhPSBudWxsKSB7Ci0JCQlJdGVyYXRvcjxNZXRob2RQbHVnaW4+IGl0ID0gcGx1Z2lucy5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJCXJlZmVyZW5jZWRQbHVnaW5zVmlld2VyLmFkZChpdC5uZXh0KCkpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQWRkcyBldmVudCBsaXN0ZW5lcnMgdG8gdGhlIHdpemFyZCBwYWdlIGNvbnRyb2xzLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZExpc3RlbmVycygpIHsKLQkJYWRkTmFtZUZpZWxkTGlzdGVuZXJzKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkTmFtZUZpZWxkTGlzdGVuZXJzKCkgewotCQluYW1lVGV4dC5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJCQlzZXRQYWdlQ29tcGxldGUoaXNQYWdlQ29tcGxldGUoKSk7Ci0JCQkJZ2V0V2l6YXJkKCkuZ2V0Q29udGFpbmVyKCkudXBkYXRlQnV0dG9ucygpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51aS53aXphcmRzLkJhc2VXaXphcmRQYWdlI29uRW50ZXJQYWdlKE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBvbkVudGVyUGFnZShPYmplY3Qgb2JqKSB7Ci0JCWlmIChuYW1lVGV4dCAhPSBudWxsKSB7Ci0JCQluYW1lVGV4dC5zZXRGb2N1cygpOwotCQkJbmFtZVRleHQuc2VsZWN0QWxsKCk7Ci0JCX0KLQkJc2V0UGFnZUNvbXBsZXRlKGlzUGFnZUNvbXBsZXRlKCkpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2UjaXNQYWdlQ29tcGxldGUoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUGFnZUNvbXBsZXRlKCkgewotCQlzZXRFcnJvck1lc3NhZ2UobnVsbCk7Ci0JCWlmIChMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCkgPT0gbnVsbCkgewotCQkJc2V0RXJyb3JNZXNzYWdlKExpYnJhcnlVSVJlc291cmNlcy5ub09wZW5MaWJyYXJ5V2FybmluZ19tc2cpOwotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJcmV0dXJuIHZhbGlkYXRlUGx1Z2luTmFtZShnZXRQbHVnaW5OYW1lKCkpOwotCX0KLQotCS8qKgotCSAqIFZhbGlkYXRlcyBhIG1ldGhvZCBwbHVnLWluIG5hbWUuCi0JICogCi0JICogQHBhcmFtIG5hbWUKLQkgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIGEgbWV0aG9kIHBsdWctaW4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBwbHVnLWluIG5hbWUgaXMgdmFsaWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiB2YWxpZGF0ZVBsdWdpbk5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJU3RyaW5nIGVycm1zZyA9IExpYnJhcnlVdGlsLmNoZWNrUGx1Z2luTmFtZShudWxsLCBuYW1lKTsKLQkJaWYgKGVycm1zZyAhPSBudWxsKSB7Ci0JCQkvLyBSZW1vdmUgbmV3bGluZSBjaGFyYWN0ZXJzIGZyb20gdGhlIG1lc3NhZ2UgdG8gZml0IGl0IGluIHRoZSBlcnJvcgotCQkJLy8gbWVzc2FnZSBhcmVhIG9mIHRoZSB3aXphcmQgcGFnZS4KLQkJCWVycm1zZyA9IGVycm1zZy5yZXBsYWNlQWxsKCJcblxuIiwgIiAiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQkJc2V0RXJyb3JNZXNzYWdlKGVycm1zZyk7Ci0JCXJldHVybiBlcnJtc2cgPT0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSB1c2VyIHNwZWNpZmllZCBtZXRob2QgcGx1Zy1pbiBuYW1lLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG5hbWUgZm9yIHRoZSBuZXcgbWV0aG9kIHBsdWctaW4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFBsdWdpbk5hbWUoKSB7Ci0JCXJldHVybiBuYW1lVGV4dC5nZXRUZXh0KCkgIT0gbnVsbCA/IG5hbWVUZXh0LmdldFRleHQoKS50cmltKCkgOiBudWxsOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHVzZXIgc3BlY2lmaWVkIG1ldGhvZCBwbHVnLWluIGJyaWVmIGRlc2NyaXB0aW9uLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGJyaWVmIGRlc2NyaXB0aW9uIGZvciB0aGUgbmV3IG1ldGhvZCBwbHVnLWluCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRCcmllZkRlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gYnJpZWZEZXNjVGV4dC5nZXRUZXh0KCk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgdXNlciBzcGVjaWZpZWQgbWV0aG9kIHBsdWctaW4gYXV0aG9ycy4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBhdXRob3JzIGZvciB0aGUgbmV3IG1ldGhvZCBwbHVnLWluCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRBdXRob3JzKCkgewotCQlyZXR1cm4gYXV0aG9yc1RleHQuZ2V0VGV4dCgpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHVzZXIgc3BlY2lmaWVkIHJlZmVyZW5jZWQgbWV0aG9kIHBsdWctaW5zIGZvciB0aGUgbmV3IG1ldGhvZAotCSAqIHBsdWctaW4uCi0JICogCi0JICogQHJldHVybiBhIGNvbGxlY3Rpb24gb2YgcmVmZXJlbmNlZCBtZXRob2QgcGx1Zy1pbnMgZm9yIHRoZSBuZXcgbWV0aG9kCi0JICogICAgICAgICBwbHVnLWluCi0JICovCi0JcHVibGljIE9iamVjdFtdIGdldFJlZmVyZW5jZWRQbHVnaW5zKCkgewotCQlyZXR1cm4gcmVmZXJlbmNlZFBsdWdpbnNWaWV3ZXIuZ2V0Q2hlY2tlZEVsZW1lbnRzKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3dpemFyZHMvTmV3UGx1Z2luV2l6YXJkLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3dpemFyZHMvTmV3UGx1Z2luV2l6YXJkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2MzVjZjguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS93aXphcmRzL05ld1BsdWdpbldpemFyZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkud2l6YXJkczsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLkVkaXRvckNob29zZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS52aWV3cy5MaWJyYXJ5VmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5JTGlicmFyeU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2VVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLmFjdGlvbnMuTGlicmFyeUxvY2tpbmdPcGVyYXRpb25SdW5uZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVpLndpemFyZHMuQmFzZVdpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uSVJ1bm5hYmxlV2l0aFByb2dyZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklOZXdXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLQotLyoqCi0gKiBBIHdpemFyZCB0aGF0IGd1aWRlcyB0aGUgdXNlciB0byBjcmVhdGUgYSBuZXcgbWV0aG9kIFBsdWctaW4uCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTmV3UGx1Z2luV2l6YXJkIGV4dGVuZHMgQmFzZVdpemFyZCBpbXBsZW1lbnRzIElOZXdXaXphcmQgewotCi0JLyoqCi0JICogVGhlIHdpemFyZCBJRC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXSVpBUkRfSUQgPSBOZXdQbHVnaW5XaXphcmQuY2xhc3MuZ2V0TmFtZSgpOwotCi0JLyoqCi0JICogVGhlIE5ldyBNZXRob2QgUGx1Zy1pbiB3aXphcmQgZXh0ZW5zaW9uIHBvaW50IElELgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdJWkFSRF9FWFRFTlNJT05fUE9JTlRfSUQgPSAib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5uZXdQbHVnaW5XaXphcmQiOyAvLyROT04tTkxTLTEkCQotCi0JLy8gVGhlIG1haW4gd2l6YXJkIHBhZ2UuCi0JcHJvdGVjdGVkIE5ld1BsdWdpbk1haW5QYWdlIG1haW5QYWdlOwotCi0JLy8gVGhlIG5ldyBtZXRob2QgcGx1Zy1pbi4KLQlwcm90ZWN0ZWQgTWV0aG9kUGx1Z2luIG5ld1BsdWdpbjsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIE5ld1BsdWdpbldpemFyZCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51aS53aXphcmRzLkJhc2VXaXphcmQjZ2V0V2l6YXJkRXh0ZW5kZXJFeHRlbnNpb25Qb2ludElkKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFdpemFyZEV4dGVuZGVyRXh0ZW5zaW9uUG9pbnRJZCgpIHsKLQkJcmV0dXJuIFdJWkFSRF9FWFRFTlNJT05fUE9JTlRfSUQ7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2l6YXJkI2luaXQoSVdvcmtiZW5jaCwKLQkgKiAgICAgIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaCB3b3JrYmVuY2gsIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlzdXBlci5pbml0KHdvcmtiZW5jaCwgc2VsZWN0aW9uKTsKLQkJc2V0V2luZG93VGl0bGUoQXV0aG9yaW5nVUlSZXNvdXJjZXMubmV3UGx1Z2luV2l6YXJkX3RpdGxlKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmQjYWRkUGFnZXMoKQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFBhZ2VzKCkgewotCQlpZiAod2l6YXJkRXh0ZW5kZXIgPT0gbnVsbCkgewotCQkJbWFpblBhZ2UgPSBjcmVhdGVNYWluUGFnZSgpOwotCQkJc3VwZXIuYWRkUGFnZShtYWluUGFnZSk7Ci0JCX0gZWxzZSB7Ci0JCQlMaXN0PElXaXphcmRQYWdlPiB3aXphcmRQYWdlcyA9IG5ldyBBcnJheUxpc3Q8SVdpemFyZFBhZ2U+KCk7Ci0KLQkJCUlXaXphcmRQYWdlIHBhZ2UgPSB3aXphcmRFeHRlbmRlcgotCQkJCQkuZ2V0UmVwbGFjZVdpemFyZFBhZ2UoTmV3UGx1Z2luTWFpblBhZ2UuUEFHRV9OQU1FKTsKLQkJCWlmIChwYWdlICE9IG51bGwpIHsKLQkJCQl3aXphcmRQYWdlcy5hZGQocGFnZSk7Ci0JCQl9IGVsc2UgewotCQkJCW1haW5QYWdlID0gY3JlYXRlTWFpblBhZ2UoKTsKLQkJCQl3aXphcmRQYWdlcy5hZGQobWFpblBhZ2UpOwotCQkJfQotCi0JCQlzdXBlci5nZXROZXdXaXphcmRQYWdlcyh3aXphcmRQYWdlcyk7Ci0KLQkJCWZvciAoSXRlcmF0b3IgaXQgPSB3aXphcmRQYWdlcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJSVdpemFyZFBhZ2Ugd2l6YXJkUGFnZSA9IChJV2l6YXJkUGFnZSkgaXQubmV4dCgpOwotCQkJCXN1cGVyLmFkZFBhZ2Uod2l6YXJkUGFnZSk7Ci0JCQl9Ci0KLQkJCXdpemFyZEV4dGVuZGVyLmluaXRXaXphcmRQYWdlcyh3aXphcmRQYWdlcyk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBtYWluIHdpemFyZCBwYWdlLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG1haW4gd2l6YXJkIHBhZ2UKLQkgKi8KLQlwcm90ZWN0ZWQgTmV3UGx1Z2luTWFpblBhZ2UgY3JlYXRlTWFpblBhZ2UoKSB7Ci0JCXJldHVybiBuZXcgTmV3UGx1Z2luTWFpblBhZ2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmQjY3JlYXRlUGFnZUNvbnRyb2xzKENvbXBvc2l0ZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVQYWdlQ29udHJvbHMoQ29tcG9zaXRlIHBhZ2VDb250YWluZXIpIHsKLQkJc3VwZXIuY3JlYXRlUGFnZUNvbnRyb2xzKHBhZ2VDb250YWluZXIpOwotCQlwYWdlQ29udGFpbmVyLmdldFNoZWxsKCkuc2V0SW1hZ2UoCi0JCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFNoYXJlZEltYWdlKAotCQkJCQkJImZ1bGwvb2JqMTYvTWV0aG9kUGx1Z2luLmdpZiIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVpLndpemFyZHMuQmFzZVdpemFyZCNkb0ZpbmlzaCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gZG9GaW5pc2goKSB7Ci0JCXRyeSB7Ci0JCQluZXdQbHVnaW4gPSBMaWJyYXJ5U2VydmljZVV0aWwuY3JlYXRlTWV0aG9kUGx1Z2luKG1haW5QYWdlCi0JCQkJCS5nZXRQbHVnaW5OYW1lKCksIG1haW5QYWdlLmdldEJyaWVmRGVzY3JpcHRpb24oKSwgbWFpblBhZ2UKLQkJCQkJLmdldEF1dGhvcnMoKSwgbWFpblBhZ2UuZ2V0UmVmZXJlbmNlZFBsdWdpbnMoKSk7Ci0KLQkJCWluaXRNZXRob2RQbHVnaW4obmV3UGx1Z2luKTsKLQotCQkJcmV0dXJuIHRydWU7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlTdHJpbmcgcmVhc29uID0gZS5nZXRNZXNzYWdlKCkgIT0gbnVsbCA/IGUuZ2V0TWVzc2FnZSgpCi0JCQkJCTogQXV0aG9yaW5nVUlSZXNvdXJjZXMubmV3UGx1Z2luRXJyb3JfcmVhc29uOwotCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpLmRpc3BsYXlFcnJvcigKLQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMubmV3UGx1Z2luV2l6YXJkX3RpdGxlLAotCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5uZXdQbHVnaW5FcnJvcl9tc2csIHJlYXNvbiwgZSk7Ci0JCX0KLQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQWRkcyBhIG5ldyBtZXRob2QgcGx1Zy1pbiB0byB0aGUgY3VycmVudCBtZXRob2QgbGlicmFyeSwgdXBkYXRlcyB0aGUKLQkgKiBMaWJycmF5IHZpZXcgYW5kIG9wZW5zIHRoZSBtZXRob2QgcGx1Zy1pbiBlZGl0b3IuCi0JICogCi0JICogQHBhcmFtIHBsdWdpbgotCSAqICAgICAgICAgICAgYSBuZXdseSBjcmVhdGVkIG1ldGhvZCBwbHVnLWluCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgcGx1Zy1pbiBpcyBpbml0aWFsaXplZCBjb3JyZWN0bHkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpbml0TWV0aG9kUGx1Z2luKGZpbmFsIE1ldGhvZFBsdWdpbiBwbHVnaW4pIHsKLQkJdHJ5IHsKLQkJCUlMaWJyYXJ5TWFuYWdlciBtYW5hZ2VyID0gKElMaWJyYXJ5TWFuYWdlcikgTGlicmFyeVNlcnZpY2UKLQkJCQkJLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudExpYnJhcnlNYW5hZ2VyKCk7Ci0JCQlpZiAobWFuYWdlciAhPSBudWxsKSB7Ci0JCQkJbWFuYWdlci5hZGRNZXRob2RQbHVnaW4ocGx1Z2luKTsKLQkJCX0KLQotCQkJRGlzcGxheS5nZXRDdXJyZW50KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCS8vIFNlbGVjdCB0aGUgbmV3IG1ldGhvZCBwbHVnLWluIGluIHRoZSBMaWJyYXJ5IHZpZXcuCi0JCQkJCUxpc3Q8TWV0aG9kUGx1Z2luPiBzZWxlY3Rpb24gPSBuZXcgQXJyYXlMaXN0PE1ldGhvZFBsdWdpbj4oKTsKLQkJCQkJc2VsZWN0aW9uLmFkZChwbHVnaW4pOwotCQkJCQlMaWJyYXJ5Vmlldy5nZXRWaWV3KCkuc2V0U2VsZWN0aW9uVG9WaWV3ZXIoc2VsZWN0aW9uKTsKLQotCQkJCQkvLyBPcGVuIHRoZSBuZXcgbWV0aG9kIHBsdWctaW4gZWRpdG9yLgotCQkJCQlFZGl0b3JDaG9vc2VyLmdldEluc3RhbmNlKCkub3BlbkVkaXRvcihuZXdQbHVnaW4pOwotCQkJCX0KLQkJCX0pOwotCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcigKLQkJCQkJIkZhaWxlZCB0byBpbml0aWFsaXplIG1ldGhvZCBwbHVnLWluICciIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkrIHBsdWdpbi5nZXROYW1lKCkgKyAiJyIsIGUpOyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBib29sZWFuIHN1cGVyUGVyZm9ybUZpbmlzaCgpIHsKLQkJcmV0dXJuIHN1cGVyLnBlcmZvcm1GaW5pc2goKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtRmluaXNoKCkgewotCQlmaW5hbCBib29sZWFuW10gcmVzdWx0SG9sZGVyID0gbmV3IGJvb2xlYW5bMV07Ci0JCUxpYnJhcnlMb2NraW5nT3BlcmF0aW9uUnVubmVyIHJ1bm5lciA9IG5ldyBMaWJyYXJ5TG9ja2luZ09wZXJhdGlvblJ1bm5lcigpOwotCQlydW5uZXIucnVuKG5ldyBJUnVubmFibGVXaXRoUHJvZ3Jlc3MoKSB7Ci0KLQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCi0JCQkJCXRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCQkJcmVzdWx0SG9sZGVyWzBdID0gc3VwZXJQZXJmb3JtRmluaXNoKCk7Ci0JCQl9Ci0JCQkKLQkJfSk7Ci0JCXJldHVybiByZXN1bHRIb2xkZXJbMF07Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvd2l6YXJkcy9TYXZlQWxsRWRpdG9yc1BhZ2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvd2l6YXJkcy9TYXZlQWxsRWRpdG9yc1BhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGEyY2UzNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3dpemFyZHMvU2F2ZUFsbEVkaXRvcnNQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMTIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS53aXphcmRzOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuRWRpdG9yQ2hvb3NlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudWkud2l6YXJkcy5CYXNlV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklQYWdlQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuUGFnZUNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5BcnJheUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNoZWNrYm94VGFibGVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmREaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotCi0KLS8qKgotICogQSB3aXphcmQgcGFnZSB0aGF0IGxpc3RzIHRoZSBjdXJyZW50bHkgb3BlbiBlZGl0b3JzIGFuZCBwcm9tcHRzIHRoZSB1c2VyIHRvCi0gKiBzYXZlIHRoZW0gYmVmb3JlIHBlcmZvcm1pbmcgYW4gaW1wb3J0IG9yIGV4cG9ydCBvcGVyYXRpb24uCi0gKiAKLSAqIEBhdXRob3IgSmVmZiBIYXJkeQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBTYXZlQWxsRWRpdG9yc1BhZ2UgZXh0ZW5kcyBCYXNlV2l6YXJkUGFnZSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0FWRV9BTkRfQ0xPU0VfUEFHRV9USVRMRSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLkF1dGhvcmluZ1VJUGx1Z2luX1NhdmVBbGxFZGl0b3JzUGFnZV9zYXZlQW5kQ2xvc2VQYWdlVGl0bGU7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0FWRV9BTkRfQ0xPU0VfUEFHRV9ERVNDID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuQXV0aG9yaW5nVUlQbHVnaW5fU2F2ZUFsbEVkaXRvcnNQYWdlX3NhdmVBbmRDbG9zZVBhZ2VEZXNjcmlwdGlvbjsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTQVZFX1BBR0VfVElUTEUgPSBBdXRob3JpbmdVSVJlc291cmNlcy5BdXRob3JpbmdVSVBsdWdpbl9TYXZlQWxsRWRpdG9yc1BhZ2Vfc2F2ZVRpdGxlOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNBVkVfUEFHRV9ERVNDID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuQXV0aG9yaW5nVUlQbHVnaW5fU2F2ZUFsbEVkaXRvcnNQYWdlX3NhdmVEZXNjcmlwdGlvbjsKLQotCXByaXZhdGUgYm9vbGVhbiBkb0Nsb3NlOwotCi0JcHJpdmF0ZSBDaGVja2JveFRhYmxlVmlld2VyIGN0cmxfY2hrYm94VGFibGVWaWV3ZXI7Ci0KLQlwcml2YXRlIEJ1dHRvbiBzZWxlY3RBbGw7Ci0KLQlwcml2YXRlIEJ1dHRvbiBkZXNlbGVjdEFsbDsKLQotCS8qKgotCSAqIEFkZHMgdGhpcyB3aXphcmQgcGFnZSB0byBhIHdpemFyZCBvbmx5IHdoZW4gbmVjZXNzYXJ5LgotCSAqIFRoaXMgcGFnZSB3aWxsIGJlIGFkZGVkIGlmZiB0aGVyZSBhcmUgZGlydHkgbWV0aG9kIGVkaXRvcnMuCi0JICogaWYgZG9DbG9zZSBpcyB0cnVlIGFuZCB0aGVyZSBhcmUgbm8gZGlydHkgZWRpdG9ycywgdGhpcyBtZXRob2Qgd2lsbAotCSAqIGNsb3NlIGFsbCBtZXRob2QgZWRpdG9ycy4KLQkgKiAKLQkgKiBAcGFyYW0gd2l6YXJkCi0JICogICAgICAgICAgICBUaGUgd2l6YXJkIHRvIHdoaWNoIHRoaXMgcGFnZSBtaWdodCBiZSBhZGRlZC4KLQkgKiBAcGFyYW0gZG9DbG9zZQotCSAqICAgICAgICAgICAgSWYgPGNvZGU+dHJ1ZTwvY29kZT4sIHRoaXMgcGFnZSB3aWxsIGNsb3NlIGVkaXRvcnMgd2hlbgotCSAqICAgICAgICAgICAgbmV4dCBpcyBjbGlja2VkLiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBwYWdlIHdpbGwgYmUgYWRkZWQgdG8gdGhlIHdpemFyZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gYWRkUGFnZUlmTmVlZGVkKFdpemFyZCB3aXphcmQsIGJvb2xlYW4gZG9DbG9zZSkgewotCQlpZiAoaXNVbnNhdmVkRWRpdG9yKCkpIHsKLQkJCXdpemFyZC5hZGRQYWdlKG5ldyBTYXZlQWxsRWRpdG9yc1BhZ2UoZG9DbG9zZSkpOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0gZWxzZSB7Ci0JCQlwZXJmb3JtQ2xvc2UoZG9DbG9zZSk7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBZGRzIHRoaXMgd2l6YXJkIHBhZ2UgdG8gYSB3aXphcmQgb25seSB3aGVuIG5lY2Vzc2FyeS4KLQkgKiBUaGlzIHBhZ2Ugd2lsbCBiZSBhZGRlZCBpZmYgdGhlcmUgYXJlIGRpcnR5IG1ldGhvZCBlZGl0b3JzLgotCSAqIGlmIGRvQ2xvc2UgaXMgdHJ1ZSBhbmQgdGhlcmUgYXJlIG5vIGRpcnR5IGVkaXRvcnMsIHRoaXMgbWV0aG9kIHdpbGwKLQkgKiBjbG9zZSBhbGwgbWV0aG9kIGVkaXRvcnMuCi0JICogCi0JICogQHBhcmFtIHdpemFyZAotCSAqICAgICAgICAgICAgVGhlIHdpemFyZCB3aGljaCB0aGlzIHBhZ2UgbWlnaHQgYmUgYWRkZWQuCi0JICogQHBhcmFtIGRvQ2xvc2UKLQkgKiAgICAgICAgICAgIElmIDxjb2RlPnRydWU8L2NvZGU+LCB0aGlzIHBhZ2Ugd2lsbCBjbG9zZSBlZGl0b3JzIHdoZW4KLQkgKiAgICAgICAgICAgIG5leHQgaXMgY2xpY2tlZC4gCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgcGFnZSB3aWxsIGJlIGFkZGVkIHRvIHRoZSB3aXphcmQuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGFkZFBhZ2VJZk5lZWRlZChXaXphcmQgd2l6YXJkLCBib29sZWFuIGRvQ2xvc2UsCi0JCQlTdHJpbmcgdGl0bGUsIFN0cmluZyBkZXNjcmlwdGlvbiwgSW1hZ2VEZXNjcmlwdG9yIGltYWdlKSB7Ci0JCWlmIChpc1Vuc2F2ZWRFZGl0b3IoKSkgewotCQkJU2F2ZUFsbEVkaXRvcnNQYWdlIHBhZ2UgPSBuZXcgU2F2ZUFsbEVkaXRvcnNQYWdlKGRvQ2xvc2UpOwotCQkJaWYgKHRpdGxlICE9IG51bGwpIHsKLQkJCQlwYWdlLnNldFRpdGxlKHRpdGxlKTsKLQkJCX0KLQkJCWlmIChkZXNjcmlwdGlvbiAhPSBudWxsKSB7Ci0JCQkJcGFnZS5zZXREZXNjcmlwdGlvbihkZXNjcmlwdGlvbik7Ci0JCQl9Ci0JCQlpZiAoaW1hZ2UgIT0gbnVsbCkgewotCQkJCXBhZ2Uuc2V0SW1hZ2VEZXNjcmlwdG9yKGltYWdlKTsKLQkJCX0KLQkJCXdpemFyZC5hZGRQYWdlKHBhZ2UpOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0gZWxzZSB7Ci0JCQlwZXJmb3JtQ2xvc2UoZG9DbG9zZSk7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGludGFuY2UuCi0JICovCi0JcHVibGljIFNhdmVBbGxFZGl0b3JzUGFnZShib29sZWFuIGNsb3NlKSB7Ci0JCXN1cGVyKFNBVkVfUEFHRV9USVRMRSk7Ci0JCXRoaXMuZG9DbG9zZSA9IGNsb3NlOwotCQlpZiAoZG9DbG9zZSkgewotCQkJc2V0VGl0bGUoU0FWRV9BTkRfQ0xPU0VfUEFHRV9USVRMRSk7Ci0JCQlzZXREZXNjcmlwdGlvbihTQVZFX0FORF9DTE9TRV9QQUdFX0RFU0MpOwotCQl9IGVsc2UgewotCQkJc2V0VGl0bGUoU0FWRV9QQUdFX1RJVExFKTsKLQkJCXNldERlc2NyaXB0aW9uKFNBVkVfUEFHRV9ERVNDKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nUGFnZSNjcmVhdGVDb250cm9sKENvbXBvc2l0ZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGNvbnRhaW5lciA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCWNvbnRhaW5lci5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpKTsKLQotCQljdHJsX2Noa2JveFRhYmxlVmlld2VyID0gQ2hlY2tib3hUYWJsZVZpZXdlci5uZXdDaGVja0xpc3QoY29udGFpbmVyLAotCQkJCVNXVC5CT1JERVIgfCBTV1QuRklMTCB8IFNXVC5IT1JJWk9OVEFMKTsKLQkJY3RybF9jaGtib3hUYWJsZVZpZXdlci5nZXRUYWJsZSgpLnNldExheW91dERhdGEoCi0JCQkJbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSkpOwotCi0JCWN0cmxfY2hrYm94VGFibGVWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihuZXcgTGFiZWxQcm92aWRlcigpIHsKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgewotCQkJCUlFZGl0b3JSZWZlcmVuY2UgcmVmID0gKElFZGl0b3JSZWZlcmVuY2UpIGVsZW1lbnQ7Ci0JCQkJcmV0dXJuIHJlZi5nZXRFZGl0b3IoZmFsc2UpLmdldFRpdGxlKCk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBJbWFnZSBnZXRJbWFnZShPYmplY3QgZWxlbWVudCkgewotCQkJCUlFZGl0b3JSZWZlcmVuY2UgcmVmID0gKElFZGl0b3JSZWZlcmVuY2UpIGVsZW1lbnQ7Ci0JCQkJcmV0dXJuIHJlZi5nZXRFZGl0b3IoZmFsc2UpLmdldFRpdGxlSW1hZ2UoKTsKLQkJCX0KLQkJfSk7Ci0JCWN0cmxfY2hrYm94VGFibGVWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBBcnJheUNvbnRlbnRQcm92aWRlcigpKTsKLQkJY3RybF9jaGtib3hUYWJsZVZpZXdlci5zZXRJbnB1dChFZGl0b3JDaG9vc2VyLmdldEluc3RhbmNlKCkuZ2V0T3Blbk1ldGhvZEVkaXRvcnMoKS50b0FycmF5KCkpOwotCQljdHJsX2Noa2JveFRhYmxlVmlld2VyLmFkZEZpbHRlcihuZXcgVmlld2VyRmlsdGVyKCkgewotCQkJcHVibGljIGJvb2xlYW4gc2VsZWN0KFZpZXdlciB2aWV3ZXIsIE9iamVjdCBwYXJlbnRFbGVtZW50LCBPYmplY3QgZWxlbWVudCkgewotCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSUVkaXRvclJlZmVyZW5jZSkgewotCQkJCQlpZiAoKChJRWRpdG9yUmVmZXJlbmNlKWVsZW1lbnQpLmlzRGlydHkoKSkKLQkJCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0pOwotCQljdHJsX2Noa2JveFRhYmxlVmlld2VyLnNldEFsbENoZWNrZWQodHJ1ZSk7Ci0KLQkJQ29tcG9zaXRlIGJ1dHRvbkNvbnRhaW5lciA9IG5ldyBDb21wb3NpdGUoY29udGFpbmVyLCBTV1QuTk9ORSk7Ci0JCWJ1dHRvbkNvbnRhaW5lci5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMSwgdHJ1ZSkpOwotCQlidXR0b25Db250YWluZXIuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkRFRkFVTFQsIFNXVC5CRUdJTk5JTkcsCi0JCQkJZmFsc2UsIHRydWUpKTsKLQotCQlzZWxlY3RBbGwgPSBuZXcgQnV0dG9uKGJ1dHRvbkNvbnRhaW5lciwgU1dULlBVU0gpOwotCQlzZWxlY3RBbGwKLQkJCQkuc2V0VGV4dChBdXRob3JpbmdVSVJlc291cmNlcy5BdXRob3JpbmdVSVBsdWdpbl9TYXZlQWxsRWRpdG9yc1BhZ2VfU2VsZWN0QWxsQnV0dG9uTGFiZWwpOwotCQlzZWxlY3RBbGwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5CRUdJTk5JTkcsIGZhbHNlLAotCQkJCXRydWUpKTsKLQotCQlkZXNlbGVjdEFsbCA9IG5ldyBCdXR0b24oYnV0dG9uQ29udGFpbmVyLCBTV1QuUFVTSCk7Ci0JCWRlc2VsZWN0QWxsCi0JCQkJLnNldFRleHQoQXV0aG9yaW5nVUlSZXNvdXJjZXMuQXV0aG9yaW5nVUlQbHVnaW5fU2F2ZUFsbEVkaXRvcnNQYWdlX0Rlc2VsZWN0QWxsQnV0dG9uTGFiZWwpOwotCQlkZXNlbGVjdEFsbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkJFR0lOTklORywgZmFsc2UsCi0JCQkJdHJ1ZSkpOwotCi0JCWFkZExpc3RlbmVycygpOwotCi0JCXNldENvbnRyb2woY29udGFpbmVyKTsKLQkJc2V0UGFnZUNvbXBsZXRlKHRydWUpOwotCX0KLQotCXByaXZhdGUgdm9pZCByZWZyZXNoICgpIHsKLQkJaWYgKGN0cmxfY2hrYm94VGFibGVWaWV3ZXIgIT0gbnVsbCkgewotCQkJY3RybF9jaGtib3hUYWJsZVZpZXdlci5yZWZyZXNoKCk7Ci0JCQlpZiAoY3RybF9jaGtib3hUYWJsZVZpZXdlci5nZXRUYWJsZSgpICE9IG51bGwpIHsKLQkJCQlpZiAoY3RybF9jaGtib3hUYWJsZVZpZXdlci5nZXRUYWJsZSgpLmdldEl0ZW1zKCkgIT0gbnVsbCkgewotCQkJCQlpZiAoY3RybF9jaGtib3hUYWJsZVZpZXdlci5nZXRUYWJsZSgpLmdldEl0ZW1zKCkubGVuZ3RoID09IDApIHsKLQkJCQkJCWlmIChjdHJsX2Noa2JveFRhYmxlVmlld2VyLmdldENvbnRyb2woKSAhPSBudWxsKQotCQkJCQkJCWN0cmxfY2hrYm94VGFibGVWaWV3ZXIuZ2V0Q29udHJvbCgpLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCQkJc2VsZWN0QWxsLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCQkJZGVzZWxlY3RBbGwuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGFkZExpc3RlbmVycygpIHsKLQkJaWYgKGdldFdpemFyZCgpICE9IG51bGwpIHsKLQkJCUlXaXphcmRDb250YWluZXIgY29udGFpbmVyID0gZ2V0V2l6YXJkKCkuZ2V0Q29udGFpbmVyKCk7Ci0JCQlpZiAoY29udGFpbmVyIGluc3RhbmNlb2YgV2l6YXJkRGlhbG9nKSB7Ci0JCQkJKChXaXphcmREaWFsb2cpY29udGFpbmVyKS5hZGRQYWdlQ2hhbmdlZExpc3RlbmVyKG5ldyBJUGFnZUNoYW5nZWRMaXN0ZW5lcigpIHsKLQkJCQkJcHVibGljIHZvaWQgcGFnZUNoYW5nZWQoUGFnZUNoYW5nZWRFdmVudCBldmVudCkgewotCQkJCQkJcmVmcmVzaCgpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQl9Ci0JCX0KLQkJc2VsZWN0QWxsLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQljdHJsX2Noa2JveFRhYmxlVmlld2VyLnNldEFsbENoZWNrZWQodHJ1ZSk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJd2lkZ2V0U2VsZWN0ZWQoZSk7Ci0JCQl9Ci0KLQkJfSk7Ci0KLQkJZGVzZWxlY3RBbGwuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWN0cmxfY2hrYm94VGFibGVWaWV3ZXIuc2V0QWxsQ2hlY2tlZChmYWxzZSk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJd2lkZ2V0U2VsZWN0ZWQoZSk7Ci0JCQl9Ci0KLQkJfSk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGNhbkZsaXBUb05leHRQYWdlKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBQZXJmb3JtIG91ciBzYXZlIChhbmQgcG9zc2libHkgY2xvc2UpIG9wZXJhdGlvbgotCSAqLwotCXB1YmxpYyBJV2l6YXJkUGFnZSBnZXROZXh0UGFnZSgpIHsKLQkJcGVyZm9ybVNhdmVBbmRDbG9zZSgpOwotCQlyZXR1cm4gc3VwZXIuZ2V0TmV4dFBhZ2UoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybVNhdmVBbmRDbG9zZSgpIHsKLQkJT2JqZWN0W10gY2hlY2tlZEFycmF5ID0gY3RybF9jaGtib3hUYWJsZVZpZXdlci5nZXRDaGVja2VkRWxlbWVudHMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGVja2VkQXJyYXkubGVuZ3RoOyBpKyspIHsKLQkJCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkKLQkJCQkJLmdldEFjdGl2ZVBhZ2UoKS5zYXZlRWRpdG9yKAotCQkJCQkJCSgoSUVkaXRvclJlZmVyZW5jZSkgY2hlY2tlZEFycmF5W2ldKQotCQkJCQkJCQkJLmdldEVkaXRvcihmYWxzZSksIGZhbHNlKTsKLQkJfQotCQlwZXJmb3JtQ2xvc2UoZG9DbG9zZSk7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgdm9pZCBwZXJmb3JtQ2xvc2UoYm9vbGVhbiBkb0Nsb3NlKSB7Ci0JCWlmIChkb0Nsb3NlKSB7Ci0JCQlFZGl0b3JDaG9vc2VyLmdldEluc3RhbmNlKCkuY2xvc2VBbGxNZXRob2RFZGl0b3JzKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDaGVja2VkIHdoZXRoZXIgdGhlcmUgaXMgYW55IHVuc2F2ZWQgZWRpdG9yIG9wZW4KLQkgKiAKLQkgKiBAcGFyYW0gZG9DbG9zZQotCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGVyZSBpcyBhbiB1bnNhdmVkIGVkaXRvciBvcGVuCi0JICogCXRydWUgaWYgZG9DbG9zZSBpcyB0cnVlIGFuZCB0aGVyZSBpcyBhbiBvcGVuIGVkaXRvcgotCSAqICBmYWxzZSBvdGhlcndpc2UKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzVW5zYXZlZEVkaXRvcigpIHsKLQkJYm9vbGVhbiBhbkVkaXRvcklzRGlydHkgPSBmYWxzZTsKLQkJTGlzdDxJRWRpdG9yUmVmZXJlbmNlPiBtZXRob2RFZGl0b3JzID0gRWRpdG9yQ2hvb3Nlci5nZXRJbnN0YW5jZSgpLmdldE9wZW5NZXRob2RFZGl0b3JzKCk7Ci0JCWZvciAoSXRlcmF0b3I8SUVkaXRvclJlZmVyZW5jZT4gaXRlcmF0b3IgPSBtZXRob2RFZGl0b3JzLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCUlFZGl0b3JSZWZlcmVuY2UgZWRpdG9yID0gaXRlcmF0b3IubmV4dCgpOwotCQkJaWYgKGVkaXRvci5pc0RpcnR5KCkpIHsKLQkJCQlhbkVkaXRvcklzRGlydHkgPSB0cnVlOwotCQkJCWJyZWFrOwotCQkJfQotCQkJCi0JCX0KLQkJcmV0dXJuIGFuRWRpdG9ySXNEaXJ0eTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc09wZW5FZGl0b3IoYm9vbGVhbiBkb0Nsb3NlKSB7Ci0JCUxpc3Q8SUVkaXRvclJlZmVyZW5jZT4gbWV0aG9kRWRpdG9ycyA9IEVkaXRvckNob29zZXIuZ2V0SW5zdGFuY2UoKS5nZXRPcGVuTWV0aG9kRWRpdG9ycygpOwotCQlyZXR1cm4gZG9DbG9zZSAmJiBtZXRob2RFZGl0b3JzLnNpemUoKSA+IDA7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2UjaXNQYWdlQ29tcGxldGUoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUGFnZUNvbXBsZXRlKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3dpemFyZHMvU3luY2hyb25pemF0aW9uQ2hvaWNlcy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS93aXphcmRzL1N5bmNocm9uaXphdGlvbkNob2ljZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjZiNjM3My4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3dpemFyZHMvU3luY2hyb25pemF0aW9uQ2hvaWNlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkud2l6YXJkczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M7Ci0KLS8qKgotICogSXQgc3RvcmVzIGFuZCBtYW5hZ2VzIGFsbCBjaG9pY2VzIGZvciBzeW5jaHJvbml6YXRpb24KLSAqIAotICogQGF1dGhvciBCaW5nWHVlIFh1Ci0gKiBAc2luY2UgMS4wCi0gKgotICovCi1wdWJsaWMgY2xhc3MgU3luY2hyb25pemF0aW9uQ2hvaWNlcyB7Ci0KLQlwdWJsaWMgc3RhdGljIGludCBTWU5DX05PTkUgPSAwOwotCXB1YmxpYyBzdGF0aWMgaW50IFNZTkNfRlJPTV9DT05URU5UID0gMTsKLQlwdWJsaWMgc3RhdGljIGludCBTWU5DX0ZST01fUFJPQ0VTUyA9IDI7Ci0JCi0JcHJpdmF0ZSBQcm9jZXNzIHNlbGVjdGVkUHJvY2VzczsKLQlwcml2YXRlIE1ldGhvZENvbmZpZ3VyYXRpb24gc2VsZWN0ZWRDb25maWc7Ci0JcHJpdmF0ZSBpbnQgc3luY05hbWU9IFNZTkNfRlJPTV9DT05URU5UOwotCXByaXZhdGUgaW50IHN5bmNQcmVzTmFtZT0gU1lOQ19GUk9NX0NPTlRFTlQ7Ci0JcHJpdmF0ZSBpbnQgc3luY0JyaWVmRGVzYz0gU1lOQ19GUk9NX0NPTlRFTlQ7Ci0JcHJpdmF0ZSBpbnQgc3luY09wdElucHV0PSBTWU5DX0ZST01fQ09OVEVOVDsKLQlwcml2YXRlIGludCBzeW5jTWFuSW5wdXQ9IFNZTkNfRlJPTV9DT05URU5UOwotCXByaXZhdGUgaW50IHN5bmNPdXRwdXQ9IFNZTkNfRlJPTV9DT05URU5UOwotCXByaXZhdGUgaW50IHN5bmNQcmltUGVyZm9ybWVyPSBTWU5DX0ZST01fQ09OVEVOVDsKLQlwcml2YXRlIGludCBzeW5jQWRkblBlcmZvcm1lcj0gU1lOQ19GUk9NX0NPTlRFTlQ7Ci0JcHJpdmF0ZSBpbnQgc3luY1Jlc3BSb2xlPSBTWU5DX0ZST01fQ09OVEVOVDsKLQlwcml2YXRlIGludCBzeW5jQ29udEFydGlmYWN0PSBTWU5DX0ZST01fQ09OVEVOVDsKLQlwcml2YXRlIGludCBzeW5jRGVsaXZQYXJ0PSBTWU5DX0ZST01fQ09OVEVOVDsKLQlwcml2YXRlIGludCBzeW5jU2VsU3RlcD0gU1lOQ19GUk9NX0NPTlRFTlQ7Ci0JcHJpdmF0ZSBpbnQgc3luY0d1aWRhbmNlID0gU1lOQ19GUk9NX0NPTlRFTlQ7Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNGaW5pc2hQcmVzc2VkOwotCi0JLyoqCi0JICogR2V0IHNlbGVjdGVkIHByb2Nlc3MKLQkgKi8KLQlwdWJsaWMgUHJvY2VzcyBnZXRTZWxlY3RlZFByb2Nlc3MoKSB7Ci0JCXJldHVybiBzZWxlY3RlZFByb2Nlc3M7Ci0JfQotCi0JLyoqCi0JICogU2V0IHNlbGVjdGVkIHByb2Nlc3MKLQkgKiBAcGFyYW0gc2VsZWN0ZWRQcm9jZXNzCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2VsZWN0ZWRQcm9jZXNzKFByb2Nlc3Mgc2VsZWN0ZWRQcm9jZXNzKSB7Ci0JCXRoaXMuc2VsZWN0ZWRQcm9jZXNzID0gc2VsZWN0ZWRQcm9jZXNzOwotCX0KLQotCS8qKgotCSAqIEdldCBzZWxlY3RlZCBtZXRob2QgY29uZmlndXJhdGlvbgotCSAqLwotCXB1YmxpYyBNZXRob2RDb25maWd1cmF0aW9uIGdldFNlbGVjdGVkQ29uZmlnKCkgewotCQlyZXR1cm4gc2VsZWN0ZWRDb25maWc7Ci0JfQotCi0JLyoqCi0JICogU2V0IHNlbGVjdGVkIG1ldGhvZCBjb25maWd1cmF0aW9uCi0JICogQHBhcmFtIHNlbGVjdGVkQ29uZmlnCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2VsZWN0ZWRDb25maWcoTWV0aG9kQ29uZmlndXJhdGlvbiBzZWxlY3RlZENvbmZpZykgewotCQl0aGlzLnNlbGVjdGVkQ29uZmlnID0gc2VsZWN0ZWRDb25maWc7Ci0JfQotCi0JLyoqCi0JICogR2V0IG9wdGlvbiBvZiBzeW5jaHJvbml6aW5nIGNvbnRhaW5lZCBhcnRpZmFjdHMKLQkgKi8KLQlwdWJsaWMgaW50IGdldFN5bmNDb250QXJ0aWZhY3QoKSB7Ci0JCXJldHVybiBzeW5jQ29udEFydGlmYWN0OwotCX0KLQotCS8qKgotCSAqIFNldCBvcHRpb24gZm9yIHN5bmNocm9uaXppbmcgY29udGFpbmVkIGFydGlmYWN0cwotCSAqLwotCXB1YmxpYyB2b2lkIHNldFN5bmNDb250QXJ0aWZhY3QoaW50IHN5bmNDb250QXJ0aWZhY3QpIHsKLQkJdGhpcy5zeW5jQ29udEFydGlmYWN0ID0gc3luY0NvbnRBcnRpZmFjdDsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgb3B0aW9uIG9mIHN5bmNocm9uaXppbmcgZGVsaXZlcmFibGUgcGFydHMKLQkgKi8KLQlwdWJsaWMgaW50IGdldFN5bmNEZWxpdlBhcnQoKSB7Ci0JCXJldHVybiBzeW5jRGVsaXZQYXJ0OwotCX0KLQotCS8qKgotCSAqIFNldCBvcHRpb24gZm9yIHN5bmNocm9uaXppbmcgZGVsaXZlcmFibGUgcGFydHMKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTeW5jRGVsaXZQYXJ0KGludCBzeW5jRGVsaXZQYXJ0KSB7Ci0JCXRoaXMuc3luY0RlbGl2UGFydCA9IHN5bmNEZWxpdlBhcnQ7Ci0JfQotCi0JLyoqCi0JICogR2V0IG9wdGlvbiBvZiBzeW5jaHJvbml6aW5nIG1hbmRhdG9yeSBpbnB1dAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0U3luY01hbklucHV0KCkgewotCQlyZXR1cm4gc3luY01hbklucHV0OwotCX0KLQotCS8qKgotCSAqIFNldCBvcHRpb24gZm9yIHN5bmNocm9uaXppbmcgbWFuZGF0b3J5IGlucHV0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0U3luY01hbklucHV0KGludCBzeW5jTWFuSW5wdXQpIHsKLQkJdGhpcy5zeW5jTWFuSW5wdXQgPSBzeW5jTWFuSW5wdXQ7Ci0JfQotCi0JLyoqCi0JICogR2V0IG9wdGlvbiBvZiBzeW5jaHJvbml6aW5nIG9wdGlvbmFsIGlucHV0Ci0JICovCi0JcHVibGljIGludCBnZXRTeW5jT3B0SW5wdXQoKSB7Ci0JCXJldHVybiBzeW5jT3B0SW5wdXQ7Ci0JfQotCi0JLyoqCi0JICogU2V0IG9wdGlvbiBmb3Igc3luY2hyb25pemluZyBvcHRpb25hbCBpbnB1dAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFN5bmNPcHRJbnB1dChpbnQgc3luY09wdElucHV0KSB7Ci0JCXRoaXMuc3luY09wdElucHV0ID0gc3luY09wdElucHV0OwotCX0KLQotCS8qKgotCSAqIEdldCBvcHRpb24gb2Ygc3luY2hyb25pemluZyBvdXRwdXQKLQkgKi8KLQlwdWJsaWMgaW50IGdldFN5bmNPdXRwdXQoKSB7Ci0JCXJldHVybiBzeW5jT3V0cHV0OwotCX0KLQotCS8qKgotCSAqIFNldCBvcHRpb24gZm9yIHN5bmNocm9uaXppbmcgb3V0cHV0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0U3luY091dHB1dChpbnQgc3luY091dHB1dCkgewotCQl0aGlzLnN5bmNPdXRwdXQgPSBzeW5jT3V0cHV0OwotCX0KLQotCS8qKgotCSAqIEdldCBvcHRpb24gb2Ygc3luY2hyb25pemluZyBwcmVzZW50YXRpb24gbmFtZQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0U3luY1ByZXNOYW1lKCkgewotCQlyZXR1cm4gc3luY1ByZXNOYW1lOwotCX0KLQotCS8qKgotCSAqIFNldCBvcHRpb24gZm9yIHN5bmNocm9uaXppbmcgcHJlc2V0bmF0aW9uIG5hbWUKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTeW5jUHJlc05hbWUoaW50IHN5bmNQcmVzTmFtZSkgewotCQl0aGlzLnN5bmNQcmVzTmFtZSA9IHN5bmNQcmVzTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgb3B0aW9uIG9mIHN5bmNocm9uaXppbmcgcmVzcG9uc2libGUgcm9sZQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0U3luY1Jlc3BSb2xlKCkgewotCQlyZXR1cm4gc3luY1Jlc3BSb2xlOwotCX0KLQotCS8qKgotCSAqIFNldCBvcHRpb24gZm9yIHN5bmNocm9uaXppbmcgcmVzcG9uc2libGUgcm9sZQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFN5bmNSZXNwUm9sZShpbnQgc3luY1Jlc3BSb2xlKSB7Ci0JCXRoaXMuc3luY1Jlc3BSb2xlID0gc3luY1Jlc3BSb2xlOwotCX0KLQotCS8qKgotCSAqIEdldCBvcHRpb24gb2Ygc3luY2hyb25pemluZyBzdGVwcwotCSAqLwotCXB1YmxpYyBpbnQgZ2V0U3luY1NlbFN0ZXAoKSB7Ci0JCXJldHVybiBzeW5jU2VsU3RlcDsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgb3B0aW9uIGZvciBzeW5jaHJvbml6aW5nIHN0ZXBzCi0JICovCi0JcHVibGljIHZvaWQgc2V0U3luY1NlbFN0ZXAoaW50IHN5bmNTZWxTdGVwKSB7Ci0JCXRoaXMuc3luY1NlbFN0ZXAgPSBzeW5jU2VsU3RlcDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGJvb2xlYW4gdmFsdWUgYmFzZWQgb24gd2l6YXJkIGlzIGNvbXBsZXRlZCBvciBub3QKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0ZpbmlzaFByZXNzZWQoKSB7Ci0JCXJldHVybiBpc0ZpbmlzaFByZXNzZWQ7Ci0JfQotCi0JLyoqCi0JICogU2V0IG9wdGlvbiBiYXNlZCBvbiB3aXphcmQgaW4gY29tcGxldGVkIG9yIG5vdAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZpbmlzaFByZXNzZWQoYm9vbGVhbiBpc0ZpbmlzaFByZXNzZWQpIHsKLQkJdGhpcy5pc0ZpbmlzaFByZXNzZWQgPSBpc0ZpbmlzaFByZXNzZWQ7Ci0JfQotCi0JLyoqCi0JICogR2V0IG9wdGlvbiBvZiBzeW5jaHJvbml6aW5nIGFkZGl0aW9uYWwgcGVyZm9ybWVyCi0JICovCi0JcHVibGljIGludCBnZXRTeW5jQWRkblBlcmZvcm1lcigpIHsKLQkJcmV0dXJuIHN5bmNBZGRuUGVyZm9ybWVyOwotCX0KLQotCS8qKgotCSAqIFNldCBvcHRpb24gZm9yIHN5bmNocm9uaXppbmcgYWRkaXRpb25hbCBwZXJmb3JtZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTeW5jQWRkblBlcmZvcm1lcihpbnQgc3luY0FkZG5QZXJmb3JtZXIpIHsKLQkJdGhpcy5zeW5jQWRkblBlcmZvcm1lciA9IHN5bmNBZGRuUGVyZm9ybWVyOwotCX0KLQotCS8qKgotCSAqIEdldCBvcHRpb24gb2Ygc3luY2hyb25pemluZyBwcmltYXJ5IHBlcmZvcm1lcgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0U3luY1ByaW1QZXJmb3JtZXIoKSB7Ci0JCXJldHVybiBzeW5jUHJpbVBlcmZvcm1lcjsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgb3B0aW9uIGZvciBzeW5jaHJvbml6aW5nIHByaW1hcnkgcGVyZm9ybWVyCi0JICovCi0JcHVibGljIHZvaWQgc2V0U3luY1ByaW1QZXJmb3JtZXIoaW50IHN5bmNQcmltUGVyZm9ybWVyKSB7Ci0JCXRoaXMuc3luY1ByaW1QZXJmb3JtZXIgPSBzeW5jUHJpbVBlcmZvcm1lcjsKLQl9Ci0KLQkvKioKLQkgKiBEaXNwbGF5cyBhbGwgc3luY2hyb25pemF0aW9uIG9wdGlvbnMvY2hvaWNlcwotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQotCQlTdHJpbmdCdWZmZXIgc2J1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJc2J1Zi5hcHBlbmQoIltQcm9jZXNzOiIgKyAoKHNlbGVjdGVkUHJvY2VzcyAhPSBudWxsKT9zZWxlY3RlZFByb2Nlc3MuZ2V0TmFtZSgpOiJudWxsIikgKyAiOyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQlzYnVmLmFwcGVuZCgiQ29uZmlndXJhdGlvbjoiICsgKChzZWxlY3RlZENvbmZpZyAhPSBudWxsKT9zZWxlY3RlZENvbmZpZy5nZXROYW1lKCk6Im51bGwiKSArICI7Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCXNidWYuYXBwZW5kKCJOYW1lOiIgKyBzeW5jTmFtZSArICI7Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlzYnVmLmFwcGVuZCgiUHJlc05hbWU6IiArIHN5bmNQcmVzTmFtZSArICI7Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlzYnVmLmFwcGVuZCgiQnJlaWZEZXNjOiIgKyBzeW5jQnJpZWZEZXNjICsgIjsiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCXNidWYuYXBwZW5kKCJPcHRJbnB1dDoiICsgc3luY09wdElucHV0ICsgIjsiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCXNidWYuYXBwZW5kKCJNYW5JbnB1dDoiICsgc3luY01hbklucHV0ICsgIjsiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCXNidWYuYXBwZW5kKCJPdXRwdXQ6IiArIHN5bmNPdXRwdXQgKyAiOyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJc2J1Zi5hcHBlbmQoIlByaW1QZXJmb3JtZXI6IiArIHN5bmNQcmltUGVyZm9ybWVyICsgIjsiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCXNidWYuYXBwZW5kKCJBZGRuUGVyZm9ybWVyczoiICsgc3luY0FkZG5QZXJmb3JtZXIgKyAiOyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJc2J1Zi5hcHBlbmQoIlJlc3BSb2xlOiIgKyBzeW5jUmVzcFJvbGUgKyAiOyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJc2J1Zi5hcHBlbmQoIkNvbnRBcnRpZmFjdDoiICsgc3luY0NvbnRBcnRpZmFjdCArICI7Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlzYnVmLmFwcGVuZCgiRGVsaXZQYXJ0OiIgKyBzeW5jRGVsaXZQYXJ0ICsgIjsiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCXNidWYuYXBwZW5kKCJTZWxTdGVwOiIgKyBzeW5jU2VsU3RlcCArICJdIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JCXJldHVybiBzYnVmLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogR2V0IG9wdGlvbiBvZiBzeW5jaHJvbml6aW5nIGJyaWVmIGRlc2NyaXB0aW9uCi0JICovCi0JcHVibGljIGludCBnZXRTeW5jQnJpZWZEZXNjKCkgewotCQlyZXR1cm4gc3luY0JyaWVmRGVzYzsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgb3B0aW9uIGZvciBzeW5jaHJvbml6aW5nIGJyaWVmIGRlc2NyaXB0aW9uCi0JICovCi0JcHVibGljIHZvaWQgc2V0U3luY0JyaWVmRGVzYyhpbnQgc3luY0JyaWVmRGVzYykgewotCQl0aGlzLnN5bmNCcmllZkRlc2MgPSBzeW5jQnJpZWZEZXNjOwotCX0KLQotCS8qKgotCSAqIEdldCBvcHRpb24gb2Ygc3luY2hyb25pemluZyBuYW1lCi0JICovCi0JcHVibGljIGludCBnZXRTeW5jTmFtZSgpIHsKLQkJcmV0dXJuIHN5bmNOYW1lOwotCX0KLQotCS8qKgotCSAqIFNldCBvcHRpb24gZm9yIHN5bmNocm9uaXppbmcgbmFtZQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFN5bmNOYW1lKGludCBzeW5jTmFtZSkgewotCQl0aGlzLnN5bmNOYW1lID0gc3luY05hbWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U3luY0d1aWRhbmNlKGludCBpKSB7Ci0JCXRoaXMuc3luY0d1aWRhbmNlID0gaTsKLQl9Ci0JCi0JcHVibGljIGludCBnZXRTeW5jR3VpZGFuY2UoKSB7Ci0JCXJldHVybiBzeW5jR3VpZGFuY2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS93aXphcmRzL1N5bmNocm9uaXphdGlvbkRlc2NyaXB0aW9uUGFnZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS93aXphcmRzL1N5bmNocm9uaXphdGlvbkRlc2NyaXB0aW9uUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YjIwNWI0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvd2l6YXJkcy9TeW5jaHJvbml6YXRpb25EZXNjcmlwdGlvblBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkud2l6YXJkczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVpLndpemFyZHMuQmFzZVdpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci0KLS8qKgotICogVGhlIHdpemFyZCBwYWdlIHdoaWNoIGRlc2NyaWJlcyBjdXN0b20gc3luY2hyb25pemF0aW9uLgotICogCi0gKiBAYXV0aG9yIEJpbmdYdWUgWHUKLSAqIEBzaW5jZSAxLjAKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBTeW5jaHJvbml6YXRpb25EZXNjcmlwdGlvblBhZ2UgZXh0ZW5kcyBCYXNlV2l6YXJkUGFnZSB7Ci0KLQlwcml2YXRlIFN5bmNocm9uaXphdGlvbkNob2ljZXMgc3luY0Nob2ljZXMgPSBudWxsOwotCQotCXByaXZhdGUgVGV4dCBjdHJsX2V4cGxhaW5UZXh0OwotCQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFN5bmNocm9uaXphdGlvbkRlc2NyaXB0aW9uUGFnZShTdHJpbmcgcGFnZU5hbWUsCi0JCQlTeW5jaHJvbml6YXRpb25DaG9pY2VzIGNob2ljZXMpIHsKLQkJc3VwZXIocGFnZU5hbWUpOwotCQlzZXRUaXRsZShBdXRob3JpbmdVSVJlc291cmNlcy5zeW5jaHJvbml6YXRpb25XaXphcmRfZGVzY3JpcHRpb25QYWdlX3RpdGxlKTsgCi0JCXNldERlc2NyaXB0aW9uKEF1dGhvcmluZ1VJUmVzb3VyY2VzLnN5bmNocm9uaXphdGlvbldpemFyZF9kZXNjcmlwdGlvblBhZ2VfdGV4dCk7IAotCQl0aGlzLnN5bmNDaG9pY2VzID0gY2hvaWNlczsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dQYWdlI2NyZWF0ZUNvbnRyb2wob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlKQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCQkvLyBDcmVhdGUgdGhlIGNvbXBvc2l0ZSB0byBob2xkIHRoZSB3aWRnZXRzLgotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsKLQkJY29tcG9zaXRlLnNldExheW91dChuZXcgR3JpZExheW91dCgxLCBmYWxzZSkpOwotCQkKLQkJU3RyaW5nIGV4cGxhaW5UZXh0ID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuc3luY2hyb25pemF0aW9uV2l6YXJkX2Rlc2NyaXB0aW9uUGFnZV9leHBsYWluVGV4dDsgCi0JCWN0cmxfZXhwbGFpblRleHQgPSBjcmVhdGVNdWx0aUxpbmVUZXh0KGNvbXBvc2l0ZSwgIiAiLCA0MDAsIDI0MCwgMSk7IC8vJE5PTi1OTFMtMSQKLQkJY3RybF9leHBsYWluVGV4dC5zZXRUZXh0KGV4cGxhaW5UZXh0KTsKLQkJCi0JCXNldENvbnRyb2woY29tcG9zaXRlKTsKLQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS93aXphcmRzL1N5bmNocm9uaXphdGlvbk9wZXJhdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS93aXphcmRzL1N5bmNocm9uaXphdGlvbk9wZXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NWE0MGVkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvd2l6YXJkcy9TeW5jaHJvbml6YXRpb25PcGVyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkud2l6YXJkczsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uSVJ1bm5hYmxlV2l0aFByb2dyZXNzOwotCi0vKioKLSAqIFJ1bnMgc3luY2hvbml6YXRpb24gb3BlcmF0aW9uCi0gKiAKLSAqIEBhdXRob3IgQmluZ1h1ZSBYdQotICogQHNpbmNlIDEuMAotICoKLSAqLwotcHVibGljIGNsYXNzIFN5bmNocm9uaXphdGlvbk9wZXJhdGlvbiBpbXBsZW1lbnRzIElSdW5uYWJsZVdpdGhQcm9ncmVzcyB7Ci0KLQlwcml2YXRlIFN5bmNocm9uaXphdGlvbkNob2ljZXMgc3luY2hDaG9pY2VzOwotCXByaXZhdGUgQ29sbGVjdGlvbiBlbGVtZW50czsKLQkKLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlCi0JICogQHBhcmFtIGVsZW1lbnRzCi0JICogCQkJTGlzdCBvZiBlbGVtZW50cyB0byBiZSBzeW5jaHJvbml6ZWQKLQkgKiBAcGFyYW0gY2hvaWNlcwotCSAqIAkJCVN5bmNocm9uaXphdGlvbiBvcHRpb25zCi0JICovCi0JcHVibGljIFN5bmNocm9uaXphdGlvbk9wZXJhdGlvbihDb2xsZWN0aW9uIGVsZW1lbnRzLCBTeW5jaHJvbml6YXRpb25DaG9pY2VzIGNob2ljZXMpIHsKLQkJdGhpcy5zeW5jaENob2ljZXMgPSBjaG9pY2VzOwotCQl0aGlzLmVsZW1lbnRzID0gZWxlbWVudHM7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLklSdW5uYWJsZVdpdGhQcm9ncmVzcyNydW4ob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sCi0JCQlJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgNTsgaSsrKSB7Ci0JCQl0cnkgewotCQkJCVRocmVhZC5zbGVlcCgxMDAwKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7fQotCQkJU3lzdGVtLm91dC5wcmludGxuKCIkJCQgd29rZSB1cCBhZnRlciAxIHNlY29uZCBzbGVlcCwgIyIgKyAoaSsxKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvd2l6YXJkcy9TeW5jaHJvbml6YXRpb25QcmV2aWV3UGFnZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS93aXphcmRzL1N5bmNocm9uaXphdGlvblByZXZpZXdQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2MmExNTguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS93aXphcmRzL1N5bmNocm9uaXphdGlvblByZXZpZXdQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLndpemFyZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51aS53aXphcmRzLkJhc2VXaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotCi0vKioKLSAqIFRoZSB3aXphcmQgcGFnZSB3aGljaCBsZXRzIHlvdSBwcmV2aWV3IGVsZW1lbnRzIHRvIGJlIHN5bmNob25pemVkCi0gKiBhbmQgYWxzbyBhbnkgYWRkaXRpb25hbCBpbmZvcm1hdGlvbi4KLSAqIAotICogQGF1dGhvciBCaW5nWHVlIFh1Ci0gKiBAc2luY2UgMS4wCi0gKgotICovCi1wdWJsaWMgY2xhc3MgU3luY2hyb25pemF0aW9uUHJldmlld1BhZ2UgZXh0ZW5kcyBCYXNlV2l6YXJkUGFnZSB7Ci0KLQlwcml2YXRlIFN5bmNocm9uaXphdGlvbkNob2ljZXMgc3luY0Nob2ljZXMgPSBudWxsOwotCQotCXByaXZhdGUgVGV4dCBjdHJsX3ByZXZpZXdUZXh0OwotCQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFN5bmNocm9uaXphdGlvblByZXZpZXdQYWdlKFN0cmluZyBwYWdlTmFtZSwKLQkJCVN5bmNocm9uaXphdGlvbkNob2ljZXMgY2hvaWNlcykgewotCQlzdXBlcihwYWdlTmFtZSk7Ci0JCXNldFRpdGxlKEF1dGhvcmluZ1VJUmVzb3VyY2VzLnN5bmNocm9uaXphdGlvbldpemFyZF9wcmV2aWV3UGFnZV90aXRsZSk7IAotCQlzZXREZXNjcmlwdGlvbihBdXRob3JpbmdVSVJlc291cmNlcy5zeW5jaHJvbml6YXRpb25XaXphcmRfcHJldmlld1BhZ2VfdGV4dCk7IAotCQl0aGlzLnN5bmNDaG9pY2VzID0gY2hvaWNlczsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dQYWdlI2NyZWF0ZUNvbnRyb2wob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlKQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCQkvLyBDcmVhdGUgdGhlIGNvbXBvc2l0ZSB0byBob2xkIHRoZSB3aWRnZXRzLgotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsKLQkJY29tcG9zaXRlLnNldExheW91dChuZXcgR3JpZExheW91dCgxLCBmYWxzZSkpOwotCQkKLQkJU3RyaW5nIGV4cGxhaW5UZXh0ID0gIlByZXZpZXcgdGV4dCBjb21pbmcgaGVyZS5cblxuIiArCQkJCQkJCQkvLyROT04tTkxTLTEkCi0JCQkJIlx0VGhpcyBoYXMgdG8gYmUgY29taW5nIGZyb20gc29tZSB1bmRlcmx5aW4gQVBJIGNhbGwuIFRoaXMgbWF5IGJlIGN1dCBvZmYgaWYgdGhlcmUgaXMgbm90IGVub3VnIHRpbWUuIjsgLy8kTk9OLU5MUy0xJAotCQljdHJsX3ByZXZpZXdUZXh0ID0gY3JlYXRlTXVsdGlMaW5lVGV4dChjb21wb3NpdGUsICIgIiwgNDAwLCAyNDAsIDEpOyAvLyROT04tTkxTLTEkCi0JCWN0cmxfcHJldmlld1RleHQuc2V0VGV4dChleHBsYWluVGV4dCk7Ci0JCQotCQlzZXRDb250cm9sKGNvbXBvc2l0ZSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3dpemFyZHMvU3luY2hyb25pemF0aW9uU2VsZWN0Q29uZmlnUGFnZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS93aXphcmRzL1N5bmNocm9uaXphdGlvblNlbGVjdENvbmZpZ1BhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2ExMzhhMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3dpemFyZHMvU3luY2hyb25pemF0aW9uU2VsZWN0Q29uZmlnUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkud2l6YXJkczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVpLndpemFyZHMuQmFzZVdpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5Db21ib1ZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIFRoZSB3aXphcmQgcGFnZSB3aGljaCBsZXQgdXNlciBzZWxlY3QgbWV0aG9kIGNvbmZpZ3VyYXRpb24gZHVyaW5nCi0gKiBzeW5jaHJvbml6YXRpb24KLSAqIAotICogQGF1dGhvciBCaW5nWHVlIFh1Ci0gKiBAc2luY2UgMS4wCi0gKgotICovCi1wdWJsaWMgY2xhc3MgU3luY2hyb25pemF0aW9uU2VsZWN0Q29uZmlnUGFnZSBleHRlbmRzIEJhc2VXaXphcmRQYWdlIGltcGxlbWVudHMgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciB7Ci0KLQlwcml2YXRlIFN5bmNocm9uaXphdGlvbkNob2ljZXMgc3luY0Nob2ljZXMgPSBudWxsOwotCQotCXByaXZhdGUgQ29tYm9WaWV3ZXIgY29uZmlnQ29tYm9WaWV3ZXI7Ci0JcHJpdmF0ZSBNZXRob2RDb25maWd1cmF0aW9uW10gdmFsaWRDb25maWd1cmF0aW9uczsKLQkKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBTeW5jaHJvbml6YXRpb25TZWxlY3RDb25maWdQYWdlKFN0cmluZyBwYWdlTmFtZSwKLQkJCVN5bmNocm9uaXphdGlvbkNob2ljZXMgY2hvaWNlcykgewotCQlzdXBlcihwYWdlTmFtZSk7Ci0JCXNldFRpdGxlKEF1dGhvcmluZ1VJUmVzb3VyY2VzLnN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3RDb25maWdQYWdlX3RpdGxlKTsgCi0JCXNldERlc2NyaXB0aW9uKEF1dGhvcmluZ1VJUmVzb3VyY2VzLnN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3RDb25maWdQYWdlX3RleHQpOyAKLQkJdGhpcy5zeW5jQ2hvaWNlcyA9IGNob2ljZXM7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nUGFnZSNjcmVhdGVDb250cm9sKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJLy8gQ3JlYXRlIHRoZSBjb21wb3NpdGUgdG8gaG9sZCB0aGUgd2lkZ2V0cy4KLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7Ci0JCXsKLQkJCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpOwotCQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJCWxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCQkJY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCQl9Ci0JCQotCQkvLyBhZGQgYW4gZW1wdHkgbGluZQotCQljcmVhdGVMYWJlbChjb21wb3NpdGUsICIgIiwgMik7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCWNyZWF0ZUxhYmVsKGNvbXBvc2l0ZSwgQXV0aG9yaW5nVUlSZXNvdXJjZXMuc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdENvbmZpZ1BhZ2VfY29uZmlnTGFiZWwpOyAKLQkJCi0JCWNvbmZpZ0NvbWJvVmlld2VyID0gbmV3IENvbWJvVmlld2VyKGNvbXBvc2l0ZSwgU1dULkJPUkRFUiB8IFNXVC5SRUFEX09OTFkpOwotCQljb25maWdDb21ib1ZpZXdlci5nZXRDb21ibygpLnNldExheW91dERhdGEoCi0JCQkJbmV3IEdyaWREYXRhKEdyaWREYXRhLkJFR0lOTklORyB8IEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQkKLQkJSUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlciA9IG5ldyBMYWJlbFByb3ZpZGVyKCkgewotCQkJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7Ci0JCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQkJCXJldHVybiAoKE1ldGhvZEVsZW1lbnQpIGVsZW1lbnQpLmdldE5hbWUoKTsKLQkJCQl9IGVsc2UgewotCQkJCQlyZXR1cm4gZWxlbWVudC50b1N0cmluZygpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQkJY29uZmlnQ29tYm9WaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihsYWJlbFByb3ZpZGVyKTsKLQkJCi0JCS8vIGdldCBhbGwgdmFsaWQgY29uZmlndXJhdGlvbnMsIGFuZCBkZWZhdWx0IG9uZSwgYW5kIHNlbGVjdCBhbmQgc2hvdyB0aGUgZGVmYXVsdCBvbmUKLQkJUHJvY2VzcyBzZWxlY3RlZFByb2Nlc3MgPSBzeW5jQ2hvaWNlcy5nZXRTZWxlY3RlZFByb2Nlc3MoKTsKLQkJdmFsaWRDb25maWd1cmF0aW9ucyA9IChNZXRob2RDb25maWd1cmF0aW9uW10pc2VsZWN0ZWRQcm9jZXNzLmdldFZhbGlkQ29udGV4dCgpLnRvQXJyYXkoKTsKLQkJY29uZmlnQ29tYm9WaWV3ZXIuYWRkKHZhbGlkQ29uZmlndXJhdGlvbnMpOwotCQlNZXRob2RDb25maWd1cmF0aW9uIGRlZmF1bHRDb25maWcgPSBzZWxlY3RlZFByb2Nlc3MuZ2V0RGVmYXVsdENvbnRleHQoKTsKLQkJc3luY0Nob2ljZXMuc2V0U2VsZWN0ZWRDb25maWcoZGVmYXVsdENvbmZpZyk7Ci0JCVN0cnVjdHVyZWRTZWxlY3Rpb24gZGVmYXVsdFNlbGVjdGlvbiA9IG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKGRlZmF1bHRDb25maWcpOwotCQljb25maWdDb21ib1ZpZXdlci5zZXRTZWxlY3Rpb24oZGVmYXVsdFNlbGVjdGlvbiwgdHJ1ZSk7Ci0JCQotCQlhZGRMaXN0ZW5lcnMoY29tcG9zaXRlKTsKLQkJCi0JCXNldENvbnRyb2woY29tcG9zaXRlKTsKLQkJCi0vLwkJU3lzdGVtLm91dC5wcmludGxuKCIkJCQgaW5pdCBjb25maWcgPSIgKyBzeW5jQ2hvaWNlcy50b1N0cmluZygpKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIHRoZSBsaXN0ZW5lcnMgZm9yIHRoZSBjb250cm9scyBvbiB0aGlzIHBhZ2UuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZExpc3RlbmVycyhmaW5hbCBDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JCWNvbmZpZ0NvbWJvVmlld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcih0aGlzKTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIjc2VsZWN0aW9uQ2hhbmdlZChvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBldmVudAotCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQkJaWYgKCFzZWxlY3Rpb24uaXNFbXB0eSgpKSB7Ci0JCQlPYmplY3RbXSBjb25maWcgPSBzZWxlY3Rpb24udG9BcnJheSgpOwotCQkJc3luY0Nob2ljZXMuc2V0U2VsZWN0ZWRDb25maWcoKE1ldGhvZENvbmZpZ3VyYXRpb24pY29uZmlnWzBdKTsKLQkJfSAKLQkJCi0vLwkJU3lzdGVtLm91dC5wcmludGxuKCIkJCQgY29uZmlnID0iICsgc3luY0Nob2ljZXMudG9TdHJpbmcoKSk7Ci0JfQotCi19Ci0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvd2l6YXJkcy9TeW5jaHJvbml6YXRpb25TZWxlY3REZXRhaWxzUGFnZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS93aXphcmRzL1N5bmNocm9uaXphdGlvblNlbGVjdERldGFpbHNQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3MDQ2ZWIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS93aXphcmRzL1N5bmNocm9uaXphdGlvblNlbGVjdERldGFpbHNQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NzAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS53aXphcmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudWkud2l6YXJkcy5CYXNlV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotCi0vKioKLSAqIFRoZSB3aXphcmQgcGFnZSB3aGljaCBsZXQgdXNlciBzZWxlY3QgcHJvcGVydGllcyBvZiBtZXRob2QgY29udGVudCB0byAKLSAqIGJlIGNvbnNpZGVyZWQgZm9yIHN5bmNob25pemF0aW9uLiAKLSAqIAotICogQGF1dGhvciBCaW5nWHVlIFh1Ci0gKiBAc2luY2UgMS4wCi0gKgotICovCi1wdWJsaWMgY2xhc3MgU3luY2hyb25pemF0aW9uU2VsZWN0RGV0YWlsc1BhZ2UgZXh0ZW5kcyBCYXNlV2l6YXJkUGFnZSBpbXBsZW1lbnRzIExpc3RlbmVyIHsKLQotCXByaXZhdGUgU3luY2hyb25pemF0aW9uQ2hvaWNlcyBzeW5jQ2hvaWNlcyA9IG51bGw7Ci0JCi0JcHJpdmF0ZSBCdXR0b24gYmNfbmFtZTsKLQlwcml2YXRlIEJ1dHRvbiBiY19wcmVzTmFtZTsKLQlwcml2YXRlIEJ1dHRvbiBiY19icmllZkRlc2M7Ci0JcHJpdmF0ZSBCdXR0b24gYmNfb3B0SW5wdXQ7Ci0JcHJpdmF0ZSBCdXR0b24gYmNfbWFuSW5wdXQ7Ci0JcHJpdmF0ZSBCdXR0b24gYmNfb3V0cHV0OwotCXByaXZhdGUgQnV0dG9uIGJjX3ByaW1QZXJmb3JtZXI7Ci0JcHJpdmF0ZSBCdXR0b24gYmNfYWRkblBlcmZvcm1lcjsKLQlwcml2YXRlIEJ1dHRvbiBiY19yZXNwUm9sZTsKLQlwcml2YXRlIEJ1dHRvbiBiY19jb250QXJ0aWZhY3Q7Ci0JcHJpdmF0ZSBCdXR0b24gYmNfZGVsaXZQYXJ0OwotCXByaXZhdGUgQnV0dG9uIGJjX3NlbFN0ZXA7Ci0KLQlwcml2YXRlIEJ1dHRvbiBiY19ndWlkYW5jZTsKLQkKLS8vCXByaXZhdGUgQnV0dG9uW10gYnJfcHJlc05hbWUgPSBuZXcgQnV0dG9uWzJdOwotLy8JcHJpdmF0ZSBCdXR0b25bXSBicl9vcHRJbnB1dCA9IG5ldyBCdXR0b25bMl07Ci0vLwlwcml2YXRlIEJ1dHRvbltdIGJyX21hbklucHV0ID0gbmV3IEJ1dHRvblsyXTsKLS8vCXByaXZhdGUgQnV0dG9uW10gYnJfb3V0cHV0ID0gbmV3IEJ1dHRvblsyXTsKLS8vCXByaXZhdGUgQnV0dG9uW10gYnJfcmVzcFJvbGUgPSBuZXcgQnV0dG9uWzJdOwotLy8JcHJpdmF0ZSBCdXR0b25bXSBicl9jb250QXJ0aWZhY3QgPSBuZXcgQnV0dG9uWzJdOwotLy8JcHJpdmF0ZSBCdXR0b25bXSBicl9kZWxpdlBhcnQgPSBuZXcgQnV0dG9uWzJdOwotLy8JcHJpdmF0ZSBCdXR0b25bXSBicl9zZWxTdGVwID0gbmV3IEJ1dHRvblsyXTsKLQkKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBTeW5jaHJvbml6YXRpb25TZWxlY3REZXRhaWxzUGFnZShTdHJpbmcgcGFnZU5hbWUsCi0JCQlTeW5jaHJvbml6YXRpb25DaG9pY2VzIGNob2ljZXMpIHsKLQkJc3VwZXIocGFnZU5hbWUpOwotCQlzZXRUaXRsZShBdXRob3JpbmdVSVJlc291cmNlcy5zeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0RGV0YWlsc1BhZ2VfdGl0bGUpOyAKLQkJc2V0RGVzY3JpcHRpb24oQXV0aG9yaW5nVUlSZXNvdXJjZXMuc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdERldGFpbHNQYWdlX3RleHQpOyAKLQkJdGhpcy5zeW5jQ2hvaWNlcyA9IGNob2ljZXM7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nUGFnZSNjcmVhdGVDb250cm9sKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJLy8gQ3JlYXRlIHRoZSBjb21wb3NpdGUgdG8gaG9sZCB0aGUgd2lkZ2V0cy4KLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7Ci0JCXsKLS8vCQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgzLCBmYWxzZSk7Ci0JCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KDEsIGZhbHNlKTsKLQkJCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQkJfQotCQotCQljcmVhdGVMYWJlbChjb21wb3NpdGUsIEF1dGhvcmluZ1VJUmVzb3VyY2VzLnN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3REZXRhaWxzUGFnZV9wcm9wZXJ0aWVzX2xhYmxlKTsgCi0vLwkJY3JlYXRlTGFiZWwoY29tcG9zaXRlLCAiQ29uZXRudCBUbyBQcm9jZXNzICAiKTsKLS8vCQljcmVhdGVMYWJlbChjb21wb3NpdGUsICIgIFByb2Nlc3MgVG8gQ29udGVudCIpOwotCQkKLQkJYmNfbmFtZSA9IGNyZWF0ZUNoZWNrYm94KGNvbXBvc2l0ZSwgQXV0aG9yaW5nVUlSZXNvdXJjZXMuc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdERldGFpbHNQYWdlX25hbWVfbGFibGUpOyAKLQkJCi0JCWJjX3ByZXNOYW1lID0gY3JlYXRlQ2hlY2tib3goY29tcG9zaXRlLCBBdXRob3JpbmdVSVJlc291cmNlcy5zeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0RGV0YWlsc1BhZ2VfcHJlc2VudGF0aW9uTmFtZV9sYWJsZSk7IAotLy8JCWNyZWF0ZVR3b1JhZGlvR3JvdXAoY29tcG9zaXRlLCBicl9wcmVzTmFtZSk7Ci0JCQotCQliY19icmllZkRlc2MgPSBjcmVhdGVDaGVja2JveChjb21wb3NpdGUsIEF1dGhvcmluZ1VJUmVzb3VyY2VzLnN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3REZXRhaWxzUGFnZV9icmllZkRlc2NfbGFibGUpOyAKLQkJCi0JCWJjX29wdElucHV0ID0gY3JlYXRlQ2hlY2tib3goY29tcG9zaXRlLCBBdXRob3JpbmdVSVJlc291cmNlcy5zeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0RGV0YWlsc1BhZ2Vfb3B0aW9uYWxJbm91dHNfbGFiZWwpOyAKLS8vCQljcmVhdGVUd29SYWRpb0dyb3VwKGNvbXBvc2l0ZSwgYnJfb3B0SW5wdXQpOwotCQkKLQkJYmNfbWFuSW5wdXQgPSBjcmVhdGVDaGVja2JveChjb21wb3NpdGUsIEF1dGhvcmluZ1VJUmVzb3VyY2VzLnN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3REZXRhaWxzUGFnZV9tYW5kYXRvcnlJbnB1dHNfbGFibGUpOyAKLS8vCQljcmVhdGVUd29SYWRpb0dyb3VwKGNvbXBvc2l0ZSwgYnJfbWFuSW5wdXQpOwotCQkKLQkJYmNfb3V0cHV0ID0gY3JlYXRlQ2hlY2tib3goY29tcG9zaXRlLCBBdXRob3JpbmdVSVJlc291cmNlcy5zeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0RGV0YWlsc1BhZ2Vfb3V0cHV0c19sYWJlbCk7IAotLy8JCWNyZWF0ZVR3b1JhZGlvR3JvdXAoY29tcG9zaXRlLCBicl9vdXRwdXQpOwotCQkKLQkJYmNfcHJpbVBlcmZvcm1lciA9IGNyZWF0ZUNoZWNrYm94KGNvbXBvc2l0ZSwgQXV0aG9yaW5nVUlSZXNvdXJjZXMuc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdERldGFpbHNQYWdlX3ByaW1hcnlQZXJmb3JtZXJfbGFiZWwpOyAKLQkJYmNfYWRkblBlcmZvcm1lciA9IGNyZWF0ZUNoZWNrYm94KGNvbXBvc2l0ZSwgQXV0aG9yaW5nVUlSZXNvdXJjZXMuc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdERldGFpbHNQYWdlX2FkZG5QZXJmb3JtZXJzX2xhYmxlKTsgCi0JCQotCQliY19yZXNwUm9sZSA9IGNyZWF0ZUNoZWNrYm94KGNvbXBvc2l0ZSwgQXV0aG9yaW5nVUlSZXNvdXJjZXMuc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdERldGFpbHNQYWdlX3Jlc3BvbnNpYmxlUm9sZXNfbGFibGUpOyAKLS8vCQljcmVhdGVUd29SYWRpb0dyb3VwKGNvbXBvc2l0ZSwgYnJfcmVzcFJvbGUpOwotCQkKLQkJYmNfY29udEFydGlmYWN0ID0gY3JlYXRlQ2hlY2tib3goY29tcG9zaXRlLCBBdXRob3JpbmdVSVJlc291cmNlcy5zeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0RGV0YWlsc1BhZ2VfY29udG5BcnRpZmFjdHNfbGFiZWwpOyAKLS8vCQljcmVhdGVUd29SYWRpb0dyb3VwKGNvbXBvc2l0ZSwgYnJfY29udEFydGlmYWN0KTsKLQkJCi0JCWJjX2RlbGl2UGFydCA9IGNyZWF0ZUNoZWNrYm94KGNvbXBvc2l0ZSwgQXV0aG9yaW5nVUlSZXNvdXJjZXMuc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdERldGFpbHNQYWdlX2RpbHZlZFBhcnRzX2xhYmVsKTsgCi0vLwkJY3JlYXRlVHdvUmFkaW9Hcm91cChjb21wb3NpdGUsIGJyX2RlbGl2UGFydCk7Ci0JCQotCQliY19zZWxTdGVwID0gY3JlYXRlQ2hlY2tib3goY29tcG9zaXRlLCBBdXRob3JpbmdVSVJlc291cmNlcy5zeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0RGV0YWlsc1BhZ2Vfc2VsU3RlcHNfbGFiZWwpOyAKLS8vCQljcmVhdGVUd29SYWRpb0dyb3VwKGNvbXBvc2l0ZSwgYnJfc2VsU3RlcCk7Ci0JCQotCQliY19ndWlkYW5jZSA9IGNyZWF0ZUNoZWNrYm94KGNvbXBvc2l0ZSwgQXV0aG9yaW5nVUlSZXNvdXJjZXMuc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdERldGFpbHNQYWdlX3NlbEd1aWRhbmNlX2xhYmVsKTsKLQkJCi0JCWFkZExpc3RlbmVycyhjb21wb3NpdGUpOwotCQlzZXRBbGxDaGVja2VkKCk7Ci0JCQotCQlzZXRDb250cm9sKGNvbXBvc2l0ZSk7Ci0JCQotLy8JCVN5c3RlbS5vdXQucHJpbnRsbigiJCQkIGluaXQgZGV0YWlsID0iICsgc3luY0Nob2ljZXMudG9TdHJpbmcoKSk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBzZXRBbGxDaGVja2VkKCkgewotCQliY19uYW1lLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJYmNfcHJlc05hbWUuc2V0U2VsZWN0aW9uKHRydWUpOwotCQliY19icmllZkRlc2Muc2V0U2VsZWN0aW9uKHRydWUpOwotCQliY19vcHRJbnB1dC5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCWJjX21hbklucHV0LnNldFNlbGVjdGlvbih0cnVlKTsKLQkJYmNfb3V0cHV0LnNldFNlbGVjdGlvbih0cnVlKTsKLQkJYmNfcHJpbVBlcmZvcm1lci5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCWJjX2FkZG5QZXJmb3JtZXIuc2V0U2VsZWN0aW9uKHRydWUpOwotCQliY19yZXNwUm9sZS5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCWJjX2NvbnRBcnRpZmFjdC5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCWJjX2RlbGl2UGFydC5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCWJjX3NlbFN0ZXAuc2V0U2VsZWN0aW9uKHRydWUpOwkKLQkJYmNfZ3VpZGFuY2Uuc2V0U2VsZWN0aW9uKHRydWUpOwotCX0KLQkKLQkvKioKLQkgKiBBZGRzIHRoZSBsaXN0ZW5lcnMgZm9yIHRoZSBjb250cm9scyBvbiB0aGlzIHBhZ2UuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZExpc3RlbmVycyhmaW5hbCBDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JCWJjX25hbWUuYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCQlpZiAoYmNfbmFtZS5nZXRTZWxlY3Rpb24oKSkgewotCQkJCQkJc3luY0Nob2ljZXMuc2V0U3luY05hbWUoU3luY2hyb25pemF0aW9uQ2hvaWNlcy5TWU5DX0ZST01fQ09OVEVOVCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJc3luY0Nob2ljZXMuc2V0U3luY05hbWUoU3luY2hyb25pemF0aW9uQ2hvaWNlcy5TWU5DX05PTkUpOwotCQkJCX0KLQkJCQlzZXRQYWdlQ29tcGxldGUoaXNQYWdlQ29tcGxldGUoKSk7Ci0JCQl9Ci0JCX0pOwotCQliY19wcmVzTmFtZS5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJCWlmIChiY19wcmVzTmFtZS5nZXRTZWxlY3Rpb24oKSkgewotLy8JCQkJCWJyX3ByZXNOYW1lWzBdLnNldEVuYWJsZWQodHJ1ZSk7Ci0vLwkJCQkJYnJfcHJlc05hbWVbMV0uc2V0RW5hYmxlZCh0cnVlKTsKLS8vCQkJCQlpZiAoYnJfcHJlc05hbWVbMF0uZ2V0U2VsZWN0aW9uKCkpCi0JCQkJCQlzeW5jQ2hvaWNlcy5zZXRTeW5jUHJlc05hbWUoU3luY2hyb25pemF0aW9uQ2hvaWNlcy5TWU5DX0ZST01fQ09OVEVOVCk7Ci0vLwkJCQkJZWxzZQotLy8JCQkJCQlzeW5jQ2hvaWNlcy5zZXRTeW5jUHJlc05hbWUoU3luY2hyb25pemF0aW9uQ2hvaWNlcy5TWU5DX0ZST01fUFJPQ0VTUyk7Ci0JCQkJfSBlbHNlIHsKLS8vCQkJCQlicl9wcmVzTmFtZVswXS5zZXRFbmFibGVkKGZhbHNlKTsKLS8vCQkJCQlicl9wcmVzTmFtZVsxXS5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQkJc3luY0Nob2ljZXMuc2V0U3luY1ByZXNOYW1lKFN5bmNocm9uaXphdGlvbkNob2ljZXMuU1lOQ19OT05FKTsKLQkJCQl9Ci0vLwkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIiQkJCAiICsgc3luY0Nob2ljZXMudG9TdHJpbmcoKSk7Ci0JCQkJc2V0UGFnZUNvbXBsZXRlKGlzUGFnZUNvbXBsZXRlKCkpOwotCQkJfQotCQl9KTsKLQkJYmNfYnJpZWZEZXNjLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQkJaWYgKGJjX2JyaWVmRGVzYy5nZXRTZWxlY3Rpb24oKSkgewotCQkJCQkJc3luY0Nob2ljZXMuc2V0U3luY0JyaWVmRGVzYyhTeW5jaHJvbml6YXRpb25DaG9pY2VzLlNZTkNfRlJPTV9DT05URU5UKTsKLQkJCQl9IGVsc2UgewotCQkJCQlzeW5jQ2hvaWNlcy5zZXRTeW5jQnJpZWZEZXNjKFN5bmNocm9uaXphdGlvbkNob2ljZXMuU1lOQ19OT05FKTsKLQkJCQl9Ci0JCQkJc2V0UGFnZUNvbXBsZXRlKGlzUGFnZUNvbXBsZXRlKCkpOwotCQkJfQotCQl9KTsKLQkJYmNfb3B0SW5wdXQuYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCQlpZiAoYmNfb3B0SW5wdXQuZ2V0U2VsZWN0aW9uKCkpIHsKLS8vCQkJCQlicl9vcHRJbnB1dFswXS5zZXRFbmFibGVkKHRydWUpOwotLy8JCQkJCWJyX29wdElucHV0WzFdLnNldEVuYWJsZWQodHJ1ZSk7Ci0vLwkJCQkJaWYgKGJyX29wdElucHV0WzBdLmdldFNlbGVjdGlvbigpKQotCQkJCQkJc3luY0Nob2ljZXMuc2V0U3luY09wdElucHV0KFN5bmNocm9uaXphdGlvbkNob2ljZXMuU1lOQ19GUk9NX0NPTlRFTlQpOwotLy8JCQkJCWVsc2UKLS8vCQkJCQkJc3luY0Nob2ljZXMuc2V0U3luY09wdElucHV0KFN5bmNocm9uaXphdGlvbkNob2ljZXMuU1lOQ19GUk9NX1BST0NFU1MpOwotCQkJCX0gZWxzZSB7Ci0vLwkJCQkJYnJfb3B0SW5wdXRbMF0uc2V0RW5hYmxlZChmYWxzZSk7Ci0vLwkJCQkJYnJfb3B0SW5wdXRbMV0uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJCXN5bmNDaG9pY2VzLnNldFN5bmNPcHRJbnB1dChTeW5jaHJvbml6YXRpb25DaG9pY2VzLlNZTkNfTk9ORSk7Ci0JCQkJfQotLy8JCQkJU3lzdGVtLm91dC5wcmludGxuKCIkJCQgIiArIHN5bmNDaG9pY2VzLnRvU3RyaW5nKCkpOwotCQkJCXNldFBhZ2VDb21wbGV0ZShpc1BhZ2VDb21wbGV0ZSgpKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQliY19tYW5JbnB1dC5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJCWlmIChiY19tYW5JbnB1dC5nZXRTZWxlY3Rpb24oKSkgewotLy8JCQkJCWJyX21hbklucHV0WzBdLnNldEVuYWJsZWQodHJ1ZSk7Ci0vLwkJCQkJYnJfbWFuSW5wdXRbMV0uc2V0RW5hYmxlZCh0cnVlKTsKLS8vCQkJCQlpZiAoYnJfbWFuSW5wdXRbMF0uZ2V0U2VsZWN0aW9uKCkpCi0JCQkJCQlzeW5jQ2hvaWNlcy5zZXRTeW5jTWFuSW5wdXQoU3luY2hyb25pemF0aW9uQ2hvaWNlcy5TWU5DX0ZST01fQ09OVEVOVCk7Ci0vLwkJCQkJZWxzZQotLy8JCQkJCQlzeW5jQ2hvaWNlcy5zZXRTeW5jTWFuSW5wdXQoU3luY2hyb25pemF0aW9uQ2hvaWNlcy5TWU5DX0ZST01fUFJPQ0VTUyk7Ci0vLwkJCQkJCi0JCQkJfSBlbHNlIHsKLS8vCQkJCQlicl9tYW5JbnB1dFswXS5zZXRFbmFibGVkKGZhbHNlKTsKLS8vCQkJCQlicl9tYW5JbnB1dFsxXS5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQkJc3luY0Nob2ljZXMuc2V0U3luY01hbklucHV0KFN5bmNocm9uaXphdGlvbkNob2ljZXMuU1lOQ19OT05FKTsKLQkJCQl9Ci0vLwkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIiQkJCAiICsgc3luY0Nob2ljZXMudG9TdHJpbmcoKSk7Ci0JCQkJc2V0UGFnZUNvbXBsZXRlKGlzUGFnZUNvbXBsZXRlKCkpOwotCQkJfQotCQl9KTsKLQkJCi0JCWJjX291dHB1dC5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJCWlmIChiY19vdXRwdXQuZ2V0U2VsZWN0aW9uKCkpIHsKLS8vCQkJCQlicl9vdXRwdXRbMF0uc2V0RW5hYmxlZCh0cnVlKTsKLS8vCQkJCQlicl9vdXRwdXRbMV0uc2V0RW5hYmxlZCh0cnVlKTsKLS8vCQkJCQlpZiAoYnJfb3V0cHV0WzBdLmdldFNlbGVjdGlvbigpKQotCQkJCQkJc3luY0Nob2ljZXMuc2V0U3luY091dHB1dChTeW5jaHJvbml6YXRpb25DaG9pY2VzLlNZTkNfRlJPTV9DT05URU5UKTsKLS8vCQkJCQllbHNlCi0vLwkJCQkJCXN5bmNDaG9pY2VzLnNldFN5bmNPdXRwdXQoU3luY2hyb25pemF0aW9uQ2hvaWNlcy5TWU5DX0ZST01fUFJPQ0VTUyk7Ci0JCQkJfSBlbHNlIHsKLS8vCQkJCQlicl9vdXRwdXRbMF0uc2V0RW5hYmxlZChmYWxzZSk7Ci0vLwkJCQkJYnJfb3V0cHV0WzFdLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCQlzeW5jQ2hvaWNlcy5zZXRTeW5jT3V0cHV0KFN5bmNocm9uaXphdGlvbkNob2ljZXMuU1lOQ19OT05FKTsKLQkJCQl9Ci0vLwkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIiQkJCAiICsgc3luY0Nob2ljZXMudG9TdHJpbmcoKSk7Ci0JCQkJc2V0UGFnZUNvbXBsZXRlKGlzUGFnZUNvbXBsZXRlKCkpOwotCQkJfQotCQl9KTsKLQkJCi0JCWJjX3ByaW1QZXJmb3JtZXIuYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCQlpZiAoYmNfcHJpbVBlcmZvcm1lci5nZXRTZWxlY3Rpb24oKSkgewotCQkJCQlzeW5jQ2hvaWNlcy5zZXRTeW5jUHJpbVBlcmZvcm1lcihTeW5jaHJvbml6YXRpb25DaG9pY2VzLlNZTkNfRlJPTV9DT05URU5UKTsKLQkJCQl9IGVsc2UgewotCQkJCQlzeW5jQ2hvaWNlcy5zZXRTeW5jUHJpbVBlcmZvcm1lcihTeW5jaHJvbml6YXRpb25DaG9pY2VzLlNZTkNfTk9ORSk7Ci0JCQkJfQotCQkJCXNldFBhZ2VDb21wbGV0ZShpc1BhZ2VDb21wbGV0ZSgpKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQliY19hZGRuUGVyZm9ybWVyLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQkJCWlmIChiY19hZGRuUGVyZm9ybWVyLmdldFNlbGVjdGlvbigpKSB7Ci0JCQkJCQlzeW5jQ2hvaWNlcy5zZXRTeW5jQWRkblBlcmZvcm1lcihTeW5jaHJvbml6YXRpb25DaG9pY2VzLlNZTkNfRlJPTV9DT05URU5UKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCXN5bmNDaG9pY2VzLnNldFN5bmNBZGRuUGVyZm9ybWVyKFN5bmNocm9uaXphdGlvbkNob2ljZXMuU1lOQ19OT05FKTsKLQkJCQkJfQotCQkJCQlzZXRQYWdlQ29tcGxldGUoaXNQYWdlQ29tcGxldGUoKSk7Ci0JCQkJfQotCQl9KTsKLQkJCi0JCWJjX3Jlc3BSb2xlLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQkJaWYgKGJjX3Jlc3BSb2xlLmdldFNlbGVjdGlvbigpKSB7Ci0vLwkJCQkJYnJfcmVzcFJvbGVbMF0uc2V0RW5hYmxlZCh0cnVlKTsKLS8vCQkJCQlicl9yZXNwUm9sZVsxXS5zZXRFbmFibGVkKHRydWUpOwotLy8JCQkJCWlmIChicl9yZXNwUm9sZVswXS5nZXRTZWxlY3Rpb24oKSkKLQkJCQkJCXN5bmNDaG9pY2VzLnNldFN5bmNSZXNwUm9sZShTeW5jaHJvbml6YXRpb25DaG9pY2VzLlNZTkNfRlJPTV9DT05URU5UKTsKLS8vCQkJCQllbHNlCi0vLwkJCQkJCXN5bmNDaG9pY2VzLnNldFN5bmNSZXNwUm9sZShTeW5jaHJvbml6YXRpb25DaG9pY2VzLlNZTkNfRlJPTV9QUk9DRVNTKTsKLQkJCQl9IGVsc2UgewotLy8JCQkJCWJyX3Jlc3BSb2xlWzBdLnNldEVuYWJsZWQoZmFsc2UpOwotLy8JCQkJCWJyX3Jlc3BSb2xlWzFdLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCQlzeW5jQ2hvaWNlcy5zZXRTeW5jUmVzcFJvbGUoU3luY2hyb25pemF0aW9uQ2hvaWNlcy5TWU5DX05PTkUpOwotCQkJCX0KLS8vCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiJCQkICIgKyBzeW5jQ2hvaWNlcy50b1N0cmluZygpKTsKLQkJCQlzZXRQYWdlQ29tcGxldGUoaXNQYWdlQ29tcGxldGUoKSk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJYmNfY29udEFydGlmYWN0LmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQkJaWYgKGJjX2NvbnRBcnRpZmFjdC5nZXRTZWxlY3Rpb24oKSkgewotLy8JCQkJCWJyX2NvbnRBcnRpZmFjdFswXS5zZXRFbmFibGVkKHRydWUpOwotLy8JCQkJCWJyX2NvbnRBcnRpZmFjdFsxXS5zZXRFbmFibGVkKHRydWUpOwotLy8JCQkJCWlmIChicl9jb250QXJ0aWZhY3RbMF0uZ2V0U2VsZWN0aW9uKCkpCi0JCQkJCQlzeW5jQ2hvaWNlcy5zZXRTeW5jQ29udEFydGlmYWN0KFN5bmNocm9uaXphdGlvbkNob2ljZXMuU1lOQ19GUk9NX0NPTlRFTlQpOwotLy8JCQkJCWVsc2UKLS8vCQkJCQkJc3luY0Nob2ljZXMuc2V0U3luY0NvbnRBcnRpZmFjdChTeW5jaHJvbml6YXRpb25DaG9pY2VzLlNZTkNfRlJPTV9QUk9DRVNTKTsKLQkJCQl9IGVsc2UgewotLy8JCQkJCWJyX2NvbnRBcnRpZmFjdFswXS5zZXRFbmFibGVkKGZhbHNlKTsKLS8vCQkJCQlicl9jb250QXJ0aWZhY3RbMV0uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJCXN5bmNDaG9pY2VzLnNldFN5bmNDb250QXJ0aWZhY3QoU3luY2hyb25pemF0aW9uQ2hvaWNlcy5TWU5DX05PTkUpOwotCQkJCX0KLS8vCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiJCQkICIgKyBzeW5jQ2hvaWNlcy50b1N0cmluZygpKTsKLQkJCQlzZXRQYWdlQ29tcGxldGUoaXNQYWdlQ29tcGxldGUoKSk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJYmNfZGVsaXZQYXJ0LmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQkJaWYgKGJjX2RlbGl2UGFydC5nZXRTZWxlY3Rpb24oKSkgewotLy8JCQkJCWJyX2RlbGl2UGFydFswXS5zZXRFbmFibGVkKHRydWUpOwotLy8JCQkJCWJyX2RlbGl2UGFydFsxXS5zZXRFbmFibGVkKHRydWUpOwotLy8JCQkJCWlmIChicl9kZWxpdlBhcnRbMF0uZ2V0U2VsZWN0aW9uKCkpCi0JCQkJCQlzeW5jQ2hvaWNlcy5zZXRTeW5jRGVsaXZQYXJ0KFN5bmNocm9uaXphdGlvbkNob2ljZXMuU1lOQ19GUk9NX0NPTlRFTlQpOwotLy8JCQkJCWVsc2UKLS8vCQkJCQkJc3luY0Nob2ljZXMuc2V0U3luY0RlbGl2UGFydChTeW5jaHJvbml6YXRpb25DaG9pY2VzLlNZTkNfRlJPTV9QUk9DRVNTKTsKLQkJCQl9IGVsc2UgewotLy8JCQkJCWJyX2RlbGl2UGFydFswXS5zZXRFbmFibGVkKGZhbHNlKTsKLS8vCQkJCQlicl9kZWxpdlBhcnRbMV0uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJCXN5bmNDaG9pY2VzLnNldFN5bmNEZWxpdlBhcnQoU3luY2hyb25pemF0aW9uQ2hvaWNlcy5TWU5DX05PTkUpOwotCQkJCX0KLS8vCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiJCQkICIgKyBzeW5jQ2hvaWNlcy50b1N0cmluZygpKTsKLQkJCQlzZXRQYWdlQ29tcGxldGUoaXNQYWdlQ29tcGxldGUoKSk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJYmNfc2VsU3RlcC5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJCWlmIChiY19zZWxTdGVwLmdldFNlbGVjdGlvbigpKSB7Ci0vLwkJCQkJYnJfc2VsU3RlcFswXS5zZXRFbmFibGVkKHRydWUpOwotLy8JCQkJCWJyX3NlbFN0ZXBbMV0uc2V0RW5hYmxlZCh0cnVlKTsKLS8vCQkJCQlpZiAoYnJfc2VsU3RlcFswXS5nZXRTZWxlY3Rpb24oKSkKLQkJCQkJCXN5bmNDaG9pY2VzLnNldFN5bmNTZWxTdGVwKFN5bmNocm9uaXphdGlvbkNob2ljZXMuU1lOQ19GUk9NX0NPTlRFTlQpOwotLy8JCQkJCWVsc2UKLS8vCQkJCQkJc3luY0Nob2ljZXMuc2V0U3luY1NlbFN0ZXAoU3luY2hyb25pemF0aW9uQ2hvaWNlcy5TWU5DX0ZST01fUFJPQ0VTUyk7Ci0JCQkJfSBlbHNlIHsKLS8vCQkJCQlicl9zZWxTdGVwWzBdLnNldEVuYWJsZWQoZmFsc2UpOwotLy8JCQkJCWJyX3NlbFN0ZXBbMV0uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJCXN5bmNDaG9pY2VzLnNldFN5bmNTZWxTdGVwKFN5bmNocm9uaXphdGlvbkNob2ljZXMuU1lOQ19OT05FKTsKLQkJCQl9Ci0vLwkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIiQkJCAiICsgc3luY0Nob2ljZXMudG9TdHJpbmcoKSk7Ci0JCQkJc2V0UGFnZUNvbXBsZXRlKGlzUGFnZUNvbXBsZXRlKCkpOwotCQkJfQotCQl9KTsKLQkJCi0JCWJjX2d1aWRhbmNlLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJc3luY0Nob2ljZXMuc2V0U3luY0d1aWRhbmNlKGJjX2d1aWRhbmNlLmdldFNlbGVjdGlvbigpID8gU3luY2hyb25pemF0aW9uQ2hvaWNlcy5TWU5DX0ZST01fQ09OVEVOVCA6IFN5bmNocm9uaXphdGlvbkNob2ljZXMuU1lOQ19OT05FKTsKLQkJCQlzZXRQYWdlQ29tcGxldGUoaXNQYWdlQ29tcGxldGUoKSk7Ci0JCQl9Ci0JCX0pOwotCi0vLwkJYnJfcHJlc05hbWVbMF0uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgdGhpcyk7Ci0vLwkJYnJfb3B0SW5wdXRbMF0uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgdGhpcyk7Ci0vLwkJYnJfbWFuSW5wdXRbMF0uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgdGhpcyk7Ci0vLwkJYnJfb3V0cHV0WzBdLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIHRoaXMpOwotLy8JCWJyX3Jlc3BSb2xlWzBdLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIHRoaXMpOwotLy8JCWJyX2NvbnRBcnRpZmFjdFswXS5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCB0aGlzKTsKLS8vCQlicl9kZWxpdlBhcnRbMF0uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgdGhpcyk7Ci0vLwkJYnJfc2VsU3RlcFswXS5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCB0aGlzKTsKLS8vCQkKLS8vCQlicl9wcmVzTmFtZVsxXS5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCB0aGlzKTsKLS8vCQlicl9vcHRJbnB1dFsxXS5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCB0aGlzKTsKLS8vCQlicl9tYW5JbnB1dFsxXS5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCB0aGlzKTsKLS8vCQlicl9vdXRwdXRbMV0uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgdGhpcyk7Ci0vLwkJYnJfcmVzcFJvbGVbMV0uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgdGhpcyk7Ci0vLwkJYnJfY29udEFydGlmYWN0WzFdLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIHRoaXMpOwotLy8JCWJyX2RlbGl2UGFydFsxXS5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCB0aGlzKTsKLS8vCQlicl9zZWxTdGVwWzFdLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIHRoaXMpOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyI2hhbmRsZUV2ZW50KG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQotLy8JCWlmIChldmVudC53aWRnZXQgPT0gYnJfcHJlc05hbWVbMF0gJiYgYnJfcHJlc05hbWVbMF0uZ2V0U2VsZWN0aW9uKCkpIHsgCi0vLwkJCXN5bmNDaG9pY2VzLnNldFN5bmNQcmVzTmFtZShTeW5jaHJvbml6YXRpb25DaG9pY2VzLlNZTkNfRlJPTV9DT05FVE5UKTsKLS8vCQl9Ci0vLwkJaWYgKGV2ZW50LndpZGdldCA9PSBicl9vcHRJbnB1dFswXSAmJiBicl9vcHRJbnB1dFswXS5nZXRTZWxlY3Rpb24oKSkgeyAKLS8vCQkJc3luY0Nob2ljZXMuc2V0U3luY09wdElucHV0KFN5bmNocm9uaXphdGlvbkNob2ljZXMuU1lOQ19GUk9NX0NPTkVUTlQpOwotLy8JCX0KLS8vCQlpZiAoZXZlbnQud2lkZ2V0ID09IGJyX21hbklucHV0WzBdICYmIGJyX21hbklucHV0WzBdLmdldFNlbGVjdGlvbigpKSB7IAotLy8JCQlzeW5jQ2hvaWNlcy5zZXRTeW5jTWFuSW5wdXQoU3luY2hyb25pemF0aW9uQ2hvaWNlcy5TWU5DX0ZST01fQ09ORVROVCk7Ci0vLwkJfQotLy8JCWlmIChldmVudC53aWRnZXQgPT0gYnJfb3V0cHV0WzBdICYmIGJyX291dHB1dFswXS5nZXRTZWxlY3Rpb24oKSkgeyAKLS8vCQkJc3luY0Nob2ljZXMuc2V0U3luY091dHB1dChTeW5jaHJvbml6YXRpb25DaG9pY2VzLlNZTkNfRlJPTV9DT05FVE5UKTsKLS8vCQl9Ci0vLwkJaWYgKGV2ZW50LndpZGdldCA9PSBicl9yZXNwUm9sZVswXSAmJiBicl9yZXNwUm9sZVswXS5nZXRTZWxlY3Rpb24oKSkgeyAKLS8vCQkJc3luY0Nob2ljZXMuc2V0U3luY1Jlc3BSb2xlKFN5bmNocm9uaXphdGlvbkNob2ljZXMuU1lOQ19GUk9NX0NPTkVUTlQpOwotLy8JCX0KLS8vCQlpZiAoZXZlbnQud2lkZ2V0ID09IGJyX2NvbnRBcnRpZmFjdFswXSAmJiBicl9jb250QXJ0aWZhY3RbMF0uZ2V0U2VsZWN0aW9uKCkpIHsKLS8vCQkJc3luY0Nob2ljZXMuc2V0U3luY0NvbnRBcnRpZmFjdChTeW5jaHJvbml6YXRpb25DaG9pY2VzLlNZTkNfRlJPTV9DT05FVE5UKTsKLS8vCQl9Ci0vLwkJaWYgKGV2ZW50LndpZGdldCA9PSBicl9kZWxpdlBhcnRbMF0gJiYgYnJfZGVsaXZQYXJ0WzBdLmdldFNlbGVjdGlvbigpKSB7IAotLy8JCQlzeW5jQ2hvaWNlcy5zZXRTeW5jRGVsaXZQYXJ0KFN5bmNocm9uaXphdGlvbkNob2ljZXMuU1lOQ19GUk9NX0NPTkVUTlQpOwotLy8JCX0KLS8vCQlpZiAoZXZlbnQud2lkZ2V0ID09IGJyX3NlbFN0ZXBbMF0gJiYgYnJfc2VsU3RlcFswXS5nZXRTZWxlY3Rpb24oKSl7IAotLy8JCQlzeW5jQ2hvaWNlcy5zZXRTeW5jU2VsU3RlcChTeW5jaHJvbml6YXRpb25DaG9pY2VzLlNZTkNfRlJPTV9DT05FVE5UKTsKLS8vCQl9Ci0vLwotLy8JCWlmIChldmVudC53aWRnZXQgPT0gYnJfcHJlc05hbWVbMV0gJiYgYnJfcHJlc05hbWVbMV0uZ2V0U2VsZWN0aW9uKCkpeyAKLS8vCQkJc3luY0Nob2ljZXMuc2V0U3luY1ByZXNOYW1lKFN5bmNocm9uaXphdGlvbkNob2ljZXMuU1lOQ19GUk9NX1BST0NFU1MpOwotLy8JCX0KLS8vCQlpZiAoZXZlbnQud2lkZ2V0ID09IGJyX29wdElucHV0WzFdICYmIGJyX29wdElucHV0WzFdLmdldFNlbGVjdGlvbigpKXsgCi0vLwkJCXN5bmNDaG9pY2VzLnNldFN5bmNPcHRJbnB1dChTeW5jaHJvbml6YXRpb25DaG9pY2VzLlNZTkNfRlJPTV9QUk9DRVNTKTsKLS8vCQl9Ci0vLwkJaWYgKGV2ZW50LndpZGdldCA9PSBicl9tYW5JbnB1dFsxXSAmJiBicl9tYW5JbnB1dFsxXS5nZXRTZWxlY3Rpb24oKSl7IAotLy8JCQlzeW5jQ2hvaWNlcy5zZXRTeW5jTWFuSW5wdXQoU3luY2hyb25pemF0aW9uQ2hvaWNlcy5TWU5DX0ZST01fUFJPQ0VTUyk7Ci0vLwkJfQotLy8JCWlmIChldmVudC53aWRnZXQgPT0gYnJfb3V0cHV0WzFdICYmIGJyX291dHB1dFsxXS5nZXRTZWxlY3Rpb24oKSl7IAotLy8JCQlzeW5jQ2hvaWNlcy5zZXRTeW5jT3V0cHV0KFN5bmNocm9uaXphdGlvbkNob2ljZXMuU1lOQ19GUk9NX1BST0NFU1MpOwotLy8JCX0KLS8vCQlpZiAoZXZlbnQud2lkZ2V0ID09IGJyX3Jlc3BSb2xlWzFdICYmIGJyX3Jlc3BSb2xlWzFdLmdldFNlbGVjdGlvbigpKXsgCi0vLwkJCXN5bmNDaG9pY2VzLnNldFN5bmNSZXNwUm9sZShTeW5jaHJvbml6YXRpb25DaG9pY2VzLlNZTkNfRlJPTV9QUk9DRVNTKTsKLS8vCQl9Ci0vLwkJaWYgKGV2ZW50LndpZGdldCA9PSBicl9jb250QXJ0aWZhY3RbMV0gJiYgYnJfY29udEFydGlmYWN0WzFdLmdldFNlbGVjdGlvbigpKXsKLS8vCQkJc3luY0Nob2ljZXMuc2V0U3luY0NvbnRBcnRpZmFjdChTeW5jaHJvbml6YXRpb25DaG9pY2VzLlNZTkNfRlJPTV9QUk9DRVNTKTsKLS8vCQl9Ci0vLwkJaWYgKGV2ZW50LndpZGdldCA9PSBicl9kZWxpdlBhcnRbMV0gJiYgYnJfZGVsaXZQYXJ0WzFdLmdldFNlbGVjdGlvbigpKXsgCi0vLwkJCXN5bmNDaG9pY2VzLnNldFN5bmNEZWxpdlBhcnQoU3luY2hyb25pemF0aW9uQ2hvaWNlcy5TWU5DX0ZST01fUFJPQ0VTUyk7Ci0vLwkJfQotLy8JCWlmIChldmVudC53aWRnZXQgPT0gYnJfc2VsU3RlcFsxXSAmJiBicl9zZWxTdGVwWzFdLmdldFNlbGVjdGlvbigpKXsKLS8vCQkJc3luY0Nob2ljZXMuc2V0U3luY1NlbFN0ZXAoU3luY2hyb25pemF0aW9uQ2hvaWNlcy5TWU5DX0ZST01fUFJPQ0VTUyk7Ci0vLwkJfQotLy8vLwkJU3lzdGVtLm91dC5wcmludGxuKCIkJCQgIiArIHN5bmNDaG9pY2VzLnRvU3RyaW5nKCkpOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlI2lzUGFnZUNvbXBsZXRlKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1BhZ2VDb21wbGV0ZSgpIHsKLS8vCQlTeXN0ZW0ub3V0LnByaW50bG4oIiQkJCBERUJVRzogIiArIHN5bmNDaG9pY2VzLnRvU3RyaW5nKCkpOwotCQlpZiAoc3luY0Nob2ljZXMuZ2V0U3luY05hbWUoKSA+IDAgfHwKLQkJCXN5bmNDaG9pY2VzLmdldFN5bmNQcmVzTmFtZSgpID4gMCB8fAotCQkJc3luY0Nob2ljZXMuZ2V0U3luY0JyaWVmRGVzYygpID4gMCB8fAotCQkJc3luY0Nob2ljZXMuZ2V0U3luY09wdElucHV0KCkgPiAwIHx8Ci0JCQlzeW5jQ2hvaWNlcy5nZXRTeW5jTWFuSW5wdXQoKSA+IDAgfHwKLQkJCXN5bmNDaG9pY2VzLmdldFN5bmNPdXRwdXQoKSA+IDAgfHwKLQkJCXN5bmNDaG9pY2VzLmdldFN5bmNQcmltUGVyZm9ybWVyKCkgPiAwIHx8Ci0JCQlzeW5jQ2hvaWNlcy5nZXRTeW5jQWRkblBlcmZvcm1lcigpID4gMCB8fAotCQkJc3luY0Nob2ljZXMuZ2V0U3luY1Jlc3BSb2xlKCkgPiAwIHx8Ci0JCQlzeW5jQ2hvaWNlcy5nZXRTeW5jQ29udEFydGlmYWN0KCkgPiAwIHx8Ci0JCQlzeW5jQ2hvaWNlcy5nZXRTeW5jRGVsaXZQYXJ0KCkgPiAwIHx8Ci0JCQlzeW5jQ2hvaWNlcy5nZXRTeW5jU2VsU3RlcCgpID4gMCB8fAotCQkJc3luY0Nob2ljZXMuZ2V0U3luY0d1aWRhbmNlKCkgPiAwKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQkKLQl9Ci0JCi0vLwlwcml2YXRlIHZvaWQgY3JlYXRlVHdvUmFkaW9Hcm91cChDb21wb3NpdGUgcGFyZW50LCBCdXR0b25bXSByYnMpIHsKLS8vCQlDb21wb3NpdGUgYUdyb3VwID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsKLS8vCQkKLS8vCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKTsKLS8vCQlhR3JvdXAuc2V0TGF5b3V0KGxheW91dCk7Ci0vLwkJCi0vLwkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLS8vCQlnZC5ob3Jpem9udGFsU3BhbiA9IDI7Ci0vLwkJYUdyb3VwLnNldExheW91dERhdGEoZ2QpOwotLy8JCQotLy8JCXJic1swXSA9IGNyZWF0ZVJhZGlvQnV0dG9uKGFHcm91cCwgIiIsIDEsIHRydWUpOyAvLyROT04tTkxTLTEkCi0vLwkJcmJzWzFdID0gY3JlYXRlUmFkaW9CdXR0b24oYUdyb3VwLCAiIiwgMSwgZmFsc2UpOyAvLyROT04tTkxTLTEkCi0vLwkJCi0vLwkJcmJzWzBdLnNldEVuYWJsZWQoZmFsc2UpOwotLy8JCXJic1sxXS5zZXRFbmFibGVkKGZhbHNlKTsKLS8vCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS93aXphcmRzL1N5bmNocm9uaXphdGlvbldpemFyZC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS93aXphcmRzL1N5bmNocm9uaXphdGlvbldpemFyZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMjNjM2VhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvd2l6YXJkcy9TeW5jaHJvbml6YXRpb25XaXphcmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLndpemFyZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JTmV3V2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci0KLQotLyoqCi0gKiBUaGUgd2l6YXJkIHRoYXQgZ3VpZGVzIHVzZXIgdG8gZG8gY3VzdG9tIHN5bmNocm9uaXphdGlvbiBmb3IgcHJvY2VzcwotICogZGVzY3JpcHRvcnMgZnJvbSBtZXRob2QgZWxlbWVudHMuCi0gKiAKLSAqIEBhdXRob3IgQmluZ1h1ZSBYdQotICogQHNpbmNlIDEuMAotICoKLSAqLwotcHVibGljIGNsYXNzIFN5bmNocm9uaXphdGlvbldpemFyZCBleHRlbmRzIFdpemFyZCBpbXBsZW1lbnRzIElOZXdXaXphcmQgewotCi0JcHJpdmF0ZSBTeW5jaHJvbml6YXRpb25EZXNjcmlwdGlvblBhZ2UgZGVzY1BhZ2U7Ci0JcHJpdmF0ZSBTeW5jaHJvbml6YXRpb25TZWxlY3RDb25maWdQYWdlIHNlbGVjdENvbmZpZ1BhZ2U7Ci0JcHJpdmF0ZSBTeW5jaHJvbml6YXRpb25TZWxlY3REZXRhaWxzUGFnZSBzZWxlY3REZXRhaWxzUGFnZTsKLS8vCXByaXZhdGUgU3luY2hyb25pemF0aW9uUHJldmlld1BhZ2UgcHJldmlld1BhZ2U7Ci0JCi0JcHJpdmF0ZSBTeW5jaHJvbml6YXRpb25DaG9pY2VzIHN5bmNDaG9pY2VzID0gbnVsbDsKLQkKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBTeW5jaHJvbml6YXRpb25XaXphcmQoU3luY2hyb25pemF0aW9uQ2hvaWNlcyBjaG9pY2VzKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuc3luY0Nob2ljZXMgPSBjaG9pY2VzOwotCQlzZXRXaW5kb3dUaXRsZShBdXRob3JpbmdVSVJlc291cmNlcy5zeW5jaHJvbml6YXRpb25XaXphcmRfdGl0bGVfdGV4dCk7IAotCX0KLQkKLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZCNhZGRQYWdlcygpCi0JICovCi0JcHVibGljIHZvaWQgYWRkUGFnZXMoKSB7Ci0JCUltYWdlRGVzY3JpcHRvciBpbWFnZURlc2NyaXB0b3IgPSBBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCQkuZ2V0SW1hZ2VEZXNjcmlwdG9yKCJmdWxsL3dpemJhbi9zeW5jaHJvbml6YXRpb24uZ2lmIik7IC8vJE5PTi1OTFMtMSQKLQotCQlkZXNjUGFnZSA9IG5ldyBTeW5jaHJvbml6YXRpb25EZXNjcmlwdGlvblBhZ2UoCi0JCQkJIlN5bmNocm9uaXphdGlvbkRlc2NyaXB0aW9uUGFnZSIsIHN5bmNDaG9pY2VzKTsgLy8kTk9OLU5MUy0xJAotCQlkZXNjUGFnZS5zZXRJbWFnZURlc2NyaXB0b3IoaW1hZ2VEZXNjcmlwdG9yKTsKLQkJYWRkUGFnZShkZXNjUGFnZSk7Ci0KLQkJc2VsZWN0Q29uZmlnUGFnZSA9IG5ldyBTeW5jaHJvbml6YXRpb25TZWxlY3RDb25maWdQYWdlKAotCQkJCSJTeW5jaHJvbml6YXRpb25TZWxlY3RDb25maWdQYWdlIiwgc3luY0Nob2ljZXMpOyAvLyROT04tTkxTLTEkCi0JCXNlbGVjdENvbmZpZ1BhZ2Uuc2V0SW1hZ2VEZXNjcmlwdG9yKGltYWdlRGVzY3JpcHRvcik7Ci0JCWFkZFBhZ2Uoc2VsZWN0Q29uZmlnUGFnZSk7Ci0JCQotCQlzZWxlY3REZXRhaWxzUGFnZSA9IG5ldyBTeW5jaHJvbml6YXRpb25TZWxlY3REZXRhaWxzUGFnZSgKLQkJCQkiU3luY2hyb25pemF0aW9uU2VsZWN0RGV0YWlsc1BhZ2UiLCBzeW5jQ2hvaWNlcyk7IC8vJE5PTi1OTFMtMSQKLQkJc2VsZWN0RGV0YWlsc1BhZ2Uuc2V0SW1hZ2VEZXNjcmlwdG9yKGltYWdlRGVzY3JpcHRvcik7Ci0JCWFkZFBhZ2Uoc2VsZWN0RGV0YWlsc1BhZ2UpOwotCQkKLS8vCQlwcmV2aWV3UGFnZSA9IG5ldyBTeW5jaHJvbml6YXRpb25QcmV2aWV3UGFnZSgKLS8vCQkJCSJTeW5jaHJvbml6YXRpb25QcmV2aWV3UGFnZSIsIHN5bmNDaG9pY2VzKTsgLy8kTk9OLU5MUy0xJAotLy8JCXByZXZpZXdQYWdlLnNldEltYWdlRGVzY3JpcHRvcihpbWFnZURlc2NyaXB0b3IpOwotLy8JCWFkZFBhZ2UocHJldmlld1BhZ2UpOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkI2NhbkZpbmlzaCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2FuRmluaXNoKCkgewotCQlyZXR1cm4gKHNlbGVjdERldGFpbHNQYWdlLmlzUGFnZUNvbXBsZXRlKCkpOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmQjcGVyZm9ybUZpbmlzaCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gcGVyZm9ybUZpbmlzaCgpIHsKLQkJc3luY0Nob2ljZXMuc2V0RmluaXNoUHJlc3NlZCh0cnVlKTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZCNwZXJmb3JtQ2FuY2VsKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtQ2FuY2VsKCkgewotCQlzeW5jQ2hvaWNlcy5zZXRGaW5pc2hQcmVzc2VkKGZhbHNlKTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpemFyZCNpbml0KG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2gsIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb24pCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoIHdvcmtiZW5jaCwgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS93aXphcmRzL3BhY2thZ2UuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvd2l6YXJkcy9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjNTYwMGEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS93aXphcmRzL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIHdpemFyZHMgZm9yIGF1dGhvcmluZyBtZXRob2QgY29udGVudCBhbmQgcHJvY2Vzc2VzLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5iYXNlLy5wcm9qZWN0IGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmJhc2UvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxYmUwOTUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmJhc2UvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5lcGYuYmFzZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5iYXNlL01FVEEtSU5GL01BTklGRVNULk1GIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmJhc2UvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4YzFhNDIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmJhc2UvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVmZWF0dXJlUGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuZXBmLmJhc2U7IHNpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuNS4wLnF1YWxpZmllcgotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1FY2xpcHNlLUxhenlTdGFydDogdHJ1ZQotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYmFzZS9hYm91dC5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmJhc2UvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGM5OTA4Ni4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYmFzZS9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLSAKLTxwPkZlYnJ1YXJ5IDI0LCAyMDA1PC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudC48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYmFzZS9hYm91dC5pbmkgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYmFzZS9hYm91dC5pbmkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwNGY0ZmEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmJhc2UvYWJvdXQuaW5pCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbi4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0jIGFib3V0LmluaQotIyBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCBhIGZlYXR1cmUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgIiVrZXkiIGFyZSBleHRlcm5hbGl6ZWQgc3RyaW5ncyBkZWZpbmVkIGluIGFib3V0LnByb3BlcnRpZXMKLSMgVGhpcyBmaWxlIGRvZXMgbm90IG5lZWQgdG8gYmUgdHJhbnNsYXRlZC4KLQotIyBQcm9wZXJ0eSAiYWJvdXRUZXh0IiBjb250YWlucyBibHVyYiBmb3IgIkFib3V0IiBkaWFsb2cgKHRyYW5zbGF0ZWQpCi1hYm91dFRleHQ9JWZlYXR1cmVUZXh0Ci0KLSMgUHJvcGVydHkgImZlYXR1cmVJbWFnZSIgY29udGFpbnMgcGF0aCB0byBmZWF0dXJlIGltYWdlICgzMngzMikKLWZlYXR1cmVJbWFnZT1hcHBsaWNhdGlvbl8zMi5naWYKLQotIyBQcm9wZXJ0eSAiYXBwTmFtZSIgY29udGFpbnMgbmFtZSBvZiB0aGUgYXBwbGljYXRpb24gKHRyYW5zbGF0ZWQpCi1hcHBOYW1lPSVmZWF0dXJlTmFtZQotCi0jIFByb3BlcnR5ICJ3ZWxjb21lUGFnZSIgY29udGFpbnMgcGF0aCB0byB3ZWxjb21lIHBhZ2UgKHNwZWNpYWwgWE1MLWJhc2VkIGZvcm1hdCkKLXdlbGNvbWVQYWdlPSRubCQvd2VsY29tZS54bWwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5iYXNlL2Fib3V0Lm1hcHBpbmdzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmJhc2UvYWJvdXQubWFwcGluZ3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5ZGZkZGMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmJhc2UvYWJvdXQubWFwcGluZ3MKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLSMgYWJvdXQubWFwcGluZ3MKLSMgY29udGFpbnMgZmlsbC1pbnMgZm9yIGFib3V0LnByb3BlcnRpZXMKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgVGhpcyBmaWxlIGRvZXMgbm90IG5lZWQgdG8gYmUgdHJhbnNsYXRlZC4KLSMgVXN1YWxseSBnZW5lcmF0ZWQgYXQgYnVpbGQgdGltZS4KLQotMD1AYnVpbGQtSURACi0xPTEuNS4wCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYmFzZS9hYm91dC5wcm9wZXJ0aWVzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmJhc2UvYWJvdXQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDAwM2ViYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYmFzZS9hYm91dC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUgotCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyBEbyBub3QgY2hhbmdlIHRoZSBwcm9wZXJ0aWVzIGJldHdlZW4gdGhpcyBsaW5lIGFuZCB0aGUgbGFzdCBsaW5lIGNvbnRhaW5pbmc6Ci0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQotIyBJbnN0ZWFkLCBlaXRoZXIgcmVkZWZpbmUgYW4gZXhpc3RpbmcgcHJvcGVydHksIG9yIGNyZWF0ZSBhIG5ldyBwcm9wZXJ0eSwKLSMgYXBwZW5kIGl0IHRvIHRoZSBlbmQgb2YgdGhlIGZpbGUsIGFuZCBjaGFuZ2UgdGhlIGNvZGUgdG8gdXNlIHRoZSBuZXcgbmFtZS4KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSMgYWJvdXQucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgYWJvdXQuaW5pCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIGZpbGwtaW5zIGFyZSBzdXBwbGllZCBieSBhYm91dC5tYXBwaW5ncwotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0KLWZlYXR1cmVOYW1lPUVQRiBCYXNlCi0KLWZlYXR1cmVUZXh0PUVQRiBCYXNlXG5cCi1cblwKLVZlcnNpb246IHsxfSBcblwKLUJ1aWxkIExhYmVsOiB7MH1cblwKLVxuXAotKGMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyBhbmQgb3RoZXJzIDIwMDAsIDIwMDguICBBbGwgUmlnaHRzIFJlc2VydmVkLlxuXAotXG5cCi0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQotIyBUaGUgYWJvdmUgcHJvcGVydGllcyBoYXZlIGJlZW4gc2hpcHBlZCBmb3IgdHJhbnNsYXRpb24uCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmJhc2UvYXBwbGljYXRpb25fMzIuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmJhc2UvYXBwbGljYXRpb25fMzIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNmFkN2NjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5iYXNlL2FwcGxpY2F0aW9uXzMyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5iYXNlL2J1aWxkLnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYmFzZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YTA3NGI4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5iYXNlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi1iaW4uaW5jbHVkZXMgPSAuLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIGFib3V0LmluaSxcCi0gICAgICAgICAgICAgICBhYm91dC5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIGFwcGxpY2F0aW9uXzMyLmdpZixcCi0gICAgICAgICAgICAgICB3ZWxjb21lLnhtbCxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBhYm91dC5tYXBwaW5ncyxcCi0gICAgICAgICAgICAgICBubC8KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5iYXNlL25sL2RhL2Fib3V0LnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYmFzZS9ubC9kYS9hYm91dC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYzY5ZjYwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5iYXNlL25sL2RhL2Fib3V0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSCi0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jIERvIG5vdCBjaGFuZ2UgdGhlIHByb3BlcnRpZXMgYmV0d2VlbiB0aGlzIGxpbmUgYW5kIHRoZSBsYXN0IGxpbmUgY29udGFpbmluZzoKLSMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlCi0jIEluc3RlYWQsIGVpdGhlciByZWRlZmluZSBhbiBleGlzdGluZyBwcm9wZXJ0eSwgb3IgY3JlYXRlIGEgbmV3IHByb3BlcnR5LAotIyBhcHBlbmQgaXQgdG8gdGhlIGVuZCBvZiB0aGUgZmlsZSwgYW5kIGNoYW5nZSB0aGUgY29kZSB0byB1c2UgdGhlIG5ldyBuYW1lLgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotIyBhYm91dC5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBhYm91dC5pbmkKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgZmlsbC1pbnMgYXJlIHN1cHBsaWVkIGJ5IGFib3V0Lm1hcHBpbmdzCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLQotZmVhdHVyZU5hbWU9RVBGIC0gYmFzaXMKLQotZmVhdHVyZVRleHQ9RVBGIEJhc2VcblwKLVxuXAotVmVyc2lvbjogezF9IFxuXAotQnlnZ2VldGlrZXQ6IHswfVxuXAotXG5cCi0oYykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIGFuZCBvdGhlcnMgMjAwMCwgMjAwNy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cblwKLVxuCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyAlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUKLSMgVGhlIGFib3ZlIHByb3BlcnRpZXMgaGF2ZSBiZWVuIHNoaXBwZWQgZm9yIHRyYW5zbGF0aW9uLgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5iYXNlL25sL2RlL2Fib3V0LnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYmFzZS9ubC9kZS9hYm91dC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OWE4MWU4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5iYXNlL25sL2RlL2Fib3V0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSCi0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jIERvIG5vdCBjaGFuZ2UgdGhlIHByb3BlcnRpZXMgYmV0d2VlbiB0aGlzIGxpbmUgYW5kIHRoZSBsYXN0IGxpbmUgY29udGFpbmluZzoKLSMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlCi0jIEluc3RlYWQsIGVpdGhlciByZWRlZmluZSBhbiBleGlzdGluZyBwcm9wZXJ0eSwgb3IgY3JlYXRlIGEgbmV3IHByb3BlcnR5LAotIyBhcHBlbmQgaXQgdG8gdGhlIGVuZCBvZiB0aGUgZmlsZSwgYW5kIGNoYW5nZSB0aGUgY29kZSB0byB1c2UgdGhlIG5ldyBuYW1lLgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotIyBhYm91dC5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBhYm91dC5pbmkKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgZmlsbC1pbnMgYXJlIHN1cHBsaWVkIGJ5IGFib3V0Lm1hcHBpbmdzCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLQotZmVhdHVyZU5hbWU9RVBGIC0gQmFzaXMKLQotZmVhdHVyZVRleHQ9RVBGIC0gQmFzaXNcblwKLVxuXAotVmVyc2lvbjogezF9IFxuXAotQnVpbGQtS2VubnVuZzogezB9XG5cCi1cblwKLShjKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgYW5kIG90aGVycyAyMDAwLCAyMDA3LiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC5cblwKLVxuCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyAlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUKLSMgVGhlIGFib3ZlIHByb3BlcnRpZXMgaGF2ZSBiZWVuIHNoaXBwZWQgZm9yIHRyYW5zbGF0aW9uLgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5iYXNlL25sL2VzL2Fib3V0LnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYmFzZS9ubC9lcy9hYm91dC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZGZiNjMxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5iYXNlL25sL2VzL2Fib3V0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSCi0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jIERvIG5vdCBjaGFuZ2UgdGhlIHByb3BlcnRpZXMgYmV0d2VlbiB0aGlzIGxpbmUgYW5kIHRoZSBsYXN0IGxpbmUgY29udGFpbmluZzoKLSMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlCi0jIEluc3RlYWQsIGVpdGhlciByZWRlZmluZSBhbiBleGlzdGluZyBwcm9wZXJ0eSwgb3IgY3JlYXRlIGEgbmV3IHByb3BlcnR5LAotIyBhcHBlbmQgaXQgdG8gdGhlIGVuZCBvZiB0aGUgZmlsZSwgYW5kIGNoYW5nZSB0aGUgY29kZSB0byB1c2UgdGhlIG5ldyBuYW1lLgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotIyBhYm91dC5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBhYm91dC5pbmkKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgZmlsbC1pbnMgYXJlIHN1cHBsaWVkIGJ5IGFib3V0Lm1hcHBpbmdzCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLQotZmVhdHVyZU5hbWU9RVBGIEJhc2UKLQotZmVhdHVyZVRleHQ9RVBGIEJhc2VcblwKLVxuXAotVmVyc2lcdTAwZjNuOiB7MX0gXG5cCi1FdGlxdWV0YSBkZSBidWlsZDogezB9XG5cCi1cblwKLShjKSBDb3B5cmlnaHQgQ29sYWJvcmFkb3JlcyBkZSBFY2xpcHNlIHkgb3Ryb3MgMjAwMCwgMjAwNy4gIFJlc2VydmFkb3MgdG9kb3MgbG9zIGRlcmVjaG9zLlxuXAotXG4KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQotIyBUaGUgYWJvdmUgcHJvcGVydGllcyBoYXZlIGJlZW4gc2hpcHBlZCBmb3IgdHJhbnNsYXRpb24uCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmJhc2UvbmwvZnIvYWJvdXQucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5iYXNlL25sL2ZyL2Fib3V0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmMjcwMmYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmJhc2UvbmwvZnIvYWJvdXQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgRG8gbm90IGNoYW5nZSB0aGUgcHJvcGVydGllcyBiZXR3ZWVuIHRoaXMgbGluZSBhbmQgdGhlIGxhc3QgbGluZSBjb250YWluaW5nOgotIyAlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUKLSMgSW5zdGVhZCwgZWl0aGVyIHJlZGVmaW5lIGFuIGV4aXN0aW5nIHByb3BlcnR5LCBvciBjcmVhdGUgYSBuZXcgcHJvcGVydHksCi0jIGFwcGVuZCBpdCB0byB0aGUgZW5kIG9mIHRoZSBmaWxlLCBhbmQgY2hhbmdlIHRoZSBjb2RlIHRvIHVzZSB0aGUgbmV3IG5hbWUuCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0jIGFib3V0LnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGFib3V0LmluaQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBmaWxsLWlucyBhcmUgc3VwcGxpZWQgYnkgYWJvdXQubWFwcGluZ3MKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotCi1mZWF0dXJlTmFtZT1CYXNlIEVQRgotCi1mZWF0dXJlVGV4dD1FUEYgQmFzZVxuXAotXG5cCi1WZXJzaW9uIDogezF9IFxuXAotTGliZWxsXHUwMGU5IGRlIHZlcnNpb24gOiB7MH1cblwKLVxuXAotKGMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyBhbmQgb3RoZXJzIDIwMDAsIDIwMDcuICBBbGwgUmlnaHRzIFJlc2VydmVkLlxuXAotXG4KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQotIyBUaGUgYWJvdmUgcHJvcGVydGllcyBoYXZlIGJlZW4gc2hpcHBlZCBmb3IgdHJhbnNsYXRpb24uCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmJhc2UvbmwvaXQvYWJvdXQucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5iYXNlL25sL2l0L2Fib3V0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3ZGRiZGQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmJhc2UvbmwvaXQvYWJvdXQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgRG8gbm90IGNoYW5nZSB0aGUgcHJvcGVydGllcyBiZXR3ZWVuIHRoaXMgbGluZSBhbmQgdGhlIGxhc3QgbGluZSBjb250YWluaW5nOgotIyAlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUKLSMgSW5zdGVhZCwgZWl0aGVyIHJlZGVmaW5lIGFuIGV4aXN0aW5nIHByb3BlcnR5LCBvciBjcmVhdGUgYSBuZXcgcHJvcGVydHksCi0jIGFwcGVuZCBpdCB0byB0aGUgZW5kIG9mIHRoZSBmaWxlLCBhbmQgY2hhbmdlIHRoZSBjb2RlIHRvIHVzZSB0aGUgbmV3IG5hbWUuCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0jIGFib3V0LnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGFib3V0LmluaQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBmaWxsLWlucyBhcmUgc3VwcGxpZWQgYnkgYWJvdXQubWFwcGluZ3MKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotCi1mZWF0dXJlTmFtZT1FUEYgQmFzZQotCi1mZWF0dXJlVGV4dD1FUEYgQmFzZVxuXAotXG5cCi1WZXJzaW9uZTogezF9IFxuXAotRXRpY2hldHRhIGJ1aWxkOiB7MH1cblwKLVxuXAotKGMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyBlIGFsdHJpIDIwMDAsIDIwMDcuICBUdXR0aSBpIGRpcml0dGkgcmlzZXJ2YXRpLlxuXAotXG4KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQotIyBUaGUgYWJvdmUgcHJvcGVydGllcyBoYXZlIGJlZW4gc2hpcHBlZCBmb3IgdHJhbnNsYXRpb24uCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmJhc2UvbmwvamEvYWJvdXQucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5iYXNlL25sL2phL2Fib3V0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkMDFkNTEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmJhc2UvbmwvamEvYWJvdXQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgRG8gbm90IGNoYW5nZSB0aGUgcHJvcGVydGllcyBiZXR3ZWVuIHRoaXMgbGluZSBhbmQgdGhlIGxhc3QgbGluZSBjb250YWluaW5nOgotIyAlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUKLSMgSW5zdGVhZCwgZWl0aGVyIHJlZGVmaW5lIGFuIGV4aXN0aW5nIHByb3BlcnR5LCBvciBjcmVhdGUgYSBuZXcgcHJvcGVydHksCi0jIGFwcGVuZCBpdCB0byB0aGUgZW5kIG9mIHRoZSBmaWxlLCBhbmQgY2hhbmdlIHRoZSBjb2RlIHRvIHVzZSB0aGUgbmV3IG5hbWUuCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0jIGFib3V0LnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGFib3V0LmluaQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBmaWxsLWlucyBhcmUgc3VwcGxpZWQgYnkgYWJvdXQubWFwcGluZ3MKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotCi1mZWF0dXJlTmFtZT1FUEYgQmFzZQotCi1mZWF0dXJlVGV4dD1FUEYgQmFzZVxuXAotXG5cCi1cdTMwZDBcdTMwZmNcdTMwYjhcdTMwZTdcdTMwZjM6IHsxfSBcblwKLVx1MzBkM1x1MzBlYlx1MzBjOVx1MzBmYlx1MzBlOVx1MzBkOVx1MzBlYjogezB9XG5cCi1cblwKLShjKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgYW5kIG90aGVycyAyMDAwLCAyMDA3LiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC5cblwKLVxuCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyAlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUKLSMgVGhlIGFib3ZlIHByb3BlcnRpZXMgaGF2ZSBiZWVuIHNoaXBwZWQgZm9yIHRyYW5zbGF0aW9uLgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5iYXNlL25sL2tvL2Fib3V0LnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYmFzZS9ubC9rby9hYm91dC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOGM2NmYwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5iYXNlL25sL2tvL2Fib3V0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSCi0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jIERvIG5vdCBjaGFuZ2UgdGhlIHByb3BlcnRpZXMgYmV0d2VlbiB0aGlzIGxpbmUgYW5kIHRoZSBsYXN0IGxpbmUgY29udGFpbmluZzoKLSMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlCi0jIEluc3RlYWQsIGVpdGhlciByZWRlZmluZSBhbiBleGlzdGluZyBwcm9wZXJ0eSwgb3IgY3JlYXRlIGEgbmV3IHByb3BlcnR5LAotIyBhcHBlbmQgaXQgdG8gdGhlIGVuZCBvZiB0aGUgZmlsZSwgYW5kIGNoYW5nZSB0aGUgY29kZSB0byB1c2UgdGhlIG5ldyBuYW1lLgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotIyBhYm91dC5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBhYm91dC5pbmkKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgZmlsbC1pbnMgYXJlIHN1cHBsaWVkIGJ5IGFib3V0Lm1hcHBpbmdzCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLQotZmVhdHVyZU5hbWU9RVBGIFx1YWUzMFx1YmNmOAotCi1mZWF0dXJlVGV4dD1FUEYgXHVhZTMwXHViY2Y4XG5cCi1cblwKLVx1YmM4NFx1YzgwNDogezF9IFxuXAotXHViZTRjXHViNGRjIFx1YjgwOFx1Yzc3NFx1YmUxNDogezB9XG5cCi1cblwKLShjKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgYW5kIG90aGVycyAyMDAwLCAyMDA3LiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC5cblwKLVxuCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyAlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUKLSMgVGhlIGFib3ZlIHByb3BlcnRpZXMgaGF2ZSBiZWVuIHNoaXBwZWQgZm9yIHRyYW5zbGF0aW9uLgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5iYXNlL25sL3B0L0JSL2Fib3V0LnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYmFzZS9ubC9wdC9CUi9hYm91dC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZGZjOWYyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5iYXNlL25sL3B0L0JSL2Fib3V0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSCi0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jIERvIG5vdCBjaGFuZ2UgdGhlIHByb3BlcnRpZXMgYmV0d2VlbiB0aGlzIGxpbmUgYW5kIHRoZSBsYXN0IGxpbmUgY29udGFpbmluZzoKLSMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlCi0jIEluc3RlYWQsIGVpdGhlciByZWRlZmluZSBhbiBleGlzdGluZyBwcm9wZXJ0eSwgb3IgY3JlYXRlIGEgbmV3IHByb3BlcnR5LAotIyBhcHBlbmQgaXQgdG8gdGhlIGVuZCBvZiB0aGUgZmlsZSwgYW5kIGNoYW5nZSB0aGUgY29kZSB0byB1c2UgdGhlIG5ldyBuYW1lLgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotIyBhYm91dC5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBhYm91dC5pbmkKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgZmlsbC1pbnMgYXJlIHN1cHBsaWVkIGJ5IGFib3V0Lm1hcHBpbmdzCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLQotZmVhdHVyZU5hbWU9QmFzZSBFUEYKLQotZmVhdHVyZVRleHQ9QmFzZSBFUEZcblwKLVxuXAotVmVyc1x1MDBlM286IHsxfSBcblwKLUNvbnN0cnVcdTAwZTdcdTAwZTNvOiB7MH1cblwKLVxuXAotKGMpIENvcHlyaWdodCBjb250cmlidWlkb3JlcyBFY2xpcHNlIGUgb3V0cm9zIDIwMDAsIDIwMDcuIFRvZG9zIG9zIERpcmVpdG9zIFJlc2VydmFkb3MuXG5cCi1cbgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlCi0jIFRoZSBhYm92ZSBwcm9wZXJ0aWVzIGhhdmUgYmVlbiBzaGlwcGVkIGZvciB0cmFuc2xhdGlvbi4KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYmFzZS9ubC9ydS9hYm91dC5wcm9wZXJ0aWVzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmJhc2UvbmwvcnUvYWJvdXQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWE3YjkyYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYmFzZS9ubC9ydS9hYm91dC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUgotCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyBEbyBub3QgY2hhbmdlIHRoZSBwcm9wZXJ0aWVzIGJldHdlZW4gdGhpcyBsaW5lIGFuZCB0aGUgbGFzdCBsaW5lIGNvbnRhaW5pbmc6Ci0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQotIyBJbnN0ZWFkLCBlaXRoZXIgcmVkZWZpbmUgYW4gZXhpc3RpbmcgcHJvcGVydHksIG9yIGNyZWF0ZSBhIG5ldyBwcm9wZXJ0eSwKLSMgYXBwZW5kIGl0IHRvIHRoZSBlbmQgb2YgdGhlIGZpbGUsIGFuZCBjaGFuZ2UgdGhlIGNvZGUgdG8gdXNlIHRoZSBuZXcgbmFtZS4KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSMgYWJvdXQucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgYWJvdXQuaW5pCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIGZpbGwtaW5zIGFyZSBzdXBwbGllZCBieSBhYm91dC5tYXBwaW5ncwotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0KLWZlYXR1cmVOYW1lPVx1MDQxMVx1MDQzMFx1MDQzN1x1MDQzZVx1MDQzMlx1MDQ0Ylx1MDQzOSBcdTA0M2FcdTA0M2VcdTA0M2NcdTA0M2ZcdTA0M2JcdTA0MzVcdTA0M2FcdTA0NDIgRVBGCi0KLWZlYXR1cmVUZXh0PVx1MDQxMVx1MDQzMFx1MDQzN1x1MDQzZVx1MDQzMlx1MDQ0Ylx1MDQzOSBcdTA0M2FcdTA0M2VcdTA0M2NcdTA0M2ZcdTA0M2JcdTA0MzVcdTA0M2FcdTA0NDIgRVBGXG5cCi1cblwKLVx1MDQxMlx1MDQzNVx1MDQ0MFx1MDQ0MVx1MDQzOFx1MDQ0ZjogezF9IFxuXAotXHUwNDFhXHUwNDNlXHUwNDNjXHUwNDNmXHUwNDNlXHUwNDNkXHUwNDNlXHUwNDMyXHUwNDNhXHUwNDMwOiB7MH1cblwKLVxuXAotKGMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyBhbmQgb3RoZXJzIDIwMDAsIDIwMDcuICBcdTA0MTJcdTA0NDFcdTA0MzUgXHUwNDNmXHUwNDQwXHUwNDMwXHUwNDMyXHUwNDMwIFx1MDQzN1x1MDQzMFx1MDQ0OVx1MDQzOFx1MDQ0OVx1MDQzNVx1MDQzZFx1MDQ0Yi5cblwKLVxuCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyAlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUKLSMgVGhlIGFib3ZlIHByb3BlcnRpZXMgaGF2ZSBiZWVuIHNoaXBwZWQgZm9yIHRyYW5zbGF0aW9uLgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5iYXNlL25sL3poL0NOL2Fib3V0LnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYmFzZS9ubC96aC9DTi9hYm91dC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OTRhYjI4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5iYXNlL25sL3poL0NOL2Fib3V0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSCi0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jIERvIG5vdCBjaGFuZ2UgdGhlIHByb3BlcnRpZXMgYmV0d2VlbiB0aGlzIGxpbmUgYW5kIHRoZSBsYXN0IGxpbmUgY29udGFpbmluZzoKLSMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlCi0jIEluc3RlYWQsIGVpdGhlciByZWRlZmluZSBhbiBleGlzdGluZyBwcm9wZXJ0eSwgb3IgY3JlYXRlIGEgbmV3IHByb3BlcnR5LAotIyBhcHBlbmQgaXQgdG8gdGhlIGVuZCBvZiB0aGUgZmlsZSwgYW5kIGNoYW5nZSB0aGUgY29kZSB0byB1c2UgdGhlIG5ldyBuYW1lLgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotIyBhYm91dC5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBhYm91dC5pbmkKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgZmlsbC1pbnMgYXJlIHN1cHBsaWVkIGJ5IGFib3V0Lm1hcHBpbmdzCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLQotZmVhdHVyZU5hbWU9RVBGIEJhc2UKLQotZmVhdHVyZVRleHQ9RVBGIEJhc2VcblwKLVxuXAotXHU3MjQ4XHU2NzJjXHVmZjFhezF9IFxuXAotXHU1ZGU1XHU0ZjVjXHU3MjQ4XHU2NzJjXHU2ODA3XHU3YjdlXHVmZjFhezB9XG5cCi1cblwKLShjKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgYW5kIG90aGVycyAyMDAwLCAyMDA3LiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiBcbgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlCi0jIFRoZSBhYm92ZSBwcm9wZXJ0aWVzIGhhdmUgYmVlbiBzaGlwcGVkIGZvciB0cmFuc2xhdGlvbi4KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYmFzZS9ubC96aC9UVy9hYm91dC5wcm9wZXJ0aWVzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmJhc2UvbmwvemgvVFcvYWJvdXQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2EyMDEwNy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYmFzZS9ubC96aC9UVy9hYm91dC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUgotCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyBEbyBub3QgY2hhbmdlIHRoZSBwcm9wZXJ0aWVzIGJldHdlZW4gdGhpcyBsaW5lIGFuZCB0aGUgbGFzdCBsaW5lIGNvbnRhaW5pbmc6Ci0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQotIyBJbnN0ZWFkLCBlaXRoZXIgcmVkZWZpbmUgYW4gZXhpc3RpbmcgcHJvcGVydHksIG9yIGNyZWF0ZSBhIG5ldyBwcm9wZXJ0eSwKLSMgYXBwZW5kIGl0IHRvIHRoZSBlbmQgb2YgdGhlIGZpbGUsIGFuZCBjaGFuZ2UgdGhlIGNvZGUgdG8gdXNlIHRoZSBuZXcgbmFtZS4KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSMgYWJvdXQucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgYWJvdXQuaW5pCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIGZpbGwtaW5zIGFyZSBzdXBwbGllZCBieSBhYm91dC5tYXBwaW5ncwotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0KLWZlYXR1cmVOYW1lPUVQRiBCYXNlCi0KLWZlYXR1cmVUZXh0PUVQRiBCYXNlXG5cCi1cblwKLVx1NzI0OFx1NjcyY1x1ZmYxYXsxfVxuXAotXHU1ZWZhXHU3ZjZlXHU2YTE5XHU3YzY0XHVmZjFhezB9XG5cCi1cblwKLShjKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgYW5kIG90aGVycyAyMDAwLCAyMDA3LiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC5cblwKLVxuCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyAlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUKLSMgVGhlIGFib3ZlIHByb3BlcnRpZXMgaGF2ZSBiZWVuIHNoaXBwZWQgZm9yIHRyYW5zbGF0aW9uLgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5iYXNlL3BsdWdpbi5wcm9wZXJ0aWVzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmJhc2UvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyNTYwM2IuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmJhc2UvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUgotCi0jIFBsdWctaW4KLWZlYXR1cmVQbHVnaW5OYW1lPUVQRiBCYXNlIEZlYXR1cmUKLWZlYXR1cmVQbHVnaW5OYW1lTkw9RVBGIEJhc2UgRmVhdHVyZSAoTkwxKQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmJhc2Uvd2VsY29tZS54bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYmFzZS93ZWxjb21lLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjY0MGQwNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYmFzZS93ZWxjb21lLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiA/PiAKLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotPHdlbGNvbWVQYWdlIAotCXRpdGxlPSJFY2xpcHNlIFByb2Nlc3MgRnJhbWV3b3JrIj4KLQotPGludHJvPldlbGNvbWUgdG8gRWNsaXBzZSBQcm9jZXNzIEZyYW1ld29yawotPC9pbnRybz4KLQotPGl0ZW0+PGI+V2hhdCBpcyBFY2xpcHNlIFByb2Nlc3MgRnJhbWV3b3JrPzwvYj4KLQkKLTwvaXRlbT4KLQotPGl0ZW0+PGI+TGVhcm4gTW9yZTwvYj4KLQotPC9pdGVtPgotCi08L3dlbGNvbWVQYWdlPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5zZXJ2aWNlLy5jbGFzc3BhdGggYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLnNlcnZpY2UvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzUxYzhmMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLnNlcnZpY2UvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24uc2VydmljZS8ucHJvamVjdCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24uc2VydmljZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjJiZmE3My4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLnNlcnZpY2UvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5lcGYuY29tbW9uLnNlcnZpY2U8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5zZXJ2aWNlL01FVEEtSU5GL01BTklGRVNULk1GIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5zZXJ2aWNlL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ODY1MzQ4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24uc2VydmljZS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnNlcnZpY2U7c2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS41LjAucXVhbGlmaWVyCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnNlcnZpY2UuU2VydmljZVBsdWdpbgotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZSwKLSBvcmcuZWNsaXBzZS5lcGYuY29tbW9uO3Zpc2liaWxpdHk6PXJlZXhwb3J0Ci1FY2xpcHNlLUxhenlTdGFydDogdHJ1ZQotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41Ci1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5zZXJ2aWNlLnV0aWxzLAotIG9yZy5lY2xpcHNlLmVwZi5jb21tb24uc2VydmljZS52ZXJzaW9uaW5nCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLnNlcnZpY2UvYnVpbGQucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24uc2VydmljZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNjc0MjZmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24uc2VydmljZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1zb3VyY2UuLiA9IHNyYy8KLW91dHB1dC4uID0gYmluLwotYmluLmluY2x1ZGVzID0gTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIC4sXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBzY2hlbWEvLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLnNlcnZpY2UvcGx1Z2luLnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLnNlcnZpY2UvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyMTJkYTUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5zZXJ2aWNlL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLQotIyBQbHVnLWluCi1wbHVnaW5OYW1lPUVQRiBDb21tb24gU2VydmljZQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLnNlcnZpY2UvcGx1Z2luLnhtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24uc2VydmljZS9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMDhiNzhkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24uc2VydmljZS9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjIiPz4KLTxwbHVnaW4+Ci0gICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJ2ZXJzaW9uIiBuYW1lPSJWZXJzaW9uIiBzY2hlbWE9InNjaGVtYS9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLnZlcnNpb24uZXhzZCIvPgotICAgPGV4dGVuc2lvbi1wb2ludCBpZD0iY29tbWFuZExpbmVSdW5uZXJzIiBuYW1lPSJDb21tYW5kTGluZVJ1bm5lcnMiIHNjaGVtYT0ic2NoZW1hL2NvbW1hbmRMaW5lUnVubmVycy5leHNkIi8+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBpZD0iZXBmIgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmVwZi5jb21tb24uc2VydmljZS52ZXJzaW9uIj4KLSAgICAgICAgIDx2ZXJzaW9ucwotICAgICAgICAgCWNsYXNzPSJvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnNlcnZpY2UudmVyc2lvbmluZy5FUEZWZXJzaW9ucyIvPgotICAgPC9leHRlbnNpb24+Ci0KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5zZXJ2aWNlL3NjaGVtYS9jb21tYW5kTGluZVJ1bm5lcnMuZXhzZCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24uc2VydmljZS9zY2hlbWEvY29tbWFuZExpbmVSdW5uZXJzLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2ZmM3M2EuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5zZXJ2aWNlL3NjaGVtYS9jb21tYW5kTGluZVJ1bm5lcnMuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDExOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS5lcGYuY29tbW9uIj4KLTxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS5lcGYuY29tbW9uIiBpZD0iY29tbWFuZExpbmVSdW5uZXJzIiBuYW1lPSJDb21tYW5kTGluZVJ1bm5lcnMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgSUNvbW1hbmRMaW5lUnVubmVyIG9iamVjdCB0aGF0IGNhbiBiZSBhY2Nlc3NlZCBhbmQgcnVuIGZyb20gUnVuVXRpbCwgcHJvdmlkZWQgd2l0aCBydW5uZXJJZAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJjb21tYW5kTGluZVJ1bm5lciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJjb21tYW5kTGluZVJ1bm5lciI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InJ1bm5lcklkIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAxLjIKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIGV4dGVuc2lvbiBwb2ludCB1c2FnZSBleGFtcGxlIGhlcmUuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuSUNvbW1hbmRMaW5lUnVubmVyCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBpbmZvcm1hdGlvbiBhYm91dCBzdXBwbGllZCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGV4dGVuc2lvbiBwb2ludC5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5zZXJ2aWNlL3NjaGVtYS9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLnZlcnNpb24uZXhzZCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24uc2VydmljZS9zY2hlbWEvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi52ZXJzaW9uLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1ZTI1YTkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5zZXJ2aWNlL3NjaGVtYS9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLnZlcnNpb24uZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDEzNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS5lcGYuY29tbW9uIj4KLTxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS5lcGYuY29tbW9uIiBpZD0ib3JnLmVjbGlwc2UuZXBmLmNvbW1vbi52ZXJzaW9uIiBuYW1lPSJWZXJzaW9uIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIERlZmluZSBzY2hlbWEvdG9vbCB2ZXJzaW9ucwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJ2ZXJzaW9ucyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0ibGlicmFyeUV4dGVuc2lvblZlcnNpb25DaGVjayIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSB0cmFuc2xhdGFibGU9InRydWUiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0idmVyc2lvbnMiPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIGtpbmQ9ImphdmEiIGJhc2VkT249Im9yZy5lY2xpcHNlLmVwZi5jb21tb24uc2VydmljZWFiaWxpdHkuVmVyc2lvbnMiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0ibGlicmFyeUV4dGVuc2lvblZlcnNpb25DaGVjayI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUga2luZD0iamF2YSIgYmFzZWRPbj0ib3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5zZXJ2aWNlYWJpbGl0eS5JTGlicmFyeUV4dGVuc2lvblZlcnNpb25DaGVjayIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgdGhlIGZpcnN0IHJlbGVhc2UgaW4gd2hpY2ggdGhpcyBleHRlbnNpb24gcG9pbnQgYXBwZWFycy5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBleHRlbnNpb24gcG9pbnQgdXNhZ2UgZXhhbXBsZSBoZXJlLl0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgQVBJIGluZm9ybWF0aW9uIGhlcmUuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgaW5mb3JtYXRpb24gYWJvdXQgc3VwcGxpZWQgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBleHRlbnNpb24gcG9pbnQuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5zZXJ2aWNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3NlcnZpY2UvU2VydmljZVBsdWdpbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5zZXJ2aWNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3NlcnZpY2UvU2VydmljZVBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmM2U1YTlkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24uc2VydmljZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi9zZXJ2aWNlL1NlcnZpY2VQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5zZXJ2aWNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5BYnN0cmFjdEFjdGl2YXRvcjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotLyoqCi0gKiBUaGUgYWN0aXZhdG9yIGNsYXNzIGNvbnRyb2xzIHRoZSBwbHVnLWluIGxpZmUgY3ljbGUKLSAqLwotcHVibGljIGNsYXNzIFNlcnZpY2VQbHVnaW4gZXh0ZW5kcyBBYnN0cmFjdEFjdGl2YXRvciB7Ci0KLQkvLyBUaGUgc2hhcmVkIHBsdWctaW4gaW5zdGFuY2UuCi0JcHJpdmF0ZSBzdGF0aWMgU2VydmljZVBsdWdpbiBwbHVnaW47Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBTZXJ2aWNlUGx1Z2luKCkgewotCQlzdXBlcigpOwotCQlwbHVnaW4gPSB0aGlzOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5wbHVnaW4uQWJzdHJhY3RQbHVnaW4jc3RhcnQob3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQpCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RhcnQoY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnBsdWdpbi5BYnN0cmFjdFBsdWdpbiNzdG9wKG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RvcChjb250ZXh0KTsKLQkJcGx1Z2luID0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBzaGFyZWQgaW5zdGFuY2UuCi0JICogCi0JICogQHJldHVybiB0aGUgc2hhcmVkIHBsdWctaW4gaW5zdGFuY2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFNlcnZpY2VQbHVnaW4gZ2V0RGVmYXVsdCgpIHsKLQkJcmV0dXJuIHBsdWdpbjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24uc2VydmljZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi9zZXJ2aWNlL3V0aWxzL0NvbW1hbmRMaW5lUnVuVXRpbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5zZXJ2aWNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3NlcnZpY2UvdXRpbHMvQ29tbWFuZExpbmVSdW5VdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkZGNkMTEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5zZXJ2aWNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3NlcnZpY2UvdXRpbHMvQ29tbWFuZExpbmVSdW5VdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5zZXJ2aWNlLnV0aWxzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci0KLS8qKgotICogVXRpbGl0eSBjbGFzcyBmb3IgZXhjdXRpbmcgYSBJQ29tbWFuZExpbmVSdW5uZXIgb2JqZWN0J3MgZXhlY3V0ZSBtZXRob2QKLSAqIAotICogQGF1dGhvciBXZWlwaW5nIEx1Ci0gKiBAc2luY2UgMS4yCi0gKi8KLXB1YmxpYyBjbGFzcyBDb21tYW5kTGluZVJ1blV0aWwgewotCQotCXByaXZhdGUgc3RhdGljIENvbW1hbmRMaW5lUnVuVXRpbCBpbnN0YW5jZSA9IG5ldyBDb21tYW5kTGluZVJ1blV0aWwoKTsKLQlwcml2YXRlIGJvb2xlYW4gbmVlZFRvUnVuID0gZmFsc2U7Ci0JCi0JcHVibGljIHN0YXRpYyBDb21tYW5kTGluZVJ1blV0aWwgZ2V0SW5zdGFuY2UoKSB7Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci0JCi0JcHVibGljIENvbW1hbmRMaW5lUnVuVXRpbCgpIHsJCQotCX0JCi0JCi0JcHVibGljIGJvb2xlYW4gZXhlY3V0ZShTdHJpbmdbXSBhcmdzKSB7Ci0JCS8vRm9yIGdlbmVyYWwgY2FzZSwgYXJncyBzaG91bGQgYmUgcGFyc2VkIGhlcmUgdG8gY2FsbCBvbiByaWdodCBydW5uZXJJZC4KLQkJLy9mb3Igbm93LCBqdXN0IGhhcmQgY29kZSBpdCB3aXRoICJjb21tYW5kTGluZVBsdWdpbkltcG9ydGVyIgotCQlleGVjdXRlQ29tbWFuZFJ1bm5lcihhcmdzLCAiY29tbWFuZExpbmVQbHVnaW5JbXBvcnRlciIpOwkvLyROT04tTkxTLTEkIAotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCXByb3RlY3RlZCBib29sZWFuIGV4ZWN1dGVDb21tYW5kUnVubmVyKFN0cmluZ1tdIGFyZ3MsIFN0cmluZyBydW5uZXJJZCkgewotCQlJQ29tbWFuZExpbmVSdW5uZXIgcnVubmVyID0gZ2V0UnVubmVyKHJ1bm5lcklkKTsKLQkJaWYgKHJ1bm5lciAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gcnVubmVyLmV4ZWN1dGUoYXJncyk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBJQ29tbWFuZExpbmVSdW5uZXIgZ2V0UnVubmVyKFN0cmluZyBpZCkgewotCQlJRXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkgPSBQbGF0Zm9ybQotCQkJCS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpOwotCQlJRXh0ZW5zaW9uUG9pbnQgZXh0ZW5zaW9uUG9pbnQgPSBleHRlbnNpb25SZWdpc3RyeQotCQkJCS5nZXRFeHRlbnNpb25Qb2ludCgKLQkJCQkJCSJvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnNlcnZpY2UiLCAiY29tbWFuZExpbmVSdW5uZXJzIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAkJCQotCQlpZiAoZXh0ZW5zaW9uUG9pbnQgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJCi0JCUlFeHRlbnNpb25bXSBleHRlbnNpb25zID0gZXh0ZW5zaW9uUG9pbnQuZ2V0RXh0ZW5zaW9ucygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGV4dGVuc2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCUlFeHRlbnNpb24gZXh0ZW5zaW9uID0gZXh0ZW5zaW9uc1tpXTsKLQkJCVN0cmluZyBwbHVnaW5JZCA9IGV4dGVuc2lvbi5nZXROYW1lc3BhY2VJZGVudGlmaWVyKCk7Ci0JCQlCdW5kbGUgYnVuZGxlID0gUGxhdGZvcm0uZ2V0QnVuZGxlKHBsdWdpbklkKTsKLQkJCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGNvbmZpZ0VsZW1lbnRzID0gZXh0ZW5zaW9uCi0JCQkJCS5nZXRDb25maWd1cmF0aW9uRWxlbWVudHMoKTsKLQkJCWZvciAoaW50IGogPSAwOyBqIDwgY29uZmlnRWxlbWVudHMubGVuZ3RoOyBqKyspIHsKLQkJCQlJQ29uZmlndXJhdGlvbkVsZW1lbnQgY29uZmlnRWxlbWVudCA9IGNvbmZpZ0VsZW1lbnRzW2pdOwotCQkJCVN0cmluZyBydW5uZXJJZCA9IGNvbmZpZ0VsZW1lbnQuZ2V0QXR0cmlidXRlKCJydW5uZXJJZCIpOyAvLyROT04tTkxTLTEkCi0JCQkJaWYgKHJ1bm5lcklkID09IG51bGwpIHsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJCXJ1bm5lcklkID0gcnVubmVySWQudHJpbSgpOwotCQkJCWlmICghIHJ1bm5lcklkLmVxdWFscyhpZCkpIHsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJCVN0cmluZyBjbGFzc05hbWUgPSBjb25maWdFbGVtZW50LmdldEF0dHJpYnV0ZSgiY2xhc3MiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWlmIChjbGFzc05hbWUgPT0gbnVsbCkgewotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJY2xhc3NOYW1lID0gY2xhc3NOYW1lLnRyaW0oKTsKLQkJCQl0cnkgewotCQkJCQlJQ29tbWFuZExpbmVSdW5uZXIgcnVubmVyID0gKElDb21tYW5kTGluZVJ1bm5lcikgYnVuZGxlLmxvYWRDbGFzcyhjbGFzc05hbWUpLm5ld0luc3RhbmNlKCk7Ci0JCQkJCXJldHVybiBydW5uZXI7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsJCQkJCQotCQkJCX0KLQkJCX0KLQkJfQkKLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc05lZWRUb1J1bigpIHsKLQkJcmV0dXJuIG5lZWRUb1J1bjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXROZWVkVG9SdW4oYm9vbGVhbiBuZWVkVG9SdW4pIHsKLQkJdGhpcy5uZWVkVG9SdW4gPSBuZWVkVG9SdW47Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldEluc3RhbmNlKENvbW1hbmRMaW5lUnVuVXRpbCBpbnN0YW5jZSkgewotCQlDb21tYW5kTGluZVJ1blV0aWwuaW5zdGFuY2UgPSBpbnN0YW5jZTsKLQl9Ci0KLQkKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24uc2VydmljZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi9zZXJ2aWNlL3V0aWxzL0NvbW1hbmRMaW5lUnVubmVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLnNlcnZpY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vc2VydmljZS91dGlscy9Db21tYW5kTGluZVJ1bm5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZTRkNTgxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24uc2VydmljZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi9zZXJ2aWNlL3V0aWxzL0NvbW1hbmRMaW5lUnVubmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnNlcnZpY2UudXRpbHM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLS8qKgotICogQmFzZSBpbXBsZW1lbnRhdGlvbiBmb3IgSUNvbW1hbmRMaW5lUnVubmVyCi0gKiAKLSAqIEBhdXRob3IgV2VpcGluZyBMdQotICogQHNpbmNlIDEuMgotICovCi1wdWJsaWMgY2xhc3MgQ29tbWFuZExpbmVSdW5uZXIgaW1wbGVtZW50cyBJQ29tbWFuZExpbmVSdW5uZXIgewotCXByb3RlY3RlZCBzdGF0aWMgYm9vbGVhbiBsb2NhbERlYnVnID0gdHJ1ZTsKLQkKLQlwcml2YXRlIEZpbGUgaW5wdXRGaWxlOwotCQotCXB1YmxpYyBib29sZWFuIGV4ZWN1dGUoU3RyaW5nW10gYXJncykgewotCQlpZiAobG9jYWxEZWJ1ZykgewotCQkJZGVidWdTaG93QXJncyhhcmdzKTsKLQkJfQotCQkKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoYXJnc1tpXS5lcXVhbHNJZ25vcmVDYXNlKCItYmF0Y2giKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJaWYgKGkgKyAxIDwgYXJncy5sZW5ndGgpIHsKLQkJCQkJU3RyaW5nIHBhdGggPSBhcmdzW2kgKyAxXTsKLQkJCQkJaW5wdXRGaWxlID0gbmV3IEZpbGUocGF0aCk7Ci0JCQkJCWlmICghaW5wdXRGaWxlLmV4aXN0cygpKSB7Ci0JCQkJCQlTdHJpbmcgbXNnID0gIkNhbm5vdCBmaW5lIHRoZSBmaWxlOiAiICsgcGF0aDsgLy8kTk9OLU5MUy0xJAotCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJFcnJvcj4gIiArIG1zZyk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCQkJCQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBkZWJ1Z1Nob3dBcmdzKFN0cmluZ1tdIGFyZ3MpIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJMRD4gIiArIGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIi5leGVjdXRlIGFyZ3M6ICIpOyAvLyROT04tTkxTLTEkCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgYXJncy5sZW5ndGg7IGkrKykgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJMRD4gYXJnc1siICsgaSArICJdOiAiICsgYXJnc1tpXSk7IC8vJE5PTi1OTFMtMSQvLyROT04tTkxTLTIkCi0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIEZpbGUgZ2V0SW5wdXRGaWxlKCkgewotCQlyZXR1cm4gaW5wdXRGaWxlOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24uc2VydmljZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi9zZXJ2aWNlL3V0aWxzL0lDb21tYW5kTGluZVJ1bm5lci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5zZXJ2aWNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3NlcnZpY2UvdXRpbHMvSUNvbW1hbmRMaW5lUnVubmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiNmY3ZjcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5zZXJ2aWNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3NlcnZpY2UvdXRpbHMvSUNvbW1hbmRMaW5lUnVubmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnNlcnZpY2UudXRpbHM7Ci0KLS8qKgotICogSW50ZXJmYWNlIGZvciBleGN1dGluZyBhIGNvbW1hbmQgbGluZQotICogCi0gKiBAYXV0aG9yIFdlaXBpbmcgTHUKLSAqIEBzaW5jZSAxLjIKLSAqLwotcHVibGljIGludGVyZmFjZSBJQ29tbWFuZExpbmVSdW5uZXIgewotCWJvb2xlYW4gZXhlY3V0ZShTdHJpbmdbXSBhcmdzKTsKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24uc2VydmljZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi9zZXJ2aWNlL3ZlcnNpb25pbmcvRVBGVmVyc2lvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5zZXJ2aWNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3NlcnZpY2UvdmVyc2lvbmluZy9FUEZWZXJzaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2OTQ0MzYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5zZXJ2aWNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3NlcnZpY2UvdmVyc2lvbmluZy9FUEZWZXJzaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5zZXJ2aWNlLnZlcnNpb25pbmc7Ci0KLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuVmVyc2lvbjsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBzaW5nbGUgdmVyc2lvbiBvZiBFUEYgQ29tcG9zZXIuCi0gKiBJdCBjb250YWlucyBhbGwgdGhlIHZlcnNpb25zIG9mIHRoZSBzdWItY29tcG9uZW50cyBvZiBFUEYuCi0gKiAKLSAqIEBhdXRob3IgSmVmZiBIYXJkeQotICogQHNpY25lIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRVBGVmVyc2lvbiB7Ci0KLQkvLyB0aGUgdG9vbCB2ZXJzaW9uCi0JcHJvdGVjdGVkIFZlcnNpb24gdG9vbFZlcnNpb247Ci0JCi0JLy8gdGhlIGxpYnJhcnkgdmVyc2lvbgotCXByb3RlY3RlZCBWZXJzaW9uIGxpYnJhcnlWZXJzaW9uOwotCQotCS8vIHRoZSBzY2hlbWEgdmVyc2lvbgotCXByb3RlY3RlZCBWZXJzaW9uIHhtbFNjaGVtYVZlcnNpb247Ci0JCi0JCi0JcHVibGljIEVQRlZlcnNpb24oKSB7Ci0JCXRoaXMudG9vbFZlcnNpb24gPSBWZXJzaW9uLmVtcHR5VmVyc2lvbjsKLQkJdGhpcy5saWJyYXJ5VmVyc2lvbiA9IFZlcnNpb24uZW1wdHlWZXJzaW9uOwotCQl0aGlzLnhtbFNjaGVtYVZlcnNpb24gPSBWZXJzaW9uLmVtcHR5VmVyc2lvbjsKLQl9OwotCQotCXB1YmxpYyBFUEZWZXJzaW9uKFN0cmluZyB0b29sVmVyc2lvbiwgU3RyaW5nIGxpYnJhcnlWZXJzaW9uLCBTdHJpbmcgeG1sU2NoZW1hVmVyc2lvbikgewotCQl0aGlzLnRvb2xWZXJzaW9uID0gbmV3IFZlcnNpb24odG9vbFZlcnNpb24pOwotCQl0aGlzLmxpYnJhcnlWZXJzaW9uID0gbmV3IFZlcnNpb24obGlicmFyeVZlcnNpb24pOwotCQl0aGlzLnhtbFNjaGVtYVZlcnNpb24gPSBuZXcgVmVyc2lvbih4bWxTY2hlbWFWZXJzaW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHRoZSB0b29sIHZlcnNpb24KLQkgKi8KLQlwdWJsaWMgVmVyc2lvbiBnZXRUb29sVmVyc2lvbigpIHsKLQkJcmV0dXJuIHRvb2xWZXJzaW9uOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gdGhlIGxpYnJhcnkgdmVyc2lvbgotCSAqLwotCXB1YmxpYyBWZXJzaW9uIGdldExpYnJhcnlWZXJzaW9uKCkgewotCQlyZXR1cm4gbGlicmFyeVZlcnNpb247Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiB0aGUgWE1MIHNjaGVtYSB2ZXJzaW9uCi0JICovCi0JcHVibGljIFZlcnNpb24gZ2V0WE1MU2NoZW1hVmVyc2lvbigpIHsKLQkJcmV0dXJuIHhtbFNjaGVtYVZlcnNpb247Ci0JfQotCQotCS8qKgotCSAqIENvbXBhcmVzIHRoZSBnaXZlbiB0b29sIHZlcnNpb24gdG8gdGhpcyBvbmUKLQkgKiAKLQkgKiBAc2VlIG9yZy5vc2dpLmZyYW1ld29yay5WZXJzaW9uI2NvbXBhcmVUbygpCi0JICogCi0JICogQHBhcmFtIHNjaGVtYVZlcnNpb24gVGhlIHNjaGVtYSB2ZXJzaW9uIHRvIGJlIGNvbXBhcmVkLgotCSAqIEByZXR1cm4gQSBuZWdhdGl2ZSBpbnRlZ2VyIGlmIHRoaXMgdG9vbCB2ZXJzaW9uIGlzIGxlc3MgdGhhbiB0aGUgZ2l2ZW4gb25lPGJyIC8+Ci0JICogWmVybyBpZiB0aGUgdGhpcyB0b29sIHZlcnNpb24gaXMgdGhlIHNhbWUgYXMgdGhlIGdpdmVuIG9uZTxiciAvPgotCSAqIEEgcG9zaXRpdmUgaW50ZWdlciBpZiB0aGlzIHRvb2wgdmVyc2lvbiBpcyBncmVhdGVyIHRoYW4gdGhlIGdpdmVuIG9uZTxiciAvPgotCSAqIAotCSAqLwotCXB1YmxpYyBpbnQgY29tcGFyZVRvb2xWZXJzaW9uVG8oVmVyc2lvbiB0b29sVmVyc2lvbikgewotCQlpZiAoIVZlcnNpb25VdGlsLmlzVmVyc2lvbkNoZWNraW5nRGlzYWJsZWQoKSkKLQkJCXJldHVybiBnZXRUb29sVmVyc2lvbigpLmNvbXBhcmVUbyh0b29sVmVyc2lvbik7Ci0JCWVsc2UgCi0JCQlyZXR1cm4gMDsKLQl9Ci0JCi0JLyoqCi0JICogQ29tcGFyZXMgdGhlIGdpdmVuIGxpYnJhcnkgdmVyc2lvbiB0byB0aGlzIG9uZQotCSAqIAotCSAqIEBzZWUgb3JnLm9zZ2kuZnJhbWV3b3JrLlZlcnNpb24jY29tcGFyZVRvKCkKLQkgKiAKLQkgKiBAcGFyYW0gc2NoZW1hVmVyc2lvbiBUaGUgc2NoZW1hIHZlcnNpb24gdG8gYmUgY29tcGFyZWQuCi0JICogQHJldHVybiBBIG5lZ2F0aXZlIGludGVnZXIgaWYgdGhpcyBsaWJyYXJ5IHZlcnNpb24gaXMgbGVzcyB0aGFuIHRoZSBnaXZlbiBvbmU8YnIgLz4KLQkgKiBaZXJvIGlmIHRoZSB0aGlzIGxpYnJhcnkgdmVyc2lvbiBpcyB0aGUgc2FtZSBhcyB0aGUgZ2l2ZW4gb25lPGJyIC8+Ci0JICogQSBwb3NpdGl2ZSBpbnRlZ2VyIGlmIHRoaXMgbGlicmFyeSB2ZXJzaW9uIGlzIGdyZWF0ZXIgdGhhbiB0aGUgZ2l2ZW4gb25lPGJyIC8+Ci0JICogCi0JICovCi0JcHVibGljIGludCBjb21wYXJlTGlicmFyeVZlcnNpb25UbyhWZXJzaW9uIGxpYnJhcnlWZXJzaW9uKSB7Ci0JCWlmICghVmVyc2lvblV0aWwuaXNWZXJzaW9uQ2hlY2tpbmdEaXNhYmxlZCgpKQotCQkJcmV0dXJuIGdldExpYnJhcnlWZXJzaW9uKCkuY29tcGFyZVRvKGxpYnJhcnlWZXJzaW9uKTsKLQkJZWxzZSAKLQkJCXJldHVybiAwOwotCX0KLQotCS8qKgotCSAqIENvbXBhcmVzIHRoZSBnaXZlbiBYTUwgU2NoZW1hIHZlcnNpb24gdG8gdGhpcyBvbmUKLQkgKiAKLQkgKiBAc2VlIG9yZy5vc2dpLmZyYW1ld29yay5WZXJzaW9uI2NvbXBhcmVUbygpCi0JICogCi0JICogQHBhcmFtIHNjaGVtYVZlcnNpb24gVGhlIHNjaGVtYSB2ZXJzaW9uIHRvIGJlIGNvbXBhcmVkLgotCSAqIEByZXR1cm4gQSBuZWdhdGl2ZSBpbnRlZ2VyIGlmIHRoaXMgWE1MIFNjaGVtYSB2ZXJzaW9uIGlzIGxlc3MgdGhhbiB0aGUgZ2l2ZW4gb25lPGJyIC8+Ci0JICogWmVybyBpZiB0aGUgdGhpcyBYTUwgU2NoZW1hIHZlcnNpb24gaXMgdGhlIHNhbWUgYXMgdGhlIGdpdmVuIG9uZTxiciAvPgotCSAqIEEgcG9zaXRpdmUgaW50ZWdlciBpZiB0aGlzIFhNTCBTY2hlbWEgdmVyc2lvbiBpcyBncmVhdGVyIHRoYW4gdGhlIGdpdmVuIG9uZTxiciAvPgotCSAqIAotCSAqLwotCXB1YmxpYyBpbnQgY29tcGFyZVhNTFNjaGVtYVZlcnNpb25UbyhWZXJzaW9uIFhNTFNjaGVtYVZlcnNpb24pIHsKLQkJaWYgKCFWZXJzaW9uVXRpbC5pc1ZlcnNpb25DaGVja2luZ0Rpc2FibGVkKCkpCi0JCQlyZXR1cm4gZ2V0WE1MU2NoZW1hVmVyc2lvbigpLmNvbXBhcmVUbyhYTUxTY2hlbWFWZXJzaW9uKTsKLQkJZWxzZSAKLQkJCXJldHVybiAwOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gZ2V0VG9vbFZlcnNpb24oKS50b1N0cmluZygpICsgIiwiICsgLy8kTk9OLU5MUy0xJAotCQlnZXRMaWJyYXJ5VmVyc2lvbigpLnRvU3RyaW5nKCkgKyAiLCIgKyAvLyROT04tTkxTLTEkCi0JCWdldFhNTFNjaGVtYVZlcnNpb24oKS50b1N0cmluZygpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAob2JqZWN0ID09IHRoaXMpIHsgLy8gcXVpY2t0ZXN0Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0JCWlmICghKG9iamVjdCBpbnN0YW5jZW9mIEVQRlZlcnNpb24pKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlFUEZWZXJzaW9uIG90aGVyID0gKEVQRlZlcnNpb24pIG9iamVjdDsKLQkJcmV0dXJuIChnZXRUb29sVmVyc2lvbigpLmVxdWFscyhvdGhlci5nZXRUb29sVmVyc2lvbigpKSkgJiYgKGdldExpYnJhcnlWZXJzaW9uKCkuZXF1YWxzKG90aGVyLmdldExpYnJhcnlWZXJzaW9uKCkpKQotCQkJCSYmIChnZXRYTUxTY2hlbWFWZXJzaW9uKCkuZXF1YWxzKG90aGVyLmdldFhNTFNjaGVtYVZlcnNpb24oKSkpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCQlpbnQgcmVzdWx0ID0gdG9vbFZlcnNpb24uaGFzaENvZGUoKTsKLQkJcmVzdWx0IF49IGxpYnJhcnlWZXJzaW9uLmhhc2hDb2RlKCk7Ci0JCXJlc3VsdCBePSB4bWxTY2hlbWFWZXJzaW9uLmhhc2hDb2RlKCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5zZXJ2aWNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3NlcnZpY2UvdmVyc2lvbmluZy9FUEZWZXJzaW9ucy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5zZXJ2aWNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3NlcnZpY2UvdmVyc2lvbmluZy9FUEZWZXJzaW9ucy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1M2MzZDcyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24uc2VydmljZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi9zZXJ2aWNlL3ZlcnNpb25pbmcvRVBGVmVyc2lvbnMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzOCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnNlcnZpY2UudmVyc2lvbmluZzsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLlZlcnNpb247Ci0KLS8qKgotICogVGhpcyBjbGFzcyBzdG9yZXMgYWxsIG9mIHRoZSB2ZXJzaW9uIGluZm9ybWF0aW9uIGZvciB0aGUga25vd24gRVBGIHZlcnNpb25zLgotICogCi0gKiBAYXV0aG9yIEplZmYgSGFyZHkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEVQRlZlcnNpb25zIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRPT0xfSUQgPSAiZXBmIjsgLy8kTk9OLU5MUy0xJAotCi0JLy8gdGhlIG5hbWUgc3BhY2UgVVJJIHN0cmluZyBmb3IgdGhlIFRPT0xfSUQKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgbnNVcmkgPSAiaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiOyAvLyROT04tTkxTLTEkCi0KLQkvLyBFUEYgMS4wCi0JcHJpdmF0ZSBzdGF0aWMgRVBGVmVyc2lvbiBFUEZfMTAgPSBuZXcgRVBGVmVyc2lvbigiMS4wIiwgLy8kTk9OLU5MUy0xJCAgdG9vbCB2ZXJzaW9uCi0JCQkiMS4wLjMuMCIsIC8vJE5PTi1OTFMtMSQgIGxpYnJhcnkgdmVyc2lvbgotCQkJIjEuMC4wIik7IC8vJE5PTi1OTFMtMSQgIHhtbCBzY2hlbWEgdmVyc2lvbgotCi0JLy8gRVBGIDEuMSAtIFRoaXMgaXMgRVBGIDEuMiBJdGVyYXRpb24gMQotCXByaXZhdGUgc3RhdGljIEVQRlZlcnNpb24gRVBGXzExID0gbmV3IEVQRlZlcnNpb24oIjEuMSIsIC8vJE5PTi1OTFMtMSQgIHRvb2wgdmVyc2lvbgotCQkJIjEuMC40LjAiLCAvLyROT04tTkxTLTEkICBsaWJyYXJ5IHZlcnNpb24KLQkJCSIxLjAuMCIpOyAvLyROT04tTkxTLTEkICB4bWwgc2NoZW1hIHZlcnNpb24KLQotCS8vIEVQRiAxLjIgcmVsZWFzZQotCXByaXZhdGUgc3RhdGljIEVQRlZlcnNpb24gRVBGXzEyID0gbmV3IEVQRlZlcnNpb24oIjEuMiIsIC8vJE5PTi1OTFMtMSQgIHRvb2wgdmVyc2lvbgotCQkJIjEuMC40LjEiLCAvLyROT04tTkxTLTEkICBsaWJyYXJ5IHZlcnNpb24KLQkJCSIxLjAuMSIpOyAvLyROT04tTkxTLTEkICB4bWwgc2NoZW1hIHZlcnNpb24KLQotCS8vIEVQRiAxLjUgcmVsZWFzZQotCXByaXZhdGUgc3RhdGljIEVQRlZlcnNpb24gRVBGXzE1ID0gbmV3IEVQRlZlcnNpb24oIjEuNSIsIC8vJE5PTi1OTFMtMSQgIHRvb2wgdmVyc2lvbgotCQkJIjEuMC41LjAiLCAvLyROT04tTkxTLTEkICBsaWJyYXJ5IHZlcnNpb24KLQkJCSIxLjAuMiIpOyAvLyROT04tTkxTLTEkICB4bWwgc2NoZW1hIHZlcnNpb24KLQotCXByaXZhdGUgc3RhdGljIEVQRlZlcnNpb24gY3VycmVudFZlcnNpb24gPSBFUEZfMTU7Ci0KLQlwdWJsaWMgRVBGVmVyc2lvbiBnZXRDdXJyZW50VmVyc2lvbigpIHsKLQkJcmV0dXJuIGN1cnJlbnRWZXJzaW9uOwotCX0KLQotCXB1YmxpYyBFUEZWZXJzaW9uIGdldFZlcnNpb24oU3RyaW5nIHRvb2xWZXJzaW9uKSB7Ci0JCWlmICh0b29sVmVyc2lvbiAhPSBudWxsKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBnZXRBbGxWZXJzaW9ucygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCUVQRlZlcnNpb24gdmVyID0gKEVQRlZlcnNpb24pIGl0ZXIubmV4dCgpOwotCQkJCWlmICh2ZXIuZ2V0VG9vbFZlcnNpb24oKS5lcXVhbHMobmV3IFZlcnNpb24odG9vbFZlcnNpb24pKSkgewotCQkJCQlyZXR1cm4gdmVyOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRBbGxWZXJzaW9ucygpIHsKLQkJTGlzdDxFUEZWZXJzaW9uPiB2ZXJzaW9ucyA9IG5ldyBBcnJheUxpc3Q8RVBGVmVyc2lvbj4oKTsKLQkJdmVyc2lvbnMuYWRkKEVQRl8xMCk7Ci0JCXZlcnNpb25zLmFkZChFUEZfMTEpOwotCQl2ZXJzaW9ucy5hZGQoRVBGXzEyKTsKLQkJdmVyc2lvbnMuYWRkKEVQRl8xNSk7Ci0JCXJldHVybiB2ZXJzaW9uczsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gbGlicmFyeVZlcnNpb24KLQkgKiBAcmV0dXJuIHRoZSBtaW5pbXVtIHRvb2wgdmVyc2lvbiB0aGF0IHVzZXMgdGhlIHNwZWNpZmllZCBsaWJyYXJ5IHZlcnNpb24KLQkgKi8KLQlwdWJsaWMgRVBGVmVyc2lvbiBnZXRNaW5Ub29sVmVyc2lvbkZvckxpYnJhcnlWZXJzaW9uKFZlcnNpb24gbGlicmFyeVZlcnNpb24pIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZ2V0QWxsVmVyc2lvbnMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCUVQRlZlcnNpb24gdmVyc2lvbkluZm8gPSAoRVBGVmVyc2lvbikgaXRlci5uZXh0KCk7Ci0JCQlpZiAodmVyc2lvbkluZm8uZ2V0TGlicmFyeVZlcnNpb24oKS5jb21wYXJlVG8obGlicmFyeVZlcnNpb24pID09IDApIHsKLQkJCQlyZXR1cm4gdmVyc2lvbkluZm87Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHJldHVybiB0aGUgbWluaW11bSB0b29sIHZlcnNpb24gdGhhdCB1c2VzIHRoZSBjdXJyZW50IGxpYnJhcnkgdmVyc2lvbgotCSAqLwotCXB1YmxpYyBFUEZWZXJzaW9uIGdldE1pblRvb2xWZXJzaW9uRm9yQ3VycmVudExpYnJhcnlWZXJzaW9uKCkgewotCQlWZXJzaW9uIGxpYnJhcnlWZXJzaW9uID0gZ2V0Q3VycmVudFZlcnNpb24oKS5nZXRMaWJyYXJ5VmVyc2lvbigpOwotCQlyZXR1cm4gZ2V0TWluVG9vbFZlcnNpb25Gb3JMaWJyYXJ5VmVyc2lvbihsaWJyYXJ5VmVyc2lvbik7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIHhtbFNjaGVtYVZlcnNpb24KLQkgKiBAcmV0dXJuIHRoZSBtaW5pbXVtIHRvb2wgdmVyc2lvbiB0aGF0IHVzZXMgdGhlIHNwZWNpZmllZCBYTUwgU2NoZW1hCi0JICogICAgICAgICB2ZXJzaW9uCi0JICovCi0JcHVibGljIEVQRlZlcnNpb24gZ2V0TWluVG9vbFZlcnNpb25Gb3JYTUxTY2hlbWFWZXJzaW9uKAotCQkJVmVyc2lvbiB4bWxTY2hlbWFWZXJzaW9uKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGdldEFsbFZlcnNpb25zKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlFUEZWZXJzaW9uIHZlcnNpb25JbmZvID0gKEVQRlZlcnNpb24pIGl0ZXIubmV4dCgpOwotCQkJaWYgKHZlcnNpb25JbmZvLmdldFhNTFNjaGVtYVZlcnNpb24oKS5jb21wYXJlVG8oeG1sU2NoZW1hVmVyc2lvbikgPT0gMCkgewotCQkJCXJldHVybiB2ZXJzaW9uSW5mbzsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBtaW5pbXVtIHRvb2wgdmVyc2lvbiB0aGF0IHVzZXMgdGhlIGN1cnJlbnQgWE1MIFNjaGVtYSB2ZXJzaW9uCi0JICovCi0JcHVibGljIEVQRlZlcnNpb24gZ2V0TWluVG9vbFZlcnNpb25Gb3JDdXJyZW50WE1MU2NoZW1hVmVyc2lvbigpIHsKLQkJVmVyc2lvbiB4bWxTY2hlbWFWZXJzaW9uID0gZ2V0Q3VycmVudFZlcnNpb24oKS5nZXRYTUxTY2hlbWFWZXJzaW9uKCk7Ci0JCXJldHVybiBnZXRNaW5Ub29sVmVyc2lvbkZvclhNTFNjaGVtYVZlcnNpb24oeG1sU2NoZW1hVmVyc2lvbik7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHJldHVybiB0aGUgbmFtZSBzcGFjZSBVUkkgc3RyaW5nIGZvciB0aGUgVE9PTF9JRAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TnNVUkkoKSB7Ci0JCXJldHVybiBuc1VyaTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24uc2VydmljZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi9zZXJ2aWNlL3ZlcnNpb25pbmcvSUxpYnJhcnlFeHRlbnNpb25WZXJzaW9uQ2hlY2suamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24uc2VydmljZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi9zZXJ2aWNlL3ZlcnNpb25pbmcvSUxpYnJhcnlFeHRlbnNpb25WZXJzaW9uQ2hlY2suamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2NhOWJhYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLnNlcnZpY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vc2VydmljZS92ZXJzaW9uaW5nL0lMaWJyYXJ5RXh0ZW5zaW9uVmVyc2lvbkNoZWNrLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnNlcnZpY2UudmVyc2lvbmluZzsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24uc2VydmljZS52ZXJzaW9uaW5nLlZlcnNpb25VdGlsLlZlcnNpb25DaGVja0luZm87Ci0KLS8qKgotICogVGhlIGludGVyZmFjZSBmb3IgcGVyZm9ybWluZyBtZXRob2QgbGlicmFyeSB2ZXJzaW9uIGNoZWNrLgotICogCi0gKiBAYXV0aG9yIEplZmYgSGFyZHkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJTGlicmFyeUV4dGVuc2lvblZlcnNpb25DaGVjayB7Ci0KLQkvKioKLQkgKiBDaGVja3MgYW5kIHJldHVybnMgdGhlIHZlcnNpb24gaW5mb3JtYXRpb24gYXNzb2NpYXRlZCB3aXRoIGEgbWV0aG9kCi0JICogbGlicmFyeS4KLQkgKiAKLQkgKiBAcGFyYW0gZmlsZQotCSAqICAgICAgICAgICAgYSBtZXRob2QgbGlicmFyeSBYTUkgZmlsZQotCSAqIEByZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIGxpYnJhcnkgWE1JIGZpbGUgZG9lcyBub3QgY29udGFpbiB0aGUKLQkgKiAgICAgICAgIHZlcnNpb24gaW5mb3JtYXRpb24gb2YgdGhlIHRvb2wgdGhhdCBjcmVhdGVkIGl0OyBvcgotCSAqICAgICAgICAgPGNvZGU+VmVyc2lvbkNoZWNrSW5mbzwvY29kZT4gb2JqZWN0Ci0JICovCi0JcHVibGljIFZlcnNpb25DaGVja0luZm8gY2hlY2tMaWJyYXJ5VmVyc2lvbihGaWxlIGxpYlBhdGgpOwotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLnNlcnZpY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vc2VydmljZS92ZXJzaW9uaW5nL1ZlcnNpb25NaXNtYXRjaEV4Y2VwdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5zZXJ2aWNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3NlcnZpY2UvdmVyc2lvbmluZy9WZXJzaW9uTWlzbWF0Y2hFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmEyMjMyOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLnNlcnZpY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vc2VydmljZS92ZXJzaW9uaW5nL1ZlcnNpb25NaXNtYXRjaEV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5zZXJ2aWNlLnZlcnNpb25pbmc7Ci0KLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuVmVyc2lvbjsKLQotLyoqCi0gKiBTaWduYWxzIHRoYXQgdGhlIGN1cnJlbnQgdmVyc2lvbiBvZiB0aGUgdG9vbCBpcyBub3QgY29tcGF0aWJsZSB3aXRoIHRoZQotICogbWV0aG9kIGxpYnJhcnkgaXQgaXMgdHJ5aW5nIHRvIG9wZW4uCi0gKiAKLSAqIEBhdXRob3IgSmVmZiBIYXJkeQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgVmVyc2lvbk1pc21hdGNoRXhjZXB0aW9uIGV4dGVuZHMgUnVudGltZUV4Y2VwdGlvbiB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCXByaXZhdGUgVmVyc2lvbiBleHBlY3RlZDsKLQotCXByaXZhdGUgVmVyc2lvbiBhY3R1YWw7Ci0KLQlwdWJsaWMgVmVyc2lvbk1pc21hdGNoRXhjZXB0aW9uKFZlcnNpb24gZXhwZWN0ZWQsIFN0cmluZyBhY3R1YWwpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5leHBlY3RlZCA9IGV4cGVjdGVkOwotCQlpZiAoYWN0dWFsID09IG51bGwpIHsKLQkJCXRoaXMuYWN0dWFsID0gVmVyc2lvbi5lbXB0eVZlcnNpb247Ci0JCX0gZWxzZSB7Ci0JCQl0aGlzLmFjdHVhbCA9IG5ldyBWZXJzaW9uKGFjdHVhbCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgVmVyc2lvbiBnZXRBY3R1YWwoKSB7Ci0JCXJldHVybiBhY3R1YWw7Ci0JfQotCi0JcHVibGljIFZlcnNpb24gZ2V0RXhwZWN0ZWQoKSB7Ci0JCXJldHVybiBleHBlY3RlZDsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLnNlcnZpY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vc2VydmljZS92ZXJzaW9uaW5nL1ZlcnNpb25VdGlsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLnNlcnZpY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vc2VydmljZS92ZXJzaW9uaW5nL1ZlcnNpb25VdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4YTQyMjMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5zZXJ2aWNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3NlcnZpY2UvdmVyc2lvbmluZy9WZXJzaW9uVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDczICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5jb21tb24uc2VydmljZS52ZXJzaW9uaW5nOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBqYXZhLnV0aWwucmVnZXguTWF0Y2hlcjsKLWltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnNlcnZpY2UuU2VydmljZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLkZpbGVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuU3RyVXRpbDsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5WZXJzaW9uOwotCi0vKioKLSAqIFByb3ZpZGVzIHV0aWxpdGllcyB0byBxdWVyeSBhIG1ldGhvZCBsaWJyYXJ5IHNjaGVtYSBhbmQgdGhlIHZlcnNpb24gb2YgdGhlCi0gKiB0b29sIHRoYXQgY3JlYXRlZCBpdC4KLSAqIAotICogQGF1dGhvciBKZWZmIEhhcmR5Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBWZXJzaW9uVXRpbCB7Ci0KLQlwdWJsaWMgc3RhdGljIGNsYXNzIFZlcnNpb25DaGVja0luZm8gewotCQlwdWJsaWMgVmVyc2lvbkNoZWNrSW5mbyhTdHJpbmcgaWQsIFN0cmluZyB0b29sVmVyc2lvbiwKLQkJCQlTdHJpbmcgY3VycmVudE1pblRvb2xWZXJzaW9uLCBpbnQgcmVzdWx0KSB7Ci0JCQl0aGlzLnRvb2xJRCA9IGlkOwotCQkJdGhpcy50b29sVmVyc2lvbiA9IHRvb2xWZXJzaW9uOwotCQkJdGhpcy5jdXJyZW50TWluVG9vbFZlcnNpb24gPSBjdXJyZW50TWluVG9vbFZlcnNpb247Ci0JCQl0aGlzLnJlc3VsdCA9IHJlc3VsdDsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgdG9vbElEOwotCi0JCXB1YmxpYyBTdHJpbmcgdG9vbFZlcnNpb247Ci0KLQkJcHVibGljIFN0cmluZyBjdXJyZW50TWluVG9vbFZlcnNpb247Ci0KLQkJLyoqCi0JCSAqIDwgMDogZmlsZVRvb2xWZXJzaW9uIGlzIG9sZGVyIHRoYW4gY3VycmVudE1pblRvb2xWZXJzaW9uIDxici8+ID09IDA6Ci0JCSAqIG1hdGNoIDxici8+ID4gMCA6IGZpbGVUb29sVmVyc2lvbiBpcyBuZXdlciB0aGFuIGN1cnJlbnRNaW5Ub29sVmVyc2lvbgotCQkgKiA8YnIvPgotCQkgKi8KLQkJcHVibGljIGludCByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogVGhlIGV4dGVuc2lvbiBwb2ludCBuYW1lc3BhY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhURU5TSU9OX1BPSU5UX05BTUVTUEFDRSA9IFNlcnZpY2VQbHVnaW4uY2xhc3MKLQkJCS5nZXRQYWNrYWdlKCkuZ2V0TmFtZSgpOwotCi0JLyoqCi0JICogVGhlIGV4dGVuc2lvbiBwb2ludCBuYW1lLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVEVOU0lPTl9QT0lOVF9OQU1FID0gInZlcnNpb24iOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRFTlNJT05fVkVSU0lPTlNfSU5GTyA9ICJ2ZXJzaW9ucyI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVEVOU0lPTl9MSUJfRVhURU5TSU9OX0NIRUNLID0gImxpYnJhcnlFeHRlbnNpb25WZXJzaW9uQ2hlY2siOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElTQUJMRV9WRVJTSU9OX0NIRUNLSU5HX1BSRUYgPSAiZGlzYWJsZV92ZXJzaW9uX2NoZWNraW5nIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBNYXA8U3RyaW5nLCBFUEZWZXJzaW9ucz4gdmVyc2lvbnMgPSBuZXcgTGlua2VkSGFzaE1hcDxTdHJpbmcsIEVQRlZlcnNpb25zPigpOwotCi0JcHVibGljIHN0YXRpYyBNYXA8U3RyaW5nLCBJTGlicmFyeUV4dGVuc2lvblZlcnNpb25DaGVjaz4gbGliRXh0Q2hlY2tlcnMgPSBuZXcgTGlua2VkSGFzaE1hcDxTdHJpbmcsIElMaWJyYXJ5RXh0ZW5zaW9uVmVyc2lvbkNoZWNrPigpOwotCi0JcHJvdGVjdGVkIHN0YXRpYyBib29sZWFuIHZlcnNpb25DaGVja2luZ0Rpc2FibGVkID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBMaXN0IG9mIHRvb2xJRHMgdG8gY2hlY2ssIGluIG9yZGVyCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgTGlzdDxTdHJpbmc+IHRvb2xJRHNDaGVja0xpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQotCXN0YXRpYyB7Ci0JCXRvb2xJRHNDaGVja0xpc3QuYWRkKEVQRlZlcnNpb25zLlRPT0xfSUQpOwotCi0JCS8vIHJlYWQgcHJvcGVydGllcyBmaWxlCi0JCXRyeSB7Ci0JCQlTdHJpbmcgdmFsdWVTdHIgPSBTZXJ2aWNlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKQotCQkJCQkuZ2V0U3RyaW5nKERJU0FCTEVfVkVSU0lPTl9DSEVDS0lOR19QUkVGKTsKLQkJCXZlcnNpb25DaGVja2luZ0Rpc2FibGVkID0gQm9vbGVhbi52YWx1ZU9mKHZhbHVlU3RyKS5ib29sZWFuVmFsdWUoKTsKLQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKLQkJCXZlcnNpb25DaGVja2luZ0Rpc2FibGVkID0gZmFsc2U7Ci0JCX0KLQotCQkvLyBQcm9jZXNzIHRoZSAib3JnLmVjbGlwc2UuZXBmLmNvbW1vbi52ZXJzaW9uIiBleHRlbnNpb24gcG9pbnQKLQkJLy8gY29udHJpYnV0b3JzLgotCQlJRXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpOwotCQlJRXh0ZW5zaW9uUG9pbnQgZXh0ZW5zaW9uUG9pbnQgPSBleHRlbnNpb25SZWdpc3RyeS5nZXRFeHRlbnNpb25Qb2ludCgKLQkJCQlFWFRFTlNJT05fUE9JTlRfTkFNRVNQQUNFLCBFWFRFTlNJT05fUE9JTlRfTkFNRSk7Ci0JCWlmIChleHRlbnNpb25Qb2ludCAhPSBudWxsKSB7Ci0JCQlJRXh0ZW5zaW9uW10gZXh0ZW5zaW9ucyA9IGV4dGVuc2lvblBvaW50LmdldEV4dGVuc2lvbnMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZXh0ZW5zaW9ucy5sZW5ndGg7IGkrKykgewotCQkJCUlFeHRlbnNpb24gZXh0ZW5zaW9uID0gZXh0ZW5zaW9uc1tpXTsKLQkJCQlpbml0RXh0ZW5zaW9uKGV4dGVuc2lvbik7Ci0JCQl9Ci0JCX0KLQotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgdm9pZCBpbml0RXh0ZW5zaW9uKElFeHRlbnNpb24gZXh0ZW5zaW9uKSB7Ci0JCVN0cmluZyBleHRlbnNpb25JRCA9IGV4dGVuc2lvbi5nZXRTaW1wbGVJZGVudGlmaWVyKCk7Ci0JCVN0cmluZyBwbHVnaW5JZCA9IGV4dGVuc2lvbi5nZXROYW1lc3BhY2VJZGVudGlmaWVyKCk7Ci0JCUJ1bmRsZSBidW5kbGUgPSBQbGF0Zm9ybS5nZXRCdW5kbGUocGx1Z2luSWQpOwotCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjb25maWdFbGVtZW50cyA9IGV4dGVuc2lvbgotCQkJCS5nZXRDb25maWd1cmF0aW9uRWxlbWVudHMoKTsKLQkJZm9yIChpbnQgaiA9IDA7IGogPCBjb25maWdFbGVtZW50cy5sZW5ndGg7IGorKykgewotCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNvbmZpZ0VsZW1lbnQgPSBjb25maWdFbGVtZW50c1tqXTsKLQkJCXRyeSB7Ci0JCQkJaWYgKEVYVEVOU0lPTl9WRVJTSU9OU19JTkZPLmVxdWFscyhjb25maWdFbGVtZW50LmdldE5hbWUoKSkpIHsKLQkJCQkJU3RyaW5nIGNsYXNzTmFtZSA9IGNvbmZpZ0VsZW1lbnQuZ2V0QXR0cmlidXRlKCJjbGFzcyIpOyAvLyROT04tTkxTLTEkCi0JCQkJCWlmIChjbGFzc05hbWUgIT0gbnVsbCkgewotCQkJCQkJdmVyc2lvbnMucHV0KGV4dGVuc2lvbklELCAoRVBGVmVyc2lvbnMpIGJ1bmRsZQotCQkJCQkJCQkubG9hZENsYXNzKGNsYXNzTmFtZSkubmV3SW5zdGFuY2UoKSk7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAoRVhURU5TSU9OX0xJQl9FWFRFTlNJT05fQ0hFQ0suZXF1YWxzKGNvbmZpZ0VsZW1lbnQKLQkJCQkJCS5nZXROYW1lKCkpKSB7Ci0JCQkJCVN0cmluZyBjbGFzc05hbWUgPSBjb25maWdFbGVtZW50LmdldEF0dHJpYnV0ZSgiY2xhc3MiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlpZiAoY2xhc3NOYW1lICE9IG51bGwpIHsKLQkJCQkJCWxpYkV4dENoZWNrZXJzLnB1dChleHRlbnNpb25JRCwKLQkJCQkJCQkJKElMaWJyYXJ5RXh0ZW5zaW9uVmVyc2lvbkNoZWNrKSBidW5kbGUKLQkJCQkJCQkJCQkubG9hZENsYXNzKGNsYXNzTmFtZSkubmV3SW5zdGFuY2UoKSk7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJU2VydmljZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBtYXAgb2YgVG9vbCBJRHMtdG8tVmVyc2lvbnMgY2xhc3MKLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1hcCBnZXRWZXJzaW9uc01hcCgpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZU1hcCh2ZXJzaW9ucyk7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHJldHVybiBhIFNldCBvZiBhbGwga25vd24gVG9vbCBJRHMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFNldDxTdHJpbmc+IGdldEFsbFRvb2xJRHMoKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVTZXQodmVyc2lvbnMua2V5U2V0KCkpOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSB0b29sSUQKLQkgKiBAcmV0dXJuIFRoZSBWZXJzaW9ucyBjbGFzcyBmb3IgdGhlIGdpdmVuIFRvb2wgSUQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEVQRlZlcnNpb25zIGdldFZlcnNpb25zKFN0cmluZyB0b29sSUQpIHsKLQkJcmV0dXJuIChFUEZWZXJzaW9ucykgdmVyc2lvbnMuZ2V0KHRvb2xJRCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHJldHVybiB0cnVlIGlmZiB2ZXJzaW9uIGNoZWNraW5nIGlzIGRpc2FibGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzVmVyc2lvbkNoZWNraW5nRGlzYWJsZWQoKSB7Ci0JCXJldHVybiB2ZXJzaW9uQ2hlY2tpbmdEaXNhYmxlZDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFBhdHRlcm4gcF9YTUlWZXJzaW9uUGF0dGVybiA9IFBhdHRlcm4uY29tcGlsZSgKLQkJCSIoXFx3Kz8pOnZlcnNpb249XCIoLis/KVwiIiwgUGF0dGVybi5ET1RBTEwpOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFBhdHRlcm4gcF9YTUxWZXJzaW9uQXR0cmlidXRlUGF0dGVybiA9IFBhdHRlcm4uY29tcGlsZSgKLQkJCSJ0b29sPVwiKC4qPylcIiIsIFBhdHRlcm4uRE9UQUxMKTsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBQYXR0ZXJuIHBfWE1JX0VMRU1FTlRfU1RBUlRfVEFHID0gUGF0dGVybgotCQkJLmNvbXBpbGUoIjw/eG1sIHZlcnNpb249XCIuKz9cIiBlbmNvZGluZz1cIi4rP1wiPz4iKTsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX0VMRU1FTlRfRU5EX1RBRyA9ICI+IjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1JX0FUVFJJQlVURV9UQUcgPSAieG1pIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX0VMRU1FTlRfU1RBUlRfVEFHID0gIjx1bWE6TWV0aG9kTGlicmFyeSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9WRVJTSU9OU19TRVBBUkFUT1IgPSAiOyI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9UT09MX1ZFUlNJT05fU0VQQVJBVE9SID0gIj0iOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBHaXZlbiBhbiBYTUwgZmlsZSwgd2lsbCByZWFkIHRoZSB0b29sPSJmb289YS5iLmMuZDtiYXI9dy54LnkueiIKLQkgKiBhdHRyaWJ1dGVzIGFuZCByZXR1cm4gYSBtYXAgb2YgdGhlIGlkLXRvLXZlcnNpb25zLgotCSAqIAotCSAqIEBwYXJhbSB4bWxGaWxlCi0JICogICAgICAgICAgICBmaWxlIHRvIHByb2Nlc3MKLQkgKiBAcmV0dXJuIG51bGwgaWYgbm8gdmVyc2lvbnMgZm91bmQ7IGEgbWFwIG9mIHRoZSBpZC10by12ZXJzaW9ucyBvdGhlcndpc2UKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIE1hcCByZWFkVmVyc2lvbnNGcm9tWE1MRmlsZShGaWxlIHhtbEZpbGUpIHsKLQkJTWFwPFN0cmluZywgU3RyaW5nPiB2ZXJzaW9ucyA9IG5ldyBMaW5rZWRIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOwotCQlTdHJpbmdCdWZmZXIgYnVmID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWJ1ZiA9IEZpbGVVdGlsLnJlYWRGaWxlKHhtbEZpbGUsIEZpbGVVdGlsLkVOQ09ESU5HX1VURl84KTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQlTZXJ2aWNlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihleCk7Ci0JCX0KLQkJaWYgKGJ1ZiAhPSBudWxsKSB7Ci0JCQlpbnQgeG1pRWxlbWVudFN0YXJ0SWR4ID0gYnVmLmluZGV4T2YoWE1MX0VMRU1FTlRfU1RBUlRfVEFHKTsKLQkJCWlmICh4bWlFbGVtZW50U3RhcnRJZHggIT0gLTEpIHsKLQkJCQlpbnQgeG1pRWxlbWVudEVuZElkeCA9IGJ1Zi5pbmRleE9mKFhNTF9FTEVNRU5UX0VORF9UQUcsCi0JCQkJCQl4bWlFbGVtZW50U3RhcnRJZHggKyBYTUxfRUxFTUVOVF9TVEFSVF9UQUcubGVuZ3RoKCkpOwotCQkJCWlmICh4bWlFbGVtZW50RW5kSWR4ICE9IC0xKSB7Ci0JCQkJCVN0cmluZyByb290RWxlbWVudCA9IGJ1Zi5zdWJzdHJpbmcoeG1pRWxlbWVudFN0YXJ0SWR4LAotCQkJCQkJCXhtaUVsZW1lbnRFbmRJZHgpOwotCQkJCQlNYXRjaGVyIG1BdHRyaWJ1dGUgPSBwX1hNTFZlcnNpb25BdHRyaWJ1dGVQYXR0ZXJuCi0JCQkJCQkJLm1hdGNoZXIocm9vdEVsZW1lbnQpOwotCQkJCQlpZiAobUF0dHJpYnV0ZS5maW5kKCkpIHsKLQkJCQkJCVN0cmluZyB0b29sc0F0dHJpYnV0ZSA9IG1BdHRyaWJ1dGUuZ3JvdXAoMSk7Ci0JCQkJCQlpZiAodG9vbHNBdHRyaWJ1dGUgIT0gbnVsbAotCQkJCQkJCQkmJiB0b29sc0F0dHJpYnV0ZS5sZW5ndGgoKSA+IDApIHsKLQkJCQkJCQlTdHJpbmdbXSB2ZXJzaW9uc0FycmF5ID0gU3RyVXRpbC5zcGxpdCgKLQkJCQkJCQkJCXRvb2xzQXR0cmlidXRlLCBYTUxfVkVSU0lPTlNfU0VQQVJBVE9SKTsKLQkJCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHZlcnNpb25zQXJyYXkubGVuZ3RoOyBpKyspIHsKLQkJCQkJCQkJaWYgKHZlcnNpb25zQXJyYXlbaV0gIT0gbnVsbAotCQkJCQkJCQkJCSYmIHZlcnNpb25zQXJyYXlbaV0ubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJCQkJCQlTdHJpbmdbXSB2ZXJzaW9uSW5mb0FycmF5ID0gU3RyVXRpbC5zcGxpdCgKLQkJCQkJCQkJCQkJdmVyc2lvbnNBcnJheVtpXSwKLQkJCQkJCQkJCQkJWE1MX1RPT0xfVkVSU0lPTl9TRVBBUkFUT1IpOwotCQkJCQkJCQkJaWYgKHZlcnNpb25JbmZvQXJyYXkubGVuZ3RoICE9IDIpCi0JCQkJCQkJCQkJY29udGludWU7Ci0JCQkJCQkJCQlTdHJpbmcgdG9vbElEID0gdmVyc2lvbkluZm9BcnJheVswXTsKLQkJCQkJCQkJCVN0cmluZyB0b29sVmVyc2lvbiA9IHZlcnNpb25JbmZvQXJyYXlbMV07Ci0JCQkJCQkJCQlpZiAodG9vbElEICE9IG51bGwKLQkJCQkJCQkJCQkJJiYgdG9vbElELnRyaW0oKS5sZW5ndGgoKSA+IDAKLQkJCQkJCQkJCQkJJiYgdG9vbFZlcnNpb24gIT0gbnVsbAotCQkJCQkJCQkJCQkmJiB0b29sVmVyc2lvbi50cmltKCkubGVuZ3RoKCkgPiAwKQotCQkJCQkJCQkJCXZlcnNpb25zLnB1dCh0b29sSUQsIHRvb2xWZXJzaW9uKTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAodmVyc2lvbnMuc2l6ZSgpID09IDApIHsKLQkJCXJldHVybiBudWxsOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIHZlcnNpb25zOwotCQl9Ci0JfQotCi0JLyoqCi0JICogR2l2ZW4gYW4gWE1JIGZpbGUsIHdpbGwgcmVhZCB0aGUgZm9vOnZlcnNpb249IngueC54IiBhdHRyaWJ1dGVzIGFuZAotCSAqIHJldHVybiBhIG1hcCBvZiB0aGUgaWQtdG8tdmVyc2lvbnMuCi0JICogCi0JICogQHBhcmFtIHhtbEZpbGUKLQkgKiAgICAgICAgICAgIGZpbGUgdG8gcHJvY2VzcwotCSAqIEByZXR1cm4gbnVsbCBpZiBubyB2ZXJzaW9ucyBmb3VuZDsgYSBtYXAgb2YgdGhlIGlkLXRvLXZlcnNpb25zIG90aGVyd2lzZQotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgTWFwIHJlYWRWZXJzaW9uc0Zyb21YTUlGaWxlKEZpbGUgeG1pRmlsZSkgewotCQlNYXA8U3RyaW5nLCBTdHJpbmc+IHZlcnNpb25zID0gbmV3IExpbmtlZEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7Ci0JCVN0cmluZ0J1ZmZlciBidWYgPSBudWxsOwotCQl0cnkgewotCQkJYnVmID0gRmlsZVV0aWwucmVhZEZpbGUoeG1pRmlsZSwgRmlsZVV0aWwuRU5DT0RJTkdfVVRGXzgpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCVNlcnZpY2VQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGV4KTsKLQkJfQotCQlpZiAoYnVmICE9IG51bGwpIHsKLQkJCU1hdGNoZXIgZG9jU3RhcnRNYXRjaGVyID0gcF9YTUlfRUxFTUVOVF9TVEFSVF9UQUcubWF0Y2hlcihidWYpOwotCQkJaWYgKGRvY1N0YXJ0TWF0Y2hlci5maW5kKCkpIHsKLQkJCQlpbnQgZG9jSGVhZGVyRW5kSWR4ID0gZG9jU3RhcnRNYXRjaGVyLmVuZCgpOwotCQkJCWludCB4bWlFbGVtZW50RW5kSWR4ID0gYnVmLmluZGV4T2YoWE1MX0VMRU1FTlRfRU5EX1RBRywKLQkJCQkJCWRvY0hlYWRlckVuZElkeCk7Ci0JCQkJaWYgKHhtaUVsZW1lbnRFbmRJZHggIT0gLTEpIHsKLQkJCQkJU3RyaW5nIHJvb3RFbGVtZW50ID0gYnVmLnN1YnN0cmluZyhkb2NIZWFkZXJFbmRJZHgsCi0JCQkJCQkJeG1pRWxlbWVudEVuZElkeCArIDEpOwotCQkJCQlNYXRjaGVyIG0gPSBwX1hNSVZlcnNpb25QYXR0ZXJuLm1hdGNoZXIocm9vdEVsZW1lbnQpOwotCQkJCQl3aGlsZSAobS5maW5kKCkpIHsKLQkJCQkJCVN0cmluZyB0b29sSUQgPSBtLmdyb3VwKDEpOwotCQkJCQkJaWYgKHRvb2xJRC5lcXVhbHMoWE1JX0FUVFJJQlVURV9UQUcpKQotCQkJCQkJCWNvbnRpbnVlOwotCQkJCQkJU3RyaW5nIHRvb2xWZXJzaW9uID0gbS5ncm91cCgyKTsKLQkJCQkJCWlmICh0b29sSUQgIT0gbnVsbCAmJiB0b29sSUQudHJpbSgpLmxlbmd0aCgpID4gMAotCQkJCQkJCQkmJiB0b29sVmVyc2lvbiAhPSBudWxsCi0JCQkJCQkJCSYmIHRvb2xWZXJzaW9uLnRyaW0oKS5sZW5ndGgoKSA+IDApCi0JCQkJCQkJdmVyc2lvbnMucHV0KHRvb2xJRCwgdG9vbFZlcnNpb24pOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmICh2ZXJzaW9ucy5zaXplKCkgPT0gMCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gdmVyc2lvbnM7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBHaXZlbiBhIGZpbGUsIHdpbGwgcmVhZCB2ZXJzaW9uIGluZm9ybWF0aW9uIGFuZCByZXR1cm4gYSBtYXAgb2YgdGhlCi0JICogaWQtdG8tdmVyc2lvbnMuCi0JICogCi0JICogQHBhcmFtIGZpbGUKLQkgKiAgICAgICAgICAgIGZpbGUgdG8gcHJvY2VzcwotCSAqIEByZXR1cm4gbnVsbCBpZiBubyB2ZXJzaW9ucyBmb3VuZDsgYSBtYXAgb2YgdGhlIGlkLXRvLXZlcnNpb25zIG90aGVyd2lzZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgTWFwIHJlYWRWZXJzaW9uc0Zyb21GaWxlKEZpbGUgZmlsZSkgewotCQlpZiAoZmlsZS5nZXROYW1lKCkudG9VcHBlckNhc2UoKS5lbmRzV2l0aCgiWE1JIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIHJlYWRWZXJzaW9uc0Zyb21YTUlGaWxlKGZpbGUpOwotCQl9IGVsc2UgaWYgKGZpbGUuZ2V0TmFtZSgpLnRvVXBwZXJDYXNlKCkuZW5kc1dpdGgoIlhNTCIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiByZWFkVmVyc2lvbnNGcm9tWE1MRmlsZShmaWxlKTsKLQkJfSBlbHNlIHsKLQkJCU1hcCB2ZXJzaW9ucyA9IHJlYWRWZXJzaW9uc0Zyb21YTUlGaWxlKGZpbGUpOwotCQkJaWYgKHZlcnNpb25zICE9IG51bGwpCi0JCQkJcmV0dXJuIHZlcnNpb25zOwotCQkJdmVyc2lvbnMgPSByZWFkVmVyc2lvbnNGcm9tWE1MRmlsZShmaWxlKTsKLQkJCWlmICh2ZXJzaW9ucyAhPSBudWxsKQotCQkJCXJldHVybiB2ZXJzaW9uczsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBHaXZlbiBhIGZpbGUsIHdpbGwgY29tcGFyZSB3aXRoIGN1cnJlbnQgWE1MIFNjaGVtYSB2ZXJzaW9uLgotCSAqIAotCSAqIEBwYXJhbSBmaWxlCi0JICogQHJldHVybiBudWxsIGlmIGZpbGUgdG9vbCB2ZXJzaW9uIGNhbiBub3QgYmUgZm91bmQ7IGEgVmVyc2lvbkNoZWNrSW5mbwotCSAqICAgICAgICAgb2JqZWN0IG90aGVyd2lzZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgVmVyc2lvbkNoZWNrSW5mbyBjaGVja1hNTFZlcnNpb24oRmlsZSBmaWxlKSB7Ci0JCU1hcCB2ZXJzaW9uTWFwID0gVmVyc2lvblV0aWwucmVhZFZlcnNpb25zRnJvbUZpbGUoZmlsZSk7Ci0JCWlmICh2ZXJzaW9uTWFwID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9IGVsc2UgewotCQkJVmVyc2lvbkNoZWNrSW5mbyB2Y2kgPSBudWxsOwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gdG9vbElEc0NoZWNrTGlzdC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlTdHJpbmcgdG9vbElEID0gKFN0cmluZykgaXRlci5uZXh0KCk7Ci0JCQkJaWYgKHZlcnNpb25NYXAuZ2V0KHRvb2xJRCkgIT0gbnVsbCkgewotCQkJCQlTdHJpbmcgdG9vbFZlcnNpb24gPSAoU3RyaW5nKSB2ZXJzaW9uTWFwLmdldCh0b29sSUQpOwotCQkJCQl2Y2kgPSBfY2hlY2tYTUxWZXJzaW9uKHRvb2xJRCwgdG9vbFZlcnNpb24pOwotCQkJCQlpZiAodmNpICE9IG51bGwpCi0JCQkJCQlyZXR1cm4gdmNpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBWZXJzaW9uQ2hlY2tJbmZvIF9jaGVja1hNTFZlcnNpb24oU3RyaW5nIHRvb2xJRCwKLQkJCVN0cmluZyB0b29sVmVyc2lvbikgewotCQkvLyBnZXQgdGhlIGNsYXNzIHRoYXQgc3RvcmVzIGFsbCB0aGUgdmVyc2lvbiBpbmZvIGZvciB0aGlzIHRvb2wgSUQKLQkJRVBGVmVyc2lvbnMgdmVyc2lvbnMgPSBnZXRWZXJzaW9ucyh0b29sSUQpOwotCQlpZiAodmVyc2lvbnMgIT0gbnVsbCkgewotCQkJRVBGVmVyc2lvbiBtaW5DdXJyVmVyc2lvbiA9IHZlcnNpb25zCi0JCQkJCS5nZXRNaW5Ub29sVmVyc2lvbkZvckN1cnJlbnRYTUxTY2hlbWFWZXJzaW9uKCk7Ci0JCQlpbnQgcmVzdWx0ID0gbWluQ3VyclZlcnNpb24uY29tcGFyZVRvb2xWZXJzaW9uVG8obmV3IFZlcnNpb24oCi0JCQkJCXRvb2xWZXJzaW9uKSk7Ci0JCQlTdHJpbmcgY3VycmVudE1pblRvb2xWZXJzaW9uID0gbWluQ3VyclZlcnNpb24uZ2V0VG9vbFZlcnNpb24oKQotCQkJCQkudG9TdHJpbmcoKTsKLQkJCXJldHVybiBuZXcgVmVyc2lvbkNoZWNrSW5mbyh0b29sSUQsIHRvb2xWZXJzaW9uLAotCQkJCQljdXJyZW50TWluVG9vbFZlcnNpb24sIC1yZXN1bHQpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEdpdmVuIGEgZmlsZSwgY29tcGFyZXMgd2l0aCBjdXJyZW50IGxpYnJhcnkgc2NoZW1hIHZlcnNpb24KLQkgKiAKLQkgKiBAcGFyYW0gZmlsZQotCSAqIEByZXR1cm4gbnVsbCBpZiBmaWxlIHRvb2wgdmVyc2lvbiBjYW4gbm90IGJlIGZvdW5kOyBhIFZlcnNpb25DaGVja0luZm8KLQkgKiAgICAgICAgIG9iamVjdCBvdGhlcndpc2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFZlcnNpb25DaGVja0luZm8gY2hlY2tMaWJyYXJ5VmVyc2lvbihGaWxlIGZpbGUpIHsKLQkJaWYgKGZpbGUuZ2V0TmFtZSgpLmVxdWFscygibGlicmFyeS54bWkiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkvLyBjaGVjayBsaWJyYXJ5IGV4dGVuc2lvbnMgZmlyc3QKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHRvb2xJRHNDaGVja0xpc3QuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJU3RyaW5nIHRvb2xJRCA9IChTdHJpbmcpIGl0ZXIubmV4dCgpOwotCQkJCWlmIChsaWJFeHRDaGVja2Vycy5nZXQodG9vbElEKSAhPSBudWxsKSB7Ci0JCQkJCVZlcnNpb25DaGVja0luZm8gdmNpID0gbnVsbDsKLQkJCQkJSUxpYnJhcnlFeHRlbnNpb25WZXJzaW9uQ2hlY2sgZXh0Q2hlY2sgPSAoSUxpYnJhcnlFeHRlbnNpb25WZXJzaW9uQ2hlY2spIGxpYkV4dENoZWNrZXJzCi0JCQkJCQkJLmdldCh0b29sSUQpOwotCQkJCQl2Y2kgPSBleHRDaGVjay5jaGVja0xpYnJhcnlWZXJzaW9uKGZpbGUuZ2V0UGFyZW50RmlsZSgpKTsKLQkJCQkJaWYgKHZjaSAhPSBudWxsKQotCQkJCQkJcmV0dXJuIHZjaTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJTWFwIHZlcnNpb25NYXAgPSBWZXJzaW9uVXRpbC5yZWFkVmVyc2lvbnNGcm9tRmlsZShmaWxlKTsKLQkJaWYgKHZlcnNpb25NYXAgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0gZWxzZSB7Ci0JCQlWZXJzaW9uQ2hlY2tJbmZvIHZjaSA9IG51bGw7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB0b29sSURzQ2hlY2tMaXN0Lml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCVN0cmluZyB0b29sSUQgPSAoU3RyaW5nKSBpdGVyLm5leHQoKTsKLQkJCQlpZiAodmVyc2lvbk1hcC5nZXQodG9vbElEKSAhPSBudWxsKSB7Ci0JCQkJCVN0cmluZyB0b29sVmVyc2lvbiA9IChTdHJpbmcpIHZlcnNpb25NYXAuZ2V0KHRvb2xJRCk7Ci0JCQkJCXZjaSA9IF9jaGVja0xpYlZlcnNpb24odG9vbElELCB0b29sVmVyc2lvbik7Ci0JCQkJCWlmICh2Y2kgIT0gbnVsbCkKLQkJCQkJCXJldHVybiB2Y2k7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgc3RhdGljIFZlcnNpb25DaGVja0luZm8gX2NoZWNrTGliVmVyc2lvbihTdHJpbmcgdG9vbElELAotCQkJU3RyaW5nIHRvb2xWZXJzaW9uKSB7Ci0JCS8vIGdldCB0aGUgY2xhc3MgdGhhdCBzdG9yZXMgYWxsIHRoZSB2ZXJzaW9uIGluZm8gZm9yIHRoaXMgdG9vbCBJRAotCQlFUEZWZXJzaW9ucyB2ZXJzaW9ucyA9IGdldFZlcnNpb25zKHRvb2xJRCk7Ci0JCWlmICh2ZXJzaW9ucyAhPSBudWxsKSB7Ci0JCQlFUEZWZXJzaW9uIG1pbkN1cnJWZXJzaW9uID0gdmVyc2lvbnMKLQkJCQkJLmdldE1pblRvb2xWZXJzaW9uRm9yQ3VycmVudExpYnJhcnlWZXJzaW9uKCk7Ci0JCQlpbnQgcmVzdWx0ID0gbWluQ3VyclZlcnNpb24uY29tcGFyZVRvb2xWZXJzaW9uVG8obmV3IFZlcnNpb24oCi0JCQkJCXRvb2xWZXJzaW9uKSk7Ci0JCQlTdHJpbmcgY3VycmVudE1pblRvb2xWZXJzaW9uID0gbWluQ3VyclZlcnNpb24uZ2V0VG9vbFZlcnNpb24oKQotCQkJCQkudG9TdHJpbmcoKTsKLQkJCXJldHVybiBuZXcgVmVyc2lvbkNoZWNrSW5mbyh0b29sSUQsIHRvb2xWZXJzaW9uLAotCQkJCQljdXJyZW50TWluVG9vbFZlcnNpb24sIC1yZXN1bHQpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGZpcnN0IHRvb2xJRCB0aGF0IGlzIGNoZWNrZWQuIEluIG1vc3QgY2FzZXMsIHRoZSBJRCBvZiB0aGUKLQkgKiAgICAgICAgIGN1cnJlbnRseSBydW5uaW5nIGFwcGxpY2F0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UHJpbWFyeVRvb2xJRCgpIHsKLQkJcmV0dXJuIChTdHJpbmcpIHRvb2xJRHNDaGVja0xpc3QuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIEFkZHMgYSB0b29sIElEIHRvIHRoZSBvcmRlciBvZiB0b29scyB0byBjaGVjay4KLQkgKiAKLQkgKiBAcGFyYW0gdG9vbElECi0JICogICAgICAgICAgICB0b29sSUQgdG8gYWRkCi0JICogQHBhcmFtIHRvb2xJRGZvbGxvd2luZwotCSAqICAgICAgICAgICAgaWYgbnVsbCwgYWRkcyB0b29sSUQgdG8gZnJvbnQgb2YgbGlzdC4gb3RoZXJ3aXNlLCBhZGRzIHRvb2xJRAotCSAqICAgICAgICAgICAgYmVmb3JlIHRoZSBzcGVjaWZpZWQgSUQKLQkgKiBAcmV0dXJuIGZhbHNlIGlmZiB0b29sSURmb2xsb3dpbmcgaXMgbm90IG51bGwgYW5kIGNvdWxkIG5vdCBiZSBmb3VuZCBpbgotCSAqICAgICAgICAgbGlzdDsgdHJ1ZSBvdGhlcndpc2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gYWRkVG9vbElEKFN0cmluZyB0b29sSUQsIFN0cmluZyB0b29sSURmb2xsb3dpbmcpIHsKLQkJaWYgKHRvb2xJRGZvbGxvd2luZyAhPSBudWxsKSB7Ci0JCQlpbnQgaWR4ID0gdG9vbElEc0NoZWNrTGlzdC5pbmRleE9mKHRvb2xJRGZvbGxvd2luZyk7Ci0JCQlpZiAoaWR4ICE9IC0xKSB7Ci0JCQkJdG9vbElEc0NoZWNrTGlzdC5hZGQoaWR4LCB0b29sSUQpOwotCQkJCXJldHVybiB0cnVlOwotCQkJfSBlbHNlIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQkJdG9vbElEc0NoZWNrTGlzdC5hZGQoMCwgdG9vbElEKTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpLy5jbGFzc3BhdGggYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1MWM4ZjIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS8ucHJvamVjdCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24udWkvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzY2U2YTAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmVwZi5jb21tb24udWk8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLmNvcmUucHJlZnMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGRhOGE4NC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotI0ZyaSBKYW4gMDQgMTU6MDk6MDkgUFNUIDIwMDgKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1wbHVnaW5Qcm9qZWN0LmV4dGVuc2lvbnM9ZmFsc2UKLXJlc29sdmUucmVxdWlyZWJ1bmRsZT1mYWxzZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24udWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlNDkwYjQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpCi1CdW5kbGUtVmVyc2lvbjogMS41LjAucXVhbGlmaWVyCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpLkNvbW1vblVJUGx1Z2luCi1JbXBvcnQtUGFja2FnZTogb3JnLm9zZ2kuZnJhbWV3b3JrO3ZlcnNpb249IjEuMy4wIgotRWNsaXBzZS1MYXp5U3RhcnQ6IHRydWUKLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS51aTt2aXNpYmlsaXR5Oj1yZWV4cG9ydCwKLSBvcmcuZWNsaXBzZS5lcGYuY29tbW9uO3Zpc2liaWxpdHk6PXJlZXhwb3J0Ci1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aSwKLSBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpLmFjdGlvbnMsCi0gb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS51dGlsCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpL2J1aWxkLnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0ZDJlNGQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi1zb3VyY2UuLiA9IHNyYy8KLW91dHB1dC4uID0gYmluLwotYmluLmluY2x1ZGVzID0gTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIC4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vdWkvQWJzdHJhY3RQbHVnaW4uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vdWkvQWJzdHJhY3RQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGRmZTJiNy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3VpL0Fic3RyYWN0UGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MjkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aTsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkk7Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuaW50ZXJuYWwucnVudGltZS5JbnRlcm5hbFBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5GaWxlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5JQWN0aXZhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24uc2VydmljZWFiaWxpdHkuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udWkudXRpbC5Nc2dEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5GaWxlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLkkxOG5VdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotCi0vKioKLSAqIFRoZSBhYnN0cmFjdCBiYXNlIGNsYXNzIGZvciBhbGwgRVBGIHBsdWctaW5zLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RQbHVnaW4gZXh0ZW5kcyBBYnN0cmFjdFVJUGx1Z2luIGltcGxlbWVudHMgSUFjdGl2YXRvciB7Ci0KLQotCS8vIFRoZSByZWxhdGl2ZSBwYXRoIHRvIHRoZSBpY29ucy4KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUNPTl9QQVRIID0gImljb25zLyI7IC8vJE5PTi1OTFMtMSQ7Ci0KLQkvLyBUaGUgbG9nZ2VyIGhhc2ggbWFwLgotCXByaXZhdGUgc3RhdGljIE1hcDxTdHJpbmcsIExvZ2dlcj4gbG9nZ2VycyA9IG5ldyBIYXNoTWFwPFN0cmluZywgTG9nZ2VyPigpOwotCi0JLy8gVGhlIG1lc3NhZ2UgZGlhbG9nIGhhc2ggbWFwLgotCXByaXZhdGUgc3RhdGljIE1hcDxTdHJpbmcsIE1zZ0RpYWxvZz4gbXNnRGlhbG9ncyA9IG5ldyBIYXNoTWFwPFN0cmluZywgTXNnRGlhbG9nPigpOwotCi0JLy8gVGhlIHNoYXJlZCBpbWFnZSBoYXNoIG1hcC4KLQlwcml2YXRlIHN0YXRpYyBNYXA8U3RyaW5nLCBJbWFnZT4gc2hhcmVkSW1hZ2VzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBJbWFnZT4oKTsKLQotCS8vIFRoZSByZXNvdXJjZSBidW5kbGUgZm9yIHRoaXMgcGx1Zy1pbi4KLQlwcml2YXRlIFJlc291cmNlQnVuZGxlIHJlc291cmNlQnVuZGxlOwotCi0JLy8gVGhpcyBwbHVnLWluIElELgotCXByaXZhdGUgU3RyaW5nIHBsdWdpbklkOwotCi0JLy8gVGhlIHBsdWctaW4gaW5zdGFsbCBVUkwuCi0JcHJpdmF0ZSBVUkwgaW5zdGFsbFVSTDsKLQotCS8vIFRoZSBwbHVnLWluIGluc3RhbGwgcGF0aC4KLQlwcml2YXRlIFN0cmluZyBpbnN0YWxsUGF0aDsKLQotCS8vIFRoZSBwbHVnLWluIGljb24gVVJMLgotCXByaXZhdGUgVVJMIGljb25VUkw7Ci0KLQkvLyBUaGUgcHJvZmlsaW5nIGZsYWcuCi0JcHJpdmF0ZSBib29sZWFuIHByb2ZpbGluZzsKLQotCS8qKgotCSAqIERlZmF1bHQgY29uc3RydWN0b3IuCi0JICovCi0JcHVibGljIEFic3RyYWN0UGx1Z2luKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW4jc3RhcnQoQnVuZGxlQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdGFydChjb250ZXh0KTsKLQotCQlpbml0KGNvbnRleHQpOwotCi0JCS8vIHNldCB0aGUgCi0JCWlmIChpc0RlYnVnZ2luZygpKSB7Ci0JCQlnZXRMb2dnZXIoKS5sb2dJbmZvKCJTdGFydGVkICIgKyBwbHVnaW5JZCk7IC8vJE5PTi1OTFMtMSQJCQkKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW4jc3RvcChCdW5kbGVDb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJLy8gRnJlZSB0aGUgc2hhcmVkIGltYWdlcy4KLQkJZm9yIChJdGVyYXRvciBpbWFnZXMgPSBzaGFyZWRJbWFnZXMudmFsdWVzKCkuaXRlcmF0b3IoKTsgaW1hZ2VzCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCUltYWdlIGltYWdlID0gKEltYWdlKSBpbWFnZXMubmV4dCgpOwotCQkJaWYgKGltYWdlICE9IG51bGwgJiYgIWltYWdlLmlzRGlzcG9zZWQoKSkgewotCQkJCWltYWdlLmRpc3Bvc2UoKTsKLQkJCX0KLQkJfQotCi0JCXN1cGVyLnN0b3AoY29udGV4dCk7Ci0KLQkJaWYgKGlzRGVidWdnaW5nKCkpIHsKLQkJCWdldExvZ2dlcigpLmxvZ0luZm8oIlN0b3BwZWQgIiArIHBsdWdpbklkKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZXMgdGhpcyBwbHVnLWluLgotCSAqIAotCSAqIEBwYXJhbSBjb250ZXh0Ci0JICogICAgICAgICAgICBUaGUgYnVuZGxlIGNvbnRleHQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQkvLyBHZXQgdGhlIGJ1bmRsZSBmb3IgdGhpcyBwbHVnLWluLgotCQlCdW5kbGUgYnVuZGxlID0gZ2V0QnVuZGxlKCk7Ci0KLQkJLy8gR2V0IHRoZSByZXNvdWNlIGJ1bmRsZSBmb3IgdGhpcyBwbHVnLWluLgotCQlyZXNvdXJjZUJ1bmRsZSA9IFBsYXRmb3JtLmdldFJlc291cmNlQnVuZGxlKGJ1bmRsZSk7Ci0KLQkJLy8gR2V0IHRoZSBJRCBmb3IgdGhpcyBwbHVnLWluLgotCQlwbHVnaW5JZCA9IGJ1bmRsZS5nZXRTeW1ib2xpY05hbWUoKTsKLQotCQlpZiAoaXNEZWJ1Z2dpbmcoKSkgewotCQkJZ2V0TG9nZ2VyKCkubG9nSW5mbygiSW5pdGlhbGl6aW5nICIgKyBwbHVnaW5JZCk7IC8vJE5PTi1OTFMtMSQJCQotCQl9Ci0KLQkJLy8gR2V0IHRoZSBpbnN0YWxsIHBhdGggb2YgdGhpcyBwbHVnLWluLgotCQlpbnN0YWxsVVJMID0gYnVuZGxlLmdldEVudHJ5KCIvIik7IC8vJE5PTi1OTFMtMSQKLQotCQl0cnkgewotCQkJaW5zdGFsbFBhdGggPSBGaWxlTG9jYXRvci5yZXNvbHZlKGluc3RhbGxVUkwpLmdldFBhdGgoKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJaW5zdGFsbFBhdGggPSBQbGF0Zm9ybS5nZXRJbnN0YWxsTG9jYXRpb24oKS5nZXRVUkwoKS5nZXRQYXRoKCk7Ci0JCX0KLQotCQl0cnkgewotCQkJaWNvblVSTCA9IG5ldyBVUkwoaW5zdGFsbFVSTCwgSUNPTl9QQVRIKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQl9Ci0KLQkJU3RyaW5nIHN5bWJvbGljTmFtZSA9IGJ1bmRsZS5nZXRTeW1ib2xpY05hbWUoKTsKLQkJaWYgKHN5bWJvbGljTmFtZSAhPSBudWxsKSB7Ci0JCQlTdHJpbmcga2V5ID0gc3ltYm9saWNOYW1lICsgIi9wcm9maWxpbmciOyAvLyROT04tTkxTLTEkCi0JCQlTdHJpbmcgdmFsdWUgPSBJbnRlcm5hbFBsYXRmb3JtLmdldERlZmF1bHQoKS5nZXRPcHRpb24oa2V5KTsKLQkJCXByb2ZpbGluZyA9IHZhbHVlID09IG51bGwgPyBmYWxzZSA6IHZhbHVlLmVxdWFsc0lnbm9yZUNhc2UoInRydWUiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJaWYgKGlzRGVidWdnaW5nKCkpIHsKLQkJCWdldExvZ2dlcigpLmxvZ0luZm8oCi0JCQkJCSJJbml0aWFsaXplZCAiICsgcGx1Z2luSWQgKyAiLCBpbnN0YWxsUGF0aD0iICsgaW5zdGFsbFBhdGgpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIElEIG9mIHRoaXMgcGx1Zy1pbi4KLQkgKiAKLQkgKiBAcmV0dXJuIFRoZSBJRCBvZiB0aGlzIHBsdWctaW4uCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJcmV0dXJuIHBsdWdpbklkOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGluc3RhbGwgVVJMIG9mIHRoaXMgcGx1Zy1pbi4KLQkgKiAKLQkgKiBAcGFyYW0gVGhlCi0JICogICAgICAgICAgICBpbnN0YWxsIFVSTCBvZiB0aGlzIHBsdWctaW4uCi0JICovCi0JcHVibGljIFVSTCBnZXRJbnN0YWxsVVJMKCkgewotCQlyZXR1cm4gaW5zdGFsbFVSTDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBpbnN0YWxsIHBhdGggb2YgdGhpcyBwbHVnLWluLgotCSAqIAotCSAqIEBwYXJhbSBUaGUKLQkgKiAgICAgICAgICAgIGluc3RhbGwgcGF0aCBvZiB0aGlzIHBsdWctaW4uCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJbnN0YWxsUGF0aCgpIHsKLQkJcmV0dXJuIGluc3RhbGxQYXRoOwotCX0KLQotCS8qKgotCSAqIExvYWRzIGFuZCByZXR1cm5zIHRoZSBsb2NhbGl6ZWQgcHJvcGVydGllcyBvZiBhIEphdmEgcHJvcGVydGllcyBmaWxlLgotCSAqIDxwPgotCSAqIAotCSAqIEBwYXJhbSBwYXRoCi0JICogICAgICAgICAgICBUaGUgcHJvcGVydGllcyBmaWxlIHBhdGggcmVsYXRpdmUgdG8gdGhlIHBsdWctaW4gcm9vdC4KLQkgKiBAcmV0dXJuIEEgPGNvZGU+UHJvcGVydGllczwvY29kZT4gb2JqZWN0LgotCSAqLwotCXB1YmxpYyBQcm9wZXJ0aWVzIGdldFByb3BlcnRpZXMoU3RyaW5nIHBhdGgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCVByb3BlcnRpZXMgcHJvcHMgPSBuZXcgUHJvcGVydGllcygpOwotCQlpZiAocGF0aCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gcHJvcHM7Ci0JCX0KLQotCQlTdHJpbmcgZmlsZVBhdGggPSBnZXRMb2NhbGl6ZWRGaWxlKHBhdGgsIHRydWUpOwotCQlpZiAoZmlsZVBhdGggIT0gbnVsbCkgewotCQkJcHJvcHMubG9hZChuZXcgRmlsZUlucHV0U3RyZWFtKGZpbGVQYXRoKSk7Ci0JCX0KLQotCQlyZXR1cm4gcHJvcHM7Ci0JfQotCi0JLyoqCi0JICogZ2V0IHRoZSBsb2NhbGUgc3BlY2lmaWMgYWJzb2x1dGUgZmlsZSBwYXRoIG5hbWUgb2YgdGhlIGdpdmVuIGZpbGUgaW4gdGhlCi0JICogcGx1Z2luLgotCSAqIAotCSAqIEBwYXJhbSBwYXRoCi0JICogICAgICAgICAgICBUaGUgcHJvcGVydGllcyBmaWxlIHBhdGggcmVsYXRpdmUgdG8gdGhlIHBsdWctaW4gcm9vdC4KLQkgKiBAcmV0dXJuIFN0cmluZyB0aGUgbG9jYWxlIHNwZWNpZmljIGFic29sdXRlIGZpbGUgcGF0aCBuYW1lIG9mIHRoZSBnaXZlbgotCSAqICAgICAgICAgZmlsZS4KLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMb2NhbGl6ZWRGaWxlKFN0cmluZyBwYXRoLCBib29sZWFuIHVzZURlZmF1bHQpCi0JCQl0aHJvd3MgSU9FeGNlcHRpb24gewotCQlTdHJpbmcgZmlsZVBhdGggPSBudWxsOwotCQlTdHJpbmcgZmlsZU5hbWUgPSBGaWxlVXRpbC5nZXRGaWxlTmFtZShwYXRoKTsKLQkJaW50IGluZGV4ID0gcGF0aC5sYXN0SW5kZXhPZihmaWxlTmFtZSk7Ci0JCVN0cmluZyBwYXRoTmFtZSA9IHBhdGguc3Vic3RyaW5nKDAsIGluZGV4KTsKLQotCQlMb2NhbGUgbG9jYWxlID0gTG9jYWxlLmdldERlZmF1bHQoKTsKLQotCQlCdW5kbGUgYnVuZGxlID0gZ2V0QnVuZGxlKCk7Ci0JCUJ1bmRsZVtdIGJ1bmRsZXMgPSBQbGF0Zm9ybS5nZXRGcmFnbWVudHMoYnVuZGxlKTsKLQkJaWYgKGJ1bmRsZXMgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBidW5kbGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJVVJMIGVudHJ5ID0gYnVuZGxlc1tpXS5nZXRFbnRyeShwYXRoTmFtZSk7Ci0JCQkJaWYgKGVudHJ5ICE9IG51bGwpIHsKLQkJCQkJVVJMIHVybCA9IEZpbGVMb2NhdG9yLnJlc29sdmUoZW50cnkpOwotCQkJCQlmaWxlUGF0aCA9IEkxOG5VdGlsLmdldExvY2FsaXplZEZpbGUodXJsLmdldFBhdGgoKQotCQkJCQkJCSsgZmlsZU5hbWUsIGxvY2FsZSk7IAotCQkJCQlpZiAoZmlsZVBhdGggIT0gbnVsbCkgewotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlpZiAoZmlsZVBhdGggPT0gbnVsbCkgewotCQkJVVJMIGVudHJ5ID0gYnVuZGxlLmdldEVudHJ5KHBhdGgpOwotCQkJaWYgKGVudHJ5ICE9IG51bGwpIHsKLQkJCQlVUkwgdXJsID0gRmlsZUxvY2F0b3IucmVzb2x2ZShlbnRyeSk7Ci0JCQkJZmlsZVBhdGggPSBJMThuVXRpbC5nZXRMb2NhbGl6ZWRGaWxlKHVybC5nZXRQYXRoKCksIGxvY2FsZSk7Ci0JCQkJaWYgKGZpbGVQYXRoID09IG51bGwgJiYgdXNlRGVmYXVsdCkgewotCQkJCQlmaWxlUGF0aCA9IHVybC5nZXRQYXRoKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGZpbGVQYXRoOwotCX0KLQotCS8qKgotCSAqIGZvciB0aGUgZ2l2ZW4gcGF0aCBpbiB0aGUgcGx1Z2luLCBmaW5kIHRoZSBsb2NhbGl6ZWQgZmlsZXMgZm9ybSB0aGUgbmwKLQkgKiBmcmFnZW1lbmV0cyBhbmQgY29weSB0aGUgbG9jYWxpemVkIGZpbGVzIHRvIHRoZSBkZXN0aW5hdGlvbiBmb2xkZXIKLQkgKiAKLQkgKiBAcGFyYW0gcGF0aAotCSAqICAgICAgICAgICAgU3RyaW5nIGEgcmVsYXRpdmUgcGF0aCB0byB0aGUgcGx1Z2luIHJvb3QuIFRoZSBmaWxlcyBpbiB0aGlzCi0JICogICAgICAgICAgICBmb2xkZXIgd2lsbCBiZSBpdGVyYXRlZCBhbmQgdGhlaXIgbG9jYWxpemVkIGZpbGVzIHdpbGwgYmUKLQkgKiAgICAgICAgICAgIGNvcGllZCBvdmVyCi0JICogQHBhcmFtIHRvRGlyCi0JICogICAgICAgICAgICBGSWxlIHRoZSBkZXN0aW5hdGlvbiBmb2xkZXIKLQkgKiBAcGFyYW0gcmVjdXJzaXZlCi0JICogICAgICAgICAgICBib29sZWFuIHJlY3VyaXZlbHkgbG9va2luZyBmb3IgZmlsZXMgaW50IHRoZSBzcGVjaWZpZWQgZm9sZGVyCi0JICogQHBhcmFtIHVzZUxvY2FsZUZpbGVOYW1lCi0JICogICAgICAgICAgICBib29sZWFuIGlmIHRydWUgdGhlIGxvY2FsZSBzcGVjaWZpYyBmaWxlIG5hbWVzIHdpbGwgYmUgdXNlZCBpbgotCSAqICAgICAgICAgICAgdGhlIGNvcGllZCBkZXN0aW5hdGlvbiwgb3RoZXJ3aXNlLCB0aGUgbG9jYWxlIHNwZWNpZmljIGZpbGUKLQkgKiAgICAgICAgICAgIG5hbWUgd2lsbCBiZSByZW5hbWVkIHRvIHRoZSBkZWZhdWx0IG9uZSBpbiB0aGUgZGVzdGluYXRpb24KLQkgKiAgICAgICAgICAgIGZvbGRlcgotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBjb3B5TG9jYWxpemVkRmlsZXMoU3RyaW5nIHBhdGgsIEZpbGUgdG9EaXIsIGJvb2xlYW4gcmVjdXJzaXZlLAotCQkJYm9vbGVhbiB1c2VMb2NhbGVGaWxlTmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJU3RyaW5nIHBsdWdpblBhdGggPSBnZXRJbnN0YWxsUGF0aCgpOwotCQlVUkkgcGx1Z2luVXJpID0gbmV3IEZpbGUocGx1Z2luUGF0aCkudG9VUkkoKTsKLQkJVVJJIHBhdGhVcmkgPSBuZXcgRmlsZShwbHVnaW5QYXRoLCBwYXRoKS50b1VSSSgpOwotCi0JCUxpc3Q8RmlsZT4gZmlsZXMgPSBuZXcgQXJyYXlMaXN0PEZpbGU+KCk7Ci0JCUZpbGUgZiA9IG5ldyBGaWxlKHBsdWdpblBhdGgsIHBhdGgpOwotCQlGaWxlVXRpbC5nZXRBbGxGaWxlcyhmLCBmaWxlcywgcmVjdXJzaXZlKTsKLQotCQkvLyBmb3IgZWFjaCBmaWxlIGZvdW5kIGluIHRoZSBzcGVjaWZpZWQgZm9sZGVyLCBnZXQgdGhlIGxvY2FsaXplZCBmaWxlCi0JCWZvciAoSXRlcmF0b3IgaXQgPSBmaWxlcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlVUkkgc3JjVXJpID0gKChGaWxlKSBpdC5uZXh0KCkpLnRvVVJJKCk7Ci0KLQkJCS8vIGdldCB0aGUgcmVsYXRpdmUgcGF0aCBvZiB0aGUgZmlsZSB0byB0aGUgcGx1Z2luIHJvb3QsIHRoZW4gZmluZAotCQkJLy8gdGhlIGxvY2FsaXplZCBmaWxlCi0JCQlTdHJpbmcgcmVsUGF0aCA9IHBsdWdpblVyaS5yZWxhdGl2aXplKHNyY1VyaSkuZ2V0UGF0aCgpOwotCi0JCQkvLyBvbmx5IGdldCB0aGUgbG9jYWxlIHNwZWNpZmljIGZpbGUsIGRvbid0IGluY2x1ZGUgdGhlIGRlZmF1bHQgb25lCi0JCQlTdHJpbmcgbG9jYWxpemVkRmlsZSA9IGdldExvY2FsaXplZEZpbGUocmVsUGF0aCwgZmFsc2UpOwotCQkJaWYgKGxvY2FsaXplZEZpbGUgPT0gbnVsbCkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCi0JCQkvLyBuZWVkIHRvIGNoYW5nZSB0aGUgdGFyZ2V0IGZpbGUgcGF0aCB0byByZWxhdGl2ZSB0byB0aGUgcGF0aAotCQkJLy8gaW5zdGVhZCBvZiB0aGUgcGx1Z2luIHJvb3QKLQkJCXJlbFBhdGggPSBwYXRoVXJpLnJlbGF0aXZpemUoc3JjVXJpKS5nZXRQYXRoKCk7Ci0JCQlGaWxlIHNyY0ZpbGUgPSBuZXcgRmlsZShsb2NhbGl6ZWRGaWxlKTsKLQkJCUZpbGUgdGFyZ2V0RmlsZSA9IG5ldyBGaWxlKHRvRGlyLCByZWxQYXRoKTsKLQkJCUZpbGUgdGFyZ2V0UGFyZW50ID0gdGFyZ2V0RmlsZS5nZXRQYXJlbnRGaWxlKCk7Ci0KLQkJCS8vIGNvcHkgdGhlIGZpbGUgdG8gdGhlIGRlc2l0aW5hdGlvbgotCQkJLy8gaWYgdXNlTG9jYWxlRmlsZU5hbWUgaXMgdHJ1ZSwgdGhlIGRlc3RpbmF0aW9uIGZpbGUgbmFtZSBzaG91bGQKLQkJCS8vIGFsc28gdXNlIHRoZSBsb2NhbGUgc3BlY2lmaWMgZmlsZSBuYW1lCi0JCQlpZiAodXNlTG9jYWxlRmlsZU5hbWUpIHsKLQkJCQlTdHJpbmcgZmlsZU5hbWUgPSBzcmNGaWxlLmdldE5hbWUoKTsKLQkJCQl0YXJnZXRGaWxlID0gbmV3IEZpbGUodGFyZ2V0UGFyZW50LCBmaWxlTmFtZSk7Ci0JCQl9Ci0KLQkJCWlmIChpc0RlYnVnZ2luZygpKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJDb3B5aW5nIGxvY2FsaXplZCBmaWxlOiAiKTsgLy8kTk9OLU5MUy0xJAotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiU291cmNlOiAiICsgc3JjRmlsZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlRhcmdldDogIiArIHRhcmdldEZpbGUpOyAvLyROT04tTkxTLTEkCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKCIiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCi0JCQl0cnkgewotCQkJCWlmICghdGFyZ2V0UGFyZW50LmV4aXN0cygpKSB7Ci0JCQkJCXRhcmdldFBhcmVudC5ta2RpcnMoKTsKLQkJCQl9Ci0KLQkJCQlpZiAoIXRhcmdldEZpbGUuZXhpc3RzKCkpIHsKLQkJCQkJdGFyZ2V0RmlsZS5jcmVhdGVOZXdGaWxlKCk7Ci0JCQkJfQotCi0JCQkJRmlsZVV0aWwuY29weUZpbGUoc3JjRmlsZSwgdGFyZ2V0RmlsZSk7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQkJfQotCi0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbG9jYWxpemVkIHJlc291cmNlLgotCSAqIAotCSAqIEBwYXJhbSBrZXkKLQkgKiAgICAgICAgICAgIFRoZSByZXNvdXJjZSBrZXkuCi0JICogQHJldHVybiBUaGUgbG9jYWxpemVkIHJlc291cmNlLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXkpIHsKLQkJaWYgKHJlc291cmNlQnVuZGxlICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJcmV0dXJuIHJlc291cmNlQnVuZGxlLmdldFN0cmluZyhrZXkpOwotCQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKLQkJCX0KLQkJfQotCQlyZXR1cm4gJ1snICsga2V5ICsgJ10nOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGZvcm1hdHRlZCBsb2NhbGl6ZWQgbWVzc2FnZSBnaXZlbiB0aGUgcmVzb3VyY2Uga2V5IGFuZCB0aGUKLQkgKiBtZXNzYWdlIGFyZ3VtZW50LgotCSAqIAotCSAqIEBwYXJhbSBrZXkKLQkgKiAgICAgICAgICAgIFRoZSByZXNvdXJjZSBrZXkuCi0JICogQHBhcmFtIGFyZ3VtZW50Ci0JICogICAgICAgICAgICBUaGUgbWVzc2FnZSBhcmd1bWVudC4KLQkgKiBAcmV0dXJuIFRoZSBmb3JtYXR0ZWQgbG9jYWxpemVkIG1lc3NhZ2UuCi0JICovCi0JcHVibGljIFN0cmluZyBmb3JtYXRNZXNzYWdlKFN0cmluZyBrZXksIE9iamVjdCBhcmd1bWVudCkgewotCQlpZiAocmVzb3VyY2VCdW5kbGUgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlTdHJpbmcgbXNnID0gcmVzb3VyY2VCdW5kbGUuZ2V0U3RyaW5nKGtleSk7Ci0JCQkJT2JqZWN0W10gYXJndW1lbnRzID0geyBhcmd1bWVudCB9OwotCQkJCXJldHVybiBNZXNzYWdlRm9ybWF0LmZvcm1hdChtc2csIGFyZ3VtZW50cyk7Ci0JCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgewotCQkJfQotCQl9Ci0JCXJldHVybiAnWycgKyBrZXkgKyAnXSc7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgaW1hZ2UgVVJMIGdpdmVuIHRoZSByZWxhdGl2ZSBwYXRoLgotCSAqIAotCSAqIEBwYXJhbSByZWxhdGl2ZVBhdGgKLQkgKiAgICAgICAgICAgIFRoZSBpbWFnZSdzIHBhdGggcmVsYXRpdmUgdG8gdGhlIHBsdWctaW4ncyByb290LgotCSAqIEByZXR1cm4gVGhlIGltYWdlIFVSTC4KLQkgKi8KLQlwdWJsaWMgVVJMIGdldEltYWdlVVJMKFN0cmluZyByZWxhdGl2ZVBhdGgpIHsKLQkJdHJ5IHsKLQkJCVVSTCB1cmwgPSBuZXcgVVJMKGljb25VUkwsIHJlbGF0aXZlUGF0aCk7Ci0JCQlyZXR1cm4gRmlsZUxvY2F0b3IucmVzb2x2ZSh1cmwpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBpbWFnZSBkZXNjcmlwdG9yIGdpdmVuIHRoZSByZWxhdGl2ZSBwYXRoLgotCSAqIAotCSAqIEBwYXJhbSByZWxhdGl2ZVBhdGgKLQkgKiAgICAgICAgICAgIFRoZSBpbWFnZSdzIHBhdGggcmVsYXRpdmUgdG8gdGhlIHBsdWctaW4ncyByb290LgotCSAqIEByZXR1cm4gVGhlIGltYWdlIGRlc2NyaXB0b3IuCi0JICovCi0JcHVibGljIEltYWdlRGVzY3JpcHRvciBnZXRJbWFnZURlc2NyaXB0b3IoU3RyaW5nIHJlbGF0aXZlUGF0aCkgewotCQl0cnkgewotCQkJVVJMIHVybCA9IG5ldyBVUkwoaWNvblVSTCwgcmVsYXRpdmVQYXRoKTsKLQkJCXJldHVybiBJbWFnZURlc2NyaXB0b3IuY3JlYXRlRnJvbVVSTCh1cmwpOwotCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIEltYWdlRGVzY3JpcHRvci5nZXRNaXNzaW5nSW1hZ2VEZXNjcmlwdG9yKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBpbWFnZSBnaXZlbiB0aGUgcmVsYXRpdmUgcGF0aC4KLQkgKiA8cD4KLQkgKiBOb3RlOiBUaGUgcmV0dXJuZWQgaW1hZ2UgbmVlZCB0byBiZSBmcmVlZCBieSB0aGUgY2FsbGVyLgotCSAqIAotCSAqIEBwYXJhbSByZWxhdGl2ZVBhdGgKLQkgKiAgICAgICAgICAgIFRoZSBpbWFnZSdzIHBhdGggcmVsYXRpdmUgdG8gdGhlIHBsdWctaW4ncyByb290LgotCSAqIEByZXR1cm4gVGhlIGltYWdlLgotCSAqLwotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZShTdHJpbmcgcmVsYXRpdmVQYXRoKSB7Ci0JCUltYWdlIGltYWdlID0gbnVsbDsKLQotCQlJbWFnZURlc2NyaXB0b3IgaW1hZ2VEZXNjcmlwdG9yID0gZ2V0SW1hZ2VEZXNjcmlwdG9yKHJlbGF0aXZlUGF0aCk7Ci0JCWlmIChpbWFnZURlc2NyaXB0b3IgIT0gbnVsbCkgewotCQkJaW1hZ2UgPSBpbWFnZURlc2NyaXB0b3IuY3JlYXRlSW1hZ2UoZmFsc2UpOwotCQl9Ci0KLQkJcmV0dXJuIGltYWdlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNoYXJlZCBpbWFnZSBnaXZlbiB0aGUgcmVsYXRpdmUgcGF0aC4KLQkgKiA8cD4KLQkgKiBOb3RlOiBUaGUgcmV0dXJuZWQgaW1hZ2Ugd2lsbCBiZSBhdXRvbWF0aWNhbGx5IGZyZWVkIHdoZW4gdGhlIHBsdWctaW4KLQkgKiBzaHV0cyBkb3duLgotCSAqIAotCSAqIEBwYXJhbSByZWxhdGl2ZVBhdGgKLQkgKiAgICAgICAgICAgIFRoZSBpbWFnZSdzIHBhdGggcmVsYXRpdmUgdG8gdGhlIHBsdWctaW4ncyByb290LgotCSAqIEByZXR1cm4gVGhlIGltYWdlLgotCSAqLwotCXB1YmxpYyBJbWFnZSBnZXRTaGFyZWRJbWFnZShTdHJpbmcgcmVsYXRpdmVQYXRoKSB7Ci0JCUltYWdlIGltYWdlID0gKEltYWdlKSBzaGFyZWRJbWFnZXMuZ2V0KHJlbGF0aXZlUGF0aCk7Ci0JCWlmIChpbWFnZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gaW1hZ2U7Ci0JCX0KLQotCQlJbWFnZURlc2NyaXB0b3IgaW1hZ2VEZXNjcmlwdG9yID0gZ2V0SW1hZ2VEZXNjcmlwdG9yKHJlbGF0aXZlUGF0aCk7Ci0JCWlmIChpbWFnZURlc2NyaXB0b3IgIT0gbnVsbCkgewotCQkJaW1hZ2UgPSBpbWFnZURlc2NyaXB0b3IuY3JlYXRlSW1hZ2UoZmFsc2UpOwotCQkJaWYgKGltYWdlICE9IG51bGwpIHsKLQkJCQlzaGFyZWRJbWFnZXMucHV0KHJlbGF0aXZlUGF0aCwgaW1hZ2UpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGltYWdlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHByb2ZpbGluZyBmbGFnLgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgcHJvZmlsaW5nIGlzIGVuYWJsZWQgZm9yIHRoaXMgcGx1LWluCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNQcm9maWxpbmcoKSB7Ci0JCXJldHVybiBwcm9maWxpbmc7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbG9nZ2VyIGdpdmVuIHRoZSBwbHVnLWluIElELgotCSAqIAotCSAqIEByZXR1cm4gVGhlIG5ldyBvciBjYWNoZWQgbG9nZ2VyLgotCSAqLwotCXB1YmxpYyBMb2dnZXIgZ2V0TG9nZ2VyKCkgewotCQlMb2dnZXIgbG9nZ2VyID0gKExvZ2dlcikgbG9nZ2Vycy5nZXQocGx1Z2luSWQpOwotCQlpZiAobG9nZ2VyID09IG51bGwpIHsKLQkJCWxvZ2dlciA9IG5ldyBMb2dnZXIodGhpcyk7Ci0JCQlsb2dnZXJzLnB1dChwbHVnaW5JZCwgbG9nZ2VyKTsKLQkJfQotCQlyZXR1cm4gbG9nZ2VyOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXNzYWdlIGRpYWxvZyBnaXZlbiB0aGUgcGx1Zy1pbiBJRC4KLQkgKiAKLQkgKiBAcmV0dXJuIFRoZSBuZXcgb3IgY2FjaGVkIG1lc3NhZ2UgZGlhbG9nLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTXNnRGlhbG9nIGdldE1zZ0RpYWxvZyhJQWN0aXZhdG9yIHBsdWdpbikgewotCQlNc2dEaWFsb2cgbXNnRGlhbG9nID0gKE1zZ0RpYWxvZykgbXNnRGlhbG9ncy5nZXQocGx1Z2luLmdldElkKCkpOwotCQlpZiAobXNnRGlhbG9nID09IG51bGwpIHsKLQkJCW1zZ0RpYWxvZyA9IG5ldyBNc2dEaWFsb2cocGx1Z2luKTsKLQkJCW1zZ0RpYWxvZ3MucHV0KHBsdWdpbi5nZXRJZCgpLCBtc2dEaWFsb2cpOwotCQl9Ci0JCXJldHVybiBtc2dEaWFsb2c7Ci0JfQotCi0JCi0JcHVibGljIE1zZ0RpYWxvZyBnZXRNc2dEaWFsb2coKSB7CQkKLQkJcmV0dXJuIGdldE1zZ0RpYWxvZyh0aGlzKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc3RhbmRhcmQgZGlzcGxheSB0byBiZSB1c2VkLiBUaGUgbWV0aG9kIGZpcnN0IGNoZWNrcywgaWYgdGhlCi0JICogdGhyZWFkIGNhbGxpbmcgdGhpcyBtZXRob2QgaGFzIGFuIGFzc29jaWF0ZWQgZGlzYXBseS4gSWYgc28sIHRoaXMgZGlzcGxheQotCSAqIGlzIHJldHVybmVkLiBPdGhlcndpc2UgdGhlIG1ldGhvZCByZXR1cm5zIHRoZSBkZWZhdWx0IGRpc3BsYXkuCi0JICovCi0JcHVibGljIHN0YXRpYyBEaXNwbGF5IGdldFN0YW5kYXJkRGlzcGxheSgpIHsKLQkJRGlzcGxheSBkaXNwbGF5OwotCQlkaXNwbGF5ID0gRGlzcGxheS5nZXRDdXJyZW50KCk7Ci0JCWlmIChkaXNwbGF5ID09IG51bGwpCi0JCQlkaXNwbGF5ID0gRGlzcGxheS5nZXREZWZhdWx0KCk7Ci0JCXJldHVybiBkaXNwbGF5OwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi91aS9Db21tb25VSVBsdWdpbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi91aS9Db21tb25VSVBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZWMzMjQxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vdWkvQ29tbW9uVUlQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24uQ29tbW9uUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24uSU1lc3NhZ2VDYWxsYmFjazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpLnV0aWwuTXNnQm94OwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotCi1wdWJsaWMgY2xhc3MgQ29tbW9uVUlQbHVnaW4gZXh0ZW5kcyBBYnN0cmFjdFBsdWdpbiB7Ci0KLQkvLyBUaGUgc2hhcmVkIHBsdWctaW4gaW5zdGFuY2UuCi0JcHJpdmF0ZSBzdGF0aWMgQ29tbW9uVUlQbHVnaW4gcGx1Z2luOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgQ29tbW9uVUlQbHVnaW4oKSB7Ci0JCXN1cGVyKCk7Ci0JCXBsdWdpbiA9IHRoaXM7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpLkFic3RyYWN0UGx1Z2luI3N0YXJ0KG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0YXJ0KGNvbnRleHQpOwotCQkKLS8vCQkvLyBzZXQgdGhlIHByZWZlcmVuY2Ugc3RvcmUgZm9yIHRoZSBjb21tb24gcGx1Z2luCi0JCVByZWZlcmVuY2VTdG9yZVdyYXBwZXIgc3RvcmVXcmFwcGVyID0gbmV3IFByZWZlcmVuY2VTdG9yZVdyYXBwZXIoZ2V0UHJlZmVyZW5jZVN0b3JlKCkpOwotCQlDb21tb25QbHVnaW4uZ2V0RGVmYXVsdCgpLnNldENvbW1vblByZWZlcmVuY2VTdG9yZShzdG9yZVdyYXBwZXIpOwotCQkKLQkJLy8gY3JlYXRlIHRoZSBtZXNzYWdlIGNhbGxiYWNrIGNvbnRleHQgZm9yIHRoZSBub24tdWkgcGx1Z2lucwotCQkvLyB0aGlzIGlzIHRoZSBjb250ZXh0IGZvciBtZXNzYWdlIGNhbGxiYWNrCi0JCS8vIGZvciBlY2xpcHNlIGNsaWVudCwgdGhpcyBpcyB0aGUgU2hlbGwgb2JqZWN0Ci0JCS8vIHNoZWxsIG9iamVjdCBjYW4ndCBiZSBzaGFyZWQgYWNyb29zcyB0aHJlYWQsIHVzZSBhIGNvbnRleHQgcHJvdmlkZXIgaW5zdGVhZAotCQkvL0NvbW1vblBsdWdpbi5nZXREZWZhdWx0KCkuc2V0Q29udGV4dChNc2dCb3guZ2V0RGVmYXVsdFNoZWxsKCkpOwotCQkKLQkJQ29tbW9uUGx1Z2luLmdldERlZmF1bHQoKS5zZXRDb250ZXh0UHJvdmlkZXIobmV3IENvbnRleHRQcm92aWRlcigpKTsKLQkKLQkJLy8gY3JlYXRlIHRoZSBNZXNzYWdlQ2FsbGJhY2sgdG8gYmUgYWNjZXNzaWJsZSB0byB0aGUgbm9uLXVpIHBsdWdpbgotCQlJTWVzc2FnZUNhbGxiYWNrIG1zZ0NhbGxiYWNrID0gbmV3IE1lc3NhZ2VDYWxsYmFjaygpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS5BYnN0cmFjdFBsdWdpbiNzdG9wKG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RvcChjb250ZXh0KTsKLQkJcGx1Z2luID0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBzaGFyZWQgaW5zdGFuY2UuCi0JICogCi0JICogQHJldHVybiB0aGUgc2hhcmVkIHBsdWctaW4gaW5zdGFuY2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIENvbW1vblVJUGx1Z2luIGdldERlZmF1bHQoKSB7Ci0JCXJldHVybiBwbHVnaW47Ci0JfQotCi0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vdWkvQ29udGV4dFByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3VpL0NvbnRleHRQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxN2JmM2M4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vdWkvQ29udGV4dFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5jb21tb24udWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLklDb250ZXh0UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS51dGlsLk1zZ0JveDsKLQotLyoqCi0gKiBjb250ZW50IHByb3ZpZGVyIGZvciBub24tdWkgcGx1Z2lucwotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuNQotICoKLSAqLwotcHVibGljIGNsYXNzIENvbnRleHRQcm92aWRlciBpbXBsZW1lbnRzIElDb250ZXh0UHJvdmlkZXIgewotCi0JcHVibGljIE9iamVjdCBnZXRDb250ZXh0KCkgewotCQkvL1RPRE86IHJldmlzaXQKLQkJT2JqZWN0IGN0eCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQljdHggPSBDb21tb25VSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0V29ya2JlbmNoKCkuZ2V0RGlzcGxheSgpLmdldEFjdGl2ZVNoZWxsKCk7Ci0JCX0KLQkJY2F0Y2goRXhjZXB0aW9uIGUpIHsKLQkJCS8vCi0JCX0KLQkJcmV0dXJuIGN0eCAhPSBudWxsID8gY3R4IDogTXNnQm94LmdldERlZmF1bHRTaGVsbCgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi91aS9NZXNzYWdlQ2FsbGJhY2suamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vdWkvTWVzc2FnZUNhbGxiYWNrLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwODM1MWQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi91aS9NZXNzYWdlQ2FsbGJhY2suamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24uQWJzdHJhY3RBY3RpdmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5JTWVzc2FnZUNhbGxiYWNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udWkudXRpbC5Nc2dEaWFsb2c7Ci0KLS8qKgotICogbWVzc2FnZSBjYWxsYmFjayBpbXBsZW1lbnRhdGlvbgotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuNQotICoKLSAqLwotcHVibGljIGNsYXNzIE1lc3NhZ2VDYWxsYmFjayBpbXBsZW1lbnRzIElNZXNzYWdlQ2FsbGJhY2sgewotCi0JcHVibGljIHZvaWQgZGlzcGxheVdhcm5pbmcoQWJzdHJhY3RBY3RpdmF0b3IgcGx1Z2luLCBTdHJpbmcgdGl0bGUsIFN0cmluZyBtc2csIFN0cmluZyByZWFzb24pIHsKLQkJZGlzcGxheVdhcm5pbmcocGx1Z2luLCB0aXRsZSwgbXNnLCByZWFzb24sIG51bGwsIG51bGwpOwkJCi0JfQotCQotCXB1YmxpYyB2b2lkIGRpc3BsYXlXYXJuaW5nKEFic3RyYWN0QWN0aXZhdG9yIHBsdWdpbiwgU3RyaW5nIG1zZywgU3RyaW5nIHJlYXNvbiwgVGhyb3dhYmxlIGV4KSB7Ci0JCWRpc3BsYXlXYXJuaW5nKHBsdWdpbiwgbXNnLCByZWFzb24sIG51bGwsIGV4KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwbGF5V2FybmluZyhBYnN0cmFjdEFjdGl2YXRvciBwbHVnaW4sIFN0cmluZyBtc2csIFN0cmluZyByZWFzb24sCi0JCQlTdHJpbmcgZGV0YWlscywgVGhyb3dhYmxlIGV4KSB7Ci0JCVN0cmluZyB0aXRsZSA9IENvbW1vblVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRXb3JrYmVuY2goKS5nZXREaXNwbGF5KCkuZ2V0QWN0aXZlU2hlbGwoKS5nZXRUZXh0KCk7Ci0JCWRpc3BsYXlXYXJuaW5nKHBsdWdpbiwgdGl0bGUsIG1zZywgcmVhc29uLCBkZXRhaWxzLCBleCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGRpc3BsYXlXYXJuaW5nKEFic3RyYWN0QWN0aXZhdG9yIHBsdWdpbiwgU3RyaW5nIHRpdGxlLCBTdHJpbmcgbXNnLCBTdHJpbmcgcmVhc29uLAotCQkJU3RyaW5nIGRldGFpbHMsIFRocm93YWJsZSBleCkgewotCQlNc2dEaWFsb2cgZGxnID0gQ29tbW9uVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZyhwbHVnaW4pOwotCQlkbGcuZGlzcGxheVdhcm5pbmcodGl0bGUsIG1zZywgcmVhc29uLCBkZXRhaWxzLCBleCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGRpc3BsYXlFcnJvcihBYnN0cmFjdEFjdGl2YXRvciBwbHVnaW4sIFN0cmluZyB0aXRsZSwgU3RyaW5nIG1zZykgewotCQlkaXNwbGF5RXJyb3IocGx1Z2luLCB0aXRsZSwgbXNnLCBudWxsLCBudWxsLCBudWxsKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgZGlzcGxheUVycm9yKEFic3RyYWN0QWN0aXZhdG9yIHBsdWdpbiwgU3RyaW5nIHRpdGxlLCBTdHJpbmcgbXNnLCBUaHJvd2FibGUgZXgpIHsKLQkJZGlzcGxheUVycm9yKHBsdWdpbiwgdGl0bGUsIG1zZywgbnVsbCwgbnVsbCwgZXgpOwotCX0KLQlwdWJsaWMgdm9pZCBkaXNwbGF5RXJyb3IoQWJzdHJhY3RBY3RpdmF0b3IgcGx1Z2luLCBTdHJpbmcgdGl0bGUsIFN0cmluZyBtc2csIFN0cmluZyByZWFzb24sIFN0cmluZyBkZXRhaWxzLCBUaHJvd2FibGUgZXgpIHsKLQkJTXNnRGlhbG9nIGRsZyA9IENvbW1vblVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2cocGx1Z2luKTsKLQkJZGxnLmRpc3BsYXlFcnJvcih0aXRsZSwgbXNnLCByZWFzb24sIGRldGFpbHMsIGV4KTsKLQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi91aS9QcmVmZXJlbmNlU3RvcmVXcmFwcGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3VpL1ByZWZlcmVuY2VTdG9yZVdyYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODFlZTQ3NS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3VpL1ByZWZlcmVuY2VTdG9yZVdyYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyMiArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5jb21tb24udWk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5wcmVmZXJlbmNlcy5JUHJlZmVyZW5jZVN0b3JlV3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnByZWZlcmVuY2VzLklQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyV3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5JUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci0KLS8qKgotICogd3JhcHBlciBjbGFzcyBmb3IgcHJlZmVyZW5jZSBzdG9yZQotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuNQotICoKLSAqLwotcHVibGljIGNsYXNzIFByZWZlcmVuY2VTdG9yZVdyYXBwZXIgaW1wbGVtZW50cyBJUHJlZmVyZW5jZVN0b3JlV3JhcHBlciB7Ci0JcHJpdmF0ZSBJUHJlZmVyZW5jZVN0b3JlIHN0b3JlOwotCXB1YmxpYyBQcmVmZXJlbmNlU3RvcmVXcmFwcGVyKElQcmVmZXJlbmNlU3RvcmUgc3RvcmUpIHsKLQkJdGhpcy5zdG9yZSA9IHN0b3JlOwotCX0KLQkKLQlNYXA8SVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJXcmFwcGVyLCBJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcj4gbGlzdGVuZXJNYXAgPSBuZXcgSGFzaE1hcDxJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcldyYXBwZXIsIElQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyPigpOwotCQotCXB1YmxpYyBJUHJlZmVyZW5jZVN0b3JlIGdldFN0b3JlKCkgewotCQlyZXR1cm4gc3RvcmU7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihmaW5hbCBJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcldyYXBwZXIgbGlzdGVuZXIpIHsKLQkJLy8gY3JlYXRlIGEgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBhbmQgYWRkIHRvIHRoZSBzdG9yZQotCQlJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBwY2wgPSBuZXcgSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKXsKLQotCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2UoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCVByb3BlcnR5Q2hhbmdlRXZlbnRXcmFwcGVyIHdyYXBwZXIgPSBuZXcgUHJvcGVydHlDaGFuZ2VFdmVudFdyYXBwZXIoZXZlbnQpOwotCQkJCWxpc3RlbmVyLnByb3BlcnR5Q2hhbmdlKHdyYXBwZXIpOwotCQkJCQotCQkJfX07Ci0JCQotCQlsaXN0ZW5lck1hcC5wdXQobGlzdGVuZXIsIHBjbCk7Ci0JCXN0b3JlLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIocGNsKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgZmlyZVByb3BlcnR5Q2hhbmdlRXZlbnQoU3RyaW5nIG5hbWUsIE9iamVjdCBvbGRWYWx1ZSwKLQkgICAgICAgICAgICBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3RvcmUuZmlyZVByb3BlcnR5Q2hhbmdlRXZlbnQobmFtZSwgb2xkVmFsdWUsIG5ld1ZhbHVlKTsKLQl9Ci0KLSAgICBwdWJsaWMgdm9pZCByZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKElQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyV3JhcHBlciBsaXN0ZW5lcikgewotICAgIAlJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBwY2wgPSBsaXN0ZW5lck1hcC5yZW1vdmUobGlzdGVuZXIpOwotICAgIAlpZiAoIHBjbCAhPSBudWxsICkgewotICAgIAkJc3RvcmUucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihwY2wpOwotICAgIAl9Ci0gICAgfQotCi0JLyoqCi0gICAgICogUmV0dXJucyB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgYm9vbGVhbi12YWx1ZWQgcHJlZmVyZW5jZSB3aXRoIHRoZQotICAgICAqIGdpdmVuIG5hbWUuCi0gICAgICogUmV0dXJucyB0aGUgZGVmYXVsdC1kZWZhdWx0IHZhbHVlICg8Y29kZT5mYWxzZTwvY29kZT4pIGlmIHRoZXJlCi0gICAgICogaXMgbm8gcHJlZmVyZW5jZSB3aXRoIHRoZSBnaXZlbiBuYW1lLCBvciBpZiB0aGUgY3VycmVudCB2YWx1ZSAKLSAgICAgKiBjYW5ub3QgYmUgdHJlYXRlZCBhcyBhIGJvb2xlYW4uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgcHJlZmVyZW5jZQotICAgICAqIEByZXR1cm4gdGhlIGJvb2xlYW4tdmFsdWVkIHByZWZlcmVuY2UKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBnZXRCb29sZWFuKFN0cmluZyBuYW1lKSB7Ci0gICAgCXJldHVybiBzdG9yZS5nZXRCb29sZWFuKG5hbWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGRlZmF1bHQgdmFsdWUgZm9yIHRoZSBib29sZWFuLXZhbHVlZCBwcmVmZXJlbmNlCi0gICAgICogd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KLSAgICAgKiBSZXR1cm5zIHRoZSBkZWZhdWx0LWRlZmF1bHQgdmFsdWUgKDxjb2RlPmZhbHNlPC9jb2RlPikgaWYgdGhlcmUKLSAgICAgKiBpcyBubyBkZWZhdWx0IHByZWZlcmVuY2Ugd2l0aCB0aGUgZ2l2ZW4gbmFtZSwgb3IgaWYgdGhlIGRlZmF1bHQgCi0gICAgICogdmFsdWUgY2Fubm90IGJlIHRyZWF0ZWQgYXMgYSBib29sZWFuLgotICAgICAqCi0gICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIHByZWZlcmVuY2UKLSAgICAgKiBAcmV0dXJuIHRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSBuYW1lZCBwcmVmZXJlbmNlCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gZ2V0RGVmYXVsdEJvb2xlYW4oU3RyaW5nIG5hbWUpIHsKLSAgICAJcmV0dXJuIHN0b3JlLmdldERlZmF1bHRCb29sZWFuKG5hbWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGRlZmF1bHQgdmFsdWUgZm9yIHRoZSBkb3VibGUtdmFsdWVkIHByZWZlcmVuY2UKLSAgICAgKiB3aXRoIHRoZSBnaXZlbiBuYW1lLgotICAgICAqIFJldHVybnMgdGhlIGRlZmF1bHQtZGVmYXVsdCB2YWx1ZSAoPGNvZGU+MC4wPC9jb2RlPikgaWYgdGhlcmUKLSAgICAgKiBpcyBubyBkZWZhdWx0IHByZWZlcmVuY2Ugd2l0aCB0aGUgZ2l2ZW4gbmFtZSwgb3IgaWYgdGhlIGRlZmF1bHQgCi0gICAgICogdmFsdWUgY2Fubm90IGJlIHRyZWF0ZWQgYXMgYSBkb3VibGUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgcHJlZmVyZW5jZQotICAgICAqIEByZXR1cm4gdGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlIG5hbWVkIHByZWZlcmVuY2UKLSAgICAgKi8KLSAgICBwdWJsaWMgZG91YmxlIGdldERlZmF1bHREb3VibGUoU3RyaW5nIG5hbWUpIHsKLSAgICAJcmV0dXJuIHN0b3JlLmdldERlZmF1bHREb3VibGUobmFtZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZGVmYXVsdCB2YWx1ZSBmb3IgdGhlIGZsb2F0LXZhbHVlZCBwcmVmZXJlbmNlCi0gICAgICogd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KLSAgICAgKiBSZXR1cm5zIHRoZSBkZWZhdWx0LWRlZmF1bHQgdmFsdWUgKDxjb2RlPjAuMGY8L2NvZGU+KSBpZiB0aGVyZQotICAgICAqIGlzIG5vIGRlZmF1bHQgcHJlZmVyZW5jZSB3aXRoIHRoZSBnaXZlbiBuYW1lLCBvciBpZiB0aGUgZGVmYXVsdCAKLSAgICAgKiB2YWx1ZSBjYW5ub3QgYmUgdHJlYXRlZCBhcyBhIGZsb2F0LgotICAgICAqCi0gICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIHByZWZlcmVuY2UKLSAgICAgKiBAcmV0dXJuIHRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSBuYW1lZCBwcmVmZXJlbmNlCi0gICAgICovCi0gICAgcHVibGljIGZsb2F0IGdldERlZmF1bHRGbG9hdChTdHJpbmcgbmFtZSkgewotICAgIAlyZXR1cm4gc3RvcmUuZ2V0RGVmYXVsdEZsb2F0KG5hbWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGRlZmF1bHQgdmFsdWUgZm9yIHRoZSBpbnRlZ2VyLXZhbHVlZCBwcmVmZXJlbmNlCi0gICAgICogd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KLSAgICAgKiBSZXR1cm5zIHRoZSBkZWZhdWx0LWRlZmF1bHQgdmFsdWUgKDxjb2RlPjA8L2NvZGU+KSBpZiB0aGVyZQotICAgICAqIGlzIG5vIGRlZmF1bHQgcHJlZmVyZW5jZSB3aXRoIHRoZSBnaXZlbiBuYW1lLCBvciBpZiB0aGUgZGVmYXVsdCAKLSAgICAgKiB2YWx1ZSBjYW5ub3QgYmUgdHJlYXRlZCBhcyBhbiBpbnRlZ2VyLgotICAgICAqCi0gICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIHByZWZlcmVuY2UKLSAgICAgKiBAcmV0dXJuIHRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSBuYW1lZCBwcmVmZXJlbmNlCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXREZWZhdWx0SW50KFN0cmluZyBuYW1lKSB7Ci0gICAgCXJldHVybiBzdG9yZS5nZXREZWZhdWx0SW50KG5hbWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGRlZmF1bHQgdmFsdWUgZm9yIHRoZSBsb25nLXZhbHVlZCBwcmVmZXJlbmNlCi0gICAgICogd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KLSAgICAgKiBSZXR1cm5zIHRoZSBkZWZhdWx0LWRlZmF1bHQgdmFsdWUgKDxjb2RlPjBMPC9jb2RlPikgaWYgdGhlcmUKLSAgICAgKiBpcyBubyBkZWZhdWx0IHByZWZlcmVuY2Ugd2l0aCB0aGUgZ2l2ZW4gbmFtZSwgb3IgaWYgdGhlIGRlZmF1bHQgCi0gICAgICogdmFsdWUgY2Fubm90IGJlIHRyZWF0ZWQgYXMgYSBsb25nLgotICAgICAqCi0gICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIHByZWZlcmVuY2UKLSAgICAgKiBAcmV0dXJuIHRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSBuYW1lZCBwcmVmZXJlbmNlCi0gICAgICovCi0gICAgcHVibGljIGxvbmcgZ2V0RGVmYXVsdExvbmcoU3RyaW5nIG5hbWUpIHsKLSAgICAJcmV0dXJuIHN0b3JlLmdldERlZmF1bHRMb25nKG5hbWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGRlZmF1bHQgdmFsdWUgZm9yIHRoZSBzdHJpbmctdmFsdWVkIHByZWZlcmVuY2UKLSAgICAgKiB3aXRoIHRoZSBnaXZlbiBuYW1lLgotICAgICAqIFJldHVybnMgdGhlIGRlZmF1bHQtZGVmYXVsdCB2YWx1ZSAodGhlIGVtcHR5IHN0cmluZyA8Y29kZT4iIjwvY29kZT4pIAotICAgICAqIGlzIG5vIGRlZmF1bHQgcHJlZmVyZW5jZSB3aXRoIHRoZSBnaXZlbiBuYW1lLCBvciBpZiB0aGUgZGVmYXVsdCAKLSAgICAgKiB2YWx1ZSBjYW5ub3QgYmUgdHJlYXRlZCBhcyBhIHN0cmluZy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBwcmVmZXJlbmNlCi0gICAgICogQHJldHVybiB0aGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgbmFtZWQgcHJlZmVyZW5jZQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFN0cmluZyhTdHJpbmcgbmFtZSkgewotICAgIAlyZXR1cm4gc3RvcmUuZ2V0RGVmYXVsdFN0cmluZyhuYW1lKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBkb3VibGUtdmFsdWVkIHByZWZlcmVuY2Ugd2l0aCB0aGUKLSAgICAgKiBnaXZlbiBuYW1lLgotICAgICAqIFJldHVybnMgdGhlIGRlZmF1bHQtZGVmYXVsdCB2YWx1ZSAoPGNvZGU+MC4wPC9jb2RlPikgaWYgdGhlcmUKLSAgICAgKiBpcyBubyBwcmVmZXJlbmNlIHdpdGggdGhlIGdpdmVuIG5hbWUsIG9yIGlmIHRoZSBjdXJyZW50IHZhbHVlIAotICAgICAqIGNhbm5vdCBiZSB0cmVhdGVkIGFzIGEgZG91YmxlLgotICAgICAqCi0gICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIHByZWZlcmVuY2UKLSAgICAgKiBAcmV0dXJuIHRoZSBkb3VibGUtdmFsdWVkIHByZWZlcmVuY2UKLSAgICAgKi8KLSAgICBwdWJsaWMgZG91YmxlIGdldERvdWJsZShTdHJpbmcgbmFtZSkgewotICAgIAlyZXR1cm4gc3RvcmUuZ2V0RG91YmxlKG5hbWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIGZsb2F0LXZhbHVlZCBwcmVmZXJlbmNlIHdpdGggdGhlCi0gICAgICogZ2l2ZW4gbmFtZS4KLSAgICAgKiBSZXR1cm5zIHRoZSBkZWZhdWx0LWRlZmF1bHQgdmFsdWUgKDxjb2RlPjAuMGY8L2NvZGU+KSBpZiB0aGVyZQotICAgICAqIGlzIG5vIHByZWZlcmVuY2Ugd2l0aCB0aGUgZ2l2ZW4gbmFtZSwgb3IgaWYgdGhlIGN1cnJlbnQgdmFsdWUgCi0gICAgICogY2Fubm90IGJlIHRyZWF0ZWQgYXMgYSBmbG9hdC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBwcmVmZXJlbmNlCi0gICAgICogQHJldHVybiB0aGUgZmxvYXQtdmFsdWVkIHByZWZlcmVuY2UKLSAgICAgKi8KLSAgICBwdWJsaWMgZmxvYXQgZ2V0RmxvYXQoU3RyaW5nIG5hbWUpIHsKLSAgICAJcmV0dXJuIHN0b3JlLmdldEZsb2F0KG5hbWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIGludGVnZXItdmFsdWVkIHByZWZlcmVuY2Ugd2l0aCB0aGUKLSAgICAgKiBnaXZlbiBuYW1lLgotICAgICAqIFJldHVybnMgdGhlIGRlZmF1bHQtZGVmYXVsdCB2YWx1ZSAoPGNvZGU+MDwvY29kZT4pIGlmIHRoZXJlCi0gICAgICogaXMgbm8gcHJlZmVyZW5jZSB3aXRoIHRoZSBnaXZlbiBuYW1lLCBvciBpZiB0aGUgY3VycmVudCB2YWx1ZSAKLSAgICAgKiBjYW5ub3QgYmUgdHJlYXRlZCBhcyBhbiBpbnRlZ3Rlci4KLSAgICAgKgotICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBwcmVmZXJlbmNlCi0gICAgICogQHJldHVybiB0aGUgaW50LXZhbHVlZCBwcmVmZXJlbmNlCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXRJbnQoU3RyaW5nIG5hbWUpIHsKLSAgICAJcmV0dXJuIHN0b3JlLmdldEludChuYW1lKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBsb25nLXZhbHVlZCBwcmVmZXJlbmNlIHdpdGggdGhlCi0gICAgICogZ2l2ZW4gbmFtZS4KLSAgICAgKiBSZXR1cm5zIHRoZSBkZWZhdWx0LWRlZmF1bHQgdmFsdWUgKDxjb2RlPjBMPC9jb2RlPikgaWYgdGhlcmUKLSAgICAgKiBpcyBubyBwcmVmZXJlbmNlIHdpdGggdGhlIGdpdmVuIG5hbWUsIG9yIGlmIHRoZSBjdXJyZW50IHZhbHVlIAotICAgICAqIGNhbm5vdCBiZSB0cmVhdGVkIGFzIGEgbG9uZy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBwcmVmZXJlbmNlCi0gICAgICogQHJldHVybiB0aGUgbG9uZy12YWx1ZWQgcHJlZmVyZW5jZQotICAgICAqLwotICAgIHB1YmxpYyBsb25nIGdldExvbmcoU3RyaW5nIG5hbWUpIHsKLSAgICAJcmV0dXJuIHN0b3JlLmdldExvbmcobmFtZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgc3RyaW5nLXZhbHVlZCBwcmVmZXJlbmNlIHdpdGggdGhlCi0gICAgICogZ2l2ZW4gbmFtZS4KLSAgICAgKiBSZXR1cm5zIHRoZSBkZWZhdWx0LWRlZmF1bHQgdmFsdWUgKHRoZSBlbXB0eSBzdHJpbmcgPGNvZGU+IiI8L2NvZGU+KQotICAgICAqIGlmIHRoZXJlIGlzIG5vIHByZWZlcmVuY2Ugd2l0aCB0aGUgZ2l2ZW4gbmFtZSwgb3IgaWYgdGhlIGN1cnJlbnQgdmFsdWUgCi0gICAgICogY2Fubm90IGJlIHRyZWF0ZWQgYXMgYSBzdHJpbmcuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgcHJlZmVyZW5jZQotICAgICAqIEByZXR1cm4gdGhlIHN0cmluZy12YWx1ZWQgcHJlZmVyZW5jZQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBuYW1lKSB7Ci0gICAgCXJldHVybiBzdG9yZS5nZXRTdHJpbmcobmFtZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBwcmVmZXJlbmNlIHdpdGggdGhlIGdpdmVuIG5hbWUKLSAgICAgKiBoYXMgdGhlIGRlZmF1bHQgdmFsdWUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgcHJlZmVyZW5jZQotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHByZWZlcmVuY2UgaGFzIGEga25vd24gZGVmYXVsdCB2YWx1ZQotICAgICAqIGFuZCBpdHMgY3VycmVudCB2YWx1ZSBpcyB0aGUgc2FtZSwgYW5kIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKLSAgICAgKiAoaW5jbHVkaW5nIHRoZSBjYXNlIHdoZXJlIHRoZSBwcmVmZXJlbmNlIGlzIHVua25vd24gdG8gdGhpcyBzdG9yZSkKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0RlZmF1bHQoU3RyaW5nIG5hbWUpIHsKLSAgICAJcmV0dXJuIHN0b3JlLmlzRGVmYXVsdChuYW1lKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGN1cnJlbnQgdmFsdWVzIGluIHRoaXMgcHJvcGVydHkgc3RvcmUKLSAgICAgKiByZXF1aXJlIHNhdmluZy4KLSAgICAgKgotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgYXQgbGVhc3Qgb25lIG9mIHZhbHVlcyBvZiAKLSAgICAgKiAgdGhlIHByZWZlcmVuY2VzIGtub3duIHRvIHRoaXMgc3RvcmUgaGFzIGNoYW5nZWQgYW5kIAotICAgICAqICByZXF1aXJlcyBzYXZpbmcsIGFuZCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIG5lZWRzU2F2aW5nKCkgewotICAgIAlyZXR1cm4gc3RvcmUubmVlZHNTYXZpbmcoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBwcmVmZXJlbmNlIHdpdGggdGhlIGdpdmVuIG5hbWUgdG8KLSAgICAgKiB0aGUgZ2l2ZW4gc3RyaW5nIHZhbHVlIHdpdGhvdXQgc2VuZGluZyBhIHByb3BlcnR5IGNoYW5nZS4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIG1ldGhvZCBkb2VzIG5vdCBmaXJlIGEgcHJvcGVydHkgY2hhbmdlIGV2ZW50IGFuZCAKLSAgICAgKiBzaG91bGQgb25seSBiZSB1c2VkIGZvciBzZXR0aW5nIGludGVybmFsIHByZWZlcmVuY2VzIAotICAgICAqIHRoYXQgYXJlIG5vdCBtZWFudCB0byBiZSBwcm9jZXNzZWQgYnkgbGlzdGVuZXJzLgotICAgICAqIE5vcm1hbCBjbGllbnRzIHNob3VsZCBpbnN0ZWFkIGNhbGwgI3NldFZhbHVlLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBwcmVmZXJlbmNlCi0gICAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgY3VycmVudCB2YWx1ZSBvZiB0aGUgcHJlZmVyZW5jZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHB1dFZhbHVlKFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWUpIHsKLSAgICAJc3RvcmUucHV0VmFsdWUobmFtZSwgdmFsdWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGRlZmF1bHQgdmFsdWUgZm9yIHRoZSBkb3VibGUtdmFsdWVkIHByZWZlcmVuY2Ugd2l0aCB0aGUKLSAgICAgKiBnaXZlbiBuYW1lLiAKLSAgICAgKiA8cD4KLSAgICAgKiBOb3RlIHRoYXQgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIHByZWZlcmVuY2UgaXMgYWZmZWN0ZWQgaWYKLSAgICAgKiB0aGUgcHJlZmVyZW5jZSdzIGN1cnJlbnQgdmFsdWUgd2FzIGl0cyBvbGQgZGVmYXVsdCB2YWx1ZSwgaW4gd2hpY2gKLSAgICAgKiBjYXNlIGl0IGNoYW5nZXMgdG8gdGhlIG5ldyBkZWZhdWx0IHZhbHVlLiBJZiB0aGUgcHJlZmVyZW5jZSdzIGN1cnJlbnQKLSAgICAgKiBpcyBkaWZmZXJlbnQgZnJvbSBpdHMgb2xkIGRlZmF1bHQgdmFsdWUsIGl0cyBjdXJyZW50IHZhbHVlIGlzCi0gICAgICogdW5hZmZlY3RlZC4gTm8gcHJvcGVydHkgY2hhbmdlIGV2ZW50cyBhcmUgcmVwb3J0ZWQgYnkgY2hhbmdpbmcgZGVmYXVsdAotICAgICAqIHZhbHVlcy4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgcHJlZmVyZW5jZQotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IGRlZmF1bHQgdmFsdWUgZm9yIHRoZSBwcmVmZXJlbmNlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RGVmYXVsdChTdHJpbmcgbmFtZSwgZG91YmxlIHZhbHVlKSB7Ci0gICAgCXN0b3JlLnNldERlZmF1bHQobmFtZSwgdmFsdWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGRlZmF1bHQgdmFsdWUgZm9yIHRoZSBmbG9hdC12YWx1ZWQgcHJlZmVyZW5jZSB3aXRoIHRoZQotICAgICAqIGdpdmVuIG5hbWUuIAotICAgICAqIDxwPgotICAgICAqIE5vdGUgdGhhdCB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgcHJlZmVyZW5jZSBpcyBhZmZlY3RlZCBpZgotICAgICAqIHRoZSBwcmVmZXJlbmNlJ3MgY3VycmVudCB2YWx1ZSB3YXMgaXRzIG9sZCBkZWZhdWx0IHZhbHVlLCBpbiB3aGljaAotICAgICAqIGNhc2UgaXQgY2hhbmdlcyB0byB0aGUgbmV3IGRlZmF1bHQgdmFsdWUuIElmIHRoZSBwcmVmZXJlbmNlJ3MgY3VycmVudAotICAgICAqIGlzIGRpZmZlcmVudCBmcm9tIGl0cyBvbGQgZGVmYXVsdCB2YWx1ZSwgaXRzIGN1cnJlbnQgdmFsdWUgaXMKLSAgICAgKiB1bmFmZmVjdGVkLiBObyBwcm9wZXJ0eSBjaGFuZ2UgZXZlbnRzIGFyZSByZXBvcnRlZCBieSBjaGFuZ2luZyBkZWZhdWx0Ci0gICAgICogdmFsdWVzLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBwcmVmZXJlbmNlCi0gICAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgZGVmYXVsdCB2YWx1ZSBmb3IgdGhlIHByZWZlcmVuY2UKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXREZWZhdWx0KFN0cmluZyBuYW1lLCBmbG9hdCB2YWx1ZSkgewotICAgIAlzdG9yZS5zZXREZWZhdWx0KG5hbWUsIHZhbHVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBkZWZhdWx0IHZhbHVlIGZvciB0aGUgaW50ZWdlci12YWx1ZWQgcHJlZmVyZW5jZSB3aXRoIHRoZQotICAgICAqIGdpdmVuIG5hbWUuIAotICAgICAqIDxwPgotICAgICAqIE5vdGUgdGhhdCB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgcHJlZmVyZW5jZSBpcyBhZmZlY3RlZCBpZgotICAgICAqIHRoZSBwcmVmZXJlbmNlJ3MgY3VycmVudCB2YWx1ZSB3YXMgaXRzIG9sZCBkZWZhdWx0IHZhbHVlLCBpbiB3aGljaAotICAgICAqIGNhc2UgaXQgY2hhbmdlcyB0byB0aGUgbmV3IGRlZmF1bHQgdmFsdWUuIElmIHRoZSBwcmVmZXJlbmNlJ3MgY3VycmVudAotICAgICAqIGlzIGRpZmZlcmVudCBmcm9tIGl0cyBvbGQgZGVmYXVsdCB2YWx1ZSwgaXRzIGN1cnJlbnQgdmFsdWUgaXMKLSAgICAgKiB1bmFmZmVjdGVkLiBObyBwcm9wZXJ0eSBjaGFuZ2UgZXZlbnRzIGFyZSByZXBvcnRlZCBieSBjaGFuZ2luZyBkZWZhdWx0Ci0gICAgICogdmFsdWVzLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBwcmVmZXJlbmNlCi0gICAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgZGVmYXVsdCB2YWx1ZSBmb3IgdGhlIHByZWZlcmVuY2UKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXREZWZhdWx0KFN0cmluZyBuYW1lLCBpbnQgdmFsdWUpIHsKLSAgICAJc3RvcmUuc2V0RGVmYXVsdChuYW1lLCB2YWx1ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgZGVmYXVsdCB2YWx1ZSBmb3IgdGhlIGxvbmctdmFsdWVkIHByZWZlcmVuY2Ugd2l0aCB0aGUKLSAgICAgKiBnaXZlbiBuYW1lLiAKLSAgICAgKiA8cD4KLSAgICAgKiBOb3RlIHRoYXQgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIHByZWZlcmVuY2UgaXMgYWZmZWN0ZWQgaWYKLSAgICAgKiB0aGUgcHJlZmVyZW5jZSdzIGN1cnJlbnQgdmFsdWUgd2FzIGl0cyBvbGQgZGVmYXVsdCB2YWx1ZSwgaW4gd2hpY2gKLSAgICAgKiBjYXNlIGl0IGNoYW5nZXMgdG8gdGhlIG5ldyBkZWZhdWx0IHZhbHVlLiBJZiB0aGUgcHJlZmVyZW5jZSdzIGN1cnJlbnQKLSAgICAgKiBpcyBkaWZmZXJlbnQgZnJvbSBpdHMgb2xkIGRlZmF1bHQgdmFsdWUsIGl0cyBjdXJyZW50IHZhbHVlIGlzCi0gICAgICogdW5hZmZlY3RlZC4gTm8gcHJvcGVydHkgY2hhbmdlIGV2ZW50cyBhcmUgcmVwb3J0ZWQgYnkgY2hhbmdpbmcgZGVmYXVsdAotICAgICAqIHZhbHVlcy4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgcHJlZmVyZW5jZQotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IGRlZmF1bHQgdmFsdWUgZm9yIHRoZSBwcmVmZXJlbmNlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RGVmYXVsdChTdHJpbmcgbmFtZSwgbG9uZyB2YWx1ZSkgewotICAgIAlzdG9yZS5zZXREZWZhdWx0KG5hbWUsIHZhbHVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBkZWZhdWx0IHZhbHVlIGZvciB0aGUgc3RyaW5nLXZhbHVlZCBwcmVmZXJlbmNlIHdpdGggdGhlCi0gICAgICogZ2l2ZW4gbmFtZS4gCi0gICAgICogPHA+Ci0gICAgICogTm90ZSB0aGF0IHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBwcmVmZXJlbmNlIGlzIGFmZmVjdGVkIGlmCi0gICAgICogdGhlIHByZWZlcmVuY2UncyBjdXJyZW50IHZhbHVlIHdhcyBpdHMgb2xkIGRlZmF1bHQgdmFsdWUsIGluIHdoaWNoCi0gICAgICogY2FzZSBpdCBjaGFuZ2VzIHRvIHRoZSBuZXcgZGVmYXVsdCB2YWx1ZS4gSWYgdGhlIHByZWZlcmVuY2UncyBjdXJyZW50Ci0gICAgICogaXMgZGlmZmVyZW50IGZyb20gaXRzIG9sZCBkZWZhdWx0IHZhbHVlLCBpdHMgY3VycmVudCB2YWx1ZSBpcwotICAgICAqIHVuYWZmZWN0ZWQuIE5vIHByb3BlcnR5IGNoYW5nZSBldmVudHMgYXJlIHJlcG9ydGVkIGJ5IGNoYW5naW5nIGRlZmF1bHQKLSAgICAgKiB2YWx1ZXMuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIHByZWZlcmVuY2UKLSAgICAgKiBAcGFyYW0gZGVmYXVsdE9iamVjdCB0aGUgbmV3IGRlZmF1bHQgdmFsdWUgZm9yIHRoZSBwcmVmZXJlbmNlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RGVmYXVsdChTdHJpbmcgbmFtZSwgU3RyaW5nIGRlZmF1bHRPYmplY3QpIHsKLSAgICAJc3RvcmUuc2V0RGVmYXVsdChuYW1lLCBkZWZhdWx0T2JqZWN0KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBkZWZhdWx0IHZhbHVlIGZvciB0aGUgYm9vbGVhbi12YWx1ZWQgcHJlZmVyZW5jZSB3aXRoIHRoZQotICAgICAqIGdpdmVuIG5hbWUuIAotICAgICAqIDxwPgotICAgICAqIE5vdGUgdGhhdCB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgcHJlZmVyZW5jZSBpcyBhZmZlY3RlZCBpZgotICAgICAqIHRoZSBwcmVmZXJlbmNlJ3MgY3VycmVudCB2YWx1ZSB3YXMgaXRzIG9sZCBkZWZhdWx0IHZhbHVlLCBpbiB3aGljaAotICAgICAqIGNhc2UgaXQgY2hhbmdlcyB0byB0aGUgbmV3IGRlZmF1bHQgdmFsdWUuIElmIHRoZSBwcmVmZXJlbmNlJ3MgY3VycmVudAotICAgICAqIGlzIGRpZmZlcmVudCBmcm9tIGl0cyBvbGQgZGVmYXVsdCB2YWx1ZSwgaXRzIGN1cnJlbnQgdmFsdWUgaXMKLSAgICAgKiB1bmFmZmVjdGVkLiBObyBwcm9wZXJ0eSBjaGFuZ2UgZXZlbnRzIGFyZSByZXBvcnRlZCBieSBjaGFuZ2luZyBkZWZhdWx0Ci0gICAgICogdmFsdWVzLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBwcmVmZXJlbmNlCi0gICAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgZGVmYXVsdCB2YWx1ZSBmb3IgdGhlIHByZWZlcmVuY2UKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXREZWZhdWx0KFN0cmluZyBuYW1lLCBib29sZWFuIHZhbHVlKSB7Ci0gICAgCXN0b3JlLnNldERlZmF1bHQobmFtZSwgdmFsdWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIHByZWZlcmVuY2Ugd2l0aCB0aGUgZ2l2ZW4gbmFtZSBiYWNrCi0gICAgICogdG8gaXRzIGRlZmF1bHQgdmFsdWUuCi0gICAgICogPHA+Ci0gICAgICogTm90ZSB0aGF0IHRoZSBwcmVmZXJyZWQgd2F5IG9mIHJlLWluaXRpYWxpemluZyBhIHByZWZlcmVuY2UgdG8gdGhlCi0gICAgICogYXBwcm9wcmlhdGUgZGVmYXVsdCB2YWx1ZSBpcyB0byBjYWxsIDxjb2RlPnNldFRvRGVmYXVsdDwvY29kZT4uCi0gICAgICogVGhpcyBpcyBpbXBsZW1lbnRlZCBieSByZW1vdmluZyB0aGUgbmFtZWQgdmFsdWUgZnJvbSB0aGUgc3RvcmUsIAotICAgICAqIHRoZXJlYnkgZXhwb3NpbmcgdGhlIGRlZmF1bHQgdmFsdWUuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIHByZWZlcmVuY2UKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRUb0RlZmF1bHQoU3RyaW5nIG5hbWUpIHsKLSAgICAJc3RvcmUuc2V0VG9EZWZhdWx0KG5hbWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIGRvdWJsZS12YWx1ZWQgcHJlZmVyZW5jZSB3aXRoIHRoZQotICAgICAqIGdpdmVuIG5hbWUuCi0gICAgICogPHA+Ci0gICAgICogQSBwcm9wZXJ0eSBjaGFuZ2UgZXZlbnQgaXMgcmVwb3J0ZWQgaWYgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIAotICAgICAqIHByZWZlcmVuY2UgYWN0dWFsbHkgY2hhbmdlcyBmcm9tIGl0cyBwcmV2aW91cyB2YWx1ZS4gSW4gdGhlIGV2ZW50Ci0gICAgICogb2JqZWN0LCB0aGUgcHJvcGVydHkgbmFtZSBpcyB0aGUgbmFtZSBvZiB0aGUgcHJlZmVyZW5jZSwgYW5kIHRoZQotICAgICAqIG9sZCBhbmQgbmV3IHZhbHVlcyBhcmUgd3JhcHBlZCBhcyBvYmplY3RzLgotICAgICAqIDwvcD4KLSAgICAgKiA8cD4KLSAgICAgKiBOb3RlIHRoYXQgdGhlIHByZWZlcnJlZCB3YXkgb2YgcmUtaW5pdGlhbGl6aW5nIGEgcHJlZmVyZW5jZSB0byBpdHMKLSAgICAgKiBkZWZhdWx0IHZhbHVlIGlzIHRvIGNhbGwgPGNvZGU+c2V0VG9EZWZhdWx0PC9jb2RlPi4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgcHJlZmVyZW5jZQotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IGN1cnJlbnQgdmFsdWUgb2YgdGhlIHByZWZlcmVuY2UKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRWYWx1ZShTdHJpbmcgbmFtZSwgZG91YmxlIHZhbHVlKSB7Ci0gICAgCXN0b3JlLnNldFZhbHVlKG5hbWUsIHZhbHVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBmbG9hdC12YWx1ZWQgcHJlZmVyZW5jZSB3aXRoIHRoZQotICAgICAqIGdpdmVuIG5hbWUuCi0gICAgICogPHA+Ci0gICAgICogQSBwcm9wZXJ0eSBjaGFuZ2UgZXZlbnQgaXMgcmVwb3J0ZWQgaWYgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIAotICAgICAqIHByZWZlcmVuY2UgYWN0dWFsbHkgY2hhbmdlcyBmcm9tIGl0cyBwcmV2aW91cyB2YWx1ZS4gSW4gdGhlIGV2ZW50Ci0gICAgICogb2JqZWN0LCB0aGUgcHJvcGVydHkgbmFtZSBpcyB0aGUgbmFtZSBvZiB0aGUgcHJlZmVyZW5jZSwgYW5kIHRoZQotICAgICAqIG9sZCBhbmQgbmV3IHZhbHVlcyBhcmUgd3JhcHBlZCBhcyBvYmplY3RzLgotICAgICAqIDwvcD4KLSAgICAgKiA8cD4KLSAgICAgKiBOb3RlIHRoYXQgdGhlIHByZWZlcnJlZCB3YXkgb2YgcmUtaW5pdGlhbGl6aW5nIGEgcHJlZmVyZW5jZSB0byBpdHMKLSAgICAgKiBkZWZhdWx0IHZhbHVlIGlzIHRvIGNhbGwgPGNvZGU+c2V0VG9EZWZhdWx0PC9jb2RlPi4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgcHJlZmVyZW5jZQotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IGN1cnJlbnQgdmFsdWUgb2YgdGhlIHByZWZlcmVuY2UKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRWYWx1ZShTdHJpbmcgbmFtZSwgZmxvYXQgdmFsdWUpIHsKLSAgICAJc3RvcmUuc2V0VmFsdWUobmFtZSwgdmFsdWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIGludGVnZXItdmFsdWVkIHByZWZlcmVuY2Ugd2l0aCB0aGUKLSAgICAgKiBnaXZlbiBuYW1lLgotICAgICAqIDxwPgotICAgICAqIEEgcHJvcGVydHkgY2hhbmdlIGV2ZW50IGlzIHJlcG9ydGVkIGlmIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSAKLSAgICAgKiBwcmVmZXJlbmNlIGFjdHVhbGx5IGNoYW5nZXMgZnJvbSBpdHMgcHJldmlvdXMgdmFsdWUuIEluIHRoZSBldmVudAotICAgICAqIG9iamVjdCwgdGhlIHByb3BlcnR5IG5hbWUgaXMgdGhlIG5hbWUgb2YgdGhlIHByZWZlcmVuY2UsIGFuZCB0aGUKLSAgICAgKiBvbGQgYW5kIG5ldyB2YWx1ZXMgYXJlIHdyYXBwZWQgYXMgb2JqZWN0cy4KLSAgICAgKiA8L3A+Ci0gICAgICogPHA+Ci0gICAgICogTm90ZSB0aGF0IHRoZSBwcmVmZXJyZWQgd2F5IG9mIHJlLWluaXRpYWxpemluZyBhIHByZWZlcmVuY2UgdG8gaXRzCi0gICAgICogZGVmYXVsdCB2YWx1ZSBpcyB0byBjYWxsIDxjb2RlPnNldFRvRGVmYXVsdDwvY29kZT4uCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIHByZWZlcmVuY2UKLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyBjdXJyZW50IHZhbHVlIG9mIHRoZSBwcmVmZXJlbmNlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VmFsdWUoU3RyaW5nIG5hbWUsIGludCB2YWx1ZSkgewotICAgIAlzdG9yZS5zZXRWYWx1ZShuYW1lLCB2YWx1ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgbG9uZy12YWx1ZWQgcHJlZmVyZW5jZSB3aXRoIHRoZQotICAgICAqIGdpdmVuIG5hbWUuCi0gICAgICogPHA+Ci0gICAgICogQSBwcm9wZXJ0eSBjaGFuZ2UgZXZlbnQgaXMgcmVwb3J0ZWQgaWYgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIAotICAgICAqIHByZWZlcmVuY2UgYWN0dWFsbHkgY2hhbmdlcyBmcm9tIGl0cyBwcmV2aW91cyB2YWx1ZS4gSW4gdGhlIGV2ZW50Ci0gICAgICogb2JqZWN0LCB0aGUgcHJvcGVydHkgbmFtZSBpcyB0aGUgbmFtZSBvZiB0aGUgcHJlZmVyZW5jZSwgYW5kIHRoZQotICAgICAqIG9sZCBhbmQgbmV3IHZhbHVlcyBhcmUgd3JhcHBlZCBhcyBvYmplY3RzLgotICAgICAqIDwvcD4KLSAgICAgKiA8cD4KLSAgICAgKiBOb3RlIHRoYXQgdGhlIHByZWZlcnJlZCB3YXkgb2YgcmUtaW5pdGlhbGl6aW5nIGEgcHJlZmVyZW5jZSB0byBpdHMKLSAgICAgKiBkZWZhdWx0IHZhbHVlIGlzIHRvIGNhbGwgPGNvZGU+c2V0VG9EZWZhdWx0PC9jb2RlPi4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgcHJlZmVyZW5jZQotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IGN1cnJlbnQgdmFsdWUgb2YgdGhlIHByZWZlcmVuY2UKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRWYWx1ZShTdHJpbmcgbmFtZSwgbG9uZyB2YWx1ZSkgewotICAgIAlzdG9yZS5zZXRWYWx1ZShuYW1lLCB2YWx1ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgc3RyaW5nLXZhbHVlZCBwcmVmZXJlbmNlIHdpdGggdGhlCi0gICAgICogZ2l2ZW4gbmFtZS4KLSAgICAgKiA8cD4KLSAgICAgKiBBIHByb3BlcnR5IGNoYW5nZSBldmVudCBpcyByZXBvcnRlZCBpZiB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgCi0gICAgICogcHJlZmVyZW5jZSBhY3R1YWxseSBjaGFuZ2VzIGZyb20gaXRzIHByZXZpb3VzIHZhbHVlLiBJbiB0aGUgZXZlbnQKLSAgICAgKiBvYmplY3QsIHRoZSBwcm9wZXJ0eSBuYW1lIGlzIHRoZSBuYW1lIG9mIHRoZSBwcmVmZXJlbmNlLCBhbmQgdGhlCi0gICAgICogb2xkIGFuZCBuZXcgdmFsdWVzIGFyZSB3cmFwcGVkIGFzIG9iamVjdHMuCi0gICAgICogPC9wPgotICAgICAqIDxwPgotICAgICAqIE5vdGUgdGhhdCB0aGUgcHJlZmVycmVkIHdheSBvZiByZS1pbml0aWFsaXppbmcgYSBwcmVmZXJlbmNlIHRvIGl0cwotICAgICAqIGRlZmF1bHQgdmFsdWUgaXMgdG8gY2FsbCA8Y29kZT5zZXRUb0RlZmF1bHQ8L2NvZGU+LgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBwcmVmZXJlbmNlCi0gICAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgY3VycmVudCB2YWx1ZSBvZiB0aGUgcHJlZmVyZW5jZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWUpIHsKLSAgICAJc3RvcmUuc2V0VmFsdWUobmFtZSwgdmFsdWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIGJvb2xlYW4tdmFsdWVkIHByZWZlcmVuY2Ugd2l0aCB0aGUKLSAgICAgKiBnaXZlbiBuYW1lLgotICAgICAqIDxwPgotICAgICAqIEEgcHJvcGVydHkgY2hhbmdlIGV2ZW50IGlzIHJlcG9ydGVkIGlmIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSAKLSAgICAgKiBwcmVmZXJlbmNlIGFjdHVhbGx5IGNoYW5nZXMgZnJvbSBpdHMgcHJldmlvdXMgdmFsdWUuIEluIHRoZSBldmVudAotICAgICAqIG9iamVjdCwgdGhlIHByb3BlcnR5IG5hbWUgaXMgdGhlIG5hbWUgb2YgdGhlIHByZWZlcmVuY2UsIGFuZCB0aGUKLSAgICAgKiBvbGQgYW5kIG5ldyB2YWx1ZXMgYXJlIHdyYXBwZWQgYXMgb2JqZWN0cy4KLSAgICAgKiA8L3A+Ci0gICAgICogPHA+Ci0gICAgICogTm90ZSB0aGF0IHRoZSBwcmVmZXJyZWQgd2F5IG9mIHJlLWluaXRpYWxpemluZyBhIHByZWZlcmVuY2UgdG8gaXRzCi0gICAgICogZGVmYXVsdCB2YWx1ZSBpcyB0byBjYWxsIDxjb2RlPnNldFRvRGVmYXVsdDwvY29kZT4uCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIHByZWZlcmVuY2UKLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyBjdXJyZW50IHZhbHVlIG9mIHRoZSBwcmVmZXJlbmNlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VmFsdWUoU3RyaW5nIG5hbWUsIGJvb2xlYW4gdmFsdWUpIHsKLSAgICAJc3RvcmUuc2V0VmFsdWUobmFtZSwgdmFsdWUpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vdWkvUHJvcGVydHlDaGFuZ2VFdmVudFdyYXBwZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vdWkvUHJvcGVydHlDaGFuZ2VFdmVudFdyYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjY2OThlMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3VpL1Byb3BlcnR5Q2hhbmdlRXZlbnRXcmFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5jb21tb24udWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnByZWZlcmVuY2VzLklQcm9wZXJ0eUNoYW5nZUV2ZW50V3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci0KLS8qKgotICogd3JhcHBlciBjbGFzcyBmb3IgcHJvcGVydHkgY2hhbmdlIGV2ZW50Ci0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS41Ci0gKgotICovCi1wdWJsaWMgY2xhc3MgUHJvcGVydHlDaGFuZ2VFdmVudFdyYXBwZXIgaW1wbGVtZW50cyBJUHJvcGVydHlDaGFuZ2VFdmVudFdyYXBwZXIgewotCi0JcHJpdmF0ZSBQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50OwotCXB1YmxpYyBQcm9wZXJ0eUNoYW5nZUV2ZW50V3JhcHBlcihQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMuZXZlbnQgPSBldmVudDsKLQl9Ci0JCi0JICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbmV3IHZhbHVlIG9mIHRoZSBwcm9wZXJ0eS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIG5ldyB2YWx1ZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm90IGtub3duCi0gICAgICogIG9yIG5vdCByZWxldmFudCAoZm9yIGluc3RhbmNlIGlmIHRoZSBwcm9wZXJ0eSB3YXMgcmVtb3ZlZCkuCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdCBnZXROZXdWYWx1ZSgpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuZXZlbnQuZ2V0TmV3VmFsdWUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBvbGQgdmFsdWUgb2YgdGhlIHByb3BlcnR5LgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgb2xkIHZhbHVlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub3Qga25vd24KLSAgICAgKiAgb3Igbm90IHJlbGV2YW50IChmb3IgaW5zdGFuY2UgaWYgdGhlIHByb3BlcnR5IHdhcyBqdXN0Ci0gICAgICogIGFkZGVkIGFuZCB0aGVyZSB3YXMgbm8gb2xkIHZhbHVlKS4KLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGdldE9sZFZhbHVlKCkgewotICAgICAgICByZXR1cm4gdGhpcy5ldmVudC5nZXRPbGRWYWx1ZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHRoYXQgY2hhbmdlZC4KLSAgICAgKiA8cD4KLSAgICAgKiBXYXJuaW5nOiB0aGVyZSBpcyBubyBndWFyYW50ZWUgdGhhdCB0aGUgcHJvcGVydHkgbmFtZSByZXR1cm5lZAotICAgICAqIGlzIGEgY29uc3RhbnQgc3RyaW5nLiAgQ2FsbGVycyBtdXN0IGNvbXBhcmUgcHJvcGVydHkgbmFtZXMgdXNpbmcKLSAgICAgKiBlcXVhbHMsIG5vdCA9PS4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0aGF0IGNoYW5nZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFByb3BlcnR5KCkgewotICAgICAgICByZXR1cm4gdGhpcy5ldmVudC5nZXRQcm9wZXJ0eSgpOwotICAgIH0KLSAgICAKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vdWkvYWN0aW9ucy9DQ29tYm9Db250cmlidXRpb25JdGVtLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3VpL2FjdGlvbnMvQ0NvbWJvQ29udHJpYnV0aW9uSXRlbS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZmJhNDE1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vdWkvYWN0aW9ucy9DQ29tYm9Db250cmlidXRpb25JdGVtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQ29udHJpYnV0aW9uSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ0NvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRGlzcG9zZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRGlzcG9zZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29vbEJhcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db29sSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Ub29sQmFyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRvb2xJdGVtOwotCi0vKioKLSAqIFdyYXBzIGEgQ0NvbWJvIGluIGEgQ29udHJpYnV0aW9uSXRlbSBmb3IgdXNlIGluIGEgdG9vbGJhcgotICogCi0gKiBEb2VzIG5vdCB1c2UgYSBDb21ib1ZpZXdlciBiZWNhdXNlIG9mIHRhYmJpbmcgaXNzdWVzIC0gc2VlIGJ1ZyA3ODg4NQotICogQGF1dGhvciBKZWZmIEhhcmR5Ci0gKgotICovCi1wdWJsaWMgY2xhc3MgQ0NvbWJvQ29udHJpYnV0aW9uSXRlbSBleHRlbmRzIENvbnRyaWJ1dGlvbkl0ZW0gewotCi0JcHJvdGVjdGVkIENDb21ibyBDQ29tYm87Ci0KLQlwcm90ZWN0ZWQgVG9vbEl0ZW0gdG9vbEl0ZW07Ci0KLQlwcm90ZWN0ZWQgQ29vbEl0ZW0gY29vbEl0ZW07Ci0JCi0JcHJvdGVjdGVkIGludCBzdHlsZTsKLQkKLQlwcm90ZWN0ZWQgQ29sbGVjdGlvbjxTdHJpbmc+IGlucHV0OwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgQ0NvbWJvQ29udHJpYnV0aW9uSXRlbShpbnQgc3R5bGUpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5zdHlsZSA9IHN0eWxlOwotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQ29udHJpYnV0aW9uSXRlbSNmaWxsKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRvb2xCYXIsCi0JICogICAgICBpbnQpCi0JICovCi0JcHVibGljIHZvaWQgZmlsbChUb29sQmFyIHBhcmVudCwgaW50IGluZGV4KSB7Ci0JCXRvb2xJdGVtID0gbmV3IFRvb2xJdGVtKHBhcmVudCwgU1dULlNFUEFSQVRPUik7Ci0JCUNvbnRyb2wgYm94ID0gY3JlYXRlQ29udHJvbChwYXJlbnQpOwotCQl0b29sSXRlbS5zZXRDb250cm9sKGJveCk7Ci0JCVBvaW50IHByZWZlcnJlZFNpemUgPSBDQ29tYm8uY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxULCB0cnVlKTsKLQkJdG9vbEl0ZW0uc2V0V2lkdGgocHJlZmVycmVkU2l6ZS54KTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkNvbnRyaWJ1dGlvbkl0ZW0jZmlsbChvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db29sQmFyLAotCSAqICAgICAgaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGZpbGwoQ29vbEJhciBjb29sQmFyLCBpbnQgaW5kZXgpIHsKLQkJQ29udHJvbCBib3ggPSBjcmVhdGVDb250cm9sKGNvb2xCYXIpOwotCi0JCWlmIChpbmRleCA+PSAwKSB7Ci0JCQljb29sSXRlbSA9IG5ldyBDb29sSXRlbShjb29sQmFyLCBTV1QuRFJPUF9ET1dOLCBpbmRleCk7Ci0JCX0gZWxzZSB7Ci0JCQljb29sSXRlbSA9IG5ldyBDb29sSXRlbShjb29sQmFyLCBTV1QuRFJPUF9ET1dOKTsKLQkJfQotCi0JCS8vIFNldCB0aGUgYmFjayByZWZlcmVuY2UuCi0JCWNvb2xJdGVtLnNldERhdGEodGhpcyk7Ci0KLQkJLy8gQWRkIHRoZSB0b29sYmFyIHRvIHRoZSBDb29sSXRlbSB3aWRnZXQuCi0JCWNvb2xJdGVtLnNldENvbnRyb2woYm94KTsKLQotCQkvLyBJZiB0aGUgdG9vbGJhciBpdGVtIGV4aXN0cyB0aGVuIGFkanVzdCB0aGUgc2l6ZSBvZiB0aGUgY29vbCBpdGVtLgotCQlQb2ludCB0b29sQmFyU2l6ZSA9IGJveC5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpOwotCi0JCS8vIFNldCB0aGUgcHJlZmVycmVkIHNpemUgdG8gdGhlIHNpemUgb2YgdGhlIHRvb2xiYXIgcGx1cyB0cmltLgotCQljb29sSXRlbS5zZXRNaW5pbXVtU2l6ZSh0b29sQmFyU2l6ZSk7Ci0JCWNvb2xJdGVtLnNldFByZWZlcnJlZFNpemUodG9vbEJhclNpemUpOwotCQljb29sSXRlbS5zZXRTaXplKHRvb2xCYXJTaXplKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkNvbnRyaWJ1dGlvbkl0ZW0jZmlsbChvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCi0JICovCi0JcHVibGljIHZvaWQgZmlsbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCWNyZWF0ZUNvbnRyb2wocGFyZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBjb250cm9sLgotCSAqLwotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRyb2woZmluYWwgQ29tcG9zaXRlIHBhcmVudCkgewotCQlDQ29tYm8gPSBuZXcgQ0NvbWJvKHBhcmVudCwgc3R5bGUpOwotCQlDQ29tYm8uc2V0VmlzaWJsZUl0ZW1Db3VudCgxMCk7Ci0JCUNDb21iby5zZXRFbmFibGVkKHRydWUpOwotCQlDQ29tYm8uc2V0SXRlbXMoaW5wdXQudG9BcnJheShuZXcgU3RyaW5nWzBdKSk7Ci0JCUNDb21iby5hZGREaXNwb3NlTGlzdGVuZXIoCi0JCQkJbmV3IERpc3Bvc2VMaXN0ZW5lcigpIHsKLQkJCQkJcHVibGljIHZvaWQgd2lkZ2V0RGlzcG9zZWQoRGlzcG9zZUV2ZW50IGV2ZW50KSB7Ci0JCQkJCQlkaXNwb3NlKCk7Ci0JCQkJCX0KLQkJCQl9KTsKLQotCQlDQ29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQl9Ci0KLQkJCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQkJcGVyZm9ybVNlbGVjdGlvbkNoYW5nZWQoKTsKLQkJCQkJfQotCQkJCX0pOwotCi0JCXJldHVybiBDQ29tYm87Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY3VycmVudGx5IHNlbGVjdGVkIG1ldGhvZCBjb25maWd1cmF0aW9uCi0JICovCi0JcHJvdGVjdGVkIGludCBnZXRTZWxlY3Rpb25JbmRleCgpIHsKLQkJcmV0dXJuIENDb21iby5nZXRTZWxlY3Rpb25JbmRleCgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzZXRJbnB1dChDb2xsZWN0aW9uPFN0cmluZz4gaW5wdXQpIHsKLQkJdGhpcy5pbnB1dCA9IGlucHV0OwotCX0KLQotCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybVNlbGVjdGlvbkNoYW5nZWQoKSB7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5Db250cmlidXRpb25JdGVtI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQl9Ci0KLQlwdWJsaWMgQ0NvbWJvIGdldENDb21ibygpIHsKLQkJcmV0dXJuIENDb21ibzsKLQl9Ci0KLQlwdWJsaWMgVG9vbEl0ZW0gZ2V0VG9vbEl0ZW0oKSB7Ci0JCXJldHVybiB0b29sSXRlbTsKLQl9Ci0KLQlwdWJsaWMgQ29vbEl0ZW0gZ2V0Q29vbEl0ZW0oKSB7Ci0JCXJldHVybiBjb29sSXRlbTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3VpL3V0aWwvQ2xpcGJvYXJkVXRpbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi91aS91dGlsL0NsaXBib2FyZFV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmFiZjAyNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3VpL3V0aWwvQ2xpcGJvYXJkVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5jb21tb24udWkudXRpbDsKLQotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5GaWxlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuQ2xpcGJvYXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuSFRNTFRyYW5zZmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuVGV4dFRyYW5zZmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuVHJhbnNmZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwotCi0vKioKLSAqIFV0aWxpdHkgY2xhc3MgZm9yIHJldHJpZXZpbmcgZGF0YSBmcm9tIHRoZSBjbGlwYm9hcmQuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQ2xpcGJvYXJkVXRpbCB7Ci0JCi0JLyoqCi0JICogVGhlIGN1cnJlbnQgY2xpcGJvYXJkLgotCSAqLwotCXByaXZhdGUgc3RhdGljIENsaXBib2FyZCBjbGlwYm9hcmQ7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU09VUkNFX1VSTCA9ICJTb3VyY2VVUkw6IjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgVHJhbnNmZXIgaHRtbFRyYW5zZmVyID0gbnVsbDsKLQotCXN0YXRpYyB7Ci0JCWlmIChTV1QuZ2V0UGxhdGZvcm0oKS5lcXVhbHMoIndpbjMyIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJdHJ5IHsKLQkJCQlCdW5kbGUgYnVuZGxlID0gUGxhdGZvcm0KLQkJCQkJCS5nZXRCdW5kbGUoIm9yZy5lY2xpcHNlLmVwZi5jb21tb24ud2luMzIud2luMzIueDg2Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQlDbGFzcyBjID0gYnVuZGxlCi0JCQkJCQkubG9hZENsYXNzKCJvcmcuZWNsaXBzZS5lcGYuY29tbW9uLndpbjMyLldpbjMySFRNTFRyYW5zZmVyIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlpZiAoYyAhPSBudWxsKSB7Ci0JCQkJCWh0bWxUcmFuc2ZlciA9IChUcmFuc2ZlcikgYy5uZXdJbnN0YW5jZSgpOwotCQkJCX0KLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJaHRtbFRyYW5zZmVyID0gbnVsbDsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIEhUTUwgc291cmNlIFVSTCBmcm9tIHRoZSBjdXJyZW50IGNsaXBib2FyZC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBIVE1MIHNvdXJjZSBVUkwgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRIVE1MU291cmNlVVJMKCkgewotCQlpZiAoaHRtbFRyYW5zZmVyID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJQ2xpcGJvYXJkIGNsaXBib2FyZCA9IG5ldyBDbGlwYm9hcmQoRGlzcGxheS5nZXRDdXJyZW50KCkpOwotCQlTdHJpbmcgc291cmNlVVJMID0gbnVsbDsKLQkJdHJ5IHsKLQkJCVN0cmluZyBodG1sQ29udGVudCA9IChTdHJpbmcpIGNsaXBib2FyZC5nZXRDb250ZW50cyhodG1sVHJhbnNmZXIpOwotCQkJaWYgKGh0bWxDb250ZW50ICE9IG51bGwgJiYgaHRtbENvbnRlbnQubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJaW50IGluZGV4ID0gaHRtbENvbnRlbnQuaW5kZXhPZihTT1VSQ0VfVVJMKTsKLQkJCQlpZiAoaW5kZXggPiAwKSB7Ci0JCQkJCXNvdXJjZVVSTCA9IGh0bWxDb250ZW50LnN1YnN0cmluZyhpbmRleAotCQkJCQkJCSsgU09VUkNFX1VSTC5sZW5ndGgoKSk7Ci0JCQkJCXNvdXJjZVVSTCA9IHNvdXJjZVVSTC5zdWJzdHJpbmcoMCwgc291cmNlVVJMCi0JCQkJCQkJLmluZGV4T2YoRmlsZVV0aWwuTElORV9TRVApKTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoc291cmNlVVJMICE9IG51bGwgJiYgc291cmNlVVJMLmluZGV4T2YoIlxcIikgIT0gLTEpIHsgLy8kTk9OLU5MUy0xJAotCQkJCS8vIElFIHByb3ZpZGVzIHNvdXJjZVVSTCBpbiBmb3JtICJmaWxlOi8vQzpcZm9vXGJhci5odG0iCi0JCQkJLy8gYnV0IHdoZW4gdGhlIGhyZWZzIGFyZSByZXNvbHZlZCwgZmlsZXMgbG9vayBsaWtlICJmaWxlOi8vL0M6L2Zvby9iYXIuaHRtIgotCQkJCVVSTCB1cmwgPSBuZXcgVVJMKHNvdXJjZVVSTCk7Ci0JCQkJc291cmNlVVJMID0gdXJsLnRvRXh0ZXJuYWxGb3JtKCk7Ci0JCQkJaWYgKHNvdXJjZVVSTC5zdGFydHNXaXRoKCJmaWxlOi8vIikgJiYgIXNvdXJjZVVSTC5zdGFydHNXaXRoKCJmaWxlOi8vLyIpKSB7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkvLyBuZWVkIHRvIGFkZCBhIHRoaXJkIC8gc28gcnRlLmpzIGNhbiBtYXRjaCB0aGUgc291cmNlVVJMIHRvIGhyZWZzCi0JCQkJCXNvdXJjZVVSTCA9ICJmaWxlOi8vLyIgKyBzb3VyY2VVUkwuc3Vic3RyaW5nKDcpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfQotCQkJcmV0dXJuIHNvdXJjZVVSTDsKLQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIHVybEV4KSB7Ci0JCQlyZXR1cm4gc291cmNlVVJMOwotCQl9IGZpbmFsbHkgewotCQkJY2xpcGJvYXJkLmRpc3Bvc2UoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENvcHkgdGhlIHN0cmluZyB0byB0aGUgY2xpcGJvYXJkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBjb3B5VGV4dEhUTUxUb0NsaXBib2FyZChTdHJpbmcgc3RyaW5nKSB7Ci0JCWlmIChjbGlwYm9hcmQgIT0gbnVsbCkKLQkJCWNsaXBib2FyZC5kaXNwb3NlKCk7Ci0JCWNsaXBib2FyZCA9IG5ldyBDbGlwYm9hcmQobnVsbCk7Ci0JCWNsaXBib2FyZC5zZXRDb250ZW50cyhuZXcgT2JqZWN0W10geyBzdHJpbmcsIHN0cmluZyB9LAotCQkJCW5ldyBUcmFuc2ZlcltdIHsgVGV4dFRyYW5zZmVyLmdldEluc3RhbmNlKCksIEhUTUxUcmFuc2Zlci5nZXRJbnN0YW5jZSgpIH0pOwotCQlpZiAoY2xpcGJvYXJkICE9IG51bGwpCi0JCQljbGlwYm9hcmQuZGlzcG9zZSgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi91aS91dGlsL0NvbW1vblByZWZlcmVuY2VzLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3VpL3V0aWwvQ29tbW9uUHJlZmVyZW5jZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODY3YzYzMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3VpL3V0aWwvQ29tbW9uUHJlZmVyZW5jZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS5Db21tb25VSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci0KLS8qKgotICogTWFuYWdlcyB0aGUgY29tbW9uIHByZWZlcmVuY2VzLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjIKLSAqLwotcHVibGljIGNsYXNzIENvbW1vblByZWZlcmVuY2VzIHsKLQotCS8qKgotCSAqIFByZWZlcmVuY2Uga2V5IGZvciBzdG9yaW5nIHRoZSBwcmVmZXJlbmNlIGhpc3Rvcnkgc2l6ZS4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRkVSRU5DRV9ISVNUT1JZX1NJWkUgPSAicHJlZmVyZW5jZUhpc3RvcnlTaXplIjsgLy8kTk9OLU5MUy0xJAotCi0JLy8gVGhlIHBsdWctaW4gc3BlY2lmaWMgcHJlZmVyZW5jZSBzdG9yZS4KLQlwcml2YXRlIHN0YXRpYyBJUHJlZmVyZW5jZVN0b3JlIHByZWZTdG9yZSA9IENvbW1vblVJUGx1Z2luLmdldERlZmF1bHQoKQotCQkJLmdldFByZWZlcmVuY2VTdG9yZSgpOwotCi0Jc3RhdGljIHsKLQkJLy8gSW5pdGlhbGl6ZSB0aGUgZGVmYXVsdCBwcmVmZXJlbmNlIHZhbHVlcy4KLQkJcHJlZlN0b3JlLnNldERlZmF1bHQoUFJFRkVSRU5DRV9ISVNUT1JZX1NJWkUsCi0JCQkJZ2V0RGVmYXVsdFByZWZlcmVuY2VIaXN0b3J5U2l6ZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBkZWZhdWx0IHByZWZlcmVuY2UgaGlzdG9yeSBzaXplLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IGdldERlZmF1bHRQcmVmZXJlbmNlSGlzdG9yeVNpemUoKSB7Ci0JCXJldHVybiAxMDsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBwcmVmZXJlbmNlIGhpc3Rvcnkgc2l6ZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBnZXRQcmVmZXJlbmNlSGlzdG9yeVNpemUoKSB7Ci0JCXJldHVybiBwcmVmU3RvcmUuZ2V0SW50KFBSRUZFUkVOQ0VfSElTVE9SWV9TSVpFKTsKLQl9Ci0KLQkvKioKLQkgKiBTYXZlcyB0aGUgcHJlZmVyZW5jZSBoaXN0b3J5IHNpemUuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldFByZWZlcmVuY2VIaXN0b3J5U2l6ZShpbnQgdmFsdWUpIHsKLQkJcHJlZlN0b3JlLnNldFZhbHVlKFBSRUZFUkVOQ0VfSElTVE9SWV9TSVpFLCB2YWx1ZSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3VpL3V0aWwvRXJyb3JEaWFsb2dOb1JlYXNvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi91aS91dGlsL0Vycm9yRGlhbG9nTm9SZWFzb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTEyNzFjNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3VpL3V0aWwvRXJyb3JEaWFsb2dOb1JlYXNvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTk4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5jb21tb24udWkudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkljb25BbmRNZXNzYWdlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkpGYWNlUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5DbGlwYm9hcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5UZXh0VHJhbnNmZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5UcmFuc2ZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5NZW51OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLk1lbnVJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotCi0vKioKLSAqIERpc3BsYXlzIGFuIGVycm9yIGRpYWxvZyB3aXRob3V0IHRoZSBEZXRhaWxzIGJ1dHRvbi4KLSAqIAotICogQGF1dGhvciBCaW5neHVlIFh1Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBFcnJvckRpYWxvZ05vUmVhc29uIGV4dGVuZHMgSWNvbkFuZE1lc3NhZ2VEaWFsb2cgewotCi0JLyoqCi0JICogU3RhdGljIHRvIHByZXZlbnQgb3BlbmluZyBvZiBlcnJvciBkaWFsb2dzIGZvciBhdXRvbWF0ZWQgdGVzdGluZy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gQVVUT01BVEVEX01PREUgPSBmYWxzZTsKLQotCS8qKgotCSAqIFJlc2VydmUgcm9vbSBmb3IgdGhpcyBtYW55IGxpc3QgaXRlbXMuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IExJU1RfSVRFTV9DT1VOVCA9IDc7Ci0KLQkvKioKLQkgKiBUaGUgbmVzdGluZyBpbmRlbnQuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5FU1RJTkdfSU5ERU5UID0gIiAgIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlIERldGFpbHMgYnV0dG9uLgotCSAqLwotCXByb3RlY3RlZCBCdXR0b24gZGV0YWlsc0J1dHRvbjsKLQotCS8qKgotCSAqIFRoZSB0aXRsZSBvZiB0aGUgZGlhbG9nLgotCSAqLwotCXByaXZhdGUgU3RyaW5nIHRpdGxlOwotCi0JLyoqCi0JICogVGhlIFNXVCBsaXN0IGNvbnRyb2wgdGhhdCBkaXNwbGF5cyB0aGUgZXJyb3IgZGV0YWlscy4KLQkgKi8KLQlwcml2YXRlIExpc3QgbGlzdDsKLQotCS8qKgotCSAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBlcnJvciBkZXRhaWxzIHZpZXdlciBpcyBjdXJyZW50bHkgY3JlYXRlZC4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gbGlzdENyZWF0ZWQgPSBmYWxzZTsKLQotCS8qKgotCSAqIEZpbHRlciBtYXNrIGZvciBkZXRlcm1pbmluZyB3aGljaCBzdGF0dXMgaXRlbXMgdG8gZGlzcGxheS4KLQkgKi8KLQlwcml2YXRlIGludCBkaXNwbGF5TWFzayA9IDB4RkZGRjsKLQotCS8qKgotCSAqIFRoZSBtYWluIHN0YXR1cyBvYmplY3QuCi0JICovCi0JcHJpdmF0ZSBJU3RhdHVzIHN0YXR1czsKLQotCS8qKgotCSAqIFRoZSBjdXJyZW50IGNsaXBib2FyZC4gVG8gYmUgZGlzcG9zZWQgd2hlbiBjbG9zaW5nIHRoZSBkaWFsb2cuCi0JICovCi0JcHJpdmF0ZSBDbGlwYm9hcmQgY2xpcGJvYXJkOwotCi0JcHJpdmF0ZSBib29sZWFuIHNob3VsZEluY2x1ZGVUb3BMZXZlbEVycm9ySW5EZXRhaWxzID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGVycm9yIGRpYWxvZy4gTm90ZSB0aGF0IHRoZSBkaWFsb2cgd2lsbCBoYXZlIG5vIHZpc3VhbAotCSAqIHJlcHJlc2VudGF0aW9uIChubyB3aWRnZXRzKSB1bnRpbCBpdCBpcyB0b2xkIHRvIG9wZW4uCi0JICogPHA+Ci0JICogTm9ybWFsbHkgb25lIHNob3VsZCB1c2UgPGNvZGU+b3BlbkVycm9yPC9jb2RlPiB0byBjcmVhdGUgYW5kIG9wZW4gb25lCi0JICogb2YgdGhlc2UuIFRoaXMgY29uc3RydWN0b3IgaXMgdXNlZnVsIG9ubHkgaWYgdGhlIGVycm9yIG9iamVjdCBiZWluZwotCSAqIGRpc3BsYXllZCBjb250YWlucyBjaGlsZCBpdGVtcyA8aXQ+YW5kIDwvaXQ+IHlvdSBuZWVkIHRvIHNwZWNpZnkgYSBtYXNrCi0JICogd2hpY2ggd2lsbCBiZSB1c2VkIHRvIGZpbHRlciB0aGUgZGlzcGxheWluZyBvZiB0aGVzZSBjaGlsZHJlbi4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIHBhcmVudFNoZWxsCi0JICogICAgICAgICAgICB0aGUgc2hlbGwgdW5kZXIgd2hpY2ggdG8gY3JlYXRlIHRoaXMgZGlhbG9nCi0JICogQHBhcmFtIGRpYWxvZ1RpdGxlCi0JICogICAgICAgICAgICB0aGUgdGl0bGUgdG8gdXNlIGZvciB0aGlzIGRpYWxvZywgb3IgPGNvZGU+bnVsbDwvY29kZT4gdG8KLQkgKiAgICAgICAgICAgIGluZGljYXRlIHRoYXQgdGhlIGRlZmF1bHQgdGl0bGUgc2hvdWxkIGJlIHVzZWQKLQkgKiBAcGFyYW0gbWVzc2FnZQotCSAqICAgICAgICAgICAgdGhlIG1lc3NhZ2UgdG8gc2hvdyBpbiB0aGlzIGRpYWxvZywgb3IgPGNvZGU+bnVsbDwvY29kZT4gdG8KLQkgKiAgICAgICAgICAgIGluZGljYXRlIHRoYXQgdGhlIGVycm9yJ3MgbWVzc2FnZSBzaG91bGQgYmUgc2hvd24gYXMgdGhlCi0JICogICAgICAgICAgICBwcmltYXJ5IG1lc3NhZ2UKLQkgKiBAcGFyYW0gc3RhdHVzCi0JICogICAgICAgICAgICB0aGUgZXJyb3IgdG8gc2hvdyB0byB0aGUgdXNlcgotCSAqIEBwYXJhbSBkaXNwbGF5TWFzawotCSAqICAgICAgICAgICAgdGhlIG1hc2sgdG8gdXNlIHRvIGZpbHRlciB0aGUgZGlzcGxheWluZyBvZiBjaGlsZCBpdGVtcywgYXMKLQkgKiAgICAgICAgICAgIHBlciA8Y29kZT5JU3RhdHVzLm1hdGNoZXM8L2NvZGU+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1cyNtYXRjaGVzKGludCkKLQkgKi8KLQlwdWJsaWMgRXJyb3JEaWFsb2dOb1JlYXNvbihTaGVsbCBwYXJlbnRTaGVsbCwgU3RyaW5nIGRpYWxvZ1RpdGxlLAotCQkJU3RyaW5nIG1lc3NhZ2UsIElTdGF0dXMgc3RhdHVzLCBpbnQgZGlzcGxheU1hc2spIHsKLQkJc3VwZXIocGFyZW50U2hlbGwpOwotCQl0aGlzLnRpdGxlID0gZGlhbG9nVGl0bGUgPT0gbnVsbCA/IEpGYWNlUmVzb3VyY2VzCi0JCQkJLmdldFN0cmluZygiUHJvYmxlbV9PY2N1cnJlZCIpIDogLy8kTk9OLU5MUy0xJAotCQkJCWRpYWxvZ1RpdGxlOwotCQl0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlID09IG51bGwgPyBzdGF0dXMuZ2V0TWVzc2FnZSgpIDogbWVzc2FnZTsgCi0JCXRoaXMuc3RhdHVzID0gc3RhdHVzOwotCQl0aGlzLmRpc3BsYXlNYXNrID0gZGlzcGxheU1hc2s7Ci0JCXNldFNoZWxsU3R5bGUoZ2V0U2hlbGxTdHlsZSgpIHwgU1dULlJFU0laRSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpIE1ldGhvZCBkZWNsYXJlZCBvbiBEaWFsb2cuIEhhbmRsZXMgdGhlIHByZXNzaW5nIG9mIHRoZSBPawotCSAqIG9yIERldGFpbHMgYnV0dG9uIGluIHRoaXMgZGlhbG9nLiBJZiB0aGUgT2sgYnV0dG9uIHdhcyBwcmVzc2VkIHRoZW4gY2xvc2UKLQkgKiB0aGlzIGRpYWxvZy4gSWYgdGhlIERldGFpbHMgYnV0dG9uIHdhcyBwcmVzc2VkIHRoZW4gdG9nZ2xlIHRoZSBkaXNwbGF5aW5nCi0JICogb2YgdGhlIGVycm9yIGRldGFpbHMgYXJlYS4gTm90ZSB0aGF0IHRoZSBEZXRhaWxzIGJ1dHRvbiB3aWxsIG9ubHkgYmUKLQkgKiB2aXNpYmxlIGlmIHRoZSBlcnJvciBiZWluZyBkaXNwbGF5ZWQgc3BlY2lmaWVzIGNoaWxkIGRldGFpbHMuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYnV0dG9uUHJlc3NlZChpbnQgaWQpIHsKLQkJaWYgKGlkID09IElEaWFsb2dDb25zdGFudHMuREVUQUlMU19JRCkgewotCQkJLy8gd2FzIHRoZSBkZXRhaWxzIGJ1dHRvbiBwcmVzc2VkPwotCQkJdG9nZ2xlRGV0YWlsc0FyZWEoKTsKLQkJfSBlbHNlIHsKLQkJCXN1cGVyLmJ1dHRvblByZXNzZWQoaWQpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpIE1ldGhvZCBkZWNsYXJlZCBpbiBXaW5kb3cuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlU2hlbGwoU2hlbGwgc2hlbGwpIHsKLQkJc3VwZXIuY29uZmlndXJlU2hlbGwoc2hlbGwpOwotCQlzaGVsbC5zZXRUZXh0KHRpdGxlKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykgTWV0aG9kIGRlY2xhcmVkIG9uIERpYWxvZy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVCdXR0b25zRm9yQnV0dG9uQmFyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJLy8gY3JlYXRlIE9LIGFuZCBEZXRhaWxzIGJ1dHRvbnMKLQkJY3JlYXRlQnV0dG9uKHBhcmVudCwgSURpYWxvZ0NvbnN0YW50cy5PS19JRCwgSURpYWxvZ0NvbnN0YW50cy5PS19MQUJFTCwKLQkJCQl0cnVlKTsKLQkJY3JlYXRlQnV0dG9uKHBhcmVudCwgSURpYWxvZ0NvbnN0YW50cy5DQU5DRUxfSUQsCi0JCQkJSURpYWxvZ0NvbnN0YW50cy5DQU5DRUxfTEFCRUwsIGZhbHNlKTsKLQkJaWYgKHNob3VsZFNob3dEZXRhaWxzQnV0dG9uKCkpIHsKLQkJCWRldGFpbHNCdXR0b24gPSBjcmVhdGVCdXR0b24ocGFyZW50LCBJRGlhbG9nQ29uc3RhbnRzLkRFVEFJTFNfSUQsCi0JCQkJCUlEaWFsb2dDb25zdGFudHMuU0hPV19ERVRBSUxTX0xBQkVMLCBmYWxzZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIG9mIHRoZSA8Y29kZT5EaWFsb2c8L2NvZGU+IGZyYW1ld29yayBtZXRob2QgY3JlYXRlcwotCSAqIGFuZCBsYXlzIG91dCBhIGNvbXBvc2l0ZSBhbmQgY2FsbHMgPGNvZGU+Y3JlYXRlTWVzc2FnZUFyZWE8L2NvZGU+IGFuZAotCSAqIDxjb2RlPmNyZWF0ZUN1c3RvbUFyZWE8L2NvZGU+IHRvIHBvcHVsYXRlIGl0LiBTdWJjbGFzc2VzIHNob3VsZAotCSAqIG92ZXJyaWRlIDxjb2RlPmNyZWF0ZUN1c3RvbUFyZWE8L2NvZGU+IHRvIGFkZCBjb250ZW50cyBiZWxvdyB0aGUKLQkgKiBtZXNzYWdlLgotCSAqLwotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkgewotCQljcmVhdGVNZXNzYWdlQXJlYShwYXJlbnQpOwotCQkvLyBjcmVhdGUgYSBjb21wb3NpdGUgd2l0aCBzdGFuZGFyZCBtYXJnaW5zIGFuZCBzcGFjaW5nCi0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5tYXJnaW5IZWlnaHQgPSBjb252ZXJ0VmVydGljYWxETFVzVG9QaXhlbHMoSURpYWxvZ0NvbnN0YW50cy5WRVJUSUNBTF9NQVJHSU4pOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSBjb252ZXJ0SG9yaXpvbnRhbERMVXNUb1BpeGVscyhJRGlhbG9nQ29uc3RhbnRzLkhPUklaT05UQUxfTUFSR0lOKTsKLQkJbGF5b3V0LnZlcnRpY2FsU3BhY2luZyA9IGNvbnZlcnRWZXJ0aWNhbERMVXNUb1BpeGVscyhJRGlhbG9nQ29uc3RhbnRzLlZFUlRJQ0FMX1NQQUNJTkcpOwotCQlsYXlvdXQuaG9yaXpvbnRhbFNwYWNpbmcgPSBjb252ZXJ0SG9yaXpvbnRhbERMVXNUb1BpeGVscyhJRGlhbG9nQ29uc3RhbnRzLkhPUklaT05UQUxfU1BBQ0lORyk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMjsKLQkJY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCQlHcmlkRGF0YSBjaGlsZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJY2hpbGREYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJY29tcG9zaXRlLnNldExheW91dERhdGEoY2hpbGREYXRhKTsKLQkJY29tcG9zaXRlLnNldEZvbnQocGFyZW50LmdldEZvbnQoKSk7Ci0JCXJldHVybiBjb21wb3NpdGU7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIEljb25BbmRNZXNzYWdlRGlhbG9nI2NyZWF0ZURpYWxvZ0FuZEJ1dHRvbkFyZWEoQ29tcG9zaXRlKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZURpYWxvZ0FuZEJ1dHRvbkFyZWEoQ29tcG9zaXRlIHBhcmVudCkgewotCQlzdXBlci5jcmVhdGVEaWFsb2dBbmRCdXR0b25BcmVhKHBhcmVudCk7Ci0JCWlmICh0aGlzLmRpYWxvZ0FyZWEgaW5zdGFuY2VvZiBDb21wb3NpdGUpIHsKLQkJCS8vIENyZWF0ZSBhIGxhYmVsIGlmIHRoZXJlIGFyZSBubyBjaGlsZHJlbiB0byBmb3JjZSBhIHNtYWxsZXIgbGF5b3V0Ci0JCQlDb21wb3NpdGUgZGlhbG9nQ29tcG9zaXRlID0gKENvbXBvc2l0ZSkgZGlhbG9nQXJlYTsKLQkJCWlmIChkaWFsb2dDb21wb3NpdGUuZ2V0Q2hpbGRyZW4oKS5sZW5ndGggPT0gMCkKLQkJCQluZXcgTGFiZWwoZGlhbG9nQ29tcG9zaXRlLCBTV1QuTlVMTCk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSWNvbkFuZE1lc3NhZ2VEaWFsb2cjZ2V0SW1hZ2UoKQotCSAqLwotCXByb3RlY3RlZCBJbWFnZSBnZXRJbWFnZSgpIHsKLQkJaWYgKHN0YXR1cyAhPSBudWxsKSB7Ci0JCQlpZiAoc3RhdHVzLmdldFNldmVyaXR5KCkgPT0gSVN0YXR1cy5XQVJOSU5HKQotCQkJCXJldHVybiBnZXRXYXJuaW5nSW1hZ2UoKTsKLQkJCWlmIChzdGF0dXMuZ2V0U2V2ZXJpdHkoKSA9PSBJU3RhdHVzLklORk8pCi0JCQkJcmV0dXJuIGdldEluZm9JbWFnZSgpOwotCQl9Ci0JCS8vIElmIGl0IHdhcyBub3QgYSB3YXJuaW5nIG9yIGFuIGVycm9yIHRoZW4gcmV0dXJuIHRoZSBlcnJvciBpbWFnZQotCQlyZXR1cm4gZ2V0RXJyb3JJbWFnZSgpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSB0aGlzIGRpYWxvZydzIGRyb3AtZG93biBsaXN0IGNvbXBvbmVudC4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IGNvbXBvc2l0ZQotCSAqIEByZXR1cm4gdGhlIGRyb3AtZG93biBsaXN0IGNvbXBvbmVudAotCSAqLwotCXByb3RlY3RlZCBMaXN0IGNyZWF0ZURyb3BEb3duTGlzdChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCS8vIGNyZWF0ZSB0aGUgbGlzdAotCQlsaXN0ID0gbmV3IExpc3QocGFyZW50LCBTV1QuQk9SREVSIHwgU1dULkhfU0NST0xMIHwgU1dULlZfU0NST0xMCi0JCQkJfCBTV1QuTVVMVEkpOwotCQkvLyBmaWxsIHRoZSBsaXN0Ci0JCXBvcHVsYXRlTGlzdChsaXN0KTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwKLQkJCQl8IEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0ZJTEwKLQkJCQl8IEdyaWREYXRhLkdSQUJfVkVSVElDQUwpOwotCQlkYXRhLmhlaWdodEhpbnQgPSBsaXN0LmdldEl0ZW1IZWlnaHQoKSAqIExJU1RfSVRFTV9DT1VOVDsKLQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCWxpc3Quc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJbGlzdC5zZXRGb250KHBhcmVudC5nZXRGb250KCkpOwotCQlNZW51IGNvcHlNZW51ID0gbmV3IE1lbnUobGlzdCk7Ci0JCU1lbnVJdGVtIGNvcHlJdGVtID0gbmV3IE1lbnVJdGVtKGNvcHlNZW51LCBTV1QuTk9ORSk7Ci0JCWNvcHlJdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCS8qCi0JCQkgKiBAc2VlIFNlbGVjdGlvbkxpc3RlbmVyLndpZGdldFNlbGVjdGVkIChTZWxlY3Rpb25FdmVudCkKLQkJCSAqLwotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWNvcHlUb0NsaXBib2FyZCgpOwotCQkJfQotCi0JCQkvKgotCQkJICogQHNlZSBTZWxlY3Rpb25MaXN0ZW5lci53aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQpCi0JCQkgKi8KLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJY29weVRvQ2xpcGJvYXJkKCk7Ci0JCQl9Ci0JCX0pOwotCQljb3B5SXRlbS5zZXRUZXh0KEpGYWNlUmVzb3VyY2VzLmdldFN0cmluZygiY29weSIpKTsgLy8kTk9OLU5MUy0xJAotCQlsaXN0LnNldE1lbnUoY29weU1lbnUpOwotCQlsaXN0Q3JlYXRlZCA9IHRydWU7Ci0JCXJldHVybiBsaXN0OwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKSBNZXRob2QgZGVjbGFyZWQgb24gV2luZG93LgotCSAqLwotCS8qKgotCSAqIEV4dGVuZHMgPGNvZGU+V2luZG93Lm9wZW4oKTwvY29kZT4uIE9wZW5zIGFuIGVycm9yIGRpYWxvZyB0byBkaXNwbGF5Ci0JICogdGhlIGVycm9yLiBJZiB5b3Ugc3BlY2lmaWVkIGEgbWFzayB0byBmaWx0ZXIgdGhlIGRpc3BsYXlpbmcgb2YgdGhlc2UKLQkgKiBjaGlsZHJlbiwgdGhlIGVycm9yIGRpYWxvZyB3aWxsIG9ubHkgYmUgZGlzcGxheWVkIGlmIHRoZXJlIGlzIGF0IGxlYXN0Ci0JICogb25lIGNoaWxkIHN0YXR1cyBtYXRjaGluZyB0aGUgbWFzay4KLQkgKi8KLQlwdWJsaWMgaW50IG9wZW4oKSB7Ci0JCWlmICghQVVUT01BVEVEX01PREUgJiYgc2hvdWxkRGlzcGxheShzdGF0dXMsIGRpc3BsYXlNYXNrKSkgewotCQkJcmV0dXJuIHN1cGVyLm9wZW4oKTsKLQkJfQotCQlzZXRSZXR1cm5Db2RlKE9LKTsKLQkJcmV0dXJuIE9LOwotCX0KLQotCS8qKgotCSAqIE9wZW5zIGFuIGVycm9yIGRpYWxvZyB0byBkaXNwbGF5IHRoZSBnaXZlbiBlcnJvci4gVXNlIHRoaXMgbWV0aG9kIGlmIHRoZQotCSAqIGVycm9yIG9iamVjdCBiZWluZyBkaXNwbGF5ZWQgZG9lcyBub3QgY29udGFpbiBjaGlsZCBpdGVtcywgb3IgaWYgeW91IHdpc2gKLQkgKiB0byBkaXNwbGF5IGFsbCBzdWNoIGl0ZW1zIHdpdGhvdXQgZmlsdGVyaW5nLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgc2hlbGwgb2YgdGhlIGRpYWxvZywgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQotCSAqIEBwYXJhbSBkaWFsb2dUaXRsZQotCSAqICAgICAgICAgICAgdGhlIHRpdGxlIHRvIHVzZSBmb3IgdGhpcyBkaWFsb2csIG9yIDxjb2RlPm51bGw8L2NvZGU+IHRvCi0JICogICAgICAgICAgICBpbmRpY2F0ZSB0aGF0IHRoZSBkZWZhdWx0IHRpdGxlIHNob3VsZCBiZSB1c2VkCi0JICogQHBhcmFtIG1lc3NhZ2UKLQkgKiAgICAgICAgICAgIHRoZSBtZXNzYWdlIHRvIHNob3cgaW4gdGhpcyBkaWFsb2csIG9yIDxjb2RlPm51bGw8L2NvZGU+IHRvCi0JICogICAgICAgICAgICBpbmRpY2F0ZSB0aGF0IHRoZSBlcnJvcidzIG1lc3NhZ2Ugc2hvdWxkIGJlIHNob3duIGFzIHRoZQotCSAqICAgICAgICAgICAgcHJpbWFyeSBtZXNzYWdlCi0JICogQHBhcmFtIHN0YXR1cwotCSAqICAgICAgICAgICAgdGhlIGVycm9yIHRvIHNob3cgdG8gdGhlIHVzZXIKLQkgKiBAcmV0dXJuIHRoZSBjb2RlIG9mIHRoZSBidXR0b24gdGhhdCB3YXMgcHJlc3NlZCB0aGF0IHJlc3VsdGVkIGluIHRoaXMKLQkgKiAgICAgICAgIGRpYWxvZyBjbG9zaW5nLiBUaGlzIHdpbGwgYmUgPGNvZGU+RGlhbG9nLk9LPC9jb2RlPiBpZiB0aGUgT0sKLQkgKiAgICAgICAgIGJ1dHRvbiB3YXMgcHJlc3NlZCwgb3IgPGNvZGU+RGlhbG9nLkNBTkNFTDwvY29kZT4gaWYgdGhpcwotCSAqICAgICAgICAgZGlhbG9nJ3MgY2xvc2Ugd2luZG93IGRlY29yYXRpb24gb3IgdGhlIEVTQyBrZXkgd2FzIHVzZWQuCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgb3BlbkVycm9yKFNoZWxsIHBhcmVudCwgU3RyaW5nIGRpYWxvZ1RpdGxlLAotCQkJU3RyaW5nIG1lc3NhZ2UsIElTdGF0dXMgc3RhdHVzKSB7Ci0JCXJldHVybiBvcGVuRXJyb3IocGFyZW50LCBkaWFsb2dUaXRsZSwgbWVzc2FnZSwgc3RhdHVzLCBJU3RhdHVzLk9LCi0JCQkJfCBJU3RhdHVzLklORk8gfCBJU3RhdHVzLldBUk5JTkcgfCBJU3RhdHVzLkVSUk9SKTsKLQl9Ci0KLQkvKioKLQkgKiBPcGVucyBhbiBlcnJvciBkaWFsb2cgdG8gZGlzcGxheSB0aGUgZ2l2ZW4gZXJyb3IuIFVzZSB0aGlzIG1ldGhvZCBpZiB0aGUKLQkgKiBlcnJvciBvYmplY3QgYmVpbmcgZGlzcGxheWVkIGNvbnRhaW5zIGNoaWxkIGl0ZW1zIDxpdD5hbmQgPC9pdD4geW91IHdpc2gKLQkgKiB0byBzcGVjaWZ5IGEgbWFzayB3aGljaCB3aWxsIGJlIHVzZWQgdG8gZmlsdGVyIHRoZSBkaXNwbGF5aW5nIG9mIHRoZXNlCi0JICogY2hpbGRyZW4uIFRoZSBlcnJvciBkaWFsb2cgd2lsbCBvbmx5IGJlIGRpc3BsYXllZCBpZiB0aGVyZSBpcyBhdCBsZWFzdAotCSAqIG9uZSBjaGlsZCBzdGF0dXMgbWF0Y2hpbmcgdGhlIG1hc2suCi0JICogCi0JICogQHBhcmFtIHBhcmVudFNoZWxsCi0JICogICAgICAgICAgICB0aGUgcGFyZW50IHNoZWxsIG9mIHRoZSBkaWFsb2csIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUKLQkgKiBAcGFyYW0gdGl0bGUKLQkgKiAgICAgICAgICAgIHRoZSB0aXRsZSB0byB1c2UgZm9yIHRoaXMgZGlhbG9nLCBvciA8Y29kZT5udWxsPC9jb2RlPiB0bwotCSAqICAgICAgICAgICAgaW5kaWNhdGUgdGhhdCB0aGUgZGVmYXVsdCB0aXRsZSBzaG91bGQgYmUgdXNlZAotCSAqIEBwYXJhbSBtZXNzYWdlCi0JICogICAgICAgICAgICB0aGUgbWVzc2FnZSB0byBzaG93IGluIHRoaXMgZGlhbG9nLCBvciA8Y29kZT5udWxsPC9jb2RlPiB0bwotCSAqICAgICAgICAgICAgaW5kaWNhdGUgdGhhdCB0aGUgZXJyb3IncyBtZXNzYWdlIHNob3VsZCBiZSBzaG93biBhcyB0aGUKLQkgKiAgICAgICAgICAgIHByaW1hcnkgbWVzc2FnZQotCSAqIEBwYXJhbSBzdGF0dXMKLQkgKiAgICAgICAgICAgIHRoZSBlcnJvciB0byBzaG93IHRvIHRoZSB1c2VyCi0JICogQHBhcmFtIGRpc3BsYXlNYXNrCi0JICogICAgICAgICAgICB0aGUgbWFzayB0byB1c2UgdG8gZmlsdGVyIHRoZSBkaXNwbGF5aW5nIG9mIGNoaWxkIGl0ZW1zLCBhcwotCSAqICAgICAgICAgICAgcGVyIDxjb2RlPklTdGF0dXMubWF0Y2hlczwvY29kZT4KLQkgKiBAcmV0dXJuIHRoZSBjb2RlIG9mIHRoZSBidXR0b24gdGhhdCB3YXMgcHJlc3NlZCB0aGF0IHJlc3VsdGVkIGluIHRoaXMKLQkgKiAgICAgICAgIGRpYWxvZyBjbG9zaW5nLiBUaGlzIHdpbGwgYmUgPGNvZGU+RGlhbG9nLk9LPC9jb2RlPiBpZiB0aGUgT0sKLQkgKiAgICAgICAgIGJ1dHRvbiB3YXMgcHJlc3NlZCwgb3IgPGNvZGU+RGlhbG9nLkNBTkNFTDwvY29kZT4gaWYgdGhpcwotCSAqICAgICAgICAgZGlhbG9nJ3MgY2xvc2Ugd2luZG93IGRlY29yYXRpb24gb3IgdGhlIEVTQyBrZXkgd2FzIHVzZWQuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1cyNtYXRjaGVzKGludCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBvcGVuRXJyb3IoU2hlbGwgcGFyZW50U2hlbGwsIFN0cmluZyB0aXRsZSwKLQkJCVN0cmluZyBtZXNzYWdlLCBJU3RhdHVzIHN0YXR1cywgaW50IGRpc3BsYXlNYXNrKSB7Ci0JCUVycm9yRGlhbG9nTm9SZWFzb24gZGlhbG9nID0gbmV3IEVycm9yRGlhbG9nTm9SZWFzb24ocGFyZW50U2hlbGwsCi0JCQkJdGl0bGUsIG1lc3NhZ2UsIHN0YXR1cywgZGlzcGxheU1hc2spOwotCQlyZXR1cm4gZGlhbG9nLm9wZW4oKTsKLQl9Ci0KLQkvKioKLQkgKiBQb3B1bGF0ZXMgdGhlIGxpc3QgdXNpbmcgdGhpcyBlcnJvciBkaWFsb2cncyBzdGF0dXMgb2JqZWN0LiBUaGlzIHdhbGtzCi0JICogdGhlIGNoaWxkIHN0YXRpYyBvZiB0aGUgc3RhdHVzIG9iamVjdCBhbmQgZGlzcGxheXMgdGhlbSBpbiBhIGxpc3QuIFRoZQotCSAqIGZvcm1hdCBmb3IgZWFjaCBlbnRyeSBpcyBzdGF0dXNfcGF0aCA6IHN0YXR1c19tZXNzYWdlIElmIHRoZSBzdGF0dXMncwotCSAqIHBhdGggd2FzIG51bGwgdGhlbiBpdCAoYW5kIHRoZSBjb2xvbikgYXJlIG9taXR0ZWQuCi0JICogCi0JICogQHBhcmFtIGxpc3RUb1BvcHVsYXRlCi0JICogICAgICAgICAgICBUaGUgbGlzdCB0byBmaWxsLgotCSAqLwotCXByaXZhdGUgdm9pZCBwb3B1bGF0ZUxpc3QoTGlzdCBsaXN0VG9Qb3B1bGF0ZSkgewotCQlwb3B1bGF0ZUxpc3QobGlzdFRvUG9wdWxhdGUsIHN0YXR1cywgMCwKLQkJCQlzaG91bGRJbmNsdWRlVG9wTGV2ZWxFcnJvckluRGV0YWlscyk7Ci0JfQotCi0JLyoqCi0JICogUG9wdWxhdGUgdGhlIGxpc3Qgd2l0aCB0aGUgbWVzc2FnZXMgZnJvbSB0aGUgZ2l2ZW4gc3RhdHVzLiBUcmF2ZXJzZSB0aGUKLQkgKiBjaGlsZHJlbiBvZiB0aGUgc3RhdHVzIGRlZXBseSBhbmQgYWxzbyB0cmF2ZXJzZSBDb3JlRXhjZXB0aW9ucyB0aGF0Ci0JICogYXBwZWFyIGluIHRoZSBzdGF0dXMuCi0JICogCi0JICogQHBhcmFtIGxpc3RUb1BvcHVsYXRlCi0JICogICAgICAgICAgICB0aGUgbGlzdCB0byBwb3B1bGF0ZQotCSAqIEBwYXJhbSBidWlsZGluZ1N0YXR1cwotCSAqICAgICAgICAgICAgdGhlIHN0YXR1cyBiZWluZyBkaXNwbGF5ZWQKLQkgKiBAcGFyYW0gbmVzdGluZwotCSAqICAgICAgICAgICAgdGhlIG5lc3RpbmcgbGV2ZWwgKGluY3JlYXNlcyBvbmUgbGV2ZWwgZm9yIGVhY2ggbGV2ZWwgb2YKLQkgKiAgICAgICAgICAgIGNoaWxkcmVuKQotCSAqIEBwYXJhbSBpbmNsdWRlU3RhdHVzCi0JICogICAgICAgICAgICB3aGV0aGVyIHRvIGluY2x1ZGUgdGhlIGJ1aWxkaW5nU3RhdHVzIGluIHRoZSBkaXNwbGF5IG9yIGp1c3QKLQkgKiAgICAgICAgICAgIGl0cyBjaGlsZHJlbgotCSAqLwotCXByaXZhdGUgdm9pZCBwb3B1bGF0ZUxpc3QoTGlzdCBsaXN0VG9Qb3B1bGF0ZSwgSVN0YXR1cyBidWlsZGluZ1N0YXR1cywKLQkJCWludCBuZXN0aW5nLCBib29sZWFuIGluY2x1ZGVTdGF0dXMpIHsKLQotCQlpZiAoIWJ1aWxkaW5nU3RhdHVzLm1hdGNoZXMoZGlzcGxheU1hc2spKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlUaHJvd2FibGUgdCA9IGJ1aWxkaW5nU3RhdHVzLmdldEV4Y2VwdGlvbigpOwotCQlib29sZWFuIGlzQ29yZUV4Y2VwdGlvbiA9IHQgaW5zdGFuY2VvZiBDb3JlRXhjZXB0aW9uOwotCQlib29sZWFuIGluY3JlbWVudE5lc3RpbmcgPSBmYWxzZTsKLQotCQlpZiAoaW5jbHVkZVN0YXR1cykgewotCQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBuZXN0aW5nOyBpKyspIHsKLQkJCQlzYi5hcHBlbmQoTkVTVElOR19JTkRFTlQpOyAKLQkJCX0KLQkJCVN0cmluZyBtZXNzYWdlID0gYnVpbGRpbmdTdGF0dXMuZ2V0TWVzc2FnZSgpOwotCQkJc2IuYXBwZW5kKG1lc3NhZ2UpOwotCQkJbGlzdFRvUG9wdWxhdGUuYWRkKHNiLnRvU3RyaW5nKCkpOwotCQkJaW5jcmVtZW50TmVzdGluZyA9IHRydWU7Ci0JCX0KLQotCQlpZiAoIWlzQ29yZUV4Y2VwdGlvbiAmJiB0ICE9IG51bGwpIHsKLQkJCS8vIEluY2x1ZGUgbG93LWxldmVsIGV4Y2VwdGlvbiBtZXNzYWdlCi0JCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IG5lc3Rpbmc7IGkrKykgewotCQkJCXNiLmFwcGVuZChORVNUSU5HX0lOREVOVCk7IAotCQkJfQotCQkJU3RyaW5nIG1lc3NhZ2UgPSB0LmdldExvY2FsaXplZE1lc3NhZ2UoKTsKLQkJCWlmIChtZXNzYWdlID09IG51bGwpCi0JCQkJbWVzc2FnZSA9IHQudG9TdHJpbmcoKTsKLQotCQkJc2IuYXBwZW5kKG1lc3NhZ2UpOwotCQkJbGlzdFRvUG9wdWxhdGUuYWRkKHNiLnRvU3RyaW5nKCkpOwotCQkJaW5jcmVtZW50TmVzdGluZyA9IHRydWU7Ci0JCX0KLQotCQlpZiAoaW5jcmVtZW50TmVzdGluZykKLQkJCW5lc3RpbmcrKzsKLQotCQkvLyBMb29rIGZvciBhIG5lc3RlZCBjb3JlIGV4Y2VwdGlvbgotCQlpZiAoaXNDb3JlRXhjZXB0aW9uKSB7Ci0JCQlDb3JlRXhjZXB0aW9uIGNlID0gKENvcmVFeGNlcHRpb24pIHQ7Ci0JCQlJU3RhdHVzIGVTdGF0dXMgPSBjZS5nZXRTdGF0dXMoKTsKLQkJCS8vIE9ubHkgcHJpbnQgdGhlIGV4Y2VwdGlvbiBtZXNzYWdlIGlmIGl0IGlzIG5vdCBjb250YWluZWQgaW4gdGhlCi0JCQkvLyBwYXJlbnQgbWVzc2FnZQotCQkJaWYgKG1lc3NhZ2UgPT0gbnVsbCB8fCBtZXNzYWdlLmluZGV4T2YoZVN0YXR1cy5nZXRNZXNzYWdlKCkpID09IC0xKSB7Ci0JCQkJcG9wdWxhdGVMaXN0KGxpc3RUb1BvcHVsYXRlLCBlU3RhdHVzLCBuZXN0aW5nLCB0cnVlKTsKLQkJCX0KLQkJfQotCi0JCS8vIExvb2sgZm9yIGNoaWxkIHN0YXR1cwotCQlJU3RhdHVzW10gY2hpbGRyZW4gPSBidWlsZGluZ1N0YXR1cy5nZXRDaGlsZHJlbigpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7Ci0JCQlwb3B1bGF0ZUxpc3QobGlzdFRvUG9wdWxhdGUsIGNoaWxkcmVuW2ldLCBuZXN0aW5nLCB0cnVlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgZ2l2ZW4gc3RhdHVzIG9iamVjdCBzaG91bGQgYmUgZGlzcGxheWVkLgotCSAqIAotCSAqIEBwYXJhbSBzdGF0dXMKLQkgKiAgICAgICAgICAgIGEgc3RhdHVzIG9iamVjdAotCSAqIEBwYXJhbSBtYXNrCi0JICogICAgICAgICAgICBhIG1hc2sgYXMgcGVyIDxjb2RlPklTdGF0dXMubWF0Y2hlczwvY29kZT4KLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBnaXZlbiBzdGF0dXMgc2hvdWxkIGJlIGRpc3BsYXllZCwgYW5kCi0JICogICAgICAgICA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1cyNtYXRjaGVzKGludCkKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGJvb2xlYW4gc2hvdWxkRGlzcGxheShJU3RhdHVzIHN0YXR1cywgaW50IG1hc2spIHsKLQkJSVN0YXR1c1tdIGNoaWxkcmVuID0gc3RhdHVzLmdldENoaWxkcmVuKCk7Ci0JCWlmIChjaGlsZHJlbiA9PSBudWxsIHx8IGNoaWxkcmVuLmxlbmd0aCA9PSAwKSB7Ci0JCQlyZXR1cm4gc3RhdHVzLm1hdGNoZXMobWFzayk7Ci0JCX0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgewotCQkJaWYgKGNoaWxkcmVuW2ldLm1hdGNoZXMobWFzaykpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFRvZ2dsZXMgdGhlIHVuZm9sZGluZyBvZiB0aGUgZGV0YWlscyBhcmVhLiBUaGlzIGlzIHRyaWdnZXJlZCBieSB0aGUgdXNlcgotCSAqIHByZXNzaW5nIHRoZSBkZXRhaWxzIGJ1dHRvbi4KLQkgKi8KLQlwcml2YXRlIHZvaWQgdG9nZ2xlRGV0YWlsc0FyZWEoKSB7Ci0JCVBvaW50IHdpbmRvd1NpemUgPSBnZXRTaGVsbCgpLmdldFNpemUoKTsKLQkJUG9pbnQgb2xkU2l6ZSA9IGdldFNoZWxsKCkuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKTsKLQkJaWYgKGxpc3RDcmVhdGVkKSB7Ci0JCQlsaXN0LmRpc3Bvc2UoKTsKLQkJCWxpc3RDcmVhdGVkID0gZmFsc2U7Ci0JCQlkZXRhaWxzQnV0dG9uLnNldFRleHQoSURpYWxvZ0NvbnN0YW50cy5TSE9XX0RFVEFJTFNfTEFCRUwpOwotCQl9IGVsc2UgewotCQkJbGlzdCA9IGNyZWF0ZURyb3BEb3duTGlzdCgoQ29tcG9zaXRlKSBnZXRDb250ZW50cygpKTsKLQkJCWRldGFpbHNCdXR0b24uc2V0VGV4dChJRGlhbG9nQ29uc3RhbnRzLkhJREVfREVUQUlMU19MQUJFTCk7Ci0JCX0KLQkJUG9pbnQgbmV3U2l6ZSA9IGdldFNoZWxsKCkuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKTsKLQkJZ2V0U2hlbGwoKQotCQkJCS5zZXRTaXplKAotCQkJCQkJbmV3IFBvaW50KHdpbmRvd1NpemUueCwgd2luZG93U2l6ZS55Ci0JCQkJCQkJCSsgKG5ld1NpemUueSAtIG9sZFNpemUueSkpKTsKLQl9Ci0KLQkvKioKLQkgKiBQdXQgdGhlIGRldGFpbHMgb2YgdGhlIHN0YXR1cyBvZiB0aGUgZXJyb3Igb250byB0aGUgc3RyZWFtLgotCSAqIAotCSAqIEBwYXJhbSBidWlsZGluZ1N0YXR1cwotCSAqIEBwYXJhbSBidWZmZXIKLQkgKiBAcGFyYW0gbmVzdGluZwotCSAqLwotCXByaXZhdGUgdm9pZCBwb3B1bGF0ZUNvcHlCdWZmZXIoSVN0YXR1cyBidWlsZGluZ1N0YXR1cywKLQkJCVN0cmluZ0J1ZmZlciBidWZmZXIsIGludCBuZXN0aW5nKSB7Ci0JCWlmICghYnVpbGRpbmdTdGF0dXMubWF0Y2hlcyhkaXNwbGF5TWFzaykpIHsKLQkJCXJldHVybjsKLQkJfQotCQlmb3IgKGludCBpID0gMDsgaSA8IG5lc3Rpbmc7IGkrKykgewotCQkJYnVmZmVyLmFwcGVuZChORVNUSU5HX0lOREVOVCk7IAotCQl9Ci0JCWJ1ZmZlci5hcHBlbmQoYnVpbGRpbmdTdGF0dXMuZ2V0TWVzc2FnZSgpKTsKLQkJYnVmZmVyLmFwcGVuZCgiXG4iKTsgLy8kTk9OLU5MUy0xJAotCi0JCS8vIExvb2sgZm9yIGEgbmVzdGVkIGNvcmUgZXhjZXB0aW9uCi0JCVRocm93YWJsZSB0ID0gYnVpbGRpbmdTdGF0dXMuZ2V0RXhjZXB0aW9uKCk7Ci0JCWlmICh0IGluc3RhbmNlb2YgQ29yZUV4Y2VwdGlvbikgewotCQkJQ29yZUV4Y2VwdGlvbiBjZSA9IChDb3JlRXhjZXB0aW9uKSB0OwotCQkJcG9wdWxhdGVDb3B5QnVmZmVyKGNlLmdldFN0YXR1cygpLCBidWZmZXIsIG5lc3RpbmcgKyAxKTsKLQkJfQotCi0JCUlTdGF0dXNbXSBjaGlsZHJlbiA9IGJ1aWxkaW5nU3RhdHVzLmdldENoaWxkcmVuKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKLQkJCXBvcHVsYXRlQ29weUJ1ZmZlcihjaGlsZHJlbltpXSwgYnVmZmVyLCBuZXN0aW5nICsgMSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDb3B5IHRoZSBjb250ZW50cyBvZiB0aGUgc3RhdHVzZXMgdG8gdGhlIGNsaXBib2FyZC4KLQkgKi8KLQlwcml2YXRlIHZvaWQgY29weVRvQ2xpcGJvYXJkKCkgewotCQlpZiAoY2xpcGJvYXJkICE9IG51bGwpCi0JCQljbGlwYm9hcmQuZGlzcG9zZSgpOwotCQlTdHJpbmdCdWZmZXIgc3RhdHVzQnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlwb3B1bGF0ZUNvcHlCdWZmZXIoc3RhdHVzLCBzdGF0dXNCdWZmZXIsIDApOwotCQljbGlwYm9hcmQgPSBuZXcgQ2xpcGJvYXJkKGxpc3QuZ2V0RGlzcGxheSgpKTsKLQkJY2xpcGJvYXJkLnNldENvbnRlbnRzKG5ldyBPYmplY3RbXSB7IHN0YXR1c0J1ZmZlci50b1N0cmluZygpIH0sCi0JCQkJbmV3IFRyYW5zZmVyW10geyBUZXh0VHJhbnNmZXIuZ2V0SW5zdGFuY2UoKSB9KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3cjY2xvc2UoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGNsb3NlKCkgewotCQlpZiAoY2xpcGJvYXJkICE9IG51bGwpCi0JCQljbGlwYm9hcmQuZGlzcG9zZSgpOwotCQlyZXR1cm4gc3VwZXIuY2xvc2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBTaG93IHRoZSBkZXRhaWxzIHBvcnRpb24gb2YgdGhlIGRpYWxvZyBpZiBpdCBpcyBub3QgYWxyZWFkeSB2aXNpYmxlLiBUaGlzCi0JICogbWV0aG9kIHdpbGwgb25seSB3b3JrIHdoZW4gaXQgaXMgaW52b2tlZCBhZnRlciB0aGUgY29udHJvbCBvZiB0aGUgZGlhbG9nCi0JICogaGFzIGJlZW4gc2V0LiBJbiBvdGhlciB3b3JkcywgYWZ0ZXIgdGhlIDxjb2RlPmNyZWF0ZUNvbnRlbnRzPC9jb2RlPgotCSAqIG1ldGhvZCBoYXMgYmVlbiBpbnZva2VkIGFuZCBoYXMgcmV0dXJuZWQgdGhlIGNvbnRyb2wgZm9yIHRoZSBjb250ZW50IGFyZWEKLQkgKiBvZiB0aGUgZGlhbG9nLiBJbnZva2luZyB0aGUgbWV0aG9kIGJlZm9yZSB0aGUgY29udGVudCBhcmVhIGhhcyBiZWVuIHNldAotCSAqIG9yIGFmdGVyIHRoZSBkaWFsb2cgaGFzIGJlZW4gZGlzcG9zZWQgd2lsbCBoYXZlIG5vIGVmZmVjdC4KLQkgKiAKLQkgKiBAc2luY2UgMy4xCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgc2hvd0RldGFpbHNBcmVhKCkgewotCQlpZiAoIWxpc3RDcmVhdGVkKSB7Ci0JCQlDb250cm9sIGNvbnRyb2wgPSBnZXRDb250ZW50cygpOwotCQkJaWYgKGNvbnRyb2wgIT0gbnVsbCAmJiAhY29udHJvbC5pc0Rpc3Bvc2VkKCkpCi0JCQkJdG9nZ2xlRGV0YWlsc0FyZWEoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBEZXRhaWxzIGJ1dHRvbiBzaG91bGQgYmUgaW5jbHVkZWQuIFRoaXMgbWV0aG9kIGlzCi0JICogaW52b2tlZCBvbmNlIHdoZW4gdGhlIGRpYWxvZyBpcyBidWlsdC4gQnkgZGVmYXVsdCwgdGhlIERldGFpbHMgYnV0dG9uIGlzCi0JICogb25seSBpbmNsdWRlZCBpZiB0aGUgc3RhdHVzIHVzZWQgd2hlbiBjcmVhdGluZyB0aGUgZGlhbG9nIHdhcyBhCi0JICogbXVsdGktc3RhdHVzIG9yIGlmIHRoZSBzdGF0dXMgY29udGFpbnMgYW4gZXhjZXB0aW9uLiBTdWJjbGFzc2VzIG1heQotCSAqIG92ZXJyaWRlLgotCSAqIAotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgRGV0YWlscyBidXR0b24gc2hvdWxkIGJlIGluY2x1ZGVkCi0JICogQHNpbmNlIDMuMQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHNob3VsZFNob3dEZXRhaWxzQnV0dG9uKCkgewotCQlyZXR1cm4gc3RhdHVzLmlzTXVsdGlTdGF0dXMoKSB8fCBzdGF0dXMuZ2V0RXhjZXB0aW9uKCkgIT0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIHN0YXR1cyBkaXNwbGF5ZWQgYnkgdGhpcyBlcnJvciBkaWFsb2cgdG8gdGhlIGdpdmVuIHN0YXR1cy4gVGhpcwotCSAqIG9ubHkgYWZmZWN0cyB0aGUgc3RhdHVzIGRpc3BsYXllZCBieSB0aGUgRGV0YWlscyBsaXN0LiBUaGUgbWVzc2FnZSwgaW1hZ2UKLQkgKiBhbmQgdGl0bGUgc2hvdWxkIGJlIHVwZGF0ZWQgYnkgdGhlIHN1YmNsYXNzLCBpZiBkZXNpcmVkLgotCSAqIAotCSAqIEBwYXJhbSBzdGF0dXMKLQkgKiAgICAgICAgICAgIHRoZSBzdGF0dXMgdG8gYmUgZGlzcGxheWVkIGluIHRoZSBkZXRhaWxzIGxpc3QKLQkgKiBAc2luY2UgMy4xCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgc2V0U3RhdHVzKElTdGF0dXMgc3RhdHVzKSB7Ci0JCWlmICh0aGlzLnN0YXR1cyAhPSBzdGF0dXMpIHsKLQkJCXRoaXMuc3RhdHVzID0gc3RhdHVzOwotCQl9Ci0JCXNob3VsZEluY2x1ZGVUb3BMZXZlbEVycm9ySW5EZXRhaWxzID0gdHJ1ZTsKLQkJaWYgKGxpc3RDcmVhdGVkKSB7Ci0JCQlyZXBvcHVsYXRlTGlzdCgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVwb3B1bGF0ZSB0aGUgc3VwcGxpZWQgbGlzdCB3aWRnZXQuCi0JICovCi0JcHJpdmF0ZSB2b2lkIHJlcG9wdWxhdGVMaXN0KCkgewotCQlpZiAobGlzdCAhPSBudWxsICYmICFsaXN0LmlzRGlzcG9zZWQoKSkgewotCQkJbGlzdC5yZW1vdmVBbGwoKTsKLQkJCXBvcHVsYXRlTGlzdChsaXN0KTsKLQkJfQotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vdWkvdXRpbC9NZW51VXRpbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi91aS91dGlsL01lbnVVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1OGE2NjEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi91aS91dGlsL01lbnVVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5NZW51SXRlbTsKLQotLyoqCi0gKiBBIGhlbHBlciBjbGFzcyBmb3IgcmV0cmlldmluZyBFY2xpcHNlIG1lbnVzLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIE1lbnVVdGlsIHsKLQotCS8qKgotCSAqIFNlYXJjaGVzIGFuIGFycmF5IG9mIG1lbnUgaXRlbXMgYW5kIHJldHVybnMgdGhlIG1lbnUgaXRlbSB0aGF0IG1hdGNoZXMKLQkgKiB0aGUgZ2l2ZW4gbWVudSB0ZXh0LgotCSAqIAotCSAqIEBwYXJhbSBtZW51SXRlbXMKLQkgKiAgICAgICAgICAgIEFuIGFycmF5IG9mIG1lbnUgaXRlbXMuCi0JICogQHBhcmFtIHRleHQKLQkgKiAgICAgICAgICAgIFRoZSB0ZXh0IHRvIGxvb2sgZm9yLgotCSAqIEByZXR1cm4gVGhlIG1lbnUgaXRlbSBpZiBmb3VuZCwgPGNvZGU+bnVsbDwvY29kZT4gb3RoZXJ3aXNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTWVudUl0ZW0gZ2V0TWVudUl0ZW0oTWVudUl0ZW1bXSBtZW51SXRlbXMsIFN0cmluZyB0ZXh0KSB7Ci0JCWlmIChtZW51SXRlbXMgPT0gbnVsbCB8fCB0ZXh0ID09IG51bGwgfHwgdGV4dC5sZW5ndGgoKSA9PSAwKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgbWVudUl0ZW1zLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAobWVudUl0ZW1zW2ldLmdldFRleHQoKS5zdGFydHNXaXRoKHRleHQpKSB7Ci0JCQkJcmV0dXJuIG1lbnVJdGVtc1tpXTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi91aS91dGlsL01zZ0JveC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi91aS91dGlsL01zZ0JveC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYzc5ZWIzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vdWkvdXRpbC9Nc2dCb3guamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTWVzc2FnZUJveDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLQotLyoqCi0gKiBIZWxwZXIgY2xhc3MgdG8gZGlzcGxheSBhIG1lc3NhZ2UgYm94LgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBNc2dCb3ggewotCS8qKgotCSAqIFVzZSB0aGlzIG1ldGhvZCB0byBzaG93IGVycm9yIG1lc3NhZ2UgaWYgeW91IGRvbid0IHdhbnQgbG9uZyBwYXRoIHRvIGJlCi0JICogY3V0IG9mZi4KLQkgKiAKLQkgKiBAcGFyYW0gbXNnCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCB2b2lkIG5hdGl2ZVNob3dFcnJvcihTaGVsbCBzaGVsbCwgU3RyaW5nIG1zZykgewotCQlpZiAoc2hlbGwgPT0gbnVsbCkgewotCQkJc2hlbGwgPSBnZXREZWZhdWx0U2hlbGwoKTsKLQkJCWlmIChzaGVsbCA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCU1lc3NhZ2VCb3ggbXNnQm94ID0gbmV3IE1lc3NhZ2VCb3goc2hlbGwsIFNXVC5PSyB8IFNXVC5JQ09OX0VSUk9SKTsKLQkJbXNnQm94LnNldE1lc3NhZ2UobXNnKTsKLQkJbXNnQm94LnNldFRleHQoc2hlbGwuZ2V0VGV4dCgpKTsKLQkJbXNnQm94Lm9wZW4oKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIHZvaWQgc2hvd0Vycm9yKFN0cmluZyBtc2cpIHsKLQkJc2hvd0Vycm9yKGdldERlZmF1bHRTaGVsbCgpLCBtc2cpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgdm9pZCBzaG93RXJyb3IoU2hlbGwgc2hlbGwsIFN0cmluZyBtc2cpIHsKLQkJV3JhcHBlZE1lc3NhZ2VEaWFsb2cub3BlbkVycm9yKHNoZWxsLCBzaGVsbCA9PSBudWxsID8gbnVsbCA6IHNoZWxsCi0JCQkJLmdldFRleHQoKSwgbXNnKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIHZvaWQgc2hvd1dhcm5pbmcoU3RyaW5nIG1zZykgewotCQlzaG93V2FybmluZyhnZXREZWZhdWx0U2hlbGwoKSwgbXNnKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIHZvaWQgc2hvd1dhcm5pbmcoU2hlbGwgc2hlbGwsIFN0cmluZyBtc2cpIHsKLQkJV3JhcHBlZE1lc3NhZ2VEaWFsb2cub3Blbldhcm5pbmcoc2hlbGwsIHNoZWxsID09IG51bGwgPyBudWxsIDogc2hlbGwKLQkJCQkuZ2V0VGV4dCgpLCBtc2cpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU2hlbGwgZ2V0RGVmYXVsdFNoZWxsKCkgewotCQl0cnkgewotCQkJRGlzcGxheSBkID0gRGlzcGxheS5nZXRDdXJyZW50KCk7Ci0JCQlpZiAoZCA9PSBudWxsKSB7Ci0JCQkJZCA9IERpc3BsYXkuZ2V0RGVmYXVsdCgpOwotCQkJfQotCi0JCQlTaGVsbCBzID0gbnVsbDsKLQkJCWlmIChkICE9IG51bGwpIHsKLQkJCQlzID0gZC5nZXRBY3RpdmVTaGVsbCgpOwotCQkJfQotCi0JCQlyZXR1cm4gczsKLQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgRGlzcGxheSBnZXREaXNwbGF5KCkgewotCQl0cnkgewotCQkJRGlzcGxheSBkID0gRGlzcGxheS5nZXRDdXJyZW50KCk7Ci0JCQlpZiAoZCA9PSBudWxsKSB7Ci0JCQkJZCA9IERpc3BsYXkuZ2V0RGVmYXVsdCgpOwotCQkJfQotCi0JCQlyZXR1cm4gZDsKLQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHByb21wdChTdHJpbmcgbXNnKSB7Ci0JCXJldHVybiBwcm9tcHQoZ2V0RGVmYXVsdFNoZWxsKCksIG1zZyk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcHJvbXB0KFNoZWxsIHNoZWxsLCBTdHJpbmcgbXNnKSB7Ci0JCXJldHVybiBwcm9tcHQoc2hlbGwsIG51bGwsIG1zZywgU1dULllFUyB8IFNXVC5OTyB8IFNXVC5DQU5DRUwpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHByb21wdChTdHJpbmcgbXNnLCBpbnQgYnV0dG9ucykgewotCQlyZXR1cm4gcHJvbXB0KGdldERlZmF1bHRTaGVsbCgpLCBudWxsLCBtc2csIGJ1dHRvbnMpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHByb21wdChTdHJpbmcgdGl0bGUsIFN0cmluZyBtc2csIGludCBidXR0b25zKSB7Ci0JCXJldHVybiBwcm9tcHQoZ2V0RGVmYXVsdFNoZWxsKCksIHRpdGxlLCBtc2csIGJ1dHRvbnMpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHByb21wdChTaGVsbCBzaGVsbCwgU3RyaW5nIG1zZywgaW50IGJ1dHRvbnMpIHsKLQkJcmV0dXJuIHByb21wdChzaGVsbCwgbnVsbCwgbXNnLCBidXR0b25zKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBwcm9tcHQoU2hlbGwgc2hlbGwsIFN0cmluZyB0aXRsZSwgU3RyaW5nIG1zZywKLQkJCWludCBidXR0b25zKSB7Ci0JCU1lc3NhZ2VCb3ggbXNnQm94ID0gbmV3IE1lc3NhZ2VCb3goc2hlbGwsIGJ1dHRvbnMgfCBTV1QuSUNPTl9RVUVTVElPTik7Ci0JCW1zZ0JveC5zZXRUZXh0KHRpdGxlICE9IG51bGwgJiYgdGl0bGUubGVuZ3RoKCkgPiAwID8gdGl0bGUgOiBzaGVsbAotCQkJCS5nZXRUZXh0KCkpOwotCQltc2dCb3guc2V0TWVzc2FnZShtc2cpOwotCQlyZXR1cm4gbXNnQm94Lm9wZW4oKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vdWkvdXRpbC9Nc2dEaWFsb2cuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vdWkvdXRpbC9Nc2dEaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGJmZTBhYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3VpL3V0aWwvTXNnRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MTcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk11bHRpU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5JQWN0aXZhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24uc2VydmljZWFiaWxpdHkuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRXJyb3JEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotCi0vKioKLSAqIEEgbWVzc2FnZSBkaWFsb2cgdXNlZCBmb3IgZGlzcGxheWluZyBlcnJvciwgd2FybmluZywgY29uZmlybWF0aW9uIG9yCi0gKiBpbmZvcm1hdGlvbmFsIG1lc3NhZ2VzLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTXNnRGlhbG9nIHsKLQotCS8vIFRoZSBwbHVnLWluIElELgotCXByaXZhdGUgU3RyaW5nIHBsdWdpbklkOwotCi0JLy8gVGhlIHBsdWctaW4gbG9nZ2VyLgotCXByaXZhdGUgTG9nZ2VyIGxvZ2dlcjsKLQkKLQkvKioKLQkgKiBDcmVhdGUgYSBuZXcgaW5zdGFuY2UgZ2l2ZW4gdGhlIHBsdWctaW4gaW5zdGFuY2UuCi0JICogCi0JICogQHBhcmFtIHBsdWdpbgotCSAqICAgICAgICAgICAgVGhlIHBsdWdpbiBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgTXNnRGlhbG9nKElBY3RpdmF0b3IgcGx1Z2luKSB7Ci0JCXRoaXMucGx1Z2luSWQgPSBwbHVnaW4uZ2V0SWQoKTsKLQkJdGhpcy5sb2dnZXIgPSBwbHVnaW4uZ2V0TG9nZ2VyKCk7Ci0JfQotCQkKLQlwcm90ZWN0ZWQgU2hlbGwgZ2V0U2hlbGwoKSB7Ci0JCXJldHVybiBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldERpc3BsYXkoKS5nZXRBY3RpdmVTaGVsbCgpOwotCX0KLQotCS8qKgotCSAqIERpc3BsYXlzIHRoZSBnaXZlbiBlcnJvciBtZXNzYWdlIGluIGFuIGVycm9yIGRpYWxvZyB3aXRob3V0IHRoZSBlcnJvcgotCSAqIHJlYXNvbiBhbmQgRGV0YWlscyBidXR0b24uCi0JICogPHA+Ci0JICogTm90ZTogVGhlIGVycm9yIG1lc3NhZ2Ugd2lsbCBiZSB3cml0dGVuIHRvIHRoZSBsb2cgZmlsZS4KLQkgKiAKLQkgKiBAcGFyYW0gdGl0bGUKLQkgKiAgICAgICAgICAgIFRoZSB0aXRsZSBmb3IgdGhlIGVycm9yIGRpYWxvZy4KLQkgKiBAcGFyYW0gbXNnCi0JICogICAgICAgICAgICBUaGUgZXJyb3IgbWVzc2FnZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwbGF5RXJyb3IoU3RyaW5nIHRpdGxlLCBTdHJpbmcgbXNnKSB7Ci0JCWRpc3BsYXkoSVN0YXR1cy5FUlJPUiwgdGl0bGUsIG1zZywgbnVsbCwgbnVsbCwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogRGlzcGxheXMgdGhlIGdpdmVuIGVycm9yIG1lc3NhZ2UgaW4gYW4gZXJyb3IgZGlhbG9nIHdpdGhvdXQgdGhlIGVycm9yCi0JICogcmVhc29uIGFuZCBEZXRhaWxzIGJ1dHRvbi4KLQkgKiA8cD4KLQkgKiBOb3RlOiBUaGUgZXJyb3IgbWVzc2FnZSBhbmQgdGhlIGV4Y2VwdGlvbiBzdGFjayB0cmFjZSB3aWxsIGJlIHdyaXR0ZW4gdG8KLQkgKiB0aGUgbG9nIGZpbGUuCi0JICogCi0JICogQHBhcmFtIHRpdGxlCi0JICogICAgICAgICAgICBUaGUgdGl0bGUgZm9yIHRoZSBlcnJvciBkaWFsb2cuCi0JICogQHBhcmFtIG1zZwotCSAqICAgICAgICAgICAgVGhlIGVycm9yIG1lc3NhZ2UuCi0JICogQHBhcmFtIGV4Ci0JICogICAgICAgICAgICBUaGUgZXhjZXB0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUgZXJyb3IuCi0JICovCi0JcHVibGljIHZvaWQgZGlzcGxheUVycm9yKFN0cmluZyB0aXRsZSwgU3RyaW5nIG1zZywgVGhyb3dhYmxlIGV4KSB7Ci0JCWRpc3BsYXkoSVN0YXR1cy5FUlJPUiwgdGl0bGUsIG1zZywgbnVsbCwgbnVsbCwgZXgpOwotCX0KLQotCS8qKgotCSAqIERpc3BsYXlzIHRoZSBnaXZlbiBlcnJvciBtZXNzYWdlIGluIGFuIGVycm9yIGRpYWxvZyB3aXRob3V0IHRoZSBEZXRhaWxzCi0JICogYnV0dG9uLgotCSAqIDxwPgotCSAqIE5vdGU6IFRoZSBlcnJvciBtZXNzYWdlIHdpbGwgYmUgd3JpdHRlbiB0byB0aGUgbG9nIGZpbGUuCi0JICogCi0JICogQHBhcmFtIHRpdGxlCi0JICogICAgICAgICAgICBUaGUgdGl0bGUgZm9yIHRoZSBlcnJvciBkaWFsb2cuCi0JICogQHBhcmFtIG1zZwotCSAqICAgICAgICAgICAgVGhlIGVycm9yIG1lc3NhZ2UuCi0JICogQHBhcmFtIHJlYXNvbgotCSAqICAgICAgICAgICAgVGhlIHJlYXNvbiBmb3IgdGhlIGVycm9yLgotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3BsYXlFcnJvcihTdHJpbmcgdGl0bGUsIFN0cmluZyBtc2csIFN0cmluZyByZWFzb24pIHsKLQkJZGlzcGxheShJU3RhdHVzLkVSUk9SLCB0aXRsZSwgbXNnLCByZWFzb24sIG51bGwsIG51bGwpOwotCX0KLQotCS8qKgotCSAqIERpc3BsYXlzIHRoZSBnaXZlbiBlcnJvciBtZXNzYWdlIGluIGFuIGVycm9yIGRpYWxvZyB3aXRob3V0IHRoZSBEZXRhaWxzCi0JICogYnV0dG9uLgotCSAqIDxwPgotCSAqIE5vdGU6IFRoZSBlcnJvciBtZXNzYWdlIGFuZCB0aGUgZXhjZXB0aW9uIHN0YWNrIHRyYWNlIHdpbGwgYmUgd3JpdHRlbiB0bwotCSAqIHRoZSBsb2cgZmlsZS4KLQkgKiAKLQkgKiBAcGFyYW0gdGl0bGUKLQkgKiAgICAgICAgICAgIFRoZSB0aXRsZSBmb3IgdGhlIGVycm9yIGRpYWxvZy4KLQkgKiBAcGFyYW0gbXNnCi0JICogICAgICAgICAgICBUaGUgZXJyb3IgbWVzc2FnZS4KLQkgKiBAcGFyYW0gcmVhc29uCi0JICogICAgICAgICAgICBUaGUgcmVhc29uIGZvciB0aGUgZXJyb3IuCi0JICogQHBhcmFtIGV4Ci0JICogICAgICAgICAgICBUaGUgZXhjZXB0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUgZXJyb3IuCi0JICovCi0JcHVibGljIHZvaWQgZGlzcGxheUVycm9yKFN0cmluZyB0aXRsZSwgU3RyaW5nIG1zZywgU3RyaW5nIHJlYXNvbiwKLQkJCVRocm93YWJsZSBleCkgewotCQlkaXNwbGF5KElTdGF0dXMuRVJST1IsIHRpdGxlLCBtc2csIHJlYXNvbiwgbnVsbCwgZXgpOwotCX0KLQotCS8qKgotCSAqIERpc3BsYXlzIHRoZSBnaXZlbiBlcnJvciBtZXNzYWdlIGluIGFuIGVycm9yIGRpYWxvZy4gVGhlIERldGFpbHMgYnV0dG9uCi0JICogd2lsbCBiZSBkaXNwbGF5ZWQgaWYgdGhlIDxjb2RlPmRldGFpbHM8L2NvZGU+IHBhcmFtZXRlciBpdCBub3QgbnVsbCBvcgotCSAqIGVtcHR5LgotCSAqIDxwPgotCSAqIE5vdGU6IFRoZSBlcnJvciBtZXNzYWdlIHdpbGwgYmUgd3JpdHRlbiB0byB0aGUgbG9nIGZpbGUuCi0JICogCi0JICogQHBhcmFtIHRpdGxlCi0JICogICAgICAgICAgICBUaGUgdGl0bGUgZm9yIHRoZSBlcnJvciBkaWFsb2cuCi0JICogQHBhcmFtIG1zZwotCSAqICAgICAgICAgICAgVGhlIGVycm9yIG1lc3NhZ2UuCi0JICogQHBhcmFtIHJlYXNvbgotCSAqICAgICAgICAgICAgVGhlIHJlYXNvbiBmb3IgdGhlIGVycm9yLgotCSAqIEBwYXJhbSBkZXRhaWxzCi0JICogICAgICAgICAgICBUaGUgZXJyb3IgZGV0YWlscy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwbGF5RXJyb3IoU3RyaW5nIHRpdGxlLCBTdHJpbmcgbXNnLCBTdHJpbmcgcmVhc29uLAotCQkJU3RyaW5nIGRldGFpbHMpIHsKLQkJZGlzcGxheShJU3RhdHVzLkVSUk9SLCB0aXRsZSwgbXNnLCByZWFzb24sIGRldGFpbHMsIG51bGwpOwotCX0KLQotCS8qKgotCSAqIERpc3BsYXlzIHRoZSBnaXZlbiBlcnJvciBtZXNzYWdlIGluIGFuIGVycm9yIGRpYWxvZy4gVGhlIERldGFpbHMgYnV0dG9uCi0JICogd2lsbCBiZSBkaXNwbGF5ZWQgaWYgdGhlIDxjb2RlPmRldGFpbHM8L2NvZGU+IHBhcmFtZXRlciBpdCBub3QgbnVsbCBvcgotCSAqIGVtcHR5LgotCSAqIDxwPgotCSAqIE5vdGU6IFRoZSBlcnJvciBtZXNzYWdlIGFuZCB0aGUgZXhjZXB0aW9uIHN0YWNrIHRyYWNlIHdpbGwgYmUgd3JpdHRlbiB0bwotCSAqIHRoZSBsb2cgZmlsZS4KLQkgKiAKLQkgKiBAcGFyYW0gdGl0bGUKLQkgKiAgICAgICAgICAgIFRoZSB0aXRsZSBmb3IgdGhlIGVycm9yIGRpYWxvZy4KLQkgKiBAcGFyYW0gbXNnCi0JICogICAgICAgICAgICBUaGUgZXJyb3IgbWVzc2FnZS4KLQkgKiBAcGFyYW0gcmVhc29uCi0JICogICAgICAgICAgICBUaGUgcmVhc29uIGZvciB0aGUgZXJyb3IuCi0JICogQHBhcmFtIGRldGFpbHMKLQkgKiAgICAgICAgICAgIFRoZSBlcnJvciBkZXRhaWxzLgotCSAqIEBwYXJhbSBleAotCSAqICAgICAgICAgICAgVGhlIGV4Y2VwdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhlIGVycm9yLgotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3BsYXlFcnJvcihTdHJpbmcgdGl0bGUsIFN0cmluZyBtc2csIFN0cmluZyByZWFzb24sCi0JCQlTdHJpbmcgZGV0YWlscywgVGhyb3dhYmxlIGV4KSB7Ci0JCWRpc3BsYXkoSVN0YXR1cy5FUlJPUiwgdGl0bGUsIG1zZywgcmVhc29uLCBkZXRhaWxzLCBleCk7Ci0JfQotCi0JLyoqCi0JICogRGlzcGxheXMgdGhlIGdpdmVuIGVycm9yIHN0YXR1cyBpbiBhbiBlcnJvciBkaWFsb2cuCi0JICogPHA+Ci0JICogTm90ZTogVGhlIGVycm9yIG1lc3NhZ2UgYW5kIHRoZSBleGNlcHRpb24gc3RhY2sgdHJhY2Ugd2lsbCBiZSB3cml0dGVuIHRvCi0JICogdGhlIGxvZyBmaWxlLgotCSAqIAotCSAqIEBwYXJhbSB0aXRsZQotCSAqICAgICAgICAgICAgVGhlIHRpdGxlIGZvciB0aGUgZXJyb3IgZGlhbG9nLgotCSAqIEBwYXJhbSBzdGF0dXMKLQkgKiAgICAgICAgICAgIFRoZSBlcnJvciBzdGF0dXMuCi0JICovCi0JcHVibGljIGludCBkaXNwbGF5RXJyb3IoU3RyaW5nIHRpdGxlLCBJU3RhdHVzIHN0YXR1cykgewotCQlyZXR1cm4gZGlzcGxheSh0aXRsZSwgbnVsbCwgc3RhdHVzKTsKLQl9Ci0KLQkvKioKLQkgKiBEaXNwbGF5cyB0aGUgZ2l2ZW4gZXJyb3Igc3RhdHVzIGluIGFuIGVycm9yIGRpYWxvZy4KLQkgKiA8cD4KLQkgKiBOb3RlOiBUaGUgZXJyb3IgbWVzc2FnZSBhbmQgdGhlIGV4Y2VwdGlvbiBzdGFjayB0cmFjZSB3aWxsIGJlIHdyaXR0ZW4gdG8KLQkgKiB0aGUgbG9nIGZpbGUuCi0JICogCi0JICogQHBhcmFtIHRpdGxlCi0JICogICAgICAgICAgICBUaGUgdGl0bGUgZm9yIHRoZSBlcnJvciBkaWFsb2cuCi0JICogQHBhcmFtIG1zZwotCSAqICAgICAgICAgICAgVGhlIGVycm9yIG1lc3NhZ2UuCi0JICogQHBhcmFtIHN0YXR1cwotCSAqICAgICAgICAgICAgVGhlIGVycm9yIHN0YXR1cy4KLQkgKi8KLQlwdWJsaWMgaW50IGRpc3BsYXlFcnJvcihTdHJpbmcgdGl0bGUsIFN0cmluZyBtc2csIElTdGF0dXMgc3RhdHVzKSB7Ci0JCXJldHVybiBkaXNwbGF5KHRpdGxlLCBtc2csIHN0YXR1cyk7Ci0JfQotCi0JLyoqCi0JICogRGlzcGxheXMgdGhlIGdpdmVuIHdhcm5pbmcgbWVzc2FnZSBpbiBhIHdhcm5pbmcgZGlhbG9nIHdpdGhvdXQgdGhlCi0JICogd2FybmluZyByZWFzb24gYW5kIERldGFpbHMgYnV0dG9uLgotCSAqIDxwPgotCSAqIE5vdGU6IFRoZSB3YW5pbmcgbWVzc2FnZSB3aWxsIGJlIHdyaXR0ZW4gdG8gdGhlIGxvZyBmaWxlLgotCSAqIAotCSAqIEBwYXJhbSB0aXRsZQotCSAqICAgICAgICAgICAgVGhlIHRpdGxlIGZvciB0aGUgd2FybmluZyBkaWFsb2cuCi0JICogQHBhcmFtIG1zZwotCSAqICAgICAgICAgICAgVGhlIHdhcm5pbmcgbWVzc2FnZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwbGF5V2FybmluZyhTdHJpbmcgdGl0bGUsIFN0cmluZyBtc2cpIHsKLQkJZGlzcGxheShJU3RhdHVzLldBUk5JTkcsIHRpdGxlLCBtc2csIG51bGwsIG51bGwsIG51bGwpOwotCX0KLQkKLQkvKioKLQkgKiBEaXNwbGF5cyB0aGUgZ2l2ZW4gd2FybmluZyBtZXNzYWdlIGluIGEgd2FybmluZyBkaWFsb2cgd2l0aG91dCB0aGUKLQkgKiB3YXJuaW5nIHJlYXNvbiBhbmQgRGV0YWlscyBidXR0b24uCi0JICogPHA+Ci0JICogTm90ZTogVGhlIHdhcm5pbmcgbWVzc2FnZSBhbmQgdGhlIGV4Y2VwdGlvbiBzdGFjayB0cmFjZSB3aWxsIGJlIHdyaXR0ZW4KLQkgKiB0byB0aGUgbG9nIGZpbGUuCi0JICogCi0JICogQHBhcmFtIHRpdGxlCi0JICogICAgICAgICAgICBUaGUgdGl0bGUgZm9yIHRoZSB3YXJuaW5nIGRpYWxvZy4KLQkgKiBAcGFyYW0gbXNnCi0JICogICAgICAgICAgICBUaGUgd2FybmluZyBtZXNzYWdlLgotCSAqIEBwYXJhbSBleAotCSAqICAgICAgICAgICAgVGhlIGV4Y2VwdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhlIHdhcm5pbmcuCi0JICovCi0JcHVibGljIHZvaWQgZGlzcGxheVdhcm5pbmcoU3RyaW5nIHRpdGxlLCBTdHJpbmcgbXNnLCBUaHJvd2FibGUgZXgpIHsKLQkJZGlzcGxheShJU3RhdHVzLldBUk5JTkcsIHRpdGxlLCBtc2csIG51bGwsIG51bGwsIGV4KTsKLQl9Ci0KLQkvKioKLQkgKiBEaXNwbGF5cyB0aGUgZ2l2ZW4gd2FybmluZyBtZXNzYWdlIGluIGEgd2FybmluZyBkaWFsb2cgd2l0aG91dCB0aGUKLQkgKiB3YXJuaW5nIHJlYXNvbiBhbmQgRGV0YWlscyBidXR0b24uCi0JICogPHA+Ci0JICogTm90ZTogVGhlIHdhbmluZyBtZXNzYWdlIHdpbGwgYmUgd3JpdHRlbiB0byB0aGUgbG9nIGZpbGUuCi0JICogCi0JICogQHBhcmFtIHRpdGxlCi0JICogICAgICAgICAgICBUaGUgdGl0bGUgZm9yIHRoZSB3YXJuaW5nIGRpYWxvZy4KLQkgKiBAcGFyYW0gbXNnCi0JICogICAgICAgICAgICBUaGUgd2FybmluZyBtZXNzYWdlLgotCSAqIEBwYXJhbSByZWFzb24KLQkgKiAgICAgICAgICAgIFRoZSByZWFzb24gZm9yIHRoZSB3YXJuaW5nLgotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3BsYXlXYXJuaW5nKFN0cmluZyB0aXRsZSwgU3RyaW5nIG1zZywgU3RyaW5nIHJlYXNvbikgewotCQlkaXNwbGF5KElTdGF0dXMuV0FSTklORywgdGl0bGUsIG1zZywgcmVhc29uLCBudWxsLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBEaXNwbGF5cyB0aGUgZ2l2ZW4gd2FybmluZyBtZXNzYWdlIGluIGEgd2FybmluZyBkaWFsb2cgd2l0aG91dCB0aGUKLQkgKiB3YXJuaW5nIHJlYXNvbiBhbmQgRGV0YWlscyBidXR0b24uCi0JICogPHA+Ci0JICogTm90ZTogVGhlIHdhcm5pbmcgbWVzc2FnZSBhbmQgdGhlIGV4Y2VwdGlvbiBzdGFjayB0cmFjZSB3aWxsIGJlIHdyaXR0ZW4KLQkgKiB0byB0aGUgbG9nIGZpbGUuCi0JICogCi0JICogQHBhcmFtIHRpdGxlCi0JICogICAgICAgICAgICBUaGUgdGl0bGUgZm9yIHRoZSB3YXJuaW5nIGRpYWxvZy4KLQkgKiBAcGFyYW0gbXNnCi0JICogICAgICAgICAgICBUaGUgd2FybmluZyBtZXNzYWdlLgotCSAqIEBwYXJhbSByZWFzb24KLQkgKiAgICAgICAgICAgIFRoZSByZWFzb24gZm9yIHRoZSB3YXJuaW5nLgotCSAqIEBwYXJhbSBleAotCSAqICAgICAgICAgICAgVGhlIGV4Y2VwdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhlIHdhcm5pbmcuCi0JICovCi0JcHVibGljIHZvaWQgZGlzcGxheVdhcm5pbmcoU3RyaW5nIHRpdGxlLCBTdHJpbmcgbXNnLCBTdHJpbmcgcmVhc29uLAotCQkJVGhyb3dhYmxlIGV4KSB7Ci0JCWRpc3BsYXkoSVN0YXR1cy5XQVJOSU5HLCB0aXRsZSwgbXNnLCByZWFzb24sIG51bGwsIGV4KTsKLQl9Ci0KLQkvKioKLQkgKiBEaXNwbGF5cyB0aGUgZ2l2ZW4gd2FybmluZyBtZXNzYWdlIGluIGEgd2FybmluZyBkaWFsb2cuIFRoZSBEZXRhaWxzCi0JICogYnV0dG9uIHdpbGwgYmUgZGlzcGxheWVkIGlmIHRoZSA8Y29kZT5kZXRhaWxzPC9jb2RlPiBwYXJhbWV0ZXIgaXQgbm90Ci0JICogbnVsbCBvciBlbXB0eS4KLQkgKiA8cD4KLQkgKiBOb3RlOiBUaGUgd2FuaW5nIG1lc3NhZ2Ugd2lsbCBiZSB3cml0dGVuIHRvIHRoZSBsb2cgZmlsZS4KLQkgKiAKLQkgKiBAcGFyYW0gdGl0bGUKLQkgKiAgICAgICAgICAgIFRoZSB0aXRsZSBmb3IgdGhlIGVycm9yIGRpYWxvZy4KLQkgKiBAcGFyYW0gbXNnCi0JICogICAgICAgICAgICBUaGUgd2FybmluZyBtZXNzYWdlLgotCSAqIEBwYXJhbSByZWFzb24KLQkgKiAgICAgICAgICAgIFRoZSByZWFzb24gZm9yIHRoZSB3YXJuaW5nLgotCSAqIEBwYXJhbSBkZXRhaWxzCi0JICogICAgICAgICAgICBUaGUgd2FybmluZyBkZXRhaWxzLgotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3BsYXlXYXJuaW5nKFN0cmluZyB0aXRsZSwgU3RyaW5nIG1zZywgU3RyaW5nIHJlYXNvbiwKLQkJCVN0cmluZyBkZXRhaWxzKSB7Ci0JCWRpc3BsYXkoSVN0YXR1cy5XQVJOSU5HLCB0aXRsZSwgbXNnLCByZWFzb24sIGRldGFpbHMsIG51bGwpOwotCX0KLQotCS8qKgotCSAqIERpc3BsYXlzIHRoZSBnaXZlbiB3YXJuaW5nIG1lc3NhZ2UgaW4gYSB3YXJuaW5nIGRpYWxvZy4gVGhlIERldGFpbHMKLQkgKiBidXR0b24gd2lsbCBiZSBkaXNwbGF5ZWQgaWYgdGhlIDxjb2RlPmRldGFpbHM8L2NvZGU+IHBhcmFtZXRlciBpdCBub3QKLQkgKiBudWxsIG9yIGVtcHR5LgotCSAqIDxwPgotCSAqIE5vdGU6IFRoZSB3YXJuaW5nIG1lc3NhZ2UgYW5kIHRoZSBleGNlcHRpb24gc3RhY2sgdHJhY2Ugd2lsbCBiZSB3cml0dGVuCi0JICogdG8gdGhlIGxvZyBmaWxlLgotCSAqIAotCSAqIEBwYXJhbSB0aXRsZQotCSAqICAgICAgICAgICAgVGhlIHRpdGxlIGZvciB0aGUgZXJyb3IgZGlhbG9nLgotCSAqIEBwYXJhbSBtc2cKLQkgKiAgICAgICAgICAgIFRoZSB3YXJuaW5nIG1lc3NhZ2UuCi0JICogQHBhcmFtIHJlYXNvbgotCSAqICAgICAgICAgICAgVGhlIHJlYXNvbiBmb3IgdGhlIHdhcm5pbmcuCi0JICogQHBhcmFtIGRldGFpbHMKLQkgKiAgICAgICAgICAgIFRoZSB3YXJuaW5nIGRldGFpbHMuCi0JICogQHBhcmFtIGV4Ci0JICogICAgICAgICAgICBUaGUgZXhjZXB0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUgd2FybmluZy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwbGF5V2FybmluZyhTdHJpbmcgdGl0bGUsIFN0cmluZyBtc2csIFN0cmluZyByZWFzb24sCi0JCQlTdHJpbmcgZGV0YWlscywgVGhyb3dhYmxlIGV4KSB7Ci0JCWRpc3BsYXkoSVN0YXR1cy5XQVJOSU5HLCB0aXRsZSwgbXNnLCByZWFzb24sIGRldGFpbHMsIGV4KTsKLQl9Ci0KLQkvKioKLQkgKiBEaXNwbGF5cyB0aGUgZ2l2ZW4gd2FybmluZyBzdGF0dXMgaW4gYW4gZXJyb3IgZGlhbG9nLgotCSAqIDxwPgotCSAqIE5vdGU6IFRoZSB3YXJuaW5nIG1lc3NhZ2UgYW5kIHRoZSBleGNlcHRpb24gc3RhY2sgdHJhY2Ugd2lsbCBiZSB3cml0dGVuCi0JICogdG8gdGhlIGxvZyBmaWxlLgotCSAqIAotCSAqIEBwYXJhbSB0aXRsZQotCSAqICAgICAgICAgICAgVGhlIHRpdGxlIGZvciB0aGUgZXJyb3IgZGlhbG9nLgotCSAqIEBwYXJhbSBzdGF0dXMKLQkgKiAgICAgICAgICAgIFRoZSBlcnJvciBzdGF0dXMuCi0JICovCi0JcHVibGljIHZvaWQgZGlzcGxheVdhcm5pbmcoU3RyaW5nIHRpdGxlLCBJU3RhdHVzIHN0YXR1cykgewotCQlkaXNwbGF5KHRpdGxlLCBudWxsLCBzdGF0dXMpOwotCX0KLQotCS8qKgotCSAqIERpc3BsYXlzIHRoZSBnaXZlbiB3YXJuaW5nIHN0YXR1cyBpbiBhbiBlcnJvciBkaWFsb2cuCi0JICogPHA+Ci0JICogTm90ZTogVGhlIHdhcm5pbmcgbWVzc2FnZSBhbmQgdGhlIGV4Y2VwdGlvbiBzdGFjayB0cmFjZSB3aWxsIGJlIHdyaXR0ZW4KLQkgKiB0byB0aGUgbG9nIGZpbGUuCi0JICogCi0JICogQHBhcmFtIHRpdGxlCi0JICogICAgICAgICAgICBUaGUgdGl0bGUgZm9yIHRoZSBlcnJvciBkaWFsb2cuCi0JICogQHBhcmFtIG1zZwotCSAqICAgICAgICAgICAgVGhlIGVycm9yIG1lc3NhZ2UuCi0JICogQHBhcmFtIHN0YXR1cwotCSAqICAgICAgICAgICAgVGhlIGVycm9yIHN0YXR1cy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwbGF5V2FybmluZyhTdHJpbmcgdGl0bGUsIFN0cmluZyBtc2csIElTdGF0dXMgc3RhdHVzKSB7Ci0JCWRpc3BsYXkodGl0bGUsIG1zZywgc3RhdHVzKTsKLQl9Ci0KLQkvKioKLQkgKiBEaXNwbGF5cyB0aGUgZ2l2ZW4gZXJyb3Igb3Igd2FybmluZyBtZXNzYWdlIGluIGFuIGVycm9yIG9yIHdhcm5pbmcKLQkgKiBkaWFsb2cuIFRoZSBEZXRhaWxzIGJ1dHRvbiB3aWxsIGJlIGRpc3BsYXllZCBpZiB0aGUgPGNvZGU+ZGV0YWlsczwvY29kZT4KLQkgKiBwYXJhbWV0ZXIgaXQgbm90IG51bGwgb3IgZW1wdHkuCi0JICogCi0JICogQHBhcmFtIHNldmVyaXR5Ci0JICogICAgICAgICAgICBUaGUgc2V2ZXJpdHksIGVpdGhlciBJU3RhdHVzLkVSUk9SIG9yIElTdGF0dXMuV0FSTklORy4KLQkgKiBAcGFyYW0gdGl0bGUKLQkgKiAgICAgICAgICAgIFRoZSB0aXRsZSBmb3IgdGhlIGVycm9yIGRpYWxvZy4KLQkgKiBAcGFyYW0gbXNnCi0JICogICAgICAgICAgICBUaGUgZXJyb3IgbWVzc2FnZS4KLQkgKiBAcGFyYW0gcmVhc29uCi0JICogICAgICAgICAgICBUaGUgcmVhc29uIGZvciB0aGUgZXJyb3IuCi0JICogQHBhcmFtIGRldGFpbHMKLQkgKiAgICAgICAgICAgIFRoZSBlcnJvciBkZXRhaWxzLgotCSAqIEBwYXJhbSBleAotCSAqICAgICAgICAgICAgVGhlIGV4Y2VwdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhlIGVycm9yLgotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBkaXNwbGF5KGludCBzZXZlcml0eSwgU3RyaW5nIHRpdGxlLCBTdHJpbmcgbXNnLAotCQkJU3RyaW5nIHJlYXNvbiwgU3RyaW5nIGRldGFpbHMsIFRocm93YWJsZSBleCkgewotCQlpZiAobXNnID09IG51bGwgJiYgZXggIT0gbnVsbCkgewotCQkJbXNnID0gZXguZ2V0TWVzc2FnZSgpOwotCQl9Ci0KLQkJaWYgKG1zZyA9PSBudWxsKSB7Ci0JCQltc2cgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJaWYgKHNldmVyaXR5ID09IElTdGF0dXMuRVJST1IgfHwgc2V2ZXJpdHkgPT0gSVN0YXR1cy5XQVJOSU5HKSB7Ci0JCQlsb2dnZXIubG9nTXNnKHNldmVyaXR5LCBtc2csIGV4KTsKLQkJfSBlbHNlIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCi0JCQkJCSJzZXZlcml0eSBhcmd1bWVudCBtdXN0IGJlIElTdGF0dXMuRVJST1Igb3IgSVN0YXR1cy5XQVJOSU5HIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCUltYWdlIG9sZEltYWdlID0gb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5FcnJvckRpYWxvZwotCQkJCS5nZXREZWZhdWx0SW1hZ2UoKTsKLQkJSW1hZ2Ugc2hlbGxJbWFnZSA9IGdldFNoZWxsSW1hZ2UoKTsKLQkJaWYgKHNoZWxsSW1hZ2UgIT0gbnVsbCkgewotCQkJRXJyb3JEaWFsb2cuc2V0RGVmYXVsdEltYWdlKHNoZWxsSW1hZ2UpOwotCQl9Ci0KLQkJU2hlbGwgc2hlbGwgPSBnZXRTaGVsbCgpOwotCi0JCWlmIChkZXRhaWxzICE9IG51bGwgJiYgZGV0YWlscy5sZW5ndGgoKSA+IDApIHsKLQkJCU11bHRpU3RhdHVzIG1TdGF0dXMgPSBuZXcgTXVsdGlTdGF0dXMocGx1Z2luSWQsIElTdGF0dXMuT0ssIHJlYXNvbiwKLQkJCQkJZXgpOwotCQkJU3RhdHVzIHN0YXR1cyA9IG5ldyBTdGF0dXMoc2V2ZXJpdHksIHBsdWdpbklkLCBJU3RhdHVzLk9LLCBkZXRhaWxzLAotCQkJCQlleCk7Ci0JCQltU3RhdHVzLmFkZChzdGF0dXMpOwotCQkJb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5FcnJvckRpYWxvZy5vcGVuRXJyb3Ioc2hlbGwsIHRpdGxlLCBtc2csCi0JCQkJCW1TdGF0dXMpOwotCQl9IGVsc2UgaWYgKHJlYXNvbiAhPSBudWxsICYmIHJlYXNvbi5sZW5ndGgoKSA+IDApIHsKLQkJCVN0YXR1cyBzdGF0dXMgPSBuZXcgU3RhdHVzKHNldmVyaXR5LCBwbHVnaW5JZCwgSVN0YXR1cy5PSywgcmVhc29uLAotCQkJCQlleCk7Ci0JCQlvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkVycm9yRGlhbG9nLm9wZW5FcnJvcihzaGVsbCwgdGl0bGUsIG1zZywKLQkJCQkJc3RhdHVzKTsKLQkJfSBlbHNlIHsKLQkJCWlmIChzZXZlcml0eSA9PSBJU3RhdHVzLkVSUk9SKSB7Ci0JCQkJV3JhcHBlZE1lc3NhZ2VEaWFsb2cub3BlbkVycm9yKHNoZWxsLCB0aXRsZSwgbXNnKTsKLQkJCX0gZWxzZSBpZiAoc2V2ZXJpdHkgPT0gSVN0YXR1cy5XQVJOSU5HKSB7Ci0JCQkJV3JhcHBlZE1lc3NhZ2VEaWFsb2cub3Blbldhcm5pbmcoc2hlbGwsIHRpdGxlLCBtc2cpOwotCQkJfQotCQl9Ci0KLQkJaWYgKHNoZWxsSW1hZ2UgIT0gbnVsbCkgewotCQkJRXJyb3JEaWFsb2cuc2V0RGVmYXVsdEltYWdlKG9sZEltYWdlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIERpc3BsYXlzIHRoZSBnaXZlbiBlcnJvciBvciB3YXJuaW5nIG1lc3NhZ2UgaW4gYW4gZXJyb3Igb3Igd2FybmluZwotCSAqIGRpYWxvZy4gVGhlIERldGFpbHMgYnV0dG9uIHdpbGwgYmUgZGlzcGxheWVkIGlmIHRoZSA8Y29kZT5kZXRhaWxzPC9jb2RlPgotCSAqIHBhcmFtZXRlciBpdCBub3QgbnVsbCBvciBlbXB0eS4KLQkgKiAKLQkgKiBAcGFyYW0gdGl0bGUKLQkgKiAgICAgICAgICAgIFRoZSB0aXRsZSBmb3IgdGhlIGVycm9yIGRpYWxvZy4KLQkgKiBAcGFyYW0gc3RhdHVzCi0JICogICAgICAgICAgICBUaGUgZXJyb3Igc3RhdHVzLgotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgaW50IGRpc3BsYXkoU3RyaW5nIHRpdGxlLCBJU3RhdHVzIHN0YXR1cykgewotCQlyZXR1cm4gZGlzcGxheSh0aXRsZSwgbnVsbCwgc3RhdHVzKTsKLQl9Ci0KLQkvKioKLQkgKiBEaXNwbGF5cyB0aGUgZ2l2ZW4gZXJyb3Igb3Igd2FybmluZyBtZXNzYWdlIGluIGFuIGVycm9yIG9yIHdhcm5pbmcKLQkgKiBkaWFsb2cuIFRoZSBEZXRhaWxzIGJ1dHRvbiB3aWxsIGJlIGRpc3BsYXllZCBpZiB0aGUgPGNvZGU+ZGV0YWlsczwvY29kZT4KLQkgKiBwYXJhbWV0ZXIgaXQgbm90IG51bGwgb3IgZW1wdHkuCi0JICogCi0JICogQHBhcmFtIHRpdGxlCi0JICogICAgICAgICAgICBUaGUgdGl0bGUgZm9yIHRoZSBlcnJvciBkaWFsb2cuCi0JICogQHBhcmFtIG1zZwotCSAqICAgICAgICAgICAgVGhlIGVycm9yIG1lc3NhZ2UuCi0JICogQHBhcmFtIHN0YXR1cwotCSAqICAgICAgICAgICAgVGhlIGVycm9yIHN0YXR1cy4KLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIGludCBkaXNwbGF5KFN0cmluZyB0aXRsZSwgU3RyaW5nIG1zZywgSVN0YXR1cyBzdGF0dXMpIHsKLQkJaWYgKHN0YXR1cyA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJzdGF0dXMgYXJndW1lbnQgY2Fubm90IGJlIG51bGwiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJaWYgKG1zZyA9PSBudWxsKSB7Ci0JCQltc2cgPSBzdGF0dXMuZ2V0TWVzc2FnZSgpOwotCQl9Ci0JCWlmIChtc2cgPT0gbnVsbCkgewotCQkJbXNnID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCWludCBzZXZlcml0eSA9IHN0YXR1cy5nZXRTZXZlcml0eSgpOwotCQlpZiAoc2V2ZXJpdHkgPT0gSVN0YXR1cy5FUlJPUiB8fCBzZXZlcml0eSA9PSBJU3RhdHVzLldBUk5JTkcpIHsKLQkJCWxvZ2dlci5sb2dNc2coc2V2ZXJpdHksIG1zZywgc3RhdHVzLmdldEV4Y2VwdGlvbigpKTsKLQkJfQotCi0JCUltYWdlIG9sZEltYWdlID0gb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5FcnJvckRpYWxvZwotCQkJCS5nZXREZWZhdWx0SW1hZ2UoKTsKLQkJSW1hZ2Ugc2hlbGxJbWFnZSA9IGdldFNoZWxsSW1hZ2UoKTsKLQkJaWYgKHNoZWxsSW1hZ2UgIT0gbnVsbCkgewotCQkJRXJyb3JEaWFsb2cuc2V0RGVmYXVsdEltYWdlKHNoZWxsSW1hZ2UpOwotCQl9Ci0KLQkJU2hlbGwgc2hlbGwgPSBnZXRTaGVsbCgpOwotCi0JCWludCByYyA9IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRXJyb3JEaWFsb2cub3BlbkVycm9yKHNoZWxsLCB0aXRsZSwKLQkJCQltc2csIHN0YXR1cyk7Ci0KLQkJaWYgKHNoZWxsSW1hZ2UgIT0gbnVsbCkgewotCQkJRXJyb3JEaWFsb2cuc2V0RGVmYXVsdEltYWdlKG9sZEltYWdlKTsKLQkJfQotCi0JCXJldHVybiByYzsKLQl9Ci0KLQkvKioKLQkgKiBEaXNwbGF5cyB0aGUgZ2l2ZW4gbWVzc2FnZSBpbiBhIGluZm9ybWF0aW9uYWwgZGlhbG9nIHdpdGggYW4gIk9LIiBidXR0b24uCi0JICogCi0JICogQHBhcmFtIHRpdGxlCi0JICogICAgICAgICAgICBUaGUgdGl0bGUgZm9yIHRoZSBpbmZvcm1hdGlvbiBkaWFsb2cuCi0JICogQHBhcmFtIG1zZwotCSAqICAgICAgICAgICAgVGhlIG1lc3NhZ2UgdG8gZGlzcGxheS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwbGF5SW5mbyhTdHJpbmcgdGl0bGUsIFN0cmluZyBtc2cpIHsKLQkJaWYgKG1zZyA9PSBudWxsKSB7Ci0JCQltc2cgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJSW1hZ2Ugb2xkSW1hZ2UgPSBXcmFwcGVkTWVzc2FnZURpYWxvZy5nZXREZWZhdWx0SW1hZ2UoKTsKLQkJSW1hZ2Ugc2hlbGxJbWFnZSA9IGdldFNoZWxsSW1hZ2UoKTsKLQkJaWYgKHNoZWxsSW1hZ2UgIT0gbnVsbCkgewotCQkJV3JhcHBlZE1lc3NhZ2VEaWFsb2cuc2V0RGVmYXVsdEltYWdlKHNoZWxsSW1hZ2UpOwotCQl9Ci0KLQkJU2hlbGwgc2hlbGwgPSBnZXRTaGVsbCgpOwotCQlXcmFwcGVkTWVzc2FnZURpYWxvZy5vcGVuSW5mb3JtYXRpb24oc2hlbGwsIHRpdGxlLCBtc2cpOwotCi0JCWlmIChzaGVsbEltYWdlICE9IG51bGwpIHsKLQkJCVdyYXBwZWRNZXNzYWdlRGlhbG9nLnNldERlZmF1bHRJbWFnZShvbGRJbWFnZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBEaXNwbGF5cyB0aGUgZ2l2ZW4gbWVzc2FnZSBpbiBhIHF1ZXN0aW9uIGRpYWxvZyB3aXRoIGEgIlllcyIgYW5kICJObyIKLQkgKiBidXR0b24uCi0JICogCi0JICogQHBhcmFtIHRpdGxlCi0JICogICAgICAgICAgICBUaGUgdGl0bGUgZm9yIHRoZSBpbmZvcm1hdGlvbiBkaWFsb2cuCi0JICogQHBhcmFtIG1zZwotCSAqICAgICAgICAgICAgVGhlIG1lc3NhZ2UgdG8gZGlzcGxheS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBkaXNwbGF5UHJvbXB0KFN0cmluZyB0aXRsZSwgU3RyaW5nIG1zZykgewotCQlpZiAobXNnID09IG51bGwpIHsKLQkJCW1zZyA9ICIiOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlJbWFnZSBvbGRJbWFnZSA9IFdyYXBwZWRNZXNzYWdlRGlhbG9nLmdldERlZmF1bHRJbWFnZSgpOwotCQlJbWFnZSBzaGVsbEltYWdlID0gZ2V0U2hlbGxJbWFnZSgpOwotCQlpZiAoc2hlbGxJbWFnZSAhPSBudWxsKSB7Ci0JCQlXcmFwcGVkTWVzc2FnZURpYWxvZy5zZXREZWZhdWx0SW1hZ2Uoc2hlbGxJbWFnZSk7Ci0JCX0KLQotCQlTaGVsbCBzaGVsbCA9IGdldFNoZWxsKCk7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gV3JhcHBlZE1lc3NhZ2VEaWFsb2cub3BlblF1ZXN0aW9uKHNoZWxsLCB0aXRsZSwgbXNnKTsKLQotCQlpZiAoc2hlbGxJbWFnZSAhPSBudWxsKSB7Ci0JCQlXcmFwcGVkTWVzc2FnZURpYWxvZy5zZXREZWZhdWx0SW1hZ2Uob2xkSW1hZ2UpOwotCQl9Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBEaXNwbGF5cyB0aGUgZ2l2ZW4gbWVzc2FnZSBpbiBhIGNvbmZpcm1hdGlvbiBkaWFsb2cgd2l0aCBhICJZZXMiIGFuZAotCSAqICJDYW5jZWwiIGJ1dHRvbi4KLQkgKiAKLQkgKiBAcGFyYW0gdGl0bGUKLQkgKiAgICAgICAgICAgIFRoZSB0aXRsZSBmb3IgdGhlIGluZm9ybWF0aW9uIGRpYWxvZy4KLQkgKiBAcGFyYW0gbXNnCi0JICogICAgICAgICAgICBUaGUgbWVzc2FnZSB0byBkaXNwbGF5LgotCSAqLwotCXB1YmxpYyBib29sZWFuIGRpc3BsYXlDb25maXJtYXRpb24oU3RyaW5nIHRpdGxlLCBTdHJpbmcgbXNnKSB7Ci0JCWlmIChtc2cgPT0gbnVsbCkgewotCQkJbXNnID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCUltYWdlIG9sZEltYWdlID0gV3JhcHBlZE1lc3NhZ2VEaWFsb2cuZ2V0RGVmYXVsdEltYWdlKCk7Ci0JCUltYWdlIHNoZWxsSW1hZ2UgPSBnZXRTaGVsbEltYWdlKCk7Ci0JCWlmIChzaGVsbEltYWdlICE9IG51bGwpIHsKLQkJCVdyYXBwZWRNZXNzYWdlRGlhbG9nLnNldERlZmF1bHRJbWFnZShzaGVsbEltYWdlKTsKLQkJfQotCi0JCVNoZWxsIHNoZWxsID0gZ2V0U2hlbGwoKTsKLQkJYm9vbGVhbiByZXN1bHQgPSBXcmFwcGVkTWVzc2FnZURpYWxvZy5vcGVuQ29uZmlybShzaGVsbCwgdGl0bGUsIG1zZyk7Ci0KLQkJaWYgKHNoZWxsSW1hZ2UgIT0gbnVsbCkgewotCQkJV3JhcHBlZE1lc3NhZ2VEaWFsb2cuc2V0RGVmYXVsdEltYWdlKG9sZEltYWdlKTsKLQkJfQotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIGludCBkaXNwbGF5Q29uZmlybWF0aW9uKFN0cmluZyB0aXRsZSwgU3RyaW5nIG1zZywgSVN0YXR1cyBzdGF0dXMpIHsKLQkJaWYgKHN0YXR1cyA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJzdGF0dXMgYXJndW1lbnQgY2Fubm90IGJlIG51bGwiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJaWYgKG1zZyA9PSBudWxsKSB7Ci0JCQltc2cgPSBzdGF0dXMuZ2V0TWVzc2FnZSgpOwotCQl9Ci0JCWlmIChtc2cgPT0gbnVsbCkgewotCQkJbXNnID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCUltYWdlIHNoZWxsSW1hZ2UgPSBnZXRTaGVsbEltYWdlKCk7Ci0JCWlmIChzaGVsbEltYWdlICE9IG51bGwpIHsKLQkJCUVycm9yRGlhbG9nTm9SZWFzb24uc2V0RGVmYXVsdEltYWdlKHNoZWxsSW1hZ2UpOwotCQl9Ci0KLQkJU2hlbGwgc2hlbGwgPSBnZXRTaGVsbCgpOwotCi0JCWludCByYyA9IEVycm9yRGlhbG9nTm9SZWFzb24ub3BlbkVycm9yKHNoZWxsLCB0aXRsZSwgbXNnLCBzdGF0dXMpOwotCi0JCXJldHVybiByYzsKLQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGltYWdlIGZvciB0aGUgY3VycmVudCBzaGVsbC4KLQkgKiAKLQkgKiBAcmV0dXJuIFRoZSBjdXJyZW50IHNoZWxsIGltYWdlLgotCSAqLwotCXByaXZhdGUgSW1hZ2UgZ2V0U2hlbGxJbWFnZSgpIHsKLQkJSVdvcmtiZW5jaCB3b3JrYmVuY2ggPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpOwotCQlpZiAod29ya2JlbmNoICE9IG51bGwpIHsKLQkJCUlXb3JrYmVuY2hXaW5kb3cgd29ya2JlbmNoV2luZG93ID0gd29ya2JlbmNoCi0JCQkJCS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKLQkJCWlmICh3b3JrYmVuY2hXaW5kb3cgIT0gbnVsbCkgewotCQkJCVNoZWxsIHNoZWxsID0gd29ya2JlbmNoV2luZG93LmdldFNoZWxsKCk7Ci0JCQkJaWYgKHNoZWxsICE9IG51bGwpIHsKLQkJCQkJcmV0dXJuIHNoZWxsLmdldEltYWdlKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vdWkvdXRpbC9QZXJzcGVjdGl2ZVV0aWwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vdWkvdXRpbC9QZXJzcGVjdGl2ZVV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzgxNzM2Zi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3VpL3V0aWwvUGVyc3BlY3RpdmVVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVBlcnNwZWN0aXZlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JUGVyc3BlY3RpdmVSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JVmlld1BhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLldvcmtiZW5jaEV4Y2VwdGlvbjsKLQotLyoqCi0gKiBVdGlsaXR5IGNsYXNzIGZvciBhY2Nlc3NpbmcgcGVyc3BlY3RpdmVzLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFBlcnNwZWN0aXZlVXRpbCB7Ci0KLQkvKioKLQkgKiBQcml2YXRlIGNvbnN0cnVjdG9yIHRvIHByZXZlbnQgdGhpcyBjbGFzcyBmcm9tIGJlaW5nIGluc3RhbnRpYXRlZC4gQWxsCi0JICogbWV0aG9kcyBpbiB0aGlzIGNsYXNzIHNob3VsZCBiZSBzdGF0aWMuCi0JICovCi0JcHJpdmF0ZSBQZXJzcGVjdGl2ZVV0aWwoKSB7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgSUQgb2YgdGhlIGFjdGl2ZSBwZXJzcGVjdGl2ZS4KLQkgKiAKLQkgKiBAcmV0dXJuIFRoZSBhY3RpdmUgcGVyc3BlY3RpdmUgSUQuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0QWN0aXZlUGVyc3BlY3RpdmVJZCgpIHsKLQkJSVdvcmtiZW5jaFBhZ2UgYWN0aXZlUGFnZSA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkKLQkJCQkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0QWN0aXZlUGFnZSgpOwotCQlpZiAoYWN0aXZlUGFnZSAhPSBudWxsKSB7Ci0JCQlJUGVyc3BlY3RpdmVEZXNjcmlwdG9yIGFjdGl2ZVBlcnNwZWN0aXZlID0gYWN0aXZlUGFnZQotCQkJCQkuZ2V0UGVyc3BlY3RpdmUoKTsKLQkJCXJldHVybiBhY3RpdmVQZXJzcGVjdGl2ZS5nZXRJZCgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIE9wZW5zIGEgcGVyc3BlY3RpdmUuCi0JICogCi0JICogQHBhcmFtIHBlcnNwZWN0aXZlSWQKLQkgKiAgICAgICAgICAgIFRoZSBwZXJzcGVjdGl2ZSBJRC4KLQkgKiBAcmV0dXJuIFRoZSBwcmV2aW91c2x5IGFjdGl2ZSBwZXJzcGVjdGl2ZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElQZXJzcGVjdGl2ZURlc2NyaXB0b3Igb3BlblBlcnNwZWN0aXZlKFN0cmluZyBwZXJzcGVjdGl2ZUlkKSB7Ci0JCUlXb3JrYmVuY2hQYWdlIGFjdGl2ZVBhZ2UgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpCi0JCQkJLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKTsKLQkJaWYgKGFjdGl2ZVBhZ2UgIT0gbnVsbCkgewotCQkJSVBlcnNwZWN0aXZlUmVnaXN0cnkgcmVnaXN0cnkgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpCi0JCQkJCS5nZXRQZXJzcGVjdGl2ZVJlZ2lzdHJ5KCk7Ci0JCQlJUGVyc3BlY3RpdmVEZXNjcmlwdG9yIG9sZFBlcnNwZWN0aXZlID0gYWN0aXZlUGFnZS5nZXRQZXJzcGVjdGl2ZSgpOwotCQkJaWYgKCFvbGRQZXJzcGVjdGl2ZS5nZXRJZCgpLmVxdWFscyhwZXJzcGVjdGl2ZUlkKSkgewotCQkJCUlQZXJzcGVjdGl2ZURlc2NyaXB0b3IgcGVyc3BlY3RpdmUgPSByZWdpc3RyeQotCQkJCQkJLmZpbmRQZXJzcGVjdGl2ZVdpdGhJZChwZXJzcGVjdGl2ZUlkKTsKLQkJCQlhY3RpdmVQYWdlLnNldFBlcnNwZWN0aXZlKHBlcnNwZWN0aXZlKTsKLQkJCX0KLQkJCXJldHVybiBvbGRQZXJzcGVjdGl2ZTsKLQkJfSBlbHNlIHsKLQkJCUlXb3JrYmVuY2hXaW5kb3cgYWN0aXZlV2luZG93ID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKQotCQkJCQkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0JCQl0cnkgewotCQkJCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuc2hvd1BlcnNwZWN0aXZlKAotCQkJCQkJcGVyc3BlY3RpdmVJZCwgYWN0aXZlV2luZG93KTsKLQkJCX0gY2F0Y2ggKFdvcmtiZW5jaEV4Y2VwdGlvbiBlKSB7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiBwZXJzcGVjdGl2ZSBpcyBhbHJlYWR5IGFjdGl2ZS4KLQkgKiAKLQkgKiBAcGFyYW0gcGVyc3BlY3RpdmVJZAotCSAqICAgICAgICAgICAgVGhlIHBlcnNwZWN0aXZlIElELgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNBY3RpdmVQZXJzcGVjdGl2ZShTdHJpbmcgcGVyc3BlY3RpdmVJZCkgewotCQlTdHJpbmcgYWN0aXZlUGVyc3BlY3RpdmVJZCA9IFBlcnNwZWN0aXZlVXRpbC5nZXRBY3RpdmVQZXJzcGVjdGl2ZUlkKCk7Ci0JCWlmIChwZXJzcGVjdGl2ZUlkID09IG51bGwgfHwgYWN0aXZlUGVyc3BlY3RpdmVJZCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIGFjdGl2ZVBlcnNwZWN0aXZlSWQuZXF1YWxzSWdub3JlQ2FzZShwZXJzcGVjdGl2ZUlkKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2aWV3IHBhcnQgd2l0aCB0aGUgZ2l2ZW4gdmlldyBJRC4KLQkgKiAKLQkgKiBAcGFyYW0gdmlld0lkCi0JICogICAgICAgICAgICBUaGUgdmlldyBJRC4KLQkgKiBAcmV0dXJuIFRoZSB2aWV3IHBhcnQuCi0JICovCi0JcHVibGljIHN0YXRpYyBJVmlld1BhcnQgZ2V0VmlldyhTdHJpbmcgdmlld0lkKSB7Ci0JCXRyeSB7Ci0JCQlJV29ya2JlbmNoUGFnZSBhY3RpdmVQYWdlID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKQotCQkJCQkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0QWN0aXZlUGFnZSgpOwotCQkJaWYgKGFjdGl2ZVBhZ2UgIT0gbnVsbCkgewotCQkJCUlWaWV3UGFydCB2aWV3ID0gYWN0aXZlUGFnZS5maW5kVmlldyh2aWV3SWQpOwotCQkJCWlmICh2aWV3ID09IG51bGwpIHsKLQkJCQkJdmlldyA9IGFjdGl2ZVBhZ2Uuc2hvd1ZpZXcodmlld0lkKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIHZpZXc7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3VpL3V0aWwvUHJlZmVyZW5jZVV0aWwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vdWkvdXRpbC9QcmVmZXJlbmNlVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYTgwYmM1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vdWkvdXRpbC9QcmVmZXJlbmNlVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5jb21tb24udWkudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotCi1pbXBvcnQgY29tLmlibS5pY3UudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLS8qKgotICogVXRpbGl0eSBjbGFzcyBmb3IgYWNjZXNzaW5nIHByZWZlcmVuY2VzLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjIKLSAqLwotcHVibGljIGNsYXNzIFByZWZlcmVuY2VVdGlsIHsKLQotCS8vIFRoZSBtdWx0aS1zdHJpbmcgcHJlZmVyZW5jZSBkZWxpbWl0ZXIuCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZFUkVOQ0VfREVMSU1JVEVSID0gIjsiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBHZXRzIGEgbGlzdCBjb250YWluaW5nIHN0cmluZyB2YWx1ZXMgYXNzb2NpYXRlZCB3aXRoIGEgbmFtZWQgcHJlZmVyZW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gcHJlZlN0b3JlCi0JICogICAgICAgICAgICBhIHByZWZlcmVuY2Ugc3RvcmUKLQkgKiBAcGFyYW0gbmFtZQotCSAqICAgICAgICAgICAgdGhlIHByZWZlcmVuY2UgbmFtZQotCSAqIEByZXR1cm4gYSBsaXN0IG9mIHN0cmluZyB2YWx1ZXMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3Q8U3RyaW5nPiBnZXRMaXN0KElQcmVmZXJlbmNlU3RvcmUgcHJlZlN0b3JlLCBTdHJpbmcgbmFtZSkgewotCQlMaXN0PFN0cmluZz4gdmFsdWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWlmIChwcmVmU3RvcmUgIT0gbnVsbCAmJiBuYW1lICE9IG51bGwpIHsKLQkJCVN0cmluZyB2YWx1ZSA9IHByZWZTdG9yZS5nZXRTdHJpbmcobmFtZSk7Ci0JCQlTdHJpbmdUb2tlbml6ZXIgdG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcih2YWx1ZSwKLQkJCQkJUFJFRkVSRU5DRV9ERUxJTUlURVIpOwotCQkJaW50IHRva2VuQ291bnQgPSB0b2tlbml6ZXIuY291bnRUb2tlbnMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgdG9rZW5Db3VudDsgaSsrKSB7Ci0JCQkJdmFsdWVzLmFkZCh0b2tlbml6ZXIubmV4dFRva2VuKCkpOwotCQkJfQotCQl9Ci0JCXJldHVybiB2YWx1ZXM7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgc3RyaW5nIHZhbHVlcyBhc3NvY2lhdGVkIHdpdGggYSBuYW1lZCBwcmVmZXJlbmNlLgotCSAqIAotCSAqIEBwYXJhbSBwcmVmU3RvcmUKLQkgKiAgICAgICAgICAgIGEgcHJlZmVyZW5jZSBzdG9yZQotCSAqIEBwYXJhbSBuYW1lCi0JICogICAgICAgICAgICB0aGUgcHJlZmVyZW5jZSBuYW1lCi0JICogQHJldHVybiBhIGxpc3Qgb2Ygc3RyaW5nIHByZWZlcmVuY2UgdmFsdWVzCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmdbXSBnZXRTdHJpbmdWYWx1ZXMoSVByZWZlcmVuY2VTdG9yZSBwcmVmU3RvcmUsCi0JCQlTdHJpbmcgbmFtZSkgewotCQlMaXN0PFN0cmluZz4gbGlzdCA9IGdldExpc3QocHJlZlN0b3JlLCBuYW1lKTsKLQkJU3RyaW5nW10gdmFsdWVzID0gbmV3IFN0cmluZ1tsaXN0LnNpemUoKV07Ci0JCWxpc3QudG9BcnJheSh2YWx1ZXMpOwotCQlyZXR1cm4gdmFsdWVzOwotCX0KLQotCS8qKgotCSAqIFNhdmVzIGEgbGlzdCBjb250YWluaW5nIHN0cmluZyB2YWx1ZXMgYXNzb2NpYXRlZCB3aXRoIGEgbmFtZWQgcHJlZmVyZW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gcHJlZlN0b3JlCi0JICogICAgICAgICAgICBhIHByZWZlcmVuY2Ugc3RvcmUKLQkgKiBAcGFyYW0gbmFtZQotCSAqICAgICAgICAgICAgdGhlIHByZWZlcmVuY2UgbmFtZQotCSAqIEBwYXJhbSB2YWx1ZXMKLQkgKiAgICAgICAgICAgIGEgbGlzdCBvZiBzdHJpbmcgdmFsdWVzCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldExpc3QoSVByZWZlcmVuY2VTdG9yZSBwcmVmU3RvcmUsIFN0cmluZyBuYW1lLAotCQkJTGlzdCB2YWx1ZXMpIHsKLQkJaWYgKHByZWZTdG9yZSAhPSBudWxsICYmIG5hbWUgIT0gbnVsbCAmJiB2YWx1ZXMgIT0gbnVsbCkgewotCQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSB2YWx1ZXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCVN0cmluZyB2YWx1ZSA9IChTdHJpbmcpIGl0Lm5leHQoKTsKLQkJCQlidWZmZXIuYXBwZW5kKHZhbHVlKTsKLQkJCQlidWZmZXIuYXBwZW5kKFBSRUZFUkVOQ0VfREVMSU1JVEVSKTsKLQkJCX0KLQkJCXByZWZTdG9yZS5zZXRWYWx1ZShuYW1lLCBidWZmZXIudG9TdHJpbmcoKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBZGRzIGEgc3RyaW5nIHZhbHVlIHRvIGEgbGlzdCBjb250YWluaW5nIHN0cmluZyB2YWx1ZXMgYXNzb2NpYXRlZCB3aXRoIGEKLQkgKiBuYW1lZCBwcmVmZXJlbmNlLgotCSAqIAotCSAqIEBwYXJhbSBwcmVmU3RvcmUKLQkgKiAgICAgICAgICAgIGEgcHJlZmVyZW5jZSBzdG9yZQotCSAqIEBwYXJhbSBuYW1lCi0JICogICAgICAgICAgICB0aGUgcHJlZmVyZW5jZSBuYW1lCi0JICogQHBhcmFtIHZhbHVlCi0JICogICAgICAgICAgICBhIHN0cmluZyB2YWx1ZQotCSAqIEBwYXJhbSBkZWZhdWx0VmFsdWUKLQkgKiAgICAgICAgICAgIGEgZGVmYXVsdCBzdHJpbmcgdmFsdWUgdGhhdCB3aWxsIGJlIGFkZGVkIHRvIHRoZSBlbmQgb2YgdGhlCi0JICogICAgICAgICAgICBsaXN0Ci0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGFkZFRvTGlzdChJUHJlZmVyZW5jZVN0b3JlIHByZWZTdG9yZSwgU3RyaW5nIG5hbWUsCi0JCQlTdHJpbmcgdmFsdWUsIFN0cmluZyBkZWZhdWx0VmFsdWUpIHsKLQkJaWYgKHByZWZTdG9yZSAhPSBudWxsICYmIG5hbWUgIT0gbnVsbCAmJiB2YWx1ZSAhPSBudWxsKSB7Ci0JCQlMaXN0PFN0cmluZz4gbGlzdCA9IGdldExpc3QocHJlZlN0b3JlLCBuYW1lKTsKLQkJCWxpc3QucmVtb3ZlKHZhbHVlKTsKLQkJCWxpc3QuYWRkKDAsIHZhbHVlKTsKLQkJCWludCBwcmVmZXJlbmNlSGlzdG9yeVNpemUgPSBDb21tb25QcmVmZXJlbmNlcwotCQkJCQkuZ2V0UHJlZmVyZW5jZUhpc3RvcnlTaXplKCk7Ci0JCQlpZiAobGlzdC5zaXplKCkgPiBwcmVmZXJlbmNlSGlzdG9yeVNpemUpIHsKLQkJCQlsaXN0ID0gbGlzdC5zdWJMaXN0KDAsIDEwKTsKLQkJCX0KLQkJCWlmIChsaXN0LnNpemUoKSA9PSBwcmVmZXJlbmNlSGlzdG9yeVNpemUgJiYgZGVmYXVsdFZhbHVlICE9IG51bGwKLQkJCQkJJiYgZGVmYXVsdFZhbHVlLmxlbmd0aCgpID4gMCkgewotCQkJCWxpc3Quc2V0KDksIGRlZmF1bHRWYWx1ZSk7Ci0JCQl9Ci0JCQlzZXRMaXN0KHByZWZTdG9yZSwgbmFtZSwgbGlzdCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBZGRzIGEgc3RyaW5nIHZhbHVlIHRvIGEgbGlzdCBjb250YWluaW5nIHN0cmluZyB2YWx1ZXMgYXNzb2NpYXRlZCB3aXRoIGEKLQkgKiBuYW1lZCBwcmVmZXJlbmNlLgotCSAqIAotCSAqIEBwYXJhbSBwcmVmU3RvcmUKLQkgKiAgICAgICAgICAgIGEgcHJlZmVyZW5jZSBzdG9yZQotCSAqIEBwYXJhbSBuYW1lCi0JICogICAgICAgICAgICB0aGUgcHJlZmVyZW5jZSBuYW1lCi0JICogQHBhcmFtIHZhbHVlCi0JICogICAgICAgICAgICBhIHN0cmluZyB2YWx1ZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBhZGRUb0xpc3QoSVByZWZlcmVuY2VTdG9yZSBwcmVmU3RvcmUsIFN0cmluZyBuYW1lLAotCQkJU3RyaW5nIHZhbHVlKSB7Ci0JCWFkZFRvTGlzdChwcmVmU3RvcmUsIG5hbWUsIHZhbHVlLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBTYXZlcyBhbiBhcnJheSBvZiBzdHJpbmcgdmFsdWVzIGFzc29jaWF0ZWQgd2l0aCBhIG5hbWVkIHByZWZlcmVuY2UuCi0JICogCi0JICogQHBhcmFtIHByZWZTdG9yZQotCSAqICAgICAgICAgICAgYSBwcmVmZXJlbmNlIHN0b3JlCi0JICogQHBhcmFtIG5hbWUKLQkgKiAgICAgICAgICAgIHRoZSBwcmVmZXJlbmNlIG5hbWUKLQkgKiBAcGFyYW0gdmFsdWVzCi0JICogICAgICAgICAgICBhbiBhcnJheSBvZiBzdHJpbmcgdmFsdWVzCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldFN0cmluZ1ZhbHVlcyhJUHJlZmVyZW5jZVN0b3JlIHByZWZTdG9yZSwgU3RyaW5nIG5hbWUsCi0JCQlTdHJpbmdbXSB2YWx1ZXMpIHsKLQkJaWYgKHByZWZTdG9yZSAhPSBudWxsICYmIG5hbWUgIT0gbnVsbCAmJiB2YWx1ZXMgIT0gbnVsbCkgewotCQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgdmFsdWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJYnVmZmVyLmFwcGVuZCh2YWx1ZXNbaV0pOwotCQkJCWJ1ZmZlci5hcHBlbmQoUFJFRkVSRU5DRV9ERUxJTUlURVIpOwotCQkJfQotCQkJcHJlZlN0b3JlLnNldFZhbHVlKG5hbWUsIGJ1ZmZlci50b1N0cmluZygpKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi91aS91dGlsL1dyYXBwZWRNZXNzYWdlRGlhbG9nLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3VpL3V0aWwvV3JhcHBlZE1lc3NhZ2VEaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmU1Y2YwZi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3VpL3V0aWwvV3JhcHBlZE1lc3NhZ2VEaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5NZXNzYWdlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotCi0vKioKLSAqIERpc3BsYXlzIGEgbWVzc2FnZSBkaWFsb2cgdGhhdCBkaXNwbGF5cyB3cmFwcGVkIHRleHQuCi0gKiAKLSAqIEBhdXRob3IgQmluZ3h1ZSBYdQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgV3JhcHBlZE1lc3NhZ2VEaWFsb2cgZXh0ZW5kcyBNZXNzYWdlRGlhbG9nIHsKLQotCXB1YmxpYyBXcmFwcGVkTWVzc2FnZURpYWxvZyhTaGVsbCBwYXJlbnRTaGVsbCwgU3RyaW5nIGRpYWxvZ1RpdGxlLAotCQkJSW1hZ2UgZGlhbG9nVGl0bGVJbWFnZSwgU3RyaW5nIGRpYWxvZ01lc3NhZ2UsIGludCBkaWFsb2dJbWFnZVR5cGUsCi0JCQlTdHJpbmdbXSBkaWFsb2dCdXR0b25MYWJlbHMsIGludCBkZWZhdWx0SW5kZXgpIHsKLQkJc3VwZXIocGFyZW50U2hlbGwsIGRpYWxvZ1RpdGxlLCBkaWFsb2dUaXRsZUltYWdlLCBkaWFsb2dNZXNzYWdlLAotCQkJCWRpYWxvZ0ltYWdlVHlwZSwgZGlhbG9nQnV0dG9uTGFiZWxzLCBkZWZhdWx0SW5kZXgpOwotCX0KLQotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZU1lc3NhZ2VBcmVhKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQotCQlDb250cm9sIHJDb21wb3NpdGUgPSBzdXBlci5jcmVhdGVNZXNzYWdlQXJlYShjb21wb3NpdGUpOwotCi0JCWludCBtaW5XaWR0aCA9IElEaWFsb2dDb25zdGFudHMuTUlOSU1VTV9NRVNTQUdFX0FSRUFfV0lEVEg7Ly8gKyAzMDA7Ci0JCS8vIFRPLURPOiBuZWVkIHRvIHJldmlzdCB0aGUgIyBvZiBkaWFsb2cgZGlzcGxheSB1bml0cyBhbmQgbWFyZ2luCi0JCS8vIHdoZW4gaW4gb3RoZXIgbGFuZ3VhZ2VzCi0JCWludCBjaGFyc1BlckxpbmUgPSBtaW5XaWR0aCAvIDQgLSAxNTsKLQkJR3JpZERhdGEgZ2QgPSAoR3JpZERhdGEpIG1lc3NhZ2VMYWJlbC5nZXRMYXlvdXREYXRhKCk7Ci0JCWdkLm1pbmltdW1XaWR0aCA9IG1pbldpZHRoOwotCQltZXNzYWdlTGFiZWwuc2V0VGV4dChhZGRMaW5lQnJlYWtzKG1lc3NhZ2UsIGNoYXJzUGVyTGluZSkpOwotCi0JCXJldHVybiByQ29tcG9zaXRlOwotCX0KLQotCVN0cmluZyBhZGRMaW5lQnJlYWtzKFN0cmluZyBtc2csIGludCBtYXhDaGFycykgewotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIiQkJCBERUJVRzogb3JpZ2luYWwgbWVzc2FnZSA9ICIgKyBtc2cpOwotCi0JCWlmIChtc2cgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCVN0cmluZ0J1ZmZlciBzdHJCdWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWludCBjb3VudCA9IDA7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbXNnLmxlbmd0aCgpOyBpKyspIHsKLQkJCXN0ckJ1Zi5hcHBlbmQobXNnLmNoYXJBdChpKSk7Ci0JCQlpZiAoQ2hhcmFjdGVyLmlzV2hpdGVzcGFjZShtc2cuY2hhckF0KGkpKSkKLQkJCQljb3VudCA9IDA7Ci0JCQllbHNlCi0JCQkJY291bnQrKzsKLQotCQkJaWYgKGNvdW50ID49IG1heENoYXJzKSB7Ci0JCQkJaWYgKCFDaGFyYWN0ZXIuaXNXaGl0ZXNwYWNlKG1zZy5jaGFyQXQoaSkpKSB7Ci0JCQkJCXN0ckJ1Zi5hcHBlbmQoIlxuIik7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQkJY291bnQgPSAwOwotCQkJfQotCQl9Ci0KLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCIkJCQgREVCVUc6IGJyb2tlbiBtZXNzYWdlID0gIiArCi0JCS8vIHN0ckJ1Zi50b1N0cmluZygpKTsKLQkJcmV0dXJuIHN0ckJ1Zi50b1N0cmluZygpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBvcGVuQ29uZmlybShTaGVsbCBwYXJlbnQsIFN0cmluZyB0aXRsZSwgU3RyaW5nIG1lc3NhZ2UpIHsKLQkJV3JhcHBlZE1lc3NhZ2VEaWFsb2cgZGlhbG9nID0gbmV3IFdyYXBwZWRNZXNzYWdlRGlhbG9nKHBhcmVudCwgdGl0bGUsCi0JCQkJbnVsbCwgLy8gYWNjZXB0Ci0JCQkJLy8gdGhlCi0JCQkJLy8gZGVmYXVsdAotCQkJCS8vIHdpbmRvdwotCQkJCS8vIGljb24KLQkJCQltZXNzYWdlLCBRVUVTVElPTiwgbmV3IFN0cmluZ1tdIHsgSURpYWxvZ0NvbnN0YW50cy5PS19MQUJFTCwKLQkJCQkJCUlEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0xBQkVMIH0sIDApOyAvLyBPSyBpcyB0aGUKLQkJLy8gZGVmYXVsdAotCQlyZXR1cm4gZGlhbG9nLm9wZW4oKSA9PSAwOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBvcGVuRXJyb3IoU2hlbGwgcGFyZW50LCBTdHJpbmcgdGl0bGUsIFN0cmluZyBtZXNzYWdlKSB7Ci0JCVdyYXBwZWRNZXNzYWdlRGlhbG9nIGRpYWxvZyA9IG5ldyBXcmFwcGVkTWVzc2FnZURpYWxvZyhwYXJlbnQsIHRpdGxlLAotCQkJCW51bGwsIC8vIGFjY2VwdAotCQkJCS8vIHRoZQotCQkJCS8vIGRlZmF1bHQKLQkJCQkvLyB3aW5kb3cKLQkJCQkvLyBpY29uCi0JCQkJbWVzc2FnZSwgRVJST1IsIG5ldyBTdHJpbmdbXSB7IElEaWFsb2dDb25zdGFudHMuT0tfTEFCRUwgfSwgMCk7IC8vIG9rCi0JCS8vIGlzCi0JCS8vIHRoZQotCQkvLyBkZWZhdWx0Ci0JCWRpYWxvZy5vcGVuKCk7Ci0JCXJldHVybjsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgb3BlbkluZm9ybWF0aW9uKFNoZWxsIHBhcmVudCwgU3RyaW5nIHRpdGxlLAotCQkJU3RyaW5nIG1lc3NhZ2UpIHsKLQkJV3JhcHBlZE1lc3NhZ2VEaWFsb2cgZGlhbG9nID0gbmV3IFdyYXBwZWRNZXNzYWdlRGlhbG9nKHBhcmVudCwgdGl0bGUsCi0JCQkJbnVsbCwgLy8gYWNjZXB0Ci0JCQkJLy8gdGhlCi0JCQkJLy8gZGVmYXVsdAotCQkJCS8vIHdpbmRvdwotCQkJCS8vIGljb24KLQkJCQltZXNzYWdlLCBJTkZPUk1BVElPTiwKLQkJCQluZXcgU3RyaW5nW10geyBJRGlhbG9nQ29uc3RhbnRzLk9LX0xBQkVMIH0sIDApOwotCQkvLyBvayBpcyB0aGUgZGVmYXVsdAotCQlkaWFsb2cub3BlbigpOwotCQlyZXR1cm47Ci0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIG9wZW5RdWVzdGlvbihTaGVsbCBwYXJlbnQsIFN0cmluZyB0aXRsZSwKLQkJCVN0cmluZyBtZXNzYWdlKSB7Ci0JCVdyYXBwZWRNZXNzYWdlRGlhbG9nIGRpYWxvZyA9IG5ldyBXcmFwcGVkTWVzc2FnZURpYWxvZyhwYXJlbnQsIHRpdGxlLAotCQkJCW51bGwsIC8vIGFjY2VwdAotCQkJCS8vIHRoZQotCQkJCS8vIGRlZmF1bHQKLQkJCQkvLyB3aW5kb3cKLQkJCQkvLyBpY29uCi0JCQkJbWVzc2FnZSwgUVVFU1RJT04sIG5ldyBTdHJpbmdbXSB7IElEaWFsb2dDb25zdGFudHMuWUVTX0xBQkVMLAotCQkJCQkJSURpYWxvZ0NvbnN0YW50cy5OT19MQUJFTCB9LCAwKTsgLy8geWVzIGlzIHRoZQotCQkvLyBkZWZhdWx0Ci0JCXJldHVybiBkaWFsb2cub3BlbigpID09IDA7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIG9wZW5XYXJuaW5nKFNoZWxsIHBhcmVudCwgU3RyaW5nIHRpdGxlLCBTdHJpbmcgbWVzc2FnZSkgewotCQlXcmFwcGVkTWVzc2FnZURpYWxvZyBkaWFsb2cgPSBuZXcgV3JhcHBlZE1lc3NhZ2VEaWFsb2cocGFyZW50LCB0aXRsZSwKLQkJCQludWxsLCAvLyBhY2NlcHQKLQkJCQkvLyB0aGUKLQkJCQkvLyBkZWZhdWx0Ci0JCQkJLy8gd2luZG93Ci0JCQkJLy8gaWNvbgotCQkJCW1lc3NhZ2UsIFdBUk5JTkcsIG5ldyBTdHJpbmdbXSB7IElEaWFsb2dDb25zdGFudHMuT0tfTEFCRUwgfSwgMCk7IC8vIG9rCi0JCS8vIGlzCi0JCS8vIHRoZQotCQkvLyBkZWZhdWx0Ci0JCWRpYWxvZy5vcGVuKCk7Ci0JCXJldHVybjsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLndpbjMyLndpbjMyLng4Ni8uY2xhc3NwYXRoIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi53aW4zMi53aW4zMi54ODYvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzUxYzhmMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLndpbjMyLndpbjMyLng4Ni8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi53aW4zMi53aW4zMi54ODYvLnByb2plY3QgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLndpbjMyLndpbjMyLng4Ni8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmY5YTQzNy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLndpbjMyLndpbjMyLng4Ni8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmVwZi5jb21tb24ud2luMzIud2luMzIueDg2PC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24ud2luMzIud2luMzIueDg2L01FVEEtSU5GL01BTklGRVNULk1GIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi53aW4zMi53aW4zMi54ODYvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2M2M5ZDEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi53aW4zMi53aW4zMi54ODYvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi53aW4zMi53aW4zMi54ODYKLUJ1bmRsZS1WZXJzaW9uOiAxLjUuMC5xdWFsaWZpZXIKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLnN3dAotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotRWNsaXBzZS1QbGF0Zm9ybUZpbHRlcjogKCYgKG9zZ2kud3M9d2luMzIpIChvc2dpLm9zPXdpbjMyKSAob3NnaS5hcmNoPXg4NikpCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24ud2luMzIud2luMzIueDg2L2J1aWxkLnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLndpbjMyLndpbjMyLng4Ni9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYTFhMDA4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24ud2luMzIud2luMzIueDg2L2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLXNvdXJjZS4uID0gc3JjLwotb3V0cHV0Li4gPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgLixcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcwpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi53aW4zMi53aW4zMi54ODYvcGx1Z2luLnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLndpbjMyLndpbjMyLng4Ni9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDA3ZjY2My4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLndpbjMyLndpbjMyLng4Ni9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSCi0KLSMgUGx1Zy1pbgotcGx1Z2luTmFtZT1FUEYgV2luMzIgQ29tbW9uCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24ud2luMzIud2luMzIueDg2L3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3dpbjMyL1dpbjMySFRNTFRyYW5zZmVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLndpbjMyLndpbjMyLng4Ni9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi93aW4zMi9XaW4zMkhUTUxUcmFuc2Zlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMjUzOGJjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24ud2luMzIud2luMzIueDg2L3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3dpbjMyL1dpbjMySFRNTFRyYW5zZmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi53aW4zMjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuQnl0ZUFycmF5VHJhbnNmZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5ETkQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5UcmFuc2ZlckRhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmludGVybmFsLm9sZS53aW4zMi5DT007Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmludGVybmFsLm9sZS53aW4zMi5GT1JNQVRFVEM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmludGVybmFsLm9sZS53aW4zMi5JRGF0YU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuaW50ZXJuYWwub2xlLndpbjMyLlNUR01FRElVTTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuaW50ZXJuYWwud2luMzIuT1M7Ci0KLS8qKgotICogVGhlIGNsYXNzIDxjb2RlPkhUTUxUcmFuc2ZlcjwvY29kZT4gcHJvdmlkZXMgYSBwbGF0Zm9ybSBzcGVjaWZpYyBtZWNoYW5pc20KLSAqIGZvciBjb252ZXJ0aW5nIHRleHQgaW4gSFRNTCBmb3JtYXQgcmVwcmVzZW50ZWQgYXMgYSBqYXZhIDxjb2RlPlN0cmluZzwvY29kZT4KLSAqIHRvIGEgcGxhdGZvcm0gc3BlY2lmaWMgcmVwcmVzZW50YXRpb24gb2YgdGhlIGRhdGEgYW5kIHZpY2UgdmVyc2EuIFNlZQotICogPGNvZGU+VHJhbnNmZXI8L2NvZGU+IGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uLgotICogCi0gKiA8cD4KLSAqIEFuIGV4YW1wbGUgb2YgYSBqYXZhIDxjb2RlPlN0cmluZzwvY29kZT4gY29udGFpbmluZyBIVE1MIHRleHQgaXMgc2hvd24KLSAqIGJlbG93OgotICogPC9wPgotICogCi0gKiA8Y29kZT48cHJlPgotICogICAgICAgU3RyaW5nIGh0bWxEYXRhID0gJnF1b3Q7Ci0gKiA8cD4KLSAqICBUaGlzIGlzIGEgcGFyYWdyYXBoIG9mIHRleHQuCi0gKiA8L3A+Ci0gKiAgJnF1b3Q7OwotICogPC9jb2RlPjwvcHJlPgotICovCi1wdWJsaWMgY2xhc3MgV2luMzJIVE1MVHJhbnNmZXIgZXh0ZW5kcyBCeXRlQXJyYXlUcmFuc2ZlciB7Ci0KLQlzdGF0aWMgV2luMzJIVE1MVHJhbnNmZXIgX2luc3RhbmNlID0gbmV3IFdpbjMySFRNTFRyYW5zZmVyKCk7Ci0KLQlzdGF0aWMgZmluYWwgU3RyaW5nIEhUTUxfRk9STUFUID0gIkhUTUwgRm9ybWF0IjsgLy8kTk9OLU5MUy0xJAotCi0Jc3RhdGljIGZpbmFsIGludCBIVE1MX0ZPUk1BVElEID0gcmVnaXN0ZXJUeXBlKEhUTUxfRk9STUFUKTsKLQotCXN0YXRpYyBmaW5hbCBTdHJpbmcgTlVNQkVSID0gIjAwMDAwMDAwIjsgLy8kTk9OLU5MUy0xJAotCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBIRUFERVIgPSAiVmVyc2lvbjowLjlcclxuU3RhcnRIVE1MOiIgKyBOVU1CRVIgLy8kTk9OLU5MUy0xJAotCQkJKyAiXHJcbkVuZEhUTUw6IiArIE5VTUJFUiArICJcclxuU3RhcnRGcmFnbWVudDoiICsgTlVNQkVSIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJKyAiXHJcbkVuZEZyYWdtZW50OiIgKyBOVU1CRVIgKyAiXHJcbiI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGSVggPSAiPGh0bWw+PGJvZHk+PCEtLVN0YXJ0RnJhZ21lbnQtLT4iOyAvLyROT04tTkxTLTEkCi0KLQlzdGF0aWMgZmluYWwgU3RyaW5nIFNVRkZJWCA9ICI8IS0tRW5kRnJhZ21lbnQtLT48L2JvZHk+PC9odG1sPiI7IC8vJE5PTi1OTFMtMSQKLQotCXN0YXRpYyBmaW5hbCBTdHJpbmcgU3RhcnRGcmFnbWVudCA9ICJTdGFydEZyYWdtZW50OiI7IC8vJE5PTi1OTFMtMSQKLQotCXN0YXRpYyBmaW5hbCBTdHJpbmcgRW5kRnJhZ21lbnQgPSAiRW5kRnJhZ21lbnQ6IjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIFdpbjMySFRNTFRyYW5zZmVyKCkgewotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgSFRNTFRyYW5zZmVyIGNsYXNzLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgSFRNTFRyYW5zZmVyIGNsYXNzCi0JICovCi0JcHVibGljIHN0YXRpYyBXaW4zMkhUTUxUcmFuc2ZlciBnZXRJbnN0YW5jZSgpIHsKLQkJcmV0dXJuIF9pbnN0YW5jZTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIG9mIDxjb2RlPmphdmFUb05hdGl2ZTwvY29kZT4gY29udmVydHMKLQkgKiBIVE1MLWZvcm1hdHRlZCB0ZXh0IHJlcHJlc2VudGVkIGJ5IGEgamF2YSA8Y29kZT5TdHJpbmc8L2NvZGU+IHRvIGEKLQkgKiBwbGF0Zm9ybSBzcGVjaWZpYyByZXByZXNlbnRhdGlvbi4gRm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gc2VlCi0JICogPGNvZGU+VHJhbnNmZXIjamF2YVRvTmF0aXZlPC9jb2RlPi4KLQkgKiAKLQkgKiBAcGFyYW0gb2JqZWN0Ci0JICogICAgICAgICAgICBhIGphdmEgPGNvZGU+U3RyaW5nPC9jb2RlPiBjb250YWluaW5nIEhUTUwgdGV4dAotCSAqIEBwYXJhbSB0cmFuc2ZlckRhdGEKLQkgKiAgICAgICAgICAgIGFuIGVtcHR5IDxjb2RlPlRyYW5zZmVyRGF0YTwvY29kZT4gb2JqZWN0OyB0aGlzIG9iamVjdCB3aWxsCi0JICogICAgICAgICAgICBiZSBmaWxsZWQgaW4gb24gcmV0dXJuIHdpdGggdGhlIHBsYXRmb3JtIHNwZWNpZmljIGZvcm1hdCBvZgotCSAqICAgICAgICAgICAgdGhlIGRhdGEKLQkgKi8KLQlwdWJsaWMgdm9pZCBqYXZhVG9OYXRpdmUoT2JqZWN0IG9iamVjdCwgVHJhbnNmZXJEYXRhIHRyYW5zZmVyRGF0YSkgewotCQlpZiAoIWNoZWNrSFRNTChvYmplY3QpIHx8ICFpc1N1cHBvcnRlZFR5cGUodHJhbnNmZXJEYXRhKSkgewotCQkJRE5ELmVycm9yKERORC5FUlJPUl9JTlZBTElEX0RBVEEpOwotCQl9Ci0JCVN0cmluZyBzdHJpbmcgPSAoU3RyaW5nKSBvYmplY3Q7Ci0JCWludCBjb3VudCA9IHN0cmluZy5sZW5ndGgoKTsKLQkJY2hhcltdIGNoYXJzID0gbmV3IGNoYXJbY291bnQgKyAxXTsKLQkJc3RyaW5nLmdldENoYXJzKDAsIGNvdW50LCBjaGFycywgMCk7Ci0JCWludCBjb2RlUGFnZSA9IE9TLkdldEFDUCgpOwotCQlpbnQgY2NoTXVsdGlCeXRlID0gT1MuV2lkZUNoYXJUb011bHRpQnl0ZShjb2RlUGFnZSwgMCwgY2hhcnMsIC0xLCBudWxsLAotCQkJCTAsIG51bGwsIG51bGwpOwotCQlpZiAoY2NoTXVsdGlCeXRlID09IDApIHsKLQkJCXRyYW5zZmVyRGF0YS5zdGdtZWRpdW0gPSBuZXcgU1RHTUVESVVNKCk7Ci0JCQl0cmFuc2ZlckRhdGEucmVzdWx0ID0gQ09NLkRWX0VfU1RHTUVESVVNOwotCQkJcmV0dXJuOwotCQl9Ci0JCWludCBzdGFydEhUTUwgPSBIRUFERVIubGVuZ3RoKCk7Ci0JCWludCBzdGFydEZyYWdtZW50ID0gc3RhcnRIVE1MICsgUFJFRklYLmxlbmd0aCgpOwotCQlpbnQgZW5kRnJhZ21lbnQgPSBzdGFydEZyYWdtZW50ICsgY2NoTXVsdGlCeXRlIC0gMTsKLQkJaW50IGVuZEhUTUwgPSBlbmRGcmFnbWVudCArIFNVRkZJWC5sZW5ndGgoKTsKLQotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcihIRUFERVIpOwotCQlpbnQgbWF4TGVuZ3RoID0gTlVNQkVSLmxlbmd0aCgpOwotCQkvLyBzdGFydEhUTUwKLQkJaW50IHN0YXJ0ID0gYnVmZmVyLnRvU3RyaW5nKCkuaW5kZXhPZihOVU1CRVIpOwotCQlTdHJpbmcgdGVtcCA9IEludGVnZXIudG9TdHJpbmcoc3RhcnRIVE1MKTsKLQkJYnVmZmVyLnJlcGxhY2Uoc3RhcnQgKyBtYXhMZW5ndGggLSB0ZW1wLmxlbmd0aCgpLCBzdGFydCArIG1heExlbmd0aCwKLQkJCQl0ZW1wKTsKLQkJLy8gZW5kSFRNTAotCQlzdGFydCA9IGJ1ZmZlci50b1N0cmluZygpLmluZGV4T2YoTlVNQkVSLCBzdGFydCk7Ci0JCXRlbXAgPSBJbnRlZ2VyLnRvU3RyaW5nKGVuZEhUTUwpOwotCQlidWZmZXIucmVwbGFjZShzdGFydCArIG1heExlbmd0aCAtIHRlbXAubGVuZ3RoKCksIHN0YXJ0ICsgbWF4TGVuZ3RoLAotCQkJCXRlbXApOwotCQkvLyBzdGFydEZyYWdtZW50Ci0JCXN0YXJ0ID0gYnVmZmVyLnRvU3RyaW5nKCkuaW5kZXhPZihOVU1CRVIsIHN0YXJ0KTsKLQkJdGVtcCA9IEludGVnZXIudG9TdHJpbmcoc3RhcnRGcmFnbWVudCk7Ci0JCWJ1ZmZlci5yZXBsYWNlKHN0YXJ0ICsgbWF4TGVuZ3RoIC0gdGVtcC5sZW5ndGgoKSwgc3RhcnQgKyBtYXhMZW5ndGgsCi0JCQkJdGVtcCk7Ci0JCS8vIGVuZEZyYWdtZW50Ci0JCXN0YXJ0ID0gYnVmZmVyLnRvU3RyaW5nKCkuaW5kZXhPZihOVU1CRVIsIHN0YXJ0KTsKLQkJdGVtcCA9IEludGVnZXIudG9TdHJpbmcoZW5kRnJhZ21lbnQpOwotCQlidWZmZXIucmVwbGFjZShzdGFydCArIG1heExlbmd0aCAtIHRlbXAubGVuZ3RoKCksIHN0YXJ0ICsgbWF4TGVuZ3RoLAotCQkJCXRlbXApOwotCi0JCWJ1ZmZlci5hcHBlbmQoUFJFRklYKTsKLQkJYnVmZmVyLmFwcGVuZChzdHJpbmcpOwotCQlidWZmZXIuYXBwZW5kKFNVRkZJWCk7Ci0KLQkJY291bnQgPSBidWZmZXIubGVuZ3RoKCk7Ci0JCWNoYXJzID0gbmV3IGNoYXJbY291bnQgKyAxXTsKLQkJYnVmZmVyLmdldENoYXJzKDAsIGNvdW50LCBjaGFycywgMCk7Ci0JCWNjaE11bHRpQnl0ZSA9IE9TLldpZGVDaGFyVG9NdWx0aUJ5dGUoY29kZVBhZ2UsIDAsIGNoYXJzLCAtMSwgbnVsbCwgMCwKLQkJCQludWxsLCBudWxsKTsKLQkJaW50IGxwTXVsdGlCeXRlU3RyID0gT1MuR2xvYmFsQWxsb2MoT1MuR01FTV9GSVhFRCB8IE9TLkdNRU1fWkVST0lOSVQsCi0JCQkJY2NoTXVsdGlCeXRlKTsKLQkJT1MuV2lkZUNoYXJUb011bHRpQnl0ZShjb2RlUGFnZSwgMCwgY2hhcnMsIC0xLCBscE11bHRpQnl0ZVN0ciwKLQkJCQljY2hNdWx0aUJ5dGUsIG51bGwsIG51bGwpOwotCQl0cmFuc2ZlckRhdGEuc3RnbWVkaXVtID0gbmV3IFNUR01FRElVTSgpOwotCQl0cmFuc2ZlckRhdGEuc3RnbWVkaXVtLnR5bWVkID0gQ09NLlRZTUVEX0hHTE9CQUw7Ci0JCXRyYW5zZmVyRGF0YS5zdGdtZWRpdW0udW5pb25GaWVsZCA9IGxwTXVsdGlCeXRlU3RyOwotCQl0cmFuc2ZlckRhdGEuc3RnbWVkaXVtLnBVbmtGb3JSZWxlYXNlID0gMDsKLQkJdHJhbnNmZXJEYXRhLnJlc3VsdCA9IENPTS5TX09LOwotCQlyZXR1cm47Ci0JfQotCi0JLyoqCi0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiBvZiA8Y29kZT5uYXRpdmVUb0phdmE8L2NvZGU+IGNvbnZlcnRzIGEgcGxhdGZvcm0KLQkgKiBzcGVjaWZpYyByZXByZXNlbnRhdGlvbiBvZiBIVE1MIHRleHQgdG8gYSBqYXZhIDxjb2RlPlN0cmluZzwvY29kZT4uCi0JICogRm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gc2VlIDxjb2RlPlRyYW5zZmVyI25hdGl2ZVRvSmF2YTwvY29kZT4uCi0JICogCi0JICogQHBhcmFtIHRyYW5zZmVyRGF0YQotCSAqICAgICAgICAgICAgdGhlIHBsYXRmb3JtIHNwZWNpZmljIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBkYXRhIHRvIGJlIGJlZW4KLQkgKiAgICAgICAgICAgIGNvbnZlcnRlZAotCSAqIEByZXR1cm4gYSBqYXZhIDxjb2RlPlN0cmluZzwvY29kZT4gY29udGFpbmluZyBIVE1MIHRleHQgaWYgdGhlCi0JICogICAgICAgICBjb252ZXJzaW9uIHdhcyBzdWNjZXNzZnVsOyBvdGhlcndpc2UgbnVsbAotCSAqLwotCXB1YmxpYyBPYmplY3QgbmF0aXZlVG9KYXZhKFRyYW5zZmVyRGF0YSB0cmFuc2ZlckRhdGEpIHsKLQkJaWYgKCFpc1N1cHBvcnRlZFR5cGUodHJhbnNmZXJEYXRhKSB8fCB0cmFuc2ZlckRhdGEucElEYXRhT2JqZWN0ID09IDApCi0JCQlyZXR1cm4gbnVsbDsKLQkJSURhdGFPYmplY3QgZGF0YSA9IG5ldyBJRGF0YU9iamVjdCh0cmFuc2ZlckRhdGEucElEYXRhT2JqZWN0KTsKLQkJZGF0YS5BZGRSZWYoKTsKLQkJU1RHTUVESVVNIHN0Z21lZGl1bSA9IG5ldyBTVEdNRURJVU0oKTsKLQkJRk9STUFURVRDIGZvcm1hdGV0YyA9IHRyYW5zZmVyRGF0YS5mb3JtYXRldGM7Ci0JCXN0Z21lZGl1bS50eW1lZCA9IENPTS5UWU1FRF9IR0xPQkFMOwotCQl0cmFuc2ZlckRhdGEucmVzdWx0ID0gZGF0YS5HZXREYXRhKGZvcm1hdGV0Yywgc3RnbWVkaXVtKTsKLQkJZGF0YS5SZWxlYXNlKCk7Ci0JCWlmICh0cmFuc2ZlckRhdGEucmVzdWx0ICE9IENPTS5TX09LKQotCQkJcmV0dXJuIG51bGw7Ci0JCWludCBoTWVtID0gc3RnbWVkaXVtLnVuaW9uRmllbGQ7Ci0KLQkJdHJ5IHsKLQkJCWludCBscE11bHRpQnl0ZVN0ciA9IE9TLkdsb2JhbExvY2soaE1lbSk7Ci0JCQlpZiAobHBNdWx0aUJ5dGVTdHIgPT0gMCkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJaW50IGNvZGVQYWdlID0gT1MuR2V0QUNQKCk7Ci0JCQkJaW50IGNjaFdpZGVDaGFyID0gT1MuTXVsdGlCeXRlVG9XaWRlQ2hhcihjb2RlUGFnZSwKLQkJCQkJCU9TLk1CX1BSRUNPTVBPU0VELCBscE11bHRpQnl0ZVN0ciwgLTEsIG51bGwsIDApOwotCQkJCWlmIChjY2hXaWRlQ2hhciA9PSAwKQotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQljaGFyW10gbHBXaWRlQ2hhclN0ciA9IG5ldyBjaGFyW2NjaFdpZGVDaGFyIC0gMV07Ci0JCQkJT1MKLQkJCQkJCS5NdWx0aUJ5dGVUb1dpZGVDaGFyKGNvZGVQYWdlLCBPUy5NQl9QUkVDT01QT1NFRCwKLQkJCQkJCQkJbHBNdWx0aUJ5dGVTdHIsIC0xLCBscFdpZGVDaGFyU3RyLAotCQkJCQkJCQlscFdpZGVDaGFyU3RyLmxlbmd0aCk7Ci0JCQkJcmV0dXJuIG5ldyBTdHJpbmcobHBXaWRlQ2hhclN0cik7Ci0JCQl9IGZpbmFsbHkgewotCQkJCU9TLkdsb2JhbFVubG9jayhoTWVtKTsKLQkJCX0KLQkJfSBmaW5hbGx5IHsKLQkJCU9TLkdsb2JhbEZyZWUoaE1lbSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgaW50W10gZ2V0VHlwZUlkcygpIHsKLQkJcmV0dXJuIG5ldyBpbnRbXSB7IEhUTUxfRk9STUFUSUQgfTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nW10gZ2V0VHlwZU5hbWVzKCkgewotCQlyZXR1cm4gbmV3IFN0cmluZ1tdIHsgSFRNTF9GT1JNQVQgfTsKLQl9Ci0KLQlib29sZWFuIGNoZWNrSFRNTChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiAob2JqZWN0ICE9IG51bGwgJiYgb2JqZWN0IGluc3RhbmNlb2YgU3RyaW5nICYmICgoU3RyaW5nKSBvYmplY3QpCi0JCQkJLmxlbmd0aCgpID4gMCk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gdmFsaWRhdGUoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gY2hlY2tIVE1MKG9iamVjdCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi53aW4zMi53aW4zMi54ODYvc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vd2luMzIvcGFja2FnZS5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi53aW4zMi53aW4zMi54ODYvc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vd2luMzIvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YzU0ZTc3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24ud2luMzIud2luMzIueDg2L3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3dpbjMyL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIHdpbmRvd3Mtc3BlY2lmaWMgY2xpcGJvYXJkIHRyYW5zZmVyIHNlcnZpY2VzLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vLmNkdHByb2plY3QgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLy5jZHRwcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMWRjZTBjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vLmNkdHByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UtY2R0IHZlcnNpb249IjIuMCI/PgotCi08Y2R0cHJvamVjdD4KLTxkYXRhLz4KLTwvY2R0cHJvamVjdD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vLmNsYXNzcGF0aCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjMyNzc4Yi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJsaWIiIHBhdGg9ImxpYi9qdGlkeS04LjAtMjAwNjA4MDEuMTMxMDU5LTMuamFyIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vLm9wdGlvbnMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLy5vcHRpb25zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OWYxNWYwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vLm9wdGlvbnMKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLSMgVHVybiBvbiBkZWJ1ZyB0cmFjZSBmb3IgdGhlIENvbW1vbiBwbHVnLWluCi1vcmcuZWNsaXBzZS5lcGYuY29tbW9uL2RlYnVnPXRydWUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vLnByb2plY3QgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZjVkZDU5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5lcGYuY29tbW9uPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMWZhNzA3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuZXBmLmNvbW1vbjtzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjUuMC5xdWFsaWZpZXIKLUJ1bmRsZS1DbGFzc1BhdGg6IGNvbW1vbi5qYXIsIGxpYi9qdGlkeS04LjAtMjAwNjA4MDEuMTMxMDU5LTMuamFyCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLkNvbW1vblBsdWdpbgotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1SZXF1aXJlLUJ1bmRsZTogY29tLmlibS5pY3U7dmlzaWJpbGl0eTo9cmVleHBvcnQsCi0gb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXM7dmlzaWJpbGl0eTo9cmVleHBvcnQsCi0gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lO3Zpc2liaWxpdHk6PXJlZXhwb3J0LAotIG9yZy5hcGFjaGUuYW50O3Zpc2liaWxpdHk6PXJlZXhwb3J0Ci1FY2xpcHNlLUxhenlTdGFydDogdHJ1ZQotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmVwZi5jb21tb24sCi0gb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5odG1sLAotIG9yZy5lY2xpcHNlLmVwZi5jb21tb24ucHJlZmVyZW5jZXMsCi0gb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5zZXJ2aWNlYWJpbGl0eSwKLSBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLAotIG9yZy5lY2xpcHNlLmVwZi5jb21tb24ueG1sCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjUKLQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9hYm91dC5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYjQxYmY0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iPgotPGh0bWw+Ci0KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08TUVUQSBuYW1lPSJHRU5FUkFUT1IiIGNvbnRlbnQ9IklCTSBXZWJTcGhlcmUgU3R1ZGlvIj4KLTx0aXRsZT5QbHVnLWluIExpY2Vuc2UgQWdyZWVtZW50PC90aXRsZT4KLTwvaGVhZD4KLQotPGJvZHk+Ci0KLTxoMz5QbHVnLWluIExpY2Vuc2UgQWdyZWVtZW50PC9oMz4KLQotPHA+VXNlIG9mIHRoaXMgUGx1Zy1pbiBpcyBzdWJqZWN0IHRvIHRoZSBzYW1lIHRlcm1zIGFuZCBjb25kaXRpb25zIHdoaWNoIGdvdmVybiB0aGUgdXNlIG9mIHRoZSBQcm9kdWN0IHdoaWNoIGluY2x1ZGVkIHRoaXMgUGx1Zy1pbi48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL2J1aWxkLnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkODI3NTAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1zb3VyY2UuY29tbW9uLmphciA9IHNyYy8KLW91dHB1dC5jb21tb24uamFyID0gYmluLwotYmluLmluY2x1ZGVzID0gY29tbW9uLmphcixcCi0gICAgICAgICAgICAgICBsaWIvLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vbGliL2p0aWR5LTguMC0yMDA2MDgwMS4xMzEwNTktMy5qYXIgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL2xpYi9qdGlkeS04LjAtMjAwNjA4MDEuMTMxMDU5LTMuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YzZkNGEwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vbGliL2p0aWR5LTguMC0yMDA2MDgwMS4xMzEwNTktMy5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3BsdWdpbi5wcm9wZXJ0aWVzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzIwZmU5YS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLQotIyBQbHVnLWluCi1wbHVnaW5OYW1lPUVQRiBDb21tb24KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9wbHVnaW4ueG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNjMxZTMwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTxwbHVnaW4+Ci0gICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJtYXJrZXJBdHRyaWJ1dGVDb250cmlidXRlciIgbmFtZT0iTWFya2VyQXR0cmlidXRlQ29udHJpYnV0ZXIiIHNjaGVtYT0ic2NoZW1hL21hcmtlckF0dHJpYnV0ZUNvbnRyaWJ1dGVyLmV4c2QiLz4KLSAgIDxleHRlbnNpb24tcG9pbnQgaWQ9Im9iamVjdEZhY3RvcnkiIG5hbWU9Ik9iamVjdEZhY3RvcnkiIHNjaGVtYT0ic2NoZW1hL29iamVjdEZhY3RvcnkuZXhzZCIvPgotCi08L3BsdWdpbj4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc2NoZW1hL21hcmtlckF0dHJpYnV0ZUNvbnRyaWJ1dGVyLmV4c2QgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NjaGVtYS9tYXJrZXJBdHRyaWJ1dGVDb250cmlidXRlci5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZGNhOGZkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc2NoZW1hL21hcmtlckF0dHJpYnV0ZUNvbnRyaWJ1dGVyLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2UuZXBmLmNvbW1vbiI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2UuZXBmLmNvbW1vbiIgaWQ9Im1hcmtlckF0dHJpYnV0ZUNvbnRyaWJ1dGVyIiBuYW1lPSJNYXJrZXJBdHRyaWJ1dGVDb250cmlidXRlciIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBBbGxvdyBhZGRpbmcgYWRkdGlvbmFsIGF0dHJpYnV0ZXMgdG8gbWFya2VycyBnZW5lcmF0ZWQgZnJvbSBFUEYKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0ibWFya2VyQXR0cmlidXRlQ29udHJpYnV0ZXIiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSB0cmFuc2xhdGFibGU9InRydWUiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0ibWFya2VyQXR0cmlidXRlQ29udHJpYnV0ZXIiPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgMS41Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBleHRlbnNpb24gcG9pbnQgdXNhZ2UgZXhhbXBsZSBoZXJlLl0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLklNYXJrZXJBdHRyaWJ1dGVDb250cmlidXRlcgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgaW5mb3JtYXRpb24gYWJvdXQgc3VwcGxpZWQgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBleHRlbnNpb24gcG9pbnQuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotPC9zY2hlbWE+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NjaGVtYS9vYmplY3RGYWN0b3J5LmV4c2QgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NjaGVtYS9vYmplY3RGYWN0b3J5LmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmYzNkNWIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zY2hlbWEvb2JqZWN0RmFjdG9yeS5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTAyICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLmVwZi5jb21tb24iPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLmVwZi5jb21tb24iIGlkPSJvYmplY3RGYWN0b3J5IiBuYW1lPSJPYmplY3RGYWN0b3J5Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIEFsbG93IHRvIGNyZWF0ZSBvYmplY3QgdGhyb3VnaCB0aGUgZXh0ZW5zaW9uCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9Im9iamVjdEZhY3RvcnkiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSB0cmFuc2xhdGFibGU9InRydWUiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0ib2JqZWN0RmFjdG9yeSI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAxLjUKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIGV4dGVuc2lvbiBwb2ludCB1c2FnZSBleGFtcGxlIGhlcmUuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIHBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5JT2JqZWN0RmFjdG9yeQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgaW5mb3JtYXRpb24gYWJvdXQgc3VwcGxpZWQgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBleHRlbnNpb24gcG9pbnQuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi9BYnN0cmFjdEFjdGl2YXRvci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi9BYnN0cmFjdEFjdGl2YXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYmIxNzNiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vQWJzdHJhY3RBY3RpdmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxOCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuY29tbW9uOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJJOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmludGVybmFsLnJ1bnRpbWUuSW50ZXJuYWxQbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuRmlsZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5wcmVmZXJlbmNlcy5JUHJlZmVyZW5jZVN0b3JlV3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnNlcnZpY2VhYmlsaXR5LkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLkZpbGVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuSTE4blV0aWw7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotLyoqCi0gKiBUaGUgYWJzdHJhY3QgYmFzZSBjbGFzcyBmb3IgYWxsIEVQRiBwbHVnLWlucy4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0QWN0aXZhdG9yIGV4dGVuZHMgUGx1Z2luIGltcGxlbWVudHMgSUFjdGl2YXRvciB7Ci0KLQkvLyBUaGUgcmVsYXRpdmUgcGF0aCB0byB0aGUgaWNvbnMuCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElDT05fUEFUSCA9ICJpY29ucy8iOyAvLyROT04tTkxTLTEkOwotCi0JLy8gVGhlIGxvZ2dlciBoYXNoIG1hcC4KLQlwcml2YXRlIHN0YXRpYyBNYXA8U3RyaW5nLCBMb2dnZXI+IGxvZ2dlcnMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIExvZ2dlcj4oKTsKLQotCS8vIFRoZSBtZXNzYWdlIGRpYWxvZyBoYXNoIG1hcC4KLQkvL3ByaXZhdGUgc3RhdGljIE1hcDxTdHJpbmcsIE1zZ0RpYWxvZz4gbXNnRGlhbG9ncyA9IG5ldyBIYXNoTWFwPFN0cmluZywgTXNnRGlhbG9nPigpOwotCi0JLy8gVGhlIHNoYXJlZCBpbWFnZSBoYXNoIG1hcC4KLQkvL3ByaXZhdGUgc3RhdGljIE1hcDxTdHJpbmcsIEltYWdlPiBzaGFyZWRJbWFnZXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIEltYWdlPigpOwotCi0JLy8gVGhlIHJlc291cmNlIGJ1bmRsZSBmb3IgdGhpcyBwbHVnLWluLgotCXByaXZhdGUgUmVzb3VyY2VCdW5kbGUgcmVzb3VyY2VCdW5kbGU7Ci0KLQkvLyBUaGlzIHBsdWctaW4gSUQuCi0JcHJpdmF0ZSBTdHJpbmcgcGx1Z2luSWQ7Ci0KLQkvLyBUaGUgcGx1Zy1pbiBpbnN0YWxsIFVSTC4KLQlwcml2YXRlIFVSTCBpbnN0YWxsVVJMOwotCi0JLy8gVGhlIHBsdWctaW4gaW5zdGFsbCBwYXRoLgotCXByaXZhdGUgU3RyaW5nIGluc3RhbGxQYXRoOwotCi0JLy8gVGhlIHBsdWctaW4gaWNvbiBVUkwuCi0JcHJvdGVjdGVkIFVSTCBpY29uVVJMOwotCi0JLy8gVGhlIHByb2ZpbGluZyBmbGFnLgotCXByaXZhdGUgYm9vbGVhbiBwcm9maWxpbmc7Ci0KLQkvKioKLQkgKiBEZWZhdWx0IGNvbnN0cnVjdG9yLgotCSAqLwotCXB1YmxpYyBBYnN0cmFjdEFjdGl2YXRvcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luI3N0YXJ0KEJ1bmRsZUNvbnRleHQpCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RhcnQoY29udGV4dCk7Ci0KLQkJaW5pdChjb250ZXh0KTsKLQotCQkvLyBzZXQgdGhlIAotCQlpZiAoaXNEZWJ1Z2dpbmcoKSkgewotCQkJZ2V0TG9nZ2VyKCkubG9nSW5mbygiU3RhcnRlZCAiICsgcGx1Z2luSWQpOyAvLyROT04tTkxTLTEkCQkJCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luI3N0b3AoQnVuZGxlQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCS8vIEZyZWUgdGhlIHNoYXJlZCBpbWFnZXMuCi0vLwkJZm9yIChJdGVyYXRvciBpbWFnZXMgPSBzaGFyZWRJbWFnZXMudmFsdWVzKCkuaXRlcmF0b3IoKTsgaW1hZ2VzCi0vLwkJCQkuaGFzTmV4dCgpOykgewotLy8JCQlJbWFnZSBpbWFnZSA9IChJbWFnZSkgaW1hZ2VzLm5leHQoKTsKLS8vCQkJaWYgKGltYWdlICE9IG51bGwgJiYgIWltYWdlLmlzRGlzcG9zZWQoKSkgewotLy8JCQkJaW1hZ2UuZGlzcG9zZSgpOwotLy8JCQl9Ci0vLwkJfQotCi0JCXN1cGVyLnN0b3AoY29udGV4dCk7Ci0KLQkJaWYgKGlzRGVidWdnaW5nKCkpIHsKLQkJCWdldExvZ2dlcigpLmxvZ0luZm8oIlN0b3BwZWQgIiArIHBsdWdpbklkKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZXMgdGhpcyBwbHVnLWluLgotCSAqIAotCSAqIEBwYXJhbSBjb250ZXh0Ci0JICogICAgICAgICAgICBUaGUgYnVuZGxlIGNvbnRleHQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQkvLyBHZXQgdGhlIGJ1bmRsZSBmb3IgdGhpcyBwbHVnLWluLgotCQlCdW5kbGUgYnVuZGxlID0gZ2V0QnVuZGxlKCk7Ci0KLQkJLy8gR2V0IHRoZSByZXNvdWNlIGJ1bmRsZSBmb3IgdGhpcyBwbHVnLWluLgotCQlyZXNvdXJjZUJ1bmRsZSA9IFBsYXRmb3JtLmdldFJlc291cmNlQnVuZGxlKGJ1bmRsZSk7Ci0KLQkJLy8gR2V0IHRoZSBJRCBmb3IgdGhpcyBwbHVnLWluLgotCQlwbHVnaW5JZCA9IGJ1bmRsZS5nZXRTeW1ib2xpY05hbWUoKTsKLQotCQlpZiAoaXNEZWJ1Z2dpbmcoKSkgewotCQkJZ2V0TG9nZ2VyKCkubG9nSW5mbygiSW5pdGlhbGl6aW5nICIgKyBwbHVnaW5JZCk7IC8vJE5PTi1OTFMtMSQJCQotCQl9Ci0KLQkJLy8gR2V0IHRoZSBpbnN0YWxsIHBhdGggb2YgdGhpcyBwbHVnLWluLgotCQlpbnN0YWxsVVJMID0gYnVuZGxlLmdldEVudHJ5KCIvIik7IC8vJE5PTi1OTFMtMSQKLQotCQl0cnkgewotCQkJaW5zdGFsbFBhdGggPSBGaWxlTG9jYXRvci5yZXNvbHZlKGluc3RhbGxVUkwpLmdldFBhdGgoKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJaW5zdGFsbFBhdGggPSBQbGF0Zm9ybS5nZXRJbnN0YWxsTG9jYXRpb24oKS5nZXRVUkwoKS5nZXRQYXRoKCk7Ci0JCX0KLQotCQl0cnkgewotCQkJaWNvblVSTCA9IG5ldyBVUkwoaW5zdGFsbFVSTCwgSUNPTl9QQVRIKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQl9Ci0KLQkJU3RyaW5nIHN5bWJvbGljTmFtZSA9IGJ1bmRsZS5nZXRTeW1ib2xpY05hbWUoKTsKLQkJaWYgKHN5bWJvbGljTmFtZSAhPSBudWxsKSB7Ci0JCQlTdHJpbmcga2V5ID0gc3ltYm9saWNOYW1lICsgIi9wcm9maWxpbmciOyAvLyROT04tTkxTLTEkCi0JCQlTdHJpbmcgdmFsdWUgPSBJbnRlcm5hbFBsYXRmb3JtLmdldERlZmF1bHQoKS5nZXRPcHRpb24oa2V5KTsKLQkJCXByb2ZpbGluZyA9IHZhbHVlID09IG51bGwgPyBmYWxzZSA6IHZhbHVlLmVxdWFsc0lnbm9yZUNhc2UoInRydWUiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJaWYgKGlzRGVidWdnaW5nKCkpIHsKLQkJCWdldExvZ2dlcigpLmxvZ0luZm8oCi0JCQkJCSJJbml0aWFsaXplZCAiICsgcGx1Z2luSWQgKyAiLCBpbnN0YWxsUGF0aD0iICsgaW5zdGFsbFBhdGgpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIElEIG9mIHRoaXMgcGx1Zy1pbi4KLQkgKiAKLQkgKiBAcmV0dXJuIFRoZSBJRCBvZiB0aGlzIHBsdWctaW4uCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJcmV0dXJuIHBsdWdpbklkOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGluc3RhbGwgVVJMIG9mIHRoaXMgcGx1Zy1pbi4KLQkgKiAKLQkgKiBAcGFyYW0gVGhlCi0JICogICAgICAgICAgICBpbnN0YWxsIFVSTCBvZiB0aGlzIHBsdWctaW4uCi0JICovCi0JcHVibGljIFVSTCBnZXRJbnN0YWxsVVJMKCkgewotCQlyZXR1cm4gaW5zdGFsbFVSTDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBpbnN0YWxsIHBhdGggb2YgdGhpcyBwbHVnLWluLgotCSAqIAotCSAqIEBwYXJhbSBUaGUKLQkgKiAgICAgICAgICAgIGluc3RhbGwgcGF0aCBvZiB0aGlzIHBsdWctaW4uCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJbnN0YWxsUGF0aCgpIHsKLQkJcmV0dXJuIGluc3RhbGxQYXRoOwotCX0KLQotCS8qKgotCSAqIExvYWRzIGFuZCByZXR1cm5zIHRoZSBsb2NhbGl6ZWQgcHJvcGVydGllcyBvZiBhIEphdmEgcHJvcGVydGllcyBmaWxlLgotCSAqIDxwPgotCSAqIAotCSAqIEBwYXJhbSBwYXRoCi0JICogICAgICAgICAgICBUaGUgcHJvcGVydGllcyBmaWxlIHBhdGggcmVsYXRpdmUgdG8gdGhlIHBsdWctaW4gcm9vdC4KLQkgKiBAcmV0dXJuIEEgPGNvZGU+UHJvcGVydGllczwvY29kZT4gb2JqZWN0LgotCSAqLwotCXB1YmxpYyBQcm9wZXJ0aWVzIGdldFByb3BlcnRpZXMoU3RyaW5nIHBhdGgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCVByb3BlcnRpZXMgcHJvcHMgPSBuZXcgUHJvcGVydGllcygpOwotCQlpZiAocGF0aCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gcHJvcHM7Ci0JCX0KLQotCQlTdHJpbmcgZmlsZVBhdGggPSBnZXRMb2NhbGl6ZWRGaWxlKHBhdGgsIHRydWUpOwotCQlpZiAoZmlsZVBhdGggIT0gbnVsbCkgewotCQkJcHJvcHMubG9hZChuZXcgRmlsZUlucHV0U3RyZWFtKGZpbGVQYXRoKSk7Ci0JCX0KLQotCQlyZXR1cm4gcHJvcHM7Ci0JfQotCi0JLyoqCi0JICogZ2V0IHRoZSBsb2NhbGUgc3BlY2lmaWMgYWJzb2x1dGUgZmlsZSBwYXRoIG5hbWUgb2YgdGhlIGdpdmVuIGZpbGUgaW4gdGhlCi0JICogcGx1Z2luLgotCSAqIAotCSAqIEBwYXJhbSBwYXRoCi0JICogICAgICAgICAgICBUaGUgcHJvcGVydGllcyBmaWxlIHBhdGggcmVsYXRpdmUgdG8gdGhlIHBsdWctaW4gcm9vdC4KLQkgKiBAcmV0dXJuIFN0cmluZyB0aGUgbG9jYWxlIHNwZWNpZmljIGFic29sdXRlIGZpbGUgcGF0aCBuYW1lIG9mIHRoZSBnaXZlbgotCSAqICAgICAgICAgZmlsZS4KLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMb2NhbGl6ZWRGaWxlKFN0cmluZyBwYXRoLCBib29sZWFuIHVzZURlZmF1bHQpCi0JCQl0aHJvd3MgSU9FeGNlcHRpb24gewotCQlTdHJpbmcgZmlsZVBhdGggPSBudWxsOwotCQlTdHJpbmcgZmlsZU5hbWUgPSBGaWxlVXRpbC5nZXRGaWxlTmFtZShwYXRoKTsKLQkJaW50IGluZGV4ID0gcGF0aC5sYXN0SW5kZXhPZihmaWxlTmFtZSk7Ci0JCVN0cmluZyBwYXRoTmFtZSA9IHBhdGguc3Vic3RyaW5nKDAsIGluZGV4KTsKLQotCQlMb2NhbGUgbG9jYWxlID0gTG9jYWxlLmdldERlZmF1bHQoKTsKLQotCQlCdW5kbGUgYnVuZGxlID0gZ2V0QnVuZGxlKCk7Ci0JCUJ1bmRsZVtdIGJ1bmRsZXMgPSBQbGF0Zm9ybS5nZXRGcmFnbWVudHMoYnVuZGxlKTsKLQkJaWYgKGJ1bmRsZXMgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBidW5kbGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJVVJMIGVudHJ5ID0gYnVuZGxlc1tpXS5nZXRFbnRyeShwYXRoTmFtZSk7Ci0JCQkJaWYgKGVudHJ5ICE9IG51bGwpIHsKLQkJCQkJVVJMIHVybCA9IEZpbGVMb2NhdG9yLnJlc29sdmUoZW50cnkpOwotCQkJCQlmaWxlUGF0aCA9IEkxOG5VdGlsLmdldExvY2FsaXplZEZpbGUodXJsLmdldFBhdGgoKQotCQkJCQkJCSsgZmlsZU5hbWUsIGxvY2FsZSk7IAotCQkJCQlpZiAoZmlsZVBhdGggIT0gbnVsbCkgewotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlpZiAoZmlsZVBhdGggPT0gbnVsbCkgewotCQkJVVJMIGVudHJ5ID0gYnVuZGxlLmdldEVudHJ5KHBhdGgpOwotCQkJaWYgKGVudHJ5ICE9IG51bGwpIHsKLQkJCQlVUkwgdXJsID0gRmlsZUxvY2F0b3IucmVzb2x2ZShlbnRyeSk7Ci0JCQkJZmlsZVBhdGggPSBJMThuVXRpbC5nZXRMb2NhbGl6ZWRGaWxlKHVybC5nZXRQYXRoKCksIGxvY2FsZSk7Ci0JCQkJaWYgKGZpbGVQYXRoID09IG51bGwgJiYgdXNlRGVmYXVsdCkgewotCQkJCQlmaWxlUGF0aCA9IHVybC5nZXRQYXRoKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGZpbGVQYXRoOwotCX0KLQotCS8qKgotCSAqIGZvciB0aGUgZ2l2ZW4gcGF0aCBpbiB0aGUgcGx1Z2luLCBmaW5kIHRoZSBsb2NhbGl6ZWQgZmlsZXMgZm9ybSB0aGUgbmwKLQkgKiBmcmFnZW1lbmV0cyBhbmQgY29weSB0aGUgbG9jYWxpemVkIGZpbGVzIHRvIHRoZSBkZXN0aW5hdGlvbiBmb2xkZXIKLQkgKiAKLQkgKiBAcGFyYW0gcGF0aAotCSAqICAgICAgICAgICAgU3RyaW5nIGEgcmVsYXRpdmUgcGF0aCB0byB0aGUgcGx1Z2luIHJvb3QuIFRoZSBmaWxlcyBpbiB0aGlzCi0JICogICAgICAgICAgICBmb2xkZXIgd2lsbCBiZSBpdGVyYXRlZCBhbmQgdGhlaXIgbG9jYWxpemVkIGZpbGVzIHdpbGwgYmUKLQkgKiAgICAgICAgICAgIGNvcGllZCBvdmVyCi0JICogQHBhcmFtIHRvRGlyCi0JICogICAgICAgICAgICBGSWxlIHRoZSBkZXN0aW5hdGlvbiBmb2xkZXIKLQkgKiBAcGFyYW0gcmVjdXJzaXZlCi0JICogICAgICAgICAgICBib29sZWFuIHJlY3VyaXZlbHkgbG9va2luZyBmb3IgZmlsZXMgaW50IHRoZSBzcGVjaWZpZWQgZm9sZGVyCi0JICogQHBhcmFtIHVzZUxvY2FsZUZpbGVOYW1lCi0JICogICAgICAgICAgICBib29sZWFuIGlmIHRydWUgdGhlIGxvY2FsZSBzcGVjaWZpYyBmaWxlIG5hbWVzIHdpbGwgYmUgdXNlZCBpbgotCSAqICAgICAgICAgICAgdGhlIGNvcGllZCBkZXN0aW5hdGlvbiwgb3RoZXJ3aXNlLCB0aGUgbG9jYWxlIHNwZWNpZmljIGZpbGUKLQkgKiAgICAgICAgICAgIG5hbWUgd2lsbCBiZSByZW5hbWVkIHRvIHRoZSBkZWZhdWx0IG9uZSBpbiB0aGUgZGVzdGluYXRpb24KLQkgKiAgICAgICAgICAgIGZvbGRlcgotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBjb3B5TG9jYWxpemVkRmlsZXMoU3RyaW5nIHBhdGgsIEZpbGUgdG9EaXIsIGJvb2xlYW4gcmVjdXJzaXZlLAotCQkJYm9vbGVhbiB1c2VMb2NhbGVGaWxlTmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJU3RyaW5nIHBsdWdpblBhdGggPSBnZXRJbnN0YWxsUGF0aCgpOwotCQlVUkkgcGx1Z2luVXJpID0gbmV3IEZpbGUocGx1Z2luUGF0aCkudG9VUkkoKTsKLQkJVVJJIHBhdGhVcmkgPSBuZXcgRmlsZShwbHVnaW5QYXRoLCBwYXRoKS50b1VSSSgpOwotCi0JCUxpc3Q8RmlsZT4gZmlsZXMgPSBuZXcgQXJyYXlMaXN0PEZpbGU+KCk7Ci0JCUZpbGUgZiA9IG5ldyBGaWxlKHBsdWdpblBhdGgsIHBhdGgpOwotCQlGaWxlVXRpbC5nZXRBbGxGaWxlcyhmLCBmaWxlcywgcmVjdXJzaXZlKTsKLQotCQkvLyBmb3IgZWFjaCBmaWxlIGZvdW5kIGluIHRoZSBzcGVjaWZpZWQgZm9sZGVyLCBnZXQgdGhlIGxvY2FsaXplZCBmaWxlCi0JCWZvciAoSXRlcmF0b3IgaXQgPSBmaWxlcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlVUkkgc3JjVXJpID0gKChGaWxlKSBpdC5uZXh0KCkpLnRvVVJJKCk7Ci0KLQkJCS8vIGdldCB0aGUgcmVsYXRpdmUgcGF0aCBvZiB0aGUgZmlsZSB0byB0aGUgcGx1Z2luIHJvb3QsIHRoZW4gZmluZAotCQkJLy8gdGhlIGxvY2FsaXplZCBmaWxlCi0JCQlTdHJpbmcgcmVsUGF0aCA9IHBsdWdpblVyaS5yZWxhdGl2aXplKHNyY1VyaSkuZ2V0UGF0aCgpOwotCi0JCQkvLyBvbmx5IGdldCB0aGUgbG9jYWxlIHNwZWNpZmljIGZpbGUsIGRvbid0IGluY2x1ZGUgdGhlIGRlZmF1bHQgb25lCi0JCQlTdHJpbmcgbG9jYWxpemVkRmlsZSA9IGdldExvY2FsaXplZEZpbGUocmVsUGF0aCwgZmFsc2UpOwotCQkJaWYgKGxvY2FsaXplZEZpbGUgPT0gbnVsbCkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCi0JCQkvLyBuZWVkIHRvIGNoYW5nZSB0aGUgdGFyZ2V0IGZpbGUgcGF0aCB0byByZWxhdGl2ZSB0byB0aGUgcGF0aAotCQkJLy8gaW5zdGVhZCBvZiB0aGUgcGx1Z2luIHJvb3QKLQkJCXJlbFBhdGggPSBwYXRoVXJpLnJlbGF0aXZpemUoc3JjVXJpKS5nZXRQYXRoKCk7Ci0JCQlGaWxlIHNyY0ZpbGUgPSBuZXcgRmlsZShsb2NhbGl6ZWRGaWxlKTsKLQkJCUZpbGUgdGFyZ2V0RmlsZSA9IG5ldyBGaWxlKHRvRGlyLCByZWxQYXRoKTsKLQkJCUZpbGUgdGFyZ2V0UGFyZW50ID0gdGFyZ2V0RmlsZS5nZXRQYXJlbnRGaWxlKCk7Ci0KLQkJCS8vIGNvcHkgdGhlIGZpbGUgdG8gdGhlIGRlc2l0aW5hdGlvbgotCQkJLy8gaWYgdXNlTG9jYWxlRmlsZU5hbWUgaXMgdHJ1ZSwgdGhlIGRlc3RpbmF0aW9uIGZpbGUgbmFtZSBzaG91bGQKLQkJCS8vIGFsc28gdXNlIHRoZSBsb2NhbGUgc3BlY2lmaWMgZmlsZSBuYW1lCi0JCQlpZiAodXNlTG9jYWxlRmlsZU5hbWUpIHsKLQkJCQlTdHJpbmcgZmlsZU5hbWUgPSBzcmNGaWxlLmdldE5hbWUoKTsKLQkJCQl0YXJnZXRGaWxlID0gbmV3IEZpbGUodGFyZ2V0UGFyZW50LCBmaWxlTmFtZSk7Ci0JCQl9Ci0KLQkJCWlmIChpc0RlYnVnZ2luZygpKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJDb3B5aW5nIGxvY2FsaXplZCBmaWxlOiAiKTsgLy8kTk9OLU5MUy0xJAotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiU291cmNlOiAiICsgc3JjRmlsZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlRhcmdldDogIiArIHRhcmdldEZpbGUpOyAvLyROT04tTkxTLTEkCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKCIiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCi0JCQl0cnkgewotCQkJCWlmICghdGFyZ2V0UGFyZW50LmV4aXN0cygpKSB7Ci0JCQkJCXRhcmdldFBhcmVudC5ta2RpcnMoKTsKLQkJCQl9Ci0KLQkJCQlpZiAoIXRhcmdldEZpbGUuZXhpc3RzKCkpIHsKLQkJCQkJdGFyZ2V0RmlsZS5jcmVhdGVOZXdGaWxlKCk7Ci0JCQkJfQotCi0JCQkJRmlsZVV0aWwuY29weUZpbGUoc3JjRmlsZSwgdGFyZ2V0RmlsZSk7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQkJfQotCi0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbG9jYWxpemVkIHJlc291cmNlLgotCSAqIAotCSAqIEBwYXJhbSBrZXkKLQkgKiAgICAgICAgICAgIFRoZSByZXNvdXJjZSBrZXkuCi0JICogQHJldHVybiBUaGUgbG9jYWxpemVkIHJlc291cmNlLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXkpIHsKLQkJaWYgKHJlc291cmNlQnVuZGxlICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJcmV0dXJuIHJlc291cmNlQnVuZGxlLmdldFN0cmluZyhrZXkpOwotCQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKLQkJCX0KLQkJfQotCQlyZXR1cm4gJ1snICsga2V5ICsgJ10nOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGZvcm1hdHRlZCBsb2NhbGl6ZWQgbWVzc2FnZSBnaXZlbiB0aGUgcmVzb3VyY2Uga2V5IGFuZCB0aGUKLQkgKiBtZXNzYWdlIGFyZ3VtZW50LgotCSAqIAotCSAqIEBwYXJhbSBrZXkKLQkgKiAgICAgICAgICAgIFRoZSByZXNvdXJjZSBrZXkuCi0JICogQHBhcmFtIGFyZ3VtZW50Ci0JICogICAgICAgICAgICBUaGUgbWVzc2FnZSBhcmd1bWVudC4KLQkgKiBAcmV0dXJuIFRoZSBmb3JtYXR0ZWQgbG9jYWxpemVkIG1lc3NhZ2UuCi0JICovCi0JcHVibGljIFN0cmluZyBmb3JtYXRNZXNzYWdlKFN0cmluZyBrZXksIE9iamVjdCBhcmd1bWVudCkgewotCQlpZiAocmVzb3VyY2VCdW5kbGUgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlTdHJpbmcgbXNnID0gcmVzb3VyY2VCdW5kbGUuZ2V0U3RyaW5nKGtleSk7Ci0JCQkJT2JqZWN0W10gYXJndW1lbnRzID0geyBhcmd1bWVudCB9OwotCQkJCXJldHVybiBNZXNzYWdlRm9ybWF0LmZvcm1hdChtc2csIGFyZ3VtZW50cyk7Ci0JCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgewotCQkJfQotCQl9Ci0JCXJldHVybiAnWycgKyBrZXkgKyAnXSc7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgaW1hZ2UgVVJMIGdpdmVuIHRoZSByZWxhdGl2ZSBwYXRoLgotCSAqIAotCSAqIEBwYXJhbSByZWxhdGl2ZVBhdGgKLQkgKiAgICAgICAgICAgIFRoZSBpbWFnZSdzIHBhdGggcmVsYXRpdmUgdG8gdGhlIHBsdWctaW4ncyByb290LgotCSAqIEByZXR1cm4gVGhlIGltYWdlIFVSTC4KLQkgKi8KLQlwdWJsaWMgVVJMIGdldEltYWdlVVJMKFN0cmluZyByZWxhdGl2ZVBhdGgpIHsKLQkJdHJ5IHsKLQkJCVVSTCB1cmwgPSBuZXcgVVJMKGljb25VUkwsIHJlbGF0aXZlUGF0aCk7Ci0JCQlyZXR1cm4gRmlsZUxvY2F0b3IucmVzb2x2ZSh1cmwpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLS8vCS8qKgotLy8JICogUmV0dXJucyB0aGUgaW1hZ2UgZGVzY3JpcHRvciBnaXZlbiB0aGUgcmVsYXRpdmUgcGF0aC4KLS8vCSAqIAotLy8JICogQHBhcmFtIHJlbGF0aXZlUGF0aAotLy8JICogICAgICAgICAgICBUaGUgaW1hZ2UncyBwYXRoIHJlbGF0aXZlIHRvIHRoZSBwbHVnLWluJ3Mgcm9vdC4KLS8vCSAqIEByZXR1cm4gVGhlIGltYWdlIGRlc2NyaXB0b3IuCi0vLwkgKi8KLS8vCXB1YmxpYyBJbWFnZURlc2NyaXB0b3IgZ2V0SW1hZ2VEZXNjcmlwdG9yKFN0cmluZyByZWxhdGl2ZVBhdGgpIHsKLS8vCQl0cnkgewotLy8JCQlVUkwgdXJsID0gbmV3IFVSTChpY29uVVJMLCByZWxhdGl2ZVBhdGgpOwotLy8JCQlyZXR1cm4gSW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUZyb21VUkwodXJsKTsKLS8vCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotLy8JCQlyZXR1cm4gSW1hZ2VEZXNjcmlwdG9yLmdldE1pc3NpbmdJbWFnZURlc2NyaXB0b3IoKTsKLS8vCQl9Ci0vLwl9Ci0vLwotLy8JLyoqCi0vLwkgKiBSZXR1cm5zIHRoZSBpbWFnZSBnaXZlbiB0aGUgcmVsYXRpdmUgcGF0aC4KLS8vCSAqIDxwPgotLy8JICogTm90ZTogVGhlIHJldHVybmVkIGltYWdlIG5lZWQgdG8gYmUgZnJlZWQgYnkgdGhlIGNhbGxlci4KLS8vCSAqIAotLy8JICogQHBhcmFtIHJlbGF0aXZlUGF0aAotLy8JICogICAgICAgICAgICBUaGUgaW1hZ2UncyBwYXRoIHJlbGF0aXZlIHRvIHRoZSBwbHVnLWluJ3Mgcm9vdC4KLS8vCSAqIEByZXR1cm4gVGhlIGltYWdlLgotLy8JICovCi0vLwlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoU3RyaW5nIHJlbGF0aXZlUGF0aCkgewotLy8JCUltYWdlIGltYWdlID0gbnVsbDsKLS8vCi0vLwkJSW1hZ2VEZXNjcmlwdG9yIGltYWdlRGVzY3JpcHRvciA9IGdldEltYWdlRGVzY3JpcHRvcihyZWxhdGl2ZVBhdGgpOwotLy8JCWlmIChpbWFnZURlc2NyaXB0b3IgIT0gbnVsbCkgewotLy8JCQlpbWFnZSA9IGltYWdlRGVzY3JpcHRvci5jcmVhdGVJbWFnZShmYWxzZSk7Ci0vLwkJfQotLy8KLS8vCQlyZXR1cm4gaW1hZ2U7Ci0vLwl9Ci0vLwotLy8JLyoqCi0vLwkgKiBSZXR1cm5zIHRoZSBzaGFyZWQgaW1hZ2UgZ2l2ZW4gdGhlIHJlbGF0aXZlIHBhdGguCi0vLwkgKiA8cD4KLS8vCSAqIE5vdGU6IFRoZSByZXR1cm5lZCBpbWFnZSB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgZnJlZWQgd2hlbiB0aGUgcGx1Zy1pbgotLy8JICogc2h1dHMgZG93bi4KLS8vCSAqIAotLy8JICogQHBhcmFtIHJlbGF0aXZlUGF0aAotLy8JICogICAgICAgICAgICBUaGUgaW1hZ2UncyBwYXRoIHJlbGF0aXZlIHRvIHRoZSBwbHVnLWluJ3Mgcm9vdC4KLS8vCSAqIEByZXR1cm4gVGhlIGltYWdlLgotLy8JICovCi0vLwlwdWJsaWMgSW1hZ2UgZ2V0U2hhcmVkSW1hZ2UoU3RyaW5nIHJlbGF0aXZlUGF0aCkgewotLy8JCUltYWdlIGltYWdlID0gKEltYWdlKSBzaGFyZWRJbWFnZXMuZ2V0KHJlbGF0aXZlUGF0aCk7Ci0vLwkJaWYgKGltYWdlICE9IG51bGwpIHsKLS8vCQkJcmV0dXJuIGltYWdlOwotLy8JCX0KLS8vCi0vLwkJSW1hZ2VEZXNjcmlwdG9yIGltYWdlRGVzY3JpcHRvciA9IGdldEltYWdlRGVzY3JpcHRvcihyZWxhdGl2ZVBhdGgpOwotLy8JCWlmIChpbWFnZURlc2NyaXB0b3IgIT0gbnVsbCkgewotLy8JCQlpbWFnZSA9IGltYWdlRGVzY3JpcHRvci5jcmVhdGVJbWFnZShmYWxzZSk7Ci0vLwkJCWlmIChpbWFnZSAhPSBudWxsKSB7Ci0vLwkJCQlzaGFyZWRJbWFnZXMucHV0KHJlbGF0aXZlUGF0aCwgaW1hZ2UpOwotLy8JCQl9Ci0vLwkJfQotLy8KLS8vCQlyZXR1cm4gaW1hZ2U7Ci0vLwl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwcm9maWxpbmcgZmxhZy4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHByb2ZpbGluZyBpcyBlbmFibGVkIGZvciB0aGlzIHBsdS1pbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUHJvZmlsaW5nKCkgewotCQlyZXR1cm4gcHJvZmlsaW5nOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGxvZ2dlciBnaXZlbiB0aGUgcGx1Zy1pbiBJRC4KLQkgKiAKLQkgKiBAcmV0dXJuIFRoZSBuZXcgb3IgY2FjaGVkIGxvZ2dlci4KLQkgKi8KLQlwdWJsaWMgTG9nZ2VyIGdldExvZ2dlcigpIHsKLQkJTG9nZ2VyIGxvZ2dlciA9IChMb2dnZXIpIGxvZ2dlcnMuZ2V0KHBsdWdpbklkKTsKLQkJaWYgKGxvZ2dlciA9PSBudWxsKSB7Ci0JCQlsb2dnZXIgPSBuZXcgTG9nZ2VyKHRoaXMpOwotCQkJbG9nZ2Vycy5wdXQocGx1Z2luSWQsIGxvZ2dlcik7Ci0JCX0KLQkJcmV0dXJuIGxvZ2dlcjsKLQl9Ci0JCQotCS8qKgotCSAqIExvZ3MgdGhlIGdpdmVuIG9iamVjdCBvciBtZXNzYWdlLgotCSAqLwotCXB1YmxpYyB2b2lkIGxvZyhPYmplY3QgbG9nRW50cnkpIHsKLQkJaWYgKGxvZ0VudHJ5IGluc3RhbmNlb2YgVGhyb3dhYmxlKSB7Ci0JCQkoKFRocm93YWJsZSkgbG9nRW50cnkpLnByaW50U3RhY2tUcmFjZShTeXN0ZW0uZXJyKTsKLQkJfSBlbHNlIHsKLQkJCVN5c3RlbS5lcnIucHJpbnRsbihsb2dFbnRyeSk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIElQcmVmZXJlbmNlU3RvcmVXcmFwcGVyIGdldFByZWZlcmVuY2VTdG9yZSgpIHsKLQkJcmV0dXJuIENvbW1vblBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0Q29tbW9uUHJlZmVyZW5jZVN0b3JlKCk7Ci0JfQotCQotCQotCXB1YmxpYyBPYmplY3QgZ2V0Q29udGV4dCgpIHsKLQkJaWYgKCBDb21tb25QbHVnaW4uZ2V0RGVmYXVsdCgpLmNvbnRleHRQcm92aWRlciAhPSBudWxsICkgewotCQkJcmV0dXJuIENvbW1vblBsdWdpbi5nZXREZWZhdWx0KCkuY29udGV4dFByb3ZpZGVyLmdldENvbnRleHQoKTsKLQkJfQotCQkKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyBJTWVzc2FnZUNhbGxiYWNrIGdldE1zZ0NhbGxiYWNrKCkgewotCQlyZXR1cm4gQ29tbW9uUGx1Z2luLmdldERlZmF1bHQoKS5tc2dDYWxsYmFjazsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL0NvbW1vblBsdWdpbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi9Db21tb25QbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWE4MTE2OS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL0NvbW1vblBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmNvbW1vbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24ucHJlZmVyZW5jZXMuSVByZWZlcmVuY2VTdG9yZVdyYXBwZXI7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0KLS8qKgotICogVGhlIENvbW1vbiBwbHVnLWluIGFjdGl2YXRvci4KLSAqLwotcHVibGljIGNsYXNzIENvbW1vblBsdWdpbiBleHRlbmRzIEFic3RyYWN0QWN0aXZhdG9yIHsKLQotCS8vIFRoZSBzaGFyZWQgcGx1Zy1pbiBpbnN0YW5jZS4KLQlwcml2YXRlIHN0YXRpYyBDb21tb25QbHVnaW4gcGx1Z2luOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgQ29tbW9uUGx1Z2luKCkgewotCQlzdXBlcigpOwotCQlwbHVnaW4gPSB0aGlzOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS5BYnN0cmFjdFBsdWdpbiNzdGFydChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdGFydChjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5jb21tb24udWkuQWJzdHJhY3RQbHVnaW4jc3RvcChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0b3AoY29udGV4dCk7Ci0JCXBsdWdpbiA9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgc2hhcmVkIGluc3RhbmNlLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHNoYXJlZCBwbHVnLWluIGluc3RhbmNlCi0JICovCi0JcHVibGljIHN0YXRpYyBDb21tb25QbHVnaW4gZ2V0RGVmYXVsdCgpIHsKLQkJcmV0dXJuIHBsdWdpbjsKLQl9Ci0KLS8vCS8qKgotLy8JICogc2V0IHRoZSBzdG9yZSB3cmFwcGVyIGJlZm9yZSBpdCdzIGJlaW5nIHVzZWQuCi0vLwkgKiBAcGFyYW0gc3RvcmVXcmFwcGVyCi0vLwkgKi8KLQlwcml2YXRlIElQcmVmZXJlbmNlU3RvcmVXcmFwcGVyIHN0b3JlV3JhcHBlciA9IG51bGw7Ci0JCi0JcHVibGljIHZvaWQgc2V0Q29tbW9uUHJlZmVyZW5jZVN0b3JlKElQcmVmZXJlbmNlU3RvcmVXcmFwcGVyIHN0b3JlV3JhcHBlcikgewotCQl0aGlzLnN0b3JlV3JhcHBlciA9IHN0b3JlV3JhcHBlcjsKLQl9Ci0JCi0JcHVibGljIElQcmVmZXJlbmNlU3RvcmVXcmFwcGVyIGdldENvbW1vblByZWZlcmVuY2VTdG9yZSgpIHsKLQkJcmV0dXJuIHN0b3JlV3JhcHBlcjsKLQl9Ci0JCi0JLy8gdGhpcyBpcyB0aGUgY29udGV4dCBmb3IgbWVzc2FnZSBjYWxsYmFjawotCS8vIGZvciBlY2xpcHNlIGNsaWVudCwgdGhpcyBpcyB0aGUgU2hlbGwgb2JqZWN0Ci0JSUNvbnRleHRQcm92aWRlciBjb250ZXh0UHJvdmlkZXIgPSBudWxsOwotCi0JcHVibGljIHZvaWQgc2V0Q29udGV4dFByb3ZpZGVyKElDb250ZXh0UHJvdmlkZXIgY29udGV4dFByb3ZpZGVyKSB7Ci0JCXRoaXMuY29udGV4dFByb3ZpZGVyID0gY29udGV4dFByb3ZpZGVyOwotCX0KLQotCUlNZXNzYWdlQ2FsbGJhY2sgbXNnQ2FsbGJhY2sgPSBudWxsOwotCXB1YmxpYyB2b2lkIHNldE1zZ0NhbGxiYWNrKElNZXNzYWdlQ2FsbGJhY2sgbXNnQ2FsbGJhY2spIHsKLQkJdGhpcy5tc2dDYWxsYmFjayA9IG1zZ0NhbGxiYWNrOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL0lBY3RpdmF0b3IuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vSUFjdGl2YXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDg0NGY2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vSUFjdGl2YXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmNvbW1vbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24uc2VydmljZWFiaWxpdHkuTG9nZ2VyOwotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS41Ci0gKgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElBY3RpdmF0b3IgewotCVN0cmluZyBnZXRJZCgpOwotCUxvZ2dlciBnZXRMb2dnZXIoKTsKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vSUNvbnRleHRQcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi9JQ29udGV4dFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5OTdhMmQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi9JQ29udGV4dFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmNvbW1vbjsKLQotcHVibGljIGludGVyZmFjZSBJQ29udGV4dFByb3ZpZGVyIHsKLQlwdWJsaWMgT2JqZWN0IGdldENvbnRleHQoKTsKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vSU1lc3NhZ2VDYWxsYmFjay5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi9JTWVzc2FnZUNhbGxiYWNrLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4MDdkZDEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi9JTWVzc2FnZUNhbGxiYWNrLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5jb21tb247Ci0KLQotcHVibGljIGludGVyZmFjZSBJTWVzc2FnZUNhbGxiYWNrIHsKLQotCXB1YmxpYyB2b2lkIGRpc3BsYXlXYXJuaW5nKEFic3RyYWN0QWN0aXZhdG9yIHBsdWdpbiwgU3RyaW5nIHRpdGxlLCBTdHJpbmcgbXNnLCBTdHJpbmcgcmVhc29uKTsKLQlwdWJsaWMgdm9pZCBkaXNwbGF5V2FybmluZyhBYnN0cmFjdEFjdGl2YXRvciBwbHVnaW4sIFN0cmluZyBtc2csIFN0cmluZyByZWFzb24sIFRocm93YWJsZSBleCk7Ci0JcHVibGljIHZvaWQgZGlzcGxheVdhcm5pbmcoQWJzdHJhY3RBY3RpdmF0b3IgcGx1Z2luLCBTdHJpbmcgbXNnLCBTdHJpbmcgcmVhc29uLCBTdHJpbmcgZGV0YWlscywgVGhyb3dhYmxlIGV4KTsKLQlwdWJsaWMgdm9pZCBkaXNwbGF5V2FybmluZyhBYnN0cmFjdEFjdGl2YXRvciBwbHVnaW4sIFN0cmluZyB0aXRsZSwgU3RyaW5nIG1zZywgU3RyaW5nIHJlYXNvbiwgU3RyaW5nIGRldGFpbHMsIFRocm93YWJsZSBleCk7Ci0JCi0JcHVibGljIHZvaWQgZGlzcGxheUVycm9yKEFic3RyYWN0QWN0aXZhdG9yIHBsdWdpbiwgU3RyaW5nIHRpdGxlLCBTdHJpbmcgbXNnKTsKLQlwdWJsaWMgdm9pZCBkaXNwbGF5RXJyb3IoQWJzdHJhY3RBY3RpdmF0b3IgcGx1Z2luLCBTdHJpbmcgdGl0bGUsIFN0cmluZyBtc2csIFRocm93YWJsZSBleCk7Ci0JcHVibGljIHZvaWQgZGlzcGxheUVycm9yKEFic3RyYWN0QWN0aXZhdG9yIHBsdWdpbiwgU3RyaW5nIHRpdGxlLCBTdHJpbmcgbXNnLCBTdHJpbmcgcmVhc29uLCBTdHJpbmcgZGV0YWlscywgVGhyb3dhYmxlIGV4KTsKLQkKLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi9odG1sL0hUTUxGb3JtYXR0ZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vaHRtbC9IVE1MRm9ybWF0dGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5MTMxMzUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi9odG1sL0hUTUxGb3JtYXR0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLmh0bWw7Ci0KLWltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOwotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uU3RyaW5nUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOwotaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLldyaXRlcjsKLWltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuRmlsZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5TdHJVdGlsOwotaW1wb3J0IG9yZy53M2MudGlkeS5UaWR5OwotCi0vKioKLSAqIFByZXR0eS1mb3JtYXRzIEhUTUwgc291cmNlIGFuZCBtYWtlcyBpdCBYSFRNTCBjb21wbGlhbnQuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgSFRNTEZvcm1hdHRlciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSFRNTF9CT0RZX1NUQVJUX1RBRyA9ICI8Ym9keSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBIVE1MX0JPRFlfRU5EX1RBRyA9ICI8L2JvZHk+IjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEhUTUxfQk9EWV9TVEFSVF9UQUdfTEVOR1RIID0gSFRNTF9CT0RZX1NUQVJUX1RBRwotCQkJLmxlbmd0aCgpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElBR05PU1RJQ19TT1VSQ0UgPSAib3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5IVE1MRm9ybWF0dGVyIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBpbnQgbGluZVdpZHRoOwotCi0JcHJpdmF0ZSBib29sZWFuIGluZGVudDsKLQotCXByaXZhdGUgaW50IGluZGVudFNpemU7Ci0KLQlwcml2YXRlIFN0cmluZyBsYXN0RXJyb3JTdHI7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgUGF0dGVybiBwX3doaXRlc3BhY2UgPSBQYXR0ZXJuLmNvbXBpbGUoIl5cXHMrIiwgUGF0dGVybi5NVUxUSUxJTkUpOyAvLyROT04tTkxTLTEkCi0KLQkvKgotCSAqIFN0cmluZyBsb2NhdGlvbiA9IG0uZ3JvdXAoMSk7Ci0JICogU3RyaW5nIGxpbmVTdHIgPSBtLmdyb3VwKDIpOwotCSAqIFN0cmluZyBjb2x1bW5TdHIgPSBtLmdyb3VwKDMpOwotCSAqIFN0cmluZyBlcnJvck1zZyA9IG0uZ3JvdXAoNCk7Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBQYXR0ZXJuIGpUaWR5RXJyb3JQYXJzZXIgPSBQYXR0ZXJuCi0JCQkuY29tcGlsZSgKLQkJCQkJIihsaW5lXFxzKyhcXGQrKVxccytjb2x1bW5cXHMrKFxcZCspKVxccystXFxzKyguKykiLCBQYXR0ZXJuLkNBU0VfSU5TRU5TSVRJVkUpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBIVE1MRm9ybWF0dGVyKCkgewotCQl0aGlzKDEzMiwgdHJ1ZSwgNCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgSFRNTEZvcm1hdHRlcihpbnQgbGluZVdpZHRoLCBib29sZWFuIGluZGVudCwgaW50IGluZGVudFNpemUpIHsKLQkJdGhpcy5saW5lV2lkdGggPSBsaW5lV2lkdGg7Ci0JCXRoaXMuaW5kZW50ID0gaW5kZW50OwotCQl0aGlzLmluZGVudFNpemUgPSBpbmRlbnRTaXplOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIG1heGltdW0gY2hhcmFjdGVyIHdpZHRoIG9mIGEgbGluZS4KLQkgKiAKLQkgKiBAcGFyYW0gbGluZVdpZHRoCi0JICogICAgICAgICAgICBUaGUgbGluZSB3aWR0aCAoaW4gbnVtYmVyIG9mIGNoYXJhY3RlcnMpLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldExpbmVXaWR0aChpbnQgbGluZVdpZHRoKSB7Ci0JCXRoaXMubGluZVdpZHRoID0gbGluZVdpZHRoOwotCX0KLQotCS8qKgotCSAqIEVuYWJsZXMgb3IgZGlzYWJsZXMgdGFncyBpbmRlbnQuCi0JICogCi0JICogQHBhcmFtIGluZGVudAotCSAqICAgICAgICAgICAgSWYgdHJ1ZSwgaWRlbnQgdGhlIHRhZ3MuCi0JICovCi0JcHVibGljIHZvaWQgc2V0SW5kZW50KGJvb2xlYW4gaW5kZW50KSB7Ci0JCXRoaXMuaW5kZW50ID0gaW5kZW50OwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGluZGVudCBzaXplLgotCSAqIAotCSAqIEBwYXJhbSBpbmRlbnRTaXplCi0JICogICAgICAgICAgICBUaGUgaW5kZW50IHNpemUgKGluIG51bWJlciBvZiBjaGFyYWN0ZXJzKS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJbmRlbnRTaXplKGludCBpbmRlbnRTaXplKSB7Ci0JCXRoaXMuaW5kZW50U2l6ZSA9IGluZGVudFNpemU7Ci0JfQotCi0JLyoqCi0JICogRm9ybWF0cyB0aGUgZ2l2ZW4gSFRNTCBzb3VyY2UuCi0JICogCi0JICogQHBhcmFtIGh0bWwKLQkgKiAgICAgICAgICAgIFRoZSBIVE1MIHNvdXJjZS4KLQkgKiBAcmV0dXJuIFRoZSBwcmV0dHktZm9ybWF0dGVkIEhUTUwgc291cmNlLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZm9ybWF0SFRNTChTdHJpbmcgaHRtbCkgdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gewotCQlyZXR1cm4gZm9ybWF0SFRNTChodG1sLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogRm9ybWF0cyB0aGUgZ2l2ZW4gSFRNTCBzb3VyY2UuCi0JICogCi0JICogQHBhcmFtIGh0bWwgVGhlIEhUTUwgc291cmNlLgotCSAqIEBwYXJhbSByZXR1cm5Cb2R5T25seSBpZiBmYWxzZSwgcmV0dXJuIGZ1bGwgSFRNTCBkb2N1bWVudCBvciBib2R5IGNvbnRlbnQgYmFzZWQgb24gd2hhdCBpcyBwYXNzZWQgaW4uICBpZiB0cnVlLCBhbHdheXMgcmV0dXJuIGJvZHkgY29udGVudCBvbmx5Ci0JICogQHBhcmFtIGZvcmNlT3V0cHV0IGlmIHRydWUsIHJldHVybiBjbGVhbmVkIEhUTUwgZXZlbiBpZiBlcnJvcnMuIGlmIGZhbHNlLCB3aWxsIGNsZWFuIG1pbm9yIHByb2JsZW1zIGFuZCByZXR1cm4gY2xlYW4gSFRNTCwgYnV0IG9uIGEgbWFqb3IgZXJyb3IsIHdpbGwgc2V0IGdldExhc3RFcnJvclN0cigpIGFuZCByZXR1cm4gcGFzc2VkLWluIGh0bWwKLQkgKiBAcGFyYW0gbWFrZUJhcmUgc2V0IHRvIHRydWUgZm9yIGNsZWFuaW5nIE1TIEhUTUwKLQkgKiBAcGFyYW0gd29yZDIwMDAgc2V0IHRvIHRydWUgZm9yIGNsZWFuaW5nIE1TIFdvcmQgMjAwMCBIVE1MIAotCSAqIEByZXR1cm4KLQkgKiBAdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGZvcm1hdEhUTUwoU3RyaW5nIGh0bWwsIGJvb2xlYW4gcmV0dXJuQm9keU9ubHksIGJvb2xlYW4gZm9yY2VPdXRwdXQsIGJvb2xlYW4gbWFrZUJhcmUsIGJvb2xlYW4gd29yZDIwMDApIHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIHsKLQkJbGFzdEVycm9yU3RyID0gbnVsbDsKLQkJaWYgKGh0bWwgPT0gbnVsbCB8fCBodG1sLmxlbmd0aCgpID09IDApIHsKLQkJCXJldHVybiBodG1sOwotCQl9Ci0JCQotCQlodG1sID0gcmVtb3ZlTGVhZGluZ1doaXRlc3BhY2UoaHRtbCk7Ci0KLQkJVGlkeSB0aWR5ID0gbmV3IFRpZHkoKTsKLQkJdGlkeS5zZXRYSFRNTCh0cnVlKTsKLQkJdGlkeS5zZXREcm9wRW1wdHlQYXJhcyhmYWxzZSk7Ci0JCXRpZHkuc2V0RHJvcEZvbnRUYWdzKGZhbHNlKTsKLQkJdGlkeS5zZXRRdWlldCh0cnVlKTsKLQkJdGlkeS5zZXRTaG93V2FybmluZ3MoZmFsc2UpOwotCQl0aWR5LnNldFNtYXJ0SW5kZW50KGZhbHNlKTsKLQkJdGlkeS5zZXRUaWR5TWFyayhmYWxzZSk7Ci0JCXRpZHkuc2V0V3JhcGxlbihsaW5lV2lkdGgpOwotCQl0aWR5LnNldEluZGVudEF0dHJpYnV0ZXMoZmFsc2UpOwotCQl0aWR5LnNldEluZGVudENvbnRlbnQoaW5kZW50KTsKLQkJdGlkeS5zZXRTcGFjZXMoaW5kZW50U2l6ZSk7Ci0JCXRpZHkuc2V0SW5wdXRFbmNvZGluZygiVVRGLTE2Iik7IC8vJE5PTi1OTFMtMSQKLQkJdGlkeS5zZXRPdXRwdXRFbmNvZGluZygiVVRGLTE2Iik7IC8vJE5PTi1OTFMtMSQKLQkJdGlkeS5zZXRGaXhCYWNrc2xhc2goZmFsc2UpOwotCQkvLyB0aGlzIHdpbGwgYWRkIDxwPiBhcm91bmQgZWFjaCB0ZXh0IGJsb2NrICg/dGhhdCBpc24ndCBpbiBhIGJsb2NrIGFscmVhZHk/KQotLy8JCXRpZHkuc2V0RW5jbG9zZUJsb2NrVGV4dCh0cnVlKTsKLQkJLy8gc2V0dGluZyB0aGlzIHNlZW1lZCB0byBwcmV2ZW50IEpUaWR5IGZyb20gaW5kZW50aW5nIHRoZSBzb3VyY2UKLS8vCQl0aWR5LnNldFByaW50Qm9keU9ubHkodHJ1ZSk7Ci0JCQotCQlpZiAoZm9yY2VPdXRwdXQpIHsKLQkJCS8vIG91dHB1dCBkb2N1bWVudCBldmVuIGlmIGVycm9ycyBhcmUgcHJlc2VudAotCQkJdGlkeS5zZXRGb3JjZU91dHB1dCh0cnVlKTsKLQkJfQotCQlpZiAobWFrZUJhcmUpIHsKLQkJCS8vIHJlbW92ZSBNUyBjbHV0dGVyCi0JCQl0aWR5LnNldE1ha2VCYXJlKHRydWUpOwotCQl9Ci0JCWlmICh3b3JkMjAwMCkgewotCQkJLy8gZHJhY29uaWFuIFdvcmQyMDAwIGNsZWFuaW5nCi0JCQl0aWR5LnNldFdvcmQyMDAwKHRydWUpOwotCQl9Ci0KLQkJUmVhZGVyIGlucHV0ID0gbmV3IFN0cmluZ1JlYWRlcihodG1sKTsKLQkJV3JpdGVyIG91dHB1dCA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLQotCQlTdHJpbmdXcml0ZXIgc3cgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0JCVByaW50V3JpdGVyIHB3ID0gbmV3IFByaW50V3JpdGVyKHN3KTsKLQkJdGlkeS5zZXRFcnJvdXQocHcpOwotCQl0aWR5LnBhcnNlKGlucHV0LCBvdXRwdXQpOwotCQlTdHJpbmcgZXJyb3IgPSBzdy5nZXRCdWZmZXIoKS50b1N0cmluZygpOwotCQlpZiAoZXJyb3IgIT0gbnVsbCAmJiBlcnJvci5sZW5ndGgoKSA+IDAKLQkJCQkmJiBlcnJvci5zdGFydHNXaXRoKCJsaW5lIikgJiYgZXJyb3IuaW5kZXhPZigiY29sdW1uIikgPiAwKSB7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJbGFzdEVycm9yU3RyID0gZXJyb3I7Ci0JCQlpZiAoIWZvcmNlT3V0cHV0KSB7Ci0JCQkJLy8gaWYgZm9yY2VPdXRwdXQgaXMgdHJ1ZSwgSlRpZHkgd2lsbCByZXR1cm4gY2xlYW4gSFRNTCBzbyBkb24ndCByZXR1cm4gaGVyZQotCQkJCXJldHVybiBodG1sOwotCQkJfQotCQl9Ci0KLQkJU3RyaW5nIGZvcm1hdHRlZEhUTUwgPSBvdXRwdXQudG9TdHJpbmcoKTsKLQkJZm9ybWF0dGVkSFRNTCA9IFN0clV0aWwuZ2V0RXNjYXBlZEhUTUwoZm9ybWF0dGVkSFRNTCk7Ci0JCQotCQlTdHJpbmcgaHRtbFN0YXJ0VXBwZXIgPSBodG1sLnN1YnN0cmluZygwLCBNYXRoLm1pbigxMCwgaHRtbC5sZW5ndGgoKSkpLnRvVXBwZXJDYXNlKCk7Ci0KLQkJaWYgKHJldHVybkJvZHlPbmx5IHx8ICghaHRtbFN0YXJ0VXBwZXIuc3RhcnRzV2l0aCgiPCFET0NUWVBFIikgJiYgIWh0bWxTdGFydFVwcGVyLnN0YXJ0c1dpdGgoIjxIVE1MIikpKSB7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJaW50IHN0YXJ0Qm9keVRhZyA9IGZvcm1hdHRlZEhUTUwuaW5kZXhPZihIVE1MX0JPRFlfU1RBUlRfVEFHKTsKLQkJCWludCBzdGFydCA9IC0xOwotCQkJaWYgKHN0YXJ0Qm9keVRhZyAhPSAtMSkgewotCQkJCXN0YXJ0ID0gZm9ybWF0dGVkSFRNTC5pbmRleE9mKCI+IixzdGFydEJvZHlUYWcpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlpbnQgZW5kID0gZm9ybWF0dGVkSFRNTC5pbmRleE9mKEhUTUxfQk9EWV9FTkRfVEFHKTsKLQkJCWlmIChzdGFydCA9PSAtMSB8fCBlbmQgPT0gLTEpIHsKLQkJCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCXN0YXJ0ICs9IDE7Ci0JCQlpZiAoc3RhcnQgPj0gZW5kKSB7Ci0JCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlzdGFydCArPSBGaWxlVXRpbC5MSU5FX1NFUF9MRU5HVEg7Ci0JCQllbmQgLT0gRmlsZVV0aWwuTElORV9TRVBfTEVOR1RIOwotCQkJaWYgKGluZGVudCAmJiBpbmRlbnRTaXplID4gMCkgewotCQkJCWVuZCAtPSBpbmRlbnRTaXplOwotCQkJfQotCQkJaWYgKHN0YXJ0ID49IGVuZCkgewotCQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJU3RyaW5nIHJlc3VsdCA9IGZvcm1hdHRlZEhUTUwuc3Vic3RyaW5nKHN0YXJ0LCBlbmQpOwotCQkJaWYgKGluZGVudCAmJiBpbmRlbnRTaXplID4gMCkgewotCQkJCVN0cmluZyBpbmRlbnRTdHIgPSBnZXRJbmRlbnRTdHIoaW5kZW50U2l6ZSAqIDIpOwotCQkJCXJlc3VsdCA9IGZpeEluZGVudGF0aW9uKHJlc3VsdCwgaW5kZW50U3RyKTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQl9Ci0JCXJldHVybiBmb3JtYXR0ZWRIVE1MOwotCX0KLQkJCi0JLyoqCi0JICogUmV0dXJucyB0aGUgaW5kZW50IHN0cmluZy4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0SW5kZW50U3RyKGludCBpbmRlbnRMZW5ndGgpIHsKLQkJaWYgKGluZGVudExlbmd0aCA9PSAwKSB7Ci0JCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlTdHJpbmdCdWZmZXIgaW5kZW50U3RyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGluZGVudExlbmd0aDsgaSsrKSB7Ci0JCQlpbmRlbnRTdHIuYXBwZW5kKCcgJyk7Ci0JCX0KLQkJcmV0dXJuIGluZGVudFN0ci50b1N0cmluZygpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRV9UQUdfU1RBUlQgPSAiPHByZT4iOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVfVEFHX0VORCA9ICI8L3ByZT4iOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUkVfVEFHX0VORF9MRU5HVEggPSBQUkVfVEFHX0VORC5sZW5ndGgoKTsKLQotCS8qKgotCSAqIFVuZG8gdGhlIEpUaWR5IGluZGVudCwgYnV0IGlnbm9yZSAmbHQ7cHJlJmd0OyB0YWdzCi0JICogCi0JICogQHBhcmFtIGh0bWwKLQkgKiBAcGFyYW0gaW5kZW50U3RyCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgc3RhdGljIFN0cmluZyBmaXhJbmRlbnRhdGlvbihTdHJpbmcgaHRtbCwgU3RyaW5nIGluZGVudFN0cikgewotCQlpZiAoaHRtbC5zdGFydHNXaXRoKGluZGVudFN0cikpIHsKLQkJCWh0bWwgPSBodG1sLnN1YnN0cmluZyhpbmRlbnRTdHIubGVuZ3RoKCkpOwotCQl9Ci0JCVN0cmluZ0J1ZmZlciBzdHJCdWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWludCBwcmVfaW5kZXggPSAtMTsKLQkJaW50IGxhc3RfcHJlX2VuZF9pbmRleCA9IC0xOwotCQl3aGlsZSAoKHByZV9pbmRleCA9IGh0bWwuaW5kZXhPZihQUkVfVEFHX1NUQVJULCBsYXN0X3ByZV9lbmRfaW5kZXgpKSAhPSAtMSkgewotCQkJc3RyQnVmLmFwcGVuZChodG1sLnN1YnN0cmluZygKLQkJCQkJbGFzdF9wcmVfZW5kX2luZGV4IDwgMCA/IDAgOiBsYXN0X3ByZV9lbmRfaW5kZXgKLQkJCQkJCQkrIFBSRV9UQUdfRU5EX0xFTkdUSCwgcHJlX2luZGV4KS5yZXBsYWNlQWxsKAotCQkJCQkiXHJcbiIgKyBpbmRlbnRTdHIsICJcclxuIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCWxhc3RfcHJlX2VuZF9pbmRleCA9IGh0bWwuaW5kZXhPZihQUkVfVEFHX0VORCwgcHJlX2luZGV4KTsKLQkJCWlmIChsYXN0X3ByZV9lbmRfaW5kZXggIT0gLTEpIHsKLQkJCQlzdHJCdWYuYXBwZW5kKGh0bWwuc3Vic3RyaW5nKHByZV9pbmRleCwgbGFzdF9wcmVfZW5kX2luZGV4Ci0JCQkJCQkrIFBSRV9UQUdfRU5EX0xFTkdUSCkpOwotCQkJfSBlbHNlIHsKLQkJCQkvLyBmb3VuZCA8cHJlPiwgYnV0IG5vIGVuZGluZyA8L3ByZT4gLSBzaG91bGRuJ3QgZXZlciBnZXQgaGVyZQotCQkJCS8vIGFwcGVuZCByZXN0IG9mIHN0cmluZyBhbmQgcmV0dXJuIGl0Ci0JCQkJc3RyQnVmLmFwcGVuZChodG1sLnN1YnN0cmluZyhwcmVfaW5kZXgpKTsKLQkJCQlyZXR1cm4gc3RyQnVmLnRvU3RyaW5nKCk7Ci0JCQl9Ci0JCX0KLQkJc3RyQnVmLmFwcGVuZChodG1sLnN1YnN0cmluZygKLQkJCQlsYXN0X3ByZV9lbmRfaW5kZXggPCAwID8gMCA6IGxhc3RfcHJlX2VuZF9pbmRleAotCQkJCQkJKyBQUkVfVEFHX0VORF9MRU5HVEgpLnJlcGxhY2VBbGwoIlxyXG4iICsgaW5kZW50U3RyLCAvLyROT04tTkxTLTEkCi0JCQkJIlxyXG4iKSk7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIHN0ckJ1Zi50b1N0cmluZygpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TGFzdEVycm9yU3RyKCkgewotCQlyZXR1cm4gbGFzdEVycm9yU3RyOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZW1vdmVMZWFkaW5nV2hpdGVzcGFjZShTdHJpbmcgaW5wdXQpIHsKLQkJcmV0dXJuIHBfd2hpdGVzcGFjZS5tYXRjaGVyKGlucHV0KS5yZXBsYWNlQWxsKCIiKTsgLy8kTk9OLU5MUy0xJAotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vaHRtbC9IVE1MUGFyc2VyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL2h0bWwvSFRNTFBhcnNlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZTcyNDg5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vaHRtbC9IVE1MUGFyc2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5odG1sOwotCi1pbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLlN0cmluZ1dyaXRlcjsKLWltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKLQotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotaW1wb3J0IG9yZy53M2MudGlkeS5UaWR5OwotCi0vKioKLSAqIEV4dHJhY3RzIHRoZSB0aXRsZSwgbWV0YSB0YWdzIGFuZCB0ZXh0IGZyb20gYSBIVE1MIGZpbGUgb3Igc291cmNlLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEhUTUxQYXJzZXIgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEJVRkZFUl9TSVpFID0gNDA5NjsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBIVE1MX1NDUklQVF9UQUcgPSAic2NyaXB0IjsgLy8kTk9OLU5MUy0xJAkKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBIVE1MX1RJVExFX1RBRyA9ICJ0aXRsZSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBIVE1MX01FVEFfVEFHID0gIm1ldGEiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIFRpZHkgdGlkeTsKLQotCXByaXZhdGUgU3RyaW5nIHRpdGxlOwotCi0JcHJpdmF0ZSBTdHJpbmcgc3VtbWFyeTsKLQotCXByaXZhdGUgU3RyaW5nIHRleHQ7Ci0KLQlwcml2YXRlIFByb3BlcnRpZXMgbWV0YVRhZ3M7Ci0KLQlwcml2YXRlIFN0cmluZ0J1ZmZlciBodG1sVGV4dDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIEhUTUxQYXJzZXIoKSB7Ci0JCXRyeSB7Ci0JCQl0aWR5ID0gbmV3IFRpZHkoKTsKLQkJCXRpZHkuc2V0WEhUTUwodHJ1ZSk7Ci0JCQl0aWR5LnNldERyb3BFbXB0eVBhcmFzKHRydWUpOwotCQkJdGlkeS5zZXREcm9wRm9udFRhZ3ModHJ1ZSk7Ci0JCQl0aWR5LnNldFF1aWV0KHRydWUpOwotCQkJdGlkeS5zZXRTaG93V2FybmluZ3MoZmFsc2UpOwotCQkJdGlkeS5zZXRTbWFydEluZGVudChmYWxzZSk7Ci0JCQl0aWR5LnNldFRpZHlNYXJrKGZhbHNlKTsKLQkJCXRpZHkuc2V0V3JhcGxlbigxMzIpOwotCQkJdGlkeS5zZXRJbmRlbnRBdHRyaWJ1dGVzKGZhbHNlKTsKLQkJCXRpZHkuc2V0SW5kZW50Q29udGVudChmYWxzZSk7Ci0JCQl0aWR5LnNldFNwYWNlcygyKTsKLQkJCXRpZHkuc2V0SW5wdXRFbmNvZGluZygiVVRGLTgiKTsgLy8kTk9OLU5MUy0xJAotCQkJdGlkeS5zZXRPdXRwdXRFbmNvZGluZygiVVRGLTgiKTsgLy8kTk9OLU5MUy0xJAotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJdGlkeSA9IG51bGw7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBQYXJzZXMgdGhlIGdpdmVuIEhUTUwgZmlsZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBwYXJzZShGaWxlIGZpbGUpIHRocm93cyBFeGNlcHRpb24gewotCQlpZiAodGlkeSA9PSBudWxsIHx8ICFmaWxlLmV4aXN0cygpIHx8ICFmaWxlLmNhblJlYWQoKSkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJRmlsZUlucHV0U3RyZWFtIGZpcyA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oZmlsZSk7Ci0JCUlucHV0U3RyZWFtUmVhZGVyIGlzciA9IG5ldyBJbnB1dFN0cmVhbVJlYWRlcihmaXMsICJVVEYtOCIpOyAvLyROT04tTkxTLTEkCi0JCUJ1ZmZlcmVkUmVhZGVyIGJyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKGlzcik7Ci0KLQkJU3RyaW5nQnVmZmVyIHRleHRCdWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKEJVRkZFUl9TSVpFKTsKLQkJY2hhcltdIGJ1ZmZlciA9IG5ldyBjaGFyW0JVRkZFUl9TSVpFXTsKLQkJaW50IGNoYXJzUmVhZDsKLQkJd2hpbGUgKChjaGFyc1JlYWQgPSBici5yZWFkKGJ1ZmZlciwgMCwgQlVGRkVSX1NJWkUpKSA+IDApIHsKLQkJCXRleHRCdWZmZXIuYXBwZW5kKGJ1ZmZlciwgMCwgY2hhcnNSZWFkKTsKLQkJfQotCi0JCXBhcnNlKHRleHRCdWZmZXIudG9TdHJpbmcoKSk7Ci0KLQkJaWYgKGJyICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJYnIuY2xvc2UoKTsKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFBhcnNlcyB0aGUgZ2l2ZW4gSFRNTCBzb3VyY2UuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcGFyc2UoU3RyaW5nIGh0bWxTb3VyY2UpIHRocm93cyBFeGNlcHRpb24gewotCQl0aXRsZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCXN1bW1hcnkgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQl0ZXh0ID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJbWV0YVRhZ3MgPSBuZXcgUHJvcGVydGllcygpOwotCi0JCURvY3VtZW50IGRvYyA9IGdldERvY3VtZW50KGh0bWxTb3VyY2UpOwotCQlpZiAoZG9jICE9IG51bGwpIHsKLQkJCWh0bWxUZXh0ID0gbmV3IFN0cmluZ0J1ZmZlcigxMDI0KTsKLQkJCWV4dHJhY3QoZG9jLmdldENoaWxkTm9kZXMoKSk7Ci0JCQl0ZXh0ID0gaHRtbFRleHQudG9TdHJpbmcoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHRpdGxlIHRleHQuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUaXRsZSgpIHsKLQkJcmV0dXJuIHRpdGxlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIEhUTUwgbWV0YSB0YWdzLgotCSAqLwotCXB1YmxpYyBQcm9wZXJ0aWVzIGdldE1ldGFUYWdzKCkgewotCQlyZXR1cm4gbWV0YVRhZ3M7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc3VtbWFyeS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFN1bW1hcnkoKSB7Ci0JCXJldHVybiBzdW1tYXJ5OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGJvZHkgdGV4dC4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7Ci0JCXJldHVybiB0ZXh0OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIERPTSBkb2N1bWVudCBmb3IgdGhlIGdpdmVuIEhUTUwgc291cmNlLgotCSAqLwotCXByb3RlY3RlZCBEb2N1bWVudCBnZXREb2N1bWVudChTdHJpbmcgaHRtbCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWlmIChodG1sID09IG51bGwgfHwgaHRtbC5sZW5ndGgoKSA9PSAwKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCUJ5dGVBcnJheUlucHV0U3RyZWFtIGlucHV0ID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGh0bWwKLQkJCQkuZ2V0Qnl0ZXMoIlVURi04IikpOyAvLyROT04tTkxTLTEkCQotCQlCeXRlQXJyYXlPdXRwdXRTdHJlYW0gb3V0cHV0ID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotCi0JCVN0cmluZ1dyaXRlciBzdyA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLQkJUHJpbnRXcml0ZXIgcHcgPSBuZXcgUHJpbnRXcml0ZXIoc3cpOwotCQl0aWR5LnNldEVycm91dChwdyk7Ci0KLQkJcmV0dXJuIHRpZHkucGFyc2VET00oaW5wdXQsIG91dHB1dCk7Ci0JfQotCi0JLyoqCi0JICogRXh0cmFjdHMgdGhlIHRpdGxlLCBtZXRhIHRhZ3MgYW5kIGJvZHkgdGV4dCBmcm9tIHRoZSBnaXZlbiBub2Rlcy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBleHRyYWN0KE5vZGVMaXN0IG5vZGVzKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbm9kZXMuZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJTm9kZSBub2RlID0gbm9kZXMuaXRlbShpKTsKLQkJCVN0cmluZyBub2RlTmFtZSA9IG5vZGUuZ2V0Tm9kZU5hbWUoKTsKLQkJCXN3aXRjaCAobm9kZS5nZXROb2RlVHlwZSgpKSB7Ci0JCQljYXNlIE5vZGUuRUxFTUVOVF9OT0RFOgotCQkJCWlmICghbm9kZU5hbWUuZXF1YWxzKEhUTUxfU0NSSVBUX1RBRykpIHsKLQkJCQkJTmFtZWROb2RlTWFwIGF0dHJzID0gbm9kZS5nZXRBdHRyaWJ1dGVzKCk7Ci0JCQkJCWZvciAoaW50IGogPSAwOyBqIDwgYXR0cnMuZ2V0TGVuZ3RoKCk7IGorKykgewotCQkJCQkJTm9kZSBhdHRyTm9kZSA9IGF0dHJzLml0ZW0oaik7Ci0JCQkJCQlTdHJpbmcgYXR0ck5vZGVOYW1lID0gYXR0ck5vZGUuZ2V0Tm9kZU5hbWUoKTsKLQkJCQkJCVN0cmluZyBhdHRyTm9kZVZhbHVlID0gYXR0ck5vZGUuZ2V0Tm9kZVZhbHVlKCk7Ci0JCQkJCQlpZiAoYXR0ck5vZGVOYW1lLmVxdWFscyhIVE1MX1RJVExFX1RBRykpIHsKLQkJCQkJCQl0aXRsZSA9IGF0dHJOb2RlVmFsdWU7Ci0JCQkJCQl9IGVsc2UgaWYgKGF0dHJOb2RlTmFtZS5lcXVhbHMoSFRNTF9NRVRBX1RBRykpIHsKLQkJCQkJCQltZXRhVGFncy5wdXQoYXR0ck5vZGVOYW1lLCBhdHRyTm9kZVZhbHVlKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlOb2RlTGlzdCBjaGlsZE5vZGVzID0gbm9kZS5nZXRDaGlsZE5vZGVzKCk7Ci0JCQkJCWlmIChjaGlsZE5vZGVzICE9IG51bGwgJiYgY2hpbGROb2Rlcy5nZXRMZW5ndGgoKSA+IDApIHsKLQkJCQkJCWV4dHJhY3QoY2hpbGROb2Rlcyk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIE5vZGUuVEVYVF9OT0RFOgotCQkJCWh0bWxUZXh0LmFwcGVuZChub2RlLmdldE5vZGVWYWx1ZSgpKS5hcHBlbmQoJyAnKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi9odG1sL3BhY2thZ2UuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vaHRtbC9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjNTJiYmEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi9odG1sL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIGNvbW1vbiBIVE1MIHBhcnNpbmcgYW5kIHByZXR0eS1mb3JtYXRpbmcgc2VydmljZXMuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi9wYWNrYWdlLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjFmODkzZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIHRoZSBhY3RpdmF0b3IgZm9yIG1hbmFnaW5nIHRoZSBDb21tb24gcGx1Zy1pbidzIGxpZmUgY3ljbGUuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi9wcmVmZXJlbmNlcy9JUHJlZmVyZW5jZVN0b3JlV3JhcHBlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi9wcmVmZXJlbmNlcy9JUHJlZmVyZW5jZVN0b3JlV3JhcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMGYxODk2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vcHJlZmVyZW5jZXMvSVByZWZlcmVuY2VTdG9yZVdyYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzMCArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5jb21tb24ucHJlZmVyZW5jZXM7Ci0KLQotLyoqCi0gKiB3cmFwcGVyIGludGVyZmFjZSBmb3IgcHJlZmVyZW5jZSBzdG9yZQotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuNQotICoKLSAqLwotcHVibGljIGludGVyZmFjZSBJUHJlZmVyZW5jZVN0b3JlV3JhcHBlciB7Ci0KLQkvL3B1YmxpYyBPYmplY3QgZ2V0U3RvcmUoKTsKLQkKLQlwdWJsaWMgdm9pZCBhZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKElQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyV3JhcHBlciBsaXN0ZW5lcik7Ci0JcHVibGljIHZvaWQgZmlyZVByb3BlcnR5Q2hhbmdlRXZlbnQoU3RyaW5nIG5hbWUsIE9iamVjdCBvbGRWYWx1ZSwKLQkgICAgICAgICAgICBPYmplY3QgbmV3VmFsdWUpOwotICAgIHB1YmxpYyB2b2lkIHJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJXcmFwcGVyIGxpc3RlbmVyKTsKLQotCS8qKgotICAgICAqIFJldHVybnMgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIGJvb2xlYW4tdmFsdWVkIHByZWZlcmVuY2Ugd2l0aCB0aGUKLSAgICAgKiBnaXZlbiBuYW1lLgotICAgICAqIFJldHVybnMgdGhlIGRlZmF1bHQtZGVmYXVsdCB2YWx1ZSAoPGNvZGU+ZmFsc2U8L2NvZGU+KSBpZiB0aGVyZQotICAgICAqIGlzIG5vIHByZWZlcmVuY2Ugd2l0aCB0aGUgZ2l2ZW4gbmFtZSwgb3IgaWYgdGhlIGN1cnJlbnQgdmFsdWUgCi0gICAgICogY2Fubm90IGJlIHRyZWF0ZWQgYXMgYSBib29sZWFuLgotICAgICAqCi0gICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIHByZWZlcmVuY2UKLSAgICAgKiBAcmV0dXJuIHRoZSBib29sZWFuLXZhbHVlZCBwcmVmZXJlbmNlCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gZ2V0Qm9vbGVhbihTdHJpbmcgbmFtZSk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBkZWZhdWx0IHZhbHVlIGZvciB0aGUgYm9vbGVhbi12YWx1ZWQgcHJlZmVyZW5jZQotICAgICAqIHdpdGggdGhlIGdpdmVuIG5hbWUuCi0gICAgICogUmV0dXJucyB0aGUgZGVmYXVsdC1kZWZhdWx0IHZhbHVlICg8Y29kZT5mYWxzZTwvY29kZT4pIGlmIHRoZXJlCi0gICAgICogaXMgbm8gZGVmYXVsdCBwcmVmZXJlbmNlIHdpdGggdGhlIGdpdmVuIG5hbWUsIG9yIGlmIHRoZSBkZWZhdWx0IAotICAgICAqIHZhbHVlIGNhbm5vdCBiZSB0cmVhdGVkIGFzIGEgYm9vbGVhbi4KLSAgICAgKgotICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBwcmVmZXJlbmNlCi0gICAgICogQHJldHVybiB0aGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgbmFtZWQgcHJlZmVyZW5jZQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGdldERlZmF1bHRCb29sZWFuKFN0cmluZyBuYW1lKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGRlZmF1bHQgdmFsdWUgZm9yIHRoZSBkb3VibGUtdmFsdWVkIHByZWZlcmVuY2UKLSAgICAgKiB3aXRoIHRoZSBnaXZlbiBuYW1lLgotICAgICAqIFJldHVybnMgdGhlIGRlZmF1bHQtZGVmYXVsdCB2YWx1ZSAoPGNvZGU+MC4wPC9jb2RlPikgaWYgdGhlcmUKLSAgICAgKiBpcyBubyBkZWZhdWx0IHByZWZlcmVuY2Ugd2l0aCB0aGUgZ2l2ZW4gbmFtZSwgb3IgaWYgdGhlIGRlZmF1bHQgCi0gICAgICogdmFsdWUgY2Fubm90IGJlIHRyZWF0ZWQgYXMgYSBkb3VibGUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgcHJlZmVyZW5jZQotICAgICAqIEByZXR1cm4gdGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlIG5hbWVkIHByZWZlcmVuY2UKLSAgICAgKi8KLSAgICBwdWJsaWMgZG91YmxlIGdldERlZmF1bHREb3VibGUoU3RyaW5nIG5hbWUpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZGVmYXVsdCB2YWx1ZSBmb3IgdGhlIGZsb2F0LXZhbHVlZCBwcmVmZXJlbmNlCi0gICAgICogd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KLSAgICAgKiBSZXR1cm5zIHRoZSBkZWZhdWx0LWRlZmF1bHQgdmFsdWUgKDxjb2RlPjAuMGY8L2NvZGU+KSBpZiB0aGVyZQotICAgICAqIGlzIG5vIGRlZmF1bHQgcHJlZmVyZW5jZSB3aXRoIHRoZSBnaXZlbiBuYW1lLCBvciBpZiB0aGUgZGVmYXVsdCAKLSAgICAgKiB2YWx1ZSBjYW5ub3QgYmUgdHJlYXRlZCBhcyBhIGZsb2F0LgotICAgICAqCi0gICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIHByZWZlcmVuY2UKLSAgICAgKiBAcmV0dXJuIHRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSBuYW1lZCBwcmVmZXJlbmNlCi0gICAgICovCi0gICAgcHVibGljIGZsb2F0IGdldERlZmF1bHRGbG9hdChTdHJpbmcgbmFtZSk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBkZWZhdWx0IHZhbHVlIGZvciB0aGUgaW50ZWdlci12YWx1ZWQgcHJlZmVyZW5jZQotICAgICAqIHdpdGggdGhlIGdpdmVuIG5hbWUuCi0gICAgICogUmV0dXJucyB0aGUgZGVmYXVsdC1kZWZhdWx0IHZhbHVlICg8Y29kZT4wPC9jb2RlPikgaWYgdGhlcmUKLSAgICAgKiBpcyBubyBkZWZhdWx0IHByZWZlcmVuY2Ugd2l0aCB0aGUgZ2l2ZW4gbmFtZSwgb3IgaWYgdGhlIGRlZmF1bHQgCi0gICAgICogdmFsdWUgY2Fubm90IGJlIHRyZWF0ZWQgYXMgYW4gaW50ZWdlci4KLSAgICAgKgotICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBwcmVmZXJlbmNlCi0gICAgICogQHJldHVybiB0aGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgbmFtZWQgcHJlZmVyZW5jZQotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0RGVmYXVsdEludChTdHJpbmcgbmFtZSk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBkZWZhdWx0IHZhbHVlIGZvciB0aGUgbG9uZy12YWx1ZWQgcHJlZmVyZW5jZQotICAgICAqIHdpdGggdGhlIGdpdmVuIG5hbWUuCi0gICAgICogUmV0dXJucyB0aGUgZGVmYXVsdC1kZWZhdWx0IHZhbHVlICg8Y29kZT4wTDwvY29kZT4pIGlmIHRoZXJlCi0gICAgICogaXMgbm8gZGVmYXVsdCBwcmVmZXJlbmNlIHdpdGggdGhlIGdpdmVuIG5hbWUsIG9yIGlmIHRoZSBkZWZhdWx0IAotICAgICAqIHZhbHVlIGNhbm5vdCBiZSB0cmVhdGVkIGFzIGEgbG9uZy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBwcmVmZXJlbmNlCi0gICAgICogQHJldHVybiB0aGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgbmFtZWQgcHJlZmVyZW5jZQotICAgICAqLwotICAgIHB1YmxpYyBsb25nIGdldERlZmF1bHRMb25nKFN0cmluZyBuYW1lKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGRlZmF1bHQgdmFsdWUgZm9yIHRoZSBzdHJpbmctdmFsdWVkIHByZWZlcmVuY2UKLSAgICAgKiB3aXRoIHRoZSBnaXZlbiBuYW1lLgotICAgICAqIFJldHVybnMgdGhlIGRlZmF1bHQtZGVmYXVsdCB2YWx1ZSAodGhlIGVtcHR5IHN0cmluZyA8Y29kZT4iIjwvY29kZT4pIAotICAgICAqIGlzIG5vIGRlZmF1bHQgcHJlZmVyZW5jZSB3aXRoIHRoZSBnaXZlbiBuYW1lLCBvciBpZiB0aGUgZGVmYXVsdCAKLSAgICAgKiB2YWx1ZSBjYW5ub3QgYmUgdHJlYXRlZCBhcyBhIHN0cmluZy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBwcmVmZXJlbmNlCi0gICAgICogQHJldHVybiB0aGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgbmFtZWQgcHJlZmVyZW5jZQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFN0cmluZyhTdHJpbmcgbmFtZSk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBkb3VibGUtdmFsdWVkIHByZWZlcmVuY2Ugd2l0aCB0aGUKLSAgICAgKiBnaXZlbiBuYW1lLgotICAgICAqIFJldHVybnMgdGhlIGRlZmF1bHQtZGVmYXVsdCB2YWx1ZSAoPGNvZGU+MC4wPC9jb2RlPikgaWYgdGhlcmUKLSAgICAgKiBpcyBubyBwcmVmZXJlbmNlIHdpdGggdGhlIGdpdmVuIG5hbWUsIG9yIGlmIHRoZSBjdXJyZW50IHZhbHVlIAotICAgICAqIGNhbm5vdCBiZSB0cmVhdGVkIGFzIGEgZG91YmxlLgotICAgICAqCi0gICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIHByZWZlcmVuY2UKLSAgICAgKiBAcmV0dXJuIHRoZSBkb3VibGUtdmFsdWVkIHByZWZlcmVuY2UKLSAgICAgKi8KLSAgICBwdWJsaWMgZG91YmxlIGdldERvdWJsZShTdHJpbmcgbmFtZSk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBmbG9hdC12YWx1ZWQgcHJlZmVyZW5jZSB3aXRoIHRoZQotICAgICAqIGdpdmVuIG5hbWUuCi0gICAgICogUmV0dXJucyB0aGUgZGVmYXVsdC1kZWZhdWx0IHZhbHVlICg8Y29kZT4wLjBmPC9jb2RlPikgaWYgdGhlcmUKLSAgICAgKiBpcyBubyBwcmVmZXJlbmNlIHdpdGggdGhlIGdpdmVuIG5hbWUsIG9yIGlmIHRoZSBjdXJyZW50IHZhbHVlIAotICAgICAqIGNhbm5vdCBiZSB0cmVhdGVkIGFzIGEgZmxvYXQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgcHJlZmVyZW5jZQotICAgICAqIEByZXR1cm4gdGhlIGZsb2F0LXZhbHVlZCBwcmVmZXJlbmNlCi0gICAgICovCi0gICAgcHVibGljIGZsb2F0IGdldEZsb2F0KFN0cmluZyBuYW1lKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIGludGVnZXItdmFsdWVkIHByZWZlcmVuY2Ugd2l0aCB0aGUKLSAgICAgKiBnaXZlbiBuYW1lLgotICAgICAqIFJldHVybnMgdGhlIGRlZmF1bHQtZGVmYXVsdCB2YWx1ZSAoPGNvZGU+MDwvY29kZT4pIGlmIHRoZXJlCi0gICAgICogaXMgbm8gcHJlZmVyZW5jZSB3aXRoIHRoZSBnaXZlbiBuYW1lLCBvciBpZiB0aGUgY3VycmVudCB2YWx1ZSAKLSAgICAgKiBjYW5ub3QgYmUgdHJlYXRlZCBhcyBhbiBpbnRlZ3Rlci4KLSAgICAgKgotICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBwcmVmZXJlbmNlCi0gICAgICogQHJldHVybiB0aGUgaW50LXZhbHVlZCBwcmVmZXJlbmNlCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXRJbnQoU3RyaW5nIG5hbWUpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgbG9uZy12YWx1ZWQgcHJlZmVyZW5jZSB3aXRoIHRoZQotICAgICAqIGdpdmVuIG5hbWUuCi0gICAgICogUmV0dXJucyB0aGUgZGVmYXVsdC1kZWZhdWx0IHZhbHVlICg8Y29kZT4wTDwvY29kZT4pIGlmIHRoZXJlCi0gICAgICogaXMgbm8gcHJlZmVyZW5jZSB3aXRoIHRoZSBnaXZlbiBuYW1lLCBvciBpZiB0aGUgY3VycmVudCB2YWx1ZSAKLSAgICAgKiBjYW5ub3QgYmUgdHJlYXRlZCBhcyBhIGxvbmcuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgcHJlZmVyZW5jZQotICAgICAqIEByZXR1cm4gdGhlIGxvbmctdmFsdWVkIHByZWZlcmVuY2UKLSAgICAgKi8KLSAgICBwdWJsaWMgbG9uZyBnZXRMb25nKFN0cmluZyBuYW1lKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIHN0cmluZy12YWx1ZWQgcHJlZmVyZW5jZSB3aXRoIHRoZQotICAgICAqIGdpdmVuIG5hbWUuCi0gICAgICogUmV0dXJucyB0aGUgZGVmYXVsdC1kZWZhdWx0IHZhbHVlICh0aGUgZW1wdHkgc3RyaW5nIDxjb2RlPiIiPC9jb2RlPikKLSAgICAgKiBpZiB0aGVyZSBpcyBubyBwcmVmZXJlbmNlIHdpdGggdGhlIGdpdmVuIG5hbWUsIG9yIGlmIHRoZSBjdXJyZW50IHZhbHVlIAotICAgICAqIGNhbm5vdCBiZSB0cmVhdGVkIGFzIGEgc3RyaW5nLgotICAgICAqCi0gICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIHByZWZlcmVuY2UKLSAgICAgKiBAcmV0dXJuIHRoZSBzdHJpbmctdmFsdWVkIHByZWZlcmVuY2UKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcgbmFtZSk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIHByZWZlcmVuY2Ugd2l0aCB0aGUgZ2l2ZW4gbmFtZQotICAgICAqIGhhcyB0aGUgZGVmYXVsdCB2YWx1ZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBwcmVmZXJlbmNlCi0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgcHJlZmVyZW5jZSBoYXMgYSBrbm93biBkZWZhdWx0IHZhbHVlCi0gICAgICogYW5kIGl0cyBjdXJyZW50IHZhbHVlIGlzIHRoZSBzYW1lLCBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotICAgICAqIChpbmNsdWRpbmcgdGhlIGNhc2Ugd2hlcmUgdGhlIHByZWZlcmVuY2UgaXMgdW5rbm93biB0byB0aGlzIHN0b3JlKQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzRGVmYXVsdChTdHJpbmcgbmFtZSk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGN1cnJlbnQgdmFsdWVzIGluIHRoaXMgcHJvcGVydHkgc3RvcmUKLSAgICAgKiByZXF1aXJlIHNhdmluZy4KLSAgICAgKgotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgYXQgbGVhc3Qgb25lIG9mIHZhbHVlcyBvZiAKLSAgICAgKiAgdGhlIHByZWZlcmVuY2VzIGtub3duIHRvIHRoaXMgc3RvcmUgaGFzIGNoYW5nZWQgYW5kIAotICAgICAqICByZXF1aXJlcyBzYXZpbmcsIGFuZCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIG5lZWRzU2F2aW5nKCk7Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBwcmVmZXJlbmNlIHdpdGggdGhlIGdpdmVuIG5hbWUgdG8KLSAgICAgKiB0aGUgZ2l2ZW4gc3RyaW5nIHZhbHVlIHdpdGhvdXQgc2VuZGluZyBhIHByb3BlcnR5IGNoYW5nZS4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIG1ldGhvZCBkb2VzIG5vdCBmaXJlIGEgcHJvcGVydHkgY2hhbmdlIGV2ZW50IGFuZCAKLSAgICAgKiBzaG91bGQgb25seSBiZSB1c2VkIGZvciBzZXR0aW5nIGludGVybmFsIHByZWZlcmVuY2VzIAotICAgICAqIHRoYXQgYXJlIG5vdCBtZWFudCB0byBiZSBwcm9jZXNzZWQgYnkgbGlzdGVuZXJzLgotICAgICAqIE5vcm1hbCBjbGllbnRzIHNob3VsZCBpbnN0ZWFkIGNhbGwgI3NldFZhbHVlLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBwcmVmZXJlbmNlCi0gICAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgY3VycmVudCB2YWx1ZSBvZiB0aGUgcHJlZmVyZW5jZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHB1dFZhbHVlKFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWUpOwotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgZGVmYXVsdCB2YWx1ZSBmb3IgdGhlIGRvdWJsZS12YWx1ZWQgcHJlZmVyZW5jZSB3aXRoIHRoZQotICAgICAqIGdpdmVuIG5hbWUuIAotICAgICAqIDxwPgotICAgICAqIE5vdGUgdGhhdCB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgcHJlZmVyZW5jZSBpcyBhZmZlY3RlZCBpZgotICAgICAqIHRoZSBwcmVmZXJlbmNlJ3MgY3VycmVudCB2YWx1ZSB3YXMgaXRzIG9sZCBkZWZhdWx0IHZhbHVlLCBpbiB3aGljaAotICAgICAqIGNhc2UgaXQgY2hhbmdlcyB0byB0aGUgbmV3IGRlZmF1bHQgdmFsdWUuIElmIHRoZSBwcmVmZXJlbmNlJ3MgY3VycmVudAotICAgICAqIGlzIGRpZmZlcmVudCBmcm9tIGl0cyBvbGQgZGVmYXVsdCB2YWx1ZSwgaXRzIGN1cnJlbnQgdmFsdWUgaXMKLSAgICAgKiB1bmFmZmVjdGVkLiBObyBwcm9wZXJ0eSBjaGFuZ2UgZXZlbnRzIGFyZSByZXBvcnRlZCBieSBjaGFuZ2luZyBkZWZhdWx0Ci0gICAgICogdmFsdWVzLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBwcmVmZXJlbmNlCi0gICAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgZGVmYXVsdCB2YWx1ZSBmb3IgdGhlIHByZWZlcmVuY2UKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXREZWZhdWx0KFN0cmluZyBuYW1lLCBkb3VibGUgdmFsdWUpOwotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgZGVmYXVsdCB2YWx1ZSBmb3IgdGhlIGZsb2F0LXZhbHVlZCBwcmVmZXJlbmNlIHdpdGggdGhlCi0gICAgICogZ2l2ZW4gbmFtZS4gCi0gICAgICogPHA+Ci0gICAgICogTm90ZSB0aGF0IHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBwcmVmZXJlbmNlIGlzIGFmZmVjdGVkIGlmCi0gICAgICogdGhlIHByZWZlcmVuY2UncyBjdXJyZW50IHZhbHVlIHdhcyBpdHMgb2xkIGRlZmF1bHQgdmFsdWUsIGluIHdoaWNoCi0gICAgICogY2FzZSBpdCBjaGFuZ2VzIHRvIHRoZSBuZXcgZGVmYXVsdCB2YWx1ZS4gSWYgdGhlIHByZWZlcmVuY2UncyBjdXJyZW50Ci0gICAgICogaXMgZGlmZmVyZW50IGZyb20gaXRzIG9sZCBkZWZhdWx0IHZhbHVlLCBpdHMgY3VycmVudCB2YWx1ZSBpcwotICAgICAqIHVuYWZmZWN0ZWQuIE5vIHByb3BlcnR5IGNoYW5nZSBldmVudHMgYXJlIHJlcG9ydGVkIGJ5IGNoYW5naW5nIGRlZmF1bHQKLSAgICAgKiB2YWx1ZXMuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIHByZWZlcmVuY2UKLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyBkZWZhdWx0IHZhbHVlIGZvciB0aGUgcHJlZmVyZW5jZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldERlZmF1bHQoU3RyaW5nIG5hbWUsIGZsb2F0IHZhbHVlKTsKLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGRlZmF1bHQgdmFsdWUgZm9yIHRoZSBpbnRlZ2VyLXZhbHVlZCBwcmVmZXJlbmNlIHdpdGggdGhlCi0gICAgICogZ2l2ZW4gbmFtZS4gCi0gICAgICogPHA+Ci0gICAgICogTm90ZSB0aGF0IHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBwcmVmZXJlbmNlIGlzIGFmZmVjdGVkIGlmCi0gICAgICogdGhlIHByZWZlcmVuY2UncyBjdXJyZW50IHZhbHVlIHdhcyBpdHMgb2xkIGRlZmF1bHQgdmFsdWUsIGluIHdoaWNoCi0gICAgICogY2FzZSBpdCBjaGFuZ2VzIHRvIHRoZSBuZXcgZGVmYXVsdCB2YWx1ZS4gSWYgdGhlIHByZWZlcmVuY2UncyBjdXJyZW50Ci0gICAgICogaXMgZGlmZmVyZW50IGZyb20gaXRzIG9sZCBkZWZhdWx0IHZhbHVlLCBpdHMgY3VycmVudCB2YWx1ZSBpcwotICAgICAqIHVuYWZmZWN0ZWQuIE5vIHByb3BlcnR5IGNoYW5nZSBldmVudHMgYXJlIHJlcG9ydGVkIGJ5IGNoYW5naW5nIGRlZmF1bHQKLSAgICAgKiB2YWx1ZXMuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIHByZWZlcmVuY2UKLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyBkZWZhdWx0IHZhbHVlIGZvciB0aGUgcHJlZmVyZW5jZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldERlZmF1bHQoU3RyaW5nIG5hbWUsIGludCB2YWx1ZSk7Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBkZWZhdWx0IHZhbHVlIGZvciB0aGUgbG9uZy12YWx1ZWQgcHJlZmVyZW5jZSB3aXRoIHRoZQotICAgICAqIGdpdmVuIG5hbWUuIAotICAgICAqIDxwPgotICAgICAqIE5vdGUgdGhhdCB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgcHJlZmVyZW5jZSBpcyBhZmZlY3RlZCBpZgotICAgICAqIHRoZSBwcmVmZXJlbmNlJ3MgY3VycmVudCB2YWx1ZSB3YXMgaXRzIG9sZCBkZWZhdWx0IHZhbHVlLCBpbiB3aGljaAotICAgICAqIGNhc2UgaXQgY2hhbmdlcyB0byB0aGUgbmV3IGRlZmF1bHQgdmFsdWUuIElmIHRoZSBwcmVmZXJlbmNlJ3MgY3VycmVudAotICAgICAqIGlzIGRpZmZlcmVudCBmcm9tIGl0cyBvbGQgZGVmYXVsdCB2YWx1ZSwgaXRzIGN1cnJlbnQgdmFsdWUgaXMKLSAgICAgKiB1bmFmZmVjdGVkLiBObyBwcm9wZXJ0eSBjaGFuZ2UgZXZlbnRzIGFyZSByZXBvcnRlZCBieSBjaGFuZ2luZyBkZWZhdWx0Ci0gICAgICogdmFsdWVzLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBwcmVmZXJlbmNlCi0gICAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgZGVmYXVsdCB2YWx1ZSBmb3IgdGhlIHByZWZlcmVuY2UKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXREZWZhdWx0KFN0cmluZyBuYW1lLCBsb25nIHZhbHVlKTsKLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGRlZmF1bHQgdmFsdWUgZm9yIHRoZSBzdHJpbmctdmFsdWVkIHByZWZlcmVuY2Ugd2l0aCB0aGUKLSAgICAgKiBnaXZlbiBuYW1lLiAKLSAgICAgKiA8cD4KLSAgICAgKiBOb3RlIHRoYXQgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIHByZWZlcmVuY2UgaXMgYWZmZWN0ZWQgaWYKLSAgICAgKiB0aGUgcHJlZmVyZW5jZSdzIGN1cnJlbnQgdmFsdWUgd2FzIGl0cyBvbGQgZGVmYXVsdCB2YWx1ZSwgaW4gd2hpY2gKLSAgICAgKiBjYXNlIGl0IGNoYW5nZXMgdG8gdGhlIG5ldyBkZWZhdWx0IHZhbHVlLiBJZiB0aGUgcHJlZmVyZW5jZSdzIGN1cnJlbnQKLSAgICAgKiBpcyBkaWZmZXJlbnQgZnJvbSBpdHMgb2xkIGRlZmF1bHQgdmFsdWUsIGl0cyBjdXJyZW50IHZhbHVlIGlzCi0gICAgICogdW5hZmZlY3RlZC4gTm8gcHJvcGVydHkgY2hhbmdlIGV2ZW50cyBhcmUgcmVwb3J0ZWQgYnkgY2hhbmdpbmcgZGVmYXVsdAotICAgICAqIHZhbHVlcy4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgcHJlZmVyZW5jZQotICAgICAqIEBwYXJhbSBkZWZhdWx0T2JqZWN0IHRoZSBuZXcgZGVmYXVsdCB2YWx1ZSBmb3IgdGhlIHByZWZlcmVuY2UKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXREZWZhdWx0KFN0cmluZyBuYW1lLCBTdHJpbmcgZGVmYXVsdE9iamVjdCk7Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBkZWZhdWx0IHZhbHVlIGZvciB0aGUgYm9vbGVhbi12YWx1ZWQgcHJlZmVyZW5jZSB3aXRoIHRoZQotICAgICAqIGdpdmVuIG5hbWUuIAotICAgICAqIDxwPgotICAgICAqIE5vdGUgdGhhdCB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgcHJlZmVyZW5jZSBpcyBhZmZlY3RlZCBpZgotICAgICAqIHRoZSBwcmVmZXJlbmNlJ3MgY3VycmVudCB2YWx1ZSB3YXMgaXRzIG9sZCBkZWZhdWx0IHZhbHVlLCBpbiB3aGljaAotICAgICAqIGNhc2UgaXQgY2hhbmdlcyB0byB0aGUgbmV3IGRlZmF1bHQgdmFsdWUuIElmIHRoZSBwcmVmZXJlbmNlJ3MgY3VycmVudAotICAgICAqIGlzIGRpZmZlcmVudCBmcm9tIGl0cyBvbGQgZGVmYXVsdCB2YWx1ZSwgaXRzIGN1cnJlbnQgdmFsdWUgaXMKLSAgICAgKiB1bmFmZmVjdGVkLiBObyBwcm9wZXJ0eSBjaGFuZ2UgZXZlbnRzIGFyZSByZXBvcnRlZCBieSBjaGFuZ2luZyBkZWZhdWx0Ci0gICAgICogdmFsdWVzLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBwcmVmZXJlbmNlCi0gICAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgZGVmYXVsdCB2YWx1ZSBmb3IgdGhlIHByZWZlcmVuY2UKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXREZWZhdWx0KFN0cmluZyBuYW1lLCBib29sZWFuIHZhbHVlKTsKLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIHByZWZlcmVuY2Ugd2l0aCB0aGUgZ2l2ZW4gbmFtZSBiYWNrCi0gICAgICogdG8gaXRzIGRlZmF1bHQgdmFsdWUuCi0gICAgICogPHA+Ci0gICAgICogTm90ZSB0aGF0IHRoZSBwcmVmZXJyZWQgd2F5IG9mIHJlLWluaXRpYWxpemluZyBhIHByZWZlcmVuY2UgdG8gdGhlCi0gICAgICogYXBwcm9wcmlhdGUgZGVmYXVsdCB2YWx1ZSBpcyB0byBjYWxsIDxjb2RlPnNldFRvRGVmYXVsdDwvY29kZT4uCi0gICAgICogVGhpcyBpcyBpbXBsZW1lbnRlZCBieSByZW1vdmluZyB0aGUgbmFtZWQgdmFsdWUgZnJvbSB0aGUgc3RvcmUsIAotICAgICAqIHRoZXJlYnkgZXhwb3NpbmcgdGhlIGRlZmF1bHQgdmFsdWUuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIHByZWZlcmVuY2UKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRUb0RlZmF1bHQoU3RyaW5nIG5hbWUpOwotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgZG91YmxlLXZhbHVlZCBwcmVmZXJlbmNlIHdpdGggdGhlCi0gICAgICogZ2l2ZW4gbmFtZS4KLSAgICAgKiA8cD4KLSAgICAgKiBBIHByb3BlcnR5IGNoYW5nZSBldmVudCBpcyByZXBvcnRlZCBpZiB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgCi0gICAgICogcHJlZmVyZW5jZSBhY3R1YWxseSBjaGFuZ2VzIGZyb20gaXRzIHByZXZpb3VzIHZhbHVlLiBJbiB0aGUgZXZlbnQKLSAgICAgKiBvYmplY3QsIHRoZSBwcm9wZXJ0eSBuYW1lIGlzIHRoZSBuYW1lIG9mIHRoZSBwcmVmZXJlbmNlLCBhbmQgdGhlCi0gICAgICogb2xkIGFuZCBuZXcgdmFsdWVzIGFyZSB3cmFwcGVkIGFzIG9iamVjdHMuCi0gICAgICogPC9wPgotICAgICAqIDxwPgotICAgICAqIE5vdGUgdGhhdCB0aGUgcHJlZmVycmVkIHdheSBvZiByZS1pbml0aWFsaXppbmcgYSBwcmVmZXJlbmNlIHRvIGl0cwotICAgICAqIGRlZmF1bHQgdmFsdWUgaXMgdG8gY2FsbCA8Y29kZT5zZXRUb0RlZmF1bHQ8L2NvZGU+LgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBwcmVmZXJlbmNlCi0gICAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgY3VycmVudCB2YWx1ZSBvZiB0aGUgcHJlZmVyZW5jZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyBuYW1lLCBkb3VibGUgdmFsdWUpOwotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgZmxvYXQtdmFsdWVkIHByZWZlcmVuY2Ugd2l0aCB0aGUKLSAgICAgKiBnaXZlbiBuYW1lLgotICAgICAqIDxwPgotICAgICAqIEEgcHJvcGVydHkgY2hhbmdlIGV2ZW50IGlzIHJlcG9ydGVkIGlmIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSAKLSAgICAgKiBwcmVmZXJlbmNlIGFjdHVhbGx5IGNoYW5nZXMgZnJvbSBpdHMgcHJldmlvdXMgdmFsdWUuIEluIHRoZSBldmVudAotICAgICAqIG9iamVjdCwgdGhlIHByb3BlcnR5IG5hbWUgaXMgdGhlIG5hbWUgb2YgdGhlIHByZWZlcmVuY2UsIGFuZCB0aGUKLSAgICAgKiBvbGQgYW5kIG5ldyB2YWx1ZXMgYXJlIHdyYXBwZWQgYXMgb2JqZWN0cy4KLSAgICAgKiA8L3A+Ci0gICAgICogPHA+Ci0gICAgICogTm90ZSB0aGF0IHRoZSBwcmVmZXJyZWQgd2F5IG9mIHJlLWluaXRpYWxpemluZyBhIHByZWZlcmVuY2UgdG8gaXRzCi0gICAgICogZGVmYXVsdCB2YWx1ZSBpcyB0byBjYWxsIDxjb2RlPnNldFRvRGVmYXVsdDwvY29kZT4uCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIHByZWZlcmVuY2UKLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyBjdXJyZW50IHZhbHVlIG9mIHRoZSBwcmVmZXJlbmNlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VmFsdWUoU3RyaW5nIG5hbWUsIGZsb2F0IHZhbHVlKTsKLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIGludGVnZXItdmFsdWVkIHByZWZlcmVuY2Ugd2l0aCB0aGUKLSAgICAgKiBnaXZlbiBuYW1lLgotICAgICAqIDxwPgotICAgICAqIEEgcHJvcGVydHkgY2hhbmdlIGV2ZW50IGlzIHJlcG9ydGVkIGlmIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSAKLSAgICAgKiBwcmVmZXJlbmNlIGFjdHVhbGx5IGNoYW5nZXMgZnJvbSBpdHMgcHJldmlvdXMgdmFsdWUuIEluIHRoZSBldmVudAotICAgICAqIG9iamVjdCwgdGhlIHByb3BlcnR5IG5hbWUgaXMgdGhlIG5hbWUgb2YgdGhlIHByZWZlcmVuY2UsIGFuZCB0aGUKLSAgICAgKiBvbGQgYW5kIG5ldyB2YWx1ZXMgYXJlIHdyYXBwZWQgYXMgb2JqZWN0cy4KLSAgICAgKiA8L3A+Ci0gICAgICogPHA+Ci0gICAgICogTm90ZSB0aGF0IHRoZSBwcmVmZXJyZWQgd2F5IG9mIHJlLWluaXRpYWxpemluZyBhIHByZWZlcmVuY2UgdG8gaXRzCi0gICAgICogZGVmYXVsdCB2YWx1ZSBpcyB0byBjYWxsIDxjb2RlPnNldFRvRGVmYXVsdDwvY29kZT4uCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIHByZWZlcmVuY2UKLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyBjdXJyZW50IHZhbHVlIG9mIHRoZSBwcmVmZXJlbmNlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VmFsdWUoU3RyaW5nIG5hbWUsIGludCB2YWx1ZSk7Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBsb25nLXZhbHVlZCBwcmVmZXJlbmNlIHdpdGggdGhlCi0gICAgICogZ2l2ZW4gbmFtZS4KLSAgICAgKiA8cD4KLSAgICAgKiBBIHByb3BlcnR5IGNoYW5nZSBldmVudCBpcyByZXBvcnRlZCBpZiB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgCi0gICAgICogcHJlZmVyZW5jZSBhY3R1YWxseSBjaGFuZ2VzIGZyb20gaXRzIHByZXZpb3VzIHZhbHVlLiBJbiB0aGUgZXZlbnQKLSAgICAgKiBvYmplY3QsIHRoZSBwcm9wZXJ0eSBuYW1lIGlzIHRoZSBuYW1lIG9mIHRoZSBwcmVmZXJlbmNlLCBhbmQgdGhlCi0gICAgICogb2xkIGFuZCBuZXcgdmFsdWVzIGFyZSB3cmFwcGVkIGFzIG9iamVjdHMuCi0gICAgICogPC9wPgotICAgICAqIDxwPgotICAgICAqIE5vdGUgdGhhdCB0aGUgcHJlZmVycmVkIHdheSBvZiByZS1pbml0aWFsaXppbmcgYSBwcmVmZXJlbmNlIHRvIGl0cwotICAgICAqIGRlZmF1bHQgdmFsdWUgaXMgdG8gY2FsbCA8Y29kZT5zZXRUb0RlZmF1bHQ8L2NvZGU+LgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBwcmVmZXJlbmNlCi0gICAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgY3VycmVudCB2YWx1ZSBvZiB0aGUgcHJlZmVyZW5jZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyBuYW1lLCBsb25nIHZhbHVlKTsKLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIHN0cmluZy12YWx1ZWQgcHJlZmVyZW5jZSB3aXRoIHRoZQotICAgICAqIGdpdmVuIG5hbWUuCi0gICAgICogPHA+Ci0gICAgICogQSBwcm9wZXJ0eSBjaGFuZ2UgZXZlbnQgaXMgcmVwb3J0ZWQgaWYgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIAotICAgICAqIHByZWZlcmVuY2UgYWN0dWFsbHkgY2hhbmdlcyBmcm9tIGl0cyBwcmV2aW91cyB2YWx1ZS4gSW4gdGhlIGV2ZW50Ci0gICAgICogb2JqZWN0LCB0aGUgcHJvcGVydHkgbmFtZSBpcyB0aGUgbmFtZSBvZiB0aGUgcHJlZmVyZW5jZSwgYW5kIHRoZQotICAgICAqIG9sZCBhbmQgbmV3IHZhbHVlcyBhcmUgd3JhcHBlZCBhcyBvYmplY3RzLgotICAgICAqIDwvcD4KLSAgICAgKiA8cD4KLSAgICAgKiBOb3RlIHRoYXQgdGhlIHByZWZlcnJlZCB3YXkgb2YgcmUtaW5pdGlhbGl6aW5nIGEgcHJlZmVyZW5jZSB0byBpdHMKLSAgICAgKiBkZWZhdWx0IHZhbHVlIGlzIHRvIGNhbGwgPGNvZGU+c2V0VG9EZWZhdWx0PC9jb2RlPi4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgcHJlZmVyZW5jZQotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IGN1cnJlbnQgdmFsdWUgb2YgdGhlIHByZWZlcmVuY2UKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRWYWx1ZShTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlKTsKLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIGJvb2xlYW4tdmFsdWVkIHByZWZlcmVuY2Ugd2l0aCB0aGUKLSAgICAgKiBnaXZlbiBuYW1lLgotICAgICAqIDxwPgotICAgICAqIEEgcHJvcGVydHkgY2hhbmdlIGV2ZW50IGlzIHJlcG9ydGVkIGlmIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSAKLSAgICAgKiBwcmVmZXJlbmNlIGFjdHVhbGx5IGNoYW5nZXMgZnJvbSBpdHMgcHJldmlvdXMgdmFsdWUuIEluIHRoZSBldmVudAotICAgICAqIG9iamVjdCwgdGhlIHByb3BlcnR5IG5hbWUgaXMgdGhlIG5hbWUgb2YgdGhlIHByZWZlcmVuY2UsIGFuZCB0aGUKLSAgICAgKiBvbGQgYW5kIG5ldyB2YWx1ZXMgYXJlIHdyYXBwZWQgYXMgb2JqZWN0cy4KLSAgICAgKiA8L3A+Ci0gICAgICogPHA+Ci0gICAgICogTm90ZSB0aGF0IHRoZSBwcmVmZXJyZWQgd2F5IG9mIHJlLWluaXRpYWxpemluZyBhIHByZWZlcmVuY2UgdG8gaXRzCi0gICAgICogZGVmYXVsdCB2YWx1ZSBpcyB0byBjYWxsIDxjb2RlPnNldFRvRGVmYXVsdDwvY29kZT4uCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIHByZWZlcmVuY2UKLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyBjdXJyZW50IHZhbHVlIG9mIHRoZSBwcmVmZXJlbmNlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VmFsdWUoU3RyaW5nIG5hbWUsIGJvb2xlYW4gdmFsdWUpOwotICAgIAotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi9wcmVmZXJlbmNlcy9JUHJvcGVydHlDaGFuZ2VFdmVudFdyYXBwZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vcHJlZmVyZW5jZXMvSVByb3BlcnR5Q2hhbmdlRXZlbnRXcmFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5NjI0ZmIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi9wcmVmZXJlbmNlcy9JUHJvcGVydHlDaGFuZ2VFdmVudFdyYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5wcmVmZXJlbmNlczsKLQotLyoqCi0gKiB3cmFwcGVyIGludGVyZmFjZSBmb3IgcHJvcGVydHkgY2hhbmdlIGV2ZW50Ci0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS41Ci0gKgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElQcm9wZXJ0eUNoYW5nZUV2ZW50V3JhcHBlciB7Ci0KLQkgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBuZXcgdmFsdWUgb2YgdGhlIHByb3BlcnR5LgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgbmV3IHZhbHVlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub3Qga25vd24KLSAgICAgKiAgb3Igbm90IHJlbGV2YW50IChmb3IgaW5zdGFuY2UgaWYgdGhlIHByb3BlcnR5IHdhcyByZW1vdmVkKS4KLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGdldE5ld1ZhbHVlKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBvbGQgdmFsdWUgb2YgdGhlIHByb3BlcnR5LgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgb2xkIHZhbHVlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub3Qga25vd24KLSAgICAgKiAgb3Igbm90IHJlbGV2YW50IChmb3IgaW5zdGFuY2UgaWYgdGhlIHByb3BlcnR5IHdhcyBqdXN0Ci0gICAgICogIGFkZGVkIGFuZCB0aGVyZSB3YXMgbm8gb2xkIHZhbHVlKS4KLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGdldE9sZFZhbHVlKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0aGF0IGNoYW5nZWQuCi0gICAgICogPHA+Ci0gICAgICogV2FybmluZzogdGhlcmUgaXMgbm8gZ3VhcmFudGVlIHRoYXQgdGhlIHByb3BlcnR5IG5hbWUgcmV0dXJuZWQKLSAgICAgKiBpcyBhIGNvbnN0YW50IHN0cmluZy4gIENhbGxlcnMgbXVzdCBjb21wYXJlIHByb3BlcnR5IG5hbWVzIHVzaW5nCi0gICAgICogZXF1YWxzLCBub3QgPT0uCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgdGhhdCBjaGFuZ2VkCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRQcm9wZXJ0eSgpOwotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi9wcmVmZXJlbmNlcy9JUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcldyYXBwZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vcHJlZmVyZW5jZXMvSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJXcmFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmN2JmNjYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi9wcmVmZXJlbmNlcy9JUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcldyYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5wcmVmZXJlbmNlczsKLQotLyoqCi0gKiB3cmFwcGVyIGludGVyZmFjZSBmb3IgcHJvcGVydHkgY2hhbmdlIGxpc3RlbmVyCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS41Ci0gKgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyV3JhcHBlciB7Ci0KLQkgcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2UoSVByb3BlcnR5Q2hhbmdlRXZlbnRXcmFwcGVyIGV2ZW50KTsKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vc2VydmljZWFiaWxpdHkvRGVidWdUcmFjZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi9zZXJ2aWNlYWJpbGl0eS9EZWJ1Z1RyYWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiNmZmNDcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi9zZXJ2aWNlYWJpbGl0eS9EZWJ1Z1RyYWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5zZXJ2aWNlYWJpbGl0eTsKLQotLyoqCi0gKiBIZWxwZXIgdXRpbGl0eSBmb3IgcHJpbnRpbmcgZGVidWcgdHJhY2VzIHRvIHRoZSBjb25zb2xlLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIERlYnVnVHJhY2UgewotCi0JLyoqCi0JICogUHJpbnRzIGEgZGVidWcgdHJhY2UgdG8gdGhlIGNvbnNvbGUuCi0JICogCi0JICogQHBhcmFtIGluc3RhbmNlCi0JICogICAgICAgICAgICBhIGNsYXNzIGluc3RhbmNlCi0JICogQHBhcmFtIG1ldGhvZAotCSAqICAgICAgICAgICAgYSBtZXRob2QgbmFtZQotCSAqIEBwYXJhbSBtc2cKLQkgKiAgICAgICAgICAgIGEgZGVidWcgbWVzc2FnZQotCSAqIEBwYXJhbSB0aAotCSAqICAgICAgICAgICAgYSA8Y29kZT5UaHJvd2FibGU8L2NvZGU+IG9iamVjdAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBwcmludChPYmplY3QgaW5zdGFuY2UsIFN0cmluZyBtZXRob2QsIFN0cmluZyBtc2csCi0JCQlUaHJvd2FibGUgdGgpIHsKLQkJU3RyaW5nQnVmZmVyIGRlYnVnTXNnID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlpZiAoaW5zdGFuY2UgIT0gbnVsbCkgewotCQkJZGVidWdNc2cuYXBwZW5kKGluc3RhbmNlLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLQkJCWlmIChtZXRob2QgIT0gbnVsbCkgewotCQkJCWRlYnVnTXNnLmFwcGVuZCgnLicpLmFwcGVuZChtZXRob2QpOwotCQkJfQotCQkJZGVidWdNc2cuYXBwZW5kKCI6ICIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJaWYgKG1zZyAhPSBudWxsICYmIG1zZy5sZW5ndGgoKSA+IDApIHsKLQkJCWRlYnVnTXNnLmFwcGVuZChtc2cpOyAKLQkJfQotCQlTeXN0ZW0ub3V0LnByaW50bG4oZGVidWdNc2cpOwotCQlpZiAodGggIT0gbnVsbCkgewotCQkJdGgucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBQcmludHMgYSBkZWJ1ZyB0cmFjZSB0byB0aGUgY29uc29sZS4KLQkgKiAKLQkgKiBAcGFyYW0gaW5zdGFuY2UKLQkgKiAgICAgICAgICAgIGEgY2xhc3MgaW5zdGFuY2UKLQkgKiBAcGFyYW0gbWV0aG9kCi0JICogICAgICAgICAgICBhIG1ldGhvZCBuYW1lCi0JICogQHBhcmFtIHRoCi0JICogICAgICAgICAgICBhIDxjb2RlPlRocm93YWJsZTwvY29kZT4gb2JqZWN0Ci0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHByaW50KE9iamVjdCBpbnN0YW5jZSwgU3RyaW5nIG1ldGhvZCwgVGhyb3dhYmxlIHRoKSB7Ci0JCXByaW50KGluc3RhbmNlLCBtZXRob2QsIG51bGwsIHRoKTsKLQl9Ci0KLQkvKioKLQkgKiBQcmludHMgYSBkZWJ1ZyB0cmFjZSB0byB0aGUgY29uc29sZS4KLQkgKiAKLQkgKiBAcGFyYW0gaW5zdGFuY2UKLQkgKiAgICAgICAgICAgIGEgY2xhc3MgaW5zdGFuY2UKLQkgKiBAcGFyYW0gbWV0aG9kCi0JICogICAgICAgICAgICBhIG1ldGhvZCBuYW1lCi0JICogQHBhcmFtIG1zZwotCSAqICAgICAgICAgICAgYSBkZWJ1ZyBtZXNzYWdlCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHByaW50KE9iamVjdCBpbnN0YW5jZSwgU3RyaW5nIG1ldGhvZCwgU3RyaW5nIG1zZykgewotCQlwcmludChpbnN0YW5jZSwgbWV0aG9kLCBtc2csIG51bGwpOwotCX0KLQotCS8qKgotCSAqIFByaW50cyBhIGRlYnVnIHRyYWNlIHRvIHRoZSBjb25zb2xlLgotCSAqIAotCSAqIEBwYXJhbSBpbnN0YW5jZQotCSAqICAgICAgICAgICAgYSBjbGFzcyBpbnN0YW5jZQotCSAqIEBwYXJhbSBtZXRob2QKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIG5hbWUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcHJpbnQoT2JqZWN0IGluc3RhbmNlLCBTdHJpbmcgbWV0aG9kKSB7Ci0JCXByaW50KGluc3RhbmNlLCBtZXRob2QsIG51bGwsIG51bGwpOwotCX0KLQotCS8qKgotCSAqIFByaW50cyBhIGRlYnVnIHRyYWNlIHRvIHRoZSBjb25zb2xlLgotCSAqIAotCSAqIEBwYXJhbSB0aAotCSAqICAgICAgICAgICAgYSA8Y29kZT5UaHJvd2FibGU8L2NvZGU+IG9iamVjdAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBwcmludChUaHJvd2FibGUgdGgpIHsKLQkJaWYgKHRoICE9IG51bGwpIHsKLQkJCXRoLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3NlcnZpY2VhYmlsaXR5L0xvZ2dlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi9zZXJ2aWNlYWJpbGl0eS9Mb2dnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTIwMzdjNS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3NlcnZpY2VhYmlsaXR5L0xvZ2dlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5jb21tb24uc2VydmljZWFiaWxpdHk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci0KLS8qKgotICogR2VuZXJpYyBsb2dnZXIgdXNlZCBmb3IgbG9nZ2luZyBzdGF0dXMgbWVzc2FnZXMsIHdhcm5pbmcgbWVzc2FnZXMsIGVycm9yCi0gKiBtZXNzYWdlcywgYW5kIGV4Y2VwdGlvbiBzdGFjayB0cmFjZXMuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTG9nZ2VyIHsKLQotCS8vIFRoZSBwbHVnLWluIGluc3RhbmNlLgotCXByaXZhdGUgUGx1Z2luIHBsdWdpbjsKLQotCS8vIFRoZSBwbHVnLWluIElELgotCXByaXZhdGUgU3RyaW5nIHBsdWdpbklkOwotCi0JLyoqCi0JICogQ3JlYXRlIGEgbmV3IDxjb2RlPkxvZ2dlcjwvY29kZT4gZ2l2ZW4gdGhlIHBsdWctaW4gaW5zdGFuY2UuCi0JICogCi0JICogQHBhcmFtIHBsdWdpbgotCSAqICAgICAgICAgICAgVGhlIHBsdWdpbiBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgTG9nZ2VyKFBsdWdpbiBwbHVnaW4pIHsKLQkJdGhpcy5wbHVnaW4gPSBwbHVnaW47Ci0JCXRoaXMucGx1Z2luSWQgPSBwbHVnaW4uZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCk7IC8vcGx1Z2luLmdldElkKCk7Ci0JfQotCi0JLyoqCi0JICogTG9ncyB0aGUgZ2l2ZW4gZXJyb3IgbWVzc2FnZS4KLQkgKiAKLQkgKiBAcGFyYW0gbXNnCi0JICogICAgICAgICAgICBUaGUgZXJyb3IgbWVzc2FnZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBsb2dFcnJvcihTdHJpbmcgbXNnKSB7Ci0JCWxvZ01zZyhJU3RhdHVzLkVSUk9SLCBtc2csIG51bGwpOwotCX0KLQotCS8qKgotCSAqIExvZ3MgdGhlIGdpdmVuIGV4Y2VwdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gZXgKLQkgKiAgICAgICAgICAgIFRoZSBleGNlcHRpb24uCi0JICovCi0JcHVibGljIHZvaWQgbG9nRXJyb3IoVGhyb3dhYmxlIGV4KSB7Ci0JCWxvZ01zZyhJU3RhdHVzLkVSUk9SLCBudWxsLCBleCk7Ci0JfQotCi0JLyoqCi0JICogTG9ncyB0aGUgZ2l2ZW4gZXJyb3IgbWVzc2FnZSBhbmQgZXhjZXB0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBtc2cKLQkgKiAgICAgICAgICAgIFRoZSBlcnJvciBtZXNzYWdlLgotCSAqIEBwYXJhbSBleAotCSAqICAgICAgICAgICAgVGhlIGV4Y2VwdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBsb2dFcnJvcihTdHJpbmcgbXNnLCBUaHJvd2FibGUgZXgpIHsKLQkJbG9nTXNnKElTdGF0dXMuRVJST1IsIG1zZywgZXgpOwotCX0KLQotCS8qKgotCSAqIExvZ3MgdGhlIGdpdmVuIHdhcm5pbmcgbWVzc2FnZS4KLQkgKiAKLQkgKiBAcGFyYW0gbXNnCi0JICogICAgICAgICAgICBUaGUgd2FybmluZyBtZXNzYWdlLgotCSAqLwotCXB1YmxpYyB2b2lkIGxvZ1dhcm5pbmcoU3RyaW5nIG1zZykgewotCQlsb2dNc2coSVN0YXR1cy5XQVJOSU5HLCBtc2csIG51bGwpOwotCX0KLQotCS8qKgotCSAqIExvZ3MgdGhlIGdpdmVuIHdhcm5pbmcgbWVzc2FnZSBhbmQgZXhjZXB0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBtc2cKLQkgKiAgICAgICAgICAgIFRoZSB3YXJuaW5nIG1lc3NhZ2UuCi0JICogQHBhcmFtIGV4Ci0JICogICAgICAgICAgICBUaGUgZXhjZXB0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIGxvZ1dhcm5pbmcoU3RyaW5nIG1zZywgVGhyb3dhYmxlIGV4KSB7Ci0JCWxvZ01zZyhJU3RhdHVzLldBUk5JTkcsIG1zZywgZXgpOwotCX0KLQotCS8qKgotCSAqIExvZ3MgdGhlIGdpdmVuIHN0YXR1cyBtZXNzYWdlIGFuZCBleGNlcHRpb24uCi0JICogCi0JICogQHBhcmFtIG1zZwotCSAqICAgICAgICAgICAgVGhlIHN0YXR1cyBtZXNzYWdlLgotCSAqLwotCXB1YmxpYyB2b2lkIGxvZ0luZm8oU3RyaW5nIG1zZykgewotCQlsb2dNc2coSVN0YXR1cy5JTkZPLCBtc2csIG51bGwpOwotCX0KLQotCS8qKgotCSAqIExvZ3MgdGhlIGdpdmVuIG1lc3NhZ2UgYW5kIGV4Y2VwdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gc2V2ZXJpdHkKLQkgKiAgICAgICAgICAgIFRoZSBzZXZlcml0eS4KLQkgKiBAcGFyYW0gbXNnCi0JICogICAgICAgICAgICBUaGUgbWVzc2FnZS4KLQkgKiBAcGFyYW0gZXgKLQkgKiAgICAgICAgICAgIFRoZSBleGNlcHRpb24uCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGxvZ01zZyhpbnQgc2V2ZXJpdHksIFN0cmluZyBtc2csIFRocm93YWJsZSBleCkgewotCQlpZiAobXNnID09IG51bGwgJiYgZXggIT0gbnVsbCkgewotCQkJbXNnID0gZXguZ2V0TWVzc2FnZSgpOyAKLQkJfQotCi0JCWlmIChtc2cgPT0gbnVsbCkgewotCQkJbXNnID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCVN0YXR1cyBzdGF0dXMgPSBuZXcgU3RhdHVzKHNldmVyaXR5LCBwbHVnaW5JZCwgSVN0YXR1cy5PSywgbXNnLCBleCk7Ci0KLQkJLy8gQ2FsbCB0aGUgRWNsaXBzZSBMb2dnZXIuCi0JCXBsdWdpbi5nZXRMb2coKS5sb2coc3RhdHVzKTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3NlcnZpY2VhYmlsaXR5L3BhY2thZ2UuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vc2VydmljZWFiaWxpdHkvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MTMzNDdiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vc2VydmljZWFiaWxpdHkvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgY29tbW9uIGVycm9yIGhhbmRsaW5nLCBsb2dnaW5nIGFuZCB2ZXJzaW9uaW5nIHNlcnZpY2VzLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vdXRpbHMvRXh0ZW5zaW9uSGVscGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3V0aWxzL0V4dGVuc2lvbkhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNTAzZjQ1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vdXRpbHMvRXh0ZW5zaW9uSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy9BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vL2FyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy93aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy9odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vQ29udHJpYnV0b3JzOgotLy9JQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLkNvbW1vblBsdWdpbjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwotCi0vKioKLSogSGVscGVyIGNsYXNzIHdpdGggbWV0aG9kcyB0byByZXRyaWV2ZSBleHRlbnNpb25zCi0qIE1vdmVkIHBhcnQgb2Ygb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkV4dGVuc2lvbk1hbmFnZXIsIHRvIGFsbG93Ci0qIGFjY2VzcyBieSBjbGFzc2VzIHRoYXQgaGF2ZSBubyBkZXBlbmRlbmN5IG9uIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQKLSogCi0qIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlIAotKiBAYXV0aG9yIFdlaXBpbmcgTHUKLSogQHNpbmNlICAxLjUKLSovCi1wdWJsaWMgY2xhc3MgRXh0ZW5zaW9uSGVscGVyIHsKLQlwcml2YXRlIHN0YXRpYyBNYXAgSURUb0V4dGVuc2lvbk1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCi0JcHVibGljIHN0YXRpYyBPYmplY3QgY3JlYXRlRXh0ZW5zaW9uKFN0cmluZyBuYW1lc3BhY2UsIFN0cmluZyBleHRlbnNpb25Qb2ludE5hbWUpIHsKLQkJLy8gUHJvY2VzcyB0aGUgY29udHJpYnV0b3JzLgotCQkvLwotCQlJRXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpOwotCQlJRXh0ZW5zaW9uUG9pbnQgZXh0ZW5zaW9uUG9pbnQgPSBleHRlbnNpb25SZWdpc3RyeS5nZXRFeHRlbnNpb25Qb2ludChuYW1lc3BhY2UsIGV4dGVuc2lvblBvaW50TmFtZSk7Ci0JCWlmIChleHRlbnNpb25Qb2ludCAhPSBudWxsKSB7Ci0JCQlJRXh0ZW5zaW9uW10gZXh0ZW5zaW9ucyA9IGV4dGVuc2lvblBvaW50LmdldEV4dGVuc2lvbnMoKTsKLQkJCU9iamVjdCBleHQgPSBudWxsOwotCQkJZXh0X3dhbGs6Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGV4dGVuc2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCQlJRXh0ZW5zaW9uIGV4dGVuc2lvbiA9IGV4dGVuc2lvbnNbaV07Ci0JCQkJU3RyaW5nIHBsdWdpbklkID0gZXh0ZW5zaW9uLmdldE5hbWVzcGFjZUlkZW50aWZpZXIoKTsKLQkJCQlCdW5kbGUgYnVuZGxlID0gUGxhdGZvcm0uZ2V0QnVuZGxlKHBsdWdpbklkKTsKLQkJCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjb25maWdFbGVtZW50cyA9IGV4dGVuc2lvbgotCQkJCQkJLmdldENvbmZpZ3VyYXRpb25FbGVtZW50cygpOwotCQkJCWZvciAoaW50IGogPSAwOyBqIDwgY29uZmlnRWxlbWVudHMubGVuZ3RoOyBqKyspIHsKLQkJCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNvbmZpZ0VsZW1lbnQgPSBjb25maWdFbGVtZW50c1tqXTsKLQkJCQkJdHJ5IHsKLQkJCQkJCVN0cmluZyBjbGFzc05hbWUgPSBjb25maWdFbGVtZW50LmdldEF0dHJpYnV0ZSgiY2xhc3MiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJaWYoY2xhc3NOYW1lICE9IG51bGwpIHsKLQkJCQkJCQlleHQgPSBidW5kbGUubG9hZENsYXNzKGNsYXNzTmFtZSkubmV3SW5zdGFuY2UoKTsKLQkJCQkJCQlicmVhayBleHRfd2FsazsKLQkJCQkJCX0KLQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCUNvbW1vblBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gZXh0OwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIE9iamVjdCBnZXRFeHRlbnNpb24oU3RyaW5nIG5hbWVzcGFjZSwgU3RyaW5nIGV4dGVuc2lvblBvaW50TmFtZSkgewotCQlTdHJpbmcgSUQgPSBuYW1lc3BhY2UgKyAnLicgKyBleHRlbnNpb25Qb2ludE5hbWU7Ci0JCU9iamVjdCBleHQgPSBJRFRvRXh0ZW5zaW9uTWFwLmdldChJRCk7Ci0JCWlmKGV4dCA9PSBudWxsKSB7Ci0JCQlzeW5jaHJvbml6ZWQgKElEVG9FeHRlbnNpb25NYXApIHsKLQkJCQlleHQgPSBJRFRvRXh0ZW5zaW9uTWFwLmdldChJRCk7Ci0JCQkJaWYoZXh0ID09IG51bGwpIHsKLQkJCQkJZXh0ID0gY3JlYXRlRXh0ZW5zaW9uKG5hbWVzcGFjZSwgZXh0ZW5zaW9uUG9pbnROYW1lKTsKLQkJCQkJaWYoZXh0ICE9IG51bGwpIHsKLQkJCQkJCUlEVG9FeHRlbnNpb25NYXAucHV0KElELCBleHQpOwotCQkJCQl9Ci0JCQkJfSAKLQkJCX0KLQotCQl9Ci0JCXJldHVybiBleHQ7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJTWFya2VyQXR0cmlidXRlQ29udHJpYnV0ZXIgZ2V0TWFya2VyQXR0cmlidXRlQ29udHJpYnV0ZXIoKSB7Ci0JCUlNYXJrZXJBdHRyaWJ1dGVDb250cmlidXRlciByZXQgPSAoSU1hcmtlckF0dHJpYnV0ZUNvbnRyaWJ1dGVyKSBnZXRFeHRlbnNpb24oCi0JCQkJQ29tbW9uUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJZCgpLCAibWFya2VyQXR0cmlidXRlQ29udHJpYnV0ZXIiKTsvLyROT04tTkxTLTEkCi0JCXJldHVybiByZXQ7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZSBvYmplY3QgYmFzZWQgb24gdHlwZSBhbmQgY29udGV4dCB0aHJvdWdoIGV4dGVuc2lvbgotCSAqIEBwYXJhbSB0eXBlCi0JICogQHBhcmFtIGNvbnRleHQKLQkgKiBAcmV0dXJuIGNyZWF0ZWQgb2JqZWN0IG9yIG51bGwgaWYgbm8gZXh0ZW5zaW9uIGlzIGZvdW5kCi0JICovCi0JcHVibGljIHN0YXRpYyBPYmplY3QgY3JlYXRlKENsYXNzIHR5cGUsIE9iamVjdCBjb250ZXh0KSB7Ci0JCUlPYmplY3RGYWN0b3J5IHJldCA9IChJT2JqZWN0RmFjdG9yeSkgZ2V0RXh0ZW5zaW9uKAotCQkJCUNvbW1vblBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SWQoKSwgIm9iamVjdEZhY3RvcnkiKTsvLyROT04tTkxTLTEkCi0JCWlmIChyZXQgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIHJldC5jcmVhdGUodHlwZSwgY29udGV4dCk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgPFQ+TGlzdDxUPiBnZXRFeHRlbnNpb25zKFN0cmluZyBuYW1lc3BhY2UsIFN0cmluZyBleHRlbnNpb25Qb2ludE5hbWUsIENsYXNzPFQ+IHR5cGUpIHsKLQkJTGlzdDxUPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxUPigpOwotCQl0cnkgewotCQkJSUV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5ID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKTsKLQkJCUlFeHRlbnNpb25Qb2ludCBleHRlbnNpb25Qb2ludCA9IGV4dGVuc2lvblJlZ2lzdHJ5LmdldEV4dGVuc2lvblBvaW50KG5hbWVzcGFjZSwgZXh0ZW5zaW9uUG9pbnROYW1lKTsKLQkJCWlmIChleHRlbnNpb25Qb2ludCAhPSBudWxsKSB7Ci0JCQkJSUV4dGVuc2lvbltdIGV4dGVuc2lvbnMgPSBleHRlbnNpb25Qb2ludC5nZXRFeHRlbnNpb25zKCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBleHRlbnNpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCUlFeHRlbnNpb24gZXh0ZW5zaW9uID0gZXh0ZW5zaW9uc1tpXTsKLQkJCQkJU3RyaW5nIHBsdWdpbklkID0gZXh0ZW5zaW9uLmdldE5hbWVzcGFjZUlkZW50aWZpZXIoKTsKLQkJCQkJQnVuZGxlIGJ1bmRsZSA9IFBsYXRmb3JtLmdldEJ1bmRsZShwbHVnaW5JZCk7Ci0JCQkJCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGNvbmZpZ0VsZW1lbnRzID0gZXh0ZW5zaW9uCi0JCQkJCS5nZXRDb25maWd1cmF0aW9uRWxlbWVudHMoKTsKLQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBjb25maWdFbGVtZW50cy5sZW5ndGg7IGorKykgewotCQkJCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNvbmZpZ0VsZW1lbnQgPSBjb25maWdFbGVtZW50c1tqXTsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJU3RyaW5nIGNsYXNzTmFtZSA9IGNvbmZpZ0VsZW1lbnQuZ2V0QXR0cmlidXRlKCJjbGFzcyIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJaWYoY2xhc3NOYW1lICE9IG51bGwpIHsKLQkJCQkJCQkJT2JqZWN0IGV4dCA9IGJ1bmRsZS5sb2FkQ2xhc3MoY2xhc3NOYW1lKS5uZXdJbnN0YW5jZSgpOwotCQkJCQkJCQlpZih0eXBlLmlzSW5zdGFuY2UoZXh0KSkgewotCQkJCQkJCQkJbGlzdC5hZGQoKFQpZXh0KTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJQ29tbW9uUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQljYXRjaChFeGNlcHRpb24gZSkgewotCQkJQ29tbW9uUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJfQotCQlpZihsaXN0LmlzRW1wdHkoKSkgewotCQkJcmV0dXJuIENvbGxlY3Rpb25zLjxUPmVtcHR5TGlzdCgpOwotCQl9Ci0JCXJldHVybiBsaXN0OwotCX0KLQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3V0aWxzL0ZpbGVVdGlsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3V0aWxzL0ZpbGVVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxYWM5MTguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi91dGlscy9GaWxlVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA4OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGVXcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW1Xcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKLWltcG9ydCBqYXZhLm5pby5DaGFyQnVmZmVyOwotaW1wb3J0IGphdmEubmlvLk1hcHBlZEJ5dGVCdWZmZXI7Ci1pbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuRmlsZUNoYW5uZWw7Ci1pbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuRmlsZUxvY2s7Ci1pbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuT3ZlcmxhcHBpbmdGaWxlTG9ja0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5pby5jaGFyc2V0LkNoYXJzZXQ7Ci1pbXBvcnQgamF2YS5uaW8uY2hhcnNldC5DaGFyc2V0RGVjb2RlcjsKLWltcG9ydCBqYXZhLm5pby5jaGFyc2V0LkNvZGluZ0Vycm9yQWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24uQ29tbW9uUGx1Z2luOwotCi0vKioKLSAqIFV0aWxpdHkgY2xhc3MgZm9yIG1hbmFnaW5nIGRpcmVjdG9yaWVzIGFuZCBmaWxlcy4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRmlsZVV0aWwgewotCi0JLyoqCi0JICogUGxhdGZvcm0tc3BlY2lmaWMgbGluZSBzZXBhcmF0b3IuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTElORV9TRVAgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImxpbmUuc2VwYXJhdG9yIik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFBsYXRmb3JtLXNwZWNpZmljIGZpbGUgc2VwYXJhdG9yLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZJTEVfU0VQID0gU3lzdGVtLmdldFByb3BlcnR5KCJmaWxlLnNlcGFyYXRvciIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBQbGF0Zm9ybS1zcGVjaWZpYyBsaW5lIHNlcGFyYXRvciBsZW5ndGguCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTElORV9TRVBfTEVOR1RIID0gTElORV9TRVAubGVuZ3RoKCk7Ci0KLQkvKioKLQkgKiBVTkMgcGF0aCBwcmVmaXguCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVU5DX1BBVEhfUFJFRklYID0gIlxcXFwiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBVTkMgcGF0aCBwcmVmaXggbGVuZ3RoLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFVOQ19QQVRIX1BSRUZJWF9MRU5HVEggPSBVTkNfUEFUSF9QUkVGSVgubGVuZ3RoKCk7Ci0KLQkvKioKLQkgKiBJU08tODg1OS0xIGVuY29kaW5nLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVOQ09ESU5HX0lTT184ODU5XzEgPSAiSVNPLTg4NTktMSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFVURi04IGVuY29kaW5nLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVOQ09ESU5HX1VURl84ID0gIlVURi04IjsvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBQcml2YXRlIGNvbnN0cnVjdG9yIHRvIHByZXZlbnQgdGhpcyBjbGFzcyBmcm9tIGJlaW5nIGluc3RhbnRpYXRlZC4gQWxsCi0JICogbWV0aG9kcyBpbiB0aGlzIGNsYXNzIHNob3VsZCBiZSBzdGF0aWMuCi0JICovCi0JcHJpdmF0ZSBGaWxlVXRpbCgpIHsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBhYnNvbHV0ZSBwYXRoIGZvciBhIGZpbGUgb3IgZGlyZWN0b3J5LgotCSAqIAotCSAqIEBwYXJhbSBmaWxlCi0JICogICAgICAgICAgICBhIGZpbGUgb3IgZGlyZWN0b3J5Ci0JICogQHJldHVybiB0aGUgYWJzb2x1dGUgcGF0aCB0byB0aGUgZmlsZSBvciBkaXJlY3RvcnkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRBYnNvbHV0ZVBhdGgoRmlsZSBmaWxlKSB7Ci0JCXJldHVybiBmaWxlLmdldEFic29sdXRlUGF0aCgpLnJlcGxhY2UoJ1xcJywgJy8nKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBhYnNvbHV0ZSBwYXRoIGZvciBhIGZpbGUgb3IgZGlyZWN0b3J5LgotCSAqIAotCSAqIEBwYXJhbSBwYXRoCi0JICogICAgICAgICAgICBhIHBhdGggdG8gYSBmaWxlIG9yIGRpcmVjdG9yeQotCSAqIEByZXR1cm4gYW4gYWJzb2x1dGUgcGF0aCB0byB0aGUgZmlsZSBvciBkaXJlY3RvcnkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRBYnNvbHV0ZVBhdGgoU3RyaW5nIHBhdGgpIHsKLQkJcmV0dXJuIGdldEFic29sdXRlUGF0aChuZXcgRmlsZShwYXRoKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgYWJzb2x1dGUgcGF0aCBmb3IgYSBVUkwuCi0JICogCi0JICogQHBhcmFtIHVybAotCSAqICAgICAgICAgICAgYSBVUkwKLQkgKiBAcmV0dXJuIHRoZSBhYnNvbHV0ZSBwYXRoIG9mIHRoZSBVUkwKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRBYnNvbHV0ZVBhdGgoVVJMIHVybCkgewotCQlTdHJpbmcgcGF0aE5hbWUgPSB1cmwuZ2V0RmlsZSgpLnN1YnN0cmluZygxKTsKLQkJU3RyaW5nIHJlc3VsdCA9IE5ldFV0aWwuZGVjb2RlVXJsKHBhdGhOYW1lLCBudWxsKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwYXJlbnQgZGlyZWN0b3J5IG9mIGEgcGF0aC4KLQkgKiAKLQkgKiBAcGFyYW0gcGF0aAotCSAqICAgICAgICAgICAgYSBwYXRoIG5hbWUKLQkgKiBAcmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBwYXJlbnQgZGlyZWN0b3J5Ci0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UGFyZW50RGlyZWN0b3J5KFN0cmluZyBwYXRoKSB7Ci0JCXJldHVybiAobmV3IEZpbGUocGF0aCkpLmdldFBhcmVudCgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGZpbGUgbmFtZSBhbmQgZXh0ZW5zaW9uIGZyb20gYSBwYXRoLgotCSAqIAotCSAqIEBwYXJhbSBwYXRoCi0JICogICAgICAgICAgICBhIHBhdGggbmFtZQotCSAqIEByZXR1cm4gdGhlIGZpbGUgbmFtZSBpbmNsdWRpbmcgdGhlIGZpbGUgZXh0ZW5zaW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RmlsZU5hbWUoU3RyaW5nIHBhdGgpIHsKLQkJcmV0dXJuIGdldEZpbGVOYW1lKHBhdGgsIHRydWUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGZpbGUgbmFtZSBmcm9tIGEgcGF0aCwgd2l0aCBvciB3aXRob3V0IHRoZSBmaWxlIGV4dGVuc2lvbi4KLQkgKiAKLQkgKiBAcGFyYW0gcGF0aAotCSAqICAgICAgICAgICAgYSBwYXRoIG5hbWUKLQkgKiBAcGFyYW0gd2l0aEV4dGVuc2lvbgotCSAqICAgICAgICAgICAgaWYgPGNvZGU+dHJ1ZTwvY29kZT4sIGluY2x1ZGUgdGhlIGZpbGUgZXh0ZW5zaW9uIGluIHRoZQotCSAqICAgICAgICAgICAgcmVzdWx0Ci0JICogQHJldHVybiB0aGUgZmlsZSBuYW1lIHdpdGggb3Igd2l0aG91dCB0aGUgZmlsZSBleHRlbnNpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRGaWxlTmFtZShTdHJpbmcgcGF0aCwgYm9vbGVhbiB3aXRoRXh0ZW5zaW9uKSB7Ci0JCVN0cmluZyBub3JtYWxpemVkUGF0aCA9IHBhdGgucmVwbGFjZSgnXFwnLCAnLycpOwotCi0JCWludCBwcmVmaXhMZW5ndGggPSAwOwotCQlpZiAobm9ybWFsaXplZFBhdGguc3RhcnRzV2l0aChOZXRVdGlsLkZJTEVfVVJJX1BSRUZJWCkpIHsKLQkJCXByZWZpeExlbmd0aCA9IE5ldFV0aWwuRklMRV9VUklfUFJFRklYX0xFTkdUSDsKLQkJfSBlbHNlIGlmIChub3JtYWxpemVkUGF0aC5zdGFydHNXaXRoKE5ldFV0aWwuSFRUUF9VUklfUFJFRklYKSkgewotCQkJcHJlZml4TGVuZ3RoID0gTmV0VXRpbC5IVFRQX1VSSV9QUkVGSVhfTEVOR1RIOwotCQl9Ci0KLQkJU3RyaW5nIGZpbGVOYW1lOwotCQlpbnQgaW5kZXggPSBub3JtYWxpemVkUGF0aC5sYXN0SW5kZXhPZigiLyIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChpbmRleCA8IHByZWZpeExlbmd0aCkgewotCQkJZmlsZU5hbWUgPSBub3JtYWxpemVkUGF0aC5zdWJzdHJpbmcocHJlZml4TGVuZ3RoKTsKLQkJfSBlbHNlIHsKLQkJCWZpbGVOYW1lID0gcGF0aC5zdWJzdHJpbmcoaW5kZXggKyAxKTsKLQkJfQotCi0JCWlmICh3aXRoRXh0ZW5zaW9uKSB7Ci0JCQlyZXR1cm4gZmlsZU5hbWU7Ci0JCX0KLQotCQlpbmRleCA9IGZpbGVOYW1lLmluZGV4T2YoIi4iKTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gKGluZGV4ID4gMCkgPyBmaWxlTmFtZS5zdWJzdHJpbmcoMCwgaW5kZXgpIDogZmlsZU5hbWU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVsYXRpdmUgcGF0aCBvZiBhIHBhdGggZnJvbSBhIGJhc2UgcGF0aC4KLQkgKiAKLQkgKiBAcGFyYW0gcGF0aAotCSAqICAgICAgICAgICAgYSBwYXRoCi0JICogQHBhcmFtIGJhc2VQYXRoCi0JICogICAgICAgICAgICB0aGUgYmFzZSBwYXRoCi0JICogQHJldHVybiBhIHJlbGF0aXZlIHBhdGgKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRSZWxhdGl2ZVBhdGhUb0Jhc2UoRmlsZSBwYXRoLCBGaWxlIGJhc2VQYXRoKSB7Ci0JCXRyeSB7Ci0JCQlTdHJpbmcgZGlyID0gcGF0aC50b1VSTCgpLnRvRXh0ZXJuYWxGb3JtKCk7Ci0JCQlTdHJpbmcgYmFzZURpciA9IGJhc2VQYXRoLnRvVVJMKCkudG9FeHRlcm5hbEZvcm0oKTsKLQkJCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQlpZiAoZGlyLmluZGV4T2YoYmFzZURpcikgPT0gMCkgewotCQkJCVN0cmluZyBkZWx0YSA9IGRpci5zdWJzdHJpbmcoYmFzZURpci5sZW5ndGgoKSk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkZWx0YS5sZW5ndGgoKTsgaSsrKSB7Ci0JCQkJCWlmIChkZWx0YS5jaGFyQXQoaSkgPT0gJy8nKSB7Ci0JCQkJCQlyZXN1bHQuYXBwZW5kKCIuLi8iKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRSZWxhdGl2ZVBhdGgoRmlsZSBwYXRoLCBGaWxlIGJhc2VQYXRoKSB7Ci0JCXRyeSB7Ci0JCQlTdHJpbmcgZGlyID0gcGF0aC50b1VSTCgpLnRvRXh0ZXJuYWxGb3JtKCk7Ci0JCQlTdHJpbmcgYmFzZURpciA9IGFwcGVuZFNlcGFyYXRvcihiYXNlUGF0aC50b1VSTCgpLnRvRXh0ZXJuYWxGb3JtKCksCi0JCQkJCSIvIik7IC8vJE5PTi1OTFMtMSQKLQkJCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQl3aGlsZSAoZGlyLmluZGV4T2YoYmFzZURpcikgPT0gLTEpIHsKLQkJCQliYXNlUGF0aCA9IGJhc2VQYXRoLmdldFBhcmVudEZpbGUoKTsKLQkJCQliYXNlRGlyID0gYXBwZW5kU2VwYXJhdG9yKGJhc2VQYXRoLnRvVVJMKCkudG9FeHRlcm5hbEZvcm0oKSwKLQkJCQkJCSIvIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlyZXN1bHQuYXBwZW5kKCIuLi8iKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJaWYgKGRpci5pbmRleE9mKGJhc2VEaXIpID09IDApIHsKLQkJCQlTdHJpbmcgZGVsdGEgPSBkaXIuc3Vic3RyaW5nKGJhc2VEaXIubGVuZ3RoKCkpOwotCQkJCXJlc3VsdC5hcHBlbmQoZGVsdGEpOwotCQkJfQotCQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBcHBlbmRzIHRoZSBwbGF0Zm9ybSBzcGVjaWZpYyBwYXRoIHNlcGFyYXRvciB0byB0aGUgZW5kIG9mIGEgcGF0aC4KLQkgKiAKLQkgKiBAcGFyYW0gcGF0aAotCSAqICAgICAgICAgICAgYSBwYXRoIG5hbWUKLQkgKiBAcmV0dXJuIHRoZSBwYXRoIG5hbWUgYXBwZW5kZWQgd2l0aCB0aGUgcGxhdGZvcm0gc3BlY2lmaWMgcGF0aCBzZXBhcmF0b3IKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhcHBlbmRTZXBhcmF0b3IoU3RyaW5nIHBhdGgpIHsKLQkJcmV0dXJuIGFwcGVuZFNlcGFyYXRvcihwYXRoLCBGaWxlLnNlcGFyYXRvcik7Ci0JfQotCi0JLyoqCi0JICogQXBwZW5kcyB0aGUgZ2l2ZW4gcGF0aCBzZXBhcmF0b3IgdG8gdGhlIGVuZCBvZiBhIHBhdGgKLQkgKiAKLQkgKiBAcGFyYW0gcGF0aAotCSAqICAgICAgICAgICAgYSBwYXRoIG5hbWUKLQkgKiBAcGFyYW0gc2VwYXJhdG9yCi0JICogICAgICAgICAgICBhIHBhdGggc2VwYXJhdG9yCi0JICogQHJldHVybiB0aGUgcGF0aCBuYW1lIGFwcGVuZGVkIHdpdGggdGhlIGdpdmVuIHNlcGFyYXRvcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGFwcGVuZFNlcGFyYXRvcihTdHJpbmcgcGF0aCwgU3RyaW5nIHNlcGFyYXRvcikgewotCQlyZXR1cm4gcGF0aC5lbmRzV2l0aChzZXBhcmF0b3IpID8gcGF0aCA6IHBhdGggKyBzZXBhcmF0b3I7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlcyB0aGUgZW5kaW5nIHBhdGggc2VwYXJhdG9yIGZyb20gYSBwYXRoLgotCSAqIAotCSAqIEBwYXJhbSBwYXRoCi0JICogICAgICAgICAgICBhIHBhdGggbmFtZQotCSAqIEByZXR1cm4gdGhlIHBhdGggbmFtZSBtaW51cyB0aGUgcGxhdGZvcm0gc3BlY2lmaWMgcGF0aCBzZXBhcmF0b3IKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZW1vdmVTZXBhcmF0b3IoU3RyaW5nIHBhdGgpIHsKLQkJcmV0dXJuIHBhdGguZW5kc1dpdGgoRmlsZS5zZXBhcmF0b3IpID8gcGF0aC5zdWJzdHJpbmcoMCwKLQkJCQlwYXRoLmxlbmd0aCgpIC0gMSkgOiBwYXRoOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZXMgdGhlIGVuZGluZyBwYXRoIHNlcGFyYXRvciBmcm9tIGEgcGF0aC4KLQkgKiAKLQkgKiBAcGFyYW0gcGF0aAotCSAqICAgICAgICAgICAgYSBwYXRoIG5hbWUKLQkgKiBAcmV0dXJuIHRoZSBwYXRoIG5hbWUgbWludXMgdGhlIHBhdGggc2VwYXJhdG9yICJcXCIgb3IgIi8iCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVtb3ZlQWxsU2VwYXJhdG9yKFN0cmluZyBwYXRoKSB7Ci0JCXJldHVybiBwYXRoLmVuZHNXaXRoKCIvIikgfHwgcGF0aC5lbmRzV2l0aCgiXFwiKSA/IHBhdGguc3Vic3RyaW5nKDAsIHBhdGgubGVuZ3RoKCkgLSAxKSA6IHBhdGg7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFJlbW92ZXMgdGhlIGVuZGluZyBwYXRoIHNlcGFyYXRvciBmcm9tIGEgcGF0aC4KLQkgKiAKLQkgKiBAcGFyYW0gcGF0aAotCSAqICAgICAgICAgICAgYSBwYXRoIG5hbWUKLQkgKiBAcGFyYW0gc2VwYXJhdG9yCi0JICogICAgICAgICAgICBhIHBhdGggc2VwYXJhdG9yCi0JICogQHJldHVybiB0aGUgcGF0aCBuYW1lIG1pbnVzIHRoZSBzZXBhcmF0b3IKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZW1vdmVTZXBhcmF0b3IoU3RyaW5nIHBhdGgsIFN0cmluZyBzZXBhcmF0b3IpIHsKLQkJcmV0dXJuIHBhdGguZW5kc1dpdGgoc2VwYXJhdG9yKSA/IHBhdGguc3Vic3RyaW5nKDAsIHBhdGgubGVuZ3RoKCkgLSAxKQotCQkJCTogcGF0aDsKLQl9Ci0KLQkvKioKLQkgKiBSZXBsYWNlcyB0aGUgZmlsZSBuYW1lIHdpdGggYW5vdGhlciBpbiBhIHBhdGguCi0JICogCi0JICogQHBhcmFtIHBhdGgKLQkgKiAgICAgICAgICAgIGEgcGF0aCBuYW1lCi0JICogQHBhcmFtIG9sZEZpbGVOYW1lCi0JICogICAgICAgICAgICB0aGUgb2xkIGZpbGUgbmFtZQotCSAqIEBwYXJhbSBuZXdGaWxlTmFtZQotCSAqICAgICAgICAgICAgdGhlIG5ldyBmaWxlIG5hbWUKLQkgKiBAcmV0dXJuIHRoZSBuZXcgcGF0aCBuYW1lIHdpdGggdGhlIG5ldyBmaWxlIG5hbWUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZXBsYWNlRmlsZU5hbWUoU3RyaW5nIHBhdGgsIFN0cmluZyBvbGRGaWxlTmFtZSwKLQkJCVN0cmluZyBuZXdGaWxlTmFtZSkgewotCQlpbnQgaW5kZXggPSBwYXRoLmxhc3RJbmRleE9mKG9sZEZpbGVOYW1lKTsKLQkJcmV0dXJuIHBhdGguc3Vic3RyaW5nKDAsIGluZGV4KSArIG5ld0ZpbGVOYW1lOwotCX0KLQotCS8qKgotCSAqIFJlcGxhY2VzIHRoZSBmaWxlIGV4dGVuc2lvbiB3aXRoIGFub3RoZXIgaW4gYSBwYXRoLgotCSAqIAotCSAqIEBwYXJhbSBwYXRoCi0JICogICAgICAgICAgICBhIHBhdGggbmFtZQotCSAqIEBwYXJhbSBvbGRGaWxlRXh0Ci0JICogICAgICAgICAgICByaGUgb2xkIGZpbGUgZXh0ZW5zaW9uCi0JICogQHBhcmFtIG5ld0ZpbGVFeHQKLQkgKiAgICAgICAgICAgIHRoZSBuZXcgZmlsZSBleHRlbnNpb24KLQkgKiBAcmV0dXJuIHRoZSBuZXcgcGF0aCB3aXRoIHRoZSBuZXcgZmlsZSBleHRlbnNpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZXBsYWNlRXh0ZW5zaW9uKFN0cmluZyBwYXRoLCBTdHJpbmcgb2xkRXh0LAotCQkJU3RyaW5nIG5ld0V4dCkgewotCQlpbnQgaW5kZXggPSBwYXRoLmxhc3RJbmRleE9mKG9sZEV4dCk7Ci0JCXJldHVybiBwYXRoLnN1YnN0cmluZygwLCBpbmRleCkgKyBuZXdFeHQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbG9jYWxlLXNwZWNpZmljIHBhdGggb2YgYSBiYXNlIHBhdGguCi0JICogCi0JICogQHBhcmFtIHBhdGgKLQkgKiAgICAgICAgICAgIGEgYmFzZSBwYXRoIG5hbWUKLQkgKiBAcGFyYW0gbG9jYWxlU3RyCi0JICogICAgICAgICAgICBhIGxvY2FsZSBzdHJpbmcKLQkgKiBAcmV0dXJuIHRoZSBsb2NhbGUtc3BlY2lmaWMgcGF0aAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldExvY2FsZVBhdGgoU3RyaW5nIHBhdGgsIFN0cmluZyBsb2NhbGVTdHIpIHsKLQkJaWYgKFN0clV0aWwuaXNCbGFuayhsb2NhbGVTdHIpKSB7Ci0JCQlyZXR1cm4gcGF0aDsKLQkJfQotCQlTdHJpbmcgZmlsZU5hbWUgPSBnZXRGaWxlTmFtZShwYXRoKTsKLQkJcmV0dXJuIHJlcGxhY2VGaWxlTmFtZShwYXRoLCBmaWxlTmFtZSwgbG9jYWxlU3RyICsgIi8iICsgZmlsZU5hbWUpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbG9jYWxlLXNwZWNpZmljIHBhdGggb2YgYSBiYXNlIHBhdGguCi0JICogCi0JICogQHBhcmFtIHBhdGgKLQkgKiAgICAgICAgICAgIGEgYmFzZSBwYXRoIG5hbWUKLQkgKiBAcGFyYW0gbG9jYWxlCi0JICogICAgICAgICAgICBhIGxvY2FsZSBvYmplY3QKLQkgKiBAcmV0dXJuIHRoZSBsb2NhbGUtc3BlY2lmaWMgcGF0aAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldExvY2FsZVBhdGgoU3RyaW5nIHBhdGgsIExvY2FsZSBsb2NhbGUpIHsKLQkJcmV0dXJuIGxvY2FsZSA9PSBudWxsID8gcGF0aCA6IGdldExvY2FsZVBhdGgocGF0aCwgbG9jYWxlLnRvU3RyaW5nKCkpOwotCX0KLQotCS8qKgotCSAqIFdyaXRlcyB0aGUgZ2l2ZW4gdGV4dCB0byBhIHRleHQgZmlsZS4KLQkgKiAKLQkgKiBAcGFyYW0gZmlsZU5hbWUKLQkgKiAgICAgICAgICAgIHRoZSB0YXJnZXQgZmlsZSBuYW1lCi0JICogQHBhcmFtIHRleHQKLQkgKiAgICAgICAgICAgIHRoZSB0ZXh0IHRvIHdyaXRlCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgZ2l2ZW4gdGV4dCBpcyB3cml0dGVuIHN1Y2Nlc3NmdWxseSB0bwotCSAqICAgICAgICAgZmlsZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiB3cml0ZUZpbGUoU3RyaW5nIGZpbGVuYW1lLCBTdHJpbmcgdGV4dCkgewotCQlGaWxlV3JpdGVyIHdyaXRlciA9IG51bGw7Ci0JCXRyeSB7Ci0JCQl3cml0ZXIgPSBuZXcgRmlsZVdyaXRlcihmaWxlbmFtZSk7Ci0JCQl3cml0ZXIud3JpdGUodGV4dCk7Ci0JCQl3cml0ZXIuZmx1c2goKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQl9IGZpbmFsbHkgewotCQkJaWYgKHdyaXRlciAhPSBudWxsKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJd3JpdGVyLmNsb3NlKCk7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBXcml0ZSB0aGUgZ2l2ZW4gdGV4dCB0byBhIGZpbGUgd2l0aCBVVEYtOCBlbmNvZGluZy4KLQkgKiAKLQkgKiBAcGFyYW0gZmlsZU5hbWUKLQkgKiAgICAgICAgICAgIHRoZSB0YXJnZXQgZmlsZSBuYW1lCi0JICogQHBhcmFtIHRleHQKLQkgKiAgICAgICAgICAgIHRoZSB0ZXh0IHRvIHdyaXRlCi0JICogQHBhcmFtIGFwcGVuZAotCSAqICAgICAgICAgICAgaWYgPGNvZGU+dHJ1ZTwvY29kZT4sIGFwcGVuZCB0aGUgdGV4dCB0byB0aGUgZW5kIG9mIHRoZQotCSAqICAgICAgICAgICAgZmlsZSwgaWYgPGNvZGU+ZmFsc2U8L2NvZGU+LCBvdmVycmlkZSB0aGUgZmlsZQotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGdpdmVuIHRleHQgaXMgd3JpdHRlbiBzdWNjZXNzZnVsbHkgdG8KLQkgKiAgICAgICAgIGZpbGUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gd3JpdGVVVEY4RmlsZShTdHJpbmcgZmlsZW5hbWUsIFN0cmluZyB0ZXh0KSB7Ci0JCXJldHVybiB3cml0ZVVURjhGaWxlKGZpbGVuYW1lLCB0ZXh0LCBmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogV3JpdGUgdGhlIGdpdmVuIHRleHQgdG8gYSBmaWxlIHdpdGggVVRGLTggZW5jb2RpbmcuCi0JICogCi0JICogQHBhcmFtIGZpbGVOYW1lCi0JICogICAgICAgICAgICB0aGUgdGFyZ2V0IGZpbGUgbmFtZQotCSAqIEBwYXJhbSB0ZXh0Ci0JICogICAgICAgICAgICB0aGUgdGV4dCB0byB3cml0ZQotCSAqIEBwYXJhbSBhcHBlbmQKLQkgKiAgICAgICAgICAgIGlmIDxjb2RlPnRydWU8L2NvZGU+LCBhcHBlbmQgdGhlIHRleHQgdG8gdGhlIGVuZCBvZiB0aGUKLQkgKiAgICAgICAgICAgIGZpbGUsIGlmIDxjb2RlPmZhbHNlPC9jb2RlPiwgb3ZlcnJpZGUgdGhlIGZpbGUKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBnaXZlbiB0ZXh0IGlzIHdyaXR0ZW4gc3VjY2Vzc2Z1bGx5IHRvCi0JICogICAgICAgICBmaWxlCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHdyaXRlVVRGOEZpbGUoU3RyaW5nIGZpbGVuYW1lLCBTdHJpbmcgdGV4dCwKLQkJCWJvb2xlYW4gYXBwZW5kKSB7Ci0JCU91dHB1dFN0cmVhbVdyaXRlciB3cml0ZXIgPSBudWxsOwotCQlGaWxlT3V0cHV0U3RyZWFtIGZpbGVPdXQgPSBudWxsOwotCQl0cnkgewotCQkJZmlsZU91dCA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKGZpbGVuYW1lLCBhcHBlbmQpOwotCQkJd3JpdGVyID0gbmV3IE91dHB1dFN0cmVhbVdyaXRlcihmaWxlT3V0LCBFTkNPRElOR19VVEZfOCk7Ci0JCQl3cml0ZXIud3JpdGUodGV4dCk7Ci0JCQl3cml0ZXIuZmx1c2goKTsKLQkJCWZpbGVPdXQuZmx1c2goKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJQ29tbW9uUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWlmICh3cml0ZXIgIT0gbnVsbCkgewotCQkJCXRyeSB7Ci0JCQkJCXdyaXRlci5jbG9zZSgpOwotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCX0KLQkJCX0KLQkJCWlmIChmaWxlT3V0ICE9IG51bGwpIHsKLQkJCQl0cnkgewotCQkJCQlmaWxlT3V0LmNsb3NlKCk7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBXcml0ZSB0aGUgY29udGVudCBvZiB0aGUgZ2l2ZW4gVVJJIHRvIGFuIG91dHB1dCBzdHJlYW0uCi0JICogCi0JICogQHBhcmFtIHVyaQotCSAqICAgICAgICAgICAgdGhlIHNvdXJjZSBVUkkKLQkgKiBAcGFyYW0gb3V0cHV0Ci0JICogICAgICAgICAgICB0aGUgb3V0cHV0IHN0cmVhbQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCB3cml0ZUZpbGUoU3RyaW5nIHVyaSwgT3V0cHV0U3RyZWFtIG91dHB1dCkKLQkJCXRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWlmICh1cmkgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJSW5wdXRTdHJlYW0gaW5wdXQgPSBudWxsOwotCQl0cnkgewotCQkJaW5wdXQgPSBOZXRVdGlsLmdldElucHV0U3RyZWFtKHVyaSk7Ci0JCQlpbnQgYnl0ZXNSZWFkOwotCQkJYnl0ZVtdIGJ1ZiA9IG5ldyBieXRlWzQwOTZdOwotCQkJd2hpbGUgKChieXRlc1JlYWQgPSBpbnB1dC5yZWFkKGJ1ZiwgMCwgNDA5NikpID4gMCkgewotCQkJCW91dHB1dC53cml0ZShidWYsIDAsIGJ5dGVzUmVhZCk7Ci0JCQl9Ci0JCQlvdXRwdXQuZmx1c2goKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChpbnB1dCAhPSBudWxsKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJaW5wdXQuY2xvc2UoKTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFdyaXRlIHRoZSBjb250ZW50IG9mIHRoZSBnaXZlbiBVUkkgdG8gYSA8Y29kZT5QcmludFdyaXRlcjwvY29kZT4uCi0JICogCi0JICogQHBhcmFtIHVyaQotCSAqICAgICAgICAgICAgdGhlIHNvdXJjZSBVUkkKLQkgKiBAcGFyYW0gd3JpdGVyCi0JICogICAgICAgICAgICB0aGUgPGNvZGU+UHJpbnRXcml0ZXI8L2NvZGU+IG9iamVjdAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCB3cml0ZUZpbGUoU3RyaW5nIHVyaSwgUHJpbnRXcml0ZXIgcHcpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWlmICh1cmkgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJSW5wdXRTdHJlYW1SZWFkZXIgaW5wdXQgPSBudWxsOwotCQl0cnkgewotCQkJaW5wdXQgPSBuZXcgSW5wdXRTdHJlYW1SZWFkZXIoTmV0VXRpbC5nZXRJbnB1dFN0cmVhbSh1cmkpKTsKLQkJCWludCBjaGFyc1JlYWQ7Ci0JCQljaGFyW10gYnVmID0gbmV3IGNoYXJbNDA5Nl07Ci0JCQl3aGlsZSAoKGNoYXJzUmVhZCA9IGlucHV0LnJlYWQoYnVmLCAwLCA0MDk2KSkgPiAwKSB7Ci0JCQkJcHcud3JpdGUoYnVmLCAwLCBjaGFyc1JlYWQpOwotCQkJfQotCQkJcHcuZmx1c2goKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChpbnB1dCAhPSBudWxsKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJaW5wdXQuY2xvc2UoKTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFJlY3Vyc2l2ZWx5IGRlbGV0ZSBhbGwgc3ViLWRpcmVjdG9yaWVzIGFuZCBmaWxlcyBpbiBhIGRpcmVjdG9yeSBleGNlcHQKLQkgKiBmb3IgdGhlIGRpcmVjdG9yeSBpdHNlbGYuCi0JICogCi0JICogQHBhcmFtIGRpcgotCSAqICAgICAgICAgICAgdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZSBzdWItZGlyZWN0b3JpZXMgYW5kIGZpbGVzCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgZGVsZXRlIG9wZXJhdGlvbiBpcyBzdWNjZXNzZnVsCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGRlbGV0ZUFsbEZpbGVzKFN0cmluZyBkaXIpIHsKLQkJYm9vbGVhbiByZXQgPSB0cnVlOwotCQlGaWxlIHRhcmdldERpciA9IG5ldyBGaWxlKGRpcik7Ci0JCUZpbGVbXSBmaWxlcyA9IHRhcmdldERpci5saXN0RmlsZXMoKTsKLQkJaWYgKGZpbGVzICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAoZmlsZXNbaV0uaXNEaXJlY3RvcnkoKSkgewotCQkJCQlyZXQgPSByZXQgJiYgZGVsZXRlQWxsRmlsZXMoZmlsZXNbaV0uZ2V0QWJzb2x1dGVQYXRoKCkpOwotCQkJCX0KLQkJCQlyZXQgPSByZXQgJiYgZmlsZXNbaV0uZGVsZXRlKCk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gcmV0OwotCX0KLQotCS8qKgotCSAqIFJlY3Vyc2l2ZWx5IGRlbGV0ZSBhbGwgc3ViLWRpcmVjdG9yaWVzIGFuZCBmaWxlcyBpbiBhIGRpcmVjdG9yeSBleGNlcHQKLQkgKiBmb3IgdGhlIGRpcmVjdG9yeSBpdHNlbGYgYW5kIHRoZSBzcGVjaWZpZWQgZmlsZS4KLQkgKiAKLQkgKiBAcGFyYW0gZGlyCi0JICogICAgICAgICAgICB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIHN1Yi1kaXJlY3RvcmllcyBhbmQgZmlsZXMKLQkgKiBAcGFyYW0gZmlsZXNOb3RUb0RlbGV0ZQotCSAqICAgICAgICAgICAgYSBsaXN0IG9mIGZpbGVzIGFuZC9vciBkaXJlY3RvcmllcyB0aGF0IHNob3VsZCBub3QgYmUgZGVsZXRlZAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgZGVsZXRlIG9wZXJhdGlvbiBpcyBzdWNjZXNzZnVsCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGRlbGV0ZUFsbEZpbGVzKFN0cmluZyBkaXIsIExpc3Q8RmlsZT4gZmlsZXNOb3RUb0RlbGV0ZSkgewotCQlib29sZWFuIHJldCA9IHRydWU7Ci0JCUZpbGUgdGFyZ2V0RGlyID0gbmV3IEZpbGUoZGlyKTsKLQkJRmlsZVtdIGZpbGVzID0gdGFyZ2V0RGlyLmxpc3RGaWxlcygpOwotCQlpZiAoZmlsZXMgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykgewotCQkJCWlmICghZmlsZXNOb3RUb0RlbGV0ZS5jb250YWlucyhmaWxlc1tpXSkpIHsKLQkJCQkJaWYgKGZpbGVzW2ldLmlzRGlyZWN0b3J5KCkpIHsKLQkJCQkJCXJldCA9IHJldAotCQkJCQkJCQkmJiBkZWxldGVBbGxGaWxlcyhmaWxlc1tpXS5nZXRBYnNvbHV0ZVBhdGgoKSwKLQkJCQkJCQkJCQlmaWxlc05vdFRvRGVsZXRlKTsKLQkJCQkJfQotCQkJCQlyZXQgPSByZXQgJiYgZmlsZXNbaV0uZGVsZXRlKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQkvKioKLQkgKiBDb3BpZXMgdGhlIGNvbnRlbnQgb2YgdGhlIHNvdXJjZSBmaWxlIHRvIHRoZSB0YXJnZXQgZmlsZS4gV2lsbCBvdmVyd3JpdGUKLQkgKiBhbiBleGlzdGluZyBmaWxlIGlmIGl0IGhhcyB3cml0ZSBwZXJtaXNzaW9uCi0JICogCi0JICogQHBhcmFtIHNyY0ZpbGUKLQkgKiAgICAgICAgICAgIHRoZSBzb3VyY2UgZmlsZSBvciBwYXRoCi0JICogQHBhcmFtIHRndEZpbGUKLQkgKiAgICAgICAgICAgIHRoZSB0YXJnZXQgZmlsZSBvciBwYXRoCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNvcHlGaWxlKEZpbGUgc3JjRmlsZSwgRmlsZSB0Z3RGaWxlKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gY29weWZpbGUoc3JjRmlsZSwgdGd0RmlsZSk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7Ci0JCQlDb21tb25QbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGV4KTsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENvcGllcyB0aGUgY29udGVudCBvZiB0aGUgc291cmNlIGZpbGUgdG8gdGhlIHRhcmdldCBmaWxlLgotCSAqIAotCSAqIEBwYXJhbSBzcmNGaWxlTmFtZQotCSAqICAgICAgICAgICAgdGhlIHNvdXJjZSBmaWxlIG5hbWUKLQkgKiBAcGFyYW0gdGd0RmlsZU5hbWUKLQkgKiAgICAgICAgICAgIHRoZSB0YXJnZXQgZmlsZSBuYW1lCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNvcHlGaWxlKFN0cmluZyBzcmNGaWxlTmFtZSwgU3RyaW5nIHRndEZpbGVOYW1lKSB7Ci0JCXJldHVybiBjb3B5RmlsZShuZXcgRmlsZShzcmNGaWxlTmFtZSksIG5ldyBGaWxlKHRndEZpbGVOYW1lKSk7Ci0JfQotCi0JLyoqCi0JICogQ29waWVzIG9uZSBmaWxlIHRvIGFub3RoZXIuCi0JICogPHA+Ci0JICogSWYgYm90aCBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIGFyZSBkaXJlY3RvcmllcywgZGVsZWdhdGVzIHRvCi0JICogY29weWRpcmVjdG9yeSgpLgotCSAqIDxwPgotCSAqIHNvdXJjZSBtdXN0IGV4aXN0IGFuZCBiZSByZWFkYWJsZQotCSAqIDxwPgotCSAqIGNhbm5vdCBjb3B5IGEgZGlyZWN0b3J5IHRvIGEgZmlsZQotCSAqIDxwPgotCSAqIHdpbGwgbm90IGNvcHkgaWYgdGltZXN0YW1wcyBhbmQgZmlsZXNpemUgbWF0Y2gsIHdpbGwgb3ZlcndyaXRlIG90aGVyd2lzZQotCSAqIAotCSAqIEBwYXJhbSBzb3VyY2UKLQkgKiAgICAgICAgICAgIHRoZSBzb3VyY2UgZmlsZQotCSAqIEBwYXJhbSBkZXN0Ci0JICogICAgICAgICAgICB0aGUgZGVzdGluYXRpb24gZmlsZQotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMgZHVyaW5nIHRoZSBjb3B5IG9wZXJhdGlvbgotCSAqLwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gY29weWZpbGUoRmlsZSBzb3VyY2UsIEZpbGUgZGVzdCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaWYgKHNvdXJjZS5lcXVhbHMoZGVzdCkpCi0JCQkvLyBkbyBub3QgY29weSBlcXVhbCBmaWxlcwotCQkJcmV0dXJuIGZhbHNlOwotCi0JCWlmICghc291cmNlLmV4aXN0cygpIHx8ICFzb3VyY2UuY2FuUmVhZCgpKSB7Ci0JCQkvLyBzb3VyY2UgZG9lcyBub3QgZXhpc3Qgb3IgY2FuJ3QgcmVhZAotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJaWYgKGRlc3QuZXhpc3RzKCkgJiYgIWRlc3QuY2FuV3JpdGUoKSkgewotCQkJLy8gZGVzdCBleGlzdHMgYW5kIGNhbm5vdCBiZSB3cml0dGVuCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlpZiAoc291cmNlLmlzRGlyZWN0b3J5KCkpIHsKLQkJCWlmIChkZXN0LmlzRmlsZSgpKSB7Ci0JCQkJLy8gY2FuJ3QgY29weSBhIGRpcmVjdG9yeSB0byBhIGZpbGUKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9IGVsc2UgewotCQkJCS8vIGRlbGVnYXRlIHRvIGNvcHlkaXJlY3RvcnkKLQkJCQlyZXR1cm4gY29weWRpcmVjdG9yeShzb3VyY2UsIGRlc3QpOwotCQkJfQotCQl9IGVsc2UgewotCQkJLy8gc291cmNlIGlzIGEgZmlsZQotCQkJaWYgKGRlc3QuaXNEaXJlY3RvcnkoKSkgewotCQkJCVN0cmluZyBzb3VyY2VGaWxlTmFtZSA9IHNvdXJjZS5nZXROYW1lKCk7Ci0JCQkJcmV0dXJuIGNvcHlmaWxlKHNvdXJjZSwgbmV3IEZpbGUoZGVzdCwgc291cmNlRmlsZU5hbWUpKTsKLQkJCX0KLQkJCS8vIGJvdGggc291cmNlIGFuZCBkZXN0IGFyZSBmaWxlcwotCQkJYm9vbGVhbiBuZWVkQ29weSA9IHRydWU7Ci0JCQlpZiAoZGVzdC5leGlzdHMoKSkgewotCQkJCW5lZWRDb3B5ID0gKGRlc3QubGFzdE1vZGlmaWVkKCkgIT0gc291cmNlLmxhc3RNb2RpZmllZCgpKQotCQkJCQkJfHwgKGRlc3QubGVuZ3RoKCkgIT0gc291cmNlLmxlbmd0aCgpKTsKLQkJCX0KLQotCQkJaWYgKG5lZWRDb3B5KSB7Ci0JCQkJRmlsZUlucHV0U3RyZWFtIGlucHV0ID0gbnVsbDsKLQkJCQlGaWxlT3V0cHV0U3RyZWFtIG91dHB1dCA9IG51bGw7Ci0KLQkJCQl0cnkgewotCQkJCQlpbnB1dCA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oc291cmNlKTsKLQkJCQkJRmlsZUNoYW5uZWwgaW4gPSBpbnB1dC5nZXRDaGFubmVsKCk7Ci0JCQkJCWlmICghZGVzdC5leGlzdHMoKSkgewotCQkJCQkJZGVzdC5nZXRQYXJlbnRGaWxlKCkubWtkaXJzKCk7Ci0JCQkJCX0KLQkJCQkJb3V0cHV0ID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oZGVzdCk7Ci0JCQkJCUZpbGVDaGFubmVsIG91dCA9IG91dHB1dC5nZXRDaGFubmVsKCk7Ci0JCQkJCW91dC50cmFuc2ZlckZyb20oaW4sIDAsIHNvdXJjZS5sZW5ndGgoKSk7Ci0JCQkJCWRlc3Quc2V0TGFzdE1vZGlmaWVkKHNvdXJjZS5sYXN0TW9kaWZpZWQoKSk7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0gZmluYWxseSB7Ci0JCQkJCWlmIChpbnB1dCAhPSBudWxsKSB7Ci0JCQkJCQl0cnkgewotCQkJCQkJCWlucHV0LmNsb3NlKCk7Ci0JCQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJaWYgKG91dHB1dCAhPSBudWxsKSB7Ci0JCQkJCQl0cnkgewotCQkJCQkJCW91dHB1dC5jbG9zZSgpOwotCQkJCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQkvLyBkaWQgbm90IGNvcHkKLQkJCQkvLyByZXR1cm4gdHJ1ZSBiZWNhdXNlIGRlc3QgZmlsZSBpcyBzYW1lIGFzIHNvdXJjZQotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQ29waWVzIHRoZSBjb250ZW50IG9mIGEgZGlyZWN0b3J5IHRvIGFub3RoZXIgZGlyZWN0b3J5LgotCSAqIAotCSAqIEBwYXJhbSBzcmNEaXJOYW1lCi0JICogICAgICAgICAgICB0aGUgc291cmNlIGRpcmVjdG9yeSBuYW1lCi0JICogQHBhcmFtIHRndERpck5hbWUKLQkgKiAgICAgICAgICAgIHRoZSB0YXJnZXQgZGlyZWN0b3J5IG5hbWUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY29weURpcihGaWxlIHNyY0RpciwgRmlsZSB0Z3REaXIpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBjb3B5ZGlyZWN0b3J5KHNyY0RpciwgdGd0RGlyKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKLQkJCUNvbW1vblBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZXgpOwotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ29waWVzIHRoZSBjb250ZW50IG9mIGEgZGlyZWN0b3J5IHRvIGFub3RoZXIgZGlyZWN0b3J5LgotCSAqIAotCSAqIEBwYXJhbSBzcmNEaXJOYW1lCi0JICogICAgICAgICAgICB0aGUgc291cmNlIGRpcmVjdG9yeSBuYW1lCi0JICogQHBhcmFtIHRndERpck5hbWUKLQkgKiAgICAgICAgICAgIHRoZSB0YXJnZXQgZGlyZWN0b3J5IG5hbWUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY29weURpcihTdHJpbmcgc3JjRGlyTmFtZSwgU3RyaW5nIHRndERpck5hbWUpIHsKLQkJcmV0dXJuIGNvcHlEaXIobmV3IEZpbGUoc3JjRGlyTmFtZSksIG5ldyBGaWxlKHRndERpck5hbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiBDb3BpZXMgb25lIGRpcmVjdG9yeSB0byBhbm90aGVyIC0gb3BlcmF0ZXMgT05MWSBvbiBkaXJlY3Rvcmllcy4KLQkgKiA8cD4KLQkgKiBCb3RoIHNvdXJjZSBhbmQgZGVzdCBtdXN0IGV4aXN0LgotCSAqLwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gY29weWRpcmVjdG9yeShGaWxlIHNvdXJjZURpciwgRmlsZSBkZXN0RGlyKQotCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaWYgKCFzb3VyY2VEaXIuZXhpc3RzKCkgfHwgIWRlc3REaXIuZXhpc3RzKCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCWlmICghc291cmNlRGlyLmlzRGlyZWN0b3J5KCkgfHwgIWRlc3REaXIuaXNEaXJlY3RvcnkoKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJRmlsZVtdIGZpbGVzID0gc291cmNlRGlyLmxpc3RGaWxlcygpOwotCQlpZiAoZmlsZXMgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykgewotCQkJCS8vIGNhbGMgZGVzdGluYXRpb24gbmFtZQotCQkJCVN0cmluZyBkZXN0TmFtZSA9IGRlc3REaXIKLQkJCQkJCSsgRmlsZS5zZXBhcmF0b3IKLQkJCQkJCSsgZmlsZXNbaV0uZ2V0QWJzb2x1dGVQYXRoKCkuc3Vic3RyaW5nKAotCQkJCQkJCQlzb3VyY2VEaXIuZ2V0QWJzb2x1dGVQYXRoKCkubGVuZ3RoKCkgKyAxKTsKLQkJCQlpZiAoZmlsZXNbaV0uaXNGaWxlKCkpIHsKLQkJCQkJLy8gY29weSB0aGUgZmlsZQotCQkJCQljb3B5ZmlsZShmaWxlc1tpXSwgbmV3IEZpbGUoZGVzdE5hbWUpKTsKLQkJCQl9IGVsc2UgaWYgKGZpbGVzW2ldLmlzRGlyZWN0b3J5KCkpIHsKLQkJCQkJLy8gY29weSBkaXJlY3RvcnkgcmVjdXJzaXZlbHkKLQkJCQkJRmlsZSBkZXN0RmlsZSA9IG5ldyBGaWxlKGRlc3ROYW1lKTsKLQkJCQkJZGVzdEZpbGUubWtkaXJzKCk7Ci0JCQkJCWNvcHlkaXJlY3RvcnkoZmlsZXNbaV0sIGRlc3RGaWxlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLy8gZm9yIHNvbWUgcmVhc29uLCB0aGlzIGd1eSBsb2NrcyB0aGUgZmlsZSwgaWYgeW91IHRyeSB0byB1cGRhdGUgdGhlIGZpbGUsCi0JLy8gZ290IHRoZSBmb2xsb3dpbmcgZXhjZXB0aW9uCi0JLy8gamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb246Ci0JLy8gKFRoZSByZXF1ZXN0ZWQgb3BlcmF0aW9uIGNhbm5vdCBiZSBwZXJmb3JtZWQgb24gYSBmaWxlIHdpdGggYSB1c2VyLW1hcHBlZAotCS8vIHNlY3Rpb24gb3BlbikKLQkvLyBuZWVkIHRvIGhhbmRsZSBsYXRlcgotCXB1YmxpYyBzdGF0aWMgQ2hhckJ1ZmZlciByZWFkRmlsZShGaWxlIGZpbGUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCUZpbGVJbnB1dFN0cmVhbSBpbnB1dCA9IG51bGw7Ci0JCUNoYXJCdWZmZXIgY2hhckJ1ZmZlciA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlpbnB1dCA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oZmlsZSk7Ci0JCQlGaWxlQ2hhbm5lbCBpbkNoYW5uZWwgPSBpbnB1dC5nZXRDaGFubmVsKCk7Ci0JCQlpbnQgbGVuZ3RoID0gKGludCkgaW5DaGFubmVsLnNpemUoKTsKLQkJCU1hcHBlZEJ5dGVCdWZmZXIgYnl0ZUJ1ZmZlciA9IGluQ2hhbm5lbC5tYXAoCi0JCQkJCUZpbGVDaGFubmVsLk1hcE1vZGUuUkVBRF9PTkxZLCAwLCBsZW5ndGgpOwotCQkJQ2hhcnNldCBjaGFyc2V0ID0gQ2hhcnNldC5mb3JOYW1lKEVOQ09ESU5HX0lTT184ODU5XzEpOwotCQkJQ2hhcnNldERlY29kZXIgZGVjb2RlciA9IGNoYXJzZXQubmV3RGVjb2RlcigpOwotCQkJY2hhckJ1ZmZlciA9IGRlY29kZXIuZGVjb2RlKGJ5dGVCdWZmZXIpOwotCQl9IGZpbmFsbHkgewotCQkJaWYgKGlucHV0ICE9IG51bGwpIHsKLQkJCQl0cnkgewotCQkJCQlpbnB1dC5jbG9zZSgpOwotCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGNoYXJCdWZmZXI7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVhZElucHV0U3RyZWFtKElucHV0U3RyZWFtIGlucHV0KSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlTdHJpbmcgcmVzdWx0ID0gIiI7ICAvLyROT04tTkxTLTEkCi0JCWJ5dGVbXSByZWFkRGF0YSA9IG5ldyBieXRlWzggKiAxMDI0XTsKLQkJdHJ5IHsKLQkJCWludCBieXRlc1JlYWQgPSBpbnB1dC5yZWFkKHJlYWREYXRhKTsKLQkJCXdoaWxlIChieXRlc1JlYWQgPiAwKSB7Ci0JCQkJcmVzdWx0ICs9IG5ldyBTdHJpbmcocmVhZERhdGEpOwotCQkJCWJ5dGVzUmVhZCA9IGlucHV0LnJlYWQocmVhZERhdGEpOwotCQkJfQotCQl9IGZpbmFsbHkgewotCQkJaWYgKGlucHV0ICE9IG51bGwpIHsKLQkJCQl0cnkgewotCQkJCQlpbnB1dC5jbG9zZSgpOwotCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZ0J1ZmZlciByZWFkRmlsZShGaWxlIGZpbGUsIFN0cmluZyBlbmNvZGluZykKLQkJCXRocm93cyBJT0V4Y2VwdGlvbiB7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJRmlsZUlucHV0U3RyZWFtIGZpcyA9IG51bGw7Ci0JCUlucHV0U3RyZWFtUmVhZGVyIHJlYWRlciA9IG51bGw7Ci0JCWludCBzaXplOwotCQl0cnkgewotCQkJQ2hhcnNldCBjcyA9IENoYXJzZXQuZm9yTmFtZShlbmNvZGluZyk7Ci0JCQlDaGFyc2V0RGVjb2RlciBjc2QgPSBjcy5uZXdEZWNvZGVyKCk7Ci0JCQljc2Qub25NYWxmb3JtZWRJbnB1dChDb2RpbmdFcnJvckFjdGlvbi5SRVBMQUNFKTsKLQkJCWNoYXJbXSBidWZmZXIgPSBuZXcgY2hhclsxMDI0XTsKLQkJCWZpcyA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oZmlsZSk7Ci0JCQlyZWFkZXIgPSBuZXcgSW5wdXRTdHJlYW1SZWFkZXIoZmlzLCBjc2QpOwotCQkJd2hpbGUgKChzaXplID0gcmVhZGVyLnJlYWQoYnVmZmVyLCAwLCAxMDI0KSkgPiAwKSB7Ci0JCQkJcmVzdWx0LmFwcGVuZChidWZmZXIsIDAsIHNpemUpOwotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKGVuY29kaW5nKTsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAoZmlzICE9IG51bGwpIHsKLQkJCQlmaXMuY2xvc2UoKTsKLQkJCX0KLQotCQkJaWYgKHJlYWRlciAhPSBudWxsKSB7Ci0JCQkJcmVhZGVyLmNsb3NlKCk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGxvbmcgZ2V0U2l6ZShGaWxlIGZpbGUpIHsKLQkJRmlsZUlucHV0U3RyZWFtIGZpcyA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlmaXMgPSBuZXcgRmlsZUlucHV0U3RyZWFtKGZpbGUpOwotCQkJcmV0dXJuIGZpcy5nZXRDaGFubmVsKCkuc2l6ZSgpOwkJCQotCQl9Ci0JCWNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkvLwotCQl9Ci0JCWZpbmFsbHkgewotCQkJdHJ5IHsKLQkJCQlmaXMuY2xvc2UoKTsKLQkJCX0KLQkJCWNhdGNoKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8KLQkJCX0KLQkJfQotCQlyZXR1cm4gLTE7Ci0JfQotCi0JLyoqCi0JICogVXNlcyBKYXZhIDEuNCdzIEZpbGVMb2NrIGNsYXNzIHRvIHRlc3QgZm9yIGEgZmlsZSBsb2NrCi0JICogCi0JICogQHBhcmFtIGZpbGUKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzRmlsZUxvY2tlZChGaWxlIGZpbGUpIHsKLQkJYm9vbGVhbiBpc0xvY2tlZCA9IGZhbHNlOwotCQlGaWxlT3V0cHV0U3RyZWFtIGlucHV0ID0gbnVsbDsKLQkJRmlsZUxvY2sgbG9jayA9IG51bGw7Ci0KLQkJaWYgKCFmaWxlLmV4aXN0cygpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJdHJ5IHsKLQkJCWlucHV0ID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oZmlsZSk7Ci0JCQlGaWxlQ2hhbm5lbCBmaWxlQ2hhbm5lbCA9IGlucHV0LmdldENoYW5uZWwoKTsKLQotCQkJbG9jayA9IGZpbGVDaGFubmVsLnRyeUxvY2soKTsKLQotCQkJaWYgKGxvY2sgPT0gbnVsbCkKLQkJCQlpc0xvY2tlZCA9IHRydWU7Ci0JCQllbHNlCi0JCQkJbG9jay5yZWxlYXNlKCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlpZiAoZSBpbnN0YW5jZW9mIFNlY3VyaXR5RXhjZXB0aW9uKQotCQkJCS8vIENhbid0IHdyaXRlIHRvIGZpbGUuCi0JCQkJaXNMb2NrZWQgPSB0cnVlOwotCQkJZWxzZSBpZiAoZSBpbnN0YW5jZW9mIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbikKLQkJCQlpc0xvY2tlZCA9IGZhbHNlOwotCQkJZWxzZSBpZiAoZSBpbnN0YW5jZW9mIElPRXhjZXB0aW9uKQotCQkJCWlzTG9ja2VkID0gdHJ1ZTsKLQkJCS8vIE92ZXJsYXBwaW5nRmlsZUxvY2tFeGNlcHRpb24gbWVhbnMgdGhhdCB0aGlzIEpWTSBoYXMgaXQgbG9ja2VkCi0JCQkvLyB0aGVyZWZvcmUgaXQgaXMgbm90IGxvY2tlZCB0byB1cwotCQkJZWxzZSBpZiAoZSBpbnN0YW5jZW9mIE92ZXJsYXBwaW5nRmlsZUxvY2tFeGNlcHRpb24pCi0JCQkJaXNMb2NrZWQgPSBmYWxzZTsKLQkJCS8vIENvdWxkIG5vdCBnZXQgYSBsb2NrIGZvciBzb21lIG90aGVyIHJlYXNvbi4KLQkJCWVsc2UKLQkJCQlpc0xvY2tlZCA9IHRydWU7Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAoaW5wdXQgIT0gbnVsbCkgewotCQkJCXRyeSB7Ci0JCQkJCWlucHV0LmNsb3NlKCk7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBpc0xvY2tlZDsKLQl9Ci0KLQkvKioKLQkgKiBMb2NrcyBhIGZpbGUgZm9yIHRoZSBjdXJyZW50IEpWTS4gV2lsbCBjcmVhdGUgdGhlIGZpbGUgaWYgaXQgZG9lcyBub3QKLQkgKiBleGlzdAotCSAqIAotCSAqIEBwYXJhbSBmaWxlCi0JICogQHJldHVybiBhIEZpbGVMb2NrIG9iamVjdCwgb3IgbnVsbCBpZiBmaWxlIGNvdWxkIG5vdCBiZSBsb2NrZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEZpbGVMb2NrIGxvY2tGaWxlKEZpbGUgZmlsZSkgewotCQlGaWxlT3V0cHV0U3RyZWFtIGlucHV0ID0gbnVsbDsKLQkJRmlsZUxvY2sgbG9jayA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlpbnB1dCA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKGZpbGUpOwotCQkJRmlsZUNoYW5uZWwgZmlsZUNoYW5uZWwgPSBpbnB1dC5nZXRDaGFubmVsKCk7Ci0JCQlsb2NrID0gZmlsZUNoYW5uZWwudHJ5TG9jaygpOwotCi0JCQlpZiAobG9jay5pc1ZhbGlkKCkpCi0JCQkJcmV0dXJuIGxvY2s7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBDb3VsZCBub3QgZ2V0IGEgbG9jayBmb3Igc29tZSByZWFzb24uCi0JCQlyZXR1cm4gbnVsbDsKLQkJfSBmaW5hbGx5IHsKLQkJCXRyeSB7Ci0JCQkJaWYgKGlucHV0ICE9IG51bGwgJiYgKGxvY2sgPT0gbnVsbCB8fCAhbG9jay5pc1ZhbGlkKCkpKSB7Ci0JCQkJCWlucHV0LmNsb3NlKCk7Ci0JCQkJfQotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogR2V0cyBhbGwgZmlsZXMgaW4gYSBzcGVjaWZpZWQgcGF0aC4KLQkgKiAKLQkgKiBAcGFyYW0gcGF0aAotCSAqICAgICAgICAgICAgYWJzb2x1dGUgcGF0aCBvZiBhIGZvbGRlcgotCSAqIEBwYXJhbSBmaWxlTGlzdAotCSAqICAgICAgICAgICAgYSBsaXN0IHRvIGNvbGxlY3QgdGhlIGZpbGVzCi0JICogQHBhcmFtIHJlY3Vyc2l2ZQotCSAqICAgICAgICAgICAgaWYgPGNvZGU+dHJ1ZTwvY29kZT4sIGZpbmQgdGhlIGZpbGVzIGluIHN1YiBmb2xkZXJzIGFzIHdlbGwKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgZ2V0QWxsRmlsZXMoRmlsZSBwYXRoLCBMaXN0PEZpbGU+IGZpbGVMaXN0LAotCQkJYm9vbGVhbiByZWN1cnNpdmUpIHsKLQkJaWYgKHBhdGguaXNEaXJlY3RvcnkoKSkgewotCQkJRmlsZVtdIGZpbGVzID0gcGF0aC5saXN0RmlsZXMoKTsKLQkJCWlmIChmaWxlcyAhPSBudWxsKSB7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykgewotCQkJCQlpZiAoZmlsZXNbaV0uaXNGaWxlKCkpIHsKLQkJCQkJCWZpbGVMaXN0LmFkZChmaWxlc1tpXSk7Ci0JCQkJCX0gZWxzZSBpZiAocmVjdXJzaXZlKSB7Ci0JCQkJCQlnZXRBbGxGaWxlcyhmaWxlc1tpXSwgZmlsZUxpc3QsIHJlY3Vyc2l2ZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBHaXZlbiBhIGRpcmVjdG9yeSBhbmQgZXh0ZW5zaW9uLCByZXR1cm5zIGFsbCBmaWxlcyAocmVjdXJzaXZlbHkpIHdob3NlCi0JICogZXh0ZW5zaW9uIHN0YXJ0cyB3aXRoIGEgZ2l2ZW4gZXh0ZW5zaW9uLgotCSAqIAotCSAqIEBwYXJhbSBmaWxlCi0JICogICAgICAgICAgICBhIGRpcmVjdG9yeQotCSAqIEBwYXJhbSBleHRlbnNpb24KLQkgKiAgICAgICAgICAgIGEgZmlsZSBleHRlbnNpb24KLQkgKiBAcmV0dXJuIGEgY29sbGVjaXRvbiBvZiA8Y29kZT5GaWxlPC9jb2RlPiB3aXRoIHRoZSBnaXZlbiBleHRlbnNpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3Q8RmlsZT4gZmlsZUxpc3QoRmlsZSBmLCBTdHJpbmcgZXh0ZW5zaW9uKSB7Ci0JCWV4dGVuc2lvbiA9IGV4dGVuc2lvbi50b1VwcGVyQ2FzZSgpOwotCQlMaXN0PEZpbGU+IHJldHVybkxpc3QgPSBuZXcgQXJyYXlMaXN0PEZpbGU+KCk7Ci0JCXRyeSB7Ci0JCQlpZiAoZi5pc0RpcmVjdG9yeSgpKSB7Ci0JCQkJU3RyaW5nW10gZmxpc3QgPSBmLmxpc3QoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGZsaXN0Lmxlbmd0aDsgKytpKSB7Ci0JCQkJCUZpbGUgZmMgPSBuZXcgRmlsZShmLmdldFBhdGgoKSwgZmxpc3RbaV0pOwotCQkJCQlyZXR1cm5MaXN0LmFkZEFsbChmaWxlTGlzdChmYywgZXh0ZW5zaW9uKSk7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlpZiAoZXh0ZW5zaW9uICE9IG51bGwpIHsKLQkJCQkJU3RyaW5nIG5hbWUgPSBmLmdldE5hbWUoKS50b1VwcGVyQ2FzZSgpOwotCQkJCQlpZiAobmFtZS5sYXN0SW5kZXhPZigiLiIpICE9IC0xKSAvLyROT04tTkxTLTEkCi0JCQkJCQlpZiAobmFtZQotCQkJCQkJCQkuc3Vic3RyaW5nKG5hbWUubGFzdEluZGV4T2YoIi4iKSArIDEpLnN0YXJ0c1dpdGgoZXh0ZW5zaW9uKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCQkJcmV0dXJuTGlzdC5hZGQoZik7Ci0JCQkJCQl9Ci0JCQkJfSBlbHNlCi0JCQkJCXJldHVybkxpc3QuYWRkKGYpOwotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJQ29tbW9uUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJfQotCQlyZXR1cm4gcmV0dXJuTGlzdDsKLQl9Ci0KLQkvKioKLQkgKiBHaXZlbiBhIGRpcmVjdG9yeSBhbmQgZXh0ZW5zaW9uLCByZXR1cm5zIGFsbCBmaWxlcyAocmVjdXJzaXZlbHkpIHdob3NlCi0JICogZXh0ZW5zaW9uIGRvZXMgbm90IHN0YXJ0cyB3aXRoIGEgZ2l2ZW4gZXh0ZW5zaW9uLgotCSAqIAotCSAqIEBwYXJhbSBmaWxlCi0JICogICAgICAgICAgICBhIGRpcmVjdG9yeQotCSAqIEBwYXJhbSBleHRlbnNpb24KLQkgKiAgICAgICAgICAgIGEgZmlsZSBleHRlbnNpb24KLQkgKiBAcmV0dXJuIGEgY29sbGVjaXRvbiBvZiA8Y29kZT5GaWxlPC9jb2RlPiB3aXRob3V0IHRoZSBnaXZlbiBleHRlbnNpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3Q8RmlsZT4gZmlsZUxpc3RFeGNsdWRlRXh0KEZpbGUgZiwgU3RyaW5nIGV4dGVuc2lvbikgewotCQlMaXN0PEZpbGU+IHJldHVybkxpc3QgPSBuZXcgQXJyYXlMaXN0PEZpbGU+KCk7Ci0JCXRyeSB7Ci0JCQlpZiAoZi5pc0RpcmVjdG9yeSgpKSB7Ci0JCQkJU3RyaW5nW10gZmxpc3QgPSBmLmxpc3QoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGZsaXN0Lmxlbmd0aDsgKytpKSB7Ci0JCQkJCUZpbGUgZmMgPSBuZXcgRmlsZShmLmdldFBhdGgoKSwgZmxpc3RbaV0pOwotCQkJCQlyZXR1cm5MaXN0LmFkZEFsbChmaWxlTGlzdEV4Y2x1ZGVFeHQoZmMsIGV4dGVuc2lvbikpOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKGV4dGVuc2lvbiAhPSBudWxsKSB7Ci0JCQkJCVN0cmluZyBuYW1lID0gZi5nZXROYW1lKCk7Ci0JCQkJCWlmIChuYW1lLmxhc3RJbmRleE9mKCIuIikgIT0gLTEpIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWlmICghKG5hbWUuc3Vic3RyaW5nKG5hbWUubGFzdEluZGV4T2YoIi4iKSArIDEpLnN0YXJ0c1dpdGgoZXh0ZW5zaW9uKSkpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCXJldHVybkxpc3QuYWRkKGYpOwotCQkJCQkJfQotCQkJCX0gZWxzZQotCQkJCQlyZXR1cm5MaXN0LmFkZChmKTsKLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCUNvbW1vblBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCX0KLQkJcmV0dXJuIHJldHVybkxpc3Q7Ci0JfQotCi0JLyoqCi0JICogR2V0cyBhbGwgZmlsZSBwYXRocyBpbiB0aGUgc3BlY2lmaWVkIHBhdGguCi0JICogCi0JICogQHBhcmFtIHBhdGgsCi0JICogICAgICAgICAgICBhYnNvbHV0ZSBwYXRoIG9mIGEgZm9sZGVyCi0JICogQHBhcmFtIHJlY3Vyc2l2ZQotCSAqICAgICAgICAgICAgaWYgPGNvZGU+dHJ1ZTwvY29kZT4sIGZpbmQgdGhlIGZpbGVzIGluIHN1YiBmb2xkZXJzIGFzIHdlbGwKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEFycmF5TGlzdDxTdHJpbmc+IGdldEFsbEZpbGVBYnNvbHV0ZVBhdGhzKEZpbGUgcGF0aCwKLQkJCWJvb2xlYW4gcmVjdXJzaXZlKSB7Ci0JCUFycmF5TGlzdDxGaWxlPiBmaWxlcyA9IG5ldyBBcnJheUxpc3Q8RmlsZT4oKTsKLQkJZ2V0QWxsRmlsZXMocGF0aCwgZmlsZXMsIHJlY3Vyc2l2ZSk7Ci0JCUFycmF5TGlzdDxTdHJpbmc+IHBhdGhzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMuc2l6ZSgpOyBpKyspIHsKLQkJCVN0cmluZyBhYnNQYXRoID0gKChGaWxlKSBmaWxlcy5nZXQoaSkpLmdldEFic29sdXRlUGF0aCgpOwotCQkJcGF0aHMuYWRkKGFic1BhdGgpOwotCQl9Ci0JCXJldHVybiBwYXRoczsKLQl9Ci0KLQkvKioKLQkgKiBNb3ZlcyBhIGZpbGUgZnJvbSBhIGRpcmVjdG9yeSB0byBhbm90aGVyLgotCSAqIDxwPgotCSAqIEF0dGVtcHRzIHRvIHJlbmFtZSB0aGUgZmlsZSBmaXJzdC4gSWYgdGhhdCBmYWlscywgd2lsbCBjb3B5IHRoZQotCSAqIHNvdXJjZUZpbGUgdG8gZGVzdEZpbGUgYW5kIGRlbGV0ZSB0aGUgc291cmNlRmlsZS4KLQkgKiAKLQkgKiBAcGFyYW0gc291cmNlRmlsZQotCSAqICAgICAgICAgICAgdGhlIHNvdXJjZSBmaWxlCi0JICogQHBhcmFtIGRlc3RGaWxlCi0JICogICAgICAgICAgICB0aGUgZGVzdGluYXRpb24gZmlsZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gbW92ZUZpbGUoRmlsZSBzb3VyY2VGaWxlLCBGaWxlIGRlc3RGaWxlKSB7Ci0JCXRyeSB7Ci0JCQlkb01vdmVGaWxlKHNvdXJjZUZpbGUsIGRlc3RGaWxlKTsKLQkJCXJldHVybiB0cnVlOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJQ29tbW9uUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBkb01vdmVGaWxlKEZpbGUgc291cmNlRmlsZSwgRmlsZSBkZXN0RmlsZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJLy8gVHJ5IHRvIHJlbmFtZSB0aGUgc291cmNlIGZpbGUgdG8gdGhlIGRlc3RpbmF0aW9uIGZpbGUuCi0JCWlmICghc291cmNlRmlsZS5yZW5hbWVUbyhkZXN0RmlsZSkpIHsKLQkJCS8vIFRyeSB0byBjb3B5IHRoZSBzb3VyY2UgZmlsZSB0byB0aGUgZGVzdGluYXRpb24gZmlsZSBhbmQKLQkJCS8vIGRlbGV0ZQotCQkJLy8gdGhlIHNvdXJjZSBmaWxlLgotCQkJY29weWZpbGUoc291cmNlRmlsZSwgZGVzdEZpbGUpOwotCQkJc291cmNlRmlsZS5kZWxldGUoKTsKLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3V0aWxzL0kxOG5VdGlsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3V0aWxzL0kxOG5VdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhZjY2YjguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi91dGlscy9JMThuVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKLWltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLQotLyoqCi0gKiBIZWxwZXIgdXRpbHRpaWVzIGZvciBoYW5kbGluZyBpbnRlcm5hdGlvbmFsaXphdGlvbi4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBJMThuVXRpbCB7Ci0KLQkvKioKLQkgKiBQcml2YXRlIGNvbnN0cnVjdG9yIHRvIHByZXZlbnQgdGhpcyBjbGFzcyBmcm9tIGJlaW5nIGluc3RhbnRpYXRlZC4gQWxsCi0JICogbWV0aG9kcyBpbiB0aGlzIGNsYXNzIHNob3VsZCBiZSBzdGF0aWMuCi0JICovCi0JcHJpdmF0ZSBJMThuVXRpbCgpIHsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBsb2NhbGl6ZWQgc3RyaW5nIGFzc29jaWF0ZWQgd2l0aCBhIHJlc291cmNlIGtleS4KLQkgKiAKLQkgKiBAcGFyYW0gcmVzb3VyY2VCdW5kbGUKLQkgKiAgICAgICAgICAgIEEgcmVzb3VyY2UgYnVuZGxlLgotCSAqIEBwYXJhbSBrZXkKLQkgKiAgICAgICAgICAgIEEgcmVzb3VyY2Uga2V5LgotCSAqIEByZXR1cm4gQSBsb2NhbGl6ZWQgc3RyaW5nLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFN0cmluZyhSZXNvdXJjZUJ1bmRsZSByZXNvdXJjZUJ1bmRsZSwgU3RyaW5nIGtleSkgewotCQlpZiAocmVzb3VyY2VCdW5kbGUgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlyZXR1cm4gcmVzb3VyY2VCdW5kbGUuZ2V0U3RyaW5nKGtleSk7Ci0JCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgewotCQkJfQotCQl9Ci0JCXJldHVybiAnWycgKyBrZXkgKyAnXSc7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbG9jYWxpemVkIHN0cmluZyBhc3NvY2lhdGVkIHdpdGggYSByZXNvdXJjZSBrZXkgYW5kIGZvcm1hdHRlZAotCSAqIHdpdGggYSBnaXZlbiBzdHJpbmcuCi0JICogCi0JICogQHBhcmFtIHJlc291cmNlQnVuZGxlCi0JICogICAgICAgICAgICBBIHJlc291cmNlIGJ1bmRsZS4KLQkgKiBAcGFyYW0ga2V5Ci0JICogICAgICAgICAgICBBIHJlc291cmNlIGtleS4KLQkgKiBAcGFyYW0gZGF0YQotCSAqICAgICAgICAgICAgQW4gb2JqZWN0LgotCSAqIEByZXR1cm4gQSBmb3JtYXR0ZWQgbG9jYWxpemVkIHN0cmluZy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBmb3JtYXRTdHJpbmcoUmVzb3VyY2VCdW5kbGUgcmVzb3VyY2VCdW5kbGUsCi0JCQlTdHJpbmcga2V5LCBPYmplY3QgZGF0YSkgewotCQlpZiAocmVzb3VyY2VCdW5kbGUgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlTdHJpbmcgbG9jYWxpemVkU3RyID0gcmVzb3VyY2VCdW5kbGUuZ2V0U3RyaW5nKGtleSk7Ci0JCQkJcmV0dXJuIE1lc3NhZ2VGb3JtYXQKLQkJCQkJCS5mb3JtYXQobG9jYWxpemVkU3RyLCBuZXcgT2JqZWN0W10geyBkYXRhIH0pOwotCQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKLQkJCX0KLQkJfQotCQlyZXR1cm4gJ1snICsga2V5ICsgJ10nOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGxvY2FsaXplZCBzdHJpbmcgYXNzb2NpYXRlZCB3aXRoIGEgcmVzb3VyY2Uga2V5IGFuZCBmb3JtYXR0ZWQKLQkgKiB3aXRoIHR3byBnaXZlbiBzdHJpbmcuCi0JICogCi0JICogQHBhcmFtIHJlc291cmNlQnVuZGxlCi0JICogICAgICAgICAgICBBIHJlc291cmNlIGJ1bmRsZS4KLQkgKiBAcGFyYW0ga2V5Ci0JICogICAgICAgICAgICBBIHJlc291cmNlIGtleS4KLQkgKiBAcGFyYW0gZGF0YTEKLQkgKiAgICAgICAgICAgIEFuIG9iamVjdC4KLQkgKiBAcGFyYW0gZGF0YTIKLQkgKiAgICAgICAgICAgIEFuIG9iamVjdC4KLQkgKiBAcmV0dXJuIEEgZm9ybWF0dGVkIGxvY2FsaXplZCBzdHJpbmcuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZm9ybWF0U3RyaW5nKFJlc291cmNlQnVuZGxlIHJlc291cmNlQnVuZGxlLAotCQkJU3RyaW5nIGtleSwgT2JqZWN0IGRhdGExLCBPYmplY3QgZGF0YTIpIHsKLQkJaWYgKHJlc291cmNlQnVuZGxlICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJU3RyaW5nIGxvY2FsaXplZFN0ciA9IHJlc291cmNlQnVuZGxlLmdldFN0cmluZyhrZXkpOwotCQkJCXJldHVybiBNZXNzYWdlRm9ybWF0LmZvcm1hdChsb2NhbGl6ZWRTdHIsIG5ldyBPYmplY3RbXSB7IGRhdGExLAotCQkJCQkJZGF0YTIgfSk7Ci0JCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgewotCQkJfQotCQl9Ci0JCXJldHVybiAnWycgKyBrZXkgKyAnXSc7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbG9jYWxpemVkIHN0cmluZyBhc3NvY2lhdGVkIHdpdGggYSByZXNvdXJjZSBrZXkgYW5kIGZvcm1hdHRlZAotCSAqIHdpdGggYSBnaXZlbiBzdHJpbmcuCi0JICogCi0JICogQHBhcmFtIHJlc291cmNlQnVuZGxlCi0JICogICAgICAgICAgICBBIHJlc291cmNlIGJ1bmRsZS4KLQkgKiBAcGFyYW0ga2V5Ci0JICogICAgICAgICAgICBBIHJlc291cmNlIGtleS4KLQkgKiBAcGFyYW0gZGF0YQotCSAqICAgICAgICAgICAgQW4gYXJyYXkgb2Ygb2JqZWN0cy4KLQkgKiBAcmV0dXJuIEEgZm9ybWF0dGVkIGxvY2FsaXplZCBzdHJpbmcuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZm9ybWF0U3RyaW5nKFJlc291cmNlQnVuZGxlIHJlc291cmNlQnVuZGxlLAotCQkJU3RyaW5nIGtleSwgT2JqZWN0W10gZGF0YSkgewotCQlpZiAocmVzb3VyY2VCdW5kbGUgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlTdHJpbmcgbG9jYWxpemVkU3RyID0gcmVzb3VyY2VCdW5kbGUuZ2V0U3RyaW5nKGtleSk7Ci0JCQkJcmV0dXJuIE1lc3NhZ2VGb3JtYXQuZm9ybWF0KGxvY2FsaXplZFN0ciwgZGF0YSk7Ci0JCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgewotCQkJfQotCQl9Ci0JCXJldHVybiAnWycgKyBrZXkgKyAnXSc7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbG9jYWxpemVkIGludGVnZXIgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIGEgcmVzb3VyY2Uga2V5LgotCSAqIAotCSAqIEBwYXJhbSByZXNvdXJjZUJ1bmRsZQotCSAqICAgICAgICAgICAgQSByZXNvdXJjZSBidW5kbGUuCi0JICogQHBhcmFtIGtleQotCSAqICAgICAgICAgICAgQSByZXNvdXJjZSBrZXkuCi0JICogQHBhcmFtIGRlZmF1bHRWYWx1ZQotCSAqICAgICAgICAgICAgVGhlIGRlZmF1bHQgdmFsdWUgdG8gcmV0dXJuIGlmIHRoZSByZXNvdXJjZSBrZXkgY2Fubm90IGJlCi0JICogICAgICAgICAgICBsb2NhdGVkLgotCSAqIEByZXR1cm4gQSBsb2NhbGl6ZWQgaW50ZXJnZXIgdmFsdWUuCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgZ2V0SW50KFN0cmluZyBpbnRTdHJpbmcsCi0JCQlpbnQgZGVmYXVsdFZhbHVlKSB7Ci0JCXRyeSB7Ci0JCQlpZiAoaW50U3RyaW5nICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gSW50ZWdlci5wYXJzZUludChpbnRTdHJpbmcpOwotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQl9Ci0JCXJldHVybiBkZWZhdWx0VmFsdWU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbG9jYWxpemVkIHZlcnNpb24gb2YgYSBVUyBFbmdsaXNoIHJlc291cmNlIGZpbGUuCi0JICogCi0JICogQHBhcmFtIHBhdGgKLQkgKiAgICAgICAgICAgIFRoZSBhYnNvbHV0ZSBwYXRoIHRvIGEgcmVzb3VyY2UgZmlsZS4KLQkgKiBAcGFyYW0gbG9jYWxlCi0JICogICAgICAgICAgICBBIGxvY2FsZS4KLQkgKiBAcmV0dXJuIFRoZSBsb2NhbGl6ZWQgcmVzb3VyY2UgZmlsZS4gSWYgbm9uZSBleGlzdHMsIHJldHVybiBudWxsLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldExvY2FsaXplZEZpbGUoU3RyaW5nIHBhdGgsIExvY2FsZSBsb2NhbGUpIHsKLQkJaWYgKGxvY2FsZS5lcXVhbHMoTG9jYWxlLlVTKSB8fCBwYXRoID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJLy8gQnVpbGQgdGhlIGxvY2FsZSBzdHJpbmcgYXJyYXkuIFRoaXMgaXMgdXNlZCB0byBjb25zdHJ1Y3QgdGhlCi0JCS8vIGxvY2FsaXplZCBmaWxlIG5hbWVzLgotCQlTdHJpbmcgbGFuZ3VhZ2UgPSBsb2NhbGUuZ2V0TGFuZ3VhZ2UoKTsKLQkJU3RyaW5nIGNvdW50cnkgPSBsb2NhbGUuZ2V0Q291bnRyeSgpOwotCQlTdHJpbmcgdmFyaWFudCA9IGxvY2FsZS5nZXRWYXJpYW50KCk7Ci0KLQkJU3RyaW5nW10gbG9jYWxlU3RycyA9IG5ldyBTdHJpbmdbM107Ci0JCWlmICh2YXJpYW50ICE9IG51bGwgJiYgdmFyaWFudC5sZW5ndGgoKSA+IDApIHsKLQkJCWxvY2FsZVN0cnNbMF0gPSBsb2NhbGUudG9TdHJpbmcoKTsKLQkJfQotCQlpZiAoY291bnRyeSAhPSBudWxsICYmIGNvdW50cnkubGVuZ3RoKCkgPiAwKSB7Ci0JCQlsb2NhbGVTdHJzWzFdID0gbGFuZ3VhZ2UgKyAiXyIgKyBjb3VudHJ5OyAvLyROT04tTkxTLTEkCi0JCX0KLQkJaWYgKGxhbmd1YWdlICE9IG51bGwpIHsKLQkJCWxvY2FsZVN0cnNbMl0gPSBsYW5ndWFnZTsKLQkJfQotCi0JCVN0cmluZyBkaXIgPSBwYXRoLnJlcGxhY2UoJ1xcJywgJy8nKTsKLQkJU3RyaW5nIGZpbGVOYW1lOwotCi0JCWludCBwYXRoSW5kZXggPSBkaXIubGFzdEluZGV4T2YoIi8iKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAocGF0aEluZGV4ID4gMCkgewotCQkJZGlyID0gcGF0aC5zdWJzdHJpbmcoMCwgcGF0aEluZGV4ICsgMSk7Ci0JCQlmaWxlTmFtZSA9IHBhdGguc3Vic3RyaW5nKHBhdGhJbmRleCArIDEpOwotCQl9IGVsc2UgewotCQkJZmlsZU5hbWUgPSBkaXI7Ci0JCQlkaXIgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJU3RyaW5nIGZpbGVFeHQgPSAiIjsgLy8kTk9OLU5MUy0xJAkJCi0JCWludCBleHRJbmRleCA9IGZpbGVOYW1lLmxhc3RJbmRleE9mKCIuIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKGV4dEluZGV4ID4gMCkgewotCQkJZmlsZUV4dCA9IGZpbGVOYW1lLnN1YnN0cmluZyhleHRJbmRleCk7Ci0JCQlmaWxlTmFtZSA9IGZpbGVOYW1lLnN1YnN0cmluZygwLCBleHRJbmRleCk7Ci0JCX0KLQotCQlmaWxlTmFtZSA9IGRpciArIGZpbGVOYW1lICsgIl8iOyAvLyROT04tTkxTLTEkCi0KLQkJLy8gTG9vayBmb3IgdGhlIGxvY2FsaXplZCBmaWxlLgotCQlmb3IgKGludCBpID0gMDsgaSA8IDM7IGkrKykgewotCQkJaWYgKGxvY2FsZVN0cnNbaV0gIT0gbnVsbCkgewotCQkJCS8vIEdldHMgdGhlIGxvY2FsaXplZCBwYXRoIG5hbWUuCi0JCQkJU3RyaW5nIGZuYW1lID0gZmlsZU5hbWUgKyBsb2NhbGVTdHJzW2ldICsgZmlsZUV4dDsKLQkJCQlGaWxlIGZpbGUgPSBuZXcgRmlsZShmbmFtZSk7Ci0JCQkJaWYgKGZpbGUuZXhpc3RzKCkpIHsKLQkJCQkJcmV0dXJuIGZuYW1lOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vdXRpbHMvSU1hcmtlckF0dHJpYnV0ZUNvbnRyaWJ1dGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3V0aWxzL0lNYXJrZXJBdHRyaWJ1dGVDb250cmlidXRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDMxMzVhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vdXRpbHMvSU1hcmtlckF0dHJpYnV0ZUNvbnRyaWJ1dGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy9Db3B5cmlnaHQgKGMpIDIwMDUsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vL0FsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vL3doaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vL2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy9Db250cmlidXRvcnM6Ci0vL0lCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOwotCi0vKioKLSogSW50ZXJmYWNlIGZvciBhZGRpbmcgYWRkaXRpb25hbCBhdHRyaWJ1dGVzIHRvIG1hcmtlcnMgCi0qIAotKiBAYXV0aG9yIFdlaXBpbmcgTHUKLSogQHNpbmNlICAxLjUKLSovCi1wdWJsaWMgaW50ZXJmYWNlIElNYXJrZXJBdHRyaWJ1dGVDb250cmlidXRlciB7Ci0KLQl2b2lkIGFkZEFkZHRpb25hbEF0dHJpYnV0ZXMoSU1hcmtlciBtYXJrZXIsIE9iamVjdCBjb250ZXh0KTsKLQkKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vdXRpbHMvSU9iamVjdEZhY3RvcnkuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vdXRpbHMvSU9iamVjdEZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzA4MjExYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3V0aWxzL0lPYmplY3RGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy9Db3B5cmlnaHQgKGMpIDIwMDUsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vL0FsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vL3doaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vL2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy9Db250cmlidXRvcnM6Ci0vL0lCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHM7Ci0KLS8qKgotKiBJbnRlcmZhY2UgdG8gY3JlYXRlIG9iamVjdCBiYXNlZCBvbiB0eXBlIGFuZCBjb250ZXh0IAotKiAKLSogQGF1dGhvciBXZWlwaW5nIEx1Ci0qIEBzaW5jZSAgMS41Ci0qLwotcHVibGljIGludGVyZmFjZSBJT2JqZWN0RmFjdG9yeSB7Ci0KLQlPYmplY3QgY3JlYXRlKENsYXNzIHR5cGUsIE9iamVjdCBjb250ZXh0KTsKLQkJCQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi91dGlscy9JbWFnZVV0aWwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vdXRpbHMvSW1hZ2VVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmNzBiYTUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi91dGlscy9JbWFnZVV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzOwotCi1pbXBvcnQgamF2YS5hd3QuQ29sb3I7Ci1pbXBvcnQgamF2YS5hd3QuQ29tcG9uZW50OwotaW1wb3J0IGphdmEuYXd0LkZvbnQ7Ci1pbXBvcnQgamF2YS5hd3QuR3JhcGhpY3MyRDsKLWltcG9ydCBqYXZhLmF3dC5JbWFnZTsKLWltcG9ydCBqYXZhLmF3dC5NZWRpYVRyYWNrZXI7Ci1pbXBvcnQgamF2YS5hd3QuZm9udC5Gb250UmVuZGVyQ29udGV4dDsKLWltcG9ydCBqYXZhLmF3dC5mb250LkxpbmVCcmVha01lYXN1cmVyOwotaW1wb3J0IGphdmEuYXd0LmZvbnQuVGV4dEF0dHJpYnV0ZTsKLWltcG9ydCBqYXZhLmF3dC5mb250LlRleHRMYXlvdXQ7Ci1pbXBvcnQgamF2YS5hd3QuZ2VvbS5Qb2ludDJEOwotaW1wb3J0IGphdmEuYXd0LmltYWdlLkJ1ZmZlcmVkSW1hZ2U7Ci1pbXBvcnQgamF2YS50ZXh0LkF0dHJpYnV0ZWRDaGFyYWN0ZXJJdGVyYXRvcjsKLWltcG9ydCBqYXZhLnRleHQuQXR0cmlidXRlZFN0cmluZzsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0vKioKLSAqIFV0aWxpdHkgY2xhc3MgZm9yIGNyZWF0aW5nIGltYWdlIGZpbGVzLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEltYWdlVXRpbCB7Ci0KLQkvLyBUaGUgQnVmZmVyZWRJbWFnZSBjYWNoZS4KLQlwcml2YXRlIHN0YXRpYyBIYXNoTWFwPFN0cmluZywgQnVmZmVyZWRJbWFnZT4gaW1hZ2VDYWNoZSA9IG5ldyBIYXNoTWFwPFN0cmluZywgQnVmZmVyZWRJbWFnZT4oKTsKLQotCS8qKgotCSAqIFByaXZhdGUgY29uc3RydWN0b3IgdG8gcHJldmVudCB0aGlzIGNsYXNzIGZyb20gYmVpbmcgaW5zdGFudGlhdGVkLiBBbGwKLQkgKiBtZXRob2RzIGluIHRoaXMgY2xhc3Mgc2hvdWxkIGJlIHN0YXRpYy4KLQkgKi8KLQlwcml2YXRlIEltYWdlVXRpbCgpIHsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgPGNvZGU+QnVmZmVyZWRJbWFnZTwvY29kZT4gZnJvbSB0aGUgZ2l2ZW4gaW1hZ2UgZmlsZS4KLQkgKiAKLQkgKiBAcGFyYW0gaW1hZ2VGaWxlCi0JICogICAgICAgICAgICBhbiBpbWFnZSBmaWxlCi0JICogQHBhcmFtIGMKLQkgKiAgICAgICAgICAgIGFuIEFXVCBjb21wb25lbnQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEJ1ZmZlcmVkSW1hZ2UgZ2V0QnVmZmVyZWRJbWFnZShTdHJpbmcgaW1hZ2VGaWxlLCBDb21wb25lbnQgYykgewotCQlpZiAoaW1hZ2VGaWxlID09IG51bGwgfHwgYyA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCUJ1ZmZlcmVkSW1hZ2UgYnVmZmVyZWRJbWFnZSA9IChCdWZmZXJlZEltYWdlKSBpbWFnZUNhY2hlLmdldChpbWFnZUZpbGUpOwotCQlpZiAoYnVmZmVyZWRJbWFnZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gYnVmZmVyZWRJbWFnZTsKLQkJfQotCi0JCUltYWdlIGltYWdlID0gYy5nZXRUb29sa2l0KCkuZ2V0SW1hZ2UoaW1hZ2VGaWxlKTsKLQkJTWVkaWFUcmFja2VyIHRyYWNrZXIgPSBuZXcgTWVkaWFUcmFja2VyKGMpOwotCQl0cmFja2VyLmFkZEltYWdlKGltYWdlLCAwKTsKLQkJdHJ5IHsKLQkJCXRyYWNrZXIud2FpdEZvckFsbCgpOwotCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQotCQlidWZmZXJlZEltYWdlID0gbmV3IEJ1ZmZlcmVkSW1hZ2UoaW1hZ2UuZ2V0V2lkdGgoYyksCi0JCQkJaW1hZ2UuZ2V0SGVpZ2h0KGMpLCBCdWZmZXJlZEltYWdlLlRZUEVfSU5UX0FSR0IpOwotCi0JCUdyYXBoaWNzMkQgZzJkID0gYnVmZmVyZWRJbWFnZS5jcmVhdGVHcmFwaGljcygpOwotCQlnMmQuZHJhd0ltYWdlKGltYWdlLCAwLCAwLCBjKTsKLQkJaW1hZ2VDYWNoZS5wdXQoaW1hZ2VGaWxlLCBidWZmZXJlZEltYWdlKTsKLQotCQlyZXR1cm4gYnVmZmVyZWRJbWFnZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBnaXZlbiBpbWFnZSBpcyBsb2FkZWQgc3VjY2Vzc2Z1bGx5LgotCSAqIAotCSAqIEBwYXJhbSBpbWFnZQotCSAqICAgICAgICAgICAgYW4gQVdUIGltYWdlCi0JICogQHBhcmFtIGMKLQkgKiAgICAgICAgICAgIGFuIEFXVCBjb21wb25lbnQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gd2FpdEZvckltYWdlKEltYWdlIGltYWdlLCBDb21wb25lbnQgYykgewotCQlNZWRpYVRyYWNrZXIgdHJhY2tlciA9IG5ldyBNZWRpYVRyYWNrZXIoYyk7Ci0JCXRyYWNrZXIuYWRkSW1hZ2UoaW1hZ2UsIDApOwotCQl0cnkgewotCQkJdHJhY2tlci53YWl0Rm9yQWxsKCk7Ci0JCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGllKSB7Ci0JCX0KLQkJcmV0dXJuICghdHJhY2tlci5pc0Vycm9yQW55KCkpOwotCX0KLQotCS8qKgotCSAqIERyYXdzIHRoZSBnaXZlbiB0ZXh0LgotCSAqIAotCSAqIEBwYXJhbSBnMmQKLQkgKiAgICAgICAgICAgIHRoZSA8Y29kZT5HcmFwaGljczJEPC9jb2RlPiBjb250ZXh0Ci0JICogQHBhcmFtIHRleHQKLQkgKiAgICAgICAgICAgIHRoZSB0ZXh0IHRvIGJlIHJlbmRlcmVkCi0JICogQHBhcmFtIGZvbnQKLQkgKiAgICAgICAgICAgIHRoZSBmb250IHVzZWQgZm9yIHJlbmRlcmluZyB0aGUgdGV4dAotCSAqIEBwYXJhbSBjb2xvcgotCSAqICAgICAgICAgICAgdGhlIGNvbG9yIHVzZWQgZm9yIHJlbmRlcmluZyB0aGUgdGV4dAotCSAqIEBwYXJhbSB4Ci0JICogICAgICAgICAgICB0aGUgaG9yaXpvbnRhbCBjb29yZGluYXRlIHVzZWQgZm9yIHJlbmRlcmluZyB0aGUgdGV4dAotCSAqIEBwYXJhbSB5Ci0JICogICAgICAgICAgICB0aGUgdmVydGljYWxjb29yZGluYXRlIHVzZWQgZm9yIHJlbmRlcmluZyB0aGUgdGV4dAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBkcmF3VGV4dChHcmFwaGljczJEIGcyZCwgU3RyaW5nIHRleHQsIEZvbnQgZm9udCwKLQkJCUNvbG9yIGNvbG9yLCBpbnQgeCwgaW50IHkpIHsKLQkJaWYgKHRleHQgPT0gbnVsbCB8fCB0ZXh0Lmxlbmd0aCgpID09IDApIHsKLQkJCXJldHVybjsKLQkJfQotCQlnMmQuc2V0Q29sb3IoY29sb3IpOwotCQlGb250UmVuZGVyQ29udGV4dCBmcmMgPSBnMmQuZ2V0Rm9udFJlbmRlckNvbnRleHQoKTsKLQkJVGV4dExheW91dCB0ZXh0bGF5b3V0ID0gbmV3IFRleHRMYXlvdXQodGV4dCwgZm9udCwgZnJjKTsKLQkJdGV4dGxheW91dC5kcmF3KGcyZCwgeCwgeSk7Ci0JfQotCi0JLyoqCi0JICogRHJhd3MgdGhlIGdpdmVuIHRleHQgYW5kIHdyYXBzIGl0IGJhc2VkIG9uIHRoZSBnaXZlbiB3aWR0aC4KLQkgKiAKLQkgKiBAcGFyYW0gZzJkCi0JICogICAgICAgICAgICB0aGUgPGNvZGU+R3JhcGhpY3MyRDwvY29kZT4gY29udGV4dAotCSAqIEBwYXJhbSB0ZXh0Ci0JICogICAgICAgICAgICB0aGUgdGV4dCB0byBiZSByZW5kZXJlZAotCSAqIEBwYXJhbSBmb250Ci0JICogICAgICAgICAgICB0aGUgZm9udCB1c2VkIGZvciByZW5kZXJpbmcgdGhlIHRleHQKLQkgKiBAcGFyYW0gY29sb3IKLQkgKiAgICAgICAgICAgIHRoZSBjb2xvciB1c2VkIGZvciByZW5kZXJpbmcgdGhlIHRleHQKLQkgKiBAcGFyYW0geAotCSAqICAgICAgICAgICAgdGhlIGhvcml6b250YWwgY29vcmRpbmF0ZSB1c2VkIGZvciByZW5kZXJpbmcgdGhlIHRleHQKLQkgKiBAcGFyYW0geQotCSAqICAgICAgICAgICAgdGhlIHZlcnRpY2FsY29vcmRpbmF0ZSB1c2VkIGZvciByZW5kZXJpbmcgdGhlIHRleHQKLQkgKiBAcGFyYW0gd2lkdGgKLQkgKiAgICAgICAgICAgIHRoZSBtYXhpbXVtIHdpZHRoIHVzZWQgZm9yIHdyYXBwaW5nIHRoZSB0ZXh0Ci0JICogQHBhcmFtIG1heExpbmUKLQkgKiAgICAgICAgICAgIHRoZSBtYXhpbXVtIG51bWJlciBvZiBsaW5lIG9mIHdyYXBwZWQgdGV4dAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBkcmF3VGV4dChHcmFwaGljczJEIGcyZCwgU3RyaW5nIHRleHQsIEZvbnQgZm9udCwKLQkJCUNvbG9yIGNvbG9yLCBpbnQgeCwgaW50IHksIGZsb2F0IHdpZHRoLCBpbnQgbWF4TGluZSkgewotCQlpZiAodGV4dCA9PSBudWxsIHx8IHRleHQubGVuZ3RoKCkgPT0gMCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWZsb2F0IG1heFdyYXBXaWR0aCA9IHdpZHRoIC0gMTA7Ci0JCWcyZC5zZXRDb2xvcihjb2xvcik7Ci0JCVBvaW50MkQuRmxvYXQgcGVuID0gbmV3IFBvaW50MkQuRmxvYXQoeCwgeSk7Ci0JCU1hcDxUZXh0QXR0cmlidXRlLCBGb250PiBhdHRyaWJ1dGVzID0gbmV3IEhhc2hNYXA8VGV4dEF0dHJpYnV0ZSwgRm9udD4oKTsKLQkJYXR0cmlidXRlcy5wdXQoVGV4dEF0dHJpYnV0ZS5GT05ULCBmb250KTsKLQkJQXR0cmlidXRlZENoYXJhY3Rlckl0ZXJhdG9yIHRleHRJdGVyYXRvciA9IG5ldyBBdHRyaWJ1dGVkU3RyaW5nKHRleHQsCi0JCQkJYXR0cmlidXRlcykuZ2V0SXRlcmF0b3IoKTsKLQkJRm9udFJlbmRlckNvbnRleHQgZnJjID0gZzJkLmdldEZvbnRSZW5kZXJDb250ZXh0KCk7Ci0JCUxpbmVCcmVha01lYXN1cmVyIG1lYXN1cmVyID0gbmV3IExpbmVCcmVha01lYXN1cmVyKHRleHRJdGVyYXRvciwgZnJjKTsKLQkJaW50IGxpbmUgPSAxOwotCQl3aGlsZSAobGluZSA8PSBtYXhMaW5lKSB7Ci0JCQlUZXh0TGF5b3V0IGxheW91dCA9IG1lYXN1cmVyLm5leHRMYXlvdXQobWF4V3JhcFdpZHRoKTsKLQkJCWlmIChsYXlvdXQgPT0gbnVsbCkKLQkJCQlicmVhazsKLQkJCXBlbi55ICs9IGxheW91dC5nZXRBc2NlbnQoKTsKLQkJCWZsb2F0IGR4ID0gMDsKLQkJCWlmIChsYXlvdXQuaXNMZWZ0VG9SaWdodCgpKSB7Ci0JCQkJZHggPSAod2lkdGggLSBsYXlvdXQuZ2V0QWR2YW5jZSgpKTsKLQkJCX0KLQkJCWxheW91dC5kcmF3KGcyZCwgcGVuLnggKyBkeCAvIDIsIHBlbi55KTsKLQkJCXBlbi55ICs9IGxheW91dC5nZXREZXNjZW50KCkgKyBsYXlvdXQuZ2V0TGVhZGluZygpIC0gMTsKLQkJCWxpbmUrKzsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi91dGlscy9NYXRoVXRpbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi91dGlscy9NYXRoVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYzA3NGZmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vdXRpbHMvTWF0aFV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHM7Ci0KLS8qKgotICogVXRpbGl0eSBjbGFzcyBmb3IgcGVyZm9ybWluZyBtYXRoIG9wZXJhdGlvbnMuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBNYXRoVXRpbCB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgY2VpbDEwMDAobG9uZyBsKSB7Ci0JCXJldHVybiAobCAtIChsICYgNykpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi91dGlscy9OZXRVdGlsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3V0aWxzL05ldFV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGQyZDE1MC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3V0aWxzL05ldFV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLm5ldC5VUkxEZWNvZGVyOwotCi0vKioKLSAqIEltcGxlbWVudHMgYSB1dGlsaXR5IGNsYXNzIGZvciBtYW5hZ2luZyBVUkxzIGFuZCBVUklzLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIE5ldFV0aWwgewotCi0JLyoqCi0JICogRklMRSBzY2hlbWUuCi0JICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgRklMRV9TQ0hFTUUgPSAiZmlsZSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEZpbGUgVVJJIHByZWZpeC4KLQkgKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBGSUxFX1VSSV9QUkVGSVggPSBGSUxFX1NDSEVNRSArICI6LyI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEZpbGUgVVJJIHByZWZpeCBzaXplLgotCSAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IEZJTEVfVVJJX1BSRUZJWF9MRU5HVEggPSBGSUxFX1VSSV9QUkVGSVgubGVuZ3RoKCk7Ci0KLQkvKioKLQkgKiBIVFRQIHNjaGVtZS4KLQkgKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBIVFRQX1NDSEVNRSA9ICJodHRwIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogSFRUUCBVUkkgcHJlZml4LgotCSAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEhUVFBfVVJJX1BSRUZJWCA9IEhUVFBfU0NIRU1FICsgIjovLyI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEhUVFAgVVJJIHByZWZpeCBzaXplLgotCSAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IEhUVFBfVVJJX1BSRUZJWF9MRU5HVEggPSBIVFRQX1VSSV9QUkVGSVgubGVuZ3RoKCk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGSUxFX1BSRUZJWF8yID0gImZpbGU6Ly8iOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGSUxFX1BSRUZJWF8zID0gImZpbGU6Ly8vIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQSB0YWJsZSBvZiBoZXggdmFsdWVzLgotCSAqLwotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZ1tdIEhFWF9WQUxVRVMgPSB7Ci0JCQkiJTAwIiwgIiUwMSIsICIlMDIiLCAiJTAzIiwgIiUwNCIsICIlMDUiLCAiJTA2IiwgIiUwNyIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQgLy8kTk9OLU5MUy01JCAvLyROT04tTkxTLTYkIC8vJE5PTi1OTFMtNyQgLy8kTk9OLU5MUy04JAotCQkJIiUwOCIsICIlMDkiLCAiJTBBIiwgIiUwQiIsICIlMEMiLCAiJTBEIiwgIiUwRSIsICIlMEYiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkIC8vJE5PTi1OTFMtNSQgLy8kTk9OLU5MUy02JCAvLyROT04tTkxTLTckIC8vJE5PTi1OTFMtOCQKLQkJCSIlMTAiLCAiJTExIiwgIiUxMiIsICIlMTMiLCAiJTE0IiwgIiUxNSIsICIlMTYiLCAiJTE3IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JCAvLyROT04tTkxTLTUkIC8vJE5PTi1OTFMtNiQgLy8kTk9OLU5MUy03JCAvLyROT04tTkxTLTgkCi0JCQkiJTE4IiwgIiUxOSIsICIlMUEiLCAiJTFCIiwgIiUxQyIsICIlMUQiLCAiJTFFIiwgIiUxRiIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQgLy8kTk9OLU5MUy01JCAvLyROT04tTkxTLTYkIC8vJE5PTi1OTFMtNyQgLy8kTk9OLU5MUy04JAotCQkJIiUyMCIsICIlMjEiLCAiJTIyIiwgIiUyMyIsICIlMjQiLCAiJTI1IiwgIiUyNiIsICIlMjciLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkIC8vJE5PTi1OTFMtNSQgLy8kTk9OLU5MUy02JCAvLyROT04tTkxTLTckIC8vJE5PTi1OTFMtOCQKLQkJCSIlMjgiLCAiJTI5IiwgIiUyQSIsICIlMkIiLCAiJTJDIiwgIiUyRCIsICIlMkUiLCAiJTJGIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JCAvLyROT04tTkxTLTUkIC8vJE5PTi1OTFMtNiQgLy8kTk9OLU5MUy03JCAvLyROT04tTkxTLTgkCi0JCQkiJTMwIiwgIiUzMSIsICIlMzIiLCAiJTMzIiwgIiUzNCIsICIlMzUiLCAiJTM2IiwgIiUzNyIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQgLy8kTk9OLU5MUy01JCAvLyROT04tTkxTLTYkIC8vJE5PTi1OTFMtNyQgLy8kTk9OLU5MUy04JAotCQkJIiUzOCIsICIlMzkiLCAiJTNBIiwgIiUzQiIsICIlM0MiLCAiJTNEIiwgIiUzRSIsICIlM0YiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkIC8vJE5PTi1OTFMtNSQgLy8kTk9OLU5MUy02JCAvLyROT04tTkxTLTckIC8vJE5PTi1OTFMtOCQKLQkJCSIlNDAiLCAiJTQxIiwgIiU0MiIsICIlNDMiLCAiJTQ0IiwgIiU0NSIsICIlNDYiLCAiJTQ3IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JCAvLyROT04tTkxTLTUkIC8vJE5PTi1OTFMtNiQgLy8kTk9OLU5MUy03JCAvLyROT04tTkxTLTgkCi0JCQkiJTQ4IiwgIiU0OSIsICIlNEEiLCAiJTRCIiwgIiU0QyIsICIlNEQiLCAiJTRFIiwgIiU0RiIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQgLy8kTk9OLU5MUy01JCAvLyROT04tTkxTLTYkIC8vJE5PTi1OTFMtNyQgLy8kTk9OLU5MUy04JAotCQkJIiU1MCIsICIlNTEiLCAiJTUyIiwgIiU1MyIsICIlNTQiLCAiJTU1IiwgIiU1NiIsICIlNTciLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkIC8vJE5PTi1OTFMtNSQgLy8kTk9OLU5MUy02JCAvLyROT04tTkxTLTckIC8vJE5PTi1OTFMtOCQKLQkJCSIlNTgiLCAiJTU5IiwgIiU1QSIsICIlNUIiLCAiJTVDIiwgIiU1RCIsICIlNUUiLCAiJTVGIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JCAvLyROT04tTkxTLTUkIC8vJE5PTi1OTFMtNiQgLy8kTk9OLU5MUy03JCAvLyROT04tTkxTLTgkCi0JCQkiJTYwIiwgIiU2MSIsICIlNjIiLCAiJTYzIiwgIiU2NCIsICIlNjUiLCAiJTY2IiwgIiU2NyIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQgLy8kTk9OLU5MUy01JCAvLyROT04tTkxTLTYkIC8vJE5PTi1OTFMtNyQgLy8kTk9OLU5MUy04JAotCQkJIiU2OCIsICIlNjkiLCAiJTZBIiwgIiU2QiIsICIlNkMiLCAiJTZEIiwgIiU2RSIsICIlNkYiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkIC8vJE5PTi1OTFMtNSQgLy8kTk9OLU5MUy02JCAvLyROT04tTkxTLTckIC8vJE5PTi1OTFMtOCQKLQkJCSIlNzAiLCAiJTcxIiwgIiU3MiIsICIlNzMiLCAiJTc0IiwgIiU3NSIsICIlNzYiLCAiJTc3IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JCAvLyROT04tTkxTLTUkIC8vJE5PTi1OTFMtNiQgLy8kTk9OLU5MUy03JCAvLyROT04tTkxTLTgkCi0JCQkiJTc4IiwgIiU3OSIsICIlN0EiLCAiJTdCIiwgIiU3QyIsICIlN0QiLCAiJTdFIiwgIiU3RiIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQgLy8kTk9OLU5MUy01JCAvLyROT04tTkxTLTYkIC8vJE5PTi1OTFMtNyQgLy8kTk9OLU5MUy04JAotCQkJIiU4MCIsICIlODEiLCAiJTgyIiwgIiU4MyIsICIlODQiLCAiJTg1IiwgIiU4NiIsICIlODciLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkIC8vJE5PTi1OTFMtNSQgLy8kTk9OLU5MUy02JCAvLyROT04tTkxTLTckIC8vJE5PTi1OTFMtOCQKLQkJCSIlODgiLCAiJTg5IiwgIiU4QSIsICIlOEIiLCAiJThDIiwgIiU4RCIsICIlOEUiLCAiJThGIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JCAvLyROT04tTkxTLTUkIC8vJE5PTi1OTFMtNiQgLy8kTk9OLU5MUy03JCAvLyROT04tTkxTLTgkCi0JCQkiJTkwIiwgIiU5MSIsICIlOTIiLCAiJTkzIiwgIiU5NCIsICIlOTUiLCAiJTk2IiwgIiU5NyIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQgLy8kTk9OLU5MUy01JCAvLyROT04tTkxTLTYkIC8vJE5PTi1OTFMtNyQgLy8kTk9OLU5MUy04JAotCQkJIiU5OCIsICIlOTkiLCAiJTlBIiwgIiU5QiIsICIlOUMiLCAiJTlEIiwgIiU5RSIsICIlOUYiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkIC8vJE5PTi1OTFMtNSQgLy8kTk9OLU5MUy02JCAvLyROT04tTkxTLTckIC8vJE5PTi1OTFMtOCQKLQkJCSIlQTAiLCAiJUExIiwgIiVBMiIsICIlQTMiLCAiJUE0IiwgIiVBNSIsICIlQTYiLCAiJUE3IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JCAvLyROT04tTkxTLTUkIC8vJE5PTi1OTFMtNiQgLy8kTk9OLU5MUy03JCAvLyROT04tTkxTLTgkCi0JCQkiJUE4IiwgIiVBOSIsICIlQUEiLCAiJUFCIiwgIiVBQyIsICIlQUQiLCAiJUFFIiwgIiVBRiIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQgLy8kTk9OLU5MUy01JCAvLyROT04tTkxTLTYkIC8vJE5PTi1OTFMtNyQgLy8kTk9OLU5MUy04JAotCQkJIiVCMCIsICIlQjEiLCAiJUIyIiwgIiVCMyIsICIlQjQiLCAiJUI1IiwgIiVCNiIsICIlQjciLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkIC8vJE5PTi1OTFMtNSQgLy8kTk9OLU5MUy02JCAvLyROT04tTkxTLTckIC8vJE5PTi1OTFMtOCQKLQkJCSIlQjgiLCAiJUI5IiwgIiVCQSIsICIlQkIiLCAiJUJDIiwgIiVCRCIsICIlQkUiLCAiJUJGIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JCAvLyROT04tTkxTLTUkIC8vJE5PTi1OTFMtNiQgLy8kTk9OLU5MUy03JCAvLyROT04tTkxTLTgkCi0JCQkiJUMwIiwgIiVDMSIsICIlQzIiLCAiJUMzIiwgIiVDNCIsICIlQzUiLCAiJUM2IiwgIiVDNyIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQgLy8kTk9OLU5MUy01JCAvLyROT04tTkxTLTYkIC8vJE5PTi1OTFMtNyQgLy8kTk9OLU5MUy04JAotCQkJIiVDOCIsICIlQzkiLCAiJUNBIiwgIiVDQiIsICIlQ0MiLCAiJUNEIiwgIiVDRSIsICIlQ0YiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkIC8vJE5PTi1OTFMtNSQgLy8kTk9OLU5MUy02JCAvLyROT04tTkxTLTckIC8vJE5PTi1OTFMtOCQKLQkJCSIlRDAiLCAiJUQxIiwgIiVEMiIsICIlRDMiLCAiJUQ0IiwgIiVENSIsICIlRDYiLCAiJUQ3IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JCAvLyROT04tTkxTLTUkIC8vJE5PTi1OTFMtNiQgLy8kTk9OLU5MUy03JCAvLyROT04tTkxTLTgkCi0JCQkiJUQ4IiwgIiVEOSIsICIlREEiLCAiJURCIiwgIiVEQyIsICIlREQiLCAiJURFIiwgIiVERiIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQgLy8kTk9OLU5MUy01JCAvLyROT04tTkxTLTYkIC8vJE5PTi1OTFMtNyQgLy8kTk9OLU5MUy04JAotCQkJIiVFMCIsICIlRTEiLCAiJUUyIiwgIiVFMyIsICIlRTQiLCAiJUU1IiwgIiVFNiIsICIlRTciLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkIC8vJE5PTi1OTFMtNSQgLy8kTk9OLU5MUy02JCAvLyROT04tTkxTLTckIC8vJE5PTi1OTFMtOCQKLQkJCSIlRTgiLCAiJUU5IiwgIiVFQSIsICIlRUIiLCAiJUVDIiwgIiVFRCIsICIlRUUiLCAiJUVGIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JCAvLyROT04tTkxTLTUkIC8vJE5PTi1OTFMtNiQgLy8kTk9OLU5MUy03JCAvLyROT04tTkxTLTgkCi0JCQkiJUYwIiwgIiVGMSIsICIlRjIiLCAiJUYzIiwgIiVGNCIsICIlRjUiLCAiJUY2IiwgIiVGNyIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQgLy8kTk9OLU5MUy01JCAvLyROT04tTkxTLTYkIC8vJE5PTi1OTFMtNyQgLy8kTk9OLU5MUy04JAotCQkJIiVGOCIsICIlRjkiLCAiJUZBIiwgIiVGQiIsICIlRkMiLCAiJUZEIiwgIiVGRSIsICIlRkYiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQgLy8kTk9OLU5MUy01JCAvLyROT04tTkxTLTYkIC8vJE5PTi1OTFMtNyQgLy8kTk9OLU5MUy04JAotCX07Ci0KLQkvKioKLQkgKiBQcml2YXRlIGNvbnN0cnVjdG9yIHRvIHByZXZlbnQgdGhpcyBjbGFzcyBmcm9tIGJlaW5nIGluc3RhbnRpYXRlZC4gQWxsCi0JICogbWV0aG9kcyBpbiB0aGlzIGNsYXNzIHNob3VsZCBiZSBzdGF0aWMuCi0JICovCi0JcHJpdmF0ZSBOZXRVdGlsKCkgewotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIFVSSSBmb3IgdGhlIGdpdmVuIGZpbGUuCi0JICogCi0JICogQHBhcmFtIGZpbGUKLQkgKiAgICAgICAgICAgIFRoZSBpbnB1dCBmaWxlLgotCSAqIEByZXR1cm4gVGhlIFVSSSBmb3IgdGhlIGdpdmVuIGZpbGUuCi0JICogQHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1ciB3aGlsZSBjb25zdHJ1Y3RpbmcgdGhlIFVSSSBmb3IgdGhlIGdpdmVuCi0JICogICAgICAgICAgICAgZmlsZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRVcmkoRmlsZSBmaWxlKSB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uIHsKLQkJU3RyaW5nIHVybCA9IGZpbGUudG9VUkwoKS50b0V4dGVybmFsRm9ybSgpOwotCQlTdHJpbmdCdWZmZXIgc3RyQnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlpbnQgdXJsTGVuZ3RoID0gdXJsLmxlbmd0aCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHVybExlbmd0aDsgaSsrKSB7Ci0JCQljaGFyIGNoID0gdXJsLmNoYXJBdChpKTsKLQkJCXN3aXRjaCAoY2gpIHsKLQkJCWNhc2UgJyAnOgotCQkJCXN0ckJ1Zi5hcHBlbmQoIiUyMCIpOyAvLyROT04tTkxTLTEkCi0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0OgotCQkJCXN0ckJ1Zi5hcHBlbmQoY2gpOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCXJldHVybiBzdHJCdWYudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXNvbHZlcyB0aGUgZ2l2ZW4gVVJJIHVzaW5nIHRoZSBnaXZlbiB0aGUgYmFzZSBVUkkuCi0JICogCi0JICogQHBhcmFtIHVyaQotCSAqICAgICAgICAgICAgVGhlIFVSSSB0byByZXNvbHZlLgotCSAqIEBwYXJhbSBiYXNlVXJpCi0JICogICAgICAgICAgICBUaGUgYmFzZSBVUkkuCi0JICogQHJldHVybiBBIGZ1bGx5IGZvcm1lZCBVUkkuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVzb2x2ZVVyaShTdHJpbmcgdXJpLCBTdHJpbmcgYmFzZVVyaSkgewotCQlpZiAodXJpID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJaWYgKHVyaS5zdGFydHNXaXRoKCIuLi8iKSkgeyAvLyROT04tTkxTLTEkCi0JCQlpZiAoYmFzZVVyaS5lbmRzV2l0aCgiLyIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQliYXNlVXJpID0gYmFzZVVyaS5zdWJzdHJpbmcoMCwgYmFzZVVyaS5sZW5ndGgoKSAtIDEpOwotCQkJfQotCQkJd2hpbGUgKHVyaS5zdGFydHNXaXRoKCIuLi8iKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJdXJpID0gdXJpLnN1YnN0cmluZygzKTsKLQkJCQlpbnQgaW5kZXggPSBiYXNlVXJpLmxhc3RJbmRleE9mKCcvJyk7Ci0JCQkJaWYgKGluZGV4ID4gMCkgewotCQkJCQliYXNlVXJpID0gYmFzZVVyaS5zdWJzdHJpbmcoMCwgaW5kZXgpOwotCQkJCX0KLQkJCX0KLQkJCXVyaSA9ICIvIiArIHVyaTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJaWYgKHVyaS5zdGFydHNXaXRoKCIvIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIGJhc2VVcmkuZW5kc1dpdGgoIi8iKSAvLyROT04tTkxTLTEkCi0JCQkJCT8gYmFzZVVyaSArIHVyaS5zdWJzdHJpbmcoMSkgOiBiYXNlVXJpICsgdXJpOwotCQl9Ci0KLQkJaWYgKHVyaS5zdGFydHNXaXRoKEZJTEVfVVJJX1BSRUZJWCkgfHwgdXJpLnN0YXJ0c1dpdGgoSFRUUF9VUklfUFJFRklYKSkgewotCQkJcmV0dXJuIHVyaTsKLQkJfQotCi0JCXJldHVybiBiYXNlVXJpLmVuZHNXaXRoKCIvIikgPyBiYXNlVXJpICsgdXJpIDogYmFzZVVyaSArICcvJyArIHVyaTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGlucHV0IHN0cmVhbSBmb3IgdGhlIGdpdmVuIFVSSS4KLQkgKiAKLQkgKiBAcGFyYW0gdXJpCi0JICogICAgICAgICAgICBUaGUgc291cmNlIFVSSS4KLQkgKiBAcmV0dXJuIFRoZSBpbnB1dCBzdHJlYW0gZm9yIHRoZSBnaXZlbiBVUkkuCi0JICogQHRocm93IE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBpZiBhIGdpdmVuIFhNTCBkb2N1bWVudCBVUkkgaXMgaW52YWxpZC4KLQkgKiBAdGhyb3cgSU9FeGNlcHRpb24gaWYgYW4gSS9PIGVycm9yIG9jY3VyIHdoaWxlIGFjY2Vzc2luZyB0aGUgVVJJLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSW5wdXRTdHJlYW0gZ2V0SW5wdXRTdHJlYW0oU3RyaW5nIHVyaSkKLQkJCXRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLQkJaWYgKHVyaSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCWlmICh1cmkuc3RhcnRzV2l0aChIVFRQX1VSSV9QUkVGSVgpKSB7Ci0JCQlVUkwgdXJsID0gbmV3IFVSTCh1cmkpOwotCQkJcmV0dXJuIHVybC5vcGVuU3RyZWFtKCk7Ci0JCX0gZWxzZSBpZiAodXJpLnN0YXJ0c1dpdGgoRklMRV9VUklfUFJFRklYKSkgewotCQkJdXJpID0gdXJpLnN1YnN0cmluZyhGSUxFX1VSSV9QUkVGSVhfTEVOR1RIKTsKLQkJfQotCi0JCXJldHVybiBuZXcgRmlsZUlucHV0U3RyZWFtKE5ldFV0aWwuZGVjb2RlVXJsKHVyaSwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIEphdmEgc3RyaW5nIHJlcHJlc2VudGlvbiAoZW5jb2RlZCBpbiBVVEYtMTYpIG9mIHRoZSBnaXZlbiBVUkwKLQkgKiAoZW5jb2RlZCBpbiB0aGUgZ2l2ZW4gZW5jb2RpbmcgYW5kIEFTQ0lJLWVzY2FwZWQpLgotCSAqIAotCSAqIEBwYXJhbSB1cmwKLQkgKiAgICAgICAgICAgIFRoZSBVUkwgdG8gZGVjb2RlLgotCSAqIEBwYXJhbSBlbmNvZGluZwotCSAqICAgICAgICAgICAgVGhlIGVuY29kaW5nIG9mIHRoZSBVUkwuCi0JICogQHJldHVybiBUaGUgSmF2YSBVVEYtMTYgc3RyaW5nIHJlc3ByZXNlbnRhdGlvbi4KLQkgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIGlmIHRoZSBnaXZlbiBVUkwgY29udGFpbiBpbXByb3Blcmx5IGVzY2FwZWQgY2hhcmFjdGVycy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkZWNvZGVVcmwoU3RyaW5nIHVybCwgU3RyaW5nIGVuY29kaW5nKSB7Ci0JCWlmICh1cmwgPT0gbnVsbCkgewotCQkJcmV0dXJuIHVybDsKLQkJfQotCQkKLQkJaW50IGxlbiA9IHVybC5sZW5ndGgoKTsKLQkJaWYgKGxlbiA9PSAwKSB7Ci0JCQlyZXR1cm4gdXJsOwotCQl9Ci0KLQkJLy8gVW5lc2NhcGUgdGhlIHVybC4KLQkJU3RyaW5nQnVmZmVyIHN0ckJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgewotCQkJY2hhciBjaCA9IHVybC5jaGFyQXQoaSk7Ci0JCQlzd2l0Y2ggKGNoKSB7Ci0JCQljYXNlICcrJzoKLQkJCQlzdHJCdWYuYXBwZW5kKCcgJyk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlICclJzoKLQkJCQl0cnkgewotCQkJCQlzdHJCdWYuYXBwZW5kKChjaGFyKSBJbnRlZ2VyLnBhcnNlSW50KHVybC5zdWJzdHJpbmcoaSArIDEsCi0JCQkJCQkJaSArIDMpLCAxNikpOwotCQkJCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLQkJCQl9Ci0JCQkJaSArPSAyOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCQlzdHJCdWYuYXBwZW5kKGNoKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCi0JCS8vIENvbnZlcnQgdGhlIHVuLWVzY2FwZWQgYnl0ZSB2YWx1ZXMgdG8gSmF2YSBVVEYtMTYgc3RyaW5nLgotCQlTdHJpbmcgcmVzdWx0ID0gc3RyQnVmLnRvU3RyaW5nKCk7Ci0JCWlmIChlbmNvZGluZyAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCWJ5dGVbXSBieXRlcyA9IHJlc3VsdC5nZXRCeXRlcygiODg1OV8xIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlyZXN1bHQgPSBuZXcgU3RyaW5nKGJ5dGVzLCBlbmNvZGluZyk7Ci0JCQl9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUpIHsKLQkJCX0KLQkJfQotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgQVNDSUktZXNjYXBlZCByZXByZXNlbnRhdGlvbiAoZW5jb2RlZCBpbiB0aGUgc3BlY2lmaWVkCi0JICogZW5jb2RpbmcpIG9mIHRoZSBnaXZlbiBVUkwgKGVuY29kZWQgaW4gVVRGLTE2KS4KLQkgKiAKLQkgKiBAcGFyYW0gdXJsCi0JICogICAgICAgICAgICBUaGUgVVJMIHRvIGVuY29kZS4KLQkgKiBAcGFyYW0gZW5jb2RpbmcKLQkgKiAgICAgICAgICAgIFRoZSBlbmNvZGluZyBvZiB0aGUgVVJMLgotCSAqIEByZXR1cm4gdGhlIEFTQ0lJLWVzY2FwZWQgcmVzcHJlc2VudGF0aW9uLgotCSAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCi0JICogICAgICAgICAgICAgaWYgdGhlIGdpdmVuIFVSTCBjb250YWluIGltcHJvcGVybHkgZXNjYXBlZCBjaGFyYWN0ZXJzLgotCSAqIEB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIGlmIHRoZSBnaXZlbiBjb2RpbmcgaXMgdW5zdXBwb3J0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVuY29kZVVybChTdHJpbmcgdXJsLCBTdHJpbmcgZW5jb2RpbmcpCi0JCQl0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiB7Ci0JCWlmICh1cmwgPT0gbnVsbCkgewotCQkJcmV0dXJuIHVybDsKLQkJfQkJCi0JCWludCBsZW4gPSB1cmwubGVuZ3RoKCk7Ci0JCWlmIChsZW4gPT0gMCkgewotCQkJcmV0dXJuIHVybDsKLQkJfQotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0KLQkJYnl0ZVtdIGJ5dGVzID0gdXJsLmdldEJ5dGVzKGVuY29kaW5nKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBieXRlcy5sZW5ndGg7IGkrKykgewotCQkJY2hhciBjaCA9IChjaGFyKSBieXRlc1tpXTsKLQotCQkJaWYgKGNoID49ICdhJyAmJiBjaCA8PSAneicpIHsKLQkJCQlyZXN1bHQuYXBwZW5kKGNoKTsKLQkJCX0gZWxzZSBpZiAoY2ggPj0gJ0EnICYmIGNoIDw9ICdaJykgewotCQkJCXJlc3VsdC5hcHBlbmQoY2gpOwotCQkJfSBlbHNlIGlmIChjaCA+PSAnMCcgJiYgY2ggPD0gJzknKSB7Ci0JCQkJcmVzdWx0LmFwcGVuZChjaCk7Ci0JCQl9IGVsc2UgewotCQkJCXN3aXRjaCAoY2gpIHsKLQkJCQljYXNlICctJzoKLQkJCQljYXNlICdfJzoKLQkJCQljYXNlICcuJzoKLQkJCQljYXNlICchJzoKLQkJCQljYXNlICd+JzoKLQkJCQljYXNlICcqJzoKLQkJCQljYXNlICdcJyc6Ci0JCQkJY2FzZSAnKCc6Ci0JCQkJY2FzZSAnKSc6Ci0JCQkJCXJlc3VsdC5hcHBlbmQoY2gpOwotCQkJCQlicmVhazsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXN1bHQuYXBwZW5kKEhFWF9WQUxVRVNbY2ggJiAweEZGXSk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBBU0NJSS1lc2NhcGVkIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBnaXZlbiBmaWxlIFVSTC4KLQkgKiAKLQkgKiBAcGFyYW0gZmlsZVVSTAotCSAqICAgICAgICAgICAgVGhlIGZpbGUgVVJMIHRvIGVuY29kZS4KLQkgKiBAcmV0dXJuIHRoZSBBU0NJSS1lc2NhcGVkIHJlc3ByZXNlbnRhdGlvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlbmNvZGVGaWxlVVJMKFN0cmluZyBmaWxlVVJMKSB7Ci0JCVN0cmluZyB1cmwgPSBmaWxlVVJMOwotCQlTdHJpbmdCdWZmZXIgc3RyQnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlpbnQgdXJsTGVuZ3RoID0gdXJsLmxlbmd0aCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHVybExlbmd0aDsgaSsrKSB7Ci0JCQljaGFyIGNoID0gdXJsLmNoYXJBdChpKTsKLQkJCXN3aXRjaCAoY2gpIHsKLQkJCWNhc2UgJyAnOgotCQkJCXN0ckJ1Zi5hcHBlbmQoIiUyMCIpOyAvLyROT04tTkxTLTEkCi0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0OgotCQkJCXN0ckJ1Zi5hcHBlbmQoY2gpOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCXJldHVybiBzdHJCdWYudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBBU0NJSS1lc2NhcGVkIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBnaXZlbiBmaWxlIFVSTC4KLQkgKiAKLQkgKiBAcGFyYW0gZmlsZVVSTAotCSAqICAgICAgICAgICAgVGhlIGZpbGUgVVJMIHRvIGVuY29kZS4KLQkgKiBAcmV0dXJuIHRoZSBBU0NJSS1lc2NhcGVkIHJlc3ByZXNlbnRhdGlvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkZWNvZGVkRmlsZVVybChTdHJpbmcgZmlsZVVSTCkgewotCQlTdHJpbmcgdXJsID0gZmlsZVVSTDsKLQkJU3RyaW5nQnVmZmVyIHN0ckJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJaW50IHVybExlbmd0aCA9IHVybC5sZW5ndGgoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB1cmxMZW5ndGg7IGkrKykgewotCQkJY2hhciBjaCA9IHVybC5jaGFyQXQoaSk7Ci0JCQlzd2l0Y2ggKGNoKSB7Ci0JCQljYXNlICclJzoKLQkJCQl0cnkgewotCQkJCQlzdHJCdWYuYXBwZW5kKChjaGFyKSBJbnRlZ2VyLnBhcnNlSW50KHVybC5zdWJzdHJpbmcoaSArIDEsCi0JCQkJCQkJaSArIDMpLCAxNikpOwotCQkJCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLQkJCQl9Ci0JCQkJaSArPSAyOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCQlzdHJCdWYuYXBwZW5kKGNoKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3RyQnVmLnRvU3RyaW5nKCk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRlY29kZVVSTCAoU3RyaW5nIHVybCkgdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gewotLy8JCXVybCA9IHVybC5yZXBsYWNlQWxsKCJcXCsiLCAiJTJCIik7IC8vJE5PTi1OTFMtMSQKLQkJdXJsID0gVVJMRGVjb2Rlci5kZWNvZGUodXJsLCAiVVRGLTgiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gdXJsOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vdXRpbHMvUHJvZmlsaW5nVXRpbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi91dGlscy9Qcm9maWxpbmdVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiMjlhY2IuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi91dGlscy9Qcm9maWxpbmdVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzOwotCi1pbXBvcnQgamF2YS5pby5QcmludFN0cmVhbTsKLQotCi0vKioKLSAqIFV0aWxpdHkgY2xhc3MgZm9yIHByb2ZpbGluZwotICogCi0gKiBAYXV0aG9yIFdlaXBpbmcgTHUKLSAqIEBzaW5jZSAxLjAKLSAqLwotCi1wdWJsaWMgY2xhc3MgUHJvZmlsaW5nVXRpbCB7Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gdHJhY2VGb290cHJpbnQgPSBmYWxzZTsKLQkKLQlwcml2YXRlIHN0YXRpYyBQcmludFN0cmVhbSBvdXRwdXQgPSBTeXN0ZW0ub3V0OwotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRPdXRwdXQoUHJpbnRTdHJlYW0gcHMpIHsKLQkJb3V0cHV0ID0gcHM7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBmdWxsR0MoKSB7Ci0JCVJ1bnRpbWUgcnQgPSBSdW50aW1lLmdldFJ1bnRpbWUoKTsKLQkJbG9uZyBpc0ZyZWUgPSBydC5mcmVlTWVtb3J5KCk7Ci0JCWxvbmcgd2FzRnJlZTsKLQkJZG8gewotCQkJd2FzRnJlZSA9IGlzRnJlZTsKLQkJCXJ0LnJ1bkZpbmFsaXphdGlvbigpOwotCQkJcnQuZ2MoKTsKLQkJCWlzRnJlZSA9IHJ0LmZyZWVNZW1vcnkoKTsKLQkJfSB3aGlsZSAoaXNGcmVlID4gd2FzRnJlZSk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgbG9uZyB0cmFjZVVzZWRNZW1vcnkoU3RyaW5nIGxvY2F0aW9uKSB7Ci0JCVJ1bnRpbWUgcnQgPSBSdW50aW1lLmdldFJ1bnRpbWUoKTsKLQkJbG9uZyB1c2VkTWVtID0gcnQudG90YWxNZW1vcnkoKSAtIHJ0LmZyZWVNZW1vcnkoKTsKLQkJb3V0cHV0LnByaW50bG4oIkZvb3RwcmludD4gIiArIGxvY2F0aW9uICsgIjogIiArIHVzZWRNZW0vMTAwMCArICIgSyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAkKLQkJCQkJCQkJCQkKLQkJcmV0dXJuIHVzZWRNZW07Ci0JfQotCi0JcHVibGljIHN0YXRpYyBsb25nIHRyYWNlVXNlZE1lbW9yeURpZmYoU3RyaW5nIGxvY2F0aW9uSW5mbywgbG9uZyBjdXJyVXNlZCwgbG9uZyBQcmV2VXNlZCkgewotCQlsb25nIGRpZmYgPSBjdXJyVXNlZCAtIFByZXZVc2VkOwotCQlvdXRwdXQucHJpbnRsbigiRm9vdHByaW50PiBEaWZmLCAiICsgbG9jYXRpb25JbmZvICsgIjogIiArIGRpZmYvMTAwMCArICIgS1xuIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQkJCQkJCi0JCXJldHVybiBkaWZmOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vdXRpbHMvUmVzdGFydGFibGVKb2IuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vdXRpbHMvUmVzdGFydGFibGVKb2IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjY2ZmFkMS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3V0aWxzL1Jlc3RhcnRhYmxlSm9iLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlsczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iOwotCi0vKioKLSAqIEpvYiBjbGFzcyB0aGF0IGlzIHJlLXN0YXJ0YWJsZQotICogCi0gKiBAYXV0aG9yIFdlaXBpbmcgTHUKLSAqIEBzaW5jZSAxLjUKLSAqLwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgUmVzdGFydGFibGVKb2IgZXh0ZW5kcyBKb2IgewotCQotCXByb3RlY3RlZCBzdGF0aWMgYm9vbGVhbiBsb2NhbERlYnVnID0gZmFsc2U7Ci0JCi0JcHJpdmF0ZSBib29sZWFuIHRvUmVzdGFydCA9IHRydWU7Ci0JcHJpdmF0ZSBib29sZWFuIHNjaGVkdWxpbmdMb2NrZWQgPSBmYWxzZTsKLQlwcml2YXRlIGJvb2xlYW4gZW5hYmxlZCA9IHRydWU7Ci0JCi0JcHVibGljIFJlc3RhcnRhYmxlSm9iKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgdm9pZCBndWFyZGVkU2NoZWR1bGUobG9uZyBkZWxheSkgewotCQlndWFyZGVkU2NoZWR1bGUoZGVsYXksIGZhbHNlKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGd1YXJkZWRTY2hlZHVsZShsb25nIGRlbGF5LCBib29sZWFuIGluUnVuQ2FsbCkgewotCQlpZiAoICEgaXNFbmFibGVkKCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAoIWluUnVuQ2FsbCAmJiBnZXRTdGF0ZSgpICE9IEpvYi5OT05FKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKGlzU2NoZWR1bGluZ0xvY2tlZCgpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKGxvY2FsRGVidWcpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTEQ+IGd1YXJkZWRTY2hlZHVsZSBjb21wbGV0ZWQiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXNldFNjaGVkdWxpbmdMb2NrZWQodHJ1ZSk7Ci0JCXNjaGVkdWxlKGRlbGF5KTsJCQotCX0KLQkKLQlwcm90ZWN0ZWQgZmluYWwgSVN0YXR1cyBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCWlmIChsb2NhbERlYnVnKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxEPiBSZXN0YXJ0YWJsZUpvYi5ydW4iKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXNldFNjaGVkdWxpbmdMb2NrZWQoZmFsc2UpOwotCQlzZXRUb1Jlc3RhcnQoZmFsc2UpOwotCQlJU3RhdHVzIHN0YXR1cyA9IFN0YXR1cy5PS19TVEFUVVM7IAotCQl0cnkgewotCQkJc3RhdHVzID0gcmVzdGFydGFibGVSdW4obW9uaXRvcik7Ci0JCX0gY2F0Y2ggKFJlc3RhcnRJbnRlcnJ1cHRFeGNlcHRpb24gZSkgewotCQkJZ3VhcmRlZFNjaGVkdWxlKGUuZ2V0RGVsYXkoKSwgdHJ1ZSk7Ci0JCX0KLQkJCi0JCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCX0KLQkKLQlwcm90ZWN0ZWQgYWJzdHJhY3QgSVN0YXR1cyByZXN0YXJ0YWJsZVJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBSZXN0YXJ0SW50ZXJydXB0RXhjZXB0aW9uOwotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIHJlc2V0VG9SZXN0YXJ0KCk7Ci0KLQlwcml2YXRlIHN5bmNocm9uaXplZCBib29sZWFuIGlzU2NoZWR1bGluZ0xvY2tlZCgpIHsKLQkJcmV0dXJuIHNjaGVkdWxpbmdMb2NrZWQ7Ci0JfQotCi0JcHJpdmF0ZSBzeW5jaHJvbml6ZWQgdm9pZCBzZXRTY2hlZHVsaW5nTG9ja2VkKGJvb2xlYW4gc2NoZWR1bGluZ0xvY2tlZCkgewotCQl0aGlzLnNjaGVkdWxpbmdMb2NrZWQgPSBzY2hlZHVsaW5nTG9ja2VkOwotCX0KLQotCXByaXZhdGUgc3luY2hyb25pemVkIGJvb2xlYW4gaXNUb1Jlc3RhcnQoKSB7Ci0JCXJldHVybiB0b1Jlc3RhcnQ7Ci0JfQotCi0JcHJpdmF0ZSBzeW5jaHJvbml6ZWQgdm9pZCBzZXRUb1Jlc3RhcnQoYm9vbGVhbiB0b1Jlc3RhcnQpIHsKLQkJdGhpcy50b1Jlc3RhcnQgPSB0b1Jlc3RhcnQ7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGVuYWJsZVRvUmVzdGFydCgpIHsKLQkJc2V0VG9SZXN0YXJ0KHRydWUpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBjaGVja1Jlc3RhcnRJbnRlcnJ1cHRFeGNlcHRpb24obG9uZyBkZWxheSkgdGhyb3dzIFJlc3RhcnRJbnRlcnJ1cHRFeGNlcHRpb24gewotCQlpZiAoaXNUb1Jlc3RhcnQoKSkgewotCQkJcmVzZXRUb1Jlc3RhcnQoKTsKLQkJCXRocm93IG5ldyBSZXN0YXJ0SW50ZXJydXB0RXhjZXB0aW9uKGRlbGF5KTsKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgY2xhc3MgUmVzdGFydEludGVycnVwdEV4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbiB7Ci0JCXByaXZhdGUgbG9uZyBkZWxheSA9IDA7Ci0JCXB1YmxpYyBSZXN0YXJ0SW50ZXJydXB0RXhjZXB0aW9uKGxvbmcgZGVsYXkpIHsKLQkJCXRoaXMuZGVsYXkgPSBkZWxheTsKLQkJfQotCQkKLQkJcHVibGljIGxvbmcgZ2V0RGVsYXkoKSB7Ci0JCQlyZXR1cm4gZGVsYXk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gaXNFbmFibGVkKCkgewotCQlyZXR1cm4gZW5hYmxlZDsKLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc2V0RW5hYmxlZChib29sZWFuIGVuYWJsZWQpIHsKLQkJdGhpcy5lbmFibGVkID0gZW5hYmxlZDsKLQl9CQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3V0aWxzL1N0clV0aWwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vdXRpbHMvU3RyVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhODQwMjcxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vdXRpbHMvU3RyVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHM7Ci0KLWltcG9ydCBqYXZhLm5ldC5VUkk7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24uQ29tbW9uUGx1Z2luOwotCi1pbXBvcnQgY29tLmlibS5pY3UubGFuZy5VQ2hhcmFjdGVyOwotaW1wb3J0IGNvbS5pYm0uaWN1LnV0aWwuU3RyaW5nVG9rZW5pemVyOwotCi0vKioKLSAqIEEgaGVscGVyIGNsYXNzIGZvciBtYW51aXB1bGF0aW5nIHN0cmluZ3MuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFN0clV0aWwgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVNUFRZX1NUUklORyA9ICIiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUIgPSAiXHQiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVHRVhQX0FOWV9TUEVDSUFMX0NIQVJTID0gIihgfH58IXxAfCN8XFwkfCV8XFxefCZ8XFwqfFxcKHxcXCl8XFwrfD18XFxbfFxcXXxcXHx8XFw6fFwifDx8PnxcXD98L3wnfFxcc3xcXFxcKSsiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVHRVhQX0lOVkFMSURfUFVCTElTSEVEX1BBVEhfQ0hBUlMgPSAiKFxcW3wjfFxcKnxcXD98XCJ8PHw+fFxcfHwhfCV8L3xcXF0pKyI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRUdFWFBfSU5WQUxJRF9QVUJMSVNIRURfUEFUSF9DSEFSU19MSU5VWCA9ICIoXFxbfCN8XFwqfFxcP3xcInw8fD58XFx8fCF8JXxcXF0pKyI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRUdFWFBfSU5WQUxJRF9GSUxFTkFNRV9DSEFSUyA9ICIoXFxbfCN8L3xcXFxcfFxcOnxcXCp8XFw/fFwifDx8PnxcXHx8XFxdfFxccykrIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhcltdIEhFWF9ESUdJVFMgPSB7ICcwJywgJzEnLCAnMicsICczJywgJzQnLCAnNScsCi0JCQknNicsICc3JywgJzgnLCAnOScsICdBJywgJ0InLCAnQycsICdEJywgJ0UnLCAnRicgfTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExJTkVfRkVFRCA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiKTsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVNDQVBFRF9MRiA9ICImI3hBOyI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVTQ0FQRURfQ1IgPSAiJiN4RDsiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFU0NBUEVEX0xJTkVfRkVFRCA9IExJTkVfRkVFRC5yZXBsYWNlKAotCQkJIlxuIiwgRVNDQVBFRF9MRikucmVwbGFjZSgiXHIiLCBFU0NBUEVEX0NSKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMSU5FX0ZFRURfUkVHRVggPSBMSU5FX0ZFRUQucmVwbGFjZUFsbCgKLQkJCSJcXFxcIiwgIlxcXFwiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFU0NBUEVEX0xJTkVfRkVFRF9SRUdFWCA9IEVTQ0FQRURfTElORV9GRUVEOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSFRNTF9CUkVBSyA9ICI8YnIvPiI7Ly8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSFRNTF9DT1BZID0gIiZjb3B5OyI7Ly8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSFRNTF9FVVJPID0gIiZldXJvOyI7Ly8kTk9OLU5MUy0xJCAJCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIVE1MX1JFRyA9ICImcmVnOyI7Ly8kTk9OLU5MUy0xJCAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhUTUxfVFJBREVNQVJLID0gIiZ0cmFkZTsiOy8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFByaXZhdGUgY29uc3RydWN0b3IgdG8gcHJldmVudCB0aGlzIGNsYXNzIGZyb20gYmVpbmcgaW5zdGFudGlhdGVkLiBBbGwKLQkgKiBtZXRob2RzIGluIHRoaXMgY2xhc3Mgc2hvdWxkIGJlIHN0YXRpYy4KLQkgKi8KLQlwcml2YXRlIFN0clV0aWwoKSB7Ci0JfQotCi0JLyoqCi0JICogVGVzdHMgZm9yIG51bGwgc3RyaW5nLgotCSAqIDxwPgotCSAqIEEgbnVsbCBzdHJpbmcgaXMgZGVmaW5lZCBhcyBvbmUgdGhhdCBoYXMgYW4gZW1wdHkgcmVmZXJlbmNlIG9yIGhhcyB6ZXJvCi0JICogbGVuZ3RoLgotCSAqIAotCSAqIEBwYXJhbSBzdHIKLQkgKiAgICAgICAgICAgIGEgc3RyaW5nCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgZ2l2ZW4gc3RyaW5nIGlzIGEgbnVsbCBzdHJpbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNOdWxsKFN0cmluZyBzdHIpIHsKLQkJcmV0dXJuIHN0ciA9PSBudWxsIHx8IHN0ci5sZW5ndGgoKSA9PSAwOwotCX0KLQotCS8qKgotCSAqIFRlc3RzIGZvciBibGFuayBzdHJpbmcuCi0JICogPHA+Ci0JICogQSBibGFuayBzdHJpbmcgaXMgZGVmaW5lZCBhcyBvbmUgdGhhdCBoYXMgYW4gZW1wdHkgcmVmZXJlbmNlIG9yIGhhcyB6ZXJvCi0JICogbGVuZ3RoIGFmdGVyIHRoZSBsZWFkaW5nIGFuZCB0cmFpbGluZyBzcGFjZSBjaGFyYWN0ZXJzIGFyZSB0cmltbWVkLgotCSAqIAotCSAqIEBwYXJhbSBzdHIKLQkgKiAgICAgICAgICAgIGEgc3RyaW5nCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgZ2l2ZW4gc3RyaW5nIGlzIGEgYmxhbmsgc3RyaW5nCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzQmxhbmsoU3RyaW5nIHN0cikgewotCQlyZXR1cm4gc3RyID09IG51bGwgfHwgc3RyLnRyaW0oKS5sZW5ndGgoKSA9PSAwOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZXMgdGhlIGxlYWRpbmcgYW5kIHRyYWlsaW5nIHNwYWNlIGNoYXJhY3RlcnMgZnJvbSBhIHN0cmluZy4KLQkgKiAKLQkgKiBAcGFyYW0gc3RyCi0JICogICAgICAgICAgICBhIHN0cmluZwotCSAqIEByZXR1cm4gYSBzdHJpbmcgd2l0aCBubyBsZWFkaW5nIGFuZCB0cmFpbGluZyBzcGFjZSBjaGFyYWN0ZXJzCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdHJpbShTdHJpbmcgc3RyKSB7Ci0JCXJldHVybiBzdHIgPT0gbnVsbCA/IG51bGwgOiBzdHIudHJpbSgpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZXMgd2hpdGVzcGFjZSBjaGFyYWN0ZXJzIChUQUIsIENSLCBMRiBhbmQgU1BBQ0UpIGZyb20gYSBzdHJpbmcuCi0JICogCi0JICogQHBhcmFtIHN0cgotCSAqICAgICAgICAgICAgYSBzdHJpbmcKLQkgKiBAcmV0dXJuIGEgc3RyaW5nIHdpdGggd2hpdGVzcGFjZSBjaGFyYWN0ZXJzIHJlbW92ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZW1vdmVXaGl0ZVNwYWNlQ2hhcnMoU3RyaW5nIHN0cikgewotCQlpbnQgbGVuID0gKHN0ciA9PSBudWxsKSA/IDAgOiBzdHIubGVuZ3RoKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLQkJCXN3aXRjaCAoc3RyLmNoYXJBdChpKSkgewotCQkJY2FzZSAnXHQnOgotCQkJY2FzZSAnXHInOgotCQkJY2FzZSAnXG4nOgotCQkJY2FzZSAnICc6Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0OgotCQkJCXJldHVybiBzdHI7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogUmVtb3ZlcyBDUiwgTEYgZnJvbSBhIHN0cmluZy4KLQkgKiAKLQkgKiBAcGFyYW0gc3RyCi0JICogICAgICAgICAgICBhIHN0cmluZwotCSAqIEByZXR1cm4gYSBzdHJpbmcgd2l0aCBDUiwgTEYgcmVtb3ZlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlbW92ZU5ld2xpbmVzKFN0cmluZyBzdHIpIHsKLQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlpbnQgbGVuID0gKHN0ciA9PSBudWxsKSA/IDAgOiBzdHIubGVuZ3RoKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLQkJCWNoYXIgYyA9IHN0ci5jaGFyQXQoaSk7Ci0JCQlzd2l0Y2ggKGMpIHsKLQkJCWNhc2UgJ1xyJzoKLQkJCWNhc2UgJ1xuJzoKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQ6Ci0JCQkJc2IuYXBwZW5kKGMpOwotCQkJfQotCQl9Ci0JCXJldHVybiBzYi50b1N0cmluZygpOyAKLQl9Ci0KLQkvKioKLQkgKiBTcGxpdHMgYSBzdHJpbmcgaW50byBhbiBhcnJheSBvZiBzdHJpbmcgdG9rZW5zLgotCSAqIAotCSAqIEBwYXJhbSBzdHIKLQkgKiAgICAgICAgICAgIGEgc3RyaW5nCi0JICogQHBhcmFtIHNlcAotCSAqICAgICAgICAgICAgYSBzdHJpbmcgY29udGFpbmluZyB0aGUgc3RyaW5nIHNlcGFyYXRvcnMKLQkgKiBAcGFyYW0gY291bnQKLQkgKiAgICAgICAgICAgIHRoZSBkZXNpcmVkIG51bWJlciBvZiBzdHJpbmcgdG9rZW5zCi0JICogQHJldHVybiBhbiBhcnJheSBvZiBzdHJpbmcgdG9rZW5zCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmdbXSBzcGxpdChTdHJpbmcgc3RyLCBTdHJpbmcgc2VwLCBpbnQgY291bnQpIHsKLQkJaWYgKHN0ciA9PSBudWxsIHx8IGNvdW50ID09IDAgfHwgY291bnQgPCAtMSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlTdHJpbmdUb2tlbml6ZXIgdG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcihzdHIsIHNlcCwKLQkJCQljb3VudCA9PSAtMSA/IGZhbHNlIDogdHJ1ZSk7Ci0KLQkJaWYgKGNvdW50ID09IC0xKSB7Ci0JCQljb3VudCA9IHRva2VuaXplci5jb3VudFRva2VucygpOwotCQl9Ci0KLQkJU3RyaW5nW10gcmVzdWx0ID0gbmV3IFN0cmluZ1tjb3VudF07Ci0JCWludCBpID0gMDsKLQkJd2hpbGUgKHRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJCVN0cmluZyB0ID0gdG9rZW5pemVyLm5leHRUb2tlbigpOwotCQkJaWYgKGkgPCBjb3VudCkgewotCQkJCWlmICgodC5sZW5ndGgoKSA9PSAxKSAmJiAoc2VwLmluZGV4T2YodCkgIT0gLTEpKSB7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCQlyZXN1bHRbaSsrXSA9IHQ7Ci0JCQl9IGVsc2UgewotCQkJCXJlc3VsdFtjb3VudCAtIDFdICs9IHQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBTcGxpdHMgYSBzdHJpbmcgaW50byBhbiBhcnJheSBvZiBzdHJpbmcgdG9rZW5zLgotCSAqIAotCSAqIEBwYXJhbSBzdHIKLQkgKiAgICAgICAgICAgIGEgc3RyaW5nCi0JICogQHBhcmFtIHNlcAotCSAqICAgICAgICAgICAgYSBzdHJpbmcgY29udGFpbmluZyB0aGUgc3RyaW5nIHNlcGFyYXRvcnMKLQkgKiBAcmV0dXJuIGFuIGFycmF5IG9mIHN0cmluZyB0b2tlbnMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZ1tdIHNwbGl0KFN0cmluZyBzdHIsIFN0cmluZyBzZXApIHsKLQkJcmV0dXJuIHNwbGl0KHN0ciwgc2VwLCAtMSk7Ci0JfQotCi0JLyoqCi0JICogUmVwbGFjZXMgYSBzdWJzdHJpbmcgd2l0aGluIGEgc3RyaW5nIHdpdGggYW5vdGhlciBzdWJzdHJpbmcuCi0JICogPHA+Ci0JICogTm90ZTogT25seSB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBvZiB0aGUgc3Vic3RyaW5nIHdpbGwgYmUgcmVwbGFjZWQuCi0JICogCi0JICogQHBhcmFtIHN0cgotCSAqICAgICAgICAgICAgYSBzdHJpbmcKLQkgKiBAcGFyYW0gc3JjCi0JICogICAgICAgICAgICB0aGUgc3Vic3RyaW5nIHRvIHJlcGxhY2UKLQkgKiBAcGFyYW0gdGd0Ci0JICogICAgICAgICAgICB0aGUgc3Vic3RyaW5nIHRvIHVzZSBmb3IgdGhlIHJlcGxhY2VtZW50Ci0JICogQHJldHVybiBhIHN0cmluZyB3aXRoIHRoZSBmaXJzdCBzdWJzdHJpbmcgcmVwbGFjZWQKLQkgKiAKLQkgKiBUT0RPOiBSZXZpZXcgaW1wbGVtZW50YXRpb24uIENhbGwgU3RyaW5nLnJlcGxhY2VGaXJzdCgpIGluc3RlYWQ/Ci0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVwbGFjZShTdHJpbmcgc3RyLCBTdHJpbmcgc3JjLCBTdHJpbmcgdGd0KSB7Ci0JCWlmICgoc3RyID09IG51bGwgfHwgc3RyLmxlbmd0aCgpID09IDApCi0JCQkJfHwgKHNyYyA9PSBudWxsIHx8IHNyYy5sZW5ndGgoKSA9PSAwKSkgewotCQkJcmV0dXJuIHN0cjsKLQkJfQotCi0JCVN0cmluZyB0bXBTdHIgPSBzdHI7Ci0JCWludCBpbmRleDsKLQkJd2hpbGUgKChpbmRleCA9IHRtcFN0ci5pbmRleE9mKHNyYykpICE9IC0xKSB7Ci0JCQl0bXBTdHIgPSB0bXBTdHIuc3Vic3RyaW5nKDAsIGluZGV4KSArIHRndAotCQkJCQkrIHRtcFN0ci5zdWJzdHJpbmcoaW5kZXggKyBzcmMubGVuZ3RoKCkpOwotCQl9Ci0JCXJldHVybiB0bXBTdHI7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgaW50ZWdlciB2YWx1ZSBvZiBhIHN0cmluZy4KLQkgKiAKLQkgKiBAcGFyYW0gc3RyCi0JICogICAgICAgICAgICBhIHN0cmluZwotCSAqIEBwYXJhbSBkZWZhdWx0VmFsdWUKLQkgKiAgICAgICAgICAgIGEgZGVmYXVsdCBpbnRlZ2VyIHZhbHVlIGZvciB0aGUgc3RyaW5nCi0JICogQHJldHVybiB0aGUgaW50ZWdlciB2YWx1ZSBvZiB0aGUgZ2l2ZW4gc3RyaW5nCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgZ2V0SW50VmFsdWUoU3RyaW5nIHN0ciwgaW50IGRlZmF1bHRWYWx1ZSkgewotCQlpZiAoU3RyVXRpbC5pc0JsYW5rKHN0cikpIHsKLQkJCXJldHVybiBkZWZhdWx0VmFsdWU7Ci0JCX0KLQotCQl0cnkgewotCQkJcmV0dXJuIEludGVnZXIucGFyc2VJbnQoc3RyKTsKLQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBkZWZhdWx0VmFsdWU7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFuIGFycmF5IG9mIGJ5dGVzIHJlcHJlc2VudGluZyB0aGUgVVRGLTggZW5jb2Rpbmcgb2YgYSBzdHJpbmcuCi0JICogCi0JICogQHBhcmFtIHN0cgotCSAqICAgICAgICAgICAgYSBzdHJpbmcKLQkgKiBAcmV0dXJuIGEgYnl0ZSBhcnJheSBjb250YWluaW5nIHRoZSBVVEYtOCBlbmNvZGluZyBvZiB0aGUgZ2l2ZW4gc3RyaW5nCi0JICovCi0JcHVibGljIHN0YXRpYyBieXRlW10gZ2V0VVRGOEJ5dGVzKFN0cmluZyBzdHIpIHsKLQkJY2hhcltdIGMgPSBzdHIudG9DaGFyQXJyYXkoKTsKLQkJaW50IGxlbiA9IGMubGVuZ3RoOwotCQlpbnQgY291bnQgPSAwOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0JCQlpbnQgY2ggPSBjW2ldOwotCQkJaWYgKGNoIDw9IDB4N2YpIHsKLQkJCQljb3VudCsrOwotCQkJfSBlbHNlIGlmIChjaCA8PSAweDdmZikgewotCQkJCWNvdW50ICs9IDI7Ci0JCQl9IGVsc2UgewotCQkJCWNvdW50ICs9IDM7Ci0JCQl9Ci0JCX0KLQotCQlieXRlW10gYiA9IG5ldyBieXRlW2NvdW50XTsKLQkJaW50IG9mZiA9IDA7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLQkJCWludCBjaCA9IGNbaV07Ci0JCQlpZiAoY2ggPD0gMHg3ZikgewotCQkJCWJbb2ZmKytdID0gKGJ5dGUpIGNoOwotCQkJfSBlbHNlIGlmIChjaCA8PSAweDdmZikgewotCQkJCWJbb2ZmKytdID0gKGJ5dGUpICgoY2ggPj4gNikgfCAweGMwKTsKLQkJCQliW29mZisrXSA9IChieXRlKSAoKGNoICYgMHgzZikgfCAweDgwKTsKLQkJCX0gZWxzZSB7Ci0JCQkJYltvZmYrK10gPSAoYnl0ZSkgKChjaCA+PiAxMikgfCAweGUwKTsKLQkJCQliW29mZisrXSA9IChieXRlKSAoKChjaCA+PiA2KSAmIDB4M2YpIHwgMHg4MCk7Ci0JCQkJYltvZmYrK10gPSAoYnl0ZSkgKChjaCAmIDB4M2YpIHwgMHg4MCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGI7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgaGV4aWRlY2ltYWwgY2hhcmFjdGVyIHJlcHJlc2VudGF0aW9uIGZvciBhbiBpbnRlZ2VyLgotCSAqIAotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgYW4gaW50ZWdlcgotCSAqIEByZXR1cm4gdGhlIGhleGlkZWNpbWFsIHJlcHJlc2VudGF0aW9uCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgY2hhciB0b0hleChpbnQgdmFsdWUpIHsKLQkJcmV0dXJuIEhFWF9ESUdJVFNbKHZhbHVlICYgMHhGKV07Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZXNjYXBlZCBVbmljb2RlIHJlcHJlc2VudGF0aW9uIG9mIGEgc3RyaW5nLgotCSAqIAotCSAqIEBwYXJhbSBzdHIKLQkgKiAgICAgICAgICAgIGEgc3RyaW5nCi0JICogQHBhcmFtIHNraXBBU0NJSQotCSAqICAgICAgICAgICAgaWYgPGNvZGU+dHJ1ZTwvY29kZT4sIGF2b2lkIGVzY2FwaW5nIHRoZSBBU0NJSSBjaGFyYWN0ZXJzCi0JICogQHJldHVybiB0aGUgZXNjYXBlZCBVbmljb2RlIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBnaXZlbiBzdHJpbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0b0VzY2FwZWRVbmljb2RlKFN0cmluZyBzdHIsIGJvb2xlYW4gc2tpcEFTQ0lJKSB7Ci0JCWludCBsZW4gPSBzdHIubGVuZ3RoKCk7Ci0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKGxlbiAqIDIpOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLQkJCWNoYXIgY2ggPSBzdHIuY2hhckF0KGkpOwotCi0JCQlpZiAoc2tpcEFTQ0lJICYmIGNoIDwgMHgwMDdFKSB7Ci0JCQkJcmVzdWx0LmFwcGVuZChjaCk7Ci0JCQl9IGVsc2UgewotCQkJCXJlc3VsdC5hcHBlbmQoIlxcdSIpOyAvLyROT04tTkxTLTEkCi0JCQkJcmVzdWx0LmFwcGVuZCh0b0hleCgoY2ggPj4gMTIpICYgMHhGKSk7Ci0JCQkJcmVzdWx0LmFwcGVuZCh0b0hleCgoY2ggPj4gOCkgJiAweEYpKTsKLQkJCQlyZXN1bHQuYXBwZW5kKHRvSGV4KChjaCA+PiA0KSAmIDB4RikpOwotCQkJCXJlc3VsdC5hcHBlbmQodG9IZXgoY2ggJiAweEYpKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBlc2NhcGVkIEhUTUwgcmVwcmVzZW50YXRpb24gb2YgYSBzdHJpbmcuCi0JICogCi0JICogQHBhcmFtIGh0bWwKLQkgKiAgICAgICAgICAgIGEgSFRNTCBzdHJpbmcKLQkgKiBAcmV0dXJuIHRoZSBlc2NhcGVkIFVuaWNvZGUgcmVwcmVzZW50YXRpb24gb2YgdGhlIGdpdmVuIEhUTUwgc3RyaW5nCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RXNjYXBlZEhUTUwoU3RyaW5nIGh0bWwpIHsKLQkJaWYgKGh0bWwgPT0gbnVsbCB8fCBodG1sLmxlbmd0aCgpID09IDApIHsKLQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJaW50IGxlbmd0aCA9IGh0bWwubGVuZ3RoKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJCWNoYXIgY2ggPSBodG1sLmNoYXJBdChpKTsKLQkJCXN3aXRjaCAoY2gpIHsKLQkJCWNhc2UgJyUnOgotCQkJCWlmIChpICsgNCA8IGxlbmd0aCkgewotCQkJCQlTdHJpbmcgaGV4U3RyID0gaHRtbC5zdWJzdHJpbmcoaSArIDEsIGkgKyA1KTsKLQkJCQkJYm9vbGVhbiB2YWxpZEhleHRTdHIgPSB0cnVlOwotCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IGhleFN0ci5sZW5ndGgoKTsgaisrKSB7Ci0JCQkJCQljaGFyIGMgPSBoZXhTdHIuY2hhckF0KGopOwotCQkJCQkJaWYgKCEoYyA+PSAnMCcgJiYgYyA8PSAnOScpIHx8IChjID49ICdhJyAmJiBjIDw9ICdmJykpIHsKLQkJCQkJCQl2YWxpZEhleHRTdHIgPSBmYWxzZTsKLQkJCQkJCQlicmVhazsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlpZiAodmFsaWRIZXh0U3RyKSB7Ci0JCQkJCQl0cnkgewotCQkJCQkJCWludCBjb2RlUG9pbnQgPSBJbnRlZ2VyLnBhcnNlSW50KGhleFN0ciwgMTYpOwotCQkJCQkJCWNoYXJbXSBjID0gVUNoYXJhY3Rlci50b0NoYXJzKGNvZGVQb2ludCk7Ci0JCQkJCQkJcmVzdWx0LmFwcGVuZChjKTsKLQkJCQkJCQlpICs9IDQ7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCXJlc3VsdC5hcHBlbmQoY2gpOwotCQkJCWJyZWFrOwotCQkJY2FzZSAnXHUwMGE5JzoKLQkJCQlyZXN1bHQuYXBwZW5kKEhUTUxfQ09QWSk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlICdcdTAwYWUnOgotCQkJCXJlc3VsdC5hcHBlbmQoSFRNTF9SRUcpOwotCQkJCWJyZWFrOwotCQkJY2FzZSAnXHUyMGFjJzoKLQkJCQlyZXN1bHQuYXBwZW5kKEhUTUxfRVVSTyk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlICdcdTIxMjInOgotCQkJCXJlc3VsdC5hcHBlbmQoSFRNTF9UUkFERU1BUkspOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCQlyZXN1bHQuYXBwZW5kKGNoKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcGxhaW4gdGV4dCBmcm9tIEhUTUwgdGV4dC4KLQkgKiA8cD4KLQkgKiBOb3RlOiBBbGwgSFRNTCB0YWdzIHdpbGwgYmUgc3RyaXBwZWQuCi0JICogCi0JICogQHBhcmFtIGh0bWwKLQkgKiAgICAgICAgICAgIHRoZSBIVE1MIHRleHQuCi0JICogQHJldHVybiB0aGUgcGxhaW4gdGV4dCByZXByZXNlbnRhdGlvbiBvZiB0aGUgZ2l2ZW4gSFRNTCB0ZXh0Ci0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UGxhaW5UZXh0KFN0cmluZyBodG1sKSB7Ci0JCWlmIChodG1sID09IG51bGwpIHsKLQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJZmluYWwgUGF0dGVybiBwX3BsYWludGV4dF9maWx0ZXIgPSBQYXR0ZXJuLmNvbXBpbGUoCi0JCQkJIjxbXj5dKj8+IiwgUGF0dGVybi5DQVNFX0lOU0VOU0lUSVZFIHwgUGF0dGVybi5ET1RBTEwpOyAvLyROT04tTkxTLTEkCi0JCWZpbmFsIFBhdHRlcm4gcF9wbGFpbnRleHRfZmlsdGVyMiA9IFBhdHRlcm4uY29tcGlsZSgKLQkJCQkiJi57MSw1fVteO107IiwgUGF0dGVybi5DQVNFX0lOU0VOU0lUSVZFIHwgUGF0dGVybi5ET1RBTEwpOyAvLyROT04tTkxTLTEkCi0JCWZpbmFsIFBhdHRlcm4gcF9wbGFpbnRleHRfZmlsdGVyMyA9IFBhdHRlcm4uY29tcGlsZSgKLQkJCQkiXFxzKyIsIFBhdHRlcm4uQ0FTRV9JTlNFTlNJVElWRSB8IFBhdHRlcm4uRE9UQUxMKTsgLy8kTk9OLU5MUy0xJAotCi0JCVN0cmluZyByZXN1bHQgPSBodG1sLnJlcGxhY2VBbGwocF9wbGFpbnRleHRfZmlsdGVyLnBhdHRlcm4oKSwgIiAiKSAvLyROT04tTkxTLTEkCi0JCQkJLnJlcGxhY2VBbGwocF9wbGFpbnRleHRfZmlsdGVyMi5wYXR0ZXJuKCksICIgIikgLy8kTk9OLU5MUy0xJAotCQkJCS5yZXBsYWNlQWxsKHBfcGxhaW50ZXh0X2ZpbHRlcjMucGF0dGVybigpLCAiICIpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQ29udmVydHMgYSBzdHJpbmcgaW50byBhIHZhbGlkIGZpbGUgbmFtZS4KLQkgKiAKLQkgKiBAcGFyYW0gc3RyCi0JICogICAgICAgICAgICBhIHN0cmluZwotCSAqIEByZXR1cm4gYSB2YWxpZCBmaWxlIG5hbWUgZGVyaXZlZCBmcm9tIHRoZSBnaXZlbiBzdHJpbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBtYWtlVmFsaWRGaWxlTmFtZShTdHJpbmcgc3RyKSB7Ci0JCWlmIChzdHIgPT0gbnVsbCkgewotCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIGdldFBsYWluVGV4dChzdHIpCi0JCQkJLnJlcGxhY2VBbGwoUkVHRVhQX0lOVkFMSURfRklMRU5BTUVfQ0hBUlMsICIgIikudHJpbSgpOyAvLyROT04tTkxTLTEkIAotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlbW92ZVNwZWNpYWxDaGFyYWN0ZXJzKFN0cmluZyBzdHIpIHsKLQkJaWYgKHN0ciA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gZ2V0UGxhaW5UZXh0KHN0cikKLQkJCQkucmVwbGFjZUFsbChSRUdFWFBfQU5ZX1NQRUNJQUxfQ0hBUlMsICIgIikudHJpbSgpOyAvLyROT04tTkxTLTEkIAotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgcGF0aCBkb2VzIG5vdCBjb250YWluIGFueSBpbnZhbGlkIGZpbGVuYW1lCi0JICogY2hhcmFjdGVycy4KLQkgKiAKLQkgKiBAcGFyYW0gcGF0aAotCSAqICAgICAgICAgICAgdGhlIGZpbGUgcGF0aAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGdpdmVuIHBhdGggY29udGFpbnMgb25seSB2YWxpZAotCSAqICAgICAgICAgZmlsZW5hbWUgY2hhcmFjdGVycwotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1ZhbGlkUHVibGlzaFBhdGgoU3RyaW5nIHBhdGgpIHsKLQkJLy8gcmV0dXJuIHBhdGgucmVwbGFjZUFsbChpbnZhbGlkUHVibGlzaFBhdGhDaGFyc1JlZ0V4cCwKLQkJLy8gIiIpLmVxdWFscyhwYXRoKTsKLQotCQlpZiAoUGxhdGZvcm0uZ2V0T1MoKS5lcXVhbHMoUGxhdGZvcm0uV1NfV0lOMzIpKSB7Ci0JCQlyZXR1cm4gcGF0aAotCQkJCQkucmVwbGFjZUFsbChSRUdFWFBfSU5WQUxJRF9QVUJMSVNIRURfUEFUSF9DSEFSUywgIiIpLmVxdWFscyhwYXRoKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJLy8gZWxzZSBkZWZhdWx0IHRvIExpbnV4Ci0JCXJldHVybiBwYXRoCi0JCQkJLnJlcGxhY2VBbGwoUkVHRVhQX0lOVkFMSURfUFVCTElTSEVEX1BBVEhfQ0hBUlNfTElOVVgsICIiKS5lcXVhbHMocGF0aCk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBsb3dlci1jYXNlIG9mIHN0ciB1bmxlc3MgdGhlIGN1cnJlbnQgbG9jYWxlIGlzIEdlcm1hbgotCSAqIAotCSAqIEBwYXJhbSBzdHIKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdG9Mb3dlcihTdHJpbmcgc3RyKSB7Ci0JCWlmIChQbGF0Zm9ybS5nZXROTCgpLnN0YXJ0c1dpdGgoImRlIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIHN0cjsKLQkJfQotCQlyZXR1cm4gc3RyLnRvTG93ZXJDYXNlKCk7Ci0JfQotCi0JLyoqCi0JICogZXNjYXBlIHRoZSAiIGFuZCAnCi0JICogCi0JICogQHBhcmFtIHN0cgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlc2NhcGUoU3RyaW5nIHN0cikgewotCQlyZXR1cm4gc3RyLnJlcGxhY2VBbGwoIiciLCAiXFxcXFwnIikucmVwbGFjZUFsbCgiXCIiLCAiXFxcXFwiIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQl9Ci0KLQkvKioKLQkgKiBDb252ZXJ0cyBhIDxjb2RlPkxpc3Q8L2NvZGU+IHRvIGFuIFN0cmluZyBhcnJheS4KLQkgKiAKLQkgKiBAcGFyYW0gbGlzdAotCSAqICAgICAgICAgICAgYSA8Y29kZT5MaXN0PC9jb2RlPgotCSAqIEByZXR1cm4gYSBTdHJpbmcgYXJyYXkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZ1tdIGNvbnZlcnRMaXN0VG9TdHJBcnJheShMaXN0IGxpc3QpIHsKLQkJaWYgKGxpc3QgIT0gbnVsbCkgewotCQkJaW50IGNudCA9IGxpc3Quc2l6ZSgpOwotCQkJU3RyaW5nW10gc3RyQXJyYXkgPSBuZXcgU3RyaW5nW2NudF07Ci0KLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY250OyBpKyspIHsKLQkJCQlTdHJpbmcgc3RyID0gKFN0cmluZykgbGlzdC5nZXQoaSk7Ci0JCQkJc3RyQXJyYXlbaV0gPSBuZXcgU3RyaW5nKHN0cik7Ci0JCQl9Ci0JCQlyZXR1cm4gc3RyQXJyYXk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1ZhbGlkTmFtZShTdHJpbmcgbmFtZSkgewotCQlyZXR1cm4gbmFtZS5yZXBsYWNlQWxsKFJFR0VYUF9BTllfU1BFQ0lBTF9DSEFSUywgIiIpLmVxdWFscyhuYW1lKTsgLy8kTk9OLU5MUy0xJAkJCi0JfQotCi0JLyoqCi0JICogYWRkZWQgc29tZSB0ZXN0IGNvZGUKLQkgKiAKLQkgKiBAcGFyYW0gYXJncwotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQotCQlTdHJpbmcgdGV4dCA9ICJBJiUgICAgICBgJiMgICAgICAgICAgICR+IUAjJCVeJiooKV8tKz17fVtcIl06fFxcOjtcIic8LD4uPy8gXHRcclxuWiI7IC8vJE5PTi1OTFMtMSQKLQotCQlTeXN0ZW0ub3V0LnByaW50bG4oIlsiICsgdGV4dCArICJdIDw9PSB0ZXh0Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlTeXN0ZW0ub3V0LnByaW50bG4oIlsiICsgdGV4dC5yZXBsYWNlQWxsKFJFR0VYUF9BTllfU1BFQ0lBTF9DSEFSUywgIiAiKSAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkrICJdIDw9PSBBbGwiKTsgLy8kTk9OLU5MUy0xJAotCQlTeXN0ZW0ub3V0LnByaW50bG4oIlsiIC8vJE5PTi1OTFMtMSQKLQkJCQkrIHRleHQucmVwbGFjZUFsbChSRUdFWFBfSU5WQUxJRF9GSUxFTkFNRV9DSEFSUywgIiAiKSAvLyROT04tTkxTLTEkCi0JCQkJKyAiXSA8PT0gRmlsZSBOYW1lIik7IC8vJE5PTi1OTFMtMSQKLQkJU3lzdGVtLm91dC5wcmludGxuKCJbIiAvLyROT04tTkxTLTEkCi0JCQkJKyB0ZXh0LnJlcGxhY2VBbGwoUkVHRVhQX0lOVkFMSURfUFVCTElTSEVEX1BBVEhfQ0hBUlMsICIgIikgLy8kTk9OLU5MUy0xJAotCQkJCSsgIl0gPD09IHBhdGgiKTsgLy8kTk9OLU5MUy0xJAotCQlTeXN0ZW0ub3V0LnByaW50bG4oIlsiIC8vJE5PTi1OTFMtMSQKLQkJCQkrIHRleHQucmVwbGFjZUFsbChSRUdFWFBfSU5WQUxJRF9QVUJMSVNIRURfUEFUSF9DSEFSU19MSU5VWCwKLQkJCQkJCSIgIikgKyAiXSA8PT0gcGF0aCwgTGludXgiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkJU3lzdGVtLm91dC5wcmludGxuKCIiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIENvbnZlcnRzIHRoZSBwbGF0Zm9ybSBsaW5lLXNlcGFyYXRvciAoXG4gb3IgXG5cciBvciBccikgdG8gJmx0O2JyLyZndDsKLQkgKiAKLQkgKiBAcGFyYW0gdGV4dAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb252ZXJ0TmV3bGluZXNUb0hUTUwoU3RyaW5nIHRleHQpIHsKLQkJaWYgKHRleHQgIT0gbnVsbCkgewotCQkJdGV4dCA9IHRleHQucmVwbGFjZUFsbChMSU5FX0ZFRURfUkVHRVgsIEhUTUxfQlJFQUsgKyBMSU5FX0ZFRUQpOwotCQkJdGV4dCA9IHRleHQucmVwbGFjZUFsbChFU0NBUEVEX0xJTkVfRkVFRF9SRUdFWCwgSFRNTF9CUkVBSwotCQkJCQkrIEVTQ0FQRURfTElORV9GRUVEKTsKLQkJfQotCQlyZXR1cm4gdGV4dDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFVSSSB0b1VSSShTdHJpbmcgcGF0aFN0cikgewotCQlpZiAocGF0aFN0ciAhPSBudWxsICYmIHBhdGhTdHIubGVuZ3RoKCkgPiAwKSB7Ci0JCQlJUGF0aCBwYXRoID0gUGF0aC5mcm9tT1NTdHJpbmcocGF0aFN0cik7Ci0JCQl0cnkgewotCQkJCXJldHVybiBwYXRoLnRvRmlsZSgpLnRvVVJJKCk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCUNvbW1vblBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXNjYXBlQ2hhcihTdHJpbmcgdGV4dCwgY2hhciBjKSB7Ci0JCWludCBpPXRleHQuaW5kZXhPZihjKTsgCi0JCWlmICggaSA8IDAgKSB7Ci0JCQlyZXR1cm4gdGV4dDsKLQkJfQotCQkKLQkJaW50IHN0YXJ0ID0gMDsKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJd2hpbGUgKCBpID4gc3RhcnQgKSB7Ci0JCQlidWZmZXIuYXBwZW5kKHRleHQuc3Vic3RyaW5nKHN0YXJ0LCBpKSkuYXBwZW5kKCJcXCIpOyAvLyROT04tTkxTLTEkCi0JCQlzdGFydCA9IGk7Ci0JCQlpPXRleHQuaW5kZXhPZihjLCBzdGFydCsxKTsgCi0JCX0KLQkJCi0JCWJ1ZmZlci5hcHBlbmQodGV4dC5zdWJzdHJpbmcoc3RhcnQpKTsKLQkJCi0JCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi91dGlscy9TdHJpbmdNYXRjaGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3V0aWxzL1N0cmluZ01hdGNoZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmViOTY1Yi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3V0aWxzL1N0cmluZ01hdGNoZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlsczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi0vKioKLSAqIEEgc3RyaW5nIHBhdHRlcm4gbWF0Y2hlci4gU3VwcG9ydHMgJyonIGFuZCAnPycgd2lsZGNhcmRzLgotICovCi1wdWJsaWMgY2xhc3MgU3RyaW5nTWF0Y2hlciB7Ci0JcHJvdGVjdGVkIFN0cmluZyBmUGF0dGVybjsKLQlwcm90ZWN0ZWQgaW50IGZMZW5ndGg7IC8vIHBhdHRlcm4gbGVuZ3RoCi0JcHJvdGVjdGVkIGJvb2xlYW4gZklnbm9yZVdpbGRDYXJkczsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBmSWdub3JlQ2FzZTsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBmSGFzTGVhZGluZ1N0YXI7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gZkhhc1RyYWlsaW5nU3RhcjsKLQlwcm90ZWN0ZWQgU3RyaW5nIGZTZWdtZW50c1tdOyAvL3RoZSBnaXZlbiBwYXR0ZXJuIGlzIHNwbGl0IGludG8gKiBzZXBhcmF0ZWQgc2VnbWVudHMKLQotCS8qIGJvdW5kYXJ5IHZhbHVlIGJleW9uZCB3aGljaCB3ZSBkb24ndCBuZWVkIHRvIHNlYXJjaCBpbiB0aGUgdGV4dCAqLwotCXByb3RlY3RlZCBpbnQgZkJvdW5kPSAwOwotCQotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBjaGFyIGZTaW5nbGVXaWxkQ2FyZD0gJ1x1MDAwMCc7Ci0JCi0JcHVibGljIHN0YXRpYyBjbGFzcyBQb3NpdGlvbiB7Ci0JCWludCBzdGFydDsgLy9pbmNsdXNpdmUKLQkJaW50IGVuZDsgLy9leGNsdXNpdmUKLQkJcHVibGljIFBvc2l0aW9uKGludCBzdGFydCwgaW50IGVuZCkgewotCQkJdGhpcy5zdGFydD0gc3RhcnQ7Ci0JCQl0aGlzLmVuZD0gZW5kOwotCQl9Ci0JCXB1YmxpYyBpbnQgZ2V0U3RhcnQoKSB7Ci0JCQlyZXR1cm4gc3RhcnQ7Ci0JCX0KLQkJcHVibGljIGludCBnZXRFbmQoKSB7Ci0JCQlyZXR1cm4gZW5kOwotCQl9Ci0JfQotCS8qKgotCSAqIFN0cmluZ01hdGNoZXIgY29uc3RydWN0b3IgdGFrZXMgaW4gYSBTdHJpbmcgb2JqZWN0IHRoYXQgaXMgYSBzaW1wbGUgCi0JICogcGF0dGVybi4gVGhlIHBhdHRlcm4gbWF5IGNvbnRhaW4gJyonIGZvciAwIGFuZCBtYW55IGNoYXJhY3RlcnMgYW5kCi0JICogJz8nIGZvciBleGFjdGx5IG9uZSBjaGFyYWN0ZXIuICAKLQkgKgotCSAqIExpdGVyYWwgJyonIGFuZCAnPycgY2hhcmFjdGVycyBtdXN0IGJlIGVzY2FwZWQgaW4gdGhlIHBhdHRlcm4gCi0JICogZS5nLiwgIlwqIiBtZWFucyBsaXRlcmFsICIqIiwgZXRjLgotCSAqCi0JICogRXNjYXBpbmcgYW55IG90aGVyIGNoYXJhY3RlciAoaW5jbHVkaW5nIHRoZSBlc2NhcGUgY2hhcmFjdGVyIGl0c2VsZiksIAotCSAqIGp1c3QgcmVzdWx0cyBpbiB0aGF0IGNoYXJhY3RlciBpbiB0aGUgcGF0dGVybi4KLQkgKiBlLmcuLCAiXGEiIG1lYW5zICJhIiBhbmQgIlxcIiBtZWFucyAiXCIKLQkgKgotCSAqIElmIGludm9raW5nIHRoZSBTdHJpbmdNYXRjaGVyIHdpdGggc3RyaW5nIGxpdGVyYWxzIGluIEphdmEsIGRvbid0IGZvcmdldAotCSAqIGVzY2FwZSBjaGFyYWN0ZXJzIGFyZSByZXByZXNlbnRlZCBieSAiXFwiLgotCSAqCi0JICogQHBhcmFtIHBhdHRlcm4gdGhlIHBhdHRlcm4gdG8gbWF0Y2ggdGV4dCBhZ2FpbnN0Ci0JICogQHBhcmFtIGlnbm9yZUNhc2UgaWYgdHJ1ZSwgY2FzZSBpcyBpZ25vcmVkCi0JICogQHBhcmFtIGlnbm9yZVdpbGRDYXJkcyBpZiB0cnVlLCB3aWxkIGNhcmRzIGFuZCB0aGVpciBlc2NhcGUgc2VxdWVuY2VzIGFyZSBpZ25vcmVkCi0JICogCQkgIChldmVyeXRoaW5nIGlzIHRha2VuIGxpdGVyYWxseSkuCi0JICovCi0JcHVibGljIFN0cmluZ01hdGNoZXIoU3RyaW5nIHBhdHRlcm4sIGJvb2xlYW4gaWdub3JlQ2FzZSwgYm9vbGVhbiBpZ25vcmVXaWxkQ2FyZHMpIHsKLQkJaWYgKHBhdHRlcm4gPT0gbnVsbCkKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLQkJZklnbm9yZUNhc2U9IGlnbm9yZUNhc2U7Ci0JCWZJZ25vcmVXaWxkQ2FyZHM9IGlnbm9yZVdpbGRDYXJkczsKLQkJZlBhdHRlcm49IHBhdHRlcm47Ci0JCWZMZW5ndGg9IHBhdHRlcm4ubGVuZ3RoKCk7Ci0JCQotCQlpZiAoZklnbm9yZVdpbGRDYXJkcykgewotCQkJcGFyc2VOb1dpbGRDYXJkcygpOwotCQl9IGVsc2UgewotCQkJcGFyc2VXaWxkQ2FyZHMoKTsKLQkJfQotCX0KLQkvKioKLQkgKiBGaW5kIHRoZSBmaXJzdCBvY2N1cnJlbmNlIG9mIHRoZSBwYXR0ZXJuIGJldHdlZW4gPGNvZGU+c3RhcnQ8L2NvZGUpKGluY2x1c2l2ZSkgCi0JICogYW5kIDxjb2RlPmVuZDwvY29kZT4oZXhjbHVzaXZlKS4gIAotCSAqIEBwYXJhbSB0ZXh0IHRoZSBTdHJpbmcgb2JqZWN0IHRvIHNlYXJjaCBpbiAKLQkgKiBAcGFyYW0gc3RhcnQgdGhlIHN0YXJ0aW5nIGluZGV4IG9mIHRoZSBzZWFyY2ggcmFuZ2UsIGluY2x1c2l2ZQotCSAqIEBwYXJhbSBlbmQgdGhlIGVuZGluZyBpbmRleCBvZiB0aGUgc2VhcmNoIHJhbmdlLCBleGNsdXNpdmUKLQkgKiBAcmV0dXJuIGFuIDxjb2RlPlN0cmluZ01hdGNoZXIuUG9zaXRpb248L2NvZGU+IG9iamVjdCB0aGF0IGtlZXBzIHRoZSBzdGFydGluZyAKLQkgKiAoaW5jbHVzaXZlKSBhbmQgZW5kaW5nIHBvc2l0aW9ucyAoZXhjbHVzaXZlKSBvZiB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBvZiB0aGUgCi0JICogcGF0dGVybiBpbiB0aGUgc3BlY2lmaWVkIHJhbmdlIG9mIHRoZSB0ZXh0OyByZXR1cm4gbnVsbCBpZiBub3QgZm91bmQgb3Igc3VidGV4dAotCSAqIGlzIGVtcHR5IChzdGFydD09ZW5kKS4gQSBwYWlyIG9mIHplcm9zIGlzIHJldHVybmVkIGlmIHBhdHRlcm4gaXMgZW1wdHkgc3RyaW5nCi0JICogTm90ZSB0aGF0IGZvciBwYXR0ZXJuIGxpa2UgIiphYmMqIiB3aXRoIGxlYWRpbmcgYW5kIHRyYWlsaW5nIHN0YXJzLCBwb3NpdGlvbiBvZiAiYWJjIgotCSAqIGlzIHJldHVybmVkLiBGb3IgYSBwYXR0ZXJuIGxpa2UiKj8/KiIgaW4gdGV4dCAiYWJjZGYiLCAoMSwzKSBpcyByZXR1cm5lZAotCSAqLwotCXB1YmxpYyBTdHJpbmdNYXRjaGVyLlBvc2l0aW9uIGZpbmQoU3RyaW5nIHRleHQsIGludCBzdGFydCwgaW50IGVuZCkgewotCQlpZiAodGV4dCA9PSBudWxsKQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotCQkJCi0JCWludCB0bGVuPSB0ZXh0Lmxlbmd0aCgpOwotCQlpZiAoc3RhcnQgPCAwKQotCQkJc3RhcnQ9IDA7Ci0JCWlmIChlbmQgPiB0bGVuKQotCQkJZW5kPSB0bGVuOwotCQlpZiAoZW5kIDwgMCB8fHN0YXJ0ID49IGVuZCApCi0JCQlyZXR1cm4gbnVsbDsKLQkJaWYgKGZMZW5ndGggPT0gMCkKLQkJCXJldHVybiBuZXcgUG9zaXRpb24oc3RhcnQsIHN0YXJ0KTsKLQkJaWYgKGZJZ25vcmVXaWxkQ2FyZHMpIHsKLQkJCWludCB4PSBwb3NJbih0ZXh0LCBzdGFydCwgZW5kKTsKLQkJCWlmICh4IDwgMCkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCXJldHVybiBuZXcgUG9zaXRpb24oeCwgeCtmTGVuZ3RoKTsKLQkJfQotCi0JCWludCBzZWdDb3VudD0gZlNlZ21lbnRzLmxlbmd0aDsKLQkJaWYgKHNlZ0NvdW50ID09IDApLy9wYXR0ZXJuIGNvbnRhaW5zIG9ubHkgJyonKHMpCi0JCQlyZXR1cm4gbmV3IFBvc2l0aW9uIChzdGFydCwgZW5kKTsKLQkJCQkJCi0JCWludCBjdXJQb3M9IHN0YXJ0OwotCQlpbnQgbWF0Y2hTdGFydD0gLTE7Ci0JCWludCBpOwotCQlmb3IgKGk9IDA7IGkgPCBzZWdDb3VudCAmJiBjdXJQb3MgPCBlbmQ7ICsraSkgewotCQkJU3RyaW5nIGN1cnJlbnQ9IGZTZWdtZW50c1tpXTsKLQkJCWludCBuZXh0TWF0Y2g9IHJlZ0V4cFBvc0luKHRleHQsIGN1clBvcywgZW5kLCBjdXJyZW50KTsKLQkJCWlmIChuZXh0TWF0Y2ggPCAwICkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCWlmKGkgPT0gMCkKLQkJCQltYXRjaFN0YXJ0PSBuZXh0TWF0Y2g7Ci0JCQljdXJQb3M9IG5leHRNYXRjaCArIGN1cnJlbnQubGVuZ3RoKCk7Ci0JCX0KLQkJaWYgKGkgPCBzZWdDb3VudCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gbmV3IFBvc2l0aW9uKG1hdGNoU3RhcnQsIGN1clBvcyk7Ci0JfQotCS8qKgotCSAqIG1hdGNoIHRoZSBnaXZlbiA8Y29kZT50ZXh0PC9jb2RlPiB3aXRoIHRoZSBwYXR0ZXJuIAotCSAqIEByZXR1cm4gdHJ1ZSBpZiBtYXRjaGVkIGVpdGhlcndpc2UgZmFsc2UKLQkgKiBAcGFyYW0gdGV4dCBhIFN0cmluZyBvYmplY3QgCi0JICovCi0JcHVibGljIGJvb2xlYW4gbWF0Y2goU3RyaW5nIHRleHQpIHsKLQkJcmV0dXJuIG1hdGNoKHRleHQsIDAsIHRleHQubGVuZ3RoKCkpOwotCX0KLQkvKioKLQkgKiBHaXZlbiB0aGUgc3RhcnRpbmcgKGluY2x1c2l2ZSkgYW5kIHRoZSBlbmRpbmcgKGV4Y2x1c2l2ZSkgcG9zaXRpb25zIGluIHRoZSAgIAotCSAqIDxjb2RlPnRleHQ8L2NvZGU+LCBkZXRlcm1pbmUgaWYgdGhlIGdpdmVuIHN1YnN0cmluZyBtYXRjaGVzIHdpdGggYVBhdHRlcm4gIAotCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIHBvcnRpb24gb2YgdGhlIHRleHQgbWF0Y2hlcyB0aGUgcGF0dGVybgotCSAqIEBwYXJhbSB0ZXh0IGEgU3RyaW5nIG9iamVjdCB0aGF0IGNvbnRhaW5zIHRoZSBzdWJzdHJpbmcgdG8gbWF0Y2ggCi0JICogQHBhcmFtIHN0YXJ0IG1hcmtzIHRoZSBzdGFydGluZyBwb3NpdGlvbiAoaW5jbHVzaXZlKSBvZiB0aGUgc3Vic3RyaW5nCi0JICogQHBhcmFtIGVuZCBtYXJrcyB0aGUgZW5kaW5nIGluZGV4IChleGNsdXNpdmUpIG9mIHRoZSBzdWJzdHJpbmcgCi0JICovCi0JcHVibGljIGJvb2xlYW4gbWF0Y2goU3RyaW5nIHRleHQsIGludCBzdGFydCwgaW50IGVuZCkgewotCQlpZiAobnVsbCA9PSB0ZXh0KQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotCQkJCi0JCWlmIChzdGFydCA+IGVuZCkKLQkJCXJldHVybiBmYWxzZTsKLQkJCi0JCWlmIChmSWdub3JlV2lsZENhcmRzKQotCQkJcmV0dXJuIChlbmQgLSBzdGFydCA9PSBmTGVuZ3RoKSAmJiBmUGF0dGVybi5yZWdpb25NYXRjaGVzKGZJZ25vcmVDYXNlLCAwLCB0ZXh0LCBzdGFydCwgZkxlbmd0aCk7Ci0JCWludCBzZWdDb3VudD0gZlNlZ21lbnRzLmxlbmd0aDsKLQkJaWYgKHNlZ0NvdW50ID09IDAgJiYgKGZIYXNMZWFkaW5nU3RhciB8fCBmSGFzVHJhaWxpbmdTdGFyKSkgIC8vIHBhdHRlcm4gY29udGFpbnMgb25seSAnKicocykKLQkJCXJldHVybiB0cnVlOwotCQlpZiAoc3RhcnQgPT0gZW5kKQotCQkJcmV0dXJuIGZMZW5ndGggPT0gMDsKLQkJaWYgKGZMZW5ndGggPT0gMCkKLQkJCXJldHVybiBzdGFydCA9PSBlbmQ7CQotCQkgCi0JCWludCB0bGVuPSB0ZXh0Lmxlbmd0aCgpOwotCQlpZiAoc3RhcnQgPCAwKQotCQkJc3RhcnQ9IDA7Ci0JCWlmIChlbmQgPiB0bGVuKQotCQkJZW5kPSB0bGVuOyAKLQkJCQkJCi0JCWludCB0Q3VyUG9zPSBzdGFydDsKLQkJaW50IGJvdW5kPSBlbmQgLSBmQm91bmQ7Ci0JCWlmICggYm91bmQgPCAwKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpbnQgaT0wOwotCQlTdHJpbmcgY3VycmVudD0gZlNlZ21lbnRzW2ldOwotCQlpbnQgc2VnTGVuZ3RoPSBjdXJyZW50Lmxlbmd0aCgpOwotCi0JCS8qIHByb2Nlc3MgZmlyc3Qgc2VnbWVudCAqLwotCQlpZiAoIWZIYXNMZWFkaW5nU3Rhcil7IAotCQkJaWYoIXJlZ0V4cFJlZ2lvbk1hdGNoZXModGV4dCwgc3RhcnQsIGN1cnJlbnQsIDAsIHNlZ0xlbmd0aCkpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9IGVsc2UgewotCQkJCSsraTsKLQkJCQl0Q3VyUG9zPSB0Q3VyUG9zICsgc2VnTGVuZ3RoOwotCQkJfQotCQl9Ci0JCWlmICgoZlNlZ21lbnRzLmxlbmd0aCA9PSAxKSAmJiAoIWZIYXNMZWFkaW5nU3RhcikgJiYgKCFmSGFzVHJhaWxpbmdTdGFyKSkgewotCQkJLy8gb25seSBvbmUgc2VnbWVudCB0byBtYXRjaCwgbm8gd2lsZGNhcmRzIHNwZWNpZmllZAotCQkJcmV0dXJuIHRDdXJQb3MgPT0gZW5kOwotCQl9Ci0JCS8qIHByb2Nlc3MgbWlkZGxlIHNlZ21lbnRzICovCQotCQl3aGlsZSAoaSA8IHNlZ0NvdW50KSB7Ci0JCQljdXJyZW50PSBmU2VnbWVudHNbaV07Ci0JCQlpbnQgY3VycmVudE1hdGNoOwotCQkJaW50IGs9IGN1cnJlbnQuaW5kZXhPZihmU2luZ2xlV2lsZENhcmQpOwotCQkJaWYgKGsgPCAwKSB7Ci0JCQkJY3VycmVudE1hdGNoPSB0ZXh0UG9zSW4odGV4dCwgdEN1clBvcywgZW5kLCBjdXJyZW50KTsKLQkJCQlpZiAoY3VycmVudE1hdGNoIDwgMCkKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJfSBlbHNlIHsgCi0JCQkJY3VycmVudE1hdGNoPSByZWdFeHBQb3NJbih0ZXh0LCB0Q3VyUG9zLCBlbmQsIGN1cnJlbnQpOwotCQkJCWlmIChjdXJyZW50TWF0Y2ggPCAwKQotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQl0Q3VyUG9zPSBjdXJyZW50TWF0Y2ggKyBjdXJyZW50Lmxlbmd0aCgpOwotCQkJaSsrOwotCQl9Ci0KLQkJLyogcHJvY2VzcyBmaW5hbCBzZWdtZW50ICovCi0JCWlmICghZkhhc1RyYWlsaW5nU3RhciAmJiB0Q3VyUG9zICE9IGVuZCkgewotCQkJaW50IGNsZW49IGN1cnJlbnQubGVuZ3RoKCk7Ci0JCQlyZXR1cm4gcmVnRXhwUmVnaW9uTWF0Y2hlcyh0ZXh0LCBlbmQgLSBjbGVuLCBjdXJyZW50LCAwLCBjbGVuKTsKLQkJfQotCQlyZXR1cm4gaSA9PSBzZWdDb3VudCA7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgcGFyc2VzIHRoZSBnaXZlbiBwYXR0ZXJuIGludG8gc2VnbWVudHMgc2VwZXJhdGVkIGJ5IHdpbGRjYXJkICcqJyBjaGFyYWN0ZXJzLgotCSAqIFNpbmNlIHdpbGRjYXJkcyBhcmUgbm90IGJlaW5nIHVzZWQgaW4gdGhpcyBjYXNlLCB0aGUgcGF0dGVybiBjb25zaXN0cyBvZiBhIHNpbmdsZSBzZWdtZW50LgotCSAqLwotCXByaXZhdGUgdm9pZCBwYXJzZU5vV2lsZENhcmRzKCkgewotCQlmU2VnbWVudHM9IG5ldyBTdHJpbmdbMV07Ci0JCWZTZWdtZW50c1swXT0gZlBhdHRlcm47Ci0JCWZCb3VuZD0gZkxlbmd0aDsKLQl9Ci0JLyoqCi0JICogUGFyc2VzIHRoZSBnaXZlbiBwYXR0ZXJuIGludG8gc2VnbWVudHMgc2VwZXJhdGVkIGJ5IHdpbGRjYXJkICcqJyBjaGFyYWN0ZXJzLgotCSAqLwotCXByaXZhdGUgdm9pZCBwYXJzZVdpbGRDYXJkcygpIHsKLQkJaWYoZlBhdHRlcm4uc3RhcnRzV2l0aCgiKiIpKS8vJE5PTi1OTFMtMSQKLQkJCWZIYXNMZWFkaW5nU3Rhcj0gdHJ1ZTsKLQkJaWYoZlBhdHRlcm4uZW5kc1dpdGgoIioiKSkgey8vJE5PTi1OTFMtMSQKLQkJCS8qIG1ha2Ugc3VyZSBpdCdzIG5vdCBhbiBlc2NhcGVkIHdpbGRjYXJkICovCi0JCQlpZiAoZkxlbmd0aCA+IDEgJiYgZlBhdHRlcm4uY2hhckF0KGZMZW5ndGggLSAyKSAhPSAnXFwnKSB7Ci0JCQkJZkhhc1RyYWlsaW5nU3Rhcj0gdHJ1ZTsKLQkJCX0KLQkJfQotCi0JCVZlY3RvcjxTdHJpbmc+IHRlbXA9IG5ldyBWZWN0b3I8U3RyaW5nPigpOwotCi0JCWludCBwb3M9IDA7Ci0JCVN0cmluZ0J1ZmZlciBidWY9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJd2hpbGUgKHBvcyA8IGZMZW5ndGgpIHsKLQkJCWNoYXIgYz0gZlBhdHRlcm4uY2hhckF0KHBvcysrKTsKLQkJCXN3aXRjaCAoYykgewotCQkJCWNhc2UgJ1xcJzoKLQkJCQkJaWYgKHBvcyA+PSBmTGVuZ3RoKSB7Ci0JCQkJCQlidWYuYXBwZW5kKGMpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJY2hhciBuZXh0PSBmUGF0dGVybi5jaGFyQXQocG9zKyspOwotCQkJCQkJLyogaWYgaXQncyBhbiBlc2NhcGUgc2VxdWVuY2UgKi8KLQkJCQkJCWlmIChuZXh0ID09ICcqJyB8fCBuZXh0ID09ICc/JyB8fCBuZXh0ID09ICdcXCcpIHsKLQkJCQkJCQlidWYuYXBwZW5kKG5leHQpOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkvKiBub3QgYW4gZXNjYXBlIHNlcXVlbmNlLCBqdXN0IGluc2VydCBsaXRlcmFsbHkgKi8KLQkJCQkJCQlidWYuYXBwZW5kKGMpOwotCQkJCQkJCWJ1Zi5hcHBlbmQobmV4dCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQlicmVhazsKLQkJCQljYXNlICcqJzoKLQkJCQkJaWYgKGJ1Zi5sZW5ndGgoKSA+IDApIHsKLQkJCQkJCS8qIG5ldyBzZWdtZW50ICovCi0JCQkJCQl0ZW1wLmFkZEVsZW1lbnQoYnVmLnRvU3RyaW5nKCkpOwotCQkJCQkJZkJvdW5kICs9IGJ1Zi5sZW5ndGgoKTsKLQkJCQkJCWJ1Zi5zZXRMZW5ndGgoMCk7Ci0JCQkJCX0KLQkJCQlicmVhazsKLQkJCQljYXNlICc/JzoKLQkJCQkJLyogYXBwZW5kIHNwZWNpYWwgY2hhcmFjdGVyIHJlcHJlc2VudGluZyBzaW5nbGUgbWF0Y2ggd2lsZGNhcmQgKi8KLQkJCQkJYnVmLmFwcGVuZChmU2luZ2xlV2lsZENhcmQpOwotCQkJCWJyZWFrOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCWJ1Zi5hcHBlbmQoYyk7Ci0JCQl9Ci0JCX0KLQotCQkvKiBhZGQgbGFzdCBidWZmZXIgdG8gc2VnbWVudCBsaXN0ICovCi0JCWlmIChidWYubGVuZ3RoKCkgPiAwKSB7Ci0JCQl0ZW1wLmFkZEVsZW1lbnQoYnVmLnRvU3RyaW5nKCkpOwotCQkJZkJvdW5kICs9IGJ1Zi5sZW5ndGgoKTsKLQkJfQotCQkJCi0JCWZTZWdtZW50cz0gbmV3IFN0cmluZ1t0ZW1wLnNpemUoKV07Ci0JCXRlbXAuY29weUludG8oZlNlZ21lbnRzKTsKLQl9Ci0JLyoqIAotCSAqIEBwYXJhbSB0ZXh0IGEgc3RyaW5nIHdoaWNoIGNvbnRhaW5zIG5vIHdpbGRjYXJkCi0JICogQHBhcmFtIHN0YXJ0IHRoZSBzdGFydGluZyBpbmRleCBpbiB0aGUgdGV4dCBmb3Igc2VhcmNoLCBpbmNsdXNpdmUKLQkgKiBAcGFyYW0gZW5kIHRoZSBzdG9wcGluZyBwb2ludCBvZiBzZWFyY2gsIGV4Y2x1c2l2ZQotCSAqIEByZXR1cm4gdGhlIHN0YXJ0aW5nIGluZGV4IGluIHRoZSB0ZXh0IG9mIHRoZSBwYXR0ZXJuICwgb3IgLTEgaWYgbm90IGZvdW5kIAotCSAqLwotCXByb3RlY3RlZCBpbnQgcG9zSW4oU3RyaW5nIHRleHQsIGludCBzdGFydCwgaW50IGVuZCkgey8vbm8gd2lsZCBjYXJkIGluIHBhdHRlcm4KLQkJaW50IG1heD0gZW5kIC0gZkxlbmd0aDsKLQkJCi0JCWlmICghZklnbm9yZUNhc2UpIHsKLQkJCWludCBpPSB0ZXh0LmluZGV4T2YoZlBhdHRlcm4sIHN0YXJ0KTsKLQkJCWlmIChpID09IC0xIHx8IGkgPiBtYXgpCi0JCQkJcmV0dXJuIC0xOwotCQkJcmV0dXJuIGk7Ci0JCX0KLQkJCi0JCWZvciAoaW50IGk9IHN0YXJ0OyBpIDw9IG1heDsgKytpKSB7Ci0JCQlpZiAodGV4dC5yZWdpb25NYXRjaGVzKHRydWUsIGksIGZQYXR0ZXJuLCAwLCBmTGVuZ3RoKSkKLQkJCQlyZXR1cm4gaTsKLQkJfQotCQkKLQkJcmV0dXJuIC0xOwotCX0KLQkvKiogCi0JICogQHBhcmFtIHRleHQgYSBzaW1wbGUgcmVndWxhciBleHByZXNzaW9uIHRoYXQgbWF5IG9ubHkgY29udGFpbiAnPycocykKLQkgKiBAcGFyYW0gc3RhcnQgdGhlIHN0YXJ0aW5nIGluZGV4IGluIHRoZSB0ZXh0IGZvciBzZWFyY2gsIGluY2x1c2l2ZQotCSAqIEBwYXJhbSBlbmQgdGhlIHN0b3BwaW5nIHBvaW50IG9mIHNlYXJjaCwgZXhjbHVzaXZlCi0JICogQHBhcmFtIHAgYSBzaW1wbGUgcmVndWxhciBleHByZXNzaW9uIHRoYXQgbWF5IGNvbnRhaW5zICc/JwotCSAqIEByZXR1cm4gdGhlIHN0YXJ0aW5nIGluZGV4IGluIHRoZSB0ZXh0IG9mIHRoZSBwYXR0ZXJuICwgb3IgLTEgaWYgbm90IGZvdW5kIAotCSAqLwotCXByb3RlY3RlZCBpbnQgcmVnRXhwUG9zSW4oU3RyaW5nIHRleHQsIGludCBzdGFydCwgaW50IGVuZCwgU3RyaW5nIHApIHsKLQkJaW50IHBsZW49IHAubGVuZ3RoKCk7Ci0JCQotCQlpbnQgbWF4PSBlbmQgLSBwbGVuOwotCQlmb3IgKGludCBpPSBzdGFydDsgaSA8PSBtYXg7ICsraSkgewotCQkJaWYgKHJlZ0V4cFJlZ2lvbk1hdGNoZXModGV4dCwgaSwgcCwgMCwgcGxlbikpCi0JCQkJcmV0dXJuIGk7Ci0JCX0KLQkJcmV0dXJuIC0xOwotCX0KLQotCQotCXByb3RlY3RlZCBib29sZWFuIHJlZ0V4cFJlZ2lvbk1hdGNoZXMoU3RyaW5nIHRleHQsIGludCB0U3RhcnQsIFN0cmluZyBwLCBpbnQgcFN0YXJ0LCBpbnQgcGxlbikgewotCQl3aGlsZSAocGxlbi0tID4gMCkgewotCQkJY2hhciB0Y2hhcj0gdGV4dC5jaGFyQXQodFN0YXJ0KyspOwotCQkJY2hhciBwY2hhcj0gcC5jaGFyQXQocFN0YXJ0KyspOwotCi0JCQkvKiBwcm9jZXNzIHdpbGQgY2FyZHMgKi8KLQkJCWlmICghZklnbm9yZVdpbGRDYXJkcykgewotCQkJCS8qIHNraXAgc2luZ2xlIHdpbGQgY2FyZHMgKi8KLQkJCQlpZiAocGNoYXIgPT0gZlNpbmdsZVdpbGRDYXJkKSB7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCX0KLQkJCWlmIChwY2hhciA9PSB0Y2hhcikKLQkJCQljb250aW51ZTsKLQkJCWlmIChmSWdub3JlQ2FzZSkgewotCQkJCWlmIChDaGFyYWN0ZXIudG9VcHBlckNhc2UodGNoYXIpID09IENoYXJhY3Rlci50b1VwcGVyQ2FzZShwY2hhcikpCi0JCQkJCWNvbnRpbnVlOwotCQkJCS8vIGNvbXBhcmluZyBhZnRlciBjb252ZXJ0aW5nIHRvIHVwcGVyIGNhc2UgZG9lc24ndCBoYW5kbGUgYWxsIGNhc2VzOwotCQkJCS8vIGFsc28gY29tcGFyZSBhZnRlciBjb252ZXJ0aW5nIHRvIGxvd2VyIGNhc2UKLQkJCQlpZiAoQ2hhcmFjdGVyLnRvTG93ZXJDYXNlKHRjaGFyKSA9PSBDaGFyYWN0ZXIudG9Mb3dlckNhc2UocGNoYXIpKQotCQkJCQljb250aW51ZTsKLQkJCX0KLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JLyoqIAotCSAqIEBwYXJhbSB0ZXh0IHRoZSBzdHJpbmcgdG8gbWF0Y2gKLQkgKiBAcGFyYW0gc3RhcnQgdGhlIHN0YXJ0aW5nIGluZGV4IGluIHRoZSB0ZXh0IGZvciBzZWFyY2gsIGluY2x1c2l2ZQotCSAqIEBwYXJhbSBlbmQgdGhlIHN0b3BwaW5nIHBvaW50IG9mIHNlYXJjaCwgZXhjbHVzaXZlCi0JICogQHBhcmFtIHAgYSBzdHJpbmcgdGhhdCBoYXMgbm8gd2lsZGNhcmQKLQkgKiBAcmV0dXJuIHRoZSBzdGFydGluZyBpbmRleCBpbiB0aGUgdGV4dCBvZiB0aGUgcGF0dGVybiAsIG9yIC0xIGlmIG5vdCBmb3VuZCAKLQkgKi8KLQlwcm90ZWN0ZWQgaW50IHRleHRQb3NJbihTdHJpbmcgdGV4dCwgaW50IHN0YXJ0LCBpbnQgZW5kLCBTdHJpbmcgcCkgeyAKLQkJCi0JCWludCBwbGVuPSBwLmxlbmd0aCgpOwotCQlpbnQgbWF4PSBlbmQgLSBwbGVuOwotCQkKLQkJaWYgKCFmSWdub3JlQ2FzZSkgewotCQkJaW50IGk9IHRleHQuaW5kZXhPZihwLCBzdGFydCk7Ci0JCQlpZiAoaSA9PSAtMSB8fCBpID4gbWF4KQotCQkJCXJldHVybiAtMTsKLQkJCXJldHVybiBpOwotCQl9Ci0JCQotCQlmb3IgKGludCBpPSBzdGFydDsgaSA8PSBtYXg7ICsraSkgewotCQkJaWYgKHRleHQucmVnaW9uTWF0Y2hlcyh0cnVlLCBpLCBwLCAwLCBwbGVuKSkKLQkJCQlyZXR1cm4gaTsKLQkJfQotCQkKLQkJcmV0dXJuIC0xOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZ1tdIGNvbnZlcnRGcm9tU3RyaW5nKFN0cmluZyBwYXR0ZXJucywgU3RyaW5nIHNlcGFyYXRvcikgewotCQlTdHJpbmdUb2tlbml6ZXIgdG9rZW5pemVyPSBuZXcgU3RyaW5nVG9rZW5pemVyKHBhdHRlcm5zLCBzZXBhcmF0b3IsIHRydWUpOwotCQlpbnQgdG9rZW5Db3VudD0gdG9rZW5pemVyLmNvdW50VG9rZW5zKCk7Ci0JCUxpc3Q8U3RyaW5nPiByZXN1bHQ9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPih0b2tlbkNvdW50KTsKLQkJYm9vbGVhbiBlc2NhcGU9IGZhbHNlOwotCQlib29sZWFuIGFwcGVuZD0gZmFsc2U7Ci0JCXdoaWxlICh0b2tlbml6ZXIuaGFzTW9yZVRva2VucygpKSB7Ci0JCQlTdHJpbmcgdG9rZW49IHRva2VuaXplci5uZXh0VG9rZW4oKS50cmltKCk7Ci0JCQlpZiAoc2VwYXJhdG9yLmVxdWFscyh0b2tlbikpIHsKLQkJCQlpZiAoIWVzY2FwZSkKLQkJCQkJZXNjYXBlPSB0cnVlOwotCQkJCWVsc2UgewotCQkJCQlhZGRQYXR0ZXJuKHJlc3VsdCwgc2VwYXJhdG9yKTsKLQkJCQkJYXBwZW5kPSB0cnVlOwotCQkJCX0KLQkJCX0gZWxzZSAgewotCQkJCWlmICghYXBwZW5kKQotIAkJCQkJcmVzdWx0LmFkZCh0b2tlbik7Ci0JCQkJZWxzZQotCQkJCQlhZGRQYXR0ZXJuKHJlc3VsdCwgdG9rZW4pOwotCQkJCWFwcGVuZD0gZmFsc2U7Ci0JCQkJZXNjYXBlPSBmYWxzZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gKFN0cmluZ1tdKXJlc3VsdC50b0FycmF5KG5ldyBTdHJpbmdbcmVzdWx0LnNpemUoKV0pOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyB2b2lkIGFkZFBhdHRlcm4oTGlzdDxTdHJpbmc+IGxpc3QsIFN0cmluZyBwYXR0ZXJuKSB7Ci0JCWlmIChsaXN0LmlzRW1wdHkoKSkKLQkJCWxpc3QuYWRkKHBhdHRlcm4pOwotCQllbHNlIHsKLQkJCWludCBpbmRleD0gbGlzdC5zaXplKCkgLSAxOwotCQkJbGlzdC5zZXQoaW5kZXgsICgoU3RyaW5nKWxpc3QuZ2V0KGluZGV4KSkgKyBwYXR0ZXJuKTsKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbnZlcnRUb1N0cmluZyhTdHJpbmdbXSBwYXR0ZXJucywgU3RyaW5nIHNlcGFyYXRvcikgewotCQlpbnQgbGVuZ3RoPSBwYXR0ZXJucy5sZW5ndGg7Ci0JCVN0cmluZ0J1ZmZlciBzdHJCdWY9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJaWYgKGxlbmd0aCA+IDApCi0JCQlzdHJCdWYuYXBwZW5kKGVzY2FwZVNlcGFyYXRvcihwYXR0ZXJuc1swXSwgc2VwYXJhdG9yKSk7Ci0JCWVsc2UKLQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCQlpbnQgaT0gMTsKLQkJd2hpbGUgKGkgPCBsZW5ndGgpIHsKLQkJCXN0ckJ1Zi5hcHBlbmQoc2VwYXJhdG9yKTsKLQkJCXN0ckJ1Zi5hcHBlbmQoIiAiKTsgLy8kTk9OLU5MUy0xJAotCQkJc3RyQnVmLmFwcGVuZChlc2NhcGVTZXBhcmF0b3IocGF0dGVybnNbaSsrXSwgc2VwYXJhdG9yKSk7Ci0JCX0KLQkJcmV0dXJuIHN0ckJ1Zi50b1N0cmluZygpOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZXNjYXBlU2VwYXJhdG9yKFN0cmluZyBwYXR0ZXJuLCBTdHJpbmcgc2VwYXJhdG9yKSB7Ci0JCWludCBsZW5ndGg9IHBhdHRlcm4ubGVuZ3RoKCk7Ci0JCVN0cmluZ0J1ZmZlciBidWY9IG5ldyBTdHJpbmdCdWZmZXIobGVuZ3RoKTsKLQkJZm9yIChpbnQgaT0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0JCQljaGFyIGNoPSBwYXR0ZXJuLmNoYXJBdChpKTsgCi0JCQlpZiAoc2VwYXJhdG9yLmVxdWFscyhTdHJpbmcudmFsdWVPZihjaCkpKQotCQkJCWJ1Zi5hcHBlbmQoY2gpOwotCQkJYnVmLmFwcGVuZChjaCk7Ci0JCX0KLQkJcmV0dXJuIGJ1Zi50b1N0cmluZygpOwotCQkKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmdbXSBjb252ZXJ0RnJvbVN0cmluZyhTdHJpbmcgcGF0dGVybnMpIHsKLQkJcmV0dXJuIGNvbnZlcnRGcm9tU3RyaW5nKHBhdHRlcm5zLCBTRVBBUkFUT1IpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTRVBBUkFUT1I9ICIsIjsgIC8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vdXRpbHMvVGhyZWFkVXRpbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi91dGlscy9UaHJlYWRVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1YjQyM2EuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi91dGlscy9UaHJlYWRVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzOwotCi0vKioKLSAqIFV0aWxpdHkgY2xhc3MgZm9yIGhhbmRsaW5nIHRocmVhZHMuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgVGhyZWFkVXRpbCB7Ci0KLQkvKioKLQkgKiBQcml2YXRlIGNvbnN0cnVjdG9yIHRvIHByZXZlbnQgdGhpcyBjbGFzcyBmcm9tIGJlaW5nIGluc3RhbnRpYXRlZC4gQWxsCi0JICogbWV0aG9kcyBpbiB0aGlzIGNsYXNzIHNob3VsZCBiZSBzdGF0aWMuCi0JICovCi0JcHJpdmF0ZSBUaHJlYWRVdGlsKCkgewotCX0KLQotCS8qKgotCSAqIFB1dHMgdGhlIGN1cnJlbnQgdGhyZWFkIHRvIHNsZWVwIGZvciBhIGdpdmVuIGR1cmF0aW9uLgotCSAqIAotCSAqIEBwYXJhbSB0aW1lCi0JICogICAgICAgICAgICBUaGUgZHVyYXRpb24gaW4gbWlsbGlzZWNvbmRzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBwYXVzZShsb25nIHRpbWUpIHsKLQkJdHJ5IHsKLQkJCVRocmVhZC5zbGVlcCh0aW1lKTsKLQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3V0aWxzL1RpbWVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3V0aWxzL1RpbWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5ZjI5OGEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi91dGlscy9UaW1lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlsczsKLWltcG9ydCBjb20uaWJtLmljdS51dGlsLkNhbGVuZGFyOwotCi0vKioKLSAqIEEgc2ltcGxlIHRpbWVyIGZvciB0cmFja2luZyB0aW1lLgotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgVGltZXIgewotCi0JcHJpdmF0ZSBsb25nIGluaXRUaW1lOwotCi0JcHJpdmF0ZSBsb25nIHN0YXJ0VGltZTsKLQotCXByaXZhdGUgbG9uZyBlbmRUaW1lOwotCi0JcHVibGljIFRpbWVyKCkgewotCQlzdGFydCgpOwotCQlpbml0VGltZSA9IHN0YXJ0VGltZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzdGFydCgpIHsKLQkJc3RhcnRUaW1lID0gQ2FsZW5kYXIuZ2V0SW5zdGFuY2UoKS5nZXRUaW1lSW5NaWxsaXMoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzdG9wKCkgewotCQllbmRUaW1lID0gQ2FsZW5kYXIuZ2V0SW5zdGFuY2UoKS5nZXRUaW1lSW5NaWxsaXMoKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFRpbWUoKSB7Ci0JCXJldHVybiAoaW50KSAoZW5kVGltZSAtIHN0YXJ0VGltZSk7Ci0JfQotCi0JcHVibGljIGludCBnZXRUb3RhbFRpbWUoKSB7Ci0JCXJldHVybiAoaW50KSAoZW5kVGltZSAtIGluaXRUaW1lKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vdXRpbHMvV2FyVXRpbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi91dGlscy9XYXJVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyZGNlZmIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi91dGlscy9XYXJVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuV2FyOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLkZpbGVTZXQ7Ci0KLQotcHVibGljIGNsYXNzIFdhclV0aWwgewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIHdhciBmaWxlLgotCSAqIAotCSAqIEBwYXJhbSBvdXRwdXRXYXJGaWxlCi0JICogICAgICAgICAgICBhbiBhYnNvbHV0ZSBwYXRoIHRvIHRoZSB0YXJnZXQgd2FyIGZpbGUKLQkgKiBAcGFyYW0gd2ViQXBwRGlyZWN0b3J5Ci0JICogICAgICAgICAgICBhbiBhYnNvbHV0ZSBwYXRoIHRvIGEgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIGZpbGVzIGFuZCBzdWIKLQkgKiAgICAgICAgICAgIGRpcmVjdG9yaWVzIHRvIGJlIHdhcmVkCi0JICogQHBhcmFtIG1vbml0b3IKLQkgKiAgICAgICAgICAgIGEgcHJvZ3Jlc3MgbW9uaXRvcgotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUgY3JlYXRpbmcgdGhlIHppcCBmaWxlCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGJ1aWxkV2FyRmlsZShTdHJpbmcgb3V0cHV0V2FyRmlsZSwgU3RyaW5nIHdlYkFwcERpcmVjdG9yeSwKLQkJCUlQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQotCQl0cnkgewotCQkJUHJvamVjdCBhbnRQcm9qZWN0ID0gbmV3IFByb2plY3QoKTsKLQkJCWFudFByb2plY3QuaW5pdCgpOwotCQkJV2FyIHdhclRhc2sgPSBuZXcgV2FyKCk7Ci0JCQl3YXJUYXNrLnNldFByb2plY3QoYW50UHJvamVjdCk7Ci0JCQl3YXJUYXNrLnNldERlc3RGaWxlKG5ldyBGaWxlKG91dHB1dFdhckZpbGUpKTsKLQkJCXdhclRhc2suc2V0V2VieG1sKG5ldyBGaWxlKHdlYkFwcERpcmVjdG9yeSArIEZpbGUuc2VwYXJhdG9yICsgIldFQi1JTkYiIC8vJE5PTi1OTFMtMSQKLQkJCQkJKyBGaWxlLnNlcGFyYXRvciArICJ3ZWIueG1sIikpOyAvLyROT04tTkxTLTEkCi0JCQlGaWxlU2V0IHdlYkZpbGVzID0gbmV3IEZpbGVTZXQoKTsKLQkJCXdlYkZpbGVzLnNldERpcihuZXcgRmlsZSh3ZWJBcHBEaXJlY3RvcnkpKTsKLQkJCXdhclRhc2suYWRkRmlsZXNldCh3ZWJGaWxlcyk7Ci0JCQl3YXJUYXNrLmV4ZWN1dGUoKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7Ci0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi91dGlscy9YTUxVdGlsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3V0aWxzL1hNTFV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWM4MmEzNy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3V0aWxzL1hNTFV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzOwotCi1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5EYXRhT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlckZhY3Rvcnk7Ci0KLWltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYUGFyc2VFeGNlcHRpb247Ci0KLS8qKgotICogVXRpbGl0eSBjbGFzcyBmb3IgcHJvY2Vzc2luZyBYTUwgZG9jdW1lbnRzLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgWE1MVXRpbCB7Ci0KLQkvKioKLQkgKiBYTUwgZGVjbGFyYXRpb24uCi0JICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgWE1MX0RFQ0xBUkFUSU9OID0gIjw/eG1sIHZlcnNpb249XCIxLjBcIiBlbmNvZGluZz1cIlVURi04XCI/PiI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFhNTCBFc2NhcGUgY2hhcmFjdGVycy4KLQkgKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBYTUxfQU1QID0gIiZhbXA7IjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgWE1MX0JBQ0tTTEFTSCA9ICImIzkyOyI7IC8vJE5PTi1OTFMtMSQJCi0KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBYTUxfQVBPUyA9ICImYXBvczsiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBYTUxfQ1IgPSAiJiMxMzsiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBYTUxfR1QgPSAiJmd0OyI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFhNTF9MVCA9ICImbHQ7IjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgWE1MX0xGID0gIiYjMTA7IjsgLy8kTk9OLU5MUy0xJAkKLQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFhNTF9RVU9UID0gIiZxdW90OyI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFhNTF9UQUIgPSAiJiM5OyI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDUkxGID0gIlxyXG4iOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlW10gQ1JMRl9CWVRFUyA9IENSTEYuZ2V0Qnl0ZXMoKTsKLQotCS8qKgotCSAqIFByaXZhdGUgY29uc3RydWN0b3IgdG8gcHJldmVudCB0aGlzIGNsYXNzIGZyb20gYmVpbmcgaW5zdGFudGlhdGVkLiBBbGwKLQkgKiBtZXRob2RzIGluIHRoaXMgY2xhc3Mgc2hvdWxkIGJlIHN0YXRpYy4KLQkgKi8KLQlwcml2YXRlIFhNTFV0aWwoKSB7Ci0JfQotCi0JLyoqCi0JICogQ2xvbmVzIHRoZSBnaXZlbiBET00gbm9kZSBpbnRvIHRoZSBnaXZlbiBET00gZG9jdW1lbnQuCi0JICogCi0JICogQHBhcmFtIG5vZGUKLQkgKiAgICAgICAgICAgIFRoZSBET00gbm9kZSB0byBjbG9uZS4KLQkgKiBAcGFyYW0gZG9jCi0JICogICAgICAgICAgICBUaGUgdGFyZ2V0IERPTSBkb2N1bWVudC4KLQkgKiBAcmV0dXJuIFRoZSBjbG9uZWQgbm9kZSBpbiB0aGUgdGFyZ2V0IERPTSBkb2N1bWVudC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE5vZGUgY2xvbmVOb2RlKE5vZGUgbm9kZSwgRG9jdW1lbnQgZG9jKSB7Ci0JCU5vZGUgY2xvbmUgPSBudWxsOwotCQlzd2l0Y2ggKG5vZGUuZ2V0Tm9kZVR5cGUoKSkgewotCQljYXNlIE5vZGUuRUxFTUVOVF9OT0RFOgotCQkJY2xvbmUgPSBkb2MuY3JlYXRlRWxlbWVudChub2RlLmdldE5vZGVOYW1lKCkpOwotCQkJTmFtZWROb2RlTWFwIGF0dHJzID0gbm9kZS5nZXRBdHRyaWJ1dGVzKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGF0dHJzLmdldExlbmd0aCgpOyBpKyspIHsKLQkJCQlOb2RlIGF0dHJOb2RlID0gYXR0cnMuaXRlbShpKTsKLQkJCQlBdHRyIGF0dHJDbG9uZSA9IGRvYy5jcmVhdGVBdHRyaWJ1dGUoYXR0ck5vZGUuZ2V0Tm9kZU5hbWUoKSk7Ci0JCQkJYXR0ckNsb25lLnNldE5vZGVWYWx1ZShhdHRyTm9kZS5nZXROb2RlVmFsdWUoKSk7Ci0JCQkJKChFbGVtZW50KSBjbG9uZSkuc2V0QXR0cmlidXRlTm9kZShhdHRyQ2xvbmUpOwotCQkJfQotCi0JCQkvLyBJdGVyYXRlIHRocm91Z2ggZWFjaCBjaGlsZCBub2Rlcy4KLQkJCU5vZGVMaXN0IGNoaWxkTm9kZXMgPSBub2RlLmdldENoaWxkTm9kZXMoKTsKLQkJCWlmIChjaGlsZE5vZGVzICE9IG51bGwpIHsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkTm9kZXMuZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJCQlOb2RlIGNoaWxkTm9kZSA9IGNoaWxkTm9kZXMuaXRlbShpKTsKLQkJCQkJTm9kZSBjaGlsZENsb25lID0gY2xvbmVOb2RlKGNoaWxkTm9kZSwgZG9jKTsKLQkJCQkJY2xvbmUuYXBwZW5kQ2hpbGQoY2hpbGRDbG9uZSk7Ci0JCQkJfQotCQkJfQotCQkJYnJlYWs7Ci0KLQkJY2FzZSBOb2RlLlRFWFRfTk9ERToKLQkJY2FzZSBOb2RlLkNEQVRBX1NFQ1RJT05fTk9ERToKLQkJCWNsb25lID0gZG9jLmNyZWF0ZVRleHROb2RlKG5vZGUuZ2V0Tm9kZU5hbWUoKSk7Ci0JCQljbG9uZS5zZXROb2RlVmFsdWUobm9kZS5nZXROb2RlVmFsdWUoKSk7Ci0JCQlicmVhazsKLQkJfQotCQlyZXR1cm4gY2xvbmU7Ci0JfQotCi0JLyoqCi0JICogRXNjYXBlcyBhIFhNTCBhdHRyaWJ1dGUgdG8gbWFrZSBpdCBYTUwgcGFyc2VyIGZyaWVuZGx5LgotCSAqIAotCSAqIEBwYXJhbSBzdHIKLQkgKiAgICAgICAgICAgIFRoZSBYTUwgYXR0cmlidXRlIHN0cmluZy4KLQkgKiBAcmV0dXJuIFRoZSBlc2NhcGVkIHN0cmluZy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlc2NhcGVBdHRyKFN0cmluZyBzdHIpIHsKLQkJaWYgKHN0ciA9PSBudWxsIHx8IHN0ci5sZW5ndGgoKSA9PSAwKQotCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJaW50IGxlbiA9IHN0ci5sZW5ndGgoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgewotCQkJY2hhciBjaCA9IHN0ci5jaGFyQXQoaSk7Ci0JCQlzd2l0Y2ggKGNoKSB7Ci0JCQljYXNlICc8JzoKLQkJCQlzYi5hcHBlbmQoWE1MX0xUKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgJyYnOgotCQkJCXNiLmFwcGVuZChYTUxfQU1QKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgJyInOgotCQkJCXNiLmFwcGVuZChYTUxfUVVPVCk7Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0OgotCQkJCXNiLmFwcGVuZChjaCk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogRXNjYXBlcyB0aGUgZ2l2ZW4gc3RyaW5nIHRvIG1ha2UgaXQgWE1MIHBhcnNlciBmcmllbmRseS4KLQkgKiAKLQkgKiBAcGFyYW0gc3RyCi0JICogICAgICAgICAgICBUaGUgc291cmNlIHN0cmluZy4KLQkgKiBAcmV0dXJuIFRoZSBlc2NhcGVkIHN0cmluZy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlc2NhcGUoU3RyaW5nIHN0cikgewotCQlpZiAoc3RyID09IG51bGwgfHwgc3RyLmxlbmd0aCgpID09IDApCi0JCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlpbnQgbGVuID0gc3RyLmxlbmd0aCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0JCQljaGFyIGNoID0gc3RyLmNoYXJBdChpKTsKLQkJCXN3aXRjaCAoY2gpIHsKLQkJCWNhc2UgJzwnOgotCQkJCXNiLmFwcGVuZChYTUxfTFQpOwotCQkJCWJyZWFrOwotCQkJY2FzZSAnPic6Ci0JCQkJc2IuYXBwZW5kKFhNTF9HVCk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlICcmJzoKLQkJCQlzYi5hcHBlbmQoWE1MX0FNUCk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlICciJzoKLQkJCQlzYi5hcHBlbmQoWE1MX1FVT1QpOwotCQkJCWJyZWFrOwotCQkJY2FzZSAnXCcnOgotCQkJCXNiLmFwcGVuZChYTUxfQVBPUyk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlICdccic6Ci0JCQkJc2IuYXBwZW5kKFhNTF9DUik7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlICdcbic6Ci0JCQkJc2IuYXBwZW5kKFhNTF9MRik7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlICdcXCc6Ci0JCQkJc2IuYXBwZW5kKFhNTF9CQUNLU0xBU0gpOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCQlzYi5hcHBlbmQoY2gpOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCXJldHVybiBzYi50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIEVzY2FwZXMgdGhlIGdpdmVuIHN0cmluZyB0byBtYWtlIGl0IFhNTCBwYXJzZXIgZnJpZW5kbHkuCi0JICogCi0JICogQHBhcmFtIHN0cgotCSAqICAgICAgICAgICAgVGhlIHNvdXJjZSBzdHJpbmcuCi0JICogQHBhcmFtIGlnbm9yZUNSTEYKLQkgKiAgICAgICAgICAgIElmIHRydWUsIGRvIG5vdCBlc2NhcGUgdGhlIENSIGFuZCBMRiBjaGFyYWN0ZXJzLgotCSAqIEByZXR1cm4gVGhlIGVzY2FwZWQgc3RyaW5nLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVzY2FwZShTdHJpbmcgc3RyLCBib29sZWFuIGlnbm9yZUNSTEYpIHsKLQkJaWYgKHN0ciA9PSBudWxsIHx8IHN0ci5sZW5ndGgoKSA9PSAwKQotCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJaW50IGxlbiA9IHN0ci5sZW5ndGgoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgewotCQkJY2hhciBjaCA9IHN0ci5jaGFyQXQoaSk7Ci0JCQlzd2l0Y2ggKGNoKSB7Ci0JCQljYXNlICc8JzoKLQkJCQlzYi5hcHBlbmQoWE1MX0xUKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgJz4nOgotCQkJCXNiLmFwcGVuZChYTUxfR1QpOwotCQkJCWJyZWFrOwotCQkJY2FzZSAnJic6Ci0JCQkJLy8gVGhpcyBpcyB0byBhdm9pZCB0aGUgZG91YmxlIGVzY2FwaW5nIChzZWUgQnVnemlsbGEgMTc5OTIxKQotCQkJCWlmICghc3RyLnN0YXJ0c1dpdGgoWE1MX0xUKyJwLyIsIGkpICYmICFzdHIuc3RhcnRzV2l0aChYTUxfQVBPUywgaSkgLy8kTk9OLU5MUy0xJCAKLQkJCQkJCSYmICFzdHIuc3RhcnRzV2l0aChYTUxfQU1QLCBpKSkKLQkJCQkJc2IuYXBwZW5kKFhNTF9BTVApOwotCQkJCWVsc2UKLQkJCQkJc2IuYXBwZW5kKGNoKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgJyInOgotCQkJCXNiLmFwcGVuZChYTUxfUVVPVCk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlICdcJyc6Ci0JCQkJc2IuYXBwZW5kKFhNTF9BUE9TKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgJ1xyJzoKLQkJCQlpZiAoaWdub3JlQ1JMRikKLQkJCQkJc2IuYXBwZW5kKGNoKTsKLQkJCQllbHNlCi0JCQkJCXNiLmFwcGVuZChYTUxfQ1IpOwotCQkJCWJyZWFrOwotCQkJY2FzZSAnXG4nOgotCQkJCWlmIChpZ25vcmVDUkxGKQotCQkJCQlzYi5hcHBlbmQoY2gpOwotCQkJCWVsc2UKLQkJCQkJc2IuYXBwZW5kKFhNTF9MRik7Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0OgotCQkJCXNiLmFwcGVuZChjaCk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogVW5lc2NhcGVzIHRoZSBnaXZlbiBYTUwgc3RyaW5nLgotCSAqIAotCSAqIEBwYXJhbSBzdHIKLQkgKiAgICAgICAgICAgIFRoZSBzb3VyY2Ugc3RyaW5nLgotCSAqIEByZXR1cm4gVGhlIGVzY2FwZWQgc3RyaW5nLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHVuZXNjYXBlKFN0cmluZyBzdHIpIHsKLQkJaWYgKHN0ciA9PSBudWxsIHx8IHN0ci5sZW5ndGgoKSA9PSAwKQotCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJaW50IGxlbiA9IHN0ci5sZW5ndGgoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgewotCQkJY2hhciBjaCA9IHN0ci5jaGFyQXQoaSk7Ci0JCQlzd2l0Y2ggKGNoKSB7Ci0JCQljYXNlICcmJzoKLQkJCQlpZiAoc3RyLnN0YXJ0c1dpdGgoWE1MX0xULCBpKSkgewotCQkJCQlzYi5hcHBlbmQoJzwnKTsKLQkJCQkJaSArPSAzOwotCQkJCX0gZWxzZSBpZiAoc3RyLnN0YXJ0c1dpdGgoWE1MX0dULCBpKSkgewotCQkJCQlzYi5hcHBlbmQoJz4nKTsKLQkJCQkJaSArPSAzOwotCQkJCX0gZWxzZSBpZiAoc3RyLnN0YXJ0c1dpdGgoWE1MX0FNUCwgaSkpIHsKLQkJCQkJc2IuYXBwZW5kKCcmJyk7Ci0JCQkJCWkgKz0gNDsKLQkJCQl9IGVsc2UgaWYgKHN0ci5zdGFydHNXaXRoKFhNTF9RVU9ULCBpKSkgewotCQkJCQlzYi5hcHBlbmQoJyInKTsKLQkJCQkJaSArPSA1OwotCQkJCX0gZWxzZSBpZiAoc3RyLnN0YXJ0c1dpdGgoWE1MX0FQT1MsIGkpKSB7Ci0JCQkJCXNiLmFwcGVuZCgiXCciKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlpICs9IDU7Ci0JCQkJfSBlbHNlIGlmIChzdHIuc3RhcnRzV2l0aChYTUxfQ1IsIGkpKSB7Ci0JCQkJCXNiLmFwcGVuZCgnXHInKTsKLQkJCQkJaSArPSA0OwotCQkJCX0gZWxzZSBpZiAoc3RyLnN0YXJ0c1dpdGgoWE1MX0xGLCBpKSkgewotCQkJCQlzYi5hcHBlbmQoJ1xuJyk7Ci0JCQkJCWkgKz0gNDsKLQkJCQl9IGVsc2UgewotCQkJCQlzYi5hcHBlbmQoY2gpOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCWRlZmF1bHQ6Ci0JCQkJc2IuYXBwZW5kKGNoKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBXcml0ZXMgdGhlIGNvbnRlbnQgb2YgdGhlIGdpdmVuIERPTSBkb2N1bWVudCB0byB0aGUgb3V0cHV0IHN0cmVhbS4KLQkgKiAKLQkgKiBAcGFyYW0geG1sRG9jCi0JICogICAgICAgICAgICBUaGUgRE9NIGRvY3VtZW50LgotCSAqIEBwYXJhbSBvdXRwdXQKLQkgKiAgICAgICAgICAgIFRoZSBvdXRwdXQgc3RyZWFtLgotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBpZiBhbiBJL08gZXJyb3Igb2NjdXIgd2hpbGUgYWNjZXNzaW5nIHRoZSBvdXRwdXQgc3RyZWFtLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCB3cml0ZURvY3VtZW50KERvY3VtZW50IHhtbERvYywgT3V0cHV0U3RyZWFtIG91dHB1dCkKLQkJCXRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCURhdGFPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IERhdGFPdXRwdXRTdHJlYW0ob3V0cHV0KTsKLQkJd3JpdGVOb2RlKHhtbERvYywgIiIsIG91dCk7IC8vJE5PTi1OTFMtMSQKLQkJb3V0LmZsdXNoKCk7Ci0JfQotCi0JLyoqCi0JICogV3JpdGVzIHRoZSBjb250ZW50IG9mIHRoZSBnaXZlbiBET00gZG9jdW1lbnQgdG8gdGhlIFByaW50V3JpdGVyLgotCSAqIAotCSAqIEBwYXJhbSB4bWxEb2MKLQkgKiAgICAgICAgICAgIFRoZSBET00gZG9jdW1lbnQuCi0JICogQHBhcmFtIHB3Ci0JICogICAgICAgICAgICBUaGUgUHJpbnRXcml0ZXIgb2JqZWN0LgotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBpZiBhbiBJL08gZXJyb3Igb2NjdXIgd2hpbGUgYWNjZXNzaW5nIHRoZSBvdXRwdXQgc3RyZWFtLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCB3cml0ZURvY3VtZW50KERvY3VtZW50IHhtbERvYywgUHJpbnRXcml0ZXIgcHcpCi0JCQl0aHJvd3MgSU9FeGNlcHRpb24gewotCQlCeXRlQXJyYXlPdXRwdXRTdHJlYW0gb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0JCURhdGFPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IERhdGFPdXRwdXRTdHJlYW0ob3MpOwotCQl3cml0ZU5vZGUoeG1sRG9jLCAiIiwgb3V0KTsgLy8kTk9OLU5MUy0xJAotCQlvdXQuZmx1c2goKTsKLQkJLy8gRklYTUUhIE5lZWQgdG8gc3BlY2lmeSBlbmNvZGluZz8KLQkJU3RyaW5nIHMgPSBvcy50b1N0cmluZygpOwotCQlwdy53cml0ZShzKTsKLQkJcHcuZmx1c2goKTsKLQl9Ci0KLQkvKioKLQkgKiBTYXZlcyB0aGUgY29udGVudCBvZiB0aGUgZ2l2ZW4gRE9NIGRvY3VtZW50IHRvIGZpbGUuCi0JICogCi0JICogQHBhcmFtIHhtbERvYwotCSAqICAgICAgICAgICAgVGhlIERPTSBkb2N1bWVudC4KLQkgKiBAcGFyYW0geG1sRmlsZQotCSAqICAgICAgICAgICAgVGhlIFhNTCBmaWxlLgotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBpZiBhbiBJL08gZXJyb3Igb2NjdXIgd2hpbGUgYWNjZXNzaW5nIHRoZSBvdXRwdXQgc3RyZWFtLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzYXZlRG9jdW1lbnQoRG9jdW1lbnQgeG1sRG9jLCBTdHJpbmcgeG1sRmlsZSkKLQkJCXRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCURhdGFPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IERhdGFPdXRwdXRTdHJlYW0obmV3IEZpbGVPdXRwdXRTdHJlYW0oCi0JCQkJeG1sRmlsZSkpOwotCQl3cml0ZU5vZGUoeG1sRG9jLCAiIiwgb3V0KTsgLy8kTk9OLU5MUy0xJAotCQlvdXQuZmx1c2goKTsKLQkJb3V0LmNsb3NlKCk7Ci0JfQotCi0JLyoqCi0JICogU2F2ZXMgdGhlIGdpdmVuIFhNTCBzdHJpbmcgdG8gdGhlIGdpdmVuIGZpbGUuCi0JICogCi0JICogQHBhcmFtIHhtbFN0cgotCSAqICAgICAgICAgICAgVGhlIFhNTCBzdHJpbmcuCi0JICogQHBhcmFtIHhtbEZpbGUKLQkgKiAgICAgICAgICAgIFRoZSBYTUwgZmlsZS4KLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgaWYgYW4gSS9PIGVycm9yIG9jY3VyIHdoaWxlIGFjY2Vzc2luZyB0aGUgb3V0cHV0IHN0cmVhbS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2F2ZURvY3VtZW50KFN0cmluZyB4bWxTdHIsIFN0cmluZyB4bWxGaWxlKQotCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJRGF0YU91dHB1dFN0cmVhbSBvdXQgPSBuZXcgRGF0YU91dHB1dFN0cmVhbShuZXcgRmlsZU91dHB1dFN0cmVhbSgKLQkJCQl4bWxGaWxlKSk7Ci0JCW91dC53cml0ZSh4bWxTdHIuZ2V0Qnl0ZXMoKSk7Ci0JCW91dC5mbHVzaCgpOwotCQlvdXQuY2xvc2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBXcml0ZXMgdGhlIGdpdmVuIERPTSB0cmVlIG5vZGUgdG8gdGhlIGdpdmVuIG91dHB1dCBzdHJlYW0uCi0JICogCi0JICogQHBhcmFtIG5vZGUKLQkgKiAgICAgICAgICAgIFRoZSBET00gbm9kZS4KLQkgKiBAcGFyYW0gaW5kZW50Ci0JICogICAgICAgICAgICBUaGUgc3RyaW5nIGluZGVudGF0aW9uIChjb250YWluaW5nIHNwYWNlIGNoYXJhY3RlcnMpLgotCSAqIEBwYXJhbSBvdXQKLQkgKiAgICAgICAgICAgIFRoZSBvdXRwdXQgc3RyZWFtLgotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBpZiBhbiBJL08gZXJyb3Igb2NjdXIgd2hpbGUgYWNjZXNzaW5nIHRoZSBvdXRwdXQgc3RyZWFtLgotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgd3JpdGVOb2RlKE5vZGUgbm9kZSwgU3RyaW5nIGluZGVudCwgRGF0YU91dHB1dFN0cmVhbSBvdXQpCi0JCQl0aHJvd3MgSU9FeGNlcHRpb24gewotCQlTdHJpbmcgdGV4dDsKLQotCQlzd2l0Y2ggKG5vZGUuZ2V0Tm9kZVR5cGUoKSkgewotCQljYXNlIE5vZGUuRE9DVU1FTlRfTk9ERToKLQkJCS8vIFdyaXRlIHRoZSBYTUwgZmlsZSBzaWduYXR1cmUuCi0JCQlvdXQud3JpdGUoU3RyVXRpbC5nZXRVVEY4Qnl0ZXMoWE1MX0RFQ0xBUkFUSU9OKSk7Ci0JCQlvdXQud3JpdGUoQ1JMRl9CWVRFUyk7Ci0KLQkJCS8vIEl0ZXJhdGUgdGhyb3VnaCBlYWNoIGNoaWxkIG5vZGVzLgotCQkJTm9kZUxpc3Qgbm9kZXMgPSBub2RlLmdldENoaWxkTm9kZXMoKTsKLQkJCWlmIChub2RlcyAhPSBudWxsKSB7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBub2Rlcy5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCQkJCXdyaXRlTm9kZShub2Rlcy5pdGVtKGkpLCAiIiwgb3V0KTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCX0KLQkJCWJyZWFrOwotCi0JCWNhc2UgTm9kZS5FTEVNRU5UX05PREU6Ci0JCQlTdHJpbmcgbmFtZSA9IG5vZGUuZ2V0Tm9kZU5hbWUoKTsKLQkJCW91dC53cml0ZShTdHJVdGlsLmdldFVURjhCeXRlcyhpbmRlbnQgKyAiPCIgKyBuYW1lKSk7IC8vJE5PTi1OTFMtMSQKLQkJCU5hbWVkTm9kZU1hcCBhdHRycyA9IG5vZGUuZ2V0QXR0cmlidXRlcygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhdHRycy5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCQkJTm9kZSBhdHRyTm9kZSA9IGF0dHJzLml0ZW0oaSk7Ci0JCQkJb3V0LndyaXRlKFN0clV0aWwuZ2V0VVRGOEJ5dGVzKCIgIiArIGF0dHJOb2RlLmdldE5vZGVOYW1lKCkgLy8kTk9OLU5MUy0xJAotCQkJCQkJKyAiPVwiIiArIGVzY2FwZShhdHRyTm9kZS5nZXROb2RlVmFsdWUoKSkgKyAiXCIiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJfQotCQkJb3V0LndyaXRlKFN0clV0aWwuZ2V0VVRGOEJ5dGVzKCI+IikpOyAvLyROT04tTkxTLTEkCi0JCQlvdXQud3JpdGUoQ1JMRl9CWVRFUyk7Ci0KLQkJCS8vIEl0ZXJhdGUgdGhyb3VnaCBlYWNoIGNoaWxkIG5vZGVzLgotCQkJTm9kZUxpc3QgY2hpbGROb2RlcyA9IG5vZGUuZ2V0Q2hpbGROb2RlcygpOwotCQkJaWYgKGNoaWxkTm9kZXMgIT0gbnVsbCkgewotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGROb2Rlcy5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCQkJCXdyaXRlTm9kZShjaGlsZE5vZGVzLml0ZW0oaSksIGluZGVudCwgb3V0KTsKLQkJCQl9Ci0JCQl9Ci0JCQlvdXQud3JpdGUoU3RyVXRpbC5nZXRVVEY4Qnl0ZXMoaW5kZW50ICsgIjwvIiArIG5hbWUgKyAiPiIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlvdXQud3JpdGUoQ1JMRl9CWVRFUyk7Ci0KLQkJCWJyZWFrOwotCi0JCWNhc2UgTm9kZS5URVhUX05PREU6Ci0JCQl0ZXh0ID0gU3RyVXRpbC5yZW1vdmVXaGl0ZVNwYWNlQ2hhcnMobm9kZS5nZXROb2RlVmFsdWUoKSk7Ci0JCQlpZiAodGV4dC5sZW5ndGgoKSA+IDApIHsKLQkJCQlvdXQud3JpdGUoU3RyVXRpbC5nZXRVVEY4Qnl0ZXMoZXNjYXBlKHRleHQpKSk7Ci0JCQl9Ci0JCQlicmVhazsKLQotCQljYXNlIE5vZGUuQ0RBVEFfU0VDVElPTl9OT0RFOgotCQkJdGV4dCA9IFN0clV0aWwucmVtb3ZlV2hpdGVTcGFjZUNoYXJzKG5vZGUuZ2V0Tm9kZVZhbHVlKCkpOwotCQkJaWYgKHRleHQubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJb3V0LndyaXRlKFN0clV0aWwuZ2V0VVRGOEJ5dGVzKCI8IVtDREFUQVsiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQlvdXQud3JpdGUoU3RyVXRpbC5nZXRVVEY4Qnl0ZXModGV4dCkpOwotCQkJCW91dC53cml0ZShTdHJVdGlsLmdldFVURjhCeXRlcygiXV0+IikpOyAvLyROT04tTkxTLTEkCi0JCQkJb3V0LndyaXRlKENSTEZfQllURVMpOwotCQkJfQotCQkJYnJlYWs7Ci0KLQkJY2FzZSBOb2RlLlBST0NFU1NJTkdfSU5TVFJVQ1RJT05fTk9ERToKLQkJCW91dC53cml0ZShTdHJVdGlsLmdldFVURjhCeXRlcygiPD8iICsgbm9kZS5nZXROb2RlTmFtZSgpIC8vJE5PTi1OTFMtMSQKLQkJCQkJKyAiICIgKyBub2RlLmdldE5vZGVWYWx1ZSgpICsgIj8+IikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCW91dC53cml0ZShDUkxGX0JZVEVTKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgTm9kZS5FTlRJVFlfUkVGRVJFTkNFX05PREU6Ci0JCQlvdXQud3JpdGUoU3RyVXRpbC5nZXRVVEY4Qnl0ZXMoIiYiICsgbm9kZS5nZXROb2RlTmFtZSgpICsgIjsiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBmaWxlIGxvY2F0aW9uIHdoZXJlIHRoZSBnaXZlbiBTQVggZXhjZXB0aW9uIG9jY3VycmVkLgotCSAqIAotCSAqIEBwYXJhbSBlCi0JICogICAgICAgICAgICBUaGUgU0FYIHBhcnNlIGV4Y2VwdGlvbi4KLQkgKiBAcmV0dXJuIEEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIGZpbGUgbG9jYXRpb24gd2hlcmUgdGhlIGV4Y2VwdGlvbgotCSAqICAgICAgICAgb2NjdXJyZWQuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TG9jYXRpb25PZkV4Y2VwdGlvbihTQVhQYXJzZUV4Y2VwdGlvbiBlKSB7Ci0JCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJc2IuYXBwZW5kKCJyb3cgIik7IC8vJE5PTi1OTFMtMSQKLQkJc2IuYXBwZW5kKGUuZ2V0TGluZU51bWJlcigpKTsKLQkJc2IuYXBwZW5kKCIsIGNvbCAiKTsgLy8kTk9OLU5MUy0xJAotCQlzYi5hcHBlbmQoZS5nZXRDb2x1bW5OdW1iZXIoKSk7Ci0KLQkJU3RyaW5nIHN5c3RlbUlkID0gZS5nZXRTeXN0ZW1JZCgpOwotCQlpZiAoc3lzdGVtSWQgIT0gbnVsbCkgewotCQkJaW50IGluZGV4ID0gc3lzdGVtSWQubGFzdEluZGV4T2YoJy8nKTsKLQkJCWlmIChpbmRleCAhPSAtMSkgewotCQkJCXN5c3RlbUlkID0gc3lzdGVtSWQuc3Vic3RyaW5nKGluZGV4ICsgMSk7Ci0JCQl9Ci0JCQlzYi5hcHBlbmQoIiBvZiBYTUwgZG9jdW1lbnQgIik7IC8vJE5PTi1OTFMtMSQKLQkJCXNiLmFwcGVuZChzeXN0ZW1JZCk7Ci0JCX0KLQotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIERvY3VtZW50IGxvYWRYbWwoRmlsZSBmaWxlKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJRG9jdW1lbnRCdWlsZGVyRmFjdG9yeSBidWlsZGVyRmFjdG9yeSA9IERvY3VtZW50QnVpbGRlckZhY3RvcnkKLQkJCQkubmV3SW5zdGFuY2UoKTsKLQkJRG9jdW1lbnRCdWlsZGVyIGJ1aWxkZXIgPSBidWlsZGVyRmFjdG9yeS5uZXdEb2N1bWVudEJ1aWxkZXIoKTsKLQotCQlyZXR1cm4gYnVpbGRlci5wYXJzZShmaWxlKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIERvY3VtZW50IGNyZWF0ZURvY3VtZW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCURvY3VtZW50QnVpbGRlckZhY3RvcnkgYnVpbGRlckZhY3RvcnkgPSBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5Ci0JCQkJLm5ld0luc3RhbmNlKCk7Ci0JCURvY3VtZW50QnVpbGRlciBidWlsZGVyID0gYnVpbGRlckZhY3RvcnkubmV3RG9jdW1lbnRCdWlsZGVyKCk7Ci0JCXJldHVybiBidWlsZGVyLm5ld0RvY3VtZW50KCk7Ci0JfQotCi0JLyoqCi0JICogdGV4dCBvZiBhIGxlYWYgbm9kZSwgd2l0aG91dCBjaGlsZCBlbGVtZW50Ci0JICogCi0JICogQHBhcmFtIHRhZwotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0Tm9kZVRleHQoRWxlbWVudCB0YWcpIHsKLQkJU3RyaW5nIHRleHQgPSB0YWcudG9TdHJpbmcoKTsKLQkJaW50IGkgPSB0ZXh0LmluZGV4T2YoIj4iKTsgLy8kTk9OLU5MUy0xJAotCQlpbnQgaiA9IHRleHQubGFzdEluZGV4T2YoIjwvIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKGkgPCAwIHx8IGogPCAwIHx8IGogPCBpKSB7Ci0JCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCXJldHVybiB0ZXh0LnN1YnN0cmluZyhpICsgMSwgaik7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0Q2hpbGRUZXh0KEVsZW1lbnQgdGFnLCBTdHJpbmcgY2hpbGRUYWdOYW1lKSB7Ci0JCUVsZW1lbnQgY2hpbGQgPSBnZXRGaXJzdENoaWxkKHRhZywgY2hpbGRUYWdOYW1lKTsKLQkJaWYgKGNoaWxkICE9IG51bGwpIHsKLQkJCXJldHVybiBnZXROb2RlVGV4dChjaGlsZCk7Ci0JCX0KLQotCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIEVsZW1lbnQgZ2V0Rmlyc3RDaGlsZChFbGVtZW50IHRhZywgU3RyaW5nIGNoaWxkVGFnTmFtZSkgewotCQlOb2RlTGlzdCBub2RlcyA9IHRhZy5nZXRFbGVtZW50c0J5VGFnTmFtZShjaGlsZFRhZ05hbWUpOwotCQlpZiAobm9kZXMgPT0gbnVsbCB8fCBub2Rlcy5nZXRMZW5ndGgoKSA9PSAwKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXJldHVybiAoRWxlbWVudCkgbm9kZXMuaXRlbSgwKTsKLQl9Ci0KLQkvKioKLQkgKiBpdGVyYXRvciBvZiBhbGwgdGhlIGNoaWxkcmVuIG9mIHRoZSBlbGVtZW50Ci0JICogCi0JICogQHBhcmFtIHRhZwotCSAqIEByZXR1cm4gSXRlcmF0b3IKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEl0ZXJhdG9yIGNoaWxkSXRlcmF0b3IoRWxlbWVudCB0YWcpIHsKLQkJTm9kZUxpc3Qgbm9kZXMgPSB0YWcuZ2V0Q2hpbGROb2RlcygpOwotCi0JCS8vIE5vZGVMaXN0IGNvbnRhaW5zIG5vIEVsZW1lbnQgbm9kZXMgc3VjaCBhcyB0ZXh0IG5vZGVzLCBpZ25vcmUgdGhvc2UKLQkJTGlzdDxOb2RlPiBlbGVtZW50cyA9IG5ldyBBcnJheUxpc3Q8Tm9kZT4oKTsKLQkJaWYgKG5vZGVzICE9IG51bGwpIHsKLQkJCWludCBzaXplID0gbm9kZXMuZ2V0TGVuZ3RoKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCU5vZGUgbm9kZSA9IG5vZGVzLml0ZW0oaSk7Ci0JCQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBFbGVtZW50KSB7Ci0JCQkJCWVsZW1lbnRzLmFkZChub2RlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gZWxlbWVudHMuaXRlcmF0b3IoKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBOb2RlSXRlcmF0b3IgaW1wbGVtZW50cyBJdGVyYXRvciB7Ci0JCWludCBjdXJyZW50SW5kZXggPSAtMTsKLQotCQlpbnQgc2l6ZSA9IDA7Ci0KLQkJTm9kZUxpc3Qgbm9kZXMgPSBudWxsOwotCi0JCXB1YmxpYyBOb2RlSXRlcmF0b3IoTm9kZUxpc3Qgbm9kZXMpIHsKLQkJCXRoaXMubm9kZXMgPSBub2RlczsKLQkJCWlmIChub2RlcyAhPSBudWxsKQotCQkJCXNpemUgPSBub2Rlcy5nZXRMZW5ndGgoKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHJlbW92ZSgpIHsKLQkJCS8vIERvIG5vdGhpbmcsIHRoaXMgaXMgYSByZWFkb25seSBpdGVyYXRvci4KLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7Ci0JCQlyZXR1cm4gY3VycmVudEluZGV4ICsgMSA8IHNpemU7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IG5leHQoKSB7Ci0JCQlpZiAoaGFzTmV4dCgpKSB7Ci0JCQkJcmV0dXJuIG5vZGVzLml0ZW0oKytjdXJyZW50SW5kZXgpOwotCQkJfQotCi0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCS8qKgotCSAqIGl0ZXJhdG9yIG9mIGFsbCB0aGUgY2hpbGRyZW4gb2YgdGhlIGVsZW1lbnQKLQkgKiAKLQkgKiBAcGFyYW0gdGFnCi0JICogQHJldHVybiBJdGVyYXRvcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSXRlcmF0b3IgY2hpbGRJdGVyYXRvcihFbGVtZW50IHRhZywgU3RyaW5nIGNoaWxkVGFnTmFtZSkgewotCQlOb2RlTGlzdCBub2RlcyA9IHRhZy5nZXRFbGVtZW50c0J5VGFnTmFtZShjaGlsZFRhZ05hbWUpOwotCQlyZXR1cm4gbmV3IE5vZGVJdGVyYXRvcihub2Rlcyk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgbGlzdCBvZiBpbW1lZGlhdGUgY2hpbGQgZWxlbWVudHMgd2l0aCB0aGUgZ2l2ZW4gdGFnIG5hbWUuCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiBAcGFyYW0gdGFnTmFtZQotCSAqIEByZXR1cm4gbGlzdCBvZiB7QGxpbmsgRWxlbWVudH0gb2JqZWN0cwotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdDxFbGVtZW50PiBnZXRDaGlsZEVsZW1lbnRzQnlUYWdOYW1lKEVsZW1lbnQgZWxlbWVudCwgU3RyaW5nIHRhZ05hbWUpIHsJCi0JCUxpc3Q8RWxlbWVudD4gZWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0PEVsZW1lbnQ+KCk7Ci0JCU5vZGVMaXN0IGxpc3QgPSBlbGVtZW50LmdldENoaWxkTm9kZXMoKTsKLQkJaW50IHNpemUgPSBsaXN0LmdldExlbmd0aCgpOyAKLQkJaWYoc2l6ZSA+IDApIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJTm9kZSBub2RlID0gbGlzdC5pdGVtKGkpOwotCQkJCWlmKG5vZGUgaW5zdGFuY2VvZiBFbGVtZW50KSB7Ci0JCQkJCUVsZW1lbnQgZSA9IChFbGVtZW50KSBub2RlOwotCQkJCQlpZihlLmdldFRhZ05hbWUoKS5lcXVhbHModGFnTmFtZSkpIHsKLQkJCQkJCWVsZW1lbnRzLmFkZChlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZWxlbWVudHM7Ci0JfQotCQotCS8qKgotCSAqIEdldHMgdGhlIGZpcnN0IGVsZW1lbnQgd2l0aCB0aGUgZ2l2ZW4gdGFnIG5hbWUgaW4gdGhlIGltbWVkaWF0ZSBjaGlsZCBlbGVtZW50cy4KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqIEBwYXJhbSB0YWdOYW1lCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgRWxlbWVudCBnZXRGaXJzdENoaWxkRWxlbWVudEJ5VGFnTmFtZShOb2RlIGVsZW1lbnQsIFN0cmluZyB0YWdOYW1lKSB7Ci0JCU5vZGVMaXN0IGxpc3QgPSBlbGVtZW50LmdldENoaWxkTm9kZXMoKTsKLQkJaW50IHNpemUgPSBsaXN0LmdldExlbmd0aCgpOyAKLQkJaWYoc2l6ZSA+IDApIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJTm9kZSBub2RlID0gbGlzdC5pdGVtKGkpOwotCQkJCWlmKG5vZGUgaW5zdGFuY2VvZiBFbGVtZW50KSB7Ci0JCQkJCUVsZW1lbnQgZSA9IChFbGVtZW50KSBub2RlOwotCQkJCQlpZihlLmdldFRhZ05hbWUoKS5lcXVhbHModGFnTmFtZSkpIHsKLQkJCQkJCXJldHVybiBlOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3V0aWxzL1ppcFV0aWwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vdXRpbHMvWmlwVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOGI3MzBkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vdXRpbHMvWmlwVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLnppcC5aaXBFbnRyeTsKLWltcG9ydCBqYXZhLnV0aWwuemlwLlppcE91dHB1dFN0cmVhbTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotCi0vKioKLSAqIFV0aWxpdHkgY2xhc3MgZm9yIHJlYWRpbmcgYW5kIHdyaXRpbmcgemlwIGZpbGVzLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjIKLSAqLwotcHVibGljIGNsYXNzIFppcFV0aWwgewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIHppcCBmaWxlLgotCSAqIAotCSAqIEBwYXJhbSB6aXBGaWxlUGF0aAotCSAqICAgICAgICAgICAgYW4gYWJzb2x1dGUgcGF0aCB0byB0aGUgdGFyZ2V0IHppcCBmaWxlCi0JICogQHBhcmFtIGNvbnRlbnRQYXRoCi0JICogICAgICAgICAgICBhbiBhYnNvbHV0ZSBwYXRoIHRvIGEgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIGZpbGVzIGFuZCBzdWIKLQkgKiAgICAgICAgICAgIGRpcmVjdG9yaWVzIHRvIGJlIHppcHBlZAotCSAqIEBwYXJhbSBtb25pdG9yCi0JICogICAgICAgICAgICBhIHByb2dyZXNzIG1vbml0b3IKLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlIGNyZWF0aW5nIHRoZSB6aXAgZmlsZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBjcmVhdGVaaXBGaWxlKFN0cmluZyB6aXBGaWxlUGF0aCwgU3RyaW5nIGNvbnRlbnRQYXRoLAotCQkJSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlaaXBPdXRwdXRTdHJlYW0gb3V0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCW91dCA9IG5ldyBaaXBPdXRwdXRTdHJlYW0obmV3IEZpbGVPdXRwdXRTdHJlYW0oCi0JCQkJCXppcEZpbGVQYXRoKSk7Ci0JCQlGaWxlIGNvbnRlbnREaXIgPSBuZXcgRmlsZShjb250ZW50UGF0aCk7Ci0JCQlwb3B1bGF0ZVppcEZpbGUob3V0LCBjb250ZW50RGlyLmdldEFic29sdXRlUGF0aCgpLCBjb250ZW50RGlyLAotCQkJCQltb25pdG9yKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJdGhyb3cgZTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQlpZiAob3V0ICE9IG51bGwpIHsKLQkJCQl0cnkgewotCQkJCQlvdXQuY2xvc2UoKTsKLQkJCQl9Ci0JCQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogUG9wdWxhdGVzIGEgemlwIGZpbGUgd2l0aCBkaXJlY3RvcmllcyBhbmQgZmlsZXMuCi0JICogCi0JICogQHBhcmFtIG91dAotCSAqICAgICAgICAgICAgYSB6aXAgZmlsZSBvdXRwdXQgc3RyZWFtCi0JICogQHBhcmFtIHJvb3RQYXRoCi0JICogICAgICAgICAgICBhIHJvb3QgcGF0aCB0aGF0IGlzIHVzZWQgdG8gY29tcHV0ZSB0aGUgcmVsYXRpdmUgcGF0aHMgb2YgdGhlCi0JICogICAgICAgICAgICB6aXAgY29udGVudAotCSAqIEBwYXJhbSBmaWxlCi0JICogICAgICAgICAgICBhIGZpbGUgb3IgZGlyZWN0b3J5Ci0JICogQHBhcmFtIG1vbml0b3IKLQkgKiAgICAgICAgICAgIGEgcHJvZ3Jlc3MgbW9uaXRvcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBwb3B1bGF0ZVppcEZpbGUoWmlwT3V0cHV0U3RyZWFtIG91dCwgU3RyaW5nIHJvb3RQYXRoLAotCQkJRmlsZSBmaWxlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCUZpbGVbXSBmaWxlcyA9IGZpbGUubGlzdEZpbGVzKCk7Ci0JCWlmIChmaWxlcyAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKGZpbGVzW2ldLmlzRGlyZWN0b3J5KCkpIHsKLQkJCQkJcG9wdWxhdGVaaXBGaWxlKG91dCwgcm9vdFBhdGgsIGZpbGVzW2ldLCBtb25pdG9yKTsKLQkJCQl9IGVsc2UgewotCQkJCQlTdHJpbmcgZmlsZVBhdGggPSBmaWxlc1tpXS5nZXRBYnNvbHV0ZVBhdGgoKTsKLQkJCQkJRmlsZUlucHV0U3RyZWFtIGluID0gbmV3IEZpbGVJbnB1dFN0cmVhbShmaWxlUGF0aCk7Ci0JCQkJCVN0cmluZyByZWxhdGl2ZVBhdGggPSBmaWxlUGF0aAotCQkJCQkJCS5zdWJzdHJpbmcocm9vdFBhdGgubGVuZ3RoKCkgKyAxKTsKLQkJCQkJb3V0LnB1dE5leHRFbnRyeShuZXcgWmlwRW50cnkocmVsYXRpdmVQYXRoKSk7Ci0JCQkJCWJ5dGVbXSBidWZmZXIgPSBuZXcgYnl0ZVsxMDI0XTsKLQkJCQkJaW50IGxlbjsKLQkJCQkJd2hpbGUgKChsZW4gPSBpbi5yZWFkKGJ1ZmZlcikpID4gMCkgewotCQkJCQkJb3V0LndyaXRlKGJ1ZmZlciwgMCwgbGVuKTsKLQkJCQkJfQotCQkJCQlvdXQuY2xvc2VFbnRyeSgpOwotCQkJCQlpbi5jbG9zZSgpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi91dGlscy9wYWNrYWdlLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3V0aWxzL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzIxNmJhYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3V0aWxzL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIGNvbW1vbiBjbGlwYm9hcmQsIGZpbGUsIEkxOE4sIGltYWdlLCBuZXR3b3JraW5nLCBzdHJpbmcgbWFuaXB1bGF0aW9uIGFuZCB0aHJlYWRpbmcgc2VydmljZXMuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi94bWwvQWJzdHJhY3RTQVhQYXJzZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24veG1sL0Fic3RyYWN0U0FYUGFyc2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjOTFhMWQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi94bWwvQWJzdHJhY3RTQVhQYXJzZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxNiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnhtbDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5TQVhQYXJzZXI7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuU0FYUGFyc2VyRmFjdG9yeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24uc2VydmljZWFiaWxpdHkuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuTmV0VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLlN0clV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5YTUxVdGlsOwotaW1wb3J0IG9yZy54bWwuc2F4LkF0dHJpYnV0ZXM7Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWFBhcnNlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy54bWwuc2F4LlhNTFJlYWRlcjsKLWltcG9ydCBvcmcueG1sLnNheC5oZWxwZXJzLkRlZmF1bHRIYW5kbGVyOwotCi0vKioKLSAqIEFuIGFic3RyYWN0IFNBWCBwYXJzZXIgdGhhdCBjYW4gYmUgdXNlZCB0byBwYXJzZSBhIHNpbmdsZSBYTUwgZmlsZSBvciBhCi0gKiBkaXJlY3Rvcnkgb2YgWE1MIGZpbGVzLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0U0FYUGFyc2VyIGV4dGVuZHMgRGVmYXVsdEhhbmRsZXIgewotCi0JLyoqCi0JICogVGhlIGxvZ2dlciB1c2VkIGZvciBsb2dnaW5nIHdhcm5pbmdzLCBlcnJvcnMgYW5kIGV4Y2VwdGlvbnMuCi0JICovCi0JcHJvdGVjdGVkIExvZ2dlciBsb2dnZXI7Ci0KLQkvKioKLQkgKiBUaGUgbmFtZSBvZiB0aGUgY3VycmVudCBYTUwgZmlsZSBiZWluZyBwYXJzZWQuCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyB4bWxGaWxlOwotCi0JLyoqCi0JICogVGhlIFN0cmluZyBidWZmZXIgZm9yIGFjY3VtdWxhdGluZyB0ZXh0LgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmdCdWZmZXIgc3RyQnVmOwotCi0JLyoqCi0JICogVGhlIFhNTCB2YWxpZGF0aW5nIGZsYWcuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIHZhbGlkYXRpbmc7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkFic3RyYWN0U2F4UGFyc2VyPC9jb2RlPiBnaXZlbiB0aGUgdmFsaWRhdGluZyBmbGFnLgotCSAqIAotCSAqIEBwYXJhbSBsb2dnZXIKLQkgKiAgICAgICAgICAgIFRoZSBsb2dnZXIgZm9yIGxvZ2dpbmcgd2FybmluZ3MgYW5kIGVycm9ycy4KLQkgKiBAcGFyYW0gdmFsaWRhdGluZwotCSAqICAgICAgICAgICAgSWYgdHJ1ZSwgdmFsaWRhdGUgdGhlIFhNTCBkb2N1bWVudC4KLQkgKi8KLQlwdWJsaWMgQWJzdHJhY3RTQVhQYXJzZXIoTG9nZ2VyIGxvZ2dlciwgYm9vbGVhbiB2YWxpZGF0aW5nKSB7Ci0JCXRoaXMubG9nZ2VyID0gbG9nZ2VyOwotCQl0aGlzLnZhbGlkYXRpbmcgPSB2YWxpZGF0aW5nOwotCX0KLQotCS8qKgotCSAqIFBhcnNlcyB0aGUgZ2l2ZW4gWE1MIGRpcmVjdG9yeSBvciBmaWxlLgotCSAqIAotCSAqIEBwYXJhbSB4bWxQYXRoCi0JICogICAgICAgICAgICBUaGUgWE1MIGRpcmVjdG9yeSBvciBmaWxlLgotCSAqLwotCXB1YmxpYyB2b2lkIHBhcnNlKFN0cmluZyB4bWxQYXRoKSB7Ci0JCVN0cmluZyBwYXRoTmFtZSA9IFN0clV0aWwucmVwbGFjZSh4bWxQYXRoLCAiJTIwIiwgIiAiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCUZpbGUgcGF0aCA9IG5ldyBGaWxlKHBhdGhOYW1lKTsKLQkJRmlsZVtdIGZpbGVzID0gcGF0aC5pc0ZpbGUoKSA/IG5ldyBGaWxlW10geyBwYXRoIH0gOiBwYXRoLmxpc3RGaWxlcygpOwotCQlpZiAoZmlsZXMgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykgewotCQkJCWlmICghZmlsZXNbaV0uaXNEaXJlY3RvcnkoKSkgewotCQkJCQl0cnkgewotCQkJCQkJcGFyc2VGaWxlKGZpbGVzW2ldLmdldEFic29sdXRlRmlsZSgpKTsKLQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCWlmIChsb2dnZXIgIT0gbnVsbCkgewotCQkJCQkJCWxvZ2dlcgotCQkJCQkJCQkJLmxvZ0Vycm9yKAotCQkJCQkJCQkJCQkiRmFpbGVkIHRvIHBhcnNlIFwiIiArIGZpbGVzW2ldLmdldEFic29sdXRlUGF0aCgpICsgJyInLCBlKTsgLy8kTk9OLU5MUy0xJAkJCQkJCQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogUGFyc2VzIHRoZSBnaXZlbiBYTUwgZmlsZS4KLQkgKiAKLQkgKiBAcGFyYW0geG1sRmlsZQotCSAqICAgICAgICAgICAgVGhlIFhNTCBmaWxlLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBhcnNlRmlsZShGaWxlIHhtbEZpbGUpIHRocm93cyBQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uLAotCQkJSU9FeGNlcHRpb24sIFNBWEV4Y2VwdGlvbiB7Ci0JCS8vIENyZWF0ZSB0aGUgU0FYIHBhcnNlciBmYWN0b3J5LgotCQlTQVhQYXJzZXJGYWN0b3J5IHNwZiA9IFNBWFBhcnNlckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLQotCQkvLyBTZXQgdGhlIFhNTCB2YWxpZGF0aW5nIGZsYWcuCi0JCXNwZi5zZXRWYWxpZGF0aW5nKHZhbGlkYXRpbmcpOwotCi0JCS8vIENyZWF0ZSB0aGUgU0FYIHBhcnNlci4KLQkJU0FYUGFyc2VyIHNheFBhcnNlciA9IHNwZi5uZXdTQVhQYXJzZXIoKTsKLQotCQkvLyBHZXQgdGhlIFNBWCBYTUwgcmVhZGVyLgotCQlYTUxSZWFkZXIgeG1sUmVhZGVyID0gc2F4UGFyc2VyLmdldFhNTFJlYWRlcigpOwotCi0JCS8vIFNldCB0aGUgU0FYIHBhcnNlciBoYW5kbGVycyB0byB0aGlzIGNsYXNzLgotCQl4bWxSZWFkZXIuc2V0Q29udGVudEhhbmRsZXIodGhpcyk7Ci0JCXhtbFJlYWRlci5zZXRFcnJvckhhbmRsZXIodGhpcyk7Ci0KLQkJLy8gSW5zdHJ1Y3QgdGhlIFNBWCBwYXJzZXIgdG8gcGFyc2UgdGhlIGdpdmVuIFhNTCBmaWxlLgotCQl0aGlzLnhtbEZpbGUgPSB4bWxGaWxlLmdldEFic29sdXRlUGF0aCgpOwotCQl4bWxSZWFkZXIucGFyc2UoTmV0VXRpbC5nZXRVcmkoeG1sRmlsZSkpOwotCX0KLQotCS8qKgotCSAqIENhbGxlZCB3aGVuIHRoZSBYTUwgcGFyc2VyIHN0YXJ0cyB0byBwYXJzZSB0aGUgZG9jdW1lbnQuCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnREb2N1bWVudCgpIHsKLQkJc3RyQnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCX0KLQotCS8qKgotCSAqIENhbGxlZCB3aGVuIHRoZSB0aGUgWE1MIHBhcnNlciBlbmNvdW50ZXJzIHRoZSBjaGFyYXJhY3RlciBkYXRhIHdpdGhpbiBhCi0JICogdGV4dCBlbGVtZW50LgotCSAqLwotCXB1YmxpYyB2b2lkIGNoYXJhY3RlcnMoY2hhcltdIGJ1ZmZlciwgaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKSB7Ci0JCXN0ckJ1Zi5hcHBlbmQoYnVmZmVyLCBzdGFydCwgbGVuZ3RoKTsKLQl9Ci0KLQkvKioKLQkgKiBDYWxsZWQgd2hlbiB0aGUgcGFyc2VyIHN0YXJ0cyB0byBwYXJzZSBlYWNoIG5ldyBlbGVtZW50LgotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCB2b2lkIHN0YXJ0RWxlbWVudChTdHJpbmcgbmFtZXNwYWNlVVJMLCBTdHJpbmcgbG9jYWxOYW1lLAotCQkJU3RyaW5nIHFuYW1lLCBBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpOwotCi0JLyoqCi0JICogQ2FsbGVkIHdoZW4gdGhlIFhNTCBwYXJzZXIgcmVhY2hlcyB0aGUgZW5kIG9mIHRoZSBhbiBlbGVtZW50LgotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCB2b2lkIGVuZEVsZW1lbnQoU3RyaW5nIG5hbWVzcGFjZVVSTCwgU3RyaW5nIGxvY2FsTmFtZSwKLQkJCVN0cmluZyBxbmFtZSk7Ci0KLQkvKioKLQkgKiBDYWxsZWQgd2hlbiB0aGUgWE1MIHBhcnNlciByZWFjaGVzIHRoZSBlbmQgb2YgdGhlIGRvY3VtZW50LgotCSAqLwotCXB1YmxpYyB2b2lkIGVuZERvY3VtZW50KCkgewotCX0KLQotCS8qKgotCSAqIExvZ3MgdGhlIFNBWCBwYXJzaW5nIHdhcm5pbmcuCi0JICogCi0JICogQHBhcmFtIGUKLQkgKiAgICAgICAgICAgIFRoZSBTQVggcGFyc2UgZXhjZXB0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHdhcm5pbmcoU0FYUGFyc2VFeGNlcHRpb24gZSkgewotCQlpZiAobG9nZ2VyICE9IG51bGwpIHsKLQkJCWxvZ2dlcgotCQkJCQkubG9nV2FybmluZygiU0FYIHBhcnNpbmcgd2FybmluZyBlbmNvdW50ZXJlZCBhdCAiIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkrIFhNTFV0aWwuZ2V0TG9jYXRpb25PZkV4Y2VwdGlvbihlKQotCQkJCQkJCSsgIjogIiArIGUuZ2V0TWVzc2FnZSgpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyoqCi0JICogTG9ncyB0aGUgU0FYIHBhcnNpbmcgZXJyb3IuCi0JICogCi0JICogQHBhcmFtIGUKLQkgKiAgICAgICAgICAgIFRoZSBTQVggcGFyc2UgZXhjZXB0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIGVycm9yKFNBWFBhcnNlRXhjZXB0aW9uIGUpIHsKLQkJaWYgKGxvZ2dlciAhPSBudWxsKSB7Ci0JCQlsb2dnZXIKLQkJCQkJLmxvZ0Vycm9yKCJTQVggcGFyc2luZyBlcnJvciBlbmNvdW50ZXJlZCBhdCAiIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkrIFhNTFV0aWwuZ2V0TG9jYXRpb25PZkV4Y2VwdGlvbihlKQotCQkJCQkJCSsgIjogIiArIGUuZ2V0TWVzc2FnZSgpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyoqCi0JICogTG9ncyB0aGUgU0FYIG5vbi1yZWNvdmVyYWJsZSBlcnJvciBhbmQgZXhpdHMuCi0JICogCi0JICogQHBhcmFtIGUKLQkgKiAgICAgICAgICAgIFRoZSBTQVggcGFyc2UgZXhjZXB0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIGZhdGFsRXJyb3IoU0FYUGFyc2VFeGNlcHRpb24gZSkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0JCWlmIChsb2dnZXIgIT0gbnVsbCkgewotCQkJbG9nZ2VyCi0JCQkJCS5sb2dFcnJvcigiU0FYIHBhcnNpbmcgZmF0YWwgZXJyb3IgZW5jb3VudGVyZWQgYXQgIiAvLyROT04tTkxTLTEkCi0JCQkJCQkJKyBYTUxVdGlsLmdldExvY2F0aW9uT2ZFeGNlcHRpb24oZSkKLQkJCQkJCQkrICI6ICIgKyBlLmdldE1lc3NhZ2UoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCWxvZ2dlci5sb2dFcnJvcihlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGN1cnJlbnQgWE1MIGZpbGUgdGhhdCBpcyBiZWluZyBwYXJzZWQuCi0JICogCi0JICogQHJldHVybiBUaGUgbmFtZSBvZiB0aGUgWE1MIGZpbGUuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRYTUxGaWxlKCkgewotCQlyZXR1cm4geG1sRmlsZTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3htbC9YU0xUUHJvY2Vzc29yLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3htbC9YU0xUUHJvY2Vzc29yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4OWY2YTguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi94bWwvWFNMVFByb2Nlc3Nvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQ5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5jb21tb24ueG1sOwotCi1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlV3JpdGVyOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5Xcml0ZXI7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7Ci0KLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlNvdXJjZTsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJGYWN0b3J5OwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uc3RyZWFtLlN0cmVhbVJlc3VsdDsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnN0cmVhbS5TdHJlYW1Tb3VyY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLkNvbW1vblBsdWdpbjsKLQotLyoqCi0gKiBBIHdyYXBwZXIgb3ZlciB0aGUgWFNMVCBwcm9jZXNzb3IgYnVuZGxlZCB3aXRoIHRoZSBKUkUuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgWFNMVFByb2Nlc3NvciB7Ci0KLQkvLyBJZiB0cnVlLCBjYWNoZSB0aGUgY29tcGlsZWQgdGhlIFhTTCB0cmFuc2Zvcm1lciB3aXRoIHRoZSBjb21waWxlZCBYU0wKLQkvLyB0ZW1wbGF0ZXMuCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBjYWNoZVhTTDsKLQotCS8vIENhY2hlcyB0aGUgWFNMIHRyYW5zZm9ybWVycy4KLQlwcml2YXRlIHN0YXRpYyBNYXA8U3RyaW5nLCBDYWNoZWRUcmFuc2Zvcm1lcj4gdHJhbnNmb3JtZXJDYWNoZTsKLQotCXN0YXRpYyB7Ci0JCVN0cmluZyBjYWNoZVhTTFByb3BlcnR5ID0gQ29tbW9uUGx1Z2luLmdldERlZmF1bHQoKS5nZXRTdHJpbmcoCi0JCQkJImNhY2hlWFNMIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKGNhY2hlWFNMUHJvcGVydHkgIT0gbnVsbCAmJiAhY2FjaGVYU0xQcm9wZXJ0eS5zdGFydHNXaXRoKCJbIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJY2FjaGVYU0wgPSBCb29sZWFuLmdldEJvb2xlYW4oY2FjaGVYU0xQcm9wZXJ0eSk7Ci0JCX0gZWxzZSB7Ci0JCQljYWNoZVhTTCA9IHRydWU7Ci0JCX0KLQkJaWYgKGNhY2hlWFNMKSB7Ci0JCQl0cmFuc2Zvcm1lckNhY2hlID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBDYWNoZWRUcmFuc2Zvcm1lcj4oKTsKLQkJfQotCi0JCS8vIEluY3JlYXNlIHRoZSBlbnRpdHkgZXhwYW5zaW9uIGxpbmUgbGltaXQgdG8gaGFuZGxlIGEgbGFyZ2VyIG51bWJlciBvZgotCQkvLyBYTUwgZW50aXRpZXMuCi0JCVN5c3RlbS5zZXRQcm9wZXJ0eSgiZW50aXR5RXhwYW5zaW9uTGltaXQiLCAiMTAwMDAwMCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBEZWZhdWx0IHByaXZhdGUgY29uc3RydWN0b3IgdG8gcHJldmVudCB0aGlzIGNsYXNzIGZyb20gYmVpbmcKLQkgKiBpbnN0YW50aWF0ZWQuCi0JICovCi0JcHJpdmF0ZSBYU0xUUHJvY2Vzc29yKCkgewotCX0KLQotCS8qKgotCSAqIEV4ZWN1dGVzIHRoZSBYU0wgdHJhbnNmb3JtYXRpb24gZ2l2ZW4gdGhlIFhTTCBzb3VyY2UsIFhNTCBzb3VyY2UsIHRhcmdldAotCSAqIG91dHB1dCBhbmQgZW5jb2RpbmcuCi0JICogCi0JICogQHBhcmFtIHhzbFNvdXJjZQotCSAqICAgICAgICAgICAgVGhlIFhTTCBzb3VyY2UuCi0JICogQHBhcmFtIHhtbFNvdXJjZQotCSAqICAgICAgICAgICAgVGhlIFhNTCBzb3VyY2UuCi0JICogQHBhcmFtIG91dHB1dAotCSAqICAgICAgICAgICAgVGhlIG91dHB1dCB0YXJnZXQuCi0JICogQHBhcmFtIHBhcmFtcwotCSAqICAgICAgICAgICAgVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBYU0wgdHJhbnNmb3JtYXRpb24uCi0JICogQHBhcmFtIGVuY29kaW5nCi0JICogICAgICAgICAgICBUaGUgdGFyZ2V0IGVuY29kaW5nLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCB0cmFuc2Zvcm0oU291cmNlIHhzbFNvdXJjZSwgU291cmNlIHhtbFNvdXJjZSwKLQkJCVdyaXRlciBvdXRwdXQsIFByb3BlcnRpZXMgcGFyYW1zLCBTdHJpbmcgZW5jb2RpbmcpIHRocm93cyBFeGNlcHRpb24gewotCQlpZiAoeHNsU291cmNlICE9IG51bGwgJiYgeG1sU291cmNlICE9IG51bGwpIHsKLQkJCVRyYW5zZm9ybWVyIHRyYW5zZm9ybWVyID0gbnVsbDsKLQkJCVN0cmluZyB4c2xGaWxlID0geHNsU291cmNlLmdldFN5c3RlbUlkKCk7Ci0JCQlpZiAoY2FjaGVYU0wgJiYgeHNsRmlsZSAhPSBudWxsKSB7Ci0JCQkJQ2FjaGVkVHJhbnNmb3JtZXIgY2FjaGVkVHJhbnNmb3JtZXIgPSBudWxsOwotCQkJCXN5bmNocm9uaXplZCAodHJhbnNmb3JtZXJDYWNoZSkgewotCQkJCQljYWNoZWRUcmFuc2Zvcm1lciA9IHRyYW5zZm9ybWVyQ2FjaGUuZ2V0KHhzbEZpbGUpOwotCQkJCQlpZiAoY2FjaGVkVHJhbnNmb3JtZXIgPT0gbnVsbCkgewotCQkJCQkJVHJhbnNmb3JtZXJGYWN0b3J5IGZhY3RvcnkgPSBUcmFuc2Zvcm1lckZhY3RvcnkKLQkJCQkJCQkJLm5ld0luc3RhbmNlKCk7Ci0JCQkJCQl0cmFuc2Zvcm1lciA9IGZhY3RvcnkubmV3VHJhbnNmb3JtZXIoeHNsU291cmNlKTsKLQkJCQkJCXRyYW5zZm9ybWVyQ2FjaGUucHV0KHhzbEZpbGUsIG5ldyBDYWNoZWRUcmFuc2Zvcm1lcigKLQkJCQkJCQkJdHJhbnNmb3JtZXIsIHBhcmFtcykpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJY2FjaGVkVHJhbnNmb3JtZXIuc2V0UGFyYW1zKHBhcmFtcyk7Ci0JCQkJCQl0cmFuc2Zvcm1lciA9IGNhY2hlZFRyYW5zZm9ybWVyLmdldFRyYW5zZm9ybWVyKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCVRyYW5zZm9ybWVyRmFjdG9yeSBmYWN0b3J5ID0gVHJhbnNmb3JtZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0JCQkJdHJhbnNmb3JtZXIgPSBmYWN0b3J5Lm5ld1RyYW5zZm9ybWVyKHhzbFNvdXJjZSk7Ci0KLQkJCQlpZiAocGFyYW1zICE9IG51bGwgJiYgcGFyYW1zLnNpemUoKSA+IDApIHsKLQkJCQkJZm9yIChJdGVyYXRvcjxPYmplY3Q+IGkgPSBwYXJhbXMua2V5U2V0KCkuaXRlcmF0b3IoKTsgaQotCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlTdHJpbmcgcGFyYW1OYW1lID0gKFN0cmluZykgaS5uZXh0KCk7Ci0JCQkJCQlTdHJpbmcgcGFyYW1WYWx1ZSA9IHBhcmFtcy5nZXRQcm9wZXJ0eShwYXJhbU5hbWUpOwotCQkJCQkJdHJhbnNmb3JtZXIuc2V0UGFyYW1ldGVyKHBhcmFtTmFtZSwgcGFyYW1WYWx1ZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmIChlbmNvZGluZyAhPSBudWxsICYmIGVuY29kaW5nLmxlbmd0aCgpID4gMCkgewotCQkJCXRyYW5zZm9ybWVyLnNldE91dHB1dFByb3BlcnR5KCJlbmNvZGluZyIsIGVuY29kaW5nKTsgLy8kTk9OLU5MUy0xJAotCQkJfSBlbHNlIHsKLQkJCQl0cmFuc2Zvcm1lci5zZXRPdXRwdXRQcm9wZXJ0eSgiZW5jb2RpbmciLCAidXRmLTgiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQl9Ci0JCQl0cmFuc2Zvcm1lci50cmFuc2Zvcm0oeG1sU291cmNlLCBuZXcgU3RyZWFtUmVzdWx0KG91dHB1dCkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogRXhlY3V0ZXMgdGhlIFhTTCB0cmFuc2Zvcm1hdGlvbiBnaXZlbiB0aGUgWFNMIHNvdXJjZSwgWE1MIHNvdXJjZSwgdGFyZ2V0Ci0JICogb3V0cHV0IGFuZCBlbmNvZGluZy4KLQkgKiAKLQkgKiBAcGFyYW0geHNsU291cmNlCi0JICogICAgICAgICAgICBUaGUgWFNMIHNvdXJjZS4KLQkgKiBAcGFyYW0geG1sU291cmNlCi0JICogICAgICAgICAgICBUaGUgWE1MIHNvdXJjZS4KLQkgKiBAcGFyYW0gb3V0cHV0Ci0JICogICAgICAgICAgICBUaGUgb3V0cHV0IHRhcmdldC4KLQkgKiBAcGFyYW0gZW5jb2RpbmcKLQkgKiAgICAgICAgICAgIFRoZSB0YXJnZXQgZW5jb2RpbmcuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHRyYW5zZm9ybShTb3VyY2UgeHNsU291cmNlLCBTb3VyY2UgeG1sU291cmNlLAotCQkJV3JpdGVyIG91dHB1dCwgU3RyaW5nIGVuY29kaW5nKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdHJhbnNmb3JtKHhzbFNvdXJjZSwgeG1sU291cmNlLCBvdXRwdXQsIG51bGwsIGVuY29kaW5nKTsKLQl9Ci0KLQkvKioKLQkgKiBFeGVjdXRlcyB0aGUgWFNMIHRyYW5zZm9ybWF0aW9uIGdpdmVuIHRoZSBYU0wgc3R5bGVzaGVldCBVUkksIFhNTCBzb3VyY2UsCi0JICogdGFyZ2V0IG91dHB1dCBhbmQgZW5jb2RpbmcuCi0JICogCi0JICogQHBhcmFtIHhzbFVSSQotCSAqICAgICAgICAgICAgVGhlIFhTTCBzdHlsZXNoZWV0IFVSSS4KLQkgKiBAcGFyYW0geG1sU3RyCi0JICogICAgICAgICAgICBUaGUgWE1MIHNvdXJjZS4KLQkgKiBAcGFyYW0gb3V0cHV0Ci0JICogICAgICAgICAgICBUaGUgb3V0cHV0IHRhcmdldC4KLQkgKiBAcGFyYW0gcGFyYW1zCi0JICogICAgICAgICAgICBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIFhTTCB0cmFuc2Zvcm1hdGlvbi4KLQkgKiBAcGFyYW0gZW5jb2RpbmcKLQkgKiAgICAgICAgICAgIFRoZSB0YXJnZXQgZW5jb2RpbmcuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHRyYW5zZm9ybShTdHJpbmcgeHNsVXJpLCBTb3VyY2UgeG1sU291cmNlLAotCQkJV3JpdGVyIG91dHB1dCwgUHJvcGVydGllcyBwYXJhbXMsIFN0cmluZyBlbmNvZGluZykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlucHV0U3RyZWFtIHhzbElucHV0ID0gZ2V0WHNsSW5wdXRTdHJlYW0oeHNsVXJpKTsKLQkJaWYgKHhzbElucHV0ICE9IG51bGwpIHsKLQkJCVN0cmVhbVNvdXJjZSB4c2xTb3VyY2UgPSBuZXcgU3RyZWFtU291cmNlKHhzbElucHV0KTsKLQkJCXhzbFNvdXJjZS5zZXRTeXN0ZW1JZChuZXcgRmlsZSh4c2xVcmkpKTsKLQkJCXRyYW5zZm9ybSh4c2xTb3VyY2UsIHhtbFNvdXJjZSwgb3V0cHV0LCBwYXJhbXMsIGVuY29kaW5nKTsKLQkJCXRyeSB7Ci0JCQkJeHNsSW5wdXQuY2xvc2UoKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBFeGVjdXRlcyB0aGUgWFNMIHRyYW5zZm9ybWF0aW9uIGdpdmVuIHRoZSBYU0wgc3R5bGVzaGVldCBVUkksIFhNTCBzb3VyY2UsCi0JICogdGFyZ2V0IG91dHB1dCBhbmQgZW5jb2RpbmcuCi0JICogCi0JICogQHBhcmFtIHhzbFVSSQotCSAqICAgICAgICAgICAgVGhlIFhTTCBzdHlsZXNoZWV0IFVSSS4KLQkgKiBAcGFyYW0geG1sU3RyCi0JICogICAgICAgICAgICBUaGUgWE1MIHNvdXJjZS4KLQkgKiBAcGFyYW0gb3V0cHV0Ci0JICogICAgICAgICAgICBUaGUgb3V0cHV0IHRhcmdldC4KLQkgKiBAcGFyYW0gZW5jb2RpbmcKLQkgKiAgICAgICAgICAgIFRoZSB0YXJnZXQgZW5jb2RpbmcuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHRyYW5zZm9ybShTdHJpbmcgeHNsVXJpLCBTb3VyY2UgeG1sU291cmNlLAotCQkJV3JpdGVyIG91dHB1dCwgU3RyaW5nIGVuY29kaW5nKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdHJhbnNmb3JtKHhzbFVyaSwgeG1sU291cmNlLCBvdXRwdXQsIG51bGwsIGVuY29kaW5nKTsKLQl9Ci0KLQkvKioKLQkgKiBFeGVjdXRlcyB0aGUgWFNMIHRyYW5zZm9ybWF0aW9uIGdpdmVuIHRoZSBYU0wgc3R5bGVzaGVldCBVUkksIFhNTCBzdHJpbmcsCi0JICogdGFyZ2V0IG91dHB1dCBhbmQgZW5jb2RpbmcuCi0JICogCi0JICogQHBhcmFtIHhzbFVSSQotCSAqICAgICAgICAgICAgVGhlIFhTTCBzdHlsZXNoZWV0IFVSSS4KLQkgKiBAcGFyYW0geG1sU3RyCi0JICogICAgICAgICAgICBUaGUgWE1MIHN0cmluZy4KLQkgKiBAcGFyYW0gb3V0cHV0Ci0JICogICAgICAgICAgICBUaGUgb3V0cHV0IHRhcmdldC4KLQkgKiBAcGFyYW0gcGFyYW1zCi0JICogICAgICAgICAgICBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIFhTTCB0cmFuc2Zvcm1hdGlvbi4KLQkgKiBAcGFyYW0gZW5jb2RpbmcKLQkgKiAgICAgICAgICAgIFRoZSB0YXJnZXQgZW5jb2RpbmcuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHRyYW5zZm9ybShTdHJpbmcgeHNsVXJpLCBTdHJpbmcgeG1sU3RyLCBXcml0ZXIgb3V0cHV0LAotCQkJUHJvcGVydGllcyBwYXJhbXMsIFN0cmluZyBlbmNvZGluZykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlucHV0U3RyZWFtIHhzbElucHV0ID0gZ2V0WHNsSW5wdXRTdHJlYW0oeHNsVXJpKTsKLQkJaWYgKHhzbElucHV0ICE9IG51bGwpIHsKLQkJCVN0cmVhbVNvdXJjZSB4c2xTb3VyY2UgPSBuZXcgU3RyZWFtU291cmNlKHhzbElucHV0KTsKLQkJCXhzbFNvdXJjZS5zZXRTeXN0ZW1JZChuZXcgRmlsZSh4c2xVcmkpKTsKLQotCQkJYnl0ZVtdIHhtbCA9IHhtbFN0ci5nZXRCeXRlcygidXRmLTgiKTsgLy8kTk9OLU5MUy0xJAotCQkJQnl0ZUFycmF5SW5wdXRTdHJlYW0geG1sSW5wdXQgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oeG1sKTsKLQkJCVN0cmVhbVNvdXJjZSB4bWxTb3VyY2UgPSBuZXcgU3RyZWFtU291cmNlKHhtbElucHV0KTsKLQotCQkJdHJhbnNmb3JtKHhzbFNvdXJjZSwgeG1sU291cmNlLCBvdXRwdXQsIHBhcmFtcywgZW5jb2RpbmcpOwotCi0JCQl0cnkgewotCQkJCXhzbElucHV0LmNsb3NlKCk7Ci0JCQkJeG1sSW5wdXQuY2xvc2UoKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBFeGVjdXRlcyB0aGUgWFNMIHRyYW5zZm9ybWF0aW9uIGdpdmVuIHRoZSBYU0wgc3R5bGVzaGVldCBVUkksIFhNTCBzdHJpbmcsCi0JICogdGFyZ2V0IG91dHB1dCBhbmQgZW5jb2RpbmcuCi0JICogCi0JICogQHBhcmFtIHhzbFVSSQotCSAqICAgICAgICAgICAgVGhlIFhTTCBzdHlsZXNoZWV0IFVSSS4KLQkgKiBAcGFyYW0geG1sU3RyCi0JICogICAgICAgICAgICBUaGUgWE1MIHN0cmluZy4KLQkgKiBAcGFyYW0gb3V0cHV0Ci0JICogICAgICAgICAgICBUaGUgb3V0cHV0IHRhcmdldC4KLQkgKiBAcGFyYW0gZW5jb2RpbmcKLQkgKiAgICAgICAgICAgIFRoZSB0YXJnZXQgZW5jb2RpbmcuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHRyYW5zZm9ybShTdHJpbmcgeHNsVXJpLCBTdHJpbmcgeG1sU3RyLCBXcml0ZXIgb3V0cHV0LAotCQkJU3RyaW5nIGVuY29kaW5nKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdHJhbnNmb3JtKHhzbFVyaSwgeG1sU3RyLCBvdXRwdXQsIG51bGwsIGVuY29kaW5nKTsKLQl9Ci0KLQkvKioKLQkgKiBFeGVjdXRlcyB0aGUgWFNMIHRyYW5zZm9ybWF0aW9uIGdpdmVuIHRoZSBYU0wgc3R5bGVzaGVldCBVUkksIFhNTCBzdHJpbmcsCi0JICogdGFyZ2V0IG91dHB1dCBhbmQgZW5jb2RpbmcuCi0JICogCi0JICogQHBhcmFtIHhzbFVSSQotCSAqICAgICAgICAgICAgVGhlIFhTTCBzdHlsZXNoZWV0IFVSSS4KLQkgKiBAcGFyYW0geG1sU3RyCi0JICogICAgICAgICAgICBUaGUgWE1MIHN0cmluZy4KLQkgKiBAcGFyYW0gZmlsZQotCSAqICAgICAgICAgICAgVGhlIG91dHB1dCBmaWxlLgotCSAqIEBwYXJhbSBwYXJhbXMKLQkgKiAgICAgICAgICAgIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgWFNMIHRyYW5zZm9ybWF0aW9uLgotCSAqIEBwYXJhbSBlbmNvZGluZwotCSAqICAgICAgICAgICAgVGhlIHRhcmdldCBlbmNvZGluZy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgdHJhbnNmb3JtKFN0cmluZyB4c2xVcmksIFN0cmluZyB4bWxTdHIsIEZpbGUgZmlsZSwKLQkJCVByb3BlcnRpZXMgcGFyYW1zLCBTdHJpbmcgZW5jb2RpbmcpIHRocm93cyBFeGNlcHRpb24gewotCQlGaWxlV3JpdGVyIG91dHB1dCA9IG5ldyBGaWxlV3JpdGVyKGZpbGUpOwotCQlpZiAob3V0cHV0ICE9IG51bGwpIHsKLQkJCXRyYW5zZm9ybSh4c2xVcmksIHhtbFN0ciwgb3V0cHV0LCBwYXJhbXMsIGVuY29kaW5nKTsKLQkJCXRyeSB7Ci0JCQkJb3V0cHV0LmNsb3NlKCk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogRXhlY3V0ZXMgdGhlIFhTTCB0cmFuc2Zvcm1hdGlvbiBnaXZlbiB0aGUgWFNMIHN0eWxlc2hlZXQgVVJJLCBYTUwgc3RyaW5nLAotCSAqIHRhcmdldCBvdXRwdXQgYW5kIGVuY29kaW5nLgotCSAqIAotCSAqIEBwYXJhbSB4c2xVUkkKLQkgKiAgICAgICAgICAgIFRoZSBYU0wgc3R5bGVzaGVldCBVUkkuCi0JICogQHBhcmFtIHhtbFN0cgotCSAqICAgICAgICAgICAgVGhlIFhNTCBzdHJpbmcuCi0JICogQHBhcmFtIGZpbGUKLQkgKiAgICAgICAgICAgIFRoZSBvdXRwdXQgZmlsZS4KLQkgKiBAcGFyYW0gZW5jb2RpbmcKLQkgKiAgICAgICAgICAgIFRoZSB0YXJnZXQgZW5jb2RpbmcuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHRyYW5zZm9ybShTdHJpbmcgeHNsVXJpLCBTdHJpbmcgeG1sU3RyLCBGaWxlIGZpbGUsCi0JCQlTdHJpbmcgZW5jb2RpbmcpIHRocm93cyBFeGNlcHRpb24gewotCQl0cmFuc2Zvcm0oeHNsVXJpLCB4bWxTdHIsIGZpbGUsIG51bGwsIGVuY29kaW5nKTsKLQl9Ci0KLQkvKioKLQkgKiBFeGVjdXRlcyB0aGUgWFNMIHRyYW5zZm9ybWF0aW9uIGdpdmVuIHRoZSBYU0wgc3R5bGVzaGVldCBVUkksIFhNTCBzb3VyY2UKLQkgKiBhbmQgdGFyZ2V0IG91dHB1dC4KLQkgKiAKLQkgKiBAcGFyYW0geHNsVVJJCi0JICogICAgICAgICAgICBUaGUgWFNMIHN0eWxlc2hlZXQgVVJJLgotCSAqIEBwYXJhbSB4bWxTdHIKLQkgKiAgICAgICAgICAgIFRoZSBYTUwgc291cmNlLgotCSAqIEBwYXJhbSBwYXJhbXMKLQkgKiAgICAgICAgICAgIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgWFNMIHRyYW5zZm9ybWF0aW9uLgotCSAqIEBwYXJhbSBvdXRwdXQKLQkgKiAgICAgICAgICAgIFRoZSBvdXRwdXQgdGFyZ2V0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCB0cmFuc2Zvcm0oU3RyaW5nIHhzbFVyaSwgU291cmNlIHhtbFNvdXJjZSwKLQkJCVByb3BlcnRpZXMgcGFyYW1zLCBXcml0ZXIgb3V0cHV0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdHJhbnNmb3JtKHhzbFVyaSwgeG1sU291cmNlLCBvdXRwdXQsIHBhcmFtcywgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogRXhlY3V0ZXMgdGhlIFhTTCB0cmFuc2Zvcm1hdGlvbiBnaXZlbiB0aGUgWFNMIHN0eWxlc2hlZXQgVVJJLCBYTUwgc291cmNlCi0JICogYW5kIHRhcmdldCBvdXRwdXQuCi0JICogCi0JICogQHBhcmFtIHhzbFVSSQotCSAqICAgICAgICAgICAgVGhlIFhTTCBzdHlsZXNoZWV0IFVSSS4KLQkgKiBAcGFyYW0geG1sU3RyCi0JICogICAgICAgICAgICBUaGUgWE1MIHNvdXJjZS4KLQkgKiBAcGFyYW0gb3V0cHV0Ci0JICogICAgICAgICAgICBUaGUgb3V0cHV0IHRhcmdldC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgdHJhbnNmb3JtKFN0cmluZyB4c2xVcmksIFNvdXJjZSB4bWxTb3VyY2UsIFdyaXRlciBvdXRwdXQpCi0JCQl0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdHJhbnNmb3JtKHhzbFVyaSwgeG1sU291cmNlLCBvdXRwdXQsIG51bGwsIG51bGwpOwotCX0KLQotCS8qKgotCSAqIEV4ZWN1dGVzIHRoZSBYU0wgdHJhbnNmb3JtYXRpb24gZ2l2ZW4gdGhlIFhTTCBzdHlsZXNoZWV0IFVSSSwgWE1MIHN0cmluZwotCSAqIGFuZCB0YXJnZXQgb3V0cHV0LgotCSAqIAotCSAqIEBwYXJhbSB4c2xVUkkKLQkgKiAgICAgICAgICAgIFRoZSBYU0wgc3R5bGVzaGVldCBVUkkuCi0JICogQHBhcmFtIHhtbFN0cgotCSAqICAgICAgICAgICAgVGhlIFhNTCBzdHJpbmcuCi0JICogQHBhcmFtIHBhcmFtcwotCSAqICAgICAgICAgICAgVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBYU0wgdHJhbnNmb3JtYXRpb24uCi0JICogQHBhcmFtIG91dHB1dAotCSAqICAgICAgICAgICAgVGhlIG91dHB1dCB0YXJnZXQuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHRyYW5zZm9ybShTdHJpbmcgeHNsVXJpLCBTdHJpbmcgeG1sU3RyLAotCQkJUHJvcGVydGllcyBwYXJhbXMsIFdyaXRlciBvdXRwdXQpIHRocm93cyBFeGNlcHRpb24gewotCQl0cmFuc2Zvcm0oeHNsVXJpLCB4bWxTdHIsIG91dHB1dCwgcGFyYW1zLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBFeGVjdXRlcyB0aGUgWFNMIHRyYW5zZm9ybWF0aW9uIGdpdmVuIHRoZSBYU0wgc3R5bGVzaGVldCBVUkksIFhNTCBzdHJpbmcKLQkgKiBhbmQgdGFyZ2V0IG91dHB1dC4KLQkgKiAKLQkgKiBAcGFyYW0geHNsVVJJCi0JICogICAgICAgICAgICBUaGUgWFNMIHN0eWxlc2hlZXQgVVJJLgotCSAqIEBwYXJhbSB4bWxTdHIKLQkgKiAgICAgICAgICAgIFRoZSBYTUwgc3RyaW5nLgotCSAqIEBwYXJhbSBvdXRwdXQKLQkgKiAgICAgICAgICAgIFRoZSBvdXRwdXQgdGFyZ2V0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCB0cmFuc2Zvcm0oU3RyaW5nIHhzbFVyaSwgU3RyaW5nIHhtbFN0ciwgV3JpdGVyIG91dHB1dCkKLQkJCXRocm93cyBFeGNlcHRpb24gewotCQl0cmFuc2Zvcm0oeHNsVXJpLCB4bWxTdHIsIG91dHB1dCwgbnVsbCwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogRXhlY3V0ZXMgdGhlIFhTTCB0cmFuc2Zvcm1hdGlvbiBnaXZlbiB0aGUgWFNMIHN0eWxlc2hlZXQgVVJJLCBYTUwgc3RyaW5nCi0JICogYW5kIHRhcmdldCBvdXRwdXQgZmlsZS4KLQkgKiAKLQkgKiBAcGFyYW0geHNsVVJJCi0JICogICAgICAgICAgICBUaGUgWFNMIHN0eWxlc2hlZXQgVVJJLgotCSAqIEBwYXJhbSB4bWxTdHIKLQkgKiAgICAgICAgICAgIFRoZSBYTUwgc3RyaW5nLgotCSAqIEBwYXJhbSBwYXJhbXMKLQkgKiAgICAgICAgICAgIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgWFNMIHRyYW5zZm9ybWF0aW9uLgotCSAqIEBwYXJhbSBvdXRwdXQKLQkgKiAgICAgICAgICAgIFRoZSBvdXRwdXQgdGFyZ2V0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCB0cmFuc2Zvcm0oU3RyaW5nIHhzbFVyaSwgU3RyaW5nIHhtbFN0ciwKLQkJCVByb3BlcnRpZXMgcGFyYW1zLCBGaWxlIGZpbGUpIHRocm93cyBFeGNlcHRpb24gewotCQl0cmFuc2Zvcm0oeHNsVXJpLCB4bWxTdHIsIGZpbGUsIHBhcmFtcywgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogRXhlY3V0ZXMgdGhlIFhTTCB0cmFuc2Zvcm1hdGlvbiBnaXZlbiB0aGUgWFNMIHN0eWxlc2hlZXQgVVJJLCBYTUwgc3RyaW5nCi0JICogYW5kIHRhcmdldCBvdXRwdXQgZmlsZS4KLQkgKiAKLQkgKiBAcGFyYW0geHNsVVJJCi0JICogICAgICAgICAgICBUaGUgWFNMIHN0eWxlc2hlZXQgVVJJLgotCSAqIEBwYXJhbSB4bWxTdHIKLQkgKiAgICAgICAgICAgIFRoZSBYTUwgc3RyaW5nLgotCSAqIEBwYXJhbSBvdXRwdXQKLQkgKiAgICAgICAgICAgIFRoZSBvdXRwdXQgdGFyZ2V0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCB0cmFuc2Zvcm0oU3RyaW5nIHhzbFVyaSwgU3RyaW5nIHhtbFN0ciwgRmlsZSBmaWxlKQotCQkJdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRyYW5zZm9ybSh4c2xVcmksIHhtbFN0ciwgZmlsZSwgbnVsbCwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgWFNMIGlucHV0IHN0cmVhbSBnaXZlbiB0aGUgWFNMIHN0eWxlc2hlZXQgVVJJLgotCSAqIAotCSAqIEBwYXJhbSB4c2xVUkkKLQkgKiAgICAgICAgICAgIFRoZSBYU0wgc3R5bGVzaGVldCBVUkkuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgSW5wdXRTdHJlYW0gZ2V0WHNsSW5wdXRTdHJlYW0oU3RyaW5nIHhzbFVyaSkgewotCQlJbnB1dFN0cmVhbSB4c2xJbnB1dCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQl4c2xJbnB1dCA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oeHNsVXJpKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWlmICh4c2xJbnB1dCA9PSBudWxsKSB7Ci0JCQkJeHNsSW5wdXQgPSBYU0xUUHJvY2Vzc29yLmNsYXNzLmdldENsYXNzTG9hZGVyKCkKLQkJCQkJCS5nZXRSZXNvdXJjZUFzU3RyZWFtKHhzbFVyaSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHhzbElucHV0OwotCX0KLQotfQotCi0vKioKLSAqIEEgY2FjaGVkIFhTTCBUcmFuc2Zvcm1lciBvYmplY3QuCi0gKi8KLWNsYXNzIENhY2hlZFRyYW5zZm9ybWVyIHsKLQotCXByaXZhdGUgVHJhbnNmb3JtZXIgdHJhbnNmb3JtZXI7Ci0JcHJpdmF0ZSBQcm9wZXJ0aWVzIHBhcmFtczsKLQotCXB1YmxpYyBDYWNoZWRUcmFuc2Zvcm1lcihUcmFuc2Zvcm1lciB0cmFuc2Zvcm1lciwgUHJvcGVydGllcyBwYXJhbXMpIHsKLQkJdGhpcy50cmFuc2Zvcm1lciA9IHRyYW5zZm9ybWVyOwotCQlzZXRQYXJhbXMocGFyYW1zKTsKLQl9Ci0KLQlwdWJsaWMgVHJhbnNmb3JtZXIgZ2V0VHJhbnNmb3JtZXIoKSB7Ci0JCXJldHVybiB0cmFuc2Zvcm1lcjsKLQl9Ci0KLQlwdWJsaWMgUHJvcGVydGllcyBnZXRQYXJhbXMoKSB7Ci0JCXJldHVybiBwYXJhbXM7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UGFyYW1zKFByb3BlcnRpZXMgcGFyYW1zKSB7Ci0JCWlmIChwYXJhbXMgIT0gdGhpcy5wYXJhbXMpIHsKLQkJCXRyYW5zZm9ybWVyLmNsZWFyUGFyYW1ldGVycygpOwotCQkJZm9yIChJdGVyYXRvcjxPYmplY3Q+IGkgPSBwYXJhbXMua2V5U2V0KCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQkJU3RyaW5nIHBhcmFtTmFtZSA9IChTdHJpbmcpIGkubmV4dCgpOwotCQkJCVN0cmluZyBwYXJhbVZhbHVlID0gcGFyYW1zLmdldFByb3BlcnR5KHBhcmFtTmFtZSk7Ci0JCQkJdHJhbnNmb3JtZXIuc2V0UGFyYW1ldGVyKHBhcmFtTmFtZSwgcGFyYW1WYWx1ZSk7Ci0JCQl9Ci0JCQl0aGlzLnBhcmFtcyA9IHBhcmFtczsJCQkKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi94bWwvcGFja2FnZS5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi94bWwvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MmNhNzQxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24veG1sL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIFhNTCBhbmQgWFNMVCBwcm9jZXNzaW5nIHNlcnZpY2VzLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2UvLmNsYXNzcGF0aCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2UvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzUxYzhmMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlLy5wcm9qZWN0IGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjFiOWU4OC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlL01FVEEtSU5GL01BTklGRVNULk1GIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGMyOWExNy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2UKLUJ1bmRsZS1WZXJzaW9uOiAxLjUuMC5xdWFsaWZpZXIKLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5Ci1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS5pbXBvcnRpbmcsCi0gb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS5pbnRlcm5hbC5pbXBvcnRpbmcsCi0gb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS51dGlsCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2UvYnVpbGQucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2UvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzdkOTg0OS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLXNvdXJjZS4uID0gc3JjLwotb3V0cHV0Li4gPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSAuLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcwpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS9wbHVnaW4ucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2UvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3OWI5MWIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLXBsdWdpbk5hbWU9RVBGIERhdGEgRXhjaGFuZ2UgUGx1Zy1pbgotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RhdGFleGNoYW5nZS9pbXBvcnRpbmcvTGlicmFyeVNlcnZpY2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9kYXRhZXhjaGFuZ2UvaW1wb3J0aW5nL0xpYnJhcnlTZXJ2aWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxNDNhZWIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RhdGFleGNoYW5nZS9pbXBvcnRpbmcvTGlicmFyeVNlcnZpY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2UuaW1wb3J0aW5nOwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2UuaW50ZXJuYWwuaW1wb3J0aW5nLkxpYnJhcnlTZXJ2aWNlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci0KLQotLyoqCi0gKiBMaWJyYXJ5IHNlcnZpY2UgZm9yIGltcG9ydGluZyBleHRlcm5hbCBsaWJyYXJ5L3BsdWdpbnMgaW50byB0aGUgY3VycmVudCBsaWJyYXJ5LgotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICoKLSAqLwotcHVibGljIGludGVyZmFjZSBMaWJyYXJ5U2VydmljZSB7Ci0KLQlwdWJsaWMgc3RhdGljIExpYnJhcnlTZXJ2aWNlIElOU1RBTkNFID0gbmV3IExpYnJhcnlTZXJ2aWNlSW1wbCgpOwotCS8qKgotCSAqIGNyZWF0ZSBhIG5ldyBNZXRob2RQbHVnaW4gYW5kIGFkZCB0byB0aGUgbGlicmFyeSwgcGVyZm9ybSBpbml0aWFsaXphdGlvbiBhcyBuZWVkZWQKLQkgKiBAcGFyYW0gbmFtZQotCSAqIEByZXR1cm4gTWV0aG9kUGx1Z2luIAotCSAqLwotCXB1YmxpYyBNZXRob2RQbHVnaW4gY3JlYXRlUGx1Z2luKFN0cmluZyBuYW1lLCBTdHJpbmcgZ3VpZCkgdGhyb3dzIEV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIGNyZWF0ZSBhIG5ldyBNZXRob2RQbHVnaW4gYW5kIGFkZCB0byB0aGUgbGlicmFyeSwgcGVyZm9ybSBpbml0aWFsaXphdGlvbiBhcyBuZWVkZWQKLQkgKiBAcGFyYW0gbmFtZQotCSAqIEBwYXJhbSBndWlkCi0JICogQHBhcmFtIG9wdGlvbnMKLQkgKiBAcmV0dXJuIE1ldGhvZFBsdWdpbgotCSAqLwotCXB1YmxpYyBNZXRob2RQbHVnaW4gY3JlYXRlUGx1Z2luKFN0cmluZyBuYW1lLCBTdHJpbmcgZ3VpZCwgTWFwIG9wdGlvbnMpIHRocm93cyBFeGNlcHRpb247Ci0KLQkKLQkvKioKLQkgKiBjcmVhdGUgYSBNZXRob2RDb25maWd1cmF0aW9uIGZvciB0aGlzIGxpYnJhcnkKLQkgKiBAcGFyYW0gbmFtZQotCSAqIEByZXR1cm4gTWV0aG9kQ29uZmlndXJhdGlvbgotCSAqLwotCXB1YmxpYyBNZXRob2RDb25maWd1cmF0aW9uIGNyZWF0ZUNvbmZpZ3VyYXRpb24oU3RyaW5nIG5hbWUsIFN0cmluZyBndWlkKTsKLQotCS8qKgotCSAqIGNyZWF0ZSBhIHBsdWdpbiBzZXJ2aWNlIGZvciB0aGUgc3BlY2lmaWVkIHBsdWdpbgotCSAqIEBwYXJhbSBwbHVnaW4gTWV0aG9kUGx1Z2luCi0JICogQHJldHVybiBQbHVnaW5TZXJ2aWNlCi0JICovCi0JcHVibGljIFBsdWdpblNlcnZpY2UgY3JlYXRlUGx1Z2luU2VydmljZShNZXRob2RQbHVnaW4gcGx1Z2luKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGF0YWV4Y2hhbmdlL2ltcG9ydGluZy9QbHVnaW5TZXJ2aWNlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGF0YWV4Y2hhbmdlL2ltcG9ydGluZy9QbHVnaW5TZXJ2aWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0NTU2MzUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RhdGFleGNoYW5nZS9pbXBvcnRpbmcvUGx1Z2luU2VydmljZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2UuaW1wb3J0aW5nOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQXJ0aWZhY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DYXBhYmlsaXR5UGF0dGVybjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNoZWNrbGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbmNlcHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkN1c3RvbUNhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyeVByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaXNjaXBsaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGlzY2lwbGluZUdyb3VwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRXhhbXBsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkd1aWRhbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuSXRlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1pbGVzdG9uZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk91dGNvbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5QaGFzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByYWN0aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUmVwb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUmV1c2FibGVBc3NldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvYWRtYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVTZXRHcm91cGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlN1cHBvcnRpbmdNYXRlcmlhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZW1wbGF0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRlcm1EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVG9vbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRvb2xNZW50b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5XaGl0ZXBhcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3RUeXBlOwotCi0vKioKLSAqIFBsdWdpbiBzZXJ2aWNlIGZvciBpbXBvcnRpbmcgZXh0ZXJuYWwgcGx1Z2luIGRhdGEgaW50byB0aGUgY3VycmVudCBsaWJyYXJ5Ci0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFBsdWdpblNlcnZpY2UgewotCi0JcHVibGljIENvbnRlbnRQYWNrYWdlIGdldENvbnRlbnRQYWNrYWdlUm9vdCgpOwotCi0JLyoqCi0JICogY3JlYXRlIGEgRGlzY2lwbGluZSBvYmplY3QgYWRkIGFkZCB0byB0aGUgc3lzdGVtIGRlZmF1bHQgRGlzY2lwbGluZXMgcGFja2FnZQotCSAqIEBwYXJhbSBuYW1lCi0JICogQHJldHVybiBEaXNjaXBsaW5lCi0JICovCi0JcHVibGljIERpc2NpcGxpbmUgY3JlYXRlRGlzY2lwbGluZSgpOwotCi0JLyoqCi0JICogY3JlYXRlIGEgRGlzY2lwbGluZUdyb3VwaW5nIG9iamVjdCBhZGQgYWRkIHRvIHRoZSBzeXN0ZW0gZGVmYXVsdCBEaXNjaXBsaW5lcyBwYWNrYWdlCi0JICogQHBhcmFtIG5hbWUKLQkgKiBAcmV0dXJuIERpc2NpcGxpbmVHcm91cGluZwotCSAqLwotCXB1YmxpYyBEaXNjaXBsaW5lR3JvdXBpbmcgY3JlYXRlRGlzY2lwbGluZUdyb3VwaW5nKCk7Ci0KLQkvKioKLQkgKiBjcmVhdGUgYSBUb29sIG9iamVjdCBhZGQgYWRkIHRvIHRoZSBzeXN0ZW0gZGVmYXVsdCBUb29scyBwYWNrYWdlCi0JICogQHBhcmFtIG5hbWUKLQkgKiBAcmV0dXJuIFRvb2wKLQkgKi8KLQlwdWJsaWMgVG9vbCBjcmVhdGVUb29sKCk7Ci0KLQkvKioKLQkgKiBjcmVhdGUgYSBEb21haW4gb2JqZWN0IGFkZCBhZGQgdG8gdGhlIHN5c3RlbSBkZWZhdWx0IERvbWFpbnMgcGFja2FnZQotCSAqIEBwYXJhbSBuYW1lCi0JICogQHJldHVybiBEb21haW4KLQkgKi8KLQlwdWJsaWMgRG9tYWluIGNyZWF0ZURvbWFpbigpOwotCi0JLyoqCi0JICogY3JlYXRlIGEgV29ya1Byb2R1Y3RUeXBlIG9iamVjdCBhZGQgYWRkIHRvIHRoZSBzeXN0ZW0gZGVmYXVsdCBXb3JrUHJvZHVjdFR5cGVzIHBhY2thZ2UKLQkgKiBAcGFyYW0gbmFtZQotCSAqIEByZXR1cm4gV29ya1Byb2R1Y3RUeXBlCi0JICovCi0JcHVibGljIFdvcmtQcm9kdWN0VHlwZSBjcmVhdGVXb3JrUHJvZHVjdFR5cGUoKTsKLQotCS8qKgotCSAqIGNyZWF0ZSBhIFJvbGVTZXQgb2JqZWN0IGFkZCBhZGQgdG8gdGhlIHN5c3RlbSBkZWZhdWx0IFJvbGVTZXRzIHBhY2thZ2UKLQkgKiBAcGFyYW0gbmFtZQotCSAqIEByZXR1cm4gUm9sZVNldAotCSAqLwotCXB1YmxpYyBSb2xlU2V0IGNyZWF0ZVJvbGVTZXQoKTsKLQotCS8qKgotCSAqIGNyZWF0ZSBhIFJvbGVTZXRHcm91cGluZyBvYmplY3QgYWRkIGFkZCB0byB0aGUgc3lzdGVtIGRlZmF1bHQgUm9sZVNldHMgcGFja2FnZQotCSAqIEBwYXJhbSBuYW1lCi0JICogQHJldHVybiBSb2xlU2V0R3JvdXBpbmcKLQkgKi8KLQlwdWJsaWMgUm9sZVNldEdyb3VwaW5nIGNyZWF0ZVJvbGVTZXRHcm91cGluZygpOwotCi0JLyoqCi0JICogY3JlYXRlIGEgQ3VzdG9tQ2F0ZWdvcnkgb2JqZWN0IGFkZCBhZGQgdG8gdGhlIHN5c3RlbSBkZWZhdWx0IEN1c3RvbUNhdGVnb3JpZXMgcGFja2FnZQotCSAqIEBwYXJhbSBuYW1lCi0JICogQHJldHVybiBDdXN0b21DYXRlZ29yeQotCSAqLwotCXB1YmxpYyBDdXN0b21DYXRlZ29yeSBjcmVhdGVDdXN0b21DYXRlZ29yeShDdXN0b21DYXRlZ29yeSBwYXJlbnQpOwotCi0JLyoqCi0JICogY3JlYXRlIGEgQ2FwYWJpbGl0eVBhdHRlcm4gb2JqZWN0IGFkZCBhZGQgdG8gdGhlIHN5c3RlbSBkZWZhdWx0IENhcGFiaWxpdHlQYXR0ZXJucyBwYWNrYWdlCi0JICogcGVyZm9ybSBvdGhlciBpbml0aWFsaXphdGlvbnMgYXMgbmVlZGVkLCBzdWNoIGFzIGNyZWF0ZSB0aGUgY29udGFpbmluZyBQcm9jZXNzQ29tcG9uZW50LgotCSAqIEBwYXJhbSBuYW1lCi0JICogQHJldHVybiBQcm9jZXNzU2VydmljZSBhIFByb2Nlc3NTZXJ2aWNlIHRoYXQgY29udGFpbnMgdGhlIGNyZWF0ZWQgQ2FwYWJpbGl0eVBhdHRlcm4KLQkgKi8KLQlwdWJsaWMgQ2FwYWJpbGl0eVBhdHRlcm4gY3JlYXRlQ2FwYWJpbGl0eVBhdHRlcm4oTWV0aG9kQ29uZmlndXJhdGlvbiBkZWZhdWx0Q29uZmlnKTsKLQotCS8qKgotCSAqIGNyZWF0ZSBhIERlbGl2ZXJ5UHJvY2VzcyBvYmplY3QgYWRkIGFkZCB0byB0aGUgc3lzdGVtIGRlZmF1bHQgRGVsaXZlcnlQcm9jZXNzZXMgcGFja2FnZS4KLQkgKiBwZXJmb3JtIG90aGVyIGluaXRpYWxpemF0aW9ucyBhcyBuZWVkZWQsIHN1Y2ggYXMgY3JlYXRlIHRoZSBjb250YWluaW5nIFByb2Nlc3NDb21wb25lbnQuCi0JICogQHBhcmFtIG5hbWUKLQkgKiBAcmV0dXJuIFByb2Nlc3NTZXJ2aWNlIGEgUHJvY2Vzc1NlcnZpY2UgdGhhdCBjb250YWlucyB0aGUgY3JlYXRlZCBEZWxpdmVyeVByb2Nlc3MKLQkgKi8KLQlwdWJsaWMgRGVsaXZlcnlQcm9jZXNzIGNyZWF0ZURlbGl2ZXJ5UHJvY2VzcyhNZXRob2RDb25maWd1cmF0aW9uIGRlZmF1bHRDb25maWcpOwotCi0JLyoqCi0JICogY3JlYXRlIGEgY29udGVudCBwYWNrYWdlIGFzIHRoZSBjaGlsZCBvZiB0aGUgaW50ZXJuYWwgcm9vdCBjb250ZW50IHBhY2thZ2UsCi0JICogQHJldHVybiBDb250ZW50UGFja2FnZVNlcnZpY2UgYSBDb250ZW50UGFja2FnZVNlcnZpY2UgdGhhdCBjb250YWlucyB0aGUgY3JlYXRlZCBDb250ZW50UGFja2FnZQotCSAqLwotCXB1YmxpYyBDb250ZW50UGFja2FnZSBjcmVhdGVDb250ZW50UGFja2FnZShDb250ZW50UGFja2FnZSBjb250YWluZXIpOwotCi0KLQkvKioKLQkgKiBjcmVhdGUgYSBuZXcgY2hpbGQgcGFja2FnZQotCSAqIEByZXR1cm4gQ29udGVudFBhY2thZ2VTZXJ2aWNlIGEgQ29udGVudFBhY2thZ2VTZXJ2aWNlIGZvciB0aGUgY3JlYXRlZCBwYWNrYWdlCi0JICovCi0JLy9wdWJsaWMgQ29udGVudFBhY2thZ2UgY3JlYXRlQ2hpbGRQYWNrYWdlKENvbnRlbnRQYWNrYWdlIGNvbnRhaW5lcik7Ci0KLQlwdWJsaWMgQXJ0aWZhY3QgY3JlYXRlQXJ0aWZhY3QoQ29udGVudFBhY2thZ2UgY29udGFpbmVyKTsKLQlwdWJsaWMgQ2hlY2tsaXN0IGNyZWF0ZUNoZWNrbGlzdChDb250ZW50UGFja2FnZSBjb250YWluZXIpOwotCXB1YmxpYyBDb25jZXB0IGNyZWF0ZUNvbmNlcHQoQ29udGVudFBhY2thZ2UgY29udGFpbmVyKTsKLQlwdWJsaWMgRGVsaXZlcmFibGUgY3JlYXRlRGVsaXZlcmFibGUoQ29udGVudFBhY2thZ2UgY29udGFpbmVyKTsKLQlwdWJsaWMgRXhhbXBsZSBjcmVhdGVFeGFtcGxlKENvbnRlbnRQYWNrYWdlIGNvbnRhaW5lcik7Ci0JcHVibGljIEd1aWRhbmNlIGNyZWF0ZUd1aWRhbmNlKENvbnRlbnRQYWNrYWdlIGNvbnRhaW5lcik7Ci0JcHVibGljIE91dGNvbWUgY3JlYXRlT3V0Y29tZShDb250ZW50UGFja2FnZSBjb250YWluZXIpOwotCXB1YmxpYyBQcmFjdGljZSBjcmVhdGVQcmFjdGljZShDb250ZW50UGFja2FnZSBjb250YWluZXIpOwotCXB1YmxpYyBSZXBvcnQgY3JlYXRlUmVwb3J0KENvbnRlbnRQYWNrYWdlIGNvbnRhaW5lcik7Ci0JcHVibGljIFJldXNhYmxlQXNzZXQgY3JlYXRlUmV1c2FibGVBc3NldChDb250ZW50UGFja2FnZSBjb250YWluZXIpOwotCXB1YmxpYyBSb2FkbWFwIGNyZWF0ZVJvYWRtYXAoQ29udGVudFBhY2thZ2UgY29udGFpbmVyKTsKLQlwdWJsaWMgUm9sZSBjcmVhdGVSb2xlKENvbnRlbnRQYWNrYWdlIGNvbnRhaW5lcik7Ci0JcHVibGljIFN1cHBvcnRpbmdNYXRlcmlhbCBjcmVhdGVTdXBwb3J0aW5nTWF0ZXJpYWwoQ29udGVudFBhY2thZ2UgY29udGFpbmVyKTsKLQlwdWJsaWMgVGFzayBjcmVhdGVUYXNrKENvbnRlbnRQYWNrYWdlIGNvbnRhaW5lcik7Ci0JcHVibGljIFRlbXBsYXRlIGNyZWF0ZVRlbXBsYXRlKENvbnRlbnRQYWNrYWdlIGNvbnRhaW5lcik7Ci0JcHVibGljIFRlcm1EZWZpbml0aW9uIGNyZWF0ZVRlcm1EZWZpbml0aW9uKENvbnRlbnRQYWNrYWdlIGNvbnRhaW5lcik7Ci0JcHVibGljIFRvb2xNZW50b3IgY3JlYXRlVG9vbE1lbnRvcihDb250ZW50UGFja2FnZSBjb250YWluZXIpOwotCXB1YmxpYyBXaGl0ZXBhcGVyIGNyZWF0ZVdoaXRlcGFwZXIoQ29udGVudFBhY2thZ2UgY29udGFpbmVyKTsKLQotCi0JLyoqCi0JICogY3JlYXRlIGEgbmV3IEFjdGl2aXR5IGFzIGEgYnJlYWtkb3duIGVsZW1lbnQgb2YgdGhlIHNlcnZpY2luZyBlbGVtZW50LgotCSAqIEByZXR1cm4gQWN0aXZpdHkKLQkgKi8KLQlwdWJsaWMgQWN0aXZpdHkgY3JlYXRlQWN0aXZpdHkoQWN0aXZpdHkgc3VwZXJBY3Rpdml0eSk7Ci0KLQkvKioKLQkgKiBjcmVhdGUgYSBuZXcgUGhhc2UgYXMgYSBicmVha2Rvd24gZWxlbWVudCBvZiB0aGUgc2VydmljaW5nIGVsZW1lbnQuCi0JICogQHJldHVybiBQaGFzZQotCSAqLwotCXB1YmxpYyBQaGFzZSBjcmVhdGVQaGFzZShBY3Rpdml0eSBzdXBlckFjdGl2aXR5KTsKLQotCS8qKgotCSAqIGNyZWF0ZSBhIG5ldyBJdGVyYXRpb24gYXMgYSBicmVha2Rvd24gZWxlbWVudCBvZiB0aGUgc2VydmljaW5nIGVsZW1lbnQuCi0JICogQHJldHVybiBJdGVyYXRpb24KLQkgKi8KLQlwdWJsaWMgSXRlcmF0aW9uIGNyZWF0ZUl0ZXJhdGlvbihBY3Rpdml0eSBzdXBlckFjdGl2aXR5KTsKLQotCS8qKgotCSAqIGNyZWF0ZSBhIG5ldyBNaWxlc3RvbmUgYXMgYSBicmVha2Rvd24gZWxlbWVudCBvZiB0aGUgc2VydmljaW5nIGVsZW1lbnQuCi0JICogQHJldHVybiBNaWxlc3RvbmUKLQkgKi8KLQlwdWJsaWMgTWlsZXN0b25lIGNyZWF0ZU1pbGVzdG9uZShBY3Rpdml0eSBzdXBlckFjdGl2aXR5KTsKLQotCi0JLyoqCi0JICogYWRkIHRoZSB0YXNrIGFuZCBjcmVhdGUgdGhlIGJyZWFrZG93biBlbGVtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhlIHRhc2sKLQkgKiBjYWxsIHRoaXMgbWV0aG9kIG9ubHkgd2hlbiB0aGUgY3Jvc3MgcmVmZXJlbmNlcyAoUm9sZXMsIHdvcmtwcm9kdWN0cykgb2YgdGhlIFRhc2sgaXMgYWxyZWFkeSBlc3RhYmxpc2hlZC4KLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFRhc2tUb0FjdGl2aXR5KEFjdGl2aXR5IGFjdCwgVGFzayBlbGVtZW50KTsKLQotCXB1YmxpYyB2b2lkIGFkZFRhc2tzVG9BY3Rpdml0eShBY3Rpdml0eSBhY3QsIExpc3QgdGFza3MpOwotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGF0YWV4Y2hhbmdlL2ltcG9ydGluZy9wYWNrYWdlLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGF0YWV4Y2hhbmdlL2ltcG9ydGluZy9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0NGJiODkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RhdGFleGNoYW5nZS9pbXBvcnRpbmcvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgdGhlIGludGVyZmFjZXMgZm9yIHRoZSBkYXRhIGV4Y2hhbmdlIHNlcnZpY2UuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RhdGFleGNoYW5nZS9pbnRlcm5hbC9pbXBvcnRpbmcvTGlicmFyeVNlcnZpY2VJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGF0YWV4Y2hhbmdlL2ludGVybmFsL2ltcG9ydGluZy9MaWJyYXJ5U2VydmljZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzQ1NTgzZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGF0YWV4Y2hhbmdlL2ludGVybmFsL2ltcG9ydGluZy9MaWJyYXJ5U2VydmljZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlLmludGVybmFsLmltcG9ydGluZzsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlLmltcG9ydGluZy5MaWJyYXJ5U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlLmltcG9ydGluZy5QbHVnaW5TZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuTW9kZWxTdG9yYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5NZXRob2RMaWJyYXJ5UGVyc2lzdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hRmFjdG9yeTsKLQotLyoqCi0gKiBMaWJyYXJ5IHNlcnZpY2UgZm9yIGltcG9ydGluZyBleHRlcm5hbCBsaWJyYXJ5L3BsdWdpbnMgaW50byB0aGUgY3VycmVudAotICogbGlicmFyeS4KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqIAotICogVE9ETzogTWVyZ2Ugd2l0aCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZQotICovCi1wdWJsaWMgY2xhc3MgTGlicmFyeVNlcnZpY2VJbXBsIGltcGxlbWVudHMgTGlicmFyeVNlcnZpY2UgewotCi0JcHVibGljIExpYnJhcnlTZXJ2aWNlSW1wbCgpIHsKLQl9Ci0KLQlwdWJsaWMgTWV0aG9kUGx1Z2luIGNyZWF0ZVBsdWdpbihTdHJpbmcgbmFtZSwgU3RyaW5nIGd1aWQpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gY3JlYXRlUGx1Z2luKG5hbWUsIGd1aWQsIG51bGwpOwotCX0KLQkJCi0JcHVibGljIE1ldGhvZFBsdWdpbiBjcmVhdGVQbHVnaW4oU3RyaW5nIG5hbWUsIFN0cmluZyBndWlkLCBNYXAgb3B0aW9ucykgdGhyb3dzIEV4Y2VwdGlvbiB7CQotCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlTWV0aG9kUGx1Z2luKCk7Ci0JCXBsdWdpbi5zZXROYW1lKG5hbWUpOwotCQlwbHVnaW4uc2V0R3VpZChndWlkKTsKLQotCQkvLyBpbml0aWFsaXplIHRoZSBwbHVnaW4KLQkJcGx1Z2luID0gTW9kZWxTdG9yYWdlLmluaXRpYWxpemUocGx1Z2luKTsKLQotCQkvLyBNVVNUIHNhdmUgdGhlIHBsdWdpbiBiZWZvcmUgcHJvY2VzcyBhbnl0aGluZyBlbHNlCi0JCS8vIHRoaXMgbWV0aG9kIGNhbGwgd2lsbCBjYXVzZSByZXNvdXJjZSByZWZyZXNoIHdoaWNoIGlzIG5vdCBkZXNpcmVkIGluCi0JCS8vIHRoZSBpbXBvcnRpbmcgcHJvY2VzcwotCQlNZXRob2RMaWJyYXJ5IGxpYnJhcnkgPSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZQotCQkJCS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCk7Ci0JCQkJCi0JCWxpYnJhcnkuZ2V0TWV0aG9kUGx1Z2lucygpLmFkZChwbHVnaW4pOwotCQkKLQkJaWYgKG9wdGlvbnMgIT0gbnVsbCkgewotCQkJTWFwIHJlbmFtZUVsZW1lbnRNYXAgPSAoTWFwKSBvcHRpb25zLmdldCgicmVuYW1lRWxlbWVudE1hcCIpOy8vJE5PTi1OTFMtMSQKLQkJCWlmIChyZW5hbWVFbGVtZW50TWFwICE9IG51bGwpIHsKLQkJCQllbnN1cmVVbmlxdWVOYW1lKGxpYnJhcnksIHBsdWdpbiwgcmVuYW1lRWxlbWVudE1hcCk7CQotCQkJfQotCQl9Ci0JCQotCQkvLyAxNTAwNjMgLSBYTUwgaW1wb3J0OiBDUC9EUHMgYXJlIHVucmVzb3ZsZWQgYWZ0ZXIgWE1MIHBsdWdpbiBpbXBvcnQgCi0JCS8vIG5lZWQgdG8gc2F2ZSB0aHQgbGlicmFyeSBhbmQgcGx1Z2luIHJlc291cmNlcyBzcGVjaWZpY2FsbHksIGNhbid0IHVzZSBzYXZlTGlicmFyeQotLy8JCUxpYnJhcnlVdGlsLnNhdmVMaWJyYXJ5KGxpYnJhcnksIGZhbHNlLCBmYWxzZSk7Ci0JCU1ldGhvZExpYnJhcnlQZXJzaXN0ZXIuSU5TVEFOQ0Uuc2F2ZShsaWJyYXJ5LmVSZXNvdXJjZSgpKTsKLQkJTWV0aG9kTGlicmFyeVBlcnNpc3Rlci5JTlNUQU5DRS5zYXZlKHBsdWdpbi5lUmVzb3VyY2UoKSk7Ci0KLQkJLy8gc3RpbGwgbWFyayB0aGUgcmVzb3VyY2UgYXMgZGlydHkKLQkJbGlicmFyeS5lUmVzb3VyY2UoKS5zZXRNb2RpZmllZCh0cnVlKTsKLQkJcGx1Z2luLmVSZXNvdXJjZSgpLnNldE1vZGlmaWVkKHRydWUpOwotCQlyZXR1cm4gcGx1Z2luOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS5pbXBvcnRpbmcuTGlicmFyeVNlcnZpY2UjY3JlYXRlQ29uZmlndXJhdGlvbihTdHJpbmcsIFN0cmluZykKLQkgKi8KLQlwdWJsaWMgTWV0aG9kQ29uZmlndXJhdGlvbiBjcmVhdGVDb25maWd1cmF0aW9uKFN0cmluZyBuYW1lLCBTdHJpbmcgZ3VpZCkgewotCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IFVtYUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJLmNyZWF0ZU1ldGhvZENvbmZpZ3VyYXRpb24oKTsKLQkJY29uZmlnLnNldE5hbWUobmFtZSk7Ci0JCWNvbmZpZy5zZXRHdWlkKGd1aWQpOwotCi0JCU1ldGhvZExpYnJhcnkgbGlicmFyeSA9IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlCi0JCQkJLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKTsKLQkJYm9vbGVhbiBvbGROb3RpZnkgPSBsaWJyYXJ5LmVEZWxpdmVyKCk7Ci0JCXRyeSB7Ci0JCQlsaWJyYXJ5LmVTZXREZWxpdmVyKGZhbHNlKTsKLQkJCWxpYnJhcnkuZ2V0UHJlZGVmaW5lZENvbmZpZ3VyYXRpb25zKCkuYWRkKGNvbmZpZyk7Ci0JCX0gZmluYWxseSB7Ci0JCQlsaWJyYXJ5LmVTZXREZWxpdmVyKG9sZE5vdGlmeSk7Ci0JCX0KLQotCQlyZXR1cm4gY29uZmlnOwotCX0KLQotCS8qKgotCSAqIGNyZWF0ZSBhIHBsdWdpbiBzZXJ2aWNlIGZvciB0aGUgc3BlY2lmaWVkIHBsdWdpbgotCSAqIAotCSAqIEBwYXJhbSBwbHVnaW4KLQkgKiAgICAgICAgICAgIE1ldGhvZFBsdWdpbgotCSAqIEByZXR1cm4gUGx1Z2luU2VydmljZQotCSAqLwotCXB1YmxpYyBQbHVnaW5TZXJ2aWNlIGNyZWF0ZVBsdWdpblNlcnZpY2UoTWV0aG9kUGx1Z2luIHBsdWdpbikgewotCQlyZXR1cm4gbmV3IFBsdWdpblNlcnZpY2VJbXBsKHBsdWdpbik7Ci0JfQotCQotCS8vVGhpcyBpcyBpZGVudGljYWwgdG8gTGlicmFyeUltcG9ydE1hbmFnZXIuZW5zdXJlVW5pcXVlTmFtZQotCS8vU2hvdWxkIG1vdmUgdG8gdGhpcyBjb2RlIHRvIGEgY29tbW9tIHBsYWNlIHNvIHRoYXQgYm90aCBwYWNrYWdlcyBjYW4gYWNjZXNzIGl0LgotCXByaXZhdGUgc3RhdGljIHZvaWQgZW5zdXJlVW5pcXVlTmFtZShFT2JqZWN0IG93bmVyLCBNZXRob2RFbGVtZW50IG5ld09iaiwgTWFwIHJlbmFtZUVsZW1lbnRNYXApIHsKLQkJaWYgKG93bmVyID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQlDbGFzcyBjbHMgPSBuZXdPYmouZ2V0Q2xhc3MoKTsKLQkJTWFwIG5hbWVNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQlmb3IgKGludCBpPTA7IGkgPCBvd25lci5lQ29udGVudHMoKS5zaXplKCk7IGkrKykgewotCQkJT2JqZWN0IG9sZE9iaiA9IG93bmVyLmVDb250ZW50cygpLmdldChpKTsKLQkJCWlmIChvbGRPYmouZ2V0Q2xhc3MoKSA9PSBjbHMgJiYgb2xkT2JqICE9IG5ld09iaikgewotCQkJCU1ldGhvZEVsZW1lbnQgb2xkRWxlbSA9IChNZXRob2RFbGVtZW50KSBvbGRPYmo7Ci0JCQkJbmFtZU1hcC5wdXQob2xkRWxlbS5nZXROYW1lKCksIG9sZEVsZW0pOwotCQkJfQotCQl9Ci0JCVN0cmluZyBuYW1lID0gbmV3T2JqLmdldE5hbWUoKTsKLQkJU3RyaW5nIHJlbmFtZWQgPSBuYW1lOwotCQl3aGlsZSAobmFtZU1hcC5jb250YWluc0tleShyZW5hbWVkKSkgewotCQkJcmVuYW1lZCArPSAiX3JlbmFtZWQiOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJaWYgKHJlbmFtZWQgIT0gbmFtZSkgewotCQkJbmV3T2JqLnNldE5hbWUocmVuYW1lZCk7Ci0JCQkKLQkJCU9iamVjdFtdIGVudHJ5VmFsID0gbmV3IE9iamVjdFs0XTsKLQkJCWVudHJ5VmFsWzBdID0gbmV3T2JqOwotCQkJZW50cnlWYWxbMV0gPSBuYW1lOwotCQkJZW50cnlWYWxbMl0gPSBuYW1lTWFwLmdldChuYW1lKTsKLQkJCWVudHJ5VmFsWzNdID0gcmVuYW1lZDsKLQkJCXJlbmFtZUVsZW1lbnRNYXAucHV0KG5ld09iai5nZXRHdWlkKCksIGVudHJ5VmFsKTsJCQkKLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGF0YWV4Y2hhbmdlL2ludGVybmFsL2ltcG9ydGluZy9QbHVnaW5TZXJ2aWNlSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RhdGFleGNoYW5nZS9pbnRlcm5hbC9pbXBvcnRpbmcvUGx1Z2luU2VydmljZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTI1OTRiOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGF0YWV4Y2hhbmdlL2ludGVybmFsL2ltcG9ydGluZy9QbHVnaW5TZXJ2aWNlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQ1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2UuaW50ZXJuYWwuaW1wb3J0aW5nOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlLmltcG9ydGluZy5QbHVnaW5TZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kLldCU0Ryb3BDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Nb2RlbFN0cnVjdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5zZXJ2aWNlcy5TYWZlVXBkYXRlQ29udHJvbGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQXJ0aWZhY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ2FwYWJpbGl0eVBhdHRlcm47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DaGVja2xpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db25jZXB0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DdXN0b21DYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcnlQcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGlzY2lwbGluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpc2NpcGxpbmVHcm91cGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkV4YW1wbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HdWlkYW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkl0ZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWlsZXN0b25lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuT3V0Y29tZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlBoYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJhY3RpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc1BhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5SZXBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5SZXVzYWJsZUFzc2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9hZG1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZVNldEdyb3VwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuU3VwcG9ydGluZ01hdGVyaWFsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFzazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRlbXBsYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGVybURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Ub29sOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVG9vbE1lbnRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5XaGl0ZXBhcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3RUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5VbWFVdGlsOwotCi0KLS8qKgotICogUGx1Z2luIHNlcnZpY2UgZm9yIGltcG9ydGluZyBleHRlcm5hbCBwbHVnaW4gZGF0YSBpbnRvIHRoZSBjdXJyZW50IGxpYnJhcnkKLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBQbHVnaW5TZXJ2aWNlSW1wbCBpbXBsZW1lbnRzIFBsdWdpblNlcnZpY2UgewotCi0JTWV0aG9kUGx1Z2luIHBsdWdpbjsKLQotCXB1YmxpYyBQbHVnaW5TZXJ2aWNlSW1wbChNZXRob2RQbHVnaW4gZWxlbWVudCkKLQl7Ci0JCXBsdWdpbiA9IGVsZW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogZ2V0IHRoZSBtZXRob2QgcGx1Z2hpbgotCSAqIEByZXR1cm4ge0BsaW5rIE1ldGhvZFBsdWdpbn0KLQkgKi8KLQlwdWJsaWMgTWV0aG9kUGx1Z2luIGdldFBsdWdpbigpCi0JewotCQlyZXR1cm4gKE1ldGhvZFBsdWdpbilwbHVnaW47Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlLmltcG9ydGluZy5QbHVnaW5TZXJ2aWNlI2dldENvbnRlbnRQYWNrYWdlUm9vdCgpCi0JICovCi0JcHVibGljIENvbnRlbnRQYWNrYWdlIGdldENvbnRlbnRQYWNrYWdlUm9vdCgpCi0JewotCQlyZXR1cm4gVW1hVXRpbC5maW5kQ29udGVudFBhY2thZ2UocGx1Z2luLCBNb2RlbFN0cnVjdHVyZS5ERUZBVUxULmNvcmVDb250ZW50UGF0aCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlLmltcG9ydGluZy5QbHVnaW5TZXJ2aWNlI2NyZWF0ZURpc2NpcGxpbmUoKQotCSAqLwotCXB1YmxpYyBEaXNjaXBsaW5lIGNyZWF0ZURpc2NpcGxpbmUoKSB7Ci0JCURpc2NpcGxpbmUgZCA9IFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZURpc2NpcGxpbmUoKTsKLQkJQ29udGVudFBhY2thZ2UgcGtnID0gKENvbnRlbnRQYWNrYWdlKVVtYVV0aWwuZmluZE1ldGhvZFBhY2thZ2UoZ2V0UGx1Z2luKCksIE1vZGVsU3RydWN0dXJlLkRFRkFVTFQuZGlzY2lwbGluZURlZmluaXRpb25QYXRoKTsKLQkJcGtnLmdldENvbnRlbnRFbGVtZW50cygpLmFkZChkKTsKLQotCQlyZXR1cm4gZDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2UuaW1wb3J0aW5nLlBsdWdpblNlcnZpY2UjY3JlYXRlRGlzY2lwbGluZUdyb3VwaW5nKCkKLQkgKi8KLQlwdWJsaWMgRGlzY2lwbGluZUdyb3VwaW5nIGNyZWF0ZURpc2NpcGxpbmVHcm91cGluZygpIHsKLQkJRGlzY2lwbGluZUdyb3VwaW5nIGQgPSBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVEaXNjaXBsaW5lR3JvdXBpbmcoKTsKLQkJQ29udGVudFBhY2thZ2UgcGtnID0gKENvbnRlbnRQYWNrYWdlKVVtYVV0aWwuZmluZE1ldGhvZFBhY2thZ2UoZ2V0UGx1Z2luKCksIE1vZGVsU3RydWN0dXJlLkRFRkFVTFQuZGlzY2lwbGluZURlZmluaXRpb25QYXRoKTsKLQkJcGtnLmdldENvbnRlbnRFbGVtZW50cygpLmFkZChkKTsKLQotCQlyZXR1cm4gZDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2UuaW1wb3J0aW5nLlBsdWdpblNlcnZpY2UjY3JlYXRlVG9vbCgpCi0JICovCi0JcHVibGljIFRvb2wgY3JlYXRlVG9vbCgpIHsKLQkJVG9vbCB0b29sID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlVG9vbCgpOwotCQlDb250ZW50UGFja2FnZSBwa2cgPSBVbWFVdGlsLmZpbmRDb250ZW50UGFja2FnZShnZXRQbHVnaW4oKSwgTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC50b29sUGF0aCk7Ci0JCSgoQ29udGVudFBhY2thZ2UpcGtnKS5nZXRDb250ZW50RWxlbWVudHMoKS5hZGQodG9vbCk7Ci0JCXJldHVybiB0b29sOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS5pbXBvcnRpbmcuUGx1Z2luU2VydmljZSNjcmVhdGVEb21haW4oKQotCSAqLwotCXB1YmxpYyBEb21haW4gY3JlYXRlRG9tYWluKCkgewotCQlEb21haW4gZCA9IFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZURvbWFpbigpOwotCQlDb250ZW50UGFja2FnZSBwa2cgPSBVbWFVdGlsLmZpbmRDb250ZW50UGFja2FnZShnZXRQbHVnaW4oKSwgTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC5kb21haW5QYXRoKTsKLQkJKChDb250ZW50UGFja2FnZSlwa2cpLmdldENvbnRlbnRFbGVtZW50cygpLmFkZChkKTsKLQkJcmV0dXJuIGQ7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlLmltcG9ydGluZy5QbHVnaW5TZXJ2aWNlI2NyZWF0ZVdvcmtQcm9kdWN0VHlwZSgpCi0JICovCi0JcHVibGljIFdvcmtQcm9kdWN0VHlwZSBjcmVhdGVXb3JrUHJvZHVjdFR5cGUoKSB7Ci0JCVdvcmtQcm9kdWN0VHlwZSB3ID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlV29ya1Byb2R1Y3RUeXBlKCk7Ci0JCUNvbnRlbnRQYWNrYWdlIHBrZyA9IFVtYVV0aWwuZmluZENvbnRlbnRQYWNrYWdlKGdldFBsdWdpbigpLCBNb2RlbFN0cnVjdHVyZS5ERUZBVUxULndvcmtQcm9kdWN0VHlwZVBhdGgpOwotCQkoKENvbnRlbnRQYWNrYWdlKXBrZykuZ2V0Q29udGVudEVsZW1lbnRzKCkuYWRkKHcpOwotCQlyZXR1cm4gdzsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2UuaW1wb3J0aW5nLlBsdWdpblNlcnZpY2UjY3JlYXRlUm9sZVNldCgpCi0JICovCi0JcHVibGljIFJvbGVTZXQgY3JlYXRlUm9sZVNldCgpIHsKLQkJUm9sZVNldCByID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUm9sZVNldCgpOwotCQlDb250ZW50UGFja2FnZSBwa2cgPSBVbWFVdGlsLmZpbmRDb250ZW50UGFja2FnZShnZXRQbHVnaW4oKSwgTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC5yb2xlU2V0UGF0aCk7Ci0JCSgoQ29udGVudFBhY2thZ2UpcGtnKS5nZXRDb250ZW50RWxlbWVudHMoKS5hZGQocik7Ci0JCXJldHVybiByOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS5pbXBvcnRpbmcuUGx1Z2luU2VydmljZSNjcmVhdGVSb2xlU2V0R3JvdXBpbmcoKQotCSAqLwotCXB1YmxpYyBSb2xlU2V0R3JvdXBpbmcgY3JlYXRlUm9sZVNldEdyb3VwaW5nKCkgewotCQlSb2xlU2V0R3JvdXBpbmcgciA9IFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVJvbGVTZXRHcm91cGluZygpOwotCQlDb250ZW50UGFja2FnZSBwa2cgPSBVbWFVdGlsLmZpbmRDb250ZW50UGFja2FnZShnZXRQbHVnaW4oKSwgTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC5yb2xlU2V0UGF0aCk7Ci0JCSgoQ29udGVudFBhY2thZ2UpcGtnKS5nZXRDb250ZW50RWxlbWVudHMoKS5hZGQocik7Ci0JCXJldHVybiByOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS5pbXBvcnRpbmcuUGx1Z2luU2VydmljZSNjcmVhdGVDdXN0b21DYXRlZ29yeShDdXN0b21DYXRlZ29yeSkKLQkgKi8KLQlwdWJsaWMgQ3VzdG9tQ2F0ZWdvcnkgY3JlYXRlQ3VzdG9tQ2F0ZWdvcnkoQ3VzdG9tQ2F0ZWdvcnkgcGFyZW50KSB7Ci0JCUNvbnRlbnRQYWNrYWdlIHBrZyA9IFVtYVV0aWwuZmluZENvbnRlbnRQYWNrYWdlKGdldFBsdWdpbigpLCBNb2RlbFN0cnVjdHVyZS5ERUZBVUxULmN1c3RvbUNhdGVnb3J5UGF0aCk7Ci0JCUN1c3RvbUNhdGVnb3J5IGMgPSBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVDdXN0b21DYXRlZ29yeSgpOwotCi0JCS8vIGFsc28gbmVlZCB0byBhZGQgdGhlIGNhdGVnb3J5IG9iamVjdCBpbnRvIHRoZSBwYXJlbnQgcGFja2FnZQotCQlwa2cuZ2V0Q29udGVudEVsZW1lbnRzKCkuYWRkKGMpOwotCQlpZiAoIHBhcmVudCAhPSBudWxsICkKLQkJewotCQkJKChDdXN0b21DYXRlZ29yeSlwYXJlbnQpLmdldENhdGVnb3JpemVkRWxlbWVudHMoKS5hZGQoYyk7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQkvLyBhZGQgdG8gdGhlIHJvb3QgY2F0ZWdvcnkKLQkJCVRuZ1V0aWwuZ2V0Um9vdEN1c3RvbUNhdGVnb3J5KGdldFBsdWdpbigpKS5nZXRDYXRlZ29yaXplZEVsZW1lbnRzKCkuYWRkKGMpOwotCQl9Ci0KLQkJcmV0dXJuIGM7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlLmltcG9ydGluZy5QbHVnaW5TZXJ2aWNlI2NyZWF0ZUNhcGFiaWxpdHlQYXR0ZXJuKE1ldGhvZENvbmZpZ3VyYXRpb24pCi0JICovCi0JcHVibGljIENhcGFiaWxpdHlQYXR0ZXJuIGNyZWF0ZUNhcGFiaWxpdHlQYXR0ZXJuKE1ldGhvZENvbmZpZ3VyYXRpb24gZGVmYXVsdENvbmZpZykgewotCi0JCUNhcGFiaWxpdHlQYXR0ZXJuIGNwID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQ2FwYWJpbGl0eVBhdHRlcm4oKTsKLQkJY3Auc2V0RGVmYXVsdENvbnRleHQoZGVmYXVsdENvbmZpZyk7Ci0KLQkJUHJvY2Vzc1BhY2thZ2UgY2FwYWJpbGl0eVBhdHRlcm5Qa2dzID0gKFByb2Nlc3NQYWNrYWdlKVVtYVV0aWwuZmluZE1ldGhvZFBhY2thZ2UoZ2V0UGx1Z2luKCksIE1vZGVsU3RydWN0dXJlLkRFRkFVTFQuY2FwYWJpbGl0eVBhdHRlcm5QYXRoKTsKLQkJTGlzdCBpdGVtcyA9IGNhcGFiaWxpdHlQYXR0ZXJuUGtncy5nZXRDaGlsZFBhY2thZ2VzKCk7Ci0KLQkJLy8gbmVlZCB0byBjcmVhdGUgYSBwYWNrYWdlIGZvciB0aGlzIGNhcGFiaWxpdHkgcGF0dGVybgotCQkvL1N5c3RlbS5vdXQucHJpbnRsbigiQ3JlYXRlIHBrZywgVE9ESU8iKTsKLQkJLy8gdG8gYWRkIGEgY2FwYWJpbGl0eSBwcm9jZXNzLCB5b3UgbmVlZCB0byBjcmVhdGUgYSBQcm9jZXNzQ29tcG9uZW50IHBhY2thZ2UgdG8gaG9sZCB0aGUgcHJvY2VzcwotCQlvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnQgcGMgPSBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQcm9jZXNzQ29tcG9uZW50KCk7Ci0JCXBjLnNldEd1aWQoRWNvcmVVdGlsLmdlbmVyYXRlVVVJRCgpKTsKLQkJaXRlbXMuYWRkKHBjKTsKLQkJcGMuc2V0UHJvY2VzcyhjcCk7Ci0KLQkJcmV0dXJuIGNwOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS5pbXBvcnRpbmcuUGx1Z2luU2VydmljZSNjcmVhdGVEZWxpdmVyeVByb2Nlc3MoTWV0aG9kQ29uZmlndXJhdGlvbikKLQkgKi8KLQlwdWJsaWMgRGVsaXZlcnlQcm9jZXNzIGNyZWF0ZURlbGl2ZXJ5UHJvY2VzcyhNZXRob2RDb25maWd1cmF0aW9uIGRlZmF1bHRDb25maWcpIHsKLQkJRGVsaXZlcnlQcm9jZXNzIGRwID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRGVsaXZlcnlQcm9jZXNzKCk7Ci0JCWRwLnNldERlZmF1bHRDb250ZXh0KGRlZmF1bHRDb25maWcpOwotCi0JCS8vIHRoaXMgaXMgdGhlIHBhY2thZ2UgdGhhdCBzdG9yZXMgYWxsIGNhcGFiaWxpdHkgcGF0dGVybnMKLQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IGdldFBsdWdpbigpOwotCQlQcm9jZXNzUGFja2FnZSBkZWxpdmVyeVByb2Nlc3NQa2dzID0gKFByb2Nlc3NQYWNrYWdlKVVtYVV0aWwuZmluZE1ldGhvZFBhY2thZ2UocGx1Z2luLCBNb2RlbFN0cnVjdHVyZS5ERUZBVUxULmRlbGl2ZXJ5UHJvY2Vzc1BhdGgpOwotCQlMaXN0IGl0ZW1zID0gZGVsaXZlcnlQcm9jZXNzUGtncy5nZXRDaGlsZFBhY2thZ2VzKCk7Ci0KLQkJLy8geW91IG5lZWQgdG8gY3JlYXRlIGEgUHJvY2Vzc0NvbXBvbmVudCBwYWNrYWdlIHRvIGhvbGQgdGhlIHByb2Nlc3MKLQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50IHBjID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUHJvY2Vzc0NvbXBvbmVudCgpOwotCQlwYy5zZXRHdWlkKEVjb3JlVXRpbC5nZW5lcmF0ZVVVSUQoKSk7Ci0JCWl0ZW1zLmFkZChwYyk7Ci0JCXBjLnNldFByb2Nlc3MoZHApOwotCi0JCXJldHVybiBkcDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2UuaW1wb3J0aW5nLlBsdWdpblNlcnZpY2UjY3JlYXRlQ29udGVudFBhY2thZ2UoQ29udGVudFBhY2thZ2UpCi0JICovCi0JcHVibGljIENvbnRlbnRQYWNrYWdlIGNyZWF0ZUNvbnRlbnRQYWNrYWdlKENvbnRlbnRQYWNrYWdlIGNvbnRhaW5lcikgewotCi0JCUNvbnRlbnRQYWNrYWdlIHBrZyA9IFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUNvbnRlbnRQYWNrYWdlKCk7Ci0JCWlmICggY29udGFpbmVyID09IG51bGwpCi0JCXsKLQkJCWNvbnRhaW5lciA9IFVtYVV0aWwuZmluZENvbnRlbnRQYWNrYWdlKGdldFBsdWdpbigpLCBNb2RlbFN0cnVjdHVyZS5ERUZBVUxULmNvcmVDb250ZW50UGF0aCk7Ci0JCX0KLQkJY29udGFpbmVyLmdldENoaWxkUGFja2FnZXMoKS5hZGQocGtnKTsKLQkJcmV0dXJuIHBrZzsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2UuaW1wb3J0aW5nLlBsdWdpblNlcnZpY2UjY3JlYXRlQXJ0aWZhY3QoQ29udGVudFBhY2thZ2UpCi0JICovCi0JcHVibGljIEFydGlmYWN0IGNyZWF0ZUFydGlmYWN0KENvbnRlbnRQYWNrYWdlIGNvbnRhaW5lcikgewotCQlBcnRpZmFjdCBlID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQXJ0aWZhY3QoKTsKLQkJY29udGFpbmVyLmdldENvbnRlbnRFbGVtZW50cygpLmFkZChlKTsKLQkJcmV0dXJuIGU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlLmltcG9ydGluZy5QbHVnaW5TZXJ2aWNlI2NyZWF0ZUNoZWNrbGlzdChDb250ZW50UGFja2FnZSkKLQkgKi8KLQlwdWJsaWMgQ2hlY2tsaXN0IGNyZWF0ZUNoZWNrbGlzdChDb250ZW50UGFja2FnZSBjb250YWluZXIpIHsKLQkJQ2hlY2tsaXN0IGUgPSBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVDaGVja2xpc3QoKTsKLQkJY29udGFpbmVyLmdldENvbnRlbnRFbGVtZW50cygpLmFkZChlKTsKLQkJcmV0dXJuIGU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlLmltcG9ydGluZy5QbHVnaW5TZXJ2aWNlI2NyZWF0ZUNvbmNlcHQoQ29udGVudFBhY2thZ2UpCi0JICovCi0JcHVibGljIENvbmNlcHQgY3JlYXRlQ29uY2VwdChDb250ZW50UGFja2FnZSBjb250YWluZXIpIHsKLQkJQ29uY2VwdCBlID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQ29uY2VwdCgpOwotCQljb250YWluZXIuZ2V0Q29udGVudEVsZW1lbnRzKCkuYWRkKGUpOwotCQlyZXR1cm4gZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2UuaW1wb3J0aW5nLlBsdWdpblNlcnZpY2UjY3JlYXRlRGVsaXZlcmFibGUoQ29udGVudFBhY2thZ2UpCi0JICovCi0JcHVibGljIERlbGl2ZXJhYmxlIGNyZWF0ZURlbGl2ZXJhYmxlKENvbnRlbnRQYWNrYWdlIGNvbnRhaW5lcikgewotCQlEZWxpdmVyYWJsZSBlID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRGVsaXZlcmFibGUoKTsKLQkJY29udGFpbmVyLmdldENvbnRlbnRFbGVtZW50cygpLmFkZChlKTsKLQkJcmV0dXJuIGU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlLmltcG9ydGluZy5QbHVnaW5TZXJ2aWNlI2NyZWF0ZUV4YW1wbGUoQ29udGVudFBhY2thZ2UpCi0JICovCi0JcHVibGljIEV4YW1wbGUgY3JlYXRlRXhhbXBsZShDb250ZW50UGFja2FnZSBjb250YWluZXIpIHsKLQkJRXhhbXBsZSBlID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRXhhbXBsZSgpOwotCQljb250YWluZXIuZ2V0Q29udGVudEVsZW1lbnRzKCkuYWRkKGUpOwotCQlyZXR1cm4gZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2UuaW1wb3J0aW5nLlBsdWdpblNlcnZpY2UjY3JlYXRlR3VpZGFuY2UoQ29udGVudFBhY2thZ2UpCi0JICovCi0JcHVibGljIEd1aWRhbmNlIGNyZWF0ZUd1aWRhbmNlKENvbnRlbnRQYWNrYWdlIGNvbnRhaW5lcikgewotCQlHdWlkYW5jZSBlID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlR3VpZGVsaW5lKCk7Ci0JCWNvbnRhaW5lci5nZXRDb250ZW50RWxlbWVudHMoKS5hZGQoZSk7Ci0JCXJldHVybiBlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS5pbXBvcnRpbmcuUGx1Z2luU2VydmljZSNjcmVhdGVPdXRjb21lKENvbnRlbnRQYWNrYWdlKQotCSAqLwotCXB1YmxpYyBPdXRjb21lIGNyZWF0ZU91dGNvbWUoQ29udGVudFBhY2thZ2UgY29udGFpbmVyKSB7Ci0JCU91dGNvbWUgZSA9IFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZU91dGNvbWUoKTsKLQkJY29udGFpbmVyLmdldENvbnRlbnRFbGVtZW50cygpLmFkZChlKTsKLQkJcmV0dXJuIGU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlLmltcG9ydGluZy5QbHVnaW5TZXJ2aWNlI2NyZWF0ZVByYWN0aWNlKENvbnRlbnRQYWNrYWdlKQotCSAqLwotCXB1YmxpYyBQcmFjdGljZSBjcmVhdGVQcmFjdGljZShDb250ZW50UGFja2FnZSBjb250YWluZXIpIHsKLQkJUHJhY3RpY2UgZSA9IFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVByYWN0aWNlKCk7Ci0JCWNvbnRhaW5lci5nZXRDb250ZW50RWxlbWVudHMoKS5hZGQoZSk7Ci0JCXJldHVybiBlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS5pbXBvcnRpbmcuUGx1Z2luU2VydmljZSNjcmVhdGVSZXBvcnQoQ29udGVudFBhY2thZ2UpCi0JICovCi0JcHVibGljIFJlcG9ydCBjcmVhdGVSZXBvcnQoQ29udGVudFBhY2thZ2UgY29udGFpbmVyKSB7Ci0JCVJlcG9ydCBlID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUmVwb3J0KCk7Ci0JCWNvbnRhaW5lci5nZXRDb250ZW50RWxlbWVudHMoKS5hZGQoZSk7Ci0JCXJldHVybiBlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS5pbXBvcnRpbmcuUGx1Z2luU2VydmljZSNjcmVhdGVSZXVzYWJsZUFzc2V0KENvbnRlbnRQYWNrYWdlKQotCSAqLwotCXB1YmxpYyBSZXVzYWJsZUFzc2V0IGNyZWF0ZVJldXNhYmxlQXNzZXQoQ29udGVudFBhY2thZ2UgY29udGFpbmVyKSB7Ci0JCVJldXNhYmxlQXNzZXQgZSA9IFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVJldXNhYmxlQXNzZXQoKTsKLQkJY29udGFpbmVyLmdldENvbnRlbnRFbGVtZW50cygpLmFkZChlKTsKLQkJcmV0dXJuIGU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlLmltcG9ydGluZy5QbHVnaW5TZXJ2aWNlI2NyZWF0ZVJvYWRtYXAoQ29udGVudFBhY2thZ2UpCi0JICovCi0JcHVibGljIFJvYWRtYXAgY3JlYXRlUm9hZG1hcChDb250ZW50UGFja2FnZSBjb250YWluZXIpIHsKLQkJUm9hZG1hcCBlID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUm9hZG1hcCgpOwotCQljb250YWluZXIuZ2V0Q29udGVudEVsZW1lbnRzKCkuYWRkKGUpOwotCQlyZXR1cm4gZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2UuaW1wb3J0aW5nLlBsdWdpblNlcnZpY2UjY3JlYXRlUm9sZShDb250ZW50UGFja2FnZSkKLQkgKi8KLQlwdWJsaWMgUm9sZSBjcmVhdGVSb2xlKENvbnRlbnRQYWNrYWdlIGNvbnRhaW5lcikgewotCQlSb2xlIGUgPSBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVSb2xlKCk7Ci0JCWNvbnRhaW5lci5nZXRDb250ZW50RWxlbWVudHMoKS5hZGQoZSk7Ci0JCXJldHVybiBlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS5pbXBvcnRpbmcuUGx1Z2luU2VydmljZSNjcmVhdGVTdXBwb3J0aW5nTWF0ZXJpYWwoQ29udGVudFBhY2thZ2UpCi0JICovCi0JcHVibGljIFN1cHBvcnRpbmdNYXRlcmlhbCBjcmVhdGVTdXBwb3J0aW5nTWF0ZXJpYWwoQ29udGVudFBhY2thZ2UgY29udGFpbmVyKSB7Ci0JCVN1cHBvcnRpbmdNYXRlcmlhbCBlID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlU3VwcG9ydGluZ01hdGVyaWFsKCk7Ci0JCWNvbnRhaW5lci5nZXRDb250ZW50RWxlbWVudHMoKS5hZGQoZSk7Ci0JCXJldHVybiBlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS5pbXBvcnRpbmcuUGx1Z2luU2VydmljZSNjcmVhdGVUYXNrKENvbnRlbnRQYWNrYWdlKQotCSAqLwotCXB1YmxpYyBUYXNrIGNyZWF0ZVRhc2soQ29udGVudFBhY2thZ2UgY29udGFpbmVyKSB7Ci0JCVRhc2sgZSA9IFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVRhc2soKTsKLQkJY29udGFpbmVyLmdldENvbnRlbnRFbGVtZW50cygpLmFkZChlKTsKLQkJcmV0dXJuIGU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlLmltcG9ydGluZy5QbHVnaW5TZXJ2aWNlI2NyZWF0ZVRlbXBsYXRlKENvbnRlbnRQYWNrYWdlKQotCSAqLwotCXB1YmxpYyBUZW1wbGF0ZSBjcmVhdGVUZW1wbGF0ZShDb250ZW50UGFja2FnZSBjb250YWluZXIpIHsKLQkJVGVtcGxhdGUgZSA9IFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVRlbXBsYXRlKCk7Ci0JCWNvbnRhaW5lci5nZXRDb250ZW50RWxlbWVudHMoKS5hZGQoZSk7Ci0JCXJldHVybiBlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS5pbXBvcnRpbmcuUGx1Z2luU2VydmljZSNjcmVhdGVUZXJtRGVmaW5pdGlvbihDb250ZW50UGFja2FnZSkKLQkgKi8KLQlwdWJsaWMgVGVybURlZmluaXRpb24gY3JlYXRlVGVybURlZmluaXRpb24oQ29udGVudFBhY2thZ2UgY29udGFpbmVyKSB7Ci0JCVRlcm1EZWZpbml0aW9uIGUgPSBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVUZXJtRGVmaW5pdGlvbigpOwotCQljb250YWluZXIuZ2V0Q29udGVudEVsZW1lbnRzKCkuYWRkKGUpOwotCQlyZXR1cm4gZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2UuaW1wb3J0aW5nLlBsdWdpblNlcnZpY2UjY3JlYXRlVG9vbE1lbnRvcihDb250ZW50UGFja2FnZSkKLQkgKi8KLQlwdWJsaWMgVG9vbE1lbnRvciBjcmVhdGVUb29sTWVudG9yKENvbnRlbnRQYWNrYWdlIGNvbnRhaW5lcikgewotCQlUb29sTWVudG9yIGUgPSBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVUb29sTWVudG9yKCk7Ci0JCWNvbnRhaW5lci5nZXRDb250ZW50RWxlbWVudHMoKS5hZGQoZSk7Ci0JCXJldHVybiBlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS5pbXBvcnRpbmcuUGx1Z2luU2VydmljZSNjcmVhdGVXaGl0ZXBhcGVyKENvbnRlbnRQYWNrYWdlKQotCSAqLwotCXB1YmxpYyBXaGl0ZXBhcGVyIGNyZWF0ZVdoaXRlcGFwZXIoQ29udGVudFBhY2thZ2UgY29udGFpbmVyKSB7Ci0JCVdoaXRlcGFwZXIgZSA9IFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVdoaXRlcGFwZXIoKTsKLQkJY29udGFpbmVyLmdldENvbnRlbnRFbGVtZW50cygpLmFkZChlKTsKLQkJcmV0dXJuIGU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlLmltcG9ydGluZy5QbHVnaW5TZXJ2aWNlI2NyZWF0ZUFjdGl2aXR5KEFjdGl2aXR5KQotCSAqLwotCXB1YmxpYyBBY3Rpdml0eSBjcmVhdGVBY3Rpdml0eShBY3Rpdml0eSBzdXBlckFjdGl2aXR5KSB7Ci0JCUFjdGl2aXR5IGUgPSBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVBY3Rpdml0eSgpOwotCQlzdXBlckFjdGl2aXR5LmdldEJyZWFrZG93bkVsZW1lbnRzKCkuYWRkKGUpOwotCi0JCWFkZEFjdGl2aXR5VG9Db250YWluZXIoZSk7Ci0JCQotCQlyZXR1cm4gZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2UuaW1wb3J0aW5nLlBsdWdpblNlcnZpY2UjY3JlYXRlUGhhc2UoQWN0aXZpdHkpCi0JICovCi0JcHVibGljIFBoYXNlIGNyZWF0ZVBoYXNlKEFjdGl2aXR5IHN1cGVyQWN0aXZpdHkpIHsKLQkJUGhhc2UgZSA9IFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVBoYXNlKCk7Ci0JCXN1cGVyQWN0aXZpdHkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5hZGQoZSk7Ci0KLQkJYWRkQWN0aXZpdHlUb0NvbnRhaW5lcihlKTsKLQotCQlyZXR1cm4gZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2UuaW1wb3J0aW5nLlBsdWdpblNlcnZpY2UjY3JlYXRlSXRlcmF0aW9uKEFjdGl2aXR5KQotCSAqLwotCXB1YmxpYyBJdGVyYXRpb24gY3JlYXRlSXRlcmF0aW9uKEFjdGl2aXR5IHN1cGVyQWN0aXZpdHkpIHsKLQkJSXRlcmF0aW9uIGUgPSBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVJdGVyYXRpb24oKTsKLQkJc3VwZXJBY3Rpdml0eS5nZXRCcmVha2Rvd25FbGVtZW50cygpLmFkZChlKTsKLQotCQlhZGRBY3Rpdml0eVRvQ29udGFpbmVyKGUpOwotCi0JCXJldHVybiBlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS5pbXBvcnRpbmcuUGx1Z2luU2VydmljZSNjcmVhdGVNaWxlc3RvbmUoQWN0aXZpdHkpCi0JICovCi0JcHVibGljIE1pbGVzdG9uZSBjcmVhdGVNaWxlc3RvbmUoQWN0aXZpdHkgc3VwZXJBY3Rpdml0eSkgewotCQlNaWxlc3RvbmUgZSA9IFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZU1pbGVzdG9uZSgpOwotCQlzdXBlckFjdGl2aXR5LmdldEJyZWFrZG93bkVsZW1lbnRzKCkuYWRkKGUpOwotCi0JCXJldHVybiBlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS5pbXBvcnRpbmcuUGx1Z2luU2VydmljZSNhZGRUYXNrVG9BY3Rpdml0eShBY3Rpdml0eSwgVGFzaykKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRUYXNrVG9BY3Rpdml0eShBY3Rpdml0eSBhY3QsIFRhc2sgdGFzaykgewotCQlhZGRUYXNrc1RvQWN0aXZpdHkoYWN0LCBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KHRhc2spKTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlLmltcG9ydGluZy5QbHVnaW5TZXJ2aWNlI2FkZFRhc2tzVG9BY3Rpdml0eShBY3Rpdml0eSwgTGlzdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRUYXNrc1RvQWN0aXZpdHkoZmluYWwgQWN0aXZpdHkgYWN0LCBmaW5hbCBMaXN0IHRhc2tzKSB7Ci0JCS8vIHRoaXMgbWV0aG9kIGRvZXMgbm90IHdvcmsgYW55IG1vcmVkdWUgdG8gbGF0ZXIgY2hhbmdlcwotCQkvLyB1c2Ugb3VyIG93biBjb2RlIGluc3RlYWQKLQkJLy9Qcm9jZXNzVXRpbC5hZGRUYXNrVG9BY3Rpdml0eSh0YXNrLCBhY3QpOwotCQkKLQkJLy8gYmVmb3JlIGRvaW5nIHRoZSBjb21tYW5kLCBtYWtlIHN1cmUgdGhlIG9iamVjdCBpcyAKLQkJLy8gaW4gdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbiBvZiB0aGUgb3dpbmcgcHJvY2VzcwotCQkvLyBvdGhlcndpc2UgeW91IHdpbGwgZ2V0IG1zZyBib3ggYXNraW5nIGZvciB0aGF0LCB3aGljaCBtYXkgY2F1c2UgZXJyb3IgZm9yIGJhY2tncm91bmQgcHJvY2VzcwotCQlvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3MgcHJvYyA9IFRuZ1V0aWwuZ2V0T3duaW5nUHJvY2VzcyhhY3QpOwotCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IHByb2MuZ2V0RGVmYXVsdENvbnRleHQoKTsKLQkJaWYgKCBjb25maWcgIT0gbnVsbCApIHsKLQkJCQotCQkJZm9yIChJdGVyYXRvciBpdCA9IHRhc2tzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTsgKSB7Ci0JCQkJVGFzayB0YXNrID0gKFRhc2spaXQubmV4dCgpOwkJCQotCQkJCU1ldGhvZFBhY2thZ2UgcGtnID0gKE1ldGhvZFBhY2thZ2UpdGFzay5lQ29udGFpbmVyKCk7Ci0JCQkJTGlzdCBwa2dzID0gY29uZmlnLmdldE1ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKTsKLQkJCQlpZiAoICFwa2dzLmNvbnRhaW5zKHBrZykgKSB7Ci0JCQkJCXBrZ3MuYWRkKHBrZyk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJU2FmZVVwZGF0ZUNvbnRyb2xsZXIuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkge3B1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCVdCU0Ryb3BDb21tYW5kIGNtZCA9IG5ldyBXQlNEcm9wQ29tbWFuZChhY3QsIHRhc2tzKTsKLQkJCXRyeSB7Ci0JCQkJCWNtZC5leGVjdXRlKCk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCQlleC5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0JCi0JCQlmaW5hbGx5IHsKLQkJCQljbWQuZGlzcG9zZSgpOwotCQkJfQkKLQkgICAgfX0pOwotCX0KLQotCS8qKgotCSAqIGdldCBwcm9jZXNzIGNvbXBvbmVudCBmb3IgdGhlIGVsZW1lbnQKLQkgKiBAcGFyYW0gZSBCcmVha2Rvd25FbGVtZW50Ci0JICogQHJldHVybiBQcm9jZXNzQ29tcG9uZW50Ci0JICovCi0JcHVibGljIHN0YXRpYyBQcm9jZXNzQ29tcG9uZW50IGdldFByb2Nlc3NDb21wb25lbnQoQnJlYWtkb3duRWxlbWVudCBlKSB7Ci0JCQotCQlpZiAoIGUuZUNvbnRhaW5lcigpID09IG51bGwgKSB7Ci0JCQlBY3Rpdml0eSBwYXJlbnQgPSBlLmdldFN1cGVyQWN0aXZpdGllcygpOwotCQkJaWYgKCBwYXJlbnQgPT0gbnVsbCApIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJCQotCQkJcmV0dXJuIGdldFByb2Nlc3NDb21wb25lbnQocGFyZW50KTsKLQkJfQotCQotCQlFT2JqZWN0IGNvbnRhaW5lcjsKLQkJZm9yIChjb250YWluZXIgPSBlLmVDb250YWluZXIoKTsgY29udGFpbmVyICE9IG51bGwKLQkJCQkmJiAhKGNvbnRhaW5lciBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpOyBjb250YWluZXIgPSBjb250YWluZXIKLQkJCQkuZUNvbnRhaW5lcigpKQotCQkJOwotCi0JCWlmICggY29udGFpbmVyICE9IG51bGwgKSB7Ci0JCQlyZXR1cm4gKChQcm9jZXNzQ29tcG9uZW50KSBjb250YWluZXIpOwotCQl9Ci0JCQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGFkZEFjdGl2aXR5VG9Db250YWluZXIoQWN0aXZpdHkgYWN0KSB7Ci0JCVByb2Nlc3NDb21wb25lbnQgcGMgPSBnZXRQcm9jZXNzQ29tcG9uZW50KGFjdCk7Ci0JCWlmICggcGMgIT0gbnVsbCApIHsKLQkJCS8vIGNyZWF0ZSBhIHByb2Nlc3MgcGFja2FnZSBmb3IgdGhlIGFjdGl2aXR5Ci0JCQkgUHJvY2Vzc1BhY2thZ2UgcGtnID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUHJvY2Vzc1BhY2thZ2UoKTsKLQkJCSBwa2cuc2V0TmFtZShhY3QuZ2V0TmFtZSgpKTsKLQkJCSBwa2cuc2V0R3VpZChFY29yZVV0aWwuZ2VuZXJhdGVVVUlEKCkpOwotCQkJIHBjLmdldENoaWxkUGFja2FnZXMoKS5hZGQocGtnKTsKLQkJCSAKLQkJCSBwa2cuZ2V0UHJvY2Vzc0VsZW1lbnRzKCkuYWRkKGFjdCk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGF0YWV4Y2hhbmdlL2ludGVybmFsL2ltcG9ydGluZy9wYWNrYWdlLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGF0YWV4Y2hhbmdlL2ludGVybmFsL2ltcG9ydGluZy9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiMDFkYTMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RhdGFleGNoYW5nZS9pbnRlcm5hbC9pbXBvcnRpbmcvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgdGhlIGltcGxlbWVudGF0aW9uIGZvciB0aGUgZGF0YSBleGNoYW5nZSBzZXJ2aWNlLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9kYXRhZXhjaGFuZ2UvdXRpbC9CYXNlUmVzb3VyY2VIYW5kbGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGF0YWV4Y2hhbmdlL3V0aWwvQmFzZVJlc291cmNlSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNjc0YjQ2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9kYXRhZXhjaGFuZ2UvdXRpbC9CYXNlUmVzb3VyY2VIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlLnV0aWw7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLkZpbGVVdGlsOwotCi0vKioKLSAqIGNvbnRlbnQgcmVzb3VyY2UgaGFuZGxlciB0byBwcm9jZXNzIHRoZSByZXNwb3VyY2VzIGluIHRoZSBjb250ZW50Ci0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQmFzZVJlc291cmNlSGFuZGxlciBpbXBsZW1lbnRzIElSZXNvdXJjZUhhbmRsZXIgewotCi0JcHJvdGVjdGVkIEZpbGUgc291cmNlTGliUm9vdDsKLQlwcm90ZWN0ZWQgRmlsZSB0YXJnZXRMaWJSb290OwotCi0JcHVibGljIEJhc2VSZXNvdXJjZUhhbmRsZXIoRmlsZSBzb3VyY2VMaWJSb290LCBGaWxlIHRhcmdldExpYlJvb3QpIHsKLQkJdGhpcy5zb3VyY2VMaWJSb290ID0gc291cmNlTGliUm9vdDsKLQkJdGhpcy50YXJnZXRMaWJSb290ID0gdGFyZ2V0TGliUm9vdDsKLQl9Ci0JCi0JcHVibGljIGFic3RyYWN0IFVybEluZm8gcmVzb2x2ZUZpbGVVcmwoT2JqZWN0IG93bmVyLCBTdHJpbmcgc3JjVXJsKSB0aHJvd3MgRXhjZXB0aW9uOwotCQotCQotCS8qKgotCSAqIGNvcHlpbmcgdGhlIHJlc291cmNlIGZpbGUgZnJvbSB0aGUgc291cmNlIGxpYnJhcnkgdG8gdGhlIHRhcmdldAotCSAqIAotCSAqIEBwYXJhbSBzb3VyY2VGaWxlIHRoZSBmaWxlIHBhdGggcmVsYXRpdmUgdG8gdGhlIHNvdXJjZSByb290Ci0JICovCi0JcHVibGljIHZvaWQgY29weVJlc291cmNlKFN0cmluZyBzb3VyY2VGaWxlKSB7Ci0JCUZpbGUgc3JjID0gbmV3IEZpbGUoc291cmNlTGliUm9vdCwgc291cmNlRmlsZSk7Ci0JCWlmICggc3JjLmV4aXN0cygpICkgewotCQkJRmlsZSB0Z3QgPSBuZXcgRmlsZSh0YXJnZXRMaWJSb290LCBzb3VyY2VGaWxlKTsKLQkJCUZpbGVVdGlsLmNvcHlGaWxlKHNyYywgdGd0KTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9kYXRhZXhjaGFuZ2UvdXRpbC9Db250ZW50UHJvY2Vzc29yLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGF0YWV4Y2hhbmdlL3V0aWwvQ29udGVudFByb2Nlc3Nvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MDc5MDMyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9kYXRhZXhjaGFuZ2UvdXRpbC9Db250ZW50UHJvY2Vzc29yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS51dGlsOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci1pbXBvcnQgamF2YS51dGlsLnJlZ2V4Lk1hdGNoZXI7Ci1pbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLkZpbGVVdGlsOwotCi0KLQotLyoqCi0gKiBjb250ZW50IHByb2Nlc3NlciB0byBmaXggcmVmZXJlbmNlcyBhbmQgY29weSByZXNvdXJjZXMgdG8gdGhlIHRhcmdldCBsaWJyYXJ5IGxvY2F0aW9uCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKgotICovCi1wdWJsaWMgY2xhc3MgQ29udGVudFByb2Nlc3NvciB7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFBhdHRlcm4gcF9zcmNfcmVmID0gUGF0dGVybi5jb21waWxlKCJzcmNcXHMqPVxccypcIiguKj8pXCIiLCBQYXR0ZXJuLkNBU0VfSU5TRU5TSVRJVkUgfCBQYXR0ZXJuLkRPVEFMTCk7IC8vJE5PTi1OTFMtMSQKLS8vCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgUGF0dGVybiBwX2xpbmtfcmVmID0gUGF0dGVybi5jb21waWxlKCI8YVxccys/KFtePl0qKT4oLio/KTwvYT4iLCBQYXR0ZXJuLkNBU0VfSU5TRU5TSVRJVkUgfCBQYXR0ZXJuLkRPVEFMTCk7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFBhdHRlcm4gcF9ocmVmX3JlZiA9IFBhdHRlcm4uY29tcGlsZSgiaHJlZlxccyo9XFxzKlwiKC4qPylcIiIsIFBhdHRlcm4uQ0FTRV9JTlNFTlNJVElWRSB8IFBhdHRlcm4uRE9UQUxMKTsgLy8kTk9OLU5MUy0xJAotCi0JSVJlc291cmNlSGFuZGxlciBoYW5kbGVyOwotCUlMb2dnZXIgbG9nZ2VyOwotCQotCXB1YmxpYyBDb250ZW50UHJvY2Vzc29yKElSZXNvdXJjZUhhbmRsZXIgaGFuZGxlciwgSUxvZ2dlciBsb2dnZXIpIHsKLQkJdGhpcy5oYW5kbGVyID0gaGFuZGxlcjsKLQkJdGhpcy5sb2dnZXIgPSBsb2dnZXI7Ci0JfQotCQotCS8qKgotCSAqIHJlc292bGUgdGhlIHJlc291cmNlIHN0cmluZyBmb3IgdGhlIGdpdmVuIG93bmVyLiAKLQkgKiBUaGUgb3duZXIgaXMgYSBtZXRob2QgZWxlbWVudCwgYnV0IGNhbiBiZSBlaXRoZXIgZnJvbSB1bWEgbW9kZWwgb3IgeG1sIG1vZGVsLiAKLQkgKiBAcGFyYW0gb3duZXIKLQkgKiBAcGFyYW0gc291cmNlCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBTdHJpbmcgcmVzb2x2ZVJlc291cmNlRmlsZXMoT2JqZWN0IG93bmVyLCBTdHJpbmcgc291cmNlKSB7Ci0JCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQotCQl0cnkKLQkJewotCQkJLy8gcHJvY2VzcyBpbWFnZXMgYW5kIG90aGVyIHNyYyByZXNvdXJjZXMKLQkJCU1hdGNoZXIgbSA9IHBfc3JjX3JlZi5tYXRjaGVyKHNvdXJjZSk7Ci0JCQl3aGlsZSAoIG0uZmluZCgpICkKLQkJCXsKLQkJCQlTdHJpbmcgdXJsID0gbS5ncm91cCgxKTsKLQkJCQlTdHJpbmcgbmV3X3VybCAgPSBwcm9jZXNzUmVzb3VyY2VVcmwob3duZXIsIHVybCk7Ci0JCQkJU3RyaW5nIHJlcGxhY2VtZW50ID0gInNyYz1cIiIgKyBuZXdfdXJsICsgIlwiIjsgCQkgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJbS5hcHBlbmRSZXBsYWNlbWVudChzYiwgZml4UmVwbGFjZW1lbnRTdHIocmVwbGFjZW1lbnQpKTsKLQkJCX0KLQkJCW0uYXBwZW5kVGFpbChzYik7Ci0JCQkKLQkJCS8vIHByb2Nlc3MgaHJlZnMKLQkJCW0gPSBwX2hyZWZfcmVmLm1hdGNoZXIoc2IudG9TdHJpbmcoKSk7Ci0JCQlzYi5zZXRMZW5ndGgoMCk7Ci0JCQkKLQkJCXdoaWxlICggbS5maW5kKCkgKQotCQkJewotCQkJCVN0cmluZyB1cmwgPSBtLmdyb3VwKDEpOwotCQkJCVN0cmluZyBtYXJrID0gIiI7IC8vJE5PTi1OTFMtMSQKLQotCQkJCWludCBpbmRleCA9IHVybC5pbmRleE9mKCIjIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlpZiAoIGluZGV4ID49IDAgKQotCQkJCXsKLQkJCQkJbWFyayA9IHVybC5zdWJzdHJpbmcoaW5kZXgpOwotCQkJCQl1cmwgPSB1cmwuc3Vic3RyaW5nKDAsIGluZGV4KTsKLQkJCQl9Ci0KLQkJCQlpZiAoIHVybC5sZW5ndGgoKSA+IDAgKQotCQkJCXsKLQkJCQkJdXJsID0gcHJvY2Vzc1Jlc291cmNlVXJsKG93bmVyLCB1cmwpOwotCQkJCX0KLQkJCQltLmFwcGVuZFJlcGxhY2VtZW50KHNiLCBmaXhSZXBsYWNlbWVudFN0cigiaHJlZj1cIiIgKyB1cmwgKyBtYXJrICsgIlwiIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCX0KLQkJCW0uYXBwZW5kVGFpbChzYik7Ci0JCQkKLQkJCS8vIGFueXRoaW5nIGVsc2UgPz8/Ci0JCQkKLQkJfQotCQljYXRjaCAoRXhjZXB0aW9uIGV4KQotCQl7Ci0JCQlleC5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCQkKLQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oc2IpOwotCQkKLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCQotCXByaXZhdGUgU3RyaW5nIGZpeFJlcGxhY2VtZW50U3RyKFN0cmluZyBzdHIpIHsKLQkJLy8gZXNjYXBlIHRoZSAkIHNpbmNlIGl0J3MgdHJlYXRlZCBhcyBhIGdyb3VwIHNlcXVlbmNlCi0JCXRyeSB7Ci0JCQlpbnQgaW5kZXggPSBzdHIuaW5kZXhPZigiJCIpOyAvLyROT04tTkxTLTEkCi0JCQlpZiAoIGluZGV4IDwgMCApIHsKLQkJCQlyZXR1cm4gc3RyOwotCQkJfQotCQkJCi0JCQlTdHJpbmdCdWZmZXIgYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCWludCBzdGFydCA9IDA7Ci0JCQl3aGlsZSAoIGluZGV4ID49IDAgKSB7Ci0JCQkJYi5hcHBlbmQoc3RyLnN1YnN0cmluZyhzdGFydCwgaW5kZXgpKS5hcHBlbmQoIlxcJCIpOyAvLyROT04tTkxTLTEkCi0JCQkJc3RhcnQgPSBpbmRleCsxOwotCQkJCWluZGV4ID0gc3RyLmluZGV4T2YoIiQiLCBzdGFydCk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCQotCQkJYi5hcHBlbmQoc3RyLnN1YnN0cmluZyhzdGFydCkpOwotCQkJCi0JCQlyZXR1cm4gYi50b1N0cmluZygpOwotCQkKLQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCi0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JCQotCQlyZXR1cm4gc3RyOwotCX0KLQkKLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0ZpbGVVcmwoU3RyaW5nIHVybCkKLQl7Ci0JCS8vU3lzdGVtLm91dC5wcmludGxuKCJQcm9jZXNzaW5nIGltYWdlIHVybCBbIiArIHVybCArICJdIik7Ci0JCWlmICggCXVybCA9PSBudWxsIHx8IHVybC5sZW5ndGgoKSA9PSAwCi0JCQkJfHwgdXJsLnN0YXJ0c1dpdGgoImh0dHAiKSAvLyROT04tTkxTLTEkCi0JCQkJfHwgdXJsLnN0YXJ0c1dpdGgoInd3dy4iKSAvLyROT04tTkxTLTEkCi0JCQkJfHwgdXJsLnN0YXJ0c1dpdGgoIm1haWx0bzoiKSAvLyROT04tTkxTLTEkCi0JCQkJfHwgdXJsLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiamF2YXNjcmlwdDoiKSA+PTAgKSAvLyROT04tTkxTLTEkCi0JCXsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCXJldHVybiB0cnVlOwotCX0KLQkKLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1ZhbGlkRmlsZVBhdGgoRmlsZSBmKSB7Ci0JCXJldHVybiAoZiAhPSBudWxsKSAmJiBmLmV4aXN0cygpOwotCX0KLQkKLQotCXB1YmxpYyBTdHJpbmcgcHJvY2Vzc1Jlc291cmNlVXJsKE9iamVjdCBvd25lciwgU3RyaW5nIHVybCkKLQl7Ci0JCWlmICggIWlzRmlsZVVybCh1cmwpICkKLQkJewotCQkJcmV0dXJuIHVybDsKLQkJfQotCi0JCVVybEluZm8gaW5mbyA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlpbmZvID0gaGFuZGxlci5yZXNvbHZlRmlsZVVybChvd25lciwgdXJsKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQlsb2dnZXIubG9nV2FybmluZygiZXJyb3IgcHJvY2Vzc2luZyB1cmwgJyIgKyB1cmwgKyAiJyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCXJldHVybiB1cmw7Ci0JCX0KLQkJCi0JCWlmICggaW5mby5zb3VyY2VGaWxlID09IG51bGwgfHwgaW5mby50YXJnZXRGaWxlID09IG51bGwgKSB7Ci0JCQlyZXR1cm4gdXJsOwotCQl9Ci0JCQotCQlpZiAoIGluZm8uc291cmNlRmlsZS5pc0ZpbGUoKSAmJiBpbmZvLnNvdXJjZUZpbGUuZXhpc3RzKCkgKQotCQl7Ci0JCQlGaWxlVXRpbC5jb3B5RmlsZShpbmZvLnNvdXJjZUZpbGUsIGluZm8udGFyZ2V0RmlsZSk7Ci0JCQkKLQkJCS8vIHJldHVybiB0aGUgZml4ZWQgdGFyZ2V0IHVybCBpZiB0aGUgZmlsZSBleGlzdHMgCi0JCQkvLyBhbmQgaXMgY29waWVkIG92ZXIgdG8gdGhlIHRhcmdldCBsb2NhdGlvbgotCQkJcmV0dXJuIGluZm8udGFyZ2V0VXJsOwotCQl9Ci0KLQkJcmV0dXJuIHVybDsKLQl9Ci0KLQotCS8qKgotCSAqIHByb2Nlc3MgdGhlIHVybCwgdXBkYXRlIHRoZSByZXN1bHQgYnVmZmVyLCBhbmQgcmV0dXJuIHRoZSBhc3NvY2lhdGVkIGVsZW1lbnQgaWYgYW55Ci0JICogQHBhcmFtIHNvdXJjZSB0ZWggdXJsIHRleHQgc3RyaW5nCi0JICogQHBhcmFtIHJlc3VsdCBTdHJpbmdCdWZmZXIKLQkgKiBAcmV0dXJuIE1ldGhvZEVsZW1lbnQgdGhlIGxpbmtlZCBlbGVtZW50IG9yIG51bGwKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzVXJsVGV4dChPYmplY3Qgb3duZXIsIFN0cmluZyBzb3VyY2UpCi0JewotCQlNYXRjaGVyIG0gPSBwX2hyZWZfcmVmLm1hdGNoZXIoc291cmNlKTsKLQkJaWYgKCBtLmZpbmQoKSApCi0JCXsKLQkJCVN0cmluZyB1cmwgPSBtLmdyb3VwKDEpOwotCQkJaWYgKCB1cmwudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJqYXZhU2NyaXB0OiIpIDwgMCApIC8vJE5PTi1OTFMtMSQKLQkJCXsKLQkJCQlpbnQgaW5kZXggPSB1cmwuaW5kZXhPZigiIyIpOyAvLyROT04tTkxTLTEkCi0JCQkJaWYgKCBpbmRleCA+PSAwICkKLQkJCQl7Ci0JCQkJCXVybCA9IHVybC5zdWJzdHJpbmcoMCwgaW5kZXgpOwotCQkJCX0KLQotCQkJCWlmICggdXJsLmxlbmd0aCgpID4gMCApCi0JCQkJewotCQkJCQlwcm9jZXNzUmVzb3VyY2VVcmwob3duZXIsIHVybCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIGNvcHlSZXNvdXJjZShTdHJpbmcgc291cmNlRmlsZSkgewotCQloYW5kbGVyLmNvcHlSZXNvdXJjZShzb3VyY2VGaWxlKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgY29weVJlc291cmNlKFN0cmluZyBzb3VyY2VGaWxlLCBFT2JqZWN0IG9iaiwgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW4gdW1hUGx1Z2luKSB7Ci0JCWhhbmRsZXIuY29weVJlc291cmNlKHNvdXJjZUZpbGUsIG9iaiwgdW1hUGx1Z2luKTsKLQl9Ci0JCi0JLyoqCi0JICogdGhpcyBtZXRob2QgaXMgZm9yIHJlc29sdmVpbmcgdGhlIHRlbXBsYXRlIGF0dGFjaG1lbnQgcmVzb3VyY2VzCi0JICogVGhlIHJlc291cmNlIGlzIGEgc2V0IG9mIHVybHMgc2VwZXJhdGVkIGJ5IHwKLQkgKiAKLQkgKiBAcGFyYW0gb3duZXIKLQkgKiBAcGFyYW0gdXJscwotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyByZXNvbHZlQXR0YWNobWVudFJlc291cmNlcyhPYmplY3Qgb3duZXIsIFN0cmluZyB1cmxzKSB7Ci0JCWlmICggKHVybHMgIT0gbnVsbCkgJiYgdXJscy5sZW5ndGgoKSAhPSAwICkgewotCQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCVN0cmluZ1Rva2VuaXplciBzdCA9IG5ldyBTdHJpbmdUb2tlbml6ZXIodXJscywgInwiKTsgLy8gdGhpcyBpcyBoYXJkY29kZWQgc29tZWhvdyAvLyROT04tTkxTLTEkCi0JCQl3aGlsZSAoc3QuaGFzTW9yZVRva2VucygpICkgewotCQkJCVN0cmluZyB1cmwgPSBzdC5uZXh0VG9rZW4oKTsKLQkJCQl1cmwgPSBwcm9jZXNzUmVzb3VyY2VVcmwob3duZXIsIHVybCk7Ci0JCQkJaWYgKCBidWZmZXIubGVuZ3RoKCkgPiAwICkgewotCQkJCQlidWZmZXIuYXBwZW5kKCJ8Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQkJYnVmZmVyLmFwcGVuZCh1cmwpOwotCQkJfQotCQkJCi0JCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JCX0KLQkJCi0JCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9kYXRhZXhjaGFuZ2UvdXRpbC9EZWZhdWx0TG9nZ2VyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGF0YWV4Y2hhbmdlL3V0aWwvRGVmYXVsdExvZ2dlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMjE0Nzc2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9kYXRhZXhjaGFuZ2UvdXRpbC9EZWZhdWx0TG9nZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlLnV0aWw7Ci0KLWltcG9ydCBqYXZhLmlvLlByaW50U3RyZWFtOwotCi1wdWJsaWMgY2xhc3MgRGVmYXVsdExvZ2dlciBpbXBsZW1lbnRzIElMb2dnZXIgewotCi0JcHJvdGVjdGVkIFByaW50U3RyZWFtIGluZm8gPSBTeXN0ZW0ub3V0OwotCXByb3RlY3RlZCBQcmludFN0cmVhbSB3YXJuaW5nID0gU3lzdGVtLm91dDsKLQlwcm90ZWN0ZWQgUHJpbnRTdHJlYW0gZXJyb3IgPSBTeXN0ZW0uZXJyOwotCXB1YmxpYyB2b2lkIGxvZ0Vycm9yKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgdGgpIHsKLQkJZXJyb3IucHJpbnRsbihtZXNzYWdlKTsKLQkJaWYgKCB0aCAhPSBudWxsICkgewotCQkJdGgucHJpbnRTdGFja1RyYWNlKGVycm9yKTsKLQkJfQkKLQl9Ci0JcHVibGljIHZvaWQgbG9nV2FybmluZyhTdHJpbmcgbWVzc2FnZSkgewotCQl3YXJuaW5nLnByaW50bG4obWVzc2FnZSk7Ci0JfQotCXB1YmxpYyB2b2lkIGxvZ01lc3NhZ2UoU3RyaW5nIG1lc3NhZ2UpIHsKLQkJaW5mby5wcmludGxuKG1lc3NhZ2UpOwotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCQotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9kYXRhZXhjaGFuZ2UvdXRpbC9GaWxlTG9nZ2VyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGF0YWV4Y2hhbmdlL3V0aWwvRmlsZUxvZ2dlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYTUwMGJmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9kYXRhZXhjaGFuZ2UvdXRpbC9GaWxlTG9nZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlLnV0aWw7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uUHJpbnRTdHJlYW07Ci0KLS8qKgotICogZmlsZSBMb2dnZXIgY2xhc3MKLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBGaWxlTG9nZ2VyIGV4dGVuZHMgRGVmYXVsdExvZ2dlciB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFUlJPUl9MT0dfRklMRU5BTUUgPSAiZXJyb3IubG9nIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0FSTklOR19MT0dfRklMRU5BTUUgPSAid2FybmluZy5sb2ciOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTkZPX0xPR19GSUxFTkFNRSA9ICJpbmZvLmxvZyI7IC8vJE5PTi1OTFMtMSQKLQotCXByb3RlY3RlZCBGaWxlIGxvZ1BhdGg7Ci0KLQlwdWJsaWMgRmlsZUxvZ2dlcihGaWxlIGxvZ1BhdGgpIHsKLQkJdGhpcy5sb2dQYXRoID0gbG9nUGF0aDsKLQotCQlpZiAoIXRoaXMubG9nUGF0aC5leGlzdHMoKSkgewotCQkJdGhpcy5sb2dQYXRoLm1rZGlycygpOwotCQl9Ci0KLQkJc3VwZXIuaW5mbyA9IGdldFN0cmVhbShuZXcgRmlsZShsb2dQYXRoLCBJTkZPX0xPR19GSUxFTkFNRSkpOwotCQlzdXBlci53YXJuaW5nID0gZ2V0U3RyZWFtKG5ldyBGaWxlKGxvZ1BhdGgsIFdBUk5JTkdfTE9HX0ZJTEVOQU1FKSk7Ci0JCXN1cGVyLmVycm9yID0gZ2V0U3RyZWFtKG5ldyBGaWxlKGxvZ1BhdGgsIEVSUk9SX0xPR19GSUxFTkFNRSkpOwotCi0JfQotCi0JcHJpdmF0ZSBQcmludFN0cmVhbSBnZXRTdHJlYW0oRmlsZSBmKSB7Ci0JCXRyeSB7Ci0JCQlGaWxlIGRpciA9IGYuZ2V0UGFyZW50RmlsZSgpOwotCQkJZGlyLm1rZGlycygpOwotCi0JCQlpZiAoIWYuZXhpc3RzKCkpIHsKLQkJCQlmLmNyZWF0ZU5ld0ZpbGUoKTsKLQkJCX0KLQotCQkJcmV0dXJuIG5ldyBQcmludFN0cmVhbShuZXcgRmlsZU91dHB1dFN0cmVhbShmKSwgdHJ1ZSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0KLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWluZm8uY2xvc2UoKTsKLQkJd2FybmluZy5jbG9zZSgpOwotCQllcnJvci5jbG9zZSgpOwotCi0JfQotCQotCXB1YmxpYyBGaWxlIGdldExvZ1BhdGgoKSB7Ci0JCXJldHVybiBsb2dQYXRoOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9kYXRhZXhjaGFuZ2UvdXRpbC9JTG9nZ2VyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGF0YWV4Y2hhbmdlL3V0aWwvSUxvZ2dlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMGYxNWJiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9kYXRhZXhjaGFuZ2UvdXRpbC9JTG9nZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlLnV0aWw7Ci0KLS8qKgotICogTG9nZ2VyIGludGVyZmFjZSBmb3IgZXhwb3J0IGFuZCBpbXBvcnQKLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUxvZ2dlciB7Ci0KLQlwdWJsaWMgdm9pZCBsb2dFcnJvcihTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIHRoKTsKLQkKLQlwdWJsaWMgdm9pZCBsb2dXYXJuaW5nKFN0cmluZyBtZXNzYWdlKTsKLQkKLQlwdWJsaWMgdm9pZCBsb2dNZXNzYWdlKFN0cmluZyBtZXNzYWdlKTsKLQkKLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCk7Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGF0YWV4Y2hhbmdlL3V0aWwvSVJlc291cmNlSGFuZGxlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RhdGFleGNoYW5nZS91dGlsL0lSZXNvdXJjZUhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWRlMWVmYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGF0YWV4Y2hhbmdlL3V0aWwvSVJlc291cmNlSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci0KLS8qKgotICogUmVzb3VyY2UgaGFuZGxlciBpbnRlcmZhY2UgZm9yIHhtbCBleHBvcnQgYW5kIGltcG9ydAotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICoKLSAqLwotcHVibGljIGludGVyZmFjZSBJUmVzb3VyY2VIYW5kbGVyIHsKLQotCXB1YmxpYyBVcmxJbmZvIHJlc29sdmVGaWxlVXJsKE9iamVjdCBvd25lciwgU3RyaW5nIHNyY1VybCkgdGhyb3dzIEV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIGNvcHlpbmcgdGhlIHJlc291cmNlIGZpbGUgZnJvbSB0aGUgc291cmNlIGxpYnJhcnkgdG8gdGhlIHRhcmdldAotCSAqIAotCSAqIEBwYXJhbSBzb3VyY2VGaWxlIHRoZSBmaWxlIHBhdGggcmVsYXRpdmUgdG8gdGhlIHNvdXJjZSByb290Ci0JICogQGRlcHJlY2F0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBjb3B5UmVzb3VyY2UoU3RyaW5nIHNvdXJjZUZpbGUpOwotCQotCXB1YmxpYyB2b2lkIGNvcHlSZXNvdXJjZShTdHJpbmcgc291cmNlRmlsZSwgRU9iamVjdCBvYmosIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luIHVtYVBsdWdpbik7Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGF0YWV4Y2hhbmdlL3V0aWwvVXJsSW5mby5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RhdGFleGNoYW5nZS91dGlsL1VybEluZm8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2MyZThjOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGF0YWV4Y2hhbmdlL3V0aWwvVXJsSW5mby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS51dGlsOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi0vKioKLSAqIERhdGEgc3RydWN0dXJlIHRvIHN0b3JlIHVybCBpbmZvIGluIGNvbnRlbnQKLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBVcmxJbmZvIHsKLQotCXB1YmxpYyBGaWxlIHNvdXJjZUZpbGU7Ci0JcHVibGljIEZpbGUgdGFyZ2V0RmlsZTsKLQlwdWJsaWMgU3RyaW5nIHNvdXJjZVVybDsKLQlwdWJsaWMgU3RyaW5nIHRhcmdldFVybDsKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9kYXRhZXhjaGFuZ2UvdXRpbC9wYWNrYWdlLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGF0YWV4Y2hhbmdlL3V0aWwvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNjljNjBmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9kYXRhZXhjaGFuZ2UvdXRpbC9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyBpbXBsZW1lbnRhdGlvbiBzdXBwb3J0IGZvciB0aGUgZGF0YSBleGNoYW5nZSBzZXJ2aWNlLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLy5jbGFzc3BhdGggYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTFjOGYyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC8ub3B0aW9ucyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLy5vcHRpb25zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhODMzMDhiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLy5vcHRpb25zCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi0jIERlYnVnZ2luZyBvcHRpb25zIGZvciB0aGUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQgcGx1Zy1pbgotCi0jIFR1cm4gb24gZ2VuZXJhbCBkZWJ1Z2dpbmcgZm9yIHRoZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZCBwbHVnLWluCi1vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9kZWJ1Zz1mYWxzZQotCi0jIFR1cm4gb24gZGVidWdnaW5nIG9mIHZpc3VhbElEIHByb2Nlc3NpbmcKLW9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL2RlYnVnL3Zpc3VhbElEPXRydWUKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC8ucHJvamVjdCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YmM2NThjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQ8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTBkNGRkNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZDsgc2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS41LjAucXVhbGlmaWVyCi1CdW5kbGUtQ2xhc3NQYXRoOiAuCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5wYXJ0LkFjdGl2aXR5RGlhZ3JhbUVkaXRvclBsdWdpbgotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQsCi0gb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cywKLSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5wYXJ0LAotIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnByb3ZpZGVycwotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZSwKLSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcywKLSBvcmcuZWNsaXBzZS5qZmFjZSwKLSBvcmcuZWNsaXBzZS51aS5pZGUsCi0gb3JnLmVjbGlwc2UudWkudmlld3MsCi0gb3JnLmVjbGlwc2UudWkud29ya2JlbmNoLAotIG9yZy5lY2xpcHNlLnVpLndvcmtiZW5jaC50ZXh0ZWRpdG9yLAotIG9yZy5lY2xpcHNlLmVtZi5lY29yZSwKLSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLAotIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLAotIG9yZy5lY2xpcHNlLmdlZjt2aXNpYmlsaXR5Oj1yZWV4cG9ydCwKLSBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29yZTt2aXNpYmlsaXR5Oj1yZWV4cG9ydCwKLSBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29tbWFuZHMuY29yZTt2aXNpYmlsaXR5Oj1yZWV4cG9ydCwKLSBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudWkucHJvcGVydGllczt2aXNpYmlsaXR5Oj1yZWV4cG9ydCwKLSBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpO3Zpc2liaWxpdHk6PXJlZXhwb3J0LAotIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucHJvdmlkZXJzO3Zpc2liaWxpdHk6PXJlZXhwb3J0LAotIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucHJvdmlkZXJzLmlkZTt2aXNpYmlsaXR5Oj1yZWV4cG9ydCwKLSBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlbmRlcjt2aXNpYmlsaXR5Oj1yZWV4cG9ydCwKLSBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlc291cmNlcy5lZGl0b3I7dmlzaWJpbGl0eTo9cmVleHBvcnQsCi0gb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXNvdXJjZXMuZWRpdG9yLmlkZTt2aXNpYmlsaXR5Oj1yZWV4cG9ydCwKLSBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5wcm92aWRlcnMsCi0gb3JnLmVjbGlwc2UudW1sMi51bWw7dmlzaWJpbGl0eTo9cmVleHBvcnQsCi0gb3JnLmVjbGlwc2UudW1sMi51bWwuZWRpdDt2aXNpYmlsaXR5Oj1yZWV4cG9ydCwKLSBvcmcuZWNsaXBzZS5lbWYuZWNvcmU7dmlzaWJpbGl0eTo9cmVleHBvcnQsCi0gb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmVkaXQ7dmlzaWJpbGl0eTo9cmVleHBvcnQsCi0gb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpO3Zpc2liaWxpdHk6PXJlZXhwb3J0LAotIG9yZy5lY2xpcHNlLmRyYXcyZDt2aXNpYmlsaXR5Oj1yZWV4cG9ydCwKLSBvcmcuZWNsaXBzZS5lcGYudW1hLAotIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LAotIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZ2Vvc2hhcGVzLAotIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUsCi0gb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5hY3Rpb25zLAotIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucHJpbnRpbmcsCi0gb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wcmludGluZy5yZW5kZXIsCi0gb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLAotIG9yZy5lY2xpcHNlLmVwZi5jb21tb24udWkKLUVjbGlwc2UtTGF6eVN0YXJ0OiB0cnVlCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL2J1aWxkLnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMmE1M2Y0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLWJpbi5pbmNsdWRlcyA9IC4sXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgaWNvbnMvCi1qYXJzLmNvbXBpbGUub3JkZXIgPSAuCi1zb3VyY2UuLiA9IHNyYy8KLW91dHB1dC4uID0gYmluLwpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvaWNvbnMvZGlhZ3JhbS9hY3Rpdml0eS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9pY29ucy9kaWFncmFtL2FjdGl2aXR5LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzczOTNlNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9pY29ucy9kaWFncmFtL2FjdGl2aXR5LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL2ljb25zL2RpYWdyYW0vaXRlcmF0aW9uLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL2ljb25zL2RpYWdyYW0vaXRlcmF0aW9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjVjOGExNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9pY29ucy9kaWFncmFtL2l0ZXJhdGlvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9pY29ucy9kaWFncmFtL21pbGVzdG9uZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9pY29ucy9kaWFncmFtL21pbGVzdG9uZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3NmZmOTQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvaWNvbnMvZGlhZ3JhbS9taWxlc3RvbmUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvaWNvbnMvZGlhZ3JhbS9waGFzZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9pY29ucy9kaWFncmFtL3BoYXNlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTVjYjNjZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9pY29ucy9kaWFncmFtL3BoYXNlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL2ljb25zL2RpYWdyYW0vdGFza2Rlc2NyaXB0b3IuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvaWNvbnMvZGlhZ3JhbS90YXNrZGVzY3JpcHRvci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0NWQ2NTEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvaWNvbnMvZGlhZ3JhbS90YXNrZGVzY3JpcHRvci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9pY29ucy9kaWFncmFtL3Rhc2tkZXNjcmlwdG9yMS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9pY29ucy9kaWFncmFtL3Rhc2tkZXNjcmlwdG9yMS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0NWQ2NTEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvaWNvbnMvZGlhZ3JhbS90YXNrZGVzY3JpcHRvcjEuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvaWNvbnMvZnVsbC9kdG9vbDE2L0FERWRpdG9yLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL2ljb25zL2Z1bGwvZHRvb2wxNi9BREVkaXRvci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1MGZhZmMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvaWNvbnMvZnVsbC9kdG9vbDE2L0FERWRpdG9yLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL2ljb25zL2Z1bGwvZXRvb2wxNi9BREVkaXRvci5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9pY29ucy9mdWxsL2V0b29sMTYvQURFZGl0b3IuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZTU2ZjE0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL2ljb25zL2Z1bGwvZXRvb2wxNi9BREVkaXRvci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9pY29ucy9mdWxsL29iajE2L0FjdGl2aXR5LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL2ljb25zL2Z1bGwvb2JqMTYvQWN0aXZpdHkuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjIwZGViLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL2ljb25zL2Z1bGwvb2JqMTYvQWN0aXZpdHkuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvaWNvbnMvZnVsbC9vYmoxNi9BY3Rpdml0eUZpbmFsTm9kZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9pY29ucy9mdWxsL29iajE2L0FjdGl2aXR5RmluYWxOb2RlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQ0OTcyOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9pY29ucy9mdWxsL29iajE2L0FjdGl2aXR5RmluYWxOb2RlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL2ljb25zL2Z1bGwvb2JqMTYvQWN0aXZpdHlQYXJ0aXRpb24uZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvaWNvbnMvZnVsbC9vYmoxNi9BY3Rpdml0eVBhcnRpdGlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxNjhkYzMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvaWNvbnMvZnVsbC9vYmoxNi9BY3Rpdml0eVBhcnRpdGlvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9pY29ucy9mdWxsL29iajE2L0NvbnRyb2xGbG93LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL2ljb25zL2Z1bGwvb2JqMTYvQ29udHJvbEZsb3cuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMzBjMjIzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL2ljb25zL2Z1bGwvb2JqMTYvQ29udHJvbEZsb3cuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvaWNvbnMvZnVsbC9vYmoxNi9EZWNpc2lvbk5vZGUuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvaWNvbnMvZnVsbC9vYmoxNi9EZWNpc2lvbk5vZGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNGE2MDFjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL2ljb25zL2Z1bGwvb2JqMTYvRGVjaXNpb25Ob2RlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL2ljb25zL2Z1bGwvb2JqMTYvRm9ya05vZGUuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvaWNvbnMvZnVsbC9vYmoxNi9Gb3JrTm9kZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3YzIwYjMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvaWNvbnMvZnVsbC9vYmoxNi9Gb3JrTm9kZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9pY29ucy9mdWxsL29iajE2L0luaXRpYWxOb2RlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL2ljb25zL2Z1bGwvb2JqMTYvSW5pdGlhbE5vZGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNzVjZjc4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL2ljb25zL2Z1bGwvb2JqMTYvSW5pdGlhbE5vZGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvaWNvbnMvZnVsbC9vYmoxNi9JdGVyYXRpb24uZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvaWNvbnMvZnVsbC9vYmoxNi9JdGVyYXRpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MzExZTQ2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL2ljb25zL2Z1bGwvb2JqMTYvSXRlcmF0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL2ljb25zL2Z1bGwvb2JqMTYvSm9pbk5vZGUuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvaWNvbnMvZnVsbC9vYmoxNi9Kb2luTm9kZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4YzNhMzkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvaWNvbnMvZnVsbC9vYmoxNi9Kb2luTm9kZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9pY29ucy9mdWxsL29iajE2L01lcmdlTm9kZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9pY29ucy9mdWxsL29iajE2L01lcmdlTm9kZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3NGNiOTYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvaWNvbnMvZnVsbC9vYmoxNi9NZXJnZU5vZGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvaWNvbnMvZnVsbC9vYmoxNi9NaWxlc3RvbmUuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvaWNvbnMvZnVsbC9vYmoxNi9NaWxlc3RvbmUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOTYxNWViLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL2ljb25zL2Z1bGwvb2JqMTYvTWlsZXN0b25lLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL2ljb25zL2Z1bGwvb2JqMTYvUGhhc2UuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvaWNvbnMvZnVsbC9vYmoxNi9QaGFzZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkZWI5ZGQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvaWNvbnMvZnVsbC9vYmoxNi9QaGFzZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9pY29ucy9mdWxsL29iajE2L1N0cnVjdHVyZWRBY3Rpdml0eU5vZGUuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvaWNvbnMvZnVsbC9vYmoxNi9TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjYwZmIyOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9pY29ucy9mdWxsL29iajE2L1N0cnVjdHVyZWRBY3Rpdml0eU5vZGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvaWNvbnMvZnVsbC9vYmoxNi9UYXNrRGVzY3JpcHRvci5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9pY29ucy9mdWxsL29iajE2L1Rhc2tEZXNjcmlwdG9yLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTU0ZTI2ZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9pY29ucy9mdWxsL29iajE2L1Rhc2tEZXNjcmlwdG9yLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL2ljb25zL2Z1bGwvb2JqMTYvZGVsZXRlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL2ljb25zL2Z1bGwvb2JqMTYvZGVsZXRlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjY5MjJhYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9pY29ucy9mdWxsL29iajE2L2RlbGV0ZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9pY29ucy9vYmoxNi9VTUxEaWFncmFtRmlsZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9pY29ucy9vYmoxNi9VTUxEaWFncmFtRmlsZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3YWEyZGYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvaWNvbnMvb2JqMTYvVU1MRGlhZ3JhbUZpbGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvaWNvbnMvd2l6YmFuL05ld1VNTFdpemFyZC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9pY29ucy93aXpiYW4vTmV3VU1MV2l6YXJkLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODNlMDNiZi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9pY29ucy93aXpiYW4vTmV3VU1MV2l6YXJkLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL21lc3NhZ2VzLnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9tZXNzYWdlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMDZkNjkzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL21lc3NhZ2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jTkxTX01FU1NBR0VGT1JNQVRfVkFSCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBTVEFSVCBOTyBUUkFOU0xBVElPTgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgVE9ETzogbWFudWFsbHkgcHV0IGtleXMgYW5kIHZhbHVlcwotVU1MRGlhZ3JhbUVkaXRvclV0aWxfT3Blbk1vZGVsUmVzb3VyY2VFcnJvckRpYWxvZ1RpdGxlPUVycm9yCi1VTUxEaWFncmFtRWRpdG9yVXRpbF9PcGVuTW9kZWxSZXNvdXJjZUVycm9yRGlhbG9nTWVzc2FnZT1GYWlsZWQgdG8gbG9hZCBtb2RlbCBmaWxlIHswfQotVU1MRGlhZ3JhbUVkaXRvclV0aWxfQ3JlYXRlRGlhZ3JhbVByb2dyZXNzVGFzaz1DcmVhdGluZyBkaWFncmFtIGFuZCBtb2RlbCBmaWxlcwotVU1MRGlhZ3JhbUVkaXRvclV0aWxfQ3JlYXRlRGlhZ3JhbUNvbW1hbmRMYWJlbD1DcmVhdGluZyBkaWFncmFtIGFuZCBtb2RlbAotVU1MRG9jdW1lbnRQcm92aWRlcl9pc01vZGlmaWFibGU9VXBkYXRpbmcgY2FjaGUgZmFpbGVkCi1VTUxEb2N1bWVudFByb3ZpZGVyX2hhbmRsZUVsZW1lbnRDb250ZW50Q2hhbmdlZD1GYWlsZWQgdG8gcmVmcmVzaCBoaWVyYXJjaHkgZm9yIGNoYW5nZWQgcmVzb3VyY2UKLVVNTERvY3VtZW50UHJvdmlkZXJfSW5jb3JyZWN0SW5wdXRFcnJvcj17MX0KLVVNTERvY3VtZW50UHJvdmlkZXJfVW5hYmxlVG9Mb2FkUmVzb3VyY2VFcnJvcj1VbmFibGUgdG8gbG9hZCBkaWFncmFtIHJlc291cmNlCi1VTUxEb2N1bWVudFByb3ZpZGVyX05vRGlhZ3JhbUluUmVzb3VyY2VFcnJvcj1EaWFncmFtIGlzIG5vdCBwcmVzZW50IGluIHJlc291cmNlCi1VTUxEb2N1bWVudFByb3ZpZGVyX0RpYWdyYW1Mb2FkaW5nRXJyb3I9RXJyb3IgbG9hZGluZyBkaWFncmFtCi1VTUxEb2N1bWVudFByb3ZpZGVyX1Vuc3luY2hyb25pemVkRmlsZVNhdmVFcnJvcj1UaGUgZmlsZSBoYXMgYmVlbiBjaGFuZ2VkIG9uIHRoZSBmaWxlIHN5c3RlbQotVU1MRG9jdW1lbnRQcm92aWRlcl9TYXZlRGlhZ3JhbVRhc2s9U2F2aW5nIGRpYWdyYW0KLVVNTERvY3VtZW50UHJvdmlkZXJfU2F2ZU5leHRSZXNvdXJjZVRhc2s9U2F2aW5nIHswfQotVU1MSW5pdERpYWdyYW1GaWxlQWN0aW9uX0luaXREaWFncmFtRmlsZVJlc291cmNlRXJyb3JEaWFsb2dUaXRsZT1FcnJvcgotVU1MSW5pdERpYWdyYW1GaWxlQWN0aW9uX0luaXREaWFncmFtRmlsZVJlc291cmNlRXJyb3JEaWFsb2dNZXNzYWdlPU1vZGVsIGZpbGUgbG9hZGluZyBmYWlsZWQKLVVNTEluaXREaWFncmFtRmlsZUFjdGlvbl9Jbml0RGlhZ3JhbUZpbGVXaXphcmRUaXRsZT1Jbml0aWFsaXplIG5ldyB7MH0gZGlhZ3JhbSBmaWxlCi1VTUxJbml0RGlhZ3JhbUZpbGVBY3Rpb25fT3Blbk1vZGVsRmlsZURpYWxvZ1RpdGxlPVNlbGVjdCBkb21haW4gbW9kZWwKLVVNTE5ld0RpYWdyYW1GaWxlV2l6YXJkX0NyZWF0aW9uUGFnZU5hbWU9SW5pdGlhbGl6ZSBuZXcgZGlhZ3JhbSBmaWxlCi1VTUxOZXdEaWFncmFtRmlsZVdpemFyZF9DcmVhdGlvblBhZ2VUaXRsZT1EaWFncmFtIGZpbGUKLVVNTE5ld0RpYWdyYW1GaWxlV2l6YXJkX0NyZWF0aW9uUGFnZURlc2NyaXB0aW9uPUNyZWF0ZSBuZXcgZGlhZ3JhbSBiYXNlZCBvbiB7MH0gbW9kZWwgY29udGVudAotVU1MTmV3RGlhZ3JhbUZpbGVXaXphcmRfUm9vdFNlbGVjdGlvblBhZ2VOYW1lPVNlbGVjdCBkaWFncmFtIHJvb3QgZWxlbWVudAotVU1MTmV3RGlhZ3JhbUZpbGVXaXphcmRfUm9vdFNlbGVjdGlvblBhZ2VUaXRsZT1EaWFncmFtIHJvb3QgZWxlbWVudAotVU1MTmV3RGlhZ3JhbUZpbGVXaXphcmRfUm9vdFNlbGVjdGlvblBhZ2VEZXNjcmlwdGlvbj1TZWxlY3Qgc2VtYW50aWMgbW9kZWwgZWxlbWVudCB0byBiZSBkZXBpY3RlZCBvbiBkaWFncmFtCi1VTUxOZXdEaWFncmFtRmlsZVdpemFyZF9Sb290U2VsZWN0aW9uUGFnZVNlbGVjdGlvblRpdGxlPVNlbGVjdCBkaWFncmFtIHJvb3QgZWxlbWVudDoKLVVNTE5ld0RpYWdyYW1GaWxlV2l6YXJkX1Jvb3RTZWxlY3Rpb25QYWdlTm9TZWxlY3Rpb25NZXNzYWdlPURpYWdyYW0gcm9vdCBlbGVtZW50IGlzIG5vdCBzZWxlY3RlZAotVU1MTmV3RGlhZ3JhbUZpbGVXaXphcmRfUm9vdFNlbGVjdGlvblBhZ2VJbnZhbGlkU2VsZWN0aW9uTWVzc2FnZT1JbnZhbGlkIGRpYWdyYW0gcm9vdCBlbGVtZW50IGlzIHNlbGVjdGVkCi1VTUxOZXdEaWFncmFtRmlsZVdpemFyZF9Jbml0RGlhZ3JhbUNvbW1hbmQ9SW5pdGlhbGl6aW5nIGRpYWdyYW0gY29udGVudHMKLVVNTE5ld0RpYWdyYW1GaWxlV2l6YXJkX0luY29ycmVjdFJvb3RFcnJvcj1JbmNvcnJlY3QgbW9kZWwgb2JqZWN0IHN0b3JlZCBhcyBhIHJvb3QgcmVzb3VyY2Ugb2JqZWN0Ci1GbG93czFHcm91cF90aXRsZT1GbG93cwotRmxvd3MxR3JvdXBfZGVzYz1DcmVhdGlvbiB0b29sIGZvciBmbG93cwotTm9kZXMyR3JvdXBfdGl0bGU9Tm9kZXMKLU5vZGVzMkdyb3VwX2Rlc2M9Q3JlYXRpb24gdG9vbCBncm91cCBmb3Igbm9kZXMKLUNvbnRyb2xGbG93MUNyZWF0aW9uVG9vbF90aXRsZT1Db250cm9sIEZsb3cKLUNvbnRyb2xGbG93MUNyZWF0aW9uVG9vbF9kZXNjPUNyZWF0ZSBuZXcgQ29udHJvbCBGbG93Ci1BY3Rpdml0eVBhcnRpdGlvbjFDcmVhdGlvblRvb2xfdGl0bGU9QWN0aXZpdHkgUGFydGl0aW9uCi1BY3Rpdml0eVBhcnRpdGlvbjFDcmVhdGlvblRvb2xfZGVzYz1DcmVhdGUgbmV3IEFjdGl2aXR5IFBhcnRpdGlvbgotU3RhcnROb2RlMkNyZWF0aW9uVG9vbF90aXRsZT1TdGFydCBOb2RlCi1TdGFydE5vZGUyQ3JlYXRpb25Ub29sX2Rlc2M9Q3JlYXRlIG5ldyBTdGFydCBOb2RlCi1Gb3JrTm9kZTNDcmVhdGlvblRvb2xfdGl0bGU9Rm9yayBOb2RlCi1Gb3JrTm9kZTNDcmVhdGlvblRvb2xfZGVzYz1DcmVhdGUgbmV3IEZvcmsgTm9kZQotTWVyZ2VOb2RlNENyZWF0aW9uVG9vbF90aXRsZT1NZXJnZSBOb2RlCi1NZXJnZU5vZGU0Q3JlYXRpb25Ub29sX2Rlc2M9Q3JlYXRlIG5ldyBNZXJnZSBOb2RlCi1EZWNpc2lvbk5vZGU1Q3JlYXRpb25Ub29sX3RpdGxlPURlY2lzaW9uIE5vZGUKLURlY2lzaW9uTm9kZTVDcmVhdGlvblRvb2xfZGVzYz1DcmVhdGUgbmV3IERlY2lzaW9uIE5vZGUKLUVuZE5vZGU2Q3JlYXRpb25Ub29sX3RpdGxlPUVuZCBOb2RlCi1FbmROb2RlNkNyZWF0aW9uVG9vbF9kZXNjPUNyZWF0ZSBuZXcgRW5kIE5vZGUKLUpvaW5Ob2RlN0NyZWF0aW9uVG9vbF90aXRsZT1Kb2luIE5vZGUKLUpvaW5Ob2RlN0NyZWF0aW9uVG9vbF9kZXNjPUNyZWF0ZSBuZXcgSm9pbiBOb2RlCi1BY3Rpdml0eTlDcmVhdGlvblRvb2xfdGl0bGU9QWN0aXZpdHkKLUFjdGl2aXR5OUNyZWF0aW9uVG9vbF9kZXNjPUNyZWF0ZSBuZXcgQWN0aXZpdHkKLVBoYXNlMTBDcmVhdGlvblRvb2xfdGl0bGU9UGhhc2UKLVBoYXNlMTBDcmVhdGlvblRvb2xfZGVzYz1DcmVhdGUgbmV3IFBoYXNlCi1JdGVyYXRpb24xMUNyZWF0aW9uVG9vbF90aXRsZT1JdGVyYXRpb24KLUl0ZXJhdGlvbjExQ3JlYXRpb25Ub29sX2Rlc2M9Q3JlYXRlIG5ldyBJdGVyYXRpb24KLVRhc2tEZXNjcmlwdG9yMTJDcmVhdGlvblRvb2xfdGl0bGU9VGFzayBEZXNjcmlwdG9yCi1UYXNrRGVzY3JpcHRvcjEyQ3JlYXRpb25Ub29sX2Rlc2M9Q3JlYXRlIG5ldyBUYXNrIERlc2NyaXB0b3IKLU1pbGVzdG9uZTEzQ3JlYXRpb25Ub29sX3RpdGxlPU1pbGVzdG9uZQotTWlsZXN0b25lMTNDcmVhdGlvblRvb2xfZGVzYz1DcmVhdGUgbmV3IE1pbGVzdG9uZQotQWN0aXZpdHlQYXJ0aXRpb25QYXJ0aXRpb25DYW1wYXJ0bWVudEVkaXRQYXJ0X3RpdGxlPVBhcnRpdGlvbkNhbXBhcnRtZW50Ci1BY3Rpdml0eVBhcnRpdGlvblBhcnRpdGlvbkNhbXBhcnRtZW50MkVkaXRQYXJ0X3RpdGxlPVBhcnRpdGlvbkNhbXBhcnRtZW50Ci1Db21tYW5kTmFtZV9PcGVuRGlhZ3JhbT1PcGVuIERpYWdyYW0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIEVORCBOTyBUUkFOU0xBVElPTgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9tb2RlbC9lcGZkaWFncmFtLmdtZmdlbiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL21vZGVsL2VwZmRpYWdyYW0uZ21mZ2VuCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYWU5NmQ4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL21vZGVsL2VwZmRpYWdyYW0uZ21mZ2VuCisrKyAvZGV2L251bGwKQEAgLTEsOTI1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Z21mZ2VuOkdlbkVkaXRvckdlbmVyYXRvciB4bWk6dmVyc2lvbj0iMi4wIgotICAgIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIKLSAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICAgIHhtbG5zOmdtZmdlbj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9nbWYvMjAwNi9HZW5Nb2RlbCIgcGFja2FnZU5hbWVQcmVmaXg9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkIgotICAgIG1vZGVsSUQ9IkFEIgotICAgIHNhbWVGaWxlRm9yRGlhZ3JhbUFuZE1vZGVsPSJ0cnVlIgotICAgIGRpYWdyYW1GaWxlRXh0ZW5zaW9uPSJ4bWkiCi0gICAgdGVtcGxhdGVEaXJlY3Rvcnk9IiIKLSAgICBjb3B5cmlnaHRUZXh0PSIgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiYjeEQ7JiN4QTsgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyYjeEQ7JiN4QTsgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wJiN4RDsmI3hBOyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCYjeEQ7JiN4QTsgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmI3hEOyYjeEE7JiN4RDsmI3hBOyBDb250cmlidXRvcnM6JiN4RDsmI3hBOyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uJiN4RDsmI3hBOyI+Ci0gIDxkaWFncmFtCi0gICAgICB2aXN1YWxJRD0iNzkiCi0gICAgICBlZGl0UGFydENsYXNzTmFtZT0iQWN0aXZpdHlFZGl0UGFydCIKLSAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IkFjdGl2aXR5SXRlbVNlbWFudGljRWRpdFBvbGljeSIKLSAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9IkFjdGl2aXR5Vmlld0ZhY3RvcnkiCi0gICAgICBjYW5vbmljYWxFZGl0UG9saWN5Q2xhc3NOYW1lPSJBY3Rpdml0eUNhbm9uaWNhbEVkaXRQb2xpY3kiCi0gICAgICBpY29uUHJvdmlkZXJQcmlvcml0eT0iTG93IgotICAgICAgY3JlYXRpb25XaXphcmRJY29uUGF0aD0iaWNvbnMvZGlhZ3JhbS9hY3Rpdml0eS5naWYiCi0gICAgICB2YWxpZGF0aW9uUHJvdmlkZXJDbGFzc05hbWU9IlZhbGlkYXRpb25Qcm92aWRlciIKLSAgICAgIG1ldHJpY1Byb3ZpZGVyQ2xhc3NOYW1lPSJNZXRyaWNQcm92aWRlciIKLSAgICAgIHZhbGlkYXRpb25EZWNvcmF0b3JQcm92aWRlckNsYXNzTmFtZT0iVmFsaWRhdGlvbkRlY29yYXRvclByb3ZpZGVyIj4KLSAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcwotICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9EaWFncmFtIi8+Ci0gICAgPGVsZW1lbnRUeXBlCi0gICAgICAgIHhzaTp0eXBlPSJnbWZnZW46TWV0YW1vZGVsVHlwZSIKLSAgICAgICAgZWRpdEhlbHBlckNsYXNzTmFtZT0iQWN0aXZpdHlFZGl0SGVscGVyIi8+Ci0gICAgPHZpZXdtYXAKLSAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpGaWd1cmVWaWV3bWFwIgotICAgICAgICBmaWd1cmVRdWFsaWZpZWRDbGFzc05hbWU9Im9yZy5lY2xpcHNlLmRyYXcyZC5GcmVlZm9ybUxheWVyIi8+Ci0gICAgPGRvbWFpbkRpYWdyYW1FbGVtZW50Ci0gICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5nZW5tb2RlbCMvL3VtbC9BY3Rpdml0eSIvPgotICAgIDxjaGlsZE5vZGVzCi0gICAgICAgIHZpc3VhbElEPSIyMDAxIgotICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iQWN0aXZpdHlQYXJ0aXRpb24yRWRpdFBhcnQiCi0gICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IkFjdGl2aXR5UGFydGl0aW9uMkl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiCi0gICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9IkFjdGl2aXR5UGFydGl0aW9uMlZpZXdGYWN0b3J5IgotICAgICAgICBjYW5vbmljYWxFZGl0UG9saWN5Q2xhc3NOYW1lPSJBY3Rpdml0eVBhcnRpdGlvbjJDYW5vbmljYWxFZGl0UG9saWN5IgotICAgICAgICBjb21wYXJ0bWVudHM9Ii8vQGRpYWdyYW0vQGNvbXBhcnRtZW50cy4xIgotICAgICAgICBncmFwaGljYWxOb2RlRWRpdFBvbGljeUNsYXNzTmFtZT0iQWN0aXZpdHlQYXJ0aXRpb24yR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kiCi0gICAgICAgIGNvbnRhaW5lcnM9Ii8vQGRpYWdyYW0vQGNvbXBhcnRtZW50cy4xIC8vQGRpYWdyYW0vQGNvbXBhcnRtZW50cy4wIj4KLSAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzCi0gICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vTm9kZSIvPgotICAgICAgPGVsZW1lbnRUeXBlCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpTcGVjaWFsaXphdGlvblR5cGUiCi0gICAgICAgICAgbWV0YW1vZGVsVHlwZT0iLy9AZGlhZ3JhbS9AdG9wTGV2ZWxOb2Rlcy43L0BlbGVtZW50VHlwZSIKLSAgICAgICAgICBlZGl0SGVscGVyQWR2aWNlQ2xhc3NOYW1lPSJBY3Rpdml0eVBhcnRpdGlvbkVkaXRIZWxwZXJBZHZpY2UiLz4KLSAgICAgIDx2aWV3bWFwCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpJbm5lckNsYXNzVmlld21hcCIKLSAgICAgICAgICBsYXlvdXRUeXBlPSJYWV9MQVlPVVQiCi0gICAgICAgICAgY2xhc3NOYW1lPSJBY3Rpdml0eVBhcnRpdGlvbkZpZ3VyZSIKLSAgICAgICAgICBjbGFzc0JvZHk9IiYjeEQ7JiN4QTsmI3hEOyYjeEE7LyoqJiN4RDsmI3hBOyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7ICovJiN4RDsmI3hBO3B1YmxpYyBjbGFzcyBBY3Rpdml0eVBhcnRpdGlvbkZpZ3VyZSBleHRlbmRzIG9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmUgeyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHVibGljIEFjdGl2aXR5UGFydGl0aW9uRmlndXJlKCkgeyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3g5O29yZy5lY2xpcHNlLmRyYXcyZC5YWUxheW91dCBteUdlbkxheW91dE1hbmFnZXIgPSBuZXcgb3JnLmVjbGlwc2UuZHJhdzJkLlhZTGF5b3V0KCk7JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeDk7dGhpcy5zZXRMYXlvdXRNYW5hZ2VyKG15R2VuTGF5b3V0TWFuYWdlcik7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4OTsmI3g5O3RoaXMuc2V0Rm9yZWdyb3VuZENvbG9yKG9yZy5lY2xpcHNlLmRyYXcyZC5Db2xvckNvbnN0YW50cy5ibGFjayYjeEQ7JiN4QTsmI3hEOyYjeEE7KTsmI3hEOyYjeEE7JiN4OTsmI3g5O3RoaXMuc2V0QmFja2dyb3VuZENvbG9yKEFDVElWSVRZUEFSVElUSU9ORklHVVJFX0JBQ0smI3hEOyYjeEE7JiN4RDsmI3hBOyk7JiN4RDsmI3hBOyYjeDk7JiN4OTt0aGlzLnNldFByZWZlcnJlZFNpemUoZ2V0TWFwTW9kZSgpLkRQdG9MUCgzMDApLCBnZXRNYXBNb2RlKCkuRFB0b0xQKDYwMCkpOyYjeEQ7JiN4QTsmI3g5OyYjeDk7dGhpcy5zZXRTaXplKGdldE1hcE1vZGUoKS5EUHRvTFAoMzAwKSwgZ2V0TWFwTW9kZSgpLkRQdG9MUCg2MDApKTsmI3hEOyYjeEE7JiN4OTsmI3g5O3RoaXMuc2V0Qm9yZGVyKCYjeEQ7JiN4QTtuZXcgb3JnLmVjbGlwc2UuZHJhdzJkLkxpbmVCb3JkZXIoKSYjeEQ7JiN4QTspOyYjeEQ7JiN4QTsmI3g5OyYjeDk7Y3JlYXRlQ29udGVudHMoKTsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbnRlbnRzKCl7JiN4RDsmI3hBOyYjeDk7JiN4OTtvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZmlnXzAgPSBuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsKCk7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5OyYjeDk7c2V0RmlndXJlUGFydGl0aW9uTGFiZWxGaWd1cmUoZmlnXzApOyYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4OTtPYmplY3QgbGF5RGF0YTAgPSBudWxsOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsmI3g5O3RoaXMuYWRkKGZpZ18wLCBsYXlEYXRhMCk7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3ByaXZhdGUgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIGZQYXJ0aXRpb25MYWJlbEZpZ3VyZTsgJiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwdWJsaWMgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIGdldEZpZ3VyZVBhcnRpdGlvbkxhYmVsRmlndXJlKCkgeyYjeEQ7JiN4QTsmI3g5OyYjeDk7cmV0dXJuIGZQYXJ0aXRpb25MYWJlbEZpZ3VyZTsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3ByaXZhdGUgdm9pZCBzZXRGaWd1cmVQYXJ0aXRpb25MYWJlbEZpZ3VyZShvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZmlnKXsmI3hEOyYjeEE7JiN4OTsmI3g5O2ZQYXJ0aXRpb25MYWJlbEZpZ3VyZSA9IGZpZzsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIGJvb2xlYW4gbXlVc2VMb2NhbENvb3JkaW5hdGVzID0gZmFsc2U7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcm90ZWN0ZWQgYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKCkgeyYjeEQ7JiN4QTsmI3g5OyYjeDk7cmV0dXJuIG15VXNlTG9jYWxDb29yZGluYXRlczsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcm90ZWN0ZWQgdm9pZCBzZXRVc2VMb2NhbENvb3JkaW5hdGVzKGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcykgeyYjeEQ7JiN4QTsmI3g5OyYjeDk7bXlVc2VMb2NhbENvb3JkaW5hdGVzID0gdXNlTG9jYWxDb29yZGluYXRlczsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeEQ7JiN4QTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3B1YmxpYyBzdGF0aWMgZmluYWwgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yIEFDVElWSVRZUEFSVElUSU9ORklHVVJFX0JBQ0sgPSBuZXcgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yKG51bGwsIDI1NSwgMjU1LCAyNTUpOyYjeEQ7JiN4QTsiPgotICAgICAgICA8YXR0cmlidXRlcwotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpTdHlsZUF0dHJpYnV0ZXMiCi0gICAgICAgICAgICBmaXhlZEZvcmVncm91bmQ9InRydWUiCi0gICAgICAgICAgICBmaXhlZEJhY2tncm91bmQ9InRydWUiLz4KLSAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmRyYXcyZDwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWk8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgPC92aWV3bWFwPgotICAgICAgPG1vZGVsRmFjZXQ+Ci0gICAgICAgIDxtZXRhQ2xhc3MKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5nZW5tb2RlbCMvL3VtbC9BY3Rpdml0eVBhcnRpdGlvbiIvPgotICAgICAgICA8Y29udGFpbm1lbnRNZXRhRmVhdHVyZQotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmdlbm1vZGVsIy8vdW1sL0FjdGl2aXR5UGFydGl0aW9uL3N1YnBhcnRpdGlvbiIvPgotICAgICAgICA8Y2hpbGRNZXRhRmVhdHVyZQotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmdlbm1vZGVsIy8vdW1sL0FjdGl2aXR5UGFydGl0aW9uL3N1YnBhcnRpdGlvbiIvPgotICAgICAgPC9tb2RlbEZhY2V0PgotICAgICAgPGxhYmVscwotICAgICAgICAgIHZpc3VhbElEPSI0MDA2IgotICAgICAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJBY3Rpdml0eVBhcnRpdGlvbk5hbWVFZGl0UGFydCIKLSAgICAgICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJBY3Rpdml0eVBhcnRpdGlvbk5hbWVJdGVtU2VtYW50aWNFZGl0UG9saWN5IgotICAgICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9IkFjdGl2aXR5UGFydGl0aW9uTmFtZVZpZXdGYWN0b3J5IgotICAgICAgICAgIGVsZW1lbnRJY29uPSJ0cnVlIj4KLSAgICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL05vZGUiLz4KLSAgICAgICAgPHZpZXdtYXAKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46UGFyZW50QXNzaWduZWRWaWV3bWFwIgotICAgICAgICAgICAgZ2V0dGVyTmFtZT0iZ2V0RmlndXJlUGFydGl0aW9uTGFiZWxGaWd1cmUiCi0gICAgICAgICAgICBmaWd1cmVRdWFsaWZpZWRDbGFzc05hbWU9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCIvPgotICAgICAgICA8bW9kZWxGYWNldAotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpGZWF0dXJlTGFiZWxNb2RlbEZhY2V0IgotICAgICAgICAgICAgdmlld1BhdHRlcm49IiIKLSAgICAgICAgICAgIGVkaXRQYXR0ZXJuPSIiPgotICAgICAgICAgIDxtZXRhRmVhdHVyZXMKLSAgICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmdlbm1vZGVsIy8vdW1sL05hbWVkRWxlbWVudC9uYW1lIi8+Ci0gICAgICAgIDwvbW9kZWxGYWNldD4KLSAgICAgIDwvbGFiZWxzPgotICAgIDwvY2hpbGROb2Rlcz4KLSAgICA8dG9wTGV2ZWxOb2RlcwotICAgICAgICB2aXN1YWxJRD0iMTAwMSIKLSAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9IkFjdGl2aXR5RmluYWxOb2RlRWRpdFBhcnQiCi0gICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IkFjdGl2aXR5RmluYWxOb2RlSXRlbVNlbWFudGljRWRpdFBvbGljeSIKLSAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iQWN0aXZpdHlGaW5hbE5vZGVWaWV3RmFjdG9yeSIKLSAgICAgICAgY2Fub25pY2FsRWRpdFBvbGljeUNsYXNzTmFtZT0iQWN0aXZpdHlGaW5hbE5vZGVDYW5vbmljYWxFZGl0UG9saWN5IgotICAgICAgICBncmFwaGljYWxOb2RlRWRpdFBvbGljeUNsYXNzTmFtZT0iQWN0aXZpdHlGaW5hbE5vZGVHcmFwaGljYWxOb2RlRWRpdFBvbGljeSI+Ci0gICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcwotICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL05vZGUiLz4KLSAgICAgIDxlbGVtZW50VHlwZQotICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46TWV0YW1vZGVsVHlwZSIKLSAgICAgICAgICBlZGl0SGVscGVyQ2xhc3NOYW1lPSJBY3Rpdml0eUZpbmFsTm9kZUVkaXRIZWxwZXIiLz4KLSAgICAgIDx2aWV3bWFwCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpJbm5lckNsYXNzVmlld21hcCIKLSAgICAgICAgICBjbGFzc05hbWU9IkVuZE5vZGVGaWd1cmUiCi0gICAgICAgICAgY2xhc3NCb2R5PSImI3hEOyYjeEE7JiN4RDsmI3hBOy8qKiYjeEQ7JiN4QTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyAqLyYjeEQ7JiN4QTtwdWJsaWMgY2xhc3MgRW5kTm9kZUZpZ3VyZSBleHRlbmRzIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmN1c3RvbS5maWd1cmVzLkVuZE5vZGVGaWd1cmUgeyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHVibGljIEVuZE5vZGVGaWd1cmUoKSB7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7JiN4OTt0aGlzLnNldEZvcmVncm91bmRDb2xvcihvcmcuZWNsaXBzZS5kcmF3MmQuQ29sb3JDb25zdGFudHMuZGFya0JsdWUmI3hEOyYjeEE7JiN4RDsmI3hBOyk7JiN4RDsmI3hBOyYjeDk7JiN4OTt0aGlzLnNldEJhY2tncm91bmRDb2xvcihFTkROT0RFRklHVVJFX0JBQ0smI3hEOyYjeEE7JiN4RDsmI3hBOyk7JiN4RDsmI3hBOyYjeDk7JiN4OTt0aGlzLnNldFByZWZlcnJlZFNpemUoZ2V0TWFwTW9kZSgpLkRQdG9MUCgyNCksIGdldE1hcE1vZGUoKS5EUHRvTFAoMjQpKTsmI3hEOyYjeEE7JiN4OTsmI3g5O3RoaXMuc2V0U2l6ZShnZXRNYXBNb2RlKCkuRFB0b0xQKDI0KSwgZ2V0TWFwTW9kZSgpLkRQdG9MUCgyNCkpOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsmI3g5O2NyZWF0ZUNvbnRlbnRzKCk7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3ByaXZhdGUgdm9pZCBjcmVhdGVDb250ZW50cygpeyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJpdmF0ZSBib29sZWFuIG15VXNlTG9jYWxDb29yZGluYXRlcyA9IGZhbHNlOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJvdGVjdGVkIGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcygpIHsmI3hEOyYjeEE7JiN4OTsmI3g5O3JldHVybiBteVVzZUxvY2FsQ29vcmRpbmF0ZXM7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJvdGVjdGVkIHZvaWQgc2V0VXNlTG9jYWxDb29yZGluYXRlcyhib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMpIHsmI3hEOyYjeEE7JiN4OTsmI3g5O215VXNlTG9jYWxDb29yZGluYXRlcyA9IHVzZUxvY2FsQ29vcmRpbmF0ZXM7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3hEOyYjeEE7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwdWJsaWMgc3RhdGljIGZpbmFsIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvciBFTkROT0RFRklHVVJFX0JBQ0sgPSBuZXcgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yKG51bGwsIDQ1LCA4NSwgMTMwKTsmI3hEOyYjeEE7Ij4KLSAgICAgICAgPGF0dHJpYnV0ZXMKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46U3R5bGVBdHRyaWJ1dGVzIgotICAgICAgICAgICAgZml4ZWRGb3JlZ3JvdW5kPSJ0cnVlIgotICAgICAgICAgICAgZml4ZWRCYWNrZ3JvdW5kPSJ0cnVlIi8+Ci0gICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5kcmF3MmQ8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgIDwvdmlld21hcD4KLSAgICAgIDxtb2RlbEZhY2V0PgotICAgICAgICA8bWV0YUNsYXNzCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZ2VubW9kZWwjLy91bWwvQWN0aXZpdHlGaW5hbE5vZGUiLz4KLSAgICAgICAgPGNvbnRhaW5tZW50TWV0YUZlYXR1cmUKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5nZW5tb2RlbCMvL3VtbC9BY3Rpdml0eS9ub2RlIi8+Ci0gICAgICAgIDxjaGlsZE1ldGFGZWF0dXJlCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZ2VubW9kZWwjLy91bWwvQWN0aXZpdHkvbm9kZSIvPgotICAgICAgPC9tb2RlbEZhY2V0PgotICAgICAgPGxhYmVscwotICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46R2VuRXh0ZXJuYWxOb2RlTGFiZWwiCi0gICAgICAgICAgdmlzdWFsSUQ9IjQwMDEiCi0gICAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9IkFjdGl2aXR5RmluYWxOb2RlTmFtZUVkaXRQYXJ0IgotICAgICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IkFjdGl2aXR5RmluYWxOb2RlTmFtZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiCi0gICAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iQWN0aXZpdHlGaW5hbE5vZGVOYW1lVmlld0ZhY3RvcnkiPgotICAgICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcwotICAgICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vTm9kZSIvPgotICAgICAgICA8dmlld21hcAotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpGaWd1cmVWaWV3bWFwIgotICAgICAgICAgICAgZmlndXJlUXVhbGlmaWVkQ2xhc3NOYW1lPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwiPgotICAgICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5kcmF3MmQ8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWk8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgICA8L3ZpZXdtYXA+Ci0gICAgICAgIDxtb2RlbEZhY2V0Ci0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOkZlYXR1cmVMYWJlbE1vZGVsRmFjZXQiCi0gICAgICAgICAgICB2aWV3UGF0dGVybj0iIgotICAgICAgICAgICAgZWRpdFBhdHRlcm49IiI+Ci0gICAgICAgICAgPG1ldGFGZWF0dXJlcwotICAgICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZ2VubW9kZWwjLy91bWwvTmFtZWRFbGVtZW50L25hbWUiLz4KLSAgICAgICAgPC9tb2RlbEZhY2V0PgotICAgICAgPC9sYWJlbHM+Ci0gICAgPC90b3BMZXZlbE5vZGVzPgotICAgIDx0b3BMZXZlbE5vZGVzCi0gICAgICAgIHZpc3VhbElEPSIxMDAyIgotICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iTWVyZ2VOb2RlRWRpdFBhcnQiCi0gICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9Ik1lcmdlTm9kZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiCi0gICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9Ik1lcmdlTm9kZVZpZXdGYWN0b3J5IgotICAgICAgICBjYW5vbmljYWxFZGl0UG9saWN5Q2xhc3NOYW1lPSJNZXJnZU5vZGVDYW5vbmljYWxFZGl0UG9saWN5IgotICAgICAgICBncmFwaGljYWxOb2RlRWRpdFBvbGljeUNsYXNzTmFtZT0iTWVyZ2VOb2RlR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kiPgotICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MKLSAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+Ci0gICAgICA8ZWxlbWVudFR5cGUKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOk1ldGFtb2RlbFR5cGUiCi0gICAgICAgICAgZWRpdEhlbHBlckNsYXNzTmFtZT0iTWVyZ2VOb2RlRWRpdEhlbHBlciIvPgotICAgICAgPHZpZXdtYXAKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOklubmVyQ2xhc3NWaWV3bWFwIgotICAgICAgICAgIGNsYXNzTmFtZT0iRGVjaXNpb25EaWFtb25kRmlndXJlIgotICAgICAgICAgIGNsYXNzQm9keT0iJiN4RDsmI3hBOyYjeEQ7JiN4QTsvKiomI3hEOyYjeEE7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsgKi8mI3hEOyYjeEE7cHVibGljIGNsYXNzIERlY2lzaW9uRGlhbW9uZEZpZ3VyZSBleHRlbmRzIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmN1c3RvbS5maWd1cmVzLkRlY2lzaW9uTm9kZUZpZ3VyZSB7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwdWJsaWMgRGVjaXNpb25EaWFtb25kRmlndXJlKCkgeyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5OyYjeDk7dGhpcy5zZXRGb3JlZ3JvdW5kQ29sb3Iob3JnLmVjbGlwc2UuZHJhdzJkLkNvbG9yQ29uc3RhbnRzLmRhcmtCbHVlJiN4RDsmI3hBOyYjeEQ7JiN4QTspOyYjeEQ7JiN4QTsmI3g5OyYjeDk7dGhpcy5zZXRCYWNrZ3JvdW5kQ29sb3IoREVDSVNJT05ESUFNT05ERklHVVJFX0JBQ0smI3hEOyYjeEE7JiN4RDsmI3hBOyk7JiN4RDsmI3hBOyYjeDk7JiN4OTt0aGlzLnNldFByZWZlcnJlZFNpemUoZ2V0TWFwTW9kZSgpLkRQdG9MUCg1MCksIGdldE1hcE1vZGUoKS5EUHRvTFAoNTApKTsmI3hEOyYjeEE7JiN4OTsmI3g5O3RoaXMuc2V0U2l6ZShnZXRNYXBNb2RlKCkuRFB0b0xQKDUwKSwgZ2V0TWFwTW9kZSgpLkRQdG9MUCg1MCkpOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsmI3g5O2NyZWF0ZUNvbnRlbnRzKCk7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3ByaXZhdGUgdm9pZCBjcmVhdGVDb250ZW50cygpeyYjeEQ7JiN4QTsmI3g5OyYjeDk7b3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIGZpZ18wID0gbmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCgpOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsmI3g5O3NldEZpZ3VyZURpYW1vbmRMYWJlbChmaWdfMCk7JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3g5O09iamVjdCBsYXlEYXRhMCA9IG51bGw7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5OyYjeDk7dGhpcy5hZGQoZmlnXzAsIGxheURhdGEwKTsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJpdmF0ZSBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZkRpYW1vbmRMYWJlbDsgJiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwdWJsaWMgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIGdldEZpZ3VyZURpYW1vbmRMYWJlbCgpIHsmI3hEOyYjeEE7JiN4OTsmI3g5O3JldHVybiBmRGlhbW9uZExhYmVsOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJpdmF0ZSB2b2lkIHNldEZpZ3VyZURpYW1vbmRMYWJlbChvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZmlnKXsmI3hEOyYjeEE7JiN4OTsmI3g5O2ZEaWFtb25kTGFiZWwgPSBmaWc7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJpdmF0ZSBib29sZWFuIG15VXNlTG9jYWxDb29yZGluYXRlcyA9IGZhbHNlOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJvdGVjdGVkIGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcygpIHsmI3hEOyYjeEE7JiN4OTsmI3g5O3JldHVybiBteVVzZUxvY2FsQ29vcmRpbmF0ZXM7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJvdGVjdGVkIHZvaWQgc2V0VXNlTG9jYWxDb29yZGluYXRlcyhib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMpIHsmI3hEOyYjeEE7JiN4OTsmI3g5O215VXNlTG9jYWxDb29yZGluYXRlcyA9IHVzZUxvY2FsQ29vcmRpbmF0ZXM7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3hEOyYjeEE7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwdWJsaWMgc3RhdGljIGZpbmFsIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvciBERUNJU0lPTkRJQU1PTkRGSUdVUkVfQkFDSyA9IG5ldyBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3IobnVsbCwgMTg1LCAyMDUsIDIzMCk7JiN4RDsmI3hBOyI+Ci0gICAgICAgIDxhdHRyaWJ1dGVzCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlN0eWxlQXR0cmlidXRlcyIKLSAgICAgICAgICAgIGZpeGVkRm9yZWdyb3VuZD0idHJ1ZSIKLSAgICAgICAgICAgIGZpeGVkQmFja2dyb3VuZD0idHJ1ZSIvPgotICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZHJhdzJkPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aTwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICA8L3ZpZXdtYXA+Ci0gICAgICA8bW9kZWxGYWNldD4KLSAgICAgICAgPG1ldGFDbGFzcwotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmdlbm1vZGVsIy8vdW1sL01lcmdlTm9kZSIvPgotICAgICAgICA8Y29udGFpbm1lbnRNZXRhRmVhdHVyZQotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmdlbm1vZGVsIy8vdW1sL0FjdGl2aXR5L25vZGUiLz4KLSAgICAgICAgPGNoaWxkTWV0YUZlYXR1cmUKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5nZW5tb2RlbCMvL3VtbC9BY3Rpdml0eS9ub2RlIi8+Ci0gICAgICA8L21vZGVsRmFjZXQ+Ci0gICAgICA8bGFiZWxzCi0gICAgICAgICAgdmlzdWFsSUQ9IjQwMDIiCi0gICAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9Ik1lcmdlTm9kZU5hbWVFZGl0UGFydCIKLSAgICAgICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJNZXJnZU5vZGVOYW1lSXRlbVNlbWFudGljRWRpdFBvbGljeSIKLSAgICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJNZXJnZU5vZGVOYW1lVmlld0ZhY3RvcnkiPgotICAgICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcwotICAgICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vTm9kZSIvPgotICAgICAgICA8dmlld21hcAotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpJbm5lckNsYXNzVmlld21hcCIKLSAgICAgICAgICAgIGNsYXNzTmFtZT0iTm9kZU5hbWVGaWd1cmUiCi0gICAgICAgICAgICBjbGFzc0JvZHk9IiYjeEQ7JiN4QTsmI3hEOyYjeEE7LyoqJiN4RDsmI3hBOyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7ICovJiN4RDsmI3hBO3B1YmxpYyBjbGFzcyBOb2RlTmFtZUZpZ3VyZSBleHRlbmRzIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCB7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwdWJsaWMgTm9kZU5hbWVGaWd1cmUoKSB7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsmI3g5O3RoaXMuc2V0VGV4dCgmcXVvdDsmcXVvdDspOyYjeEQ7JiN4QTsmI3g5OyYjeDk7Y3JlYXRlQ29udGVudHMoKTsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbnRlbnRzKCl7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIGJvb2xlYW4gbXlVc2VMb2NhbENvb3JkaW5hdGVzID0gZmFsc2U7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcm90ZWN0ZWQgYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKCkgeyYjeEQ7JiN4QTsmI3g5OyYjeDk7cmV0dXJuIG15VXNlTG9jYWxDb29yZGluYXRlczsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcm90ZWN0ZWQgdm9pZCBzZXRVc2VMb2NhbENvb3JkaW5hdGVzKGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcykgeyYjeEQ7JiN4QTsmI3g5OyYjeDk7bXlVc2VMb2NhbENvb3JkaW5hdGVzID0gdXNlTG9jYWxDb29yZGluYXRlczsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeEQ7JiN4QTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyI+Ci0gICAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmRyYXcyZDwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aTwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICAgIDwvdmlld21hcD4KLSAgICAgICAgPG1vZGVsRmFjZXQKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46RmVhdHVyZUxhYmVsTW9kZWxGYWNldCIKLSAgICAgICAgICAgIHZpZXdQYXR0ZXJuPSIiPgotICAgICAgICAgIDxtZXRhRmVhdHVyZXMKLSAgICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmdlbm1vZGVsIy8vdW1sL05hbWVkRWxlbWVudC9uYW1lIi8+Ci0gICAgICAgIDwvbW9kZWxGYWNldD4KLSAgICAgIDwvbGFiZWxzPgotICAgIDwvdG9wTGV2ZWxOb2Rlcz4KLSAgICA8dG9wTGV2ZWxOb2RlcwotICAgICAgICB2aXN1YWxJRD0iMTAwMyIKLSAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9IkZvcmtOb2RlRWRpdFBhcnQiCi0gICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IkZvcmtOb2RlSXRlbVNlbWFudGljRWRpdFBvbGljeSIKLSAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iRm9ya05vZGVWaWV3RmFjdG9yeSIKLSAgICAgICAgY2Fub25pY2FsRWRpdFBvbGljeUNsYXNzTmFtZT0iRm9ya05vZGVDYW5vbmljYWxFZGl0UG9saWN5IgotICAgICAgICBncmFwaGljYWxOb2RlRWRpdFBvbGljeUNsYXNzTmFtZT0iRm9ya05vZGVHcmFwaGljYWxOb2RlRWRpdFBvbGljeSI+Ci0gICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcwotICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL05vZGUiLz4KLSAgICAgIDxlbGVtZW50VHlwZQotICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46TWV0YW1vZGVsVHlwZSIKLSAgICAgICAgICBlZGl0SGVscGVyQ2xhc3NOYW1lPSJGb3JrTm9kZUVkaXRIZWxwZXIiLz4KLSAgICAgIDx2aWV3bWFwCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpJbm5lckNsYXNzVmlld21hcCIKLSAgICAgICAgICBjbGFzc05hbWU9IkZvcmtOb2RlRmlndXJlIgotICAgICAgICAgIGNsYXNzQm9keT0iJiN4RDsmI3hBOyYjeEQ7JiN4QTsvKiomI3hEOyYjeEE7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsgKi8mI3hEOyYjeEE7cHVibGljIGNsYXNzIEZvcmtOb2RlRmlndXJlIGV4dGVuZHMgb3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZSB7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwdWJsaWMgRm9ya05vZGVGaWd1cmUoKSB7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeDk7dGhpcy5zZXRCYWNrZ3JvdW5kQ29sb3IoRk9SS05PREVGSUdVUkVfQkFDSyYjeEQ7JiN4QTsmI3hEOyYjeEE7KTsmI3hEOyYjeEE7JiN4OTsmI3g5O3RoaXMuc2V0UHJlZmVycmVkU2l6ZShnZXRNYXBNb2RlKCkuRFB0b0xQKDEwMCksIGdldE1hcE1vZGUoKS5EUHRvTFAoNSkpOyYjeEQ7JiN4QTsmI3g5OyYjeDk7dGhpcy5zZXRTaXplKGdldE1hcE1vZGUoKS5EUHRvTFAoMTAwKSwgZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSk7JiN4RDsmI3hBOyYjeDk7JiN4OTtjcmVhdGVDb250ZW50cygpOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIHZvaWQgY3JlYXRlQ29udGVudHMoKXsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3ByaXZhdGUgYm9vbGVhbiBteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSBmYWxzZTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3Byb3RlY3RlZCBib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMoKSB7JiN4RDsmI3hBOyYjeDk7JiN4OTtyZXR1cm4gbXlVc2VMb2NhbENvb3JkaW5hdGVzOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3Byb3RlY3RlZCB2b2lkIHNldFVzZUxvY2FsQ29vcmRpbmF0ZXMoYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKSB7JiN4RDsmI3hBOyYjeDk7JiN4OTtteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSB1c2VMb2NhbENvb3JkaW5hdGVzOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4RDsmI3hBO30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHVibGljIHN0YXRpYyBmaW5hbCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3IgRk9SS05PREVGSUdVUkVfQkFDSyA9IG5ldyBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3IobnVsbCwgNDUsIDg1LCAxMzApOyYjeEQ7JiN4QTsiPgotICAgICAgICA8YXR0cmlidXRlcwotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpTdHlsZUF0dHJpYnV0ZXMiCi0gICAgICAgICAgICBmaXhlZEJhY2tncm91bmQ9InRydWUiLz4KLSAgICAgICAgPGF0dHJpYnV0ZXMKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46UmVzaXplQ29uc3RyYWludHMiCi0gICAgICAgICAgICByZXNpemVIYW5kbGVzPSIyNCIvPgotICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZHJhdzJkPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aTwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICA8L3ZpZXdtYXA+Ci0gICAgICA8bW9kZWxGYWNldD4KLSAgICAgICAgPG1ldGFDbGFzcwotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmdlbm1vZGVsIy8vdW1sL0ZvcmtOb2RlIi8+Ci0gICAgICAgIDxjb250YWlubWVudE1ldGFGZWF0dXJlCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZ2VubW9kZWwjLy91bWwvQWN0aXZpdHkvbm9kZSIvPgotICAgICAgICA8Y2hpbGRNZXRhRmVhdHVyZQotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmdlbm1vZGVsIy8vdW1sL0FjdGl2aXR5L25vZGUiLz4KLSAgICAgIDwvbW9kZWxGYWNldD4KLSAgICA8L3RvcExldmVsTm9kZXM+Ci0gICAgPHRvcExldmVsTm9kZXMKLSAgICAgICAgdmlzdWFsSUQ9IjEwMDQiCi0gICAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJJbml0aWFsTm9kZUVkaXRQYXJ0IgotICAgICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJJbml0aWFsTm9kZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiCi0gICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9IkluaXRpYWxOb2RlVmlld0ZhY3RvcnkiCi0gICAgICAgIGNhbm9uaWNhbEVkaXRQb2xpY3lDbGFzc05hbWU9IkluaXRpYWxOb2RlQ2Fub25pY2FsRWRpdFBvbGljeSIKLSAgICAgICAgZ3JhcGhpY2FsTm9kZUVkaXRQb2xpY3lDbGFzc05hbWU9IkluaXRpYWxOb2RlR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kiPgotICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MKLSAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+Ci0gICAgICA8ZWxlbWVudFR5cGUKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOk1ldGFtb2RlbFR5cGUiCi0gICAgICAgICAgZWRpdEhlbHBlckNsYXNzTmFtZT0iSW5pdGlhbE5vZGVFZGl0SGVscGVyIi8+Ci0gICAgICA8dmlld21hcAotICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46SW5uZXJDbGFzc1ZpZXdtYXAiCi0gICAgICAgICAgY2xhc3NOYW1lPSJJbml0aWFsTm9kZUZpZ3VyZSIKLSAgICAgICAgICBjbGFzc0JvZHk9IiYjeEQ7JiN4QTsmI3hEOyYjeEE7LyoqJiN4RDsmI3hBOyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7ICovJiN4RDsmI3hBO3B1YmxpYyBjbGFzcyBJbml0aWFsTm9kZUZpZ3VyZSBleHRlbmRzIG9yZy5lY2xpcHNlLmRyYXcyZC5FbGxpcHNlIHsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3B1YmxpYyBJbml0aWFsTm9kZUZpZ3VyZSgpIHsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4OTsmI3g5O3RoaXMuc2V0Rm9yZWdyb3VuZENvbG9yKG9yZy5lY2xpcHNlLmRyYXcyZC5Db2xvckNvbnN0YW50cy5kYXJrQmx1ZSYjeEQ7JiN4QTsmI3hEOyYjeEE7KTsmI3hEOyYjeEE7JiN4OTsmI3g5O3RoaXMuc2V0QmFja2dyb3VuZENvbG9yKElOSVRJQUxOT0RFRklHVVJFX0JBQ0smI3hEOyYjeEE7JiN4RDsmI3hBOyk7JiN4RDsmI3hBOyYjeDk7JiN4OTt0aGlzLnNldFByZWZlcnJlZFNpemUoZ2V0TWFwTW9kZSgpLkRQdG9MUCgyMCksIGdldE1hcE1vZGUoKS5EUHRvTFAoMjApKTsmI3hEOyYjeEE7JiN4OTsmI3g5O3RoaXMuc2V0U2l6ZShnZXRNYXBNb2RlKCkuRFB0b0xQKDIwKSwgZ2V0TWFwTW9kZSgpLkRQdG9MUCgyMCkpOyYjeEQ7JiN4QTsmI3g5OyYjeDk7Y3JlYXRlQ29udGVudHMoKTsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbnRlbnRzKCl7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIGJvb2xlYW4gbXlVc2VMb2NhbENvb3JkaW5hdGVzID0gZmFsc2U7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcm90ZWN0ZWQgYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKCkgeyYjeEQ7JiN4QTsmI3g5OyYjeDk7cmV0dXJuIG15VXNlTG9jYWxDb29yZGluYXRlczsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcm90ZWN0ZWQgdm9pZCBzZXRVc2VMb2NhbENvb3JkaW5hdGVzKGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcykgeyYjeEQ7JiN4QTsmI3g5OyYjeDk7bXlVc2VMb2NhbENvb3JkaW5hdGVzID0gdXNlTG9jYWxDb29yZGluYXRlczsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeEQ7JiN4QTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3B1YmxpYyBzdGF0aWMgZmluYWwgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yIElOSVRJQUxOT0RFRklHVVJFX0JBQ0sgPSBuZXcgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yKG51bGwsIDQ1LCA4NSwgMTMwKTsmI3hEOyYjeEE7Ij4KLSAgICAgICAgPGF0dHJpYnV0ZXMKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46U3R5bGVBdHRyaWJ1dGVzIgotICAgICAgICAgICAgZml4ZWRGb3JlZ3JvdW5kPSJ0cnVlIgotICAgICAgICAgICAgZml4ZWRCYWNrZ3JvdW5kPSJ0cnVlIi8+Ci0gICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5kcmF3MmQ8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgIDwvdmlld21hcD4KLSAgICAgIDxtb2RlbEZhY2V0PgotICAgICAgICA8bWV0YUNsYXNzCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZ2VubW9kZWwjLy91bWwvSW5pdGlhbE5vZGUiLz4KLSAgICAgICAgPGNvbnRhaW5tZW50TWV0YUZlYXR1cmUKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5nZW5tb2RlbCMvL3VtbC9BY3Rpdml0eS9ub2RlIi8+Ci0gICAgICAgIDxjaGlsZE1ldGFGZWF0dXJlCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZ2VubW9kZWwjLy91bWwvQWN0aXZpdHkvbm9kZSIvPgotICAgICAgPC9tb2RlbEZhY2V0PgotICAgICAgPGxhYmVscwotICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46R2VuRXh0ZXJuYWxOb2RlTGFiZWwiCi0gICAgICAgICAgdmlzdWFsSUQ9IjQwMDMiCi0gICAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9IkluaXRpYWxOb2RlTmFtZUVkaXRQYXJ0IgotICAgICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IkluaXRpYWxOb2RlTmFtZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiCi0gICAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iSW5pdGlhbE5vZGVOYW1lVmlld0ZhY3RvcnkiPgotICAgICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcwotICAgICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vTm9kZSIvPgotICAgICAgICA8dmlld21hcAotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpGaWd1cmVWaWV3bWFwIgotICAgICAgICAgICAgZmlndXJlUXVhbGlmaWVkQ2xhc3NOYW1lPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwiPgotICAgICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5kcmF3MmQ8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWk8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgICA8L3ZpZXdtYXA+Ci0gICAgICAgIDxtb2RlbEZhY2V0Ci0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOkZlYXR1cmVMYWJlbE1vZGVsRmFjZXQiCi0gICAgICAgICAgICB2aWV3UGF0dGVybj0iIgotICAgICAgICAgICAgZWRpdFBhdHRlcm49IiI+Ci0gICAgICAgICAgPG1ldGFGZWF0dXJlcwotICAgICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZ2VubW9kZWwjLy91bWwvTmFtZWRFbGVtZW50L25hbWUiLz4KLSAgICAgICAgPC9tb2RlbEZhY2V0PgotICAgICAgPC9sYWJlbHM+Ci0gICAgPC90b3BMZXZlbE5vZGVzPgotICAgIDx0b3BMZXZlbE5vZGVzCi0gICAgICAgIHZpc3VhbElEPSIxMDA1IgotICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iRGVjaXNpb25Ob2RlRWRpdFBhcnQiCi0gICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IkRlY2lzaW9uTm9kZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiCi0gICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9IkRlY2lzaW9uTm9kZVZpZXdGYWN0b3J5IgotICAgICAgICBjYW5vbmljYWxFZGl0UG9saWN5Q2xhc3NOYW1lPSJEZWNpc2lvbk5vZGVDYW5vbmljYWxFZGl0UG9saWN5IgotICAgICAgICBncmFwaGljYWxOb2RlRWRpdFBvbGljeUNsYXNzTmFtZT0iRGVjaXNpb25Ob2RlR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kiPgotICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MKLSAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+Ci0gICAgICA8ZWxlbWVudFR5cGUKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOk1ldGFtb2RlbFR5cGUiCi0gICAgICAgICAgZWRpdEhlbHBlckNsYXNzTmFtZT0iRGVjaXNpb25Ob2RlRWRpdEhlbHBlciIvPgotICAgICAgPHZpZXdtYXAKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOklubmVyQ2xhc3NWaWV3bWFwIgotICAgICAgICAgIGNsYXNzTmFtZT0iRGVjaXNpb25EaWFtb25kRmlndXJlIgotICAgICAgICAgIGNsYXNzQm9keT0iJiN4RDsmI3hBOyYjeEQ7JiN4QTsvKiomI3hEOyYjeEE7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsgKi8mI3hEOyYjeEE7cHVibGljIGNsYXNzIERlY2lzaW9uRGlhbW9uZEZpZ3VyZSBleHRlbmRzIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmN1c3RvbS5maWd1cmVzLkRlY2lzaW9uTm9kZUZpZ3VyZSB7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwdWJsaWMgRGVjaXNpb25EaWFtb25kRmlndXJlKCkgeyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5OyYjeDk7dGhpcy5zZXRGb3JlZ3JvdW5kQ29sb3Iob3JnLmVjbGlwc2UuZHJhdzJkLkNvbG9yQ29uc3RhbnRzLmRhcmtCbHVlJiN4RDsmI3hBOyYjeEQ7JiN4QTspOyYjeEQ7JiN4QTsmI3g5OyYjeDk7dGhpcy5zZXRCYWNrZ3JvdW5kQ29sb3IoREVDSVNJT05ESUFNT05ERklHVVJFX0JBQ0smI3hEOyYjeEE7JiN4RDsmI3hBOyk7JiN4RDsmI3hBOyYjeDk7JiN4OTt0aGlzLnNldFByZWZlcnJlZFNpemUoZ2V0TWFwTW9kZSgpLkRQdG9MUCg1MCksIGdldE1hcE1vZGUoKS5EUHRvTFAoNTApKTsmI3hEOyYjeEE7JiN4OTsmI3g5O3RoaXMuc2V0U2l6ZShnZXRNYXBNb2RlKCkuRFB0b0xQKDUwKSwgZ2V0TWFwTW9kZSgpLkRQdG9MUCg1MCkpOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsmI3g5O2NyZWF0ZUNvbnRlbnRzKCk7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3ByaXZhdGUgdm9pZCBjcmVhdGVDb250ZW50cygpeyYjeEQ7JiN4QTsmI3g5OyYjeDk7b3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIGZpZ18wID0gbmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCgpOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsmI3g5O3NldEZpZ3VyZURpYW1vbmRMYWJlbChmaWdfMCk7JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3g5O09iamVjdCBsYXlEYXRhMCA9IG51bGw7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5OyYjeDk7dGhpcy5hZGQoZmlnXzAsIGxheURhdGEwKTsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJpdmF0ZSBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZkRpYW1vbmRMYWJlbDsgJiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwdWJsaWMgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIGdldEZpZ3VyZURpYW1vbmRMYWJlbCgpIHsmI3hEOyYjeEE7JiN4OTsmI3g5O3JldHVybiBmRGlhbW9uZExhYmVsOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJpdmF0ZSB2b2lkIHNldEZpZ3VyZURpYW1vbmRMYWJlbChvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZmlnKXsmI3hEOyYjeEE7JiN4OTsmI3g5O2ZEaWFtb25kTGFiZWwgPSBmaWc7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJpdmF0ZSBib29sZWFuIG15VXNlTG9jYWxDb29yZGluYXRlcyA9IGZhbHNlOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJvdGVjdGVkIGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcygpIHsmI3hEOyYjeEE7JiN4OTsmI3g5O3JldHVybiBteVVzZUxvY2FsQ29vcmRpbmF0ZXM7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJvdGVjdGVkIHZvaWQgc2V0VXNlTG9jYWxDb29yZGluYXRlcyhib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMpIHsmI3hEOyYjeEE7JiN4OTsmI3g5O215VXNlTG9jYWxDb29yZGluYXRlcyA9IHVzZUxvY2FsQ29vcmRpbmF0ZXM7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3hEOyYjeEE7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwdWJsaWMgc3RhdGljIGZpbmFsIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvciBERUNJU0lPTkRJQU1PTkRGSUdVUkVfQkFDSyA9IG5ldyBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3IobnVsbCwgMTg1LCAyMDUsIDIzMCk7JiN4RDsmI3hBOyI+Ci0gICAgICAgIDxhdHRyaWJ1dGVzCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlN0eWxlQXR0cmlidXRlcyIKLSAgICAgICAgICAgIGZpeGVkRm9yZWdyb3VuZD0idHJ1ZSIKLSAgICAgICAgICAgIGZpeGVkQmFja2dyb3VuZD0idHJ1ZSIvPgotICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZHJhdzJkPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aTwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICA8L3ZpZXdtYXA+Ci0gICAgICA8bW9kZWxGYWNldD4KLSAgICAgICAgPG1ldGFDbGFzcwotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmdlbm1vZGVsIy8vdW1sL0RlY2lzaW9uTm9kZSIvPgotICAgICAgICA8Y29udGFpbm1lbnRNZXRhRmVhdHVyZQotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmdlbm1vZGVsIy8vdW1sL0FjdGl2aXR5L25vZGUiLz4KLSAgICAgICAgPGNoaWxkTWV0YUZlYXR1cmUKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5nZW5tb2RlbCMvL3VtbC9BY3Rpdml0eS9ub2RlIi8+Ci0gICAgICA8L21vZGVsRmFjZXQ+Ci0gICAgICA8bGFiZWxzCi0gICAgICAgICAgdmlzdWFsSUQ9IjQwMDQiCi0gICAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9IkRlY2lzaW9uTm9kZU5hbWVFZGl0UGFydCIKLSAgICAgICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJEZWNpc2lvbk5vZGVOYW1lSXRlbVNlbWFudGljRWRpdFBvbGljeSIKLSAgICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJEZWNpc2lvbk5vZGVOYW1lVmlld0ZhY3RvcnkiPgotICAgICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcwotICAgICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vTm9kZSIvPgotICAgICAgICA8dmlld21hcAotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpJbm5lckNsYXNzVmlld21hcCIKLSAgICAgICAgICAgIGNsYXNzTmFtZT0iTm9kZU5hbWVGaWd1cmUiCi0gICAgICAgICAgICBjbGFzc0JvZHk9IiYjeEQ7JiN4QTsmI3hEOyYjeEE7LyoqJiN4RDsmI3hBOyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7ICovJiN4RDsmI3hBO3B1YmxpYyBjbGFzcyBOb2RlTmFtZUZpZ3VyZSBleHRlbmRzIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCB7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwdWJsaWMgTm9kZU5hbWVGaWd1cmUoKSB7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsmI3g5O3RoaXMuc2V0VGV4dCgmcXVvdDsmcXVvdDspOyYjeEQ7JiN4QTsmI3g5OyYjeDk7Y3JlYXRlQ29udGVudHMoKTsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbnRlbnRzKCl7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIGJvb2xlYW4gbXlVc2VMb2NhbENvb3JkaW5hdGVzID0gZmFsc2U7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcm90ZWN0ZWQgYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKCkgeyYjeEQ7JiN4QTsmI3g5OyYjeDk7cmV0dXJuIG15VXNlTG9jYWxDb29yZGluYXRlczsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcm90ZWN0ZWQgdm9pZCBzZXRVc2VMb2NhbENvb3JkaW5hdGVzKGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcykgeyYjeEQ7JiN4QTsmI3g5OyYjeDk7bXlVc2VMb2NhbENvb3JkaW5hdGVzID0gdXNlTG9jYWxDb29yZGluYXRlczsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeEQ7JiN4QTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyI+Ci0gICAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmRyYXcyZDwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aTwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICAgIDwvdmlld21hcD4KLSAgICAgICAgPG1vZGVsRmFjZXQKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46RmVhdHVyZUxhYmVsTW9kZWxGYWNldCIKLSAgICAgICAgICAgIGVkaXRQYXR0ZXJuPSIiPgotICAgICAgICAgIDxtZXRhRmVhdHVyZXMKLSAgICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmdlbm1vZGVsIy8vdW1sL05hbWVkRWxlbWVudC9uYW1lIi8+Ci0gICAgICAgIDwvbW9kZWxGYWNldD4KLSAgICAgIDwvbGFiZWxzPgotICAgIDwvdG9wTGV2ZWxOb2Rlcz4KLSAgICA8dG9wTGV2ZWxOb2RlcwotICAgICAgICB2aXN1YWxJRD0iMTAwNiIKLSAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9IkpvaW5Ob2RlRWRpdFBhcnQiCi0gICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IkpvaW5Ob2RlSXRlbVNlbWFudGljRWRpdFBvbGljeSIKLSAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iSm9pbk5vZGVWaWV3RmFjdG9yeSIKLSAgICAgICAgY2Fub25pY2FsRWRpdFBvbGljeUNsYXNzTmFtZT0iSm9pbk5vZGVDYW5vbmljYWxFZGl0UG9saWN5IgotICAgICAgICBncmFwaGljYWxOb2RlRWRpdFBvbGljeUNsYXNzTmFtZT0iSm9pbk5vZGVHcmFwaGljYWxOb2RlRWRpdFBvbGljeSI+Ci0gICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcwotICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL05vZGUiLz4KLSAgICAgIDxlbGVtZW50VHlwZQotICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46TWV0YW1vZGVsVHlwZSIKLSAgICAgICAgICBlZGl0SGVscGVyQ2xhc3NOYW1lPSJKb2luTm9kZUVkaXRIZWxwZXIiLz4KLSAgICAgIDx2aWV3bWFwCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpJbm5lckNsYXNzVmlld21hcCIKLSAgICAgICAgICBjbGFzc05hbWU9IkZvcmtOb2RlRmlndXJlIgotICAgICAgICAgIGNsYXNzQm9keT0iJiN4RDsmI3hBOyYjeEQ7JiN4QTsvKiomI3hEOyYjeEE7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsgKi8mI3hEOyYjeEE7cHVibGljIGNsYXNzIEZvcmtOb2RlRmlndXJlIGV4dGVuZHMgb3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZSB7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwdWJsaWMgRm9ya05vZGVGaWd1cmUoKSB7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeDk7dGhpcy5zZXRCYWNrZ3JvdW5kQ29sb3IoRk9SS05PREVGSUdVUkVfQkFDSyYjeEQ7JiN4QTsmI3hEOyYjeEE7KTsmI3hEOyYjeEE7JiN4OTsmI3g5O3RoaXMuc2V0UHJlZmVycmVkU2l6ZShnZXRNYXBNb2RlKCkuRFB0b0xQKDEwMCksIGdldE1hcE1vZGUoKS5EUHRvTFAoNSkpOyYjeEQ7JiN4QTsmI3g5OyYjeDk7dGhpcy5zZXRTaXplKGdldE1hcE1vZGUoKS5EUHRvTFAoMTAwKSwgZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSk7JiN4RDsmI3hBOyYjeDk7JiN4OTtjcmVhdGVDb250ZW50cygpOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIHZvaWQgY3JlYXRlQ29udGVudHMoKXsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3ByaXZhdGUgYm9vbGVhbiBteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSBmYWxzZTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3Byb3RlY3RlZCBib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMoKSB7JiN4RDsmI3hBOyYjeDk7JiN4OTtyZXR1cm4gbXlVc2VMb2NhbENvb3JkaW5hdGVzOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3Byb3RlY3RlZCB2b2lkIHNldFVzZUxvY2FsQ29vcmRpbmF0ZXMoYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKSB7JiN4RDsmI3hBOyYjeDk7JiN4OTtteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSB1c2VMb2NhbENvb3JkaW5hdGVzOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4RDsmI3hBO30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHVibGljIHN0YXRpYyBmaW5hbCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3IgRk9SS05PREVGSUdVUkVfQkFDSyA9IG5ldyBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3IobnVsbCwgNDUsIDg1LCAxMzApOyYjeEQ7JiN4QTsiPgotICAgICAgICA8YXR0cmlidXRlcwotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpTdHlsZUF0dHJpYnV0ZXMiCi0gICAgICAgICAgICBmaXhlZEJhY2tncm91bmQ9InRydWUiLz4KLSAgICAgICAgPGF0dHJpYnV0ZXMKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46UmVzaXplQ29uc3RyYWludHMiCi0gICAgICAgICAgICByZXNpemVIYW5kbGVzPSIyNCIvPgotICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZHJhdzJkPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aTwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICA8L3ZpZXdtYXA+Ci0gICAgICA8bW9kZWxGYWNldD4KLSAgICAgICAgPG1ldGFDbGFzcwotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmdlbm1vZGVsIy8vdW1sL0pvaW5Ob2RlIi8+Ci0gICAgICAgIDxjb250YWlubWVudE1ldGFGZWF0dXJlCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZ2VubW9kZWwjLy91bWwvQWN0aXZpdHkvbm9kZSIvPgotICAgICAgICA8Y2hpbGRNZXRhRmVhdHVyZQotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmdlbm1vZGVsIy8vdW1sL0FjdGl2aXR5L25vZGUiLz4KLSAgICAgIDwvbW9kZWxGYWNldD4KLSAgICA8L3RvcExldmVsTm9kZXM+Ci0gICAgPHRvcExldmVsTm9kZXMKLSAgICAgICAgdmlzdWFsSUQ9IjEwMDciCi0gICAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlRWRpdFBhcnQiCi0gICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVJdGVtU2VtYW50aWNFZGl0UG9saWN5IgotICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlVmlld0ZhY3RvcnkiCi0gICAgICAgIGNhbm9uaWNhbEVkaXRQb2xpY3lDbGFzc05hbWU9IlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVDYW5vbmljYWxFZGl0UG9saWN5IgotICAgICAgICBncmFwaGljYWxOb2RlRWRpdFBvbGljeUNsYXNzTmFtZT0iU3RydWN0dXJlZEFjdGl2aXR5Tm9kZUdyYXBoaWNhbE5vZGVFZGl0UG9saWN5Ij4KLSAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzCi0gICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vTm9kZSIvPgotICAgICAgPGVsZW1lbnRUeXBlCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpNZXRhbW9kZWxUeXBlIgotICAgICAgICAgIGVkaXRIZWxwZXJDbGFzc05hbWU9IlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVFZGl0SGVscGVyIi8+Ci0gICAgICA8dmlld21hcAotICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46SW5uZXJDbGFzc1ZpZXdtYXAiCi0gICAgICAgICAgY2xhc3NOYW1lPSJTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlRmlndXJlIgotICAgICAgICAgIGNsYXNzQm9keT0iJiN4RDsmI3hBOyYjeEQ7JiN4QTsvKiomI3hEOyYjeEE7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsgKi8mI3hEOyYjeEE7cHVibGljIGNsYXNzIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVGaWd1cmUgZXh0ZW5kcyBvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlIHsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3B1YmxpYyBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlRmlndXJlKCkgeyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3g5O3RoaXMuc2V0T3V0bGluZShmYWxzZSk7JiN4RDsmI3hBOyYjeDk7JiN4OTtjcmVhdGVDb250ZW50cygpOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIHZvaWQgY3JlYXRlQ29udGVudHMoKXsmI3hEOyYjeEE7JiN4OTsmI3g5O29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCBmaWdfMCA9IG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwoKTsmI3hEOyYjeEE7ZmlnXzAuc2V0VGV4dCgmcXVvdDsmcXVvdDspOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5OyYjeDk7c2V0RmlndXJlTm9kZU5hbWVGaWd1cmUoZmlnXzApOyYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4OTtPYmplY3QgbGF5RGF0YTAgPSBudWxsOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsmI3g5O3RoaXMuYWRkKGZpZ18wLCBsYXlEYXRhMCk7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3ByaXZhdGUgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIGZOb2RlTmFtZUZpZ3VyZTsgJiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwdWJsaWMgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIGdldEZpZ3VyZU5vZGVOYW1lRmlndXJlKCkgeyYjeEQ7JiN4QTsmI3g5OyYjeDk7cmV0dXJuIGZOb2RlTmFtZUZpZ3VyZTsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3ByaXZhdGUgdm9pZCBzZXRGaWd1cmVOb2RlTmFtZUZpZ3VyZShvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZmlnKXsmI3hEOyYjeEE7JiN4OTsmI3g5O2ZOb2RlTmFtZUZpZ3VyZSA9IGZpZzsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIGJvb2xlYW4gbXlVc2VMb2NhbENvb3JkaW5hdGVzID0gZmFsc2U7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcm90ZWN0ZWQgYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKCkgeyYjeEQ7JiN4QTsmI3g5OyYjeDk7cmV0dXJuIG15VXNlTG9jYWxDb29yZGluYXRlczsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcm90ZWN0ZWQgdm9pZCBzZXRVc2VMb2NhbENvb3JkaW5hdGVzKGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcykgeyYjeEQ7JiN4QTsmI3g5OyYjeDk7bXlVc2VMb2NhbENvb3JkaW5hdGVzID0gdXNlTG9jYWxDb29yZGluYXRlczsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeEQ7JiN4QTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyI+Ci0gICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5kcmF3MmQ8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgIDwvdmlld21hcD4KLSAgICAgIDxtb2RlbEZhY2V0PgotICAgICAgICA8bWV0YUNsYXNzCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZ2VubW9kZWwjLy91bWwvU3RydWN0dXJlZEFjdGl2aXR5Tm9kZSIvPgotICAgICAgICA8Y29udGFpbm1lbnRNZXRhRmVhdHVyZQotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmdlbm1vZGVsIy8vdW1sL0FjdGl2aXR5L25vZGUiLz4KLSAgICAgICAgPGNoaWxkTWV0YUZlYXR1cmUKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5nZW5tb2RlbCMvL3VtbC9BY3Rpdml0eS9ub2RlIi8+Ci0gICAgICAgIDxtb2RlbEVsZW1lbnRTZWxlY3RvcgotICAgICAgICAgICAgYm9keT0iZ2V0VW1hVHlwZV9BY3Rpdml0eSIKLSAgICAgICAgICAgIGxhbmd1YWdlPSJqYXZhIi8+Ci0gICAgICAgIDxtb2RlbEVsZW1lbnRJbml0aWFsaXplcgotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpHZW5GZWF0dXJlU2VxSW5pdGlhbGl6ZXIiPgotICAgICAgICAgIDxpbml0aWFsaXplcnMKLSAgICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpHZW5GZWF0dXJlVmFsdWVTcGVjIgotICAgICAgICAgICAgICBib2R5PSJjcmVhdGVVbWFUeXBlX0FjdGl2aXR5JiN4RDsmI3hBOyIKLSAgICAgICAgICAgICAgbGFuZ3VhZ2U9ImphdmEiPgotICAgICAgICAgICAgPGZlYXR1cmUKLSAgICAgICAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZW1mLmVjb3JlL21vZGVsL0Vjb3JlLmdlbm1vZGVsIy8vZWNvcmUvRU1vZGVsRWxlbWVudC9lQW5ub3RhdGlvbnMiLz4KLSAgICAgICAgICA8L2luaXRpYWxpemVycz4KLSAgICAgICAgPC9tb2RlbEVsZW1lbnRJbml0aWFsaXplcj4KLSAgICAgIDwvbW9kZWxGYWNldD4KLSAgICAgIDxsYWJlbHMKLSAgICAgICAgICB2aXN1YWxJRD0iNDAwNSIKLSAgICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWVFZGl0UGFydCIKLSAgICAgICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiCi0gICAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWVWaWV3RmFjdG9yeSI+Ci0gICAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzCi0gICAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+Ci0gICAgICAgIDx2aWV3bWFwCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlBhcmVudEFzc2lnbmVkVmlld21hcCIKLSAgICAgICAgICAgIGdldHRlck5hbWU9ImdldEZpZ3VyZU5vZGVOYW1lRmlndXJlIgotICAgICAgICAgICAgZmlndXJlUXVhbGlmaWVkQ2xhc3NOYW1lPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwiLz4KLSAgICAgICAgPG1vZGVsRmFjZXQKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46RmVhdHVyZUxhYmVsTW9kZWxGYWNldCI+Ci0gICAgICAgICAgPG1ldGFGZWF0dXJlcwotICAgICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZ2VubW9kZWwjLy91bWwvTmFtZWRFbGVtZW50L25hbWUiLz4KLSAgICAgICAgPC9tb2RlbEZhY2V0PgotICAgICAgPC9sYWJlbHM+Ci0gICAgPC90b3BMZXZlbE5vZGVzPgotICAgIDx0b3BMZXZlbE5vZGVzCi0gICAgICAgIHZpc3VhbElEPSIxMDA4IgotICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iQWN0aXZpdHlQYXJ0aXRpb25FZGl0UGFydCIKLSAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iQWN0aXZpdHlQYXJ0aXRpb25JdGVtU2VtYW50aWNFZGl0UG9saWN5IgotICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJBY3Rpdml0eVBhcnRpdGlvblZpZXdGYWN0b3J5IgotICAgICAgICBjYW5vbmljYWxFZGl0UG9saWN5Q2xhc3NOYW1lPSJBY3Rpdml0eVBhcnRpdGlvbkNhbm9uaWNhbEVkaXRQb2xpY3kiCi0gICAgICAgIGNvbXBhcnRtZW50cz0iLy9AZGlhZ3JhbS9AY29tcGFydG1lbnRzLjAiCi0gICAgICAgIGdyYXBoaWNhbE5vZGVFZGl0UG9saWN5Q2xhc3NOYW1lPSJBY3Rpdml0eVBhcnRpdGlvbkdyYXBoaWNhbE5vZGVFZGl0UG9saWN5Ij4KLSAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzCi0gICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vTm9kZSIvPgotICAgICAgPGVsZW1lbnRUeXBlCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpNZXRhbW9kZWxUeXBlIgotICAgICAgICAgIGVkaXRIZWxwZXJDbGFzc05hbWU9IkFjdGl2aXR5UGFydGl0aW9uRWRpdEhlbHBlciIvPgotICAgICAgPHZpZXdtYXAKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOklubmVyQ2xhc3NWaWV3bWFwIgotICAgICAgICAgIGxheW91dFR5cGU9IlhZX0xBWU9VVCIKLSAgICAgICAgICBjbGFzc05hbWU9IkFjdGl2aXR5UGFydGl0aW9uRmlndXJlIgotICAgICAgICAgIGNsYXNzQm9keT0iJiN4RDsmI3hBOyYjeEQ7JiN4QTsvKiomI3hEOyYjeEE7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsgKi8mI3hEOyYjeEE7cHVibGljIGNsYXNzIEFjdGl2aXR5UGFydGl0aW9uRmlndXJlIGV4dGVuZHMgb3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZSB7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwdWJsaWMgQWN0aXZpdHlQYXJ0aXRpb25GaWd1cmUoKSB7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeDk7b3JnLmVjbGlwc2UuZHJhdzJkLlhZTGF5b3V0IG15R2VuTGF5b3V0TWFuYWdlciA9IG5ldyBvcmcuZWNsaXBzZS5kcmF3MmQuWFlMYXlvdXQoKTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4OTt0aGlzLnNldExheW91dE1hbmFnZXIobXlHZW5MYXlvdXRNYW5hZ2VyKTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3g5OyYjeDk7dGhpcy5zZXRGb3JlZ3JvdW5kQ29sb3Iob3JnLmVjbGlwc2UuZHJhdzJkLkNvbG9yQ29uc3RhbnRzLmJsYWNrJiN4RDsmI3hBOyYjeEQ7JiN4QTspOyYjeEQ7JiN4QTsmI3g5OyYjeDk7dGhpcy5zZXRCYWNrZ3JvdW5kQ29sb3IoQUNUSVZJVFlQQVJUSVRJT05GSUdVUkVfQkFDSyYjeEQ7JiN4QTsmI3hEOyYjeEE7KTsmI3hEOyYjeEE7JiN4OTsmI3g5O3RoaXMuc2V0UHJlZmVycmVkU2l6ZShnZXRNYXBNb2RlKCkuRFB0b0xQKDMwMCksIGdldE1hcE1vZGUoKS5EUHRvTFAoNjAwKSk7JiN4RDsmI3hBOyYjeDk7JiN4OTt0aGlzLnNldFNpemUoZ2V0TWFwTW9kZSgpLkRQdG9MUCgzMDApLCBnZXRNYXBNb2RlKCkuRFB0b0xQKDYwMCkpOyYjeEQ7JiN4QTsmI3g5OyYjeDk7dGhpcy5zZXRCb3JkZXIoJiN4RDsmI3hBO25ldyBvcmcuZWNsaXBzZS5kcmF3MmQuTGluZUJvcmRlcigpJiN4RDsmI3hBOyk7JiN4RDsmI3hBOyYjeDk7JiN4OTtjcmVhdGVDb250ZW50cygpOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIHZvaWQgY3JlYXRlQ29udGVudHMoKXsmI3hEOyYjeEE7JiN4OTsmI3g5O29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCBmaWdfMCA9IG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwoKTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7JiN4OTtzZXRGaWd1cmVQYXJ0aXRpb25MYWJlbEZpZ3VyZShmaWdfMCk7JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3g5O09iamVjdCBsYXlEYXRhMCA9IG51bGw7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5OyYjeDk7dGhpcy5hZGQoZmlnXzAsIGxheURhdGEwKTsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJpdmF0ZSBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZlBhcnRpdGlvbkxhYmVsRmlndXJlOyAmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3B1YmxpYyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZ2V0RmlndXJlUGFydGl0aW9uTGFiZWxGaWd1cmUoKSB7JiN4RDsmI3hBOyYjeDk7JiN4OTtyZXR1cm4gZlBhcnRpdGlvbkxhYmVsRmlndXJlOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJpdmF0ZSB2b2lkIHNldEZpZ3VyZVBhcnRpdGlvbkxhYmVsRmlndXJlKG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCBmaWcpeyYjeEQ7JiN4QTsmI3g5OyYjeDk7ZlBhcnRpdGlvbkxhYmVsRmlndXJlID0gZmlnOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3ByaXZhdGUgYm9vbGVhbiBteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSBmYWxzZTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3Byb3RlY3RlZCBib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMoKSB7JiN4RDsmI3hBOyYjeDk7JiN4OTtyZXR1cm4gbXlVc2VMb2NhbENvb3JkaW5hdGVzOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3Byb3RlY3RlZCB2b2lkIHNldFVzZUxvY2FsQ29vcmRpbmF0ZXMoYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKSB7JiN4RDsmI3hBOyYjeDk7JiN4OTtteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSB1c2VMb2NhbENvb3JkaW5hdGVzOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4RDsmI3hBO30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHVibGljIHN0YXRpYyBmaW5hbCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3IgQUNUSVZJVFlQQVJUSVRJT05GSUdVUkVfQkFDSyA9IG5ldyBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3IobnVsbCwgMjU1LCAyNTUsIDI1NSk7JiN4RDsmI3hBOyI+Ci0gICAgICAgIDxhdHRyaWJ1dGVzCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlN0eWxlQXR0cmlidXRlcyIKLSAgICAgICAgICAgIGZpeGVkRm9yZWdyb3VuZD0idHJ1ZSIKLSAgICAgICAgICAgIGZpeGVkQmFja2dyb3VuZD0idHJ1ZSIvPgotICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZHJhdzJkPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aTwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICA8L3ZpZXdtYXA+Ci0gICAgICA8bW9kZWxGYWNldD4KLSAgICAgICAgPG1ldGFDbGFzcwotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmdlbm1vZGVsIy8vdW1sL0FjdGl2aXR5UGFydGl0aW9uIi8+Ci0gICAgICAgIDxjb250YWlubWVudE1ldGFGZWF0dXJlCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZ2VubW9kZWwjLy91bWwvQWN0aXZpdHkvZ3JvdXAiLz4KLSAgICAgICAgPGNoaWxkTWV0YUZlYXR1cmUKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5nZW5tb2RlbCMvL3VtbC9BY3Rpdml0eS9ncm91cCIvPgotICAgICAgPC9tb2RlbEZhY2V0PgotICAgICAgPGxhYmVscwotICAgICAgICAgIHZpc3VhbElEPSI0MDA3IgotICAgICAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJBY3Rpdml0eVBhcnRpdGlvbk5hbWUyRWRpdFBhcnQiCi0gICAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iQWN0aXZpdHlQYXJ0aXRpb25OYW1lMkl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiCi0gICAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iQWN0aXZpdHlQYXJ0aXRpb25OYW1lMlZpZXdGYWN0b3J5IgotICAgICAgICAgIGVsZW1lbnRJY29uPSJ0cnVlIj4KLSAgICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL05vZGUiLz4KLSAgICAgICAgPHZpZXdtYXAKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46UGFyZW50QXNzaWduZWRWaWV3bWFwIgotICAgICAgICAgICAgZ2V0dGVyTmFtZT0iZ2V0RmlndXJlUGFydGl0aW9uTGFiZWxGaWd1cmUiCi0gICAgICAgICAgICBmaWd1cmVRdWFsaWZpZWRDbGFzc05hbWU9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCIvPgotICAgICAgICA8bW9kZWxGYWNldAotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpGZWF0dXJlTGFiZWxNb2RlbEZhY2V0IgotICAgICAgICAgICAgdmlld1BhdHRlcm49IiIKLSAgICAgICAgICAgIGVkaXRQYXR0ZXJuPSIiPgotICAgICAgICAgIDxtZXRhRmVhdHVyZXMKLSAgICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmdlbm1vZGVsIy8vdW1sL05hbWVkRWxlbWVudC9uYW1lIi8+Ci0gICAgICAgIDwvbW9kZWxGYWNldD4KLSAgICAgIDwvbGFiZWxzPgotICAgIDwvdG9wTGV2ZWxOb2Rlcz4KLSAgICA8dG9wTGV2ZWxOb2RlcwotICAgICAgICB2aXN1YWxJRD0iMTAwOSIKLSAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9IkFjdGl2aXR5UGFyYW1ldGVyTm9kZUVkaXRQYXJ0IgotICAgICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJBY3Rpdml0eVBhcmFtZXRlck5vZGVJdGVtU2VtYW50aWNFZGl0UG9saWN5IgotICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJBY3Rpdml0eVBhcmFtZXRlck5vZGVWaWV3RmFjdG9yeSIKLSAgICAgICAgY2Fub25pY2FsRWRpdFBvbGljeUNsYXNzTmFtZT0iQWN0aXZpdHlQYXJhbWV0ZXJOb2RlQ2Fub25pY2FsRWRpdFBvbGljeSIKLSAgICAgICAgZ3JhcGhpY2FsTm9kZUVkaXRQb2xpY3lDbGFzc05hbWU9IkFjdGl2aXR5UGFyYW1ldGVyTm9kZUdyYXBoaWNhbE5vZGVFZGl0UG9saWN5Ij4KLSAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzCi0gICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vTm9kZSIvPgotICAgICAgPGVsZW1lbnRUeXBlCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpNZXRhbW9kZWxUeXBlIgotICAgICAgICAgIGVkaXRIZWxwZXJDbGFzc05hbWU9IkFjdGl2aXR5UGFyYW1ldGVyTm9kZUVkaXRIZWxwZXIiLz4KLSAgICAgIDx2aWV3bWFwCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpJbm5lckNsYXNzVmlld21hcCIKLSAgICAgICAgICBjbGFzc05hbWU9IkFjdGl2aXR5UGFyYW1ldGVyTm9kZUZpZ3VyZSIKLSAgICAgICAgICBjbGFzc0JvZHk9IiYjeEQ7JiN4QTsmI3hEOyYjeEE7LyoqJiN4RDsmI3hBOyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7ICovJiN4RDsmI3hBO3B1YmxpYyBjbGFzcyBBY3Rpdml0eVBhcmFtZXRlck5vZGVGaWd1cmUgZXh0ZW5kcyBvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlIHsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3B1YmxpYyBBY3Rpdml0eVBhcmFtZXRlck5vZGVGaWd1cmUoKSB7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeDk7dGhpcy5zZXRPdXRsaW5lKGZhbHNlKTsmI3hEOyYjeEE7JiN4OTsmI3g5O2NyZWF0ZUNvbnRlbnRzKCk7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3ByaXZhdGUgdm9pZCBjcmVhdGVDb250ZW50cygpeyYjeEQ7JiN4QTsmI3g5OyYjeDk7b3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIGZpZ18wID0gbmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCgpOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsmI3g5O3NldEZpZ3VyZUFjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWVMYWJlbChmaWdfMCk7JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3g5O09iamVjdCBsYXlEYXRhMCA9IG51bGw7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5OyYjeDk7dGhpcy5hZGQoZmlnXzAsIGxheURhdGEwKTsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJpdmF0ZSBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZkFjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWVMYWJlbDsgJiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwdWJsaWMgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIGdldEZpZ3VyZUFjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWVMYWJlbCgpIHsmI3hEOyYjeEE7JiN4OTsmI3g5O3JldHVybiBmQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZUxhYmVsOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJpdmF0ZSB2b2lkIHNldEZpZ3VyZUFjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWVMYWJlbChvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZmlnKXsmI3hEOyYjeEE7JiN4OTsmI3g5O2ZBY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lTGFiZWwgPSBmaWc7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJpdmF0ZSBib29sZWFuIG15VXNlTG9jYWxDb29yZGluYXRlcyA9IGZhbHNlOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJvdGVjdGVkIGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcygpIHsmI3hEOyYjeEE7JiN4OTsmI3g5O3JldHVybiBteVVzZUxvY2FsQ29vcmRpbmF0ZXM7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJvdGVjdGVkIHZvaWQgc2V0VXNlTG9jYWxDb29yZGluYXRlcyhib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMpIHsmI3hEOyYjeEE7JiN4OTsmI3g5O215VXNlTG9jYWxDb29yZGluYXRlcyA9IHVzZUxvY2FsQ29vcmRpbmF0ZXM7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3hEOyYjeEE7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsiPgotICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZHJhdzJkPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aTwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICA8L3ZpZXdtYXA+Ci0gICAgICA8bW9kZWxGYWNldD4KLSAgICAgICAgPG1ldGFDbGFzcwotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmdlbm1vZGVsIy8vdW1sL0FjdGl2aXR5UGFyYW1ldGVyTm9kZSIvPgotICAgICAgICA8Y29udGFpbm1lbnRNZXRhRmVhdHVyZQotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmdlbm1vZGVsIy8vdW1sL0FjdGl2aXR5L25vZGUiLz4KLSAgICAgICAgPGNoaWxkTWV0YUZlYXR1cmUKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5nZW5tb2RlbCMvL3VtbC9BY3Rpdml0eS9ub2RlIi8+Ci0gICAgICAgIDxtb2RlbEVsZW1lbnRTZWxlY3RvcgotICAgICAgICAgICAgYm9keT0iZ2V0VW1hVHlwZV9UYXNrRGVzY3JpcHRvciIKLSAgICAgICAgICAgIGxhbmd1YWdlPSJqYXZhIi8+Ci0gICAgICAgIDxtb2RlbEVsZW1lbnRJbml0aWFsaXplcgotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpHZW5GZWF0dXJlU2VxSW5pdGlhbGl6ZXIiPgotICAgICAgICAgIDxpbml0aWFsaXplcnMKLSAgICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpHZW5GZWF0dXJlVmFsdWVTcGVjIgotICAgICAgICAgICAgICBib2R5PSJjcmVhdGVVbWFUeXBlX1Rhc2tEZXNjcmlwdG9yIgotICAgICAgICAgICAgICBsYW5ndWFnZT0iamF2YSI+Ci0gICAgICAgICAgICA8ZmVhdHVyZQotICAgICAgICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5lbWYuZWNvcmUvbW9kZWwvRWNvcmUuZ2VubW9kZWwjLy9lY29yZS9FTW9kZWxFbGVtZW50L2VBbm5vdGF0aW9ucyIvPgotICAgICAgICAgIDwvaW5pdGlhbGl6ZXJzPgotICAgICAgICA8L21vZGVsRWxlbWVudEluaXRpYWxpemVyPgotICAgICAgPC9tb2RlbEZhY2V0PgotICAgICAgPGxhYmVscwotICAgICAgICAgIHZpc3VhbElEPSI0MDA4IgotICAgICAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJBY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lRWRpdFBhcnQiCi0gICAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiCi0gICAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZVZpZXdGYWN0b3J5Ij4KLSAgICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL05vZGUiLz4KLSAgICAgICAgPHZpZXdtYXAKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46UGFyZW50QXNzaWduZWRWaWV3bWFwIgotICAgICAgICAgICAgZ2V0dGVyTmFtZT0iZ2V0RmlndXJlQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZUxhYmVsIgotICAgICAgICAgICAgZmlndXJlUXVhbGlmaWVkQ2xhc3NOYW1lPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwiLz4KLSAgICAgICAgPG1vZGVsRmFjZXQKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46RmVhdHVyZUxhYmVsTW9kZWxGYWNldCI+Ci0gICAgICAgICAgPG1ldGFGZWF0dXJlcwotICAgICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZ2VubW9kZWwjLy91bWwvTmFtZWRFbGVtZW50L25hbWUiLz4KLSAgICAgICAgPC9tb2RlbEZhY2V0PgotICAgICAgPC9sYWJlbHM+Ci0gICAgPC90b3BMZXZlbE5vZGVzPgotICAgIDx0b3BMZXZlbE5vZGVzCi0gICAgICAgIHZpc3VhbElEPSIxMDEwIgotICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTJFZGl0UGFydCIKLSAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTJJdGVtU2VtYW50aWNFZGl0UG9saWN5IgotICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlMlZpZXdGYWN0b3J5IgotICAgICAgICBjYW5vbmljYWxFZGl0UG9saWN5Q2xhc3NOYW1lPSJTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlMkNhbm9uaWNhbEVkaXRQb2xpY3kiCi0gICAgICAgIGdyYXBoaWNhbE5vZGVFZGl0UG9saWN5Q2xhc3NOYW1lPSJTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlMkdyYXBoaWNhbE5vZGVFZGl0UG9saWN5Ij4KLSAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzCi0gICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vTm9kZSIvPgotICAgICAgPGVsZW1lbnRUeXBlCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpTcGVjaWFsaXphdGlvblR5cGUiCi0gICAgICAgICAgbWV0YW1vZGVsVHlwZT0iLy9AZGlhZ3JhbS9AdG9wTGV2ZWxOb2Rlcy42L0BlbGVtZW50VHlwZSIKLSAgICAgICAgICBlZGl0SGVscGVyQWR2aWNlQ2xhc3NOYW1lPSJTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlRWRpdEhlbHBlckFkdmljZSIvPgotICAgICAgPHZpZXdtYXAKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOklubmVyQ2xhc3NWaWV3bWFwIgotICAgICAgICAgIGNsYXNzTmFtZT0iU3RydWN0dXJlZEFjdGl2aXR5Tm9kZUZpZ3VyZSIKLSAgICAgICAgICBjbGFzc0JvZHk9IiYjeEQ7JiN4QTsmI3hEOyYjeEE7LyoqJiN4RDsmI3hBOyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7ICovJiN4RDsmI3hBO3B1YmxpYyBjbGFzcyBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlRmlndXJlIGV4dGVuZHMgb3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZSB7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwdWJsaWMgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZUZpZ3VyZSgpIHsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4OTt0aGlzLnNldE91dGxpbmUoZmFsc2UpOyYjeEQ7JiN4QTsmI3g5OyYjeDk7Y3JlYXRlQ29udGVudHMoKTsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbnRlbnRzKCl7JiN4RDsmI3hBOyYjeDk7JiN4OTtvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZmlnXzAgPSBuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsKCk7JiN4RDsmI3hBO2ZpZ18wLnNldFRleHQoJnF1b3Q7JnF1b3Q7KTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsmI3g5O3NldEZpZ3VyZU5vZGVOYW1lRmlndXJlKGZpZ18wKTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeDk7T2JqZWN0IGxheURhdGEwID0gbnVsbDsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7JiN4OTt0aGlzLmFkZChmaWdfMCwgbGF5RGF0YTApOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCBmTm9kZU5hbWVGaWd1cmU7ICYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHVibGljIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCBnZXRGaWd1cmVOb2RlTmFtZUZpZ3VyZSgpIHsmI3hEOyYjeEE7JiN4OTsmI3g5O3JldHVybiBmTm9kZU5hbWVGaWd1cmU7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIHZvaWQgc2V0RmlndXJlTm9kZU5hbWVGaWd1cmUob3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIGZpZyl7JiN4RDsmI3hBOyYjeDk7JiN4OTtmTm9kZU5hbWVGaWd1cmUgPSBmaWc7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJpdmF0ZSBib29sZWFuIG15VXNlTG9jYWxDb29yZGluYXRlcyA9IGZhbHNlOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJvdGVjdGVkIGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcygpIHsmI3hEOyYjeEE7JiN4OTsmI3g5O3JldHVybiBteVVzZUxvY2FsQ29vcmRpbmF0ZXM7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJvdGVjdGVkIHZvaWQgc2V0VXNlTG9jYWxDb29yZGluYXRlcyhib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMpIHsmI3hEOyYjeEE7JiN4OTsmI3g5O215VXNlTG9jYWxDb29yZGluYXRlcyA9IHVzZUxvY2FsQ29vcmRpbmF0ZXM7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3hEOyYjeEE7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsiPgotICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZHJhdzJkPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aTwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICA8L3ZpZXdtYXA+Ci0gICAgICA8bW9kZWxGYWNldD4KLSAgICAgICAgPG1ldGFDbGFzcwotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmdlbm1vZGVsIy8vdW1sL1N0cnVjdHVyZWRBY3Rpdml0eU5vZGUiLz4KLSAgICAgICAgPGNvbnRhaW5tZW50TWV0YUZlYXR1cmUKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5nZW5tb2RlbCMvL3VtbC9BY3Rpdml0eS9ub2RlIi8+Ci0gICAgICAgIDxjaGlsZE1ldGFGZWF0dXJlCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZ2VubW9kZWwjLy91bWwvQWN0aXZpdHkvbm9kZSIvPgotICAgICAgICA8bW9kZWxFbGVtZW50U2VsZWN0b3IKLSAgICAgICAgICAgIGJvZHk9ImdldFVtYVR5cGVfUGhhc2UiCi0gICAgICAgICAgICBsYW5ndWFnZT0iamF2YSIvPgotICAgICAgICA8bW9kZWxFbGVtZW50SW5pdGlhbGl6ZXIKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46R2VuRmVhdHVyZVNlcUluaXRpYWxpemVyIj4KLSAgICAgICAgICA8aW5pdGlhbGl6ZXJzCi0gICAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46R2VuRmVhdHVyZVZhbHVlU3BlYyIKLSAgICAgICAgICAgICAgYm9keT0iY3JlYXRlVW1hVHlwZV9QaGFzZSIKLSAgICAgICAgICAgICAgbGFuZ3VhZ2U9ImphdmEiPgotICAgICAgICAgICAgPGZlYXR1cmUKLSAgICAgICAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZW1mLmVjb3JlL21vZGVsL0Vjb3JlLmdlbm1vZGVsIy8vZWNvcmUvRU1vZGVsRWxlbWVudC9lQW5ub3RhdGlvbnMiLz4KLSAgICAgICAgICA8L2luaXRpYWxpemVycz4KLSAgICAgICAgPC9tb2RlbEVsZW1lbnRJbml0aWFsaXplcj4KLSAgICAgIDwvbW9kZWxGYWNldD4KLSAgICAgIDxsYWJlbHMKLSAgICAgICAgICB2aXN1YWxJRD0iNDAwOSIKLSAgICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWUyRWRpdFBhcnQiCi0gICAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWUySXRlbVNlbWFudGljRWRpdFBvbGljeSIKLSAgICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZTJWaWV3RmFjdG9yeSI+Ci0gICAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzCi0gICAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+Ci0gICAgICAgIDx2aWV3bWFwCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlBhcmVudEFzc2lnbmVkVmlld21hcCIKLSAgICAgICAgICAgIGdldHRlck5hbWU9ImdldEZpZ3VyZU5vZGVOYW1lRmlndXJlIgotICAgICAgICAgICAgZmlndXJlUXVhbGlmaWVkQ2xhc3NOYW1lPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwiLz4KLSAgICAgICAgPG1vZGVsRmFjZXQKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46RmVhdHVyZUxhYmVsTW9kZWxGYWNldCI+Ci0gICAgICAgICAgPG1ldGFGZWF0dXJlcwotICAgICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZ2VubW9kZWwjLy91bWwvTmFtZWRFbGVtZW50L25hbWUiLz4KLSAgICAgICAgPC9tb2RlbEZhY2V0PgotICAgICAgPC9sYWJlbHM+Ci0gICAgPC90b3BMZXZlbE5vZGVzPgotICAgIDx0b3BMZXZlbE5vZGVzCi0gICAgICAgIHZpc3VhbElEPSIxMDExIgotICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTNFZGl0UGFydCIKLSAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTNJdGVtU2VtYW50aWNFZGl0UG9saWN5IgotICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlM1ZpZXdGYWN0b3J5IgotICAgICAgICBjYW5vbmljYWxFZGl0UG9saWN5Q2xhc3NOYW1lPSJTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlM0Nhbm9uaWNhbEVkaXRQb2xpY3kiCi0gICAgICAgIGdyYXBoaWNhbE5vZGVFZGl0UG9saWN5Q2xhc3NOYW1lPSJTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlM0dyYXBoaWNhbE5vZGVFZGl0UG9saWN5Ij4KLSAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzCi0gICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vTm9kZSIvPgotICAgICAgPGVsZW1lbnRUeXBlCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpTcGVjaWFsaXphdGlvblR5cGUiCi0gICAgICAgICAgbWV0YW1vZGVsVHlwZT0iLy9AZGlhZ3JhbS9AdG9wTGV2ZWxOb2Rlcy42L0BlbGVtZW50VHlwZSIKLSAgICAgICAgICBlZGl0SGVscGVyQWR2aWNlQ2xhc3NOYW1lPSJTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlMkVkaXRIZWxwZXJBZHZpY2UiLz4KLSAgICAgIDx2aWV3bWFwCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpJbm5lckNsYXNzVmlld21hcCIKLSAgICAgICAgICBjbGFzc05hbWU9IlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVGaWd1cmUiCi0gICAgICAgICAgY2xhc3NCb2R5PSImI3hEOyYjeEE7JiN4RDsmI3hBOy8qKiYjeEQ7JiN4QTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyAqLyYjeEQ7JiN4QTtwdWJsaWMgY2xhc3MgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZUZpZ3VyZSBleHRlbmRzIG9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmUgeyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHVibGljIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVGaWd1cmUoKSB7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeDk7dGhpcy5zZXRPdXRsaW5lKGZhbHNlKTsmI3hEOyYjeEE7JiN4OTsmI3g5O2NyZWF0ZUNvbnRlbnRzKCk7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3ByaXZhdGUgdm9pZCBjcmVhdGVDb250ZW50cygpeyYjeEQ7JiN4QTsmI3g5OyYjeDk7b3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIGZpZ18wID0gbmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCgpOyYjeEQ7JiN4QTtmaWdfMC5zZXRUZXh0KCZxdW90OyZxdW90Oyk7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7JiN4OTtzZXRGaWd1cmVOb2RlTmFtZUZpZ3VyZShmaWdfMCk7JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3g5O09iamVjdCBsYXlEYXRhMCA9IG51bGw7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5OyYjeDk7dGhpcy5hZGQoZmlnXzAsIGxheURhdGEwKTsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJpdmF0ZSBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZk5vZGVOYW1lRmlndXJlOyAmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3B1YmxpYyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZ2V0RmlndXJlTm9kZU5hbWVGaWd1cmUoKSB7JiN4RDsmI3hBOyYjeDk7JiN4OTtyZXR1cm4gZk5vZGVOYW1lRmlndXJlOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJpdmF0ZSB2b2lkIHNldEZpZ3VyZU5vZGVOYW1lRmlndXJlKG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCBmaWcpeyYjeEQ7JiN4QTsmI3g5OyYjeDk7Zk5vZGVOYW1lRmlndXJlID0gZmlnOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3ByaXZhdGUgYm9vbGVhbiBteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSBmYWxzZTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3Byb3RlY3RlZCBib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMoKSB7JiN4RDsmI3hBOyYjeDk7JiN4OTtyZXR1cm4gbXlVc2VMb2NhbENvb3JkaW5hdGVzOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3Byb3RlY3RlZCB2b2lkIHNldFVzZUxvY2FsQ29vcmRpbmF0ZXMoYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKSB7JiN4RDsmI3hBOyYjeDk7JiN4OTtteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSB1c2VMb2NhbENvb3JkaW5hdGVzOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4RDsmI3hBO30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7Ij4KLSAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmRyYXcyZDwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWk8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgPC92aWV3bWFwPgotICAgICAgPG1vZGVsRmFjZXQ+Ci0gICAgICAgIDxtZXRhQ2xhc3MKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5nZW5tb2RlbCMvL3VtbC9TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlIi8+Ci0gICAgICAgIDxjb250YWlubWVudE1ldGFGZWF0dXJlCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZ2VubW9kZWwjLy91bWwvQWN0aXZpdHkvbm9kZSIvPgotICAgICAgICA8Y2hpbGRNZXRhRmVhdHVyZQotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmdlbm1vZGVsIy8vdW1sL0FjdGl2aXR5L25vZGUiLz4KLSAgICAgICAgPG1vZGVsRWxlbWVudFNlbGVjdG9yCi0gICAgICAgICAgICBib2R5PSJnZXRVbWFUeXBlX0l0ZXJhdGlvbiIKLSAgICAgICAgICAgIGxhbmd1YWdlPSJqYXZhIi8+Ci0gICAgICAgIDxtb2RlbEVsZW1lbnRJbml0aWFsaXplcgotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpHZW5GZWF0dXJlU2VxSW5pdGlhbGl6ZXIiPgotICAgICAgICAgIDxpbml0aWFsaXplcnMKLSAgICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpHZW5GZWF0dXJlVmFsdWVTcGVjIgotICAgICAgICAgICAgICBib2R5PSJjcmVhdGVVbWFUeXBlX0l0ZXJhdGlvbiIKLSAgICAgICAgICAgICAgbGFuZ3VhZ2U9ImphdmEiPgotICAgICAgICAgICAgPGZlYXR1cmUKLSAgICAgICAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZW1mLmVjb3JlL21vZGVsL0Vjb3JlLmdlbm1vZGVsIy8vZWNvcmUvRU1vZGVsRWxlbWVudC9lQW5ub3RhdGlvbnMiLz4KLSAgICAgICAgICA8L2luaXRpYWxpemVycz4KLSAgICAgICAgPC9tb2RlbEVsZW1lbnRJbml0aWFsaXplcj4KLSAgICAgIDwvbW9kZWxGYWNldD4KLSAgICAgIDxsYWJlbHMKLSAgICAgICAgICB2aXN1YWxJRD0iNDAxMCIKLSAgICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWUzRWRpdFBhcnQiCi0gICAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWUzSXRlbVNlbWFudGljRWRpdFBvbGljeSIKLSAgICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZTNWaWV3RmFjdG9yeSI+Ci0gICAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzCi0gICAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+Ci0gICAgICAgIDx2aWV3bWFwCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlBhcmVudEFzc2lnbmVkVmlld21hcCIKLSAgICAgICAgICAgIGdldHRlck5hbWU9ImdldEZpZ3VyZU5vZGVOYW1lRmlndXJlIgotICAgICAgICAgICAgZmlndXJlUXVhbGlmaWVkQ2xhc3NOYW1lPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwiLz4KLSAgICAgICAgPG1vZGVsRmFjZXQKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46RmVhdHVyZUxhYmVsTW9kZWxGYWNldCI+Ci0gICAgICAgICAgPG1ldGFGZWF0dXJlcwotICAgICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZ2VubW9kZWwjLy91bWwvTmFtZWRFbGVtZW50L25hbWUiLz4KLSAgICAgICAgPC9tb2RlbEZhY2V0PgotICAgICAgPC9sYWJlbHM+Ci0gICAgPC90b3BMZXZlbE5vZGVzPgotICAgIDx0b3BMZXZlbE5vZGVzCi0gICAgICAgIHZpc3VhbElEPSIxMDEyIgotICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iQWN0aXZpdHlQYXJhbWV0ZXJOb2RlMkVkaXRQYXJ0IgotICAgICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJBY3Rpdml0eVBhcmFtZXRlck5vZGUySXRlbVNlbWFudGljRWRpdFBvbGljeSIKLSAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iQWN0aXZpdHlQYXJhbWV0ZXJOb2RlMlZpZXdGYWN0b3J5IgotICAgICAgICBjYW5vbmljYWxFZGl0UG9saWN5Q2xhc3NOYW1lPSJBY3Rpdml0eVBhcmFtZXRlck5vZGUyQ2Fub25pY2FsRWRpdFBvbGljeSIKLSAgICAgICAgZ3JhcGhpY2FsTm9kZUVkaXRQb2xpY3lDbGFzc05hbWU9IkFjdGl2aXR5UGFyYW1ldGVyTm9kZTJHcmFwaGljYWxOb2RlRWRpdFBvbGljeSI+Ci0gICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcwotICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL05vZGUiLz4KLSAgICAgIDxlbGVtZW50VHlwZQotICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46U3BlY2lhbGl6YXRpb25UeXBlIgotICAgICAgICAgIG1ldGFtb2RlbFR5cGU9Ii8vQGRpYWdyYW0vQHRvcExldmVsTm9kZXMuOC9AZWxlbWVudFR5cGUiCi0gICAgICAgICAgZWRpdEhlbHBlckFkdmljZUNsYXNzTmFtZT0iQWN0aXZpdHlQYXJhbWV0ZXJOb2RlRWRpdEhlbHBlckFkdmljZSIvPgotICAgICAgPHZpZXdtYXAKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOklubmVyQ2xhc3NWaWV3bWFwIgotICAgICAgICAgIGNsYXNzTmFtZT0iQWN0aXZpdHlQYXJhbWV0ZXJOb2RlRmlndXJlIgotICAgICAgICAgIGNsYXNzQm9keT0iJiN4RDsmI3hBOyYjeEQ7JiN4QTsvKiomI3hEOyYjeEE7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsgKi8mI3hEOyYjeEE7cHVibGljIGNsYXNzIEFjdGl2aXR5UGFyYW1ldGVyTm9kZUZpZ3VyZSBleHRlbmRzIG9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmUgeyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHVibGljIEFjdGl2aXR5UGFyYW1ldGVyTm9kZUZpZ3VyZSgpIHsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4OTt0aGlzLnNldE91dGxpbmUoZmFsc2UpOyYjeEQ7JiN4QTsmI3g5OyYjeDk7Y3JlYXRlQ29udGVudHMoKTsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbnRlbnRzKCl7JiN4RDsmI3hBOyYjeDk7JiN4OTtvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZmlnXzAgPSBuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsKCk7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5OyYjeDk7c2V0RmlndXJlQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZUxhYmVsKGZpZ18wKTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeDk7T2JqZWN0IGxheURhdGEwID0gbnVsbDsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7JiN4OTt0aGlzLmFkZChmaWdfMCwgbGF5RGF0YTApOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCBmQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZUxhYmVsOyAmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3B1YmxpYyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZ2V0RmlndXJlQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZUxhYmVsKCkgeyYjeEQ7JiN4QTsmI3g5OyYjeDk7cmV0dXJuIGZBY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lTGFiZWw7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIHZvaWQgc2V0RmlndXJlQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZUxhYmVsKG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCBmaWcpeyYjeEQ7JiN4QTsmI3g5OyYjeDk7ZkFjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWVMYWJlbCA9IGZpZzsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIGJvb2xlYW4gbXlVc2VMb2NhbENvb3JkaW5hdGVzID0gZmFsc2U7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcm90ZWN0ZWQgYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKCkgeyYjeEQ7JiN4QTsmI3g5OyYjeDk7cmV0dXJuIG15VXNlTG9jYWxDb29yZGluYXRlczsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcm90ZWN0ZWQgdm9pZCBzZXRVc2VMb2NhbENvb3JkaW5hdGVzKGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcykgeyYjeEQ7JiN4QTsmI3g5OyYjeDk7bXlVc2VMb2NhbENvb3JkaW5hdGVzID0gdXNlTG9jYWxDb29yZGluYXRlczsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeEQ7JiN4QTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyI+Ci0gICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5kcmF3MmQ8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgIDwvdmlld21hcD4KLSAgICAgIDxtb2RlbEZhY2V0PgotICAgICAgICA8bWV0YUNsYXNzCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZ2VubW9kZWwjLy91bWwvQWN0aXZpdHlQYXJhbWV0ZXJOb2RlIi8+Ci0gICAgICAgIDxjb250YWlubWVudE1ldGFGZWF0dXJlCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZ2VubW9kZWwjLy91bWwvQWN0aXZpdHkvbm9kZSIvPgotICAgICAgICA8Y2hpbGRNZXRhRmVhdHVyZQotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmdlbm1vZGVsIy8vdW1sL0FjdGl2aXR5L25vZGUiLz4KLSAgICAgICAgPG1vZGVsRWxlbWVudFNlbGVjdG9yCi0gICAgICAgICAgICBib2R5PSJnZXRVbWFUeXBlX01pbGVzdG9uZSIKLSAgICAgICAgICAgIGxhbmd1YWdlPSJqYXZhIi8+Ci0gICAgICAgIDxtb2RlbEVsZW1lbnRJbml0aWFsaXplcgotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpHZW5GZWF0dXJlU2VxSW5pdGlhbGl6ZXIiPgotICAgICAgICAgIDxpbml0aWFsaXplcnMKLSAgICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpHZW5GZWF0dXJlVmFsdWVTcGVjIgotICAgICAgICAgICAgICBib2R5PSJjcmVhdGVVbWFUeXBlX01pbGVzdG9uZSIKLSAgICAgICAgICAgICAgbGFuZ3VhZ2U9ImphdmEiPgotICAgICAgICAgICAgPGZlYXR1cmUKLSAgICAgICAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZW1mLmVjb3JlL21vZGVsL0Vjb3JlLmdlbm1vZGVsIy8vZWNvcmUvRU1vZGVsRWxlbWVudC9lQW5ub3RhdGlvbnMiLz4KLSAgICAgICAgICA8L2luaXRpYWxpemVycz4KLSAgICAgICAgPC9tb2RlbEVsZW1lbnRJbml0aWFsaXplcj4KLSAgICAgIDwvbW9kZWxGYWNldD4KLSAgICAgIDxsYWJlbHMKLSAgICAgICAgICB2aXN1YWxJRD0iNDAxMSIKLSAgICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZTJFZGl0UGFydCIKLSAgICAgICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJBY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lMkl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiCi0gICAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZTJWaWV3RmFjdG9yeSI+Ci0gICAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzCi0gICAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+Ci0gICAgICAgIDx2aWV3bWFwCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlBhcmVudEFzc2lnbmVkVmlld21hcCIKLSAgICAgICAgICAgIGdldHRlck5hbWU9ImdldEZpZ3VyZUFjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWVMYWJlbCIKLSAgICAgICAgICAgIGZpZ3VyZVF1YWxpZmllZENsYXNzTmFtZT0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIi8+Ci0gICAgICAgIDxtb2RlbEZhY2V0Ci0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOkZlYXR1cmVMYWJlbE1vZGVsRmFjZXQiPgotICAgICAgICAgIDxtZXRhRmVhdHVyZXMKLSAgICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmdlbm1vZGVsIy8vdW1sL05hbWVkRWxlbWVudC9uYW1lIi8+Ci0gICAgICAgIDwvbW9kZWxGYWNldD4KLSAgICAgIDwvbGFiZWxzPgotICAgIDwvdG9wTGV2ZWxOb2Rlcz4KLSAgICA8bGlua3MKLSAgICAgICAgdmlzdWFsSUQ9IjMwMDEiCi0gICAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJDb250cm9sRmxvd0VkaXRQYXJ0IgotICAgICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJDb250cm9sRmxvd0l0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiCi0gICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9IkNvbnRyb2xGbG93Vmlld0ZhY3RvcnkiPgotICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MKLSAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9FZGdlIi8+Ci0gICAgICA8ZWxlbWVudFR5cGUKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOk1ldGFtb2RlbFR5cGUiCi0gICAgICAgICAgZWRpdEhlbHBlckNsYXNzTmFtZT0iQ29udHJvbEZsb3dFZGl0SGVscGVyIi8+Ci0gICAgICA8dmlld21hcAotICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46SW5uZXJDbGFzc1ZpZXdtYXAiCi0gICAgICAgICAgY2xhc3NOYW1lPSJDb250cm9sRmxvd0ZpZ3VyZSIKLSAgICAgICAgICBjbGFzc0JvZHk9IiYjeEQ7JiN4QTsmI3hEOyYjeEE7LyoqJiN4RDsmI3hBOyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7ICovJiN4RDsmI3hBO3B1YmxpYyBjbGFzcyBDb250cm9sRmxvd0ZpZ3VyZSBleHRlbmRzIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLlBvbHlsaW5lQ29ubmVjdGlvbkV4IHsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3B1YmxpYyBDb250cm9sRmxvd0ZpZ3VyZSgpIHsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7JiN4OTtzZXRUYXJnZXREZWNvcmF0aW9uKGNyZWF0ZVRhcmdldERlY29yYXRpb24oKSk7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3ByaXZhdGUgb3JnLmVjbGlwc2UuZHJhdzJkLlBvbHlsaW5lRGVjb3JhdGlvbiBjcmVhdGVUYXJnZXREZWNvcmF0aW9uKCkgeyYjeEQ7JiN4QTtvcmcuZWNsaXBzZS5kcmF3MmQuUG9seWxpbmVEZWNvcmF0aW9uIGRmID0gbmV3IG9yZy5lY2xpcHNlLmRyYXcyZC5Qb2x5bGluZURlY29yYXRpb24oKTsmI3hEOyYjeEE7Ly8gZGlzcGF0Y2hOZXh0PyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsmI3g5O29yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludExpc3QgcGwgPSBuZXcgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50TGlzdCgpOyYjeEQ7JiN4QTsmI3g5OyYjeDk7cGwuYWRkUG9pbnQoLTEsIDEpOyYjeEQ7JiN4QTsmI3g5OyYjeDk7cGwuYWRkUG9pbnQoMCwgMCk7JiN4RDsmI3hBOyYjeDk7JiN4OTtwbC5hZGRQb2ludCgtMSwgLTEpOyYjeEQ7JiN4QTsmI3g5OyYjeDk7ZGYuc2V0VGVtcGxhdGUocGwpOyYjeEQ7JiN4QTsmI3g5OyYjeDk7ZGYuc2V0U2NhbGUoZ2V0TWFwTW9kZSgpLkRQdG9MUCg3KSwgZ2V0TWFwTW9kZSgpLkRQdG9MUCgzKSk7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5OyYjeDk7cmV0dXJuIGRmOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4RDsmI3hBO30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7Ij4KLSAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmRyYXcyZDwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWk8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgPC92aWV3bWFwPgotICAgICAgPG1vZGVsRmFjZXQKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlR5cGVMaW5rTW9kZWxGYWNldCI+Ci0gICAgICAgIDxtZXRhQ2xhc3MKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5nZW5tb2RlbCMvL3VtbC9Db250cm9sRmxvdyIvPgotICAgICAgICA8Y29udGFpbm1lbnRNZXRhRmVhdHVyZQotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmdlbm1vZGVsIy8vdW1sL1N0cnVjdHVyZWRBY3Rpdml0eU5vZGUvZWRnZSIvPgotICAgICAgICA8Y2hpbGRNZXRhRmVhdHVyZQotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmdlbm1vZGVsIy8vdW1sL1N0cnVjdHVyZWRBY3Rpdml0eU5vZGUvZWRnZSIvPgotICAgICAgICA8c291cmNlTWV0YUZlYXR1cmUKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5nZW5tb2RlbCMvL3VtbC9BY3Rpdml0eUVkZ2Uvc291cmNlIi8+Ci0gICAgICAgIDx0YXJnZXRNZXRhRmVhdHVyZQotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmdlbm1vZGVsIy8vdW1sL0FjdGl2aXR5RWRnZS90YXJnZXQiLz4KLSAgICAgIDwvbW9kZWxGYWNldD4KLSAgICAgIDxsYWJlbHMKLSAgICAgICAgICB2aXN1YWxJRD0iNDAxMiIKLSAgICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iQ29udHJvbEZsb3dOYW1lRWRpdFBhcnQiCi0gICAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iQ29udHJvbEZsb3dOYW1lSXRlbVNlbWFudGljRWRpdFBvbGljeSIKLSAgICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJDb250cm9sRmxvd05hbWVWaWV3RmFjdG9yeSIKLSAgICAgICAgICBlbGVtZW50SWNvbj0idHJ1ZSI+Ci0gICAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzCi0gICAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+Ci0gICAgICAgIDx2aWV3bWFwCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOklubmVyQ2xhc3NWaWV3bWFwIgotICAgICAgICAgICAgY2xhc3NOYW1lPSJDb250cm9sRmxvd0xhYmVsRmlndXJlIgotICAgICAgICAgICAgY2xhc3NCb2R5PSImI3hEOyYjeEE7JiN4RDsmI3hBOy8qKiYjeEQ7JiN4QTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyAqLyYjeEQ7JiN4QTtwdWJsaWMgY2xhc3MgQ29udHJvbEZsb3dMYWJlbEZpZ3VyZSBleHRlbmRzIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCB7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwdWJsaWMgQ29udHJvbEZsb3dMYWJlbEZpZ3VyZSgpIHsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5OyYjeDk7dGhpcy5zZXRUZXh0KCZxdW90OyZxdW90Oyk7JiN4RDsmI3hBOyYjeDk7JiN4OTtjcmVhdGVDb250ZW50cygpOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIHZvaWQgY3JlYXRlQ29udGVudHMoKXsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3ByaXZhdGUgYm9vbGVhbiBteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSBmYWxzZTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3Byb3RlY3RlZCBib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMoKSB7JiN4RDsmI3hBOyYjeDk7JiN4OTtyZXR1cm4gbXlVc2VMb2NhbENvb3JkaW5hdGVzOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3Byb3RlY3RlZCB2b2lkIHNldFVzZUxvY2FsQ29vcmRpbmF0ZXMoYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKSB7JiN4RDsmI3hBOyYjeDk7JiN4OTtteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSB1c2VMb2NhbENvb3JkaW5hdGVzOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4RDsmI3hBO30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7Ij4KLSAgICAgICAgICA8YXR0cmlidXRlcwotICAgICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOkxhYmVsT2Zmc2V0QXR0cmlidXRlcyIKLSAgICAgICAgICAgICAgeT0iNDAiLz4KLSAgICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZHJhdzJkPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgICAgPC92aWV3bWFwPgotICAgICAgICA8bW9kZWxGYWNldAotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpGZWF0dXJlTGFiZWxNb2RlbEZhY2V0IgotICAgICAgICAgICAgdmlld1BhdHRlcm49IiIKLSAgICAgICAgICAgIGVkaXRQYXR0ZXJuPSIiPgotICAgICAgICAgIDxtZXRhRmVhdHVyZXMKLSAgICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmdlbm1vZGVsIy8vdW1sL05hbWVkRWxlbWVudC9uYW1lIi8+Ci0gICAgICAgIDwvbW9kZWxGYWNldD4KLSAgICAgIDwvbGFiZWxzPgotICAgIDwvbGlua3M+Ci0gICAgPGNvbXBhcnRtZW50cwotICAgICAgICB2aXN1YWxJRD0iNTAwMSIKLSAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9IkFjdGl2aXR5UGFydGl0aW9uUGFydGl0aW9uQ2FtcGFydG1lbnRFZGl0UGFydCIKLSAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iQWN0aXZpdHlQYXJ0aXRpb25QYXJ0aXRpb25DYW1wYXJ0bWVudEl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiCi0gICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9IkFjdGl2aXR5UGFydGl0aW9uUGFydGl0aW9uQ2FtcGFydG1lbnRWaWV3RmFjdG9yeSIKLSAgICAgICAgY2Fub25pY2FsRWRpdFBvbGljeUNsYXNzTmFtZT0iQWN0aXZpdHlQYXJ0aXRpb25QYXJ0aXRpb25DYW1wYXJ0bWVudENhbm9uaWNhbEVkaXRQb2xpY3kiCi0gICAgICAgIGNoaWxkTm9kZXM9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMCIKLSAgICAgICAgdGl0bGU9IlBhcnRpdGlvbkNhbXBhcnRtZW50IgotICAgICAgICBjYW5Db2xsYXBzZT0iZmFsc2UiCi0gICAgICAgIG5lZWRzVGl0bGU9ImZhbHNlIgotICAgICAgICBub2RlPSIvL0BkaWFncmFtL0B0b3BMZXZlbE5vZGVzLjciCi0gICAgICAgIGxpc3RMYXlvdXQ9ImZhbHNlIj4KLSAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzCi0gICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vTm9kZSIvPgotICAgICAgPHZpZXdtYXAKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOkZpZ3VyZVZpZXdtYXAiCi0gICAgICAgICAgZmlndXJlUXVhbGlmaWVkQ2xhc3NOYW1lPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmZpZ3VyZXMuUmVzaXphYmxlQ29tcGFydG1lbnRGaWd1cmUiPgotICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZHJhdzJkPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aTwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICA8L3ZpZXdtYXA+Ci0gICAgPC9jb21wYXJ0bWVudHM+Ci0gICAgPGNvbXBhcnRtZW50cwotICAgICAgICB2aXN1YWxJRD0iNTAwMiIKLSAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9IkFjdGl2aXR5UGFydGl0aW9uUGFydGl0aW9uQ2FtcGFydG1lbnQyRWRpdFBhcnQiCi0gICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IkFjdGl2aXR5UGFydGl0aW9uUGFydGl0aW9uQ2FtcGFydG1lbnQySXRlbVNlbWFudGljRWRpdFBvbGljeSIKLSAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iQWN0aXZpdHlQYXJ0aXRpb25QYXJ0aXRpb25DYW1wYXJ0bWVudDJWaWV3RmFjdG9yeSIKLSAgICAgICAgY2Fub25pY2FsRWRpdFBvbGljeUNsYXNzTmFtZT0iQWN0aXZpdHlQYXJ0aXRpb25QYXJ0aXRpb25DYW1wYXJ0bWVudDJDYW5vbmljYWxFZGl0UG9saWN5IgotICAgICAgICBjaGlsZE5vZGVzPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjAiCi0gICAgICAgIHRpdGxlPSJQYXJ0aXRpb25DYW1wYXJ0bWVudCIKLSAgICAgICAgY2FuQ29sbGFwc2U9ImZhbHNlIgotICAgICAgICBuZWVkc1RpdGxlPSJmYWxzZSIKLSAgICAgICAgbm9kZT0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4wIgotICAgICAgICBsaXN0TGF5b3V0PSJmYWxzZSI+Ci0gICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcwotICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL05vZGUiLz4KLSAgICAgIDx2aWV3bWFwCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpGaWd1cmVWaWV3bWFwIgotICAgICAgICAgIGZpZ3VyZVF1YWxpZmllZENsYXNzTmFtZT0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5maWd1cmVzLlJlc2l6YWJsZUNvbXBhcnRtZW50RmlndXJlIj4KLSAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmRyYXcyZDwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWk8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgPC92aWV3bWFwPgotICAgIDwvY29tcGFydG1lbnRzPgotICAgIDxwYWxldHRlPgotICAgICAgPGdyb3VwcwotICAgICAgICAgIHRpdGxlPSJGbG93cyIKLSAgICAgICAgICBkZXNjcmlwdGlvbj0iQ3JlYXRpb24gdG9vbCBmb3IgZmxvd3MiCi0gICAgICAgICAgY29sbGFwc2U9InRydWUiPgotICAgICAgICA8ZW50cmllcwotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpUb29sRW50cnkiCi0gICAgICAgICAgICB0aXRsZT0iQ29udHJvbCBGbG93IgotICAgICAgICAgICAgZGVzY3JpcHRpb249IkNyZWF0ZSBuZXcgQ29udHJvbCBGbG93IgotICAgICAgICAgICAgc21hbGxJY29uUGF0aD0iL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9pY29ucy9mdWxsL29iajE2L0NvbnRyb2xGbG93LmdpZiIKLSAgICAgICAgICAgIGdlbkxpbmtzPSIvL0BkaWFncmFtL0BsaW5rcy4wIi8+Ci0gICAgICA8L2dyb3Vwcz4KLSAgICAgIDxncm91cHMKLSAgICAgICAgICB0aXRsZT0iTm9kZXMiCi0gICAgICAgICAgZGVzY3JpcHRpb249IkNyZWF0aW9uIHRvb2wgZ3JvdXAgZm9yIG5vZGVzIgotICAgICAgICAgIGNvbGxhcHNlPSJ0cnVlIj4KLSAgICAgICAgPGVudHJpZXMKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46VG9vbEVudHJ5IgotICAgICAgICAgICAgdGl0bGU9IkFjdGl2aXR5IFBhcnRpdGlvbiIKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJDcmVhdGUgbmV3IEFjdGl2aXR5IFBhcnRpdGlvbiIKLSAgICAgICAgICAgIHNtYWxsSWNvblBhdGg9Ii9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvaWNvbnMvZnVsbC9vYmoxNi9BY3Rpdml0eVBhcnRpdGlvbi5naWYiCi0gICAgICAgICAgICBnZW5Ob2Rlcz0iLy9AZGlhZ3JhbS9AdG9wTGV2ZWxOb2Rlcy43IC8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMCIvPgotICAgICAgICA8ZW50cmllcwotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpUb29sRW50cnkiCi0gICAgICAgICAgICB0aXRsZT0iU3RhcnQgTm9kZSIKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJDcmVhdGUgbmV3IFN0YXJ0IE5vZGUiCi0gICAgICAgICAgICBzbWFsbEljb25QYXRoPSIvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL2ljb25zL2Z1bGwvb2JqMTYvSW5pdGlhbE5vZGUuZ2lmIgotICAgICAgICAgICAgZ2VuTm9kZXM9Ii8vQGRpYWdyYW0vQHRvcExldmVsTm9kZXMuMyIvPgotICAgICAgICA8ZW50cmllcwotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpUb29sRW50cnkiCi0gICAgICAgICAgICB0aXRsZT0iRm9yayBOb2RlIgotICAgICAgICAgICAgZGVzY3JpcHRpb249IkNyZWF0ZSBuZXcgRm9yayBOb2RlIgotICAgICAgICAgICAgc21hbGxJY29uUGF0aD0iL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9pY29ucy9mdWxsL29iajE2L0ZvcmtOb2RlLmdpZiIKLSAgICAgICAgICAgIGdlbk5vZGVzPSIvL0BkaWFncmFtL0B0b3BMZXZlbE5vZGVzLjIiLz4KLSAgICAgICAgPGVudHJpZXMKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46VG9vbEVudHJ5IgotICAgICAgICAgICAgdGl0bGU9Ik1lcmdlIE5vZGUiCi0gICAgICAgICAgICBkZXNjcmlwdGlvbj0iQ3JlYXRlIG5ldyBNZXJnZSBOb2RlIgotICAgICAgICAgICAgc21hbGxJY29uUGF0aD0iL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9pY29ucy9mdWxsL29iajE2L01lcmdlTm9kZS5naWYiCi0gICAgICAgICAgICBnZW5Ob2Rlcz0iLy9AZGlhZ3JhbS9AdG9wTGV2ZWxOb2Rlcy4xIi8+Ci0gICAgICAgIDxlbnRyaWVzCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlRvb2xFbnRyeSIKLSAgICAgICAgICAgIHRpdGxlPSJEZWNpc2lvbiBOb2RlIgotICAgICAgICAgICAgZGVzY3JpcHRpb249IkNyZWF0ZSBuZXcgRGVjaXNpb24gTm9kZSIKLSAgICAgICAgICAgIHNtYWxsSWNvblBhdGg9Ii9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvaWNvbnMvZnVsbC9vYmoxNi9EZWNpc2lvbk5vZGUuZ2lmIgotICAgICAgICAgICAgZ2VuTm9kZXM9Ii8vQGRpYWdyYW0vQHRvcExldmVsTm9kZXMuNCIvPgotICAgICAgICA8ZW50cmllcwotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpUb29sRW50cnkiCi0gICAgICAgICAgICB0aXRsZT0iRW5kIE5vZGUiCi0gICAgICAgICAgICBkZXNjcmlwdGlvbj0iQ3JlYXRlIG5ldyBFbmQgTm9kZSIKLSAgICAgICAgICAgIHNtYWxsSWNvblBhdGg9Ii9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvaWNvbnMvZnVsbC9vYmoxNi9BY3Rpdml0eUZpbmFsTm9kZS5naWYiCi0gICAgICAgICAgICBnZW5Ob2Rlcz0iLy9AZGlhZ3JhbS9AdG9wTGV2ZWxOb2Rlcy4wIi8+Ci0gICAgICAgIDxlbnRyaWVzCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlRvb2xFbnRyeSIKLSAgICAgICAgICAgIHRpdGxlPSJKb2luIE5vZGUiCi0gICAgICAgICAgICBkZXNjcmlwdGlvbj0iQ3JlYXRlIG5ldyBKb2luIE5vZGUiCi0gICAgICAgICAgICBzbWFsbEljb25QYXRoPSIvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL2ljb25zL2Z1bGwvb2JqMTYvSm9pbk5vZGUuZ2lmIgotICAgICAgICAgICAgZ2VuTm9kZXM9Ii8vQGRpYWdyYW0vQHRvcExldmVsTm9kZXMuNSIvPgotICAgICAgICA8ZW50cmllcwotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpTZXBhcmF0b3IiLz4KLSAgICAgICAgPGVudHJpZXMKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46VG9vbEVudHJ5IgotICAgICAgICAgICAgdGl0bGU9IkFjdGl2aXR5IgotICAgICAgICAgICAgZGVzY3JpcHRpb249IkNyZWF0ZSBuZXcgQWN0aXZpdHkiCi0gICAgICAgICAgICBzbWFsbEljb25QYXRoPSIvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL2ljb25zL2Z1bGwvb2JqMTYvQWN0aXZpdHkuZ2lmIgotICAgICAgICAgICAgZ2VuTm9kZXM9Ii8vQGRpYWdyYW0vQHRvcExldmVsTm9kZXMuNiIvPgotICAgICAgICA8ZW50cmllcwotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpUb29sRW50cnkiCi0gICAgICAgICAgICB0aXRsZT0iUGhhc2UiCi0gICAgICAgICAgICBkZXNjcmlwdGlvbj0iQ3JlYXRlIG5ldyBQaGFzZSIKLSAgICAgICAgICAgIHNtYWxsSWNvblBhdGg9Ii9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvaWNvbnMvZnVsbC9vYmoxNi9QaGFzZS5naWYiCi0gICAgICAgICAgICBnZW5Ob2Rlcz0iLy9AZGlhZ3JhbS9AdG9wTGV2ZWxOb2Rlcy45Ii8+Ci0gICAgICAgIDxlbnRyaWVzCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlRvb2xFbnRyeSIKLSAgICAgICAgICAgIHRpdGxlPSJJdGVyYXRpb24iCi0gICAgICAgICAgICBkZXNjcmlwdGlvbj0iQ3JlYXRlIG5ldyBJdGVyYXRpb24iCi0gICAgICAgICAgICBzbWFsbEljb25QYXRoPSIvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL2ljb25zL2Z1bGwvb2JqMTYvSXRlcmF0aW9uLmdpZiIKLSAgICAgICAgICAgIGdlbk5vZGVzPSIvL0BkaWFncmFtL0B0b3BMZXZlbE5vZGVzLjEwIi8+Ci0gICAgICAgIDxlbnRyaWVzCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlRvb2xFbnRyeSIKLSAgICAgICAgICAgIHRpdGxlPSJUYXNrIERlc2NyaXB0b3IiCi0gICAgICAgICAgICBkZXNjcmlwdGlvbj0iQ3JlYXRlIG5ldyBUYXNrIERlc2NyaXB0b3IiCi0gICAgICAgICAgICBzbWFsbEljb25QYXRoPSIvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL2ljb25zL2Z1bGwvb2JqMTYvVGFza0Rlc2NyaXB0b3IuZ2lmIgotICAgICAgICAgICAgZ2VuTm9kZXM9Ii8vQGRpYWdyYW0vQHRvcExldmVsTm9kZXMuOCIvPgotICAgICAgICA8ZW50cmllcwotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpUb29sRW50cnkiCi0gICAgICAgICAgICB0aXRsZT0iTWlsZXN0b25lIgotICAgICAgICAgICAgZGVzY3JpcHRpb249IkNyZWF0ZSBuZXcgTWlsZXN0b25lIgotICAgICAgICAgICAgc21hbGxJY29uUGF0aD0iL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9pY29ucy9mdWxsL29iajE2L01pbGVzdG9uZS5naWYiCi0gICAgICAgICAgICBnZW5Ob2Rlcz0iLy9AZGlhZ3JhbS9AdG9wTGV2ZWxOb2Rlcy4xMSIvPgotICAgICAgPC9ncm91cHM+Ci0gICAgPC9wYWxldHRlPgotICA8L2RpYWdyYW0+Ci0gIDxwbHVnaW4KLSAgICAgIGlEPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZCIKLSAgICAgIG5hbWU9IkVQRiBBY3Rpdml0eSBEaWFncmFtIgotICAgICAgcHJvdmlkZXI9IkVjbGlwc2Uub3JnIgotICAgICAgdmVyc2lvbj0iMS4yLjAucXVhbGlmaWVyIgotICAgICAgcHJpbnRpbmdFbmFibGVkPSJ0cnVlIgotICAgICAgYWN0aXZhdG9yQ2xhc3NOYW1lPSJBY3Rpdml0eURpYWdyYW1FZGl0b3JQbHVnaW4iLz4KLSAgPGVkaXRvcgotICAgICAgY2xhc3NOYW1lPSJBY3Rpdml0eURpYWdyYW1FZGl0b3IiLz4KLSAgPGRvbWFpbkdlbk1vZGVsCi0gICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZ2VubW9kZWwjLyIvPgotICA8ZXhwcmVzc2lvblByb3ZpZGVycz4KLSAgICA8cHJvdmlkZXJzCi0gICAgICAgIHhzaTp0eXBlPSJnbWZnZW46R2VuSmF2YUV4cHJlc3Npb25Qcm92aWRlciIKLSAgICAgICAgZXhwcmVzc2lvbnM9Ii8vQGRpYWdyYW0vQHRvcExldmVsTm9kZXMuNi9AbW9kZWxGYWNldC9AbW9kZWxFbGVtZW50U2VsZWN0b3IgLy9AZGlhZ3JhbS9AdG9wTGV2ZWxOb2Rlcy42L0Btb2RlbEZhY2V0L0Btb2RlbEVsZW1lbnRJbml0aWFsaXplci9AaW5pdGlhbGl6ZXJzLjAgLy9AZGlhZ3JhbS9AdG9wTGV2ZWxOb2Rlcy44L0Btb2RlbEZhY2V0L0Btb2RlbEVsZW1lbnRTZWxlY3RvciAvL0BkaWFncmFtL0B0b3BMZXZlbE5vZGVzLjgvQG1vZGVsRmFjZXQvQG1vZGVsRWxlbWVudEluaXRpYWxpemVyL0Bpbml0aWFsaXplcnMuMCAvL0BkaWFncmFtL0B0b3BMZXZlbE5vZGVzLjkvQG1vZGVsRmFjZXQvQG1vZGVsRWxlbWVudFNlbGVjdG9yIC8vQGRpYWdyYW0vQHRvcExldmVsTm9kZXMuOS9AbW9kZWxGYWNldC9AbW9kZWxFbGVtZW50SW5pdGlhbGl6ZXIvQGluaXRpYWxpemVycy4wIC8vQGRpYWdyYW0vQHRvcExldmVsTm9kZXMuMTAvQG1vZGVsRmFjZXQvQG1vZGVsRWxlbWVudFNlbGVjdG9yIC8vQGRpYWdyYW0vQHRvcExldmVsTm9kZXMuMTAvQG1vZGVsRmFjZXQvQG1vZGVsRWxlbWVudEluaXRpYWxpemVyL0Bpbml0aWFsaXplcnMuMCAvL0BkaWFncmFtL0B0b3BMZXZlbE5vZGVzLjExL0Btb2RlbEZhY2V0L0Btb2RlbEVsZW1lbnRTZWxlY3RvciAvL0BkaWFncmFtL0B0b3BMZXZlbE5vZGVzLjExL0Btb2RlbEZhY2V0L0Btb2RlbEVsZW1lbnRJbml0aWFsaXplci9AaW5pdGlhbGl6ZXJzLjAiLz4KLSAgPC9leHByZXNzaW9uUHJvdmlkZXJzPgotPC9nbWZnZW46R2VuRWRpdG9yR2VuZXJhdG9yPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvbW9kZWwvZXBmZGlhZ3JhbS5nbWZncmFwaCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL21vZGVsL2VwZmRpYWdyYW0uZ21mZ3JhcGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2MmY4ZGQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvbW9kZWwvZXBmZGlhZ3JhbS5nbWZncmFwaAorKysgL2Rldi9udWxsCkBAIC0xLDI3NiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGdtZmdyYXBoOkNhbnZhcyB4bWk6dmVyc2lvbj0iMi4wIgotICAgIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIKLSAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICAgIHhtbG5zOmdtZmdyYXBoPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2dtZi8yMDA2L0dyYXBoaWNhbERlZmluaXRpb24iIG5hbWU9InVtbCI+Ci0gIDxmaWd1cmVzCi0gICAgICBuYW1lPSJEZWZhdWx0Ij4KLSAgICA8ZGVzY3JpcHRvcnMKLSAgICAgICAgbmFtZT0iU3RydWN0dXJlZEFjdGl2aXR5Tm9kZUZpZ3VyZSI+Ci0gICAgICA8YWN0dWFsRmlndXJlCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdyYXBoOlJlY3RhbmdsZSIKLSAgICAgICAgICBuYW1lPSJTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlRmlndXJlIgotICAgICAgICAgIG91dGxpbmU9ImZhbHNlIj4KLSAgICAgICAgPGNoaWxkcmVuCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ3JhcGg6TGFiZWwiCi0gICAgICAgICAgICBuYW1lPSJOb2RlTmFtZUZpZ3VyZSIKLSAgICAgICAgICAgIHRleHQ9IiIvPgotICAgICAgPC9hY3R1YWxGaWd1cmU+Ci0gICAgICA8YWNjZXNzb3JzCi0gICAgICAgICAgZmlndXJlPSIvL0BmaWd1cmVzLjAvQGRlc2NyaXB0b3JzLjAvQGFjdHVhbEZpZ3VyZS9AY2hpbGRyZW4uMCIvPgotICAgIDwvZGVzY3JpcHRvcnM+Ci0gICAgPGRlc2NyaXB0b3JzCi0gICAgICAgIG5hbWU9IkFjdGl2aXR5UGFydGl0aW9uRmlndXJlIj4KLSAgICAgIDxhY3R1YWxGaWd1cmUKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ3JhcGg6UmVjdGFuZ2xlIgotICAgICAgICAgIG5hbWU9IkFjdGl2aXR5UGFydGl0aW9uRmlndXJlIj4KLSAgICAgICAgPGxheW91dERhdGEKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZncmFwaDpYWUxheW91dERhdGEiPgotICAgICAgICAgIDxzaXplCi0gICAgICAgICAgICAgIGR4PSIxMDAiCi0gICAgICAgICAgICAgIGR5PSIyMDAiLz4KLSAgICAgICAgPC9sYXlvdXREYXRhPgotICAgICAgICA8bGF5b3V0Ci0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ3JhcGg6WFlMYXlvdXQiLz4KLSAgICAgICAgPGZvcmVncm91bmRDb2xvcgotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdyYXBoOkNvbnN0YW50Q29sb3IiCi0gICAgICAgICAgICB2YWx1ZT0iYmxhY2siLz4KLSAgICAgICAgPGJhY2tncm91bmRDb2xvcgotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdyYXBoOlJHQkNvbG9yIgotICAgICAgICAgICAgcmVkPSIyNTUiCi0gICAgICAgICAgICBncmVlbj0iMjU1IgotICAgICAgICAgICAgYmx1ZT0iMjU1Ii8+Ci0gICAgICAgIDxwcmVmZXJyZWRTaXplCi0gICAgICAgICAgICBkeD0iMzAwIgotICAgICAgICAgICAgZHk9IjYwMCIvPgotICAgICAgICA8Ym9yZGVyCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ3JhcGg6TGluZUJvcmRlciIvPgotICAgICAgICA8c2l6ZQotICAgICAgICAgICAgeD0iMzAwIgotICAgICAgICAgICAgeT0iNjAwIi8+Ci0gICAgICAgIDxjaGlsZHJlbgotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdyYXBoOkxhYmVsIgotICAgICAgICAgICAgbmFtZT0iUGFydGl0aW9uTGFiZWxGaWd1cmUiLz4KLSAgICAgIDwvYWN0dWFsRmlndXJlPgotICAgICAgPGFjY2Vzc29ycwotICAgICAgICAgIGZpZ3VyZT0iLy9AZmlndXJlcy4wL0BkZXNjcmlwdG9ycy4xL0BhY3R1YWxGaWd1cmUvQGNoaWxkcmVuLjAiLz4KLSAgICA8L2Rlc2NyaXB0b3JzPgotICAgIDxkZXNjcmlwdG9ycwotICAgICAgICBuYW1lPSJDb250cm9sRmxvd0ZpZ3VyZSI+Ci0gICAgICA8YWN0dWFsRmlndXJlCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdyYXBoOlBvbHlsaW5lQ29ubmVjdGlvbiIKLSAgICAgICAgICBuYW1lPSJDb250cm9sRmxvd0ZpZ3VyZSIKLSAgICAgICAgICB0YXJnZXREZWNvcmF0aW9uPSIvL0BmaWd1cmVzLjAvQGRlc2NyaXB0b3JzLjIvQGFjdHVhbEZpZ3VyZS9AY2hpbGRyZW4uMCI+Ci0gICAgICAgIDxjaGlsZHJlbgotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdyYXBoOlBvbHlsaW5lRGVjb3JhdGlvbiIKLSAgICAgICAgICAgIG5hbWU9Ik9wZW5BcnJvdyI+Ci0gICAgICAgICAgPHRlbXBsYXRlCi0gICAgICAgICAgICAgIHg9Ii0xIgotICAgICAgICAgICAgICB5PSIxIi8+Ci0gICAgICAgICAgPHRlbXBsYXRlLz4KLSAgICAgICAgICA8dGVtcGxhdGUKLSAgICAgICAgICAgICAgeD0iLTEiCi0gICAgICAgICAgICAgIHk9Ii0xIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbgotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdyYXBoOkxhYmVsIgotICAgICAgICAgICAgbmFtZT0iQ29udHJvbEZsb3dMYWJlbEZpZ3VyZSIKLSAgICAgICAgICAgIHRleHQ9IiIvPgotICAgICAgPC9hY3R1YWxGaWd1cmU+Ci0gICAgICA8YWNjZXNzb3JzCi0gICAgICAgICAgZmlndXJlPSIvL0BmaWd1cmVzLjAvQGRlc2NyaXB0b3JzLjIvQGFjdHVhbEZpZ3VyZS9AY2hpbGRyZW4uMSIvPgotICAgIDwvZGVzY3JpcHRvcnM+Ci0gICAgPGRlc2NyaXB0b3JzCi0gICAgICAgIG5hbWU9IkZvcmtOb2RlRmlndXJlIj4KLSAgICAgIDxhY3R1YWxGaWd1cmUKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ3JhcGg6UmVjdGFuZ2xlIgotICAgICAgICAgIG5hbWU9IkZvcmtOb2RlRmlndXJlIj4KLSAgICAgICAgPGJhY2tncm91bmRDb2xvcgotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdyYXBoOlJHQkNvbG9yIgotICAgICAgICAgICAgcmVkPSI0NSIKLSAgICAgICAgICAgIGdyZWVuPSI4NSIKLSAgICAgICAgICAgIGJsdWU9IjEzMCIvPgotICAgICAgICA8cHJlZmVycmVkU2l6ZQotICAgICAgICAgICAgZHg9IjEwMCIKLSAgICAgICAgICAgIGR5PSI1Ii8+Ci0gICAgICAgIDxzaXplCi0gICAgICAgICAgICB4PSIxMDAiCi0gICAgICAgICAgICB5PSI1Ii8+Ci0gICAgICA8L2FjdHVhbEZpZ3VyZT4KLSAgICA8L2Rlc2NyaXB0b3JzPgotICAgIDxkZXNjcmlwdG9ycwotICAgICAgICBuYW1lPSJFbmROb2RlRmlndXJlIj4KLSAgICAgIDxhY3R1YWxGaWd1cmUKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ3JhcGg6Q3VzdG9tRmlndXJlIgotICAgICAgICAgIG5hbWU9IkVuZE5vZGVGaWd1cmUiCi0gICAgICAgICAgcXVhbGlmaWVkQ2xhc3NOYW1lPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5jdXN0b20uZmlndXJlcy5FbmROb2RlRmlndXJlIj4KLSAgICAgICAgPGZvcmVncm91bmRDb2xvcgotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdyYXBoOkNvbnN0YW50Q29sb3IiCi0gICAgICAgICAgICB2YWx1ZT0iZGFya0JsdWUiLz4KLSAgICAgICAgPGJhY2tncm91bmRDb2xvcgotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdyYXBoOlJHQkNvbG9yIgotICAgICAgICAgICAgcmVkPSI0NSIKLSAgICAgICAgICAgIGdyZWVuPSI4NSIKLSAgICAgICAgICAgIGJsdWU9IjEzMCIvPgotICAgICAgICA8cHJlZmVycmVkU2l6ZQotICAgICAgICAgICAgZHg9IjI0IgotICAgICAgICAgICAgZHk9IjI0Ii8+Ci0gICAgICAgIDxzaXplCi0gICAgICAgICAgICB4PSIyNCIKLSAgICAgICAgICAgIHk9IjI0Ii8+Ci0gICAgICA8L2FjdHVhbEZpZ3VyZT4KLSAgICA8L2Rlc2NyaXB0b3JzPgotICAgIDxkZXNjcmlwdG9ycwotICAgICAgICBuYW1lPSJEZWNpc2lvbkRpYW1vbmRGaWd1cmUiPgotICAgICAgPGFjdHVhbEZpZ3VyZQotICAgICAgICAgIHhzaTp0eXBlPSJnbWZncmFwaDpDdXN0b21GaWd1cmUiCi0gICAgICAgICAgbmFtZT0iRGVjaXNpb25EaWFtb25kRmlndXJlIgotICAgICAgICAgIHF1YWxpZmllZENsYXNzTmFtZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuY3VzdG9tLmZpZ3VyZXMuRGVjaXNpb25Ob2RlRmlndXJlIj4KLSAgICAgICAgPGZvcmVncm91bmRDb2xvcgotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdyYXBoOkNvbnN0YW50Q29sb3IiCi0gICAgICAgICAgICB2YWx1ZT0iZGFya0JsdWUiLz4KLSAgICAgICAgPGJhY2tncm91bmRDb2xvcgotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdyYXBoOlJHQkNvbG9yIgotICAgICAgICAgICAgcmVkPSIxODUiCi0gICAgICAgICAgICBncmVlbj0iMjA1IgotICAgICAgICAgICAgYmx1ZT0iMjMwIi8+Ci0gICAgICAgIDxwcmVmZXJyZWRTaXplCi0gICAgICAgICAgICBkeD0iNTAiCi0gICAgICAgICAgICBkeT0iNTAiLz4KLSAgICAgICAgPHNpemUKLSAgICAgICAgICAgIHg9IjUwIgotICAgICAgICAgICAgeT0iNTAiLz4KLSAgICAgICAgPGNoaWxkcmVuCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ3JhcGg6TGFiZWwiCi0gICAgICAgICAgICBuYW1lPSJEaWFtb25kTGFiZWwiLz4KLSAgICAgIDwvYWN0dWFsRmlndXJlPgotICAgIDwvZGVzY3JpcHRvcnM+Ci0gICAgPGRlc2NyaXB0b3JzCi0gICAgICAgIG5hbWU9IkluaXRpYWxOb2RlRmlndXJlIj4KLSAgICAgIDxhY3R1YWxGaWd1cmUKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ3JhcGg6RWxsaXBzZSIKLSAgICAgICAgICBuYW1lPSJJbml0aWFsTm9kZUZpZ3VyZSI+Ci0gICAgICAgIDxmb3JlZ3JvdW5kQ29sb3IKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZncmFwaDpDb25zdGFudENvbG9yIgotICAgICAgICAgICAgdmFsdWU9ImRhcmtCbHVlIi8+Ci0gICAgICAgIDxiYWNrZ3JvdW5kQ29sb3IKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZncmFwaDpSR0JDb2xvciIKLSAgICAgICAgICAgIHJlZD0iNDUiCi0gICAgICAgICAgICBncmVlbj0iODUiCi0gICAgICAgICAgICBibHVlPSIxMzAiLz4KLSAgICAgICAgPHByZWZlcnJlZFNpemUKLSAgICAgICAgICAgIGR4PSIyMCIKLSAgICAgICAgICAgIGR5PSIyMCIvPgotICAgICAgICA8c2l6ZQotICAgICAgICAgICAgeD0iMjAiCi0gICAgICAgICAgICB5PSIyMCIvPgotICAgICAgPC9hY3R1YWxGaWd1cmU+Ci0gICAgPC9kZXNjcmlwdG9ycz4KLSAgICA8ZGVzY3JpcHRvcnMKLSAgICAgICAgbmFtZT0iR2VuZXJpY0xhYmVsRmlndXJlIj4KLSAgICAgIDxhY3R1YWxGaWd1cmUKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ3JhcGg6TGFiZWwiCi0gICAgICAgICAgbmFtZT0iR2VuZXJpY0xhYmVsRmlndXJlIi8+Ci0gICAgPC9kZXNjcmlwdG9ycz4KLSAgICA8ZGVzY3JpcHRvcnMKLSAgICAgICAgbmFtZT0iUmVzaXplYWJsZUNvbXBhcnRtZW50RmlndXJlRXgiPgotICAgICAgPGFjdHVhbEZpZ3VyZQotICAgICAgICAgIHhzaTp0eXBlPSJnbWZncmFwaDpDdXN0b21GaWd1cmUiCi0gICAgICAgICAgbmFtZT0iUmVzaXplYWJsZUNvbXBhcnRtZW50RmlndXJlRXgiCi0gICAgICAgICAgcXVhbGlmaWVkQ2xhc3NOYW1lPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmZpZ3VyZXMuUmVzaXphYmxlQ29tcGFydG1lbnRGaWd1cmUiLz4KLSAgICA8L2Rlc2NyaXB0b3JzPgotICAgIDxkZXNjcmlwdG9ycwotICAgICAgICBuYW1lPSJBY3Rpdml0eVBhcmFtZXRlck5vZGVGaWd1cmUiPgotICAgICAgPGFjdHVhbEZpZ3VyZQotICAgICAgICAgIHhzaTp0eXBlPSJnbWZncmFwaDpSZWN0YW5nbGUiCi0gICAgICAgICAgbmFtZT0iQWN0aXZpdHlQYXJhbWV0ZXJOb2RlRmlndXJlIgotICAgICAgICAgIG91dGxpbmU9ImZhbHNlIj4KLSAgICAgICAgPGNoaWxkcmVuCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ3JhcGg6TGFiZWwiCi0gICAgICAgICAgICBuYW1lPSJBY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lTGFiZWwiLz4KLSAgICAgIDwvYWN0dWFsRmlndXJlPgotICAgICAgPGFjY2Vzc29ycwotICAgICAgICAgIGZpZ3VyZT0iLy9AZmlndXJlcy4wL0BkZXNjcmlwdG9ycy45L0BhY3R1YWxGaWd1cmUvQGNoaWxkcmVuLjAiLz4KLSAgICA8L2Rlc2NyaXB0b3JzPgotICA8L2ZpZ3VyZXM+Ci0gIDxub2RlcwotICAgICAgbmFtZT0iU3RydWN0dXJlZEFjdGl2aXR5Tm9kZSIKLSAgICAgIGZpZ3VyZT0iU3RydWN0dXJlZEFjdGl2aXR5Tm9kZUZpZ3VyZSIvPgotICA8bm9kZXMKLSAgICAgIG5hbWU9IkFjdGl2aXR5UGFydGl0aW9uIgotICAgICAgZmlndXJlPSJBY3Rpdml0eVBhcnRpdGlvbkZpZ3VyZSIvPgotICA8bm9kZXMKLSAgICAgIG5hbWU9IkluaXRpYWxOb2RlIgotICAgICAgZmlndXJlPSJJbml0aWFsTm9kZUZpZ3VyZSIvPgotICA8bm9kZXMKLSAgICAgIG5hbWU9IkZvcmtOb2RlIgotICAgICAgZmlndXJlPSJGb3JrTm9kZUZpZ3VyZSIKLSAgICAgIHJlc2l6ZUNvbnN0cmFpbnQ9IkVBU1RfV0VTVCIvPgotICA8bm9kZXMKLSAgICAgIG5hbWU9Ik1lcmdlTm9kZSIKLSAgICAgIGZpZ3VyZT0iRGVjaXNpb25EaWFtb25kRmlndXJlIi8+Ci0gIDxub2RlcwotICAgICAgbmFtZT0iRGVjaXNpb25Ob2RlIgotICAgICAgZmlndXJlPSJEZWNpc2lvbkRpYW1vbmRGaWd1cmUiLz4KLSAgPG5vZGVzCi0gICAgICBuYW1lPSJBY3Rpdml0eUZpbmFsTm9kZSIKLSAgICAgIGZpZ3VyZT0iRW5kTm9kZUZpZ3VyZSIvPgotICA8bm9kZXMKLSAgICAgIG5hbWU9IkpvaW5Ob2RlIgotICAgICAgZmlndXJlPSJGb3JrTm9kZUZpZ3VyZSIKLSAgICAgIHJlc2l6ZUNvbnN0cmFpbnQ9IkVBU1RfV0VTVCIvPgotICA8bm9kZXMKLSAgICAgIG5hbWU9IkFjdGl2aXR5UGFyYW1ldGVyTm9kZSIKLSAgICAgIGZpZ3VyZT0iQWN0aXZpdHlQYXJhbWV0ZXJOb2RlRmlndXJlIi8+Ci0gIDxjb25uZWN0aW9ucwotICAgICAgbmFtZT0iQ29udHJvbEZsb3ciCi0gICAgICBmaWd1cmU9IkNvbnRyb2xGbG93RmlndXJlIi8+Ci0gIDxjb21wYXJ0bWVudHMKLSAgICAgIG5hbWU9IlBhcnRpdGlvbkNhbXBhcnRtZW50IgotICAgICAgZmlndXJlPSJSZXNpemVhYmxlQ29tcGFydG1lbnRGaWd1cmVFeCIvPgotICA8bGFiZWxzCi0gICAgICBuYW1lPSJOb2RlTmFtZSIKLSAgICAgIGZpZ3VyZT0iU3RydWN0dXJlZEFjdGl2aXR5Tm9kZUZpZ3VyZSIKLSAgICAgIGFjY2Vzc29yPSIvL0BmaWd1cmVzLjAvQGRlc2NyaXB0b3JzLjAvQGFjY2Vzc29ycy4wIi8+Ci0gIDxsYWJlbHMKLSAgICAgIG5hbWU9IlBhcnRpdGlvbk5hbWUiCi0gICAgICBmaWd1cmU9IkFjdGl2aXR5UGFydGl0aW9uRmlndXJlIgotICAgICAgYWNjZXNzb3I9Ii8vQGZpZ3VyZXMuMC9AZGVzY3JpcHRvcnMuMS9AYWNjZXNzb3JzLjAiLz4KLSAgPGxhYmVscwotICAgICAgbmFtZT0iQ29udHJvbEZsb3dMYWJlbCIKLSAgICAgIGZpZ3VyZT0iQ29udHJvbEZsb3dGaWd1cmUiCi0gICAgICByZXNpemVDb25zdHJhaW50PSJFQVNUX1dFU1QiCi0gICAgICBhY2Nlc3Nvcj0iLy9AZmlndXJlcy4wL0BkZXNjcmlwdG9ycy4yL0BhY2Nlc3NvcnMuMCIvPgotICA8bGFiZWxzCi0gICAgICBuYW1lPSJNZXJnZU5vZGVQb2x5Z29uTGFiZWwiLz4KLSAgPGxhYmVscwotICAgICAgbmFtZT0iR2VuZXJpY0xhYmVsIgotICAgICAgZmlndXJlPSJHZW5lcmljTGFiZWxGaWd1cmUiCi0gICAgICByZXNpemVDb25zdHJhaW50PSJFQVNUX1dFU1QiCi0gICAgICBlbGVtZW50SWNvbj0iZmFsc2UiLz4KLSAgPGxhYmVscwotICAgICAgbmFtZT0iQWN0aXZpdHlOb2RlTmFtZSIKLSAgICAgIGZpZ3VyZT0iU3RydWN0dXJlZEFjdGl2aXR5Tm9kZUZpZ3VyZSIKLSAgICAgIGVsZW1lbnRJY29uPSJmYWxzZSIKLSAgICAgIGFjY2Vzc29yPSIvL0BmaWd1cmVzLjAvQGRlc2NyaXB0b3JzLjAvQGFjY2Vzc29ycy4wIi8+Ci0gIDxsYWJlbHMKLSAgICAgIG5hbWU9IkluaXRpYWxOb2RlTmFtZSIKLSAgICAgIGZpZ3VyZT0iU3RydWN0dXJlZEFjdGl2aXR5Tm9kZUZpZ3VyZSIKLSAgICAgIGVsZW1lbnRJY29uPSJmYWxzZSIKLSAgICAgIGFjY2Vzc29yPSIvL0BmaWd1cmVzLjAvQGRlc2NyaXB0b3JzLjAvQGFjY2Vzc29ycy4wIi8+Ci0gIDxsYWJlbHMKLSAgICAgIG5hbWU9IkZvcmtOb2RlTmFtZSIKLSAgICAgIGZpZ3VyZT0iU3RydWN0dXJlZEFjdGl2aXR5Tm9kZUZpZ3VyZSIKLSAgICAgIGVsZW1lbnRJY29uPSJmYWxzZSIKLSAgICAgIGFjY2Vzc29yPSIvL0BmaWd1cmVzLjAvQGRlc2NyaXB0b3JzLjAvQGFjY2Vzc29ycy4wIi8+Ci0gIDxsYWJlbHMKLSAgICAgIG5hbWU9IkRlY2lzaW9uTm9kZU5hbWUiCi0gICAgICBmaWd1cmU9IlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVGaWd1cmUiCi0gICAgICBlbGVtZW50SWNvbj0iZmFsc2UiCi0gICAgICBhY2Nlc3Nvcj0iLy9AZmlndXJlcy4wL0BkZXNjcmlwdG9ycy4wL0BhY2Nlc3NvcnMuMCIvPgotICA8bGFiZWxzCi0gICAgICBuYW1lPSJBY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lIgotICAgICAgZmlndXJlPSJBY3Rpdml0eVBhcmFtZXRlck5vZGVGaWd1cmUiCi0gICAgICBlbGVtZW50SWNvbj0iZmFsc2UiCi0gICAgICBhY2Nlc3Nvcj0iLy9AZmlndXJlcy4wL0BkZXNjcmlwdG9ycy45L0BhY2Nlc3NvcnMuMCIvPgotPC9nbWZncmFwaDpDYW52YXM+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9tb2RlbC9lcGZkaWFncmFtLmdtZm1hcCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL21vZGVsL2VwZmRpYWdyYW0uZ21mbWFwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYzQ2OTU0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL21vZGVsL2VwZmRpYWdyYW0uZ21mbWFwCisrKyAvZGV2L251bGwKQEAgLTEsMzU1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Z21mbWFwOk1hcHBpbmcgeG1pOnZlcnNpb249IjIuMCIKLSAgICB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiCi0gICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgICB4bWxuczplY29yZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSIKLSAgICB4bWxuczpnbWZtYXA9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZ21mLzIwMDYvbWFwcGluZ3MiCi0gICAgeG1sbnM6Z21mdG9vbD0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9nbWYvMjAwNS9Ub29sRGVmaW5pdGlvbiI+Ci0gIDxub2Rlcz4KLSAgICA8Y29udGFpbm1lbnRGZWF0dXJlCi0gICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5lY29yZSMvL0FjdGl2aXR5L25vZGUiLz4KLSAgICA8b3duZWRDaGlsZD4KLSAgICAgIDxkb21haW5NZXRhRWxlbWVudAotICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5lY29yZSMvL0FjdGl2aXR5RmluYWxOb2RlIi8+Ci0gICAgICA8bGFiZWxNYXBwaW5ncwotICAgICAgICAgIHhzaTp0eXBlPSJnbWZtYXA6RmVhdHVyZUxhYmVsTWFwcGluZyIKLSAgICAgICAgICB2aWV3UGF0dGVybj0iIj4KLSAgICAgICAgPGRpYWdyYW1MYWJlbAotICAgICAgICAgICAgaHJlZj0iZXBmZGlhZ3JhbS5nbWZncmFwaCNHZW5lcmljTGFiZWwiLz4KLSAgICAgICAgPGZlYXR1cmVzCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZWNvcmUjLy9OYW1lZEVsZW1lbnQvbmFtZSIvPgotICAgICAgPC9sYWJlbE1hcHBpbmdzPgotICAgICAgPHRvb2wKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mdG9vbDpDcmVhdGlvblRvb2wiCi0gICAgICAgICAgaHJlZj0iZXBmZGlhZ3JhbS5nbWZ0b29sIy8vQHBhbGV0dGUvQHRvb2xzLjEvQHRvb2xzLjUiLz4KLSAgICAgIDxkaWFncmFtTm9kZQotICAgICAgICAgIGhyZWY9ImVwZmRpYWdyYW0uZ21mZ3JhcGgjQWN0aXZpdHlGaW5hbE5vZGUiLz4KLSAgICA8L293bmVkQ2hpbGQ+Ci0gIDwvbm9kZXM+Ci0gIDxub2Rlcz4KLSAgICA8Y29udGFpbm1lbnRGZWF0dXJlCi0gICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5lY29yZSMvL0FjdGl2aXR5L25vZGUiLz4KLSAgICA8b3duZWRDaGlsZD4KLSAgICAgIDxkb21haW5NZXRhRWxlbWVudAotICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5lY29yZSMvL01lcmdlTm9kZSIvPgotICAgICAgPGxhYmVsTWFwcGluZ3MKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mbWFwOkZlYXR1cmVMYWJlbE1hcHBpbmciCi0gICAgICAgICAgdmlld1BhdHRlcm49IiI+Ci0gICAgICAgIDxkaWFncmFtTGFiZWwKLSAgICAgICAgICAgIGhyZWY9ImVwZmRpYWdyYW0uZ21mZ3JhcGgjRGVjaXNpb25Ob2RlTmFtZSIvPgotICAgICAgICA8ZmVhdHVyZXMKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5lY29yZSMvL05hbWVkRWxlbWVudC9uYW1lIi8+Ci0gICAgICA8L2xhYmVsTWFwcGluZ3M+Ci0gICAgICA8dG9vbAotICAgICAgICAgIHhzaTp0eXBlPSJnbWZ0b29sOkNyZWF0aW9uVG9vbCIKLSAgICAgICAgICBocmVmPSJlcGZkaWFncmFtLmdtZnRvb2wjLy9AcGFsZXR0ZS9AdG9vbHMuMS9AdG9vbHMuMyIvPgotICAgICAgPGRpYWdyYW1Ob2RlCi0gICAgICAgICAgaHJlZj0iZXBmZGlhZ3JhbS5nbWZncmFwaCNNZXJnZU5vZGUiLz4KLSAgICA8L293bmVkQ2hpbGQ+Ci0gIDwvbm9kZXM+Ci0gIDxub2Rlcz4KLSAgICA8Y29udGFpbm1lbnRGZWF0dXJlCi0gICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5lY29yZSMvL0FjdGl2aXR5L25vZGUiLz4KLSAgICA8b3duZWRDaGlsZD4KLSAgICAgIDxkb21haW5NZXRhRWxlbWVudAotICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5lY29yZSMvL0ZvcmtOb2RlIi8+Ci0gICAgICA8dG9vbAotICAgICAgICAgIHhzaTp0eXBlPSJnbWZ0b29sOkNyZWF0aW9uVG9vbCIKLSAgICAgICAgICBocmVmPSJlcGZkaWFncmFtLmdtZnRvb2wjLy9AcGFsZXR0ZS9AdG9vbHMuMS9AdG9vbHMuMiIvPgotICAgICAgPGRpYWdyYW1Ob2RlCi0gICAgICAgICAgaHJlZj0iZXBmZGlhZ3JhbS5nbWZncmFwaCNGb3JrTm9kZSIvPgotICAgIDwvb3duZWRDaGlsZD4KLSAgPC9ub2Rlcz4KLSAgPG5vZGVzPgotICAgIDxjb250YWlubWVudEZlYXR1cmUKLSAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmVjb3JlIy8vQWN0aXZpdHkvbm9kZSIvPgotICAgIDxvd25lZENoaWxkPgotICAgICAgPGRvbWFpbk1ldGFFbGVtZW50Ci0gICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmVjb3JlIy8vSW5pdGlhbE5vZGUiLz4KLSAgICAgIDxsYWJlbE1hcHBpbmdzCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZm1hcDpGZWF0dXJlTGFiZWxNYXBwaW5nIgotICAgICAgICAgIHZpZXdQYXR0ZXJuPSIiPgotICAgICAgICA8ZGlhZ3JhbUxhYmVsCi0gICAgICAgICAgICBocmVmPSJlcGZkaWFncmFtLmdtZmdyYXBoI0dlbmVyaWNMYWJlbCIvPgotICAgICAgICA8ZmVhdHVyZXMKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5lY29yZSMvL05hbWVkRWxlbWVudC9uYW1lIi8+Ci0gICAgICA8L2xhYmVsTWFwcGluZ3M+Ci0gICAgICA8dG9vbAotICAgICAgICAgIHhzaTp0eXBlPSJnbWZ0b29sOkNyZWF0aW9uVG9vbCIKLSAgICAgICAgICBocmVmPSJlcGZkaWFncmFtLmdtZnRvb2wjLy9AcGFsZXR0ZS9AdG9vbHMuMS9AdG9vbHMuMSIvPgotICAgICAgPGRpYWdyYW1Ob2RlCi0gICAgICAgICAgaHJlZj0iZXBmZGlhZ3JhbS5nbWZncmFwaCNJbml0aWFsTm9kZSIvPgotICAgIDwvb3duZWRDaGlsZD4KLSAgPC9ub2Rlcz4KLSAgPG5vZGVzPgotICAgIDxjb250YWlubWVudEZlYXR1cmUKLSAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmVjb3JlIy8vQWN0aXZpdHkvbm9kZSIvPgotICAgIDxvd25lZENoaWxkPgotICAgICAgPGRvbWFpbk1ldGFFbGVtZW50Ci0gICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmVjb3JlIy8vRGVjaXNpb25Ob2RlIi8+Ci0gICAgICA8bGFiZWxNYXBwaW5ncwotICAgICAgICAgIHhzaTp0eXBlPSJnbWZtYXA6RmVhdHVyZUxhYmVsTWFwcGluZyIKLSAgICAgICAgICB2aWV3UGF0dGVybj0iIj4KLSAgICAgICAgPGRpYWdyYW1MYWJlbAotICAgICAgICAgICAgaHJlZj0iZXBmZGlhZ3JhbS5nbWZncmFwaCNEZWNpc2lvbk5vZGVOYW1lIi8+Ci0gICAgICAgIDxmZWF0dXJlcwotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmVjb3JlIy8vTmFtZWRFbGVtZW50L25hbWUiLz4KLSAgICAgIDwvbGFiZWxNYXBwaW5ncz4KLSAgICAgIDx0b29sCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZnRvb2w6Q3JlYXRpb25Ub29sIgotICAgICAgICAgIGhyZWY9ImVwZmRpYWdyYW0uZ21mdG9vbCMvL0BwYWxldHRlL0B0b29scy4xL0B0b29scy40Ii8+Ci0gICAgICA8ZGlhZ3JhbU5vZGUKLSAgICAgICAgICBocmVmPSJlcGZkaWFncmFtLmdtZmdyYXBoI0RlY2lzaW9uTm9kZSIvPgotICAgIDwvb3duZWRDaGlsZD4KLSAgPC9ub2Rlcz4KLSAgPG5vZGVzPgotICAgIDxjb250YWlubWVudEZlYXR1cmUKLSAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmVjb3JlIy8vQWN0aXZpdHkvbm9kZSIvPgotICAgIDxvd25lZENoaWxkPgotICAgICAgPGRvbWFpbk1ldGFFbGVtZW50Ci0gICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmVjb3JlIy8vSm9pbk5vZGUiLz4KLSAgICAgIDx0b29sCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZnRvb2w6Q3JlYXRpb25Ub29sIgotICAgICAgICAgIGhyZWY9ImVwZmRpYWdyYW0uZ21mdG9vbCMvL0BwYWxldHRlL0B0b29scy4xL0B0b29scy42Ii8+Ci0gICAgICA8ZGlhZ3JhbU5vZGUKLSAgICAgICAgICBocmVmPSJlcGZkaWFncmFtLmdtZmdyYXBoI0pvaW5Ob2RlIi8+Ci0gICAgPC9vd25lZENoaWxkPgotICA8L25vZGVzPgotICA8bm9kZXM+Ci0gICAgPGNvbnRhaW5tZW50RmVhdHVyZQotICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZWNvcmUjLy9BY3Rpdml0eS9ub2RlIi8+Ci0gICAgPG93bmVkQ2hpbGQ+Ci0gICAgICA8ZG9tYWluTWV0YUVsZW1lbnQKLSAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZWNvcmUjLy9TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlIi8+Ci0gICAgICA8ZG9tYWluU3BlY2lhbGl6YXRpb24KLSAgICAgICAgICBib2R5PSJnZXRVbWFUeXBlX0FjdGl2aXR5IgotICAgICAgICAgIGxhbmd1YWdlPSJqYXZhIi8+Ci0gICAgICA8ZG9tYWluSW5pdGlhbGl6ZXIKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mbWFwOkZlYXR1cmVTZXFJbml0aWFsaXplciI+Ci0gICAgICAgIDxpbml0aWFsaXplcnMKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZtYXA6RmVhdHVyZVZhbHVlU3BlYyIKLSAgICAgICAgICAgIGJvZHk9ImNyZWF0ZVVtYVR5cGVfQWN0aXZpdHkmI3hEOyYjeEE7IgotICAgICAgICAgICAgbGFuZ3VhZ2U9ImphdmEiPgotICAgICAgICAgIDxmZWF0dXJlCi0gICAgICAgICAgICAgIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIgotICAgICAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZW1mLmVjb3JlL21vZGVsL0Vjb3JlLmVjb3JlIy8vRU1vZGVsRWxlbWVudC9lQW5ub3RhdGlvbnMiLz4KLSAgICAgICAgPC9pbml0aWFsaXplcnM+Ci0gICAgICA8L2RvbWFpbkluaXRpYWxpemVyPgotICAgICAgPGxhYmVsTWFwcGluZ3MKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mbWFwOkZlYXR1cmVMYWJlbE1hcHBpbmciPgotICAgICAgICA8ZGlhZ3JhbUxhYmVsCi0gICAgICAgICAgICBocmVmPSJlcGZkaWFncmFtLmdtZmdyYXBoI0FjdGl2aXR5Tm9kZU5hbWUiLz4KLSAgICAgICAgPGZlYXR1cmVzCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZWNvcmUjLy9OYW1lZEVsZW1lbnQvbmFtZSIvPgotICAgICAgPC9sYWJlbE1hcHBpbmdzPgotICAgICAgPHRvb2wKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mdG9vbDpDcmVhdGlvblRvb2wiCi0gICAgICAgICAgaHJlZj0iZXBmZGlhZ3JhbS5nbWZ0b29sIy8vQHBhbGV0dGUvQHRvb2xzLjEvQHRvb2xzLjgiLz4KLSAgICAgIDxkaWFncmFtTm9kZQotICAgICAgICAgIGhyZWY9ImVwZmRpYWdyYW0uZ21mZ3JhcGgjU3RydWN0dXJlZEFjdGl2aXR5Tm9kZSIvPgotICAgIDwvb3duZWRDaGlsZD4KLSAgPC9ub2Rlcz4KLSAgPG5vZGVzPgotICAgIDxjb250YWlubWVudEZlYXR1cmUKLSAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmVjb3JlIy8vQWN0aXZpdHkvZ3JvdXAiLz4KLSAgICA8b3duZWRDaGlsZD4KLSAgICAgIDxkb21haW5NZXRhRWxlbWVudAotICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5lY29yZSMvL0FjdGl2aXR5UGFydGl0aW9uIi8+Ci0gICAgICA8bGFiZWxNYXBwaW5ncwotICAgICAgICAgIHhzaTp0eXBlPSJnbWZtYXA6RmVhdHVyZUxhYmVsTWFwcGluZyIKLSAgICAgICAgICB2aWV3UGF0dGVybj0iIj4KLSAgICAgICAgPGRpYWdyYW1MYWJlbAotICAgICAgICAgICAgaHJlZj0iZXBmZGlhZ3JhbS5nbWZncmFwaCNQYXJ0aXRpb25OYW1lIi8+Ci0gICAgICAgIDxmZWF0dXJlcwotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmVjb3JlIy8vTmFtZWRFbGVtZW50L25hbWUiLz4KLSAgICAgIDwvbGFiZWxNYXBwaW5ncz4KLSAgICAgIDx0b29sCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZnRvb2w6Q3JlYXRpb25Ub29sIgotICAgICAgICAgIGhyZWY9ImVwZmRpYWdyYW0uZ21mdG9vbCMvL0BwYWxldHRlL0B0b29scy4xL0B0b29scy4wIi8+Ci0gICAgICA8ZGlhZ3JhbU5vZGUKLSAgICAgICAgICBocmVmPSJlcGZkaWFncmFtLmdtZmdyYXBoI0FjdGl2aXR5UGFydGl0aW9uIi8+Ci0gICAgICA8Y2hpbGRyZW4KLSAgICAgICAgICBjb21wYXJ0bWVudD0iLy9Abm9kZXMuNy9Ab3duZWRDaGlsZC9AY29tcGFydG1lbnRzLjAiCi0gICAgICAgICAgcmVmZXJlbmNlZENoaWxkPSIvL0Bub2Rlcy43L0Bvd25lZENoaWxkIj4KLSAgICAgICAgPGNvbnRhaW5tZW50RmVhdHVyZQotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmVjb3JlIy8vQWN0aXZpdHlQYXJ0aXRpb24vc3VicGFydGl0aW9uIi8+Ci0gICAgICA8L2NoaWxkcmVuPgotICAgICAgPGNvbXBhcnRtZW50cwotICAgICAgICAgIGNoaWxkcmVuPSIvL0Bub2Rlcy43L0Bvd25lZENoaWxkL0BjaGlsZHJlbi4wIj4KLSAgICAgICAgPGNvbXBhcnRtZW50Ci0gICAgICAgICAgICBocmVmPSJlcGZkaWFncmFtLmdtZmdyYXBoI1BhcnRpdGlvbkNhbXBhcnRtZW50Ii8+Ci0gICAgICA8L2NvbXBhcnRtZW50cz4KLSAgICA8L293bmVkQ2hpbGQ+Ci0gIDwvbm9kZXM+Ci0gIDxub2Rlcz4KLSAgICA8Y29udGFpbm1lbnRGZWF0dXJlCi0gICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5lY29yZSMvL0FjdGl2aXR5L25vZGUiLz4KLSAgICA8b3duZWRDaGlsZD4KLSAgICAgIDxkb21haW5NZXRhRWxlbWVudAotICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5lY29yZSMvL0FjdGl2aXR5UGFyYW1ldGVyTm9kZSIvPgotICAgICAgPGRvbWFpblNwZWNpYWxpemF0aW9uCi0gICAgICAgICAgYm9keT0iZ2V0VW1hVHlwZV9UYXNrRGVzY3JpcHRvciIKLSAgICAgICAgICBsYW5ndWFnZT0iamF2YSIvPgotICAgICAgPGRvbWFpbkluaXRpYWxpemVyCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZm1hcDpGZWF0dXJlU2VxSW5pdGlhbGl6ZXIiPgotICAgICAgICA8aW5pdGlhbGl6ZXJzCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mbWFwOkZlYXR1cmVWYWx1ZVNwZWMiCi0gICAgICAgICAgICBib2R5PSJjcmVhdGVVbWFUeXBlX1Rhc2tEZXNjcmlwdG9yIgotICAgICAgICAgICAgbGFuZ3VhZ2U9ImphdmEiPgotICAgICAgICAgIDxmZWF0dXJlCi0gICAgICAgICAgICAgIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIgotICAgICAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZW1mLmVjb3JlL21vZGVsL0Vjb3JlLmVjb3JlIy8vRU1vZGVsRWxlbWVudC9lQW5ub3RhdGlvbnMiLz4KLSAgICAgICAgPC9pbml0aWFsaXplcnM+Ci0gICAgICA8L2RvbWFpbkluaXRpYWxpemVyPgotICAgICAgPGxhYmVsTWFwcGluZ3MKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mbWFwOkZlYXR1cmVMYWJlbE1hcHBpbmciPgotICAgICAgICA8ZGlhZ3JhbUxhYmVsCi0gICAgICAgICAgICBocmVmPSJlcGZkaWFncmFtLmdtZmdyYXBoI0FjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWUiLz4KLSAgICAgICAgPGZlYXR1cmVzCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZWNvcmUjLy9OYW1lZEVsZW1lbnQvbmFtZSIvPgotICAgICAgPC9sYWJlbE1hcHBpbmdzPgotICAgICAgPHRvb2wKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mdG9vbDpDcmVhdGlvblRvb2wiCi0gICAgICAgICAgaHJlZj0iZXBmZGlhZ3JhbS5nbWZ0b29sIy8vQHBhbGV0dGUvQHRvb2xzLjEvQHRvb2xzLjExIi8+Ci0gICAgICA8ZGlhZ3JhbU5vZGUKLSAgICAgICAgICBocmVmPSJlcGZkaWFncmFtLmdtZmdyYXBoI0FjdGl2aXR5UGFyYW1ldGVyTm9kZSIvPgotICAgIDwvb3duZWRDaGlsZD4KLSAgPC9ub2Rlcz4KLSAgPG5vZGVzPgotICAgIDxjb250YWlubWVudEZlYXR1cmUKLSAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmVjb3JlIy8vQWN0aXZpdHkvbm9kZSIvPgotICAgIDxvd25lZENoaWxkPgotICAgICAgPGRvbWFpbk1ldGFFbGVtZW50Ci0gICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmVjb3JlIy8vU3RydWN0dXJlZEFjdGl2aXR5Tm9kZSIvPgotICAgICAgPGRvbWFpblNwZWNpYWxpemF0aW9uCi0gICAgICAgICAgYm9keT0iZ2V0VW1hVHlwZV9QaGFzZSIKLSAgICAgICAgICBsYW5ndWFnZT0iamF2YSIvPgotICAgICAgPGRvbWFpbkluaXRpYWxpemVyCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZm1hcDpGZWF0dXJlU2VxSW5pdGlhbGl6ZXIiPgotICAgICAgICA8aW5pdGlhbGl6ZXJzCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mbWFwOkZlYXR1cmVWYWx1ZVNwZWMiCi0gICAgICAgICAgICBib2R5PSJjcmVhdGVVbWFUeXBlX1BoYXNlIgotICAgICAgICAgICAgbGFuZ3VhZ2U9ImphdmEiPgotICAgICAgICAgIDxmZWF0dXJlCi0gICAgICAgICAgICAgIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIgotICAgICAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZW1mLmVjb3JlL21vZGVsL0Vjb3JlLmVjb3JlIy8vRU1vZGVsRWxlbWVudC9lQW5ub3RhdGlvbnMiLz4KLSAgICAgICAgPC9pbml0aWFsaXplcnM+Ci0gICAgICA8L2RvbWFpbkluaXRpYWxpemVyPgotICAgICAgPGxhYmVsTWFwcGluZ3MKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mbWFwOkZlYXR1cmVMYWJlbE1hcHBpbmciPgotICAgICAgICA8ZGlhZ3JhbUxhYmVsCi0gICAgICAgICAgICBocmVmPSJlcGZkaWFncmFtLmdtZmdyYXBoI0FjdGl2aXR5Tm9kZU5hbWUiLz4KLSAgICAgICAgPGZlYXR1cmVzCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZWNvcmUjLy9OYW1lZEVsZW1lbnQvbmFtZSIvPgotICAgICAgPC9sYWJlbE1hcHBpbmdzPgotICAgICAgPHRvb2wKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mdG9vbDpDcmVhdGlvblRvb2wiCi0gICAgICAgICAgaHJlZj0iZXBmZGlhZ3JhbS5nbWZ0b29sIy8vQHBhbGV0dGUvQHRvb2xzLjEvQHRvb2xzLjkiLz4KLSAgICAgIDxkaWFncmFtTm9kZQotICAgICAgICAgIGhyZWY9ImVwZmRpYWdyYW0uZ21mZ3JhcGgjU3RydWN0dXJlZEFjdGl2aXR5Tm9kZSIvPgotICAgIDwvb3duZWRDaGlsZD4KLSAgPC9ub2Rlcz4KLSAgPG5vZGVzPgotICAgIDxjb250YWlubWVudEZlYXR1cmUKLSAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmVjb3JlIy8vQWN0aXZpdHkvbm9kZSIvPgotICAgIDxvd25lZENoaWxkPgotICAgICAgPGRvbWFpbk1ldGFFbGVtZW50Ci0gICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmVjb3JlIy8vU3RydWN0dXJlZEFjdGl2aXR5Tm9kZSIvPgotICAgICAgPGRvbWFpblNwZWNpYWxpemF0aW9uCi0gICAgICAgICAgYm9keT0iZ2V0VW1hVHlwZV9JdGVyYXRpb24iCi0gICAgICAgICAgbGFuZ3VhZ2U9ImphdmEiLz4KLSAgICAgIDxkb21haW5Jbml0aWFsaXplcgotICAgICAgICAgIHhzaTp0eXBlPSJnbWZtYXA6RmVhdHVyZVNlcUluaXRpYWxpemVyIj4KLSAgICAgICAgPGluaXRpYWxpemVycwotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZm1hcDpGZWF0dXJlVmFsdWVTcGVjIgotICAgICAgICAgICAgYm9keT0iY3JlYXRlVW1hVHlwZV9JdGVyYXRpb24iCi0gICAgICAgICAgICBsYW5ndWFnZT0iamF2YSI+Ci0gICAgICAgICAgPGZlYXR1cmUKLSAgICAgICAgICAgICAgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiCi0gICAgICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5lbWYuZWNvcmUvbW9kZWwvRWNvcmUuZWNvcmUjLy9FTW9kZWxFbGVtZW50L2VBbm5vdGF0aW9ucyIvPgotICAgICAgICA8L2luaXRpYWxpemVycz4KLSAgICAgIDwvZG9tYWluSW5pdGlhbGl6ZXI+Ci0gICAgICA8bGFiZWxNYXBwaW5ncwotICAgICAgICAgIHhzaTp0eXBlPSJnbWZtYXA6RmVhdHVyZUxhYmVsTWFwcGluZyI+Ci0gICAgICAgIDxkaWFncmFtTGFiZWwKLSAgICAgICAgICAgIGhyZWY9ImVwZmRpYWdyYW0uZ21mZ3JhcGgjQWN0aXZpdHlOb2RlTmFtZSIvPgotICAgICAgICA8ZmVhdHVyZXMKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5lY29yZSMvL05hbWVkRWxlbWVudC9uYW1lIi8+Ci0gICAgICA8L2xhYmVsTWFwcGluZ3M+Ci0gICAgICA8dG9vbAotICAgICAgICAgIHhzaTp0eXBlPSJnbWZ0b29sOkNyZWF0aW9uVG9vbCIKLSAgICAgICAgICBocmVmPSJlcGZkaWFncmFtLmdtZnRvb2wjLy9AcGFsZXR0ZS9AdG9vbHMuMS9AdG9vbHMuMTAiLz4KLSAgICAgIDxkaWFncmFtTm9kZQotICAgICAgICAgIGhyZWY9ImVwZmRpYWdyYW0uZ21mZ3JhcGgjU3RydWN0dXJlZEFjdGl2aXR5Tm9kZSIvPgotICAgIDwvb3duZWRDaGlsZD4KLSAgPC9ub2Rlcz4KLSAgPG5vZGVzPgotICAgIDxjb250YWlubWVudEZlYXR1cmUKLSAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmVjb3JlIy8vQWN0aXZpdHkvbm9kZSIvPgotICAgIDxvd25lZENoaWxkPgotICAgICAgPGRvbWFpbk1ldGFFbGVtZW50Ci0gICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmVjb3JlIy8vQWN0aXZpdHlQYXJhbWV0ZXJOb2RlIi8+Ci0gICAgICA8ZG9tYWluU3BlY2lhbGl6YXRpb24KLSAgICAgICAgICBib2R5PSJnZXRVbWFUeXBlX01pbGVzdG9uZSIKLSAgICAgICAgICBsYW5ndWFnZT0iamF2YSIvPgotICAgICAgPGRvbWFpbkluaXRpYWxpemVyCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZm1hcDpGZWF0dXJlU2VxSW5pdGlhbGl6ZXIiPgotICAgICAgICA8aW5pdGlhbGl6ZXJzCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mbWFwOkZlYXR1cmVWYWx1ZVNwZWMiCi0gICAgICAgICAgICBib2R5PSJjcmVhdGVVbWFUeXBlX01pbGVzdG9uZSIKLSAgICAgICAgICAgIGxhbmd1YWdlPSJqYXZhIj4KLSAgICAgICAgICA8ZmVhdHVyZQotICAgICAgICAgICAgICB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIKLSAgICAgICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmVtZi5lY29yZS9tb2RlbC9FY29yZS5lY29yZSMvL0VNb2RlbEVsZW1lbnQvZUFubm90YXRpb25zIi8+Ci0gICAgICAgIDwvaW5pdGlhbGl6ZXJzPgotICAgICAgPC9kb21haW5Jbml0aWFsaXplcj4KLSAgICAgIDxsYWJlbE1hcHBpbmdzCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZm1hcDpGZWF0dXJlTGFiZWxNYXBwaW5nIj4KLSAgICAgICAgPGRpYWdyYW1MYWJlbAotICAgICAgICAgICAgaHJlZj0iZXBmZGlhZ3JhbS5nbWZncmFwaCNBY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lIi8+Ci0gICAgICAgIDxmZWF0dXJlcwotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmVjb3JlIy8vTmFtZWRFbGVtZW50L25hbWUiLz4KLSAgICAgIDwvbGFiZWxNYXBwaW5ncz4KLSAgICAgIDx0b29sCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZnRvb2w6Q3JlYXRpb25Ub29sIgotICAgICAgICAgIGhyZWY9ImVwZmRpYWdyYW0uZ21mdG9vbCMvL0BwYWxldHRlL0B0b29scy4xL0B0b29scy4xMiIvPgotICAgICAgPGRpYWdyYW1Ob2RlCi0gICAgICAgICAgaHJlZj0iZXBmZGlhZ3JhbS5nbWZncmFwaCNBY3Rpdml0eVBhcmFtZXRlck5vZGUiLz4KLSAgICA8L293bmVkQ2hpbGQ+Ci0gIDwvbm9kZXM+Ci0gIDxsaW5rcz4KLSAgICA8ZG9tYWluTWV0YUVsZW1lbnQKLSAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmVjb3JlIy8vQ29udHJvbEZsb3ciLz4KLSAgICA8bGFiZWxNYXBwaW5ncwotICAgICAgICB4c2k6dHlwZT0iZ21mbWFwOkZlYXR1cmVMYWJlbE1hcHBpbmciCi0gICAgICAgIHZpZXdQYXR0ZXJuPSIiPgotICAgICAgPGRpYWdyYW1MYWJlbAotICAgICAgICAgIGhyZWY9ImVwZmRpYWdyYW0uZ21mZ3JhcGgjQ29udHJvbEZsb3dMYWJlbCIvPgotICAgICAgPGZlYXR1cmVzCi0gICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmVjb3JlIy8vTmFtZWRFbGVtZW50L25hbWUiLz4KLSAgICA8L2xhYmVsTWFwcGluZ3M+Ci0gICAgPGNvbnRhaW5tZW50RmVhdHVyZQotICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZWNvcmUjLy9TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlL2VkZ2UiLz4KLSAgICA8dG9vbAotICAgICAgICB4c2k6dHlwZT0iZ21mdG9vbDpDcmVhdGlvblRvb2wiCi0gICAgICAgIGhyZWY9ImVwZmRpYWdyYW0uZ21mdG9vbCMvL0BwYWxldHRlL0B0b29scy4wL0B0b29scy4wIi8+Ci0gICAgPGRpYWdyYW1MaW5rCi0gICAgICAgIGhyZWY9ImVwZmRpYWdyYW0uZ21mZ3JhcGgjQ29udHJvbEZsb3ciLz4KLSAgICA8c291cmNlTWV0YUZlYXR1cmUKLSAgICAgICAgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiCi0gICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5lY29yZSMvL0FjdGl2aXR5RWRnZS9zb3VyY2UiLz4KLSAgICA8bGlua01ldGFGZWF0dXJlCi0gICAgICAgIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIgotICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZWNvcmUjLy9BY3Rpdml0eUVkZ2UvdGFyZ2V0Ii8+Ci0gIDwvbGlua3M+Ci0gIDxkaWFncmFtPgotICAgIDxkaWFncmFtQ2FudmFzCi0gICAgICAgIGhyZWY9ImVwZmRpYWdyYW0uZ21mZ3JhcGgjdW1sIi8+Ci0gICAgPGRvbWFpbk1vZGVsCi0gICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5lY29yZSMvIi8+Ci0gICAgPGRvbWFpbk1ldGFFbGVtZW50Ci0gICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5lY29yZSMvL0FjdGl2aXR5Ii8+Ci0gICAgPHBhbGV0dGUKLSAgICAgICAgaHJlZj0iZXBmZGlhZ3JhbS5nbWZ0b29sIy8vQHBhbGV0dGUiLz4KLSAgPC9kaWFncmFtPgotPC9nbWZtYXA6TWFwcGluZz4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL21vZGVsL2VwZmRpYWdyYW0uZ21mdG9vbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL21vZGVsL2VwZmRpYWdyYW0uZ21mdG9vbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzllNDY5Ni4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9tb2RlbC9lcGZkaWFncmFtLmdtZnRvb2wKKysrIC9kZXYvbnVsbApAQCAtMSwxNjYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxnbWZ0b29sOlRvb2xSZWdpc3RyeSB4bWk6dmVyc2lvbj0iMi4wIgotICAgIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIKLSAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICAgIHhtbG5zOmdtZnRvb2w9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZ21mLzIwMDUvVG9vbERlZmluaXRpb24iPgotICA8cGFsZXR0ZT4KLSAgICA8dG9vbHMKLSAgICAgICAgeHNpOnR5cGU9ImdtZnRvb2w6VG9vbEdyb3VwIgotICAgICAgICB0aXRsZT0iRmxvd3MiCi0gICAgICAgIGRlc2NyaXB0aW9uPSJDcmVhdGlvbiB0b29sIGZvciBmbG93cyIKLSAgICAgICAgY29sbGFwc2libGU9InRydWUiPgotICAgICAgPHRvb2xzCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZnRvb2w6Q3JlYXRpb25Ub29sIgotICAgICAgICAgIHRpdGxlPSJDb250cm9sIEZsb3ciCi0gICAgICAgICAgZGVzY3JpcHRpb249IkNyZWF0ZSBuZXcgQ29udHJvbCBGbG93Ij4KLSAgICAgICAgPHNtYWxsSWNvbgotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZnRvb2w6QnVuZGxlSW1hZ2UiCi0gICAgICAgICAgICBwYXRoPSJpY29ucy9mdWxsL29iajE2L0NvbnRyb2xGbG93LmdpZiIKLSAgICAgICAgICAgIGJ1bmRsZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nIi8+Ci0gICAgICAgIDxsYXJnZUljb24KLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZ0b29sOkRlZmF1bHRJbWFnZSIvPgotICAgICAgPC90b29scz4KLSAgICA8L3Rvb2xzPgotICAgIDx0b29scwotICAgICAgICB4c2k6dHlwZT0iZ21mdG9vbDpUb29sR3JvdXAiCi0gICAgICAgIHRpdGxlPSJOb2RlcyIKLSAgICAgICAgZGVzY3JpcHRpb249IkNyZWF0aW9uIHRvb2wgZ3JvdXAgZm9yIG5vZGVzIgotICAgICAgICBjb2xsYXBzaWJsZT0idHJ1ZSIKLSAgICAgICAgYWN0aXZlPSIvL0BwYWxldHRlL0B0b29scy4xIj4KLSAgICAgIDx0b29scwotICAgICAgICAgIHhzaTp0eXBlPSJnbWZ0b29sOkNyZWF0aW9uVG9vbCIKLSAgICAgICAgICB0aXRsZT0iQWN0aXZpdHkgUGFydGl0aW9uIgotICAgICAgICAgIGRlc2NyaXB0aW9uPSJDcmVhdGUgbmV3IEFjdGl2aXR5IFBhcnRpdGlvbiI+Ci0gICAgICAgIDxzbWFsbEljb24KLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZ0b29sOkJ1bmRsZUltYWdlIgotICAgICAgICAgICAgcGF0aD0iaWNvbnMvZnVsbC9vYmoxNi9BY3Rpdml0eVBhcnRpdGlvbi5naWYiCi0gICAgICAgICAgICBidW5kbGU9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZyIvPgotICAgICAgICA8bGFyZ2VJY29uCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mdG9vbDpEZWZhdWx0SW1hZ2UiLz4KLSAgICAgIDwvdG9vbHM+Ci0gICAgICA8dG9vbHMKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mdG9vbDpDcmVhdGlvblRvb2wiCi0gICAgICAgICAgdGl0bGU9IlN0YXJ0IE5vZGUiCi0gICAgICAgICAgZGVzY3JpcHRpb249IkNyZWF0ZSBuZXcgU3RhcnQgTm9kZSI+Ci0gICAgICAgIDxzbWFsbEljb24KLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZ0b29sOkJ1bmRsZUltYWdlIgotICAgICAgICAgICAgcGF0aD0iaWNvbnMvZnVsbC9vYmoxNi9Jbml0aWFsTm9kZS5naWYiCi0gICAgICAgICAgICBidW5kbGU9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZyIvPgotICAgICAgICA8bGFyZ2VJY29uCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mdG9vbDpEZWZhdWx0SW1hZ2UiLz4KLSAgICAgIDwvdG9vbHM+Ci0gICAgICA8dG9vbHMKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mdG9vbDpDcmVhdGlvblRvb2wiCi0gICAgICAgICAgdGl0bGU9IkZvcmsgTm9kZSIKLSAgICAgICAgICBkZXNjcmlwdGlvbj0iQ3JlYXRlIG5ldyBGb3JrIE5vZGUiPgotICAgICAgICA8c21hbGxJY29uCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mdG9vbDpCdW5kbGVJbWFnZSIKLSAgICAgICAgICAgIHBhdGg9Imljb25zL2Z1bGwvb2JqMTYvRm9ya05vZGUuZ2lmIgotICAgICAgICAgICAgYnVuZGxlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmciLz4KLSAgICAgICAgPGxhcmdlSWNvbgotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZnRvb2w6RGVmYXVsdEltYWdlIi8+Ci0gICAgICA8L3Rvb2xzPgotICAgICAgPHRvb2xzCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZnRvb2w6Q3JlYXRpb25Ub29sIgotICAgICAgICAgIHRpdGxlPSJNZXJnZSBOb2RlIgotICAgICAgICAgIGRlc2NyaXB0aW9uPSJDcmVhdGUgbmV3IE1lcmdlIE5vZGUiPgotICAgICAgICA8c21hbGxJY29uCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mdG9vbDpCdW5kbGVJbWFnZSIKLSAgICAgICAgICAgIHBhdGg9Imljb25zL2Z1bGwvb2JqMTYvTWVyZ2VOb2RlLmdpZiIKLSAgICAgICAgICAgIGJ1bmRsZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nIi8+Ci0gICAgICAgIDxsYXJnZUljb24KLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZ0b29sOkRlZmF1bHRJbWFnZSIvPgotICAgICAgPC90b29scz4KLSAgICAgIDx0b29scwotICAgICAgICAgIHhzaTp0eXBlPSJnbWZ0b29sOkNyZWF0aW9uVG9vbCIKLSAgICAgICAgICB0aXRsZT0iRGVjaXNpb24gTm9kZSIKLSAgICAgICAgICBkZXNjcmlwdGlvbj0iQ3JlYXRlIG5ldyBEZWNpc2lvbiBOb2RlIj4KLSAgICAgICAgPHNtYWxsSWNvbgotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZnRvb2w6QnVuZGxlSW1hZ2UiCi0gICAgICAgICAgICBwYXRoPSJpY29ucy9mdWxsL29iajE2L0RlY2lzaW9uTm9kZS5naWYiCi0gICAgICAgICAgICBidW5kbGU9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZyIvPgotICAgICAgICA8bGFyZ2VJY29uCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mdG9vbDpEZWZhdWx0SW1hZ2UiLz4KLSAgICAgIDwvdG9vbHM+Ci0gICAgICA8dG9vbHMKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mdG9vbDpDcmVhdGlvblRvb2wiCi0gICAgICAgICAgdGl0bGU9IkVuZCBOb2RlIgotICAgICAgICAgIGRlc2NyaXB0aW9uPSJDcmVhdGUgbmV3IEVuZCBOb2RlIj4KLSAgICAgICAgPHNtYWxsSWNvbgotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZnRvb2w6QnVuZGxlSW1hZ2UiCi0gICAgICAgICAgICBwYXRoPSJpY29ucy9mdWxsL29iajE2L0FjdGl2aXR5RmluYWxOb2RlLmdpZiIKLSAgICAgICAgICAgIGJ1bmRsZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nIi8+Ci0gICAgICAgIDxsYXJnZUljb24KLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZ0b29sOkRlZmF1bHRJbWFnZSIvPgotICAgICAgPC90b29scz4KLSAgICAgIDx0b29scwotICAgICAgICAgIHhzaTp0eXBlPSJnbWZ0b29sOkNyZWF0aW9uVG9vbCIKLSAgICAgICAgICB0aXRsZT0iSm9pbiBOb2RlIgotICAgICAgICAgIGRlc2NyaXB0aW9uPSJDcmVhdGUgbmV3IEpvaW4gTm9kZSI+Ci0gICAgICAgIDxzbWFsbEljb24KLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZ0b29sOkJ1bmRsZUltYWdlIgotICAgICAgICAgICAgcGF0aD0iaWNvbnMvZnVsbC9vYmoxNi9Kb2luTm9kZS5naWYiCi0gICAgICAgICAgICBidW5kbGU9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZyIvPgotICAgICAgICA8bGFyZ2VJY29uCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mdG9vbDpEZWZhdWx0SW1hZ2UiLz4KLSAgICAgIDwvdG9vbHM+Ci0gICAgICA8dG9vbHMKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mdG9vbDpQYWxldHRlU2VwYXJhdG9yIi8+Ci0gICAgICA8dG9vbHMKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mdG9vbDpDcmVhdGlvblRvb2wiCi0gICAgICAgICAgdGl0bGU9IkFjdGl2aXR5IgotICAgICAgICAgIGRlc2NyaXB0aW9uPSJDcmVhdGUgbmV3IEFjdGl2aXR5Ij4KLSAgICAgICAgPHNtYWxsSWNvbgotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZnRvb2w6QnVuZGxlSW1hZ2UiCi0gICAgICAgICAgICBwYXRoPSJpY29ucy9mdWxsL29iajE2L0FjdGl2aXR5LmdpZiIKLSAgICAgICAgICAgIGJ1bmRsZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nIi8+Ci0gICAgICAgIDxsYXJnZUljb24KLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZ0b29sOkRlZmF1bHRJbWFnZSIvPgotICAgICAgPC90b29scz4KLSAgICAgIDx0b29scwotICAgICAgICAgIHhzaTp0eXBlPSJnbWZ0b29sOkNyZWF0aW9uVG9vbCIKLSAgICAgICAgICB0aXRsZT0iUGhhc2UiCi0gICAgICAgICAgZGVzY3JpcHRpb249IkNyZWF0ZSBuZXcgUGhhc2UiPgotICAgICAgICA8c21hbGxJY29uCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mdG9vbDpCdW5kbGVJbWFnZSIKLSAgICAgICAgICAgIHBhdGg9Imljb25zL2Z1bGwvb2JqMTYvUGhhc2UuZ2lmIgotICAgICAgICAgICAgYnVuZGxlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmciLz4KLSAgICAgICAgPGxhcmdlSWNvbgotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZnRvb2w6RGVmYXVsdEltYWdlIi8+Ci0gICAgICA8L3Rvb2xzPgotICAgICAgPHRvb2xzCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZnRvb2w6Q3JlYXRpb25Ub29sIgotICAgICAgICAgIHRpdGxlPSJJdGVyYXRpb24iCi0gICAgICAgICAgZGVzY3JpcHRpb249IkNyZWF0ZSBuZXcgSXRlcmF0aW9uIj4KLSAgICAgICAgPHNtYWxsSWNvbgotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZnRvb2w6QnVuZGxlSW1hZ2UiCi0gICAgICAgICAgICBwYXRoPSJpY29ucy9mdWxsL29iajE2L0l0ZXJhdGlvbi5naWYiCi0gICAgICAgICAgICBidW5kbGU9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZyIvPgotICAgICAgICA8bGFyZ2VJY29uCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mdG9vbDpCdW5kbGVJbWFnZSIvPgotICAgICAgPC90b29scz4KLSAgICAgIDx0b29scwotICAgICAgICAgIHhzaTp0eXBlPSJnbWZ0b29sOkNyZWF0aW9uVG9vbCIKLSAgICAgICAgICB0aXRsZT0iVGFzayBEZXNjcmlwdG9yIgotICAgICAgICAgIGRlc2NyaXB0aW9uPSJDcmVhdGUgbmV3IFRhc2sgRGVzY3JpcHRvciI+Ci0gICAgICAgIDxzbWFsbEljb24KLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZ0b29sOkJ1bmRsZUltYWdlIgotICAgICAgICAgICAgcGF0aD0iaWNvbnMvZnVsbC9vYmoxNi9UYXNrRGVzY3JpcHRvci5naWYiCi0gICAgICAgICAgICBidW5kbGU9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZyIvPgotICAgICAgICA8bGFyZ2VJY29uCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mdG9vbDpEZWZhdWx0SW1hZ2UiLz4KLSAgICAgIDwvdG9vbHM+Ci0gICAgICA8dG9vbHMKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mdG9vbDpDcmVhdGlvblRvb2wiCi0gICAgICAgICAgdGl0bGU9Ik1pbGVzdG9uZSIKLSAgICAgICAgICBkZXNjcmlwdGlvbj0iQ3JlYXRlIG5ldyBNaWxlc3RvbmUiPgotICAgICAgICA8c21hbGxJY29uCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mdG9vbDpCdW5kbGVJbWFnZSIKLSAgICAgICAgICAgIHBhdGg9Imljb25zL2Z1bGwvb2JqMTYvTWlsZXN0b25lLmdpZiIKLSAgICAgICAgICAgIGJ1bmRsZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nIi8+Ci0gICAgICAgIDxsYXJnZUljb24KLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZ0b29sOkRlZmF1bHRJbWFnZSIvPgotICAgICAgPC90b29scz4KLSAgICA8L3Rvb2xzPgotICA8L3BhbGV0dGU+Ci08L2dtZnRvb2w6VG9vbFJlZ2lzdHJ5PgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvbW9kZWwvZXBmZGlhZ3JhbTIuZ21mZ2VuIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvbW9kZWwvZXBmZGlhZ3JhbTIuZ21mZ2VuCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNTA3MmNhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL21vZGVsL2VwZmRpYWdyYW0yLmdtZmdlbgorKysgL2Rldi9udWxsCkBAIC0xLDkyNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGdtZmdlbjpHZW5FZGl0b3JHZW5lcmF0b3IgeG1pOnZlcnNpb249IjIuMCIKLSAgICB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiCi0gICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgICB4bWxuczpnbWZnZW49Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZ21mLzIwMDUvR2VuTW9kZWwvMi4wIiBwYWNrYWdlTmFtZVByZWZpeD0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQiCi0gICAgbW9kZWxJRD0iQUQiCi0gICAgc2FtZUZpbGVGb3JEaWFncmFtQW5kTW9kZWw9InRydWUiCi0gICAgZGlhZ3JhbUZpbGVFeHRlbnNpb249InhtaSIKLSAgICB0ZW1wbGF0ZURpcmVjdG9yeT0iIgotICAgIGNvcHlyaWdodFRleHQ9IiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuJiN4RDsmI3hBOyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzJiN4RDsmI3hBOyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAmI3hEOyYjeEE7IHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0JiN4RDsmI3hBOyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCYjeEQ7JiN4QTsmI3hEOyYjeEE7IENvbnRyaWJ1dG9yczomI3hEOyYjeEE7IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24mI3hEOyYjeEE7Ij4KLSAgPGRpYWdyYW0KLSAgICAgIHZpc3VhbElEPSI3OSIKLSAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJBY3Rpdml0eUVkaXRQYXJ0IgotICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iQWN0aXZpdHlJdGVtU2VtYW50aWNFZGl0UG9saWN5IgotICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iQWN0aXZpdHlWaWV3RmFjdG9yeSIKLSAgICAgIGNhbm9uaWNhbEVkaXRQb2xpY3lDbGFzc05hbWU9IkFjdGl2aXR5Q2Fub25pY2FsRWRpdFBvbGljeSIKLSAgICAgIGljb25Qcm92aWRlclByaW9yaXR5PSJMb3ciCi0gICAgICBjcmVhdGlvbldpemFyZEljb25QYXRoPSJpY29ucy9kaWFncmFtL2FjdGl2aXR5LmdpZiIKLSAgICAgIHZhbGlkYXRpb25Qcm92aWRlckNsYXNzTmFtZT0iVmFsaWRhdGlvblByb3ZpZGVyIgotICAgICAgbWV0cmljUHJvdmlkZXJDbGFzc05hbWU9Ik1ldHJpY1Byb3ZpZGVyIgotICAgICAgdmFsaWRhdGlvbkRlY29yYXRvclByb3ZpZGVyQ2xhc3NOYW1lPSJWYWxpZGF0aW9uRGVjb3JhdG9yUHJvdmlkZXIiPgotICAgIDxkaWFncmFtUnVuVGltZUNsYXNzCi0gICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL0RpYWdyYW0iLz4KLSAgICA8ZWxlbWVudFR5cGUKLSAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpNZXRhbW9kZWxUeXBlIgotICAgICAgICBlZGl0SGVscGVyQ2xhc3NOYW1lPSJBY3Rpdml0eUVkaXRIZWxwZXIiLz4KLSAgICA8dmlld21hcAotICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOkZpZ3VyZVZpZXdtYXAiCi0gICAgICAgIGZpZ3VyZVF1YWxpZmllZENsYXNzTmFtZT0ib3JnLmVjbGlwc2UuZHJhdzJkLkZyZWVmb3JtTGF5ZXIiLz4KLSAgICA8ZG9tYWluRGlhZ3JhbUVsZW1lbnQKLSAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmdlbm1vZGVsIy8vdW1sL0FjdGl2aXR5Ii8+Ci0gICAgPGNoaWxkTm9kZXMKLSAgICAgICAgdmlzdWFsSUQ9IjIwMDEiCi0gICAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJBY3Rpdml0eVBhcnRpdGlvbjJFZGl0UGFydCIKLSAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iQWN0aXZpdHlQYXJ0aXRpb24ySXRlbVNlbWFudGljRWRpdFBvbGljeSIKLSAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iQWN0aXZpdHlQYXJ0aXRpb24yVmlld0ZhY3RvcnkiCi0gICAgICAgIGNhbm9uaWNhbEVkaXRQb2xpY3lDbGFzc05hbWU9IkFjdGl2aXR5UGFydGl0aW9uMkNhbm9uaWNhbEVkaXRQb2xpY3kiCi0gICAgICAgIGNvbXBhcnRtZW50cz0iLy9AZGlhZ3JhbS9AY29tcGFydG1lbnRzLjEiCi0gICAgICAgIGdyYXBoaWNhbE5vZGVFZGl0UG9saWN5Q2xhc3NOYW1lPSJBY3Rpdml0eVBhcnRpdGlvbjJHcmFwaGljYWxOb2RlRWRpdFBvbGljeSIKLSAgICAgICAgY29udGFpbmVycz0iLy9AZGlhZ3JhbS9AY29tcGFydG1lbnRzLjEgLy9AZGlhZ3JhbS9AY29tcGFydG1lbnRzLjAiPgotICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MKLSAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+Ci0gICAgICA8ZWxlbWVudFR5cGUKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlNwZWNpYWxpemF0aW9uVHlwZSIKLSAgICAgICAgICBtZXRhbW9kZWxUeXBlPSIvL0BkaWFncmFtL0B0b3BMZXZlbE5vZGVzLjcvQGVsZW1lbnRUeXBlIgotICAgICAgICAgIGVkaXRIZWxwZXJBZHZpY2VDbGFzc05hbWU9IkFjdGl2aXR5UGFydGl0aW9uRWRpdEhlbHBlckFkdmljZSIvPgotICAgICAgPHZpZXdtYXAKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOklubmVyQ2xhc3NWaWV3bWFwIgotICAgICAgICAgIGxheW91dFR5cGU9IlhZX0xBWU9VVCIKLSAgICAgICAgICBjbGFzc05hbWU9IkFjdGl2aXR5UGFydGl0aW9uRmlndXJlIgotICAgICAgICAgIGNsYXNzQm9keT0iJiN4RDsmI3hBOyYjeEQ7JiN4QTsvKiomI3hEOyYjeEE7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsgKi8mI3hEOyYjeEE7cHVibGljIGNsYXNzIEFjdGl2aXR5UGFydGl0aW9uRmlndXJlIGV4dGVuZHMgb3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZSB7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwdWJsaWMgQWN0aXZpdHlQYXJ0aXRpb25GaWd1cmUoKSB7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeDk7b3JnLmVjbGlwc2UuZHJhdzJkLlhZTGF5b3V0IG15R2VuTGF5b3V0TWFuYWdlciA9IG5ldyBvcmcuZWNsaXBzZS5kcmF3MmQuWFlMYXlvdXQoKTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4OTt0aGlzLnNldExheW91dE1hbmFnZXIobXlHZW5MYXlvdXRNYW5hZ2VyKTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3g5OyYjeDk7dGhpcy5zZXRGb3JlZ3JvdW5kQ29sb3Iob3JnLmVjbGlwc2UuZHJhdzJkLkNvbG9yQ29uc3RhbnRzLmJsYWNrJiN4RDsmI3hBOyYjeEQ7JiN4QTspOyYjeEQ7JiN4QTsmI3g5OyYjeDk7dGhpcy5zZXRCYWNrZ3JvdW5kQ29sb3IoQUNUSVZJVFlQQVJUSVRJT05GSUdVUkVfQkFDSyYjeEQ7JiN4QTsmI3hEOyYjeEE7KTsmI3hEOyYjeEE7JiN4OTsmI3g5O3RoaXMuc2V0UHJlZmVycmVkU2l6ZShnZXRNYXBNb2RlKCkuRFB0b0xQKDMwMCksIGdldE1hcE1vZGUoKS5EUHRvTFAoNjAwKSk7JiN4RDsmI3hBOyYjeDk7JiN4OTt0aGlzLnNldFNpemUoZ2V0TWFwTW9kZSgpLkRQdG9MUCgzMDApLCBnZXRNYXBNb2RlKCkuRFB0b0xQKDYwMCkpOyYjeEQ7JiN4QTsmI3g5OyYjeDk7dGhpcy5zZXRCb3JkZXIoJiN4RDsmI3hBO25ldyBvcmcuZWNsaXBzZS5kcmF3MmQuTGluZUJvcmRlcigpJiN4RDsmI3hBOyk7JiN4RDsmI3hBOyYjeDk7JiN4OTtjcmVhdGVDb250ZW50cygpOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIHZvaWQgY3JlYXRlQ29udGVudHMoKXsmI3hEOyYjeEE7JiN4OTsmI3g5O29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCBmaWdfMCA9IG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwoKTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7JiN4OTtzZXRGaWd1cmVQYXJ0aXRpb25MYWJlbEZpZ3VyZShmaWdfMCk7JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3g5O09iamVjdCBsYXlEYXRhMCA9IG51bGw7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5OyYjeDk7dGhpcy5hZGQoZmlnXzAsIGxheURhdGEwKTsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJpdmF0ZSBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZlBhcnRpdGlvbkxhYmVsRmlndXJlOyAmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3B1YmxpYyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZ2V0RmlndXJlUGFydGl0aW9uTGFiZWxGaWd1cmUoKSB7JiN4RDsmI3hBOyYjeDk7JiN4OTtyZXR1cm4gZlBhcnRpdGlvbkxhYmVsRmlndXJlOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJpdmF0ZSB2b2lkIHNldEZpZ3VyZVBhcnRpdGlvbkxhYmVsRmlndXJlKG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCBmaWcpeyYjeEQ7JiN4QTsmI3g5OyYjeDk7ZlBhcnRpdGlvbkxhYmVsRmlndXJlID0gZmlnOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3ByaXZhdGUgYm9vbGVhbiBteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSBmYWxzZTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3Byb3RlY3RlZCBib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMoKSB7JiN4RDsmI3hBOyYjeDk7JiN4OTtyZXR1cm4gbXlVc2VMb2NhbENvb3JkaW5hdGVzOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3Byb3RlY3RlZCB2b2lkIHNldFVzZUxvY2FsQ29vcmRpbmF0ZXMoYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKSB7JiN4RDsmI3hBOyYjeDk7JiN4OTtteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSB1c2VMb2NhbENvb3JkaW5hdGVzOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4RDsmI3hBO30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHVibGljIHN0YXRpYyBmaW5hbCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3IgQUNUSVZJVFlQQVJUSVRJT05GSUdVUkVfQkFDSyA9IG5ldyBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3IobnVsbCwgMjU1LCAyNTUsIDI1NSk7JiN4RDsmI3hBOyI+Ci0gICAgICAgIDxhdHRyaWJ1dGVzCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlN0eWxlQXR0cmlidXRlcyIKLSAgICAgICAgICAgIGZpeGVkRm9yZWdyb3VuZD0idHJ1ZSIKLSAgICAgICAgICAgIGZpeGVkQmFja2dyb3VuZD0idHJ1ZSIvPgotICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZHJhdzJkPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aTwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICA8L3ZpZXdtYXA+Ci0gICAgICA8bW9kZWxGYWNldD4KLSAgICAgICAgPG1ldGFDbGFzcwotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmdlbm1vZGVsIy8vdW1sL0FjdGl2aXR5UGFydGl0aW9uIi8+Ci0gICAgICAgIDxjb250YWlubWVudE1ldGFGZWF0dXJlCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZ2VubW9kZWwjLy91bWwvQWN0aXZpdHlQYXJ0aXRpb24vc3VicGFydGl0aW9uIi8+Ci0gICAgICAgIDxjaGlsZE1ldGFGZWF0dXJlCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZ2VubW9kZWwjLy91bWwvQWN0aXZpdHlQYXJ0aXRpb24vc3VicGFydGl0aW9uIi8+Ci0gICAgICA8L21vZGVsRmFjZXQ+Ci0gICAgICA8bGFiZWxzCi0gICAgICAgICAgdmlzdWFsSUQ9IjQwMDYiCi0gICAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9IkFjdGl2aXR5UGFydGl0aW9uTmFtZUVkaXRQYXJ0IgotICAgICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IkFjdGl2aXR5UGFydGl0aW9uTmFtZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiCi0gICAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iQWN0aXZpdHlQYXJ0aXRpb25OYW1lVmlld0ZhY3RvcnkiCi0gICAgICAgICAgZWxlbWVudEljb249InRydWUiPgotICAgICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcwotICAgICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vTm9kZSIvPgotICAgICAgICA8dmlld21hcAotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpQYXJlbnRBc3NpZ25lZFZpZXdtYXAiCi0gICAgICAgICAgICBnZXR0ZXJOYW1lPSJnZXRGaWd1cmVQYXJ0aXRpb25MYWJlbEZpZ3VyZSIKLSAgICAgICAgICAgIGZpZ3VyZVF1YWxpZmllZENsYXNzTmFtZT0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIi8+Ci0gICAgICAgIDxtb2RlbEZhY2V0Ci0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOkZlYXR1cmVMYWJlbE1vZGVsRmFjZXQiCi0gICAgICAgICAgICB2aWV3UGF0dGVybj0iezB9IgotICAgICAgICAgICAgZWRpdFBhdHRlcm49IiI+Ci0gICAgICAgICAgPG1ldGFGZWF0dXJlcwotICAgICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZ2VubW9kZWwjLy91bWwvTmFtZWRFbGVtZW50L25hbWUiLz4KLSAgICAgICAgPC9tb2RlbEZhY2V0PgotICAgICAgPC9sYWJlbHM+Ci0gICAgPC9jaGlsZE5vZGVzPgotICAgIDx0b3BMZXZlbE5vZGVzCi0gICAgICAgIHZpc3VhbElEPSIxMDAxIgotICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iQWN0aXZpdHlGaW5hbE5vZGVFZGl0UGFydCIKLSAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iQWN0aXZpdHlGaW5hbE5vZGVJdGVtU2VtYW50aWNFZGl0UG9saWN5IgotICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJBY3Rpdml0eUZpbmFsTm9kZVZpZXdGYWN0b3J5IgotICAgICAgICBjYW5vbmljYWxFZGl0UG9saWN5Q2xhc3NOYW1lPSJBY3Rpdml0eUZpbmFsTm9kZUNhbm9uaWNhbEVkaXRQb2xpY3kiCi0gICAgICAgIGdyYXBoaWNhbE5vZGVFZGl0UG9saWN5Q2xhc3NOYW1lPSJBY3Rpdml0eUZpbmFsTm9kZUdyYXBoaWNhbE5vZGVFZGl0UG9saWN5Ij4KLSAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzCi0gICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vTm9kZSIvPgotICAgICAgPGVsZW1lbnRUeXBlCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpNZXRhbW9kZWxUeXBlIgotICAgICAgICAgIGVkaXRIZWxwZXJDbGFzc05hbWU9IkFjdGl2aXR5RmluYWxOb2RlRWRpdEhlbHBlciIvPgotICAgICAgPHZpZXdtYXAKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOklubmVyQ2xhc3NWaWV3bWFwIgotICAgICAgICAgIGNsYXNzTmFtZT0iRW5kTm9kZUZpZ3VyZSIKLSAgICAgICAgICBjbGFzc0JvZHk9IiYjeEQ7JiN4QTsmI3hEOyYjeEE7LyoqJiN4RDsmI3hBOyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7ICovJiN4RDsmI3hBO3B1YmxpYyBjbGFzcyBFbmROb2RlRmlndXJlIGV4dGVuZHMgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuY3VzdG9tLmZpZ3VyZXMuRW5kTm9kZUZpZ3VyZSB7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwdWJsaWMgRW5kTm9kZUZpZ3VyZSgpIHsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsmI3g5O3RoaXMuc2V0Rm9yZWdyb3VuZENvbG9yKG9yZy5lY2xpcHNlLmRyYXcyZC5Db2xvckNvbnN0YW50cy5kYXJrQmx1ZSYjeEQ7JiN4QTsmI3hEOyYjeEE7KTsmI3hEOyYjeEE7JiN4OTsmI3g5O3RoaXMuc2V0QmFja2dyb3VuZENvbG9yKEVORE5PREVGSUdVUkVfQkFDSyYjeEQ7JiN4QTsmI3hEOyYjeEE7KTsmI3hEOyYjeEE7JiN4OTsmI3g5O3RoaXMuc2V0UHJlZmVycmVkU2l6ZShnZXRNYXBNb2RlKCkuRFB0b0xQKDI0KSwgZ2V0TWFwTW9kZSgpLkRQdG9MUCgyNCkpOyYjeEQ7JiN4QTsmI3g5OyYjeDk7dGhpcy5zZXRTaXplKGdldE1hcE1vZGUoKS5EUHRvTFAoMjQpLCBnZXRNYXBNb2RlKCkuRFB0b0xQKDI0KSk7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5OyYjeDk7Y3JlYXRlQ29udGVudHMoKTsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbnRlbnRzKCl7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIGJvb2xlYW4gbXlVc2VMb2NhbENvb3JkaW5hdGVzID0gZmFsc2U7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcm90ZWN0ZWQgYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKCkgeyYjeEQ7JiN4QTsmI3g5OyYjeDk7cmV0dXJuIG15VXNlTG9jYWxDb29yZGluYXRlczsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcm90ZWN0ZWQgdm9pZCBzZXRVc2VMb2NhbENvb3JkaW5hdGVzKGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcykgeyYjeEQ7JiN4QTsmI3g5OyYjeDk7bXlVc2VMb2NhbENvb3JkaW5hdGVzID0gdXNlTG9jYWxDb29yZGluYXRlczsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeEQ7JiN4QTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3B1YmxpYyBzdGF0aWMgZmluYWwgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yIEVORE5PREVGSUdVUkVfQkFDSyA9IG5ldyBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3IobnVsbCwgNDUsIDg1LCAxMzApOyYjeEQ7JiN4QTsiPgotICAgICAgICA8YXR0cmlidXRlcwotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpTdHlsZUF0dHJpYnV0ZXMiCi0gICAgICAgICAgICBmaXhlZEZvcmVncm91bmQ9InRydWUiCi0gICAgICAgICAgICBmaXhlZEJhY2tncm91bmQ9InRydWUiLz4KLSAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmRyYXcyZDwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWk8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgPC92aWV3bWFwPgotICAgICAgPG1vZGVsRmFjZXQ+Ci0gICAgICAgIDxtZXRhQ2xhc3MKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5nZW5tb2RlbCMvL3VtbC9BY3Rpdml0eUZpbmFsTm9kZSIvPgotICAgICAgICA8Y29udGFpbm1lbnRNZXRhRmVhdHVyZQotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmdlbm1vZGVsIy8vdW1sL0FjdGl2aXR5L25vZGUiLz4KLSAgICAgICAgPGNoaWxkTWV0YUZlYXR1cmUKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5nZW5tb2RlbCMvL3VtbC9BY3Rpdml0eS9ub2RlIi8+Ci0gICAgICA8L21vZGVsRmFjZXQ+Ci0gICAgICA8bGFiZWxzCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpHZW5FeHRlcm5hbE5vZGVMYWJlbCIKLSAgICAgICAgICB2aXN1YWxJRD0iNDAwMSIKLSAgICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iQWN0aXZpdHlGaW5hbE5vZGVOYW1lRWRpdFBhcnQiCi0gICAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iQWN0aXZpdHlGaW5hbE5vZGVOYW1lSXRlbVNlbWFudGljRWRpdFBvbGljeSIKLSAgICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJBY3Rpdml0eUZpbmFsTm9kZU5hbWVWaWV3RmFjdG9yeSI+Ci0gICAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzCi0gICAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+Ci0gICAgICAgIDx2aWV3bWFwCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOkZpZ3VyZVZpZXdtYXAiCi0gICAgICAgICAgICBmaWd1cmVRdWFsaWZpZWRDbGFzc05hbWU9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCI+Ci0gICAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmRyYXcyZDwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aTwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICAgIDwvdmlld21hcD4KLSAgICAgICAgPG1vZGVsRmFjZXQKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46RmVhdHVyZUxhYmVsTW9kZWxGYWNldCIKLSAgICAgICAgICAgIHZpZXdQYXR0ZXJuPSJ7MH0iCi0gICAgICAgICAgICBlZGl0UGF0dGVybj0iIj4KLSAgICAgICAgICA8bWV0YUZlYXR1cmVzCi0gICAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5nZW5tb2RlbCMvL3VtbC9OYW1lZEVsZW1lbnQvbmFtZSIvPgotICAgICAgICA8L21vZGVsRmFjZXQ+Ci0gICAgICA8L2xhYmVscz4KLSAgICA8L3RvcExldmVsTm9kZXM+Ci0gICAgPHRvcExldmVsTm9kZXMKLSAgICAgICAgdmlzdWFsSUQ9IjEwMDIiCi0gICAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJNZXJnZU5vZGVFZGl0UGFydCIKLSAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iTWVyZ2VOb2RlSXRlbVNlbWFudGljRWRpdFBvbGljeSIKLSAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iTWVyZ2VOb2RlVmlld0ZhY3RvcnkiCi0gICAgICAgIGNhbm9uaWNhbEVkaXRQb2xpY3lDbGFzc05hbWU9Ik1lcmdlTm9kZUNhbm9uaWNhbEVkaXRQb2xpY3kiCi0gICAgICAgIGdyYXBoaWNhbE5vZGVFZGl0UG9saWN5Q2xhc3NOYW1lPSJNZXJnZU5vZGVHcmFwaGljYWxOb2RlRWRpdFBvbGljeSI+Ci0gICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcwotICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL05vZGUiLz4KLSAgICAgIDxlbGVtZW50VHlwZQotICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46TWV0YW1vZGVsVHlwZSIKLSAgICAgICAgICBlZGl0SGVscGVyQ2xhc3NOYW1lPSJNZXJnZU5vZGVFZGl0SGVscGVyIi8+Ci0gICAgICA8dmlld21hcAotICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46SW5uZXJDbGFzc1ZpZXdtYXAiCi0gICAgICAgICAgY2xhc3NOYW1lPSJEZWNpc2lvbkRpYW1vbmRGaWd1cmUiCi0gICAgICAgICAgY2xhc3NCb2R5PSImI3hEOyYjeEE7JiN4RDsmI3hBOy8qKiYjeEQ7JiN4QTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyAqLyYjeEQ7JiN4QTtwdWJsaWMgY2xhc3MgRGVjaXNpb25EaWFtb25kRmlndXJlIGV4dGVuZHMgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuY3VzdG9tLmZpZ3VyZXMuRGVjaXNpb25Ob2RlRmlndXJlIHsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3B1YmxpYyBEZWNpc2lvbkRpYW1vbmRGaWd1cmUoKSB7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7JiN4OTt0aGlzLnNldEZvcmVncm91bmRDb2xvcihvcmcuZWNsaXBzZS5kcmF3MmQuQ29sb3JDb25zdGFudHMuZGFya0JsdWUmI3hEOyYjeEE7JiN4RDsmI3hBOyk7JiN4RDsmI3hBOyYjeDk7JiN4OTt0aGlzLnNldEJhY2tncm91bmRDb2xvcihERUNJU0lPTkRJQU1PTkRGSUdVUkVfQkFDSyYjeEQ7JiN4QTsmI3hEOyYjeEE7KTsmI3hEOyYjeEE7JiN4OTsmI3g5O3RoaXMuc2V0UHJlZmVycmVkU2l6ZShnZXRNYXBNb2RlKCkuRFB0b0xQKDUwKSwgZ2V0TWFwTW9kZSgpLkRQdG9MUCg1MCkpOyYjeEQ7JiN4QTsmI3g5OyYjeDk7dGhpcy5zZXRTaXplKGdldE1hcE1vZGUoKS5EUHRvTFAoNTApLCBnZXRNYXBNb2RlKCkuRFB0b0xQKDUwKSk7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5OyYjeDk7Y3JlYXRlQ29udGVudHMoKTsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbnRlbnRzKCl7JiN4RDsmI3hBOyYjeDk7JiN4OTtvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZmlnXzAgPSBuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsKCk7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5OyYjeDk7c2V0RmlndXJlRGlhbW9uZExhYmVsKGZpZ18wKTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeDk7T2JqZWN0IGxheURhdGEwID0gbnVsbDsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7JiN4OTt0aGlzLmFkZChmaWdfMCwgbGF5RGF0YTApOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCBmRGlhbW9uZExhYmVsOyAmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3B1YmxpYyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZ2V0RmlndXJlRGlhbW9uZExhYmVsKCkgeyYjeEQ7JiN4QTsmI3g5OyYjeDk7cmV0dXJuIGZEaWFtb25kTGFiZWw7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIHZvaWQgc2V0RmlndXJlRGlhbW9uZExhYmVsKG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCBmaWcpeyYjeEQ7JiN4QTsmI3g5OyYjeDk7ZkRpYW1vbmRMYWJlbCA9IGZpZzsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIGJvb2xlYW4gbXlVc2VMb2NhbENvb3JkaW5hdGVzID0gZmFsc2U7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcm90ZWN0ZWQgYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKCkgeyYjeEQ7JiN4QTsmI3g5OyYjeDk7cmV0dXJuIG15VXNlTG9jYWxDb29yZGluYXRlczsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcm90ZWN0ZWQgdm9pZCBzZXRVc2VMb2NhbENvb3JkaW5hdGVzKGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcykgeyYjeEQ7JiN4QTsmI3g5OyYjeDk7bXlVc2VMb2NhbENvb3JkaW5hdGVzID0gdXNlTG9jYWxDb29yZGluYXRlczsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeEQ7JiN4QTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3B1YmxpYyBzdGF0aWMgZmluYWwgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yIERFQ0lTSU9ORElBTU9OREZJR1VSRV9CQUNLID0gbmV3IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcihudWxsLCAxODUsIDIwNSwgMjMwKTsmI3hEOyYjeEE7Ij4KLSAgICAgICAgPGF0dHJpYnV0ZXMKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46U3R5bGVBdHRyaWJ1dGVzIgotICAgICAgICAgICAgZml4ZWRGb3JlZ3JvdW5kPSJ0cnVlIgotICAgICAgICAgICAgZml4ZWRCYWNrZ3JvdW5kPSJ0cnVlIi8+Ci0gICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5kcmF3MmQ8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgIDwvdmlld21hcD4KLSAgICAgIDxtb2RlbEZhY2V0PgotICAgICAgICA8bWV0YUNsYXNzCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZ2VubW9kZWwjLy91bWwvTWVyZ2VOb2RlIi8+Ci0gICAgICAgIDxjb250YWlubWVudE1ldGFGZWF0dXJlCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZ2VubW9kZWwjLy91bWwvQWN0aXZpdHkvbm9kZSIvPgotICAgICAgICA8Y2hpbGRNZXRhRmVhdHVyZQotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmdlbm1vZGVsIy8vdW1sL0FjdGl2aXR5L25vZGUiLz4KLSAgICAgIDwvbW9kZWxGYWNldD4KLSAgICAgIDxsYWJlbHMKLSAgICAgICAgICB2aXN1YWxJRD0iNDAwMiIKLSAgICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iTWVyZ2VOb2RlTmFtZUVkaXRQYXJ0IgotICAgICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9Ik1lcmdlTm9kZU5hbWVJdGVtU2VtYW50aWNFZGl0UG9saWN5IgotICAgICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9Ik1lcmdlTm9kZU5hbWVWaWV3RmFjdG9yeSI+Ci0gICAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzCi0gICAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+Ci0gICAgICAgIDx2aWV3bWFwCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOklubmVyQ2xhc3NWaWV3bWFwIgotICAgICAgICAgICAgY2xhc3NOYW1lPSJOb2RlTmFtZUZpZ3VyZSIKLSAgICAgICAgICAgIGNsYXNzQm9keT0iJiN4RDsmI3hBOyYjeEQ7JiN4QTsvKiomI3hEOyYjeEE7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsgKi8mI3hEOyYjeEE7cHVibGljIGNsYXNzIE5vZGVOYW1lRmlndXJlIGV4dGVuZHMgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIHsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3B1YmxpYyBOb2RlTmFtZUZpZ3VyZSgpIHsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5OyYjeDk7dGhpcy5zZXRUZXh0KCZxdW90OyZxdW90Oyk7JiN4RDsmI3hBOyYjeDk7JiN4OTtjcmVhdGVDb250ZW50cygpOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIHZvaWQgY3JlYXRlQ29udGVudHMoKXsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3ByaXZhdGUgYm9vbGVhbiBteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSBmYWxzZTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3Byb3RlY3RlZCBib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMoKSB7JiN4RDsmI3hBOyYjeDk7JiN4OTtyZXR1cm4gbXlVc2VMb2NhbENvb3JkaW5hdGVzOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3Byb3RlY3RlZCB2b2lkIHNldFVzZUxvY2FsQ29vcmRpbmF0ZXMoYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKSB7JiN4RDsmI3hBOyYjeDk7JiN4OTtteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSB1c2VMb2NhbENvb3JkaW5hdGVzOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4RDsmI3hBO30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7Ij4KLSAgICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZHJhdzJkPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgICAgPC92aWV3bWFwPgotICAgICAgICA8bW9kZWxGYWNldAotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpGZWF0dXJlTGFiZWxNb2RlbEZhY2V0IgotICAgICAgICAgICAgdmlld1BhdHRlcm49InswfSI+Ci0gICAgICAgICAgPG1ldGFGZWF0dXJlcwotICAgICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZ2VubW9kZWwjLy91bWwvTmFtZWRFbGVtZW50L25hbWUiLz4KLSAgICAgICAgPC9tb2RlbEZhY2V0PgotICAgICAgPC9sYWJlbHM+Ci0gICAgPC90b3BMZXZlbE5vZGVzPgotICAgIDx0b3BMZXZlbE5vZGVzCi0gICAgICAgIHZpc3VhbElEPSIxMDAzIgotICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iRm9ya05vZGVFZGl0UGFydCIKLSAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iRm9ya05vZGVJdGVtU2VtYW50aWNFZGl0UG9saWN5IgotICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJGb3JrTm9kZVZpZXdGYWN0b3J5IgotICAgICAgICBjYW5vbmljYWxFZGl0UG9saWN5Q2xhc3NOYW1lPSJGb3JrTm9kZUNhbm9uaWNhbEVkaXRQb2xpY3kiCi0gICAgICAgIGdyYXBoaWNhbE5vZGVFZGl0UG9saWN5Q2xhc3NOYW1lPSJGb3JrTm9kZUdyYXBoaWNhbE5vZGVFZGl0UG9saWN5Ij4KLSAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzCi0gICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vTm9kZSIvPgotICAgICAgPGVsZW1lbnRUeXBlCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpNZXRhbW9kZWxUeXBlIgotICAgICAgICAgIGVkaXRIZWxwZXJDbGFzc05hbWU9IkZvcmtOb2RlRWRpdEhlbHBlciIvPgotICAgICAgPHZpZXdtYXAKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOklubmVyQ2xhc3NWaWV3bWFwIgotICAgICAgICAgIGNsYXNzTmFtZT0iRm9ya05vZGVGaWd1cmUiCi0gICAgICAgICAgY2xhc3NCb2R5PSImI3hEOyYjeEE7JiN4RDsmI3hBOy8qKiYjeEQ7JiN4QTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyAqLyYjeEQ7JiN4QTtwdWJsaWMgY2xhc3MgRm9ya05vZGVGaWd1cmUgZXh0ZW5kcyBvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlIHsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3B1YmxpYyBGb3JrTm9kZUZpZ3VyZSgpIHsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4OTt0aGlzLnNldEJhY2tncm91bmRDb2xvcihGT1JLTk9ERUZJR1VSRV9CQUNLJiN4RDsmI3hBOyYjeEQ7JiN4QTspOyYjeEQ7JiN4QTsmI3g5OyYjeDk7dGhpcy5zZXRQcmVmZXJyZWRTaXplKGdldE1hcE1vZGUoKS5EUHRvTFAoMTAwKSwgZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSk7JiN4RDsmI3hBOyYjeDk7JiN4OTt0aGlzLnNldFNpemUoZ2V0TWFwTW9kZSgpLkRQdG9MUCgxMDApLCBnZXRNYXBNb2RlKCkuRFB0b0xQKDUpKTsmI3hEOyYjeEE7JiN4OTsmI3g5O2NyZWF0ZUNvbnRlbnRzKCk7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3ByaXZhdGUgdm9pZCBjcmVhdGVDb250ZW50cygpeyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJpdmF0ZSBib29sZWFuIG15VXNlTG9jYWxDb29yZGluYXRlcyA9IGZhbHNlOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJvdGVjdGVkIGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcygpIHsmI3hEOyYjeEE7JiN4OTsmI3g5O3JldHVybiBteVVzZUxvY2FsQ29vcmRpbmF0ZXM7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJvdGVjdGVkIHZvaWQgc2V0VXNlTG9jYWxDb29yZGluYXRlcyhib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMpIHsmI3hEOyYjeEE7JiN4OTsmI3g5O215VXNlTG9jYWxDb29yZGluYXRlcyA9IHVzZUxvY2FsQ29vcmRpbmF0ZXM7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3hEOyYjeEE7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwdWJsaWMgc3RhdGljIGZpbmFsIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvciBGT1JLTk9ERUZJR1VSRV9CQUNLID0gbmV3IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcihudWxsLCA0NSwgODUsIDEzMCk7JiN4RDsmI3hBOyI+Ci0gICAgICAgIDxhdHRyaWJ1dGVzCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlN0eWxlQXR0cmlidXRlcyIKLSAgICAgICAgICAgIGZpeGVkQmFja2dyb3VuZD0idHJ1ZSIvPgotICAgICAgICA8YXR0cmlidXRlcwotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpSZXNpemVDb25zdHJhaW50cyIKLSAgICAgICAgICAgIHJlc2l6ZUhhbmRsZXM9IjI0Ii8+Ci0gICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5kcmF3MmQ8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgIDwvdmlld21hcD4KLSAgICAgIDxtb2RlbEZhY2V0PgotICAgICAgICA8bWV0YUNsYXNzCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZ2VubW9kZWwjLy91bWwvRm9ya05vZGUiLz4KLSAgICAgICAgPGNvbnRhaW5tZW50TWV0YUZlYXR1cmUKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5nZW5tb2RlbCMvL3VtbC9BY3Rpdml0eS9ub2RlIi8+Ci0gICAgICAgIDxjaGlsZE1ldGFGZWF0dXJlCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZ2VubW9kZWwjLy91bWwvQWN0aXZpdHkvbm9kZSIvPgotICAgICAgPC9tb2RlbEZhY2V0PgotICAgIDwvdG9wTGV2ZWxOb2Rlcz4KLSAgICA8dG9wTGV2ZWxOb2RlcwotICAgICAgICB2aXN1YWxJRD0iMTAwNCIKLSAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9IkluaXRpYWxOb2RlRWRpdFBhcnQiCi0gICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IkluaXRpYWxOb2RlSXRlbVNlbWFudGljRWRpdFBvbGljeSIKLSAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iSW5pdGlhbE5vZGVWaWV3RmFjdG9yeSIKLSAgICAgICAgY2Fub25pY2FsRWRpdFBvbGljeUNsYXNzTmFtZT0iSW5pdGlhbE5vZGVDYW5vbmljYWxFZGl0UG9saWN5IgotICAgICAgICBncmFwaGljYWxOb2RlRWRpdFBvbGljeUNsYXNzTmFtZT0iSW5pdGlhbE5vZGVHcmFwaGljYWxOb2RlRWRpdFBvbGljeSI+Ci0gICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcwotICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL05vZGUiLz4KLSAgICAgIDxlbGVtZW50VHlwZQotICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46TWV0YW1vZGVsVHlwZSIKLSAgICAgICAgICBlZGl0SGVscGVyQ2xhc3NOYW1lPSJJbml0aWFsTm9kZUVkaXRIZWxwZXIiLz4KLSAgICAgIDx2aWV3bWFwCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpJbm5lckNsYXNzVmlld21hcCIKLSAgICAgICAgICBjbGFzc05hbWU9IkluaXRpYWxOb2RlRmlndXJlIgotICAgICAgICAgIGNsYXNzQm9keT0iJiN4RDsmI3hBOyYjeEQ7JiN4QTsvKiomI3hEOyYjeEE7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsgKi8mI3hEOyYjeEE7cHVibGljIGNsYXNzIEluaXRpYWxOb2RlRmlndXJlIGV4dGVuZHMgb3JnLmVjbGlwc2UuZHJhdzJkLkVsbGlwc2UgeyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHVibGljIEluaXRpYWxOb2RlRmlndXJlKCkgeyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3g5OyYjeDk7dGhpcy5zZXRGb3JlZ3JvdW5kQ29sb3Iob3JnLmVjbGlwc2UuZHJhdzJkLkNvbG9yQ29uc3RhbnRzLmRhcmtCbHVlJiN4RDsmI3hBOyYjeEQ7JiN4QTspOyYjeEQ7JiN4QTsmI3g5OyYjeDk7dGhpcy5zZXRCYWNrZ3JvdW5kQ29sb3IoSU5JVElBTE5PREVGSUdVUkVfQkFDSyYjeEQ7JiN4QTsmI3hEOyYjeEE7KTsmI3hEOyYjeEE7JiN4OTsmI3g5O3RoaXMuc2V0UHJlZmVycmVkU2l6ZShnZXRNYXBNb2RlKCkuRFB0b0xQKDIwKSwgZ2V0TWFwTW9kZSgpLkRQdG9MUCgyMCkpOyYjeEQ7JiN4QTsmI3g5OyYjeDk7dGhpcy5zZXRTaXplKGdldE1hcE1vZGUoKS5EUHRvTFAoMjApLCBnZXRNYXBNb2RlKCkuRFB0b0xQKDIwKSk7JiN4RDsmI3hBOyYjeDk7JiN4OTtjcmVhdGVDb250ZW50cygpOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIHZvaWQgY3JlYXRlQ29udGVudHMoKXsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3ByaXZhdGUgYm9vbGVhbiBteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSBmYWxzZTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3Byb3RlY3RlZCBib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMoKSB7JiN4RDsmI3hBOyYjeDk7JiN4OTtyZXR1cm4gbXlVc2VMb2NhbENvb3JkaW5hdGVzOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3Byb3RlY3RlZCB2b2lkIHNldFVzZUxvY2FsQ29vcmRpbmF0ZXMoYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKSB7JiN4RDsmI3hBOyYjeDk7JiN4OTtteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSB1c2VMb2NhbENvb3JkaW5hdGVzOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4RDsmI3hBO30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHVibGljIHN0YXRpYyBmaW5hbCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3IgSU5JVElBTE5PREVGSUdVUkVfQkFDSyA9IG5ldyBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3IobnVsbCwgNDUsIDg1LCAxMzApOyYjeEQ7JiN4QTsiPgotICAgICAgICA8YXR0cmlidXRlcwotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpTdHlsZUF0dHJpYnV0ZXMiCi0gICAgICAgICAgICBmaXhlZEZvcmVncm91bmQ9InRydWUiCi0gICAgICAgICAgICBmaXhlZEJhY2tncm91bmQ9InRydWUiLz4KLSAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmRyYXcyZDwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWk8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgPC92aWV3bWFwPgotICAgICAgPG1vZGVsRmFjZXQ+Ci0gICAgICAgIDxtZXRhQ2xhc3MKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5nZW5tb2RlbCMvL3VtbC9Jbml0aWFsTm9kZSIvPgotICAgICAgICA8Y29udGFpbm1lbnRNZXRhRmVhdHVyZQotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmdlbm1vZGVsIy8vdW1sL0FjdGl2aXR5L25vZGUiLz4KLSAgICAgICAgPGNoaWxkTWV0YUZlYXR1cmUKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5nZW5tb2RlbCMvL3VtbC9BY3Rpdml0eS9ub2RlIi8+Ci0gICAgICA8L21vZGVsRmFjZXQ+Ci0gICAgICA8bGFiZWxzCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpHZW5FeHRlcm5hbE5vZGVMYWJlbCIKLSAgICAgICAgICB2aXN1YWxJRD0iNDAwMyIKLSAgICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iSW5pdGlhbE5vZGVOYW1lRWRpdFBhcnQiCi0gICAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iSW5pdGlhbE5vZGVOYW1lSXRlbVNlbWFudGljRWRpdFBvbGljeSIKLSAgICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJJbml0aWFsTm9kZU5hbWVWaWV3RmFjdG9yeSI+Ci0gICAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzCi0gICAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+Ci0gICAgICAgIDx2aWV3bWFwCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOkZpZ3VyZVZpZXdtYXAiCi0gICAgICAgICAgICBmaWd1cmVRdWFsaWZpZWRDbGFzc05hbWU9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCI+Ci0gICAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmRyYXcyZDwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aTwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICAgIDwvdmlld21hcD4KLSAgICAgICAgPG1vZGVsRmFjZXQKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46RmVhdHVyZUxhYmVsTW9kZWxGYWNldCIKLSAgICAgICAgICAgIHZpZXdQYXR0ZXJuPSJ7MH0iCi0gICAgICAgICAgICBlZGl0UGF0dGVybj0iIj4KLSAgICAgICAgICA8bWV0YUZlYXR1cmVzCi0gICAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5nZW5tb2RlbCMvL3VtbC9OYW1lZEVsZW1lbnQvbmFtZSIvPgotICAgICAgICA8L21vZGVsRmFjZXQ+Ci0gICAgICA8L2xhYmVscz4KLSAgICA8L3RvcExldmVsTm9kZXM+Ci0gICAgPHRvcExldmVsTm9kZXMKLSAgICAgICAgdmlzdWFsSUQ9IjEwMDUiCi0gICAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJEZWNpc2lvbk5vZGVFZGl0UGFydCIKLSAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iRGVjaXNpb25Ob2RlSXRlbVNlbWFudGljRWRpdFBvbGljeSIKLSAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iRGVjaXNpb25Ob2RlVmlld0ZhY3RvcnkiCi0gICAgICAgIGNhbm9uaWNhbEVkaXRQb2xpY3lDbGFzc05hbWU9IkRlY2lzaW9uTm9kZUNhbm9uaWNhbEVkaXRQb2xpY3kiCi0gICAgICAgIGdyYXBoaWNhbE5vZGVFZGl0UG9saWN5Q2xhc3NOYW1lPSJEZWNpc2lvbk5vZGVHcmFwaGljYWxOb2RlRWRpdFBvbGljeSI+Ci0gICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcwotICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL05vZGUiLz4KLSAgICAgIDxlbGVtZW50VHlwZQotICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46TWV0YW1vZGVsVHlwZSIKLSAgICAgICAgICBlZGl0SGVscGVyQ2xhc3NOYW1lPSJEZWNpc2lvbk5vZGVFZGl0SGVscGVyIi8+Ci0gICAgICA8dmlld21hcAotICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46SW5uZXJDbGFzc1ZpZXdtYXAiCi0gICAgICAgICAgY2xhc3NOYW1lPSJEZWNpc2lvbkRpYW1vbmRGaWd1cmUiCi0gICAgICAgICAgY2xhc3NCb2R5PSImI3hEOyYjeEE7JiN4RDsmI3hBOy8qKiYjeEQ7JiN4QTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyAqLyYjeEQ7JiN4QTtwdWJsaWMgY2xhc3MgRGVjaXNpb25EaWFtb25kRmlndXJlIGV4dGVuZHMgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuY3VzdG9tLmZpZ3VyZXMuRGVjaXNpb25Ob2RlRmlndXJlIHsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3B1YmxpYyBEZWNpc2lvbkRpYW1vbmRGaWd1cmUoKSB7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7JiN4OTt0aGlzLnNldEZvcmVncm91bmRDb2xvcihvcmcuZWNsaXBzZS5kcmF3MmQuQ29sb3JDb25zdGFudHMuZGFya0JsdWUmI3hEOyYjeEE7JiN4RDsmI3hBOyk7JiN4RDsmI3hBOyYjeDk7JiN4OTt0aGlzLnNldEJhY2tncm91bmRDb2xvcihERUNJU0lPTkRJQU1PTkRGSUdVUkVfQkFDSyYjeEQ7JiN4QTsmI3hEOyYjeEE7KTsmI3hEOyYjeEE7JiN4OTsmI3g5O3RoaXMuc2V0UHJlZmVycmVkU2l6ZShnZXRNYXBNb2RlKCkuRFB0b0xQKDUwKSwgZ2V0TWFwTW9kZSgpLkRQdG9MUCg1MCkpOyYjeEQ7JiN4QTsmI3g5OyYjeDk7dGhpcy5zZXRTaXplKGdldE1hcE1vZGUoKS5EUHRvTFAoNTApLCBnZXRNYXBNb2RlKCkuRFB0b0xQKDUwKSk7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5OyYjeDk7Y3JlYXRlQ29udGVudHMoKTsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbnRlbnRzKCl7JiN4RDsmI3hBOyYjeDk7JiN4OTtvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZmlnXzAgPSBuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsKCk7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5OyYjeDk7c2V0RmlndXJlRGlhbW9uZExhYmVsKGZpZ18wKTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeDk7T2JqZWN0IGxheURhdGEwID0gbnVsbDsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7JiN4OTt0aGlzLmFkZChmaWdfMCwgbGF5RGF0YTApOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCBmRGlhbW9uZExhYmVsOyAmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3B1YmxpYyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZ2V0RmlndXJlRGlhbW9uZExhYmVsKCkgeyYjeEQ7JiN4QTsmI3g5OyYjeDk7cmV0dXJuIGZEaWFtb25kTGFiZWw7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIHZvaWQgc2V0RmlndXJlRGlhbW9uZExhYmVsKG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCBmaWcpeyYjeEQ7JiN4QTsmI3g5OyYjeDk7ZkRpYW1vbmRMYWJlbCA9IGZpZzsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIGJvb2xlYW4gbXlVc2VMb2NhbENvb3JkaW5hdGVzID0gZmFsc2U7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcm90ZWN0ZWQgYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKCkgeyYjeEQ7JiN4QTsmI3g5OyYjeDk7cmV0dXJuIG15VXNlTG9jYWxDb29yZGluYXRlczsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcm90ZWN0ZWQgdm9pZCBzZXRVc2VMb2NhbENvb3JkaW5hdGVzKGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcykgeyYjeEQ7JiN4QTsmI3g5OyYjeDk7bXlVc2VMb2NhbENvb3JkaW5hdGVzID0gdXNlTG9jYWxDb29yZGluYXRlczsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeEQ7JiN4QTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3B1YmxpYyBzdGF0aWMgZmluYWwgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yIERFQ0lTSU9ORElBTU9OREZJR1VSRV9CQUNLID0gbmV3IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcihudWxsLCAxODUsIDIwNSwgMjMwKTsmI3hEOyYjeEE7Ij4KLSAgICAgICAgPGF0dHJpYnV0ZXMKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46U3R5bGVBdHRyaWJ1dGVzIgotICAgICAgICAgICAgZml4ZWRGb3JlZ3JvdW5kPSJ0cnVlIgotICAgICAgICAgICAgZml4ZWRCYWNrZ3JvdW5kPSJ0cnVlIi8+Ci0gICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5kcmF3MmQ8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgIDwvdmlld21hcD4KLSAgICAgIDxtb2RlbEZhY2V0PgotICAgICAgICA8bWV0YUNsYXNzCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZ2VubW9kZWwjLy91bWwvRGVjaXNpb25Ob2RlIi8+Ci0gICAgICAgIDxjb250YWlubWVudE1ldGFGZWF0dXJlCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZ2VubW9kZWwjLy91bWwvQWN0aXZpdHkvbm9kZSIvPgotICAgICAgICA8Y2hpbGRNZXRhRmVhdHVyZQotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmdlbm1vZGVsIy8vdW1sL0FjdGl2aXR5L25vZGUiLz4KLSAgICAgIDwvbW9kZWxGYWNldD4KLSAgICAgIDxsYWJlbHMKLSAgICAgICAgICB2aXN1YWxJRD0iNDAwNCIKLSAgICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iRGVjaXNpb25Ob2RlTmFtZUVkaXRQYXJ0IgotICAgICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IkRlY2lzaW9uTm9kZU5hbWVJdGVtU2VtYW50aWNFZGl0UG9saWN5IgotICAgICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9IkRlY2lzaW9uTm9kZU5hbWVWaWV3RmFjdG9yeSI+Ci0gICAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzCi0gICAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+Ci0gICAgICAgIDx2aWV3bWFwCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOklubmVyQ2xhc3NWaWV3bWFwIgotICAgICAgICAgICAgY2xhc3NOYW1lPSJOb2RlTmFtZUZpZ3VyZSIKLSAgICAgICAgICAgIGNsYXNzQm9keT0iJiN4RDsmI3hBOyYjeEQ7JiN4QTsvKiomI3hEOyYjeEE7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsgKi8mI3hEOyYjeEE7cHVibGljIGNsYXNzIE5vZGVOYW1lRmlndXJlIGV4dGVuZHMgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIHsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3B1YmxpYyBOb2RlTmFtZUZpZ3VyZSgpIHsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5OyYjeDk7dGhpcy5zZXRUZXh0KCZxdW90OyZxdW90Oyk7JiN4RDsmI3hBOyYjeDk7JiN4OTtjcmVhdGVDb250ZW50cygpOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIHZvaWQgY3JlYXRlQ29udGVudHMoKXsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3ByaXZhdGUgYm9vbGVhbiBteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSBmYWxzZTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3Byb3RlY3RlZCBib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMoKSB7JiN4RDsmI3hBOyYjeDk7JiN4OTtyZXR1cm4gbXlVc2VMb2NhbENvb3JkaW5hdGVzOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3Byb3RlY3RlZCB2b2lkIHNldFVzZUxvY2FsQ29vcmRpbmF0ZXMoYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKSB7JiN4RDsmI3hBOyYjeDk7JiN4OTtteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSB1c2VMb2NhbENvb3JkaW5hdGVzOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4RDsmI3hBO30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7Ij4KLSAgICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZHJhdzJkPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgICAgPC92aWV3bWFwPgotICAgICAgICA8bW9kZWxGYWNldAotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpGZWF0dXJlTGFiZWxNb2RlbEZhY2V0IgotICAgICAgICAgICAgZWRpdFBhdHRlcm49IiI+Ci0gICAgICAgICAgPG1ldGFGZWF0dXJlcwotICAgICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZ2VubW9kZWwjLy91bWwvTmFtZWRFbGVtZW50L25hbWUiLz4KLSAgICAgICAgPC9tb2RlbEZhY2V0PgotICAgICAgPC9sYWJlbHM+Ci0gICAgPC90b3BMZXZlbE5vZGVzPgotICAgIDx0b3BMZXZlbE5vZGVzCi0gICAgICAgIHZpc3VhbElEPSIxMDA2IgotICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iSm9pbk5vZGVFZGl0UGFydCIKLSAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iSm9pbk5vZGVJdGVtU2VtYW50aWNFZGl0UG9saWN5IgotICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJKb2luTm9kZVZpZXdGYWN0b3J5IgotICAgICAgICBjYW5vbmljYWxFZGl0UG9saWN5Q2xhc3NOYW1lPSJKb2luTm9kZUNhbm9uaWNhbEVkaXRQb2xpY3kiCi0gICAgICAgIGdyYXBoaWNhbE5vZGVFZGl0UG9saWN5Q2xhc3NOYW1lPSJKb2luTm9kZUdyYXBoaWNhbE5vZGVFZGl0UG9saWN5Ij4KLSAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzCi0gICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vTm9kZSIvPgotICAgICAgPGVsZW1lbnRUeXBlCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpNZXRhbW9kZWxUeXBlIgotICAgICAgICAgIGVkaXRIZWxwZXJDbGFzc05hbWU9IkpvaW5Ob2RlRWRpdEhlbHBlciIvPgotICAgICAgPHZpZXdtYXAKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOklubmVyQ2xhc3NWaWV3bWFwIgotICAgICAgICAgIGNsYXNzTmFtZT0iRm9ya05vZGVGaWd1cmUiCi0gICAgICAgICAgY2xhc3NCb2R5PSImI3hEOyYjeEE7JiN4RDsmI3hBOy8qKiYjeEQ7JiN4QTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyAqLyYjeEQ7JiN4QTtwdWJsaWMgY2xhc3MgRm9ya05vZGVGaWd1cmUgZXh0ZW5kcyBvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlIHsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3B1YmxpYyBGb3JrTm9kZUZpZ3VyZSgpIHsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4OTt0aGlzLnNldEJhY2tncm91bmRDb2xvcihGT1JLTk9ERUZJR1VSRV9CQUNLJiN4RDsmI3hBOyYjeEQ7JiN4QTspOyYjeEQ7JiN4QTsmI3g5OyYjeDk7dGhpcy5zZXRQcmVmZXJyZWRTaXplKGdldE1hcE1vZGUoKS5EUHRvTFAoMTAwKSwgZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSk7JiN4RDsmI3hBOyYjeDk7JiN4OTt0aGlzLnNldFNpemUoZ2V0TWFwTW9kZSgpLkRQdG9MUCgxMDApLCBnZXRNYXBNb2RlKCkuRFB0b0xQKDUpKTsmI3hEOyYjeEE7JiN4OTsmI3g5O2NyZWF0ZUNvbnRlbnRzKCk7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3ByaXZhdGUgdm9pZCBjcmVhdGVDb250ZW50cygpeyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJpdmF0ZSBib29sZWFuIG15VXNlTG9jYWxDb29yZGluYXRlcyA9IGZhbHNlOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJvdGVjdGVkIGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcygpIHsmI3hEOyYjeEE7JiN4OTsmI3g5O3JldHVybiBteVVzZUxvY2FsQ29vcmRpbmF0ZXM7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJvdGVjdGVkIHZvaWQgc2V0VXNlTG9jYWxDb29yZGluYXRlcyhib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMpIHsmI3hEOyYjeEE7JiN4OTsmI3g5O215VXNlTG9jYWxDb29yZGluYXRlcyA9IHVzZUxvY2FsQ29vcmRpbmF0ZXM7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3hEOyYjeEE7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwdWJsaWMgc3RhdGljIGZpbmFsIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvciBGT1JLTk9ERUZJR1VSRV9CQUNLID0gbmV3IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcihudWxsLCA0NSwgODUsIDEzMCk7JiN4RDsmI3hBOyI+Ci0gICAgICAgIDxhdHRyaWJ1dGVzCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlN0eWxlQXR0cmlidXRlcyIKLSAgICAgICAgICAgIGZpeGVkQmFja2dyb3VuZD0idHJ1ZSIvPgotICAgICAgICA8YXR0cmlidXRlcwotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpSZXNpemVDb25zdHJhaW50cyIKLSAgICAgICAgICAgIHJlc2l6ZUhhbmRsZXM9IjI0Ii8+Ci0gICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5kcmF3MmQ8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgIDwvdmlld21hcD4KLSAgICAgIDxtb2RlbEZhY2V0PgotICAgICAgICA8bWV0YUNsYXNzCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZ2VubW9kZWwjLy91bWwvSm9pbk5vZGUiLz4KLSAgICAgICAgPGNvbnRhaW5tZW50TWV0YUZlYXR1cmUKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5nZW5tb2RlbCMvL3VtbC9BY3Rpdml0eS9ub2RlIi8+Ci0gICAgICAgIDxjaGlsZE1ldGFGZWF0dXJlCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZ2VubW9kZWwjLy91bWwvQWN0aXZpdHkvbm9kZSIvPgotICAgICAgPC9tb2RlbEZhY2V0PgotICAgIDwvdG9wTGV2ZWxOb2Rlcz4KLSAgICA8dG9wTGV2ZWxOb2RlcwotICAgICAgICB2aXN1YWxJRD0iMTAwNyIKLSAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9IlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVFZGl0UGFydCIKLSAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iU3RydWN0dXJlZEFjdGl2aXR5Tm9kZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiCi0gICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9IlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVWaWV3RmFjdG9yeSIKLSAgICAgICAgY2Fub25pY2FsRWRpdFBvbGljeUNsYXNzTmFtZT0iU3RydWN0dXJlZEFjdGl2aXR5Tm9kZUNhbm9uaWNhbEVkaXRQb2xpY3kiCi0gICAgICAgIGdyYXBoaWNhbE5vZGVFZGl0UG9saWN5Q2xhc3NOYW1lPSJTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kiPgotICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MKLSAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+Ci0gICAgICA8ZWxlbWVudFR5cGUKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOk1ldGFtb2RlbFR5cGUiCi0gICAgICAgICAgZWRpdEhlbHBlckNsYXNzTmFtZT0iU3RydWN0dXJlZEFjdGl2aXR5Tm9kZUVkaXRIZWxwZXIiLz4KLSAgICAgIDx2aWV3bWFwCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpJbm5lckNsYXNzVmlld21hcCIKLSAgICAgICAgICBjbGFzc05hbWU9IlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVGaWd1cmUiCi0gICAgICAgICAgY2xhc3NCb2R5PSImI3hEOyYjeEE7JiN4RDsmI3hBOy8qKiYjeEQ7JiN4QTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyAqLyYjeEQ7JiN4QTtwdWJsaWMgY2xhc3MgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZUZpZ3VyZSBleHRlbmRzIG9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmUgeyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHVibGljIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVGaWd1cmUoKSB7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeDk7dGhpcy5zZXRPdXRsaW5lKGZhbHNlKTsmI3hEOyYjeEE7JiN4OTsmI3g5O2NyZWF0ZUNvbnRlbnRzKCk7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3ByaXZhdGUgdm9pZCBjcmVhdGVDb250ZW50cygpeyYjeEQ7JiN4QTsmI3g5OyYjeDk7b3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIGZpZ18wID0gbmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCgpOyYjeEQ7JiN4QTtmaWdfMC5zZXRUZXh0KCZxdW90OyZxdW90Oyk7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7JiN4OTtzZXRGaWd1cmVOb2RlTmFtZUZpZ3VyZShmaWdfMCk7JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3g5O09iamVjdCBsYXlEYXRhMCA9IG51bGw7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5OyYjeDk7dGhpcy5hZGQoZmlnXzAsIGxheURhdGEwKTsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJpdmF0ZSBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZk5vZGVOYW1lRmlndXJlOyAmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3B1YmxpYyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZ2V0RmlndXJlTm9kZU5hbWVGaWd1cmUoKSB7JiN4RDsmI3hBOyYjeDk7JiN4OTtyZXR1cm4gZk5vZGVOYW1lRmlndXJlOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJpdmF0ZSB2b2lkIHNldEZpZ3VyZU5vZGVOYW1lRmlndXJlKG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCBmaWcpeyYjeEQ7JiN4QTsmI3g5OyYjeDk7Zk5vZGVOYW1lRmlndXJlID0gZmlnOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3ByaXZhdGUgYm9vbGVhbiBteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSBmYWxzZTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3Byb3RlY3RlZCBib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMoKSB7JiN4RDsmI3hBOyYjeDk7JiN4OTtyZXR1cm4gbXlVc2VMb2NhbENvb3JkaW5hdGVzOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3Byb3RlY3RlZCB2b2lkIHNldFVzZUxvY2FsQ29vcmRpbmF0ZXMoYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKSB7JiN4RDsmI3hBOyYjeDk7JiN4OTtteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSB1c2VMb2NhbENvb3JkaW5hdGVzOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4RDsmI3hBO30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7Ij4KLSAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmRyYXcyZDwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWk8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgPC92aWV3bWFwPgotICAgICAgPG1vZGVsRmFjZXQ+Ci0gICAgICAgIDxtZXRhQ2xhc3MKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5nZW5tb2RlbCMvL3VtbC9TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlIi8+Ci0gICAgICAgIDxjb250YWlubWVudE1ldGFGZWF0dXJlCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZ2VubW9kZWwjLy91bWwvQWN0aXZpdHkvbm9kZSIvPgotICAgICAgICA8Y2hpbGRNZXRhRmVhdHVyZQotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmdlbm1vZGVsIy8vdW1sL0FjdGl2aXR5L25vZGUiLz4KLSAgICAgICAgPG1vZGVsRWxlbWVudFNlbGVjdG9yCi0gICAgICAgICAgICBib2R5PSJnZXRVbWFUeXBlX0FjdGl2aXR5IgotICAgICAgICAgICAgbGFuZ3VhZ2U9ImphdmEiLz4KLSAgICAgICAgPG1vZGVsRWxlbWVudEluaXRpYWxpemVyCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOkdlbkZlYXR1cmVTZXFJbml0aWFsaXplciI+Ci0gICAgICAgICAgPGluaXRpYWxpemVycwotICAgICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOkdlbkZlYXR1cmVWYWx1ZVNwZWMiCi0gICAgICAgICAgICAgIGJvZHk9ImNyZWF0ZVVtYVR5cGVfQWN0aXZpdHkmI3hEOyYjeEE7IgotICAgICAgICAgICAgICBsYW5ndWFnZT0iamF2YSI+Ci0gICAgICAgICAgICA8ZmVhdHVyZQotICAgICAgICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5lbWYuZWNvcmUvbW9kZWwvRWNvcmUuZ2VubW9kZWwjLy9lY29yZS9FTW9kZWxFbGVtZW50L2VBbm5vdGF0aW9ucyIvPgotICAgICAgICAgIDwvaW5pdGlhbGl6ZXJzPgotICAgICAgICA8L21vZGVsRWxlbWVudEluaXRpYWxpemVyPgotICAgICAgPC9tb2RlbEZhY2V0PgotICAgICAgPGxhYmVscwotICAgICAgICAgIHZpc3VhbElEPSI0MDA1IgotICAgICAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZUVkaXRQYXJ0IgotICAgICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVOYW1lSXRlbVNlbWFudGljRWRpdFBvbGljeSIKLSAgICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZVZpZXdGYWN0b3J5Ij4KLSAgICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL05vZGUiLz4KLSAgICAgICAgPHZpZXdtYXAKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46UGFyZW50QXNzaWduZWRWaWV3bWFwIgotICAgICAgICAgICAgZ2V0dGVyTmFtZT0iZ2V0RmlndXJlTm9kZU5hbWVGaWd1cmUiCi0gICAgICAgICAgICBmaWd1cmVRdWFsaWZpZWRDbGFzc05hbWU9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCIvPgotICAgICAgICA8bW9kZWxGYWNldAotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpGZWF0dXJlTGFiZWxNb2RlbEZhY2V0Ij4KLSAgICAgICAgICA8bWV0YUZlYXR1cmVzCi0gICAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5nZW5tb2RlbCMvL3VtbC9OYW1lZEVsZW1lbnQvbmFtZSIvPgotICAgICAgICA8L21vZGVsRmFjZXQ+Ci0gICAgICA8L2xhYmVscz4KLSAgICA8L3RvcExldmVsTm9kZXM+Ci0gICAgPHRvcExldmVsTm9kZXMKLSAgICAgICAgdmlzdWFsSUQ9IjEwMDgiCi0gICAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJBY3Rpdml0eVBhcnRpdGlvbkVkaXRQYXJ0IgotICAgICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJBY3Rpdml0eVBhcnRpdGlvbkl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiCi0gICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9IkFjdGl2aXR5UGFydGl0aW9uVmlld0ZhY3RvcnkiCi0gICAgICAgIGNhbm9uaWNhbEVkaXRQb2xpY3lDbGFzc05hbWU9IkFjdGl2aXR5UGFydGl0aW9uQ2Fub25pY2FsRWRpdFBvbGljeSIKLSAgICAgICAgY29tcGFydG1lbnRzPSIvL0BkaWFncmFtL0Bjb21wYXJ0bWVudHMuMCIKLSAgICAgICAgZ3JhcGhpY2FsTm9kZUVkaXRQb2xpY3lDbGFzc05hbWU9IkFjdGl2aXR5UGFydGl0aW9uR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kiPgotICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MKLSAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+Ci0gICAgICA8ZWxlbWVudFR5cGUKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOk1ldGFtb2RlbFR5cGUiCi0gICAgICAgICAgZWRpdEhlbHBlckNsYXNzTmFtZT0iQWN0aXZpdHlQYXJ0aXRpb25FZGl0SGVscGVyIi8+Ci0gICAgICA8dmlld21hcAotICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46SW5uZXJDbGFzc1ZpZXdtYXAiCi0gICAgICAgICAgbGF5b3V0VHlwZT0iWFlfTEFZT1VUIgotICAgICAgICAgIGNsYXNzTmFtZT0iQWN0aXZpdHlQYXJ0aXRpb25GaWd1cmUiCi0gICAgICAgICAgY2xhc3NCb2R5PSImI3hEOyYjeEE7JiN4RDsmI3hBOy8qKiYjeEQ7JiN4QTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyAqLyYjeEQ7JiN4QTtwdWJsaWMgY2xhc3MgQWN0aXZpdHlQYXJ0aXRpb25GaWd1cmUgZXh0ZW5kcyBvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlIHsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3B1YmxpYyBBY3Rpdml0eVBhcnRpdGlvbkZpZ3VyZSgpIHsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4OTtvcmcuZWNsaXBzZS5kcmF3MmQuWFlMYXlvdXQgbXlHZW5MYXlvdXRNYW5hZ2VyID0gbmV3IG9yZy5lY2xpcHNlLmRyYXcyZC5YWUxheW91dCgpOyYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3g5O3RoaXMuc2V0TGF5b3V0TWFuYWdlcihteUdlbkxheW91dE1hbmFnZXIpOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeDk7JiN4OTt0aGlzLnNldEZvcmVncm91bmRDb2xvcihvcmcuZWNsaXBzZS5kcmF3MmQuQ29sb3JDb25zdGFudHMuYmxhY2smI3hEOyYjeEE7JiN4RDsmI3hBOyk7JiN4RDsmI3hBOyYjeDk7JiN4OTt0aGlzLnNldEJhY2tncm91bmRDb2xvcihBQ1RJVklUWVBBUlRJVElPTkZJR1VSRV9CQUNLJiN4RDsmI3hBOyYjeEQ7JiN4QTspOyYjeEQ7JiN4QTsmI3g5OyYjeDk7dGhpcy5zZXRQcmVmZXJyZWRTaXplKGdldE1hcE1vZGUoKS5EUHRvTFAoMzAwKSwgZ2V0TWFwTW9kZSgpLkRQdG9MUCg2MDApKTsmI3hEOyYjeEE7JiN4OTsmI3g5O3RoaXMuc2V0U2l6ZShnZXRNYXBNb2RlKCkuRFB0b0xQKDMwMCksIGdldE1hcE1vZGUoKS5EUHRvTFAoNjAwKSk7JiN4RDsmI3hBOyYjeDk7JiN4OTt0aGlzLnNldEJvcmRlcigmI3hEOyYjeEE7bmV3IG9yZy5lY2xpcHNlLmRyYXcyZC5MaW5lQm9yZGVyKCkmI3hEOyYjeEE7KTsmI3hEOyYjeEE7JiN4OTsmI3g5O2NyZWF0ZUNvbnRlbnRzKCk7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3ByaXZhdGUgdm9pZCBjcmVhdGVDb250ZW50cygpeyYjeEQ7JiN4QTsmI3g5OyYjeDk7b3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIGZpZ18wID0gbmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCgpOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsmI3g5O3NldEZpZ3VyZVBhcnRpdGlvbkxhYmVsRmlndXJlKGZpZ18wKTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeDk7T2JqZWN0IGxheURhdGEwID0gbnVsbDsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7JiN4OTt0aGlzLmFkZChmaWdfMCwgbGF5RGF0YTApOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCBmUGFydGl0aW9uTGFiZWxGaWd1cmU7ICYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHVibGljIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCBnZXRGaWd1cmVQYXJ0aXRpb25MYWJlbEZpZ3VyZSgpIHsmI3hEOyYjeEE7JiN4OTsmI3g5O3JldHVybiBmUGFydGl0aW9uTGFiZWxGaWd1cmU7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIHZvaWQgc2V0RmlndXJlUGFydGl0aW9uTGFiZWxGaWd1cmUob3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIGZpZyl7JiN4RDsmI3hBOyYjeDk7JiN4OTtmUGFydGl0aW9uTGFiZWxGaWd1cmUgPSBmaWc7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJpdmF0ZSBib29sZWFuIG15VXNlTG9jYWxDb29yZGluYXRlcyA9IGZhbHNlOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJvdGVjdGVkIGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcygpIHsmI3hEOyYjeEE7JiN4OTsmI3g5O3JldHVybiBteVVzZUxvY2FsQ29vcmRpbmF0ZXM7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJvdGVjdGVkIHZvaWQgc2V0VXNlTG9jYWxDb29yZGluYXRlcyhib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMpIHsmI3hEOyYjeEE7JiN4OTsmI3g5O215VXNlTG9jYWxDb29yZGluYXRlcyA9IHVzZUxvY2FsQ29vcmRpbmF0ZXM7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3hEOyYjeEE7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwdWJsaWMgc3RhdGljIGZpbmFsIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvciBBQ1RJVklUWVBBUlRJVElPTkZJR1VSRV9CQUNLID0gbmV3IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcihudWxsLCAyNTUsIDI1NSwgMjU1KTsmI3hEOyYjeEE7Ij4KLSAgICAgICAgPGF0dHJpYnV0ZXMKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46U3R5bGVBdHRyaWJ1dGVzIgotICAgICAgICAgICAgZml4ZWRGb3JlZ3JvdW5kPSJ0cnVlIgotICAgICAgICAgICAgZml4ZWRCYWNrZ3JvdW5kPSJ0cnVlIi8+Ci0gICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5kcmF3MmQ8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgIDwvdmlld21hcD4KLSAgICAgIDxtb2RlbEZhY2V0PgotICAgICAgICA8bWV0YUNsYXNzCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZ2VubW9kZWwjLy91bWwvQWN0aXZpdHlQYXJ0aXRpb24iLz4KLSAgICAgICAgPGNvbnRhaW5tZW50TWV0YUZlYXR1cmUKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5nZW5tb2RlbCMvL3VtbC9BY3Rpdml0eS9ncm91cCIvPgotICAgICAgICA8Y2hpbGRNZXRhRmVhdHVyZQotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmdlbm1vZGVsIy8vdW1sL0FjdGl2aXR5L2dyb3VwIi8+Ci0gICAgICA8L21vZGVsRmFjZXQ+Ci0gICAgICA8bGFiZWxzCi0gICAgICAgICAgdmlzdWFsSUQ9IjQwMDciCi0gICAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9IkFjdGl2aXR5UGFydGl0aW9uTmFtZTJFZGl0UGFydCIKLSAgICAgICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJBY3Rpdml0eVBhcnRpdGlvbk5hbWUySXRlbVNlbWFudGljRWRpdFBvbGljeSIKLSAgICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJBY3Rpdml0eVBhcnRpdGlvbk5hbWUyVmlld0ZhY3RvcnkiCi0gICAgICAgICAgZWxlbWVudEljb249InRydWUiPgotICAgICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcwotICAgICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vTm9kZSIvPgotICAgICAgICA8dmlld21hcAotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpQYXJlbnRBc3NpZ25lZFZpZXdtYXAiCi0gICAgICAgICAgICBnZXR0ZXJOYW1lPSJnZXRGaWd1cmVQYXJ0aXRpb25MYWJlbEZpZ3VyZSIKLSAgICAgICAgICAgIGZpZ3VyZVF1YWxpZmllZENsYXNzTmFtZT0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIi8+Ci0gICAgICAgIDxtb2RlbEZhY2V0Ci0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOkZlYXR1cmVMYWJlbE1vZGVsRmFjZXQiCi0gICAgICAgICAgICB2aWV3UGF0dGVybj0iezB9IgotICAgICAgICAgICAgZWRpdFBhdHRlcm49IiI+Ci0gICAgICAgICAgPG1ldGFGZWF0dXJlcwotICAgICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZ2VubW9kZWwjLy91bWwvTmFtZWRFbGVtZW50L25hbWUiLz4KLSAgICAgICAgPC9tb2RlbEZhY2V0PgotICAgICAgPC9sYWJlbHM+Ci0gICAgPC90b3BMZXZlbE5vZGVzPgotICAgIDx0b3BMZXZlbE5vZGVzCi0gICAgICAgIHZpc3VhbElEPSIxMDA5IgotICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iQWN0aXZpdHlQYXJhbWV0ZXJOb2RlRWRpdFBhcnQiCi0gICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IkFjdGl2aXR5UGFyYW1ldGVyTm9kZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiCi0gICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9IkFjdGl2aXR5UGFyYW1ldGVyTm9kZVZpZXdGYWN0b3J5IgotICAgICAgICBjYW5vbmljYWxFZGl0UG9saWN5Q2xhc3NOYW1lPSJBY3Rpdml0eVBhcmFtZXRlck5vZGVDYW5vbmljYWxFZGl0UG9saWN5IgotICAgICAgICBncmFwaGljYWxOb2RlRWRpdFBvbGljeUNsYXNzTmFtZT0iQWN0aXZpdHlQYXJhbWV0ZXJOb2RlR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kiPgotICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MKLSAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+Ci0gICAgICA8ZWxlbWVudFR5cGUKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOk1ldGFtb2RlbFR5cGUiCi0gICAgICAgICAgZWRpdEhlbHBlckNsYXNzTmFtZT0iQWN0aXZpdHlQYXJhbWV0ZXJOb2RlRWRpdEhlbHBlciIvPgotICAgICAgPHZpZXdtYXAKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOklubmVyQ2xhc3NWaWV3bWFwIgotICAgICAgICAgIGNsYXNzTmFtZT0iQWN0aXZpdHlQYXJhbWV0ZXJOb2RlRmlndXJlIgotICAgICAgICAgIGNsYXNzQm9keT0iJiN4RDsmI3hBOyYjeEQ7JiN4QTsvKiomI3hEOyYjeEE7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsgKi8mI3hEOyYjeEE7cHVibGljIGNsYXNzIEFjdGl2aXR5UGFyYW1ldGVyTm9kZUZpZ3VyZSBleHRlbmRzIG9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmUgeyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHVibGljIEFjdGl2aXR5UGFyYW1ldGVyTm9kZUZpZ3VyZSgpIHsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4OTt0aGlzLnNldE91dGxpbmUoZmFsc2UpOyYjeEQ7JiN4QTsmI3g5OyYjeDk7Y3JlYXRlQ29udGVudHMoKTsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbnRlbnRzKCl7JiN4RDsmI3hBOyYjeDk7JiN4OTtvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZmlnXzAgPSBuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsKCk7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5OyYjeDk7c2V0RmlndXJlQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZUxhYmVsKGZpZ18wKTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeDk7T2JqZWN0IGxheURhdGEwID0gbnVsbDsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7JiN4OTt0aGlzLmFkZChmaWdfMCwgbGF5RGF0YTApOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCBmQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZUxhYmVsOyAmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3B1YmxpYyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZ2V0RmlndXJlQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZUxhYmVsKCkgeyYjeEQ7JiN4QTsmI3g5OyYjeDk7cmV0dXJuIGZBY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lTGFiZWw7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIHZvaWQgc2V0RmlndXJlQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZUxhYmVsKG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCBmaWcpeyYjeEQ7JiN4QTsmI3g5OyYjeDk7ZkFjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWVMYWJlbCA9IGZpZzsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIGJvb2xlYW4gbXlVc2VMb2NhbENvb3JkaW5hdGVzID0gZmFsc2U7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcm90ZWN0ZWQgYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKCkgeyYjeEQ7JiN4QTsmI3g5OyYjeDk7cmV0dXJuIG15VXNlTG9jYWxDb29yZGluYXRlczsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcm90ZWN0ZWQgdm9pZCBzZXRVc2VMb2NhbENvb3JkaW5hdGVzKGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcykgeyYjeEQ7JiN4QTsmI3g5OyYjeDk7bXlVc2VMb2NhbENvb3JkaW5hdGVzID0gdXNlTG9jYWxDb29yZGluYXRlczsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeEQ7JiN4QTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyI+Ci0gICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5kcmF3MmQ8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgIDwvdmlld21hcD4KLSAgICAgIDxtb2RlbEZhY2V0PgotICAgICAgICA8bWV0YUNsYXNzCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZ2VubW9kZWwjLy91bWwvQWN0aXZpdHlQYXJhbWV0ZXJOb2RlIi8+Ci0gICAgICAgIDxjb250YWlubWVudE1ldGFGZWF0dXJlCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZ2VubW9kZWwjLy91bWwvQWN0aXZpdHkvbm9kZSIvPgotICAgICAgICA8Y2hpbGRNZXRhRmVhdHVyZQotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmdlbm1vZGVsIy8vdW1sL0FjdGl2aXR5L25vZGUiLz4KLSAgICAgICAgPG1vZGVsRWxlbWVudFNlbGVjdG9yCi0gICAgICAgICAgICBib2R5PSJnZXRVbWFUeXBlX1Rhc2tEZXNjcmlwdG9yIgotICAgICAgICAgICAgbGFuZ3VhZ2U9ImphdmEiLz4KLSAgICAgICAgPG1vZGVsRWxlbWVudEluaXRpYWxpemVyCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOkdlbkZlYXR1cmVTZXFJbml0aWFsaXplciI+Ci0gICAgICAgICAgPGluaXRpYWxpemVycwotICAgICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOkdlbkZlYXR1cmVWYWx1ZVNwZWMiCi0gICAgICAgICAgICAgIGJvZHk9ImNyZWF0ZVVtYVR5cGVfVGFza0Rlc2NyaXB0b3IiCi0gICAgICAgICAgICAgIGxhbmd1YWdlPSJqYXZhIj4KLSAgICAgICAgICAgIDxmZWF0dXJlCi0gICAgICAgICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmVtZi5lY29yZS9tb2RlbC9FY29yZS5nZW5tb2RlbCMvL2Vjb3JlL0VNb2RlbEVsZW1lbnQvZUFubm90YXRpb25zIi8+Ci0gICAgICAgICAgPC9pbml0aWFsaXplcnM+Ci0gICAgICAgIDwvbW9kZWxFbGVtZW50SW5pdGlhbGl6ZXI+Ci0gICAgICA8L21vZGVsRmFjZXQ+Ci0gICAgICA8bGFiZWxzCi0gICAgICAgICAgdmlzdWFsSUQ9IjQwMDgiCi0gICAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9IkFjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWVFZGl0UGFydCIKLSAgICAgICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJBY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lSXRlbVNlbWFudGljRWRpdFBvbGljeSIKLSAgICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJBY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lVmlld0ZhY3RvcnkiPgotICAgICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcwotICAgICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vTm9kZSIvPgotICAgICAgICA8dmlld21hcAotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpQYXJlbnRBc3NpZ25lZFZpZXdtYXAiCi0gICAgICAgICAgICBnZXR0ZXJOYW1lPSJnZXRGaWd1cmVBY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lTGFiZWwiCi0gICAgICAgICAgICBmaWd1cmVRdWFsaWZpZWRDbGFzc05hbWU9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCIvPgotICAgICAgICA8bW9kZWxGYWNldAotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpGZWF0dXJlTGFiZWxNb2RlbEZhY2V0Ij4KLSAgICAgICAgICA8bWV0YUZlYXR1cmVzCi0gICAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5nZW5tb2RlbCMvL3VtbC9OYW1lZEVsZW1lbnQvbmFtZSIvPgotICAgICAgICA8L21vZGVsRmFjZXQ+Ci0gICAgICA8L2xhYmVscz4KLSAgICA8L3RvcExldmVsTm9kZXM+Ci0gICAgPHRvcExldmVsTm9kZXMKLSAgICAgICAgdmlzdWFsSUQ9IjEwMTAiCi0gICAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlMkVkaXRQYXJ0IgotICAgICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlMkl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiCi0gICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9IlN0cnVjdHVyZWRBY3Rpdml0eU5vZGUyVmlld0ZhY3RvcnkiCi0gICAgICAgIGNhbm9uaWNhbEVkaXRQb2xpY3lDbGFzc05hbWU9IlN0cnVjdHVyZWRBY3Rpdml0eU5vZGUyQ2Fub25pY2FsRWRpdFBvbGljeSIKLSAgICAgICAgZ3JhcGhpY2FsTm9kZUVkaXRQb2xpY3lDbGFzc05hbWU9IlN0cnVjdHVyZWRBY3Rpdml0eU5vZGUyR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kiPgotICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MKLSAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+Ci0gICAgICA8ZWxlbWVudFR5cGUKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlNwZWNpYWxpemF0aW9uVHlwZSIKLSAgICAgICAgICBtZXRhbW9kZWxUeXBlPSIvL0BkaWFncmFtL0B0b3BMZXZlbE5vZGVzLjYvQGVsZW1lbnRUeXBlIgotICAgICAgICAgIGVkaXRIZWxwZXJBZHZpY2VDbGFzc05hbWU9IlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVFZGl0SGVscGVyQWR2aWNlIi8+Ci0gICAgICA8dmlld21hcAotICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46SW5uZXJDbGFzc1ZpZXdtYXAiCi0gICAgICAgICAgY2xhc3NOYW1lPSJTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlRmlndXJlIgotICAgICAgICAgIGNsYXNzQm9keT0iJiN4RDsmI3hBOyYjeEQ7JiN4QTsvKiomI3hEOyYjeEE7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsgKi8mI3hEOyYjeEE7cHVibGljIGNsYXNzIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVGaWd1cmUgZXh0ZW5kcyBvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlIHsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3B1YmxpYyBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlRmlndXJlKCkgeyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3g5O3RoaXMuc2V0T3V0bGluZShmYWxzZSk7JiN4RDsmI3hBOyYjeDk7JiN4OTtjcmVhdGVDb250ZW50cygpOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIHZvaWQgY3JlYXRlQ29udGVudHMoKXsmI3hEOyYjeEE7JiN4OTsmI3g5O29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCBmaWdfMCA9IG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwoKTsmI3hEOyYjeEE7ZmlnXzAuc2V0VGV4dCgmcXVvdDsmcXVvdDspOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5OyYjeDk7c2V0RmlndXJlTm9kZU5hbWVGaWd1cmUoZmlnXzApOyYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4OTtPYmplY3QgbGF5RGF0YTAgPSBudWxsOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsmI3g5O3RoaXMuYWRkKGZpZ18wLCBsYXlEYXRhMCk7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3ByaXZhdGUgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIGZOb2RlTmFtZUZpZ3VyZTsgJiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwdWJsaWMgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIGdldEZpZ3VyZU5vZGVOYW1lRmlndXJlKCkgeyYjeEQ7JiN4QTsmI3g5OyYjeDk7cmV0dXJuIGZOb2RlTmFtZUZpZ3VyZTsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3ByaXZhdGUgdm9pZCBzZXRGaWd1cmVOb2RlTmFtZUZpZ3VyZShvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZmlnKXsmI3hEOyYjeEE7JiN4OTsmI3g5O2ZOb2RlTmFtZUZpZ3VyZSA9IGZpZzsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIGJvb2xlYW4gbXlVc2VMb2NhbENvb3JkaW5hdGVzID0gZmFsc2U7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcm90ZWN0ZWQgYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKCkgeyYjeEQ7JiN4QTsmI3g5OyYjeDk7cmV0dXJuIG15VXNlTG9jYWxDb29yZGluYXRlczsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcm90ZWN0ZWQgdm9pZCBzZXRVc2VMb2NhbENvb3JkaW5hdGVzKGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcykgeyYjeEQ7JiN4QTsmI3g5OyYjeDk7bXlVc2VMb2NhbENvb3JkaW5hdGVzID0gdXNlTG9jYWxDb29yZGluYXRlczsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeEQ7JiN4QTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyI+Ci0gICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5kcmF3MmQ8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgIDwvdmlld21hcD4KLSAgICAgIDxtb2RlbEZhY2V0PgotICAgICAgICA8bWV0YUNsYXNzCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZ2VubW9kZWwjLy91bWwvU3RydWN0dXJlZEFjdGl2aXR5Tm9kZSIvPgotICAgICAgICA8Y29udGFpbm1lbnRNZXRhRmVhdHVyZQotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmdlbm1vZGVsIy8vdW1sL0FjdGl2aXR5L25vZGUiLz4KLSAgICAgICAgPGNoaWxkTWV0YUZlYXR1cmUKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5nZW5tb2RlbCMvL3VtbC9BY3Rpdml0eS9ub2RlIi8+Ci0gICAgICAgIDxtb2RlbEVsZW1lbnRTZWxlY3RvcgotICAgICAgICAgICAgYm9keT0iZ2V0VW1hVHlwZV9QaGFzZSIKLSAgICAgICAgICAgIGxhbmd1YWdlPSJqYXZhIi8+Ci0gICAgICAgIDxtb2RlbEVsZW1lbnRJbml0aWFsaXplcgotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpHZW5GZWF0dXJlU2VxSW5pdGlhbGl6ZXIiPgotICAgICAgICAgIDxpbml0aWFsaXplcnMKLSAgICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpHZW5GZWF0dXJlVmFsdWVTcGVjIgotICAgICAgICAgICAgICBib2R5PSJjcmVhdGVVbWFUeXBlX1BoYXNlIgotICAgICAgICAgICAgICBsYW5ndWFnZT0iamF2YSI+Ci0gICAgICAgICAgICA8ZmVhdHVyZQotICAgICAgICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5lbWYuZWNvcmUvbW9kZWwvRWNvcmUuZ2VubW9kZWwjLy9lY29yZS9FTW9kZWxFbGVtZW50L2VBbm5vdGF0aW9ucyIvPgotICAgICAgICAgIDwvaW5pdGlhbGl6ZXJzPgotICAgICAgICA8L21vZGVsRWxlbWVudEluaXRpYWxpemVyPgotICAgICAgPC9tb2RlbEZhY2V0PgotICAgICAgPGxhYmVscwotICAgICAgICAgIHZpc3VhbElEPSI0MDA5IgotICAgICAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZTJFZGl0UGFydCIKLSAgICAgICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZTJJdGVtU2VtYW50aWNFZGl0UG9saWN5IgotICAgICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9IlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVOYW1lMlZpZXdGYWN0b3J5Ij4KLSAgICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL05vZGUiLz4KLSAgICAgICAgPHZpZXdtYXAKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46UGFyZW50QXNzaWduZWRWaWV3bWFwIgotICAgICAgICAgICAgZ2V0dGVyTmFtZT0iZ2V0RmlndXJlTm9kZU5hbWVGaWd1cmUiCi0gICAgICAgICAgICBmaWd1cmVRdWFsaWZpZWRDbGFzc05hbWU9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCIvPgotICAgICAgICA8bW9kZWxGYWNldAotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpGZWF0dXJlTGFiZWxNb2RlbEZhY2V0Ij4KLSAgICAgICAgICA8bWV0YUZlYXR1cmVzCi0gICAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5nZW5tb2RlbCMvL3VtbC9OYW1lZEVsZW1lbnQvbmFtZSIvPgotICAgICAgICA8L21vZGVsRmFjZXQ+Ci0gICAgICA8L2xhYmVscz4KLSAgICA8L3RvcExldmVsTm9kZXM+Ci0gICAgPHRvcExldmVsTm9kZXMKLSAgICAgICAgdmlzdWFsSUQ9IjEwMTEiCi0gICAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlM0VkaXRQYXJ0IgotICAgICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlM0l0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiCi0gICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9IlN0cnVjdHVyZWRBY3Rpdml0eU5vZGUzVmlld0ZhY3RvcnkiCi0gICAgICAgIGNhbm9uaWNhbEVkaXRQb2xpY3lDbGFzc05hbWU9IlN0cnVjdHVyZWRBY3Rpdml0eU5vZGUzQ2Fub25pY2FsRWRpdFBvbGljeSIKLSAgICAgICAgZ3JhcGhpY2FsTm9kZUVkaXRQb2xpY3lDbGFzc05hbWU9IlN0cnVjdHVyZWRBY3Rpdml0eU5vZGUzR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kiPgotICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MKLSAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+Ci0gICAgICA8ZWxlbWVudFR5cGUKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlNwZWNpYWxpemF0aW9uVHlwZSIKLSAgICAgICAgICBtZXRhbW9kZWxUeXBlPSIvL0BkaWFncmFtL0B0b3BMZXZlbE5vZGVzLjYvQGVsZW1lbnRUeXBlIgotICAgICAgICAgIGVkaXRIZWxwZXJBZHZpY2VDbGFzc05hbWU9IlN0cnVjdHVyZWRBY3Rpdml0eU5vZGUyRWRpdEhlbHBlckFkdmljZSIvPgotICAgICAgPHZpZXdtYXAKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOklubmVyQ2xhc3NWaWV3bWFwIgotICAgICAgICAgIGNsYXNzTmFtZT0iU3RydWN0dXJlZEFjdGl2aXR5Tm9kZUZpZ3VyZSIKLSAgICAgICAgICBjbGFzc0JvZHk9IiYjeEQ7JiN4QTsmI3hEOyYjeEE7LyoqJiN4RDsmI3hBOyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7ICovJiN4RDsmI3hBO3B1YmxpYyBjbGFzcyBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlRmlndXJlIGV4dGVuZHMgb3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZSB7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwdWJsaWMgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZUZpZ3VyZSgpIHsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4OTt0aGlzLnNldE91dGxpbmUoZmFsc2UpOyYjeEQ7JiN4QTsmI3g5OyYjeDk7Y3JlYXRlQ29udGVudHMoKTsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbnRlbnRzKCl7JiN4RDsmI3hBOyYjeDk7JiN4OTtvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZmlnXzAgPSBuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsKCk7JiN4RDsmI3hBO2ZpZ18wLnNldFRleHQoJnF1b3Q7JnF1b3Q7KTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsmI3g5O3NldEZpZ3VyZU5vZGVOYW1lRmlndXJlKGZpZ18wKTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeDk7T2JqZWN0IGxheURhdGEwID0gbnVsbDsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7JiN4OTt0aGlzLmFkZChmaWdfMCwgbGF5RGF0YTApOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCBmTm9kZU5hbWVGaWd1cmU7ICYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHVibGljIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCBnZXRGaWd1cmVOb2RlTmFtZUZpZ3VyZSgpIHsmI3hEOyYjeEE7JiN4OTsmI3g5O3JldHVybiBmTm9kZU5hbWVGaWd1cmU7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIHZvaWQgc2V0RmlndXJlTm9kZU5hbWVGaWd1cmUob3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIGZpZyl7JiN4RDsmI3hBOyYjeDk7JiN4OTtmTm9kZU5hbWVGaWd1cmUgPSBmaWc7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJpdmF0ZSBib29sZWFuIG15VXNlTG9jYWxDb29yZGluYXRlcyA9IGZhbHNlOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJvdGVjdGVkIGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcygpIHsmI3hEOyYjeEE7JiN4OTsmI3g5O3JldHVybiBteVVzZUxvY2FsQ29vcmRpbmF0ZXM7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJvdGVjdGVkIHZvaWQgc2V0VXNlTG9jYWxDb29yZGluYXRlcyhib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMpIHsmI3hEOyYjeEE7JiN4OTsmI3g5O215VXNlTG9jYWxDb29yZGluYXRlcyA9IHVzZUxvY2FsQ29vcmRpbmF0ZXM7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3hEOyYjeEE7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsiPgotICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZHJhdzJkPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aTwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICA8L3ZpZXdtYXA+Ci0gICAgICA8bW9kZWxGYWNldD4KLSAgICAgICAgPG1ldGFDbGFzcwotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmdlbm1vZGVsIy8vdW1sL1N0cnVjdHVyZWRBY3Rpdml0eU5vZGUiLz4KLSAgICAgICAgPGNvbnRhaW5tZW50TWV0YUZlYXR1cmUKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5nZW5tb2RlbCMvL3VtbC9BY3Rpdml0eS9ub2RlIi8+Ci0gICAgICAgIDxjaGlsZE1ldGFGZWF0dXJlCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZ2VubW9kZWwjLy91bWwvQWN0aXZpdHkvbm9kZSIvPgotICAgICAgICA8bW9kZWxFbGVtZW50U2VsZWN0b3IKLSAgICAgICAgICAgIGJvZHk9ImdldFVtYVR5cGVfSXRlcmF0aW9uIgotICAgICAgICAgICAgbGFuZ3VhZ2U9ImphdmEiLz4KLSAgICAgICAgPG1vZGVsRWxlbWVudEluaXRpYWxpemVyCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOkdlbkZlYXR1cmVTZXFJbml0aWFsaXplciI+Ci0gICAgICAgICAgPGluaXRpYWxpemVycwotICAgICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOkdlbkZlYXR1cmVWYWx1ZVNwZWMiCi0gICAgICAgICAgICAgIGJvZHk9ImNyZWF0ZVVtYVR5cGVfSXRlcmF0aW9uIgotICAgICAgICAgICAgICBsYW5ndWFnZT0iamF2YSI+Ci0gICAgICAgICAgICA8ZmVhdHVyZQotICAgICAgICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5lbWYuZWNvcmUvbW9kZWwvRWNvcmUuZ2VubW9kZWwjLy9lY29yZS9FTW9kZWxFbGVtZW50L2VBbm5vdGF0aW9ucyIvPgotICAgICAgICAgIDwvaW5pdGlhbGl6ZXJzPgotICAgICAgICA8L21vZGVsRWxlbWVudEluaXRpYWxpemVyPgotICAgICAgPC9tb2RlbEZhY2V0PgotICAgICAgPGxhYmVscwotICAgICAgICAgIHZpc3VhbElEPSI0MDEwIgotICAgICAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZTNFZGl0UGFydCIKLSAgICAgICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZTNJdGVtU2VtYW50aWNFZGl0UG9saWN5IgotICAgICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9IlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVOYW1lM1ZpZXdGYWN0b3J5Ij4KLSAgICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL05vZGUiLz4KLSAgICAgICAgPHZpZXdtYXAKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46UGFyZW50QXNzaWduZWRWaWV3bWFwIgotICAgICAgICAgICAgZ2V0dGVyTmFtZT0iZ2V0RmlndXJlTm9kZU5hbWVGaWd1cmUiCi0gICAgICAgICAgICBmaWd1cmVRdWFsaWZpZWRDbGFzc05hbWU9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCIvPgotICAgICAgICA8bW9kZWxGYWNldAotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpGZWF0dXJlTGFiZWxNb2RlbEZhY2V0Ij4KLSAgICAgICAgICA8bWV0YUZlYXR1cmVzCi0gICAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5nZW5tb2RlbCMvL3VtbC9OYW1lZEVsZW1lbnQvbmFtZSIvPgotICAgICAgICA8L21vZGVsRmFjZXQ+Ci0gICAgICA8L2xhYmVscz4KLSAgICA8L3RvcExldmVsTm9kZXM+Ci0gICAgPHRvcExldmVsTm9kZXMKLSAgICAgICAgdmlzdWFsSUQ9IjEwMTIiCi0gICAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJBY3Rpdml0eVBhcmFtZXRlck5vZGUyRWRpdFBhcnQiCi0gICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IkFjdGl2aXR5UGFyYW1ldGVyTm9kZTJJdGVtU2VtYW50aWNFZGl0UG9saWN5IgotICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJBY3Rpdml0eVBhcmFtZXRlck5vZGUyVmlld0ZhY3RvcnkiCi0gICAgICAgIGNhbm9uaWNhbEVkaXRQb2xpY3lDbGFzc05hbWU9IkFjdGl2aXR5UGFyYW1ldGVyTm9kZTJDYW5vbmljYWxFZGl0UG9saWN5IgotICAgICAgICBncmFwaGljYWxOb2RlRWRpdFBvbGljeUNsYXNzTmFtZT0iQWN0aXZpdHlQYXJhbWV0ZXJOb2RlMkdyYXBoaWNhbE5vZGVFZGl0UG9saWN5Ij4KLSAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzCi0gICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vTm9kZSIvPgotICAgICAgPGVsZW1lbnRUeXBlCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpTcGVjaWFsaXphdGlvblR5cGUiCi0gICAgICAgICAgbWV0YW1vZGVsVHlwZT0iLy9AZGlhZ3JhbS9AdG9wTGV2ZWxOb2Rlcy44L0BlbGVtZW50VHlwZSIKLSAgICAgICAgICBlZGl0SGVscGVyQWR2aWNlQ2xhc3NOYW1lPSJBY3Rpdml0eVBhcmFtZXRlck5vZGVFZGl0SGVscGVyQWR2aWNlIi8+Ci0gICAgICA8dmlld21hcAotICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46SW5uZXJDbGFzc1ZpZXdtYXAiCi0gICAgICAgICAgY2xhc3NOYW1lPSJBY3Rpdml0eVBhcmFtZXRlck5vZGVGaWd1cmUiCi0gICAgICAgICAgY2xhc3NCb2R5PSImI3hEOyYjeEE7JiN4RDsmI3hBOy8qKiYjeEQ7JiN4QTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyAqLyYjeEQ7JiN4QTtwdWJsaWMgY2xhc3MgQWN0aXZpdHlQYXJhbWV0ZXJOb2RlRmlndXJlIGV4dGVuZHMgb3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZSB7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwdWJsaWMgQWN0aXZpdHlQYXJhbWV0ZXJOb2RlRmlndXJlKCkgeyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3g5O3RoaXMuc2V0T3V0bGluZShmYWxzZSk7JiN4RDsmI3hBOyYjeDk7JiN4OTtjcmVhdGVDb250ZW50cygpOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIHZvaWQgY3JlYXRlQ29udGVudHMoKXsmI3hEOyYjeEE7JiN4OTsmI3g5O29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCBmaWdfMCA9IG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwoKTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7JiN4OTtzZXRGaWd1cmVBY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lTGFiZWwoZmlnXzApOyYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4OTtPYmplY3QgbGF5RGF0YTAgPSBudWxsOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsmI3g5O3RoaXMuYWRkKGZpZ18wLCBsYXlEYXRhMCk7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3ByaXZhdGUgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIGZBY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lTGFiZWw7ICYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHVibGljIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCBnZXRGaWd1cmVBY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lTGFiZWwoKSB7JiN4RDsmI3hBOyYjeDk7JiN4OTtyZXR1cm4gZkFjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWVMYWJlbDsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3ByaXZhdGUgdm9pZCBzZXRGaWd1cmVBY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lTGFiZWwob3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIGZpZyl7JiN4RDsmI3hBOyYjeDk7JiN4OTtmQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZUxhYmVsID0gZmlnOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3ByaXZhdGUgYm9vbGVhbiBteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSBmYWxzZTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3Byb3RlY3RlZCBib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMoKSB7JiN4RDsmI3hBOyYjeDk7JiN4OTtyZXR1cm4gbXlVc2VMb2NhbENvb3JkaW5hdGVzOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3Byb3RlY3RlZCB2b2lkIHNldFVzZUxvY2FsQ29vcmRpbmF0ZXMoYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKSB7JiN4RDsmI3hBOyYjeDk7JiN4OTtteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSB1c2VMb2NhbENvb3JkaW5hdGVzOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4RDsmI3hBO30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7Ij4KLSAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmRyYXcyZDwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWk8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgPC92aWV3bWFwPgotICAgICAgPG1vZGVsRmFjZXQ+Ci0gICAgICAgIDxtZXRhQ2xhc3MKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5nZW5tb2RlbCMvL3VtbC9BY3Rpdml0eVBhcmFtZXRlck5vZGUiLz4KLSAgICAgICAgPGNvbnRhaW5tZW50TWV0YUZlYXR1cmUKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5nZW5tb2RlbCMvL3VtbC9BY3Rpdml0eS9ub2RlIi8+Ci0gICAgICAgIDxjaGlsZE1ldGFGZWF0dXJlCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZ2VubW9kZWwjLy91bWwvQWN0aXZpdHkvbm9kZSIvPgotICAgICAgICA8bW9kZWxFbGVtZW50U2VsZWN0b3IKLSAgICAgICAgICAgIGJvZHk9ImdldFVtYVR5cGVfTWlsZXN0b25lIgotICAgICAgICAgICAgbGFuZ3VhZ2U9ImphdmEiLz4KLSAgICAgICAgPG1vZGVsRWxlbWVudEluaXRpYWxpemVyCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOkdlbkZlYXR1cmVTZXFJbml0aWFsaXplciI+Ci0gICAgICAgICAgPGluaXRpYWxpemVycwotICAgICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOkdlbkZlYXR1cmVWYWx1ZVNwZWMiCi0gICAgICAgICAgICAgIGJvZHk9ImNyZWF0ZVVtYVR5cGVfTWlsZXN0b25lIgotICAgICAgICAgICAgICBsYW5ndWFnZT0iamF2YSI+Ci0gICAgICAgICAgICA8ZmVhdHVyZQotICAgICAgICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5lbWYuZWNvcmUvbW9kZWwvRWNvcmUuZ2VubW9kZWwjLy9lY29yZS9FTW9kZWxFbGVtZW50L2VBbm5vdGF0aW9ucyIvPgotICAgICAgICAgIDwvaW5pdGlhbGl6ZXJzPgotICAgICAgICA8L21vZGVsRWxlbWVudEluaXRpYWxpemVyPgotICAgICAgPC9tb2RlbEZhY2V0PgotICAgICAgPGxhYmVscwotICAgICAgICAgIHZpc3VhbElEPSI0MDExIgotICAgICAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJBY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lMkVkaXRQYXJ0IgotICAgICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IkFjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWUySXRlbVNlbWFudGljRWRpdFBvbGljeSIKLSAgICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJBY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lMlZpZXdGYWN0b3J5Ij4KLSAgICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL05vZGUiLz4KLSAgICAgICAgPHZpZXdtYXAKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46UGFyZW50QXNzaWduZWRWaWV3bWFwIgotICAgICAgICAgICAgZ2V0dGVyTmFtZT0iZ2V0RmlndXJlQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZUxhYmVsIgotICAgICAgICAgICAgZmlndXJlUXVhbGlmaWVkQ2xhc3NOYW1lPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwiLz4KLSAgICAgICAgPG1vZGVsRmFjZXQKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46RmVhdHVyZUxhYmVsTW9kZWxGYWNldCI+Ci0gICAgICAgICAgPG1ldGFGZWF0dXJlcwotICAgICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZ2VubW9kZWwjLy91bWwvTmFtZWRFbGVtZW50L25hbWUiLz4KLSAgICAgICAgPC9tb2RlbEZhY2V0PgotICAgICAgPC9sYWJlbHM+Ci0gICAgPC90b3BMZXZlbE5vZGVzPgotICAgIDxsaW5rcwotICAgICAgICB2aXN1YWxJRD0iMzAwMSIKLSAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9IkNvbnRyb2xGbG93RWRpdFBhcnQiCi0gICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IkNvbnRyb2xGbG93SXRlbVNlbWFudGljRWRpdFBvbGljeSIKLSAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iQ29udHJvbEZsb3dWaWV3RmFjdG9yeSI+Ci0gICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcwotICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL0VkZ2UiLz4KLSAgICAgIDxlbGVtZW50VHlwZQotICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46TWV0YW1vZGVsVHlwZSIKLSAgICAgICAgICBlZGl0SGVscGVyQ2xhc3NOYW1lPSJDb250cm9sRmxvd0VkaXRIZWxwZXIiLz4KLSAgICAgIDx2aWV3bWFwCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpJbm5lckNsYXNzVmlld21hcCIKLSAgICAgICAgICBjbGFzc05hbWU9IkNvbnRyb2xGbG93RmlndXJlIgotICAgICAgICAgIGNsYXNzQm9keT0iJiN4RDsmI3hBOyYjeEQ7JiN4QTsvKiomI3hEOyYjeEE7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsgKi8mI3hEOyYjeEE7cHVibGljIGNsYXNzIENvbnRyb2xGbG93RmlndXJlIGV4dGVuZHMgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuUG9seWxpbmVDb25uZWN0aW9uRXggeyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHVibGljIENvbnRyb2xGbG93RmlndXJlKCkgeyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsmI3g5O3NldFRhcmdldERlY29yYXRpb24oY3JlYXRlVGFyZ2V0RGVjb3JhdGlvbigpKTsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJpdmF0ZSBvcmcuZWNsaXBzZS5kcmF3MmQuUG9seWxpbmVEZWNvcmF0aW9uIGNyZWF0ZVRhcmdldERlY29yYXRpb24oKSB7JiN4RDsmI3hBO29yZy5lY2xpcHNlLmRyYXcyZC5Qb2x5bGluZURlY29yYXRpb24gZGYgPSBuZXcgb3JnLmVjbGlwc2UuZHJhdzJkLlBvbHlsaW5lRGVjb3JhdGlvbigpOyYjeEQ7JiN4QTsvLyBkaXNwYXRjaE5leHQ/JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5OyYjeDk7b3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50TGlzdCBwbCA9IG5ldyBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnRMaXN0KCk7JiN4RDsmI3hBOyYjeDk7JiN4OTtwbC5hZGRQb2ludCgtMSwgMSk7JiN4RDsmI3hBOyYjeDk7JiN4OTtwbC5hZGRQb2ludCgwLCAwKTsmI3hEOyYjeEE7JiN4OTsmI3g5O3BsLmFkZFBvaW50KC0xLCAtMSk7JiN4RDsmI3hBOyYjeDk7JiN4OTtkZi5zZXRUZW1wbGF0ZShwbCk7JiN4RDsmI3hBOyYjeDk7JiN4OTtkZi5zZXRTY2FsZShnZXRNYXBNb2RlKCkuRFB0b0xQKDcpLCBnZXRNYXBNb2RlKCkuRFB0b0xQKDMpKTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7JiN4OTtyZXR1cm4gZGY7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3hEOyYjeEE7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsiPgotICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZHJhdzJkPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aTwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICA8L3ZpZXdtYXA+Ci0gICAgICA8bW9kZWxGYWNldAotICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46VHlwZUxpbmtNb2RlbEZhY2V0Ij4KLSAgICAgICAgPG1ldGFDbGFzcwotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmdlbm1vZGVsIy8vdW1sL0NvbnRyb2xGbG93Ii8+Ci0gICAgICAgIDxjb250YWlubWVudE1ldGFGZWF0dXJlCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZ2VubW9kZWwjLy91bWwvU3RydWN0dXJlZEFjdGl2aXR5Tm9kZS9lZGdlIi8+Ci0gICAgICAgIDxjaGlsZE1ldGFGZWF0dXJlCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZ2VubW9kZWwjLy91bWwvU3RydWN0dXJlZEFjdGl2aXR5Tm9kZS9lZGdlIi8+Ci0gICAgICAgIDxzb3VyY2VNZXRhRmVhdHVyZQotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmdlbm1vZGVsIy8vdW1sL0FjdGl2aXR5RWRnZS9zb3VyY2UiLz4KLSAgICAgICAgPHRhcmdldE1ldGFGZWF0dXJlCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZ2VubW9kZWwjLy91bWwvQWN0aXZpdHlFZGdlL3RhcmdldCIvPgotICAgICAgPC9tb2RlbEZhY2V0PgotICAgICAgPGxhYmVscwotICAgICAgICAgIHZpc3VhbElEPSI0MDEyIgotICAgICAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJDb250cm9sRmxvd05hbWVFZGl0UGFydCIKLSAgICAgICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJDb250cm9sRmxvd05hbWVJdGVtU2VtYW50aWNFZGl0UG9saWN5IgotICAgICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9IkNvbnRyb2xGbG93TmFtZVZpZXdGYWN0b3J5IgotICAgICAgICAgIGVsZW1lbnRJY29uPSJ0cnVlIj4KLSAgICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL05vZGUiLz4KLSAgICAgICAgPHZpZXdtYXAKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46SW5uZXJDbGFzc1ZpZXdtYXAiCi0gICAgICAgICAgICBjbGFzc05hbWU9IkNvbnRyb2xGbG93TGFiZWxGaWd1cmUiCi0gICAgICAgICAgICBjbGFzc0JvZHk9IiYjeEQ7JiN4QTsmI3hEOyYjeEE7LyoqJiN4RDsmI3hBOyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7ICovJiN4RDsmI3hBO3B1YmxpYyBjbGFzcyBDb250cm9sRmxvd0xhYmVsRmlndXJlIGV4dGVuZHMgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIHsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3B1YmxpYyBDb250cm9sRmxvd0xhYmVsRmlndXJlKCkgeyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7JiN4OTt0aGlzLnNldFRleHQoJnF1b3Q7JnF1b3Q7KTsmI3hEOyYjeEE7JiN4OTsmI3g5O2NyZWF0ZUNvbnRlbnRzKCk7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3ByaXZhdGUgdm9pZCBjcmVhdGVDb250ZW50cygpeyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJpdmF0ZSBib29sZWFuIG15VXNlTG9jYWxDb29yZGluYXRlcyA9IGZhbHNlOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJvdGVjdGVkIGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcygpIHsmI3hEOyYjeEE7JiN4OTsmI3g5O3JldHVybiBteVVzZUxvY2FsQ29vcmRpbmF0ZXM7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJvdGVjdGVkIHZvaWQgc2V0VXNlTG9jYWxDb29yZGluYXRlcyhib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMpIHsmI3hEOyYjeEE7JiN4OTsmI3g5O215VXNlTG9jYWxDb29yZGluYXRlcyA9IHVzZUxvY2FsQ29vcmRpbmF0ZXM7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3hEOyYjeEE7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsiPgotICAgICAgICAgIDxhdHRyaWJ1dGVzCi0gICAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46TGFiZWxPZmZzZXRBdHRyaWJ1dGVzIgotICAgICAgICAgICAgICB5PSI0MCIvPgotICAgICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5kcmF3MmQ8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWk8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgICA8L3ZpZXdtYXA+Ci0gICAgICAgIDxtb2RlbEZhY2V0Ci0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOkZlYXR1cmVMYWJlbE1vZGVsRmFjZXQiCi0gICAgICAgICAgICB2aWV3UGF0dGVybj0iezB9IgotICAgICAgICAgICAgZWRpdFBhdHRlcm49IiI+Ci0gICAgICAgICAgPG1ldGFGZWF0dXJlcwotICAgICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZ2VubW9kZWwjLy91bWwvTmFtZWRFbGVtZW50L25hbWUiLz4KLSAgICAgICAgPC9tb2RlbEZhY2V0PgotICAgICAgPC9sYWJlbHM+Ci0gICAgPC9saW5rcz4KLSAgICA8Y29tcGFydG1lbnRzCi0gICAgICAgIHZpc3VhbElEPSI1MDAxIgotICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iQWN0aXZpdHlQYXJ0aXRpb25QYXJ0aXRpb25DYW1wYXJ0bWVudEVkaXRQYXJ0IgotICAgICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJBY3Rpdml0eVBhcnRpdGlvblBhcnRpdGlvbkNhbXBhcnRtZW50SXRlbVNlbWFudGljRWRpdFBvbGljeSIKLSAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iQWN0aXZpdHlQYXJ0aXRpb25QYXJ0aXRpb25DYW1wYXJ0bWVudFZpZXdGYWN0b3J5IgotICAgICAgICBjYW5vbmljYWxFZGl0UG9saWN5Q2xhc3NOYW1lPSJBY3Rpdml0eVBhcnRpdGlvblBhcnRpdGlvbkNhbXBhcnRtZW50Q2Fub25pY2FsRWRpdFBvbGljeSIKLSAgICAgICAgY2hpbGROb2Rlcz0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4wIgotICAgICAgICB0aXRsZT0iUGFydGl0aW9uQ2FtcGFydG1lbnQiCi0gICAgICAgIGNhbkNvbGxhcHNlPSJmYWxzZSIKLSAgICAgICAgbmVlZHNUaXRsZT0iZmFsc2UiCi0gICAgICAgIG5vZGU9Ii8vQGRpYWdyYW0vQHRvcExldmVsTm9kZXMuNyIKLSAgICAgICAgbGlzdExheW91dD0iZmFsc2UiPgotICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MKLSAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+Ci0gICAgICA8dmlld21hcAotICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46RmlndXJlVmlld21hcCIKLSAgICAgICAgICBmaWd1cmVRdWFsaWZpZWRDbGFzc05hbWU9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZmlndXJlcy5SZXNpemFibGVDb21wYXJ0bWVudEZpZ3VyZSI+Ci0gICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5kcmF3MmQ8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgIDwvdmlld21hcD4KLSAgICA8L2NvbXBhcnRtZW50cz4KLSAgICA8Y29tcGFydG1lbnRzCi0gICAgICAgIHZpc3VhbElEPSI1MDAyIgotICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iQWN0aXZpdHlQYXJ0aXRpb25QYXJ0aXRpb25DYW1wYXJ0bWVudDJFZGl0UGFydCIKLSAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iQWN0aXZpdHlQYXJ0aXRpb25QYXJ0aXRpb25DYW1wYXJ0bWVudDJJdGVtU2VtYW50aWNFZGl0UG9saWN5IgotICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJBY3Rpdml0eVBhcnRpdGlvblBhcnRpdGlvbkNhbXBhcnRtZW50MlZpZXdGYWN0b3J5IgotICAgICAgICBjYW5vbmljYWxFZGl0UG9saWN5Q2xhc3NOYW1lPSJBY3Rpdml0eVBhcnRpdGlvblBhcnRpdGlvbkNhbXBhcnRtZW50MkNhbm9uaWNhbEVkaXRQb2xpY3kiCi0gICAgICAgIGNoaWxkTm9kZXM9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMCIKLSAgICAgICAgdGl0bGU9IlBhcnRpdGlvbkNhbXBhcnRtZW50IgotICAgICAgICBjYW5Db2xsYXBzZT0iZmFsc2UiCi0gICAgICAgIG5lZWRzVGl0bGU9ImZhbHNlIgotICAgICAgICBub2RlPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjAiCi0gICAgICAgIGxpc3RMYXlvdXQ9ImZhbHNlIj4KLSAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzCi0gICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vTm9kZSIvPgotICAgICAgPHZpZXdtYXAKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOkZpZ3VyZVZpZXdtYXAiCi0gICAgICAgICAgZmlndXJlUXVhbGlmaWVkQ2xhc3NOYW1lPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmZpZ3VyZXMuUmVzaXphYmxlQ29tcGFydG1lbnRGaWd1cmUiPgotICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZHJhdzJkPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aTwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICA8L3ZpZXdtYXA+Ci0gICAgPC9jb21wYXJ0bWVudHM+Ci0gICAgPHBhbGV0dGU+Ci0gICAgICA8Z3JvdXBzCi0gICAgICAgICAgdGl0bGU9IkZsb3dzIgotICAgICAgICAgIGRlc2NyaXB0aW9uPSJDcmVhdGlvbiB0b29sIGZvciBmbG93cyIKLSAgICAgICAgICBjb2xsYXBzZT0idHJ1ZSI+Ci0gICAgICAgIDxlbnRyaWVzCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlRvb2xFbnRyeSIKLSAgICAgICAgICAgIHRpdGxlPSJDb250cm9sIEZsb3ciCi0gICAgICAgICAgICBkZXNjcmlwdGlvbj0iQ3JlYXRlIG5ldyBDb250cm9sIEZsb3ciCi0gICAgICAgICAgICBzbWFsbEljb25QYXRoPSIvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL2ljb25zL2Z1bGwvb2JqMTYvQ29udHJvbEZsb3cuZ2lmIgotICAgICAgICAgICAgZ2VuTGlua3M9Ii8vQGRpYWdyYW0vQGxpbmtzLjAiLz4KLSAgICAgIDwvZ3JvdXBzPgotICAgICAgPGdyb3VwcwotICAgICAgICAgIHRpdGxlPSJOb2RlcyIKLSAgICAgICAgICBkZXNjcmlwdGlvbj0iQ3JlYXRpb24gdG9vbCBncm91cCBmb3Igbm9kZXMiCi0gICAgICAgICAgY29sbGFwc2U9InRydWUiPgotICAgICAgICA8ZW50cmllcwotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpUb29sRW50cnkiCi0gICAgICAgICAgICB0aXRsZT0iQWN0aXZpdHkgUGFydGl0aW9uIgotICAgICAgICAgICAgZGVzY3JpcHRpb249IkNyZWF0ZSBuZXcgQWN0aXZpdHkgUGFydGl0aW9uIgotICAgICAgICAgICAgc21hbGxJY29uUGF0aD0iL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9pY29ucy9mdWxsL29iajE2L0FjdGl2aXR5UGFydGl0aW9uLmdpZiIKLSAgICAgICAgICAgIGdlbk5vZGVzPSIvL0BkaWFncmFtL0B0b3BMZXZlbE5vZGVzLjcgLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4wIi8+Ci0gICAgICAgIDxlbnRyaWVzCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlRvb2xFbnRyeSIKLSAgICAgICAgICAgIHRpdGxlPSJTdGFydCBOb2RlIgotICAgICAgICAgICAgZGVzY3JpcHRpb249IkNyZWF0ZSBuZXcgU3RhcnQgTm9kZSIKLSAgICAgICAgICAgIHNtYWxsSWNvblBhdGg9Ii9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvaWNvbnMvZnVsbC9vYmoxNi9Jbml0aWFsTm9kZS5naWYiCi0gICAgICAgICAgICBnZW5Ob2Rlcz0iLy9AZGlhZ3JhbS9AdG9wTGV2ZWxOb2Rlcy4zIi8+Ci0gICAgICAgIDxlbnRyaWVzCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlRvb2xFbnRyeSIKLSAgICAgICAgICAgIHRpdGxlPSJGb3JrIE5vZGUiCi0gICAgICAgICAgICBkZXNjcmlwdGlvbj0iQ3JlYXRlIG5ldyBGb3JrIE5vZGUiCi0gICAgICAgICAgICBzbWFsbEljb25QYXRoPSIvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL2ljb25zL2Z1bGwvb2JqMTYvRm9ya05vZGUuZ2lmIgotICAgICAgICAgICAgZ2VuTm9kZXM9Ii8vQGRpYWdyYW0vQHRvcExldmVsTm9kZXMuMiIvPgotICAgICAgICA8ZW50cmllcwotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpUb29sRW50cnkiCi0gICAgICAgICAgICB0aXRsZT0iTWVyZ2UgTm9kZSIKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJDcmVhdGUgbmV3IE1lcmdlIE5vZGUiCi0gICAgICAgICAgICBzbWFsbEljb25QYXRoPSIvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL2ljb25zL2Z1bGwvb2JqMTYvTWVyZ2VOb2RlLmdpZiIKLSAgICAgICAgICAgIGdlbk5vZGVzPSIvL0BkaWFncmFtL0B0b3BMZXZlbE5vZGVzLjEiLz4KLSAgICAgICAgPGVudHJpZXMKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46VG9vbEVudHJ5IgotICAgICAgICAgICAgdGl0bGU9IkRlY2lzaW9uIE5vZGUiCi0gICAgICAgICAgICBkZXNjcmlwdGlvbj0iQ3JlYXRlIG5ldyBEZWNpc2lvbiBOb2RlIgotICAgICAgICAgICAgc21hbGxJY29uUGF0aD0iL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9pY29ucy9mdWxsL29iajE2L0RlY2lzaW9uTm9kZS5naWYiCi0gICAgICAgICAgICBnZW5Ob2Rlcz0iLy9AZGlhZ3JhbS9AdG9wTGV2ZWxOb2Rlcy40Ii8+Ci0gICAgICAgIDxlbnRyaWVzCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlRvb2xFbnRyeSIKLSAgICAgICAgICAgIHRpdGxlPSJFbmQgTm9kZSIKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJDcmVhdGUgbmV3IEVuZCBOb2RlIgotICAgICAgICAgICAgc21hbGxJY29uUGF0aD0iL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9pY29ucy9mdWxsL29iajE2L0FjdGl2aXR5RmluYWxOb2RlLmdpZiIKLSAgICAgICAgICAgIGdlbk5vZGVzPSIvL0BkaWFncmFtL0B0b3BMZXZlbE5vZGVzLjAiLz4KLSAgICAgICAgPGVudHJpZXMKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46VG9vbEVudHJ5IgotICAgICAgICAgICAgdGl0bGU9IkpvaW4gTm9kZSIKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJDcmVhdGUgbmV3IEpvaW4gTm9kZSIKLSAgICAgICAgICAgIHNtYWxsSWNvblBhdGg9Ii9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvaWNvbnMvZnVsbC9vYmoxNi9Kb2luTm9kZS5naWYiCi0gICAgICAgICAgICBnZW5Ob2Rlcz0iLy9AZGlhZ3JhbS9AdG9wTGV2ZWxOb2Rlcy41Ii8+Ci0gICAgICAgIDxlbnRyaWVzCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlNlcGFyYXRvciIvPgotICAgICAgICA8ZW50cmllcwotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpUb29sRW50cnkiCi0gICAgICAgICAgICB0aXRsZT0iQWN0aXZpdHkiCi0gICAgICAgICAgICBkZXNjcmlwdGlvbj0iQ3JlYXRlIG5ldyBBY3Rpdml0eSIKLSAgICAgICAgICAgIHNtYWxsSWNvblBhdGg9Ii9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvaWNvbnMvZnVsbC9vYmoxNi9BY3Rpdml0eS5naWYiCi0gICAgICAgICAgICBnZW5Ob2Rlcz0iLy9AZGlhZ3JhbS9AdG9wTGV2ZWxOb2Rlcy42Ii8+Ci0gICAgICAgIDxlbnRyaWVzCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlRvb2xFbnRyeSIKLSAgICAgICAgICAgIHRpdGxlPSJQaGFzZSIKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJDcmVhdGUgbmV3IFBoYXNlIgotICAgICAgICAgICAgc21hbGxJY29uUGF0aD0iL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9pY29ucy9mdWxsL29iajE2L1BoYXNlLmdpZiIKLSAgICAgICAgICAgIGdlbk5vZGVzPSIvL0BkaWFncmFtL0B0b3BMZXZlbE5vZGVzLjkiLz4KLSAgICAgICAgPGVudHJpZXMKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46VG9vbEVudHJ5IgotICAgICAgICAgICAgdGl0bGU9Ikl0ZXJhdGlvbiIKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJDcmVhdGUgbmV3IEl0ZXJhdGlvbiIKLSAgICAgICAgICAgIHNtYWxsSWNvblBhdGg9Ii9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvaWNvbnMvZnVsbC9vYmoxNi9JdGVyYXRpb24uZ2lmIgotICAgICAgICAgICAgZ2VuTm9kZXM9Ii8vQGRpYWdyYW0vQHRvcExldmVsTm9kZXMuMTAiLz4KLSAgICAgICAgPGVudHJpZXMKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46VG9vbEVudHJ5IgotICAgICAgICAgICAgdGl0bGU9IlRhc2sgRGVzY3JpcHRvciIKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJDcmVhdGUgbmV3IFRhc2sgRGVzY3JpcHRvciIKLSAgICAgICAgICAgIHNtYWxsSWNvblBhdGg9Ii9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvaWNvbnMvZnVsbC9vYmoxNi9UYXNrRGVzY3JpcHRvci5naWYiCi0gICAgICAgICAgICBnZW5Ob2Rlcz0iLy9AZGlhZ3JhbS9AdG9wTGV2ZWxOb2Rlcy44Ii8+Ci0gICAgICAgIDxlbnRyaWVzCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlRvb2xFbnRyeSIKLSAgICAgICAgICAgIHRpdGxlPSJNaWxlc3RvbmUiCi0gICAgICAgICAgICBkZXNjcmlwdGlvbj0iQ3JlYXRlIG5ldyBNaWxlc3RvbmUiCi0gICAgICAgICAgICBzbWFsbEljb25QYXRoPSIvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL2ljb25zL2Z1bGwvb2JqMTYvTWlsZXN0b25lLmdpZiIKLSAgICAgICAgICAgIGdlbk5vZGVzPSIvL0BkaWFncmFtL0B0b3BMZXZlbE5vZGVzLjExIi8+Ci0gICAgICA8L2dyb3Vwcz4KLSAgICA8L3BhbGV0dGU+Ci0gIDwvZGlhZ3JhbT4KLSAgPHBsdWdpbgotICAgICAgaUQ9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkIgotICAgICAgbmFtZT0iRVBGIEFjdGl2aXR5IERpYWdyYW0iCi0gICAgICBwcm92aWRlcj0iRWNsaXBzZS5vcmciCi0gICAgICB2ZXJzaW9uPSIxLjIuMC5xdWFsaWZpZXIiCi0gICAgICBwcmludGluZ0VuYWJsZWQ9InRydWUiCi0gICAgICBhY3RpdmF0b3JDbGFzc05hbWU9IkFjdGl2aXR5RGlhZ3JhbUVkaXRvclBsdWdpbiIvPgotICA8ZWRpdG9yCi0gICAgICBjbGFzc05hbWU9IkFjdGl2aXR5RGlhZ3JhbUVkaXRvciIvPgotICA8ZG9tYWluR2VuTW9kZWwKLSAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5nZW5tb2RlbCMvIi8+Ci0gIDxleHByZXNzaW9uUHJvdmlkZXJzPgotICAgIDxwcm92aWRlcnMKLSAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpHZW5KYXZhRXhwcmVzc2lvblByb3ZpZGVyIgotICAgICAgICBleHByZXNzaW9ucz0iLy9AZGlhZ3JhbS9AdG9wTGV2ZWxOb2Rlcy42L0Btb2RlbEZhY2V0L0Btb2RlbEVsZW1lbnRTZWxlY3RvciAvL0BkaWFncmFtL0B0b3BMZXZlbE5vZGVzLjYvQG1vZGVsRmFjZXQvQG1vZGVsRWxlbWVudEluaXRpYWxpemVyL0Bpbml0aWFsaXplcnMuMCAvL0BkaWFncmFtL0B0b3BMZXZlbE5vZGVzLjgvQG1vZGVsRmFjZXQvQG1vZGVsRWxlbWVudFNlbGVjdG9yIC8vQGRpYWdyYW0vQHRvcExldmVsTm9kZXMuOC9AbW9kZWxGYWNldC9AbW9kZWxFbGVtZW50SW5pdGlhbGl6ZXIvQGluaXRpYWxpemVycy4wIC8vQGRpYWdyYW0vQHRvcExldmVsTm9kZXMuOS9AbW9kZWxGYWNldC9AbW9kZWxFbGVtZW50U2VsZWN0b3IgLy9AZGlhZ3JhbS9AdG9wTGV2ZWxOb2Rlcy45L0Btb2RlbEZhY2V0L0Btb2RlbEVsZW1lbnRJbml0aWFsaXplci9AaW5pdGlhbGl6ZXJzLjAgLy9AZGlhZ3JhbS9AdG9wTGV2ZWxOb2Rlcy4xMC9AbW9kZWxGYWNldC9AbW9kZWxFbGVtZW50U2VsZWN0b3IgLy9AZGlhZ3JhbS9AdG9wTGV2ZWxOb2Rlcy4xMC9AbW9kZWxGYWNldC9AbW9kZWxFbGVtZW50SW5pdGlhbGl6ZXIvQGluaXRpYWxpemVycy4wIC8vQGRpYWdyYW0vQHRvcExldmVsTm9kZXMuMTEvQG1vZGVsRmFjZXQvQG1vZGVsRWxlbWVudFNlbGVjdG9yIC8vQGRpYWdyYW0vQHRvcExldmVsTm9kZXMuMTEvQG1vZGVsRmFjZXQvQG1vZGVsRWxlbWVudEluaXRpYWxpemVyL0Bpbml0aWFsaXplcnMuMCIvPgotICA8L2V4cHJlc3Npb25Qcm92aWRlcnM+Ci08L2dtZmdlbjpHZW5FZGl0b3JHZW5lcmF0b3I+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9tb2RlbC9lcGZkaWFncmFtMi5nbWZtYXAgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9tb2RlbC9lcGZkaWFncmFtMi5nbWZtYXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwMjEwZWUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvbW9kZWwvZXBmZGlhZ3JhbTIuZ21mbWFwCisrKyAvZGV2L251bGwKQEAgLTEsMzU5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Z21mbWFwOk1hcHBpbmcgeG1pOnZlcnNpb249IjIuMCIKLSAgICB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiCi0gICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgICB4bWxuczplY29yZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSIKLSAgICB4bWxuczpnbWZtYXA9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZ21mLzIwMDUvbWFwcGluZ3MvMi4wIgotICAgIHhtbG5zOmdtZnRvb2w9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZ21mLzIwMDUvVG9vbERlZmluaXRpb24iPgotICA8bm9kZXM+Ci0gICAgPGNvbnRhaW5tZW50RmVhdHVyZQotICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZWNvcmUjLy9BY3Rpdml0eS9ub2RlIi8+Ci0gICAgPG93bmVkQ2hpbGQ+Ci0gICAgICA8ZG9tYWluTWV0YUVsZW1lbnQKLSAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZWNvcmUjLy9BY3Rpdml0eUZpbmFsTm9kZSIvPgotICAgICAgPGxhYmVsTWFwcGluZ3MKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mbWFwOkZlYXR1cmVMYWJlbE1hcHBpbmciCi0gICAgICAgICAgdmlld1BhdHRlcm49IiIKLSAgICAgICAgICBlZGl0UGF0dGVybj0iIj4KLSAgICAgICAgPGRpYWdyYW1MYWJlbAotICAgICAgICAgICAgaHJlZj0iZXBmZGlhZ3JhbS5nbWZncmFwaCNHZW5lcmljTGFiZWwiLz4KLSAgICAgICAgPGZlYXR1cmVzCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZWNvcmUjLy9OYW1lZEVsZW1lbnQvbmFtZSIvPgotICAgICAgPC9sYWJlbE1hcHBpbmdzPgotICAgICAgPHRvb2wKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mdG9vbDpDcmVhdGlvblRvb2wiCi0gICAgICAgICAgaHJlZj0iZXBmZGlhZ3JhbS5nbWZ0b29sIy8vQHBhbGV0dGUvQHRvb2xzLjEvQHRvb2xzLjUiLz4KLSAgICAgIDxkaWFncmFtTm9kZQotICAgICAgICAgIGhyZWY9ImVwZmRpYWdyYW0uZ21mZ3JhcGgjQWN0aXZpdHlGaW5hbE5vZGUiLz4KLSAgICA8L293bmVkQ2hpbGQ+Ci0gIDwvbm9kZXM+Ci0gIDxub2Rlcz4KLSAgICA8Y29udGFpbm1lbnRGZWF0dXJlCi0gICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5lY29yZSMvL0FjdGl2aXR5L25vZGUiLz4KLSAgICA8b3duZWRDaGlsZD4KLSAgICAgIDxkb21haW5NZXRhRWxlbWVudAotICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5lY29yZSMvL01lcmdlTm9kZSIvPgotICAgICAgPGxhYmVsTWFwcGluZ3MKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mbWFwOkZlYXR1cmVMYWJlbE1hcHBpbmciCi0gICAgICAgICAgdmlld1BhdHRlcm49IiI+Ci0gICAgICAgIDxkaWFncmFtTGFiZWwKLSAgICAgICAgICAgIGhyZWY9ImVwZmRpYWdyYW0uZ21mZ3JhcGgjRGVjaXNpb25Ob2RlTmFtZSIvPgotICAgICAgICA8ZmVhdHVyZXMKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5lY29yZSMvL05hbWVkRWxlbWVudC9uYW1lIi8+Ci0gICAgICA8L2xhYmVsTWFwcGluZ3M+Ci0gICAgICA8dG9vbAotICAgICAgICAgIHhzaTp0eXBlPSJnbWZ0b29sOkNyZWF0aW9uVG9vbCIKLSAgICAgICAgICBocmVmPSJlcGZkaWFncmFtLmdtZnRvb2wjLy9AcGFsZXR0ZS9AdG9vbHMuMS9AdG9vbHMuMyIvPgotICAgICAgPGRpYWdyYW1Ob2RlCi0gICAgICAgICAgaHJlZj0iZXBmZGlhZ3JhbS5nbWZncmFwaCNNZXJnZU5vZGUiLz4KLSAgICA8L293bmVkQ2hpbGQ+Ci0gIDwvbm9kZXM+Ci0gIDxub2Rlcz4KLSAgICA8Y29udGFpbm1lbnRGZWF0dXJlCi0gICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5lY29yZSMvL0FjdGl2aXR5L25vZGUiLz4KLSAgICA8b3duZWRDaGlsZD4KLSAgICAgIDxkb21haW5NZXRhRWxlbWVudAotICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5lY29yZSMvL0ZvcmtOb2RlIi8+Ci0gICAgICA8dG9vbAotICAgICAgICAgIHhzaTp0eXBlPSJnbWZ0b29sOkNyZWF0aW9uVG9vbCIKLSAgICAgICAgICBocmVmPSJlcGZkaWFncmFtLmdtZnRvb2wjLy9AcGFsZXR0ZS9AdG9vbHMuMS9AdG9vbHMuMiIvPgotICAgICAgPGRpYWdyYW1Ob2RlCi0gICAgICAgICAgaHJlZj0iZXBmZGlhZ3JhbS5nbWZncmFwaCNGb3JrTm9kZSIvPgotICAgIDwvb3duZWRDaGlsZD4KLSAgPC9ub2Rlcz4KLSAgPG5vZGVzPgotICAgIDxjb250YWlubWVudEZlYXR1cmUKLSAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmVjb3JlIy8vQWN0aXZpdHkvbm9kZSIvPgotICAgIDxvd25lZENoaWxkPgotICAgICAgPGRvbWFpbk1ldGFFbGVtZW50Ci0gICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmVjb3JlIy8vSW5pdGlhbE5vZGUiLz4KLSAgICAgIDxsYWJlbE1hcHBpbmdzCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZm1hcDpGZWF0dXJlTGFiZWxNYXBwaW5nIgotICAgICAgICAgIHZpZXdQYXR0ZXJuPSIiCi0gICAgICAgICAgZWRpdFBhdHRlcm49IiI+Ci0gICAgICAgIDxkaWFncmFtTGFiZWwKLSAgICAgICAgICAgIGhyZWY9ImVwZmRpYWdyYW0uZ21mZ3JhcGgjR2VuZXJpY0xhYmVsIi8+Ci0gICAgICAgIDxmZWF0dXJlcwotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmVjb3JlIy8vTmFtZWRFbGVtZW50L25hbWUiLz4KLSAgICAgIDwvbGFiZWxNYXBwaW5ncz4KLSAgICAgIDx0b29sCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZnRvb2w6Q3JlYXRpb25Ub29sIgotICAgICAgICAgIGhyZWY9ImVwZmRpYWdyYW0uZ21mdG9vbCMvL0BwYWxldHRlL0B0b29scy4xL0B0b29scy4xIi8+Ci0gICAgICA8ZGlhZ3JhbU5vZGUKLSAgICAgICAgICBocmVmPSJlcGZkaWFncmFtLmdtZmdyYXBoI0luaXRpYWxOb2RlIi8+Ci0gICAgPC9vd25lZENoaWxkPgotICA8L25vZGVzPgotICA8bm9kZXM+Ci0gICAgPGNvbnRhaW5tZW50RmVhdHVyZQotICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZWNvcmUjLy9BY3Rpdml0eS9ub2RlIi8+Ci0gICAgPG93bmVkQ2hpbGQ+Ci0gICAgICA8ZG9tYWluTWV0YUVsZW1lbnQKLSAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZWNvcmUjLy9EZWNpc2lvbk5vZGUiLz4KLSAgICAgIDxsYWJlbE1hcHBpbmdzCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZm1hcDpGZWF0dXJlTGFiZWxNYXBwaW5nIgotICAgICAgICAgIGVkaXRQYXR0ZXJuPSIiPgotICAgICAgICA8ZGlhZ3JhbUxhYmVsCi0gICAgICAgICAgICBocmVmPSJlcGZkaWFncmFtLmdtZmdyYXBoI0RlY2lzaW9uTm9kZU5hbWUiLz4KLSAgICAgICAgPGZlYXR1cmVzCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZWNvcmUjLy9OYW1lZEVsZW1lbnQvbmFtZSIvPgotICAgICAgPC9sYWJlbE1hcHBpbmdzPgotICAgICAgPHRvb2wKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mdG9vbDpDcmVhdGlvblRvb2wiCi0gICAgICAgICAgaHJlZj0iZXBmZGlhZ3JhbS5nbWZ0b29sIy8vQHBhbGV0dGUvQHRvb2xzLjEvQHRvb2xzLjQiLz4KLSAgICAgIDxkaWFncmFtTm9kZQotICAgICAgICAgIGhyZWY9ImVwZmRpYWdyYW0uZ21mZ3JhcGgjRGVjaXNpb25Ob2RlIi8+Ci0gICAgPC9vd25lZENoaWxkPgotICA8L25vZGVzPgotICA8bm9kZXM+Ci0gICAgPGNvbnRhaW5tZW50RmVhdHVyZQotICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZWNvcmUjLy9BY3Rpdml0eS9ub2RlIi8+Ci0gICAgPG93bmVkQ2hpbGQ+Ci0gICAgICA8ZG9tYWluTWV0YUVsZW1lbnQKLSAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZWNvcmUjLy9Kb2luTm9kZSIvPgotICAgICAgPHRvb2wKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mdG9vbDpDcmVhdGlvblRvb2wiCi0gICAgICAgICAgaHJlZj0iZXBmZGlhZ3JhbS5nbWZ0b29sIy8vQHBhbGV0dGUvQHRvb2xzLjEvQHRvb2xzLjYiLz4KLSAgICAgIDxkaWFncmFtTm9kZQotICAgICAgICAgIGhyZWY9ImVwZmRpYWdyYW0uZ21mZ3JhcGgjSm9pbk5vZGUiLz4KLSAgICA8L293bmVkQ2hpbGQ+Ci0gIDwvbm9kZXM+Ci0gIDxub2Rlcz4KLSAgICA8Y29udGFpbm1lbnRGZWF0dXJlCi0gICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5lY29yZSMvL0FjdGl2aXR5L25vZGUiLz4KLSAgICA8b3duZWRDaGlsZD4KLSAgICAgIDxkb21haW5NZXRhRWxlbWVudAotICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5lY29yZSMvL1N0cnVjdHVyZWRBY3Rpdml0eU5vZGUiLz4KLSAgICAgIDxkb21haW5TcGVjaWFsaXphdGlvbgotICAgICAgICAgIGJvZHk9ImdldFVtYVR5cGVfQWN0aXZpdHkiCi0gICAgICAgICAgbGFuZ3VhZ2U9ImphdmEiLz4KLSAgICAgIDxkb21haW5Jbml0aWFsaXplcgotICAgICAgICAgIHhzaTp0eXBlPSJnbWZtYXA6RmVhdHVyZVNlcUluaXRpYWxpemVyIj4KLSAgICAgICAgPGluaXRpYWxpemVycwotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZm1hcDpGZWF0dXJlVmFsdWVTcGVjIgotICAgICAgICAgICAgYm9keT0iY3JlYXRlVW1hVHlwZV9BY3Rpdml0eSYjeEQ7JiN4QTsiCi0gICAgICAgICAgICBsYW5ndWFnZT0iamF2YSI+Ci0gICAgICAgICAgPGZlYXR1cmUKLSAgICAgICAgICAgICAgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiCi0gICAgICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5lbWYuZWNvcmUvbW9kZWwvRWNvcmUuZWNvcmUjLy9FTW9kZWxFbGVtZW50L2VBbm5vdGF0aW9ucyIvPgotICAgICAgICA8L2luaXRpYWxpemVycz4KLSAgICAgIDwvZG9tYWluSW5pdGlhbGl6ZXI+Ci0gICAgICA8bGFiZWxNYXBwaW5ncwotICAgICAgICAgIHhzaTp0eXBlPSJnbWZtYXA6RmVhdHVyZUxhYmVsTWFwcGluZyI+Ci0gICAgICAgIDxkaWFncmFtTGFiZWwKLSAgICAgICAgICAgIGhyZWY9ImVwZmRpYWdyYW0uZ21mZ3JhcGgjQWN0aXZpdHlOb2RlTmFtZSIvPgotICAgICAgICA8ZmVhdHVyZXMKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5lY29yZSMvL05hbWVkRWxlbWVudC9uYW1lIi8+Ci0gICAgICA8L2xhYmVsTWFwcGluZ3M+Ci0gICAgICA8dG9vbAotICAgICAgICAgIHhzaTp0eXBlPSJnbWZ0b29sOkNyZWF0aW9uVG9vbCIKLSAgICAgICAgICBocmVmPSJlcGZkaWFncmFtLmdtZnRvb2wjLy9AcGFsZXR0ZS9AdG9vbHMuMS9AdG9vbHMuOCIvPgotICAgICAgPGRpYWdyYW1Ob2RlCi0gICAgICAgICAgaHJlZj0iZXBmZGlhZ3JhbS5nbWZncmFwaCNTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlIi8+Ci0gICAgPC9vd25lZENoaWxkPgotICA8L25vZGVzPgotICA8bm9kZXM+Ci0gICAgPGNvbnRhaW5tZW50RmVhdHVyZQotICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZWNvcmUjLy9BY3Rpdml0eS9ncm91cCIvPgotICAgIDxvd25lZENoaWxkPgotICAgICAgPGRvbWFpbk1ldGFFbGVtZW50Ci0gICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmVjb3JlIy8vQWN0aXZpdHlQYXJ0aXRpb24iLz4KLSAgICAgIDxsYWJlbE1hcHBpbmdzCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZm1hcDpGZWF0dXJlTGFiZWxNYXBwaW5nIgotICAgICAgICAgIHZpZXdQYXR0ZXJuPSIiCi0gICAgICAgICAgZWRpdFBhdHRlcm49IiI+Ci0gICAgICAgIDxkaWFncmFtTGFiZWwKLSAgICAgICAgICAgIGhyZWY9ImVwZmRpYWdyYW0uZ21mZ3JhcGgjUGFydGl0aW9uTmFtZSIvPgotICAgICAgICA8ZmVhdHVyZXMKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5lY29yZSMvL05hbWVkRWxlbWVudC9uYW1lIi8+Ci0gICAgICA8L2xhYmVsTWFwcGluZ3M+Ci0gICAgICA8dG9vbAotICAgICAgICAgIHhzaTp0eXBlPSJnbWZ0b29sOkNyZWF0aW9uVG9vbCIKLSAgICAgICAgICBocmVmPSJlcGZkaWFncmFtLmdtZnRvb2wjLy9AcGFsZXR0ZS9AdG9vbHMuMS9AdG9vbHMuMCIvPgotICAgICAgPGRpYWdyYW1Ob2RlCi0gICAgICAgICAgaHJlZj0iZXBmZGlhZ3JhbS5nbWZncmFwaCNBY3Rpdml0eVBhcnRpdGlvbiIvPgotICAgICAgPGNoaWxkcmVuCi0gICAgICAgICAgY29tcGFydG1lbnQ9Ii8vQG5vZGVzLjcvQG93bmVkQ2hpbGQvQGNvbXBhcnRtZW50cy4wIgotICAgICAgICAgIHJlZmVyZW5jZWRDaGlsZD0iLy9Abm9kZXMuNy9Ab3duZWRDaGlsZCI+Ci0gICAgICAgIDxjb250YWlubWVudEZlYXR1cmUKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5lY29yZSMvL0FjdGl2aXR5UGFydGl0aW9uL3N1YnBhcnRpdGlvbiIvPgotICAgICAgPC9jaGlsZHJlbj4KLSAgICAgIDxjb21wYXJ0bWVudHMKLSAgICAgICAgICBjaGlsZHJlbj0iLy9Abm9kZXMuNy9Ab3duZWRDaGlsZC9AY2hpbGRyZW4uMCI+Ci0gICAgICAgIDxjb21wYXJ0bWVudAotICAgICAgICAgICAgaHJlZj0iZXBmZGlhZ3JhbS5nbWZncmFwaCNQYXJ0aXRpb25DYW1wYXJ0bWVudCIvPgotICAgICAgPC9jb21wYXJ0bWVudHM+Ci0gICAgPC9vd25lZENoaWxkPgotICA8L25vZGVzPgotICA8bm9kZXM+Ci0gICAgPGNvbnRhaW5tZW50RmVhdHVyZQotICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZWNvcmUjLy9BY3Rpdml0eS9ub2RlIi8+Ci0gICAgPG93bmVkQ2hpbGQ+Ci0gICAgICA8ZG9tYWluTWV0YUVsZW1lbnQKLSAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZWNvcmUjLy9BY3Rpdml0eVBhcmFtZXRlck5vZGUiLz4KLSAgICAgIDxkb21haW5TcGVjaWFsaXphdGlvbgotICAgICAgICAgIGJvZHk9ImdldFVtYVR5cGVfVGFza0Rlc2NyaXB0b3IiCi0gICAgICAgICAgbGFuZ3VhZ2U9ImphdmEiLz4KLSAgICAgIDxkb21haW5Jbml0aWFsaXplcgotICAgICAgICAgIHhzaTp0eXBlPSJnbWZtYXA6RmVhdHVyZVNlcUluaXRpYWxpemVyIj4KLSAgICAgICAgPGluaXRpYWxpemVycwotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZm1hcDpGZWF0dXJlVmFsdWVTcGVjIgotICAgICAgICAgICAgYm9keT0iY3JlYXRlVW1hVHlwZV9UYXNrRGVzY3JpcHRvciIKLSAgICAgICAgICAgIGxhbmd1YWdlPSJqYXZhIj4KLSAgICAgICAgICA8ZmVhdHVyZQotICAgICAgICAgICAgICB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIKLSAgICAgICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmVtZi5lY29yZS9tb2RlbC9FY29yZS5lY29yZSMvL0VNb2RlbEVsZW1lbnQvZUFubm90YXRpb25zIi8+Ci0gICAgICAgIDwvaW5pdGlhbGl6ZXJzPgotICAgICAgPC9kb21haW5Jbml0aWFsaXplcj4KLSAgICAgIDxsYWJlbE1hcHBpbmdzCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZm1hcDpGZWF0dXJlTGFiZWxNYXBwaW5nIj4KLSAgICAgICAgPGRpYWdyYW1MYWJlbAotICAgICAgICAgICAgaHJlZj0iZXBmZGlhZ3JhbS5nbWZncmFwaCNBY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lIi8+Ci0gICAgICAgIDxmZWF0dXJlcwotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmVjb3JlIy8vTmFtZWRFbGVtZW50L25hbWUiLz4KLSAgICAgIDwvbGFiZWxNYXBwaW5ncz4KLSAgICAgIDx0b29sCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZnRvb2w6Q3JlYXRpb25Ub29sIgotICAgICAgICAgIGhyZWY9ImVwZmRpYWdyYW0uZ21mdG9vbCMvL0BwYWxldHRlL0B0b29scy4xL0B0b29scy4xMSIvPgotICAgICAgPGRpYWdyYW1Ob2RlCi0gICAgICAgICAgaHJlZj0iZXBmZGlhZ3JhbS5nbWZncmFwaCNBY3Rpdml0eVBhcmFtZXRlck5vZGUiLz4KLSAgICA8L293bmVkQ2hpbGQ+Ci0gIDwvbm9kZXM+Ci0gIDxub2Rlcz4KLSAgICA8Y29udGFpbm1lbnRGZWF0dXJlCi0gICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5lY29yZSMvL0FjdGl2aXR5L25vZGUiLz4KLSAgICA8b3duZWRDaGlsZD4KLSAgICAgIDxkb21haW5NZXRhRWxlbWVudAotICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5lY29yZSMvL1N0cnVjdHVyZWRBY3Rpdml0eU5vZGUiLz4KLSAgICAgIDxkb21haW5TcGVjaWFsaXphdGlvbgotICAgICAgICAgIGJvZHk9ImdldFVtYVR5cGVfUGhhc2UiCi0gICAgICAgICAgbGFuZ3VhZ2U9ImphdmEiLz4KLSAgICAgIDxkb21haW5Jbml0aWFsaXplcgotICAgICAgICAgIHhzaTp0eXBlPSJnbWZtYXA6RmVhdHVyZVNlcUluaXRpYWxpemVyIj4KLSAgICAgICAgPGluaXRpYWxpemVycwotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZm1hcDpGZWF0dXJlVmFsdWVTcGVjIgotICAgICAgICAgICAgYm9keT0iY3JlYXRlVW1hVHlwZV9QaGFzZSIKLSAgICAgICAgICAgIGxhbmd1YWdlPSJqYXZhIj4KLSAgICAgICAgICA8ZmVhdHVyZQotICAgICAgICAgICAgICB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIKLSAgICAgICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmVtZi5lY29yZS9tb2RlbC9FY29yZS5lY29yZSMvL0VNb2RlbEVsZW1lbnQvZUFubm90YXRpb25zIi8+Ci0gICAgICAgIDwvaW5pdGlhbGl6ZXJzPgotICAgICAgPC9kb21haW5Jbml0aWFsaXplcj4KLSAgICAgIDxsYWJlbE1hcHBpbmdzCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZm1hcDpGZWF0dXJlTGFiZWxNYXBwaW5nIj4KLSAgICAgICAgPGRpYWdyYW1MYWJlbAotICAgICAgICAgICAgaHJlZj0iZXBmZGlhZ3JhbS5nbWZncmFwaCNBY3Rpdml0eU5vZGVOYW1lIi8+Ci0gICAgICAgIDxmZWF0dXJlcwotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmVjb3JlIy8vTmFtZWRFbGVtZW50L25hbWUiLz4KLSAgICAgIDwvbGFiZWxNYXBwaW5ncz4KLSAgICAgIDx0b29sCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZnRvb2w6Q3JlYXRpb25Ub29sIgotICAgICAgICAgIGhyZWY9ImVwZmRpYWdyYW0uZ21mdG9vbCMvL0BwYWxldHRlL0B0b29scy4xL0B0b29scy45Ii8+Ci0gICAgICA8ZGlhZ3JhbU5vZGUKLSAgICAgICAgICBocmVmPSJlcGZkaWFncmFtLmdtZmdyYXBoI1N0cnVjdHVyZWRBY3Rpdml0eU5vZGUiLz4KLSAgICA8L293bmVkQ2hpbGQ+Ci0gIDwvbm9kZXM+Ci0gIDxub2Rlcz4KLSAgICA8Y29udGFpbm1lbnRGZWF0dXJlCi0gICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5lY29yZSMvL0FjdGl2aXR5L25vZGUiLz4KLSAgICA8b3duZWRDaGlsZD4KLSAgICAgIDxkb21haW5NZXRhRWxlbWVudAotICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5lY29yZSMvL1N0cnVjdHVyZWRBY3Rpdml0eU5vZGUiLz4KLSAgICAgIDxkb21haW5TcGVjaWFsaXphdGlvbgotICAgICAgICAgIGJvZHk9ImdldFVtYVR5cGVfSXRlcmF0aW9uIgotICAgICAgICAgIGxhbmd1YWdlPSJqYXZhIi8+Ci0gICAgICA8ZG9tYWluSW5pdGlhbGl6ZXIKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mbWFwOkZlYXR1cmVTZXFJbml0aWFsaXplciI+Ci0gICAgICAgIDxpbml0aWFsaXplcnMKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZtYXA6RmVhdHVyZVZhbHVlU3BlYyIKLSAgICAgICAgICAgIGJvZHk9ImNyZWF0ZVVtYVR5cGVfSXRlcmF0aW9uIgotICAgICAgICAgICAgbGFuZ3VhZ2U9ImphdmEiPgotICAgICAgICAgIDxmZWF0dXJlCi0gICAgICAgICAgICAgIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIgotICAgICAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZW1mLmVjb3JlL21vZGVsL0Vjb3JlLmVjb3JlIy8vRU1vZGVsRWxlbWVudC9lQW5ub3RhdGlvbnMiLz4KLSAgICAgICAgPC9pbml0aWFsaXplcnM+Ci0gICAgICA8L2RvbWFpbkluaXRpYWxpemVyPgotICAgICAgPGxhYmVsTWFwcGluZ3MKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mbWFwOkZlYXR1cmVMYWJlbE1hcHBpbmciPgotICAgICAgICA8ZGlhZ3JhbUxhYmVsCi0gICAgICAgICAgICBocmVmPSJlcGZkaWFncmFtLmdtZmdyYXBoI0FjdGl2aXR5Tm9kZU5hbWUiLz4KLSAgICAgICAgPGZlYXR1cmVzCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZWNvcmUjLy9OYW1lZEVsZW1lbnQvbmFtZSIvPgotICAgICAgPC9sYWJlbE1hcHBpbmdzPgotICAgICAgPHRvb2wKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mdG9vbDpDcmVhdGlvblRvb2wiCi0gICAgICAgICAgaHJlZj0iZXBmZGlhZ3JhbS5nbWZ0b29sIy8vQHBhbGV0dGUvQHRvb2xzLjEvQHRvb2xzLjEwIi8+Ci0gICAgICA8ZGlhZ3JhbU5vZGUKLSAgICAgICAgICBocmVmPSJlcGZkaWFncmFtLmdtZmdyYXBoI1N0cnVjdHVyZWRBY3Rpdml0eU5vZGUiLz4KLSAgICA8L293bmVkQ2hpbGQ+Ci0gIDwvbm9kZXM+Ci0gIDxub2Rlcz4KLSAgICA8Y29udGFpbm1lbnRGZWF0dXJlCi0gICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5lY29yZSMvL0FjdGl2aXR5L25vZGUiLz4KLSAgICA8b3duZWRDaGlsZD4KLSAgICAgIDxkb21haW5NZXRhRWxlbWVudAotICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5lY29yZSMvL0FjdGl2aXR5UGFyYW1ldGVyTm9kZSIvPgotICAgICAgPGRvbWFpblNwZWNpYWxpemF0aW9uCi0gICAgICAgICAgYm9keT0iZ2V0VW1hVHlwZV9NaWxlc3RvbmUiCi0gICAgICAgICAgbGFuZ3VhZ2U9ImphdmEiLz4KLSAgICAgIDxkb21haW5Jbml0aWFsaXplcgotICAgICAgICAgIHhzaTp0eXBlPSJnbWZtYXA6RmVhdHVyZVNlcUluaXRpYWxpemVyIj4KLSAgICAgICAgPGluaXRpYWxpemVycwotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZm1hcDpGZWF0dXJlVmFsdWVTcGVjIgotICAgICAgICAgICAgYm9keT0iY3JlYXRlVW1hVHlwZV9NaWxlc3RvbmUiCi0gICAgICAgICAgICBsYW5ndWFnZT0iamF2YSI+Ci0gICAgICAgICAgPGZlYXR1cmUKLSAgICAgICAgICAgICAgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiCi0gICAgICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5lbWYuZWNvcmUvbW9kZWwvRWNvcmUuZWNvcmUjLy9FTW9kZWxFbGVtZW50L2VBbm5vdGF0aW9ucyIvPgotICAgICAgICA8L2luaXRpYWxpemVycz4KLSAgICAgIDwvZG9tYWluSW5pdGlhbGl6ZXI+Ci0gICAgICA8bGFiZWxNYXBwaW5ncwotICAgICAgICAgIHhzaTp0eXBlPSJnbWZtYXA6RmVhdHVyZUxhYmVsTWFwcGluZyI+Ci0gICAgICAgIDxkaWFncmFtTGFiZWwKLSAgICAgICAgICAgIGhyZWY9ImVwZmRpYWdyYW0uZ21mZ3JhcGgjQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZSIvPgotICAgICAgICA8ZmVhdHVyZXMKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5lY29yZSMvL05hbWVkRWxlbWVudC9uYW1lIi8+Ci0gICAgICA8L2xhYmVsTWFwcGluZ3M+Ci0gICAgICA8dG9vbAotICAgICAgICAgIHhzaTp0eXBlPSJnbWZ0b29sOkNyZWF0aW9uVG9vbCIKLSAgICAgICAgICBocmVmPSJlcGZkaWFncmFtLmdtZnRvb2wjLy9AcGFsZXR0ZS9AdG9vbHMuMS9AdG9vbHMuMTIiLz4KLSAgICAgIDxkaWFncmFtTm9kZQotICAgICAgICAgIGhyZWY9ImVwZmRpYWdyYW0uZ21mZ3JhcGgjQWN0aXZpdHlQYXJhbWV0ZXJOb2RlIi8+Ci0gICAgPC9vd25lZENoaWxkPgotICA8L25vZGVzPgotICA8bGlua3M+Ci0gICAgPGRvbWFpbk1ldGFFbGVtZW50Ci0gICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5lY29yZSMvL0NvbnRyb2xGbG93Ii8+Ci0gICAgPGxhYmVsTWFwcGluZ3MKLSAgICAgICAgeHNpOnR5cGU9ImdtZm1hcDpGZWF0dXJlTGFiZWxNYXBwaW5nIgotICAgICAgICB2aWV3UGF0dGVybj0iIgotICAgICAgICBlZGl0UGF0dGVybj0iIj4KLSAgICAgIDxkaWFncmFtTGFiZWwKLSAgICAgICAgICBocmVmPSJlcGZkaWFncmFtLmdtZmdyYXBoI0NvbnRyb2xGbG93TGFiZWwiLz4KLSAgICAgIDxmZWF0dXJlcwotICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5lY29yZSMvL05hbWVkRWxlbWVudC9uYW1lIi8+Ci0gICAgPC9sYWJlbE1hcHBpbmdzPgotICAgIDxjb250YWlubWVudEZlYXR1cmUKLSAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmVjb3JlIy8vU3RydWN0dXJlZEFjdGl2aXR5Tm9kZS9lZGdlIi8+Ci0gICAgPHRvb2wKLSAgICAgICAgeHNpOnR5cGU9ImdtZnRvb2w6Q3JlYXRpb25Ub29sIgotICAgICAgICBocmVmPSJlcGZkaWFncmFtLmdtZnRvb2wjLy9AcGFsZXR0ZS9AdG9vbHMuMC9AdG9vbHMuMCIvPgotICAgIDxkaWFncmFtTGluawotICAgICAgICBocmVmPSJlcGZkaWFncmFtLmdtZmdyYXBoI0NvbnRyb2xGbG93Ii8+Ci0gICAgPHNvdXJjZU1ldGFGZWF0dXJlCi0gICAgICAgIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIgotICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZWNvcmUjLy9BY3Rpdml0eUVkZ2Uvc291cmNlIi8+Ci0gICAgPGxpbmtNZXRhRmVhdHVyZQotICAgICAgICB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIKLSAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmVjb3JlIy8vQWN0aXZpdHlFZGdlL3RhcmdldCIvPgotICA8L2xpbmtzPgotICA8ZGlhZ3JhbT4KLSAgICA8ZGlhZ3JhbUNhbnZhcwotICAgICAgICBocmVmPSJlcGZkaWFncmFtLmdtZmdyYXBoI3VtbCIvPgotICAgIDxkb21haW5Nb2RlbAotICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZWNvcmUjLyIvPgotICAgIDxkb21haW5NZXRhRWxlbWVudAotICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZWNvcmUjLy9BY3Rpdml0eSIvPgotICAgIDxwYWxldHRlCi0gICAgICAgIGhyZWY9ImVwZmRpYWdyYW0uZ21mdG9vbCMvL0BwYWxldHRlIi8+Ci0gIDwvZGlhZ3JhbT4KLTwvZ21mbWFwOk1hcHBpbmc+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9wbHVnaW4ucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZmIyOTViLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgU1RBUlQgTk8gVFJBTlNMQVRJT04KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1wcmVmZXJlbmNlcy5nZW5lcmFsPUFEIERpYWdyYW0KLXByZWZlcmVuY2VzLmFwcGVhcmFuY2U9QXBwZWFyYW5jZQotcHJlZmVyZW5jZXMuY29ubmVjdGlvbnM9Q29ubmVjdGlvbnMKLXByZWZlcmVuY2VzLnByaW50aW5nPVByaW50aW5nCi1wcmVmZXJlbmNlcy5ydWxlcnNBbmRHcmlkPVJ1bGVycyAmIEdyaWQKLXByZWZlcmVuY2VzLnBhdGhtYXBzPVBhdGggTWFwcwotCi1lZGl0b3JOYW1lPUFEIERpYWdyYW0gRWRpdG9yCi1uZXdXaXphcmROYW1lPUFEIERpYWdyYW0KLW5ld1dpemFyZERlc2M9Q3JlYXRlcyBBRCBkaWFncmFtLgotCi1pbml0RGlhZ3JhbUFjdGlvbkxhYmVsPUluaXRpYWxpemUgeG1pIGRpYWdyYW0gZmlsZQotbG9hZFJlc291cmNlQWN0aW9uTGFiZWw9TG9hZCBSZXNvdXJjZS4uLgotCi1uYXZpZ2F0b3JDb250ZW50TmFtZT0qLnhtaSBkaWFncmFtIGNvbnRlbnRzCi0KLW1ldGF0eXBlLm5hbWUuQWN0aXZpdHlfNzk9VW5kZWZpbmVkCi1tZXRhdHlwZS5uYW1lLkFjdGl2aXR5RmluYWxOb2RlXzEwMDE9QWN0aXZpdHlGaW5hbE5vZGUKLW1ldGF0eXBlLm5hbWUuTWVyZ2VOb2RlXzEwMDI9TWVyZ2VOb2RlCi1tZXRhdHlwZS5uYW1lLkZvcmtOb2RlXzEwMDM9Rm9ya05vZGUKLW1ldGF0eXBlLm5hbWUuSW5pdGlhbE5vZGVfMTAwND1Jbml0aWFsTm9kZQotbWV0YXR5cGUubmFtZS5EZWNpc2lvbk5vZGVfMTAwNT1EZWNpc2lvbk5vZGUKLW1ldGF0eXBlLm5hbWUuSm9pbk5vZGVfMTAwNj1Kb2luTm9kZQotbWV0YXR5cGUubmFtZS5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlXzEwMDc9U3RydWN0dXJlZEFjdGl2aXR5Tm9kZQotbWV0YXR5cGUubmFtZS5BY3Rpdml0eVBhcnRpdGlvbl8xMDA4PUFjdGl2aXR5UGFydGl0aW9uCi1tZXRhdHlwZS5uYW1lLkFjdGl2aXR5UGFyYW1ldGVyTm9kZV8xMDA5PUFjdGl2aXR5UGFyYW1ldGVyTm9kZQotbWV0YXR5cGUubmFtZS5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlXzEwMTA9U3RydWN0dXJlZEFjdGl2aXR5Tm9kZQotbWV0YXR5cGUubmFtZS5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlXzEwMTE9U3RydWN0dXJlZEFjdGl2aXR5Tm9kZQotbWV0YXR5cGUubmFtZS5BY3Rpdml0eVBhcmFtZXRlck5vZGVfMTAxMj1BY3Rpdml0eVBhcmFtZXRlck5vZGUKLW1ldGF0eXBlLm5hbWUuQWN0aXZpdHlQYXJ0aXRpb25fMjAwMT1BY3Rpdml0eVBhcnRpdGlvbgotbWV0YXR5cGUubmFtZS5Db250cm9sRmxvd18zMDAxPUNvbnRyb2xGbG93Ci0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBFTkQgTk8gVFJBTlNMQVRJT04KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLQotcGx1Z2luTmFtZT1FUEYgQWN0aXZpdHkgRGlhZ3JhbQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCi0KLSNOZWVkcyBUcmFuc2xhdGlvbgotb3Blbl9hZGRfdGV4dD1PcGVuIEFjdGl2aXR5IERldGFpbCBEaWFncmFtCi1lbGVtZW50X3R5cGVfYWN0aXZpdHlfcGFydGl0aW9uPUFjdGl2aXR5IFBhcnRpdGlvbgotZWxlbWVudF90eXBlX2VuZF9ub2RlPUVuZCBOb2RlCi1lbGVtZW50X3R5cGVfbWVyZ2Vfbm9kZT1NZXJnZSBOb2RlCi1lbGVtZW50X3R5cGVfZm9ya19ub2RlPUZvcmsgTm9kZQotZWxlbWVudF90eXBlX3N0YXJ0X25vZGU9U3RhcnQgTm9kZQotZWxlbWVudF90eXBlX2RlY2lzaW9uX25vZGU9RGVjaXNpb24gTm9kZQotZWxlbWVudF90eXBlX2pvaW5fbm9kZT1Kb2luIE5vZGUKLWVsZW1lbnRfdHlwZV9hY3Rpdml0eT1BY3Rpdml0eQotZWxlbWVudF90eXBlX3BoYXNlPVBoYXNlCi1lbGVtZW50X3R5cGVfaXRlcmF0aW9uPUl0ZXJhdGlvbgotZWxlbWVudF90eXBlX3Rhc2tfZGVzY3JpcHRvcj1UYXNrIERlc2NyaXB0b3IKLWVsZW1lbnRfdHlwZV9taWxlc3RvbmU9TWlsZXN0b25lCi1lbGVtZW50X3R5cGVfY29udHJvbF9mbG93PUNvbnRyb2wgRmxvdwotCi0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3BsdWdpbi54bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZDNmZWYxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1MzEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLQotPCEtLQotIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotCi0gQ29udHJpYnV0b3JzOgotIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLQotLS0+Ci08cGx1Z2luPgotCi0gICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMiPgotICAgICAgPGluaXRpYWxpemVyIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5wYXJ0LlVNTERpYWdyYW1QcmVmZXJlbmNlSW5pdGlhbGl6ZXIiLz4KLSAgIDwvZXh0ZW5zaW9uPgotCi0gIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnRlYW0uY29yZS5maWxlVHlwZXMiPgotICAgICAgPGZpbGVUeXBlcwotICAgICAgICAgdHlwZT0idGV4dCIKLSAgICAgICAgIGV4dGVuc2lvbj0ieG1pIj4KLSAgICAgIDwvZmlsZVR5cGVzPgotICA8L2V4dGVuc2lvbj4KLQotICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLmV4dGVuc2lvbl9wYXJzZXIiPgotICAgICAgPHBhcnNlcgotICAgICAgICAgdHlwZT0ieG1pIgotICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb3JlLnJlc291cmNlcy5HTUZSZXNvdXJjZUZhY3RvcnkiPgotICAgICAgPC9wYXJzZXI+Ci0gICA8L2V4dGVuc2lvbj4KLQotICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkuZWRpdG9ycyI+Ci0gICAgIDxlZGl0b3IKLSAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnBhcnQuQWN0aXZpdHlEaWFncmFtRWRpdG9ySUQiCi0gICAgICAgIG5hbWU9IkFjdGl2aXR5IERpYWdyYW0gRWRpdG9yIgotICAgICAgICBpY29uPSJpY29ucy9mdWxsL2V0b29sMTYvQURFZGl0b3IuZ2lmIgotICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQucGFydC5BY3Rpdml0eURpYWdyYW1FZGl0b3IiCi0gICAgICAgIG1hdGNoaW5nU3RyYXRlZ3k9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnBhcnQuVU1MTWF0Y2hpbmdTdHJhdGVneSIKLSAgICAgICAgY29udHJpYnV0b3JDbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQucGFydC5VTUxEaWFncmFtQWN0aW9uQmFyQ29udHJpYnV0b3IiPgotICAgICA8L2VkaXRvcj4KLSAgIDwvZXh0ZW5zaW9uPgotCi0gIDwhLS0gPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkubmV3V2l6YXJkcyI+Ci0gIAkgIDx3aXphcmQKLSAgCSAgICAgbmFtZT0iQWN0aXZpdHkgRGlhZ3JhbSIKLSAgCSAgICAgaWNvbj0iaWNvbnMvb2JqMTYvVU1MRGlhZ3JhbUZpbGUuZ2lmIgotICAJICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2UudWkuRXhhbXBsZXMiCi0gIAkgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5wYXJ0LlVNTENyZWF0aW9uV2l6YXJkIgotICAJICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQucGFydC5VTUxDcmVhdGlvbldpemFyZElEIj4KLSAgCSAgCSA8ZGVzY3JpcHRpb24+Ci0gIAkgIAkJQ3JlYXRlcyBBY3Rpdml0eSBkaWFncmFtLgotICAJICAJIDwvZGVzY3JpcHRpb24+ICAKLSAgICAgIDwvd2l6YXJkPgotICAgPC9leHRlbnNpb24+IC0tPgotCi0gICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5wb3B1cE1lbnVzIj4KLSAgICAgCTwhLS0gPG9iamVjdENvbnRyaWJ1dGlvbgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnVpLm9iamVjdENvbnRyaWJ1dGlvbi5JRmlsZTEiCi0gICAgICAgICAgICBuYW1lRmlsdGVyPSIqLnVtbCIKLSAgICAgICAgICAgIG9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZSI+Ci0gICAgICAgICA8YWN0aW9uCi0gICAgICAgICAgICAgICBsYWJlbD0iSW5pdGlhbGl6ZSB4bWkgZGlhZ3JhbSBmaWxlIgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnBhcnQuVU1MSW5pdERpYWdyYW1GaWxlQWN0aW9uIgotICAgICAgICAgICAgICAgbWVudWJhclBhdGg9ImFkZGl0aW9ucyIKLSAgICAgICAgICAgICAgIGVuYWJsZXNGb3I9IjEiCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQucGFydC5VTUxJbml0RGlhZ3JhbUZpbGVBY3Rpb25JRCI+Ci0gICAgICAgICA8L2FjdGlvbj4KLSAgICAgIDwvb2JqZWN0Q29udHJpYnV0aW9uPiAgCi0gICAgICA8b2JqZWN0Q29udHJpYnV0aW9uCi0gICAgICAgICAgICBhZGFwdGFibGU9ImZhbHNlIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnVpLm9iamVjdENvbnRyaWJ1dGlvbi5BY3Rpdml0eUVkaXRQYXJ0MiIKLSAgICAgICAgICAgIG9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLkFjdGl2aXR5RWRpdFBhcnQiPgotICAgICAgICAgPGFjdGlvbgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnBhcnQuVU1MTG9hZFJlc291cmNlQWN0aW9uIgotICAgICAgICAgICAgICAgZW5hYmxlc0Zvcj0iMSIKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5wYXJ0LlVNTExvYWRSZXNvdXJjZUFjdGlvbklEIgotICAgICAgICAgICAgICAgbGFiZWw9IkxvYWQgUmVzb3VyY2UuLi4iCi0gICAgICAgICAgICAgICBtZW51YmFyUGF0aD0iYWRkaXRpb25zIj4KLSAgICAgICAgIDwvYWN0aW9uPgotICAgICAgPC9vYmplY3RDb250cmlidXRpb24+IAotIC0tPgotICA8L2V4dGVuc2lvbj4KLQotICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLmFjdGlvbi5jb250cmlidXRpb25JdGVtUHJvdmlkZXJzIj4KLSAgCSA8Y29udHJpYnV0aW9uSXRlbVByb3ZpZGVyIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5wcm92aWRlcnMuRGlhZ3JhbUNvbnRyaWJ1dGlvbkl0ZW1Qcm92aWRlciI+Ci0gICAgICAgICA8UHJpb3JpdHkgbmFtZT0iTG93Ij4KLSAgICAgICAgIDwvUHJpb3JpdHk+Ci0gICAgICAgICA8cGFydENvbnRyaWJ1dGlvbiBpZD0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQucGFydC5BY3Rpdml0eURpYWdyYW1FZGl0b3JJRCI+Ci0gICAgICAgICAgICA8cGFydEFjdGlvbiBtZW51YmFyUGF0aD0iL2ZpbGUvcHJpbnQiIGlkPSJwcmludFByZXZpZXdBY3Rpb24iPgotICAgICAgICAgICAgPC9wYXJ0QWN0aW9uPgotICAgICAgICAgPC9wYXJ0Q29udHJpYnV0aW9uPgotICAgICAgPC9jb250cmlidXRpb25JdGVtUHJvdmlkZXI+Ci0gICAgICA8Y29udHJpYnV0aW9uSXRlbVByb3ZpZGVyCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wcm92aWRlcnMuRGlhZ3JhbUNvbnRyaWJ1dGlvbkl0ZW1Qcm92aWRlciIKLSAgICAgICAgICAgIGNoZWNrUGx1Z2luTG9hZGVkPSJmYWxzZSI+Ci0gICAgICAgICA8UHJpb3JpdHkgbmFtZT0iTG93Ii8+Ci0gICAgICAgICA8cG9wdXBDb250cmlidXRpb24gY2xhc3M9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucHJvdmlkZXJzLkRpYWdyYW1Db250ZXh0TWVudVByb3ZpZGVyIj4KLSAgICAgICAgICAgIDxwb3B1cFN0cnVjdHVyZWRDb250cmlidXRpb25Dcml0ZXJpYSBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5BY3Rpdml0eVBhcnRpdGlvbjJFZGl0UGFydCIvPgotICAgICAgICAgICAgPHBvcHVwUHJlZGVmaW5lZEl0ZW0gaWQ9ImRlbGV0ZUZyb21EaWFncmFtQWN0aW9uIiByZW1vdmU9InRydWUiLz4KLSAgICAgICAgIDwvcG9wdXBDb250cmlidXRpb24+Ci0gICAgICAgICA8cG9wdXBDb250cmlidXRpb24gY2xhc3M9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucHJvdmlkZXJzLkRpYWdyYW1Db250ZXh0TWVudVByb3ZpZGVyIj4KLSAgICAgICAgICAgIDxwb3B1cFN0cnVjdHVyZWRDb250cmlidXRpb25Dcml0ZXJpYSBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5BY3Rpdml0eVBhcnRpdGlvbk5hbWVFZGl0UGFydCIvPgotICAgICAgICAgICAgPHBvcHVwUHJlZGVmaW5lZEl0ZW0gaWQ9ImRlbGV0ZUZyb21EaWFncmFtQWN0aW9uIiByZW1vdmU9InRydWUiLz4KLSAgICAgICAgIDwvcG9wdXBDb250cmlidXRpb24+Ci0gICAgICAgICA8cG9wdXBDb250cmlidXRpb24gY2xhc3M9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucHJvdmlkZXJzLkRpYWdyYW1Db250ZXh0TWVudVByb3ZpZGVyIj4KLSAgICAgICAgICAgIDxwb3B1cFN0cnVjdHVyZWRDb250cmlidXRpb25Dcml0ZXJpYSBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5BY3Rpdml0eUZpbmFsTm9kZUVkaXRQYXJ0Ii8+Ci0gICAgICAgICAgICA8cG9wdXBQcmVkZWZpbmVkSXRlbSBpZD0iZGVsZXRlRnJvbURpYWdyYW1BY3Rpb24iIHJlbW92ZT0idHJ1ZSIvPgotICAgICAgICAgPC9wb3B1cENvbnRyaWJ1dGlvbj4KLSAgICAgICAgIDxwb3B1cENvbnRyaWJ1dGlvbiBjbGFzcz0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wcm92aWRlcnMuRGlhZ3JhbUNvbnRleHRNZW51UHJvdmlkZXIiPgotICAgICAgICAgICAgPHBvcHVwU3RydWN0dXJlZENvbnRyaWJ1dGlvbkNyaXRlcmlhIG9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLkFjdGl2aXR5RmluYWxOb2RlTmFtZUVkaXRQYXJ0Ii8+Ci0gICAgICAgICAgICA8cG9wdXBQcmVkZWZpbmVkSXRlbSBpZD0iZGVsZXRlRnJvbURpYWdyYW1BY3Rpb24iIHJlbW92ZT0idHJ1ZSIvPgotICAgICAgICAgICAgPHBvcHVwUHJlZGVmaW5lZEl0ZW0gaWQ9ImRlbGV0ZUZyb21Nb2RlbEFjdGlvbiIgcmVtb3ZlPSJ0cnVlIi8+Ci0gICAgICAgICA8L3BvcHVwQ29udHJpYnV0aW9uPgotICAgICAgICAgPHBvcHVwQ29udHJpYnV0aW9uIGNsYXNzPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnByb3ZpZGVycy5EaWFncmFtQ29udGV4dE1lbnVQcm92aWRlciI+Ci0gICAgICAgICAgICA8cG9wdXBTdHJ1Y3R1cmVkQ29udHJpYnV0aW9uQ3JpdGVyaWEgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuTWVyZ2VOb2RlRWRpdFBhcnQiLz4KLSAgICAgICAgICAgIDxwb3B1cFByZWRlZmluZWRJdGVtIGlkPSJkZWxldGVGcm9tRGlhZ3JhbUFjdGlvbiIgcmVtb3ZlPSJ0cnVlIi8+Ci0gICAgICAgICA8L3BvcHVwQ29udHJpYnV0aW9uPgotICAgICAgICAgPHBvcHVwQ29udHJpYnV0aW9uIGNsYXNzPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnByb3ZpZGVycy5EaWFncmFtQ29udGV4dE1lbnVQcm92aWRlciI+Ci0gICAgICAgICAgICA8cG9wdXBTdHJ1Y3R1cmVkQ29udHJpYnV0aW9uQ3JpdGVyaWEgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuTWVyZ2VOb2RlTmFtZUVkaXRQYXJ0Ii8+Ci0gICAgICAgICAgICA8cG9wdXBQcmVkZWZpbmVkSXRlbSBpZD0iZGVsZXRlRnJvbURpYWdyYW1BY3Rpb24iIHJlbW92ZT0idHJ1ZSIvPgotICAgICAgICAgPC9wb3B1cENvbnRyaWJ1dGlvbj4KLSAgICAgICAgIDxwb3B1cENvbnRyaWJ1dGlvbiBjbGFzcz0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wcm92aWRlcnMuRGlhZ3JhbUNvbnRleHRNZW51UHJvdmlkZXIiPgotICAgICAgICAgICAgPHBvcHVwU3RydWN0dXJlZENvbnRyaWJ1dGlvbkNyaXRlcmlhIG9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLkZvcmtOb2RlRWRpdFBhcnQiLz4KLSAgICAgICAgICAgIDxwb3B1cFByZWRlZmluZWRJdGVtIGlkPSJkZWxldGVGcm9tRGlhZ3JhbUFjdGlvbiIgcmVtb3ZlPSJ0cnVlIi8+Ci0gICAgICAgICA8L3BvcHVwQ29udHJpYnV0aW9uPgotICAgICAgICAgPHBvcHVwQ29udHJpYnV0aW9uIGNsYXNzPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnByb3ZpZGVycy5EaWFncmFtQ29udGV4dE1lbnVQcm92aWRlciI+Ci0gICAgICAgICAgICA8cG9wdXBTdHJ1Y3R1cmVkQ29udHJpYnV0aW9uQ3JpdGVyaWEgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuSW5pdGlhbE5vZGVFZGl0UGFydCIvPgotICAgICAgICAgICAgPHBvcHVwUHJlZGVmaW5lZEl0ZW0gaWQ9ImRlbGV0ZUZyb21EaWFncmFtQWN0aW9uIiByZW1vdmU9InRydWUiLz4KLSAgICAgICAgIDwvcG9wdXBDb250cmlidXRpb24+Ci0gICAgICAgICA8cG9wdXBDb250cmlidXRpb24gY2xhc3M9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucHJvdmlkZXJzLkRpYWdyYW1Db250ZXh0TWVudVByb3ZpZGVyIj4KLSAgICAgICAgICAgIDxwb3B1cFN0cnVjdHVyZWRDb250cmlidXRpb25Dcml0ZXJpYSBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5Jbml0aWFsTm9kZU5hbWVFZGl0UGFydCIvPgotICAgICAgICAgICAgPHBvcHVwUHJlZGVmaW5lZEl0ZW0gaWQ9ImRlbGV0ZUZyb21EaWFncmFtQWN0aW9uIiByZW1vdmU9InRydWUiLz4KLSAgICAgICAgICAgIDxwb3B1cFByZWRlZmluZWRJdGVtIGlkPSJkZWxldGVGcm9tTW9kZWxBY3Rpb24iIHJlbW92ZT0idHJ1ZSIvPgotICAgICAgICAgPC9wb3B1cENvbnRyaWJ1dGlvbj4KLSAgICAgICAgIDxwb3B1cENvbnRyaWJ1dGlvbiBjbGFzcz0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wcm92aWRlcnMuRGlhZ3JhbUNvbnRleHRNZW51UHJvdmlkZXIiPgotICAgICAgICAgICAgPHBvcHVwU3RydWN0dXJlZENvbnRyaWJ1dGlvbkNyaXRlcmlhIG9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLkRlY2lzaW9uTm9kZUVkaXRQYXJ0Ii8+Ci0gICAgICAgICAgICA8cG9wdXBQcmVkZWZpbmVkSXRlbSBpZD0iZGVsZXRlRnJvbURpYWdyYW1BY3Rpb24iIHJlbW92ZT0idHJ1ZSIvPgotICAgICAgICAgPC9wb3B1cENvbnRyaWJ1dGlvbj4KLSAgICAgICAgIDxwb3B1cENvbnRyaWJ1dGlvbiBjbGFzcz0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wcm92aWRlcnMuRGlhZ3JhbUNvbnRleHRNZW51UHJvdmlkZXIiPgotICAgICAgICAgICAgPHBvcHVwU3RydWN0dXJlZENvbnRyaWJ1dGlvbkNyaXRlcmlhIG9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLkRlY2lzaW9uTm9kZU5hbWVFZGl0UGFydCIvPgotICAgICAgICAgICAgPHBvcHVwUHJlZGVmaW5lZEl0ZW0gaWQ9ImRlbGV0ZUZyb21EaWFncmFtQWN0aW9uIiByZW1vdmU9InRydWUiLz4KLSAgICAgICAgIDwvcG9wdXBDb250cmlidXRpb24+Ci0gICAgICAgICA8cG9wdXBDb250cmlidXRpb24gY2xhc3M9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucHJvdmlkZXJzLkRpYWdyYW1Db250ZXh0TWVudVByb3ZpZGVyIj4KLSAgICAgICAgICAgIDxwb3B1cFN0cnVjdHVyZWRDb250cmlidXRpb25Dcml0ZXJpYSBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5Kb2luTm9kZUVkaXRQYXJ0Ii8+Ci0gICAgICAgICAgICA8cG9wdXBQcmVkZWZpbmVkSXRlbSBpZD0iZGVsZXRlRnJvbURpYWdyYW1BY3Rpb24iIHJlbW92ZT0idHJ1ZSIvPgotICAgICAgICAgPC9wb3B1cENvbnRyaWJ1dGlvbj4KLSAgICAgICAgIDxwb3B1cENvbnRyaWJ1dGlvbiBjbGFzcz0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wcm92aWRlcnMuRGlhZ3JhbUNvbnRleHRNZW51UHJvdmlkZXIiPgotICAgICAgICAgICAgPHBvcHVwU3RydWN0dXJlZENvbnRyaWJ1dGlvbkNyaXRlcmlhIG9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVFZGl0UGFydCIvPgotICAgICAgICAgICAgPHBvcHVwUHJlZGVmaW5lZEl0ZW0gaWQ9ImRlbGV0ZUZyb21EaWFncmFtQWN0aW9uIiByZW1vdmU9InRydWUiLz4KLSAgICAgICAgIDwvcG9wdXBDb250cmlidXRpb24+Ci0gICAgICAgICA8cG9wdXBDb250cmlidXRpb24gY2xhc3M9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucHJvdmlkZXJzLkRpYWdyYW1Db250ZXh0TWVudVByb3ZpZGVyIj4KLSAgICAgICAgICAgIDxwb3B1cFN0cnVjdHVyZWRDb250cmlidXRpb25Dcml0ZXJpYSBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZUVkaXRQYXJ0Ii8+Ci0gICAgICAgICAgICA8cG9wdXBQcmVkZWZpbmVkSXRlbSBpZD0iZGVsZXRlRnJvbURpYWdyYW1BY3Rpb24iIHJlbW92ZT0idHJ1ZSIvPgotICAgICAgICAgPC9wb3B1cENvbnRyaWJ1dGlvbj4KLSAgICAgICAgIDxwb3B1cENvbnRyaWJ1dGlvbiBjbGFzcz0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wcm92aWRlcnMuRGlhZ3JhbUNvbnRleHRNZW51UHJvdmlkZXIiPgotICAgICAgICAgICAgPHBvcHVwU3RydWN0dXJlZENvbnRyaWJ1dGlvbkNyaXRlcmlhIG9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLkFjdGl2aXR5UGFydGl0aW9uRWRpdFBhcnQiLz4KLSAgICAgICAgICAgIDxwb3B1cFByZWRlZmluZWRJdGVtIGlkPSJkZWxldGVGcm9tRGlhZ3JhbUFjdGlvbiIgcmVtb3ZlPSJ0cnVlIi8+Ci0gICAgICAgICA8L3BvcHVwQ29udHJpYnV0aW9uPgotICAgICAgICAgPHBvcHVwQ29udHJpYnV0aW9uIGNsYXNzPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnByb3ZpZGVycy5EaWFncmFtQ29udGV4dE1lbnVQcm92aWRlciI+Ci0gICAgICAgICAgICA8cG9wdXBTdHJ1Y3R1cmVkQ29udHJpYnV0aW9uQ3JpdGVyaWEgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuQWN0aXZpdHlQYXJ0aXRpb25OYW1lMkVkaXRQYXJ0Ii8+Ci0gICAgICAgICAgICA8cG9wdXBQcmVkZWZpbmVkSXRlbSBpZD0iZGVsZXRlRnJvbURpYWdyYW1BY3Rpb24iIHJlbW92ZT0idHJ1ZSIvPgotICAgICAgICAgPC9wb3B1cENvbnRyaWJ1dGlvbj4KLSAgICAgICAgIDxwb3B1cENvbnRyaWJ1dGlvbiBjbGFzcz0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wcm92aWRlcnMuRGlhZ3JhbUNvbnRleHRNZW51UHJvdmlkZXIiPgotICAgICAgICAgICAgPHBvcHVwU3RydWN0dXJlZENvbnRyaWJ1dGlvbkNyaXRlcmlhIG9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLkFjdGl2aXR5UGFyYW1ldGVyTm9kZUVkaXRQYXJ0Ii8+Ci0gICAgICAgICAgICA8cG9wdXBQcmVkZWZpbmVkSXRlbSBpZD0iZGVsZXRlRnJvbURpYWdyYW1BY3Rpb24iIHJlbW92ZT0idHJ1ZSIvPgotICAgICAgICAgPC9wb3B1cENvbnRyaWJ1dGlvbj4KLSAgICAgICAgIDxwb3B1cENvbnRyaWJ1dGlvbiBjbGFzcz0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wcm92aWRlcnMuRGlhZ3JhbUNvbnRleHRNZW51UHJvdmlkZXIiPgotICAgICAgICAgICAgPHBvcHVwU3RydWN0dXJlZENvbnRyaWJ1dGlvbkNyaXRlcmlhIG9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLkFjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWVFZGl0UGFydCIvPgotICAgICAgICAgICAgPHBvcHVwUHJlZGVmaW5lZEl0ZW0gaWQ9ImRlbGV0ZUZyb21EaWFncmFtQWN0aW9uIiByZW1vdmU9InRydWUiLz4KLSAgICAgICAgIDwvcG9wdXBDb250cmlidXRpb24+Ci0gICAgICAgICA8cG9wdXBDb250cmlidXRpb24gY2xhc3M9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucHJvdmlkZXJzLkRpYWdyYW1Db250ZXh0TWVudVByb3ZpZGVyIj4KLSAgICAgICAgICAgIDxwb3B1cFN0cnVjdHVyZWRDb250cmlidXRpb25Dcml0ZXJpYSBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlMkVkaXRQYXJ0Ii8+Ci0gICAgICAgICAgICA8cG9wdXBQcmVkZWZpbmVkSXRlbSBpZD0iZGVsZXRlRnJvbURpYWdyYW1BY3Rpb24iIHJlbW92ZT0idHJ1ZSIvPgotICAgICAgICAgPC9wb3B1cENvbnRyaWJ1dGlvbj4KLSAgICAgICAgIDxwb3B1cENvbnRyaWJ1dGlvbiBjbGFzcz0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wcm92aWRlcnMuRGlhZ3JhbUNvbnRleHRNZW51UHJvdmlkZXIiPgotICAgICAgICAgICAgPHBvcHVwU3RydWN0dXJlZENvbnRyaWJ1dGlvbkNyaXRlcmlhIG9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVOYW1lMkVkaXRQYXJ0Ii8+Ci0gICAgICAgICAgICA8cG9wdXBQcmVkZWZpbmVkSXRlbSBpZD0iZGVsZXRlRnJvbURpYWdyYW1BY3Rpb24iIHJlbW92ZT0idHJ1ZSIvPgotICAgICAgICAgPC9wb3B1cENvbnRyaWJ1dGlvbj4KLSAgICAgICAgIDxwb3B1cENvbnRyaWJ1dGlvbiBjbGFzcz0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wcm92aWRlcnMuRGlhZ3JhbUNvbnRleHRNZW51UHJvdmlkZXIiPgotICAgICAgICAgICAgPHBvcHVwU3RydWN0dXJlZENvbnRyaWJ1dGlvbkNyaXRlcmlhIG9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGUzRWRpdFBhcnQiLz4KLSAgICAgICAgICAgIDxwb3B1cFByZWRlZmluZWRJdGVtIGlkPSJkZWxldGVGcm9tRGlhZ3JhbUFjdGlvbiIgcmVtb3ZlPSJ0cnVlIi8+Ci0gICAgICAgICA8L3BvcHVwQ29udHJpYnV0aW9uPgotICAgICAgICAgPHBvcHVwQ29udHJpYnV0aW9uIGNsYXNzPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnByb3ZpZGVycy5EaWFncmFtQ29udGV4dE1lbnVQcm92aWRlciI+Ci0gICAgICAgICAgICA8cG9wdXBTdHJ1Y3R1cmVkQ29udHJpYnV0aW9uQ3JpdGVyaWEgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWUzRWRpdFBhcnQiLz4KLSAgICAgICAgICAgIDxwb3B1cFByZWRlZmluZWRJdGVtIGlkPSJkZWxldGVGcm9tRGlhZ3JhbUFjdGlvbiIgcmVtb3ZlPSJ0cnVlIi8+Ci0gICAgICAgICA8L3BvcHVwQ29udHJpYnV0aW9uPgotICAgICAgICAgPHBvcHVwQ29udHJpYnV0aW9uIGNsYXNzPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnByb3ZpZGVycy5EaWFncmFtQ29udGV4dE1lbnVQcm92aWRlciI+Ci0gICAgICAgICAgICA8cG9wdXBTdHJ1Y3R1cmVkQ29udHJpYnV0aW9uQ3JpdGVyaWEgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuQWN0aXZpdHlQYXJhbWV0ZXJOb2RlMkVkaXRQYXJ0Ii8+Ci0gICAgICAgICAgICA8cG9wdXBQcmVkZWZpbmVkSXRlbSBpZD0iZGVsZXRlRnJvbURpYWdyYW1BY3Rpb24iIHJlbW92ZT0idHJ1ZSIvPgotICAgICAgICAgPC9wb3B1cENvbnRyaWJ1dGlvbj4KLSAgICAgICAgIDxwb3B1cENvbnRyaWJ1dGlvbiBjbGFzcz0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wcm92aWRlcnMuRGlhZ3JhbUNvbnRleHRNZW51UHJvdmlkZXIiPgotICAgICAgICAgICAgPHBvcHVwU3RydWN0dXJlZENvbnRyaWJ1dGlvbkNyaXRlcmlhIG9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLkFjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWUyRWRpdFBhcnQiLz4KLSAgICAgICAgICAgIDxwb3B1cFByZWRlZmluZWRJdGVtIGlkPSJkZWxldGVGcm9tRGlhZ3JhbUFjdGlvbiIgcmVtb3ZlPSJ0cnVlIi8+Ci0gICAgICAgICA8L3BvcHVwQ29udHJpYnV0aW9uPgotICAgICAgICAgPHBvcHVwQ29udHJpYnV0aW9uIGNsYXNzPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnByb3ZpZGVycy5EaWFncmFtQ29udGV4dE1lbnVQcm92aWRlciI+Ci0gICAgICAgICAgICA8cG9wdXBTdHJ1Y3R1cmVkQ29udHJpYnV0aW9uQ3JpdGVyaWEgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuQ29udHJvbEZsb3dFZGl0UGFydCIvPgotICAgICAgICAgICAgPHBvcHVwUHJlZGVmaW5lZEl0ZW0gaWQ9ImRlbGV0ZUZyb21EaWFncmFtQWN0aW9uIiByZW1vdmU9InRydWUiLz4KLSAgICAgICAgIDwvcG9wdXBDb250cmlidXRpb24+Ci0gICAgICAgICA8cG9wdXBDb250cmlidXRpb24gY2xhc3M9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucHJvdmlkZXJzLkRpYWdyYW1Db250ZXh0TWVudVByb3ZpZGVyIj4KLSAgICAgICAgICAgIDxwb3B1cFN0cnVjdHVyZWRDb250cmlidXRpb25Dcml0ZXJpYSBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5Db250cm9sRmxvd05hbWVFZGl0UGFydCIvPgotCQkJPHBvcHVwUHJlZGVmaW5lZEl0ZW0gaWQ9ImRlbGV0ZUZyb21EaWFncmFtQWN0aW9uIiByZW1vdmU9InRydWUiLz4gCi0gICAgICAgICAgICA8cG9wdXBQcmVkZWZpbmVkSXRlbSBpZD0iZGVsZXRlRnJvbU1vZGVsQWN0aW9uIiByZW1vdmU9InRydWUiLz4KLSAgICAgICAgIDwvcG9wdXBDb250cmlidXRpb24+Ci0gICAgICA8L2NvbnRyaWJ1dGlvbkl0ZW1Qcm92aWRlcj4gCi0gICA8L2V4dGVuc2lvbj4KLQotICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLmFjdGlvbi5nbG9iYWxBY3Rpb25IYW5kbGVyUHJvdmlkZXJzIj4KLSAgICAgIDxHbG9iYWxBY3Rpb25IYW5kbGVyUHJvdmlkZXIKLSAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnByb3ZpZGVycy5EaWFncmFtR2xvYmFsQWN0aW9uSGFuZGxlclByb3ZpZGVyIgotICAgICAgICAgaWQ9IkFEUHJlc2VudGF0aW9uIj4KLSAgICAgICAgIDxQcmlvcml0eSBuYW1lPSJMb3dlc3QiLz4KLSAgICAgICAgIDxWaWV3SWQgaWQ9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnBhcnQuQWN0aXZpdHlEaWFncmFtRWRpdG9ySUQiPgotICAgICAgICAgICAgPEVsZW1lbnRUeXBlIGNsYXNzPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JR3JhcGhpY2FsRWRpdFBhcnQiPgotICAgICAgICAgICAgICAgPEdsb2JhbEFjdGlvbklkIGFjdGlvbklkPSJkZWxldGUiLz4KLSAgICAgICAgICAgIDwvRWxlbWVudFR5cGU+Ci0gICAgICAgICAgICA8RWxlbWVudFR5cGUgY2xhc3M9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLkRpYWdyYW1FZGl0UGFydCI+Ci0gICAgICAgICAgICAgICA8R2xvYmFsQWN0aW9uSWQgYWN0aW9uSWQ9InNhdmUiLz4KLSAgICAgICAgICAgIDwvRWxlbWVudFR5cGU+Ci0gICAgICAgICA8L1ZpZXdJZD4KLSAgICAgIDwvR2xvYmFsQWN0aW9uSGFuZGxlclByb3ZpZGVyPgotICAgICAgIDxHbG9iYWxBY3Rpb25IYW5kbGVyUHJvdmlkZXIKLSAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnByaW50aW5nLnJlbmRlci5wcm92aWRlcnMuRGlhZ3JhbVdpdGhQcmludEdsb2JhbEFjdGlvbkhhbmRsZXJQcm92aWRlciIKLSAgICAgICAgIGlkPSJBRFByZXNlbnRhdGlvblByaW50Ij4KLSAgICAgICAgIDxQcmlvcml0eSBuYW1lPSJMb3dlc3QiLz4KLSAgICAgICAgIDxWaWV3SWQgaWQ9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnBhcnQuQWN0aXZpdHlEaWFncmFtRWRpdG9ySUQiPgotICAgICAgICAgICAgPEVsZW1lbnRUeXBlIGNsYXNzPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JR3JhcGhpY2FsRWRpdFBhcnQiPgotICAgICAgICAgICAgICAgPEdsb2JhbEFjdGlvbklkIGFjdGlvbklkPSJwcmludCIvPgotICAgICAgICAgICAgPC9FbGVtZW50VHlwZT4KLSAgICAgICAgIDwvVmlld0lkPgotICAgICAgPC9HbG9iYWxBY3Rpb25IYW5kbGVyUHJvdmlkZXI+Ci0gICAgICA8R2xvYmFsQWN0aW9uSGFuZGxlclByb3ZpZGVyCi0gICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wcm92aWRlcnMuaWRlLnByb3ZpZGVycy5EaWFncmFtSURFR2xvYmFsQWN0aW9uSGFuZGxlclByb3ZpZGVyIgotICAgICAgICAgaWQ9IkFEUHJlc2VudGF0aW9uSURFIj4KLSAgICAgICAgIDxQcmlvcml0eSBuYW1lPSJMb3dlc3QiLz4KLSAgICAgICAgIDxWaWV3SWQgaWQ9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnBhcnQuQWN0aXZpdHlEaWFncmFtRWRpdG9ySUQiPgotICAgICAgICAgICAgPEVsZW1lbnRUeXBlIGNsYXNzPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JR3JhcGhpY2FsRWRpdFBhcnQiPgotICAgICAgICAgICAgICAgPEdsb2JhbEFjdGlvbklkIGFjdGlvbklkPSJib29rbWFyayIvPgotICAgICAgICAgICAgPC9FbGVtZW50VHlwZT4KLSAgICAgICAgIDwvVmlld0lkPgotICAgICAgPC9HbG9iYWxBY3Rpb25IYW5kbGVyUHJvdmlkZXI+Ci0gICAgICA8IS0tCi0gICAgICA8R2xvYmFsQWN0aW9uSGFuZGxlclByb3ZpZGVyCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZW5kZXIucHJvdmlkZXJzLkRpYWdyYW1VSVJlbmRlckdsb2JhbEFjdGlvbkhhbmRsZXJQcm92aWRlciIKLSAgICAgICAgICAgIGlkPSJBRFJlbmRlciI+Ci0gICAgICAgICA8UHJpb3JpdHkgbmFtZT0iTG93ZXN0Ii8+Ci0gICAgICAgICA8Vmlld0lkIGlkPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5wYXJ0LkFjdGl2aXR5RGlhZ3JhbUVkaXRvcklEIj4KLSAgICAgICAgICAgIDxFbGVtZW50VHlwZSBjbGFzcz0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUdyYXBoaWNhbEVkaXRQYXJ0Ij4KLSAgICAgICAgICAgICAgIDxHbG9iYWxBY3Rpb25JZCBhY3Rpb25JZD0iY3V0Ii8+Ci0gICAgICAgICAgICAgICA8R2xvYmFsQWN0aW9uSWQgYWN0aW9uSWQ9ImNvcHkiLz4KLSAgICAgICAgICAgICAgIDxHbG9iYWxBY3Rpb25JZCBhY3Rpb25JZD0icGFzdGUiLz4KLSAgICAgICAgICAgIDwvRWxlbWVudFR5cGU+Ci0gICAgICAgICA8L1ZpZXdJZD4KLSAgICAgIDwvR2xvYmFsQWN0aW9uSGFuZGxlclByb3ZpZGVyPgotICAgICAgLS0+Ci0gICA8L2V4dGVuc2lvbj4KLQotICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLnZpZXdQcm92aWRlcnMiPgotICAgICAgPHZpZXdQcm92aWRlciBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQucHJvdmlkZXJzLlVNTFZpZXdQcm92aWRlciI+Ci0gICAgICAgICA8UHJpb3JpdHkgbmFtZT0iTG93ZXN0Ii8+Ci0gICAgICAgICA8Y29udGV4dCB2aWV3Q2xhc3M9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkRpYWdyYW0iIHNlbWFudGljSGludHM9IkFEIi8+Ci0gICAgICAgICA8Y29udGV4dCB2aWV3Q2xhc3M9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vZGUiIHNlbWFudGljSGludHM9IiIvPgotICAgICAgICAgPGNvbnRleHQgdmlld0NsYXNzPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5FZGdlIiBzZW1hbnRpY0hpbnRzPSIiLz4KLSAgICAgIDwvdmlld1Byb3ZpZGVyPgotICAgPC9leHRlbnNpb24+Ci0KLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRQcm92aWRlcnMiPgotICAgICAgPGVkaXRwYXJ0UHJvdmlkZXIgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnByb3ZpZGVycy5VTUxFZGl0UGFydFByb3ZpZGVyIj4KLSAgICAgICAgIDxQcmlvcml0eSBuYW1lPSJMb3dlc3QiLz4KLSAgICAgIDwvZWRpdHBhcnRQcm92aWRlcj4KLSAgIDwvZXh0ZW5zaW9uPgotCi0gICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnBhbGV0dGVQcm92aWRlcnMiPgotICAgICAgPHBhbGV0dGVQcm92aWRlciBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQucHJvdmlkZXJzLlVNTFBhbGV0dGVQcm92aWRlciI+Ci0gICAgICAgICA8UHJpb3JpdHkgbmFtZT0iTG93ZXN0Ii8+Ci0gICAgICAgICA8ZWRpdG9yIGlkPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5wYXJ0LkFjdGl2aXR5RGlhZ3JhbUVkaXRvcklEIi8+Ci0gICAgICA8L3BhbGV0dGVQcm92aWRlcj4KLSAgICAgIDxwYWxldHRlUHJvdmlkZXIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnByb3ZpZGVycy5EZWZhdWx0UGFsZXR0ZVByb3ZpZGVyIj4KLSAgICAgICAgPFByaW9yaXR5IG5hbWU9Ik1lZGl1bSIvPgotICAgICAgICA8ZWRpdG9yIGlkPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5wYXJ0LkFjdGl2aXR5RGlhZ3JhbUVkaXRvcklEIi8+Ci0gICAgICAgIDxjb250cmlidXRpb24+Ci0gICAgICAgICAgICA8cHJlZGVmaW5lZEVudHJ5ICAgIAotICAgICAgICAgICAgCWlkPSJnZW9zaGFwZURyYXdlciIgcGF0aD0iLyI+Ci0gICAgICAgICAgICAgPC9wcmVkZWZpbmVkRW50cnk+IAotICAgICAgICA8L2NvbnRyaWJ1dGlvbj4KLSAgICAgIDwvcGFsZXR0ZVByb3ZpZGVyPgotICAgPC9leHRlbnNpb24+Ci0KLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi51aS5tb2RlbGluZ0Fzc2lzdGFudFByb3ZpZGVycyI+Ci0gICAgICA8bW9kZWxpbmdBc3Npc3RhbnRQcm92aWRlciBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQucHJvdmlkZXJzLlVNTE1vZGVsaW5nQXNzaXN0YW50UHJvdmlkZXIiPgotICAgICAgICAgPFByaW9yaXR5IG5hbWU9Ikxvd2VzdCIvPgotICAgICAgPC9tb2RlbGluZ0Fzc2lzdGFudFByb3ZpZGVyPgotICAgPC9leHRlbnNpb24+Ci0KLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wcm9wZXJ0aWVzLnByb3BlcnRpZXNQcm92aWRlcnMiPgotICAgICAgPFByb3BlcnRpZXNQcm92aWRlcgotICAgICAgICAgICAgdmVyaWZ5UGx1Z2luTG9hZGVkPSJmYWxzZSIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5wcm92aWRlcnMuVU1MUHJvcGVydHlQcm92aWRlciI+Ci0gICAgICAgICA8UHJpb3JpdHkgbmFtZT0iTG93ZXN0Ii8+Ci0gICAgICA8L1Byb3BlcnRpZXNQcm92aWRlcj4KLSAgIDwvZXh0ZW5zaW9uPgotCi0gICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMuaWNvblByb3ZpZGVycyI+Ci0gICAgICA8SWNvblByb3ZpZGVyIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5wcm92aWRlcnMuVU1MSWNvblByb3ZpZGVyIj4KLSAgICAgICAgIDxQcmlvcml0eSBuYW1lPSJMb3ciLz4KLSAgICAgIDwvSWNvblByb3ZpZGVyPgotICAgICAgPEljb25Qcm92aWRlcgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZ2Vvc2hhcGVzLmludGVybmFsLnByb3ZpZGVycy5HZW9TaGFwZUljb25Qcm92aWRlciI+Ci0gICAgICAgICA8UHJpb3JpdHkKLSAgICAgICAgICAgICAgIG5hbWU9Ik1lZGl1bSI+Ci0gICAgICAgICA8L1ByaW9yaXR5PgotICAgICAgICAgPG9iamVjdCBjbGFzcz0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldyhvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbikiIGlkPSJHZW9TaGFwZSI+Ci0gICAgICAgIAkgPG1ldGhvZCBuYW1lPSJnZXRUeXBlKCkiIHZhbHVlPSJvdmFsLHRyaWFuZ2xlLHJlY3RhbmdsZSxzaGFkb3dSZWN0YW5nbGUscmVjdGFuZ2xlM0Qscm91bmRSZWN0YW5nbGUsaGV4YWdvbixvY3RhZ29uLHBlbnRhZ29uLGRpYW1vbmQsY3lsaW5kZXIsbGluZSIvPgotCSAgICAgPC9vYmplY3Q+Ci0gICAgICAgICA8Y29udGV4dCBlbGVtZW50cz0iR2VvU2hhcGUiPgotICAgICAgICAgPC9jb250ZXh0PgotICAgICAgPC9JY29uUHJvdmlkZXI+Ci0gICA8L2V4dGVuc2lvbj4KLQotICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlclByb3ZpZGVycyI+Ci0gICAgICA8UGFyc2VyUHJvdmlkZXIgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnByb3ZpZGVycy5VTUxQYXJzZXJQcm92aWRlciI+Ci0gICAgICAgICA8UHJpb3JpdHkgbmFtZT0iTG93ZXN0Ii8+Ci0gICAgICA8L1BhcnNlclByb3ZpZGVyPgotICAgPC9leHRlbnNpb24+Ci0KLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuZWxlbWVudFR5cGVzIj4KLQotICAgICAgPG1ldGFtb2RlbCBuc1VSST0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy91bWwyLzIuMS4wL1VNTCI+Ci0gICAgICAgICA8bWV0YW1vZGVsVHlwZQotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLkFjdGl2aXR5Xzc5IgotICAgICAgICAgICAgICAga2luZD0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5JSGludGVkVHlwZSIKLSAgICAgICAgICAgICAgIGVjbGFzcz0iQWN0aXZpdHkiCi0gICAgICAgICAgICAgICBlZGl0aGVscGVyPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LmhlbHBlcnMuQWN0aXZpdHlFZGl0SGVscGVyIj4KLSAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJzZW1hbnRpY0hpbnQiIHZhbHVlPSI3OSIvPgotICAgICAgICAgPC9tZXRhbW9kZWxUeXBlPgotICAgICAgPC9tZXRhbW9kZWw+Ci0KLSAgICAgIDxtZXRhbW9kZWwgbnNVUkk9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvdW1sMi8yLjEuMC9VTUwiPgotICAgICAgICAgPHNwZWNpYWxpemF0aW9uVHlwZQotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLkFjdGl2aXR5UGFydGl0aW9uXzIwMDEiCi0gICAgICAgICAgICAgICBuYW1lPSIlZWxlbWVudF90eXBlX2FjdGl2aXR5X3BhcnRpdGlvbiIKLSAgICAgICAgICAgICAgIGtpbmQ9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuSUhpbnRlZFR5cGUiCi0gICAgICAgICAgICAgICBlZGl0aGVscGVyYWR2aWNlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LmhlbHBlcnMuQWN0aXZpdHlQYXJ0aXRpb25FZGl0SGVscGVyQWR2aWNlIj4KLSAgICAgICAgICAgIDxzcGVjaWFsaXplcyBpZD0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuQWN0aXZpdHlQYXJ0aXRpb25fMTAwOCIvPgotICAgICAgICAgICAgPHBhcmFtIG5hbWU9InNlbWFudGljSGludCIgdmFsdWU9IjIwMDEiLz4KLSAgICAgICAgIDwvc3BlY2lhbGl6YXRpb25UeXBlPgotICAgICAgPC9tZXRhbW9kZWw+Ci0KLSAgICAgIDxtZXRhbW9kZWwgbnNVUkk9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvdW1sMi8yLjEuMC9VTUwiPgotICAgICAgICAgPG1ldGFtb2RlbFR5cGUKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5BY3Rpdml0eUZpbmFsTm9kZV8xMDAxIgotICAgICAgICAgICAgICAgbmFtZT0iJWVsZW1lbnRfdHlwZV9lbmRfbm9kZSIKLSAgICAgICAgICAgICAgIGtpbmQ9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuSUhpbnRlZFR5cGUiCi0gICAgICAgICAgICAgICBlY2xhc3M9IkFjdGl2aXR5RmluYWxOb2RlIgotICAgICAgICAgICAgICAgZWRpdGhlbHBlcj0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5oZWxwZXJzLkFjdGl2aXR5RmluYWxOb2RlRWRpdEhlbHBlciI+Ci0gICAgICAgICAgICA8cGFyYW0gbmFtZT0ic2VtYW50aWNIaW50IiB2YWx1ZT0iMTAwMSIvPgotICAgICAgICAgPC9tZXRhbW9kZWxUeXBlPgotICAgICAgPC9tZXRhbW9kZWw+Ci0KLSAgICAgIDxtZXRhbW9kZWwgbnNVUkk9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvdW1sMi8yLjEuMC9VTUwiPgotICAgICAgICAgPG1ldGFtb2RlbFR5cGUKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5NZXJnZU5vZGVfMTAwMiIKLSAgICAgICAgICAgICAgIG5hbWU9IiVlbGVtZW50X3R5cGVfbWVyZ2Vfbm9kZSIKLSAgICAgICAgICAgICAgIGtpbmQ9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuSUhpbnRlZFR5cGUiCi0gICAgICAgICAgICAgICBlY2xhc3M9Ik1lcmdlTm9kZSIKLSAgICAgICAgICAgICAgIGVkaXRoZWxwZXI9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQuaGVscGVycy5NZXJnZU5vZGVFZGl0SGVscGVyIj4KLSAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJzZW1hbnRpY0hpbnQiIHZhbHVlPSIxMDAyIi8+Ci0gICAgICAgICA8L21ldGFtb2RlbFR5cGU+Ci0gICAgICA8L21ldGFtb2RlbD4KLQotICAgICAgPG1ldGFtb2RlbCBuc1VSST0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy91bWwyLzIuMS4wL1VNTCI+Ci0gICAgICAgICA8bWV0YW1vZGVsVHlwZQotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLkZvcmtOb2RlXzEwMDMiCi0gICAgICAgICAgICAgICBuYW1lPSIlZWxlbWVudF90eXBlX2Zvcmtfbm9kZSIKLSAgICAgICAgICAgICAgIGtpbmQ9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuSUhpbnRlZFR5cGUiCi0gICAgICAgICAgICAgICBlY2xhc3M9IkZvcmtOb2RlIgotICAgICAgICAgICAgICAgZWRpdGhlbHBlcj0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5oZWxwZXJzLkZvcmtOb2RlRWRpdEhlbHBlciI+Ci0gICAgICAgICAgICA8cGFyYW0gbmFtZT0ic2VtYW50aWNIaW50IiB2YWx1ZT0iMTAwMyIvPgotICAgICAgICAgPC9tZXRhbW9kZWxUeXBlPgotICAgICAgPC9tZXRhbW9kZWw+Ci0KLSAgICAgIDxtZXRhbW9kZWwgbnNVUkk9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvdW1sMi8yLjEuMC9VTUwiPgotICAgICAgICAgPG1ldGFtb2RlbFR5cGUKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5Jbml0aWFsTm9kZV8xMDA0IgotICAgICAgICAgICAgICAgbmFtZT0iJWVsZW1lbnRfdHlwZV9zdGFydF9ub2RlIgotICAgICAgICAgICAgICAga2luZD0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5JSGludGVkVHlwZSIKLSAgICAgICAgICAgICAgIGVjbGFzcz0iSW5pdGlhbE5vZGUiCi0gICAgICAgICAgICAgICBlZGl0aGVscGVyPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LmhlbHBlcnMuSW5pdGlhbE5vZGVFZGl0SGVscGVyIj4KLSAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJzZW1hbnRpY0hpbnQiIHZhbHVlPSIxMDA0Ii8+Ci0gICAgICAgICA8L21ldGFtb2RlbFR5cGU+Ci0gICAgICA8L21ldGFtb2RlbD4KLQotICAgICAgPG1ldGFtb2RlbCBuc1VSST0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy91bWwyLzIuMS4wL1VNTCI+Ci0gICAgICAgICA8bWV0YW1vZGVsVHlwZQotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLkRlY2lzaW9uTm9kZV8xMDA1IgotICAgICAgICAgICAgICAgbmFtZT0iJWVsZW1lbnRfdHlwZV9kZWNpc2lvbl9ub2RlIgotICAgICAgICAgICAgICAga2luZD0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5JSGludGVkVHlwZSIKLSAgICAgICAgICAgICAgIGVjbGFzcz0iRGVjaXNpb25Ob2RlIgotICAgICAgICAgICAgICAgZWRpdGhlbHBlcj0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5oZWxwZXJzLkRlY2lzaW9uTm9kZUVkaXRIZWxwZXIiPgotICAgICAgICAgICAgPHBhcmFtIG5hbWU9InNlbWFudGljSGludCIgdmFsdWU9IjEwMDUiLz4KLSAgICAgICAgIDwvbWV0YW1vZGVsVHlwZT4KLSAgICAgIDwvbWV0YW1vZGVsPgotCi0gICAgICA8bWV0YW1vZGVsIG5zVVJJPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3VtbDIvMi4xLjAvVU1MIj4KLSAgICAgICAgIDxtZXRhbW9kZWxUeXBlCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuSm9pbk5vZGVfMTAwNiIKLSAgICAgICAgICAgICAgIG5hbWU9IiVlbGVtZW50X3R5cGVfam9pbl9ub2RlIgotICAgICAgICAgICAgICAga2luZD0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5JSGludGVkVHlwZSIKLSAgICAgICAgICAgICAgIGVjbGFzcz0iSm9pbk5vZGUiCi0gICAgICAgICAgICAgICBlZGl0aGVscGVyPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LmhlbHBlcnMuSm9pbk5vZGVFZGl0SGVscGVyIj4KLSAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJzZW1hbnRpY0hpbnQiIHZhbHVlPSIxMDA2Ii8+Ci0gICAgICAgICA8L21ldGFtb2RlbFR5cGU+Ci0gICAgICA8L21ldGFtb2RlbD4KLQotICAgICAgPG1ldGFtb2RlbCBuc1VSST0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy91bWwyLzIuMS4wL1VNTCI+Ci0gICAgICAgICA8bWV0YW1vZGVsVHlwZQotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVfMTAwNyIKLSAgICAgICAgICAgICAgIG5hbWU9IiVlbGVtZW50X3R5cGVfYWN0aXZpdHkiCi0gICAgICAgICAgICAgICBraW5kPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLklIaW50ZWRUeXBlIgotICAgICAgICAgICAgICAgZWNsYXNzPSJTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlIgotICAgICAgICAgICAgICAgZWRpdGhlbHBlcj0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5oZWxwZXJzLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVFZGl0SGVscGVyIj4KLSAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJzZW1hbnRpY0hpbnQiIHZhbHVlPSIxMDA3Ii8+Ci0gICAgICAgICA8L21ldGFtb2RlbFR5cGU+Ci0gICAgICA8L21ldGFtb2RlbD4KLQotICAgICAgPG1ldGFtb2RlbCBuc1VSST0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy91bWwyLzIuMS4wL1VNTCI+Ci0gICAgICAgICA8bWV0YW1vZGVsVHlwZQotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLkFjdGl2aXR5UGFydGl0aW9uXzEwMDgiCi0gICAgICAgICAgICAgICBuYW1lPSIlZWxlbWVudF90eXBlX2FjdGl2aXR5X3BhcnRpdGlvbiIKLSAgICAgICAgICAgICAgIGtpbmQ9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuSUhpbnRlZFR5cGUiCi0gICAgICAgICAgICAgICBlY2xhc3M9IkFjdGl2aXR5UGFydGl0aW9uIgotICAgICAgICAgICAgICAgZWRpdGhlbHBlcj0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5oZWxwZXJzLkFjdGl2aXR5UGFydGl0aW9uRWRpdEhlbHBlciI+Ci0gICAgICAgICAgICA8cGFyYW0gbmFtZT0ic2VtYW50aWNIaW50IiB2YWx1ZT0iMTAwOCIvPgotICAgICAgICAgPC9tZXRhbW9kZWxUeXBlPgotICAgICAgPC9tZXRhbW9kZWw+Ci0KLSAgICAgIDxtZXRhbW9kZWwgbnNVUkk9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvdW1sMi8yLjEuMC9VTUwiPgotICAgICAgICAgPG1ldGFtb2RlbFR5cGUKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5BY3Rpdml0eVBhcmFtZXRlck5vZGVfMTAwOSIKLSAgICAgICAgICAgICAgIG5hbWU9IiVlbGVtZW50X3R5cGVfdGFza19kZXNjcmlwdG9yIgotICAgICAgICAgICAgICAga2luZD0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5JSGludGVkVHlwZSIKLSAgICAgICAgICAgICAgIGVjbGFzcz0iQWN0aXZpdHlQYXJhbWV0ZXJOb2RlIgotICAgICAgICAgICAgICAgZWRpdGhlbHBlcj0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5oZWxwZXJzLkFjdGl2aXR5UGFyYW1ldGVyTm9kZUVkaXRIZWxwZXIiPgotICAgICAgICAgICAgPHBhcmFtIG5hbWU9InNlbWFudGljSGludCIgdmFsdWU9IjEwMDkiLz4KLSAgICAgICAgIDwvbWV0YW1vZGVsVHlwZT4KLSAgICAgIDwvbWV0YW1vZGVsPgotCi0gICAgICA8bWV0YW1vZGVsIG5zVVJJPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3VtbDIvMi4xLjAvVU1MIj4KLSAgICAgICAgIDxzcGVjaWFsaXphdGlvblR5cGUKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlXzEwMTAiCi0gICAgICAgICAgICAgICBuYW1lPSIlZWxlbWVudF90eXBlX3BoYXNlIgotICAgICAgICAgICAgICAga2luZD0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5JSGludGVkVHlwZSIKLSAgICAgICAgICAgICAgIGVkaXRoZWxwZXJhZHZpY2U9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQuaGVscGVycy5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlRWRpdEhlbHBlckFkdmljZSI+Ci0gICAgICAgICAgICA8c3BlY2lhbGl6ZXMgaWQ9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVfMTAwNyIvPgotICAgICAgICAgICAgPHBhcmFtIG5hbWU9InNlbWFudGljSGludCIgdmFsdWU9IjEwMTAiLz4KLSAgICAgICAgIDwvc3BlY2lhbGl6YXRpb25UeXBlPgotICAgICAgPC9tZXRhbW9kZWw+Ci0KLSAgICAgIDxtZXRhbW9kZWwgbnNVUkk9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvdW1sMi8yLjEuMC9VTUwiPgotICAgICAgICAgPHNwZWNpYWxpemF0aW9uVHlwZQotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVfMTAxMSIKLSAgICAgICAgICAgICAgIG5hbWU9IiVlbGVtZW50X3R5cGVfaXRlcmF0aW9uIgotICAgICAgICAgICAgICAga2luZD0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5JSGludGVkVHlwZSIKLSAgICAgICAgICAgICAgIGVkaXRoZWxwZXJhZHZpY2U9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQuaGVscGVycy5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlMkVkaXRIZWxwZXJBZHZpY2UiPgotICAgICAgICAgICAgPHNwZWNpYWxpemVzIGlkPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlXzEwMDciLz4KLSAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJzZW1hbnRpY0hpbnQiIHZhbHVlPSIxMDExIi8+Ci0gICAgICAgICA8L3NwZWNpYWxpemF0aW9uVHlwZT4KLSAgICAgIDwvbWV0YW1vZGVsPgotCi0gICAgICA8bWV0YW1vZGVsIG5zVVJJPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3VtbDIvMi4xLjAvVU1MIj4KLSAgICAgICAgIDxzcGVjaWFsaXphdGlvblR5cGUKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5BY3Rpdml0eVBhcmFtZXRlck5vZGVfMTAxMiIKLSAgICAgICAgICAgICAgIG5hbWU9IiVlbGVtZW50X3R5cGVfbWlsZXN0b25lIgotICAgICAgICAgICAgICAga2luZD0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5JSGludGVkVHlwZSIKLSAgICAgICAgICAgICAgIGVkaXRoZWxwZXJhZHZpY2U9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQuaGVscGVycy5BY3Rpdml0eVBhcmFtZXRlck5vZGVFZGl0SGVscGVyQWR2aWNlIj4KLSAgICAgICAgICAgIDxzcGVjaWFsaXplcyBpZD0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuQWN0aXZpdHlQYXJhbWV0ZXJOb2RlXzEwMDkiLz4KLSAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJzZW1hbnRpY0hpbnQiIHZhbHVlPSIxMDEyIi8+Ci0gICAgICAgICA8L3NwZWNpYWxpemF0aW9uVHlwZT4KLSAgICAgIDwvbWV0YW1vZGVsPgotCi0gICAgICA8bWV0YW1vZGVsIG5zVVJJPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3VtbDIvMi4xLjAvVU1MIj4KLSAgICAgICAgIDxtZXRhbW9kZWxUeXBlCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuQ29udHJvbEZsb3dfMzAwMSIKLSAgICAgICAgICAgICAgIG5hbWU9IiVlbGVtZW50X3R5cGVfY29udHJvbF9mbG93IgotICAgICAgICAgICAgICAga2luZD0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5JSGludGVkVHlwZSIKLSAgICAgICAgICAgICAgIGVjbGFzcz0iQ29udHJvbEZsb3ciCi0gICAgICAgICAgICAgICBlZGl0aGVscGVyPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LmhlbHBlcnMuQ29udHJvbEZsb3dFZGl0SGVscGVyIj4KLSAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJzZW1hbnRpY0hpbnQiIHZhbHVlPSIzMDAxIi8+Ci0gICAgICAgICA8L21ldGFtb2RlbFR5cGU+Ci0gICAgICA8L21ldGFtb2RlbD4KLSAgIDwvZXh0ZW5zaW9uPgotCi0gICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLmVsZW1lbnRUeXBlQmluZGluZ3MiPgotICAgICAgPGNsaWVudENvbnRleHQgaWQ9IkFEQ2xpZW50Q29udGV4dCI+Ci0gICAgICAgICA8ZW5hYmxlbWVudD4KLSAgICAgICAgICAgIDx0ZXN0Ci0gICAgICAgICAgICAgICBwcm9wZXJ0eT0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvcmUuZWRpdGluZ0RvbWFpbiIKLSAgICAgICAgICAgICAgIHZhbHVlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5FZGl0aW5nRG9tYWluIi8+Ci0gICAgICAgICA8L2VuYWJsZW1lbnQ+Ci0gICAgICA8L2NsaWVudENvbnRleHQ+IAotICAgICAgPGJpbmRpbmcgY29udGV4dD0iQURDbGllbnRDb250ZXh0Ij4KLSAgICAgICAgIDxlbGVtZW50VHlwZSByZWY9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLkFjdGl2aXR5Xzc5Ii8+Ci0gICAgICAgICA8ZWxlbWVudFR5cGUgcmVmPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5BY3Rpdml0eVBhcnRpdGlvbl8yMDAxIi8+Ci0gICAgICAgICA8ZWxlbWVudFR5cGUgcmVmPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5BY3Rpdml0eUZpbmFsTm9kZV8xMDAxIi8+Ci0gICAgICAgICA8ZWxlbWVudFR5cGUgcmVmPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5NZXJnZU5vZGVfMTAwMiIvPgotICAgICAgICAgPGVsZW1lbnRUeXBlIHJlZj0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuRm9ya05vZGVfMTAwMyIvPgotICAgICAgICAgPGVsZW1lbnRUeXBlIHJlZj0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuSW5pdGlhbE5vZGVfMTAwNCIvPgotICAgICAgICAgPGVsZW1lbnRUeXBlIHJlZj0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuRGVjaXNpb25Ob2RlXzEwMDUiLz4KLSAgICAgICAgIDxlbGVtZW50VHlwZSByZWY9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLkpvaW5Ob2RlXzEwMDYiLz4KLSAgICAgICAgIDxlbGVtZW50VHlwZSByZWY9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVfMTAwNyIvPgotICAgICAgICAgPGVsZW1lbnRUeXBlIHJlZj0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuQWN0aXZpdHlQYXJ0aXRpb25fMTAwOCIvPgotICAgICAgICAgPGVsZW1lbnRUeXBlIHJlZj0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuQWN0aXZpdHlQYXJhbWV0ZXJOb2RlXzEwMDkiLz4KLSAgICAgICAgIDxlbGVtZW50VHlwZSByZWY9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVfMTAxMCIvPgotICAgICAgICAgPGVsZW1lbnRUeXBlIHJlZj0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZV8xMDExIi8+Ci0gICAgICAgICA8ZWxlbWVudFR5cGUgcmVmPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5BY3Rpdml0eVBhcmFtZXRlck5vZGVfMTAxMiIvPgotICAgICAgICAgPGVsZW1lbnRUeXBlIHJlZj0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuQ29udHJvbEZsb3dfMzAwMSIvPgotICAgICAgICAgPGFkdmljZSByZWY9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5hZHZpY2Uubm90YXRpb25EZXBkZW5kZW50cyIvPgotICAgICAgICAgPGVsZW1lbnRUeXBlIHBhdHRlcm49Ii4qIi8+Ci0gICAgICA8L2JpbmRpbmc+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lm5lc3RlZENvbW1hbmRQcm92aWRlcnMiPgotICAgICAgPG5lc3RlZENvbW1hbmRQcm92aWRlcgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmNvbW1hbmRzLk5lc3RlZENvbW1hbmRQcm92aWRlciI+Ci0gICAgICA8L25lc3RlZENvbW1hbmRQcm92aWRlcj4KLSAgIDwvZXh0ZW5zaW9uPgotPC9wbHVnaW4+Ci0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9BREltYWdlcy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL0FESW1hZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4YjhhNTAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL0FESW1hZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy9BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vL2FyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy93aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy9odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vQ29udHJpYnV0b3JzOgotLy9JQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnBhcnQuQWN0aXZpdHlEaWFncmFtRWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMgotICovCi1wdWJsaWMgY2xhc3MgQURJbWFnZXMgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVMQ0wxNiA9ICJmdWxsL2VsY2wxNi8iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRExDTDE2ID0gImZ1bGwvZGxjbDE2LyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFVE9PTDE2ID0gImZ1bGwvZXRvb2wxNi8iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRFRPT0wxNiA9ICJmdWxsL2R0b29sMTYvIjsgLy8kTk9OLU5MUy0xJAotCQotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19QQVRIX0VESVRPUiA9IEVUT09MMTYgKyAiQURFZGl0b3IuZ2lmIjsgLy8kTk9OLU5MUy0xJAkKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERJU0FCTEVEX0lNR19QQVRIX0VESVRPUiA9IERUT09MMTYgKyAiQURFZGl0b3IuZ2lmIjsgLy8kTk9OLU5MUy0xJAkKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBESVNBQkxFRF9JTUdfREVTQ19FRElUT1IgPSBBY3Rpdml0eURpYWdyYW1FZGl0b3JQbHVnaW4KLQkJCS5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKERJU0FCTEVEX0lNR19QQVRIX0VESVRPUik7CQkKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBJTUdfREVTQ19FRElUT1IgPSBBY3Rpdml0eURpYWdyYW1FZGl0b3JQbHVnaW4KLQkJCS5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKElNR19QQVRIX0VESVRPUik7CQkKLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL0FjdGl2aXR5RGlhZ3JhbVBsdWdpbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL0FjdGl2aXR5RGlhZ3JhbVBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmODVhMTAwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9BY3Rpdml0eURpYWdyYW1QbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS5BYnN0cmFjdFBsdWdpbjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotLyoqCi0gKiBUaGUgYWN0aXZhdG9yIGNsYXNzIGNvbnRyb2xzIHRoZSBwbHVnLWluIGxpZmUgY3ljbGUKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXR5RGlhZ3JhbVBsdWdpbiBleHRlbmRzIEFic3RyYWN0UGx1Z2luIHsKLQotCS8vIFRoZSBwbHVnLWluIElECi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkIjsgLy8kTk9OLU5MUy0xJAotCi0JLy8gVGhlIHNoYXJlZCBpbnN0YW5jZQotCXByaXZhdGUgc3RhdGljIEFjdGl2aXR5RGlhZ3JhbVBsdWdpbiBwbHVnaW47Ci0JCi0JLyoqCi0JICogVGhlIGNvbnN0cnVjdG9yCi0JICovCi0JcHVibGljIEFjdGl2aXR5RGlhZ3JhbVBsdWdpbigpIHsKLQkJcGx1Z2luID0gdGhpczsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luI3N0YXJ0KG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0YXJ0KGNvbnRleHQpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW4jc3RvcChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXBsdWdpbiA9IG51bGw7Ci0JCXN1cGVyLnN0b3AoY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2hhcmVkIGluc3RhbmNlCi0JICoKLQkgKiBAcmV0dXJuIHRoZSBzaGFyZWQgaW5zdGFuY2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEFjdGl2aXR5RGlhZ3JhbVBsdWdpbiBnZXREZWZhdWx0KCkgewotCQlyZXR1cm4gcGx1Z2luOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2NvbW1hbmRzL05lc3RlZENvbW1hbmRQcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2NvbW1hbmRzL05lc3RlZENvbW1hbmRQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZDM4NWUyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9jb21tYW5kcy9OZXN0ZWRDb21tYW5kUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy9BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vL2FyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy93aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy9odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vQ29udHJpYnV0b3JzOgotLy9JQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5jb21tYW5kczsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLkRpYWdyYW1Db3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuYnJpZGdlLkJyaWRnZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnNlcnZpY2VzLkRpYWdyYW1NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JTmVzdGVkQ29tbWFuZFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5JRGlhZ3JhbU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkudXRpbC5UeXBlQ29udmVydGVyLlR5cGVDb252ZXJzaW9uQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5EaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuQWN0aXZpdHlOb2RlOwotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4yCi0gKi8KLXB1YmxpYyBjbGFzcyBOZXN0ZWRDb21tYW5kUHJvdmlkZXIgaW1wbGVtZW50cyBJTmVzdGVkQ29tbWFuZFByb3ZpZGVyIHsKLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklOZXN0ZWRDb21tYW5kUHJvdmlkZXIjY3JlYXRlTmVzdGVkQ29tbWFuZChvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZCkKLQkgKi8KLQlwdWJsaWMgQ29tbWFuZCBjcmVhdGVOZXN0ZWRDb21tYW5kKENvbW1hbmQgY29tbWFuZCkgewotCQlpZihjb21tYW5kIGluc3RhbmNlb2YgVHlwZUNvbnZlcnNpb25Db21tYW5kKSB7Ci0JCQlyZXR1cm4gY3JlYXRlTmVzdGVkQ29tbWFuZEZvclR5cGVDb252ZXJzaW9uKGNvbW1hbmQpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgQ29tbWFuZCBjcmVhdGVOZXN0ZWRDb21tYW5kRm9yVHlwZUNvbnZlcnNpb24oQ29tbWFuZCBjb21tYW5kKSB7Ci0JCS8vIGNoYW5nZSB0eXBlIG9mIGFjdGl2aXR5IG5vZGUgaW4gZGlhZ3JhbQotCQkvLwotCQlDb2xsZWN0aW9uPD8+IHJlc3VsdCA9IGNvbW1hbmQuZ2V0UmVzdWx0KCk7Ci0JCUFjdGl2aXR5IGFjdGl2aXR5ID0gbnVsbDsKLQkJaWYoIXJlc3VsdC5pc0VtcHR5KCkpIHsKLQkJCU9iamVjdCBlID0gcmVzdWx0Lml0ZXJhdG9yKCkubmV4dCgpOwotCQkJaWYoZSBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJYWN0aXZpdHkgPSAoQWN0aXZpdHkpIGU7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJfQotCQlpZihhY3Rpdml0eSAhPSBudWxsKSB7Ci0JCQlQcm9jZXNzIHByb2MgPSBUbmdVdGlsLmdldE93bmluZ1Byb2Nlc3MoYWN0aXZpdHkpOwotCQkJaWYocHJvYyAhPSBudWxsKSB7Ci0JCQkJRGlhZ3JhbU1hbmFnZXIgbWdyID0gRGlhZ3JhbU1hbmFnZXIuZ2V0SW5zdGFuY2UocHJvYywgdGhpcyk7Ci0JCQkJdHJ5IHsKLQkJCQkJU3RyaW5nIG5ld1R5cGUgPSBCcmlkZ2VIZWxwZXIuZ2V0VHlwZShhY3Rpdml0eSk7CQkJCQkKLQkJCQkJTGlzdDxEaWFncmFtPiBkaWFncmFtcyA9IG1nci5nZXREaWFncmFtcyhhY3Rpdml0eS5nZXRTdXBlckFjdGl2aXRpZXMoKSwgSURpYWdyYW1NYW5hZ2VyLkFDVElWSVRZX0RJQUdSQU0pOwotCQkJCQlTZXRUeXBlQ29tbWFuZCBjbWQgPSBuZXcgU2V0VHlwZUNvbW1hbmQoKTsKLQkJCQkJZm9yIChEaWFncmFtIGRpYWdyYW0gOiBkaWFncmFtcykgewotCQkJCQkJb3JnLmVjbGlwc2UudW1sMi51bWwuQWN0aXZpdHkgdW1sQWN0ID0gKG9yZy5lY2xpcHNlLnVtbDIudW1sLkFjdGl2aXR5KSBkaWFncmFtLmdldEVsZW1lbnQoKTsKLQkJCQkJCWZvciAoQWN0aXZpdHlOb2RlIG5vZGUgOiB1bWxBY3QuZ2V0Tm9kZXMoKSkgewotCQkJCQkJCVN0cmluZyB1cmlTdHIgPSBCcmlkZ2VIZWxwZXIuZ2V0RUFubm90YXRpb25EZXRhaWwobm9kZSwgQnJpZGdlSGVscGVyLlVNQV9VUkkpOwotCQkJCQkJCWlmKHVyaVN0ciAhPSBudWxsKSB7Ci0JCQkJCQkJCVVSSSB1cmkgPSBVUkkuY3JlYXRlVVJJKHVyaVN0cik7Ci0JCQkJCQkJCVN0cmluZyBndWlkID0gdXJpLmZyYWdtZW50KCk7Ci0JCQkJCQkJCWlmKGFjdGl2aXR5LmdldEd1aWQoKS5lcXVhbHMoZ3VpZCkpIHsKLQkJCQkJCQkJCVZpZXcgdmlldyA9IEJyaWRnZUhlbHBlci5nZXRWaWV3KGRpYWdyYW0sIG5vZGUpOwotCQkJCQkJCQkJY21kLnByZXBhcmUodmlldywgbm9kZSwgbmV3VHlwZSk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJaWYoY21kLmNhbkV4ZWN1dGUoKSkgewotCQkJCQkJcmV0dXJuIGNtZDsKLQkJCQkJfQotCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQlEaWFncmFtQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkJfQotCQkJCWZpbmFsbHkgewotCQkJCQltZ3IucmVtb3ZlQ29uc3VtZXIodGhpcyk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBDb21tYW5kIGNyZWF0ZVJlbGF0ZWRPYmplY3RzKENvbGxlY3Rpb24gY3JlYXRlZEVsZW1lbnRzLAotCQkJQ29tbWFuZCBjcmVhdGVDb21tYW5kKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBDb21tYW5kIHJlbW92ZVJlbGF0ZWRPYmplY3RzKENvbGxlY3Rpb24gZGVsZXRlZEVsZW1lbnRzLAotCQkJQ29tbWFuZCBkZWxldGVDb21tYW5kKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2NvbW1hbmRzL1NldFR5cGVDb21tYW5kLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvY29tbWFuZHMvU2V0VHlwZUNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWI0Y2U0ZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvY29tbWFuZHMvU2V0VHlwZUNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5jb21tYW5kczsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLldyYXBwZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVNb2RlbEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuQWN0aXZpdHlQYXJhbWV0ZXJOb2RlMkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuQWN0aXZpdHlQYXJhbWV0ZXJOb2RlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5BY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lMkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTJFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGUzRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZTJFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVOYW1lM0VkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLkRpYWdyYW1Db3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuYnJpZGdlLkJyaWRnZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC51dGlsLlR4VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSVJlc291cmNlQXdhcmVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjIKLSAqLwotcHVibGljIGNsYXNzIFNldFR5cGVDb21tYW5kIGV4dGVuZHMgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkFic3RyYWN0Q29tbWFuZCBpbXBsZW1lbnRzCi0JCUlSZXNvdXJjZUF3YXJlQ29tbWFuZCB7Ci0JcHJpdmF0ZSBNYXA8RU1vZGVsRWxlbWVudCwgU3RyaW5nPiBlbGVtZW50VG9OZXdUeXBlTWFwID0gbmV3IEhhc2hNYXA8RU1vZGVsRWxlbWVudCwgU3RyaW5nPigpOwotCXByaXZhdGUgTWFwPEVNb2RlbEVsZW1lbnQsIFN0cmluZz4gZWxlbWVudFRvT2xkVHlwZU1hcDsKLQlwcml2YXRlIE1hcDxWaWV3LCBTdHJpbmc+IHZpZXdUb05ld1R5cGVNYXAgPSBuZXcgSGFzaE1hcDxWaWV3LCBTdHJpbmc+KCk7Ci0JcHJpdmF0ZSBNYXA8VmlldywgU3RyaW5nPiB2aWV3VG9PbGRUeXBlTWFwOwotCi0JcHVibGljIENvbGxlY3Rpb248UmVzb3VyY2U+IGdldE1vZGlmaWVkUmVzb3VyY2VzKCkgewotCQlIYXNoU2V0PFJlc291cmNlPiBtb2RpZmllZFJlc291cmNlcyA9IG5ldyBIYXNoU2V0PFJlc291cmNlPigpOwotCQlmb3IgKEVNb2RlbEVsZW1lbnQgZSA6IGVsZW1lbnRUb05ld1R5cGVNYXAua2V5U2V0KCkpIHsKLQkJCVJlc291cmNlIHJlc291cmNlID0gZS5lUmVzb3VyY2UoKTsKLQkJCWlmKHJlc291cmNlICE9IG51bGwpIHsKLQkJCQltb2RpZmllZFJlc291cmNlcy5hZGQocmVzb3VyY2UpOwotCQkJfQotCQl9Ci0JCXJldHVybiBtb2RpZmllZFJlc291cmNlczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQlpZihlbGVtZW50VG9PbGRUeXBlTWFwID09IG51bGwpIHsKLQkJCWVsZW1lbnRUb09sZFR5cGVNYXAgPSBuZXcgSGFzaE1hcDxFTW9kZWxFbGVtZW50LCBTdHJpbmc+KCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQllbGVtZW50VG9PbGRUeXBlTWFwLmNsZWFyKCk7Ci0JCX0KLQkJZm9yIChNYXAuRW50cnk8RU1vZGVsRWxlbWVudCwgU3RyaW5nPiBlbnRyeSA6IGVsZW1lbnRUb05ld1R5cGVNYXAuZW50cnlTZXQoKSkgewotCQkJZmluYWwgRU1vZGVsRWxlbWVudCBlID0gZW50cnkuZ2V0S2V5KCk7Ci0JCQlmaW5hbCBTdHJpbmcgdHlwZSA9IGVudHJ5LmdldFZhbHVlKCk7Ci0JCQl0cnkgewotCQkJCVN0cmluZyBvbGRUeXBlID0gQnJpZGdlSGVscGVyLmdldEVBbm5vdGF0aW9uRGV0YWlsKGUsIEJyaWRnZUhlbHBlci5VTUFfVFlQRSk7Ci0JCQkJVHhVdGlsLnJ1bkluVHJhbnNhY3Rpb24oZSwgbmV3IFJ1bm5hYmxlKCkgewotCi0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCUJyaWRnZUhlbHBlci5hZGRFQW5ub3RhdGlvblR5cGUoZSwgdHlwZSk7Ci0JCQkJCX0KLQkJCQkJCi0JCQkJfSk7Ci0JCQkJZWxlbWVudFRvT2xkVHlwZU1hcC5wdXQoZSwgb2xkVHlwZSk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCQlEaWFncmFtQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZXgpOwotCQkJCXRocm93IG5ldyBXcmFwcGVkRXhjZXB0aW9uKGV4KTsKLQkJCX0KLQkJfQotCQlpZighdmlld1RvTmV3VHlwZU1hcC5pc0VtcHR5KCkpIHsKLQkJCWlmKHZpZXdUb09sZFR5cGVNYXAgPT0gbnVsbCkgewotCQkJCXZpZXdUb09sZFR5cGVNYXAgPSBuZXcgSGFzaE1hcDxWaWV3LCBTdHJpbmc+KCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQl2aWV3VG9PbGRUeXBlTWFwLmNsZWFyKCk7Ci0JCQl9Ci0JCQlmb3IgKE1hcC5FbnRyeTxWaWV3LCBTdHJpbmc+IGVudHJ5IDogdmlld1RvTmV3VHlwZU1hcC5lbnRyeVNldCgpKSB7Ci0JCQkJZmluYWwgVmlldyB2aWV3ID0gZW50cnkuZ2V0S2V5KCk7Ci0JCQkJZmluYWwgU3RyaW5nIG5ld1R5cGUgPSBlbnRyeS5nZXRWYWx1ZSgpOwotCQkJCWZpbmFsIFN0cmluZyBvbGRUeXBlID0gdmlldy5nZXRUeXBlKCk7Ci0JCQkJdHJ5IHsKLQkJCQkJVHhVdGlsLnJ1bkluVHJhbnNhY3Rpb24odmlldywgbmV3IFJ1bm5hYmxlKCkgewotCi0JCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJU3RyaW5nIG5ld05hbWVUeXBlID0gU3RyaW5nLnZhbHVlT2YoZ2V0Vmlld05hbWVUeXBlKEludGVnZXIucGFyc2VJbnQobmV3VHlwZSkpKTsKLQkJCQkJCQlTdHJpbmcgb2xkTmFtZVR5cGUgPSBTdHJpbmcudmFsdWVPZihnZXRWaWV3TmFtZVR5cGUoSW50ZWdlci5wYXJzZUludChvbGRUeXBlKSkpOwotCQkJCQkJCXZpZXcuc2V0VHlwZShuZXdUeXBlKTsKLQkJCQkJCQkvLyBzZXQgbmV3IHR5cGUgZm9yIG5vZGUgbmFtZXMKLQkJCQkJCQkvLwotCQkJCQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSB2aWV3LmdldENoaWxkcmVuKCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IKLQkJCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJCVZpZXcgY2hpbGQgPSAoVmlldykgaXRlcmF0b3IubmV4dCgpOwotCQkJCQkJCQlpZihjaGlsZC5nZXRUeXBlKCkuZXF1YWxzKG9sZE5hbWVUeXBlKSkgewotCQkJCQkJCQkJY2hpbGQuc2V0VHlwZShuZXdOYW1lVHlwZSk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQkKLQkJCQkJfSk7Ci0JCQkJCXZpZXdUb09sZFR5cGVNYXAucHV0KHZpZXcsIG9sZFR5cGUpOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCURpYWdyYW1Db3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCQkJdGhyb3cgbmV3IFdyYXBwZWRFeGNlcHRpb24oZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHVuZG8oKSB7Ci0JCWlmIChlbGVtZW50VG9PbGRUeXBlTWFwICE9IG51bGwgJiYgIWVsZW1lbnRUb09sZFR5cGVNYXAuaXNFbXB0eSgpKSB7Ci0JCQlmb3IgKE1hcC5FbnRyeTxFTW9kZWxFbGVtZW50LCBTdHJpbmc+IGVudHJ5IDogZWxlbWVudFRvT2xkVHlwZU1hcAotCQkJCQkuZW50cnlTZXQoKSkgewotCQkJCWZpbmFsIEVNb2RlbEVsZW1lbnQgZSA9IGVudHJ5LmdldEtleSgpOwotCQkJCWZpbmFsIFN0cmluZyB0eXBlID0gZW50cnkuZ2V0VmFsdWUoKTsKLQkJCQl0cnkgewotCQkJCQlUeFV0aWwucnVuSW5UcmFuc2FjdGlvbihlLCBuZXcgUnVubmFibGUoKSB7Ci0KLQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQlCcmlkZ2VIZWxwZXIuYWRkRUFubm90YXRpb25UeXBlKGUsIHR5cGUpOwotCQkJCQkJfQotCQkJCQkJCi0JCQkJCX0pOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJCQlEaWFncmFtQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZXgpOwotCQkJCQl0aHJvdyBuZXcgV3JhcHBlZEV4Y2VwdGlvbihleCk7Ci0JCQkJfQotCQkJfQotCQkJZWxlbWVudFRvT2xkVHlwZU1hcC5jbGVhcigpOwotCQl9Ci0JCWlmKHZpZXdUb09sZFR5cGVNYXAgIT0gbnVsbCAmJiAhdmlld1RvT2xkVHlwZU1hcC5pc0VtcHR5KCkpIHsKLQkJCWZvciAoTWFwLkVudHJ5PFZpZXcsIFN0cmluZz4gZW50cnkgOiB2aWV3VG9PbGRUeXBlTWFwLmVudHJ5U2V0KCkpIHsKLQkJCQlmaW5hbCBWaWV3IHZpZXcgPSBlbnRyeS5nZXRLZXkoKTsKLQkJCQlmaW5hbCBTdHJpbmcgb2xkVHlwZSA9IGVudHJ5LmdldFZhbHVlKCk7Ci0JCQkJdHJ5IHsKLQkJCQkJVHhVdGlsLnJ1bkluVHJhbnNhY3Rpb24odmlldywgbmV3IFJ1bm5hYmxlKCkgewotCi0JCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJU3RyaW5nIG5ld05hbWVUeXBlID0gU3RyaW5nLnZhbHVlT2YoZ2V0Vmlld05hbWVUeXBlKEludGVnZXIucGFyc2VJbnQodmlldy5nZXRUeXBlKCkpKSk7Ci0JCQkJCQkJU3RyaW5nIG9sZE5hbWVUeXBlID0gU3RyaW5nLnZhbHVlT2YoZ2V0Vmlld05hbWVUeXBlKEludGVnZXIucGFyc2VJbnQob2xkVHlwZSkpKTsKLQkJCQkJCQl2aWV3LnNldFR5cGUob2xkVHlwZSk7Ci0JCQkJCQkJLy8gcmVzdG9yZSBvbGQgdHlwZSBmb3Igbm9kZSBuYW1lcwotCQkJCQkJCS8vCi0JCQkJCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IHZpZXcuZ2V0Q2hpbGRyZW4oKS5pdGVyYXRvcigpOyBpdGVyYXRvcgotCQkJCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCQkJVmlldyBjaGlsZCA9IChWaWV3KSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCQkJCWlmKGNoaWxkLmdldFR5cGUoKS5lcXVhbHMobmV3TmFtZVR5cGUpKSB7Ci0JCQkJCQkJCQljaGlsZC5zZXRUeXBlKG9sZE5hbWVUeXBlKTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCQotCQkJCQl9KTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQlEaWFncmFtQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkJCXRocm93IG5ldyBXcmFwcGVkRXhjZXB0aW9uKGUpOwotCQkJCX0KLQkJCX0KLQkJCXZpZXdUb09sZFR5cGVNYXAuY2xlYXIoKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHJlZG8oKSB7Ci0JCWV4ZWN1dGUoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIGJvb2xlYW4gcHJlcGFyZSgpIHsKLQkJcmV0dXJuICFlbGVtZW50VG9OZXdUeXBlTWFwLmlzRW1wdHkoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBwcmVwYXJlKFZpZXcgdmlldywgRU1vZGVsRWxlbWVudCBlLCBTdHJpbmcgdHlwZSkgewotCQllbGVtZW50VG9OZXdUeXBlTWFwLnB1dChlLCB0eXBlKTsKLQkJaW50IHZpZXdUeXBlID0gZ2V0Vmlld1R5cGUodHlwZSk7Ci0JCWlmKHZpZXdUeXBlICE9IC0xKSB7Ci0JCQl2aWV3VG9OZXdUeXBlTWFwIC5wdXQodmlldywgU3RyaW5nLnZhbHVlT2Yodmlld1R5cGUpKTsKLQkJfQotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlpZihlbGVtZW50VG9OZXdUeXBlTWFwICE9IG51bGwpIHsKLQkJCWVsZW1lbnRUb05ld1R5cGVNYXAuY2xlYXIoKTsKLQkJfQotCQlpZihlbGVtZW50VG9PbGRUeXBlTWFwICE9IG51bGwpIHsKLQkJCWVsZW1lbnRUb09sZFR5cGVNYXAuY2xlYXIoKTsKLQkJfQotCQlpZih2aWV3VG9OZXdUeXBlTWFwICE9IG51bGwpIHsKLQkJCXZpZXdUb05ld1R5cGVNYXAuY2xlYXIoKTsKLQkJfQotCQlpZih2aWV3VG9PbGRUeXBlTWFwICE9IG51bGwpIHsKLQkJCXZpZXdUb09sZFR5cGVNYXAuY2xlYXIoKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGludCBnZXRWaWV3VHlwZShTdHJpbmcgZWxlbWVudFR5cGUpIHsKLQkJaWYoQnJpZGdlSGVscGVyLlVNQV9BQ1RJVklUWS5lcXVhbHMoZWxlbWVudFR5cGUpKSB7Ci0JCQlyZXR1cm4gU3RydWN0dXJlZEFjdGl2aXR5Tm9kZUVkaXRQYXJ0LlZJU1VBTF9JRDsKLQkJfQotCQllbHNlIGlmKEJyaWRnZUhlbHBlci5VTUFfUEhBU0UuZXF1YWxzKGVsZW1lbnRUeXBlKSkgewotCQkJcmV0dXJuIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUyRWRpdFBhcnQuVklTVUFMX0lEOwotCQl9Ci0JCWVsc2UgaWYoQnJpZGdlSGVscGVyLlVNQV9JVEVSQVRJT04uZXF1YWxzKGVsZW1lbnRUeXBlKSkgewotCQkJcmV0dXJuIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUzRWRpdFBhcnQuVklTVUFMX0lEOwotCQl9Ci0JCWVsc2UgaWYoQnJpZGdlSGVscGVyLlVNQV9NSUxFU1RPTkUuZXF1YWxzKGVsZW1lbnRUeXBlKSkgewotCQkJcmV0dXJuIEFjdGl2aXR5UGFyYW1ldGVyTm9kZTJFZGl0UGFydC5WSVNVQUxfSUQ7CQkJCi0JCX0KLQkJZWxzZSBpZihCcmlkZ2VIZWxwZXIuVU1BX1RBU0tfREVTQ1JJUFRPUi5lcXVhbHMoZWxlbWVudFR5cGUpKSB7Ci0JCQlyZXR1cm4gQWN0aXZpdHlQYXJhbWV0ZXJOb2RlRWRpdFBhcnQuVklTVUFMX0lEOwotCQl9Ci0JCXJldHVybiAtMTsKLQl9CQotCQotCXB1YmxpYyBzdGF0aWMgaW50IGdldFZpZXdOYW1lVHlwZShpbnQgdmlld1R5cGUpIHsKLQkJc3dpdGNoKHZpZXdUeXBlKSB7Ci0JCWNhc2UgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZUVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCXJldHVybiBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZUVkaXRQYXJ0LlZJU1VBTF9JRDsKLQkJY2FzZSBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlMkVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCXJldHVybiBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZTJFZGl0UGFydC5WSVNVQUxfSUQ7Ci0JCWNhc2UgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTNFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQlyZXR1cm4gU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWUzRWRpdFBhcnQuVklTVUFMX0lEOwotCQljYXNlIEFjdGl2aXR5UGFyYW1ldGVyTm9kZUVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCXJldHVybiBBY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lRWRpdFBhcnQuVklTVUFMX0lEOwkJCQotCQljYXNlIEFjdGl2aXR5UGFyYW1ldGVyTm9kZTJFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQlyZXR1cm4gQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZTJFZGl0UGFydC5WSVNVQUxfSUQ7Ci0JCX0KLQkJcmV0dXJuIC0xOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9jdXN0b20vY29tbWFuZHMvQWN0aXZpdHlQYXJ0aXRpb25EZXN0cm95Q29tbWFuZC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2N1c3RvbS9jb21tYW5kcy9BY3Rpdml0eVBhcnRpdGlvbkRlc3Ryb3lDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2YTRiOGEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2N1c3RvbS9jb21tYW5kcy9BY3Rpdml0eVBhcnRpdGlvbkRlc3Ryb3lDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8qKgotICogCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuY3VzdG9tLmNvbW1hbmRzOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmUuU2V0dGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb3JlLnV0aWwuQ3Jvc3NSZWZlcmVuY2VBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuY29tbWFuZHMuRGVzdHJveUVsZW1lbnRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuRGVzdHJveUVsZW1lbnRSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuQWN0aXZpdHlFZGdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkFjdGl2aXR5Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eVBhcnRpdGlvbjsKLQotLyoqCi0gKiBEZXN0cm95Q29tbWFuZCB0byBkZXN0cm95IEFjdGl2aXR5UGFydGl0aW9uIGFuZCBhbGwgdGhlIGVsZW1lbnRzIGluc2lkZSB0aGUgcGFydGl0aW9ucy4KLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICoKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXR5UGFydGl0aW9uRGVzdHJveUNvbW1hbmQgZXh0ZW5kcyBEZXN0cm95RWxlbWVudENvbW1hbmQgewotCi0JCi0JcHJpdmF0ZSBFZGl0UGFydCBob3N0OwotCi0JLyoqCi0JICogQHBhcmFtIHJlcXVlc3QKLQkgKi8KLQlwdWJsaWMgQWN0aXZpdHlQYXJ0aXRpb25EZXN0cm95Q29tbWFuZChEZXN0cm95RWxlbWVudFJlcXVlc3QgcmVxdWVzdCwgRWRpdFBhcnQgaG9zdCkgewotCQlzdXBlcihyZXF1ZXN0KTsKLQkJdGhpcy5ob3N0ID0gaG9zdDsKLQl9Ci0JCi0JcHJvdGVjdGVkIEVPYmplY3QgZ2V0RWxlbWVudFRvRGVzdHJveSgpIHsKLQkJVmlldyB2aWV3ID0gKFZpZXcpIGhvc3QuZ2V0TW9kZWwoKTsKLQkJRUFubm90YXRpb24gYW5ub3RhdGlvbiA9IHZpZXcuZ2V0RUFubm90YXRpb24oIlNob3J0Y3V0Iik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKGFubm90YXRpb24gIT0gbnVsbCkgewotCQkJcmV0dXJuIHZpZXc7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldEVsZW1lbnRUb0Rlc3Ryb3koKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd25JbmNvbWluZ1JlZmVyZW5jZXMoRU9iamVjdCBkZXN0cnVjdGVlKSB7Ci0JCQotLy8JCW1vdmVDaGlsZHJlbnNUb1BhcmVudChkZXN0cnVjdGVlKTsKLQkJCi0JCUNyb3NzUmVmZXJlbmNlQWRhcHRlciBjcm9zc1JlZmVyZW5jZXIgPSBDcm9zc1JlZmVyZW5jZUFkYXB0ZXIKLQkJCQkuZ2V0RXhpc3RpbmdDcm9zc1JlZmVyZW5jZUFkYXB0ZXIoZGVzdHJ1Y3RlZSk7Ci0JCWlmIChjcm9zc1JlZmVyZW5jZXIgIT0gbnVsbCkgewotCQkJQ29sbGVjdGlvbiBpbnZlcnNlUmVmZXJlbmNlcyA9IGNyb3NzUmVmZXJlbmNlcgotCQkJCQkuZ2V0SW52ZXJzZVJlZmVyZW5jZXMoZGVzdHJ1Y3RlZSk7Ci0JCQlpZiAoaW52ZXJzZVJlZmVyZW5jZXMgIT0gbnVsbCkgewotCQkJCWludCBzaXplID0gaW52ZXJzZVJlZmVyZW5jZXMuc2l6ZSgpOwotCQkJCWlmIChzaXplID4gMCkgewotCQkJCQlTZXR0aW5nIHNldHRpbmc7Ci0JCQkJCUVSZWZlcmVuY2UgZVJlZjsKLQkJCQkJU2V0dGluZ1tdIHNldHRpbmdzID0gKFNldHRpbmdbXSkgaW52ZXJzZVJlZmVyZW5jZXMKLQkJCQkJCQkudG9BcnJheShuZXcgU2V0dGluZ1tzaXplXSk7Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgKytpKSB7Ci0JCQkJCQlzZXR0aW5nID0gc2V0dGluZ3NbaV07Ci0JCQkJCQllUmVmID0gKEVSZWZlcmVuY2UpIHNldHRpbmcKLQkJCQkJCQkJLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZSgpOwotCQkJCQkJaWYgKGVSZWYuaXNDaGFuZ2VhYmxlKCkKLQkJCQkJCQkJJiYgKGVSZWYuaXNEZXJpdmVkKCkgPT0gZmFsc2UpCi0JCQkJCQkJCSYmIChlUmVmLmlzQ29udGFpbm1lbnQoKSA9PSBmYWxzZSkKLQkJCQkJCQkJJiYgKGVSZWYuaXNDb250YWluZXIoKSA9PSBmYWxzZSkpIHsKLS8vCQkJCQkJCUVjb3JlVXRpbC5yZW1vdmUoc2V0dGluZy5nZXRFT2JqZWN0KCkpOwotCQkJCQkJCUVjb3JlVXRpbC5yZW1vdmUoc2V0dGluZy5nZXRFT2JqZWN0KCksIGVSZWYsCi0JCQkJCQkJCQlkZXN0cnVjdGVlKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBtb3ZlQ2hpbGRyZW5zVG9QYXJlbnQoRU9iamVjdCBkZXN0cnVjdGVlKSB7Ci0JCWlmKGRlc3RydWN0ZWUgaW5zdGFuY2VvZiBBY3Rpdml0eVBhcnRpdGlvbil7Ci0JCQlBY3Rpdml0eVBhcnRpdGlvbiBwYXJ0aXRpb24gPSAoQWN0aXZpdHlQYXJ0aXRpb24pZGVzdHJ1Y3RlZTsKLQkJCUFjdGl2aXR5IGFjdGl2aXR5ID0gcGFydGl0aW9uLmdldEluQWN0aXZpdHkoKTsKLQkJCUxpc3Qgbm9kZXMgPSBwYXJ0aXRpb24uZ2V0Tm9kZXMoKTsKLQkJCQotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gbm9kZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJQWN0aXZpdHlOb2RlIG5vZGUgPSAoQWN0aXZpdHlOb2RlKSBpdGVyLm5leHQoKTsKLQkJCQlhY3Rpdml0eS5nZXROb2RlcygpLmFkZChub2RlKTsKLQkJCQlub2RlLmdldEluUGFydGl0aW9ucygpLnJlbW92ZShwYXJ0aXRpb24pOwotCQkJCS8vaXRlci5yZW1vdmUoKTsKLQkJCX0KLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHBhcnRpdGlvbi5nZXRFZGdlcygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCUFjdGl2aXR5RWRnZSBlZGdlID0gKEFjdGl2aXR5RWRnZSkgaXRlci5uZXh0KCk7Ci0JCQkJYWN0aXZpdHkuZ2V0RWRnZXMoKS5hZGQoZWRnZSk7Ci0JCQkJZWRnZS5nZXRJblBhcnRpdGlvbnMoKS5yZW1vdmUocGFydGl0aW9uKTsKLQkJCQkvL2l0ZXIucmVtb3ZlKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9jdXN0b20vY29tbWFuZHMvQ3JlYXRlQWN0aXZpdHlOb2RlSW5BY3Rpdml0eVBhcnRpdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2N1c3RvbS9jb21tYW5kcy9DcmVhdGVBY3Rpdml0eU5vZGVJbkFjdGl2aXR5UGFydGl0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2YzBiNDguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2N1c3RvbS9jb21tYW5kcy9DcmVhdGVBY3Rpdml0eU5vZGVJbkFjdGl2aXR5UGFydGl0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8qKgotICogCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuY3VzdG9tLmNvbW1hbmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5wcm92aWRlcnMuVU1MRWxlbWVudFR5cGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuYnJpZGdlLkJyaWRnZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29yZS51dGlsLlBhY2thZ2VVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuSUVsZW1lbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuY29tbWFuZHMuQ3JlYXRlRWxlbWVudENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5DcmVhdGVFbGVtZW50UmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkFjdGl2aXR5Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eVBhcmFtZXRlck5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuQWN0aXZpdHlQYXJ0aXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5VTUxQYWNrYWdlOwotCi0vKioKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICoKLSAqLwotcHVibGljIGNsYXNzIENyZWF0ZUFjdGl2aXR5Tm9kZUluQWN0aXZpdHlQYXJ0aXRpb24gZXh0ZW5kcyBDcmVhdGVFbGVtZW50Q29tbWFuZCB7Ci0KLQkKLQotCS8qKgotCSAqIEBwYXJhbSByZXF1ZXN0Ci0JICovCi0JcHVibGljIENyZWF0ZUFjdGl2aXR5Tm9kZUluQWN0aXZpdHlQYXJ0aXRpb24oQ3JlYXRlRWxlbWVudFJlcXVlc3QgcmVxdWVzdCkgewotCQlzdXBlcihyZXF1ZXN0KTsKLQl9Ci0JCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBnZXRFQ2xhc3NUb0VkaXQoKSB7Ci0JCXJldHVybiBVTUxQYWNrYWdlLmVJTlNUQU5DRS5nZXRBY3Rpdml0eSgpOwotCX07Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRU9iamVjdCBnZXRFbGVtZW50VG9FZGl0KCkgewotCQlFT2JqZWN0IGNvbnRhaW5lciA9ICgoQ3JlYXRlRWxlbWVudFJlcXVlc3QpIGdldFJlcXVlc3QoKSkKLQkJCQkuZ2V0Q29udGFpbmVyKCk7Ci0JCWlmIChjb250YWluZXIgaW5zdGFuY2VvZiBWaWV3KSB7Ci0JCQljb250YWluZXIgPSAoKFZpZXcpIGNvbnRhaW5lcikuZ2V0RWxlbWVudCgpOwotCQl9Ci0JCWlmKGNvbnRhaW5lciBpbnN0YW5jZW9mIEFjdGl2aXR5UGFydGl0aW9uKXsKLQkJCWNvbnRhaW5lciA9IGNvbnRhaW5lci5lQ29udGFpbmVyKCk7Ci0JCX0KLQkJcmV0dXJuIGNvbnRhaW5lcjsKLQl9Ci0JcHVibGljIGJvb2xlYW4gY2FuRXhlY3V0ZSgpIHsKLQkJcmV0dXJuIHN1cGVyLmNhbkV4ZWN1dGUoKTsKLQl9Ci0JCi0JLyoqCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvbW1hbmRzLmNvcmUuY29tbWFuZC5BYnN0cmFjdFRyYW5zYWN0aW9uYWxDb21tYW5kI2RvRXhlY3V0ZShvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvciwgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGUpCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJvdGVjdGVkIElTdGF0dXMgZG9FeGVjdXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJSVN0YXR1cyBzdGF0dXMgPSBudWxsOwotCQlzdGF0dXMgPSBzdXBlci5kb0V4ZWN1dGUobW9uaXRvciwgaW5mbyk7Ci0JCUVPYmplY3QgbmV3RWxlbWVudCA9IGdldE5ld0VsZW1lbnQoKTsKLQkJCi0JCWlmIChuZXdFbGVtZW50IGluc3RhbmNlb2YgQWN0aXZpdHlOb2RlKSAKLQkJewotCQkJRU9iamVjdCBvYmogPSBnZXRPcmlnaW5hbENvbnRhaW5lcigpOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIEFjdGl2aXR5UGFydGl0aW9uKSB7Ci0JCQkJLy8gc2V0IGlucGFydGl0aW9uIAotCQkJCSgoQWN0aXZpdHlOb2RlKSBuZXdFbGVtZW50KS5nZXRJblBhcnRpdGlvbnMoKS5hZGQoKEFjdGl2aXR5UGFydGl0aW9uKSBvYmopOwotCQkJfQotCQl9Ci0JCXJldHVybiBzdGF0dXM7Ci0JfQotCQotCQotCi0JLyoqCi0JICogQGN1c3RvbQotCSAqLwotCXByaXZhdGUgRU9iamVjdCBnZXRPcmlnaW5hbENvbnRhaW5lcigpCi0JewotCQlyZXR1cm4gKChDcmVhdGVFbGVtZW50UmVxdWVzdCkgZ2V0UmVxdWVzdCgpKS5nZXRDb250YWluZXIoKTsKLQl9Ci0JCi0JLyoqCi0JICogR2V0cyB0aGUgY29udGFpbm1lbnQgZmVhdHVyZSBmb3IgdGhlIG5ldyBlbGVtZW50LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGNvbnRhaW5tZW50IGZlYXR1cmUKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRVJlZmVyZW5jZSBnZXRDb250YWlubWVudEZlYXR1cmUoKSB7Ci0KLQkJLyoqCi0JCSAqIFRoZSBjb250YWlubWVudCBmZWF0dXJlIGluIHdoaWNoIHRoZSBuZXcgZWxlbWVudCB3aWxsIGJlIGNyZWF0ZWQuCi0JCSAqLwotCQlFUmVmZXJlbmNlIGNvbnRhaW5tZW50RmVhdHVyZT1udWxsOwotCQlpZiAoY29udGFpbm1lbnRGZWF0dXJlID09IG51bGwpIHsKLQkJCUVDbGFzcyBjbGFzc1RvRWRpdCA9IGdldEVDbGFzc1RvRWRpdCgpOwotCi0JCQlpZiAoY2xhc3NUb0VkaXQgIT0gbnVsbCkgewotCQkJCUlFbGVtZW50VHlwZSB0eXBlID0gZ2V0RWxlbWVudFR5cGUoKTsKLQotCQkJCWlmICh0eXBlICE9IG51bGwgJiYgdHlwZS5nZXRFQ2xhc3MoKSAhPSBudWxsKSB7Ci0JCQkJCWNvbnRhaW5tZW50RmVhdHVyZSA9IFBhY2thZ2VVdGlsLmZpbmRGZWF0dXJlKGNsYXNzVG9FZGl0LAotCQkJCQkJCXR5cGUuZ2V0RUNsYXNzKCkpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiBjb250YWlubWVudEZlYXR1cmU7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFT2JqZWN0IGRvRGVmYXVsdEVsZW1lbnRDcmVhdGlvbigpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlFT2JqZWN0IG5ld0VsZW1lbnQgPSBzdXBlci5kb0RlZmF1bHRFbGVtZW50Q3JlYXRpb24oKTsKLQkJaWYobmV3RWxlbWVudCBpbnN0YW5jZW9mIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUKLQkJCQl8fCBuZXdFbGVtZW50IGluc3RhbmNlb2YgQWN0aXZpdHlQYXJhbWV0ZXJOb2RlKXsKLQkJCWlmIChuZXdFbGVtZW50ICE9IG51bGwpIHsKLQkJCQlCcmlkZ2VIZWxwZXIuc2V0RGVmYXVsdE5hbWUoKEFjdGl2aXR5Tm9kZSluZXdFbGVtZW50KTsKLQkJCX0KLQkJfQotCQlDcmVhdGVFbGVtZW50UmVxdWVzdCByZXF1ZXN0ID0gZ2V0Q3JlYXRlUmVxdWVzdCgpOwotCQkKLQkJaWYoVU1MRWxlbWVudFR5cGVzLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVfMTAwNyA9PSByZXF1ZXN0LmdldEVsZW1lbnRUeXBlKCkpewotCQkJaWYgKG5ld0VsZW1lbnQgIT0gbnVsbCkgewotCQkJCVVNTEVsZW1lbnRUeXBlcy5Jbml0aWFsaXplcnMuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZV8xMDA3Ci0JCQkJCQkuaW5pdChuZXdFbGVtZW50KTsKLQkJCX0KLQkJfWVsc2UgaWYoVU1MRWxlbWVudFR5cGVzLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVfMTAxMCA9PSByZXF1ZXN0Ci0JCQkJCQkuZ2V0RWxlbWVudFR5cGUoKSl7Ci0JCQlpZiAobmV3RWxlbWVudCAhPSBudWxsKSB7Ci0JCQkJVU1MRWxlbWVudFR5cGVzLkluaXRpYWxpemVycy5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlXzEwMTAKLQkJCQkJCS5pbml0KG5ld0VsZW1lbnQpOwotCQkJfQotCQl9ZWxzZSBpZihVTUxFbGVtZW50VHlwZXMuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZV8xMDExID09IHJlcXVlc3QKLQkJCQkJCS5nZXRFbGVtZW50VHlwZSgpKXsKLQkJCWlmIChuZXdFbGVtZW50ICE9IG51bGwpIHsKLQkJCQlVTUxFbGVtZW50VHlwZXMuSW5pdGlhbGl6ZXJzLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVfMTAxMQotCQkJCQkJLmluaXQobmV3RWxlbWVudCk7Ci0JCQl9Ci0JCX1lbHNlIGlmKFVNTEVsZW1lbnRUeXBlcy5BY3Rpdml0eVBhcmFtZXRlck5vZGVfMTAwOSA9PSByZXF1ZXN0Ci0JCQkJCQkuZ2V0RWxlbWVudFR5cGUoKSl7Ci0JCQlpZiAobmV3RWxlbWVudCAhPSBudWxsKSB7Ci0JCQkJVU1MRWxlbWVudFR5cGVzLkluaXRpYWxpemVycy5BY3Rpdml0eVBhcmFtZXRlck5vZGVfMTAwOQotCQkJCQkJLmluaXQobmV3RWxlbWVudCk7Ci0JCQl9Ci0JCX1lbHNlIGlmKFVNTEVsZW1lbnRUeXBlcy5BY3Rpdml0eVBhcmFtZXRlck5vZGVfMTAxMiA9PSByZXF1ZXN0Ci0JCQkJCQkuZ2V0RWxlbWVudFR5cGUoKSl7Ci0JCQlpZiAobmV3RWxlbWVudCAhPSBudWxsKSB7Ci0JCQkJVU1MRWxlbWVudFR5cGVzLkluaXRpYWxpemVycy5BY3Rpdml0eVBhcmFtZXRlck5vZGVfMTAxMgotCQkJCQkJLmluaXQobmV3RWxlbWVudCk7Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiBuZXdFbGVtZW50OwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9jdXN0b20vY29tbWFuZHMvQ3JlYXRlSW5jb21pbmdDb250cm9sRmxvd0NvbW1hbmQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9jdXN0b20vY29tbWFuZHMvQ3JlYXRlSW5jb21pbmdDb250cm9sRmxvd0NvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2YxYjVjOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvY3VzdG9tL2NvbW1hbmRzL0NyZWF0ZUluY29taW5nQ29udHJvbEZsb3dDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLyoqCi0gKiAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5jdXN0b20uY29tbWFuZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuY29tbWFuZHMuQ3JlYXRlUmVsYXRpb25zaGlwQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkNyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuQWN0aXZpdHlOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkNvbnRyb2xGbG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLlVNTFBhY2thZ2U7Ci0KLS8qKgotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKgotICovCi1wdWJsaWMgY2xhc3MgQ3JlYXRlSW5jb21pbmdDb250cm9sRmxvd0NvbW1hbmQgZXh0ZW5kcyBDcmVhdGVSZWxhdGlvbnNoaXBDb21tYW5kIHsKLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSByZXF1ZXN0Ci0JICogQHBhcmFtIGVsZW1lbnQKLQkgKi8KLQlwdWJsaWMgQ3JlYXRlSW5jb21pbmdDb250cm9sRmxvd0NvbW1hbmQoQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdCByZXF1ZXN0LAotCQkJRU9iamVjdCBlbGVtZW50KSB7Ci0JCXN1cGVyKHJlcXVlc3QpOwotCQlzZXRFbGVtZW50VG9FZGl0KGVsZW1lbnQpOwotCX0KLQkvKioKLQkgKiBAcGFyYW0gcmVxdWVzdAotCSAqLwotCXB1YmxpYyBDcmVhdGVJbmNvbWluZ0NvbnRyb2xGbG93Q29tbWFuZChDcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJc3VwZXIocmVxdWVzdCk7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY29uc3RydWN0b3Igc3R1YgotCX0KLQlwcm90ZWN0ZWQgRUNsYXNzIGdldEVDbGFzc1RvRWRpdCgpIHsKLQkJcmV0dXJuIFVNTFBhY2thZ2UuZUlOU1RBTkNFLmdldEFjdGl2aXR5KCk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGNhbkV4ZWN1dGUoKSB7Ci0vLwkJaWYoZ2V0U291cmNlKCkgPT0gbnVsbCkKLS8vCQkJcmV0dXJuIGZhbHNlOwotLy8JCQotLy8JCWlmIChnZXRFQ2xhc3NUb0VkaXQoKSA9PSBudWxsKSB7Ci0vLwkJCXJldHVybiBmYWxzZTsKLS8vCQl9Ci0vLwotLy8JCWlmIChnZXRDb250YWlubWVudEZlYXR1cmUoKSAhPSBudWxsKSB7Ci0vLwkJCUVDbGFzc2lmaWVyIGVDbGFzc2lmaWVyID0gZ2V0Q29udGFpbm1lbnRGZWF0dXJlKCkuZ2V0RVR5cGUoKTsKLS8vCQkJYm9vbGVhbiByZXN1bHQgPSB0cnVlOwotLy8KLS8vCQkJaWYgKGVDbGFzc2lmaWVyIGluc3RhbmNlb2YgRUNsYXNzKSB7Ci0vLwkJCQlyZXN1bHQgPSAoKEVDbGFzcykgZUNsYXNzaWZpZXIpLmlzU3VwZXJUeXBlT2YoZ2V0RWxlbWVudFR5cGUoKQotLy8JCQkJCQkuZ2V0RUNsYXNzKCkpOwotLy8JCQl9Ci0vLwotLy8JCQlyZXN1bHQgPSByZXN1bHQKLS8vCQkJCQkmJiBQYWNrYWdlVXRpbC5jYW5SZWZlcmVuY2UoZ2V0RUNsYXNzVG9FZGl0KCksCi0vLwkJCQkJCQlnZXRDb250YWlubWVudEZlYXR1cmUoKSwgZ2V0RWxlbWVudFR5cGUoKQotLy8JCQkJCQkJCQkuZ2V0RUNsYXNzKCkpOwotLy8KLS8vCQkJcmV0dXJuIHJlc3VsdDsKLS8vCQl9Ci0vLwkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gc3VwZXIuY2FuRXhlY3V0ZSgpOwotCX0KLQlwcm90ZWN0ZWQgRU9iamVjdCBkb0RlZmF1bHRFbGVtZW50Q3JlYXRpb24oKSB7Ci0JCUNvbnRyb2xGbG93IG5ld0VsZW1lbnQgPSAoQ29udHJvbEZsb3cpIHN1cGVyLmRvRGVmYXVsdEVsZW1lbnRDcmVhdGlvbigpOwotCQlpZiAobmV3RWxlbWVudCAhPSBudWxsKSB7Ci0JCQluZXdFbGVtZW50LnNldFRhcmdldCgoQWN0aXZpdHlOb2RlKSBnZXRUYXJnZXQoKSk7Ci0JCQluZXdFbGVtZW50LnNldFNvdXJjZSgoQWN0aXZpdHlOb2RlKSBnZXRTb3VyY2UoKSk7Ci0JCX0KLQkJcmV0dXJuIG5ld0VsZW1lbnQ7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2N1c3RvbS9jb21tYW5kcy9DcmVhdGVPdXRnb2luZ0NvbnRyb2xGbG93Q29tbWFuZC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2N1c3RvbS9jb21tYW5kcy9DcmVhdGVPdXRnb2luZ0NvbnRyb2xGbG93Q29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNjg0NzYwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9jdXN0b20vY29tbWFuZHMvQ3JlYXRlT3V0Z29pbmdDb250cm9sRmxvd0NvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vKioKLSAqIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmN1c3RvbS5jb21tYW5kczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzc2lmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb3JlLnV0aWwuUGFja2FnZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5jb21tYW5kcy5DcmVhdGVSZWxhdGlvbnNoaXBDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuQ29udHJvbEZsb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuVU1MUGFja2FnZTsKLQotLyoqCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBDcmVhdGVPdXRnb2luZ0NvbnRyb2xGbG93Q29tbWFuZCBleHRlbmRzIENyZWF0ZVJlbGF0aW9uc2hpcENvbW1hbmQgewotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIHJlcXVlc3QKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqLwotCXB1YmxpYyBDcmVhdGVPdXRnb2luZ0NvbnRyb2xGbG93Q29tbWFuZChDcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0IHJlcXVlc3QsCi0JCQlFT2JqZWN0IGVsZW1lbnQpIHsKLQkJc3VwZXIocmVxdWVzdCk7Ci0JCXNldEVsZW1lbnRUb0VkaXQoZWxlbWVudCk7Ci0JfQotCS8qKgotCSAqIEBwYXJhbSByZXF1ZXN0Ci0JICovCi0JcHVibGljIENyZWF0ZU91dGdvaW5nQ29udHJvbEZsb3dDb21tYW5kKENyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3QgcmVxdWVzdCkgewotCQlzdXBlcihyZXF1ZXN0KTsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjb25zdHJ1Y3RvciBzdHViCi0JfQotCXByb3RlY3RlZCBFQ2xhc3MgZ2V0RUNsYXNzVG9FZGl0KCkgewotCQlyZXR1cm4gVU1MUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QWN0aXZpdHlOb2RlKCk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGNhbkV4ZWN1dGUoKSB7Ci0JCWlmKGdldFNvdXJjZSgpID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCQotCQlpZiAoZ2V0RUNsYXNzVG9FZGl0KCkgPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJaWYgKGdldENvbnRhaW5tZW50RmVhdHVyZSgpICE9IG51bGwpIHsKLQkJCUVDbGFzc2lmaWVyIGVDbGFzc2lmaWVyID0gZ2V0Q29udGFpbm1lbnRGZWF0dXJlKCkuZ2V0RVR5cGUoKTsKLQkJCWJvb2xlYW4gcmVzdWx0ID0gdHJ1ZTsKLQotCQkJaWYgKGVDbGFzc2lmaWVyIGluc3RhbmNlb2YgRUNsYXNzKSB7Ci0JCQkJcmVzdWx0ID0gKChFQ2xhc3MpIGVDbGFzc2lmaWVyKS5pc1N1cGVyVHlwZU9mKGdldEVsZW1lbnRUeXBlKCkKLQkJCQkJCS5nZXRFQ2xhc3MoKSk7Ci0JCQl9Ci0KLQkJCXJlc3VsdCA9IHJlc3VsdAotCQkJCQkmJiBQYWNrYWdlVXRpbC5jYW5SZWZlcmVuY2UoZ2V0RUNsYXNzVG9FZGl0KCksCi0JCQkJCQkJZ2V0Q29udGFpbm1lbnRGZWF0dXJlKCksIGdldEVsZW1lbnRUeXBlKCkKLQkJCQkJCQkJCS5nZXRFQ2xhc3MoKSk7Ci0KLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCQkvL3JldHVybiBzdXBlci5jYW5FeGVjdXRlKCk7Ci0JfQotCQotCXByb3RlY3RlZCBFT2JqZWN0IGRvRGVmYXVsdEVsZW1lbnRDcmVhdGlvbigpIHsKLQkJLy8gVE9ETzogUmVzb2x2ZSB0aGUgc291cmNlIGFuZCB0YXJnZXQgcHJvcGVybHkuCi0JCUNvbnRyb2xGbG93IG5ld0VsZW1lbnQgPSAoQ29udHJvbEZsb3cpIHN1cGVyLmRvRGVmYXVsdEVsZW1lbnRDcmVhdGlvbigpOwotCQlpZiAobmV3RWxlbWVudCAhPSBudWxsKSB7Ci0JCQluZXdFbGVtZW50LnNldFRhcmdldCgoQWN0aXZpdHlOb2RlKSBnZXRUYXJnZXQoKSk7Ci0JCQluZXdFbGVtZW50LnNldFNvdXJjZSgoQWN0aXZpdHlOb2RlKSBnZXRTb3VyY2UoKSk7Ci0JCX0KLQkJcmV0dXJuIG5ld0VsZW1lbnQ7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2N1c3RvbS9maWd1cmVzL0JyZWFrZG93bkVsZW1lbnROb2RlRmlndXJlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvY3VzdG9tL2ZpZ3VyZXMvQnJlYWtkb3duRWxlbWVudE5vZGVGaWd1cmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDBjZmM4My4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvY3VzdG9tL2ZpZ3VyZXMvQnJlYWtkb3duRWxlbWVudE5vZGVGaWd1cmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLS8qKgotICogCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuY3VzdG9tLmZpZ3VyZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuR3JhcGhpY3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLkRpYWdyYW1Db3JlUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUudXRpbC5EaWFncmFtQ29yZVV0aWw7Ci0KLS8qKgotICogQ3VzdG9taXplZCBmaWd1cmUgZm9yIHRoZSBCcmVha2Rvd25FbGVtZW50IGZpZ3VyZXMgdG8gc2hvdyBvdmVybGFwcGVkIHBvcnRpb24uIAotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKi8KLXB1YmxpYyBjbGFzcyBCcmVha2Rvd25FbGVtZW50Tm9kZUZpZ3VyZSBleHRlbmRzIFJlY3RhbmdsZUZpZ3VyZSB7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgQnJlYWtkb3duRWxlbWVudE5vZGVGaWd1cmUoKSB7Ci0JCXRoaXMuc2V0T3V0bGluZShmYWxzZSk7Ci0JCXRoaXMuc2V0T3BhcXVlKGZhbHNlKTsKLQkJY3JlYXRlQ29udGVudHMoKTsKLQl9Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcml2YXRlIHZvaWQgY3JlYXRlQ29udGVudHMoKSB7Ci0JCW9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCBmaWdfMCA9IG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwoKTsKLQkJZmlnXzAuc2V0VGV4dChEaWFncmFtQ29yZVJlc291cmNlcy5BY3Rpdml0eURpYWdyYW1fTmV3X0l0ZXJhdGlvbik7Ci0KLQkJRGlhZ3JhbUNvcmVVdGlsLnNldExhYmVsUHJvcGVydGllcyhmaWdfMCk7Ci0KLQkJc2V0RmlndXJlTm9kZU5hbWVGaWd1cmUoZmlnXzApOwotCi0JCU9iamVjdCBsYXlEYXRhMCA9IG51bGw7Ci0KLQkJdGhpcy5hZGQoZmlnXzAsIGxheURhdGEwKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZk5vZGVOYW1lRmlndXJlOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZ2V0RmlndXJlTm9kZU5hbWVGaWd1cmUoKSB7Ci0JCXJldHVybiBmTm9kZU5hbWVGaWd1cmU7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgdm9pZCBzZXRGaWd1cmVOb2RlTmFtZUZpZ3VyZSgKLQkJCW9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCBmaWcpIHsKLQkJZk5vZGVOYW1lRmlndXJlID0gZmlnOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gbXlVc2VMb2NhbENvb3JkaW5hdGVzID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcygpIHsKLQkJcmV0dXJuIG15VXNlTG9jYWxDb29yZGluYXRlczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXNlTG9jYWxDb29yZGluYXRlcyhib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMpIHsKLQkJbXlVc2VMb2NhbENvb3JkaW5hdGVzID0gdXNlTG9jYWxDb29yZGluYXRlczsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBwYWludEZpZ3VyZShHcmFwaGljcyBncmFwaGljcykgewotCQlpZihpc09wYXF1ZSgpKQotCQkJc3VwZXIucGFpbnRGaWd1cmUoZ3JhcGhpY3MpOwotCQlyZXR1cm47Ci0JfQkKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9jdXN0b20vZmlndXJlcy9EZWNpc2lvbk5vZGVGaWd1cmUuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9jdXN0b20vZmlndXJlcy9EZWNpc2lvbk5vZGVGaWd1cmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTc2NjU4My4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvY3VzdG9tL2ZpZ3VyZXMvRGVjaXNpb25Ob2RlRmlndXJlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8qKgotICogCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuY3VzdG9tLmZpZ3VyZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5GaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkdyYXBoaWNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5TdGFja0xheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuRGltZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnRMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuQ29uc3RyYWluZWRUb29sYmFyTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLklQb2x5Z29uQW5jaG9yYWJsZUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5nZWYudWkuZmlndXJlcy5EZWZhdWx0U2l6ZU5vZGVGaWd1cmU7Ci0KLS8qKgotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBBZG9wdGVkIGZyb20gR01GJ3MgR2VvU2hhcGVzCi0gKi8KLXB1YmxpYyBjbGFzcyBEZWNpc2lvbk5vZGVGaWd1cmUgZXh0ZW5kcyBEZWZhdWx0U2l6ZU5vZGVGaWd1cmUgaW1wbGVtZW50cwotCQlJUG9seWdvbkFuY2hvcmFibGVGaWd1cmUgewotCi0JcHJpdmF0ZSBpbnQgc3BhY2luZzsKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGNyZWF0ZSBhIGRlY2lzaW9uIGZpZ3VyZQotCSAqIAotCSAqLwotCXB1YmxpYyBEZWNpc2lvbk5vZGVGaWd1cmUoaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgc3BhY2luZykgewotCQlzdXBlcih3aWR0aCwgaGVpZ2h0KTsKLQkJdGhpcy5zcGFjaW5nID0gc3BhY2luZzsKLQkJY3JlYXRlRmlndXJlKHdpZHRoLCBoZWlnaHQpOwotCX0KLQkvKioKLQkgKiBAcGFyYW0gZGVmU2l6ZQotCSAqLwotCXB1YmxpYyBEZWNpc2lvbk5vZGVGaWd1cmUoRGltZW5zaW9uIGRlZlNpemUpIHsKLQkJc3VwZXIoZGVmU2l6ZSk7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY29uc3RydWN0b3Igc3R1YgotCX0KLQotCS8qKgotCSAqIEBwYXJhbSB3aWR0aAotCSAqIEBwYXJhbSBoZWlnaHQKLQkgKi8KLQlwdWJsaWMgRGVjaXNpb25Ob2RlRmlndXJlKGludCB3aWR0aCwgaW50IGhlaWdodCkgewotCQlzdXBlcih3aWR0aCwgaGVpZ2h0KTsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjb25zdHJ1Y3RvciBzdHViCi0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuSVBvbHlnb25BbmNob3JhYmxlRmlndXJlI2dldFBvbHlnb25Qb2ludHMoKQotCSAqLwotCXB1YmxpYyBQb2ludExpc3QgZ2V0UG9seWdvblBvaW50cygpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gZ2V0UG9pbnRzKCk7Ci0JfQotCXByb3RlY3RlZCB2b2lkIHBhaW50RmlndXJlKEdyYXBoaWNzIGcpIHsKLQkJUG9pbnRMaXN0IHBvaW50cyA9IGdldFBvaW50TGlzdChnZXRCb3VuZHMoKS5nZXRDb3B5KCkpOwotCQlnLmZpbGxQb2x5Z29uKHBvaW50cyk7Ci0JCWcuZHJhd1BvbHlnb24ocG9pbnRzKTsKLQl9Ci0JCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgdXNlZCB0byBjb21wdXRlIHRoZSBzaGFwZXMgcG9seWdvbiBwb2ludHMuCi0JICogVGhpcyBpcyBjdXJyZW50bHkgYmFzZWQgb24gdGhlIHNoYXBlcyBib3VuZGluZyBib3guCi0JICogCi0JICogQHBhcmFtIHJlY3QgdGhlIHJlY3RhbmdsZSB0aGF0IHRoZSBzaGFwZSB3aWxsIGZpdCBpbgotCSAqLwotCXByb3RlY3RlZCBQb2ludExpc3QgZ2V0UG9pbnRMaXN0KFJlY3RhbmdsZSByZWN0KSB7Ci0JCVBvaW50TGlzdCBwb2ludHMgPSBuZXcgUG9pbnRMaXN0KCk7Ci0JCQotCQlpbnQgaGFsZlggPSByZWN0LnggKyAocmVjdC53aWR0aCAvIDIpOwotCQlpbnQgaGFsZlkgPSByZWN0LnkgKyAocmVjdC5oZWlnaHQgLyAyKTsKLQkJCi0JCVBvaW50IHAxID0gbmV3IFBvaW50KCBoYWxmWCwgcmVjdC55ICk7Ci0JCVBvaW50IHAyID0gbmV3IFBvaW50KCByZWN0LnggKyByZWN0LndpZHRoIC0gMSwgaGFsZlkgKTsKLQkJUG9pbnQgcDMgPSBuZXcgUG9pbnQoIGhhbGZYLCByZWN0LnkgKyByZWN0LmhlaWdodCAtIDEgKTsKLQkJUG9pbnQgcDQgPSBuZXcgUG9pbnQoIHJlY3QueCwgaGFsZlkgKTsKLQkJCi0JCXBvaW50cy5hZGRQb2ludCggcDEgKTsKLQkJcG9pbnRzLmFkZFBvaW50KCBwMiApOwotCQlwb2ludHMuYWRkUG9pbnQoIHAzICk7Ci0JCXBvaW50cy5hZGRQb2ludCggcDQgKTsKLQkJcG9pbnRzLmFkZFBvaW50KCBwMSApOwkKLQkJCi0JCXJldHVybiBwb2ludHM7Ci0JfQotCQotCXB1YmxpYyBJRmlndXJlIGdldENvbnRlbnRQYW5lKCkgewotCQlyZXR1cm4gKElGaWd1cmUpIGdldENoaWxkcmVuKCkuZ2V0KDApOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBjcmVhdGVGaWd1cmUoaW50IHdpZHRoLCBpbnQgaGVpZ2h0KXsKLQkJc2V0T3BhcXVlKHRydWUpOwotCQlzZXRMYXlvdXRNYW5hZ2VyKG5ldyBTdGFja0xheW91dCgpIHsKLQkJCXB1YmxpYyB2b2lkIGxheW91dChJRmlndXJlIGZpZ3VyZSkgewotCQkJCVJlY3RhbmdsZSByID0gZmlndXJlLmdldENsaWVudEFyZWEoKTsKLQkJCQlMaXN0IGNoaWxkcmVuID0gZmlndXJlLmdldENoaWxkcmVuKCk7Ci0JCQkJSUZpZ3VyZSBjaGlsZDsKLQkJCQlEaW1lbnNpb24gZDsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLnNpemUoKTsgaSsrKSB7Ci0JCQkJCWNoaWxkID0gKElGaWd1cmUpY2hpbGRyZW4uZ2V0KGkpOwotCQkJCQlkID0gY2hpbGQuZ2V0UHJlZmVycmVkU2l6ZShyLndpZHRoLCByLmhlaWdodCk7Ci0JCQkJCWQud2lkdGggPSBNYXRoLm1pbihkLndpZHRoLCByLndpZHRoKTsKLQkJCQkJZC5oZWlnaHQgPSBNYXRoLm1pbihkLmhlaWdodCwgci5oZWlnaHQpOwotCQkJCQlSZWN0YW5nbGUgY2hpbGRSZWN0ID0gbmV3IFJlY3RhbmdsZSgKLQkJCQkJCXIueCArIChyLndpZHRoIC0gZC53aWR0aCkvMiwKLQkJCQkJCXIueSArIChyLmhlaWdodCAtIGQuaGVpZ2h0KS8yLAotCQkJCQkJZC53aWR0aCwKLQkJCQkJCWQuaGVpZ2h0KTsKLQkJCQkJY2hpbGQuc2V0Qm91bmRzKGNoaWxkUmVjdCk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQkJCi0JCUlGaWd1cmUgZiA9IG5ldyBGaWd1cmUoKTsKLQkJQ29uc3RyYWluZWRUb29sYmFyTGF5b3V0IGxheW91dCA9IG5ldyBDb25zdHJhaW5lZFRvb2xiYXJMYXlvdXQoKTsKLQkJbGF5b3V0LnNldFNwYWNpbmcoc3BhY2luZyk7Ci0JCWYuc2V0TGF5b3V0TWFuYWdlcihsYXlvdXQpOwotCQlhZGQoZik7Ci0JfQotCQotCXB1YmxpYyBQb2ludExpc3QgZ2V0UG9pbnRzKCl7Ci0JCXJldHVybiBnZXRQb2ludExpc3QoZ2V0Qm91bmRzKCkuZ2V0Q29weSgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvY3VzdG9tL2ZpZ3VyZXMvRW5kTm9kZUZpZ3VyZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2N1c3RvbS9maWd1cmVzL0VuZE5vZGVGaWd1cmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmFjMDdhOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvY3VzdG9tL2ZpZ3VyZXMvRW5kTm9kZUZpZ3VyZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5jdXN0b20uZmlndXJlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5FbGxpcHNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5HcmFwaGljczsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUmVjdGFuZ2xlOwotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBFbmROb2RlRmlndXJlIGV4dGVuZHMgRWxsaXBzZSB7Ci0KLQkvKioKLQkgKiBGaWxscyB0aGUgZWxsaXBzZS4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmRyYXcyZC5TaGFwZSNmaWxsU2hhcGUob3JnLmVjbGlwc2UuZHJhdzJkLkdyYXBoaWNzKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZpbGxTaGFwZShHcmFwaGljcyBncmFwaGljcykgewotCQlSZWN0YW5nbGUgciA9IGdldEJvdW5kcygpLmdldENvcHkoKTsKLQkJci5zaHJpbmsoci53aWR0aCAvIDgsIHIuaGVpZ2h0IC8gOCk7Ci0JCWdyYXBoaWNzLmZpbGxPdmFsKHIpOwotCX0KLQotCS8qKgotCSAqIE91dGxpbmVzIHRoZSBlbGxpcHNlLgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZHJhdzJkLlNoYXBlI291dGxpbmVTaGFwZShvcmcuZWNsaXBzZS5kcmF3MmQuR3JhcGhpY3MpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgb3V0bGluZVNoYXBlKEdyYXBoaWNzIGdyYXBoaWNzKSB7Ci0JCXN1cGVyLm91dGxpbmVTaGFwZShncmFwaGljcyk7Ci0KLQkJUmVjdGFuZ2xlIHIgPSBSZWN0YW5nbGUuU0lOR0xFVE9OOwotCQlyLnNldEJvdW5kcyhnZXRCb3VuZHMoKSk7Ci0JCXIuc2hyaW5rKGdldEJvdW5kcygpLndpZHRoIC8gOCwgZ2V0Qm91bmRzKCkuaGVpZ2h0IC8gOCk7Ci0JCXIud2lkdGgtLTsKLQkJci5oZWlnaHQtLTsKLQkJci5zaHJpbmsoKGxpbmVXaWR0aCAtIDEpIC8gMiwgKGxpbmVXaWR0aCAtIDEpIC8gMik7Ci0JCWdyYXBoaWNzLmRyYXdPdmFsKHIpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2N1c3RvbS9maWd1cmVzL1JlbGF0aXZlWFlBbmNob3IuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9jdXN0b20vZmlndXJlcy9SZWxhdGl2ZVhZQW5jaG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4NDI4NTcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2N1c3RvbS9maWd1cmVzL1JlbGF0aXZlWFlBbmNob3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuY3VzdG9tLmZpZ3VyZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuQWJzdHJhY3RDb25uZWN0aW9uQW5jaG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUmVjdGFuZ2xlOwotCi0vKioKLSAqIFByb3ZpZGVzIHJlbGF0aXZlIGFuY2hvciBmb3IgYSBmaWd1cmUncyBsb2NhdGlvbi4gCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBSZWxhdGl2ZVhZQW5jaG9yIGV4dGVuZHMgQWJzdHJhY3RDb25uZWN0aW9uQW5jaG9yIHsKLQotCXByaXZhdGUgUG9pbnQgcmVsYXRpdmVMb2NhdGlvbjsKLQotCXB1YmxpYyBSZWxhdGl2ZVhZQW5jaG9yKElGaWd1cmUgZmlndXJlLCBQb2ludCBsb2NhdGlvbiwgYm9vbGVhbiBpc1JlbGF0aXZlKSB7Ci0JCXN1cGVyKGZpZ3VyZSk7Ci0JCXJlbGF0aXZlTG9jYXRpb24gPSBsb2NhdGlvbi5nZXRDb3B5KCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5kcmF3MmQuQ29ubmVjdGlvbkFuY2hvciNnZXRMb2NhdGlvbihQb2ludCkKLQkgKi8KLQlwdWJsaWMgUG9pbnQgZ2V0TG9jYXRpb24oUG9pbnQgcmVmZXJlbmNlKSB7Ci0JCVBvaW50IHAgPSByZWxhdGl2ZUxvY2F0aW9uLmdldENvcHkoKTsKLQkJUmVjdGFuZ2xlIHIgPSBnZXRPd25lcigpLmdldEJvdW5kcygpLmdldENvcHkoKTsKLQkJcC5wZXJmb3JtVHJhbnNsYXRlKHIueCwgci55KTsKLQkJZ2V0T3duZXIoKS50cmFuc2xhdGVUb0Fic29sdXRlKHApOwotCQlyZXR1cm4gcDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmRyYXcyZC5BYnN0cmFjdENvbm5lY3Rpb25BbmNob3IjZ2V0UmVmZXJlbmNlUG9pbnQoKQotCSAqLwotCXB1YmxpYyBQb2ludCBnZXRSZWZlcmVuY2VQb2ludCgpIHsKLQkJcmV0dXJuIGdldExvY2F0aW9uKG51bGwpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2N1c3RvbS9wb2xpY2llcy9BY3Rpdml0eUNyZWF0aW9uRWRpdFBvbGljeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2N1c3RvbS9wb2xpY2llcy9BY3Rpdml0eUNyZWF0aW9uRWRpdFBvbGljeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZWFlNjI1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9jdXN0b20vcG9saWNpZXMvQWN0aXZpdHlDcmVhdGlvbkVkaXRQb2xpY3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vL0NvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy9hcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vL0NvbnRyaWJ1dG9yczoKLS8vSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuY3VzdG9tLnBvbGljaWVzOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5yZXF1ZXN0cy5DaGFuZ2VCb3VuZHNSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi5jb3JlLmNvbW1hbmQuQ29tcG9zaXRlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUudXRpbC5WaWV3VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmNvbW1hbmRzLklDb21tYW5kUHJveHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuR3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLkxhYmVsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuQ3JlYXRpb25FZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkubDEwbi5EaWFncmFtVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4yCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eUNyZWF0aW9uRWRpdFBvbGljeSBleHRlbmRzIENyZWF0aW9uRWRpdFBvbGljeSB7Ci0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0UmVwYXJlbnRDb21tYW5kKENoYW5nZUJvdW5kc1JlcXVlc3QgcmVxdWVzdCkgewotCQlJdGVyYXRvciBlZGl0UGFydHMgPSByZXF1ZXN0LmdldEVkaXRQYXJ0cygpLml0ZXJhdG9yKCk7Ci0JCVZpZXcgY29udGFpbmVyID0gKFZpZXcpZ2V0SG9zdCgpLmdldEFkYXB0ZXIoVmlldy5jbGFzcyk7Ci0JCUVPYmplY3QgY29udGV4dCA9IGNvbnRhaW5lciA9PSBudWxsID8gbnVsbCA6IFZpZXdVdGlsLnJlc29sdmVTZW1hbnRpY0VsZW1lbnQoY29udGFpbmVyKTsKLSAgICAgICAgQ29tcG9zaXRlQ29tbWFuZCBjYyA9IG5ldyBDb21wb3NpdGVDb21tYW5kKERpYWdyYW1VSU1lc3NhZ2VzLkFkZENvbW1hbmRfTGFiZWwpOwotCQl3aGlsZSAoIGVkaXRQYXJ0cy5oYXNOZXh0KCkgKSB7Ci0JCQlFZGl0UGFydCBlcCA9IChFZGl0UGFydCllZGl0UGFydHMubmV4dCgpOwotCQkJaWYgKCBlcCBpbnN0YW5jZW9mIExhYmVsRWRpdFBhcnQgKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQkKLQkJCVZpZXcgdmlldyA9IChWaWV3KWVwLmdldEFkYXB0ZXIoVmlldy5jbGFzcyk7Ci0JCQlpZiAoIHZpZXcgPT0gbnVsbCApIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCUVPYmplY3Qgc2VtYW50aWMgPSBWaWV3VXRpbC5yZXNvbHZlU2VtYW50aWNFbGVtZW50KHZpZXcpOwotCQkJaWYgKCBzZW1hbnRpYyA9PSBudWxsICkgewotCQkJCUlHcmFwaGljYWxFZGl0UGFydCBnZXAgPSAoSUdyYXBoaWNhbEVkaXRQYXJ0KWVwOwotCQkJCWlmKHNob3VsZFJlcGFyZW50KGdlcCwgcmVxdWVzdCkpIHsKLQkJCQkJY2MuY29tcG9zZShnZXRSZXBhcmVudFZpZXdDb21tYW5kKGdlcCkpOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgaWYgKCBjb250ZXh0ICE9IG51bGwgJiYgc2hvdWxkUmVwYXJlbnQoc2VtYW50aWMsIGNvbnRleHQpKSB7Ci0JCQkJY2MuY29tcG9zZShnZXRSZXBhcmVudENvbW1hbmQoKElHcmFwaGljYWxFZGl0UGFydCllcCkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBjYy5pc0VtcHR5KCkgPyBudWxsIDogbmV3IElDb21tYW5kUHJveHkoY2MucmVkdWNlKCkpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHNob3VsZFJlcGFyZW50KElHcmFwaGljYWxFZGl0UGFydCBlcCwgQ2hhbmdlQm91bmRzUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCS8vIHJlcGxhY2UgcGFyZW50IG9ubHkgaWYgdGhlIHZpZXcgZG9lcyBub3QgaGF2ZSBhbnkgcGFyZW50IHlldCBvciB0aGUKLQkJLy8gYm91bmRzIGFyZSBub3QgaW5zaWRlIHRoZSBjdXJyZW50IHBhcmVudCBmaWd1cmUKLQkJLy8KLQkJVmlldyB2aWV3ID0gKFZpZXcpIGVwLmdldE1vZGVsKCk7Ci0JCWlmKHZpZXcuZUNvbnRhaW5lcigpICE9IG51bGwpIHsKLQkJCVBvaW50IGxvY2F0aW9uID0gZXAuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCkuZ2V0TG9jYXRpb24oKS5nZXRUcmFuc2xhdGVkKHJlcXVlc3QuZ2V0TW92ZURlbHRhKCkpOwotCQkJSUZpZ3VyZSBwYXJlbnRGaWcgPSAoKEdyYXBoaWNhbEVkaXRQYXJ0KWVwLmdldFBhcmVudCgpKS5nZXRGaWd1cmUoKTsKLQkJCVJlY3RhbmdsZSBwYXJlbnRCb3VuZHMgPSBwYXJlbnRGaWcuZ2V0Qm91bmRzKCk7CQotCQkJcmV0dXJuICFwYXJlbnRCb3VuZHMuY29udGFpbnMobG9jYXRpb24pOwotCQl9Ci0JCWVsc2UgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvY3VzdG9tL3BvbGljaWVzL0FjdGl2aXR5UGFydGl0aW9uQ3JlYXRpb25FZGl0UG9saWN5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvY3VzdG9tL3BvbGljaWVzL0FjdGl2aXR5UGFydGl0aW9uQ3JlYXRpb25FZGl0UG9saWN5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3ZDE1NDEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2N1c3RvbS9wb2xpY2llcy9BY3Rpdml0eVBhcnRpdGlvbkNyZWF0aW9uRWRpdFBvbGljeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vKioKLSAqIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmN1c3RvbS5wb2xpY2llczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5EaW1lbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5UcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLkFjdGl2aXR5UGFydGl0aW9uRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5yZXF1ZXN0cy5DaGFuZ2VCb3VuZHNSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi5jb3JlLmNvbW1hbmQuQ29tcG9zaXRlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS5jb21tYW5kLklDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS51dGlsLlZpZXdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuY29tbWFuZHMuQ29tbWFuZFByb3h5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuY29tbWFuZHMuQ3JlYXRlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmNvbW1hbmRzLklDb21tYW5kUHJveHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5TZXRCb3VuZHNDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLkdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklHcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5MYWJlbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLlNoYXBlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuQ3JlYXRpb25FZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkubDEwbi5EaWFncmFtVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlcXVlc3RzLkNyZWF0ZVZpZXdSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVxdWVzdHMuRWRpdENvbW1hbmRSZXF1ZXN0V3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29tbWFuZHMuY29yZS5jb21tYW5kLkNvbXBvc2l0ZVRyYW5zYWN0aW9uYWxDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb3JlLnV0aWwuRU9iamVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5Nb3ZlUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLlVNTFBhY2thZ2U7Ci0KLS8qKgotICogQ3JlYXRpb25FZGl0UG9saWN5IGZvciBBY3Rpdml0eVBhcnRpdGlvbi4KLSAqIAotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZpdHlQYXJ0aXRpb25DcmVhdGlvbkVkaXRQb2xpY3kgZXh0ZW5kcyBDcmVhdGlvbkVkaXRQb2xpY3kgewotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuQ3JlYXRpb25FZGl0UG9saWN5I2dldENyZWF0ZUNvbW1hbmQob3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXF1ZXN0cy5DcmVhdGVWaWV3UmVxdWVzdCkKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVDb21tYW5kKENyZWF0ZVZpZXdSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gZWRpdGluZ0RvbWFpbiA9ICgoSUdyYXBoaWNhbEVkaXRQYXJ0KSBnZXRIb3N0KCkpCi0JCQkJLmdldEVkaXRpbmdEb21haW4oKTsKLQkJQ29tcG9zaXRlVHJhbnNhY3Rpb25hbENvbW1hbmQgY2MgPSBuZXcgQ29tcG9zaXRlVHJhbnNhY3Rpb25hbENvbW1hbmQoCi0JCQkJZWRpdGluZ0RvbWFpbiwgRGlhZ3JhbVVJTWVzc2FnZXMuQWRkQ29tbWFuZF9MYWJlbCk7Ci0KLQkJSXRlcmF0b3IgZGVzY3JpcHRvcnMgPSByZXF1ZXN0LmdldFZpZXdEZXNjcmlwdG9ycygpLml0ZXJhdG9yKCk7Ci0KLQkJd2hpbGUgKGRlc2NyaXB0b3JzLmhhc05leHQoKSkgewotCQkJQ3JlYXRlVmlld1JlcXVlc3QuVmlld0Rlc2NyaXB0b3IgZGVzY3JpcHRvciA9IChDcmVhdGVWaWV3UmVxdWVzdC5WaWV3RGVzY3JpcHRvcikgZGVzY3JpcHRvcnMKLQkJCQkJLm5leHQoKTsKLQkJCVZpZXcgY29udGFpbmVyVmlldyA9IChWaWV3KSBnZXRIb3N0KCkuZ2V0TW9kZWwoKTsKLS8vCQkJd2hpbGUoY29udGFpbmVyVmlldy5nZXRFbGVtZW50KCkgaW5zdGFuY2VvZiBBY3Rpdml0eVBhcnRpdGlvbil7Ci0vLwkJCQljb250YWluZXJWaWV3ID0gKFZpZXcpY29udGFpbmVyVmlldy5lQ29udGFpbmVyKCk7Ci0vLwkJCX0KLQkJCUNyZWF0ZUNvbW1hbmQgY3JlYXRlQ29tbWFuZCA9IG5ldyBDcmVhdGVDb21tYW5kKGVkaXRpbmdEb21haW4sCi0JCQkJCWRlc2NyaXB0b3IsIGNvbnRhaW5lclZpZXcpOwotCi0JCQljYy5jb21wb3NlKGNyZWF0ZUNvbW1hbmQpOwotCQl9Ci0JcmV0dXJuIG5ldyBJQ29tbWFuZFByb3h5KGNjLnJlZHVjZSgpKTsKLQl9Ci0JCi0JLyoqIFJldHVybiBhIGNvbW1hbmQgdG8gcmVwYXJlbnQgYm90aCB0aGUgc2VtYW50aWMgYW5kIHZpZXcgZWxlbWVudHMuICovCi0JLyoqCi0JICogcmV0dXJuIGEgY29tbWFuZCB0byByZXBhcmVudCBib3RoIHRoZSBzZW1hbnRpYyBhbmQgdmlldyBlbGVtZW50cy4gCi0JICogQHBhcmFtIHJlcXVlc3QgdGhlIHJlcXVlc3QKLQkgKiBAcmV0dXJuIGNvbW1hbmQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRSZXBhcmVudENvbW1hbmQoQ2hhbmdlQm91bmRzUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCUl0ZXJhdG9yIGVkaXRQYXJ0cyA9IHJlcXVlc3QuZ2V0RWRpdFBhcnRzKCkuaXRlcmF0b3IoKTsKLQkJVmlldyBjb250YWluZXIgPSAoVmlldylnZXRIb3N0KCkuZ2V0QWRhcHRlcihWaWV3LmNsYXNzKTsKLQkJRU9iamVjdCBjb250ZXh0ID0gY29udGFpbmVyID09IG51bGwgPyBudWxsIDogVmlld1V0aWwucmVzb2x2ZVNlbWFudGljRWxlbWVudChjb250YWluZXIpOwotICAgICAgICBDb21wb3NpdGVDb21tYW5kIGNjID0gbmV3IENvbXBvc2l0ZUNvbW1hbmQoRGlhZ3JhbVVJTWVzc2FnZXMuQWRkQ29tbWFuZF9MYWJlbCk7Ci0JCXdoaWxlICggZWRpdFBhcnRzLmhhc05leHQoKSApIHsKLQkJCUVkaXRQYXJ0IGVwID0gKEVkaXRQYXJ0KWVkaXRQYXJ0cy5uZXh0KCk7Ci0JCQlpZiAoIGVwIGluc3RhbmNlb2YgTGFiZWxFZGl0UGFydCApIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCQotCQkJVmlldyB2aWV3ID0gKFZpZXcpZXAuZ2V0QWRhcHRlcihWaWV3LmNsYXNzKTsKLQkJCWlmICggdmlldyA9PSBudWxsICkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJCi0JCQlFT2JqZWN0IHNlbWFudGljID0gVmlld1V0aWwucmVzb2x2ZVNlbWFudGljRWxlbWVudCh2aWV3KTsKLQkJCWlmICggc2VtYW50aWMgPT0gbnVsbCApIHsKLQkJCQljYy5jb21wb3NlKGdldFJlcGFyZW50Vmlld0NvbW1hbmQoKElHcmFwaGljYWxFZGl0UGFydCllcCkpOwotCQkJCWNjLmNvbXBvc2UoYWRqdXN0TG9jYXRpb25Db21tYW5kKChJR3JhcGhpY2FsRWRpdFBhcnQpZXAsIHJlcXVlc3QpKTsKLQkJCX0KLQkJCWVsc2UgaWYgKCBjb250ZXh0ICE9IG51bGwgJiYgc2hvdWxkUmVwYXJlbnQoc2VtYW50aWMsIGNvbnRleHQpKSB7Ci0JCQkJY2MuY29tcG9zZShnZXRSZXBhcmVudENvbW1hbmQoKElHcmFwaGljYWxFZGl0UGFydCllcCkpOwotCQkJCWNjLmNvbXBvc2UoYWRqdXN0TG9jYXRpb25Db21tYW5kKChJR3JhcGhpY2FsRWRpdFBhcnQpZXAsIHJlcXVlc3QpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gY2MuaXNFbXB0eSgpID8gbnVsbCA6IG5ldyBJQ29tbWFuZFByb3h5KGNjLnJlZHVjZSgpKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIElDb21tYW5kIGdldFJlcGFyZW50Q29tbWFuZChJR3JhcGhpY2FsRWRpdFBhcnQgZ2VwKSB7Ci0JCUNvbXBvc2l0ZUNvbW1hbmQgY2MgPSBuZXcgQ29tcG9zaXRlQ29tbWFuZChEaWFncmFtVUlNZXNzYWdlcy5BZGRDb21tYW5kX0xhYmVsKTsgCi0JCVZpZXcgY29udGFpbmVyID0gKFZpZXcpZ2V0SG9zdCgpLmdldE1vZGVsKCk7Ci0JCUVPYmplY3QgY29udGV4dCA9IFZpZXdVdGlsLnJlc29sdmVTZW1hbnRpY0VsZW1lbnQoY29udGFpbmVyKTsKLQkJVmlldyB2aWV3ID0gKFZpZXcpZ2VwLmdldE1vZGVsKCk7Ci0JCUVPYmplY3QgZWxlbWVudCA9IFZpZXdVdGlsLnJlc29sdmVTZW1hbnRpY0VsZW1lbnQodmlldyk7Ci0KLSAgICAgICAgVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gZWRpdGluZ0RvbWFpbiA9ICgoSUdyYXBoaWNhbEVkaXRQYXJ0KSBnZXRIb3N0KCkpCi0gICAgICAgICAgICAuZ2V0RWRpdGluZ0RvbWFpbigpOwotICAgICAgICAKLSAgICAgICAgLy8KLQkJLy8gc2VtYW50aWMKLQkJaWYgKCBlbGVtZW50ICE9IG51bGwgKSB7Ci0JCQlDb21tYW5kIG1vdmVTZW1hbnRpY0NtZCA9Ci0JCQkJZ2V0SG9zdCgpLmdldENvbW1hbmQoCi0JCQkJCW5ldyBFZGl0Q29tbWFuZFJlcXVlc3RXcmFwcGVyKAotCQkJCQkJbmV3IE1vdmVSZXF1ZXN0KGVkaXRpbmdEb21haW4sIGNvbnRleHQsIFVNTFBhY2thZ2UuZUlOU1RBTkNFLmdldEFjdGl2aXR5UGFydGl0aW9uX05vZGUoKSwgZWxlbWVudCkpKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgICBpZiAobW92ZVNlbWFudGljQ21kID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgIHJldHVybiBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS5jb21tYW5kLlVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0gICAgICAgICAgICAgIH0KLQkJCQotCQkJY2MuY29tcG9zZSAoIG5ldyBDb21tYW5kUHJveHkobW92ZVNlbWFudGljQ21kKSApOwotCQl9Ci0JCS8vCi0JCS8vIG5vdGF0aW9uCi0JCWNjLmNvbXBvc2UoZ2V0UmVwYXJlbnRWaWV3Q29tbWFuZChnZXApKTsKLQkJLy8gaW4gY2FzZSBvZiBtb3ZpbmcgaW50byBwYXJ0aXRpb24gd2UgaGF2ZSB0byBjaGFuZ2UgdGhlIGNvb3JkaW5hdGVzIG9mIGVsZW1lbnQKLQkJcmV0dXJuIGNjOwotCX0KLQotCXByaXZhdGUgSUNvbW1hbmQgYWRqdXN0TG9jYXRpb25Db21tYW5kKElHcmFwaGljYWxFZGl0UGFydCBjaGlsZCwKLQkJCUNoYW5nZUJvdW5kc1JlcXVlc3QgcmVxdWVzdCkgewotCQlpZiAoY2hpbGQgaW5zdGFuY2VvZiBTaGFwZUVkaXRQYXJ0KSB7Ci0JCQlQb2ludCBsb2NhdGlvbiA9IHJlcXVlc3QuZ2V0TW92ZURlbHRhKCk7Ci0JCQlQb2ludCBjaGlsZExvY2F0aW9uID0gY2hpbGQuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCkuZ2V0TG9jYXRpb24oKTsKLQkJCWludCB4ID0gY2hpbGRMb2NhdGlvbi54ICsgbG9jYXRpb24ueAotCQkJCQktICgoQWN0aXZpdHlQYXJ0aXRpb25FZGl0UGFydClnZXRIb3N0KCkpLmdldExvY2F0aW9uKCkueDsKLQkJCWludCB5ID0gY2hpbGRMb2NhdGlvbi55ICsgbG9jYXRpb24ueQotCQkJCQktICgoQWN0aXZpdHlQYXJ0aXRpb25FZGl0UGFydClnZXRIb3N0KCkpLmdldExvY2F0aW9uKCkueTsKLQotCQkJSUNvbW1hbmQgYm91bmRzQ29tbWFuZCA9IG5ldyBTZXRCb3VuZHNDb21tYW5kKAotCQkJCQkoKFNoYXBlRWRpdFBhcnQpIGNoaWxkKS5nZXRFZGl0aW5nRG9tYWluKCksCi0JCQkJCURpYWdyYW1VSU1lc3NhZ2VzLlNldExvY2F0aW9uQ29tbWFuZF9MYWJlbF9SZXNpemUsIC8vJE5PTi1OTFMtMSQKLQkJCQkJbmV3IEVPYmplY3RBZGFwdGVyKChWaWV3KSBjaGlsZC5nZXRNb2RlbCgpKSwKLQkJCQkJbmV3IFBvaW50KHgsIHkpKTsKLQotCQkJcmV0dXJuIGJvdW5kc0NvbW1hbmQ7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXN0YXRpYyBJQ29tbWFuZCBjcmVhdGVBZGp1c3RMb2NhdGlvbkNvbW1hbmQoSUdyYXBoaWNhbEVkaXRQYXJ0IGNoaWxkLAotCQkJQ2hhbmdlQm91bmRzUmVxdWVzdCByZXF1ZXN0LCBJR3JhcGhpY2FsRWRpdFBhcnQgbmV3UGFyZW50KSB7Ci0JCWlmIChjaGlsZCBpbnN0YW5jZW9mIFNoYXBlRWRpdFBhcnQpIHsKLQkJCVBvaW50IGxvY2F0aW9uID0gcmVxdWVzdC5nZXRNb3ZlRGVsdGEoKTsKLQkJCVBvaW50IG5ld0xvY2F0aW9uID0gY2hpbGQuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCkuZ2V0TG9jYXRpb24oKS5nZXRDb3B5KCkudHJhbnNsYXRlKGxvY2F0aW9uKTsKLS8vCQkJRGltZW5zaW9uIGRpZmYgPSAoKEdyYXBoaWNhbEVkaXRQYXJ0KSBjaGlsZC5nZXRQYXJlbnQoKSkuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCkKLS8vCQkJCQkuZ2V0TG9jYXRpb24oKS5nZXREaWZmZXJlbmNlKAotLy8JCQkJCQkJbmV3UGFyZW50LmdldEZpZ3VyZSgpLmdldEJvdW5kcygpLmdldExvY2F0aW9uKCkpOwotLy8JCQluZXdMb2NhdGlvbi50cmFuc2xhdGUoZGlmZik7Ci0vLwkJCW5ld1BhcmVudC5nZXRGaWd1cmUoKS50cmFuc2xhdGVGcm9tUGFyZW50KG5ld0xvY2F0aW9uKTsKLQkJCUlDb21tYW5kIGJvdW5kc0NvbW1hbmQgPSBuZXcgU2V0Qm91bmRzQ29tbWFuZCgKLQkJCQkJKChTaGFwZUVkaXRQYXJ0KSBjaGlsZCkuZ2V0RWRpdGluZ0RvbWFpbigpLAotCQkJCQlEaWFncmFtVUlNZXNzYWdlcy5TZXRMb2NhdGlvbkNvbW1hbmRfTGFiZWxfUmVzaXplLCAvLyROT04tTkxTLTEkCi0JCQkJCW5ldyBFT2JqZWN0QWRhcHRlcigoVmlldykgY2hpbGQuZ2V0TW9kZWwoKSksCi0JCQkJCW5ld0xvY2F0aW9uKTsKLQotCQkJcmV0dXJuIGJvdW5kc0NvbW1hbmQ7Ci0JCX0KLQkJcmV0dXJuIG51bGw7CQkJCQotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9jdXN0b20vcG9saWNpZXMvQWN0aXZpdHlQYXJ0aXRpb25EZWxlZ2F0aW9uRWRpdFBvbGljeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2N1c3RvbS9wb2xpY2llcy9BY3Rpdml0eVBhcnRpdGlvbkRlbGVnYXRpb25FZGl0UG9saWN5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjZjE4M2IuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2N1c3RvbS9wb2xpY2llcy9BY3Rpdml0eVBhcnRpdGlvbkRlbGVnYXRpb25FZGl0UG9saWN5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuY3VzdG9tLnBvbGljaWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuQWJzdHJhY3RFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5yZXF1ZXN0cy5DaGFuZ2VCb3VuZHNSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklHcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5Db250YWluZXJFZGl0UG9saWN5OwotCi0vKioKLSAqIEFjdGl2aXR5UGFydGl0aW9uIGRlbGVnYXRlcyB0byBpdHMgY29tcGFydG1lbnQgZWRpdCBwb2xpY3kKLSAqICAgCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eVBhcnRpdGlvbkRlbGVnYXRpb25FZGl0UG9saWN5IGV4dGVuZHMKLSAgICAgICAgQWJzdHJhY3RFZGl0UG9saWN5IHsKLQotICAgIHByaXZhdGUgRWRpdFBhcnQgY2hpbGRFZGl0UGFydDsKLSAgICBwcml2YXRlIEVkaXRQb2xpY3kgY2hpbGRFZGl0UG9saWN5OwotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIGNoaWxkVmlld0lEOwotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIGVkaXRQb2xpY3lJRDsKLSAgICAKLSAgICAKLSAgICBwdWJsaWMgQWN0aXZpdHlQYXJ0aXRpb25EZWxlZ2F0aW9uRWRpdFBvbGljeShTdHJpbmcgY2hpbGRJZCwgU3RyaW5nIGVkaXRQb2xpY3lJZCkgewotICAgICAgICBjaGlsZFZpZXdJRCA9IGNoaWxkSWQ7Ci0gICAgICAgIGVkaXRQb2xpY3lJRCA9IGVkaXRQb2xpY3lJZDsKLSAgICB9Ci0gICAgCi0KLSAgIC8qKgotICAgICogKG5vbi1KYXZhZG9jKQotICAgICogQHNlZSBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLkFic3RyYWN0RWRpdFBvbGljeSNhY3RpdmF0ZSgpCi0gICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhY3RpdmF0ZSgpIHsKLSAgICAgICAgY2hpbGRFZGl0UGFydCA9Ci0gICAgICAgICAgICAoKElHcmFwaGljYWxFZGl0UGFydClnZXRIb3N0KCkpLmdldENoaWxkQnlTZW1hbnRpY0hpbnQoY2hpbGRWaWV3SUQpOwotICAgICAgICBpZiAoY2hpbGRFZGl0UGFydCA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgY2hpbGRFZGl0UG9saWN5ID0gY2hpbGRFZGl0UGFydC5nZXRFZGl0UG9saWN5KGVkaXRQb2xpY3lJRCk7Ci0gICAgICAgIGNoaWxkRWRpdFBvbGljeS5zZXRIb3N0KGNoaWxkRWRpdFBhcnQpOwotICAgICAgICBjaGlsZEVkaXRQb2xpY3kuYWN0aXZhdGUoKTsKLSAgICB9Ci0KLSAgLyoqCi0gICAqIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLkFic3RyYWN0RWRpdFBvbGljeSNkZWFjdGl2YXRlKCkKLSAgICovCi0gICAgcHVibGljIHZvaWQgZGVhY3RpdmF0ZSgpIHsKLSAgICAgICAgaWYgKGNoaWxkRWRpdFBvbGljeSA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgY2hpbGRFZGl0UG9saWN5LmRlYWN0aXZhdGUoKTsKLSAgICAgICAgY2hpbGRFZGl0UGFydCA9IG51bGw7Ci0gICAgICAgIGNoaWxkRWRpdFBvbGljeSA9IG51bGw7Ci0gICAgfQotCi0KLSAgIC8qKgotICAgICogCi0gICAgKi8KLSAgICBwdWJsaWMgdm9pZCBlcmFzZVNvdXJjZUZlZWRiYWNrKFJlcXVlc3QgcmVxdWVzdCkgewotICAgICAgICBpZiAoY2hpbGRFZGl0UG9saWN5ID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBjaGlsZEVkaXRQb2xpY3kuZXJhc2VTb3VyY2VGZWVkYmFjayhyZXF1ZXN0KTsKLSAgICB9Ci0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5BYnN0cmFjdEVkaXRQb2xpY3kjZXJhc2VUYXJnZXRGZWVkYmFjayhvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdCkKLSAgICAgKiBAbW9kaWZpZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBlcmFzZVRhcmdldEZlZWRiYWNrKFJlcXVlc3QgcmVxdWVzdCkgewotICAgICAgICBpZiAoY2hpbGRFZGl0UG9saWN5ID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBjaGlsZEVkaXRQb2xpY3kuZXJhc2VUYXJnZXRGZWVkYmFjayhyZXF1ZXN0KTsKLSAgICB9Ci0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5BYnN0cmFjdEVkaXRQb2xpY3kjZ2V0Q29tbWFuZChvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdCkKLSAgICAgKiBAbW9kaWZpZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgQ29tbWFuZCBnZXRDb21tYW5kKFJlcXVlc3QgcmVxdWVzdCkgewotICAgICAgICBpZiAoY2hpbGRFZGl0UG9saWN5ID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIGlmKGNoaWxkRWRpdFBvbGljeSBpbnN0YW5jZW9mIENvbnRhaW5lckVkaXRQb2xpY3kgJiYgCi0gICAgICAgIAkJcmVxdWVzdCBpbnN0YW5jZW9mIENoYW5nZUJvdW5kc1JlcXVlc3QpewotICAgICAgICAJcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGNoaWxkRWRpdFBvbGljeS5nZXRDb21tYW5kKHJlcXVlc3QpOwotICAgIH0KLQotCi0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLkFic3RyYWN0RWRpdFBvbGljeSNnZXRUYXJnZXRFZGl0UGFydChvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdCkKLSAgICAgKiBAbW9kaWZpZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRWRpdFBhcnQgZ2V0VGFyZ2V0RWRpdFBhcnQoUmVxdWVzdCByZXF1ZXN0KSB7Ci0gICAgICAgIGlmIChjaGlsZEVkaXRQb2xpY3kgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGNoaWxkRWRpdFBvbGljeS5nZXRUYXJnZXRFZGl0UGFydChyZXF1ZXN0KTsKLSAgICB9Ci0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5BYnN0cmFjdEVkaXRQb2xpY3kjc2hvd1NvdXJjZUZlZWRiYWNrKG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0KQotICAgICAqIEBtb2RpZmllZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNob3dTb3VyY2VGZWVkYmFjayhSZXF1ZXN0IHJlcXVlc3QpIHsKLSAgICAgICAgaWYgKGNoaWxkRWRpdFBvbGljeSA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgY2hpbGRFZGl0UG9saWN5LnNob3dTb3VyY2VGZWVkYmFjayhyZXF1ZXN0KTsKLSAgICB9Ci0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5BYnN0cmFjdEVkaXRQb2xpY3kjc2hvd1RhcmdldEZlZWRiYWNrKG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0KQotICAgICAqIEBtb2RpZmllZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNob3dUYXJnZXRGZWVkYmFjayhSZXF1ZXN0IHJlcXVlc3QpIHsKLSAgICAgICAgaWYgKGNoaWxkRWRpdFBvbGljeSA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgY2hpbGRFZGl0UG9saWN5LnNob3dUYXJnZXRGZWVkYmFjayhyZXF1ZXN0KTsKLSAgICB9Ci0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5BYnN0cmFjdEVkaXRQb2xpY3kjdW5kZXJzdGFuZHNSZXF1ZXN0KG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0KQotICAgICAqIEBtb2RpZmllZAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIHVuZGVyc3RhbmRzUmVxdWVzdChSZXF1ZXN0IHJlcSkgewotICAgICAgICBpZiAoY2hpbGRFZGl0UGFydCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBhY3RpdmF0ZSgpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChjaGlsZEVkaXRQb2xpY3kgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBjaGlsZEVkaXRQb2xpY3kudW5kZXJzdGFuZHNSZXF1ZXN0KHJlcSk7Ci0gICAgfQotCi0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9jdXN0b20vcG9saWNpZXMvQWN0aXZpdHlQYXJ0aXRpb25MYXlvdXRFZGl0UG9saWN5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvY3VzdG9tL3BvbGljaWVzL0FjdGl2aXR5UGFydGl0aW9uTGF5b3V0RWRpdFBvbGljeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZGI1OTBlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9jdXN0b20vcG9saWNpZXMvQWN0aXZpdHlQYXJ0aXRpb25MYXlvdXRFZGl0UG9saWN5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5jdXN0b20ucG9saWNpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuUmVzaXphYmxlU2hhcGVFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLlhZTGF5b3V0RWRpdFBvbGljeTsKLQotLyoqCi0gKiBYWUxheW91dFBvbGljeSBmb3IgQWN0aXZpdHlQYXJ0aXRpb24gdG8gaGFuZGxlIHRoZSBtb3ZlIG9mIGNoaWxkcmVuLgotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAd3JpdHRlbgotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZpdHlQYXJ0aXRpb25MYXlvdXRFZGl0UG9saWN5IGV4dGVuZHMgWFlMYXlvdXRFZGl0UG9saWN5IHsKLQotCXByb3RlY3RlZCBFZGl0UG9saWN5IGNyZWF0ZUNoaWxkRWRpdFBvbGljeShFZGl0UGFydCBjaGlsZCkgewotCQlFZGl0UG9saWN5IHJlc3VsdCA9IHN1cGVyLmNyZWF0ZUNoaWxkRWRpdFBvbGljeShjaGlsZCk7Ci0JCWlmIChyZXN1bHQgPT0gbnVsbCkgewotCQkJcmV0dXJuIG5ldyBSZXNpemFibGVTaGFwZUVkaXRQb2xpY3koKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRNb3ZlQ2hpbGRyZW5Db21tYW5kKFJlcXVlc3QgcmVxdWVzdCkgewotICAgICAgICByZXR1cm4gc3VwZXIuZ2V0TW92ZUNoaWxkcmVuQ29tbWFuZChyZXF1ZXN0KTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvY3VzdG9tL3BvbGljaWVzL0FjdGl2aXR5WFlMYXlvdXRFZGl0UG9saWN5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvY3VzdG9tL3BvbGljaWVzL0FjdGl2aXR5WFlMYXlvdXRFZGl0UG9saWN5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxMTNhOGMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2N1c3RvbS9wb2xpY2llcy9BY3Rpdml0eVhZTGF5b3V0RWRpdFBvbGljeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vKioKLSAqIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmN1c3RvbS5wb2xpY2llczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuQWN0aXZpdHlQYXJ0aXRpb25FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5wYXJ0LkFjdGl2aXR5RGlhZ3JhbUVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21wb3VuZENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLkNoYW5nZUJvdW5kc1JlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUuY29tbWFuZC5Db21tYW5kUmVzdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi5jb3JlLmNvbW1hbmQuQ29tcG9zaXRlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS5jb21tYW5kLklDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5jb21tYW5kcy5BZGRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS51dGlsLlZpZXdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuY29tbWFuZHMuSUNvbW1hbmRQcm94eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmNvbW1hbmRzLlNldEJvdW5kc0NvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuRGlhZ3JhbUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklHcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5TaGFwZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLlNoYXBlTm9kZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLlhZTGF5b3V0RWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmwxMG4uRGlhZ3JhbVVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXF1ZXN0cy5SZXF1ZXN0Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb3JlLnV0aWwuRU9iamVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5jb21tYW5kcy5FZGl0RWxlbWVudENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5JRWRpdENvbW1hbmRSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuTW92ZVJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uQm91bmRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkxheW91dENvbnN0cmFpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkFjdGl2aXR5Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eVBhcnRpdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLlVNTFBhY2thZ2U7Ci0KLS8qKgotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eVhZTGF5b3V0RWRpdFBvbGljeSBleHRlbmRzIFhZTGF5b3V0RWRpdFBvbGljeSB7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgQWN0aXZpdHlYWUxheW91dEVkaXRQb2xpY3koKSB7Ci0JfQotCi0JcHJvdGVjdGVkIENvbW1hbmQgY3JlYXRlQWRkQ29tbWFuZChFZGl0UGFydCBjaGlsZCwgT2JqZWN0IGNvbnN0cmFpbnQpIHsKLQkJT2JqZWN0IHBhcmVudCAgPSBjaGlsZC5nZXRQYXJlbnQoKTsJCQotCQlpZiAoKHBhcmVudCBpbnN0YW5jZW9mIEFjdGl2aXR5UGFydGl0aW9uRWRpdFBhcnQpICYmCi0JCQkoIGNoaWxkIGluc3RhbmNlb2YgU2hhcGVFZGl0UGFydCAmJiBjb25zdHJhaW50IGluc3RhbmNlb2YgUmVjdGFuZ2xlKSkgewotCQkJUmVjdGFuZ2xlIHJlY3QgPSAoUmVjdGFuZ2xlKSBjb25zdHJhaW50OwotCQkJSUZpZ3VyZSBwYXJlbnRGaWd1cmUgPSAoKEFjdGl2aXR5UGFydGl0aW9uRWRpdFBhcnQpcGFyZW50KS5nZXRGaWd1cmUoKTsJCQkKLQkJCVZpZXcgdmlldyA9IChWaWV3KSBjaGlsZC5nZXRNb2RlbCgpOwotCQkJYm9vbGVhbiBhZGp1c3RMb2NhdGlvbk5lZWRlZCA9IFZpZXdVdGlsCi0JCQkJCS5yZXNvbHZlU2VtYW50aWNFbGVtZW50KHZpZXcpICE9IG51bGwKLQkJCQkJfHwgcGFyZW50RmlndXJlLmdldEJvdW5kcygpLmNvbnRhaW5zKHJlY3QuZ2V0TG9jYXRpb24oKSk7Ci0JCQlpZihhZGp1c3RMb2NhdGlvbk5lZWRlZCkgewotCQkJCWludCB4ID0gcmVjdC54IC0gKChBY3Rpdml0eVBhcnRpdGlvbkVkaXRQYXJ0KSBwYXJlbnQpLmdldExvY2F0aW9uKCkueDsKLQkJCQlpbnQgeSA9IHJlY3QueSAtICgoQWN0aXZpdHlQYXJ0aXRpb25FZGl0UGFydCkgcGFyZW50KS5nZXRMb2NhdGlvbigpLnk7Ci0KLQkJCQlJQ29tbWFuZCBib3VuZHNDb21tYW5kID0gCi0JCQkJCW5ldyBTZXRCb3VuZHNDb21tYW5kKCgoU2hhcGVFZGl0UGFydCkgY2hpbGQpLmdldEVkaXRpbmdEb21haW4oKSwKLQkJCQkJCQlEaWFncmFtVUlNZXNzYWdlcy5TZXRMb2NhdGlvbkNvbW1hbmRfTGFiZWxfUmVzaXplLCAgLy8kTk9OLU5MUy0xJAotCQkJCQkJCW5ldyBFT2JqZWN0QWRhcHRlcih2aWV3KSwKLQkJCQkJCQkJCW5ldyBQb2ludCh4LCB5KSk7IAotCi0JCQkJCXJldHVybiBuZXcgSUNvbW1hbmRQcm94eShib3VuZHNDb21tYW5kKTsKLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIHN1cGVyLmNyZWF0ZUFkZENvbW1hbmQoY2hpbGQsIGNvbnN0cmFpbnQpOwotCX0KLQotCXByb3RlY3RlZCBDb21tYW5kIGdldE1vdmVDaGlsZHJlbkNvbW1hbmQoUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCXJldHVybiBzdXBlci5nZXRNb3ZlQ2hpbGRyZW5Db21tYW5kKHJlcXVlc3QpOwotCX0KLQotCi0JcHJvdGVjdGVkIENvbW1hbmQgY3JlYXRlQ2hhbmdlQ29uc3RyYWludENvbW1hbmQoRWRpdFBhcnQgY2hpbGQsCi0JCQlPYmplY3QgY29uc3RyYWludCkgewotCQlyZXR1cm4gc3VwZXIuY3JlYXRlQ2hhbmdlQ29uc3RyYWludENvbW1hbmQoY2hpbGQsIGNvbnN0cmFpbnQpOwotCX0KLQotCi0JcHJvdGVjdGVkIENvbW1hbmQgY3JlYXRlQ2hhbmdlQ29uc3RyYWludENvbW1hbmQoCi0JCQlDaGFuZ2VCb3VuZHNSZXF1ZXN0IHJlcXVlc3QsIEVkaXRQYXJ0IGNoaWxkLCBPYmplY3QgY29uc3RyYWludCkgewotCQlDb21tYW5kIGNtZCA9IHN1cGVyLmNyZWF0ZUNoYW5nZUNvbnN0cmFpbnRDb21tYW5kKHJlcXVlc3QsIGNoaWxkLAotCQkJCWNvbnN0cmFpbnQpOwotCQlpZiAoY2hpbGQgaW5zdGFuY2VvZiBBY3Rpdml0eVBhcnRpdGlvbkVkaXRQYXJ0KSB7Ci0JCQlMaXN0IGxpc3QgPSBnZXROb2Rlc0luUGFydGl0aW9uKChBY3Rpdml0eVBhcnRpdGlvbkVkaXRQYXJ0KSBjaGlsZCk7Ci0JCQlpZiAobGlzdCAhPSBudWxsICYmICFsaXN0LmlzRW1wdHkoKSkgewotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGxpc3QuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCUVkaXRQYXJ0IGVsZW1lbnQgPSAoRWRpdFBhcnQpIGl0ZXIubmV4dCgpOwotCQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFNoYXBlTm9kZUVkaXRQYXJ0KSB7Ci0JCQkJCQlDaGFuZ2VCb3VuZHNSZXF1ZXN0IHJlcSA9IG5ldyBDaGFuZ2VCb3VuZHNSZXF1ZXN0KAotCQkJCQkJCQlSRVFfUkVTSVpFX0NISUxEUkVOKTsKLQkJCQkJCXJlcS5zZXRFZGl0UGFydHMoZWxlbWVudCk7Ci0JCQkJCQlyZXEuc2V0TW92ZURlbHRhKHJlcXVlc3QuZ2V0TW92ZURlbHRhKCkpOwotCQkJCQkJcmVxLnNldFNpemVEZWx0YShyZXF1ZXN0LmdldFNpemVEZWx0YSgpKTsKLQkJCQkJCXJlcS5zZXRMb2NhdGlvbihyZXF1ZXN0LmdldExvY2F0aW9uKCkpOwotCQkJCQkJcmVxLnNldEV4dGVuZGVkRGF0YShyZXF1ZXN0LmdldEV4dGVuZGVkRGF0YSgpKTsKLQkJCQkJCXJlcS5zZXRSZXNpemVEaXJlY3Rpb24ocmVxdWVzdC5nZXRSZXNpemVEaXJlY3Rpb24oKSk7Ci0JCQkJCQljbWQgPSBjbWQuY2hhaW4oZWxlbWVudC5nZXRQYXJlbnQoKS5nZXRDb21tYW5kKHJlcSkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9ZWxzZXsKLQkJCUVkaXRQYXJ0IHBhcmVudCA9IGNoaWxkLmdldFBhcmVudCgpOwotCQkJaWYocGFyZW50IGluc3RhbmNlb2YgRGlhZ3JhbUVkaXRQYXJ0KXsKLQkJCQlMaXN0IGNoaWxkcmVuID0gKChEaWFncmFtRWRpdFBhcnQpcGFyZW50KS5nZXRDaGlsZHJlbigpOwotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGNoaWxkcmVuLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQlFZGl0UGFydCBwYXJ0ID0gKEVkaXRQYXJ0KSBpdGVyLm5leHQoKTsKLQkJCQkJaWYocGFydCBpbnN0YW5jZW9mIEFjdGl2aXR5UGFydGl0aW9uRWRpdFBhcnQpewotCQkJCQkJTm9kZSB2aWV3ID0gKE5vZGUpcGFydC5nZXRNb2RlbCgpOwotCQkJCQkJTGF5b3V0Q29uc3RyYWludCBsQ29uc3RhaW50ID0gdmlldy5nZXRMYXlvdXRDb25zdHJhaW50KCk7Ci0JCQkJCQlpZihsQ29uc3RhaW50IGluc3RhbmNlb2YgQm91bmRzKXsKLQkJCQkJCQlSZWN0YW5nbGUgcGFydGl0aW9uQ29uc3RyYWludCA9ICgoQWN0aXZpdHlQYXJ0aXRpb25FZGl0UGFydClwYXJ0KS5nZXRGaWd1cmUoKS5nZXRCb3VuZHMoKTsKLQkJCQkJCQlpZihjb25zdHJhaW50IGluc3RhbmNlb2YgUmVjdGFuZ2xlKXsKLQkJCQkJCQkJaWYocGFydGl0aW9uQ29uc3RyYWludC5jb250YWlucygoUmVjdGFuZ2xlKWNvbnN0cmFpbnQpKXsKLQkJCQkJCQkJCXJlcXVlc3Quc2V0VHlwZShSZXF1ZXN0Q29uc3RhbnRzLlJFUV9DUkVBVEUpOwotCQkJCQkJCQkJY21kID0gY21kLmNoYWluKHBhcnQuZ2V0Q29tbWFuZChyZXF1ZXN0KSk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9ZWxzZXsKLQkJCQkJCQlpZiAoQWN0aXZpdHlEaWFncmFtRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkuaXNEZWJ1Z2dpbmcoKSkgewotCQkJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxheW91dENvbnN0cmFpbnQ6ICIrIGxDb25zdGFpbnQpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBjbWQ7Ci0JfQotCQotCQotCXByaXZhdGUgc3RhdGljIExpc3QgZ2V0Tm9kZXNJblBhcnRpdGlvbihBY3Rpdml0eVBhcnRpdGlvbkVkaXRQYXJ0IGNoaWxkKSB7Ci0JCUxpc3Qgbm9kZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUFjdGl2aXR5UGFydGl0aW9uIHBhcnRpdGlvbiA9IChBY3Rpdml0eVBhcnRpdGlvbikoKE5vZGUpY2hpbGQuZ2V0TW9kZWwoKSkuZ2V0RWxlbWVudCgpOwotCQlMaXN0IGxpc3QgPSBwYXJ0aXRpb24uZ2V0Tm9kZXMoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gbGlzdC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gKE9iamVjdCkgaXRlci5uZXh0KCk7Ci0JCQlub2Rlcy5hZGQoZmluZEVkaXRQYXJ0eUJ5RWxlbWVudChjaGlsZC5nZXRQYXJlbnQoKSwgZWxlbWVudCkpOwotCQl9Ci0JCXJldHVybiBub2RlczsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgRWRpdFBhcnQgZmluZEVkaXRQYXJ0eUJ5RWxlbWVudChFZGl0UGFydCBwYXJlbnQsCi0JCQlPYmplY3QgZWxlbWVudCkgewotCQlMaXN0IGxpc3QgPSBwYXJlbnQuZ2V0Q2hpbGRyZW4oKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gbGlzdC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCUVkaXRQYXJ0IGVkaXRQYXJ0ID0gKEVkaXRQYXJ0KSBpdGVyLm5leHQoKTsKLQkJCWlmICgoKE5vZGUpIGVkaXRQYXJ0LmdldE1vZGVsKCkpLmdldEVsZW1lbnQoKSA9PSBlbGVtZW50KSB7Ci0JCQkJcmV0dXJuIGVkaXRQYXJ0OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBDb21tYW5kIGdldEFkZENvbW1hbmQoUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCUNvbXBvdW5kQ29tbWFuZCBjb21tYW5kID0gbmV3IENvbXBvdW5kQ29tbWFuZCgpOwotCQljb21tYW5kLnNldERlYnVnTGFiZWwoIkFkZCBpbiBDb25zdHJhaW5lZExheW91dEVkaXRQb2xpY3kgd2l0aCBSZXBhcmVudCBpZiBuZWNlc3NhcnkiKTsvLyROT04tTkxTLTEkCi0JCWNvbW1hbmQuYWRkKHN1cGVyLmdldEFkZENvbW1hbmQocmVxdWVzdCkpOwotCQkKLQkJSUdyYXBoaWNhbEVkaXRQYXJ0IGNoaWxkUGFydDsKLQkJaWYocmVxdWVzdCBpbnN0YW5jZW9mIENoYW5nZUJvdW5kc1JlcXVlc3QgJiYgcmVxdWVzdC5nZXRUeXBlKCkgPT0gUkVRX0FERCl7Ci0JCQlDaGFuZ2VCb3VuZHNSZXF1ZXN0IGNoYW5nZVJlcXVlc3QgPShDaGFuZ2VCb3VuZHNSZXF1ZXN0KXJlcXVlc3Q7IAotCQkJTGlzdCBlZGl0UGFydHMgPSBjaGFuZ2VSZXF1ZXN0LmdldEVkaXRQYXJ0cygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlZGl0UGFydHMuc2l6ZSgpOyBpKyspIHsKLQkJCQljaGlsZFBhcnQgPSAoSUdyYXBoaWNhbEVkaXRQYXJ0KWVkaXRQYXJ0cy5nZXQoaSk7Ci0JCQkJSUdyYXBoaWNhbEVkaXRQYXJ0IHBhcmVudCA9IChJR3JhcGhpY2FsRWRpdFBhcnQpY2hpbGRQYXJ0LmdldFBhcmVudCgpOwotCQkJCWlmKHBhcmVudCBpbnN0YW5jZW9mIEFjdGl2aXR5UGFydGl0aW9uRWRpdFBhcnQpewotCQkJCQlQb2ludCBwb2ludCA9IGNoaWxkUGFydC5nZXRGaWd1cmUoKS5nZXRCb3VuZHMoKS5nZXRMb2NhdGlvbigpLmdldENvcHkoKTsKLQkJCQkJcG9pbnQudHJhbnNsYXRlKGNoYW5nZVJlcXVlc3QuZ2V0TW92ZURlbHRhKCkpOwotCQkJCQlpZighcGFyZW50LmdldEZpZ3VyZSgpLmdldEJvdW5kcygpLmNvbnRhaW5zKHBvaW50KSl7Ci0JCQkJCQljb21tYW5kLmFkZChnZXRSZXBhcmVudENvbW1hbmQoY2hpbGRQYXJ0LCBwYXJlbnQsIGNoYW5nZVJlcXVlc3QpKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gY29tbWFuZC51bndyYXAoKTsKLS8vCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0UmVwYXJlbnRDb21tYW5kKElHcmFwaGljYWxFZGl0UGFydCBnZXAsIElHcmFwaGljYWxFZGl0UGFydCBvbGRQYXJlbnQsCi0JCQlDaGFuZ2VCb3VuZHNSZXF1ZXN0IGNoYW5nZVJlcXVlc3QpIHsKLQkJQ29tcG9zaXRlQ29tbWFuZCBjYyA9IG5ldyBDb21wb3NpdGVDb21tYW5kKERpYWdyYW1VSU1lc3NhZ2VzLkFkZENvbW1hbmRfTGFiZWwpOyAKLQkJVmlldyBjb250YWluZXIgPSAoVmlldylnZXRIb3N0KCkuZ2V0TW9kZWwoKTsKLQkJRU9iamVjdCBjb250ZXh0ID0gVmlld1V0aWwucmVzb2x2ZVNlbWFudGljRWxlbWVudChjb250YWluZXIpOwotCQlWaWV3IHZpZXcgPSAoVmlldylnZXAuZ2V0TW9kZWwoKTsKLQkJRU9iamVjdCBlbGVtZW50ID0gVmlld1V0aWwucmVzb2x2ZVNlbWFudGljRWxlbWVudCh2aWV3KTsKLQotICAgICAgICBUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiBlZGl0aW5nRG9tYWluID0gKChJR3JhcGhpY2FsRWRpdFBhcnQpIGdldEhvc3QoKSkKLSAgICAgICAgICAgIC5nZXRFZGl0aW5nRG9tYWluKCk7Ci0gICAgICAgIAotCQlpZiAoIGVsZW1lbnQgIT0gbnVsbCApIHsKLQkJCWNjLmNvbXBvc2UobmV3IFJlcGFyZW50aW5nRWxlbWVudHNDb21tYW5kKG5ldyBNb3ZlUmVxdWVzdChlZGl0aW5nRG9tYWluLCBjb250ZXh0LCBVTUxQYWNrYWdlLmVJTlNUQU5DRS5nZXRBY3Rpdml0eV9Ob2RlKCksIGVsZW1lbnQpLAotCQkJCQllbGVtZW50LHZpZXcsIG9sZFBhcmVudCkpOwotCQkJY2MuY29tcG9zZShuZXcgQWRkQ29tbWFuZChnZXAuZ2V0RWRpdGluZ0RvbWFpbigpLCBuZXcgRU9iamVjdEFkYXB0ZXIoY29udGFpbmVyKSwKLQkJCQkJICBuZXcgRU9iamVjdEFkYXB0ZXIodmlldykpKTsKLQkJCWNjLmNvbXBvc2UoYWRqdXN0TG9jYXRpb25Db21tYW5kKGdlcCwgY2hhbmdlUmVxdWVzdCkpOwotCQl9Ci0JCXJldHVybiBjYy5pc0VtcHR5KCkgPyBudWxsIDogbmV3IElDb21tYW5kUHJveHkoY2MucmVkdWNlKCkpOwotCX0KLQkKLQkKLQlwdWJsaWMgY2xhc3MgUmVwYXJlbnRpbmdFbGVtZW50c0NvbW1hbmQgZXh0ZW5kcyBFZGl0RWxlbWVudENvbW1hbmR7Ci0KLQkJcHJpdmF0ZSBmaW5hbCBFT2JqZWN0IG1vdmVFbGVtZW50OwotCQlwcml2YXRlIElHcmFwaGljYWxFZGl0UGFydCBvbGRQYXJlbnQ7Ci0JCXByaXZhdGUgVmlldyB2aWV3OwotCQkKLQkJcHVibGljIFJlcGFyZW50aW5nRWxlbWVudHNDb21tYW5kKE1vdmVSZXF1ZXN0IHJlcSwgRU9iamVjdCBlbGVtZW50LCBWaWV3IHZpZXcsIAotCQkJCUlHcmFwaGljYWxFZGl0UGFydCBvbGRQYXJlbnQpIHsKLQkJCXRoaXMoInJlcGFyZW50IG9uIG1vdmUiLCBlbGVtZW50LCByZXEpOyAvLyROT04tTkxTLTEkCi0JCQl0aGlzLm9sZFBhcmVudCA9IG9sZFBhcmVudDsKLQkJCXRoaXMudmlldyA9IHZpZXc7Ci0JCX0KLQkJCi0JCXByb3RlY3RlZCBSZXBhcmVudGluZ0VsZW1lbnRzQ29tbWFuZChTdHJpbmcgbGFiZWwsIEVPYmplY3QgZWxlbWVudFRvRWRpdCwgCi0JCQkJSUVkaXRDb21tYW5kUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCQlzdXBlcihsYWJlbCwgZWxlbWVudFRvRWRpdCwgcmVxdWVzdCk7Ci0JCQl0aGlzLm1vdmVFbGVtZW50ID0gZWxlbWVudFRvRWRpdDsgCi0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIENvbW1hbmRSZXN1bHQgZG9FeGVjdXRlV2l0aFJlc3VsdChJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCQlWaWV3IHBhcmVudFZpZXcgPSAoVmlldylnZXRIb3N0KCkuZ2V0TW9kZWwoKTsKLQkJCWlmKHBhcmVudFZpZXcuZ2V0RWxlbWVudCgpIGluc3RhbmNlb2YgQWN0aXZpdHkpewotCQkJCWlmKG1vdmVFbGVtZW50IGluc3RhbmNlb2YgQWN0aXZpdHlOb2RlKXsKLQkJCQkJVmlldyBvbGRQYXJlbnRWaWV3ID0gKFZpZXcpb2xkUGFyZW50LmdldE1vZGVsKCk7Ci0JCQkJCSgoQWN0aXZpdHlOb2RlKW1vdmVFbGVtZW50KS5nZXRJblBhcnRpdGlvbnMoKS5yZW1vdmUob2xkUGFyZW50Vmlldy5nZXRFbGVtZW50KCkpOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgYm9vbGVhbiBjYW5FeGVjdXRlKCkgewotCQkJaWYobW92ZUVsZW1lbnQgIT0gbnVsbCkgcmV0dXJuIHRydWU7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tbWFuZCBhZGp1c3RMb2NhdGlvbkNvbW1hbmQoSUdyYXBoaWNhbEVkaXRQYXJ0IGNoaWxkLAotCQkJQ2hhbmdlQm91bmRzUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCWlmIChjaGlsZCBpbnN0YW5jZW9mIFNoYXBlRWRpdFBhcnQpIHsKLQkJCVBvaW50IGxvY2F0aW9uID0gcmVxdWVzdC5nZXRNb3ZlRGVsdGEoKS5nZXRDb3B5KCk7Ci0JCQlQb2ludCBjaGlsZExvY2F0aW9uID0gY2hpbGQuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCkuZ2V0TG9jYXRpb24oKTsKLQkJCWxvY2F0aW9uLngrPWNoaWxkTG9jYXRpb24ueDsKLQkJCWxvY2F0aW9uLnkrPWNoaWxkTG9jYXRpb24ueTsKLQkJCUlDb21tYW5kIGJvdW5kc0NvbW1hbmQgPSBuZXcgU2V0Qm91bmRzQ29tbWFuZCgKLQkJCQkJKChTaGFwZUVkaXRQYXJ0KSBjaGlsZCkuZ2V0RWRpdGluZ0RvbWFpbigpLAotCQkJCQlEaWFncmFtVUlNZXNzYWdlcy5TZXRMb2NhdGlvbkNvbW1hbmRfTGFiZWxfUmVzaXplLCAvLyROT04tTkxTLTEkCi0JCQkJCW5ldyBFT2JqZWN0QWRhcHRlcigoVmlldykgY2hpbGQuZ2V0TW9kZWwoKSksCi0JCQkJCWxvY2F0aW9uKTsKLQotCQkJcmV0dXJuIGJvdW5kc0NvbW1hbmQ7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2N1c3RvbS9wb2xpY2llcy9EeW5hbWljUmVzaXplRGlyZWN0aW9uc0VkaXRQb2xpY3kuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9jdXN0b20vcG9saWNpZXMvRHluYW1pY1Jlc2l6ZURpcmVjdGlvbnNFZGl0UG9saWN5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiYWMyZjAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2N1c3RvbS9wb2xpY2llcy9EeW5hbWljUmVzaXplRGlyZWN0aW9uc0VkaXRQb2xpY3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyOCArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmN1c3RvbS5wb2xpY2llczsKLQotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNiBCb3JsYW5kIFNvZnR3YXJlIENvcnBvcmF0aW9uCi0gKiAKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgWXVyeSBDaGVybmlrb3YgKEJvcmxhbmQpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAKLSAqICAgIAotICogICAgTW9kaWZpZWQgOgotICogIAlTaGlscGEgVG9yYXNrYXIKLSAqLwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuUG9zaXRpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LkRpbWVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmxpc3RlbmVyLkRpYWdyYW1FdmVudEJyb2tlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUubGlzdGVuZXIuTm90aWZpY2F0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLlJlc2l6YWJsZVNoYXBlRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob3RhdGlvblBhY2thZ2U7Ci0KLXB1YmxpYyBjbGFzcyBEeW5hbWljUmVzaXplRGlyZWN0aW9uc0VkaXRQb2xpY3kgZXh0ZW5kcyBSZXNpemFibGVTaGFwZUVkaXRQb2xpY3kgaW1wbGVtZW50cyBOb3RpZmljYXRpb25MaXN0ZW5lciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVkVSVElDQUwgPSAtMTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTUVVBUkUgPSAwOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEhPUklaT05UQUwgPSAxOwotCi0JcHJpdmF0ZSBpbnQgbXlDdXJyZW50U3RhdGU7Ci0JCi0JcHVibGljIER5bmFtaWNSZXNpemVEaXJlY3Rpb25zRWRpdFBvbGljeSgpewotCQlteUN1cnJlbnRTdGF0ZSA9IEhPUklaT05UQUw7Ci0JCXNldFJlc2l6ZURpcmVjdGlvbnMoUG9zaXRpb25Db25zdGFudHMuRUFTVCB8IFBvc2l0aW9uQ29uc3RhbnRzLldFU1QpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBhY3RpdmF0ZSgpIHsKLQkJc3VwZXIuYWN0aXZhdGUoKTsKLQkJZ2V0RGlhZ3JhbUV2ZW50QnJva2VyKCkuYWRkTm90aWZpY2F0aW9uTGlzdGVuZXIoZ2V0SG9zdEltcGwoKS5nZXROb3RhdGlvblZpZXcoKSwgdGhpcyk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGRlYWN0aXZhdGUoKSB7Ci0JCWdldERpYWdyYW1FdmVudEJyb2tlcigpLnJlbW92ZU5vdGlmaWNhdGlvbkxpc3RlbmVyKGdldEhvc3RJbXBsKCkuZ2V0Tm90YXRpb25WaWV3KCksIHRoaXMpOwotCQlzdXBlci5kZWFjdGl2YXRlKCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGhvc3RTaXplQ2hhbmdlZCgpewotCQlJR3JhcGhpY2FsRWRpdFBhcnQgaG9zdCA9IGdldEhvc3RJbXBsKCk7Ci0JCUludGVnZXIgd2lkdGggPSAoSW50ZWdlcikgaG9zdC5nZXRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2l6ZV9XaWR0aCgpKTsKLQkJSW50ZWdlciBoZWlnaHQgPSAoSW50ZWdlcikgaG9zdC5nZXRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2l6ZV9IZWlnaHQoKSk7Ci0JCWlmICh3aWR0aCA9PSBudWxsKXsKLQkJCXdpZHRoID0gSW50ZWdlci52YWx1ZU9mKDApOwotCQl9Ci0JCWlmIChoZWlnaHQgPT0gbnVsbCl7Ci0JCQloZWlnaHQgPSBJbnRlZ2VyLnZhbHVlT2YoMCk7Ci0JCX0KLQkJRGltZW5zaW9uIHNpemUgPSBuZXcgRGltZW5zaW9uKHdpZHRoLCBoZWlnaHQpOwotCQljb3JyZWN0RWRpdFBvbGljeShzaXplKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJT2JqZWN0IGZlYXR1cmUgPSBub3RpZmljYXRpb24uZ2V0RmVhdHVyZSgpOwotCQlpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRTaXplX1dpZHRoKCkuZXF1YWxzKGZlYXR1cmUpIHx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2l6ZV9IZWlnaHQoKS5lcXVhbHMoZmVhdHVyZSkpIHsKLQkJCWhvc3RTaXplQ2hhbmdlZCgpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjb3JyZWN0RWRpdFBvbGljeShEaW1lbnNpb24gc2l6ZSkgewotCQlpZiAoaXNDaGFuZ2VkKHNpemUpKSB7Ci0JCQloaWRlU2VsZWN0aW9uKCk7Ci0JCQlzZXRTdGF0ZShzaXplKTsKLQkJCXNob3dTZWxlY3Rpb24oKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIElHcmFwaGljYWxFZGl0UGFydCBnZXRIb3N0SW1wbCgpewotCQlyZXR1cm4gKElHcmFwaGljYWxFZGl0UGFydCkgZ2V0SG9zdCgpOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc0NoYW5nZWQoRGltZW5zaW9uIHNpemUpIHsKLQkJcmV0dXJuIChzaXplLmhlaWdodCAtIHNpemUud2lkdGgpICogbXlDdXJyZW50U3RhdGUgPiAwOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFN0YXRlKERpbWVuc2lvbiBzaXplKSB7Ci0JCWludCBkZWx0YSA9IHNpemUuaGVpZ2h0IC0gc2l6ZS53aWR0aDsKLQkJaWYgKGRlbHRhID4gMCkgewotCQkJbXlDdXJyZW50U3RhdGUgPSBWRVJUSUNBTDsKLQkJCXNldFJlc2l6ZURpcmVjdGlvbnMoUG9zaXRpb25Db25zdGFudHMuTk9SVEggfCBQb3NpdGlvbkNvbnN0YW50cy5TT1VUSCk7Ci0JCX0gZWxzZSBpZiAoZGVsdGEgPCAwKSB7Ci0JCQlteUN1cnJlbnRTdGF0ZSA9IEhPUklaT05UQUw7Ci0JCQlzZXRSZXNpemVEaXJlY3Rpb25zKFBvc2l0aW9uQ29uc3RhbnRzLldFU1QgfCBQb3NpdGlvbkNvbnN0YW50cy5FQVNUKTsKLQkJfSBlbHNlIHsKLQkJCW15Q3VycmVudFN0YXRlID0gU1FVQVJFOwotCQl9Ci0JfQotCQotICAgIHByaXZhdGUgRGlhZ3JhbUV2ZW50QnJva2VyIGdldERpYWdyYW1FdmVudEJyb2tlcigpIHsKLSAgICAJcmV0dXJuIERpYWdyYW1FdmVudEJyb2tlci5nZXRJbnN0YW5jZShnZXRIb3N0SW1wbCgpLmdldEVkaXRpbmdEb21haW4oKSk7Ci0gICAgfQotCQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgc2hvd1NlbGVjdGlvbigpIHsgCQotICAgIAkvLyBzZXQgc3RhdGUgY29ycmVjdGx5IGJlZm9yZSBzaG93aW5nIGl0LgotICAgIAlJR3JhcGhpY2FsRWRpdFBhcnQgaG9zdCA9IGdldEhvc3RJbXBsKCk7Ci0JCUludGVnZXIgd2lkdGggPSAoSW50ZWdlcikgaG9zdC5nZXRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2l6ZV9XaWR0aCgpKTsKLQkJSW50ZWdlciBoZWlnaHQgPSAoSW50ZWdlcikgaG9zdC5nZXRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2l6ZV9IZWlnaHQoKSk7Ci0JCWlmICh3aWR0aCA9PSBudWxsKXsKLQkJCXdpZHRoID0gSW50ZWdlci52YWx1ZU9mKDApOwotCQl9Ci0JCWlmIChoZWlnaHQgPT0gbnVsbCl7Ci0JCQloZWlnaHQgPSBJbnRlZ2VyLnZhbHVlT2YoMCk7Ci0JCX0KLQkJRGltZW5zaW9uIHNpemUgPSBuZXcgRGltZW5zaW9uKHdpZHRoLCBoZWlnaHQpOwotICAgIAlzZXRTdGF0ZShzaXplKTsKLSAgICAJICAgIAkKLSAgICAJc3VwZXIuc2hvd1NlbGVjdGlvbigpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9jdXN0b20vcG9saWNpZXMvT3BlbkFERWRpdFBvbGljeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2N1c3RvbS9wb2xpY2llcy9PcGVuQURFZGl0UG9saWN5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiZDI4ODIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2N1c3RvbS9wb2xpY2llcy9PcGVuQURFZGl0UG9saWN5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vKioKLSAqIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmN1c3RvbS5wb2xpY2llczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnBhcnQuQWN0aXZpdHlEaWFncmFtRWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuYnJpZGdlLkJyaWRnZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLmJyaWRnZS5EaWFncmFtQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLmJyaWRnZS5Ob2RlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnBhcnQuRGlhZ3JhbUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUucGFydC51dGlsLkRpYWdyYW1FZGl0b3JVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUudXRpbC5EaWFncmFtQ29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLklEaWFncmFtTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuR3JhcGhpY2FsVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLkRpYWdyYW1FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JR3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuT3BlbkVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wYXJ0cy5EaWFncmFtRWRpdERvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5EaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci0KLS8qKgotICogTW91c2UgZG91YmxlIGNsaWNrIG9uIFN0cnVjdHVyZWRBY3Rpdml0eUVkaXRQYXJ0IHNob3VsZCBvcGVuIGRpYWdyYW0uIAotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKgotICovCi1wdWJsaWMgY2xhc3MgT3BlbkFERWRpdFBvbGljeSBleHRlbmRzIE9wZW5FZGl0UG9saWN5IHsKLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLk9wZW5FZGl0UG9saWN5I2dldE9wZW5Db21tYW5kKG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0KQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBDb21tYW5kIGdldE9wZW5Db21tYW5kKFJlcXVlc3QgcmVxdWVzdCkgewotCQlFZGl0UGFydCB0YXJnZXRFZGl0UGFydCA9IGdldFRhcmdldEVkaXRQYXJ0KHJlcXVlc3QpOwotCQlpZiAodGFyZ2V0RWRpdFBhcnQgaW5zdGFuY2VvZiBJR3JhcGhpY2FsRWRpdFBhcnQpIHsKLQkJCU5vZGUgdmlldyA9IChOb2RlKSB0YXJnZXRFZGl0UGFydC5nZXRNb2RlbCgpOwotCi0JCQlEaWFncmFtRWRpdFBhcnQgZGlhZ3JhbUVkaXRQYXJ0ID0gRGlhZ3JhbUNvcmVVdGlsLmdldERpYWdyYW1FZGl0UGFydCh0YXJnZXRFZGl0UGFydCk7Ci0JCQlEaWFncmFtIGRpYWdyYW0gPSAoRGlhZ3JhbSkgZGlhZ3JhbUVkaXRQYXJ0LmdldE1vZGVsKCk7Ci0JCQlEaWFncmFtQWRhcHRlciBkaWFncmFtQWRhcHRlciA9IEJyaWRnZUhlbHBlcgotCQkJCQkuZ2V0RGlhZ3JhbUFkYXB0ZXIoZGlhZ3JhbS5nZXRFbGVtZW50KCkpOwotCQkJRU9iamVjdCBlbGVtZW50ID0gdmlldy5nZXRFbGVtZW50KCk7Ci0JCQlOb2RlQWRhcHRlciBhZGFwdGVyID0gQnJpZGdlSGVscGVyCi0JCQkJCS5nZXROb2RlQWRhcHRlcihlbGVtZW50KTsKLQkJCWlmIChhZGFwdGVyICE9IG51bGwgJiYgYWRhcHRlci5nZXRFbGVtZW50KCkgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCU9iamVjdCBzZWxlY3RlZE9iamVjdCA9IGFkYXB0ZXIuZ2V0V3JhcHBlcigpOwotCQkJCWlmIChzZWxlY3RlZE9iamVjdCA9PSBudWxsKSB7Ci0JCQkJCXNlbGVjdGVkT2JqZWN0ID0gYWRhcHRlci5nZXRFbGVtZW50KCk7Ci0JCQkJfQotCQkJCUdyYXBoaWNhbFZpZXdlciB2aWV3ZXIgPSAoR3JhcGhpY2FsVmlld2VyKSBkaWFncmFtRWRpdFBhcnQKLQkJCQkJCS5nZXRWaWV3ZXIoKTsKLQkJCQlpZiAodmlld2VyICE9IG51bGwpIHsKLQkJCQkJRGlhZ3JhbUVkaXREb21haW4gZG9tYWluID0gKERpYWdyYW1FZGl0RG9tYWluKSB2aWV3ZXIKLQkJCQkJCQkuZ2V0RWRpdERvbWFpbigpOwotCQkJCQlJV29ya2JlbmNoUGFydCBwYXJ0ID0gZG9tYWluLmdldERpYWdyYW1FZGl0b3JQYXJ0KCk7Ci0JCQkJCWlmIChwYXJ0ICE9IG51bGwpIHsKLQkJCQkJCURpYWdyYW1FZGl0b3JJbnB1dCBpbnB1dCA9IG5ldyBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnBhcnQuRGlhZ3JhbUVkaXRvcklucHV0KAotCQkJCQkJCQlzZWxlY3RlZE9iamVjdCwKLQkJCQkJCQkJZGlhZ3JhbUFkYXB0ZXIuZ2V0U3VwcHJlc3Npb24oKSwKLQkJCQkJCQkJSURpYWdyYW1NYW5hZ2VyLkFDVElWSVRZX0RJQUdSQU0pOwotCQkJCQkJdHJ5ewotCQkJCQkJRGlhZ3JhbUVkaXRvclV0aWwKLQkJCQkJCQkJLm9wZW5EaWFncmFtRWRpdG9yKAotCQkJCQkJCQkJCXBhcnQuZ2V0U2l0ZSgpLmdldFBhZ2UoKSwKLQkJCQkJCQkJCQlpbnB1dCwKLQkJCQkJCQkJCQlBY3Rpdml0eURpYWdyYW1FZGl0b3JQbHVnaW4uRElBR1JBTV9QUkVGRVJFTkNFU19ISU5ULAotCQkJCQkJCQkJCW5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQkJCQkJfWNhdGNoKEV4Y2VwdGlvbiBlKXsKLQkJCQkJCQkKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L2NvbW1hbmRzL0FjdGl2aXR5RmluYWxOb2RlQ3JlYXRlQ29tbWFuZC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvY29tbWFuZHMvQWN0aXZpdHlGaW5hbE5vZGVDcmVhdGVDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5MDJjMTEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvY29tbWFuZHMvQWN0aXZpdHlGaW5hbE5vZGVDcmVhdGVDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQuY29tbWFuZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5jb21tYW5kcy5DcmVhdGVFbGVtZW50Q29tbWFuZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ3JlYXRlRWxlbWVudFJlcXVlc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuVU1MUGFja2FnZTsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eUZpbmFsTm9kZUNyZWF0ZUNvbW1hbmQgZXh0ZW5kcyBDcmVhdGVFbGVtZW50Q29tbWFuZCB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFjdGl2aXR5RmluYWxOb2RlQ3JlYXRlQ29tbWFuZChDcmVhdGVFbGVtZW50UmVxdWVzdCByZXEpIHsKLQkJc3VwZXIocmVxKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBnZXRFQ2xhc3NUb0VkaXQoKSB7Ci0JCXJldHVybiBVTUxQYWNrYWdlLmVJTlNUQU5DRS5nZXRBY3Rpdml0eSgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRU9iamVjdCBnZXRFbGVtZW50VG9FZGl0KCkgewotCQlFT2JqZWN0IGNvbnRhaW5lciA9ICgoQ3JlYXRlRWxlbWVudFJlcXVlc3QpIGdldFJlcXVlc3QoKSkKLQkJCQkuZ2V0Q29udGFpbmVyKCk7Ci0JCWlmIChjb250YWluZXIgaW5zdGFuY2VvZiBWaWV3KSB7Ci0JCQljb250YWluZXIgPSAoKFZpZXcpIGNvbnRhaW5lcikuZ2V0RWxlbWVudCgpOwotCQl9Ci0JCXJldHVybiBjb250YWluZXI7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9jb21tYW5kcy9BY3Rpdml0eVBhcmFtZXRlck5vZGVDcmVhdGVDb21tYW5kLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9jb21tYW5kcy9BY3Rpdml0eVBhcmFtZXRlck5vZGVDcmVhdGVDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4YzZiMGYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvY29tbWFuZHMvQWN0aXZpdHlQYXJhbWV0ZXJOb2RlQ3JlYXRlQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5jb21tYW5kczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5wcm92aWRlcnMuVU1MRWxlbWVudFR5cGVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5jb21tYW5kcy5DcmVhdGVFbGVtZW50Q29tbWFuZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ3JlYXRlRWxlbWVudFJlcXVlc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuQWN0aXZpdHlQYXJhbWV0ZXJOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLlVNTFBhY2thZ2U7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZpdHlQYXJhbWV0ZXJOb2RlQ3JlYXRlQ29tbWFuZCBleHRlbmRzIENyZWF0ZUVsZW1lbnRDb21tYW5kIHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWN0aXZpdHlQYXJhbWV0ZXJOb2RlQ3JlYXRlQ29tbWFuZChDcmVhdGVFbGVtZW50UmVxdWVzdCByZXEpIHsKLQkJc3VwZXIocmVxKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBnZXRFQ2xhc3NUb0VkaXQoKSB7Ci0JCXJldHVybiBVTUxQYWNrYWdlLmVJTlNUQU5DRS5nZXRBY3Rpdml0eSgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRU9iamVjdCBnZXRFbGVtZW50VG9FZGl0KCkgewotCQlFT2JqZWN0IGNvbnRhaW5lciA9ICgoQ3JlYXRlRWxlbWVudFJlcXVlc3QpIGdldFJlcXVlc3QoKSkKLQkJCQkuZ2V0Q29udGFpbmVyKCk7Ci0JCWlmIChjb250YWluZXIgaW5zdGFuY2VvZiBWaWV3KSB7Ci0JCQljb250YWluZXIgPSAoKFZpZXcpIGNvbnRhaW5lcikuZ2V0RWxlbWVudCgpOwotCQl9Ci0JCXJldHVybiBjb250YWluZXI7Ci0JfQotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJvdGVjdGVkIEVPYmplY3QgZG9EZWZhdWx0RWxlbWVudENyZWF0aW9uKCkgewotCQlBY3Rpdml0eVBhcmFtZXRlck5vZGUgbmV3RWxlbWVudCA9IChBY3Rpdml0eVBhcmFtZXRlck5vZGUpIHN1cGVyCi0JCQkJLmRvRGVmYXVsdEVsZW1lbnRDcmVhdGlvbigpOwotCQlpZiAobmV3RWxlbWVudCAhPSBudWxsCi0JCQkJJiYgVU1MRWxlbWVudFR5cGVzLkFjdGl2aXR5UGFyYW1ldGVyTm9kZV8xMDA5ID09ICgoQ3JlYXRlRWxlbWVudFJlcXVlc3QpIGdldFJlcXVlc3QoKSkKLQkJCQkJCS5nZXRFbGVtZW50VHlwZSgpKSB7Ci0JCQlVTUxFbGVtZW50VHlwZXMuSW5pdGlhbGl6ZXJzLkFjdGl2aXR5UGFyYW1ldGVyTm9kZV8xMDA5Ci0JCQkJCS5pbml0KG5ld0VsZW1lbnQpOwotCQl9Ci0JCWlmIChuZXdFbGVtZW50ICE9IG51bGwKLQkJCQkmJiBVTUxFbGVtZW50VHlwZXMuQWN0aXZpdHlQYXJhbWV0ZXJOb2RlXzEwMTIgPT0gKChDcmVhdGVFbGVtZW50UmVxdWVzdCkgZ2V0UmVxdWVzdCgpKQotCQkJCQkJLmdldEVsZW1lbnRUeXBlKCkpIHsKLQkJCVVNTEVsZW1lbnRUeXBlcy5Jbml0aWFsaXplcnMuQWN0aXZpdHlQYXJhbWV0ZXJOb2RlXzEwMTIKLQkJCQkJLmluaXQobmV3RWxlbWVudCk7Ci0JCX0KLQkJcmV0dXJuIG5ld0VsZW1lbnQ7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9jb21tYW5kcy9BY3Rpdml0eVBhcnRpdGlvbkNyZWF0ZUNvbW1hbmQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L2NvbW1hbmRzL0FjdGl2aXR5UGFydGl0aW9uQ3JlYXRlQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNTMwOTc3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L2NvbW1hbmRzL0FjdGl2aXR5UGFydGl0aW9uQ3JlYXRlQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5jb21tYW5kczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLmNvbW1hbmRzLkNyZWF0ZUVsZW1lbnRDb21tYW5kOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5DcmVhdGVFbGVtZW50UmVxdWVzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5VTUxQYWNrYWdlOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXR5UGFydGl0aW9uQ3JlYXRlQ29tbWFuZCBleHRlbmRzIENyZWF0ZUVsZW1lbnRDb21tYW5kIHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWN0aXZpdHlQYXJ0aXRpb25DcmVhdGVDb21tYW5kKENyZWF0ZUVsZW1lbnRSZXF1ZXN0IHJlcSkgewotCQlzdXBlcihyZXEpOwotCX0KLQotCS8qKgotCSAqIEBtb2RpZmllZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZ2V0RUNsYXNzVG9FZGl0KCkgewotCQlyZXR1cm4gVU1MUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QWN0aXZpdHkoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVPYmplY3QgZ2V0RWxlbWVudFRvRWRpdCgpIHsKLQkJRU9iamVjdCBjb250YWluZXIgPSAoKENyZWF0ZUVsZW1lbnRSZXF1ZXN0KSBnZXRSZXF1ZXN0KCkpCi0JCQkJLmdldENvbnRhaW5lcigpOwotCQlpZiAoY29udGFpbmVyIGluc3RhbmNlb2YgVmlldykgewotCQkJY29udGFpbmVyID0gKChWaWV3KSBjb250YWluZXIpLmdldEVsZW1lbnQoKTsKLQkJfQotCQlyZXR1cm4gY29udGFpbmVyOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvY29tbWFuZHMvQ29udHJvbEZsb3dDcmVhdGVDb21tYW5kLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9jb21tYW5kcy9Db250cm9sRmxvd0NyZWF0ZUNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzA1ZjdhYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9jb21tYW5kcy9Db250cm9sRmxvd0NyZWF0ZUNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LmNvbW1hbmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuY29tbWFuZHMuQ3JlYXRlUmVsYXRpb25zaGlwQ29tbWFuZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkFjdGl2aXR5Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5Db250cm9sRmxvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLlVNTFBhY2thZ2U7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQ29udHJvbEZsb3dDcmVhdGVDb21tYW5kIGV4dGVuZHMgQ3JlYXRlUmVsYXRpb25zaGlwQ29tbWFuZCB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlIG15Q29udGFpbmVyOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgQWN0aXZpdHlOb2RlIG15U291cmNlOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgQWN0aXZpdHlOb2RlIG15VGFyZ2V0OwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb250cm9sRmxvd0NyZWF0ZUNvbW1hbmQoQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdCByZXEsCi0JCQlTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlIGNvbnRhaW5lciwgQWN0aXZpdHlOb2RlIHNvdXJjZSwKLQkJCUFjdGl2aXR5Tm9kZSB0YXJnZXQpIHsKLQkJc3VwZXIocmVxKTsKLQkJc3VwZXIuc2V0RWxlbWVudFRvRWRpdChjb250YWluZXIpOwotCQlteUNvbnRhaW5lciA9IGNvbnRhaW5lcjsKLQkJbXlTb3VyY2UgPSBzb3VyY2U7Ci0JCW15VGFyZ2V0ID0gdGFyZ2V0OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZSBnZXRDb250YWluZXIoKSB7Ci0JCXJldHVybiBteUNvbnRhaW5lcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVPYmplY3QgZ2V0U291cmNlKCkgewotCQlyZXR1cm4gbXlTb3VyY2U7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFT2JqZWN0IGdldFRhcmdldCgpIHsKLQkJcmV0dXJuIG15VGFyZ2V0OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGdldEVDbGFzc1RvRWRpdCgpIHsKLQkJcmV0dXJuIFVNTFBhY2thZ2UuZUlOU1RBTkNFLmdldFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0RWxlbWVudFRvRWRpdChFT2JqZWN0IGVsZW1lbnQpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFT2JqZWN0IGRvRGVmYXVsdEVsZW1lbnRDcmVhdGlvbigpIHsKLQkJQ29udHJvbEZsb3cgbmV3RWxlbWVudCA9IChDb250cm9sRmxvdykgc3VwZXIuZG9EZWZhdWx0RWxlbWVudENyZWF0aW9uKCk7Ci0JCWlmIChuZXdFbGVtZW50ICE9IG51bGwpIHsKLQkJCW5ld0VsZW1lbnQuc2V0VGFyZ2V0KG15VGFyZ2V0KTsKLQkJCW5ld0VsZW1lbnQuc2V0U291cmNlKG15U291cmNlKTsKLQkJfQotCQlyZXR1cm4gbmV3RWxlbWVudDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L2NvbW1hbmRzL0NvbnRyb2xGbG93UmVvcmllbnRDb21tYW5kLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9jb21tYW5kcy9Db250cm9sRmxvd1Jlb3JpZW50Q29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOTc2YzA5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L2NvbW1hbmRzL0NvbnRyb2xGbG93UmVvcmllbnRDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5jb21tYW5kczsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS51dGlsLkRpYWdyYW1Db3JlVmFsaWRhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLlVuZXhlY3V0YWJsZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUuY29tbWFuZC5Db21tYW5kUmVzdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuY29tbWFuZHMuRWRpdEVsZW1lbnRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuUmVvcmllbnRSZWxhdGlvbnNoaXBSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkFjdGl2aXR5RWRnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuQ29udHJvbEZsb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuRGVjaXNpb25Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkZvcmtOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkpvaW5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLk1lcmdlTm9kZTsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBzaW5jZSAxLjIKLSAqLwotcHVibGljIGNsYXNzIENvbnRyb2xGbG93UmVvcmllbnRDb21tYW5kIGV4dGVuZHMgRWRpdEVsZW1lbnRDb21tYW5kIHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIGZpbmFsIGludCByZW9yaWVudERpcmVjdGlvbjsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIGZpbmFsIEVPYmplY3Qgb2xkRW5kOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgZmluYWwgRU9iamVjdCBuZXdFbmQ7Ci0KLQlwcml2YXRlIEVkaXRQYXJ0IGhvc3Q7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENvbnRyb2xGbG93UmVvcmllbnRDb21tYW5kKFJlb3JpZW50UmVsYXRpb25zaGlwUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCXN1cGVyKHJlcXVlc3QuZ2V0TGFiZWwoKSwgcmVxdWVzdC5nZXRSZWxhdGlvbnNoaXAoKSwgcmVxdWVzdCk7Ci0JCXJlb3JpZW50RGlyZWN0aW9uID0gcmVxdWVzdC5nZXREaXJlY3Rpb24oKTsKLQkJb2xkRW5kID0gcmVxdWVzdC5nZXRPbGRSZWxhdGlvbnNoaXBFbmQoKTsKLQkJbmV3RW5kID0gcmVxdWVzdC5nZXROZXdSZWxhdGlvbnNoaXBFbmQoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2FuRXhlY3V0ZSgpIHsKLQkJaWYgKCEoZ2V0RWxlbWVudFRvRWRpdCgpIGluc3RhbmNlb2YgQ29udHJvbEZsb3cpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJaWYgKHJlb3JpZW50RGlyZWN0aW9uID09IFJlb3JpZW50UmVsYXRpb25zaGlwUmVxdWVzdC5SRU9SSUVOVF9TT1VSQ0UpIHsKLQkJCXJldHVybiBjYW5SZW9yaWVudFNvdXJjZSgpOwotCQl9Ci0JCWlmIChyZW9yaWVudERpcmVjdGlvbiA9PSBSZW9yaWVudFJlbGF0aW9uc2hpcFJlcXVlc3QuUkVPUklFTlRfVEFSR0VUKSB7Ci0JCQlyZXR1cm4gY2FuUmVvcmllbnRUYXJnZXQoKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gY2FuUmVvcmllbnRTb3VyY2UoKSB7Ci0JCWlmICghKG9sZEVuZCBpbnN0YW5jZW9mIEFjdGl2aXR5Tm9kZSAmJiBuZXdFbmQgaW5zdGFuY2VvZiBBY3Rpdml0eU5vZGUpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJQWN0aXZpdHlOb2RlIHRhcmdldCA9IGdldExpbmsoKS5nZXRUYXJnZXQoKTsKLS8vCQlpZiAoIShnZXRMaW5rKCkuZUNvbnRhaW5lcigpIGluc3RhbmNlb2YgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZSkpIHsKLS8vCQkJcmV0dXJuIGZhbHNlOwotLy8JCX0KLS8vCQlTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlIGNvbnRhaW5lciA9IChTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlKSBnZXRMaW5rKCkKLS8vCQkJCS5lQ29udGFpbmVyKCk7Ci0vLwkJcmV0dXJuIFVNTEJhc2VJdGVtU2VtYW50aWNFZGl0UG9saWN5LkxpbmtDb25zdHJhaW50cwotLy8JCQkJLmNhbkV4aXN0Q29udHJvbEZsb3dfMzAwMShjb250YWluZXIsIGdldE5ld1NvdXJjZSgpLCB0YXJnZXQpOwotCQlpZighY2FuQ29ubmVjdCgoQWN0aXZpdHlOb2RlKW5ld0VuZCwgdGFyZ2V0KSkKLQkJCXJldHVybiBmYWxzZTsKLQkJCi0JCWlmIChuZXdFbmQgaW5zdGFuY2VvZiBNZXJnZU5vZGUgfHwgbmV3RW5kIGluc3RhbmNlb2YgSm9pbk5vZGUpIHsKLQkJCUFjdGl2aXR5Tm9kZSBqb2luID0gKEFjdGl2aXR5Tm9kZSkgbmV3RW5kOwotCQkJTGlzdDxBY3Rpdml0eUVkZ2U+IGxpc3QgPSBqb2luLmdldE91dGdvaW5ncygpOwotCQkJaWYgKGxpc3QgIT0gbnVsbCAmJiBsaXN0LnNpemUoKSA+PSAxKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gdHJ1ZTsKLQkJCi0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGNhblJlb3JpZW50VGFyZ2V0KCkgewotCQlpZiAoIShvbGRFbmQgaW5zdGFuY2VvZiBBY3Rpdml0eU5vZGUgJiYgbmV3RW5kIGluc3RhbmNlb2YgQWN0aXZpdHlOb2RlKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCUFjdGl2aXR5Tm9kZSBzb3VyY2UgPSBnZXRMaW5rKCkuZ2V0U291cmNlKCk7Ci0vLwkJaWYgKCEoZ2V0TGluaygpLmVDb250YWluZXIoKSBpbnN0YW5jZW9mIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUpKSB7Ci0vLwkJCXJldHVybiBmYWxzZTsKLS8vCQl9Ci0vLwkJU3RydWN0dXJlZEFjdGl2aXR5Tm9kZSBjb250YWluZXIgPSAoU3RydWN0dXJlZEFjdGl2aXR5Tm9kZSkgZ2V0TGluaygpCi0vLwkJCQkuZUNvbnRhaW5lcigpOwotLy8JCXJldHVybiBVTUxCYXNlSXRlbVNlbWFudGljRWRpdFBvbGljeS5MaW5rQ29uc3RyYWludHMKLS8vCQkJCS5jYW5FeGlzdENvbnRyb2xGbG93XzMwMDEoY29udGFpbmVyLCBzb3VyY2UsIGdldE5ld1RhcmdldCgpKTsKLQkJCi0JCWlmKCFjYW5Db25uZWN0KHNvdXJjZSwgKEFjdGl2aXR5Tm9kZSluZXdFbmQpKQotCQkJcmV0dXJuIGZhbHNlOwotCQkKLQkJaWYgKG5ld0VuZCBpbnN0YW5jZW9mIERlY2lzaW9uTm9kZSB8fCBuZXdFbmQgaW5zdGFuY2VvZiBGb3JrTm9kZSkgewotCQkJQWN0aXZpdHlOb2RlIGpvaW4gPSAoQWN0aXZpdHlOb2RlKSBuZXdFbmQ7Ci0JCQlMaXN0PEFjdGl2aXR5RWRnZT4gbGlzdCA9IGpvaW4uZ2V0SW5jb21pbmdzKCk7Ci0JCQlpZiAobGlzdCAhPSBudWxsICYmIGxpc3Quc2l6ZSgpID49IDEpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kUmVzdWx0IGRvRXhlY3V0ZVdpdGhSZXN1bHQoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLAotCQkJSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJaWYgKCFjYW5FeGVjdXRlKCkpIHsKLQkJCXRocm93IG5ldyBFeGVjdXRpb25FeGNlcHRpb24oCi0JCQkJCSJJbnZhbGlkIGFyZ3VtZW50cyBpbiByZW9yaWVudCBsaW5rIGNvbW1hbmQiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWlmIChyZW9yaWVudERpcmVjdGlvbiA9PSBSZW9yaWVudFJlbGF0aW9uc2hpcFJlcXVlc3QuUkVPUklFTlRfU09VUkNFKSB7Ci0JCQlyZXR1cm4gcmVvcmllbnRTb3VyY2UoKTsKLQkJfQotCQlpZiAocmVvcmllbnREaXJlY3Rpb24gPT0gUmVvcmllbnRSZWxhdGlvbnNoaXBSZXF1ZXN0LlJFT1JJRU5UX1RBUkdFVCkgewotCQkJcmV0dXJuIHJlb3JpZW50VGFyZ2V0KCk7Ci0JCX0KLQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZFJlc3VsdCByZW9yaWVudFNvdXJjZSgpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCQlnZXRMaW5rKCkuc2V0U291cmNlKGdldE5ld1NvdXJjZSgpKTsKLQkJcmV0dXJuIENvbW1hbmRSZXN1bHQubmV3T0tDb21tYW5kUmVzdWx0KGdldExpbmsoKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kUmVzdWx0IHJlb3JpZW50VGFyZ2V0KCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCWdldExpbmsoKS5zZXRUYXJnZXQoZ2V0TmV3VGFyZ2V0KCkpOwotCQlyZXR1cm4gQ29tbWFuZFJlc3VsdC5uZXdPS0NvbW1hbmRSZXN1bHQoZ2V0TGluaygpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbnRyb2xGbG93IGdldExpbmsoKSB7Ci0JCXJldHVybiAoQ29udHJvbEZsb3cpIGdldEVsZW1lbnRUb0VkaXQoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEFjdGl2aXR5Tm9kZSBnZXRPbGRTb3VyY2UoKSB7Ci0JCXJldHVybiAoQWN0aXZpdHlOb2RlKSBvbGRFbmQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBBY3Rpdml0eU5vZGUgZ2V0TmV3U291cmNlKCkgewotCQlyZXR1cm4gKEFjdGl2aXR5Tm9kZSkgbmV3RW5kOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQWN0aXZpdHlOb2RlIGdldE9sZFRhcmdldCgpIHsKLQkJcmV0dXJuIChBY3Rpdml0eU5vZGUpIG9sZEVuZDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEFjdGl2aXR5Tm9kZSBnZXROZXdUYXJnZXQoKSB7Ci0JCXJldHVybiAoQWN0aXZpdHlOb2RlKSBuZXdFbmQ7Ci0JfQotCQotCS8qCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SG9zdChFZGl0UGFydCBob3N0KXsKLQkJdGhpcy5ob3N0ID0gaG9zdDsKLQl9Ci0JCi0JLyoKLQkgKiAKLQkgKi8KLQlwdWJsaWMgRWRpdFBhcnQgZ2V0SG9zdCgpewotCQlyZXR1cm4gdGhpcy5ob3N0OwotCX0KLQkKLQlwcml2YXRlIGJvb2xlYW4gY2FuQ29ubmVjdChBY3Rpdml0eU5vZGUgc291cmNlLCBBY3Rpdml0eU5vZGUgdGFyZ2V0KXsKLQkJaWYgKCEoZ2V0TGluaygpLmVDb250YWluZXIoKSBpbnN0YW5jZW9mIEFjdGl2aXR5KSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWlmKERpYWdyYW1Db3JlVmFsaWRhdGlvbi5pc0R1cGxpY2F0ZVJlbGF0aW9uc2hpcChzb3VyY2UsIHRhcmdldCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWlmKGdldEhvc3QoKSAhPSBudWxsKXsKLQkJCWlmIChEaWFncmFtQ29yZVZhbGlkYXRpb24uY2FuQ29ubmVjdCgoRWRpdFBhcnQpIGdldEhvc3QoKSwgc291cmNlLCAKLQkJCQkJdGFyZ2V0KSAhPSBudWxsKQotCQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9jb21tYW5kcy9EZWNpc2lvbk5vZGVDcmVhdGVDb21tYW5kLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9jb21tYW5kcy9EZWNpc2lvbk5vZGVDcmVhdGVDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0NzIwNmQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvY29tbWFuZHMvRGVjaXNpb25Ob2RlQ3JlYXRlQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5jb21tYW5kczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLmNvbW1hbmRzLkNyZWF0ZUVsZW1lbnRDb21tYW5kOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5DcmVhdGVFbGVtZW50UmVxdWVzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5VTUxQYWNrYWdlOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERlY2lzaW9uTm9kZUNyZWF0ZUNvbW1hbmQgZXh0ZW5kcyBDcmVhdGVFbGVtZW50Q29tbWFuZCB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERlY2lzaW9uTm9kZUNyZWF0ZUNvbW1hbmQoQ3JlYXRlRWxlbWVudFJlcXVlc3QgcmVxKSB7Ci0JCXN1cGVyKHJlcSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZ2V0RUNsYXNzVG9FZGl0KCkgewotCQlyZXR1cm4gVU1MUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QWN0aXZpdHkoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVPYmplY3QgZ2V0RWxlbWVudFRvRWRpdCgpIHsKLQkJRU9iamVjdCBjb250YWluZXIgPSAoKENyZWF0ZUVsZW1lbnRSZXF1ZXN0KSBnZXRSZXF1ZXN0KCkpCi0JCQkJLmdldENvbnRhaW5lcigpOwotCQlpZiAoY29udGFpbmVyIGluc3RhbmNlb2YgVmlldykgewotCQkJY29udGFpbmVyID0gKChWaWV3KSBjb250YWluZXIpLmdldEVsZW1lbnQoKTsKLQkJfQotCQlyZXR1cm4gY29udGFpbmVyOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvY29tbWFuZHMvRm9ya05vZGVDcmVhdGVDb21tYW5kLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9jb21tYW5kcy9Gb3JrTm9kZUNyZWF0ZUNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzU4NjFhMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9jb21tYW5kcy9Gb3JrTm9kZUNyZWF0ZUNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQuY29tbWFuZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5jb21tYW5kcy5DcmVhdGVFbGVtZW50Q29tbWFuZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ3JlYXRlRWxlbWVudFJlcXVlc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuVU1MUGFja2FnZTsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBGb3JrTm9kZUNyZWF0ZUNvbW1hbmQgZXh0ZW5kcyBDcmVhdGVFbGVtZW50Q29tbWFuZCB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEZvcmtOb2RlQ3JlYXRlQ29tbWFuZChDcmVhdGVFbGVtZW50UmVxdWVzdCByZXEpIHsKLQkJc3VwZXIocmVxKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBnZXRFQ2xhc3NUb0VkaXQoKSB7Ci0JCXJldHVybiBVTUxQYWNrYWdlLmVJTlNUQU5DRS5nZXRBY3Rpdml0eSgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRU9iamVjdCBnZXRFbGVtZW50VG9FZGl0KCkgewotCQlFT2JqZWN0IGNvbnRhaW5lciA9ICgoQ3JlYXRlRWxlbWVudFJlcXVlc3QpIGdldFJlcXVlc3QoKSkKLQkJCQkuZ2V0Q29udGFpbmVyKCk7Ci0JCWlmIChjb250YWluZXIgaW5zdGFuY2VvZiBWaWV3KSB7Ci0JCQljb250YWluZXIgPSAoKFZpZXcpIGNvbnRhaW5lcikuZ2V0RWxlbWVudCgpOwotCQl9Ci0JCXJldHVybiBjb250YWluZXI7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9jb21tYW5kcy9Jbml0aWFsTm9kZUNyZWF0ZUNvbW1hbmQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L2NvbW1hbmRzL0luaXRpYWxOb2RlQ3JlYXRlQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNTM0MmI4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L2NvbW1hbmRzL0luaXRpYWxOb2RlQ3JlYXRlQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5jb21tYW5kczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLmNvbW1hbmRzLkNyZWF0ZUVsZW1lbnRDb21tYW5kOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5DcmVhdGVFbGVtZW50UmVxdWVzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5VTUxQYWNrYWdlOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEluaXRpYWxOb2RlQ3JlYXRlQ29tbWFuZCBleHRlbmRzIENyZWF0ZUVsZW1lbnRDb21tYW5kIHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSW5pdGlhbE5vZGVDcmVhdGVDb21tYW5kKENyZWF0ZUVsZW1lbnRSZXF1ZXN0IHJlcSkgewotCQlzdXBlcihyZXEpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGdldEVDbGFzc1RvRWRpdCgpIHsKLQkJcmV0dXJuIFVNTFBhY2thZ2UuZUlOU1RBTkNFLmdldEFjdGl2aXR5KCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFT2JqZWN0IGdldEVsZW1lbnRUb0VkaXQoKSB7Ci0JCUVPYmplY3QgY29udGFpbmVyID0gKChDcmVhdGVFbGVtZW50UmVxdWVzdCkgZ2V0UmVxdWVzdCgpKQotCQkJCS5nZXRDb250YWluZXIoKTsKLQkJaWYgKGNvbnRhaW5lciBpbnN0YW5jZW9mIFZpZXcpIHsKLQkJCWNvbnRhaW5lciA9ICgoVmlldykgY29udGFpbmVyKS5nZXRFbGVtZW50KCk7Ci0JCX0KLQkJcmV0dXJuIGNvbnRhaW5lcjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L2NvbW1hbmRzL0pvaW5Ob2RlQ3JlYXRlQ29tbWFuZC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvY29tbWFuZHMvSm9pbk5vZGVDcmVhdGVDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlYWI2OTcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvY29tbWFuZHMvSm9pbk5vZGVDcmVhdGVDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LmNvbW1hbmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuY29tbWFuZHMuQ3JlYXRlRWxlbWVudENvbW1hbmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkNyZWF0ZUVsZW1lbnRSZXF1ZXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLlVNTFBhY2thZ2U7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgSm9pbk5vZGVDcmVhdGVDb21tYW5kIGV4dGVuZHMgQ3JlYXRlRWxlbWVudENvbW1hbmQgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBKb2luTm9kZUNyZWF0ZUNvbW1hbmQoQ3JlYXRlRWxlbWVudFJlcXVlc3QgcmVxKSB7Ci0JCXN1cGVyKHJlcSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZ2V0RUNsYXNzVG9FZGl0KCkgewotCQlyZXR1cm4gVU1MUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QWN0aXZpdHkoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVPYmplY3QgZ2V0RWxlbWVudFRvRWRpdCgpIHsKLQkJRU9iamVjdCBjb250YWluZXIgPSAoKENyZWF0ZUVsZW1lbnRSZXF1ZXN0KSBnZXRSZXF1ZXN0KCkpCi0JCQkJLmdldENvbnRhaW5lcigpOwotCQlpZiAoY29udGFpbmVyIGluc3RhbmNlb2YgVmlldykgewotCQkJY29udGFpbmVyID0gKChWaWV3KSBjb250YWluZXIpLmdldEVsZW1lbnQoKTsKLQkJfQotCQlyZXR1cm4gY29udGFpbmVyOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvY29tbWFuZHMvTWVyZ2VOb2RlQ3JlYXRlQ29tbWFuZC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvY29tbWFuZHMvTWVyZ2VOb2RlQ3JlYXRlQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYjk4OGQ0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L2NvbW1hbmRzL01lcmdlTm9kZUNyZWF0ZUNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQuY29tbWFuZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5jb21tYW5kcy5DcmVhdGVFbGVtZW50Q29tbWFuZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ3JlYXRlRWxlbWVudFJlcXVlc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuVU1MUGFja2FnZTsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXJnZU5vZGVDcmVhdGVDb21tYW5kIGV4dGVuZHMgQ3JlYXRlRWxlbWVudENvbW1hbmQgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBNZXJnZU5vZGVDcmVhdGVDb21tYW5kKENyZWF0ZUVsZW1lbnRSZXF1ZXN0IHJlcSkgewotCQlzdXBlcihyZXEpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGdldEVDbGFzc1RvRWRpdCgpIHsKLQkJcmV0dXJuIFVNTFBhY2thZ2UuZUlOU1RBTkNFLmdldEFjdGl2aXR5KCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFT2JqZWN0IGdldEVsZW1lbnRUb0VkaXQoKSB7Ci0JCUVPYmplY3QgY29udGFpbmVyID0gKChDcmVhdGVFbGVtZW50UmVxdWVzdCkgZ2V0UmVxdWVzdCgpKQotCQkJCS5nZXRDb250YWluZXIoKTsKLQkJaWYgKGNvbnRhaW5lciBpbnN0YW5jZW9mIFZpZXcpIHsKLQkJCWNvbnRhaW5lciA9ICgoVmlldykgY29udGFpbmVyKS5nZXRFbGVtZW50KCk7Ci0JCX0KLQkJcmV0dXJuIGNvbnRhaW5lcjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L2NvbW1hbmRzL1N0cnVjdHVyZWRBY3Rpdml0eU5vZGVDcmVhdGVDb21tYW5kLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9jb21tYW5kcy9TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlQ3JlYXRlQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OTFmMjA4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L2NvbW1hbmRzL1N0cnVjdHVyZWRBY3Rpdml0eU5vZGVDcmVhdGVDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LmNvbW1hbmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnByb3ZpZGVycy5VTUxFbGVtZW50VHlwZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLmNvbW1hbmRzLkNyZWF0ZUVsZW1lbnRDb21tYW5kOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5DcmVhdGVFbGVtZW50UmVxdWVzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLlVNTFBhY2thZ2U7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZUNyZWF0ZUNvbW1hbmQgZXh0ZW5kcyBDcmVhdGVFbGVtZW50Q29tbWFuZCB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVDcmVhdGVDb21tYW5kKENyZWF0ZUVsZW1lbnRSZXF1ZXN0IHJlcSkgewotCQlzdXBlcihyZXEpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGdldEVDbGFzc1RvRWRpdCgpIHsKLQkJcmV0dXJuIFVNTFBhY2thZ2UuZUlOU1RBTkNFLmdldEFjdGl2aXR5KCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFT2JqZWN0IGdldEVsZW1lbnRUb0VkaXQoKSB7Ci0JCUVPYmplY3QgY29udGFpbmVyID0gKChDcmVhdGVFbGVtZW50UmVxdWVzdCkgZ2V0UmVxdWVzdCgpKQotCQkJCS5nZXRDb250YWluZXIoKTsKLQkJaWYgKGNvbnRhaW5lciBpbnN0YW5jZW9mIFZpZXcpIHsKLQkJCWNvbnRhaW5lciA9ICgoVmlldykgY29udGFpbmVyKS5nZXRFbGVtZW50KCk7Ci0JCX0KLQkJcmV0dXJuIGNvbnRhaW5lcjsKLQl9Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRU9iamVjdCBkb0RlZmF1bHRFbGVtZW50Q3JlYXRpb24oKSB7Ci0JCVN0cnVjdHVyZWRBY3Rpdml0eU5vZGUgbmV3RWxlbWVudCA9IChTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlKSBzdXBlcgotCQkJCS5kb0RlZmF1bHRFbGVtZW50Q3JlYXRpb24oKTsKLQkJaWYgKG5ld0VsZW1lbnQgIT0gbnVsbAotCQkJCSYmIFVNTEVsZW1lbnRUeXBlcy5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlXzEwMTEgPT0gKChDcmVhdGVFbGVtZW50UmVxdWVzdCkgZ2V0UmVxdWVzdCgpKQotCQkJCQkJLmdldEVsZW1lbnRUeXBlKCkpIHsKLQkJCVVNTEVsZW1lbnRUeXBlcy5Jbml0aWFsaXplcnMuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZV8xMDExCi0JCQkJCS5pbml0KG5ld0VsZW1lbnQpOwotCQl9Ci0JCWlmIChuZXdFbGVtZW50ICE9IG51bGwKLQkJCQkmJiBVTUxFbGVtZW50VHlwZXMuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZV8xMDEwID09ICgoQ3JlYXRlRWxlbWVudFJlcXVlc3QpIGdldFJlcXVlc3QoKSkKLQkJCQkJCS5nZXRFbGVtZW50VHlwZSgpKSB7Ci0JCQlVTUxFbGVtZW50VHlwZXMuSW5pdGlhbGl6ZXJzLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVfMTAxMAotCQkJCQkuaW5pdChuZXdFbGVtZW50KTsKLQkJfQotCQlpZiAobmV3RWxlbWVudCAhPSBudWxsCi0JCQkJJiYgVU1MRWxlbWVudFR5cGVzLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVfMTAwNyA9PSAoKENyZWF0ZUVsZW1lbnRSZXF1ZXN0KSBnZXRSZXF1ZXN0KCkpCi0JCQkJCQkuZ2V0RWxlbWVudFR5cGUoKSkgewotCQkJVU1MRWxlbWVudFR5cGVzLkluaXRpYWxpemVycy5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlXzEwMDcKLQkJCQkJLmluaXQobmV3RWxlbWVudCk7Ci0JCX0KLQkJcmV0dXJuIG5ld0VsZW1lbnQ7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9jb21tYW5kcy9VTUxSZW9yaWVudENvbm5lY3Rpb25WaWV3Q29tbWFuZC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvY29tbWFuZHMvVU1MUmVvcmllbnRDb25uZWN0aW9uVmlld0NvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQ3Y2NjZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9jb21tYW5kcy9VTUxSZW9yaWVudENvbm5lY3Rpb25WaWV3Q29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5jb21tYW5kczsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi5jb3JlLmNvbW1hbmQuQ29tbWFuZFJlc3VsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29tbWFuZHMuY29yZS5jb21tYW5kLkFic3RyYWN0VHJhbnNhY3Rpb25hbENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRWRnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFVNTFJlb3JpZW50Q29ubmVjdGlvblZpZXdDb21tYW5kIGV4dGVuZHMKLQkJQWJzdHJhY3RUcmFuc2FjdGlvbmFsQ29tbWFuZCB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBJQWRhcHRhYmxlIGVkZ2VBZGFwdG9yOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBVTUxSZW9yaWVudENvbm5lY3Rpb25WaWV3Q29tbWFuZCgKLQkJCVRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIGVkaXRpbmdEb21haW4sIFN0cmluZyBsYWJlbCkgewotCQlzdXBlcihlZGl0aW5nRG9tYWluLCBsYWJlbCwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldEFmZmVjdGVkRmlsZXMoKSB7Ci0JCVZpZXcgdmlldyA9IChWaWV3KSBlZGdlQWRhcHRvci5nZXRBZGFwdGVyKFZpZXcuY2xhc3MpOwotCQlpZiAodmlldyAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gZ2V0V29ya3NwYWNlRmlsZXModmlldyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldEFmZmVjdGVkRmlsZXMoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElBZGFwdGFibGUgZ2V0RWRnZUFkYXB0b3IoKSB7Ci0JCXJldHVybiBlZGdlQWRhcHRvcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RWRnZUFkYXB0b3IoSUFkYXB0YWJsZSBlZGdlQWRhcHRvcikgewotCQl0aGlzLmVkZ2VBZGFwdG9yID0gZWRnZUFkYXB0b3I7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kUmVzdWx0IGRvRXhlY3V0ZVdpdGhSZXN1bHQoCi0JCQlJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzTW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB7Ci0JCWFzc2VydCBudWxsICE9IGVkZ2VBZGFwdG9yIDogIk51bGwgY2hpbGQgaW4gVU1MUmVvcmllbnRDb25uZWN0aW9uVmlld0NvbW1hbmQiOyAvLyROT04tTkxTLTEkCi0JCUVkZ2UgZWRnZSA9IChFZGdlKSBnZXRFZGdlQWRhcHRvcigpLmdldEFkYXB0ZXIoRWRnZS5jbGFzcyk7Ci0JCWFzc2VydCBudWxsICE9IGVkZ2UgOiAiTnVsbCBlZGdlIGluIFVNTFJlb3JpZW50Q29ubmVjdGlvblZpZXdDb21tYW5kIjsgLy8kTk9OLU5MUy0xJAotCi0JCVZpZXcgdGVtcFZpZXcgPSBlZGdlLmdldFNvdXJjZSgpOwotCQllZGdlLnNldFNvdXJjZShlZGdlLmdldFRhcmdldCgpKTsKLQkJZWRnZS5zZXRUYXJnZXQodGVtcFZpZXcpOwotCi0JCXJldHVybiBDb21tYW5kUmVzdWx0Lm5ld09LQ29tbWFuZFJlc3VsdCgpOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L2hlbHBlcnMvQWN0aXZpdHlFZGl0SGVscGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9oZWxwZXJzL0FjdGl2aXR5RWRpdEhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZWYxNTUzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L2hlbHBlcnMvQWN0aXZpdHlFZGl0SGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LmhlbHBlcnM7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZpdHlFZGl0SGVscGVyIGV4dGVuZHMgVU1MQmFzZUVkaXRIZWxwZXIgewotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L2hlbHBlcnMvQWN0aXZpdHlGaW5hbE5vZGVFZGl0SGVscGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9oZWxwZXJzL0FjdGl2aXR5RmluYWxOb2RlRWRpdEhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYjJkNzI3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L2hlbHBlcnMvQWN0aXZpdHlGaW5hbE5vZGVFZGl0SGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LmhlbHBlcnM7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZpdHlGaW5hbE5vZGVFZGl0SGVscGVyIGV4dGVuZHMgVU1MQmFzZUVkaXRIZWxwZXIgewotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L2hlbHBlcnMvQWN0aXZpdHlQYXJhbWV0ZXJOb2RlRWRpdEhlbHBlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvaGVscGVycy9BY3Rpdml0eVBhcmFtZXRlck5vZGVFZGl0SGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyYmJhY2UuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvaGVscGVycy9BY3Rpdml0eVBhcmFtZXRlck5vZGVFZGl0SGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LmhlbHBlcnM7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZpdHlQYXJhbWV0ZXJOb2RlRWRpdEhlbHBlciBleHRlbmRzIFVNTEJhc2VFZGl0SGVscGVyIHsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9oZWxwZXJzL0FjdGl2aXR5UGFyYW1ldGVyTm9kZUVkaXRIZWxwZXJBZHZpY2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L2hlbHBlcnMvQWN0aXZpdHlQYXJhbWV0ZXJOb2RlRWRpdEhlbHBlckFkdmljZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkN2FlMzNlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L2hlbHBlcnMvQWN0aXZpdHlQYXJhbWV0ZXJOb2RlRWRpdEhlbHBlckFkdmljZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5oZWxwZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5lZGl0aGVscGVyLkFic3RyYWN0RWRpdEhlbHBlckFkdmljZTsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eVBhcmFtZXRlck5vZGVFZGl0SGVscGVyQWR2aWNlIGV4dGVuZHMKLQkJQWJzdHJhY3RFZGl0SGVscGVyQWR2aWNlIHsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9oZWxwZXJzL0FjdGl2aXR5UGFydGl0aW9uRWRpdEhlbHBlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvaGVscGVycy9BY3Rpdml0eVBhcnRpdGlvbkVkaXRIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjE3ZGFhYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9oZWxwZXJzL0FjdGl2aXR5UGFydGl0aW9uRWRpdEhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5oZWxwZXJzOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi5jb3JlLmNvbW1hbmQuSUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvcmUudXRpbC5QYWNrYWdlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLmNvbW1hbmRzLk1vdmVFbGVtZW50c0NvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5Nb3ZlUmVxdWVzdDsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eVBhcnRpdGlvbkVkaXRIZWxwZXIgZXh0ZW5kcyBVTUxCYXNlRWRpdEhlbHBlciB7Ci0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIElDb21tYW5kIGdldE1vdmVDb21tYW5kKE1vdmVSZXF1ZXN0IHJlcSkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCS8vCQlyZXR1cm4gc3VwZXIuZ2V0TW92ZUNvbW1hbmQocmVxKTsKLQkJTW92ZUVsZW1lbnRzQ29tbWFuZCBjbWQgPSBuZXcgTW92ZUVsZW1lbnRzQ29tbWFuZChyZXEpIHsKLQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgYm9vbGVhbiBjYW5FeGVjdXRlKCkgewotCQkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJCQkvL3JldHVybiBzdXBlci5jYW5FeGVjdXRlKCk7Ci0JCQkJRU9iamVjdCBjb250YWluZXIgPSBnZXRUYXJnZXRDb250YWluZXIoKTsKLQotCQkJCWlmIChjb250YWluZXIgPT0gbnVsbCB8fCBnZXRFbGVtZW50c1RvTW92ZSgpID09IG51bGwKLQkJCQkJCXx8IGdldEVsZW1lbnRzVG9Nb3ZlKCkuaXNFbXB0eSgpKSB7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0KLQkJCQlmb3IgKEl0ZXJhdG9yIGkgPSBnZXRFbGVtZW50c1RvTW92ZSgpLmtleVNldCgpLml0ZXJhdG9yKCk7IGkKLQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCUVPYmplY3QgZWxlbWVudCA9IChFT2JqZWN0KSBpLm5leHQoKTsKLQkJCQkJRVJlZmVyZW5jZSBmZWF0dXJlID0gZ2V0VGFyZ2V0RmVhdHVyZShlbGVtZW50KTsKLQotCQkJCQlpZiAoZmVhdHVyZSA9PSBudWxsCi0JCQkJCQkJfHwgIWNvbnRhaW5lci5lQ2xhc3MoKS5nZXRFQWxsUmVmZXJlbmNlcygpCi0JCQkJCQkJCQkuY29udGFpbnMoZmVhdHVyZSkpIHsKLQkJCQkJCS8vIElmIHRoZSB0YXJnZXQgZmVhdHVyZSBkb2Vzbid0IGV4aXN0IGluIHRoZSB0YXJnZXQgY29udGFpbmVyLAotCQkJCQkJLy8gZG9uJ3QgYWxsb3cgdGhlIG1vdmUuCi0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCX0KLQotCQkJCQkvLyBJRiB0aGUgZWxlbWVudCBpcyBhbHJlYWR5IGluIHRoZSB0YXJnZXQgY29udGFpbmVyLi4uCi0JCQkJCWlmIChjb250YWluZXIuZXF1YWxzKGVsZW1lbnQuZUNvbnRhaW5lcigpKQotCQkJCQkJCSYmIGZlYXR1cmUgPT0gZWxlbWVudC5lQ29udGFpbm1lbnRGZWF0dXJlKCkpIHsKLQkJCQkJCS8vIERvbid0IGFsbG93IHRoZSByZXBhcmVudGluZwotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQl9Ci0KLQkJCQkJLy8gSUYgdGhlIGVsZW1lbnQgaXMgdGhlIHBhcmVudCBvZiB0aGUgdGFyZ2V0IGNvbnRhaW5lci4uLgotCQkJCQlpZiAoRWNvcmVVdGlsLmlzQW5jZXN0b3IoZWxlbWVudCwgZ2V0VGFyZ2V0Q29udGFpbmVyKCkpKSB7Ci0JCQkJCQkvLyBEb24ndCBhbGxvdyB0aGUgcmVwYXJlbnRpbmcKLQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJfQotCi0JCQkJCS8vIElGIHRoZSBjb250YWluZXIgY2FuIG5vdCBjb250YWluIHRoZSBlbGVtZW50Li4uCi0JCQkJCS8vCQkJCQlpZiAoIVBhY2thZ2VVdGlsLmNhbkNvbnRhaW4oZ2V0VGFyZ2V0Q29udGFpbmVyKCkuZUNsYXNzKCksCi0JCQkJCS8vCQkJCQkJCWZlYXR1cmUsIGVsZW1lbnQuZUNsYXNzKCksIGZhbHNlKSkgewotCQkJCQkvLwkJCQkJCS8vIERvbid0IGFsbG93IHRoZSByZXBhcmVudGluZwotCQkJCQkvLwkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJLy8JCQkJCX0KLQkJCQl9Ci0KLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQotCQl9OwotCQlyZXR1cm4gY21kOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9oZWxwZXJzL0FjdGl2aXR5UGFydGl0aW9uRWRpdEhlbHBlckFkdmljZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvaGVscGVycy9BY3Rpdml0eVBhcnRpdGlvbkVkaXRIZWxwZXJBZHZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTcxZWIyZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9oZWxwZXJzL0FjdGl2aXR5UGFydGl0aW9uRWRpdEhlbHBlckFkdmljZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5oZWxwZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5lZGl0aGVscGVyLkFic3RyYWN0RWRpdEhlbHBlckFkdmljZTsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eVBhcnRpdGlvbkVkaXRIZWxwZXJBZHZpY2UgZXh0ZW5kcyBBYnN0cmFjdEVkaXRIZWxwZXJBZHZpY2UgewotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L2hlbHBlcnMvQ29udHJvbEZsb3dFZGl0SGVscGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9oZWxwZXJzL0NvbnRyb2xGbG93RWRpdEhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZjczZGM2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L2hlbHBlcnMvQ29udHJvbEZsb3dFZGl0SGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LmhlbHBlcnM7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQ29udHJvbEZsb3dFZGl0SGVscGVyIGV4dGVuZHMgVU1MQmFzZUVkaXRIZWxwZXIgewotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L2hlbHBlcnMvRGVjaXNpb25Ob2RlRWRpdEhlbHBlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvaGVscGVycy9EZWNpc2lvbk5vZGVFZGl0SGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4Y2MzM2UuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvaGVscGVycy9EZWNpc2lvbk5vZGVFZGl0SGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LmhlbHBlcnM7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRGVjaXNpb25Ob2RlRWRpdEhlbHBlciBleHRlbmRzIFVNTEJhc2VFZGl0SGVscGVyIHsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9oZWxwZXJzL0ZvcmtOb2RlRWRpdEhlbHBlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvaGVscGVycy9Gb3JrTm9kZUVkaXRIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGE1MjcwOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9oZWxwZXJzL0ZvcmtOb2RlRWRpdEhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5oZWxwZXJzOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEZvcmtOb2RlRWRpdEhlbHBlciBleHRlbmRzIFVNTEJhc2VFZGl0SGVscGVyIHsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9oZWxwZXJzL0luaXRpYWxOb2RlRWRpdEhlbHBlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvaGVscGVycy9Jbml0aWFsTm9kZUVkaXRIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjZkYzkwOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9oZWxwZXJzL0luaXRpYWxOb2RlRWRpdEhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5oZWxwZXJzOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEluaXRpYWxOb2RlRWRpdEhlbHBlciBleHRlbmRzIFVNTEJhc2VFZGl0SGVscGVyIHsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9oZWxwZXJzL0pvaW5Ob2RlRWRpdEhlbHBlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvaGVscGVycy9Kb2luTm9kZUVkaXRIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2NlNzViZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9oZWxwZXJzL0pvaW5Ob2RlRWRpdEhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5oZWxwZXJzOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEpvaW5Ob2RlRWRpdEhlbHBlciBleHRlbmRzIFVNTEJhc2VFZGl0SGVscGVyIHsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9oZWxwZXJzL01lcmdlTm9kZUVkaXRIZWxwZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L2hlbHBlcnMvTWVyZ2VOb2RlRWRpdEhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNDI4YTJiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L2hlbHBlcnMvTWVyZ2VOb2RlRWRpdEhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5oZWxwZXJzOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIE1lcmdlTm9kZUVkaXRIZWxwZXIgZXh0ZW5kcyBVTUxCYXNlRWRpdEhlbHBlciB7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvaGVscGVycy9TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlMkVkaXRIZWxwZXJBZHZpY2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L2hlbHBlcnMvU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTJFZGl0SGVscGVyQWR2aWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkNThjYWUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvaGVscGVycy9TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlMkVkaXRIZWxwZXJBZHZpY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQuaGVscGVyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuZWRpdGhlbHBlci5BYnN0cmFjdEVkaXRIZWxwZXJBZHZpY2U7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTJFZGl0SGVscGVyQWR2aWNlIGV4dGVuZHMKLQkJQWJzdHJhY3RFZGl0SGVscGVyQWR2aWNlIHsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9oZWxwZXJzL1N0cnVjdHVyZWRBY3Rpdml0eU5vZGVFZGl0SGVscGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9oZWxwZXJzL1N0cnVjdHVyZWRBY3Rpdml0eU5vZGVFZGl0SGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1NjUxMjAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvaGVscGVycy9TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlRWRpdEhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5oZWxwZXJzOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVFZGl0SGVscGVyIGV4dGVuZHMgVU1MQmFzZUVkaXRIZWxwZXIgewotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L2hlbHBlcnMvU3RydWN0dXJlZEFjdGl2aXR5Tm9kZUVkaXRIZWxwZXJBZHZpY2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L2hlbHBlcnMvU3RydWN0dXJlZEFjdGl2aXR5Tm9kZUVkaXRIZWxwZXJBZHZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjkyYTA5NS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9oZWxwZXJzL1N0cnVjdHVyZWRBY3Rpdml0eU5vZGVFZGl0SGVscGVyQWR2aWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LmhlbHBlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLmVkaXRoZWxwZXIuQWJzdHJhY3RFZGl0SGVscGVyQWR2aWNlOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVFZGl0SGVscGVyQWR2aWNlIGV4dGVuZHMKLQkJQWJzdHJhY3RFZGl0SGVscGVyQWR2aWNlIHsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9oZWxwZXJzL1VNTEJhc2VFZGl0SGVscGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9oZWxwZXJzL1VNTEJhc2VFZGl0SGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwOTYwODIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvaGVscGVycy9VTUxCYXNlRWRpdEhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5oZWxwZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUuY29tbWFuZC5Db21wb3NpdGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi5jb3JlLmNvbW1hbmQuSUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5lZGl0aGVscGVyLkFic3RyYWN0RWRpdEhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkNyZWF0ZUVsZW1lbnRSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkRlc3Ryb3lFbGVtZW50UmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkRlc3Ryb3lSZWZlcmVuY2VSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuSUVkaXRDb21tYW5kUmVxdWVzdDsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBVTUxCYXNlRWRpdEhlbHBlciBleHRlbmRzIEFic3RyYWN0RWRpdEhlbHBlciB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRURJVF9QT0xJQ1lfQ09NTUFORCA9ICJlZGl0IHBvbGljeSBjb21tYW5kIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJQ29tbWFuZCBnZXRJbnN0ZWFkQ29tbWFuZChJRWRpdENvbW1hbmRSZXF1ZXN0IHJlcSkgewotCQlJQ29tbWFuZCBlcENvbW1hbmQgPSAoSUNvbW1hbmQpIHJlcS5nZXRQYXJhbWV0ZXIoRURJVF9QT0xJQ1lfQ09NTUFORCk7Ci0JCXJlcS5zZXRQYXJhbWV0ZXIoRURJVF9QT0xJQ1lfQ09NTUFORCwgbnVsbCk7Ci0JCUlDb21tYW5kIGVoQ29tbWFuZCA9IHN1cGVyLmdldEluc3RlYWRDb21tYW5kKHJlcSk7Ci0JCWlmIChlcENvbW1hbmQgPT0gbnVsbCkgewotCQkJcmV0dXJuIGVoQ29tbWFuZDsKLQkJfQotCQlpZiAoZWhDb21tYW5kID09IG51bGwpIHsKLQkJCXJldHVybiBlcENvbW1hbmQ7Ci0JCX0KLQkJQ29tcG9zaXRlQ29tbWFuZCBjb21tYW5kID0gbmV3IENvbXBvc2l0ZUNvbW1hbmQobnVsbCk7Ci0JCWNvbW1hbmQuYWRkKGVwQ29tbWFuZCk7Ci0JCWNvbW1hbmQuYWRkKGVoQ29tbWFuZCk7Ci0JCXJldHVybiBjb21tYW5kOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUNvbW1hbmQgZ2V0Q3JlYXRlQ29tbWFuZChDcmVhdGVFbGVtZW50UmVxdWVzdCByZXEpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJQ29tbWFuZCBnZXRDcmVhdGVSZWxhdGlvbnNoaXBDb21tYW5kKAotCQkJQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdCByZXEpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJQ29tbWFuZCBnZXREZXN0cm95RWxlbWVudENvbW1hbmQoRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHJlcSkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElDb21tYW5kIGdldERlc3Ryb3lSZWZlcmVuY2VDb21tYW5kKERlc3Ryb3lSZWZlcmVuY2VSZXF1ZXN0IHJlcSkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcGFydHMvQWN0aXZpdHlFZGl0UGFydC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcGFydHMvQWN0aXZpdHlFZGl0UGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMjNkMDI0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BhcnRzL0FjdGl2aXR5RWRpdFBhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxMCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuY3VzdG9tLnBvbGljaWVzLkFjdGl2aXR5Q3JlYXRpb25FZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmN1c3RvbS5wb2xpY2llcy5BY3Rpdml0eVhZTGF5b3V0RWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBvbGljaWVzLkFjdGl2aXR5Q2Fub25pY2FsRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBvbGljaWVzLkFjdGl2aXR5SXRlbVNlbWFudGljRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5wYXJ0LkFjdGl2aXR5RGlhZ3JhbUVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnBhcnQudXRpbC5EaWFncmFtRWRpdG9yVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuQ29ubmVjdGlvbkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5EaWFncmFtRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuR3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuRWRpdFBvbGljeVJvbGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkRpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRWRnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vdGF0aW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXR5RWRpdFBhcnQgZXh0ZW5kcyBEaWFncmFtRWRpdFBhcnQgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1PREVMX0lEID0gIkFEIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZJU1VBTF9JRCA9IDc5OwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBY3Rpdml0eUVkaXRQYXJ0KFZpZXcgdmlldykgewotCQlzdXBlcih2aWV3KTsKLQl9Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCkgewotCQlzdXBlci5jcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5TRU1BTlRJQ19ST0xFLAotCQkJCW5ldyBBY3Rpdml0eUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3koKSk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5DQU5PTklDQUxfUk9MRSwKLQkJCQluZXcgQWN0aXZpdHlDYW5vbmljYWxFZGl0UG9saWN5KCkpOwotCi0JCS8vCQkgbW9kaWZpZWQgU1RBUlQKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5MQVlPVVRfUk9MRSwKLQkJCQluZXcgQWN0aXZpdHlYWUxheW91dEVkaXRQb2xpY3koKSk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KAotCQkJCUVkaXRQb2xpY3lSb2xlcy5DUkVBVElPTl9ST0xFLAotCQkJCW5ldyBBY3Rpdml0eUNyZWF0aW9uRWRpdFBvbGljeSgpKTsKLQkJLy8gbW9kaWZpZWQgRU5ECi0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlTm90aWZpY2F0aW9uRXZlbnQoTm90aWZpY2F0aW9uIGV2ZW50KSB7Ci0JCWlmIChOb3RhdGlvblBhY2thZ2UuTGl0ZXJhbHMuVklFV19fVklTSUJMRS5lcXVhbHMoZXZlbnQuZ2V0RmVhdHVyZSgpKSkgewotCQkJT2JqZWN0IG5vdGlmaWVyID0gZXZlbnQuZ2V0Tm90aWZpZXIoKTsKLQkJCWlmIChub3RpZmllciA9PSBnZXRNb2RlbCgpKQotCQkJCXJlZnJlc2hWaXNpYmlsaXR5KCk7Ci0JCQllbHNlIGlmIChldmVudC5nZXROb3RpZmllcigpIGluc3RhbmNlb2YgTm9kZSkgewotCQkJCXJlZnJlc2hDaGlsZHJlbigpOwotCQkJCURpYWdyYW1FZGl0b3JVdGlsLnJlZnJlc2hDb25uZWN0aW9uRWRpdFBhcnRzKHRoaXMpOwotCQkJfQotCQl9IGVsc2UKLQkJCXN1cGVyLmhhbmRsZU5vdGlmaWNhdGlvbkV2ZW50KGV2ZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBHTUYgYW5kIEdFRiBpcyBub3QgaGFuZGxpbmcgY29ubmVjdGlvbnMgdmlzaWJpbGl0eSBwcm9wZXJseS4gCi0JICogVGhpcyBpcyB3b3JrLWFyb3VuZCBzb2x1dGlvbiB0byBoYW5kbGUgY29ubmVjdGlvbnMgdmlzaWJpbGl0eS4gIAotCSAqIFZpc2liaWxpdHkgb2YgZWRnZXMgbmVlZCB0byBzZXQgZmlyc3QgYW5kIHRoZW4gbm9kZXMuIAotCSAqLwotCXByaXZhdGUgdm9pZCByZWZyZXNoQ29ubmVjdGlvbnMoKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJRGlhZ3JhbSBhY3QgPSAoRGlhZ3JhbSkgZ2V0TW9kZWwoKTsKLQkJTGlzdCBlZGdlcyA9IGFjdC5nZXRFZGdlcygpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBlZGdlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCUVkZ2UgZWRnZSA9IChFZGdlKSBpdGVyLm5leHQoKTsKLQkJCWlmIChlZGdlLmlzVmlzaWJsZSgpKSB7Ci0JCQkJQ29ubmVjdGlvbkVkaXRQYXJ0IHBhcnQgPSBjcmVhdGVPckZpbmRDb25uZWN0aW9uKGVkZ2UpOwotCQkJCWlmIChwYXJ0ICE9IG51bGwpIHsKLQkJCQkJaWYgKHBhcnQuZ2V0U291cmNlKCkgPT0gbnVsbCkgewotCQkJCQkJZm9yIChJdGVyYXRvciBpdGVyMSA9IGdldENoaWxkcmVuKCkuaXRlcmF0b3IoKTsgaXRlcjEKLQkJCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCQlFZGl0UGFydCBlbGVtZW50ID0gKEVkaXRQYXJ0KSBpdGVyMS5uZXh0KCk7Ci0JCQkJCQkJT2JqZWN0IG1vZGVsID0gZWxlbWVudC5nZXRNb2RlbCgpOwotCQkJCQkJCWlmIChlZGdlLmdldFNvdXJjZSgpID09IG1vZGVsKSB7Ci0JCQkJCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgR3JhcGhpY2FsRWRpdFBhcnQpIHsKLQkJCQkJCQkJCWlmICgoKEdyYXBoaWNhbEVkaXRQYXJ0KSBlbGVtZW50KQotCQkJCQkJCQkJCQkuZ2V0RmlndXJlKCkuaXNWaXNpYmxlKCkpIHsKLQkJCQkJCQkJCQlwYXJ0LnNldFNvdXJjZShlbGVtZW50KTsKLQkJCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCQkJcGFydC5zZXRTb3VyY2UobnVsbCk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJaWYgKHBhcnQuZ2V0VGFyZ2V0KCkgPT0gbnVsbCkgewotCQkJCQkJZm9yIChJdGVyYXRvciBpdGVyMSA9IGdldENoaWxkcmVuKCkuaXRlcmF0b3IoKTsgaXRlcjEKLQkJCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCQlFZGl0UGFydCBlbGVtZW50ID0gKEVkaXRQYXJ0KSBpdGVyMS5uZXh0KCk7Ci0JCQkJCQkJT2JqZWN0IG1vZGVsID0gZWxlbWVudC5nZXRNb2RlbCgpOwotCQkJCQkJCWlmIChlZGdlLmdldFRhcmdldCgpID09IG1vZGVsKSB7Ci0JCQkJCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgR3JhcGhpY2FsRWRpdFBhcnQpIHsKLQkJCQkJCQkJCWlmICgoKEdyYXBoaWNhbEVkaXRQYXJ0KSBlbGVtZW50KQotCQkJCQkJCQkJCQkuZ2V0RmlndXJlKCkuaXNWaXNpYmxlKCkpIHsKLQkJCQkJCQkJCQlwYXJ0LnNldFRhcmdldChlbGVtZW50KTsKLQkJCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCQkJcGFydC5zZXRUYXJnZXQobnVsbCk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQl0cnkgewotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gZWRnZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJRWRnZSBlZGdlID0gKEVkZ2UpIGl0ZXIubmV4dCgpOwotCQkJCW9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLkNvbm5lY3Rpb25FZGl0UGFydCBwYXJ0ID0gKG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLkNvbm5lY3Rpb25FZGl0UGFydCkgY3JlYXRlT3JGaW5kQ29ubmVjdGlvbihlZGdlKTsKLQkJCQlpZiAoKHBhcnQuZ2V0U291cmNlKCkgPT0gbnVsbCB8fCBwYXJ0LmdldFRhcmdldCgpID09IG51bGwpCi0JCQkJCQkmJiBwYXJ0LmdldEZpZ3VyZSgpICE9IG51bGwpIHsKLQkJCQkJcGFydC5nZXRGaWd1cmUoKS5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJCQkJcGFydC5nZXRGaWd1cmUoKS5yZXZhbGlkYXRlKCk7Ci0JCQkJCXBhcnQuZGVhY3RpdmF0ZSgpOwotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWlmIChBY3Rpdml0eURpYWdyYW1FZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5pc0RlYnVnZ2luZygpKSB7Ci0JCQkJQWN0aXZpdHlEaWFncmFtRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoCi0JCQkJCQkiRXJyb3Igb2NjdXJlZCB3aGlsZSByZWZyZXNoIHRoZSBjb25uZWN0aW9uOiAiICsgZSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCX0KLQkKLQkvKioKLQkgKiBNb3ZlcyBjb21wbGV0ZSBkaWFncmFtIGNoaWxkcmVuIHRvIGdpdmVuIGRlbHRhLiAKLQkgKiBAcGFyYW0gaW50ICAoWC1heGlzIGRlbHRhKQotCSAqIEBwYXJhbSBpbnQgIChZLWF4aXMgZGVsdGEpCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgbW92ZUZpZ3VyZShpbnQgbW92ZVgsIGludCBtb3ZlWSkgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB0aGlzLmdldENoaWxkcmVuKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgY2hpbGQgPSBpdGVyLm5leHQoKTsKLQkJCWlmIChjaGlsZCBpbnN0YW5jZW9mIEdyYXBoaWNhbEVkaXRQYXJ0KSB7Ci0JCQkJR3JhcGhpY2FsRWRpdFBhcnQgcGFydCA9IChHcmFwaGljYWxFZGl0UGFydCkgY2hpbGQ7Ci0JCQkJUmVjdGFuZ2xlIGJvdW5kcyA9IHBhcnQuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCk7Ci0JCQkJUmVjdGFuZ2xlIHIgPSBuZXcgUmVjdGFuZ2xlKG5ldyBQb2ludChib3VuZHMueCArIG1vdmVYLAotCQkJCQkJYm91bmRzLnkgKyBtb3ZlWSksIGJvdW5kcy5nZXRTaXplKCkpOwotCi0JCQkJLy8gYWxzbyBuZWVkIHRvIG1vdmUgdGhlIGJlbmQgcG9pbnRzCi0vLwkJCQlMaXN0IGxpc3QgPSBwYXJ0LmdldFNvdXJjZUNvbm5lY3Rpb25zKCk7Ci0vLwkJCQlmb3IgKEl0ZXJhdG9yIGl0b3IgPSBsaXN0Lml0ZXJhdG9yKCk7IGl0b3IuaGFzTmV4dCgpOykgewotLy8JCQkJCUNvbnRyb2xGbG93RWRpdFBhcnQgbGlua3BhcnQgPSAoQ29udHJvbEZsb3dFZGl0UGFydCkgaXRvci5uZXh0KCk7Ci0vLwkJCQkJTGluayBsaW5rID0gKExpbmspIGxpbmtwYXJ0LmdldE1vZGVsKCk7Ci0vLwkJCQkJaWYgKGxpbmsuZ2V0QmVuZHBvaW50cygpLnNpemUoKSA+IDApIHsKLS8vCQkJCQkJUG9pbnRMaXN0IHBsaXN0ID0gKChQb2x5bGluZUNvbm5lY3Rpb24pIGxpbmtwYXJ0Ci0vLwkJCQkJCQkJLmdldEZpZ3VyZSgpKS5nZXRQb2ludHMoKTsKLS8vCQkJCQkJTGlzdCBwb2ludHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0vLwkJCQkJCWZvciAoaW50IGkgPSAxOyBpIDwgcGxpc3Quc2l6ZSgpIC0gMTsgaSsrKSB7Ci0vLwkJCQkJCQlQb2ludCBwID0gcGxpc3QuZ2V0UG9pbnQoaSk7Ci0vLwkJCQkJCQlwID0gcC50cmFuc2xhdGUobmV3IFBvaW50KG1vdmVYLCBtb3ZlWSkpOwotLy8KLS8vCQkJCQkJCW9yZy5lY2xpcHNlLmRyYXcyZC5BYnNvbHV0ZUJlbmRwb2ludCBicCA9IG5ldyBvcmcuZWNsaXBzZS5kcmF3MmQuQWJzb2x1dGVCZW5kcG9pbnQoCi0vLwkJCQkJCQkJCXApOwotLy8JCQkJCQkJcG9pbnRzLmFkZChicCk7Ci0vLwkJCQkJCX0KLS8vCi0vLwkJCQkJCWxpbmtwYXJ0LmdldENvbm5lY3Rpb25GaWd1cmUoKS5zZXRSb3V0aW5nQ29uc3RyYWludCgKLS8vCQkJCQkJCQlwb2ludHMpOwotLy8JCQkJCX0KLS8vCQkJCX0KLQotCQkJCXRoaXMuc2V0TGF5b3V0Q29uc3RyYWludChwYXJ0LCBwYXJ0LmdldEZpZ3VyZSgpLCByKTsKLQotCQkJfSBlbHNlIHsKLQkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlBhcnQgbm90IG1vdmVkOiAiICsgY2hpbGQpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BhcnRzL0FjdGl2aXR5RmluYWxOb2RlRWRpdFBhcnQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BhcnRzL0FjdGl2aXR5RmluYWxOb2RlRWRpdFBhcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDU4MTBiYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wYXJ0cy9BY3Rpdml0eUZpbmFsTm9kZUVkaXRQYXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMjMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0czsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Db2xvckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuUG9zaXRpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlN0YWNrTGF5b3V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LkRpbWVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wb2xpY2llcy5BY3Rpdml0eUZpbmFsTm9kZUNhbm9uaWNhbEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wb2xpY2llcy5BY3Rpdml0eUZpbmFsTm9kZUdyYXBoaWNhbE5vZGVFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucG9saWNpZXMuQWN0aXZpdHlGaW5hbE5vZGVJdGVtU2VtYW50aWNFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucG9saWNpZXMuVU1MRXh0Tm9kZUxhYmVsSG9zdExheW91dEVkaXRQb2xpY3k7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5wYXJ0LlVNTFZpc3VhbElEUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS51dGlsLkRpYWdyYW1Db25zdGFudHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBhcnRzLkxheWVyTWFuYWdlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuTGF5b3V0RWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLk5vblJlc2l6YWJsZUVkaXRQb2xpY3k7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuQ3JlYXRlUmVxdWVzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLkFic3RyYWN0Qm9yZGVyZWRTaGFwZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklCb3JkZXJJdGVtRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuU2hhcGVOb2RlRWRpdFBhcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5Cb3JkZXJJdGVtU2VsZWN0aW9uRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5FZGl0UG9saWN5Um9sZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5maWd1cmVzLkJvcmRlckl0ZW1Mb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkubDEwbi5EaWFncmFtQ29sb3JSZWdpc3RyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLkNvbnN0cmFpbmVkVG9vbGJhckxheW91dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmdlZi51aS5maWd1cmVzLkRlZmF1bHRTaXplTm9kZUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5nZWYudWkuZmlndXJlcy5Ob2RlRmlndXJlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRmlsbFN0eWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkxpbmVTdHlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob3RhdGlvblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZpdHlGaW5hbE5vZGVFZGl0UGFydCBleHRlbmRzIEFic3RyYWN0Qm9yZGVyZWRTaGFwZUVkaXRQYXJ0IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWSVNVQUxfSUQgPSAxMDAxOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJRmlndXJlIGNvbnRlbnRQYW5lOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJRmlndXJlIHByaW1hcnlTaGFwZTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWN0aXZpdHlGaW5hbE5vZGVFZGl0UGFydChWaWV3IHZpZXcpIHsKLQkJc3VwZXIodmlldyk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKSB7Ci0KLQkJc3VwZXIuY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpOwotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuU0VNQU5USUNfUk9MRSwKLQkJCQluZXcgQWN0aXZpdHlGaW5hbE5vZGVJdGVtU2VtYW50aWNFZGl0UG9saWN5KCkpOwotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LkxBWU9VVF9ST0xFLCBjcmVhdGVMYXlvdXRFZGl0UG9saWN5KCkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTGF5b3V0RWRpdFBvbGljeSBjcmVhdGVMYXlvdXRFZGl0UG9saWN5KCkgewotCQlMYXlvdXRFZGl0UG9saWN5IGxlcCA9IG5ldyBMYXlvdXRFZGl0UG9saWN5KCkgewotCi0JCQlwcm90ZWN0ZWQgRWRpdFBvbGljeSBjcmVhdGVDaGlsZEVkaXRQb2xpY3koRWRpdFBhcnQgY2hpbGQpIHsKLQkJCQlpZiAoY2hpbGQgaW5zdGFuY2VvZiBJQm9yZGVySXRlbUVkaXRQYXJ0KSB7Ci0JCQkJCXJldHVybiBuZXcgQm9yZGVySXRlbVNlbGVjdGlvbkVkaXRQb2xpY3koKTsKLQkJCQl9Ci0JCQkJRWRpdFBvbGljeSByZXN1bHQgPSBjaGlsZAotCQkJCQkJLmdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSB7Ci0JCQkJCXJlc3VsdCA9IG5ldyBOb25SZXNpemFibGVFZGl0UG9saWN5KCk7Ci0JCQkJfQotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0KLQkJCXByb3RlY3RlZCBDb21tYW5kIGdldE1vdmVDaGlsZHJlbkNvbW1hbmQoUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0KLQkJCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZUNvbW1hbmQoQ3JlYXRlUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCX07Ci0JCXJldHVybiBsZXA7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZU5vZGVTaGFwZSgpIHsKLQkJRW5kTm9kZUZpZ3VyZSBmaWd1cmUgPSBuZXcgRW5kTm9kZUZpZ3VyZSgpOwotCQlyZXR1cm4gcHJpbWFyeVNoYXBlID0gZmlndXJlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRW5kTm9kZUZpZ3VyZSBnZXRQcmltYXJ5U2hhcGUoKSB7Ci0JCXJldHVybiAoRW5kTm9kZUZpZ3VyZSkgcHJpbWFyeVNoYXBlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRCb3JkZXJJdGVtKElGaWd1cmUgYm9yZGVySXRlbUNvbnRhaW5lciwKLQkJCUlCb3JkZXJJdGVtRWRpdFBhcnQgYm9yZGVySXRlbUVkaXRQYXJ0KSB7Ci0JCWlmIChib3JkZXJJdGVtRWRpdFBhcnQgaW5zdGFuY2VvZiBBY3Rpdml0eUZpbmFsTm9kZU5hbWVFZGl0UGFydCkgewotCQkJQm9yZGVySXRlbUxvY2F0b3IgbG9jYXRvciA9IG5ldyBCb3JkZXJJdGVtTG9jYXRvcihnZXRNYWluRmlndXJlKCksCi0JCQkJCVBvc2l0aW9uQ29uc3RhbnRzLlNPVVRIKTsKLQkJCWxvY2F0b3Iuc2V0Qm9yZGVySXRlbU9mZnNldChuZXcgRGltZW5zaW9uKC0yMCwgLTIwKSk7Ci0JCQlib3JkZXJJdGVtQ29udGFpbmVyLmFkZChib3JkZXJJdGVtRWRpdFBhcnQuZ2V0RmlndXJlKCksIGxvY2F0b3IpOwotCQl9IGVsc2UgewotCQkJc3VwZXIuYWRkQm9yZGVySXRlbShib3JkZXJJdGVtQ29udGFpbmVyLCBib3JkZXJJdGVtRWRpdFBhcnQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJvdGVjdGVkIE5vZGVGaWd1cmUgY3JlYXRlTm9kZVBsYXRlKCkgewotCQlyZXR1cm4gbmV3IERlZmF1bHRTaXplTm9kZUZpZ3VyZShnZXRNYXBNb2RlKCkuRFB0b0xQKDI0KSwgZ2V0TWFwTW9kZSgpCi0JCQkJLkRQdG9MUCgyNCkpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgZmlndXJlIGZvciB0aGlzIGVkaXQgcGFydC4KLQkgKiAKLQkgKiBCb2R5IG9mIHRoaXMgbWV0aG9kIGRvZXMgbm90IGRlcGVuZCBvbiBzZXR0aW5ncyBpbiBnZW5lcmF0aW9uIG1vZGVsCi0JICogc28geW91IG1heSBzYWZlbHkgcmVtb3ZlIDxpPmdlbmVyYXRlZDwvaT4gdGFnIGFuZCBtb2RpZnkgaXQuCi0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBOb2RlRmlndXJlIGNyZWF0ZU1haW5GaWd1cmUoKSB7Ci0JCU5vZGVGaWd1cmUgZmlndXJlID0gY3JlYXRlTm9kZVBsYXRlKCk7Ci0JCWZpZ3VyZS5zZXRMYXlvdXRNYW5hZ2VyKG5ldyBTdGFja0xheW91dCgpKTsKLQkJSUZpZ3VyZSBzaGFwZSA9IGNyZWF0ZU5vZGVTaGFwZSgpOwotCQlmaWd1cmUuYWRkKHNoYXBlKTsKLQkJY29udGVudFBhbmUgPSBzZXR1cENvbnRlbnRQYW5lKHNoYXBlKTsKLQkJcmV0dXJuIGZpZ3VyZTsKLQl9Ci0KLQkvKioKLQkgKiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIHRyZWF0cyBwYXNzZWQgZmlndXJlIGFzIGNvbnRlbnQgcGFuZS4KLQkgKiBSZXNwZWN0cyBsYXlvdXQgb25lIG1heSBoYXZlIHNldCBmb3IgZ2VuZXJhdGVkIGZpZ3VyZS4KLQkgKiBAcGFyYW0gbm9kZVNoYXBlIGluc3RhbmNlIG9mIGdlbmVyYXRlZCBmaWd1cmUgY2xhc3MKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgc2V0dXBDb250ZW50UGFuZShJRmlndXJlIG5vZGVTaGFwZSkgewotCQlpZiAobm9kZVNoYXBlLmdldExheW91dE1hbmFnZXIoKSA9PSBudWxsKSB7Ci0JCQlDb25zdHJhaW5lZFRvb2xiYXJMYXlvdXQgbGF5b3V0ID0gbmV3IENvbnN0cmFpbmVkVG9vbGJhckxheW91dCgpOwotCQkJbGF5b3V0LnNldFNwYWNpbmcoZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSk7Ci0JCQlub2RlU2hhcGUuc2V0TGF5b3V0TWFuYWdlcihsYXlvdXQpOwotCQl9Ci0JCXJldHVybiBub2RlU2hhcGU7IC8vIHVzZSBub2RlU2hhcGUgaXRzZWxmIGFzIGNvbnRlbnRQYW5lCi0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJRmlndXJlIGdldENvbnRlbnRQYW5lKCkgewotCQlpZiAoY29udGVudFBhbmUgIT0gbnVsbCkgewotCQkJcmV0dXJuIGNvbnRlbnRQYW5lOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRDb250ZW50UGFuZSgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRWRpdFBhcnQgZ2V0UHJpbWFyeUNoaWxkRWRpdFBhcnQoKSB7Ci0JCXJldHVybiBnZXRDaGlsZEJ5U2VtYW50aWNIaW50KFVNTFZpc3VhbElEUmVnaXN0cnkKLQkJCQkuZ2V0VHlwZShBY3Rpdml0eUZpbmFsTm9kZU5hbWVFZGl0UGFydC5WSVNVQUxfSUQpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGNsYXNzIEVuZE5vZGVGaWd1cmUgZXh0ZW5kcwotCQkJb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuY3VzdG9tLmZpZ3VyZXMuRW5kTm9kZUZpZ3VyZSB7Ci0KLQkJLyoqCi0JCSAqIEBtb2RpZmllZAotCQkgKi8KLQkJcHVibGljIEVuZE5vZGVGaWd1cmUoKSB7Ci0KLQkJCUxpbmVTdHlsZSBsaW5lc3R5bGUgPSAoTGluZVN0eWxlKSBnZXRQcmltYXJ5VmlldygpLmdldFN0eWxlKAotCQkJCQlOb3RhdGlvblBhY2thZ2UuTGl0ZXJhbHMuTElORV9TVFlMRSk7Ci0JCQlpZiAobGluZXN0eWxlICE9IG51bGwKLQkJCQkJJiYgbGluZXN0eWxlLmdldExpbmVDb2xvcigpICE9IERpYWdyYW1Db25zdGFudHMuTElORV9DT0xPUl9FREVGQVVMVCkgewotCQkJCXRoaXMuc2V0Rm9yZWdyb3VuZENvbG9yKERpYWdyYW1Db2xvclJlZ2lzdHJ5LmdldEluc3RhbmNlKCkKLQkJCQkJCS5nZXRDb2xvcihuZXcgSW50ZWdlcihsaW5lc3R5bGUuZ2V0TGluZUNvbG9yKCkpKSk7Ci0JCQl9IGVsc2UgewotCQkJCXRoaXMKLQkJCQkJCS5zZXRGb3JlZ3JvdW5kQ29sb3Iob3JnLmVjbGlwc2UuZHJhdzJkLkNvbG9yQ29uc3RhbnRzLmRhcmtCbHVlKTsKLQkJCX0KLQotCQkJRmlsbFN0eWxlIHN0eWxlID0gKEZpbGxTdHlsZSkgZ2V0UHJpbWFyeVZpZXcoKS5nZXRTdHlsZSgKLQkJCQkJTm90YXRpb25QYWNrYWdlLkxpdGVyYWxzLkZJTExfU1RZTEUpOwotCQkJaWYgKHN0eWxlICE9IG51bGwKLQkJCQkJJiYgc3R5bGUuZ2V0RmlsbENvbG9yKCkgIT0gRGlhZ3JhbUNvbnN0YW50cy5GSUxMX0NPTE9SX0VERUZBVUxUKSB7Ci0JCQkJdGhpcy5zZXRCYWNrZ3JvdW5kQ29sb3IoRGlhZ3JhbUNvbG9yUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKQotCQkJCQkJLmdldENvbG9yKG5ldyBJbnRlZ2VyKHN0eWxlLmdldEZpbGxDb2xvcigpKSkpOwotCQkJfSBlbHNlIHsKLQkJCQl0aGlzLnNldEJhY2tncm91bmRDb2xvcihFTkROT0RFRklHVVJFX0JBQ0sKLQotCQkJCSk7Ci0JCQl9Ci0JCQl0aGlzLnNldFByZWZlcnJlZFNpemUoZ2V0TWFwTW9kZSgpLkRQdG9MUCgyNCksIGdldE1hcE1vZGUoKS5EUHRvTFAoCi0JCQkJCTI0KSk7Ci0JCQl0aGlzLnNldFNpemUoZ2V0TWFwTW9kZSgpLkRQdG9MUCgyNCksIGdldE1hcE1vZGUoKS5EUHRvTFAoMjQpKTsKLQotCQkJY3JlYXRlQ29udGVudHMoKTsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIHZvaWQgY3JlYXRlQ29udGVudHMoKSB7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSBib29sZWFuIG15VXNlTG9jYWxDb29yZGluYXRlcyA9IGZhbHNlOwotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcm90ZWN0ZWQgYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKCkgewotCQkJcmV0dXJuIG15VXNlTG9jYWxDb29yZGluYXRlczsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcm90ZWN0ZWQgdm9pZCBzZXRVc2VMb2NhbENvb3JkaW5hdGVzKGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcykgewotCQkJbXlVc2VMb2NhbENvb3JkaW5hdGVzID0gdXNlTG9jYWxDb29yZGluYXRlczsKLQkJfQotCi0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29sb3IgRU5ETk9ERUZJR1VSRV9CQUNLID0gbmV3IENvbG9yKG51bGwsIDQ1LCA4NSwgMTMwKTsKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGhhbmRsZU5vdGlmaWNhdGlvbkV2ZW50KE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlPYmplY3QgZmVhdHVyZSA9IG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlKCk7Ci0JCWlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldFNpemVfV2lkdGgoKS5lcXVhbHMoZmVhdHVyZSkKLQkJCQl8fCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldFNpemVfSGVpZ2h0KCkuZXF1YWxzKGZlYXR1cmUpCi0JCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRMb2NhdGlvbl9YKCkuZXF1YWxzKGZlYXR1cmUpCi0JCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRMb2NhdGlvbl9ZKCkuZXF1YWxzKGZlYXR1cmUpKSB7Ci0JCQlyZWZyZXNoQm91bmRzKCk7Ci0JCX0gZWxzZSBpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGaWxsU3R5bGVfRmlsbENvbG9yKCkuZXF1YWxzKAotCQkJCWZlYXR1cmUpKSB7Ci0JCQlJbnRlZ2VyIGMgPSAoSW50ZWdlcikgbm90aWZpY2F0aW9uLmdldE5ld1ZhbHVlKCk7Ci0JCQlzZXRCYWNrZ3JvdW5kQ29sb3IoRGlhZ3JhbUNvbG9yUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXRDb2xvcihjKSk7Ci0JCQlnZXRQcmltYXJ5U2hhcGUoKS5zZXRCYWNrZ3JvdW5kQ29sb3IoCi0JCQkJCURpYWdyYW1Db2xvclJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0Q29sb3IoYykpOwotCQl9IGVsc2UgaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TGluZVN0eWxlX0xpbmVDb2xvcigpLmVxdWFscygKLQkJCQlmZWF0dXJlKSkgewotCQkJSW50ZWdlciBjID0gKEludGVnZXIpIG5vdGlmaWNhdGlvbi5nZXROZXdWYWx1ZSgpOwotCQkJc2V0Rm9yZWdyb3VuZENvbG9yKERpYWdyYW1Db2xvclJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0Q29sb3IoYykpOwotCQkJZ2V0UHJpbWFyeVNoYXBlKCkuc2V0Rm9yZWdyb3VuZENvbG9yKAotCQkJCQlEaWFncmFtQ29sb3JSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldENvbG9yKGMpKTsKLQkJfSBlbHNlIGlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZSgpLmlzSW5zdGFuY2UoCi0JCQkJbm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCkpKQotCQkJcmVmcmVzaEZvbnQoKTsKLQkJZWxzZSBpZiAobm90aWZpY2F0aW9uLmdldEZlYXR1cmUoKSA9PSBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldFZpZXdfRWxlbWVudCgpCi0JCQkJJiYgKChFT2JqZWN0KSBub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKSkgPT0gZ2V0Tm90YXRpb25WaWV3KCkpCi0JCQloYW5kbGVNYWpvclNlbWFudGljQ2hhbmdlKCk7Ci0JCWVsc2UKLQkJCXN1cGVyLmhhbmRsZU5vdGlmaWNhdGlvbkV2ZW50KG5vdGlmaWNhdGlvbik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcGFydHMvQWN0aXZpdHlGaW5hbE5vZGVOYW1lRWRpdFBhcnQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BhcnRzL0FjdGl2aXR5RmluYWxOb2RlTmFtZUVkaXRQYXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1MzY3NzUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcGFydHMvQWN0aXZpdHlGaW5hbE5vZGVOYW1lRWRpdFBhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxOCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uUnVubmFibGVXaXRoUmVzdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucG9saWNpZXMuVU1MVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQucGFydC5VTUxWaXN1YWxJRFJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnByb3ZpZGVycy5VTUxFbGVtZW50VHlwZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS51dGlsLkRpYWdyYW1Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkFjY2Vzc2libGVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuRGlyZWN0RWRpdFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnRvb2xzLkRpcmVjdEVkaXRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuSVBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLklQYXJzZXJFZGl0U3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuUGFyc2VyRWRpdFN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLlBhcnNlck9wdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5QYXJzZXJTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklCb3JkZXJJdGVtRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklUZXh0QXdhcmVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5MYWJlbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkxhYmVsRGlyZWN0RWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmZpZ3VyZXMuSUJvcmRlckl0ZW1Mb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkubDEwbi5EaWFncmFtQ29sb3JSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlcXVlc3RzLlJlcXVlc3RDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS50b29scy5UZXh0RGlyZWN0RWRpdE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb3JlLnV0aWwuRU9iamVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5JRWxlbWVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnVpLnNlcnZpY2VzLnBhcnNlci5JU2VtYW50aWNQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnVpLnNlcnZpY2VzLnBhcnNlci5QYXJzZXJIaW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Gb250U3R5bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm90YXRpb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZW50QXNzaXN0UHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNlbGxFZGl0b3JWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmxlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250RGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZpdHlGaW5hbE5vZGVOYW1lRWRpdFBhcnQgZXh0ZW5kcyBMYWJlbEVkaXRQYXJ0IGltcGxlbWVudHMKLQkJSVRleHRBd2FyZUVkaXRQYXJ0LCBJQm9yZGVySXRlbUVkaXRQYXJ0IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWSVNVQUxfSUQgPSA0MDAxOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRGlyZWN0RWRpdE1hbmFnZXIgbWFuYWdlcjsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIElQYXJzZXIgcGFyc2VyOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgTGlzdCBwYXJzZXJFbGVtZW50czsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBkZWZhdWx0VGV4dDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlzdGF0aWMgewotCQlyZWdpc3RlclNuYXBCYWNrUG9zaXRpb24oVU1MVmlzdWFsSURSZWdpc3RyeQotCQkJCS5nZXRUeXBlKEFjdGl2aXR5RmluYWxOb2RlTmFtZUVkaXRQYXJ0LlZJU1VBTF9JRCksIG5ldyBQb2ludCgwLAotCQkJCTApKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFjdGl2aXR5RmluYWxOb2RlTmFtZUVkaXRQYXJ0KFZpZXcgdmlldykgewotCQlzdXBlcih2aWV3KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpIHsKLQkJc3VwZXIuY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpOwotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LkRJUkVDVF9FRElUX1JPTEUsCi0JCQkJbmV3IExhYmVsRGlyZWN0RWRpdFBvbGljeSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElCb3JkZXJJdGVtTG9jYXRvciBnZXRCb3JkZXJJdGVtTG9jYXRvcigpIHsKLQkJSUZpZ3VyZSBwYXJlbnRGaWd1cmUgPSBnZXRGaWd1cmUoKS5nZXRQYXJlbnQoKTsKLQkJaWYgKHBhcmVudEZpZ3VyZSAhPSBudWxsICYmIHBhcmVudEZpZ3VyZS5nZXRMYXlvdXRNYW5hZ2VyKCkgIT0gbnVsbCkgewotCQkJT2JqZWN0IGNvbnN0cmFpbnQgPSBwYXJlbnRGaWd1cmUuZ2V0TGF5b3V0TWFuYWdlcigpLmdldENvbnN0cmFpbnQoCi0JCQkJCWdldEZpZ3VyZSgpKTsKLQkJCXJldHVybiAoSUJvcmRlckl0ZW1Mb2NhdG9yKSBjb25zdHJhaW50OwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWZyZXNoQm91bmRzKCkgewotCQlpbnQgeCA9ICgoSW50ZWdlcikgZ2V0U3RydWN0dXJhbEZlYXR1cmVWYWx1ZShOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldExvY2F0aW9uX1goKSkpLmludFZhbHVlKCk7Ci0JCWludCB5ID0gKChJbnRlZ2VyKSBnZXRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0TG9jYXRpb25fWSgpKSkuaW50VmFsdWUoKTsKLQkJaW50IHdpZHRoID0gKChJbnRlZ2VyKSBnZXRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0U2l6ZV9XaWR0aCgpKSkuaW50VmFsdWUoKTsKLQkJaW50IGhlaWdodCA9ICgoSW50ZWdlcikgZ2V0U3RydWN0dXJhbEZlYXR1cmVWYWx1ZShOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldFNpemVfSGVpZ2h0KCkpKS5pbnRWYWx1ZSgpOwotCQlnZXRCb3JkZXJJdGVtTG9jYXRvcigpCi0JCQkJLnNldENvbnN0cmFpbnQobmV3IFJlY3RhbmdsZSh4LCB5LCB3aWR0aCwgaGVpZ2h0KSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TGFiZWxUZXh0SGVscGVyKElGaWd1cmUgZmlndXJlKSB7Ci0JCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCXJldHVybiAoKFdyYXBMYWJlbCkgZmlndXJlKS5nZXRUZXh0KCk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gKChMYWJlbCkgZmlndXJlKS5nZXRUZXh0KCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0TGFiZWxUZXh0SGVscGVyKElGaWd1cmUgZmlndXJlLCBTdHJpbmcgdGV4dCkgewotCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQkoKFdyYXBMYWJlbCkgZmlndXJlKS5zZXRUZXh0KHRleHQpOwotCQl9IGVsc2UgewotCQkJKChMYWJlbCkgZmlndXJlKS5zZXRUZXh0KHRleHQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJbWFnZSBnZXRMYWJlbEljb25IZWxwZXIoSUZpZ3VyZSBmaWd1cmUpIHsKLQkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJcmV0dXJuICgoV3JhcExhYmVsKSBmaWd1cmUpLmdldEljb24oKTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiAoKExhYmVsKSBmaWd1cmUpLmdldEljb24oKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRMYWJlbEljb25IZWxwZXIoSUZpZ3VyZSBmaWd1cmUsIEltYWdlIGljb24pIHsKLQkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJKChXcmFwTGFiZWwpIGZpZ3VyZSkuc2V0SWNvbihpY29uKTsKLQkJfSBlbHNlIHsKLQkJCSgoTGFiZWwpIGZpZ3VyZSkuc2V0SWNvbihpY29uKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMYWJlbChJRmlndXJlIGZpZ3VyZSkgewotCQl1bnJlZ2lzdGVyVmlzdWFscygpOwotCQlzZXRGaWd1cmUoZmlndXJlKTsKLQkJZGVmYXVsdFRleHQgPSBnZXRMYWJlbFRleHRIZWxwZXIoZmlndXJlKTsKLQkJcmVnaXN0ZXJWaXN1YWxzKCk7Ci0JCXJlZnJlc2hWaXN1YWxzKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBMaXN0IGdldE1vZGVsQ2hpbGRyZW4oKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSUdyYXBoaWNhbEVkaXRQYXJ0IGdldENoaWxkQnlTZW1hbnRpY0hpbnQoU3RyaW5nIHNlbWFudGljSGludCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVPYmplY3QgZ2V0UGFyc2VyRWxlbWVudCgpIHsKLQkJRU9iamVjdCBlbGVtZW50ID0gcmVzb2x2ZVNlbWFudGljRWxlbWVudCgpOwotCQlyZXR1cm4gZWxlbWVudCAhPSBudWxsID8gZWxlbWVudCA6IChWaWV3KSBnZXRNb2RlbCgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSW1hZ2UgZ2V0TGFiZWxJY29uKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRMYWJlbFRleHQoKSB7Ci0JCVN0cmluZyB0ZXh0ID0gbnVsbDsKLQkJaWYgKGdldFBhcnNlcigpICE9IG51bGwpIHsKLQkJCXRleHQgPSBnZXRQYXJzZXIoKS5nZXRQcmludFN0cmluZygKLQkJCQkJbmV3IEVPYmplY3RBZGFwdGVyKGdldFBhcnNlckVsZW1lbnQoKSksCi0JCQkJCWdldFBhcnNlck9wdGlvbnMoKS5pbnRWYWx1ZSgpKTsKLQkJfQotCQlpZiAodGV4dCA9PSBudWxsIHx8IHRleHQubGVuZ3RoKCkgPT0gMCkgewotCQkJdGV4dCA9IGRlZmF1bHRUZXh0OwotCQl9Ci0JCXJldHVybiB0ZXh0OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMYWJlbFRleHQoU3RyaW5nIHRleHQpIHsKLQkJc2V0TGFiZWxUZXh0SGVscGVyKGdldEZpZ3VyZSgpLCB0ZXh0KTsKLQkJT2JqZWN0IHBkRWRpdFBvbGljeSA9IGdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSk7Ci0JCWlmIChwZEVkaXRQb2xpY3kgaW5zdGFuY2VvZiBVTUxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgewotCQkJKChVTUxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgcGRFZGl0UG9saWN5KS5yZWZyZXNoRmVlZGJhY2soKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEVkaXRUZXh0KCkgewotCQlpZiAoZ2V0UGFyc2VyKCkgPT0gbnVsbCkgewotCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIGdldFBhcnNlcigpLmdldEVkaXRTdHJpbmcoCi0JCQkJbmV3IEVPYmplY3RBZGFwdGVyKGdldFBhcnNlckVsZW1lbnQoKSksCi0JCQkJZ2V0UGFyc2VyT3B0aW9ucygpLmludFZhbHVlKCkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0VkaXRhYmxlKCkgewotCQlyZXR1cm4gZ2V0UGFyc2VyKCkgIT0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElDZWxsRWRpdG9yVmFsaWRhdG9yIGdldEVkaXRUZXh0VmFsaWRhdG9yKCkgewotCQlyZXR1cm4gbmV3IElDZWxsRWRpdG9yVmFsaWRhdG9yKCkgewotCi0JCQlwdWJsaWMgU3RyaW5nIGlzVmFsaWQoZmluYWwgT2JqZWN0IHZhbHVlKSB7Ci0JCQkJaWYgKHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0JCQkJCWZpbmFsIEVPYmplY3QgZWxlbWVudCA9IGdldFBhcnNlckVsZW1lbnQoKTsKLQkJCQkJZmluYWwgSVBhcnNlciBwYXJzZXIgPSBnZXRQYXJzZXIoKTsKLQkJCQkJdHJ5IHsKLQkJCQkJCUlQYXJzZXJFZGl0U3RhdHVzIHZhbGlkID0gKElQYXJzZXJFZGl0U3RhdHVzKSBnZXRFZGl0aW5nRG9tYWluKCkKLQkJCQkJCQkJLnJ1bkV4Y2x1c2l2ZShuZXcgUnVubmFibGVXaXRoUmVzdWx0LkltcGwoKSB7Ci0KLQkJCQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQkJCQlzZXRSZXN1bHQocGFyc2VyLmlzVmFsaWRFZGl0U3RyaW5nKAotCQkJCQkJCQkJCQkJbmV3IEVPYmplY3RBZGFwdGVyKGVsZW1lbnQpLAotCQkJCQkJCQkJCQkJKFN0cmluZykgdmFsdWUpKTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfSk7Ci0JCQkJCQlyZXR1cm4gdmFsaWQuZ2V0Q29kZSgpID09IFBhcnNlckVkaXRTdGF0dXMuRURJVEFCTEUgPyBudWxsCi0JCQkJCQkJCTogdmFsaWQuZ2V0TWVzc2FnZSgpOwotCQkJCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZSkgewotCQkJCQkJaWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQkvLyBzaG91bGRuJ3QgZ2V0IGhlcmUKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElDb250ZW50QXNzaXN0UHJvY2Vzc29yIGdldENvbXBsZXRpb25Qcm9jZXNzb3IoKSB7Ci0JCWlmIChnZXRQYXJzZXIoKSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gZ2V0UGFyc2VyKCkuZ2V0Q29tcGxldGlvblByb2Nlc3NvcigKLQkJCQluZXcgRU9iamVjdEFkYXB0ZXIoZ2V0UGFyc2VyRWxlbWVudCgpKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQYXJzZXJPcHRpb25zIGdldFBhcnNlck9wdGlvbnMoKSB7Ci0JCXJldHVybiBQYXJzZXJPcHRpb25zLk5PTkU7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJUGFyc2VyIGdldFBhcnNlcigpIHsKLQkJaWYgKHBhcnNlciA9PSBudWxsKSB7Ci0JCQlTdHJpbmcgcGFyc2VySGludCA9ICgoVmlldykgZ2V0TW9kZWwoKSkuZ2V0VHlwZSgpOwotCQkJUGFyc2VySGludEFkYXB0ZXIgaGludEFkYXB0ZXIgPSBuZXcgUGFyc2VySGludEFkYXB0ZXIoCi0JCQkJCWdldFBhcnNlckVsZW1lbnQoKSwgcGFyc2VySGludCkgewotCi0JCQkJcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKENsYXNzIGFkYXB0ZXIpIHsKLQkJCQkJaWYgKElFbGVtZW50VHlwZS5jbGFzcy5lcXVhbHMoYWRhcHRlcikpIHsKLQkJCQkJCXJldHVybiBVTUxFbGVtZW50VHlwZXMuQWN0aXZpdHlGaW5hbE5vZGVfMTAwMTsKLQkJCQkJfQotCQkJCQlyZXR1cm4gc3VwZXIuZ2V0QWRhcHRlcihhZGFwdGVyKTsKLQkJCQl9Ci0JCQl9OwotCQkJcGFyc2VyID0gUGFyc2VyU2VydmljZS5nZXRJbnN0YW5jZSgpLmdldFBhcnNlcihoaW50QWRhcHRlcik7Ci0JCX0KLQkJcmV0dXJuIHBhcnNlcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIERpcmVjdEVkaXRNYW5hZ2VyIGdldE1hbmFnZXIoKSB7Ci0JCWlmIChtYW5hZ2VyID09IG51bGwpIHsKLQkJCXNldE1hbmFnZXIobmV3IFRleHREaXJlY3RFZGl0TWFuYWdlcih0aGlzLCBUZXh0RGlyZWN0RWRpdE1hbmFnZXIKLQkJCQkJLmdldFRleHRDZWxsRWRpdG9yQ2xhc3ModGhpcyksIFVNTEVkaXRQYXJ0RmFjdG9yeQotCQkJCQkuZ2V0VGV4dENlbGxFZGl0b3JMb2NhdG9yKHRoaXMpKSk7Ci0JCX0KLQkJcmV0dXJuIG1hbmFnZXI7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldE1hbmFnZXIoRGlyZWN0RWRpdE1hbmFnZXIgbWFuYWdlcikgewotCQl0aGlzLm1hbmFnZXIgPSBtYW5hZ2VyOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdCgpIHsKLQkJZ2V0TWFuYWdlcigpLnNob3coKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURpcmVjdEVkaXQoUG9pbnQgZXZlbnRMb2NhdGlvbikgewotCQlpZiAoZ2V0TWFuYWdlcigpLmdldENsYXNzKCkgPT0gVGV4dERpcmVjdEVkaXRNYW5hZ2VyLmNsYXNzKSB7Ci0JCQkoKFRleHREaXJlY3RFZGl0TWFuYWdlcikgZ2V0TWFuYWdlcigpKS5zaG93KGV2ZW50TG9jYXRpb24KLQkJCQkJLmdldFNXVFBvaW50KCkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdChjaGFyIGluaXRpYWxDaGFyYWN0ZXIpIHsKLQkJaWYgKGdldE1hbmFnZXIoKSBpbnN0YW5jZW9mIFRleHREaXJlY3RFZGl0TWFuYWdlcikgewotCQkJKChUZXh0RGlyZWN0RWRpdE1hbmFnZXIpIGdldE1hbmFnZXIoKSkuc2hvdyhpbml0aWFsQ2hhcmFjdGVyKTsKLQkJfSBlbHNlIHsKLQkJCXBlcmZvcm1EaXJlY3RFZGl0KCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURpcmVjdEVkaXRSZXF1ZXN0KFJlcXVlc3QgcmVxdWVzdCkgewotCQlmaW5hbCBSZXF1ZXN0IHRoZVJlcXVlc3QgPSByZXF1ZXN0OwotCQl0cnkgewotCQkJZ2V0RWRpdGluZ0RvbWFpbigpLnJ1bkV4Y2x1c2l2ZShuZXcgUnVubmFibGUoKSB7Ci0KLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCWlmIChpc0FjdGl2ZSgpICYmIGlzRWRpdGFibGUoKSkgewotCQkJCQkJaWYgKHRoZVJlcXVlc3QKLQkJCQkJCQkJLmdldEV4dGVuZGVkRGF0YSgpCi0JCQkJCQkJCS5nZXQoCi0JCQkJCQkJCQkJUmVxdWVzdENvbnN0YW50cy5SRVFfRElSRUNURURJVF9FWFRFTkRFRERBVEFfSU5JVElBTF9DSEFSKSBpbnN0YW5jZW9mIENoYXJhY3RlcikgewotCQkJCQkJCUNoYXJhY3RlciBpbml0aWFsQ2hhciA9IChDaGFyYWN0ZXIpIHRoZVJlcXVlc3QKLQkJCQkJCQkJCS5nZXRFeHRlbmRlZERhdGEoKQotCQkJCQkJCQkJLmdldCgKLQkJCQkJCQkJCQkJUmVxdWVzdENvbnN0YW50cy5SRVFfRElSRUNURURJVF9FWFRFTkRFRERBVEFfSU5JVElBTF9DSEFSKTsKLQkJCQkJCQlwZXJmb3JtRGlyZWN0RWRpdChpbml0aWFsQ2hhci5jaGFyVmFsdWUoKSk7Ci0JCQkJCQl9IGVsc2UgaWYgKCh0aGVSZXF1ZXN0IGluc3RhbmNlb2YgRGlyZWN0RWRpdFJlcXVlc3QpCi0JCQkJCQkJCSYmIChnZXRFZGl0VGV4dCgpLmVxdWFscyhnZXRMYWJlbFRleHQoKSkpKSB7Ci0JCQkJCQkJRGlyZWN0RWRpdFJlcXVlc3QgZWRpdFJlcXVlc3QgPSAoRGlyZWN0RWRpdFJlcXVlc3QpIHRoZVJlcXVlc3Q7Ci0JCQkJCQkJcGVyZm9ybURpcmVjdEVkaXQoZWRpdFJlcXVlc3QuZ2V0TG9jYXRpb24oKSk7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCXBlcmZvcm1EaXJlY3RFZGl0KCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9KTsKLQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoVmlzdWFscygpIHsKLQkJc3VwZXIucmVmcmVzaFZpc3VhbHMoKTsKLQkJcmVmcmVzaExhYmVsKCk7Ci0JCXJlZnJlc2hGb250KCk7Ci0JCXJlZnJlc2hGb250Q29sb3IoKTsKLQkJcmVmcmVzaFVuZGVybGluZSgpOwotCQlyZWZyZXNoU3RyaWtlVGhyb3VnaCgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoTGFiZWwoKSB7Ci0JCXNldExhYmVsVGV4dEhlbHBlcihnZXRGaWd1cmUoKSwgZ2V0TGFiZWxUZXh0KCkpOwotCQlzZXRMYWJlbEljb25IZWxwZXIoZ2V0RmlndXJlKCksIGdldExhYmVsSWNvbigpKTsKLQkJT2JqZWN0IHBkRWRpdFBvbGljeSA9IGdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSk7Ci0JCWlmIChwZEVkaXRQb2xpY3kgaW5zdGFuY2VvZiBVTUxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgewotCQkJKChVTUxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgcGRFZGl0UG9saWN5KS5yZWZyZXNoRmVlZGJhY2soKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoVW5kZXJsaW5lKCkgewotCQlGb250U3R5bGUgc3R5bGUgPSAoRm9udFN0eWxlKSBnZXRGb250U3R5bGVPd25lclZpZXcoKS5nZXRTdHlsZSgKLQkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZSgpKTsKLQkJaWYgKHN0eWxlICE9IG51bGwgJiYgZ2V0RmlndXJlKCkgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCSgoV3JhcExhYmVsKSBnZXRGaWd1cmUoKSkuc2V0VGV4dFVuZGVybGluZShzdHlsZS5pc1VuZGVybGluZSgpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoU3RyaWtlVGhyb3VnaCgpIHsKLQkJRm9udFN0eWxlIHN0eWxlID0gKEZvbnRTdHlsZSkgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkuZ2V0U3R5bGUoCi0JCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGUoKSk7Ci0JCWlmIChzdHlsZSAhPSBudWxsICYmIGdldEZpZ3VyZSgpIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQkoKFdyYXBMYWJlbCkgZ2V0RmlndXJlKCkpLnNldFRleHRTdHJpa2VUaHJvdWdoKHN0eWxlCi0JCQkJCS5pc1N0cmlrZVRocm91Z2goKSk7Ci0JCX0KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoRm9udCgpIHsKLQkJRm9udFN0eWxlIHN0eWxlID0gKEZvbnRTdHlsZSkgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkuZ2V0U3R5bGUoCi0JCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGUoKSk7Ci0JCWlmIChzdHlsZSAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgZm9udE5hbWUgPSBEaWFncmFtQ29uc3RhbnRzLmdldEZvbnROYW1lKHN0eWxlKTsKLQkJCUZvbnREYXRhIGZvbnREYXRhID0gbmV3IEZvbnREYXRhKGZvbnROYW1lLCBzdHlsZQotCQkJCQkuZ2V0Rm9udEhlaWdodCgpLCAoc3R5bGUuaXNCb2xkKCkgPyBTV1QuQk9MRCA6IFNXVC5OT1JNQUwpCi0JCQkJCXwgKHN0eWxlLmlzSXRhbGljKCkgPyBTV1QuSVRBTElDIDogU1dULk5PUk1BTCkpOwotCQkJc2V0Rm9udChmb250RGF0YSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0Rm9udENvbG9yKENvbG9yIGNvbG9yKSB7Ci0JCWdldEZpZ3VyZSgpLnNldEZvcmVncm91bmRDb2xvcihjb2xvcik7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFNlbWFudGljTGlzdGVuZXJzKCkgewotCQlpZiAoZ2V0UGFyc2VyKCkgaW5zdGFuY2VvZiBJU2VtYW50aWNQYXJzZXIpIHsKLQkJCUVPYmplY3QgZWxlbWVudCA9IHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKTsKLQkJCXBhcnNlckVsZW1lbnRzID0gKChJU2VtYW50aWNQYXJzZXIpIGdldFBhcnNlcigpKQotCQkJCQkuZ2V0U2VtYW50aWNFbGVtZW50c0JlaW5nUGFyc2VkKGVsZW1lbnQpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJzZXJFbGVtZW50cy5zaXplKCk7IGkrKykgewotCQkJCWFkZExpc3RlbmVyRmlsdGVyKAotCQkJCQkJIlNlbWFudGljTW9kZWwiICsgaSwgdGhpcywgKEVPYmplY3QpIHBhcnNlckVsZW1lbnRzLmdldChpKSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXN1cGVyLmFkZFNlbWFudGljTGlzdGVuZXJzKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlU2VtYW50aWNMaXN0ZW5lcnMoKSB7Ci0JCWlmIChwYXJzZXJFbGVtZW50cyAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcnNlckVsZW1lbnRzLnNpemUoKTsgaSsrKSB7Ci0JCQkJcmVtb3ZlTGlzdGVuZXJGaWx0ZXIoIlNlbWFudGljTW9kZWwiICsgaSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXN1cGVyLnJlbW92ZVNlbWFudGljTGlzdGVuZXJzKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEFjY2Vzc2libGVFZGl0UGFydCBnZXRBY2Nlc3NpYmxlRWRpdFBhcnQoKSB7Ci0JCWlmIChhY2Nlc3NpYmxlRVAgPT0gbnVsbCkgewotCQkJYWNjZXNzaWJsZUVQID0gbmV3IEFjY2Vzc2libGVHcmFwaGljYWxFZGl0UGFydCgpIHsKLQotCQkJCXB1YmxpYyB2b2lkIGdldE5hbWUoQWNjZXNzaWJsZUV2ZW50IGUpIHsKLQkJCQkJZS5yZXN1bHQgPSBnZXRMYWJlbFRleHRIZWxwZXIoZ2V0RmlndXJlKCkpOwotCQkJCX0KLQkJCX07Ci0JCX0KLQkJcmV0dXJuIGFjY2Vzc2libGVFUDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBWaWV3IGdldEZvbnRTdHlsZU93bmVyVmlldygpIHsKLQkJcmV0dXJuIGdldFByaW1hcnlWaWV3KCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGhhbmRsZU5vdGlmaWNhdGlvbkV2ZW50KE5vdGlmaWNhdGlvbiBldmVudCkgewotCQlPYmplY3QgZmVhdHVyZSA9IGV2ZW50LmdldEZlYXR1cmUoKTsKLQkJaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0ZvbnRDb2xvcigpLmVxdWFscyhmZWF0dXJlKSkgewotCQkJSW50ZWdlciBjID0gKEludGVnZXIpIGV2ZW50LmdldE5ld1ZhbHVlKCk7Ci0JCQlzZXRGb250Q29sb3IoRGlhZ3JhbUNvbG9yUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXRDb2xvcihjKSk7Ci0JCX0gZWxzZSBpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfVW5kZXJsaW5lKCkuZXF1YWxzKAotCQkJCWZlYXR1cmUpKSB7Ci0JCQlyZWZyZXNoVW5kZXJsaW5lKCk7Ci0JCX0gZWxzZSBpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfU3RyaWtlVGhyb3VnaCgpCi0JCQkJLmVxdWFscyhmZWF0dXJlKSkgewotCQkJcmVmcmVzaFN0cmlrZVRocm91Z2goKTsKLQkJfSBlbHNlIGlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Gb250SGVpZ2h0KCkuZXF1YWxzKAotCQkJCWZlYXR1cmUpCi0JCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfRm9udE5hbWUoKS5lcXVhbHMoCi0JCQkJCQlmZWF0dXJlKQotCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0JvbGQoKQotCQkJCQkJLmVxdWFscyhmZWF0dXJlKQotCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0l0YWxpYygpLmVxdWFscygKLQkJCQkJCWZlYXR1cmUpKSB7Ci0JCQlyZWZyZXNoRm9udCgpOwotCQl9IGVsc2UgewotCQkJaWYgKGdldFBhcnNlcigpICE9IG51bGwKLQkJCQkJJiYgZ2V0UGFyc2VyKCkuaXNBZmZlY3RpbmdFdmVudChldmVudCwKLQkJCQkJCQlnZXRQYXJzZXJPcHRpb25zKCkuaW50VmFsdWUoKSkpIHsKLQkJCQlyZWZyZXNoTGFiZWwoKTsKLQkJCX0KLQkJCWlmIChnZXRQYXJzZXIoKSBpbnN0YW5jZW9mIElTZW1hbnRpY1BhcnNlcikgewotCQkJCUlTZW1hbnRpY1BhcnNlciBtb2RlbFBhcnNlciA9IChJU2VtYW50aWNQYXJzZXIpIGdldFBhcnNlcigpOwotCQkJCWlmIChtb2RlbFBhcnNlci5hcmVTZW1hbnRpY0VsZW1lbnRzQWZmZWN0ZWQobnVsbCwgZXZlbnQpKSB7Ci0JCQkJCXJlbW92ZVNlbWFudGljTGlzdGVuZXJzKCk7Ci0JCQkJCWlmIChyZXNvbHZlU2VtYW50aWNFbGVtZW50KCkgIT0gbnVsbCkgewotCQkJCQkJYWRkU2VtYW50aWNMaXN0ZW5lcnMoKTsKLQkJCQkJfQotCQkJCQlyZWZyZXNoTGFiZWwoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJc3VwZXIuaGFuZGxlTm90aWZpY2F0aW9uRXZlbnQoZXZlbnQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVGaWd1cmUoKSB7Ci0JCUlGaWd1cmUgbGFiZWwgPSBjcmVhdGVGaWd1cmVQcmltKCk7Ci0JCWRlZmF1bHRUZXh0ID0gZ2V0TGFiZWxUZXh0SGVscGVyKGxhYmVsKTsKLQkJcmV0dXJuIGxhYmVsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVGaWd1cmVQcmltKCkgewotCQlyZXR1cm4gbmV3IFdyYXBMYWJlbCgpOwotCX0KLQotCS8qKgotCSAqIFRPRE86IERpc2FibGVzIGRpcmVjdCBlZGl0IGZvciBub3cgdW50aWwgdGhlIGlzc3VlIHdpdGggZHVwbGljYXRlIGxhYmVscyBpcyBmaXhlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHBlcmZvcm1SZXF1ZXN0KFJlcXVlc3QgcmVxdWVzdCkgewotCQlpZiAoUmVxdWVzdENvbnN0YW50cy5SRVFfRElSRUNUX0VESVQgIT0gcmVxdWVzdC5nZXRUeXBlKCkpIHsKLSAgICAgICAgCXN1cGVyLnBlcmZvcm1SZXF1ZXN0KHJlcXVlc3QpOwotICAgICAgICB9Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wYXJ0cy9BY3Rpdml0eVBhcmFtZXRlck5vZGUyRWRpdFBhcnQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BhcnRzL0FjdGl2aXR5UGFyYW1ldGVyTm9kZTJFZGl0UGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOTJjY2U1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BhcnRzL0FjdGl2aXR5UGFyYW1ldGVyTm9kZTJFZGl0UGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjk5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuR3JhcGhpY3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuU3RhY2tMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wb2xpY2llcy5BY3Rpdml0eVBhcmFtZXRlck5vZGUySXRlbVNlbWFudGljRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5wYXJ0LlVNTFZpc3VhbElEUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5maWd1cmVzLldpZGVuZWRXcmFwTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS51dGlsLkRpYWdyYW1Db3JlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5MYXlvdXRFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuTm9uUmVzaXphYmxlRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuQ3JlYXRlUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JR3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuU2hhcGVOb2RlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuRWRpdFBvbGljeVJvbGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLkNvbnN0cmFpbmVkVG9vbGJhckxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZ2VmLnVpLmZpZ3VyZXMuRGVmYXVsdFNpemVOb2RlRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmdlZi51aS5maWd1cmVzLk5vZGVGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eVBhcmFtZXRlck5vZGUyRWRpdFBhcnQgZXh0ZW5kcyBTaGFwZU5vZGVFZGl0UGFydCB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVklTVUFMX0lEID0gMTAxMjsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBjb250ZW50UGFuZTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBwcmltYXJ5U2hhcGU7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFjdGl2aXR5UGFyYW1ldGVyTm9kZTJFZGl0UGFydChWaWV3IHZpZXcpIHsKLQkJc3VwZXIodmlldyk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKSB7Ci0KLQkJc3VwZXIuY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpOwotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuU0VNQU5USUNfUk9MRSwKLQkJCQluZXcgQWN0aXZpdHlQYXJhbWV0ZXJOb2RlMkl0ZW1TZW1hbnRpY0VkaXRQb2xpY3koKSk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuTEFZT1VUX1JPTEUsIGNyZWF0ZUxheW91dEVkaXRQb2xpY3koKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBMYXlvdXRFZGl0UG9saWN5IGNyZWF0ZUxheW91dEVkaXRQb2xpY3koKSB7Ci0JCUxheW91dEVkaXRQb2xpY3kgbGVwID0gbmV3IExheW91dEVkaXRQb2xpY3koKSB7Ci0KLQkJCXByb3RlY3RlZCBFZGl0UG9saWN5IGNyZWF0ZUNoaWxkRWRpdFBvbGljeShFZGl0UGFydCBjaGlsZCkgewotCQkJCUVkaXRQb2xpY3kgcmVzdWx0ID0gY2hpbGQKLQkJCQkJCS5nZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgewotCQkJCQlyZXN1bHQgPSBuZXcgTm9uUmVzaXphYmxlRWRpdFBvbGljeSgpOwotCQkJCX0KLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCi0JCQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRNb3ZlQ2hpbGRyZW5Db21tYW5kKFJlcXVlc3QgcmVxdWVzdCkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCi0JCQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVDb21tYW5kKENyZWF0ZVJlcXVlc3QgcmVxdWVzdCkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9OwotCQlyZXR1cm4gbGVwOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVOb2RlU2hhcGUoKSB7Ci0JCUFjdGl2aXR5UGFyYW1ldGVyTm9kZUZpZ3VyZSBmaWd1cmUgPSBuZXcgQWN0aXZpdHlQYXJhbWV0ZXJOb2RlRmlndXJlKCk7Ci0JCXJldHVybiBwcmltYXJ5U2hhcGUgPSBmaWd1cmU7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBY3Rpdml0eVBhcmFtZXRlck5vZGVGaWd1cmUgZ2V0UHJpbWFyeVNoYXBlKCkgewotCQlyZXR1cm4gKEFjdGl2aXR5UGFyYW1ldGVyTm9kZUZpZ3VyZSkgcHJpbWFyeVNoYXBlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBhZGRGaXhlZENoaWxkKEVkaXRQYXJ0IGNoaWxkRWRpdFBhcnQpIHsKLQkJaWYgKGNoaWxkRWRpdFBhcnQgaW5zdGFuY2VvZiBBY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lMkVkaXRQYXJ0KSB7Ci0JCQkoKEFjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWUyRWRpdFBhcnQpIGNoaWxkRWRpdFBhcnQpCi0JCQkJCS5zZXRMYWJlbChnZXRQcmltYXJ5U2hhcGUoKQotCQkJCQkJCS5nZXRGaWd1cmVBY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lTGFiZWwoKSk7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHJlbW92ZUZpeGVkQ2hpbGQoRWRpdFBhcnQgY2hpbGRFZGl0UGFydCkgewotCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE5vZGVGaWd1cmUgY3JlYXRlTm9kZVBsYXRlKCkgewotCQlEZWZhdWx0U2l6ZU5vZGVGaWd1cmUgcmVzdWx0ID0gbmV3IERlZmF1bHRTaXplTm9kZUZpZ3VyZShnZXRNYXBNb2RlKCkKLQkJCQkuRFB0b0xQKDQwKSwgZ2V0TWFwTW9kZSgpLkRQdG9MUCg0MCkpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgZmlndXJlIGZvciB0aGlzIGVkaXQgcGFydC4KLQkgKiAKLQkgKiBCb2R5IG9mIHRoaXMgbWV0aG9kIGRvZXMgbm90IGRlcGVuZCBvbiBzZXR0aW5ncyBpbiBnZW5lcmF0aW9uIG1vZGVsCi0JICogc28geW91IG1heSBzYWZlbHkgcmVtb3ZlIDxpPmdlbmVyYXRlZDwvaT4gdGFnIGFuZCBtb2RpZnkgaXQuCi0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBOb2RlRmlndXJlIGNyZWF0ZU5vZGVGaWd1cmUoKSB7Ci0JCU5vZGVGaWd1cmUgZmlndXJlID0gY3JlYXRlTm9kZVBsYXRlKCk7Ci0JCWZpZ3VyZS5zZXRMYXlvdXRNYW5hZ2VyKG5ldyBTdGFja0xheW91dCgpKTsKLQkJSUZpZ3VyZSBzaGFwZSA9IGNyZWF0ZU5vZGVTaGFwZSgpOwotCQlmaWd1cmUuYWRkKHNoYXBlKTsKLQkJY29udGVudFBhbmUgPSBzZXR1cENvbnRlbnRQYW5lKHNoYXBlKTsKLQkJcmV0dXJuIGZpZ3VyZTsKLQl9Ci0KLQkvKioKLQkgKiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIHRyZWF0cyBwYXNzZWQgZmlndXJlIGFzIGNvbnRlbnQgcGFuZS4KLQkgKiBSZXNwZWN0cyBsYXlvdXQgb25lIG1heSBoYXZlIHNldCBmb3IgZ2VuZXJhdGVkIGZpZ3VyZS4KLQkgKiBAcGFyYW0gbm9kZVNoYXBlIGluc3RhbmNlIG9mIGdlbmVyYXRlZCBmaWd1cmUgY2xhc3MKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgc2V0dXBDb250ZW50UGFuZShJRmlndXJlIG5vZGVTaGFwZSkgewotCQlpZiAobm9kZVNoYXBlLmdldExheW91dE1hbmFnZXIoKSA9PSBudWxsKSB7Ci0JCQlDb25zdHJhaW5lZFRvb2xiYXJMYXlvdXQgbGF5b3V0ID0gbmV3IENvbnN0cmFpbmVkVG9vbGJhckxheW91dCgpOwotCQkJbGF5b3V0LnNldFNwYWNpbmcoZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSk7Ci0JCQlub2RlU2hhcGUuc2V0TGF5b3V0TWFuYWdlcihsYXlvdXQpOwotCQl9Ci0JCXJldHVybiBub2RlU2hhcGU7IC8vIHVzZSBub2RlU2hhcGUgaXRzZWxmIGFzIGNvbnRlbnRQYW5lCi0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJRmlndXJlIGdldENvbnRlbnRQYW5lKCkgewotCQlpZiAoY29udGVudFBhbmUgIT0gbnVsbCkgewotCQkJcmV0dXJuIGNvbnRlbnRQYW5lOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRDb250ZW50UGFuZSgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRWRpdFBhcnQgZ2V0UHJpbWFyeUNoaWxkRWRpdFBhcnQoKSB7Ci0JCXJldHVybiBnZXRDaGlsZEJ5U2VtYW50aWNIaW50KFVNTFZpc3VhbElEUmVnaXN0cnkKLQkJCQkuZ2V0VHlwZShBY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lMkVkaXRQYXJ0LlZJU1VBTF9JRCkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRDaGlsZFZpc3VhbChFZGl0UGFydCBjaGlsZEVkaXRQYXJ0LCBpbnQgaW5kZXgpIHsKLQkJaWYgKGFkZEZpeGVkQ2hpbGQoY2hpbGRFZGl0UGFydCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5hZGRDaGlsZFZpc3VhbChjaGlsZEVkaXRQYXJ0LCAtMSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbW92ZUNoaWxkVmlzdWFsKEVkaXRQYXJ0IGNoaWxkRWRpdFBhcnQpIHsKLQkJaWYgKHJlbW92ZUZpeGVkQ2hpbGQoY2hpbGRFZGl0UGFydCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5yZW1vdmVDaGlsZFZpc3VhbChjaGlsZEVkaXRQYXJ0KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgZ2V0Q29udGVudFBhbmVGb3IoSUdyYXBoaWNhbEVkaXRQYXJ0IGVkaXRQYXJ0KSB7Ci0KLQkJcmV0dXJuIHN1cGVyLmdldENvbnRlbnRQYW5lRm9yKGVkaXRQYXJ0KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGNsYXNzIEFjdGl2aXR5UGFyYW1ldGVyTm9kZUZpZ3VyZSBleHRlbmRzIFJlY3RhbmdsZUZpZ3VyZSB7Ci0KLQkJLyoqCi0JCSAqIEBtb2RpZmllZAotCQkgKi8KLQkJcHVibGljIEFjdGl2aXR5UGFyYW1ldGVyTm9kZUZpZ3VyZSgpIHsKLQotCQkJdGhpcy5zZXRPdXRsaW5lKGZhbHNlKTsKLQkJCXRoaXMuc2V0T3BhcXVlKGZhbHNlKTsKLQkJCWNyZWF0ZUNvbnRlbnRzKCk7Ci0JCX0KLQotCQkvKioKLQkJICogQG1vZGlmaWVkCi0JCSAqLwotCQlwcml2YXRlIHZvaWQgY3JlYXRlQ29udGVudHMoKSB7Ci0JCQlvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZmlnXzAgPSBuZXcgV2lkZW5lZFdyYXBMYWJlbCgpOwotCi0JCQlEaWFncmFtQ29yZVV0aWwuc2V0TGFiZWxQcm9wZXJ0aWVzKGZpZ18wKTsKLQkJCXNldEZpZ3VyZUFjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWVMYWJlbChmaWdfMCk7Ci0KLQkJCU9iamVjdCBsYXlEYXRhMCA9IG51bGw7Ci0KLQkJCXRoaXMuYWRkKGZpZ18wLCBsYXlEYXRhMCk7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSBXcmFwTGFiZWwgZkFjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWVMYWJlbDsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIFdyYXBMYWJlbCBnZXRGaWd1cmVBY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lTGFiZWwoKSB7Ci0JCQlyZXR1cm4gZkFjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWVMYWJlbDsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIHZvaWQgc2V0RmlndXJlQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZUxhYmVsKFdyYXBMYWJlbCBmaWcpIHsKLQkJCWZBY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lTGFiZWwgPSBmaWc7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSBib29sZWFuIG15VXNlTG9jYWxDb29yZGluYXRlcyA9IGZhbHNlOwotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcm90ZWN0ZWQgYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKCkgewotCQkJcmV0dXJuIG15VXNlTG9jYWxDb29yZGluYXRlczsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcm90ZWN0ZWQgdm9pZCBzZXRVc2VMb2NhbENvb3JkaW5hdGVzKGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcykgewotCQkJbXlVc2VMb2NhbENvb3JkaW5hdGVzID0gdXNlTG9jYWxDb29yZGluYXRlczsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgdm9pZCBwYWludEZpZ3VyZShHcmFwaGljcyBncmFwaGljcykgewotCQkJaWYgKGlzT3BhcXVlKCkpCi0JCQkJc3VwZXIucGFpbnRGaWd1cmUoZ3JhcGhpY3MpOwotCQkJcmV0dXJuOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wYXJ0cy9BY3Rpdml0eVBhcmFtZXRlck5vZGVFZGl0UGFydC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcGFydHMvQWN0aXZpdHlQYXJhbWV0ZXJOb2RlRWRpdFBhcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWEwZTZiMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wYXJ0cy9BY3Rpdml0eVBhcmFtZXRlck5vZGVFZGl0UGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuR3JhcGhpY3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuU3RhY2tMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LkRpbWVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBvbGljaWVzLkFjdGl2aXR5UGFyYW1ldGVyTm9kZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQucGFydC5VTUxWaXN1YWxJRFJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuZmlndXJlcy5XaWRlbmVkV3JhcExhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUudXRpbC5EaWFncmFtQ29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuTGF5b3V0RWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLk5vblJlc2l6YWJsZUVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLkNyZWF0ZVJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLlNoYXBlTm9kZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkVkaXRQb2xpY3lSb2xlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5Db25zdHJhaW5lZFRvb2xiYXJMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmdlZi51aS5maWd1cmVzLkRlZmF1bHRTaXplTm9kZUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5nZWYudWkuZmlndXJlcy5Ob2RlRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZpdHlQYXJhbWV0ZXJOb2RlRWRpdFBhcnQgZXh0ZW5kcyBTaGFwZU5vZGVFZGl0UGFydCB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVklTVUFMX0lEID0gMTAwOTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBjb250ZW50UGFuZTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBwcmltYXJ5U2hhcGU7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFjdGl2aXR5UGFyYW1ldGVyTm9kZUVkaXRQYXJ0KFZpZXcgdmlldykgewotCQlzdXBlcih2aWV3KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpIHsKLQotCQlzdXBlci5jcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5TRU1BTlRJQ19ST0xFLAotCQkJCW5ldyBBY3Rpdml0eVBhcmFtZXRlck5vZGVJdGVtU2VtYW50aWNFZGl0UG9saWN5KCkpOwotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LkxBWU9VVF9ST0xFLCBjcmVhdGVMYXlvdXRFZGl0UG9saWN5KCkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTGF5b3V0RWRpdFBvbGljeSBjcmVhdGVMYXlvdXRFZGl0UG9saWN5KCkgewotCQlMYXlvdXRFZGl0UG9saWN5IGxlcCA9IG5ldyBMYXlvdXRFZGl0UG9saWN5KCkgewotCi0JCQlwcm90ZWN0ZWQgRWRpdFBvbGljeSBjcmVhdGVDaGlsZEVkaXRQb2xpY3koRWRpdFBhcnQgY2hpbGQpIHsKLQkJCQlFZGl0UG9saWN5IHJlc3VsdCA9IGNoaWxkCi0JCQkJCQkuZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHsKLQkJCQkJcmVzdWx0ID0gbmV3IE5vblJlc2l6YWJsZUVkaXRQb2xpY3koKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQotCQkJcHJvdGVjdGVkIENvbW1hbmQgZ2V0TW92ZUNoaWxkcmVuQ29tbWFuZChSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQotCQkJcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlQ29tbWFuZChDcmVhdGVSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJfTsKLQkJcmV0dXJuIGxlcDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlTm9kZVNoYXBlKCkgewotCQlBY3Rpdml0eVBhcmFtZXRlck5vZGVGaWd1cmUgZmlndXJlID0gbmV3IEFjdGl2aXR5UGFyYW1ldGVyTm9kZUZpZ3VyZSgpOwotCQlyZXR1cm4gcHJpbWFyeVNoYXBlID0gZmlndXJlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWN0aXZpdHlQYXJhbWV0ZXJOb2RlRmlndXJlIGdldFByaW1hcnlTaGFwZSgpIHsKLQkJcmV0dXJuIChBY3Rpdml0eVBhcmFtZXRlck5vZGVGaWd1cmUpIHByaW1hcnlTaGFwZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gYWRkRml4ZWRDaGlsZChFZGl0UGFydCBjaGlsZEVkaXRQYXJ0KSB7Ci0JCWlmIChjaGlsZEVkaXRQYXJ0IGluc3RhbmNlb2YgQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZUVkaXRQYXJ0KSB7Ci0JCQkoKEFjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWVFZGl0UGFydCkgY2hpbGRFZGl0UGFydCkKLQkJCQkJLnNldExhYmVsKGdldFByaW1hcnlTaGFwZSgpCi0JCQkJCQkJLmdldEZpZ3VyZUFjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWVMYWJlbCgpKTsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gcmVtb3ZlRml4ZWRDaGlsZChFZGl0UGFydCBjaGlsZEVkaXRQYXJ0KSB7Ci0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTm9kZUZpZ3VyZSBjcmVhdGVOb2RlUGxhdGUoKSB7Ci0JCURlZmF1bHRTaXplTm9kZUZpZ3VyZSByZXN1bHQgPSBuZXcgRGVmYXVsdFNpemVOb2RlRmlndXJlKGdldE1hcE1vZGUoKQotCQkJCS5EUHRvTFAoNDApLCBnZXRNYXBNb2RlKCkuRFB0b0xQKDQwKSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBmaWd1cmUgZm9yIHRoaXMgZWRpdCBwYXJ0LgotCSAqIAotCSAqIEJvZHkgb2YgdGhpcyBtZXRob2QgZG9lcyBub3QgZGVwZW5kIG9uIHNldHRpbmdzIGluIGdlbmVyYXRpb24gbW9kZWwKLQkgKiBzbyB5b3UgbWF5IHNhZmVseSByZW1vdmUgPGk+Z2VuZXJhdGVkPC9pPiB0YWcgYW5kIG1vZGlmeSBpdC4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE5vZGVGaWd1cmUgY3JlYXRlTm9kZUZpZ3VyZSgpIHsKLQkJTm9kZUZpZ3VyZSBmaWd1cmUgPSBjcmVhdGVOb2RlUGxhdGUoKTsKLQkJZmlndXJlLnNldExheW91dE1hbmFnZXIobmV3IFN0YWNrTGF5b3V0KCkpOwotCQlJRmlndXJlIHNoYXBlID0gY3JlYXRlTm9kZVNoYXBlKCk7Ci0JCWZpZ3VyZS5hZGQoc2hhcGUpOwotCQljb250ZW50UGFuZSA9IHNldHVwQ29udGVudFBhbmUoc2hhcGUpOwotCQlyZXR1cm4gZmlndXJlOwotCX0KLQotCS8qKgotCSAqIERlZmF1bHQgaW1wbGVtZW50YXRpb24gdHJlYXRzIHBhc3NlZCBmaWd1cmUgYXMgY29udGVudCBwYW5lLgotCSAqIFJlc3BlY3RzIGxheW91dCBvbmUgbWF5IGhhdmUgc2V0IGZvciBnZW5lcmF0ZWQgZmlndXJlLgotCSAqIEBwYXJhbSBub2RlU2hhcGUgaW5zdGFuY2Ugb2YgZ2VuZXJhdGVkIGZpZ3VyZSBjbGFzcwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBzZXR1cENvbnRlbnRQYW5lKElGaWd1cmUgbm9kZVNoYXBlKSB7Ci0JCWlmIChub2RlU2hhcGUuZ2V0TGF5b3V0TWFuYWdlcigpID09IG51bGwpIHsKLQkJCUNvbnN0cmFpbmVkVG9vbGJhckxheW91dCBsYXlvdXQgPSBuZXcgQ29uc3RyYWluZWRUb29sYmFyTGF5b3V0KCk7Ci0JCQlsYXlvdXQuc2V0U3BhY2luZyhnZXRNYXBNb2RlKCkuRFB0b0xQKDUpKTsKLQkJCW5vZGVTaGFwZS5zZXRMYXlvdXRNYW5hZ2VyKGxheW91dCk7Ci0JCX0KLQkJcmV0dXJuIG5vZGVTaGFwZTsgLy8gdXNlIG5vZGVTaGFwZSBpdHNlbGYgYXMgY29udGVudFBhbmUKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElGaWd1cmUgZ2V0Q29udGVudFBhbmUoKSB7Ci0JCWlmIChjb250ZW50UGFuZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gY29udGVudFBhbmU7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldENvbnRlbnRQYW5lKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFZGl0UGFydCBnZXRQcmltYXJ5Q2hpbGRFZGl0UGFydCgpIHsKLQkJcmV0dXJuIGdldENoaWxkQnlTZW1hbnRpY0hpbnQoVU1MVmlzdWFsSURSZWdpc3RyeQotCQkJCS5nZXRUeXBlKEFjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWVFZGl0UGFydC5WSVNVQUxfSUQpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkQ2hpbGRWaXN1YWwoRWRpdFBhcnQgY2hpbGRFZGl0UGFydCwgaW50IGluZGV4KSB7Ci0JCWlmIChhZGRGaXhlZENoaWxkKGNoaWxkRWRpdFBhcnQpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuYWRkQ2hpbGRWaXN1YWwoY2hpbGRFZGl0UGFydCwgLTEpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVDaGlsZFZpc3VhbChFZGl0UGFydCBjaGlsZEVkaXRQYXJ0KSB7Ci0JCWlmIChyZW1vdmVGaXhlZENoaWxkKGNoaWxkRWRpdFBhcnQpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIucmVtb3ZlQ2hpbGRWaXN1YWwoY2hpbGRFZGl0UGFydCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJRmlndXJlIGdldENvbnRlbnRQYW5lRm9yKElHcmFwaGljYWxFZGl0UGFydCBlZGl0UGFydCkgewotCi0JCXJldHVybiBzdXBlci5nZXRDb250ZW50UGFuZUZvcihlZGl0UGFydCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBjbGFzcyBBY3Rpdml0eVBhcmFtZXRlck5vZGVGaWd1cmUgZXh0ZW5kcyBSZWN0YW5nbGVGaWd1cmUgewotCi0JCS8qKgotCQkgKiBAbW9kaWZpZWQKLQkJICovCi0JCXB1YmxpYyBBY3Rpdml0eVBhcmFtZXRlck5vZGVGaWd1cmUoKSB7Ci0KLQkJCXRoaXMuc2V0T3V0bGluZShmYWxzZSk7Ci0JCQl0aGlzLnNldE9wYXF1ZShmYWxzZSk7Ci0JCQljcmVhdGVDb250ZW50cygpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBtb2RpZmllZAotCQkgKi8KLQkJcHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbnRlbnRzKCkgewotCQkJb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIGZpZ18wID0gbmV3IFdpZGVuZWRXcmFwTGFiZWwoKTsKLQotCQkJRGlhZ3JhbUNvcmVVdGlsLnNldExhYmVsUHJvcGVydGllcyhmaWdfMCk7Ci0JCQlzZXRGaWd1cmVBY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lTGFiZWwoZmlnXzApOwotCi0JCQlPYmplY3QgbGF5RGF0YTAgPSBudWxsOwotCi0JCQl0aGlzLmFkZChmaWdfMCwgbGF5RGF0YTApOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgV3JhcExhYmVsIGZBY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lTGFiZWw7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBXcmFwTGFiZWwgZ2V0RmlndXJlQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZUxhYmVsKCkgewotCQkJcmV0dXJuIGZBY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lTGFiZWw7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSB2b2lkIHNldEZpZ3VyZUFjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWVMYWJlbChXcmFwTGFiZWwgZmlnKSB7Ci0JCQlmQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZUxhYmVsID0gZmlnOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgYm9vbGVhbiBteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSBmYWxzZTsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJvdGVjdGVkIGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcygpIHsKLQkJCXJldHVybiBteVVzZUxvY2FsQ29vcmRpbmF0ZXM7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJvdGVjdGVkIHZvaWQgc2V0VXNlTG9jYWxDb29yZGluYXRlcyhib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMpIHsKLQkJCW15VXNlTG9jYWxDb29yZGluYXRlcyA9IHVzZUxvY2FsQ29vcmRpbmF0ZXM7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIHZvaWQgcGFpbnRGaWd1cmUoR3JhcGhpY3MgZ3JhcGhpY3MpIHsKLQkJCWlmIChpc09wYXF1ZSgpKQotCQkJCXN1cGVyLnBhaW50RmlndXJlKGdyYXBoaWNzKTsKLQkJCXJldHVybjsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcGFydHMvQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZTJFZGl0UGFydC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcGFydHMvQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZTJFZGl0UGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZDc3Y2Y0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BhcnRzL0FjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWUyRWRpdFBhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyNCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uUnVubmFibGVXaXRoUmVzdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucG9saWNpZXMuVU1MVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQucGFydC5BY3Rpdml0eURpYWdyYW1FZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQucHJvdmlkZXJzLlVNTEVsZW1lbnRUeXBlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnByb3ZpZGVycy5EaWFncmFtSWNvblByb3ZpZGVyTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnV0aWwuRGlhZ3JhbUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnV0aWwuRGlhZ3JhbUNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUudXRpbC5WYWxpZGF0aW5nVGV4dERpcmVjdEVkaXRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5BY2Nlc3NpYmxlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuTm9uUmVzaXphYmxlRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuaGFuZGxlcy5Ob25SZXNpemFibGVIYW5kbGVLaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLkRpcmVjdEVkaXRSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi50b29scy5EaXJlY3RFZGl0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLklQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5JUGFyc2VyRWRpdFN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLlBhcnNlckVkaXRTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5QYXJzZXJPcHRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuUGFyc2VyU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5Db21wYXJ0bWVudEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklHcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JVGV4dEF3YXJlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuTGFiZWxEaXJlY3RFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkubDEwbi5EaWFncmFtQ29sb3JSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlcXVlc3RzLlJlcXVlc3RDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS50b29scy5UZXh0RGlyZWN0RWRpdE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb3JlLnV0aWwuRU9iamVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5JRWxlbWVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnVpLnNlcnZpY2VzLnBhcnNlci5JU2VtYW50aWNQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnVpLnNlcnZpY2VzLnBhcnNlci5QYXJzZXJIaW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Gb250U3R5bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm90YXRpb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZW50QXNzaXN0UHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNlbGxFZGl0b3JWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmxlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250RGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZTJFZGl0UGFydCBleHRlbmRzIENvbXBhcnRtZW50RWRpdFBhcnQKLQkJaW1wbGVtZW50cyBJVGV4dEF3YXJlRWRpdFBhcnQgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZJU1VBTF9JRCA9IDQwMTE7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBEaXJlY3RFZGl0TWFuYWdlciBtYW5hZ2VyOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgSVBhcnNlciBwYXJzZXI7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBMaXN0IHBhcnNlckVsZW1lbnRzOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgU3RyaW5nIGRlZmF1bHRUZXh0OwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lMkVkaXRQYXJ0KFZpZXcgdmlldykgewotCQlzdXBlcih2aWV3KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpIHsKLQkJc3VwZXIuY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpOwotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LkRJUkVDVF9FRElUX1JPTEUsCi0JCQkJbmV3IExhYmVsRGlyZWN0RWRpdFBvbGljeSgpKTsKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSwKLQkJCQluZXcgTm9uUmVzaXphYmxlRWRpdFBvbGljeSgpIHsKLQotCQkJCQlwcm90ZWN0ZWQgTGlzdCBjcmVhdGVTZWxlY3Rpb25IYW5kbGVzKCkgewotCQkJCQkJTGlzdCBoYW5kbGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQkJTm9uUmVzaXphYmxlSGFuZGxlS2l0LmFkZE1vdmVIYW5kbGUoCi0JCQkJCQkJCShHcmFwaGljYWxFZGl0UGFydCkgZ2V0SG9zdCgpLCBoYW5kbGVzKTsKLQkJCQkJCXJldHVybiBoYW5kbGVzOwotCQkJCQl9Ci0KLQkJCQkJcHVibGljIENvbW1hbmQgZ2V0Q29tbWFuZChSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJCQkJCXJldHVybiBudWxsOwotCQkJCQl9Ci0KLQkJCQkJcHVibGljIGJvb2xlYW4gdW5kZXJzdGFuZHNSZXF1ZXN0KFJlcXVlc3QgcmVxdWVzdCkgewotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQl9Ci0JCQkJfSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TGFiZWxUZXh0SGVscGVyKElGaWd1cmUgZmlndXJlKSB7Ci0JCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCXJldHVybiAoKFdyYXBMYWJlbCkgZmlndXJlKS5nZXRUZXh0KCk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gKChMYWJlbCkgZmlndXJlKS5nZXRUZXh0KCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0TGFiZWxUZXh0SGVscGVyKElGaWd1cmUgZmlndXJlLCBTdHJpbmcgdGV4dCkgewotCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQkoKFdyYXBMYWJlbCkgZmlndXJlKS5zZXRUZXh0KHRleHQpOwotCQl9IGVsc2UgewotCQkJKChMYWJlbCkgZmlndXJlKS5zZXRUZXh0KHRleHQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJbWFnZSBnZXRMYWJlbEljb25IZWxwZXIoSUZpZ3VyZSBmaWd1cmUpIHsKLQkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJcmV0dXJuICgoV3JhcExhYmVsKSBmaWd1cmUpLmdldEljb24oKTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiAoKExhYmVsKSBmaWd1cmUpLmdldEljb24oKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRMYWJlbEljb25IZWxwZXIoSUZpZ3VyZSBmaWd1cmUsIEltYWdlIGljb24pIHsKLQkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJKChXcmFwTGFiZWwpIGZpZ3VyZSkuc2V0SWNvbihpY29uKTsKLQkJfSBlbHNlIHsKLQkJCSgoTGFiZWwpIGZpZ3VyZSkuc2V0SWNvbihpY29uKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMYWJlbChXcmFwTGFiZWwgZmlndXJlKSB7Ci0JCXVucmVnaXN0ZXJWaXN1YWxzKCk7Ci0JCXNldEZpZ3VyZShmaWd1cmUpOwotCQlkZWZhdWx0VGV4dCA9IGdldExhYmVsVGV4dEhlbHBlcihmaWd1cmUpOwotCQlyZWdpc3RlclZpc3VhbHMoKTsKLQkJcmVmcmVzaFZpc3VhbHMoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIExpc3QgZ2V0TW9kZWxDaGlsZHJlbigpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJR3JhcGhpY2FsRWRpdFBhcnQgZ2V0Q2hpbGRCeVNlbWFudGljSGludChTdHJpbmcgc2VtYW50aWNIaW50KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRU9iamVjdCBnZXRQYXJzZXJFbGVtZW50KCkgewotCQlFT2JqZWN0IGVsZW1lbnQgPSByZXNvbHZlU2VtYW50aWNFbGVtZW50KCk7Ci0JCXJldHVybiBlbGVtZW50ICE9IG51bGwgPyBlbGVtZW50IDogKFZpZXcpIGdldE1vZGVsKCk7Ci0JfQotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJvdGVjdGVkIEltYWdlIGdldExhYmVsSWNvbigpIHsKLQkJSW1hZ2UgaW1hZ2UgPSAgRGlhZ3JhbUljb25Qcm92aWRlck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5nZXRJY29uKHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKSwgZmFsc2UpOwotCQlpZiAoaW1hZ2UgPT0gbnVsbCkgewotCQkJaW1hZ2UgPSBBY3Rpdml0eURpYWdyYW1FZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRTaGFyZWRJbWFnZSgiZGlhZ3JhbS9taWxlc3RvbmUuZ2lmIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gaW1hZ2U7CQkKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRMYWJlbFRleHQoKSB7Ci0JCVN0cmluZyB0ZXh0ID0gbnVsbDsKLQkJaWYgKGdldFBhcnNlcigpICE9IG51bGwpIHsKLQkJCXRleHQgPSBnZXRQYXJzZXIoKS5nZXRQcmludFN0cmluZygKLQkJCQkJbmV3IEVPYmplY3RBZGFwdGVyKGdldFBhcnNlckVsZW1lbnQoKSksCi0JCQkJCWdldFBhcnNlck9wdGlvbnMoKS5pbnRWYWx1ZSgpKTsKLQkJfQotCQlpZiAodGV4dCA9PSBudWxsIHx8IHRleHQubGVuZ3RoKCkgPT0gMCkgewotCQkJdGV4dCA9IGRlZmF1bHRUZXh0OwotCQl9Ci0JCXJldHVybiB0ZXh0OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMYWJlbFRleHQoU3RyaW5nIHRleHQpIHsKLQkJc2V0TGFiZWxUZXh0SGVscGVyKGdldEZpZ3VyZSgpLCB0ZXh0KTsKLQkJT2JqZWN0IHBkRWRpdFBvbGljeSA9IGdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSk7Ci0JCWlmIChwZEVkaXRQb2xpY3kgaW5zdGFuY2VvZiBVTUxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgewotCQkJKChVTUxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgcGRFZGl0UG9saWN5KS5yZWZyZXNoRmVlZGJhY2soKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEVkaXRUZXh0KCkgewotCQlpZiAoZ2V0UGFyc2VyKCkgPT0gbnVsbCkgewotCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIGdldFBhcnNlcigpLmdldEVkaXRTdHJpbmcoCi0JCQkJbmV3IEVPYmplY3RBZGFwdGVyKGdldFBhcnNlckVsZW1lbnQoKSksCi0JCQkJZ2V0UGFyc2VyT3B0aW9ucygpLmludFZhbHVlKCkpOwotCX0KLQotCS8qKgotCSAqIEBtb2RpZmllZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzRWRpdGFibGUoKSB7Ci0JCWlmIChEaWFncmFtQ29yZVV0aWwuaXNSZWFkT25seSh0aGlzKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIGdldEVkaXRUZXh0KCkgIT0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElDZWxsRWRpdG9yVmFsaWRhdG9yIGdldEVkaXRUZXh0VmFsaWRhdG9yKCkgewotCQlyZXR1cm4gbmV3IElDZWxsRWRpdG9yVmFsaWRhdG9yKCkgewotCi0JCQlwdWJsaWMgU3RyaW5nIGlzVmFsaWQoZmluYWwgT2JqZWN0IHZhbHVlKSB7Ci0JCQkJaWYgKHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0JCQkJCWZpbmFsIEVPYmplY3QgZWxlbWVudCA9IGdldFBhcnNlckVsZW1lbnQoKTsKLQkJCQkJZmluYWwgSVBhcnNlciBwYXJzZXIgPSBnZXRQYXJzZXIoKTsKLQkJCQkJdHJ5IHsKLQkJCQkJCUlQYXJzZXJFZGl0U3RhdHVzIHZhbGlkID0gKElQYXJzZXJFZGl0U3RhdHVzKSBnZXRFZGl0aW5nRG9tYWluKCkKLQkJCQkJCQkJLnJ1bkV4Y2x1c2l2ZShuZXcgUnVubmFibGVXaXRoUmVzdWx0LkltcGwoKSB7Ci0KLQkJCQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQkJCQlzZXRSZXN1bHQocGFyc2VyLmlzVmFsaWRFZGl0U3RyaW5nKAotCQkJCQkJCQkJCQkJbmV3IEVPYmplY3RBZGFwdGVyKGVsZW1lbnQpLAotCQkJCQkJCQkJCQkJKFN0cmluZykgdmFsdWUpKTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfSk7Ci0JCQkJCQlyZXR1cm4gdmFsaWQuZ2V0Q29kZSgpID09IFBhcnNlckVkaXRTdGF0dXMuRURJVEFCTEUgPyBudWxsCi0JCQkJCQkJCTogdmFsaWQuZ2V0TWVzc2FnZSgpOwotCQkJCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZSkgewotCQkJCQkJaWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQkvLyBzaG91bGRuJ3QgZ2V0IGhlcmUKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElDb250ZW50QXNzaXN0UHJvY2Vzc29yIGdldENvbXBsZXRpb25Qcm9jZXNzb3IoKSB7Ci0JCWlmIChnZXRQYXJzZXIoKSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gZ2V0UGFyc2VyKCkuZ2V0Q29tcGxldGlvblByb2Nlc3NvcigKLQkJCQluZXcgRU9iamVjdEFkYXB0ZXIoZ2V0UGFyc2VyRWxlbWVudCgpKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQYXJzZXJPcHRpb25zIGdldFBhcnNlck9wdGlvbnMoKSB7Ci0JCXJldHVybiBQYXJzZXJPcHRpb25zLk5PTkU7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJUGFyc2VyIGdldFBhcnNlcigpIHsKLQkJaWYgKHBhcnNlciA9PSBudWxsKSB7Ci0JCQlTdHJpbmcgcGFyc2VySGludCA9ICgoVmlldykgZ2V0TW9kZWwoKSkuZ2V0VHlwZSgpOwotCQkJUGFyc2VySGludEFkYXB0ZXIgaGludEFkYXB0ZXIgPSBuZXcgUGFyc2VySGludEFkYXB0ZXIoCi0JCQkJCWdldFBhcnNlckVsZW1lbnQoKSwgcGFyc2VySGludCkgewotCi0JCQkJcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKENsYXNzIGFkYXB0ZXIpIHsKLQkJCQkJaWYgKElFbGVtZW50VHlwZS5jbGFzcy5lcXVhbHMoYWRhcHRlcikpIHsKLQkJCQkJCXJldHVybiBVTUxFbGVtZW50VHlwZXMuQWN0aXZpdHlQYXJhbWV0ZXJOb2RlXzEwMTI7Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIHN1cGVyLmdldEFkYXB0ZXIoYWRhcHRlcik7Ci0JCQkJfQotCQkJfTsKLQkJCXBhcnNlciA9IFBhcnNlclNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRQYXJzZXIoaGludEFkYXB0ZXIpOwotCQl9Ci0JCXJldHVybiBwYXJzZXI7Ci0JfQotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJvdGVjdGVkIERpcmVjdEVkaXRNYW5hZ2VyIGdldE1hbmFnZXIoKSB7Ci0JCWlmIChtYW5hZ2VyID09IG51bGwpIHsKLQkJCXNldE1hbmFnZXIobmV3IFZhbGlkYXRpbmdUZXh0RGlyZWN0RWRpdE1hbmFnZXIodGhpcywKLQkJCQkJVGV4dERpcmVjdEVkaXRNYW5hZ2VyLmdldFRleHRDZWxsRWRpdG9yQ2xhc3ModGhpcyksCi0JCQkJCVVNTEVkaXRQYXJ0RmFjdG9yeS5nZXRUZXh0Q2VsbEVkaXRvckxvY2F0b3IodGhpcykpIHsKLQotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0KCkgewotCQkJCQkoKEFjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWUyRWRpdFBhcnQpIGdldEVkaXRQYXJ0KCkpCi0JCQkJCQkJLnBlcmZvcm1EaXJlY3RFZGl0KCk7Ci0JCQkJfQotCi0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIFN0cmluZyB2YWxpZGF0ZShTdHJpbmcgdHh0KSB7Ci0JCQkJCXJldHVybiBEaWFncmFtQ29yZVV0aWwudmFsaWRTdHJpbmdGb3JCcmVha2Rvd25FbGVtZW50cygKLQkJCQkJCQlnZXRFZGl0UGFydCgpLCB0eHQpOwotCQkJCX0KLQotCQkJfSk7Ci0JCX0KLQkJcmV0dXJuIG1hbmFnZXI7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldE1hbmFnZXIoRGlyZWN0RWRpdE1hbmFnZXIgbWFuYWdlcikgewotCQl0aGlzLm1hbmFnZXIgPSBtYW5hZ2VyOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdCgpIHsKLQkJZ2V0TWFuYWdlcigpLnNob3coKTsKLQl9Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdChQb2ludCBldmVudExvY2F0aW9uKSB7Ci0JCWlmIChnZXRNYW5hZ2VyKCkgaW5zdGFuY2VvZiBUZXh0RGlyZWN0RWRpdE1hbmFnZXIpIHsKLQkJCSgoVGV4dERpcmVjdEVkaXRNYW5hZ2VyKSBnZXRNYW5hZ2VyKCkpLnNob3coZXZlbnRMb2NhdGlvbgotCQkJCQkuZ2V0U1dUUG9pbnQoKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0KGNoYXIgaW5pdGlhbENoYXJhY3RlcikgewotCQlpZiAoZ2V0TWFuYWdlcigpIGluc3RhbmNlb2YgVGV4dERpcmVjdEVkaXRNYW5hZ2VyKSB7Ci0JCQkoKFRleHREaXJlY3RFZGl0TWFuYWdlcikgZ2V0TWFuYWdlcigpKS5zaG93KGluaXRpYWxDaGFyYWN0ZXIpOwotCQl9IGVsc2UgewotCQkJcGVyZm9ybURpcmVjdEVkaXQoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdFJlcXVlc3QoUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCWZpbmFsIFJlcXVlc3QgdGhlUmVxdWVzdCA9IHJlcXVlc3Q7Ci0JCXRyeSB7Ci0JCQlnZXRFZGl0aW5nRG9tYWluKCkucnVuRXhjbHVzaXZlKG5ldyBSdW5uYWJsZSgpIHsKLQotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJaWYgKGlzQWN0aXZlKCkgJiYgaXNFZGl0YWJsZSgpKSB7Ci0JCQkJCQlpZiAodGhlUmVxdWVzdAotCQkJCQkJCQkuZ2V0RXh0ZW5kZWREYXRhKCkKLQkJCQkJCQkJLmdldCgKLQkJCQkJCQkJCQlSZXF1ZXN0Q29uc3RhbnRzLlJFUV9ESVJFQ1RFRElUX0VYVEVOREVEREFUQV9JTklUSUFMX0NIQVIpIGluc3RhbmNlb2YgQ2hhcmFjdGVyKSB7Ci0JCQkJCQkJQ2hhcmFjdGVyIGluaXRpYWxDaGFyID0gKENoYXJhY3RlcikgdGhlUmVxdWVzdAotCQkJCQkJCQkJLmdldEV4dGVuZGVkRGF0YSgpCi0JCQkJCQkJCQkuZ2V0KAotCQkJCQkJCQkJCQlSZXF1ZXN0Q29uc3RhbnRzLlJFUV9ESVJFQ1RFRElUX0VYVEVOREVEREFUQV9JTklUSUFMX0NIQVIpOwotCQkJCQkJCXBlcmZvcm1EaXJlY3RFZGl0KGluaXRpYWxDaGFyLmNoYXJWYWx1ZSgpKTsKLQkJCQkJCX0gZWxzZSBpZiAoKHRoZVJlcXVlc3QgaW5zdGFuY2VvZiBEaXJlY3RFZGl0UmVxdWVzdCkKLQkJCQkJCQkJJiYgKGdldEVkaXRUZXh0KCkuZXF1YWxzKGdldExhYmVsVGV4dCgpKSkpIHsKLQkJCQkJCQlEaXJlY3RFZGl0UmVxdWVzdCBlZGl0UmVxdWVzdCA9IChEaXJlY3RFZGl0UmVxdWVzdCkgdGhlUmVxdWVzdDsKLQkJCQkJCQlwZXJmb3JtRGlyZWN0RWRpdChlZGl0UmVxdWVzdC5nZXRMb2NhdGlvbigpKTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJcGVyZm9ybURpcmVjdEVkaXQoKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0pOwotCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hWaXN1YWxzKCkgewotCQlzdXBlci5yZWZyZXNoVmlzdWFscygpOwotCQlyZWZyZXNoTGFiZWwoKTsKLQkJcmVmcmVzaEZvbnQoKTsKLQkJcmVmcmVzaEZvbnRDb2xvcigpOwotCQlyZWZyZXNoVW5kZXJsaW5lKCk7Ci0JCXJlZnJlc2hTdHJpa2VUaHJvdWdoKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hMYWJlbCgpIHsKLQkJc2V0TGFiZWxUZXh0SGVscGVyKGdldEZpZ3VyZSgpLCBnZXRMYWJlbFRleHQoKSk7Ci0JCXNldExhYmVsSWNvbkhlbHBlcihnZXRGaWd1cmUoKSwgZ2V0TGFiZWxJY29uKCkpOwotCQlPYmplY3QgcGRFZGl0UG9saWN5ID0gZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFKTsKLQkJaWYgKHBkRWRpdFBvbGljeSBpbnN0YW5jZW9mIFVNTFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSB7Ci0JCQkoKFVNTFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSBwZEVkaXRQb2xpY3kpLnJlZnJlc2hGZWVkYmFjaygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hVbmRlcmxpbmUoKSB7Ci0JCUZvbnRTdHlsZSBzdHlsZSA9IChGb250U3R5bGUpIGdldEZvbnRTdHlsZU93bmVyVmlldygpLmdldFN0eWxlKAotCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlKCkpOwotCQlpZiAoc3R5bGUgIT0gbnVsbCAmJiBnZXRGaWd1cmUoKSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJKChXcmFwTGFiZWwpIGdldEZpZ3VyZSgpKS5zZXRUZXh0VW5kZXJsaW5lKHN0eWxlLmlzVW5kZXJsaW5lKCkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hTdHJpa2VUaHJvdWdoKCkgewotCQlGb250U3R5bGUgc3R5bGUgPSAoRm9udFN0eWxlKSBnZXRGb250U3R5bGVPd25lclZpZXcoKS5nZXRTdHlsZSgKLQkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZSgpKTsKLQkJaWYgKHN0eWxlICE9IG51bGwgJiYgZ2V0RmlndXJlKCkgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCSgoV3JhcExhYmVsKSBnZXRGaWd1cmUoKSkuc2V0VGV4dFN0cmlrZVRocm91Z2goc3R5bGUKLQkJCQkJLmlzU3RyaWtlVGhyb3VnaCgpKTsKLQkJfQotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hGb250KCkgewotCQlGb250U3R5bGUgc3R5bGUgPSAoRm9udFN0eWxlKSBnZXRGb250U3R5bGVPd25lclZpZXcoKS5nZXRTdHlsZSgKLQkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZSgpKTsKLQkJaWYgKHN0eWxlICE9IG51bGwpIHsKLQkJCVN0cmluZyBmb250TmFtZSA9IERpYWdyYW1Db25zdGFudHMuZ2V0Rm9udE5hbWUoc3R5bGUpOwotCQkJRm9udERhdGEgZm9udERhdGEgPSBuZXcgRm9udERhdGEoZm9udE5hbWUsIHN0eWxlCi0JCQkJCS5nZXRGb250SGVpZ2h0KCksIChzdHlsZS5pc0JvbGQoKSA/IFNXVC5CT0xEIDogU1dULk5PUk1BTCkKLQkJCQkJfCAoc3R5bGUuaXNJdGFsaWMoKSA/IFNXVC5JVEFMSUMgOiBTV1QuTk9STUFMKSk7Ci0JCQlzZXRGb250KGZvbnREYXRhKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBtb2RpZmllZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldEZvbnRDb2xvcihDb2xvciBjb2xvcikgewotCQlDb2xvciBjID0gRGlhZ3JhbUNvcmVVdGlsLmdldEZvbnRDb2xvcih0aGlzKTsKLQkJaWYgKGMgIT0gbnVsbCkgewotCQkJY29sb3IgPSBjOwotCQl9Ci0JCWdldEZpZ3VyZSgpLnNldEZvcmVncm91bmRDb2xvcihjb2xvcik7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFNlbWFudGljTGlzdGVuZXJzKCkgewotCQlpZiAoZ2V0UGFyc2VyKCkgaW5zdGFuY2VvZiBJU2VtYW50aWNQYXJzZXIpIHsKLQkJCUVPYmplY3QgZWxlbWVudCA9IHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKTsKLQkJCXBhcnNlckVsZW1lbnRzID0gKChJU2VtYW50aWNQYXJzZXIpIGdldFBhcnNlcigpKQotCQkJCQkuZ2V0U2VtYW50aWNFbGVtZW50c0JlaW5nUGFyc2VkKGVsZW1lbnQpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJzZXJFbGVtZW50cy5zaXplKCk7IGkrKykgewotCQkJCWFkZExpc3RlbmVyRmlsdGVyKAotCQkJCQkJIlNlbWFudGljTW9kZWwiICsgaSwgdGhpcywgKEVPYmplY3QpIHBhcnNlckVsZW1lbnRzLmdldChpKSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXN1cGVyLmFkZFNlbWFudGljTGlzdGVuZXJzKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlU2VtYW50aWNMaXN0ZW5lcnMoKSB7Ci0JCWlmIChwYXJzZXJFbGVtZW50cyAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcnNlckVsZW1lbnRzLnNpemUoKTsgaSsrKSB7Ci0JCQkJcmVtb3ZlTGlzdGVuZXJGaWx0ZXIoIlNlbWFudGljTW9kZWwiICsgaSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXN1cGVyLnJlbW92ZVNlbWFudGljTGlzdGVuZXJzKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEFjY2Vzc2libGVFZGl0UGFydCBnZXRBY2Nlc3NpYmxlRWRpdFBhcnQoKSB7Ci0JCWlmIChhY2Nlc3NpYmxlRVAgPT0gbnVsbCkgewotCQkJYWNjZXNzaWJsZUVQID0gbmV3IEFjY2Vzc2libGVHcmFwaGljYWxFZGl0UGFydCgpIHsKLQotCQkJCXB1YmxpYyB2b2lkIGdldE5hbWUoQWNjZXNzaWJsZUV2ZW50IGUpIHsKLQkJCQkJZS5yZXN1bHQgPSBnZXRMYWJlbFRleHRIZWxwZXIoZ2V0RmlndXJlKCkpOwotCQkJCX0KLQkJCX07Ci0JCX0KLQkJcmV0dXJuIGFjY2Vzc2libGVFUDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBWaWV3IGdldEZvbnRTdHlsZU93bmVyVmlldygpIHsKLQkJcmV0dXJuIGdldFByaW1hcnlWaWV3KCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZE5vdGF0aW9uYWxMaXN0ZW5lcnMoKSB7Ci0JCXN1cGVyLmFkZE5vdGF0aW9uYWxMaXN0ZW5lcnMoKTsKLQkJYWRkTGlzdGVuZXJGaWx0ZXIoIlByaW1hcnlWaWV3IiwgdGhpcywgZ2V0UHJpbWFyeVZpZXcoKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlTm90YXRpb25hbExpc3RlbmVycygpIHsKLQkJc3VwZXIucmVtb3ZlTm90YXRpb25hbExpc3RlbmVycygpOwotCQlyZW1vdmVMaXN0ZW5lckZpbHRlcigiUHJpbWFyeVZpZXciKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVOb3RpZmljYXRpb25FdmVudChOb3RpZmljYXRpb24gZXZlbnQpIHsKLQkJT2JqZWN0IGZlYXR1cmUgPSBldmVudC5nZXRGZWF0dXJlKCk7Ci0JCWlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Gb250Q29sb3IoKS5lcXVhbHMoZmVhdHVyZSkpIHsKLQkJCUludGVnZXIgYyA9IChJbnRlZ2VyKSBldmVudC5nZXROZXdWYWx1ZSgpOwotCQkJc2V0Rm9udENvbG9yKERpYWdyYW1Db2xvclJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0Q29sb3IoYykpOwotCQl9IGVsc2UgaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX1VuZGVybGluZSgpLmVxdWFscygKLQkJCQlmZWF0dXJlKSkgewotCQkJcmVmcmVzaFVuZGVybGluZSgpOwotCQl9IGVsc2UgaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX1N0cmlrZVRocm91Z2goKQotCQkJCS5lcXVhbHMoZmVhdHVyZSkpIHsKLQkJCXJlZnJlc2hTdHJpa2VUaHJvdWdoKCk7Ci0JCX0gZWxzZSBpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfRm9udEhlaWdodCgpLmVxdWFscygKLQkJCQlmZWF0dXJlKQotCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0ZvbnROYW1lKCkuZXF1YWxzKAotCQkJCQkJZmVhdHVyZSkKLQkJCQl8fCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Cb2xkKCkKLQkJCQkJCS5lcXVhbHMoZmVhdHVyZSkKLQkJCQl8fCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9JdGFsaWMoKS5lcXVhbHMoCi0JCQkJCQlmZWF0dXJlKSkgewotCQkJcmVmcmVzaEZvbnQoKTsKLQkJfSBlbHNlIHsKLQkJCWlmIChnZXRQYXJzZXIoKSAhPSBudWxsCi0JCQkJCSYmIGdldFBhcnNlcigpLmlzQWZmZWN0aW5nRXZlbnQoZXZlbnQsCi0JCQkJCQkJZ2V0UGFyc2VyT3B0aW9ucygpLmludFZhbHVlKCkpKSB7Ci0JCQkJcmVmcmVzaExhYmVsKCk7Ci0JCQl9Ci0JCQlpZiAoZ2V0UGFyc2VyKCkgaW5zdGFuY2VvZiBJU2VtYW50aWNQYXJzZXIpIHsKLQkJCQlJU2VtYW50aWNQYXJzZXIgbW9kZWxQYXJzZXIgPSAoSVNlbWFudGljUGFyc2VyKSBnZXRQYXJzZXIoKTsKLQkJCQlpZiAobW9kZWxQYXJzZXIuYXJlU2VtYW50aWNFbGVtZW50c0FmZmVjdGVkKG51bGwsIGV2ZW50KSkgewotCQkJCQlyZW1vdmVTZW1hbnRpY0xpc3RlbmVycygpOwotCQkJCQlpZiAocmVzb2x2ZVNlbWFudGljRWxlbWVudCgpICE9IG51bGwpIHsKLQkJCQkJCWFkZFNlbWFudGljTGlzdGVuZXJzKCk7Ci0JCQkJCX0KLQkJCQkJcmVmcmVzaExhYmVsKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXN1cGVyLmhhbmRsZU5vdGlmaWNhdGlvbkV2ZW50KGV2ZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlRmlndXJlKCkgewotCQkvLyBQYXJlbnQgc2hvdWxkIGFzc2lnbiBvbmUgdXNpbmcgc2V0TGFiZWwoKSBtZXRob2QKLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcGFydHMvQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZUVkaXRQYXJ0LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wYXJ0cy9BY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lRWRpdFBhcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjYxMTU3My4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wYXJ0cy9BY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lRWRpdFBhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyNCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uUnVubmFibGVXaXRoUmVzdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucG9saWNpZXMuVU1MVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQucGFydC5BY3Rpdml0eURpYWdyYW1FZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQucHJvdmlkZXJzLlVNTEVsZW1lbnRUeXBlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnByb3ZpZGVycy5EaWFncmFtSWNvblByb3ZpZGVyTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnV0aWwuRGlhZ3JhbUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnV0aWwuRGlhZ3JhbUNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUudXRpbC5WYWxpZGF0aW5nVGV4dERpcmVjdEVkaXRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5BY2Nlc3NpYmxlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuTm9uUmVzaXphYmxlRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuaGFuZGxlcy5Ob25SZXNpemFibGVIYW5kbGVLaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLkRpcmVjdEVkaXRSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi50b29scy5EaXJlY3RFZGl0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLklQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5JUGFyc2VyRWRpdFN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLlBhcnNlckVkaXRTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5QYXJzZXJPcHRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuUGFyc2VyU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5Db21wYXJ0bWVudEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklHcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JVGV4dEF3YXJlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuTGFiZWxEaXJlY3RFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkubDEwbi5EaWFncmFtQ29sb3JSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlcXVlc3RzLlJlcXVlc3RDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS50b29scy5UZXh0RGlyZWN0RWRpdE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb3JlLnV0aWwuRU9iamVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5JRWxlbWVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnVpLnNlcnZpY2VzLnBhcnNlci5JU2VtYW50aWNQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnVpLnNlcnZpY2VzLnBhcnNlci5QYXJzZXJIaW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Gb250U3R5bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm90YXRpb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZW50QXNzaXN0UHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNlbGxFZGl0b3JWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmxlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250RGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZUVkaXRQYXJ0IGV4dGVuZHMgQ29tcGFydG1lbnRFZGl0UGFydAotCQlpbXBsZW1lbnRzIElUZXh0QXdhcmVFZGl0UGFydCB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVklTVUFMX0lEID0gNDAwODsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIERpcmVjdEVkaXRNYW5hZ2VyIG1hbmFnZXI7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBJUGFyc2VyIHBhcnNlcjsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIExpc3QgcGFyc2VyRWxlbWVudHM7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZGVmYXVsdFRleHQ7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWVFZGl0UGFydChWaWV3IHZpZXcpIHsKLQkJc3VwZXIodmlldyk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKSB7Ci0JCXN1cGVyLmNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKTsKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5ESVJFQ1RfRURJVF9ST0xFLAotCQkJCW5ldyBMYWJlbERpcmVjdEVkaXRQb2xpY3koKSk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUsCi0JCQkJbmV3IE5vblJlc2l6YWJsZUVkaXRQb2xpY3koKSB7Ci0KLQkJCQkJcHJvdGVjdGVkIExpc3QgY3JlYXRlU2VsZWN0aW9uSGFuZGxlcygpIHsKLQkJCQkJCUxpc3QgaGFuZGxlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJCU5vblJlc2l6YWJsZUhhbmRsZUtpdC5hZGRNb3ZlSGFuZGxlKAotCQkJCQkJCQkoR3JhcGhpY2FsRWRpdFBhcnQpIGdldEhvc3QoKSwgaGFuZGxlcyk7Ci0JCQkJCQlyZXR1cm4gaGFuZGxlczsKLQkJCQkJfQotCi0JCQkJCXB1YmxpYyBDb21tYW5kIGdldENvbW1hbmQoUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQkJfQotCi0JCQkJCXB1YmxpYyBib29sZWFuIHVuZGVyc3RhbmRzUmVxdWVzdChSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJfQotCQkJCX0pOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldExhYmVsVGV4dEhlbHBlcihJRmlndXJlIGZpZ3VyZSkgewotCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQlyZXR1cm4gKChXcmFwTGFiZWwpIGZpZ3VyZSkuZ2V0VGV4dCgpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuICgoTGFiZWwpIGZpZ3VyZSkuZ2V0VGV4dCgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldExhYmVsVGV4dEhlbHBlcihJRmlndXJlIGZpZ3VyZSwgU3RyaW5nIHRleHQpIHsKLQkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJKChXcmFwTGFiZWwpIGZpZ3VyZSkuc2V0VGV4dCh0ZXh0KTsKLQkJfSBlbHNlIHsKLQkJCSgoTGFiZWwpIGZpZ3VyZSkuc2V0VGV4dCh0ZXh0KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSW1hZ2UgZ2V0TGFiZWxJY29uSGVscGVyKElGaWd1cmUgZmlndXJlKSB7Ci0JCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCXJldHVybiAoKFdyYXBMYWJlbCkgZmlndXJlKS5nZXRJY29uKCk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gKChMYWJlbCkgZmlndXJlKS5nZXRJY29uKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0TGFiZWxJY29uSGVscGVyKElGaWd1cmUgZmlndXJlLCBJbWFnZSBpY29uKSB7Ci0JCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCSgoV3JhcExhYmVsKSBmaWd1cmUpLnNldEljb24oaWNvbik7Ci0JCX0gZWxzZSB7Ci0JCQkoKExhYmVsKSBmaWd1cmUpLnNldEljb24oaWNvbik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGFiZWwoV3JhcExhYmVsIGZpZ3VyZSkgewotCQl1bnJlZ2lzdGVyVmlzdWFscygpOwotCQlzZXRGaWd1cmUoZmlndXJlKTsKLQkJZGVmYXVsdFRleHQgPSBnZXRMYWJlbFRleHRIZWxwZXIoZmlndXJlKTsKLQkJcmVnaXN0ZXJWaXN1YWxzKCk7Ci0JCXJlZnJlc2hWaXN1YWxzKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBMaXN0IGdldE1vZGVsQ2hpbGRyZW4oKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSUdyYXBoaWNhbEVkaXRQYXJ0IGdldENoaWxkQnlTZW1hbnRpY0hpbnQoU3RyaW5nIHNlbWFudGljSGludCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVPYmplY3QgZ2V0UGFyc2VyRWxlbWVudCgpIHsKLQkJRU9iamVjdCBlbGVtZW50ID0gcmVzb2x2ZVNlbWFudGljRWxlbWVudCgpOwotCQlyZXR1cm4gZWxlbWVudCAhPSBudWxsID8gZWxlbWVudCA6IChWaWV3KSBnZXRNb2RlbCgpOwotCX0KLQotCS8qKgotCSAqIEBtb2RpZmllZAotCSAqLwotCXByb3RlY3RlZCBJbWFnZSBnZXRMYWJlbEljb24oKSB7Ci0JCUltYWdlIGltYWdlID0gIERpYWdyYW1JY29uUHJvdmlkZXJNYW5hZ2VyLmdldEluc3RhbmNlKCkuZ2V0SWNvbihyZXNvbHZlU2VtYW50aWNFbGVtZW50KCksIGZhbHNlKTsKLQkJaWYgKGltYWdlID09IG51bGwpIHsKLQkJCWltYWdlID0gQWN0aXZpdHlEaWFncmFtRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0U2hhcmVkSW1hZ2UoImRpYWdyYW0vdGFza2Rlc2NyaXB0b3IuZ2lmIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gaW1hZ2U7CQkKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRMYWJlbFRleHQoKSB7Ci0JCVN0cmluZyB0ZXh0ID0gbnVsbDsKLQkJaWYgKGdldFBhcnNlcigpICE9IG51bGwpIHsKLQkJCXRleHQgPSBnZXRQYXJzZXIoKS5nZXRQcmludFN0cmluZygKLQkJCQkJbmV3IEVPYmplY3RBZGFwdGVyKGdldFBhcnNlckVsZW1lbnQoKSksCi0JCQkJCWdldFBhcnNlck9wdGlvbnMoKS5pbnRWYWx1ZSgpKTsKLQkJfQotCQlpZiAodGV4dCA9PSBudWxsIHx8IHRleHQubGVuZ3RoKCkgPT0gMCkgewotCQkJdGV4dCA9IGRlZmF1bHRUZXh0OwotCQl9Ci0JCXJldHVybiB0ZXh0OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMYWJlbFRleHQoU3RyaW5nIHRleHQpIHsKLQkJc2V0TGFiZWxUZXh0SGVscGVyKGdldEZpZ3VyZSgpLCB0ZXh0KTsKLQkJT2JqZWN0IHBkRWRpdFBvbGljeSA9IGdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSk7Ci0JCWlmIChwZEVkaXRQb2xpY3kgaW5zdGFuY2VvZiBVTUxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgewotCQkJKChVTUxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgcGRFZGl0UG9saWN5KS5yZWZyZXNoRmVlZGJhY2soKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEVkaXRUZXh0KCkgewotCQlpZiAoZ2V0UGFyc2VyKCkgPT0gbnVsbCkgewotCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIGdldFBhcnNlcigpLmdldEVkaXRTdHJpbmcoCi0JCQkJbmV3IEVPYmplY3RBZGFwdGVyKGdldFBhcnNlckVsZW1lbnQoKSksCi0JCQkJZ2V0UGFyc2VyT3B0aW9ucygpLmludFZhbHVlKCkpOwotCX0KLQotCS8qKgotCSAqIEBtb2RpZmllZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzRWRpdGFibGUoKSB7Ci0JCWlmIChEaWFncmFtQ29yZVV0aWwuaXNSZWFkT25seSh0aGlzKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIGdldEVkaXRUZXh0KCkgIT0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElDZWxsRWRpdG9yVmFsaWRhdG9yIGdldEVkaXRUZXh0VmFsaWRhdG9yKCkgewotCQlyZXR1cm4gbmV3IElDZWxsRWRpdG9yVmFsaWRhdG9yKCkgewotCi0JCQlwdWJsaWMgU3RyaW5nIGlzVmFsaWQoZmluYWwgT2JqZWN0IHZhbHVlKSB7Ci0JCQkJaWYgKHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0JCQkJCWZpbmFsIEVPYmplY3QgZWxlbWVudCA9IGdldFBhcnNlckVsZW1lbnQoKTsKLQkJCQkJZmluYWwgSVBhcnNlciBwYXJzZXIgPSBnZXRQYXJzZXIoKTsKLQkJCQkJdHJ5IHsKLQkJCQkJCUlQYXJzZXJFZGl0U3RhdHVzIHZhbGlkID0gKElQYXJzZXJFZGl0U3RhdHVzKSBnZXRFZGl0aW5nRG9tYWluKCkKLQkJCQkJCQkJLnJ1bkV4Y2x1c2l2ZShuZXcgUnVubmFibGVXaXRoUmVzdWx0LkltcGwoKSB7Ci0KLQkJCQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQkJCQlzZXRSZXN1bHQocGFyc2VyLmlzVmFsaWRFZGl0U3RyaW5nKAotCQkJCQkJCQkJCQkJbmV3IEVPYmplY3RBZGFwdGVyKGVsZW1lbnQpLAotCQkJCQkJCQkJCQkJKFN0cmluZykgdmFsdWUpKTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfSk7Ci0JCQkJCQlyZXR1cm4gdmFsaWQuZ2V0Q29kZSgpID09IFBhcnNlckVkaXRTdGF0dXMuRURJVEFCTEUgPyBudWxsCi0JCQkJCQkJCTogdmFsaWQuZ2V0TWVzc2FnZSgpOwotCQkJCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZSkgewotCQkJCQkJaWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQkvLyBzaG91bGRuJ3QgZ2V0IGhlcmUKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElDb250ZW50QXNzaXN0UHJvY2Vzc29yIGdldENvbXBsZXRpb25Qcm9jZXNzb3IoKSB7Ci0JCWlmIChnZXRQYXJzZXIoKSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gZ2V0UGFyc2VyKCkuZ2V0Q29tcGxldGlvblByb2Nlc3NvcigKLQkJCQluZXcgRU9iamVjdEFkYXB0ZXIoZ2V0UGFyc2VyRWxlbWVudCgpKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQYXJzZXJPcHRpb25zIGdldFBhcnNlck9wdGlvbnMoKSB7Ci0JCXJldHVybiBQYXJzZXJPcHRpb25zLk5PTkU7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJUGFyc2VyIGdldFBhcnNlcigpIHsKLQkJaWYgKHBhcnNlciA9PSBudWxsKSB7Ci0JCQlTdHJpbmcgcGFyc2VySGludCA9ICgoVmlldykgZ2V0TW9kZWwoKSkuZ2V0VHlwZSgpOwotCQkJUGFyc2VySGludEFkYXB0ZXIgaGludEFkYXB0ZXIgPSBuZXcgUGFyc2VySGludEFkYXB0ZXIoCi0JCQkJCWdldFBhcnNlckVsZW1lbnQoKSwgcGFyc2VySGludCkgewotCi0JCQkJcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKENsYXNzIGFkYXB0ZXIpIHsKLQkJCQkJaWYgKElFbGVtZW50VHlwZS5jbGFzcy5lcXVhbHMoYWRhcHRlcikpIHsKLQkJCQkJCXJldHVybiBVTUxFbGVtZW50VHlwZXMuQWN0aXZpdHlQYXJhbWV0ZXJOb2RlXzEwMDk7Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIHN1cGVyLmdldEFkYXB0ZXIoYWRhcHRlcik7Ci0JCQkJfQotCQkJfTsKLQkJCXBhcnNlciA9IFBhcnNlclNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRQYXJzZXIoaGludEFkYXB0ZXIpOwotCQl9Ci0JCXJldHVybiBwYXJzZXI7Ci0JfQotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJvdGVjdGVkIERpcmVjdEVkaXRNYW5hZ2VyIGdldE1hbmFnZXIoKSB7Ci0JCWlmIChtYW5hZ2VyID09IG51bGwpIHsKLQkJCXNldE1hbmFnZXIobmV3IFZhbGlkYXRpbmdUZXh0RGlyZWN0RWRpdE1hbmFnZXIodGhpcywKLQkJCQkJVGV4dERpcmVjdEVkaXRNYW5hZ2VyLmdldFRleHRDZWxsRWRpdG9yQ2xhc3ModGhpcyksCi0JCQkJCVVNTEVkaXRQYXJ0RmFjdG9yeS5nZXRUZXh0Q2VsbEVkaXRvckxvY2F0b3IodGhpcykpIHsKLQotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0KCkgewotCQkJCQkoKEFjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWVFZGl0UGFydCkgZ2V0RWRpdFBhcnQoKSkKLQkJCQkJCQkucGVyZm9ybURpcmVjdEVkaXQoKTsKLQkJCQl9Ci0KLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgU3RyaW5nIHZhbGlkYXRlKFN0cmluZyB0eHQpIHsKLQkJCQkJcmV0dXJuIERpYWdyYW1Db3JlVXRpbC52YWxpZFN0cmluZ0ZvckJyZWFrZG93bkVsZW1lbnRzKAotCQkJCQkJCWdldEVkaXRQYXJ0KCksIHR4dCk7Ci0JCQkJfQotCi0JCQl9KTsKLQkJfQotCQlyZXR1cm4gbWFuYWdlcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0TWFuYWdlcihEaXJlY3RFZGl0TWFuYWdlciBtYW5hZ2VyKSB7Ci0JCXRoaXMubWFuYWdlciA9IG1hbmFnZXI7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0KCkgewotCQlnZXRNYW5hZ2VyKCkuc2hvdygpOwotCX0KLQotCS8qKgotCSAqIEBtb2RpZmllZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0KFBvaW50IGV2ZW50TG9jYXRpb24pIHsKLQkJaWYgKGdldE1hbmFnZXIoKSBpbnN0YW5jZW9mIFRleHREaXJlY3RFZGl0TWFuYWdlcikgewotCQkJKChUZXh0RGlyZWN0RWRpdE1hbmFnZXIpIGdldE1hbmFnZXIoKSkuc2hvdyhldmVudExvY2F0aW9uCi0JCQkJCS5nZXRTV1RQb2ludCgpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHZvaWQgcGVyZm9ybURpcmVjdEVkaXQoY2hhciBpbml0aWFsQ2hhcmFjdGVyKSB7Ci0JCWlmIChnZXRNYW5hZ2VyKCkgaW5zdGFuY2VvZiBUZXh0RGlyZWN0RWRpdE1hbmFnZXIpIHsKLQkJCSgoVGV4dERpcmVjdEVkaXRNYW5hZ2VyKSBnZXRNYW5hZ2VyKCkpLnNob3coaW5pdGlhbENoYXJhY3Rlcik7Ci0JCX0gZWxzZSB7Ci0JCQlwZXJmb3JtRGlyZWN0RWRpdCgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0UmVxdWVzdChSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJZmluYWwgUmVxdWVzdCB0aGVSZXF1ZXN0ID0gcmVxdWVzdDsKLQkJdHJ5IHsKLQkJCWdldEVkaXRpbmdEb21haW4oKS5ydW5FeGNsdXNpdmUobmV3IFJ1bm5hYmxlKCkgewotCi0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQlpZiAoaXNBY3RpdmUoKSAmJiBpc0VkaXRhYmxlKCkpIHsKLQkJCQkJCWlmICh0aGVSZXF1ZXN0Ci0JCQkJCQkJCS5nZXRFeHRlbmRlZERhdGEoKQotCQkJCQkJCQkuZ2V0KAotCQkJCQkJCQkJCVJlcXVlc3RDb25zdGFudHMuUkVRX0RJUkVDVEVESVRfRVhURU5ERUREQVRBX0lOSVRJQUxfQ0hBUikgaW5zdGFuY2VvZiBDaGFyYWN0ZXIpIHsKLQkJCQkJCQlDaGFyYWN0ZXIgaW5pdGlhbENoYXIgPSAoQ2hhcmFjdGVyKSB0aGVSZXF1ZXN0Ci0JCQkJCQkJCQkuZ2V0RXh0ZW5kZWREYXRhKCkKLQkJCQkJCQkJCS5nZXQoCi0JCQkJCQkJCQkJCVJlcXVlc3RDb25zdGFudHMuUkVRX0RJUkVDVEVESVRfRVhURU5ERUREQVRBX0lOSVRJQUxfQ0hBUik7Ci0JCQkJCQkJcGVyZm9ybURpcmVjdEVkaXQoaW5pdGlhbENoYXIuY2hhclZhbHVlKCkpOwotCQkJCQkJfSBlbHNlIGlmICgodGhlUmVxdWVzdCBpbnN0YW5jZW9mIERpcmVjdEVkaXRSZXF1ZXN0KQotCQkJCQkJCQkmJiAoZ2V0RWRpdFRleHQoKS5lcXVhbHMoZ2V0TGFiZWxUZXh0KCkpKSkgewotCQkJCQkJCURpcmVjdEVkaXRSZXF1ZXN0IGVkaXRSZXF1ZXN0ID0gKERpcmVjdEVkaXRSZXF1ZXN0KSB0aGVSZXF1ZXN0OwotCQkJCQkJCXBlcmZvcm1EaXJlY3RFZGl0KGVkaXRSZXF1ZXN0LmdldExvY2F0aW9uKCkpOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlwZXJmb3JtRGlyZWN0RWRpdCgpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfSk7Ci0JCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFZpc3VhbHMoKSB7Ci0JCXN1cGVyLnJlZnJlc2hWaXN1YWxzKCk7Ci0JCXJlZnJlc2hMYWJlbCgpOwotCQlyZWZyZXNoRm9udCgpOwotCQlyZWZyZXNoRm9udENvbG9yKCk7Ci0JCXJlZnJlc2hVbmRlcmxpbmUoKTsKLQkJcmVmcmVzaFN0cmlrZVRocm91Z2goKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaExhYmVsKCkgewotCQlzZXRMYWJlbFRleHRIZWxwZXIoZ2V0RmlndXJlKCksIGdldExhYmVsVGV4dCgpKTsKLQkJc2V0TGFiZWxJY29uSGVscGVyKGdldEZpZ3VyZSgpLCBnZXRMYWJlbEljb24oKSk7Ci0JCU9iamVjdCBwZEVkaXRQb2xpY3kgPSBnZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUpOwotCQlpZiAocGRFZGl0UG9saWN5IGluc3RhbmNlb2YgVU1MVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHsKLQkJCSgoVU1MVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHBkRWRpdFBvbGljeSkucmVmcmVzaEZlZWRiYWNrKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFVuZGVybGluZSgpIHsKLQkJRm9udFN0eWxlIHN0eWxlID0gKEZvbnRTdHlsZSkgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkuZ2V0U3R5bGUoCi0JCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGUoKSk7Ci0JCWlmIChzdHlsZSAhPSBudWxsICYmIGdldEZpZ3VyZSgpIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQkoKFdyYXBMYWJlbCkgZ2V0RmlndXJlKCkpLnNldFRleHRVbmRlcmxpbmUoc3R5bGUuaXNVbmRlcmxpbmUoKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFN0cmlrZVRocm91Z2goKSB7Ci0JCUZvbnRTdHlsZSBzdHlsZSA9IChGb250U3R5bGUpIGdldEZvbnRTdHlsZU93bmVyVmlldygpLmdldFN0eWxlKAotCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlKCkpOwotCQlpZiAoc3R5bGUgIT0gbnVsbCAmJiBnZXRGaWd1cmUoKSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJKChXcmFwTGFiZWwpIGdldEZpZ3VyZSgpKS5zZXRUZXh0U3RyaWtlVGhyb3VnaChzdHlsZQotCQkJCQkuaXNTdHJpa2VUaHJvdWdoKCkpOwotCQl9Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaEZvbnQoKSB7Ci0JCUZvbnRTdHlsZSBzdHlsZSA9IChGb250U3R5bGUpIGdldEZvbnRTdHlsZU93bmVyVmlldygpLmdldFN0eWxlKAotCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlKCkpOwotCQlpZiAoc3R5bGUgIT0gbnVsbCkgewotCQkJU3RyaW5nIGZvbnROYW1lID0gRGlhZ3JhbUNvbnN0YW50cy5nZXRGb250TmFtZShzdHlsZSk7Ci0JCQlGb250RGF0YSBmb250RGF0YSA9IG5ldyBGb250RGF0YShmb250TmFtZSwgc3R5bGUKLQkJCQkJLmdldEZvbnRIZWlnaHQoKSwgKHN0eWxlLmlzQm9sZCgpID8gU1dULkJPTEQgOiBTV1QuTk9STUFMKQotCQkJCQl8IChzdHlsZS5pc0l0YWxpYygpID8gU1dULklUQUxJQyA6IFNXVC5OT1JNQUwpKTsKLQkJCXNldEZvbnQoZm9udERhdGEpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0Rm9udENvbG9yKENvbG9yIGNvbG9yKSB7Ci0JCUNvbG9yIGMgPSBEaWFncmFtQ29yZVV0aWwuZ2V0Rm9udENvbG9yKHRoaXMpOwotCQlpZiAoYyAhPSBudWxsKSB7Ci0JCQljb2xvciA9IGM7Ci0JCX0KLQkJZ2V0RmlndXJlKCkuc2V0Rm9yZWdyb3VuZENvbG9yKGNvbG9yKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkU2VtYW50aWNMaXN0ZW5lcnMoKSB7Ci0JCWlmIChnZXRQYXJzZXIoKSBpbnN0YW5jZW9mIElTZW1hbnRpY1BhcnNlcikgewotCQkJRU9iamVjdCBlbGVtZW50ID0gcmVzb2x2ZVNlbWFudGljRWxlbWVudCgpOwotCQkJcGFyc2VyRWxlbWVudHMgPSAoKElTZW1hbnRpY1BhcnNlcikgZ2V0UGFyc2VyKCkpCi0JCQkJCS5nZXRTZW1hbnRpY0VsZW1lbnRzQmVpbmdQYXJzZWQoZWxlbWVudCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcnNlckVsZW1lbnRzLnNpemUoKTsgaSsrKSB7Ci0JCQkJYWRkTGlzdGVuZXJGaWx0ZXIoCi0JCQkJCQkiU2VtYW50aWNNb2RlbCIgKyBpLCB0aGlzLCAoRU9iamVjdCkgcGFyc2VyRWxlbWVudHMuZ2V0KGkpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9IGVsc2UgewotCQkJc3VwZXIuYWRkU2VtYW50aWNMaXN0ZW5lcnMoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVTZW1hbnRpY0xpc3RlbmVycygpIHsKLQkJaWYgKHBhcnNlckVsZW1lbnRzICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGFyc2VyRWxlbWVudHMuc2l6ZSgpOyBpKyspIHsKLQkJCQlyZW1vdmVMaXN0ZW5lckZpbHRlcigiU2VtYW50aWNNb2RlbCIgKyBpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9IGVsc2UgewotCQkJc3VwZXIucmVtb3ZlU2VtYW50aWNMaXN0ZW5lcnMoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQWNjZXNzaWJsZUVkaXRQYXJ0IGdldEFjY2Vzc2libGVFZGl0UGFydCgpIHsKLQkJaWYgKGFjY2Vzc2libGVFUCA9PSBudWxsKSB7Ci0JCQlhY2Nlc3NpYmxlRVAgPSBuZXcgQWNjZXNzaWJsZUdyYXBoaWNhbEVkaXRQYXJ0KCkgewotCi0JCQkJcHVibGljIHZvaWQgZ2V0TmFtZShBY2Nlc3NpYmxlRXZlbnQgZSkgewotCQkJCQllLnJlc3VsdCA9IGdldExhYmVsVGV4dEhlbHBlcihnZXRGaWd1cmUoKSk7Ci0JCQkJfQotCQkJfTsKLQkJfQotCQlyZXR1cm4gYWNjZXNzaWJsZUVQOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIFZpZXcgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkgewotCQlyZXR1cm4gZ2V0UHJpbWFyeVZpZXcoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkTm90YXRpb25hbExpc3RlbmVycygpIHsKLQkJc3VwZXIuYWRkTm90YXRpb25hbExpc3RlbmVycygpOwotCQlhZGRMaXN0ZW5lckZpbHRlcigiUHJpbWFyeVZpZXciLCB0aGlzLCBnZXRQcmltYXJ5VmlldygpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVOb3RhdGlvbmFsTGlzdGVuZXJzKCkgewotCQlzdXBlci5yZW1vdmVOb3RhdGlvbmFsTGlzdGVuZXJzKCk7Ci0JCXJlbW92ZUxpc3RlbmVyRmlsdGVyKCJQcmltYXJ5VmlldyIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGhhbmRsZU5vdGlmaWNhdGlvbkV2ZW50KE5vdGlmaWNhdGlvbiBldmVudCkgewotCQlPYmplY3QgZmVhdHVyZSA9IGV2ZW50LmdldEZlYXR1cmUoKTsKLQkJaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0ZvbnRDb2xvcigpLmVxdWFscyhmZWF0dXJlKSkgewotCQkJSW50ZWdlciBjID0gKEludGVnZXIpIGV2ZW50LmdldE5ld1ZhbHVlKCk7Ci0JCQlzZXRGb250Q29sb3IoRGlhZ3JhbUNvbG9yUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXRDb2xvcihjKSk7Ci0JCX0gZWxzZSBpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfVW5kZXJsaW5lKCkuZXF1YWxzKAotCQkJCWZlYXR1cmUpKSB7Ci0JCQlyZWZyZXNoVW5kZXJsaW5lKCk7Ci0JCX0gZWxzZSBpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfU3RyaWtlVGhyb3VnaCgpCi0JCQkJLmVxdWFscyhmZWF0dXJlKSkgewotCQkJcmVmcmVzaFN0cmlrZVRocm91Z2goKTsKLQkJfSBlbHNlIGlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Gb250SGVpZ2h0KCkuZXF1YWxzKAotCQkJCWZlYXR1cmUpCi0JCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfRm9udE5hbWUoKS5lcXVhbHMoCi0JCQkJCQlmZWF0dXJlKQotCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0JvbGQoKQotCQkJCQkJLmVxdWFscyhmZWF0dXJlKQotCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0l0YWxpYygpLmVxdWFscygKLQkJCQkJCWZlYXR1cmUpKSB7Ci0JCQlyZWZyZXNoRm9udCgpOwotCQl9IGVsc2UgewotCQkJaWYgKGdldFBhcnNlcigpICE9IG51bGwKLQkJCQkJJiYgZ2V0UGFyc2VyKCkuaXNBZmZlY3RpbmdFdmVudChldmVudCwKLQkJCQkJCQlnZXRQYXJzZXJPcHRpb25zKCkuaW50VmFsdWUoKSkpIHsKLQkJCQlyZWZyZXNoTGFiZWwoKTsKLQkJCX0KLQkJCWlmIChnZXRQYXJzZXIoKSBpbnN0YW5jZW9mIElTZW1hbnRpY1BhcnNlcikgewotCQkJCUlTZW1hbnRpY1BhcnNlciBtb2RlbFBhcnNlciA9IChJU2VtYW50aWNQYXJzZXIpIGdldFBhcnNlcigpOwotCQkJCWlmIChtb2RlbFBhcnNlci5hcmVTZW1hbnRpY0VsZW1lbnRzQWZmZWN0ZWQobnVsbCwgZXZlbnQpKSB7Ci0JCQkJCXJlbW92ZVNlbWFudGljTGlzdGVuZXJzKCk7Ci0JCQkJCWlmIChyZXNvbHZlU2VtYW50aWNFbGVtZW50KCkgIT0gbnVsbCkgewotCQkJCQkJYWRkU2VtYW50aWNMaXN0ZW5lcnMoKTsKLQkJCQkJfQotCQkJCQlyZWZyZXNoTGFiZWwoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJc3VwZXIuaGFuZGxlTm90aWZpY2F0aW9uRXZlbnQoZXZlbnQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVGaWd1cmUoKSB7Ci0JCS8vIFBhcmVudCBzaG91bGQgYXNzaWduIG9uZSB1c2luZyBzZXRMYWJlbCgpIG1ldGhvZAotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wYXJ0cy9BY3Rpdml0eVBhcnRpdGlvbjJFZGl0UGFydC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcGFydHMvQWN0aXZpdHlQYXJ0aXRpb24yRWRpdFBhcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWE5OWFhNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wYXJ0cy9BY3Rpdml0eVBhcnRpdGlvbjJFZGl0UGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzE4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuQ29sb3JDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkZyZWVmb3JtTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5MaW5lQm9yZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlN0YWNrTGF5b3V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlhZTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5SZWN0YW5nbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBvbGljaWVzLkFjdGl2aXR5UGFydGl0aW9uMkNhbm9uaWNhbEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wb2xpY2llcy5BY3Rpdml0eVBhcnRpdGlvbjJHcmFwaGljYWxOb2RlRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBvbGljaWVzLkFjdGl2aXR5UGFydGl0aW9uMkl0ZW1TZW1hbnRpY0VkaXRQb2xpY3k7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5wYXJ0LlVNTFZpc3VhbElEUmVnaXN0cnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3k7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLkxheW91dEVkaXRQb2xpY3k7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JR3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuU2hhcGVOb2RlRWRpdFBhcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5FZGl0UG9saWN5Um9sZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuUmVzaXphYmxlU2hhcGVFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLlhZTGF5b3V0RWRpdFBvbGljeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5nZWYudWkuZmlndXJlcy5EZWZhdWx0U2l6ZU5vZGVGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZ2VmLnVpLmZpZ3VyZXMuTm9kZUZpZ3VyZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXR5UGFydGl0aW9uMkVkaXRQYXJ0IGV4dGVuZHMgU2hhcGVOb2RlRWRpdFBhcnQgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZJU1VBTF9JRCA9IDIwMDE7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgY29udGVudFBhbmU7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgcHJpbWFyeVNoYXBlOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBY3Rpdml0eVBhcnRpdGlvbjJFZGl0UGFydChWaWV3IHZpZXcpIHsKLQkJc3VwZXIodmlldyk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKSB7Ci0KLQkJc3VwZXIuY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpOwotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuU0VNQU5USUNfUk9MRSwKLQkJCQluZXcgQWN0aXZpdHlQYXJ0aXRpb24ySXRlbVNlbWFudGljRWRpdFBvbGljeSgpKTsKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5MQVlPVVRfUk9MRSwgY3JlYXRlTGF5b3V0RWRpdFBvbGljeSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIExheW91dEVkaXRQb2xpY3kgY3JlYXRlTGF5b3V0RWRpdFBvbGljeSgpIHsKLQkJWFlMYXlvdXRFZGl0UG9saWN5IGxlcCA9IG5ldyBYWUxheW91dEVkaXRQb2xpY3koKSB7Ci0KLQkJCXByb3RlY3RlZCBFZGl0UG9saWN5IGNyZWF0ZUNoaWxkRWRpdFBvbGljeShFZGl0UGFydCBjaGlsZCkgewotCQkJCUVkaXRQb2xpY3kgcmVzdWx0ID0gc3VwZXIuY3JlYXRlQ2hpbGRFZGl0UG9saWN5KGNoaWxkKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHsKLQkJCQkJcmV0dXJuIG5ldyBSZXNpemFibGVTaGFwZUVkaXRQb2xpY3koKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJfTsKLQkJcmV0dXJuIGxlcDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlTm9kZVNoYXBlKCkgewotCQlBY3Rpdml0eVBhcnRpdGlvbkZpZ3VyZSBmaWd1cmUgPSBuZXcgQWN0aXZpdHlQYXJ0aXRpb25GaWd1cmUoKTsKLQkJcmV0dXJuIHByaW1hcnlTaGFwZSA9IGZpZ3VyZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFjdGl2aXR5UGFydGl0aW9uRmlndXJlIGdldFByaW1hcnlTaGFwZSgpIHsKLQkJcmV0dXJuIChBY3Rpdml0eVBhcnRpdGlvbkZpZ3VyZSkgcHJpbWFyeVNoYXBlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBhZGRGaXhlZENoaWxkKEVkaXRQYXJ0IGNoaWxkRWRpdFBhcnQpIHsKLQkJaWYgKGNoaWxkRWRpdFBhcnQgaW5zdGFuY2VvZiBBY3Rpdml0eVBhcnRpdGlvbk5hbWVFZGl0UGFydCkgewotCQkJKChBY3Rpdml0eVBhcnRpdGlvbk5hbWVFZGl0UGFydCkgY2hpbGRFZGl0UGFydCkKLQkJCQkJLnNldExhYmVsKGdldFByaW1hcnlTaGFwZSgpLmdldEZpZ3VyZVBhcnRpdGlvbkxhYmVsRmlndXJlKCkpOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiByZW1vdmVGaXhlZENoaWxkKEVkaXRQYXJ0IGNoaWxkRWRpdFBhcnQpIHsKLQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBOb2RlRmlndXJlIGNyZWF0ZU5vZGVQbGF0ZSgpIHsKLQkJRGVmYXVsdFNpemVOb2RlRmlndXJlIHJlc3VsdCA9IG5ldyBEZWZhdWx0U2l6ZU5vZGVGaWd1cmUoZ2V0TWFwTW9kZSgpCi0JCQkJLkRQdG9MUCg0MCksIGdldE1hcE1vZGUoKS5EUHRvTFAoNDApKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGZpZ3VyZSBmb3IgdGhpcyBlZGl0IHBhcnQuCi0JICogCi0JICogQm9keSBvZiB0aGlzIG1ldGhvZCBkb2VzIG5vdCBkZXBlbmQgb24gc2V0dGluZ3MgaW4gZ2VuZXJhdGlvbiBtb2RlbAotCSAqIHNvIHlvdSBtYXkgc2FmZWx5IHJlbW92ZSA8aT5nZW5lcmF0ZWQ8L2k+IHRhZyBhbmQgbW9kaWZ5IGl0LgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTm9kZUZpZ3VyZSBjcmVhdGVOb2RlRmlndXJlKCkgewotCQlOb2RlRmlndXJlIGZpZ3VyZSA9IGNyZWF0ZU5vZGVQbGF0ZSgpOwotCQlmaWd1cmUuc2V0TGF5b3V0TWFuYWdlcihuZXcgU3RhY2tMYXlvdXQoKSk7Ci0JCUlGaWd1cmUgc2hhcGUgPSBjcmVhdGVOb2RlU2hhcGUoKTsKLQkJZmlndXJlLmFkZChzaGFwZSk7Ci0JCWNvbnRlbnRQYW5lID0gc2V0dXBDb250ZW50UGFuZShzaGFwZSk7Ci0JCXJldHVybiBmaWd1cmU7Ci0JfQotCi0JLyoqCi0JICogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiB0cmVhdHMgcGFzc2VkIGZpZ3VyZSBhcyBjb250ZW50IHBhbmUuCi0JICogUmVzcGVjdHMgbGF5b3V0IG9uZSBtYXkgaGF2ZSBzZXQgZm9yIGdlbmVyYXRlZCBmaWd1cmUuCi0JICogQHBhcmFtIG5vZGVTaGFwZSBpbnN0YW5jZSBvZiBnZW5lcmF0ZWQgZmlndXJlIGNsYXNzCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJRmlndXJlIHNldHVwQ29udGVudFBhbmUoSUZpZ3VyZSBub2RlU2hhcGUpIHsKLQkJaWYgKG5vZGVTaGFwZS5nZXRMYXlvdXRNYW5hZ2VyKCkgPT0gbnVsbCkgewotCQkJbm9kZVNoYXBlLnNldExheW91dE1hbmFnZXIobmV3IEZyZWVmb3JtTGF5b3V0KCkgewotCi0JCQkJcHVibGljIE9iamVjdCBnZXRDb25zdHJhaW50KElGaWd1cmUgZmlndXJlKSB7Ci0JCQkJCU9iamVjdCByZXN1bHQgPSBjb25zdHJhaW50cy5nZXQoZmlndXJlKTsKLQkJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSB7Ci0JCQkJCQlyZXN1bHQgPSBuZXcgUmVjdGFuZ2xlKDAsIDAsIC0xLCAtMSk7Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIHJlc3VsdDsKLQkJCQl9Ci0JCQl9KTsKLQkJfQotCQlyZXR1cm4gbm9kZVNoYXBlOyAvLyB1c2Ugbm9kZVNoYXBlIGl0c2VsZiBhcyBjb250ZW50UGFuZQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSUZpZ3VyZSBnZXRDb250ZW50UGFuZSgpIHsKLQkJaWYgKGNvbnRlbnRQYW5lICE9IG51bGwpIHsKLQkJCXJldHVybiBjb250ZW50UGFuZTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0Q29udGVudFBhbmUoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVkaXRQYXJ0IGdldFByaW1hcnlDaGlsZEVkaXRQYXJ0KCkgewotCQlyZXR1cm4gZ2V0Q2hpbGRCeVNlbWFudGljSGludChVTUxWaXN1YWxJRFJlZ2lzdHJ5Ci0JCQkJLmdldFR5cGUoQWN0aXZpdHlQYXJ0aXRpb25OYW1lRWRpdFBhcnQuVklTVUFMX0lEKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZENoaWxkVmlzdWFsKEVkaXRQYXJ0IGNoaWxkRWRpdFBhcnQsIGludCBpbmRleCkgewotCQlpZiAoYWRkRml4ZWRDaGlsZChjaGlsZEVkaXRQYXJ0KSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmFkZENoaWxkVmlzdWFsKGNoaWxkRWRpdFBhcnQsIC0xKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlQ2hpbGRWaXN1YWwoRWRpdFBhcnQgY2hpbGRFZGl0UGFydCkgewotCQlpZiAocmVtb3ZlRml4ZWRDaGlsZChjaGlsZEVkaXRQYXJ0KSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLnJlbW92ZUNoaWxkVmlzdWFsKGNoaWxkRWRpdFBhcnQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBnZXRDb250ZW50UGFuZUZvcihJR3JhcGhpY2FsRWRpdFBhcnQgZWRpdFBhcnQpIHsKLQotCQlyZXR1cm4gc3VwZXIuZ2V0Q29udGVudFBhbmVGb3IoZWRpdFBhcnQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgY2xhc3MgQWN0aXZpdHlQYXJ0aXRpb25GaWd1cmUgZXh0ZW5kcyBSZWN0YW5nbGVGaWd1cmUgewotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgQWN0aXZpdHlQYXJ0aXRpb25GaWd1cmUoKSB7Ci0KLQkJCVhZTGF5b3V0IG15R2VuTGF5b3V0TWFuYWdlciA9IG5ldyBYWUxheW91dCgpOwotCi0JCQl0aGlzLnNldExheW91dE1hbmFnZXIobXlHZW5MYXlvdXRNYW5hZ2VyKTsKLQotCQkJdGhpcy5zZXRGb3JlZ3JvdW5kQ29sb3IoQ29sb3JDb25zdGFudHMuYmxhY2sKLQotCQkJKTsKLQkJCXRoaXMuc2V0QmFja2dyb3VuZENvbG9yKEFDVElWSVRZUEFSVElUSU9ORklHVVJFX0JBQ0sKLQotCQkJKTsKLQkJCXRoaXMuc2V0UHJlZmVycmVkU2l6ZShnZXRNYXBNb2RlKCkuRFB0b0xQKDMwMCksIGdldE1hcE1vZGUoKQotCQkJCQkuRFB0b0xQKDYwMCkpOwotCQkJdGhpcy5zZXRTaXplKGdldE1hcE1vZGUoKS5EUHRvTFAoMzAwKSwgZ2V0TWFwTW9kZSgpLkRQdG9MUCg2MDApKTsKLQkJCXRoaXMuc2V0Qm9yZGVyKG5ldyBMaW5lQm9yZGVyKCkpOwotCQkJY3JlYXRlQ29udGVudHMoKTsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIHZvaWQgY3JlYXRlQ29udGVudHMoKSB7Ci0JCQlXcmFwTGFiZWwgZmlnXzAgPSBuZXcgV3JhcExhYmVsKCk7Ci0KLQkJCXNldEZpZ3VyZVBhcnRpdGlvbkxhYmVsRmlndXJlKGZpZ18wKTsKLQotCQkJT2JqZWN0IGxheURhdGEwID0gbnVsbDsKLQotCQkJdGhpcy5hZGQoZmlnXzAsIGxheURhdGEwKTsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIFdyYXBMYWJlbCBmUGFydGl0aW9uTGFiZWxGaWd1cmU7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBXcmFwTGFiZWwgZ2V0RmlndXJlUGFydGl0aW9uTGFiZWxGaWd1cmUoKSB7Ci0JCQlyZXR1cm4gZlBhcnRpdGlvbkxhYmVsRmlndXJlOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgdm9pZCBzZXRGaWd1cmVQYXJ0aXRpb25MYWJlbEZpZ3VyZShXcmFwTGFiZWwgZmlnKSB7Ci0JCQlmUGFydGl0aW9uTGFiZWxGaWd1cmUgPSBmaWc7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSBib29sZWFuIG15VXNlTG9jYWxDb29yZGluYXRlcyA9IGZhbHNlOwotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcm90ZWN0ZWQgYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKCkgewotCQkJcmV0dXJuIG15VXNlTG9jYWxDb29yZGluYXRlczsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcm90ZWN0ZWQgdm9pZCBzZXRVc2VMb2NhbENvb3JkaW5hdGVzKGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcykgewotCQkJbXlVc2VMb2NhbENvb3JkaW5hdGVzID0gdXNlTG9jYWxDb29yZGluYXRlczsKLQkJfQotCi0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29sb3IgQUNUSVZJVFlQQVJUSVRJT05GSUdVUkVfQkFDSyA9IG5ldyBDb2xvcihudWxsLAotCQkJMjU1LCAyNTUsIDI1NSk7Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BhcnRzL0FjdGl2aXR5UGFydGl0aW9uRWRpdFBhcnQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BhcnRzL0FjdGl2aXR5UGFydGl0aW9uRWRpdFBhcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDJmY2M5OS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wYXJ0cy9BY3Rpdml0eVBhcnRpdGlvbkVkaXRQYXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOTIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Db2xvckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuRnJlZWZvcm1MYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkdyYXBoaWNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5MaW5lQm9yZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlN0YWNrTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5YWUxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5jdXN0b20ucG9saWNpZXMuQWN0aXZpdHlQYXJ0aXRpb25DcmVhdGlvbkVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuY3VzdG9tLnBvbGljaWVzLkFjdGl2aXR5UGFydGl0aW9uRGVsZWdhdGlvbkVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuY3VzdG9tLnBvbGljaWVzLkFjdGl2aXR5UGFydGl0aW9uTGF5b3V0RWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBvbGljaWVzLkFjdGl2aXR5UGFydGl0aW9uQ2Fub25pY2FsRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBvbGljaWVzLkFjdGl2aXR5UGFydGl0aW9uR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wb2xpY2llcy5BY3Rpdml0eVBhcnRpdGlvbkl0ZW1TZW1hbnRpY0VkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wb2xpY2llcy5BY3Rpdml0eVBhcnRpdGlvblBhcnRpdGlvbkNhbXBhcnRtZW50SXRlbVNlbWFudGljRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5wYXJ0LlVNTFZpc3VhbElEUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuTGF5b3V0RWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JR3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuU2hhcGVOb2RlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuRWRpdFBvbGljeVJvbGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLlJlc2l6YWJsZVNoYXBlRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5YWUxheW91dEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5sMTBuLkRpYWdyYW1Db2xvclJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5nZWYudWkuZmlndXJlcy5EZWZhdWx0U2l6ZU5vZGVGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZ2VmLnVpLmZpZ3VyZXMuTm9kZUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5GaWxsU3R5bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTGluZVN0eWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vdGF0aW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eVBhcnRpdGlvbkVkaXRQYXJ0IGV4dGVuZHMgU2hhcGVOb2RlRWRpdFBhcnQgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZJU1VBTF9JRCA9IDEwMDg7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgY29udGVudFBhbmU7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgcHJpbWFyeVNoYXBlOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBY3Rpdml0eVBhcnRpdGlvbkVkaXRQYXJ0KFZpZXcgdmlldykgewotCQlzdXBlcih2aWV3KTsKLQl9Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCkgewotCQkvLwkJc3VwZXIuY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpOwotCQkvLwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLlNFTUFOVElDX1JPTEUsCi0JCS8vCQkJCW5ldyBBY3Rpdml0eVBhcnRpdGlvbkl0ZW1TZW1hbnRpY0VkaXRQb2xpY3koKSk7Ci0JCS8vCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LkdSQVBISUNBTF9OT0RFX1JPTEUsCi0JCS8vCQkJCW5ldyBBY3Rpdml0eVBhcnRpdGlvbkdyYXBoaWNhbE5vZGVFZGl0UG9saWN5KCkpOwotCQkvLwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLkNBTk9OSUNBTF9ST0xFLAotCQkvLwkJCQluZXcgQWN0aXZpdHlQYXJ0aXRpb25DYW5vbmljYWxFZGl0UG9saWN5KCkpOwotCQkvLwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5MQVlPVVRfUk9MRSwgY3JlYXRlTGF5b3V0RWRpdFBvbGljeSgpKTsKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLkNSRUFUSU9OX1JPTEUsCi0JCQkJbmV3IEFjdGl2aXR5UGFydGl0aW9uQ3JlYXRpb25FZGl0UG9saWN5KCkpOwotCQlzdXBlci5jcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCk7Ci0JCXJlbW92ZUVkaXRQb2xpY3koRWRpdFBvbGljeS5MQVlPVVRfUk9MRSk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KAotCQkJCUVkaXRQb2xpY3lSb2xlcy5TRU1BTlRJQ19ST0xFLAotCQkJCW5ldyBBY3Rpdml0eVBhcnRpdGlvblBhcnRpdGlvbkNhbXBhcnRtZW50SXRlbVNlbWFudGljRWRpdFBvbGljeSgpKTsKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5HUkFQSElDQUxfTk9ERV9ST0xFLAotCQkJCW5ldyBBY3Rpdml0eVBhcnRpdGlvbkdyYXBoaWNhbE5vZGVFZGl0UG9saWN5KCkpOwotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuQ0FOT05JQ0FMX1JPTEUsCi0JCQkJbmV3IEFjdGl2aXR5UGFydGl0aW9uQ2Fub25pY2FsRWRpdFBvbGljeSgpKTsKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5MQVlPVVRfUk9MRSwKLQkJCQluZXcgQWN0aXZpdHlQYXJ0aXRpb25MYXlvdXRFZGl0UG9saWN5KCkpOwotCQlpbnN0YWxsRWRpdFBvbGljeSgKLQkJCQlFZGl0UG9saWN5LkNPTlRBSU5FUl9ST0xFLAotCQkJCW5ldyBBY3Rpdml0eVBhcnRpdGlvbkRlbGVnYXRpb25FZGl0UG9saWN5KAotCQkJCQkJVU1MVmlzdWFsSURSZWdpc3RyeQotCQkJCQkJCQkuZ2V0VHlwZShBY3Rpdml0eVBhcnRpdGlvblBhcnRpdGlvbkNhbXBhcnRtZW50RWRpdFBhcnQuVklTVUFMX0lEKSwKLQkJCQkJCUVkaXRQb2xpY3kuQ09OVEFJTkVSX1JPTEUpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIExheW91dEVkaXRQb2xpY3kgY3JlYXRlTGF5b3V0RWRpdFBvbGljeSgpIHsKLQkJWFlMYXlvdXRFZGl0UG9saWN5IGxlcCA9IG5ldyBYWUxheW91dEVkaXRQb2xpY3koKSB7Ci0KLQkJCXByb3RlY3RlZCBFZGl0UG9saWN5IGNyZWF0ZUNoaWxkRWRpdFBvbGljeShFZGl0UGFydCBjaGlsZCkgewotCQkJCUVkaXRQb2xpY3kgcmVzdWx0ID0gc3VwZXIuY3JlYXRlQ2hpbGRFZGl0UG9saWN5KGNoaWxkKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHsKLQkJCQkJcmV0dXJuIG5ldyBSZXNpemFibGVTaGFwZUVkaXRQb2xpY3koKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJfTsKLQkJcmV0dXJuIGxlcDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlTm9kZVNoYXBlKCkgewotCQlBY3Rpdml0eVBhcnRpdGlvbkZpZ3VyZSBmaWd1cmUgPSBuZXcgQWN0aXZpdHlQYXJ0aXRpb25GaWd1cmUoKTsKLQkJcmV0dXJuIHByaW1hcnlTaGFwZSA9IGZpZ3VyZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFjdGl2aXR5UGFydGl0aW9uRmlndXJlIGdldFByaW1hcnlTaGFwZSgpIHsKLQkJcmV0dXJuIChBY3Rpdml0eVBhcnRpdGlvbkZpZ3VyZSkgcHJpbWFyeVNoYXBlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBhZGRGaXhlZENoaWxkKEVkaXRQYXJ0IGNoaWxkRWRpdFBhcnQpIHsKLQkJaWYgKGNoaWxkRWRpdFBhcnQgaW5zdGFuY2VvZiBBY3Rpdml0eVBhcnRpdGlvbk5hbWUyRWRpdFBhcnQpIHsKLQkJCSgoQWN0aXZpdHlQYXJ0aXRpb25OYW1lMkVkaXRQYXJ0KSBjaGlsZEVkaXRQYXJ0KQotCQkJCQkuc2V0TGFiZWwoZ2V0UHJpbWFyeVNoYXBlKCkuZ2V0RmlndXJlUGFydGl0aW9uTGFiZWxGaWd1cmUoKSk7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHJlbW92ZUZpeGVkQ2hpbGQoRWRpdFBhcnQgY2hpbGRFZGl0UGFydCkgewotCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE5vZGVGaWd1cmUgY3JlYXRlTm9kZVBsYXRlKCkgewotCQlEZWZhdWx0U2l6ZU5vZGVGaWd1cmUgcmVzdWx0ID0gbmV3IERlZmF1bHRTaXplTm9kZUZpZ3VyZShnZXRNYXBNb2RlKCkKLQkJCQkuRFB0b0xQKDQwKSwgZ2V0TWFwTW9kZSgpLkRQdG9MUCg0MCkpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgZmlndXJlIGZvciB0aGlzIGVkaXQgcGFydC4KLQkgKiAKLQkgKiBCb2R5IG9mIHRoaXMgbWV0aG9kIGRvZXMgbm90IGRlcGVuZCBvbiBzZXR0aW5ncyBpbiBnZW5lcmF0aW9uIG1vZGVsCi0JICogc28geW91IG1heSBzYWZlbHkgcmVtb3ZlIDxpPmdlbmVyYXRlZDwvaT4gdGFnIGFuZCBtb2RpZnkgaXQuCi0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBOb2RlRmlndXJlIGNyZWF0ZU5vZGVGaWd1cmUoKSB7Ci0JCU5vZGVGaWd1cmUgZmlndXJlID0gY3JlYXRlTm9kZVBsYXRlKCk7Ci0JCWZpZ3VyZS5zZXRMYXlvdXRNYW5hZ2VyKG5ldyBTdGFja0xheW91dCgpKTsKLQkJSUZpZ3VyZSBzaGFwZSA9IGNyZWF0ZU5vZGVTaGFwZSgpOwotCQlmaWd1cmUuYWRkKHNoYXBlKTsKLQkJY29udGVudFBhbmUgPSBzZXR1cENvbnRlbnRQYW5lKHNoYXBlKTsKLQkJcmV0dXJuIGZpZ3VyZTsKLQl9Ci0KLQkvKioKLQkgKiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIHRyZWF0cyBwYXNzZWQgZmlndXJlIGFzIGNvbnRlbnQgcGFuZS4KLQkgKiBSZXNwZWN0cyBsYXlvdXQgb25lIG1heSBoYXZlIHNldCBmb3IgZ2VuZXJhdGVkIGZpZ3VyZS4KLQkgKiBAcGFyYW0gbm9kZVNoYXBlIGluc3RhbmNlIG9mIGdlbmVyYXRlZCBmaWd1cmUgY2xhc3MKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgc2V0dXBDb250ZW50UGFuZShJRmlndXJlIG5vZGVTaGFwZSkgewotCQlpZiAobm9kZVNoYXBlLmdldExheW91dE1hbmFnZXIoKSA9PSBudWxsKSB7Ci0JCQlub2RlU2hhcGUuc2V0TGF5b3V0TWFuYWdlcihuZXcgRnJlZWZvcm1MYXlvdXQoKSB7Ci0KLQkJCQlwdWJsaWMgT2JqZWN0IGdldENvbnN0cmFpbnQoSUZpZ3VyZSBmaWd1cmUpIHsKLQkJCQkJT2JqZWN0IHJlc3VsdCA9IGNvbnN0cmFpbnRzLmdldChmaWd1cmUpOwotCQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHsKLQkJCQkJCXJlc3VsdCA9IG5ldyBSZWN0YW5nbGUoMCwgMCwgLTEsIC0xKTsKLQkJCQkJfQotCQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJCX0KLQkJCX0pOwotCQl9Ci0JCXJldHVybiBub2RlU2hhcGU7IC8vIHVzZSBub2RlU2hhcGUgaXRzZWxmIGFzIGNvbnRlbnRQYW5lCi0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJRmlndXJlIGdldENvbnRlbnRQYW5lKCkgewotCQlpZiAoY29udGVudFBhbmUgIT0gbnVsbCkgewotCQkJcmV0dXJuIGNvbnRlbnRQYW5lOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRDb250ZW50UGFuZSgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRWRpdFBhcnQgZ2V0UHJpbWFyeUNoaWxkRWRpdFBhcnQoKSB7Ci0JCXJldHVybiBnZXRDaGlsZEJ5U2VtYW50aWNIaW50KFVNTFZpc3VhbElEUmVnaXN0cnkKLQkJCQkuZ2V0VHlwZShBY3Rpdml0eVBhcnRpdGlvbk5hbWUyRWRpdFBhcnQuVklTVUFMX0lEKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZENoaWxkVmlzdWFsKEVkaXRQYXJ0IGNoaWxkRWRpdFBhcnQsIGludCBpbmRleCkgewotCQlpZiAoYWRkRml4ZWRDaGlsZChjaGlsZEVkaXRQYXJ0KSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmFkZENoaWxkVmlzdWFsKGNoaWxkRWRpdFBhcnQsIC0xKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlQ2hpbGRWaXN1YWwoRWRpdFBhcnQgY2hpbGRFZGl0UGFydCkgewotCQlpZiAocmVtb3ZlRml4ZWRDaGlsZChjaGlsZEVkaXRQYXJ0KSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLnJlbW92ZUNoaWxkVmlzdWFsKGNoaWxkRWRpdFBhcnQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBnZXRDb250ZW50UGFuZUZvcihJR3JhcGhpY2FsRWRpdFBhcnQgZWRpdFBhcnQpIHsKLQotCQlyZXR1cm4gc3VwZXIuZ2V0Q29udGVudFBhbmVGb3IoZWRpdFBhcnQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgY2xhc3MgQWN0aXZpdHlQYXJ0aXRpb25GaWd1cmUgZXh0ZW5kcyBSZWN0YW5nbGVGaWd1cmUgewotCi0JCS8qKgotCQkgKiBAbW9kaWZpZWQKLQkJICovCi0JCXB1YmxpYyBBY3Rpdml0eVBhcnRpdGlvbkZpZ3VyZSgpIHsKLQotCQkJb3JnLmVjbGlwc2UuZHJhdzJkLlhZTGF5b3V0IG15R2VuTGF5b3V0TWFuYWdlciA9IG5ldyBvcmcuZWNsaXBzZS5kcmF3MmQuWFlMYXlvdXQoKTsKLQotCQkJdGhpcy5zZXRMYXlvdXRNYW5hZ2VyKG15R2VuTGF5b3V0TWFuYWdlcik7Ci0KLQkJCUxpbmVTdHlsZSBsaW5lc3R5bGUgPSAoTGluZVN0eWxlKSBnZXRQcmltYXJ5VmlldygpLmdldFN0eWxlKAotCQkJCQlOb3RhdGlvblBhY2thZ2UuTGl0ZXJhbHMuTElORV9TVFlMRSk7Ci0JCQlpZiAobGluZXN0eWxlICE9IG51bGwpIHsKLQkJCQl0aGlzLnNldEZvcmVncm91bmRDb2xvcihEaWFncmFtQ29sb3JSZWdpc3RyeS5nZXRJbnN0YW5jZSgpCi0JCQkJCQkuZ2V0Q29sb3IobmV3IEludGVnZXIobGluZXN0eWxlLmdldExpbmVDb2xvcigpKSkpOwotCQkJfSBlbHNlIHsKLQkJCQl0aGlzCi0JCQkJCQkuc2V0Rm9yZWdyb3VuZENvbG9yKG9yZy5lY2xpcHNlLmRyYXcyZC5Db2xvckNvbnN0YW50cy5ibGFjayk7Ci0JCQl9Ci0KLQkJCUZpbGxTdHlsZSBzdHlsZSA9IChGaWxsU3R5bGUpIGdldFByaW1hcnlWaWV3KCkuZ2V0U3R5bGUoCi0JCQkJCU5vdGF0aW9uUGFja2FnZS5MaXRlcmFscy5GSUxMX1NUWUxFKTsKLQkJCWlmIChzdHlsZSAhPSBudWxsKSB7Ci0JCQkJdGhpcy5zZXRCYWNrZ3JvdW5kQ29sb3IoRGlhZ3JhbUNvbG9yUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKQotCQkJCQkJLmdldENvbG9yKG5ldyBJbnRlZ2VyKHN0eWxlLmdldEZpbGxDb2xvcigpKSkpOwotCQkJfSBlbHNlIHsKLQkJCQl0aGlzLnNldEJhY2tncm91bmRDb2xvcihBQ1RJVklUWVBBUlRJVElPTkZJR1VSRV9CQUNLKTsKLQkJCX0KLQkJCXRoaXMuc2V0UHJlZmVycmVkU2l6ZShnZXRNYXBNb2RlKCkuRFB0b0xQKDMwMCksIGdldE1hcE1vZGUoKQotCQkJCQkuRFB0b0xQKDYwMCkpOwotCQkJdGhpcy5zZXRTaXplKGdldE1hcE1vZGUoKS5EUHRvTFAoMzAwKSwgZ2V0TWFwTW9kZSgpLkRQdG9MUCg2MDApKTsKLQkJCXRoaXMuc2V0Qm9yZGVyKG5ldyBvcmcuZWNsaXBzZS5kcmF3MmQuTGluZUJvcmRlcigpKTsKLQkJCWNyZWF0ZUNvbnRlbnRzKCk7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbnRlbnRzKCkgewotCQkJV3JhcExhYmVsIGZpZ18wID0gbmV3IFdyYXBMYWJlbCgpOwotCi0JCQlzZXRGaWd1cmVQYXJ0aXRpb25MYWJlbEZpZ3VyZShmaWdfMCk7Ci0KLQkJCU9iamVjdCBsYXlEYXRhMCA9IG51bGw7Ci0KLQkJCXRoaXMuYWRkKGZpZ18wLCBsYXlEYXRhMCk7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSBXcmFwTGFiZWwgZlBhcnRpdGlvbkxhYmVsRmlndXJlOwotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgV3JhcExhYmVsIGdldEZpZ3VyZVBhcnRpdGlvbkxhYmVsRmlndXJlKCkgewotCQkJcmV0dXJuIGZQYXJ0aXRpb25MYWJlbEZpZ3VyZTsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIHZvaWQgc2V0RmlndXJlUGFydGl0aW9uTGFiZWxGaWd1cmUoV3JhcExhYmVsIGZpZykgewotCQkJZlBhcnRpdGlvbkxhYmVsRmlndXJlID0gZmlnOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgYm9vbGVhbiBteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSBmYWxzZTsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJvdGVjdGVkIGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcygpIHsKLQkJCXJldHVybiBteVVzZUxvY2FsQ29vcmRpbmF0ZXM7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJvdGVjdGVkIHZvaWQgc2V0VXNlTG9jYWxDb29yZGluYXRlcyhib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMpIHsKLQkJCW15VXNlTG9jYWxDb29yZGluYXRlcyA9IHVzZUxvY2FsQ29vcmRpbmF0ZXM7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIHZvaWQgcGFpbnRGaWd1cmUoR3JhcGhpY3MgZ3JhcGhpY3MpIHsKLQkJCWlmIChpc09wYXF1ZSgpKQotCQkJCXN1cGVyLnBhaW50RmlndXJlKGdyYXBoaWNzKTsKLQkJCXJldHVybjsKLQkJfQotCi0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29sb3IgQUNUSVZJVFlQQVJUSVRJT05GSUdVUkVfQkFDSyA9IG5ldyBDb2xvcihudWxsLAotCQkJMjU1LCAyNTUsIDI1NSk7Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVOb3RpZmljYXRpb25FdmVudChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJT2JqZWN0IGZlYXR1cmUgPSBub3RpZmljYXRpb24uZ2V0RmVhdHVyZSgpOwotCQlpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRTaXplX1dpZHRoKCkuZXF1YWxzKGZlYXR1cmUpCi0JCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRTaXplX0hlaWdodCgpLmVxdWFscyhmZWF0dXJlKQotCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TG9jYXRpb25fWCgpLmVxdWFscyhmZWF0dXJlKQotCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TG9jYXRpb25fWSgpLmVxdWFscyhmZWF0dXJlKSkgewotCQkJcmVmcmVzaEJvdW5kcygpOwotCQl9IGVsc2UgaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RmlsbFN0eWxlX0ZpbGxDb2xvcigpLmVxdWFscygKLQkJCQlmZWF0dXJlKSkgewotCQkJSW50ZWdlciBjID0gKEludGVnZXIpIG5vdGlmaWNhdGlvbi5nZXROZXdWYWx1ZSgpOwotCQkJc2V0QmFja2dyb3VuZENvbG9yKERpYWdyYW1Db2xvclJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0Q29sb3IoYykpOwotCQkJZ2V0UHJpbWFyeVNoYXBlKCkuc2V0QmFja2dyb3VuZENvbG9yKAotCQkJCQlEaWFncmFtQ29sb3JSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldENvbG9yKGMpKTsKLQkJfSBlbHNlIGlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldExpbmVTdHlsZV9MaW5lQ29sb3IoKS5lcXVhbHMoCi0JCQkJZmVhdHVyZSkpIHsKLQkJCUludGVnZXIgYyA9IChJbnRlZ2VyKSBub3RpZmljYXRpb24uZ2V0TmV3VmFsdWUoKTsKLQkJCXNldEZvcmVncm91bmRDb2xvcihEaWFncmFtQ29sb3JSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldENvbG9yKGMpKTsKLQkJCWdldFByaW1hcnlTaGFwZSgpLnNldEZvcmVncm91bmRDb2xvcigKLQkJCQkJRGlhZ3JhbUNvbG9yUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXRDb2xvcihjKSk7Ci0JCX0gZWxzZSBpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGUoKS5pc0luc3RhbmNlKAotCQkJCW5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpKSkKLQkJCXJlZnJlc2hGb250KCk7Ci0JCWVsc2UgaWYgKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlKCkgPT0gTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRWaWV3X0VsZW1lbnQoKQotCQkJCSYmICgoRU9iamVjdCkgbm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCkpID09IGdldE5vdGF0aW9uVmlldygpKQotCQkJaGFuZGxlTWFqb3JTZW1hbnRpY0NoYW5nZSgpOwotCQllbHNlCi0JCQlzdXBlci5oYW5kbGVOb3RpZmljYXRpb25FdmVudChub3RpZmljYXRpb24pOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BhcnRzL0FjdGl2aXR5UGFydGl0aW9uTmFtZTJFZGl0UGFydC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcGFydHMvQWN0aXZpdHlQYXJ0aXRpb25OYW1lMkVkaXRQYXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhNTUyNzYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcGFydHMvQWN0aXZpdHlQYXJ0aXRpb25OYW1lMkVkaXRQYXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NTYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0czsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuTm9uUmVzaXphYmxlRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuaGFuZGxlcy5Ob25SZXNpemFibGVIYW5kbGVLaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSVRleHRBd2FyZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkxhYmVsRGlyZWN0RWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5MYWJlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5EaW1lbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5SZWN0YW5nbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5SdW5uYWJsZVdpdGhSZXN1bHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBvbGljaWVzLlVNTFRleHRTZWxlY3Rpb25FZGl0UG9saWN5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQucGFydC5BY3Rpdml0eURpYWdyYW1FZGl0b3JQbHVnaW47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5wcm92aWRlcnMuVU1MRWxlbWVudFR5cGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUudXRpbC5EaWFncmFtQ29uc3RhbnRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkFjY2Vzc2libGVFZGl0UGFydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5yZXF1ZXN0cy5EaXJlY3RFZGl0UmVxdWVzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi50b29scy5EaXJlY3RFZGl0TWFuYWdlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuSVBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLklQYXJzZXJFZGl0U3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuUGFyc2VyRWRpdFN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLlBhcnNlck9wdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5QYXJzZXJTZXJ2aWNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuQ29tcGFydG1lbnRFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JR3JhcGhpY2FsRWRpdFBhcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmwxMG4uRGlhZ3JhbUNvbG9yUmVnaXN0cnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlcXVlc3RzLlJlcXVlc3RDb25zdGFudHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnRvb2xzLlRleHREaXJlY3RFZGl0TWFuYWdlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb3JlLnV0aWwuRU9iamVjdEFkYXB0ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLklFbGVtZW50VHlwZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi51aS5zZXJ2aWNlcy5wYXJzZXIuSVNlbWFudGljUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi51aS5zZXJ2aWNlcy5wYXJzZXIuUGFyc2VySGludEFkYXB0ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Gb250U3R5bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm90YXRpb25QYWNrYWdlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZW50QXNzaXN0UHJvY2Vzc29yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ2VsbEVkaXRvclZhbGlkYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmxlRXZlbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eVBhcnRpdGlvbk5hbWUyRWRpdFBhcnQgZXh0ZW5kcyBDb21wYXJ0bWVudEVkaXRQYXJ0Ci0JCWltcGxlbWVudHMgSVRleHRBd2FyZUVkaXRQYXJ0IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWSVNVQUxfSUQgPSA0MDA3OwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRGlyZWN0RWRpdE1hbmFnZXIgbWFuYWdlcjsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIElQYXJzZXIgcGFyc2VyOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgTGlzdCBwYXJzZXJFbGVtZW50czsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBkZWZhdWx0VGV4dDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWN0aXZpdHlQYXJ0aXRpb25OYW1lMkVkaXRQYXJ0KFZpZXcgdmlldykgewotCQlzdXBlcih2aWV3KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpIHsKLQkJc3VwZXIuY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpOwotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LkRJUkVDVF9FRElUX1JPTEUsCi0JCQkJbmV3IExhYmVsRGlyZWN0RWRpdFBvbGljeSgpKTsKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSwKLQkJCQluZXcgTm9uUmVzaXphYmxlRWRpdFBvbGljeSgpIHsKLQotCQkJCQlwcm90ZWN0ZWQgTGlzdCBjcmVhdGVTZWxlY3Rpb25IYW5kbGVzKCkgewotCQkJCQkJTGlzdCBoYW5kbGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQkJTm9uUmVzaXphYmxlSGFuZGxlS2l0LmFkZE1vdmVIYW5kbGUoCi0JCQkJCQkJCShHcmFwaGljYWxFZGl0UGFydCkgZ2V0SG9zdCgpLCBoYW5kbGVzKTsKLQkJCQkJCXJldHVybiBoYW5kbGVzOwotCQkJCQl9Ci0KLQkJCQkJcHVibGljIENvbW1hbmQgZ2V0Q29tbWFuZChSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJCQkJCXJldHVybiBudWxsOwotCQkJCQl9Ci0KLQkJCQkJcHVibGljIGJvb2xlYW4gdW5kZXJzdGFuZHNSZXF1ZXN0KFJlcXVlc3QgcmVxdWVzdCkgewotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQl9Ci0JCQkJfSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TGFiZWxUZXh0SGVscGVyKElGaWd1cmUgZmlndXJlKSB7Ci0JCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCXJldHVybiAoKFdyYXBMYWJlbCkgZmlndXJlKS5nZXRUZXh0KCk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gKChMYWJlbCkgZmlndXJlKS5nZXRUZXh0KCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0TGFiZWxUZXh0SGVscGVyKElGaWd1cmUgZmlndXJlLCBTdHJpbmcgdGV4dCkgewotCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQkoKFdyYXBMYWJlbCkgZmlndXJlKS5zZXRUZXh0KHRleHQpOwotCQl9IGVsc2UgewotCQkJKChMYWJlbCkgZmlndXJlKS5zZXRUZXh0KHRleHQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJbWFnZSBnZXRMYWJlbEljb25IZWxwZXIoSUZpZ3VyZSBmaWd1cmUpIHsKLQkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJcmV0dXJuICgoV3JhcExhYmVsKSBmaWd1cmUpLmdldEljb24oKTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiAoKExhYmVsKSBmaWd1cmUpLmdldEljb24oKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRMYWJlbEljb25IZWxwZXIoSUZpZ3VyZSBmaWd1cmUsIEltYWdlIGljb24pIHsKLQkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJKChXcmFwTGFiZWwpIGZpZ3VyZSkuc2V0SWNvbihpY29uKTsKLQkJfSBlbHNlIHsKLQkJCSgoTGFiZWwpIGZpZ3VyZSkuc2V0SWNvbihpY29uKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMYWJlbChXcmFwTGFiZWwgZmlndXJlKSB7Ci0JCXVucmVnaXN0ZXJWaXN1YWxzKCk7Ci0JCXNldEZpZ3VyZShmaWd1cmUpOwotCQlkZWZhdWx0VGV4dCA9IGdldExhYmVsVGV4dEhlbHBlcihmaWd1cmUpOwotCQlyZWdpc3RlclZpc3VhbHMoKTsKLQkJcmVmcmVzaFZpc3VhbHMoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIExpc3QgZ2V0TW9kZWxDaGlsZHJlbigpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJR3JhcGhpY2FsRWRpdFBhcnQgZ2V0Q2hpbGRCeVNlbWFudGljSGludChTdHJpbmcgc2VtYW50aWNIaW50KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRU9iamVjdCBnZXRQYXJzZXJFbGVtZW50KCkgewotCQlFT2JqZWN0IGVsZW1lbnQgPSByZXNvbHZlU2VtYW50aWNFbGVtZW50KCk7Ci0JCXJldHVybiBlbGVtZW50ICE9IG51bGwgPyBlbGVtZW50IDogKFZpZXcpIGdldE1vZGVsKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJbWFnZSBnZXRMYWJlbEljb24oKSB7Ci0JCUVPYmplY3QgcGFyc2VyRWxlbWVudCA9IGdldFBhcnNlckVsZW1lbnQoKTsKLQkJaWYgKHBhcnNlckVsZW1lbnQgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIFVNTEVsZW1lbnRUeXBlcy5nZXRJbWFnZShwYXJzZXJFbGVtZW50LmVDbGFzcygpKTsKLQkKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRMYWJlbFRleHQoKSB7Ci0JCVN0cmluZyB0ZXh0ID0gbnVsbDsKLQkJaWYgKGdldFBhcnNlcigpICE9IG51bGwpIHsKLQkJCXRleHQgPSBnZXRQYXJzZXIoKS5nZXRQcmludFN0cmluZygKLQkJCQkJbmV3IEVPYmplY3RBZGFwdGVyKGdldFBhcnNlckVsZW1lbnQoKSksCi0JCQkJCWdldFBhcnNlck9wdGlvbnMoKS5pbnRWYWx1ZSgpKTsKLQkJfQotCQlpZiAodGV4dCA9PSBudWxsIHx8IHRleHQubGVuZ3RoKCkgPT0gMCkgewotCQkJdGV4dCA9IGRlZmF1bHRUZXh0OwotCQl9Ci0JCXJldHVybiB0ZXh0OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMYWJlbFRleHQoU3RyaW5nIHRleHQpIHsKLQkJc2V0TGFiZWxUZXh0SGVscGVyKGdldEZpZ3VyZSgpLCB0ZXh0KTsKLQkJT2JqZWN0IHBkRWRpdFBvbGljeSA9IGdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSk7Ci0JCWlmIChwZEVkaXRQb2xpY3kgaW5zdGFuY2VvZiBVTUxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgewotCQkJKChVTUxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgcGRFZGl0UG9saWN5KS5yZWZyZXNoRmVlZGJhY2soKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEVkaXRUZXh0KCkgewotCQlpZiAoZ2V0UGFyc2VyKCkgPT0gbnVsbCkgewotCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIGdldFBhcnNlcigpLmdldEVkaXRTdHJpbmcoCi0JCQkJbmV3IEVPYmplY3RBZGFwdGVyKGdldFBhcnNlckVsZW1lbnQoKSksCi0JCQkJZ2V0UGFyc2VyT3B0aW9ucygpLmludFZhbHVlKCkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0VkaXRhYmxlKCkgewotCQlyZXR1cm4gZ2V0UGFyc2VyKCkgIT0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElDZWxsRWRpdG9yVmFsaWRhdG9yIGdldEVkaXRUZXh0VmFsaWRhdG9yKCkgewotCQlyZXR1cm4gbmV3IElDZWxsRWRpdG9yVmFsaWRhdG9yKCkgewotCi0JCQlwdWJsaWMgU3RyaW5nIGlzVmFsaWQoZmluYWwgT2JqZWN0IHZhbHVlKSB7Ci0JCQkJaWYgKHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0JCQkJCWZpbmFsIEVPYmplY3QgZWxlbWVudCA9IGdldFBhcnNlckVsZW1lbnQoKTsKLQkJCQkJZmluYWwgSVBhcnNlciBwYXJzZXIgPSBnZXRQYXJzZXIoKTsKLQkJCQkJdHJ5IHsKLQkJCQkJCUlQYXJzZXJFZGl0U3RhdHVzIHZhbGlkID0gKElQYXJzZXJFZGl0U3RhdHVzKSBnZXRFZGl0aW5nRG9tYWluKCkKLQkJCQkJCQkJLnJ1bkV4Y2x1c2l2ZShuZXcgUnVubmFibGVXaXRoUmVzdWx0LkltcGwoKSB7Ci0KLQkJCQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQkJCQlzZXRSZXN1bHQocGFyc2VyLmlzVmFsaWRFZGl0U3RyaW5nKAotCQkJCQkJCQkJCQkJbmV3IEVPYmplY3RBZGFwdGVyKGVsZW1lbnQpLAotCQkJCQkJCQkJCQkJKFN0cmluZykgdmFsdWUpKTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfSk7Ci0JCQkJCQlyZXR1cm4gdmFsaWQuZ2V0Q29kZSgpID09IFBhcnNlckVkaXRTdGF0dXMuRURJVEFCTEUgPyBudWxsCi0JCQkJCQkJCTogdmFsaWQuZ2V0TWVzc2FnZSgpOwotCQkJCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZSkgewotCQkJCQkJaWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQkvLyBzaG91bGRuJ3QgZ2V0IGhlcmUKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElDb250ZW50QXNzaXN0UHJvY2Vzc29yIGdldENvbXBsZXRpb25Qcm9jZXNzb3IoKSB7Ci0JCWlmIChnZXRQYXJzZXIoKSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gZ2V0UGFyc2VyKCkuZ2V0Q29tcGxldGlvblByb2Nlc3NvcigKLQkJCQluZXcgRU9iamVjdEFkYXB0ZXIoZ2V0UGFyc2VyRWxlbWVudCgpKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQYXJzZXJPcHRpb25zIGdldFBhcnNlck9wdGlvbnMoKSB7Ci0JCXJldHVybiBQYXJzZXJPcHRpb25zLk5PTkU7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJUGFyc2VyIGdldFBhcnNlcigpIHsKLQkJaWYgKHBhcnNlciA9PSBudWxsKSB7Ci0JCQlTdHJpbmcgcGFyc2VySGludCA9ICgoVmlldykgZ2V0TW9kZWwoKSkuZ2V0VHlwZSgpOwotCQkJUGFyc2VySGludEFkYXB0ZXIgaGludEFkYXB0ZXIgPSBuZXcgUGFyc2VySGludEFkYXB0ZXIoCi0JCQkJCWdldFBhcnNlckVsZW1lbnQoKSwgcGFyc2VySGludCkgewotCi0JCQkJcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKENsYXNzIGFkYXB0ZXIpIHsKLQkJCQkJaWYgKElFbGVtZW50VHlwZS5jbGFzcy5lcXVhbHMoYWRhcHRlcikpIHsKLQkJCQkJCXJldHVybiBVTUxFbGVtZW50VHlwZXMuQWN0aXZpdHlQYXJ0aXRpb25fMTAwODsKLQkJCQkJfQotCQkJCQlyZXR1cm4gc3VwZXIuZ2V0QWRhcHRlcihhZGFwdGVyKTsKLQkJCQl9Ci0JCQl9OwotCQkJcGFyc2VyID0gUGFyc2VyU2VydmljZS5nZXRJbnN0YW5jZSgpLmdldFBhcnNlcihoaW50QWRhcHRlcik7Ci0JCX0KLQkJcmV0dXJuIHBhcnNlcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIERpcmVjdEVkaXRNYW5hZ2VyIGdldE1hbmFnZXIoKSB7Ci0JCWlmIChtYW5hZ2VyID09IG51bGwpIHsKLQkJCXNldE1hbmFnZXIobmV3IFRleHREaXJlY3RFZGl0TWFuYWdlcih0aGlzLCBUZXh0RGlyZWN0RWRpdE1hbmFnZXIKLQkJCQkJLmdldFRleHRDZWxsRWRpdG9yQ2xhc3ModGhpcyksIFVNTEVkaXRQYXJ0RmFjdG9yeQotCQkJCQkuZ2V0VGV4dENlbGxFZGl0b3JMb2NhdG9yKHRoaXMpKSk7Ci0JCX0KLQkJcmV0dXJuIG1hbmFnZXI7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldE1hbmFnZXIoRGlyZWN0RWRpdE1hbmFnZXIgbWFuYWdlcikgewotCQl0aGlzLm1hbmFnZXIgPSBtYW5hZ2VyOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdCgpIHsKLQkJZ2V0TWFuYWdlcigpLnNob3coKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURpcmVjdEVkaXQoUG9pbnQgZXZlbnRMb2NhdGlvbikgewotCQlpZiAoZ2V0TWFuYWdlcigpLmdldENsYXNzKCkgPT0gVGV4dERpcmVjdEVkaXRNYW5hZ2VyLmNsYXNzKSB7Ci0JCQkoKFRleHREaXJlY3RFZGl0TWFuYWdlcikgZ2V0TWFuYWdlcigpKS5zaG93KGV2ZW50TG9jYXRpb24KLQkJCQkJLmdldFNXVFBvaW50KCkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdChjaGFyIGluaXRpYWxDaGFyYWN0ZXIpIHsKLQkJaWYgKGdldE1hbmFnZXIoKSBpbnN0YW5jZW9mIFRleHREaXJlY3RFZGl0TWFuYWdlcikgewotCQkJKChUZXh0RGlyZWN0RWRpdE1hbmFnZXIpIGdldE1hbmFnZXIoKSkuc2hvdyhpbml0aWFsQ2hhcmFjdGVyKTsKLQkJfSBlbHNlIHsKLQkJCXBlcmZvcm1EaXJlY3RFZGl0KCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURpcmVjdEVkaXRSZXF1ZXN0KFJlcXVlc3QgcmVxdWVzdCkgewotCQlmaW5hbCBSZXF1ZXN0IHRoZVJlcXVlc3QgPSByZXF1ZXN0OwotCQl0cnkgewotCQkJZ2V0RWRpdGluZ0RvbWFpbigpLnJ1bkV4Y2x1c2l2ZShuZXcgUnVubmFibGUoKSB7Ci0KLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCWlmIChpc0FjdGl2ZSgpICYmIGlzRWRpdGFibGUoKSkgewotCQkJCQkJaWYgKHRoZVJlcXVlc3QKLQkJCQkJCQkJLmdldEV4dGVuZGVkRGF0YSgpCi0JCQkJCQkJCS5nZXQoCi0JCQkJCQkJCQkJUmVxdWVzdENvbnN0YW50cy5SRVFfRElSRUNURURJVF9FWFRFTkRFRERBVEFfSU5JVElBTF9DSEFSKSBpbnN0YW5jZW9mIENoYXJhY3RlcikgewotCQkJCQkJCUNoYXJhY3RlciBpbml0aWFsQ2hhciA9IChDaGFyYWN0ZXIpIHRoZVJlcXVlc3QKLQkJCQkJCQkJCS5nZXRFeHRlbmRlZERhdGEoKQotCQkJCQkJCQkJLmdldCgKLQkJCQkJCQkJCQkJUmVxdWVzdENvbnN0YW50cy5SRVFfRElSRUNURURJVF9FWFRFTkRFRERBVEFfSU5JVElBTF9DSEFSKTsKLQkJCQkJCQlwZXJmb3JtRGlyZWN0RWRpdChpbml0aWFsQ2hhci5jaGFyVmFsdWUoKSk7Ci0JCQkJCQl9IGVsc2UgaWYgKCh0aGVSZXF1ZXN0IGluc3RhbmNlb2YgRGlyZWN0RWRpdFJlcXVlc3QpCi0JCQkJCQkJCSYmIChnZXRFZGl0VGV4dCgpLmVxdWFscyhnZXRMYWJlbFRleHQoKSkpKSB7Ci0JCQkJCQkJRGlyZWN0RWRpdFJlcXVlc3QgZWRpdFJlcXVlc3QgPSAoRGlyZWN0RWRpdFJlcXVlc3QpIHRoZVJlcXVlc3Q7Ci0JCQkJCQkJcGVyZm9ybURpcmVjdEVkaXQoZWRpdFJlcXVlc3QuZ2V0TG9jYXRpb24oKSk7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCXBlcmZvcm1EaXJlY3RFZGl0KCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9KTsKLQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoVmlzdWFscygpIHsKLQkJc3VwZXIucmVmcmVzaFZpc3VhbHMoKTsKLQkJcmVmcmVzaExhYmVsKCk7Ci0JCXJlZnJlc2hGb250KCk7Ci0JCXJlZnJlc2hGb250Q29sb3IoKTsKLQkJcmVmcmVzaFVuZGVybGluZSgpOwotCQlyZWZyZXNoU3RyaWtlVGhyb3VnaCgpOwotCQlyZWZyZXNoQm91bmRzKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hMYWJlbCgpIHsKLQkJc2V0TGFiZWxUZXh0SGVscGVyKGdldEZpZ3VyZSgpLCBnZXRMYWJlbFRleHQoKSk7Ci0JCXNldExhYmVsSWNvbkhlbHBlcihnZXRGaWd1cmUoKSwgZ2V0TGFiZWxJY29uKCkpOwotCQlPYmplY3QgcGRFZGl0UG9saWN5ID0gZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFKTsKLQkJaWYgKHBkRWRpdFBvbGljeSBpbnN0YW5jZW9mIFVNTFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSB7Ci0JCQkoKFVNTFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSBwZEVkaXRQb2xpY3kpLnJlZnJlc2hGZWVkYmFjaygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hVbmRlcmxpbmUoKSB7Ci0JCUZvbnRTdHlsZSBzdHlsZSA9IChGb250U3R5bGUpIGdldEZvbnRTdHlsZU93bmVyVmlldygpLmdldFN0eWxlKAotCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlKCkpOwotCQlpZiAoc3R5bGUgIT0gbnVsbCAmJiBnZXRGaWd1cmUoKSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJKChXcmFwTGFiZWwpIGdldEZpZ3VyZSgpKS5zZXRUZXh0VW5kZXJsaW5lKHN0eWxlLmlzVW5kZXJsaW5lKCkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hTdHJpa2VUaHJvdWdoKCkgewotCQlGb250U3R5bGUgc3R5bGUgPSAoRm9udFN0eWxlKSBnZXRGb250U3R5bGVPd25lclZpZXcoKS5nZXRTdHlsZSgKLQkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZSgpKTsKLQkJaWYgKHN0eWxlICE9IG51bGwgJiYgZ2V0RmlndXJlKCkgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCSgoV3JhcExhYmVsKSBnZXRGaWd1cmUoKSkuc2V0VGV4dFN0cmlrZVRocm91Z2goc3R5bGUKLQkJCQkJLmlzU3RyaWtlVGhyb3VnaCgpKTsKLQkJfQotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hGb250KCkgewotCQlGb250U3R5bGUgc3R5bGUgPSAoRm9udFN0eWxlKSBnZXRGb250U3R5bGVPd25lclZpZXcoKS5nZXRTdHlsZSgKLQkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZSgpKTsKLQkJaWYgKHN0eWxlICE9IG51bGwpIHsKLQkJCVN0cmluZyBmb250TmFtZSA9IERpYWdyYW1Db25zdGFudHMuZ2V0Rm9udE5hbWUoc3R5bGUpOwotCQkJRm9udERhdGEgZm9udERhdGEgPSBuZXcgRm9udERhdGEoZm9udE5hbWUsIHN0eWxlCi0JCQkJCS5nZXRGb250SGVpZ2h0KCksIChzdHlsZS5pc0JvbGQoKSA/IFNXVC5CT0xEIDogU1dULk5PUk1BTCkKLQkJCQkJfCAoc3R5bGUuaXNJdGFsaWMoKSA/IFNXVC5JVEFMSUMgOiBTV1QuTk9STUFMKSk7Ci0JCQlzZXRGb250KGZvbnREYXRhKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRGb250Q29sb3IoQ29sb3IgY29sb3IpIHsKLQkJZ2V0RmlndXJlKCkuc2V0Rm9yZWdyb3VuZENvbG9yKGNvbG9yKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkU2VtYW50aWNMaXN0ZW5lcnMoKSB7Ci0JCWlmIChnZXRQYXJzZXIoKSBpbnN0YW5jZW9mIElTZW1hbnRpY1BhcnNlcikgewotCQkJRU9iamVjdCBlbGVtZW50ID0gcmVzb2x2ZVNlbWFudGljRWxlbWVudCgpOwotCQkJcGFyc2VyRWxlbWVudHMgPSAoKElTZW1hbnRpY1BhcnNlcikgZ2V0UGFyc2VyKCkpCi0JCQkJCS5nZXRTZW1hbnRpY0VsZW1lbnRzQmVpbmdQYXJzZWQoZWxlbWVudCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcnNlckVsZW1lbnRzLnNpemUoKTsgaSsrKSB7Ci0JCQkJYWRkTGlzdGVuZXJGaWx0ZXIoCi0JCQkJCQkiU2VtYW50aWNNb2RlbCIgKyBpLCB0aGlzLCAoRU9iamVjdCkgcGFyc2VyRWxlbWVudHMuZ2V0KGkpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9IGVsc2UgewotCQkJc3VwZXIuYWRkU2VtYW50aWNMaXN0ZW5lcnMoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVTZW1hbnRpY0xpc3RlbmVycygpIHsKLQkJaWYgKHBhcnNlckVsZW1lbnRzICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGFyc2VyRWxlbWVudHMuc2l6ZSgpOyBpKyspIHsKLQkJCQlyZW1vdmVMaXN0ZW5lckZpbHRlcigiU2VtYW50aWNNb2RlbCIgKyBpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9IGVsc2UgewotCQkJc3VwZXIucmVtb3ZlU2VtYW50aWNMaXN0ZW5lcnMoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQWNjZXNzaWJsZUVkaXRQYXJ0IGdldEFjY2Vzc2libGVFZGl0UGFydCgpIHsKLQkJaWYgKGFjY2Vzc2libGVFUCA9PSBudWxsKSB7Ci0JCQlhY2Nlc3NpYmxlRVAgPSBuZXcgQWNjZXNzaWJsZUdyYXBoaWNhbEVkaXRQYXJ0KCkgewotCi0JCQkJcHVibGljIHZvaWQgZ2V0TmFtZShBY2Nlc3NpYmxlRXZlbnQgZSkgewotCQkJCQllLnJlc3VsdCA9IGdldExhYmVsVGV4dEhlbHBlcihnZXRGaWd1cmUoKSk7Ci0JCQkJfQotCQkJfTsKLQkJfQotCQlyZXR1cm4gYWNjZXNzaWJsZUVQOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIFZpZXcgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkgewotCQlyZXR1cm4gZ2V0UHJpbWFyeVZpZXcoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkTm90YXRpb25hbExpc3RlbmVycygpIHsKLQkJc3VwZXIuYWRkTm90YXRpb25hbExpc3RlbmVycygpOwotCQlhZGRMaXN0ZW5lckZpbHRlcigiUHJpbWFyeVZpZXciLCB0aGlzLCBnZXRQcmltYXJ5VmlldygpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVOb3RhdGlvbmFsTGlzdGVuZXJzKCkgewotCQlzdXBlci5yZW1vdmVOb3RhdGlvbmFsTGlzdGVuZXJzKCk7Ci0JCXJlbW92ZUxpc3RlbmVyRmlsdGVyKCJQcmltYXJ5VmlldyIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hCb3VuZHMoKSB7Ci0JCWludCB3aWR0aCA9ICgoSW50ZWdlcikgZ2V0U3RydWN0dXJhbEZlYXR1cmVWYWx1ZShOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldFNpemVfV2lkdGgoKSkpLmludFZhbHVlKCk7Ci0JCWludCBoZWlnaHQgPSAoKEludGVnZXIpIGdldFN0cnVjdHVyYWxGZWF0dXJlVmFsdWUoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRTaXplX0hlaWdodCgpKSkuaW50VmFsdWUoKTsKLQkJRGltZW5zaW9uIHNpemUgPSBuZXcgRGltZW5zaW9uKHdpZHRoLCBoZWlnaHQpOwotCQlpbnQgeCA9ICgoSW50ZWdlcikgZ2V0U3RydWN0dXJhbEZlYXR1cmVWYWx1ZShOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldExvY2F0aW9uX1goKSkpLmludFZhbHVlKCk7Ci0JCWludCB5ID0gKChJbnRlZ2VyKSBnZXRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0TG9jYXRpb25fWSgpKSkuaW50VmFsdWUoKTsKLQkJUG9pbnQgbG9jID0gbmV3IFBvaW50KHgsIHkpOwotCQkoKEdyYXBoaWNhbEVkaXRQYXJ0KSBnZXRQYXJlbnQoKSkuc2V0TGF5b3V0Q29uc3RyYWludCh0aGlzLAotCQkJCWdldEZpZ3VyZSgpLCBuZXcgUmVjdGFuZ2xlKGxvYywgc2l6ZSkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVOb3RpZmljYXRpb25FdmVudChOb3RpZmljYXRpb24gZXZlbnQpIHsKLQkJT2JqZWN0IGZlYXR1cmUgPSBldmVudC5nZXRGZWF0dXJlKCk7Ci0JCWlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldFNpemVfV2lkdGgoKS5lcXVhbHMoZmVhdHVyZSkKLQkJCQl8fCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldFNpemVfSGVpZ2h0KCkuZXF1YWxzKGZlYXR1cmUpCi0JCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRMb2NhdGlvbl9YKCkuZXF1YWxzKGZlYXR1cmUpCi0JCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRMb2NhdGlvbl9ZKCkuZXF1YWxzKGZlYXR1cmUpKSB7Ci0JCQlyZWZyZXNoQm91bmRzKCk7Ci0JCX0KLQkJaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0ZvbnRDb2xvcigpLmVxdWFscyhmZWF0dXJlKSkgewotCQkJSW50ZWdlciBjID0gKEludGVnZXIpIGV2ZW50LmdldE5ld1ZhbHVlKCk7Ci0JCQlzZXRGb250Q29sb3IoRGlhZ3JhbUNvbG9yUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXRDb2xvcihjKSk7Ci0JCX0gZWxzZSBpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfVW5kZXJsaW5lKCkuZXF1YWxzKAotCQkJCWZlYXR1cmUpKSB7Ci0JCQlyZWZyZXNoVW5kZXJsaW5lKCk7Ci0JCX0gZWxzZSBpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfU3RyaWtlVGhyb3VnaCgpCi0JCQkJLmVxdWFscyhmZWF0dXJlKSkgewotCQkJcmVmcmVzaFN0cmlrZVRocm91Z2goKTsKLQkJfSBlbHNlIGlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Gb250SGVpZ2h0KCkuZXF1YWxzKAotCQkJCWZlYXR1cmUpCi0JCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfRm9udE5hbWUoKS5lcXVhbHMoCi0JCQkJCQlmZWF0dXJlKQotCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0JvbGQoKQotCQkJCQkJLmVxdWFscyhmZWF0dXJlKQotCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0l0YWxpYygpLmVxdWFscygKLQkJCQkJCWZlYXR1cmUpKSB7Ci0JCQlyZWZyZXNoRm9udCgpOwotCQl9IGVsc2UgewotCQkJaWYgKGdldFBhcnNlcigpICE9IG51bGwKLQkJCQkJJiYgZ2V0UGFyc2VyKCkuaXNBZmZlY3RpbmdFdmVudChldmVudCwKLQkJCQkJCQlnZXRQYXJzZXJPcHRpb25zKCkuaW50VmFsdWUoKSkpIHsKLQkJCQlyZWZyZXNoTGFiZWwoKTsKLQkJCX0KLQkJCWlmIChnZXRQYXJzZXIoKSBpbnN0YW5jZW9mIElTZW1hbnRpY1BhcnNlcikgewotCQkJCUlTZW1hbnRpY1BhcnNlciBtb2RlbFBhcnNlciA9IChJU2VtYW50aWNQYXJzZXIpIGdldFBhcnNlcigpOwotCQkJCWlmIChtb2RlbFBhcnNlci5hcmVTZW1hbnRpY0VsZW1lbnRzQWZmZWN0ZWQobnVsbCwgZXZlbnQpKSB7Ci0JCQkJCXJlbW92ZVNlbWFudGljTGlzdGVuZXJzKCk7Ci0JCQkJCWlmIChyZXNvbHZlU2VtYW50aWNFbGVtZW50KCkgIT0gbnVsbCkgewotCQkJCQkJYWRkU2VtYW50aWNMaXN0ZW5lcnMoKTsKLQkJCQkJfQotCQkJCQlyZWZyZXNoTGFiZWwoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJc3VwZXIuaGFuZGxlTm90aWZpY2F0aW9uRXZlbnQoZXZlbnQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVGaWd1cmUoKSB7Ci0JCS8vIFBhcmVudCBzaG91bGQgYXNzaWduIG9uZSB1c2luZyBzZXRMYWJlbCgpIG1ldGhvZAotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wYXJ0cy9BY3Rpdml0eVBhcnRpdGlvbk5hbWVFZGl0UGFydC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcGFydHMvQWN0aXZpdHlQYXJ0aXRpb25OYW1lRWRpdFBhcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGQ3YTYzNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wYXJ0cy9BY3Rpdml0eVBhcnRpdGlvbk5hbWVFZGl0UGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjU1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5HcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLk5vblJlc2l6YWJsZUVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmhhbmRsZXMuTm9uUmVzaXphYmxlSGFuZGxlS2l0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklUZXh0QXdhcmVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5MYWJlbERpcmVjdEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTGFiZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuRGltZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUmVjdGFuZ2xlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uUnVubmFibGVXaXRoUmVzdWx0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wb2xpY2llcy5VTUxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnBhcnQuQWN0aXZpdHlEaWFncmFtRWRpdG9yUGx1Z2luOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQucHJvdmlkZXJzLlVNTEVsZW1lbnRUeXBlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnV0aWwuRGlhZ3JhbUNvbnN0YW50czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5BY2Nlc3NpYmxlRWRpdFBhcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuRGlyZWN0RWRpdFJlcXVlc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYudG9vbHMuRGlyZWN0RWRpdE1hbmFnZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLklQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5JUGFyc2VyRWRpdFN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLlBhcnNlckVkaXRTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5QYXJzZXJPcHRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuUGFyc2VyU2VydmljZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLkNvbXBhcnRtZW50RWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUdyYXBoaWNhbEVkaXRQYXJ0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5sMTBuLkRpYWdyYW1Db2xvclJlZ2lzdHJ5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXF1ZXN0cy5SZXF1ZXN0Q29uc3RhbnRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS50b29scy5UZXh0RGlyZWN0RWRpdE1hbmFnZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29yZS51dGlsLkVPYmplY3RBZGFwdGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5JRWxlbWVudFR5cGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudWkuc2VydmljZXMucGFyc2VyLklTZW1hbnRpY1BhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudWkuc2VydmljZXMucGFyc2VyLlBhcnNlckhpbnRBZGFwdGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRm9udFN0eWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vdGF0aW9uUGFja2FnZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGVudEFzc2lzdFByb2Nlc3NvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNlbGxFZGl0b3JWYWxpZGF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJsZUV2ZW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250RGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZpdHlQYXJ0aXRpb25OYW1lRWRpdFBhcnQgZXh0ZW5kcyBDb21wYXJ0bWVudEVkaXRQYXJ0Ci0JCWltcGxlbWVudHMgSVRleHRBd2FyZUVkaXRQYXJ0IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWSVNVQUxfSUQgPSA0MDA2OwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRGlyZWN0RWRpdE1hbmFnZXIgbWFuYWdlcjsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIElQYXJzZXIgcGFyc2VyOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgTGlzdCBwYXJzZXJFbGVtZW50czsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBkZWZhdWx0VGV4dDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWN0aXZpdHlQYXJ0aXRpb25OYW1lRWRpdFBhcnQoVmlldyB2aWV3KSB7Ci0JCXN1cGVyKHZpZXcpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCkgewotCQlzdXBlci5jcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuRElSRUNUX0VESVRfUk9MRSwKLQkJCQluZXcgTGFiZWxEaXJlY3RFZGl0UG9saWN5KCkpOwotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFLAotCQkJCW5ldyBOb25SZXNpemFibGVFZGl0UG9saWN5KCkgewotCi0JCQkJCXByb3RlY3RlZCBMaXN0IGNyZWF0ZVNlbGVjdGlvbkhhbmRsZXMoKSB7Ci0JCQkJCQlMaXN0IGhhbmRsZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCQlOb25SZXNpemFibGVIYW5kbGVLaXQuYWRkTW92ZUhhbmRsZSgKLQkJCQkJCQkJKEdyYXBoaWNhbEVkaXRQYXJ0KSBnZXRIb3N0KCksIGhhbmRsZXMpOwotCQkJCQkJcmV0dXJuIGhhbmRsZXM7Ci0JCQkJCX0KLQotCQkJCQlwdWJsaWMgQ29tbWFuZCBnZXRDb21tYW5kKFJlcXVlc3QgcmVxdWVzdCkgewotCQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJCX0KLQotCQkJCQlwdWJsaWMgYm9vbGVhbiB1bmRlcnN0YW5kc1JlcXVlc3QoUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCX0KLQkJCQl9KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRMYWJlbFRleHRIZWxwZXIoSUZpZ3VyZSBmaWd1cmUpIHsKLQkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJcmV0dXJuICgoV3JhcExhYmVsKSBmaWd1cmUpLmdldFRleHQoKTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiAoKExhYmVsKSBmaWd1cmUpLmdldFRleHQoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRMYWJlbFRleHRIZWxwZXIoSUZpZ3VyZSBmaWd1cmUsIFN0cmluZyB0ZXh0KSB7Ci0JCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCSgoV3JhcExhYmVsKSBmaWd1cmUpLnNldFRleHQodGV4dCk7Ci0JCX0gZWxzZSB7Ci0JCQkoKExhYmVsKSBmaWd1cmUpLnNldFRleHQodGV4dCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEltYWdlIGdldExhYmVsSWNvbkhlbHBlcihJRmlndXJlIGZpZ3VyZSkgewotCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQlyZXR1cm4gKChXcmFwTGFiZWwpIGZpZ3VyZSkuZ2V0SWNvbigpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuICgoTGFiZWwpIGZpZ3VyZSkuZ2V0SWNvbigpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldExhYmVsSWNvbkhlbHBlcihJRmlndXJlIGZpZ3VyZSwgSW1hZ2UgaWNvbikgewotCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQkoKFdyYXBMYWJlbCkgZmlndXJlKS5zZXRJY29uKGljb24pOwotCQl9IGVsc2UgewotCQkJKChMYWJlbCkgZmlndXJlKS5zZXRJY29uKGljb24pOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExhYmVsKFdyYXBMYWJlbCBmaWd1cmUpIHsKLQkJdW5yZWdpc3RlclZpc3VhbHMoKTsKLQkJc2V0RmlndXJlKGZpZ3VyZSk7Ci0JCWRlZmF1bHRUZXh0ID0gZ2V0TGFiZWxUZXh0SGVscGVyKGZpZ3VyZSk7Ci0JCXJlZ2lzdGVyVmlzdWFscygpOwotCQlyZWZyZXNoVmlzdWFscygpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBnZXRNb2RlbENoaWxkcmVuKCkgewotCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElHcmFwaGljYWxFZGl0UGFydCBnZXRDaGlsZEJ5U2VtYW50aWNIaW50KFN0cmluZyBzZW1hbnRpY0hpbnQpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFT2JqZWN0IGdldFBhcnNlckVsZW1lbnQoKSB7Ci0JCUVPYmplY3QgZWxlbWVudCA9IHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKTsKLQkJcmV0dXJuIGVsZW1lbnQgIT0gbnVsbCA/IGVsZW1lbnQgOiAoVmlldykgZ2V0TW9kZWwoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEltYWdlIGdldExhYmVsSWNvbigpIHsKLQkJRU9iamVjdCBwYXJzZXJFbGVtZW50ID0gZ2V0UGFyc2VyRWxlbWVudCgpOwotCQlpZiAocGFyc2VyRWxlbWVudCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gVU1MRWxlbWVudFR5cGVzLmdldEltYWdlKHBhcnNlckVsZW1lbnQuZUNsYXNzKCkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldExhYmVsVGV4dCgpIHsKLQkJU3RyaW5nIHRleHQgPSBudWxsOwotCQlpZiAoZ2V0UGFyc2VyKCkgIT0gbnVsbCkgewotCQkJdGV4dCA9IGdldFBhcnNlcigpLmdldFByaW50U3RyaW5nKAotCQkJCQluZXcgRU9iamVjdEFkYXB0ZXIoZ2V0UGFyc2VyRWxlbWVudCgpKSwKLQkJCQkJZ2V0UGFyc2VyT3B0aW9ucygpLmludFZhbHVlKCkpOwotCQl9Ci0JCWlmICh0ZXh0ID09IG51bGwgfHwgdGV4dC5sZW5ndGgoKSA9PSAwKSB7Ci0JCQl0ZXh0ID0gZGVmYXVsdFRleHQ7Ci0JCX0KLQkJcmV0dXJuIHRleHQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExhYmVsVGV4dChTdHJpbmcgdGV4dCkgewotCQlzZXRMYWJlbFRleHRIZWxwZXIoZ2V0RmlndXJlKCksIHRleHQpOwotCQlPYmplY3QgcGRFZGl0UG9saWN5ID0gZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFKTsKLQkJaWYgKHBkRWRpdFBvbGljeSBpbnN0YW5jZW9mIFVNTFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSB7Ci0JCQkoKFVNTFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSBwZEVkaXRQb2xpY3kpLnJlZnJlc2hGZWVkYmFjaygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RWRpdFRleHQoKSB7Ci0JCWlmIChnZXRQYXJzZXIoKSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gZ2V0UGFyc2VyKCkuZ2V0RWRpdFN0cmluZygKLQkJCQluZXcgRU9iamVjdEFkYXB0ZXIoZ2V0UGFyc2VyRWxlbWVudCgpKSwKLQkJCQlnZXRQYXJzZXJPcHRpb25zKCkuaW50VmFsdWUoKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzRWRpdGFibGUoKSB7Ci0JCXJldHVybiBnZXRQYXJzZXIoKSAhPSBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSUNlbGxFZGl0b3JWYWxpZGF0b3IgZ2V0RWRpdFRleHRWYWxpZGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgSUNlbGxFZGl0b3JWYWxpZGF0b3IoKSB7Ci0KLQkJCXB1YmxpYyBTdHJpbmcgaXNWYWxpZChmaW5hbCBPYmplY3QgdmFsdWUpIHsKLQkJCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpIHsKLQkJCQkJZmluYWwgRU9iamVjdCBlbGVtZW50ID0gZ2V0UGFyc2VyRWxlbWVudCgpOwotCQkJCQlmaW5hbCBJUGFyc2VyIHBhcnNlciA9IGdldFBhcnNlcigpOwotCQkJCQl0cnkgewotCQkJCQkJSVBhcnNlckVkaXRTdGF0dXMgdmFsaWQgPSAoSVBhcnNlckVkaXRTdGF0dXMpIGdldEVkaXRpbmdEb21haW4oKQotCQkJCQkJCQkucnVuRXhjbHVzaXZlKG5ldyBSdW5uYWJsZVdpdGhSZXN1bHQuSW1wbCgpIHsKLQotCQkJCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCQkJCXNldFJlc3VsdChwYXJzZXIuaXNWYWxpZEVkaXRTdHJpbmcoCi0JCQkJCQkJCQkJCQluZXcgRU9iamVjdEFkYXB0ZXIoZWxlbWVudCksCi0JCQkJCQkJCQkJCQkoU3RyaW5nKSB2YWx1ZSkpOwotCQkJCQkJCQkJfQotCQkJCQkJCQl9KTsKLQkJCQkJCXJldHVybiB2YWxpZC5nZXRDb2RlKCkgPT0gUGFyc2VyRWRpdFN0YXR1cy5FRElUQUJMRSA/IG51bGwKLQkJCQkJCQkJOiB2YWxpZC5nZXRNZXNzYWdlKCk7Ci0JCQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGllKSB7Ci0JCQkJCQlpZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQkJfQotCQkJCX0KLQotCQkJCS8vIHNob3VsZG4ndCBnZXQgaGVyZQotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IgZ2V0Q29tcGxldGlvblByb2Nlc3NvcigpIHsKLQkJaWYgKGdldFBhcnNlcigpID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiBnZXRQYXJzZXIoKS5nZXRDb21wbGV0aW9uUHJvY2Vzc29yKAotCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihnZXRQYXJzZXJFbGVtZW50KCkpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFBhcnNlck9wdGlvbnMgZ2V0UGFyc2VyT3B0aW9ucygpIHsKLQkJcmV0dXJuIFBhcnNlck9wdGlvbnMuTk9ORTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElQYXJzZXIgZ2V0UGFyc2VyKCkgewotCQlpZiAocGFyc2VyID09IG51bGwpIHsKLQkJCVN0cmluZyBwYXJzZXJIaW50ID0gKChWaWV3KSBnZXRNb2RlbCgpKS5nZXRUeXBlKCk7Ci0JCQlQYXJzZXJIaW50QWRhcHRlciBoaW50QWRhcHRlciA9IG5ldyBQYXJzZXJIaW50QWRhcHRlcigKLQkJCQkJZ2V0UGFyc2VyRWxlbWVudCgpLCBwYXJzZXJIaW50KSB7Ci0KLQkJCQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgYWRhcHRlcikgewotCQkJCQlpZiAoSUVsZW1lbnRUeXBlLmNsYXNzLmVxdWFscyhhZGFwdGVyKSkgewotCQkJCQkJcmV0dXJuIFVNTEVsZW1lbnRUeXBlcy5BY3Rpdml0eVBhcnRpdGlvbl8yMDAxOwotCQkJCQl9Ci0JCQkJCXJldHVybiBzdXBlci5nZXRBZGFwdGVyKGFkYXB0ZXIpOwotCQkJCX0KLQkJCX07Ci0JCQlwYXJzZXIgPSBQYXJzZXJTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0UGFyc2VyKGhpbnRBZGFwdGVyKTsKLQkJfQotCQlyZXR1cm4gcGFyc2VyOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRGlyZWN0RWRpdE1hbmFnZXIgZ2V0TWFuYWdlcigpIHsKLQkJaWYgKG1hbmFnZXIgPT0gbnVsbCkgewotCQkJc2V0TWFuYWdlcihuZXcgVGV4dERpcmVjdEVkaXRNYW5hZ2VyKHRoaXMsIFRleHREaXJlY3RFZGl0TWFuYWdlcgotCQkJCQkuZ2V0VGV4dENlbGxFZGl0b3JDbGFzcyh0aGlzKSwgVU1MRWRpdFBhcnRGYWN0b3J5Ci0JCQkJCS5nZXRUZXh0Q2VsbEVkaXRvckxvY2F0b3IodGhpcykpKTsKLQkJfQotCQlyZXR1cm4gbWFuYWdlcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0TWFuYWdlcihEaXJlY3RFZGl0TWFuYWdlciBtYW5hZ2VyKSB7Ci0JCXRoaXMubWFuYWdlciA9IG1hbmFnZXI7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0KCkgewotCQlnZXRNYW5hZ2VyKCkuc2hvdygpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdChQb2ludCBldmVudExvY2F0aW9uKSB7Ci0JCWlmIChnZXRNYW5hZ2VyKCkuZ2V0Q2xhc3MoKSA9PSBUZXh0RGlyZWN0RWRpdE1hbmFnZXIuY2xhc3MpIHsKLQkJCSgoVGV4dERpcmVjdEVkaXRNYW5hZ2VyKSBnZXRNYW5hZ2VyKCkpLnNob3coZXZlbnRMb2NhdGlvbgotCQkJCQkuZ2V0U1dUUG9pbnQoKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0KGNoYXIgaW5pdGlhbENoYXJhY3RlcikgewotCQlpZiAoZ2V0TWFuYWdlcigpIGluc3RhbmNlb2YgVGV4dERpcmVjdEVkaXRNYW5hZ2VyKSB7Ci0JCQkoKFRleHREaXJlY3RFZGl0TWFuYWdlcikgZ2V0TWFuYWdlcigpKS5zaG93KGluaXRpYWxDaGFyYWN0ZXIpOwotCQl9IGVsc2UgewotCQkJcGVyZm9ybURpcmVjdEVkaXQoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdFJlcXVlc3QoUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCWZpbmFsIFJlcXVlc3QgdGhlUmVxdWVzdCA9IHJlcXVlc3Q7Ci0JCXRyeSB7Ci0JCQlnZXRFZGl0aW5nRG9tYWluKCkucnVuRXhjbHVzaXZlKG5ldyBSdW5uYWJsZSgpIHsKLQotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJaWYgKGlzQWN0aXZlKCkgJiYgaXNFZGl0YWJsZSgpKSB7Ci0JCQkJCQlpZiAodGhlUmVxdWVzdAotCQkJCQkJCQkuZ2V0RXh0ZW5kZWREYXRhKCkKLQkJCQkJCQkJLmdldCgKLQkJCQkJCQkJCQlSZXF1ZXN0Q29uc3RhbnRzLlJFUV9ESVJFQ1RFRElUX0VYVEVOREVEREFUQV9JTklUSUFMX0NIQVIpIGluc3RhbmNlb2YgQ2hhcmFjdGVyKSB7Ci0JCQkJCQkJQ2hhcmFjdGVyIGluaXRpYWxDaGFyID0gKENoYXJhY3RlcikgdGhlUmVxdWVzdAotCQkJCQkJCQkJLmdldEV4dGVuZGVkRGF0YSgpCi0JCQkJCQkJCQkuZ2V0KAotCQkJCQkJCQkJCQlSZXF1ZXN0Q29uc3RhbnRzLlJFUV9ESVJFQ1RFRElUX0VYVEVOREVEREFUQV9JTklUSUFMX0NIQVIpOwotCQkJCQkJCXBlcmZvcm1EaXJlY3RFZGl0KGluaXRpYWxDaGFyLmNoYXJWYWx1ZSgpKTsKLQkJCQkJCX0gZWxzZSBpZiAoKHRoZVJlcXVlc3QgaW5zdGFuY2VvZiBEaXJlY3RFZGl0UmVxdWVzdCkKLQkJCQkJCQkJJiYgKGdldEVkaXRUZXh0KCkuZXF1YWxzKGdldExhYmVsVGV4dCgpKSkpIHsKLQkJCQkJCQlEaXJlY3RFZGl0UmVxdWVzdCBlZGl0UmVxdWVzdCA9IChEaXJlY3RFZGl0UmVxdWVzdCkgdGhlUmVxdWVzdDsKLQkJCQkJCQlwZXJmb3JtRGlyZWN0RWRpdChlZGl0UmVxdWVzdC5nZXRMb2NhdGlvbigpKTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJcGVyZm9ybURpcmVjdEVkaXQoKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0pOwotCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hWaXN1YWxzKCkgewotCQlzdXBlci5yZWZyZXNoVmlzdWFscygpOwotCQlyZWZyZXNoTGFiZWwoKTsKLQkJcmVmcmVzaEZvbnQoKTsKLQkJcmVmcmVzaEZvbnRDb2xvcigpOwotCQlyZWZyZXNoVW5kZXJsaW5lKCk7Ci0JCXJlZnJlc2hTdHJpa2VUaHJvdWdoKCk7Ci0JCXJlZnJlc2hCb3VuZHMoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaExhYmVsKCkgewotCQlzZXRMYWJlbFRleHRIZWxwZXIoZ2V0RmlndXJlKCksIGdldExhYmVsVGV4dCgpKTsKLQkJc2V0TGFiZWxJY29uSGVscGVyKGdldEZpZ3VyZSgpLCBnZXRMYWJlbEljb24oKSk7Ci0JCU9iamVjdCBwZEVkaXRQb2xpY3kgPSBnZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUpOwotCQlpZiAocGRFZGl0UG9saWN5IGluc3RhbmNlb2YgVU1MVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHsKLQkJCSgoVU1MVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHBkRWRpdFBvbGljeSkucmVmcmVzaEZlZWRiYWNrKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFVuZGVybGluZSgpIHsKLQkJRm9udFN0eWxlIHN0eWxlID0gKEZvbnRTdHlsZSkgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkuZ2V0U3R5bGUoCi0JCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGUoKSk7Ci0JCWlmIChzdHlsZSAhPSBudWxsICYmIGdldEZpZ3VyZSgpIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQkoKFdyYXBMYWJlbCkgZ2V0RmlndXJlKCkpLnNldFRleHRVbmRlcmxpbmUoc3R5bGUuaXNVbmRlcmxpbmUoKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFN0cmlrZVRocm91Z2goKSB7Ci0JCUZvbnRTdHlsZSBzdHlsZSA9IChGb250U3R5bGUpIGdldEZvbnRTdHlsZU93bmVyVmlldygpLmdldFN0eWxlKAotCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlKCkpOwotCQlpZiAoc3R5bGUgIT0gbnVsbCAmJiBnZXRGaWd1cmUoKSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJKChXcmFwTGFiZWwpIGdldEZpZ3VyZSgpKS5zZXRUZXh0U3RyaWtlVGhyb3VnaChzdHlsZQotCQkJCQkuaXNTdHJpa2VUaHJvdWdoKCkpOwotCQl9Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaEZvbnQoKSB7Ci0JCUZvbnRTdHlsZSBzdHlsZSA9IChGb250U3R5bGUpIGdldEZvbnRTdHlsZU93bmVyVmlldygpLmdldFN0eWxlKAotCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlKCkpOwotCQlpZiAoc3R5bGUgIT0gbnVsbCkgewotCQkJU3RyaW5nIGZvbnROYW1lID0gRGlhZ3JhbUNvbnN0YW50cy5nZXRGb250TmFtZShzdHlsZSk7Ci0JCQlGb250RGF0YSBmb250RGF0YSA9IG5ldyBGb250RGF0YShmb250TmFtZSwgc3R5bGUKLQkJCQkJLmdldEZvbnRIZWlnaHQoKSwgKHN0eWxlLmlzQm9sZCgpID8gU1dULkJPTEQgOiBTV1QuTk9STUFMKQotCQkJCQl8IChzdHlsZS5pc0l0YWxpYygpID8gU1dULklUQUxJQyA6IFNXVC5OT1JNQUwpKTsKLQkJCXNldEZvbnQoZm9udERhdGEpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldEZvbnRDb2xvcihDb2xvciBjb2xvcikgewotCQlnZXRGaWd1cmUoKS5zZXRGb3JlZ3JvdW5kQ29sb3IoY29sb3IpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRTZW1hbnRpY0xpc3RlbmVycygpIHsKLQkJaWYgKGdldFBhcnNlcigpIGluc3RhbmNlb2YgSVNlbWFudGljUGFyc2VyKSB7Ci0JCQlFT2JqZWN0IGVsZW1lbnQgPSByZXNvbHZlU2VtYW50aWNFbGVtZW50KCk7Ci0JCQlwYXJzZXJFbGVtZW50cyA9ICgoSVNlbWFudGljUGFyc2VyKSBnZXRQYXJzZXIoKSkKLQkJCQkJLmdldFNlbWFudGljRWxlbWVudHNCZWluZ1BhcnNlZChlbGVtZW50KTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGFyc2VyRWxlbWVudHMuc2l6ZSgpOyBpKyspIHsKLQkJCQlhZGRMaXN0ZW5lckZpbHRlcigKLQkJCQkJCSJTZW1hbnRpY01vZGVsIiArIGksIHRoaXMsIChFT2JqZWN0KSBwYXJzZXJFbGVtZW50cy5nZXQoaSkpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlzdXBlci5hZGRTZW1hbnRpY0xpc3RlbmVycygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbW92ZVNlbWFudGljTGlzdGVuZXJzKCkgewotCQlpZiAocGFyc2VyRWxlbWVudHMgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJzZXJFbGVtZW50cy5zaXplKCk7IGkrKykgewotCQkJCXJlbW92ZUxpc3RlbmVyRmlsdGVyKCJTZW1hbnRpY01vZGVsIiArIGkpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlzdXBlci5yZW1vdmVTZW1hbnRpY0xpc3RlbmVycygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBBY2Nlc3NpYmxlRWRpdFBhcnQgZ2V0QWNjZXNzaWJsZUVkaXRQYXJ0KCkgewotCQlpZiAoYWNjZXNzaWJsZUVQID09IG51bGwpIHsKLQkJCWFjY2Vzc2libGVFUCA9IG5ldyBBY2Nlc3NpYmxlR3JhcGhpY2FsRWRpdFBhcnQoKSB7Ci0KLQkJCQlwdWJsaWMgdm9pZCBnZXROYW1lKEFjY2Vzc2libGVFdmVudCBlKSB7Ci0JCQkJCWUucmVzdWx0ID0gZ2V0TGFiZWxUZXh0SGVscGVyKGdldEZpZ3VyZSgpKTsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0JCXJldHVybiBhY2Nlc3NpYmxlRVA7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgVmlldyBnZXRGb250U3R5bGVPd25lclZpZXcoKSB7Ci0JCXJldHVybiBnZXRQcmltYXJ5VmlldygpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGROb3RhdGlvbmFsTGlzdGVuZXJzKCkgewotCQlzdXBlci5hZGROb3RhdGlvbmFsTGlzdGVuZXJzKCk7Ci0JCWFkZExpc3RlbmVyRmlsdGVyKCJQcmltYXJ5VmlldyIsIHRoaXMsIGdldFByaW1hcnlWaWV3KCkpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbW92ZU5vdGF0aW9uYWxMaXN0ZW5lcnMoKSB7Ci0JCXN1cGVyLnJlbW92ZU5vdGF0aW9uYWxMaXN0ZW5lcnMoKTsKLQkJcmVtb3ZlTGlzdGVuZXJGaWx0ZXIoIlByaW1hcnlWaWV3Iik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaEJvdW5kcygpIHsKLQkJaW50IHdpZHRoID0gKChJbnRlZ2VyKSBnZXRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0U2l6ZV9XaWR0aCgpKSkuaW50VmFsdWUoKTsKLQkJaW50IGhlaWdodCA9ICgoSW50ZWdlcikgZ2V0U3RydWN0dXJhbEZlYXR1cmVWYWx1ZShOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldFNpemVfSGVpZ2h0KCkpKS5pbnRWYWx1ZSgpOwotCQlEaW1lbnNpb24gc2l6ZSA9IG5ldyBEaW1lbnNpb24od2lkdGgsIGhlaWdodCk7Ci0JCWludCB4ID0gKChJbnRlZ2VyKSBnZXRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0TG9jYXRpb25fWCgpKSkuaW50VmFsdWUoKTsKLQkJaW50IHkgPSAoKEludGVnZXIpIGdldFN0cnVjdHVyYWxGZWF0dXJlVmFsdWUoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRMb2NhdGlvbl9ZKCkpKS5pbnRWYWx1ZSgpOwotCQlQb2ludCBsb2MgPSBuZXcgUG9pbnQoeCwgeSk7Ci0JCSgoR3JhcGhpY2FsRWRpdFBhcnQpIGdldFBhcmVudCgpKS5zZXRMYXlvdXRDb25zdHJhaW50KHRoaXMsCi0JCQkJZ2V0RmlndXJlKCksIG5ldyBSZWN0YW5nbGUobG9jLCBzaXplKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGhhbmRsZU5vdGlmaWNhdGlvbkV2ZW50KE5vdGlmaWNhdGlvbiBldmVudCkgewotCQlPYmplY3QgZmVhdHVyZSA9IGV2ZW50LmdldEZlYXR1cmUoKTsKLQkJaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2l6ZV9XaWR0aCgpLmVxdWFscyhmZWF0dXJlKQotCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2l6ZV9IZWlnaHQoKS5lcXVhbHMoZmVhdHVyZSkKLQkJCQl8fCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldExvY2F0aW9uX1goKS5lcXVhbHMoZmVhdHVyZSkKLQkJCQl8fCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldExvY2F0aW9uX1koKS5lcXVhbHMoZmVhdHVyZSkpIHsKLQkJCXJlZnJlc2hCb3VuZHMoKTsKLQkJfQotCQlpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfRm9udENvbG9yKCkuZXF1YWxzKGZlYXR1cmUpKSB7Ci0JCQlJbnRlZ2VyIGMgPSAoSW50ZWdlcikgZXZlbnQuZ2V0TmV3VmFsdWUoKTsKLQkJCXNldEZvbnRDb2xvcihEaWFncmFtQ29sb3JSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldENvbG9yKGMpKTsKLQkJfSBlbHNlIGlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9VbmRlcmxpbmUoKS5lcXVhbHMoCi0JCQkJZmVhdHVyZSkpIHsKLQkJCXJlZnJlc2hVbmRlcmxpbmUoKTsKLQkJfSBlbHNlIGlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9TdHJpa2VUaHJvdWdoKCkKLQkJCQkuZXF1YWxzKGZlYXR1cmUpKSB7Ci0JCQlyZWZyZXNoU3RyaWtlVGhyb3VnaCgpOwotCQl9IGVsc2UgaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0ZvbnRIZWlnaHQoKS5lcXVhbHMoCi0JCQkJZmVhdHVyZSkKLQkJCQl8fCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Gb250TmFtZSgpLmVxdWFscygKLQkJCQkJCWZlYXR1cmUpCi0JCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfQm9sZCgpCi0JCQkJCQkuZXF1YWxzKGZlYXR1cmUpCi0JCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfSXRhbGljKCkuZXF1YWxzKAotCQkJCQkJZmVhdHVyZSkpIHsKLQkJCXJlZnJlc2hGb250KCk7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoZ2V0UGFyc2VyKCkgIT0gbnVsbAotCQkJCQkmJiBnZXRQYXJzZXIoKS5pc0FmZmVjdGluZ0V2ZW50KGV2ZW50LAotCQkJCQkJCWdldFBhcnNlck9wdGlvbnMoKS5pbnRWYWx1ZSgpKSkgewotCQkJCXJlZnJlc2hMYWJlbCgpOwotCQkJfQotCQkJaWYgKGdldFBhcnNlcigpIGluc3RhbmNlb2YgSVNlbWFudGljUGFyc2VyKSB7Ci0JCQkJSVNlbWFudGljUGFyc2VyIG1vZGVsUGFyc2VyID0gKElTZW1hbnRpY1BhcnNlcikgZ2V0UGFyc2VyKCk7Ci0JCQkJaWYgKG1vZGVsUGFyc2VyLmFyZVNlbWFudGljRWxlbWVudHNBZmZlY3RlZChudWxsLCBldmVudCkpIHsKLQkJCQkJcmVtb3ZlU2VtYW50aWNMaXN0ZW5lcnMoKTsKLQkJCQkJaWYgKHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKSAhPSBudWxsKSB7Ci0JCQkJCQlhZGRTZW1hbnRpY0xpc3RlbmVycygpOwotCQkJCQl9Ci0JCQkJCXJlZnJlc2hMYWJlbCgpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlzdXBlci5oYW5kbGVOb3RpZmljYXRpb25FdmVudChldmVudCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZUZpZ3VyZSgpIHsKLQkJLy8gUGFyZW50IHNob3VsZCBhc3NpZ24gb25lIHVzaW5nIHNldExhYmVsKCkgbWV0aG9kCi0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BhcnRzL0FjdGl2aXR5UGFydGl0aW9uUGFydGl0aW9uQ2FtcGFydG1lbnQyRWRpdFBhcnQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BhcnRzL0FjdGl2aXR5UGFydGl0aW9uUGFydGl0aW9uQ2FtcGFydG1lbnQyRWRpdFBhcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTZmOGZkMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wYXJ0cy9BY3Rpdml0eVBhcnRpdGlvblBhcnRpdGlvbkNhbXBhcnRtZW50MkVkaXRQYXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucG9saWNpZXMuQWN0aXZpdHlQYXJ0aXRpb25QYXJ0aXRpb25DYW1wYXJ0bWVudDJDYW5vbmljYWxFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucG9saWNpZXMuQWN0aXZpdHlQYXJ0aXRpb25QYXJ0aXRpb25DYW1wYXJ0bWVudDJJdGVtU2VtYW50aWNFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5HcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5TaGFwZUNvbXBhcnRtZW50RWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuQ3JlYXRpb25FZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkRyYWdEcm9wRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5FZGl0UG9saWN5Um9sZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5maWd1cmVzLlJlc2l6YWJsZUNvbXBhcnRtZW50RmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vdGF0aW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXR5UGFydGl0aW9uUGFydGl0aW9uQ2FtcGFydG1lbnQyRWRpdFBhcnQgZXh0ZW5kcwotCQlTaGFwZUNvbXBhcnRtZW50RWRpdFBhcnQgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZJU1VBTF9JRCA9IDUwMDI7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFjdGl2aXR5UGFydGl0aW9uUGFydGl0aW9uQ2FtcGFydG1lbnQyRWRpdFBhcnQoVmlldyB2aWV3KSB7Ci0JCXN1cGVyKHZpZXcpOwotCX0KLQotCS8qKgotCSAqIEBtb2RpZmllZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q29tcGFydG1lbnROYW1lKCkgewotCQlyZXR1cm4gIiI7CS8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElGaWd1cmUgY3JlYXRlRmlndXJlKCkgewotCQlSZXNpemFibGVDb21wYXJ0bWVudEZpZ3VyZSByZXN1bHQgPSAoUmVzaXphYmxlQ29tcGFydG1lbnRGaWd1cmUpIHN1cGVyCi0JCQkJLmNyZWF0ZUZpZ3VyZSgpOwotCQlyZXN1bHQuc2V0VGl0bGVWaXNpYmlsaXR5KGZhbHNlKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpIHsKLQkJc3VwZXIuY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpOwotCQlpbnN0YWxsRWRpdFBvbGljeSgKLQkJCQlFZGl0UG9saWN5Um9sZXMuU0VNQU5USUNfUk9MRSwKLQkJCQluZXcgQWN0aXZpdHlQYXJ0aXRpb25QYXJ0aXRpb25DYW1wYXJ0bWVudDJJdGVtU2VtYW50aWNFZGl0UG9saWN5KCkpOwotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuQ1JFQVRJT05fUk9MRSwKLQkJCQluZXcgQ3JlYXRpb25FZGl0UG9saWN5KCkpOwotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuRFJBR19EUk9QX1JPTEUsCi0JCQkJbmV3IERyYWdEcm9wRWRpdFBvbGljeSgpKTsKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLkNBTk9OSUNBTF9ST0xFLAotCQkJCW5ldyBBY3Rpdml0eVBhcnRpdGlvblBhcnRpdGlvbkNhbXBhcnRtZW50MkNhbm9uaWNhbEVkaXRQb2xpY3koKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCS8vcHVibGljIElGaWd1cmUgY3JlYXRlRmlndXJlKCkgewotCS8vCUlGaWd1cmUgcmVzdWx0ID0gc3VwZXIuY3JlYXRlRmlndXJlKCk7Ci0JLy8JcmVzdWx0LnNldEJvcmRlcihuZXcgTGluZUJvcmRlcigpKTsKLQkvLwlyZXR1cm4gcmVzdWx0OwotCS8vfQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoVmlzdWFscygpIHsKLQkJc3VwZXIucmVmcmVzaFZpc3VhbHMoKTsKLQkJcmVmcmVzaEJvdW5kcygpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVOb3RpZmljYXRpb25FdmVudChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXN1cGVyLmhhbmRsZU5vdGlmaWNhdGlvbkV2ZW50KG5vdGlmaWNhdGlvbik7Ci0JCU9iamVjdCBmZWF0dXJlID0gbm90aWZpY2F0aW9uLmdldEZlYXR1cmUoKTsKLQkJaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2l6ZV9XaWR0aCgpLmVxdWFscyhmZWF0dXJlKQotCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2l6ZV9IZWlnaHQoKS5lcXVhbHMoZmVhdHVyZSkKLQkJCQl8fCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldExvY2F0aW9uX1goKS5lcXVhbHMoZmVhdHVyZSkKLQkJCQl8fCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldExvY2F0aW9uX1koKS5lcXVhbHMoZmVhdHVyZSkpIHsKLQkJCXJlZnJlc2hCb3VuZHMoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoQm91bmRzKCkgewotCQlpbnQgeCA9ICgoSW50ZWdlcikgZ2V0U3RydWN0dXJhbEZlYXR1cmVWYWx1ZShOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldExvY2F0aW9uX1goKSkpLmludFZhbHVlKCk7Ci0JCWludCB5ID0gKChJbnRlZ2VyKSBnZXRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0TG9jYXRpb25fWSgpKSkuaW50VmFsdWUoKTsKLQkJaW50IHdpZHRoID0gKChJbnRlZ2VyKSBnZXRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0U2l6ZV9XaWR0aCgpKSkuaW50VmFsdWUoKTsKLQkJaW50IGhlaWdodCA9ICgoSW50ZWdlcikgZ2V0U3RydWN0dXJhbEZlYXR1cmVWYWx1ZShOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldFNpemVfSGVpZ2h0KCkpKS5pbnRWYWx1ZSgpOwotCQkoKEdyYXBoaWNhbEVkaXRQYXJ0KSBnZXRQYXJlbnQoKSkuc2V0TGF5b3V0Q29uc3RyYWludCh0aGlzLAotCQkJCWdldEZpZ3VyZSgpLCBuZXcgUmVjdGFuZ2xlKHgsIHksIHdpZHRoLCBoZWlnaHQpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0UmF0aW8oRG91YmxlIHJhdGlvKSB7Ci0JCS8vIG5vdGhpbmcgdG8gZG8gLS0gcGFyZW50IGxheW91dCBkb2VzIG5vdCBhY2NlcHQgRG91YmxlIGNvbnN0cmFpbnRzIGFzIHJhdGlvCi0JCS8vIHN1cGVyLnNldFJhdGlvKHJhdGlvKTsgCi0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcGFydHMvQWN0aXZpdHlQYXJ0aXRpb25QYXJ0aXRpb25DYW1wYXJ0bWVudEVkaXRQYXJ0LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wYXJ0cy9BY3Rpdml0eVBhcnRpdGlvblBhcnRpdGlvbkNhbXBhcnRtZW50RWRpdFBhcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmI4ZGU5ZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wYXJ0cy9BY3Rpdml0eVBhcnRpdGlvblBhcnRpdGlvbkNhbXBhcnRtZW50RWRpdFBhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wb2xpY2llcy5BY3Rpdml0eVBhcnRpdGlvblBhcnRpdGlvbkNhbXBhcnRtZW50Q2Fub25pY2FsRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBvbGljaWVzLkFjdGl2aXR5UGFydGl0aW9uUGFydGl0aW9uQ2FtcGFydG1lbnRJdGVtU2VtYW50aWNFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5HcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5TaGFwZUNvbXBhcnRtZW50RWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuQ29udGFpbmVyTm9kZUVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuQ3JlYXRpb25FZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkRyYWdEcm9wRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5FZGl0UG9saWN5Um9sZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuWFlMYXlvdXRFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZmlndXJlcy5SZXNpemFibGVDb21wYXJ0bWVudEZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob3RhdGlvblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eVBhcnRpdGlvblBhcnRpdGlvbkNhbXBhcnRtZW50RWRpdFBhcnQgZXh0ZW5kcwotCQlTaGFwZUNvbXBhcnRtZW50RWRpdFBhcnQgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZJU1VBTF9JRCA9IDUwMDE7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFjdGl2aXR5UGFydGl0aW9uUGFydGl0aW9uQ2FtcGFydG1lbnRFZGl0UGFydChWaWV3IHZpZXcpIHsKLQkJc3VwZXIodmlldyk7Ci0JfQotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDb21wYXJ0bWVudE5hbWUoKSB7Ci0JCXJldHVybiAiIjsJLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSUZpZ3VyZSBjcmVhdGVGaWd1cmUoKSB7Ci0JCVJlc2l6YWJsZUNvbXBhcnRtZW50RmlndXJlIHJlc3VsdCA9IChSZXNpemFibGVDb21wYXJ0bWVudEZpZ3VyZSkgc3VwZXIKLQkJCQkuY3JlYXRlRmlndXJlKCk7Ci0JCXJlc3VsdC5zZXRUaXRsZVZpc2liaWxpdHkoZmFsc2UpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIEBtb2RpZmllZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKSB7Ci0JCXN1cGVyLmNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKTsKLQkJaW5zdGFsbEVkaXRQb2xpY3koCi0JCQkJRWRpdFBvbGljeVJvbGVzLlNFTUFOVElDX1JPTEUsCi0JCQkJbmV3IEFjdGl2aXR5UGFydGl0aW9uUGFydGl0aW9uQ2FtcGFydG1lbnRJdGVtU2VtYW50aWNFZGl0UG9saWN5KCkpOwotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuQ1JFQVRJT05fUk9MRSwKLQkJCQluZXcgQ3JlYXRpb25FZGl0UG9saWN5KCkpOwotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuRFJBR19EUk9QX1JPTEUsCi0JCQkJbmV3IERyYWdEcm9wRWRpdFBvbGljeSgpKTsKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLkNBTk9OSUNBTF9ST0xFLAotCQkJCW5ldyBBY3Rpdml0eVBhcnRpdGlvblBhcnRpdGlvbkNhbXBhcnRtZW50Q2Fub25pY2FsRWRpdFBvbGljeSgpKTsKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5HUkFQSElDQUxfTk9ERV9ST0xFLAotCQkJCW5ldyBDb250YWluZXJOb2RlRWRpdFBvbGljeSgpKTsKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5MQVlPVVRfUk9MRSwgbmV3IFhZTGF5b3V0RWRpdFBvbGljeSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JLy9wdWJsaWMgSUZpZ3VyZSBjcmVhdGVGaWd1cmUoKSB7Ci0JLy8JSUZpZ3VyZSByZXN1bHQgPSBzdXBlci5jcmVhdGVGaWd1cmUoKTsKLQkvLwlyZXN1bHQuc2V0Qm9yZGVyKG5ldyBMaW5lQm9yZGVyKCkpOwotCS8vCXJldHVybiByZXN1bHQ7Ci0JLy99Ci0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hWaXN1YWxzKCkgewotCQlzdXBlci5yZWZyZXNoVmlzdWFscygpOwotCQlyZWZyZXNoQm91bmRzKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGhhbmRsZU5vdGlmaWNhdGlvbkV2ZW50KE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJc3VwZXIuaGFuZGxlTm90aWZpY2F0aW9uRXZlbnQobm90aWZpY2F0aW9uKTsKLQkJT2JqZWN0IGZlYXR1cmUgPSBub3RpZmljYXRpb24uZ2V0RmVhdHVyZSgpOwotCQlpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRTaXplX1dpZHRoKCkuZXF1YWxzKGZlYXR1cmUpCi0JCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRTaXplX0hlaWdodCgpLmVxdWFscyhmZWF0dXJlKQotCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TG9jYXRpb25fWCgpLmVxdWFscyhmZWF0dXJlKQotCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TG9jYXRpb25fWSgpLmVxdWFscyhmZWF0dXJlKSkgewotCQkJcmVmcmVzaEJvdW5kcygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hCb3VuZHMoKSB7Ci0JCWludCB4ID0gKChJbnRlZ2VyKSBnZXRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0TG9jYXRpb25fWCgpKSkuaW50VmFsdWUoKTsKLQkJaW50IHkgPSAoKEludGVnZXIpIGdldFN0cnVjdHVyYWxGZWF0dXJlVmFsdWUoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRMb2NhdGlvbl9ZKCkpKS5pbnRWYWx1ZSgpOwotCQlpbnQgd2lkdGggPSAoKEludGVnZXIpIGdldFN0cnVjdHVyYWxGZWF0dXJlVmFsdWUoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRTaXplX1dpZHRoKCkpKS5pbnRWYWx1ZSgpOwotCQlpbnQgaGVpZ2h0ID0gKChJbnRlZ2VyKSBnZXRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0U2l6ZV9IZWlnaHQoKSkpLmludFZhbHVlKCk7Ci0JCSgoR3JhcGhpY2FsRWRpdFBhcnQpIGdldFBhcmVudCgpKS5zZXRMYXlvdXRDb25zdHJhaW50KHRoaXMsCi0JCQkJZ2V0RmlndXJlKCksIG5ldyBSZWN0YW5nbGUoeCwgeSwgd2lkdGgsIGhlaWdodCkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRSYXRpbyhEb3VibGUgcmF0aW8pIHsKLQkJLy8gbm90aGluZyB0byBkbyAtLSBwYXJlbnQgbGF5b3V0IGRvZXMgbm90IGFjY2VwdCBEb3VibGUgY29uc3RyYWludHMgYXMgcmF0aW8KLQkJLy8gc3VwZXIuc2V0UmF0aW8ocmF0aW8pOyAKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wYXJ0cy9Db250cm9sRmxvd0VkaXRQYXJ0LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wYXJ0cy9Db250cm9sRmxvd0VkaXRQYXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiYzFlYmIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcGFydHMvQ29udHJvbEZsb3dFZGl0UGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5FZGl0UG9saWN5Um9sZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuUG9seWxpbmVDb25uZWN0aW9uRXg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRWRnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Db25uZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlBvbHlsaW5lRGVjb3JhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnRMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucG9saWNpZXMuQ29udHJvbEZsb3dJdGVtU2VtYW50aWNFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUudXRpbC5EaWFncmFtQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUudXRpbC5EaWFncmFtQ29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS51dGlsLkRpYWdyYW1Db3JlVmFsaWRhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLkNvbm5lY3Rpb25Ob2RlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIENvbnRyb2xGbG93RWRpdFBhcnQgZXh0ZW5kcyBDb25uZWN0aW9uTm9kZUVkaXRQYXJ0IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWSVNVQUxfSUQgPSAzMDAxOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb250cm9sRmxvd0VkaXRQYXJ0KFZpZXcgdmlldykgewotCQlzdXBlcih2aWV3KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpIHsKLQkJc3VwZXIuY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpOwotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuU0VNQU5USUNfUk9MRSwKLQkJCQluZXcgQ29udHJvbEZsb3dJdGVtU2VtYW50aWNFZGl0UG9saWN5KCkpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgZmlndXJlIGZvciB0aGlzIGVkaXQgcGFydC4KLQkgKiAKLQkgKiBCb2R5IG9mIHRoaXMgbWV0aG9kIGRvZXMgbm90IGRlcGVuZCBvbiBzZXR0aW5ncyBpbiBnZW5lcmF0aW9uIG1vZGVsCi0JICogc28geW91IG1heSBzYWZlbHkgcmVtb3ZlIDxpPmdlbmVyYXRlZDwvaT4gdGFnIGFuZCBtb2RpZnkgaXQuCi0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb25uZWN0aW9uIGNyZWF0ZUNvbm5lY3Rpb25GaWd1cmUoKSB7Ci0KLQkJcmV0dXJuIG5ldyBDb250cm9sRmxvd0ZpZ3VyZSgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgY2xhc3MgQ29udHJvbEZsb3dGaWd1cmUgZXh0ZW5kcyBQb2x5bGluZUNvbm5lY3Rpb25FeCB7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBDb250cm9sRmxvd0ZpZ3VyZSgpIHsKLQotCQkJc2V0VGFyZ2V0RGVjb3JhdGlvbihjcmVhdGVUYXJnZXREZWNvcmF0aW9uKCkpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgUG9seWxpbmVEZWNvcmF0aW9uIGNyZWF0ZVRhcmdldERlY29yYXRpb24oKSB7Ci0JCQlQb2x5bGluZURlY29yYXRpb24gZGYgPSBuZXcgUG9seWxpbmVEZWNvcmF0aW9uKCk7Ci0JCQkvLyBkaXNwYXRjaE5leHQ/Ci0KLQkJCVBvaW50TGlzdCBwbCA9IG5ldyBQb2ludExpc3QoKTsKLQkJCXBsLmFkZFBvaW50KC0xLCAxKTsKLQkJCXBsLmFkZFBvaW50KDAsIDApOwotCQkJcGwuYWRkUG9pbnQoLTEsIC0xKTsKLQkJCWRmLnNldFRlbXBsYXRlKHBsKTsKLQkJCWRmLnNldFNjYWxlKGdldE1hcE1vZGUoKS5EUHRvTFAoNyksIGdldE1hcE1vZGUoKS5EUHRvTFAoMykpOwotCi0JCQlyZXR1cm4gZGY7Ci0JCX0KLQotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hGb3JlZ3JvdW5kQ29sb3IoKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJc3VwZXIucmVmcmVzaEZvcmVncm91bmRDb2xvcigpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hWaXN1YWxzKCkgewotCQlzdXBlci5yZWZyZXNoVmlzdWFscygpOwotCQlpZiAoRGlhZ3JhbUNvcmVWYWxpZGF0aW9uLmNoZWNrRGVsZXRlKChFZGdlKSBnZXRNb2RlbCgpKSAhPSBudWxsKSB7Ci0JCQl0aGlzLmRpc2FibGVFZGl0TW9kZSgpOwotCQl9Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0Rm9yZWdyb3VuZENvbG9yKENvbG9yIGNvbG9yKSB7Ci0JCUNvbG9yIG92ZXJyaWRlQ29sb3IgPSBEaWFncmFtQ29yZVV0aWwuZ2V0TGlua092ZXJyaWRlQ29sb3IoKEVkZ2UpIGdldE1vZGVsKCkpOwotCQlzdXBlci5zZXRGb3JlZ3JvdW5kQ29sb3Iob3ZlcnJpZGVDb2xvciAhPSBudWxsID8gb3ZlcnJpZGVDb2xvciA6IGNvbG9yKTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wYXJ0cy9Db250cm9sRmxvd05hbWVFZGl0UGFydC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcGFydHMvQ29udHJvbEZsb3dOYW1lRWRpdFBhcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmJkMDkwMy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wYXJ0cy9Db250cm9sRmxvd05hbWVFZGl0UGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuQ29ubmVjdGlvbkxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlJ1bm5hYmxlV2l0aFJlc3VsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBvbGljaWVzLlVNTFRleHRTZWxlY3Rpb25FZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnBhcnQuVU1MVmlzdWFsSURSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5wcm92aWRlcnMuVU1MRWxlbWVudFR5cGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUudXRpbC5EaWFncmFtQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5BY2Nlc3NpYmxlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLkRpcmVjdEVkaXRSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi50b29scy5EaXJlY3RFZGl0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLklQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5JUGFyc2VyRWRpdFN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLlBhcnNlckVkaXRTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5QYXJzZXJPcHRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuUGFyc2VyU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JR3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSVRleHRBd2FyZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLkxhYmVsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuTGFiZWxEaXJlY3RFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkubDEwbi5EaWFncmFtQ29sb3JSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlcXVlc3RzLlJlcXVlc3RDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS50b29scy5UZXh0RGlyZWN0RWRpdE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb3JlLnV0aWwuRU9iamVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5JRWxlbWVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnVpLnNlcnZpY2VzLnBhcnNlci5JU2VtYW50aWNQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnVpLnNlcnZpY2VzLnBhcnNlci5QYXJzZXJIaW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Gb250U3R5bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm90YXRpb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZW50QXNzaXN0UHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNlbGxFZGl0b3JWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmxlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250RGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQ29udHJvbEZsb3dOYW1lRWRpdFBhcnQgZXh0ZW5kcyBMYWJlbEVkaXRQYXJ0IGltcGxlbWVudHMKLQkJSVRleHRBd2FyZUVkaXRQYXJ0IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWSVNVQUxfSUQgPSA0MDEyOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRGlyZWN0RWRpdE1hbmFnZXIgbWFuYWdlcjsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIElQYXJzZXIgcGFyc2VyOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgTGlzdCBwYXJzZXJFbGVtZW50czsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBkZWZhdWx0VGV4dDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlzdGF0aWMgewotCQlyZWdpc3RlclNuYXBCYWNrUG9zaXRpb24oVU1MVmlzdWFsSURSZWdpc3RyeQotCQkJCS5nZXRUeXBlKENvbnRyb2xGbG93TmFtZUVkaXRQYXJ0LlZJU1VBTF9JRCksIG5ldyBQb2ludCgwLCA0MCkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ29udHJvbEZsb3dOYW1lRWRpdFBhcnQoVmlldyB2aWV3KSB7Ci0JCXN1cGVyKHZpZXcpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCkgewotCQlzdXBlci5jcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuRElSRUNUX0VESVRfUk9MRSwKLQkJCQluZXcgTGFiZWxEaXJlY3RFZGl0UG9saWN5KCkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgaW50IGdldEtleVBvaW50KCkgewotCQlyZXR1cm4gQ29ubmVjdGlvbkxvY2F0b3IuTUlERExFOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldExhYmVsVGV4dEhlbHBlcihJRmlndXJlIGZpZ3VyZSkgewotCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQlyZXR1cm4gKChXcmFwTGFiZWwpIGZpZ3VyZSkuZ2V0VGV4dCgpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuICgoTGFiZWwpIGZpZ3VyZSkuZ2V0VGV4dCgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldExhYmVsVGV4dEhlbHBlcihJRmlndXJlIGZpZ3VyZSwgU3RyaW5nIHRleHQpIHsKLQkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJKChXcmFwTGFiZWwpIGZpZ3VyZSkuc2V0VGV4dCh0ZXh0KTsKLQkJfSBlbHNlIHsKLQkJCSgoTGFiZWwpIGZpZ3VyZSkuc2V0VGV4dCh0ZXh0KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSW1hZ2UgZ2V0TGFiZWxJY29uSGVscGVyKElGaWd1cmUgZmlndXJlKSB7Ci0JCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCXJldHVybiAoKFdyYXBMYWJlbCkgZmlndXJlKS5nZXRJY29uKCk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gKChMYWJlbCkgZmlndXJlKS5nZXRJY29uKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0TGFiZWxJY29uSGVscGVyKElGaWd1cmUgZmlndXJlLCBJbWFnZSBpY29uKSB7Ci0JCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCSgoV3JhcExhYmVsKSBmaWd1cmUpLnNldEljb24oaWNvbik7Ci0JCX0gZWxzZSB7Ci0JCQkoKExhYmVsKSBmaWd1cmUpLnNldEljb24oaWNvbik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGFiZWwoSUZpZ3VyZSBmaWd1cmUpIHsKLQkJdW5yZWdpc3RlclZpc3VhbHMoKTsKLQkJc2V0RmlndXJlKGZpZ3VyZSk7Ci0JCWRlZmF1bHRUZXh0ID0gZ2V0TGFiZWxUZXh0SGVscGVyKGZpZ3VyZSk7Ci0JCXJlZ2lzdGVyVmlzdWFscygpOwotCQlyZWZyZXNoVmlzdWFscygpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBnZXRNb2RlbENoaWxkcmVuKCkgewotCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElHcmFwaGljYWxFZGl0UGFydCBnZXRDaGlsZEJ5U2VtYW50aWNIaW50KFN0cmluZyBzZW1hbnRpY0hpbnQpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFT2JqZWN0IGdldFBhcnNlckVsZW1lbnQoKSB7Ci0JCUVPYmplY3QgZWxlbWVudCA9IHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKTsKLQkJcmV0dXJuIGVsZW1lbnQgIT0gbnVsbCA/IGVsZW1lbnQgOiAoVmlldykgZ2V0TW9kZWwoKTsKLQl9Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSW1hZ2UgZ2V0TGFiZWxJY29uKCkgewotCQkvLwkJSW1hZ2VEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBBY3Rpdml0eURpYWdyYW1FZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKQotCQkvLwkJCQkuZ2V0SXRlbUltYWdlRGVzY3JpcHRvcihnZXRQYXJzZXJFbGVtZW50KCkpOwotCQkvLwkJaWYgKGRlc2NyaXB0b3IgPT0gbnVsbCkgewotCQkvLwkJCWRlc2NyaXB0b3IgPSBJbWFnZURlc2NyaXB0b3IuZ2V0TWlzc2luZ0ltYWdlRGVzY3JpcHRvcigpOwotCQkvLwkJfQotCQkvLwkJcmV0dXJuIGRlc2NyaXB0b3IuY3JlYXRlSW1hZ2UoKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TGFiZWxUZXh0KCkgewotCQlTdHJpbmcgdGV4dCA9IG51bGw7Ci0JCWlmIChnZXRQYXJzZXIoKSAhPSBudWxsKSB7Ci0JCQl0ZXh0ID0gZ2V0UGFyc2VyKCkuZ2V0UHJpbnRTdHJpbmcoCi0JCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihnZXRQYXJzZXJFbGVtZW50KCkpLAotCQkJCQlnZXRQYXJzZXJPcHRpb25zKCkuaW50VmFsdWUoKSk7Ci0JCX0KLQkJaWYgKHRleHQgPT0gbnVsbCB8fCB0ZXh0Lmxlbmd0aCgpID09IDApIHsKLQkJCXRleHQgPSBkZWZhdWx0VGV4dDsKLQkJfQotCQlyZXR1cm4gdGV4dDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGFiZWxUZXh0KFN0cmluZyB0ZXh0KSB7Ci0JCXNldExhYmVsVGV4dEhlbHBlcihnZXRGaWd1cmUoKSwgdGV4dCk7Ci0JCU9iamVjdCBwZEVkaXRQb2xpY3kgPSBnZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUpOwotCQlpZiAocGRFZGl0UG9saWN5IGluc3RhbmNlb2YgVU1MVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHsKLQkJCSgoVU1MVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHBkRWRpdFBvbGljeSkucmVmcmVzaEZlZWRiYWNrKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRFZGl0VGV4dCgpIHsKLQkJaWYgKGdldFBhcnNlcigpID09IG51bGwpIHsKLQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBnZXRQYXJzZXIoKS5nZXRFZGl0U3RyaW5nKAotCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihnZXRQYXJzZXJFbGVtZW50KCkpLAotCQkJCWdldFBhcnNlck9wdGlvbnMoKS5pbnRWYWx1ZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNFZGl0YWJsZSgpIHsKLQkJcmV0dXJuIGdldFBhcnNlcigpICE9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJQ2VsbEVkaXRvclZhbGlkYXRvciBnZXRFZGl0VGV4dFZhbGlkYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBJQ2VsbEVkaXRvclZhbGlkYXRvcigpIHsKLQotCQkJcHVibGljIFN0cmluZyBpc1ZhbGlkKGZpbmFsIE9iamVjdCB2YWx1ZSkgewotCQkJCWlmICh2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykgewotCQkJCQlmaW5hbCBFT2JqZWN0IGVsZW1lbnQgPSBnZXRQYXJzZXJFbGVtZW50KCk7Ci0JCQkJCWZpbmFsIElQYXJzZXIgcGFyc2VyID0gZ2V0UGFyc2VyKCk7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlJUGFyc2VyRWRpdFN0YXR1cyB2YWxpZCA9IChJUGFyc2VyRWRpdFN0YXR1cykgZ2V0RWRpdGluZ0RvbWFpbigpCi0JCQkJCQkJCS5ydW5FeGNsdXNpdmUobmV3IFJ1bm5hYmxlV2l0aFJlc3VsdC5JbXBsKCkgewotCi0JCQkJCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJCQkJc2V0UmVzdWx0KHBhcnNlci5pc1ZhbGlkRWRpdFN0cmluZygKLQkJCQkJCQkJCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihlbGVtZW50KSwKLQkJCQkJCQkJCQkJCShTdHJpbmcpIHZhbHVlKSk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0pOwotCQkJCQkJcmV0dXJuIHZhbGlkLmdldENvZGUoKSA9PSBQYXJzZXJFZGl0U3RhdHVzLkVESVRBQkxFID8gbnVsbAotCQkJCQkJCQk6IHZhbGlkLmdldE1lc3NhZ2UoKTsKLQkJCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gaWUpIHsKLQkJCQkJCWllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJLy8gc2hvdWxkbid0IGdldCBoZXJlCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJQ29udGVudEFzc2lzdFByb2Nlc3NvciBnZXRDb21wbGV0aW9uUHJvY2Vzc29yKCkgewotCQlpZiAoZ2V0UGFyc2VyKCkgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIGdldFBhcnNlcigpLmdldENvbXBsZXRpb25Qcm9jZXNzb3IoCi0JCQkJbmV3IEVPYmplY3RBZGFwdGVyKGdldFBhcnNlckVsZW1lbnQoKSkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUGFyc2VyT3B0aW9ucyBnZXRQYXJzZXJPcHRpb25zKCkgewotCQlyZXR1cm4gUGFyc2VyT3B0aW9ucy5OT05FOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSVBhcnNlciBnZXRQYXJzZXIoKSB7Ci0JCWlmIChwYXJzZXIgPT0gbnVsbCkgewotCQkJU3RyaW5nIHBhcnNlckhpbnQgPSAoKFZpZXcpIGdldE1vZGVsKCkpLmdldFR5cGUoKTsKLQkJCVBhcnNlckhpbnRBZGFwdGVyIGhpbnRBZGFwdGVyID0gbmV3IFBhcnNlckhpbnRBZGFwdGVyKAotCQkJCQlnZXRQYXJzZXJFbGVtZW50KCksIHBhcnNlckhpbnQpIHsKLQotCQkJCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihDbGFzcyBhZGFwdGVyKSB7Ci0JCQkJCWlmIChJRWxlbWVudFR5cGUuY2xhc3MuZXF1YWxzKGFkYXB0ZXIpKSB7Ci0JCQkJCQlyZXR1cm4gVU1MRWxlbWVudFR5cGVzLkNvbnRyb2xGbG93XzMwMDE7Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIHN1cGVyLmdldEFkYXB0ZXIoYWRhcHRlcik7Ci0JCQkJfQotCQkJfTsKLQkJCXBhcnNlciA9IFBhcnNlclNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRQYXJzZXIoaGludEFkYXB0ZXIpOwotCQl9Ci0JCXJldHVybiBwYXJzZXI7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBEaXJlY3RFZGl0TWFuYWdlciBnZXRNYW5hZ2VyKCkgewotCQlpZiAobWFuYWdlciA9PSBudWxsKSB7Ci0JCQlzZXRNYW5hZ2VyKG5ldyBUZXh0RGlyZWN0RWRpdE1hbmFnZXIodGhpcywgVGV4dERpcmVjdEVkaXRNYW5hZ2VyCi0JCQkJCS5nZXRUZXh0Q2VsbEVkaXRvckNsYXNzKHRoaXMpLCBVTUxFZGl0UGFydEZhY3RvcnkKLQkJCQkJLmdldFRleHRDZWxsRWRpdG9yTG9jYXRvcih0aGlzKSkpOwotCQl9Ci0JCXJldHVybiBtYW5hZ2VyOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRNYW5hZ2VyKERpcmVjdEVkaXRNYW5hZ2VyIG1hbmFnZXIpIHsKLQkJdGhpcy5tYW5hZ2VyID0gbWFuYWdlcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURpcmVjdEVkaXQoKSB7Ci0JCWdldE1hbmFnZXIoKS5zaG93KCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0KFBvaW50IGV2ZW50TG9jYXRpb24pIHsKLQkJaWYgKGdldE1hbmFnZXIoKS5nZXRDbGFzcygpID09IFRleHREaXJlY3RFZGl0TWFuYWdlci5jbGFzcykgewotCQkJKChUZXh0RGlyZWN0RWRpdE1hbmFnZXIpIGdldE1hbmFnZXIoKSkuc2hvdyhldmVudExvY2F0aW9uCi0JCQkJCS5nZXRTV1RQb2ludCgpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHZvaWQgcGVyZm9ybURpcmVjdEVkaXQoY2hhciBpbml0aWFsQ2hhcmFjdGVyKSB7Ci0JCWlmIChnZXRNYW5hZ2VyKCkgaW5zdGFuY2VvZiBUZXh0RGlyZWN0RWRpdE1hbmFnZXIpIHsKLQkJCSgoVGV4dERpcmVjdEVkaXRNYW5hZ2VyKSBnZXRNYW5hZ2VyKCkpLnNob3coaW5pdGlhbENoYXJhY3Rlcik7Ci0JCX0gZWxzZSB7Ci0JCQlwZXJmb3JtRGlyZWN0RWRpdCgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0UmVxdWVzdChSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJZmluYWwgUmVxdWVzdCB0aGVSZXF1ZXN0ID0gcmVxdWVzdDsKLQkJdHJ5IHsKLQkJCWdldEVkaXRpbmdEb21haW4oKS5ydW5FeGNsdXNpdmUobmV3IFJ1bm5hYmxlKCkgewotCi0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQlpZiAoaXNBY3RpdmUoKSAmJiBpc0VkaXRhYmxlKCkpIHsKLQkJCQkJCWlmICh0aGVSZXF1ZXN0Ci0JCQkJCQkJCS5nZXRFeHRlbmRlZERhdGEoKQotCQkJCQkJCQkuZ2V0KAotCQkJCQkJCQkJCVJlcXVlc3RDb25zdGFudHMuUkVRX0RJUkVDVEVESVRfRVhURU5ERUREQVRBX0lOSVRJQUxfQ0hBUikgaW5zdGFuY2VvZiBDaGFyYWN0ZXIpIHsKLQkJCQkJCQlDaGFyYWN0ZXIgaW5pdGlhbENoYXIgPSAoQ2hhcmFjdGVyKSB0aGVSZXF1ZXN0Ci0JCQkJCQkJCQkuZ2V0RXh0ZW5kZWREYXRhKCkKLQkJCQkJCQkJCS5nZXQoCi0JCQkJCQkJCQkJCVJlcXVlc3RDb25zdGFudHMuUkVRX0RJUkVDVEVESVRfRVhURU5ERUREQVRBX0lOSVRJQUxfQ0hBUik7Ci0JCQkJCQkJcGVyZm9ybURpcmVjdEVkaXQoaW5pdGlhbENoYXIuY2hhclZhbHVlKCkpOwotCQkJCQkJfSBlbHNlIGlmICgodGhlUmVxdWVzdCBpbnN0YW5jZW9mIERpcmVjdEVkaXRSZXF1ZXN0KQotCQkJCQkJCQkmJiAoZ2V0RWRpdFRleHQoKS5lcXVhbHMoZ2V0TGFiZWxUZXh0KCkpKSkgewotCQkJCQkJCURpcmVjdEVkaXRSZXF1ZXN0IGVkaXRSZXF1ZXN0ID0gKERpcmVjdEVkaXRSZXF1ZXN0KSB0aGVSZXF1ZXN0OwotCQkJCQkJCXBlcmZvcm1EaXJlY3RFZGl0KGVkaXRSZXF1ZXN0LmdldExvY2F0aW9uKCkpOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlwZXJmb3JtRGlyZWN0RWRpdCgpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfSk7Ci0JCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFZpc3VhbHMoKSB7Ci0JCXN1cGVyLnJlZnJlc2hWaXN1YWxzKCk7Ci0JCXJlZnJlc2hMYWJlbCgpOwotCQlyZWZyZXNoRm9udCgpOwotCQlyZWZyZXNoRm9udENvbG9yKCk7Ci0JCXJlZnJlc2hVbmRlcmxpbmUoKTsKLQkJcmVmcmVzaFN0cmlrZVRocm91Z2goKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaExhYmVsKCkgewotCQlzZXRMYWJlbFRleHRIZWxwZXIoZ2V0RmlndXJlKCksIGdldExhYmVsVGV4dCgpKTsKLQkJc2V0TGFiZWxJY29uSGVscGVyKGdldEZpZ3VyZSgpLCBnZXRMYWJlbEljb24oKSk7Ci0JCU9iamVjdCBwZEVkaXRQb2xpY3kgPSBnZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUpOwotCQlpZiAocGRFZGl0UG9saWN5IGluc3RhbmNlb2YgVU1MVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHsKLQkJCSgoVU1MVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHBkRWRpdFBvbGljeSkucmVmcmVzaEZlZWRiYWNrKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFVuZGVybGluZSgpIHsKLQkJRm9udFN0eWxlIHN0eWxlID0gKEZvbnRTdHlsZSkgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkuZ2V0U3R5bGUoCi0JCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGUoKSk7Ci0JCWlmIChzdHlsZSAhPSBudWxsICYmIGdldEZpZ3VyZSgpIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQkoKFdyYXBMYWJlbCkgZ2V0RmlndXJlKCkpLnNldFRleHRVbmRlcmxpbmUoc3R5bGUuaXNVbmRlcmxpbmUoKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFN0cmlrZVRocm91Z2goKSB7Ci0JCUZvbnRTdHlsZSBzdHlsZSA9IChGb250U3R5bGUpIGdldEZvbnRTdHlsZU93bmVyVmlldygpLmdldFN0eWxlKAotCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlKCkpOwotCQlpZiAoc3R5bGUgIT0gbnVsbCAmJiBnZXRGaWd1cmUoKSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJKChXcmFwTGFiZWwpIGdldEZpZ3VyZSgpKS5zZXRUZXh0U3RyaWtlVGhyb3VnaChzdHlsZQotCQkJCQkuaXNTdHJpa2VUaHJvdWdoKCkpOwotCQl9Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaEZvbnQoKSB7Ci0JCUZvbnRTdHlsZSBzdHlsZSA9IChGb250U3R5bGUpIGdldEZvbnRTdHlsZU93bmVyVmlldygpLmdldFN0eWxlKAotCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlKCkpOwotCQlpZiAoc3R5bGUgIT0gbnVsbCkgewotCQkJU3RyaW5nIGZvbnROYW1lID0gRGlhZ3JhbUNvbnN0YW50cy5nZXRGb250TmFtZShzdHlsZSk7Ci0JCQlGb250RGF0YSBmb250RGF0YSA9IG5ldyBGb250RGF0YShmb250TmFtZSwgc3R5bGUKLQkJCQkJLmdldEZvbnRIZWlnaHQoKSwgKHN0eWxlLmlzQm9sZCgpID8gU1dULkJPTEQgOiBTV1QuTk9STUFMKQotCQkJCQl8IChzdHlsZS5pc0l0YWxpYygpID8gU1dULklUQUxJQyA6IFNXVC5OT1JNQUwpKTsKLQkJCXNldEZvbnQoZm9udERhdGEpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldEZvbnRDb2xvcihDb2xvciBjb2xvcikgewotCQlnZXRGaWd1cmUoKS5zZXRGb3JlZ3JvdW5kQ29sb3IoY29sb3IpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRTZW1hbnRpY0xpc3RlbmVycygpIHsKLQkJaWYgKGdldFBhcnNlcigpIGluc3RhbmNlb2YgSVNlbWFudGljUGFyc2VyKSB7Ci0JCQlFT2JqZWN0IGVsZW1lbnQgPSByZXNvbHZlU2VtYW50aWNFbGVtZW50KCk7Ci0JCQlwYXJzZXJFbGVtZW50cyA9ICgoSVNlbWFudGljUGFyc2VyKSBnZXRQYXJzZXIoKSkKLQkJCQkJLmdldFNlbWFudGljRWxlbWVudHNCZWluZ1BhcnNlZChlbGVtZW50KTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGFyc2VyRWxlbWVudHMuc2l6ZSgpOyBpKyspIHsKLQkJCQlhZGRMaXN0ZW5lckZpbHRlcigKLQkJCQkJCSJTZW1hbnRpY01vZGVsIiArIGksIHRoaXMsIChFT2JqZWN0KSBwYXJzZXJFbGVtZW50cy5nZXQoaSkpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlzdXBlci5hZGRTZW1hbnRpY0xpc3RlbmVycygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbW92ZVNlbWFudGljTGlzdGVuZXJzKCkgewotCQlpZiAocGFyc2VyRWxlbWVudHMgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJzZXJFbGVtZW50cy5zaXplKCk7IGkrKykgewotCQkJCXJlbW92ZUxpc3RlbmVyRmlsdGVyKCJTZW1hbnRpY01vZGVsIiArIGkpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlzdXBlci5yZW1vdmVTZW1hbnRpY0xpc3RlbmVycygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBBY2Nlc3NpYmxlRWRpdFBhcnQgZ2V0QWNjZXNzaWJsZUVkaXRQYXJ0KCkgewotCQlpZiAoYWNjZXNzaWJsZUVQID09IG51bGwpIHsKLQkJCWFjY2Vzc2libGVFUCA9IG5ldyBBY2Nlc3NpYmxlR3JhcGhpY2FsRWRpdFBhcnQoKSB7Ci0KLQkJCQlwdWJsaWMgdm9pZCBnZXROYW1lKEFjY2Vzc2libGVFdmVudCBlKSB7Ci0JCQkJCWUucmVzdWx0ID0gZ2V0TGFiZWxUZXh0SGVscGVyKGdldEZpZ3VyZSgpKTsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0JCXJldHVybiBhY2Nlc3NpYmxlRVA7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgVmlldyBnZXRGb250U3R5bGVPd25lclZpZXcoKSB7Ci0JCXJldHVybiBnZXRQcmltYXJ5VmlldygpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVOb3RpZmljYXRpb25FdmVudChOb3RpZmljYXRpb24gZXZlbnQpIHsKLQkJT2JqZWN0IGZlYXR1cmUgPSBldmVudC5nZXRGZWF0dXJlKCk7Ci0JCWlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Gb250Q29sb3IoKS5lcXVhbHMoZmVhdHVyZSkpIHsKLQkJCUludGVnZXIgYyA9IChJbnRlZ2VyKSBldmVudC5nZXROZXdWYWx1ZSgpOwotCQkJc2V0Rm9udENvbG9yKERpYWdyYW1Db2xvclJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0Q29sb3IoYykpOwotCQl9IGVsc2UgaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX1VuZGVybGluZSgpLmVxdWFscygKLQkJCQlmZWF0dXJlKSkgewotCQkJcmVmcmVzaFVuZGVybGluZSgpOwotCQl9IGVsc2UgaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX1N0cmlrZVRocm91Z2goKQotCQkJCS5lcXVhbHMoZmVhdHVyZSkpIHsKLQkJCXJlZnJlc2hTdHJpa2VUaHJvdWdoKCk7Ci0JCX0gZWxzZSBpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfRm9udEhlaWdodCgpLmVxdWFscygKLQkJCQlmZWF0dXJlKQotCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0ZvbnROYW1lKCkuZXF1YWxzKAotCQkJCQkJZmVhdHVyZSkKLQkJCQl8fCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Cb2xkKCkKLQkJCQkJCS5lcXVhbHMoZmVhdHVyZSkKLQkJCQl8fCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9JdGFsaWMoKS5lcXVhbHMoCi0JCQkJCQlmZWF0dXJlKSkgewotCQkJcmVmcmVzaEZvbnQoKTsKLQkJfSBlbHNlIHsKLQkJCWlmIChnZXRQYXJzZXIoKSAhPSBudWxsCi0JCQkJCSYmIGdldFBhcnNlcigpLmlzQWZmZWN0aW5nRXZlbnQoZXZlbnQsCi0JCQkJCQkJZ2V0UGFyc2VyT3B0aW9ucygpLmludFZhbHVlKCkpKSB7Ci0JCQkJcmVmcmVzaExhYmVsKCk7Ci0JCQl9Ci0JCQlpZiAoZ2V0UGFyc2VyKCkgaW5zdGFuY2VvZiBJU2VtYW50aWNQYXJzZXIpIHsKLQkJCQlJU2VtYW50aWNQYXJzZXIgbW9kZWxQYXJzZXIgPSAoSVNlbWFudGljUGFyc2VyKSBnZXRQYXJzZXIoKTsKLQkJCQlpZiAobW9kZWxQYXJzZXIuYXJlU2VtYW50aWNFbGVtZW50c0FmZmVjdGVkKG51bGwsIGV2ZW50KSkgewotCQkJCQlyZW1vdmVTZW1hbnRpY0xpc3RlbmVycygpOwotCQkJCQlpZiAocmVzb2x2ZVNlbWFudGljRWxlbWVudCgpICE9IG51bGwpIHsKLQkJCQkJCWFkZFNlbWFudGljTGlzdGVuZXJzKCk7Ci0JCQkJCX0KLQkJCQkJcmVmcmVzaExhYmVsKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXN1cGVyLmhhbmRsZU5vdGlmaWNhdGlvbkV2ZW50KGV2ZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlRmlndXJlKCkgewotCQlJRmlndXJlIGxhYmVsID0gY3JlYXRlRmlndXJlUHJpbSgpOwotCQlkZWZhdWx0VGV4dCA9IGdldExhYmVsVGV4dEhlbHBlcihsYWJlbCk7Ci0JCXJldHVybiBsYWJlbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlRmlndXJlUHJpbSgpIHsKLQkJcmV0dXJuIG5ldyBDb250cm9sRmxvd0xhYmVsRmlndXJlKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBjbGFzcyBDb250cm9sRmxvd0xhYmVsRmlndXJlIGV4dGVuZHMgV3JhcExhYmVsIHsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIENvbnRyb2xGbG93TGFiZWxGaWd1cmUoKSB7Ci0KLQkJCXRoaXMuc2V0VGV4dCgiIik7CQkvLyROT04tTkxTLTEkCi0JCQljcmVhdGVDb250ZW50cygpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgdm9pZCBjcmVhdGVDb250ZW50cygpIHsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIGJvb2xlYW4gbXlVc2VMb2NhbENvb3JkaW5hdGVzID0gZmFsc2U7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByb3RlY3RlZCBib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMoKSB7Ci0JCQlyZXR1cm4gbXlVc2VMb2NhbENvb3JkaW5hdGVzOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByb3RlY3RlZCB2b2lkIHNldFVzZUxvY2FsQ29vcmRpbmF0ZXMoYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKSB7Ci0JCQlteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSB1c2VMb2NhbENvb3JkaW5hdGVzOwotCQl9Ci0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BhcnRzL0RlY2lzaW9uTm9kZUVkaXRQYXJ0LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wYXJ0cy9EZWNpc2lvbk5vZGVFZGl0UGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMGI5OWQzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BhcnRzL0RlY2lzaW9uTm9kZUVkaXRQYXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMjIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Db2xvckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuU3RhY2tMYXlvdXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuY3VzdG9tLmZpZ3VyZXMuRGVjaXNpb25Ob2RlRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucG9saWNpZXMuRGVjaXNpb25Ob2RlQ2Fub25pY2FsRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBvbGljaWVzLkRlY2lzaW9uTm9kZUdyYXBoaWNhbE5vZGVFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucG9saWNpZXMuRGVjaXNpb25Ob2RlSXRlbVNlbWFudGljRWRpdFBvbGljeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnBhcnQuVU1MVmlzdWFsSURSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnV0aWwuRGlhZ3JhbUNvbnN0YW50czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5MYXlvdXRFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuTm9uUmVzaXphYmxlRWRpdFBvbGljeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5yZXF1ZXN0cy5DcmVhdGVSZXF1ZXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuU2hhcGVOb2RlRWRpdFBhcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5FZGl0UG9saWN5Um9sZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5sMTBuLkRpYWdyYW1Db2xvclJlZ2lzdHJ5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuQ29uc3RyYWluZWRUb29sYmFyTGF5b3V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmdlZi51aS5maWd1cmVzLkRlZmF1bHRTaXplTm9kZUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5nZWYudWkuZmlndXJlcy5Ob2RlRmlndXJlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRmlsbFN0eWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkxpbmVTdHlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob3RhdGlvblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRGVjaXNpb25Ob2RlRWRpdFBhcnQgZXh0ZW5kcyBTaGFwZU5vZGVFZGl0UGFydCB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVklTVUFMX0lEID0gMTAwNTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBjb250ZW50UGFuZTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBwcmltYXJ5U2hhcGU7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERlY2lzaW9uTm9kZUVkaXRQYXJ0KFZpZXcgdmlldykgewotCQlzdXBlcih2aWV3KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpIHsKLQotCQlzdXBlci5jcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5TRU1BTlRJQ19ST0xFLAotCQkJCW5ldyBEZWNpc2lvbk5vZGVJdGVtU2VtYW50aWNFZGl0UG9saWN5KCkpOwotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LkxBWU9VVF9ST0xFLCBjcmVhdGVMYXlvdXRFZGl0UG9saWN5KCkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTGF5b3V0RWRpdFBvbGljeSBjcmVhdGVMYXlvdXRFZGl0UG9saWN5KCkgewotCQlMYXlvdXRFZGl0UG9saWN5IGxlcCA9IG5ldyBMYXlvdXRFZGl0UG9saWN5KCkgewotCi0JCQlwcm90ZWN0ZWQgRWRpdFBvbGljeSBjcmVhdGVDaGlsZEVkaXRQb2xpY3koRWRpdFBhcnQgY2hpbGQpIHsKLQkJCQlFZGl0UG9saWN5IHJlc3VsdCA9IGNoaWxkCi0JCQkJCQkuZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHsKLQkJCQkJcmVzdWx0ID0gbmV3IE5vblJlc2l6YWJsZUVkaXRQb2xpY3koKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQotCQkJcHJvdGVjdGVkIENvbW1hbmQgZ2V0TW92ZUNoaWxkcmVuQ29tbWFuZChSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQotCQkJcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlQ29tbWFuZChDcmVhdGVSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJfTsKLQkJcmV0dXJuIGxlcDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlTm9kZVNoYXBlKCkgewotCQlEZWNpc2lvbkRpYW1vbmRGaWd1cmUgZmlndXJlID0gbmV3IERlY2lzaW9uRGlhbW9uZEZpZ3VyZSgpOwotCQlyZXR1cm4gcHJpbWFyeVNoYXBlID0gZmlndXJlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRGVjaXNpb25EaWFtb25kRmlndXJlIGdldFByaW1hcnlTaGFwZSgpIHsKLQkJcmV0dXJuIChEZWNpc2lvbkRpYW1vbmRGaWd1cmUpIHByaW1hcnlTaGFwZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE5vZGVGaWd1cmUgY3JlYXRlTm9kZVBsYXRlKCkgewotCQlEZWZhdWx0U2l6ZU5vZGVGaWd1cmUgcmVzdWx0ID0gbmV3IERlZmF1bHRTaXplTm9kZUZpZ3VyZShnZXRNYXBNb2RlKCkKLQkJCQkuRFB0b0xQKDQwKSwgZ2V0TWFwTW9kZSgpLkRQdG9MUCg0MCkpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgZmlndXJlIGZvciB0aGlzIGVkaXQgcGFydC4KLQkgKiAKLQkgKiBCb2R5IG9mIHRoaXMgbWV0aG9kIGRvZXMgbm90IGRlcGVuZCBvbiBzZXR0aW5ncyBpbiBnZW5lcmF0aW9uIG1vZGVsCi0JICogc28geW91IG1heSBzYWZlbHkgcmVtb3ZlIDxpPmdlbmVyYXRlZDwvaT4gdGFnIGFuZCBtb2RpZnkgaXQuCi0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBOb2RlRmlndXJlIGNyZWF0ZU5vZGVGaWd1cmUoKSB7Ci0JCU5vZGVGaWd1cmUgZmlndXJlID0gY3JlYXRlTm9kZVBsYXRlKCk7Ci0JCWZpZ3VyZS5zZXRMYXlvdXRNYW5hZ2VyKG5ldyBTdGFja0xheW91dCgpKTsKLQkJSUZpZ3VyZSBzaGFwZSA9IGNyZWF0ZU5vZGVTaGFwZSgpOwotCQlmaWd1cmUuYWRkKHNoYXBlKTsKLQkJY29udGVudFBhbmUgPSBzZXR1cENvbnRlbnRQYW5lKHNoYXBlKTsKLQkJcmV0dXJuIGZpZ3VyZTsKLQl9Ci0KLQkvKioKLQkgKiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIHRyZWF0cyBwYXNzZWQgZmlndXJlIGFzIGNvbnRlbnQgcGFuZS4KLQkgKiBSZXNwZWN0cyBsYXlvdXQgb25lIG1heSBoYXZlIHNldCBmb3IgZ2VuZXJhdGVkIGZpZ3VyZS4KLQkgKiBAcGFyYW0gbm9kZVNoYXBlIGluc3RhbmNlIG9mIGdlbmVyYXRlZCBmaWd1cmUgY2xhc3MKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgc2V0dXBDb250ZW50UGFuZShJRmlndXJlIG5vZGVTaGFwZSkgewotCQlpZiAobm9kZVNoYXBlLmdldExheW91dE1hbmFnZXIoKSA9PSBudWxsKSB7Ci0JCQlDb25zdHJhaW5lZFRvb2xiYXJMYXlvdXQgbGF5b3V0ID0gbmV3IENvbnN0cmFpbmVkVG9vbGJhckxheW91dCgpOwotCQkJbGF5b3V0LnNldFNwYWNpbmcoZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSk7Ci0JCQlub2RlU2hhcGUuc2V0TGF5b3V0TWFuYWdlcihsYXlvdXQpOwotCQl9Ci0JCXJldHVybiBub2RlU2hhcGU7IC8vIHVzZSBub2RlU2hhcGUgaXRzZWxmIGFzIGNvbnRlbnRQYW5lCi0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJRmlndXJlIGdldENvbnRlbnRQYW5lKCkgewotCQlpZiAoY29udGVudFBhbmUgIT0gbnVsbCkgewotCQkJcmV0dXJuIGNvbnRlbnRQYW5lOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRDb250ZW50UGFuZSgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRWRpdFBhcnQgZ2V0UHJpbWFyeUNoaWxkRWRpdFBhcnQoKSB7Ci0JCXJldHVybiBnZXRDaGlsZEJ5U2VtYW50aWNIaW50KFVNTFZpc3VhbElEUmVnaXN0cnkKLQkJCQkuZ2V0VHlwZShEZWNpc2lvbk5vZGVOYW1lRWRpdFBhcnQuVklTVUFMX0lEKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBjbGFzcyBEZWNpc2lvbkRpYW1vbmRGaWd1cmUgZXh0ZW5kcyBEZWNpc2lvbk5vZGVGaWd1cmUgewotCi0JCS8qKgotCQkgKiBAbW9kaWZpZWQKLQkJICovCi0JCXB1YmxpYyBEZWNpc2lvbkRpYW1vbmRGaWd1cmUoKSB7Ci0KLQkJCXN1cGVyKGdldE1hcE1vZGUoKS5EUHRvTFAoNTApLCBnZXRNYXBNb2RlKCkuRFB0b0xQKDUwKSwKLQkJCQkJZ2V0TWFwTW9kZSgpLkRQdG9MUCg1MCkpOyAvL21vZGlmaWVkCi0JCQlMaW5lU3R5bGUgbGluZXN0eWxlID0gKExpbmVTdHlsZSkgZ2V0UHJpbWFyeVZpZXcoKS5nZXRTdHlsZSgKLQkJCQkJTm90YXRpb25QYWNrYWdlLkxpdGVyYWxzLkxJTkVfU1RZTEUpOwotCQkJaWYgKGxpbmVzdHlsZSAhPSBudWxsCi0JCQkJCSYmIGxpbmVzdHlsZS5nZXRMaW5lQ29sb3IoKSAhPSBEaWFncmFtQ29uc3RhbnRzLkxJTkVfQ09MT1JfRURFRkFVTFQpIHsKLQkJCQl0aGlzLnNldEZvcmVncm91bmRDb2xvcihEaWFncmFtQ29sb3JSZWdpc3RyeS5nZXRJbnN0YW5jZSgpCi0JCQkJCQkuZ2V0Q29sb3IobmV3IEludGVnZXIobGluZXN0eWxlLmdldExpbmVDb2xvcigpKSkpOwotCQkJfSBlbHNlIHsKLQkJCQl0aGlzCi0JCQkJCQkuc2V0Rm9yZWdyb3VuZENvbG9yKG9yZy5lY2xpcHNlLmRyYXcyZC5Db2xvckNvbnN0YW50cy5kYXJrQmx1ZSk7Ci0JCQl9Ci0KLQkJCUZpbGxTdHlsZSBzdHlsZSA9IChGaWxsU3R5bGUpIGdldFByaW1hcnlWaWV3KCkuZ2V0U3R5bGUoCi0JCQkJCU5vdGF0aW9uUGFja2FnZS5MaXRlcmFscy5GSUxMX1NUWUxFKTsKLQkJCWlmIChzdHlsZSAhPSBudWxsCi0JCQkJCSYmIHN0eWxlLmdldEZpbGxDb2xvcigpICE9IERpYWdyYW1Db25zdGFudHMuRklMTF9DT0xPUl9FREVGQVVMVCkgewotCQkJCXRoaXMuc2V0QmFja2dyb3VuZENvbG9yKERpYWdyYW1Db2xvclJlZ2lzdHJ5LmdldEluc3RhbmNlKCkKLQkJCQkJCS5nZXRDb2xvcihuZXcgSW50ZWdlcihzdHlsZS5nZXRGaWxsQ29sb3IoKSkpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJdGhpcy5zZXRCYWNrZ3JvdW5kQ29sb3IoREVDSVNJT05ESUFNT05ERklHVVJFX0JBQ0spOwotCQkJfQotCQkJdGhpcy5zZXRQcmVmZXJyZWRTaXplKGdldE1hcE1vZGUoKS5EUHRvTFAoNTApLCBnZXRNYXBNb2RlKCkuRFB0b0xQKAotCQkJCQk1MCkpOwotCQkJdGhpcy5zZXRTaXplKGdldE1hcE1vZGUoKS5EUHRvTFAoNTApLCBnZXRNYXBNb2RlKCkuRFB0b0xQKDUwKSk7Ci0KLQkJCWNyZWF0ZUNvbnRlbnRzKCk7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbnRlbnRzKCkgewotCQkJV3JhcExhYmVsIGZpZ18wID0gbmV3IFdyYXBMYWJlbCgpOwotCi0JCQlzZXRGaWd1cmVEaWFtb25kTGFiZWwoZmlnXzApOwotCi0JCQlPYmplY3QgbGF5RGF0YTAgPSBudWxsOwotCi0JCQl0aGlzLmFkZChmaWdfMCwgbGF5RGF0YTApOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgV3JhcExhYmVsIGZEaWFtb25kTGFiZWw7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBXcmFwTGFiZWwgZ2V0RmlndXJlRGlhbW9uZExhYmVsKCkgewotCQkJcmV0dXJuIGZEaWFtb25kTGFiZWw7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSB2b2lkIHNldEZpZ3VyZURpYW1vbmRMYWJlbChXcmFwTGFiZWwgZmlnKSB7Ci0JCQlmRGlhbW9uZExhYmVsID0gZmlnOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgYm9vbGVhbiBteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSBmYWxzZTsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJvdGVjdGVkIGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcygpIHsKLQkJCXJldHVybiBteVVzZUxvY2FsQ29vcmRpbmF0ZXM7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJvdGVjdGVkIHZvaWQgc2V0VXNlTG9jYWxDb29yZGluYXRlcyhib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMpIHsKLQkJCW15VXNlTG9jYWxDb29yZGluYXRlcyA9IHVzZUxvY2FsQ29vcmRpbmF0ZXM7Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENvbG9yIERFQ0lTSU9ORElBTU9OREZJR1VSRV9CQUNLID0gbmV3IENvbG9yKG51bGwsIDE4NSwKLQkJCTIwNSwgMjMwKTsKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGhhbmRsZU5vdGlmaWNhdGlvbkV2ZW50KE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlPYmplY3QgZmVhdHVyZSA9IG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlKCk7Ci0JCWlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldFNpemVfV2lkdGgoKS5lcXVhbHMoZmVhdHVyZSkKLQkJCQl8fCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldFNpemVfSGVpZ2h0KCkuZXF1YWxzKGZlYXR1cmUpCi0JCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRMb2NhdGlvbl9YKCkuZXF1YWxzKGZlYXR1cmUpCi0JCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRMb2NhdGlvbl9ZKCkuZXF1YWxzKGZlYXR1cmUpKSB7Ci0JCQlyZWZyZXNoQm91bmRzKCk7Ci0JCX0gZWxzZSBpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGaWxsU3R5bGVfRmlsbENvbG9yKCkuZXF1YWxzKAotCQkJCWZlYXR1cmUpKSB7Ci0JCQlJbnRlZ2VyIGMgPSAoSW50ZWdlcikgbm90aWZpY2F0aW9uLmdldE5ld1ZhbHVlKCk7Ci0JCQlzZXRCYWNrZ3JvdW5kQ29sb3IoRGlhZ3JhbUNvbG9yUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXRDb2xvcihjKSk7Ci0JCQlnZXRQcmltYXJ5U2hhcGUoKS5zZXRCYWNrZ3JvdW5kQ29sb3IoCi0JCQkJCURpYWdyYW1Db2xvclJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0Q29sb3IoYykpOwotCQl9IGVsc2UgaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TGluZVN0eWxlX0xpbmVDb2xvcigpLmVxdWFscygKLQkJCQlmZWF0dXJlKSkgewotCQkJSW50ZWdlciBjID0gKEludGVnZXIpIG5vdGlmaWNhdGlvbi5nZXROZXdWYWx1ZSgpOwotCQkJc2V0Rm9yZWdyb3VuZENvbG9yKERpYWdyYW1Db2xvclJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0Q29sb3IoYykpOwotCQkJZ2V0UHJpbWFyeVNoYXBlKCkuc2V0Rm9yZWdyb3VuZENvbG9yKAotCQkJCQlEaWFncmFtQ29sb3JSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldENvbG9yKGMpKTsKLQkJfSBlbHNlIGlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZSgpLmlzSW5zdGFuY2UoCi0JCQkJbm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCkpKQotCQkJcmVmcmVzaEZvbnQoKTsKLQkJZWxzZSBpZiAobm90aWZpY2F0aW9uLmdldEZlYXR1cmUoKSA9PSBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldFZpZXdfRWxlbWVudCgpCi0JCQkJJiYgKChFT2JqZWN0KSBub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKSkgPT0gZ2V0Tm90YXRpb25WaWV3KCkpCi0JCQloYW5kbGVNYWpvclNlbWFudGljQ2hhbmdlKCk7Ci0JCWVsc2UKLQkJCXN1cGVyLmhhbmRsZU5vdGlmaWNhdGlvbkV2ZW50KG5vdGlmaWNhdGlvbik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcGFydHMvRGVjaXNpb25Ob2RlTmFtZUVkaXRQYXJ0LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wYXJ0cy9EZWNpc2lvbk5vZGVOYW1lRWRpdFBhcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmZmMWY5NS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wYXJ0cy9EZWNpc2lvbk5vZGVOYW1lRWRpdFBhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuR3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5Ob25SZXNpemFibGVFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5oYW5kbGVzLk5vblJlc2l6YWJsZUhhbmRsZUtpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JVGV4dEF3YXJlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuTGFiZWxEaXJlY3RFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkxhYmVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uUnVubmFibGVXaXRoUmVzdWx0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wb2xpY2llcy5VTUxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnByb3ZpZGVycy5VTUxFbGVtZW50VHlwZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS51dGlsLkRpYWdyYW1Db25zdGFudHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuQWNjZXNzaWJsZUVkaXRQYXJ0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLkRpcmVjdEVkaXRSZXF1ZXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnRvb2xzLkRpcmVjdEVkaXRNYW5hZ2VyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5JUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuSVBhcnNlckVkaXRTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5QYXJzZXJFZGl0U3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuUGFyc2VyT3B0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLlBhcnNlclNlcnZpY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5Db21wYXJ0bWVudEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklHcmFwaGljYWxFZGl0UGFydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkubDEwbi5EaWFncmFtQ29sb3JSZWdpc3RyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVxdWVzdHMuUmVxdWVzdENvbnN0YW50czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkudG9vbHMuVGV4dERpcmVjdEVkaXRNYW5hZ2VyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvcmUudXRpbC5FT2JqZWN0QWRhcHRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuSUVsZW1lbnRUeXBlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnVpLnNlcnZpY2VzLnBhcnNlci5JU2VtYW50aWNQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnVpLnNlcnZpY2VzLnBhcnNlci5QYXJzZXJIaW50QWRhcHRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkZvbnRTdHlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob3RhdGlvblBhY2thZ2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDZWxsRWRpdG9yVmFsaWRhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2libGVFdmVudDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERlY2lzaW9uTm9kZU5hbWVFZGl0UGFydCBleHRlbmRzIENvbXBhcnRtZW50RWRpdFBhcnQgaW1wbGVtZW50cwotCQlJVGV4dEF3YXJlRWRpdFBhcnQgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZJU1VBTF9JRCA9IDQwMDQ7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBEaXJlY3RFZGl0TWFuYWdlciBtYW5hZ2VyOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgSVBhcnNlciBwYXJzZXI7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBMaXN0IHBhcnNlckVsZW1lbnRzOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgU3RyaW5nIGRlZmF1bHRUZXh0OwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEZWNpc2lvbk5vZGVOYW1lRWRpdFBhcnQoVmlldyB2aWV3KSB7Ci0JCXN1cGVyKHZpZXcpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCkgewotCQlzdXBlci5jcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuRElSRUNUX0VESVRfUk9MRSwKLQkJCQluZXcgTGFiZWxEaXJlY3RFZGl0UG9saWN5KCkpOwotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFLAotCQkJCW5ldyBOb25SZXNpemFibGVFZGl0UG9saWN5KCkgewotCi0JCQkJCXByb3RlY3RlZCBMaXN0IGNyZWF0ZVNlbGVjdGlvbkhhbmRsZXMoKSB7Ci0JCQkJCQlMaXN0IGhhbmRsZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCQlOb25SZXNpemFibGVIYW5kbGVLaXQuYWRkTW92ZUhhbmRsZSgKLQkJCQkJCQkJKEdyYXBoaWNhbEVkaXRQYXJ0KSBnZXRIb3N0KCksIGhhbmRsZXMpOwotCQkJCQkJcmV0dXJuIGhhbmRsZXM7Ci0JCQkJCX0KLQotCQkJCQlwdWJsaWMgQ29tbWFuZCBnZXRDb21tYW5kKFJlcXVlc3QgcmVxdWVzdCkgewotCQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJCX0KLQotCQkJCQlwdWJsaWMgYm9vbGVhbiB1bmRlcnN0YW5kc1JlcXVlc3QoUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCX0KLQkJCQl9KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRMYWJlbFRleHRIZWxwZXIoSUZpZ3VyZSBmaWd1cmUpIHsKLQkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJcmV0dXJuICgoV3JhcExhYmVsKSBmaWd1cmUpLmdldFRleHQoKTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiAoKExhYmVsKSBmaWd1cmUpLmdldFRleHQoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRMYWJlbFRleHRIZWxwZXIoSUZpZ3VyZSBmaWd1cmUsIFN0cmluZyB0ZXh0KSB7Ci0JCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCSgoV3JhcExhYmVsKSBmaWd1cmUpLnNldFRleHQodGV4dCk7Ci0JCX0gZWxzZSB7Ci0JCQkoKExhYmVsKSBmaWd1cmUpLnNldFRleHQodGV4dCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEltYWdlIGdldExhYmVsSWNvbkhlbHBlcihJRmlndXJlIGZpZ3VyZSkgewotCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQlyZXR1cm4gKChXcmFwTGFiZWwpIGZpZ3VyZSkuZ2V0SWNvbigpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuICgoTGFiZWwpIGZpZ3VyZSkuZ2V0SWNvbigpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldExhYmVsSWNvbkhlbHBlcihJRmlndXJlIGZpZ3VyZSwgSW1hZ2UgaWNvbikgewotCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQkoKFdyYXBMYWJlbCkgZmlndXJlKS5zZXRJY29uKGljb24pOwotCQl9IGVsc2UgewotCQkJKChMYWJlbCkgZmlndXJlKS5zZXRJY29uKGljb24pOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExhYmVsKElGaWd1cmUgZmlndXJlKSB7Ci0JCXVucmVnaXN0ZXJWaXN1YWxzKCk7Ci0JCXNldEZpZ3VyZShmaWd1cmUpOwotCQlkZWZhdWx0VGV4dCA9IGdldExhYmVsVGV4dEhlbHBlcihmaWd1cmUpOwotCQlyZWdpc3RlclZpc3VhbHMoKTsKLQkJcmVmcmVzaFZpc3VhbHMoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIExpc3QgZ2V0TW9kZWxDaGlsZHJlbigpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJR3JhcGhpY2FsRWRpdFBhcnQgZ2V0Q2hpbGRCeVNlbWFudGljSGludChTdHJpbmcgc2VtYW50aWNIaW50KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRU9iamVjdCBnZXRQYXJzZXJFbGVtZW50KCkgewotCQlFT2JqZWN0IGVsZW1lbnQgPSByZXNvbHZlU2VtYW50aWNFbGVtZW50KCk7Ci0JCXJldHVybiBlbGVtZW50ICE9IG51bGwgPyBlbGVtZW50IDogKFZpZXcpIGdldE1vZGVsKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJbWFnZSBnZXRMYWJlbEljb24oKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldExhYmVsVGV4dCgpIHsKLQkJU3RyaW5nIHRleHQgPSBudWxsOwotCQlpZiAoZ2V0UGFyc2VyKCkgIT0gbnVsbCkgewotCQkJdGV4dCA9IGdldFBhcnNlcigpLmdldFByaW50U3RyaW5nKAotCQkJCQluZXcgRU9iamVjdEFkYXB0ZXIoZ2V0UGFyc2VyRWxlbWVudCgpKSwKLQkJCQkJZ2V0UGFyc2VyT3B0aW9ucygpLmludFZhbHVlKCkpOwotCQl9Ci0JCWlmICh0ZXh0ID09IG51bGwgfHwgdGV4dC5sZW5ndGgoKSA9PSAwKSB7Ci0JCQl0ZXh0ID0gZGVmYXVsdFRleHQ7Ci0JCX0KLQkJcmV0dXJuIHRleHQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExhYmVsVGV4dChTdHJpbmcgdGV4dCkgewotCQlzZXRMYWJlbFRleHRIZWxwZXIoZ2V0RmlndXJlKCksIHRleHQpOwotCQlPYmplY3QgcGRFZGl0UG9saWN5ID0gZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFKTsKLQkJaWYgKHBkRWRpdFBvbGljeSBpbnN0YW5jZW9mIFVNTFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSB7Ci0JCQkoKFVNTFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSBwZEVkaXRQb2xpY3kpLnJlZnJlc2hGZWVkYmFjaygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RWRpdFRleHQoKSB7Ci0JCWlmIChnZXRQYXJzZXIoKSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gZ2V0UGFyc2VyKCkuZ2V0RWRpdFN0cmluZygKLQkJCQluZXcgRU9iamVjdEFkYXB0ZXIoZ2V0UGFyc2VyRWxlbWVudCgpKSwKLQkJCQlnZXRQYXJzZXJPcHRpb25zKCkuaW50VmFsdWUoKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzRWRpdGFibGUoKSB7Ci0JCXJldHVybiBnZXRQYXJzZXIoKSAhPSBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSUNlbGxFZGl0b3JWYWxpZGF0b3IgZ2V0RWRpdFRleHRWYWxpZGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgSUNlbGxFZGl0b3JWYWxpZGF0b3IoKSB7Ci0KLQkJCXB1YmxpYyBTdHJpbmcgaXNWYWxpZChmaW5hbCBPYmplY3QgdmFsdWUpIHsKLQkJCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpIHsKLQkJCQkJZmluYWwgRU9iamVjdCBlbGVtZW50ID0gZ2V0UGFyc2VyRWxlbWVudCgpOwotCQkJCQlmaW5hbCBJUGFyc2VyIHBhcnNlciA9IGdldFBhcnNlcigpOwotCQkJCQl0cnkgewotCQkJCQkJSVBhcnNlckVkaXRTdGF0dXMgdmFsaWQgPSAoSVBhcnNlckVkaXRTdGF0dXMpIGdldEVkaXRpbmdEb21haW4oKQotCQkJCQkJCQkucnVuRXhjbHVzaXZlKG5ldyBSdW5uYWJsZVdpdGhSZXN1bHQuSW1wbCgpIHsKLQotCQkJCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCQkJCXNldFJlc3VsdChwYXJzZXIuaXNWYWxpZEVkaXRTdHJpbmcoCi0JCQkJCQkJCQkJCQluZXcgRU9iamVjdEFkYXB0ZXIoZWxlbWVudCksCi0JCQkJCQkJCQkJCQkoU3RyaW5nKSB2YWx1ZSkpOwotCQkJCQkJCQkJfQotCQkJCQkJCQl9KTsKLQkJCQkJCXJldHVybiB2YWxpZC5nZXRDb2RlKCkgPT0gUGFyc2VyRWRpdFN0YXR1cy5FRElUQUJMRSA/IG51bGwKLQkJCQkJCQkJOiB2YWxpZC5nZXRNZXNzYWdlKCk7Ci0JCQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGllKSB7Ci0JCQkJCQlpZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQkJfQotCQkJCX0KLQotCQkJCS8vIHNob3VsZG4ndCBnZXQgaGVyZQotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IgZ2V0Q29tcGxldGlvblByb2Nlc3NvcigpIHsKLQkJaWYgKGdldFBhcnNlcigpID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiBnZXRQYXJzZXIoKS5nZXRDb21wbGV0aW9uUHJvY2Vzc29yKAotCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihnZXRQYXJzZXJFbGVtZW50KCkpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFBhcnNlck9wdGlvbnMgZ2V0UGFyc2VyT3B0aW9ucygpIHsKLQkJcmV0dXJuIFBhcnNlck9wdGlvbnMuTk9ORTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElQYXJzZXIgZ2V0UGFyc2VyKCkgewotCQlpZiAocGFyc2VyID09IG51bGwpIHsKLQkJCVN0cmluZyBwYXJzZXJIaW50ID0gKChWaWV3KSBnZXRNb2RlbCgpKS5nZXRUeXBlKCk7Ci0JCQlQYXJzZXJIaW50QWRhcHRlciBoaW50QWRhcHRlciA9IG5ldyBQYXJzZXJIaW50QWRhcHRlcigKLQkJCQkJZ2V0UGFyc2VyRWxlbWVudCgpLCBwYXJzZXJIaW50KSB7Ci0KLQkJCQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgYWRhcHRlcikgewotCQkJCQlpZiAoSUVsZW1lbnRUeXBlLmNsYXNzLmVxdWFscyhhZGFwdGVyKSkgewotCQkJCQkJcmV0dXJuIFVNTEVsZW1lbnRUeXBlcy5EZWNpc2lvbk5vZGVfMTAwNTsKLQkJCQkJfQotCQkJCQlyZXR1cm4gc3VwZXIuZ2V0QWRhcHRlcihhZGFwdGVyKTsKLQkJCQl9Ci0JCQl9OwotCQkJcGFyc2VyID0gUGFyc2VyU2VydmljZS5nZXRJbnN0YW5jZSgpLmdldFBhcnNlcihoaW50QWRhcHRlcik7Ci0JCX0KLQkJcmV0dXJuIHBhcnNlcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIERpcmVjdEVkaXRNYW5hZ2VyIGdldE1hbmFnZXIoKSB7Ci0JCWlmIChtYW5hZ2VyID09IG51bGwpIHsKLQkJCXNldE1hbmFnZXIobmV3IFRleHREaXJlY3RFZGl0TWFuYWdlcih0aGlzLCBUZXh0RGlyZWN0RWRpdE1hbmFnZXIKLQkJCQkJLmdldFRleHRDZWxsRWRpdG9yQ2xhc3ModGhpcyksIFVNTEVkaXRQYXJ0RmFjdG9yeQotCQkJCQkuZ2V0VGV4dENlbGxFZGl0b3JMb2NhdG9yKHRoaXMpKSk7Ci0JCX0KLQkJcmV0dXJuIG1hbmFnZXI7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldE1hbmFnZXIoRGlyZWN0RWRpdE1hbmFnZXIgbWFuYWdlcikgewotCQl0aGlzLm1hbmFnZXIgPSBtYW5hZ2VyOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdCgpIHsKLQkJZ2V0TWFuYWdlcigpLnNob3coKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURpcmVjdEVkaXQoUG9pbnQgZXZlbnRMb2NhdGlvbikgewotCQlpZiAoZ2V0TWFuYWdlcigpLmdldENsYXNzKCkgPT0gVGV4dERpcmVjdEVkaXRNYW5hZ2VyLmNsYXNzKSB7Ci0JCQkoKFRleHREaXJlY3RFZGl0TWFuYWdlcikgZ2V0TWFuYWdlcigpKS5zaG93KGV2ZW50TG9jYXRpb24KLQkJCQkJLmdldFNXVFBvaW50KCkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdChjaGFyIGluaXRpYWxDaGFyYWN0ZXIpIHsKLQkJaWYgKGdldE1hbmFnZXIoKSBpbnN0YW5jZW9mIFRleHREaXJlY3RFZGl0TWFuYWdlcikgewotCQkJKChUZXh0RGlyZWN0RWRpdE1hbmFnZXIpIGdldE1hbmFnZXIoKSkuc2hvdyhpbml0aWFsQ2hhcmFjdGVyKTsKLQkJfSBlbHNlIHsKLQkJCXBlcmZvcm1EaXJlY3RFZGl0KCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURpcmVjdEVkaXRSZXF1ZXN0KFJlcXVlc3QgcmVxdWVzdCkgewotCQlmaW5hbCBSZXF1ZXN0IHRoZVJlcXVlc3QgPSByZXF1ZXN0OwotCQl0cnkgewotCQkJZ2V0RWRpdGluZ0RvbWFpbigpLnJ1bkV4Y2x1c2l2ZShuZXcgUnVubmFibGUoKSB7Ci0KLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCWlmIChpc0FjdGl2ZSgpICYmIGlzRWRpdGFibGUoKSkgewotCQkJCQkJaWYgKHRoZVJlcXVlc3QKLQkJCQkJCQkJLmdldEV4dGVuZGVkRGF0YSgpCi0JCQkJCQkJCS5nZXQoCi0JCQkJCQkJCQkJUmVxdWVzdENvbnN0YW50cy5SRVFfRElSRUNURURJVF9FWFRFTkRFRERBVEFfSU5JVElBTF9DSEFSKSBpbnN0YW5jZW9mIENoYXJhY3RlcikgewotCQkJCQkJCUNoYXJhY3RlciBpbml0aWFsQ2hhciA9IChDaGFyYWN0ZXIpIHRoZVJlcXVlc3QKLQkJCQkJCQkJCS5nZXRFeHRlbmRlZERhdGEoKQotCQkJCQkJCQkJLmdldCgKLQkJCQkJCQkJCQkJUmVxdWVzdENvbnN0YW50cy5SRVFfRElSRUNURURJVF9FWFRFTkRFRERBVEFfSU5JVElBTF9DSEFSKTsKLQkJCQkJCQlwZXJmb3JtRGlyZWN0RWRpdChpbml0aWFsQ2hhci5jaGFyVmFsdWUoKSk7Ci0JCQkJCQl9IGVsc2UgaWYgKCh0aGVSZXF1ZXN0IGluc3RhbmNlb2YgRGlyZWN0RWRpdFJlcXVlc3QpCi0JCQkJCQkJCSYmIChnZXRFZGl0VGV4dCgpLmVxdWFscyhnZXRMYWJlbFRleHQoKSkpKSB7Ci0JCQkJCQkJRGlyZWN0RWRpdFJlcXVlc3QgZWRpdFJlcXVlc3QgPSAoRGlyZWN0RWRpdFJlcXVlc3QpIHRoZVJlcXVlc3Q7Ci0JCQkJCQkJcGVyZm9ybURpcmVjdEVkaXQoZWRpdFJlcXVlc3QuZ2V0TG9jYXRpb24oKSk7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCXBlcmZvcm1EaXJlY3RFZGl0KCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9KTsKLQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoVmlzdWFscygpIHsKLQkJc3VwZXIucmVmcmVzaFZpc3VhbHMoKTsKLQkJcmVmcmVzaExhYmVsKCk7Ci0JCXJlZnJlc2hGb250KCk7Ci0JCXJlZnJlc2hGb250Q29sb3IoKTsKLQkJcmVmcmVzaFVuZGVybGluZSgpOwotCQlyZWZyZXNoU3RyaWtlVGhyb3VnaCgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoTGFiZWwoKSB7Ci0JCXNldExhYmVsVGV4dEhlbHBlcihnZXRGaWd1cmUoKSwgZ2V0TGFiZWxUZXh0KCkpOwotCQlzZXRMYWJlbEljb25IZWxwZXIoZ2V0RmlndXJlKCksIGdldExhYmVsSWNvbigpKTsKLQkJT2JqZWN0IHBkRWRpdFBvbGljeSA9IGdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSk7Ci0JCWlmIChwZEVkaXRQb2xpY3kgaW5zdGFuY2VvZiBVTUxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgewotCQkJKChVTUxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgcGRFZGl0UG9saWN5KS5yZWZyZXNoRmVlZGJhY2soKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoVW5kZXJsaW5lKCkgewotCQlGb250U3R5bGUgc3R5bGUgPSAoRm9udFN0eWxlKSBnZXRGb250U3R5bGVPd25lclZpZXcoKS5nZXRTdHlsZSgKLQkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZSgpKTsKLQkJaWYgKHN0eWxlICE9IG51bGwgJiYgZ2V0RmlndXJlKCkgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCSgoV3JhcExhYmVsKSBnZXRGaWd1cmUoKSkuc2V0VGV4dFVuZGVybGluZShzdHlsZS5pc1VuZGVybGluZSgpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoU3RyaWtlVGhyb3VnaCgpIHsKLQkJRm9udFN0eWxlIHN0eWxlID0gKEZvbnRTdHlsZSkgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkuZ2V0U3R5bGUoCi0JCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGUoKSk7Ci0JCWlmIChzdHlsZSAhPSBudWxsICYmIGdldEZpZ3VyZSgpIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQkoKFdyYXBMYWJlbCkgZ2V0RmlndXJlKCkpLnNldFRleHRTdHJpa2VUaHJvdWdoKHN0eWxlCi0JCQkJCS5pc1N0cmlrZVRocm91Z2goKSk7Ci0JCX0KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoRm9udCgpIHsKLQkJRm9udFN0eWxlIHN0eWxlID0gKEZvbnRTdHlsZSkgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkuZ2V0U3R5bGUoCi0JCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGUoKSk7Ci0JCWlmIChzdHlsZSAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgZm9udE5hbWUgPSBEaWFncmFtQ29uc3RhbnRzLmdldEZvbnROYW1lKHN0eWxlKTsKLQkJCUZvbnREYXRhIGZvbnREYXRhID0gbmV3IEZvbnREYXRhKGZvbnROYW1lLCBzdHlsZQotCQkJCQkuZ2V0Rm9udEhlaWdodCgpLCAoc3R5bGUuaXNCb2xkKCkgPyBTV1QuQk9MRCA6IFNXVC5OT1JNQUwpCi0JCQkJCXwgKHN0eWxlLmlzSXRhbGljKCkgPyBTV1QuSVRBTElDIDogU1dULk5PUk1BTCkpOwotCQkJc2V0Rm9udChmb250RGF0YSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0Rm9udENvbG9yKENvbG9yIGNvbG9yKSB7Ci0JCWdldEZpZ3VyZSgpLnNldEZvcmVncm91bmRDb2xvcihjb2xvcik7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFNlbWFudGljTGlzdGVuZXJzKCkgewotCQlpZiAoZ2V0UGFyc2VyKCkgaW5zdGFuY2VvZiBJU2VtYW50aWNQYXJzZXIpIHsKLQkJCUVPYmplY3QgZWxlbWVudCA9IHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKTsKLQkJCXBhcnNlckVsZW1lbnRzID0gKChJU2VtYW50aWNQYXJzZXIpIGdldFBhcnNlcigpKQotCQkJCQkuZ2V0U2VtYW50aWNFbGVtZW50c0JlaW5nUGFyc2VkKGVsZW1lbnQpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJzZXJFbGVtZW50cy5zaXplKCk7IGkrKykgewotCQkJCWFkZExpc3RlbmVyRmlsdGVyKAotCQkJCQkJIlNlbWFudGljTW9kZWwiICsgaSwgdGhpcywgKEVPYmplY3QpIHBhcnNlckVsZW1lbnRzLmdldChpKSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXN1cGVyLmFkZFNlbWFudGljTGlzdGVuZXJzKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlU2VtYW50aWNMaXN0ZW5lcnMoKSB7Ci0JCWlmIChwYXJzZXJFbGVtZW50cyAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcnNlckVsZW1lbnRzLnNpemUoKTsgaSsrKSB7Ci0JCQkJcmVtb3ZlTGlzdGVuZXJGaWx0ZXIoIlNlbWFudGljTW9kZWwiICsgaSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXN1cGVyLnJlbW92ZVNlbWFudGljTGlzdGVuZXJzKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEFjY2Vzc2libGVFZGl0UGFydCBnZXRBY2Nlc3NpYmxlRWRpdFBhcnQoKSB7Ci0JCWlmIChhY2Nlc3NpYmxlRVAgPT0gbnVsbCkgewotCQkJYWNjZXNzaWJsZUVQID0gbmV3IEFjY2Vzc2libGVHcmFwaGljYWxFZGl0UGFydCgpIHsKLQotCQkJCXB1YmxpYyB2b2lkIGdldE5hbWUoQWNjZXNzaWJsZUV2ZW50IGUpIHsKLQkJCQkJZS5yZXN1bHQgPSBnZXRMYWJlbFRleHRIZWxwZXIoZ2V0RmlndXJlKCkpOwotCQkJCX0KLQkJCX07Ci0JCX0KLQkJcmV0dXJuIGFjY2Vzc2libGVFUDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBWaWV3IGdldEZvbnRTdHlsZU93bmVyVmlldygpIHsKLQkJcmV0dXJuIGdldFByaW1hcnlWaWV3KCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZE5vdGF0aW9uYWxMaXN0ZW5lcnMoKSB7Ci0JCXN1cGVyLmFkZE5vdGF0aW9uYWxMaXN0ZW5lcnMoKTsKLQkJYWRkTGlzdGVuZXJGaWx0ZXIoIlByaW1hcnlWaWV3IiwgdGhpcywgZ2V0UHJpbWFyeVZpZXcoKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlTm90YXRpb25hbExpc3RlbmVycygpIHsKLQkJc3VwZXIucmVtb3ZlTm90YXRpb25hbExpc3RlbmVycygpOwotCQlyZW1vdmVMaXN0ZW5lckZpbHRlcigiUHJpbWFyeVZpZXciKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVOb3RpZmljYXRpb25FdmVudChOb3RpZmljYXRpb24gZXZlbnQpIHsKLQkJT2JqZWN0IGZlYXR1cmUgPSBldmVudC5nZXRGZWF0dXJlKCk7Ci0JCWlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Gb250Q29sb3IoKS5lcXVhbHMoZmVhdHVyZSkpIHsKLQkJCUludGVnZXIgYyA9IChJbnRlZ2VyKSBldmVudC5nZXROZXdWYWx1ZSgpOwotCQkJc2V0Rm9udENvbG9yKERpYWdyYW1Db2xvclJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0Q29sb3IoYykpOwotCQl9IGVsc2UgaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX1VuZGVybGluZSgpLmVxdWFscygKLQkJCQlmZWF0dXJlKSkgewotCQkJcmVmcmVzaFVuZGVybGluZSgpOwotCQl9IGVsc2UgaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX1N0cmlrZVRocm91Z2goKQotCQkJCS5lcXVhbHMoZmVhdHVyZSkpIHsKLQkJCXJlZnJlc2hTdHJpa2VUaHJvdWdoKCk7Ci0JCX0gZWxzZSBpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfRm9udEhlaWdodCgpLmVxdWFscygKLQkJCQlmZWF0dXJlKQotCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0ZvbnROYW1lKCkuZXF1YWxzKAotCQkJCQkJZmVhdHVyZSkKLQkJCQl8fCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Cb2xkKCkKLQkJCQkJCS5lcXVhbHMoZmVhdHVyZSkKLQkJCQl8fCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9JdGFsaWMoKS5lcXVhbHMoCi0JCQkJCQlmZWF0dXJlKSkgewotCQkJcmVmcmVzaEZvbnQoKTsKLQkJfSBlbHNlIHsKLQkJCWlmIChnZXRQYXJzZXIoKSAhPSBudWxsCi0JCQkJCSYmIGdldFBhcnNlcigpLmlzQWZmZWN0aW5nRXZlbnQoZXZlbnQsCi0JCQkJCQkJZ2V0UGFyc2VyT3B0aW9ucygpLmludFZhbHVlKCkpKSB7Ci0JCQkJcmVmcmVzaExhYmVsKCk7Ci0JCQl9Ci0JCQlpZiAoZ2V0UGFyc2VyKCkgaW5zdGFuY2VvZiBJU2VtYW50aWNQYXJzZXIpIHsKLQkJCQlJU2VtYW50aWNQYXJzZXIgbW9kZWxQYXJzZXIgPSAoSVNlbWFudGljUGFyc2VyKSBnZXRQYXJzZXIoKTsKLQkJCQlpZiAobW9kZWxQYXJzZXIuYXJlU2VtYW50aWNFbGVtZW50c0FmZmVjdGVkKG51bGwsIGV2ZW50KSkgewotCQkJCQlyZW1vdmVTZW1hbnRpY0xpc3RlbmVycygpOwotCQkJCQlpZiAocmVzb2x2ZVNlbWFudGljRWxlbWVudCgpICE9IG51bGwpIHsKLQkJCQkJCWFkZFNlbWFudGljTGlzdGVuZXJzKCk7Ci0JCQkJCX0KLQkJCQkJcmVmcmVzaExhYmVsKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXN1cGVyLmhhbmRsZU5vdGlmaWNhdGlvbkV2ZW50KGV2ZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlRmlndXJlKCkgewotCQlJRmlndXJlIGxhYmVsID0gY3JlYXRlRmlndXJlUHJpbSgpOwotCQlkZWZhdWx0VGV4dCA9IGdldExhYmVsVGV4dEhlbHBlcihsYWJlbCk7Ci0JCXJldHVybiBsYWJlbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlRmlndXJlUHJpbSgpIHsKLQkJcmV0dXJuIG5ldyBOb2RlTmFtZUZpZ3VyZSgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgY2xhc3MgTm9kZU5hbWVGaWd1cmUgZXh0ZW5kcyBXcmFwTGFiZWwgewotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgTm9kZU5hbWVGaWd1cmUoKSB7Ci0KLQkJCXRoaXMuc2V0VGV4dCgiIik7CQkvLyROT04tTkxTLTEkCi0JCQljcmVhdGVDb250ZW50cygpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgdm9pZCBjcmVhdGVDb250ZW50cygpIHsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIGJvb2xlYW4gbXlVc2VMb2NhbENvb3JkaW5hdGVzID0gZmFsc2U7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByb3RlY3RlZCBib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMoKSB7Ci0JCQlyZXR1cm4gbXlVc2VMb2NhbENvb3JkaW5hdGVzOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByb3RlY3RlZCB2b2lkIHNldFVzZUxvY2FsQ29vcmRpbmF0ZXMoYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKSB7Ci0JCQlteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSB1c2VMb2NhbENvb3JkaW5hdGVzOwotCQl9Ci0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BhcnRzL0ZvcmtOb2RlRWRpdFBhcnQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BhcnRzL0ZvcmtOb2RlRWRpdFBhcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTk4M2VhNy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wYXJ0cy9Gb3JrTm9kZUVkaXRQYXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlN0YWNrTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5jdXN0b20ucG9saWNpZXMuRHluYW1pY1Jlc2l6ZURpcmVjdGlvbnNFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucG9saWNpZXMuRm9ya05vZGVJdGVtU2VtYW50aWNFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUudXRpbC5EaWFncmFtQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLkxheW91dEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5Ob25SZXNpemFibGVFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5yZXF1ZXN0cy5DcmVhdGVSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLlNoYXBlTm9kZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkVkaXRQb2xpY3lSb2xlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmwxMG4uRGlhZ3JhbUNvbG9yUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuQ29uc3RyYWluZWRUb29sYmFyTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmdlZi51aS5maWd1cmVzLkRlZmF1bHRTaXplTm9kZUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5nZWYudWkuZmlndXJlcy5Ob2RlRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkZpbGxTdHlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob3RhdGlvblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRm9ya05vZGVFZGl0UGFydCBleHRlbmRzIFNoYXBlTm9kZUVkaXRQYXJ0IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWSVNVQUxfSUQgPSAxMDAzOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJRmlndXJlIGNvbnRlbnRQYW5lOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJRmlndXJlIHByaW1hcnlTaGFwZTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRm9ya05vZGVFZGl0UGFydChWaWV3IHZpZXcpIHsKLQkJc3VwZXIodmlldyk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKSB7Ci0KLQkJc3VwZXIuY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpOwotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuU0VNQU5USUNfUk9MRSwKLQkJCQluZXcgRm9ya05vZGVJdGVtU2VtYW50aWNFZGl0UG9saWN5KCkpOwotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LkxBWU9VVF9ST0xFLCBjcmVhdGVMYXlvdXRFZGl0UG9saWN5KCkpOwotCQkKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIExheW91dEVkaXRQb2xpY3kgY3JlYXRlTGF5b3V0RWRpdFBvbGljeSgpIHsKLQkJTGF5b3V0RWRpdFBvbGljeSBsZXAgPSBuZXcgTGF5b3V0RWRpdFBvbGljeSgpIHsKLQotCQkJcHJvdGVjdGVkIEVkaXRQb2xpY3kgY3JlYXRlQ2hpbGRFZGl0UG9saWN5KEVkaXRQYXJ0IGNoaWxkKSB7Ci0JCQkJRWRpdFBvbGljeSByZXN1bHQgPSBjaGlsZAotCQkJCQkJLmdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSB7Ci0JCQkJCXJlc3VsdCA9IG5ldyBOb25SZXNpemFibGVFZGl0UG9saWN5KCk7Ci0JCQkJfQotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0KLQkJCXByb3RlY3RlZCBDb21tYW5kIGdldE1vdmVDaGlsZHJlbkNvbW1hbmQoUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0KLQkJCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZUNvbW1hbmQoQ3JlYXRlUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCX07Ci0JCXJldHVybiBsZXA7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZU5vZGVTaGFwZSgpIHsKLQkJRm9ya05vZGVGaWd1cmUgZmlndXJlID0gbmV3IEZvcmtOb2RlRmlndXJlKCk7Ci0JCXJldHVybiBwcmltYXJ5U2hhcGUgPSBmaWd1cmU7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBGb3JrTm9kZUZpZ3VyZSBnZXRQcmltYXJ5U2hhcGUoKSB7Ci0JCXJldHVybiAoRm9ya05vZGVGaWd1cmUpIHByaW1hcnlTaGFwZTsKLQl9Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTm9kZUZpZ3VyZSBjcmVhdGVOb2RlUGxhdGUoKSB7Ci0JCXJldHVybiBuZXcgRGVmYXVsdFNpemVOb2RlRmlndXJlKGdldE1hcE1vZGUoKS5EUHRvTFAoMTAwKSwgZ2V0TWFwTW9kZSgpCi0JCQkJLkRQdG9MUCg1KSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFZGl0UG9saWN5IGdldFByaW1hcnlEcmFnRWRpdFBvbGljeSgpIHsKLS8vCQlFZGl0UG9saWN5IHJlc3VsdCA9IHN1cGVyLmdldFByaW1hcnlEcmFnRWRpdFBvbGljeSgpOwotLy8JCWlmIChyZXN1bHQgaW5zdGFuY2VvZiBSZXNpemFibGVFZGl0UG9saWN5KSB7Ci0vLwkJCVJlc2l6YWJsZUVkaXRQb2xpY3kgZXAgPSAoUmVzaXphYmxlRWRpdFBvbGljeSkgcmVzdWx0OwotLy8JCQllcC5zZXRSZXNpemVEaXJlY3Rpb25zKFBvc2l0aW9uQ29uc3RhbnRzLldFU1QKLS8vCQkJCQl8IFBvc2l0aW9uQ29uc3RhbnRzLkVBU1QpOwotLy8JCX0KLS8vCQlyZXR1cm4gcmVzdWx0OwotCQkKLQkJRHluYW1pY1Jlc2l6ZURpcmVjdGlvbnNFZGl0UG9saWN5IHJlc3VsdCA9IG5ldyBEeW5hbWljUmVzaXplRGlyZWN0aW9uc0VkaXRQb2xpY3koKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGZpZ3VyZSBmb3IgdGhpcyBlZGl0IHBhcnQuCi0JICogCi0JICogQm9keSBvZiB0aGlzIG1ldGhvZCBkb2VzIG5vdCBkZXBlbmQgb24gc2V0dGluZ3MgaW4gZ2VuZXJhdGlvbiBtb2RlbAotCSAqIHNvIHlvdSBtYXkgc2FmZWx5IHJlbW92ZSA8aT5nZW5lcmF0ZWQ8L2k+IHRhZyBhbmQgbW9kaWZ5IGl0LgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTm9kZUZpZ3VyZSBjcmVhdGVOb2RlRmlndXJlKCkgewotCQlOb2RlRmlndXJlIGZpZ3VyZSA9IGNyZWF0ZU5vZGVQbGF0ZSgpOwotCQlmaWd1cmUuc2V0TGF5b3V0TWFuYWdlcihuZXcgU3RhY2tMYXlvdXQoKSk7Ci0JCUlGaWd1cmUgc2hhcGUgPSBjcmVhdGVOb2RlU2hhcGUoKTsKLQkJZmlndXJlLmFkZChzaGFwZSk7Ci0JCWNvbnRlbnRQYW5lID0gc2V0dXBDb250ZW50UGFuZShzaGFwZSk7Ci0JCXJldHVybiBmaWd1cmU7Ci0JfQotCi0JLyoqCi0JICogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiB0cmVhdHMgcGFzc2VkIGZpZ3VyZSBhcyBjb250ZW50IHBhbmUuCi0JICogUmVzcGVjdHMgbGF5b3V0IG9uZSBtYXkgaGF2ZSBzZXQgZm9yIGdlbmVyYXRlZCBmaWd1cmUuCi0JICogQHBhcmFtIG5vZGVTaGFwZSBpbnN0YW5jZSBvZiBnZW5lcmF0ZWQgZmlndXJlIGNsYXNzCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJRmlndXJlIHNldHVwQ29udGVudFBhbmUoSUZpZ3VyZSBub2RlU2hhcGUpIHsKLQkJaWYgKG5vZGVTaGFwZS5nZXRMYXlvdXRNYW5hZ2VyKCkgPT0gbnVsbCkgewotCQkJQ29uc3RyYWluZWRUb29sYmFyTGF5b3V0IGxheW91dCA9IG5ldyBDb25zdHJhaW5lZFRvb2xiYXJMYXlvdXQoKTsKLQkJCWxheW91dC5zZXRTcGFjaW5nKGdldE1hcE1vZGUoKS5EUHRvTFAoNSkpOwotCQkJbm9kZVNoYXBlLnNldExheW91dE1hbmFnZXIobGF5b3V0KTsKLQkJfQotCQlyZXR1cm4gbm9kZVNoYXBlOyAvLyB1c2Ugbm9kZVNoYXBlIGl0c2VsZiBhcyBjb250ZW50UGFuZQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSUZpZ3VyZSBnZXRDb250ZW50UGFuZSgpIHsKLQkJaWYgKGNvbnRlbnRQYW5lICE9IG51bGwpIHsKLQkJCXJldHVybiBjb250ZW50UGFuZTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0Q29udGVudFBhbmUoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGNsYXNzIEZvcmtOb2RlRmlndXJlIGV4dGVuZHMgUmVjdGFuZ2xlRmlndXJlIHsKLQotCQkvKioKLQkJICogQG1vZGlmaWVkCi0JCSAqLwotCQlwdWJsaWMgRm9ya05vZGVGaWd1cmUoKSB7Ci0KLQkJCUZpbGxTdHlsZSBzdHlsZSA9IChGaWxsU3R5bGUpIGdldFByaW1hcnlWaWV3KCkuZ2V0U3R5bGUoCi0JCQkJCU5vdGF0aW9uUGFja2FnZS5MaXRlcmFscy5GSUxMX1NUWUxFKTsKLQkJCWlmIChzdHlsZSAhPSBudWxsCi0JCQkJCSYmIHN0eWxlLmdldEZpbGxDb2xvcigpICE9IERpYWdyYW1Db25zdGFudHMuRklMTF9DT0xPUl9FREVGQVVMVCkgewotCQkJCXNldEJhY2tncm91bmRDb2xvcihEaWFncmFtQ29sb3JSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldENvbG9yKAotCQkJCQkJbmV3IEludGVnZXIoc3R5bGUuZ2V0RmlsbENvbG9yKCkpKSk7Ci0JCQl9IGVsc2UgewotCQkJCXRoaXMuc2V0QmFja2dyb3VuZENvbG9yKEZPUktOT0RFRklHVVJFX0JBQ0spOwotCQkJfQotCQkJdGhpcy5zZXRQcmVmZXJyZWRTaXplKGdldE1hcE1vZGUoKS5EUHRvTFAoMTAwKSwgZ2V0TWFwTW9kZSgpCi0JCQkJCS5EUHRvTFAoOCkpOwotCQkJdGhpcy5zZXRTaXplKGdldE1hcE1vZGUoKS5EUHRvTFAoMTAwKSwgZ2V0TWFwTW9kZSgpLkRQdG9MUCg4KSk7Ci0JCQljcmVhdGVDb250ZW50cygpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgdm9pZCBjcmVhdGVDb250ZW50cygpIHsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIGJvb2xlYW4gbXlVc2VMb2NhbENvb3JkaW5hdGVzID0gZmFsc2U7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByb3RlY3RlZCBib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMoKSB7Ci0JCQlyZXR1cm4gbXlVc2VMb2NhbENvb3JkaW5hdGVzOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByb3RlY3RlZCB2b2lkIHNldFVzZUxvY2FsQ29vcmRpbmF0ZXMoYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKSB7Ci0JCQlteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSB1c2VMb2NhbENvb3JkaW5hdGVzOwotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDb2xvciBGT1JLTk9ERUZJR1VSRV9CQUNLID0gbmV3IENvbG9yKG51bGwsIDQ1LCA4NSwgMTMwKTsKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGhhbmRsZU5vdGlmaWNhdGlvbkV2ZW50KE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlPYmplY3QgZmVhdHVyZSA9IG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlKCk7Ci0JCWlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldFNpemVfV2lkdGgoKS5lcXVhbHMoZmVhdHVyZSkKLQkJCQl8fCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldFNpemVfSGVpZ2h0KCkuZXF1YWxzKGZlYXR1cmUpCi0JCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRMb2NhdGlvbl9YKCkuZXF1YWxzKGZlYXR1cmUpCi0JCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRMb2NhdGlvbl9ZKCkuZXF1YWxzKGZlYXR1cmUpKSB7Ci0JCQlyZWZyZXNoQm91bmRzKCk7Ci0JCX0gZWxzZSBpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGaWxsU3R5bGVfRmlsbENvbG9yKCkuZXF1YWxzKAotCQkJCWZlYXR1cmUpKSB7Ci0JCQlJbnRlZ2VyIGMgPSAoSW50ZWdlcikgbm90aWZpY2F0aW9uLmdldE5ld1ZhbHVlKCk7Ci0JCQlzZXRCYWNrZ3JvdW5kQ29sb3IoRGlhZ3JhbUNvbG9yUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXRDb2xvcihjKSk7Ci0JCQlnZXRQcmltYXJ5U2hhcGUoKS5zZXRCYWNrZ3JvdW5kQ29sb3IoCi0JCQkJCURpYWdyYW1Db2xvclJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0Q29sb3IoYykpOwotCQl9IGVsc2UgaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TGluZVN0eWxlX0xpbmVDb2xvcigpLmVxdWFscygKLQkJCQlmZWF0dXJlKSkgewotCQkJSW50ZWdlciBjID0gKEludGVnZXIpIG5vdGlmaWNhdGlvbi5nZXROZXdWYWx1ZSgpOwotCQkJc2V0Rm9yZWdyb3VuZENvbG9yKERpYWdyYW1Db2xvclJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0Q29sb3IoYykpOwotCQkJZ2V0UHJpbWFyeVNoYXBlKCkuc2V0Rm9yZWdyb3VuZENvbG9yKAotCQkJCQlEaWFncmFtQ29sb3JSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldENvbG9yKGMpKTsKLQkJfSBlbHNlIGlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZSgpLmlzSW5zdGFuY2UoCi0JCQkJbm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCkpKQotCQkJcmVmcmVzaEZvbnQoKTsKLQkJZWxzZSBpZiAobm90aWZpY2F0aW9uLmdldEZlYXR1cmUoKSA9PSBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldFZpZXdfRWxlbWVudCgpCi0JCQkJJiYgKChFT2JqZWN0KSBub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKSkgPT0gZ2V0Tm90YXRpb25WaWV3KCkpCi0JCQloYW5kbGVNYWpvclNlbWFudGljQ2hhbmdlKCk7Ci0JCWVsc2UKLQkJCXN1cGVyLmhhbmRsZU5vdGlmaWNhdGlvbkV2ZW50KG5vdGlmaWNhdGlvbik7Ci0JfQotCQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wYXJ0cy9Jbml0aWFsTm9kZUVkaXRQYXJ0LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wYXJ0cy9Jbml0aWFsTm9kZUVkaXRQYXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0MDJiYWUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcGFydHMvSW5pdGlhbE5vZGVFZGl0UGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuQ29sb3JDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkVsbGlwc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlBvc2l0aW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5TdGFja0xheW91dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5EaW1lbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucG9saWNpZXMuSW5pdGlhbE5vZGVDYW5vbmljYWxFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucG9saWNpZXMuSW5pdGlhbE5vZGVHcmFwaGljYWxOb2RlRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBvbGljaWVzLkluaXRpYWxOb2RlSXRlbVNlbWFudGljRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBvbGljaWVzLlVNTEV4dE5vZGVMYWJlbEhvc3RMYXlvdXRFZGl0UG9saWN5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQucGFydC5VTUxWaXN1YWxJRFJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUudXRpbC5EaWFncmFtQ29uc3RhbnRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5HcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwYXJ0cy5MYXllck1hbmFnZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLkxheW91dEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5Ob25SZXNpemFibGVFZGl0UG9saWN5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLkNyZWF0ZVJlcXVlc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5BYnN0cmFjdEJvcmRlcmVkU2hhcGVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JQm9yZGVySXRlbUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLlNoYXBlTm9kZUVkaXRQYXJ0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuQm9yZGVySXRlbVNlbGVjdGlvbkVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuRWRpdFBvbGljeVJvbGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZmlndXJlcy5Cb3JkZXJJdGVtTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmwxMG4uRGlhZ3JhbUNvbG9yUmVnaXN0cnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5Db25zdHJhaW5lZFRvb2xiYXJMYXlvdXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5nZWYudWkuZmlndXJlcy5EZWZhdWx0U2l6ZU5vZGVGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZ2VmLnVpLmZpZ3VyZXMuTm9kZUZpZ3VyZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkZpbGxTdHlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5MaW5lU3R5bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm90YXRpb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEluaXRpYWxOb2RlRWRpdFBhcnQgZXh0ZW5kcyBBYnN0cmFjdEJvcmRlcmVkU2hhcGVFZGl0UGFydCB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVklTVUFMX0lEID0gMTAwNDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBjb250ZW50UGFuZTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBwcmltYXJ5U2hhcGU7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEluaXRpYWxOb2RlRWRpdFBhcnQoVmlldyB2aWV3KSB7Ci0JCXN1cGVyKHZpZXcpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCkgewotCi0JCXN1cGVyLmNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKTsKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLlNFTUFOVElDX1JPTEUsCi0JCQkJbmV3IEluaXRpYWxOb2RlSXRlbVNlbWFudGljRWRpdFBvbGljeSgpKTsKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5MQVlPVVRfUk9MRSwgY3JlYXRlTGF5b3V0RWRpdFBvbGljeSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIExheW91dEVkaXRQb2xpY3kgY3JlYXRlTGF5b3V0RWRpdFBvbGljeSgpIHsKLQkJTGF5b3V0RWRpdFBvbGljeSBsZXAgPSBuZXcgTGF5b3V0RWRpdFBvbGljeSgpIHsKLQotCQkJcHJvdGVjdGVkIEVkaXRQb2xpY3kgY3JlYXRlQ2hpbGRFZGl0UG9saWN5KEVkaXRQYXJ0IGNoaWxkKSB7Ci0JCQkJaWYgKGNoaWxkIGluc3RhbmNlb2YgSUJvcmRlckl0ZW1FZGl0UGFydCkgewotCQkJCQlyZXR1cm4gbmV3IEJvcmRlckl0ZW1TZWxlY3Rpb25FZGl0UG9saWN5KCk7Ci0JCQkJfQotCQkJCUVkaXRQb2xpY3kgcmVzdWx0ID0gY2hpbGQKLQkJCQkJCS5nZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgewotCQkJCQlyZXN1bHQgPSBuZXcgTm9uUmVzaXphYmxlRWRpdFBvbGljeSgpOwotCQkJCX0KLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCi0JCQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRNb3ZlQ2hpbGRyZW5Db21tYW5kKFJlcXVlc3QgcmVxdWVzdCkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCi0JCQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVDb21tYW5kKENyZWF0ZVJlcXVlc3QgcmVxdWVzdCkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9OwotCQlyZXR1cm4gbGVwOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVOb2RlU2hhcGUoKSB7Ci0JCUluaXRpYWxOb2RlRmlndXJlIGZpZ3VyZSA9IG5ldyBJbml0aWFsTm9kZUZpZ3VyZSgpOwotCQlyZXR1cm4gcHJpbWFyeVNoYXBlID0gZmlndXJlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSW5pdGlhbE5vZGVGaWd1cmUgZ2V0UHJpbWFyeVNoYXBlKCkgewotCQlyZXR1cm4gKEluaXRpYWxOb2RlRmlndXJlKSBwcmltYXJ5U2hhcGU7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEJvcmRlckl0ZW0oSUZpZ3VyZSBib3JkZXJJdGVtQ29udGFpbmVyLAotCQkJSUJvcmRlckl0ZW1FZGl0UGFydCBib3JkZXJJdGVtRWRpdFBhcnQpIHsKLQkJaWYgKGJvcmRlckl0ZW1FZGl0UGFydCBpbnN0YW5jZW9mIEluaXRpYWxOb2RlTmFtZUVkaXRQYXJ0KSB7Ci0JCQlCb3JkZXJJdGVtTG9jYXRvciBsb2NhdG9yID0gbmV3IEJvcmRlckl0ZW1Mb2NhdG9yKGdldE1haW5GaWd1cmUoKSwKLQkJCQkJUG9zaXRpb25Db25zdGFudHMuU09VVEgpOwotCQkJbG9jYXRvci5zZXRCb3JkZXJJdGVtT2Zmc2V0KG5ldyBEaW1lbnNpb24oLTIwLCAtMjApKTsKLQkJCWJvcmRlckl0ZW1Db250YWluZXIuYWRkKGJvcmRlckl0ZW1FZGl0UGFydC5nZXRGaWd1cmUoKSwgbG9jYXRvcik7Ci0JCX0gZWxzZSB7Ci0JCQlzdXBlci5hZGRCb3JkZXJJdGVtKGJvcmRlckl0ZW1Db250YWluZXIsIGJvcmRlckl0ZW1FZGl0UGFydCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTm9kZUZpZ3VyZSBjcmVhdGVOb2RlUGxhdGUoKSB7Ci0JCXJldHVybiBuZXcgRGVmYXVsdFNpemVOb2RlRmlndXJlKGdldE1hcE1vZGUoKS5EUHRvTFAoMjApLCBnZXRNYXBNb2RlKCkKLQkJCQkuRFB0b0xQKDIwKSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBmaWd1cmUgZm9yIHRoaXMgZWRpdCBwYXJ0LgotCSAqIAotCSAqIEJvZHkgb2YgdGhpcyBtZXRob2QgZG9lcyBub3QgZGVwZW5kIG9uIHNldHRpbmdzIGluIGdlbmVyYXRpb24gbW9kZWwKLQkgKiBzbyB5b3UgbWF5IHNhZmVseSByZW1vdmUgPGk+Z2VuZXJhdGVkPC9pPiB0YWcgYW5kIG1vZGlmeSBpdC4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE5vZGVGaWd1cmUgY3JlYXRlTWFpbkZpZ3VyZSgpIHsKLQkJTm9kZUZpZ3VyZSBmaWd1cmUgPSBjcmVhdGVOb2RlUGxhdGUoKTsKLQkJZmlndXJlLnNldExheW91dE1hbmFnZXIobmV3IFN0YWNrTGF5b3V0KCkpOwotCQlJRmlndXJlIHNoYXBlID0gY3JlYXRlTm9kZVNoYXBlKCk7Ci0JCWZpZ3VyZS5hZGQoc2hhcGUpOwotCQljb250ZW50UGFuZSA9IHNldHVwQ29udGVudFBhbmUoc2hhcGUpOwotCQlyZXR1cm4gZmlndXJlOwotCX0KLQotCS8qKgotCSAqIERlZmF1bHQgaW1wbGVtZW50YXRpb24gdHJlYXRzIHBhc3NlZCBmaWd1cmUgYXMgY29udGVudCBwYW5lLgotCSAqIFJlc3BlY3RzIGxheW91dCBvbmUgbWF5IGhhdmUgc2V0IGZvciBnZW5lcmF0ZWQgZmlndXJlLgotCSAqIEBwYXJhbSBub2RlU2hhcGUgaW5zdGFuY2Ugb2YgZ2VuZXJhdGVkIGZpZ3VyZSBjbGFzcwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBzZXR1cENvbnRlbnRQYW5lKElGaWd1cmUgbm9kZVNoYXBlKSB7Ci0JCWlmIChub2RlU2hhcGUuZ2V0TGF5b3V0TWFuYWdlcigpID09IG51bGwpIHsKLQkJCUNvbnN0cmFpbmVkVG9vbGJhckxheW91dCBsYXlvdXQgPSBuZXcgQ29uc3RyYWluZWRUb29sYmFyTGF5b3V0KCk7Ci0JCQlsYXlvdXQuc2V0U3BhY2luZyhnZXRNYXBNb2RlKCkuRFB0b0xQKDUpKTsKLQkJCW5vZGVTaGFwZS5zZXRMYXlvdXRNYW5hZ2VyKGxheW91dCk7Ci0JCX0KLQkJcmV0dXJuIG5vZGVTaGFwZTsgLy8gdXNlIG5vZGVTaGFwZSBpdHNlbGYgYXMgY29udGVudFBhbmUKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElGaWd1cmUgZ2V0Q29udGVudFBhbmUoKSB7Ci0JCWlmIChjb250ZW50UGFuZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gY29udGVudFBhbmU7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldENvbnRlbnRQYW5lKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFZGl0UGFydCBnZXRQcmltYXJ5Q2hpbGRFZGl0UGFydCgpIHsKLQkJcmV0dXJuIGdldENoaWxkQnlTZW1hbnRpY0hpbnQoVU1MVmlzdWFsSURSZWdpc3RyeQotCQkJCS5nZXRUeXBlKEluaXRpYWxOb2RlTmFtZUVkaXRQYXJ0LlZJU1VBTF9JRCkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgY2xhc3MgSW5pdGlhbE5vZGVGaWd1cmUgZXh0ZW5kcyBFbGxpcHNlIHsKLQotCQkvKioKLQkJICogQG1vZGlmaWVkCi0JCSAqLwotCQlwdWJsaWMgSW5pdGlhbE5vZGVGaWd1cmUoKSB7Ci0KLQkJCUxpbmVTdHlsZSBsaW5lc3R5bGUgPSAoTGluZVN0eWxlKSBnZXRQcmltYXJ5VmlldygpLmdldFN0eWxlKAotCQkJCQlOb3RhdGlvblBhY2thZ2UuTGl0ZXJhbHMuTElORV9TVFlMRSk7Ci0JCQlpZiAobGluZXN0eWxlICE9IG51bGwKLQkJCQkJJiYgbGluZXN0eWxlLmdldExpbmVDb2xvcigpICE9IERpYWdyYW1Db25zdGFudHMuTElORV9DT0xPUl9FREVGQVVMVCkgewotCQkJCXRoaXMuc2V0Rm9yZWdyb3VuZENvbG9yKERpYWdyYW1Db2xvclJlZ2lzdHJ5LmdldEluc3RhbmNlKCkKLQkJCQkJCS5nZXRDb2xvcihuZXcgSW50ZWdlcihsaW5lc3R5bGUuZ2V0TGluZUNvbG9yKCkpKSk7Ci0JCQl9IGVsc2UgewotCQkJCXRoaXMKLQkJCQkJCS5zZXRGb3JlZ3JvdW5kQ29sb3Iob3JnLmVjbGlwc2UuZHJhdzJkLkNvbG9yQ29uc3RhbnRzLmRhcmtCbHVlKTsKLQkJCX0KLQotCQkJRmlsbFN0eWxlIHN0eWxlID0gKEZpbGxTdHlsZSkgZ2V0UHJpbWFyeVZpZXcoKS5nZXRTdHlsZSgKLQkJCQkJTm90YXRpb25QYWNrYWdlLkxpdGVyYWxzLkZJTExfU1RZTEUpOwotCQkJaWYgKHN0eWxlICE9IG51bGwKLQkJCQkJJiYgc3R5bGUuZ2V0RmlsbENvbG9yKCkgIT0gRGlhZ3JhbUNvbnN0YW50cy5GSUxMX0NPTE9SX0VERUZBVUxUKSB7Ci0JCQkJdGhpcy5zZXRCYWNrZ3JvdW5kQ29sb3IoRGlhZ3JhbUNvbG9yUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKQotCQkJCQkJLmdldENvbG9yKG5ldyBJbnRlZ2VyKHN0eWxlLmdldEZpbGxDb2xvcigpKSkpOwotCQkJfSBlbHNlIHsKLQkJCQl0aGlzLnNldEJhY2tncm91bmRDb2xvcihJTklUSUFMTk9ERUZJR1VSRV9CQUNLKTsKLQkJCX0KLQkJCXRoaXMuc2V0UHJlZmVycmVkU2l6ZShnZXRNYXBNb2RlKCkuRFB0b0xQKDIwKSwgZ2V0TWFwTW9kZSgpLkRQdG9MUCgKLQkJCQkJMjApKTsKLQkJCXRoaXMuc2V0U2l6ZShnZXRNYXBNb2RlKCkuRFB0b0xQKDIwKSwgZ2V0TWFwTW9kZSgpLkRQdG9MUCgyMCkpOwotCQkJY3JlYXRlQ29udGVudHMoKTsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIHZvaWQgY3JlYXRlQ29udGVudHMoKSB7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSBib29sZWFuIG15VXNlTG9jYWxDb29yZGluYXRlcyA9IGZhbHNlOwotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcm90ZWN0ZWQgYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKCkgewotCQkJcmV0dXJuIG15VXNlTG9jYWxDb29yZGluYXRlczsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcm90ZWN0ZWQgdm9pZCBzZXRVc2VMb2NhbENvb3JkaW5hdGVzKGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcykgewotCQkJbXlVc2VMb2NhbENvb3JkaW5hdGVzID0gdXNlTG9jYWxDb29yZGluYXRlczsKLQkJfQotCi0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29sb3IgSU5JVElBTE5PREVGSUdVUkVfQkFDSyA9IG5ldyBDb2xvcihudWxsLCA0NSwgODUsCi0JCQkxMzApOwotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlTm90aWZpY2F0aW9uRXZlbnQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCU9iamVjdCBmZWF0dXJlID0gbm90aWZpY2F0aW9uLmdldEZlYXR1cmUoKTsKLQkJaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2l6ZV9XaWR0aCgpLmVxdWFscyhmZWF0dXJlKQotCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2l6ZV9IZWlnaHQoKS5lcXVhbHMoZmVhdHVyZSkKLQkJCQl8fCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldExvY2F0aW9uX1goKS5lcXVhbHMoZmVhdHVyZSkKLQkJCQl8fCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldExvY2F0aW9uX1koKS5lcXVhbHMoZmVhdHVyZSkpIHsKLQkJCXJlZnJlc2hCb3VuZHMoKTsKLQkJfSBlbHNlIGlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZpbGxTdHlsZV9GaWxsQ29sb3IoKS5lcXVhbHMoCi0JCQkJZmVhdHVyZSkpIHsKLQkJCUludGVnZXIgYyA9IChJbnRlZ2VyKSBub3RpZmljYXRpb24uZ2V0TmV3VmFsdWUoKTsKLQkJCXNldEJhY2tncm91bmRDb2xvcihEaWFncmFtQ29sb3JSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldENvbG9yKGMpKTsKLQkJCWdldFByaW1hcnlTaGFwZSgpLnNldEJhY2tncm91bmRDb2xvcigKLQkJCQkJRGlhZ3JhbUNvbG9yUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXRDb2xvcihjKSk7Ci0JCX0gZWxzZSBpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRMaW5lU3R5bGVfTGluZUNvbG9yKCkuZXF1YWxzKAotCQkJCWZlYXR1cmUpKSB7Ci0JCQlJbnRlZ2VyIGMgPSAoSW50ZWdlcikgbm90aWZpY2F0aW9uLmdldE5ld1ZhbHVlKCk7Ci0JCQlzZXRGb3JlZ3JvdW5kQ29sb3IoRGlhZ3JhbUNvbG9yUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXRDb2xvcihjKSk7Ci0JCQlnZXRQcmltYXJ5U2hhcGUoKS5zZXRGb3JlZ3JvdW5kQ29sb3IoCi0JCQkJCURpYWdyYW1Db2xvclJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0Q29sb3IoYykpOwotCQl9IGVsc2UgaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlKCkuaXNJbnN0YW5jZSgKLQkJCQlub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKSkpCi0JCQlyZWZyZXNoRm9udCgpOwotCQllbHNlIGlmIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZSgpID09IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0Vmlld19FbGVtZW50KCkKLQkJCQkmJiAoKEVPYmplY3QpIG5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpKSA9PSBnZXROb3RhdGlvblZpZXcoKSkKLQkJCWhhbmRsZU1ham9yU2VtYW50aWNDaGFuZ2UoKTsKLQkJZWxzZQotCQkJc3VwZXIuaGFuZGxlTm90aWZpY2F0aW9uRXZlbnQobm90aWZpY2F0aW9uKTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wYXJ0cy9Jbml0aWFsTm9kZU5hbWVFZGl0UGFydC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcGFydHMvSW5pdGlhbE5vZGVOYW1lRWRpdFBhcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzQ0NDY3ZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wYXJ0cy9Jbml0aWFsTm9kZU5hbWVFZGl0UGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjE2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5SdW5uYWJsZVdpdGhSZXN1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wb2xpY2llcy5VTUxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5wYXJ0LlVNTFZpc3VhbElEUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQucHJvdmlkZXJzLlVNTEVsZW1lbnRUeXBlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnV0aWwuRGlhZ3JhbUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuQWNjZXNzaWJsZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5yZXF1ZXN0cy5EaXJlY3RFZGl0UmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYudG9vbHMuRGlyZWN0RWRpdE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5JUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuSVBhcnNlckVkaXRTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5QYXJzZXJFZGl0U3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuUGFyc2VyT3B0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLlBhcnNlclNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUJvcmRlckl0ZW1FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JR3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSVRleHRBd2FyZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLkxhYmVsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuTGFiZWxEaXJlY3RFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZmlndXJlcy5JQm9yZGVySXRlbUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5sMTBuLkRpYWdyYW1Db2xvclJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVxdWVzdHMuUmVxdWVzdENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnRvb2xzLlRleHREaXJlY3RFZGl0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvcmUudXRpbC5FT2JqZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLklFbGVtZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudWkuc2VydmljZXMucGFyc2VyLklTZW1hbnRpY1BhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudWkuc2VydmljZXMucGFyc2VyLlBhcnNlckhpbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkZvbnRTdHlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob3RhdGlvblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ2VsbEVkaXRvclZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2libGVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBJbml0aWFsTm9kZU5hbWVFZGl0UGFydCBleHRlbmRzIExhYmVsRWRpdFBhcnQgaW1wbGVtZW50cwotCQlJVGV4dEF3YXJlRWRpdFBhcnQsIElCb3JkZXJJdGVtRWRpdFBhcnQgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZJU1VBTF9JRCA9IDQwMDM7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBEaXJlY3RFZGl0TWFuYWdlciBtYW5hZ2VyOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgSVBhcnNlciBwYXJzZXI7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBMaXN0IHBhcnNlckVsZW1lbnRzOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgU3RyaW5nIGRlZmF1bHRUZXh0OwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXN0YXRpYyB7Ci0JCXJlZ2lzdGVyU25hcEJhY2tQb3NpdGlvbihVTUxWaXN1YWxJRFJlZ2lzdHJ5Ci0JCQkJLmdldFR5cGUoSW5pdGlhbE5vZGVOYW1lRWRpdFBhcnQuVklTVUFMX0lEKSwgbmV3IFBvaW50KDAsIDApKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEluaXRpYWxOb2RlTmFtZUVkaXRQYXJ0KFZpZXcgdmlldykgewotCQlzdXBlcih2aWV3KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpIHsKLQkJc3VwZXIuY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpOwotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LkRJUkVDVF9FRElUX1JPTEUsCi0JCQkJbmV3IExhYmVsRGlyZWN0RWRpdFBvbGljeSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElCb3JkZXJJdGVtTG9jYXRvciBnZXRCb3JkZXJJdGVtTG9jYXRvcigpIHsKLQkJSUZpZ3VyZSBwYXJlbnRGaWd1cmUgPSBnZXRGaWd1cmUoKS5nZXRQYXJlbnQoKTsKLQkJaWYgKHBhcmVudEZpZ3VyZSAhPSBudWxsICYmIHBhcmVudEZpZ3VyZS5nZXRMYXlvdXRNYW5hZ2VyKCkgIT0gbnVsbCkgewotCQkJT2JqZWN0IGNvbnN0cmFpbnQgPSBwYXJlbnRGaWd1cmUuZ2V0TGF5b3V0TWFuYWdlcigpLmdldENvbnN0cmFpbnQoCi0JCQkJCWdldEZpZ3VyZSgpKTsKLQkJCXJldHVybiAoSUJvcmRlckl0ZW1Mb2NhdG9yKSBjb25zdHJhaW50OwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWZyZXNoQm91bmRzKCkgewotCQlpbnQgeCA9ICgoSW50ZWdlcikgZ2V0U3RydWN0dXJhbEZlYXR1cmVWYWx1ZShOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldExvY2F0aW9uX1goKSkpLmludFZhbHVlKCk7Ci0JCWludCB5ID0gKChJbnRlZ2VyKSBnZXRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0TG9jYXRpb25fWSgpKSkuaW50VmFsdWUoKTsKLQkJaW50IHdpZHRoID0gKChJbnRlZ2VyKSBnZXRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0U2l6ZV9XaWR0aCgpKSkuaW50VmFsdWUoKTsKLQkJaW50IGhlaWdodCA9ICgoSW50ZWdlcikgZ2V0U3RydWN0dXJhbEZlYXR1cmVWYWx1ZShOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldFNpemVfSGVpZ2h0KCkpKS5pbnRWYWx1ZSgpOwotCQlnZXRCb3JkZXJJdGVtTG9jYXRvcigpCi0JCQkJLnNldENvbnN0cmFpbnQobmV3IFJlY3RhbmdsZSh4LCB5LCB3aWR0aCwgaGVpZ2h0KSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TGFiZWxUZXh0SGVscGVyKElGaWd1cmUgZmlndXJlKSB7Ci0JCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCXJldHVybiAoKFdyYXBMYWJlbCkgZmlndXJlKS5nZXRUZXh0KCk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gKChMYWJlbCkgZmlndXJlKS5nZXRUZXh0KCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0TGFiZWxUZXh0SGVscGVyKElGaWd1cmUgZmlndXJlLCBTdHJpbmcgdGV4dCkgewotCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQkoKFdyYXBMYWJlbCkgZmlndXJlKS5zZXRUZXh0KHRleHQpOwotCQl9IGVsc2UgewotCQkJKChMYWJlbCkgZmlndXJlKS5zZXRUZXh0KHRleHQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJbWFnZSBnZXRMYWJlbEljb25IZWxwZXIoSUZpZ3VyZSBmaWd1cmUpIHsKLQkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJcmV0dXJuICgoV3JhcExhYmVsKSBmaWd1cmUpLmdldEljb24oKTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiAoKExhYmVsKSBmaWd1cmUpLmdldEljb24oKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRMYWJlbEljb25IZWxwZXIoSUZpZ3VyZSBmaWd1cmUsIEltYWdlIGljb24pIHsKLQkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJKChXcmFwTGFiZWwpIGZpZ3VyZSkuc2V0SWNvbihpY29uKTsKLQkJfSBlbHNlIHsKLQkJCSgoTGFiZWwpIGZpZ3VyZSkuc2V0SWNvbihpY29uKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMYWJlbChJRmlndXJlIGZpZ3VyZSkgewotCQl1bnJlZ2lzdGVyVmlzdWFscygpOwotCQlzZXRGaWd1cmUoZmlndXJlKTsKLQkJZGVmYXVsdFRleHQgPSBnZXRMYWJlbFRleHRIZWxwZXIoZmlndXJlKTsKLQkJcmVnaXN0ZXJWaXN1YWxzKCk7Ci0JCXJlZnJlc2hWaXN1YWxzKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBMaXN0IGdldE1vZGVsQ2hpbGRyZW4oKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSUdyYXBoaWNhbEVkaXRQYXJ0IGdldENoaWxkQnlTZW1hbnRpY0hpbnQoU3RyaW5nIHNlbWFudGljSGludCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVPYmplY3QgZ2V0UGFyc2VyRWxlbWVudCgpIHsKLQkJRU9iamVjdCBlbGVtZW50ID0gcmVzb2x2ZVNlbWFudGljRWxlbWVudCgpOwotCQlyZXR1cm4gZWxlbWVudCAhPSBudWxsID8gZWxlbWVudCA6IChWaWV3KSBnZXRNb2RlbCgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSW1hZ2UgZ2V0TGFiZWxJY29uKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRMYWJlbFRleHQoKSB7Ci0JCVN0cmluZyB0ZXh0ID0gbnVsbDsKLQkJaWYgKGdldFBhcnNlcigpICE9IG51bGwpIHsKLQkJCXRleHQgPSBnZXRQYXJzZXIoKS5nZXRQcmludFN0cmluZygKLQkJCQkJbmV3IEVPYmplY3RBZGFwdGVyKGdldFBhcnNlckVsZW1lbnQoKSksCi0JCQkJCWdldFBhcnNlck9wdGlvbnMoKS5pbnRWYWx1ZSgpKTsKLQkJfQotCQlpZiAodGV4dCA9PSBudWxsIHx8IHRleHQubGVuZ3RoKCkgPT0gMCkgewotCQkJdGV4dCA9IGRlZmF1bHRUZXh0OwotCQl9Ci0JCXJldHVybiB0ZXh0OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMYWJlbFRleHQoU3RyaW5nIHRleHQpIHsKLQkJc2V0TGFiZWxUZXh0SGVscGVyKGdldEZpZ3VyZSgpLCB0ZXh0KTsKLQkJT2JqZWN0IHBkRWRpdFBvbGljeSA9IGdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSk7Ci0JCWlmIChwZEVkaXRQb2xpY3kgaW5zdGFuY2VvZiBVTUxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgewotCQkJKChVTUxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgcGRFZGl0UG9saWN5KS5yZWZyZXNoRmVlZGJhY2soKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEVkaXRUZXh0KCkgewotCQlpZiAoZ2V0UGFyc2VyKCkgPT0gbnVsbCkgewotCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIGdldFBhcnNlcigpLmdldEVkaXRTdHJpbmcoCi0JCQkJbmV3IEVPYmplY3RBZGFwdGVyKGdldFBhcnNlckVsZW1lbnQoKSksCi0JCQkJZ2V0UGFyc2VyT3B0aW9ucygpLmludFZhbHVlKCkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0VkaXRhYmxlKCkgewotCQlyZXR1cm4gZ2V0UGFyc2VyKCkgIT0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElDZWxsRWRpdG9yVmFsaWRhdG9yIGdldEVkaXRUZXh0VmFsaWRhdG9yKCkgewotCQlyZXR1cm4gbmV3IElDZWxsRWRpdG9yVmFsaWRhdG9yKCkgewotCi0JCQlwdWJsaWMgU3RyaW5nIGlzVmFsaWQoZmluYWwgT2JqZWN0IHZhbHVlKSB7Ci0JCQkJaWYgKHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0JCQkJCWZpbmFsIEVPYmplY3QgZWxlbWVudCA9IGdldFBhcnNlckVsZW1lbnQoKTsKLQkJCQkJZmluYWwgSVBhcnNlciBwYXJzZXIgPSBnZXRQYXJzZXIoKTsKLQkJCQkJdHJ5IHsKLQkJCQkJCUlQYXJzZXJFZGl0U3RhdHVzIHZhbGlkID0gKElQYXJzZXJFZGl0U3RhdHVzKSBnZXRFZGl0aW5nRG9tYWluKCkKLQkJCQkJCQkJLnJ1bkV4Y2x1c2l2ZShuZXcgUnVubmFibGVXaXRoUmVzdWx0LkltcGwoKSB7Ci0KLQkJCQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQkJCQlzZXRSZXN1bHQocGFyc2VyLmlzVmFsaWRFZGl0U3RyaW5nKAotCQkJCQkJCQkJCQkJbmV3IEVPYmplY3RBZGFwdGVyKGVsZW1lbnQpLAotCQkJCQkJCQkJCQkJKFN0cmluZykgdmFsdWUpKTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfSk7Ci0JCQkJCQlyZXR1cm4gdmFsaWQuZ2V0Q29kZSgpID09IFBhcnNlckVkaXRTdGF0dXMuRURJVEFCTEUgPyBudWxsCi0JCQkJCQkJCTogdmFsaWQuZ2V0TWVzc2FnZSgpOwotCQkJCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZSkgewotCQkJCQkJaWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQkvLyBzaG91bGRuJ3QgZ2V0IGhlcmUKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElDb250ZW50QXNzaXN0UHJvY2Vzc29yIGdldENvbXBsZXRpb25Qcm9jZXNzb3IoKSB7Ci0JCWlmIChnZXRQYXJzZXIoKSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gZ2V0UGFyc2VyKCkuZ2V0Q29tcGxldGlvblByb2Nlc3NvcigKLQkJCQluZXcgRU9iamVjdEFkYXB0ZXIoZ2V0UGFyc2VyRWxlbWVudCgpKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQYXJzZXJPcHRpb25zIGdldFBhcnNlck9wdGlvbnMoKSB7Ci0JCXJldHVybiBQYXJzZXJPcHRpb25zLk5PTkU7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJUGFyc2VyIGdldFBhcnNlcigpIHsKLQkJaWYgKHBhcnNlciA9PSBudWxsKSB7Ci0JCQlTdHJpbmcgcGFyc2VySGludCA9ICgoVmlldykgZ2V0TW9kZWwoKSkuZ2V0VHlwZSgpOwotCQkJUGFyc2VySGludEFkYXB0ZXIgaGludEFkYXB0ZXIgPSBuZXcgUGFyc2VySGludEFkYXB0ZXIoCi0JCQkJCWdldFBhcnNlckVsZW1lbnQoKSwgcGFyc2VySGludCkgewotCi0JCQkJcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKENsYXNzIGFkYXB0ZXIpIHsKLQkJCQkJaWYgKElFbGVtZW50VHlwZS5jbGFzcy5lcXVhbHMoYWRhcHRlcikpIHsKLQkJCQkJCXJldHVybiBVTUxFbGVtZW50VHlwZXMuSW5pdGlhbE5vZGVfMTAwNDsKLQkJCQkJfQotCQkJCQlyZXR1cm4gc3VwZXIuZ2V0QWRhcHRlcihhZGFwdGVyKTsKLQkJCQl9Ci0JCQl9OwotCQkJcGFyc2VyID0gUGFyc2VyU2VydmljZS5nZXRJbnN0YW5jZSgpLmdldFBhcnNlcihoaW50QWRhcHRlcik7Ci0JCX0KLQkJcmV0dXJuIHBhcnNlcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIERpcmVjdEVkaXRNYW5hZ2VyIGdldE1hbmFnZXIoKSB7Ci0JCWlmIChtYW5hZ2VyID09IG51bGwpIHsKLQkJCXNldE1hbmFnZXIobmV3IFRleHREaXJlY3RFZGl0TWFuYWdlcih0aGlzLCBUZXh0RGlyZWN0RWRpdE1hbmFnZXIKLQkJCQkJLmdldFRleHRDZWxsRWRpdG9yQ2xhc3ModGhpcyksIFVNTEVkaXRQYXJ0RmFjdG9yeQotCQkJCQkuZ2V0VGV4dENlbGxFZGl0b3JMb2NhdG9yKHRoaXMpKSk7Ci0JCX0KLQkJcmV0dXJuIG1hbmFnZXI7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldE1hbmFnZXIoRGlyZWN0RWRpdE1hbmFnZXIgbWFuYWdlcikgewotCQl0aGlzLm1hbmFnZXIgPSBtYW5hZ2VyOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdCgpIHsKLQkJZ2V0TWFuYWdlcigpLnNob3coKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURpcmVjdEVkaXQoUG9pbnQgZXZlbnRMb2NhdGlvbikgewotCQlpZiAoZ2V0TWFuYWdlcigpLmdldENsYXNzKCkgPT0gVGV4dERpcmVjdEVkaXRNYW5hZ2VyLmNsYXNzKSB7Ci0JCQkoKFRleHREaXJlY3RFZGl0TWFuYWdlcikgZ2V0TWFuYWdlcigpKS5zaG93KGV2ZW50TG9jYXRpb24KLQkJCQkJLmdldFNXVFBvaW50KCkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdChjaGFyIGluaXRpYWxDaGFyYWN0ZXIpIHsKLQkJaWYgKGdldE1hbmFnZXIoKSBpbnN0YW5jZW9mIFRleHREaXJlY3RFZGl0TWFuYWdlcikgewotCQkJKChUZXh0RGlyZWN0RWRpdE1hbmFnZXIpIGdldE1hbmFnZXIoKSkuc2hvdyhpbml0aWFsQ2hhcmFjdGVyKTsKLQkJfSBlbHNlIHsKLQkJCXBlcmZvcm1EaXJlY3RFZGl0KCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURpcmVjdEVkaXRSZXF1ZXN0KFJlcXVlc3QgcmVxdWVzdCkgewotCQlmaW5hbCBSZXF1ZXN0IHRoZVJlcXVlc3QgPSByZXF1ZXN0OwotCQl0cnkgewotCQkJZ2V0RWRpdGluZ0RvbWFpbigpLnJ1bkV4Y2x1c2l2ZShuZXcgUnVubmFibGUoKSB7Ci0KLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCWlmIChpc0FjdGl2ZSgpICYmIGlzRWRpdGFibGUoKSkgewotCQkJCQkJaWYgKHRoZVJlcXVlc3QKLQkJCQkJCQkJLmdldEV4dGVuZGVkRGF0YSgpCi0JCQkJCQkJCS5nZXQoCi0JCQkJCQkJCQkJUmVxdWVzdENvbnN0YW50cy5SRVFfRElSRUNURURJVF9FWFRFTkRFRERBVEFfSU5JVElBTF9DSEFSKSBpbnN0YW5jZW9mIENoYXJhY3RlcikgewotCQkJCQkJCUNoYXJhY3RlciBpbml0aWFsQ2hhciA9IChDaGFyYWN0ZXIpIHRoZVJlcXVlc3QKLQkJCQkJCQkJCS5nZXRFeHRlbmRlZERhdGEoKQotCQkJCQkJCQkJLmdldCgKLQkJCQkJCQkJCQkJUmVxdWVzdENvbnN0YW50cy5SRVFfRElSRUNURURJVF9FWFRFTkRFRERBVEFfSU5JVElBTF9DSEFSKTsKLQkJCQkJCQlwZXJmb3JtRGlyZWN0RWRpdChpbml0aWFsQ2hhci5jaGFyVmFsdWUoKSk7Ci0JCQkJCQl9IGVsc2UgaWYgKCh0aGVSZXF1ZXN0IGluc3RhbmNlb2YgRGlyZWN0RWRpdFJlcXVlc3QpCi0JCQkJCQkJCSYmIChnZXRFZGl0VGV4dCgpLmVxdWFscyhnZXRMYWJlbFRleHQoKSkpKSB7Ci0JCQkJCQkJRGlyZWN0RWRpdFJlcXVlc3QgZWRpdFJlcXVlc3QgPSAoRGlyZWN0RWRpdFJlcXVlc3QpIHRoZVJlcXVlc3Q7Ci0JCQkJCQkJcGVyZm9ybURpcmVjdEVkaXQoZWRpdFJlcXVlc3QuZ2V0TG9jYXRpb24oKSk7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCXBlcmZvcm1EaXJlY3RFZGl0KCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9KTsKLQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoVmlzdWFscygpIHsKLQkJc3VwZXIucmVmcmVzaFZpc3VhbHMoKTsKLQkJcmVmcmVzaExhYmVsKCk7Ci0JCXJlZnJlc2hGb250KCk7Ci0JCXJlZnJlc2hGb250Q29sb3IoKTsKLQkJcmVmcmVzaFVuZGVybGluZSgpOwotCQlyZWZyZXNoU3RyaWtlVGhyb3VnaCgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoTGFiZWwoKSB7Ci0JCXNldExhYmVsVGV4dEhlbHBlcihnZXRGaWd1cmUoKSwgZ2V0TGFiZWxUZXh0KCkpOwotCQlzZXRMYWJlbEljb25IZWxwZXIoZ2V0RmlndXJlKCksIGdldExhYmVsSWNvbigpKTsKLQkJT2JqZWN0IHBkRWRpdFBvbGljeSA9IGdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSk7Ci0JCWlmIChwZEVkaXRQb2xpY3kgaW5zdGFuY2VvZiBVTUxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgewotCQkJKChVTUxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgcGRFZGl0UG9saWN5KS5yZWZyZXNoRmVlZGJhY2soKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoVW5kZXJsaW5lKCkgewotCQlGb250U3R5bGUgc3R5bGUgPSAoRm9udFN0eWxlKSBnZXRGb250U3R5bGVPd25lclZpZXcoKS5nZXRTdHlsZSgKLQkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZSgpKTsKLQkJaWYgKHN0eWxlICE9IG51bGwgJiYgZ2V0RmlndXJlKCkgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCSgoV3JhcExhYmVsKSBnZXRGaWd1cmUoKSkuc2V0VGV4dFVuZGVybGluZShzdHlsZS5pc1VuZGVybGluZSgpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoU3RyaWtlVGhyb3VnaCgpIHsKLQkJRm9udFN0eWxlIHN0eWxlID0gKEZvbnRTdHlsZSkgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkuZ2V0U3R5bGUoCi0JCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGUoKSk7Ci0JCWlmIChzdHlsZSAhPSBudWxsICYmIGdldEZpZ3VyZSgpIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQkoKFdyYXBMYWJlbCkgZ2V0RmlndXJlKCkpLnNldFRleHRTdHJpa2VUaHJvdWdoKHN0eWxlCi0JCQkJCS5pc1N0cmlrZVRocm91Z2goKSk7Ci0JCX0KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoRm9udCgpIHsKLQkJRm9udFN0eWxlIHN0eWxlID0gKEZvbnRTdHlsZSkgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkuZ2V0U3R5bGUoCi0JCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGUoKSk7Ci0JCWlmIChzdHlsZSAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgZm9udE5hbWUgPSBEaWFncmFtQ29uc3RhbnRzLmdldEZvbnROYW1lKHN0eWxlKTsKLQkJCUZvbnREYXRhIGZvbnREYXRhID0gbmV3IEZvbnREYXRhKGZvbnROYW1lLCBzdHlsZQotCQkJCQkuZ2V0Rm9udEhlaWdodCgpLCAoc3R5bGUuaXNCb2xkKCkgPyBTV1QuQk9MRCA6IFNXVC5OT1JNQUwpCi0JCQkJCXwgKHN0eWxlLmlzSXRhbGljKCkgPyBTV1QuSVRBTElDIDogU1dULk5PUk1BTCkpOwotCQkJc2V0Rm9udChmb250RGF0YSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0Rm9udENvbG9yKENvbG9yIGNvbG9yKSB7Ci0JCWdldEZpZ3VyZSgpLnNldEZvcmVncm91bmRDb2xvcihjb2xvcik7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFNlbWFudGljTGlzdGVuZXJzKCkgewotCQlpZiAoZ2V0UGFyc2VyKCkgaW5zdGFuY2VvZiBJU2VtYW50aWNQYXJzZXIpIHsKLQkJCUVPYmplY3QgZWxlbWVudCA9IHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKTsKLQkJCXBhcnNlckVsZW1lbnRzID0gKChJU2VtYW50aWNQYXJzZXIpIGdldFBhcnNlcigpKQotCQkJCQkuZ2V0U2VtYW50aWNFbGVtZW50c0JlaW5nUGFyc2VkKGVsZW1lbnQpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJzZXJFbGVtZW50cy5zaXplKCk7IGkrKykgewotCQkJCWFkZExpc3RlbmVyRmlsdGVyKAotCQkJCQkJIlNlbWFudGljTW9kZWwiICsgaSwgdGhpcywgKEVPYmplY3QpIHBhcnNlckVsZW1lbnRzLmdldChpKSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXN1cGVyLmFkZFNlbWFudGljTGlzdGVuZXJzKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlU2VtYW50aWNMaXN0ZW5lcnMoKSB7Ci0JCWlmIChwYXJzZXJFbGVtZW50cyAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcnNlckVsZW1lbnRzLnNpemUoKTsgaSsrKSB7Ci0JCQkJcmVtb3ZlTGlzdGVuZXJGaWx0ZXIoIlNlbWFudGljTW9kZWwiICsgaSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXN1cGVyLnJlbW92ZVNlbWFudGljTGlzdGVuZXJzKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEFjY2Vzc2libGVFZGl0UGFydCBnZXRBY2Nlc3NpYmxlRWRpdFBhcnQoKSB7Ci0JCWlmIChhY2Nlc3NpYmxlRVAgPT0gbnVsbCkgewotCQkJYWNjZXNzaWJsZUVQID0gbmV3IEFjY2Vzc2libGVHcmFwaGljYWxFZGl0UGFydCgpIHsKLQotCQkJCXB1YmxpYyB2b2lkIGdldE5hbWUoQWNjZXNzaWJsZUV2ZW50IGUpIHsKLQkJCQkJZS5yZXN1bHQgPSBnZXRMYWJlbFRleHRIZWxwZXIoZ2V0RmlndXJlKCkpOwotCQkJCX0KLQkJCX07Ci0JCX0KLQkJcmV0dXJuIGFjY2Vzc2libGVFUDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBWaWV3IGdldEZvbnRTdHlsZU93bmVyVmlldygpIHsKLQkJcmV0dXJuIGdldFByaW1hcnlWaWV3KCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGhhbmRsZU5vdGlmaWNhdGlvbkV2ZW50KE5vdGlmaWNhdGlvbiBldmVudCkgewotCQlPYmplY3QgZmVhdHVyZSA9IGV2ZW50LmdldEZlYXR1cmUoKTsKLQkJaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0ZvbnRDb2xvcigpLmVxdWFscyhmZWF0dXJlKSkgewotCQkJSW50ZWdlciBjID0gKEludGVnZXIpIGV2ZW50LmdldE5ld1ZhbHVlKCk7Ci0JCQlzZXRGb250Q29sb3IoRGlhZ3JhbUNvbG9yUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXRDb2xvcihjKSk7Ci0JCX0gZWxzZSBpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfVW5kZXJsaW5lKCkuZXF1YWxzKAotCQkJCWZlYXR1cmUpKSB7Ci0JCQlyZWZyZXNoVW5kZXJsaW5lKCk7Ci0JCX0gZWxzZSBpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfU3RyaWtlVGhyb3VnaCgpCi0JCQkJLmVxdWFscyhmZWF0dXJlKSkgewotCQkJcmVmcmVzaFN0cmlrZVRocm91Z2goKTsKLQkJfSBlbHNlIGlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Gb250SGVpZ2h0KCkuZXF1YWxzKAotCQkJCWZlYXR1cmUpCi0JCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfRm9udE5hbWUoKS5lcXVhbHMoCi0JCQkJCQlmZWF0dXJlKQotCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0JvbGQoKQotCQkJCQkJLmVxdWFscyhmZWF0dXJlKQotCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0l0YWxpYygpLmVxdWFscygKLQkJCQkJCWZlYXR1cmUpKSB7Ci0JCQlyZWZyZXNoRm9udCgpOwotCQl9IGVsc2UgewotCQkJaWYgKGdldFBhcnNlcigpICE9IG51bGwKLQkJCQkJJiYgZ2V0UGFyc2VyKCkuaXNBZmZlY3RpbmdFdmVudChldmVudCwKLQkJCQkJCQlnZXRQYXJzZXJPcHRpb25zKCkuaW50VmFsdWUoKSkpIHsKLQkJCQlyZWZyZXNoTGFiZWwoKTsKLQkJCX0KLQkJCWlmIChnZXRQYXJzZXIoKSBpbnN0YW5jZW9mIElTZW1hbnRpY1BhcnNlcikgewotCQkJCUlTZW1hbnRpY1BhcnNlciBtb2RlbFBhcnNlciA9IChJU2VtYW50aWNQYXJzZXIpIGdldFBhcnNlcigpOwotCQkJCWlmIChtb2RlbFBhcnNlci5hcmVTZW1hbnRpY0VsZW1lbnRzQWZmZWN0ZWQobnVsbCwgZXZlbnQpKSB7Ci0JCQkJCXJlbW92ZVNlbWFudGljTGlzdGVuZXJzKCk7Ci0JCQkJCWlmIChyZXNvbHZlU2VtYW50aWNFbGVtZW50KCkgIT0gbnVsbCkgewotCQkJCQkJYWRkU2VtYW50aWNMaXN0ZW5lcnMoKTsKLQkJCQkJfQotCQkJCQlyZWZyZXNoTGFiZWwoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJc3VwZXIuaGFuZGxlTm90aWZpY2F0aW9uRXZlbnQoZXZlbnQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVGaWd1cmUoKSB7Ci0JCUlGaWd1cmUgbGFiZWwgPSBjcmVhdGVGaWd1cmVQcmltKCk7Ci0JCWRlZmF1bHRUZXh0ID0gZ2V0TGFiZWxUZXh0SGVscGVyKGxhYmVsKTsKLQkJcmV0dXJuIGxhYmVsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVGaWd1cmVQcmltKCkgewotCQlyZXR1cm4gbmV3IFdyYXBMYWJlbCgpOwotCX0KLQotCS8qKgotCSAqIFRPRE86IERpc2FibGVzIGRpcmVjdCBlZGl0IGZvciBub3cgdW50aWwgdGhlIGlzc3VlIHdpdGggZHVwbGljYXRlIGxhYmVscyBpcyBmaXhlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHBlcmZvcm1SZXF1ZXN0KFJlcXVlc3QgcmVxdWVzdCkgewotCQlpZiAoUmVxdWVzdENvbnN0YW50cy5SRVFfRElSRUNUX0VESVQgIT0gcmVxdWVzdC5nZXRUeXBlKCkpIHsKLSAgICAgICAgCXN1cGVyLnBlcmZvcm1SZXF1ZXN0KHJlcXVlc3QpOwotICAgICAgICB9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcGFydHMvSm9pbk5vZGVFZGl0UGFydC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcGFydHMvSm9pbk5vZGVFZGl0UGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMDk5NGJhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BhcnRzL0pvaW5Ob2RlRWRpdFBhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuU3RhY2tMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmN1c3RvbS5wb2xpY2llcy5EeW5hbWljUmVzaXplRGlyZWN0aW9uc0VkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wb2xpY2llcy5Kb2luTm9kZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS51dGlsLkRpYWdyYW1Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuTGF5b3V0RWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLk5vblJlc2l6YWJsZUVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLkNyZWF0ZVJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuU2hhcGVOb2RlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuRWRpdFBvbGljeVJvbGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkubDEwbi5EaWFncmFtQ29sb3JSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5Db25zdHJhaW5lZFRvb2xiYXJMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZ2VmLnVpLmZpZ3VyZXMuRGVmYXVsdFNpemVOb2RlRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmdlZi51aS5maWd1cmVzLk5vZGVGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRmlsbFN0eWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vdGF0aW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBKb2luTm9kZUVkaXRQYXJ0IGV4dGVuZHMgU2hhcGVOb2RlRWRpdFBhcnQgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZJU1VBTF9JRCA9IDEwMDY7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgY29udGVudFBhbmU7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgcHJpbWFyeVNoYXBlOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBKb2luTm9kZUVkaXRQYXJ0KFZpZXcgdmlldykgewotCQlzdXBlcih2aWV3KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpIHsKLQotCQlzdXBlci5jcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5TRU1BTlRJQ19ST0xFLAotCQkJCW5ldyBKb2luTm9kZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3koKSk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuTEFZT1VUX1JPTEUsIGNyZWF0ZUxheW91dEVkaXRQb2xpY3koKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBMYXlvdXRFZGl0UG9saWN5IGNyZWF0ZUxheW91dEVkaXRQb2xpY3koKSB7Ci0JCUxheW91dEVkaXRQb2xpY3kgbGVwID0gbmV3IExheW91dEVkaXRQb2xpY3koKSB7Ci0KLQkJCXByb3RlY3RlZCBFZGl0UG9saWN5IGNyZWF0ZUNoaWxkRWRpdFBvbGljeShFZGl0UGFydCBjaGlsZCkgewotCQkJCUVkaXRQb2xpY3kgcmVzdWx0ID0gY2hpbGQKLQkJCQkJCS5nZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgewotCQkJCQlyZXN1bHQgPSBuZXcgTm9uUmVzaXphYmxlRWRpdFBvbGljeSgpOwotCQkJCX0KLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCi0JCQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRNb3ZlQ2hpbGRyZW5Db21tYW5kKFJlcXVlc3QgcmVxdWVzdCkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCi0JCQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVDb21tYW5kKENyZWF0ZVJlcXVlc3QgcmVxdWVzdCkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9OwotCQlyZXR1cm4gbGVwOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVOb2RlU2hhcGUoKSB7Ci0JCUZvcmtOb2RlRmlndXJlIGZpZ3VyZSA9IG5ldyBGb3JrTm9kZUZpZ3VyZSgpOwotCQlyZXR1cm4gcHJpbWFyeVNoYXBlID0gZmlndXJlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRm9ya05vZGVGaWd1cmUgZ2V0UHJpbWFyeVNoYXBlKCkgewotCQlyZXR1cm4gKEZvcmtOb2RlRmlndXJlKSBwcmltYXJ5U2hhcGU7Ci0JfQotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJvdGVjdGVkIE5vZGVGaWd1cmUgY3JlYXRlTm9kZVBsYXRlKCkgewotCQlyZXR1cm4gbmV3IERlZmF1bHRTaXplTm9kZUZpZ3VyZShnZXRNYXBNb2RlKCkuRFB0b0xQKDEwMCksIGdldE1hcE1vZGUoKQotCQkJCS5EUHRvTFAoNSkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRWRpdFBvbGljeSBnZXRQcmltYXJ5RHJhZ0VkaXRQb2xpY3koKSB7Ci0vLwkJRWRpdFBvbGljeSByZXN1bHQgPSBzdXBlci5nZXRQcmltYXJ5RHJhZ0VkaXRQb2xpY3koKTsKLS8vCQlpZiAocmVzdWx0IGluc3RhbmNlb2YgUmVzaXphYmxlRWRpdFBvbGljeSkgewotLy8JCQlSZXNpemFibGVFZGl0UG9saWN5IGVwID0gKFJlc2l6YWJsZUVkaXRQb2xpY3kpIHJlc3VsdDsKLS8vCQkJZXAuc2V0UmVzaXplRGlyZWN0aW9ucyhQb3NpdGlvbkNvbnN0YW50cy5XRVNUCi0vLwkJCQkJfCBQb3NpdGlvbkNvbnN0YW50cy5FQVNUKTsKLS8vCQl9Ci0vLwkJcmV0dXJuIHJlc3VsdDsKLQkJCi0JCXJldHVybiBuZXcgRHluYW1pY1Jlc2l6ZURpcmVjdGlvbnNFZGl0UG9saWN5KCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBmaWd1cmUgZm9yIHRoaXMgZWRpdCBwYXJ0LgotCSAqIAotCSAqIEJvZHkgb2YgdGhpcyBtZXRob2QgZG9lcyBub3QgZGVwZW5kIG9uIHNldHRpbmdzIGluIGdlbmVyYXRpb24gbW9kZWwKLQkgKiBzbyB5b3UgbWF5IHNhZmVseSByZW1vdmUgPGk+Z2VuZXJhdGVkPC9pPiB0YWcgYW5kIG1vZGlmeSBpdC4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE5vZGVGaWd1cmUgY3JlYXRlTm9kZUZpZ3VyZSgpIHsKLQkJTm9kZUZpZ3VyZSBmaWd1cmUgPSBjcmVhdGVOb2RlUGxhdGUoKTsKLQkJZmlndXJlLnNldExheW91dE1hbmFnZXIobmV3IFN0YWNrTGF5b3V0KCkpOwotCQlJRmlndXJlIHNoYXBlID0gY3JlYXRlTm9kZVNoYXBlKCk7Ci0JCWZpZ3VyZS5hZGQoc2hhcGUpOwotCQljb250ZW50UGFuZSA9IHNldHVwQ29udGVudFBhbmUoc2hhcGUpOwotCQlyZXR1cm4gZmlndXJlOwotCX0KLQotCS8qKgotCSAqIERlZmF1bHQgaW1wbGVtZW50YXRpb24gdHJlYXRzIHBhc3NlZCBmaWd1cmUgYXMgY29udGVudCBwYW5lLgotCSAqIFJlc3BlY3RzIGxheW91dCBvbmUgbWF5IGhhdmUgc2V0IGZvciBnZW5lcmF0ZWQgZmlndXJlLgotCSAqIEBwYXJhbSBub2RlU2hhcGUgaW5zdGFuY2Ugb2YgZ2VuZXJhdGVkIGZpZ3VyZSBjbGFzcwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBzZXR1cENvbnRlbnRQYW5lKElGaWd1cmUgbm9kZVNoYXBlKSB7Ci0JCWlmIChub2RlU2hhcGUuZ2V0TGF5b3V0TWFuYWdlcigpID09IG51bGwpIHsKLQkJCUNvbnN0cmFpbmVkVG9vbGJhckxheW91dCBsYXlvdXQgPSBuZXcgQ29uc3RyYWluZWRUb29sYmFyTGF5b3V0KCk7Ci0JCQlsYXlvdXQuc2V0U3BhY2luZyhnZXRNYXBNb2RlKCkuRFB0b0xQKDUpKTsKLQkJCW5vZGVTaGFwZS5zZXRMYXlvdXRNYW5hZ2VyKGxheW91dCk7Ci0JCX0KLQkJcmV0dXJuIG5vZGVTaGFwZTsgLy8gdXNlIG5vZGVTaGFwZSBpdHNlbGYgYXMgY29udGVudFBhbmUKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElGaWd1cmUgZ2V0Q29udGVudFBhbmUoKSB7Ci0JCWlmIChjb250ZW50UGFuZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gY29udGVudFBhbmU7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldENvbnRlbnRQYW5lKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBjbGFzcyBGb3JrTm9kZUZpZ3VyZSBleHRlbmRzIFJlY3RhbmdsZUZpZ3VyZSB7Ci0KLQkJLyoqCi0JCSAqIEBtb2RpZmllZAotCQkgKi8KLQkJcHVibGljIEZvcmtOb2RlRmlndXJlKCkgewotCi0JCQlGaWxsU3R5bGUgc3R5bGUgPSAoRmlsbFN0eWxlKSBnZXRQcmltYXJ5VmlldygpLmdldFN0eWxlKAotCQkJCQlOb3RhdGlvblBhY2thZ2UuTGl0ZXJhbHMuRklMTF9TVFlMRSk7Ci0JCQlpZiAoc3R5bGUgIT0gbnVsbAotCQkJCQkmJiBzdHlsZS5nZXRGaWxsQ29sb3IoKSAhPSBEaWFncmFtQ29uc3RhbnRzLkZJTExfQ09MT1JfRURFRkFVTFQpIHsKLQkJCQlzZXRCYWNrZ3JvdW5kQ29sb3IoRGlhZ3JhbUNvbG9yUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXRDb2xvcigKLQkJCQkJCW5ldyBJbnRlZ2VyKHN0eWxlLmdldEZpbGxDb2xvcigpKSkpOwotCQkJfSBlbHNlIHsKLQkJCQl0aGlzLnNldEJhY2tncm91bmRDb2xvcihGT1JLTk9ERUZJR1VSRV9CQUNLKTsKLQkJCX0KLQkJCXRoaXMuc2V0UHJlZmVycmVkU2l6ZShnZXRNYXBNb2RlKCkuRFB0b0xQKDEwMCksIGdldE1hcE1vZGUoKQotCQkJCQkuRFB0b0xQKDgpKTsKLQkJCXRoaXMuc2V0U2l6ZShnZXRNYXBNb2RlKCkuRFB0b0xQKDEwMCksIGdldE1hcE1vZGUoKS5EUHRvTFAoOCkpOwotCQkJY3JlYXRlQ29udGVudHMoKTsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIHZvaWQgY3JlYXRlQ29udGVudHMoKSB7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSBib29sZWFuIG15VXNlTG9jYWxDb29yZGluYXRlcyA9IGZhbHNlOwotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcm90ZWN0ZWQgYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKCkgewotCQkJcmV0dXJuIG15VXNlTG9jYWxDb29yZGluYXRlczsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcm90ZWN0ZWQgdm9pZCBzZXRVc2VMb2NhbENvb3JkaW5hdGVzKGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcykgewotCQkJbXlVc2VMb2NhbENvb3JkaW5hdGVzID0gdXNlTG9jYWxDb29yZGluYXRlczsKLQkJfQotCi0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29sb3IgRk9SS05PREVGSUdVUkVfQkFDSyA9IG5ldyBDb2xvcihudWxsLCA0NSwgODUsIDEzMCk7Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVOb3RpZmljYXRpb25FdmVudChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJT2JqZWN0IGZlYXR1cmUgPSBub3RpZmljYXRpb24uZ2V0RmVhdHVyZSgpOwotCQlpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRTaXplX1dpZHRoKCkuZXF1YWxzKGZlYXR1cmUpCi0JCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRTaXplX0hlaWdodCgpLmVxdWFscyhmZWF0dXJlKQotCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TG9jYXRpb25fWCgpLmVxdWFscyhmZWF0dXJlKQotCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TG9jYXRpb25fWSgpLmVxdWFscyhmZWF0dXJlKSkgewotCQkJcmVmcmVzaEJvdW5kcygpOwotCQl9IGVsc2UgaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RmlsbFN0eWxlX0ZpbGxDb2xvcigpLmVxdWFscygKLQkJCQlmZWF0dXJlKSkgewotCQkJSW50ZWdlciBjID0gKEludGVnZXIpIG5vdGlmaWNhdGlvbi5nZXROZXdWYWx1ZSgpOwotCQkJc2V0QmFja2dyb3VuZENvbG9yKERpYWdyYW1Db2xvclJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0Q29sb3IoYykpOwotCQkJZ2V0UHJpbWFyeVNoYXBlKCkuc2V0QmFja2dyb3VuZENvbG9yKAotCQkJCQlEaWFncmFtQ29sb3JSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldENvbG9yKGMpKTsKLQkJfSBlbHNlIGlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldExpbmVTdHlsZV9MaW5lQ29sb3IoKS5lcXVhbHMoCi0JCQkJZmVhdHVyZSkpIHsKLQkJCUludGVnZXIgYyA9IChJbnRlZ2VyKSBub3RpZmljYXRpb24uZ2V0TmV3VmFsdWUoKTsKLQkJCXNldEZvcmVncm91bmRDb2xvcihEaWFncmFtQ29sb3JSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldENvbG9yKGMpKTsKLQkJCWdldFByaW1hcnlTaGFwZSgpLnNldEZvcmVncm91bmRDb2xvcigKLQkJCQkJRGlhZ3JhbUNvbG9yUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXRDb2xvcihjKSk7Ci0JCX0gZWxzZSBpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGUoKS5pc0luc3RhbmNlKAotCQkJCW5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpKSkKLQkJCXJlZnJlc2hGb250KCk7Ci0JCWVsc2UgaWYgKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlKCkgPT0gTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRWaWV3X0VsZW1lbnQoKQotCQkJCSYmICgoRU9iamVjdCkgbm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCkpID09IGdldE5vdGF0aW9uVmlldygpKQotCQkJaGFuZGxlTWFqb3JTZW1hbnRpY0NoYW5nZSgpOwotCQllbHNlCi0JCQlzdXBlci5oYW5kbGVOb3RpZmljYXRpb25FdmVudChub3RpZmljYXRpb24pOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcGFydHMvTWVyZ2VOb2RlRWRpdFBhcnQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BhcnRzL01lcmdlTm9kZUVkaXRQYXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyMjlhMGEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcGFydHMvTWVyZ2VOb2RlRWRpdFBhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyMiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkNvbG9yQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5TdGFja0xheW91dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5jdXN0b20uZmlndXJlcy5EZWNpc2lvbk5vZGVGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wb2xpY2llcy5NZXJnZU5vZGVDYW5vbmljYWxFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucG9saWNpZXMuTWVyZ2VOb2RlR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wb2xpY2llcy5NZXJnZU5vZGVJdGVtU2VtYW50aWNFZGl0UG9saWN5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQucGFydC5VTUxWaXN1YWxJRFJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUudXRpbC5EaWFncmFtQ29uc3RhbnRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLkxheW91dEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5Ob25SZXNpemFibGVFZGl0UG9saWN5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLkNyZWF0ZVJlcXVlc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5TaGFwZU5vZGVFZGl0UGFydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkVkaXRQb2xpY3lSb2xlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmwxMG4uRGlhZ3JhbUNvbG9yUmVnaXN0cnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5Db25zdHJhaW5lZFRvb2xiYXJMYXlvdXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZ2VmLnVpLmZpZ3VyZXMuRGVmYXVsdFNpemVOb2RlRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmdlZi51aS5maWd1cmVzLk5vZGVGaWd1cmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5GaWxsU3R5bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTGluZVN0eWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vdGF0aW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXJnZU5vZGVFZGl0UGFydCBleHRlbmRzIFNoYXBlTm9kZUVkaXRQYXJ0IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWSVNVQUxfSUQgPSAxMDAyOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJRmlndXJlIGNvbnRlbnRQYW5lOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJRmlndXJlIHByaW1hcnlTaGFwZTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTWVyZ2VOb2RlRWRpdFBhcnQoVmlldyB2aWV3KSB7Ci0JCXN1cGVyKHZpZXcpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCkgewotCi0JCXN1cGVyLmNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKTsKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLlNFTUFOVElDX1JPTEUsCi0JCQkJbmV3IE1lcmdlTm9kZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3koKSk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuTEFZT1VUX1JPTEUsIGNyZWF0ZUxheW91dEVkaXRQb2xpY3koKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBMYXlvdXRFZGl0UG9saWN5IGNyZWF0ZUxheW91dEVkaXRQb2xpY3koKSB7Ci0JCUxheW91dEVkaXRQb2xpY3kgbGVwID0gbmV3IExheW91dEVkaXRQb2xpY3koKSB7Ci0KLQkJCXByb3RlY3RlZCBFZGl0UG9saWN5IGNyZWF0ZUNoaWxkRWRpdFBvbGljeShFZGl0UGFydCBjaGlsZCkgewotCQkJCUVkaXRQb2xpY3kgcmVzdWx0ID0gY2hpbGQKLQkJCQkJCS5nZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgewotCQkJCQlyZXN1bHQgPSBuZXcgTm9uUmVzaXphYmxlRWRpdFBvbGljeSgpOwotCQkJCX0KLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCi0JCQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRNb3ZlQ2hpbGRyZW5Db21tYW5kKFJlcXVlc3QgcmVxdWVzdCkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCi0JCQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVDb21tYW5kKENyZWF0ZVJlcXVlc3QgcmVxdWVzdCkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9OwotCQlyZXR1cm4gbGVwOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVOb2RlU2hhcGUoKSB7Ci0JCURlY2lzaW9uRGlhbW9uZEZpZ3VyZSBmaWd1cmUgPSBuZXcgRGVjaXNpb25EaWFtb25kRmlndXJlKCk7Ci0JCXJldHVybiBwcmltYXJ5U2hhcGUgPSBmaWd1cmU7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEZWNpc2lvbkRpYW1vbmRGaWd1cmUgZ2V0UHJpbWFyeVNoYXBlKCkgewotCQlyZXR1cm4gKERlY2lzaW9uRGlhbW9uZEZpZ3VyZSkgcHJpbWFyeVNoYXBlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTm9kZUZpZ3VyZSBjcmVhdGVOb2RlUGxhdGUoKSB7Ci0JCURlZmF1bHRTaXplTm9kZUZpZ3VyZSByZXN1bHQgPSBuZXcgRGVmYXVsdFNpemVOb2RlRmlndXJlKGdldE1hcE1vZGUoKQotCQkJCS5EUHRvTFAoNDApLCBnZXRNYXBNb2RlKCkuRFB0b0xQKDQwKSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBmaWd1cmUgZm9yIHRoaXMgZWRpdCBwYXJ0LgotCSAqIAotCSAqIEJvZHkgb2YgdGhpcyBtZXRob2QgZG9lcyBub3QgZGVwZW5kIG9uIHNldHRpbmdzIGluIGdlbmVyYXRpb24gbW9kZWwKLQkgKiBzbyB5b3UgbWF5IHNhZmVseSByZW1vdmUgPGk+Z2VuZXJhdGVkPC9pPiB0YWcgYW5kIG1vZGlmeSBpdC4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE5vZGVGaWd1cmUgY3JlYXRlTm9kZUZpZ3VyZSgpIHsKLQkJTm9kZUZpZ3VyZSBmaWd1cmUgPSBjcmVhdGVOb2RlUGxhdGUoKTsKLQkJZmlndXJlLnNldExheW91dE1hbmFnZXIobmV3IFN0YWNrTGF5b3V0KCkpOwotCQlJRmlndXJlIHNoYXBlID0gY3JlYXRlTm9kZVNoYXBlKCk7Ci0JCWZpZ3VyZS5hZGQoc2hhcGUpOwotCQljb250ZW50UGFuZSA9IHNldHVwQ29udGVudFBhbmUoc2hhcGUpOwotCQlyZXR1cm4gZmlndXJlOwotCX0KLQotCS8qKgotCSAqIERlZmF1bHQgaW1wbGVtZW50YXRpb24gdHJlYXRzIHBhc3NlZCBmaWd1cmUgYXMgY29udGVudCBwYW5lLgotCSAqIFJlc3BlY3RzIGxheW91dCBvbmUgbWF5IGhhdmUgc2V0IGZvciBnZW5lcmF0ZWQgZmlndXJlLgotCSAqIEBwYXJhbSBub2RlU2hhcGUgaW5zdGFuY2Ugb2YgZ2VuZXJhdGVkIGZpZ3VyZSBjbGFzcwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBzZXR1cENvbnRlbnRQYW5lKElGaWd1cmUgbm9kZVNoYXBlKSB7Ci0JCWlmIChub2RlU2hhcGUuZ2V0TGF5b3V0TWFuYWdlcigpID09IG51bGwpIHsKLQkJCUNvbnN0cmFpbmVkVG9vbGJhckxheW91dCBsYXlvdXQgPSBuZXcgQ29uc3RyYWluZWRUb29sYmFyTGF5b3V0KCk7Ci0JCQlsYXlvdXQuc2V0U3BhY2luZyhnZXRNYXBNb2RlKCkuRFB0b0xQKDUpKTsKLQkJCW5vZGVTaGFwZS5zZXRMYXlvdXRNYW5hZ2VyKGxheW91dCk7Ci0JCX0KLQkJcmV0dXJuIG5vZGVTaGFwZTsgLy8gdXNlIG5vZGVTaGFwZSBpdHNlbGYgYXMgY29udGVudFBhbmUKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElGaWd1cmUgZ2V0Q29udGVudFBhbmUoKSB7Ci0JCWlmIChjb250ZW50UGFuZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gY29udGVudFBhbmU7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldENvbnRlbnRQYW5lKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFZGl0UGFydCBnZXRQcmltYXJ5Q2hpbGRFZGl0UGFydCgpIHsKLQkJcmV0dXJuIGdldENoaWxkQnlTZW1hbnRpY0hpbnQoVU1MVmlzdWFsSURSZWdpc3RyeQotCQkJCS5nZXRUeXBlKE1lcmdlTm9kZU5hbWVFZGl0UGFydC5WSVNVQUxfSUQpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGNsYXNzIERlY2lzaW9uRGlhbW9uZEZpZ3VyZSBleHRlbmRzIERlY2lzaW9uTm9kZUZpZ3VyZSB7Ci0KLQkJLyoqCi0JCSAqIEBtb2RpZmllZAotCQkgKi8KLQkJcHVibGljIERlY2lzaW9uRGlhbW9uZEZpZ3VyZSgpIHsKLQotCQkJc3VwZXIoZ2V0TWFwTW9kZSgpLkRQdG9MUCg1MCksIGdldE1hcE1vZGUoKS5EUHRvTFAoNTApLAotCQkJCQlnZXRNYXBNb2RlKCkuRFB0b0xQKDUwKSk7IC8vbW9kaWZpZWQKLQkJCUxpbmVTdHlsZSBsaW5lc3R5bGUgPSAoTGluZVN0eWxlKSBnZXRQcmltYXJ5VmlldygpLmdldFN0eWxlKAotCQkJCQlOb3RhdGlvblBhY2thZ2UuTGl0ZXJhbHMuTElORV9TVFlMRSk7Ci0JCQlpZiAobGluZXN0eWxlICE9IG51bGwKLQkJCQkJJiYgbGluZXN0eWxlLmdldExpbmVDb2xvcigpICE9IERpYWdyYW1Db25zdGFudHMuTElORV9DT0xPUl9FREVGQVVMVCkgewotCQkJCXRoaXMuc2V0Rm9yZWdyb3VuZENvbG9yKERpYWdyYW1Db2xvclJlZ2lzdHJ5LmdldEluc3RhbmNlKCkKLQkJCQkJCS5nZXRDb2xvcihuZXcgSW50ZWdlcihsaW5lc3R5bGUuZ2V0TGluZUNvbG9yKCkpKSk7Ci0JCQl9IGVsc2UgewotCQkJCXRoaXMKLQkJCQkJCS5zZXRGb3JlZ3JvdW5kQ29sb3Iob3JnLmVjbGlwc2UuZHJhdzJkLkNvbG9yQ29uc3RhbnRzLmRhcmtCbHVlKTsKLQkJCX0KLQotCQkJRmlsbFN0eWxlIHN0eWxlID0gKEZpbGxTdHlsZSkgZ2V0UHJpbWFyeVZpZXcoKS5nZXRTdHlsZSgKLQkJCQkJTm90YXRpb25QYWNrYWdlLkxpdGVyYWxzLkZJTExfU1RZTEUpOwotCQkJaWYgKHN0eWxlICE9IG51bGwKLQkJCQkJJiYgc3R5bGUuZ2V0RmlsbENvbG9yKCkgIT0gRGlhZ3JhbUNvbnN0YW50cy5GSUxMX0NPTE9SX0VERUZBVUxUKSB7Ci0JCQkJdGhpcy5zZXRCYWNrZ3JvdW5kQ29sb3IoRGlhZ3JhbUNvbG9yUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKQotCQkJCQkJLmdldENvbG9yKG5ldyBJbnRlZ2VyKHN0eWxlLmdldEZpbGxDb2xvcigpKSkpOwotCQkJfSBlbHNlIHsKLQkJCQl0aGlzLnNldEJhY2tncm91bmRDb2xvcihERUNJU0lPTkRJQU1PTkRGSUdVUkVfQkFDSyk7Ci0JCQl9Ci0JCQl0aGlzLnNldFByZWZlcnJlZFNpemUoZ2V0TWFwTW9kZSgpLkRQdG9MUCg1MCksIGdldE1hcE1vZGUoKS5EUHRvTFAoCi0JCQkJCTUwKSk7Ci0JCQl0aGlzLnNldFNpemUoZ2V0TWFwTW9kZSgpLkRQdG9MUCg1MCksIGdldE1hcE1vZGUoKS5EUHRvTFAoNTApKTsKLQotCQkJY3JlYXRlQ29udGVudHMoKTsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIHZvaWQgY3JlYXRlQ29udGVudHMoKSB7Ci0JCQlXcmFwTGFiZWwgZmlnXzAgPSBuZXcgV3JhcExhYmVsKCk7Ci0KLQkJCXNldEZpZ3VyZURpYW1vbmRMYWJlbChmaWdfMCk7Ci0KLQkJCU9iamVjdCBsYXlEYXRhMCA9IG51bGw7Ci0KLQkJCXRoaXMuYWRkKGZpZ18wLCBsYXlEYXRhMCk7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSBXcmFwTGFiZWwgZkRpYW1vbmRMYWJlbDsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIFdyYXBMYWJlbCBnZXRGaWd1cmVEaWFtb25kTGFiZWwoKSB7Ci0JCQlyZXR1cm4gZkRpYW1vbmRMYWJlbDsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIHZvaWQgc2V0RmlndXJlRGlhbW9uZExhYmVsKFdyYXBMYWJlbCBmaWcpIHsKLQkJCWZEaWFtb25kTGFiZWwgPSBmaWc7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSBib29sZWFuIG15VXNlTG9jYWxDb29yZGluYXRlcyA9IGZhbHNlOwotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcm90ZWN0ZWQgYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKCkgewotCQkJcmV0dXJuIG15VXNlTG9jYWxDb29yZGluYXRlczsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcm90ZWN0ZWQgdm9pZCBzZXRVc2VMb2NhbENvb3JkaW5hdGVzKGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcykgewotCQkJbXlVc2VMb2NhbENvb3JkaW5hdGVzID0gdXNlTG9jYWxDb29yZGluYXRlczsKLQkJfQotCi0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29sb3IgREVDSVNJT05ESUFNT05ERklHVVJFX0JBQ0sgPSBuZXcgQ29sb3IobnVsbCwgMTg1LAotCQkJMjA1LCAyMzApOwotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlTm90aWZpY2F0aW9uRXZlbnQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCU9iamVjdCBmZWF0dXJlID0gbm90aWZpY2F0aW9uLmdldEZlYXR1cmUoKTsKLQkJaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2l6ZV9XaWR0aCgpLmVxdWFscyhmZWF0dXJlKQotCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2l6ZV9IZWlnaHQoKS5lcXVhbHMoZmVhdHVyZSkKLQkJCQl8fCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldExvY2F0aW9uX1goKS5lcXVhbHMoZmVhdHVyZSkKLQkJCQl8fCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldExvY2F0aW9uX1koKS5lcXVhbHMoZmVhdHVyZSkpIHsKLQkJCXJlZnJlc2hCb3VuZHMoKTsKLQkJfSBlbHNlIGlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZpbGxTdHlsZV9GaWxsQ29sb3IoKS5lcXVhbHMoCi0JCQkJZmVhdHVyZSkpIHsKLQkJCUludGVnZXIgYyA9IChJbnRlZ2VyKSBub3RpZmljYXRpb24uZ2V0TmV3VmFsdWUoKTsKLQkJCXNldEJhY2tncm91bmRDb2xvcihEaWFncmFtQ29sb3JSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldENvbG9yKGMpKTsKLQkJCWdldFByaW1hcnlTaGFwZSgpLnNldEJhY2tncm91bmRDb2xvcigKLQkJCQkJRGlhZ3JhbUNvbG9yUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXRDb2xvcihjKSk7Ci0JCX0gZWxzZSBpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRMaW5lU3R5bGVfTGluZUNvbG9yKCkuZXF1YWxzKAotCQkJCWZlYXR1cmUpKSB7Ci0JCQlJbnRlZ2VyIGMgPSAoSW50ZWdlcikgbm90aWZpY2F0aW9uLmdldE5ld1ZhbHVlKCk7Ci0JCQlzZXRGb3JlZ3JvdW5kQ29sb3IoRGlhZ3JhbUNvbG9yUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXRDb2xvcihjKSk7Ci0JCQlnZXRQcmltYXJ5U2hhcGUoKS5zZXRGb3JlZ3JvdW5kQ29sb3IoCi0JCQkJCURpYWdyYW1Db2xvclJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0Q29sb3IoYykpOwotCQl9IGVsc2UgaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlKCkuaXNJbnN0YW5jZSgKLQkJCQlub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKSkpCi0JCQlyZWZyZXNoRm9udCgpOwotCQllbHNlIGlmIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZSgpID09IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0Vmlld19FbGVtZW50KCkKLQkJCQkmJiAoKEVPYmplY3QpIG5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpKSA9PSBnZXROb3RhdGlvblZpZXcoKSkKLQkJCWhhbmRsZU1ham9yU2VtYW50aWNDaGFuZ2UoKTsKLQkJZWxzZQotCQkJc3VwZXIuaGFuZGxlTm90aWZpY2F0aW9uRXZlbnQobm90aWZpY2F0aW9uKTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wYXJ0cy9NZXJnZU5vZGVOYW1lRWRpdFBhcnQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BhcnRzL01lcmdlTm9kZU5hbWVFZGl0UGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOTZlOWUyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BhcnRzL01lcmdlTm9kZU5hbWVFZGl0UGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjcwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5HcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLk5vblJlc2l6YWJsZUVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmhhbmRsZXMuTm9uUmVzaXphYmxlSGFuZGxlS2l0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklUZXh0QXdhcmVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5MYWJlbERpcmVjdEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTGFiZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5SdW5uYWJsZVdpdGhSZXN1bHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBvbGljaWVzLlVNTFRleHRTZWxlY3Rpb25FZGl0UG9saWN5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQucHJvdmlkZXJzLlVNTEVsZW1lbnRUeXBlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnV0aWwuRGlhZ3JhbUNvbnN0YW50czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5BY2Nlc3NpYmxlRWRpdFBhcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuRGlyZWN0RWRpdFJlcXVlc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYudG9vbHMuRGlyZWN0RWRpdE1hbmFnZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLklQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5JUGFyc2VyRWRpdFN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLlBhcnNlckVkaXRTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5QYXJzZXJPcHRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuUGFyc2VyU2VydmljZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLkNvbXBhcnRtZW50RWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUdyYXBoaWNhbEVkaXRQYXJ0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5sMTBuLkRpYWdyYW1Db2xvclJlZ2lzdHJ5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXF1ZXN0cy5SZXF1ZXN0Q29uc3RhbnRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS50b29scy5UZXh0RGlyZWN0RWRpdE1hbmFnZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29yZS51dGlsLkVPYmplY3RBZGFwdGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5JRWxlbWVudFR5cGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudWkuc2VydmljZXMucGFyc2VyLklTZW1hbnRpY1BhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudWkuc2VydmljZXMucGFyc2VyLlBhcnNlckhpbnRBZGFwdGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRm9udFN0eWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vdGF0aW9uUGFja2FnZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGVudEFzc2lzdFByb2Nlc3NvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNlbGxFZGl0b3JWYWxpZGF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJsZUV2ZW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250RGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgTWVyZ2VOb2RlTmFtZUVkaXRQYXJ0IGV4dGVuZHMgQ29tcGFydG1lbnRFZGl0UGFydCBpbXBsZW1lbnRzCi0JCUlUZXh0QXdhcmVFZGl0UGFydCB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVklTVUFMX0lEID0gNDAwMjsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIERpcmVjdEVkaXRNYW5hZ2VyIG1hbmFnZXI7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBJUGFyc2VyIHBhcnNlcjsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIExpc3QgcGFyc2VyRWxlbWVudHM7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZGVmYXVsdFRleHQ7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE1lcmdlTm9kZU5hbWVFZGl0UGFydChWaWV3IHZpZXcpIHsKLQkJc3VwZXIodmlldyk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKSB7Ci0JCXN1cGVyLmNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKTsKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5ESVJFQ1RfRURJVF9ST0xFLAotCQkJCW5ldyBMYWJlbERpcmVjdEVkaXRQb2xpY3koKSk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUsCi0JCQkJbmV3IE5vblJlc2l6YWJsZUVkaXRQb2xpY3koKSB7Ci0KLQkJCQkJcHJvdGVjdGVkIExpc3QgY3JlYXRlU2VsZWN0aW9uSGFuZGxlcygpIHsKLQkJCQkJCUxpc3QgaGFuZGxlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJCU5vblJlc2l6YWJsZUhhbmRsZUtpdC5hZGRNb3ZlSGFuZGxlKAotCQkJCQkJCQkoR3JhcGhpY2FsRWRpdFBhcnQpIGdldEhvc3QoKSwgaGFuZGxlcyk7Ci0JCQkJCQlyZXR1cm4gaGFuZGxlczsKLQkJCQkJfQotCi0JCQkJCXB1YmxpYyBDb21tYW5kIGdldENvbW1hbmQoUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQkJfQotCi0JCQkJCXB1YmxpYyBib29sZWFuIHVuZGVyc3RhbmRzUmVxdWVzdChSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJfQotCQkJCX0pOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldExhYmVsVGV4dEhlbHBlcihJRmlndXJlIGZpZ3VyZSkgewotCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQlyZXR1cm4gKChXcmFwTGFiZWwpIGZpZ3VyZSkuZ2V0VGV4dCgpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuICgoTGFiZWwpIGZpZ3VyZSkuZ2V0VGV4dCgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldExhYmVsVGV4dEhlbHBlcihJRmlndXJlIGZpZ3VyZSwgU3RyaW5nIHRleHQpIHsKLQkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJKChXcmFwTGFiZWwpIGZpZ3VyZSkuc2V0VGV4dCh0ZXh0KTsKLQkJfSBlbHNlIHsKLQkJCSgoTGFiZWwpIGZpZ3VyZSkuc2V0VGV4dCh0ZXh0KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSW1hZ2UgZ2V0TGFiZWxJY29uSGVscGVyKElGaWd1cmUgZmlndXJlKSB7Ci0JCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCXJldHVybiAoKFdyYXBMYWJlbCkgZmlndXJlKS5nZXRJY29uKCk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gKChMYWJlbCkgZmlndXJlKS5nZXRJY29uKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0TGFiZWxJY29uSGVscGVyKElGaWd1cmUgZmlndXJlLCBJbWFnZSBpY29uKSB7Ci0JCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCSgoV3JhcExhYmVsKSBmaWd1cmUpLnNldEljb24oaWNvbik7Ci0JCX0gZWxzZSB7Ci0JCQkoKExhYmVsKSBmaWd1cmUpLnNldEljb24oaWNvbik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGFiZWwoSUZpZ3VyZSBmaWd1cmUpIHsKLQkJdW5yZWdpc3RlclZpc3VhbHMoKTsKLQkJc2V0RmlndXJlKGZpZ3VyZSk7Ci0JCWRlZmF1bHRUZXh0ID0gZ2V0TGFiZWxUZXh0SGVscGVyKGZpZ3VyZSk7Ci0JCXJlZ2lzdGVyVmlzdWFscygpOwotCQlyZWZyZXNoVmlzdWFscygpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBnZXRNb2RlbENoaWxkcmVuKCkgewotCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElHcmFwaGljYWxFZGl0UGFydCBnZXRDaGlsZEJ5U2VtYW50aWNIaW50KFN0cmluZyBzZW1hbnRpY0hpbnQpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFT2JqZWN0IGdldFBhcnNlckVsZW1lbnQoKSB7Ci0JCUVPYmplY3QgZWxlbWVudCA9IHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKTsKLQkJcmV0dXJuIGVsZW1lbnQgIT0gbnVsbCA/IGVsZW1lbnQgOiAoVmlldykgZ2V0TW9kZWwoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEltYWdlIGdldExhYmVsSWNvbigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TGFiZWxUZXh0KCkgewotCQlTdHJpbmcgdGV4dCA9IG51bGw7Ci0JCWlmIChnZXRQYXJzZXIoKSAhPSBudWxsKSB7Ci0JCQl0ZXh0ID0gZ2V0UGFyc2VyKCkuZ2V0UHJpbnRTdHJpbmcoCi0JCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihnZXRQYXJzZXJFbGVtZW50KCkpLAotCQkJCQlnZXRQYXJzZXJPcHRpb25zKCkuaW50VmFsdWUoKSk7Ci0JCX0KLQkJaWYgKHRleHQgPT0gbnVsbCB8fCB0ZXh0Lmxlbmd0aCgpID09IDApIHsKLQkJCXRleHQgPSBkZWZhdWx0VGV4dDsKLQkJfQotCQlyZXR1cm4gdGV4dDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGFiZWxUZXh0KFN0cmluZyB0ZXh0KSB7Ci0JCXNldExhYmVsVGV4dEhlbHBlcihnZXRGaWd1cmUoKSwgdGV4dCk7Ci0JCU9iamVjdCBwZEVkaXRQb2xpY3kgPSBnZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUpOwotCQlpZiAocGRFZGl0UG9saWN5IGluc3RhbmNlb2YgVU1MVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHsKLQkJCSgoVU1MVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHBkRWRpdFBvbGljeSkucmVmcmVzaEZlZWRiYWNrKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRFZGl0VGV4dCgpIHsKLQkJaWYgKGdldFBhcnNlcigpID09IG51bGwpIHsKLQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBnZXRQYXJzZXIoKS5nZXRFZGl0U3RyaW5nKAotCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihnZXRQYXJzZXJFbGVtZW50KCkpLAotCQkJCWdldFBhcnNlck9wdGlvbnMoKS5pbnRWYWx1ZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNFZGl0YWJsZSgpIHsKLQkJcmV0dXJuIGdldFBhcnNlcigpICE9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJQ2VsbEVkaXRvclZhbGlkYXRvciBnZXRFZGl0VGV4dFZhbGlkYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBJQ2VsbEVkaXRvclZhbGlkYXRvcigpIHsKLQotCQkJcHVibGljIFN0cmluZyBpc1ZhbGlkKGZpbmFsIE9iamVjdCB2YWx1ZSkgewotCQkJCWlmICh2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykgewotCQkJCQlmaW5hbCBFT2JqZWN0IGVsZW1lbnQgPSBnZXRQYXJzZXJFbGVtZW50KCk7Ci0JCQkJCWZpbmFsIElQYXJzZXIgcGFyc2VyID0gZ2V0UGFyc2VyKCk7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlJUGFyc2VyRWRpdFN0YXR1cyB2YWxpZCA9IChJUGFyc2VyRWRpdFN0YXR1cykgZ2V0RWRpdGluZ0RvbWFpbigpCi0JCQkJCQkJCS5ydW5FeGNsdXNpdmUobmV3IFJ1bm5hYmxlV2l0aFJlc3VsdC5JbXBsKCkgewotCi0JCQkJCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJCQkJc2V0UmVzdWx0KHBhcnNlci5pc1ZhbGlkRWRpdFN0cmluZygKLQkJCQkJCQkJCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihlbGVtZW50KSwKLQkJCQkJCQkJCQkJCShTdHJpbmcpIHZhbHVlKSk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0pOwotCQkJCQkJcmV0dXJuIHZhbGlkLmdldENvZGUoKSA9PSBQYXJzZXJFZGl0U3RhdHVzLkVESVRBQkxFID8gbnVsbAotCQkJCQkJCQk6IHZhbGlkLmdldE1lc3NhZ2UoKTsKLQkJCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gaWUpIHsKLQkJCQkJCWllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJLy8gc2hvdWxkbid0IGdldCBoZXJlCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJQ29udGVudEFzc2lzdFByb2Nlc3NvciBnZXRDb21wbGV0aW9uUHJvY2Vzc29yKCkgewotCQlpZiAoZ2V0UGFyc2VyKCkgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIGdldFBhcnNlcigpLmdldENvbXBsZXRpb25Qcm9jZXNzb3IoCi0JCQkJbmV3IEVPYmplY3RBZGFwdGVyKGdldFBhcnNlckVsZW1lbnQoKSkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUGFyc2VyT3B0aW9ucyBnZXRQYXJzZXJPcHRpb25zKCkgewotCQlyZXR1cm4gUGFyc2VyT3B0aW9ucy5OT05FOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSVBhcnNlciBnZXRQYXJzZXIoKSB7Ci0JCWlmIChwYXJzZXIgPT0gbnVsbCkgewotCQkJU3RyaW5nIHBhcnNlckhpbnQgPSAoKFZpZXcpIGdldE1vZGVsKCkpLmdldFR5cGUoKTsKLQkJCVBhcnNlckhpbnRBZGFwdGVyIGhpbnRBZGFwdGVyID0gbmV3IFBhcnNlckhpbnRBZGFwdGVyKAotCQkJCQlnZXRQYXJzZXJFbGVtZW50KCksIHBhcnNlckhpbnQpIHsKLQotCQkJCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihDbGFzcyBhZGFwdGVyKSB7Ci0JCQkJCWlmIChJRWxlbWVudFR5cGUuY2xhc3MuZXF1YWxzKGFkYXB0ZXIpKSB7Ci0JCQkJCQlyZXR1cm4gVU1MRWxlbWVudFR5cGVzLk1lcmdlTm9kZV8xMDAyOwotCQkJCQl9Ci0JCQkJCXJldHVybiBzdXBlci5nZXRBZGFwdGVyKGFkYXB0ZXIpOwotCQkJCX0KLQkJCX07Ci0JCQlwYXJzZXIgPSBQYXJzZXJTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0UGFyc2VyKGhpbnRBZGFwdGVyKTsKLQkJfQotCQlyZXR1cm4gcGFyc2VyOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRGlyZWN0RWRpdE1hbmFnZXIgZ2V0TWFuYWdlcigpIHsKLQkJaWYgKG1hbmFnZXIgPT0gbnVsbCkgewotCQkJc2V0TWFuYWdlcihuZXcgVGV4dERpcmVjdEVkaXRNYW5hZ2VyKHRoaXMsIFRleHREaXJlY3RFZGl0TWFuYWdlcgotCQkJCQkuZ2V0VGV4dENlbGxFZGl0b3JDbGFzcyh0aGlzKSwgVU1MRWRpdFBhcnRGYWN0b3J5Ci0JCQkJCS5nZXRUZXh0Q2VsbEVkaXRvckxvY2F0b3IodGhpcykpKTsKLQkJfQotCQlyZXR1cm4gbWFuYWdlcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0TWFuYWdlcihEaXJlY3RFZGl0TWFuYWdlciBtYW5hZ2VyKSB7Ci0JCXRoaXMubWFuYWdlciA9IG1hbmFnZXI7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0KCkgewotCQlnZXRNYW5hZ2VyKCkuc2hvdygpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdChQb2ludCBldmVudExvY2F0aW9uKSB7Ci0JCWlmIChnZXRNYW5hZ2VyKCkuZ2V0Q2xhc3MoKSA9PSBUZXh0RGlyZWN0RWRpdE1hbmFnZXIuY2xhc3MpIHsKLQkJCSgoVGV4dERpcmVjdEVkaXRNYW5hZ2VyKSBnZXRNYW5hZ2VyKCkpLnNob3coZXZlbnRMb2NhdGlvbgotCQkJCQkuZ2V0U1dUUG9pbnQoKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0KGNoYXIgaW5pdGlhbENoYXJhY3RlcikgewotCQlpZiAoZ2V0TWFuYWdlcigpIGluc3RhbmNlb2YgVGV4dERpcmVjdEVkaXRNYW5hZ2VyKSB7Ci0JCQkoKFRleHREaXJlY3RFZGl0TWFuYWdlcikgZ2V0TWFuYWdlcigpKS5zaG93KGluaXRpYWxDaGFyYWN0ZXIpOwotCQl9IGVsc2UgewotCQkJcGVyZm9ybURpcmVjdEVkaXQoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdFJlcXVlc3QoUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCWZpbmFsIFJlcXVlc3QgdGhlUmVxdWVzdCA9IHJlcXVlc3Q7Ci0JCXRyeSB7Ci0JCQlnZXRFZGl0aW5nRG9tYWluKCkucnVuRXhjbHVzaXZlKG5ldyBSdW5uYWJsZSgpIHsKLQotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJaWYgKGlzQWN0aXZlKCkgJiYgaXNFZGl0YWJsZSgpKSB7Ci0JCQkJCQlpZiAodGhlUmVxdWVzdAotCQkJCQkJCQkuZ2V0RXh0ZW5kZWREYXRhKCkKLQkJCQkJCQkJLmdldCgKLQkJCQkJCQkJCQlSZXF1ZXN0Q29uc3RhbnRzLlJFUV9ESVJFQ1RFRElUX0VYVEVOREVEREFUQV9JTklUSUFMX0NIQVIpIGluc3RhbmNlb2YgQ2hhcmFjdGVyKSB7Ci0JCQkJCQkJQ2hhcmFjdGVyIGluaXRpYWxDaGFyID0gKENoYXJhY3RlcikgdGhlUmVxdWVzdAotCQkJCQkJCQkJLmdldEV4dGVuZGVkRGF0YSgpCi0JCQkJCQkJCQkuZ2V0KAotCQkJCQkJCQkJCQlSZXF1ZXN0Q29uc3RhbnRzLlJFUV9ESVJFQ1RFRElUX0VYVEVOREVEREFUQV9JTklUSUFMX0NIQVIpOwotCQkJCQkJCXBlcmZvcm1EaXJlY3RFZGl0KGluaXRpYWxDaGFyLmNoYXJWYWx1ZSgpKTsKLQkJCQkJCX0gZWxzZSBpZiAoKHRoZVJlcXVlc3QgaW5zdGFuY2VvZiBEaXJlY3RFZGl0UmVxdWVzdCkKLQkJCQkJCQkJJiYgKGdldEVkaXRUZXh0KCkuZXF1YWxzKGdldExhYmVsVGV4dCgpKSkpIHsKLQkJCQkJCQlEaXJlY3RFZGl0UmVxdWVzdCBlZGl0UmVxdWVzdCA9IChEaXJlY3RFZGl0UmVxdWVzdCkgdGhlUmVxdWVzdDsKLQkJCQkJCQlwZXJmb3JtRGlyZWN0RWRpdChlZGl0UmVxdWVzdC5nZXRMb2NhdGlvbigpKTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJcGVyZm9ybURpcmVjdEVkaXQoKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0pOwotCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hWaXN1YWxzKCkgewotCQlzdXBlci5yZWZyZXNoVmlzdWFscygpOwotCQlyZWZyZXNoTGFiZWwoKTsKLQkJcmVmcmVzaEZvbnQoKTsKLQkJcmVmcmVzaEZvbnRDb2xvcigpOwotCQlyZWZyZXNoVW5kZXJsaW5lKCk7Ci0JCXJlZnJlc2hTdHJpa2VUaHJvdWdoKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hMYWJlbCgpIHsKLQkJc2V0TGFiZWxUZXh0SGVscGVyKGdldEZpZ3VyZSgpLCBnZXRMYWJlbFRleHQoKSk7Ci0JCXNldExhYmVsSWNvbkhlbHBlcihnZXRGaWd1cmUoKSwgZ2V0TGFiZWxJY29uKCkpOwotCQlPYmplY3QgcGRFZGl0UG9saWN5ID0gZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFKTsKLQkJaWYgKHBkRWRpdFBvbGljeSBpbnN0YW5jZW9mIFVNTFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSB7Ci0JCQkoKFVNTFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSBwZEVkaXRQb2xpY3kpLnJlZnJlc2hGZWVkYmFjaygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hVbmRlcmxpbmUoKSB7Ci0JCUZvbnRTdHlsZSBzdHlsZSA9IChGb250U3R5bGUpIGdldEZvbnRTdHlsZU93bmVyVmlldygpLmdldFN0eWxlKAotCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlKCkpOwotCQlpZiAoc3R5bGUgIT0gbnVsbCAmJiBnZXRGaWd1cmUoKSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJKChXcmFwTGFiZWwpIGdldEZpZ3VyZSgpKS5zZXRUZXh0VW5kZXJsaW5lKHN0eWxlLmlzVW5kZXJsaW5lKCkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hTdHJpa2VUaHJvdWdoKCkgewotCQlGb250U3R5bGUgc3R5bGUgPSAoRm9udFN0eWxlKSBnZXRGb250U3R5bGVPd25lclZpZXcoKS5nZXRTdHlsZSgKLQkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZSgpKTsKLQkJaWYgKHN0eWxlICE9IG51bGwgJiYgZ2V0RmlndXJlKCkgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCSgoV3JhcExhYmVsKSBnZXRGaWd1cmUoKSkuc2V0VGV4dFN0cmlrZVRocm91Z2goc3R5bGUKLQkJCQkJLmlzU3RyaWtlVGhyb3VnaCgpKTsKLQkJfQotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hGb250KCkgewotCQlGb250U3R5bGUgc3R5bGUgPSAoRm9udFN0eWxlKSBnZXRGb250U3R5bGVPd25lclZpZXcoKS5nZXRTdHlsZSgKLQkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZSgpKTsKLQkJaWYgKHN0eWxlICE9IG51bGwpIHsKLQkJCVN0cmluZyBmb250TmFtZSA9IERpYWdyYW1Db25zdGFudHMuZ2V0Rm9udE5hbWUoc3R5bGUpOwotCQkJRm9udERhdGEgZm9udERhdGEgPSBuZXcgRm9udERhdGEoZm9udE5hbWUsIHN0eWxlCi0JCQkJCS5nZXRGb250SGVpZ2h0KCksIChzdHlsZS5pc0JvbGQoKSA/IFNXVC5CT0xEIDogU1dULk5PUk1BTCkKLQkJCQkJfCAoc3R5bGUuaXNJdGFsaWMoKSA/IFNXVC5JVEFMSUMgOiBTV1QuTk9STUFMKSk7Ci0JCQlzZXRGb250KGZvbnREYXRhKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRGb250Q29sb3IoQ29sb3IgY29sb3IpIHsKLQkJZ2V0RmlndXJlKCkuc2V0Rm9yZWdyb3VuZENvbG9yKGNvbG9yKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkU2VtYW50aWNMaXN0ZW5lcnMoKSB7Ci0JCWlmIChnZXRQYXJzZXIoKSBpbnN0YW5jZW9mIElTZW1hbnRpY1BhcnNlcikgewotCQkJRU9iamVjdCBlbGVtZW50ID0gcmVzb2x2ZVNlbWFudGljRWxlbWVudCgpOwotCQkJcGFyc2VyRWxlbWVudHMgPSAoKElTZW1hbnRpY1BhcnNlcikgZ2V0UGFyc2VyKCkpCi0JCQkJCS5nZXRTZW1hbnRpY0VsZW1lbnRzQmVpbmdQYXJzZWQoZWxlbWVudCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcnNlckVsZW1lbnRzLnNpemUoKTsgaSsrKSB7Ci0JCQkJYWRkTGlzdGVuZXJGaWx0ZXIoCi0JCQkJCQkiU2VtYW50aWNNb2RlbCIgKyBpLCB0aGlzLCAoRU9iamVjdCkgcGFyc2VyRWxlbWVudHMuZ2V0KGkpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9IGVsc2UgewotCQkJc3VwZXIuYWRkU2VtYW50aWNMaXN0ZW5lcnMoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVTZW1hbnRpY0xpc3RlbmVycygpIHsKLQkJaWYgKHBhcnNlckVsZW1lbnRzICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGFyc2VyRWxlbWVudHMuc2l6ZSgpOyBpKyspIHsKLQkJCQlyZW1vdmVMaXN0ZW5lckZpbHRlcigiU2VtYW50aWNNb2RlbCIgKyBpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9IGVsc2UgewotCQkJc3VwZXIucmVtb3ZlU2VtYW50aWNMaXN0ZW5lcnMoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQWNjZXNzaWJsZUVkaXRQYXJ0IGdldEFjY2Vzc2libGVFZGl0UGFydCgpIHsKLQkJaWYgKGFjY2Vzc2libGVFUCA9PSBudWxsKSB7Ci0JCQlhY2Nlc3NpYmxlRVAgPSBuZXcgQWNjZXNzaWJsZUdyYXBoaWNhbEVkaXRQYXJ0KCkgewotCi0JCQkJcHVibGljIHZvaWQgZ2V0TmFtZShBY2Nlc3NpYmxlRXZlbnQgZSkgewotCQkJCQllLnJlc3VsdCA9IGdldExhYmVsVGV4dEhlbHBlcihnZXRGaWd1cmUoKSk7Ci0JCQkJfQotCQkJfTsKLQkJfQotCQlyZXR1cm4gYWNjZXNzaWJsZUVQOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIFZpZXcgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkgewotCQlyZXR1cm4gZ2V0UHJpbWFyeVZpZXcoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkTm90YXRpb25hbExpc3RlbmVycygpIHsKLQkJc3VwZXIuYWRkTm90YXRpb25hbExpc3RlbmVycygpOwotCQlhZGRMaXN0ZW5lckZpbHRlcigiUHJpbWFyeVZpZXciLCB0aGlzLCBnZXRQcmltYXJ5VmlldygpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVOb3RhdGlvbmFsTGlzdGVuZXJzKCkgewotCQlzdXBlci5yZW1vdmVOb3RhdGlvbmFsTGlzdGVuZXJzKCk7Ci0JCXJlbW92ZUxpc3RlbmVyRmlsdGVyKCJQcmltYXJ5VmlldyIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGhhbmRsZU5vdGlmaWNhdGlvbkV2ZW50KE5vdGlmaWNhdGlvbiBldmVudCkgewotCQlPYmplY3QgZmVhdHVyZSA9IGV2ZW50LmdldEZlYXR1cmUoKTsKLQkJaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0ZvbnRDb2xvcigpLmVxdWFscyhmZWF0dXJlKSkgewotCQkJSW50ZWdlciBjID0gKEludGVnZXIpIGV2ZW50LmdldE5ld1ZhbHVlKCk7Ci0JCQlzZXRGb250Q29sb3IoRGlhZ3JhbUNvbG9yUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXRDb2xvcihjKSk7Ci0JCX0gZWxzZSBpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfVW5kZXJsaW5lKCkuZXF1YWxzKAotCQkJCWZlYXR1cmUpKSB7Ci0JCQlyZWZyZXNoVW5kZXJsaW5lKCk7Ci0JCX0gZWxzZSBpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfU3RyaWtlVGhyb3VnaCgpCi0JCQkJLmVxdWFscyhmZWF0dXJlKSkgewotCQkJcmVmcmVzaFN0cmlrZVRocm91Z2goKTsKLQkJfSBlbHNlIGlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Gb250SGVpZ2h0KCkuZXF1YWxzKAotCQkJCWZlYXR1cmUpCi0JCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfRm9udE5hbWUoKS5lcXVhbHMoCi0JCQkJCQlmZWF0dXJlKQotCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0JvbGQoKQotCQkJCQkJLmVxdWFscyhmZWF0dXJlKQotCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0l0YWxpYygpLmVxdWFscygKLQkJCQkJCWZlYXR1cmUpKSB7Ci0JCQlyZWZyZXNoRm9udCgpOwotCQl9IGVsc2UgewotCQkJaWYgKGdldFBhcnNlcigpICE9IG51bGwKLQkJCQkJJiYgZ2V0UGFyc2VyKCkuaXNBZmZlY3RpbmdFdmVudChldmVudCwKLQkJCQkJCQlnZXRQYXJzZXJPcHRpb25zKCkuaW50VmFsdWUoKSkpIHsKLQkJCQlyZWZyZXNoTGFiZWwoKTsKLQkJCX0KLQkJCWlmIChnZXRQYXJzZXIoKSBpbnN0YW5jZW9mIElTZW1hbnRpY1BhcnNlcikgewotCQkJCUlTZW1hbnRpY1BhcnNlciBtb2RlbFBhcnNlciA9IChJU2VtYW50aWNQYXJzZXIpIGdldFBhcnNlcigpOwotCQkJCWlmIChtb2RlbFBhcnNlci5hcmVTZW1hbnRpY0VsZW1lbnRzQWZmZWN0ZWQobnVsbCwgZXZlbnQpKSB7Ci0JCQkJCXJlbW92ZVNlbWFudGljTGlzdGVuZXJzKCk7Ci0JCQkJCWlmIChyZXNvbHZlU2VtYW50aWNFbGVtZW50KCkgIT0gbnVsbCkgewotCQkJCQkJYWRkU2VtYW50aWNMaXN0ZW5lcnMoKTsKLQkJCQkJfQotCQkJCQlyZWZyZXNoTGFiZWwoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJc3VwZXIuaGFuZGxlTm90aWZpY2F0aW9uRXZlbnQoZXZlbnQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVGaWd1cmUoKSB7Ci0JCUlGaWd1cmUgbGFiZWwgPSBjcmVhdGVGaWd1cmVQcmltKCk7Ci0JCWRlZmF1bHRUZXh0ID0gZ2V0TGFiZWxUZXh0SGVscGVyKGxhYmVsKTsKLQkJcmV0dXJuIGxhYmVsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVGaWd1cmVQcmltKCkgewotCQlyZXR1cm4gbmV3IE5vZGVOYW1lRmlndXJlKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBjbGFzcyBOb2RlTmFtZUZpZ3VyZSBleHRlbmRzIFdyYXBMYWJlbCB7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBOb2RlTmFtZUZpZ3VyZSgpIHsKLQotCQkJdGhpcy5zZXRUZXh0KCIiKTsJLy8kTk9OLU5MUy0xJAotCQkJY3JlYXRlQ29udGVudHMoKTsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIHZvaWQgY3JlYXRlQ29udGVudHMoKSB7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSBib29sZWFuIG15VXNlTG9jYWxDb29yZGluYXRlcyA9IGZhbHNlOwotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcm90ZWN0ZWQgYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKCkgewotCQkJcmV0dXJuIG15VXNlTG9jYWxDb29yZGluYXRlczsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcm90ZWN0ZWQgdm9pZCBzZXRVc2VMb2NhbENvb3JkaW5hdGVzKGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcykgewotCQkJbXlVc2VMb2NhbENvb3JkaW5hdGVzID0gdXNlTG9jYWxDb29yZGluYXRlczsKLQkJfQotCi0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wYXJ0cy9TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlMkVkaXRQYXJ0LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wYXJ0cy9TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlMkVkaXRQYXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyY2Q0MjUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcGFydHMvU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTJFZGl0UGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzA3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuR3JhcGhpY3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuU3RhY2tMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuY3VzdG9tLnBvbGljaWVzLk9wZW5BREVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wb2xpY2llcy5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlMkNhbm9uaWNhbEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wb2xpY2llcy5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlMkdyYXBoaWNhbE5vZGVFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucG9saWNpZXMuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTJJdGVtU2VtYW50aWNFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnBhcnQuVU1MVmlzdWFsSURSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLkRpYWdyYW1Db3JlUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuZmlndXJlcy5XaWRlbmVkV3JhcExhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUudXRpbC5EaWFncmFtQ29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuTGF5b3V0RWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLk5vblJlc2l6YWJsZUVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLkNyZWF0ZVJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLlNoYXBlTm9kZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkVkaXRQb2xpY3lSb2xlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5Db25zdHJhaW5lZFRvb2xiYXJMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmdlZi51aS5maWd1cmVzLkRlZmF1bHRTaXplTm9kZUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5nZWYudWkuZmlndXJlcy5Ob2RlRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTJFZGl0UGFydCBleHRlbmRzIFNoYXBlTm9kZUVkaXRQYXJ0IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWSVNVQUxfSUQgPSAxMDEwOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJRmlndXJlIGNvbnRlbnRQYW5lOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJRmlndXJlIHByaW1hcnlTaGFwZTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTJFZGl0UGFydChWaWV3IHZpZXcpIHsKLQkJc3VwZXIodmlldyk7Ci0JfQotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpIHsKLQkJc3VwZXIuY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpOwotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuU0VNQU5USUNfUk9MRSwKLQkJCQluZXcgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTJJdGVtU2VtYW50aWNFZGl0UG9saWN5KCkpOwotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LkdSQVBISUNBTF9OT0RFX1JPTEUsCi0JCQkJbmV3IFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUyR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3koKSk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5DQU5PTklDQUxfUk9MRSwKLQkJCQluZXcgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTJDYW5vbmljYWxFZGl0UG9saWN5KCkpOwotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LkxBWU9VVF9ST0xFLCBjcmVhdGVMYXlvdXRFZGl0UG9saWN5KCkpOwotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuT1BFTl9ST0xFLCBuZXcgT3BlbkFERWRpdFBvbGljeSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIExheW91dEVkaXRQb2xpY3kgY3JlYXRlTGF5b3V0RWRpdFBvbGljeSgpIHsKLQkJTGF5b3V0RWRpdFBvbGljeSBsZXAgPSBuZXcgTGF5b3V0RWRpdFBvbGljeSgpIHsKLQotCQkJcHJvdGVjdGVkIEVkaXRQb2xpY3kgY3JlYXRlQ2hpbGRFZGl0UG9saWN5KEVkaXRQYXJ0IGNoaWxkKSB7Ci0JCQkJRWRpdFBvbGljeSByZXN1bHQgPSBjaGlsZAotCQkJCQkJLmdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSB7Ci0JCQkJCXJlc3VsdCA9IG5ldyBOb25SZXNpemFibGVFZGl0UG9saWN5KCk7Ci0JCQkJfQotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0KLQkJCXByb3RlY3RlZCBDb21tYW5kIGdldE1vdmVDaGlsZHJlbkNvbW1hbmQoUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0KLQkJCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZUNvbW1hbmQoQ3JlYXRlUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCX07Ci0JCXJldHVybiBsZXA7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZU5vZGVTaGFwZSgpIHsKLQkJU3RydWN0dXJlZEFjdGl2aXR5Tm9kZUZpZ3VyZSBmaWd1cmUgPSBuZXcgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZUZpZ3VyZSgpOwotCQlyZXR1cm4gcHJpbWFyeVNoYXBlID0gZmlndXJlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZUZpZ3VyZSBnZXRQcmltYXJ5U2hhcGUoKSB7Ci0JCXJldHVybiAoU3RydWN0dXJlZEFjdGl2aXR5Tm9kZUZpZ3VyZSkgcHJpbWFyeVNoYXBlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBhZGRGaXhlZENoaWxkKEVkaXRQYXJ0IGNoaWxkRWRpdFBhcnQpIHsKLQkJaWYgKGNoaWxkRWRpdFBhcnQgaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZTJFZGl0UGFydCkgewotCQkJKChTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZTJFZGl0UGFydCkgY2hpbGRFZGl0UGFydCkKLQkJCQkJLnNldExhYmVsKGdldFByaW1hcnlTaGFwZSgpLmdldEZpZ3VyZU5vZGVOYW1lRmlndXJlKCkpOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiByZW1vdmVGaXhlZENoaWxkKEVkaXRQYXJ0IGNoaWxkRWRpdFBhcnQpIHsKLQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBOb2RlRmlndXJlIGNyZWF0ZU5vZGVQbGF0ZSgpIHsKLQkJRGVmYXVsdFNpemVOb2RlRmlndXJlIHJlc3VsdCA9IG5ldyBEZWZhdWx0U2l6ZU5vZGVGaWd1cmUoZ2V0TWFwTW9kZSgpCi0JCQkJLkRQdG9MUCg0MCksIGdldE1hcE1vZGUoKS5EUHRvTFAoNDApKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGZpZ3VyZSBmb3IgdGhpcyBlZGl0IHBhcnQuCi0JICogCi0JICogQm9keSBvZiB0aGlzIG1ldGhvZCBkb2VzIG5vdCBkZXBlbmQgb24gc2V0dGluZ3MgaW4gZ2VuZXJhdGlvbiBtb2RlbAotCSAqIHNvIHlvdSBtYXkgc2FmZWx5IHJlbW92ZSA8aT5nZW5lcmF0ZWQ8L2k+IHRhZyBhbmQgbW9kaWZ5IGl0LgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTm9kZUZpZ3VyZSBjcmVhdGVOb2RlRmlndXJlKCkgewotCQlOb2RlRmlndXJlIGZpZ3VyZSA9IGNyZWF0ZU5vZGVQbGF0ZSgpOwotCQlmaWd1cmUuc2V0TGF5b3V0TWFuYWdlcihuZXcgU3RhY2tMYXlvdXQoKSk7Ci0JCUlGaWd1cmUgc2hhcGUgPSBjcmVhdGVOb2RlU2hhcGUoKTsKLQkJZmlndXJlLmFkZChzaGFwZSk7Ci0JCWNvbnRlbnRQYW5lID0gc2V0dXBDb250ZW50UGFuZShzaGFwZSk7Ci0JCXJldHVybiBmaWd1cmU7Ci0JfQotCi0JLyoqCi0JICogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiB0cmVhdHMgcGFzc2VkIGZpZ3VyZSBhcyBjb250ZW50IHBhbmUuCi0JICogUmVzcGVjdHMgbGF5b3V0IG9uZSBtYXkgaGF2ZSBzZXQgZm9yIGdlbmVyYXRlZCBmaWd1cmUuCi0JICogQHBhcmFtIG5vZGVTaGFwZSBpbnN0YW5jZSBvZiBnZW5lcmF0ZWQgZmlndXJlIGNsYXNzCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJRmlndXJlIHNldHVwQ29udGVudFBhbmUoSUZpZ3VyZSBub2RlU2hhcGUpIHsKLQkJaWYgKG5vZGVTaGFwZS5nZXRMYXlvdXRNYW5hZ2VyKCkgPT0gbnVsbCkgewotCQkJQ29uc3RyYWluZWRUb29sYmFyTGF5b3V0IGxheW91dCA9IG5ldyBDb25zdHJhaW5lZFRvb2xiYXJMYXlvdXQoKTsKLQkJCWxheW91dC5zZXRTcGFjaW5nKGdldE1hcE1vZGUoKS5EUHRvTFAoNSkpOwotCQkJbm9kZVNoYXBlLnNldExheW91dE1hbmFnZXIobGF5b3V0KTsKLQkJfQotCQlyZXR1cm4gbm9kZVNoYXBlOyAvLyB1c2Ugbm9kZVNoYXBlIGl0c2VsZiBhcyBjb250ZW50UGFuZQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSUZpZ3VyZSBnZXRDb250ZW50UGFuZSgpIHsKLQkJaWYgKGNvbnRlbnRQYW5lICE9IG51bGwpIHsKLQkJCXJldHVybiBjb250ZW50UGFuZTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0Q29udGVudFBhbmUoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVkaXRQYXJ0IGdldFByaW1hcnlDaGlsZEVkaXRQYXJ0KCkgewotCQlyZXR1cm4gZ2V0Q2hpbGRCeVNlbWFudGljSGludChVTUxWaXN1YWxJRFJlZ2lzdHJ5Ci0JCQkJLmdldFR5cGUoU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWUyRWRpdFBhcnQuVklTVUFMX0lEKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZENoaWxkVmlzdWFsKEVkaXRQYXJ0IGNoaWxkRWRpdFBhcnQsIGludCBpbmRleCkgewotCQlpZiAoYWRkRml4ZWRDaGlsZChjaGlsZEVkaXRQYXJ0KSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmFkZENoaWxkVmlzdWFsKGNoaWxkRWRpdFBhcnQsIC0xKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlQ2hpbGRWaXN1YWwoRWRpdFBhcnQgY2hpbGRFZGl0UGFydCkgewotCQlpZiAocmVtb3ZlRml4ZWRDaGlsZChjaGlsZEVkaXRQYXJ0KSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLnJlbW92ZUNoaWxkVmlzdWFsKGNoaWxkRWRpdFBhcnQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBnZXRDb250ZW50UGFuZUZvcihJR3JhcGhpY2FsRWRpdFBhcnQgZWRpdFBhcnQpIHsKLQotCQlyZXR1cm4gc3VwZXIuZ2V0Q29udGVudFBhbmVGb3IoZWRpdFBhcnQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgY2xhc3MgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZUZpZ3VyZSBleHRlbmRzIFJlY3RhbmdsZUZpZ3VyZSB7Ci0KLQkJLyoqCi0JCSAqIEBtb2RpZmllZAotCQkgKi8KLQkJcHVibGljIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVGaWd1cmUoKSB7Ci0KLQkJCXRoaXMuc2V0T3V0bGluZShmYWxzZSk7Ci0JCQl0aGlzLnNldE9wYXF1ZShmYWxzZSk7Ci0JCQljcmVhdGVDb250ZW50cygpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBtb2RpZmllZAotCQkgKi8KLQkJcHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbnRlbnRzKCkgewotCQkJb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIGZpZ18wID0gbmV3IFdpZGVuZWRXcmFwTGFiZWwoKTsKLQkJCWZpZ18wLnNldFRleHQoRGlhZ3JhbUNvcmVSZXNvdXJjZXMuQWN0aXZpdHlEaWFncmFtX05ld19QaGFzZSk7Ci0KLQkJCURpYWdyYW1Db3JlVXRpbC5zZXRMYWJlbFByb3BlcnRpZXMoZmlnXzApOwotCQkJc2V0RmlndXJlTm9kZU5hbWVGaWd1cmUoZmlnXzApOwotCi0JCQlPYmplY3QgbGF5RGF0YTAgPSBudWxsOwotCi0JCQl0aGlzLmFkZChmaWdfMCwgbGF5RGF0YTApOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgV3JhcExhYmVsIGZOb2RlTmFtZUZpZ3VyZTsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIFdyYXBMYWJlbCBnZXRGaWd1cmVOb2RlTmFtZUZpZ3VyZSgpIHsKLQkJCXJldHVybiBmTm9kZU5hbWVGaWd1cmU7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSB2b2lkIHNldEZpZ3VyZU5vZGVOYW1lRmlndXJlKFdyYXBMYWJlbCBmaWcpIHsKLQkJCWZOb2RlTmFtZUZpZ3VyZSA9IGZpZzsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIGJvb2xlYW4gbXlVc2VMb2NhbENvb3JkaW5hdGVzID0gZmFsc2U7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByb3RlY3RlZCBib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMoKSB7Ci0JCQlyZXR1cm4gbXlVc2VMb2NhbENvb3JkaW5hdGVzOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByb3RlY3RlZCB2b2lkIHNldFVzZUxvY2FsQ29vcmRpbmF0ZXMoYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKSB7Ci0JCQlteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSB1c2VMb2NhbENvb3JkaW5hdGVzOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyB2b2lkIHBhaW50RmlndXJlKEdyYXBoaWNzIGdyYXBoaWNzKSB7Ci0JCQlpZiAoaXNPcGFxdWUoKSkKLQkJCQlzdXBlci5wYWludEZpZ3VyZShncmFwaGljcyk7Ci0JCQlyZXR1cm47Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BhcnRzL1N0cnVjdHVyZWRBY3Rpdml0eU5vZGUzRWRpdFBhcnQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BhcnRzL1N0cnVjdHVyZWRBY3Rpdml0eU5vZGUzRWRpdFBhcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGE2MzU5YS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wYXJ0cy9TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlM0VkaXRQYXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMDggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5HcmFwaGljczsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5TdGFja0xheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5jdXN0b20ucG9saWNpZXMuT3BlbkFERWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBvbGljaWVzLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGUzQ2Fub25pY2FsRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBvbGljaWVzLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGUzR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wb2xpY2llcy5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlM0l0ZW1TZW1hbnRpY0VkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQucGFydC5VTUxWaXN1YWxJRFJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuRGlhZ3JhbUNvcmVSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5maWd1cmVzLldpZGVuZWRXcmFwTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS51dGlsLkRpYWdyYW1Db3JlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5MYXlvdXRFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuTm9uUmVzaXphYmxlRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuQ3JlYXRlUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JR3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuU2hhcGVOb2RlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuRWRpdFBvbGljeVJvbGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLkNvbnN0cmFpbmVkVG9vbGJhckxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZ2VmLnVpLmZpZ3VyZXMuRGVmYXVsdFNpemVOb2RlRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmdlZi51aS5maWd1cmVzLk5vZGVGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlM0VkaXRQYXJ0IGV4dGVuZHMgU2hhcGVOb2RlRWRpdFBhcnQgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZJU1VBTF9JRCA9IDEwMTE7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgY29udGVudFBhbmU7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgcHJpbWFyeVNoYXBlOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlM0VkaXRQYXJ0KFZpZXcgdmlldykgewotCQlzdXBlcih2aWV3KTsKLQl9Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCkgewotCQlzdXBlci5jcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5TRU1BTlRJQ19ST0xFLAotCQkJCW5ldyBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlM0l0ZW1TZW1hbnRpY0VkaXRQb2xpY3koKSk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuR1JBUEhJQ0FMX05PREVfUk9MRSwKLQkJCQluZXcgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTNHcmFwaGljYWxOb2RlRWRpdFBvbGljeSgpKTsKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLkNBTk9OSUNBTF9ST0xFLAotCQkJCW5ldyBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlM0Nhbm9uaWNhbEVkaXRQb2xpY3koKSk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuTEFZT1VUX1JPTEUsIGNyZWF0ZUxheW91dEVkaXRQb2xpY3koKSk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5PUEVOX1JPTEUsIG5ldyBPcGVuQURFZGl0UG9saWN5KCkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTGF5b3V0RWRpdFBvbGljeSBjcmVhdGVMYXlvdXRFZGl0UG9saWN5KCkgewotCQlMYXlvdXRFZGl0UG9saWN5IGxlcCA9IG5ldyBMYXlvdXRFZGl0UG9saWN5KCkgewotCi0JCQlwcm90ZWN0ZWQgRWRpdFBvbGljeSBjcmVhdGVDaGlsZEVkaXRQb2xpY3koRWRpdFBhcnQgY2hpbGQpIHsKLQkJCQlFZGl0UG9saWN5IHJlc3VsdCA9IGNoaWxkCi0JCQkJCQkuZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHsKLQkJCQkJcmVzdWx0ID0gbmV3IE5vblJlc2l6YWJsZUVkaXRQb2xpY3koKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQotCQkJcHJvdGVjdGVkIENvbW1hbmQgZ2V0TW92ZUNoaWxkcmVuQ29tbWFuZChSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQotCQkJcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlQ29tbWFuZChDcmVhdGVSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJfTsKLQkJcmV0dXJuIGxlcDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlTm9kZVNoYXBlKCkgewotCQlTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlRmlndXJlIGZpZ3VyZSA9IG5ldyBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlRmlndXJlKCk7Ci0JCXJldHVybiBwcmltYXJ5U2hhcGUgPSBmaWd1cmU7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlRmlndXJlIGdldFByaW1hcnlTaGFwZSgpIHsKLQkJcmV0dXJuIChTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlRmlndXJlKSBwcmltYXJ5U2hhcGU7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGFkZEZpeGVkQ2hpbGQoRWRpdFBhcnQgY2hpbGRFZGl0UGFydCkgewotCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVOYW1lM0VkaXRQYXJ0KSB7Ci0JCQkoKFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVOYW1lM0VkaXRQYXJ0KSBjaGlsZEVkaXRQYXJ0KQotCQkJCQkuc2V0TGFiZWwoZ2V0UHJpbWFyeVNoYXBlKCkuZ2V0RmlndXJlTm9kZU5hbWVGaWd1cmUoKSk7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHJlbW92ZUZpeGVkQ2hpbGQoRWRpdFBhcnQgY2hpbGRFZGl0UGFydCkgewotCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE5vZGVGaWd1cmUgY3JlYXRlTm9kZVBsYXRlKCkgewotCQlEZWZhdWx0U2l6ZU5vZGVGaWd1cmUgcmVzdWx0ID0gbmV3IERlZmF1bHRTaXplTm9kZUZpZ3VyZShnZXRNYXBNb2RlKCkKLQkJCQkuRFB0b0xQKDQwKSwgZ2V0TWFwTW9kZSgpLkRQdG9MUCg0MCkpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgZmlndXJlIGZvciB0aGlzIGVkaXQgcGFydC4KLQkgKiAKLQkgKiBCb2R5IG9mIHRoaXMgbWV0aG9kIGRvZXMgbm90IGRlcGVuZCBvbiBzZXR0aW5ncyBpbiBnZW5lcmF0aW9uIG1vZGVsCi0JICogc28geW91IG1heSBzYWZlbHkgcmVtb3ZlIDxpPmdlbmVyYXRlZDwvaT4gdGFnIGFuZCBtb2RpZnkgaXQuCi0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBOb2RlRmlndXJlIGNyZWF0ZU5vZGVGaWd1cmUoKSB7Ci0JCU5vZGVGaWd1cmUgZmlndXJlID0gY3JlYXRlTm9kZVBsYXRlKCk7Ci0JCWZpZ3VyZS5zZXRMYXlvdXRNYW5hZ2VyKG5ldyBTdGFja0xheW91dCgpKTsKLQkJSUZpZ3VyZSBzaGFwZSA9IGNyZWF0ZU5vZGVTaGFwZSgpOwotCQlmaWd1cmUuYWRkKHNoYXBlKTsKLQkJY29udGVudFBhbmUgPSBzZXR1cENvbnRlbnRQYW5lKHNoYXBlKTsKLQkJcmV0dXJuIGZpZ3VyZTsKLQl9Ci0KLQkvKioKLQkgKiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIHRyZWF0cyBwYXNzZWQgZmlndXJlIGFzIGNvbnRlbnQgcGFuZS4KLQkgKiBSZXNwZWN0cyBsYXlvdXQgb25lIG1heSBoYXZlIHNldCBmb3IgZ2VuZXJhdGVkIGZpZ3VyZS4KLQkgKiBAcGFyYW0gbm9kZVNoYXBlIGluc3RhbmNlIG9mIGdlbmVyYXRlZCBmaWd1cmUgY2xhc3MKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgc2V0dXBDb250ZW50UGFuZShJRmlndXJlIG5vZGVTaGFwZSkgewotCQlpZiAobm9kZVNoYXBlLmdldExheW91dE1hbmFnZXIoKSA9PSBudWxsKSB7Ci0JCQlDb25zdHJhaW5lZFRvb2xiYXJMYXlvdXQgbGF5b3V0ID0gbmV3IENvbnN0cmFpbmVkVG9vbGJhckxheW91dCgpOwotCQkJbGF5b3V0LnNldFNwYWNpbmcoZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSk7Ci0JCQlub2RlU2hhcGUuc2V0TGF5b3V0TWFuYWdlcihsYXlvdXQpOwotCQl9Ci0JCXJldHVybiBub2RlU2hhcGU7IC8vIHVzZSBub2RlU2hhcGUgaXRzZWxmIGFzIGNvbnRlbnRQYW5lCi0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJRmlndXJlIGdldENvbnRlbnRQYW5lKCkgewotCQlpZiAoY29udGVudFBhbmUgIT0gbnVsbCkgewotCQkJcmV0dXJuIGNvbnRlbnRQYW5lOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRDb250ZW50UGFuZSgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRWRpdFBhcnQgZ2V0UHJpbWFyeUNoaWxkRWRpdFBhcnQoKSB7Ci0JCXJldHVybiBnZXRDaGlsZEJ5U2VtYW50aWNIaW50KFVNTFZpc3VhbElEUmVnaXN0cnkKLQkJCQkuZ2V0VHlwZShTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZTNFZGl0UGFydC5WSVNVQUxfSUQpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkQ2hpbGRWaXN1YWwoRWRpdFBhcnQgY2hpbGRFZGl0UGFydCwgaW50IGluZGV4KSB7Ci0JCWlmIChhZGRGaXhlZENoaWxkKGNoaWxkRWRpdFBhcnQpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuYWRkQ2hpbGRWaXN1YWwoY2hpbGRFZGl0UGFydCwgLTEpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVDaGlsZFZpc3VhbChFZGl0UGFydCBjaGlsZEVkaXRQYXJ0KSB7Ci0JCWlmIChyZW1vdmVGaXhlZENoaWxkKGNoaWxkRWRpdFBhcnQpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIucmVtb3ZlQ2hpbGRWaXN1YWwoY2hpbGRFZGl0UGFydCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJRmlndXJlIGdldENvbnRlbnRQYW5lRm9yKElHcmFwaGljYWxFZGl0UGFydCBlZGl0UGFydCkgewotCi0JCXJldHVybiBzdXBlci5nZXRDb250ZW50UGFuZUZvcihlZGl0UGFydCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBjbGFzcyBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlRmlndXJlIGV4dGVuZHMgUmVjdGFuZ2xlRmlndXJlIHsKLQotCQkvKioKLQkJICogQG1vZGlmaWVkCi0JCSAqLwotCQlwdWJsaWMgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZUZpZ3VyZSgpIHsKLQotCQkJdGhpcy5zZXRPdXRsaW5lKGZhbHNlKTsKLQkJCXRoaXMuc2V0T3BhcXVlKGZhbHNlKTsKLQkJCWNyZWF0ZUNvbnRlbnRzKCk7Ci0JCX0KLQotCQkvKioKLQkJICogQG1vZGlmaWVkCi0JCSAqLwotCQlwcml2YXRlIHZvaWQgY3JlYXRlQ29udGVudHMoKSB7Ci0JCQlvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZmlnXzAgPSBuZXcgV2lkZW5lZFdyYXBMYWJlbCgpOwotCQkJZmlnXzAuc2V0VGV4dChEaWFncmFtQ29yZVJlc291cmNlcy5BY3Rpdml0eURpYWdyYW1fTmV3X0l0ZXJhdGlvbik7Ci0KLQkJCURpYWdyYW1Db3JlVXRpbC5zZXRMYWJlbFByb3BlcnRpZXMoZmlnXzApOwotCi0JCQlzZXRGaWd1cmVOb2RlTmFtZUZpZ3VyZShmaWdfMCk7Ci0KLQkJCU9iamVjdCBsYXlEYXRhMCA9IG51bGw7Ci0KLQkJCXRoaXMuYWRkKGZpZ18wLCBsYXlEYXRhMCk7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSBXcmFwTGFiZWwgZk5vZGVOYW1lRmlndXJlOwotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgV3JhcExhYmVsIGdldEZpZ3VyZU5vZGVOYW1lRmlndXJlKCkgewotCQkJcmV0dXJuIGZOb2RlTmFtZUZpZ3VyZTsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIHZvaWQgc2V0RmlndXJlTm9kZU5hbWVGaWd1cmUoV3JhcExhYmVsIGZpZykgewotCQkJZk5vZGVOYW1lRmlndXJlID0gZmlnOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgYm9vbGVhbiBteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSBmYWxzZTsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJvdGVjdGVkIGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcygpIHsKLQkJCXJldHVybiBteVVzZUxvY2FsQ29vcmRpbmF0ZXM7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJvdGVjdGVkIHZvaWQgc2V0VXNlTG9jYWxDb29yZGluYXRlcyhib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMpIHsKLQkJCW15VXNlTG9jYWxDb29yZGluYXRlcyA9IHVzZUxvY2FsQ29vcmRpbmF0ZXM7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIHZvaWQgcGFpbnRGaWd1cmUoR3JhcGhpY3MgZ3JhcGhpY3MpIHsKLQkJCWlmIChpc09wYXF1ZSgpKQotCQkJCXN1cGVyLnBhaW50RmlndXJlKGdyYXBoaWNzKTsKLQkJCXJldHVybjsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcGFydHMvU3RydWN0dXJlZEFjdGl2aXR5Tm9kZUVkaXRQYXJ0LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wYXJ0cy9TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlRWRpdFBhcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTdhMzMwZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wYXJ0cy9TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlRWRpdFBhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwNyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkdyYXBoaWNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlN0YWNrTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmN1c3RvbS5wb2xpY2llcy5PcGVuQURFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucG9saWNpZXMuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZUNhbm9uaWNhbEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wb2xpY2llcy5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wb2xpY2llcy5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlSXRlbVNlbWFudGljRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5wYXJ0LlVNTFZpc3VhbElEUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5EaWFncmFtQ29yZVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLmZpZ3VyZXMuV2lkZW5lZFdyYXBMYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnV0aWwuRGlhZ3JhbUNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLkxheW91dEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5Ob25SZXNpemFibGVFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5yZXF1ZXN0cy5DcmVhdGVSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklHcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5TaGFwZU5vZGVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5FZGl0UG9saWN5Um9sZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuQ29uc3RyYWluZWRUb29sYmFyTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5nZWYudWkuZmlndXJlcy5EZWZhdWx0U2l6ZU5vZGVGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZ2VmLnVpLmZpZ3VyZXMuTm9kZUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVFZGl0UGFydCBleHRlbmRzIFNoYXBlTm9kZUVkaXRQYXJ0IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWSVNVQUxfSUQgPSAxMDA3OwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJRmlndXJlIGNvbnRlbnRQYW5lOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJRmlndXJlIHByaW1hcnlTaGFwZTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZUVkaXRQYXJ0KFZpZXcgdmlldykgewotCQlzdXBlcih2aWV3KTsKLQl9Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCkgewotCQlzdXBlci5jcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5TRU1BTlRJQ19ST0xFLAotCQkJCW5ldyBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlSXRlbVNlbWFudGljRWRpdFBvbGljeSgpKTsKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5HUkFQSElDQUxfTk9ERV9ST0xFLAotCQkJCW5ldyBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3koKSk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5DQU5PTklDQUxfUk9MRSwKLQkJCQluZXcgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZUNhbm9uaWNhbEVkaXRQb2xpY3koKSk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuTEFZT1VUX1JPTEUsIGNyZWF0ZUxheW91dEVkaXRQb2xpY3koKSk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5PUEVOX1JPTEUsIG5ldyBPcGVuQURFZGl0UG9saWN5KCkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTGF5b3V0RWRpdFBvbGljeSBjcmVhdGVMYXlvdXRFZGl0UG9saWN5KCkgewotCQlMYXlvdXRFZGl0UG9saWN5IGxlcCA9IG5ldyBMYXlvdXRFZGl0UG9saWN5KCkgewotCi0JCQlwcm90ZWN0ZWQgRWRpdFBvbGljeSBjcmVhdGVDaGlsZEVkaXRQb2xpY3koRWRpdFBhcnQgY2hpbGQpIHsKLQkJCQlFZGl0UG9saWN5IHJlc3VsdCA9IGNoaWxkCi0JCQkJCQkuZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHsKLQkJCQkJcmVzdWx0ID0gbmV3IE5vblJlc2l6YWJsZUVkaXRQb2xpY3koKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQotCQkJcHJvdGVjdGVkIENvbW1hbmQgZ2V0TW92ZUNoaWxkcmVuQ29tbWFuZChSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQotCQkJcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlQ29tbWFuZChDcmVhdGVSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJfTsKLQkJcmV0dXJuIGxlcDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlTm9kZVNoYXBlKCkgewotCQlTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlRmlndXJlIGZpZ3VyZSA9IG5ldyBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlRmlndXJlKCk7Ci0JCXJldHVybiBwcmltYXJ5U2hhcGUgPSBmaWd1cmU7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlRmlndXJlIGdldFByaW1hcnlTaGFwZSgpIHsKLQkJcmV0dXJuIChTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlRmlndXJlKSBwcmltYXJ5U2hhcGU7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGFkZEZpeGVkQ2hpbGQoRWRpdFBhcnQgY2hpbGRFZGl0UGFydCkgewotCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVOYW1lRWRpdFBhcnQpIHsKLQkJCSgoU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWVFZGl0UGFydCkgY2hpbGRFZGl0UGFydCkKLQkJCQkJLnNldExhYmVsKGdldFByaW1hcnlTaGFwZSgpLmdldEZpZ3VyZU5vZGVOYW1lRmlndXJlKCkpOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiByZW1vdmVGaXhlZENoaWxkKEVkaXRQYXJ0IGNoaWxkRWRpdFBhcnQpIHsKLQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBOb2RlRmlndXJlIGNyZWF0ZU5vZGVQbGF0ZSgpIHsKLQkJRGVmYXVsdFNpemVOb2RlRmlndXJlIHJlc3VsdCA9IG5ldyBEZWZhdWx0U2l6ZU5vZGVGaWd1cmUoZ2V0TWFwTW9kZSgpCi0JCQkJLkRQdG9MUCg0MCksIGdldE1hcE1vZGUoKS5EUHRvTFAoNDApKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGZpZ3VyZSBmb3IgdGhpcyBlZGl0IHBhcnQuCi0JICogCi0JICogQm9keSBvZiB0aGlzIG1ldGhvZCBkb2VzIG5vdCBkZXBlbmQgb24gc2V0dGluZ3MgaW4gZ2VuZXJhdGlvbiBtb2RlbAotCSAqIHNvIHlvdSBtYXkgc2FmZWx5IHJlbW92ZSA8aT5nZW5lcmF0ZWQ8L2k+IHRhZyBhbmQgbW9kaWZ5IGl0LgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTm9kZUZpZ3VyZSBjcmVhdGVOb2RlRmlndXJlKCkgewotCQlOb2RlRmlndXJlIGZpZ3VyZSA9IGNyZWF0ZU5vZGVQbGF0ZSgpOwotCQlmaWd1cmUuc2V0TGF5b3V0TWFuYWdlcihuZXcgU3RhY2tMYXlvdXQoKSk7Ci0JCUlGaWd1cmUgc2hhcGUgPSBjcmVhdGVOb2RlU2hhcGUoKTsKLQkJZmlndXJlLmFkZChzaGFwZSk7Ci0JCWNvbnRlbnRQYW5lID0gc2V0dXBDb250ZW50UGFuZShzaGFwZSk7Ci0JCXJldHVybiBmaWd1cmU7Ci0JfQotCi0JLyoqCi0JICogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiB0cmVhdHMgcGFzc2VkIGZpZ3VyZSBhcyBjb250ZW50IHBhbmUuCi0JICogUmVzcGVjdHMgbGF5b3V0IG9uZSBtYXkgaGF2ZSBzZXQgZm9yIGdlbmVyYXRlZCBmaWd1cmUuCi0JICogQHBhcmFtIG5vZGVTaGFwZSBpbnN0YW5jZSBvZiBnZW5lcmF0ZWQgZmlndXJlIGNsYXNzCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJRmlndXJlIHNldHVwQ29udGVudFBhbmUoSUZpZ3VyZSBub2RlU2hhcGUpIHsKLQkJaWYgKG5vZGVTaGFwZS5nZXRMYXlvdXRNYW5hZ2VyKCkgPT0gbnVsbCkgewotCQkJQ29uc3RyYWluZWRUb29sYmFyTGF5b3V0IGxheW91dCA9IG5ldyBDb25zdHJhaW5lZFRvb2xiYXJMYXlvdXQoKTsKLQkJCWxheW91dC5zZXRTcGFjaW5nKGdldE1hcE1vZGUoKS5EUHRvTFAoNSkpOwotCQkJbm9kZVNoYXBlLnNldExheW91dE1hbmFnZXIobGF5b3V0KTsKLQkJfQotCQlyZXR1cm4gbm9kZVNoYXBlOyAvLyB1c2Ugbm9kZVNoYXBlIGl0c2VsZiBhcyBjb250ZW50UGFuZQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSUZpZ3VyZSBnZXRDb250ZW50UGFuZSgpIHsKLQkJaWYgKGNvbnRlbnRQYW5lICE9IG51bGwpIHsKLQkJCXJldHVybiBjb250ZW50UGFuZTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0Q29udGVudFBhbmUoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVkaXRQYXJ0IGdldFByaW1hcnlDaGlsZEVkaXRQYXJ0KCkgewotCQlyZXR1cm4gZ2V0Q2hpbGRCeVNlbWFudGljSGludChVTUxWaXN1YWxJRFJlZ2lzdHJ5Ci0JCQkJLmdldFR5cGUoU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWVFZGl0UGFydC5WSVNVQUxfSUQpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkQ2hpbGRWaXN1YWwoRWRpdFBhcnQgY2hpbGRFZGl0UGFydCwgaW50IGluZGV4KSB7Ci0JCWlmIChhZGRGaXhlZENoaWxkKGNoaWxkRWRpdFBhcnQpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuYWRkQ2hpbGRWaXN1YWwoY2hpbGRFZGl0UGFydCwgLTEpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVDaGlsZFZpc3VhbChFZGl0UGFydCBjaGlsZEVkaXRQYXJ0KSB7Ci0JCWlmIChyZW1vdmVGaXhlZENoaWxkKGNoaWxkRWRpdFBhcnQpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIucmVtb3ZlQ2hpbGRWaXN1YWwoY2hpbGRFZGl0UGFydCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJRmlndXJlIGdldENvbnRlbnRQYW5lRm9yKElHcmFwaGljYWxFZGl0UGFydCBlZGl0UGFydCkgewotCi0JCXJldHVybiBzdXBlci5nZXRDb250ZW50UGFuZUZvcihlZGl0UGFydCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBjbGFzcyBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlRmlndXJlIGV4dGVuZHMgUmVjdGFuZ2xlRmlndXJlIHsKLQotCQkvKioKLQkJICogQG1vZGlmaWVkCi0JCSAqLwotCQlwdWJsaWMgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZUZpZ3VyZSgpIHsKLQotCQkJdGhpcy5zZXRPdXRsaW5lKGZhbHNlKTsKLQkJCXRoaXMuc2V0T3BhcXVlKGZhbHNlKTsKLQkJCWNyZWF0ZUNvbnRlbnRzKCk7Ci0JCX0KLQotCQkvKioKLQkJICogQG1vZGlmaWVkCi0JCSAqLwotCQlwcml2YXRlIHZvaWQgY3JlYXRlQ29udGVudHMoKSB7Ci0JCQlvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZmlnXzAgPSBuZXcgV2lkZW5lZFdyYXBMYWJlbCgpOwotCQkJZmlnXzAuc2V0VGV4dChEaWFncmFtQ29yZVJlc291cmNlcy5BY3Rpdml0eURpYWdyYW1fTmV3X0FjdGl2aXR5KTsKLQotCQkJRGlhZ3JhbUNvcmVVdGlsLnNldExhYmVsUHJvcGVydGllcyhmaWdfMCk7Ci0JCQlzZXRGaWd1cmVOb2RlTmFtZUZpZ3VyZShmaWdfMCk7Ci0KLQkJCU9iamVjdCBsYXlEYXRhMCA9IG51bGw7Ci0KLQkJCXRoaXMuYWRkKGZpZ18wLCBsYXlEYXRhMCk7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSBXcmFwTGFiZWwgZk5vZGVOYW1lRmlndXJlOwotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgV3JhcExhYmVsIGdldEZpZ3VyZU5vZGVOYW1lRmlndXJlKCkgewotCQkJcmV0dXJuIGZOb2RlTmFtZUZpZ3VyZTsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIHZvaWQgc2V0RmlndXJlTm9kZU5hbWVGaWd1cmUoV3JhcExhYmVsIGZpZykgewotCQkJZk5vZGVOYW1lRmlndXJlID0gZmlnOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgYm9vbGVhbiBteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSBmYWxzZTsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJvdGVjdGVkIGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcygpIHsKLQkJCXJldHVybiBteVVzZUxvY2FsQ29vcmRpbmF0ZXM7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJvdGVjdGVkIHZvaWQgc2V0VXNlTG9jYWxDb29yZGluYXRlcyhib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMpIHsKLQkJCW15VXNlTG9jYWxDb29yZGluYXRlcyA9IHVzZUxvY2FsQ29vcmRpbmF0ZXM7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIHZvaWQgcGFpbnRGaWd1cmUoR3JhcGhpY3MgZ3JhcGhpY3MpIHsKLQkJCWlmIChpc09wYXF1ZSgpKQotCQkJCXN1cGVyLnBhaW50RmlndXJlKGdyYXBoaWNzKTsKLQkJCXJldHVybjsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcGFydHMvU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWUyRWRpdFBhcnQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BhcnRzL1N0cnVjdHVyZWRBY3Rpdml0eU5vZGVOYW1lMkVkaXRQYXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmMzcxMzMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcGFydHMvU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWUyRWRpdFBhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyOCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uUnVubmFibGVXaXRoUmVzdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmN1c3RvbS5wb2xpY2llcy5PcGVuQURFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucG9saWNpZXMuVU1MVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQucGFydC5BY3Rpdml0eURpYWdyYW1FZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQucHJvdmlkZXJzLlVNTEVsZW1lbnRUeXBlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnByb3ZpZGVycy5EaWFncmFtSWNvblByb3ZpZGVyTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnV0aWwuRGlhZ3JhbUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnV0aWwuRGlhZ3JhbUNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUudXRpbC5WYWxpZGF0aW5nVGV4dERpcmVjdEVkaXRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5BY2Nlc3NpYmxlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuTm9uUmVzaXphYmxlRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuaGFuZGxlcy5Ob25SZXNpemFibGVIYW5kbGVLaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLkRpcmVjdEVkaXRSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi50b29scy5EaXJlY3RFZGl0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLklQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5JUGFyc2VyRWRpdFN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLlBhcnNlckVkaXRTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5QYXJzZXJPcHRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuUGFyc2VyU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5Db21wYXJ0bWVudEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklHcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JVGV4dEF3YXJlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuRWRpdFBvbGljeVJvbGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkxhYmVsRGlyZWN0RWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmwxMG4uRGlhZ3JhbUNvbG9yUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXF1ZXN0cy5SZXF1ZXN0Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkudG9vbHMuVGV4dERpcmVjdEVkaXRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29yZS51dGlsLkVPYmplY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuSUVsZW1lbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi51aS5zZXJ2aWNlcy5wYXJzZXIuSVNlbWFudGljUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi51aS5zZXJ2aWNlcy5wYXJzZXIuUGFyc2VySGludEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRm9udFN0eWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vdGF0aW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGVudEFzc2lzdFByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDZWxsRWRpdG9yVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJsZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVOYW1lMkVkaXRQYXJ0IGV4dGVuZHMgQ29tcGFydG1lbnRFZGl0UGFydAotCQlpbXBsZW1lbnRzIElUZXh0QXdhcmVFZGl0UGFydCB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVklTVUFMX0lEID0gNDAwOTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIERpcmVjdEVkaXRNYW5hZ2VyIG1hbmFnZXI7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBJUGFyc2VyIHBhcnNlcjsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIExpc3QgcGFyc2VyRWxlbWVudHM7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZGVmYXVsdFRleHQ7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVOYW1lMkVkaXRQYXJ0KFZpZXcgdmlldykgewotCQlzdXBlcih2aWV3KTsKLQl9Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCkgewotCQlzdXBlci5jcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuRElSRUNUX0VESVRfUk9MRSwKLQkJCQluZXcgTGFiZWxEaXJlY3RFZGl0UG9saWN5KCkpOwotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFLAotCQkJCW5ldyBOb25SZXNpemFibGVFZGl0UG9saWN5KCkgewotCi0JCQkJCXByb3RlY3RlZCBMaXN0IGNyZWF0ZVNlbGVjdGlvbkhhbmRsZXMoKSB7Ci0JCQkJCQlMaXN0IGhhbmRsZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCQlOb25SZXNpemFibGVIYW5kbGVLaXQuYWRkTW92ZUhhbmRsZSgKLQkJCQkJCQkJKEdyYXBoaWNhbEVkaXRQYXJ0KSBnZXRIb3N0KCksIGhhbmRsZXMpOwotCQkJCQkJcmV0dXJuIGhhbmRsZXM7Ci0JCQkJCX0KLQotCQkJCQlwdWJsaWMgQ29tbWFuZCBnZXRDb21tYW5kKFJlcXVlc3QgcmVxdWVzdCkgewotCQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJCX0KLQotCQkJCQlwdWJsaWMgYm9vbGVhbiB1bmRlcnN0YW5kc1JlcXVlc3QoUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCi0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5PUEVOX1JPTEUsIG5ldyBPcGVuQURFZGl0UG9saWN5KCkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldExhYmVsVGV4dEhlbHBlcihJRmlndXJlIGZpZ3VyZSkgewotCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQlyZXR1cm4gKChXcmFwTGFiZWwpIGZpZ3VyZSkuZ2V0VGV4dCgpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuICgoTGFiZWwpIGZpZ3VyZSkuZ2V0VGV4dCgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldExhYmVsVGV4dEhlbHBlcihJRmlndXJlIGZpZ3VyZSwgU3RyaW5nIHRleHQpIHsKLQkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJKChXcmFwTGFiZWwpIGZpZ3VyZSkuc2V0VGV4dCh0ZXh0KTsKLQkJfSBlbHNlIHsKLQkJCSgoTGFiZWwpIGZpZ3VyZSkuc2V0VGV4dCh0ZXh0KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSW1hZ2UgZ2V0TGFiZWxJY29uSGVscGVyKElGaWd1cmUgZmlndXJlKSB7Ci0JCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCXJldHVybiAoKFdyYXBMYWJlbCkgZmlndXJlKS5nZXRJY29uKCk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gKChMYWJlbCkgZmlndXJlKS5nZXRJY29uKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0TGFiZWxJY29uSGVscGVyKElGaWd1cmUgZmlndXJlLCBJbWFnZSBpY29uKSB7Ci0JCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCSgoV3JhcExhYmVsKSBmaWd1cmUpLnNldEljb24oaWNvbik7Ci0JCX0gZWxzZSB7Ci0JCQkoKExhYmVsKSBmaWd1cmUpLnNldEljb24oaWNvbik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGFiZWwoV3JhcExhYmVsIGZpZ3VyZSkgewotCQl1bnJlZ2lzdGVyVmlzdWFscygpOwotCQlzZXRGaWd1cmUoZmlndXJlKTsKLQkJZGVmYXVsdFRleHQgPSBnZXRMYWJlbFRleHRIZWxwZXIoZmlndXJlKTsKLQkJcmVnaXN0ZXJWaXN1YWxzKCk7Ci0JCXJlZnJlc2hWaXN1YWxzKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBMaXN0IGdldE1vZGVsQ2hpbGRyZW4oKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSUdyYXBoaWNhbEVkaXRQYXJ0IGdldENoaWxkQnlTZW1hbnRpY0hpbnQoU3RyaW5nIHNlbWFudGljSGludCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVPYmplY3QgZ2V0UGFyc2VyRWxlbWVudCgpIHsKLQkJRU9iamVjdCBlbGVtZW50ID0gcmVzb2x2ZVNlbWFudGljRWxlbWVudCgpOwotCQlyZXR1cm4gZWxlbWVudCAhPSBudWxsID8gZWxlbWVudCA6IChWaWV3KSBnZXRNb2RlbCgpOwotCX0KLQotCS8qKgotCSAqIEBtb2RpZmllZAotCSAqLwotCXByb3RlY3RlZCBJbWFnZSBnZXRMYWJlbEljb24oKSB7Ci0JCUltYWdlIGltYWdlID0gIERpYWdyYW1JY29uUHJvdmlkZXJNYW5hZ2VyLmdldEluc3RhbmNlKCkuZ2V0SWNvbihyZXNvbHZlU2VtYW50aWNFbGVtZW50KCksIGZhbHNlKTsKLQkJaWYgKGltYWdlID09IG51bGwpIHsKLQkJCWltYWdlID0gQWN0aXZpdHlEaWFncmFtRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0U2hhcmVkSW1hZ2UoImRpYWdyYW0vcGhhc2UuZ2lmIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gaW1hZ2U7CQkKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRMYWJlbFRleHQoKSB7Ci0JCVN0cmluZyB0ZXh0ID0gbnVsbDsKLQkJaWYgKGdldFBhcnNlcigpICE9IG51bGwpIHsKLQkJCXRleHQgPSBnZXRQYXJzZXIoKS5nZXRQcmludFN0cmluZygKLQkJCQkJbmV3IEVPYmplY3RBZGFwdGVyKGdldFBhcnNlckVsZW1lbnQoKSksCi0JCQkJCWdldFBhcnNlck9wdGlvbnMoKS5pbnRWYWx1ZSgpKTsKLQkJfQotCQlpZiAodGV4dCA9PSBudWxsIHx8IHRleHQubGVuZ3RoKCkgPT0gMCkgewotCQkJdGV4dCA9IGRlZmF1bHRUZXh0OwotCQl9Ci0JCXJldHVybiB0ZXh0OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMYWJlbFRleHQoU3RyaW5nIHRleHQpIHsKLQkJc2V0TGFiZWxUZXh0SGVscGVyKGdldEZpZ3VyZSgpLCB0ZXh0KTsKLQkJT2JqZWN0IHBkRWRpdFBvbGljeSA9IGdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSk7Ci0JCWlmIChwZEVkaXRQb2xpY3kgaW5zdGFuY2VvZiBVTUxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgewotCQkJKChVTUxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgcGRFZGl0UG9saWN5KS5yZWZyZXNoRmVlZGJhY2soKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEVkaXRUZXh0KCkgewotCQlpZiAoZ2V0UGFyc2VyKCkgPT0gbnVsbCkgewotCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIGdldFBhcnNlcigpLmdldEVkaXRTdHJpbmcoCi0JCQkJbmV3IEVPYmplY3RBZGFwdGVyKGdldFBhcnNlckVsZW1lbnQoKSksCi0JCQkJZ2V0UGFyc2VyT3B0aW9ucygpLmludFZhbHVlKCkpOwotCX0KLQotCS8qKgotCSAqIEBtb2RpZmllZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzRWRpdGFibGUoKSB7Ci0JCWlmIChEaWFncmFtQ29yZVV0aWwuaXNSZWFkT25seSh0aGlzKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIGdldEVkaXRUZXh0KCkgIT0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElDZWxsRWRpdG9yVmFsaWRhdG9yIGdldEVkaXRUZXh0VmFsaWRhdG9yKCkgewotCQlyZXR1cm4gbmV3IElDZWxsRWRpdG9yVmFsaWRhdG9yKCkgewotCi0JCQlwdWJsaWMgU3RyaW5nIGlzVmFsaWQoZmluYWwgT2JqZWN0IHZhbHVlKSB7Ci0JCQkJaWYgKHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0JCQkJCWZpbmFsIEVPYmplY3QgZWxlbWVudCA9IGdldFBhcnNlckVsZW1lbnQoKTsKLQkJCQkJZmluYWwgSVBhcnNlciBwYXJzZXIgPSBnZXRQYXJzZXIoKTsKLQkJCQkJdHJ5IHsKLQkJCQkJCUlQYXJzZXJFZGl0U3RhdHVzIHZhbGlkID0gKElQYXJzZXJFZGl0U3RhdHVzKSBnZXRFZGl0aW5nRG9tYWluKCkKLQkJCQkJCQkJLnJ1bkV4Y2x1c2l2ZShuZXcgUnVubmFibGVXaXRoUmVzdWx0LkltcGwoKSB7Ci0KLQkJCQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQkJCQlzZXRSZXN1bHQocGFyc2VyLmlzVmFsaWRFZGl0U3RyaW5nKAotCQkJCQkJCQkJCQkJbmV3IEVPYmplY3RBZGFwdGVyKGVsZW1lbnQpLAotCQkJCQkJCQkJCQkJKFN0cmluZykgdmFsdWUpKTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfSk7Ci0JCQkJCQlyZXR1cm4gdmFsaWQuZ2V0Q29kZSgpID09IFBhcnNlckVkaXRTdGF0dXMuRURJVEFCTEUgPyBudWxsCi0JCQkJCQkJCTogdmFsaWQuZ2V0TWVzc2FnZSgpOwotCQkJCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZSkgewotCQkJCQkJaWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQkvLyBzaG91bGRuJ3QgZ2V0IGhlcmUKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElDb250ZW50QXNzaXN0UHJvY2Vzc29yIGdldENvbXBsZXRpb25Qcm9jZXNzb3IoKSB7Ci0JCWlmIChnZXRQYXJzZXIoKSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gZ2V0UGFyc2VyKCkuZ2V0Q29tcGxldGlvblByb2Nlc3NvcigKLQkJCQluZXcgRU9iamVjdEFkYXB0ZXIoZ2V0UGFyc2VyRWxlbWVudCgpKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQYXJzZXJPcHRpb25zIGdldFBhcnNlck9wdGlvbnMoKSB7Ci0JCXJldHVybiBQYXJzZXJPcHRpb25zLk5PTkU7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJUGFyc2VyIGdldFBhcnNlcigpIHsKLQkJaWYgKHBhcnNlciA9PSBudWxsKSB7Ci0JCQlTdHJpbmcgcGFyc2VySGludCA9ICgoVmlldykgZ2V0TW9kZWwoKSkuZ2V0VHlwZSgpOwotCQkJUGFyc2VySGludEFkYXB0ZXIgaGludEFkYXB0ZXIgPSBuZXcgUGFyc2VySGludEFkYXB0ZXIoCi0JCQkJCWdldFBhcnNlckVsZW1lbnQoKSwgcGFyc2VySGludCkgewotCi0JCQkJcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKENsYXNzIGFkYXB0ZXIpIHsKLQkJCQkJaWYgKElFbGVtZW50VHlwZS5jbGFzcy5lcXVhbHMoYWRhcHRlcikpIHsKLQkJCQkJCXJldHVybiBVTUxFbGVtZW50VHlwZXMuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZV8xMDEwOwotCQkJCQl9Ci0JCQkJCXJldHVybiBzdXBlci5nZXRBZGFwdGVyKGFkYXB0ZXIpOwotCQkJCX0KLQkJCX07Ci0JCQlwYXJzZXIgPSBQYXJzZXJTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0UGFyc2VyKGhpbnRBZGFwdGVyKTsKLQkJfQotCQlyZXR1cm4gcGFyc2VyOwotCX0KLQotCS8qKgotCSAqIEBtb2RpZmllZAotCSAqLwotCXByb3RlY3RlZCBEaXJlY3RFZGl0TWFuYWdlciBnZXRNYW5hZ2VyKCkgewotCQlpZiAobWFuYWdlciA9PSBudWxsKSB7Ci0JCQlzZXRNYW5hZ2VyKG5ldyBWYWxpZGF0aW5nVGV4dERpcmVjdEVkaXRNYW5hZ2VyKHRoaXMsCi0JCQkJCVRleHREaXJlY3RFZGl0TWFuYWdlci5nZXRUZXh0Q2VsbEVkaXRvckNsYXNzKHRoaXMpLAotCQkJCQlVTUxFZGl0UGFydEZhY3RvcnkuZ2V0VGV4dENlbGxFZGl0b3JMb2NhdG9yKHRoaXMpKSB7Ci0KLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdCgpIHsKLQkJCQkJKChTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZTJFZGl0UGFydCkgZ2V0RWRpdFBhcnQoKSkKLQkJCQkJCQkucGVyZm9ybURpcmVjdEVkaXQoKTsKLQkJCQl9Ci0KLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgU3RyaW5nIHZhbGlkYXRlKFN0cmluZyB0eHQpIHsKLQkJCQkJcmV0dXJuIERpYWdyYW1Db3JlVXRpbC52YWxpZFN0cmluZ0ZvckJyZWFrZG93bkVsZW1lbnRzKAotCQkJCQkJCWdldEVkaXRQYXJ0KCksIHR4dCk7Ci0JCQkJfQotCi0JCQl9KTsKLQkJfQotCQlyZXR1cm4gbWFuYWdlcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0TWFuYWdlcihEaXJlY3RFZGl0TWFuYWdlciBtYW5hZ2VyKSB7Ci0JCXRoaXMubWFuYWdlciA9IG1hbmFnZXI7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0KCkgewotCQlnZXRNYW5hZ2VyKCkuc2hvdygpOwotCX0KLQotCS8qKgotCSAqIEBtb2RpZmllZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0KFBvaW50IGV2ZW50TG9jYXRpb24pIHsKLQkJaWYgKGdldE1hbmFnZXIoKSBpbnN0YW5jZW9mIFRleHREaXJlY3RFZGl0TWFuYWdlcikgewotCQkJKChUZXh0RGlyZWN0RWRpdE1hbmFnZXIpIGdldE1hbmFnZXIoKSkuc2hvdyhldmVudExvY2F0aW9uCi0JCQkJCS5nZXRTV1RQb2ludCgpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHZvaWQgcGVyZm9ybURpcmVjdEVkaXQoY2hhciBpbml0aWFsQ2hhcmFjdGVyKSB7Ci0JCWlmIChnZXRNYW5hZ2VyKCkgaW5zdGFuY2VvZiBUZXh0RGlyZWN0RWRpdE1hbmFnZXIpIHsKLQkJCSgoVGV4dERpcmVjdEVkaXRNYW5hZ2VyKSBnZXRNYW5hZ2VyKCkpLnNob3coaW5pdGlhbENoYXJhY3Rlcik7Ci0JCX0gZWxzZSB7Ci0JCQlwZXJmb3JtRGlyZWN0RWRpdCgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0UmVxdWVzdChSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJZmluYWwgUmVxdWVzdCB0aGVSZXF1ZXN0ID0gcmVxdWVzdDsKLQkJdHJ5IHsKLQkJCWdldEVkaXRpbmdEb21haW4oKS5ydW5FeGNsdXNpdmUobmV3IFJ1bm5hYmxlKCkgewotCi0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQlpZiAoaXNBY3RpdmUoKSAmJiBpc0VkaXRhYmxlKCkpIHsKLQkJCQkJCWlmICh0aGVSZXF1ZXN0Ci0JCQkJCQkJCS5nZXRFeHRlbmRlZERhdGEoKQotCQkJCQkJCQkuZ2V0KAotCQkJCQkJCQkJCVJlcXVlc3RDb25zdGFudHMuUkVRX0RJUkVDVEVESVRfRVhURU5ERUREQVRBX0lOSVRJQUxfQ0hBUikgaW5zdGFuY2VvZiBDaGFyYWN0ZXIpIHsKLQkJCQkJCQlDaGFyYWN0ZXIgaW5pdGlhbENoYXIgPSAoQ2hhcmFjdGVyKSB0aGVSZXF1ZXN0Ci0JCQkJCQkJCQkuZ2V0RXh0ZW5kZWREYXRhKCkKLQkJCQkJCQkJCS5nZXQoCi0JCQkJCQkJCQkJCVJlcXVlc3RDb25zdGFudHMuUkVRX0RJUkVDVEVESVRfRVhURU5ERUREQVRBX0lOSVRJQUxfQ0hBUik7Ci0JCQkJCQkJcGVyZm9ybURpcmVjdEVkaXQoaW5pdGlhbENoYXIuY2hhclZhbHVlKCkpOwotCQkJCQkJfSBlbHNlIGlmICgodGhlUmVxdWVzdCBpbnN0YW5jZW9mIERpcmVjdEVkaXRSZXF1ZXN0KQotCQkJCQkJCQkmJiAoZ2V0RWRpdFRleHQoKS5lcXVhbHMoZ2V0TGFiZWxUZXh0KCkpKSkgewotCQkJCQkJCURpcmVjdEVkaXRSZXF1ZXN0IGVkaXRSZXF1ZXN0ID0gKERpcmVjdEVkaXRSZXF1ZXN0KSB0aGVSZXF1ZXN0OwotCQkJCQkJCXBlcmZvcm1EaXJlY3RFZGl0KGVkaXRSZXF1ZXN0LmdldExvY2F0aW9uKCkpOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlwZXJmb3JtRGlyZWN0RWRpdCgpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfSk7Ci0JCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFZpc3VhbHMoKSB7Ci0JCXN1cGVyLnJlZnJlc2hWaXN1YWxzKCk7Ci0JCXJlZnJlc2hMYWJlbCgpOwotCQlyZWZyZXNoRm9udCgpOwotCQlyZWZyZXNoRm9udENvbG9yKCk7Ci0JCXJlZnJlc2hVbmRlcmxpbmUoKTsKLQkJcmVmcmVzaFN0cmlrZVRocm91Z2goKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaExhYmVsKCkgewotCQlzZXRMYWJlbFRleHRIZWxwZXIoZ2V0RmlndXJlKCksIGdldExhYmVsVGV4dCgpKTsKLQkJc2V0TGFiZWxJY29uSGVscGVyKGdldEZpZ3VyZSgpLCBnZXRMYWJlbEljb24oKSk7Ci0JCU9iamVjdCBwZEVkaXRQb2xpY3kgPSBnZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUpOwotCQlpZiAocGRFZGl0UG9saWN5IGluc3RhbmNlb2YgVU1MVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHsKLQkJCSgoVU1MVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHBkRWRpdFBvbGljeSkucmVmcmVzaEZlZWRiYWNrKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFVuZGVybGluZSgpIHsKLQkJRm9udFN0eWxlIHN0eWxlID0gKEZvbnRTdHlsZSkgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkuZ2V0U3R5bGUoCi0JCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGUoKSk7Ci0JCWlmIChzdHlsZSAhPSBudWxsICYmIGdldEZpZ3VyZSgpIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQkoKFdyYXBMYWJlbCkgZ2V0RmlndXJlKCkpLnNldFRleHRVbmRlcmxpbmUoc3R5bGUuaXNVbmRlcmxpbmUoKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFN0cmlrZVRocm91Z2goKSB7Ci0JCUZvbnRTdHlsZSBzdHlsZSA9IChGb250U3R5bGUpIGdldEZvbnRTdHlsZU93bmVyVmlldygpLmdldFN0eWxlKAotCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlKCkpOwotCQlpZiAoc3R5bGUgIT0gbnVsbCAmJiBnZXRGaWd1cmUoKSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJKChXcmFwTGFiZWwpIGdldEZpZ3VyZSgpKS5zZXRUZXh0U3RyaWtlVGhyb3VnaChzdHlsZQotCQkJCQkuaXNTdHJpa2VUaHJvdWdoKCkpOwotCQl9Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaEZvbnQoKSB7Ci0JCUZvbnRTdHlsZSBzdHlsZSA9IChGb250U3R5bGUpIGdldEZvbnRTdHlsZU93bmVyVmlldygpLmdldFN0eWxlKAotCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlKCkpOwotCQlpZiAoc3R5bGUgIT0gbnVsbCkgewotCQkJU3RyaW5nIGZvbnROYW1lID0gRGlhZ3JhbUNvbnN0YW50cy5nZXRGb250TmFtZShzdHlsZSk7Ci0JCQlGb250RGF0YSBmb250RGF0YSA9IG5ldyBGb250RGF0YShmb250TmFtZSwgc3R5bGUKLQkJCQkJLmdldEZvbnRIZWlnaHQoKSwgKHN0eWxlLmlzQm9sZCgpID8gU1dULkJPTEQgOiBTV1QuTk9STUFMKQotCQkJCQl8IChzdHlsZS5pc0l0YWxpYygpID8gU1dULklUQUxJQyA6IFNXVC5OT1JNQUwpKTsKLQkJCXNldEZvbnQoZm9udERhdGEpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0Rm9udENvbG9yKENvbG9yIGNvbG9yKSB7Ci0JCUNvbG9yIGMgPSBEaWFncmFtQ29yZVV0aWwuZ2V0Rm9udENvbG9yKHRoaXMpOwotCQlpZiAoYyAhPSBudWxsKSB7Ci0JCQljb2xvciA9IGM7Ci0JCX0KLQkJZ2V0RmlndXJlKCkuc2V0Rm9yZWdyb3VuZENvbG9yKGNvbG9yKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkU2VtYW50aWNMaXN0ZW5lcnMoKSB7Ci0JCWlmIChnZXRQYXJzZXIoKSBpbnN0YW5jZW9mIElTZW1hbnRpY1BhcnNlcikgewotCQkJRU9iamVjdCBlbGVtZW50ID0gcmVzb2x2ZVNlbWFudGljRWxlbWVudCgpOwotCQkJcGFyc2VyRWxlbWVudHMgPSAoKElTZW1hbnRpY1BhcnNlcikgZ2V0UGFyc2VyKCkpCi0JCQkJCS5nZXRTZW1hbnRpY0VsZW1lbnRzQmVpbmdQYXJzZWQoZWxlbWVudCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcnNlckVsZW1lbnRzLnNpemUoKTsgaSsrKSB7Ci0JCQkJYWRkTGlzdGVuZXJGaWx0ZXIoCi0JCQkJCQkiU2VtYW50aWNNb2RlbCIgKyBpLCB0aGlzLCAoRU9iamVjdCkgcGFyc2VyRWxlbWVudHMuZ2V0KGkpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9IGVsc2UgewotCQkJc3VwZXIuYWRkU2VtYW50aWNMaXN0ZW5lcnMoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVTZW1hbnRpY0xpc3RlbmVycygpIHsKLQkJaWYgKHBhcnNlckVsZW1lbnRzICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGFyc2VyRWxlbWVudHMuc2l6ZSgpOyBpKyspIHsKLQkJCQlyZW1vdmVMaXN0ZW5lckZpbHRlcigiU2VtYW50aWNNb2RlbCIgKyBpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9IGVsc2UgewotCQkJc3VwZXIucmVtb3ZlU2VtYW50aWNMaXN0ZW5lcnMoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQWNjZXNzaWJsZUVkaXRQYXJ0IGdldEFjY2Vzc2libGVFZGl0UGFydCgpIHsKLQkJaWYgKGFjY2Vzc2libGVFUCA9PSBudWxsKSB7Ci0JCQlhY2Nlc3NpYmxlRVAgPSBuZXcgQWNjZXNzaWJsZUdyYXBoaWNhbEVkaXRQYXJ0KCkgewotCi0JCQkJcHVibGljIHZvaWQgZ2V0TmFtZShBY2Nlc3NpYmxlRXZlbnQgZSkgewotCQkJCQllLnJlc3VsdCA9IGdldExhYmVsVGV4dEhlbHBlcihnZXRGaWd1cmUoKSk7Ci0JCQkJfQotCQkJfTsKLQkJfQotCQlyZXR1cm4gYWNjZXNzaWJsZUVQOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIFZpZXcgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkgewotCQlyZXR1cm4gZ2V0UHJpbWFyeVZpZXcoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkTm90YXRpb25hbExpc3RlbmVycygpIHsKLQkJc3VwZXIuYWRkTm90YXRpb25hbExpc3RlbmVycygpOwotCQlhZGRMaXN0ZW5lckZpbHRlcigiUHJpbWFyeVZpZXciLCB0aGlzLCBnZXRQcmltYXJ5VmlldygpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVOb3RhdGlvbmFsTGlzdGVuZXJzKCkgewotCQlzdXBlci5yZW1vdmVOb3RhdGlvbmFsTGlzdGVuZXJzKCk7Ci0JCXJlbW92ZUxpc3RlbmVyRmlsdGVyKCJQcmltYXJ5VmlldyIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGhhbmRsZU5vdGlmaWNhdGlvbkV2ZW50KE5vdGlmaWNhdGlvbiBldmVudCkgewotCQlPYmplY3QgZmVhdHVyZSA9IGV2ZW50LmdldEZlYXR1cmUoKTsKLQkJaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0ZvbnRDb2xvcigpLmVxdWFscyhmZWF0dXJlKSkgewotCQkJSW50ZWdlciBjID0gKEludGVnZXIpIGV2ZW50LmdldE5ld1ZhbHVlKCk7Ci0JCQlzZXRGb250Q29sb3IoRGlhZ3JhbUNvbG9yUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXRDb2xvcihjKSk7Ci0JCX0gZWxzZSBpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfVW5kZXJsaW5lKCkuZXF1YWxzKAotCQkJCWZlYXR1cmUpKSB7Ci0JCQlyZWZyZXNoVW5kZXJsaW5lKCk7Ci0JCX0gZWxzZSBpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfU3RyaWtlVGhyb3VnaCgpCi0JCQkJLmVxdWFscyhmZWF0dXJlKSkgewotCQkJcmVmcmVzaFN0cmlrZVRocm91Z2goKTsKLQkJfSBlbHNlIGlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Gb250SGVpZ2h0KCkuZXF1YWxzKAotCQkJCWZlYXR1cmUpCi0JCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfRm9udE5hbWUoKS5lcXVhbHMoCi0JCQkJCQlmZWF0dXJlKQotCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0JvbGQoKQotCQkJCQkJLmVxdWFscyhmZWF0dXJlKQotCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0l0YWxpYygpLmVxdWFscygKLQkJCQkJCWZlYXR1cmUpKSB7Ci0JCQlyZWZyZXNoRm9udCgpOwotCQl9IGVsc2UgewotCQkJaWYgKGdldFBhcnNlcigpICE9IG51bGwKLQkJCQkJJiYgZ2V0UGFyc2VyKCkuaXNBZmZlY3RpbmdFdmVudChldmVudCwKLQkJCQkJCQlnZXRQYXJzZXJPcHRpb25zKCkuaW50VmFsdWUoKSkpIHsKLQkJCQlyZWZyZXNoTGFiZWwoKTsKLQkJCX0KLQkJCWlmIChnZXRQYXJzZXIoKSBpbnN0YW5jZW9mIElTZW1hbnRpY1BhcnNlcikgewotCQkJCUlTZW1hbnRpY1BhcnNlciBtb2RlbFBhcnNlciA9IChJU2VtYW50aWNQYXJzZXIpIGdldFBhcnNlcigpOwotCQkJCWlmIChtb2RlbFBhcnNlci5hcmVTZW1hbnRpY0VsZW1lbnRzQWZmZWN0ZWQobnVsbCwgZXZlbnQpKSB7Ci0JCQkJCXJlbW92ZVNlbWFudGljTGlzdGVuZXJzKCk7Ci0JCQkJCWlmIChyZXNvbHZlU2VtYW50aWNFbGVtZW50KCkgIT0gbnVsbCkgewotCQkJCQkJYWRkU2VtYW50aWNMaXN0ZW5lcnMoKTsKLQkJCQkJfQotCQkJCQlyZWZyZXNoTGFiZWwoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJc3VwZXIuaGFuZGxlTm90aWZpY2F0aW9uRXZlbnQoZXZlbnQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVGaWd1cmUoKSB7Ci0JCS8vIFBhcmVudCBzaG91bGQgYXNzaWduIG9uZSB1c2luZyBzZXRMYWJlbCgpIG1ldGhvZAotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wYXJ0cy9TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZTNFZGl0UGFydC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcGFydHMvU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWUzRWRpdFBhcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmI1MDUzNS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wYXJ0cy9TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZTNFZGl0UGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjI4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5SdW5uYWJsZVdpdGhSZXN1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuY3VzdG9tLnBvbGljaWVzLk9wZW5BREVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wb2xpY2llcy5VTUxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5wYXJ0LkFjdGl2aXR5RGlhZ3JhbUVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5wcm92aWRlcnMuVU1MRWxlbWVudFR5cGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUucHJvdmlkZXJzLkRpYWdyYW1JY29uUHJvdmlkZXJNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUudXRpbC5EaWFncmFtQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUudXRpbC5EaWFncmFtQ29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS51dGlsLlZhbGlkYXRpbmdUZXh0RGlyZWN0RWRpdE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkFjY2Vzc2libGVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuR3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5Ob25SZXNpemFibGVFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5oYW5kbGVzLk5vblJlc2l6YWJsZUhhbmRsZUtpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuRGlyZWN0RWRpdFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnRvb2xzLkRpcmVjdEVkaXRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuSVBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLklQYXJzZXJFZGl0U3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuUGFyc2VyRWRpdFN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLlBhcnNlck9wdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5QYXJzZXJTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLkNvbXBhcnRtZW50RWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklUZXh0QXdhcmVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5FZGl0UG9saWN5Um9sZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuTGFiZWxEaXJlY3RFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkubDEwbi5EaWFncmFtQ29sb3JSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlcXVlc3RzLlJlcXVlc3RDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS50b29scy5UZXh0RGlyZWN0RWRpdE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb3JlLnV0aWwuRU9iamVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5JRWxlbWVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnVpLnNlcnZpY2VzLnBhcnNlci5JU2VtYW50aWNQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnVpLnNlcnZpY2VzLnBhcnNlci5QYXJzZXJIaW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Gb250U3R5bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm90YXRpb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZW50QXNzaXN0UHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNlbGxFZGl0b3JWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmxlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250RGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWUzRWRpdFBhcnQgZXh0ZW5kcyBDb21wYXJ0bWVudEVkaXRQYXJ0Ci0JCWltcGxlbWVudHMgSVRleHRBd2FyZUVkaXRQYXJ0IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWSVNVQUxfSUQgPSA0MDEwOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRGlyZWN0RWRpdE1hbmFnZXIgbWFuYWdlcjsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIElQYXJzZXIgcGFyc2VyOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgTGlzdCBwYXJzZXJFbGVtZW50czsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBkZWZhdWx0VGV4dDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWUzRWRpdFBhcnQoVmlldyB2aWV3KSB7Ci0JCXN1cGVyKHZpZXcpOwotCX0KLQotCS8qKgotCSAqIEBtb2RpZmllZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKSB7Ci0JCXN1cGVyLmNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKTsKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5ESVJFQ1RfRURJVF9ST0xFLAotCQkJCW5ldyBMYWJlbERpcmVjdEVkaXRQb2xpY3koKSk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUsCi0JCQkJbmV3IE5vblJlc2l6YWJsZUVkaXRQb2xpY3koKSB7Ci0KLQkJCQkJcHJvdGVjdGVkIExpc3QgY3JlYXRlU2VsZWN0aW9uSGFuZGxlcygpIHsKLQkJCQkJCUxpc3QgaGFuZGxlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJCU5vblJlc2l6YWJsZUhhbmRsZUtpdC5hZGRNb3ZlSGFuZGxlKAotCQkJCQkJCQkoR3JhcGhpY2FsRWRpdFBhcnQpIGdldEhvc3QoKSwgaGFuZGxlcyk7Ci0JCQkJCQlyZXR1cm4gaGFuZGxlczsKLQkJCQkJfQotCi0JCQkJCXB1YmxpYyBDb21tYW5kIGdldENvbW1hbmQoUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQkJfQotCi0JCQkJCXB1YmxpYyBib29sZWFuIHVuZGVyc3RhbmRzUmVxdWVzdChSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJfQotCQkJCX0pOwotCQkKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLk9QRU5fUk9MRSwgbmV3IE9wZW5BREVkaXRQb2xpY3koKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TGFiZWxUZXh0SGVscGVyKElGaWd1cmUgZmlndXJlKSB7Ci0JCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCXJldHVybiAoKFdyYXBMYWJlbCkgZmlndXJlKS5nZXRUZXh0KCk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gKChMYWJlbCkgZmlndXJlKS5nZXRUZXh0KCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0TGFiZWxUZXh0SGVscGVyKElGaWd1cmUgZmlndXJlLCBTdHJpbmcgdGV4dCkgewotCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQkoKFdyYXBMYWJlbCkgZmlndXJlKS5zZXRUZXh0KHRleHQpOwotCQl9IGVsc2UgewotCQkJKChMYWJlbCkgZmlndXJlKS5zZXRUZXh0KHRleHQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJbWFnZSBnZXRMYWJlbEljb25IZWxwZXIoSUZpZ3VyZSBmaWd1cmUpIHsKLQkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJcmV0dXJuICgoV3JhcExhYmVsKSBmaWd1cmUpLmdldEljb24oKTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiAoKExhYmVsKSBmaWd1cmUpLmdldEljb24oKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRMYWJlbEljb25IZWxwZXIoSUZpZ3VyZSBmaWd1cmUsIEltYWdlIGljb24pIHsKLQkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJKChXcmFwTGFiZWwpIGZpZ3VyZSkuc2V0SWNvbihpY29uKTsKLQkJfSBlbHNlIHsKLQkJCSgoTGFiZWwpIGZpZ3VyZSkuc2V0SWNvbihpY29uKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMYWJlbChXcmFwTGFiZWwgZmlndXJlKSB7Ci0JCXVucmVnaXN0ZXJWaXN1YWxzKCk7Ci0JCXNldEZpZ3VyZShmaWd1cmUpOwotCQlkZWZhdWx0VGV4dCA9IGdldExhYmVsVGV4dEhlbHBlcihmaWd1cmUpOwotCQlyZWdpc3RlclZpc3VhbHMoKTsKLQkJcmVmcmVzaFZpc3VhbHMoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIExpc3QgZ2V0TW9kZWxDaGlsZHJlbigpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJR3JhcGhpY2FsRWRpdFBhcnQgZ2V0Q2hpbGRCeVNlbWFudGljSGludChTdHJpbmcgc2VtYW50aWNIaW50KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRU9iamVjdCBnZXRQYXJzZXJFbGVtZW50KCkgewotCQlFT2JqZWN0IGVsZW1lbnQgPSByZXNvbHZlU2VtYW50aWNFbGVtZW50KCk7Ci0JCXJldHVybiBlbGVtZW50ICE9IG51bGwgPyBlbGVtZW50IDogKFZpZXcpIGdldE1vZGVsKCk7Ci0JfQotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJvdGVjdGVkIEltYWdlIGdldExhYmVsSWNvbigpIHsKLQkJSW1hZ2UgaW1hZ2UgPSAgRGlhZ3JhbUljb25Qcm92aWRlck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5nZXRJY29uKHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKSwgZmFsc2UpOwotCQlpZiAoaW1hZ2UgPT0gbnVsbCkgewotCQkJaW1hZ2UgPSBBY3Rpdml0eURpYWdyYW1FZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRTaGFyZWRJbWFnZSgiZGlhZ3JhbS9pdGVyYXRpb24uZ2lmIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gaW1hZ2U7CQkKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRMYWJlbFRleHQoKSB7Ci0JCVN0cmluZyB0ZXh0ID0gbnVsbDsKLQkJaWYgKGdldFBhcnNlcigpICE9IG51bGwpIHsKLQkJCXRleHQgPSBnZXRQYXJzZXIoKS5nZXRQcmludFN0cmluZygKLQkJCQkJbmV3IEVPYmplY3RBZGFwdGVyKGdldFBhcnNlckVsZW1lbnQoKSksCi0JCQkJCWdldFBhcnNlck9wdGlvbnMoKS5pbnRWYWx1ZSgpKTsKLQkJfQotCQlpZiAodGV4dCA9PSBudWxsIHx8IHRleHQubGVuZ3RoKCkgPT0gMCkgewotCQkJdGV4dCA9IGRlZmF1bHRUZXh0OwotCQl9Ci0JCXJldHVybiB0ZXh0OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMYWJlbFRleHQoU3RyaW5nIHRleHQpIHsKLQkJc2V0TGFiZWxUZXh0SGVscGVyKGdldEZpZ3VyZSgpLCB0ZXh0KTsKLQkJT2JqZWN0IHBkRWRpdFBvbGljeSA9IGdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSk7Ci0JCWlmIChwZEVkaXRQb2xpY3kgaW5zdGFuY2VvZiBVTUxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgewotCQkJKChVTUxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgcGRFZGl0UG9saWN5KS5yZWZyZXNoRmVlZGJhY2soKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEVkaXRUZXh0KCkgewotCQlpZiAoZ2V0UGFyc2VyKCkgPT0gbnVsbCkgewotCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIGdldFBhcnNlcigpLmdldEVkaXRTdHJpbmcoCi0JCQkJbmV3IEVPYmplY3RBZGFwdGVyKGdldFBhcnNlckVsZW1lbnQoKSksCi0JCQkJZ2V0UGFyc2VyT3B0aW9ucygpLmludFZhbHVlKCkpOwotCX0KLQotCS8qKgotCSAqIEBtb2RpZmllZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzRWRpdGFibGUoKSB7Ci0JCWlmIChEaWFncmFtQ29yZVV0aWwuaXNSZWFkT25seSh0aGlzKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIGdldEVkaXRUZXh0KCkgIT0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElDZWxsRWRpdG9yVmFsaWRhdG9yIGdldEVkaXRUZXh0VmFsaWRhdG9yKCkgewotCQlyZXR1cm4gbmV3IElDZWxsRWRpdG9yVmFsaWRhdG9yKCkgewotCi0JCQlwdWJsaWMgU3RyaW5nIGlzVmFsaWQoZmluYWwgT2JqZWN0IHZhbHVlKSB7Ci0JCQkJaWYgKHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0JCQkJCWZpbmFsIEVPYmplY3QgZWxlbWVudCA9IGdldFBhcnNlckVsZW1lbnQoKTsKLQkJCQkJZmluYWwgSVBhcnNlciBwYXJzZXIgPSBnZXRQYXJzZXIoKTsKLQkJCQkJdHJ5IHsKLQkJCQkJCUlQYXJzZXJFZGl0U3RhdHVzIHZhbGlkID0gKElQYXJzZXJFZGl0U3RhdHVzKSBnZXRFZGl0aW5nRG9tYWluKCkKLQkJCQkJCQkJLnJ1bkV4Y2x1c2l2ZShuZXcgUnVubmFibGVXaXRoUmVzdWx0LkltcGwoKSB7Ci0KLQkJCQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQkJCQlzZXRSZXN1bHQocGFyc2VyLmlzVmFsaWRFZGl0U3RyaW5nKAotCQkJCQkJCQkJCQkJbmV3IEVPYmplY3RBZGFwdGVyKGVsZW1lbnQpLAotCQkJCQkJCQkJCQkJKFN0cmluZykgdmFsdWUpKTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfSk7Ci0JCQkJCQlyZXR1cm4gdmFsaWQuZ2V0Q29kZSgpID09IFBhcnNlckVkaXRTdGF0dXMuRURJVEFCTEUgPyBudWxsCi0JCQkJCQkJCTogdmFsaWQuZ2V0TWVzc2FnZSgpOwotCQkJCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZSkgewotCQkJCQkJaWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQkvLyBzaG91bGRuJ3QgZ2V0IGhlcmUKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElDb250ZW50QXNzaXN0UHJvY2Vzc29yIGdldENvbXBsZXRpb25Qcm9jZXNzb3IoKSB7Ci0JCWlmIChnZXRQYXJzZXIoKSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gZ2V0UGFyc2VyKCkuZ2V0Q29tcGxldGlvblByb2Nlc3NvcigKLQkJCQluZXcgRU9iamVjdEFkYXB0ZXIoZ2V0UGFyc2VyRWxlbWVudCgpKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQYXJzZXJPcHRpb25zIGdldFBhcnNlck9wdGlvbnMoKSB7Ci0JCXJldHVybiBQYXJzZXJPcHRpb25zLk5PTkU7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJUGFyc2VyIGdldFBhcnNlcigpIHsKLQkJaWYgKHBhcnNlciA9PSBudWxsKSB7Ci0JCQlTdHJpbmcgcGFyc2VySGludCA9ICgoVmlldykgZ2V0TW9kZWwoKSkuZ2V0VHlwZSgpOwotCQkJUGFyc2VySGludEFkYXB0ZXIgaGludEFkYXB0ZXIgPSBuZXcgUGFyc2VySGludEFkYXB0ZXIoCi0JCQkJCWdldFBhcnNlckVsZW1lbnQoKSwgcGFyc2VySGludCkgewotCi0JCQkJcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKENsYXNzIGFkYXB0ZXIpIHsKLQkJCQkJaWYgKElFbGVtZW50VHlwZS5jbGFzcy5lcXVhbHMoYWRhcHRlcikpIHsKLQkJCQkJCXJldHVybiBVTUxFbGVtZW50VHlwZXMuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZV8xMDExOwotCQkJCQl9Ci0JCQkJCXJldHVybiBzdXBlci5nZXRBZGFwdGVyKGFkYXB0ZXIpOwotCQkJCX0KLQkJCX07Ci0JCQlwYXJzZXIgPSBQYXJzZXJTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0UGFyc2VyKGhpbnRBZGFwdGVyKTsKLQkJfQotCQlyZXR1cm4gcGFyc2VyOwotCX0KLQotCS8qKgotCSAqIEBtb2RpZmllZAotCSAqLwotCXByb3RlY3RlZCBEaXJlY3RFZGl0TWFuYWdlciBnZXRNYW5hZ2VyKCkgewotCQlpZiAobWFuYWdlciA9PSBudWxsKSB7Ci0JCQlzZXRNYW5hZ2VyKG5ldyBWYWxpZGF0aW5nVGV4dERpcmVjdEVkaXRNYW5hZ2VyKHRoaXMsCi0JCQkJCVRleHREaXJlY3RFZGl0TWFuYWdlci5nZXRUZXh0Q2VsbEVkaXRvckNsYXNzKHRoaXMpLAotCQkJCQlVTUxFZGl0UGFydEZhY3RvcnkuZ2V0VGV4dENlbGxFZGl0b3JMb2NhdG9yKHRoaXMpKSB7Ci0KLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdCgpIHsKLQkJCQkJKChTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZTNFZGl0UGFydCkgZ2V0RWRpdFBhcnQoKSkKLQkJCQkJCQkucGVyZm9ybURpcmVjdEVkaXQoKTsKLQkJCQl9Ci0KLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgU3RyaW5nIHZhbGlkYXRlKFN0cmluZyB0eHQpIHsKLQkJCQkJcmV0dXJuIERpYWdyYW1Db3JlVXRpbC52YWxpZFN0cmluZ0ZvckJyZWFrZG93bkVsZW1lbnRzKAotCQkJCQkJCWdldEVkaXRQYXJ0KCksIHR4dCk7Ci0JCQkJfQotCi0JCQl9KTsKLQkJfQotCQlyZXR1cm4gbWFuYWdlcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0TWFuYWdlcihEaXJlY3RFZGl0TWFuYWdlciBtYW5hZ2VyKSB7Ci0JCXRoaXMubWFuYWdlciA9IG1hbmFnZXI7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0KCkgewotCQlnZXRNYW5hZ2VyKCkuc2hvdygpOwotCX0KLQotCS8qKgotCSAqIEBtb2RpZmllZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0KFBvaW50IGV2ZW50TG9jYXRpb24pIHsKLQkJaWYgKGdldE1hbmFnZXIoKSBpbnN0YW5jZW9mIFRleHREaXJlY3RFZGl0TWFuYWdlcikgewotCQkJKChUZXh0RGlyZWN0RWRpdE1hbmFnZXIpIGdldE1hbmFnZXIoKSkuc2hvdyhldmVudExvY2F0aW9uCi0JCQkJCS5nZXRTV1RQb2ludCgpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHZvaWQgcGVyZm9ybURpcmVjdEVkaXQoY2hhciBpbml0aWFsQ2hhcmFjdGVyKSB7Ci0JCWlmIChnZXRNYW5hZ2VyKCkgaW5zdGFuY2VvZiBUZXh0RGlyZWN0RWRpdE1hbmFnZXIpIHsKLQkJCSgoVGV4dERpcmVjdEVkaXRNYW5hZ2VyKSBnZXRNYW5hZ2VyKCkpLnNob3coaW5pdGlhbENoYXJhY3Rlcik7Ci0JCX0gZWxzZSB7Ci0JCQlwZXJmb3JtRGlyZWN0RWRpdCgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0UmVxdWVzdChSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJZmluYWwgUmVxdWVzdCB0aGVSZXF1ZXN0ID0gcmVxdWVzdDsKLQkJdHJ5IHsKLQkJCWdldEVkaXRpbmdEb21haW4oKS5ydW5FeGNsdXNpdmUobmV3IFJ1bm5hYmxlKCkgewotCi0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQlpZiAoaXNBY3RpdmUoKSAmJiBpc0VkaXRhYmxlKCkpIHsKLQkJCQkJCWlmICh0aGVSZXF1ZXN0Ci0JCQkJCQkJCS5nZXRFeHRlbmRlZERhdGEoKQotCQkJCQkJCQkuZ2V0KAotCQkJCQkJCQkJCVJlcXVlc3RDb25zdGFudHMuUkVRX0RJUkVDVEVESVRfRVhURU5ERUREQVRBX0lOSVRJQUxfQ0hBUikgaW5zdGFuY2VvZiBDaGFyYWN0ZXIpIHsKLQkJCQkJCQlDaGFyYWN0ZXIgaW5pdGlhbENoYXIgPSAoQ2hhcmFjdGVyKSB0aGVSZXF1ZXN0Ci0JCQkJCQkJCQkuZ2V0RXh0ZW5kZWREYXRhKCkKLQkJCQkJCQkJCS5nZXQoCi0JCQkJCQkJCQkJCVJlcXVlc3RDb25zdGFudHMuUkVRX0RJUkVDVEVESVRfRVhURU5ERUREQVRBX0lOSVRJQUxfQ0hBUik7Ci0JCQkJCQkJcGVyZm9ybURpcmVjdEVkaXQoaW5pdGlhbENoYXIuY2hhclZhbHVlKCkpOwotCQkJCQkJfSBlbHNlIGlmICgodGhlUmVxdWVzdCBpbnN0YW5jZW9mIERpcmVjdEVkaXRSZXF1ZXN0KQotCQkJCQkJCQkmJiAoZ2V0RWRpdFRleHQoKS5lcXVhbHMoZ2V0TGFiZWxUZXh0KCkpKSkgewotCQkJCQkJCURpcmVjdEVkaXRSZXF1ZXN0IGVkaXRSZXF1ZXN0ID0gKERpcmVjdEVkaXRSZXF1ZXN0KSB0aGVSZXF1ZXN0OwotCQkJCQkJCXBlcmZvcm1EaXJlY3RFZGl0KGVkaXRSZXF1ZXN0LmdldExvY2F0aW9uKCkpOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlwZXJmb3JtRGlyZWN0RWRpdCgpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfSk7Ci0JCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFZpc3VhbHMoKSB7Ci0JCXN1cGVyLnJlZnJlc2hWaXN1YWxzKCk7Ci0JCXJlZnJlc2hMYWJlbCgpOwotCQlyZWZyZXNoRm9udCgpOwotCQlyZWZyZXNoRm9udENvbG9yKCk7Ci0JCXJlZnJlc2hVbmRlcmxpbmUoKTsKLQkJcmVmcmVzaFN0cmlrZVRocm91Z2goKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaExhYmVsKCkgewotCQlzZXRMYWJlbFRleHRIZWxwZXIoZ2V0RmlndXJlKCksIGdldExhYmVsVGV4dCgpKTsKLQkJc2V0TGFiZWxJY29uSGVscGVyKGdldEZpZ3VyZSgpLCBnZXRMYWJlbEljb24oKSk7Ci0JCU9iamVjdCBwZEVkaXRQb2xpY3kgPSBnZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUpOwotCQlpZiAocGRFZGl0UG9saWN5IGluc3RhbmNlb2YgVU1MVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHsKLQkJCSgoVU1MVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHBkRWRpdFBvbGljeSkucmVmcmVzaEZlZWRiYWNrKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFVuZGVybGluZSgpIHsKLQkJRm9udFN0eWxlIHN0eWxlID0gKEZvbnRTdHlsZSkgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkuZ2V0U3R5bGUoCi0JCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGUoKSk7Ci0JCWlmIChzdHlsZSAhPSBudWxsICYmIGdldEZpZ3VyZSgpIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQkoKFdyYXBMYWJlbCkgZ2V0RmlndXJlKCkpLnNldFRleHRVbmRlcmxpbmUoc3R5bGUuaXNVbmRlcmxpbmUoKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFN0cmlrZVRocm91Z2goKSB7Ci0JCUZvbnRTdHlsZSBzdHlsZSA9IChGb250U3R5bGUpIGdldEZvbnRTdHlsZU93bmVyVmlldygpLmdldFN0eWxlKAotCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlKCkpOwotCQlpZiAoc3R5bGUgIT0gbnVsbCAmJiBnZXRGaWd1cmUoKSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJKChXcmFwTGFiZWwpIGdldEZpZ3VyZSgpKS5zZXRUZXh0U3RyaWtlVGhyb3VnaChzdHlsZQotCQkJCQkuaXNTdHJpa2VUaHJvdWdoKCkpOwotCQl9Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaEZvbnQoKSB7Ci0JCUZvbnRTdHlsZSBzdHlsZSA9IChGb250U3R5bGUpIGdldEZvbnRTdHlsZU93bmVyVmlldygpLmdldFN0eWxlKAotCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlKCkpOwotCQlpZiAoc3R5bGUgIT0gbnVsbCkgewotCQkJU3RyaW5nIGZvbnROYW1lID0gRGlhZ3JhbUNvbnN0YW50cy5nZXRGb250TmFtZShzdHlsZSk7Ci0JCQlGb250RGF0YSBmb250RGF0YSA9IG5ldyBGb250RGF0YShmb250TmFtZSwgc3R5bGUKLQkJCQkJLmdldEZvbnRIZWlnaHQoKSwgKHN0eWxlLmlzQm9sZCgpID8gU1dULkJPTEQgOiBTV1QuTk9STUFMKQotCQkJCQl8IChzdHlsZS5pc0l0YWxpYygpID8gU1dULklUQUxJQyA6IFNXVC5OT1JNQUwpKTsKLQkJCXNldEZvbnQoZm9udERhdGEpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0Rm9udENvbG9yKENvbG9yIGNvbG9yKSB7Ci0JCUNvbG9yIGMgPSBEaWFncmFtQ29yZVV0aWwuZ2V0Rm9udENvbG9yKHRoaXMpOwotCQlpZiAoYyAhPSBudWxsKSB7Ci0JCQljb2xvciA9IGM7Ci0JCX0KLQkJZ2V0RmlndXJlKCkuc2V0Rm9yZWdyb3VuZENvbG9yKGNvbG9yKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkU2VtYW50aWNMaXN0ZW5lcnMoKSB7Ci0JCWlmIChnZXRQYXJzZXIoKSBpbnN0YW5jZW9mIElTZW1hbnRpY1BhcnNlcikgewotCQkJRU9iamVjdCBlbGVtZW50ID0gcmVzb2x2ZVNlbWFudGljRWxlbWVudCgpOwotCQkJcGFyc2VyRWxlbWVudHMgPSAoKElTZW1hbnRpY1BhcnNlcikgZ2V0UGFyc2VyKCkpCi0JCQkJCS5nZXRTZW1hbnRpY0VsZW1lbnRzQmVpbmdQYXJzZWQoZWxlbWVudCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcnNlckVsZW1lbnRzLnNpemUoKTsgaSsrKSB7Ci0JCQkJYWRkTGlzdGVuZXJGaWx0ZXIoCi0JCQkJCQkiU2VtYW50aWNNb2RlbCIgKyBpLCB0aGlzLCAoRU9iamVjdCkgcGFyc2VyRWxlbWVudHMuZ2V0KGkpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9IGVsc2UgewotCQkJc3VwZXIuYWRkU2VtYW50aWNMaXN0ZW5lcnMoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVTZW1hbnRpY0xpc3RlbmVycygpIHsKLQkJaWYgKHBhcnNlckVsZW1lbnRzICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGFyc2VyRWxlbWVudHMuc2l6ZSgpOyBpKyspIHsKLQkJCQlyZW1vdmVMaXN0ZW5lckZpbHRlcigiU2VtYW50aWNNb2RlbCIgKyBpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9IGVsc2UgewotCQkJc3VwZXIucmVtb3ZlU2VtYW50aWNMaXN0ZW5lcnMoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQWNjZXNzaWJsZUVkaXRQYXJ0IGdldEFjY2Vzc2libGVFZGl0UGFydCgpIHsKLQkJaWYgKGFjY2Vzc2libGVFUCA9PSBudWxsKSB7Ci0JCQlhY2Nlc3NpYmxlRVAgPSBuZXcgQWNjZXNzaWJsZUdyYXBoaWNhbEVkaXRQYXJ0KCkgewotCi0JCQkJcHVibGljIHZvaWQgZ2V0TmFtZShBY2Nlc3NpYmxlRXZlbnQgZSkgewotCQkJCQllLnJlc3VsdCA9IGdldExhYmVsVGV4dEhlbHBlcihnZXRGaWd1cmUoKSk7Ci0JCQkJfQotCQkJfTsKLQkJfQotCQlyZXR1cm4gYWNjZXNzaWJsZUVQOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIFZpZXcgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkgewotCQlyZXR1cm4gZ2V0UHJpbWFyeVZpZXcoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkTm90YXRpb25hbExpc3RlbmVycygpIHsKLQkJc3VwZXIuYWRkTm90YXRpb25hbExpc3RlbmVycygpOwotCQlhZGRMaXN0ZW5lckZpbHRlcigiUHJpbWFyeVZpZXciLCB0aGlzLCBnZXRQcmltYXJ5VmlldygpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVOb3RhdGlvbmFsTGlzdGVuZXJzKCkgewotCQlzdXBlci5yZW1vdmVOb3RhdGlvbmFsTGlzdGVuZXJzKCk7Ci0JCXJlbW92ZUxpc3RlbmVyRmlsdGVyKCJQcmltYXJ5VmlldyIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGhhbmRsZU5vdGlmaWNhdGlvbkV2ZW50KE5vdGlmaWNhdGlvbiBldmVudCkgewotCQlPYmplY3QgZmVhdHVyZSA9IGV2ZW50LmdldEZlYXR1cmUoKTsKLQkJaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0ZvbnRDb2xvcigpLmVxdWFscyhmZWF0dXJlKSkgewotCQkJSW50ZWdlciBjID0gKEludGVnZXIpIGV2ZW50LmdldE5ld1ZhbHVlKCk7Ci0JCQlzZXRGb250Q29sb3IoRGlhZ3JhbUNvbG9yUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXRDb2xvcihjKSk7Ci0JCX0gZWxzZSBpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfVW5kZXJsaW5lKCkuZXF1YWxzKAotCQkJCWZlYXR1cmUpKSB7Ci0JCQlyZWZyZXNoVW5kZXJsaW5lKCk7Ci0JCX0gZWxzZSBpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfU3RyaWtlVGhyb3VnaCgpCi0JCQkJLmVxdWFscyhmZWF0dXJlKSkgewotCQkJcmVmcmVzaFN0cmlrZVRocm91Z2goKTsKLQkJfSBlbHNlIGlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Gb250SGVpZ2h0KCkuZXF1YWxzKAotCQkJCWZlYXR1cmUpCi0JCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfRm9udE5hbWUoKS5lcXVhbHMoCi0JCQkJCQlmZWF0dXJlKQotCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0JvbGQoKQotCQkJCQkJLmVxdWFscyhmZWF0dXJlKQotCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0l0YWxpYygpLmVxdWFscygKLQkJCQkJCWZlYXR1cmUpKSB7Ci0JCQlyZWZyZXNoRm9udCgpOwotCQl9IGVsc2UgewotCQkJaWYgKGdldFBhcnNlcigpICE9IG51bGwKLQkJCQkJJiYgZ2V0UGFyc2VyKCkuaXNBZmZlY3RpbmdFdmVudChldmVudCwKLQkJCQkJCQlnZXRQYXJzZXJPcHRpb25zKCkuaW50VmFsdWUoKSkpIHsKLQkJCQlyZWZyZXNoTGFiZWwoKTsKLQkJCX0KLQkJCWlmIChnZXRQYXJzZXIoKSBpbnN0YW5jZW9mIElTZW1hbnRpY1BhcnNlcikgewotCQkJCUlTZW1hbnRpY1BhcnNlciBtb2RlbFBhcnNlciA9IChJU2VtYW50aWNQYXJzZXIpIGdldFBhcnNlcigpOwotCQkJCWlmIChtb2RlbFBhcnNlci5hcmVTZW1hbnRpY0VsZW1lbnRzQWZmZWN0ZWQobnVsbCwgZXZlbnQpKSB7Ci0JCQkJCXJlbW92ZVNlbWFudGljTGlzdGVuZXJzKCk7Ci0JCQkJCWlmIChyZXNvbHZlU2VtYW50aWNFbGVtZW50KCkgIT0gbnVsbCkgewotCQkJCQkJYWRkU2VtYW50aWNMaXN0ZW5lcnMoKTsKLQkJCQkJfQotCQkJCQlyZWZyZXNoTGFiZWwoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJc3VwZXIuaGFuZGxlTm90aWZpY2F0aW9uRXZlbnQoZXZlbnQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVGaWd1cmUoKSB7Ci0JCS8vIFBhcmVudCBzaG91bGQgYXNzaWduIG9uZSB1c2luZyBzZXRMYWJlbCgpIG1ldGhvZAotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wYXJ0cy9TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZUVkaXRQYXJ0LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wYXJ0cy9TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZUVkaXRQYXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyNjYyMjguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcGFydHMvU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWVFZGl0UGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FY29yZVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlJ1bm5hYmxlV2l0aFJlc3VsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5jdXN0b20ucG9saWNpZXMuT3BlbkFERWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBvbGljaWVzLlVNTFRleHRTZWxlY3Rpb25FZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnBhcnQuQWN0aXZpdHlEaWFncmFtRWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnByb3ZpZGVycy5VTUxFbGVtZW50VHlwZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5wcm92aWRlcnMuRGlhZ3JhbUljb25Qcm92aWRlck1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS51dGlsLkRpYWdyYW1Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS51dGlsLkRpYWdyYW1Db3JlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnV0aWwuVmFsaWRhdGluZ1RleHREaXJlY3RFZGl0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuQWNjZXNzaWJsZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5HcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLk5vblJlc2l6YWJsZUVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmhhbmRsZXMuTm9uUmVzaXphYmxlSGFuZGxlS2l0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5yZXF1ZXN0cy5EaXJlY3RFZGl0UmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYudG9vbHMuRGlyZWN0RWRpdE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5JUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuSVBhcnNlckVkaXRTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5QYXJzZXJFZGl0U3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuUGFyc2VyT3B0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLlBhcnNlclNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuQ29tcGFydG1lbnRFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JR3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSVRleHRBd2FyZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkVkaXRQb2xpY3lSb2xlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5MYWJlbERpcmVjdEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5sMTBuLkRpYWdyYW1Db2xvclJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVxdWVzdHMuUmVxdWVzdENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnRvb2xzLlRleHREaXJlY3RFZGl0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvcmUudXRpbC5FT2JqZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLklFbGVtZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudWkuc2VydmljZXMucGFyc2VyLklTZW1hbnRpY1BhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudWkuc2VydmljZXMucGFyc2VyLlBhcnNlckhpbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkZvbnRTdHlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob3RhdGlvblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ2VsbEVkaXRvclZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2libGVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZUVkaXRQYXJ0IGV4dGVuZHMgQ29tcGFydG1lbnRFZGl0UGFydAotCQlpbXBsZW1lbnRzIElUZXh0QXdhcmVFZGl0UGFydCB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVklTVUFMX0lEID0gNDAwNTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIERpcmVjdEVkaXRNYW5hZ2VyIG1hbmFnZXI7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBJUGFyc2VyIHBhcnNlcjsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIExpc3QgcGFyc2VyRWxlbWVudHM7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZGVmYXVsdFRleHQ7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVOYW1lRWRpdFBhcnQoVmlldyB2aWV3KSB7Ci0JCXN1cGVyKHZpZXcpOwotCX0KLQotCS8qKgotCSAqIEBtb2RpZmllZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKSB7Ci0JCXN1cGVyLmNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKTsKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5ESVJFQ1RfRURJVF9ST0xFLAotCQkJCW5ldyBMYWJlbERpcmVjdEVkaXRQb2xpY3koKSk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUsCi0JCQkJbmV3IE5vblJlc2l6YWJsZUVkaXRQb2xpY3koKSB7Ci0KLQkJCQkJcHJvdGVjdGVkIExpc3QgY3JlYXRlU2VsZWN0aW9uSGFuZGxlcygpIHsKLQkJCQkJCUxpc3QgaGFuZGxlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJCU5vblJlc2l6YWJsZUhhbmRsZUtpdC5hZGRNb3ZlSGFuZGxlKAotCQkJCQkJCQkoR3JhcGhpY2FsRWRpdFBhcnQpIGdldEhvc3QoKSwgaGFuZGxlcyk7Ci0JCQkJCQlyZXR1cm4gaGFuZGxlczsKLQkJCQkJfQotCi0JCQkJCXB1YmxpYyBDb21tYW5kIGdldENvbW1hbmQoUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQkJfQotCi0JCQkJCXB1YmxpYyBib29sZWFuIHVuZGVyc3RhbmRzUmVxdWVzdChSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJfQotCQkJCX0pOwotCQkKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLk9QRU5fUk9MRSwgbmV3IE9wZW5BREVkaXRQb2xpY3koKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TGFiZWxUZXh0SGVscGVyKElGaWd1cmUgZmlndXJlKSB7Ci0JCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCXJldHVybiAoKFdyYXBMYWJlbCkgZmlndXJlKS5nZXRUZXh0KCk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gKChMYWJlbCkgZmlndXJlKS5nZXRUZXh0KCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0TGFiZWxUZXh0SGVscGVyKElGaWd1cmUgZmlndXJlLCBTdHJpbmcgdGV4dCkgewotCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQkoKFdyYXBMYWJlbCkgZmlndXJlKS5zZXRUZXh0KHRleHQpOwotCQl9IGVsc2UgewotCQkJKChMYWJlbCkgZmlndXJlKS5zZXRUZXh0KHRleHQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJbWFnZSBnZXRMYWJlbEljb25IZWxwZXIoSUZpZ3VyZSBmaWd1cmUpIHsKLQkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJcmV0dXJuICgoV3JhcExhYmVsKSBmaWd1cmUpLmdldEljb24oKTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiAoKExhYmVsKSBmaWd1cmUpLmdldEljb24oKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRMYWJlbEljb25IZWxwZXIoSUZpZ3VyZSBmaWd1cmUsIEltYWdlIGljb24pIHsKLQkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJKChXcmFwTGFiZWwpIGZpZ3VyZSkuc2V0SWNvbihpY29uKTsKLQkJfSBlbHNlIHsKLQkJCSgoTGFiZWwpIGZpZ3VyZSkuc2V0SWNvbihpY29uKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMYWJlbChXcmFwTGFiZWwgZmlndXJlKSB7Ci0JCXVucmVnaXN0ZXJWaXN1YWxzKCk7Ci0JCXNldEZpZ3VyZShmaWd1cmUpOwotCQlkZWZhdWx0VGV4dCA9IGdldExhYmVsVGV4dEhlbHBlcihmaWd1cmUpOwotCQlyZWdpc3RlclZpc3VhbHMoKTsKLQkJcmVmcmVzaFZpc3VhbHMoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIExpc3QgZ2V0TW9kZWxDaGlsZHJlbigpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJR3JhcGhpY2FsRWRpdFBhcnQgZ2V0Q2hpbGRCeVNlbWFudGljSGludChTdHJpbmcgc2VtYW50aWNIaW50KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRU9iamVjdCBnZXRQYXJzZXJFbGVtZW50KCkgewotCQlFT2JqZWN0IGVsZW1lbnQgPSByZXNvbHZlU2VtYW50aWNFbGVtZW50KCk7Ci0JCXJldHVybiBlbGVtZW50ICE9IG51bGwgPyBlbGVtZW50IDogKFZpZXcpIGdldE1vZGVsKCk7Ci0JfQotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJvdGVjdGVkIEltYWdlIGdldExhYmVsSWNvbigpIHsKLQkJSW1hZ2UgaW1hZ2UgPSAgRGlhZ3JhbUljb25Qcm92aWRlck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5nZXRJY29uKHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKSwgZmFsc2UpOwotCQlpZiAoaW1hZ2UgPT0gbnVsbCkgewotCQkJaW1hZ2UgPSBBY3Rpdml0eURpYWdyYW1FZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRTaGFyZWRJbWFnZSgiZGlhZ3JhbS9hY3Rpdml0eS5naWYiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBpbWFnZTsJCQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldExhYmVsVGV4dCgpIHsKLQkJU3RyaW5nIHRleHQgPSBudWxsOwotCQlpZiAoZ2V0UGFyc2VyKCkgIT0gbnVsbCkgewotCQkJdGV4dCA9IGdldFBhcnNlcigpLmdldFByaW50U3RyaW5nKAotCQkJCQluZXcgRU9iamVjdEFkYXB0ZXIoZ2V0UGFyc2VyRWxlbWVudCgpKSwKLQkJCQkJZ2V0UGFyc2VyT3B0aW9ucygpLmludFZhbHVlKCkpOwotCQl9Ci0JCWlmICh0ZXh0ID09IG51bGwgfHwgdGV4dC5sZW5ndGgoKSA9PSAwKSB7Ci0JCQl0ZXh0ID0gZGVmYXVsdFRleHQ7Ci0JCX0KLQkJcmV0dXJuIHRleHQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExhYmVsVGV4dChTdHJpbmcgdGV4dCkgewotCQlzZXRMYWJlbFRleHRIZWxwZXIoZ2V0RmlndXJlKCksIHRleHQpOwotCQlPYmplY3QgcGRFZGl0UG9saWN5ID0gZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFKTsKLQkJaWYgKHBkRWRpdFBvbGljeSBpbnN0YW5jZW9mIFVNTFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSB7Ci0JCQkoKFVNTFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSBwZEVkaXRQb2xpY3kpLnJlZnJlc2hGZWVkYmFjaygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RWRpdFRleHQoKSB7Ci0JCWlmIChnZXRQYXJzZXIoKSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gZ2V0UGFyc2VyKCkuZ2V0RWRpdFN0cmluZygKLQkJCQluZXcgRU9iamVjdEFkYXB0ZXIoZ2V0UGFyc2VyRWxlbWVudCgpKSwKLQkJCQlnZXRQYXJzZXJPcHRpb25zKCkuaW50VmFsdWUoKSk7Ci0JfQotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNFZGl0YWJsZSgpIHsKLQkJaWYgKERpYWdyYW1Db3JlVXRpbC5pc1JlYWRPbmx5KHRoaXMpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gZ2V0RWRpdFRleHQoKSAhPSBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSUNlbGxFZGl0b3JWYWxpZGF0b3IgZ2V0RWRpdFRleHRWYWxpZGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgSUNlbGxFZGl0b3JWYWxpZGF0b3IoKSB7Ci0KLQkJCXB1YmxpYyBTdHJpbmcgaXNWYWxpZChmaW5hbCBPYmplY3QgdmFsdWUpIHsKLQkJCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpIHsKLQkJCQkJZmluYWwgRU9iamVjdCBlbGVtZW50ID0gZ2V0UGFyc2VyRWxlbWVudCgpOwotCQkJCQlmaW5hbCBJUGFyc2VyIHBhcnNlciA9IGdldFBhcnNlcigpOwotCQkJCQl0cnkgewotCQkJCQkJSVBhcnNlckVkaXRTdGF0dXMgdmFsaWQgPSAoSVBhcnNlckVkaXRTdGF0dXMpIGdldEVkaXRpbmdEb21haW4oKQotCQkJCQkJCQkucnVuRXhjbHVzaXZlKG5ldyBSdW5uYWJsZVdpdGhSZXN1bHQuSW1wbCgpIHsKLQotCQkJCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCQkJCXNldFJlc3VsdChwYXJzZXIuaXNWYWxpZEVkaXRTdHJpbmcoCi0JCQkJCQkJCQkJCQluZXcgRU9iamVjdEFkYXB0ZXIoZWxlbWVudCksCi0JCQkJCQkJCQkJCQkoU3RyaW5nKSB2YWx1ZSkpOwotCQkJCQkJCQkJfQotCQkJCQkJCQl9KTsKLQkJCQkJCXJldHVybiB2YWxpZC5nZXRDb2RlKCkgPT0gUGFyc2VyRWRpdFN0YXR1cy5FRElUQUJMRSA/IG51bGwKLQkJCQkJCQkJOiB2YWxpZC5nZXRNZXNzYWdlKCk7Ci0JCQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGllKSB7Ci0JCQkJCQlpZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQkJfQotCQkJCX0KLQotCQkJCS8vIHNob3VsZG4ndCBnZXQgaGVyZQotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IgZ2V0Q29tcGxldGlvblByb2Nlc3NvcigpIHsKLQkJaWYgKGdldFBhcnNlcigpID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiBnZXRQYXJzZXIoKS5nZXRDb21wbGV0aW9uUHJvY2Vzc29yKAotCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihnZXRQYXJzZXJFbGVtZW50KCkpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFBhcnNlck9wdGlvbnMgZ2V0UGFyc2VyT3B0aW9ucygpIHsKLQkJcmV0dXJuIFBhcnNlck9wdGlvbnMuTk9ORTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElQYXJzZXIgZ2V0UGFyc2VyKCkgewotCQlpZiAocGFyc2VyID09IG51bGwpIHsKLQkJCVN0cmluZyBwYXJzZXJIaW50ID0gKChWaWV3KSBnZXRNb2RlbCgpKS5nZXRUeXBlKCk7Ci0JCQlQYXJzZXJIaW50QWRhcHRlciBoaW50QWRhcHRlciA9IG5ldyBQYXJzZXJIaW50QWRhcHRlcigKLQkJCQkJZ2V0UGFyc2VyRWxlbWVudCgpLCBwYXJzZXJIaW50KSB7Ci0KLQkJCQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgYWRhcHRlcikgewotCQkJCQlpZiAoSUVsZW1lbnRUeXBlLmNsYXNzLmVxdWFscyhhZGFwdGVyKSkgewotCQkJCQkJcmV0dXJuIFVNTEVsZW1lbnRUeXBlcy5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlXzEwMDc7Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIHN1cGVyLmdldEFkYXB0ZXIoYWRhcHRlcik7Ci0JCQkJfQotCQkJfTsKLQkJCXBhcnNlciA9IFBhcnNlclNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRQYXJzZXIoaGludEFkYXB0ZXIpOwotCQl9Ci0JCXJldHVybiBwYXJzZXI7Ci0JfQotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJvdGVjdGVkIERpcmVjdEVkaXRNYW5hZ2VyIGdldE1hbmFnZXIoKSB7Ci0JCWlmIChtYW5hZ2VyID09IG51bGwpIHsKLQkJCXNldE1hbmFnZXIobmV3IFZhbGlkYXRpbmdUZXh0RGlyZWN0RWRpdE1hbmFnZXIodGhpcywKLQkJCQkJVGV4dERpcmVjdEVkaXRNYW5hZ2VyLmdldFRleHRDZWxsRWRpdG9yQ2xhc3ModGhpcyksCi0JCQkJCVVNTEVkaXRQYXJ0RmFjdG9yeS5nZXRUZXh0Q2VsbEVkaXRvckxvY2F0b3IodGhpcykpIHsKLQotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0KCkgewotCQkJCQkoKFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVOYW1lRWRpdFBhcnQpIGdldEVkaXRQYXJ0KCkpCi0JCQkJCQkJLnBlcmZvcm1EaXJlY3RFZGl0KCk7Ci0JCQkJfQotCi0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIFN0cmluZyB2YWxpZGF0ZShTdHJpbmcgdHh0KSB7Ci0JCQkJCXJldHVybiBEaWFncmFtQ29yZVV0aWwudmFsaWRTdHJpbmdGb3JCcmVha2Rvd25FbGVtZW50cygKLQkJCQkJCQlnZXRFZGl0UGFydCgpLCB0eHQpOwotCQkJCX0KLQotCQkJfSk7Ci0JCX0KLQkJcmV0dXJuIG1hbmFnZXI7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldE1hbmFnZXIoRGlyZWN0RWRpdE1hbmFnZXIgbWFuYWdlcikgewotCQl0aGlzLm1hbmFnZXIgPSBtYW5hZ2VyOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdCgpIHsKLQkJZ2V0TWFuYWdlcigpLnNob3coKTsKLQl9Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdChQb2ludCBldmVudExvY2F0aW9uKSB7Ci0JCWlmIChnZXRNYW5hZ2VyKCkgaW5zdGFuY2VvZiBUZXh0RGlyZWN0RWRpdE1hbmFnZXIpIHsKLQkJCSgoVGV4dERpcmVjdEVkaXRNYW5hZ2VyKSBnZXRNYW5hZ2VyKCkpLnNob3coZXZlbnRMb2NhdGlvbgotCQkJCQkuZ2V0U1dUUG9pbnQoKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0KGNoYXIgaW5pdGlhbENoYXJhY3RlcikgewotCQlpZiAoZ2V0TWFuYWdlcigpIGluc3RhbmNlb2YgVGV4dERpcmVjdEVkaXRNYW5hZ2VyKSB7Ci0JCQkoKFRleHREaXJlY3RFZGl0TWFuYWdlcikgZ2V0TWFuYWdlcigpKS5zaG93KGluaXRpYWxDaGFyYWN0ZXIpOwotCQl9IGVsc2UgewotCQkJcGVyZm9ybURpcmVjdEVkaXQoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdFJlcXVlc3QoUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCWZpbmFsIFJlcXVlc3QgdGhlUmVxdWVzdCA9IHJlcXVlc3Q7Ci0JCXRyeSB7Ci0JCQlnZXRFZGl0aW5nRG9tYWluKCkucnVuRXhjbHVzaXZlKG5ldyBSdW5uYWJsZSgpIHsKLQotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJaWYgKGlzQWN0aXZlKCkgJiYgaXNFZGl0YWJsZSgpKSB7Ci0JCQkJCQlpZiAodGhlUmVxdWVzdAotCQkJCQkJCQkuZ2V0RXh0ZW5kZWREYXRhKCkKLQkJCQkJCQkJLmdldCgKLQkJCQkJCQkJCQlSZXF1ZXN0Q29uc3RhbnRzLlJFUV9ESVJFQ1RFRElUX0VYVEVOREVEREFUQV9JTklUSUFMX0NIQVIpIGluc3RhbmNlb2YgQ2hhcmFjdGVyKSB7Ci0JCQkJCQkJQ2hhcmFjdGVyIGluaXRpYWxDaGFyID0gKENoYXJhY3RlcikgdGhlUmVxdWVzdAotCQkJCQkJCQkJLmdldEV4dGVuZGVkRGF0YSgpCi0JCQkJCQkJCQkuZ2V0KAotCQkJCQkJCQkJCQlSZXF1ZXN0Q29uc3RhbnRzLlJFUV9ESVJFQ1RFRElUX0VYVEVOREVEREFUQV9JTklUSUFMX0NIQVIpOwotCQkJCQkJCXBlcmZvcm1EaXJlY3RFZGl0KGluaXRpYWxDaGFyLmNoYXJWYWx1ZSgpKTsKLQkJCQkJCX0gZWxzZSBpZiAoKHRoZVJlcXVlc3QgaW5zdGFuY2VvZiBEaXJlY3RFZGl0UmVxdWVzdCkKLQkJCQkJCQkJJiYgKGdldEVkaXRUZXh0KCkuZXF1YWxzKGdldExhYmVsVGV4dCgpKSkpIHsKLQkJCQkJCQlEaXJlY3RFZGl0UmVxdWVzdCBlZGl0UmVxdWVzdCA9IChEaXJlY3RFZGl0UmVxdWVzdCkgdGhlUmVxdWVzdDsKLQkJCQkJCQlwZXJmb3JtRGlyZWN0RWRpdChlZGl0UmVxdWVzdC5nZXRMb2NhdGlvbigpKTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJcGVyZm9ybURpcmVjdEVkaXQoKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0pOwotCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hWaXN1YWxzKCkgewotCQlzdXBlci5yZWZyZXNoVmlzdWFscygpOwotCQlyZWZyZXNoTGFiZWwoKTsKLQkJcmVmcmVzaEZvbnQoKTsKLQkJcmVmcmVzaEZvbnRDb2xvcigpOwotCQlyZWZyZXNoVW5kZXJsaW5lKCk7Ci0JCXJlZnJlc2hTdHJpa2VUaHJvdWdoKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hMYWJlbCgpIHsKLQkJc2V0TGFiZWxUZXh0SGVscGVyKGdldEZpZ3VyZSgpLCBnZXRMYWJlbFRleHQoKSk7Ci0JCXNldExhYmVsSWNvbkhlbHBlcihnZXRGaWd1cmUoKSwgZ2V0TGFiZWxJY29uKCkpOwotCQlPYmplY3QgcGRFZGl0UG9saWN5ID0gZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFKTsKLQkJaWYgKHBkRWRpdFBvbGljeSBpbnN0YW5jZW9mIFVNTFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSB7Ci0JCQkoKFVNTFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSBwZEVkaXRQb2xpY3kpLnJlZnJlc2hGZWVkYmFjaygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hVbmRlcmxpbmUoKSB7Ci0JCUZvbnRTdHlsZSBzdHlsZSA9IChGb250U3R5bGUpIGdldEZvbnRTdHlsZU93bmVyVmlldygpLmdldFN0eWxlKAotCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlKCkpOwotCQlpZiAoc3R5bGUgIT0gbnVsbCAmJiBnZXRGaWd1cmUoKSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJKChXcmFwTGFiZWwpIGdldEZpZ3VyZSgpKS5zZXRUZXh0VW5kZXJsaW5lKHN0eWxlLmlzVW5kZXJsaW5lKCkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hTdHJpa2VUaHJvdWdoKCkgewotCQlGb250U3R5bGUgc3R5bGUgPSAoRm9udFN0eWxlKSBnZXRGb250U3R5bGVPd25lclZpZXcoKS5nZXRTdHlsZSgKLQkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZSgpKTsKLQkJaWYgKHN0eWxlICE9IG51bGwgJiYgZ2V0RmlndXJlKCkgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCSgoV3JhcExhYmVsKSBnZXRGaWd1cmUoKSkuc2V0VGV4dFN0cmlrZVRocm91Z2goc3R5bGUKLQkJCQkJLmlzU3RyaWtlVGhyb3VnaCgpKTsKLQkJfQotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hGb250KCkgewotCQlGb250U3R5bGUgc3R5bGUgPSAoRm9udFN0eWxlKSBnZXRGb250U3R5bGVPd25lclZpZXcoKS5nZXRTdHlsZSgKLQkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZSgpKTsKLQkJCi0JCWlmIChzdHlsZSAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgZm9udE5hbWUgPSBEaWFncmFtQ29uc3RhbnRzLmdldEZvbnROYW1lKHN0eWxlKTsKLQkJCUZvbnREYXRhIGZvbnREYXRhID0gbmV3IEZvbnREYXRhKGZvbnROYW1lLCBzdHlsZQotCQkJCQkuZ2V0Rm9udEhlaWdodCgpLCAoc3R5bGUuaXNCb2xkKCkgPyBTV1QuQk9MRCA6IFNXVC5OT1JNQUwpCi0JCQkJCXwgKHN0eWxlLmlzSXRhbGljKCkgPyBTV1QuSVRBTElDIDogU1dULk5PUk1BTCkpOwotCQkJc2V0Rm9udChmb250RGF0YSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRGb250Q29sb3IoQ29sb3IgY29sb3IpIHsKLQkJQ29sb3IgYyA9IERpYWdyYW1Db3JlVXRpbC5nZXRGb250Q29sb3IodGhpcyk7Ci0JCWlmIChjICE9IG51bGwpIHsKLQkJCWNvbG9yID0gYzsKLQkJfQotCQlnZXRGaWd1cmUoKS5zZXRGb3JlZ3JvdW5kQ29sb3IoY29sb3IpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRTZW1hbnRpY0xpc3RlbmVycygpIHsKLQkJaWYgKGdldFBhcnNlcigpIGluc3RhbmNlb2YgSVNlbWFudGljUGFyc2VyKSB7Ci0JCQlFT2JqZWN0IGVsZW1lbnQgPSByZXNvbHZlU2VtYW50aWNFbGVtZW50KCk7Ci0JCQlwYXJzZXJFbGVtZW50cyA9ICgoSVNlbWFudGljUGFyc2VyKSBnZXRQYXJzZXIoKSkKLQkJCQkJLmdldFNlbWFudGljRWxlbWVudHNCZWluZ1BhcnNlZChlbGVtZW50KTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGFyc2VyRWxlbWVudHMuc2l6ZSgpOyBpKyspIHsKLQkJCQlhZGRMaXN0ZW5lckZpbHRlcigKLQkJCQkJCSJTZW1hbnRpY01vZGVsIiArIGksIHRoaXMsIChFT2JqZWN0KSBwYXJzZXJFbGVtZW50cy5nZXQoaSkpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlzdXBlci5hZGRTZW1hbnRpY0xpc3RlbmVycygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbW92ZVNlbWFudGljTGlzdGVuZXJzKCkgewotCQlpZiAocGFyc2VyRWxlbWVudHMgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJzZXJFbGVtZW50cy5zaXplKCk7IGkrKykgewotCQkJCXJlbW92ZUxpc3RlbmVyRmlsdGVyKCJTZW1hbnRpY01vZGVsIiArIGkpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlzdXBlci5yZW1vdmVTZW1hbnRpY0xpc3RlbmVycygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBBY2Nlc3NpYmxlRWRpdFBhcnQgZ2V0QWNjZXNzaWJsZUVkaXRQYXJ0KCkgewotCQlpZiAoYWNjZXNzaWJsZUVQID09IG51bGwpIHsKLQkJCWFjY2Vzc2libGVFUCA9IG5ldyBBY2Nlc3NpYmxlR3JhcGhpY2FsRWRpdFBhcnQoKSB7Ci0KLQkJCQlwdWJsaWMgdm9pZCBnZXROYW1lKEFjY2Vzc2libGVFdmVudCBlKSB7Ci0JCQkJCWUucmVzdWx0ID0gZ2V0TGFiZWxUZXh0SGVscGVyKGdldEZpZ3VyZSgpKTsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0JCXJldHVybiBhY2Nlc3NpYmxlRVA7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgVmlldyBnZXRGb250U3R5bGVPd25lclZpZXcoKSB7Ci0JCXJldHVybiBnZXRQcmltYXJ5VmlldygpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGROb3RhdGlvbmFsTGlzdGVuZXJzKCkgewotCQlzdXBlci5hZGROb3RhdGlvbmFsTGlzdGVuZXJzKCk7Ci0JCWFkZExpc3RlbmVyRmlsdGVyKCJQcmltYXJ5VmlldyIsIHRoaXMsIGdldFByaW1hcnlWaWV3KCkpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbW92ZU5vdGF0aW9uYWxMaXN0ZW5lcnMoKSB7Ci0JCXN1cGVyLnJlbW92ZU5vdGF0aW9uYWxMaXN0ZW5lcnMoKTsKLQkJcmVtb3ZlTGlzdGVuZXJGaWx0ZXIoIlByaW1hcnlWaWV3Iik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlTm90aWZpY2F0aW9uRXZlbnQoTm90aWZpY2F0aW9uIGV2ZW50KSB7Ci0JCU9iamVjdCBmZWF0dXJlID0gZXZlbnQuZ2V0RmVhdHVyZSgpOwotCQlpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfRm9udENvbG9yKCkuZXF1YWxzKGZlYXR1cmUpKSB7Ci0JCQlJbnRlZ2VyIGMgPSAoSW50ZWdlcikgZXZlbnQuZ2V0TmV3VmFsdWUoKTsKLQkJCXNldEZvbnRDb2xvcihEaWFncmFtQ29sb3JSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldENvbG9yKGMpKTsKLQkJfSBlbHNlIGlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9VbmRlcmxpbmUoKS5lcXVhbHMoCi0JCQkJZmVhdHVyZSkpIHsKLQkJCXJlZnJlc2hVbmRlcmxpbmUoKTsKLQkJfSBlbHNlIGlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9TdHJpa2VUaHJvdWdoKCkKLQkJCQkuZXF1YWxzKGZlYXR1cmUpKSB7Ci0JCQlyZWZyZXNoU3RyaWtlVGhyb3VnaCgpOwotCQl9IGVsc2UgaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0ZvbnRIZWlnaHQoKS5lcXVhbHMoCi0JCQkJZmVhdHVyZSkKLQkJCQl8fCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Gb250TmFtZSgpLmVxdWFscygKLQkJCQkJCWZlYXR1cmUpCi0JCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfQm9sZCgpCi0JCQkJCQkuZXF1YWxzKGZlYXR1cmUpCi0JCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfSXRhbGljKCkuZXF1YWxzKAotCQkJCQkJZmVhdHVyZSkpIHsKLQkJCXJlZnJlc2hGb250KCk7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoZ2V0UGFyc2VyKCkgIT0gbnVsbAotCQkJCQkmJiBnZXRQYXJzZXIoKS5pc0FmZmVjdGluZ0V2ZW50KGV2ZW50LAotCQkJCQkJCWdldFBhcnNlck9wdGlvbnMoKS5pbnRWYWx1ZSgpKSkgewotCQkJCXJlZnJlc2hMYWJlbCgpOwotCQkJfQotCQkJaWYgKGdldFBhcnNlcigpIGluc3RhbmNlb2YgSVNlbWFudGljUGFyc2VyKSB7Ci0JCQkJSVNlbWFudGljUGFyc2VyIG1vZGVsUGFyc2VyID0gKElTZW1hbnRpY1BhcnNlcikgZ2V0UGFyc2VyKCk7Ci0JCQkJaWYgKG1vZGVsUGFyc2VyLmFyZVNlbWFudGljRWxlbWVudHNBZmZlY3RlZChudWxsLCBldmVudCkpIHsKLQkJCQkJcmVtb3ZlU2VtYW50aWNMaXN0ZW5lcnMoKTsKLQkJCQkJaWYgKHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKSAhPSBudWxsKSB7Ci0JCQkJCQlhZGRTZW1hbnRpY0xpc3RlbmVycygpOwotCQkJCQl9Ci0JCQkJCXJlZnJlc2hMYWJlbCgpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlzdXBlci5oYW5kbGVOb3RpZmljYXRpb25FdmVudChldmVudCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZUZpZ3VyZSgpIHsKLQkJLy8gUGFyZW50IHNob3VsZCBhc3NpZ24gb25lIHVzaW5nIHNldExhYmVsKCkgbWV0aG9kCi0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BhcnRzL1VNTEVkaXRQYXJ0RmFjdG9yeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcGFydHMvVU1MRWRpdFBhcnRGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1NTk5NjQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcGFydHMvVU1MRWRpdFBhcnRGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5GaWd1cmVVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5EaW1lbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYudG9vbHMuQ2VsbEVkaXRvckxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSVRleHRBd2FyZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2VsbEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQucGFydC5VTUxWaXN1YWxJRFJlZ2lzdHJ5OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFVNTEVkaXRQYXJ0RmFjdG9yeSBpbXBsZW1lbnRzIEVkaXRQYXJ0RmFjdG9yeSB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVkaXRQYXJ0IGNyZWF0ZUVkaXRQYXJ0KEVkaXRQYXJ0IGNvbnRleHQsIE9iamVjdCBtb2RlbCkgewotCQlpZiAobW9kZWwgaW5zdGFuY2VvZiBWaWV3KSB7Ci0JCQlWaWV3IHZpZXcgPSAoVmlldykgbW9kZWw7Ci0JCQlzd2l0Y2ggKFVNTFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQodmlldykpIHsKLQotCQkJY2FzZSBBY3Rpdml0eUVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCQlyZXR1cm4gbmV3IEFjdGl2aXR5RWRpdFBhcnQodmlldyk7Ci0KLQkJCWNhc2UgQWN0aXZpdHlGaW5hbE5vZGVFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQkJcmV0dXJuIG5ldyBBY3Rpdml0eUZpbmFsTm9kZUVkaXRQYXJ0KHZpZXcpOwotCi0JCQljYXNlIEFjdGl2aXR5RmluYWxOb2RlTmFtZUVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCQlyZXR1cm4gbmV3IEFjdGl2aXR5RmluYWxOb2RlTmFtZUVkaXRQYXJ0KHZpZXcpOwotCi0JCQljYXNlIE1lcmdlTm9kZUVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCQlyZXR1cm4gbmV3IE1lcmdlTm9kZUVkaXRQYXJ0KHZpZXcpOwotCi0JCQljYXNlIE1lcmdlTm9kZU5hbWVFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQkJcmV0dXJuIG5ldyBNZXJnZU5vZGVOYW1lRWRpdFBhcnQodmlldyk7Ci0KLQkJCWNhc2UgRm9ya05vZGVFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQkJcmV0dXJuIG5ldyBGb3JrTm9kZUVkaXRQYXJ0KHZpZXcpOwotCi0JCQljYXNlIEluaXRpYWxOb2RlRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJCXJldHVybiBuZXcgSW5pdGlhbE5vZGVFZGl0UGFydCh2aWV3KTsKLQotCQkJY2FzZSBJbml0aWFsTm9kZU5hbWVFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQkJcmV0dXJuIG5ldyBJbml0aWFsTm9kZU5hbWVFZGl0UGFydCh2aWV3KTsKLQotCQkJY2FzZSBEZWNpc2lvbk5vZGVFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQkJcmV0dXJuIG5ldyBEZWNpc2lvbk5vZGVFZGl0UGFydCh2aWV3KTsKLQotCQkJY2FzZSBEZWNpc2lvbk5vZGVOYW1lRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJCXJldHVybiBuZXcgRGVjaXNpb25Ob2RlTmFtZUVkaXRQYXJ0KHZpZXcpOwotCi0JCQljYXNlIEpvaW5Ob2RlRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJCXJldHVybiBuZXcgSm9pbk5vZGVFZGl0UGFydCh2aWV3KTsKLQotCQkJY2FzZSBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJCXJldHVybiBuZXcgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZUVkaXRQYXJ0KHZpZXcpOwotCi0JCQljYXNlIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVOYW1lRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJCXJldHVybiBuZXcgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWVFZGl0UGFydCh2aWV3KTsKLQotCQkJY2FzZSBBY3Rpdml0eVBhcnRpdGlvbkVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCQlyZXR1cm4gbmV3IEFjdGl2aXR5UGFydGl0aW9uRWRpdFBhcnQodmlldyk7Ci0KLQkJCWNhc2UgQWN0aXZpdHlQYXJ0aXRpb25OYW1lMkVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCQlyZXR1cm4gbmV3IEFjdGl2aXR5UGFydGl0aW9uTmFtZTJFZGl0UGFydCh2aWV3KTsKLQotCQkJY2FzZSBBY3Rpdml0eVBhcmFtZXRlck5vZGVFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQkJcmV0dXJuIG5ldyBBY3Rpdml0eVBhcmFtZXRlck5vZGVFZGl0UGFydCh2aWV3KTsKLQotCQkJY2FzZSBBY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJCXJldHVybiBuZXcgQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZUVkaXRQYXJ0KHZpZXcpOwotCi0JCQljYXNlIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUyRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJCXJldHVybiBuZXcgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTJFZGl0UGFydCh2aWV3KTsKLQotCQkJY2FzZSBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZTJFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQkJcmV0dXJuIG5ldyBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZTJFZGl0UGFydCh2aWV3KTsKLQotCQkJY2FzZSBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlM0VkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCQlyZXR1cm4gbmV3IFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUzRWRpdFBhcnQodmlldyk7Ci0KLQkJCWNhc2UgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWUzRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJCXJldHVybiBuZXcgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWUzRWRpdFBhcnQodmlldyk7Ci0KLQkJCWNhc2UgQWN0aXZpdHlQYXJhbWV0ZXJOb2RlMkVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCQlyZXR1cm4gbmV3IEFjdGl2aXR5UGFyYW1ldGVyTm9kZTJFZGl0UGFydCh2aWV3KTsKLQotCQkJY2FzZSBBY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lMkVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCQlyZXR1cm4gbmV3IEFjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWUyRWRpdFBhcnQodmlldyk7Ci0KLQkJCWNhc2UgQWN0aXZpdHlQYXJ0aXRpb24yRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJCXJldHVybiBuZXcgQWN0aXZpdHlQYXJ0aXRpb24yRWRpdFBhcnQodmlldyk7Ci0KLQkJCWNhc2UgQWN0aXZpdHlQYXJ0aXRpb25OYW1lRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJCXJldHVybiBuZXcgQWN0aXZpdHlQYXJ0aXRpb25OYW1lRWRpdFBhcnQodmlldyk7Ci0KLQkJCWNhc2UgQWN0aXZpdHlQYXJ0aXRpb25QYXJ0aXRpb25DYW1wYXJ0bWVudEVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCQlyZXR1cm4gbmV3IEFjdGl2aXR5UGFydGl0aW9uUGFydGl0aW9uQ2FtcGFydG1lbnRFZGl0UGFydCh2aWV3KTsKLQotCQkJY2FzZSBBY3Rpdml0eVBhcnRpdGlvblBhcnRpdGlvbkNhbXBhcnRtZW50MkVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCQlyZXR1cm4gbmV3IEFjdGl2aXR5UGFydGl0aW9uUGFydGl0aW9uQ2FtcGFydG1lbnQyRWRpdFBhcnQodmlldyk7Ci0KLQkJCWNhc2UgQ29udHJvbEZsb3dFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQkJcmV0dXJuIG5ldyBDb250cm9sRmxvd0VkaXRQYXJ0KHZpZXcpOwotCi0JCQljYXNlIENvbnRyb2xGbG93TmFtZUVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCQlyZXR1cm4gbmV3IENvbnRyb2xGbG93TmFtZUVkaXRQYXJ0KHZpZXcpOwotCQkJfQotCQl9Ci0JCXJldHVybiBjcmVhdGVVbnJlY29nbml6ZWRFZGl0UGFydChjb250ZXh0LCBtb2RlbCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRWRpdFBhcnQgY3JlYXRlVW5yZWNvZ25pemVkRWRpdFBhcnQoRWRpdFBhcnQgY29udGV4dCwgT2JqZWN0IG1vZGVsKSB7Ci0JCS8vIEhhbmRsZSBjcmVhdGlvbiBvZiB1bnJlY29nbml6ZWQgY2hpbGQgbm9kZSBFZGl0UGFydHMgaGVyZQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBDZWxsRWRpdG9yTG9jYXRvciBnZXRUZXh0Q2VsbEVkaXRvckxvY2F0b3IoCi0JCQlJVGV4dEF3YXJlRWRpdFBhcnQgc291cmNlKSB7Ci0JCWlmIChzb3VyY2UuZ2V0RmlndXJlKCkgaW5zdGFuY2VvZiBXcmFwTGFiZWwpCi0JCQlyZXR1cm4gbmV3IFRleHRDZWxsRWRpdG9yTG9jYXRvcigoV3JhcExhYmVsKSBzb3VyY2UuZ2V0RmlndXJlKCkpOwotCQllbHNlIHsKLQkJCXJldHVybiBuZXcgTGFiZWxDZWxsRWRpdG9yTG9jYXRvcigoTGFiZWwpIHNvdXJjZS5nZXRGaWd1cmUoKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jc3RhdGljIHByaXZhdGUgY2xhc3MgVGV4dENlbGxFZGl0b3JMb2NhdG9yIGltcGxlbWVudHMgQ2VsbEVkaXRvckxvY2F0b3IgewotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIFdyYXBMYWJlbCB3cmFwTGFiZWw7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBUZXh0Q2VsbEVkaXRvckxvY2F0b3IoV3JhcExhYmVsIHdyYXBMYWJlbCkgewotCQkJdGhpcy53cmFwTGFiZWwgPSB3cmFwTGFiZWw7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIFdyYXBMYWJlbCBnZXRXcmFwTGFiZWwoKSB7Ci0JCQlyZXR1cm4gd3JhcExhYmVsOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyB2b2lkIHJlbG9jYXRlKENlbGxFZGl0b3IgY2VsbGVkaXRvcikgewotCQkJVGV4dCB0ZXh0ID0gKFRleHQpIGNlbGxlZGl0b3IuZ2V0Q29udHJvbCgpOwotCQkJUmVjdGFuZ2xlIHJlY3QgPSBnZXRXcmFwTGFiZWwoKS5nZXRUZXh0Qm91bmRzKCkuZ2V0Q29weSgpOwotCQkJZ2V0V3JhcExhYmVsKCkudHJhbnNsYXRlVG9BYnNvbHV0ZShyZWN0KTsKLQkJCWlmIChnZXRXcmFwTGFiZWwoKS5pc1RleHRXcmFwcGVkKCkKLQkJCQkJJiYgZ2V0V3JhcExhYmVsKCkuZ2V0VGV4dCgpLmxlbmd0aCgpID4gMCkgewotCQkJCXJlY3Quc2V0U2l6ZShuZXcgRGltZW5zaW9uKHRleHQuY29tcHV0ZVNpemUocmVjdC53aWR0aCwKLQkJCQkJCVNXVC5ERUZBVUxUKSkpOwotCQkJfSBlbHNlIHsKLQkJCQlpbnQgYXZyID0gRmlndXJlVXRpbGl0aWVzLmdldEZvbnRNZXRyaWNzKHRleHQuZ2V0Rm9udCgpKQotCQkJCQkJLmdldEF2ZXJhZ2VDaGFyV2lkdGgoKTsKLQkJCQlyZWN0LnNldFNpemUobmV3IERpbWVuc2lvbih0ZXh0LmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULAotCQkJCQkJU1dULkRFRkFVTFQpKS5leHBhbmQoYXZyICogMiwgMCkpOwotCQkJfQotCQkJaWYgKCFyZWN0LmVxdWFscyhuZXcgUmVjdGFuZ2xlKHRleHQuZ2V0Qm91bmRzKCkpKSkgewotCQkJCXRleHQuc2V0Qm91bmRzKHJlY3QueCwgcmVjdC55LCByZWN0LndpZHRoLCByZWN0LmhlaWdodCk7Ci0JCQl9Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBMYWJlbENlbGxFZGl0b3JMb2NhdG9yIGltcGxlbWVudHMgQ2VsbEVkaXRvckxvY2F0b3IgewotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIExhYmVsIGxhYmVsOwotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgTGFiZWxDZWxsRWRpdG9yTG9jYXRvcihMYWJlbCBsYWJlbCkgewotCQkJdGhpcy5sYWJlbCA9IGxhYmVsOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBMYWJlbCBnZXRMYWJlbCgpIHsKLQkJCXJldHVybiBsYWJlbDsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgdm9pZCByZWxvY2F0ZShDZWxsRWRpdG9yIGNlbGxlZGl0b3IpIHsKLQkJCVRleHQgdGV4dCA9IChUZXh0KSBjZWxsZWRpdG9yLmdldENvbnRyb2woKTsKLQkJCVJlY3RhbmdsZSByZWN0ID0gZ2V0TGFiZWwoKS5nZXRUZXh0Qm91bmRzKCkuZ2V0Q29weSgpOwotCQkJZ2V0TGFiZWwoKS50cmFuc2xhdGVUb0Fic29sdXRlKHJlY3QpOwotCQkJaW50IGF2ciA9IEZpZ3VyZVV0aWxpdGllcy5nZXRGb250TWV0cmljcyh0ZXh0LmdldEZvbnQoKSkKLQkJCQkJLmdldEF2ZXJhZ2VDaGFyV2lkdGgoKTsKLQkJCXJlY3Quc2V0U2l6ZShuZXcgRGltZW5zaW9uKHRleHQuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsCi0JCQkJCVNXVC5ERUZBVUxUKSkuZXhwYW5kKGF2ciAqIDIsIDApKTsKLQkJCWlmICghcmVjdC5lcXVhbHMobmV3IFJlY3RhbmdsZSh0ZXh0LmdldEJvdW5kcygpKSkpIHsKLQkJCQl0ZXh0LnNldEJvdW5kcyhyZWN0LngsIHJlY3QueSwgcmVjdC53aWR0aCwgcmVjdC5oZWlnaHQpOwotCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcGFydHMvVU1MRXh0Tm9kZUxhYmVsRWRpdFBhcnQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BhcnRzL1VNTEV4dE5vZGVMYWJlbEVkaXRQYXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3MmM1OTguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcGFydHMvVU1MRXh0Tm9kZUxhYmVsRWRpdFBhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuRGltZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuR3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuTGFiZWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmZpZ3VyZXMuTGFiZWxMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vdGF0aW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFVNTEV4dE5vZGVMYWJlbEVkaXRQYXJ0IGV4dGVuZHMgTGFiZWxFZGl0UGFydCB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFVNTEV4dE5vZGVMYWJlbEVkaXRQYXJ0KFZpZXcgdmlldykgewotCQlzdXBlcih2aWV3KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgcmVmcmVzaEJvdW5kcygpIHsKLQkJSUZpZ3VyZSByZWZGaWd1cmUgPSAoKEdyYXBoaWNhbEVkaXRQYXJ0KSBnZXRQYXJlbnQoKSkuZ2V0RmlndXJlKCk7Ci0JCWludCBkeCA9ICgoSW50ZWdlcikgZ2V0U3RydWN0dXJhbEZlYXR1cmVWYWx1ZShOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldExvY2F0aW9uX1goKSkpLmludFZhbHVlKCk7Ci0JCWludCBkeSA9ICgoSW50ZWdlcikgZ2V0U3RydWN0dXJhbEZlYXR1cmVWYWx1ZShOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldExvY2F0aW9uX1koKSkpLmludFZhbHVlKCk7Ci0JCVBvaW50IG9mZnNldCA9IG5ldyBQb2ludChkeCwgZHkpOwotCQlnZXRGaWd1cmUoKS5nZXRQYXJlbnQoKS5zZXRDb25zdHJhaW50KGdldEZpZ3VyZSgpLAotCQkJCW5ldyBMYWJlbExvY2F0b3IocmVmRmlndXJlLCBvZmZzZXQsIGdldEtleVBvaW50KCkpIHsKLQotCQkJCQlwdWJsaWMgdm9pZCByZWxvY2F0ZShJRmlndXJlIHRhcmdldCkgewotCQkJCQkJUG9pbnQgbG9jYXRpb24gPSBnZXRSZWZlcmVuY2VQb2ludCgpLmdldFRyYW5zbGF0ZWQoCi0JCQkJCQkJCWdldE9mZnNldCgpKTsKLQkJCQkJCWxvY2F0aW9uLnRyYW5zbGF0ZSgtdGFyZ2V0LmdldEJvdW5kcygpLndpZHRoIC8gMiwgMCk7Ci0JCQkJCQl0YXJnZXQuc2V0TG9jYXRpb24obG9jYXRpb24pOwotCQkJCQkJdGFyZ2V0LnNldFNpemUobmV3IERpbWVuc2lvbigKLQkJCQkJCQkJdGFyZ2V0LmdldFByZWZlcnJlZFNpemUoKS53aWR0aCwgdGFyZ2V0Ci0JCQkJCQkJCQkJLmdldFByZWZlcnJlZFNpemUoKS5oZWlnaHQpKTsKLQkJCQkJfQotCi0JCQkJCXByb3RlY3RlZCBQb2ludCBnZXRSZWZlcmVuY2VQb2ludCgpIHsKLQkJCQkJCXJldHVybiBnZXRMYWJlbExvY2F0aW9uKHBhcmVudCk7Ci0JCQkJCX0KLQkJCQl9KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFBvaW50IGdldFJlZmVyZW5jZVBvaW50KCkgewotCQlyZXR1cm4gZ2V0TGFiZWxMb2NhdGlvbigoKEdyYXBoaWNhbEVkaXRQYXJ0KSBnZXRQYXJlbnQoKSkuZ2V0RmlndXJlKCkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUG9pbnQgZ2V0TGFiZWxMb2NhdGlvbihJRmlndXJlIHBhcmVudCkgewotCQlyZXR1cm4gcGFyZW50LmdldEJvdW5kcygpLmdldEJvdHRvbSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BvbGljaWVzL0FjdGl2aXR5Q2Fub25pY2FsRWRpdFBvbGljeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcG9saWNpZXMvQWN0aXZpdHlDYW5vbmljYWxFZGl0UG9saWN5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiYjQzYzkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcG9saWNpZXMvQWN0aXZpdHlDYW5vbmljYWxFZGl0UG9saWN5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NjMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wb2xpY2llczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU1vZGVsRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLkFjdGl2aXR5RWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5BY3Rpdml0eUZpbmFsTm9kZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuQWN0aXZpdHlQYXJhbWV0ZXJOb2RlMkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuQWN0aXZpdHlQYXJhbWV0ZXJOb2RlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5BY3Rpdml0eVBhcnRpdGlvbjJFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLkFjdGl2aXR5UGFydGl0aW9uRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5Db250cm9sRmxvd0VkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuRGVjaXNpb25Ob2RlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5Gb3JrTm9kZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuSW5pdGlhbE5vZGVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLkpvaW5Ob2RlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5NZXJnZU5vZGVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGUyRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlM0VkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnBhcnQuVU1MVmlzdWFsSURSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5wcm92aWRlcnMuVU1MRWxlbWVudFR5cGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuYnJpZGdlLkJyaWRnZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnBhcnQudXRpbC5EaWFncmFtRWRpdG9yVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLnV0aWwuVmlld1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5EZWZlcnJlZExheW91dENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5JQ29tbWFuZFByb3h5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLkRpYWdyYW1FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JR3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuQ2Fub25pY2FsQ29ubmVjdGlvbkVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXF1ZXN0cy5DcmVhdGVDb25uZWN0aW9uVmlld1JlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXF1ZXN0cy5SZXF1ZXN0Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb3JlLnV0aWwuRU9iamVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5JRWxlbWVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5FZGdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuQWN0aXZpdHlFZGdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkFjdGl2aXR5Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLlVNTFBhY2thZ2U7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZpdHlDYW5vbmljYWxFZGl0UG9saWN5IGV4dGVuZHMgQ2Fub25pY2FsQ29ubmVjdGlvbkVkaXRQb2xpY3kgewotCQotCUBPdmVycmlkZQotCXB1YmxpYyBFT2JqZWN0IGdldFNlbWFudGljSG9zdCgpIHsKLQkJcmV0dXJuIGhvc3QoKS5nZXRNb2RlbCgpICE9IG51bGwgPyBzdXBlci5nZXRTZW1hbnRpY0hvc3QoKSA6IG51bGw7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hPbkFjdGl2YXRlKCkgewkJCi0JCXN1cGVyLnJlZnJlc2hPbkFjdGl2YXRlKCk7Ci0JCQotCQlFZGl0UGFydCBlcCA9IGdldEhvc3QoKTsKLQkJaWYoZXAgaW5zdGFuY2VvZiBEaWFncmFtRWRpdFBhcnQpIHsKLQkJCURpYWdyYW1FZGl0b3JVdGlsLmluaXRpYWxpemVPbkFjdGl2YXRlKChEaWFncmFtRWRpdFBhcnQpIGVwKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBtb2RpZmllZAotCSAqLwotCXByb3RlY3RlZCBMaXN0IGdldFNlbWFudGljQ2hpbGRyZW5MaXN0KCkgewotCQlMaXN0IHJlc3VsdCA9IG5ldyBMaW5rZWRMaXN0KCk7Ci0JCUVPYmplY3QgbW9kZWxPYmplY3QgPSAoKFZpZXcpIGdldEhvc3QoKS5nZXRNb2RlbCgpKS5nZXRFbGVtZW50KCk7Ci0JCVZpZXcgdmlld09iamVjdCA9IChWaWV3KSBnZXRIb3N0KCkuZ2V0TW9kZWwoKTsKLQkJRU9iamVjdCBuZXh0VmFsdWU7Ci0JCWludCBub2RlVklEOwotCQlmb3IgKEl0ZXJhdG9yIHZhbHVlcyA9ICgoQWN0aXZpdHkpIG1vZGVsT2JqZWN0KS5nZXROb2RlcygpLml0ZXJhdG9yKCk7IHZhbHVlcwotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQluZXh0VmFsdWUgPSAoRU9iamVjdCkgdmFsdWVzLm5leHQoKTsKLQkJCS8vIG1vZGlmaWVkIFNUQVJUCi0JCQkvLyBUbyBhdm9pZCB0aGUgQWN0aXZpdHlOb2RlIHNob3cgaW4gZHVwbGljYXRlIHBsYWNlcwotCQkJaWYgKG5leHRWYWx1ZSBpbnN0YW5jZW9mIEFjdGl2aXR5Tm9kZSkgewotCQkJCWlmICghKChBY3Rpdml0eU5vZGUpIG5leHRWYWx1ZSkuZ2V0SW5QYXJ0aXRpb25zKCkuaXNFbXB0eSgpKQotCQkJCQljb250aW51ZTsKLQkJCX0KLQkJCS8vIG1vZGlmaWVkIEVORAotCQkJbm9kZVZJRCA9IFVNTFZpc3VhbElEUmVnaXN0cnkKLQkJCQkJLmdldE5vZGVWaXN1YWxJRCh2aWV3T2JqZWN0LCBuZXh0VmFsdWUpOwotCQkJc3dpdGNoIChub2RlVklEKSB7Ci0JCQljYXNlIEFjdGl2aXR5RmluYWxOb2RlRWRpdFBhcnQuVklTVUFMX0lEOiB7Ci0JCQkJcmVzdWx0LmFkZChuZXh0VmFsdWUpOwotCQkJCWJyZWFrOwotCQkJfQotCQkJY2FzZSBNZXJnZU5vZGVFZGl0UGFydC5WSVNVQUxfSUQ6IHsKLQkJCQlyZXN1bHQuYWRkKG5leHRWYWx1ZSk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQljYXNlIEZvcmtOb2RlRWRpdFBhcnQuVklTVUFMX0lEOiB7Ci0JCQkJcmVzdWx0LmFkZChuZXh0VmFsdWUpOwotCQkJCWJyZWFrOwotCQkJfQotCQkJY2FzZSBJbml0aWFsTm9kZUVkaXRQYXJ0LlZJU1VBTF9JRDogewotCQkJCXJlc3VsdC5hZGQobmV4dFZhbHVlKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWNhc2UgRGVjaXNpb25Ob2RlRWRpdFBhcnQuVklTVUFMX0lEOiB7Ci0JCQkJcmVzdWx0LmFkZChuZXh0VmFsdWUpOwotCQkJCWJyZWFrOwotCQkJfQotCQkJY2FzZSBKb2luTm9kZUVkaXRQYXJ0LlZJU1VBTF9JRDogewotCQkJCXJlc3VsdC5hZGQobmV4dFZhbHVlKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWNhc2UgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZUVkaXRQYXJ0LlZJU1VBTF9JRDogewotCQkJCXJlc3VsdC5hZGQobmV4dFZhbHVlKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWNhc2UgQWN0aXZpdHlQYXJhbWV0ZXJOb2RlRWRpdFBhcnQuVklTVUFMX0lEOiB7Ci0JCQkJcmVzdWx0LmFkZChuZXh0VmFsdWUpOwotCQkJCWJyZWFrOwotCQkJfQotCQkJY2FzZSBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlMkVkaXRQYXJ0LlZJU1VBTF9JRDogewotCQkJCXJlc3VsdC5hZGQobmV4dFZhbHVlKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWNhc2UgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTNFZGl0UGFydC5WSVNVQUxfSUQ6IHsKLQkJCQlyZXN1bHQuYWRkKG5leHRWYWx1ZSk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQljYXNlIEFjdGl2aXR5UGFyYW1ldGVyTm9kZTJFZGl0UGFydC5WSVNVQUxfSUQ6IHsKLQkJCQlyZXN1bHQuYWRkKG5leHRWYWx1ZSk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQl9Ci0JCX0KLQkJZm9yIChJdGVyYXRvciB2YWx1ZXMgPSAoKEFjdGl2aXR5KSBtb2RlbE9iamVjdCkuZ2V0R3JvdXBzKCkuaXRlcmF0b3IoKTsgdmFsdWVzCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCW5leHRWYWx1ZSA9IChFT2JqZWN0KSB2YWx1ZXMubmV4dCgpOwotCQkJbm9kZVZJRCA9IFVNTFZpc3VhbElEUmVnaXN0cnkKLQkJCQkJLmdldE5vZGVWaXN1YWxJRCh2aWV3T2JqZWN0LCBuZXh0VmFsdWUpOwotCQkJaWYgKEFjdGl2aXR5UGFydGl0aW9uRWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWSUQpIHsKLQkJCQlyZXN1bHQuYWRkKG5leHRWYWx1ZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBzaG91bGREZWxldGVWaWV3KFZpZXcgdmlldykgewotCQlpZiAodmlldyBpbnN0YW5jZW9mIEVkZ2UpIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gdmlldy5nZXRFbGVtZW50KCk7Ci0JCQlpZiAoZWxlbWVudCAhPSBudWxsICYmIGVsZW1lbnQgaW5zdGFuY2VvZiBBY3Rpdml0eUVkZ2UpIHsKLQkJCQlpZiAoKChBY3Rpdml0eUVkZ2UpIGVsZW1lbnQpLmdldFNvdXJjZSgpID09IG51bGwKLQkJCQkJCXx8ICgoQWN0aXZpdHlFZGdlKSBlbGVtZW50KS5nZXRUYXJnZXQoKSA9PSBudWxsKQotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdmlldy5pc1NldEVsZW1lbnQoKQotCQkJCSYmIHZpZXcuZ2V0RWxlbWVudCgpICE9IG51bGwKLQkJCQkmJiAodmlldy5nZXRFbGVtZW50KCkuZUlzUHJveHkoKSB8fCAodmlldy5nZXRFbGVtZW50KCkgaW5zdGFuY2VvZiBFTW9kZWxFbGVtZW50ICYmIEJyaWRnZUhlbHBlcgotCQkJCQkJLmdldE1ldGhvZEVsZW1lbnQoKEVNb2RlbEVsZW1lbnQpIHZpZXcuZ2V0RWxlbWVudCgpKSAhPSBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGVmYXVsdEZhY3RvcnlIaW50KCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBnZXRTZW1hbnRpY0Nvbm5lY3Rpb25zTGlzdCgpIHsKLQkJLy8JCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCi0JCUFjdGl2aXR5IGFjdCA9IChBY3Rpdml0eSkgKChWaWV3KSBnZXRIb3N0KCkuZ2V0TW9kZWwoKSkuZ2V0RWxlbWVudCgpOwotCQlyZXR1cm4gbmV3IEFycmF5TGlzdChhY3QuZ2V0RWRnZXMoKSk7Ci0JfQotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJvdGVjdGVkIEVPYmplY3QgZ2V0U291cmNlRWxlbWVudChFT2JqZWN0IHJlbGF0aW9uc2hpcCkgewotCQlpZiAocmVsYXRpb25zaGlwIGluc3RhbmNlb2YgQWN0aXZpdHlFZGdlKSB7Ci0JCQlyZXR1cm4gKChBY3Rpdml0eUVkZ2UpIHJlbGF0aW9uc2hpcCkuZ2V0U291cmNlKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJvdGVjdGVkIEVPYmplY3QgZ2V0VGFyZ2V0RWxlbWVudChFT2JqZWN0IHJlbGF0aW9uc2hpcCkgewotCQlpZiAocmVsYXRpb25zaGlwIGluc3RhbmNlb2YgQWN0aXZpdHlFZGdlKSB7Ci0JCQlyZXR1cm4gKChBY3Rpdml0eUVkZ2UpIHJlbGF0aW9uc2hpcCkuZ2V0VGFyZ2V0KCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gc2hvdWxkSW5jbHVkZUNvbm5lY3Rpb24oRWRnZSBjb25uZWN0b3IsCi0JCQlDb2xsZWN0aW9uIGNoaWxkcmVuKSB7Ci0JCXJldHVybiBzdXBlci5zaG91bGRJbmNsdWRlQ29ubmVjdGlvbihjb25uZWN0b3IsIGNoaWxkcmVuKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFNlbWFudGljKCkgewotCQlMaXN0IGNyZWF0ZWRWaWV3cyA9IG5ldyBMaW5rZWRMaXN0KCk7Ci0JCWNyZWF0ZWRWaWV3cy5hZGRBbGwocmVmcmVzaFNlbWFudGljQ2hpbGRyZW4oKSk7Ci0JCUxpc3QgY3JlYXRlZENvbm5lY3Rpb25WaWV3cyA9IG5ldyBMaW5rZWRMaXN0KCk7Ci0JCWNyZWF0ZWRDb25uZWN0aW9uVmlld3MuYWRkQWxsKHJlZnJlc2hTZW1hbnRpY0Nvbm5lY3Rpb25zKCkpOwotCQljcmVhdGVkQ29ubmVjdGlvblZpZXdzLmFkZEFsbChyZWZyZXNoQ29ubmVjdGlvbnMoKSk7Ci0KLQkJaWYgKGNyZWF0ZWRWaWV3cy5zaXplKCkgPiAxKSB7Ci0JCQkvLyBwZXJmb3JtIGEgbGF5b3V0IG9mIHRoZSBjb250YWluZXIKLQkJCURlZmVycmVkTGF5b3V0Q29tbWFuZCBsYXlvdXRDbWQgPSBuZXcgRGVmZXJyZWRMYXlvdXRDb21tYW5kKGhvc3QoKQotCQkJCQkuZ2V0RWRpdGluZ0RvbWFpbigpLCBjcmVhdGVkVmlld3MsIGhvc3QoKSk7Ci0JCQlleGVjdXRlQ29tbWFuZChuZXcgSUNvbW1hbmRQcm94eShsYXlvdXRDbWQpKTsKLQkJfQotCi0JCWNyZWF0ZWRWaWV3cy5hZGRBbGwoY3JlYXRlZENvbm5lY3Rpb25WaWV3cyk7Ci0JCW1ha2VWaWV3c0ltbXV0YWJsZShjcmVhdGVkVmlld3MpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIENvbGxlY3Rpb24gbXlMaW5rRGVzY3JpcHRvcnMgPSBuZXcgTGlua2VkTGlzdCgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgTWFwIG15RU9iamVjdDJWaWV3TWFwID0gbmV3IEhhc2hNYXAoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIENvbGxlY3Rpb24gcmVmcmVzaENvbm5lY3Rpb25zKCkgewotCQl0cnkgewotCQkJY29sbGVjdEFsbExpbmtzKGdldERpYWdyYW0oKSk7Ci0JCQlDb2xsZWN0aW9uIGV4aXN0aW5nTGlua3MgPSBuZXcgTGlua2VkTGlzdChnZXREaWFncmFtKCkuZ2V0RWRnZXMoKSk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGRpYWdyYW1MaW5rcyA9IGV4aXN0aW5nTGlua3MuaXRlcmF0b3IoKTsgZGlhZ3JhbUxpbmtzCi0JCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJRWRnZSBuZXh0RGlhZ3JhbUxpbmsgPSAoRWRnZSkgZGlhZ3JhbUxpbmtzLm5leHQoKTsKLQkJCQlFT2JqZWN0IGRpYWdyYW1MaW5rT2JqZWN0ID0gbmV4dERpYWdyYW1MaW5rLmdldEVsZW1lbnQoKTsKLQkJCQlFT2JqZWN0IGRpYWdyYW1MaW5rU3JjID0gbmV4dERpYWdyYW1MaW5rLmdldFNvdXJjZSgpCi0JCQkJCQkuZ2V0RWxlbWVudCgpOwotCQkJCUVPYmplY3QgZGlhZ3JhbUxpbmtEc3QgPSBuZXh0RGlhZ3JhbUxpbmsuZ2V0VGFyZ2V0KCkKLQkJCQkJCS5nZXRFbGVtZW50KCk7Ci0JCQkJaW50IGRpYWdyYW1MaW5rVmlzdWFsSUQgPSBVTUxWaXN1YWxJRFJlZ2lzdHJ5Ci0JCQkJCQkuZ2V0VmlzdWFsSUQobmV4dERpYWdyYW1MaW5rKTsKLQkJCQlmb3IgKEl0ZXJhdG9yIG1vZGVsTGlua0Rlc2NyaXB0b3JzID0gbXlMaW5rRGVzY3JpcHRvcnMKLQkJCQkJCS5pdGVyYXRvcigpOyBtb2RlbExpbmtEZXNjcmlwdG9ycy5oYXNOZXh0KCk7KSB7Ci0JCQkJCUxpbmtEZXNjcmlwdG9yIG5leHRMaW5rRGVzY3JpcHRvciA9IChMaW5rRGVzY3JpcHRvcikgbW9kZWxMaW5rRGVzY3JpcHRvcnMKLQkJCQkJCQkubmV4dCgpOwotCQkJCQlpZiAoZGlhZ3JhbUxpbmtPYmplY3QgPT0gbmV4dExpbmtEZXNjcmlwdG9yCi0JCQkJCQkJLmdldExpbmtFbGVtZW50KCkKLQkJCQkJCQkmJiBkaWFncmFtTGlua1NyYyA9PSBuZXh0TGlua0Rlc2NyaXB0b3IuZ2V0U291cmNlKCkKLQkJCQkJCQkmJiBkaWFncmFtTGlua0RzdCA9PSBuZXh0TGlua0Rlc2NyaXB0b3IKLQkJCQkJCQkJCS5nZXREZXN0aW5hdGlvbigpCi0JCQkJCQkJJiYgZGlhZ3JhbUxpbmtWaXN1YWxJRCA9PSBuZXh0TGlua0Rlc2NyaXB0b3IKLQkJCQkJCQkJCS5nZXRWaXN1YWxJRCgpKSB7Ci0JCQkJCQlkaWFncmFtTGlua3MucmVtb3ZlKCk7Ci0JCQkJCQltb2RlbExpbmtEZXNjcmlwdG9ycy5yZW1vdmUoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWRlbGV0ZVZpZXdzKGV4aXN0aW5nTGlua3MuaXRlcmF0b3IoKSk7Ci0JCQlyZXR1cm4gY3JlYXRlQ29ubmVjdGlvbnMobXlMaW5rRGVzY3JpcHRvcnMpOwotCQl9IGZpbmFsbHkgewotCQkJbXlMaW5rRGVzY3JpcHRvcnMuY2xlYXIoKTsKLQkJCW15RU9iamVjdDJWaWV3TWFwLmNsZWFyKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNvbGxlY3RBbGxMaW5rcyhWaWV3IHZpZXcpIHsKLQkJRU9iamVjdCBtb2RlbEVsZW1lbnQgPSB2aWV3LmdldEVsZW1lbnQoKTsKLQkJaW50IGRpYWdyYW1FbGVtZW50VmlzdWFsSUQgPSBVTUxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKHZpZXcpOwotCQlzd2l0Y2ggKGRpYWdyYW1FbGVtZW50VmlzdWFsSUQpIHsKLQkJY2FzZSBBY3Rpdml0eUZpbmFsTm9kZUVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJY2FzZSBNZXJnZU5vZGVFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCWNhc2UgRm9ya05vZGVFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCWNhc2UgSW5pdGlhbE5vZGVFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCWNhc2UgRGVjaXNpb25Ob2RlRWRpdFBhcnQuVklTVUFMX0lEOgotCQljYXNlIEpvaW5Ob2RlRWRpdFBhcnQuVklTVUFMX0lEOgotCQljYXNlIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCWNhc2UgQWN0aXZpdHlQYXJ0aXRpb25FZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCWNhc2UgQWN0aXZpdHlQYXJhbWV0ZXJOb2RlRWRpdFBhcnQuVklTVUFMX0lEOgotCQljYXNlIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUyRWRpdFBhcnQuVklTVUFMX0lEOgotCQljYXNlIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUzRWRpdFBhcnQuVklTVUFMX0lEOgotCQljYXNlIEFjdGl2aXR5UGFyYW1ldGVyTm9kZTJFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCWNhc2UgQWN0aXZpdHlQYXJ0aXRpb24yRWRpdFBhcnQuVklTVUFMX0lEOgotCQljYXNlIEFjdGl2aXR5RWRpdFBhcnQuVklTVUFMX0lEOiB7Ci0JCQlteUVPYmplY3QyVmlld01hcC5wdXQobW9kZWxFbGVtZW50LCB2aWV3KTsKLQkJCXN0b3JlTGlua3MobW9kZWxFbGVtZW50LCBnZXREaWFncmFtKCkpOwotCQl9Ci0JCWRlZmF1bHQ6IHsKLQkJfQotCQkJZm9yIChJdGVyYXRvciBjaGlsZHJlbiA9IHZpZXcuZ2V0Q2hpbGRyZW4oKS5pdGVyYXRvcigpOyBjaGlsZHJlbgotCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCVZpZXcgY2hpbGRWaWV3ID0gKFZpZXcpIGNoaWxkcmVuLm5leHQoKTsKLQkJCQljb2xsZWN0QWxsTGlua3MoY2hpbGRWaWV3KTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIENvbGxlY3Rpb24gY3JlYXRlQ29ubmVjdGlvbnMoQ29sbGVjdGlvbiBsaW5rRGVzY3JpcHRvcnMpIHsKLQkJaWYgKGxpbmtEZXNjcmlwdG9ycy5pc0VtcHR5KCkpIHsKLQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCQl9Ci0JCUxpc3QgYWRhcHRlcnMgPSBuZXcgTGlua2VkTGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGxpbmtEZXNjcmlwdG9yc0l0ZXJhdG9yID0gbGlua0Rlc2NyaXB0b3JzLml0ZXJhdG9yKCk7IGxpbmtEZXNjcmlwdG9yc0l0ZXJhdG9yCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCWZpbmFsIExpbmtEZXNjcmlwdG9yIG5leHRMaW5rRGVzY3JpcHRvciA9IChMaW5rRGVzY3JpcHRvcikgbGlua0Rlc2NyaXB0b3JzSXRlcmF0b3IKLQkJCQkJLm5leHQoKTsKLQkJCUVkaXRQYXJ0IHNvdXJjZUVkaXRQYXJ0ID0gZ2V0RWRpdFBhcnRGb3IobmV4dExpbmtEZXNjcmlwdG9yCi0JCQkJCS5nZXRTb3VyY2UoKSk7Ci0JCQlFZGl0UGFydCB0YXJnZXRFZGl0UGFydCA9IGdldEVkaXRQYXJ0Rm9yKG5leHRMaW5rRGVzY3JpcHRvcgotCQkJCQkuZ2V0RGVzdGluYXRpb24oKSk7Ci0JCQlpZiAoc291cmNlRWRpdFBhcnQgPT0gbnVsbCB8fCB0YXJnZXRFZGl0UGFydCA9PSBudWxsKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlDcmVhdGVDb25uZWN0aW9uVmlld1JlcXVlc3QuQ29ubmVjdGlvblZpZXdEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBuZXcgQ3JlYXRlQ29ubmVjdGlvblZpZXdSZXF1ZXN0LkNvbm5lY3Rpb25WaWV3RGVzY3JpcHRvcigKLQkJCQkJbmV4dExpbmtEZXNjcmlwdG9yLmdldFNlbWFudGljQWRhcHRlcigpLCBudWxsLAotCQkJCQlWaWV3VXRpbC5BUFBFTkQsIGZhbHNlLCAoKElHcmFwaGljYWxFZGl0UGFydCkgZ2V0SG9zdCgpKQotCQkJCQkJCS5nZXREaWFncmFtUHJlZmVyZW5jZXNIaW50KCkpOwotCQkJQ3JlYXRlQ29ubmVjdGlvblZpZXdSZXF1ZXN0IGNjciA9IG5ldyBDcmVhdGVDb25uZWN0aW9uVmlld1JlcXVlc3QoCi0JCQkJCWRlc2NyaXB0b3IpOwotCQkJY2NyLnNldFR5cGUoUmVxdWVzdENvbnN0YW50cy5SRVFfQ09OTkVDVElPTl9TVEFSVCk7Ci0JCQljY3Iuc2V0U291cmNlRWRpdFBhcnQoc291cmNlRWRpdFBhcnQpOwotCQkJc291cmNlRWRpdFBhcnQuZ2V0Q29tbWFuZChjY3IpOwotCQkJY2NyLnNldFRhcmdldEVkaXRQYXJ0KHRhcmdldEVkaXRQYXJ0KTsKLQkJCWNjci5zZXRUeXBlKFJlcXVlc3RDb25zdGFudHMuUkVRX0NPTk5FQ1RJT05fRU5EKTsKLQkJCUNvbW1hbmQgY21kID0gdGFyZ2V0RWRpdFBhcnQuZ2V0Q29tbWFuZChjY3IpOwotCQkJaWYgKGNtZCAhPSBudWxsICYmIGNtZC5jYW5FeGVjdXRlKCkpIHsKLQkJCQlleGVjdXRlQ29tbWFuZChjbWQpOwotCQkJCUlBZGFwdGFibGUgdmlld0FkYXB0ZXIgPSAoSUFkYXB0YWJsZSkgY2NyLmdldE5ld09iamVjdCgpOwotCQkJCWlmICh2aWV3QWRhcHRlciAhPSBudWxsKSB7Ci0JCQkJCWFkYXB0ZXJzLmFkZCh2aWV3QWRhcHRlcik7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBhZGFwdGVyczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFZGl0UGFydCBnZXRFZGl0UGFydEZvcihFT2JqZWN0IG1vZGVsRWxlbWVudCkgewotCQlWaWV3IHZpZXcgPSAoVmlldykgbXlFT2JqZWN0MlZpZXdNYXAuZ2V0KG1vZGVsRWxlbWVudCk7Ci0JCWlmICh2aWV3ICE9IG51bGwpIHsKLQkJCXJldHVybiAoRWRpdFBhcnQpIGdldEhvc3QoKS5nZXRWaWV3ZXIoKS5nZXRFZGl0UGFydFJlZ2lzdHJ5KCkuZ2V0KAotCQkJCQl2aWV3KTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKkBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHZvaWQgc3RvcmVMaW5rcyhFT2JqZWN0IGNvbnRhaW5lciwgRGlhZ3JhbSBkaWFncmFtKSB7Ci0JCUVDbGFzcyBjb250YWluZXJNZXRhY2xhc3MgPSBjb250YWluZXIuZUNsYXNzKCk7Ci0JCXN0b3JlRmVhdHVyZU1vZGVsRmFjZXRMaW5rcyhjb250YWluZXIsIGNvbnRhaW5lck1ldGFjbGFzcywgZGlhZ3JhbSk7Ci0JCXN0b3JlVHlwZU1vZGVsRmFjZXRMaW5rcyhjb250YWluZXIsIGNvbnRhaW5lck1ldGFjbGFzcyk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgdm9pZCBzdG9yZVR5cGVNb2RlbEZhY2V0TGlua3MoRU9iamVjdCBjb250YWluZXIsCi0JCQlFQ2xhc3MgY29udGFpbmVyTWV0YWNsYXNzKSB7Ci0JCXN0b3JlVHlwZU1vZGVsRmFjZXRMaW5rc19Db250cm9sRmxvd18zMDAxKGNvbnRhaW5lciwgY29udGFpbmVyTWV0YWNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSB2b2lkIHN0b3JlVHlwZU1vZGVsRmFjZXRMaW5rc19Db250cm9sRmxvd18zMDAxKEVPYmplY3QgY29udGFpbmVyLAotCQkJRUNsYXNzIGNvbnRhaW5lck1ldGFjbGFzcykgewotCQlpZiAoVU1MUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U3RydWN0dXJlZEFjdGl2aXR5Tm9kZSgpLmlzU3VwZXJUeXBlT2YoCi0JCQkJY29udGFpbmVyTWV0YWNsYXNzKSkgewotCQkJZm9yIChJdGVyYXRvciB2YWx1ZXMgPSAoKFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUpIGNvbnRhaW5lcikKLQkJCQkJLmdldEVkZ2VzKCkuaXRlcmF0b3IoKTsgdmFsdWVzLmhhc05leHQoKTspIHsKLQkJCQlFT2JqZWN0IG5leHRWYWx1ZSA9ICgoRU9iamVjdCkgdmFsdWVzLm5leHQoKSk7Ci0JCQkJaW50IGxpbmtWSUQgPSBVTUxWaXN1YWxJRFJlZ2lzdHJ5Ci0JCQkJCQkuZ2V0TGlua1dpdGhDbGFzc1Zpc3VhbElEKG5leHRWYWx1ZSk7Ci0JCQkJaWYgKENvbnRyb2xGbG93RWRpdFBhcnQuVklTVUFMX0lEID09IGxpbmtWSUQpIHsKLQkJCQkJT2JqZWN0IHN0cnVjdHVyYWxGZWF0dXJlUmVzdWx0ID0gKChBY3Rpdml0eUVkZ2UpIG5leHRWYWx1ZSkKLQkJCQkJCQkuZ2V0VGFyZ2V0KCk7Ci0JCQkJCWlmIChzdHJ1Y3R1cmFsRmVhdHVyZVJlc3VsdCBpbnN0YW5jZW9mIEVPYmplY3QpIHsKLQkJCQkJCUVPYmplY3QgZHN0ID0gKEVPYmplY3QpIHN0cnVjdHVyYWxGZWF0dXJlUmVzdWx0OwotCQkJCQkJc3RydWN0dXJhbEZlYXR1cmVSZXN1bHQgPSAoKEFjdGl2aXR5RWRnZSkgbmV4dFZhbHVlKQotCQkJCQkJCQkuZ2V0U291cmNlKCk7Ci0JCQkJCQlpZiAoc3RydWN0dXJhbEZlYXR1cmVSZXN1bHQgaW5zdGFuY2VvZiBFT2JqZWN0KSB7Ci0JCQkJCQkJRU9iamVjdCBzcmMgPSAoRU9iamVjdCkgc3RydWN0dXJhbEZlYXR1cmVSZXN1bHQ7Ci0JCQkJCQkJbXlMaW5rRGVzY3JpcHRvcnMuYWRkKG5ldyBMaW5rRGVzY3JpcHRvcihzcmMsIGRzdCwKLQkJCQkJCQkJCW5leHRWYWx1ZSwKLQkJCQkJCQkJCVVNTEVsZW1lbnRUeXBlcy5Db250cm9sRmxvd18zMDAxLCBsaW5rVklEKSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKkBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHZvaWQgc3RvcmVGZWF0dXJlTW9kZWxGYWNldExpbmtzKEVPYmplY3QgY29udGFpbmVyLAotCQkJRUNsYXNzIGNvbnRhaW5lck1ldGFjbGFzcywgRGlhZ3JhbSBkaWFncmFtKSB7Ci0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBEaWFncmFtIGdldERpYWdyYW0oKSB7Ci0JCXJldHVybiAoKFZpZXcpIGdldEhvc3QoKS5nZXRNb2RlbCgpKS5nZXREaWFncmFtKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgY2xhc3MgTGlua0Rlc2NyaXB0b3IgewotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIEVPYmplY3QgbXlTb3VyY2U7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgRU9iamVjdCBteURlc3RpbmF0aW9uOwotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIEVPYmplY3QgbXlMaW5rRWxlbWVudDsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSBpbnQgbXlWaXN1YWxJRDsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSBJQWRhcHRhYmxlIG15U2VtYW50aWNBZGFwdGVyOwotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcm90ZWN0ZWQgTGlua0Rlc2NyaXB0b3IoRU9iamVjdCBzb3VyY2UsIEVPYmplY3QgZGVzdGluYXRpb24sCi0JCQkJRU9iamVjdCBsaW5rRWxlbWVudCwgSUVsZW1lbnRUeXBlIGVsZW1lbnRUeXBlLCBpbnQgbGlua1ZJRCkgewotCQkJdGhpcyhzb3VyY2UsIGRlc3RpbmF0aW9uLCBsaW5rVklEKTsKLQkJCW15TGlua0VsZW1lbnQgPSBsaW5rRWxlbWVudDsKLQkJCWZpbmFsIElFbGVtZW50VHlwZSBlbGVtZW50VHlwZUNvcHkgPSBlbGVtZW50VHlwZTsKLQkJCW15U2VtYW50aWNBZGFwdGVyID0gbmV3IEVPYmplY3RBZGFwdGVyKGxpbmtFbGVtZW50KSB7Ci0JCQkJcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKENsYXNzIGFkYXB0ZXIpIHsKLQkJCQkJaWYgKElFbGVtZW50VHlwZS5jbGFzcy5lcXVhbHMoYWRhcHRlcikpIHsKLQkJCQkJCXJldHVybiBlbGVtZW50VHlwZUNvcHk7Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIHN1cGVyLmdldEFkYXB0ZXIoYWRhcHRlcik7Ci0JCQkJfQotCQkJfTsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcm90ZWN0ZWQgTGlua0Rlc2NyaXB0b3IoRU9iamVjdCBzb3VyY2UsIEVPYmplY3QgZGVzdGluYXRpb24sCi0JCQkJSUVsZW1lbnRUeXBlIGVsZW1lbnRUeXBlLCBpbnQgbGlua1ZJRCkgewotCQkJdGhpcyhzb3VyY2UsIGRlc3RpbmF0aW9uLCBsaW5rVklEKTsKLQkJCW15TGlua0VsZW1lbnQgPSBudWxsOwotCQkJZmluYWwgSUVsZW1lbnRUeXBlIGVsZW1lbnRUeXBlQ29weSA9IGVsZW1lbnRUeXBlOwotCQkJbXlTZW1hbnRpY0FkYXB0ZXIgPSBuZXcgSUFkYXB0YWJsZSgpIHsKLQkJCQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgYWRhcHRlcikgewotCQkJCQlpZiAoSUVsZW1lbnRUeXBlLmNsYXNzLmVxdWFscyhhZGFwdGVyKSkgewotCQkJCQkJcmV0dXJuIGVsZW1lbnRUeXBlQ29weTsKLQkJCQkJfQotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgTGlua0Rlc2NyaXB0b3IoRU9iamVjdCBzb3VyY2UsIEVPYmplY3QgZGVzdGluYXRpb24sIGludCBsaW5rVklEKSB7Ci0JCQlteVNvdXJjZSA9IHNvdXJjZTsKLQkJCW15RGVzdGluYXRpb24gPSBkZXN0aW5hdGlvbjsKLQkJCW15VmlzdWFsSUQgPSBsaW5rVklEOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByb3RlY3RlZCBFT2JqZWN0IGdldFNvdXJjZSgpIHsKLQkJCXJldHVybiBteVNvdXJjZTsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcm90ZWN0ZWQgRU9iamVjdCBnZXREZXN0aW5hdGlvbigpIHsKLQkJCXJldHVybiBteURlc3RpbmF0aW9uOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByb3RlY3RlZCBFT2JqZWN0IGdldExpbmtFbGVtZW50KCkgewotCQkJcmV0dXJuIG15TGlua0VsZW1lbnQ7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJvdGVjdGVkIGludCBnZXRWaXN1YWxJRCgpIHsKLQkJCXJldHVybiBteVZpc3VhbElEOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByb3RlY3RlZCBJQWRhcHRhYmxlIGdldFNlbWFudGljQWRhcHRlcigpIHsKLQkJCXJldHVybiBteVNlbWFudGljQWRhcHRlcjsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcG9saWNpZXMvQWN0aXZpdHlGaW5hbE5vZGVDYW5vbmljYWxFZGl0UG9saWN5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wb2xpY2llcy9BY3Rpdml0eUZpbmFsTm9kZUNhbm9uaWNhbEVkaXRQb2xpY3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTcyMWI1ZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wb2xpY2llcy9BY3Rpdml0eUZpbmFsTm9kZUNhbm9uaWNhbEVkaXRQb2xpY3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wb2xpY2llczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkNhbm9uaWNhbEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eUZpbmFsTm9kZUNhbm9uaWNhbEVkaXRQb2xpY3kgZXh0ZW5kcyBDYW5vbmljYWxFZGl0UG9saWN5IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBnZXRTZW1hbnRpY0NoaWxkcmVuTGlzdCgpIHsKLQkJTGlzdCByZXN1bHQgPSBuZXcgTGlua2VkTGlzdCgpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBzaG91bGREZWxldGVWaWV3KFZpZXcgdmlldykgewotCQlyZXR1cm4gdmlldy5pc1NldEVsZW1lbnQoKSAmJiB2aWV3LmdldEVsZW1lbnQoKSAhPSBudWxsCi0JCQkJJiYgdmlldy5nZXRFbGVtZW50KCkuZUlzUHJveHkoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREZWZhdWx0RmFjdG9yeUhpbnQoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcG9saWNpZXMvQWN0aXZpdHlGaW5hbE5vZGVHcmFwaGljYWxOb2RlRWRpdFBvbGljeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcG9saWNpZXMvQWN0aXZpdHlGaW5hbE5vZGVHcmFwaGljYWxOb2RlRWRpdFBvbGljeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MTA0MGNkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BvbGljaWVzL0FjdGl2aXR5RmluYWxOb2RlR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wb2xpY2llczsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eUZpbmFsTm9kZUdyYXBoaWNhbE5vZGVFZGl0UG9saWN5IGV4dGVuZHMKLQkJVU1MR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kgewotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcG9saWNpZXMvQWN0aXZpdHlGaW5hbE5vZGVJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wb2xpY2llcy9BY3Rpdml0eUZpbmFsTm9kZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDkzOWIwZi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wb2xpY2llcy9BY3Rpdml0eUZpbmFsTm9kZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucG9saWNpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tcG91bmRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuY29tbWFuZHMuRGVzdHJveUVsZW1lbnRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkRlc3Ryb3lFbGVtZW50UmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLlJlb3JpZW50UmVsYXRpb25zaGlwUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LmNvbW1hbmRzLkNvbnRyb2xGbG93Q3JlYXRlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LmNvbW1hbmRzLkNvbnRyb2xGbG93UmVvcmllbnRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuQ29udHJvbEZsb3dFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQucHJvdmlkZXJzLlVNTEVsZW1lbnRUeXBlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5VbmV4ZWN1dGFibGVDb21tYW5kOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5jb21tYW5kcy5DcmVhdGVSZWxhdGlvbnNoaXBDb21tYW5kOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuQWN0aXZpdHlGaW5hbE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuQWN0aXZpdHlOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkNvbnRyb2xGbG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuVU1MUGFja2FnZTsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eUZpbmFsTm9kZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kgZXh0ZW5kcwotCQlVTUxCYXNlSXRlbVNlbWFudGljRWRpdFBvbGljeSB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0RGVzdHJveUVsZW1lbnRDb21tYW5kKERlc3Ryb3lFbGVtZW50UmVxdWVzdCByZXEpIHsKLQkJQ29tcG91bmRDb21tYW5kIGNjID0gZ2V0RGVzdHJveUVkZ2VzQ29tbWFuZChyZXEKLQkJCQkuaXNDb25maXJtYXRpb25SZXF1aXJlZCgpKTsKLQkJVmlldyB2aWV3ID0gKFZpZXcpIGdldEhvc3QoKS5nZXRNb2RlbCgpOwotCQlpZiAodmlldy5nZXRFQW5ub3RhdGlvbigiU2hvcnRjdXQiKSAhPSBudWxsKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXJlcS5zZXRFbGVtZW50VG9EZXN0cm95KHZpZXcpOwotCQl9Ci0JCWNjLmFkZChnZXRNU0xXcmFwcGVyKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQocmVxKSkpOwotCQlyZXR1cm4gY2MudW53cmFwKCk7Ci0JfQotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlUmVsYXRpb25zaGlwQ29tbWFuZChDcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0IHJlcSkgewotLy8JCWlmIChVTUxFbGVtZW50VHlwZXMuQ29udHJvbEZsb3dfMzAwMSA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgewotLy8JCQlyZXR1cm4gcmVxLmdldFRhcmdldCgpID09IG51bGwgPyBnZXRDcmVhdGVTdGFydE91dGdvaW5nQ29udHJvbEZsb3dfMzAwMUNvbW1hbmQocmVxKQotLy8JCQkJCTogZ2V0Q3JlYXRlQ29tcGxldGVJbmNvbWluZ0NvbnRyb2xGbG93XzMwMDFDb21tYW5kKHJlcSk7Ci0vLwkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0Q3JlYXRlUmVsYXRpb25zaGlwQ29tbWFuZChyZXEpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVTdGFydE91dGdvaW5nQ29udHJvbEZsb3dfMzAwMUNvbW1hbmQoCi0JCQlDcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0IHJlcSkgewotCQlFT2JqZWN0IHNvdXJjZUVPYmplY3QgPSByZXEuZ2V0U291cmNlKCk7Ci0JCWlmIChmYWxzZSA9PSBzb3VyY2VFT2JqZWN0IGluc3RhbmNlb2YgQWN0aXZpdHlOb2RlKSB7Ci0JCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJfQotCQlBY3Rpdml0eU5vZGUgc291cmNlID0gKEFjdGl2aXR5Tm9kZSkgc291cmNlRU9iamVjdDsKLQkJU3RydWN0dXJlZEFjdGl2aXR5Tm9kZSBjb250YWluZXIgPSAoU3RydWN0dXJlZEFjdGl2aXR5Tm9kZSkgZ2V0UmVsYXRpb25zaGlwQ29udGFpbmVyKAotCQkJCXNvdXJjZSwgVU1MUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U3RydWN0dXJlZEFjdGl2aXR5Tm9kZSgpLCByZXEKLQkJCQkJCS5nZXRFbGVtZW50VHlwZSgpKTsKLQkJaWYgKGNvbnRhaW5lciA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJfQotCQlpZiAoIVVNTEJhc2VJdGVtU2VtYW50aWNFZGl0UG9saWN5LkxpbmtDb25zdHJhaW50cwotCQkJCS5jYW5DcmVhdGVDb250cm9sRmxvd18zMDAxKGNvbnRhaW5lciwgc291cmNlLCBudWxsKSkgewotCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCX0KLQkJcmV0dXJuIG5ldyBDb21tYW5kKCkgewotCQl9OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVDb21wbGV0ZUluY29taW5nQ29udHJvbEZsb3dfMzAwMUNvbW1hbmQoCi0JCQlDcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0IHJlcSkgewotCQlFT2JqZWN0IHNvdXJjZUVPYmplY3QgPSByZXEuZ2V0U291cmNlKCk7Ci0JCUVPYmplY3QgdGFyZ2V0RU9iamVjdCA9IHJlcS5nZXRUYXJnZXQoKTsKLQkJaWYgKGZhbHNlID09IHNvdXJjZUVPYmplY3QgaW5zdGFuY2VvZiBBY3Rpdml0eU5vZGUKLQkJCQl8fCBmYWxzZSA9PSB0YXJnZXRFT2JqZWN0IGluc3RhbmNlb2YgQWN0aXZpdHlOb2RlKSB7Ci0JCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJfQotCQlBY3Rpdml0eU5vZGUgc291cmNlID0gKEFjdGl2aXR5Tm9kZSkgc291cmNlRU9iamVjdDsKLQkJQWN0aXZpdHlOb2RlIHRhcmdldCA9IChBY3Rpdml0eU5vZGUpIHRhcmdldEVPYmplY3Q7Ci0JCVN0cnVjdHVyZWRBY3Rpdml0eU5vZGUgY29udGFpbmVyID0gKFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUpIGdldFJlbGF0aW9uc2hpcENvbnRhaW5lcigKLQkJCQlzb3VyY2UsIFVNTFBhY2thZ2UuZUlOU1RBTkNFLmdldFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUoKSwgcmVxCi0JCQkJCQkuZ2V0RWxlbWVudFR5cGUoKSk7Ci0JCWlmIChjb250YWluZXIgPT0gbnVsbCkgewotCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCX0KLQkJaWYgKCFVTUxCYXNlSXRlbVNlbWFudGljRWRpdFBvbGljeS5MaW5rQ29uc3RyYWludHMKLQkJCQkuY2FuQ3JlYXRlQ29udHJvbEZsb3dfMzAwMShjb250YWluZXIsIHNvdXJjZSwgdGFyZ2V0KSkgewotCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCX0KLQkJaWYgKHJlcS5nZXRDb250YWlubWVudEZlYXR1cmUoKSA9PSBudWxsKSB7Ci0JCQlyZXEuc2V0Q29udGFpbm1lbnRGZWF0dXJlKFVNTFBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCS5nZXRTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlX0VkZ2UoKSk7Ci0JCX0KLQkJcmV0dXJuIGdldE1TTFdyYXBwZXIobmV3IENvbnRyb2xGbG93Q3JlYXRlQ29tbWFuZChyZXEsIGNvbnRhaW5lciwKLQkJCQlzb3VyY2UsIHRhcmdldCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgY29tbWFuZCB0byByZW9yaWVudCBFQ2xhc3MgYmFzZWQgbGluay4gTmV3IGxpbmsgdGFyZ2V0IG9yIHNvdXJjZQotCSAqIHNob3VsZCBiZSB0aGUgZG9tYWluIG1vZGVsIGVsZW1lbnQgYXNzb2NpYXRlZCB3aXRoIHRoaXMgbm9kZS4KLQkgKiAKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRSZW9yaWVudFJlbGF0aW9uc2hpcENvbW1hbmQoCi0JCQlSZW9yaWVudFJlbGF0aW9uc2hpcFJlcXVlc3QgcmVxKSB7Ci0vLwkJc3dpdGNoIChnZXRWaXN1YWxJRChyZXEpKSB7Ci0vLwkJY2FzZSBDb250cm9sRmxvd0VkaXRQYXJ0LlZJU1VBTF9JRDoKLS8vCQkJcmV0dXJuIGdldE1TTFdyYXBwZXIobmV3IENvbnRyb2xGbG93UmVvcmllbnRDb21tYW5kKHJlcSkpOwotLy8JCX0KLQkJcmV0dXJuIHN1cGVyLmdldFJlb3JpZW50UmVsYXRpb25zaGlwQ29tbWFuZChyZXEpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmdtZi5kaWFncmFtLmVkaXQucG9saWNpZXMuVU1MQmFzZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kjZ2V0Q3JlYXRlT3V0Z29pbmcob3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5DcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0KQotCSAqIEBtb2RpZmllZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZU91dGdvaW5nKENyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3QgcmVxKSB7Ci0KLQkJLy8gVmFsaWRhdGlvbiBBY3Rpdml0eUZpbmFsTm9kZSBub2RlIHNob3VsZCBhbGxvdyBvbmx5IG9uZSBvdXRnb2luZyBjb25uZWN0aW9uLgotCQlpZiAocmVxLmdldFNvdXJjZSgpIGluc3RhbmNlb2YgQWN0aXZpdHlGaW5hbE5vZGUpIHsKLQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRDcmVhdGVPdXRnb2luZyhyZXEpOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BvbGljaWVzL0FjdGl2aXR5SXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcG9saWNpZXMvQWN0aXZpdHlJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwNDgwOTguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcG9saWNpZXMvQWN0aXZpdHlJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBvbGljaWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklHcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29tbWFuZHMuY29yZS5jb21tYW5kcy5EdXBsaWNhdGVFT2JqZWN0c0NvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5EdXBsaWNhdGVFbGVtZW50c1JlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5jb21tYW5kcy5BY3Rpdml0eUZpbmFsTm9kZUNyZWF0ZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5jb21tYW5kcy5BY3Rpdml0eVBhcmFtZXRlck5vZGVDcmVhdGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQuY29tbWFuZHMuQWN0aXZpdHlQYXJ0aXRpb25DcmVhdGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQuY29tbWFuZHMuRGVjaXNpb25Ob2RlQ3JlYXRlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LmNvbW1hbmRzLkZvcmtOb2RlQ3JlYXRlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LmNvbW1hbmRzLkluaXRpYWxOb2RlQ3JlYXRlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LmNvbW1hbmRzLkpvaW5Ob2RlQ3JlYXRlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LmNvbW1hbmRzLk1lcmdlTm9kZUNyZWF0ZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5jb21tYW5kcy5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlQ3JlYXRlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQucHJvdmlkZXJzLlVNTEVsZW1lbnRUeXBlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuY29tbWFuZHMuQ3JlYXRlRWxlbWVudENvbW1hbmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkNyZWF0ZUVsZW1lbnRSZXF1ZXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkFjdGl2aXR5UGFyYW1ldGVyTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLlVNTFBhY2thZ2U7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZpdHlJdGVtU2VtYW50aWNFZGl0UG9saWN5IGV4dGVuZHMKLQkJVU1MQmFzZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZUNvbW1hbmQoQ3JlYXRlRWxlbWVudFJlcXVlc3QgcmVxKSB7Ci0JCWlmIChVTUxFbGVtZW50VHlwZXMuQWN0aXZpdHlGaW5hbE5vZGVfMTAwMSA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgewotCQkJaWYgKHJlcS5nZXRDb250YWlubWVudEZlYXR1cmUoKSA9PSBudWxsKSB7Ci0JCQkJcmVxLnNldENvbnRhaW5tZW50RmVhdHVyZShVTUxQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJLmdldEFjdGl2aXR5X05vZGUoKSk7Ci0JCQl9Ci0JCQlyZXR1cm4gZ2V0TVNMV3JhcHBlcihuZXcgQWN0aXZpdHlGaW5hbE5vZGVDcmVhdGVDb21tYW5kKHJlcSkpOwotCQl9Ci0JCWlmIChVTUxFbGVtZW50VHlwZXMuTWVyZ2VOb2RlXzEwMDIgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsKLQkJCWlmIChyZXEuZ2V0Q29udGFpbm1lbnRGZWF0dXJlKCkgPT0gbnVsbCkgewotCQkJCXJlcS5zZXRDb250YWlubWVudEZlYXR1cmUoVU1MUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCS5nZXRBY3Rpdml0eV9Ob2RlKCkpOwotCQkJfQotCQkJcmV0dXJuIGdldE1TTFdyYXBwZXIobmV3IE1lcmdlTm9kZUNyZWF0ZUNvbW1hbmQocmVxKSk7Ci0JCX0KLQkJaWYgKFVNTEVsZW1lbnRUeXBlcy5Gb3JrTm9kZV8xMDAzID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7Ci0JCQlpZiAocmVxLmdldENvbnRhaW5tZW50RmVhdHVyZSgpID09IG51bGwpIHsKLQkJCQlyZXEuc2V0Q29udGFpbm1lbnRGZWF0dXJlKFVNTFBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkuZ2V0QWN0aXZpdHlfTm9kZSgpKTsKLQkJCX0KLQkJCXJldHVybiBnZXRNU0xXcmFwcGVyKG5ldyBGb3JrTm9kZUNyZWF0ZUNvbW1hbmQocmVxKSk7Ci0JCX0KLQkJaWYgKFVNTEVsZW1lbnRUeXBlcy5Jbml0aWFsTm9kZV8xMDA0ID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7Ci0JCQlpZiAocmVxLmdldENvbnRhaW5tZW50RmVhdHVyZSgpID09IG51bGwpIHsKLQkJCQlyZXEuc2V0Q29udGFpbm1lbnRGZWF0dXJlKFVNTFBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkuZ2V0QWN0aXZpdHlfTm9kZSgpKTsKLQkJCX0KLQkJCXJldHVybiBnZXRNU0xXcmFwcGVyKG5ldyBJbml0aWFsTm9kZUNyZWF0ZUNvbW1hbmQocmVxKSk7Ci0JCX0KLQkJaWYgKFVNTEVsZW1lbnRUeXBlcy5EZWNpc2lvbk5vZGVfMTAwNSA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgewotCQkJaWYgKHJlcS5nZXRDb250YWlubWVudEZlYXR1cmUoKSA9PSBudWxsKSB7Ci0JCQkJcmVxLnNldENvbnRhaW5tZW50RmVhdHVyZShVTUxQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJLmdldEFjdGl2aXR5X05vZGUoKSk7Ci0JCQl9Ci0JCQlyZXR1cm4gZ2V0TVNMV3JhcHBlcihuZXcgRGVjaXNpb25Ob2RlQ3JlYXRlQ29tbWFuZChyZXEpKTsKLQkJfQotCQlpZiAoVU1MRWxlbWVudFR5cGVzLkpvaW5Ob2RlXzEwMDYgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsKLQkJCWlmIChyZXEuZ2V0Q29udGFpbm1lbnRGZWF0dXJlKCkgPT0gbnVsbCkgewotCQkJCXJlcS5zZXRDb250YWlubWVudEZlYXR1cmUoVU1MUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCS5nZXRBY3Rpdml0eV9Ob2RlKCkpOwotCQkJfQotCQkJcmV0dXJuIGdldE1TTFdyYXBwZXIobmV3IEpvaW5Ob2RlQ3JlYXRlQ29tbWFuZChyZXEpKTsKLQkJfQotCQlpZiAoVU1MRWxlbWVudFR5cGVzLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVfMTAwNyA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgewotCQkJaWYgKHJlcS5nZXRDb250YWlubWVudEZlYXR1cmUoKSA9PSBudWxsKSB7Ci0JCQkJcmVxLnNldENvbnRhaW5tZW50RmVhdHVyZShVTUxQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJLmdldEFjdGl2aXR5X05vZGUoKSk7Ci0JCQl9Ci0JCQlyZXR1cm4gZ2V0TVNMV3JhcHBlcihuZXcgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZUNyZWF0ZUNvbW1hbmQocmVxKSk7Ci0JCX0KLQkJaWYgKFVNTEVsZW1lbnRUeXBlcy5BY3Rpdml0eVBhcnRpdGlvbl8xMDA4ID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7Ci0JCQlpZiAocmVxLmdldENvbnRhaW5tZW50RmVhdHVyZSgpID09IG51bGwpIHsKLQkJCQlyZXEuc2V0Q29udGFpbm1lbnRGZWF0dXJlKFVNTFBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkuZ2V0QWN0aXZpdHlfR3JvdXAoKSk7Ci0JCQl9Ci0JCQlyZXR1cm4gZ2V0TVNMV3JhcHBlcihuZXcgQWN0aXZpdHlQYXJ0aXRpb25DcmVhdGVDb21tYW5kKHJlcSkpOwotCQl9Ci0JCWlmIChVTUxFbGVtZW50VHlwZXMuQWN0aXZpdHlQYXJhbWV0ZXJOb2RlXzEwMDkgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsKLQkJCWlmIChyZXEuZ2V0Q29udGFpbm1lbnRGZWF0dXJlKCkgPT0gbnVsbCkgewotCQkJCXJlcS5zZXRDb250YWlubWVudEZlYXR1cmUoVU1MUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCS5nZXRBY3Rpdml0eV9Ob2RlKCkpOwotCQkJfQotCQkJcmV0dXJuIGdldE1TTFdyYXBwZXIobmV3IEFjdGl2aXR5UGFyYW1ldGVyTm9kZUNyZWF0ZUNvbW1hbmQocmVxKSk7Ci0JCX0KLQkJaWYgKFVNTEVsZW1lbnRUeXBlcy5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlXzEwMTAgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsKLQkJCWlmIChyZXEuZ2V0Q29udGFpbm1lbnRGZWF0dXJlKCkgPT0gbnVsbCkgewotCQkJCXJlcS5zZXRDb250YWlubWVudEZlYXR1cmUoVU1MUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCS5nZXRBY3Rpdml0eV9Ob2RlKCkpOwotCQkJfQotCQkJcmV0dXJuIGdldE1TTFdyYXBwZXIobmV3IFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVDcmVhdGVDb21tYW5kKHJlcSkpOwotCQl9Ci0JCWlmIChVTUxFbGVtZW50VHlwZXMuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZV8xMDExID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7Ci0JCQlpZiAocmVxLmdldENvbnRhaW5tZW50RmVhdHVyZSgpID09IG51bGwpIHsKLQkJCQlyZXEuc2V0Q29udGFpbm1lbnRGZWF0dXJlKFVNTFBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkuZ2V0QWN0aXZpdHlfTm9kZSgpKTsKLQkJCX0KLQkJCXJldHVybiBnZXRNU0xXcmFwcGVyKG5ldyBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlQ3JlYXRlQ29tbWFuZChyZXEpKTsKLQkJfQotCQlpZiAoVU1MRWxlbWVudFR5cGVzLkFjdGl2aXR5UGFyYW1ldGVyTm9kZV8xMDEyID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7Ci0JCQlpZiAocmVxLmdldENvbnRhaW5tZW50RmVhdHVyZSgpID09IG51bGwpIHsKLQkJCQlyZXEuc2V0Q29udGFpbm1lbnRGZWF0dXJlKFVNTFBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkuZ2V0QWN0aXZpdHlfTm9kZSgpKTsKLQkJCX0KLQkJCXJldHVybiBnZXRNU0xXcmFwcGVyKG5ldyBBY3Rpdml0eVBhcmFtZXRlck5vZGVDcmVhdGVDb21tYW5kKHJlcSkpOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRDcmVhdGVDb21tYW5kKHJlcSk7Ci0JfQotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0RHVwbGljYXRlQ29tbWFuZChEdXBsaWNhdGVFbGVtZW50c1JlcXVlc3QgcmVxKSB7Ci0JCS8vCQlUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiBlZGl0aW5nRG9tYWluID0gKChJR3JhcGhpY2FsRWRpdFBhcnQpIGdldEhvc3QoKSkKLQkJLy8JCQkJLmdldEVkaXRpbmdEb21haW4oKTsKLQkJLy8JCXJldHVybiBnZXRNU0xXcmFwcGVyKG5ldyBEdXBsaWNhdGVBbnl0aGluZ0NvbW1hbmQoZWRpdGluZ0RvbWFpbiwgcmVxKSk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBEdXBsaWNhdGVBbnl0aGluZ0NvbW1hbmQgZXh0ZW5kcwotCQkJRHVwbGljYXRlRU9iamVjdHNDb21tYW5kIHsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIER1cGxpY2F0ZUFueXRoaW5nQ29tbWFuZCgKLQkJCQlUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiBlZGl0aW5nRG9tYWluLAotCQkJCUR1cGxpY2F0ZUVsZW1lbnRzUmVxdWVzdCByZXEpIHsKLQkJCXN1cGVyKGVkaXRpbmdEb21haW4sIHJlcS5nZXRMYWJlbCgpLCByZXEKLQkJCQkJLmdldEVsZW1lbnRzVG9CZUR1cGxpY2F0ZWQoKSwgcmVxCi0JCQkJCS5nZXRBbGxEdXBsaWNhdGVkRWxlbWVudHNNYXAoKSk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wb2xpY2llcy9BY3Rpdml0eVBhcmFtZXRlck5vZGUyQ2Fub25pY2FsRWRpdFBvbGljeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcG9saWNpZXMvQWN0aXZpdHlQYXJhbWV0ZXJOb2RlMkNhbm9uaWNhbEVkaXRQb2xpY3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGExMjdkYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wb2xpY2llcy9BY3Rpdml0eVBhcmFtZXRlck5vZGUyQ2Fub25pY2FsRWRpdFBvbGljeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBvbGljaWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuQ2Fub25pY2FsRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXR5UGFyYW1ldGVyTm9kZTJDYW5vbmljYWxFZGl0UG9saWN5IGV4dGVuZHMKLQkJQ2Fub25pY2FsRWRpdFBvbGljeSB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIExpc3QgZ2V0U2VtYW50aWNDaGlsZHJlbkxpc3QoKSB7Ci0JCUxpc3QgcmVzdWx0ID0gbmV3IExpbmtlZExpc3QoKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gc2hvdWxkRGVsZXRlVmlldyhWaWV3IHZpZXcpIHsKLQkJcmV0dXJuIHZpZXcuaXNTZXRFbGVtZW50KCkgJiYgdmlldy5nZXRFbGVtZW50KCkgIT0gbnVsbAotCQkJCSYmIHZpZXcuZ2V0RWxlbWVudCgpLmVJc1Byb3h5KCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGVmYXVsdEZhY3RvcnlIaW50KCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BvbGljaWVzL0FjdGl2aXR5UGFyYW1ldGVyTm9kZTJHcmFwaGljYWxOb2RlRWRpdFBvbGljeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcG9saWNpZXMvQWN0aXZpdHlQYXJhbWV0ZXJOb2RlMkdyYXBoaWNhbE5vZGVFZGl0UG9saWN5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiNGY5NTQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcG9saWNpZXMvQWN0aXZpdHlQYXJhbWV0ZXJOb2RlMkdyYXBoaWNhbE5vZGVFZGl0UG9saWN5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucG9saWNpZXM7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZpdHlQYXJhbWV0ZXJOb2RlMkdyYXBoaWNhbE5vZGVFZGl0UG9saWN5IGV4dGVuZHMKLQkJVU1MR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kgewotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcG9saWNpZXMvQWN0aXZpdHlQYXJhbWV0ZXJOb2RlMkl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BvbGljaWVzL0FjdGl2aXR5UGFyYW1ldGVyTm9kZTJJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2ZTU2NTYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcG9saWNpZXMvQWN0aXZpdHlQYXJhbWV0ZXJOb2RlMkl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzOSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucG9saWNpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tcG91bmRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuY29tbWFuZHMuRGVzdHJveUVsZW1lbnRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkRlc3Ryb3lFbGVtZW50UmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLlJlb3JpZW50UmVsYXRpb25zaGlwUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LmNvbW1hbmRzLkNvbnRyb2xGbG93Q3JlYXRlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LmNvbW1hbmRzLkNvbnRyb2xGbG93UmVvcmllbnRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuQ29udHJvbEZsb3dFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQucHJvdmlkZXJzLlVNTEVsZW1lbnRUeXBlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5VbmV4ZWN1dGFibGVDb21tYW5kOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5jb21tYW5kcy5DcmVhdGVSZWxhdGlvbnNoaXBDb21tYW5kOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuQWN0aXZpdHlOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkNvbnRyb2xGbG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuVU1MUGFja2FnZTsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eVBhcmFtZXRlck5vZGUySXRlbVNlbWFudGljRWRpdFBvbGljeSBleHRlbmRzCi0JCVVNTEJhc2VJdGVtU2VtYW50aWNFZGl0UG9saWN5IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXREZXN0cm95RWxlbWVudENvbW1hbmQoRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHJlcSkgewotCQlDb21wb3VuZENvbW1hbmQgY2MgPSBnZXREZXN0cm95RWRnZXNDb21tYW5kKHJlcQotCQkJCS5pc0NvbmZpcm1hdGlvblJlcXVpcmVkKCkpOwotCQlWaWV3IHZpZXcgPSAoVmlldykgZ2V0SG9zdCgpLmdldE1vZGVsKCk7Ci0JCWlmICh2aWV3LmdldEVBbm5vdGF0aW9uKCJTaG9ydGN1dCIpICE9IG51bGwpIHsgLy8kTk9OLU5MUy0xJAotCQkJcmVxLnNldEVsZW1lbnRUb0Rlc3Ryb3kodmlldyk7Ci0JCX0KLQkJY2MuYWRkKGdldE1TTFdyYXBwZXIobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChyZXEpKSk7Ci0JCXJldHVybiBjYy51bndyYXAoKTsKLQl9Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVSZWxhdGlvbnNoaXBDb21tYW5kKENyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3QgcmVxKSB7Ci0vLwkJaWYgKFVNTEVsZW1lbnRUeXBlcy5Db250cm9sRmxvd18zMDAxID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7Ci0vLwkJCXJldHVybiByZXEuZ2V0VGFyZ2V0KCkgPT0gbnVsbCA/IGdldENyZWF0ZVN0YXJ0T3V0Z29pbmdDb250cm9sRmxvd18zMDAxQ29tbWFuZChyZXEpCi0vLwkJCQkJOiBnZXRDcmVhdGVDb21wbGV0ZUluY29taW5nQ29udHJvbEZsb3dfMzAwMUNvbW1hbmQocmVxKTsKLS8vCQl9Ci0JCXJldHVybiBzdXBlci5nZXRDcmVhdGVSZWxhdGlvbnNoaXBDb21tYW5kKHJlcSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZVN0YXJ0T3V0Z29pbmdDb250cm9sRmxvd18zMDAxQ29tbWFuZCgKLQkJCUNyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3QgcmVxKSB7Ci0JCUVPYmplY3Qgc291cmNlRU9iamVjdCA9IHJlcS5nZXRTb3VyY2UoKTsKLQkJaWYgKGZhbHNlID09IHNvdXJjZUVPYmplY3QgaW5zdGFuY2VvZiBBY3Rpdml0eU5vZGUpIHsKLQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQl9Ci0JCUFjdGl2aXR5Tm9kZSBzb3VyY2UgPSAoQWN0aXZpdHlOb2RlKSBzb3VyY2VFT2JqZWN0OwotCQlTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlIGNvbnRhaW5lciA9IChTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlKSBnZXRSZWxhdGlvbnNoaXBDb250YWluZXIoCi0JCQkJc291cmNlLCBVTUxQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlKCksIHJlcQotCQkJCQkJLmdldEVsZW1lbnRUeXBlKCkpOwotCQlpZiAoY29udGFpbmVyID09IG51bGwpIHsKLQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQl9Ci0JCWlmICghVU1MQmFzZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuTGlua0NvbnN0cmFpbnRzCi0JCQkJLmNhbkNyZWF0ZUNvbnRyb2xGbG93XzMwMDEoY29udGFpbmVyLCBzb3VyY2UsIG51bGwpKSB7Ci0JCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJfQotCQlyZXR1cm4gbmV3IENvbW1hbmQoKSB7Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZUNvbXBsZXRlSW5jb21pbmdDb250cm9sRmxvd18zMDAxQ29tbWFuZCgKLQkJCUNyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3QgcmVxKSB7Ci0JCUVPYmplY3Qgc291cmNlRU9iamVjdCA9IHJlcS5nZXRTb3VyY2UoKTsKLQkJRU9iamVjdCB0YXJnZXRFT2JqZWN0ID0gcmVxLmdldFRhcmdldCgpOwotCQlpZiAoZmFsc2UgPT0gc291cmNlRU9iamVjdCBpbnN0YW5jZW9mIEFjdGl2aXR5Tm9kZQotCQkJCXx8IGZhbHNlID09IHRhcmdldEVPYmplY3QgaW5zdGFuY2VvZiBBY3Rpdml0eU5vZGUpIHsKLQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQl9Ci0JCUFjdGl2aXR5Tm9kZSBzb3VyY2UgPSAoQWN0aXZpdHlOb2RlKSBzb3VyY2VFT2JqZWN0OwotCQlBY3Rpdml0eU5vZGUgdGFyZ2V0ID0gKEFjdGl2aXR5Tm9kZSkgdGFyZ2V0RU9iamVjdDsKLQkJU3RydWN0dXJlZEFjdGl2aXR5Tm9kZSBjb250YWluZXIgPSAoU3RydWN0dXJlZEFjdGl2aXR5Tm9kZSkgZ2V0UmVsYXRpb25zaGlwQ29udGFpbmVyKAotCQkJCXNvdXJjZSwgVU1MUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U3RydWN0dXJlZEFjdGl2aXR5Tm9kZSgpLCByZXEKLQkJCQkJCS5nZXRFbGVtZW50VHlwZSgpKTsKLQkJaWYgKGNvbnRhaW5lciA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJfQotCQlpZiAoIVVNTEJhc2VJdGVtU2VtYW50aWNFZGl0UG9saWN5LkxpbmtDb25zdHJhaW50cwotCQkJCS5jYW5DcmVhdGVDb250cm9sRmxvd18zMDAxKGNvbnRhaW5lciwgc291cmNlLCB0YXJnZXQpKSB7Ci0JCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJfQotCQlpZiAocmVxLmdldENvbnRhaW5tZW50RmVhdHVyZSgpID09IG51bGwpIHsKLQkJCXJlcS5zZXRDb250YWlubWVudEZlYXR1cmUoVU1MUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJLmdldFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVfRWRnZSgpKTsKLQkJfQotCQlyZXR1cm4gZ2V0TVNMV3JhcHBlcihuZXcgQ29udHJvbEZsb3dDcmVhdGVDb21tYW5kKHJlcSwgY29udGFpbmVyLAotCQkJCXNvdXJjZSwgdGFyZ2V0KSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBjb21tYW5kIHRvIHJlb3JpZW50IEVDbGFzcyBiYXNlZCBsaW5rLiBOZXcgbGluayB0YXJnZXQgb3Igc291cmNlCi0JICogc2hvdWxkIGJlIHRoZSBkb21haW4gbW9kZWwgZWxlbWVudCBhc3NvY2lhdGVkIHdpdGggdGhpcyBub2RlLgotCSAqIAotCSAqIEBtb2RpZmllZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldFJlb3JpZW50UmVsYXRpb25zaGlwQ29tbWFuZCgKLQkJCVJlb3JpZW50UmVsYXRpb25zaGlwUmVxdWVzdCByZXEpIHsKLS8vCQlzd2l0Y2ggKGdldFZpc3VhbElEKHJlcSkpIHsKLS8vCQljYXNlIENvbnRyb2xGbG93RWRpdFBhcnQuVklTVUFMX0lEOgotLy8JCQlyZXR1cm4gZ2V0TVNMV3JhcHBlcihuZXcgQ29udHJvbEZsb3dSZW9yaWVudENvbW1hbmQocmVxKSk7Ci0vLwkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0UmVvcmllbnRSZWxhdGlvbnNoaXBDb21tYW5kKHJlcSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcG9saWNpZXMvQWN0aXZpdHlQYXJhbWV0ZXJOb2RlQ2Fub25pY2FsRWRpdFBvbGljeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcG9saWNpZXMvQWN0aXZpdHlQYXJhbWV0ZXJOb2RlQ2Fub25pY2FsRWRpdFBvbGljeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMDFlMmMxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BvbGljaWVzL0FjdGl2aXR5UGFyYW1ldGVyTm9kZUNhbm9uaWNhbEVkaXRQb2xpY3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wb2xpY2llczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkNhbm9uaWNhbEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eVBhcmFtZXRlck5vZGVDYW5vbmljYWxFZGl0UG9saWN5IGV4dGVuZHMKLQkJQ2Fub25pY2FsRWRpdFBvbGljeSB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIExpc3QgZ2V0U2VtYW50aWNDaGlsZHJlbkxpc3QoKSB7Ci0JCUxpc3QgcmVzdWx0ID0gbmV3IExpbmtlZExpc3QoKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gc2hvdWxkRGVsZXRlVmlldyhWaWV3IHZpZXcpIHsKLQkJcmV0dXJuIHZpZXcuaXNTZXRFbGVtZW50KCkgJiYgdmlldy5nZXRFbGVtZW50KCkgIT0gbnVsbAotCQkJCSYmIHZpZXcuZ2V0RWxlbWVudCgpLmVJc1Byb3h5KCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGVmYXVsdEZhY3RvcnlIaW50KCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BvbGljaWVzL0FjdGl2aXR5UGFyYW1ldGVyTm9kZUdyYXBoaWNhbE5vZGVFZGl0UG9saWN5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wb2xpY2llcy9BY3Rpdml0eVBhcmFtZXRlck5vZGVHcmFwaGljYWxOb2RlRWRpdFBvbGljeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OTFkOWZlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BvbGljaWVzL0FjdGl2aXR5UGFyYW1ldGVyTm9kZUdyYXBoaWNhbE5vZGVFZGl0UG9saWN5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucG9saWNpZXM7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZpdHlQYXJhbWV0ZXJOb2RlR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kgZXh0ZW5kcwotCQlVTUxHcmFwaGljYWxOb2RlRWRpdFBvbGljeSB7Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wb2xpY2llcy9BY3Rpdml0eVBhcmFtZXRlck5vZGVJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wb2xpY2llcy9BY3Rpdml0eVBhcmFtZXRlck5vZGVJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzMTgwMDkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcG9saWNpZXMvQWN0aXZpdHlQYXJhbWV0ZXJOb2RlSXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wb2xpY2llczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21wb3VuZENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5jb21tYW5kcy5EZXN0cm95RWxlbWVudENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5DcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuRGVzdHJveUVsZW1lbnRSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuUmVvcmllbnRSZWxhdGlvbnNoaXBSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQuY29tbWFuZHMuQ29udHJvbEZsb3dDcmVhdGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQuY29tbWFuZHMuQ29udHJvbEZsb3dSZW9yaWVudENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5Db250cm9sRmxvd0VkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5wcm92aWRlcnMuVU1MRWxlbWVudFR5cGVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLlVuZXhlY3V0YWJsZUNvbW1hbmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLmNvbW1hbmRzLkNyZWF0ZVJlbGF0aW9uc2hpcENvbW1hbmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuQ29udHJvbEZsb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5VTUxQYWNrYWdlOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXR5UGFyYW1ldGVyTm9kZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kgZXh0ZW5kcwotCQlVTUxCYXNlSXRlbVNlbWFudGljRWRpdFBvbGljeSB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0RGVzdHJveUVsZW1lbnRDb21tYW5kKERlc3Ryb3lFbGVtZW50UmVxdWVzdCByZXEpIHsKLQkJQ29tcG91bmRDb21tYW5kIGNjID0gZ2V0RGVzdHJveUVkZ2VzQ29tbWFuZChyZXEKLQkJCQkuaXNDb25maXJtYXRpb25SZXF1aXJlZCgpKTsKLQkJVmlldyB2aWV3ID0gKFZpZXcpIGdldEhvc3QoKS5nZXRNb2RlbCgpOwotCQlpZiAodmlldy5nZXRFQW5ub3RhdGlvbigiU2hvcnRjdXQiKSAhPSBudWxsKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXJlcS5zZXRFbGVtZW50VG9EZXN0cm95KHZpZXcpOwotCQl9Ci0JCWNjLmFkZChnZXRNU0xXcmFwcGVyKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQocmVxKSkpOwotCQlyZXR1cm4gY2MudW53cmFwKCk7Ci0JfQotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlUmVsYXRpb25zaGlwQ29tbWFuZChDcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0IHJlcSkgewotLy8JCWlmIChVTUxFbGVtZW50VHlwZXMuQ29udHJvbEZsb3dfMzAwMSA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgewotLy8JCQlyZXR1cm4gcmVxLmdldFRhcmdldCgpID09IG51bGwgPyBnZXRDcmVhdGVTdGFydE91dGdvaW5nQ29udHJvbEZsb3dfMzAwMUNvbW1hbmQocmVxKQotLy8JCQkJCTogZ2V0Q3JlYXRlQ29tcGxldGVJbmNvbWluZ0NvbnRyb2xGbG93XzMwMDFDb21tYW5kKHJlcSk7Ci0vLwkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0Q3JlYXRlUmVsYXRpb25zaGlwQ29tbWFuZChyZXEpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVTdGFydE91dGdvaW5nQ29udHJvbEZsb3dfMzAwMUNvbW1hbmQoCi0JCQlDcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0IHJlcSkgewotCQlFT2JqZWN0IHNvdXJjZUVPYmplY3QgPSByZXEuZ2V0U291cmNlKCk7Ci0JCWlmIChmYWxzZSA9PSBzb3VyY2VFT2JqZWN0IGluc3RhbmNlb2YgQWN0aXZpdHlOb2RlKSB7Ci0JCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJfQotCQlBY3Rpdml0eU5vZGUgc291cmNlID0gKEFjdGl2aXR5Tm9kZSkgc291cmNlRU9iamVjdDsKLQkJU3RydWN0dXJlZEFjdGl2aXR5Tm9kZSBjb250YWluZXIgPSAoU3RydWN0dXJlZEFjdGl2aXR5Tm9kZSkgZ2V0UmVsYXRpb25zaGlwQ29udGFpbmVyKAotCQkJCXNvdXJjZSwgVU1MUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U3RydWN0dXJlZEFjdGl2aXR5Tm9kZSgpLCByZXEKLQkJCQkJCS5nZXRFbGVtZW50VHlwZSgpKTsKLQkJaWYgKGNvbnRhaW5lciA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJfQotCQlpZiAoIVVNTEJhc2VJdGVtU2VtYW50aWNFZGl0UG9saWN5LkxpbmtDb25zdHJhaW50cwotCQkJCS5jYW5DcmVhdGVDb250cm9sRmxvd18zMDAxKGNvbnRhaW5lciwgc291cmNlLCBudWxsKSkgewotCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCX0KLQkJcmV0dXJuIG5ldyBDb21tYW5kKCkgewotCQl9OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVDb21wbGV0ZUluY29taW5nQ29udHJvbEZsb3dfMzAwMUNvbW1hbmQoCi0JCQlDcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0IHJlcSkgewotCQlFT2JqZWN0IHNvdXJjZUVPYmplY3QgPSByZXEuZ2V0U291cmNlKCk7Ci0JCUVPYmplY3QgdGFyZ2V0RU9iamVjdCA9IHJlcS5nZXRUYXJnZXQoKTsKLQkJaWYgKGZhbHNlID09IHNvdXJjZUVPYmplY3QgaW5zdGFuY2VvZiBBY3Rpdml0eU5vZGUKLQkJCQl8fCBmYWxzZSA9PSB0YXJnZXRFT2JqZWN0IGluc3RhbmNlb2YgQWN0aXZpdHlOb2RlKSB7Ci0JCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJfQotCQlBY3Rpdml0eU5vZGUgc291cmNlID0gKEFjdGl2aXR5Tm9kZSkgc291cmNlRU9iamVjdDsKLQkJQWN0aXZpdHlOb2RlIHRhcmdldCA9IChBY3Rpdml0eU5vZGUpIHRhcmdldEVPYmplY3Q7Ci0JCVN0cnVjdHVyZWRBY3Rpdml0eU5vZGUgY29udGFpbmVyID0gKFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUpIGdldFJlbGF0aW9uc2hpcENvbnRhaW5lcigKLQkJCQlzb3VyY2UsIFVNTFBhY2thZ2UuZUlOU1RBTkNFLmdldFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUoKSwgcmVxCi0JCQkJCQkuZ2V0RWxlbWVudFR5cGUoKSk7Ci0JCWlmIChjb250YWluZXIgPT0gbnVsbCkgewotCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCX0KLQkJaWYgKCFVTUxCYXNlSXRlbVNlbWFudGljRWRpdFBvbGljeS5MaW5rQ29uc3RyYWludHMKLQkJCQkuY2FuQ3JlYXRlQ29udHJvbEZsb3dfMzAwMShjb250YWluZXIsIHNvdXJjZSwgdGFyZ2V0KSkgewotCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCX0KLQkJaWYgKHJlcS5nZXRDb250YWlubWVudEZlYXR1cmUoKSA9PSBudWxsKSB7Ci0JCQlyZXEuc2V0Q29udGFpbm1lbnRGZWF0dXJlKFVNTFBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCS5nZXRTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlX0VkZ2UoKSk7Ci0JCX0KLQkJcmV0dXJuIGdldE1TTFdyYXBwZXIobmV3IENvbnRyb2xGbG93Q3JlYXRlQ29tbWFuZChyZXEsIGNvbnRhaW5lciwKLQkJCQlzb3VyY2UsIHRhcmdldCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgY29tbWFuZCB0byByZW9yaWVudCBFQ2xhc3MgYmFzZWQgbGluay4gTmV3IGxpbmsgdGFyZ2V0IG9yIHNvdXJjZQotCSAqIHNob3VsZCBiZSB0aGUgZG9tYWluIG1vZGVsIGVsZW1lbnQgYXNzb2NpYXRlZCB3aXRoIHRoaXMgbm9kZS4KLQkgKiAKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRSZW9yaWVudFJlbGF0aW9uc2hpcENvbW1hbmQoCi0JCQlSZW9yaWVudFJlbGF0aW9uc2hpcFJlcXVlc3QgcmVxKSB7Ci0vLwkJc3dpdGNoIChnZXRWaXN1YWxJRChyZXEpKSB7Ci0vLwkJY2FzZSBDb250cm9sRmxvd0VkaXRQYXJ0LlZJU1VBTF9JRDoKLS8vCQkJcmV0dXJuIGdldE1TTFdyYXBwZXIobmV3IENvbnRyb2xGbG93UmVvcmllbnRDb21tYW5kKHJlcSkpOwotLy8JCX0KLQkJcmV0dXJuIHN1cGVyLmdldFJlb3JpZW50UmVsYXRpb25zaGlwQ29tbWFuZChyZXEpOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BvbGljaWVzL0FjdGl2aXR5UGFydGl0aW9uMkNhbm9uaWNhbEVkaXRQb2xpY3kuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BvbGljaWVzL0FjdGl2aXR5UGFydGl0aW9uMkNhbm9uaWNhbEVkaXRQb2xpY3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTI4ZGE4My4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wb2xpY2llcy9BY3Rpdml0eVBhcnRpdGlvbjJDYW5vbmljYWxFZGl0UG9saWN5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucG9saWNpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5DYW5vbmljYWxFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZpdHlQYXJ0aXRpb24yQ2Fub25pY2FsRWRpdFBvbGljeSBleHRlbmRzIENhbm9uaWNhbEVkaXRQb2xpY3kgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBMaXN0IGdldFNlbWFudGljQ2hpbGRyZW5MaXN0KCkgewotCQlMaXN0IHJlc3VsdCA9IG5ldyBMaW5rZWRMaXN0KCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHNob3VsZERlbGV0ZVZpZXcoVmlldyB2aWV3KSB7Ci0JCXJldHVybiB2aWV3LmlzU2V0RWxlbWVudCgpICYmIHZpZXcuZ2V0RWxlbWVudCgpICE9IG51bGwKLQkJCQkmJiB2aWV3LmdldEVsZW1lbnQoKS5lSXNQcm94eSgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERlZmF1bHRGYWN0b3J5SGludCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wb2xpY2llcy9BY3Rpdml0eVBhcnRpdGlvbjJHcmFwaGljYWxOb2RlRWRpdFBvbGljeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcG9saWNpZXMvQWN0aXZpdHlQYXJ0aXRpb24yR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDFlMGM1Zi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wb2xpY2llcy9BY3Rpdml0eVBhcnRpdGlvbjJHcmFwaGljYWxOb2RlRWRpdFBvbGljeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBvbGljaWVzOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXR5UGFydGl0aW9uMkdyYXBoaWNhbE5vZGVFZGl0UG9saWN5IGV4dGVuZHMKLQkJVU1MR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kgewotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcG9saWNpZXMvQWN0aXZpdHlQYXJ0aXRpb24ySXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcG9saWNpZXMvQWN0aXZpdHlQYXJ0aXRpb24ySXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzFlZTMyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BvbGljaWVzL0FjdGl2aXR5UGFydGl0aW9uMkl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wb2xpY2llczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tcG91bmRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuY29tbWFuZHMuRGVzdHJveUVsZW1lbnRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkRlc3Ryb3lFbGVtZW50UmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuQWN0aXZpdHlQYXJ0aXRpb24yRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5BY3Rpdml0eVBhcnRpdGlvblBhcnRpdGlvbkNhbXBhcnRtZW50MkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnBhcnQuVU1MVmlzdWFsSURSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eVBhcnRpdGlvbjJJdGVtU2VtYW50aWNFZGl0UG9saWN5IGV4dGVuZHMKLQkJVU1MQmFzZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldERlc3Ryb3lFbGVtZW50Q29tbWFuZChEZXN0cm95RWxlbWVudFJlcXVlc3QgcmVxKSB7Ci0JCUNvbXBvdW5kQ29tbWFuZCBjYyA9IGdldERlc3Ryb3lFZGdlc0NvbW1hbmQocmVxCi0JCQkJLmlzQ29uZmlybWF0aW9uUmVxdWlyZWQoKSk7Ci0JCWFkZERlc3Ryb3lDaGlsZE5vZGVzQ29tbWFuZChjYywgcmVxLmlzQ29uZmlybWF0aW9uUmVxdWlyZWQoKSk7Ci0JCWNjLmFkZChnZXRNU0xXcmFwcGVyKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQocmVxKSkpOwotCQlyZXR1cm4gY2MudW53cmFwKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZERlc3Ryb3lDaGlsZE5vZGVzQ29tbWFuZChDb21wb3VuZENvbW1hbmQgY21kLAotCQkJYm9vbGVhbiBjb25maXJtKSB7Ci0JCVZpZXcgdmlldyA9IChWaWV3KSBnZXRIb3N0KCkuZ2V0TW9kZWwoKTsKLQkJZm9yIChJdGVyYXRvciBpdCA9IHZpZXcuZ2V0Q2hpbGRyZW4oKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlOb2RlIG5vZGUgPSAoTm9kZSkgaXQubmV4dCgpOwotCQkJc3dpdGNoIChVTUxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKG5vZGUpKSB7Ci0JCQljYXNlIEFjdGl2aXR5UGFydGl0aW9uUGFydGl0aW9uQ2FtcGFydG1lbnQyRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJCWZvciAoSXRlcmF0b3IgY2l0ID0gbm9kZS5nZXRDaGlsZHJlbigpLml0ZXJhdG9yKCk7IGNpdAotCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJTm9kZSBjbm9kZSA9IChOb2RlKSBjaXQubmV4dCgpOwotCQkJCQlzd2l0Y2ggKFVNTFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQoY25vZGUpKSB7Ci0JCQkJCWNhc2UgQWN0aXZpdHlQYXJ0aXRpb24yRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJCQkJY21kLmFkZChnZXREZXN0cm95RWxlbWVudENvbW1hbmQoY25vZGUsIGNvbmZpcm0pKTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcG9saWNpZXMvQWN0aXZpdHlQYXJ0aXRpb25DYW5vbmljYWxFZGl0UG9saWN5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wb2xpY2llcy9BY3Rpdml0eVBhcnRpdGlvbkNhbm9uaWNhbEVkaXRQb2xpY3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjVkOTk4ZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wb2xpY2llcy9BY3Rpdml0eVBhcnRpdGlvbkNhbm9uaWNhbEVkaXRQb2xpY3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wb2xpY2llczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuQWN0aXZpdHlFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuQ2Fub25pY2FsRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkFjdGl2aXR5Tm9kZTsKLQotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXR5UGFydGl0aW9uQ2Fub25pY2FsRWRpdFBvbGljeSBleHRlbmRzIENhbm9uaWNhbEVkaXRQb2xpY3kgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBMaXN0IGdldFNlbWFudGljQ2hpbGRyZW5MaXN0KCkgewotCQlMaXN0IHJlc3VsdCA9IG5ldyBMaW5rZWRMaXN0KCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gc2hvdWxkRGVsZXRlVmlldyhWaWV3IHZpZXcpIHsKLQkJLy8gRGVsZXRlIHRoZSB2aWV3IGlmIGFjdGl2aXR5IHBhcnRpdGlvbiBpcyBub3QgcGFydCBvZiB0aGUgYWN0aXZpdHlub2RlLgotCQlpZih2aWV3LmdldEVsZW1lbnQoKSBpbnN0YW5jZW9mIEFjdGl2aXR5Tm9kZSl7Ci0JCQlpZighKChBY3Rpdml0eU5vZGUpdmlldy5nZXRFbGVtZW50KCkpLmdldEluUGFydGl0aW9ucygpLmNvbnRhaW5zKCgoVmlldylnZXRIb3N0KCkuZ2V0TW9kZWwoKSkuZ2V0RWxlbWVudCgpKSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gdmlldy5pc1NldEVsZW1lbnQoKSAmJiB2aWV3LmdldEVsZW1lbnQoKSAhPSBudWxsCi0JCQkJJiYgdmlldy5nZXRFbGVtZW50KCkuZUlzUHJveHkoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREZWZhdWx0RmFjdG9yeUhpbnQoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIE92ZXJyaWRlIHRvIGF2b2lkIHRoZSBkdXBsaWNhdGUgbGlua3MgZ2VuZXJhdGlvbi4KLQkgKiBTZXQgcGFyZW50IGNhbm9uaWNhbEVkaXRQb2xpY3kgdG8gZmFsc2UuCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZW5hYmxlUmVmcmVzaChib29sZWFuIGVuYWJsZSkgewotCQlFZGl0UGFydCBwYXJ0ICA9IGdldEhvc3QoKS5nZXRQYXJlbnQoKTsKLQkJaWYocGFydCBpbnN0YW5jZW9mIEFjdGl2aXR5RWRpdFBhcnQpewotCQkJT2JqZWN0IHZpZXcgPSBwYXJ0LmdldE1vZGVsKCk7Ci0JCQlFT2JqZWN0IHNlbWFudGljSG9zdCA9ICgoVmlldyl2aWV3KS5nZXRFbGVtZW50KCk7Ci0JCQlpZiAoc2VtYW50aWNIb3N0ICE9IG51bGwpIHsKLQkJCQlMaXN0IGNlcHMgPSBDYW5vbmljYWxFZGl0UG9saWN5LmdldFJlZ2lzdGVyZWRFZGl0UG9saWNpZXMoc2VtYW50aWNIb3N0KTsKLQkJCQlmb3IgKCBpbnQgaSA9IDA7IGkgPCBjZXBzLnNpemUoKTsgaSsrICkgewotCQkJCQlDYW5vbmljYWxFZGl0UG9saWN5IGNlcCA9IChDYW5vbmljYWxFZGl0UG9saWN5KWNlcHMuZ2V0KGkpOwotCQkJCQljZXAuZW5hYmxlUmVmcmVzaChlbmFibGUpOyAKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJc3VwZXIuZW5hYmxlUmVmcmVzaChlbmFibGUpOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BvbGljaWVzL0FjdGl2aXR5UGFydGl0aW9uR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BvbGljaWVzL0FjdGl2aXR5UGFydGl0aW9uR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzI3Y2YyYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wb2xpY2llcy9BY3Rpdml0eVBhcnRpdGlvbkdyYXBoaWNhbE5vZGVFZGl0UG9saWN5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucG9saWNpZXM7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZpdHlQYXJ0aXRpb25HcmFwaGljYWxOb2RlRWRpdFBvbGljeSBleHRlbmRzCi0JCVVNTEdyYXBoaWNhbE5vZGVFZGl0UG9saWN5IHsKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BvbGljaWVzL0FjdGl2aXR5UGFydGl0aW9uSXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcG9saWNpZXMvQWN0aXZpdHlQYXJ0aXRpb25JdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiNjQyODEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcG9saWNpZXMvQWN0aXZpdHlQYXJ0aXRpb25JdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucG9saWNpZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbXBvdW5kQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLmNvbW1hbmRzLkRlc3Ryb3lFbGVtZW50Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkNyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5EZXN0cm95RWxlbWVudFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLkFjdGl2aXR5UGFydGl0aW9uMkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuQWN0aXZpdHlQYXJ0aXRpb25QYXJ0aXRpb25DYW1wYXJ0bWVudEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnBhcnQuVU1MVmlzdWFsSURSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eVBhcnRpdGlvbkl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kgZXh0ZW5kcwotCQlVTUxCYXNlSXRlbVNlbWFudGljRWRpdFBvbGljeSB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0RGVzdHJveUVsZW1lbnRDb21tYW5kKERlc3Ryb3lFbGVtZW50UmVxdWVzdCByZXEpIHsKLQkJQ29tcG91bmRDb21tYW5kIGNjID0gZ2V0RGVzdHJveUVkZ2VzQ29tbWFuZChyZXEKLQkJCQkuaXNDb25maXJtYXRpb25SZXF1aXJlZCgpKTsKLQkJYWRkRGVzdHJveUNoaWxkTm9kZXNDb21tYW5kKGNjLCByZXEuaXNDb25maXJtYXRpb25SZXF1aXJlZCgpKTsKLQkJVmlldyB2aWV3ID0gKFZpZXcpIGdldEhvc3QoKS5nZXRNb2RlbCgpOwotCQlpZiAodmlldy5nZXRFQW5ub3RhdGlvbigiU2hvcnRjdXQiKSAhPSBudWxsKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXJlcS5zZXRFbGVtZW50VG9EZXN0cm95KHZpZXcpOwotCQl9Ci0JCWNjLmFkZChnZXRNU0xXcmFwcGVyKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQocmVxKSkpOwotCQlyZXR1cm4gY2MudW53cmFwKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZERlc3Ryb3lDaGlsZE5vZGVzQ29tbWFuZChDb21wb3VuZENvbW1hbmQgY21kLAotCQkJYm9vbGVhbiBjb25maXJtKSB7Ci0JCVZpZXcgdmlldyA9IChWaWV3KSBnZXRIb3N0KCkuZ2V0TW9kZWwoKTsKLQkJZm9yIChJdGVyYXRvciBpdCA9IHZpZXcuZ2V0Q2hpbGRyZW4oKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlOb2RlIG5vZGUgPSAoTm9kZSkgaXQubmV4dCgpOwotCQkJc3dpdGNoIChVTUxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKG5vZGUpKSB7Ci0JCQljYXNlIEFjdGl2aXR5UGFydGl0aW9uUGFydGl0aW9uQ2FtcGFydG1lbnRFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQkJZm9yIChJdGVyYXRvciBjaXQgPSBub2RlLmdldENoaWxkcmVuKCkuaXRlcmF0b3IoKTsgY2l0Ci0JCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQlOb2RlIGNub2RlID0gKE5vZGUpIGNpdC5uZXh0KCk7Ci0JCQkJCXN3aXRjaCAoVU1MVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRChjbm9kZSkpIHsKLQkJCQkJY2FzZSBBY3Rpdml0eVBhcnRpdGlvbjJFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQkJCQljbWQuYWRkKGdldERlc3Ryb3lFbGVtZW50Q29tbWFuZChjbm9kZSwgY29uZmlybSkpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wb2xpY2llcy9BY3Rpdml0eVBhcnRpdGlvblBhcnRpdGlvbkNhbXBhcnRtZW50MkNhbm9uaWNhbEVkaXRQb2xpY3kuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BvbGljaWVzL0FjdGl2aXR5UGFydGl0aW9uUGFydGl0aW9uQ2FtcGFydG1lbnQyQ2Fub25pY2FsRWRpdFBvbGljeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOTUwNjQwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BvbGljaWVzL0FjdGl2aXR5UGFydGl0aW9uUGFydGl0aW9uQ2FtcGFydG1lbnQyQ2Fub25pY2FsRWRpdFBvbGljeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBvbGljaWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuQ2Fub25pY2FsRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5BY3Rpdml0eVBhcnRpdGlvbjJFZGl0UGFydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnBhcnQuVU1MVmlzdWFsSURSZWdpc3RyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkFjdGl2aXR5UGFydGl0aW9uOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXR5UGFydGl0aW9uUGFydGl0aW9uQ2FtcGFydG1lbnQyQ2Fub25pY2FsRWRpdFBvbGljeSBleHRlbmRzCi0JCUNhbm9uaWNhbEVkaXRQb2xpY3kgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBMaXN0IGdldFNlbWFudGljQ2hpbGRyZW5MaXN0KCkgewotCQlMaXN0IHJlc3VsdCA9IG5ldyBMaW5rZWRMaXN0KCk7Ci0JCUVPYmplY3QgbW9kZWxPYmplY3QgPSAoKFZpZXcpIGdldEhvc3QoKS5nZXRNb2RlbCgpKS5nZXRFbGVtZW50KCk7Ci0JCVZpZXcgdmlld09iamVjdCA9IChWaWV3KSBnZXRIb3N0KCkuZ2V0TW9kZWwoKTsKLQkJRU9iamVjdCBuZXh0VmFsdWU7Ci0JCWludCBub2RlVklEOwotCQlmb3IgKEl0ZXJhdG9yIHZhbHVlcyA9ICgoQWN0aXZpdHlQYXJ0aXRpb24pIG1vZGVsT2JqZWN0KQotCQkJCS5nZXRTdWJwYXJ0aXRpb25zKCkuaXRlcmF0b3IoKTsgdmFsdWVzLmhhc05leHQoKTspIHsKLQkJCW5leHRWYWx1ZSA9IChFT2JqZWN0KSB2YWx1ZXMubmV4dCgpOwotCQkJbm9kZVZJRCA9IFVNTFZpc3VhbElEUmVnaXN0cnkKLQkJCQkJLmdldE5vZGVWaXN1YWxJRCh2aWV3T2JqZWN0LCBuZXh0VmFsdWUpOwotCQkJaWYgKEFjdGl2aXR5UGFydGl0aW9uMkVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVklEKSB7Ci0JCQkJcmVzdWx0LmFkZChuZXh0VmFsdWUpOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHNob3VsZERlbGV0ZVZpZXcoVmlldyB2aWV3KSB7Ci0JCWlmICh2aWV3LmdldEVBbm5vdGF0aW9uKCJTaG9ydGN1dCIpICE9IG51bGwpIHsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIHZpZXcuaXNTZXRFbGVtZW50KCkKLQkJCQkJJiYgKHZpZXcuZ2V0RWxlbWVudCgpID09IG51bGwgfHwgdmlldy5nZXRFbGVtZW50KCkKLQkJCQkJCQkuZUlzUHJveHkoKSk7Ci0JCX0KLQkJaW50IG5vZGVWSUQgPSBVTUxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKHZpZXcpOwotCQlzd2l0Y2ggKG5vZGVWSUQpIHsKLQkJY2FzZSBBY3Rpdml0eVBhcnRpdGlvbjJFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGVmYXVsdEZhY3RvcnlIaW50KCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BvbGljaWVzL0FjdGl2aXR5UGFydGl0aW9uUGFydGl0aW9uQ2FtcGFydG1lbnQySXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcG9saWNpZXMvQWN0aXZpdHlQYXJ0aXRpb25QYXJ0aXRpb25DYW1wYXJ0bWVudDJJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0Yzc2ZDYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcG9saWNpZXMvQWN0aXZpdHlQYXJ0aXRpb25QYXJ0aXRpb25DYW1wYXJ0bWVudDJJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucG9saWNpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5jb21tYW5kcy5BY3Rpdml0eVBhcnRpdGlvbkNyZWF0ZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQucHJvdmlkZXJzLlVNTEVsZW1lbnRUeXBlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5jb21tYW5kcy5DcmVhdGVFbGVtZW50Q29tbWFuZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ3JlYXRlRWxlbWVudFJlcXVlc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuVU1MUGFja2FnZTsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eVBhcnRpdGlvblBhcnRpdGlvbkNhbXBhcnRtZW50Mkl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kKLQkJZXh0ZW5kcyBVTUxCYXNlSXRlbVNlbWFudGljRWRpdFBvbGljeSB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlQ29tbWFuZChDcmVhdGVFbGVtZW50UmVxdWVzdCByZXEpIHsKLQkJaWYgKFVNTEVsZW1lbnRUeXBlcy5BY3Rpdml0eVBhcnRpdGlvbl8yMDAxID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7Ci0JCQlpZiAocmVxLmdldENvbnRhaW5tZW50RmVhdHVyZSgpID09IG51bGwpIHsKLQkJCQlyZXEuc2V0Q29udGFpbm1lbnRGZWF0dXJlKFVNTFBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkuZ2V0QWN0aXZpdHlQYXJ0aXRpb25fU3VicGFydGl0aW9uKCkpOwotCQkJfQotCQkJcmV0dXJuIGdldE1TTFdyYXBwZXIobmV3IEFjdGl2aXR5UGFydGl0aW9uQ3JlYXRlQ29tbWFuZChyZXEpKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0Q3JlYXRlQ29tbWFuZChyZXEpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcG9saWNpZXMvQWN0aXZpdHlQYXJ0aXRpb25QYXJ0aXRpb25DYW1wYXJ0bWVudENhbm9uaWNhbEVkaXRQb2xpY3kuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BvbGljaWVzL0FjdGl2aXR5UGFydGl0aW9uUGFydGl0aW9uQ2FtcGFydG1lbnRDYW5vbmljYWxFZGl0UG9saWN5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4NmI3NTIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcG9saWNpZXMvQWN0aXZpdHlQYXJ0aXRpb25QYXJ0aXRpb25DYW1wYXJ0bWVudENhbm9uaWNhbEVkaXRQb2xpY3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wb2xpY2llczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkNhbm9uaWNhbEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuQWN0aXZpdHlQYXJ0aXRpb24yRWRpdFBhcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5wYXJ0LlVNTFZpc3VhbElEUmVnaXN0cnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eVBhcnRpdGlvbjsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eVBhcnRpdGlvblBhcnRpdGlvbkNhbXBhcnRtZW50Q2Fub25pY2FsRWRpdFBvbGljeSBleHRlbmRzCi0JCUNhbm9uaWNhbEVkaXRQb2xpY3kgewotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJvdGVjdGVkIExpc3QgZ2V0U2VtYW50aWNDaGlsZHJlbkxpc3QoKSB7Ci0JCUxpc3QgcmVzdWx0ID0gbmV3IExpbmtlZExpc3QoKTsKLQkJRU9iamVjdCBtb2RlbE9iamVjdCA9ICgoVmlldykgZ2V0SG9zdCgpLmdldE1vZGVsKCkpLmdldEVsZW1lbnQoKTsKLQkJVmlldyB2aWV3T2JqZWN0ID0gKFZpZXcpIGdldEhvc3QoKS5nZXRNb2RlbCgpOwotCQlFT2JqZWN0IG5leHRWYWx1ZTsKLQkJaW50IG5vZGVWSUQ7Ci0JCS8vIG1vZGlmaWVkIHRvIGNoZWNrIEFjdGl2aXR5UGFydGl0aW9uIG9yIG5vdC4gdG8gYXZvaWQgY2xhc3NjYXN0IGV4Y2VwdGlvbi4KLQkJaWYgKG1vZGVsT2JqZWN0IGluc3RhbmNlb2YgQWN0aXZpdHlQYXJ0aXRpb24pIHsKLQkJCWZvciAoSXRlcmF0b3IgdmFsdWVzID0gKChBY3Rpdml0eVBhcnRpdGlvbikgbW9kZWxPYmplY3QpCi0JCQkJCS5nZXRTdWJwYXJ0aXRpb25zKCkuaXRlcmF0b3IoKTsgdmFsdWVzLmhhc05leHQoKTspIHsKLQkJCQluZXh0VmFsdWUgPSAoRU9iamVjdCkgdmFsdWVzLm5leHQoKTsKLQkJCQlub2RlVklEID0gVU1MVmlzdWFsSURSZWdpc3RyeS5nZXROb2RlVmlzdWFsSUQodmlld09iamVjdCwKLQkJCQkJCW5leHRWYWx1ZSk7Ci0JCQkJaWYgKEFjdGl2aXR5UGFydGl0aW9uMkVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVklEKSB7Ci0JCQkJCXJlc3VsdC5hZGQobmV4dFZhbHVlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gc2hvdWxkRGVsZXRlVmlldyhWaWV3IHZpZXcpIHsKLQkJaWYgKHZpZXcuZ2V0RUFubm90YXRpb24oIlNob3J0Y3V0IikgIT0gbnVsbCkgeyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gdmlldy5pc1NldEVsZW1lbnQoKQotCQkJCQkmJiAodmlldy5nZXRFbGVtZW50KCkgPT0gbnVsbCB8fCB2aWV3LmdldEVsZW1lbnQoKQotCQkJCQkJCS5lSXNQcm94eSgpKTsKLQkJfQotCQlpbnQgbm9kZVZJRCA9IFVNTFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQodmlldyk7Ci0JCXN3aXRjaCAobm9kZVZJRCkgewotCQljYXNlIEFjdGl2aXR5UGFydGl0aW9uMkVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREZWZhdWx0RmFjdG9yeUhpbnQoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcG9saWNpZXMvQWN0aXZpdHlQYXJ0aXRpb25QYXJ0aXRpb25DYW1wYXJ0bWVudEl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BvbGljaWVzL0FjdGl2aXR5UGFydGl0aW9uUGFydGl0aW9uQ2FtcGFydG1lbnRJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxNWYxYjIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcG9saWNpZXMvQWN0aXZpdHlQYXJ0aXRpb25QYXJ0aXRpb25DYW1wYXJ0bWVudEl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucG9saWNpZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmN1c3RvbS5jb21tYW5kcy5BY3Rpdml0eVBhcnRpdGlvbkRlc3Ryb3lDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmN1c3RvbS5jb21tYW5kcy5DcmVhdGVBY3Rpdml0eU5vZGVJbkFjdGl2aXR5UGFydGl0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQuY29tbWFuZHMuQWN0aXZpdHlQYXJ0aXRpb25DcmVhdGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuQWN0aXZpdHlFZGl0UGFydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnByb3ZpZGVycy5VTUxFbGVtZW50VHlwZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5EaWFncmFtQ29yZVJlc291cmNlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuVW5leGVjdXRhYmxlQ29tbWFuZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi5jb3JlLmNvbW1hbmQuQ29tbWFuZFJlc3VsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS5jb21tYW5kLkNvbXBvc2l0ZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUuY29tbWFuZC5JQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuY29tbWFuZHMuQWRkQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUudXRpbC5WaWV3VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmNvbW1hbmRzLkNvbW1hbmRQcm94eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmNvbW1hbmRzLklDb21tYW5kUHJveHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLkxhYmVsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXF1ZXN0cy5FZGl0Q29tbWFuZFJlcXVlc3RXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb3JlLnV0aWwuRU9iamVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5jb21tYW5kcy5DcmVhdGVFbGVtZW50Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLmNvbW1hbmRzLkVkaXRFbGVtZW50Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkNyZWF0ZUVsZW1lbnRSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkRlc3Ryb3lFbGVtZW50UmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkRlc3Ryb3lSZWZlcmVuY2VSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuSUVkaXRDb21tYW5kUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLk1vdmVSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuQWN0aXZpdHlQYXJ0aXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5VTUxQYWNrYWdlOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXR5UGFydGl0aW9uUGFydGl0aW9uQ2FtcGFydG1lbnRJdGVtU2VtYW50aWNFZGl0UG9saWN5IGV4dGVuZHMgVU1MQmFzZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kgewotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlQ29tbWFuZChDcmVhdGVFbGVtZW50UmVxdWVzdCByZXEpIHsKLQkJaWYgKFVNTEVsZW1lbnRUeXBlcy5BY3Rpdml0eVBhcnRpdGlvbl8yMDAxID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7CQkKLQkJCWlmIChyZXEuZ2V0Q29udGFpbm1lbnRGZWF0dXJlKCkgPT0gbnVsbCkgewotCQkJCXJlcS5zZXRDb250YWlubWVudEZlYXR1cmUoVU1MUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QWN0aXZpdHlQYXJ0aXRpb25fU3VicGFydGl0aW9uKCkpOwotCQkJfQotCQkJcmV0dXJuIGdldE1TTFdyYXBwZXIobmV3IENyZWF0ZUFjdGl2aXR5UGFydGl0aW9uXzIwMDFDb21tYW5kKHJlcSkpOwotCQl9Ci0JCQotCQkvLyBtb2RpZmllZCBTVEFSVAotCQlDb21tYW5kIGNvbW1hbmQgPSBnZXRDcmVhdGVBY3Rpdml0eU5vZGVDb21tYW5kKHJlcSk7Ci0JCWlmIChjb21tYW5kICE9IG51bGwpIHsKLQkJCXJldHVybiBjb21tYW5kOwotCQl9Ci0JCS8vIG1vZGlmaWVkIEVORAotCQlyZXR1cm4gc3VwZXIuZ2V0Q3JlYXRlQ29tbWFuZChyZXEpOwotCX0KLQotCS8qKgotCSAqIEBtb2RpZmllZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGNsYXNzIENyZWF0ZUFjdGl2aXR5UGFydGl0aW9uXzIwMDFDb21tYW5kIGV4dGVuZHMKLQkJCUNyZWF0ZUVsZW1lbnRDb21tYW5kIHsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIENyZWF0ZUFjdGl2aXR5UGFydGl0aW9uXzIwMDFDb21tYW5kKENyZWF0ZUVsZW1lbnRSZXF1ZXN0IHJlcSkgewotCQkJc3VwZXIocmVxKTsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcm90ZWN0ZWQgRUNsYXNzIGdldEVDbGFzc1RvRWRpdCgpIHsKLQkJCXJldHVybiBVTUxQYWNrYWdlLmVJTlNUQU5DRS5nZXRBY3Rpdml0eVBhcnRpdGlvbigpOwotCQl9OwotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcm90ZWN0ZWQgRU9iamVjdCBnZXRFbGVtZW50VG9FZGl0KCkgewotCQkJRU9iamVjdCBjb250YWluZXIgPSAoKENyZWF0ZUVsZW1lbnRSZXF1ZXN0KSBnZXRSZXF1ZXN0KCkpCi0JCQkJCS5nZXRDb250YWluZXIoKTsKLQkJCWlmIChjb250YWluZXIgaW5zdGFuY2VvZiBWaWV3KSB7Ci0JCQkJY29udGFpbmVyID0gKChWaWV3KSBjb250YWluZXIpLmdldEVsZW1lbnQoKTsKLQkJCX0KLQkJCXJldHVybiBjb250YWluZXI7Ci0JCX0KLQl9Ci0JCi0JCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJpdmF0ZSBDb21tYW5kIGdldENyZWF0ZUFjdGl2aXR5Tm9kZUNvbW1hbmQoQ3JlYXRlRWxlbWVudFJlcXVlc3QgcmVxKSB7Ci0JCWlmIChVTUxFbGVtZW50VHlwZXMuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZV8xMDA3ID09IHJlcS5nZXRFbGVtZW50VHlwZSgpCi0JCQkJfHwgVU1MRWxlbWVudFR5cGVzLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVfMTAxMCA9PSByZXEKLQkJCQkJCS5nZXRFbGVtZW50VHlwZSgpCi0JCQkJfHwgVU1MRWxlbWVudFR5cGVzLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVfMTAxMSA9PSByZXEKLQkJCQkJCS5nZXRFbGVtZW50VHlwZSgpCi0JCQkJfHwgVU1MRWxlbWVudFR5cGVzLk1lcmdlTm9kZV8xMDAyID09IHJlcS5nZXRFbGVtZW50VHlwZSgpCi0JCQkJfHwgVU1MRWxlbWVudFR5cGVzLkZvcmtOb2RlXzEwMDMgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkKLQkJCQl8fCBVTUxFbGVtZW50VHlwZXMuSW5pdGlhbE5vZGVfMTAwNCA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKQotCQkJCXx8IFVNTEVsZW1lbnRUeXBlcy5EZWNpc2lvbk5vZGVfMTAwNSA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKQotCQkJCXx8IFVNTEVsZW1lbnRUeXBlcy5Kb2luTm9kZV8xMDA2ID09IHJlcS5nZXRFbGVtZW50VHlwZSgpCi0JCQkJfHwgVU1MRWxlbWVudFR5cGVzLkFjdGl2aXR5RmluYWxOb2RlXzEwMDEgPT0gcmVxCi0JCQkJCQkuZ2V0RWxlbWVudFR5cGUoKQotCQkJCXx8IFVNTEVsZW1lbnRUeXBlcy5BY3Rpdml0eVBhcmFtZXRlck5vZGVfMTAwOSA9PSByZXEKLQkJCQkJCS5nZXRFbGVtZW50VHlwZSgpCi0JCQkJfHwgVU1MRWxlbWVudFR5cGVzLkFjdGl2aXR5UGFyYW1ldGVyTm9kZV8xMDEyID09IHJlcQotCQkJCQkJLmdldEVsZW1lbnRUeXBlKCkpIHsKLQkJCWlmIChyZXEuZ2V0Q29udGFpbm1lbnRGZWF0dXJlKCkgPT0gbnVsbCkgewotCQkJCXJlcS5zZXRDb250YWlubWVudEZlYXR1cmUoVU1MUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCS5nZXRBY3Rpdml0eVBhcnRpdGlvbl9Ob2RlKCkpOwotCQkJfQotCQkJcmV0dXJuIGdldE1TTFdyYXBwZXIobmV3IENyZWF0ZUFjdGl2aXR5Tm9kZUluQWN0aXZpdHlQYXJ0aXRpb24ocmVxKSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZ21mLmRpYWdyYW0uZWRpdC5wb2xpY2llcy5VTUxCYXNlSXRlbVNlbWFudGljRWRpdFBvbGljeSNnZXRDcmVhdGVPdXRnb2luZyhvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkNyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3QpCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlT3V0Z29pbmcoQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdCByZXEpIHsKLQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JfQotCQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wb2xpY2llcy5VTUxCYXNlSXRlbVNlbWFudGljRWRpdFBvbGljeSNnZXREZXN0cm95RWxlbWVudENvbW1hbmQob3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5EZXN0cm95RWxlbWVudFJlcXVlc3QpCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0RGVzdHJveUVsZW1lbnRDb21tYW5kKERlc3Ryb3lFbGVtZW50UmVxdWVzdCByZXEpIHsKLQkJLyogbW9kaWZ5IFNUQVJUICovCi0JCUNvbXBvc2l0ZUNvbW1hbmQgY2MgPSBuZXcgQ29tcG9zaXRlQ29tbWFuZChEaWFncmFtQ29yZVJlc291cmNlcy5kZWxldGVDb21tYW5kX2xhYmVsKTsKLQkJZ2V0UmVwYXJlbnRpbmdDb21tYW5kKHJlcSwgY2MpOwotCQljYy5jb21wb3NlKG5ldyBDb21tYW5kUHJveHkoZ2V0TVNMV3JhcHBlcihuZXcgQWN0aXZpdHlQYXJ0aXRpb25EZXN0cm95Q29tbWFuZChyZXEsIGdldEhvc3QoKSkpKSk7Ci0JCXJldHVybiBjYy5pc0VtcHR5KCkgPyBudWxsIDogbmV3IElDb21tYW5kUHJveHkoY2MucmVkdWNlKCkpOwotCQkvKiBtb2RpZnkgRU5EICovCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBvbGljaWVzLlVNTEJhc2VJdGVtU2VtYW50aWNFZGl0UG9saWN5I2dldERlc3Ryb3lSZWZlcmVuY2VDb21tYW5kKG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuRGVzdHJveVJlZmVyZW5jZVJlcXVlc3QpCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0RGVzdHJveVJlZmVyZW5jZUNvbW1hbmQoRGVzdHJveVJlZmVyZW5jZVJlcXVlc3QgcmVxKSB7Ci0JCXJldHVybiBzdXBlci5nZXREZXN0cm95UmVmZXJlbmNlQ29tbWFuZChyZXEpOwotCX0KLQotCQotCS8qKgotCSAqIENvbW1hbmQgdG8gcmVwYXJlbnRpbmcgdGhlIGVsZW1lbnRzIHRvIEFjdGl2aXR5IGJlZm9yZSBkZWxldGluZyB0aGUgQWN0aXZpdHlQYXJ0aXRpb24uCi0gCSAqCi0JICogQHBhcmFtIHJlcXVlc3QgdGhlIHJlcXVlc3QKLQkgKiBAcmV0dXJuIGNvbW1hbmQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRSZXBhcmVudGluZ0NvbW1hbmQoRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHJlcXVlc3QsIENvbXBvc2l0ZUNvbW1hbmQgY2MpIHsKLQkJSXRlcmF0b3IgZWRpdFBhcnRzID0gZ2V0SG9zdCgpLmdldENoaWxkcmVuKCkuaXRlcmF0b3IoKTsKLQkJT2JqZWN0IHBhcmVudCAgPSAgKChFZGl0UGFydClnZXRIb3N0KCkpLmdldFBhcmVudCgpOwotCQlFUmVmZXJlbmNlIGZlYXR1cmUgPSBVTUxQYWNrYWdlLmVJTlNUQU5DRS5nZXRBY3Rpdml0eV9Ob2RlKCk7Ci0JCQotCQlpZighKHBhcmVudCBpbnN0YW5jZW9mIEFjdGl2aXR5RWRpdFBhcnQpKXsKLQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQl9Ci0JCQotCQlWaWV3IGNvbnRhaW5lciA9IChWaWV3KSgoRWRpdFBhcnQpcGFyZW50KS5nZXRBZGFwdGVyKFZpZXcuY2xhc3MpOwotCQkKLQkJRU9iamVjdCBjb250YWluZXJDb250ZXh0ID0gY29udGFpbmVyID09IG51bGwgPyBudWxsIDogVmlld1V0aWwucmVzb2x2ZVNlbWFudGljRWxlbWVudChjb250YWluZXIpOwotCQl3aGlsZSAoIGVkaXRQYXJ0cy5oYXNOZXh0KCkgKSB7Ci0JCQlJR3JhcGhpY2FsRWRpdFBhcnQgZXAgPSAoSUdyYXBoaWNhbEVkaXRQYXJ0KWVkaXRQYXJ0cy5uZXh0KCk7Ci0JCQlpZiAoIGVwIGluc3RhbmNlb2YgTGFiZWxFZGl0UGFydCApIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCQotCQkJVmlldyB2aWV3ID0gKFZpZXcpZXAuZ2V0QWRhcHRlcihWaWV3LmNsYXNzKTsKLQkJCWlmICggdmlldyA9PSBudWxsICkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJCi0JCQlFT2JqZWN0IHNlbWFudGljQ29udGV4dCA9IFZpZXdVdGlsLnJlc29sdmVTZW1hbnRpY0VsZW1lbnQodmlldyk7Ci0JCQlpZihzZW1hbnRpY0NvbnRleHQgaW5zdGFuY2VvZiBBY3Rpdml0eVBhcnRpdGlvbikKLQkJCQljb250aW51ZTsKLQkJCQotCQkJCi0JCQkgVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gZWRpdGluZ0RvbWFpbiA9ICgoSUdyYXBoaWNhbEVkaXRQYXJ0KSBnZXRIb3N0KCkpCi0JICAgICAgICAgICAgLmdldEVkaXRpbmdEb21haW4oKTsKLQkJCSAKLQkJCWlmICggc2VtYW50aWNDb250ZXh0ID09IG51bGwgKSB7Ci0JCQkJQWRkQ29tbWFuZCBhZGRDb21tYW5kID0gbmV3IEFkZENvbW1hbmQoZWRpdGluZ0RvbWFpbiwgbmV3IEVPYmplY3RBZGFwdGVyKGNvbnRhaW5lciksCi0JCQkJCQkgIG5ldyBFT2JqZWN0QWRhcHRlcih2aWV3KSk7Ci0JCQkJY2MuY29tcG9zZShhZGRDb21tYW5kKTsKLQkJCX0KLQkJCWVsc2UgaWYgKCBjb250YWluZXJDb250ZXh0ICE9IG51bGwgKSB7Ci0JCQkJaWYgKGNvbnRhaW5lckNvbnRleHQuZXF1YWxzKHNlbWFudGljQ29udGV4dC5lQ29udGFpbmVyKCkpCi0JCQkJCQkmJiBmZWF0dXJlID09IHNlbWFudGljQ29udGV4dC5lQ29udGFpbm1lbnRGZWF0dXJlKCkpIHsKLQkJCQkJY2MuY29tcG9zZShuZXcgUmVwYXJlbnRpbmdFbGVtZW50c0NvbW1hbmQocmVxdWVzdCwgc2VtYW50aWNDb250ZXh0KSk7Ci0JCQkJCUFkZENvbW1hbmQgYWRkQ29tbWFuZCA9IG5ldyBBZGRDb21tYW5kKGVkaXRpbmdEb21haW4sIG5ldyBFT2JqZWN0QWRhcHRlcihjb250YWluZXIpLAotCQkJCQkJCSAgbmV3IEVPYmplY3RBZGFwdGVyKHZpZXcpKTsKLQkJCQkJY2MuY29tcG9zZShhZGRDb21tYW5kKTsKLQkJCQl9Ci0JCQkJZWxzZXsKLQkJCQkJQ29tbWFuZCBtb3ZlU2VtYW50aWNDbWQgPQotCQkJCQkoKEFjdGl2aXR5RWRpdFBhcnQpcGFyZW50KS5nZXRDb21tYW5kKAotCQkJCQkJbmV3IEVkaXRDb21tYW5kUmVxdWVzdFdyYXBwZXIoCi0JCQkJCQkJbmV3IE1vdmVSZXF1ZXN0KGVkaXRpbmdEb21haW4sIGNvbnRhaW5lckNvbnRleHQsIAotCQkJCQkJCQkJVU1MUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QWN0aXZpdHlfTm9kZSgpLAotCQkJCQkJCQkJc2VtYW50aWNDb250ZXh0KSkpOwotCQkJCQlpZihtb3ZlU2VtYW50aWNDbWQgICE9IG51bGwpewotCQkJCQkJY2MuY29tcG9zZShuZXcgQ29tbWFuZFByb3h5KG1vdmVTZW1hbnRpY0NtZCkpOwotCQkJCQl9Ci0vLwkJCQkJY2MuY29tcG9zZShuZXcgUmVwYXJlbnRpbmdFbGVtZW50c0NvbW1hbmQocmVxdWVzdCwgc2VtYW50aWNDb250ZXh0KSk7Ci0JCQkJCS8vbW92ZSBub3RhdGlvbgotCQkJCQlBZGRDb21tYW5kIGFkZENvbW1hbmQgPSBuZXcgQWRkQ29tbWFuZChlZGl0aW5nRG9tYWluLCBuZXcgRU9iamVjdEFkYXB0ZXIoY29udGFpbmVyKSwKLQkJCQkJCQkgIG5ldyBFT2JqZWN0QWRhcHRlcih2aWV3KSk7Ci0JCQkJCWNjLmNvbXBvc2UoYWRkQ29tbWFuZCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBjYy5pc0VtcHR5KCkgPyBudWxsIDogbmV3IElDb21tYW5kUHJveHkoY2MucmVkdWNlKCkpOwotCX0KLQkKLQlwdWJsaWMgY2xhc3MgUmVwYXJlbnRpbmdFbGVtZW50c0NvbW1hbmQgZXh0ZW5kcyBFZGl0RWxlbWVudENvbW1hbmR7Ci0KLQkJcHJpdmF0ZSBmaW5hbCBFT2JqZWN0IG1vdmVFbGVtZW50OwotCQkKLQkJcHVibGljIFJlcGFyZW50aW5nRWxlbWVudHNDb21tYW5kKERlc3Ryb3lFbGVtZW50UmVxdWVzdCByZXEsIEVPYmplY3QgZWxlbWVudCkgewotCQkJdGhpcyhEaWFncmFtQ29yZVJlc291cmNlcy5kZWxldGVDb21tYW5kX2xhYmVsLCBlbGVtZW50LCByZXEpOwotCQl9Ci0JCQotCQlwcm90ZWN0ZWQgUmVwYXJlbnRpbmdFbGVtZW50c0NvbW1hbmQoU3RyaW5nIGxhYmVsLCBFT2JqZWN0IGVsZW1lbnRUb0VkaXQsIAotCQkJCUlFZGl0Q29tbWFuZFJlcXVlc3QgcmVxdWVzdCkgewotCQkJc3VwZXIobGFiZWwsIGVsZW1lbnRUb0VkaXQsIHJlcXVlc3QpOwotCQkJdGhpcy5tb3ZlRWxlbWVudCA9IGVsZW1lbnRUb0VkaXQ7IAotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBDb21tYW5kUmVzdWx0IGRvRXhlY3V0ZVdpdGhSZXN1bHQoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCQkJVmlldyB2aWV3ID0gKFZpZXcpZ2V0SG9zdCgpLmdldE1vZGVsKCk7Ci0JCQlpZih2aWV3LmdldEVsZW1lbnQoKSBpbnN0YW5jZW9mIEFjdGl2aXR5UGFydGl0aW9uKXsKLQkJCQlpZihtb3ZlRWxlbWVudCBpbnN0YW5jZW9mIEFjdGl2aXR5Tm9kZSl7Ci0JCQkJCSgoQWN0aXZpdHlOb2RlKW1vdmVFbGVtZW50KS5nZXRJblBhcnRpdGlvbnMoKS5yZW1vdmUodmlldy5nZXRFbGVtZW50KCkpOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgYm9vbGVhbiBjYW5FeGVjdXRlKCkgewotCQkJaWYobW92ZUVsZW1lbnQgIT0gbnVsbCkgcmV0dXJuIHRydWU7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9Ci0JCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wb2xpY2llcy9Db250cm9sRmxvd0l0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BvbGljaWVzL0NvbnRyb2xGbG93SXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MDg3ZTNkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BvbGljaWVzL0NvbnRyb2xGbG93SXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBvbGljaWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLmNvbW1hbmRzLkRlc3Ryb3lFbGVtZW50Q29tbWFuZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuRGVzdHJveUVsZW1lbnRSZXF1ZXN0OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIENvbnRyb2xGbG93SXRlbVNlbWFudGljRWRpdFBvbGljeSBleHRlbmRzCi0JCVVNTEJhc2VJdGVtU2VtYW50aWNFZGl0UG9saWN5IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXREZXN0cm95RWxlbWVudENvbW1hbmQoRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHJlcSkgewotCQlyZXR1cm4gZ2V0TVNMV3JhcHBlcihuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKHJlcSkpOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BvbGljaWVzL0RlY2lzaW9uTm9kZUNhbm9uaWNhbEVkaXRQb2xpY3kuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BvbGljaWVzL0RlY2lzaW9uTm9kZUNhbm9uaWNhbEVkaXRQb2xpY3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGU1ZjA2Zi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wb2xpY2llcy9EZWNpc2lvbk5vZGVDYW5vbmljYWxFZGl0UG9saWN5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucG9saWNpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5DYW5vbmljYWxFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRGVjaXNpb25Ob2RlQ2Fub25pY2FsRWRpdFBvbGljeSBleHRlbmRzIENhbm9uaWNhbEVkaXRQb2xpY3kgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBMaXN0IGdldFNlbWFudGljQ2hpbGRyZW5MaXN0KCkgewotCQlMaXN0IHJlc3VsdCA9IG5ldyBMaW5rZWRMaXN0KCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHNob3VsZERlbGV0ZVZpZXcoVmlldyB2aWV3KSB7Ci0JCXJldHVybiB2aWV3LmlzU2V0RWxlbWVudCgpICYmIHZpZXcuZ2V0RWxlbWVudCgpICE9IG51bGwKLQkJCQkmJiB2aWV3LmdldEVsZW1lbnQoKS5lSXNQcm94eSgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERlZmF1bHRGYWN0b3J5SGludCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wb2xpY2llcy9EZWNpc2lvbk5vZGVHcmFwaGljYWxOb2RlRWRpdFBvbGljeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcG9saWNpZXMvRGVjaXNpb25Ob2RlR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmFlMTc5MC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wb2xpY2llcy9EZWNpc2lvbk5vZGVHcmFwaGljYWxOb2RlRWRpdFBvbGljeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBvbGljaWVzOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERlY2lzaW9uTm9kZUdyYXBoaWNhbE5vZGVFZGl0UG9saWN5IGV4dGVuZHMKLQkJVU1MR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kgewotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcG9saWNpZXMvRGVjaXNpb25Ob2RlSXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcG9saWNpZXMvRGVjaXNpb25Ob2RlSXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZDMzNTI4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BvbGljaWVzL0RlY2lzaW9uTm9kZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucG9saWNpZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5jb21tYW5kcy5Db250cm9sRmxvd0NyZWF0ZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbXBvdW5kQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuVW5leGVjdXRhYmxlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLmNvbW1hbmRzLkRlc3Ryb3lFbGVtZW50Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkNyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5EZXN0cm95RWxlbWVudFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eUVkZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuQWN0aXZpdHlOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkRlY2lzaW9uTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLlVNTFBhY2thZ2U7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRGVjaXNpb25Ob2RlSXRlbVNlbWFudGljRWRpdFBvbGljeSBleHRlbmRzCi0JCVVNTEJhc2VJdGVtU2VtYW50aWNFZGl0UG9saWN5IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXREZXN0cm95RWxlbWVudENvbW1hbmQoRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHJlcSkgewotCQlDb21wb3VuZENvbW1hbmQgY2MgPSBnZXREZXN0cm95RWRnZXNDb21tYW5kKHJlcQotCQkJCS5pc0NvbmZpcm1hdGlvblJlcXVpcmVkKCkpOwotCQlWaWV3IHZpZXcgPSAoVmlldykgZ2V0SG9zdCgpLmdldE1vZGVsKCk7Ci0JCWlmICh2aWV3LmdldEVBbm5vdGF0aW9uKCJTaG9ydGN1dCIpICE9IG51bGwpIHsgLy8kTk9OLU5MUy0xJAotCQkJcmVxLnNldEVsZW1lbnRUb0Rlc3Ryb3kodmlldyk7Ci0JCX0KLQkJY2MuYWRkKGdldE1TTFdyYXBwZXIobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChyZXEpKSk7Ci0JCXJldHVybiBjYy51bndyYXAoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlU3RhcnRPdXRnb2luZ0NvbnRyb2xGbG93XzMwMDFDb21tYW5kKAotCQkJQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdCByZXEpIHsKLQkJRU9iamVjdCBzb3VyY2VFT2JqZWN0ID0gcmVxLmdldFNvdXJjZSgpOwotCQlpZiAoZmFsc2UgPT0gc291cmNlRU9iamVjdCBpbnN0YW5jZW9mIEFjdGl2aXR5Tm9kZSkgewotCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCX0KLQkJQWN0aXZpdHlOb2RlIHNvdXJjZSA9IChBY3Rpdml0eU5vZGUpIHNvdXJjZUVPYmplY3Q7Ci0JCVN0cnVjdHVyZWRBY3Rpdml0eU5vZGUgY29udGFpbmVyID0gKFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUpIGdldFJlbGF0aW9uc2hpcENvbnRhaW5lcigKLQkJCQlzb3VyY2UsIFVNTFBhY2thZ2UuZUlOU1RBTkNFLmdldFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUoKSwgcmVxCi0JCQkJCQkuZ2V0RWxlbWVudFR5cGUoKSk7Ci0JCWlmIChjb250YWluZXIgPT0gbnVsbCkgewotCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCX0KLQkJaWYgKCFVTUxCYXNlSXRlbVNlbWFudGljRWRpdFBvbGljeS5MaW5rQ29uc3RyYWludHMKLQkJCQkuY2FuQ3JlYXRlQ29udHJvbEZsb3dfMzAwMShjb250YWluZXIsIHNvdXJjZSwgbnVsbCkpIHsKLQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQl9Ci0JCXJldHVybiBuZXcgQ29tbWFuZCgpIHsKLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlQ29tcGxldGVJbmNvbWluZ0NvbnRyb2xGbG93XzMwMDFDb21tYW5kKAotCQkJQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdCByZXEpIHsKLQkJRU9iamVjdCBzb3VyY2VFT2JqZWN0ID0gcmVxLmdldFNvdXJjZSgpOwotCQlFT2JqZWN0IHRhcmdldEVPYmplY3QgPSByZXEuZ2V0VGFyZ2V0KCk7Ci0JCWlmIChmYWxzZSA9PSBzb3VyY2VFT2JqZWN0IGluc3RhbmNlb2YgQWN0aXZpdHlOb2RlCi0JCQkJfHwgZmFsc2UgPT0gdGFyZ2V0RU9iamVjdCBpbnN0YW5jZW9mIEFjdGl2aXR5Tm9kZSkgewotCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCX0KLQkJQWN0aXZpdHlOb2RlIHNvdXJjZSA9IChBY3Rpdml0eU5vZGUpIHNvdXJjZUVPYmplY3Q7Ci0JCUFjdGl2aXR5Tm9kZSB0YXJnZXQgPSAoQWN0aXZpdHlOb2RlKSB0YXJnZXRFT2JqZWN0OwotCQlTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlIGNvbnRhaW5lciA9IChTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlKSBnZXRSZWxhdGlvbnNoaXBDb250YWluZXIoCi0JCQkJc291cmNlLCBVTUxQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlKCksIHJlcQotCQkJCQkJLmdldEVsZW1lbnRUeXBlKCkpOwotCQlpZiAoY29udGFpbmVyID09IG51bGwpIHsKLQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQl9Ci0JCWlmICghVU1MQmFzZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuTGlua0NvbnN0cmFpbnRzCi0JCQkJLmNhbkNyZWF0ZUNvbnRyb2xGbG93XzMwMDEoY29udGFpbmVyLCBzb3VyY2UsIHRhcmdldCkpIHsKLQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQl9Ci0JCWlmIChyZXEuZ2V0Q29udGFpbm1lbnRGZWF0dXJlKCkgPT0gbnVsbCkgewotCQkJcmVxLnNldENvbnRhaW5tZW50RmVhdHVyZShVTUxQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkuZ2V0U3RydWN0dXJlZEFjdGl2aXR5Tm9kZV9FZGdlKCkpOwotCQl9Ci0JCXJldHVybiBnZXRNU0xXcmFwcGVyKG5ldyBDb250cm9sRmxvd0NyZWF0ZUNvbW1hbmQocmVxLCBjb250YWluZXIsCi0JCQkJc291cmNlLCB0YXJnZXQpKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucG9saWNpZXMuVU1MQmFzZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kjZ2V0Q3JlYXRlSW5jb21pbmdDb21wbGV0ZShvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkNyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3QpCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlSW5jb21pbmdDb21wbGV0ZShDcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0IHJlcSkgewotCQkvLyBhbGxvdyBtYXhpbXVtIG9ubHkgb25lIGluY29taW5nIGNvbm5lY3Rpb24gdG8gZGVjaXNpb24gbm9kZSBmcm9tIG90aGVyIGFjdGl2aXR5IG5vZGUKLQkJLy8KLQkJaWYgKHJlcS5nZXRUYXJnZXQoKSBpbnN0YW5jZW9mIERlY2lzaW9uTm9kZSkgewotCQkJRGVjaXNpb25Ob2RlIGRlY2lzaW9uID0gKERlY2lzaW9uTm9kZSkgcmVxLmdldFRhcmdldCgpOwkJCQotCQkJZm9yIChBY3Rpdml0eUVkZ2UgbGluayA6IGRlY2lzaW9uLmdldEluY29taW5ncygpKSB7Ci0JCQkJaWYobGluay5lQ29udGFpbmVyKCkgIT0gbnVsbCAmJiBsaW5rLmdldFNvdXJjZSgpICE9IG51bGwpIHsKLQkJCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRDcmVhdGVJbmNvbWluZ0NvbXBsZXRlKHJlcSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcG9saWNpZXMvRm9ya05vZGVDYW5vbmljYWxFZGl0UG9saWN5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wb2xpY2llcy9Gb3JrTm9kZUNhbm9uaWNhbEVkaXRQb2xpY3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWVhZjgwNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wb2xpY2llcy9Gb3JrTm9kZUNhbm9uaWNhbEVkaXRQb2xpY3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wb2xpY2llczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkNhbm9uaWNhbEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBGb3JrTm9kZUNhbm9uaWNhbEVkaXRQb2xpY3kgZXh0ZW5kcyBDYW5vbmljYWxFZGl0UG9saWN5IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBnZXRTZW1hbnRpY0NoaWxkcmVuTGlzdCgpIHsKLQkJTGlzdCByZXN1bHQgPSBuZXcgTGlua2VkTGlzdCgpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBzaG91bGREZWxldGVWaWV3KFZpZXcgdmlldykgewotCQlyZXR1cm4gdmlldy5pc1NldEVsZW1lbnQoKSAmJiB2aWV3LmdldEVsZW1lbnQoKSAhPSBudWxsCi0JCQkJJiYgdmlldy5nZXRFbGVtZW50KCkuZUlzUHJveHkoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREZWZhdWx0RmFjdG9yeUhpbnQoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcG9saWNpZXMvRm9ya05vZGVHcmFwaGljYWxOb2RlRWRpdFBvbGljeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcG9saWNpZXMvRm9ya05vZGVHcmFwaGljYWxOb2RlRWRpdFBvbGljeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZTVlMWY4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BvbGljaWVzL0ZvcmtOb2RlR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wb2xpY2llczsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBGb3JrTm9kZUdyYXBoaWNhbE5vZGVFZGl0UG9saWN5IGV4dGVuZHMgVU1MR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kgewotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcG9saWNpZXMvRm9ya05vZGVJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wb2xpY2llcy9Gb3JrTm9kZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmY0ZWI2Zi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wb2xpY2llcy9Gb3JrTm9kZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucG9saWNpZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21wb3VuZENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5jb21tYW5kcy5EZXN0cm95RWxlbWVudENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5DcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuRGVzdHJveUVsZW1lbnRSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuUmVvcmllbnRSZWxhdGlvbnNoaXBSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQuY29tbWFuZHMuQ29udHJvbEZsb3dDcmVhdGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQuY29tbWFuZHMuQ29udHJvbEZsb3dSZW9yaWVudENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5Db250cm9sRmxvd0VkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5wcm92aWRlcnMuVU1MRWxlbWVudFR5cGVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLlVuZXhlY3V0YWJsZUNvbW1hbmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLmNvbW1hbmRzLkNyZWF0ZVJlbGF0aW9uc2hpcENvbW1hbmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuQ29udHJvbEZsb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuRm9ya05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5VTUxQYWNrYWdlOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEZvcmtOb2RlSXRlbVNlbWFudGljRWRpdFBvbGljeSBleHRlbmRzCi0JCVVNTEJhc2VJdGVtU2VtYW50aWNFZGl0UG9saWN5IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXREZXN0cm95RWxlbWVudENvbW1hbmQoRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHJlcSkgewotCQlDb21wb3VuZENvbW1hbmQgY2MgPSBnZXREZXN0cm95RWRnZXNDb21tYW5kKHJlcQotCQkJCS5pc0NvbmZpcm1hdGlvblJlcXVpcmVkKCkpOwotCQlWaWV3IHZpZXcgPSAoVmlldykgZ2V0SG9zdCgpLmdldE1vZGVsKCk7Ci0JCWlmICh2aWV3LmdldEVBbm5vdGF0aW9uKCJTaG9ydGN1dCIpICE9IG51bGwpIHsgLy8kTk9OLU5MUy0xJAotCQkJcmVxLnNldEVsZW1lbnRUb0Rlc3Ryb3kodmlldyk7Ci0JCX0KLQkJY2MuYWRkKGdldE1TTFdyYXBwZXIobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChyZXEpKSk7Ci0JCXJldHVybiBjYy51bndyYXAoKTsKLQl9Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVSZWxhdGlvbnNoaXBDb21tYW5kKENyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3QgcmVxKSB7Ci0vLwkJaWYgKFVNTEVsZW1lbnRUeXBlcy5Db250cm9sRmxvd18zMDAxID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7Ci0vLwkJCXJldHVybiByZXEuZ2V0VGFyZ2V0KCkgPT0gbnVsbCA/IGdldENyZWF0ZVN0YXJ0T3V0Z29pbmdDb250cm9sRmxvd18zMDAxQ29tbWFuZChyZXEpCi0vLwkJCQkJOiBnZXRDcmVhdGVDb21wbGV0ZUluY29taW5nQ29udHJvbEZsb3dfMzAwMUNvbW1hbmQocmVxKTsKLS8vCQl9Ci0JCXJldHVybiBzdXBlci5nZXRDcmVhdGVSZWxhdGlvbnNoaXBDb21tYW5kKHJlcSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZVN0YXJ0T3V0Z29pbmdDb250cm9sRmxvd18zMDAxQ29tbWFuZCgKLQkJCUNyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3QgcmVxKSB7Ci0JCUVPYmplY3Qgc291cmNlRU9iamVjdCA9IHJlcS5nZXRTb3VyY2UoKTsKLQkJaWYgKGZhbHNlID09IHNvdXJjZUVPYmplY3QgaW5zdGFuY2VvZiBBY3Rpdml0eU5vZGUpIHsKLQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQl9Ci0JCUFjdGl2aXR5Tm9kZSBzb3VyY2UgPSAoQWN0aXZpdHlOb2RlKSBzb3VyY2VFT2JqZWN0OwotCQlTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlIGNvbnRhaW5lciA9IChTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlKSBnZXRSZWxhdGlvbnNoaXBDb250YWluZXIoCi0JCQkJc291cmNlLCBVTUxQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlKCksIHJlcQotCQkJCQkJLmdldEVsZW1lbnRUeXBlKCkpOwotCQlpZiAoY29udGFpbmVyID09IG51bGwpIHsKLQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQl9Ci0JCWlmICghVU1MQmFzZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuTGlua0NvbnN0cmFpbnRzCi0JCQkJLmNhbkNyZWF0ZUNvbnRyb2xGbG93XzMwMDEoY29udGFpbmVyLCBzb3VyY2UsIG51bGwpKSB7Ci0JCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJfQotCQlyZXR1cm4gbmV3IENvbW1hbmQoKSB7Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZUNvbXBsZXRlSW5jb21pbmdDb250cm9sRmxvd18zMDAxQ29tbWFuZCgKLQkJCUNyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3QgcmVxKSB7Ci0JCUVPYmplY3Qgc291cmNlRU9iamVjdCA9IHJlcS5nZXRTb3VyY2UoKTsKLQkJRU9iamVjdCB0YXJnZXRFT2JqZWN0ID0gcmVxLmdldFRhcmdldCgpOwotCQlpZiAoZmFsc2UgPT0gc291cmNlRU9iamVjdCBpbnN0YW5jZW9mIEFjdGl2aXR5Tm9kZQotCQkJCXx8IGZhbHNlID09IHRhcmdldEVPYmplY3QgaW5zdGFuY2VvZiBBY3Rpdml0eU5vZGUpIHsKLQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQl9Ci0JCUFjdGl2aXR5Tm9kZSBzb3VyY2UgPSAoQWN0aXZpdHlOb2RlKSBzb3VyY2VFT2JqZWN0OwotCQlBY3Rpdml0eU5vZGUgdGFyZ2V0ID0gKEFjdGl2aXR5Tm9kZSkgdGFyZ2V0RU9iamVjdDsKLQkJU3RydWN0dXJlZEFjdGl2aXR5Tm9kZSBjb250YWluZXIgPSAoU3RydWN0dXJlZEFjdGl2aXR5Tm9kZSkgZ2V0UmVsYXRpb25zaGlwQ29udGFpbmVyKAotCQkJCXNvdXJjZSwgVU1MUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U3RydWN0dXJlZEFjdGl2aXR5Tm9kZSgpLCByZXEKLQkJCQkJCS5nZXRFbGVtZW50VHlwZSgpKTsKLQkJaWYgKGNvbnRhaW5lciA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJfQotCQlpZiAoIVVNTEJhc2VJdGVtU2VtYW50aWNFZGl0UG9saWN5LkxpbmtDb25zdHJhaW50cwotCQkJCS5jYW5DcmVhdGVDb250cm9sRmxvd18zMDAxKGNvbnRhaW5lciwgc291cmNlLCB0YXJnZXQpKSB7Ci0JCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJfQotCQlpZiAocmVxLmdldENvbnRhaW5tZW50RmVhdHVyZSgpID09IG51bGwpIHsKLQkJCXJlcS5zZXRDb250YWlubWVudEZlYXR1cmUoVU1MUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJLmdldFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVfRWRnZSgpKTsKLQkJfQotCQlyZXR1cm4gZ2V0TVNMV3JhcHBlcihuZXcgQ29udHJvbEZsb3dDcmVhdGVDb21tYW5kKHJlcSwgY29udGFpbmVyLAotCQkJCXNvdXJjZSwgdGFyZ2V0KSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBjb21tYW5kIHRvIHJlb3JpZW50IEVDbGFzcyBiYXNlZCBsaW5rLiBOZXcgbGluayB0YXJnZXQgb3Igc291cmNlCi0JICogc2hvdWxkIGJlIHRoZSBkb21haW4gbW9kZWwgZWxlbWVudCBhc3NvY2lhdGVkIHdpdGggdGhpcyBub2RlLgotCSAqIAotCSAqIEBtb2RpZmllZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldFJlb3JpZW50UmVsYXRpb25zaGlwQ29tbWFuZCgKLQkJCVJlb3JpZW50UmVsYXRpb25zaGlwUmVxdWVzdCByZXEpIHsKLS8vCQlzd2l0Y2ggKGdldFZpc3VhbElEKHJlcSkpIHsKLS8vCQljYXNlIENvbnRyb2xGbG93RWRpdFBhcnQuVklTVUFMX0lEOgotLy8JCQlyZXR1cm4gZ2V0TVNMV3JhcHBlcihuZXcgQ29udHJvbEZsb3dSZW9yaWVudENvbW1hbmQocmVxKSk7Ci0vLwkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0UmVvcmllbnRSZWxhdGlvbnNoaXBDb21tYW5kKHJlcSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBvbGljaWVzLlVNTEJhc2VJdGVtU2VtYW50aWNFZGl0UG9saWN5I2dldENyZWF0ZUluY29taW5nQ29tcGxldGUob3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5DcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0KQotCSAqIEBtb2RpZmllZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZUluY29taW5nQ29tcGxldGUoQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdCByZXEpIHsKLQkJaWYgKHJlcS5nZXRUYXJnZXQoKSBpbnN0YW5jZW9mIEZvcmtOb2RlKSB7Ci0JCQlGb3JrTm9kZSBmb3JrID0gKEZvcmtOb2RlKSByZXEuZ2V0VGFyZ2V0KCk7Ci0JCQlMaXN0IGxpc3QgPSBmb3JrLmdldEluY29taW5ncygpOwotCQkJaWYgKGxpc3QgIT0gbnVsbCAmJiBsaXN0LnNpemUoKSA+PSAxKSB7Ci0JCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldENyZWF0ZUluY29taW5nQ29tcGxldGUocmVxKTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wb2xpY2llcy9Jbml0aWFsTm9kZUNhbm9uaWNhbEVkaXRQb2xpY3kuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BvbGljaWVzL0luaXRpYWxOb2RlQ2Fub25pY2FsRWRpdFBvbGljeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOTU2ZGE1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BvbGljaWVzL0luaXRpYWxOb2RlQ2Fub25pY2FsRWRpdFBvbGljeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBvbGljaWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuQ2Fub25pY2FsRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEluaXRpYWxOb2RlQ2Fub25pY2FsRWRpdFBvbGljeSBleHRlbmRzIENhbm9uaWNhbEVkaXRQb2xpY3kgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBMaXN0IGdldFNlbWFudGljQ2hpbGRyZW5MaXN0KCkgewotCQlMaXN0IHJlc3VsdCA9IG5ldyBMaW5rZWRMaXN0KCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHNob3VsZERlbGV0ZVZpZXcoVmlldyB2aWV3KSB7Ci0JCXJldHVybiB2aWV3LmlzU2V0RWxlbWVudCgpICYmIHZpZXcuZ2V0RWxlbWVudCgpICE9IG51bGwKLQkJCQkmJiB2aWV3LmdldEVsZW1lbnQoKS5lSXNQcm94eSgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERlZmF1bHRGYWN0b3J5SGludCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wb2xpY2llcy9Jbml0aWFsTm9kZUdyYXBoaWNhbE5vZGVFZGl0UG9saWN5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wb2xpY2llcy9Jbml0aWFsTm9kZUdyYXBoaWNhbE5vZGVFZGl0UG9saWN5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2MjUzOWIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcG9saWNpZXMvSW5pdGlhbE5vZGVHcmFwaGljYWxOb2RlRWRpdFBvbGljeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBvbGljaWVzOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEluaXRpYWxOb2RlR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kgZXh0ZW5kcwotCQlVTUxHcmFwaGljYWxOb2RlRWRpdFBvbGljeSB7Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wb2xpY2llcy9Jbml0aWFsTm9kZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BvbGljaWVzL0luaXRpYWxOb2RlSXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYmMwMGUwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BvbGljaWVzL0luaXRpYWxOb2RlSXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wb2xpY2llczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21wb3VuZENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5jb21tYW5kcy5EZXN0cm95RWxlbWVudENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5DcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuRGVzdHJveUVsZW1lbnRSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuUmVvcmllbnRSZWxhdGlvbnNoaXBSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQuY29tbWFuZHMuQ29udHJvbEZsb3dDcmVhdGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQuY29tbWFuZHMuQ29udHJvbEZsb3dSZW9yaWVudENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5Db250cm9sRmxvd0VkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5wcm92aWRlcnMuVU1MRWxlbWVudFR5cGVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLlVuZXhlY3V0YWJsZUNvbW1hbmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLmNvbW1hbmRzLkNyZWF0ZVJlbGF0aW9uc2hpcENvbW1hbmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuQ29udHJvbEZsb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuSW5pdGlhbE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5VTUxQYWNrYWdlOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEluaXRpYWxOb2RlSXRlbVNlbWFudGljRWRpdFBvbGljeSBleHRlbmRzCi0JCVVNTEJhc2VJdGVtU2VtYW50aWNFZGl0UG9saWN5IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXREZXN0cm95RWxlbWVudENvbW1hbmQoRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHJlcSkgewotCQlDb21wb3VuZENvbW1hbmQgY2MgPSBnZXREZXN0cm95RWRnZXNDb21tYW5kKHJlcQotCQkJCS5pc0NvbmZpcm1hdGlvblJlcXVpcmVkKCkpOwotCQlWaWV3IHZpZXcgPSAoVmlldykgZ2V0SG9zdCgpLmdldE1vZGVsKCk7Ci0JCWlmICh2aWV3LmdldEVBbm5vdGF0aW9uKCJTaG9ydGN1dCIpICE9IG51bGwpIHsgLy8kTk9OLU5MUy0xJAotCQkJcmVxLnNldEVsZW1lbnRUb0Rlc3Ryb3kodmlldyk7Ci0JCX0KLQkJY2MuYWRkKGdldE1TTFdyYXBwZXIobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChyZXEpKSk7Ci0JCXJldHVybiBjYy51bndyYXAoKTsKLQl9Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVSZWxhdGlvbnNoaXBDb21tYW5kKENyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3QgcmVxKSB7Ci0vLwkJaWYgKFVNTEVsZW1lbnRUeXBlcy5Db250cm9sRmxvd18zMDAxID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7Ci0vLwkJCXJldHVybiByZXEuZ2V0VGFyZ2V0KCkgPT0gbnVsbCA/IGdldENyZWF0ZVN0YXJ0T3V0Z29pbmdDb250cm9sRmxvd18zMDAxQ29tbWFuZChyZXEpCi0vLwkJCQkJOiBnZXRDcmVhdGVDb21wbGV0ZUluY29taW5nQ29udHJvbEZsb3dfMzAwMUNvbW1hbmQocmVxKTsKLS8vCQl9Ci0JCXJldHVybiBzdXBlci5nZXRDcmVhdGVSZWxhdGlvbnNoaXBDb21tYW5kKHJlcSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZVN0YXJ0T3V0Z29pbmdDb250cm9sRmxvd18zMDAxQ29tbWFuZCgKLQkJCUNyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3QgcmVxKSB7Ci0JCUVPYmplY3Qgc291cmNlRU9iamVjdCA9IHJlcS5nZXRTb3VyY2UoKTsKLQkJaWYgKGZhbHNlID09IHNvdXJjZUVPYmplY3QgaW5zdGFuY2VvZiBBY3Rpdml0eU5vZGUpIHsKLQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQl9Ci0JCUFjdGl2aXR5Tm9kZSBzb3VyY2UgPSAoQWN0aXZpdHlOb2RlKSBzb3VyY2VFT2JqZWN0OwotCQlTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlIGNvbnRhaW5lciA9IChTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlKSBnZXRSZWxhdGlvbnNoaXBDb250YWluZXIoCi0JCQkJc291cmNlLCBVTUxQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlKCksIHJlcQotCQkJCQkJLmdldEVsZW1lbnRUeXBlKCkpOwotCQlpZiAoY29udGFpbmVyID09IG51bGwpIHsKLQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQl9Ci0JCWlmICghVU1MQmFzZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuTGlua0NvbnN0cmFpbnRzCi0JCQkJLmNhbkNyZWF0ZUNvbnRyb2xGbG93XzMwMDEoY29udGFpbmVyLCBzb3VyY2UsIG51bGwpKSB7Ci0JCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJfQotCQlyZXR1cm4gbmV3IENvbW1hbmQoKSB7Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZUNvbXBsZXRlSW5jb21pbmdDb250cm9sRmxvd18zMDAxQ29tbWFuZCgKLQkJCUNyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3QgcmVxKSB7Ci0JCUVPYmplY3Qgc291cmNlRU9iamVjdCA9IHJlcS5nZXRTb3VyY2UoKTsKLQkJRU9iamVjdCB0YXJnZXRFT2JqZWN0ID0gcmVxLmdldFRhcmdldCgpOwotCQlpZiAoZmFsc2UgPT0gc291cmNlRU9iamVjdCBpbnN0YW5jZW9mIEFjdGl2aXR5Tm9kZQotCQkJCXx8IGZhbHNlID09IHRhcmdldEVPYmplY3QgaW5zdGFuY2VvZiBBY3Rpdml0eU5vZGUpIHsKLQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQl9Ci0JCUFjdGl2aXR5Tm9kZSBzb3VyY2UgPSAoQWN0aXZpdHlOb2RlKSBzb3VyY2VFT2JqZWN0OwotCQlBY3Rpdml0eU5vZGUgdGFyZ2V0ID0gKEFjdGl2aXR5Tm9kZSkgdGFyZ2V0RU9iamVjdDsKLQkJU3RydWN0dXJlZEFjdGl2aXR5Tm9kZSBjb250YWluZXIgPSAoU3RydWN0dXJlZEFjdGl2aXR5Tm9kZSkgZ2V0UmVsYXRpb25zaGlwQ29udGFpbmVyKAotCQkJCXNvdXJjZSwgVU1MUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U3RydWN0dXJlZEFjdGl2aXR5Tm9kZSgpLCByZXEKLQkJCQkJCS5nZXRFbGVtZW50VHlwZSgpKTsKLQkJaWYgKGNvbnRhaW5lciA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJfQotCQlpZiAoIVVNTEJhc2VJdGVtU2VtYW50aWNFZGl0UG9saWN5LkxpbmtDb25zdHJhaW50cwotCQkJCS5jYW5DcmVhdGVDb250cm9sRmxvd18zMDAxKGNvbnRhaW5lciwgc291cmNlLCB0YXJnZXQpKSB7Ci0JCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJfQotCQlpZiAocmVxLmdldENvbnRhaW5tZW50RmVhdHVyZSgpID09IG51bGwpIHsKLQkJCXJlcS5zZXRDb250YWlubWVudEZlYXR1cmUoVU1MUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJLmdldFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVfRWRnZSgpKTsKLQkJfQotCQlyZXR1cm4gZ2V0TVNMV3JhcHBlcihuZXcgQ29udHJvbEZsb3dDcmVhdGVDb21tYW5kKHJlcSwgY29udGFpbmVyLAotCQkJCXNvdXJjZSwgdGFyZ2V0KSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBjb21tYW5kIHRvIHJlb3JpZW50IEVDbGFzcyBiYXNlZCBsaW5rLiBOZXcgbGluayB0YXJnZXQgb3Igc291cmNlCi0JICogc2hvdWxkIGJlIHRoZSBkb21haW4gbW9kZWwgZWxlbWVudCBhc3NvY2lhdGVkIHdpdGggdGhpcyBub2RlLgotCSAqIAotCSAqIEBtb2RpZmllZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldFJlb3JpZW50UmVsYXRpb25zaGlwQ29tbWFuZCgKLQkJCVJlb3JpZW50UmVsYXRpb25zaGlwUmVxdWVzdCByZXEpIHsKLS8vCQlzd2l0Y2ggKGdldFZpc3VhbElEKHJlcSkpIHsKLS8vCQljYXNlIENvbnRyb2xGbG93RWRpdFBhcnQuVklTVUFMX0lEOgotLy8JCQlyZXR1cm4gZ2V0TVNMV3JhcHBlcihuZXcgQ29udHJvbEZsb3dSZW9yaWVudENvbW1hbmQocmVxKSk7Ci0vLwkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0UmVvcmllbnRSZWxhdGlvbnNoaXBDb21tYW5kKHJlcSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZ21mLmRpYWdyYW0uZWRpdC5wb2xpY2llcy5VTUxCYXNlSXRlbVNlbWFudGljRWRpdFBvbGljeSNnZXRDcmVhdGVJbmNvbWluZ0NvbXBsZXRlKG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdCkKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVJbmNvbWluZ0NvbXBsZXRlKENyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3QgcmVxKSB7Ci0JCWlmIChyZXEuZ2V0VGFyZ2V0KCkgaW5zdGFuY2VvZiBJbml0aWFsTm9kZSkgewotCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldENyZWF0ZUluY29taW5nQ29tcGxldGUocmVxKTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wb2xpY2llcy9Kb2luTm9kZUNhbm9uaWNhbEVkaXRQb2xpY3kuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BvbGljaWVzL0pvaW5Ob2RlQ2Fub25pY2FsRWRpdFBvbGljeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZmI0NjY5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BvbGljaWVzL0pvaW5Ob2RlQ2Fub25pY2FsRWRpdFBvbGljeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBvbGljaWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuQ2Fub25pY2FsRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEpvaW5Ob2RlQ2Fub25pY2FsRWRpdFBvbGljeSBleHRlbmRzIENhbm9uaWNhbEVkaXRQb2xpY3kgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBMaXN0IGdldFNlbWFudGljQ2hpbGRyZW5MaXN0KCkgewotCQlMaXN0IHJlc3VsdCA9IG5ldyBMaW5rZWRMaXN0KCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHNob3VsZERlbGV0ZVZpZXcoVmlldyB2aWV3KSB7Ci0JCXJldHVybiB2aWV3LmlzU2V0RWxlbWVudCgpICYmIHZpZXcuZ2V0RWxlbWVudCgpICE9IG51bGwKLQkJCQkmJiB2aWV3LmdldEVsZW1lbnQoKS5lSXNQcm94eSgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERlZmF1bHRGYWN0b3J5SGludCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wb2xpY2llcy9Kb2luTm9kZUdyYXBoaWNhbE5vZGVFZGl0UG9saWN5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wb2xpY2llcy9Kb2luTm9kZUdyYXBoaWNhbE5vZGVFZGl0UG9saWN5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxOWM2NWEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcG9saWNpZXMvSm9pbk5vZGVHcmFwaGljYWxOb2RlRWRpdFBvbGljeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBvbGljaWVzOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEpvaW5Ob2RlR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kgZXh0ZW5kcyBVTUxHcmFwaGljYWxOb2RlRWRpdFBvbGljeSB7Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wb2xpY2llcy9Kb2luTm9kZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BvbGljaWVzL0pvaW5Ob2RlSXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMjFkMmQxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BvbGljaWVzL0pvaW5Ob2RlSXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wb2xpY2llczsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbXBvdW5kQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLmNvbW1hbmRzLkRlc3Ryb3lFbGVtZW50Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkNyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5EZXN0cm95RWxlbWVudFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5SZW9yaWVudFJlbGF0aW9uc2hpcFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5jb21tYW5kcy5Db250cm9sRmxvd0NyZWF0ZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5jb21tYW5kcy5Db250cm9sRmxvd1Jlb3JpZW50Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLkNvbnRyb2xGbG93RWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnByb3ZpZGVycy5VTUxFbGVtZW50VHlwZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuVW5leGVjdXRhYmxlQ29tbWFuZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuY29tbWFuZHMuQ3JlYXRlUmVsYXRpb25zaGlwQ29tbWFuZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkFjdGl2aXR5Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5Db250cm9sRmxvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5Kb2luTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLlVNTFBhY2thZ2U7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgSm9pbk5vZGVJdGVtU2VtYW50aWNFZGl0UG9saWN5IGV4dGVuZHMKLQkJVU1MQmFzZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldERlc3Ryb3lFbGVtZW50Q29tbWFuZChEZXN0cm95RWxlbWVudFJlcXVlc3QgcmVxKSB7Ci0JCUNvbXBvdW5kQ29tbWFuZCBjYyA9IGdldERlc3Ryb3lFZGdlc0NvbW1hbmQocmVxCi0JCQkJLmlzQ29uZmlybWF0aW9uUmVxdWlyZWQoKSk7Ci0JCVZpZXcgdmlldyA9IChWaWV3KSBnZXRIb3N0KCkuZ2V0TW9kZWwoKTsKLQkJaWYgKHZpZXcuZ2V0RUFubm90YXRpb24oIlNob3J0Y3V0IikgIT0gbnVsbCkgeyAvLyROT04tTkxTLTEkCi0JCQlyZXEuc2V0RWxlbWVudFRvRGVzdHJveSh2aWV3KTsKLQkJfQotCQljYy5hZGQoZ2V0TVNMV3JhcHBlcihuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKHJlcSkpKTsKLQkJcmV0dXJuIGNjLnVud3JhcCgpOwotCX0KLQotCS8qKgotCSAqIEBtb2RpZmllZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZVJlbGF0aW9uc2hpcENvbW1hbmQoQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdCByZXEpIHsKLS8vCQlpZiAoVU1MRWxlbWVudFR5cGVzLkNvbnRyb2xGbG93XzMwMDEgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsKLS8vCQkJcmV0dXJuIHJlcS5nZXRUYXJnZXQoKSA9PSBudWxsID8gZ2V0Q3JlYXRlU3RhcnRPdXRnb2luZ0NvbnRyb2xGbG93XzMwMDFDb21tYW5kKHJlcSkKLS8vCQkJCQk6IGdldENyZWF0ZUNvbXBsZXRlSW5jb21pbmdDb250cm9sRmxvd18zMDAxQ29tbWFuZChyZXEpOwotLy8JCX0KLQkJcmV0dXJuIHN1cGVyLmdldENyZWF0ZVJlbGF0aW9uc2hpcENvbW1hbmQocmVxKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlU3RhcnRPdXRnb2luZ0NvbnRyb2xGbG93XzMwMDFDb21tYW5kKAotCQkJQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdCByZXEpIHsKLQkJRU9iamVjdCBzb3VyY2VFT2JqZWN0ID0gcmVxLmdldFNvdXJjZSgpOwotCQlpZiAoZmFsc2UgPT0gc291cmNlRU9iamVjdCBpbnN0YW5jZW9mIEFjdGl2aXR5Tm9kZSkgewotCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCX0KLQkJQWN0aXZpdHlOb2RlIHNvdXJjZSA9IChBY3Rpdml0eU5vZGUpIHNvdXJjZUVPYmplY3Q7Ci0JCVN0cnVjdHVyZWRBY3Rpdml0eU5vZGUgY29udGFpbmVyID0gKFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUpIGdldFJlbGF0aW9uc2hpcENvbnRhaW5lcigKLQkJCQlzb3VyY2UsIFVNTFBhY2thZ2UuZUlOU1RBTkNFLmdldFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUoKSwgcmVxCi0JCQkJCQkuZ2V0RWxlbWVudFR5cGUoKSk7Ci0JCWlmIChjb250YWluZXIgPT0gbnVsbCkgewotCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCX0KLQkJaWYgKCFVTUxCYXNlSXRlbVNlbWFudGljRWRpdFBvbGljeS5MaW5rQ29uc3RyYWludHMKLQkJCQkuY2FuQ3JlYXRlQ29udHJvbEZsb3dfMzAwMShjb250YWluZXIsIHNvdXJjZSwgbnVsbCkpIHsKLQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQl9Ci0JCXJldHVybiBuZXcgQ29tbWFuZCgpIHsKLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlQ29tcGxldGVJbmNvbWluZ0NvbnRyb2xGbG93XzMwMDFDb21tYW5kKAotCQkJQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdCByZXEpIHsKLQkJRU9iamVjdCBzb3VyY2VFT2JqZWN0ID0gcmVxLmdldFNvdXJjZSgpOwotCQlFT2JqZWN0IHRhcmdldEVPYmplY3QgPSByZXEuZ2V0VGFyZ2V0KCk7Ci0JCWlmIChmYWxzZSA9PSBzb3VyY2VFT2JqZWN0IGluc3RhbmNlb2YgQWN0aXZpdHlOb2RlCi0JCQkJfHwgZmFsc2UgPT0gdGFyZ2V0RU9iamVjdCBpbnN0YW5jZW9mIEFjdGl2aXR5Tm9kZSkgewotCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCX0KLQkJQWN0aXZpdHlOb2RlIHNvdXJjZSA9IChBY3Rpdml0eU5vZGUpIHNvdXJjZUVPYmplY3Q7Ci0JCUFjdGl2aXR5Tm9kZSB0YXJnZXQgPSAoQWN0aXZpdHlOb2RlKSB0YXJnZXRFT2JqZWN0OwotCQlTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlIGNvbnRhaW5lciA9IChTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlKSBnZXRSZWxhdGlvbnNoaXBDb250YWluZXIoCi0JCQkJc291cmNlLCBVTUxQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlKCksIHJlcQotCQkJCQkJLmdldEVsZW1lbnRUeXBlKCkpOwotCQlpZiAoY29udGFpbmVyID09IG51bGwpIHsKLQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQl9Ci0JCWlmICghVU1MQmFzZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuTGlua0NvbnN0cmFpbnRzCi0JCQkJLmNhbkNyZWF0ZUNvbnRyb2xGbG93XzMwMDEoY29udGFpbmVyLCBzb3VyY2UsIHRhcmdldCkpIHsKLQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQl9Ci0JCWlmIChyZXEuZ2V0Q29udGFpbm1lbnRGZWF0dXJlKCkgPT0gbnVsbCkgewotCQkJcmVxLnNldENvbnRhaW5tZW50RmVhdHVyZShVTUxQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkuZ2V0U3RydWN0dXJlZEFjdGl2aXR5Tm9kZV9FZGdlKCkpOwotCQl9Ci0JCXJldHVybiBnZXRNU0xXcmFwcGVyKG5ldyBDb250cm9sRmxvd0NyZWF0ZUNvbW1hbmQocmVxLCBjb250YWluZXIsCi0JCQkJc291cmNlLCB0YXJnZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGNvbW1hbmQgdG8gcmVvcmllbnQgRUNsYXNzIGJhc2VkIGxpbmsuIE5ldyBsaW5rIHRhcmdldCBvciBzb3VyY2UKLQkgKiBzaG91bGQgYmUgdGhlIGRvbWFpbiBtb2RlbCBlbGVtZW50IGFzc29jaWF0ZWQgd2l0aCB0aGlzIG5vZGUuCi0JICogCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0UmVvcmllbnRSZWxhdGlvbnNoaXBDb21tYW5kKAotCQkJUmVvcmllbnRSZWxhdGlvbnNoaXBSZXF1ZXN0IHJlcSkgewotLy8JCXN3aXRjaCAoZ2V0VmlzdWFsSUQocmVxKSkgewotLy8JCWNhc2UgQ29udHJvbEZsb3dFZGl0UGFydC5WSVNVQUxfSUQ6Ci0vLwkJCXJldHVybiBnZXRNU0xXcmFwcGVyKG5ldyBDb250cm9sRmxvd1Jlb3JpZW50Q29tbWFuZChyZXEpKTsKLS8vCQl9Ci0JCXJldHVybiBzdXBlci5nZXRSZW9yaWVudFJlbGF0aW9uc2hpcENvbW1hbmQocmVxKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5nbWYuZGlhZ3JhbS5lZGl0LnBvbGljaWVzLlVNTEJhc2VJdGVtU2VtYW50aWNFZGl0UG9saWN5I2dldENyZWF0ZU91dGdvaW5nKG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdCkKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVPdXRnb2luZyhDcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0IHJlcSkgewotCQkvLyBWYWxpZGF0aW9uIEpvaW4gTm9kZSBzaG91bGQgYWxsb3cgb25seSBvbmUgb3V0Z29pbmcgY29ubmVjdGlvbi4KLQkJaWYgKHJlcS5nZXRTb3VyY2UoKSBpbnN0YW5jZW9mIEpvaW5Ob2RlKSB7Ci0JCQlKb2luTm9kZSBqb2luID0gKEpvaW5Ob2RlKSByZXEuZ2V0U291cmNlKCk7Ci0JCQlMaXN0IGxpc3QgPSBqb2luLmdldE91dGdvaW5ncygpOwotCQkJaWYgKGxpc3QgIT0gbnVsbCAmJiBsaXN0LnNpemUoKSA+PSAxKSB7Ci0JCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldENyZWF0ZU91dGdvaW5nKHJlcSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcG9saWNpZXMvTWVyZ2VOb2RlQ2Fub25pY2FsRWRpdFBvbGljeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcG9saWNpZXMvTWVyZ2VOb2RlQ2Fub25pY2FsRWRpdFBvbGljeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhODY3ZWE0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BvbGljaWVzL01lcmdlTm9kZUNhbm9uaWNhbEVkaXRQb2xpY3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wb2xpY2llczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkNhbm9uaWNhbEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXJnZU5vZGVDYW5vbmljYWxFZGl0UG9saWN5IGV4dGVuZHMgQ2Fub25pY2FsRWRpdFBvbGljeSB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIExpc3QgZ2V0U2VtYW50aWNDaGlsZHJlbkxpc3QoKSB7Ci0JCUxpc3QgcmVzdWx0ID0gbmV3IExpbmtlZExpc3QoKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gc2hvdWxkRGVsZXRlVmlldyhWaWV3IHZpZXcpIHsKLQkJcmV0dXJuIHZpZXcuaXNTZXRFbGVtZW50KCkgJiYgdmlldy5nZXRFbGVtZW50KCkgIT0gbnVsbAotCQkJCSYmIHZpZXcuZ2V0RWxlbWVudCgpLmVJc1Byb3h5KCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGVmYXVsdEZhY3RvcnlIaW50KCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BvbGljaWVzL01lcmdlTm9kZUdyYXBoaWNhbE5vZGVFZGl0UG9saWN5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wb2xpY2llcy9NZXJnZU5vZGVHcmFwaGljYWxOb2RlRWRpdFBvbGljeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNTU5Zjg2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BvbGljaWVzL01lcmdlTm9kZUdyYXBoaWNhbE5vZGVFZGl0UG9saWN5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucG9saWNpZXM7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgTWVyZ2VOb2RlR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kgZXh0ZW5kcwotCQlVTUxHcmFwaGljYWxOb2RlRWRpdFBvbGljeSB7Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wb2xpY2llcy9NZXJnZU5vZGVJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wb2xpY2llcy9NZXJnZU5vZGVJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxODk5YTcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcG9saWNpZXMvTWVyZ2VOb2RlSXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wb2xpY2llczsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbXBvdW5kQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLmNvbW1hbmRzLkRlc3Ryb3lFbGVtZW50Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkNyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5EZXN0cm95RWxlbWVudFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5SZW9yaWVudFJlbGF0aW9uc2hpcFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5jb21tYW5kcy5Db250cm9sRmxvd0NyZWF0ZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5jb21tYW5kcy5Db250cm9sRmxvd1Jlb3JpZW50Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLkNvbnRyb2xGbG93RWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnByb3ZpZGVycy5VTUxFbGVtZW50VHlwZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuVW5leGVjdXRhYmxlQ29tbWFuZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuY29tbWFuZHMuQ3JlYXRlUmVsYXRpb25zaGlwQ29tbWFuZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkFjdGl2aXR5Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5Db250cm9sRmxvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5NZXJnZU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5VTUxQYWNrYWdlOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIE1lcmdlTm9kZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kgZXh0ZW5kcwotCQlVTUxCYXNlSXRlbVNlbWFudGljRWRpdFBvbGljeSB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0RGVzdHJveUVsZW1lbnRDb21tYW5kKERlc3Ryb3lFbGVtZW50UmVxdWVzdCByZXEpIHsKLQkJQ29tcG91bmRDb21tYW5kIGNjID0gZ2V0RGVzdHJveUVkZ2VzQ29tbWFuZChyZXEKLQkJCQkuaXNDb25maXJtYXRpb25SZXF1aXJlZCgpKTsKLQkJVmlldyB2aWV3ID0gKFZpZXcpIGdldEhvc3QoKS5nZXRNb2RlbCgpOwotCQlpZiAodmlldy5nZXRFQW5ub3RhdGlvbigiU2hvcnRjdXQiKSAhPSBudWxsKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXJlcS5zZXRFbGVtZW50VG9EZXN0cm95KHZpZXcpOwotCQl9Ci0JCWNjLmFkZChnZXRNU0xXcmFwcGVyKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQocmVxKSkpOwotCQlyZXR1cm4gY2MudW53cmFwKCk7Ci0JfQotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlUmVsYXRpb25zaGlwQ29tbWFuZChDcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0IHJlcSkgewotLy8JCWlmIChVTUxFbGVtZW50VHlwZXMuQ29udHJvbEZsb3dfMzAwMSA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgewotLy8JCQlyZXR1cm4gcmVxLmdldFRhcmdldCgpID09IG51bGwgPyBnZXRDcmVhdGVTdGFydE91dGdvaW5nQ29udHJvbEZsb3dfMzAwMUNvbW1hbmQocmVxKQotLy8JCQkJCTogZ2V0Q3JlYXRlQ29tcGxldGVJbmNvbWluZ0NvbnRyb2xGbG93XzMwMDFDb21tYW5kKHJlcSk7Ci0vLwkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0Q3JlYXRlUmVsYXRpb25zaGlwQ29tbWFuZChyZXEpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVTdGFydE91dGdvaW5nQ29udHJvbEZsb3dfMzAwMUNvbW1hbmQoCi0JCQlDcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0IHJlcSkgewotCQlFT2JqZWN0IHNvdXJjZUVPYmplY3QgPSByZXEuZ2V0U291cmNlKCk7Ci0JCWlmIChmYWxzZSA9PSBzb3VyY2VFT2JqZWN0IGluc3RhbmNlb2YgQWN0aXZpdHlOb2RlKSB7Ci0JCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJfQotCQlBY3Rpdml0eU5vZGUgc291cmNlID0gKEFjdGl2aXR5Tm9kZSkgc291cmNlRU9iamVjdDsKLQkJU3RydWN0dXJlZEFjdGl2aXR5Tm9kZSBjb250YWluZXIgPSAoU3RydWN0dXJlZEFjdGl2aXR5Tm9kZSkgZ2V0UmVsYXRpb25zaGlwQ29udGFpbmVyKAotCQkJCXNvdXJjZSwgVU1MUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U3RydWN0dXJlZEFjdGl2aXR5Tm9kZSgpLCByZXEKLQkJCQkJCS5nZXRFbGVtZW50VHlwZSgpKTsKLQkJaWYgKGNvbnRhaW5lciA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJfQotCQlpZiAoIVVNTEJhc2VJdGVtU2VtYW50aWNFZGl0UG9saWN5LkxpbmtDb25zdHJhaW50cwotCQkJCS5jYW5DcmVhdGVDb250cm9sRmxvd18zMDAxKGNvbnRhaW5lciwgc291cmNlLCBudWxsKSkgewotCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCX0KLQkJcmV0dXJuIG5ldyBDb21tYW5kKCkgewotCQl9OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVDb21wbGV0ZUluY29taW5nQ29udHJvbEZsb3dfMzAwMUNvbW1hbmQoCi0JCQlDcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0IHJlcSkgewotCQlFT2JqZWN0IHNvdXJjZUVPYmplY3QgPSByZXEuZ2V0U291cmNlKCk7Ci0JCUVPYmplY3QgdGFyZ2V0RU9iamVjdCA9IHJlcS5nZXRUYXJnZXQoKTsKLQkJaWYgKGZhbHNlID09IHNvdXJjZUVPYmplY3QgaW5zdGFuY2VvZiBBY3Rpdml0eU5vZGUKLQkJCQl8fCBmYWxzZSA9PSB0YXJnZXRFT2JqZWN0IGluc3RhbmNlb2YgQWN0aXZpdHlOb2RlKSB7Ci0JCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJfQotCQlBY3Rpdml0eU5vZGUgc291cmNlID0gKEFjdGl2aXR5Tm9kZSkgc291cmNlRU9iamVjdDsKLQkJQWN0aXZpdHlOb2RlIHRhcmdldCA9IChBY3Rpdml0eU5vZGUpIHRhcmdldEVPYmplY3Q7Ci0JCVN0cnVjdHVyZWRBY3Rpdml0eU5vZGUgY29udGFpbmVyID0gKFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUpIGdldFJlbGF0aW9uc2hpcENvbnRhaW5lcigKLQkJCQlzb3VyY2UsIFVNTFBhY2thZ2UuZUlOU1RBTkNFLmdldFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUoKSwgcmVxCi0JCQkJCQkuZ2V0RWxlbWVudFR5cGUoKSk7Ci0JCWlmIChjb250YWluZXIgPT0gbnVsbCkgewotCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCX0KLQkJaWYgKCFVTUxCYXNlSXRlbVNlbWFudGljRWRpdFBvbGljeS5MaW5rQ29uc3RyYWludHMKLQkJCQkuY2FuQ3JlYXRlQ29udHJvbEZsb3dfMzAwMShjb250YWluZXIsIHNvdXJjZSwgdGFyZ2V0KSkgewotCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCX0KLQkJaWYgKHJlcS5nZXRDb250YWlubWVudEZlYXR1cmUoKSA9PSBudWxsKSB7Ci0JCQlyZXEuc2V0Q29udGFpbm1lbnRGZWF0dXJlKFVNTFBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCS5nZXRTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlX0VkZ2UoKSk7Ci0JCX0KLQkJcmV0dXJuIGdldE1TTFdyYXBwZXIobmV3IENvbnRyb2xGbG93Q3JlYXRlQ29tbWFuZChyZXEsIGNvbnRhaW5lciwKLQkJCQlzb3VyY2UsIHRhcmdldCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgY29tbWFuZCB0byByZW9yaWVudCBFQ2xhc3MgYmFzZWQgbGluay4gTmV3IGxpbmsgdGFyZ2V0IG9yIHNvdXJjZQotCSAqIHNob3VsZCBiZSB0aGUgZG9tYWluIG1vZGVsIGVsZW1lbnQgYXNzb2NpYXRlZCB3aXRoIHRoaXMgbm9kZS4KLQkgKiAKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRSZW9yaWVudFJlbGF0aW9uc2hpcENvbW1hbmQoCi0JCQlSZW9yaWVudFJlbGF0aW9uc2hpcFJlcXVlc3QgcmVxKSB7Ci0vLwkJc3dpdGNoIChnZXRWaXN1YWxJRChyZXEpKSB7Ci0vLwkJY2FzZSBDb250cm9sRmxvd0VkaXRQYXJ0LlZJU1VBTF9JRDoKLS8vCQkJcmV0dXJuIGdldE1TTFdyYXBwZXIobmV3IENvbnRyb2xGbG93UmVvcmllbnRDb21tYW5kKHJlcSkpOwotLy8JCX0KLQkJcmV0dXJuIHN1cGVyLmdldFJlb3JpZW50UmVsYXRpb25zaGlwQ29tbWFuZChyZXEpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmdtZi5kaWFncmFtLmVkaXQucG9saWNpZXMuVU1MQmFzZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kjZ2V0Q3JlYXRlT3V0Z29pbmcob3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5DcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0KQotCSAqIEBtb2RpZmllZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZU91dGdvaW5nKENyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3QgcmVxKSB7Ci0KLQkJLy8gVmFsaWRhdGlvbiBtZXJnZSBub2RlIHNob3VsZCBhbGxvdyBvbmx5IG9uZSBvdXRnb2luZyBjb25uZWN0aW9uLgotCQlpZiAocmVxLmdldFNvdXJjZSgpIGluc3RhbmNlb2YgTWVyZ2VOb2RlKSB7Ci0JCQlNZXJnZU5vZGUgam9pbiA9IChNZXJnZU5vZGUpIHJlcS5nZXRTb3VyY2UoKTsKLQkJCUxpc3QgbGlzdCA9IGpvaW4uZ2V0T3V0Z29pbmdzKCk7Ci0JCQlpZiAobGlzdCAhPSBudWxsICYmIGxpc3Quc2l6ZSgpID49IDEpIHsKLQkJCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0Q3JlYXRlT3V0Z29pbmcocmVxKTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wb2xpY2llcy9TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlMkNhbm9uaWNhbEVkaXRQb2xpY3kuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BvbGljaWVzL1N0cnVjdHVyZWRBY3Rpdml0eU5vZGUyQ2Fub25pY2FsRWRpdFBvbGljeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZGIzZjMzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BvbGljaWVzL1N0cnVjdHVyZWRBY3Rpdml0eU5vZGUyQ2Fub25pY2FsRWRpdFBvbGljeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBvbGljaWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuQ2Fub25pY2FsRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUyQ2Fub25pY2FsRWRpdFBvbGljeSBleHRlbmRzCi0JCUNhbm9uaWNhbEVkaXRQb2xpY3kgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBMaXN0IGdldFNlbWFudGljQ2hpbGRyZW5MaXN0KCkgewotCQlMaXN0IHJlc3VsdCA9IG5ldyBMaW5rZWRMaXN0KCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHNob3VsZERlbGV0ZVZpZXcoVmlldyB2aWV3KSB7Ci0JCXJldHVybiB2aWV3LmlzU2V0RWxlbWVudCgpICYmIHZpZXcuZ2V0RWxlbWVudCgpICE9IG51bGwKLQkJCQkmJiB2aWV3LmdldEVsZW1lbnQoKS5lSXNQcm94eSgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERlZmF1bHRGYWN0b3J5SGludCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wb2xpY2llcy9TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlMkdyYXBoaWNhbE5vZGVFZGl0UG9saWN5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wb2xpY2llcy9TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlMkdyYXBoaWNhbE5vZGVFZGl0UG9saWN5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkNTk5ZGUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcG9saWNpZXMvU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTJHcmFwaGljYWxOb2RlRWRpdFBvbGljeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBvbGljaWVzOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUyR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kgZXh0ZW5kcwotCQlVTUxHcmFwaGljYWxOb2RlRWRpdFBvbGljeSB7Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wb2xpY2llcy9TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlMkl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BvbGljaWVzL1N0cnVjdHVyZWRBY3Rpdml0eU5vZGUySXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMzc3ODE5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BvbGljaWVzL1N0cnVjdHVyZWRBY3Rpdml0eU5vZGUySXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wb2xpY2llczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21wb3VuZENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5jb21tYW5kcy5EZXN0cm95RWxlbWVudENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5DcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuRGVzdHJveUVsZW1lbnRSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuUmVvcmllbnRSZWxhdGlvbnNoaXBSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQuY29tbWFuZHMuQ29udHJvbEZsb3dDcmVhdGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQuY29tbWFuZHMuQ29udHJvbEZsb3dSZW9yaWVudENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5Db250cm9sRmxvd0VkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5wcm92aWRlcnMuVU1MRWxlbWVudFR5cGVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLlVuZXhlY3V0YWJsZUNvbW1hbmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLmNvbW1hbmRzLkNyZWF0ZVJlbGF0aW9uc2hpcENvbW1hbmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuQ29udHJvbEZsb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5VTUxQYWNrYWdlOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUySXRlbVNlbWFudGljRWRpdFBvbGljeSBleHRlbmRzCi0JCVVNTEJhc2VJdGVtU2VtYW50aWNFZGl0UG9saWN5IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXREZXN0cm95RWxlbWVudENvbW1hbmQoRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHJlcSkgewotCQlDb21wb3VuZENvbW1hbmQgY2MgPSBnZXREZXN0cm95RWRnZXNDb21tYW5kKHJlcQotCQkJCS5pc0NvbmZpcm1hdGlvblJlcXVpcmVkKCkpOwotCQlWaWV3IHZpZXcgPSAoVmlldykgZ2V0SG9zdCgpLmdldE1vZGVsKCk7Ci0JCWlmICh2aWV3LmdldEVBbm5vdGF0aW9uKCJTaG9ydGN1dCIpICE9IG51bGwpIHsgLy8kTk9OLU5MUy0xJAotCQkJcmVxLnNldEVsZW1lbnRUb0Rlc3Ryb3kodmlldyk7Ci0JCX0KLQkJY2MuYWRkKGdldE1TTFdyYXBwZXIobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChyZXEpKSk7Ci0JCXJldHVybiBjYy51bndyYXAoKTsKLQl9Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVSZWxhdGlvbnNoaXBDb21tYW5kKENyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3QgcmVxKSB7Ci0vLwkJaWYgKFVNTEVsZW1lbnRUeXBlcy5Db250cm9sRmxvd18zMDAxID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7Ci0vLwkJCXJldHVybiByZXEuZ2V0VGFyZ2V0KCkgPT0gbnVsbCA/IGdldENyZWF0ZVN0YXJ0T3V0Z29pbmdDb250cm9sRmxvd18zMDAxQ29tbWFuZChyZXEpCi0vLwkJCQkJOiBnZXRDcmVhdGVDb21wbGV0ZUluY29taW5nQ29udHJvbEZsb3dfMzAwMUNvbW1hbmQocmVxKTsKLS8vCQl9Ci0JCXJldHVybiBzdXBlci5nZXRDcmVhdGVSZWxhdGlvbnNoaXBDb21tYW5kKHJlcSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZVN0YXJ0T3V0Z29pbmdDb250cm9sRmxvd18zMDAxQ29tbWFuZCgKLQkJCUNyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3QgcmVxKSB7Ci0JCUVPYmplY3Qgc291cmNlRU9iamVjdCA9IHJlcS5nZXRTb3VyY2UoKTsKLQkJaWYgKGZhbHNlID09IHNvdXJjZUVPYmplY3QgaW5zdGFuY2VvZiBBY3Rpdml0eU5vZGUpIHsKLQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQl9Ci0JCUFjdGl2aXR5Tm9kZSBzb3VyY2UgPSAoQWN0aXZpdHlOb2RlKSBzb3VyY2VFT2JqZWN0OwotCQlTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlIGNvbnRhaW5lciA9IChTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlKSBnZXRSZWxhdGlvbnNoaXBDb250YWluZXIoCi0JCQkJc291cmNlLCBVTUxQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlKCksIHJlcQotCQkJCQkJLmdldEVsZW1lbnRUeXBlKCkpOwotCQlpZiAoY29udGFpbmVyID09IG51bGwpIHsKLQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQl9Ci0JCWlmICghVU1MQmFzZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuTGlua0NvbnN0cmFpbnRzCi0JCQkJLmNhbkNyZWF0ZUNvbnRyb2xGbG93XzMwMDEoY29udGFpbmVyLCBzb3VyY2UsIG51bGwpKSB7Ci0JCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJfQotCQlyZXR1cm4gbmV3IENvbW1hbmQoKSB7Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZUNvbXBsZXRlSW5jb21pbmdDb250cm9sRmxvd18zMDAxQ29tbWFuZCgKLQkJCUNyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3QgcmVxKSB7Ci0JCUVPYmplY3Qgc291cmNlRU9iamVjdCA9IHJlcS5nZXRTb3VyY2UoKTsKLQkJRU9iamVjdCB0YXJnZXRFT2JqZWN0ID0gcmVxLmdldFRhcmdldCgpOwotCQlpZiAoZmFsc2UgPT0gc291cmNlRU9iamVjdCBpbnN0YW5jZW9mIEFjdGl2aXR5Tm9kZQotCQkJCXx8IGZhbHNlID09IHRhcmdldEVPYmplY3QgaW5zdGFuY2VvZiBBY3Rpdml0eU5vZGUpIHsKLQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQl9Ci0JCUFjdGl2aXR5Tm9kZSBzb3VyY2UgPSAoQWN0aXZpdHlOb2RlKSBzb3VyY2VFT2JqZWN0OwotCQlBY3Rpdml0eU5vZGUgdGFyZ2V0ID0gKEFjdGl2aXR5Tm9kZSkgdGFyZ2V0RU9iamVjdDsKLQkJU3RydWN0dXJlZEFjdGl2aXR5Tm9kZSBjb250YWluZXIgPSAoU3RydWN0dXJlZEFjdGl2aXR5Tm9kZSkgZ2V0UmVsYXRpb25zaGlwQ29udGFpbmVyKAotCQkJCXNvdXJjZSwgVU1MUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U3RydWN0dXJlZEFjdGl2aXR5Tm9kZSgpLCByZXEKLQkJCQkJCS5nZXRFbGVtZW50VHlwZSgpKTsKLQkJaWYgKGNvbnRhaW5lciA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJfQotCQlpZiAoIVVNTEJhc2VJdGVtU2VtYW50aWNFZGl0UG9saWN5LkxpbmtDb25zdHJhaW50cwotCQkJCS5jYW5DcmVhdGVDb250cm9sRmxvd18zMDAxKGNvbnRhaW5lciwgc291cmNlLCB0YXJnZXQpKSB7Ci0JCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJfQotCQlpZiAocmVxLmdldENvbnRhaW5tZW50RmVhdHVyZSgpID09IG51bGwpIHsKLQkJCXJlcS5zZXRDb250YWlubWVudEZlYXR1cmUoVU1MUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJLmdldFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVfRWRnZSgpKTsKLQkJfQotCQlyZXR1cm4gZ2V0TVNMV3JhcHBlcihuZXcgQ29udHJvbEZsb3dDcmVhdGVDb21tYW5kKHJlcSwgY29udGFpbmVyLAotCQkJCXNvdXJjZSwgdGFyZ2V0KSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBjb21tYW5kIHRvIHJlb3JpZW50IEVDbGFzcyBiYXNlZCBsaW5rLiBOZXcgbGluayB0YXJnZXQgb3Igc291cmNlCi0JICogc2hvdWxkIGJlIHRoZSBkb21haW4gbW9kZWwgZWxlbWVudCBhc3NvY2lhdGVkIHdpdGggdGhpcyBub2RlLgotCSAqIAotCSAqIEBtb2RpZmllZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldFJlb3JpZW50UmVsYXRpb25zaGlwQ29tbWFuZCgKLQkJCVJlb3JpZW50UmVsYXRpb25zaGlwUmVxdWVzdCByZXEpIHsKLS8vCQlzd2l0Y2ggKGdldFZpc3VhbElEKHJlcSkpIHsKLS8vCQljYXNlIENvbnRyb2xGbG93RWRpdFBhcnQuVklTVUFMX0lEOgotLy8JCQlyZXR1cm4gZ2V0TVNMV3JhcHBlcihuZXcgQ29udHJvbEZsb3dSZW9yaWVudENvbW1hbmQocmVxKSk7Ci0vLwkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0UmVvcmllbnRSZWxhdGlvbnNoaXBDb21tYW5kKHJlcSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcG9saWNpZXMvU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTNDYW5vbmljYWxFZGl0UG9saWN5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wb2xpY2llcy9TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlM0Nhbm9uaWNhbEVkaXRQb2xpY3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzY4MGQzYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wb2xpY2llcy9TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlM0Nhbm9uaWNhbEVkaXRQb2xpY3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wb2xpY2llczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkNhbm9uaWNhbEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlM0Nhbm9uaWNhbEVkaXRQb2xpY3kgZXh0ZW5kcwotCQlDYW5vbmljYWxFZGl0UG9saWN5IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBnZXRTZW1hbnRpY0NoaWxkcmVuTGlzdCgpIHsKLQkJTGlzdCByZXN1bHQgPSBuZXcgTGlua2VkTGlzdCgpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBzaG91bGREZWxldGVWaWV3KFZpZXcgdmlldykgewotCQlyZXR1cm4gdmlldy5pc1NldEVsZW1lbnQoKSAmJiB2aWV3LmdldEVsZW1lbnQoKSAhPSBudWxsCi0JCQkJJiYgdmlldy5nZXRFbGVtZW50KCkuZUlzUHJveHkoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREZWZhdWx0RmFjdG9yeUhpbnQoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcG9saWNpZXMvU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTNHcmFwaGljYWxOb2RlRWRpdFBvbGljeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcG9saWNpZXMvU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTNHcmFwaGljYWxOb2RlRWRpdFBvbGljeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZTY3ODhhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BvbGljaWVzL1N0cnVjdHVyZWRBY3Rpdml0eU5vZGUzR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wb2xpY2llczsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlM0dyYXBoaWNhbE5vZGVFZGl0UG9saWN5IGV4dGVuZHMKLQkJVU1MR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kgewotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcG9saWNpZXMvU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTNJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wb2xpY2llcy9TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlM0l0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGM3MGU5My4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wb2xpY2llcy9TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlM0l0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzOSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucG9saWNpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tcG91bmRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuY29tbWFuZHMuRGVzdHJveUVsZW1lbnRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkRlc3Ryb3lFbGVtZW50UmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLlJlb3JpZW50UmVsYXRpb25zaGlwUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LmNvbW1hbmRzLkNvbnRyb2xGbG93Q3JlYXRlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LmNvbW1hbmRzLkNvbnRyb2xGbG93UmVvcmllbnRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuQ29udHJvbEZsb3dFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQucHJvdmlkZXJzLlVNTEVsZW1lbnRUeXBlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5VbmV4ZWN1dGFibGVDb21tYW5kOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5jb21tYW5kcy5DcmVhdGVSZWxhdGlvbnNoaXBDb21tYW5kOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuQWN0aXZpdHlOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkNvbnRyb2xGbG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuVU1MUGFja2FnZTsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlM0l0ZW1TZW1hbnRpY0VkaXRQb2xpY3kgZXh0ZW5kcwotCQlVTUxCYXNlSXRlbVNlbWFudGljRWRpdFBvbGljeSB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0RGVzdHJveUVsZW1lbnRDb21tYW5kKERlc3Ryb3lFbGVtZW50UmVxdWVzdCByZXEpIHsKLQkJQ29tcG91bmRDb21tYW5kIGNjID0gZ2V0RGVzdHJveUVkZ2VzQ29tbWFuZChyZXEKLQkJCQkuaXNDb25maXJtYXRpb25SZXF1aXJlZCgpKTsKLQkJVmlldyB2aWV3ID0gKFZpZXcpIGdldEhvc3QoKS5nZXRNb2RlbCgpOwotCQlpZiAodmlldy5nZXRFQW5ub3RhdGlvbigiU2hvcnRjdXQiKSAhPSBudWxsKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXJlcS5zZXRFbGVtZW50VG9EZXN0cm95KHZpZXcpOwotCQl9Ci0JCWNjLmFkZChnZXRNU0xXcmFwcGVyKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQocmVxKSkpOwotCQlyZXR1cm4gY2MudW53cmFwKCk7Ci0JfQotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlUmVsYXRpb25zaGlwQ29tbWFuZChDcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0IHJlcSkgewotLy8JCWlmIChVTUxFbGVtZW50VHlwZXMuQ29udHJvbEZsb3dfMzAwMSA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgewotLy8JCQlyZXR1cm4gcmVxLmdldFRhcmdldCgpID09IG51bGwgPyBnZXRDcmVhdGVTdGFydE91dGdvaW5nQ29udHJvbEZsb3dfMzAwMUNvbW1hbmQocmVxKQotLy8JCQkJCTogZ2V0Q3JlYXRlQ29tcGxldGVJbmNvbWluZ0NvbnRyb2xGbG93XzMwMDFDb21tYW5kKHJlcSk7Ci0vLwkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0Q3JlYXRlUmVsYXRpb25zaGlwQ29tbWFuZChyZXEpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVTdGFydE91dGdvaW5nQ29udHJvbEZsb3dfMzAwMUNvbW1hbmQoCi0JCQlDcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0IHJlcSkgewotCQlFT2JqZWN0IHNvdXJjZUVPYmplY3QgPSByZXEuZ2V0U291cmNlKCk7Ci0JCWlmIChmYWxzZSA9PSBzb3VyY2VFT2JqZWN0IGluc3RhbmNlb2YgQWN0aXZpdHlOb2RlKSB7Ci0JCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJfQotCQlBY3Rpdml0eU5vZGUgc291cmNlID0gKEFjdGl2aXR5Tm9kZSkgc291cmNlRU9iamVjdDsKLQkJU3RydWN0dXJlZEFjdGl2aXR5Tm9kZSBjb250YWluZXIgPSAoU3RydWN0dXJlZEFjdGl2aXR5Tm9kZSkgZ2V0UmVsYXRpb25zaGlwQ29udGFpbmVyKAotCQkJCXNvdXJjZSwgVU1MUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U3RydWN0dXJlZEFjdGl2aXR5Tm9kZSgpLCByZXEKLQkJCQkJCS5nZXRFbGVtZW50VHlwZSgpKTsKLQkJaWYgKGNvbnRhaW5lciA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJfQotCQlpZiAoIVVNTEJhc2VJdGVtU2VtYW50aWNFZGl0UG9saWN5LkxpbmtDb25zdHJhaW50cwotCQkJCS5jYW5DcmVhdGVDb250cm9sRmxvd18zMDAxKGNvbnRhaW5lciwgc291cmNlLCBudWxsKSkgewotCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCX0KLQkJcmV0dXJuIG5ldyBDb21tYW5kKCkgewotCQl9OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVDb21wbGV0ZUluY29taW5nQ29udHJvbEZsb3dfMzAwMUNvbW1hbmQoCi0JCQlDcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0IHJlcSkgewotCQlFT2JqZWN0IHNvdXJjZUVPYmplY3QgPSByZXEuZ2V0U291cmNlKCk7Ci0JCUVPYmplY3QgdGFyZ2V0RU9iamVjdCA9IHJlcS5nZXRUYXJnZXQoKTsKLQkJaWYgKGZhbHNlID09IHNvdXJjZUVPYmplY3QgaW5zdGFuY2VvZiBBY3Rpdml0eU5vZGUKLQkJCQl8fCBmYWxzZSA9PSB0YXJnZXRFT2JqZWN0IGluc3RhbmNlb2YgQWN0aXZpdHlOb2RlKSB7Ci0JCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJfQotCQlBY3Rpdml0eU5vZGUgc291cmNlID0gKEFjdGl2aXR5Tm9kZSkgc291cmNlRU9iamVjdDsKLQkJQWN0aXZpdHlOb2RlIHRhcmdldCA9IChBY3Rpdml0eU5vZGUpIHRhcmdldEVPYmplY3Q7Ci0JCVN0cnVjdHVyZWRBY3Rpdml0eU5vZGUgY29udGFpbmVyID0gKFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUpIGdldFJlbGF0aW9uc2hpcENvbnRhaW5lcigKLQkJCQlzb3VyY2UsIFVNTFBhY2thZ2UuZUlOU1RBTkNFLmdldFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUoKSwgcmVxCi0JCQkJCQkuZ2V0RWxlbWVudFR5cGUoKSk7Ci0JCWlmIChjb250YWluZXIgPT0gbnVsbCkgewotCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCX0KLQkJaWYgKCFVTUxCYXNlSXRlbVNlbWFudGljRWRpdFBvbGljeS5MaW5rQ29uc3RyYWludHMKLQkJCQkuY2FuQ3JlYXRlQ29udHJvbEZsb3dfMzAwMShjb250YWluZXIsIHNvdXJjZSwgdGFyZ2V0KSkgewotCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCX0KLQkJaWYgKHJlcS5nZXRDb250YWlubWVudEZlYXR1cmUoKSA9PSBudWxsKSB7Ci0JCQlyZXEuc2V0Q29udGFpbm1lbnRGZWF0dXJlKFVNTFBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCS5nZXRTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlX0VkZ2UoKSk7Ci0JCX0KLQkJcmV0dXJuIGdldE1TTFdyYXBwZXIobmV3IENvbnRyb2xGbG93Q3JlYXRlQ29tbWFuZChyZXEsIGNvbnRhaW5lciwKLQkJCQlzb3VyY2UsIHRhcmdldCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgY29tbWFuZCB0byByZW9yaWVudCBFQ2xhc3MgYmFzZWQgbGluay4gTmV3IGxpbmsgdGFyZ2V0IG9yIHNvdXJjZQotCSAqIHNob3VsZCBiZSB0aGUgZG9tYWluIG1vZGVsIGVsZW1lbnQgYXNzb2NpYXRlZCB3aXRoIHRoaXMgbm9kZS4KLQkgKiAKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRSZW9yaWVudFJlbGF0aW9uc2hpcENvbW1hbmQoCi0JCQlSZW9yaWVudFJlbGF0aW9uc2hpcFJlcXVlc3QgcmVxKSB7Ci0vLwkJc3dpdGNoIChnZXRWaXN1YWxJRChyZXEpKSB7Ci0vLwkJY2FzZSBDb250cm9sRmxvd0VkaXRQYXJ0LlZJU1VBTF9JRDoKLS8vCQkJcmV0dXJuIGdldE1TTFdyYXBwZXIobmV3IENvbnRyb2xGbG93UmVvcmllbnRDb21tYW5kKHJlcSkpOwotLy8JCX0KLQkJcmV0dXJuIHN1cGVyLmdldFJlb3JpZW50UmVsYXRpb25zaGlwQ29tbWFuZChyZXEpOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BvbGljaWVzL1N0cnVjdHVyZWRBY3Rpdml0eU5vZGVDYW5vbmljYWxFZGl0UG9saWN5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wb2xpY2llcy9TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlQ2Fub25pY2FsRWRpdFBvbGljeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOTAxNzVlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BvbGljaWVzL1N0cnVjdHVyZWRBY3Rpdml0eU5vZGVDYW5vbmljYWxFZGl0UG9saWN5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucG9saWNpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5DYW5vbmljYWxFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZUNhbm9uaWNhbEVkaXRQb2xpY3kgZXh0ZW5kcwotCQlDYW5vbmljYWxFZGl0UG9saWN5IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBnZXRTZW1hbnRpY0NoaWxkcmVuTGlzdCgpIHsKLQkJTGlzdCByZXN1bHQgPSBuZXcgTGlua2VkTGlzdCgpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBzaG91bGREZWxldGVWaWV3KFZpZXcgdmlldykgewotCQlyZXR1cm4gdmlldy5pc1NldEVsZW1lbnQoKSAmJiB2aWV3LmdldEVsZW1lbnQoKSAhPSBudWxsCi0JCQkJJiYgdmlldy5nZXRFbGVtZW50KCkuZUlzUHJveHkoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREZWZhdWx0RmFjdG9yeUhpbnQoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcG9saWNpZXMvU3RydWN0dXJlZEFjdGl2aXR5Tm9kZUdyYXBoaWNhbE5vZGVFZGl0UG9saWN5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wb2xpY2llcy9TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDkzY2IwOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wb2xpY2llcy9TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wb2xpY2llczsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kgZXh0ZW5kcwotCQlVTUxHcmFwaGljYWxOb2RlRWRpdFBvbGljeSB7Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wb2xpY2llcy9TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlSXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcG9saWNpZXMvU3RydWN0dXJlZEFjdGl2aXR5Tm9kZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWNmYjkzOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wb2xpY2llcy9TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlSXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wb2xpY2llczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21wb3VuZENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5jb21tYW5kcy5EZXN0cm95RWxlbWVudENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5DcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuRGVzdHJveUVsZW1lbnRSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuUmVvcmllbnRSZWxhdGlvbnNoaXBSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQuY29tbWFuZHMuQ29udHJvbEZsb3dDcmVhdGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQuY29tbWFuZHMuQ29udHJvbEZsb3dSZW9yaWVudENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5Db250cm9sRmxvd0VkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5wcm92aWRlcnMuVU1MRWxlbWVudFR5cGVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLlVuZXhlY3V0YWJsZUNvbW1hbmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLmNvbW1hbmRzLkNyZWF0ZVJlbGF0aW9uc2hpcENvbW1hbmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuQ29udHJvbEZsb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5VTUxQYWNrYWdlOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVJdGVtU2VtYW50aWNFZGl0UG9saWN5IGV4dGVuZHMKLQkJVU1MQmFzZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldERlc3Ryb3lFbGVtZW50Q29tbWFuZChEZXN0cm95RWxlbWVudFJlcXVlc3QgcmVxKSB7Ci0JCUNvbXBvdW5kQ29tbWFuZCBjYyA9IGdldERlc3Ryb3lFZGdlc0NvbW1hbmQocmVxCi0JCQkJLmlzQ29uZmlybWF0aW9uUmVxdWlyZWQoKSk7Ci0JCVZpZXcgdmlldyA9IChWaWV3KSBnZXRIb3N0KCkuZ2V0TW9kZWwoKTsKLQkJaWYgKHZpZXcuZ2V0RUFubm90YXRpb24oIlNob3J0Y3V0IikgIT0gbnVsbCkgeyAvLyROT04tTkxTLTEkCi0JCQlyZXEuc2V0RWxlbWVudFRvRGVzdHJveSh2aWV3KTsKLQkJfQotCQljYy5hZGQoZ2V0TVNMV3JhcHBlcihuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKHJlcSkpKTsKLQkJcmV0dXJuIGNjLnVud3JhcCgpOwotCX0KLQotCS8qKgotCSAqIEBtb2RpZmllZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZVJlbGF0aW9uc2hpcENvbW1hbmQoQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdCByZXEpIHsKLS8vCQlpZiAoVU1MRWxlbWVudFR5cGVzLkNvbnRyb2xGbG93XzMwMDEgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsKLS8vCQkJcmV0dXJuIHJlcS5nZXRUYXJnZXQoKSA9PSBudWxsID8gZ2V0Q3JlYXRlU3RhcnRPdXRnb2luZ0NvbnRyb2xGbG93XzMwMDFDb21tYW5kKHJlcSkKLS8vCQkJCQk6IGdldENyZWF0ZUNvbXBsZXRlSW5jb21pbmdDb250cm9sRmxvd18zMDAxQ29tbWFuZChyZXEpOwotLy8JCX0KLQkJcmV0dXJuIHN1cGVyLmdldENyZWF0ZVJlbGF0aW9uc2hpcENvbW1hbmQocmVxKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlU3RhcnRPdXRnb2luZ0NvbnRyb2xGbG93XzMwMDFDb21tYW5kKAotCQkJQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdCByZXEpIHsKLQkJRU9iamVjdCBzb3VyY2VFT2JqZWN0ID0gcmVxLmdldFNvdXJjZSgpOwotCQlpZiAoZmFsc2UgPT0gc291cmNlRU9iamVjdCBpbnN0YW5jZW9mIEFjdGl2aXR5Tm9kZSkgewotCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCX0KLQkJQWN0aXZpdHlOb2RlIHNvdXJjZSA9IChBY3Rpdml0eU5vZGUpIHNvdXJjZUVPYmplY3Q7Ci0JCVN0cnVjdHVyZWRBY3Rpdml0eU5vZGUgY29udGFpbmVyID0gKFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUpIGdldFJlbGF0aW9uc2hpcENvbnRhaW5lcigKLQkJCQlzb3VyY2UsIFVNTFBhY2thZ2UuZUlOU1RBTkNFLmdldFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUoKSwgcmVxCi0JCQkJCQkuZ2V0RWxlbWVudFR5cGUoKSk7Ci0JCWlmIChjb250YWluZXIgPT0gbnVsbCkgewotCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCX0KLQkJaWYgKCFVTUxCYXNlSXRlbVNlbWFudGljRWRpdFBvbGljeS5MaW5rQ29uc3RyYWludHMKLQkJCQkuY2FuQ3JlYXRlQ29udHJvbEZsb3dfMzAwMShjb250YWluZXIsIHNvdXJjZSwgbnVsbCkpIHsKLQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQl9Ci0JCXJldHVybiBuZXcgQ29tbWFuZCgpIHsKLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlQ29tcGxldGVJbmNvbWluZ0NvbnRyb2xGbG93XzMwMDFDb21tYW5kKAotCQkJQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdCByZXEpIHsKLQkJRU9iamVjdCBzb3VyY2VFT2JqZWN0ID0gcmVxLmdldFNvdXJjZSgpOwotCQlFT2JqZWN0IHRhcmdldEVPYmplY3QgPSByZXEuZ2V0VGFyZ2V0KCk7Ci0JCWlmIChmYWxzZSA9PSBzb3VyY2VFT2JqZWN0IGluc3RhbmNlb2YgQWN0aXZpdHlOb2RlCi0JCQkJfHwgZmFsc2UgPT0gdGFyZ2V0RU9iamVjdCBpbnN0YW5jZW9mIEFjdGl2aXR5Tm9kZSkgewotCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCX0KLQkJQWN0aXZpdHlOb2RlIHNvdXJjZSA9IChBY3Rpdml0eU5vZGUpIHNvdXJjZUVPYmplY3Q7Ci0JCUFjdGl2aXR5Tm9kZSB0YXJnZXQgPSAoQWN0aXZpdHlOb2RlKSB0YXJnZXRFT2JqZWN0OwotCQlTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlIGNvbnRhaW5lciA9IChTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlKSBnZXRSZWxhdGlvbnNoaXBDb250YWluZXIoCi0JCQkJc291cmNlLCBVTUxQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlKCksIHJlcQotCQkJCQkJLmdldEVsZW1lbnRUeXBlKCkpOwotCQlpZiAoY29udGFpbmVyID09IG51bGwpIHsKLQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQl9Ci0JCWlmICghVU1MQmFzZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuTGlua0NvbnN0cmFpbnRzCi0JCQkJLmNhbkNyZWF0ZUNvbnRyb2xGbG93XzMwMDEoY29udGFpbmVyLCBzb3VyY2UsIHRhcmdldCkpIHsKLQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQl9Ci0JCWlmIChyZXEuZ2V0Q29udGFpbm1lbnRGZWF0dXJlKCkgPT0gbnVsbCkgewotCQkJcmVxLnNldENvbnRhaW5tZW50RmVhdHVyZShVTUxQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkuZ2V0U3RydWN0dXJlZEFjdGl2aXR5Tm9kZV9FZGdlKCkpOwotCQl9Ci0JCXJldHVybiBnZXRNU0xXcmFwcGVyKG5ldyBDb250cm9sRmxvd0NyZWF0ZUNvbW1hbmQocmVxLCBjb250YWluZXIsCi0JCQkJc291cmNlLCB0YXJnZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGNvbW1hbmQgdG8gcmVvcmllbnQgRUNsYXNzIGJhc2VkIGxpbmsuIE5ldyBsaW5rIHRhcmdldCBvciBzb3VyY2UKLQkgKiBzaG91bGQgYmUgdGhlIGRvbWFpbiBtb2RlbCBlbGVtZW50IGFzc29jaWF0ZWQgd2l0aCB0aGlzIG5vZGUuCi0JICogCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0UmVvcmllbnRSZWxhdGlvbnNoaXBDb21tYW5kKAotCQkJUmVvcmllbnRSZWxhdGlvbnNoaXBSZXF1ZXN0IHJlcSkgewotLy8JCXN3aXRjaCAoZ2V0VmlzdWFsSUQocmVxKSkgewotLy8JCWNhc2UgQ29udHJvbEZsb3dFZGl0UGFydC5WSVNVQUxfSUQ6Ci0vLwkJCXJldHVybiBnZXRNU0xXcmFwcGVyKG5ldyBDb250cm9sRmxvd1Jlb3JpZW50Q29tbWFuZChyZXEpKTsKLS8vCQl9Ci0JCXJldHVybiBzdXBlci5nZXRSZW9yaWVudFJlbGF0aW9uc2hpcENvbW1hbmQocmVxKTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wb2xpY2llcy9VTUxCYXNlSXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcG9saWNpZXMvVU1MQmFzZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTVkY2Y0My4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wb2xpY2llcy9VTUxCYXNlSXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wb2xpY2llczsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5UcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5jdXN0b20uY29tbWFuZHMuQ3JlYXRlSW5jb21pbmdDb250cm9sRmxvd0NvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuY3VzdG9tLmNvbW1hbmRzLkNyZWF0ZU91dGdvaW5nQ29udHJvbEZsb3dDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQuY29tbWFuZHMuQ29udHJvbEZsb3dSZW9yaWVudENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5oZWxwZXJzLlVNTEJhc2VFZGl0SGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuQ29udHJvbEZsb3dFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5wYXJ0LlVNTFZpc3VhbElEUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQucHJvdmlkZXJzLlVNTEVsZW1lbnRUeXBlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnV0aWwuRGlhZ3JhbUNvcmVWYWxpZGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tcG91bmRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5VbmV4ZWN1dGFibGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5yZXF1ZXN0cy5SZWNvbm5lY3RSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi5jb3JlLmNvbW1hbmQuSUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLnV0aWwuVmlld1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5Db21tYW5kUHJveHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5JQ29tbWFuZFByb3h5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklHcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5TZW1hbnRpY0VkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXF1ZXN0cy5FZGl0Q29tbWFuZFJlcXVlc3RXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb21tYW5kcy5jb3JlLmNvbW1hbmQuQ29tcG9zaXRlVHJhbnNhY3Rpb25hbENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5FbGVtZW50VHlwZVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuSUVkaXRIZWxwZXJDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuSUVsZW1lbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ29uZmlndXJlUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkNyZWF0ZUVsZW1lbnRSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkRlc3Ryb3lFbGVtZW50UmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkRlc3Ryb3lSZWZlcmVuY2VSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuRGVzdHJveVJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5EdXBsaWNhdGVFbGVtZW50c1JlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5HZXRFZGl0Q29udGV4dFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5JRWRpdENvbW1hbmRSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuTW92ZVJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5SZW9yaWVudFJlZmVyZW5jZVJlbGF0aW9uc2hpcFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5SZW9yaWVudFJlbGF0aW9uc2hpcFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5TZXRSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkVkZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eUVkZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuQWN0aXZpdHlOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkFjdGl2aXR5UGFydGl0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuVU1MUGFja2FnZTsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBVTUxCYXNlSXRlbVNlbWFudGljRWRpdFBvbGljeSBleHRlbmRzIFNlbWFudGljRWRpdFBvbGljeSB7Ci0KLQkvKioKLQkgKiBFeHRlbmRlZCByZXF1ZXN0IGRhdGEga2V5IHRvIGhvbGQgZWRpdHBhcnQgdmlzdWFsIGlkLgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWSVNVQUxfSURfS0VZID0gInZpc3VhbF9pZCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEFkZCB2aXN1YWwgaWQgb2YgZWRpdGVkIGVkaXRwYXJ0IHRvIGV4dGVuZGVkIGRhdGEgb2YgdGhlIHJlcXVlc3Qgc28KLQkgKiBjb21tYW5kIHN3aXRjaCBjYW4gZGVjaWRlIHdoYXQga2luZCBvZiBkaWFncmFtIGVsZW1lbnQgaXMgYmVpbmcgZWRpdGVkLgotCSAqIEl0IGlzIGRvbmUgaW4gdGhvc2UgY2FzZXMgd2hlbiBpdCdzIG5vdCBwb3NzaWJsZSB0byBkZWR1Y2UgZGlhZ3JhbQotCSAqIGVsZW1lbnQga2luZCBmcm9tIGRvbWFpbiBlbGVtZW50LgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ29tbWFuZCBnZXRDb21tYW5kKFJlcXVlc3QgcmVxdWVzdCkgewotCQlpZiAocmVxdWVzdCBpbnN0YW5jZW9mIFJlY29ubmVjdFJlcXVlc3QpIHsKLQkJCU9iamVjdCB2aWV3ID0gKChSZWNvbm5lY3RSZXF1ZXN0KSByZXF1ZXN0KS5nZXRDb25uZWN0aW9uRWRpdFBhcnQoKQotCQkJCQkuZ2V0TW9kZWwoKTsKLQkJCWlmICh2aWV3IGluc3RhbmNlb2YgVmlldykgewotCQkJCUludGVnZXIgaWQgPSBuZXcgSW50ZWdlcihVTUxWaXN1YWxJRFJlZ2lzdHJ5Ci0JCQkJCQkuZ2V0VmlzdWFsSUQoKFZpZXcpIHZpZXcpKTsKLQkJCQlyZXF1ZXN0LmdldEV4dGVuZGVkRGF0YSgpLnB1dChWSVNVQUxfSURfS0VZLCBpZCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldENvbW1hbmQocmVxdWVzdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB2aXN1YWwgaWQgZnJvbSByZXF1ZXN0IHBhcmFtZXRlcnMuCi0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBpbnQgZ2V0VmlzdWFsSUQoSUVkaXRDb21tYW5kUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCU9iamVjdCBpZCA9IHJlcXVlc3QuZ2V0UGFyYW1ldGVyKFZJU1VBTF9JRF9LRVkpOwotCQlyZXR1cm4gaWQgaW5zdGFuY2VvZiBJbnRlZ2VyID8gKChJbnRlZ2VyKSBpZCkuaW50VmFsdWUoKSA6IC0xOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRTZW1hbnRpY0NvbW1hbmQoSUVkaXRDb21tYW5kUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCUlFZGl0Q29tbWFuZFJlcXVlc3QgY29tcGxldGVkUmVxdWVzdCA9IGNvbXBsZXRlUmVxdWVzdChyZXF1ZXN0KTsKLQkJT2JqZWN0IGVkaXRIZWxwZXJDb250ZXh0ID0gY29tcGxldGVkUmVxdWVzdC5nZXRFZGl0SGVscGVyQ29udGV4dCgpOwotCQlpZiAoZWRpdEhlbHBlckNvbnRleHQgaW5zdGFuY2VvZiBWaWV3Ci0JCQkJfHwgKGVkaXRIZWxwZXJDb250ZXh0IGluc3RhbmNlb2YgSUVkaXRIZWxwZXJDb250ZXh0ICYmICgoSUVkaXRIZWxwZXJDb250ZXh0KSBlZGl0SGVscGVyQ29udGV4dCkKLQkJCQkJCS5nZXRFT2JqZWN0KCkgaW5zdGFuY2VvZiBWaWV3KSkgewotCQkJLy8gbm8gc2VtYW50aWMgY29tbWFuZHMgYXJlIHByb3ZpZGVkIGZvciBwdXJlIGRlc2lnbiBlbGVtZW50cwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJaWYgKGVkaXRIZWxwZXJDb250ZXh0ID09IG51bGwpIHsKLQkJCWVkaXRIZWxwZXJDb250ZXh0ID0gVmlld1V0aWwKLQkJCQkJLnJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKFZpZXcpIGdldEhvc3QoKS5nZXRNb2RlbCgpKTsKLQkJfQotCQlJRWxlbWVudFR5cGUgZWxlbWVudFR5cGUgPSBFbGVtZW50VHlwZVJlZ2lzdHJ5LmdldEluc3RhbmNlKCkKLQkJCQkuZ2V0RWxlbWVudFR5cGUoZWRpdEhlbHBlckNvbnRleHQpOwotCQlpZiAoZWxlbWVudFR5cGUgPT0gRWxlbWVudFR5cGVSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldFR5cGUoCi0JCQkJIm9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuZGVmYXVsdCIpKSB7IC8vJE5PTi1OTFMtMSQgCi0JCQllbGVtZW50VHlwZSA9IG51bGw7Ci0JCX0KLQkJQ29tbWFuZCBlcENvbW1hbmQgPSBnZXRTZW1hbnRpY0NvbW1hbmRTd2l0Y2goY29tcGxldGVkUmVxdWVzdCk7Ci0JCWlmIChlcENvbW1hbmQgIT0gbnVsbCkgewotCQkJSUNvbW1hbmQgY29tbWFuZCA9IGVwQ29tbWFuZCBpbnN0YW5jZW9mIElDb21tYW5kUHJveHkgPyAoKElDb21tYW5kUHJveHkpIGVwQ29tbWFuZCkKLQkJCQkJLmdldElDb21tYW5kKCkKLQkJCQkJOiBuZXcgQ29tbWFuZFByb3h5KGVwQ29tbWFuZCk7Ci0JCQljb21wbGV0ZWRSZXF1ZXN0LnNldFBhcmFtZXRlcigKLQkJCQkJVU1MQmFzZUVkaXRIZWxwZXIuRURJVF9QT0xJQ1lfQ09NTUFORCwgY29tbWFuZCk7Ci0JCX0KLQkJQ29tbWFuZCBlaENvbW1hbmQgPSBudWxsOwotCQlpZiAoZWxlbWVudFR5cGUgIT0gbnVsbCkgewotCQkJSUNvbW1hbmQgY29tbWFuZCA9IGVsZW1lbnRUeXBlLmdldEVkaXRDb21tYW5kKGNvbXBsZXRlZFJlcXVlc3QpOwotCQkJaWYgKGNvbW1hbmQgIT0gbnVsbCkgewotCQkJCWlmICghKGNvbW1hbmQgaW5zdGFuY2VvZiBDb21wb3NpdGVUcmFuc2FjdGlvbmFsQ29tbWFuZCkpIHsKLQkJCQkJVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gZWRpdGluZ0RvbWFpbiA9ICgoSUdyYXBoaWNhbEVkaXRQYXJ0KSBnZXRIb3N0KCkpCi0JCQkJCQkJLmdldEVkaXRpbmdEb21haW4oKTsKLQkJCQkJY29tbWFuZCA9IG5ldyBDb21wb3NpdGVUcmFuc2FjdGlvbmFsQ29tbWFuZChlZGl0aW5nRG9tYWluLAotCQkJCQkJCW51bGwpLmNvbXBvc2UoY29tbWFuZCk7Ci0JCQkJfQotCQkJCWVoQ29tbWFuZCA9IG5ldyBJQ29tbWFuZFByb3h5KGNvbW1hbmQpOwotCQkJfQotCQl9Ci0JCWJvb2xlYW4gc2hvdWxkUHJvY2VlZCA9IHRydWU7Ci0JCWlmIChjb21wbGV0ZWRSZXF1ZXN0IGluc3RhbmNlb2YgRGVzdHJveVJlcXVlc3QpIHsKLQkJCXNob3VsZFByb2NlZWQgPSBzaG91bGRQcm9jZWVkKChEZXN0cm95UmVxdWVzdCkgY29tcGxldGVkUmVxdWVzdCk7Ci0JCX0KLQkJaWYgKHNob3VsZFByb2NlZWQpIHsKLQkJCWlmIChjb21wbGV0ZWRSZXF1ZXN0IGluc3RhbmNlb2YgRGVzdHJveVJlcXVlc3QpIHsKLQkJCQlUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiBlZGl0aW5nRG9tYWluID0gKChJR3JhcGhpY2FsRWRpdFBhcnQpIGdldEhvc3QoKSkKLQkJCQkJCS5nZXRFZGl0aW5nRG9tYWluKCk7Ci0JCQkJQ29tbWFuZCBkZWxldGVWaWV3Q29tbWFuZCA9IG5ldyBJQ29tbWFuZFByb3h5KAotCQkJCQkJbmV3IERlbGV0ZUNvbW1hbmQoZWRpdGluZ0RvbWFpbiwgKFZpZXcpIGdldEhvc3QoKQotCQkJCQkJCQkuZ2V0TW9kZWwoKSkpOwotCQkJCWVoQ29tbWFuZCA9IGVoQ29tbWFuZCA9PSBudWxsID8gZGVsZXRlVmlld0NvbW1hbmQgOiBlaENvbW1hbmQKLQkJCQkJCS5jaGFpbihkZWxldGVWaWV3Q29tbWFuZCk7Ci0JCQl9Ci0JCQlyZXR1cm4gZWhDb21tYW5kOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRTZW1hbnRpY0NvbW1hbmRTd2l0Y2goSUVkaXRDb21tYW5kUmVxdWVzdCByZXEpIHsKLQkJaWYgKHJlcSBpbnN0YW5jZW9mIENyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3QpIHsKLQkJCXJldHVybiBnZXRDcmVhdGVSZWxhdGlvbnNoaXBDb21tYW5kKChDcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0KSByZXEpOwotCQl9IGVsc2UgaWYgKHJlcSBpbnN0YW5jZW9mIENyZWF0ZUVsZW1lbnRSZXF1ZXN0KSB7Ci0JCQlyZXR1cm4gZ2V0Q3JlYXRlQ29tbWFuZCgoQ3JlYXRlRWxlbWVudFJlcXVlc3QpIHJlcSk7Ci0JCX0gZWxzZSBpZiAocmVxIGluc3RhbmNlb2YgQ29uZmlndXJlUmVxdWVzdCkgewotCQkJcmV0dXJuIGdldENvbmZpZ3VyZUNvbW1hbmQoKENvbmZpZ3VyZVJlcXVlc3QpIHJlcSk7Ci0JCX0gZWxzZSBpZiAocmVxIGluc3RhbmNlb2YgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KSB7Ci0JCQlyZXR1cm4gZ2V0RGVzdHJveUVsZW1lbnRDb21tYW5kKChEZXN0cm95RWxlbWVudFJlcXVlc3QpIHJlcSk7Ci0JCX0gZWxzZSBpZiAocmVxIGluc3RhbmNlb2YgRGVzdHJveVJlZmVyZW5jZVJlcXVlc3QpIHsKLQkJCXJldHVybiBnZXREZXN0cm95UmVmZXJlbmNlQ29tbWFuZCgoRGVzdHJveVJlZmVyZW5jZVJlcXVlc3QpIHJlcSk7Ci0JCX0gZWxzZSBpZiAocmVxIGluc3RhbmNlb2YgRHVwbGljYXRlRWxlbWVudHNSZXF1ZXN0KSB7Ci0JCQlyZXR1cm4gZ2V0RHVwbGljYXRlQ29tbWFuZCgoRHVwbGljYXRlRWxlbWVudHNSZXF1ZXN0KSByZXEpOwotCQl9IGVsc2UgaWYgKHJlcSBpbnN0YW5jZW9mIEdldEVkaXRDb250ZXh0UmVxdWVzdCkgewotCQkJcmV0dXJuIGdldEVkaXRDb250ZXh0Q29tbWFuZCgoR2V0RWRpdENvbnRleHRSZXF1ZXN0KSByZXEpOwotCQl9IGVsc2UgaWYgKHJlcSBpbnN0YW5jZW9mIE1vdmVSZXF1ZXN0KSB7Ci0JCQlyZXR1cm4gZ2V0TW92ZUNvbW1hbmQoKE1vdmVSZXF1ZXN0KSByZXEpOwotCQl9IGVsc2UgaWYgKHJlcSBpbnN0YW5jZW9mIFJlb3JpZW50UmVmZXJlbmNlUmVsYXRpb25zaGlwUmVxdWVzdCkgewotCQkJcmV0dXJuIGdldFJlb3JpZW50UmVmZXJlbmNlUmVsYXRpb25zaGlwQ29tbWFuZCgoUmVvcmllbnRSZWZlcmVuY2VSZWxhdGlvbnNoaXBSZXF1ZXN0KSByZXEpOwotCQl9IGVsc2UgaWYgKHJlcSBpbnN0YW5jZW9mIFJlb3JpZW50UmVsYXRpb25zaGlwUmVxdWVzdCkgewotCQkJcmV0dXJuIGdldFJlb3JpZW50UmVsYXRpb25zaGlwQ29tbWFuZCgoUmVvcmllbnRSZWxhdGlvbnNoaXBSZXF1ZXN0KSByZXEpOwotCQl9IGVsc2UgaWYgKHJlcSBpbnN0YW5jZW9mIFNldFJlcXVlc3QpIHsKLQkJCXJldHVybiBnZXRTZXRDb21tYW5kKChTZXRSZXF1ZXN0KSByZXEpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDb25maWd1cmVDb21tYW5kKENvbmZpZ3VyZVJlcXVlc3QgcmVxKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBtb2RpZmllZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZVJlbGF0aW9uc2hpcENvbW1hbmQoQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdCByZXEpIHsKLQkJaWYgKFVNTEVsZW1lbnRUeXBlcy5Db250cm9sRmxvd18zMDAxID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7Ci0JCQlyZXR1cm4gcmVxLmdldFRhcmdldCgpID09IG51bGwgPyBnZXRDcmVhdGVPdXRnb2luZyhyZXEpCi0JCQkJCTogZ2V0Q3JlYXRlSW5jb21pbmdDb21wbGV0ZShyZXEpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVDb21tYW5kKENyZWF0ZUVsZW1lbnRSZXF1ZXN0IHJlcSkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0U2V0Q29tbWFuZChTZXRSZXF1ZXN0IHJlcSkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0RWRpdENvbnRleHRDb21tYW5kKEdldEVkaXRDb250ZXh0UmVxdWVzdCByZXEpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldERlc3Ryb3lFbGVtZW50Q29tbWFuZChEZXN0cm95RWxlbWVudFJlcXVlc3QgcmVxKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXREZXN0cm95UmVmZXJlbmNlQ29tbWFuZChEZXN0cm95UmVmZXJlbmNlUmVxdWVzdCByZXEpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldER1cGxpY2F0ZUNvbW1hbmQoRHVwbGljYXRlRWxlbWVudHNSZXF1ZXN0IHJlcSkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0TW92ZUNvbW1hbmQoTW92ZVJlcXVlc3QgcmVxKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRSZW9yaWVudFJlZmVyZW5jZVJlbGF0aW9uc2hpcENvbW1hbmQoCi0JCQlSZW9yaWVudFJlZmVyZW5jZVJlbGF0aW9uc2hpcFJlcXVlc3QgcmVxKSB7Ci0JCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCX0KLQotCS8qCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0UmVvcmllbnRSZWxhdGlvbnNoaXBDb21tYW5kKAotCQkJUmVvcmllbnRSZWxhdGlvbnNoaXBSZXF1ZXN0IHJlcSkgewotCQlzd2l0Y2ggKGdldFZpc3VhbElEKHJlcSkpIHsKLQkJY2FzZSBDb250cm9sRmxvd0VkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCUNvbnRyb2xGbG93UmVvcmllbnRDb21tYW5kIGNtZCA9IG5ldyBDb250cm9sRmxvd1Jlb3JpZW50Q29tbWFuZChyZXEpOwotCQkJY21kLnNldEhvc3QoZ2V0SG9zdCgpKTsKLQkJCXJldHVybiBnZXRNU0xXcmFwcGVyKGNtZCk7Ci0JCX0KLQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldE1TTFdyYXBwZXIoSUNvbW1hbmQgY21kKSB7Ci0JCXJldHVybiBuZXcgSUNvbW1hbmRQcm94eShjbWQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRU9iamVjdCBnZXRTZW1hbnRpY0VsZW1lbnQoKSB7Ci0JCXJldHVybiBWaWV3VXRpbC5yZXNvbHZlU2VtYW50aWNFbGVtZW50KChWaWV3KSBnZXRIb3N0KCkuZ2V0TW9kZWwoKSk7Ci0JfQotCi0JLyoqCi0JICogRmluZHMgY29udGFpbmVyIGVsZW1lbnQgZm9yIHRoZSBuZXcgcmVsYXRpb25zaGlwIG9mIHRoZSBzcGVjaWZpZWQgdHlwZS4KLQkgKiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIGdvZXMgdXAgYnkgY29udGFpbm1lbnQgaGllcmFyY2h5IHN0YXJ0aW5nIGZyb20gdGhlCi0JICogc3BlY2lmaWVkIGVsZW1lbnQgYW5kIHJldHVybnMgdGhlIGZpcnN0IGVsZW1lbnQgdGhhdCBpcyBpbnN0YW5jZSBvZiB0aGUKLQkgKiBzcGVjaWZpZWQgY29udGFpbmVyIGNsYXNzLgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRU9iamVjdCBnZXRSZWxhdGlvbnNoaXBDb250YWluZXIoT2JqZWN0IHVlbGVtZW50LAotCQkJRUNsYXNzIGNvbnRhaW5lckNsYXNzLCBJRWxlbWVudFR5cGUgcmVsYXRpb25zaGlwVHlwZSkgewotCQlpZiAodWVsZW1lbnQgaW5zdGFuY2VvZiBFT2JqZWN0KSB7Ci0JCQlFT2JqZWN0IGVsZW1lbnQgPSAoRU9iamVjdCkgdWVsZW1lbnQ7Ci0JCQlmb3IgKDsgZWxlbWVudCAhPSBudWxsOyBlbGVtZW50ID0gZWxlbWVudC5lQ29udGFpbmVyKCkpIHsKLQkJCQlpZiAoY29udGFpbmVyQ2xhc3MuaXNTdXBlclR5cGVPZihlbGVtZW50LmVDbGFzcygpKSkgewotCQkJCQlyZXR1cm4gZWxlbWVudDsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBlZGl0aW5nIGRvbWFpbiBmcm9tIHRoZSBob3N0IGVkaXQgcGFydC4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIGdldEVkaXRpbmdEb21haW4oKSB7Ci0JCXJldHVybiAoKElHcmFwaGljYWxFZGl0UGFydCkgZ2V0SG9zdCgpKS5nZXRFZGl0aW5nRG9tYWluKCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBjb21tYW5kIHRvIGRlc3Ryb3kgdGhlIGxpbmsuCi0JICogCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0RGVzdHJveUVsZW1lbnRDb21tYW5kKFZpZXcgdmlldywgYm9vbGVhbiBjb25maXJtKSB7Ci0JCUVkaXRQYXJ0IGVkaXRQYXJ0ID0gKEVkaXRQYXJ0KSBnZXRIb3N0KCkuZ2V0Vmlld2VyKCkKLQkJCQkuZ2V0RWRpdFBhcnRSZWdpc3RyeSgpLmdldCh2aWV3KTsKLQotCQkvLyBzb21lIHZpZXdzIGFyZSBzdXBwcmVzc2VkIGFuZCBtaWdodCBub3QgaGF2ZSBhIGVkaXQgcGFydAotCQkvLwotCQlpZihlZGl0UGFydCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQkKLQkJRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHJlcXVlc3QgPSBuZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KAotCQkJCWdldEVkaXRpbmdEb21haW4oKSwgY29uZmlybSk7Ci0JCXJldHVybiBlZGl0UGFydC5nZXRDb21tYW5kKG5ldyBFZGl0Q29tbWFuZFJlcXVlc3RXcmFwcGVyKHJlcXVlc3QsCi0JCQkJQ29sbGVjdGlvbnMuRU1QVFlfTUFQKSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBjb21tYW5kcyB0byBkZXN0cm95IGFsbCBob3N0IGluY29taW5nIGFuZCBvdXRnb2luZyBsaW5rcy4KLQkgKiAKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tcG91bmRDb21tYW5kIGdldERlc3Ryb3lFZGdlc0NvbW1hbmQoYm9vbGVhbiBjb25maXJtKSB7Ci0JCUNvbXBvdW5kQ29tbWFuZCBjbWQgPSBuZXcgQ29tcG91bmRDb21tYW5kKCk7Ci0JCVZpZXcgdmlldyA9IChWaWV3KSBnZXRIb3N0KCkuZ2V0TW9kZWwoKTsKLQkJZm9yIChJdGVyYXRvciBpdCA9IHZpZXcuZ2V0U291cmNlRWRnZXMoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlDb21tYW5kIGRlc3Ryb3lDbWQgPSBnZXREZXN0cm95RWxlbWVudENvbW1hbmQoKEVkZ2UpIGl0Lm5leHQoKSwgY29uZmlybSk7Ci0JCQlpZihkZXN0cm95Q21kICE9IG51bGwpIHsKLQkJCQljbWQuYWRkKGRlc3Ryb3lDbWQpOwotCQkJfQotCQl9Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSB2aWV3LmdldFRhcmdldEVkZ2VzKCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJQ29tbWFuZCBkZXN0cm95Q21kID0gZ2V0RGVzdHJveUVsZW1lbnRDb21tYW5kKChFZGdlKSBpdC5uZXh0KCksIGNvbmZpcm0pOwotCQkJaWYoZGVzdHJveUNtZCAhPSBudWxsKSB7Ci0JCQkJY21kLmFkZChkZXN0cm95Q21kKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gY21kOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNsYXNzIExpbmtDb25zdHJhaW50cyB7Ci0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1BQT1NJVEVfRU5EX1ZBUiA9ICJvcHBvc2l0ZUVuZCI7IC8vJE5PTi1OTFMtMSQKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBib29sZWFuIGNhbkNyZWF0ZUNvbnRyb2xGbG93XzMwMDEoCi0JCQkJU3RydWN0dXJlZEFjdGl2aXR5Tm9kZSBjb250YWluZXIsIEFjdGl2aXR5Tm9kZSBzb3VyY2UsCi0JCQkJQWN0aXZpdHlOb2RlIHRhcmdldCkgewotCQkJcmV0dXJuIGNhbkV4aXN0Q29udHJvbEZsb3dfMzAwMShjb250YWluZXIsIHNvdXJjZSwgdGFyZ2V0KTsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY2FuRXhpc3RDb250cm9sRmxvd18zMDAxKAotCQkJCVN0cnVjdHVyZWRBY3Rpdml0eU5vZGUgY29udGFpbmVyLCBBY3Rpdml0eU5vZGUgc291cmNlLAotCQkJCUFjdGl2aXR5Tm9kZSB0YXJnZXQpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBDaGlsZHJlbiBzaG91bGQgb3ZlcnJpZGUgdGhpcywgZm9yIGFueSBleHRyYSB2YWxpZGF0aW9ucy4KLQkgKiAKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVJbmNvbWluZ0NvbXBsZXRlKENyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3QgcmVxKSB7Ci0JCUNvbW1hbmQgY29tbWFuZDsKLQkJaWYgKHJlcS5nZXRTb3VyY2UoKSA9PSByZXEuZ2V0VGFyZ2V0KCkpIHsKLQkJCXJldHVybiBuZXcgQ29tbWFuZCgpIHsKLQkJCX07Ci0JCX0KLQotCQlpZiAoIShyZXEuZ2V0U291cmNlKCkgaW5zdGFuY2VvZiBBY3Rpdml0eU5vZGUpKSB7Ci0JCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJfQotCQlpZiAocmVxLmdldFRhcmdldCgpIGluc3RhbmNlb2YgQWN0aXZpdHlQYXJ0aXRpb24pIHsKLQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQl9Ci0KLQkJZmluYWwgRU9iamVjdCBlbGVtZW50ID0gKEVPYmplY3QpIHJlcS5nZXRTb3VyY2UoKTsKLQkJaWYgKGVsZW1lbnQgPT0gbnVsbCB8fCAhKGVsZW1lbnQgaW5zdGFuY2VvZiBBY3Rpdml0eU5vZGUpKSB7Ci0JCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJfQotCQlpZiAoaXNEdXBsaWNhdGVSZWxhdGlvbnNoaXAocmVxLmdldFNvdXJjZSgpLCByZXEuZ2V0VGFyZ2V0KCkpKSB7Ci0JCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJfQotCi0JCWlmIChEaWFncmFtQ29yZVZhbGlkYXRpb24uY2FuQ29ubmVjdCgoRWRpdFBhcnQpIGdldEhvc3QoKSwgcmVxCi0JCQkJLmdldFNvdXJjZSgpLCByZXEuZ2V0VGFyZ2V0KCkpICE9IG51bGwpCi0JCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEFjdGl2aXR5Tm9kZSkgewotCQkJaWYgKHJlcS5nZXRDb250YWlubWVudEZlYXR1cmUoKSA9PSBudWxsKSB7Ci0JCQkJcmVxLnNldENvbnRhaW5tZW50RmVhdHVyZShVTUxQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJLmdldEFjdGl2aXR5X0VkZ2UoKSk7Ci0JCQl9Ci0JCQljb21tYW5kID0gZ2V0TVNMV3JhcHBlcihuZXcgQ3JlYXRlSW5jb21pbmdDb250cm9sRmxvd0NvbW1hbmQocmVxLAotCQkJCQllbGVtZW50LmVDb250YWluZXIoKSkpOwotCi0JCQkvLyBpZiAocmVxLmdldFRhcmdldCgpICE9IHJlcS5nZXRTb3VyY2UoKSkgewotCQkJLy8gY29tbWFuZCA9IGNvbW1hbmQuY2hhaW4obmV3IENyZWF0ZVByZWRlY2Vzc29yQ29tbWFuZChyZXEpKTsKLQkJCS8vIH0KLQkJCXJldHVybiBjb21tYW5kOwotCi0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ2hlY2sgaWYgdGhlIGxpbmsgYmV0d2VlbiB0d28gZW5kcyBhbHJlYWR5IGV4aXN0cy4KLQkgKiAKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNEdXBsaWNhdGVSZWxhdGlvbnNoaXAoRU9iamVjdCBzb3VyY2UsIEVPYmplY3QgdGFyZ2V0KSB7Ci0JCUVPYmplY3QgY29udGFpbmVyID0gc291cmNlLmVDb250YWluZXIoKTsKLQkJaWYgKGNvbnRhaW5lciBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQlBY3Rpdml0eSBhY3Rpdml0eSA9IChBY3Rpdml0eSkgY29udGFpbmVyOwotCQkJTGlzdCBsaXN0ID0gYWN0aXZpdHkuZ2V0RWRnZXMoKTsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGxpc3QuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJQWN0aXZpdHlFZGdlIGVsZW1lbnQgPSAoQWN0aXZpdHlFZGdlKSBpdGVyLm5leHQoKTsKLQkJCQlpZiAoKGVsZW1lbnQuZ2V0U291cmNlKCkgPT0gc291cmNlKQotCQkJCQkJJiYgZWxlbWVudC5nZXRUYXJnZXQoKSA9PSB0YXJnZXQpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVPdXRnb2luZyhDcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0IHJlcSkgewotCQlpZiAoIShyZXEuZ2V0U291cmNlKCkgaW5zdGFuY2VvZiBBY3Rpdml0eU5vZGUpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlmaW5hbCBFT2JqZWN0IGVsZW1lbnQgPSAoRU9iamVjdCkgcmVxLmdldFRhcmdldCgpOwotCQlpZiAoZWxlbWVudCA9PSBudWxsIHx8ICEoZWxlbWVudCBpbnN0YW5jZW9mIEFjdGl2aXR5Tm9kZSkpIHsKLQkJCXJldHVybiBuZXcgQ29tbWFuZCgpIHsKLQkJCX07Ci0JCX0KLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBBY3Rpdml0eU5vZGUpIHsKLQkJCS8vIFRPRE86IGNoZWNrIHRoZSBzYW1lIHR5cGUsIGRvbid0IGNyZWF0ZSBjb25uZWN0aW9uLgotCQkJaWYgKHJlcS5nZXRDb250YWlubWVudEZlYXR1cmUoKSA9PSBudWxsKSB7Ci0JCQkJcmVxLnNldENvbnRhaW5tZW50RmVhdHVyZShVTUxQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJLmdldEFjdGl2aXR5X0VkZ2UoKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGdldE1TTFdyYXBwZXIobmV3IENyZWF0ZU91dGdvaW5nQ29udHJvbEZsb3dDb21tYW5kKHJlcSkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcG9saWNpZXMvVU1MRXh0Tm9kZUxhYmVsSG9zdExheW91dEVkaXRQb2xpY3kuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BvbGljaWVzL1VNTEV4dE5vZGVMYWJlbEhvc3RMYXlvdXRFZGl0UG9saWN5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2NTBkMjcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcG9saWNpZXMvVU1MRXh0Tm9kZUxhYmVsSG9zdExheW91dEVkaXRQb2xpY3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzMCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucG9saWNpZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5HcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLkxheW91dEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLkNoYW5nZUJvdW5kc1JlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLkdyb3VwUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUudXRpbC5WaWV3VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5YWUxheW91dEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm90YXRpb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgVU1MRXh0Tm9kZUxhYmVsSG9zdExheW91dEVkaXRQb2xpY3kgZXh0ZW5kcyBYWUxheW91dEVkaXRQb2xpY3kgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgTGF5b3V0RWRpdFBvbGljeSByZWFsTGF5b3V0RWRpdFBvbGljeTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGF5b3V0RWRpdFBvbGljeSBnZXRSZWFsTGF5b3V0RWRpdFBvbGljeSgpIHsKLQkJcmV0dXJuIHJlYWxMYXlvdXRFZGl0UG9saWN5OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZWFsTGF5b3V0RWRpdFBvbGljeShMYXlvdXRFZGl0UG9saWN5IHJlYWxMYXlvdXRFZGl0UG9saWN5KSB7Ci0JCXRoaXMucmVhbExheW91dEVkaXRQb2xpY3kgPSByZWFsTGF5b3V0RWRpdFBvbGljeTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNFeHRlcm5hbExhYmVsKEVkaXRQYXJ0IGVkaXRQYXJ0KSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIExpc3QgZ2V0RXh0ZXJuYWxMYWJlbHMoR3JvdXBSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJTGlzdCBlZGl0UGFydHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWlmIChyZXF1ZXN0LmdldEVkaXRQYXJ0cygpICE9IG51bGwpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSByZXF1ZXN0LmdldEVkaXRQYXJ0cygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlFZGl0UGFydCBlZGl0UGFydCA9IChFZGl0UGFydCkgaXQubmV4dCgpOwotCQkJCWlmIChpc0V4dGVybmFsTGFiZWwoZWRpdFBhcnQpKSB7Ci0JCQkJCWVkaXRQYXJ0cy5hZGQoZWRpdFBhcnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZWRpdFBhcnRzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ29tbWFuZCBnZXRDb21tYW5kKFJlcXVlc3QgcmVxdWVzdCkgewotCQlpZiAoUkVRX01PVkVfQ0hJTERSRU4uZXF1YWxzKHJlcXVlc3QuZ2V0VHlwZSgpKSkgewotCQkJQ2hhbmdlQm91bmRzUmVxdWVzdCBjYlJlcXVlc3QgPSAoQ2hhbmdlQm91bmRzUmVxdWVzdCkgcmVxdWVzdDsKLQkJCUxpc3QgZXh0TGFiZWxzID0gZ2V0RXh0ZXJuYWxMYWJlbHMoY2JSZXF1ZXN0KTsKLQkJCWlmICghZXh0TGFiZWxzLmlzRW1wdHkoKSkgewotCQkJCUxpc3QgZWRpdFBhcnRzID0gY2JSZXF1ZXN0LmdldEVkaXRQYXJ0cygpOwotCQkJCUNvbW1hbmQgY21kID0gbnVsbDsKLQkJCQlpZiAocmVhbExheW91dEVkaXRQb2xpY3kgIT0gbnVsbAotCQkJCQkJJiYgZWRpdFBhcnRzLnNpemUoKSA+IGV4dExhYmVscy5zaXplKCkpIHsKLQkJCQkJTGlzdCBvdGhlciA9IG5ldyBBcnJheUxpc3QoZWRpdFBhcnRzKTsKLQkJCQkJb3RoZXIucmVtb3ZlQWxsKGV4dExhYmVscyk7Ci0JCQkJCWNiUmVxdWVzdC5zZXRFZGl0UGFydHMob3RoZXIpOwotCQkJCQljbWQgPSByZWFsTGF5b3V0RWRpdFBvbGljeS5nZXRDb21tYW5kKHJlcXVlc3QpOwotCQkJCX0KLQkJCQljYlJlcXVlc3Quc2V0RWRpdFBhcnRzKGV4dExhYmVscyk7Ci0JCQkJQ29tbWFuZCBleHRMYWJlbHNDbWQgPSBnZXRNb3ZlQ2hpbGRyZW5Db21tYW5kKHJlcXVlc3QpOwotCQkJCWNiUmVxdWVzdC5zZXRFZGl0UGFydHMoZWRpdFBhcnRzKTsKLQkJCQlyZXR1cm4gY21kID09IG51bGwgPyBleHRMYWJlbHNDbWQgOiBjbWQuY2hhaW4oZXh0TGFiZWxzQ21kKTsKLQkJCX0KLQkJfQotCQlpZiAocmVxdWVzdCBpbnN0YW5jZW9mIEdyb3VwUmVxdWVzdCkgewotCQkJTGlzdCBleHRMYWJlbHMgPSBnZXRFeHRlcm5hbExhYmVscygoR3JvdXBSZXF1ZXN0KSByZXF1ZXN0KTsKLQkJCWlmICghZXh0TGFiZWxzLmlzRW1wdHkoKSkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9Ci0JCXJldHVybiByZWFsTGF5b3V0RWRpdFBvbGljeSA9PSBudWxsID8gbnVsbCA6IHJlYWxMYXlvdXRFZGl0UG9saWN5Ci0JCQkJLmdldENvbW1hbmQocmVxdWVzdCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZ2V0Q29uc3RyYWludEZvcihDaGFuZ2VCb3VuZHNSZXF1ZXN0IHJlcXVlc3QsCi0JCQlHcmFwaGljYWxFZGl0UGFydCBjaGlsZCkgewotCQlpbnQgZHggPSAoKEludGVnZXIpIFZpZXdVdGlsLmdldFN0cnVjdHVyYWxGZWF0dXJlVmFsdWUoKFZpZXcpIGNoaWxkCi0JCQkJLmdldE1vZGVsKCksIE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TG9jYXRpb25fWCgpKSkKLQkJCQkuaW50VmFsdWUoKTsKLQkJaW50IGR5ID0gKChJbnRlZ2VyKSBWaWV3VXRpbC5nZXRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlKChWaWV3KSBjaGlsZAotCQkJCS5nZXRNb2RlbCgpLCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldExvY2F0aW9uX1koKSkpCi0JCQkJLmludFZhbHVlKCk7Ci0JCVJlY3RhbmdsZSByID0gbmV3IFJlY3RhbmdsZShkeCwgZHksIDAsIDApOwotCQljaGlsZC5nZXRGaWd1cmUoKS50cmFuc2xhdGVUb0Fic29sdXRlKHIpOwotCQlyLnRyYW5zbGF0ZShyZXF1ZXN0LmdldE1vdmVEZWx0YSgpKTsKLQkJY2hpbGQuZ2V0RmlndXJlKCkudHJhbnNsYXRlVG9SZWxhdGl2ZShyKTsKLQkJcmV0dXJuIHI7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHVuZGVyc3RhbmRzUmVxdWVzdChSZXF1ZXN0IHJlcSkgewotCQlpZiAocmVhbExheW91dEVkaXRQb2xpY3kgIT0gbnVsbAotCQkJCSYmIHJlYWxMYXlvdXRFZGl0UG9saWN5LnVuZGVyc3RhbmRzUmVxdWVzdChyZXEpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gc3VwZXIudW5kZXJzdGFuZHNSZXF1ZXN0KHJlcSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRlY29yYXRlQ2hpbGQoRWRpdFBhcnQgY2hpbGQpIHsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SG9zdChFZGl0UGFydCBob3N0KSB7Ci0JCXN1cGVyLnNldEhvc3QoaG9zdCk7Ci0JCWlmIChyZWFsTGF5b3V0RWRpdFBvbGljeSAhPSBudWxsKSB7Ci0JCQlyZWFsTGF5b3V0RWRpdFBvbGljeS5zZXRIb3N0KGhvc3QpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGFjdGl2YXRlKCkgewotCQlzdXBlci5hY3RpdmF0ZSgpOwotCQlpZiAocmVhbExheW91dEVkaXRQb2xpY3kgIT0gbnVsbCkgewotCQkJcmVhbExheW91dEVkaXRQb2xpY3kuYWN0aXZhdGUoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBkZWFjdGl2YXRlKCkgewotCQlzdXBlci5kZWFjdGl2YXRlKCk7Ci0JCWlmIChyZWFsTGF5b3V0RWRpdFBvbGljeSAhPSBudWxsKSB7Ci0JCQlyZWFsTGF5b3V0RWRpdFBvbGljeS5kZWFjdGl2YXRlKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVkaXRQYXJ0IGdldFRhcmdldEVkaXRQYXJ0KFJlcXVlc3QgcmVxdWVzdCkgewotCQlpZiAocmVhbExheW91dEVkaXRQb2xpY3kgIT0gbnVsbCkgewotCQkJcmV0dXJuIHJlYWxMYXlvdXRFZGl0UG9saWN5LmdldFRhcmdldEVkaXRQYXJ0KHJlcXVlc3QpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIHN1cGVyLmdldFRhcmdldEVkaXRQYXJ0KHJlcXVlc3QpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNob3dTb3VyY2VGZWVkYmFjayhSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJaWYgKHJlYWxMYXlvdXRFZGl0UG9saWN5ICE9IG51bGwpIHsKLQkJCXJlYWxMYXlvdXRFZGl0UG9saWN5LnNob3dTb3VyY2VGZWVkYmFjayhyZXF1ZXN0KTsKLQkJfSBlbHNlIHsKLQkJCXN1cGVyLnNob3dTb3VyY2VGZWVkYmFjayhyZXF1ZXN0KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlcmFzZVNvdXJjZUZlZWRiYWNrKFJlcXVlc3QgcmVxdWVzdCkgewotCQlpZiAocmVhbExheW91dEVkaXRQb2xpY3kgIT0gbnVsbCkgewotCQkJcmVhbExheW91dEVkaXRQb2xpY3kuZXJhc2VTb3VyY2VGZWVkYmFjayhyZXF1ZXN0KTsKLQkJfSBlbHNlIHsKLQkJCXN1cGVyLmVyYXNlU291cmNlRmVlZGJhY2socmVxdWVzdCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2hvd1RhcmdldEZlZWRiYWNrKFJlcXVlc3QgcmVxdWVzdCkgewotCQlpZiAocmVhbExheW91dEVkaXRQb2xpY3kgIT0gbnVsbCkgewotCQkJcmVhbExheW91dEVkaXRQb2xpY3kuc2hvd1RhcmdldEZlZWRiYWNrKHJlcXVlc3QpOwotCQl9IGVsc2UgewotCQkJc3VwZXIuc2hvd1RhcmdldEZlZWRiYWNrKHJlcXVlc3QpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVyYXNlVGFyZ2V0RmVlZGJhY2soUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCWlmIChyZWFsTGF5b3V0RWRpdFBvbGljeSAhPSBudWxsKSB7Ci0JCQlyZWFsTGF5b3V0RWRpdFBvbGljeS5lcmFzZVRhcmdldEZlZWRiYWNrKHJlcXVlc3QpOwotCQl9IGVsc2UgewotCQkJc3VwZXIuZXJhc2VUYXJnZXRGZWVkYmFjayhyZXF1ZXN0KTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BvbGljaWVzL1VNTEdyYXBoaWNhbE5vZGVFZGl0UG9saWN5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wb2xpY2llcy9VTUxHcmFwaGljYWxOb2RlRWRpdFBvbGljeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZGJkNDkwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BvbGljaWVzL1VNTEdyYXBoaWNhbE5vZGVFZGl0UG9saWN5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucG9saWNpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLkNyZWF0ZUNvbm5lY3Rpb25SZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi5jb3JlLmNvbW1hbmQuQ29tcG9zaXRlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuZWRpdGhlbHBlcnMuQ3JlYXRlRWxlbWVudFJlcXVlc3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuY29tbWFuZHMuSUNvbW1hbmRQcm94eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JR3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXF1ZXN0cy5DcmVhdGVDb25uZWN0aW9uVmlld0FuZEVsZW1lbnRSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuSUVsZW1lbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQuY29tbWFuZHMuVU1MUmVvcmllbnRDb25uZWN0aW9uVmlld0NvbW1hbmQ7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgVU1MR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kgZXh0ZW5kcyBHcmFwaGljYWxOb2RlRWRpdFBvbGljeSB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElFbGVtZW50VHlwZSBnZXRFbGVtZW50VHlwZShDcmVhdGVDb25uZWN0aW9uUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCWlmIChyZXF1ZXN0IGluc3RhbmNlb2YgQ3JlYXRlQ29ubmVjdGlvblZpZXdBbmRFbGVtZW50UmVxdWVzdCkgewotCQkJQ3JlYXRlRWxlbWVudFJlcXVlc3RBZGFwdGVyIHJlcXVlc3RBZGFwdGVyID0gKChDcmVhdGVDb25uZWN0aW9uVmlld0FuZEVsZW1lbnRSZXF1ZXN0KSByZXF1ZXN0KQotCQkJCQkuZ2V0Q29ubmVjdGlvblZpZXdBbmRFbGVtZW50RGVzY3JpcHRvcigpCi0JCQkJCS5nZXRDcmVhdGVFbGVtZW50UmVxdWVzdEFkYXB0ZXIoKTsKLQkJCXJldHVybiAoSUVsZW1lbnRUeXBlKSByZXF1ZXN0QWRhcHRlci5nZXRBZGFwdGVyKElFbGVtZW50VHlwZS5jbGFzcyk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldENvbm5lY3Rpb25XaXRoUmVvcmllbnRlZFZpZXdDb21wbGV0ZUNvbW1hbmQoCi0JCQlDcmVhdGVDb25uZWN0aW9uUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCUlDb21tYW5kUHJveHkgYyA9IChJQ29tbWFuZFByb3h5KSBzdXBlcgotCQkJCS5nZXRDb25uZWN0aW9uQ29tcGxldGVDb21tYW5kKHJlcXVlc3QpOwotCQlDb21wb3NpdGVDb21tYW5kIGNjID0gKENvbXBvc2l0ZUNvbW1hbmQpIGMuZ2V0SUNvbW1hbmQoKTsKLQkJVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gZWRpdGluZ0RvbWFpbiA9ICgoSUdyYXBoaWNhbEVkaXRQYXJ0KSBnZXRIb3N0KCkpCi0JCQkJLmdldEVkaXRpbmdEb21haW4oKTsKLQkJVU1MUmVvcmllbnRDb25uZWN0aW9uVmlld0NvbW1hbmQgcmN2Q29tbWFuZCA9IG5ldyBVTUxSZW9yaWVudENvbm5lY3Rpb25WaWV3Q29tbWFuZCgKLQkJCQllZGl0aW5nRG9tYWluLCBudWxsKTsKLQkJcmN2Q29tbWFuZC5zZXRFZGdlQWRhcHRvcihnZXRWaWV3QWRhcHRlcigpKTsKLQkJY2MuY29tcG9zZShyY3ZDb21tYW5kKTsKLQkJcmV0dXJuIGM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcG9saWNpZXMvVU1MUmVmZXJlbmNlQ29ubmVjdGlvbkVkaXRQb2xpY3kuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BvbGljaWVzL1VNTFJlZmVyZW5jZUNvbm5lY3Rpb25FZGl0UG9saWN5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2MTY5NDkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcG9saWNpZXMvVU1MUmVmZXJlbmNlQ29ubmVjdGlvbkVkaXRQb2xpY3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucG9saWNpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21wb3VuZENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLlVuZXhlY3V0YWJsZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwYXJ0cy5BYnN0cmFjdENvbm5lY3Rpb25FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLkNvbm5lY3Rpb25FZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5yZXF1ZXN0cy5Hcm91cFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5JQ29tbWFuZFByb3h5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLkdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklHcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmwxMG4uRGlhZ3JhbVVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wcmVmZXJlbmNlcy5JUHJlZmVyZW5jZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlcXVlc3RzLkVkaXRDb21tYW5kUmVxdWVzdFdyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXF1ZXN0cy5Hcm91cFJlcXVlc3RWaWFLZXlib2FyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkRlc3Ryb3lFbGVtZW50UmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2dXaXRoVG9nZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLkFzc2VydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFVNTFJlZmVyZW5jZUNvbm5lY3Rpb25FZGl0UG9saWN5IGV4dGVuZHMgQ29ubmVjdGlvbkVkaXRQb2xpY3kgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERUxFVEVfRlJPTV9ESUFHUkFNX0RMR19USVRMRSA9IERpYWdyYW1VSU1lc3NhZ2VzLlByb21wdGluZ0RlbGV0ZUFjdGlvbl9EZWxldGVGcm9tRGlhZ3JhbURpYWxvZ19UaXRsZTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVMRVRFX0ZST01fRElBR1JBTV9ETEdfTUVTU0FHRSA9IERpYWdyYW1VSU1lc3NhZ2VzLlByb21wdGluZ0RlbGV0ZUFjdGlvbl9EZWxldGVGcm9tRGlhZ3JhbURpYWxvZ19NZXNzYWdlOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERUxFVEVfRlJPTV9NT0RFTF9ETEdfVE9HR0xFX0xBQkVMID0gRGlhZ3JhbVVJTWVzc2FnZXMuTWVzc2FnZURpYWxvZ1dpdGhUb2dnbGVfRG9Ob3RQcm9tcHRBZ2FpblRvZ2dsZV9sYWJlbDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgQ29tbWFuZCBnZXREZWxldGVDb21tYW5kKEdyb3VwUmVxdWVzdCBkZWxldGVSZXF1ZXN0KSB7Ci0JCWJvb2xlYW4gaXNEZWxldGVGcm9tS2V5Qm9hcmQgPSBkZWxldGVSZXF1ZXN0IGluc3RhbmNlb2YgR3JvdXBSZXF1ZXN0VmlhS2V5Ym9hcmQ7Ci0JCWlmIChzaG91bGREZWxldGVTZW1hbnRpYygpKSB7Ci0JCQlyZXR1cm4gY3JlYXRlRGVsZXRlU2VtYW50aWNDb21tYW5kKGRlbGV0ZVJlcXVlc3QpOwotCQl9IGVsc2UgewotCQkJYm9vbGVhbiBwcm9jZWVkVG9EZWxldGVWaWV3ID0gdHJ1ZTsKLQkJCWlmIChpc0RlbGV0ZUZyb21LZXlCb2FyZCkgewotCQkJCUdyb3VwUmVxdWVzdFZpYUtleWJvYXJkIGdyb3VwUmVxdWVzdFZpYUtleWJvYXJkID0gKEdyb3VwUmVxdWVzdFZpYUtleWJvYXJkKSBkZWxldGVSZXF1ZXN0OwotCQkJCWlmIChncm91cFJlcXVlc3RWaWFLZXlib2FyZC5pc1Nob3dJbmZvcm1hdGlvbkRpYWxvZygpKSB7Ci0JCQkJCXByb2NlZWRUb0RlbGV0ZVZpZXcgPSBzaG93UHJvbXB0KCk7Ci0JCQkJCWdyb3VwUmVxdWVzdFZpYUtleWJvYXJkLnNldFNob3dJbmZvcm1hdGlvbkRpYWxvZyhmYWxzZSk7Ci0JCQkJCWlmICghKHByb2NlZWRUb0RlbGV0ZVZpZXcpKQotCQkJCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIGNyZWF0ZURlbGV0ZVZpZXdDb21tYW5kKGRlbGV0ZVJlcXVlc3QpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHNob3VsZERlbGV0ZVNlbWFudGljKCkgewotCQlBc3NlcnQuaXNUcnVlKGdldEhvc3QoKSBpbnN0YW5jZW9mIEFic3RyYWN0Q29ubmVjdGlvbkVkaXRQYXJ0KTsKLQkJQWJzdHJhY3RDb25uZWN0aW9uRWRpdFBhcnQgY2VwID0gKEFic3RyYWN0Q29ubmVjdGlvbkVkaXRQYXJ0KSBnZXRIb3N0KCk7Ci0JCWJvb2xlYW4gaXNDYW5vbmljYWwgPSBmYWxzZTsKLQkJaWYgKGNlcC5nZXRTb3VyY2UoKSAhPSBudWxsKQotCQkJaXNDYW5vbmljYWwgPSBJc0Nhbm9uaWNhbChjZXAuZ2V0U291cmNlKCkpOwotCQlpZiAoY2VwLmdldFRhcmdldCgpICE9IG51bGwpCi0JCQlyZXR1cm4gaXNDYW5vbmljYWwgPyBpc0Nhbm9uaWNhbCA6IElzQ2Fub25pY2FsKGNlcC5nZXRUYXJnZXQoKSk7Ci0JCXJldHVybiBpc0Nhbm9uaWNhbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIElzQ2Fub25pY2FsKEVkaXRQYXJ0IGVwKSB7Ci0JCUVkaXRQYXJ0IHBhcmVudCA9IGVwLmdldFBhcmVudCgpOwotCQlyZXR1cm4gcGFyZW50IGluc3RhbmNlb2YgR3JhcGhpY2FsRWRpdFBhcnQgPyAoKEdyYXBoaWNhbEVkaXRQYXJ0KSBwYXJlbnQpCi0JCQkJLmlzQ2Fub25pY2FsKCkKLQkJCQk6IGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBjcmVhdGVEZWxldGVWaWV3Q29tbWFuZChHcm91cFJlcXVlc3QgZGVsZXRlUmVxdWVzdCkgewotCQlUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiBlZGl0aW5nRG9tYWluID0gKChJR3JhcGhpY2FsRWRpdFBhcnQpIGdldEhvc3QoKSkKLQkJCQkuZ2V0RWRpdGluZ0RvbWFpbigpOwotCQlyZXR1cm4gbmV3IElDb21tYW5kUHJveHkobmV3IERlbGV0ZUNvbW1hbmQoZWRpdGluZ0RvbWFpbiwKLQkJCQkoVmlldykgZ2V0SG9zdCgpLmdldE1vZGVsKCkpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgY3JlYXRlRGVsZXRlU2VtYW50aWNDb21tYW5kKEdyb3VwUmVxdWVzdCBkZWxldGVSZXF1ZXN0KSB7Ci0JCVRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIGVkaXRpbmdEb21haW4gPSAoKElHcmFwaGljYWxFZGl0UGFydCkgZ2V0SG9zdCgpKQotCQkJCS5nZXRFZGl0aW5nRG9tYWluKCk7Ci0JCUVkaXRDb21tYW5kUmVxdWVzdFdyYXBwZXIgc2VtUmVxID0gbmV3IEVkaXRDb21tYW5kUmVxdWVzdFdyYXBwZXIoCi0JCQkJbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdChlZGl0aW5nRG9tYWluLCBmYWxzZSksIGRlbGV0ZVJlcXVlc3QKLQkJCQkJCS5nZXRFeHRlbmRlZERhdGEoKSk7Ci0JCUNvbW1hbmQgc2VtYW50aWNDbWQgPSBnZXRIb3N0KCkuZ2V0Q29tbWFuZChzZW1SZXEpOwotCQlpZiAoc2VtYW50aWNDbWQgIT0gbnVsbCAmJiBzZW1hbnRpY0NtZC5jYW5FeGVjdXRlKCkpIHsKLQkJCUNvbXBvdW5kQ29tbWFuZCBjYyA9IG5ldyBDb21wb3VuZENvbW1hbmQoKTsKLQkJCWNjLmFkZChzZW1hbnRpY0NtZCk7Ci0JCQlyZXR1cm4gY2M7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBzaG93UHJvbXB0KCkgewotCQlib29sZWFuIHByb21wdCA9ICgoSVByZWZlcmVuY2VTdG9yZSkgKChJR3JhcGhpY2FsRWRpdFBhcnQpIGdldEhvc3QoKSkKLQkJCQkuZ2V0RGlhZ3JhbVByZWZlcmVuY2VzSGludCgpLmdldFByZWZlcmVuY2VTdG9yZSgpKQotCQkJCS5nZXRCb29sZWFuKElQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfUFJPTVBUX09OX0RFTF9GUk9NX0RJQUdSQU0pOwotCQlpZiAocHJvbXB0KQotCQkJaWYgKHNob3dNZXNzYWdlRGlhbG9nKCkpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQllbHNlCi0JCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIHNob3dNZXNzYWdlRGlhbG9nKCkgewotCQlNZXNzYWdlRGlhbG9nV2l0aFRvZ2dsZSBkaWFsb2cgPSBNZXNzYWdlRGlhbG9nV2l0aFRvZ2dsZQotCQkJCS5vcGVuWWVzTm9RdWVzdGlvbihEaXNwbGF5LmdldEN1cnJlbnQoKS5nZXRBY3RpdmVTaGVsbCgpLAotCQkJCQkJREVMRVRFX0ZST01fRElBR1JBTV9ETEdfVElUTEUsCi0JCQkJCQlERUxFVEVfRlJPTV9ESUFHUkFNX0RMR19NRVNTQUdFLAotCQkJCQkJREVMRVRFX0ZST01fTU9ERUxfRExHX1RPR0dMRV9MQUJFTCwgZmFsc2UsCi0JCQkJCQkoSVByZWZlcmVuY2VTdG9yZSkgKChJR3JhcGhpY2FsRWRpdFBhcnQpIGdldEhvc3QoKSkKLQkJCQkJCQkJLmdldERpYWdyYW1QcmVmZXJlbmNlc0hpbnQoKQotCQkJCQkJCQkuZ2V0UHJlZmVyZW5jZVN0b3JlKCksCi0JCQkJCQlJUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX1BST01QVF9PTl9ERUxfRlJPTV9ESUFHUkFNKTsKLQkJaWYgKGRpYWxvZy5nZXRSZXR1cm5Db2RlKCkgPT0gSURpYWxvZ0NvbnN0YW50cy5ZRVNfSUQpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJZWxzZQotCQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ29tbWFuZCBnZXRDb21tYW5kKFJlcXVlc3QgcmVxdWVzdCkgewotCQlpZiAocmVxdWVzdCBpbnN0YW5jZW9mIEdyb3VwUmVxdWVzdFZpYUtleWJvYXJkKSB7Ci0JCQlyZXR1cm4gZ2V0RGVsZXRlQ29tbWFuZCgoR3JvdXBSZXF1ZXN0KSByZXF1ZXN0KTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0Q29tbWFuZChyZXF1ZXN0KTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wb2xpY2llcy9VTUxUZXh0Tm9uUmVzaXphYmxlRWRpdFBvbGljeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcG9saWNpZXMvVU1MVGV4dE5vblJlc2l6YWJsZUVkaXRQb2xpY3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzZmNjhlNS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wb2xpY2llcy9VTUxUZXh0Tm9uUmVzaXphYmxlRWRpdFBvbGljeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wb2xpY2llczsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Db2xvckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5HcmFwaGljczsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5HcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuTGF5ZXJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmhhbmRsZXMuTW92ZUhhbmRsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5Ob25SZXNpemFibGVFZGl0UG9saWN5RXg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS50b29scy5EcmFnRWRpdFBhcnRzVHJhY2tlckV4OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbDsKLQotCS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgVU1MVGV4dE5vblJlc2l6YWJsZUVkaXRQb2xpY3kgZXh0ZW5kcyBOb25SZXNpemFibGVFZGl0UG9saWN5RXggewotCi0JCi0JCS8qKgotICogQGdlbmVyYXRlZAotICovCi0JcHJpdmF0ZSBJRmlndXJlIHNlbGVjdGlvbkZlZWRiYWNrRmlndXJlOwotCi0JCS8qKgotICogQGdlbmVyYXRlZAotICovCi0JcHJpdmF0ZSBJRmlndXJlIGZvY3VzRmVlZGJhY2tGaWd1cmU7Ci0KLQkJLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLQlwcm90ZWN0ZWQgdm9pZCBzaG93UHJpbWFyeVNlbGVjdGlvbigpIHsKLQkJaWYgKGdldEhvc3RGaWd1cmUoKSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJKChXcmFwTGFiZWwpIGdldEhvc3RGaWd1cmUoKSkuc2V0U2VsZWN0ZWQodHJ1ZSk7Ci0JCQkoKFdyYXBMYWJlbCkgZ2V0SG9zdEZpZ3VyZSgpKS5zZXRGb2N1cyh0cnVlKTsKLQkJfSBlbHNlIHsKLQkJCXNob3dTZWxlY3Rpb24oKTsKLQkJCXNob3dGb2N1cygpOwotCQl9Ci0JfQotCi0JCS8qKgotICogQGdlbmVyYXRlZAotICovCi0JcHJvdGVjdGVkIHZvaWQgc2hvd1NlbGVjdGlvbigpIHsKLQkJaWYgKGdldEhvc3RGaWd1cmUoKSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJKChXcmFwTGFiZWwpIGdldEhvc3RGaWd1cmUoKSkuc2V0U2VsZWN0ZWQodHJ1ZSk7Ci0JCQkoKFdyYXBMYWJlbCkgZ2V0SG9zdEZpZ3VyZSgpKS5zZXRGb2N1cyhmYWxzZSk7Ci0JCX0gZWxzZSB7Ci0JCQloaWRlU2VsZWN0aW9uKCk7Ci0JCQlhZGRGZWVkYmFjayhzZWxlY3Rpb25GZWVkYmFja0ZpZ3VyZSA9IGNyZWF0ZVNlbGVjdGlvbkZlZWRiYWNrRmlndXJlKCkpOwotCQkJcmVmcmVzaFNlbGVjdGlvbkZlZWRiYWNrKCk7Ci0JCQloaWRlRm9jdXMoKTsKLQkJfQotCX0KLQotCQkvKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotCXByb3RlY3RlZCB2b2lkIGhpZGVTZWxlY3Rpb24oKSB7Ci0JCWlmIChnZXRIb3N0RmlndXJlKCkgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCSgoV3JhcExhYmVsKSBnZXRIb3N0RmlndXJlKCkpLnNldFNlbGVjdGVkKGZhbHNlKTsKLQkJCSgoV3JhcExhYmVsKSBnZXRIb3N0RmlndXJlKCkpLnNldEZvY3VzKGZhbHNlKTsKLQkJfSBlbHNlIHsKLQkJCWlmIChzZWxlY3Rpb25GZWVkYmFja0ZpZ3VyZSAhPSBudWxsKSB7Ci0JCQkJcmVtb3ZlRmVlZGJhY2soc2VsZWN0aW9uRmVlZGJhY2tGaWd1cmUpOwotCQkJCXNlbGVjdGlvbkZlZWRiYWNrRmlndXJlID0gbnVsbDsKLQkJCX0KLQkJCWhpZGVGb2N1cygpOwotCQl9Ci0JfQotCi0JCS8qKgotICogQGdlbmVyYXRlZAotICovCi0JcHJvdGVjdGVkIHZvaWQgc2hvd0ZvY3VzKCkgewotCQlpZiAoZ2V0SG9zdEZpZ3VyZSgpIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQkoKFdyYXBMYWJlbCkgZ2V0SG9zdEZpZ3VyZSgpKS5zZXRGb2N1cyh0cnVlKTsKLQkJfSBlbHNlIHsKLQkJCWhpZGVGb2N1cygpOwotCQkJYWRkRmVlZGJhY2soZm9jdXNGZWVkYmFja0ZpZ3VyZSA9IGNyZWF0ZUZvY3VzRmVlZGJhY2tGaWd1cmUoKSk7Ci0JCQlyZWZyZXNoRm9jdXNGZWVkYmFjaygpOwotCQl9Ci0JfQotCi0JCS8qKgotICogQGdlbmVyYXRlZAotICovCi0JcHJvdGVjdGVkIHZvaWQgaGlkZUZvY3VzKCkgewotCQlpZiAoZ2V0SG9zdEZpZ3VyZSgpIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQkoKFdyYXBMYWJlbCkgZ2V0SG9zdEZpZ3VyZSgpKS5zZXRGb2N1cyhmYWxzZSk7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoZm9jdXNGZWVkYmFja0ZpZ3VyZSAhPSBudWxsKSB7Ci0JCQkJcmVtb3ZlRmVlZGJhY2soZm9jdXNGZWVkYmFja0ZpZ3VyZSk7Ci0JCQkJZm9jdXNGZWVkYmFja0ZpZ3VyZSA9IG51bGw7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkJLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLQlwcm90ZWN0ZWQgUmVjdGFuZ2xlIGdldEZlZWRiYWNrQm91bmRzKCkgewotCQlSZWN0YW5nbGUgYm91bmRzOwotCQlpZiAoZ2V0SG9zdEZpZ3VyZSgpIGluc3RhbmNlb2YgTGFiZWwpIHsKLQkJCWJvdW5kcyA9ICgoTGFiZWwpIGdldEhvc3RGaWd1cmUoKSkuZ2V0VGV4dEJvdW5kcygpOwotCQkJYm91bmRzLmludGVyc2VjdChnZXRIb3N0RmlndXJlKCkuZ2V0Qm91bmRzKCkpOwotCQl9IGVsc2UgewotCQkJYm91bmRzID0gZ2V0SG9zdEZpZ3VyZSgpLmdldEJvdW5kcygpLmdldENvcHkoKTsKLQkJfQotCQlnZXRIb3N0RmlndXJlKCkuZ2V0UGFyZW50KCkudHJhbnNsYXRlVG9BYnNvbHV0ZShib3VuZHMpOwotCQlnZXRGZWVkYmFja0xheWVyKCkudHJhbnNsYXRlVG9SZWxhdGl2ZShib3VuZHMpOwotCQlyZXR1cm4gYm91bmRzOwotCX0KLQotCQkvKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotCXByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZVNlbGVjdGlvbkZlZWRiYWNrRmlndXJlKCkgewotCQlpZiAoZ2V0SG9zdEZpZ3VyZSgpIGluc3RhbmNlb2YgTGFiZWwpIHsKLQkJCUxhYmVsIGZlZWRiYWNrRmlndXJlID0gbmV3IExhYmVsKCk7Ci0JCQlmZWVkYmFja0ZpZ3VyZS5zZXRPcGFxdWUodHJ1ZSk7Ci0JCQlmZWVkYmFja0ZpZ3VyZS5zZXRCYWNrZ3JvdW5kQ29sb3IoQ29sb3JDb25zdGFudHMubWVudUJhY2tncm91bmRTZWxlY3RlZCk7Ci0JCQlmZWVkYmFja0ZpZ3VyZS5zZXRGb3JlZ3JvdW5kQ29sb3IoQ29sb3JDb25zdGFudHMubWVudUZvcmVncm91bmRTZWxlY3RlZCk7Ci0JCQlyZXR1cm4gZmVlZGJhY2tGaWd1cmU7Ci0JCX0gZWxzZSB7Ci0JCQlSZWN0YW5nbGVGaWd1cmUgZmVlZGJhY2tGaWd1cmUgPSBuZXcgUmVjdGFuZ2xlRmlndXJlKCk7Ci0JCQlmZWVkYmFja0ZpZ3VyZS5zZXRGaWxsKGZhbHNlKTsKLQkJCXJldHVybiBmZWVkYmFja0ZpZ3VyZTsKLQkJfQotCX0KLQotCQkvKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotCXByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZUZvY3VzRmVlZGJhY2tGaWd1cmUoKSB7Ci0JCXJldHVybiBuZXcgRmlndXJlKCkgewotCi0JCQlwcm90ZWN0ZWQgdm9pZCBwYWludEZpZ3VyZShHcmFwaGljcyBncmFwaGljcykgewotCQkJCWdyYXBoaWNzLmRyYXdGb2N1cyhnZXRCb3VuZHMoKS5nZXRSZXNpemVkKC0xLCAtMSkpOwotCQkJfQotCQl9OwotCX0KLQotCQkvKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZUxhYmVsKExhYmVsIHRhcmdldCkgewotCQlMYWJlbCBzb3VyY2UgPSAoTGFiZWwpIGdldEhvc3RGaWd1cmUoKTsKLQkJdGFyZ2V0LnNldFRleHQoc291cmNlLmdldFRleHQoKSk7Ci0JCXRhcmdldC5zZXRUZXh0QWxpZ25tZW50KHNvdXJjZS5nZXRUZXh0QWxpZ25tZW50KCkpOwotCQl0YXJnZXQuc2V0Rm9udChzb3VyY2UuZ2V0Rm9udCgpKTsKLQl9Ci0KLQkJLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoU2VsZWN0aW9uRmVlZGJhY2soKSB7Ci0JCWlmIChzZWxlY3Rpb25GZWVkYmFja0ZpZ3VyZSAhPSBudWxsKSB7Ci0JCQlpZiAoc2VsZWN0aW9uRmVlZGJhY2tGaWd1cmUgaW5zdGFuY2VvZiBMYWJlbCkgewotCQkJCXVwZGF0ZUxhYmVsKChMYWJlbCkgc2VsZWN0aW9uRmVlZGJhY2tGaWd1cmUpOwotCQkJCXNlbGVjdGlvbkZlZWRiYWNrRmlndXJlLnNldEJvdW5kcyhnZXRGZWVkYmFja0JvdW5kcygpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJc2VsZWN0aW9uRmVlZGJhY2tGaWd1cmUuc2V0Qm91bmRzKGdldEZlZWRiYWNrQm91bmRzKCkuZXhwYW5kKDUsIDUpKTsKLQkJCX0KLQkJfQotCX0KLQotCQkvKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hGb2N1c0ZlZWRiYWNrKCkgewotCQlpZiAoZm9jdXNGZWVkYmFja0ZpZ3VyZSAhPSBudWxsKSB7Ci0JCQlmb2N1c0ZlZWRiYWNrRmlndXJlLnNldEJvdW5kcyhnZXRGZWVkYmFja0JvdW5kcygpKTsKLQkJfQotCX0KLQotCQkvKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotCXB1YmxpYyB2b2lkIHJlZnJlc2hGZWVkYmFjaygpIHsKLQkJcmVmcmVzaFNlbGVjdGlvbkZlZWRiYWNrKCk7Ci0JCXJlZnJlc2hGb2N1c0ZlZWRiYWNrKCk7Ci0JfQotCi0JCS8qKgotICogQGdlbmVyYXRlZAotICovCi0JcHJvdGVjdGVkIExpc3QgY3JlYXRlU2VsZWN0aW9uSGFuZGxlcygpIHsKLQkJTW92ZUhhbmRsZSBtb3ZlSGFuZGxlID0KLQkJCW5ldyBNb3ZlSGFuZGxlKChHcmFwaGljYWxFZGl0UGFydCkgZ2V0SG9zdCgpKTsKLQkJbW92ZUhhbmRsZS5zZXRCb3JkZXIobnVsbCk7Ci0JCW1vdmVIYW5kbGUuc2V0RHJhZ1RyYWNrZXIobmV3IERyYWdFZGl0UGFydHNUcmFja2VyRXgoZ2V0SG9zdCgpKSk7Ci0JCXJldHVybiBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KG1vdmVIYW5kbGUpOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BvbGljaWVzL1VNTFRleHRTZWxlY3Rpb25FZGl0UG9saWN5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wb2xpY2llcy9VTUxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OTRiZWZiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BvbGljaWVzL1VNTFRleHRTZWxlY3Rpb25FZGl0UG9saWN5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBvbGljaWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkNvbG9yQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5GaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkdyYXBoaWNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkxheWVyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuU2VsZWN0aW9uRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWw7Ci0KLQkvKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFVNTFRleHRTZWxlY3Rpb25FZGl0UG9saWN5IGV4dGVuZHMgU2VsZWN0aW9uRWRpdFBvbGljeSB7Ci0KLQkKLQkJLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLQlwcml2YXRlIElGaWd1cmUgc2VsZWN0aW9uRmVlZGJhY2tGaWd1cmU7Ci0KLQkJLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLQlwcml2YXRlIElGaWd1cmUgZm9jdXNGZWVkYmFja0ZpZ3VyZTsKLQotCQkvKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotCXByb3RlY3RlZCB2b2lkIHNob3dQcmltYXJ5U2VsZWN0aW9uKCkgewotCQlpZiAoZ2V0SG9zdEZpZ3VyZSgpIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQkoKFdyYXBMYWJlbCkgZ2V0SG9zdEZpZ3VyZSgpKS5zZXRTZWxlY3RlZCh0cnVlKTsKLQkJCSgoV3JhcExhYmVsKSBnZXRIb3N0RmlndXJlKCkpLnNldEZvY3VzKHRydWUpOwotCQl9IGVsc2UgewotCQkJc2hvd1NlbGVjdGlvbigpOwotCQkJc2hvd0ZvY3VzKCk7Ci0JCX0KLQl9Ci0KLQkJLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLQlwcm90ZWN0ZWQgdm9pZCBzaG93U2VsZWN0aW9uKCkgewotCQlpZiAoZ2V0SG9zdEZpZ3VyZSgpIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQkoKFdyYXBMYWJlbCkgZ2V0SG9zdEZpZ3VyZSgpKS5zZXRTZWxlY3RlZCh0cnVlKTsKLQkJCSgoV3JhcExhYmVsKSBnZXRIb3N0RmlndXJlKCkpLnNldEZvY3VzKGZhbHNlKTsKLQkJfSBlbHNlIHsKLQkJCWhpZGVTZWxlY3Rpb24oKTsKLQkJCWFkZEZlZWRiYWNrKHNlbGVjdGlvbkZlZWRiYWNrRmlndXJlID0gY3JlYXRlU2VsZWN0aW9uRmVlZGJhY2tGaWd1cmUoKSk7Ci0JCQlyZWZyZXNoU2VsZWN0aW9uRmVlZGJhY2soKTsKLQkJCWhpZGVGb2N1cygpOwotCQl9Ci0JfQotCi0JCS8qKgotICogQGdlbmVyYXRlZAotICovCi0JcHJvdGVjdGVkIHZvaWQgaGlkZVNlbGVjdGlvbigpIHsKLQkJaWYgKGdldEhvc3RGaWd1cmUoKSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJKChXcmFwTGFiZWwpIGdldEhvc3RGaWd1cmUoKSkuc2V0U2VsZWN0ZWQoZmFsc2UpOwotCQkJKChXcmFwTGFiZWwpIGdldEhvc3RGaWd1cmUoKSkuc2V0Rm9jdXMoZmFsc2UpOwotCQl9IGVsc2UgewotCQkJaWYgKHNlbGVjdGlvbkZlZWRiYWNrRmlndXJlICE9IG51bGwpIHsKLQkJCQlyZW1vdmVGZWVkYmFjayhzZWxlY3Rpb25GZWVkYmFja0ZpZ3VyZSk7Ci0JCQkJc2VsZWN0aW9uRmVlZGJhY2tGaWd1cmUgPSBudWxsOwotCQkJfQotCQkJaGlkZUZvY3VzKCk7Ci0JCX0KLQl9Ci0KLQkJLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLQlwcm90ZWN0ZWQgdm9pZCBzaG93Rm9jdXMoKSB7Ci0JCWlmIChnZXRIb3N0RmlndXJlKCkgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCSgoV3JhcExhYmVsKSBnZXRIb3N0RmlndXJlKCkpLnNldEZvY3VzKHRydWUpOwotCQl9IGVsc2UgewotCQkJaGlkZUZvY3VzKCk7Ci0JCQlhZGRGZWVkYmFjayhmb2N1c0ZlZWRiYWNrRmlndXJlID0gY3JlYXRlRm9jdXNGZWVkYmFja0ZpZ3VyZSgpKTsKLQkJCXJlZnJlc2hGb2N1c0ZlZWRiYWNrKCk7Ci0JCX0KLQl9Ci0KLQkJLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLQlwcm90ZWN0ZWQgdm9pZCBoaWRlRm9jdXMoKSB7Ci0JCWlmIChnZXRIb3N0RmlndXJlKCkgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCSgoV3JhcExhYmVsKSBnZXRIb3N0RmlndXJlKCkpLnNldEZvY3VzKGZhbHNlKTsKLQkJfSBlbHNlIHsKLQkJCWlmIChmb2N1c0ZlZWRiYWNrRmlndXJlICE9IG51bGwpIHsKLQkJCQlyZW1vdmVGZWVkYmFjayhmb2N1c0ZlZWRiYWNrRmlndXJlKTsKLQkJCQlmb2N1c0ZlZWRiYWNrRmlndXJlID0gbnVsbDsKLQkJCX0KLQkJfQotCX0KLQotCQkvKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotCXByb3RlY3RlZCBSZWN0YW5nbGUgZ2V0RmVlZGJhY2tCb3VuZHMoKSB7Ci0JCVJlY3RhbmdsZSBib3VuZHM7Ci0JCWlmIChnZXRIb3N0RmlndXJlKCkgaW5zdGFuY2VvZiBMYWJlbCkgewotCQkJYm91bmRzID0gKChMYWJlbCkgZ2V0SG9zdEZpZ3VyZSgpKS5nZXRUZXh0Qm91bmRzKCk7Ci0JCQlib3VuZHMuaW50ZXJzZWN0KGdldEhvc3RGaWd1cmUoKS5nZXRCb3VuZHMoKSk7Ci0JCX0gZWxzZSB7Ci0JCQlib3VuZHMgPSBnZXRIb3N0RmlndXJlKCkuZ2V0Qm91bmRzKCkuZ2V0Q29weSgpOwotCQl9Ci0JCWdldEhvc3RGaWd1cmUoKS5nZXRQYXJlbnQoKS50cmFuc2xhdGVUb0Fic29sdXRlKGJvdW5kcyk7Ci0JCWdldEZlZWRiYWNrTGF5ZXIoKS50cmFuc2xhdGVUb1JlbGF0aXZlKGJvdW5kcyk7Ci0JCXJldHVybiBib3VuZHM7Ci0JfQotCi0JCS8qKgotICogQGdlbmVyYXRlZAotICovCi0JcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlU2VsZWN0aW9uRmVlZGJhY2tGaWd1cmUoKSB7Ci0JCWlmIChnZXRIb3N0RmlndXJlKCkgaW5zdGFuY2VvZiBMYWJlbCkgewotCQkJTGFiZWwgZmVlZGJhY2tGaWd1cmUgPSBuZXcgTGFiZWwoKTsKLQkJCWZlZWRiYWNrRmlndXJlLnNldE9wYXF1ZSh0cnVlKTsKLQkJCWZlZWRiYWNrRmlndXJlLnNldEJhY2tncm91bmRDb2xvcihDb2xvckNvbnN0YW50cy5tZW51QmFja2dyb3VuZFNlbGVjdGVkKTsKLQkJCWZlZWRiYWNrRmlndXJlLnNldEZvcmVncm91bmRDb2xvcihDb2xvckNvbnN0YW50cy5tZW51Rm9yZWdyb3VuZFNlbGVjdGVkKTsKLQkJCXJldHVybiBmZWVkYmFja0ZpZ3VyZTsKLQkJfSBlbHNlIHsKLQkJCVJlY3RhbmdsZUZpZ3VyZSBmZWVkYmFja0ZpZ3VyZSA9IG5ldyBSZWN0YW5nbGVGaWd1cmUoKTsKLQkJCWZlZWRiYWNrRmlndXJlLnNldEZpbGwoZmFsc2UpOwotCQkJcmV0dXJuIGZlZWRiYWNrRmlndXJlOwotCQl9Ci0JfQotCi0JCS8qKgotICogQGdlbmVyYXRlZAotICovCi0JcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlRm9jdXNGZWVkYmFja0ZpZ3VyZSgpIHsKLQkJcmV0dXJuIG5ldyBGaWd1cmUoKSB7Ci0KLQkJCXByb3RlY3RlZCB2b2lkIHBhaW50RmlndXJlKEdyYXBoaWNzIGdyYXBoaWNzKSB7Ci0JCQkJZ3JhcGhpY3MuZHJhd0ZvY3VzKGdldEJvdW5kcygpLmdldFJlc2l6ZWQoLTEsIC0xKSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JCS8qKgotICogQGdlbmVyYXRlZAotICovCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlTGFiZWwoTGFiZWwgdGFyZ2V0KSB7Ci0JCUxhYmVsIHNvdXJjZSA9IChMYWJlbCkgZ2V0SG9zdEZpZ3VyZSgpOwotCQl0YXJnZXQuc2V0VGV4dChzb3VyY2UuZ2V0VGV4dCgpKTsKLQkJdGFyZ2V0LnNldFRleHRBbGlnbm1lbnQoc291cmNlLmdldFRleHRBbGlnbm1lbnQoKSk7Ci0JCXRhcmdldC5zZXRGb250KHNvdXJjZS5nZXRGb250KCkpOwotCX0KLQotCQkvKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hTZWxlY3Rpb25GZWVkYmFjaygpIHsKLQkJaWYgKHNlbGVjdGlvbkZlZWRiYWNrRmlndXJlICE9IG51bGwpIHsKLQkJCWlmIChzZWxlY3Rpb25GZWVkYmFja0ZpZ3VyZSBpbnN0YW5jZW9mIExhYmVsKSB7Ci0JCQkJdXBkYXRlTGFiZWwoKExhYmVsKSBzZWxlY3Rpb25GZWVkYmFja0ZpZ3VyZSk7Ci0JCQkJc2VsZWN0aW9uRmVlZGJhY2tGaWd1cmUuc2V0Qm91bmRzKGdldEZlZWRiYWNrQm91bmRzKCkpOwotCQkJfSBlbHNlIHsKLQkJCQlzZWxlY3Rpb25GZWVkYmFja0ZpZ3VyZS5zZXRCb3VuZHMoZ2V0RmVlZGJhY2tCb3VuZHMoKS5leHBhbmQoNSwgNSkpOwotCQkJfQotCQl9Ci0JfQotCi0JCS8qKgotICogQGdlbmVyYXRlZAotICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaEZvY3VzRmVlZGJhY2soKSB7Ci0JCWlmIChmb2N1c0ZlZWRiYWNrRmlndXJlICE9IG51bGwpIHsKLQkJCWZvY3VzRmVlZGJhY2tGaWd1cmUuc2V0Qm91bmRzKGdldEZlZWRiYWNrQm91bmRzKCkpOwotCQl9Ci0JfQotCi0JCS8qKgotICogQGdlbmVyYXRlZAotICovCi0JcHVibGljIHZvaWQgcmVmcmVzaEZlZWRiYWNrKCkgewotCQlyZWZyZXNoU2VsZWN0aW9uRmVlZGJhY2soKTsKLQkJcmVmcmVzaEZvY3VzRmVlZGJhY2soKTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZXhwcmVzc2lvbnMvVU1MQWJzdHJhY3RFeHByZXNzaW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZXhwcmVzc2lvbnMvVU1MQWJzdHJhY3RFeHByZXNzaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiYjM5Y2IuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2V4cHJlc3Npb25zL1VNTEFic3RyYWN0RXhwcmVzc2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQ0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZXhwcmVzc2lvbnM7Ci0KLWltcG9ydCBqYXZhLm1hdGguQmlnRGVjaW1hbDsKLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzaWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVR5cGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQucGFydC5BY3Rpdml0eURpYWdyYW1FZGl0b3JQbHVnaW47Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgVU1MQWJzdHJhY3RFeHByZXNzaW9uIHsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBESVNBQkxFRF9OT19JTVBMX0VYQ0VQVElPTl9MT0cgPSBCb29sZWFuCi0JCQkudmFsdWVPZigKLQkJCQkJUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oQWN0aXZpdHlEaWFncmFtRWRpdG9yUGx1Z2luCi0JCQkJCQkJLmdldEluc3RhbmNlKCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCkKLQkJCQkJCQkrICIvZGVidWcvZGlzYWJsZU5vRXhwckltcGxFeGNlcHRpb25Mb2ciKSkKLQkJCS5ib29sZWFuVmFsdWUoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBib2R5OwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzaWZpZXIgY29udGV4dDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIE1hcCBlbnY7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBJU3RhdHVzIHN0YXR1cyA9IFN0YXR1cy5PS19TVEFUVVM7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFVNTEFic3RyYWN0RXhwcmVzc2lvbihFQ2xhc3NpZmllciBjb250ZXh0KSB7Ci0JCXRoaXMuY29udGV4dCA9IGNvbnRleHQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBVTUxBYnN0cmFjdEV4cHJlc3Npb24oU3RyaW5nIGJvZHksIEVDbGFzc2lmaWVyIGNvbnRleHQsIE1hcCBlbnYpIHsKLQkJdGhpcy5ib2R5ID0gYm9keTsKLQkJdGhpcy5jb250ZXh0ID0gY29udGV4dDsKLQkJdGhpcy5lbnYgPSBlbnY7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldFN0YXR1cyhpbnQgc2V2ZXJpdHksIFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgdGhyb3dhYmxlKSB7Ci0JCVN0cmluZyBwbHVnaW5JRCA9IEFjdGl2aXR5RGlhZ3JhbUVkaXRvclBsdWdpbi5JRDsKLQkJdGhpcy5zdGF0dXMgPSBuZXcgU3RhdHVzKHNldmVyaXR5LCBwbHVnaW5JRCwgLTEsCi0JCQkJKG1lc3NhZ2UgIT0gbnVsbCkgPyBtZXNzYWdlIDogIiIsIHRocm93YWJsZSk7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKCF0aGlzLnN0YXR1cy5pc09LKCkpIHsKLQkJCUFjdGl2aXR5RGlhZ3JhbUVkaXRvclBsdWdpbgotCQkJCQkuZ2V0SW5zdGFuY2UoKQotCQkJCQkubG9nRXJyb3IoCi0JCQkJCQkJIkV4cHJlc3Npb24gcHJvYmxlbToiICsgbWVzc2FnZSArICJib2R5OiIgKyBib2R5LCB0aHJvd2FibGUpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCBPYmplY3QgZG9FdmFsdWF0ZShPYmplY3QgY29udGV4dCwgTWFwIGVudik7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBldmFsdWF0ZShPYmplY3QgY29udGV4dCkgewotCQlyZXR1cm4gZXZhbHVhdGUoY29udGV4dCwgQ29sbGVjdGlvbnMuRU1QVFlfTUFQKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBldmFsdWF0ZShPYmplY3QgY29udGV4dCwgTWFwIGVudikgewotCQlpZiAoY29udGV4dCgpLmlzSW5zdGFuY2UoY29udGV4dCkpIHsKLQkJCXRyeSB7Ci0JCQkJcmV0dXJuIGRvRXZhbHVhdGUoY29udGV4dCwgZW52KTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJaWYgKERJU0FCTEVEX05PX0lNUExfRVhDRVBUSU9OX0xPRwotCQkJCQkJJiYgZSBpbnN0YW5jZW9mIE5vSW1wbEV4Y2VwdGlvbikgewotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0JCQkJQWN0aXZpdHlEaWFncmFtRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkubG9nRXJyb3IoCi0JCQkJCQkiRXhwcmVzc2lvbiBldmFsdWF0aW9uIGZhaWx1cmU6ICIgKyBib2R5LCBlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElTdGF0dXMgZ2V0U3RhdHVzKCkgewotCQlyZXR1cm4gc3RhdHVzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGJvZHkoKSB7Ci0JCXJldHVybiBib2R5OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzaWZpZXIgY29udGV4dCgpIHsKLQkJcmV0dXJuIGNvbnRleHQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBNYXAgZW52aXJvbm1lbnQoKSB7Ci0JCXJldHVybiBlbnY7Ci0JfQotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHVibGljIHZvaWQgYXNzaWduVG8oRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIEVPYmplY3QgdGFyZ2V0KSB7Ci0JCS8vCQltb2RpZmllZCB0byBjb21tZW50IHRoaXMgb3V0Ci0JCWV2YWx1YXRlKHRhcmdldCk7Ci0JCS8vCQl2YWx1ZSA9ICh2YWx1ZSAhPSBudWxsKSA/IHBlcmZvcm1DYXN0KHZhbHVlLCBmZWF0dXJlKSA6IG51bGw7Ci0JCS8vCQlpZiAoZmVhdHVyZS5pc01hbnkoKSkgewotCQkvLwkJCUNvbGxlY3Rpb24gZGVzdENvbGxlY3Rpb24gPSAoQ29sbGVjdGlvbikgdGFyZ2V0LmVHZXQoZmVhdHVyZSk7Ci0JCS8vCQkJZGVzdENvbGxlY3Rpb24uY2xlYXIoKTsKLQkJLy8JCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBDb2xsZWN0aW9uKSB7Ci0JCS8vCQkJCUNvbGxlY3Rpb24gdmFsdWVDb2xsZWN0aW9uID0gKENvbGxlY3Rpb24pIHZhbHVlOwotCQkvLwkJCQlmb3IgKEl0ZXJhdG9yIGl0ID0gdmFsdWVDb2xsZWN0aW9uLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJLy8JCQkJCWRlc3RDb2xsZWN0aW9uLmFkZChwZXJmb3JtQ2FzdChpdC5uZXh0KCksIGZlYXR1cmUpKTsKLQkJLy8JCQkJfQotCQkvLwkJCX0gZWxzZSB7Ci0JCS8vCQkJCWRlc3RDb2xsZWN0aW9uLmFkZCh2YWx1ZSk7Ci0JCS8vCQkJfQotCQkvLwkJCXJldHVybjsKLQkJLy8JCX0KLQkJLy8JCXRhcmdldC5lU2V0KGZlYXR1cmUsIHZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBwZXJmb3JtQ2FzdChPYmplY3QgdmFsdWUsIEVUeXBlZEVsZW1lbnQgdGFyZ2V0VHlwZSkgewotCQlpZiAodGFyZ2V0VHlwZS5nZXRFVHlwZSgpID09IG51bGwKLQkJCQl8fCB0YXJnZXRUeXBlLmdldEVUeXBlKCkuZ2V0SW5zdGFuY2VDbGFzcygpID09IG51bGwpIHsKLQkJCXJldHVybiB2YWx1ZTsKLQkJfQotCQlDbGFzcyB0YXJnZXRDbGFzcyA9IHRhcmdldFR5cGUuZ2V0RVR5cGUoKS5nZXRJbnN0YW5jZUNsYXNzKCk7Ci0JCWlmICh2YWx1ZSAhPSBudWxsICYmIHZhbHVlIGluc3RhbmNlb2YgTnVtYmVyKSB7Ci0JCQlOdW1iZXIgbnVtID0gKE51bWJlcikgdmFsdWU7Ci0JCQlDbGFzcyB2YWxDbGFzcyA9IHZhbHVlLmdldENsYXNzKCk7Ci0JCQlDbGFzcyB0YXJnZXRXcmFwcGVyQ2xhc3MgPSB0YXJnZXRDbGFzczsKLQkJCWlmICh0YXJnZXRDbGFzcy5pc1ByaW1pdGl2ZSgpKSB7Ci0JCQkJdGFyZ2V0V3JhcHBlckNsYXNzID0gRWNvcmVVdGlsLndyYXBwZXJDbGFzc0Zvcih0YXJnZXRDbGFzcyk7Ci0JCQl9Ci0JCQlpZiAodmFsQ2xhc3MuZXF1YWxzKHRhcmdldFdyYXBwZXJDbGFzcykpIHsKLQkJCQlyZXR1cm4gdmFsdWU7Ci0JCQl9Ci0JCQlpZiAoTnVtYmVyLmNsYXNzLmlzQXNzaWduYWJsZUZyb20odGFyZ2V0V3JhcHBlckNsYXNzKSkgewotCQkJCWlmICh0YXJnZXRXcmFwcGVyQ2xhc3MuZXF1YWxzKEJ5dGUuY2xhc3MpKQotCQkJCQlyZXR1cm4gbmV3IEJ5dGUobnVtLmJ5dGVWYWx1ZSgpKTsKLQkJCQlpZiAodGFyZ2V0V3JhcHBlckNsYXNzLmVxdWFscyhJbnRlZ2VyLmNsYXNzKSkKLQkJCQkJcmV0dXJuIG5ldyBJbnRlZ2VyKG51bS5pbnRWYWx1ZSgpKTsKLQkJCQlpZiAodGFyZ2V0V3JhcHBlckNsYXNzLmVxdWFscyhTaG9ydC5jbGFzcykpCi0JCQkJCXJldHVybiBuZXcgU2hvcnQobnVtLnNob3J0VmFsdWUoKSk7Ci0JCQkJaWYgKHRhcmdldFdyYXBwZXJDbGFzcy5lcXVhbHMoTG9uZy5jbGFzcykpCi0JCQkJCXJldHVybiBuZXcgTG9uZyhudW0ubG9uZ1ZhbHVlKCkpOwotCQkJCWlmICh0YXJnZXRXcmFwcGVyQ2xhc3MuZXF1YWxzKEJpZ0ludGVnZXIuY2xhc3MpKQotCQkJCQlyZXR1cm4gQmlnSW50ZWdlci52YWx1ZU9mKG51bS5sb25nVmFsdWUoKSk7Ci0JCQkJaWYgKHRhcmdldFdyYXBwZXJDbGFzcy5lcXVhbHMoRmxvYXQuY2xhc3MpKQotCQkJCQlyZXR1cm4gbmV3IEZsb2F0KG51bS5mbG9hdFZhbHVlKCkpOwotCQkJCWlmICh0YXJnZXRXcmFwcGVyQ2xhc3MuZXF1YWxzKERvdWJsZS5jbGFzcykpCi0JCQkJCXJldHVybiBuZXcgRG91YmxlKG51bS5kb3VibGVWYWx1ZSgpKTsKLQkJCQlpZiAodGFyZ2V0V3JhcHBlckNsYXNzLmVxdWFscyhCaWdEZWNpbWFsLmNsYXNzKSkKLQkJCQkJcmV0dXJuIG5ldyBCaWdEZWNpbWFsKG51bS5kb3VibGVWYWx1ZSgpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdmFsdWU7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgVU1MQWJzdHJhY3RFeHByZXNzaW9uIGNyZWF0ZU51bGxFeHByZXNzaW9uKAotCQkJRUNsYXNzaWZpZXIgY29udGV4dCkgewotCQlyZXR1cm4gbmV3IFVNTEFic3RyYWN0RXhwcmVzc2lvbihjb250ZXh0KSB7Ci0JCQlwcm90ZWN0ZWQgT2JqZWN0IGRvRXZhbHVhdGUoT2JqZWN0IGNvbnRleHQsIE1hcCBlbnYpIHsKLQkJCQkvLyBUT0RPIC0gbG9nIGVudHJ5IGFib3V0IG5vdCBwcm92aWRlciBhdmFpbGFibGUgZm9yIHRoaXMgZXhwcmVzc2lvbgotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNsYXNzIE5vSW1wbEV4Y2VwdGlvbiBleHRlbmRzIFJ1bnRpbWVFeGNlcHRpb24gewotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIE5vSW1wbEV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSkgewotCQkJc3VwZXIobWVzc2FnZSk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvcGFydC9BY3Rpdml0eURpYWdyYW1FZGl0b3IuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9wYXJ0L0FjdGl2aXR5RGlhZ3JhbUVkaXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OTY5MmU3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9wYXJ0L0FjdGl2aXR5RGlhZ3JhbUVkaXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzM0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQucGFydDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuRGVsZWdhdGluZ0xheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuRnJlZWZvcm1MYXllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTGF5ZXJlZFBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVNb2RlbEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuQ29udHJvbEZsb3dFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLkNvbnRyb2xGbG93TmFtZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnByb3ZpZGVycy5VTUxFbGVtZW50VHlwZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLkFEREltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQucGFydC5BY3Rpdml0eURldGFpbERpYWdyYW1FZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5EaWFncmFtQ29yZVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLmJyaWRnZS5CcmlkZ2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5icmlkZ2UuRGlhZ3JhbUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5icmlkZ2UuTm9kZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5wYXJ0LkFic3RyYWN0RGlhZ3JhbUVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnBhcnQuRGlhZ3JhbUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUucGFydC5EaWFncmFtRmlsZUVkaXRvcklucHV0UHJveHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5wYXJ0LnV0aWwuRGlhZ3JhbUVkaXRvclV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS51dGlsLkRpYWdyYW1Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkFjdGl2aXR5V3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuSURpYWdyYW1NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5TdXBwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNhcGFiaWxpdHlQYXR0ZXJuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcnlQcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuSXRlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlBoYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkxheWVyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi51aS5hY3Rpb25zLkdFRkFjdGlvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUucHJlZmVyZW5jZXMuUHJlZmVyZW5jZXNIaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5zZXJ2aWNlcy5WaWV3U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmFjdGlvbnMuQWN0aW9uSWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLkRpYWdyYW1FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5EaWFncmFtUm9vdEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVxdWVzdHMuQ3JlYXRlVW5zcGVjaWZpZWRUeXBlQ29ubmVjdGlvblJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXNvdXJjZXMuZWRpdG9yLmRvY3VtZW50LklEb2N1bWVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuSUVsZW1lbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkRpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRWRnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUNvbnRyaWJ1dGlvbkl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkVycm9yRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSU1lc3NhZ2VQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvck1hdGNoaW5nU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRmlsZUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5TYXZlQXNEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5GaWxlRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuQWN0aXZpdHlFZGdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkFjdGl2aXR5Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5Db250cm9sRmxvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5VTUxQYWNrYWdlOwotCi0vKioKLSAqIEBtb2RpZmllZAotICogQGF1dGhvciBza2Fubm9vcgotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZpdHlEaWFncmFtRWRpdG9yIGV4dGVuZHMgQWJzdHJhY3REaWFncmFtRWRpdG9yIHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJRCA9ICJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5wYXJ0LkFjdGl2aXR5RGlhZ3JhbUVkaXRvcklEIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBY3Rpdml0eURpYWdyYW1FZGl0b3IoKSB7Ci0JCXN1cGVyKHRydWUpOwotCX0KLQotCS8qKgotCSAqIEBtb2RpZmllZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZUdyYXBoaWNhbFZpZXdlcigpIHsKLQkJc3VwZXIuY29uZmlndXJlR3JhcGhpY2FsVmlld2VyKCk7Ci0JCURpYWdyYW1Sb290RWRpdFBhcnQgcm9vdCA9IChEaWFncmFtUm9vdEVkaXRQYXJ0KSBnZXREaWFncmFtR3JhcGhpY2FsVmlld2VyKCkKLQkJCQkuZ2V0Um9vdEVkaXRQYXJ0KCk7Ci0JCUxheWVyZWRQYW5lIHByaW50YWJsZUxheWVycyA9IChMYXllcmVkUGFuZSkgcm9vdAotCQkJCS5nZXRMYXllcihMYXllckNvbnN0YW50cy5QUklOVEFCTEVfTEFZRVJTKTsKLQkJRnJlZWZvcm1MYXllciBleHRMYWJlbHNMYXllciA9IG5ldyBGcmVlZm9ybUxheWVyKCk7Ci0JCWV4dExhYmVsc0xheWVyLnNldExheW91dE1hbmFnZXIobmV3IERlbGVnYXRpbmdMYXlvdXQoKSk7Ci0vLwkJcHJpbnRhYmxlTGF5ZXJzLmFkZExheWVyQWZ0ZXIoZXh0TGFiZWxzTGF5ZXIsCi0vLwkJCQlVTUxFZGl0UGFydEZhY3RvcnkuRVhURVJOQUxfTk9ERV9MQUJFTFNfTEFZRVIsCi0vLwkJCQlMYXllckNvbnN0YW50cy5QUklNQVJZX0xBWUVSKTsKLQkJTGF5ZXJlZFBhbmUgc2NhbGFibGVMYXllcnMgPSAoTGF5ZXJlZFBhbmUpIHJvb3QKLQkJCQkuZ2V0TGF5ZXIoTGF5ZXJDb25zdGFudHMuU0NBTEFCTEVfTEFZRVJTKTsKLQkJRnJlZWZvcm1MYXllciBzY2FsZWRGZWVkYmFja0xheWVyID0gbmV3IEZyZWVmb3JtTGF5ZXIoKTsKLQkJc2NhbGVkRmVlZGJhY2tMYXllci5zZXRFbmFibGVkKGZhbHNlKTsKLQkJc2NhbGFibGVMYXllcnMuYWRkTGF5ZXJBZnRlcihzY2FsZWRGZWVkYmFja0xheWVyLAotCQkJCUxheWVyQ29uc3RhbnRzLlNDQUxFRF9GRUVEQkFDS19MQVlFUiwKLQkJCQlEaWFncmFtUm9vdEVkaXRQYXJ0LkRFQ09SQVRJT05fVU5QUklOVEFCTEVfTEFZRVIpOwotCX0KLQkKLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0vLwlwcm90ZWN0ZWQgUGFsZXR0ZVJvb3QgY3JlYXRlUGFsZXR0ZVJvb3QoUGFsZXR0ZVJvb3QgZXhpc3RpbmdQYWxldHRlUm9vdCkgewotLy8JCVBhbGV0dGVSb290IHJvb3QgPSBzdXBlci5jcmVhdGVQYWxldHRlUm9vdChleGlzdGluZ1BhbGV0dGVSb290KTsKLS8vCQluZXcgVU1MUGFsZXR0ZUZhY3RvcnkoKS5maWxsUGFsZXR0ZShyb290KTsKLS8vCQlyZXR1cm4gcm9vdDsKLS8vCX0KLQotCS8qKgotCSAqIEBtb2RpZmllZAotCSAqLwotCXByb3RlY3RlZCBQcmVmZXJlbmNlc0hpbnQgZ2V0UHJlZmVyZW5jZXNIaW50KCkgewotCQlyZXR1cm4gbmV3IFByZWZlcmVuY2VzSGludChBY3Rpdml0eURpYWdyYW1FZGl0b3JQbHVnaW4uSUQpOwotCX0KLQotCS8qKgotCSAqIEBtb2RpZmllZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihDbGFzcyB0eXBlKSB7Ci0vLwkJaWYgKHR5cGUgPT0gSVByb3BlcnR5U2hlZXRQYWdlLmNsYXNzKSB7Ci0vLwkJCXJldHVybiBudWxsOwotLy8JCX0KLQkJcmV0dXJuIHN1cGVyLmdldEFkYXB0ZXIodHlwZSk7Ci0JfQotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJvdGVjdGVkIElEb2N1bWVudFByb3ZpZGVyIGdldERvY3VtZW50UHJvdmlkZXIoSUVkaXRvcklucHV0IGlucHV0KSB7Ci0vLwkJaWYgKGlucHV0IGluc3RhbmNlb2YgSUZpbGVFZGl0b3JJbnB1dAotLy8JCQkJfHwgaW5wdXQgaW5zdGFuY2VvZiBVUklFZGl0b3JJbnB1dCkgewotLy8JCQlyZXR1cm4gQWN0aXZpdHlEaWFncmFtRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkKLS8vCQkJCQkuZ2V0RG9jdW1lbnRQcm92aWRlcigpOwotLy8JCX0KLQkJcmV0dXJuIHN1cGVyLmdldERvY3VtZW50UHJvdmlkZXIoaW5wdXQpOwotCX0KLQotCS8qKgotCSAqIEBtb2RpZmllZAotCSAqLwotCXB1YmxpYyBUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiBnZXRFZGl0aW5nRG9tYWluKCkgewotLy8JCUlEb2N1bWVudCBkb2N1bWVudCA9IGdldEVkaXRvcklucHV0KCkgIT0gbnVsbCA/IGdldERvY3VtZW50UHJvdmlkZXIoKQotLy8JCQkJLmdldERvY3VtZW50KGdldEVkaXRvcklucHV0KCkpIDogbnVsbDsKLS8vCQlpZiAoZG9jdW1lbnQgaW5zdGFuY2VvZiBJRGlhZ3JhbURvY3VtZW50KSB7Ci0vLwkJCXJldHVybiAoKElEaWFncmFtRG9jdW1lbnQpIGRvY3VtZW50KS5nZXRFZGl0aW5nRG9tYWluKCk7Ci0vLwkJfQotLy8JCXJldHVybiBzdXBlci5nZXRFZGl0aW5nRG9tYWluKCk7Ci0JCXJldHVybiBnZXREaWFncmFtTWFuYWdlcigpLmdldEVkaXRpbmdEb21haW4oKTsKLQl9Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXREb2N1bWVudFByb3ZpZGVyKElFZGl0b3JJbnB1dCBpbnB1dCkgewotLy8JCWlmIChpbnB1dCBpbnN0YW5jZW9mIElGaWxlRWRpdG9ySW5wdXQKLS8vCQkJCXx8IGlucHV0IGluc3RhbmNlb2YgVVJJRWRpdG9ySW5wdXQpIHsKLS8vCQkJc2V0RG9jdW1lbnRQcm92aWRlcihBY3Rpdml0eURpYWdyYW1FZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKQotLy8JCQkJCS5nZXREb2N1bWVudFByb3ZpZGVyKCkpOwotLy8JCX0gZWxzZSB7Ci0vLwkJCXN1cGVyLnNldERvY3VtZW50UHJvdmlkZXIoaW5wdXQpOwotLy8JCX0KLQkJc3VwZXIuc2V0RG9jdW1lbnRQcm92aWRlcihpbnB1dCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotLy8JcHVibGljIHZvaWQgZ290b01hcmtlcihJTWFya2VyIG1hcmtlcikgewotLy8JCU1hcmtlck5hdmlnYXRpb25TZXJ2aWNlLmdldEluc3RhbmNlKCkuZ290b01hcmtlcih0aGlzLCBtYXJrZXIpOwotLy8JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2F2ZUFzQWxsb3dlZCgpIHsKLQkJcmV0dXJuIHN1cGVyLmlzU2F2ZUFzQWxsb3dlZCgpOwotCX0KLQotCS8qKgotCSAqIEBtb2RpZmllZAotCSAqLwotCXB1YmxpYyB2b2lkIGRvU2F2ZUFzKCkgewotLy8JCXN1cGVyLmRvU2F2ZShuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKQotCQlwZXJmb3JtU2F2ZUFzKG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtU2F2ZUFzKElQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yKSB7Ci0JCVNoZWxsIHNoZWxsID0gZ2V0U2l0ZSgpLmdldFNoZWxsKCk7Ci0JCUlFZGl0b3JJbnB1dCBpbnB1dCA9IGdldEVkaXRvcklucHV0KCk7Ci0JCVNhdmVBc0RpYWxvZyBkaWFsb2cgPSBuZXcgU2F2ZUFzRGlhbG9nKHNoZWxsKTsKLQkJSUZpbGUgb3JpZ2luYWwgPSBpbnB1dCBpbnN0YW5jZW9mIElGaWxlRWRpdG9ySW5wdXQgPyAoKElGaWxlRWRpdG9ySW5wdXQpIGlucHV0KQotCQkJCS5nZXRGaWxlKCkKLQkJCQk6IG51bGw7Ci0JCWlmIChvcmlnaW5hbCAhPSBudWxsKSB7Ci0JCQlkaWFsb2cuc2V0T3JpZ2luYWxGaWxlKG9yaWdpbmFsKTsKLQkJfQotCQlkaWFsb2cuY3JlYXRlKCk7Ci0JCUlEb2N1bWVudFByb3ZpZGVyIHByb3ZpZGVyID0gZ2V0RG9jdW1lbnRQcm92aWRlcigpOwotCQlpZiAocHJvdmlkZXIgPT0gbnVsbCkgewotCQkJLy8gZWRpdG9yIGhhcyBiZWVuIHByb2dyYW1tYXRpY2FsbHkgY2xvc2VkIHdoaWxlIHRoZSBkaWFsb2cgd2FzIG9wZW4KLQkJCXJldHVybjsKLQkJfQotCQlpZiAocHJvdmlkZXIuaXNEZWxldGVkKGlucHV0KSAmJiBvcmlnaW5hbCAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgbWVzc2FnZSA9IE5MUy5iaW5kKAotCQkJCQkiVGhlIG9yaWdpbmFsIGZpbGUgJyd7MH0nJyBoYXMgYmVlbiBkZWxldGVkLiIsIG9yaWdpbmFsCi0JCQkJCQkJLmdldE5hbWUoKSk7Ci0JCQlkaWFsb2cuc2V0RXJyb3JNZXNzYWdlKG51bGwpOwotCQkJZGlhbG9nLnNldE1lc3NhZ2UobWVzc2FnZSwgSU1lc3NhZ2VQcm92aWRlci5XQVJOSU5HKTsKLQkJfQotCQlpZiAoZGlhbG9nLm9wZW4oKSA9PSBXaW5kb3cuQ0FOQ0VMKSB7Ci0JCQlpZiAocHJvZ3Jlc3NNb25pdG9yICE9IG51bGwpIHsKLQkJCQlwcm9ncmVzc01vbml0b3Iuc2V0Q2FuY2VsZWQodHJ1ZSk7Ci0JCQl9Ci0JCQlyZXR1cm47Ci0JCX0KLQkJSVBhdGggZmlsZVBhdGggPSBkaWFsb2cuZ2V0UmVzdWx0KCk7Ci0JCWlmIChmaWxlUGF0aCA9PSBudWxsKSB7Ci0JCQlpZiAocHJvZ3Jlc3NNb25pdG9yICE9IG51bGwpIHsKLQkJCQlwcm9ncmVzc01vbml0b3Iuc2V0Q2FuY2VsZWQodHJ1ZSk7Ci0JCQl9Ci0JCQlyZXR1cm47Ci0JCX0KLQkJSVdvcmtzcGFjZVJvb3Qgd29ya3NwYWNlUm9vdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7Ci0JCUlGaWxlIGZpbGUgPSB3b3Jrc3BhY2VSb290LmdldEZpbGUoZmlsZVBhdGgpOwotCQlmaW5hbCBJRWRpdG9ySW5wdXQgbmV3SW5wdXQgPSBuZXcgRmlsZUVkaXRvcklucHV0KGZpbGUpOwotCQkvLyBDaGVjayBpZiB0aGUgZWRpdG9yIGlzIGFscmVhZHkgb3BlbgotCQlJRWRpdG9yTWF0Y2hpbmdTdHJhdGVneSBtYXRjaGluZ1N0cmF0ZWd5ID0gZ2V0RWRpdG9yRGVzY3JpcHRvcigpCi0JCQkJLmdldEVkaXRvck1hdGNoaW5nU3RyYXRlZ3koKTsKLQkJSUVkaXRvclJlZmVyZW5jZVtdIGVkaXRvclJlZnMgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpCi0JCQkJLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKQotCQkJCS5nZXRFZGl0b3JSZWZlcmVuY2VzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZWRpdG9yUmVmcy5sZW5ndGg7IGkrKykgewotCQkJaWYgKG1hdGNoaW5nU3RyYXRlZ3kubWF0Y2hlcyhlZGl0b3JSZWZzW2ldLCBuZXdJbnB1dCkpIHsKLQkJCQlNZXNzYWdlRGlhbG9nCi0JCQkJCQkub3Blbldhcm5pbmcoc2hlbGwsICJQcm9ibGVtIER1cmluZyBTYXZlIEFzLi4uIiwKLQkJCQkJCQkJIlNhdmUgY291bGQgbm90IGJlIGNvbXBsZXRlZC4gVGFyZ2V0IGZpbGUgaXMgYWxyZWFkeSBvcGVuIGluIGFub3RoZXIgZWRpdG9yLiIpOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQlib29sZWFuIHN1Y2Nlc3MgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCXByb3ZpZGVyLmFib3V0VG9DaGFuZ2UobmV3SW5wdXQpOwotCQkJZ2V0RG9jdW1lbnRQcm92aWRlcihuZXdJbnB1dCkuc2F2ZURvY3VtZW50KHByb2dyZXNzTW9uaXRvciwKLQkJCQkJbmV3SW5wdXQsCi0JCQkJCWdldERvY3VtZW50UHJvdmlkZXIoKS5nZXREb2N1bWVudChnZXRFZGl0b3JJbnB1dCgpKSwgdHJ1ZSk7Ci0JCQlzdWNjZXNzID0gdHJ1ZTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiB4KSB7Ci0JCQlJU3RhdHVzIHN0YXR1cyA9IHguZ2V0U3RhdHVzKCk7Ci0JCQlpZiAoc3RhdHVzID09IG51bGwgfHwgc3RhdHVzLmdldFNldmVyaXR5KCkgIT0gSVN0YXR1cy5DQU5DRUwpIHsKLQkJCQlFcnJvckRpYWxvZy5vcGVuRXJyb3Ioc2hlbGwsICJTYXZlIFByb2JsZW1zIiwKLQkJCQkJCSJDb3VsZCBub3Qgc2F2ZSBmaWxlLiIsIHguZ2V0U3RhdHVzKCkpOwotCQkJfQotCQl9IGZpbmFsbHkgewotCQkJcHJvdmlkZXIuY2hhbmdlZChuZXdJbnB1dCk7Ci0JCQlpZiAoc3VjY2VzcykgewotCQkJCXNldElucHV0KG5ld0lucHV0KTsKLQkJCX0KLQkJfQotCQlpZiAocHJvZ3Jlc3NNb25pdG9yICE9IG51bGwpIHsKLQkJCXByb2dyZXNzTW9uaXRvci5zZXRDYW5jZWxlZCghc3VjY2Vzcyk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZXZlbnQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVEb3VibGVDbGljayhFdmVudCBldmVudCkgewotCQlMaXN0IGVkaXRQYXJ0cyA9IGdldEdyYXBoaWNhbFZpZXdlcigpLmdldFNlbGVjdGVkRWRpdFBhcnRzKCk7Ci0KLQkJLy8gZG8gbm90aGluZyBpZiAwIG9yIG1vcmUgdGhhbiAxIGVkaXQgcGFydHMgYXJlIHNlbGVjdGVkCi0JCS8vCi0JCWlmIChlZGl0UGFydHMuc2l6ZSgpICE9IDEpCi0JCQlyZXR1cm47Ci0KLQkJRWRpdFBhcnQgZWRpdFBhcnQgPSAoRWRpdFBhcnQpIGVkaXRQYXJ0cy5nZXQoMCk7Ci0JCU5vZGUgbm9kZSA9IChOb2RlKSBlZGl0UGFydC5nZXRNb2RlbCgpOwotCQlFT2JqZWN0IG1vZGVsID0gbm9kZS5nZXRFbGVtZW50KCk7Ci0JCURpYWdyYW1GaWxlRWRpdG9ySW5wdXRQcm94eSBlZGl0b3JJbnB1dCA9IChEaWFncmFtRmlsZUVkaXRvcklucHV0UHJveHkpIGdldEVkaXRvcklucHV0KCk7Ci0JCURpYWdyYW1FZGl0b3JJbnB1dCBkSW5wdXQgPSBlZGl0b3JJbnB1dC5nZXREaWFncmFtRWRpdG9ySW5wdXQoKTsKLQotCQlpZiAobW9kZWwgaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eSkgewotCQkJTm9kZUFkYXB0ZXIgbm9kZUFkYXB0ZXIgPSBCcmlkZ2VIZWxwZXIuZ2V0Tm9kZUFkYXB0ZXIobW9kZWwpOwotCQkJT2JqZWN0IGUgPSBudWxsOwotCQkJLy8gVE9ETzogaGFuZGxlIFdyYXBwZXIgY2hhbmdlIGJlbG93IGxpbmUgYWZ0ZXIgd3JhcHBlciBpbXBsZW1lbnQKLQkJCWUgPSBub2RlQWRhcHRlci5nZXRFbGVtZW50KCk7Ci0JCQlpZiAoZSA9PSBudWxsKSB7Ci0JCQkJZSA9IEJyaWRnZUhlbHBlci5nZXRNZXRob2RFbGVtZW50KChFTW9kZWxFbGVtZW50KSBtb2RlbCk7Ci0JCQl9Ci0JCQlpZiAoZSAhPSBudWxsKSB7Ci0JCQkJLy8JCQkJSUVkaXRvclBhcnQgcGFyZW50ID0gZ2V0U2l0ZSgpLmdldFBhZ2UoKS5nZXRBY3RpdmVFZGl0b3IoKTsKLQkJCQlEaWFncmFtRWRpdG9ySW5wdXQgaW5wdXQgPSBuZXcgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5wYXJ0LkRpYWdyYW1FZGl0b3JJbnB1dCgKLQkJCQkJCWUsIGRJbnB1dC5nZXRTdXBwcmVzc2lvbigpLAotCQkJCQkJSURpYWdyYW1NYW5hZ2VyLkFDVElWSVRZX0RJQUdSQU0pOwotCQkJCURpYWdyYW1FZGl0b3JVdGlsLm9wZW5EaWFncmFtRWRpdG9yKGdldFNpdGUoKS5nZXRQYWdlKCksIGlucHV0LAotCQkJCQkJQWN0aXZpdHlEaWFncmFtRWRpdG9yUGx1Z2luLkRJQUdSQU1fUFJFRkVSRU5DRVNfSElOVCwKLQkJCQkJCW5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCi0JCQl9Ci0JCX0KLQotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUFjdGlvbnMoKSB7Ci0JCXN1cGVyLmNyZWF0ZUFjdGlvbnMoKTsKLQkJSUFjdGlvbiBhY3Rpb24gPSBuZXcgQWN0aW9uKAotCQkJCURpYWdyYW1Db3JlUmVzb3VyY2VzLkFjdGl2aXR5RGlhZ3JhbV9vcGVuQWN0aXZpdHlEZXRhaWxEaWFncmFtX3RleHQpIHsgLy8kTk9OLU5MUy0xJAotCQkJcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJCQlyZXR1cm4gRGlhZ3JhbUNvbnN0YW50cy5PUEVOX0FDVElWSVRZX0RFVEFJTF9ESUFHUkFNOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJRWRpdFBhcnQgc2VsZWN0ZWRQYXJ0ID0gKEVkaXRQYXJ0KSBnZXRHcmFwaGljYWxWaWV3ZXIoKQotCQkJCQkJCS5nZXRTZWxlY3RlZEVkaXRQYXJ0cygpLmdldCgwKTsKLQkJCQkJLy8JCQkJCUlFZGl0b3JQYXJ0IHBhcmVudCA9IGdldFNpdGUoKS5nZXRQYWdlKCkuZ2V0QWN0aXZlRWRpdG9yKCk7Ci0JCQkJCWlmIChzZWxlY3RlZFBhcnQgIT0gbnVsbCkgewotCQkJCQkJTm9kZSB2aWV3ID0gKE5vZGUpIHNlbGVjdGVkUGFydC5nZXRNb2RlbCgpOwotCQkJCQkJRGlhZ3JhbUVkaXRQYXJ0IGRpYWdyYW1FZGl0UGFydCA9IGdldERpYWdyYW1FZGl0UGFydCgpOwotCQkJCQkJRGlhZ3JhbSBkaWFncmFtID0gKERpYWdyYW0pIGRpYWdyYW1FZGl0UGFydC5nZXRNb2RlbCgpOwotCQkJCQkJRGlhZ3JhbUFkYXB0ZXIgZGlhZ3JhbUFkYXB0ZXIgPSBCcmlkZ2VIZWxwZXIKLQkJCQkJCQkJLmdldERpYWdyYW1BZGFwdGVyKGRpYWdyYW0uZ2V0RWxlbWVudCgpKTsKLQotCQkJCQkJTm9kZUFkYXB0ZXIgYWRhcHRlciA9IEJyaWRnZUhlbHBlci5nZXROb2RlQWRhcHRlcih2aWV3Ci0JCQkJCQkJCS5nZXRFbGVtZW50KCkpOwotCQkJCQkJT2JqZWN0IHNlbGVjdGVkT2JqZWN0ID0gYWRhcHRlci5nZXRXcmFwcGVyKCk7Ci0JCQkJCQlpZiAoc2VsZWN0ZWRPYmplY3QgPT0gbnVsbCkgewotCQkJCQkJCXNlbGVjdGVkT2JqZWN0ID0gYWRhcHRlci5nZXRFbGVtZW50KCk7Ci0JCQkJCQl9Ci0JCQkJCQkvLyBJRWRpdG9yUGFydCBwYXJlbnQgPQotCQkJCQkJLy8gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRBY3RpdmVQYWdlKCkuZ2V0QWN0aXZlRWRpdG9yKCk7Ci0JCQkJCQlEaWFncmFtRWRpdG9ySW5wdXQgaW5wdXQgPSBuZXcgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5wYXJ0LkRpYWdyYW1FZGl0b3JJbnB1dCgKLQkJCQkJCQkJc2VsZWN0ZWRPYmplY3QsCi0JCQkJCQkJCWRpYWdyYW1BZGFwdGVyLmdldFN1cHByZXNzaW9uKCksCi0JCQkJCQkJCUlEaWFncmFtTWFuYWdlci5BQ1RJVklUWV9ERVRBSUxfRElBR1JBTSk7Ci0JCQkJCQlEaWFncmFtRWRpdG9yVXRpbAotCQkJCQkJCQkub3BlbkRpYWdyYW1FZGl0b3IoCi0JCQkJCQkJCQkJZ2V0U2l0ZSgpLmdldFBhZ2UoKSwKLQkJCQkJCQkJCQlpbnB1dCwKLQkJCQkJCQkJCQlBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0b3JQbHVnaW4uRElBR1JBTV9QUkVGRVJFTkNFU19ISU5ULAotCQkJCQkJCQkJCW5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQkJCQl9Ci0KLQkJCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCXB1YmxpYyBib29sZWFuIGlzRW5hYmxlZCgpIHsKLQkJCQlMaXN0IGVkaXRQYXJ0cyA9IGdldEdyYXBoaWNhbFZpZXdlcigpLmdldFNlbGVjdGVkRWRpdFBhcnRzKCk7Ci0JCQkJaWYgKGVkaXRQYXJ0cy5zaXplKCkgIT0gMSkKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCUVkaXRQYXJ0IGVkaXRQYXJ0ID0gKEVkaXRQYXJ0KSBlZGl0UGFydHMuZ2V0KDApOwotCQkJCVZpZXcgbm9kZSA9IChWaWV3KSBlZGl0UGFydC5nZXRNb2RlbCgpOwotCQkJCWlmIChub2RlICE9IG51bGwKLQkJCQkJCSYmIG5vZGUuZ2V0RWxlbWVudCgpICE9IG51bGwKLQkJCQkJCSYmIG5vZGUuZ2V0RWxlbWVudCgpIGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UudW1sMi51bWwuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZSkgewotCQkJCQlpZiAoZW5hYmxlQURETWVudShub2RlLmdldEVsZW1lbnQoKSkpIHsKLQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQl9Ci0JCQkJfQotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfTsKLQkJYWN0aW9uLnNldEltYWdlRGVzY3JpcHRvcihBRERJbWFnZXMuSU1HX0RFU0NfRURJVE9SKTsKLQkJYWN0aW9uLnNldERpc2FibGVkSW1hZ2VEZXNjcmlwdG9yKEFEREltYWdlcy5ESVNBQkxFRF9JTUdfREVTQ19FRElUT1IpOwotCQlnZXRBY3Rpb25SZWdpc3RyeSgpLnJlZ2lzdGVyQWN0aW9uKGFjdGlvbik7Ci0KLQkJTGlzdDxJRWxlbWVudFR5cGU+IGVsZW1lbnRUeXBlcyA9IG5ldyBBcnJheUxpc3Q8SUVsZW1lbnRUeXBlPigpOwotCQllbGVtZW50VHlwZXMuY2xlYXIoKTsKLQkJZWxlbWVudFR5cGVzLmFkZChVTUxFbGVtZW50VHlwZXMuQWN0aXZpdHlQYXJ0aXRpb25fMTAwOCk7Ci0JCWVsZW1lbnRUeXBlcy5hZGQoVU1MRWxlbWVudFR5cGVzLkFjdGl2aXR5UGFydGl0aW9uXzIwMDEpOwotCQlhY3Rpb24gPSBjcmVhdGVBbkFjdGlvbigKLQkJCQlEaWFncmFtQ29yZVJlc291cmNlcy5BY3Rpdml0eURpYWdyYW1fUGFydGl0aW9uX05vZGVfdGV4dCwKLQkJCQllbGVtZW50VHlwZXMsIC8vJE5PTi1OTFMtMSQKLQkJCQlEaWFncmFtQ29uc3RhbnRzLkNSRUFURV9QQVJUSVRJT04sCi0JCQkJRGlhZ3JhbUNvcmVSZXNvdXJjZXMuQWN0aXZpdHlEaWFncmFtX1BhcnRpdGlvbl9Ob2RlX3Rvb2x0aXAsCi0JCQkJVU1MRWxlbWVudFR5cGVzLmdldEltYWdlRGVzY3JpcHRvcihVTUxQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJLmdldEFjdGl2aXR5UGFydGl0aW9uKCksCi0JCQkJCQlVTUxFbGVtZW50VHlwZXMuQWN0aXZpdHlQYXJ0aXRpb25fMjAwMSkpOyAvLyROT04tTkxTLTEkCi0KLQkJZ2V0QWN0aW9uUmVnaXN0cnkoKS5yZWdpc3RlckFjdGlvbihhY3Rpb24pOwotCi0JCWVsZW1lbnRUeXBlcyA9IG5ldyBBcnJheUxpc3Q8SUVsZW1lbnRUeXBlPigpOwotCQllbGVtZW50VHlwZXMuYWRkKFVNTEVsZW1lbnRUeXBlcy5Jbml0aWFsTm9kZV8xMDA0KTsKLQkJYWN0aW9uID0gY3JlYXRlQW5BY3Rpb24oCi0JCQkJRGlhZ3JhbUNvcmVSZXNvdXJjZXMuQWN0aXZpdHlEaWFncmFtX1N0YXJ0Tm9kZV90ZXh0LAotCQkJCWVsZW1lbnRUeXBlcywgLy8kTk9OLU5MUy0xJAotCQkJCURpYWdyYW1Db25zdGFudHMuQ1JFQVRFX1NUQVJUX05PREUsCi0JCQkJRGlhZ3JhbUNvcmVSZXNvdXJjZXMuQWN0aXZpdHlEaWFncmFtX1N0YXJ0Tm9kZV90b29sdGlwLCAvLyROT04tTkxTLTEkCi0JCQkJVU1MRWxlbWVudFR5cGVzLmdldEltYWdlRGVzY3JpcHRvcihVTUxQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJLmdldEluaXRpYWxOb2RlKCksIFVNTEVsZW1lbnRUeXBlcy5Jbml0aWFsTm9kZV8xMDA0KSk7IC8vJE5PTi1OTFMtMSQKLQkJZ2V0QWN0aW9uUmVnaXN0cnkoKS5yZWdpc3RlckFjdGlvbihhY3Rpb24pOwotCi0JCWVsZW1lbnRUeXBlcyA9IG5ldyBBcnJheUxpc3Q8SUVsZW1lbnRUeXBlPigpOwotCQllbGVtZW50VHlwZXMuYWRkKFVNTEVsZW1lbnRUeXBlcy5Gb3JrTm9kZV8xMDAzKTsKLQkJYWN0aW9uID0gY3JlYXRlQW5BY3Rpb24oCi0JCQkJRGlhZ3JhbUNvcmVSZXNvdXJjZXMuQWN0aXZpdHlEaWFncmFtX0ZvcmtfTm9kZV90ZXh0LAotCQkJCWVsZW1lbnRUeXBlcywgLy8kTk9OLU5MUy0xJAotCQkJCURpYWdyYW1Db25zdGFudHMuQ1JFQVRFX0ZPUktfTk9ERSwKLQkJCQlEaWFncmFtQ29yZVJlc291cmNlcy5BY3Rpdml0eURpYWdyYW1fRm9ya19Ob2RlX3Rvb2x0aXAsCi0JCQkJVU1MRWxlbWVudFR5cGVzLmdldEltYWdlRGVzY3JpcHRvcihVTUxQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJLmdldEZvcmtOb2RlKCksIFVNTEVsZW1lbnRUeXBlcy5Gb3JrTm9kZV8xMDAzKSk7IC8vJE5PTi1OTFMtMSQKLQotCQlnZXRBY3Rpb25SZWdpc3RyeSgpLnJlZ2lzdGVyQWN0aW9uKGFjdGlvbik7Ci0KLQkJZWxlbWVudFR5cGVzID0gbmV3IEFycmF5TGlzdDxJRWxlbWVudFR5cGU+KCk7Ci0JCWVsZW1lbnRUeXBlcy5hZGQoVU1MRWxlbWVudFR5cGVzLkpvaW5Ob2RlXzEwMDYpOwotCQlhY3Rpb24gPSBjcmVhdGVBbkFjdGlvbigKLQkJCQlEaWFncmFtQ29yZVJlc291cmNlcy5BY3Rpdml0eURpYWdyYW1fSm9pbl9Ob2RlX3RleHQsCi0JCQkJZWxlbWVudFR5cGVzLCAvLyROT04tTkxTLTEkCi0JCQkJRGlhZ3JhbUNvbnN0YW50cy5DUkVBVEVfSk9JTl9OT0RFLAotCQkJCURpYWdyYW1Db3JlUmVzb3VyY2VzLkFjdGl2aXR5RGlhZ3JhbV9Kb2luX05vZGVfdG9vbHRpcCwKLQkJCQlVTUxFbGVtZW50VHlwZXMuZ2V0SW1hZ2VEZXNjcmlwdG9yKFVNTFBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkuZ2V0Sm9pbk5vZGUoKSwgVU1MRWxlbWVudFR5cGVzLkpvaW5Ob2RlXzEwMDYpKTsgLy8kTk9OLU5MUy0xJAotCi0JCWdldEFjdGlvblJlZ2lzdHJ5KCkucmVnaXN0ZXJBY3Rpb24oYWN0aW9uKTsKLQotCQllbGVtZW50VHlwZXMgPSBuZXcgQXJyYXlMaXN0PElFbGVtZW50VHlwZT4oKTsKLQkJZWxlbWVudFR5cGVzLmFkZChVTUxFbGVtZW50VHlwZXMuRGVjaXNpb25Ob2RlXzEwMDUpOwotCQlhY3Rpb24gPSBjcmVhdGVBbkFjdGlvbigKLQkJCQlEaWFncmFtQ29yZVJlc291cmNlcy5BY3Rpdml0eURpYWdyYW1fRGVjaXNpb25Ob2RlX3RleHQsCi0JCQkJZWxlbWVudFR5cGVzLCAvLyROT04tTkxTLTEkCi0JCQkJRGlhZ3JhbUNvbnN0YW50cy5DUkVBVEVfREVDSVNJT05fTk9ERSwKLQkJCQlEaWFncmFtQ29yZVJlc291cmNlcy5BY3Rpdml0eURpYWdyYW1fRGVjaXNpb25Ob2RlX3Rvb2x0aXAsCi0JCQkJVU1MRWxlbWVudFR5cGVzLmdldEltYWdlRGVzY3JpcHRvcihVTUxQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJLmdldERlY2lzaW9uTm9kZSgpLCBVTUxFbGVtZW50VHlwZXMuRGVjaXNpb25Ob2RlXzEwMDUpKTsgLy8kTk9OLU5MUy0xJAotCi0JCWdldEFjdGlvblJlZ2lzdHJ5KCkucmVnaXN0ZXJBY3Rpb24oYWN0aW9uKTsKLQotCQllbGVtZW50VHlwZXMgPSBuZXcgQXJyYXlMaXN0PElFbGVtZW50VHlwZT4oKTsKLQkJZWxlbWVudFR5cGVzLmFkZChVTUxFbGVtZW50VHlwZXMuTWVyZ2VOb2RlXzEwMDIpOwotCQlhY3Rpb24gPSBjcmVhdGVBbkFjdGlvbigKLQkJCQlEaWFncmFtQ29yZVJlc291cmNlcy5BY3Rpdml0eURpYWdyYW1fTWVyZ2VfTm9kZV90ZXh0LAotCQkJCWVsZW1lbnRUeXBlcywgLy8kTk9OLU5MUy0xJAotCQkJCURpYWdyYW1Db25zdGFudHMuQ1JFQVRFX01FUkdFX05PREUsCi0JCQkJRGlhZ3JhbUNvcmVSZXNvdXJjZXMuQWN0aXZpdHlEaWFncmFtX01lcmdlX05vZGVfdG9vbHRpcCwKLQkJCQlVTUxFbGVtZW50VHlwZXMuZ2V0SW1hZ2VEZXNjcmlwdG9yKFVNTFBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkuZ2V0RGVjaXNpb25Ob2RlKCksIFVNTEVsZW1lbnRUeXBlcy5NZXJnZU5vZGVfMTAwMikpOyAvLyROT04tTkxTLTEkCi0KLQkJZ2V0QWN0aW9uUmVnaXN0cnkoKS5yZWdpc3RlckFjdGlvbihhY3Rpb24pOwotCi0JCWVsZW1lbnRUeXBlcyA9IG5ldyBBcnJheUxpc3Q8SUVsZW1lbnRUeXBlPigpOwotCQllbGVtZW50VHlwZXMuYWRkKFVNTEVsZW1lbnRUeXBlcy5BY3Rpdml0eUZpbmFsTm9kZV8xMDAxKTsKLQkJYWN0aW9uID0gY3JlYXRlQW5BY3Rpb24oCi0JCQkJRGlhZ3JhbUNvcmVSZXNvdXJjZXMuQWN0aXZpdHlEaWFncmFtX0VuZE5vZGVfdGV4dCwKLQkJCQllbGVtZW50VHlwZXMsIC8vJE5PTi1OTFMtMSQKLQkJCQlEaWFncmFtQ29uc3RhbnRzLkNSRUFURV9FTkRfTk9ERSwKLQkJCQlEaWFncmFtQ29yZVJlc291cmNlcy5BY3Rpdml0eURpYWdyYW1fRW5kTm9kZV90b29sdGlwLAotCQkJCVVNTEVsZW1lbnRUeXBlcy5nZXRJbWFnZURlc2NyaXB0b3IoVU1MUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCS5nZXRBY3Rpdml0eUZpbmFsTm9kZSgpLAotCQkJCQkJVU1MRWxlbWVudFR5cGVzLkFjdGl2aXR5RmluYWxOb2RlXzEwMDEpKTsgLy8kTk9OLU5MUy0xJAotCi0JCWdldEFjdGlvblJlZ2lzdHJ5KCkucmVnaXN0ZXJBY3Rpb24oYWN0aW9uKTsKLQotCQllbGVtZW50VHlwZXMgPSBuZXcgQXJyYXlMaXN0PElFbGVtZW50VHlwZT4oKTsKLQkJZWxlbWVudFR5cGVzLmFkZChVTUxFbGVtZW50VHlwZXMuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZV8xMDA3KTsKLQkJYWN0aW9uID0gY3JlYXRlQW5BY3Rpb24oCi0JCQkJRGlhZ3JhbUNvcmVSZXNvdXJjZXMuQWN0aXZpdHlEaWFncmFtX0FjdGl2aXR5X3RleHQsCi0JCQkJZWxlbWVudFR5cGVzLCAvLyROT04tTkxTLTEkCi0JCQkJRGlhZ3JhbUNvbnN0YW50cy5DUkVBVEVfQUNUSVZJVFksCi0JCQkJRGlhZ3JhbUNvcmVSZXNvdXJjZXMuQWN0aXZpdHlEaWFncmFtX0FjdGl2aXR5X3Rvb2x0aXAsCi0JCQkJVU1MRWxlbWVudFR5cGVzLmdldEltYWdlRGVzY3JpcHRvcihudWxsLAotCQkJCQkJVU1MRWxlbWVudFR5cGVzLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVfMTAwNykpOyAvLyROT04tTkxTLTEkCi0KLQkJZ2V0QWN0aW9uUmVnaXN0cnkoKS5yZWdpc3RlckFjdGlvbihhY3Rpb24pOwotCi0JCWVsZW1lbnRUeXBlcyA9IG5ldyBBcnJheUxpc3Q8SUVsZW1lbnRUeXBlPigpOwotCQllbGVtZW50VHlwZXMuYWRkKFVNTEVsZW1lbnRUeXBlcy5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlXzEwMTEpOwotCQlhY3Rpb24gPSBjcmVhdGVBbkFjdGlvbigKLQkJCQlEaWFncmFtQ29yZVJlc291cmNlcy5BY3Rpdml0eURpYWdyYW1fSXRlcmF0aW9uX3RleHQsCi0JCQkJZWxlbWVudFR5cGVzLCAvLyROT04tTkxTLTEkCi0JCQkJRGlhZ3JhbUNvbnN0YW50cy5DUkVBVEVfSVRFUkFUSU9OLAotCQkJCURpYWdyYW1Db3JlUmVzb3VyY2VzLkFjdGl2aXR5RGlhZ3JhbV9JdGVyYXRpb25fdG9vbHRpcCwKLQkJCQlVTUxFbGVtZW50VHlwZXMuZ2V0SW1hZ2VEZXNjcmlwdG9yKG51bGwsCi0JCQkJCQlVTUxFbGVtZW50VHlwZXMuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZV8xMDExKSk7IC8vJE5PTi1OTFMtMSQKLQotCQlnZXRBY3Rpb25SZWdpc3RyeSgpLnJlZ2lzdGVyQWN0aW9uKGFjdGlvbik7Ci0KLQkJZWxlbWVudFR5cGVzID0gbmV3IEFycmF5TGlzdDxJRWxlbWVudFR5cGU+KCk7Ci0JCWVsZW1lbnRUeXBlcy5hZGQoVU1MRWxlbWVudFR5cGVzLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVfMTAxMCk7Ci0JCWFjdGlvbiA9IGNyZWF0ZUFuQWN0aW9uKAotCQkJCURpYWdyYW1Db3JlUmVzb3VyY2VzLkFjdGl2aXR5RGlhZ3JhbV9QaGFzZV90ZXh0LAotCQkJCWVsZW1lbnRUeXBlcywgLy8kTk9OLU5MUy0xJAotCQkJCURpYWdyYW1Db25zdGFudHMuQ1JFQVRFX1BIQVNFLAotCQkJCURpYWdyYW1Db3JlUmVzb3VyY2VzLkFjdGl2aXR5RGlhZ3JhbV9QaGFzZV90b29sdGlwLAotCQkJCVVNTEVsZW1lbnRUeXBlcy5nZXRJbWFnZURlc2NyaXB0b3IobnVsbCwKLQkJCQkJCVVNTEVsZW1lbnRUeXBlcy5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlXzEwMTApKTsgLy8kTk9OLU5MUy0xJAotCi0JCWdldEFjdGlvblJlZ2lzdHJ5KCkucmVnaXN0ZXJBY3Rpb24oYWN0aW9uKTsKLQotCQllbGVtZW50VHlwZXMgPSBuZXcgQXJyYXlMaXN0PElFbGVtZW50VHlwZT4oKTsKLQkJZWxlbWVudFR5cGVzLmFkZChVTUxFbGVtZW50VHlwZXMuQWN0aXZpdHlQYXJhbWV0ZXJOb2RlXzEwMDkpOwotCQlhY3Rpb24gPSBjcmVhdGVBbkFjdGlvbigKLQkJCQlEaWFncmFtQ29yZVJlc291cmNlcy5BYnN0cmFjdERpYWdyYW1fVGFza0Rlc2NyaXB0b3JfdGV4dCwKLQkJCQllbGVtZW50VHlwZXMsIC8vJE5PTi1OTFMtMSQKLQkJCQlEaWFncmFtQ29uc3RhbnRzLkNSRUFURV9UQVNLX0RFU0NSSVBUT1IsCi0JCQkJRGlhZ3JhbUNvcmVSZXNvdXJjZXMuQWJzdHJhY3REaWFncmFtX1Rhc2tEZXNjcmlwdG9yX3Rvb2x0aXAsCi0JCQkJVU1MRWxlbWVudFR5cGVzLmdldEltYWdlRGVzY3JpcHRvcihudWxsLAotCQkJCQkJVU1MRWxlbWVudFR5cGVzLkFjdGl2aXR5UGFyYW1ldGVyTm9kZV8xMDA5KSk7IC8vJE5PTi1OTFMtMSQKLQotCQlnZXRBY3Rpb25SZWdpc3RyeSgpLnJlZ2lzdGVyQWN0aW9uKGFjdGlvbik7Ci0KLQkJZWxlbWVudFR5cGVzID0gbmV3IEFycmF5TGlzdDxJRWxlbWVudFR5cGU+KCk7Ci0JCWVsZW1lbnRUeXBlcy5hZGQoVU1MRWxlbWVudFR5cGVzLkFjdGl2aXR5UGFyYW1ldGVyTm9kZV8xMDEyKTsKLQkJYWN0aW9uID0gY3JlYXRlQW5BY3Rpb24oCi0JCQkJRGlhZ3JhbUNvcmVSZXNvdXJjZXMuQWN0aXZpdHlEaWFncmFtX01pbGVzdG9uZV90ZXh0LAotCQkJCWVsZW1lbnRUeXBlcywgLy8kTk9OLU5MUy0xJAotCQkJCURpYWdyYW1Db25zdGFudHMuQ1JFQVRFX01JTEVTVE9ORSwKLQkJCQlEaWFncmFtQ29yZVJlc291cmNlcy5BY3Rpdml0eURpYWdyYW1fTWlsZXN0b25lX3Rvb2x0aXAsCi0JCQkJVU1MRWxlbWVudFR5cGVzLmdldEltYWdlRGVzY3JpcHRvcihudWxsLAotCQkJCQkJVU1MRWxlbWVudFR5cGVzLkFjdGl2aXR5UGFyYW1ldGVyTm9kZV8xMDEyKSk7IC8vJE5PTi1OTFMtMSQKLQotCQlnZXRBY3Rpb25SZWdpc3RyeSgpLnJlZ2lzdGVyQWN0aW9uKGFjdGlvbik7Ci0KLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBlbmFibGVBRERNZW51KEVPYmplY3QgZWxlbWVudCkgewotCQlOb2RlQWRhcHRlciBhZGFwdGVyID0gQnJpZGdlSGVscGVyCi0JCQkJLmdldE5vZGVBZGFwdGVyKChBY3Rpdml0eU5vZGUpIGVsZW1lbnQpOwotCQlpZiAoYWRhcHRlciAhPSBudWxsKSB7Ci0JCQlPYmplY3Qgc2VsZWN0ZWRPYmplY3QgPSBhZGFwdGVyLmdldFdyYXBwZXIoKTsKLQkJCWlmIChzZWxlY3RlZE9iamVjdCA9PSBudWxsKSB7Ci0JCQkJc2VsZWN0ZWRPYmplY3QgPSBhZGFwdGVyLmdldEVsZW1lbnQoKTsKLQkJCX0KLQkJCUFjdGl2aXR5IGFjdGl2aXR5ID0gbnVsbDsKLQkJCUxpc3Q8QnJlYWtkb3duRWxlbWVudD4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8QnJlYWtkb3duRWxlbWVudD4oKTsKLQotCQkJaWYgKHNlbGVjdGVkT2JqZWN0IGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQlhY3Rpdml0eSA9IChBY3Rpdml0eSkgc2VsZWN0ZWRPYmplY3Q7Ci0JCQl9IGVsc2UgaWYgKHNlbGVjdGVkT2JqZWN0IGluc3RhbmNlb2YgQWN0aXZpdHlXcmFwcGVySXRlbVByb3ZpZGVyKSB7Ci0JCQkJYWN0aXZpdHkgPSAoQWN0aXZpdHkpICgoQWN0aXZpdHlXcmFwcGVySXRlbVByb3ZpZGVyKSBzZWxlY3RlZE9iamVjdCkKLQkJCQkJCS5nZXRWYWx1ZSgpOwotCQkJfQotCQkJaWYgKGFjdGl2aXR5ID09IG51bGwpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJd2hpbGUgKCFhY3Rpdml0eS5nZXRWYXJpYWJpbGl0eVR5cGUoKS5lcXVhbHMoCi0JCQkJCVZhcmlhYmlsaXR5VHlwZS5OQSkpIHsKLQotCQkJCVZhcmlhYmlsaXR5RWxlbWVudCB2ZSA9IGFjdGl2aXR5LmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsKLQkJCQlsaXN0LmFkZEFsbChhY3Rpdml0eS5nZXRCcmVha2Rvd25FbGVtZW50cygpKTsKLQotCQkJCWlmICgodmUgIT0gbnVsbCkgJiYgKHZlIGluc3RhbmNlb2YgQWN0aXZpdHkpKSB7Ci0JCQkJCWFjdGl2aXR5ID0gKEFjdGl2aXR5KSB2ZTsKLQkJCQl9IGVsc2UgewotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCQkvL0NvbGxlY3QgdGhlIGJyZWFrZG93biBlbGVtZW50cyB0byB2ZXJpZnkgdGFza2Rlc2NyaXB0b3JzIGFyZQotCQkJLy8gbm90LgotCQkJbGlzdC5hZGRBbGwoYWN0aXZpdHkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKSk7Ci0JCQlEaWFncmFtIGRpYWdyYW0gPSBnZXREaWFncmFtKGFjdGl2aXR5LAotCQkJCQlJRGlhZ3JhbU1hbmFnZXIuQUNUSVZJVFlfREVUQUlMX0RJQUdSQU0pOwotCi0JCQlpZiAoZGlhZ3JhbSA9PSBudWxsCi0JCQkJCSYmIHNlbGVjdGVkT2JqZWN0IGluc3RhbmNlb2YgQWN0aXZpdHlXcmFwcGVySXRlbVByb3ZpZGVyKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfSBlbHNlIHsKLQkJCQkvLyBJdGVyYXRlIHRocm91Z2ggdGhlIExpc3QsIHRvIGZpbmQgdGFza2Rlc2NyaXB0b3IgYW5kIGhhcwotCQkJCS8vIHByaW1hcnkgcm9sZSB3aXRoaW4gY3VycmVudCBjb25maWd1cmF0aW9uLgotCQkJCS8vIHRoZW4gZW5hYmxlIHRoZSBhY3Rpb24uCi0JCQkJRGlhZ3JhbUFkYXB0ZXIgZGlhZ3JhbUFkYXB0ZXIgPSBCcmlkZ2VIZWxwZXIKLQkJCQkJCS5nZXREaWFncmFtQWRhcHRlcihnZXREaWFncmFtKCkuZ2V0RWxlbWVudCgpKTsKLQkJCQlTdXBwcmVzc2lvbiBzdXBwcmVzc2lvbiA9IGRpYWdyYW1BZGFwdGVyLmdldFN1cHByZXNzaW9uKCk7Ci0JCQkJZm9yIChJdGVyYXRvcjw/PiBpdGVyYXRvciA9IGxpc3QuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJCQlPYmplY3Qgb2JqID0gaXRlcmF0b3IubmV4dCgpOwotCQkJCQlpZiAob2JqIGluc3RhbmNlb2YgVGFza0Rlc2NyaXB0b3IpIHsKLQkJCQkJCWlmIChzdXBwcmVzc2lvbiAhPSBudWxsKSB7Ci0JCQkJCQkJaWYgKHN1cHByZXNzaW9uLmlzU3VwcHJlc3NlZChvYmopKQotCQkJCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCQl9Ci0JCQkJCQlpZiAoZGlhZ3JhbUFkYXB0ZXIuZ2V0U3VwcHJlc3Npb24oKSAhPSBudWxsKSB7Ci0JCQkJCQkJTGlzdDxSb2xlRGVzY3JpcHRvcj4gcm9sZURlc2NMaXN0ID0gKChUYXNrRGVzY3JpcHRvcikgb2JqKQotCQkJCQkJCQkJLmdldFBlcmZvcm1lZFByaW1hcmlseUJ5KCk7Ci0JCQkJCQkJZm9yIChSb2xlRGVzY3JpcHRvciByb2xlRGVzY3JpcHRvciA6IHJvbGVEZXNjTGlzdCkgewotCQkJCQkJCQlpZiAoIWRpYWdyYW1BZGFwdGVyLmdldFN1cHByZXNzaW9uKCkKLQkJCQkJCQkJCQkuaXNTdXBwcmVzc2VkKHJvbGVEZXNjcmlwdG9yKSkgewotCQkJCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQkJfQotCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGNvbnRyaWJ1dGVUb0NvbnRleHRNZW51KElNZW51TWFuYWdlciBtZW51KSB7Ci0JCXN1cGVyLmNvbnRyaWJ1dGVUb0NvbnRleHRNZW51KG1lbnUpOwotCQlhZGRUb01lbnUobWVudSwgRGlhZ3JhbUNvbnN0YW50cy5PUEVOX0FDVElWSVRZX0RFVEFJTF9ESUFHUkFNLAotCQkJCUdFRkFjdGlvbkNvbnN0YW50cy5NQl9BRERJVElPTlMsIHRydWUsIHRydWUpOwotCQlJQ29udHJpYnV0aW9uSXRlbSBpdGVtID0gbWVudS5maW5kKEFjdGlvbklkcy5NRU5VX0RJQUdSQU1fQUREKTsKLQkJaWYgKGl0ZW0gIT0gbnVsbCAmJiBpdGVtIGluc3RhbmNlb2YgSU1lbnVNYW5hZ2VyKSB7Ci0JCQlJTWVudU1hbmFnZXIgYWRkTWVudSA9IChJTWVudU1hbmFnZXIpIGl0ZW07Ci0JCQlTdHJpbmcgZ3JvdXBOYW1lID0gRGlhZ3JhbUNvbnN0YW50cy5ESUFHUkFNX0FERF9NRU5VX0dFTkVSQUxfR1JPVVA7Ci0JCQlpZiAoZ2V0R3JhcGhpY2FsVmlld2VyKCkuZ2V0U2VsZWN0ZWRFZGl0UGFydHMoKS5zaXplKCkgPT0gMCkgewotCQkJCWFkZFRvTWVudShhZGRNZW51LCBudWxsLCBncm91cE5hbWUsIHRydWUsIHRydWUpOwotCQkJCWFkZFRvTWVudShhZGRNZW51LCBEaWFncmFtQ29uc3RhbnRzLkNSRUFURV9QQVJUSVRJT04sCi0JCQkJCQlncm91cE5hbWUsIGZhbHNlLCB0cnVlKTsKLQkJCQlhZGRUb01lbnUoYWRkTWVudSwgRGlhZ3JhbUNvbnN0YW50cy5DUkVBVEVfU1RBUlRfTk9ERSwKLQkJCQkJCWdyb3VwTmFtZSwgZmFsc2UsIHRydWUpOwotCQkJCWFkZFRvTWVudShhZGRNZW51LCBEaWFncmFtQ29uc3RhbnRzLkNSRUFURV9FTkRfTk9ERSwgZ3JvdXBOYW1lLAotCQkJCQkJZmFsc2UsIHRydWUpOwkJCi0JCQkJYWRkVG9NZW51KGFkZE1lbnUsIERpYWdyYW1Db25zdGFudHMuQ1JFQVRFX0ZPUktfTk9ERSwKLQkJCQkJCWdyb3VwTmFtZSwgZmFsc2UsIHRydWUpOwotCQkJCWFkZFRvTWVudShhZGRNZW51LCBEaWFncmFtQ29uc3RhbnRzLkNSRUFURV9KT0lOX05PREUsIAotCQkJCQkJZ3JvdXBOYW1lLCBmYWxzZSwgdHJ1ZSk7Ci0JCQkJYWRkVG9NZW51KGFkZE1lbnUsIERpYWdyYW1Db25zdGFudHMuQ1JFQVRFX0RFQ0lTSU9OX05PREUsCi0JCQkJCQlncm91cE5hbWUsIGZhbHNlLCB0cnVlKTsKLQkJCQlhZGRUb01lbnUoYWRkTWVudSwgRGlhZ3JhbUNvbnN0YW50cy5DUkVBVEVfTUVSR0VfTk9ERSwKLQkJCQkJCWdyb3VwTmFtZSwgdHJ1ZSwgdHJ1ZSk7CQotCQkJCWFkZFRvTWVudShhZGRNZW51LCBEaWFncmFtQ29uc3RhbnRzLkNSRUFURV9BQ1RJVklUWSwgZ3JvdXBOYW1lLAotCQkJCQkJZmFsc2UsIHRydWUpOwotCQkJCWFkZFRvTWVudShhZGRNZW51LCBEaWFncmFtQ29uc3RhbnRzLkNSRUFURV9JVEVSQVRJT04sCi0JCQkJCQlncm91cE5hbWUsIGZhbHNlLCB0cnVlKTsKLQkJCQlhZGRUb01lbnUoYWRkTWVudSwgRGlhZ3JhbUNvbnN0YW50cy5DUkVBVEVfUEhBU0UsIGdyb3VwTmFtZSwKLQkJCQkJCWZhbHNlLCB0cnVlKTsKLQkJCQlhZGRUb01lbnUoYWRkTWVudSwgRGlhZ3JhbUNvbnN0YW50cy5DUkVBVEVfTUlMRVNUT05FLAotCQkJCQkJZ3JvdXBOYW1lLCBmYWxzZSwgdHJ1ZSk7Ci0JCQkJYWRkVG9NZW51KGFkZE1lbnUsIERpYWdyYW1Db25zdGFudHMuQ1JFQVRFX1RBU0tfREVTQ1JJUFRPUiwKLQkJCQkJCWdyb3VwTmFtZSwgdHJ1ZSwgdHJ1ZSk7Ci0JCQkJCi0JCQl9Ci0JCX0KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFBhcnROYW1lUHJlZml4KCkgewotCQlNZXRob2RFbGVtZW50IGUgPSBnZXRNZXRob2RFbGVtZW50RnJvbUlucHV0KCk7Ci0JCWlmIChlIGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCXJldHVybiBnZXRUeXBlTmFtZSgoQWN0aXZpdHkpIGUpICsgIjogIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwcm90ZWN0ZWQgSW1hZ2UgZ2V0UGFydEltYWdlKCkgewotCQlyZXR1cm4gQWN0aXZpdHlEaWFncmFtRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0U2hhcmVkSW1hZ2UoCi0JCQkJImZ1bGwvZXRvb2wxNi9BREVkaXRvci5naWYiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRUeXBlTmFtZShBY3Rpdml0eSBhY3QpIHsKLQkJaWYgKGFjdCBpbnN0YW5jZW9mIERlbGl2ZXJ5UHJvY2VzcykgewotCQkJcmV0dXJuIERpYWdyYW1Db3JlUmVzb3VyY2VzLkFjdHZpdGl2aXR5RGlhZ3JhbV9EZWxpdmVyeVByb2Nlc3NfdGV4dDsgLy8kTk9OLU5MUy0xJAotCQl9IGVsc2UgaWYgKGFjdCBpbnN0YW5jZW9mIENhcGFiaWxpdHlQYXR0ZXJuKSB7Ci0JCQlyZXR1cm4gRGlhZ3JhbUNvcmVSZXNvdXJjZXMuQWN0dml0aXZpdHlEaWFncmFtX0NhcGFiaWxpdHlQYXR0ZXJuX3RleHQ7IC8vJE5PTi1OTFMtMSQKLQkJfSBlbHNlIGlmIChhY3QgaW5zdGFuY2VvZiBQaGFzZSkgewotCQkJcmV0dXJuIERpYWdyYW1Db3JlUmVzb3VyY2VzLkFjdHZpdGl2aXR5RGlhZ3JhbV9QaGFzZV90ZXg7IC8vJE5PTi1OTFMtMSQKLQkJfSBlbHNlIGlmIChhY3QgaW5zdGFuY2VvZiBJdGVyYXRpb24pIHsKLQkJCXJldHVybiBEaWFncmFtQ29yZVJlc291cmNlcy5BY3R2aXRpdml0eURpYWdyYW1fSXRlcmF0aW9uX3RleHQ7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gRGlhZ3JhbUNvcmVSZXNvdXJjZXMuQWN0dml0aXZpdHlEaWFncmFtX0FjdGl2aXR5X3RleHQ7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgZWRnZSBmb3IgQUQgZGlhZ3JhbQotCSAqIAotCSAqIEBwYXJhbSBzb3VyY2VOb2RlCi0JICogQHBhcmFtIHRhcmdldE5vZGUKLQkgKiBAcGFyYW0gYWN0RWRnZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgRWRnZSBjcmVhdGVFZGdlKE5vZGUgc291cmNlTm9kZSwgTm9kZSB0YXJnZXROb2RlLAotCQkJQWN0aXZpdHlFZGdlIGFjdEVkZ2UpIHsKLQkJaWYgKGFjdEVkZ2UgaW5zdGFuY2VvZiBDb250cm9sRmxvdykgewotCQkJRWRnZSBlZGdlID0gVmlld1NlcnZpY2UuY3JlYXRlRWRnZShzb3VyY2VOb2RlLCB0YXJnZXROb2RlLCBhY3RFZGdlLAotCQkJCQluZXcgSW50ZWdlcihDb250cm9sRmxvd0VkaXRQYXJ0LlZJU1VBTF9JRCkudG9TdHJpbmcoKSwKLQkJCQkJQWN0aXZpdHlEaWFncmFtRWRpdG9yUGx1Z2luLkRJQUdSQU1fUFJFRkVSRU5DRVNfSElOVCk7Ci0JCQlWaWV3U2VydmljZS5jcmVhdGVOb2RlKGVkZ2UsIGFjdEVkZ2UsIG5ldyBJbnRlZ2VyKAotCQkJCQlDb250cm9sRmxvd05hbWVFZGl0UGFydC5WSVNVQUxfSUQpLnRvU3RyaW5nKCksCi0JCQkJCUFjdGl2aXR5RGlhZ3JhbUVkaXRvclBsdWdpbi5ESUFHUkFNX1BSRUZFUkVOQ0VTX0hJTlQpOwotCQkJcmV0dXJuIGVkZ2U7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIENyZWF0ZVVuc3BlY2lmaWVkVHlwZUNvbm5lY3Rpb25SZXF1ZXN0IGdldENyZWF0ZUNvbnRyb2xGbG93UmVxdWVzdCgpIHsKLQkJTGlzdDxJRWxlbWVudFR5cGU+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PElFbGVtZW50VHlwZT4oKTsKLQkJbGlzdC5hZGQoVU1MRWxlbWVudFR5cGVzLkNvbnRyb2xGbG93XzMwMDEpOwotCQlDcmVhdGVVbnNwZWNpZmllZFR5cGVDb25uZWN0aW9uUmVxdWVzdCBjb25uZWN0aW9uUmVxdWVzdCA9IG5ldyBDcmVhdGVVbnNwZWNpZmllZFR5cGVDb25uZWN0aW9uUmVxdWVzdCgKLQkJCQlsaXN0LCBmYWxzZSwKLQkJCQlBY3Rpdml0eURpYWdyYW1FZGl0b3JQbHVnaW4uRElBR1JBTV9QUkVGRVJFTkNFU19ISU5UKTsKLQkJcmV0dXJuIGNvbm5lY3Rpb25SZXF1ZXN0OwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9wYXJ0L0FjdGl2aXR5RGlhZ3JhbUVkaXRvclBsdWdpbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL3BhcnQvQWN0aXZpdHlEaWFncmFtRWRpdG9yUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkNzk5NzkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL3BhcnQvQWN0aXZpdHlEaWFncmFtRWRpdG9yUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5wYXJ0OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucHJvdmlkZXIuRWNvcmVJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlZEFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5SZWZsZWN0aXZlSXRlbVByb3ZpZGVyQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIucmVzb3VyY2UuUmVzb3VyY2VJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5FeHRlbmRlZEltYWdlUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS5BYnN0cmFjdFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5BY3Rpdml0eURpYWdyYW1QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLnByZWZlcmVuY2VzLlByZWZlcmVuY2VzSGludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLmVkaXQucHJvdmlkZXJzLlVNTEl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotCi0vKioKLSAqIEBtb2RpZmllZAotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZpdHlEaWFncmFtRWRpdG9yUGx1Z2luIGV4dGVuZHMgQWN0aXZpdHlEaWFncmFtUGx1Z2luIHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJRCA9ICJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFByZWZlcmVuY2VzSGludCBESUFHUkFNX1BSRUZFUkVOQ0VTX0hJTlQgPSBuZXcgUHJlZmVyZW5jZXNIaW50KAotCQkJSUQpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIEFjdGl2aXR5RGlhZ3JhbUVkaXRvclBsdWdpbiBpbnN0YW5jZTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIENvbXBvc2VkQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3Rvcnk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBVTUxEb2N1bWVudFByb3ZpZGVyIG15RG9jdW1lbnRQcm92aWRlcjsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWN0aXZpdHlEaWFncmFtRWRpdG9yUGx1Z2luKCkgewotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdGFydChjb250ZXh0KTsKLQkJaW5zdGFuY2UgPSB0aGlzOwotCQlQcmVmZXJlbmNlc0hpbnQucmVnaXN0ZXJQcmVmZXJlbmNlU3RvcmUoRElBR1JBTV9QUkVGRVJFTkNFU19ISU5ULAotCQkJCWdldFByZWZlcmVuY2VTdG9yZSgpKTsKLQkJYWRhcHRlckZhY3RvcnkgPSBjcmVhdGVBZGFwdGVyRmFjdG9yeSgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFkYXB0ZXJGYWN0b3J5LmRpc3Bvc2UoKTsKLQkJYWRhcHRlckZhY3RvcnkgPSBudWxsOwotCQlpbnN0YW5jZSA9IG51bGw7Ci0JCXN1cGVyLnN0b3AoY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgQWN0aXZpdHlEaWFncmFtRWRpdG9yUGx1Z2luIGdldEluc3RhbmNlKCkgewotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IGNyZWF0ZUFkYXB0ZXJGYWN0b3J5KCkgewotCQlMaXN0IGZhY3RvcmllcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZmlsbEl0ZW1Qcm92aWRlckZhY3RvcmllcyhmYWN0b3JpZXMpOwotCQlyZXR1cm4gbmV3IENvbXBvc2VkQWRhcHRlckZhY3RvcnkoZmFjdG9yaWVzKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZmlsbEl0ZW1Qcm92aWRlckZhY3RvcmllcyhMaXN0IGZhY3RvcmllcykgewotCQlmYWN0b3JpZXMuYWRkKG5ldyBVTUxJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpKTsKLQkJZmFjdG9yaWVzLmFkZChuZXcgRWNvcmVJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpKTsKLQkJZmFjdG9yaWVzLmFkZChuZXcgUmVzb3VyY2VJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpKTsKLQkJZmFjdG9yaWVzLmFkZChuZXcgUmVmbGVjdGl2ZUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlckZhY3RvcnkgZ2V0SXRlbVByb3ZpZGVyc0FkYXB0ZXJGYWN0b3J5KCkgewotCQlyZXR1cm4gYWRhcHRlckZhY3Rvcnk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJbWFnZURlc2NyaXB0b3IgZ2V0SXRlbUltYWdlRGVzY3JpcHRvcihPYmplY3QgaXRlbSkgewotCQlJSXRlbUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlciA9IChJSXRlbUxhYmVsUHJvdmlkZXIpIGFkYXB0ZXJGYWN0b3J5Ci0JCQkJLmFkYXB0KGl0ZW0sIElJdGVtTGFiZWxQcm92aWRlci5jbGFzcyk7Ci0JCWlmIChsYWJlbFByb3ZpZGVyICE9IG51bGwpIHsKLQkJCXJldHVybiBFeHRlbmRlZEltYWdlUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZURlc2NyaXB0b3IoCi0JCQkJCWxhYmVsUHJvdmlkZXIuZ2V0SW1hZ2UoaXRlbSkpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYW4gaW1hZ2UgZGVzY3JpcHRvciBmb3IgdGhlIGltYWdlIGZpbGUgYXQgdGhlIGdpdmVuCi0JICogcGx1Zy1pbiByZWxhdGl2ZSBwYXRoLgotCSAqCi0JICogQGdlbmVyYXRlZAotCSAqIEBwYXJhbSBwYXRoIHRoZSBwYXRoCi0JICogQHJldHVybiB0aGUgaW1hZ2UgZGVzY3JpcHRvcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSW1hZ2VEZXNjcmlwdG9yIGdldEJ1bmRsZWRJbWFnZURlc2NyaXB0b3IoU3RyaW5nIHBhdGgpIHsKLQkJcmV0dXJuIEFic3RyYWN0VUlQbHVnaW4uaW1hZ2VEZXNjcmlwdG9yRnJvbVBsdWdpbihJRCwgcGF0aCk7Ci0JfQotCi0JLyoqCi0JICogUmVzcGVjdHMgaW1hZ2VzIHJlc2lkaW5nIGluIGFueSBwbHVnLWluLiBJZiBwYXRoIGlzIHJlbGF0aXZlLAotCSAqIHRoZW4gdGhpcyBidW5kbGUgaXMgbG9va2VkIHVwIGZvciB0aGUgaW1hZ2UsIG90aGVyd2lzZSwgZm9yIGFic29sdXRlIAotCSAqIHBhdGgsIGZpcnN0IHNlZ21lbnQgaXMgdGFrZW4gYXMgaWQgb2YgcGx1Zy1pbiB3aXRoIGltYWdlCi0JICoKLQkgKiBAZ2VuZXJhdGVkCi0JICogQHBhcmFtIHBhdGggdGhlIHBhdGggdG8gaW1hZ2UsIGVpdGhlciBhYnNvbHV0ZSAod2l0aCBwbHVnLWluIGlkIGFzIGZpcnN0IHNlZ21lbnQpLCBvciByZWxhdGl2ZSBmb3IgYnVuZGxlZCBpbWFnZXMKLQkgKiBAcmV0dXJuIHRoZSBpbWFnZSBkZXNjcmlwdG9yCi0JICovCi0JcHVibGljIHN0YXRpYyBJbWFnZURlc2NyaXB0b3IgZmluZEltYWdlRGVzY3JpcHRvcihTdHJpbmcgcGF0aCkgewotCQlmaW5hbCBJUGF0aCBwID0gbmV3IFBhdGgocGF0aCk7Ci0JCWlmIChwLmlzQWJzb2x1dGUoKSAmJiBwLnNlZ21lbnRDb3VudCgpID4gMSkgewotCQkJcmV0dXJuIEFic3RyYWN0VUlQbHVnaW4uaW1hZ2VEZXNjcmlwdG9yRnJvbVBsdWdpbihwLnNlZ21lbnQoMCksIHAKLQkJCQkJLnJlbW92ZUZpcnN0U2VnbWVudHMoMSkubWFrZUFic29sdXRlKCkudG9TdHJpbmcoKSk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gZ2V0QnVuZGxlZEltYWdlRGVzY3JpcHRvcihwLm1ha2VBYnNvbHV0ZSgpLnRvU3RyaW5nKCkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBzdHJpbmcgZnJvbSBwbHVnLWluJ3MgcmVzb3VyY2UgYnVuZGxlCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIGtleSkgewotCQlyZXR1cm4gUGxhdGZvcm0uZ2V0UmVzb3VyY2VTdHJpbmcoZ2V0SW5zdGFuY2UoKS5nZXRCdW5kbGUoKSwgIiUiICsga2V5KTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYW4gaW1hZ2UgZm9yIHRoZSBpbWFnZSBmaWxlIGF0IHRoZSBnaXZlbiBwbHVnLWluIHJlbGF0aXZlIHBhdGguCi0JICogQ2xpZW50IGRvIG5vdCBuZWVkIHRvIGRpc3Bvc2UgdGhpcyBpbWFnZS4gSW1hZ2VzIHdpbGwgYmUgZGlzcG9zZWQgYXV0b21hdGljYWxseS4KLQkgKgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAcGFyYW0gcGF0aCB0aGUgcGF0aAotCSAqIEByZXR1cm4gaW1hZ2UgaW5zdGFuY2UKLQkgKi8KLQlwdWJsaWMgSW1hZ2UgZ2V0QnVuZGxlZEltYWdlKFN0cmluZyBwYXRoKSB7Ci0JCUltYWdlIGltYWdlID0gZ2V0SW1hZ2VSZWdpc3RyeSgpLmdldChwYXRoKTsKLQkJaWYgKGltYWdlID09IG51bGwpIHsKLQkJCWdldEltYWdlUmVnaXN0cnkoKS5wdXQocGF0aCwgZ2V0QnVuZGxlZEltYWdlRGVzY3JpcHRvcihwYXRoKSk7Ci0JCQlpbWFnZSA9IGdldEltYWdlUmVnaXN0cnkoKS5nZXQocGF0aCk7Ci0JCX0KLQkJcmV0dXJuIGltYWdlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVU1MRG9jdW1lbnRQcm92aWRlciBnZXREb2N1bWVudFByb3ZpZGVyKCkgewotCQlpZiAobXlEb2N1bWVudFByb3ZpZGVyID09IG51bGwpIHsKLQkJCW15RG9jdW1lbnRQcm92aWRlciA9IG5ldyBVTUxEb2N1bWVudFByb3ZpZGVyKCk7Ci0JCX0KLQkJcmV0dXJuIG15RG9jdW1lbnRQcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgbG9nRXJyb3IoU3RyaW5nIGVycm9yKSB7Ci0JCWxvZ0Vycm9yKGVycm9yLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gdGhyb3dhYmxlIGFjdHVhbCBlcnJvciBvciBudWxsIGNvdWxkIGJlIHBhc3NlZAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBsb2dFcnJvcihTdHJpbmcgZXJyb3IsIFRocm93YWJsZSB0aHJvd2FibGUpIHsKLQkJaWYgKGVycm9yID09IG51bGwgJiYgdGhyb3dhYmxlICE9IG51bGwpIHsKLQkJCWVycm9yID0gdGhyb3dhYmxlLmdldE1lc3NhZ2UoKTsKLQkJfQotCQlnZXRMb2coKS5sb2coCi0JCQkJbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBBY3Rpdml0eURpYWdyYW1FZGl0b3JQbHVnaW4uSUQsCi0JCQkJCQlJU3RhdHVzLk9LLCBlcnJvciwgdGhyb3dhYmxlKSk7Ci0JCWRlYnVnKGVycm9yLCB0aHJvd2FibGUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBsb2dJbmZvKFN0cmluZyBtZXNzYWdlKSB7Ci0JCWxvZ0luZm8obWVzc2FnZSwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHRocm93YWJsZSBhY3R1YWwgZXJyb3Igb3IgbnVsbCBjb3VsZCBiZSBwYXNzZWQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgbG9nSW5mbyhTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIHRocm93YWJsZSkgewotCQlpZiAobWVzc2FnZSA9PSBudWxsICYmIHRocm93YWJsZSAhPSBudWxsKSB7Ci0JCQltZXNzYWdlID0gdGhyb3dhYmxlLmdldE1lc3NhZ2UoKTsKLQkJfQotCQlnZXRMb2coKS5sb2coCi0JCQkJbmV3IFN0YXR1cyhJU3RhdHVzLklORk8sIEFjdGl2aXR5RGlhZ3JhbUVkaXRvclBsdWdpbi5JRCwKLQkJCQkJCUlTdGF0dXMuT0ssIG1lc3NhZ2UsIHRocm93YWJsZSkpOwotCQlkZWJ1ZyhtZXNzYWdlLCB0aHJvd2FibGUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHZvaWQgZGVidWcoU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSB0aHJvd2FibGUpIHsKLQkJaWYgKCFpc0RlYnVnZ2luZygpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKG1lc3NhZ2UgIT0gbnVsbCkgewotCQkJU3lzdGVtLmVyci5wcmludGxuKG1lc3NhZ2UpOwotCQl9Ci0JCWlmICh0aHJvd2FibGUgIT0gbnVsbCkgewotCQkJdGhyb3dhYmxlLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvcGFydC9NZXNzYWdlcy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL3BhcnQvTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTliZGMzMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvcGFydC9NZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQucGFydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgTWVzc2FnZXMgZXh0ZW5kcyBOTFMgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXN0YXRpYyB7Ci0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoIm1lc3NhZ2VzIiwgTWVzc2FnZXMuY2xhc3MpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgTWVzc2FnZXMoKSB7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVNTERpYWdyYW1FZGl0b3JVdGlsX09wZW5Nb2RlbFJlc291cmNlRXJyb3JEaWFsb2dUaXRsZTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVTUxEaWFncmFtRWRpdG9yVXRpbF9PcGVuTW9kZWxSZXNvdXJjZUVycm9yRGlhbG9nTWVzc2FnZTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVTUxEaWFncmFtRWRpdG9yVXRpbF9DcmVhdGVEaWFncmFtUHJvZ3Jlc3NUYXNrOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVNTERpYWdyYW1FZGl0b3JVdGlsX0NyZWF0ZURpYWdyYW1Db21tYW5kTGFiZWw7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgVU1MRG9jdW1lbnRQcm92aWRlcl9pc01vZGlmaWFibGU7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgVU1MRG9jdW1lbnRQcm92aWRlcl9oYW5kbGVFbGVtZW50Q29udGVudENoYW5nZWQ7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgVU1MRG9jdW1lbnRQcm92aWRlcl9JbmNvcnJlY3RJbnB1dEVycm9yOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVNTERvY3VtZW50UHJvdmlkZXJfVW5hYmxlVG9Mb2FkUmVzb3VyY2VFcnJvcjsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVTUxEb2N1bWVudFByb3ZpZGVyX05vRGlhZ3JhbUluUmVzb3VyY2VFcnJvcjsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVTUxEb2N1bWVudFByb3ZpZGVyX0RpYWdyYW1Mb2FkaW5nRXJyb3I7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgVU1MRG9jdW1lbnRQcm92aWRlcl9VbnN5bmNocm9uaXplZEZpbGVTYXZlRXJyb3I7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgVU1MRG9jdW1lbnRQcm92aWRlcl9TYXZlRGlhZ3JhbVRhc2s7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgVU1MRG9jdW1lbnRQcm92aWRlcl9TYXZlTmV4dFJlc291cmNlVGFzazsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVTUxJbml0RGlhZ3JhbUZpbGVBY3Rpb25fSW5pdERpYWdyYW1GaWxlUmVzb3VyY2VFcnJvckRpYWxvZ1RpdGxlOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVNTEluaXREaWFncmFtRmlsZUFjdGlvbl9Jbml0RGlhZ3JhbUZpbGVSZXNvdXJjZUVycm9yRGlhbG9nTWVzc2FnZTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVTUxJbml0RGlhZ3JhbUZpbGVBY3Rpb25fSW5pdERpYWdyYW1GaWxlV2l6YXJkVGl0bGU7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgVU1MSW5pdERpYWdyYW1GaWxlQWN0aW9uX09wZW5Nb2RlbEZpbGVEaWFsb2dUaXRsZTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVTUxOZXdEaWFncmFtRmlsZVdpemFyZF9DcmVhdGlvblBhZ2VOYW1lOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVNTE5ld0RpYWdyYW1GaWxlV2l6YXJkX0NyZWF0aW9uUGFnZVRpdGxlOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVNTE5ld0RpYWdyYW1GaWxlV2l6YXJkX0NyZWF0aW9uUGFnZURlc2NyaXB0aW9uOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVNTE5ld0RpYWdyYW1GaWxlV2l6YXJkX1Jvb3RTZWxlY3Rpb25QYWdlTmFtZTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVTUxOZXdEaWFncmFtRmlsZVdpemFyZF9Sb290U2VsZWN0aW9uUGFnZVRpdGxlOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVNTE5ld0RpYWdyYW1GaWxlV2l6YXJkX1Jvb3RTZWxlY3Rpb25QYWdlRGVzY3JpcHRpb247Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgVU1MTmV3RGlhZ3JhbUZpbGVXaXphcmRfUm9vdFNlbGVjdGlvblBhZ2VTZWxlY3Rpb25UaXRsZTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVTUxOZXdEaWFncmFtRmlsZVdpemFyZF9Sb290U2VsZWN0aW9uUGFnZU5vU2VsZWN0aW9uTWVzc2FnZTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVTUxOZXdEaWFncmFtRmlsZVdpemFyZF9Sb290U2VsZWN0aW9uUGFnZUludmFsaWRTZWxlY3Rpb25NZXNzYWdlOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVNTE5ld0RpYWdyYW1GaWxlV2l6YXJkX0luaXREaWFncmFtQ29tbWFuZDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVTUxOZXdEaWFncmFtRmlsZVdpemFyZF9JbmNvcnJlY3RSb290RXJyb3I7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRmxvd3MxR3JvdXBfdGl0bGU7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRmxvd3MxR3JvdXBfZGVzYzsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBOb2RlczJHcm91cF90aXRsZTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBOb2RlczJHcm91cF9kZXNjOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbnRyb2xGbG93MUNyZWF0aW9uVG9vbF90aXRsZTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb250cm9sRmxvdzFDcmVhdGlvblRvb2xfZGVzYzsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3Rpdml0eVBhcnRpdGlvbjFDcmVhdGlvblRvb2xfdGl0bGU7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWN0aXZpdHlQYXJ0aXRpb24xQ3JlYXRpb25Ub29sX2Rlc2M7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgU3RhcnROb2RlMkNyZWF0aW9uVG9vbF90aXRsZTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTdGFydE5vZGUyQ3JlYXRpb25Ub29sX2Rlc2M7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRm9ya05vZGUzQ3JlYXRpb25Ub29sX3RpdGxlOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZvcmtOb2RlM0NyZWF0aW9uVG9vbF9kZXNjOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1lcmdlTm9kZTRDcmVhdGlvblRvb2xfdGl0bGU7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgTWVyZ2VOb2RlNENyZWF0aW9uVG9vbF9kZXNjOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERlY2lzaW9uTm9kZTVDcmVhdGlvblRvb2xfdGl0bGU7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGVjaXNpb25Ob2RlNUNyZWF0aW9uVG9vbF9kZXNjOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVuZE5vZGU2Q3JlYXRpb25Ub29sX3RpdGxlOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVuZE5vZGU2Q3JlYXRpb25Ub29sX2Rlc2M7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgSm9pbk5vZGU3Q3JlYXRpb25Ub29sX3RpdGxlOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpvaW5Ob2RlN0NyZWF0aW9uVG9vbF9kZXNjOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdGl2aXR5OUNyZWF0aW9uVG9vbF90aXRsZTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3Rpdml0eTlDcmVhdGlvblRvb2xfZGVzYzsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQaGFzZTEwQ3JlYXRpb25Ub29sX3RpdGxlOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBoYXNlMTBDcmVhdGlvblRvb2xfZGVzYzsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJdGVyYXRpb24xMUNyZWF0aW9uVG9vbF90aXRsZTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJdGVyYXRpb24xMUNyZWF0aW9uVG9vbF9kZXNjOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhc2tEZXNjcmlwdG9yMTJDcmVhdGlvblRvb2xfdGl0bGU7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGFza0Rlc2NyaXB0b3IxMkNyZWF0aW9uVG9vbF9kZXNjOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1pbGVzdG9uZTEzQ3JlYXRpb25Ub29sX3RpdGxlOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1pbGVzdG9uZTEzQ3JlYXRpb25Ub29sX2Rlc2M7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWN0aXZpdHlQYXJ0aXRpb25QYXJ0aXRpb25DYW1wYXJ0bWVudEVkaXRQYXJ0X3RpdGxlOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdGl2aXR5UGFydGl0aW9uUGFydGl0aW9uQ2FtcGFydG1lbnQyRWRpdFBhcnRfdGl0bGU7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29tbWFuZE5hbWVfT3BlbkRpYWdyYW07Ci0KLQkvL1RPRE86IHB1dCBhY2Nlc3NvciBmaWVsZHMgbWFudWFsbHkJCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvcGFydC9Nb2RlbEVsZW1lbnRTZWxlY3Rpb25QYWdlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvcGFydC9Nb2RlbEVsZW1lbnRTZWxlY3Rpb25QYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViMDI5YzMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL3BhcnQvTW9kZWxFbGVtZW50U2VsZWN0aW9uUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQucGFydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVdyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci0KLS8qKgotICogV2l6YXJkIHBhZ2UgdGhhdCBhbGxvd3MgdG8gc2VsZWN0IGVsZW1lbnQgZnJvbSBtb2RlbC4KLSAqIAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgTW9kZWxFbGVtZW50U2VsZWN0aW9uUGFnZSBleHRlbmRzIFdpemFyZFBhZ2UgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFT2JqZWN0IHNlbGVjdGVkTW9kZWxFbGVtZW50OwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgVHJlZVZpZXdlciBtb2RlbFZld2VyOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBNb2RlbEVsZW1lbnRTZWxlY3Rpb25QYWdlKFN0cmluZyBwYWdlTmFtZSkgewotCQlzdXBlcihwYWdlTmFtZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFT2JqZWN0IGdldE1vZGVsRWxlbWVudCgpIHsKLQkJcmV0dXJuIHNlbGVjdGVkTW9kZWxFbGVtZW50OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNb2RlbEVsZW1lbnQoRU9iamVjdCBtb2RlbEVsZW1lbnQpIHsKLQkJc2VsZWN0ZWRNb2RlbEVsZW1lbnQgPSBtb2RlbEVsZW1lbnQ7Ci0JCWlmIChtb2RlbFZld2VyICE9IG51bGwpIHsKLQkJCWlmIChzZWxlY3RlZE1vZGVsRWxlbWVudCAhPSBudWxsKSB7Ci0JCQkJbW9kZWxWZXdlci5zZXRJbnB1dChzZWxlY3RlZE1vZGVsRWxlbWVudC5lUmVzb3VyY2UoKSk7Ci0JCQkJbW9kZWxWZXdlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oCi0JCQkJCQlzZWxlY3RlZE1vZGVsRWxlbWVudCkpOwotCQkJfSBlbHNlIHsKLQkJCQltb2RlbFZld2VyLnNldElucHV0KG51bGwpOwotCQkJfQotCQkJc2V0UGFnZUNvbXBsZXRlKHZhbGlkYXRlUGFnZSgpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJaW5pdGlhbGl6ZURpYWxvZ1VuaXRzKHBhcmVudCk7Ci0KLQkJQ29tcG9zaXRlIHBsYXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJcGxhdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJcGxhdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0JCXNldENvbnRyb2wocGxhdGUpOwotCi0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKHBsYXRlLCBTV1QuTk9ORSk7Ci0JCWxhYmVsLnNldFRleHQoZ2V0U2VsZWN0aW9uVGl0bGUoKSk7Ci0JCWxhYmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQkVHSU5OSU5HKSk7Ci0KLQkJbW9kZWxWZXdlciA9IG5ldyBUcmVlVmlld2VyKHBsYXRlLCBTV1QuU0lOR0xFIHwgU1dULkhfU0NST0xMCi0JCQkJfCBTV1QuVl9TQ1JPTEwgfCBTV1QuQk9SREVSKTsKLQkJR3JpZERhdGEgbGF5b3V0RGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQlsYXlvdXREYXRhLmhlaWdodEhpbnQgPSAzMDA7Ci0JCWxheW91dERhdGEud2lkdGhIaW50ID0gMzAwOwotCQltb2RlbFZld2VyLmdldFRyZWUoKS5zZXRMYXlvdXREYXRhKGxheW91dERhdGEpOwotCQltb2RlbFZld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoCi0JCQkJQWN0aXZpdHlEaWFncmFtRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkKLQkJCQkJCS5nZXRJdGVtUHJvdmlkZXJzQWRhcHRlckZhY3RvcnkoKSkpOwotCQltb2RlbFZld2VyLnNldExhYmVsUHJvdmlkZXIobmV3IEFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcigKLQkJCQlBY3Rpdml0eURpYWdyYW1FZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKQotCQkJCQkJLmdldEl0ZW1Qcm92aWRlcnNBZGFwdGVyRmFjdG9yeSgpKSk7Ci0JCWlmIChzZWxlY3RlZE1vZGVsRWxlbWVudCAhPSBudWxsKSB7Ci0JCQltb2RlbFZld2VyLnNldElucHV0KHNlbGVjdGVkTW9kZWxFbGVtZW50LmVSZXNvdXJjZSgpKTsKLQkJCW1vZGVsVmV3ZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKAotCQkJCQlzZWxlY3RlZE1vZGVsRWxlbWVudCkpOwotCQl9Ci0JCW1vZGVsVmV3ZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewotCi0JCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQkJCU1vZGVsRWxlbWVudFNlbGVjdGlvblBhZ2UudGhpcwotCQkJCQkJLnVwZGF0ZVNlbGVjdGlvbigoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGV2ZW50Ci0JCQkJCQkJCS5nZXRTZWxlY3Rpb24oKSk7Ci0JCQl9Ci0JCX0pOwotCi0JCXNldFBhZ2VDb21wbGV0ZSh2YWxpZGF0ZVBhZ2UoKSk7Ci0JfQotCi0JLyoqCi0JICogT3ZlcnJpZGUgdG8gcHJvdmlkZSBjdXN0b20gbW9kZWwgZWxlbWVudCBkZXNjcmlwdGlvbi4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTZWxlY3Rpb25UaXRsZSgpIHsKLQkJcmV0dXJuICJTZWxlY3QgbW9kZWwgZWxlbWVudDoiOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVTZWxlY3Rpb24oSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCXNlbGVjdGVkTW9kZWxFbGVtZW50ID0gbnVsbDsKLQkJaWYgKHNlbGVjdGlvbi5zaXplKCkgPT0gMSkgewotCQkJT2JqZWN0IHNlbGVjdGVkRWxlbWVudCA9IHNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCWlmIChzZWxlY3RlZEVsZW1lbnQgaW5zdGFuY2VvZiBJV3JhcHBlckl0ZW1Qcm92aWRlcikgewotCQkJCXNlbGVjdGVkRWxlbWVudCA9ICgoSVdyYXBwZXJJdGVtUHJvdmlkZXIpIHNlbGVjdGVkRWxlbWVudCkKLQkJCQkJCS5nZXRWYWx1ZSgpOwotCQkJfQotCQkJaWYgKHNlbGVjdGVkRWxlbWVudCBpbnN0YW5jZW9mIEZlYXR1cmVNYXAuRW50cnkpIHsKLQkJCQlzZWxlY3RlZEVsZW1lbnQgPSAoKEZlYXR1cmVNYXAuRW50cnkpIHNlbGVjdGVkRWxlbWVudCkKLQkJCQkJCS5nZXRWYWx1ZSgpOwotCQkJfQotCQkJaWYgKHNlbGVjdGVkRWxlbWVudCBpbnN0YW5jZW9mIEVPYmplY3QpIHsKLQkJCQlzZWxlY3RlZE1vZGVsRWxlbWVudCA9IChFT2JqZWN0KSBzZWxlY3RlZEVsZW1lbnQ7Ci0JCQl9Ci0JCX0KLQkJc2V0UGFnZUNvbXBsZXRlKHZhbGlkYXRlUGFnZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBPdmVycmlkZSB0byBwcm92aWRlIHNwZWNpZmljIHZhbGlkYXRpb24gb2YgdGhlIHNlbGVjdGVkIG1vZGVsIGVsZW1lbnQuCi0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHZhbGlkYXRlUGFnZSgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL3BhcnQvVU1MQ3JlYXRpb25XaXphcmQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9wYXJ0L1VNTENyZWF0aW9uV2l6YXJkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhYzUyYmIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL3BhcnQvVU1MQ3JlYXRpb25XaXphcmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnBhcnQ7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlc291cmNlcy5lZGl0b3IuaWRlLndpemFyZHMuRWRpdG9yQ3JlYXRpb25XaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5FcnJvckRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uSVJ1bm5hYmxlV2l0aFByb2dyZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JTmV3V2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGFydEluaXRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5Xb3Jrc3BhY2VNb2RpZnlPcGVyYXRpb247Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgVU1MQ3JlYXRpb25XaXphcmQgZXh0ZW5kcyBXaXphcmQgaW1wbGVtZW50cyBJTmV3V2l6YXJkIHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIElXb3JrYmVuY2ggd29ya2JlbmNoOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgVU1MQ3JlYXRpb25XaXphcmRQYWdlIGRpYWdyYW1Nb2RlbEZpbGVQYWdlOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUmVzb3VyY2UgZGlhZ3JhbTsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIG9wZW5OZXdseUNyZWF0ZWREaWFncmFtRWRpdG9yID0gdHJ1ZTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSVdvcmtiZW5jaCBnZXRXb3JrYmVuY2goKSB7Ci0JCXJldHVybiB3b3JrYmVuY2g7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJU3RydWN0dXJlZFNlbGVjdGlvbiBnZXRTZWxlY3Rpb24oKSB7Ci0JCXJldHVybiBzZWxlY3Rpb247Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBmaW5hbCBSZXNvdXJjZSBnZXREaWFncmFtKCkgewotCQlyZXR1cm4gZGlhZ3JhbTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGZpbmFsIGJvb2xlYW4gaXNPcGVuTmV3bHlDcmVhdGVkRGlhZ3JhbUVkaXRvcigpIHsKLQkJcmV0dXJuIG9wZW5OZXdseUNyZWF0ZWREaWFncmFtRWRpdG9yOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRPcGVuTmV3bHlDcmVhdGVkRGlhZ3JhbUVkaXRvcigKLQkJCWJvb2xlYW4gb3Blbk5ld2x5Q3JlYXRlZERpYWdyYW1FZGl0b3IpIHsKLQkJdGhpcy5vcGVuTmV3bHlDcmVhdGVkRGlhZ3JhbUVkaXRvciA9IG9wZW5OZXdseUNyZWF0ZWREaWFncmFtRWRpdG9yOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRQYWdlcygpIHsKLQkJZGlhZ3JhbU1vZGVsRmlsZVBhZ2UgPSBuZXcgVU1MQ3JlYXRpb25XaXphcmRQYWdlKAotCQkJCSJEaWFncmFtTW9kZWxGaWxlIiwgZ2V0U2VsZWN0aW9uKCksICJ4bWkiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWRpYWdyYW1Nb2RlbEZpbGVQYWdlLnNldFRpdGxlKCJDcmVhdGUgQUQgRGlhZ3JhbSIpOwotCQlkaWFncmFtTW9kZWxGaWxlUGFnZQotCQkJCS5zZXREZXNjcmlwdGlvbigiU2VsZWN0IGZpbGUgdGhhdCB3aWxsIGNvbnRhaW4gZGlhZ3JhbSBhbmQgZG9tYWluIG1vZGVscy4iKTsKLQkJYWRkUGFnZShkaWFncmFtTW9kZWxGaWxlUGFnZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHBlcmZvcm1GaW5pc2goKSB7Ci0JCUlSdW5uYWJsZVdpdGhQcm9ncmVzcyBvcCA9IG5ldyBXb3Jrc3BhY2VNb2RpZnlPcGVyYXRpb24obnVsbCkgewotCi0JCQlwcm90ZWN0ZWQgdm9pZCBleGVjdXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLQkJCQkJdGhyb3dzIENvcmVFeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJCQlkaWFncmFtID0gVU1MRGlhZ3JhbUVkaXRvclV0aWwuY3JlYXRlRGlhZ3JhbSgKLQkJCQkJCWRpYWdyYW1Nb2RlbEZpbGVQYWdlLmdldFVSSSgpLCBtb25pdG9yKTsKLQkJCQlpZiAoaXNPcGVuTmV3bHlDcmVhdGVkRGlhZ3JhbUVkaXRvcigpICYmIGRpYWdyYW0gIT0gbnVsbCkgewotCQkJCQl0cnkgewotCQkJCQkJVU1MRGlhZ3JhbUVkaXRvclV0aWwub3BlbkRpYWdyYW0oZGlhZ3JhbSk7Ci0JCQkJCX0gY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIGUpIHsKLQkJCQkJCUVycm9yRGlhbG9nLm9wZW5FcnJvcihnZXRDb250YWluZXIoKS5nZXRTaGVsbCgpLAotCQkJCQkJCQkiRXJyb3Igb3BlbmluZyBkaWFncmFtIGVkaXRvciIsIG51bGwsIGUKLQkJCQkJCQkJCQkuZ2V0U3RhdHVzKCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9OwotCQl0cnkgewotCQkJZ2V0Q29udGFpbmVyKCkucnVuKGZhbHNlLCB0cnVlLCBvcCk7Ci0JCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0JCQlpZiAoZS5nZXRUYXJnZXRFeGNlcHRpb24oKSBpbnN0YW5jZW9mIENvcmVFeGNlcHRpb24pIHsKLQkJCQlFcnJvckRpYWxvZy5vcGVuRXJyb3IoZ2V0Q29udGFpbmVyKCkuZ2V0U2hlbGwoKSwKLQkJCQkJCSJDcmVhdGlvbiBQcm9ibGVtcyIsIG51bGwsICgoQ29yZUV4Y2VwdGlvbikgZQotCQkJCQkJCQkuZ2V0VGFyZ2V0RXhjZXB0aW9uKCkpLmdldFN0YXR1cygpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJQWN0aXZpdHlEaWFncmFtRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkubG9nRXJyb3IoCi0JCQkJCQkiRXJyb3IgY3JlYXRpbmcgZGlhZ3JhbSIsIGUuZ2V0VGFyZ2V0RXhjZXB0aW9uKCkpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIGRpYWdyYW0gIT0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoIHdvcmtiZW5jaCwgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCXRoaXMud29ya2JlbmNoID0gd29ya2JlbmNoOwotCQl0aGlzLnNlbGVjdGlvbiA9IHNlbGVjdGlvbjsKLQkJc2V0V2luZG93VGl0bGUoIk5ldyBBRCBEaWFncmFtIik7Ci0JCXNldERlZmF1bHRQYWdlSW1hZ2VEZXNjcmlwdG9yKEFjdGl2aXR5RGlhZ3JhbUVkaXRvclBsdWdpbgotCQkJCS5nZXRCdW5kbGVkSW1hZ2VEZXNjcmlwdG9yKCJpY29ucy93aXpiYW4vTmV3VU1MV2l6YXJkLmdpZiIpKTsgLy8kTk9OLU5MUy0xJAotCQlzZXROZWVkc1Byb2dyZXNzTW9uaXRvcih0cnVlKTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvcGFydC9VTUxDcmVhdGlvbldpemFyZFBhZ2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9wYXJ0L1VNTENyZWF0aW9uV2l6YXJkUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxM2M0OTVlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9wYXJ0L1VNTENyZWF0aW9uV2l6YXJkUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQucGFydDsKLQotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlc291cmNlcy5lZGl0b3IuaWRlLndpemFyZHMuRWRpdG9yV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlc291cmNlcy5lZGl0b3IudXRpbC5EaWFncmFtRmlsZUNyZWF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLldpemFyZE5ld0ZpbGVDcmVhdGlvblBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5BY3Rpdml0eUVkaXRQYXJ0OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFVNTENyZWF0aW9uV2l6YXJkUGFnZSBleHRlbmRzIFdpemFyZE5ld0ZpbGVDcmVhdGlvblBhZ2UgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgZmluYWwgU3RyaW5nIGZpbGVFeHRlbnNpb247Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFVNTENyZWF0aW9uV2l6YXJkUGFnZShTdHJpbmcgcGFnZU5hbWUsCi0JCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24sIFN0cmluZyBmaWxlRXh0ZW5zaW9uKSB7Ci0JCXN1cGVyKHBhZ2VOYW1lLCBzZWxlY3Rpb24pOwotCQl0aGlzLmZpbGVFeHRlbnNpb24gPSBmaWxlRXh0ZW5zaW9uOwotCX0KLQotCS8qKgotCSAqIE92ZXJyaWRlIHRvIGNyZWF0ZSBmaWxlcyB3aXRoIHRoaXMgZXh0ZW5zaW9uLgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEV4dGVuc2lvbigpIHsKLQkJcmV0dXJuIGZpbGVFeHRlbnNpb247Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBVUkkgZ2V0VVJJKCkgewotCQlyZXR1cm4gVVJJLmNyZWF0ZVBsYXRmb3JtUmVzb3VyY2VVUkkoZ2V0RmlsZVBhdGgoKS50b1N0cmluZygpLCBmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJUGF0aCBnZXRGaWxlUGF0aCgpIHsKLQkJSVBhdGggcGF0aCA9IGdldENvbnRhaW5lckZ1bGxQYXRoKCk7Ci0JCWlmIChwYXRoID09IG51bGwpIHsKLQkJCXBhdGggPSBuZXcgUGF0aCgiIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlTdHJpbmcgZmlsZU5hbWUgPSBnZXRGaWxlTmFtZSgpOwotCQlpZiAoZmlsZU5hbWUgIT0gbnVsbCkgewotCQkJcGF0aCA9IHBhdGguYXBwZW5kKGZpbGVOYW1lKTsKLQkJfQotCQlyZXR1cm4gcGF0aDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXN1cGVyLmNyZWF0ZUNvbnRyb2wocGFyZW50KTsKLQkJc2V0RmlsZU5hbWUoVU1MRGlhZ3JhbUVkaXRvclV0aWwuZ2V0VW5pcXVlRmlsZU5hbWUoCi0JCQkJZ2V0Q29udGFpbmVyRnVsbFBhdGgoKSwgZ2V0RmlsZU5hbWUoKSwgZ2V0RXh0ZW5zaW9uKCkpKTsKLQkJc2V0UGFnZUNvbXBsZXRlKHZhbGlkYXRlUGFnZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gdmFsaWRhdGVQYWdlKCkgewotCQlpZiAoIXN1cGVyLnZhbGlkYXRlUGFnZSgpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJU3RyaW5nIGV4dGVuc2lvbiA9IGdldEV4dGVuc2lvbigpOwotCQlpZiAoZXh0ZW5zaW9uICE9IG51bGwKLQkJCQkmJiAhZ2V0RmlsZVBhdGgoKS50b1N0cmluZygpLmVuZHNXaXRoKCIuIiArIGV4dGVuc2lvbikpIHsKLQkJCXNldEVycm9yTWVzc2FnZShOTFMuYmluZCgKLQkJCQkJIkZpbGUgbmFtZSBzaG91bGQgaGF2ZSAnJ3swfScnIGV4dGVuc2lvbi4iLCBleHRlbnNpb24pKTsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9wYXJ0L1VNTERpYWdyYW1BY3Rpb25CYXJDb250cmlidXRvci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL3BhcnQvVU1MRGlhZ3JhbUFjdGlvbkJhckNvbnRyaWJ1dG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhZTk4MzAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL3BhcnQvVU1MRGlhZ3JhbUFjdGlvbkJhckNvbnRyaWJ1dG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnBhcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnBhcnRzLkRpYWdyYW1BY3Rpb25CYXJDb250cmlidXRvcjsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBVTUxEaWFncmFtQWN0aW9uQmFyQ29udHJpYnV0b3IgZXh0ZW5kcyBEaWFncmFtQWN0aW9uQmFyQ29udHJpYnV0b3IgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDbGFzcyBnZXRFZGl0b3JDbGFzcygpIHsKLQkJcmV0dXJuIEFjdGl2aXR5RGlhZ3JhbUVkaXRvci5jbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRFZGl0b3JJZCgpIHsKLQkJcmV0dXJuIEFjdGl2aXR5RGlhZ3JhbUVkaXRvci5JRDsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvcGFydC9VTUxEaWFncmFtRWRpdG9yVXRpbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL3BhcnQvVU1MRGlhZ3JhbUVkaXRvclV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTUzOGMzZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvcGFydC9VTUxEaWFncmFtRWRpdG9yVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQucGFydDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLm9wZXJhdGlvbnMuT3BlcmF0aW9uSGlzdG9yeUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3ViUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLlhNSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuWE1MUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkudXRpbC5FZGl0VUlVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi5jb3JlLmNvbW1hbmQuQ29tbWFuZFJlc3VsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuc2VydmljZXMuVmlld1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuRGlhZ3JhbUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklHcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JUHJpbWFyeUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucGFydHMuSURpYWdyYW1HcmFwaGljYWxWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wYXJ0cy5JRGlhZ3JhbVdvcmtiZW5jaFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXNvdXJjZXMuZWRpdG9yLmlkZS51dGlsLklERUVkaXRvclV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXNvdXJjZXMuZWRpdG9yLnV0aWwuRGlhZ3JhbUZpbGVDcmVhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb21tYW5kcy5jb3JlLmNvbW1hbmQuQWJzdHJhY3RUcmFuc2FjdGlvbmFsQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29yZS5HTUZFZGl0aW5nRG9tYWluRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29yZS51dGlsLkVNRkNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkRpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dTZXR0aW5nczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uSVJ1bm5hYmxlQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uSVJ1bm5hYmxlV2l0aFByb2dyZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZERpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBhcnRJbml0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5UcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYud29ya3NwYWNlLnV0aWwuV29ya3NwYWNlU3luY2hyb25pemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuQWN0aXZpdHlFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5VTUxGYWN0b3J5OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFVNTERpYWdyYW1FZGl0b3JVdGlsIHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBNYXAgb3VyU2F2ZU9wdGlvbnMgPSBudWxsOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgTWFwIGdldFNhdmVPcHRpb25zKCkgewotCQlpZiAob3VyU2F2ZU9wdGlvbnMgPT0gbnVsbCkgewotCQkJb3VyU2F2ZU9wdGlvbnMgPSBuZXcgSGFzaE1hcCgpOwotCQkJb3VyU2F2ZU9wdGlvbnMucHV0KFhNSVJlc291cmNlLk9QVElPTl9FTkNPRElORywgIlVURi04Iik7IC8vJE5PTi1OTFMtMSQKLQkJCW91clNhdmVPcHRpb25zLnB1dChYTUxSZXNvdXJjZS5PUFRJT05fUkVDT1JEX1VOS05PV05fRkVBVFVSRSwKLQkJCQkJQm9vbGVhbi5UUlVFKTsKLQkJCW91clNhdmVPcHRpb25zLnB1dChSZXNvdXJjZS5PUFRJT05fU0FWRV9PTkxZX0lGX0NIQU5HRUQsCi0JCQkJCVJlc291cmNlLk9QVElPTl9TQVZFX09OTFlfSUZfQ0hBTkdFRF9NRU1PUllfQlVGRkVSKTsKLQkJfQotCQlyZXR1cm4gb3VyU2F2ZU9wdGlvbnM7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBvcGVuRGlhZ3JhbShSZXNvdXJjZSBkaWFncmFtKQotCQkJdGhyb3dzIFBhcnRJbml0RXhjZXB0aW9uIHsKLQkJcmV0dXJuIEVkaXRVSVV0aWwub3BlbkVkaXRvcigoRU9iamVjdCkgZGlhZ3JhbS5nZXRDb250ZW50cygpLmdldCgwKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRDaGFyc2V0KElGaWxlIGZpbGUpIHsKLQkJaWYgKGZpbGUgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCXRyeSB7Ci0JCQlmaWxlLnNldENoYXJzZXQoIlVURi04IiwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7IC8vJE5PTi1OTFMtMSQKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlBY3Rpdml0eURpYWdyYW1FZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5sb2dFcnJvcigKLQkJCQkJIlVuYWJsZSB0byBzZXQgY2hhcnNldCBmb3IgZmlsZSAiICsgZmlsZS5nZXRGdWxsUGF0aCgpLCBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFVuaXF1ZUZpbGVOYW1lKElQYXRoIGNvbnRhaW5lckZ1bGxQYXRoLAotCQkJU3RyaW5nIGZpbGVOYW1lLCBTdHJpbmcgZXh0ZW5zaW9uKSB7Ci0JCWlmIChjb250YWluZXJGdWxsUGF0aCA9PSBudWxsKSB7Ci0JCQljb250YWluZXJGdWxsUGF0aCA9IG5ldyBQYXRoKCIiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWlmIChmaWxlTmFtZSA9PSBudWxsIHx8IGZpbGVOYW1lLnRyaW0oKS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQlmaWxlTmFtZSA9ICJkZWZhdWx0IjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCUlQYXRoIGZpbGVQYXRoID0gY29udGFpbmVyRnVsbFBhdGguYXBwZW5kKGZpbGVOYW1lKTsKLQkJaWYgKGV4dGVuc2lvbiAhPSBudWxsICYmICFleHRlbnNpb24uZXF1YWxzKGZpbGVQYXRoLmdldEZpbGVFeHRlbnNpb24oKSkpIHsKLQkJCWZpbGVQYXRoID0gZmlsZVBhdGguYWRkRmlsZUV4dGVuc2lvbihleHRlbnNpb24pOwotCQl9Ci0JCWV4dGVuc2lvbiA9IGZpbGVQYXRoLmdldEZpbGVFeHRlbnNpb24oKTsKLQkJZmlsZU5hbWUgPSBmaWxlUGF0aC5yZW1vdmVGaWxlRXh0ZW5zaW9uKCkubGFzdFNlZ21lbnQoKTsKLQkJaW50IGkgPSAxOwotCQl3aGlsZSAoUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5leGlzdHMoZmlsZVBhdGgpKSB7Ci0JCQlpKys7Ci0JCQlmaWxlUGF0aCA9IGNvbnRhaW5lckZ1bGxQYXRoLmFwcGVuZChmaWxlTmFtZSArIGkpOwotCQkJaWYgKGV4dGVuc2lvbiAhPSBudWxsKSB7Ci0JCQkJZmlsZVBhdGggPSBmaWxlUGF0aC5hZGRGaWxlRXh0ZW5zaW9uKGV4dGVuc2lvbik7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZpbGVQYXRoLmxhc3RTZWdtZW50KCk7Ci0JfQotCi0JLyoqCi0JICogUnVucyB0aGUgd2l6YXJkIGluIGEgZGlhbG9nLgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcnVuV2l6YXJkKFNoZWxsIHNoZWxsLCBXaXphcmQgd2l6YXJkLCBTdHJpbmcgc2V0dGluZ3NLZXkpIHsKLQkJSURpYWxvZ1NldHRpbmdzIHBsdWdpbkRpYWxvZ1NldHRpbmdzID0gQWN0aXZpdHlEaWFncmFtRWRpdG9yUGx1Z2luCi0JCQkJLmdldEluc3RhbmNlKCkuZ2V0RGlhbG9nU2V0dGluZ3MoKTsKLQkJSURpYWxvZ1NldHRpbmdzIHdpemFyZERpYWxvZ1NldHRpbmdzID0gcGx1Z2luRGlhbG9nU2V0dGluZ3MKLQkJCQkuZ2V0U2VjdGlvbihzZXR0aW5nc0tleSk7Ci0JCWlmICh3aXphcmREaWFsb2dTZXR0aW5ncyA9PSBudWxsKSB7Ci0JCQl3aXphcmREaWFsb2dTZXR0aW5ncyA9IHBsdWdpbkRpYWxvZ1NldHRpbmdzCi0JCQkJCS5hZGROZXdTZWN0aW9uKHNldHRpbmdzS2V5KTsKLQkJfQotCQl3aXphcmQuc2V0RGlhbG9nU2V0dGluZ3Mod2l6YXJkRGlhbG9nU2V0dGluZ3MpOwotCQlXaXphcmREaWFsb2cgZGlhbG9nID0gbmV3IFdpemFyZERpYWxvZyhzaGVsbCwgd2l6YXJkKTsKLQkJZGlhbG9nLmNyZWF0ZSgpOwotCQlkaWFsb2cuZ2V0U2hlbGwoKS5zZXRTaXplKE1hdGgubWF4KDUwMCwgZGlhbG9nLmdldFNoZWxsKCkuZ2V0U2l6ZSgpLngpLAotCQkJCTUwMCk7Ci0JCWRpYWxvZy5vcGVuKCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2Qgc2hvdWxkIGJlIGNhbGxlZCB3aXRoaW4gYSB3b3Jrc3BhY2UgbW9kaWZ5IG9wZXJhdGlvbiBzaW5jZSBpdCBjcmVhdGVzIHJlc291cmNlcy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBSZXNvdXJjZSBjcmVhdGVEaWFncmFtKFVSSSBkaWFncmFtVVJJLAotCQkJSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzc01vbml0b3IpIHsKLQkJVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gZWRpdGluZ0RvbWFpbiA9IEdNRkVkaXRpbmdEb21haW5GYWN0b3J5LklOU1RBTkNFCi0JCQkJLmNyZWF0ZUVkaXRpbmdEb21haW4oKTsKLQkJcHJvZ3Jlc3NNb25pdG9yLmJlZ2luVGFzaygKLQkJCQlNZXNzYWdlcy5VTUxEaWFncmFtRWRpdG9yVXRpbF9DcmVhdGVEaWFncmFtUHJvZ3Jlc3NUYXNrLCAzKTsKLQkJZmluYWwgUmVzb3VyY2UgZGlhZ3JhbVJlc291cmNlID0gZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpCi0JCQkJLmNyZWF0ZVJlc291cmNlKGRpYWdyYW1VUkkpOwotCQlmaW5hbCBTdHJpbmcgZGlhZ3JhbU5hbWUgPSBkaWFncmFtVVJJLmxhc3RTZWdtZW50KCk7Ci0JCUFic3RyYWN0VHJhbnNhY3Rpb25hbENvbW1hbmQgY29tbWFuZCA9IG5ldyBBYnN0cmFjdFRyYW5zYWN0aW9uYWxDb21tYW5kKAotCQkJCWVkaXRpbmdEb21haW4sCi0JCQkJTWVzc2FnZXMuVU1MRGlhZ3JhbUVkaXRvclV0aWxfQ3JlYXRlRGlhZ3JhbUNvbW1hbmRMYWJlbCwKLQkJCQlDb2xsZWN0aW9ucy5FTVBUWV9MSVNUKSB7Ci0JCQlwcm90ZWN0ZWQgQ29tbWFuZFJlc3VsdCBkb0V4ZWN1dGVXaXRoUmVzdWx0KAotCQkJCQlJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykKLQkJCQkJdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCQkJQWN0aXZpdHkgbW9kZWwgPSBjcmVhdGVJbml0aWFsTW9kZWwoKTsKLQkJCQlhdHRhY2hNb2RlbFRvUmVzb3VyY2UobW9kZWwsIGRpYWdyYW1SZXNvdXJjZSk7Ci0KLQkJCQlEaWFncmFtIGRpYWdyYW0gPSBWaWV3U2VydmljZS5jcmVhdGVEaWFncmFtKG1vZGVsLAotCQkJCQkJQWN0aXZpdHlFZGl0UGFydC5NT0RFTF9JRCwKLQkJCQkJCUFjdGl2aXR5RGlhZ3JhbUVkaXRvclBsdWdpbi5ESUFHUkFNX1BSRUZFUkVOQ0VTX0hJTlQpOwotCQkJCWlmIChkaWFncmFtICE9IG51bGwpIHsKLQkJCQkJZGlhZ3JhbVJlc291cmNlLmdldENvbnRlbnRzKCkuYWRkKGRpYWdyYW0pOwotCQkJCQlkaWFncmFtLnNldE5hbWUoZGlhZ3JhbU5hbWUpOwotCQkJCQlkaWFncmFtLnNldEVsZW1lbnQobW9kZWwpOwotCQkJCX0KLQotCQkJCXRyeSB7Ci0KLQkJCQkJZGlhZ3JhbVJlc291cmNlCi0JCQkJCQkJLnNhdmUob3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQucGFydC5VTUxEaWFncmFtRWRpdG9yVXRpbAotCQkJCQkJCQkJLmdldFNhdmVPcHRpb25zKCkpOwotCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQotCQkJCQlBY3Rpdml0eURpYWdyYW1FZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5sb2dFcnJvcigKLQkJCQkJCQkiVW5hYmxlIHRvIHN0b3JlIG1vZGVsIGFuZCBkaWFncmFtIHJlc291cmNlcyIsIGUpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJCXJldHVybiBDb21tYW5kUmVzdWx0Lm5ld09LQ29tbWFuZFJlc3VsdCgpOwotCQkJfQotCQl9OwotCQl0cnkgewotCQkJT3BlcmF0aW9uSGlzdG9yeUZhY3RvcnkuZ2V0T3BlcmF0aW9uSGlzdG9yeSgpLmV4ZWN1dGUoY29tbWFuZCwKLQkJCQkJbmV3IFN1YlByb2dyZXNzTW9uaXRvcihwcm9ncmVzc01vbml0b3IsIDEpLCBudWxsKTsKLQkJfSBjYXRjaCAoRXhlY3V0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCUFjdGl2aXR5RGlhZ3JhbUVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmxvZ0Vycm9yKAotCQkJCQkiVW5hYmxlIHRvIGNyZWF0ZSBtb2RlbCBhbmQgZGlhZ3JhbSIsIGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlzZXRDaGFyc2V0KFdvcmtzcGFjZVN5bmNocm9uaXplci5nZXRGaWxlKGRpYWdyYW1SZXNvdXJjZSkpOwotCQlyZXR1cm4gZGlhZ3JhbVJlc291cmNlOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiBkb21haW4gZWxlbWVudCBhc3NvY2lhdGVkIHdpdGggY2FudmFzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIEFjdGl2aXR5IGNyZWF0ZUluaXRpYWxNb2RlbCgpIHsKLQkJcmV0dXJuIFVNTEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUFjdGl2aXR5KCk7Ci0JfQotCi0JLyoqCi0JICogU3RvcmUgbW9kZWwgZWxlbWVudCBpbiB0aGUgcmVzb3VyY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBhdHRhY2hNb2RlbFRvUmVzb3VyY2UoQWN0aXZpdHkgbW9kZWwsIFJlc291cmNlIHJlc291cmNlKSB7Ci0JCXJlc291cmNlLmdldENvbnRlbnRzKCkuYWRkKG1vZGVsKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNlbGVjdEVsZW1lbnRzSW5EaWFncmFtKAotCQkJSURpYWdyYW1Xb3JrYmVuY2hQYXJ0IGRpYWdyYW1QYXJ0LCBMaXN0LypFZGl0UGFydCovZWRpdFBhcnRzKSB7Ci0JCWRpYWdyYW1QYXJ0LmdldERpYWdyYW1HcmFwaGljYWxWaWV3ZXIoKS5kZXNlbGVjdEFsbCgpOwotCi0JCUVkaXRQYXJ0IGZpcnN0UHJpbWFyeSA9IG51bGw7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSBlZGl0UGFydHMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJRWRpdFBhcnQgbmV4dFBhcnQgPSAoRWRpdFBhcnQpIGl0Lm5leHQoKTsKLQkJCWRpYWdyYW1QYXJ0LmdldERpYWdyYW1HcmFwaGljYWxWaWV3ZXIoKS5hcHBlbmRTZWxlY3Rpb24obmV4dFBhcnQpOwotCQkJaWYgKGZpcnN0UHJpbWFyeSA9PSBudWxsICYmIG5leHRQYXJ0IGluc3RhbmNlb2YgSVByaW1hcnlFZGl0UGFydCkgewotCQkJCWZpcnN0UHJpbWFyeSA9IG5leHRQYXJ0OwotCQkJfQotCQl9Ci0KLQkJaWYgKCFlZGl0UGFydHMuaXNFbXB0eSgpKSB7Ci0JCQlkaWFncmFtUGFydC5nZXREaWFncmFtR3JhcGhpY2FsVmlld2VyKCkucmV2ZWFsKAotCQkJCQlmaXJzdFByaW1hcnkgIT0gbnVsbCA/IGZpcnN0UHJpbWFyeSA6IChFZGl0UGFydCkgZWRpdFBhcnRzCi0JCQkJCQkJLmdldCgwKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgaW50IGZpbmRFbGVtZW50c0luRGlhZ3JhbUJ5SUQoRGlhZ3JhbUVkaXRQYXJ0IGRpYWdyYW1QYXJ0LAotCQkJRU9iamVjdCBlbGVtZW50LCBMaXN0IGVkaXRQYXJ0Q29sbGVjdG9yKSB7Ci0JCUlEaWFncmFtR3JhcGhpY2FsVmlld2VyIHZpZXdlciA9IChJRGlhZ3JhbUdyYXBoaWNhbFZpZXdlcikgZGlhZ3JhbVBhcnQKLQkJCQkuZ2V0Vmlld2VyKCk7Ci0JCWZpbmFsIGludCBpbnRpYWxOdW1PZkVkaXRQYXJ0cyA9IGVkaXRQYXJ0Q29sbGVjdG9yLnNpemUoKTsKLQotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFZpZXcpIHsgLy8gc3VwcG9ydCBub3RhdGlvbiBlbGVtZW50IGxvb2t1cAotCQkJRWRpdFBhcnQgZWRpdFBhcnQgPSAoRWRpdFBhcnQpIHZpZXdlci5nZXRFZGl0UGFydFJlZ2lzdHJ5KCkuZ2V0KAotCQkJCQllbGVtZW50KTsKLQkJCWlmIChlZGl0UGFydCAhPSBudWxsKSB7Ci0JCQkJZWRpdFBhcnRDb2xsZWN0b3IuYWRkKGVkaXRQYXJ0KTsKLQkJCQlyZXR1cm4gMTsKLQkJCX0KLQkJfQotCi0JCVN0cmluZyBlbGVtZW50SUQgPSBFTUZDb3JlVXRpbC5nZXRQcm94eUlEKGVsZW1lbnQpOwotCQlMaXN0IGFzc29jaWF0ZWRQYXJ0cyA9IHZpZXdlci5maW5kRWRpdFBhcnRzRm9yRWxlbWVudChlbGVtZW50SUQsCi0JCQkJSUdyYXBoaWNhbEVkaXRQYXJ0LmNsYXNzKTsKLQkJLy8gcGVyZm9ybSB0aGUgcG9zc2libGUgaGllcmFyY2h5IGRpc2pvaW50IC0+IHRha2UgdGhlIHRvcC1tb3N0IHBhcnRzIG9ubHkKLQkJZm9yIChJdGVyYXRvciBlZGl0UGFydEl0ID0gYXNzb2NpYXRlZFBhcnRzLml0ZXJhdG9yKCk7IGVkaXRQYXJ0SXQKLQkJCQkuaGFzTmV4dCgpOykgewotCQkJRWRpdFBhcnQgbmV4dFBhcnQgPSAoRWRpdFBhcnQpIGVkaXRQYXJ0SXQubmV4dCgpOwotCQkJRWRpdFBhcnQgcGFyZW50UGFydCA9IG5leHRQYXJ0LmdldFBhcmVudCgpOwotCQkJd2hpbGUgKHBhcmVudFBhcnQgIT0gbnVsbCAmJiAhYXNzb2NpYXRlZFBhcnRzLmNvbnRhaW5zKHBhcmVudFBhcnQpKSB7Ci0JCQkJcGFyZW50UGFydCA9IHBhcmVudFBhcnQuZ2V0UGFyZW50KCk7Ci0JCQl9Ci0JCQlpZiAocGFyZW50UGFydCA9PSBudWxsKSB7Ci0JCQkJZWRpdFBhcnRDb2xsZWN0b3IuYWRkKG5leHRQYXJ0KTsKLQkJCX0KLQkJfQotCi0JCWlmIChpbnRpYWxOdW1PZkVkaXRQYXJ0cyA9PSBlZGl0UGFydENvbGxlY3Rvci5zaXplKCkpIHsKLQkJCWlmICghYXNzb2NpYXRlZFBhcnRzLmlzRW1wdHkoKSkgewotCQkJCWVkaXRQYXJ0Q29sbGVjdG9yLmFkZChhc3NvY2lhdGVkUGFydHMuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQkJfSBlbHNlIHsKLQkJCQlpZiAoZWxlbWVudC5lQ29udGFpbmVyKCkgIT0gbnVsbCkgewotCQkJCQlyZXR1cm4gZmluZEVsZW1lbnRzSW5EaWFncmFtQnlJRChkaWFncmFtUGFydCwgZWxlbWVudAotCQkJCQkJCS5lQ29udGFpbmVyKCksIGVkaXRQYXJ0Q29sbGVjdG9yKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVkaXRQYXJ0Q29sbGVjdG9yLnNpemUoKSAtIGludGlhbE51bU9mRWRpdFBhcnRzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFZpZXcgZmluZFZpZXcoRGlhZ3JhbUVkaXRQYXJ0IGRpYWdyYW1FZGl0UGFydCwKLQkJCUVPYmplY3QgdGFyZ2V0RWxlbWVudCwgTGF6eUVsZW1lbnQyVmlld01hcCBsYXp5RWxlbWVudDJWaWV3TWFwKSB7Ci0JCWJvb2xlYW4gaGFzU3RydWN0dXJhbFVSSSA9IGZhbHNlOwotCQlpZiAodGFyZ2V0RWxlbWVudC5lUmVzb3VyY2UoKSBpbnN0YW5jZW9mIFhNTFJlc291cmNlKSB7Ci0JCQloYXNTdHJ1Y3R1cmFsVVJJID0gKChYTUxSZXNvdXJjZSkgdGFyZ2V0RWxlbWVudC5lUmVzb3VyY2UoKSkKLQkJCQkJLmdldElEKHRhcmdldEVsZW1lbnQpID09IG51bGw7Ci0JCX0KLQotCQlWaWV3IHZpZXcgPSBudWxsOwotCQlpZiAoaGFzU3RydWN0dXJhbFVSSQotCQkJCSYmICFsYXp5RWxlbWVudDJWaWV3TWFwLmdldEVsZW1lbnQyVmlld01hcCgpLmlzRW1wdHkoKSkgewotCQkJdmlldyA9IChWaWV3KSBsYXp5RWxlbWVudDJWaWV3TWFwLmdldEVsZW1lbnQyVmlld01hcCgpLmdldCgKLQkJCQkJdGFyZ2V0RWxlbWVudCk7Ci0JCX0gZWxzZSBpZiAoZmluZEVsZW1lbnRzSW5EaWFncmFtQnlJRChkaWFncmFtRWRpdFBhcnQsIHRhcmdldEVsZW1lbnQsCi0JCQkJbGF6eUVsZW1lbnQyVmlld01hcC5lZGl0UGFydFRtcEhvbGRlcikgPiAwKSB7Ci0JCQlFZGl0UGFydCBlZGl0UGFydCA9IChFZGl0UGFydCkgbGF6eUVsZW1lbnQyVmlld01hcC5lZGl0UGFydFRtcEhvbGRlcgotCQkJCQkuZ2V0KDApOwotCQkJbGF6eUVsZW1lbnQyVmlld01hcC5lZGl0UGFydFRtcEhvbGRlci5jbGVhcigpOwotCQkJdmlldyA9IGVkaXRQYXJ0LmdldE1vZGVsKCkgaW5zdGFuY2VvZiBWaWV3ID8gKFZpZXcpIGVkaXRQYXJ0Ci0JCQkJCS5nZXRNb2RlbCgpIDogbnVsbDsKLQkJfQotCi0JCXJldHVybiAodmlldyA9PSBudWxsKSA/IGRpYWdyYW1FZGl0UGFydC5nZXREaWFncmFtVmlldygpIDogdmlldzsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBjbGFzcyBMYXp5RWxlbWVudDJWaWV3TWFwIHsKLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgTWFwIGVsZW1lbnQyVmlld01hcDsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSBWaWV3IHNjb3BlOwotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIFNldCBlbGVtZW50U2V0OwotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgZmluYWwgTGlzdCBlZGl0UGFydFRtcEhvbGRlciA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIExhenlFbGVtZW50MlZpZXdNYXAoVmlldyBzY29wZSwgU2V0IGVsZW1lbnRzKSB7Ci0JCQl0aGlzLnNjb3BlID0gc2NvcGU7Ci0JCQl0aGlzLmVsZW1lbnRTZXQgPSBlbGVtZW50czsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgZmluYWwgTWFwIGdldEVsZW1lbnQyVmlld01hcCgpIHsKLQkJCWlmIChlbGVtZW50MlZpZXdNYXAgPT0gbnVsbCkgewotCQkJCWVsZW1lbnQyVmlld01hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCQkJLy8gbWFwIHBvc3NpYmxlIG5vdGF0aW9uIGVsZW1lbnRzIHRvIGl0c2VsZiBhcyB0aGVzZSBjYW4ndCBiZSBmb3VuZCBieSB2aWV3LmdldEVsZW1lbnQoKQotCQkJCWZvciAoSXRlcmF0b3IgaXQgPSBlbGVtZW50U2V0Lml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQkJRU9iamVjdCBlbGVtZW50ID0gKEVPYmplY3QpIGl0Lm5leHQoKTsKLQkJCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBWaWV3KSB7Ci0JCQkJCQlWaWV3IHZpZXcgPSAoVmlldykgZWxlbWVudDsKLQkJCQkJCWlmICh2aWV3LmdldERpYWdyYW0oKSA9PSBzY29wZS5nZXREaWFncmFtKCkpIHsKLQkJCQkJCQllbGVtZW50MlZpZXdNYXAucHV0KGVsZW1lbnQsIGVsZW1lbnQpOyAvLyB0YWtlIG9ubHkgdGhvc2UgdGhhdCBwYXJ0IG9mIG91ciBkaWFncmFtCi0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQlidWlsZEVsZW1lbnQyVmlld01hcChzY29wZSwgZWxlbWVudDJWaWV3TWFwLCBlbGVtZW50U2V0KTsKLQkJCX0KLQkJCXJldHVybiBlbGVtZW50MlZpZXdNYXA7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJc3RhdGljIE1hcCBidWlsZEVsZW1lbnQyVmlld01hcChWaWV3IHBhcmVudFZpZXcsIE1hcCBlbGVtZW50MlZpZXdNYXAsCi0JCQkJU2V0IGVsZW1lbnRzKSB7Ci0JCQlpZiAoZWxlbWVudHMuc2l6ZSgpID09IGVsZW1lbnQyVmlld01hcC5zaXplKCkpCi0JCQkJcmV0dXJuIGVsZW1lbnQyVmlld01hcDsKLQotCQkJaWYgKHBhcmVudFZpZXcuaXNTZXRFbGVtZW50KCkKLQkJCQkJJiYgIWVsZW1lbnQyVmlld01hcC5jb250YWluc0tleShwYXJlbnRWaWV3LmdldEVsZW1lbnQoKSkKLQkJCQkJJiYgZWxlbWVudHMuY29udGFpbnMocGFyZW50Vmlldy5nZXRFbGVtZW50KCkpKSB7Ci0JCQkJZWxlbWVudDJWaWV3TWFwLnB1dChwYXJlbnRWaWV3LmdldEVsZW1lbnQoKSwgcGFyZW50Vmlldyk7Ci0JCQkJaWYgKGVsZW1lbnRzLnNpemUoKSA9PSBlbGVtZW50MlZpZXdNYXAuc2l6ZSgpKQotCQkJCQlyZXR1cm4gZWxlbWVudDJWaWV3TWFwOwotCQkJfQotCi0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gcGFyZW50Vmlldy5nZXRDaGlsZHJlbigpLml0ZXJhdG9yKCk7IGl0Ci0JCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJYnVpbGRFbGVtZW50MlZpZXdNYXAoKFZpZXcpIGl0Lm5leHQoKSwgZWxlbWVudDJWaWV3TWFwLAotCQkJCQkJZWxlbWVudHMpOwotCQkJCWlmIChlbGVtZW50cy5zaXplKCkgPT0gZWxlbWVudDJWaWV3TWFwLnNpemUoKSkKLQkJCQkJcmV0dXJuIGVsZW1lbnQyVmlld01hcDsKLQkJCX0KLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBwYXJlbnRWaWV3LmdldFNvdXJjZUVkZ2VzKCkuaXRlcmF0b3IoKTsgaXQKLQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQlidWlsZEVsZW1lbnQyVmlld01hcCgoVmlldykgaXQubmV4dCgpLCBlbGVtZW50MlZpZXdNYXAsCi0JCQkJCQllbGVtZW50cyk7Ci0JCQkJaWYgKGVsZW1lbnRzLnNpemUoKSA9PSBlbGVtZW50MlZpZXdNYXAuc2l6ZSgpKQotCQkJCQlyZXR1cm4gZWxlbWVudDJWaWV3TWFwOwotCQkJfQotCQkJZm9yIChJdGVyYXRvciBpdCA9IHBhcmVudFZpZXcuZ2V0U291cmNlRWRnZXMoKS5pdGVyYXRvcigpOyBpdAotCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCWJ1aWxkRWxlbWVudDJWaWV3TWFwKChWaWV3KSBpdC5uZXh0KCksIGVsZW1lbnQyVmlld01hcCwKLQkJCQkJCWVsZW1lbnRzKTsKLQkJCQlpZiAoZWxlbWVudHMuc2l6ZSgpID09IGVsZW1lbnQyVmlld01hcC5zaXplKCkpCi0JCQkJCXJldHVybiBlbGVtZW50MlZpZXdNYXA7Ci0JCQl9Ci0JCQlyZXR1cm4gZWxlbWVudDJWaWV3TWFwOwotCQl9Ci0JfSAvL0xhenlFbGVtZW50MlZpZXdNYXAJCi0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9wYXJ0L1VNTERpYWdyYW1GaWxlQ3JlYXRvci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL3BhcnQvVU1MRGlhZ3JhbUZpbGVDcmVhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1MjRhODAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL3BhcnQvVU1MRGlhZ3JhbUZpbGVDcmVhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnBhcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlc291cmNlcy5lZGl0b3IuaWRlLnV0aWwuSURFRWRpdG9yRmlsZUNyZWF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXNvdXJjZXMuZWRpdG9yLnV0aWwuRGlhZ3JhbUZpbGVDcmVhdG9yOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFVNTERpYWdyYW1GaWxlQ3JlYXRvciBleHRlbmRzIElERUVkaXRvckZpbGVDcmVhdG9yIHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBVTUxEaWFncmFtRmlsZUNyZWF0b3IgSU5TVEFOQ0UgPSBuZXcgVU1MRGlhZ3JhbUZpbGVDcmVhdG9yKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBEaWFncmFtRmlsZUNyZWF0b3IgZ2V0SW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRFeHRlbnNpb24oKSB7Ci0JCXJldHVybiAiLnhtaSI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvcGFydC9VTUxEaWFncmFtUHJlZmVyZW5jZUluaXRpYWxpemVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvcGFydC9VTUxEaWFncmFtUHJlZmVyZW5jZUluaXRpYWxpemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkMmRjOWIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL3BhcnQvVU1MRGlhZ3JhbVByZWZlcmVuY2VJbml0aWFsaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5wYXJ0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS51dGlsLkRpYWdyYW1Db3JlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnByZWZlcmVuY2VzLkRpYWdyYW1QcmVmZXJlbmNlSW5pdGlhbGl6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFVNTERpYWdyYW1QcmVmZXJlbmNlSW5pdGlhbGl6ZXIgZXh0ZW5kcwotCQlEaWFncmFtUHJlZmVyZW5jZUluaXRpYWxpemVyIHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSVByZWZlcmVuY2VTdG9yZSBnZXRQcmVmZXJlbmNlU3RvcmUoKSB7Ci0JCXJldHVybiBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5wYXJ0LkFjdGl2aXR5RGlhZ3JhbUVkaXRvclBsdWdpbgotCQkJCS5nZXRJbnN0YW5jZSgpLmdldFByZWZlcmVuY2VTdG9yZSgpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplRGVmYXVsdFByZWZlcmVuY2VzKCkgewotCQlzdXBlci5pbml0aWFsaXplRGVmYXVsdFByZWZlcmVuY2VzKCk7Ci0JCQotCQlEaWFncmFtQ29yZVV0aWwuc2V0RGVmYXVsdEZvbnRQcmVmZXJlbmNlKGdldFByZWZlcmVuY2VTdG9yZSgpKTsKLQkJRGlhZ3JhbUNvcmVVdGlsLnNldERlZmF1bHRMaW5lU3R5bGUoZ2V0UHJlZmVyZW5jZVN0b3JlKCkpOwotCQkKLQkJLy8gdHVybiBvZmYgY29ubmVjdGlvbiBoYW5kbGVzIHRvIHNob3cgYnkgZGVmYXVsdAotCQlEaWFncmFtQ29yZVV0aWwuaGlkZUNvbm5lY3Rpb25IYW5kbGVzKGdldFByZWZlcmVuY2VTdG9yZSgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvcGFydC9VTUxEb2N1bWVudFByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvcGFydC9VTUxEb2N1bWVudFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhZDFkN2UuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL3BhcnQvVU1MRG9jdW1lbnRQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA1NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnBhcnQ7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklTdG9yYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdWJQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSVNjaGVkdWxpbmdSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLk11bHRpUnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnVpLlVSSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FQ29udGVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLkRlbXVsdGlwbGV4aW5nTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLk5vdGlmaWNhdGlvbkZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLndvcmtzcGFjZS51dGlsLldvcmtzcGFjZVN5bmNocm9uaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuRGlhZ3JhbUVkaXRpbmdEb21haW5GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVzb3VyY2VzLmVkaXRvci5kb2N1bWVudC5BYnN0cmFjdERvY3VtZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXNvdXJjZXMuZWRpdG9yLmRvY3VtZW50LkRpYWdyYW1Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlc291cmNlcy5lZGl0b3IuZG9jdW1lbnQuRGlhZ3JhbU1vZGlmaWNhdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVzb3VyY2VzLmVkaXRvci5kb2N1bWVudC5JRGlhZ3JhbURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVzb3VyY2VzLmVkaXRvci5kb2N1bWVudC5JRGlhZ3JhbURvY3VtZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXNvdXJjZXMuZWRpdG9yLmRvY3VtZW50LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlc291cmNlcy5lZGl0b3IuaWRlLmRvY3VtZW50LkZpbGVEaWFncmFtRG9jdW1lbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlc291cmNlcy5lZGl0b3IuaWRlLmRvY3VtZW50LkZpbGVEaWFncmFtTW9kaWZpY2F0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXNvdXJjZXMuZWRpdG9yLmludGVybmFsLkVkaXRvclN0YXR1c0NvZGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVzb3VyY2VzLmVkaXRvci5pbnRlcm5hbC51dGlsLkRpYWdyYW1JT1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvcmUucmVzb3VyY2VzLkdNRlJlc291cmNlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5EaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUZpbGVFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LkZpbGVFZGl0b3JJbnB1dDsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBVTUxEb2N1bWVudFByb3ZpZGVyIGV4dGVuZHMgQWJzdHJhY3REb2N1bWVudFByb3ZpZGVyIGltcGxlbWVudHMKLQkJSURpYWdyYW1Eb2N1bWVudFByb3ZpZGVyIHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRWxlbWVudEluZm8gY3JlYXRlRWxlbWVudEluZm8oT2JqZWN0IGVsZW1lbnQpCi0JCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmIChmYWxzZSA9PSBlbGVtZW50IGluc3RhbmNlb2YgRmlsZUVkaXRvcklucHV0Ci0JCQkJJiYgZmFsc2UgPT0gZWxlbWVudCBpbnN0YW5jZW9mIFVSSUVkaXRvcklucHV0KSB7Ci0JCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbigKLQkJCQkJbmV3IFN0YXR1cygKLQkJCQkJCQlJU3RhdHVzLkVSUk9SLAotCQkJCQkJCUFjdGl2aXR5RGlhZ3JhbUVkaXRvclBsdWdpbi5JRCwKLQkJCQkJCQkwLAotCQkJCQkJCU5MUwotCQkJCQkJCQkJLmJpbmQoCi0JCQkJCQkJCQkJCU1lc3NhZ2VzLlVNTERvY3VtZW50UHJvdmlkZXJfSW5jb3JyZWN0SW5wdXRFcnJvciwKLQkJCQkJCQkJCQkJbmV3IE9iamVjdFtdIHsKLQkJCQkJCQkJCQkJCQllbGVtZW50LAotCQkJCQkJCQkJCQkJCSJvcmcuZWNsaXBzZS51aS5wYXJ0LkZpbGVFZGl0b3JJbnB1dCIsCi0JCQkJCQkJCQkJCQkJIm9yZy5lY2xpcHNlLmVtZi5jb21tb24udWkuVVJJRWRpdG9ySW5wdXQiIH0pLAotCQkJCQkJCW51bGwpKTsKLQkJfQotCQlJRWRpdG9ySW5wdXQgZWRpdG9ySW5wdXQgPSAoSUVkaXRvcklucHV0KSBlbGVtZW50OwotCQlJRGlhZ3JhbURvY3VtZW50IGRvY3VtZW50ID0gKElEaWFncmFtRG9jdW1lbnQpIGNyZWF0ZURvY3VtZW50KGVkaXRvcklucHV0KTsKLQotCQlSZXNvdXJjZVNldEluZm8gaW5mbyA9IG5ldyBSZXNvdXJjZVNldEluZm8oZG9jdW1lbnQsIGVkaXRvcklucHV0KTsKLQkJaW5mby5zZXRNb2RpZmljYXRpb25TdGFtcChjb21wdXRlTW9kaWZpY2F0aW9uU3RhbXAoaW5mbykpOwotCQlpbmZvLmZTdGF0dXMgPSBudWxsOwotCQlyZXR1cm4gaW5mbzsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElEb2N1bWVudCBjcmVhdGVEb2N1bWVudChPYmplY3QgZWxlbWVudCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZiAoZmFsc2UgPT0gZWxlbWVudCBpbnN0YW5jZW9mIEZpbGVFZGl0b3JJbnB1dAotCQkJCSYmIGZhbHNlID09IGVsZW1lbnQgaW5zdGFuY2VvZiBVUklFZGl0b3JJbnB1dCkgewotCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24oCi0JCQkJCW5ldyBTdGF0dXMoCi0JCQkJCQkJSVN0YXR1cy5FUlJPUiwKLQkJCQkJCQlBY3Rpdml0eURpYWdyYW1FZGl0b3JQbHVnaW4uSUQsCi0JCQkJCQkJMCwKLQkJCQkJCQlOTFMKLQkJCQkJCQkJCS5iaW5kKAotCQkJCQkJCQkJCQlNZXNzYWdlcy5VTUxEb2N1bWVudFByb3ZpZGVyX0luY29ycmVjdElucHV0RXJyb3IsCi0JCQkJCQkJCQkJCW5ldyBPYmplY3RbXSB7Ci0JCQkJCQkJCQkJCQkJZWxlbWVudCwKLQkJCQkJCQkJCQkJCQkib3JnLmVjbGlwc2UudWkucGFydC5GaWxlRWRpdG9ySW5wdXQiLAotCQkJCQkJCQkJCQkJCSJvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnVpLlVSSUVkaXRvcklucHV0IiB9KSwKLQkJCQkJCQludWxsKSk7Ci0JCX0KLQkJSURvY3VtZW50IGRvY3VtZW50ID0gY3JlYXRlRW1wdHlEb2N1bWVudCgpOwotCQlzZXREb2N1bWVudENvbnRlbnQoZG9jdW1lbnQsIChJRWRpdG9ySW5wdXQpIGVsZW1lbnQpOwotCQlzZXR1cERvY3VtZW50KGVsZW1lbnQsIGRvY3VtZW50KTsKLQkJcmV0dXJuIGRvY3VtZW50OwotCX0KLQotCS8qKgotCSAqIFNldHMgdXAgdGhlIGdpdmVuIGRvY3VtZW50IGFzIGl0IHdvdWxkIGJlIHByb3ZpZGVkIGZvciB0aGUgZ2l2ZW4gZWxlbWVudC4gVGhlCi0JICogY29udGVudCBvZiB0aGUgZG9jdW1lbnQgaXMgbm90IGNoYW5nZWQuIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBpcyBlbXB0eS4KLQkgKiBTdWJjbGFzc2VzIG1heSByZWltcGxlbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudCB0aGUgYmx1ZS1wcmludCBlbGVtZW50Ci0JICogQHBhcmFtIGRvY3VtZW50IHRoZSBkb2N1bWVudCB0byBzZXQgdXAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0dXBEb2N1bWVudChPYmplY3QgZWxlbWVudCwgSURvY3VtZW50IGRvY3VtZW50KSB7Ci0JCS8vIGZvciBzdWJjbGFzc2VzCi0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgbG9uZyBjb21wdXRlTW9kaWZpY2F0aW9uU3RhbXAoUmVzb3VyY2VTZXRJbmZvIGluZm8pIHsKLQkJaW50IHJlc3VsdCA9IDA7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSBpbmZvLmdldFJlc291cmNlU2V0KCkuZ2V0UmVzb3VyY2VzKCkuaXRlcmF0b3IoKTsgaXQKLQkJCQkuaGFzTmV4dCgpOykgewotCQkJUmVzb3VyY2UgbmV4dFJlc291cmNlID0gKFJlc291cmNlKSBpdC5uZXh0KCk7Ci0JCQlJRmlsZSBmaWxlID0gV29ya3NwYWNlU3luY2hyb25pemVyLmdldEZpbGUobmV4dFJlc291cmNlKTsKLQkJCWlmIChmaWxlICE9IG51bGwpIHsKLQkJCQlpZiAoZmlsZS5nZXRMb2NhdGlvbigpICE9IG51bGwpIHsKLQkJCQkJcmVzdWx0ICs9IGZpbGUuZ2V0TG9jYXRpb24oKS50b0ZpbGUoKS5sYXN0TW9kaWZpZWQoKTsKLQkJCQl9IGVsc2UgewotCQkJCQlyZXN1bHQgKz0gZmlsZS5nZXRNb2RpZmljYXRpb25TdGFtcCgpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSURvY3VtZW50IGNyZWF0ZUVtcHR5RG9jdW1lbnQoKSB7Ci0JCURpYWdyYW1Eb2N1bWVudCBkb2N1bWVudCA9IG5ldyBEaWFncmFtRG9jdW1lbnQoKTsKLQkJZG9jdW1lbnQuc2V0RWRpdGluZ0RvbWFpbihjcmVhdGVFZGl0aW5nRG9tYWluKCkpOwotCQlyZXR1cm4gZG9jdW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gY3JlYXRlRWRpdGluZ0RvbWFpbigpIHsKLQkJVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gZWRpdGluZ0RvbWFpbiA9IERpYWdyYW1FZGl0aW5nRG9tYWluRmFjdG9yeQotCQkJCS5nZXRJbnN0YW5jZSgpLmNyZWF0ZUVkaXRpbmdEb21haW4oKTsKLQkJZWRpdGluZ0RvbWFpbi5zZXRJRCgib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuRWRpdGluZ0RvbWFpbiIpOyAvLyROT04tTkxTLTEkCi0JCWZpbmFsIE5vdGlmaWNhdGlvbkZpbHRlciBkaWFncmFtUmVzb3VyY2VNb2RpZmllZEZpbHRlciA9IE5vdGlmaWNhdGlvbkZpbHRlcgotCQkJCS5jcmVhdGVOb3RpZmllckZpbHRlcihlZGl0aW5nRG9tYWluLmdldFJlc291cmNlU2V0KCkpLmFuZCgKLQkJCQkJCU5vdGlmaWNhdGlvbkZpbHRlcgotCQkJCQkJCQkuY3JlYXRlRXZlbnRUeXBlRmlsdGVyKE5vdGlmaWNhdGlvbi5BREQpKS5hbmQoCi0JCQkJCQlOb3RpZmljYXRpb25GaWx0ZXIuY3JlYXRlRmVhdHVyZUZpbHRlcigKLQkJCQkJCQkJUmVzb3VyY2VTZXQuY2xhc3MsCi0JCQkJCQkJCVJlc291cmNlU2V0LlJFU09VUkNFX1NFVF9fUkVTT1VSQ0VTKSk7Ci0JCWVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VTZXQoKS5lQWRhcHRlcnMoKS5hZGQobmV3IEFkYXB0ZXIoKSB7Ci0KLQkJCXByaXZhdGUgTm90aWZpZXIgbXlUYXJnZXI7Ci0KLQkJCXB1YmxpYyBOb3RpZmllciBnZXRUYXJnZXQoKSB7Ci0JCQkJcmV0dXJuIG15VGFyZ2VyOwotCQkJfQotCi0JCQlwdWJsaWMgYm9vbGVhbiBpc0FkYXB0ZXJGb3JUeXBlKE9iamVjdCB0eXBlKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJCQlpZiAoZGlhZ3JhbVJlc291cmNlTW9kaWZpZWRGaWx0ZXIubWF0Y2hlcyhub3RpZmljYXRpb24pKSB7Ci0JCQkJCU9iamVjdCB2YWx1ZSA9IG5vdGlmaWNhdGlvbi5nZXROZXdWYWx1ZSgpOwotCQkJCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBSZXNvdXJjZSkgewotCQkJCQkJKChSZXNvdXJjZSkgdmFsdWUpLnNldFRyYWNraW5nTW9kaWZpY2F0aW9uKHRydWUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBzZXRUYXJnZXQoTm90aWZpZXIgbmV3VGFyZ2V0KSB7Ci0JCQkJbXlUYXJnZXIgPSBuZXdUYXJnZXQ7Ci0JCQl9Ci0KLQkJfSk7Ci0KLQkJcmV0dXJuIGVkaXRpbmdEb21haW47Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldERvY3VtZW50Q29udGVudChJRG9jdW1lbnQgZG9jdW1lbnQsIElFZGl0b3JJbnB1dCBlbGVtZW50KQotCQkJdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJRGlhZ3JhbURvY3VtZW50IGRpYWdyYW1Eb2N1bWVudCA9IChJRGlhZ3JhbURvY3VtZW50KSBkb2N1bWVudDsKLQkJVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gZG9tYWluID0gZGlhZ3JhbURvY3VtZW50LmdldEVkaXRpbmdEb21haW4oKTsKLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBGaWxlRWRpdG9ySW5wdXQpIHsKLQkJCUlTdG9yYWdlIHN0b3JhZ2UgPSAoKEZpbGVFZGl0b3JJbnB1dCkgZWxlbWVudCkuZ2V0U3RvcmFnZSgpOwotCQkJRGlhZ3JhbSBkaWFncmFtID0gRGlhZ3JhbUlPVXRpbC5sb2FkKGRvbWFpbiwgc3RvcmFnZSwgdHJ1ZSwKLQkJCQkJZ2V0UHJvZ3Jlc3NNb25pdG9yKCkpOwotCQkJZG9jdW1lbnQuc2V0Q29udGVudChkaWFncmFtKTsKLQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgVVJJRWRpdG9ySW5wdXQpIHsKLQkJCVVSSSB1cmkgPSAoKFVSSUVkaXRvcklucHV0KSBlbGVtZW50KS5nZXRVUkkoKTsKLQkJCVJlc291cmNlIHJlc291cmNlID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJcmVzb3VyY2UgPSBkb21haW4uZ2V0UmVzb3VyY2VTZXQoKS5nZXRSZXNvdXJjZSgKLQkJCQkJCXVyaS50cmltRnJhZ21lbnQoKSwgZmFsc2UpOwotCQkJCWlmIChyZXNvdXJjZSA9PSBudWxsKSB7Ci0JCQkJCXJlc291cmNlID0gZG9tYWluLmdldFJlc291cmNlU2V0KCkuY3JlYXRlUmVzb3VyY2UoCi0JCQkJCQkJdXJpLnRyaW1GcmFnbWVudCgpKTsKLQkJCQl9Ci0JCQkJaWYgKCFyZXNvdXJjZS5pc0xvYWRlZCgpKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlNYXAgb3B0aW9ucyA9IG5ldyBIYXNoTWFwKEdNRlJlc291cmNlRmFjdG9yeQotCQkJCQkJCQkuZ2V0RGVmYXVsdExvYWRPcHRpb25zKCkpOwotCQkJCQkJLy8gQHNlZSAxNzEwNjAgCi0JCQkJCQkvLyBvcHRpb25zLnB1dChvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLlhNTFJlc291cmNlLk9QVElPTl9SRUNPUkRfVU5LTk9XTl9GRUFUVVJFLCBCb29sZWFuLlRSVUUpOwotCQkJCQkJcmVzb3VyY2UubG9hZChvcHRpb25zKTsKLQkJCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCQkJcmVzb3VyY2UudW5sb2FkKCk7Ci0JCQkJCQl0aHJvdyBlOwotCQkJCQl9Ci0JCQkJfQotCQkJCWlmIChyZXNvdXJjZSA9PSBudWxsKSB7Ci0JCQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKAotCQkJCQkJCU1lc3NhZ2VzLlVNTERvY3VtZW50UHJvdmlkZXJfVW5hYmxlVG9Mb2FkUmVzb3VyY2VFcnJvcik7Ci0JCQkJfQotCQkJCWlmICh1cmkuZnJhZ21lbnQoKSAhPSBudWxsKSB7Ci0JCQkJCUVPYmplY3Qgcm9vdEVsZW1lbnQgPSByZXNvdXJjZS5nZXRFT2JqZWN0KHVyaS5mcmFnbWVudCgpKTsKLQkJCQkJaWYgKHJvb3RFbGVtZW50IGluc3RhbmNlb2YgRGlhZ3JhbSkgewotCQkJCQkJZG9jdW1lbnQuc2V0Q29udGVudCgoRGlhZ3JhbSkgcm9vdEVsZW1lbnQpOwotCQkJCQkJcmV0dXJuOwotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJZm9yIChJdGVyYXRvciBpdCA9IHJlc291cmNlLmdldENvbnRlbnRzKCkuaXRlcmF0b3IoKTsgaXQKLQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJT2JqZWN0IHJvb3RFbGVtZW50ID0gaXQubmV4dCgpOwotCQkJCQkJaWYgKHJvb3RFbGVtZW50IGluc3RhbmNlb2YgRGlhZ3JhbSkgewotCQkJCQkJCWRvY3VtZW50LnNldENvbnRlbnQoKERpYWdyYW0pIHJvb3RFbGVtZW50KTsKLQkJCQkJCQlyZXR1cm47Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oCi0JCQkJCQlNZXNzYWdlcy5VTUxEb2N1bWVudFByb3ZpZGVyX05vRGlhZ3JhbUluUmVzb3VyY2VFcnJvcik7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCUNvcmVFeGNlcHRpb24gdGhyb3duRXhjcCA9IG51bGw7Ci0JCQkJaWYgKGUgaW5zdGFuY2VvZiBDb3JlRXhjZXB0aW9uKSB7Ci0JCQkJCXRocm93bkV4Y3AgPSAoQ29yZUV4Y2VwdGlvbikgZTsKLQkJCQl9IGVsc2UgewotCQkJCQlTdHJpbmcgbXNnID0gZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCk7Ci0JCQkJCXRocm93bkV4Y3AgPSBuZXcgQ29yZUV4Y2VwdGlvbigKLQkJCQkJCQluZXcgU3RhdHVzKAotCQkJCQkJCQkJSVN0YXR1cy5FUlJPUiwKLQkJCQkJCQkJCUFjdGl2aXR5RGlhZ3JhbUVkaXRvclBsdWdpbi5JRCwKLQkJCQkJCQkJCTAsCi0JCQkJCQkJCQltc2cgIT0gbnVsbCA/IG1zZwotCQkJCQkJCQkJCQk6IE1lc3NhZ2VzLlVNTERvY3VtZW50UHJvdmlkZXJfRGlhZ3JhbUxvYWRpbmdFcnJvciwKLQkJCQkJCQkJCWUpKTsKLQkJCQl9Ci0JCQkJdGhyb3cgdGhyb3duRXhjcDsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKAotCQkJCQluZXcgU3RhdHVzKAotCQkJCQkJCUlTdGF0dXMuRVJST1IsCi0JCQkJCQkJQWN0aXZpdHlEaWFncmFtRWRpdG9yUGx1Z2luLklELAotCQkJCQkJCTAsCi0JCQkJCQkJTkxTCi0JCQkJCQkJCQkuYmluZCgKLQkJCQkJCQkJCQkJTWVzc2FnZXMuVU1MRG9jdW1lbnRQcm92aWRlcl9JbmNvcnJlY3RJbnB1dEVycm9yLAotCQkJCQkJCQkJCQluZXcgT2JqZWN0W10gewotCQkJCQkJCQkJCQkJCWVsZW1lbnQsCi0JCQkJCQkJCQkJCQkJIm9yZy5lY2xpcHNlLnVpLnBhcnQuRmlsZUVkaXRvcklucHV0IiwKLQkJCQkJCQkJCQkJCQkib3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51aS5VUklFZGl0b3JJbnB1dCIgfSksCi0JCQkJCQkJbnVsbCkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBsb25nIGdldE1vZGlmaWNhdGlvblN0YW1wKE9iamVjdCBlbGVtZW50KSB7Ci0JCVJlc291cmNlU2V0SW5mbyBpbmZvID0gZ2V0UmVzb3VyY2VTZXRJbmZvKGVsZW1lbnQpOwotCQlpZiAoaW5mbyAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gY29tcHV0ZU1vZGlmaWNhdGlvblN0YW1wKGluZm8pOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRNb2RpZmljYXRpb25TdGFtcChlbGVtZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNEZWxldGVkKE9iamVjdCBlbGVtZW50KSB7Ci0JCUlEaWFncmFtRG9jdW1lbnQgZG9jdW1lbnQgPSBnZXREaWFncmFtRG9jdW1lbnQoZWxlbWVudCk7Ci0JCWlmIChkb2N1bWVudCAhPSBudWxsKSB7Ci0JCQlSZXNvdXJjZSBkaWFncmFtUmVzb3VyY2UgPSBkb2N1bWVudC5nZXREaWFncmFtKCkuZVJlc291cmNlKCk7Ci0JCQlpZiAoZGlhZ3JhbVJlc291cmNlICE9IG51bGwpIHsKLQkJCQlJRmlsZSBmaWxlID0gV29ya3NwYWNlU3luY2hyb25pemVyLmdldEZpbGUoZGlhZ3JhbVJlc291cmNlKTsKLQkJCQlyZXR1cm4gZmlsZSA9PSBudWxsIHx8IGZpbGUuZ2V0TG9jYXRpb24oKSA9PSBudWxsCi0JCQkJCQl8fCAhZmlsZS5nZXRMb2NhdGlvbigpLnRvRmlsZSgpLmV4aXN0cygpOwotCQkJfQotCQl9Ci0JCXJldHVybiBzdXBlci5pc0RlbGV0ZWQoZWxlbWVudCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZVNldEluZm8gZ2V0UmVzb3VyY2VTZXRJbmZvKE9iamVjdCBlZGl0b3JJbnB1dCkgewotCQlyZXR1cm4gKFJlc291cmNlU2V0SW5mbykgc3VwZXIuZ2V0RWxlbWVudEluZm8oZWRpdG9ySW5wdXQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkaXNwb3NlRWxlbWVudEluZm8oT2JqZWN0IGVsZW1lbnQsIEVsZW1lbnRJbmZvIGluZm8pIHsKLQkJaWYgKGluZm8gaW5zdGFuY2VvZiBSZXNvdXJjZVNldEluZm8pIHsKLQkJCVJlc291cmNlU2V0SW5mbyByZXNvdXJjZVNldEluZm8gPSAoUmVzb3VyY2VTZXRJbmZvKSBpbmZvOwotCQkJcmVzb3VyY2VTZXRJbmZvLmRpc3Bvc2UoKTsKLQkJfQotCQlzdXBlci5kaXNwb3NlRWxlbWVudEluZm8oZWxlbWVudCwgaW5mbyk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRvVmFsaWRhdGVTdGF0ZShPYmplY3QgZWxlbWVudCwgT2JqZWN0IGNvbXB1dGF0aW9uQ29udGV4dCkKLQkJCXRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJUmVzb3VyY2VTZXRJbmZvIGluZm8gPSBnZXRSZXNvdXJjZVNldEluZm8oZWxlbWVudCk7Ci0JCWlmIChpbmZvICE9IG51bGwpIHsKLQkJCUNvbGxlY3Rpb24gZmlsZXMyVmFsaWRhdGUgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gaW5mby5nZXRSZXNvdXJjZVNldCgpLmdldFJlc291cmNlcygpLml0ZXJhdG9yKCk7IGl0Ci0JCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJUmVzb3VyY2UgbmV4dFJlc291cmNlID0gKFJlc291cmNlKSBpdC5uZXh0KCk7Ci0JCQkJSUZpbGUgZmlsZSA9IFdvcmtzcGFjZVN5bmNocm9uaXplci5nZXRGaWxlKG5leHRSZXNvdXJjZSk7Ci0JCQkJaWYgKGZpbGUgIT0gbnVsbCAmJiBmaWxlLmlzUmVhZE9ubHkoKSkgewotCQkJCQlmaWxlczJWYWxpZGF0ZS5hZGQoZmlsZSk7Ci0JCQkJfQotCQkJfQotCQkJUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLnZhbGlkYXRlRWRpdCgKLQkJCQkJKElGaWxlW10pIGZpbGVzMlZhbGlkYXRlLnRvQXJyYXkobmV3IElGaWxlW2ZpbGVzMlZhbGlkYXRlCi0JCQkJCQkJLnNpemUoKV0pLCBjb21wdXRhdGlvbkNvbnRleHQpOwotCQl9Ci0KLQkJc3VwZXIuZG9WYWxpZGF0ZVN0YXRlKGVsZW1lbnQsIGNvbXB1dGF0aW9uQ29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUmVhZE9ubHkoT2JqZWN0IGVsZW1lbnQpIHsKLQkJUmVzb3VyY2VTZXRJbmZvIGluZm8gPSBnZXRSZXNvdXJjZVNldEluZm8oZWxlbWVudCk7Ci0JCWlmIChpbmZvICE9IG51bGwpIHsKLQkJCWlmIChpbmZvLmlzVXBkYXRlQ2FjaGUoKSkgewotCQkJCXRyeSB7Ci0JCQkJCXVwZGF0ZUNhY2hlKGVsZW1lbnQpOwotCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZXgpIHsKLQkJCQkJQWN0aXZpdHlEaWFncmFtRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkubG9nRXJyb3IoCi0JCQkJCQkJTWVzc2FnZXMuVU1MRG9jdW1lbnRQcm92aWRlcl9pc01vZGlmaWFibGUsIGV4KTsKLQkJCQkJLy8gRXJyb3IgbWVzc2FnZSB0byBsb2cgd2FzIGluaXRpYWxseSB0YWtlbiBmcm9tIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVzb3VyY2VzLmVkaXRvci5pZGUuaW50ZXJuYWwubDEwbi5FZGl0b3JNZXNzYWdlcy5TdG9yYWdlRG9jdW1lbnRQcm92aWRlcl9pc01vZGlmaWFibGUKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gaW5mby5pc1JlYWRPbmx5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmlzUmVhZE9ubHkoZWxlbWVudCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzTW9kaWZpYWJsZShPYmplY3QgZWxlbWVudCkgewotCQlpZiAoIWlzU3RhdGVWYWxpZGF0ZWQoZWxlbWVudCkpIHsKLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgRmlsZUVkaXRvcklucHV0Ci0JCQkJCXx8IGVsZW1lbnQgaW5zdGFuY2VvZiBVUklFZGl0b3JJbnB1dCkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCVJlc291cmNlU2V0SW5mbyBpbmZvID0gZ2V0UmVzb3VyY2VTZXRJbmZvKGVsZW1lbnQpOwotCQlpZiAoaW5mbyAhPSBudWxsKSB7Ci0JCQlpZiAoaW5mby5pc1VwZGF0ZUNhY2hlKCkpIHsKLQkJCQl0cnkgewotCQkJCQl1cGRhdGVDYWNoZShlbGVtZW50KTsKLQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCUFjdGl2aXR5RGlhZ3JhbUVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmxvZ0Vycm9yKAotCQkJCQkJCU1lc3NhZ2VzLlVNTERvY3VtZW50UHJvdmlkZXJfaXNNb2RpZmlhYmxlLCBleCk7Ci0JCQkJCS8vIEVycm9yIG1lc3NhZ2UgdG8gbG9nIHdhcyBpbml0aWFsbHkgdGFrZW4gZnJvbSBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlc291cmNlcy5lZGl0b3IuaWRlLmludGVybmFsLmwxMG4uRWRpdG9yTWVzc2FnZXMuU3RvcmFnZURvY3VtZW50UHJvdmlkZXJfaXNNb2RpZmlhYmxlCi0JCQkJfQotCQkJfQotCQkJcmV0dXJuIGluZm8uaXNNb2RpZmlhYmxlKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmlzTW9kaWZpYWJsZShlbGVtZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlQ2FjaGUoT2JqZWN0IGVsZW1lbnQpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJUmVzb3VyY2VTZXRJbmZvIGluZm8gPSBnZXRSZXNvdXJjZVNldEluZm8oZWxlbWVudCk7Ci0JCWlmIChpbmZvICE9IG51bGwpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBpbmZvLmdldFJlc291cmNlU2V0KCkuZ2V0UmVzb3VyY2VzKCkuaXRlcmF0b3IoKTsgaXQKLQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQlSZXNvdXJjZSBuZXh0UmVzb3VyY2UgPSAoUmVzb3VyY2UpIGl0Lm5leHQoKTsKLQkJCQlJRmlsZSBmaWxlID0gV29ya3NwYWNlU3luY2hyb25pemVyLmdldEZpbGUobmV4dFJlc291cmNlKTsKLQkJCQlpZiAoZmlsZSAhPSBudWxsICYmIGZpbGUuaXNSZWFkT25seSgpKSB7Ci0JCQkJCWluZm8uc2V0UmVhZE9ubHkodHJ1ZSk7Ci0JCQkJCWluZm8uc2V0TW9kaWZpYWJsZShmYWxzZSk7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQl9Ci0JCQlpbmZvLnNldFJlYWRPbmx5KGZhbHNlKTsKLQkJCWluZm8uc2V0TW9kaWZpYWJsZSh0cnVlKTsKLQkJCXJldHVybjsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkb1VwZGF0ZVN0YXRlQ2FjaGUoT2JqZWN0IGVsZW1lbnQpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJUmVzb3VyY2VTZXRJbmZvIGluZm8gPSBnZXRSZXNvdXJjZVNldEluZm8oZWxlbWVudCk7Ci0JCWlmIChpbmZvICE9IG51bGwpIHsKLQkJCWluZm8uc2V0VXBkYXRlQ2FjaGUodHJ1ZSk7Ci0JCX0KLQkJc3VwZXIuZG9VcGRhdGVTdGF0ZUNhY2hlKGVsZW1lbnQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1N5bmNocm9uaXplZChPYmplY3QgZWxlbWVudCkgewotCQlSZXNvdXJjZVNldEluZm8gaW5mbyA9IGdldFJlc291cmNlU2V0SW5mbyhlbGVtZW50KTsKLQkJaWYgKGluZm8gIT0gbnVsbCkgewotCQkJcmV0dXJuIGluZm8uaXNTeW5jaHJvbml6ZWQoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuaXNTeW5jaHJvbml6ZWQoZWxlbWVudCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJU2NoZWR1bGluZ1J1bGUgZ2V0UmVzZXRSdWxlKE9iamVjdCBlbGVtZW50KSB7Ci0JCVJlc291cmNlU2V0SW5mbyBpbmZvID0gZ2V0UmVzb3VyY2VTZXRJbmZvKGVsZW1lbnQpOwotCQlpZiAoaW5mbyAhPSBudWxsKSB7Ci0JCQlDb2xsZWN0aW9uIHJ1bGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJZm9yIChJdGVyYXRvciBpdCA9IGluZm8uZ2V0UmVzb3VyY2VTZXQoKS5nZXRSZXNvdXJjZXMoKS5pdGVyYXRvcigpOyBpdAotCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCVJlc291cmNlIG5leHRSZXNvdXJjZSA9IChSZXNvdXJjZSkgaXQubmV4dCgpOwotCQkJCUlGaWxlIGZpbGUgPSBXb3Jrc3BhY2VTeW5jaHJvbml6ZXIuZ2V0RmlsZShuZXh0UmVzb3VyY2UpOwotCQkJCWlmIChmaWxlICE9IG51bGwpIHsKLQkJCQkJcnVsZXMuYWRkKFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSdWxlRmFjdG9yeSgpCi0JCQkJCQkJLm1vZGlmeVJ1bGUoZmlsZSkpOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBuZXcgTXVsdGlSdWxlKChJU2NoZWR1bGluZ1J1bGVbXSkgcnVsZXMKLQkJCQkJLnRvQXJyYXkobmV3IElTY2hlZHVsaW5nUnVsZVtydWxlcy5zaXplKCldKSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJU2NoZWR1bGluZ1J1bGUgZ2V0U2F2ZVJ1bGUoT2JqZWN0IGVsZW1lbnQpIHsKLQkJUmVzb3VyY2VTZXRJbmZvIGluZm8gPSBnZXRSZXNvdXJjZVNldEluZm8oZWxlbWVudCk7Ci0JCWlmIChpbmZvICE9IG51bGwpIHsKLQkJCUNvbGxlY3Rpb24gcnVsZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gaW5mby5nZXRSZXNvdXJjZVNldCgpLmdldFJlc291cmNlcygpLml0ZXJhdG9yKCk7IGl0Ci0JCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJUmVzb3VyY2UgbmV4dFJlc291cmNlID0gKFJlc291cmNlKSBpdC5uZXh0KCk7Ci0JCQkJSUZpbGUgZmlsZSA9IFdvcmtzcGFjZVN5bmNocm9uaXplci5nZXRGaWxlKG5leHRSZXNvdXJjZSk7Ci0JCQkJaWYgKGZpbGUgIT0gbnVsbCkgewotCQkJCQlydWxlcy5hZGQoY29tcHV0ZVNjaGVkdWxpbmdSdWxlKGZpbGUpKTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gbmV3IE11bHRpUnVsZSgoSVNjaGVkdWxpbmdSdWxlW10pIHJ1bGVzCi0JCQkJCS50b0FycmF5KG5ldyBJU2NoZWR1bGluZ1J1bGVbcnVsZXMuc2l6ZSgpXSkpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSVNjaGVkdWxpbmdSdWxlIGdldFN5bmNocm9uaXplUnVsZShPYmplY3QgZWxlbWVudCkgewotCQlSZXNvdXJjZVNldEluZm8gaW5mbyA9IGdldFJlc291cmNlU2V0SW5mbyhlbGVtZW50KTsKLQkJaWYgKGluZm8gIT0gbnVsbCkgewotCQkJQ29sbGVjdGlvbiBydWxlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBpbmZvLmdldFJlc291cmNlU2V0KCkuZ2V0UmVzb3VyY2VzKCkuaXRlcmF0b3IoKTsgaXQKLQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQlSZXNvdXJjZSBuZXh0UmVzb3VyY2UgPSAoUmVzb3VyY2UpIGl0Lm5leHQoKTsKLQkJCQlJRmlsZSBmaWxlID0gV29ya3NwYWNlU3luY2hyb25pemVyLmdldEZpbGUobmV4dFJlc291cmNlKTsKLQkJCQlpZiAoZmlsZSAhPSBudWxsKSB7Ci0JCQkJCXJ1bGVzLmFkZChSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0UnVsZUZhY3RvcnkoKQotCQkJCQkJCS5yZWZyZXNoUnVsZShmaWxlKSk7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIG5ldyBNdWx0aVJ1bGUoKElTY2hlZHVsaW5nUnVsZVtdKSBydWxlcwotCQkJCQkudG9BcnJheShuZXcgSVNjaGVkdWxpbmdSdWxlW3J1bGVzLnNpemUoKV0pKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElTY2hlZHVsaW5nUnVsZSBnZXRWYWxpZGF0ZVN0YXRlUnVsZShPYmplY3QgZWxlbWVudCkgewotCQlSZXNvdXJjZVNldEluZm8gaW5mbyA9IGdldFJlc291cmNlU2V0SW5mbyhlbGVtZW50KTsKLQkJaWYgKGluZm8gIT0gbnVsbCkgewotCQkJQ29sbGVjdGlvbiBmaWxlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBpbmZvLmdldFJlc291cmNlU2V0KCkuZ2V0UmVzb3VyY2VzKCkuaXRlcmF0b3IoKTsgaXQKLQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQlSZXNvdXJjZSBuZXh0UmVzb3VyY2UgPSAoUmVzb3VyY2UpIGl0Lm5leHQoKTsKLQkJCQlJRmlsZSBmaWxlID0gV29ya3NwYWNlU3luY2hyb25pemVyLmdldEZpbGUobmV4dFJlc291cmNlKTsKLQkJCQlpZiAoZmlsZSAhPSBudWxsKSB7Ci0JCQkJCWZpbGVzLmFkZChmaWxlKTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJ1bGVGYWN0b3J5KCkKLQkJCQkJLnZhbGlkYXRlRWRpdFJ1bGUoCi0JCQkJCQkJKElGaWxlW10pIGZpbGVzLnRvQXJyYXkobmV3IElGaWxlW2ZpbGVzLnNpemUoKV0pKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBJU2NoZWR1bGluZ1J1bGUgY29tcHV0ZVNjaGVkdWxpbmdSdWxlKElSZXNvdXJjZSB0b0NyZWF0ZU9yTW9kaWZ5KSB7Ci0JCWlmICh0b0NyZWF0ZU9yTW9kaWZ5LmV4aXN0cygpKQotCQkJcmV0dXJuIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSdWxlRmFjdG9yeSgpLm1vZGlmeVJ1bGUoCi0JCQkJCXRvQ3JlYXRlT3JNb2RpZnkpOwotCi0JCUlSZXNvdXJjZSBwYXJlbnQgPSB0b0NyZWF0ZU9yTW9kaWZ5OwotCQlkbyB7Ci0JCQkvKgotCQkJICogWFhYIFRoaXMgaXMgYSB3b3JrYXJvdW5kIGZvcgotCQkJICogaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTY3NjAxCi0JCQkgKiBJUmVzb3VyY2VSdWxlRmFjdG9yeS5jcmVhdGVSdWxlIHNob3VsZCBpdGVyYXRlIHRoZSBoaWVyYXJjaHkKLQkJCSAqIGl0c2VsZi4KLQkJCSAqLwotCQkJdG9DcmVhdGVPck1vZGlmeSA9IHBhcmVudDsKLQkJCXBhcmVudCA9IHRvQ3JlYXRlT3JNb2RpZnkuZ2V0UGFyZW50KCk7Ci0JCX0gd2hpbGUgKHBhcmVudCAhPSBudWxsICYmICFwYXJlbnQuZXhpc3RzKCkpOwotCi0JCXJldHVybiBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0UnVsZUZhY3RvcnkoKS5jcmVhdGVSdWxlKAotCQkJCXRvQ3JlYXRlT3JNb2RpZnkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkb1N5bmNocm9uaXplKE9iamVjdCBlbGVtZW50LCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCi0JCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCVJlc291cmNlU2V0SW5mbyBpbmZvID0gZ2V0UmVzb3VyY2VTZXRJbmZvKGVsZW1lbnQpOwotCQlpZiAoaW5mbyAhPSBudWxsKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gaW5mby5nZXRSZXNvdXJjZVNldCgpLmdldFJlc291cmNlcygpLml0ZXJhdG9yKCk7IGl0Ci0JCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJUmVzb3VyY2UgbmV4dFJlc291cmNlID0gKFJlc291cmNlKSBpdC5uZXh0KCk7Ci0JCQkJaGFuZGxlRWxlbWVudENoYW5nZWQoaW5mbywgbmV4dFJlc291cmNlLCBtb25pdG9yKTsKLQkJCX0KLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5kb1N5bmNocm9uaXplKGVsZW1lbnQsIG1vbml0b3IpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkb1NhdmVEb2N1bWVudChJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIE9iamVjdCBlbGVtZW50LAotCQkJSURvY3VtZW50IGRvY3VtZW50LCBib29sZWFuIG92ZXJ3cml0ZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlSZXNvdXJjZVNldEluZm8gaW5mbyA9IGdldFJlc291cmNlU2V0SW5mbyhlbGVtZW50KTsKLQkJaWYgKGluZm8gIT0gbnVsbCkgewotCQkJaWYgKCFvdmVyd3JpdGUgJiYgIWluZm8uaXNTeW5jaHJvbml6ZWQoKSkgewotCQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKAotCQkJCQkJbmV3IFN0YXR1cygKLQkJCQkJCQkJSVN0YXR1cy5FUlJPUiwKLQkJCQkJCQkJQWN0aXZpdHlEaWFncmFtRWRpdG9yUGx1Z2luLklELAotCQkJCQkJCQlJU3RhdHVzLk9LLAotCQkJCQkJCQlNZXNzYWdlcy5VTUxEb2N1bWVudFByb3ZpZGVyX1Vuc3luY2hyb25pemVkRmlsZVNhdmVFcnJvciwKLQkJCQkJCQkJbnVsbCkpOwotCQkJfQotCQkJaW5mby5zdG9wUmVzb3VyY2VMaXN0ZW5pbmcoKTsKLQkJCWZpcmVFbGVtZW50U3RhdGVDaGFuZ2luZyhlbGVtZW50KTsKLQkJCUxpc3QgcmVzb3VyY2VzID0gaW5mby5nZXRSZXNvdXJjZVNldCgpLmdldFJlc291cmNlcygpOwotCQkJdHJ5IHsKLQkJCQltb25pdG9yLmJlZ2luVGFzayhNZXNzYWdlcy5VTUxEb2N1bWVudFByb3ZpZGVyX1NhdmVEaWFncmFtVGFzaywKLQkJCQkJCXJlc291cmNlcy5zaXplKCkgKyAxKTsgLy8iU2F2aW5nIGRpYWdyYW0iCi0JCQkJZm9yIChJdGVyYXRvciBpdCA9IHJlc291cmNlcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJCVJlc291cmNlIG5leHRSZXNvdXJjZSA9IChSZXNvdXJjZSkgaXQubmV4dCgpOwotCQkJCQltb25pdG9yLnNldFRhc2tOYW1lKE5MUy5iaW5kKAotCQkJCQkJCU1lc3NhZ2VzLlVNTERvY3VtZW50UHJvdmlkZXJfU2F2ZU5leHRSZXNvdXJjZVRhc2ssCi0JCQkJCQkJbmV4dFJlc291cmNlLmdldFVSSSgpKSk7Ci0JCQkJCWlmIChuZXh0UmVzb3VyY2UuaXNMb2FkZWQoKSkgewotCQkJCQkJdHJ5IHsKLQkJCQkJCQluZXh0UmVzb3VyY2Uuc2F2ZShVTUxEaWFncmFtRWRpdG9yVXRpbAotCQkJCQkJCQkJLmdldFNhdmVPcHRpb25zKCkpOwotCQkJCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCQkJCWZpcmVFbGVtZW50U3RhdGVDaGFuZ2VGYWlsZWQoZWxlbWVudCk7Ci0JCQkJCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLAotCQkJCQkJCQkJQWN0aXZpdHlEaWFncmFtRWRpdG9yUGx1Z2luLklELAotCQkJCQkJCQkJRWRpdG9yU3RhdHVzQ29kZXMuUkVTT1VSQ0VfRkFJTFVSRSwgZQotCQkJCQkJCQkJCQkuZ2V0TG9jYWxpemVkTWVzc2FnZSgpLCBudWxsKSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJbW9uaXRvci53b3JrZWQoMSk7Ci0JCQkJfQotCQkJCW1vbml0b3IuZG9uZSgpOwotCQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiB4KSB7Ci0JCQkJZmlyZUVsZW1lbnRTdGF0ZUNoYW5nZUZhaWxlZChlbGVtZW50KTsKLQkJCQl0aHJvdyB4OwotCQkJfSBmaW5hbGx5IHsKLQkJCQlpbmZvLnN0YXJ0UmVzb3VyY2VMaXN0ZW5pbmcoKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVFbGVtZW50Q2hhbmdlZChSZXNvdXJjZVNldEluZm8gaW5mbywKLQkJCVJlc291cmNlIGNoYW5nZWRSZXNvdXJjZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCUlGaWxlIGZpbGUgPSBXb3Jrc3BhY2VTeW5jaHJvbml6ZXIuZ2V0RmlsZShjaGFuZ2VkUmVzb3VyY2UpOwotCQlpZiAoZmlsZSAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCWZpbGUucmVmcmVzaExvY2FsKElSZXNvdXJjZS5ERVBUSF9JTkZJTklURSwgbW9uaXRvcik7Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGV4KSB7Ci0JCQkJQWN0aXZpdHlEaWFncmFtRWRpdG9yUGx1Z2luCi0JCQkJCQkuZ2V0SW5zdGFuY2UoKQotCQkJCQkJLmxvZ0Vycm9yKAotCQkJCQkJCQlNZXNzYWdlcy5VTUxEb2N1bWVudFByb3ZpZGVyX2hhbmRsZUVsZW1lbnRDb250ZW50Q2hhbmdlZCwKLQkJCQkJCQkJZXgpOwotCQkJCS8vIEVycm9yIG1lc3NhZ2UgdG8gbG9nIHdhcyBpbml0aWFsbHkgdGFrZW4gZnJvbSBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlc291cmNlcy5lZGl0b3IuaWRlLmludGVybmFsLmwxMG4uRWRpdG9yTWVzc2FnZXMuRmlsZURvY3VtZW50UHJvdmlkZXJfaGFuZGxlRWxlbWVudENvbnRlbnRDaGFuZ2VkCi0JCQl9Ci0JCX0KLQkJY2hhbmdlZFJlc291cmNlLnVubG9hZCgpOwotCi0JCWZpcmVFbGVtZW50Q29udGVudEFib3V0VG9CZVJlcGxhY2VkKGluZm8uZ2V0RWRpdG9ySW5wdXQoKSk7Ci0JCXJlbW92ZVVuY2hhbmdlZEVsZW1lbnRMaXN0ZW5lcnMoaW5mby5nZXRFZGl0b3JJbnB1dCgpLCBpbmZvKTsKLQkJaW5mby5mU3RhdHVzID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXNldERvY3VtZW50Q29udGVudChpbmZvLmZEb2N1bWVudCwgaW5mby5nZXRFZGl0b3JJbnB1dCgpKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlpbmZvLmZTdGF0dXMgPSBlLmdldFN0YXR1cygpOwotCQl9Ci0JCWlmICghaW5mby5mQ2FuQmVTYXZlZCkgewotCQkJaW5mby5zZXRNb2RpZmljYXRpb25TdGFtcChjb21wdXRlTW9kaWZpY2F0aW9uU3RhbXAoaW5mbykpOwotCQl9Ci0JCWFkZFVuY2hhbmdlZEVsZW1lbnRMaXN0ZW5lcnMoaW5mby5nZXRFZGl0b3JJbnB1dCgpLCBpbmZvKTsKLQkJZmlyZUVsZW1lbnRDb250ZW50UmVwbGFjZWQoaW5mby5nZXRFZGl0b3JJbnB1dCgpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlRWxlbWVudE1vdmVkKElFZGl0b3JJbnB1dCBpbnB1dCwgVVJJIHVyaSkgewotCQlpZiAoaW5wdXQgaW5zdGFuY2VvZiBGaWxlRWRpdG9ySW5wdXQpIHsKLQkJCUlGaWxlIG5ld0ZpbGUgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGUoCi0JCQkJCW5ldyBQYXRoKFVSSS5kZWNvZGUodXJpLnBhdGgoKSkpLnJlbW92ZUZpcnN0U2VnbWVudHMoMSkpOwotCQkJZmlyZUVsZW1lbnRNb3ZlZChpbnB1dCwgbmV3RmlsZSA9PSBudWxsID8gbnVsbAotCQkJCQk6IG5ldyBGaWxlRWRpdG9ySW5wdXQobmV3RmlsZSkpOwotCQkJcmV0dXJuOwotCQl9Ci0JCS8vIFRPRE86IGFwcGVuZCBzdWZmaXggdG8gdGhlIFVSSSEgKHVzZSBkaWFncmFtIGFzIGEgcGFyYW1ldGVyKQotCQlmaXJlRWxlbWVudE1vdmVkKGlucHV0LCBuZXcgVVJJRWRpdG9ySW5wdXQodXJpKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJRWRpdG9ySW5wdXQgY3JlYXRlSW5wdXRXaXRoRWRpdGluZ0RvbWFpbihJRWRpdG9ySW5wdXQgZWRpdG9ySW5wdXQsCi0JCQlUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiBkb21haW4pIHsKLQkJcmV0dXJuIGVkaXRvcklucHV0OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSURpYWdyYW1Eb2N1bWVudCBnZXREaWFncmFtRG9jdW1lbnQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJSURvY3VtZW50IGRvYyA9IGdldERvY3VtZW50KGVsZW1lbnQpOwotCQlpZiAoZG9jIGluc3RhbmNlb2YgSURpYWdyYW1Eb2N1bWVudCkgewotCQkJcmV0dXJuIChJRGlhZ3JhbURvY3VtZW50KSBkb2M7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJUnVubmFibGVDb250ZXh0IGdldE9wZXJhdGlvblJ1bm5lcihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBjbGFzcyBSZXNvdXJjZVNldEluZm8gZXh0ZW5kcyBFbGVtZW50SW5mbyB7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgbG9uZyBteU1vZGlmaWNhdGlvblN0YW1wID0gSVJlc291cmNlLk5VTExfU1RBTVA7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgV29ya3NwYWNlU3luY2hyb25pemVyIG15U3luY2hyb25pemVyOwotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIENvbGxlY3Rpb24gbXlVblN5bmNocm9uaXplZFJlc291cmNlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSBJRGlhZ3JhbURvY3VtZW50IG15RG9jdW1lbnQ7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgSUVkaXRvcklucHV0IG15RWRpdG9ySW5wdXQ7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgYm9vbGVhbiBteVVwZGF0ZUNhY2hlID0gdHJ1ZTsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSBib29sZWFuIG15TW9kaWZpYWJsZSA9IGZhbHNlOwotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIGJvb2xlYW4gbXlSZWFkT25seSA9IHRydWU7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgUmVzb3VyY2VTZXRNb2RpZmljYXRpb25MaXN0ZW5lciBteVJlc291cmNlU2V0TGlzdGVuZXI7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBSZXNvdXJjZVNldEluZm8oSURpYWdyYW1Eb2N1bWVudCBkb2N1bWVudCwKLQkJCQlJRWRpdG9ySW5wdXQgZWRpdG9ySW5wdXQpIHsKLQkJCXN1cGVyKGRvY3VtZW50KTsKLQkJCW15RG9jdW1lbnQgPSBkb2N1bWVudDsKLQkJCW15RWRpdG9ySW5wdXQgPSBlZGl0b3JJbnB1dDsKLQkJCXN0YXJ0UmVzb3VyY2VMaXN0ZW5pbmcoKTsKLQkJCW15UmVzb3VyY2VTZXRMaXN0ZW5lciA9IG5ldyBSZXNvdXJjZVNldE1vZGlmaWNhdGlvbkxpc3RlbmVyKHRoaXMpOwotCQkJZ2V0UmVzb3VyY2VTZXQoKS5lQWRhcHRlcnMoKS5hZGQobXlSZXNvdXJjZVNldExpc3RlbmVyKTsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgbG9uZyBnZXRNb2RpZmljYXRpb25TdGFtcCgpIHsKLQkJCXJldHVybiBteU1vZGlmaWNhdGlvblN0YW1wOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyB2b2lkIHNldE1vZGlmaWNhdGlvblN0YW1wKGxvbmcgbW9kaWZpY2F0aW9uU3RhbXApIHsKLQkJCW15TW9kaWZpY2F0aW9uU3RhbXAgPSBtb2RpZmljYXRpb25TdGFtcDsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgUmVzb3VyY2VTZXQgZ2V0UmVzb3VyY2VTZXQoKSB7Ci0JCQlyZXR1cm4gbXlEb2N1bWVudC5nZXRFZGl0aW5nRG9tYWluKCkuZ2V0UmVzb3VyY2VTZXQoKTsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgSUVkaXRvcklucHV0IGdldEVkaXRvcklucHV0KCkgewotCQkJcmV0dXJuIG15RWRpdG9ySW5wdXQ7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJCXN0b3BSZXNvdXJjZUxpc3RlbmluZygpOwotCQkJZ2V0UmVzb3VyY2VTZXQoKS5lQWRhcHRlcnMoKS5yZW1vdmUobXlSZXNvdXJjZVNldExpc3RlbmVyKTsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBnZXRSZXNvdXJjZVNldCgpLmdldFJlc291cmNlcygpLml0ZXJhdG9yKCk7IGl0Ci0JCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSAoUmVzb3VyY2UpIGl0Lm5leHQoKTsKLQkJCQlyZXNvdXJjZS51bmxvYWQoKTsKLQkJCX0KLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgYm9vbGVhbiBpc1N5bmNocm9uaXplZCgpIHsKLQkJCXJldHVybiBteVVuU3luY2hyb25pemVkUmVzb3VyY2VzLnNpemUoKSA9PSAwOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyB2b2lkIHNldFVuU3luY2hyb25pemVkKFJlc291cmNlIHJlc291cmNlKSB7Ci0JCQlteVVuU3luY2hyb25pemVkUmVzb3VyY2VzLmFkZChyZXNvdXJjZSk7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHZvaWQgc2V0U3luY2hyb25pemVkKFJlc291cmNlIHJlc291cmNlKSB7Ci0JCQlteVVuU3luY2hyb25pemVkUmVzb3VyY2VzLnJlbW92ZShyZXNvdXJjZSk7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIGZpbmFsIHZvaWQgc3RvcFJlc291cmNlTGlzdGVuaW5nKCkgewotCQkJbXlTeW5jaHJvbml6ZXIuZGlzcG9zZSgpOwotCQkJbXlTeW5jaHJvbml6ZXIgPSBudWxsOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBmaW5hbCB2b2lkIHN0YXJ0UmVzb3VyY2VMaXN0ZW5pbmcoKSB7Ci0JCQlteVN5bmNocm9uaXplciA9IG5ldyBXb3Jrc3BhY2VTeW5jaHJvbml6ZXIobXlEb2N1bWVudAotCQkJCQkuZ2V0RWRpdGluZ0RvbWFpbigpLCBuZXcgU3luY2hyb25pemVyRGVsZWdhdGUoKSk7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIGJvb2xlYW4gaXNVcGRhdGVDYWNoZSgpIHsKLQkJCXJldHVybiBteVVwZGF0ZUNhY2hlOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyB2b2lkIHNldFVwZGF0ZUNhY2hlKGJvb2xlYW4gdXBkYXRlKSB7Ci0JCQlteVVwZGF0ZUNhY2hlID0gdXBkYXRlOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBib29sZWFuIGlzTW9kaWZpYWJsZSgpIHsKLQkJCXJldHVybiBteU1vZGlmaWFibGU7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHZvaWQgc2V0TW9kaWZpYWJsZShib29sZWFuIG1vZGlmaWFibGUpIHsKLQkJCW15TW9kaWZpYWJsZSA9IG1vZGlmaWFibGU7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIGJvb2xlYW4gaXNSZWFkT25seSgpIHsKLQkJCXJldHVybiBteVJlYWRPbmx5OwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyB2b2lkIHNldFJlYWRPbmx5KGJvb2xlYW4gcmVhZE9ubHkpIHsKLQkJCW15UmVhZE9ubHkgPSByZWFkT25seTsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIGNsYXNzIFN5bmNocm9uaXplckRlbGVnYXRlIGltcGxlbWVudHMKLQkJCQlXb3Jrc3BhY2VTeW5jaHJvbml6ZXIuRGVsZWdhdGUgewotCi0JCQkvKioKLQkJCSAqIEBnZW5lcmF0ZWQKLQkJCSAqLwotCQkJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJCX0KLQotCQkJLyoqCi0JCQkgKiBAZ2VuZXJhdGVkCi0JCQkgKi8KLQkJCXB1YmxpYyBib29sZWFuIGhhbmRsZVJlc291cmNlQ2hhbmdlZChmaW5hbCBSZXNvdXJjZSByZXNvdXJjZSkgewotCQkJCXN5bmNocm9uaXplZCAoUmVzb3VyY2VTZXRJbmZvLnRoaXMpIHsKLQkJCQkJaWYgKFJlc291cmNlU2V0SW5mby50aGlzLmZDYW5CZVNhdmVkKSB7Ci0JCQkJCQlSZXNvdXJjZVNldEluZm8udGhpcy5zZXRVblN5bmNocm9uaXplZChyZXNvdXJjZSk7Ci0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJfQotCQkJCX0KLQkJCQlEaXNwbGF5LmdldERlZmF1bHQoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQloYW5kbGVFbGVtZW50Q2hhbmdlZChSZXNvdXJjZVNldEluZm8udGhpcywgcmVzb3VyY2UsCi0JCQkJCQkJCW51bGwpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0KLQkJCS8qKgotCQkJICogQGdlbmVyYXRlZAotCQkJICovCi0JCQlwdWJsaWMgYm9vbGVhbiBoYW5kbGVSZXNvdXJjZURlbGV0ZWQoUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJCQlzeW5jaHJvbml6ZWQgKFJlc291cmNlU2V0SW5mby50aGlzKSB7Ci0JCQkJCWlmIChSZXNvdXJjZVNldEluZm8udGhpcy5mQ2FuQmVTYXZlZCkgewotCQkJCQkJUmVzb3VyY2VTZXRJbmZvLnRoaXMuc2V0VW5TeW5jaHJvbml6ZWQocmVzb3VyY2UpOwotCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJRGlzcGxheS5nZXREZWZhdWx0KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJZmlyZUVsZW1lbnREZWxldGVkKFJlc291cmNlU2V0SW5mby50aGlzCi0JCQkJCQkJCS5nZXRFZGl0b3JJbnB1dCgpKTsKLQkJCQkJfQotCQkJCX0pOwotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCi0JCQkvKioKLQkJCSAqIEBnZW5lcmF0ZWQKLQkJCSAqLwotCQkJcHVibGljIGJvb2xlYW4gaGFuZGxlUmVzb3VyY2VNb3ZlZChSZXNvdXJjZSByZXNvdXJjZSwKLQkJCQkJZmluYWwgVVJJIG5ld1VSSSkgewotCQkJCXN5bmNocm9uaXplZCAoUmVzb3VyY2VTZXRJbmZvLnRoaXMpIHsKLQkJCQkJaWYgKFJlc291cmNlU2V0SW5mby50aGlzLmZDYW5CZVNhdmVkKSB7Ci0JCQkJCQlSZXNvdXJjZVNldEluZm8udGhpcy5zZXRVblN5bmNocm9uaXplZChyZXNvdXJjZSk7Ci0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAobXlEb2N1bWVudC5nZXREaWFncmFtKCkuZVJlc291cmNlKCkgPT0gcmVzb3VyY2UpIHsKLQkJCQkJRGlzcGxheS5nZXREZWZhdWx0KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQloYW5kbGVFbGVtZW50TW92ZWQoUmVzb3VyY2VTZXRJbmZvLnRoaXMKLQkJCQkJCQkJCS5nZXRFZGl0b3JJbnB1dCgpLCBuZXdVUkkpOwotCQkJCQkJfQotCQkJCQl9KTsKLQkJCQl9IGVsc2UgewotCQkJCQloYW5kbGVSZXNvdXJjZURlbGV0ZWQocmVzb3VyY2UpOwotCQkJCX0KLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBjbGFzcyBSZXNvdXJjZVNldE1vZGlmaWNhdGlvbkxpc3RlbmVyIGV4dGVuZHMgRUNvbnRlbnRBZGFwdGVyIHsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSBOb3RpZmljYXRpb25GaWx0ZXIgbXlNb2RpZmllZEZpbHRlcjsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSBSZXNvdXJjZVNldEluZm8gbXlJbmZvOwotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgUmVzb3VyY2VTZXRNb2RpZmljYXRpb25MaXN0ZW5lcihSZXNvdXJjZVNldEluZm8gaW5mbykgewotCQkJbXlJbmZvID0gaW5mbzsKLQkJCW15TW9kaWZpZWRGaWx0ZXIgPSBOb3RpZmljYXRpb25GaWx0ZXIuY3JlYXRlRXZlbnRUeXBlRmlsdGVyKAotCQkJCQlOb3RpZmljYXRpb24uU0VUKS5vcigKLQkJCQkJTm90aWZpY2F0aW9uRmlsdGVyCi0JCQkJCQkJLmNyZWF0ZUV2ZW50VHlwZUZpbHRlcihOb3RpZmljYXRpb24uVU5TRVQpKS5hbmQoCi0JCQkJCU5vdGlmaWNhdGlvbkZpbHRlci5jcmVhdGVGZWF0dXJlRmlsdGVyKFJlc291cmNlLmNsYXNzLAotCQkJCQkJCVJlc291cmNlLlJFU09VUkNFX19JU19NT0RJRklFRCkpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQkJaWYgKG5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpIGluc3RhbmNlb2YgUmVzb3VyY2VTZXQpIHsKLQkJCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JCQl9Ci0JCQlpZiAoIW5vdGlmaWNhdGlvbi5pc1RvdWNoKCkKLQkJCQkJJiYgbXlNb2RpZmllZEZpbHRlci5tYXRjaGVzKG5vdGlmaWNhdGlvbikpIHsKLQkJCQlpZiAobm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCkgaW5zdGFuY2VvZiBSZXNvdXJjZSkgewotCQkJCQlSZXNvdXJjZSByZXNvdXJjZSA9IChSZXNvdXJjZSkgbm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCk7Ci0JCQkJCWlmIChyZXNvdXJjZS5pc0xvYWRlZCgpKSB7Ci0JCQkJCQlib29sZWFuIG1vZGlmaWVkID0gZmFsc2U7Ci0JCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ID0gbXlJbmZvLmdldFJlc291cmNlU2V0KCkKLQkJCQkJCQkJLmdldFJlc291cmNlcygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKQotCQkJCQkJCQkmJiAhbW9kaWZpZWQ7KSB7Ci0JCQkJCQkJUmVzb3VyY2UgbmV4dFJlc291cmNlID0gKFJlc291cmNlKSBpdC5uZXh0KCk7Ci0JCQkJCQkJaWYgKG5leHRSZXNvdXJjZS5pc0xvYWRlZCgpKSB7Ci0JCQkJCQkJCW1vZGlmaWVkID0gbmV4dFJlc291cmNlLmlzTW9kaWZpZWQoKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQlib29sZWFuIGRpcnR5U3RhdGVDaGFuZ2VkID0gZmFsc2U7Ci0JCQkJCQlzeW5jaHJvbml6ZWQgKG15SW5mbykgewotCQkJCQkJCWlmIChtb2RpZmllZCAhPSBteUluZm8uZkNhbkJlU2F2ZWQpIHsKLQkJCQkJCQkJbXlJbmZvLmZDYW5CZVNhdmVkID0gbW9kaWZpZWQ7Ci0JCQkJCQkJCWRpcnR5U3RhdGVDaGFuZ2VkID0gdHJ1ZTsKLQkJCQkJCQl9Ci0JCQkJCQkJaWYgKCFyZXNvdXJjZS5pc01vZGlmaWVkKCkpIHsKLQkJCQkJCQkJbXlJbmZvLnNldFN5bmNocm9uaXplZChyZXNvdXJjZSk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJaWYgKGRpcnR5U3RhdGVDaGFuZ2VkKSB7Ci0JCQkJCQkJZmlyZUVsZW1lbnREaXJ0eVN0YXRlQ2hhbmdlZChteUluZm8KLQkJCQkJCQkJCS5nZXRFZGl0b3JJbnB1dCgpLCBtb2RpZmllZCk7Ci0KLQkJCQkJCQlpZiAoIW1vZGlmaWVkKSB7Ci0JCQkJCQkJCW15SW5mbwotCQkJCQkJCQkJCS5zZXRNb2RpZmljYXRpb25TdGFtcChjb21wdXRlTW9kaWZpY2F0aW9uU3RhbXAobXlJbmZvKSk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9wYXJ0L1VNTEluaXREaWFncmFtRmlsZUFjdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL3BhcnQvVU1MSW5pdERpYWdyYW1GaWxlQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxOTYyZWMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL3BhcnQvVU1MSW5pdERpYWdyYW1GaWxlQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5wYXJ0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5XcmFwcGVkRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLmltcGwuUmVzb3VyY2VTZXRJbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5BY3Rpdml0eUVkaXRQYXJ0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvcmUuR01GRWRpdGluZ0RvbWFpbkZhY3Rvcnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ1NldHRpbmdzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZERpYWxvZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSU9iamVjdEFjdGlvbkRlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFVNTEluaXREaWFncmFtRmlsZUFjdGlvbiBpbXBsZW1lbnRzIElPYmplY3RBY3Rpb25EZWxlZ2F0ZSB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBJV29ya2JlbmNoUGFydCB0YXJnZXRQYXJ0OwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgVVJJIGRvbWFpbk1vZGVsVVJJOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFjdGl2ZVBhcnQoSUFjdGlvbiBhY3Rpb24sIElXb3JrYmVuY2hQYXJ0IHRhcmdldFBhcnQpIHsKLQkJdGhpcy50YXJnZXRQYXJ0ID0gdGFyZ2V0UGFydDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChJQWN0aW9uIGFjdGlvbiwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJZG9tYWluTW9kZWxVUkkgPSBudWxsOwotCQlhY3Rpb24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCWlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbiA9PSBmYWxzZQotCQkJCXx8IHNlbGVjdGlvbi5pc0VtcHR5KCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQlJRmlsZSBmaWxlID0gKElGaWxlKSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb24pCi0JCQkJLmdldEZpcnN0RWxlbWVudCgpOwotCQlkb21haW5Nb2RlbFVSSSA9IFVSSS5jcmVhdGVQbGF0Zm9ybVJlc291cmNlVVJJKGZpbGUuZ2V0RnVsbFBhdGgoKQotCQkJCS50b1N0cmluZygpLCB0cnVlKTsKLQkJYWN0aW9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgU2hlbGwgZ2V0U2hlbGwoKSB7Ci0JCXJldHVybiB0YXJnZXRQYXJ0LmdldFNpdGUoKS5nZXRTaGVsbCgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBydW4oSUFjdGlvbiBhY3Rpb24pIHsKLQkJVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gZWRpdGluZ0RvbWFpbiA9IEdNRkVkaXRpbmdEb21haW5GYWN0b3J5LklOU1RBTkNFCi0JCQkJLmNyZWF0ZUVkaXRpbmdEb21haW4oKTsKLQkJUmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQgPSBuZXcgUmVzb3VyY2VTZXRJbXBsKCk7Ci0JCUVPYmplY3QgZGlhZ3JhbVJvb3QgPSBudWxsOwotCQl0cnkgewotCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSByZXNvdXJjZVNldC5nZXRSZXNvdXJjZShkb21haW5Nb2RlbFVSSSwgdHJ1ZSk7Ci0JCQlkaWFncmFtUm9vdCA9IChFT2JqZWN0KSByZXNvdXJjZS5nZXRDb250ZW50cygpLmdldCgwKTsKLQkJfSBjYXRjaCAoV3JhcHBlZEV4Y2VwdGlvbiBleCkgewotCQkJQWN0aXZpdHlEaWFncmFtRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkubG9nRXJyb3IoCi0JCQkJCSJVbmFibGUgdG8gbG9hZCByZXNvdXJjZTogIiArIGRvbWFpbk1vZGVsVVJJLCBleCk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlpZiAoZGlhZ3JhbVJvb3QgPT0gbnVsbCkgewotCQkJTWVzc2FnZURpYWxvZwotCQkJCQkub3BlbkVycm9yKAotCQkJCQkJCWdldFNoZWxsKCksCi0JCQkJCQkJTWVzc2FnZXMuVU1MSW5pdERpYWdyYW1GaWxlQWN0aW9uX0luaXREaWFncmFtRmlsZVJlc291cmNlRXJyb3JEaWFsb2dUaXRsZSwKLQkJCQkJCQlNZXNzYWdlcy5VTUxJbml0RGlhZ3JhbUZpbGVBY3Rpb25fSW5pdERpYWdyYW1GaWxlUmVzb3VyY2VFcnJvckRpYWxvZ01lc3NhZ2UpOwotCQkJcmV0dXJuOwotCQl9Ci0JCVdpemFyZCB3aXphcmQgPSBuZXcgVU1MTmV3RGlhZ3JhbUZpbGVXaXphcmQoZG9tYWluTW9kZWxVUkksCi0JCQkJZGlhZ3JhbVJvb3QsIGVkaXRpbmdEb21haW4pOwotCQl3aXphcmQuc2V0V2luZG93VGl0bGUoTkxTLmJpbmQoCi0JCQkJTWVzc2FnZXMuVU1MSW5pdERpYWdyYW1GaWxlQWN0aW9uX0luaXREaWFncmFtRmlsZVdpemFyZFRpdGxlLAotCQkJCUFjdGl2aXR5RWRpdFBhcnQuTU9ERUxfSUQpKTsKLQkJVU1MRGlhZ3JhbUVkaXRvclV0aWwucnVuV2l6YXJkKGdldFNoZWxsKCksIHdpemFyZCwgIkluaXREaWFncmFtRmlsZSIpOyAvLyROT04tTkxTLTEkCi0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL3BhcnQvVU1MTG9hZFJlc291cmNlQWN0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvcGFydC9VTUxMb2FkUmVzb3VyY2VBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODYyMTk0ZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvcGFydC9VTUxMb2FkUmVzb3VyY2VBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQucGFydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5Mb2FkUmVzb3VyY2VBY3Rpb24uTG9hZFJlc291cmNlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklPYmplY3RBY3Rpb25EZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLkFjdGl2aXR5RWRpdFBhcnQ7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgVU1MTG9hZFJlc291cmNlQWN0aW9uIGltcGxlbWVudHMgSU9iamVjdEFjdGlvbkRlbGVnYXRlIHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEFjdGl2aXR5RWRpdFBhcnQgbXlTZWxlY3RlZEVsZW1lbnQ7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBTaGVsbCBteVNoZWxsOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFjdGl2ZVBhcnQoSUFjdGlvbiBhY3Rpb24sIElXb3JrYmVuY2hQYXJ0IHRhcmdldFBhcnQpIHsKLQkJbXlTaGVsbCA9IHRhcmdldFBhcnQuZ2V0U2l0ZSgpLmdldFNoZWxsKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bihJQWN0aW9uIGFjdGlvbikgewotCQlMb2FkUmVzb3VyY2VEaWFsb2cgbG9hZFJlc291cmNlRGlhbG9nID0gbmV3IExvYWRSZXNvdXJjZURpYWxvZyhteVNoZWxsLAotCQkJCW15U2VsZWN0ZWRFbGVtZW50LmdldEVkaXRpbmdEb21haW4oKSk7Ci0JCWxvYWRSZXNvdXJjZURpYWxvZy5vcGVuKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoSUFjdGlvbiBhY3Rpb24sIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCW15U2VsZWN0ZWRFbGVtZW50ID0gbnVsbDsKLQkJaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7Ci0JCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzdHJ1Y3R1cmVkU2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb247Ci0JCQlpZiAoc3RydWN0dXJlZFNlbGVjdGlvbi5zaXplKCkgPT0gMQotCQkJCQkmJiBzdHJ1Y3R1cmVkU2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpIGluc3RhbmNlb2YgQWN0aXZpdHlFZGl0UGFydCkgewotCQkJCW15U2VsZWN0ZWRFbGVtZW50ID0gKEFjdGl2aXR5RWRpdFBhcnQpIHN0cnVjdHVyZWRTZWxlY3Rpb24KLQkJCQkJCS5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCX0KLQkJfQotCQlhY3Rpb24uc2V0RW5hYmxlZChpc0VuYWJsZWQoKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc0VuYWJsZWQoKSB7Ci0JCXJldHVybiBteVNlbGVjdGVkRWxlbWVudCAhPSBudWxsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL3BhcnQvVU1MTWF0Y2hpbmdTdHJhdGVneS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL3BhcnQvVU1MTWF0Y2hpbmdTdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMGI4NmM2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9wYXJ0L1VNTE1hdGNoaW5nU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQucGFydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udWkuVVJJRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXNvdXJjZXMuZWRpdG9yLnBhcnRzLkRpYWdyYW1Eb2N1bWVudEVkaXRvck1hdGNoaW5nU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JNYXRjaGluZ1N0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGFydEluaXRFeGNlcHRpb247Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgVU1MTWF0Y2hpbmdTdHJhdGVneSBpbXBsZW1lbnRzIElFZGl0b3JNYXRjaGluZ1N0cmF0ZWd5IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBtYXRjaGVzKElFZGl0b3JSZWZlcmVuY2UgZWRpdG9yUmVmLCBJRWRpdG9ySW5wdXQgaW5wdXQpIHsKLQkJSUVkaXRvcklucHV0IGVkaXRvcklucHV0OwotCQl0cnkgewotCQkJZWRpdG9ySW5wdXQgPSBlZGl0b3JSZWYuZ2V0RWRpdG9ySW5wdXQoKTsKLQkJfSBjYXRjaCAoUGFydEluaXRFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJaWYgKGVkaXRvcklucHV0LmVxdWFscyhpbnB1dCkpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWlmIChlZGl0b3JJbnB1dCBpbnN0YW5jZW9mIFVSSUVkaXRvcklucHV0Ci0JCQkJJiYgaW5wdXQgaW5zdGFuY2VvZiBVUklFZGl0b3JJbnB1dCkgewotCQkJcmV0dXJuICgoVVJJRWRpdG9ySW5wdXQpIGVkaXRvcklucHV0KS5nZXRVUkkoKS5lcXVhbHMoCi0JCQkJCSgoVVJJRWRpdG9ySW5wdXQpIGlucHV0KS5nZXRVUkkoKSk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9wYXJ0L1VNTE5ld0RpYWdyYW1GaWxlV2l6YXJkLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvcGFydC9VTUxOZXdEaWFncmFtRmlsZVdpemFyZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZjI1MWI0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9wYXJ0L1VNTE5ld0RpYWdyYW1GaWxlV2l6YXJkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5wYXJ0OwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5vcGVyYXRpb25zLk9wZXJhdGlvbkhpc3RvcnlGYWN0b3J5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVdyYXBwZXJJdGVtUHJvdmlkZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLkFjdGl2aXR5RWRpdFBhcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS5jb21tYW5kLkNvbW1hbmRSZXN1bHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuc2VydmljZXMuVmlld1NlcnZpY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuc2VydmljZXMudmlldy5DcmVhdGVEaWFncmFtVmlld09wZXJhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb21tYW5kcy5jb3JlLmNvbW1hbmQuQWJzdHJhY3RUcmFuc2FjdGlvbmFsQ29tbWFuZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb3JlLnV0aWwuRU9iamVjdEFkYXB0ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5EaWFncmFtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVZpZXdlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBhcnRJbml0RXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5XaXphcmROZXdGaWxlQ3JlYXRpb25QYWdlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaWRlLklERTsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBVTUxOZXdEaWFncmFtRmlsZVdpemFyZCBleHRlbmRzIFdpemFyZCB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiBteUVkaXRpbmdEb21haW47Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFVNTE5ld0RpYWdyYW1GaWxlV2l6YXJkKFVSSSBkb21haW5Nb2RlbFVSSSwgRU9iamVjdCBkaWFncmFtUm9vdCwKLQkJCVRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIGVkaXRpbmdEb21haW4pIHsKLQkJYXNzZXJ0IGRvbWFpbk1vZGVsVVJJICE9IG51bGwgOiAiRG9tYWluIG1vZGVsIHVyaSBtdXN0IGJlIHNwZWNpZmllZCI7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0IGRpYWdyYW1Sb290ICE9IG51bGwgOiAiRG9hZ3JhbSByb290IGVsZW1lbnQgbXVzdCBiZSBzcGVjaWZpZWQiOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydCBlZGl0aW5nRG9tYWluICE9IG51bGwgOiAiRWRpdGluZyBkb21haW4gbXVzdCBiZSBzcGVjaWZpZWQiOyAvLyROT04tTkxTLTEkCi0KLQkJbXlGaWxlQ3JlYXRpb25QYWdlID0gbmV3IFdpemFyZE5ld0ZpbGVDcmVhdGlvblBhZ2UoCi0JCQkJTWVzc2FnZXMuVU1MTmV3RGlhZ3JhbUZpbGVXaXphcmRfQ3JlYXRpb25QYWdlTmFtZSwKLQkJCQlTdHJ1Y3R1cmVkU2VsZWN0aW9uLkVNUFRZKTsKLQkJbXlGaWxlQ3JlYXRpb25QYWdlCi0JCQkJLnNldFRpdGxlKE1lc3NhZ2VzLlVNTE5ld0RpYWdyYW1GaWxlV2l6YXJkX0NyZWF0aW9uUGFnZVRpdGxlKTsKLQkJbXlGaWxlQ3JlYXRpb25QYWdlLnNldERlc2NyaXB0aW9uKE5MUy5iaW5kKAotCQkJCU1lc3NhZ2VzLlVNTE5ld0RpYWdyYW1GaWxlV2l6YXJkX0NyZWF0aW9uUGFnZURlc2NyaXB0aW9uLAotCQkJCUFjdGl2aXR5RWRpdFBhcnQuTU9ERUxfSUQpKTsKLQkJSVBhdGggZmlsZVBhdGg7Ci0JCVN0cmluZyBmaWxlTmFtZSA9IGRvbWFpbk1vZGVsVVJJLnRyaW1GaWxlRXh0ZW5zaW9uKCkubGFzdFNlZ21lbnQoKTsKLQkJaWYgKGRvbWFpbk1vZGVsVVJJLmlzUGxhdGZvcm1SZXNvdXJjZSgpKSB7Ci0JCQlmaWxlUGF0aCA9IG5ldyBQYXRoKGRvbWFpbk1vZGVsVVJJLnRyaW1TZWdtZW50cygxKQotCQkJCQkudG9QbGF0Zm9ybVN0cmluZyh0cnVlKSk7Ci0JCX0gZWxzZSBpZiAoZG9tYWluTW9kZWxVUkkuaXNGaWxlKCkpIHsKLQkJCWZpbGVQYXRoID0gbmV3IFBhdGgoZG9tYWluTW9kZWxVUkkudHJpbVNlZ21lbnRzKDEpLnRvRmlsZVN0cmluZygpKTsKLQkJfSBlbHNlIHsKLQkJCS8vIFRPRE8gOiB1c2Ugc29tZSBkZWZhdWx0IHBhdGgKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCi0JCQkJCSJVbnN1cHBvcnRlZCBVUkk6ICIgKyBkb21haW5Nb2RlbFVSSSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlteUZpbGVDcmVhdGlvblBhZ2Uuc2V0Q29udGFpbmVyRnVsbFBhdGgoZmlsZVBhdGgpOwotCQlteUZpbGVDcmVhdGlvblBhZ2Uuc2V0RmlsZU5hbWUoVU1MRGlhZ3JhbUVkaXRvclV0aWwuZ2V0VW5pcXVlRmlsZU5hbWUoCi0JCQkJZmlsZVBhdGgsIGZpbGVOYW1lLCAieG1pIikpOyAvLyROT04tTkxTLTEkCi0KLQkJZGlhZ3JhbVJvb3RFbGVtZW50U2VsZWN0aW9uUGFnZSA9IG5ldyBEaWFncmFtUm9vdEVsZW1lbnRTZWxlY3Rpb25QYWdlKAotCQkJCU1lc3NhZ2VzLlVNTE5ld0RpYWdyYW1GaWxlV2l6YXJkX1Jvb3RTZWxlY3Rpb25QYWdlTmFtZSk7Ci0JCWRpYWdyYW1Sb290RWxlbWVudFNlbGVjdGlvblBhZ2UKLQkJCQkuc2V0VGl0bGUoTWVzc2FnZXMuVU1MTmV3RGlhZ3JhbUZpbGVXaXphcmRfUm9vdFNlbGVjdGlvblBhZ2VUaXRsZSk7Ci0JCWRpYWdyYW1Sb290RWxlbWVudFNlbGVjdGlvblBhZ2UKLQkJCQkuc2V0RGVzY3JpcHRpb24oTWVzc2FnZXMuVU1MTmV3RGlhZ3JhbUZpbGVXaXphcmRfUm9vdFNlbGVjdGlvblBhZ2VEZXNjcmlwdGlvbik7Ci0JCWRpYWdyYW1Sb290RWxlbWVudFNlbGVjdGlvblBhZ2Uuc2V0TW9kZWxFbGVtZW50KGRpYWdyYW1Sb290KTsKLQotCQlteUVkaXRpbmdEb21haW4gPSBlZGl0aW5nRG9tYWluOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIFdpemFyZE5ld0ZpbGVDcmVhdGlvblBhZ2UgbXlGaWxlQ3JlYXRpb25QYWdlOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgTW9kZWxFbGVtZW50U2VsZWN0aW9uUGFnZSBkaWFncmFtUm9vdEVsZW1lbnRTZWxlY3Rpb25QYWdlOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFBhZ2VzKCkgewotCQlhZGRQYWdlKG15RmlsZUNyZWF0aW9uUGFnZSk7Ci0JCWFkZFBhZ2UoZGlhZ3JhbVJvb3RFbGVtZW50U2VsZWN0aW9uUGFnZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHBlcmZvcm1GaW5pc2goKSB7Ci0JCUxpc3QgYWZmZWN0ZWRGaWxlcyA9IG5ldyBMaW5rZWRMaXN0KCk7Ci0JCUlGaWxlIGRpYWdyYW1GaWxlID0gbXlGaWxlQ3JlYXRpb25QYWdlLmNyZWF0ZU5ld0ZpbGUoKTsKLQkJVU1MRGlhZ3JhbUVkaXRvclV0aWwuc2V0Q2hhcnNldChkaWFncmFtRmlsZSk7Ci0JCWFmZmVjdGVkRmlsZXMuYWRkKGRpYWdyYW1GaWxlKTsKLQkJVVJJIGRpYWdyYW1Nb2RlbFVSSSA9IFVSSS5jcmVhdGVQbGF0Zm9ybVJlc291cmNlVVJJKGRpYWdyYW1GaWxlCi0JCQkJLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKSwgdHJ1ZSk7Ci0JCVJlc291cmNlU2V0IHJlc291cmNlU2V0ID0gbXlFZGl0aW5nRG9tYWluLmdldFJlc291cmNlU2V0KCk7Ci0JCWZpbmFsIFJlc291cmNlIGRpYWdyYW1SZXNvdXJjZSA9IHJlc291cmNlU2V0Ci0JCQkJLmNyZWF0ZVJlc291cmNlKGRpYWdyYW1Nb2RlbFVSSSk7Ci0JCUFic3RyYWN0VHJhbnNhY3Rpb25hbENvbW1hbmQgY29tbWFuZCA9IG5ldyBBYnN0cmFjdFRyYW5zYWN0aW9uYWxDb21tYW5kKAotCQkJCW15RWRpdGluZ0RvbWFpbiwKLQkJCQlNZXNzYWdlcy5VTUxOZXdEaWFncmFtRmlsZVdpemFyZF9Jbml0RGlhZ3JhbUNvbW1hbmQsCi0JCQkJYWZmZWN0ZWRGaWxlcykgewotCi0JCQlwcm90ZWN0ZWQgQ29tbWFuZFJlc3VsdCBkb0V4ZWN1dGVXaXRoUmVzdWx0KAotCQkJCQlJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykKLQkJCQkJdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCQkJaW50IGRpYWdyYW1WSUQgPSBVTUxWaXN1YWxJRFJlZ2lzdHJ5Ci0JCQkJCQkuZ2V0RGlhZ3JhbVZpc3VhbElEKGRpYWdyYW1Sb290RWxlbWVudFNlbGVjdGlvblBhZ2UKLQkJCQkJCQkJLmdldE1vZGVsRWxlbWVudCgpKTsKLQkJCQlpZiAoZGlhZ3JhbVZJRCAhPSBBY3Rpdml0eUVkaXRQYXJ0LlZJU1VBTF9JRCkgewotCQkJCQlyZXR1cm4gQ29tbWFuZFJlc3VsdAotCQkJCQkJCS5uZXdFcnJvckNvbW1hbmRSZXN1bHQoTWVzc2FnZXMuVU1MTmV3RGlhZ3JhbUZpbGVXaXphcmRfSW5jb3JyZWN0Um9vdEVycm9yKTsKLQkJCQl9Ci0JCQkJRGlhZ3JhbSBkaWFncmFtID0gVmlld1NlcnZpY2UuY3JlYXRlRGlhZ3JhbSgKLQkJCQkJCWRpYWdyYW1Sb290RWxlbWVudFNlbGVjdGlvblBhZ2UuZ2V0TW9kZWxFbGVtZW50KCksCi0JCQkJCQlBY3Rpdml0eUVkaXRQYXJ0Lk1PREVMX0lELAotCQkJCQkJQWN0aXZpdHlEaWFncmFtRWRpdG9yUGx1Z2luLkRJQUdSQU1fUFJFRkVSRU5DRVNfSElOVCk7Ci0JCQkJZGlhZ3JhbVJlc291cmNlLmdldENvbnRlbnRzKCkuYWRkKGRpYWdyYW0pOwotCQkJCWRpYWdyYW1SZXNvdXJjZS5nZXRDb250ZW50cygpLmFkZChkaWFncmFtLmdldEVsZW1lbnQoKSk7Ci0JCQkJcmV0dXJuIENvbW1hbmRSZXN1bHQubmV3T0tDb21tYW5kUmVzdWx0KCk7Ci0JCQl9Ci0JCX07Ci0JCXRyeSB7Ci0JCQlPcGVyYXRpb25IaXN0b3J5RmFjdG9yeS5nZXRPcGVyYXRpb25IaXN0b3J5KCkuZXhlY3V0ZShjb21tYW5kLAotCQkJCQluZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpLCBudWxsKTsKLQkJCWRpYWdyYW1SZXNvdXJjZS5zYXZlKFVNTERpYWdyYW1FZGl0b3JVdGlsLmdldFNhdmVPcHRpb25zKCkpOwotCQkJVU1MRGlhZ3JhbUVkaXRvclV0aWwub3BlbkRpYWdyYW0oZGlhZ3JhbVJlc291cmNlKTsKLQkJfSBjYXRjaCAoRXhlY3V0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCUFjdGl2aXR5RGlhZ3JhbUVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmxvZ0Vycm9yKAotCQkJCQkiVW5hYmxlIHRvIGNyZWF0ZSBtb2RlbCBhbmQgZGlhZ3JhbSIsIGUpOyAvLyROT04tTkxTLTEkCi0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7Ci0JCQlBY3Rpdml0eURpYWdyYW1FZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5sb2dFcnJvcigKLQkJCQkJIlNhdmUgb3BlcmF0aW9uIGZhaWxlZCBmb3I6ICIgKyBkaWFncmFtTW9kZWxVUkksIGV4KTsgLy8kTk9OLU5MUy0xJAotCQl9IGNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBleCkgewotCQkJQWN0aXZpdHlEaWFncmFtRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkubG9nRXJyb3IoCi0JCQkJCSJVbmFibGUgdG8gb3BlbiBlZGl0b3IiLCBleCk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgRGlhZ3JhbVJvb3RFbGVtZW50U2VsZWN0aW9uUGFnZSBleHRlbmRzCi0JCQlNb2RlbEVsZW1lbnRTZWxlY3Rpb25QYWdlIHsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJvdGVjdGVkIERpYWdyYW1Sb290RWxlbWVudFNlbGVjdGlvblBhZ2UoU3RyaW5nIHBhZ2VOYW1lKSB7Ci0JCQlzdXBlcihwYWdlTmFtZSk7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJvdGVjdGVkIFN0cmluZyBnZXRTZWxlY3Rpb25UaXRsZSgpIHsKLQkJCXJldHVybiBNZXNzYWdlcy5VTUxOZXdEaWFncmFtRmlsZVdpemFyZF9Sb290U2VsZWN0aW9uUGFnZVNlbGVjdGlvblRpdGxlOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByb3RlY3RlZCBib29sZWFuIHZhbGlkYXRlUGFnZSgpIHsKLQkJCWlmIChzZWxlY3RlZE1vZGVsRWxlbWVudCA9PSBudWxsKSB7Ci0JCQkJc2V0RXJyb3JNZXNzYWdlKE1lc3NhZ2VzLlVNTE5ld0RpYWdyYW1GaWxlV2l6YXJkX1Jvb3RTZWxlY3Rpb25QYWdlTm9TZWxlY3Rpb25NZXNzYWdlKTsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQlib29sZWFuIHJlc3VsdCA9IFZpZXdTZXJ2aWNlCi0JCQkJCS5nZXRJbnN0YW5jZSgpCi0JCQkJCS5wcm92aWRlcygKLQkJCQkJCQluZXcgQ3JlYXRlRGlhZ3JhbVZpZXdPcGVyYXRpb24oCi0JCQkJCQkJCQluZXcgRU9iamVjdEFkYXB0ZXIoc2VsZWN0ZWRNb2RlbEVsZW1lbnQpLAotCQkJCQkJCQkJQWN0aXZpdHlFZGl0UGFydC5NT0RFTF9JRCwKLQkJCQkJCQkJCUFjdGl2aXR5RGlhZ3JhbUVkaXRvclBsdWdpbi5ESUFHUkFNX1BSRUZFUkVOQ0VTX0hJTlQpKTsKLQkJCXNldEVycm9yTWVzc2FnZShyZXN1bHQgPyBudWxsCi0JCQkJCTogTWVzc2FnZXMuVU1MTmV3RGlhZ3JhbUZpbGVXaXphcmRfUm9vdFNlbGVjdGlvblBhZ2VJbnZhbGlkU2VsZWN0aW9uTWVzc2FnZSk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9wYXJ0L1VNTFBhbGV0dGVGYWN0b3J5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvcGFydC9VTUxQYWxldHRlRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZmNlZmQzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9wYXJ0L1VNTFBhbGV0dGVGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNTggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5wYXJ0OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnByb3ZpZGVycy5VTUxFbGVtZW50VHlwZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5EaWFncmFtQ29yZVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLmJyaWRnZS5CcmlkZ2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLlRvb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnBhbGV0dGUuUGFsZXR0ZUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucGFsZXR0ZS5QYWxldHRlRHJhd2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5wYWxldHRlLlBhbGV0dGVSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5wYWxldHRlLlBhbGV0dGVTZXBhcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnBhbGV0dGUuVG9vbEVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5yZXF1ZXN0cy5DcmVhdGVSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkudG9vbHMuVW5zcGVjaWZpZWRUeXBlQ29ubmVjdGlvblRvb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS50b29scy5VbnNwZWNpZmllZFR5cGVDcmVhdGlvblRvb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5JRWxlbWVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLlVNTFBhY2thZ2U7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgVU1MUGFsZXR0ZUZhY3RvcnkgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGZpbGxQYWxldHRlKFBhbGV0dGVSb290IHBhbGV0dGVSb290KSB7Ci0JCXBhbGV0dGVSb290LmFkZChjcmVhdGVGbG93czFHcm91cCgpKTsKLQkJcGFsZXR0ZVJvb3QuYWRkKGNyZWF0ZU5vZGVzMkdyb3VwKCkpOwotCX0KLQotCS8qKgotCSAqIEBtb2RpZmllZAotCSAqLwotCXByaXZhdGUgUGFsZXR0ZUNvbnRhaW5lciBjcmVhdGVGbG93czFHcm91cCgpIHsKLQkJUGFsZXR0ZUNvbnRhaW5lciBwYWxldHRlQ29udGFpbmVyID0gbmV3IFBhbGV0dGVEcmF3ZXIoCi0JCQkJRGlhZ3JhbUNvcmVSZXNvdXJjZXMuQWN0aXZpdHlEaWFncmFtX1BhbGV0dGVfZmxvd3NfdGl0bGUpOwotCQlwYWxldHRlQ29udGFpbmVyCi0JCQkJLnNldERlc2NyaXB0aW9uKERpYWdyYW1Db3JlUmVzb3VyY2VzLkFjdGl2aXR5RGlhZ3JhbV9QYWxldHRlX2Zsb3dzX2NyZWF0ZV90ZXh0KTsKLQkJcGFsZXR0ZUNvbnRhaW5lci5hZGQoY3JlYXRlQ29udHJvbEZsb3cxQ3JlYXRpb25Ub29sKCkpOwotCQlyZXR1cm4gcGFsZXR0ZUNvbnRhaW5lcjsKLQl9Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcml2YXRlIFBhbGV0dGVDb250YWluZXIgY3JlYXRlTm9kZXMyR3JvdXAoKSB7Ci0JCVBhbGV0dGVDb250YWluZXIgcGFsZXR0ZUNvbnRhaW5lciA9IG5ldyBQYWxldHRlRHJhd2VyKAotCQkJCURpYWdyYW1Db3JlUmVzb3VyY2VzLkFjdGl2aXR5RGlhZ3JhbV9QYWxldHRlX25vZGVzX3RpdGxlcyk7Ci0JCXBhbGV0dGVDb250YWluZXIKLQkJCQkuc2V0RGVzY3JpcHRpb24oRGlhZ3JhbUNvcmVSZXNvdXJjZXMuQWN0aXZpdHlEaWFncmFtX1BhbGV0dGVfbm9kZXNfZ3JvdXBfdGV4dCk7Ci0JCXBhbGV0dGVDb250YWluZXIuYWRkKGNyZWF0ZUFjdGl2aXR5UGFydGl0aW9uMUNyZWF0aW9uVG9vbCgpKTsKLQkJcGFsZXR0ZUNvbnRhaW5lci5hZGQoY3JlYXRlU3RhcnROb2RlMkNyZWF0aW9uVG9vbCgpKTsKLQkJcGFsZXR0ZUNvbnRhaW5lci5hZGQoY3JlYXRlRW5kTm9kZTZDcmVhdGlvblRvb2woKSk7Ci0JCXBhbGV0dGVDb250YWluZXIuYWRkKGNyZWF0ZUZvcmtOb2RlM0NyZWF0aW9uVG9vbCgpKTsKLQkJcGFsZXR0ZUNvbnRhaW5lci5hZGQoY3JlYXRlSm9pbk5vZGU3Q3JlYXRpb25Ub29sKCkpOwotCQlwYWxldHRlQ29udGFpbmVyLmFkZChjcmVhdGVEZWNpc2lvbk5vZGU1Q3JlYXRpb25Ub29sKCkpOwotCQlwYWxldHRlQ29udGFpbmVyLmFkZChjcmVhdGVNZXJnZU5vZGU0Q3JlYXRpb25Ub29sKCkpOwotCQlwYWxldHRlQ29udGFpbmVyLmFkZChuZXcgUGFsZXR0ZVNlcGFyYXRvcigpKTsKLQkJcGFsZXR0ZUNvbnRhaW5lci5hZGQoY3JlYXRlQWN0aXZpdHk5Q3JlYXRpb25Ub29sKCkpOwotCQlwYWxldHRlQ29udGFpbmVyLmFkZChjcmVhdGVJdGVyYXRpb24xMUNyZWF0aW9uVG9vbCgpKTsKLQkJcGFsZXR0ZUNvbnRhaW5lci5hZGQoY3JlYXRlUGhhc2UxMENyZWF0aW9uVG9vbCgpKTsKLQkJcGFsZXR0ZUNvbnRhaW5lci5hZGQoY3JlYXRlTWlsZXN0b25lMTNDcmVhdGlvblRvb2woKSk7Ci0JCXBhbGV0dGVDb250YWluZXIuYWRkKGNyZWF0ZVRhc2tEZXNjcmlwdG9yMTJDcmVhdGlvblRvb2woKSk7Ci0JCXJldHVybiBwYWxldHRlQ29udGFpbmVyOwotCX0KLQotCS8qKgotCSAqIEBtb2RpZmllZAotCSAqLwotCXByaXZhdGUgVG9vbEVudHJ5IGNyZWF0ZUNvbnRyb2xGbG93MUNyZWF0aW9uVG9vbCgpIHsKLQkJTGlzdC8qIDxJRWxlbWVudFR5cGU+ICovdHlwZXMgPSBuZXcgQXJyYXlMaXN0LyogPElFbGVtZW50VHlwZT4gKi8oMSk7Ci0JCXR5cGVzLmFkZChVTUxFbGVtZW50VHlwZXMuQ29udHJvbEZsb3dfMzAwMSk7Ci0JCUxpbmtUb29sRW50cnkgZW50cnkgPSBuZXcgTGlua1Rvb2xFbnRyeSgKLQkJCQlEaWFncmFtQ29yZVJlc291cmNlcy5BY3Rpdml0eURpYWdyYW1fUGFsZXR0ZV9jb250cm9sX2Zsb3dfdGV4dCwKLQkJCQlEaWFncmFtQ29yZVJlc291cmNlcy5BY3Rpdml0eURpYWdyYW1fUGFsZXR0ZV9jb250cm9sX2Zsb3dfY3JlYXRlX3RleHQsIHR5cGVzKTsKLQkJZW50cnkuc2V0U21hbGxJY29uKFVNTEVsZW1lbnRUeXBlcy5nZXRJbWFnZURlc2NyaXB0b3IoCi0JCQkJVU1MUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29udHJvbEZsb3coKSwKLQkJCQlVTUxFbGVtZW50VHlwZXMuQ29udHJvbEZsb3dfMzAwMSkpOyAvLyROT04tTkxTLTEkCi0JCWVudHJ5LnNldExhcmdlSWNvbihlbnRyeS5nZXRTbWFsbEljb24oKSk7Ci0JCXJldHVybiBlbnRyeTsKLQl9Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcml2YXRlIFRvb2xFbnRyeSBjcmVhdGVBY3Rpdml0eVBhcnRpdGlvbjFDcmVhdGlvblRvb2woKSB7Ci0JCUxpc3QvKiA8SUVsZW1lbnRUeXBlPiAqL3R5cGVzID0gbmV3IEFycmF5TGlzdC8qIDxJRWxlbWVudFR5cGU+ICovKDIpOwotCQl0eXBlcy5hZGQoVU1MRWxlbWVudFR5cGVzLkFjdGl2aXR5UGFydGl0aW9uXzEwMDgpOwotCQl0eXBlcy5hZGQoVU1MRWxlbWVudFR5cGVzLkFjdGl2aXR5UGFydGl0aW9uXzIwMDEpOwotCQlOb2RlVG9vbEVudHJ5IGVudHJ5ID0gbmV3IE5vZGVUb29sRW50cnkoCi0JCQkJRGlhZ3JhbUNvcmVSZXNvdXJjZXMuQWN0aXZpdHlEaWFncmFtX1BhcnRpdGlvbl9Ob2RlX3RleHQsCi0JCQkJRGlhZ3JhbUNvcmVSZXNvdXJjZXMuQWN0aXZpdHlEaWFncmFtX1BhcnRpdGlvbl9Ob2RlX3Rvb2x0aXAsIHR5cGVzKTsKLQkJZW50cnkuc2V0U21hbGxJY29uKFVNTEVsZW1lbnRUeXBlcy5nZXRJbWFnZURlc2NyaXB0b3IoCi0JCQkJVU1MUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QWN0aXZpdHlQYXJ0aXRpb24oKSwKLQkJCQlVTUxFbGVtZW50VHlwZXMuQWN0aXZpdHlQYXJ0aXRpb25fMTAwOCkpOyAvLyROT04tTkxTLTEkCi0JCWVudHJ5LnNldExhcmdlSWNvbihlbnRyeS5nZXRTbWFsbEljb24oKSk7Ci0JCXJldHVybiBlbnRyeTsKLQl9Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcml2YXRlIFRvb2xFbnRyeSBjcmVhdGVTdGFydE5vZGUyQ3JlYXRpb25Ub29sKCkgewotCQlMaXN0LyogPElFbGVtZW50VHlwZT4gKi90eXBlcyA9IG5ldyBBcnJheUxpc3QvKiA8SUVsZW1lbnRUeXBlPiAqLygxKTsKLQkJdHlwZXMuYWRkKFVNTEVsZW1lbnRUeXBlcy5Jbml0aWFsTm9kZV8xMDA0KTsKLQkJTm9kZVRvb2xFbnRyeSBlbnRyeSA9IG5ldyBOb2RlVG9vbEVudHJ5KAotCQkJCURpYWdyYW1Db3JlUmVzb3VyY2VzLkFjdGl2aXR5RGlhZ3JhbV9TdGFydE5vZGVfdGV4dCwKLQkJCQlEaWFncmFtQ29yZVJlc291cmNlcy5BY3Rpdml0eURpYWdyYW1fU3RhcnROb2RlX3Rvb2x0aXAsIHR5cGVzKTsKLQkJZW50cnkuc2V0U21hbGxJY29uKFVNTEVsZW1lbnRUeXBlcy5nZXRJbWFnZURlc2NyaXB0b3IoCi0JCQkJVU1MUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SW5pdGlhbE5vZGUoKSwKLQkJCQlVTUxFbGVtZW50VHlwZXMuSW5pdGlhbE5vZGVfMTAwNCkpOyAvLyROT04tTkxTLTEkCi0JCWVudHJ5LnNldExhcmdlSWNvbihlbnRyeS5nZXRTbWFsbEljb24oKSk7Ci0JCXJldHVybiBlbnRyeTsKLQl9Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcml2YXRlIFRvb2xFbnRyeSBjcmVhdGVGb3JrTm9kZTNDcmVhdGlvblRvb2woKSB7Ci0JCUxpc3QvKiA8SUVsZW1lbnRUeXBlPiAqL3R5cGVzID0gbmV3IEFycmF5TGlzdC8qIDxJRWxlbWVudFR5cGU+ICovKDEpOwotCQl0eXBlcy5hZGQoVU1MRWxlbWVudFR5cGVzLkZvcmtOb2RlXzEwMDMpOwotCQlOb2RlVG9vbEVudHJ5IGVudHJ5ID0gbmV3IE5vZGVUb29sRW50cnkoCi0JCQkJRGlhZ3JhbUNvcmVSZXNvdXJjZXMuQWN0aXZpdHlEaWFncmFtX0ZvcmtfTm9kZV90ZXh0LAotCQkJCURpYWdyYW1Db3JlUmVzb3VyY2VzLkFjdGl2aXR5RGlhZ3JhbV9Gb3JrX05vZGVfdG9vbHRpcCwgdHlwZXMpOwotCQllbnRyeS5zZXRTbWFsbEljb24oVU1MRWxlbWVudFR5cGVzLmdldEltYWdlRGVzY3JpcHRvcigKLQkJCQlVTUxQYWNrYWdlLmVJTlNUQU5DRS5nZXRGb3JrTm9kZSgpLAotCQkJCVVNTEVsZW1lbnRUeXBlcy5Gb3JrTm9kZV8xMDAzKSk7IC8vJE5PTi1OTFMtMSQKLQkJZW50cnkuc2V0TGFyZ2VJY29uKGVudHJ5LmdldFNtYWxsSWNvbigpKTsKLQkJcmV0dXJuIGVudHJ5OwotCX0KLQotCS8qKgotCSAqIEBtb2RpZmllZAotCSAqLwotCXByaXZhdGUgVG9vbEVudHJ5IGNyZWF0ZU1lcmdlTm9kZTRDcmVhdGlvblRvb2woKSB7Ci0JCUxpc3QvKiA8SUVsZW1lbnRUeXBlPiAqL3R5cGVzID0gbmV3IEFycmF5TGlzdC8qIDxJRWxlbWVudFR5cGU+ICovKDEpOwotCQl0eXBlcy5hZGQoVU1MRWxlbWVudFR5cGVzLk1lcmdlTm9kZV8xMDAyKTsKLQkJTm9kZVRvb2xFbnRyeSBlbnRyeSA9IG5ldyBOb2RlVG9vbEVudHJ5KAotCQkJCURpYWdyYW1Db3JlUmVzb3VyY2VzLkFjdGl2aXR5RGlhZ3JhbV9NZXJnZV9Ob2RlX3RleHQsCi0JCQkJRGlhZ3JhbUNvcmVSZXNvdXJjZXMuQWN0aXZpdHlEaWFncmFtX01lcmdlX05vZGVfdG9vbHRpcCwgdHlwZXMpOwotCQllbnRyeS5zZXRTbWFsbEljb24oVU1MRWxlbWVudFR5cGVzLmdldEltYWdlRGVzY3JpcHRvcigKLQkJCQlVTUxQYWNrYWdlLmVJTlNUQU5DRS5nZXRNZXJnZU5vZGUoKSwKLQkJCQlVTUxFbGVtZW50VHlwZXMuTWVyZ2VOb2RlXzEwMDIpKTsgLy8kTk9OLU5MUy0xJAotCQllbnRyeS5zZXRMYXJnZUljb24oZW50cnkuZ2V0U21hbGxJY29uKCkpOwotCQlyZXR1cm4gZW50cnk7Ci0JfQotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJpdmF0ZSBUb29sRW50cnkgY3JlYXRlRGVjaXNpb25Ob2RlNUNyZWF0aW9uVG9vbCgpIHsKLQkJTGlzdC8qIDxJRWxlbWVudFR5cGU+ICovdHlwZXMgPSBuZXcgQXJyYXlMaXN0LyogPElFbGVtZW50VHlwZT4gKi8oMSk7Ci0JCXR5cGVzLmFkZChVTUxFbGVtZW50VHlwZXMuRGVjaXNpb25Ob2RlXzEwMDUpOwotCQlOb2RlVG9vbEVudHJ5IGVudHJ5ID0gbmV3IE5vZGVUb29sRW50cnkoCi0JCQkJRGlhZ3JhbUNvcmVSZXNvdXJjZXMuQWN0aXZpdHlEaWFncmFtX0RlY2lzaW9uTm9kZV90ZXh0LAotCQkJCURpYWdyYW1Db3JlUmVzb3VyY2VzLkFjdGl2aXR5RGlhZ3JhbV9EZWNpc2lvbk5vZGVfdG9vbHRpcCwgdHlwZXMpOwotCQllbnRyeS5zZXRTbWFsbEljb24oVU1MRWxlbWVudFR5cGVzLmdldEltYWdlRGVzY3JpcHRvcigKLQkJCQlVTUxQYWNrYWdlLmVJTlNUQU5DRS5nZXREZWNpc2lvbk5vZGUoKSwKLQkJCQlVTUxFbGVtZW50VHlwZXMuRGVjaXNpb25Ob2RlXzEwMDUpKTsgLy8kTk9OLU5MUy0xJAotCQllbnRyeS5zZXRMYXJnZUljb24oZW50cnkuZ2V0U21hbGxJY29uKCkpOwotCQlyZXR1cm4gZW50cnk7Ci0JfQotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJpdmF0ZSBUb29sRW50cnkgY3JlYXRlRW5kTm9kZTZDcmVhdGlvblRvb2woKSB7Ci0JCUxpc3QvKiA8SUVsZW1lbnRUeXBlPiAqL3R5cGVzID0gbmV3IEFycmF5TGlzdC8qIDxJRWxlbWVudFR5cGU+ICovKDEpOwotCQl0eXBlcy5hZGQoVU1MRWxlbWVudFR5cGVzLkFjdGl2aXR5RmluYWxOb2RlXzEwMDEpOwotCQlOb2RlVG9vbEVudHJ5IGVudHJ5ID0gbmV3IE5vZGVUb29sRW50cnkoCi0JCQkJRGlhZ3JhbUNvcmVSZXNvdXJjZXMuQWN0aXZpdHlEaWFncmFtX0VuZE5vZGVfdGV4dCwgCi0JCQkJRGlhZ3JhbUNvcmVSZXNvdXJjZXMuQWN0aXZpdHlEaWFncmFtX0VuZE5vZGVfdG9vbHRpcCwgdHlwZXMpOwotCQllbnRyeS5zZXRTbWFsbEljb24oVU1MRWxlbWVudFR5cGVzLmdldEltYWdlRGVzY3JpcHRvcigKLQkJCQlVTUxQYWNrYWdlLmVJTlNUQU5DRS5nZXRBY3Rpdml0eUZpbmFsTm9kZSgpLAotCQkJCVVNTEVsZW1lbnRUeXBlcy5BY3Rpdml0eUZpbmFsTm9kZV8xMDAxKSk7IC8vJE5PTi1OTFMtMSQKLQkJZW50cnkuc2V0TGFyZ2VJY29uKGVudHJ5LmdldFNtYWxsSWNvbigpKTsKLQkJcmV0dXJuIGVudHJ5OwotCX0KLQotCS8qKgotCSAqIEBtb2RpZmllZAotCSAqLwotCXByaXZhdGUgVG9vbEVudHJ5IGNyZWF0ZUpvaW5Ob2RlN0NyZWF0aW9uVG9vbCgpIHsKLQkJTGlzdC8qIDxJRWxlbWVudFR5cGU+ICovdHlwZXMgPSBuZXcgQXJyYXlMaXN0LyogPElFbGVtZW50VHlwZT4gKi8oMSk7Ci0JCXR5cGVzLmFkZChVTUxFbGVtZW50VHlwZXMuSm9pbk5vZGVfMTAwNik7Ci0JCU5vZGVUb29sRW50cnkgZW50cnkgPSBuZXcgTm9kZVRvb2xFbnRyeSgKLQkJCQlEaWFncmFtQ29yZVJlc291cmNlcy5BY3Rpdml0eURpYWdyYW1fSm9pbl9Ob2RlX3RleHQsCi0JCQkJRGlhZ3JhbUNvcmVSZXNvdXJjZXMuQWN0aXZpdHlEaWFncmFtX0pvaW5fTm9kZV90b29sdGlwLCB0eXBlcyk7Ci0JCWVudHJ5LnNldFNtYWxsSWNvbihVTUxFbGVtZW50VHlwZXMuZ2V0SW1hZ2VEZXNjcmlwdG9yKAotCQkJCVVNTFBhY2thZ2UuZUlOU1RBTkNFLmdldEpvaW5Ob2RlKCksCi0JCQkJVU1MRWxlbWVudFR5cGVzLkpvaW5Ob2RlXzEwMDYpKTsgLy8kTk9OLU5MUy0xJAotCQllbnRyeS5zZXRMYXJnZUljb24oZW50cnkuZ2V0U21hbGxJY29uKCkpOwotCQlyZXR1cm4gZW50cnk7Ci0JfQotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJpdmF0ZSBUb29sRW50cnkgY3JlYXRlQWN0aXZpdHk5Q3JlYXRpb25Ub29sKCkgewotCQlMaXN0LyogPElFbGVtZW50VHlwZT4gKi90eXBlcyA9IG5ldyBBcnJheUxpc3QvKiA8SUVsZW1lbnRUeXBlPiAqLygxKTsKLQkJdHlwZXMuYWRkKFVNTEVsZW1lbnRUeXBlcy5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlXzEwMDcpOwotCQlOb2RlVG9vbEVudHJ5IGVudHJ5ID0gbmV3IE5vZGVUb29sRW50cnkoCi0JCQkJRGlhZ3JhbUNvcmVSZXNvdXJjZXMuQWN0aXZpdHlEaWFncmFtX0FjdGl2aXR5X3RleHQsIAotCQkJCURpYWdyYW1Db3JlUmVzb3VyY2VzLkFjdGl2aXR5RGlhZ3JhbV9BY3Rpdml0eV90b29sdGlwLCB0eXBlcyk7Ci0JCWVudHJ5LnNldFNtYWxsSWNvbihVTUxFbGVtZW50VHlwZXMuZ2V0SW1hZ2VEZXNjcmlwdG9yKG51bGwsCi0JCQkJVU1MRWxlbWVudFR5cGVzLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVfMTAwNykpOyAvLyROT04tTkxTLTEkCi0JCWVudHJ5LnNldExhcmdlSWNvbihlbnRyeS5nZXRTbWFsbEljb24oKSk7Ci0JCXJldHVybiBlbnRyeTsKLQl9Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcml2YXRlIFRvb2xFbnRyeSBjcmVhdGVQaGFzZTEwQ3JlYXRpb25Ub29sKCkgewotCQlMaXN0LyogPElFbGVtZW50VHlwZT4gKi90eXBlcyA9IG5ldyBBcnJheUxpc3QvKiA8SUVsZW1lbnRUeXBlPiAqLygxKTsKLQkJdHlwZXMuYWRkKFVNTEVsZW1lbnRUeXBlcy5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlXzEwMTApOwotCQlOb2RlVG9vbEVudHJ5IGVudHJ5ID0gbmV3IE5vZGVUb29sRW50cnkoCi0JCQkJRGlhZ3JhbUNvcmVSZXNvdXJjZXMuQWN0aXZpdHlEaWFncmFtX1BoYXNlX3RleHQsIAotCQkJCURpYWdyYW1Db3JlUmVzb3VyY2VzLkFjdGl2aXR5RGlhZ3JhbV9QaGFzZV90b29sdGlwLCB0eXBlcyk7Ci0JCWVudHJ5LnNldFNtYWxsSWNvbihVTUxFbGVtZW50VHlwZXMuZ2V0SW1hZ2VEZXNjcmlwdG9yKG51bGwsCi0JCQkJVU1MRWxlbWVudFR5cGVzLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVfMTAxMCkpOyAvLyROT04tTkxTLTEkCi0JCWVudHJ5LnNldExhcmdlSWNvbihlbnRyeS5nZXRTbWFsbEljb24oKSk7Ci0JCXJldHVybiBlbnRyeTsKLQl9Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcml2YXRlIFRvb2xFbnRyeSBjcmVhdGVJdGVyYXRpb24xMUNyZWF0aW9uVG9vbCgpIHsKLQkJTGlzdC8qIDxJRWxlbWVudFR5cGU+ICovdHlwZXMgPSBuZXcgQXJyYXlMaXN0LyogPElFbGVtZW50VHlwZT4gKi8oMSk7Ci0JCXR5cGVzLmFkZChVTUxFbGVtZW50VHlwZXMuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZV8xMDExKTsKLQkJTm9kZVRvb2xFbnRyeSBlbnRyeSA9IG5ldyBOb2RlVG9vbEVudHJ5KAotCQkJCURpYWdyYW1Db3JlUmVzb3VyY2VzLkFjdGl2aXR5RGlhZ3JhbV9JdGVyYXRpb25fdGV4dCwKLQkJCQlEaWFncmFtQ29yZVJlc291cmNlcy5BY3Rpdml0eURpYWdyYW1fSXRlcmF0aW9uX3Rvb2x0aXAsIHR5cGVzKTsKLQkJZW50cnkuc2V0U21hbGxJY29uKFVNTEVsZW1lbnRUeXBlcy5nZXRJbWFnZURlc2NyaXB0b3IobnVsbCwKLQkJCQlVTUxFbGVtZW50VHlwZXMuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZV8xMDExKSk7IC8vJE5PTi1OTFMtMSQKLQkJZW50cnkuc2V0TGFyZ2VJY29uKGVudHJ5LmdldFNtYWxsSWNvbigpKTsKLQkJcmV0dXJuIGVudHJ5OwotCX0KLQotCS8qKgotCSAqIEBtb2RpZmllZAotCSAqLwotCXByaXZhdGUgVG9vbEVudHJ5IGNyZWF0ZVRhc2tEZXNjcmlwdG9yMTJDcmVhdGlvblRvb2woKSB7Ci0JCUxpc3QvKiA8SUVsZW1lbnRUeXBlPiAqL3R5cGVzID0gbmV3IEFycmF5TGlzdC8qIDxJRWxlbWVudFR5cGU+ICovKDEpOwotCQl0eXBlcy5hZGQoVU1MRWxlbWVudFR5cGVzLkFjdGl2aXR5UGFyYW1ldGVyTm9kZV8xMDA5KTsKLQkJTm9kZVRvb2xFbnRyeSBlbnRyeSA9IG5ldyBOb2RlVG9vbEVudHJ5KAotCQkJCURpYWdyYW1Db3JlUmVzb3VyY2VzLkFic3RyYWN0RGlhZ3JhbV9UYXNrRGVzY3JpcHRvcl90ZXh0LAotCQkJCURpYWdyYW1Db3JlUmVzb3VyY2VzLkFic3RyYWN0RGlhZ3JhbV9UYXNrRGVzY3JpcHRvcl90b29sdGlwLCB0eXBlcyk7Ci0JCWVudHJ5LnNldFNtYWxsSWNvbihVTUxFbGVtZW50VHlwZXMuZ2V0SW1hZ2VEZXNjcmlwdG9yKG51bGwsCi0JCQkJVU1MRWxlbWVudFR5cGVzLkFjdGl2aXR5UGFyYW1ldGVyTm9kZV8xMDA5KSk7IC8vJE5PTi1OTFMtMSQKLQkJZW50cnkuc2V0TGFyZ2VJY29uKGVudHJ5LmdldFNtYWxsSWNvbigpKTsKLQkJcmV0dXJuIGVudHJ5OwotCX0KLQotCS8qKgotCSAqIEBtb2RpZmllZAotCSAqLwotCXByaXZhdGUgVG9vbEVudHJ5IGNyZWF0ZU1pbGVzdG9uZTEzQ3JlYXRpb25Ub29sKCkgewotCQlMaXN0LyogPElFbGVtZW50VHlwZT4gKi90eXBlcyA9IG5ldyBBcnJheUxpc3QvKiA8SUVsZW1lbnRUeXBlPiAqLygxKTsKLQkJdHlwZXMuYWRkKFVNTEVsZW1lbnRUeXBlcy5BY3Rpdml0eVBhcmFtZXRlck5vZGVfMTAxMik7Ci0JCU5vZGVUb29sRW50cnkgZW50cnkgPSBuZXcgTm9kZVRvb2xFbnRyeSgKLQkJCQlEaWFncmFtQ29yZVJlc291cmNlcy5BY3Rpdml0eURpYWdyYW1fTWlsZXN0b25lX3RleHQsCi0JCQkJRGlhZ3JhbUNvcmVSZXNvdXJjZXMuQWN0aXZpdHlEaWFncmFtX01pbGVzdG9uZV90b29sdGlwLCB0eXBlcyk7Ci0JCWVudHJ5LnNldFNtYWxsSWNvbihVTUxFbGVtZW50VHlwZXMuZ2V0SW1hZ2VEZXNjcmlwdG9yKG51bGwsCi0JCQkJVU1MRWxlbWVudFR5cGVzLkFjdGl2aXR5UGFyYW1ldGVyTm9kZV8xMDEyKSk7IC8vJE5PTi1OTFMtMSQKLQkJZW50cnkuc2V0TGFyZ2VJY29uKGVudHJ5LmdldFNtYWxsSWNvbigpKTsKLQkJcmV0dXJuIGVudHJ5OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBOb2RlVG9vbEVudHJ5IGV4dGVuZHMgVG9vbEVudHJ5IHsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSBmaW5hbCBMaXN0IGVsZW1lbnRUeXBlczsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSBOb2RlVG9vbEVudHJ5KFN0cmluZyB0aXRsZSwgU3RyaW5nIGRlc2NyaXB0aW9uLAotCQkJCUxpc3QgZWxlbWVudFR5cGVzKSB7Ci0JCQlzdXBlcih0aXRsZSwgZGVzY3JpcHRpb24sIG51bGwsIG51bGwpOwotCQkJdGhpcy5lbGVtZW50VHlwZXMgPSBlbGVtZW50VHlwZXM7Ci0JCX0KLQotCQkvKioKLQkJICogQG1vZGlmaWVkCi0JCSAqLwotCQlwdWJsaWMgVG9vbCBjcmVhdGVUb29sKCkgewotCQkJVG9vbCB0b29sID0gbmV3IFVuc3BlY2lmaWVkVHlwZUNyZWF0aW9uVG9vbChlbGVtZW50VHlwZXMpIHsKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVUYXJnZXRSZXF1ZXN0KCkgewotCQkJCQlDcmVhdGVSZXF1ZXN0IHJlcSA9IGdldENyZWF0ZVJlcXVlc3QoKTsKLQkJCQkJaWYgKGlzSW5TdGF0ZShTVEFURV9EUkFHX0lOX1BST0dSRVNTKSkgewotCQkJCQkJcmVxLnNldFNpemUobnVsbCk7Ci0JCQkJCQlyZXEuc2V0TG9jYXRpb24oZ2V0TG9jYXRpb24oKSk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlyZXEuc2V0U2l6ZShudWxsKTsKLQkJCQkJCXJlcS5zZXRMb2NhdGlvbihnZXRMb2NhdGlvbigpKTsKLQkJCQkJfQotCQkJCX0KLQkJCX07Ci0JCQl0b29sLnNldFByb3BlcnRpZXMoZ2V0VG9vbFByb3BlcnRpZXMoKSk7Ci0JCQlCcmlkZ2VIZWxwZXIuZWxlbWVudFR5cGVzLmFkZCgoSUVsZW1lbnRUeXBlKSBlbGVtZW50VHlwZXMKLQkJCQkJLmdldChlbGVtZW50VHlwZXMuc2l6ZSgpIC0gMSkpOwotCQkJcmV0dXJuIHRvb2w7Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBMaW5rVG9vbEVudHJ5IGV4dGVuZHMgVG9vbEVudHJ5IHsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSBmaW5hbCBMaXN0IHJlbGF0aW9uc2hpcFR5cGVzOwotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIExpbmtUb29sRW50cnkoU3RyaW5nIHRpdGxlLCBTdHJpbmcgZGVzY3JpcHRpb24sCi0JCQkJTGlzdCByZWxhdGlvbnNoaXBUeXBlcykgewotCQkJc3VwZXIodGl0bGUsIGRlc2NyaXB0aW9uLCBudWxsLCBudWxsKTsKLQkJCXRoaXMucmVsYXRpb25zaGlwVHlwZXMgPSByZWxhdGlvbnNoaXBUeXBlczsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgVG9vbCBjcmVhdGVUb29sKCkgewotCQkJVG9vbCB0b29sID0gbmV3IFVuc3BlY2lmaWVkVHlwZUNvbm5lY3Rpb25Ub29sKHJlbGF0aW9uc2hpcFR5cGVzKTsKLQkJCXRvb2wuc2V0UHJvcGVydGllcyhnZXRUb29sUHJvcGVydGllcygpKTsKLQkJCXJldHVybiB0b29sOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL3BhcnQvVU1MVmlzdWFsSURSZWdpc3RyeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL3BhcnQvVU1MVmlzdWFsSURSZWdpc3RyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMDg2Y2UwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9wYXJ0L1VNTFZpc3VhbElEUmVnaXN0cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk3OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnBhcnQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuQWN0aXZpdHlFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLkFjdGl2aXR5RmluYWxOb2RlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5BY3Rpdml0eUZpbmFsTm9kZU5hbWVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLkFjdGl2aXR5UGFyYW1ldGVyTm9kZTJFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLkFjdGl2aXR5UGFyYW1ldGVyTm9kZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZTJFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLkFjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLkFjdGl2aXR5UGFydGl0aW9uMkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuQWN0aXZpdHlQYXJ0aXRpb25FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLkFjdGl2aXR5UGFydGl0aW9uTmFtZTJFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLkFjdGl2aXR5UGFydGl0aW9uTmFtZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuQWN0aXZpdHlQYXJ0aXRpb25QYXJ0aXRpb25DYW1wYXJ0bWVudDJFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLkFjdGl2aXR5UGFydGl0aW9uUGFydGl0aW9uQ2FtcGFydG1lbnRFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLkNvbnRyb2xGbG93RWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5Db250cm9sRmxvd05hbWVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLkRlY2lzaW9uTm9kZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuRGVjaXNpb25Ob2RlTmFtZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuRm9ya05vZGVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLkluaXRpYWxOb2RlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5Jbml0aWFsTm9kZU5hbWVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLkpvaW5Ob2RlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5NZXJnZU5vZGVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLk1lcmdlTm9kZU5hbWVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGUyRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlM0VkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWUyRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZTNFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVOYW1lRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZXhwcmVzc2lvbnMuVU1MQWJzdHJhY3RFeHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuYnJpZGdlLkJyaWRnZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5EaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuQWN0aXZpdHlGaW5hbE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuQWN0aXZpdHlQYXJhbWV0ZXJOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkFjdGl2aXR5UGFydGl0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkNvbnRyb2xGbG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkRlY2lzaW9uTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5Gb3JrTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5Jbml0aWFsTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5Kb2luTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5NZXJnZU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5VTUxQYWNrYWdlOwotCi0vKioKLSAqIFRoaXMgcmVnaXN0cnkgaXMgdXNlZCB0byBkZXRlcm1pbmUgd2hpY2ggdHlwZSBvZiB2aXN1YWwgb2JqZWN0IHNob3VsZCBiZQotICogY3JlYXRlZCBmb3IgdGhlIGNvcnJlc3BvbmRpbmcgRGlhZ3JhbSwgTm9kZSwgQ2hpbGROb2RlIG9yIExpbmsgcmVwcmVzZW50ZWQgCi0gKiBieSBhIGRvbWFpbiBtb2RlbCBvYmplY3QuCi0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgVU1MVmlzdWFsSURSZWdpc3RyeSB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFQlVHX0tFWSA9IEFjdGl2aXR5RGlhZ3JhbUVkaXRvclBsdWdpbgotCQkJLmdldEluc3RhbmNlKCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCkKLQkJCSsgIi9kZWJ1Zy92aXN1YWxJRCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBnZXRWaXN1YWxJRChWaWV3IHZpZXcpIHsKLQkJaWYgKHZpZXcgaW5zdGFuY2VvZiBEaWFncmFtKSB7Ci0JCQlpZiAoQWN0aXZpdHlFZGl0UGFydC5NT0RFTF9JRC5lcXVhbHModmlldy5nZXRUeXBlKCkpKSB7Ci0JCQkJcmV0dXJuIEFjdGl2aXR5RWRpdFBhcnQuVklTVUFMX0lEOwotCQkJfSBlbHNlIHsKLQkJCQlyZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGdldFZpc3VhbElEKHZpZXcuZ2V0VHlwZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TW9kZWxJRChWaWV3IHZpZXcpIHsKLQkJVmlldyBkaWFncmFtID0gdmlldy5nZXREaWFncmFtKCk7Ci0JCXdoaWxlICh2aWV3ICE9IGRpYWdyYW0pIHsKLQkJCUVBbm5vdGF0aW9uIGFubm90YXRpb24gPSB2aWV3LmdldEVBbm5vdGF0aW9uKCJTaG9ydGN1dCIpOyAvLyROT04tTkxTLTEkCi0JCQlpZiAoYW5ub3RhdGlvbiAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIChTdHJpbmcpIGFubm90YXRpb24uZ2V0RGV0YWlscygpLmdldCgibW9kZWxJRCIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQl2aWV3ID0gKFZpZXcpIHZpZXcuZUNvbnRhaW5lcigpOwotCQl9Ci0JCXJldHVybiBkaWFncmFtICE9IG51bGwgPyBkaWFncmFtLmdldFR5cGUoKSA6IG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IGdldFZpc3VhbElEKFN0cmluZyB0eXBlKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gSW50ZWdlci5wYXJzZUludCh0eXBlKTsKLQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLQkJCWlmIChCb29sZWFuLlRSVUUudG9TdHJpbmcoKS5lcXVhbHNJZ25vcmVDYXNlKAotCQkJCQlQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbihERUJVR19LRVkpKSkgewotCQkJCUFjdGl2aXR5RGlhZ3JhbUVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmxvZ0Vycm9yKAotCQkJCQkJIlVuYWJsZSB0byBwYXJzZSB2aWV3IHR5cGUgYXMgYSB2aXN1YWxJRCBudW1iZXI6ICIKLQkJCQkJCQkJKyB0eXBlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gLTE7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFR5cGUoaW50IHZpc3VhbElEKSB7Ci0JCXJldHVybiBTdHJpbmcudmFsdWVPZih2aXN1YWxJRCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IGdldERpYWdyYW1WaXN1YWxJRChFT2JqZWN0IGRvbWFpbkVsZW1lbnQpIHsKLQkJaWYgKGRvbWFpbkVsZW1lbnQgPT0gbnVsbCkgewotCQkJcmV0dXJuIC0xOwotCQl9Ci0JCUVDbGFzcyBkb21haW5FbGVtZW50TWV0YWNsYXNzID0gZG9tYWluRWxlbWVudC5lQ2xhc3MoKTsKLQkJcmV0dXJuIGdldERpYWdyYW1WaXN1YWxJRChkb21haW5FbGVtZW50LCBkb21haW5FbGVtZW50TWV0YWNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgaW50IGdldERpYWdyYW1WaXN1YWxJRChFT2JqZWN0IGRvbWFpbkVsZW1lbnQsCi0JCQlFQ2xhc3MgZG9tYWluRWxlbWVudE1ldGFjbGFzcykgewotCQlpZiAoVU1MUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QWN0aXZpdHkoKS5pc1N1cGVyVHlwZU9mKAotCQkJCWRvbWFpbkVsZW1lbnRNZXRhY2xhc3MpCi0JCQkJJiYgaXNEaWFncmFtQWN0aXZpdHlfNzkoKEFjdGl2aXR5KSBkb21haW5FbGVtZW50KSkgewotCQkJcmV0dXJuIEFjdGl2aXR5RWRpdFBhcnQuVklTVUFMX0lEOwotCQl9Ci0JCXJldHVybiBnZXRVbnJlY29nbml6ZWREaWFncmFtSUQoZG9tYWluRWxlbWVudCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IGdldE5vZGVWaXN1YWxJRChWaWV3IGNvbnRhaW5lclZpZXcsIEVPYmplY3QgZG9tYWluRWxlbWVudCkgewotCQlpZiAoZG9tYWluRWxlbWVudCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQkJRUNsYXNzIGRvbWFpbkVsZW1lbnRNZXRhY2xhc3MgPSBkb21haW5FbGVtZW50LmVDbGFzcygpOwotCQlyZXR1cm4gZ2V0Tm9kZVZpc3VhbElEKGNvbnRhaW5lclZpZXcsIGRvbWFpbkVsZW1lbnQsCi0JCQkJZG9tYWluRWxlbWVudE1ldGFjbGFzcywgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgZ2V0Tm9kZVZpc3VhbElEKFZpZXcgY29udGFpbmVyVmlldywKLQkJCUVPYmplY3QgZG9tYWluRWxlbWVudCwgRUNsYXNzIGRvbWFpbkVsZW1lbnRNZXRhY2xhc3MsCi0JCQlTdHJpbmcgc2VtYW50aWNIaW50KSB7Ci0JCVN0cmluZyBjb250YWluZXJNb2RlbElEID0gZ2V0TW9kZWxJRChjb250YWluZXJWaWV3KTsKLQkJaWYgKCFBY3Rpdml0eUVkaXRQYXJ0Lk1PREVMX0lELmVxdWFscyhjb250YWluZXJNb2RlbElEKSkgewotCQkJcmV0dXJuIC0xOwotCQl9Ci0JCWludCBjb250YWluZXJWaXN1YWxJRDsKLQkJaWYgKEFjdGl2aXR5RWRpdFBhcnQuTU9ERUxfSUQuZXF1YWxzKGNvbnRhaW5lck1vZGVsSUQpKSB7Ci0JCQljb250YWluZXJWaXN1YWxJRCA9IGdldFZpc3VhbElEKGNvbnRhaW5lclZpZXcpOwotCQl9IGVsc2UgewotCQkJaWYgKGNvbnRhaW5lclZpZXcgaW5zdGFuY2VvZiBEaWFncmFtKSB7Ci0JCQkJY29udGFpbmVyVmlzdWFsSUQgPSBBY3Rpdml0eUVkaXRQYXJ0LlZJU1VBTF9JRDsKLQkJCX0gZWxzZSB7Ci0JCQkJcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWludCBub2RlVmlzdWFsSUQgPSBzZW1hbnRpY0hpbnQgIT0gbnVsbCA/IGdldFZpc3VhbElEKHNlbWFudGljSGludCkKLQkJCQk6IC0xOwotCQlzd2l0Y2ggKGNvbnRhaW5lclZpc3VhbElEKSB7Ci0JCWNhc2UgQWN0aXZpdHlGaW5hbE5vZGVFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQlpZiAoQWN0aXZpdHlGaW5hbE5vZGVOYW1lRWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgewotCQkJCXJldHVybiBBY3Rpdml0eUZpbmFsTm9kZU5hbWVFZGl0UGFydC5WSVNVQUxfSUQ7Ci0JCQl9Ci0JCQlyZXR1cm4gZ2V0VW5yZWNvZ25pemVkQWN0aXZpdHlGaW5hbE5vZGVfMTAwMUNoaWxkTm9kZUlEKAotCQkJCQlkb21haW5FbGVtZW50LCBzZW1hbnRpY0hpbnQpOwotCQljYXNlIE1lcmdlTm9kZUVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCWlmIChNZXJnZU5vZGVOYW1lRWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgewotCQkJCXJldHVybiBNZXJnZU5vZGVOYW1lRWRpdFBhcnQuVklTVUFMX0lEOwotCQkJfQotCQkJcmV0dXJuIGdldFVucmVjb2duaXplZE1lcmdlTm9kZV8xMDAyQ2hpbGROb2RlSUQoZG9tYWluRWxlbWVudCwKLQkJCQkJc2VtYW50aWNIaW50KTsKLQkJY2FzZSBGb3JrTm9kZUVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCXJldHVybiBnZXRVbnJlY29nbml6ZWRGb3JrTm9kZV8xMDAzQ2hpbGROb2RlSUQoZG9tYWluRWxlbWVudCwKLQkJCQkJc2VtYW50aWNIaW50KTsKLQkJY2FzZSBJbml0aWFsTm9kZUVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCWlmIChJbml0aWFsTm9kZU5hbWVFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7Ci0JCQkJcmV0dXJuIEluaXRpYWxOb2RlTmFtZUVkaXRQYXJ0LlZJU1VBTF9JRDsKLQkJCX0KLQkJCXJldHVybiBnZXRVbnJlY29nbml6ZWRJbml0aWFsTm9kZV8xMDA0Q2hpbGROb2RlSUQoZG9tYWluRWxlbWVudCwKLQkJCQkJc2VtYW50aWNIaW50KTsKLQkJY2FzZSBEZWNpc2lvbk5vZGVFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQlpZiAoRGVjaXNpb25Ob2RlTmFtZUVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsKLQkJCQlyZXR1cm4gRGVjaXNpb25Ob2RlTmFtZUVkaXRQYXJ0LlZJU1VBTF9JRDsKLQkJCX0KLQkJCXJldHVybiBnZXRVbnJlY29nbml6ZWREZWNpc2lvbk5vZGVfMTAwNUNoaWxkTm9kZUlEKGRvbWFpbkVsZW1lbnQsCi0JCQkJCXNlbWFudGljSGludCk7Ci0JCWNhc2UgSm9pbk5vZGVFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQlyZXR1cm4gZ2V0VW5yZWNvZ25pemVkSm9pbk5vZGVfMTAwNkNoaWxkTm9kZUlEKGRvbWFpbkVsZW1lbnQsCi0JCQkJCXNlbWFudGljSGludCk7Ci0JCWNhc2UgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZUVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCWlmIChTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZUVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsKLQkJCQlyZXR1cm4gU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWVFZGl0UGFydC5WSVNVQUxfSUQ7Ci0JCQl9Ci0JCQlyZXR1cm4gZ2V0VW5yZWNvZ25pemVkU3RydWN0dXJlZEFjdGl2aXR5Tm9kZV8xMDA3Q2hpbGROb2RlSUQoCi0JCQkJCWRvbWFpbkVsZW1lbnQsIHNlbWFudGljSGludCk7Ci0JCWNhc2UgQWN0aXZpdHlQYXJ0aXRpb25FZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQlpZiAoQWN0aXZpdHlQYXJ0aXRpb25OYW1lMkVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsKLQkJCQlyZXR1cm4gQWN0aXZpdHlQYXJ0aXRpb25OYW1lMkVkaXRQYXJ0LlZJU1VBTF9JRDsKLQkJCX0KLQkJCWlmIChBY3Rpdml0eVBhcnRpdGlvblBhcnRpdGlvbkNhbXBhcnRtZW50RWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgewotCQkJCXJldHVybiBBY3Rpdml0eVBhcnRpdGlvblBhcnRpdGlvbkNhbXBhcnRtZW50RWRpdFBhcnQuVklTVUFMX0lEOwotCQkJfQotCQkJaWYgKFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7Ci0JCQkJcmV0dXJuIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVFZGl0UGFydC5WSVNVQUxfSUQ7Ci0JCQl9Ci0JCQlpZiAoU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTJFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7Ci0JCQkJcmV0dXJuIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUyRWRpdFBhcnQuVklTVUFMX0lEOwotCQkJfQotCQkJaWYgKFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUzRWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgewotCQkJCXJldHVybiBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlM0VkaXRQYXJ0LlZJU1VBTF9JRDsKLQkJCX0KLQkJCWlmIChJbml0aWFsTm9kZUVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsKLQkJCQlyZXR1cm4gSW5pdGlhbE5vZGVFZGl0UGFydC5WSVNVQUxfSUQ7Ci0JCQl9Ci0JCQlpZiAoQWN0aXZpdHlGaW5hbE5vZGVFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7Ci0JCQkJcmV0dXJuIEFjdGl2aXR5RmluYWxOb2RlRWRpdFBhcnQuVklTVUFMX0lEOwotCQkJfQotCQkJaWYgKEpvaW5Ob2RlRWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgewotCQkJCXJldHVybiBKb2luTm9kZUVkaXRQYXJ0LlZJU1VBTF9JRDsKLQkJCX0KLQkJCWlmIChGb3JrTm9kZUVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsKLQkJCQlyZXR1cm4gRm9ya05vZGVFZGl0UGFydC5WSVNVQUxfSUQ7Ci0JCQl9Ci0JCQlpZiAoTWVyZ2VOb2RlRWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgewotCQkJCXJldHVybiBNZXJnZU5vZGVFZGl0UGFydC5WSVNVQUxfSUQ7Ci0JCQl9Ci0JCQlpZiAoRGVjaXNpb25Ob2RlRWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgewotCQkJCXJldHVybiBEZWNpc2lvbk5vZGVFZGl0UGFydC5WSVNVQUxfSUQ7Ci0JCQl9Ci0JCQlpZiAoQWN0aXZpdHlQYXJhbWV0ZXJOb2RlRWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgewotCQkJCXJldHVybiBBY3Rpdml0eVBhcmFtZXRlck5vZGVFZGl0UGFydC5WSVNVQUxfSUQ7Ci0JCQl9Ci0JCQlpZiAoQWN0aXZpdHlQYXJhbWV0ZXJOb2RlMkVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsKLQkJCQlyZXR1cm4gQWN0aXZpdHlQYXJhbWV0ZXJOb2RlMkVkaXRQYXJ0LlZJU1VBTF9JRDsKLQkJCX0KLQkJCXJldHVybiBnZXRVbnJlY29nbml6ZWRBY3Rpdml0eVBhcnRpdGlvbl8xMDA4Q2hpbGROb2RlSUQoCi0JCQkJCWRvbWFpbkVsZW1lbnQsIHNlbWFudGljSGludCk7Ci0JCWNhc2UgQWN0aXZpdHlQYXJhbWV0ZXJOb2RlRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJaWYgKEFjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWVFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7Ci0JCQkJcmV0dXJuIEFjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWVFZGl0UGFydC5WSVNVQUxfSUQ7Ci0JCQl9Ci0JCQlyZXR1cm4gZ2V0VW5yZWNvZ25pemVkQWN0aXZpdHlQYXJhbWV0ZXJOb2RlXzEwMDlDaGlsZE5vZGVJRCgKLQkJCQkJZG9tYWluRWxlbWVudCwgc2VtYW50aWNIaW50KTsKLQkJY2FzZSBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlMkVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCWlmIChTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZTJFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7Ci0JCQkJcmV0dXJuIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVOYW1lMkVkaXRQYXJ0LlZJU1VBTF9JRDsKLQkJCX0KLQkJCXJldHVybiBnZXRVbnJlY29nbml6ZWRTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlXzEwMTBDaGlsZE5vZGVJRCgKLQkJCQkJZG9tYWluRWxlbWVudCwgc2VtYW50aWNIaW50KTsKLQkJY2FzZSBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlM0VkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCWlmIChTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZTNFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7Ci0JCQkJcmV0dXJuIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVOYW1lM0VkaXRQYXJ0LlZJU1VBTF9JRDsKLQkJCX0KLQkJCXJldHVybiBnZXRVbnJlY29nbml6ZWRTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlXzEwMTFDaGlsZE5vZGVJRCgKLQkJCQkJZG9tYWluRWxlbWVudCwgc2VtYW50aWNIaW50KTsKLQkJY2FzZSBBY3Rpdml0eVBhcmFtZXRlck5vZGUyRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJaWYgKEFjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWUyRWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgewotCQkJCXJldHVybiBBY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lMkVkaXRQYXJ0LlZJU1VBTF9JRDsKLQkJCX0KLQkJCXJldHVybiBnZXRVbnJlY29nbml6ZWRBY3Rpdml0eVBhcmFtZXRlck5vZGVfMTAxMkNoaWxkTm9kZUlEKAotCQkJCQlkb21haW5FbGVtZW50LCBzZW1hbnRpY0hpbnQpOwotCQljYXNlIEFjdGl2aXR5UGFydGl0aW9uMkVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCWlmIChBY3Rpdml0eVBhcnRpdGlvbk5hbWVFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7Ci0JCQkJcmV0dXJuIEFjdGl2aXR5UGFydGl0aW9uTmFtZUVkaXRQYXJ0LlZJU1VBTF9JRDsKLQkJCX0KLQkJCWlmIChBY3Rpdml0eVBhcnRpdGlvblBhcnRpdGlvbkNhbXBhcnRtZW50MkVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsKLQkJCQlyZXR1cm4gQWN0aXZpdHlQYXJ0aXRpb25QYXJ0aXRpb25DYW1wYXJ0bWVudDJFZGl0UGFydC5WSVNVQUxfSUQ7Ci0JCQl9Ci0JCQlyZXR1cm4gZ2V0VW5yZWNvZ25pemVkQWN0aXZpdHlQYXJ0aXRpb25fMjAwMUNoaWxkTm9kZUlEKAotCQkJCQlkb21haW5FbGVtZW50LCBzZW1hbnRpY0hpbnQpOwotCQljYXNlIEFjdGl2aXR5UGFydGl0aW9uUGFydGl0aW9uQ2FtcGFydG1lbnRFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQlpZiAoKHNlbWFudGljSGludCA9PSBudWxsIHx8IEFjdGl2aXR5UGFydGl0aW9uMkVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpCi0JCQkJCSYmIFVNTFBhY2thZ2UuZUlOU1RBTkNFLmdldEFjdGl2aXR5UGFydGl0aW9uKCkKLQkJCQkJCQkuaXNTdXBlclR5cGVPZihkb21haW5FbGVtZW50TWV0YWNsYXNzKQotCQkJCQkmJiAoZG9tYWluRWxlbWVudCA9PSBudWxsIHx8IGlzTm9kZUFjdGl2aXR5UGFydGl0aW9uXzIwMDEoKEFjdGl2aXR5UGFydGl0aW9uKSBkb21haW5FbGVtZW50KSkpIHsKLQkJCQlyZXR1cm4gQWN0aXZpdHlQYXJ0aXRpb24yRWRpdFBhcnQuVklTVUFMX0lEOwotCQkJfQotCQkJcmV0dXJuIGdldFVucmVjb2duaXplZEFjdGl2aXR5UGFydGl0aW9uUGFydGl0aW9uQ2FtcGFydG1lbnRfNTAwMUNoaWxkTm9kZUlEKAotCQkJCQlkb21haW5FbGVtZW50LCBzZW1hbnRpY0hpbnQpOwotCQljYXNlIEFjdGl2aXR5UGFydGl0aW9uUGFydGl0aW9uQ2FtcGFydG1lbnQyRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJaWYgKChzZW1hbnRpY0hpbnQgPT0gbnVsbCB8fCBBY3Rpdml0eVBhcnRpdGlvbjJFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKQotCQkJCQkmJiBVTUxQYWNrYWdlLmVJTlNUQU5DRS5nZXRBY3Rpdml0eVBhcnRpdGlvbigpCi0JCQkJCQkJLmlzU3VwZXJUeXBlT2YoZG9tYWluRWxlbWVudE1ldGFjbGFzcykKLQkJCQkJJiYgKGRvbWFpbkVsZW1lbnQgPT0gbnVsbCB8fCBpc05vZGVBY3Rpdml0eVBhcnRpdGlvbl8yMDAxKChBY3Rpdml0eVBhcnRpdGlvbikgZG9tYWluRWxlbWVudCkpKSB7Ci0JCQkJcmV0dXJuIEFjdGl2aXR5UGFydGl0aW9uMkVkaXRQYXJ0LlZJU1VBTF9JRDsKLQkJCX0KLQkJCXJldHVybiBnZXRVbnJlY29nbml6ZWRBY3Rpdml0eVBhcnRpdGlvblBhcnRpdGlvbkNhbXBhcnRtZW50XzUwMDJDaGlsZE5vZGVJRCgKLQkJCQkJZG9tYWluRWxlbWVudCwgc2VtYW50aWNIaW50KTsKLQkJY2FzZSBBY3Rpdml0eUVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCWlmICgoc2VtYW50aWNIaW50ID09IG51bGwgfHwgQWN0aXZpdHlGaW5hbE5vZGVFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKQotCQkJCQkmJiBVTUxQYWNrYWdlLmVJTlNUQU5DRS5nZXRBY3Rpdml0eUZpbmFsTm9kZSgpCi0JCQkJCQkJLmlzU3VwZXJUeXBlT2YoZG9tYWluRWxlbWVudE1ldGFjbGFzcykKLQkJCQkJJiYgKGRvbWFpbkVsZW1lbnQgPT0gbnVsbCB8fCBpc05vZGVBY3Rpdml0eUZpbmFsTm9kZV8xMDAxKChBY3Rpdml0eUZpbmFsTm9kZSkgZG9tYWluRWxlbWVudCkpKSB7Ci0JCQkJcmV0dXJuIEFjdGl2aXR5RmluYWxOb2RlRWRpdFBhcnQuVklTVUFMX0lEOwotCQkJfQotCQkJaWYgKChzZW1hbnRpY0hpbnQgPT0gbnVsbCB8fCBNZXJnZU5vZGVFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKQotCQkJCQkmJiBVTUxQYWNrYWdlLmVJTlNUQU5DRS5nZXRNZXJnZU5vZGUoKS5pc1N1cGVyVHlwZU9mKAotCQkJCQkJCWRvbWFpbkVsZW1lbnRNZXRhY2xhc3MpCi0JCQkJCSYmIChkb21haW5FbGVtZW50ID09IG51bGwgfHwgaXNOb2RlTWVyZ2VOb2RlXzEwMDIoKE1lcmdlTm9kZSkgZG9tYWluRWxlbWVudCkpKSB7Ci0JCQkJcmV0dXJuIE1lcmdlTm9kZUVkaXRQYXJ0LlZJU1VBTF9JRDsKLQkJCX0KLQkJCWlmICgoc2VtYW50aWNIaW50ID09IG51bGwgfHwgRm9ya05vZGVFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKQotCQkJCQkmJiBVTUxQYWNrYWdlLmVJTlNUQU5DRS5nZXRGb3JrTm9kZSgpLmlzU3VwZXJUeXBlT2YoCi0JCQkJCQkJZG9tYWluRWxlbWVudE1ldGFjbGFzcykKLQkJCQkJJiYgKGRvbWFpbkVsZW1lbnQgPT0gbnVsbCB8fCBpc05vZGVGb3JrTm9kZV8xMDAzKChGb3JrTm9kZSkgZG9tYWluRWxlbWVudCkpKSB7Ci0JCQkJcmV0dXJuIEZvcmtOb2RlRWRpdFBhcnQuVklTVUFMX0lEOwotCQkJfQotCQkJaWYgKChzZW1hbnRpY0hpbnQgPT0gbnVsbCB8fCBJbml0aWFsTm9kZUVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpCi0JCQkJCSYmIFVNTFBhY2thZ2UuZUlOU1RBTkNFLmdldEluaXRpYWxOb2RlKCkuaXNTdXBlclR5cGVPZigKLQkJCQkJCQlkb21haW5FbGVtZW50TWV0YWNsYXNzKQotCQkJCQkmJiAoZG9tYWluRWxlbWVudCA9PSBudWxsIHx8IGlzTm9kZUluaXRpYWxOb2RlXzEwMDQoKEluaXRpYWxOb2RlKSBkb21haW5FbGVtZW50KSkpIHsKLQkJCQlyZXR1cm4gSW5pdGlhbE5vZGVFZGl0UGFydC5WSVNVQUxfSUQ7Ci0JCQl9Ci0JCQlpZiAoKHNlbWFudGljSGludCA9PSBudWxsIHx8IERlY2lzaW9uTm9kZUVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpCi0JCQkJCSYmIFVNTFBhY2thZ2UuZUlOU1RBTkNFLmdldERlY2lzaW9uTm9kZSgpLmlzU3VwZXJUeXBlT2YoCi0JCQkJCQkJZG9tYWluRWxlbWVudE1ldGFjbGFzcykKLQkJCQkJJiYgKGRvbWFpbkVsZW1lbnQgPT0gbnVsbCB8fCBpc05vZGVEZWNpc2lvbk5vZGVfMTAwNSgoRGVjaXNpb25Ob2RlKSBkb21haW5FbGVtZW50KSkpIHsKLQkJCQlyZXR1cm4gRGVjaXNpb25Ob2RlRWRpdFBhcnQuVklTVUFMX0lEOwotCQkJfQotCQkJaWYgKChzZW1hbnRpY0hpbnQgPT0gbnVsbCB8fCBKb2luTm9kZUVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpCi0JCQkJCSYmIFVNTFBhY2thZ2UuZUlOU1RBTkNFLmdldEpvaW5Ob2RlKCkuaXNTdXBlclR5cGVPZigKLQkJCQkJCQlkb21haW5FbGVtZW50TWV0YWNsYXNzKQotCQkJCQkmJiAoZG9tYWluRWxlbWVudCA9PSBudWxsIHx8IGlzTm9kZUpvaW5Ob2RlXzEwMDYoKEpvaW5Ob2RlKSBkb21haW5FbGVtZW50KSkpIHsKLQkJCQlyZXR1cm4gSm9pbk5vZGVFZGl0UGFydC5WSVNVQUxfSUQ7Ci0JCQl9Ci0JCQlpZiAoKHNlbWFudGljSGludCA9PSBudWxsIHx8IFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKQotCQkJCQkmJiBVTUxQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlKCkKLQkJCQkJCQkuaXNTdXBlclR5cGVPZihkb21haW5FbGVtZW50TWV0YWNsYXNzKQotCQkJCQkmJiAoZG9tYWluRWxlbWVudCA9PSBudWxsIHx8IGlzTm9kZVN0cnVjdHVyZWRBY3Rpdml0eU5vZGVfMTAwNygoU3RydWN0dXJlZEFjdGl2aXR5Tm9kZSkgZG9tYWluRWxlbWVudCkpKSB7Ci0JCQkJcmV0dXJuIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVFZGl0UGFydC5WSVNVQUxfSUQ7Ci0JCQl9Ci0JCQlpZiAoKHNlbWFudGljSGludCA9PSBudWxsIHx8IEFjdGl2aXR5UGFydGl0aW9uRWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkKLQkJCQkJJiYgVU1MUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QWN0aXZpdHlQYXJ0aXRpb24oKQotCQkJCQkJCS5pc1N1cGVyVHlwZU9mKGRvbWFpbkVsZW1lbnRNZXRhY2xhc3MpCi0JCQkJCSYmIChkb21haW5FbGVtZW50ID09IG51bGwgfHwgaXNOb2RlQWN0aXZpdHlQYXJ0aXRpb25fMTAwOCgoQWN0aXZpdHlQYXJ0aXRpb24pIGRvbWFpbkVsZW1lbnQpKSkgewotCQkJCXJldHVybiBBY3Rpdml0eVBhcnRpdGlvbkVkaXRQYXJ0LlZJU1VBTF9JRDsKLQkJCX0KLQkJCWlmICgoc2VtYW50aWNIaW50ID09IG51bGwgfHwgQWN0aXZpdHlQYXJhbWV0ZXJOb2RlRWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkKLQkJCQkJJiYgVU1MUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QWN0aXZpdHlQYXJhbWV0ZXJOb2RlKCkKLQkJCQkJCQkuaXNTdXBlclR5cGVPZihkb21haW5FbGVtZW50TWV0YWNsYXNzKQotCQkJCQkmJiAoZG9tYWluRWxlbWVudCA9PSBudWxsIHx8IGlzTm9kZUFjdGl2aXR5UGFyYW1ldGVyTm9kZV8xMDA5KChBY3Rpdml0eVBhcmFtZXRlck5vZGUpIGRvbWFpbkVsZW1lbnQpKSkgewotCQkJCXJldHVybiBBY3Rpdml0eVBhcmFtZXRlck5vZGVFZGl0UGFydC5WSVNVQUxfSUQ7Ci0JCQl9Ci0JCQlpZiAoKHNlbWFudGljSGludCA9PSBudWxsIHx8IFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUyRWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkKLQkJCQkJJiYgVU1MUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U3RydWN0dXJlZEFjdGl2aXR5Tm9kZSgpCi0JCQkJCQkJLmlzU3VwZXJUeXBlT2YoZG9tYWluRWxlbWVudE1ldGFjbGFzcykKLQkJCQkJJiYgKGRvbWFpbkVsZW1lbnQgPT0gbnVsbCB8fCBpc05vZGVTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlXzEwMTAoKFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUpIGRvbWFpbkVsZW1lbnQpKSkgewotCQkJCXJldHVybiBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlMkVkaXRQYXJ0LlZJU1VBTF9JRDsKLQkJCX0KLQkJCWlmICgoc2VtYW50aWNIaW50ID09IG51bGwgfHwgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTNFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKQotCQkJCQkmJiBVTUxQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlKCkKLQkJCQkJCQkuaXNTdXBlclR5cGVPZihkb21haW5FbGVtZW50TWV0YWNsYXNzKQotCQkJCQkmJiAoZG9tYWluRWxlbWVudCA9PSBudWxsIHx8IGlzTm9kZVN0cnVjdHVyZWRBY3Rpdml0eU5vZGVfMTAxMSgoU3RydWN0dXJlZEFjdGl2aXR5Tm9kZSkgZG9tYWluRWxlbWVudCkpKSB7Ci0JCQkJcmV0dXJuIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUzRWRpdFBhcnQuVklTVUFMX0lEOwotCQkJfQotCQkJaWYgKChzZW1hbnRpY0hpbnQgPT0gbnVsbCB8fCBBY3Rpdml0eVBhcmFtZXRlck5vZGUyRWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkKLQkJCQkJJiYgVU1MUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QWN0aXZpdHlQYXJhbWV0ZXJOb2RlKCkKLQkJCQkJCQkuaXNTdXBlclR5cGVPZihkb21haW5FbGVtZW50TWV0YWNsYXNzKQotCQkJCQkmJiAoZG9tYWluRWxlbWVudCA9PSBudWxsIHx8IGlzTm9kZUFjdGl2aXR5UGFyYW1ldGVyTm9kZV8xMDEyKChBY3Rpdml0eVBhcmFtZXRlck5vZGUpIGRvbWFpbkVsZW1lbnQpKSkgewotCQkJCXJldHVybiBBY3Rpdml0eVBhcmFtZXRlck5vZGUyRWRpdFBhcnQuVklTVUFMX0lEOwotCQkJfQotCQkJcmV0dXJuIGdldFVucmVjb2duaXplZEFjdGl2aXR5Xzc5Q2hpbGROb2RlSUQoZG9tYWluRWxlbWVudCwKLQkJCQkJc2VtYW50aWNIaW50KTsKLQkJY2FzZSBDb250cm9sRmxvd0VkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCWlmIChDb250cm9sRmxvd05hbWVFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7Ci0JCQkJcmV0dXJuIENvbnRyb2xGbG93TmFtZUVkaXRQYXJ0LlZJU1VBTF9JRDsKLQkJCX0KLQkJCXJldHVybiBnZXRVbnJlY29nbml6ZWRDb250cm9sRmxvd18zMDAxTGlua0xhYmVsSUQoc2VtYW50aWNIaW50KTsKLQkJfQotCQlyZXR1cm4gLTE7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IGdldExpbmtXaXRoQ2xhc3NWaXN1YWxJRChFT2JqZWN0IGRvbWFpbkVsZW1lbnQpIHsKLQkJaWYgKGRvbWFpbkVsZW1lbnQgPT0gbnVsbCkgewotCQkJcmV0dXJuIC0xOwotCQl9Ci0JCUVDbGFzcyBkb21haW5FbGVtZW50TWV0YWNsYXNzID0gZG9tYWluRWxlbWVudC5lQ2xhc3MoKTsKLQkJcmV0dXJuIGdldExpbmtXaXRoQ2xhc3NWaXN1YWxJRChkb21haW5FbGVtZW50LCBkb21haW5FbGVtZW50TWV0YWNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgZ2V0TGlua1dpdGhDbGFzc1Zpc3VhbElEKEVPYmplY3QgZG9tYWluRWxlbWVudCwKLQkJCUVDbGFzcyBkb21haW5FbGVtZW50TWV0YWNsYXNzKSB7Ci0JCWlmIChVTUxQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb250cm9sRmxvdygpLmlzU3VwZXJUeXBlT2YoCi0JCQkJZG9tYWluRWxlbWVudE1ldGFjbGFzcykKLQkJCQkmJiAoZG9tYWluRWxlbWVudCA9PSBudWxsIHx8IGlzTGlua1dpdGhDbGFzc0NvbnRyb2xGbG93XzMwMDEoKENvbnRyb2xGbG93KSBkb21haW5FbGVtZW50KSkpIHsKLQkJCXJldHVybiBDb250cm9sRmxvd0VkaXRQYXJ0LlZJU1VBTF9JRDsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBnZXRVbnJlY29nbml6ZWRMaW5rV2l0aENsYXNzSUQoZG9tYWluRWxlbWVudCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBVc2VyIGNhbiBjaGFuZ2UgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2QgdG8gY2hlY2sgc29tZSBhZGRpdGlvbmFsIAotCSAqIGNvbmRpdGlvbnMgaGVyZS4KLQkgKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzRGlhZ3JhbUFjdGl2aXR5Xzc5KEFjdGl2aXR5IGVsZW1lbnQpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogVXNlciBjYW4gY2hhbmdlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kIHRvIGhhbmRsZSBzb21lIHNwZWNpZmljCi0JICogc2l0dWF0aW9ucyBub3QgY292ZXJlZCBieSBkZWZhdWx0IGxvZ2ljLgotCSAqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGludCBnZXRVbnJlY29nbml6ZWREaWFncmFtSUQoRU9iamVjdCBkb21haW5FbGVtZW50KSB7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQkvKioKLQkgKiBVc2VyIGNhbiBjaGFuZ2UgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2QgdG8gY2hlY2sgc29tZSBhZGRpdGlvbmFsIAotCSAqIGNvbmRpdGlvbnMgaGVyZS4KLQkgKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzTm9kZUFjdGl2aXR5RmluYWxOb2RlXzEwMDEoCi0JCQlBY3Rpdml0eUZpbmFsTm9kZSBlbGVtZW50KSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIFVzZXIgY2FuIGNoYW5nZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZCB0byBjaGVjayBzb21lIGFkZGl0aW9uYWwgCi0JICogY29uZGl0aW9ucyBoZXJlLgotCSAqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNOb2RlTWVyZ2VOb2RlXzEwMDIoTWVyZ2VOb2RlIGVsZW1lbnQpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogVXNlciBjYW4gY2hhbmdlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kIHRvIGNoZWNrIHNvbWUgYWRkaXRpb25hbCAKLQkgKiBjb25kaXRpb25zIGhlcmUuCi0JICoKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc05vZGVGb3JrTm9kZV8xMDAzKEZvcmtOb2RlIGVsZW1lbnQpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogVXNlciBjYW4gY2hhbmdlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kIHRvIGNoZWNrIHNvbWUgYWRkaXRpb25hbCAKLQkgKiBjb25kaXRpb25zIGhlcmUuCi0JICoKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc05vZGVJbml0aWFsTm9kZV8xMDA0KEluaXRpYWxOb2RlIGVsZW1lbnQpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogVXNlciBjYW4gY2hhbmdlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kIHRvIGNoZWNrIHNvbWUgYWRkaXRpb25hbCAKLQkgKiBjb25kaXRpb25zIGhlcmUuCi0JICoKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc05vZGVEZWNpc2lvbk5vZGVfMTAwNShEZWNpc2lvbk5vZGUgZWxlbWVudCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBVc2VyIGNhbiBjaGFuZ2UgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2QgdG8gY2hlY2sgc29tZSBhZGRpdGlvbmFsIAotCSAqIGNvbmRpdGlvbnMgaGVyZS4KLQkgKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzTm9kZUpvaW5Ob2RlXzEwMDYoSm9pbk5vZGUgZWxlbWVudCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBVc2VyIGNhbiBjaGFuZ2UgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2QgdG8gY2hlY2sgc29tZSBhZGRpdGlvbmFsIAotCSAqIGNvbmRpdGlvbnMgaGVyZS4KLQkgKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzTm9kZVN0cnVjdHVyZWRBY3Rpdml0eU5vZGVfMTAwNygKLQkJCVN0cnVjdHVyZWRBY3Rpdml0eU5vZGUgZWxlbWVudCkgewotCQlyZXR1cm4gU3RydWN0dXJlZEFjdGl2aXR5Tm9kZV8xMDA3Lm1hdGNoZXMoZWxlbWVudCk7Ci0JfQotCi0JLyoqCi0JICogVXNlciBjYW4gY2hhbmdlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kIHRvIGNoZWNrIHNvbWUgYWRkaXRpb25hbCAKLQkgKiBjb25kaXRpb25zIGhlcmUuCi0JICoKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc05vZGVBY3Rpdml0eVBhcnRpdGlvbl8xMDA4KAotCQkJQWN0aXZpdHlQYXJ0aXRpb24gZWxlbWVudCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBVc2VyIGNhbiBjaGFuZ2UgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2QgdG8gY2hlY2sgc29tZSBhZGRpdGlvbmFsIAotCSAqIGNvbmRpdGlvbnMgaGVyZS4KLQkgKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzTm9kZUFjdGl2aXR5UGFyYW1ldGVyTm9kZV8xMDA5KAotCQkJQWN0aXZpdHlQYXJhbWV0ZXJOb2RlIGVsZW1lbnQpIHsKLQkJcmV0dXJuIEFjdGl2aXR5UGFyYW1ldGVyTm9kZV8xMDA5Lm1hdGNoZXMoZWxlbWVudCk7Ci0JfQotCi0JLyoqCi0JICogVXNlciBjYW4gY2hhbmdlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kIHRvIGNoZWNrIHNvbWUgYWRkaXRpb25hbCAKLQkgKiBjb25kaXRpb25zIGhlcmUuCi0JICoKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc05vZGVTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlXzEwMTAoCi0JCQlTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlIGVsZW1lbnQpIHsKLQkJcmV0dXJuIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVfMTAxMC5tYXRjaGVzKGVsZW1lbnQpOwotCX0KLQotCS8qKgotCSAqIFVzZXIgY2FuIGNoYW5nZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZCB0byBjaGVjayBzb21lIGFkZGl0aW9uYWwgCi0JICogY29uZGl0aW9ucyBoZXJlLgotCSAqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNOb2RlU3RydWN0dXJlZEFjdGl2aXR5Tm9kZV8xMDExKAotCQkJU3RydWN0dXJlZEFjdGl2aXR5Tm9kZSBlbGVtZW50KSB7Ci0JCXJldHVybiBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlXzEwMTEubWF0Y2hlcyhlbGVtZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBVc2VyIGNhbiBjaGFuZ2UgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2QgdG8gY2hlY2sgc29tZSBhZGRpdGlvbmFsIAotCSAqIGNvbmRpdGlvbnMgaGVyZS4KLQkgKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzTm9kZUFjdGl2aXR5UGFyYW1ldGVyTm9kZV8xMDEyKAotCQkJQWN0aXZpdHlQYXJhbWV0ZXJOb2RlIGVsZW1lbnQpIHsKLQkJcmV0dXJuIEFjdGl2aXR5UGFyYW1ldGVyTm9kZV8xMDEyLm1hdGNoZXMoZWxlbWVudCk7Ci0JfQotCi0JLyoqCi0JICogVXNlciBjYW4gY2hhbmdlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kIHRvIGNoZWNrIHNvbWUgYWRkaXRpb25hbCAKLQkgKiBjb25kaXRpb25zIGhlcmUuCi0JICoKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc05vZGVBY3Rpdml0eVBhcnRpdGlvbl8yMDAxKAotCQkJQWN0aXZpdHlQYXJ0aXRpb24gZWxlbWVudCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBVc2VyIGNhbiBjaGFuZ2UgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2QgdG8gaGFuZGxlIHNvbWUgc3BlY2lmaWMKLQkgKiBzaXR1YXRpb25zIG5vdCBjb3ZlcmVkIGJ5IGRlZmF1bHQgbG9naWMuCi0JICoKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgaW50IGdldFVucmVjb2duaXplZEFjdGl2aXR5RmluYWxOb2RlXzEwMDFDaGlsZE5vZGVJRCgKLQkJCUVPYmplY3QgZG9tYWluRWxlbWVudCwgU3RyaW5nIHNlbWFudGljSGludCkgewotCQlyZXR1cm4gLTE7Ci0JfQotCi0JLyoqCi0JICogVXNlciBjYW4gY2hhbmdlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kIHRvIGhhbmRsZSBzb21lIHNwZWNpZmljCi0JICogc2l0dWF0aW9ucyBub3QgY292ZXJlZCBieSBkZWZhdWx0IGxvZ2ljLgotCSAqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGludCBnZXRVbnJlY29nbml6ZWRNZXJnZU5vZGVfMTAwMkNoaWxkTm9kZUlEKAotCQkJRU9iamVjdCBkb21haW5FbGVtZW50LCBTdHJpbmcgc2VtYW50aWNIaW50KSB7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQkvKioKLQkgKiBVc2VyIGNhbiBjaGFuZ2UgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2QgdG8gaGFuZGxlIHNvbWUgc3BlY2lmaWMKLQkgKiBzaXR1YXRpb25zIG5vdCBjb3ZlcmVkIGJ5IGRlZmF1bHQgbG9naWMuCi0JICoKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgaW50IGdldFVucmVjb2duaXplZEZvcmtOb2RlXzEwMDNDaGlsZE5vZGVJRCgKLQkJCUVPYmplY3QgZG9tYWluRWxlbWVudCwgU3RyaW5nIHNlbWFudGljSGludCkgewotCQlyZXR1cm4gLTE7Ci0JfQotCi0JLyoqCi0JICogVXNlciBjYW4gY2hhbmdlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kIHRvIGhhbmRsZSBzb21lIHNwZWNpZmljCi0JICogc2l0dWF0aW9ucyBub3QgY292ZXJlZCBieSBkZWZhdWx0IGxvZ2ljLgotCSAqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGludCBnZXRVbnJlY29nbml6ZWRJbml0aWFsTm9kZV8xMDA0Q2hpbGROb2RlSUQoCi0JCQlFT2JqZWN0IGRvbWFpbkVsZW1lbnQsIFN0cmluZyBzZW1hbnRpY0hpbnQpIHsKLQkJcmV0dXJuIC0xOwotCX0KLQotCS8qKgotCSAqIFVzZXIgY2FuIGNoYW5nZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZCB0byBoYW5kbGUgc29tZSBzcGVjaWZpYwotCSAqIHNpdHVhdGlvbnMgbm90IGNvdmVyZWQgYnkgZGVmYXVsdCBsb2dpYy4KLQkgKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBpbnQgZ2V0VW5yZWNvZ25pemVkRGVjaXNpb25Ob2RlXzEwMDVDaGlsZE5vZGVJRCgKLQkJCUVPYmplY3QgZG9tYWluRWxlbWVudCwgU3RyaW5nIHNlbWFudGljSGludCkgewotCQlyZXR1cm4gLTE7Ci0JfQotCi0JLyoqCi0JICogVXNlciBjYW4gY2hhbmdlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kIHRvIGhhbmRsZSBzb21lIHNwZWNpZmljCi0JICogc2l0dWF0aW9ucyBub3QgY292ZXJlZCBieSBkZWZhdWx0IGxvZ2ljLgotCSAqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGludCBnZXRVbnJlY29nbml6ZWRKb2luTm9kZV8xMDA2Q2hpbGROb2RlSUQoCi0JCQlFT2JqZWN0IGRvbWFpbkVsZW1lbnQsIFN0cmluZyBzZW1hbnRpY0hpbnQpIHsKLQkJcmV0dXJuIC0xOwotCX0KLQotCS8qKgotCSAqIFVzZXIgY2FuIGNoYW5nZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZCB0byBoYW5kbGUgc29tZSBzcGVjaWZpYwotCSAqIHNpdHVhdGlvbnMgbm90IGNvdmVyZWQgYnkgZGVmYXVsdCBsb2dpYy4KLQkgKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBpbnQgZ2V0VW5yZWNvZ25pemVkU3RydWN0dXJlZEFjdGl2aXR5Tm9kZV8xMDA3Q2hpbGROb2RlSUQoCi0JCQlFT2JqZWN0IGRvbWFpbkVsZW1lbnQsIFN0cmluZyBzZW1hbnRpY0hpbnQpIHsKLQkJcmV0dXJuIC0xOwotCX0KLQotCS8qKgotCSAqIFVzZXIgY2FuIGNoYW5nZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZCB0byBoYW5kbGUgc29tZSBzcGVjaWZpYwotCSAqIHNpdHVhdGlvbnMgbm90IGNvdmVyZWQgYnkgZGVmYXVsdCBsb2dpYy4KLQkgKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBpbnQgZ2V0VW5yZWNvZ25pemVkQWN0aXZpdHlQYXJ0aXRpb25fMTAwOENoaWxkTm9kZUlEKAotCQkJRU9iamVjdCBkb21haW5FbGVtZW50LCBTdHJpbmcgc2VtYW50aWNIaW50KSB7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQkvKioKLQkgKiBVc2VyIGNhbiBjaGFuZ2UgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2QgdG8gaGFuZGxlIHNvbWUgc3BlY2lmaWMKLQkgKiBzaXR1YXRpb25zIG5vdCBjb3ZlcmVkIGJ5IGRlZmF1bHQgbG9naWMuCi0JICoKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgaW50IGdldFVucmVjb2duaXplZEFjdGl2aXR5UGFyYW1ldGVyTm9kZV8xMDA5Q2hpbGROb2RlSUQoCi0JCQlFT2JqZWN0IGRvbWFpbkVsZW1lbnQsIFN0cmluZyBzZW1hbnRpY0hpbnQpIHsKLQkJcmV0dXJuIC0xOwotCX0KLQotCS8qKgotCSAqIFVzZXIgY2FuIGNoYW5nZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZCB0byBoYW5kbGUgc29tZSBzcGVjaWZpYwotCSAqIHNpdHVhdGlvbnMgbm90IGNvdmVyZWQgYnkgZGVmYXVsdCBsb2dpYy4KLQkgKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBpbnQgZ2V0VW5yZWNvZ25pemVkU3RydWN0dXJlZEFjdGl2aXR5Tm9kZV8xMDEwQ2hpbGROb2RlSUQoCi0JCQlFT2JqZWN0IGRvbWFpbkVsZW1lbnQsIFN0cmluZyBzZW1hbnRpY0hpbnQpIHsKLQkJcmV0dXJuIC0xOwotCX0KLQotCS8qKgotCSAqIFVzZXIgY2FuIGNoYW5nZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZCB0byBoYW5kbGUgc29tZSBzcGVjaWZpYwotCSAqIHNpdHVhdGlvbnMgbm90IGNvdmVyZWQgYnkgZGVmYXVsdCBsb2dpYy4KLQkgKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBpbnQgZ2V0VW5yZWNvZ25pemVkU3RydWN0dXJlZEFjdGl2aXR5Tm9kZV8xMDExQ2hpbGROb2RlSUQoCi0JCQlFT2JqZWN0IGRvbWFpbkVsZW1lbnQsIFN0cmluZyBzZW1hbnRpY0hpbnQpIHsKLQkJcmV0dXJuIC0xOwotCX0KLQotCS8qKgotCSAqIFVzZXIgY2FuIGNoYW5nZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZCB0byBoYW5kbGUgc29tZSBzcGVjaWZpYwotCSAqIHNpdHVhdGlvbnMgbm90IGNvdmVyZWQgYnkgZGVmYXVsdCBsb2dpYy4KLQkgKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBpbnQgZ2V0VW5yZWNvZ25pemVkQWN0aXZpdHlQYXJhbWV0ZXJOb2RlXzEwMTJDaGlsZE5vZGVJRCgKLQkJCUVPYmplY3QgZG9tYWluRWxlbWVudCwgU3RyaW5nIHNlbWFudGljSGludCkgewotCQlyZXR1cm4gLTE7Ci0JfQotCi0JLyoqCi0JICogVXNlciBjYW4gY2hhbmdlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kIHRvIGhhbmRsZSBzb21lIHNwZWNpZmljCi0JICogc2l0dWF0aW9ucyBub3QgY292ZXJlZCBieSBkZWZhdWx0IGxvZ2ljLgotCSAqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGludCBnZXRVbnJlY29nbml6ZWRBY3Rpdml0eVBhcnRpdGlvbl8yMDAxQ2hpbGROb2RlSUQoCi0JCQlFT2JqZWN0IGRvbWFpbkVsZW1lbnQsIFN0cmluZyBzZW1hbnRpY0hpbnQpIHsKLQkJcmV0dXJuIC0xOwotCX0KLQotCS8qKgotCSAqIFVzZXIgY2FuIGNoYW5nZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZCB0byBoYW5kbGUgc29tZSBzcGVjaWZpYwotCSAqIHNpdHVhdGlvbnMgbm90IGNvdmVyZWQgYnkgZGVmYXVsdCBsb2dpYy4KLQkgKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBpbnQgZ2V0VW5yZWNvZ25pemVkQWN0aXZpdHlQYXJ0aXRpb25QYXJ0aXRpb25DYW1wYXJ0bWVudF81MDAxQ2hpbGROb2RlSUQoCi0JCQlFT2JqZWN0IGRvbWFpbkVsZW1lbnQsIFN0cmluZyBzZW1hbnRpY0hpbnQpIHsKLQkJcmV0dXJuIC0xOwotCX0KLQotCS8qKgotCSAqIFVzZXIgY2FuIGNoYW5nZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZCB0byBoYW5kbGUgc29tZSBzcGVjaWZpYwotCSAqIHNpdHVhdGlvbnMgbm90IGNvdmVyZWQgYnkgZGVmYXVsdCBsb2dpYy4KLQkgKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBpbnQgZ2V0VW5yZWNvZ25pemVkQWN0aXZpdHlQYXJ0aXRpb25QYXJ0aXRpb25DYW1wYXJ0bWVudF81MDAyQ2hpbGROb2RlSUQoCi0JCQlFT2JqZWN0IGRvbWFpbkVsZW1lbnQsIFN0cmluZyBzZW1hbnRpY0hpbnQpIHsKLQkJcmV0dXJuIC0xOwotCX0KLQotCS8qKgotCSAqIFVzZXIgY2FuIGNoYW5nZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZCB0byBoYW5kbGUgc29tZSBzcGVjaWZpYwotCSAqIHNpdHVhdGlvbnMgbm90IGNvdmVyZWQgYnkgZGVmYXVsdCBsb2dpYy4KLQkgKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBpbnQgZ2V0VW5yZWNvZ25pemVkQWN0aXZpdHlfNzlDaGlsZE5vZGVJRCgKLQkJCUVPYmplY3QgZG9tYWluRWxlbWVudCwgU3RyaW5nIHNlbWFudGljSGludCkgewotCQlyZXR1cm4gLTE7Ci0JfQotCi0JLyoqCi0JICogVXNlciBjYW4gY2hhbmdlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kIHRvIGhhbmRsZSBzb21lIHNwZWNpZmljCi0JICogc2l0dWF0aW9ucyBub3QgY292ZXJlZCBieSBkZWZhdWx0IGxvZ2ljLgotCSAqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGludCBnZXRVbnJlY29nbml6ZWRDb250cm9sRmxvd18zMDAxTGlua0xhYmVsSUQoCi0JCQlTdHJpbmcgc2VtYW50aWNIaW50KSB7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQkvKioKLQkgKiBVc2VyIGNhbiBjaGFuZ2UgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2QgdG8gaGFuZGxlIHNvbWUgc3BlY2lmaWMKLQkgKiBzaXR1YXRpb25zIG5vdCBjb3ZlcmVkIGJ5IGRlZmF1bHQgbG9naWMuCi0JICoKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgaW50IGdldFVucmVjb2duaXplZExpbmtXaXRoQ2xhc3NJRChFT2JqZWN0IGRvbWFpbkVsZW1lbnQpIHsKLQkJcmV0dXJuIC0xOwotCX0KLQotCS8qKgotCSAqIFVzZXIgY2FuIGNoYW5nZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZCB0byBjaGVjayBzb21lIGFkZGl0aW9uYWwgCi0JICogY29uZGl0aW9ucyBoZXJlLgotCSAqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNMaW5rV2l0aENsYXNzQ29udHJvbEZsb3dfMzAwMShDb250cm9sRmxvdyBlbGVtZW50KSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXRjaGVyIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVfMTAwNyA9IG5ldyBNYXRjaGVyKAotCQkJbmV3IFVNTEFic3RyYWN0RXhwcmVzc2lvbihVTUxQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkuZ2V0U3RydWN0dXJlZEFjdGl2aXR5Tm9kZSgpKSB7Ci0JCQkJcHJvdGVjdGVkIE9iamVjdCBkb0V2YWx1YXRlKE9iamVjdCBjb250ZXh0LCBNYXAgZW52KSB7Ci0JCQkJCVN0cnVjdHVyZWRBY3Rpdml0eU5vZGUgc2VsZiA9IChTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlKSBjb250ZXh0OwotCQkJCQlyZXR1cm4gSmF2YU1hdGNoZXJzLmdldFVtYVR5cGVfQWN0aXZpdHkoc2VsZik7Ci0JCQkJfQotCQkJfSk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWF0Y2hlciBBY3Rpdml0eVBhcmFtZXRlck5vZGVfMTAwOSA9IG5ldyBNYXRjaGVyKAotCQkJbmV3IFVNTEFic3RyYWN0RXhwcmVzc2lvbihVTUxQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkuZ2V0QWN0aXZpdHlQYXJhbWV0ZXJOb2RlKCkpIHsKLQkJCQlwcm90ZWN0ZWQgT2JqZWN0IGRvRXZhbHVhdGUoT2JqZWN0IGNvbnRleHQsIE1hcCBlbnYpIHsKLQkJCQkJQWN0aXZpdHlQYXJhbWV0ZXJOb2RlIHNlbGYgPSAoQWN0aXZpdHlQYXJhbWV0ZXJOb2RlKSBjb250ZXh0OwotCQkJCQlyZXR1cm4gSmF2YU1hdGNoZXJzLmdldFVtYVR5cGVfVGFza0Rlc2NyaXB0b3Ioc2VsZik7Ci0JCQkJfQotCQkJfSk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWF0Y2hlciBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlXzEwMTAgPSBuZXcgTWF0Y2hlcigKLQkJCW5ldyBVTUxBYnN0cmFjdEV4cHJlc3Npb24oVU1MUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJLmdldFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUoKSkgewotCQkJCXByb3RlY3RlZCBPYmplY3QgZG9FdmFsdWF0ZShPYmplY3QgY29udGV4dCwgTWFwIGVudikgewotCQkJCQlTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlIHNlbGYgPSAoU3RydWN0dXJlZEFjdGl2aXR5Tm9kZSkgY29udGV4dDsKLQkJCQkJcmV0dXJuIEphdmFNYXRjaGVycy5nZXRVbWFUeXBlX1BoYXNlKHNlbGYpOwotCQkJCX0KLQkJCX0pOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIE1hdGNoZXIgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZV8xMDExID0gbmV3IE1hdGNoZXIoCi0JCQluZXcgVU1MQWJzdHJhY3RFeHByZXNzaW9uKFVNTFBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCS5nZXRTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlKCkpIHsKLQkJCQlwcm90ZWN0ZWQgT2JqZWN0IGRvRXZhbHVhdGUoT2JqZWN0IGNvbnRleHQsIE1hcCBlbnYpIHsKLQkJCQkJU3RydWN0dXJlZEFjdGl2aXR5Tm9kZSBzZWxmID0gKFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUpIGNvbnRleHQ7Ci0JCQkJCXJldHVybiBKYXZhTWF0Y2hlcnMuZ2V0VW1hVHlwZV9JdGVyYXRpb24oc2VsZik7Ci0JCQkJfQotCQkJfSk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWF0Y2hlciBBY3Rpdml0eVBhcmFtZXRlck5vZGVfMTAxMiA9IG5ldyBNYXRjaGVyKAotCQkJbmV3IFVNTEFic3RyYWN0RXhwcmVzc2lvbihVTUxQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkuZ2V0QWN0aXZpdHlQYXJhbWV0ZXJOb2RlKCkpIHsKLQkJCQlwcm90ZWN0ZWQgT2JqZWN0IGRvRXZhbHVhdGUoT2JqZWN0IGNvbnRleHQsIE1hcCBlbnYpIHsKLQkJCQkJQWN0aXZpdHlQYXJhbWV0ZXJOb2RlIHNlbGYgPSAoQWN0aXZpdHlQYXJhbWV0ZXJOb2RlKSBjb250ZXh0OwotCQkJCQlyZXR1cm4gSmF2YU1hdGNoZXJzLmdldFVtYVR5cGVfTWlsZXN0b25lKHNlbGYpOwotCQkJCX0KLQkJCX0pOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAkKLQkgKi8KLQlzdGF0aWMgY2xhc3MgTWF0Y2hlciB7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQJCi0JCSAqLwotCQlwcml2YXRlIFVNTEFic3RyYWN0RXhwcmVzc2lvbiBjb25kaXRpb247Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQJCi0JCSAqLwotCQlNYXRjaGVyKFVNTEFic3RyYWN0RXhwcmVzc2lvbiBjb25kaXRpb25FeHByZXNzaW9uKSB7Ci0JCQl0aGlzLmNvbmRpdGlvbiA9IGNvbmRpdGlvbkV4cHJlc3Npb247Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAkKLQkJICovCi0JCWJvb2xlYW4gbWF0Y2hlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCQlPYmplY3QgcmVzdWx0ID0gY29uZGl0aW9uLmV2YWx1YXRlKG9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0IGluc3RhbmNlb2YgQm9vbGVhbgotCQkJCQkmJiAoKEJvb2xlYW4pIHJlc3VsdCkuYm9vbGVhblZhbHVlKCk7Ci0JCX0KLQl9Ly8gTWF0Y2hlcgotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGNsYXNzIEphdmFNYXRjaGVycyB7Ci0KLQkJLyoqCi0JCSAqIEBtb2RpZmllZAotCQkgKi8KLQkJcHJpdmF0ZSBzdGF0aWMgQm9vbGVhbiBnZXRVbWFUeXBlX0FjdGl2aXR5KFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUgc2VsZikgewotCQkJLy8gVE9ETzogaW1wbGVtZW50IHRoaXMgbWV0aG9kCi0JCQkvLyBFbnN1cmUgdGhhdCB5b3UgcmVtb3ZlIEBnZW5lcmF0ZWQgb3IgbWFyayBpdCBAZ2VuZXJhdGVkIE5PVAotCi0JCQlCb29sZWFuIGJsID0gbmV3IEJvb2xlYW4oZmFsc2UpOwotCQkJU3RyaW5nIHR5cGUgPSBCcmlkZ2VIZWxwZXIuZ2V0RUFubm90YXRpb25UeXBlKHNlbGYsCi0JCQkJCUJyaWRnZUhlbHBlci5VTUFfVFlQRSk7Ci0JCQlpZiAoQnJpZGdlSGVscGVyLlVNQV9BQ1RJVklUWS5lcXVhbHNJZ25vcmVDYXNlKHR5cGUpKSB7Ci0JCQkJcmV0dXJuIGJsLlRSVUU7Ci0JCQl9Ci0JCQlyZXR1cm4gYmw7Ci0JCQkvLwkJCXRocm93IG5ldyBVTUxBYnN0cmFjdEV4cHJlc3Npb24uTm9JbXBsRXhjZXB0aW9uKAotCQkJLy8JCQkJCSJObyB1c2VyIGphdmEgaW1wbGVtZW50YXRpb24gcHJvdmlkZWQgaW4gJ2dldFVtYVR5cGVfQWN0aXZpdHknIG9wZXJhdGlvbiIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQkvKioKLQkJICogQG1vZGlmaWVkCi0JCSAqLwotCQlwcml2YXRlIHN0YXRpYyBCb29sZWFuIGdldFVtYVR5cGVfVGFza0Rlc2NyaXB0b3IoCi0JCQkJQWN0aXZpdHlQYXJhbWV0ZXJOb2RlIHNlbGYpIHsKLQkJCS8vIFRPRE86IGltcGxlbWVudCB0aGlzIG1ldGhvZAotCQkJLy8gRW5zdXJlIHRoYXQgeW91IHJlbW92ZSBAZ2VuZXJhdGVkIG9yIG1hcmsgaXQgQGdlbmVyYXRlZCBOT1QKLQotCQkJQm9vbGVhbiBibCA9IG5ldyBCb29sZWFuKGZhbHNlKTsKLQkJCVN0cmluZyB0eXBlID0gQnJpZGdlSGVscGVyLmdldEVBbm5vdGF0aW9uVHlwZShzZWxmLAotCQkJCQlCcmlkZ2VIZWxwZXIuVU1BX1RZUEUpOwotCQkJaWYgKEJyaWRnZUhlbHBlci5VTUFfVEFTS19ERVNDUklQVE9SLmVxdWFsc0lnbm9yZUNhc2UodHlwZSkpIHsKLQkJCQlyZXR1cm4gYmwuVFJVRTsKLQkJCX0KLQkJCXJldHVybiBibDsKLQkJCS8vCQkJdGhyb3cgbmV3IFVNTEFic3RyYWN0RXhwcmVzc2lvbi5Ob0ltcGxFeGNlcHRpb24oCi0JCQkvLwkJCQkJIk5vIHVzZXIgamF2YSBpbXBsZW1lbnRhdGlvbiBwcm92aWRlZCBpbiAnZ2V0VW1hVHlwZV9UYXNrRGVzY3JpcHRvcicgb3BlcmF0aW9uIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCS8qKgotCQkgKiBAbW9kaWZpZWQKLQkJICovCi0JCXByaXZhdGUgc3RhdGljIEJvb2xlYW4gZ2V0VW1hVHlwZV9QaGFzZShTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlIHNlbGYpIHsKLQkJCS8vIFRPRE86IGltcGxlbWVudCB0aGlzIG1ldGhvZAotCQkJLy8gRW5zdXJlIHRoYXQgeW91IHJlbW92ZSBAZ2VuZXJhdGVkIG9yIG1hcmsgaXQgQGdlbmVyYXRlZCBOT1QKLQotCQkJQm9vbGVhbiBibCA9IG5ldyBCb29sZWFuKGZhbHNlKTsKLQkJCVN0cmluZyB0eXBlID0gQnJpZGdlSGVscGVyLmdldEVBbm5vdGF0aW9uVHlwZShzZWxmLAotCQkJCQlCcmlkZ2VIZWxwZXIuVU1BX1RZUEUpOwotCQkJaWYgKEJyaWRnZUhlbHBlci5VTUFfUEhBU0UuZXF1YWxzSWdub3JlQ2FzZSh0eXBlKSkgewotCQkJCXJldHVybiBibC5UUlVFOwotCQkJfQotCQkJcmV0dXJuIGJsOwotCQkJLy8JCQl0aHJvdyBuZXcgVU1MQWJzdHJhY3RFeHByZXNzaW9uLk5vSW1wbEV4Y2VwdGlvbigKLQkJCS8vCQkJCQkiTm8gdXNlciBqYXZhIGltcGxlbWVudGF0aW9uIHByb3ZpZGVkIGluICdnZXRVbWFUeXBlX1BoYXNlJyBvcGVyYXRpb24iKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJLyoqCi0JCSAqIEBtb2RpZmllZAotCQkgKi8KLQkJcHJpdmF0ZSBzdGF0aWMgQm9vbGVhbiBnZXRVbWFUeXBlX0l0ZXJhdGlvbihTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlIHNlbGYpIHsKLQkJCS8vIFRPRE86IGltcGxlbWVudCB0aGlzIG1ldGhvZAotCQkJLy8gRW5zdXJlIHRoYXQgeW91IHJlbW92ZSBAZ2VuZXJhdGVkIG9yIG1hcmsgaXQgQGdlbmVyYXRlZCBOT1QKLQkJCUJvb2xlYW4gYmwgPSBuZXcgQm9vbGVhbihmYWxzZSk7Ci0JCQlTdHJpbmcgdHlwZSA9IEJyaWRnZUhlbHBlci5nZXRFQW5ub3RhdGlvblR5cGUoc2VsZiwKLQkJCQkJQnJpZGdlSGVscGVyLlVNQV9UWVBFKTsKLQkJCWlmIChCcmlkZ2VIZWxwZXIuVU1BX0lURVJBVElPTi5lcXVhbHNJZ25vcmVDYXNlKHR5cGUpKSB7Ci0JCQkJcmV0dXJuIGJsLlRSVUU7Ci0JCQl9Ci0JCQlyZXR1cm4gYmw7Ci0JCQkvLwkJCXRocm93IG5ldyBVTUxBYnN0cmFjdEV4cHJlc3Npb24uTm9JbXBsRXhjZXB0aW9uKAotCQkJLy8JCQkJCSJObyB1c2VyIGphdmEgaW1wbGVtZW50YXRpb24gcHJvdmlkZWQgaW4gJ2dldFVtYVR5cGVfSXRlcmF0aW9uJyBvcGVyYXRpb24iKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJLyoqCi0JCSAqIEBtb2RpZmllZAotCQkgKi8KLQkJcHJpdmF0ZSBzdGF0aWMgQm9vbGVhbiBnZXRVbWFUeXBlX01pbGVzdG9uZShBY3Rpdml0eVBhcmFtZXRlck5vZGUgc2VsZikgewotCQkJLy8gVE9ETzogaW1wbGVtZW50IHRoaXMgbWV0aG9kCi0JCQkvLyBFbnN1cmUgdGhhdCB5b3UgcmVtb3ZlIEBnZW5lcmF0ZWQgb3IgbWFyayBpdCBAZ2VuZXJhdGVkIE5PVAotCi0JCQlCb29sZWFuIGJsID0gbmV3IEJvb2xlYW4oZmFsc2UpOwotCQkJU3RyaW5nIHR5cGUgPSBCcmlkZ2VIZWxwZXIuZ2V0RUFubm90YXRpb25UeXBlKHNlbGYsCi0JCQkJCUJyaWRnZUhlbHBlci5VTUFfVFlQRSk7Ci0JCQlpZiAoQnJpZGdlSGVscGVyLlVNQV9NSUxFU1RPTkUuZXF1YWxzSWdub3JlQ2FzZSh0eXBlKSkgewotCQkJCXJldHVybiBibC5UUlVFOwotCQkJfQotCQkJcmV0dXJuIGJsOwotCQkJLy8JCQl0aHJvdyBuZXcgVU1MQWJzdHJhY3RFeHByZXNzaW9uLk5vSW1wbEV4Y2VwdGlvbigKLQkJCS8vCQkJCQkiTm8gdXNlciBqYXZhIGltcGxlbWVudGF0aW9uIHByb3ZpZGVkIGluICdnZXRVbWFUeXBlX01pbGVzdG9uZScgb3BlcmF0aW9uIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0vLyBKYXZhTWF0Y2hlcnMKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9wcmVmZXJlbmNlcy9EaWFncmFtQXBwZWFyYW5jZVByZWZlcmVuY2VQYWdlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvcHJlZmVyZW5jZXMvRGlhZ3JhbUFwcGVhcmFuY2VQcmVmZXJlbmNlUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMDI0YmUxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9wcmVmZXJlbmNlcy9EaWFncmFtQXBwZWFyYW5jZVByZWZlcmVuY2VQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5wcmVmZXJlbmNlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnBhcnQuQWN0aXZpdHlEaWFncmFtRWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucHJlZmVyZW5jZXMuQXBwZWFyYW5jZVByZWZlcmVuY2VQYWdlOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERpYWdyYW1BcHBlYXJhbmNlUHJlZmVyZW5jZVBhZ2UgZXh0ZW5kcyBBcHBlYXJhbmNlUHJlZmVyZW5jZVBhZ2UgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEaWFncmFtQXBwZWFyYW5jZVByZWZlcmVuY2VQYWdlKCkgewotCQlzZXRQcmVmZXJlbmNlU3RvcmUoQWN0aXZpdHlEaWFncmFtRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkKLQkJCQkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9wcmVmZXJlbmNlcy9EaWFncmFtQ29ubmVjdGlvbnNQcmVmZXJlbmNlUGFnZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL3ByZWZlcmVuY2VzL0RpYWdyYW1Db25uZWN0aW9uc1ByZWZlcmVuY2VQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmMDkzN2YuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL3ByZWZlcmVuY2VzL0RpYWdyYW1Db25uZWN0aW9uc1ByZWZlcmVuY2VQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5wcmVmZXJlbmNlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnBhcnQuQWN0aXZpdHlEaWFncmFtRWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucHJlZmVyZW5jZXMuQ29ubmVjdGlvbnNQcmVmZXJlbmNlUGFnZTsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEaWFncmFtQ29ubmVjdGlvbnNQcmVmZXJlbmNlUGFnZSBleHRlbmRzIENvbm5lY3Rpb25zUHJlZmVyZW5jZVBhZ2UgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEaWFncmFtQ29ubmVjdGlvbnNQcmVmZXJlbmNlUGFnZSgpIHsKLQkJc2V0UHJlZmVyZW5jZVN0b3JlKEFjdGl2aXR5RGlhZ3JhbUVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpCi0JCQkJLmdldFByZWZlcmVuY2VTdG9yZSgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvcHJlZmVyZW5jZXMvRGlhZ3JhbUdlbmVyYWxQcmVmZXJlbmNlUGFnZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL3ByZWZlcmVuY2VzL0RpYWdyYW1HZW5lcmFsUHJlZmVyZW5jZVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzY5ZjJlZi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvcHJlZmVyZW5jZXMvRGlhZ3JhbUdlbmVyYWxQcmVmZXJlbmNlUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQucHJlZmVyZW5jZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5wYXJ0LkFjdGl2aXR5RGlhZ3JhbUVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnByZWZlcmVuY2VzLkRpYWdyYW1zUHJlZmVyZW5jZVBhZ2U7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRGlhZ3JhbUdlbmVyYWxQcmVmZXJlbmNlUGFnZSBleHRlbmRzIERpYWdyYW1zUHJlZmVyZW5jZVBhZ2UgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEaWFncmFtR2VuZXJhbFByZWZlcmVuY2VQYWdlKCkgewotCQlzZXRQcmVmZXJlbmNlU3RvcmUoQWN0aXZpdHlEaWFncmFtRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkKLQkJCQkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9wcmVmZXJlbmNlcy9EaWFncmFtUHJlZmVyZW5jZUluaXRpYWxpemVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvcHJlZmVyZW5jZXMvRGlhZ3JhbVByZWZlcmVuY2VJbml0aWFsaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NDI4Y2FkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9wcmVmZXJlbmNlcy9EaWFncmFtUHJlZmVyZW5jZUluaXRpYWxpemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5wcmVmZXJlbmNlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5BYnN0cmFjdFByZWZlcmVuY2VJbml0aWFsaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5wYXJ0LkFjdGl2aXR5RGlhZ3JhbUVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRGlhZ3JhbVByZWZlcmVuY2VJbml0aWFsaXplciBleHRlbmRzIEFic3RyYWN0UHJlZmVyZW5jZUluaXRpYWxpemVyIHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplRGVmYXVsdFByZWZlcmVuY2VzKCkgewotCQlJUHJlZmVyZW5jZVN0b3JlIHN0b3JlID0gZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JCURpYWdyYW1QcmludGluZ1ByZWZlcmVuY2VQYWdlLmluaXREZWZhdWx0cyhzdG9yZSk7Ci0JCURpYWdyYW1HZW5lcmFsUHJlZmVyZW5jZVBhZ2UuaW5pdERlZmF1bHRzKHN0b3JlKTsKLQkJRGlhZ3JhbUFwcGVhcmFuY2VQcmVmZXJlbmNlUGFnZS5pbml0RGVmYXVsdHMoc3RvcmUpOwotCQlEaWFncmFtQ29ubmVjdGlvbnNQcmVmZXJlbmNlUGFnZS5pbml0RGVmYXVsdHMoc3RvcmUpOwotCQlEaWFncmFtUnVsZXJzQW5kR3JpZFByZWZlcmVuY2VQYWdlLmluaXREZWZhdWx0cyhzdG9yZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJUHJlZmVyZW5jZVN0b3JlIGdldFByZWZlcmVuY2VTdG9yZSgpIHsKLQkJcmV0dXJuIEFjdGl2aXR5RGlhZ3JhbUVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFByZWZlcmVuY2VTdG9yZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9wcmVmZXJlbmNlcy9EaWFncmFtUHJpbnRpbmdQcmVmZXJlbmNlUGFnZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL3ByZWZlcmVuY2VzL0RpYWdyYW1QcmludGluZ1ByZWZlcmVuY2VQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkM2QyOWYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL3ByZWZlcmVuY2VzL0RpYWdyYW1QcmludGluZ1ByZWZlcmVuY2VQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5wcmVmZXJlbmNlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnBhcnQuQWN0aXZpdHlEaWFncmFtRWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucHJlZmVyZW5jZXMuUHJpbnRpbmdQcmVmZXJlbmNlUGFnZTsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEaWFncmFtUHJpbnRpbmdQcmVmZXJlbmNlUGFnZSBleHRlbmRzIFByaW50aW5nUHJlZmVyZW5jZVBhZ2UgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEaWFncmFtUHJpbnRpbmdQcmVmZXJlbmNlUGFnZSgpIHsKLQkJc2V0UHJlZmVyZW5jZVN0b3JlKEFjdGl2aXR5RGlhZ3JhbUVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpCi0JCQkJLmdldFByZWZlcmVuY2VTdG9yZSgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvcHJlZmVyZW5jZXMvRGlhZ3JhbVJ1bGVyc0FuZEdyaWRQcmVmZXJlbmNlUGFnZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL3ByZWZlcmVuY2VzL0RpYWdyYW1SdWxlcnNBbmRHcmlkUHJlZmVyZW5jZVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWFjNDNiZi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvcHJlZmVyZW5jZXMvRGlhZ3JhbVJ1bGVyc0FuZEdyaWRQcmVmZXJlbmNlUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQucHJlZmVyZW5jZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5wYXJ0LkFjdGl2aXR5RGlhZ3JhbUVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnByZWZlcmVuY2VzLlJ1bGVyR3JpZFByZWZlcmVuY2VQYWdlOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERpYWdyYW1SdWxlcnNBbmRHcmlkUHJlZmVyZW5jZVBhZ2UgZXh0ZW5kcyBSdWxlckdyaWRQcmVmZXJlbmNlUGFnZSB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERpYWdyYW1SdWxlcnNBbmRHcmlkUHJlZmVyZW5jZVBhZ2UoKSB7Ci0JCXNldFByZWZlcmVuY2VTdG9yZShBY3Rpdml0eURpYWdyYW1FZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKQotCQkJCS5nZXRQcmVmZXJlbmNlU3RvcmUoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL3Byb3ZpZGVycy9EaWFncmFtQ29udHJpYnV0aW9uSXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvcHJvdmlkZXJzL0RpYWdyYW1Db250cmlidXRpb25JdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTcxYTYyOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvcHJvdmlkZXJzL0RpYWdyYW1Db250cmlidXRpb25JdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQucHJvdmlkZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLmFjdGlvbi5jb250cmlidXRpb25pdGVtLkFic3RyYWN0Q29udHJpYnV0aW9uSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS51dGlsLklXb3JrYmVuY2hQYXJ0RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnByaW50aW5nLmFjdGlvbnMuUHJpbnRQcmV2aWV3QWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucHJpbnRpbmcucmVuZGVyLmFjdGlvbnMuRW5oYW5jZWRQcmludEFjdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnByaW50aW5nLnJlbmRlci5hY3Rpb25zLlJlbmRlcmVkUHJpbnRQcmV2aWV3QWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgRGlhZ3JhbUNvbnRyaWJ1dGlvbkl0ZW1Qcm92aWRlciBleHRlbmRzCi0JCUFic3RyYWN0Q29udHJpYnV0aW9uSXRlbVByb3ZpZGVyIHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUFjdGlvbiBjcmVhdGVBY3Rpb24oU3RyaW5nIGFjdGlvbklkLAotCQkJSVdvcmtiZW5jaFBhcnREZXNjcmlwdG9yIHBhcnREZXNjcmlwdG9yKSB7Ci0KLQkJaWYgKGFjdGlvbklkLmVxdWFscyhQcmludFByZXZpZXdBY3Rpb24uSUQpKSB7Ci0JCQlyZXR1cm4gbmV3IFJlbmRlcmVkUHJpbnRQcmV2aWV3QWN0aW9uKAotCQkJCQluZXcgRW5oYW5jZWRQcmludEFjdGlvbkhlbHBlcigpKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuY3JlYXRlQWN0aW9uKGFjdGlvbklkLCBwYXJ0RGVzY3JpcHRvcik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL3Byb3ZpZGVycy9FbGVtZW50SW5pdGlhbGl6ZXJzLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvcHJvdmlkZXJzL0VsZW1lbnRJbml0aWFsaXplcnMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzNkZTYxNy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvcHJvdmlkZXJzL0VsZW1lbnRJbml0aWFsaXplcnMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwOCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnByb3ZpZGVyczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRWNvcmVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmV4cHJlc3Npb25zLlVNTEFic3RyYWN0RXhwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5wYXJ0LkFjdGl2aXR5RGlhZ3JhbUVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLmJyaWRnZS5CcmlkZ2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuQWN0aXZpdHlOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkFjdGl2aXR5UGFyYW1ldGVyTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLlVNTFBhY2thZ2U7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRWxlbWVudEluaXRpYWxpemVycyB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBjbGFzcyBJbml0aWFsaXplcnMgewotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBJT2JqZWN0SW5pdGlhbGl6ZXIgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZV8xMDA3ID0gbmV3IE9iamVjdEluaXRpYWxpemVyKAotCQkJCVVNTFBhY2thZ2UuZUlOU1RBTkNFLmdldFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUoKSkgewotCQkJcHJvdGVjdGVkIHZvaWQgaW5pdCgpIHsKLQkJCQlhZGQoY3JlYXRlRXhwcmVzc2lvbkZlYXR1cmVJbml0aWFsaXplcihFY29yZVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkuZ2V0RU1vZGVsRWxlbWVudF9FQW5ub3RhdGlvbnMoKSwKLQkJCQkJCW5ldyBVTUxBYnN0cmFjdEV4cHJlc3Npb24oVU1MUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJLmdldFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUoKSkgewotCQkJCQkJCXByb3RlY3RlZCBPYmplY3QgZG9FdmFsdWF0ZShPYmplY3QgY29udGV4dCwgTWFwIGVudikgewotCQkJCQkJCQlTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlIHNlbGYgPSAoU3RydWN0dXJlZEFjdGl2aXR5Tm9kZSkgY29udGV4dDsKLQkJCQkJCQkJcmV0dXJuIEphdmEuY3JlYXRlVW1hVHlwZV9BY3Rpdml0eShzZWxmKTsKLQkJCQkJCQl9Ci0JCQkJCQl9KSk7Ci0JCQl9Ci0JCX07IC8vIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVfMTAwNyBPYmplY3RJbml0aWFsaXplcgkJCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIElPYmplY3RJbml0aWFsaXplciBBY3Rpdml0eVBhcmFtZXRlck5vZGVfMTAwOSA9IG5ldyBPYmplY3RJbml0aWFsaXplcigKLQkJCQlVTUxQYWNrYWdlLmVJTlNUQU5DRS5nZXRBY3Rpdml0eVBhcmFtZXRlck5vZGUoKSkgewotCQkJcHJvdGVjdGVkIHZvaWQgaW5pdCgpIHsKLQkJCQlhZGQoY3JlYXRlRXhwcmVzc2lvbkZlYXR1cmVJbml0aWFsaXplcihFY29yZVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkuZ2V0RU1vZGVsRWxlbWVudF9FQW5ub3RhdGlvbnMoKSwKLQkJCQkJCW5ldyBVTUxBYnN0cmFjdEV4cHJlc3Npb24oVU1MUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJLmdldEFjdGl2aXR5UGFyYW1ldGVyTm9kZSgpKSB7Ci0JCQkJCQkJcHJvdGVjdGVkIE9iamVjdCBkb0V2YWx1YXRlKE9iamVjdCBjb250ZXh0LCBNYXAgZW52KSB7Ci0JCQkJCQkJCUFjdGl2aXR5UGFyYW1ldGVyTm9kZSBzZWxmID0gKEFjdGl2aXR5UGFyYW1ldGVyTm9kZSkgY29udGV4dDsKLQkJCQkJCQkJcmV0dXJuIEphdmEuY3JlYXRlVW1hVHlwZV9UYXNrRGVzY3JpcHRvcihzZWxmKTsKLQkJCQkJCQl9Ci0JCQkJCQl9KSk7Ci0JCQl9Ci0JCX07IC8vIEFjdGl2aXR5UGFyYW1ldGVyTm9kZV8xMDA5IE9iamVjdEluaXRpYWxpemVyCQkKLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgSU9iamVjdEluaXRpYWxpemVyIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVfMTAxMCA9IG5ldyBPYmplY3RJbml0aWFsaXplcigKLQkJCQlVTUxQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlKCkpIHsKLQkJCXByb3RlY3RlZCB2b2lkIGluaXQoKSB7Ci0JCQkJYWRkKGNyZWF0ZUV4cHJlc3Npb25GZWF0dXJlSW5pdGlhbGl6ZXIoRWNvcmVQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJLmdldEVNb2RlbEVsZW1lbnRfRUFubm90YXRpb25zKCksCi0JCQkJCQluZXcgVU1MQWJzdHJhY3RFeHByZXNzaW9uKFVNTFBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCS5nZXRTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlKCkpIHsKLQkJCQkJCQlwcm90ZWN0ZWQgT2JqZWN0IGRvRXZhbHVhdGUoT2JqZWN0IGNvbnRleHQsIE1hcCBlbnYpIHsKLQkJCQkJCQkJU3RydWN0dXJlZEFjdGl2aXR5Tm9kZSBzZWxmID0gKFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUpIGNvbnRleHQ7Ci0JCQkJCQkJCXJldHVybiBKYXZhLmNyZWF0ZVVtYVR5cGVfUGhhc2Uoc2VsZik7Ci0JCQkJCQkJfQotCQkJCQkJfSkpOwotCQkJfQotCQl9OyAvLyBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlXzEwMTAgT2JqZWN0SW5pdGlhbGl6ZXIJCQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBJT2JqZWN0SW5pdGlhbGl6ZXIgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZV8xMDExID0gbmV3IE9iamVjdEluaXRpYWxpemVyKAotCQkJCVVNTFBhY2thZ2UuZUlOU1RBTkNFLmdldFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUoKSkgewotCQkJcHJvdGVjdGVkIHZvaWQgaW5pdCgpIHsKLQkJCQlhZGQoY3JlYXRlRXhwcmVzc2lvbkZlYXR1cmVJbml0aWFsaXplcihFY29yZVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkuZ2V0RU1vZGVsRWxlbWVudF9FQW5ub3RhdGlvbnMoKSwKLQkJCQkJCW5ldyBVTUxBYnN0cmFjdEV4cHJlc3Npb24oVU1MUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJLmdldFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUoKSkgewotCQkJCQkJCXByb3RlY3RlZCBPYmplY3QgZG9FdmFsdWF0ZShPYmplY3QgY29udGV4dCwgTWFwIGVudikgewotCQkJCQkJCQlTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlIHNlbGYgPSAoU3RydWN0dXJlZEFjdGl2aXR5Tm9kZSkgY29udGV4dDsKLQkJCQkJCQkJcmV0dXJuIEphdmEuY3JlYXRlVW1hVHlwZV9JdGVyYXRpb24oc2VsZik7Ci0JCQkJCQkJfQotCQkJCQkJfSkpOwotCQkJfQotCQl9OyAvLyBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlXzEwMTEgT2JqZWN0SW5pdGlhbGl6ZXIJCQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBJT2JqZWN0SW5pdGlhbGl6ZXIgQWN0aXZpdHlQYXJhbWV0ZXJOb2RlXzEwMTIgPSBuZXcgT2JqZWN0SW5pdGlhbGl6ZXIoCi0JCQkJVU1MUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QWN0aXZpdHlQYXJhbWV0ZXJOb2RlKCkpIHsKLQkJCXByb3RlY3RlZCB2b2lkIGluaXQoKSB7Ci0JCQkJYWRkKGNyZWF0ZUV4cHJlc3Npb25GZWF0dXJlSW5pdGlhbGl6ZXIoRWNvcmVQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJLmdldEVNb2RlbEVsZW1lbnRfRUFubm90YXRpb25zKCksCi0JCQkJCQluZXcgVU1MQWJzdHJhY3RFeHByZXNzaW9uKFVNTFBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCS5nZXRBY3Rpdml0eVBhcmFtZXRlck5vZGUoKSkgewotCQkJCQkJCXByb3RlY3RlZCBPYmplY3QgZG9FdmFsdWF0ZShPYmplY3QgY29udGV4dCwgTWFwIGVudikgewotCQkJCQkJCQlBY3Rpdml0eVBhcmFtZXRlck5vZGUgc2VsZiA9IChBY3Rpdml0eVBhcmFtZXRlck5vZGUpIGNvbnRleHQ7Ci0JCQkJCQkJCXJldHVybiBKYXZhLmNyZWF0ZVVtYVR5cGVfTWlsZXN0b25lKHNlbGYpOwotCQkJCQkJCX0KLQkJCQkJCX0pKTsKLQkJCX0KLQkJfTsgLy8gQWN0aXZpdHlQYXJhbWV0ZXJOb2RlXzEwMTIgT2JqZWN0SW5pdGlhbGl6ZXIKLQotCQkvKiogCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgSW5pdGlhbGl6ZXJzKCkgewotCQl9Ci0KLQkJLyoqIAotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGludGVyZmFjZSBJT2JqZWN0SW5pdGlhbGl6ZXIgewotCQkJLyoqIAotCQkJICogQGdlbmVyYXRlZAotCQkJICovCi0JCQlwdWJsaWMgdm9pZCBpbml0KEVPYmplY3QgaW5zdGFuY2UpOwotCQl9Ci0KLQkJLyoqIAotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGFic3RyYWN0IGNsYXNzIE9iamVjdEluaXRpYWxpemVyIGltcGxlbWVudHMKLQkJCQlJT2JqZWN0SW5pdGlhbGl6ZXIgewotCQkJLyoqIAotCQkJICogQGdlbmVyYXRlZAotCQkJICovCi0JCQlmaW5hbCBFQ2xhc3MgZWxlbWVudDsKLQkJCS8qKiAKLQkJCSAqIEBnZW5lcmF0ZWQKLQkJCSAqLwotCQkJcHJpdmF0ZSBMaXN0IGZlYXR1cmVJbml0aWFsaXplcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJCS8qKiAKLQkJCSAqIEBnZW5lcmF0ZWQKLQkJCSAqLwotCQkJT2JqZWN0SW5pdGlhbGl6ZXIoRUNsYXNzIGVsZW1lbnQpIHsKLQkJCQl0aGlzLmVsZW1lbnQgPSBlbGVtZW50OwotCQkJCWluaXQoKTsKLQkJCX0KLQotCQkJLyoqCi0JCQkgKiBAZ2VuZXJhdGVkCi0JCQkgKi8KLQkJCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGluaXQoKTsKLQotCQkJLyoqIAotCQkJICogQGdlbmVyYXRlZAotCQkJICovCi0JCQlwcm90ZWN0ZWQgZmluYWwgSUZlYXR1cmVJbml0aWFsaXplciBhZGQoCi0JCQkJCUlGZWF0dXJlSW5pdGlhbGl6ZXIgaW5pdGlhbGl6ZXIpIHsKLQkJCQlmZWF0dXJlSW5pdGlhbGl6ZXJzLmFkZChpbml0aWFsaXplcik7Ci0JCQkJcmV0dXJuIGluaXRpYWxpemVyOwotCQkJfQotCi0JCQkvKiogCi0JCQkgKiBAZ2VuZXJhdGVkCi0JCQkgKi8KLQkJCXB1YmxpYyB2b2lkIGluaXQoRU9iamVjdCBpbnN0YW5jZSkgewotCQkJCWZvciAoSXRlcmF0b3IgaXQgPSBmZWF0dXJlSW5pdGlhbGl6ZXJzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQkJSUZlYXR1cmVJbml0aWFsaXplciBuZXh0RXhwciA9IChJRmVhdHVyZUluaXRpYWxpemVyKSBpdAotCQkJCQkJCS5uZXh0KCk7Ci0JCQkJCXRyeSB7Ci0JCQkJCQluZXh0RXhwci5pbml0KGluc3RhbmNlKTsKLQkJCQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlBY3Rpdml0eURpYWdyYW1FZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5sb2dFcnJvcigKLQkJCQkJCQkJIkZlYXR1cmUgaW5pdGlhbGl6YXRpb24gZmFpbGVkIiwgZSk7IC8vJE5PTi1OTFMtMSQJCQkJCQkKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSAvLyBlbmQgb2YgT2JqZWN0SW5pdGlhbGl6ZXIKLQotCQkvKiogCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCWludGVyZmFjZSBJRmVhdHVyZUluaXRpYWxpemVyIHsKLQkJCS8qKgotCQkJICogQGdlbmVyYXRlZAotCQkJICovCi0JCQl2b2lkIGluaXQoRU9iamVjdCBjb250ZXh0SW5zdGFuY2UpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXN0YXRpYyBJRmVhdHVyZUluaXRpYWxpemVyIGNyZWF0ZU5ld0VsZW1lbnRGZWF0dXJlSW5pdGlhbGl6ZXIoCi0JCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGluaXRGZWF0dXJlLAotCQkJCU9iamVjdEluaXRpYWxpemVyW10gbmV3T2JqZWN0SW5pdGlhbGl6ZXJzKSB7Ci0JCQlmaW5hbCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IGluaXRGZWF0dXJlOwotCQkJZmluYWwgT2JqZWN0SW5pdGlhbGl6ZXJbXSBpbml0aWFsaXplcnMgPSBuZXdPYmplY3RJbml0aWFsaXplcnM7Ci0JCQlyZXR1cm4gbmV3IElGZWF0dXJlSW5pdGlhbGl6ZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgaW5pdChFT2JqZWN0IGNvbnRleHRJbnN0YW5jZSkgewotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGluaXRpYWxpemVycy5sZW5ndGg7IGkrKykgewotCQkJCQkJRU9iamVjdCBuZXdJbnN0YW5jZSA9IGluaXRpYWxpemVyc1tpXS5lbGVtZW50Ci0JCQkJCQkJCS5nZXRFUGFja2FnZSgpLmdldEVGYWN0b3J5SW5zdGFuY2UoKS5jcmVhdGUoCi0JCQkJCQkJCQkJaW5pdGlhbGl6ZXJzW2ldLmVsZW1lbnQpOwotCQkJCQkJaWYgKGZlYXR1cmUuaXNNYW55KCkpIHsKLQkJCQkJCQkoKENvbGxlY3Rpb24pIGNvbnRleHRJbnN0YW5jZS5lR2V0KGZlYXR1cmUpKQotCQkJCQkJCQkJLmFkZChuZXdJbnN0YW5jZSk7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCWNvbnRleHRJbnN0YW5jZS5lU2V0KGZlYXR1cmUsIG5ld0luc3RhbmNlKTsKLQkJCQkJCX0KLQkJCQkJCWluaXRpYWxpemVyc1tpXS5pbml0KG5ld0luc3RhbmNlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX07Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJc3RhdGljIElGZWF0dXJlSW5pdGlhbGl6ZXIgY3JlYXRlRXhwcmVzc2lvbkZlYXR1cmVJbml0aWFsaXplcigKLQkJCQlFU3RydWN0dXJhbEZlYXR1cmUgaW5pdEZlYXR1cmUsCi0JCQkJVU1MQWJzdHJhY3RFeHByZXNzaW9uIHZhbHVlRXhwcmVzc2lvbikgewotCQkJZmluYWwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBpbml0RmVhdHVyZTsKLQkJCWZpbmFsIFVNTEFic3RyYWN0RXhwcmVzc2lvbiBleHByZXNzaW9uID0gdmFsdWVFeHByZXNzaW9uOwotCQkJcmV0dXJuIG5ldyBJRmVhdHVyZUluaXRpYWxpemVyKCkgewotCQkJCXB1YmxpYyB2b2lkIGluaXQoRU9iamVjdCBjb250ZXh0SW5zdGFuY2UpIHsKLQkJCQkJZXhwcmVzc2lvbi5hc3NpZ25UbyhmZWF0dXJlLCBjb250ZXh0SW5zdGFuY2UpOwotCQkJCX0KLQkJCX07Ci0JCX0KLQotCQkvKiogCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXN0YXRpYyBjbGFzcyBKYXZhIHsKLQotCQkJLyoqCi0JCQkgKiBAbW9kaWZpZWQKLQkJCSAqLwotCQkJcHJpdmF0ZSBzdGF0aWMgRUxpc3Q8RUFubm90YXRpb24+IGNyZWF0ZVVtYVR5cGVfQWN0aXZpdHkoCi0JCQkJCVN0cnVjdHVyZWRBY3Rpdml0eU5vZGUgc2VsZikgewotCQkJCXJldHVybiBnZW5lcmljQ3JlYXRlVHlwZShzZWxmLCBCcmlkZ2VIZWxwZXIuVU1BX0FDVElWSVRZKTsKLQkJCX0KLQotCQkJLyoqCi0JCQkgKiBAbW9kaWZpZWQKLQkJCSAqLwotCQkJcHJpdmF0ZSBzdGF0aWMgRUxpc3Q8RUFubm90YXRpb24+IGNyZWF0ZVVtYVR5cGVfVGFza0Rlc2NyaXB0b3IoCi0JCQkJCUFjdGl2aXR5UGFyYW1ldGVyTm9kZSBzZWxmKSB7Ci0JCQkJcmV0dXJuIGdlbmVyaWNDcmVhdGVUeXBlKHNlbGYsIEJyaWRnZUhlbHBlci5VTUFfVEFTS19ERVNDUklQVE9SKTsKLQkJCX0KLQotCQkJLyoqCi0JCQkgKiBAbW9kaWZpZWQKLQkJCSAqLwotCQkJcHJpdmF0ZSBzdGF0aWMgRUxpc3Q8RUFubm90YXRpb24+IGNyZWF0ZVVtYVR5cGVfUGhhc2UoCi0JCQkJCVN0cnVjdHVyZWRBY3Rpdml0eU5vZGUgc2VsZikgewotCi0JCQkJcmV0dXJuIGdlbmVyaWNDcmVhdGVUeXBlKHNlbGYsIEJyaWRnZUhlbHBlci5VTUFfUEhBU0UpOwotCQkJfQotCi0JCQkvKioKLQkJCSAqIEBtb2RpZmllZAotCQkJICovCi0JCQlwcml2YXRlIHN0YXRpYyBFTGlzdDxFQW5ub3RhdGlvbj4gY3JlYXRlVW1hVHlwZV9JdGVyYXRpb24oCi0JCQkJCVN0cnVjdHVyZWRBY3Rpdml0eU5vZGUgc2VsZikgewotCQkJCXJldHVybiBnZW5lcmljQ3JlYXRlVHlwZShzZWxmLCBCcmlkZ2VIZWxwZXIuVU1BX0lURVJBVElPTik7Ci0JCQl9Ci0KLQkJCS8qKgotCQkJICogQG1vZGlmaWVkCi0JCQkgKi8KLQkJCXByaXZhdGUgc3RhdGljIEVMaXN0PEVBbm5vdGF0aW9uPiBjcmVhdGVVbWFUeXBlX01pbGVzdG9uZSgKLQkJCQkJQWN0aXZpdHlQYXJhbWV0ZXJOb2RlIHNlbGYpIHsKLQkJCQlyZXR1cm4gZ2VuZXJpY0NyZWF0ZVR5cGUoc2VsZiwgQnJpZGdlSGVscGVyLlVNQV9NSUxFU1RPTkUpOwotCQkJfQotCQl9IC8vSmF2YQotCX0gLy8gZW5kIG9mIEluaXRpYWxpemVycwotCQotCQotCS8qKgotCSAqIEBwYXJhbSBzZWxmCi0JICogQHBhcmFtIHR5cGUKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgRUxpc3Q8RUFubm90YXRpb24+IGdlbmVyaWNDcmVhdGVUeXBlKEFjdGl2aXR5Tm9kZSBzZWxmLCBTdHJpbmcgdHlwZSl7Ci0JCUVMaXN0PEVBbm5vdGF0aW9uPiBsaXN0ID0gQnJpZGdlSGVscGVyLmFkZEVBbm5vdGF0aW9uVHlwZShzZWxmLAl0eXBlKTsKLQkJQnJpZGdlSGVscGVyLnNldERlZmF1bHROYW1lKHNlbGYpOwotCQlyZXR1cm4gbGlzdDsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvcHJvdmlkZXJzL1VNTEFic3RyYWN0UGFyc2VyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvcHJvdmlkZXJzL1VNTEFic3RyYWN0UGFyc2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlMDY3M2QuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL3Byb3ZpZGVycy9VTUxBYnN0cmFjdFBhcnNlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQucHJvdmlkZXJzOwotCi1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci1pbXBvcnQgamF2YS50ZXh0LlBhcnNlUG9zaXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzaWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVEYXRhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUVudW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVFbnVtTGl0ZXJhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi5jb3JlLmNvbW1hbmQuSUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUuY29tbWFuZC5VbmV4ZWN1dGFibGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuSVBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLklQYXJzZXJFZGl0U3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuUGFyc2VyRWRpdFN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLmNvbW1hbmRzLlNldFZhbHVlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLlNldFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZW50QXNzaXN0UHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnBhcnQuQWN0aXZpdHlEaWFncmFtRWRpdG9yUGx1Z2luOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFVNTEFic3RyYWN0UGFyc2VyIGltcGxlbWVudHMgSVBhcnNlciB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgdmlld1BhdHRlcm47Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBNZXNzYWdlRm9ybWF0IHZpZXdQcm9jZXNzb3I7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZWRpdFBhdHRlcm47Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBNZXNzYWdlRm9ybWF0IGVkaXRQcm9jZXNzb3I7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRWaWV3UGF0dGVybigpIHsKLQkJcmV0dXJuIHZpZXdQYXR0ZXJuOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTWVzc2FnZUZvcm1hdCBnZXRWaWV3UHJvY2Vzc29yKCkgewotCQlyZXR1cm4gdmlld1Byb2Nlc3NvcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Vmlld1BhdHRlcm4oU3RyaW5nIHZpZXdQYXR0ZXJuKSB7Ci0JCXRoaXMudmlld1BhdHRlcm4gPSB2aWV3UGF0dGVybjsKLQkJdmlld1Byb2Nlc3NvciA9IGNyZWF0ZVZpZXdQcm9jZXNzb3Iodmlld1BhdHRlcm4pOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTWVzc2FnZUZvcm1hdCBjcmVhdGVWaWV3UHJvY2Vzc29yKFN0cmluZyB2aWV3UGF0dGVybikgewotCQlyZXR1cm4gbmV3IE1lc3NhZ2VGb3JtYXQodmlld1BhdHRlcm4pOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEVkaXRQYXR0ZXJuKCkgewotCQlyZXR1cm4gZWRpdFBhdHRlcm47Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBNZXNzYWdlRm9ybWF0IGdldEVkaXRQcm9jZXNzb3IoKSB7Ci0JCXJldHVybiBlZGl0UHJvY2Vzc29yOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFZGl0UGF0dGVybihTdHJpbmcgZWRpdFBhdHRlcm4pIHsKLQkJdGhpcy5lZGl0UGF0dGVybiA9IGVkaXRQYXR0ZXJuOwotCQllZGl0UHJvY2Vzc29yID0gY3JlYXRlRWRpdFByb2Nlc3NvcihlZGl0UGF0dGVybik7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBNZXNzYWdlRm9ybWF0IGNyZWF0ZUVkaXRQcm9jZXNzb3IoU3RyaW5nIGVkaXRQYXR0ZXJuKSB7Ci0JCXJldHVybiBuZXcgTWVzc2FnZUZvcm1hdChlZGl0UGF0dGVybik7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UHJpbnRTdHJpbmcoSUFkYXB0YWJsZSBhZGFwdGVyLCBpbnQgZmxhZ3MpIHsKLQkJcmV0dXJuIGdldFN0cmluZ0J5UGF0dGVybihhZGFwdGVyLCBmbGFncywgZ2V0Vmlld1BhdHRlcm4oKSwKLQkJCQlnZXRWaWV3UHJvY2Vzc29yKCkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEVkaXRTdHJpbmcoSUFkYXB0YWJsZSBhZGFwdGVyLCBpbnQgZmxhZ3MpIHsKLQkJcmV0dXJuIGdldFN0cmluZ0J5UGF0dGVybihhZGFwdGVyLCBmbGFncywgZ2V0RWRpdFBhdHRlcm4oKSwKLQkJCQlnZXRFZGl0UHJvY2Vzc29yKCkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldFN0cmluZ0J5UGF0dGVybihJQWRhcHRhYmxlIGFkYXB0ZXIsIGludCBmbGFncywKLQkJCVN0cmluZyBwYXR0ZXJuLCBNZXNzYWdlRm9ybWF0IHByb2Nlc3Nvcik7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElQYXJzZXJFZGl0U3RhdHVzIGlzVmFsaWRFZGl0U3RyaW5nKElBZGFwdGFibGUgZWxlbWVudCwKLQkJCVN0cmluZyBlZGl0U3RyaW5nKSB7Ci0JCVBhcnNlUG9zaXRpb24gcG9zID0gbmV3IFBhcnNlUG9zaXRpb24oMCk7Ci0JCU9iamVjdFtdIHZhbHVlcyA9IGdldEVkaXRQcm9jZXNzb3IoKS5wYXJzZShlZGl0U3RyaW5nLCBwb3MpOwotCQlpZiAodmFsdWVzID09IG51bGwpIHsKLQkJCXJldHVybiBuZXcgUGFyc2VyRWRpdFN0YXR1cyhBY3Rpdml0eURpYWdyYW1FZGl0b3JQbHVnaW4uSUQsCi0JCQkJCUlQYXJzZXJFZGl0U3RhdHVzLlVORURJVEFCTEUsICJJbnZhbGlkIGlucHV0IGF0ICIKLQkJCQkJCQkrIHBvcy5nZXRFcnJvckluZGV4KCkpOwotCQl9Ci0JCXJldHVybiB2YWxpZGF0ZU5ld1ZhbHVlcyh2YWx1ZXMpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSVBhcnNlckVkaXRTdGF0dXMgdmFsaWRhdGVOZXdWYWx1ZXMoT2JqZWN0W10gdmFsdWVzKSB7Ci0JCXJldHVybiBQYXJzZXJFZGl0U3RhdHVzLkVESVRBQkxFX1NUQVRVUzsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElDb21tYW5kIGdldFBhcnNlQ29tbWFuZChJQWRhcHRhYmxlIGFkYXB0ZXIsIFN0cmluZyBuZXdTdHJpbmcsCi0JCQlpbnQgZmxhZ3MpIHsKLQkJT2JqZWN0W10gdmFsdWVzID0gZ2V0RWRpdFByb2Nlc3NvcigpLnBhcnNlKG5ld1N0cmluZywKLQkJCQluZXcgUGFyc2VQb3NpdGlvbigwKSk7Ci0JCWlmICh2YWx1ZXMgPT0gbnVsbAotCQkJCXx8IHZhbGlkYXRlTmV3VmFsdWVzKHZhbHVlcykuZ2V0Q29kZSgpICE9IElQYXJzZXJFZGl0U3RhdHVzLkVESVRBQkxFKSB7Ci0JCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJfQotCQlyZXR1cm4gZ2V0UGFyc2VDb21tYW5kKGFkYXB0ZXIsIHZhbHVlcyk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCBJQ29tbWFuZCBnZXRQYXJzZUNvbW1hbmQoSUFkYXB0YWJsZSBhZGFwdGVyLAotCQkJT2JqZWN0W10gdmFsdWVzKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IgZ2V0Q29tcGxldGlvblByb2Nlc3NvcihJQWRhcHRhYmxlIGVsZW1lbnQpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJQ29tbWFuZCBnZXRNb2RpZmljYXRpb25Db21tYW5kKEVPYmplY3QgZWxlbWVudCwKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBPYmplY3QgdmFsdWUpIHsKLQkJdmFsdWUgPSBnZXRWYWxpZE5ld1ZhbHVlKGZlYXR1cmUsIHZhbHVlKTsKLQkJaWYgKHZhbHVlIGluc3RhbmNlb2YgSW52YWxpZFZhbHVlKSB7Ci0JCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJfQotCQlTZXRSZXF1ZXN0IHJlcXVlc3QgPSBuZXcgU2V0UmVxdWVzdChlbGVtZW50LCBmZWF0dXJlLCB2YWx1ZSk7Ci0JCXJldHVybiBuZXcgU2V0VmFsdWVDb21tYW5kKHJlcXVlc3QpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGdldFZhbGlkVmFsdWUoRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIE9iamVjdCB2YWx1ZSkgewotCQlFQ2xhc3NpZmllciB0eXBlID0gZmVhdHVyZS5nZXRFVHlwZSgpOwotCQlpZiAodHlwZSBpbnN0YW5jZW9mIEVEYXRhVHlwZSkgewotCQkJQ2xhc3MgaUNsYXNzID0gdHlwZS5nZXRJbnN0YW5jZUNsYXNzKCk7Ci0JCQlpZiAoU3RyaW5nLmNsYXNzLmVxdWFscyhpQ2xhc3MpKSB7Ci0JCQkJaWYgKHZhbHVlID09IG51bGwpIHsKLQkJCQkJdmFsdWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gdmFsdWU7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZ2V0VmFsaWROZXdWYWx1ZShFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgT2JqZWN0IHZhbHVlKSB7Ci0JCUVDbGFzc2lmaWVyIHR5cGUgPSBmZWF0dXJlLmdldEVUeXBlKCk7Ci0JCWlmICh0eXBlIGluc3RhbmNlb2YgRURhdGFUeXBlKSB7Ci0JCQlDbGFzcyBpQ2xhc3MgPSB0eXBlLmdldEluc3RhbmNlQ2xhc3MoKTsKLQkJCWlmIChCb29sZWFuLlRZUEUuZXF1YWxzKGlDbGFzcykpIHsKLQkJCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBCb29sZWFuKSB7Ci0JCQkJCS8vIG9rCi0JCQkJfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykgewotCQkJCQl2YWx1ZSA9IEJvb2xlYW4udmFsdWVPZigoU3RyaW5nKSB2YWx1ZSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJdmFsdWUgPSBuZXcgSW52YWxpZFZhbHVlKAotCQkJCQkJCSJWYWx1ZSBvZiB0eXBlIEJvb2xlYW4gaXMgZXhwZWN0ZWQiKTsKLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKENoYXJhY3Rlci5UWVBFLmVxdWFscyhpQ2xhc3MpKSB7Ci0JCQkJaWYgKHZhbHVlIGluc3RhbmNlb2YgQ2hhcmFjdGVyKSB7Ci0JCQkJCS8vIG9rCi0JCQkJfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykgewotCQkJCQlTdHJpbmcgcyA9IChTdHJpbmcpIHZhbHVlOwotCQkJCQlpZiAocy5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJCQl2YWx1ZSA9IG51bGw7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQl2YWx1ZSA9IG5ldyBDaGFyYWN0ZXIocy5jaGFyQXQoMCkpOwotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJdmFsdWUgPSBuZXcgSW52YWxpZFZhbHVlKAotCQkJCQkJCSJWYWx1ZSBvZiB0eXBlIENoYXJhY3RlciBpcyBleHBlY3RlZCIpOwotCQkJCX0KLQkJCX0gZWxzZSBpZiAoQnl0ZS5UWVBFLmVxdWFscyhpQ2xhc3MpKSB7Ci0JCQkJaWYgKHZhbHVlIGluc3RhbmNlb2YgQnl0ZSkgewotCQkJCQkvLyBvawotCQkJCX0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBOdW1iZXIpIHsKLQkJCQkJdmFsdWUgPSBuZXcgQnl0ZSgoKE51bWJlcikgdmFsdWUpLmJ5dGVWYWx1ZSgpKTsKLQkJCQl9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0JCQkJCVN0cmluZyBzID0gKFN0cmluZykgdmFsdWU7Ci0JCQkJCWlmIChzLmxlbmd0aCgpID09IDApIHsKLQkJCQkJCXZhbHVlID0gbnVsbDsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJdmFsdWUgPSBCeXRlLnZhbHVlT2Yocyk7Ci0JCQkJCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gbmZlKSB7Ci0JCQkJCQkJdmFsdWUgPSBuZXcgSW52YWxpZFZhbHVlKAotCQkJCQkJCQkJIlN0cmluZyB2YWx1ZSBkb2VzIG5vdCBjb252ZXJ0IHRvIEJ5dGUgdmFsdWUiKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCXZhbHVlID0gbmV3IEludmFsaWRWYWx1ZSgiVmFsdWUgb2YgdHlwZSBCeXRlIGlzIGV4cGVjdGVkIik7Ci0JCQkJfQotCQkJfSBlbHNlIGlmIChTaG9ydC5UWVBFLmVxdWFscyhpQ2xhc3MpKSB7Ci0JCQkJaWYgKHZhbHVlIGluc3RhbmNlb2YgU2hvcnQpIHsKLQkJCQkJLy8gb2sKLQkJCQl9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgTnVtYmVyKSB7Ci0JCQkJCXZhbHVlID0gbmV3IFNob3J0KCgoTnVtYmVyKSB2YWx1ZSkuc2hvcnRWYWx1ZSgpKTsKLQkJCQl9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0JCQkJCVN0cmluZyBzID0gKFN0cmluZykgdmFsdWU7Ci0JCQkJCWlmIChzLmxlbmd0aCgpID09IDApIHsKLQkJCQkJCXZhbHVlID0gbnVsbDsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJdmFsdWUgPSBTaG9ydC52YWx1ZU9mKHMpOwotCQkJCQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIG5mZSkgewotCQkJCQkJCXZhbHVlID0gbmV3IEludmFsaWRWYWx1ZSgKLQkJCQkJCQkJCSJTdHJpbmcgdmFsdWUgZG9lcyBub3QgY29udmVydCB0byBTaG9ydCB2YWx1ZSIpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJdmFsdWUgPSBuZXcgSW52YWxpZFZhbHVlKCJWYWx1ZSBvZiB0eXBlIFNob3J0IGlzIGV4cGVjdGVkIik7Ci0JCQkJfQotCQkJfSBlbHNlIGlmIChJbnRlZ2VyLlRZUEUuZXF1YWxzKGlDbGFzcykpIHsKLQkJCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBJbnRlZ2VyKSB7Ci0JCQkJCS8vIG9rCi0JCQkJfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIE51bWJlcikgewotCQkJCQl2YWx1ZSA9IG5ldyBJbnRlZ2VyKCgoTnVtYmVyKSB2YWx1ZSkuaW50VmFsdWUoKSk7Ci0JCQkJfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykgewotCQkJCQlTdHJpbmcgcyA9IChTdHJpbmcpIHZhbHVlOwotCQkJCQlpZiAocy5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJCQl2YWx1ZSA9IG51bGw7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQl0cnkgewotCQkJCQkJCXZhbHVlID0gSW50ZWdlci52YWx1ZU9mKHMpOwotCQkJCQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIG5mZSkgewotCQkJCQkJCXZhbHVlID0gbmV3IEludmFsaWRWYWx1ZSgKLQkJCQkJCQkJCSJTdHJpbmcgdmFsdWUgZG9lcyBub3QgY29udmVydCB0byBJbnRlZ2VyIHZhbHVlIik7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQl2YWx1ZSA9IG5ldyBJbnZhbGlkVmFsdWUoCi0JCQkJCQkJIlZhbHVlIG9mIHR5cGUgSW50ZWdlciBpcyBleHBlY3RlZCIpOwotCQkJCX0KLQkJCX0gZWxzZSBpZiAoTG9uZy5UWVBFLmVxdWFscyhpQ2xhc3MpKSB7Ci0JCQkJaWYgKHZhbHVlIGluc3RhbmNlb2YgTG9uZykgewotCQkJCQkvLyBvawotCQkJCX0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBOdW1iZXIpIHsKLQkJCQkJdmFsdWUgPSBuZXcgTG9uZygoKE51bWJlcikgdmFsdWUpLmxvbmdWYWx1ZSgpKTsKLQkJCQl9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0JCQkJCVN0cmluZyBzID0gKFN0cmluZykgdmFsdWU7Ci0JCQkJCWlmIChzLmxlbmd0aCgpID09IDApIHsKLQkJCQkJCXZhbHVlID0gbnVsbDsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJdmFsdWUgPSBMb25nLnZhbHVlT2Yocyk7Ci0JCQkJCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gbmZlKSB7Ci0JCQkJCQkJdmFsdWUgPSBuZXcgSW52YWxpZFZhbHVlKAotCQkJCQkJCQkJIlN0cmluZyB2YWx1ZSBkb2VzIG5vdCBjb252ZXJ0IHRvIExvbmcgdmFsdWUiKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCXZhbHVlID0gbmV3IEludmFsaWRWYWx1ZSgiVmFsdWUgb2YgdHlwZSBMb25nIGlzIGV4cGVjdGVkIik7Ci0JCQkJfQotCQkJfSBlbHNlIGlmIChGbG9hdC5UWVBFLmVxdWFscyhpQ2xhc3MpKSB7Ci0JCQkJaWYgKHZhbHVlIGluc3RhbmNlb2YgRmxvYXQpIHsKLQkJCQkJLy8gb2sKLQkJCQl9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgTnVtYmVyKSB7Ci0JCQkJCXZhbHVlID0gbmV3IEZsb2F0KCgoTnVtYmVyKSB2YWx1ZSkuZmxvYXRWYWx1ZSgpKTsKLQkJCQl9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0JCQkJCVN0cmluZyBzID0gKFN0cmluZykgdmFsdWU7Ci0JCQkJCWlmIChzLmxlbmd0aCgpID09IDApIHsKLQkJCQkJCXZhbHVlID0gbnVsbDsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJdmFsdWUgPSBGbG9hdC52YWx1ZU9mKHMpOwotCQkJCQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIG5mZSkgewotCQkJCQkJCXZhbHVlID0gbmV3IEludmFsaWRWYWx1ZSgKLQkJCQkJCQkJCSJTdHJpbmcgdmFsdWUgZG9lcyBub3QgY29udmVydCB0byBGbG9hdCB2YWx1ZSIpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJdmFsdWUgPSBuZXcgSW52YWxpZFZhbHVlKCJWYWx1ZSBvZiB0eXBlIEZsb2F0IGlzIGV4cGVjdGVkIik7Ci0JCQkJfQotCQkJfSBlbHNlIGlmIChEb3VibGUuVFlQRS5lcXVhbHMoaUNsYXNzKSkgewotCQkJCWlmICh2YWx1ZSBpbnN0YW5jZW9mIERvdWJsZSkgewotCQkJCQkvLyBvawotCQkJCX0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBOdW1iZXIpIHsKLQkJCQkJdmFsdWUgPSBuZXcgRG91YmxlKCgoTnVtYmVyKSB2YWx1ZSkuZG91YmxlVmFsdWUoKSk7Ci0JCQkJfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykgewotCQkJCQlTdHJpbmcgcyA9IChTdHJpbmcpIHZhbHVlOwotCQkJCQlpZiAocy5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJCQl2YWx1ZSA9IG51bGw7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQl0cnkgewotCQkJCQkJCXZhbHVlID0gRG91YmxlLnZhbHVlT2Yocyk7Ci0JCQkJCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gbmZlKSB7Ci0JCQkJCQkJdmFsdWUgPSBuZXcgSW52YWxpZFZhbHVlKAotCQkJCQkJCQkJIlN0cmluZyB2YWx1ZSBkb2VzIG5vdCBjb252ZXJ0IHRvIERvdWJsZSB2YWx1ZSIpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJdmFsdWUgPSBuZXcgSW52YWxpZFZhbHVlKCJWYWx1ZSBvZiB0eXBlIERvdWJsZSBpcyBleHBlY3RlZCIpOwotCQkJCX0KLQkJCX0gZWxzZSBpZiAodHlwZSBpbnN0YW5jZW9mIEVFbnVtKSB7Ci0JCQkJaWYgKHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0JCQkJCUVFbnVtTGl0ZXJhbCBsaXRlcmFsID0gKChFRW51bSkgdHlwZSkKLQkJCQkJCQkuZ2V0RUVudW1MaXRlcmFsQnlMaXRlcmFsKChTdHJpbmcpIHZhbHVlKTsKLQkJCQkJaWYgKGxpdGVyYWwgPT0gbnVsbCkgewotCQkJCQkJdmFsdWUgPSBuZXcgSW52YWxpZFZhbHVlKCJVbmtub3duIGxpdGVyYWw6ICIgKyB2YWx1ZSk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQl2YWx1ZSA9IGxpdGVyYWwuZ2V0SW5zdGFuY2UoKTsKLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCXZhbHVlID0gbmV3IEludmFsaWRWYWx1ZSgiVmFsdWUgb2YgdHlwZSBTdHJpbmcgaXMgZXhwZWN0ZWQiKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHZhbHVlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgY2xhc3MgSW52YWxpZFZhbHVlIHsKLQotCQlwcml2YXRlIFN0cmluZyBkZXNjcmlwdGlvbjsKLQotCQlwdWJsaWMgSW52YWxpZFZhbHVlKFN0cmluZyBkZXNjcmlwdGlvbikgewotCQkJdGhpcy5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiBkZXNjcmlwdGlvbjsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9wcm92aWRlcnMvVU1MQ29udHJpYnV0aW9uSXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvcHJvdmlkZXJzL1VNTENvbnRyaWJ1dGlvbkl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOGVhYmJlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9wcm92aWRlcnMvVU1MQ29udHJpYnV0aW9uSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnByb3ZpZGVyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5hY3Rpb24uY29udHJpYnV0aW9uaXRlbS5BYnN0cmFjdENvbnRyaWJ1dGlvbkl0ZW1Qcm92aWRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS51dGlsLklXb3JrYmVuY2hQYXJ0RGVzY3JpcHRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucHJpbnRpbmcuYWN0aW9ucy5QcmludFByZXZpZXdBY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnByaW50aW5nLnJlbmRlci5hY3Rpb25zLkVuaGFuY2VkUHJpbnRBY3Rpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wcmludGluZy5yZW5kZXIuYWN0aW9ucy5SZW5kZXJlZFByaW50UHJldmlld0FjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFVNTENvbnRyaWJ1dGlvbkl0ZW1Qcm92aWRlciBleHRlbmRzCi0JCUFic3RyYWN0Q29udHJpYnV0aW9uSXRlbVByb3ZpZGVyIHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUFjdGlvbiBjcmVhdGVBY3Rpb24oU3RyaW5nIGFjdGlvbklkLAotCQkJSVdvcmtiZW5jaFBhcnREZXNjcmlwdG9yIHBhcnREZXNjcmlwdG9yKSB7Ci0JCWlmIChhY3Rpb25JZC5lcXVhbHMoUHJpbnRQcmV2aWV3QWN0aW9uLklEKSkgewotCQkJcmV0dXJuIG5ldyBSZW5kZXJlZFByaW50UHJldmlld0FjdGlvbigKLQkJCQkJbmV3IEVuaGFuY2VkUHJpbnRBY3Rpb25IZWxwZXIoKSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmNyZWF0ZUFjdGlvbihhY3Rpb25JZCwgcGFydERlc2NyaXB0b3IpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL3Byb3ZpZGVycy9VTUxFZGl0UGFydFByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvcHJvdmlkZXJzL1VNTEVkaXRQYXJ0UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGUwZDBjMS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvcHJvdmlkZXJzL1VNTEVkaXRQYXJ0UHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnByb3ZpZGVyczsKLQotaW1wb3J0IGphdmEubGFuZy5yZWYuV2Vha1JlZmVyZW5jZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi5jb3JlLnNlcnZpY2UuSU9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JR3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5zZXJ2aWNlcy5lZGl0cGFydC5BYnN0cmFjdEVkaXRQYXJ0UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5zZXJ2aWNlcy5lZGl0cGFydC5DcmVhdGVHcmFwaGljRWRpdFBhcnRPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5zZXJ2aWNlcy5lZGl0cGFydC5JRWRpdFBhcnRPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLlVNTEVkaXRQYXJ0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLkFjdGl2aXR5RWRpdFBhcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5wYXJ0LlVNTFZpc3VhbElEUmVnaXN0cnk7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgVU1MRWRpdFBhcnRQcm92aWRlciBleHRlbmRzIEFic3RyYWN0RWRpdFBhcnRQcm92aWRlciB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFZGl0UGFydEZhY3RvcnkgZmFjdG9yeTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gYWxsb3dDYWNoaW5nOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgV2Vha1JlZmVyZW5jZSBjYWNoZWRQYXJ0OwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgV2Vha1JlZmVyZW5jZSBjYWNoZWRWaWV3OwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBVTUxFZGl0UGFydFByb3ZpZGVyKCkgewotCQlzZXRGYWN0b3J5KG5ldyBVTUxFZGl0UGFydEZhY3RvcnkoKSk7Ci0JCXNldEFsbG93Q2FjaGluZyh0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGZpbmFsIEVkaXRQYXJ0RmFjdG9yeSBnZXRGYWN0b3J5KCkgewotCQlyZXR1cm4gZmFjdG9yeTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0RmFjdG9yeShFZGl0UGFydEZhY3RvcnkgZmFjdG9yeSkgewotCQl0aGlzLmZhY3RvcnkgPSBmYWN0b3J5OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBpc0FsbG93Q2FjaGluZygpIHsKLQkJcmV0dXJuIGFsbG93Q2FjaGluZzsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHN5bmNocm9uaXplZCB2b2lkIHNldEFsbG93Q2FjaGluZyhib29sZWFuIGFsbG93Q2FjaGluZykgewotCQl0aGlzLmFsbG93Q2FjaGluZyA9IGFsbG93Q2FjaGluZzsKLQkJaWYgKCFhbGxvd0NhY2hpbmcpIHsKLQkJCWNhY2hlZFBhcnQgPSBudWxsOwotCQkJY2FjaGVkVmlldyA9IG51bGw7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElHcmFwaGljYWxFZGl0UGFydCBjcmVhdGVFZGl0UGFydChWaWV3IHZpZXcpIHsKLQkJRWRpdFBhcnQgcGFydCA9IGZhY3RvcnkuY3JlYXRlRWRpdFBhcnQobnVsbCwgdmlldyk7Ci0JCWlmIChwYXJ0IGluc3RhbmNlb2YgSUdyYXBoaWNhbEVkaXRQYXJ0KSB7Ci0JCQlyZXR1cm4gKElHcmFwaGljYWxFZGl0UGFydCkgcGFydDsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElHcmFwaGljYWxFZGl0UGFydCBnZXRDYWNoZWRQYXJ0KFZpZXcgdmlldykgewotCQlpZiAoY2FjaGVkVmlldyAhPSBudWxsICYmIGNhY2hlZFZpZXcuZ2V0KCkgPT0gdmlldykgewotCQkJcmV0dXJuIChJR3JhcGhpY2FsRWRpdFBhcnQpIGNhY2hlZFBhcnQuZ2V0KCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgSUdyYXBoaWNhbEVkaXRQYXJ0IGNyZWF0ZUdyYXBoaWNFZGl0UGFydChWaWV3IHZpZXcpIHsKLQkJaWYgKGlzQWxsb3dDYWNoaW5nKCkpIHsKLQkJCUlHcmFwaGljYWxFZGl0UGFydCBwYXJ0ID0gZ2V0Q2FjaGVkUGFydCh2aWV3KTsKLQkJCWNhY2hlZFBhcnQgPSBudWxsOwotCQkJY2FjaGVkVmlldyA9IG51bGw7Ci0JCQlpZiAocGFydCAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIHBhcnQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGNyZWF0ZUVkaXRQYXJ0KHZpZXcpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gcHJvdmlkZXMoSU9wZXJhdGlvbiBvcGVyYXRpb24pIHsKLQkJaWYgKG9wZXJhdGlvbiBpbnN0YW5jZW9mIENyZWF0ZUdyYXBoaWNFZGl0UGFydE9wZXJhdGlvbikgewotCQkJVmlldyB2aWV3ID0gKChJRWRpdFBhcnRPcGVyYXRpb24pIG9wZXJhdGlvbikuZ2V0VmlldygpOwotCQkJaWYgKCFBY3Rpdml0eUVkaXRQYXJ0Lk1PREVMX0lELmVxdWFscyhVTUxWaXN1YWxJRFJlZ2lzdHJ5Ci0JCQkJCS5nZXRNb2RlbElEKHZpZXcpKSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCWlmIChpc0FsbG93Q2FjaGluZygpICYmIGdldENhY2hlZFBhcnQodmlldykgIT0gbnVsbCkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQkJSUdyYXBoaWNhbEVkaXRQYXJ0IHBhcnQgPSBjcmVhdGVFZGl0UGFydCh2aWV3KTsKLQkJCWlmIChwYXJ0ICE9IG51bGwpIHsKLQkJCQlpZiAoaXNBbGxvd0NhY2hpbmcoKSkgewotCQkJCQljYWNoZWRQYXJ0ID0gbmV3IFdlYWtSZWZlcmVuY2UocGFydCk7Ci0JCQkJCWNhY2hlZFZpZXcgPSBuZXcgV2Vha1JlZmVyZW5jZSh2aWV3KTsKLQkJCQl9Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvcHJvdmlkZXJzL1VNTEVsZW1lbnRUeXBlcy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL3Byb3ZpZGVycy9VTUxFbGVtZW50VHlwZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTU0YmExYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvcHJvdmlkZXJzL1VNTEVsZW1lbnRUeXBlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQucHJvdmlkZXJzOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLklkZW50aXR5SGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzaWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVOYW1lZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRWNvcmVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmV4cHJlc3Npb25zLlVNTEFic3RyYWN0RXhwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5wYXJ0LkFjdGl2aXR5RGlhZ3JhbUVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLmJyaWRnZS5CcmlkZ2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLmljb24uSWNvblNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5nZW9zaGFwZXMuaW50ZXJuYWwucHJvdmlkZXJzLkdlb1NoYXBlSWNvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZ2Vvc2hhcGVzLmludGVybmFsLnByb3ZpZGVycy5HZW9zaGFwZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnV0aWwuSU5vdGF0aW9uVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLkVsZW1lbnRUeXBlUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5JRWxlbWVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkFjdGl2aXR5Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eVBhcmFtZXRlck5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5VTUxQYWNrYWdlOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFVNTEVsZW1lbnRUeXBlcyBleHRlbmRzIEVsZW1lbnRJbml0aWFsaXplcnMgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgVU1MRWxlbWVudFR5cGVzKCkgewotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBNYXAgZWxlbWVudHM7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgSW1hZ2VSZWdpc3RyeSBpbWFnZVJlZ2lzdHJ5OwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIEltYWdlUmVnaXN0cnkgZ2V0SW1hZ2VSZWdpc3RyeSgpIHsKLQkJaWYgKGltYWdlUmVnaXN0cnkgPT0gbnVsbCkgewotCQkJaW1hZ2VSZWdpc3RyeSA9IG5ldyBJbWFnZVJlZ2lzdHJ5KCk7Ci0JCX0KLQkJcmV0dXJuIGltYWdlUmVnaXN0cnk7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIEdlb1NoYXBlSWNvblByb3ZpZGVyIGdlb1NoYXBlSWNvblByb3ZpZGVyID0gbnVsbDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0SW1hZ2VSZWdpc3RyeUtleShFTmFtZWRFbGVtZW50IGVsZW1lbnQpIHsKLQkJcmV0dXJuIGVsZW1lbnQuZ2V0TmFtZSgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBJbWFnZURlc2NyaXB0b3IgZ2V0UHJvdmlkZWRJbWFnZURlc2NyaXB0b3IoCi0JCQlFTmFtZWRFbGVtZW50IGVsZW1lbnQpIHsKLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBFU3RydWN0dXJhbEZlYXR1cmUpIHsKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gKChFU3RydWN0dXJhbEZlYXR1cmUpIGVsZW1lbnQpOwotCQkJRUNsYXNzIGVDb250YWluaW5nQ2xhc3MgPSBmZWF0dXJlLmdldEVDb250YWluaW5nQ2xhc3MoKTsKLQkJCUVDbGFzc2lmaWVyIGVUeXBlID0gZmVhdHVyZS5nZXRFVHlwZSgpOwotCQkJaWYgKGVDb250YWluaW5nQ2xhc3MgIT0gbnVsbCAmJiAhZUNvbnRhaW5pbmdDbGFzcy5pc0Fic3RyYWN0KCkpIHsKLQkJCQllbGVtZW50ID0gZUNvbnRhaW5pbmdDbGFzczsKLQkJCX0gZWxzZSBpZiAoZVR5cGUgaW5zdGFuY2VvZiBFQ2xhc3MKLQkJCQkJJiYgISgoRUNsYXNzKSBlVHlwZSkuaXNBYnN0cmFjdCgpKSB7Ci0JCQkJZWxlbWVudCA9IGVUeXBlOwotCQkJfQotCQl9Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgRUNsYXNzKSB7Ci0JCQlFQ2xhc3MgZUNsYXNzID0gKEVDbGFzcykgZWxlbWVudDsKLQkJCWlmICghZUNsYXNzLmlzQWJzdHJhY3QoKSkgewotCQkJCXJldHVybiBBY3Rpdml0eURpYWdyYW1FZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKQotCQkJCQkJLmdldEl0ZW1JbWFnZURlc2NyaXB0b3IoCi0JCQkJCQkJCWVDbGFzcy5nZXRFUGFja2FnZSgpLmdldEVGYWN0b3J5SW5zdGFuY2UoKQotCQkJCQkJCQkJCS5jcmVhdGUoZUNsYXNzKSk7Ci0JCQl9Ci0JCX0KLQkJLy8gVE9ETyA6IHN1cHBvcnQgc3RydWN0dXJhbCBmZWF0dXJlcwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBJbWFnZURlc2NyaXB0b3IgZ2V0SW1hZ2VEZXNjcmlwdG9yKEVOYW1lZEVsZW1lbnQgZWxlbWVudCkgewotCQlTdHJpbmcga2V5ID0gZ2V0SW1hZ2VSZWdpc3RyeUtleShlbGVtZW50KTsKLQkJSW1hZ2VEZXNjcmlwdG9yIGltYWdlRGVzY3JpcHRvciA9IGdldEltYWdlUmVnaXN0cnkoKS5nZXREZXNjcmlwdG9yKGtleSk7Ci0JCWlmIChpbWFnZURlc2NyaXB0b3IgPT0gbnVsbCkgewotCQkJaW1hZ2VEZXNjcmlwdG9yID0gZ2V0UHJvdmlkZWRJbWFnZURlc2NyaXB0b3IoZWxlbWVudCk7Ci0JCQlpZiAoaW1hZ2VEZXNjcmlwdG9yID09IG51bGwpIHsKLQkJCQlpbWFnZURlc2NyaXB0b3IgPSBJbWFnZURlc2NyaXB0b3IuZ2V0TWlzc2luZ0ltYWdlRGVzY3JpcHRvcigpOwotCQkJfQotCQkJZ2V0SW1hZ2VSZWdpc3RyeSgpLnB1dChrZXksIGltYWdlRGVzY3JpcHRvcik7Ci0JCX0KLQkJcmV0dXJuIGltYWdlRGVzY3JpcHRvcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBJbWFnZSBnZXRJbWFnZShFTmFtZWRFbGVtZW50IGVsZW1lbnQpIHsKLQkJU3RyaW5nIGtleSA9IGdldEltYWdlUmVnaXN0cnlLZXkoZWxlbWVudCk7Ci0JCUltYWdlIGltYWdlID0gZ2V0SW1hZ2VSZWdpc3RyeSgpLmdldChrZXkpOwotCQlpZiAoaW1hZ2UgPT0gbnVsbCkgewotCQkJSW1hZ2VEZXNjcmlwdG9yIGltYWdlRGVzY3JpcHRvciA9IGdldFByb3ZpZGVkSW1hZ2VEZXNjcmlwdG9yKGVsZW1lbnQpOwotCQkJaWYgKGltYWdlRGVzY3JpcHRvciA9PSBudWxsKSB7Ci0JCQkJaW1hZ2VEZXNjcmlwdG9yID0gSW1hZ2VEZXNjcmlwdG9yLmdldE1pc3NpbmdJbWFnZURlc2NyaXB0b3IoKTsKLQkJCX0KLQkJCWdldEltYWdlUmVnaXN0cnkoKS5wdXQoa2V5LCBpbWFnZURlc2NyaXB0b3IpOwotCQkJaW1hZ2UgPSBnZXRJbWFnZVJlZ2lzdHJ5KCkuZ2V0KGtleSk7Ci0JCX0KLQkJcmV0dXJuIGltYWdlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEltYWdlRGVzY3JpcHRvciBnZXRJbWFnZURlc2NyaXB0b3IoSUFkYXB0YWJsZSBoaW50KSB7Ci0JCUVOYW1lZEVsZW1lbnQgZWxlbWVudCA9IGdldEVsZW1lbnQoaGludCk7Ci0JCWlmIChlbGVtZW50ID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiBnZXRJbWFnZURlc2NyaXB0b3IoZWxlbWVudCk7Ci0JfQotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHVibGljIHN0YXRpYyBJbWFnZSBnZXRJbWFnZShJQWRhcHRhYmxlIGhpbnQpIHsKLQkJaWYoaXNHZW9TaGFwZShoaW50KSl7Ci0JCQlyZXR1cm4gZ2V0R2VvU2hhcGVJY29uUHJvdmlkZXIoKS5nZXRJY29uKCgoSU5vdGF0aW9uVHlwZSloaW50KS5nZXRTZW1hbnRpY0hpbnQoKSk7Ci0JCX0KLQkJRU5hbWVkRWxlbWVudCBlbGVtZW50ID0gZ2V0RWxlbWVudChoaW50KTsKLQkJaWYgKGVsZW1lbnQgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJLy8gbW9kaWZpZWQgU1RBUlQKLQkJT2JqZWN0IHR5cGUgPSBoaW50LmdldEFkYXB0ZXIoSUVsZW1lbnRUeXBlLmNsYXNzKTsKLQkJaWYgKHR5cGUgIT0gbnVsbCkgewotCQkJSW1hZ2UgaW1hZ2UgPSBnZXRJbWFnZShlbGVtZW50LCAoSUVsZW1lbnRUeXBlKSB0eXBlKTsKLQkJCWlmIChpbWFnZSAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIGltYWdlOwotCQkJfQotCQl9Ci0JCS8vIG1vZGlmaWVkIEVORAotCQlyZXR1cm4gZ2V0SW1hZ2UoZWxlbWVudCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyAndHlwZScgb2YgdGhlIGVjb3JlIG9iamVjdCBhc3NvY2lhdGVkIHdpdGggdGhlIGhpbnQuCi0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgRU5hbWVkRWxlbWVudCBnZXRFbGVtZW50KElBZGFwdGFibGUgaGludCkgewotCQlPYmplY3QgdHlwZSA9IGhpbnQuZ2V0QWRhcHRlcihJRWxlbWVudFR5cGUuY2xhc3MpOwotCQlpZiAoZWxlbWVudHMgPT0gbnVsbCkgewotCQkJZWxlbWVudHMgPSBuZXcgSWRlbnRpdHlIYXNoTWFwKCk7Ci0KLQkJCWVsZW1lbnRzLnB1dChBY3Rpdml0eV83OSwgVU1MUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QWN0aXZpdHkoKSk7Ci0KLQkJCWVsZW1lbnRzLnB1dChBY3Rpdml0eUZpbmFsTm9kZV8xMDAxLCBVTUxQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkuZ2V0QWN0aXZpdHlGaW5hbE5vZGUoKSk7Ci0KLQkJCWVsZW1lbnRzLnB1dChNZXJnZU5vZGVfMTAwMiwgVU1MUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWVyZ2VOb2RlKCkpOwotCi0JCQllbGVtZW50cy5wdXQoRm9ya05vZGVfMTAwMywgVU1MUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9ya05vZGUoKSk7Ci0KLQkJCWVsZW1lbnRzLnB1dChJbml0aWFsTm9kZV8xMDA0LCBVTUxQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkuZ2V0SW5pdGlhbE5vZGUoKSk7Ci0KLQkJCWVsZW1lbnRzLnB1dChEZWNpc2lvbk5vZGVfMTAwNSwgVU1MUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJLmdldERlY2lzaW9uTm9kZSgpKTsKLQotCQkJZWxlbWVudHMucHV0KEpvaW5Ob2RlXzEwMDYsIFVNTFBhY2thZ2UuZUlOU1RBTkNFLmdldEpvaW5Ob2RlKCkpOwotCi0JCQllbGVtZW50cy5wdXQoU3RydWN0dXJlZEFjdGl2aXR5Tm9kZV8xMDA3LCBVTUxQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkuZ2V0U3RydWN0dXJlZEFjdGl2aXR5Tm9kZSgpKTsKLQotCQkJZWxlbWVudHMucHV0KEFjdGl2aXR5UGFydGl0aW9uXzEwMDgsIFVNTFBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCS5nZXRBY3Rpdml0eVBhcnRpdGlvbigpKTsKLQotCQkJZWxlbWVudHMucHV0KEFjdGl2aXR5UGFyYW1ldGVyTm9kZV8xMDA5LCBVTUxQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkuZ2V0QWN0aXZpdHlQYXJhbWV0ZXJOb2RlKCkpOwotCi0JCQllbGVtZW50cy5wdXQoU3RydWN0dXJlZEFjdGl2aXR5Tm9kZV8xMDEwLCBVTUxQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkuZ2V0U3RydWN0dXJlZEFjdGl2aXR5Tm9kZSgpKTsKLQotCQkJZWxlbWVudHMucHV0KFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVfMTAxMSwgVU1MUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJLmdldFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUoKSk7Ci0KLQkJCWVsZW1lbnRzLnB1dChBY3Rpdml0eVBhcmFtZXRlck5vZGVfMTAxMiwgVU1MUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJLmdldEFjdGl2aXR5UGFyYW1ldGVyTm9kZSgpKTsKLQotCQkJZWxlbWVudHMucHV0KEFjdGl2aXR5UGFydGl0aW9uXzIwMDEsIFVNTFBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCS5nZXRBY3Rpdml0eVBhcnRpdGlvbigpKTsKLQotCQkJZWxlbWVudHMucHV0KENvbnRyb2xGbG93XzMwMDEsIFVNTFBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCS5nZXRDb250cm9sRmxvdygpKTsKLQkJfQotCQlyZXR1cm4gKEVOYW1lZEVsZW1lbnQpIGVsZW1lbnRzLmdldCh0eXBlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJRWxlbWVudFR5cGUgQWN0aXZpdHlfNzkgPSBnZXRFbGVtZW50VHlwZSgib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuQWN0aXZpdHlfNzkiKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSUVsZW1lbnRUeXBlIEFjdGl2aXR5UGFydGl0aW9uXzIwMDEgPSBnZXRFbGVtZW50VHlwZSgib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuQWN0aXZpdHlQYXJ0aXRpb25fMjAwMSIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJRWxlbWVudFR5cGUgQWN0aXZpdHlGaW5hbE5vZGVfMTAwMSA9IGdldEVsZW1lbnRUeXBlKCJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5BY3Rpdml0eUZpbmFsTm9kZV8xMDAxIik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIElFbGVtZW50VHlwZSBNZXJnZU5vZGVfMTAwMiA9IGdldEVsZW1lbnRUeXBlKCJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5NZXJnZU5vZGVfMTAwMiIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJRWxlbWVudFR5cGUgRm9ya05vZGVfMTAwMyA9IGdldEVsZW1lbnRUeXBlKCJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5Gb3JrTm9kZV8xMDAzIik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIElFbGVtZW50VHlwZSBJbml0aWFsTm9kZV8xMDA0ID0gZ2V0RWxlbWVudFR5cGUoIm9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLkluaXRpYWxOb2RlXzEwMDQiKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSUVsZW1lbnRUeXBlIERlY2lzaW9uTm9kZV8xMDA1ID0gZ2V0RWxlbWVudFR5cGUoIm9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLkRlY2lzaW9uTm9kZV8xMDA1Iik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIElFbGVtZW50VHlwZSBKb2luTm9kZV8xMDA2ID0gZ2V0RWxlbWVudFR5cGUoIm9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLkpvaW5Ob2RlXzEwMDYiKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSUVsZW1lbnRUeXBlIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVfMTAwNyA9IGdldEVsZW1lbnRUeXBlKCJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlXzEwMDciKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSUVsZW1lbnRUeXBlIEFjdGl2aXR5UGFydGl0aW9uXzEwMDggPSBnZXRFbGVtZW50VHlwZSgib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuQWN0aXZpdHlQYXJ0aXRpb25fMTAwOCIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJRWxlbWVudFR5cGUgQWN0aXZpdHlQYXJhbWV0ZXJOb2RlXzEwMDkgPSBnZXRFbGVtZW50VHlwZSgib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuQWN0aXZpdHlQYXJhbWV0ZXJOb2RlXzEwMDkiKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSUVsZW1lbnRUeXBlIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVfMTAxMCA9IGdldEVsZW1lbnRUeXBlKCJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlXzEwMTAiKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSUVsZW1lbnRUeXBlIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVfMTAxMSA9IGdldEVsZW1lbnRUeXBlKCJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlXzEwMTEiKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSUVsZW1lbnRUeXBlIEFjdGl2aXR5UGFyYW1ldGVyTm9kZV8xMDEyID0gZ2V0RWxlbWVudFR5cGUoIm9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLkFjdGl2aXR5UGFyYW1ldGVyTm9kZV8xMDEyIik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIElFbGVtZW50VHlwZSBDb250cm9sRmxvd18zMDAxID0gZ2V0RWxlbWVudFR5cGUoIm9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLkNvbnRyb2xGbG93XzMwMDEiKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIElFbGVtZW50VHlwZSBnZXRFbGVtZW50VHlwZShTdHJpbmcgaWQpIHsKLQkJcmV0dXJuIEVsZW1lbnRUeXBlUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXRUeXBlKGlkKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgU2V0IEtOT1dOX0VMRU1FTlRfVFlQRVM7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzS25vd25FbGVtZW50VHlwZShJRWxlbWVudFR5cGUgZWxlbWVudFR5cGUpIHsKLQkJaWYgKEtOT1dOX0VMRU1FTlRfVFlQRVMgPT0gbnVsbCkgewotCQkJS05PV05fRUxFTUVOVF9UWVBFUyA9IG5ldyBIYXNoU2V0KCk7Ci0JCQlLTk9XTl9FTEVNRU5UX1RZUEVTLmFkZChBY3Rpdml0eV83OSk7Ci0JCQlLTk9XTl9FTEVNRU5UX1RZUEVTLmFkZChBY3Rpdml0eUZpbmFsTm9kZV8xMDAxKTsKLQkJCUtOT1dOX0VMRU1FTlRfVFlQRVMuYWRkKE1lcmdlTm9kZV8xMDAyKTsKLQkJCUtOT1dOX0VMRU1FTlRfVFlQRVMuYWRkKEZvcmtOb2RlXzEwMDMpOwotCQkJS05PV05fRUxFTUVOVF9UWVBFUy5hZGQoSW5pdGlhbE5vZGVfMTAwNCk7Ci0JCQlLTk9XTl9FTEVNRU5UX1RZUEVTLmFkZChEZWNpc2lvbk5vZGVfMTAwNSk7Ci0JCQlLTk9XTl9FTEVNRU5UX1RZUEVTLmFkZChKb2luTm9kZV8xMDA2KTsKLQkJCUtOT1dOX0VMRU1FTlRfVFlQRVMuYWRkKFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVfMTAwNyk7Ci0JCQlLTk9XTl9FTEVNRU5UX1RZUEVTLmFkZChBY3Rpdml0eVBhcnRpdGlvbl8xMDA4KTsKLQkJCUtOT1dOX0VMRU1FTlRfVFlQRVMuYWRkKEFjdGl2aXR5UGFyYW1ldGVyTm9kZV8xMDA5KTsKLQkJCUtOT1dOX0VMRU1FTlRfVFlQRVMuYWRkKFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVfMTAxMCk7Ci0JCQlLTk9XTl9FTEVNRU5UX1RZUEVTLmFkZChTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlXzEwMTEpOwotCQkJS05PV05fRUxFTUVOVF9UWVBFUy5hZGQoQWN0aXZpdHlQYXJhbWV0ZXJOb2RlXzEwMTIpOwotCQkJS05PV05fRUxFTUVOVF9UWVBFUy5hZGQoQWN0aXZpdHlQYXJ0aXRpb25fMjAwMSk7Ci0JCQlLTk9XTl9FTEVNRU5UX1RZUEVTLmFkZChDb250cm9sRmxvd18zMDAxKTsKLQkJfQotCQlyZXR1cm4gS05PV05fRUxFTUVOVF9UWVBFUy5jb250YWlucyhlbGVtZW50VHlwZSk7Ci0JfQotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHVibGljIHN0YXRpYyBJbWFnZSBnZXRJbWFnZShFTmFtZWRFbGVtZW50IGVsZW1lbnQsIElFbGVtZW50VHlwZSB0eXBlKSB7Ci0JCVN0cmluZyBrZXkgPSB0eXBlLmdldElkKCk7Ci0JCUltYWdlIGltYWdlID0gZ2V0SW1hZ2VSZWdpc3RyeSgpLmdldChrZXkpOwotCi0JCWlmIChpbWFnZSA9PSBudWxsKSB7Ci0JCQlJbWFnZURlc2NyaXB0b3IgaW1hZ2VEZXNjcmlwdG9yID0gbnVsbDsKLQkJCWlmIChrZXkuZXF1YWxzKFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVfMTAwNy5nZXRJZCgpKSkgewotCQkJCWltYWdlRGVzY3JpcHRvciA9IEFjdGl2aXR5RGlhZ3JhbUVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpCi0JCQkJCQkuZ2V0SW1hZ2VEZXNjcmlwdG9yKCJmdWxsL29iajE2L0FjdGl2aXR5LmdpZiIpOyAvLyROT04tTkxTLTEkCi0JCQl9IGVsc2UgaWYgKGtleS5lcXVhbHMoU3RydWN0dXJlZEFjdGl2aXR5Tm9kZV8xMDEwLmdldElkKCkpKSB7Ci0JCQkJaW1hZ2VEZXNjcmlwdG9yID0gQWN0aXZpdHlEaWFncmFtRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkKLQkJCQkJCS5nZXRJbWFnZURlc2NyaXB0b3IoImZ1bGwvb2JqMTYvUGhhc2UuZ2lmIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0gZWxzZSBpZiAoa2V5LmVxdWFscyhTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlXzEwMTEuZ2V0SWQoKSkpIHsKLQkJCQlpbWFnZURlc2NyaXB0b3IgPSBBY3Rpdml0eURpYWdyYW1FZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKQotCQkJCQkJLmdldEltYWdlRGVzY3JpcHRvcigiZnVsbC9vYmoxNi9JdGVyYXRpb24uZ2lmIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0gZWxzZSBpZiAoa2V5LmVxdWFscyhBY3Rpdml0eVBhcmFtZXRlck5vZGVfMTAxMi5nZXRJZCgpKSkgewotCQkJCWltYWdlRGVzY3JpcHRvciA9IEFjdGl2aXR5RGlhZ3JhbUVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpCi0JCQkJCQkuZ2V0SW1hZ2VEZXNjcmlwdG9yKCJmdWxsL29iajE2L01pbGVzdG9uZS5naWYiKTsgLy8kTk9OLU5MUy0xJAotCQkJfSBlbHNlIGlmIChrZXkuZXF1YWxzKEFjdGl2aXR5UGFyYW1ldGVyTm9kZV8xMDA5LmdldElkKCkpKSB7Ci0JCQkJaW1hZ2VEZXNjcmlwdG9yID0gQWN0aXZpdHlEaWFncmFtRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkKLQkJCQkJCS5nZXRJbWFnZURlc2NyaXB0b3IoImZ1bGwvb2JqMTYvVGFza0Rlc2NyaXB0b3IuZ2lmIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWlmIChpbWFnZURlc2NyaXB0b3IgIT0gbnVsbCkgewotCQkJCWdldEltYWdlUmVnaXN0cnkoKS5wdXQoa2V5LCBpbWFnZURlc2NyaXB0b3IpOwotCQkJCWltYWdlID0gZ2V0SW1hZ2VSZWdpc3RyeSgpLmdldChrZXkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBpbWFnZTsKLQl9Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEltYWdlRGVzY3JpcHRvciBnZXRJbWFnZURlc2NyaXB0b3IoRU5hbWVkRWxlbWVudCBlbGVtZW50LAotCQkJSUVsZW1lbnRUeXBlIHR5cGUpIHsKLQkJU3RyaW5nIGtleSA9IHR5cGUuZ2V0SWQoKTsKLQkJSW1hZ2VEZXNjcmlwdG9yIGltYWdlRGVzY3JpcHRvciA9IGdldEltYWdlUmVnaXN0cnkoKS5nZXREZXNjcmlwdG9yKGtleSk7Ci0KLQkJaWYgKGltYWdlRGVzY3JpcHRvciA9PSBudWxsKSB7Ci0JCQlpbWFnZURlc2NyaXB0b3IgPSBudWxsOwotCQkJaWYgKGtleS5lcXVhbHMoU3RydWN0dXJlZEFjdGl2aXR5Tm9kZV8xMDA3LmdldElkKCkpKSB7Ci0JCQkJaW1hZ2VEZXNjcmlwdG9yID0gQWN0aXZpdHlEaWFncmFtRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkKLQkJCQkJCS5nZXRJbWFnZURlc2NyaXB0b3IoImZ1bGwvb2JqMTYvQWN0aXZpdHkuZ2lmIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0gZWxzZSBpZiAoa2V5LmVxdWFscyhTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlXzEwMTAuZ2V0SWQoKSkpIHsKLQkJCQlpbWFnZURlc2NyaXB0b3IgPSBBY3Rpdml0eURpYWdyYW1FZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKQotCQkJCQkJLmdldEltYWdlRGVzY3JpcHRvcigiZnVsbC9vYmoxNi9QaGFzZS5naWYiKTsgLy8kTk9OLU5MUy0xJAotCQkJfSBlbHNlIGlmIChrZXkuZXF1YWxzKFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVfMTAxMS5nZXRJZCgpKSkgewotCQkJCWltYWdlRGVzY3JpcHRvciA9IEFjdGl2aXR5RGlhZ3JhbUVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpCi0JCQkJCQkuZ2V0SW1hZ2VEZXNjcmlwdG9yKCJmdWxsL29iajE2L0l0ZXJhdGlvbi5naWYiKTsgLy8kTk9OLU5MUy0xJAotCQkJfSBlbHNlIGlmIChrZXkuZXF1YWxzKEFjdGl2aXR5UGFyYW1ldGVyTm9kZV8xMDEyLmdldElkKCkpKSB7Ci0JCQkJaW1hZ2VEZXNjcmlwdG9yID0gQWN0aXZpdHlEaWFncmFtRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkKLQkJCQkJCS5nZXRJbWFnZURlc2NyaXB0b3IoImZ1bGwvb2JqMTYvTWlsZXN0b25lLmdpZiIpOyAvLyROT04tTkxTLTEkCi0JCQl9IGVsc2UgaWYgKGtleS5lcXVhbHMoQWN0aXZpdHlQYXJhbWV0ZXJOb2RlXzEwMDkuZ2V0SWQoKSkpIHsKLQkJCQlpbWFnZURlc2NyaXB0b3IgPSBBY3Rpdml0eURpYWdyYW1FZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKQotCQkJCQkJLmdldEltYWdlRGVzY3JpcHRvcigiZnVsbC9vYmoxNi9UYXNrRGVzY3JpcHRvci5naWYiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJaWYgKGltYWdlRGVzY3JpcHRvciAhPSBudWxsKSB7Ci0JCQkJZ2V0SW1hZ2VSZWdpc3RyeSgpLnB1dChrZXksIGltYWdlRGVzY3JpcHRvcik7Ci0JCQkJaW1hZ2VEZXNjcmlwdG9yID0gZ2V0SW1hZ2VSZWdpc3RyeSgpLmdldERlc2NyaXB0b3Ioa2V5KTsKLQkJCX0gZWxzZSB7Ci0JCQkJaW1hZ2VEZXNjcmlwdG9yID0gZ2V0SW1hZ2VEZXNjcmlwdG9yKGVsZW1lbnQpOwotCQkJfQotCQl9Ci0JCXJldHVybiBpbWFnZURlc2NyaXB0b3I7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0dlb1NoYXBlKElBZGFwdGFibGUgaGludCkgewotCQlpZihoaW50IGluc3RhbmNlb2YgSU5vdGF0aW9uVHlwZSl7Ci0JCQlTdHJpbmcgeCA9ICgoSU5vdGF0aW9uVHlwZSloaW50KS5nZXRTZW1hbnRpY0hpbnQoKTsKLQkJCWlmKEdlb3NoYXBlQ29uc3RhbnRzLmdldFN1cHBvcnRlZFNoYXBlcygpLmNvbnRhaW5zKHgpKQotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgR2VvU2hhcGVJY29uUHJvdmlkZXIgZ2V0R2VvU2hhcGVJY29uUHJvdmlkZXIoKXsKLQkJaWYoZ2VvU2hhcGVJY29uUHJvdmlkZXIgPT0gbnVsbCl7Ci0JCQlnZW9TaGFwZUljb25Qcm92aWRlciA9IG5ldyBHZW9TaGFwZUljb25Qcm92aWRlcigpOwotCQl9Ci0JCXJldHVybiBnZW9TaGFwZUljb25Qcm92aWRlcjsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvcHJvdmlkZXJzL1VNTEljb25Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL3Byb3ZpZGVycy9VTUxJY29uUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmFiZTFiZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvcHJvdmlkZXJzL1VNTEljb25Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5wcm92aWRlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS5zZXJ2aWNlLkFic3RyYWN0UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUuc2VydmljZS5JT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5pY29uLkdldEljb25PcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLmljb24uSUljb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgVU1MSWNvblByb3ZpZGVyIGV4dGVuZHMgQWJzdHJhY3RQcm92aWRlciBpbXBsZW1lbnRzIElJY29uUHJvdmlkZXIgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJbWFnZSBnZXRJY29uKElBZGFwdGFibGUgaGludCwgaW50IGZsYWdzKSB7Ci0JCXJldHVybiBVTUxFbGVtZW50VHlwZXMuZ2V0SW1hZ2UoaGludCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHByb3ZpZGVzKElPcGVyYXRpb24gb3BlcmF0aW9uKSB7Ci0JCWlmIChvcGVyYXRpb24gaW5zdGFuY2VvZiBHZXRJY29uT3BlcmF0aW9uKSB7Ci0JCQlyZXR1cm4gKChHZXRJY29uT3BlcmF0aW9uKSBvcGVyYXRpb24pLmV4ZWN1dGUodGhpcykgIT0gbnVsbDsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL3Byb3ZpZGVycy9VTUxNb2RlbGluZ0Fzc2lzdGFudFByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvcHJvdmlkZXJzL1VNTE1vZGVsaW5nQXNzaXN0YW50UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTdkMzA5NC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvcHJvdmlkZXJzL1VNTE1vZGVsaW5nQXNzaXN0YW50UHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnByb3ZpZGVyczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklHcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLkVsZW1lbnRUeXBlUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5JRWxlbWVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnVpLnNlcnZpY2VzLm1vZGVsaW5nYXNzaXN0YW50Lk1vZGVsaW5nQXNzaXN0YW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLkVsZW1lbnRMaXN0U2VsZWN0aW9uRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLkFjdGl2aXR5RWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5BY3Rpdml0eVBhcnRpdGlvblBhcnRpdGlvbkNhbXBhcnRtZW50MkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuQWN0aXZpdHlQYXJ0aXRpb25QYXJ0aXRpb25DYW1wYXJ0bWVudEVkaXRQYXJ0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQucGFydC5BY3Rpdml0eURpYWdyYW1FZGl0b3JQbHVnaW47Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgVU1MTW9kZWxpbmdBc3Npc3RhbnRQcm92aWRlciBleHRlbmRzIE1vZGVsaW5nQXNzaXN0YW50UHJvdmlkZXIgewotCi0JLyoqCi0JICogTW9kaWZpZWQgdG8gc3luYyBvcmRlciB3aXRoIHRoZSBwYWxldHRlLgotCSAqIEBtb2RpZmllZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFR5cGVzRm9yUG9wdXBCYXIoSUFkYXB0YWJsZSBob3N0KSB7Ci0JCUlHcmFwaGljYWxFZGl0UGFydCBlZGl0UGFydCA9IChJR3JhcGhpY2FsRWRpdFBhcnQpIGhvc3QKLQkJCQkuZ2V0QWRhcHRlcihJR3JhcGhpY2FsRWRpdFBhcnQuY2xhc3MpOwotCQlpZiAoZWRpdFBhcnQgaW5zdGFuY2VvZiBBY3Rpdml0eVBhcnRpdGlvblBhcnRpdGlvbkNhbXBhcnRtZW50RWRpdFBhcnQpIHsKLQkJCUxpc3QgdHlwZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQl0eXBlcy5hZGQoVU1MRWxlbWVudFR5cGVzLkFjdGl2aXR5UGFydGl0aW9uXzIwMDEpOwotCQkJcmV0dXJuIHR5cGVzOwotCQl9Ci0JCWlmIChlZGl0UGFydCBpbnN0YW5jZW9mIEFjdGl2aXR5UGFydGl0aW9uUGFydGl0aW9uQ2FtcGFydG1lbnQyRWRpdFBhcnQpIHsKLQkJCUxpc3QgdHlwZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQl0eXBlcy5hZGQoVU1MRWxlbWVudFR5cGVzLkFjdGl2aXR5UGFydGl0aW9uXzIwMDEpOwotCQkJcmV0dXJuIHR5cGVzOwotCQl9Ci0JCWlmIChlZGl0UGFydCBpbnN0YW5jZW9mIEFjdGl2aXR5RWRpdFBhcnQpIHsKLQkJCUxpc3QgdHlwZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQl0eXBlcy5hZGQoVU1MRWxlbWVudFR5cGVzLkFjdGl2aXR5UGFydGl0aW9uXzEwMDgpOwotCQkJdHlwZXMuYWRkKFVNTEVsZW1lbnRUeXBlcy5Jbml0aWFsTm9kZV8xMDA0KTsKLQkJCXR5cGVzLmFkZChVTUxFbGVtZW50VHlwZXMuQWN0aXZpdHlGaW5hbE5vZGVfMTAwMSk7Ci0JCQl0eXBlcy5hZGQoVU1MRWxlbWVudFR5cGVzLkZvcmtOb2RlXzEwMDMpOwotCQkJdHlwZXMuYWRkKFVNTEVsZW1lbnRUeXBlcy5Kb2luTm9kZV8xMDA2KTsKLQkJCXR5cGVzLmFkZChVTUxFbGVtZW50VHlwZXMuRGVjaXNpb25Ob2RlXzEwMDUpOwotCQkJdHlwZXMuYWRkKFVNTEVsZW1lbnRUeXBlcy5NZXJnZU5vZGVfMTAwMik7Ci0JCQl0eXBlcy5hZGQoVU1MRWxlbWVudFR5cGVzLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVfMTAwNyk7Ci0JCQl0eXBlcy5hZGQoVU1MRWxlbWVudFR5cGVzLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVfMTAxMSk7Ci0JCQl0eXBlcy5hZGQoVU1MRWxlbWVudFR5cGVzLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVfMTAxMCk7Ci0JCQl0eXBlcy5hZGQoVU1MRWxlbWVudFR5cGVzLkFjdGl2aXR5UGFyYW1ldGVyTm9kZV8xMDEyKTsKLQkJCXR5cGVzLmFkZChVTUxFbGVtZW50VHlwZXMuQWN0aXZpdHlQYXJhbWV0ZXJOb2RlXzEwMDkpOwotCQkJcmV0dXJuIHR5cGVzOwotCQl9Ci0JCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRSZWxUeXBlc09uU291cmNlKElBZGFwdGFibGUgc291cmNlKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRSZWxUeXBlc09uVGFyZ2V0KElBZGFwdGFibGUgdGFyZ2V0KSB7Ci0JCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRSZWxUeXBlc09uU291cmNlQW5kVGFyZ2V0KElBZGFwdGFibGUgc291cmNlLAotCQkJSUFkYXB0YWJsZSB0YXJnZXQpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFR5cGVzRm9yU291cmNlKElBZGFwdGFibGUgdGFyZ2V0LAotCQkJSUVsZW1lbnRUeXBlIHJlbGF0aW9uc2hpcFR5cGUpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFR5cGVzRm9yVGFyZ2V0KElBZGFwdGFibGUgc291cmNlLAotCQkJSUVsZW1lbnRUeXBlIHJlbGF0aW9uc2hpcFR5cGUpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFT2JqZWN0IHNlbGVjdEV4aXN0aW5nRWxlbWVudEZvclNvdXJjZShJQWRhcHRhYmxlIHRhcmdldCwKLQkJCUlFbGVtZW50VHlwZSByZWxhdGlvbnNoaXBUeXBlKSB7Ci0JCXJldHVybiBzZWxlY3RFeGlzdGluZ0VsZW1lbnQodGFyZ2V0LCBnZXRUeXBlc0ZvclNvdXJjZSh0YXJnZXQsCi0JCQkJcmVsYXRpb25zaGlwVHlwZSkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRU9iamVjdCBzZWxlY3RFeGlzdGluZ0VsZW1lbnRGb3JUYXJnZXQoSUFkYXB0YWJsZSBzb3VyY2UsCi0JCQlJRWxlbWVudFR5cGUgcmVsYXRpb25zaGlwVHlwZSkgewotCQlyZXR1cm4gc2VsZWN0RXhpc3RpbmdFbGVtZW50KHNvdXJjZSwgZ2V0VHlwZXNGb3JUYXJnZXQoc291cmNlLAotCQkJCXJlbGF0aW9uc2hpcFR5cGUpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVPYmplY3Qgc2VsZWN0RXhpc3RpbmdFbGVtZW50KElBZGFwdGFibGUgaG9zdCwgQ29sbGVjdGlvbiB0eXBlcykgewotCQlpZiAodHlwZXMuaXNFbXB0eSgpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlJR3JhcGhpY2FsRWRpdFBhcnQgZWRpdFBhcnQgPSAoSUdyYXBoaWNhbEVkaXRQYXJ0KSBob3N0Ci0JCQkJLmdldEFkYXB0ZXIoSUdyYXBoaWNhbEVkaXRQYXJ0LmNsYXNzKTsKLQkJaWYgKGVkaXRQYXJ0ID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCURpYWdyYW0gZGlhZ3JhbSA9IChEaWFncmFtKSBlZGl0UGFydC5nZXRSb290KCkuZ2V0Q29udGVudHMoKS5nZXRNb2RlbCgpOwotCQlDb2xsZWN0aW9uIGVsZW1lbnRzID0gbmV3IEhhc2hTZXQoKTsKLQkJZm9yIChJdGVyYXRvciBpdCA9IGRpYWdyYW0uZ2V0RWxlbWVudCgpLmVBbGxDb250ZW50cygpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlFT2JqZWN0IGVsZW1lbnQgPSAoRU9iamVjdCkgaXQubmV4dCgpOwotCQkJaWYgKGlzQXBwbGljYWJsZUVsZW1lbnQoZWxlbWVudCwgdHlwZXMpKSB7Ci0JCQkJZWxlbWVudHMuYWRkKGVsZW1lbnQpOwotCQkJfQotCQl9Ci0JCWlmIChlbGVtZW50cy5pc0VtcHR5KCkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiBzZWxlY3RFbGVtZW50KChFT2JqZWN0W10pIGVsZW1lbnRzLnRvQXJyYXkobmV3IEVPYmplY3RbZWxlbWVudHMKLQkJCQkuc2l6ZSgpXSkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0FwcGxpY2FibGVFbGVtZW50KEVPYmplY3QgZWxlbWVudCwgQ29sbGVjdGlvbiB0eXBlcykgewotCQlJRWxlbWVudFR5cGUgdHlwZSA9IEVsZW1lbnRUeXBlUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXRFbGVtZW50VHlwZSgKLQkJCQllbGVtZW50KTsKLQkJcmV0dXJuIHR5cGVzLmNvbnRhaW5zKHR5cGUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRU9iamVjdCBzZWxlY3RFbGVtZW50KEVPYmplY3RbXSBlbGVtZW50cykgewotCQlTaGVsbCBzaGVsbCA9IERpc3BsYXkuZ2V0Q3VycmVudCgpLmdldEFjdGl2ZVNoZWxsKCk7Ci0JCUlMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIgPSBuZXcgQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyKAotCQkJCUFjdGl2aXR5RGlhZ3JhbUVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpCi0JCQkJCQkuZ2V0SXRlbVByb3ZpZGVyc0FkYXB0ZXJGYWN0b3J5KCkpOwotCQlFbGVtZW50TGlzdFNlbGVjdGlvbkRpYWxvZyBkaWFsb2cgPSBuZXcgRWxlbWVudExpc3RTZWxlY3Rpb25EaWFsb2coCi0JCQkJc2hlbGwsIGxhYmVsUHJvdmlkZXIpOwotCQlkaWFsb2cuc2V0TWVzc2FnZSgiQXZhaWxhYmxlIGRvbWFpbiBtb2RlbCBlbGVtZW50czoiKTsKLQkJZGlhbG9nLnNldFRpdGxlKCJTZWxlY3QgZG9tYWluIG1vZGVsIGVsZW1lbnQiKTsKLQkJZGlhbG9nLnNldE11bHRpcGxlU2VsZWN0aW9uKGZhbHNlKTsKLQkJZGlhbG9nLnNldEVsZW1lbnRzKGVsZW1lbnRzKTsKLQkJRU9iamVjdCBzZWxlY3RlZCA9IG51bGw7Ci0JCWlmIChkaWFsb2cub3BlbigpID09IFdpbmRvdy5PSykgewotCQkJc2VsZWN0ZWQgPSAoRU9iamVjdCkgZGlhbG9nLmdldEZpcnN0UmVzdWx0KCk7Ci0JCX0KLQkJcmV0dXJuIHNlbGVjdGVkOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9wcm92aWRlcnMvVU1MUGFsZXR0ZVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvcHJvdmlkZXJzL1VNTFBhbGV0dGVQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZmQyZTVkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9wcm92aWRlcnMvVU1MUGFsZXR0ZVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnByb3ZpZGVyczsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucGFsZXR0ZS5QYWxldHRlUm9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS5zZXJ2aWNlLkFic3RyYWN0UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUuc2VydmljZS5JT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuc2VydmljZXMucGFsZXR0ZS5JUGFsZXR0ZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnBhcnQuVU1MUGFsZXR0ZUZhY3Rvcnk7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgVU1MUGFsZXR0ZVByb3ZpZGVyIGV4dGVuZHMgQWJzdHJhY3RQcm92aWRlciBpbXBsZW1lbnRzCi0JCUlQYWxldHRlUHJvdmlkZXIgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGNvbnRyaWJ1dGVUb1BhbGV0dGUoSUVkaXRvclBhcnQgZWRpdG9yLCBPYmplY3QgY29udGVudCwKLQkJCVBhbGV0dGVSb290IHJvb3QsIE1hcCBwcmVkZWZpbmVkRW50cmllcykgewotCQlVTUxQYWxldHRlRmFjdG9yeSBmYWN0b3J5ID0gbmV3IFVNTFBhbGV0dGVGYWN0b3J5KCk7Ci0JCWZhY3RvcnkuZmlsbFBhbGV0dGUocm9vdCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvbnRyaWJ1dGlvbnMoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNvbmZpZ0VsZW1lbnQpIHsKLQkJLy8gbm8gY29uZmlndXJhdGlvbgotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBwcm92aWRlcyhJT3BlcmF0aW9uIG9wZXJhdGlvbikgewotCQlyZXR1cm4gZmFsc2U7IC8vIGFsbCBsb2dpYyBpcyBkb25lIGluIHRoZSBzZXJ2aWNlCi0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL3Byb3ZpZGVycy9VTUxQYXJzZXJQcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL3Byb3ZpZGVycy9VTUxQYXJzZXJQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NDFlMzhlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9wcm92aWRlcnMvVU1MUGFyc2VyUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxNyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnByb3ZpZGVyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi5jb3JlLnNlcnZpY2UuQWJzdHJhY3RQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS5zZXJ2aWNlLklPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5HZXRQYXJzZXJPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5JUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuSVBhcnNlclByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5BY3Rpdml0eUZpbmFsTm9kZU5hbWVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLkFjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWUyRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5BY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5BY3Rpdml0eVBhcnRpdGlvbk5hbWUyRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5BY3Rpdml0eVBhcnRpdGlvbk5hbWVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLkNvbnRyb2xGbG93TmFtZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuRGVjaXNpb25Ob2RlTmFtZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuSW5pdGlhbE5vZGVOYW1lRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5NZXJnZU5vZGVOYW1lRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZTJFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVOYW1lM0VkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWVFZGl0UGFydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnBhcnQuVU1MVmlzdWFsSURSZWdpc3RyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLlVNTFBhY2thZ2U7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgVU1MUGFyc2VyUHJvdmlkZXIgZXh0ZW5kcyBBYnN0cmFjdFByb3ZpZGVyIGltcGxlbWVudHMKLQkJSVBhcnNlclByb3ZpZGVyIHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIElQYXJzZXIgYWN0aXZpdHlQYXJ0aXRpb25BY3Rpdml0eVBhcnRpdGlvbk5hbWVfNDAwNlBhcnNlcjsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIElQYXJzZXIgZ2V0QWN0aXZpdHlQYXJ0aXRpb25BY3Rpdml0eVBhcnRpdGlvbk5hbWVfNDAwNlBhcnNlcigpIHsKLQkJaWYgKGFjdGl2aXR5UGFydGl0aW9uQWN0aXZpdHlQYXJ0aXRpb25OYW1lXzQwMDZQYXJzZXIgPT0gbnVsbCkgewotCQkJYWN0aXZpdHlQYXJ0aXRpb25BY3Rpdml0eVBhcnRpdGlvbk5hbWVfNDAwNlBhcnNlciA9IGNyZWF0ZUFjdGl2aXR5UGFydGl0aW9uQWN0aXZpdHlQYXJ0aXRpb25OYW1lXzQwMDZQYXJzZXIoKTsKLQkJfQotCQlyZXR1cm4gYWN0aXZpdHlQYXJ0aXRpb25BY3Rpdml0eVBhcnRpdGlvbk5hbWVfNDAwNlBhcnNlcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElQYXJzZXIgY3JlYXRlQWN0aXZpdHlQYXJ0aXRpb25BY3Rpdml0eVBhcnRpdGlvbk5hbWVfNDAwNlBhcnNlcigpIHsKLQkJVU1MU3RydWN0dXJhbEZlYXR1cmVQYXJzZXIgcGFyc2VyID0gbmV3IFVNTFN0cnVjdHVyYWxGZWF0dXJlUGFyc2VyKAotCQkJCVVNTFBhY2thZ2UuZUlOU1RBTkNFLmdldE5hbWVkRWxlbWVudF9OYW1lKCkpOwotCQlwYXJzZXIuc2V0Vmlld1BhdHRlcm4oInswfSIpOwotCQlwYXJzZXIuc2V0RWRpdFBhdHRlcm4oInswfSIpOwotCQlyZXR1cm4gcGFyc2VyOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIElQYXJzZXIgYWN0aXZpdHlGaW5hbE5vZGVBY3Rpdml0eUZpbmFsTm9kZU5hbWVfNDAwMVBhcnNlcjsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIElQYXJzZXIgZ2V0QWN0aXZpdHlGaW5hbE5vZGVBY3Rpdml0eUZpbmFsTm9kZU5hbWVfNDAwMVBhcnNlcigpIHsKLQkJaWYgKGFjdGl2aXR5RmluYWxOb2RlQWN0aXZpdHlGaW5hbE5vZGVOYW1lXzQwMDFQYXJzZXIgPT0gbnVsbCkgewotCQkJYWN0aXZpdHlGaW5hbE5vZGVBY3Rpdml0eUZpbmFsTm9kZU5hbWVfNDAwMVBhcnNlciA9IGNyZWF0ZUFjdGl2aXR5RmluYWxOb2RlQWN0aXZpdHlGaW5hbE5vZGVOYW1lXzQwMDFQYXJzZXIoKTsKLQkJfQotCQlyZXR1cm4gYWN0aXZpdHlGaW5hbE5vZGVBY3Rpdml0eUZpbmFsTm9kZU5hbWVfNDAwMVBhcnNlcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElQYXJzZXIgY3JlYXRlQWN0aXZpdHlGaW5hbE5vZGVBY3Rpdml0eUZpbmFsTm9kZU5hbWVfNDAwMVBhcnNlcigpIHsKLQkJVU1MU3RydWN0dXJhbEZlYXR1cmVQYXJzZXIgcGFyc2VyID0gbmV3IFVNTFN0cnVjdHVyYWxGZWF0dXJlUGFyc2VyKAotCQkJCVVNTFBhY2thZ2UuZUlOU1RBTkNFLmdldE5hbWVkRWxlbWVudF9OYW1lKCkpOwotCQlwYXJzZXIuc2V0Vmlld1BhdHRlcm4oInswfSIpOwotCQlwYXJzZXIuc2V0RWRpdFBhdHRlcm4oInswfSIpOwotCQlyZXR1cm4gcGFyc2VyOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIElQYXJzZXIgbWVyZ2VOb2RlTWVyZ2VOb2RlTmFtZV80MDAyUGFyc2VyOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgSVBhcnNlciBnZXRNZXJnZU5vZGVNZXJnZU5vZGVOYW1lXzQwMDJQYXJzZXIoKSB7Ci0JCWlmIChtZXJnZU5vZGVNZXJnZU5vZGVOYW1lXzQwMDJQYXJzZXIgPT0gbnVsbCkgewotCQkJbWVyZ2VOb2RlTWVyZ2VOb2RlTmFtZV80MDAyUGFyc2VyID0gY3JlYXRlTWVyZ2VOb2RlTWVyZ2VOb2RlTmFtZV80MDAyUGFyc2VyKCk7Ci0JCX0KLQkJcmV0dXJuIG1lcmdlTm9kZU1lcmdlTm9kZU5hbWVfNDAwMlBhcnNlcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElQYXJzZXIgY3JlYXRlTWVyZ2VOb2RlTWVyZ2VOb2RlTmFtZV80MDAyUGFyc2VyKCkgewotCQlVTUxTdHJ1Y3R1cmFsRmVhdHVyZVBhcnNlciBwYXJzZXIgPSBuZXcgVU1MU3RydWN0dXJhbEZlYXR1cmVQYXJzZXIoCi0JCQkJVU1MUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TmFtZWRFbGVtZW50X05hbWUoKSk7Ci0JCXBhcnNlci5zZXRWaWV3UGF0dGVybigiezB9Iik7Ci0JCXBhcnNlci5zZXRFZGl0UGF0dGVybigiezB9Iik7Ci0JCXJldHVybiBwYXJzZXI7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgSVBhcnNlciBpbml0aWFsTm9kZUluaXRpYWxOb2RlTmFtZV80MDAzUGFyc2VyOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgSVBhcnNlciBnZXRJbml0aWFsTm9kZUluaXRpYWxOb2RlTmFtZV80MDAzUGFyc2VyKCkgewotCQlpZiAoaW5pdGlhbE5vZGVJbml0aWFsTm9kZU5hbWVfNDAwM1BhcnNlciA9PSBudWxsKSB7Ci0JCQlpbml0aWFsTm9kZUluaXRpYWxOb2RlTmFtZV80MDAzUGFyc2VyID0gY3JlYXRlSW5pdGlhbE5vZGVJbml0aWFsTm9kZU5hbWVfNDAwM1BhcnNlcigpOwotCQl9Ci0JCXJldHVybiBpbml0aWFsTm9kZUluaXRpYWxOb2RlTmFtZV80MDAzUGFyc2VyOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSVBhcnNlciBjcmVhdGVJbml0aWFsTm9kZUluaXRpYWxOb2RlTmFtZV80MDAzUGFyc2VyKCkgewotCQlVTUxTdHJ1Y3R1cmFsRmVhdHVyZVBhcnNlciBwYXJzZXIgPSBuZXcgVU1MU3RydWN0dXJhbEZlYXR1cmVQYXJzZXIoCi0JCQkJVU1MUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TmFtZWRFbGVtZW50X05hbWUoKSk7Ci0JCXBhcnNlci5zZXRWaWV3UGF0dGVybigiezB9Iik7Ci0JCXBhcnNlci5zZXRFZGl0UGF0dGVybigiezB9Iik7Ci0JCXJldHVybiBwYXJzZXI7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgSVBhcnNlciBkZWNpc2lvbk5vZGVEZWNpc2lvbk5vZGVOYW1lXzQwMDRQYXJzZXI7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBJUGFyc2VyIGdldERlY2lzaW9uTm9kZURlY2lzaW9uTm9kZU5hbWVfNDAwNFBhcnNlcigpIHsKLQkJaWYgKGRlY2lzaW9uTm9kZURlY2lzaW9uTm9kZU5hbWVfNDAwNFBhcnNlciA9PSBudWxsKSB7Ci0JCQlkZWNpc2lvbk5vZGVEZWNpc2lvbk5vZGVOYW1lXzQwMDRQYXJzZXIgPSBjcmVhdGVEZWNpc2lvbk5vZGVEZWNpc2lvbk5vZGVOYW1lXzQwMDRQYXJzZXIoKTsKLQkJfQotCQlyZXR1cm4gZGVjaXNpb25Ob2RlRGVjaXNpb25Ob2RlTmFtZV80MDA0UGFyc2VyOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSVBhcnNlciBjcmVhdGVEZWNpc2lvbk5vZGVEZWNpc2lvbk5vZGVOYW1lXzQwMDRQYXJzZXIoKSB7Ci0JCVVNTFN0cnVjdHVyYWxGZWF0dXJlUGFyc2VyIHBhcnNlciA9IG5ldyBVTUxTdHJ1Y3R1cmFsRmVhdHVyZVBhcnNlcigKLQkJCQlVTUxQYWNrYWdlLmVJTlNUQU5DRS5nZXROYW1lZEVsZW1lbnRfTmFtZSgpKTsKLQkJcGFyc2VyLnNldFZpZXdQYXR0ZXJuKCJ7MH0iKTsKLQkJcGFyc2VyLnNldEVkaXRQYXR0ZXJuKCJ7MH0iKTsKLQkJcmV0dXJuIHBhcnNlcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBJUGFyc2VyIHN0cnVjdHVyZWRBY3Rpdml0eU5vZGVTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZV80MDA1UGFyc2VyOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgSVBhcnNlciBnZXRTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWVfNDAwNVBhcnNlcigpIHsKLQkJaWYgKHN0cnVjdHVyZWRBY3Rpdml0eU5vZGVTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZV80MDA1UGFyc2VyID09IG51bGwpIHsKLQkJCXN0cnVjdHVyZWRBY3Rpdml0eU5vZGVTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZV80MDA1UGFyc2VyID0gY3JlYXRlU3RydWN0dXJlZEFjdGl2aXR5Tm9kZVN0cnVjdHVyZWRBY3Rpdml0eU5vZGVOYW1lXzQwMDVQYXJzZXIoKTsKLQkJfQotCQlyZXR1cm4gc3RydWN0dXJlZEFjdGl2aXR5Tm9kZVN0cnVjdHVyZWRBY3Rpdml0eU5vZGVOYW1lXzQwMDVQYXJzZXI7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJUGFyc2VyIGNyZWF0ZVN0cnVjdHVyZWRBY3Rpdml0eU5vZGVTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZV80MDA1UGFyc2VyKCkgewotCQlVTUxTdHJ1Y3R1cmFsRmVhdHVyZVBhcnNlciBwYXJzZXIgPSBuZXcgVU1MU3RydWN0dXJhbEZlYXR1cmVQYXJzZXIoCi0JCQkJVU1MUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TmFtZWRFbGVtZW50X05hbWUoKSk7Ci0JCXBhcnNlci5zZXRWaWV3UGF0dGVybigiezB9Iik7Ci0JCXBhcnNlci5zZXRFZGl0UGF0dGVybigiezB9Iik7Ci0JCXJldHVybiBwYXJzZXI7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgSVBhcnNlciBhY3Rpdml0eVBhcnRpdGlvbkFjdGl2aXR5UGFydGl0aW9uTmFtZV80MDA3UGFyc2VyOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgSVBhcnNlciBnZXRBY3Rpdml0eVBhcnRpdGlvbkFjdGl2aXR5UGFydGl0aW9uTmFtZV80MDA3UGFyc2VyKCkgewotCQlpZiAoYWN0aXZpdHlQYXJ0aXRpb25BY3Rpdml0eVBhcnRpdGlvbk5hbWVfNDAwN1BhcnNlciA9PSBudWxsKSB7Ci0JCQlhY3Rpdml0eVBhcnRpdGlvbkFjdGl2aXR5UGFydGl0aW9uTmFtZV80MDA3UGFyc2VyID0gY3JlYXRlQWN0aXZpdHlQYXJ0aXRpb25BY3Rpdml0eVBhcnRpdGlvbk5hbWVfNDAwN1BhcnNlcigpOwotCQl9Ci0JCXJldHVybiBhY3Rpdml0eVBhcnRpdGlvbkFjdGl2aXR5UGFydGl0aW9uTmFtZV80MDA3UGFyc2VyOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSVBhcnNlciBjcmVhdGVBY3Rpdml0eVBhcnRpdGlvbkFjdGl2aXR5UGFydGl0aW9uTmFtZV80MDA3UGFyc2VyKCkgewotCQlVTUxTdHJ1Y3R1cmFsRmVhdHVyZVBhcnNlciBwYXJzZXIgPSBuZXcgVU1MU3RydWN0dXJhbEZlYXR1cmVQYXJzZXIoCi0JCQkJVU1MUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TmFtZWRFbGVtZW50X05hbWUoKSk7Ci0JCXBhcnNlci5zZXRWaWV3UGF0dGVybigiezB9Iik7Ci0JCXBhcnNlci5zZXRFZGl0UGF0dGVybigiezB9Iik7Ci0JCXJldHVybiBwYXJzZXI7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgSVBhcnNlciBhY3Rpdml0eVBhcmFtZXRlck5vZGVBY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lXzQwMDhQYXJzZXI7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBJUGFyc2VyIGdldEFjdGl2aXR5UGFyYW1ldGVyTm9kZUFjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWVfNDAwOFBhcnNlcigpIHsKLQkJaWYgKGFjdGl2aXR5UGFyYW1ldGVyTm9kZUFjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWVfNDAwOFBhcnNlciA9PSBudWxsKSB7Ci0JCQlhY3Rpdml0eVBhcmFtZXRlck5vZGVBY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lXzQwMDhQYXJzZXIgPSBjcmVhdGVBY3Rpdml0eVBhcmFtZXRlck5vZGVBY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lXzQwMDhQYXJzZXIoKTsKLQkJfQotCQlyZXR1cm4gYWN0aXZpdHlQYXJhbWV0ZXJOb2RlQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZV80MDA4UGFyc2VyOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSVBhcnNlciBjcmVhdGVBY3Rpdml0eVBhcmFtZXRlck5vZGVBY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lXzQwMDhQYXJzZXIoKSB7Ci0JCVVNTFN0cnVjdHVyYWxGZWF0dXJlUGFyc2VyIHBhcnNlciA9IG5ldyBVTUxTdHJ1Y3R1cmFsRmVhdHVyZVBhcnNlcigKLQkJCQlVTUxQYWNrYWdlLmVJTlNUQU5DRS5nZXROYW1lZEVsZW1lbnRfTmFtZSgpKTsKLQkJcGFyc2VyLnNldFZpZXdQYXR0ZXJuKCJ7MH0iKTsKLQkJcGFyc2VyLnNldEVkaXRQYXR0ZXJuKCJ7MH0iKTsKLQkJcmV0dXJuIHBhcnNlcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBJUGFyc2VyIHN0cnVjdHVyZWRBY3Rpdml0eU5vZGVTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZV80MDA5UGFyc2VyOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgSVBhcnNlciBnZXRTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWVfNDAwOVBhcnNlcigpIHsKLQkJaWYgKHN0cnVjdHVyZWRBY3Rpdml0eU5vZGVTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZV80MDA5UGFyc2VyID09IG51bGwpIHsKLQkJCXN0cnVjdHVyZWRBY3Rpdml0eU5vZGVTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZV80MDA5UGFyc2VyID0gY3JlYXRlU3RydWN0dXJlZEFjdGl2aXR5Tm9kZVN0cnVjdHVyZWRBY3Rpdml0eU5vZGVOYW1lXzQwMDlQYXJzZXIoKTsKLQkJfQotCQlyZXR1cm4gc3RydWN0dXJlZEFjdGl2aXR5Tm9kZVN0cnVjdHVyZWRBY3Rpdml0eU5vZGVOYW1lXzQwMDlQYXJzZXI7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJUGFyc2VyIGNyZWF0ZVN0cnVjdHVyZWRBY3Rpdml0eU5vZGVTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZV80MDA5UGFyc2VyKCkgewotCQlVTUxTdHJ1Y3R1cmFsRmVhdHVyZVBhcnNlciBwYXJzZXIgPSBuZXcgVU1MU3RydWN0dXJhbEZlYXR1cmVQYXJzZXIoCi0JCQkJVU1MUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TmFtZWRFbGVtZW50X05hbWUoKSk7Ci0JCXBhcnNlci5zZXRWaWV3UGF0dGVybigiezB9Iik7Ci0JCXBhcnNlci5zZXRFZGl0UGF0dGVybigiezB9Iik7Ci0JCXJldHVybiBwYXJzZXI7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgSVBhcnNlciBzdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWVfNDAxMFBhcnNlcjsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIElQYXJzZXIgZ2V0U3RydWN0dXJlZEFjdGl2aXR5Tm9kZVN0cnVjdHVyZWRBY3Rpdml0eU5vZGVOYW1lXzQwMTBQYXJzZXIoKSB7Ci0JCWlmIChzdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWVfNDAxMFBhcnNlciA9PSBudWxsKSB7Ci0JCQlzdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWVfNDAxMFBhcnNlciA9IGNyZWF0ZVN0cnVjdHVyZWRBY3Rpdml0eU5vZGVTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZV80MDEwUGFyc2VyKCk7Ci0JCX0KLQkJcmV0dXJuIHN0cnVjdHVyZWRBY3Rpdml0eU5vZGVTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZV80MDEwUGFyc2VyOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSVBhcnNlciBjcmVhdGVTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWVfNDAxMFBhcnNlcigpIHsKLQkJVU1MU3RydWN0dXJhbEZlYXR1cmVQYXJzZXIgcGFyc2VyID0gbmV3IFVNTFN0cnVjdHVyYWxGZWF0dXJlUGFyc2VyKAotCQkJCVVNTFBhY2thZ2UuZUlOU1RBTkNFLmdldE5hbWVkRWxlbWVudF9OYW1lKCkpOwotCQlwYXJzZXIuc2V0Vmlld1BhdHRlcm4oInswfSIpOwotCQlwYXJzZXIuc2V0RWRpdFBhdHRlcm4oInswfSIpOwotCQlyZXR1cm4gcGFyc2VyOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIElQYXJzZXIgYWN0aXZpdHlQYXJhbWV0ZXJOb2RlQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZV80MDExUGFyc2VyOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgSVBhcnNlciBnZXRBY3Rpdml0eVBhcmFtZXRlck5vZGVBY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lXzQwMTFQYXJzZXIoKSB7Ci0JCWlmIChhY3Rpdml0eVBhcmFtZXRlck5vZGVBY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lXzQwMTFQYXJzZXIgPT0gbnVsbCkgewotCQkJYWN0aXZpdHlQYXJhbWV0ZXJOb2RlQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZV80MDExUGFyc2VyID0gY3JlYXRlQWN0aXZpdHlQYXJhbWV0ZXJOb2RlQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZV80MDExUGFyc2VyKCk7Ci0JCX0KLQkJcmV0dXJuIGFjdGl2aXR5UGFyYW1ldGVyTm9kZUFjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWVfNDAxMVBhcnNlcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElQYXJzZXIgY3JlYXRlQWN0aXZpdHlQYXJhbWV0ZXJOb2RlQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZV80MDExUGFyc2VyKCkgewotCQlVTUxTdHJ1Y3R1cmFsRmVhdHVyZVBhcnNlciBwYXJzZXIgPSBuZXcgVU1MU3RydWN0dXJhbEZlYXR1cmVQYXJzZXIoCi0JCQkJVU1MUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TmFtZWRFbGVtZW50X05hbWUoKSk7Ci0JCXBhcnNlci5zZXRWaWV3UGF0dGVybigiezB9Iik7Ci0JCXBhcnNlci5zZXRFZGl0UGF0dGVybigiezB9Iik7Ci0JCXJldHVybiBwYXJzZXI7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgSVBhcnNlciBjb250cm9sRmxvd0NvbnRyb2xGbG93TmFtZV80MDEyUGFyc2VyOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgSVBhcnNlciBnZXRDb250cm9sRmxvd0NvbnRyb2xGbG93TmFtZV80MDEyUGFyc2VyKCkgewotCQlpZiAoY29udHJvbEZsb3dDb250cm9sRmxvd05hbWVfNDAxMlBhcnNlciA9PSBudWxsKSB7Ci0JCQljb250cm9sRmxvd0NvbnRyb2xGbG93TmFtZV80MDEyUGFyc2VyID0gY3JlYXRlQ29udHJvbEZsb3dDb250cm9sRmxvd05hbWVfNDAxMlBhcnNlcigpOwotCQl9Ci0JCXJldHVybiBjb250cm9sRmxvd0NvbnRyb2xGbG93TmFtZV80MDEyUGFyc2VyOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSVBhcnNlciBjcmVhdGVDb250cm9sRmxvd0NvbnRyb2xGbG93TmFtZV80MDEyUGFyc2VyKCkgewotCQlVTUxTdHJ1Y3R1cmFsRmVhdHVyZVBhcnNlciBwYXJzZXIgPSBuZXcgVU1MU3RydWN0dXJhbEZlYXR1cmVQYXJzZXIoCi0JCQkJVU1MUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TmFtZWRFbGVtZW50X05hbWUoKSk7Ci0JCXBhcnNlci5zZXRWaWV3UGF0dGVybigiezB9Iik7Ci0JCXBhcnNlci5zZXRFZGl0UGF0dGVybigiezB9Iik7Ci0JCXJldHVybiBwYXJzZXI7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJUGFyc2VyIGdldFBhcnNlcihpbnQgdmlzdWFsSUQpIHsKLQkJc3dpdGNoICh2aXN1YWxJRCkgewotCQljYXNlIEFjdGl2aXR5UGFydGl0aW9uTmFtZUVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCXJldHVybiBnZXRBY3Rpdml0eVBhcnRpdGlvbkFjdGl2aXR5UGFydGl0aW9uTmFtZV80MDA2UGFyc2VyKCk7Ci0JCWNhc2UgQWN0aXZpdHlGaW5hbE5vZGVOYW1lRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJcmV0dXJuIGdldEFjdGl2aXR5RmluYWxOb2RlQWN0aXZpdHlGaW5hbE5vZGVOYW1lXzQwMDFQYXJzZXIoKTsKLQkJY2FzZSBNZXJnZU5vZGVOYW1lRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJcmV0dXJuIGdldE1lcmdlTm9kZU1lcmdlTm9kZU5hbWVfNDAwMlBhcnNlcigpOwotCQljYXNlIEluaXRpYWxOb2RlTmFtZUVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCXJldHVybiBnZXRJbml0aWFsTm9kZUluaXRpYWxOb2RlTmFtZV80MDAzUGFyc2VyKCk7Ci0JCWNhc2UgRGVjaXNpb25Ob2RlTmFtZUVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCXJldHVybiBnZXREZWNpc2lvbk5vZGVEZWNpc2lvbk5vZGVOYW1lXzQwMDRQYXJzZXIoKTsKLQkJY2FzZSBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZUVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCXJldHVybiBnZXRTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWVfNDAwNVBhcnNlcigpOwotCQljYXNlIEFjdGl2aXR5UGFydGl0aW9uTmFtZTJFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQlyZXR1cm4gZ2V0QWN0aXZpdHlQYXJ0aXRpb25BY3Rpdml0eVBhcnRpdGlvbk5hbWVfNDAwN1BhcnNlcigpOwotCQljYXNlIEFjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWVFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQlyZXR1cm4gZ2V0QWN0aXZpdHlQYXJhbWV0ZXJOb2RlQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZV80MDA4UGFyc2VyKCk7Ci0JCWNhc2UgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWUyRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJcmV0dXJuIGdldFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZV80MDA5UGFyc2VyKCk7Ci0JCWNhc2UgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWUzRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJcmV0dXJuIGdldFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZV80MDEwUGFyc2VyKCk7Ci0JCWNhc2UgQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZTJFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQlyZXR1cm4gZ2V0QWN0aXZpdHlQYXJhbWV0ZXJOb2RlQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZV80MDExUGFyc2VyKCk7Ci0JCWNhc2UgQ29udHJvbEZsb3dOYW1lRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJcmV0dXJuIGdldENvbnRyb2xGbG93Q29udHJvbEZsb3dOYW1lXzQwMTJQYXJzZXIoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElQYXJzZXIgZ2V0UGFyc2VyKElBZGFwdGFibGUgaGludCkgewotCQlTdHJpbmcgdmlkID0gKFN0cmluZykgaGludC5nZXRBZGFwdGVyKFN0cmluZy5jbGFzcyk7Ci0JCWlmICh2aWQgIT0gbnVsbCkgewotCQkJcmV0dXJuIGdldFBhcnNlcihVTUxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKHZpZCkpOwotCQl9Ci0JCVZpZXcgdmlldyA9IChWaWV3KSBoaW50LmdldEFkYXB0ZXIoVmlldy5jbGFzcyk7Ci0JCWlmICh2aWV3ICE9IG51bGwpIHsKLQkJCXJldHVybiBnZXRQYXJzZXIoVU1MVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRCh2aWV3KSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHByb3ZpZGVzKElPcGVyYXRpb24gb3BlcmF0aW9uKSB7Ci0JCWlmIChvcGVyYXRpb24gaW5zdGFuY2VvZiBHZXRQYXJzZXJPcGVyYXRpb24pIHsKLQkJCUlBZGFwdGFibGUgaGludCA9ICgoR2V0UGFyc2VyT3BlcmF0aW9uKSBvcGVyYXRpb24pLmdldEhpbnQoKTsKLQkJCWlmIChVTUxFbGVtZW50VHlwZXMuZ2V0RWxlbWVudChoaW50KSA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJcmV0dXJuIGdldFBhcnNlcihoaW50KSAhPSBudWxsOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvcHJvdmlkZXJzL1VNTFByb3BlcnR5UHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9wcm92aWRlcnMvVU1MUHJvcGVydHlQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMTRkMzcwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9wcm92aWRlcnMvVU1MUHJvcGVydHlQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5wcm92aWRlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUuc2VydmljZS5JT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wcm9wZXJ0aWVzLkdldFByb3BlcnR5U291cmNlT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wcm9wZXJ0aWVzLklDb21wb3NpdGVQcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucHJvcGVydGllcy5JUHJvcGVydGllc1Byb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi51aS5wcm9wZXJ0aWVzLnByb3ZpZGVycy5HZW5lcmljRU1GUHJvcGVydGllc1Byb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5BY3Rpdml0eUVkaXRQYXJ0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQucGFydC5VTUxWaXN1YWxJRFJlZ2lzdHJ5OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFVNTFByb3BlcnR5UHJvdmlkZXIgZXh0ZW5kcyBHZW5lcmljRU1GUHJvcGVydGllc1Byb3ZpZGVyIGltcGxlbWVudHMKLQkJSVByb3BlcnRpZXNQcm92aWRlciB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gcHJvdmlkZXMoSU9wZXJhdGlvbiBvcGVyYXRpb24pIHsKLQkJaWYgKG9wZXJhdGlvbiBpbnN0YW5jZW9mIEdldFByb3BlcnR5U291cmNlT3BlcmF0aW9uKSB7Ci0JCQlPYmplY3Qgb2JqZWN0ID0gKChHZXRQcm9wZXJ0eVNvdXJjZU9wZXJhdGlvbikgb3BlcmF0aW9uKQotCQkJCQkuZ2V0T2JqZWN0KCk7Ci0JCQlyZXR1cm4gZ2V0U2VtYW50aWNFbGVtZW50KG9iamVjdCkgIT0gbnVsbDsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJQ29tcG9zaXRlUHJvcGVydHlTb3VyY2UgZ2V0UHJvcGVydHlTb3VyY2UoT2JqZWN0IG9iamVjdCkgewotCQlFT2JqZWN0IGVsZW1lbnQgPSBnZXRTZW1hbnRpY0VsZW1lbnQob2JqZWN0KTsKLQkJaWYgKGVsZW1lbnQgIT0gbnVsbCkgewotCQkJcmV0dXJuIHN1cGVyLmdldFByb3BlcnR5U291cmNlKGVsZW1lbnQpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRU9iamVjdCBnZXRTZW1hbnRpY0VsZW1lbnQoT2JqZWN0IG9iamVjdCkgewotCQlWaWV3IHZpZXcgPSBudWxsOwotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgVmlldykgewotCQkJdmlldyA9IChWaWV3KSBvYmplY3Q7Ci0JCX0gZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgRWRpdFBhcnQpIHsKLQkJCUVkaXRQYXJ0IGVkaXRQYXJ0ID0gKEVkaXRQYXJ0KSBvYmplY3Q7Ci0JCQlpZiAoZWRpdFBhcnQuZ2V0TW9kZWwoKSBpbnN0YW5jZW9mIFZpZXcpIHsKLQkJCQl2aWV3ID0gKFZpZXcpIGVkaXRQYXJ0LmdldE1vZGVsKCk7Ci0JCQl9Ci0JCX0KLQkJaWYgKHZpZXcgIT0gbnVsbAotCQkJCSYmIEFjdGl2aXR5RWRpdFBhcnQuTU9ERUxfSUQuZXF1YWxzKFVNTFZpc3VhbElEUmVnaXN0cnkKLQkJCQkJCS5nZXRNb2RlbElEKHZpZXcpKSkgewotCQkJcmV0dXJuIHZpZXcuZ2V0RWxlbWVudCgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL3Byb3ZpZGVycy9VTUxTdHJ1Y3R1cmFsRmVhdHVyZVBhcnNlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL3Byb3ZpZGVycy9VTUxTdHJ1Y3R1cmFsRmVhdHVyZVBhcnNlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYWIwNzE2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9wcm92aWRlcnMvVU1MU3RydWN0dXJhbEZlYXR1cmVQYXJzZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnByb3ZpZGVyczsKLQotaW1wb3J0IGphdmEudGV4dC5GaWVsZFBvc2l0aW9uOwotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5UcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24udXRpbC5UcmFuc2FjdGlvblV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUuY29tbWFuZC5JQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS5jb21tYW5kLlVuZXhlY3V0YWJsZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5JUGFyc2VyRWRpdFN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLlBhcnNlckVkaXRTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvbW1hbmRzLmNvcmUuY29tbWFuZC5Db21wb3NpdGVUcmFuc2FjdGlvbmFsQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5wYXJ0LkFjdGl2aXR5RGlhZ3JhbUVkaXRvclBsdWdpbjsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBVTUxTdHJ1Y3R1cmFsRmVhdHVyZVBhcnNlciBleHRlbmRzIFVNTEFic3RyYWN0UGFyc2VyIHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIE1lc3NhZ2VGb3JtYXQgREVGQVVMVF9QUk9DRVNTT1IgPSBuZXcgTWVzc2FnZUZvcm1hdCgKLQkJCSJ7MH0iKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmU7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFVNTFN0cnVjdHVyYWxGZWF0dXJlUGFyc2VyKEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKSB7Ci0JCXRoaXMuZmVhdHVyZSA9IGZlYXR1cmU7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBNZXNzYWdlRm9ybWF0IGdldFZpZXdQcm9jZXNzb3IoKSB7Ci0JCU1lc3NhZ2VGb3JtYXQgcHJvY2Vzc29yID0gc3VwZXIuZ2V0Vmlld1Byb2Nlc3NvcigpOwotCQlyZXR1cm4gcHJvY2Vzc29yID09IG51bGwgPyBERUZBVUxUX1BST0NFU1NPUiA6IHByb2Nlc3NvcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE1lc3NhZ2VGb3JtYXQgZ2V0RWRpdFByb2Nlc3NvcigpIHsKLQkJTWVzc2FnZUZvcm1hdCBwcm9jZXNzb3IgPSBzdXBlci5nZXRFZGl0UHJvY2Vzc29yKCk7Ci0JCXJldHVybiBwcm9jZXNzb3IgPT0gbnVsbCA/IERFRkFVTFRfUFJPQ0VTU09SIDogcHJvY2Vzc29yOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRU9iamVjdCBnZXREb21haW5FbGVtZW50KEVPYmplY3QgZWxlbWVudCkgewotCQlyZXR1cm4gZWxlbWVudDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTdHJpbmdCeVBhdHRlcm4oSUFkYXB0YWJsZSBhZGFwdGVyLCBpbnQgZmxhZ3MsCi0JCQlTdHJpbmcgcGF0dGVybiwgTWVzc2FnZUZvcm1hdCBwcm9jZXNzb3IpIHsKLQkJRU9iamVjdCBlbGVtZW50ID0gKEVPYmplY3QpIGFkYXB0ZXIuZ2V0QWRhcHRlcihFT2JqZWN0LmNsYXNzKTsKLQkJZWxlbWVudCA9IGdldERvbWFpbkVsZW1lbnQoZWxlbWVudCk7Ci0JCXJldHVybiBnZXRTdHJpbmdCeVBhdHRlcm4oZWxlbWVudCwgZmVhdHVyZSwgcHJvY2Vzc29yKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTdHJpbmdCeVBhdHRlcm4oRU9iamVjdCBlbGVtZW50LAotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIE1lc3NhZ2VGb3JtYXQgcHJvY2Vzc29yKSB7Ci0JCU9iamVjdCB2YWx1ZSA9IGVsZW1lbnQgPT0gbnVsbCA/IG51bGwgOiBlbGVtZW50LmVHZXQoZmVhdHVyZSk7Ci0JCXZhbHVlID0gZ2V0VmFsaWRWYWx1ZShmZWF0dXJlLCB2YWx1ZSk7Ci0JCXJldHVybiBwcm9jZXNzb3IuZm9ybWF0KG5ldyBPYmplY3RbXSB7IHZhbHVlIH0sIG5ldyBTdHJpbmdCdWZmZXIoKSwKLQkJCQluZXcgRmllbGRQb3NpdGlvbigwKSkudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElQYXJzZXJFZGl0U3RhdHVzIHZhbGlkYXRlVmFsdWVzKE9iamVjdFtdIHZhbHVlcykgewotCQlpZiAodmFsdWVzLmxlbmd0aCA+IDEpIHsKLQkJCXJldHVybiBQYXJzZXJFZGl0U3RhdHVzLlVORURJVEFCTEVfU1RBVFVTOwotCQl9Ci0JCU9iamVjdCB2YWx1ZSA9IHZhbHVlcy5sZW5ndGggPT0gMSA/IHZhbHVlc1swXSA6IG51bGw7Ci0JCXZhbHVlID0gZ2V0VmFsaWROZXdWYWx1ZShmZWF0dXJlLCB2YWx1ZSk7Ci0JCWlmICh2YWx1ZSBpbnN0YW5jZW9mIEludmFsaWRWYWx1ZSkgewotCQkJcmV0dXJuIG5ldyBQYXJzZXJFZGl0U3RhdHVzKEFjdGl2aXR5RGlhZ3JhbUVkaXRvclBsdWdpbi5JRCwKLQkJCQkJSVBhcnNlckVkaXRTdGF0dXMuVU5FRElUQUJMRSwgdmFsdWUudG9TdHJpbmcoKSk7Ci0JCX0KLQkJcmV0dXJuIFBhcnNlckVkaXRTdGF0dXMuRURJVEFCTEVfU1RBVFVTOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSUNvbW1hbmQgZ2V0UGFyc2VDb21tYW5kKElBZGFwdGFibGUgYWRhcHRlciwgT2JqZWN0W10gdmFsdWVzKSB7Ci0JCUVPYmplY3QgZWxlbWVudCA9IChFT2JqZWN0KSBhZGFwdGVyLmdldEFkYXB0ZXIoRU9iamVjdC5jbGFzcyk7Ci0JCWVsZW1lbnQgPSBnZXREb21haW5FbGVtZW50KGVsZW1lbnQpOwotCQlpZiAoZWxlbWVudCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJfQotCQlUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiBlZGl0aW5nRG9tYWluID0gVHJhbnNhY3Rpb25VdGlsCi0JCQkJLmdldEVkaXRpbmdEb21haW4oZWxlbWVudCk7Ci0JCWlmIChlZGl0aW5nRG9tYWluID09IG51bGwpIHsKLQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQl9Ci0JCU9iamVjdCB2YWx1ZSA9IHZhbHVlcy5sZW5ndGggPT0gMSA/IHZhbHVlc1swXSA6IG51bGw7Ci0JCUlDb21tYW5kIGNvbW1hbmQgPSBnZXRNb2RpZmljYXRpb25Db21tYW5kKGVsZW1lbnQsIGZlYXR1cmUsIHZhbHVlKTsKLQkJcmV0dXJuIG5ldyBDb21wb3NpdGVUcmFuc2FjdGlvbmFsQ29tbWFuZChlZGl0aW5nRG9tYWluLCBjb21tYW5kCi0JCQkJLmdldExhYmVsKCksIENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QoY29tbWFuZCkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0FmZmVjdGluZ0V2ZW50KE9iamVjdCBldmVudCwgaW50IGZsYWdzKSB7Ci0JCWlmIChldmVudCBpbnN0YW5jZW9mIE5vdGlmaWNhdGlvbikgewotCQkJcmV0dXJuIGlzQWZmZWN0aW5nRmVhdHVyZSgoKE5vdGlmaWNhdGlvbikgZXZlbnQpLmdldEZlYXR1cmUoKSk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0FmZmVjdGluZ0ZlYXR1cmUoT2JqZWN0IGV2ZW50RmVhdHVyZSkgewotCQlyZXR1cm4gZmVhdHVyZSA9PSBldmVudEZlYXR1cmU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL3Byb3ZpZGVycy9VTUxTdHJ1Y3R1cmFsRmVhdHVyZXNQYXJzZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9wcm92aWRlcnMvVU1MU3RydWN0dXJhbEZlYXR1cmVzUGFyc2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4YzY4OGQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL3Byb3ZpZGVycy9VTUxTdHJ1Y3R1cmFsRmVhdHVyZXNQYXJzZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnByb3ZpZGVyczsKLQotaW1wb3J0IGphdmEudGV4dC5GaWVsZFBvc2l0aW9uOwotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi51dGlsLlRyYW5zYWN0aW9uVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS5jb21tYW5kLklDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi5jb3JlLmNvbW1hbmQuVW5leGVjdXRhYmxlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLklQYXJzZXJFZGl0U3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuUGFyc2VyRWRpdFN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29tbWFuZHMuY29yZS5jb21tYW5kLkNvbXBvc2l0ZVRyYW5zYWN0aW9uYWxDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnBhcnQuQWN0aXZpdHlEaWFncmFtRWRpdG9yUGx1Z2luOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFVNTFN0cnVjdHVyYWxGZWF0dXJlc1BhcnNlciBleHRlbmRzIFVNTEFic3RyYWN0UGFyc2VyIHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIExpc3QgZmVhdHVyZXM7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFVNTFN0cnVjdHVyYWxGZWF0dXJlc1BhcnNlcihMaXN0IGZlYXR1cmVzKSB7Ci0JCXRoaXMuZmVhdHVyZXMgPSBmZWF0dXJlczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTdHJpbmdCeVBhdHRlcm4oSUFkYXB0YWJsZSBhZGFwdGVyLCBpbnQgZmxhZ3MsCi0JCQlTdHJpbmcgcGF0dGVybiwgTWVzc2FnZUZvcm1hdCBwcm9jZXNzb3IpIHsKLQkJRU9iamVjdCBlbGVtZW50ID0gKEVPYmplY3QpIGFkYXB0ZXIuZ2V0QWRhcHRlcihFT2JqZWN0LmNsYXNzKTsKLQkJTGlzdCB2YWx1ZXMgPSBuZXcgQXJyYXlMaXN0KGZlYXR1cmVzLnNpemUoKSk7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSBmZWF0dXJlcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IChFU3RydWN0dXJhbEZlYXR1cmUpIGl0Lm5leHQoKTsKLQkJCU9iamVjdCB2YWx1ZSA9IGVsZW1lbnQuZUdldChmZWF0dXJlKTsKLQkJCXZhbHVlID0gZ2V0VmFsaWRWYWx1ZShmZWF0dXJlLCB2YWx1ZSk7Ci0JCQl2YWx1ZXMuYWRkKHZhbHVlKTsKLQkJfQotCQlyZXR1cm4gcHJvY2Vzc29yLmZvcm1hdCh2YWx1ZXMudG9BcnJheShuZXcgT2JqZWN0W3ZhbHVlcy5zaXplKCldKSwKLQkJCQluZXcgU3RyaW5nQnVmZmVyKCksIG5ldyBGaWVsZFBvc2l0aW9uKDApKS50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSVBhcnNlckVkaXRTdGF0dXMgdmFsaWRhdGVWYWx1ZXMoT2JqZWN0W10gdmFsdWVzKSB7Ci0JCWlmICh2YWx1ZXMubGVuZ3RoICE9IGZlYXR1cmVzLnNpemUoKSkgewotCQkJcmV0dXJuIFBhcnNlckVkaXRTdGF0dXMuVU5FRElUQUJMRV9TVEFUVVM7Ci0JCX0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB2YWx1ZXMubGVuZ3RoOyBpKyspIHsKLQkJCU9iamVjdCB2YWx1ZSA9IGdldFZhbGlkTmV3VmFsdWUoKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgZmVhdHVyZXMKLQkJCQkJLmdldChpKSwgdmFsdWVzW2ldKTsKLQkJCWlmICh2YWx1ZSBpbnN0YW5jZW9mIEludmFsaWRWYWx1ZSkgewotCQkJCXJldHVybiBuZXcgUGFyc2VyRWRpdFN0YXR1cyhBY3Rpdml0eURpYWdyYW1FZGl0b3JQbHVnaW4uSUQsCi0JCQkJCQlJUGFyc2VyRWRpdFN0YXR1cy5VTkVESVRBQkxFLCB2YWx1ZS50b1N0cmluZygpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gUGFyc2VyRWRpdFN0YXR1cy5FRElUQUJMRV9TVEFUVVM7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJQ29tbWFuZCBnZXRQYXJzZUNvbW1hbmQoSUFkYXB0YWJsZSBhZGFwdGVyLCBPYmplY3RbXSB2YWx1ZXMpIHsKLQkJRU9iamVjdCBlbGVtZW50ID0gKEVPYmplY3QpIGFkYXB0ZXIuZ2V0QWRhcHRlcihFT2JqZWN0LmNsYXNzKTsKLQkJaWYgKGVsZW1lbnQgPT0gbnVsbCkgewotCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCX0KLQkJVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gZWRpdGluZ0RvbWFpbiA9IFRyYW5zYWN0aW9uVXRpbAotCQkJCS5nZXRFZGl0aW5nRG9tYWluKGVsZW1lbnQpOwotCQlpZiAoZWRpdGluZ0RvbWFpbiA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJfQotCQlDb21wb3NpdGVUcmFuc2FjdGlvbmFsQ29tbWFuZCBjb21tYW5kID0gbmV3IENvbXBvc2l0ZVRyYW5zYWN0aW9uYWxDb21tYW5kKAotCQkJCWVkaXRpbmdEb21haW4sICJTZXQgVmFsdWVzIik7IC8vJE5PTi1OTFMtMSQKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB2YWx1ZXMubGVuZ3RoOyBpKyspIHsKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgZmVhdHVyZXMuZ2V0KGkpOwotCQkJY29tbWFuZAotCQkJCQkuY29tcG9zZShnZXRNb2RpZmljYXRpb25Db21tYW5kKGVsZW1lbnQsIGZlYXR1cmUsIHZhbHVlc1tpXSkpOwotCQl9Ci0JCXJldHVybiBjb21tYW5kOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0FmZmVjdGluZ0V2ZW50KE9iamVjdCBldmVudCwgaW50IGZsYWdzKSB7Ci0JCWlmIChldmVudCBpbnN0YW5jZW9mIE5vdGlmaWNhdGlvbikgewotCQkJT2JqZWN0IGZlYXR1cmUgPSAoKE5vdGlmaWNhdGlvbikgZXZlbnQpLmdldEZlYXR1cmUoKTsKLQkJCWlmIChmZWF0dXJlcy5jb250YWlucyhmZWF0dXJlKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvcHJvdmlkZXJzL1VNTFZpZXdQcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL3Byb3ZpZGVycy9VTUxWaWV3UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGFhOTExZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvcHJvdmlkZXJzL1VNTFZpZXdQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQucHJvdmlkZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUucHJvdmlkZXJzLkFic3RyYWN0Vmlld1Byb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5JRWxlbWVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5BY3Rpdml0eUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuQWN0aXZpdHlGaW5hbE5vZGVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLkFjdGl2aXR5RmluYWxOb2RlTmFtZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuQWN0aXZpdHlQYXJhbWV0ZXJOb2RlMkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuQWN0aXZpdHlQYXJhbWV0ZXJOb2RlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5BY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lMkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuQWN0aXZpdHlQYXJ0aXRpb24yRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5BY3Rpdml0eVBhcnRpdGlvbkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuQWN0aXZpdHlQYXJ0aXRpb25OYW1lMkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuQWN0aXZpdHlQYXJ0aXRpb25OYW1lRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5BY3Rpdml0eVBhcnRpdGlvblBhcnRpdGlvbkNhbXBhcnRtZW50MkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuQWN0aXZpdHlQYXJ0aXRpb25QYXJ0aXRpb25DYW1wYXJ0bWVudEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuQ29udHJvbEZsb3dFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLkNvbnRyb2xGbG93TmFtZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuRGVjaXNpb25Ob2RlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5EZWNpc2lvbk5vZGVOYW1lRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5Gb3JrTm9kZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuSW5pdGlhbE5vZGVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLkluaXRpYWxOb2RlTmFtZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuSm9pbk5vZGVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLk1lcmdlTm9kZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuTWVyZ2VOb2RlTmFtZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTJFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGUzRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZTJFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVOYW1lM0VkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWVFZGl0UGFydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnBhcnQuVU1MVmlzdWFsSURSZWdpc3RyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnZpZXcuZmFjdG9yaWVzLkFjdGl2aXR5RmluYWxOb2RlTmFtZVZpZXdGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnZpZXcuZmFjdG9yaWVzLkFjdGl2aXR5RmluYWxOb2RlVmlld0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQudmlldy5mYWN0b3JpZXMuQWN0aXZpdHlQYXJhbWV0ZXJOb2RlMlZpZXdGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnZpZXcuZmFjdG9yaWVzLkFjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWUyVmlld0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQudmlldy5mYWN0b3JpZXMuQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZVZpZXdGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnZpZXcuZmFjdG9yaWVzLkFjdGl2aXR5UGFyYW1ldGVyTm9kZVZpZXdGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnZpZXcuZmFjdG9yaWVzLkFjdGl2aXR5UGFydGl0aW9uMlZpZXdGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnZpZXcuZmFjdG9yaWVzLkFjdGl2aXR5UGFydGl0aW9uTmFtZTJWaWV3RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC52aWV3LmZhY3Rvcmllcy5BY3Rpdml0eVBhcnRpdGlvbk5hbWVWaWV3RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC52aWV3LmZhY3Rvcmllcy5BY3Rpdml0eVBhcnRpdGlvblBhcnRpdGlvbkNhbXBhcnRtZW50MlZpZXdGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnZpZXcuZmFjdG9yaWVzLkFjdGl2aXR5UGFydGl0aW9uUGFydGl0aW9uQ2FtcGFydG1lbnRWaWV3RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC52aWV3LmZhY3Rvcmllcy5BY3Rpdml0eVBhcnRpdGlvblZpZXdGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnZpZXcuZmFjdG9yaWVzLkFjdGl2aXR5Vmlld0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQudmlldy5mYWN0b3JpZXMuQ29udHJvbEZsb3dOYW1lVmlld0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQudmlldy5mYWN0b3JpZXMuQ29udHJvbEZsb3dWaWV3RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC52aWV3LmZhY3Rvcmllcy5EZWNpc2lvbk5vZGVOYW1lVmlld0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQudmlldy5mYWN0b3JpZXMuRGVjaXNpb25Ob2RlVmlld0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQudmlldy5mYWN0b3JpZXMuRm9ya05vZGVWaWV3RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC52aWV3LmZhY3Rvcmllcy5Jbml0aWFsTm9kZU5hbWVWaWV3RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC52aWV3LmZhY3Rvcmllcy5Jbml0aWFsTm9kZVZpZXdGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnZpZXcuZmFjdG9yaWVzLkpvaW5Ob2RlVmlld0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQudmlldy5mYWN0b3JpZXMuTWVyZ2VOb2RlTmFtZVZpZXdGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnZpZXcuZmFjdG9yaWVzLk1lcmdlTm9kZVZpZXdGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnZpZXcuZmFjdG9yaWVzLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGUyVmlld0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQudmlldy5mYWN0b3JpZXMuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTNWaWV3RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC52aWV3LmZhY3Rvcmllcy5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZTJWaWV3RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC52aWV3LmZhY3Rvcmllcy5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZTNWaWV3RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC52aWV3LmZhY3Rvcmllcy5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZVZpZXdGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnZpZXcuZmFjdG9yaWVzLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVWaWV3RmFjdG9yeTsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBVTUxWaWV3UHJvdmlkZXIgZXh0ZW5kcyBBYnN0cmFjdFZpZXdQcm92aWRlciB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENsYXNzIGdldERpYWdyYW1WaWV3Q2xhc3MoSUFkYXB0YWJsZSBzZW1hbnRpY0FkYXB0ZXIsCi0JCQlTdHJpbmcgZGlhZ3JhbUtpbmQpIHsKLQkJRU9iamVjdCBzZW1hbnRpY0VsZW1lbnQgPSBnZXRTZW1hbnRpY0VsZW1lbnQoc2VtYW50aWNBZGFwdGVyKTsKLQkJaWYgKEFjdGl2aXR5RWRpdFBhcnQuTU9ERUxfSUQuZXF1YWxzKGRpYWdyYW1LaW5kKQotCQkJCSYmIFVNTFZpc3VhbElEUmVnaXN0cnkuZ2V0RGlhZ3JhbVZpc3VhbElEKHNlbWFudGljRWxlbWVudCkgIT0gLTEpIHsKLQkJCXJldHVybiBBY3Rpdml0eVZpZXdGYWN0b3J5LmNsYXNzOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ2xhc3MgZ2V0Tm9kZVZpZXdDbGFzcyhJQWRhcHRhYmxlIHNlbWFudGljQWRhcHRlciwKLQkJCVZpZXcgY29udGFpbmVyVmlldywgU3RyaW5nIHNlbWFudGljSGludCkgewotCQlpZiAoY29udGFpbmVyVmlldyA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlJRWxlbWVudFR5cGUgZWxlbWVudFR5cGUgPSBnZXRTZW1hbnRpY0VsZW1lbnRUeXBlKHNlbWFudGljQWRhcHRlcik7Ci0JCWlmIChlbGVtZW50VHlwZSAhPSBudWxsCi0JCQkJJiYgIVVNTEVsZW1lbnRUeXBlcy5pc0tub3duRWxlbWVudFR5cGUoZWxlbWVudFR5cGUpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlFQ2xhc3Mgc2VtYW50aWNUeXBlID0gZ2V0U2VtYW50aWNFQ2xhc3Moc2VtYW50aWNBZGFwdGVyKTsKLQkJRU9iamVjdCBzZW1hbnRpY0VsZW1lbnQgPSBnZXRTZW1hbnRpY0VsZW1lbnQoc2VtYW50aWNBZGFwdGVyKTsKLQkJaW50IG5vZGVWSUQgPSBVTUxWaXN1YWxJRFJlZ2lzdHJ5LmdldE5vZGVWaXN1YWxJRChjb250YWluZXJWaWV3LAotCQkJCXNlbWFudGljRWxlbWVudCwgc2VtYW50aWNUeXBlLCBzZW1hbnRpY0hpbnQpOwotCQlzd2l0Y2ggKG5vZGVWSUQpIHsKLQkJY2FzZSBBY3Rpdml0eUZpbmFsTm9kZUVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCXJldHVybiBBY3Rpdml0eUZpbmFsTm9kZVZpZXdGYWN0b3J5LmNsYXNzOwotCQljYXNlIEFjdGl2aXR5RmluYWxOb2RlTmFtZUVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCXJldHVybiBBY3Rpdml0eUZpbmFsTm9kZU5hbWVWaWV3RmFjdG9yeS5jbGFzczsKLQkJY2FzZSBNZXJnZU5vZGVFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQlyZXR1cm4gTWVyZ2VOb2RlVmlld0ZhY3RvcnkuY2xhc3M7Ci0JCWNhc2UgTWVyZ2VOb2RlTmFtZUVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCXJldHVybiBNZXJnZU5vZGVOYW1lVmlld0ZhY3RvcnkuY2xhc3M7Ci0JCWNhc2UgRm9ya05vZGVFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQlyZXR1cm4gRm9ya05vZGVWaWV3RmFjdG9yeS5jbGFzczsKLQkJY2FzZSBJbml0aWFsTm9kZUVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCXJldHVybiBJbml0aWFsTm9kZVZpZXdGYWN0b3J5LmNsYXNzOwotCQljYXNlIEluaXRpYWxOb2RlTmFtZUVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCXJldHVybiBJbml0aWFsTm9kZU5hbWVWaWV3RmFjdG9yeS5jbGFzczsKLQkJY2FzZSBEZWNpc2lvbk5vZGVFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQlyZXR1cm4gRGVjaXNpb25Ob2RlVmlld0ZhY3RvcnkuY2xhc3M7Ci0JCWNhc2UgRGVjaXNpb25Ob2RlTmFtZUVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCXJldHVybiBEZWNpc2lvbk5vZGVOYW1lVmlld0ZhY3RvcnkuY2xhc3M7Ci0JCWNhc2UgSm9pbk5vZGVFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQlyZXR1cm4gSm9pbk5vZGVWaWV3RmFjdG9yeS5jbGFzczsKLQkJY2FzZSBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJcmV0dXJuIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVWaWV3RmFjdG9yeS5jbGFzczsKLQkJY2FzZSBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZUVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCXJldHVybiBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZVZpZXdGYWN0b3J5LmNsYXNzOwotCQljYXNlIEFjdGl2aXR5UGFydGl0aW9uRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJcmV0dXJuIEFjdGl2aXR5UGFydGl0aW9uVmlld0ZhY3RvcnkuY2xhc3M7Ci0JCWNhc2UgQWN0aXZpdHlQYXJ0aXRpb25OYW1lMkVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCXJldHVybiBBY3Rpdml0eVBhcnRpdGlvbk5hbWUyVmlld0ZhY3RvcnkuY2xhc3M7Ci0JCWNhc2UgQWN0aXZpdHlQYXJhbWV0ZXJOb2RlRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJcmV0dXJuIEFjdGl2aXR5UGFyYW1ldGVyTm9kZVZpZXdGYWN0b3J5LmNsYXNzOwotCQljYXNlIEFjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWVFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQlyZXR1cm4gQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZVZpZXdGYWN0b3J5LmNsYXNzOwotCQljYXNlIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUyRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJcmV0dXJuIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUyVmlld0ZhY3RvcnkuY2xhc3M7Ci0JCWNhc2UgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWUyRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJcmV0dXJuIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVOYW1lMlZpZXdGYWN0b3J5LmNsYXNzOwotCQljYXNlIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUzRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJcmV0dXJuIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUzVmlld0ZhY3RvcnkuY2xhc3M7Ci0JCWNhc2UgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWUzRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJcmV0dXJuIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVOYW1lM1ZpZXdGYWN0b3J5LmNsYXNzOwotCQljYXNlIEFjdGl2aXR5UGFyYW1ldGVyTm9kZTJFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQlyZXR1cm4gQWN0aXZpdHlQYXJhbWV0ZXJOb2RlMlZpZXdGYWN0b3J5LmNsYXNzOwotCQljYXNlIEFjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWUyRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJcmV0dXJuIEFjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWUyVmlld0ZhY3RvcnkuY2xhc3M7Ci0JCWNhc2UgQWN0aXZpdHlQYXJ0aXRpb24yRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJcmV0dXJuIEFjdGl2aXR5UGFydGl0aW9uMlZpZXdGYWN0b3J5LmNsYXNzOwotCQljYXNlIEFjdGl2aXR5UGFydGl0aW9uTmFtZUVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCXJldHVybiBBY3Rpdml0eVBhcnRpdGlvbk5hbWVWaWV3RmFjdG9yeS5jbGFzczsKLQkJY2FzZSBBY3Rpdml0eVBhcnRpdGlvblBhcnRpdGlvbkNhbXBhcnRtZW50RWRpdFBhcnQuVklTVUFMX0lEOgotCQkJcmV0dXJuIEFjdGl2aXR5UGFydGl0aW9uUGFydGl0aW9uQ2FtcGFydG1lbnRWaWV3RmFjdG9yeS5jbGFzczsKLQkJY2FzZSBBY3Rpdml0eVBhcnRpdGlvblBhcnRpdGlvbkNhbXBhcnRtZW50MkVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCXJldHVybiBBY3Rpdml0eVBhcnRpdGlvblBhcnRpdGlvbkNhbXBhcnRtZW50MlZpZXdGYWN0b3J5LmNsYXNzOwotCQljYXNlIENvbnRyb2xGbG93TmFtZUVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCXJldHVybiBDb250cm9sRmxvd05hbWVWaWV3RmFjdG9yeS5jbGFzczsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENsYXNzIGdldEVkZ2VWaWV3Q2xhc3MoSUFkYXB0YWJsZSBzZW1hbnRpY0FkYXB0ZXIsCi0JCQlWaWV3IGNvbnRhaW5lclZpZXcsIFN0cmluZyBzZW1hbnRpY0hpbnQpIHsKLQkJSUVsZW1lbnRUeXBlIGVsZW1lbnRUeXBlID0gZ2V0U2VtYW50aWNFbGVtZW50VHlwZShzZW1hbnRpY0FkYXB0ZXIpOwotCQlpZiAoZWxlbWVudFR5cGUgIT0gbnVsbAotCQkJCSYmICFVTUxFbGVtZW50VHlwZXMuaXNLbm93bkVsZW1lbnRUeXBlKGVsZW1lbnRUeXBlKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJRUNsYXNzIHNlbWFudGljVHlwZSA9IGdldFNlbWFudGljRUNsYXNzKHNlbWFudGljQWRhcHRlcik7Ci0JCWlmIChzZW1hbnRpY1R5cGUgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJRU9iamVjdCBzZW1hbnRpY0VsZW1lbnQgPSBnZXRTZW1hbnRpY0VsZW1lbnQoc2VtYW50aWNBZGFwdGVyKTsKLQkJaW50IGxpbmtWSUQgPSBVTUxWaXN1YWxJRFJlZ2lzdHJ5LmdldExpbmtXaXRoQ2xhc3NWaXN1YWxJRCgKLQkJCQlzZW1hbnRpY0VsZW1lbnQsIHNlbWFudGljVHlwZSk7Ci0JCXN3aXRjaCAobGlua1ZJRCkgewotCQljYXNlIENvbnRyb2xGbG93RWRpdFBhcnQuVklTVUFMX0lEOgotCQkJcmV0dXJuIENvbnRyb2xGbG93Vmlld0ZhY3RvcnkuY2xhc3M7Ci0JCX0KLQkJcmV0dXJuIGdldFVucmVjb2duaXplZENvbm5lY3RvclZpZXdDbGFzcyhzZW1hbnRpY0FkYXB0ZXIsCi0JCQkJY29udGFpbmVyVmlldywgc2VtYW50aWNIaW50KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBJRWxlbWVudFR5cGUgZ2V0U2VtYW50aWNFbGVtZW50VHlwZShJQWRhcHRhYmxlIHNlbWFudGljQWRhcHRlcikgewotCQlpZiAoc2VtYW50aWNBZGFwdGVyID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiAoSUVsZW1lbnRUeXBlKSBzZW1hbnRpY0FkYXB0ZXIuZ2V0QWRhcHRlcihJRWxlbWVudFR5cGUuY2xhc3MpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIENsYXNzIGdldFVucmVjb2duaXplZENvbm5lY3RvclZpZXdDbGFzcyhJQWRhcHRhYmxlIHNlbWFudGljQWRhcHRlciwKLQkJCVZpZXcgY29udGFpbmVyVmlldywgU3RyaW5nIHNlbWFudGljSGludCkgewotCQkvLyBIYW5kbGUgdW5yZWNvZ25pemVkIGNoaWxkIG5vZGUgY2xhc3NlcyBoZXJlCi0JCXJldHVybiBudWxsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL3ZpZXcvZmFjdG9yaWVzL0FjdGl2aXR5RmluYWxOb2RlTmFtZVZpZXdGYWN0b3J5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvdmlldy9mYWN0b3JpZXMvQWN0aXZpdHlGaW5hbE5vZGVOYW1lVmlld0ZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDhmMDZmMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvdmlldy9mYWN0b3JpZXMvQWN0aXZpdHlGaW5hbE5vZGVOYW1lVmlld0ZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQudmlldy5mYWN0b3JpZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5wcmVmZXJlbmNlcy5QcmVmZXJlbmNlc0hpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS52aWV3LmZhY3Rvcmllcy5BYnN0cmFjdExhYmVsVmlld0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkudXRpbC5NZWFzdXJlbWVudFVuaXRIZWxwZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkubWFwbW9kZS5JTWFwTW9kZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkxvY2F0aW9uOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXR5RmluYWxOb2RlTmFtZVZpZXdGYWN0b3J5IGV4dGVuZHMgQWJzdHJhY3RMYWJlbFZpZXdGYWN0b3J5IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVmlldyBjcmVhdGVWaWV3KElBZGFwdGFibGUgc2VtYW50aWNBZGFwdGVyLCBWaWV3IGNvbnRhaW5lclZpZXcsCi0JCQlTdHJpbmcgc2VtYW50aWNIaW50LCBpbnQgaW5kZXgsIGJvb2xlYW4gcGVyc2lzdGVkLAotCQkJUHJlZmVyZW5jZXNIaW50IHByZWZlcmVuY2VzSGludCkgewotCQlOb2RlIHZpZXcgPSAoTm9kZSkgc3VwZXIuY3JlYXRlVmlldyhzZW1hbnRpY0FkYXB0ZXIsIGNvbnRhaW5lclZpZXcsCi0JCQkJc2VtYW50aWNIaW50LCBpbmRleCwgcGVyc2lzdGVkLCBwcmVmZXJlbmNlc0hpbnQpOwotCQlMb2NhdGlvbiBsb2NhdGlvbiA9IChMb2NhdGlvbikgdmlldy5nZXRMYXlvdXRDb25zdHJhaW50KCk7Ci0JCUlNYXBNb2RlIG1hcE1vZGUgPSBNZWFzdXJlbWVudFVuaXRIZWxwZXIuZ2V0TWFwTW9kZShjb250YWluZXJWaWV3Ci0JCQkJLmdldERpYWdyYW0oKS5nZXRNZWFzdXJlbWVudFVuaXQoKSk7Ci0JCWxvY2F0aW9uLnNldFgobWFwTW9kZS5EUHRvTFAoMCkpOwotCQlsb2NhdGlvbi5zZXRZKG1hcE1vZGUuRFB0b0xQKDUpKTsKLQkJcmV0dXJuIHZpZXc7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBMaXN0IGNyZWF0ZVN0eWxlcyhWaWV3IHZpZXcpIHsKLQkJTGlzdCBzdHlsZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXJldHVybiBzdHlsZXM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL3ZpZXcvZmFjdG9yaWVzL0FjdGl2aXR5RmluYWxOb2RlVmlld0ZhY3RvcnkuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC92aWV3L2ZhY3Rvcmllcy9BY3Rpdml0eUZpbmFsTm9kZVZpZXdGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0MmQ3NmEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL3ZpZXcvZmFjdG9yaWVzL0FjdGl2aXR5RmluYWxOb2RlVmlld0ZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQudmlldy5mYWN0b3JpZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVjb3JlRmFjdG9yeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuQWN0aXZpdHlFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLkFjdGl2aXR5RmluYWxOb2RlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5BY3Rpdml0eUZpbmFsTm9kZU5hbWVFZGl0UGFydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnBhcnQuVU1MVmlzdWFsSURSZWdpc3RyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS51dGlsLlZpZXdVdGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS52aWV3LmZhY3Rvcmllcy5BYnN0cmFjdFNoYXBlVmlld0ZhY3Rvcnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob3RhdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eUZpbmFsTm9kZVZpZXdGYWN0b3J5IGV4dGVuZHMgQWJzdHJhY3RTaGFwZVZpZXdGYWN0b3J5IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgCi0JICovCi0JcHJvdGVjdGVkIExpc3QgY3JlYXRlU3R5bGVzKFZpZXcgdmlldykgewotCQlMaXN0IHN0eWxlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJc3R5bGVzLmFkZChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZvbnRTdHlsZSgpKTsKLQkJc3R5bGVzLmFkZChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZURlc2NyaXB0aW9uU3R5bGUoKSk7Ci0JCXN0eWxlcy5hZGQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGaWxsU3R5bGUoKSk7Ci0JCXN0eWxlcy5hZGQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVMaW5lU3R5bGUoKSk7Ci0JCXJldHVybiBzdHlsZXM7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRlY29yYXRlVmlldyhWaWV3IGNvbnRhaW5lclZpZXcsIFZpZXcgdmlldywKLQkJCUlBZGFwdGFibGUgc2VtYW50aWNBZGFwdGVyLCBTdHJpbmcgc2VtYW50aWNIaW50LCBpbnQgaW5kZXgsCi0JCQlib29sZWFuIHBlcnNpc3RlZCkgewotCQlpZiAoc2VtYW50aWNIaW50ID09IG51bGwpIHsKLQkJCXNlbWFudGljSGludCA9IFVNTFZpc3VhbElEUmVnaXN0cnkKLQkJCQkJLmdldFR5cGUoQWN0aXZpdHlGaW5hbE5vZGVFZGl0UGFydC5WSVNVQUxfSUQpOwotCQkJdmlldy5zZXRUeXBlKHNlbWFudGljSGludCk7Ci0JCX0KLQkJc3VwZXIuZGVjb3JhdGVWaWV3KGNvbnRhaW5lclZpZXcsIHZpZXcsIHNlbWFudGljQWRhcHRlciwgc2VtYW50aWNIaW50LAotCQkJCWluZGV4LCBwZXJzaXN0ZWQpOwotCQlpZiAoIUFjdGl2aXR5RWRpdFBhcnQuTU9ERUxfSUQuZXF1YWxzKFVNTFZpc3VhbElEUmVnaXN0cnkKLQkJCQkuZ2V0TW9kZWxJRChjb250YWluZXJWaWV3KSkpIHsKLQkJCUVBbm5vdGF0aW9uIHNob3J0Y3V0QW5ub3RhdGlvbiA9IEVjb3JlRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkJLmNyZWF0ZUVBbm5vdGF0aW9uKCk7Ci0JCQlzaG9ydGN1dEFubm90YXRpb24uc2V0U291cmNlKCJTaG9ydGN1dCIpOyAvLyROT04tTkxTLTEkCi0JCQlzaG9ydGN1dEFubm90YXRpb24uZ2V0RGV0YWlscygpLnB1dCgKLQkJCQkJIm1vZGVsSUQiLCBBY3Rpdml0eUVkaXRQYXJ0Lk1PREVMX0lEKTsgLy8kTk9OLU5MUy0xJAotCQkJdmlldy5nZXRFQW5ub3RhdGlvbnMoKS5hZGQoc2hvcnRjdXRBbm5vdGF0aW9uKTsKLQkJfQotCQlnZXRWaWV3U2VydmljZSgpLmNyZWF0ZU5vZGUoCi0JCQkJc2VtYW50aWNBZGFwdGVyLAotCQkJCXZpZXcsCi0JCQkJVU1MVmlzdWFsSURSZWdpc3RyeQotCQkJCQkJLmdldFR5cGUoQWN0aXZpdHlGaW5hbE5vZGVOYW1lRWRpdFBhcnQuVklTVUFMX0lEKSwKLQkJCQlWaWV3VXRpbC5BUFBFTkQsIHRydWUsIGdldFByZWZlcmVuY2VzSGludCgpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC92aWV3L2ZhY3Rvcmllcy9BY3Rpdml0eVBhcmFtZXRlck5vZGUyVmlld0ZhY3RvcnkuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC92aWV3L2ZhY3Rvcmllcy9BY3Rpdml0eVBhcmFtZXRlck5vZGUyVmlld0ZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjZlZWI5Ni4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvdmlldy9mYWN0b3JpZXMvQWN0aXZpdHlQYXJhbWV0ZXJOb2RlMlZpZXdGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnZpZXcuZmFjdG9yaWVzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FY29yZUZhY3Rvcnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLkFjdGl2aXR5RWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5BY3Rpdml0eVBhcmFtZXRlck5vZGUyRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5BY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lMkVkaXRQYXJ0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQucGFydC5VTUxWaXN1YWxJRFJlZ2lzdHJ5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLnV0aWwuVmlld1V0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnZpZXcuZmFjdG9yaWVzLkFic3RyYWN0U2hhcGVWaWV3RmFjdG9yeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vdGF0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXR5UGFyYW1ldGVyTm9kZTJWaWV3RmFjdG9yeSBleHRlbmRzIEFic3RyYWN0U2hhcGVWaWV3RmFjdG9yeSB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIAotCSAqLwotCXByb3RlY3RlZCBMaXN0IGNyZWF0ZVN0eWxlcyhWaWV3IHZpZXcpIHsKLQkJTGlzdCBzdHlsZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXN0eWxlcy5hZGQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGb250U3R5bGUoKSk7Ci0JCXN0eWxlcy5hZGQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVEZXNjcmlwdGlvblN0eWxlKCkpOwotCQlzdHlsZXMuYWRkKE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRmlsbFN0eWxlKCkpOwotCQlzdHlsZXMuYWRkKE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlTGluZVN0eWxlKCkpOwotCQlyZXR1cm4gc3R5bGVzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkZWNvcmF0ZVZpZXcoVmlldyBjb250YWluZXJWaWV3LCBWaWV3IHZpZXcsCi0JCQlJQWRhcHRhYmxlIHNlbWFudGljQWRhcHRlciwgU3RyaW5nIHNlbWFudGljSGludCwgaW50IGluZGV4LAotCQkJYm9vbGVhbiBwZXJzaXN0ZWQpIHsKLQkJaWYgKHNlbWFudGljSGludCA9PSBudWxsKSB7Ci0JCQlzZW1hbnRpY0hpbnQgPSBVTUxWaXN1YWxJRFJlZ2lzdHJ5Ci0JCQkJCS5nZXRUeXBlKEFjdGl2aXR5UGFyYW1ldGVyTm9kZTJFZGl0UGFydC5WSVNVQUxfSUQpOwotCQkJdmlldy5zZXRUeXBlKHNlbWFudGljSGludCk7Ci0JCX0KLQkJc3VwZXIuZGVjb3JhdGVWaWV3KGNvbnRhaW5lclZpZXcsIHZpZXcsIHNlbWFudGljQWRhcHRlciwgc2VtYW50aWNIaW50LAotCQkJCWluZGV4LCBwZXJzaXN0ZWQpOwotCQlpZiAoIUFjdGl2aXR5RWRpdFBhcnQuTU9ERUxfSUQuZXF1YWxzKFVNTFZpc3VhbElEUmVnaXN0cnkKLQkJCQkuZ2V0TW9kZWxJRChjb250YWluZXJWaWV3KSkpIHsKLQkJCUVBbm5vdGF0aW9uIHNob3J0Y3V0QW5ub3RhdGlvbiA9IEVjb3JlRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkJLmNyZWF0ZUVBbm5vdGF0aW9uKCk7Ci0JCQlzaG9ydGN1dEFubm90YXRpb24uc2V0U291cmNlKCJTaG9ydGN1dCIpOyAvLyROT04tTkxTLTEkCi0JCQlzaG9ydGN1dEFubm90YXRpb24uZ2V0RGV0YWlscygpLnB1dCgKLQkJCQkJIm1vZGVsSUQiLCBBY3Rpdml0eUVkaXRQYXJ0Lk1PREVMX0lEKTsgLy8kTk9OLU5MUy0xJAotCQkJdmlldy5nZXRFQW5ub3RhdGlvbnMoKS5hZGQoc2hvcnRjdXRBbm5vdGF0aW9uKTsKLQkJfQotCQlnZXRWaWV3U2VydmljZSgpLmNyZWF0ZU5vZGUoCi0JCQkJc2VtYW50aWNBZGFwdGVyLAotCQkJCXZpZXcsCi0JCQkJVU1MVmlzdWFsSURSZWdpc3RyeQotCQkJCQkJLmdldFR5cGUoQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZTJFZGl0UGFydC5WSVNVQUxfSUQpLAotCQkJCVZpZXdVdGlsLkFQUEVORCwgdHJ1ZSwgZ2V0UHJlZmVyZW5jZXNIaW50KCkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL3ZpZXcvZmFjdG9yaWVzL0FjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWUyVmlld0ZhY3RvcnkuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC92aWV3L2ZhY3Rvcmllcy9BY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lMlZpZXdGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0OGUyNzguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL3ZpZXcvZmFjdG9yaWVzL0FjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWUyVmlld0ZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQudmlldy5mYWN0b3JpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnZpZXcuZmFjdG9yaWVzLkJhc2ljTm9kZVZpZXdGYWN0b3J5OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWUyVmlld0ZhY3RvcnkgZXh0ZW5kcyBCYXNpY05vZGVWaWV3RmFjdG9yeSB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZGVjb3JhdGVWaWV3KFZpZXcgY29udGFpbmVyVmlldywgVmlldyB2aWV3LAotCQkJSUFkYXB0YWJsZSBzZW1hbnRpY0FkYXB0ZXIsIFN0cmluZyBzZW1hbnRpY0hpbnQsIGludCBpbmRleCwKLQkJCWJvb2xlYW4gcGVyc2lzdGVkKSB7Ci0JCXN1cGVyLmRlY29yYXRlVmlldyhjb250YWluZXJWaWV3LCB2aWV3LCBzZW1hbnRpY0FkYXB0ZXIsIHNlbWFudGljSGludCwKLQkJCQlpbmRleCwgcGVyc2lzdGVkKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIExpc3QgY3JlYXRlU3R5bGVzKFZpZXcgdmlldykgewotCQlMaXN0IHN0eWxlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJcmV0dXJuIHN0eWxlczsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvdmlldy9mYWN0b3JpZXMvQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZVZpZXdGYWN0b3J5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvdmlldy9mYWN0b3JpZXMvQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZVZpZXdGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1ZjkwMzkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL3ZpZXcvZmFjdG9yaWVzL0FjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWVWaWV3RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC52aWV3LmZhY3RvcmllczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkudmlldy5mYWN0b3JpZXMuQmFzaWNOb2RlVmlld0ZhY3Rvcnk7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZVZpZXdGYWN0b3J5IGV4dGVuZHMgQmFzaWNOb2RlVmlld0ZhY3RvcnkgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRlY29yYXRlVmlldyhWaWV3IGNvbnRhaW5lclZpZXcsIFZpZXcgdmlldywKLQkJCUlBZGFwdGFibGUgc2VtYW50aWNBZGFwdGVyLCBTdHJpbmcgc2VtYW50aWNIaW50LCBpbnQgaW5kZXgsCi0JCQlib29sZWFuIHBlcnNpc3RlZCkgewotCQlzdXBlci5kZWNvcmF0ZVZpZXcoY29udGFpbmVyVmlldywgdmlldywgc2VtYW50aWNBZGFwdGVyLCBzZW1hbnRpY0hpbnQsCi0JCQkJaW5kZXgsIHBlcnNpc3RlZCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBMaXN0IGNyZWF0ZVN0eWxlcyhWaWV3IHZpZXcpIHsKLQkJTGlzdCBzdHlsZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXJldHVybiBzdHlsZXM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL3ZpZXcvZmFjdG9yaWVzL0FjdGl2aXR5UGFyYW1ldGVyTm9kZVZpZXdGYWN0b3J5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvdmlldy9mYWN0b3JpZXMvQWN0aXZpdHlQYXJhbWV0ZXJOb2RlVmlld0ZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzA0NDUxMS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvdmlldy9mYWN0b3JpZXMvQWN0aXZpdHlQYXJhbWV0ZXJOb2RlVmlld0ZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQudmlldy5mYWN0b3JpZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVjb3JlRmFjdG9yeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuQWN0aXZpdHlFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLkFjdGl2aXR5UGFyYW1ldGVyTm9kZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZUVkaXRQYXJ0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQucGFydC5VTUxWaXN1YWxJRFJlZ2lzdHJ5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLnV0aWwuVmlld1V0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnZpZXcuZmFjdG9yaWVzLkFic3RyYWN0U2hhcGVWaWV3RmFjdG9yeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vdGF0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXR5UGFyYW1ldGVyTm9kZVZpZXdGYWN0b3J5IGV4dGVuZHMgQWJzdHJhY3RTaGFwZVZpZXdGYWN0b3J5IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgCi0JICovCi0JcHJvdGVjdGVkIExpc3QgY3JlYXRlU3R5bGVzKFZpZXcgdmlldykgewotCQlMaXN0IHN0eWxlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJc3R5bGVzLmFkZChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZvbnRTdHlsZSgpKTsKLQkJc3R5bGVzLmFkZChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZURlc2NyaXB0aW9uU3R5bGUoKSk7Ci0JCXN0eWxlcy5hZGQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGaWxsU3R5bGUoKSk7Ci0JCXN0eWxlcy5hZGQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVMaW5lU3R5bGUoKSk7Ci0JCXJldHVybiBzdHlsZXM7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRlY29yYXRlVmlldyhWaWV3IGNvbnRhaW5lclZpZXcsIFZpZXcgdmlldywKLQkJCUlBZGFwdGFibGUgc2VtYW50aWNBZGFwdGVyLCBTdHJpbmcgc2VtYW50aWNIaW50LCBpbnQgaW5kZXgsCi0JCQlib29sZWFuIHBlcnNpc3RlZCkgewotCQlpZiAoc2VtYW50aWNIaW50ID09IG51bGwpIHsKLQkJCXNlbWFudGljSGludCA9IFVNTFZpc3VhbElEUmVnaXN0cnkKLQkJCQkJLmdldFR5cGUoQWN0aXZpdHlQYXJhbWV0ZXJOb2RlRWRpdFBhcnQuVklTVUFMX0lEKTsKLQkJCXZpZXcuc2V0VHlwZShzZW1hbnRpY0hpbnQpOwotCQl9Ci0JCXN1cGVyLmRlY29yYXRlVmlldyhjb250YWluZXJWaWV3LCB2aWV3LCBzZW1hbnRpY0FkYXB0ZXIsIHNlbWFudGljSGludCwKLQkJCQlpbmRleCwgcGVyc2lzdGVkKTsKLQkJaWYgKCFBY3Rpdml0eUVkaXRQYXJ0Lk1PREVMX0lELmVxdWFscyhVTUxWaXN1YWxJRFJlZ2lzdHJ5Ci0JCQkJLmdldE1vZGVsSUQoY29udGFpbmVyVmlldykpKSB7Ci0JCQlFQW5ub3RhdGlvbiBzaG9ydGN1dEFubm90YXRpb24gPSBFY29yZUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJCS5jcmVhdGVFQW5ub3RhdGlvbigpOwotCQkJc2hvcnRjdXRBbm5vdGF0aW9uLnNldFNvdXJjZSgiU2hvcnRjdXQiKTsgLy8kTk9OLU5MUy0xJAotCQkJc2hvcnRjdXRBbm5vdGF0aW9uLmdldERldGFpbHMoKS5wdXQoCi0JCQkJCSJtb2RlbElEIiwgQWN0aXZpdHlFZGl0UGFydC5NT0RFTF9JRCk7IC8vJE5PTi1OTFMtMSQKLQkJCXZpZXcuZ2V0RUFubm90YXRpb25zKCkuYWRkKHNob3J0Y3V0QW5ub3RhdGlvbik7Ci0JCX0KLQkJZ2V0Vmlld1NlcnZpY2UoKS5jcmVhdGVOb2RlKAotCQkJCXNlbWFudGljQWRhcHRlciwKLQkJCQl2aWV3LAotCQkJCVVNTFZpc3VhbElEUmVnaXN0cnkKLQkJCQkJCS5nZXRUeXBlKEFjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWVFZGl0UGFydC5WSVNVQUxfSUQpLAotCQkJCVZpZXdVdGlsLkFQUEVORCwgdHJ1ZSwgZ2V0UHJlZmVyZW5jZXNIaW50KCkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL3ZpZXcvZmFjdG9yaWVzL0FjdGl2aXR5UGFydGl0aW9uMlZpZXdGYWN0b3J5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvdmlldy9mYWN0b3JpZXMvQWN0aXZpdHlQYXJ0aXRpb24yVmlld0ZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2E5OTJiZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvdmlldy9mYWN0b3JpZXMvQWN0aXZpdHlQYXJ0aXRpb24yVmlld0ZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQudmlldy5mYWN0b3JpZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVjb3JlRmFjdG9yeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuQWN0aXZpdHlFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLkFjdGl2aXR5UGFydGl0aW9uMkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuQWN0aXZpdHlQYXJ0aXRpb25OYW1lRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5BY3Rpdml0eVBhcnRpdGlvblBhcnRpdGlvbkNhbXBhcnRtZW50MkVkaXRQYXJ0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQucGFydC5VTUxWaXN1YWxJRFJlZ2lzdHJ5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLnV0aWwuVmlld1V0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnZpZXcuZmFjdG9yaWVzLkFic3RyYWN0U2hhcGVWaWV3RmFjdG9yeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vdGF0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXR5UGFydGl0aW9uMlZpZXdGYWN0b3J5IGV4dGVuZHMgQWJzdHJhY3RTaGFwZVZpZXdGYWN0b3J5IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgCi0JICovCi0JcHJvdGVjdGVkIExpc3QgY3JlYXRlU3R5bGVzKFZpZXcgdmlldykgewotCQlMaXN0IHN0eWxlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJc3R5bGVzLmFkZChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZvbnRTdHlsZSgpKTsKLQkJc3R5bGVzLmFkZChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZURlc2NyaXB0aW9uU3R5bGUoKSk7Ci0JCXN0eWxlcy5hZGQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGaWxsU3R5bGUoKSk7Ci0JCXN0eWxlcy5hZGQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVMaW5lU3R5bGUoKSk7Ci0JCXJldHVybiBzdHlsZXM7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRlY29yYXRlVmlldyhWaWV3IGNvbnRhaW5lclZpZXcsIFZpZXcgdmlldywKLQkJCUlBZGFwdGFibGUgc2VtYW50aWNBZGFwdGVyLCBTdHJpbmcgc2VtYW50aWNIaW50LCBpbnQgaW5kZXgsCi0JCQlib29sZWFuIHBlcnNpc3RlZCkgewotCQlpZiAoc2VtYW50aWNIaW50ID09IG51bGwpIHsKLQkJCXNlbWFudGljSGludCA9IFVNTFZpc3VhbElEUmVnaXN0cnkKLQkJCQkJLmdldFR5cGUoQWN0aXZpdHlQYXJ0aXRpb24yRWRpdFBhcnQuVklTVUFMX0lEKTsKLQkJCXZpZXcuc2V0VHlwZShzZW1hbnRpY0hpbnQpOwotCQl9Ci0JCXN1cGVyLmRlY29yYXRlVmlldyhjb250YWluZXJWaWV3LCB2aWV3LCBzZW1hbnRpY0FkYXB0ZXIsIHNlbWFudGljSGludCwKLQkJCQlpbmRleCwgcGVyc2lzdGVkKTsKLQkJaWYgKCFBY3Rpdml0eUVkaXRQYXJ0Lk1PREVMX0lELmVxdWFscyhVTUxWaXN1YWxJRFJlZ2lzdHJ5Ci0JCQkJLmdldE1vZGVsSUQoY29udGFpbmVyVmlldykpKSB7Ci0JCQlFQW5ub3RhdGlvbiBzaG9ydGN1dEFubm90YXRpb24gPSBFY29yZUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJCS5jcmVhdGVFQW5ub3RhdGlvbigpOwotCQkJc2hvcnRjdXRBbm5vdGF0aW9uLnNldFNvdXJjZSgiU2hvcnRjdXQiKTsgLy8kTk9OLU5MUy0xJAotCQkJc2hvcnRjdXRBbm5vdGF0aW9uLmdldERldGFpbHMoKS5wdXQoCi0JCQkJCSJtb2RlbElEIiwgQWN0aXZpdHlFZGl0UGFydC5NT0RFTF9JRCk7IC8vJE5PTi1OTFMtMSQKLQkJCXZpZXcuZ2V0RUFubm90YXRpb25zKCkuYWRkKHNob3J0Y3V0QW5ub3RhdGlvbik7Ci0JCX0KLQkJZ2V0Vmlld1NlcnZpY2UoKS5jcmVhdGVOb2RlKAotCQkJCXNlbWFudGljQWRhcHRlciwKLQkJCQl2aWV3LAotCQkJCVVNTFZpc3VhbElEUmVnaXN0cnkKLQkJCQkJCS5nZXRUeXBlKEFjdGl2aXR5UGFydGl0aW9uTmFtZUVkaXRQYXJ0LlZJU1VBTF9JRCksCi0JCQkJVmlld1V0aWwuQVBQRU5ELCB0cnVlLCBnZXRQcmVmZXJlbmNlc0hpbnQoKSk7Ci0JCWdldFZpZXdTZXJ2aWNlKCkKLQkJCQkuY3JlYXRlTm9kZSgKLQkJCQkJCXNlbWFudGljQWRhcHRlciwKLQkJCQkJCXZpZXcsCi0JCQkJCQlVTUxWaXN1YWxJRFJlZ2lzdHJ5Ci0JCQkJCQkJCS5nZXRUeXBlKEFjdGl2aXR5UGFydGl0aW9uUGFydGl0aW9uQ2FtcGFydG1lbnQyRWRpdFBhcnQuVklTVUFMX0lEKSwKLQkJCQkJCVZpZXdVdGlsLkFQUEVORCwgdHJ1ZSwgZ2V0UHJlZmVyZW5jZXNIaW50KCkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL3ZpZXcvZmFjdG9yaWVzL0FjdGl2aXR5UGFydGl0aW9uTmFtZTJWaWV3RmFjdG9yeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL3ZpZXcvZmFjdG9yaWVzL0FjdGl2aXR5UGFydGl0aW9uTmFtZTJWaWV3RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNjIxNDJjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC92aWV3L2ZhY3Rvcmllcy9BY3Rpdml0eVBhcnRpdGlvbk5hbWUyVmlld0ZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQudmlldy5mYWN0b3JpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Mb2NhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5wcmVmZXJlbmNlcy5QcmVmZXJlbmNlc0hpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS51dGlsLk1lYXN1cmVtZW50VW5pdEhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnZpZXcuZmFjdG9yaWVzLkFic3RyYWN0U2hhcGVWaWV3RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkubWFwbW9kZS5JTWFwTW9kZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vdGF0aW9uRmFjdG9yeTsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eVBhcnRpdGlvbk5hbWUyVmlld0ZhY3RvcnkgZXh0ZW5kcyBBYnN0cmFjdFNoYXBlVmlld0ZhY3RvcnkgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRlY29yYXRlVmlldyhWaWV3IGNvbnRhaW5lclZpZXcsIFZpZXcgdmlldywKLQkJCUlBZGFwdGFibGUgc2VtYW50aWNBZGFwdGVyLCBTdHJpbmcgc2VtYW50aWNIaW50LCBpbnQgaW5kZXgsCi0JCQlib29sZWFuIHBlcnNpc3RlZCkgewotCQlzdXBlci5kZWNvcmF0ZVZpZXcoY29udGFpbmVyVmlldywgdmlldywgc2VtYW50aWNBZGFwdGVyLCBzZW1hbnRpY0hpbnQsCi0JCQkJaW5kZXgsIHBlcnNpc3RlZCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBMaXN0IGNyZWF0ZVN0eWxlcyhWaWV3IHZpZXcpIHsKLQkJTGlzdCBzdHlsZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXN0eWxlcy5hZGQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVEZXNjcmlwdGlvblN0eWxlKCkpOwotCQlzdHlsZXMuYWRkKE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRmlsbFN0eWxlKCkpOwotCQlzdHlsZXMuYWRkKE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlTGluZVN0eWxlKCkpOwotCQlzdHlsZXMuYWRkKE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRm9udFN0eWxlKCkpOwotCQlyZXR1cm4gc3R5bGVzOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS52aWV3LmZhY3Rvcmllcy5CYXNpY05vZGVWaWV3RmFjdG9yeSNjcmVhdGVWaWV3KG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlLCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3LCBqYXZhLmxhbmcuU3RyaW5nLCBpbnQsIGJvb2xlYW4sIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5wcmVmZXJlbmNlcy5QcmVmZXJlbmNlc0hpbnQpCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHVibGljIFZpZXcgY3JlYXRlVmlldyhJQWRhcHRhYmxlIHNlbWFudGljQWRhcHRlciwgVmlldyBjb250YWluZXJWaWV3LAotCQkJU3RyaW5nIHNlbWFudGljSGludCwgaW50IGluZGV4LCBib29sZWFuIHBlcnNpc3RlZCwKLQkJCVByZWZlcmVuY2VzSGludCBwcmVmZXJlbmNlc0hpbnQpIHsKLQkJTm9kZSB2aWV3ID0gKE5vZGUpIHN1cGVyLmNyZWF0ZVZpZXcoc2VtYW50aWNBZGFwdGVyLCBjb250YWluZXJWaWV3LAotCQkJCXNlbWFudGljSGludCwgaW5kZXgsIHBlcnNpc3RlZCwgcHJlZmVyZW5jZXNIaW50KTsKLQkJTG9jYXRpb24gbG9jYXRpb24gPSAoTG9jYXRpb24pIHZpZXcuZ2V0TGF5b3V0Q29uc3RyYWludCgpOwotCQlJTWFwTW9kZSBtYXBNb2RlID0gTWVhc3VyZW1lbnRVbml0SGVscGVyLmdldE1hcE1vZGUoY29udGFpbmVyVmlldwotCQkJCS5nZXREaWFncmFtKCkuZ2V0TWVhc3VyZW1lbnRVbml0KCkpOwotCQlsb2NhdGlvbi5zZXRYKG1hcE1vZGUuRFB0b0xQKDApKTsKLQkJbG9jYXRpb24uc2V0WShtYXBNb2RlLkRQdG9MUCg1KSk7Ci0JCXJldHVybiB2aWV3OwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC92aWV3L2ZhY3Rvcmllcy9BY3Rpdml0eVBhcnRpdGlvbk5hbWVWaWV3RmFjdG9yeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL3ZpZXcvZmFjdG9yaWVzL0FjdGl2aXR5UGFydGl0aW9uTmFtZVZpZXdGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyNDYzOGIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL3ZpZXcvZmFjdG9yaWVzL0FjdGl2aXR5UGFydGl0aW9uTmFtZVZpZXdGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnZpZXcuZmFjdG9yaWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS52aWV3LmZhY3Rvcmllcy5BYnN0cmFjdFNoYXBlVmlld0ZhY3Rvcnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob3RhdGlvbkZhY3Rvcnk7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZpdHlQYXJ0aXRpb25OYW1lVmlld0ZhY3RvcnkgZXh0ZW5kcyBBYnN0cmFjdFNoYXBlVmlld0ZhY3RvcnkgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRlY29yYXRlVmlldyhWaWV3IGNvbnRhaW5lclZpZXcsIFZpZXcgdmlldywKLQkJCUlBZGFwdGFibGUgc2VtYW50aWNBZGFwdGVyLCBTdHJpbmcgc2VtYW50aWNIaW50LCBpbnQgaW5kZXgsCi0JCQlib29sZWFuIHBlcnNpc3RlZCkgewotCQlzdXBlci5kZWNvcmF0ZVZpZXcoY29udGFpbmVyVmlldywgdmlldywgc2VtYW50aWNBZGFwdGVyLCBzZW1hbnRpY0hpbnQsCi0JCQkJaW5kZXgsIHBlcnNpc3RlZCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBMaXN0IGNyZWF0ZVN0eWxlcyhWaWV3IHZpZXcpIHsKLQkJTGlzdCBzdHlsZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXN0eWxlcy5hZGQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVEZXNjcmlwdGlvblN0eWxlKCkpOwotCQlzdHlsZXMuYWRkKE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRmlsbFN0eWxlKCkpOwotCQlzdHlsZXMuYWRkKE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlTGluZVN0eWxlKCkpOwotCQlzdHlsZXMuYWRkKE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRm9udFN0eWxlKCkpOwotCQlyZXR1cm4gc3R5bGVzOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC92aWV3L2ZhY3Rvcmllcy9BY3Rpdml0eVBhcnRpdGlvblBhcnRpdGlvbkNhbXBhcnRtZW50MlZpZXdGYWN0b3J5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvdmlldy9mYWN0b3JpZXMvQWN0aXZpdHlQYXJ0aXRpb25QYXJ0aXRpb25DYW1wYXJ0bWVudDJWaWV3RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNDE1NTYwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC92aWV3L2ZhY3Rvcmllcy9BY3Rpdml0eVBhcnRpdGlvblBhcnRpdGlvbkNhbXBhcnRtZW50MlZpZXdGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC52aWV3LmZhY3RvcmllczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRWNvcmVGYWN0b3J5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5BY3Rpdml0eUVkaXRQYXJ0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5BY3Rpdml0eVBhcnRpdGlvblBhcnRpdGlvbkNhbXBhcnRtZW50MkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnBhcnQuVU1MVmlzdWFsSURSZWdpc3RyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS51dGlsLlZpZXdVdGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wcmVmZXJlbmNlcy5JUHJlZmVyZW5jZUNvbnN0YW50czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkudmlldy5mYWN0b3JpZXMuTGlzdENvbXBhcnRtZW50Vmlld0ZhY3Rvcnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5GaWd1cmVVdGlsaXRpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5EcmF3ZXJTdHlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5MYXlvdXRDb25zdHJhaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vdGF0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob3RhdGlvblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVGl0bGVTdHlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZUNvbnZlcnRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SR0I7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZpdHlQYXJ0aXRpb25QYXJ0aXRpb25DYW1wYXJ0bWVudDJWaWV3RmFjdG9yeSBleHRlbmRzCi0JCUxpc3RDb21wYXJ0bWVudFZpZXdGYWN0b3J5IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgCi0JICovCi0JcHJvdGVjdGVkIExpc3QgY3JlYXRlU3R5bGVzKFZpZXcgdmlldykgewotCQlMaXN0IHN0eWxlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJc3R5bGVzLmFkZChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVNvcnRpbmdTdHlsZSgpKTsKLQkJc3R5bGVzLmFkZChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZpbHRlcmluZ1N0eWxlKCkpOwotCQlzdHlsZXMuYWRkKE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRm9udFN0eWxlKCkpOwotCQlzdHlsZXMuYWRkKE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRGVzY3JpcHRpb25TdHlsZSgpKTsKLQkJc3R5bGVzLmFkZChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZpbGxTdHlsZSgpKTsKLQkJc3R5bGVzLmFkZChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUxpbmVTdHlsZSgpKTsKLQkJcmV0dXJuIHN0eWxlczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZGVjb3JhdGVWaWV3KFZpZXcgY29udGFpbmVyVmlldywgVmlldyB2aWV3LAotCQkJSUFkYXB0YWJsZSBzZW1hbnRpY0FkYXB0ZXIsIFN0cmluZyBzZW1hbnRpY0hpbnQsIGludCBpbmRleCwKLQkJCWJvb2xlYW4gcGVyc2lzdGVkKSB7Ci0JCWlmIChzZW1hbnRpY0hpbnQgPT0gbnVsbCkgewotCQkJc2VtYW50aWNIaW50ID0gVU1MVmlzdWFsSURSZWdpc3RyeQotCQkJCQkuZ2V0VHlwZShBY3Rpdml0eVBhcnRpdGlvblBhcnRpdGlvbkNhbXBhcnRtZW50MkVkaXRQYXJ0LlZJU1VBTF9JRCk7Ci0JCQl2aWV3LnNldFR5cGUoc2VtYW50aWNIaW50KTsKLQkJfQotCQlzdXBlci5kZWNvcmF0ZVZpZXcoY29udGFpbmVyVmlldywgdmlldywgc2VtYW50aWNBZGFwdGVyLCBzZW1hbnRpY0hpbnQsCi0JCQkJaW5kZXgsIHBlcnNpc3RlZCk7Ci0JCXNldHVwQ29tcGFydG1lbnRUaXRsZSh2aWV3KTsKLQkJc2V0dXBDb21wYXJ0bWVudENvbGxhcHNlZCh2aWV3KTsKLQkJaWYgKCFBY3Rpdml0eUVkaXRQYXJ0Lk1PREVMX0lELmVxdWFscyhVTUxWaXN1YWxJRFJlZ2lzdHJ5Ci0JCQkJLmdldE1vZGVsSUQoY29udGFpbmVyVmlldykpKSB7Ci0JCQlFQW5ub3RhdGlvbiBzaG9ydGN1dEFubm90YXRpb24gPSBFY29yZUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJCS5jcmVhdGVFQW5ub3RhdGlvbigpOwotCQkJc2hvcnRjdXRBbm5vdGF0aW9uLnNldFNvdXJjZSgiU2hvcnRjdXQiKTsgLy8kTk9OLU5MUy0xJAotCQkJc2hvcnRjdXRBbm5vdGF0aW9uLmdldERldGFpbHMoKS5wdXQoCi0JCQkJCSJtb2RlbElEIiwgQWN0aXZpdHlFZGl0UGFydC5NT0RFTF9JRCk7IC8vJE5PTi1OTFMtMSQKLQkJCXZpZXcuZ2V0RUFubm90YXRpb25zKCkuYWRkKHNob3J0Y3V0QW5ub3RhdGlvbik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIExheW91dENvbnN0cmFpbnQgY3JlYXRlTGF5b3V0Q29uc3RyYWludCgpIHsKLQkJcmV0dXJuIE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQm91bmRzKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVGcm9tUHJlZmVyZW5jZXMoVmlldyB2aWV3KSB7Ci0JCXN1cGVyLmluaXRpYWxpemVGcm9tUHJlZmVyZW5jZXModmlldyk7Ci0KLQkJSVByZWZlcmVuY2VTdG9yZSBzdG9yZSA9IChJUHJlZmVyZW5jZVN0b3JlKSBnZXRQcmVmZXJlbmNlc0hpbnQoKQotCQkJCS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQotCQkvLyBmaWxsIGNvbG9yCi0JCVJHQiBmaWxsUkdCID0gUHJlZmVyZW5jZUNvbnZlcnRlci5nZXRDb2xvcihzdG9yZSwKLQkJCQlJUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX0ZJTExfQ09MT1IpOwotCQlWaWV3VXRpbC5zZXRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlKHZpZXcsIE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0RmlsbFN0eWxlX0ZpbGxDb2xvcigpLCBGaWd1cmVVdGlsaXRpZXMKLQkJCQkuUkdCVG9JbnRlZ2VyKGZpbGxSR0IpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0dXBDb21wYXJ0bWVudFRpdGxlKFZpZXcgdmlldykgewotCQlUaXRsZVN0eWxlIHRpdGxlU3R5bGUgPSAoVGl0bGVTdHlsZSkgdmlldwotCQkJCS5nZXRTdHlsZShOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldFRpdGxlU3R5bGUoKSk7Ci0JCWlmICh0aXRsZVN0eWxlICE9IG51bGwpIHsKLQkJCXRpdGxlU3R5bGUuc2V0U2hvd1RpdGxlKHRydWUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldHVwQ29tcGFydG1lbnRDb2xsYXBzZWQoVmlldyB2aWV3KSB7Ci0JCURyYXdlclN0eWxlIGRyYXdlclN0eWxlID0gKERyYXdlclN0eWxlKSB2aWV3Ci0JCQkJLmdldFN0eWxlKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RHJhd2VyU3R5bGUoKSk7Ci0JCWlmIChkcmF3ZXJTdHlsZSAhPSBudWxsKSB7Ci0JCQlkcmF3ZXJTdHlsZS5zZXRDb2xsYXBzZWQoZmFsc2UpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvdmlldy9mYWN0b3JpZXMvQWN0aXZpdHlQYXJ0aXRpb25QYXJ0aXRpb25DYW1wYXJ0bWVudFZpZXdGYWN0b3J5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvdmlldy9mYWN0b3JpZXMvQWN0aXZpdHlQYXJ0aXRpb25QYXJ0aXRpb25DYW1wYXJ0bWVudFZpZXdGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0YjIzMjguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL3ZpZXcvZmFjdG9yaWVzL0FjdGl2aXR5UGFydGl0aW9uUGFydGl0aW9uQ2FtcGFydG1lbnRWaWV3RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQudmlldy5mYWN0b3JpZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVjb3JlRmFjdG9yeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuQWN0aXZpdHlFZGl0UGFydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuQWN0aXZpdHlQYXJ0aXRpb25QYXJ0aXRpb25DYW1wYXJ0bWVudEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnBhcnQuVU1MVmlzdWFsSURSZWdpc3RyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS51dGlsLlZpZXdVdGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wcmVmZXJlbmNlcy5JUHJlZmVyZW5jZUNvbnN0YW50czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkudmlldy5mYWN0b3JpZXMuTGlzdENvbXBhcnRtZW50Vmlld0ZhY3Rvcnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5GaWd1cmVVdGlsaXRpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5EcmF3ZXJTdHlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5MYXlvdXRDb25zdHJhaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vdGF0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob3RhdGlvblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVGl0bGVTdHlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZUNvbnZlcnRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SR0I7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZpdHlQYXJ0aXRpb25QYXJ0aXRpb25DYW1wYXJ0bWVudFZpZXdGYWN0b3J5IGV4dGVuZHMKLQkJTGlzdENvbXBhcnRtZW50Vmlld0ZhY3RvcnkgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZCAKLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBjcmVhdGVTdHlsZXMoVmlldyB2aWV3KSB7Ci0JCUxpc3Qgc3R5bGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlzdHlsZXMuYWRkKE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlU29ydGluZ1N0eWxlKCkpOwotCQlzdHlsZXMuYWRkKE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRmlsdGVyaW5nU3R5bGUoKSk7Ci0JCXN0eWxlcy5hZGQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGb250U3R5bGUoKSk7Ci0JCXN0eWxlcy5hZGQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVEZXNjcmlwdGlvblN0eWxlKCkpOwotCQlzdHlsZXMuYWRkKE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRmlsbFN0eWxlKCkpOwotCQlzdHlsZXMuYWRkKE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlTGluZVN0eWxlKCkpOwotCQlyZXR1cm4gc3R5bGVzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkZWNvcmF0ZVZpZXcoVmlldyBjb250YWluZXJWaWV3LCBWaWV3IHZpZXcsCi0JCQlJQWRhcHRhYmxlIHNlbWFudGljQWRhcHRlciwgU3RyaW5nIHNlbWFudGljSGludCwgaW50IGluZGV4LAotCQkJYm9vbGVhbiBwZXJzaXN0ZWQpIHsKLQkJaWYgKHNlbWFudGljSGludCA9PSBudWxsKSB7Ci0JCQlzZW1hbnRpY0hpbnQgPSBVTUxWaXN1YWxJRFJlZ2lzdHJ5Ci0JCQkJCS5nZXRUeXBlKEFjdGl2aXR5UGFydGl0aW9uUGFydGl0aW9uQ2FtcGFydG1lbnRFZGl0UGFydC5WSVNVQUxfSUQpOwotCQkJdmlldy5zZXRUeXBlKHNlbWFudGljSGludCk7Ci0JCX0KLQkJc3VwZXIuZGVjb3JhdGVWaWV3KGNvbnRhaW5lclZpZXcsIHZpZXcsIHNlbWFudGljQWRhcHRlciwgc2VtYW50aWNIaW50LAotCQkJCWluZGV4LCBwZXJzaXN0ZWQpOwotCQlzZXR1cENvbXBhcnRtZW50VGl0bGUodmlldyk7Ci0JCXNldHVwQ29tcGFydG1lbnRDb2xsYXBzZWQodmlldyk7Ci0JCWlmICghQWN0aXZpdHlFZGl0UGFydC5NT0RFTF9JRC5lcXVhbHMoVU1MVmlzdWFsSURSZWdpc3RyeQotCQkJCS5nZXRNb2RlbElEKGNvbnRhaW5lclZpZXcpKSkgewotCQkJRUFubm90YXRpb24gc2hvcnRjdXRBbm5vdGF0aW9uID0gRWNvcmVGYWN0b3J5LmVJTlNUQU5DRQotCQkJCQkuY3JlYXRlRUFubm90YXRpb24oKTsKLQkJCXNob3J0Y3V0QW5ub3RhdGlvbi5zZXRTb3VyY2UoIlNob3J0Y3V0Iik7IC8vJE5PTi1OTFMtMSQKLQkJCXNob3J0Y3V0QW5ub3RhdGlvbi5nZXREZXRhaWxzKCkucHV0KAotCQkJCQkibW9kZWxJRCIsIEFjdGl2aXR5RWRpdFBhcnQuTU9ERUxfSUQpOyAvLyROT04tTkxTLTEkCi0JCQl2aWV3LmdldEVBbm5vdGF0aW9ucygpLmFkZChzaG9ydGN1dEFubm90YXRpb24pOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBMYXlvdXRDb25zdHJhaW50IGNyZWF0ZUxheW91dENvbnN0cmFpbnQoKSB7Ci0JCXJldHVybiBOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUJvdW5kcygpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplRnJvbVByZWZlcmVuY2VzKFZpZXcgdmlldykgewotCQlzdXBlci5pbml0aWFsaXplRnJvbVByZWZlcmVuY2VzKHZpZXcpOwotCi0JCUlQcmVmZXJlbmNlU3RvcmUgc3RvcmUgPSAoSVByZWZlcmVuY2VTdG9yZSkgZ2V0UHJlZmVyZW5jZXNIaW50KCkKLQkJCQkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0KLQkJLy8gZmlsbCBjb2xvcgotCQlSR0IgZmlsbFJHQiA9IFByZWZlcmVuY2VDb252ZXJ0ZXIuZ2V0Q29sb3Ioc3RvcmUsCi0JCQkJSVByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9GSUxMX0NPTE9SKTsKLQkJVmlld1V0aWwuc2V0U3RydWN0dXJhbEZlYXR1cmVWYWx1ZSh2aWV3LCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldEZpbGxTdHlsZV9GaWxsQ29sb3IoKSwgRmlndXJlVXRpbGl0aWVzCi0JCQkJLlJHQlRvSW50ZWdlcihmaWxsUkdCKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldHVwQ29tcGFydG1lbnRUaXRsZShWaWV3IHZpZXcpIHsKLQkJVGl0bGVTdHlsZSB0aXRsZVN0eWxlID0gKFRpdGxlU3R5bGUpIHZpZXcKLQkJCQkuZ2V0U3R5bGUoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRUaXRsZVN0eWxlKCkpOwotCQlpZiAodGl0bGVTdHlsZSAhPSBudWxsKSB7Ci0JCQl0aXRsZVN0eWxlLnNldFNob3dUaXRsZSh0cnVlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXR1cENvbXBhcnRtZW50Q29sbGFwc2VkKFZpZXcgdmlldykgewotCQlEcmF3ZXJTdHlsZSBkcmF3ZXJTdHlsZSA9IChEcmF3ZXJTdHlsZSkgdmlldwotCQkJCS5nZXRTdHlsZShOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldERyYXdlclN0eWxlKCkpOwotCQlpZiAoZHJhd2VyU3R5bGUgIT0gbnVsbCkgewotCQkJZHJhd2VyU3R5bGUuc2V0Q29sbGFwc2VkKGZhbHNlKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL3ZpZXcvZmFjdG9yaWVzL0FjdGl2aXR5UGFydGl0aW9uVmlld0ZhY3RvcnkuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC92aWV3L2ZhY3Rvcmllcy9BY3Rpdml0eVBhcnRpdGlvblZpZXdGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0YzkzOTIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL3ZpZXcvZmFjdG9yaWVzL0FjdGl2aXR5UGFydGl0aW9uVmlld0ZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQudmlldy5mYWN0b3JpZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVjb3JlRmFjdG9yeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuQWN0aXZpdHlFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLkFjdGl2aXR5UGFydGl0aW9uRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5BY3Rpdml0eVBhcnRpdGlvbk5hbWUyRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5BY3Rpdml0eVBhcnRpdGlvblBhcnRpdGlvbkNhbXBhcnRtZW50RWRpdFBhcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5wYXJ0LlVNTFZpc3VhbElEUmVnaXN0cnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUudXRpbC5WaWV3VXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkudmlldy5mYWN0b3JpZXMuQWJzdHJhY3RTaGFwZVZpZXdGYWN0b3J5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm90YXRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZpdHlQYXJ0aXRpb25WaWV3RmFjdG9yeSBleHRlbmRzIEFic3RyYWN0U2hhcGVWaWV3RmFjdG9yeSB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIAotCSAqLwotCXByb3RlY3RlZCBMaXN0IGNyZWF0ZVN0eWxlcyhWaWV3IHZpZXcpIHsKLQkJTGlzdCBzdHlsZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXN0eWxlcy5hZGQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGb250U3R5bGUoKSk7Ci0JCXN0eWxlcy5hZGQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVEZXNjcmlwdGlvblN0eWxlKCkpOwotCQlzdHlsZXMuYWRkKE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRmlsbFN0eWxlKCkpOwotCQlzdHlsZXMuYWRkKE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlTGluZVN0eWxlKCkpOwotCQlyZXR1cm4gc3R5bGVzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkZWNvcmF0ZVZpZXcoVmlldyBjb250YWluZXJWaWV3LCBWaWV3IHZpZXcsCi0JCQlJQWRhcHRhYmxlIHNlbWFudGljQWRhcHRlciwgU3RyaW5nIHNlbWFudGljSGludCwgaW50IGluZGV4LAotCQkJYm9vbGVhbiBwZXJzaXN0ZWQpIHsKLQkJaWYgKHNlbWFudGljSGludCA9PSBudWxsKSB7Ci0JCQlzZW1hbnRpY0hpbnQgPSBVTUxWaXN1YWxJRFJlZ2lzdHJ5Ci0JCQkJCS5nZXRUeXBlKEFjdGl2aXR5UGFydGl0aW9uRWRpdFBhcnQuVklTVUFMX0lEKTsKLQkJCXZpZXcuc2V0VHlwZShzZW1hbnRpY0hpbnQpOwotCQl9Ci0JCXN1cGVyLmRlY29yYXRlVmlldyhjb250YWluZXJWaWV3LCB2aWV3LCBzZW1hbnRpY0FkYXB0ZXIsIHNlbWFudGljSGludCwKLQkJCQlpbmRleCwgcGVyc2lzdGVkKTsKLQkJaWYgKCFBY3Rpdml0eUVkaXRQYXJ0Lk1PREVMX0lELmVxdWFscyhVTUxWaXN1YWxJRFJlZ2lzdHJ5Ci0JCQkJLmdldE1vZGVsSUQoY29udGFpbmVyVmlldykpKSB7Ci0JCQlFQW5ub3RhdGlvbiBzaG9ydGN1dEFubm90YXRpb24gPSBFY29yZUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJCS5jcmVhdGVFQW5ub3RhdGlvbigpOwotCQkJc2hvcnRjdXRBbm5vdGF0aW9uLnNldFNvdXJjZSgiU2hvcnRjdXQiKTsgLy8kTk9OLU5MUy0xJAotCQkJc2hvcnRjdXRBbm5vdGF0aW9uLmdldERldGFpbHMoKS5wdXQoCi0JCQkJCSJtb2RlbElEIiwgQWN0aXZpdHlFZGl0UGFydC5NT0RFTF9JRCk7IC8vJE5PTi1OTFMtMSQKLQkJCXZpZXcuZ2V0RUFubm90YXRpb25zKCkuYWRkKHNob3J0Y3V0QW5ub3RhdGlvbik7Ci0JCX0KLQkJZ2V0Vmlld1NlcnZpY2UoKS5jcmVhdGVOb2RlKAotCQkJCXNlbWFudGljQWRhcHRlciwKLQkJCQl2aWV3LAotCQkJCVVNTFZpc3VhbElEUmVnaXN0cnkKLQkJCQkJCS5nZXRUeXBlKEFjdGl2aXR5UGFydGl0aW9uTmFtZTJFZGl0UGFydC5WSVNVQUxfSUQpLAotCQkJCVZpZXdVdGlsLkFQUEVORCwgdHJ1ZSwgZ2V0UHJlZmVyZW5jZXNIaW50KCkpOwotCQlnZXRWaWV3U2VydmljZSgpCi0JCQkJLmNyZWF0ZU5vZGUoCi0JCQkJCQlzZW1hbnRpY0FkYXB0ZXIsCi0JCQkJCQl2aWV3LAotCQkJCQkJVU1MVmlzdWFsSURSZWdpc3RyeQotCQkJCQkJCQkuZ2V0VHlwZShBY3Rpdml0eVBhcnRpdGlvblBhcnRpdGlvbkNhbXBhcnRtZW50RWRpdFBhcnQuVklTVUFMX0lEKSwKLQkJCQkJCVZpZXdVdGlsLkFQUEVORCwgdHJ1ZSwgZ2V0UHJlZmVyZW5jZXNIaW50KCkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL3ZpZXcvZmFjdG9yaWVzL0FjdGl2aXR5Vmlld0ZhY3RvcnkuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC92aWV3L2ZhY3Rvcmllcy9BY3Rpdml0eVZpZXdGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhMjQxOWMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL3ZpZXcvZmFjdG9yaWVzL0FjdGl2aXR5Vmlld0ZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQudmlldy5mYWN0b3JpZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnZpZXcuZmFjdG9yaWVzLkRpYWdyYW1WaWV3RmFjdG9yeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk1lYXN1cmVtZW50VW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob3RhdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eVZpZXdGYWN0b3J5IGV4dGVuZHMgRGlhZ3JhbVZpZXdGYWN0b3J5IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgCi0JICovCi0JcHJvdGVjdGVkIExpc3QgY3JlYXRlU3R5bGVzKFZpZXcgdmlldykgewotCQlMaXN0IHN0eWxlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJc3R5bGVzLmFkZChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVBhZ2VTdHlsZSgpKTsKLQkJc3R5bGVzLmFkZChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUd1aWRlU3R5bGUoKSk7Ci0JCXN0eWxlcy5hZGQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVEZXNjcmlwdGlvblN0eWxlKCkpOwotCQlyZXR1cm4gc3R5bGVzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkZWNvcmF0ZVZpZXcoVmlldyB2aWV3LCBJQWRhcHRhYmxlIHNlbWFudGljQWRhcHRlciwKLQkJCVN0cmluZyBkaWFncmFtS2luZCkgewotCQlzdXBlci5kZWNvcmF0ZVZpZXcodmlldywgc2VtYW50aWNBZGFwdGVyLCBkaWFncmFtS2luZCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBNZWFzdXJlbWVudFVuaXQgZ2V0TWVhc3VyZW1lbnRVbml0KCkgewotCQlyZXR1cm4gTWVhc3VyZW1lbnRVbml0LlBJWEVMX0xJVEVSQUw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvdmlldy9mYWN0b3JpZXMvQ29udHJvbEZsb3dOYW1lVmlld0ZhY3RvcnkuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC92aWV3L2ZhY3Rvcmllcy9Db250cm9sRmxvd05hbWVWaWV3RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMWFmMGM0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC92aWV3L2ZhY3Rvcmllcy9Db250cm9sRmxvd05hbWVWaWV3RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC52aWV3LmZhY3RvcmllczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLnByZWZlcmVuY2VzLlByZWZlcmVuY2VzSGludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnZpZXcuZmFjdG9yaWVzLkFic3RyYWN0TGFiZWxWaWV3RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS51dGlsLk1lYXN1cmVtZW50VW5pdEhlbHBlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5tYXBtb2RlLklNYXBNb2RlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTG9jYXRpb247Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQ29udHJvbEZsb3dOYW1lVmlld0ZhY3RvcnkgZXh0ZW5kcyBBYnN0cmFjdExhYmVsVmlld0ZhY3RvcnkgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBWaWV3IGNyZWF0ZVZpZXcoSUFkYXB0YWJsZSBzZW1hbnRpY0FkYXB0ZXIsIFZpZXcgY29udGFpbmVyVmlldywKLQkJCVN0cmluZyBzZW1hbnRpY0hpbnQsIGludCBpbmRleCwgYm9vbGVhbiBwZXJzaXN0ZWQsCi0JCQlQcmVmZXJlbmNlc0hpbnQgcHJlZmVyZW5jZXNIaW50KSB7Ci0JCU5vZGUgdmlldyA9IChOb2RlKSBzdXBlci5jcmVhdGVWaWV3KHNlbWFudGljQWRhcHRlciwgY29udGFpbmVyVmlldywKLQkJCQlzZW1hbnRpY0hpbnQsIGluZGV4LCBwZXJzaXN0ZWQsIHByZWZlcmVuY2VzSGludCk7Ci0JCUxvY2F0aW9uIGxvY2F0aW9uID0gKExvY2F0aW9uKSB2aWV3LmdldExheW91dENvbnN0cmFpbnQoKTsKLQkJSU1hcE1vZGUgbWFwTW9kZSA9IE1lYXN1cmVtZW50VW5pdEhlbHBlci5nZXRNYXBNb2RlKGNvbnRhaW5lclZpZXcKLQkJCQkuZ2V0RGlhZ3JhbSgpLmdldE1lYXN1cmVtZW50VW5pdCgpKTsKLQkJbG9jYXRpb24uc2V0WChtYXBNb2RlLkRQdG9MUCgwKSk7Ci0JCWxvY2F0aW9uLnNldFkobWFwTW9kZS5EUHRvTFAoNDApKTsKLQkJcmV0dXJuIHZpZXc7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBMaXN0IGNyZWF0ZVN0eWxlcyhWaWV3IHZpZXcpIHsKLQkJTGlzdCBzdHlsZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXJldHVybiBzdHlsZXM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL3ZpZXcvZmFjdG9yaWVzL0NvbnRyb2xGbG93Vmlld0ZhY3RvcnkuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC92aWV3L2ZhY3Rvcmllcy9Db250cm9sRmxvd1ZpZXdGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzNGRiNzkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL3ZpZXcvZmFjdG9yaWVzL0NvbnRyb2xGbG93Vmlld0ZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnZpZXcuZmFjdG9yaWVzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRWNvcmVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5UcmFuc2FjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLndvcmtzcGFjZS5BYnN0cmFjdEVNRk9wZXJhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuQWN0aXZpdHlFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLkNvbnRyb2xGbG93RWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5Db250cm9sRmxvd05hbWVFZGl0UGFydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnBhcnQuVU1MVmlzdWFsSURSZWdpc3RyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi5jb3JlLnV0aWwuTG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi5jb3JlLnV0aWwuU3RyaW5nU3RhdGljczsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS51dGlsLlRyYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5wcmVmZXJlbmNlcy5QcmVmZXJlbmNlc0hpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLnV0aWwuVmlld1V0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmludGVybmFsLkRpYWdyYW1VSURlYnVnT3B0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmludGVybmFsLkRpYWdyYW1VSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmludGVybmFsLkRpYWdyYW1VSVN0YXR1c0NvZGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkudmlldy5mYWN0b3JpZXMuQ29ubmVjdGlvblZpZXdGYWN0b3J5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uQmVuZHBvaW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5FZGdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vdGF0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIENvbnRyb2xGbG93Vmlld0ZhY3RvcnkgZXh0ZW5kcyBDb25uZWN0aW9uVmlld0ZhY3RvcnkgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwIG9wdGlvbnMgPSBuZXcgSGFzaE1hcCgpOwotCXN0YXRpYyB7Ci0JCW9wdGlvbnMucHV0KFRyYW5zYWN0aW9uLk9QVElPTl9VTlBST1RFQ1RFRCwgQm9vbGVhbi5UUlVFKTsKLQkJb3B0aW9ucy5wdXQoVHJhbnNhY3Rpb24uT1BUSU9OX05PX05PVElGSUNBVElPTlMsIEJvb2xlYW4uVFJVRSk7Ci0JCW9wdGlvbnMucHV0KFRyYW5zYWN0aW9uLk9QVElPTl9OT19UUklHR0VSUywgQm9vbGVhbi5UUlVFKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIAotCSAqLwotCXByb3RlY3RlZCBMaXN0IGNyZWF0ZVN0eWxlcyhWaWV3IHZpZXcpIHsKLQkJTGlzdCBzdHlsZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXN0eWxlcy5hZGQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVSb3V0aW5nU3R5bGUoKSk7Ci0JCXN0eWxlcy5hZGQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGb250U3R5bGUoKSk7Ci0JCXN0eWxlcy5hZGQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVMaW5lU3R5bGUoKSk7Ci0JCXJldHVybiBzdHlsZXM7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRlY29yYXRlVmlldyhWaWV3IGNvbnRhaW5lclZpZXcsIFZpZXcgdmlldywKLQkJCUlBZGFwdGFibGUgc2VtYW50aWNBZGFwdGVyLCBTdHJpbmcgc2VtYW50aWNIaW50LCBpbnQgaW5kZXgsCi0JCQlib29sZWFuIHBlcnNpc3RlZCkgewotCQlpZiAoc2VtYW50aWNIaW50ID09IG51bGwpIHsKLQkJCXNlbWFudGljSGludCA9IFVNTFZpc3VhbElEUmVnaXN0cnkKLQkJCQkJLmdldFR5cGUoQ29udHJvbEZsb3dFZGl0UGFydC5WSVNVQUxfSUQpOwotCQkJdmlldy5zZXRUeXBlKHNlbWFudGljSGludCk7Ci0JCX0KLQkJc3VwZXIuZGVjb3JhdGVWaWV3KGNvbnRhaW5lclZpZXcsIHZpZXcsIHNlbWFudGljQWRhcHRlciwgc2VtYW50aWNIaW50LAotCQkJCWluZGV4LCBwZXJzaXN0ZWQpOwotCQlpZiAoIUFjdGl2aXR5RWRpdFBhcnQuTU9ERUxfSUQuZXF1YWxzKFVNTFZpc3VhbElEUmVnaXN0cnkKLQkJCQkuZ2V0TW9kZWxJRChjb250YWluZXJWaWV3KSkpIHsKLQkJCUVBbm5vdGF0aW9uIHNob3J0Y3V0QW5ub3RhdGlvbiA9IEVjb3JlRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkJLmNyZWF0ZUVBbm5vdGF0aW9uKCk7Ci0JCQlzaG9ydGN1dEFubm90YXRpb24uc2V0U291cmNlKCJTaG9ydGN1dCIpOyAvLyROT04tTkxTLTEkCi0JCQlzaG9ydGN1dEFubm90YXRpb24uZ2V0RGV0YWlscygpLnB1dCgKLQkJCQkJIm1vZGVsSUQiLCBBY3Rpdml0eUVkaXRQYXJ0Lk1PREVMX0lEKTsgLy8kTk9OLU5MUy0xJAotCQkJdmlldy5nZXRFQW5ub3RhdGlvbnMoKS5hZGQoc2hvcnRjdXRBbm5vdGF0aW9uKTsKLQkJfQotCQlnZXRWaWV3U2VydmljZSgpLmNyZWF0ZU5vZGUoc2VtYW50aWNBZGFwdGVyLCB2aWV3LAotCQkJCVVNTFZpc3VhbElEUmVnaXN0cnkuZ2V0VHlwZShDb250cm9sRmxvd05hbWVFZGl0UGFydC5WSVNVQUxfSUQpLAotCQkJCVZpZXdVdGlsLkFQUEVORCwgdHJ1ZSwgZ2V0UHJlZmVyZW5jZXNIaW50KCkpOwotCX0KLQotCUBPdmVycmlkZQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLnZpZXcuZmFjdG9yaWVzLlZpZXdGYWN0b3J5I2NyZWF0ZVZpZXcob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGUsIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXcsIGphdmEubGFuZy5TdHJpbmcsIGludCwgYm9vbGVhbiwgamF2YS5sYW5nLlN0cmluZykKLQkgKiAKLQkgKiBPdmVycmlkZSBjcmVhdGVWaWV3IHNpbmNlIHRoZXJlIGlzIGEgYnVnIGluIAotCSAqIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkudmlldy5mYWN0b3JpZXMuQ29ubmVjdGlvblZpZXdGYWN0b3J5LmphdmEKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwdWJsaWMgVmlldyBjcmVhdGVWaWV3KGZpbmFsIElBZGFwdGFibGUgc2VtYW50aWNBZGFwdGVyLAotCQkJZmluYWwgVmlldyBjb250YWluZXJWaWV3LCBmaW5hbCBTdHJpbmcgc2VtYW50aWNIaW50LAotCQkJZmluYWwgaW50IGluZGV4LCBmaW5hbCBib29sZWFuIHBlcnNpc3RlZCwKLQkJCWZpbmFsIFByZWZlcmVuY2VzSGludCBwcmVmZXJlbmNlc0hpbnQpIHsKLQotCQlzZXRQcmVmZXJlbmNlc0hpbnQocHJlZmVyZW5jZXNIaW50KTsKLQotCQlmaW5hbCBFZGdlIGVkZ2UgPSBOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUVkZ2UoKTsKLQkJTGlzdCBzdHlsZXMgPSBjcmVhdGVTdHlsZXMoZWRnZSk7Ci0JCWlmIChzdHlsZXMuc2l6ZSgpID4gMCkgewotCQkJZWRnZS5nZXRTdHlsZXMoKS5hZGRBbGwoc3R5bGVzKTsKLQkJfQotCi0JCUJlbmRwb2ludHMgYmVuZFBvaW50cyA9IGNyZWF0ZUJlbmRwb2ludHMoKTsKLQkJaWYgKGJlbmRQb2ludHMgIT0gbnVsbCkgewotCQkJZWRnZS5zZXRCZW5kcG9pbnRzKGJlbmRQb2ludHMpOwotCQl9Ci0KLQkJRU9iamVjdCBzZW1hbnRpY0VsID0gc2VtYW50aWNBZGFwdGVyID09IG51bGwgPyBudWxsCi0JCQkJOiAoRU9iamVjdCkgc2VtYW50aWNBZGFwdGVyLmdldEFkYXB0ZXIoRU9iamVjdC5jbGFzcyk7Ci0JCWlmIChzZW1hbnRpY0VsID09IG51bGwpCi0JCQkvLyBlbmZvcmNlIGEgc2V0IHRvIE5VTEwKLQkJCWVkZ2Uuc2V0RWxlbWVudChudWxsKTsKLQkJZWxzZSBpZiAocmVxdWlyZXNFbGVtZW50KHNlbWFudGljQWRhcHRlciwgY29udGFpbmVyVmlldykpIHsKLQkJCWVkZ2Uuc2V0RWxlbWVudChzZW1hbnRpY0VsKTsKLQkJfQotCi0JCWVkZ2Uuc2V0VHlwZShzZW1hbnRpY0hpbnQpOwotCi0JCS8vIGRlY29yYXRlIHZpZXcgYXNzdW1lcyB0aGUgdmlldyBoYWQgYmVlbiBpbnNlcnRlZCBhbHJlYWR5LCBzbyAKLQkJLy8gd2UgaGFkIHRvIGNhbGwgaW5zZXJ0IGNoaWxkIGJlZm9yZSBjYWxsaW5nIGRlY29yYXRlIHZpZXcKLQkJVmlld1V0aWwuaW5zZXJ0Q2hpbGRWaWV3KGNvbnRhaW5lclZpZXcsIGVkZ2UsIGluZGV4LCBwZXJzaXN0ZWQpOwotCi0JCVRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIGRvbWFpbiA9IGdldEVkaXRpbmdEb21haW4oc2VtYW50aWNFbCwKLQkJCQljb250YWluZXJWaWV3KTsKLQotCQlpZiAoZG9tYWluICE9IG51bGwpIHsKLQkJCWlmIChpc1VuUHJvdGVjdGVkU2lsZW50VHJhbnNhY3Rpb25JblByb2dyZXNzKGRvbWFpbikpIHsKLQkJCQkvLyBkZWNvcmF0ZSB2aWV3IGhhZCB0byBydW4gYXMgYSBzaWxlbnQgb3BlcmF0aW9uIG90aGVyIHdpc2UKLQkJCQkvLyBpdCB3aWxsIGdlbmVyYXRlIHRvbyBtYW55IGV2ZW50cwotCQkJCWRlY29yYXRlVmlldyhjb250YWluZXJWaWV3LCBlZGdlLCBzZW1hbnRpY0FkYXB0ZXIsCi0JCQkJCQlzZW1hbnRpY0hpbnQsIGluZGV4LCB0cnVlKTsKLQotCQkJfSBlbHNlIHsKLQkJCQlBYnN0cmFjdEVNRk9wZXJhdGlvbiBvcGVyYXRpb24gPSBuZXcgQWJzdHJhY3RFTUZPcGVyYXRpb24oCi0JCQkJCQlkb21haW4sIFN0cmluZ1N0YXRpY3MuQkxBTkssIG9wdGlvbnMpIHsKLQotCQkJCQlwcm90ZWN0ZWQgSVN0YXR1cyBkb0V4ZWN1dGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLAotCQkJCQkJCUlBZGFwdGFibGUgaW5mbykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCQkJCQlkZWNvcmF0ZVZpZXcoY29udGFpbmVyVmlldywgZWRnZSwgc2VtYW50aWNBZGFwdGVyLAotCQkJCQkJCQlzZW1hbnRpY0hpbnQsIGluZGV4LCB0cnVlKTsKLQotCQkJCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCQkJCX0KLQkJCQl9OwotCQkJCXRyeSB7Ci0JCQkJCW9wZXJhdGlvbi5leGVjdXRlKG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCksIG51bGwpOwotCQkJCX0gY2F0Y2ggKEV4ZWN1dGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJCVRyYWNlLmNhdGNoaW5nKERpYWdyYW1VSVBsdWdpbi5nZXRJbnN0YW5jZSgpLAotCQkJCQkJCURpYWdyYW1VSURlYnVnT3B0aW9ucy5FWENFUFRJT05TX0NBVENISU5HLAotCQkJCQkJCWdldENsYXNzKCksICJjcmVhdGVWaWV3IiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJTG9nLndhcm5pbmcoRGlhZ3JhbVVJUGx1Z2luLmdldEluc3RhbmNlKCksCi0JCQkJCQkJRGlhZ3JhbVVJU3RhdHVzQ29kZXMuSUdOT1JFRF9FWENFUFRJT05fV0FSTklORywKLQkJCQkJCQkiY3JlYXRlVmlldyIsIGUpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGVkZ2U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvdmlldy9mYWN0b3JpZXMvRGVjaXNpb25Ob2RlTmFtZVZpZXdGYWN0b3J5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvdmlldy9mYWN0b3JpZXMvRGVjaXNpb25Ob2RlTmFtZVZpZXdGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4YjRkM2IuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL3ZpZXcvZmFjdG9yaWVzL0RlY2lzaW9uTm9kZU5hbWVWaWV3RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC52aWV3LmZhY3RvcmllczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkudmlldy5mYWN0b3JpZXMuQmFzaWNOb2RlVmlld0ZhY3Rvcnk7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRGVjaXNpb25Ob2RlTmFtZVZpZXdGYWN0b3J5IGV4dGVuZHMgQmFzaWNOb2RlVmlld0ZhY3RvcnkgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRlY29yYXRlVmlldyhWaWV3IGNvbnRhaW5lclZpZXcsIFZpZXcgdmlldywKLQkJCUlBZGFwdGFibGUgc2VtYW50aWNBZGFwdGVyLCBTdHJpbmcgc2VtYW50aWNIaW50LCBpbnQgaW5kZXgsCi0JCQlib29sZWFuIHBlcnNpc3RlZCkgewotCQlzdXBlci5kZWNvcmF0ZVZpZXcoY29udGFpbmVyVmlldywgdmlldywgc2VtYW50aWNBZGFwdGVyLCBzZW1hbnRpY0hpbnQsCi0JCQkJaW5kZXgsIHBlcnNpc3RlZCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBMaXN0IGNyZWF0ZVN0eWxlcyhWaWV3IHZpZXcpIHsKLQkJTGlzdCBzdHlsZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXJldHVybiBzdHlsZXM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL3ZpZXcvZmFjdG9yaWVzL0RlY2lzaW9uTm9kZVZpZXdGYWN0b3J5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvdmlldy9mYWN0b3JpZXMvRGVjaXNpb25Ob2RlVmlld0ZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWZjNzdhZi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvdmlldy9mYWN0b3JpZXMvRGVjaXNpb25Ob2RlVmlld0ZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQudmlldy5mYWN0b3JpZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVjb3JlRmFjdG9yeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuQWN0aXZpdHlFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLkRlY2lzaW9uTm9kZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuRGVjaXNpb25Ob2RlTmFtZUVkaXRQYXJ0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQucGFydC5VTUxWaXN1YWxJRFJlZ2lzdHJ5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLnV0aWwuVmlld1V0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnZpZXcuZmFjdG9yaWVzLkFic3RyYWN0U2hhcGVWaWV3RmFjdG9yeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vdGF0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERlY2lzaW9uTm9kZVZpZXdGYWN0b3J5IGV4dGVuZHMgQWJzdHJhY3RTaGFwZVZpZXdGYWN0b3J5IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgCi0JICovCi0JcHJvdGVjdGVkIExpc3QgY3JlYXRlU3R5bGVzKFZpZXcgdmlldykgewotCQlMaXN0IHN0eWxlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJc3R5bGVzLmFkZChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZvbnRTdHlsZSgpKTsKLQkJc3R5bGVzLmFkZChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZURlc2NyaXB0aW9uU3R5bGUoKSk7Ci0JCXN0eWxlcy5hZGQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGaWxsU3R5bGUoKSk7Ci0JCXN0eWxlcy5hZGQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVMaW5lU3R5bGUoKSk7Ci0JCXJldHVybiBzdHlsZXM7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRlY29yYXRlVmlldyhWaWV3IGNvbnRhaW5lclZpZXcsIFZpZXcgdmlldywKLQkJCUlBZGFwdGFibGUgc2VtYW50aWNBZGFwdGVyLCBTdHJpbmcgc2VtYW50aWNIaW50LCBpbnQgaW5kZXgsCi0JCQlib29sZWFuIHBlcnNpc3RlZCkgewotCQlpZiAoc2VtYW50aWNIaW50ID09IG51bGwpIHsKLQkJCXNlbWFudGljSGludCA9IFVNTFZpc3VhbElEUmVnaXN0cnkKLQkJCQkJLmdldFR5cGUoRGVjaXNpb25Ob2RlRWRpdFBhcnQuVklTVUFMX0lEKTsKLQkJCXZpZXcuc2V0VHlwZShzZW1hbnRpY0hpbnQpOwotCQl9Ci0JCXN1cGVyLmRlY29yYXRlVmlldyhjb250YWluZXJWaWV3LCB2aWV3LCBzZW1hbnRpY0FkYXB0ZXIsIHNlbWFudGljSGludCwKLQkJCQlpbmRleCwgcGVyc2lzdGVkKTsKLQkJaWYgKCFBY3Rpdml0eUVkaXRQYXJ0Lk1PREVMX0lELmVxdWFscyhVTUxWaXN1YWxJRFJlZ2lzdHJ5Ci0JCQkJLmdldE1vZGVsSUQoY29udGFpbmVyVmlldykpKSB7Ci0JCQlFQW5ub3RhdGlvbiBzaG9ydGN1dEFubm90YXRpb24gPSBFY29yZUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJCS5jcmVhdGVFQW5ub3RhdGlvbigpOwotCQkJc2hvcnRjdXRBbm5vdGF0aW9uLnNldFNvdXJjZSgiU2hvcnRjdXQiKTsgLy8kTk9OLU5MUy0xJAotCQkJc2hvcnRjdXRBbm5vdGF0aW9uLmdldERldGFpbHMoKS5wdXQoCi0JCQkJCSJtb2RlbElEIiwgQWN0aXZpdHlFZGl0UGFydC5NT0RFTF9JRCk7IC8vJE5PTi1OTFMtMSQKLQkJCXZpZXcuZ2V0RUFubm90YXRpb25zKCkuYWRkKHNob3J0Y3V0QW5ub3RhdGlvbik7Ci0JCX0KLQkJZ2V0Vmlld1NlcnZpY2UoKQotCQkJCS5jcmVhdGVOb2RlKAotCQkJCQkJc2VtYW50aWNBZGFwdGVyLAotCQkJCQkJdmlldywKLQkJCQkJCVVNTFZpc3VhbElEUmVnaXN0cnkKLQkJCQkJCQkJLmdldFR5cGUoRGVjaXNpb25Ob2RlTmFtZUVkaXRQYXJ0LlZJU1VBTF9JRCksCi0JCQkJCQlWaWV3VXRpbC5BUFBFTkQsIHRydWUsIGdldFByZWZlcmVuY2VzSGludCgpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC92aWV3L2ZhY3Rvcmllcy9Gb3JrTm9kZVZpZXdGYWN0b3J5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvdmlldy9mYWN0b3JpZXMvRm9ya05vZGVWaWV3RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1N2UwZTE4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC92aWV3L2ZhY3Rvcmllcy9Gb3JrTm9kZVZpZXdGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnZpZXcuZmFjdG9yaWVzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FY29yZUZhY3Rvcnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLkFjdGl2aXR5RWRpdFBhcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLkZvcmtOb2RlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQucGFydC5VTUxWaXN1YWxJRFJlZ2lzdHJ5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS52aWV3LmZhY3Rvcmllcy5BYnN0cmFjdFNoYXBlVmlld0ZhY3Rvcnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob3RhdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBGb3JrTm9kZVZpZXdGYWN0b3J5IGV4dGVuZHMgQWJzdHJhY3RTaGFwZVZpZXdGYWN0b3J5IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgCi0JICovCi0JcHJvdGVjdGVkIExpc3QgY3JlYXRlU3R5bGVzKFZpZXcgdmlldykgewotCQlMaXN0IHN0eWxlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJc3R5bGVzLmFkZChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZvbnRTdHlsZSgpKTsKLQkJc3R5bGVzLmFkZChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZURlc2NyaXB0aW9uU3R5bGUoKSk7Ci0JCXN0eWxlcy5hZGQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGaWxsU3R5bGUoKSk7Ci0JCXN0eWxlcy5hZGQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVMaW5lU3R5bGUoKSk7Ci0JCXJldHVybiBzdHlsZXM7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRlY29yYXRlVmlldyhWaWV3IGNvbnRhaW5lclZpZXcsIFZpZXcgdmlldywKLQkJCUlBZGFwdGFibGUgc2VtYW50aWNBZGFwdGVyLCBTdHJpbmcgc2VtYW50aWNIaW50LCBpbnQgaW5kZXgsCi0JCQlib29sZWFuIHBlcnNpc3RlZCkgewotCQlpZiAoc2VtYW50aWNIaW50ID09IG51bGwpIHsKLQkJCXNlbWFudGljSGludCA9IFVNTFZpc3VhbElEUmVnaXN0cnkKLQkJCQkJLmdldFR5cGUoRm9ya05vZGVFZGl0UGFydC5WSVNVQUxfSUQpOwotCQkJdmlldy5zZXRUeXBlKHNlbWFudGljSGludCk7Ci0JCX0KLQkJc3VwZXIuZGVjb3JhdGVWaWV3KGNvbnRhaW5lclZpZXcsIHZpZXcsIHNlbWFudGljQWRhcHRlciwgc2VtYW50aWNIaW50LAotCQkJCWluZGV4LCBwZXJzaXN0ZWQpOwotCQlpZiAoIUFjdGl2aXR5RWRpdFBhcnQuTU9ERUxfSUQuZXF1YWxzKFVNTFZpc3VhbElEUmVnaXN0cnkKLQkJCQkuZ2V0TW9kZWxJRChjb250YWluZXJWaWV3KSkpIHsKLQkJCUVBbm5vdGF0aW9uIHNob3J0Y3V0QW5ub3RhdGlvbiA9IEVjb3JlRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkJLmNyZWF0ZUVBbm5vdGF0aW9uKCk7Ci0JCQlzaG9ydGN1dEFubm90YXRpb24uc2V0U291cmNlKCJTaG9ydGN1dCIpOyAvLyROT04tTkxTLTEkCi0JCQlzaG9ydGN1dEFubm90YXRpb24uZ2V0RGV0YWlscygpLnB1dCgKLQkJCQkJIm1vZGVsSUQiLCBBY3Rpdml0eUVkaXRQYXJ0Lk1PREVMX0lEKTsgLy8kTk9OLU5MUy0xJAotCQkJdmlldy5nZXRFQW5ub3RhdGlvbnMoKS5hZGQoc2hvcnRjdXRBbm5vdGF0aW9uKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL3ZpZXcvZmFjdG9yaWVzL0luaXRpYWxOb2RlTmFtZVZpZXdGYWN0b3J5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvdmlldy9mYWN0b3JpZXMvSW5pdGlhbE5vZGVOYW1lVmlld0ZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjQ3ZjdhMy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvdmlldy9mYWN0b3JpZXMvSW5pdGlhbE5vZGVOYW1lVmlld0ZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQudmlldy5mYWN0b3JpZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5wcmVmZXJlbmNlcy5QcmVmZXJlbmNlc0hpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS52aWV3LmZhY3Rvcmllcy5BYnN0cmFjdExhYmVsVmlld0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkudXRpbC5NZWFzdXJlbWVudFVuaXRIZWxwZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkubWFwbW9kZS5JTWFwTW9kZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkxvY2F0aW9uOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEluaXRpYWxOb2RlTmFtZVZpZXdGYWN0b3J5IGV4dGVuZHMgQWJzdHJhY3RMYWJlbFZpZXdGYWN0b3J5IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVmlldyBjcmVhdGVWaWV3KElBZGFwdGFibGUgc2VtYW50aWNBZGFwdGVyLCBWaWV3IGNvbnRhaW5lclZpZXcsCi0JCQlTdHJpbmcgc2VtYW50aWNIaW50LCBpbnQgaW5kZXgsIGJvb2xlYW4gcGVyc2lzdGVkLAotCQkJUHJlZmVyZW5jZXNIaW50IHByZWZlcmVuY2VzSGludCkgewotCQlOb2RlIHZpZXcgPSAoTm9kZSkgc3VwZXIuY3JlYXRlVmlldyhzZW1hbnRpY0FkYXB0ZXIsIGNvbnRhaW5lclZpZXcsCi0JCQkJc2VtYW50aWNIaW50LCBpbmRleCwgcGVyc2lzdGVkLCBwcmVmZXJlbmNlc0hpbnQpOwotCQlMb2NhdGlvbiBsb2NhdGlvbiA9IChMb2NhdGlvbikgdmlldy5nZXRMYXlvdXRDb25zdHJhaW50KCk7Ci0JCUlNYXBNb2RlIG1hcE1vZGUgPSBNZWFzdXJlbWVudFVuaXRIZWxwZXIuZ2V0TWFwTW9kZShjb250YWluZXJWaWV3Ci0JCQkJLmdldERpYWdyYW0oKS5nZXRNZWFzdXJlbWVudFVuaXQoKSk7Ci0JCWxvY2F0aW9uLnNldFgobWFwTW9kZS5EUHRvTFAoMCkpOwotCQlsb2NhdGlvbi5zZXRZKG1hcE1vZGUuRFB0b0xQKDUpKTsKLQkJcmV0dXJuIHZpZXc7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBMaXN0IGNyZWF0ZVN0eWxlcyhWaWV3IHZpZXcpIHsKLQkJTGlzdCBzdHlsZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXJldHVybiBzdHlsZXM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL3ZpZXcvZmFjdG9yaWVzL0luaXRpYWxOb2RlVmlld0ZhY3RvcnkuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC92aWV3L2ZhY3Rvcmllcy9Jbml0aWFsTm9kZVZpZXdGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1MDc2YmIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL3ZpZXcvZmFjdG9yaWVzL0luaXRpYWxOb2RlVmlld0ZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQudmlldy5mYWN0b3JpZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVjb3JlRmFjdG9yeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuQWN0aXZpdHlFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLkluaXRpYWxOb2RlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5Jbml0aWFsTm9kZU5hbWVFZGl0UGFydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnBhcnQuVU1MVmlzdWFsSURSZWdpc3RyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS51dGlsLlZpZXdVdGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS52aWV3LmZhY3Rvcmllcy5BYnN0cmFjdFNoYXBlVmlld0ZhY3Rvcnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob3RhdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBJbml0aWFsTm9kZVZpZXdGYWN0b3J5IGV4dGVuZHMgQWJzdHJhY3RTaGFwZVZpZXdGYWN0b3J5IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgCi0JICovCi0JcHJvdGVjdGVkIExpc3QgY3JlYXRlU3R5bGVzKFZpZXcgdmlldykgewotCQlMaXN0IHN0eWxlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJc3R5bGVzLmFkZChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZvbnRTdHlsZSgpKTsKLQkJc3R5bGVzLmFkZChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZURlc2NyaXB0aW9uU3R5bGUoKSk7Ci0JCXN0eWxlcy5hZGQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGaWxsU3R5bGUoKSk7Ci0JCXN0eWxlcy5hZGQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVMaW5lU3R5bGUoKSk7Ci0JCXJldHVybiBzdHlsZXM7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRlY29yYXRlVmlldyhWaWV3IGNvbnRhaW5lclZpZXcsIFZpZXcgdmlldywKLQkJCUlBZGFwdGFibGUgc2VtYW50aWNBZGFwdGVyLCBTdHJpbmcgc2VtYW50aWNIaW50LCBpbnQgaW5kZXgsCi0JCQlib29sZWFuIHBlcnNpc3RlZCkgewotCQlpZiAoc2VtYW50aWNIaW50ID09IG51bGwpIHsKLQkJCXNlbWFudGljSGludCA9IFVNTFZpc3VhbElEUmVnaXN0cnkKLQkJCQkJLmdldFR5cGUoSW5pdGlhbE5vZGVFZGl0UGFydC5WSVNVQUxfSUQpOwotCQkJdmlldy5zZXRUeXBlKHNlbWFudGljSGludCk7Ci0JCX0KLQkJc3VwZXIuZGVjb3JhdGVWaWV3KGNvbnRhaW5lclZpZXcsIHZpZXcsIHNlbWFudGljQWRhcHRlciwgc2VtYW50aWNIaW50LAotCQkJCWluZGV4LCBwZXJzaXN0ZWQpOwotCQlpZiAoIUFjdGl2aXR5RWRpdFBhcnQuTU9ERUxfSUQuZXF1YWxzKFVNTFZpc3VhbElEUmVnaXN0cnkKLQkJCQkuZ2V0TW9kZWxJRChjb250YWluZXJWaWV3KSkpIHsKLQkJCUVBbm5vdGF0aW9uIHNob3J0Y3V0QW5ub3RhdGlvbiA9IEVjb3JlRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkJLmNyZWF0ZUVBbm5vdGF0aW9uKCk7Ci0JCQlzaG9ydGN1dEFubm90YXRpb24uc2V0U291cmNlKCJTaG9ydGN1dCIpOyAvLyROT04tTkxTLTEkCi0JCQlzaG9ydGN1dEFubm90YXRpb24uZ2V0RGV0YWlscygpLnB1dCgKLQkJCQkJIm1vZGVsSUQiLCBBY3Rpdml0eUVkaXRQYXJ0Lk1PREVMX0lEKTsgLy8kTk9OLU5MUy0xJAotCQkJdmlldy5nZXRFQW5ub3RhdGlvbnMoKS5hZGQoc2hvcnRjdXRBbm5vdGF0aW9uKTsKLQkJfQotCQlnZXRWaWV3U2VydmljZSgpLmNyZWF0ZU5vZGUoc2VtYW50aWNBZGFwdGVyLCB2aWV3LAotCQkJCVVNTFZpc3VhbElEUmVnaXN0cnkuZ2V0VHlwZShJbml0aWFsTm9kZU5hbWVFZGl0UGFydC5WSVNVQUxfSUQpLAotCQkJCVZpZXdVdGlsLkFQUEVORCwgdHJ1ZSwgZ2V0UHJlZmVyZW5jZXNIaW50KCkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL3ZpZXcvZmFjdG9yaWVzL0pvaW5Ob2RlVmlld0ZhY3RvcnkuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC92aWV3L2ZhY3Rvcmllcy9Kb2luTm9kZVZpZXdGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhZmUzZDQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL3ZpZXcvZmFjdG9yaWVzL0pvaW5Ob2RlVmlld0ZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQudmlldy5mYWN0b3JpZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVjb3JlRmFjdG9yeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuQWN0aXZpdHlFZGl0UGFydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuSm9pbk5vZGVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5wYXJ0LlVNTFZpc3VhbElEUmVnaXN0cnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnZpZXcuZmFjdG9yaWVzLkFic3RyYWN0U2hhcGVWaWV3RmFjdG9yeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vdGF0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEpvaW5Ob2RlVmlld0ZhY3RvcnkgZXh0ZW5kcyBBYnN0cmFjdFNoYXBlVmlld0ZhY3RvcnkgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZCAKLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBjcmVhdGVTdHlsZXMoVmlldyB2aWV3KSB7Ci0JCUxpc3Qgc3R5bGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlzdHlsZXMuYWRkKE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRm9udFN0eWxlKCkpOwotCQlzdHlsZXMuYWRkKE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRGVzY3JpcHRpb25TdHlsZSgpKTsKLQkJc3R5bGVzLmFkZChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZpbGxTdHlsZSgpKTsKLQkJc3R5bGVzLmFkZChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUxpbmVTdHlsZSgpKTsKLQkJcmV0dXJuIHN0eWxlczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZGVjb3JhdGVWaWV3KFZpZXcgY29udGFpbmVyVmlldywgVmlldyB2aWV3LAotCQkJSUFkYXB0YWJsZSBzZW1hbnRpY0FkYXB0ZXIsIFN0cmluZyBzZW1hbnRpY0hpbnQsIGludCBpbmRleCwKLQkJCWJvb2xlYW4gcGVyc2lzdGVkKSB7Ci0JCWlmIChzZW1hbnRpY0hpbnQgPT0gbnVsbCkgewotCQkJc2VtYW50aWNIaW50ID0gVU1MVmlzdWFsSURSZWdpc3RyeQotCQkJCQkuZ2V0VHlwZShKb2luTm9kZUVkaXRQYXJ0LlZJU1VBTF9JRCk7Ci0JCQl2aWV3LnNldFR5cGUoc2VtYW50aWNIaW50KTsKLQkJfQotCQlzdXBlci5kZWNvcmF0ZVZpZXcoY29udGFpbmVyVmlldywgdmlldywgc2VtYW50aWNBZGFwdGVyLCBzZW1hbnRpY0hpbnQsCi0JCQkJaW5kZXgsIHBlcnNpc3RlZCk7Ci0JCWlmICghQWN0aXZpdHlFZGl0UGFydC5NT0RFTF9JRC5lcXVhbHMoVU1MVmlzdWFsSURSZWdpc3RyeQotCQkJCS5nZXRNb2RlbElEKGNvbnRhaW5lclZpZXcpKSkgewotCQkJRUFubm90YXRpb24gc2hvcnRjdXRBbm5vdGF0aW9uID0gRWNvcmVGYWN0b3J5LmVJTlNUQU5DRQotCQkJCQkuY3JlYXRlRUFubm90YXRpb24oKTsKLQkJCXNob3J0Y3V0QW5ub3RhdGlvbi5zZXRTb3VyY2UoIlNob3J0Y3V0Iik7IC8vJE5PTi1OTFMtMSQKLQkJCXNob3J0Y3V0QW5ub3RhdGlvbi5nZXREZXRhaWxzKCkucHV0KAotCQkJCQkibW9kZWxJRCIsIEFjdGl2aXR5RWRpdFBhcnQuTU9ERUxfSUQpOyAvLyROT04tTkxTLTEkCi0JCQl2aWV3LmdldEVBbm5vdGF0aW9ucygpLmFkZChzaG9ydGN1dEFubm90YXRpb24pOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvdmlldy9mYWN0b3JpZXMvTWVyZ2VOb2RlTmFtZVZpZXdGYWN0b3J5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvdmlldy9mYWN0b3JpZXMvTWVyZ2VOb2RlTmFtZVZpZXdGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjNGYxNzkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL3ZpZXcvZmFjdG9yaWVzL01lcmdlTm9kZU5hbWVWaWV3RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC52aWV3LmZhY3RvcmllczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkudmlldy5mYWN0b3JpZXMuQmFzaWNOb2RlVmlld0ZhY3Rvcnk7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgTWVyZ2VOb2RlTmFtZVZpZXdGYWN0b3J5IGV4dGVuZHMgQmFzaWNOb2RlVmlld0ZhY3RvcnkgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRlY29yYXRlVmlldyhWaWV3IGNvbnRhaW5lclZpZXcsIFZpZXcgdmlldywKLQkJCUlBZGFwdGFibGUgc2VtYW50aWNBZGFwdGVyLCBTdHJpbmcgc2VtYW50aWNIaW50LCBpbnQgaW5kZXgsCi0JCQlib29sZWFuIHBlcnNpc3RlZCkgewotCQlzdXBlci5kZWNvcmF0ZVZpZXcoY29udGFpbmVyVmlldywgdmlldywgc2VtYW50aWNBZGFwdGVyLCBzZW1hbnRpY0hpbnQsCi0JCQkJaW5kZXgsIHBlcnNpc3RlZCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBMaXN0IGNyZWF0ZVN0eWxlcyhWaWV3IHZpZXcpIHsKLQkJTGlzdCBzdHlsZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXJldHVybiBzdHlsZXM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL3ZpZXcvZmFjdG9yaWVzL01lcmdlTm9kZVZpZXdGYWN0b3J5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvdmlldy9mYWN0b3JpZXMvTWVyZ2VOb2RlVmlld0ZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODA0MGMzOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvdmlldy9mYWN0b3JpZXMvTWVyZ2VOb2RlVmlld0ZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQudmlldy5mYWN0b3JpZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVjb3JlRmFjdG9yeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuQWN0aXZpdHlFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLk1lcmdlTm9kZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuTWVyZ2VOb2RlTmFtZUVkaXRQYXJ0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQucGFydC5VTUxWaXN1YWxJRFJlZ2lzdHJ5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLnV0aWwuVmlld1V0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnZpZXcuZmFjdG9yaWVzLkFic3RyYWN0U2hhcGVWaWV3RmFjdG9yeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vdGF0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIE1lcmdlTm9kZVZpZXdGYWN0b3J5IGV4dGVuZHMgQWJzdHJhY3RTaGFwZVZpZXdGYWN0b3J5IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgCi0JICovCi0JcHJvdGVjdGVkIExpc3QgY3JlYXRlU3R5bGVzKFZpZXcgdmlldykgewotCQlMaXN0IHN0eWxlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJc3R5bGVzLmFkZChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZvbnRTdHlsZSgpKTsKLQkJc3R5bGVzLmFkZChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZURlc2NyaXB0aW9uU3R5bGUoKSk7Ci0JCXN0eWxlcy5hZGQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGaWxsU3R5bGUoKSk7Ci0JCXN0eWxlcy5hZGQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVMaW5lU3R5bGUoKSk7Ci0JCXJldHVybiBzdHlsZXM7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRlY29yYXRlVmlldyhWaWV3IGNvbnRhaW5lclZpZXcsIFZpZXcgdmlldywKLQkJCUlBZGFwdGFibGUgc2VtYW50aWNBZGFwdGVyLCBTdHJpbmcgc2VtYW50aWNIaW50LCBpbnQgaW5kZXgsCi0JCQlib29sZWFuIHBlcnNpc3RlZCkgewotCQlpZiAoc2VtYW50aWNIaW50ID09IG51bGwpIHsKLQkJCXNlbWFudGljSGludCA9IFVNTFZpc3VhbElEUmVnaXN0cnkKLQkJCQkJLmdldFR5cGUoTWVyZ2VOb2RlRWRpdFBhcnQuVklTVUFMX0lEKTsKLQkJCXZpZXcuc2V0VHlwZShzZW1hbnRpY0hpbnQpOwotCQl9Ci0JCXN1cGVyLmRlY29yYXRlVmlldyhjb250YWluZXJWaWV3LCB2aWV3LCBzZW1hbnRpY0FkYXB0ZXIsIHNlbWFudGljSGludCwKLQkJCQlpbmRleCwgcGVyc2lzdGVkKTsKLQkJaWYgKCFBY3Rpdml0eUVkaXRQYXJ0Lk1PREVMX0lELmVxdWFscyhVTUxWaXN1YWxJRFJlZ2lzdHJ5Ci0JCQkJLmdldE1vZGVsSUQoY29udGFpbmVyVmlldykpKSB7Ci0JCQlFQW5ub3RhdGlvbiBzaG9ydGN1dEFubm90YXRpb24gPSBFY29yZUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJCS5jcmVhdGVFQW5ub3RhdGlvbigpOwotCQkJc2hvcnRjdXRBbm5vdGF0aW9uLnNldFNvdXJjZSgiU2hvcnRjdXQiKTsgLy8kTk9OLU5MUy0xJAotCQkJc2hvcnRjdXRBbm5vdGF0aW9uLmdldERldGFpbHMoKS5wdXQoCi0JCQkJCSJtb2RlbElEIiwgQWN0aXZpdHlFZGl0UGFydC5NT0RFTF9JRCk7IC8vJE5PTi1OTFMtMSQKLQkJCXZpZXcuZ2V0RUFubm90YXRpb25zKCkuYWRkKHNob3J0Y3V0QW5ub3RhdGlvbik7Ci0JCX0KLQkJZ2V0Vmlld1NlcnZpY2UoKS5jcmVhdGVOb2RlKHNlbWFudGljQWRhcHRlciwgdmlldywKLQkJCQlVTUxWaXN1YWxJRFJlZ2lzdHJ5LmdldFR5cGUoTWVyZ2VOb2RlTmFtZUVkaXRQYXJ0LlZJU1VBTF9JRCksCi0JCQkJVmlld1V0aWwuQVBQRU5ELCB0cnVlLCBnZXRQcmVmZXJlbmNlc0hpbnQoKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvdmlldy9mYWN0b3JpZXMvU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTJWaWV3RmFjdG9yeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL3ZpZXcvZmFjdG9yaWVzL1N0cnVjdHVyZWRBY3Rpdml0eU5vZGUyVmlld0ZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGJmNmFkZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvdmlldy9mYWN0b3JpZXMvU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTJWaWV3RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC52aWV3LmZhY3RvcmllczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRWNvcmVGYWN0b3J5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5BY3Rpdml0eUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTJFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVOYW1lMkVkaXRQYXJ0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQucGFydC5VTUxWaXN1YWxJRFJlZ2lzdHJ5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLnV0aWwuVmlld1V0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnZpZXcuZmFjdG9yaWVzLkFic3RyYWN0U2hhcGVWaWV3RmFjdG9yeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vdGF0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUyVmlld0ZhY3RvcnkgZXh0ZW5kcwotCQlBYnN0cmFjdFNoYXBlVmlld0ZhY3RvcnkgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZCAKLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBjcmVhdGVTdHlsZXMoVmlldyB2aWV3KSB7Ci0JCUxpc3Qgc3R5bGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlzdHlsZXMuYWRkKE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRm9udFN0eWxlKCkpOwotCQlzdHlsZXMuYWRkKE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRGVzY3JpcHRpb25TdHlsZSgpKTsKLQkJc3R5bGVzLmFkZChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZpbGxTdHlsZSgpKTsKLQkJc3R5bGVzLmFkZChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUxpbmVTdHlsZSgpKTsKLQkJcmV0dXJuIHN0eWxlczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZGVjb3JhdGVWaWV3KFZpZXcgY29udGFpbmVyVmlldywgVmlldyB2aWV3LAotCQkJSUFkYXB0YWJsZSBzZW1hbnRpY0FkYXB0ZXIsIFN0cmluZyBzZW1hbnRpY0hpbnQsIGludCBpbmRleCwKLQkJCWJvb2xlYW4gcGVyc2lzdGVkKSB7Ci0JCWlmIChzZW1hbnRpY0hpbnQgPT0gbnVsbCkgewotCQkJc2VtYW50aWNIaW50ID0gVU1MVmlzdWFsSURSZWdpc3RyeQotCQkJCQkuZ2V0VHlwZShTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlMkVkaXRQYXJ0LlZJU1VBTF9JRCk7Ci0JCQl2aWV3LnNldFR5cGUoc2VtYW50aWNIaW50KTsKLQkJfQotCQlzdXBlci5kZWNvcmF0ZVZpZXcoY29udGFpbmVyVmlldywgdmlldywgc2VtYW50aWNBZGFwdGVyLCBzZW1hbnRpY0hpbnQsCi0JCQkJaW5kZXgsIHBlcnNpc3RlZCk7Ci0JCWlmICghQWN0aXZpdHlFZGl0UGFydC5NT0RFTF9JRC5lcXVhbHMoVU1MVmlzdWFsSURSZWdpc3RyeQotCQkJCS5nZXRNb2RlbElEKGNvbnRhaW5lclZpZXcpKSkgewotCQkJRUFubm90YXRpb24gc2hvcnRjdXRBbm5vdGF0aW9uID0gRWNvcmVGYWN0b3J5LmVJTlNUQU5DRQotCQkJCQkuY3JlYXRlRUFubm90YXRpb24oKTsKLQkJCXNob3J0Y3V0QW5ub3RhdGlvbi5zZXRTb3VyY2UoIlNob3J0Y3V0Iik7IC8vJE5PTi1OTFMtMSQKLQkJCXNob3J0Y3V0QW5ub3RhdGlvbi5nZXREZXRhaWxzKCkucHV0KAotCQkJCQkibW9kZWxJRCIsIEFjdGl2aXR5RWRpdFBhcnQuTU9ERUxfSUQpOyAvLyROT04tTkxTLTEkCi0JCQl2aWV3LmdldEVBbm5vdGF0aW9ucygpLmFkZChzaG9ydGN1dEFubm90YXRpb24pOwotCQl9Ci0JCWdldFZpZXdTZXJ2aWNlKCkKLQkJCQkuY3JlYXRlTm9kZSgKLQkJCQkJCXNlbWFudGljQWRhcHRlciwKLQkJCQkJCXZpZXcsCi0JCQkJCQlVTUxWaXN1YWxJRFJlZ2lzdHJ5Ci0JCQkJCQkJCS5nZXRUeXBlKFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVOYW1lMkVkaXRQYXJ0LlZJU1VBTF9JRCksCi0JCQkJCQlWaWV3VXRpbC5BUFBFTkQsIHRydWUsIGdldFByZWZlcmVuY2VzSGludCgpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC92aWV3L2ZhY3Rvcmllcy9TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlM1ZpZXdGYWN0b3J5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvdmlldy9mYWN0b3JpZXMvU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTNWaWV3RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYWYzMmZlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC92aWV3L2ZhY3Rvcmllcy9TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlM1ZpZXdGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnZpZXcuZmFjdG9yaWVzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FY29yZUZhY3Rvcnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLkFjdGl2aXR5RWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlM0VkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWUzRWRpdFBhcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5wYXJ0LlVNTFZpc3VhbElEUmVnaXN0cnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUudXRpbC5WaWV3VXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkudmlldy5mYWN0b3JpZXMuQWJzdHJhY3RTaGFwZVZpZXdGYWN0b3J5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm90YXRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTNWaWV3RmFjdG9yeSBleHRlbmRzCi0JCUFic3RyYWN0U2hhcGVWaWV3RmFjdG9yeSB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIAotCSAqLwotCXByb3RlY3RlZCBMaXN0IGNyZWF0ZVN0eWxlcyhWaWV3IHZpZXcpIHsKLQkJTGlzdCBzdHlsZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXN0eWxlcy5hZGQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGb250U3R5bGUoKSk7Ci0JCXN0eWxlcy5hZGQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVEZXNjcmlwdGlvblN0eWxlKCkpOwotCQlzdHlsZXMuYWRkKE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRmlsbFN0eWxlKCkpOwotCQlzdHlsZXMuYWRkKE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlTGluZVN0eWxlKCkpOwotCQlyZXR1cm4gc3R5bGVzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkZWNvcmF0ZVZpZXcoVmlldyBjb250YWluZXJWaWV3LCBWaWV3IHZpZXcsCi0JCQlJQWRhcHRhYmxlIHNlbWFudGljQWRhcHRlciwgU3RyaW5nIHNlbWFudGljSGludCwgaW50IGluZGV4LAotCQkJYm9vbGVhbiBwZXJzaXN0ZWQpIHsKLQkJaWYgKHNlbWFudGljSGludCA9PSBudWxsKSB7Ci0JCQlzZW1hbnRpY0hpbnQgPSBVTUxWaXN1YWxJRFJlZ2lzdHJ5Ci0JCQkJCS5nZXRUeXBlKFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUzRWRpdFBhcnQuVklTVUFMX0lEKTsKLQkJCXZpZXcuc2V0VHlwZShzZW1hbnRpY0hpbnQpOwotCQl9Ci0JCXN1cGVyLmRlY29yYXRlVmlldyhjb250YWluZXJWaWV3LCB2aWV3LCBzZW1hbnRpY0FkYXB0ZXIsIHNlbWFudGljSGludCwKLQkJCQlpbmRleCwgcGVyc2lzdGVkKTsKLQkJaWYgKCFBY3Rpdml0eUVkaXRQYXJ0Lk1PREVMX0lELmVxdWFscyhVTUxWaXN1YWxJRFJlZ2lzdHJ5Ci0JCQkJLmdldE1vZGVsSUQoY29udGFpbmVyVmlldykpKSB7Ci0JCQlFQW5ub3RhdGlvbiBzaG9ydGN1dEFubm90YXRpb24gPSBFY29yZUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJCS5jcmVhdGVFQW5ub3RhdGlvbigpOwotCQkJc2hvcnRjdXRBbm5vdGF0aW9uLnNldFNvdXJjZSgiU2hvcnRjdXQiKTsgLy8kTk9OLU5MUy0xJAotCQkJc2hvcnRjdXRBbm5vdGF0aW9uLmdldERldGFpbHMoKS5wdXQoCi0JCQkJCSJtb2RlbElEIiwgQWN0aXZpdHlFZGl0UGFydC5NT0RFTF9JRCk7IC8vJE5PTi1OTFMtMSQKLQkJCXZpZXcuZ2V0RUFubm90YXRpb25zKCkuYWRkKHNob3J0Y3V0QW5ub3RhdGlvbik7Ci0JCX0KLQkJZ2V0Vmlld1NlcnZpY2UoKQotCQkJCS5jcmVhdGVOb2RlKAotCQkJCQkJc2VtYW50aWNBZGFwdGVyLAotCQkJCQkJdmlldywKLQkJCQkJCVVNTFZpc3VhbElEUmVnaXN0cnkKLQkJCQkJCQkJLmdldFR5cGUoU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWUzRWRpdFBhcnQuVklTVUFMX0lEKSwKLQkJCQkJCVZpZXdVdGlsLkFQUEVORCwgdHJ1ZSwgZ2V0UHJlZmVyZW5jZXNIaW50KCkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL3ZpZXcvZmFjdG9yaWVzL1N0cnVjdHVyZWRBY3Rpdml0eU5vZGVOYW1lMlZpZXdGYWN0b3J5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvdmlldy9mYWN0b3JpZXMvU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWUyVmlld0ZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzdhMzRhMy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvdmlldy9mYWN0b3JpZXMvU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWUyVmlld0ZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQudmlldy5mYWN0b3JpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnZpZXcuZmFjdG9yaWVzLkJhc2ljTm9kZVZpZXdGYWN0b3J5OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVOYW1lMlZpZXdGYWN0b3J5IGV4dGVuZHMKLQkJQmFzaWNOb2RlVmlld0ZhY3RvcnkgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRlY29yYXRlVmlldyhWaWV3IGNvbnRhaW5lclZpZXcsIFZpZXcgdmlldywKLQkJCUlBZGFwdGFibGUgc2VtYW50aWNBZGFwdGVyLCBTdHJpbmcgc2VtYW50aWNIaW50LCBpbnQgaW5kZXgsCi0JCQlib29sZWFuIHBlcnNpc3RlZCkgewotCQlzdXBlci5kZWNvcmF0ZVZpZXcoY29udGFpbmVyVmlldywgdmlldywgc2VtYW50aWNBZGFwdGVyLCBzZW1hbnRpY0hpbnQsCi0JCQkJaW5kZXgsIHBlcnNpc3RlZCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBMaXN0IGNyZWF0ZVN0eWxlcyhWaWV3IHZpZXcpIHsKLQkJTGlzdCBzdHlsZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXJldHVybiBzdHlsZXM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL3ZpZXcvZmFjdG9yaWVzL1N0cnVjdHVyZWRBY3Rpdml0eU5vZGVOYW1lM1ZpZXdGYWN0b3J5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvdmlldy9mYWN0b3JpZXMvU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWUzVmlld0ZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDkyOWVlMy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvdmlldy9mYWN0b3JpZXMvU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWUzVmlld0ZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQudmlldy5mYWN0b3JpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnZpZXcuZmFjdG9yaWVzLkJhc2ljTm9kZVZpZXdGYWN0b3J5OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVOYW1lM1ZpZXdGYWN0b3J5IGV4dGVuZHMKLQkJQmFzaWNOb2RlVmlld0ZhY3RvcnkgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRlY29yYXRlVmlldyhWaWV3IGNvbnRhaW5lclZpZXcsIFZpZXcgdmlldywKLQkJCUlBZGFwdGFibGUgc2VtYW50aWNBZGFwdGVyLCBTdHJpbmcgc2VtYW50aWNIaW50LCBpbnQgaW5kZXgsCi0JCQlib29sZWFuIHBlcnNpc3RlZCkgewotCQlzdXBlci5kZWNvcmF0ZVZpZXcoY29udGFpbmVyVmlldywgdmlldywgc2VtYW50aWNBZGFwdGVyLCBzZW1hbnRpY0hpbnQsCi0JCQkJaW5kZXgsIHBlcnNpc3RlZCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBMaXN0IGNyZWF0ZVN0eWxlcyhWaWV3IHZpZXcpIHsKLQkJTGlzdCBzdHlsZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXJldHVybiBzdHlsZXM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL3ZpZXcvZmFjdG9yaWVzL1N0cnVjdHVyZWRBY3Rpdml0eU5vZGVOYW1lVmlld0ZhY3RvcnkuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC92aWV3L2ZhY3Rvcmllcy9TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZVZpZXdGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3YmI3ZTguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL3ZpZXcvZmFjdG9yaWVzL1N0cnVjdHVyZWRBY3Rpdml0eU5vZGVOYW1lVmlld0ZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQudmlldy5mYWN0b3JpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnZpZXcuZmFjdG9yaWVzLkJhc2ljTm9kZVZpZXdGYWN0b3J5OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVOYW1lVmlld0ZhY3RvcnkgZXh0ZW5kcyBCYXNpY05vZGVWaWV3RmFjdG9yeSB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZGVjb3JhdGVWaWV3KFZpZXcgY29udGFpbmVyVmlldywgVmlldyB2aWV3LAotCQkJSUFkYXB0YWJsZSBzZW1hbnRpY0FkYXB0ZXIsIFN0cmluZyBzZW1hbnRpY0hpbnQsIGludCBpbmRleCwKLQkJCWJvb2xlYW4gcGVyc2lzdGVkKSB7Ci0JCXN1cGVyLmRlY29yYXRlVmlldyhjb250YWluZXJWaWV3LCB2aWV3LCBzZW1hbnRpY0FkYXB0ZXIsIHNlbWFudGljSGludCwKLQkJCQlpbmRleCwgcGVyc2lzdGVkKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIExpc3QgY3JlYXRlU3R5bGVzKFZpZXcgdmlldykgewotCQlMaXN0IHN0eWxlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJcmV0dXJuIHN0eWxlczsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvdmlldy9mYWN0b3JpZXMvU3RydWN0dXJlZEFjdGl2aXR5Tm9kZVZpZXdGYWN0b3J5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvdmlldy9mYWN0b3JpZXMvU3RydWN0dXJlZEFjdGl2aXR5Tm9kZVZpZXdGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzNjE2ZGMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL3ZpZXcvZmFjdG9yaWVzL1N0cnVjdHVyZWRBY3Rpdml0eU5vZGVWaWV3RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC52aWV3LmZhY3RvcmllczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRWNvcmVGYWN0b3J5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5BY3Rpdml0eUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWVFZGl0UGFydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnBhcnQuVU1MVmlzdWFsSURSZWdpc3RyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS51dGlsLlZpZXdVdGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS52aWV3LmZhY3Rvcmllcy5BYnN0cmFjdFNoYXBlVmlld0ZhY3Rvcnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob3RhdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlVmlld0ZhY3RvcnkgZXh0ZW5kcyBBYnN0cmFjdFNoYXBlVmlld0ZhY3RvcnkgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZCAKLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBjcmVhdGVTdHlsZXMoVmlldyB2aWV3KSB7Ci0JCUxpc3Qgc3R5bGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlzdHlsZXMuYWRkKE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRm9udFN0eWxlKCkpOwotCQlzdHlsZXMuYWRkKE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRGVzY3JpcHRpb25TdHlsZSgpKTsKLQkJc3R5bGVzLmFkZChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZpbGxTdHlsZSgpKTsKLQkJc3R5bGVzLmFkZChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUxpbmVTdHlsZSgpKTsKLQkJcmV0dXJuIHN0eWxlczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZGVjb3JhdGVWaWV3KFZpZXcgY29udGFpbmVyVmlldywgVmlldyB2aWV3LAotCQkJSUFkYXB0YWJsZSBzZW1hbnRpY0FkYXB0ZXIsIFN0cmluZyBzZW1hbnRpY0hpbnQsIGludCBpbmRleCwKLQkJCWJvb2xlYW4gcGVyc2lzdGVkKSB7Ci0JCWlmIChzZW1hbnRpY0hpbnQgPT0gbnVsbCkgewotCQkJc2VtYW50aWNIaW50ID0gVU1MVmlzdWFsSURSZWdpc3RyeQotCQkJCQkuZ2V0VHlwZShTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlRWRpdFBhcnQuVklTVUFMX0lEKTsKLQkJCXZpZXcuc2V0VHlwZShzZW1hbnRpY0hpbnQpOwotCQl9Ci0JCXN1cGVyLmRlY29yYXRlVmlldyhjb250YWluZXJWaWV3LCB2aWV3LCBzZW1hbnRpY0FkYXB0ZXIsIHNlbWFudGljSGludCwKLQkJCQlpbmRleCwgcGVyc2lzdGVkKTsKLQkJaWYgKCFBY3Rpdml0eUVkaXRQYXJ0Lk1PREVMX0lELmVxdWFscyhVTUxWaXN1YWxJRFJlZ2lzdHJ5Ci0JCQkJLmdldE1vZGVsSUQoY29udGFpbmVyVmlldykpKSB7Ci0JCQlFQW5ub3RhdGlvbiBzaG9ydGN1dEFubm90YXRpb24gPSBFY29yZUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJCS5jcmVhdGVFQW5ub3RhdGlvbigpOwotCQkJc2hvcnRjdXRBbm5vdGF0aW9uLnNldFNvdXJjZSgiU2hvcnRjdXQiKTsgLy8kTk9OLU5MUy0xJAotCQkJc2hvcnRjdXRBbm5vdGF0aW9uLmdldERldGFpbHMoKS5wdXQoCi0JCQkJCSJtb2RlbElEIiwgQWN0aXZpdHlFZGl0UGFydC5NT0RFTF9JRCk7IC8vJE5PTi1OTFMtMSQKLQkJCXZpZXcuZ2V0RUFubm90YXRpb25zKCkuYWRkKHNob3J0Y3V0QW5ub3RhdGlvbik7Ci0JCX0KLQkJZ2V0Vmlld1NlcnZpY2UoKS5jcmVhdGVOb2RlKAotCQkJCXNlbWFudGljQWRhcHRlciwKLQkJCQl2aWV3LAotCQkJCVVNTFZpc3VhbElEUmVnaXN0cnkKLQkJCQkJCS5nZXRUeXBlKFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVOYW1lRWRpdFBhcnQuVklTVUFMX0lEKSwKLQkJCQlWaWV3VXRpbC5BUFBFTkQsIHRydWUsIGdldFByZWZlcmVuY2VzSGludCgpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC8uY2xhc3NwYXRoIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1MWM4ZjIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvLm9wdGlvbnMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvLm9wdGlvbnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiNWRmNmQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLy5vcHRpb25zCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi0jIERlYnVnZ2luZyBvcHRpb25zIGZvciB0aGUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkIHBsdWctaW4KLQotIyBUdXJuIG9uIGdlbmVyYWwgZGVidWdnaW5nIGZvciB0aGUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkIHBsdWctaW4KLW9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9kZWJ1Zz1mYWxzZQotCi0jIFR1cm4gb24gZGVidWdnaW5nIG9mIHZpc3VhbElEIHByb2Nlc3NpbmcKLW9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9kZWJ1Zy92aXN1YWxJRD10cnVlClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLy5wcm9qZWN0IGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZjE3NmY2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZDwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlNmZjMWIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZDsgc2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS41LjAucXVhbGlmaWVyCi1CdW5kbGUtQ2xhc3NQYXRoOiAuCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQucGFydC5BY3Rpdml0eURldGFpbERpYWdyYW1FZGl0b3JQbHVnaW4KLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZCwKLSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wYXJ0cywKLSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQucGFydCwKLSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQucHJvdmlkZXJzLAotIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5zZXJ2aWNlCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLAotIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLAotIG9yZy5lY2xpcHNlLmpmYWNlLAotIG9yZy5lY2xpcHNlLnVpLmlkZSwKLSBvcmcuZWNsaXBzZS51aS52aWV3cywKLSBvcmcuZWNsaXBzZS51aS53b3JrYmVuY2gsCi0gb3JnLmVjbGlwc2UudWkud29ya2JlbmNoLnRleHRlZGl0b3IsCi0gb3JnLmVjbGlwc2UuZW1mLmVjb3JlLAotIG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWksCi0gb3JnLmVjbGlwc2UuZW1mLmVkaXQudWksCi0gb3JnLmVjbGlwc2UuZ2VmO3Zpc2liaWxpdHk6PXJlZXhwb3J0LAotIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb3JlLAotIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb21tYW5kcy5jb3JlLAotIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi51aS5wcm9wZXJ0aWVzLAotIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWksCi0gb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wcmludGluZy5yZW5kZXIsCi0gb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wcmludGluZywKLSBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnByb3ZpZGVycywKLSBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnByb3ZpZGVycy5pZGUsCi0gb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZW5kZXIsCi0gb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXNvdXJjZXMuZWRpdG9yLAotIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVzb3VyY2VzLmVkaXRvci5pZGUsCi0gb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24ucHJvdmlkZXJzLAotIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmVkaXQ7dmlzaWJpbGl0eTo9cmVleHBvcnQsCi0gb3JnLmVjbGlwc2UuZXBmLnVtYTt2aXNpYmlsaXR5Oj1yZWV4cG9ydCwKLSBvcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQ7dmlzaWJpbGl0eTo9cmVleHBvcnQsCi0gb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpO3Zpc2liaWxpdHk6PXJlZXhwb3J0LAotIG9yZy5lY2xpcHNlLmRyYXcyZDt2aXNpYmlsaXR5Oj1yZWV4cG9ydCwKLSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLAotIG9yZy5lY2xpcHNlLmVwZi5jb21tb24sCi0gb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aQotRWNsaXBzZS1MYXp5U3RhcnQ6IHRydWUKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL2J1aWxkLnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGQ5MmRiOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotYmluLmluY2x1ZGVzID0gLixcCi0gICAgICAgICAgICAgICBpY29ucy8sXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMKLWphcnMuY29tcGlsZS5vcmRlciA9IC4KLXNvdXJjZS4uID0gc3JjLwotb3V0cHV0Li4gPSBiaW4vClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL2ljb25zL2RpYWdyYW0vUm9sZURlc2NyaXB0b3IuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL2ljb25zL2RpYWdyYW0vUm9sZURlc2NyaXB0b3IuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNjhjN2I4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9pY29ucy9kaWFncmFtL1JvbGVEZXNjcmlwdG9yLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9pY29ucy9kaWFncmFtL1Rhc2tEZXNjcmlwdG9yLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9pY29ucy9kaWFncmFtL1Rhc2tEZXNjcmlwdG9yLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTU0ZTI2ZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvaWNvbnMvZGlhZ3JhbS9UYXNrRGVzY3JpcHRvci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvaWNvbnMvZGlhZ3JhbS9Xb3JrUHJvZHVjdERlc2NyaXB0b3IuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL2ljb25zL2RpYWdyYW0vV29ya1Byb2R1Y3REZXNjcmlwdG9yLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGVlYThjYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvaWNvbnMvZGlhZ3JhbS9Xb3JrUHJvZHVjdERlc2NyaXB0b3IuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL2ljb25zL2Z1bGwvZGxjbDE2L3Jlc2V0X2RpYWdyYW0uZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL2ljb25zL2Z1bGwvZGxjbDE2L3Jlc2V0X2RpYWdyYW0uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNzNlNjc0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9pY29ucy9mdWxsL2RsY2wxNi9yZXNldF9kaWFncmFtLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9pY29ucy9mdWxsL2R0b29sMTYvQURERWRpdG9yLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9pY29ucy9mdWxsL2R0b29sMTYvQURERWRpdG9yLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODQ0NGMxMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvaWNvbnMvZnVsbC9kdG9vbDE2L0FEREVkaXRvci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvaWNvbnMvZnVsbC9lbGNsMTYvcmVzZXRfZGlhZ3JhbS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvaWNvbnMvZnVsbC9lbGNsMTYvcmVzZXRfZGlhZ3JhbS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhOWM4YzYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL2ljb25zL2Z1bGwvZWxjbDE2L3Jlc2V0X2RpYWdyYW0uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL2ljb25zL2Z1bGwvZXRvb2wxNi9BRERFZGl0b3IuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL2ljb25zL2Z1bGwvZXRvb2wxNi9BRERFZGl0b3IuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMTY3OTA5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9pY29ucy9mdWxsL2V0b29sMTYvQURERWRpdG9yLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9pY29ucy9vYmoxNi9Nb2RlbERpYWdyYW1GaWxlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9pY29ucy9vYmoxNi9Nb2RlbERpYWdyYW1GaWxlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzM2NzZhNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvaWNvbnMvb2JqMTYvTW9kZWxEaWFncmFtRmlsZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvaWNvbnMvd2l6YmFuL05ld01vZGVsV2l6YXJkLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9pY29ucy93aXpiYW4vTmV3TW9kZWxXaXphcmQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZGY4NWZlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9pY29ucy93aXpiYW4vTmV3TW9kZWxXaXphcmQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL21lc3NhZ2VzLnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvbWVzc2FnZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjBiZTkzOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvbWVzc2FnZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSNOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgTk8gTkVFRCBUTyBUUkFOU0xBVEUgRk9MTE9XSU5HIFBST1BFUlRJRVMsIFNJTkNFIFdFIERPTidUIFVTRSBJVCBGT1IgVEhJUyBSRUxFQVNFCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgVE9ETzogbWFudWFsbHkgcHV0IGtleXMgYW5kIHZhbHVlcwotc0RpYWdyYW1EaWFncmFtRWRpdG9yVXRpbF9PcGVuTW9kZWxSZXNvdXJjZUVycm9yRGlhbG9nVGl0bGU9RXJyb3IKLURpYWdyYW1EaWFncmFtRWRpdG9yVXRpbF9PcGVuTW9kZWxSZXNvdXJjZUVycm9yRGlhbG9nTWVzc2FnZT1GYWlsZWQgdG8gbG9hZCBtb2RlbCBmaWxlIHswfQotRGlhZ3JhbURpYWdyYW1FZGl0b3JVdGlsX0NyZWF0ZURpYWdyYW1Qcm9ncmVzc1Rhc2s9Q3JlYXRpbmcgZGlhZ3JhbSBhbmQgbW9kZWwgZmlsZXMKLURpYWdyYW1EaWFncmFtRWRpdG9yVXRpbF9DcmVhdGVEaWFncmFtQ29tbWFuZExhYmVsPUNyZWF0aW5nIGRpYWdyYW0gYW5kIG1vZGVsCi1EaWFncmFtRG9jdW1lbnRQcm92aWRlcl9pc01vZGlmaWFibGU9VXBkYXRpbmcgY2FjaGUgZmFpbGVkCi1EaWFncmFtRG9jdW1lbnRQcm92aWRlcl9oYW5kbGVFbGVtZW50Q29udGVudENoYW5nZWQ9RmFpbGVkIHRvIHJlZnJlc2ggaGllcmFyY2h5IGZvciBjaGFuZ2VkIHJlc291cmNlCi1EaWFncmFtRG9jdW1lbnRQcm92aWRlcl9JbmNvcnJlY3RJbnB1dEVycm9yPXsxfQotRGlhZ3JhbURvY3VtZW50UHJvdmlkZXJfVW5hYmxlVG9Mb2FkUmVzb3VyY2VFcnJvcj1VbmFibGUgdG8gbG9hZCBkaWFncmFtIHJlc291cmNlCi1EaWFncmFtRG9jdW1lbnRQcm92aWRlcl9Ob0RpYWdyYW1JblJlc291cmNlRXJyb3I9RGlhZ3JhbSBpcyBub3QgcHJlc2VudCBpbiByZXNvdXJjZQotRGlhZ3JhbURvY3VtZW50UHJvdmlkZXJfRGlhZ3JhbUxvYWRpbmdFcnJvcj1FcnJvciBsb2FkaW5nIGRpYWdyYW0KLURpYWdyYW1Eb2N1bWVudFByb3ZpZGVyX1Vuc3luY2hyb25pemVkRmlsZVNhdmVFcnJvcj1UaGUgZmlsZSBoYXMgYmVlbiBjaGFuZ2VkIG9uIHRoZSBmaWxlIHN5c3RlbQotRGlhZ3JhbURvY3VtZW50UHJvdmlkZXJfU2F2ZURpYWdyYW1UYXNrPVNhdmluZyBkaWFncmFtCi1EaWFncmFtRG9jdW1lbnRQcm92aWRlcl9TYXZlTmV4dFJlc291cmNlVGFzaz1TYXZpbmcgezB9Ci1EaWFncmFtSW5pdERpYWdyYW1GaWxlQWN0aW9uX0luaXREaWFncmFtRmlsZVJlc291cmNlRXJyb3JEaWFsb2dUaXRsZT1FcnJvcgotRGlhZ3JhbUluaXREaWFncmFtRmlsZUFjdGlvbl9Jbml0RGlhZ3JhbUZpbGVSZXNvdXJjZUVycm9yRGlhbG9nTWVzc2FnZT1Nb2RlbCBmaWxlIGxvYWRpbmcgZmFpbGVkCi1EaWFncmFtSW5pdERpYWdyYW1GaWxlQWN0aW9uX0luaXREaWFncmFtRmlsZVdpemFyZFRpdGxlPUluaXRpYWxpemUgbmV3IHswfSBkaWFncmFtIGZpbGUKLURpYWdyYW1Jbml0RGlhZ3JhbUZpbGVBY3Rpb25fT3Blbk1vZGVsRmlsZURpYWxvZ1RpdGxlPVNlbGVjdCBkb21haW4gbW9kZWwKLURpYWdyYW1OZXdEaWFncmFtRmlsZVdpemFyZF9DcmVhdGlvblBhZ2VOYW1lPUluaXRpYWxpemUgbmV3IGRpYWdyYW0gZmlsZQotRGlhZ3JhbU5ld0RpYWdyYW1GaWxlV2l6YXJkX0NyZWF0aW9uUGFnZVRpdGxlPURpYWdyYW0gZmlsZQotRGlhZ3JhbU5ld0RpYWdyYW1GaWxlV2l6YXJkX0NyZWF0aW9uUGFnZURlc2NyaXB0aW9uPUNyZWF0ZSBuZXcgZGlhZ3JhbSBiYXNlZCBvbiB7MH0gbW9kZWwgY29udGVudAotRGlhZ3JhbU5ld0RpYWdyYW1GaWxlV2l6YXJkX1Jvb3RTZWxlY3Rpb25QYWdlTmFtZT1TZWxlY3QgZGlhZ3JhbSByb290IGVsZW1lbnQKLURpYWdyYW1OZXdEaWFncmFtRmlsZVdpemFyZF9Sb290U2VsZWN0aW9uUGFnZVRpdGxlPURpYWdyYW0gcm9vdCBlbGVtZW50Ci1EaWFncmFtTmV3RGlhZ3JhbUZpbGVXaXphcmRfUm9vdFNlbGVjdGlvblBhZ2VEZXNjcmlwdGlvbj1TZWxlY3Qgc2VtYW50aWMgbW9kZWwgZWxlbWVudCB0byBiZSBkZXBpY3RlZCBvbiBkaWFncmFtCi1EaWFncmFtTmV3RGlhZ3JhbUZpbGVXaXphcmRfUm9vdFNlbGVjdGlvblBhZ2VTZWxlY3Rpb25UaXRsZT1TZWxlY3QgZGlhZ3JhbSByb290IGVsZW1lbnQ6Ci1EaWFncmFtTmV3RGlhZ3JhbUZpbGVXaXphcmRfUm9vdFNlbGVjdGlvblBhZ2VOb1NlbGVjdGlvbk1lc3NhZ2U9RGlhZ3JhbSByb290IGVsZW1lbnQgaXMgbm90IHNlbGVjdGVkCi1EaWFncmFtTmV3RGlhZ3JhbUZpbGVXaXphcmRfUm9vdFNlbGVjdGlvblBhZ2VJbnZhbGlkU2VsZWN0aW9uTWVzc2FnZT1JbnZhbGlkIGRpYWdyYW0gcm9vdCBlbGVtZW50IGlzIHNlbGVjdGVkCi1EaWFncmFtTmV3RGlhZ3JhbUZpbGVXaXphcmRfSW5pdERpYWdyYW1Db21tYW5kPUluaXRpYWxpemluZyBkaWFncmFtIGNvbnRlbnRzCi1EaWFncmFtTmV3RGlhZ3JhbUZpbGVXaXphcmRfSW5jb3JyZWN0Um9vdEVycm9yPUluY29ycmVjdCBtb2RlbCBvYmplY3Qgc3RvcmVkIGFzIGEgcm9vdCByZXNvdXJjZSBvYmplY3QKLU5vZGVzMUdyb3VwX3RpdGxlPU5vZGVzCi1MaW5rczJHcm91cF90aXRsZT1MaW5rcwotUm9sZU5vZGUxQ3JlYXRpb25Ub29sX3RpdGxlPVJvbGVOb2RlCi1Sb2xlTm9kZTFDcmVhdGlvblRvb2xfZGVzYz1DcmVhdGUgbmV3IFJvbGVOb2RlCi1Sb2xlVGFza0NvbXBvc2l0ZTJDcmVhdGlvblRvb2xfdGl0bGU9Um9sZVRhc2tDb21wb3NpdGUKLVJvbGVUYXNrQ29tcG9zaXRlMkNyZWF0aW9uVG9vbF9kZXNjPUNyZWF0ZSBuZXcgUm9sZVRhc2tDb21wb3NpdGUKLVRhc2tOb2RlM0NyZWF0aW9uVG9vbF90aXRsZT1UYXNrTm9kZQotVGFza05vZGUzQ3JlYXRpb25Ub29sX2Rlc2M9Q3JlYXRlIG5ldyBUYXNrTm9kZQotV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZTRDcmVhdGlvblRvb2xfdGl0bGU9V29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZQotV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZTRDcmVhdGlvblRvb2xfZGVzYz1DcmVhdGUgbmV3IFdvcmtQcm9kdWNOb2RlCi1Xb3JrUHJvZHVjdENvbXBvc2l0ZTVDcmVhdGlvblRvb2xfdGl0bGU9V29ya1Byb2R1Y3RDb21wb3NpdGUKLVdvcmtQcm9kdWN0Q29tcG9zaXRlNUNyZWF0aW9uVG9vbF9kZXNjPUNyZWF0ZSBuZXcgV29ya1Byb2R1Y3RDb21wb3NpdGUKLUxpbmsxQ3JlYXRpb25Ub29sX3RpdGxlPUxpbmsKLUxpbmsxQ3JlYXRpb25Ub29sX2Rlc2M9Q3JlYXRlIG5ldyBsaW5rCi1Sb2xlVGFza0NvbXBvc2l0ZVJvbGVUYXNrQ29tcGFydG1lbnRFZGl0UGFydF90aXRsZT1Sb2xlVGFza0NvbXBhcnRtZW50Ci1Xb3JrUHJvZHVjdENvbXBvc2l0ZVdvcmtQcm9kdWN0Q29tcGFydG1lbnRFZGl0UGFydF90aXRsZT1Xb3JrUHJvZHVjdENvbXBhcnRtZW50Ci0KLUNvbW1hbmROYW1lX09wZW5EaWFncmFtPU9wZW4gRGlhZ3JhbQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL21vZGVsL2FkZC5nbWZnZW4gYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvbW9kZWwvYWRkLmdtZmdlbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzg4M2IzMy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvbW9kZWwvYWRkLmdtZmdlbgorKysgL2Rldi9udWxsCkBAIC0xLDQwMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGdtZmdlbjpHZW5FZGl0b3JHZW5lcmF0b3IgeG1pOnZlcnNpb249IjIuMCIKLSAgICB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiCi0gICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgICB4bWxuczpnbWZnZW49Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZ21mLzIwMDUvR2VuTW9kZWwiIHBhY2thZ2VOYW1lUHJlZml4PSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQiCi0gICAgbW9kZWxJRD0iQUREIgotICAgIHNhbWVGaWxlRm9yRGlhZ3JhbUFuZE1vZGVsPSJ0cnVlIgotICAgIGRpYWdyYW1GaWxlRXh0ZW5zaW9uPSJhZGQiCi0gICAgdGVtcGxhdGVEaXJlY3Rvcnk9IiI+Ci0gIDxkaWFncmFtCi0gICAgICB2aXN1YWxJRD0iNzkiCi0gICAgICBlZGl0UGFydENsYXNzTmFtZT0iQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdFBhcnQiCi0gICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJBY3Rpdml0eURldGFpbERpYWdyYW1JdGVtU2VtYW50aWNFZGl0UG9saWN5IgotICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iQWN0aXZpdHlEZXRhaWxEaWFncmFtVmlld0ZhY3RvcnkiCi0gICAgICBpY29uUHJvdmlkZXJQcmlvcml0eT0iTG93IgotICAgICAgY2Fub25pY2FsRWRpdFBvbGljeUNsYXNzTmFtZT0iQWN0aXZpdHlEZXRhaWxEaWFncmFtQ2Fub25pY2FsRWRpdFBvbGljeSI+Ci0gICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MKLSAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vRGlhZ3JhbSIvPgotICAgIDxlbGVtZW50VHlwZQotICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOk1ldGFtb2RlbFR5cGUiCi0gICAgICAgIGVkaXRIZWxwZXJDbGFzc05hbWU9IkFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRIZWxwZXIiLz4KLSAgICA8dmlld21hcAotICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOkZpZ3VyZVZpZXdtYXAiCi0gICAgICAgIGZpZ3VyZVF1YWxpZmllZENsYXNzTmFtZT0ib3JnLmVjbGlwc2UuZHJhdzJkLkZyZWVmb3JtTGF5ZXIiLz4KLSAgICA8ZG9tYWluRGlhZ3JhbUVsZW1lbnQKLSAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5nZW5tb2RlbCMvL21vZGVsL0FjdGl2aXR5RGV0YWlsRGlhZ3JhbSIvPgotICAgIDxjaGlsZE5vZGVzCi0gICAgICAgIHZpc3VhbElEPSIyMDAxIgotICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iUm9sZU5vZGVFZGl0UGFydCIKLSAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iUm9sZU5vZGVJdGVtU2VtYW50aWNFZGl0UG9saWN5IgotICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJSb2xlTm9kZVZpZXdGYWN0b3J5IgotICAgICAgICBjYW5vbmljYWxFZGl0UG9saWN5Q2xhc3NOYW1lPSJSb2xlTm9kZUNhbm9uaWNhbEVkaXRQb2xpY3kiCi0gICAgICAgIGdyYXBoaWNhbE5vZGVFZGl0UG9saWN5Q2xhc3NOYW1lPSJSb2xlTm9kZUdyYXBoaWNhbE5vZGVFZGl0UG9saWN5IgotICAgICAgICBjb250YWluZXJzPSIvL0BkaWFncmFtL0B0b3BMZXZlbE5vZGVzLjAiPgotICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MKLSAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+Ci0gICAgICA8ZWxlbWVudFR5cGUKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOk1ldGFtb2RlbFR5cGUiCi0gICAgICAgICAgZWRpdEhlbHBlckNsYXNzTmFtZT0iUm9sZU5vZGVFZGl0SGVscGVyIi8+Ci0gICAgICA8dmlld21hcAotICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46SW5uZXJDbGFzc1ZpZXdtYXAiCi0gICAgICAgICAgY2xhc3NOYW1lPSJSb2xlTm9kZUZpZ3VyZSIKLSAgICAgICAgICBjbGFzc0JvZHk9IiYjeEQ7JiN4QTsmI3hEOyYjeEE7LyoqJiN4RDsmI3hBOyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7ICovJiN4RDsmI3hBO3B1YmxpYyBjbGFzcyBSb2xlTm9kZUZpZ3VyZSBleHRlbmRzIG9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmUgeyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHVibGljIFJvbGVOb2RlRmlndXJlKCkgeyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3g5O3RoaXMuc2V0T3V0bGluZShmYWxzZSk7JiN4RDsmI3hBOyYjeDk7JiN4OTt0aGlzLnNldEJhY2tncm91bmRDb2xvcihST0xFTk9ERUZJR1VSRV9CQUNLJiN4RDsmI3hBOyYjeEQ7JiN4QTspOyYjeEQ7JiN4QTsmI3g5OyYjeDk7Y3JlYXRlQ29udGVudHMoKTsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbnRlbnRzKCl7JiN4RDsmI3hBOyYjeDk7JiN4OTtvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZmlnXzAgPSBuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsKCk7JiN4RDsmI3hBO2ZpZ18wLnNldFRleHQoJnF1b3Q7Jmx0Oy4uLj4mcXVvdDspOyYjeEQ7JiN4QTsmI3g5OyYjeDk7ZmlnXzAuc2V0Rm9udCgmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeDk7Uk9MRU5PREVOQU1FRklHVVJFX0ZPTlQpOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5OyYjeDk7c2V0RmlndXJlUm9sZU5vZGVOYW1lRmlndXJlKGZpZ18wKTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeDk7T2JqZWN0IGxheURhdGEwID0gbnVsbDsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7JiN4OTt0aGlzLmFkZChmaWdfMCwgbGF5RGF0YTApOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCBmUm9sZU5vZGVOYW1lRmlndXJlOyAmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3B1YmxpYyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZ2V0RmlndXJlUm9sZU5vZGVOYW1lRmlndXJlKCkgeyYjeEQ7JiN4QTsmI3g5OyYjeDk7cmV0dXJuIGZSb2xlTm9kZU5hbWVGaWd1cmU7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIHZvaWQgc2V0RmlndXJlUm9sZU5vZGVOYW1lRmlndXJlKG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCBmaWcpeyYjeEQ7JiN4QTsmI3g5OyYjeDk7ZlJvbGVOb2RlTmFtZUZpZ3VyZSA9IGZpZzsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIGJvb2xlYW4gbXlVc2VMb2NhbENvb3JkaW5hdGVzID0gZmFsc2U7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcm90ZWN0ZWQgYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKCkgeyYjeEQ7JiN4QTsmI3g5OyYjeDk7cmV0dXJuIG15VXNlTG9jYWxDb29yZGluYXRlczsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcm90ZWN0ZWQgdm9pZCBzZXRVc2VMb2NhbENvb3JkaW5hdGVzKGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcykgeyYjeEQ7JiN4QTsmI3g5OyYjeDk7bXlVc2VMb2NhbENvb3JkaW5hdGVzID0gdXNlTG9jYWxDb29yZGluYXRlczsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeEQ7JiN4QTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3B1YmxpYyBzdGF0aWMgZmluYWwgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yIFJPTEVOT0RFRklHVVJFX0JBQ0sgPSBuZXcgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yKG51bGwsIDI1NSwgMjU1LCAxNTYpOyYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwdWJsaWMgc3RhdGljIGZpbmFsIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250IFJPTEVOT0RFTkFNRUZJR1VSRV9GT05UID0gbmV3IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250KG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXkuZ2V0Q3VycmVudCgpLCAmcXVvdDtBcmlhbCZxdW90OywgOCwgb3JnLmVjbGlwc2Uuc3d0LlNXVC5OT1JNQUwpOyYjeEQ7JiN4QTsiPgotICAgICAgICA8YXR0cmlidXRlcwotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpTdHlsZUF0dHJpYnV0ZXMiCi0gICAgICAgICAgICBmaXhlZEJhY2tncm91bmQ9InRydWUiLz4KLSAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmRyYXcyZDwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWk8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgPC92aWV3bWFwPgotICAgICAgPG1vZGVsRmFjZXQ+Ci0gICAgICAgIDxtZXRhQ2xhc3MKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZ2VubW9kZWwjLy9tb2RlbC9Sb2xlTm9kZSIvPgotICAgICAgICA8Y29udGFpbm1lbnRNZXRhRmVhdHVyZQotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5nZW5tb2RlbCMvL21vZGVsL05vZGVDb250YWluZXIvbm9kZXMiLz4KLSAgICAgICAgPGNoaWxkTWV0YUZlYXR1cmUKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZ2VubW9kZWwjLy9tb2RlbC9Ob2RlQ29udGFpbmVyL25vZGVzIi8+Ci0gICAgICA8L21vZGVsRmFjZXQ+Ci0gICAgICA8bGFiZWxzCi0gICAgICAgICAgdmlzdWFsSUQ9IjQwMDEiCi0gICAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9IlJvbGVOb2RlTmFtZUVkaXRQYXJ0IgotICAgICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IlJvbGVOb2RlTmFtZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiCi0gICAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iUm9sZU5vZGVOYW1lVmlld0ZhY3RvcnkiPgotICAgICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcwotICAgICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vTm9kZSIvPgotICAgICAgICA8dmlld21hcAotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpQYXJlbnRBc3NpZ25lZFZpZXdtYXAiCi0gICAgICAgICAgICBnZXR0ZXJOYW1lPSJnZXRGaWd1cmVSb2xlTm9kZU5hbWVGaWd1cmUiCi0gICAgICAgICAgICBmaWd1cmVRdWFsaWZpZWRDbGFzc05hbWU9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCI+Ci0gICAgICAgICAgPGF0dHJpYnV0ZXMKLSAgICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpTdHlsZUF0dHJpYnV0ZXMiCi0gICAgICAgICAgICAgIGZpeGVkRm9udD0idHJ1ZSIvPgotICAgICAgICA8L3ZpZXdtYXA+Ci0gICAgICAgIDxtb2RlbEZhY2V0Ci0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOkZlYXR1cmVMYWJlbE1vZGVsRmFjZXQiPgotICAgICAgICAgIDxtZXRhRmVhdHVyZQotICAgICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmdlbm1vZGVsIy8vbW9kZWwvTmFtZWROb2RlL25hbWUiLz4KLSAgICAgICAgPC9tb2RlbEZhY2V0PgotICAgICAgPC9sYWJlbHM+Ci0gICAgPC9jaGlsZE5vZGVzPgotICAgIDxjaGlsZE5vZGVzCi0gICAgICAgIHZpc3VhbElEPSIyMDAyIgotICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iVGFza05vZGVFZGl0UGFydCIKLSAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iVGFza05vZGVJdGVtU2VtYW50aWNFZGl0UG9saWN5IgotICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJUYXNrTm9kZVZpZXdGYWN0b3J5IgotICAgICAgICBjYW5vbmljYWxFZGl0UG9saWN5Q2xhc3NOYW1lPSJUYXNrTm9kZUNhbm9uaWNhbEVkaXRQb2xpY3kiCi0gICAgICAgIGdyYXBoaWNhbE5vZGVFZGl0UG9saWN5Q2xhc3NOYW1lPSJUYXNrTm9kZUdyYXBoaWNhbE5vZGVFZGl0UG9saWN5IgotICAgICAgICBjb250YWluZXJzPSIvL0BkaWFncmFtL0B0b3BMZXZlbE5vZGVzLjAiPgotICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MKLSAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+Ci0gICAgICA8ZWxlbWVudFR5cGUKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOk1ldGFtb2RlbFR5cGUiCi0gICAgICAgICAgZWRpdEhlbHBlckNsYXNzTmFtZT0iVGFza05vZGVFZGl0SGVscGVyIi8+Ci0gICAgICA8dmlld21hcAotICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46SW5uZXJDbGFzc1ZpZXdtYXAiCi0gICAgICAgICAgY2xhc3NOYW1lPSJUYXNrTm9kZUZpZ3VyZSIKLSAgICAgICAgICBjbGFzc0JvZHk9IiYjeEQ7JiN4QTsmI3hEOyYjeEE7LyoqJiN4RDsmI3hBOyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7ICovJiN4RDsmI3hBO3B1YmxpYyBjbGFzcyBUYXNrTm9kZUZpZ3VyZSBleHRlbmRzIG9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmUgeyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHVibGljIFRhc2tOb2RlRmlndXJlKCkgeyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3g5O3RoaXMuc2V0T3V0bGluZShmYWxzZSk7JiN4RDsmI3hBOyYjeDk7JiN4OTt0aGlzLnNldExpbmVXaWR0aCgwKTsmI3hEOyYjeEE7JiN4OTsmI3g5O3RoaXMuc2V0QmFja2dyb3VuZENvbG9yKFRBU0tOT0RFRklHVVJFX0JBQ0smI3hEOyYjeEE7JiN4RDsmI3hBOyk7JiN4RDsmI3hBOyYjeDk7JiN4OTtjcmVhdGVDb250ZW50cygpOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIHZvaWQgY3JlYXRlQ29udGVudHMoKXsmI3hEOyYjeEE7JiN4OTsmI3g5O29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCBmaWdfMCA9IG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwoKTsmI3hEOyYjeEE7ZmlnXzAuc2V0VGV4dCgmcXVvdDsmbHQ7Li4uPiZxdW90Oyk7JiN4RDsmI3hBOyYjeDk7JiN4OTtmaWdfMC5zZXRGb250KCYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4OTtUQVNLTk9ERU5BTUVGSUdVUkVfRk9OVCk7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7JiN4OTtzZXRGaWd1cmVUYXNrTm9kZU5hbWVGaWd1cmUoZmlnXzApOyYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4OTtPYmplY3QgbGF5RGF0YTAgPSBudWxsOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsmI3g5O3RoaXMuYWRkKGZpZ18wLCBsYXlEYXRhMCk7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3ByaXZhdGUgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIGZUYXNrTm9kZU5hbWVGaWd1cmU7ICYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHVibGljIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCBnZXRGaWd1cmVUYXNrTm9kZU5hbWVGaWd1cmUoKSB7JiN4RDsmI3hBOyYjeDk7JiN4OTtyZXR1cm4gZlRhc2tOb2RlTmFtZUZpZ3VyZTsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3ByaXZhdGUgdm9pZCBzZXRGaWd1cmVUYXNrTm9kZU5hbWVGaWd1cmUob3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIGZpZyl7JiN4RDsmI3hBOyYjeDk7JiN4OTtmVGFza05vZGVOYW1lRmlndXJlID0gZmlnOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3ByaXZhdGUgYm9vbGVhbiBteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSBmYWxzZTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3Byb3RlY3RlZCBib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMoKSB7JiN4RDsmI3hBOyYjeDk7JiN4OTtyZXR1cm4gbXlVc2VMb2NhbENvb3JkaW5hdGVzOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3Byb3RlY3RlZCB2b2lkIHNldFVzZUxvY2FsQ29vcmRpbmF0ZXMoYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKSB7JiN4RDsmI3hBOyYjeDk7JiN4OTtteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSB1c2VMb2NhbENvb3JkaW5hdGVzOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4RDsmI3hBO30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHVibGljIHN0YXRpYyBmaW5hbCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udCBUQVNLTk9ERU5BTUVGSUdVUkVfRk9OVCA9IG5ldyBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udChvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5LmdldEN1cnJlbnQoKSwgJnF1b3Q7QXJpYWwmcXVvdDssIDgsIG9yZy5lY2xpcHNlLnN3dC5TV1QuTk9STUFMKTsmI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHVibGljIHN0YXRpYyBmaW5hbCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3IgVEFTS05PREVGSUdVUkVfQkFDSyA9IG5ldyBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3IobnVsbCwgMjU1LCAyNTUsIDE1Nik7JiN4RDsmI3hBOyI+Ci0gICAgICAgIDxhdHRyaWJ1dGVzCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlN0eWxlQXR0cmlidXRlcyIKLSAgICAgICAgICAgIGZpeGVkQmFja2dyb3VuZD0idHJ1ZSIvPgotICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZHJhdzJkPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aTwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICA8L3ZpZXdtYXA+Ci0gICAgICA8bW9kZWxGYWNldD4KLSAgICAgICAgPG1ldGFDbGFzcwotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5nZW5tb2RlbCMvL21vZGVsL1Rhc2tOb2RlIi8+Ci0gICAgICAgIDxjb250YWlubWVudE1ldGFGZWF0dXJlCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmdlbm1vZGVsIy8vbW9kZWwvTm9kZUNvbnRhaW5lci9ub2RlcyIvPgotICAgICAgICA8Y2hpbGRNZXRhRmVhdHVyZQotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5nZW5tb2RlbCMvL21vZGVsL05vZGVDb250YWluZXIvbm9kZXMiLz4KLSAgICAgIDwvbW9kZWxGYWNldD4KLSAgICAgIDxsYWJlbHMKLSAgICAgICAgICB2aXN1YWxJRD0iNDAwMiIKLSAgICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iVGFza05vZGVOYW1lRWRpdFBhcnQiCi0gICAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iVGFza05vZGVOYW1lSXRlbVNlbWFudGljRWRpdFBvbGljeSIKLSAgICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJUYXNrTm9kZU5hbWVWaWV3RmFjdG9yeSI+Ci0gICAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzCi0gICAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+Ci0gICAgICAgIDx2aWV3bWFwCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlBhcmVudEFzc2lnbmVkVmlld21hcCIKLSAgICAgICAgICAgIGdldHRlck5hbWU9ImdldEZpZ3VyZVRhc2tOb2RlTmFtZUZpZ3VyZSIKLSAgICAgICAgICAgIGZpZ3VyZVF1YWxpZmllZENsYXNzTmFtZT0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIj4KLSAgICAgICAgICA8YXR0cmlidXRlcwotICAgICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlN0eWxlQXR0cmlidXRlcyIKLSAgICAgICAgICAgICAgZml4ZWRGb250PSJ0cnVlIi8+Ci0gICAgICAgIDwvdmlld21hcD4KLSAgICAgICAgPG1vZGVsRmFjZXQKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46RmVhdHVyZUxhYmVsTW9kZWxGYWNldCI+Ci0gICAgICAgICAgPG1ldGFGZWF0dXJlCi0gICAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZ2VubW9kZWwjLy9tb2RlbC9OYW1lZE5vZGUvbmFtZSIvPgotICAgICAgICA8L21vZGVsRmFjZXQ+Ci0gICAgICA8L2xhYmVscz4KLSAgICA8L2NoaWxkTm9kZXM+Ci0gICAgPGNoaWxkTm9kZXMKLSAgICAgICAgdmlzdWFsSUQ9IjIwMDMiCi0gICAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlRWRpdFBhcnQiCi0gICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IldvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVJdGVtU2VtYW50aWNFZGl0UG9saWN5IgotICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlVmlld0ZhY3RvcnkiCi0gICAgICAgIGNhbm9uaWNhbEVkaXRQb2xpY3lDbGFzc05hbWU9IldvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVDYW5vbmljYWxFZGl0UG9saWN5IgotICAgICAgICBncmFwaGljYWxOb2RlRWRpdFBvbGljeUNsYXNzTmFtZT0iV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZUdyYXBoaWNhbE5vZGVFZGl0UG9saWN5IgotICAgICAgICBjb250YWluZXJzPSIvL0BkaWFncmFtL0B0b3BMZXZlbE5vZGVzLjEiPgotICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MKLSAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+Ci0gICAgICA8ZWxlbWVudFR5cGUKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOk1ldGFtb2RlbFR5cGUiCi0gICAgICAgICAgZWRpdEhlbHBlckNsYXNzTmFtZT0iV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZUVkaXRIZWxwZXIiLz4KLSAgICAgIDx2aWV3bWFwCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpJbm5lckNsYXNzVmlld21hcCIKLSAgICAgICAgICBjbGFzc05hbWU9IldvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVGaWd1cmUiCi0gICAgICAgICAgY2xhc3NCb2R5PSImI3hEOyYjeEE7JiN4RDsmI3hBOy8qKiYjeEQ7JiN4QTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyAqLyYjeEQ7JiN4QTtwdWJsaWMgY2xhc3MgV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZUZpZ3VyZSBleHRlbmRzIG9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmUgeyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHVibGljIFdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVGaWd1cmUoKSB7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeDk7dGhpcy5zZXRPdXRsaW5lKGZhbHNlKTsmI3hEOyYjeEE7JiN4OTsmI3g5O3RoaXMuc2V0QmFja2dyb3VuZENvbG9yKFdPUktQUk9EVUNUREVTQ1JJUFRPUk5PREVGSUdVUkVfQkFDSyYjeEQ7JiN4QTsmI3hEOyYjeEE7KTsmI3hEOyYjeEE7JiN4OTsmI3g5O2NyZWF0ZUNvbnRlbnRzKCk7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3ByaXZhdGUgdm9pZCBjcmVhdGVDb250ZW50cygpeyYjeEQ7JiN4QTsmI3g5OyYjeDk7b3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIGZpZ18wID0gbmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCgpOyYjeEQ7JiN4QTtmaWdfMC5zZXRUZXh0KCZxdW90OyZsdDsuLi4+JnF1b3Q7KTsmI3hEOyYjeEE7JiN4OTsmI3g5O2ZpZ18wLnNldEZvbnQoJiN4RDsmI3hBOyYjeDk7JiN4OTsmI3g5O1dPUktQUk9EVUNUTk9ERU5BTUVGSUdVUkVfRk9OVCk7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7JiN4OTtzZXRGaWd1cmVXb3JrUHJvZHVjdE5vZGVOYW1lRmlndXJlKGZpZ18wKTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeDk7T2JqZWN0IGxheURhdGEwID0gbnVsbDsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7JiN4OTt0aGlzLmFkZChmaWdfMCwgbGF5RGF0YTApOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCBmV29ya1Byb2R1Y3ROb2RlTmFtZUZpZ3VyZTsgJiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwdWJsaWMgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIGdldEZpZ3VyZVdvcmtQcm9kdWN0Tm9kZU5hbWVGaWd1cmUoKSB7JiN4RDsmI3hBOyYjeDk7JiN4OTtyZXR1cm4gZldvcmtQcm9kdWN0Tm9kZU5hbWVGaWd1cmU7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIHZvaWQgc2V0RmlndXJlV29ya1Byb2R1Y3ROb2RlTmFtZUZpZ3VyZShvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZmlnKXsmI3hEOyYjeEE7JiN4OTsmI3g5O2ZXb3JrUHJvZHVjdE5vZGVOYW1lRmlndXJlID0gZmlnOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3ByaXZhdGUgYm9vbGVhbiBteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSBmYWxzZTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3Byb3RlY3RlZCBib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMoKSB7JiN4RDsmI3hBOyYjeDk7JiN4OTtyZXR1cm4gbXlVc2VMb2NhbENvb3JkaW5hdGVzOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3Byb3RlY3RlZCB2b2lkIHNldFVzZUxvY2FsQ29vcmRpbmF0ZXMoYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKSB7JiN4RDsmI3hBOyYjeDk7JiN4OTtteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSB1c2VMb2NhbENvb3JkaW5hdGVzOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4RDsmI3hBO30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHVibGljIHN0YXRpYyBmaW5hbCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udCBXT1JLUFJPRFVDVE5PREVOQU1FRklHVVJFX0ZPTlQgPSBuZXcgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnQob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheS5nZXRDdXJyZW50KCksICZxdW90O0FyaWFsJnF1b3Q7LCA4LCBvcmcuZWNsaXBzZS5zd3QuU1dULk5PUk1BTCk7JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3B1YmxpYyBzdGF0aWMgZmluYWwgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yIFdPUktQUk9EVUNUREVTQ1JJUFRPUk5PREVGSUdVUkVfQkFDSyA9IG5ldyBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3IobnVsbCwgMjU1LCAyNTUsIDIwNSk7JiN4RDsmI3hBOyI+Ci0gICAgICAgIDxhdHRyaWJ1dGVzCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlN0eWxlQXR0cmlidXRlcyIKLSAgICAgICAgICAgIGZpeGVkQmFja2dyb3VuZD0idHJ1ZSIvPgotICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZHJhdzJkPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aTwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICA8L3ZpZXdtYXA+Ci0gICAgICA8bW9kZWxGYWNldD4KLSAgICAgICAgPG1ldGFDbGFzcwotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5nZW5tb2RlbCMvL21vZGVsL1dvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGUiLz4KLSAgICAgICAgPGNvbnRhaW5tZW50TWV0YUZlYXR1cmUKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZ2VubW9kZWwjLy9tb2RlbC9Ob2RlQ29udGFpbmVyL25vZGVzIi8+Ci0gICAgICAgIDxjaGlsZE1ldGFGZWF0dXJlCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmdlbm1vZGVsIy8vbW9kZWwvTm9kZUNvbnRhaW5lci9ub2RlcyIvPgotICAgICAgPC9tb2RlbEZhY2V0PgotICAgICAgPGxhYmVscwotICAgICAgICAgIHZpc3VhbElEPSI0MDAzIgotICAgICAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlTmFtZUVkaXRQYXJ0IgotICAgICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IldvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVOYW1lSXRlbVNlbWFudGljRWRpdFBvbGljeSIKLSAgICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlTmFtZVZpZXdGYWN0b3J5Ij4KLSAgICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL05vZGUiLz4KLSAgICAgICAgPHZpZXdtYXAKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46UGFyZW50QXNzaWduZWRWaWV3bWFwIgotICAgICAgICAgICAgZ2V0dGVyTmFtZT0iZ2V0RmlndXJlV29ya1Byb2R1Y3ROb2RlTmFtZUZpZ3VyZSIKLSAgICAgICAgICAgIGZpZ3VyZVF1YWxpZmllZENsYXNzTmFtZT0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIj4KLSAgICAgICAgICA8YXR0cmlidXRlcwotICAgICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlN0eWxlQXR0cmlidXRlcyIKLSAgICAgICAgICAgICAgZml4ZWRGb250PSJ0cnVlIi8+Ci0gICAgICAgIDwvdmlld21hcD4KLSAgICAgICAgPG1vZGVsRmFjZXQKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46RmVhdHVyZUxhYmVsTW9kZWxGYWNldCI+Ci0gICAgICAgICAgPG1ldGFGZWF0dXJlCi0gICAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZ2VubW9kZWwjLy9tb2RlbC9OYW1lZE5vZGUvbmFtZSIvPgotICAgICAgICA8L21vZGVsRmFjZXQ+Ci0gICAgICA8L2xhYmVscz4KLSAgICA8L2NoaWxkTm9kZXM+Ci0gICAgPHRvcExldmVsTm9kZXMKLSAgICAgICAgdmlzdWFsSUQ9IjEwMDEiCi0gICAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJSb2xlVGFza0NvbXBvc2l0ZUVkaXRQYXJ0IgotICAgICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJSb2xlVGFza0NvbXBvc2l0ZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiCi0gICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9IlJvbGVUYXNrQ29tcG9zaXRlVmlld0ZhY3RvcnkiCi0gICAgICAgIGNoaWxkTm9kZXM9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMCAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjEiCi0gICAgICAgIGNhbm9uaWNhbEVkaXRQb2xpY3lDbGFzc05hbWU9IlJvbGVUYXNrQ29tcG9zaXRlQ2Fub25pY2FsRWRpdFBvbGljeSIKLSAgICAgICAgY29tcGFydG1lbnRzPSIvL0BkaWFncmFtL0Bjb21wYXJ0bWVudHMuMCIKLSAgICAgICAgZ3JhcGhpY2FsTm9kZUVkaXRQb2xpY3lDbGFzc05hbWU9IlJvbGVUYXNrQ29tcG9zaXRlR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kiPgotICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MKLSAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+Ci0gICAgICA8ZWxlbWVudFR5cGUKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOk1ldGFtb2RlbFR5cGUiCi0gICAgICAgICAgZWRpdEhlbHBlckNsYXNzTmFtZT0iUm9sZVRhc2tDb21wb3NpdGVFZGl0SGVscGVyIi8+Ci0gICAgICA8dmlld21hcAotICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46SW5uZXJDbGFzc1ZpZXdtYXAiCi0gICAgICAgICAgbGF5b3V0VHlwZT0iVE9PTEJBUl9MQVlPVVQiCi0gICAgICAgICAgY2xhc3NOYW1lPSJSb2xlVGFza0NvbXBvc2l0ZUZpZ3VyZSIKLSAgICAgICAgICBjbGFzc0JvZHk9IiYjeEQ7JiN4QTsmI3hEOyYjeEE7LyoqJiN4RDsmI3hBOyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7ICovJiN4RDsmI3hBO3B1YmxpYyBjbGFzcyBSb2xlVGFza0NvbXBvc2l0ZUZpZ3VyZSBleHRlbmRzIG9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmUgeyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHVibGljIFJvbGVUYXNrQ29tcG9zaXRlRmlndXJlKCkgeyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3g5O29yZy5lY2xpcHNlLmRyYXcyZC5Ub29sYmFyTGF5b3V0IG15R2VuTGF5b3V0TWFuYWdlciA9IG5ldyBvcmcuZWNsaXBzZS5kcmF3MmQuVG9vbGJhckxheW91dCgpOyYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4OTsmI3g5O215R2VuTGF5b3V0TWFuYWdlci5zZXRTdHJldGNoTWlub3JBeGlzKGZhbHNlKTsmI3hEOyYjeEE7JiN4OTsmI3g5O215R2VuTGF5b3V0TWFuYWdlci5zZXRNaW5vckFsaWdubWVudChvcmcuZWNsaXBzZS5kcmF3MmQuVG9vbGJhckxheW91dC5BTElHTl9DRU5URVIpOyYjeDk7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3g5O215R2VuTGF5b3V0TWFuYWdlci5zZXRTcGFjaW5nKDUpOyYjeEQ7JiN4QTsmI3g5OyYjeDk7bXlHZW5MYXlvdXRNYW5hZ2VyLnNldFZlcnRpY2FsKGZhbHNlKTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeDk7dGhpcy5zZXRMYXlvdXRNYW5hZ2VyKG15R2VuTGF5b3V0TWFuYWdlcik7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4OTt0aGlzLnNldEJhY2tncm91bmRDb2xvcihST0xFVEFTS0NPTVBPU0lURUZJR1VSRV9CQUNLJiN4RDsmI3hBOyYjeEQ7JiN4QTspOyYjeEQ7JiN4QTsmI3g5OyYjeDk7dGhpcy5zZXRCb3JkZXIoJiN4OTsmI3hEOyYjeEE7bmV3IG9yZy5lY2xpcHNlLmRyYXcyZC5NYXJnaW5Cb3JkZXIoZ2V0TWFwTW9kZSgpLkRQdG9MUCgwKSwgZ2V0TWFwTW9kZSgpLkRQdG9MUCgwKSwgZ2V0TWFwTW9kZSgpLkRQdG9MUCgwKSwgZ2V0TWFwTW9kZSgpLkRQdG9MUCgwKSkmI3hEOyYjeEE7KTsmI3hEOyYjeEE7JiN4OTsmI3g5O2NyZWF0ZUNvbnRlbnRzKCk7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3ByaXZhdGUgdm9pZCBjcmVhdGVDb250ZW50cygpeyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJpdmF0ZSBib29sZWFuIG15VXNlTG9jYWxDb29yZGluYXRlcyA9IGZhbHNlOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJvdGVjdGVkIGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcygpIHsmI3hEOyYjeEE7JiN4OTsmI3g5O3JldHVybiBteVVzZUxvY2FsQ29vcmRpbmF0ZXM7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJvdGVjdGVkIHZvaWQgc2V0VXNlTG9jYWxDb29yZGluYXRlcyhib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMpIHsmI3hEOyYjeEE7JiN4OTsmI3g5O215VXNlTG9jYWxDb29yZGluYXRlcyA9IHVzZUxvY2FsQ29vcmRpbmF0ZXM7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3hEOyYjeEE7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwdWJsaWMgc3RhdGljIGZpbmFsIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvciBST0xFVEFTS0NPTVBPU0lURUZJR1VSRV9CQUNLID0gbmV3IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcihudWxsLCAyNTUsIDI1NSwgMTU2KTsmI3hEOyYjeEE7Ij4KLSAgICAgICAgPGF0dHJpYnV0ZXMKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46U3R5bGVBdHRyaWJ1dGVzIgotICAgICAgICAgICAgZml4ZWRCYWNrZ3JvdW5kPSJ0cnVlIi8+Ci0gICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5kcmF3MmQ8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgIDwvdmlld21hcD4KLSAgICAgIDxtb2RlbEZhY2V0PgotICAgICAgICA8bWV0YUNsYXNzCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmdlbm1vZGVsIy8vbW9kZWwvUm9sZVRhc2tDb21wb3NpdGUiLz4KLSAgICAgICAgPGNvbnRhaW5tZW50TWV0YUZlYXR1cmUKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZ2VubW9kZWwjLy9tb2RlbC9Ob2RlQ29udGFpbmVyL25vZGVzIi8+Ci0gICAgICAgIDxjaGlsZE1ldGFGZWF0dXJlCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmdlbm1vZGVsIy8vbW9kZWwvTm9kZUNvbnRhaW5lci9ub2RlcyIvPgotICAgICAgPC9tb2RlbEZhY2V0PgotICAgIDwvdG9wTGV2ZWxOb2Rlcz4KLSAgICA8dG9wTGV2ZWxOb2RlcwotICAgICAgICB2aXN1YWxJRD0iMTAwMiIKLSAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9IldvcmtQcm9kdWN0Q29tcG9zaXRlRWRpdFBhcnQiCi0gICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IldvcmtQcm9kdWN0Q29tcG9zaXRlSXRlbVNlbWFudGljRWRpdFBvbGljeSIKLSAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iV29ya1Byb2R1Y3RDb21wb3NpdGVWaWV3RmFjdG9yeSIKLSAgICAgICAgY2hpbGROb2Rlcz0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4yIgotICAgICAgICBjYW5vbmljYWxFZGl0UG9saWN5Q2xhc3NOYW1lPSJXb3JrUHJvZHVjdENvbXBvc2l0ZUNhbm9uaWNhbEVkaXRQb2xpY3kiCi0gICAgICAgIGNvbXBhcnRtZW50cz0iLy9AZGlhZ3JhbS9AY29tcGFydG1lbnRzLjEiCi0gICAgICAgIGdyYXBoaWNhbE5vZGVFZGl0UG9saWN5Q2xhc3NOYW1lPSJXb3JrUHJvZHVjdENvbXBvc2l0ZUdyYXBoaWNhbE5vZGVFZGl0UG9saWN5Ij4KLSAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzCi0gICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vTm9kZSIvPgotICAgICAgPGVsZW1lbnRUeXBlCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpNZXRhbW9kZWxUeXBlIgotICAgICAgICAgIGVkaXRIZWxwZXJDbGFzc05hbWU9IldvcmtQcm9kdWN0Q29tcG9zaXRlRWRpdEhlbHBlciIvPgotICAgICAgPHZpZXdtYXAKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOklubmVyQ2xhc3NWaWV3bWFwIgotICAgICAgICAgIGxheW91dFR5cGU9IlRPT0xCQVJfTEFZT1VUIgotICAgICAgICAgIGNsYXNzTmFtZT0iV29ya1Byb2R1Y3RDb21wb3NpdGVGaWd1cmUiCi0gICAgICAgICAgY2xhc3NCb2R5PSImI3hEOyYjeEE7JiN4RDsmI3hBOy8qKiYjeEQ7JiN4QTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyAqLyYjeEQ7JiN4QTtwdWJsaWMgY2xhc3MgV29ya1Byb2R1Y3RDb21wb3NpdGVGaWd1cmUgZXh0ZW5kcyBvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlIHsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3B1YmxpYyBXb3JrUHJvZHVjdENvbXBvc2l0ZUZpZ3VyZSgpIHsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4OTtvcmcuZWNsaXBzZS5kcmF3MmQuVG9vbGJhckxheW91dCBteUdlbkxheW91dE1hbmFnZXIgPSBuZXcgb3JnLmVjbGlwc2UuZHJhdzJkLlRvb2xiYXJMYXlvdXQoKTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeDk7JiN4OTtteUdlbkxheW91dE1hbmFnZXIuc2V0U3RyZXRjaE1pbm9yQXhpcyhmYWxzZSk7JiN4RDsmI3hBOyYjeDk7JiN4OTtteUdlbkxheW91dE1hbmFnZXIuc2V0TWlub3JBbGlnbm1lbnQob3JnLmVjbGlwc2UuZHJhdzJkLlRvb2xiYXJMYXlvdXQuQUxJR05fQ0VOVEVSKTsmI3g5OyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4OTtteUdlbkxheW91dE1hbmFnZXIuc2V0U3BhY2luZyg1KTsmI3hEOyYjeEE7JiN4OTsmI3g5O215R2VuTGF5b3V0TWFuYWdlci5zZXRWZXJ0aWNhbCh0cnVlKTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeDk7dGhpcy5zZXRMYXlvdXRNYW5hZ2VyKG15R2VuTGF5b3V0TWFuYWdlcik7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4OTt0aGlzLnNldEJhY2tncm91bmRDb2xvcihXT1JLUFJPRFVDVENPTVBPU0lURUZJR1VSRV9CQUNLJiN4RDsmI3hBOyYjeEQ7JiN4QTspOyYjeEQ7JiN4QTsmI3g5OyYjeDk7dGhpcy5zZXRCb3JkZXIoJiN4OTsmI3hEOyYjeEE7bmV3IG9yZy5lY2xpcHNlLmRyYXcyZC5NYXJnaW5Cb3JkZXIoZ2V0TWFwTW9kZSgpLkRQdG9MUCgwKSwgZ2V0TWFwTW9kZSgpLkRQdG9MUCgwKSwgZ2V0TWFwTW9kZSgpLkRQdG9MUCgwKSwgZ2V0TWFwTW9kZSgpLkRQdG9MUCgwKSkmI3hEOyYjeEE7KTsmI3hEOyYjeEE7JiN4OTsmI3g5O2NyZWF0ZUNvbnRlbnRzKCk7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3ByaXZhdGUgdm9pZCBjcmVhdGVDb250ZW50cygpeyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJpdmF0ZSBib29sZWFuIG15VXNlTG9jYWxDb29yZGluYXRlcyA9IGZhbHNlOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJvdGVjdGVkIGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcygpIHsmI3hEOyYjeEE7JiN4OTsmI3g5O3JldHVybiBteVVzZUxvY2FsQ29vcmRpbmF0ZXM7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJvdGVjdGVkIHZvaWQgc2V0VXNlTG9jYWxDb29yZGluYXRlcyhib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMpIHsmI3hEOyYjeEE7JiN4OTsmI3g5O215VXNlTG9jYWxDb29yZGluYXRlcyA9IHVzZUxvY2FsQ29vcmRpbmF0ZXM7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3hEOyYjeEE7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwdWJsaWMgc3RhdGljIGZpbmFsIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvciBXT1JLUFJPRFVDVENPTVBPU0lURUZJR1VSRV9CQUNLID0gbmV3IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcihudWxsLCAyNTUsIDI1NSwgMjA1KTsmI3hEOyYjeEE7Ij4KLSAgICAgICAgPGF0dHJpYnV0ZXMKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46U3R5bGVBdHRyaWJ1dGVzIgotICAgICAgICAgICAgZml4ZWRCYWNrZ3JvdW5kPSJ0cnVlIi8+Ci0gICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5kcmF3MmQ8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgIDwvdmlld21hcD4KLSAgICAgIDxtb2RlbEZhY2V0PgotICAgICAgICA8bWV0YUNsYXNzCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmdlbm1vZGVsIy8vbW9kZWwvV29ya1Byb2R1Y3RDb21wb3NpdGUiLz4KLSAgICAgICAgPGNvbnRhaW5tZW50TWV0YUZlYXR1cmUKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZ2VubW9kZWwjLy9tb2RlbC9Ob2RlQ29udGFpbmVyL25vZGVzIi8+Ci0gICAgICAgIDxjaGlsZE1ldGFGZWF0dXJlCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmdlbm1vZGVsIy8vbW9kZWwvTm9kZUNvbnRhaW5lci9ub2RlcyIvPgotICAgICAgPC9tb2RlbEZhY2V0PgotICAgIDwvdG9wTGV2ZWxOb2Rlcz4KLSAgICA8bGlua3MKLSAgICAgICAgdmlzdWFsSUQ9IjMwMDEiCi0gICAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJMaW5rRWRpdFBhcnQiCi0gICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IkxpbmtJdGVtU2VtYW50aWNFZGl0UG9saWN5IgotICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJMaW5rVmlld0ZhY3RvcnkiPgotICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MKLSAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9FZGdlIi8+Ci0gICAgICA8ZWxlbWVudFR5cGUKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOk1ldGFtb2RlbFR5cGUiCi0gICAgICAgICAgZWRpdEhlbHBlckNsYXNzTmFtZT0iTGlua0VkaXRIZWxwZXIiLz4KLSAgICAgIDx2aWV3bWFwCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpJbm5lckNsYXNzVmlld21hcCIKLSAgICAgICAgICBjbGFzc05hbWU9IkxpbmtGaWd1cmUiCi0gICAgICAgICAgY2xhc3NCb2R5PSImI3hEOyYjeEE7JiN4RDsmI3hBOy8qKiYjeEQ7JiN4QTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyAqLyYjeEQ7JiN4QTtwdWJsaWMgY2xhc3MgTGlua0ZpZ3VyZSBleHRlbmRzIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLlBvbHlsaW5lQ29ubmVjdGlvbkV4IHsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3B1YmxpYyBMaW5rRmlndXJlKCkgeyYjeEQ7JiN4QTsmI3g5OyYjeDk7dGhpcy5zZXRGb3JlZ3JvdW5kQ29sb3Iob3JnLmVjbGlwc2UuZHJhdzJkLkNvbG9yQ29uc3RhbnRzLmJsYWNrJiN4RDsmI3hBOyYjeEQ7JiN4QTspOyYjeEQ7JiN4QTsmI3g5OyYjeDk7c2V0VGFyZ2V0RGVjb3JhdGlvbihjcmVhdGVUYXJnZXREZWNvcmF0aW9uKCkpOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIG9yZy5lY2xpcHNlLmRyYXcyZC5Qb2x5bGluZURlY29yYXRpb24gY3JlYXRlVGFyZ2V0RGVjb3JhdGlvbigpIHsmI3hEOyYjeEE7b3JnLmVjbGlwc2UuZHJhdzJkLlBvbHlsaW5lRGVjb3JhdGlvbiBkZiA9IG5ldyBvcmcuZWNsaXBzZS5kcmF3MmQuUG9seWxpbmVEZWNvcmF0aW9uKCk7JiN4RDsmI3hBOy8vIGRpc3BhdGNoTmV4dD8mI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7JiN4OTtvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnRMaXN0IHBsID0gbmV3IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludExpc3QoKTsmI3hEOyYjeEE7JiN4OTsmI3g5O3BsLmFkZFBvaW50KC0xLCAxKTsmI3hEOyYjeEE7JiN4OTsmI3g5O3BsLmFkZFBvaW50KDAsIDApOyYjeEQ7JiN4QTsmI3g5OyYjeDk7cGwuYWRkUG9pbnQoLTEsIC0xKTsmI3hEOyYjeEE7JiN4OTsmI3g5O2RmLnNldFRlbXBsYXRlKHBsKTsmI3hEOyYjeEE7JiN4OTsmI3g5O2RmLnNldFNjYWxlKGdldE1hcE1vZGUoKS5EUHRvTFAoNyksIGdldE1hcE1vZGUoKS5EUHRvTFAoMykpOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsmI3g5O3JldHVybiBkZjsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeEQ7JiN4QTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyI+Ci0gICAgICAgIDxhdHRyaWJ1dGVzCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlN0eWxlQXR0cmlidXRlcyIKLSAgICAgICAgICAgIGZpeGVkRm9yZWdyb3VuZD0idHJ1ZSIvPgotICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZHJhdzJkPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aTwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICA8L3ZpZXdtYXA+Ci0gICAgICA8bW9kZWxGYWNldAotICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46VHlwZUxpbmtNb2RlbEZhY2V0Ij4KLSAgICAgICAgPG1ldGFDbGFzcwotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5nZW5tb2RlbCMvL21vZGVsL0xpbmsiLz4KLSAgICAgICAgPGNvbnRhaW5tZW50TWV0YUZlYXR1cmUKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZ2VubW9kZWwjLy9tb2RlbC9Ob2RlL291dGdvaW5nQ29ubmVjdGlvbnMiLz4KLSAgICAgICAgPGNoaWxkTWV0YUZlYXR1cmUKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZ2VubW9kZWwjLy9tb2RlbC9Ob2RlL291dGdvaW5nQ29ubmVjdGlvbnMiLz4KLSAgICAgICAgPHNvdXJjZU1ldGFGZWF0dXJlCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmdlbm1vZGVsIy8vbW9kZWwvTGluay9zb3VyY2UiLz4KLSAgICAgICAgPHRhcmdldE1ldGFGZWF0dXJlCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmdlbm1vZGVsIy8vbW9kZWwvTGluay90YXJnZXQiLz4KLSAgICAgIDwvbW9kZWxGYWNldD4KLSAgICAgIDxsYWJlbHMKLSAgICAgICAgICB2aXN1YWxJRD0iNDAwNCIKLSAgICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iTGlua05hbWVFZGl0UGFydCIKLSAgICAgICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJMaW5rTmFtZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiCi0gICAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iTGlua05hbWVWaWV3RmFjdG9yeSI+Ci0gICAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzCi0gICAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+Ci0gICAgICAgIDx2aWV3bWFwCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOkZpZ3VyZVZpZXdtYXAiCi0gICAgICAgICAgICBmaWd1cmVRdWFsaWZpZWRDbGFzc05hbWU9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCI+Ci0gICAgICAgICAgPGF0dHJpYnV0ZXMKLSAgICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpMYWJlbE9mZnNldEF0dHJpYnV0ZXMiCi0gICAgICAgICAgICAgIHk9IjQwIi8+Ci0gICAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmRyYXcyZDwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aTwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICAgIDwvdmlld21hcD4KLSAgICAgICAgPG1vZGVsRmFjZXQKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46RmVhdHVyZUxhYmVsTW9kZWxGYWNldCIKLSAgICAgICAgICAgIGVkaXRQYXR0ZXJuPSIiPgotICAgICAgICAgIDxtZXRhRmVhdHVyZQotICAgICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmdlbm1vZGVsIy8vbW9kZWwvTGluay9uYW1lIi8+Ci0gICAgICAgIDwvbW9kZWxGYWNldD4KLSAgICAgIDwvbGFiZWxzPgotICAgIDwvbGlua3M+Ci0gICAgPGNvbXBhcnRtZW50cwotICAgICAgICB2aXN1YWxJRD0iNTAwMSIKLSAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9IlJvbGVUYXNrQ29tcG9zaXRlUm9sZVRhc2tDb21wYXJ0bWVudEVkaXRQYXJ0IgotICAgICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJSb2xlVGFza0NvbXBvc2l0ZVJvbGVUYXNrQ29tcGFydG1lbnRJdGVtU2VtYW50aWNFZGl0UG9saWN5IgotICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJSb2xlVGFza0NvbXBvc2l0ZVJvbGVUYXNrQ29tcGFydG1lbnRWaWV3RmFjdG9yeSIKLSAgICAgICAgY2Fub25pY2FsRWRpdFBvbGljeUNsYXNzTmFtZT0iUm9sZVRhc2tDb21wb3NpdGVSb2xlVGFza0NvbXBhcnRtZW50Q2Fub25pY2FsRWRpdFBvbGljeSIKLSAgICAgICAgdGl0bGU9IlJvbGVUYXNrQ29tcGFydG1lbnQiCi0gICAgICAgIGNhbkNvbGxhcHNlPSJmYWxzZSIKLSAgICAgICAgbmVlZHNUaXRsZT0iZmFsc2UiCi0gICAgICAgIG5vZGU9Ii8vQGRpYWdyYW0vQHRvcExldmVsTm9kZXMuMCI+Ci0gICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcwotICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL05vZGUiLz4KLSAgICAgIDx2aWV3bWFwCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpGaWd1cmVWaWV3bWFwIgotICAgICAgICAgIGZpZ3VyZVF1YWxpZmllZENsYXNzTmFtZT0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5maWd1cmVzLlJlc2l6YWJsZUNvbXBhcnRtZW50RmlndXJlIj4KLSAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmRyYXcyZDwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWk8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgPC92aWV3bWFwPgotICAgIDwvY29tcGFydG1lbnRzPgotICAgIDxjb21wYXJ0bWVudHMKLSAgICAgICAgdmlzdWFsSUQ9IjUwMDIiCi0gICAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJXb3JrUHJvZHVjdENvbXBvc2l0ZVdvcmtQcm9kdWN0Q29tcGFydG1lbnRFZGl0UGFydCIKLSAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iV29ya1Byb2R1Y3RDb21wb3NpdGVXb3JrUHJvZHVjdENvbXBhcnRtZW50SXRlbVNlbWFudGljRWRpdFBvbGljeSIKLSAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iV29ya1Byb2R1Y3RDb21wb3NpdGVXb3JrUHJvZHVjdENvbXBhcnRtZW50Vmlld0ZhY3RvcnkiCi0gICAgICAgIGNhbm9uaWNhbEVkaXRQb2xpY3lDbGFzc05hbWU9IldvcmtQcm9kdWN0Q29tcG9zaXRlV29ya1Byb2R1Y3RDb21wYXJ0bWVudENhbm9uaWNhbEVkaXRQb2xpY3kiCi0gICAgICAgIHRpdGxlPSJXb3JrUHJvZHVjdENvbXBhcnRtZW50IgotICAgICAgICBjYW5Db2xsYXBzZT0iZmFsc2UiCi0gICAgICAgIG5lZWRzVGl0bGU9ImZhbHNlIgotICAgICAgICBub2RlPSIvL0BkaWFncmFtL0B0b3BMZXZlbE5vZGVzLjEiPgotICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MKLSAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+Ci0gICAgICA8dmlld21hcAotICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46RmlndXJlVmlld21hcCIKLSAgICAgICAgICBmaWd1cmVRdWFsaWZpZWRDbGFzc05hbWU9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZmlndXJlcy5SZXNpemFibGVDb21wYXJ0bWVudEZpZ3VyZSI+Ci0gICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5kcmF3MmQ8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgIDwvdmlld21hcD4KLSAgICA8L2NvbXBhcnRtZW50cz4KLSAgICA8cGFsZXR0ZT4KLSAgICAgIDxncm91cHMKLSAgICAgICAgICB0aXRsZT0iTm9kZXMiCi0gICAgICAgICAgY29sbGFwc2U9InRydWUiPgotICAgICAgICA8ZW50cmllcwotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpUb29sRW50cnkiCi0gICAgICAgICAgICB0aXRsZT0iUm9sZU5vZGUiCi0gICAgICAgICAgICBkZXNjcmlwdGlvbj0iQ3JlYXRlIG5ldyBSb2xlTm9kZSIKLSAgICAgICAgICAgIGdlbk5vZGVzPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjAiLz4KLSAgICAgICAgPGVudHJpZXMKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46VG9vbEVudHJ5IgotICAgICAgICAgICAgdGl0bGU9IlJvbGVUYXNrQ29tcG9zaXRlIgotICAgICAgICAgICAgZGVzY3JpcHRpb249IkNyZWF0ZSBuZXcgUm9sZVRhc2tDb21wb3NpdGUiCi0gICAgICAgICAgICBnZW5Ob2Rlcz0iLy9AZGlhZ3JhbS9AdG9wTGV2ZWxOb2Rlcy4wIi8+Ci0gICAgICAgIDxlbnRyaWVzCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlRvb2xFbnRyeSIKLSAgICAgICAgICAgIHRpdGxlPSJUYXNrTm9kZSIKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJDcmVhdGUgbmV3IFRhc2tOb2RlIgotICAgICAgICAgICAgZ2VuTm9kZXM9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMSIvPgotICAgICAgICA8ZW50cmllcwotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpUb29sRW50cnkiCi0gICAgICAgICAgICB0aXRsZT0iV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZSIKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJDcmVhdGUgbmV3IFdvcmtQcm9kdWNOb2RlIgotICAgICAgICAgICAgZ2VuTm9kZXM9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMiIvPgotICAgICAgICA8ZW50cmllcwotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpUb29sRW50cnkiCi0gICAgICAgICAgICB0aXRsZT0iV29ya1Byb2R1Y3RDb21wb3NpdGUiCi0gICAgICAgICAgICBkZXNjcmlwdGlvbj0iQ3JlYXRlIG5ldyBXb3JrUHJvZHVjdENvbXBvc2l0ZSIKLSAgICAgICAgICAgIGdlbk5vZGVzPSIvL0BkaWFncmFtL0B0b3BMZXZlbE5vZGVzLjEiLz4KLSAgICAgIDwvZ3JvdXBzPgotICAgICAgPGdyb3VwcwotICAgICAgICAgIHRpdGxlPSJMaW5rcyIKLSAgICAgICAgICBjb2xsYXBzZT0idHJ1ZSI+Ci0gICAgICAgIDxlbnRyaWVzCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlRvb2xFbnRyeSIKLSAgICAgICAgICAgIHRpdGxlPSJMaW5rIgotICAgICAgICAgICAgZGVzY3JpcHRpb249IkNyZWF0ZSBuZXcgbGluayIKLSAgICAgICAgICAgIGdlbkxpbmtzPSIvL0BkaWFncmFtL0BsaW5rcy4wIi8+Ci0gICAgICA8L2dyb3Vwcz4KLSAgICA8L3BhbGV0dGU+Ci0gIDwvZGlhZ3JhbT4KLSAgPHBsdWdpbgotICAgICAgaUQ9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZCIKLSAgICAgIG5hbWU9IkFjdGl2aXR5IERldGFpbCBEaWFncmFtIFBsdWdpbiIKLSAgICAgIHByb3ZpZGVyPSJFUEYiCi0gICAgICBwcmludGluZ0VuYWJsZWQ9InRydWUiCi0gICAgICBhY3RpdmF0b3JDbGFzc05hbWU9IkFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvclBsdWdpbiIvPgotICA8ZWRpdG9yCi0gICAgICBjbGFzc05hbWU9IkFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvciIKLSAgICAgIGlEPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQucGFydC5BY3Rpdml0eURldGFpbERpYWdyYW1FZGl0b3JJRCIvPgotICA8ZG9tYWluR2VuTW9kZWwKLSAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZ2VubW9kZWwjLyIvPgotPC9nbWZnZW46R2VuRWRpdG9yR2VuZXJhdG9yPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL21vZGVsL2FkZC5nbWZncmFwaCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9tb2RlbC9hZGQuZ21mZ3JhcGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1MTI1YzcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL21vZGVsL2FkZC5nbWZncmFwaAorKysgL2Rldi9udWxsCkBAIC0xLDE4MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGdtZmdyYXBoOkNhbnZhcyB4bWk6dmVyc2lvbj0iMi4wIgotICAgIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIKLSAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICAgIHhtbG5zOmdtZmdyYXBoPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2dtZi8yMDA1L0dyYXBoaWNhbERlZmluaXRpb24iIG5hbWU9Im1vZGVsIj4KLSAgPGZpZ3VyZXMKLSAgICAgIG5hbWU9IkRlZmF1bHQiPgotICAgIDxmaWd1cmVzCi0gICAgICAgIHhzaTp0eXBlPSJnbWZncmFwaDpSZWN0YW5nbGUiCi0gICAgICAgIHJlZmVyZW5jaW5nRWxlbWVudHM9IlJvbGVOb2RlIgotICAgICAgICBuYW1lPSJSb2xlTm9kZUZpZ3VyZSIKLSAgICAgICAgb3V0bGluZT0iZmFsc2UiPgotICAgICAgPGNoaWxkcmVuCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdyYXBoOkxhYmVsIgotICAgICAgICAgIHJlZmVyZW5jaW5nRWxlbWVudHM9IlJvbGVOb2RlTmFtZSIKLSAgICAgICAgICBuYW1lPSJSb2xlTm9kZU5hbWVGaWd1cmUiCi0gICAgICAgICAgdGV4dD0iJmx0Oy4uLj4iPgotICAgICAgICA8Zm9udAotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdyYXBoOkJhc2ljRm9udCIKLSAgICAgICAgICAgIGZhY2VOYW1lPSJBcmlhbCIKLSAgICAgICAgICAgIGhlaWdodD0iOCIvPgotICAgICAgPC9jaGlsZHJlbj4KLSAgICAgIDxiYWNrZ3JvdW5kQ29sb3IKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ3JhcGg6UkdCQ29sb3IiCi0gICAgICAgICAgcmVkPSIyNTUiCi0gICAgICAgICAgZ3JlZW49IjI1NSIKLSAgICAgICAgICBibHVlPSIxNTYiLz4KLSAgICA8L2ZpZ3VyZXM+Ci0gICAgPGZpZ3VyZXMKLSAgICAgICAgeHNpOnR5cGU9ImdtZmdyYXBoOlJlY3RhbmdsZSIKLSAgICAgICAgcmVmZXJlbmNpbmdFbGVtZW50cz0iUm9sZVRhc2tDb21wb3NpdGUiCi0gICAgICAgIG5hbWU9IlJvbGVUYXNrQ29tcG9zaXRlRmlndXJlIj4KLSAgICAgIDxsYXlvdXQKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ3JhcGg6Rmxvd0xheW91dCIKLSAgICAgICAgICBmb3JjZVNpbmdsZUxpbmU9InRydWUiCi0gICAgICAgICAgbWFqb3JBbGlnbm1lbnQ9IkNFTlRFUiIKLSAgICAgICAgICBtaW5vckFsaWdubWVudD0iQ0VOVEVSIgotICAgICAgICAgIG1pbm9yU3BhY2luZz0iMjAiLz4KLSAgICAgIDxiYWNrZ3JvdW5kQ29sb3IKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ3JhcGg6UkdCQ29sb3IiCi0gICAgICAgICAgcmVkPSIyNTUiCi0gICAgICAgICAgZ3JlZW49IjI1NSIKLSAgICAgICAgICBibHVlPSIxNTYiLz4KLSAgICAgIDxib3JkZXIKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ3JhcGg6TWFyZ2luQm9yZGVyIi8+Ci0gICAgPC9maWd1cmVzPgotICAgIDxmaWd1cmVzCi0gICAgICAgIHhzaTp0eXBlPSJnbWZncmFwaDpSZWN0YW5nbGUiCi0gICAgICAgIHJlZmVyZW5jaW5nRWxlbWVudHM9IlRhc2tOb2RlIgotICAgICAgICBuYW1lPSJUYXNrTm9kZUZpZ3VyZSIKLSAgICAgICAgb3V0bGluZT0iZmFsc2UiCi0gICAgICAgIGxpbmVXaWR0aD0iMCI+Ci0gICAgICA8Y2hpbGRyZW4KLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ3JhcGg6TGFiZWwiCi0gICAgICAgICAgcmVmZXJlbmNpbmdFbGVtZW50cz0iVGFza05vZGVOYW1lIgotICAgICAgICAgIG5hbWU9IlRhc2tOb2RlTmFtZUZpZ3VyZSIKLSAgICAgICAgICB0ZXh0PSImbHQ7Li4uPiI+Ci0gICAgICAgIDxmb250Ci0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ3JhcGg6QmFzaWNGb250IgotICAgICAgICAgICAgZmFjZU5hbWU9IkFyaWFsIgotICAgICAgICAgICAgaGVpZ2h0PSI4Ii8+Ci0gICAgICA8L2NoaWxkcmVuPgotICAgICAgPGJhY2tncm91bmRDb2xvcgotICAgICAgICAgIHhzaTp0eXBlPSJnbWZncmFwaDpSR0JDb2xvciIKLSAgICAgICAgICByZWQ9IjI1NSIKLSAgICAgICAgICBncmVlbj0iMjU1IgotICAgICAgICAgIGJsdWU9IjE1NiIvPgotICAgIDwvZmlndXJlcz4KLSAgICA8ZmlndXJlcwotICAgICAgICB4c2k6dHlwZT0iZ21mZ3JhcGg6UmVjdGFuZ2xlIgotICAgICAgICByZWZlcmVuY2luZ0VsZW1lbnRzPSJXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlIgotICAgICAgICBuYW1lPSJXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlRmlndXJlIgotICAgICAgICBvdXRsaW5lPSJmYWxzZSI+Ci0gICAgICA8Y2hpbGRyZW4KLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ3JhcGg6TGFiZWwiCi0gICAgICAgICAgcmVmZXJlbmNpbmdFbGVtZW50cz0iV29ya1Byb2R1Y3ROb2RlTmFtZSIKLSAgICAgICAgICBuYW1lPSJXb3JrUHJvZHVjdE5vZGVOYW1lRmlndXJlIgotICAgICAgICAgIHRleHQ9IiZsdDsuLi4+Ij4KLSAgICAgICAgPGZvbnQKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZncmFwaDpCYXNpY0ZvbnQiCi0gICAgICAgICAgICBmYWNlTmFtZT0iQXJpYWwiCi0gICAgICAgICAgICBoZWlnaHQ9IjgiLz4KLSAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICA8YmFja2dyb3VuZENvbG9yCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdyYXBoOlJHQkNvbG9yIgotICAgICAgICAgIHJlZD0iMjU1IgotICAgICAgICAgIGdyZWVuPSIyNTUiCi0gICAgICAgICAgYmx1ZT0iMjA1Ii8+Ci0gICAgPC9maWd1cmVzPgotICAgIDxmaWd1cmVzCi0gICAgICAgIHhzaTp0eXBlPSJnbWZncmFwaDpSZWN0YW5nbGUiCi0gICAgICAgIHJlZmVyZW5jaW5nRWxlbWVudHM9IldvcmtQcm9kdWN0Q29tcG9zaXRlIgotICAgICAgICBuYW1lPSJXb3JrUHJvZHVjdENvbXBvc2l0ZUZpZ3VyZSI+Ci0gICAgICA8bGF5b3V0Ci0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdyYXBoOkZsb3dMYXlvdXQiCi0gICAgICAgICAgdmVydGljYWw9InRydWUiCi0gICAgICAgICAgZm9yY2VTaW5nbGVMaW5lPSJ0cnVlIgotICAgICAgICAgIG1ham9yQWxpZ25tZW50PSJDRU5URVIiCi0gICAgICAgICAgbWlub3JBbGlnbm1lbnQ9IkNFTlRFUiIKLSAgICAgICAgICBtaW5vclNwYWNpbmc9IjIwIi8+Ci0gICAgICA8YmFja2dyb3VuZENvbG9yCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdyYXBoOlJHQkNvbG9yIgotICAgICAgICAgIHJlZD0iMjU1IgotICAgICAgICAgIGdyZWVuPSIyNTUiCi0gICAgICAgICAgYmx1ZT0iMjA1Ii8+Ci0gICAgICA8Ym9yZGVyCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdyYXBoOk1hcmdpbkJvcmRlciIvPgotICAgIDwvZmlndXJlcz4KLSAgICA8ZmlndXJlcwotICAgICAgICB4c2k6dHlwZT0iZ21mZ3JhcGg6UG9seWxpbmVDb25uZWN0aW9uIgotICAgICAgICByZWZlcmVuY2luZ0VsZW1lbnRzPSJMaW5rIgotICAgICAgICBuYW1lPSJMaW5rRmlndXJlIgotICAgICAgICB0YXJnZXREZWNvcmF0aW9uPSJPcGVuQXJyb3ciPgotICAgICAgPGNoaWxkcmVuCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdyYXBoOlBvbHlsaW5lRGVjb3JhdGlvbiIKLSAgICAgICAgICBuYW1lPSJPcGVuQXJyb3ciPgotICAgICAgICA8dGVtcGxhdGUKLSAgICAgICAgICAgIHg9Ii0xIgotICAgICAgICAgICAgeT0iMSIvPgotICAgICAgICA8dGVtcGxhdGUvPgotICAgICAgICA8dGVtcGxhdGUKLSAgICAgICAgICAgIHg9Ii0xIgotICAgICAgICAgICAgeT0iLTEiLz4KLSAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICA8Y2hpbGRyZW4KLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ3JhcGg6TGFiZWwiCi0gICAgICAgICAgcmVmZXJlbmNpbmdFbGVtZW50cz0iTGlua05hbWVMYWJlbCIKLSAgICAgICAgICBuYW1lPSJMaW5rTmFtZUZpZ3VyZSIvPgotICAgICAgPGZvcmVncm91bmRDb2xvcgotICAgICAgICAgIHhzaTp0eXBlPSJnbWZncmFwaDpDb25zdGFudENvbG9yIgotICAgICAgICAgIHZhbHVlPSJibGFjayIvPgotICAgIDwvZmlndXJlcz4KLSAgICA8ZmlndXJlcwotICAgICAgICB4c2k6dHlwZT0iZ21mZ3JhcGg6Q3VzdG9tRmlndXJlIgotICAgICAgICByZWZlcmVuY2luZ0VsZW1lbnRzPSJSb2xlVGFza0NvbXBhcnRtZW50IFdvcmtQcm9kdWN0Q29tcGFydG1lbnQiCi0gICAgICAgIG5hbWU9IlJlc2l6ZWFibGVDb21wYXJ0bWVudEZpZ3VyZUV4IgotICAgICAgICBxdWFsaWZpZWRDbGFzc05hbWU9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZmlndXJlcy5SZXNpemFibGVDb21wYXJ0bWVudEZpZ3VyZSIKLSAgICAgICAgYnVuZGxlTmFtZT0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5maWd1cmVzIi8+Ci0gIDwvZmlndXJlcz4KLSAgPG5vZGVzCi0gICAgICBuYW1lPSJSb2xlTm9kZSIKLSAgICAgIGZpZ3VyZT0iUm9sZU5vZGVGaWd1cmUiLz4KLSAgPG5vZGVzCi0gICAgICBuYW1lPSJUYXNrTm9kZSIKLSAgICAgIGZpZ3VyZT0iVGFza05vZGVGaWd1cmUiLz4KLSAgPG5vZGVzCi0gICAgICBuYW1lPSJXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlIgotICAgICAgZmlndXJlPSJXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlRmlndXJlIi8+Ci0gIDxub2RlcwotICAgICAgbmFtZT0iUm9sZVRhc2tDb21wb3NpdGUiCi0gICAgICBmaWd1cmU9IlJvbGVUYXNrQ29tcG9zaXRlRmlndXJlIi8+Ci0gIDxub2RlcwotICAgICAgbmFtZT0iV29ya1Byb2R1Y3RDb21wb3NpdGUiCi0gICAgICBmaWd1cmU9IldvcmtQcm9kdWN0Q29tcG9zaXRlRmlndXJlIi8+Ci0gIDxjb25uZWN0aW9ucwotICAgICAgbmFtZT0iTGluayIKLSAgICAgIGZpZ3VyZT0iTGlua0ZpZ3VyZSIvPgotICA8Y29tcGFydG1lbnRzCi0gICAgICBuYW1lPSJSb2xlVGFza0NvbXBhcnRtZW50IgotICAgICAgZmlndXJlPSJSZXNpemVhYmxlQ29tcGFydG1lbnRGaWd1cmVFeCIvPgotICA8Y29tcGFydG1lbnRzCi0gICAgICBuYW1lPSJXb3JrUHJvZHVjdENvbXBhcnRtZW50IgotICAgICAgZmlndXJlPSJSZXNpemVhYmxlQ29tcGFydG1lbnRGaWd1cmVFeCIvPgotICA8bGFiZWxzCi0gICAgICBuYW1lPSJSb2xlTm9kZU5hbWUiCi0gICAgICBmaWd1cmU9IlJvbGVOb2RlTmFtZUZpZ3VyZSIKLSAgICAgIGVsZW1lbnRJY29uPSJmYWxzZSIvPgotICA8bGFiZWxzCi0gICAgICBuYW1lPSJUYXNrTm9kZU5hbWUiCi0gICAgICBmaWd1cmU9IlRhc2tOb2RlTmFtZUZpZ3VyZSIKLSAgICAgIGVsZW1lbnRJY29uPSJmYWxzZSIvPgotICA8bGFiZWxzCi0gICAgICBuYW1lPSJXb3JrUHJvZHVjdE5vZGVOYW1lIgotICAgICAgZmlndXJlPSJXb3JrUHJvZHVjdE5vZGVOYW1lRmlndXJlIgotICAgICAgZWxlbWVudEljb249ImZhbHNlIi8+Ci0gIDxsYWJlbHMKLSAgICAgIG5hbWU9IkxpbmtOYW1lTGFiZWwiCi0gICAgICBmaWd1cmU9IkxpbmtOYW1lRmlndXJlIgotICAgICAgZWxlbWVudEljb249ImZhbHNlIi8+Ci08L2dtZmdyYXBoOkNhbnZhcz4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9tb2RlbC9hZGQuZ21mbWFwIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL21vZGVsL2FkZC5nbWZtYXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxZjM2YTMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL21vZGVsL2FkZC5nbWZtYXAKKysrIC9kZXYvbnVsbApAQCAtMSwxMzMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxnbWZtYXA6TWFwcGluZyB4bWk6dmVyc2lvbj0iMi4wIgotICAgIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIKLSAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICAgIHhtbG5zOmVjb3JlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIgotICAgIHhtbG5zOmdtZm1hcD0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9nbWYvMjAwNS9tYXBwaW5ncyIKLSAgICB4bWxuczpnbWZ0b29sPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2dtZi8yMDA1L1Rvb2xEZWZpbml0aW9uIj4KLSAgPG5vZGVzPgotICAgIDxjb250YWlubWVudEZlYXR1cmUKLSAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5lY29yZSMvL05vZGVDb250YWluZXIvbm9kZXMiLz4KLSAgICA8b3duZWRDaGlsZD4KLSAgICAgIDxkb21haW5NZXRhRWxlbWVudAotICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZWNvcmUjLy9Sb2xlVGFza0NvbXBvc2l0ZSIvPgotICAgICAgPHRvb2wKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mdG9vbDpDcmVhdGlvblRvb2wiCi0gICAgICAgICAgaHJlZj0iYWRkLmdtZnRvb2wjLy9AcGFsZXR0ZS9AdG9vbHMuMC9AdG9vbHMuMSIvPgotICAgICAgPGRpYWdyYW1Ob2RlCi0gICAgICAgICAgaHJlZj0iYWRkLmdtZmdyYXBoI1JvbGVUYXNrQ29tcG9zaXRlIi8+Ci0gICAgICA8Y2hpbGRyZW4+Ci0gICAgICAgIDxjb250YWlubWVudEZlYXR1cmUKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZWNvcmUjLy9Ob2RlQ29udGFpbmVyL25vZGVzIi8+Ci0gICAgICAgIDxvd25lZENoaWxkPgotICAgICAgICAgIDxkb21haW5NZXRhRWxlbWVudAotICAgICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmVjb3JlIy8vUm9sZU5vZGUiLz4KLSAgICAgICAgICA8bGFiZWxNYXBwaW5ncz4KLSAgICAgICAgICAgIDxkaWFncmFtTGFiZWwKLSAgICAgICAgICAgICAgICBocmVmPSJhZGQuZ21mZ3JhcGgjUm9sZU5vZGVOYW1lIi8+Ci0gICAgICAgICAgICA8ZmVhdHVyZXMKLSAgICAgICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmVjb3JlIy8vTmFtZWROb2RlL25hbWUiLz4KLSAgICAgICAgICA8L2xhYmVsTWFwcGluZ3M+Ci0gICAgICAgICAgPHRvb2wKLSAgICAgICAgICAgICAgeHNpOnR5cGU9ImdtZnRvb2w6Q3JlYXRpb25Ub29sIgotICAgICAgICAgICAgICBocmVmPSJhZGQuZ21mdG9vbCMvL0BwYWxldHRlL0B0b29scy4wL0B0b29scy4wIi8+Ci0gICAgICAgICAgPGRpYWdyYW1Ob2RlCi0gICAgICAgICAgICAgIGhyZWY9ImFkZC5nbWZncmFwaCNSb2xlTm9kZSIvPgotICAgICAgICA8L293bmVkQ2hpbGQ+Ci0gICAgICA8L2NoaWxkcmVuPgotICAgICAgPGNoaWxkcmVuPgotICAgICAgICA8Y29udGFpbm1lbnRGZWF0dXJlCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmVjb3JlIy8vTm9kZUNvbnRhaW5lci9ub2RlcyIvPgotICAgICAgICA8b3duZWRDaGlsZD4KLSAgICAgICAgICA8ZG9tYWluTWV0YUVsZW1lbnQKLSAgICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5lY29yZSMvL1Rhc2tOb2RlIi8+Ci0gICAgICAgICAgPGxhYmVsTWFwcGluZ3M+Ci0gICAgICAgICAgICA8ZGlhZ3JhbUxhYmVsCi0gICAgICAgICAgICAgICAgaHJlZj0iYWRkLmdtZmdyYXBoI1Rhc2tOb2RlTmFtZSIvPgotICAgICAgICAgICAgPGZlYXR1cmVzCi0gICAgICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5lY29yZSMvL05hbWVkTm9kZS9uYW1lIi8+Ci0gICAgICAgICAgPC9sYWJlbE1hcHBpbmdzPgotICAgICAgICAgIDx0b29sCi0gICAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZ0b29sOkNyZWF0aW9uVG9vbCIKLSAgICAgICAgICAgICAgaHJlZj0iYWRkLmdtZnRvb2wjLy9AcGFsZXR0ZS9AdG9vbHMuMC9AdG9vbHMuMiIvPgotICAgICAgICAgIDxkaWFncmFtTm9kZQotICAgICAgICAgICAgICBocmVmPSJhZGQuZ21mZ3JhcGgjVGFza05vZGUiLz4KLSAgICAgICAgPC9vd25lZENoaWxkPgotICAgICAgPC9jaGlsZHJlbj4KLSAgICAgIDxjb21wYXJ0bWVudHM+Ci0gICAgICAgIDxjb21wYXJ0bWVudAotICAgICAgICAgICAgaHJlZj0iYWRkLmdtZmdyYXBoI1JvbGVUYXNrQ29tcGFydG1lbnQiLz4KLSAgICAgIDwvY29tcGFydG1lbnRzPgotICAgIDwvb3duZWRDaGlsZD4KLSAgPC9ub2Rlcz4KLSAgPG5vZGVzPgotICAgIDxjb250YWlubWVudEZlYXR1cmUKLSAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5lY29yZSMvL05vZGVDb250YWluZXIvbm9kZXMiLz4KLSAgICA8b3duZWRDaGlsZD4KLSAgICAgIDxkb21haW5NZXRhRWxlbWVudAotICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZWNvcmUjLy9Xb3JrUHJvZHVjdENvbXBvc2l0ZSIvPgotICAgICAgPHRvb2wKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mdG9vbDpDcmVhdGlvblRvb2wiCi0gICAgICAgICAgaHJlZj0iYWRkLmdtZnRvb2wjLy9AcGFsZXR0ZS9AdG9vbHMuMC9AdG9vbHMuNCIvPgotICAgICAgPGRpYWdyYW1Ob2RlCi0gICAgICAgICAgaHJlZj0iYWRkLmdtZmdyYXBoI1dvcmtQcm9kdWN0Q29tcG9zaXRlIi8+Ci0gICAgICA8Y2hpbGRyZW4+Ci0gICAgICAgIDxjb250YWlubWVudEZlYXR1cmUKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZWNvcmUjLy9Ob2RlQ29udGFpbmVyL25vZGVzIi8+Ci0gICAgICAgIDxvd25lZENoaWxkPgotICAgICAgICAgIDxkb21haW5NZXRhRWxlbWVudAotICAgICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmVjb3JlIy8vV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZSIvPgotICAgICAgICAgIDxsYWJlbE1hcHBpbmdzPgotICAgICAgICAgICAgPGRpYWdyYW1MYWJlbAotICAgICAgICAgICAgICAgIGhyZWY9ImFkZC5nbWZncmFwaCNXb3JrUHJvZHVjdE5vZGVOYW1lIi8+Ci0gICAgICAgICAgICA8ZmVhdHVyZXMKLSAgICAgICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmVjb3JlIy8vTmFtZWROb2RlL25hbWUiLz4KLSAgICAgICAgICA8L2xhYmVsTWFwcGluZ3M+Ci0gICAgICAgICAgPHRvb2wKLSAgICAgICAgICAgICAgeHNpOnR5cGU9ImdtZnRvb2w6Q3JlYXRpb25Ub29sIgotICAgICAgICAgICAgICBocmVmPSJhZGQuZ21mdG9vbCMvL0BwYWxldHRlL0B0b29scy4wL0B0b29scy4zIi8+Ci0gICAgICAgICAgPGRpYWdyYW1Ob2RlCi0gICAgICAgICAgICAgIGhyZWY9ImFkZC5nbWZncmFwaCNXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlIi8+Ci0gICAgICAgIDwvb3duZWRDaGlsZD4KLSAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICA8Y29tcGFydG1lbnRzPgotICAgICAgICA8Y29tcGFydG1lbnQKLSAgICAgICAgICAgIGhyZWY9ImFkZC5nbWZncmFwaCNXb3JrUHJvZHVjdENvbXBhcnRtZW50Ii8+Ci0gICAgICA8L2NvbXBhcnRtZW50cz4KLSAgICA8L293bmVkQ2hpbGQ+Ci0gIDwvbm9kZXM+Ci0gIDxsaW5rcz4KLSAgICA8ZG9tYWluTWV0YUVsZW1lbnQKLSAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5lY29yZSMvL0xpbmsiLz4KLSAgICA8bGFiZWxNYXBwaW5ncwotICAgICAgICBlZGl0UGF0dGVybj0iIj4KLSAgICAgIDxkaWFncmFtTGFiZWwKLSAgICAgICAgICBocmVmPSJhZGQuZ21mZ3JhcGgjTGlua05hbWVMYWJlbCIvPgotICAgICAgPGZlYXR1cmVzCi0gICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5lY29yZSMvL0xpbmsvbmFtZSIvPgotICAgIDwvbGFiZWxNYXBwaW5ncz4KLSAgICA8Y29udGFpbm1lbnRGZWF0dXJlCi0gICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZWNvcmUjLy9Ob2RlL291dGdvaW5nQ29ubmVjdGlvbnMiLz4KLSAgICA8dG9vbAotICAgICAgICB4c2k6dHlwZT0iZ21mdG9vbDpDcmVhdGlvblRvb2wiCi0gICAgICAgIGhyZWY9ImFkZC5nbWZ0b29sIy8vQHBhbGV0dGUvQHRvb2xzLjEvQHRvb2xzLjAiLz4KLSAgICA8ZGlhZ3JhbUxpbmsKLSAgICAgICAgaHJlZj0iYWRkLmdtZmdyYXBoI0xpbmsiLz4KLSAgICA8c291cmNlTWV0YUZlYXR1cmUKLSAgICAgICAgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiCi0gICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZWNvcmUjLy9MaW5rL3NvdXJjZSIvPgotICAgIDxsaW5rTWV0YUZlYXR1cmUKLSAgICAgICAgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiCi0gICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZWNvcmUjLy9MaW5rL3RhcmdldCIvPgotICA8L2xpbmtzPgotICA8ZGlhZ3JhbT4KLSAgICA8ZGlhZ3JhbUNhbnZhcwotICAgICAgICBocmVmPSJhZGQuZ21mZ3JhcGgjbW9kZWwiLz4KLSAgICA8ZG9tYWluTW9kZWwKLSAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5lY29yZSMvIi8+Ci0gICAgPGRvbWFpbk1ldGFFbGVtZW50Ci0gICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZWNvcmUjLy9BY3Rpdml0eURldGFpbERpYWdyYW0iLz4KLSAgICA8cGFsZXR0ZQotICAgICAgICBocmVmPSJhZGQuZ21mdG9vbCMvL0BwYWxldHRlIi8+Ci0gIDwvZGlhZ3JhbT4KLTwvZ21mbWFwOk1hcHBpbmc+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvbW9kZWwvYWRkLmdtZnRvb2wgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvbW9kZWwvYWRkLmdtZnRvb2wKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiNjFlNDYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL21vZGVsL2FkZC5nbWZ0b29sCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxnbWZ0b29sOlRvb2xSZWdpc3RyeSB4bWk6dmVyc2lvbj0iMi4wIgotICAgIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIKLSAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICAgIHhtbG5zOmdtZnRvb2w9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZ21mLzIwMDUvVG9vbERlZmluaXRpb24iPgotICA8cGFsZXR0ZT4KLSAgICA8dG9vbHMKLSAgICAgICAgeHNpOnR5cGU9ImdtZnRvb2w6VG9vbEdyb3VwIgotICAgICAgICB0aXRsZT0iTm9kZXMiCi0gICAgICAgIGNvbGxhcHNpYmxlPSJ0cnVlIj4KLSAgICAgIDx0b29scwotICAgICAgICAgIHhzaTp0eXBlPSJnbWZ0b29sOkNyZWF0aW9uVG9vbCIKLSAgICAgICAgICB0aXRsZT0iUm9sZU5vZGUiCi0gICAgICAgICAgZGVzY3JpcHRpb249IkNyZWF0ZSBuZXcgUm9sZU5vZGUiPgotICAgICAgICA8c21hbGxJY29uCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mdG9vbDpEZWZhdWx0SW1hZ2UiLz4KLSAgICAgICAgPGxhcmdlSWNvbgotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZnRvb2w6RGVmYXVsdEltYWdlIi8+Ci0gICAgICA8L3Rvb2xzPgotICAgICAgPHRvb2xzCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZnRvb2w6Q3JlYXRpb25Ub29sIgotICAgICAgICAgIHRpdGxlPSJSb2xlVGFza0NvbXBvc2l0ZSIKLSAgICAgICAgICBkZXNjcmlwdGlvbj0iQ3JlYXRlIG5ldyBSb2xlVGFza0NvbXBvc2l0ZSI+Ci0gICAgICAgIDxzbWFsbEljb24KLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZ0b29sOkRlZmF1bHRJbWFnZSIvPgotICAgICAgICA8bGFyZ2VJY29uCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mdG9vbDpEZWZhdWx0SW1hZ2UiLz4KLSAgICAgIDwvdG9vbHM+Ci0gICAgICA8dG9vbHMKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mdG9vbDpDcmVhdGlvblRvb2wiCi0gICAgICAgICAgdGl0bGU9IlRhc2tOb2RlIgotICAgICAgICAgIGRlc2NyaXB0aW9uPSJDcmVhdGUgbmV3IFRhc2tOb2RlIj4KLSAgICAgICAgPHNtYWxsSWNvbgotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZnRvb2w6RGVmYXVsdEltYWdlIi8+Ci0gICAgICAgIDxsYXJnZUljb24KLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZ0b29sOkRlZmF1bHRJbWFnZSIvPgotICAgICAgPC90b29scz4KLSAgICAgIDx0b29scwotICAgICAgICAgIHhzaTp0eXBlPSJnbWZ0b29sOkNyZWF0aW9uVG9vbCIKLSAgICAgICAgICB0aXRsZT0iV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZSIKLSAgICAgICAgICBkZXNjcmlwdGlvbj0iQ3JlYXRlIG5ldyBXb3JrUHJvZHVjTm9kZSI+Ci0gICAgICAgIDxzbWFsbEljb24KLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZ0b29sOkRlZmF1bHRJbWFnZSIvPgotICAgICAgICA8bGFyZ2VJY29uCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mdG9vbDpEZWZhdWx0SW1hZ2UiLz4KLSAgICAgIDwvdG9vbHM+Ci0gICAgICA8dG9vbHMKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mdG9vbDpDcmVhdGlvblRvb2wiCi0gICAgICAgICAgdGl0bGU9IldvcmtQcm9kdWN0Q29tcG9zaXRlIgotICAgICAgICAgIGRlc2NyaXB0aW9uPSJDcmVhdGUgbmV3IFdvcmtQcm9kdWN0Q29tcG9zaXRlIj4KLSAgICAgICAgPHNtYWxsSWNvbgotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZnRvb2w6RGVmYXVsdEltYWdlIi8+Ci0gICAgICAgIDxsYXJnZUljb24KLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZ0b29sOkRlZmF1bHRJbWFnZSIvPgotICAgICAgPC90b29scz4KLSAgICA8L3Rvb2xzPgotICAgIDx0b29scwotICAgICAgICB4c2k6dHlwZT0iZ21mdG9vbDpUb29sR3JvdXAiCi0gICAgICAgIHRpdGxlPSJMaW5rcyIKLSAgICAgICAgY29sbGFwc2libGU9InRydWUiPgotICAgICAgPHRvb2xzCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZnRvb2w6Q3JlYXRpb25Ub29sIgotICAgICAgICAgIHRpdGxlPSJMaW5rIgotICAgICAgICAgIGRlc2NyaXB0aW9uPSJDcmVhdGUgbmV3IGxpbmsiLz4KLSAgICA8L3Rvb2xzPgotICA8L3BhbGV0dGU+Ci08L2dtZnRvb2w6VG9vbFJlZ2lzdHJ5PgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL21vZGVsL2FkZDIuZ21mZ2VuIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL21vZGVsL2FkZDIuZ21mZ2VuCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOTc3MTQwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9tb2RlbC9hZGQyLmdtZmdlbgorKysgL2Rldi9udWxsCkBAIC0xLDU5MSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGdtZmdlbjpHZW5FZGl0b3JHZW5lcmF0b3IgeG1pOnZlcnNpb249IjIuMCIKLSAgICB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiCi0gICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgICB4bWxuczpnbWZnZW49Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZ21mLzIwMDUvR2VuTW9kZWwvMi4wIj4KLSAgPGRpYWdyYW0KLSAgICAgIHZpc3VhbElEPSI3OSIKLSAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0UGFydCIKLSAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IkFjdGl2aXR5RGV0YWlsRGlhZ3JhbUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiCi0gICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJBY3Rpdml0eURldGFpbERpYWdyYW1WaWV3RmFjdG9yeSIKLSAgICAgIGNhbm9uaWNhbEVkaXRQb2xpY3lDbGFzc05hbWU9IkFjdGl2aXR5RGV0YWlsRGlhZ3JhbUNhbm9uaWNhbEVkaXRQb2xpY3kiCi0gICAgICBpY29uUHJvdmlkZXJQcmlvcml0eT0iTG93IgotICAgICAgdmFsaWRhdGlvblByb3ZpZGVyUHJpb3JpdHk9IkxvdyI+Ci0gICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MKLSAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vRGlhZ3JhbSIvPgotICAgIDxlbGVtZW50VHlwZQotICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOk1ldGFtb2RlbFR5cGUiCi0gICAgICAgIGVkaXRIZWxwZXJDbGFzc05hbWU9IkFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRIZWxwZXIiLz4KLSAgICA8dmlld21hcAotICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOkZpZ3VyZVZpZXdtYXAiCi0gICAgICAgIGZpZ3VyZVF1YWxpZmllZENsYXNzTmFtZT0ib3JnLmVjbGlwc2UuZHJhdzJkLkZyZWVmb3JtTGF5ZXIiLz4KLSAgICA8ZG9tYWluRGlhZ3JhbUVsZW1lbnQKLSAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5nZW5tb2RlbCMvL21vZGVsL0FjdGl2aXR5RGV0YWlsRGlhZ3JhbSIvPgotICAgIDxjaGlsZE5vZGVzCi0gICAgICAgIHZpc3VhbElEPSIyMDAxIgotICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iUm9sZU5vZGVFZGl0UGFydCIKLSAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iUm9sZU5vZGVJdGVtU2VtYW50aWNFZGl0UG9saWN5IgotICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJSb2xlTm9kZVZpZXdGYWN0b3J5IgotICAgICAgICBjYW5vbmljYWxFZGl0UG9saWN5Q2xhc3NOYW1lPSJSb2xlTm9kZUNhbm9uaWNhbEVkaXRQb2xpY3kiCi0gICAgICAgIGdyYXBoaWNhbE5vZGVFZGl0UG9saWN5Q2xhc3NOYW1lPSJSb2xlTm9kZUdyYXBoaWNhbE5vZGVFZGl0UG9saWN5IgotICAgICAgICBjcmVhdGVDb21tYW5kQ2xhc3NOYW1lPSJSb2xlTm9kZUNyZWF0ZUNvbW1hbmQiCi0gICAgICAgIGNvbnRhaW5lcnM9Ii8vQGRpYWdyYW0vQHRvcExldmVsTm9kZXMuMCI+Ci0gICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcwotICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL05vZGUiLz4KLSAgICAgIDxlbGVtZW50VHlwZQotICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46TWV0YW1vZGVsVHlwZSIKLSAgICAgICAgICBlZGl0SGVscGVyQ2xhc3NOYW1lPSJSb2xlTm9kZUVkaXRIZWxwZXIiLz4KLSAgICAgIDx2aWV3bWFwCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpJbm5lckNsYXNzVmlld21hcCIKLSAgICAgICAgICBjbGFzc05hbWU9IlJvbGVOb2RlRmlndXJlIgotICAgICAgICAgIGNsYXNzQm9keT0iJiN4QTsvKiomI3hBOyAqIEBnZW5lcmF0ZWQmI3hBOyAqLyYjeEE7cHVibGljIGNsYXNzIFJvbGVOb2RlRmlndXJlIGV4dGVuZHMgb3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZSB7JiN4QTsmI3g5Oy8qKiYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4QTsmI3g5OyAqLyYjeEE7JiN4OTtwdWJsaWMgUm9sZU5vZGVGaWd1cmUoKSB7JiN4QTsmI3g5OyYjeDk7JiN4OTsmI3g5O3RoaXMuc2V0RmlsbCh0cnVlKTsmI3hBO3RoaXMuc2V0RmlsbFhPUihmYWxzZSk7JiN4QTt0aGlzLnNldE91dGxpbmUoZmFsc2UpOyYjeEE7dGhpcy5zZXRPdXRsaW5lWE9SKGZhbHNlKTsmI3hBO3RoaXMuc2V0TGluZVdpZHRoKDEpOyYjeEE7dGhpcy5zZXRMaW5lU3R5bGUob3JnLmVjbGlwc2UuZHJhdzJkLkdyYXBoaWNzLkxJTkVfU09MSUQpOyYjeEE7JiN4OTt0aGlzLnNldEJhY2tncm91bmRDb2xvcihST0xFTk9ERUZJR1VSRV9CQUNLJiN4QTspOyYjeEE7JiN4OTsmI3g5O2NyZWF0ZUNvbnRlbnRzKCk7JiN4QTsmI3g5O30mI3hBOyYjeDk7LyoqJiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hBOyYjeDk7ICovJiN4QTsmI3g5O3ByaXZhdGUgdm9pZCBjcmVhdGVDb250ZW50cygpeyYjeEE7JiN4QTsmI3hBOyYjeEE7b3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIHJvbGVOb2RlTmFtZUZpZ3VyZTAgPSBuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsKCk7JiN4QTtyb2xlTm9kZU5hbWVGaWd1cmUwLnNldFRleHQoJnF1b3Q7Jmx0Oy4uLj4mcXVvdDspOyYjeEE7JiN4QTtyb2xlTm9kZU5hbWVGaWd1cmUwLnNldEZvbnQoUm9sZU5vZGVOYW1lRmlndXJlX0ZPTlQpOyYjeEE7JiN4QTsmI3hBOyYjeEE7dGhpcy5hZGQocm9sZU5vZGVOYW1lRmlndXJlMCk7JiN4QTtzZXRGaWd1cmVSb2xlTm9kZU5hbWVGaWd1cmUocm9sZU5vZGVOYW1lRmlndXJlMCk7JiN4QTsmI3hBOyYjeDk7fSYjeEE7JiN4OTsvKiomI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEE7JiN4OTsgKi8mI3hBOyYjeDk7cHJpdmF0ZSBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZlJvbGVOb2RlTmFtZUZpZ3VyZTsgJiN4QTsmI3hBOyYjeDk7LyoqJiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hBOyYjeDk7ICovJiN4QTsmI3g5O3B1YmxpYyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZ2V0RmlndXJlUm9sZU5vZGVOYW1lRmlndXJlKCkgeyYjeEE7JiN4OTsmI3g5O3JldHVybiBmUm9sZU5vZGVOYW1lRmlndXJlOyYjeEE7JiN4OTt9JiN4QTsmI3g5OyYjeEE7JiN4OTsvKiomI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEE7JiN4OTsgKi8mI3hBOyYjeDk7cHJpdmF0ZSB2b2lkIHNldEZpZ3VyZVJvbGVOb2RlTmFtZUZpZ3VyZShvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZmlnKXsmI3hBOyYjeDk7JiN4OTtmUm9sZU5vZGVOYW1lRmlndXJlID0gZmlnOyYjeEE7JiN4OTt9JiN4QTsmI3hBOyYjeEE7JiN4QTsmI3hBOyYjeEE7JiN4OTsvKiomI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEE7JiN4OTsgKi8mI3hBOyYjeDk7cHJpdmF0ZSBib29sZWFuIG15VXNlTG9jYWxDb29yZGluYXRlcyA9IGZhbHNlOyYjeEE7JiN4QTsmI3g5Oy8qKiYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4QTsmI3g5OyAqLyYjeEE7JiN4OTtwcm90ZWN0ZWQgYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKCkgeyYjeEE7JiN4OTsmI3g5O3JldHVybiBteVVzZUxvY2FsQ29vcmRpbmF0ZXM7JiN4QTsmI3g5O30mI3hBOyYjeEE7JiN4OTsvKiomI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEE7JiN4OTsgKi8mI3hBOyYjeDk7cHJvdGVjdGVkIHZvaWQgc2V0VXNlTG9jYWxDb29yZGluYXRlcyhib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMpIHsmI3hBOyYjeDk7JiN4OTtteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSB1c2VMb2NhbENvb3JkaW5hdGVzOyYjeEE7JiN4OTt9JiN4QTsmI3hBO30mI3hBOyYjeEE7LyoqJiN4QTsgKiBAZ2VuZXJhdGVkJiN4QTsgKi8mI3hBO3N0YXRpYyBmaW5hbCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3IgUk9MRU5PREVGSUdVUkVfQkFDSyA9IG5ldyBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3IobnVsbCwgMjU1LCAyNTUsIDE1Nik7JiN4QTsmI3hBOy8qKiYjeEE7ICogQGdlbmVyYXRlZCYjeEE7ICovJiN4QTtzdGF0aWMgZmluYWwgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnQgUm9sZU5vZGVOYW1lRmlndXJlX0ZPTlQgPSBuZXcgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnQob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheS5nZXRDdXJyZW50KCksICZxdW90O0FyaWFsJnF1b3Q7LCA4LCBvcmcuZWNsaXBzZS5zd3QuU1dULk5PUk1BTCk7JiN4QTsmI3hBOyI+Ci0gICAgICAgIDxhdHRyaWJ1dGVzCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlN0eWxlQXR0cmlidXRlcyIKLSAgICAgICAgICAgIGZpeGVkQmFja2dyb3VuZD0idHJ1ZSIvPgotICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZHJhdzJkPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aTwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICA8L3ZpZXdtYXA+Ci0gICAgICA8bW9kZWxGYWNldD4KLSAgICAgICAgPG1ldGFDbGFzcwotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5nZW5tb2RlbCMvL21vZGVsL1JvbGVOb2RlIi8+Ci0gICAgICAgIDxjb250YWlubWVudE1ldGFGZWF0dXJlCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmdlbm1vZGVsIy8vbW9kZWwvTm9kZUNvbnRhaW5lci9ub2RlcyIvPgotICAgICAgICA8Y2hpbGRNZXRhRmVhdHVyZQotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5nZW5tb2RlbCMvL21vZGVsL05vZGVDb250YWluZXIvbm9kZXMiLz4KLSAgICAgIDwvbW9kZWxGYWNldD4KLSAgICAgIDxsYWJlbHMKLSAgICAgICAgICB2aXN1YWxJRD0iNDAwMSIKLSAgICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iUm9sZU5vZGVOYW1lRWRpdFBhcnQiCi0gICAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iUm9sZU5vZGVOYW1lSXRlbVNlbWFudGljRWRpdFBvbGljeSIKLSAgICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJSb2xlTm9kZU5hbWVWaWV3RmFjdG9yeSI+Ci0gICAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzCi0gICAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+Ci0gICAgICAgIDx2aWV3bWFwCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlBhcmVudEFzc2lnbmVkVmlld21hcCIKLSAgICAgICAgICAgIGdldHRlck5hbWU9ImdldEZpZ3VyZVJvbGVOb2RlTmFtZUZpZ3VyZSIKLSAgICAgICAgICAgIGZpZ3VyZVF1YWxpZmllZENsYXNzTmFtZT0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIj4KLSAgICAgICAgICA8YXR0cmlidXRlcwotICAgICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlN0eWxlQXR0cmlidXRlcyIKLSAgICAgICAgICAgICAgZml4ZWRGb250PSJ0cnVlIi8+Ci0gICAgICAgIDwvdmlld21hcD4KLSAgICAgICAgPG1vZGVsRmFjZXQKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46RmVhdHVyZUxhYmVsTW9kZWxGYWNldCI+Ci0gICAgICAgICAgPG1ldGFGZWF0dXJlcwotICAgICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmdlbm1vZGVsIy8vbW9kZWwvTmFtZWROb2RlL25hbWUiLz4KLSAgICAgICAgPC9tb2RlbEZhY2V0PgotICAgICAgPC9sYWJlbHM+Ci0gICAgPC9jaGlsZE5vZGVzPgotICAgIDxjaGlsZE5vZGVzCi0gICAgICAgIHZpc3VhbElEPSIyMDAyIgotICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iVGFza05vZGVFZGl0UGFydCIKLSAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iVGFza05vZGVJdGVtU2VtYW50aWNFZGl0UG9saWN5IgotICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJUYXNrTm9kZVZpZXdGYWN0b3J5IgotICAgICAgICBjYW5vbmljYWxFZGl0UG9saWN5Q2xhc3NOYW1lPSJUYXNrTm9kZUNhbm9uaWNhbEVkaXRQb2xpY3kiCi0gICAgICAgIGdyYXBoaWNhbE5vZGVFZGl0UG9saWN5Q2xhc3NOYW1lPSJUYXNrTm9kZUdyYXBoaWNhbE5vZGVFZGl0UG9saWN5IgotICAgICAgICBjcmVhdGVDb21tYW5kQ2xhc3NOYW1lPSJUYXNrTm9kZUNyZWF0ZUNvbW1hbmQiCi0gICAgICAgIGNvbnRhaW5lcnM9Ii8vQGRpYWdyYW0vQHRvcExldmVsTm9kZXMuMCI+Ci0gICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcwotICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL05vZGUiLz4KLSAgICAgIDxlbGVtZW50VHlwZQotICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46TWV0YW1vZGVsVHlwZSIKLSAgICAgICAgICBlZGl0SGVscGVyQ2xhc3NOYW1lPSJUYXNrTm9kZUVkaXRIZWxwZXIiLz4KLSAgICAgIDx2aWV3bWFwCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpJbm5lckNsYXNzVmlld21hcCIKLSAgICAgICAgICBjbGFzc05hbWU9IlRhc2tOb2RlRmlndXJlIgotICAgICAgICAgIGNsYXNzQm9keT0iJiN4QTsvKiomI3hBOyAqIEBnZW5lcmF0ZWQmI3hBOyAqLyYjeEE7cHVibGljIGNsYXNzIFRhc2tOb2RlRmlndXJlIGV4dGVuZHMgb3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZSB7JiN4QTsmI3g5Oy8qKiYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4QTsmI3g5OyAqLyYjeEE7JiN4OTtwdWJsaWMgVGFza05vZGVGaWd1cmUoKSB7JiN4QTsmI3g5OyYjeDk7JiN4OTsmI3g5O3RoaXMuc2V0RmlsbCh0cnVlKTsmI3hBO3RoaXMuc2V0RmlsbFhPUihmYWxzZSk7JiN4QTt0aGlzLnNldE91dGxpbmUoZmFsc2UpOyYjeEE7dGhpcy5zZXRPdXRsaW5lWE9SKGZhbHNlKTsmI3hBO3RoaXMuc2V0TGluZVdpZHRoKDApOyYjeEE7dGhpcy5zZXRMaW5lU3R5bGUob3JnLmVjbGlwc2UuZHJhdzJkLkdyYXBoaWNzLkxJTkVfU09MSUQpOyYjeEE7JiN4OTt0aGlzLnNldEJhY2tncm91bmRDb2xvcihUQVNLTk9ERUZJR1VSRV9CQUNLJiN4QTspOyYjeEE7JiN4OTsmI3g5O2NyZWF0ZUNvbnRlbnRzKCk7JiN4QTsmI3g5O30mI3hBOyYjeDk7LyoqJiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hBOyYjeDk7ICovJiN4QTsmI3g5O3ByaXZhdGUgdm9pZCBjcmVhdGVDb250ZW50cygpeyYjeEE7JiN4QTsmI3hBOyYjeEE7b3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIHRhc2tOb2RlTmFtZUZpZ3VyZTAgPSBuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsKCk7JiN4QTt0YXNrTm9kZU5hbWVGaWd1cmUwLnNldFRleHQoJnF1b3Q7Jmx0Oy4uLj4mcXVvdDspOyYjeEE7JiN4QTt0YXNrTm9kZU5hbWVGaWd1cmUwLnNldEZvbnQoVGFza05vZGVOYW1lRmlndXJlX0ZPTlQpOyYjeEE7JiN4QTsmI3hBOyYjeEE7dGhpcy5hZGQodGFza05vZGVOYW1lRmlndXJlMCk7JiN4QTtzZXRGaWd1cmVUYXNrTm9kZU5hbWVGaWd1cmUodGFza05vZGVOYW1lRmlndXJlMCk7JiN4QTsmI3hBOyYjeDk7fSYjeEE7JiN4OTsvKiomI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEE7JiN4OTsgKi8mI3hBOyYjeDk7cHJpdmF0ZSBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZlRhc2tOb2RlTmFtZUZpZ3VyZTsgJiN4QTsmI3hBOyYjeDk7LyoqJiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hBOyYjeDk7ICovJiN4QTsmI3g5O3B1YmxpYyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZ2V0RmlndXJlVGFza05vZGVOYW1lRmlndXJlKCkgeyYjeEE7JiN4OTsmI3g5O3JldHVybiBmVGFza05vZGVOYW1lRmlndXJlOyYjeEE7JiN4OTt9JiN4QTsmI3g5OyYjeEE7JiN4OTsvKiomI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEE7JiN4OTsgKi8mI3hBOyYjeDk7cHJpdmF0ZSB2b2lkIHNldEZpZ3VyZVRhc2tOb2RlTmFtZUZpZ3VyZShvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZmlnKXsmI3hBOyYjeDk7JiN4OTtmVGFza05vZGVOYW1lRmlndXJlID0gZmlnOyYjeEE7JiN4OTt9JiN4QTsmI3hBOyYjeEE7JiN4QTsmI3hBOyYjeEE7JiN4OTsvKiomI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEE7JiN4OTsgKi8mI3hBOyYjeDk7cHJpdmF0ZSBib29sZWFuIG15VXNlTG9jYWxDb29yZGluYXRlcyA9IGZhbHNlOyYjeEE7JiN4QTsmI3g5Oy8qKiYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4QTsmI3g5OyAqLyYjeEE7JiN4OTtwcm90ZWN0ZWQgYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKCkgeyYjeEE7JiN4OTsmI3g5O3JldHVybiBteVVzZUxvY2FsQ29vcmRpbmF0ZXM7JiN4QTsmI3g5O30mI3hBOyYjeEE7JiN4OTsvKiomI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEE7JiN4OTsgKi8mI3hBOyYjeDk7cHJvdGVjdGVkIHZvaWQgc2V0VXNlTG9jYWxDb29yZGluYXRlcyhib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMpIHsmI3hBOyYjeDk7JiN4OTtteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSB1c2VMb2NhbENvb3JkaW5hdGVzOyYjeEE7JiN4OTt9JiN4QTsmI3hBO30mI3hBOyYjeEE7LyoqJiN4QTsgKiBAZ2VuZXJhdGVkJiN4QTsgKi8mI3hBO3N0YXRpYyBmaW5hbCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3IgVEFTS05PREVGSUdVUkVfQkFDSyA9IG5ldyBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3IobnVsbCwgMjU1LCAyNTUsIDE1Nik7JiN4QTsmI3hBOy8qKiYjeEE7ICogQGdlbmVyYXRlZCYjeEE7ICovJiN4QTtzdGF0aWMgZmluYWwgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnQgVGFza05vZGVOYW1lRmlndXJlX0ZPTlQgPSBuZXcgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnQob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheS5nZXRDdXJyZW50KCksICZxdW90O0FyaWFsJnF1b3Q7LCA4LCBvcmcuZWNsaXBzZS5zd3QuU1dULk5PUk1BTCk7JiN4QTsmI3hBOyI+Ci0gICAgICAgIDxhdHRyaWJ1dGVzCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlN0eWxlQXR0cmlidXRlcyIKLSAgICAgICAgICAgIGZpeGVkQmFja2dyb3VuZD0idHJ1ZSIvPgotICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZHJhdzJkPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aTwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICA8L3ZpZXdtYXA+Ci0gICAgICA8bW9kZWxGYWNldD4KLSAgICAgICAgPG1ldGFDbGFzcwotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5nZW5tb2RlbCMvL21vZGVsL1Rhc2tOb2RlIi8+Ci0gICAgICAgIDxjb250YWlubWVudE1ldGFGZWF0dXJlCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmdlbm1vZGVsIy8vbW9kZWwvTm9kZUNvbnRhaW5lci9ub2RlcyIvPgotICAgICAgICA8Y2hpbGRNZXRhRmVhdHVyZQotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5nZW5tb2RlbCMvL21vZGVsL05vZGVDb250YWluZXIvbm9kZXMiLz4KLSAgICAgIDwvbW9kZWxGYWNldD4KLSAgICAgIDxsYWJlbHMKLSAgICAgICAgICB2aXN1YWxJRD0iNDAwMiIKLSAgICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iVGFza05vZGVOYW1lRWRpdFBhcnQiCi0gICAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iVGFza05vZGVOYW1lSXRlbVNlbWFudGljRWRpdFBvbGljeSIKLSAgICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJUYXNrTm9kZU5hbWVWaWV3RmFjdG9yeSI+Ci0gICAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzCi0gICAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+Ci0gICAgICAgIDx2aWV3bWFwCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlBhcmVudEFzc2lnbmVkVmlld21hcCIKLSAgICAgICAgICAgIGdldHRlck5hbWU9ImdldEZpZ3VyZVRhc2tOb2RlTmFtZUZpZ3VyZSIKLSAgICAgICAgICAgIGZpZ3VyZVF1YWxpZmllZENsYXNzTmFtZT0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIj4KLSAgICAgICAgICA8YXR0cmlidXRlcwotICAgICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlN0eWxlQXR0cmlidXRlcyIKLSAgICAgICAgICAgICAgZml4ZWRGb250PSJ0cnVlIi8+Ci0gICAgICAgIDwvdmlld21hcD4KLSAgICAgICAgPG1vZGVsRmFjZXQKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46RmVhdHVyZUxhYmVsTW9kZWxGYWNldCI+Ci0gICAgICAgICAgPG1ldGFGZWF0dXJlcwotICAgICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmdlbm1vZGVsIy8vbW9kZWwvTmFtZWROb2RlL25hbWUiLz4KLSAgICAgICAgPC9tb2RlbEZhY2V0PgotICAgICAgPC9sYWJlbHM+Ci0gICAgPC9jaGlsZE5vZGVzPgotICAgIDxjaGlsZE5vZGVzCi0gICAgICAgIHZpc3VhbElEPSIyMDAzIgotICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZUVkaXRQYXJ0IgotICAgICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlSXRlbVNlbWFudGljRWRpdFBvbGljeSIKLSAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZVZpZXdGYWN0b3J5IgotICAgICAgICBjYW5vbmljYWxFZGl0UG9saWN5Q2xhc3NOYW1lPSJXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlQ2Fub25pY2FsRWRpdFBvbGljeSIKLSAgICAgICAgZ3JhcGhpY2FsTm9kZUVkaXRQb2xpY3lDbGFzc05hbWU9IldvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVHcmFwaGljYWxOb2RlRWRpdFBvbGljeSIKLSAgICAgICAgY3JlYXRlQ29tbWFuZENsYXNzTmFtZT0iV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZUNyZWF0ZUNvbW1hbmQiCi0gICAgICAgIGNvbnRhaW5lcnM9Ii8vQGRpYWdyYW0vQHRvcExldmVsTm9kZXMuMSI+Ci0gICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcwotICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL05vZGUiLz4KLSAgICAgIDxlbGVtZW50VHlwZQotICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46TWV0YW1vZGVsVHlwZSIKLSAgICAgICAgICBlZGl0SGVscGVyQ2xhc3NOYW1lPSJXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlRWRpdEhlbHBlciIvPgotICAgICAgPHZpZXdtYXAKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOklubmVyQ2xhc3NWaWV3bWFwIgotICAgICAgICAgIGNsYXNzTmFtZT0iV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZUZpZ3VyZSIKLSAgICAgICAgICBjbGFzc0JvZHk9IiYjeEE7LyoqJiN4QTsgKiBAZ2VuZXJhdGVkJiN4QTsgKi8mI3hBO3B1YmxpYyBjbGFzcyBXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlRmlndXJlIGV4dGVuZHMgb3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZSB7JiN4QTsmI3g5Oy8qKiYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4QTsmI3g5OyAqLyYjeEE7JiN4OTtwdWJsaWMgV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZUZpZ3VyZSgpIHsmI3hBOyYjeDk7JiN4OTsmI3g5OyYjeDk7dGhpcy5zZXRGaWxsKHRydWUpOyYjeEE7dGhpcy5zZXRGaWxsWE9SKGZhbHNlKTsmI3hBO3RoaXMuc2V0T3V0bGluZShmYWxzZSk7JiN4QTt0aGlzLnNldE91dGxpbmVYT1IoZmFsc2UpOyYjeEE7dGhpcy5zZXRMaW5lV2lkdGgoMSk7JiN4QTt0aGlzLnNldExpbmVTdHlsZShvcmcuZWNsaXBzZS5kcmF3MmQuR3JhcGhpY3MuTElORV9TT0xJRCk7JiN4QTsmI3g5O3RoaXMuc2V0QmFja2dyb3VuZENvbG9yKFdPUktQUk9EVUNUREVTQ1JJUFRPUk5PREVGSUdVUkVfQkFDSyYjeEE7KTsmI3hBOyYjeDk7JiN4OTtjcmVhdGVDb250ZW50cygpOyYjeEE7JiN4OTt9JiN4QTsmI3g5Oy8qKiYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4QTsmI3g5OyAqLyYjeEE7JiN4OTtwcml2YXRlIHZvaWQgY3JlYXRlQ29udGVudHMoKXsmI3hBOyYjeEE7JiN4QTsmI3hBO29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCB3b3JrUHJvZHVjdE5vZGVOYW1lRmlndXJlMCA9IG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwoKTsmI3hBO3dvcmtQcm9kdWN0Tm9kZU5hbWVGaWd1cmUwLnNldFRleHQoJnF1b3Q7Jmx0Oy4uLj4mcXVvdDspOyYjeEE7JiN4QTt3b3JrUHJvZHVjdE5vZGVOYW1lRmlndXJlMC5zZXRGb250KFdvcmtQcm9kdWN0Tm9kZU5hbWVGaWd1cmVfRk9OVCk7JiN4QTsmI3hBOyYjeEE7JiN4QTt0aGlzLmFkZCh3b3JrUHJvZHVjdE5vZGVOYW1lRmlndXJlMCk7JiN4QTtzZXRGaWd1cmVXb3JrUHJvZHVjdE5vZGVOYW1lRmlndXJlKHdvcmtQcm9kdWN0Tm9kZU5hbWVGaWd1cmUwKTsmI3hBOyYjeEE7JiN4OTt9JiN4QTsmI3g5Oy8qKiYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4QTsmI3g5OyAqLyYjeEE7JiN4OTtwcml2YXRlIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCBmV29ya1Byb2R1Y3ROb2RlTmFtZUZpZ3VyZTsgJiN4QTsmI3hBOyYjeDk7LyoqJiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hBOyYjeDk7ICovJiN4QTsmI3g5O3B1YmxpYyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZ2V0RmlndXJlV29ya1Byb2R1Y3ROb2RlTmFtZUZpZ3VyZSgpIHsmI3hBOyYjeDk7JiN4OTtyZXR1cm4gZldvcmtQcm9kdWN0Tm9kZU5hbWVGaWd1cmU7JiN4QTsmI3g5O30mI3hBOyYjeDk7JiN4QTsmI3g5Oy8qKiYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4QTsmI3g5OyAqLyYjeEE7JiN4OTtwcml2YXRlIHZvaWQgc2V0RmlndXJlV29ya1Byb2R1Y3ROb2RlTmFtZUZpZ3VyZShvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZmlnKXsmI3hBOyYjeDk7JiN4OTtmV29ya1Byb2R1Y3ROb2RlTmFtZUZpZ3VyZSA9IGZpZzsmI3hBOyYjeDk7fSYjeEE7JiN4QTsmI3hBOyYjeEE7JiN4QTsmI3hBOyYjeDk7LyoqJiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hBOyYjeDk7ICovJiN4QTsmI3g5O3ByaXZhdGUgYm9vbGVhbiBteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSBmYWxzZTsmI3hBOyYjeEE7JiN4OTsvKiomI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEE7JiN4OTsgKi8mI3hBOyYjeDk7cHJvdGVjdGVkIGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcygpIHsmI3hBOyYjeDk7JiN4OTtyZXR1cm4gbXlVc2VMb2NhbENvb3JkaW5hdGVzOyYjeEE7JiN4OTt9JiN4QTsmI3hBOyYjeDk7LyoqJiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hBOyYjeDk7ICovJiN4QTsmI3g5O3Byb3RlY3RlZCB2b2lkIHNldFVzZUxvY2FsQ29vcmRpbmF0ZXMoYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKSB7JiN4QTsmI3g5OyYjeDk7bXlVc2VMb2NhbENvb3JkaW5hdGVzID0gdXNlTG9jYWxDb29yZGluYXRlczsmI3hBOyYjeDk7fSYjeEE7JiN4QTt9JiN4QTsmI3hBOy8qKiYjeEE7ICogQGdlbmVyYXRlZCYjeEE7ICovJiN4QTtzdGF0aWMgZmluYWwgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yIFdPUktQUk9EVUNUREVTQ1JJUFRPUk5PREVGSUdVUkVfQkFDSyA9IG5ldyBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3IobnVsbCwgMjU1LCAyNTUsIDIwNSk7JiN4QTsmI3hBOy8qKiYjeEE7ICogQGdlbmVyYXRlZCYjeEE7ICovJiN4QTtzdGF0aWMgZmluYWwgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnQgV29ya1Byb2R1Y3ROb2RlTmFtZUZpZ3VyZV9GT05UID0gbmV3IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250KG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXkuZ2V0Q3VycmVudCgpLCAmcXVvdDtBcmlhbCZxdW90OywgOCwgb3JnLmVjbGlwc2Uuc3d0LlNXVC5OT1JNQUwpOyYjeEE7JiN4QTsiPgotICAgICAgICA8YXR0cmlidXRlcwotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpTdHlsZUF0dHJpYnV0ZXMiCi0gICAgICAgICAgICBmaXhlZEJhY2tncm91bmQ9InRydWUiLz4KLSAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmRyYXcyZDwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWk8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgPC92aWV3bWFwPgotICAgICAgPG1vZGVsRmFjZXQ+Ci0gICAgICAgIDxtZXRhQ2xhc3MKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZ2VubW9kZWwjLy9tb2RlbC9Xb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlIi8+Ci0gICAgICAgIDxjb250YWlubWVudE1ldGFGZWF0dXJlCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmdlbm1vZGVsIy8vbW9kZWwvTm9kZUNvbnRhaW5lci9ub2RlcyIvPgotICAgICAgICA8Y2hpbGRNZXRhRmVhdHVyZQotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5nZW5tb2RlbCMvL21vZGVsL05vZGVDb250YWluZXIvbm9kZXMiLz4KLSAgICAgIDwvbW9kZWxGYWNldD4KLSAgICAgIDxsYWJlbHMKLSAgICAgICAgICB2aXN1YWxJRD0iNDAwMyIKLSAgICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZU5hbWVFZGl0UGFydCIKLSAgICAgICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlTmFtZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiCi0gICAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZU5hbWVWaWV3RmFjdG9yeSI+Ci0gICAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzCi0gICAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+Ci0gICAgICAgIDx2aWV3bWFwCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlBhcmVudEFzc2lnbmVkVmlld21hcCIKLSAgICAgICAgICAgIGdldHRlck5hbWU9ImdldEZpZ3VyZVdvcmtQcm9kdWN0Tm9kZU5hbWVGaWd1cmUiCi0gICAgICAgICAgICBmaWd1cmVRdWFsaWZpZWRDbGFzc05hbWU9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCI+Ci0gICAgICAgICAgPGF0dHJpYnV0ZXMKLSAgICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpTdHlsZUF0dHJpYnV0ZXMiCi0gICAgICAgICAgICAgIGZpeGVkRm9udD0idHJ1ZSIvPgotICAgICAgICA8L3ZpZXdtYXA+Ci0gICAgICAgIDxtb2RlbEZhY2V0Ci0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOkZlYXR1cmVMYWJlbE1vZGVsRmFjZXQiPgotICAgICAgICAgIDxtZXRhRmVhdHVyZXMKLSAgICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5nZW5tb2RlbCMvL21vZGVsL05hbWVkTm9kZS9uYW1lIi8+Ci0gICAgICAgIDwvbW9kZWxGYWNldD4KLSAgICAgIDwvbGFiZWxzPgotICAgIDwvY2hpbGROb2Rlcz4KLSAgICA8dG9wTGV2ZWxOb2RlcwotICAgICAgICB2aXN1YWxJRD0iMTAwMSIKLSAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9IlJvbGVUYXNrQ29tcG9zaXRlRWRpdFBhcnQiCi0gICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IlJvbGVUYXNrQ29tcG9zaXRlSXRlbVNlbWFudGljRWRpdFBvbGljeSIKLSAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iUm9sZVRhc2tDb21wb3NpdGVWaWV3RmFjdG9yeSIKLSAgICAgICAgY2Fub25pY2FsRWRpdFBvbGljeUNsYXNzTmFtZT0iUm9sZVRhc2tDb21wb3NpdGVDYW5vbmljYWxFZGl0UG9saWN5IgotICAgICAgICBjaGlsZE5vZGVzPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjAgLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4xIgotICAgICAgICBjb21wYXJ0bWVudHM9Ii8vQGRpYWdyYW0vQGNvbXBhcnRtZW50cy4wIgotICAgICAgICBncmFwaGljYWxOb2RlRWRpdFBvbGljeUNsYXNzTmFtZT0iUm9sZVRhc2tDb21wb3NpdGVHcmFwaGljYWxOb2RlRWRpdFBvbGljeSIKLSAgICAgICAgY3JlYXRlQ29tbWFuZENsYXNzTmFtZT0iUm9sZVRhc2tDb21wb3NpdGVDcmVhdGVDb21tYW5kIj4KLSAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzCi0gICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vTm9kZSIvPgotICAgICAgPGVsZW1lbnRUeXBlCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpNZXRhbW9kZWxUeXBlIgotICAgICAgICAgIGVkaXRIZWxwZXJDbGFzc05hbWU9IlJvbGVUYXNrQ29tcG9zaXRlRWRpdEhlbHBlciIvPgotICAgICAgPHZpZXdtYXAKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOklubmVyQ2xhc3NWaWV3bWFwIgotICAgICAgICAgIGxheW91dFR5cGU9IlRPT0xCQVJfTEFZT1VUIgotICAgICAgICAgIGNsYXNzTmFtZT0iUm9sZVRhc2tDb21wb3NpdGVGaWd1cmUiCi0gICAgICAgICAgY2xhc3NCb2R5PSImI3hBOy8qKiYjeEE7ICogQGdlbmVyYXRlZCYjeEE7ICovJiN4QTtwdWJsaWMgY2xhc3MgUm9sZVRhc2tDb21wb3NpdGVGaWd1cmUgZXh0ZW5kcyBvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlIHsmI3hBOyYjeDk7LyoqJiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hBOyYjeDk7ICovJiN4QTsmI3g5O3B1YmxpYyBSb2xlVGFza0NvbXBvc2l0ZUZpZ3VyZSgpIHsmI3hBOyYjeDk7JiN4OTsmI3hBOyYjeEE7JiN4OTtvcmcuZWNsaXBzZS5kcmF3MmQuVG9vbGJhckxheW91dCBsYXlvdXRUaGlzID0gbmV3IG9yZy5lY2xpcHNlLmRyYXcyZC5Ub29sYmFyTGF5b3V0KCk7JiN4QTsmI3g5O2xheW91dFRoaXMuc2V0U3RyZXRjaE1pbm9yQXhpcyhmYWxzZSk7JiN4QTsmI3g5O2xheW91dFRoaXMuc2V0TWlub3JBbGlnbm1lbnQob3JnLmVjbGlwc2UuZHJhdzJkLlRvb2xiYXJMYXlvdXQuJiN4QTtBTElHTl9DRU5URVImI3hBOyYjeEE7JiN4QTspOyYjeEE7JiN4QTsmI3g5O2xheW91dFRoaXMuc2V0U3BhY2luZyg1KTsmI3hBOyYjeDk7bGF5b3V0VGhpcy5zZXRWZXJ0aWNhbChmYWxzZSk7JiN4QTsmI3hBOyYjeDk7dGhpcy5zZXRMYXlvdXRNYW5hZ2VyKGxheW91dFRoaXMpOyYjeEE7JiN4QTsmI3g5OyYjeDk7dGhpcy5zZXRGaWxsKHRydWUpOyYjeEE7dGhpcy5zZXRGaWxsWE9SKGZhbHNlKTsmI3hBO3RoaXMuc2V0T3V0bGluZSh0cnVlKTsmI3hBO3RoaXMuc2V0T3V0bGluZVhPUihmYWxzZSk7JiN4QTt0aGlzLnNldExpbmVXaWR0aCgxKTsmI3hBO3RoaXMuc2V0TGluZVN0eWxlKG9yZy5lY2xpcHNlLmRyYXcyZC5HcmFwaGljcy5MSU5FX1NPTElEKTsmI3hBOyYjeDk7dGhpcy5zZXRCYWNrZ3JvdW5kQ29sb3IoUk9MRVRBU0tDT01QT1NJVEVGSUdVUkVfQkFDSyYjeEE7KTsmI3hBO3RoaXMuc2V0Qm9yZGVyKG5ldyBvcmcuZWNsaXBzZS5kcmF3MmQuTWFyZ2luQm9yZGVyKCkmI3hBOyk7JiN4QTsmI3g5O30mI3hBOyYjeEE7JiN4QTsmI3hBOyYjeDk7LyoqJiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hBOyYjeDk7ICovJiN4QTsmI3g5O3ByaXZhdGUgYm9vbGVhbiBteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSBmYWxzZTsmI3hBOyYjeEE7JiN4OTsvKiomI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEE7JiN4OTsgKi8mI3hBOyYjeDk7cHJvdGVjdGVkIGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcygpIHsmI3hBOyYjeDk7JiN4OTtyZXR1cm4gbXlVc2VMb2NhbENvb3JkaW5hdGVzOyYjeEE7JiN4OTt9JiN4QTsmI3hBOyYjeDk7LyoqJiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hBOyYjeDk7ICovJiN4QTsmI3g5O3Byb3RlY3RlZCB2b2lkIHNldFVzZUxvY2FsQ29vcmRpbmF0ZXMoYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKSB7JiN4QTsmI3g5OyYjeDk7bXlVc2VMb2NhbENvb3JkaW5hdGVzID0gdXNlTG9jYWxDb29yZGluYXRlczsmI3hBOyYjeDk7fSYjeEE7JiN4QTt9JiN4QTsmI3hBOy8qKiYjeEE7ICogQGdlbmVyYXRlZCYjeEE7ICovJiN4QTtzdGF0aWMgZmluYWwgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yIFJPTEVUQVNLQ09NUE9TSVRFRklHVVJFX0JBQ0sgPSBuZXcgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yKG51bGwsIDI1NSwgMjU1LCAxNTYpOyYjeEE7JiN4QTsiPgotICAgICAgICA8YXR0cmlidXRlcwotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpTdHlsZUF0dHJpYnV0ZXMiCi0gICAgICAgICAgICBmaXhlZEJhY2tncm91bmQ9InRydWUiLz4KLSAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmRyYXcyZDwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWk8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgPC92aWV3bWFwPgotICAgICAgPG1vZGVsRmFjZXQ+Ci0gICAgICAgIDxtZXRhQ2xhc3MKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZ2VubW9kZWwjLy9tb2RlbC9Sb2xlVGFza0NvbXBvc2l0ZSIvPgotICAgICAgICA8Y29udGFpbm1lbnRNZXRhRmVhdHVyZQotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5nZW5tb2RlbCMvL21vZGVsL05vZGVDb250YWluZXIvbm9kZXMiLz4KLSAgICAgICAgPGNoaWxkTWV0YUZlYXR1cmUKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZ2VubW9kZWwjLy9tb2RlbC9Ob2RlQ29udGFpbmVyL25vZGVzIi8+Ci0gICAgICA8L21vZGVsRmFjZXQ+Ci0gICAgPC90b3BMZXZlbE5vZGVzPgotICAgIDx0b3BMZXZlbE5vZGVzCi0gICAgICAgIHZpc3VhbElEPSIxMDAyIgotICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iV29ya1Byb2R1Y3RDb21wb3NpdGVFZGl0UGFydCIKLSAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iV29ya1Byb2R1Y3RDb21wb3NpdGVJdGVtU2VtYW50aWNFZGl0UG9saWN5IgotICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJXb3JrUHJvZHVjdENvbXBvc2l0ZVZpZXdGYWN0b3J5IgotICAgICAgICBjYW5vbmljYWxFZGl0UG9saWN5Q2xhc3NOYW1lPSJXb3JrUHJvZHVjdENvbXBvc2l0ZUNhbm9uaWNhbEVkaXRQb2xpY3kiCi0gICAgICAgIGNoaWxkTm9kZXM9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMiIKLSAgICAgICAgY29tcGFydG1lbnRzPSIvL0BkaWFncmFtL0Bjb21wYXJ0bWVudHMuMSIKLSAgICAgICAgZ3JhcGhpY2FsTm9kZUVkaXRQb2xpY3lDbGFzc05hbWU9IldvcmtQcm9kdWN0Q29tcG9zaXRlR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kiCi0gICAgICAgIGNyZWF0ZUNvbW1hbmRDbGFzc05hbWU9IldvcmtQcm9kdWN0Q29tcG9zaXRlQ3JlYXRlQ29tbWFuZCI+Ci0gICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcwotICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL05vZGUiLz4KLSAgICAgIDxlbGVtZW50VHlwZQotICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46TWV0YW1vZGVsVHlwZSIKLSAgICAgICAgICBlZGl0SGVscGVyQ2xhc3NOYW1lPSJXb3JrUHJvZHVjdENvbXBvc2l0ZUVkaXRIZWxwZXIiLz4KLSAgICAgIDx2aWV3bWFwCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpJbm5lckNsYXNzVmlld21hcCIKLSAgICAgICAgICBsYXlvdXRUeXBlPSJUT09MQkFSX0xBWU9VVCIKLSAgICAgICAgICBjbGFzc05hbWU9IldvcmtQcm9kdWN0Q29tcG9zaXRlRmlndXJlIgotICAgICAgICAgIGNsYXNzQm9keT0iJiN4QTsvKiomI3hBOyAqIEBnZW5lcmF0ZWQmI3hBOyAqLyYjeEE7cHVibGljIGNsYXNzIFdvcmtQcm9kdWN0Q29tcG9zaXRlRmlndXJlIGV4dGVuZHMgb3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZSB7JiN4QTsmI3g5Oy8qKiYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4QTsmI3g5OyAqLyYjeEE7JiN4OTtwdWJsaWMgV29ya1Byb2R1Y3RDb21wb3NpdGVGaWd1cmUoKSB7JiN4QTsmI3g5OyYjeDk7JiN4QTsmI3hBOyYjeDk7b3JnLmVjbGlwc2UuZHJhdzJkLlRvb2xiYXJMYXlvdXQgbGF5b3V0VGhpcyA9IG5ldyBvcmcuZWNsaXBzZS5kcmF3MmQuVG9vbGJhckxheW91dCgpOyYjeEE7JiN4OTtsYXlvdXRUaGlzLnNldFN0cmV0Y2hNaW5vckF4aXMoZmFsc2UpOyYjeEE7JiN4OTtsYXlvdXRUaGlzLnNldE1pbm9yQWxpZ25tZW50KG9yZy5lY2xpcHNlLmRyYXcyZC5Ub29sYmFyTGF5b3V0LiYjeEE7QUxJR05fQ0VOVEVSJiN4QTsmI3hBOyYjeEE7KTsmI3hBOyYjeEE7JiN4OTtsYXlvdXRUaGlzLnNldFNwYWNpbmcoNSk7JiN4QTsmI3g5O2xheW91dFRoaXMuc2V0VmVydGljYWwodHJ1ZSk7JiN4QTsmI3hBOyYjeDk7dGhpcy5zZXRMYXlvdXRNYW5hZ2VyKGxheW91dFRoaXMpOyYjeEE7JiN4QTsmI3g5OyYjeDk7dGhpcy5zZXRGaWxsKHRydWUpOyYjeEE7dGhpcy5zZXRGaWxsWE9SKGZhbHNlKTsmI3hBO3RoaXMuc2V0T3V0bGluZSh0cnVlKTsmI3hBO3RoaXMuc2V0T3V0bGluZVhPUihmYWxzZSk7JiN4QTt0aGlzLnNldExpbmVXaWR0aCgxKTsmI3hBO3RoaXMuc2V0TGluZVN0eWxlKG9yZy5lY2xpcHNlLmRyYXcyZC5HcmFwaGljcy5MSU5FX1NPTElEKTsmI3hBOyYjeDk7dGhpcy5zZXRCYWNrZ3JvdW5kQ29sb3IoV09SS1BST0RVQ1RDT01QT1NJVEVGSUdVUkVfQkFDSyYjeEE7KTsmI3hBO3RoaXMuc2V0Qm9yZGVyKG5ldyBvcmcuZWNsaXBzZS5kcmF3MmQuTWFyZ2luQm9yZGVyKCkmI3hBOyk7JiN4QTsmI3g5O30mI3hBOyYjeEE7JiN4QTsmI3hBOyYjeDk7LyoqJiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hBOyYjeDk7ICovJiN4QTsmI3g5O3ByaXZhdGUgYm9vbGVhbiBteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSBmYWxzZTsmI3hBOyYjeEE7JiN4OTsvKiomI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEE7JiN4OTsgKi8mI3hBOyYjeDk7cHJvdGVjdGVkIGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcygpIHsmI3hBOyYjeDk7JiN4OTtyZXR1cm4gbXlVc2VMb2NhbENvb3JkaW5hdGVzOyYjeEE7JiN4OTt9JiN4QTsmI3hBOyYjeDk7LyoqJiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hBOyYjeDk7ICovJiN4QTsmI3g5O3Byb3RlY3RlZCB2b2lkIHNldFVzZUxvY2FsQ29vcmRpbmF0ZXMoYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKSB7JiN4QTsmI3g5OyYjeDk7bXlVc2VMb2NhbENvb3JkaW5hdGVzID0gdXNlTG9jYWxDb29yZGluYXRlczsmI3hBOyYjeDk7fSYjeEE7JiN4QTt9JiN4QTsmI3hBOy8qKiYjeEE7ICogQGdlbmVyYXRlZCYjeEE7ICovJiN4QTtzdGF0aWMgZmluYWwgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yIFdPUktQUk9EVUNUQ09NUE9TSVRFRklHVVJFX0JBQ0sgPSBuZXcgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yKG51bGwsIDI1NSwgMjU1LCAyMDUpOyYjeEE7JiN4QTsiPgotICAgICAgICA8YXR0cmlidXRlcwotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpTdHlsZUF0dHJpYnV0ZXMiCi0gICAgICAgICAgICBmaXhlZEJhY2tncm91bmQ9InRydWUiLz4KLSAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmRyYXcyZDwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWk8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgPC92aWV3bWFwPgotICAgICAgPG1vZGVsRmFjZXQ+Ci0gICAgICAgIDxtZXRhQ2xhc3MKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZ2VubW9kZWwjLy9tb2RlbC9Xb3JrUHJvZHVjdENvbXBvc2l0ZSIvPgotICAgICAgICA8Y29udGFpbm1lbnRNZXRhRmVhdHVyZQotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5nZW5tb2RlbCMvL21vZGVsL05vZGVDb250YWluZXIvbm9kZXMiLz4KLSAgICAgICAgPGNoaWxkTWV0YUZlYXR1cmUKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZ2VubW9kZWwjLy9tb2RlbC9Ob2RlQ29udGFpbmVyL25vZGVzIi8+Ci0gICAgICA8L21vZGVsRmFjZXQ+Ci0gICAgPC90b3BMZXZlbE5vZGVzPgotICAgIDxsaW5rcwotICAgICAgICB2aXN1YWxJRD0iMzAwMSIKLSAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9IkxpbmtFZGl0UGFydCIKLSAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iTGlua0l0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiCi0gICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9IkxpbmtWaWV3RmFjdG9yeSIKLSAgICAgICAgY3JlYXRlQ29tbWFuZENsYXNzTmFtZT0iTGlua0NyZWF0ZUNvbW1hbmQiCi0gICAgICAgIHJlb3JpZW50Q29tbWFuZENsYXNzTmFtZT0iTGlua1Jlb3JpZW50Q29tbWFuZCI+Ci0gICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcwotICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL0VkZ2UiLz4KLSAgICAgIDxlbGVtZW50VHlwZQotICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46TWV0YW1vZGVsVHlwZSIKLSAgICAgICAgICBlZGl0SGVscGVyQ2xhc3NOYW1lPSJMaW5rRWRpdEhlbHBlciIvPgotICAgICAgPHZpZXdtYXAKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOklubmVyQ2xhc3NWaWV3bWFwIgotICAgICAgICAgIGNsYXNzTmFtZT0iTGlua0ZpZ3VyZSIKLSAgICAgICAgICBjbGFzc0JvZHk9IiYjeEE7LyoqJiN4QTsgKiBAZ2VuZXJhdGVkJiN4QTsgKi8mI3hBO3B1YmxpYyBjbGFzcyBMaW5rRmlndXJlIGV4dGVuZHMgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuUG9seWxpbmVDb25uZWN0aW9uRXggeyYjeEE7JiN4QTsmI3g5Oy8qKiYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4QTsmI3g5OyAqLyYjeEE7JiN4OTtwdWJsaWMgTGlua0ZpZ3VyZSgpIHsmI3hBOyYjeDk7JiN4OTt0aGlzLnNldEZpbGwodHJ1ZSk7JiN4QTt0aGlzLnNldEZpbGxYT1IoZmFsc2UpOyYjeEE7dGhpcy5zZXRPdXRsaW5lKHRydWUpOyYjeEE7dGhpcy5zZXRPdXRsaW5lWE9SKGZhbHNlKTsmI3hBO3RoaXMuc2V0TGluZVdpZHRoKDEpOyYjeEE7dGhpcy5zZXRMaW5lU3R5bGUob3JnLmVjbGlwc2UuZHJhdzJkLkdyYXBoaWNzLkxJTkVfU09MSUQpOyYjeEE7JiN4OTt0aGlzLnNldEZvcmVncm91bmRDb2xvcihvcmcuZWNsaXBzZS5kcmF3MmQuQ29sb3JDb25zdGFudHMuYmxhY2spOyYjeEE7JiN4QTsmI3g5OyYjeDk7c2V0VGFyZ2V0RGVjb3JhdGlvbihjcmVhdGVUYXJnZXREZWNvcmF0aW9uKCkpOyYjeEE7JiN4OTt9JiN4QTsmI3hBOyYjeDk7LyoqJiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hBOyYjeDk7ICovJiN4QTsmI3g5O3ByaXZhdGUgb3JnLmVjbGlwc2UuZHJhdzJkLlJvdGF0YWJsZURlY29yYXRpb24gY3JlYXRlVGFyZ2V0RGVjb3JhdGlvbigpIHsmI3hBOyYjeDk7JiN4OTtvcmcuZWNsaXBzZS5kcmF3MmQuUG9seWxpbmVEZWNvcmF0aW9uIGRmID0gbmV3IG9yZy5lY2xpcHNlLmRyYXcyZC5Qb2x5bGluZURlY29yYXRpb24oKTsmI3hBO2RmLnNldEZpbGwodHJ1ZSk7JiN4QTtkZi5zZXRGaWxsWE9SKGZhbHNlKTsmI3hBO2RmLnNldE91dGxpbmUodHJ1ZSk7JiN4QTtkZi5zZXRPdXRsaW5lWE9SKGZhbHNlKTsmI3hBO2RmLnNldExpbmVXaWR0aCgxKTsmI3hBO2RmLnNldExpbmVTdHlsZShvcmcuZWNsaXBzZS5kcmF3MmQuR3JhcGhpY3MuTElORV9TT0xJRCk7JiN4QTtvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnRMaXN0IHBsID0gbmV3IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludExpc3QoKTsmI3hBO3BsLmFkZFBvaW50KGdldE1hcE1vZGUoKS5EUHRvTFAoLTEpJiN4QTssIGdldE1hcE1vZGUoKS5EUHRvTFAoMSkmI3hBOyk7JiN4QTtwbC5hZGRQb2ludChnZXRNYXBNb2RlKCkuRFB0b0xQKDApJiN4QTssIGdldE1hcE1vZGUoKS5EUHRvTFAoMCkmI3hBOyk7JiN4QTtwbC5hZGRQb2ludChnZXRNYXBNb2RlKCkuRFB0b0xQKC0xKSYjeEE7LCBnZXRNYXBNb2RlKCkuRFB0b0xQKC0xKSYjeEE7KTsmI3hBO2RmLnNldFRlbXBsYXRlKHBsKTsmI3hBO2RmLnNldFNjYWxlKGdldE1hcE1vZGUoKS5EUHRvTFAoNykmI3hBOywgZ2V0TWFwTW9kZSgpLkRQdG9MUCgzKSYjeEE7KTsmI3hBOyYjeDk7JiN4OTtyZXR1cm4gZGY7JiN4QTsmI3g5O30mI3hBOyYjeEE7fSYjeEE7JiN4QTsiPgotICAgICAgICA8YXR0cmlidXRlcwotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpTdHlsZUF0dHJpYnV0ZXMiCi0gICAgICAgICAgICBmaXhlZEZvcmVncm91bmQ9InRydWUiLz4KLSAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmRyYXcyZDwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWk8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgPC92aWV3bWFwPgotICAgICAgPG1vZGVsRmFjZXQKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlR5cGVMaW5rTW9kZWxGYWNldCI+Ci0gICAgICAgIDxtZXRhQ2xhc3MKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZ2VubW9kZWwjLy9tb2RlbC9MaW5rIi8+Ci0gICAgICAgIDxjb250YWlubWVudE1ldGFGZWF0dXJlCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmdlbm1vZGVsIy8vbW9kZWwvTm9kZS9vdXRnb2luZ0Nvbm5lY3Rpb25zIi8+Ci0gICAgICAgIDxjaGlsZE1ldGFGZWF0dXJlCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmdlbm1vZGVsIy8vbW9kZWwvTm9kZS9vdXRnb2luZ0Nvbm5lY3Rpb25zIi8+Ci0gICAgICAgIDxzb3VyY2VNZXRhRmVhdHVyZQotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5nZW5tb2RlbCMvL21vZGVsL0xpbmsvc291cmNlIi8+Ci0gICAgICAgIDx0YXJnZXRNZXRhRmVhdHVyZQotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5nZW5tb2RlbCMvL21vZGVsL0xpbmsvdGFyZ2V0Ii8+Ci0gICAgICA8L21vZGVsRmFjZXQ+Ci0gICAgICA8bGFiZWxzCi0gICAgICAgICAgdmlzdWFsSUQ9IjQwMDQiCi0gICAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9IkxpbmtOYW1lRWRpdFBhcnQiCi0gICAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iTGlua05hbWVJdGVtU2VtYW50aWNFZGl0UG9saWN5IgotICAgICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9IkxpbmtOYW1lVmlld0ZhY3RvcnkiPgotICAgICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcwotICAgICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vTm9kZSIvPgotICAgICAgICA8dmlld21hcAotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpGaWd1cmVWaWV3bWFwIgotICAgICAgICAgICAgZmlndXJlUXVhbGlmaWVkQ2xhc3NOYW1lPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwiPgotICAgICAgICAgIDxhdHRyaWJ1dGVzCi0gICAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46TGFiZWxPZmZzZXRBdHRyaWJ1dGVzIgotICAgICAgICAgICAgICB5PSI0MCIvPgotICAgICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5kcmF3MmQ8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWk8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgICA8L3ZpZXdtYXA+Ci0gICAgICAgIDxtb2RlbEZhY2V0Ci0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOkZlYXR1cmVMYWJlbE1vZGVsRmFjZXQiCi0gICAgICAgICAgICBlZGl0UGF0dGVybj0iIj4KLSAgICAgICAgICA8bWV0YUZlYXR1cmVzCi0gICAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZ2VubW9kZWwjLy9tb2RlbC9MaW5rL25hbWUiLz4KLSAgICAgICAgPC9tb2RlbEZhY2V0PgotICAgICAgPC9sYWJlbHM+Ci0gICAgPC9saW5rcz4KLSAgICA8Y29tcGFydG1lbnRzCi0gICAgICAgIHZpc3VhbElEPSI1MDAxIgotICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iUm9sZVRhc2tDb21wb3NpdGVSb2xlVGFza0NvbXBhcnRtZW50RWRpdFBhcnQiCi0gICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IlJvbGVUYXNrQ29tcG9zaXRlUm9sZVRhc2tDb21wYXJ0bWVudEl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiCi0gICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9IlJvbGVUYXNrQ29tcG9zaXRlUm9sZVRhc2tDb21wYXJ0bWVudFZpZXdGYWN0b3J5IgotICAgICAgICBjYW5vbmljYWxFZGl0UG9saWN5Q2xhc3NOYW1lPSJSb2xlVGFza0NvbXBvc2l0ZVJvbGVUYXNrQ29tcGFydG1lbnRDYW5vbmljYWxFZGl0UG9saWN5IgotICAgICAgICB0aXRsZT0iUm9sZVRhc2tDb21wYXJ0bWVudCIKLSAgICAgICAgY2FuQ29sbGFwc2U9ImZhbHNlIgotICAgICAgICBuZWVkc1RpdGxlPSJmYWxzZSIKLSAgICAgICAgbm9kZT0iLy9AZGlhZ3JhbS9AdG9wTGV2ZWxOb2Rlcy4wIj4KLSAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzCi0gICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vTm9kZSIvPgotICAgICAgPHZpZXdtYXAKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOkZpZ3VyZVZpZXdtYXAiCi0gICAgICAgICAgZmlndXJlUXVhbGlmaWVkQ2xhc3NOYW1lPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmZpZ3VyZXMuUmVzaXphYmxlQ29tcGFydG1lbnRGaWd1cmUiPgotICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZHJhdzJkPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aTwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICA8L3ZpZXdtYXA+Ci0gICAgPC9jb21wYXJ0bWVudHM+Ci0gICAgPGNvbXBhcnRtZW50cwotICAgICAgICB2aXN1YWxJRD0iNTAwMiIKLSAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9IldvcmtQcm9kdWN0Q29tcG9zaXRlV29ya1Byb2R1Y3RDb21wYXJ0bWVudEVkaXRQYXJ0IgotICAgICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJXb3JrUHJvZHVjdENvbXBvc2l0ZVdvcmtQcm9kdWN0Q29tcGFydG1lbnRJdGVtU2VtYW50aWNFZGl0UG9saWN5IgotICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJXb3JrUHJvZHVjdENvbXBvc2l0ZVdvcmtQcm9kdWN0Q29tcGFydG1lbnRWaWV3RmFjdG9yeSIKLSAgICAgICAgY2Fub25pY2FsRWRpdFBvbGljeUNsYXNzTmFtZT0iV29ya1Byb2R1Y3RDb21wb3NpdGVXb3JrUHJvZHVjdENvbXBhcnRtZW50Q2Fub25pY2FsRWRpdFBvbGljeSIKLSAgICAgICAgdGl0bGU9IldvcmtQcm9kdWN0Q29tcGFydG1lbnQiCi0gICAgICAgIGNhbkNvbGxhcHNlPSJmYWxzZSIKLSAgICAgICAgbmVlZHNUaXRsZT0iZmFsc2UiCi0gICAgICAgIG5vZGU9Ii8vQGRpYWdyYW0vQHRvcExldmVsTm9kZXMuMSI+Ci0gICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcwotICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL05vZGUiLz4KLSAgICAgIDx2aWV3bWFwCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpGaWd1cmVWaWV3bWFwIgotICAgICAgICAgIGZpZ3VyZVF1YWxpZmllZENsYXNzTmFtZT0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5maWd1cmVzLlJlc2l6YWJsZUNvbXBhcnRtZW50RmlndXJlIj4KLSAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmRyYXcyZDwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWk8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgPC92aWV3bWFwPgotICAgIDwvY29tcGFydG1lbnRzPgotICAgIDxwYWxldHRlPgotICAgICAgPGdyb3VwcwotICAgICAgICAgIHRpdGxlPSJOb2RlcyIKLSAgICAgICAgICBjb2xsYXBzZT0idHJ1ZSI+Ci0gICAgICAgIDxlbnRyaWVzCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlRvb2xFbnRyeSIKLSAgICAgICAgICAgIHRpdGxlPSJSb2xlTm9kZSIKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJDcmVhdGUgbmV3IFJvbGVOb2RlIgotICAgICAgICAgICAgZ2VuTm9kZXM9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMCIvPgotICAgICAgICA8ZW50cmllcwotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpUb29sRW50cnkiCi0gICAgICAgICAgICB0aXRsZT0iUm9sZVRhc2tDb21wb3NpdGUiCi0gICAgICAgICAgICBkZXNjcmlwdGlvbj0iQ3JlYXRlIG5ldyBSb2xlVGFza0NvbXBvc2l0ZSIKLSAgICAgICAgICAgIGdlbk5vZGVzPSIvL0BkaWFncmFtL0B0b3BMZXZlbE5vZGVzLjAiLz4KLSAgICAgICAgPGVudHJpZXMKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46VG9vbEVudHJ5IgotICAgICAgICAgICAgdGl0bGU9IlRhc2tOb2RlIgotICAgICAgICAgICAgZGVzY3JpcHRpb249IkNyZWF0ZSBuZXcgVGFza05vZGUiCi0gICAgICAgICAgICBnZW5Ob2Rlcz0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4xIi8+Ci0gICAgICAgIDxlbnRyaWVzCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlRvb2xFbnRyeSIKLSAgICAgICAgICAgIHRpdGxlPSJXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlIgotICAgICAgICAgICAgZGVzY3JpcHRpb249IkNyZWF0ZSBuZXcgV29ya1Byb2R1Y05vZGUiCi0gICAgICAgICAgICBnZW5Ob2Rlcz0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4yIi8+Ci0gICAgICAgIDxlbnRyaWVzCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlRvb2xFbnRyeSIKLSAgICAgICAgICAgIHRpdGxlPSJXb3JrUHJvZHVjdENvbXBvc2l0ZSIKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJDcmVhdGUgbmV3IFdvcmtQcm9kdWN0Q29tcG9zaXRlIgotICAgICAgICAgICAgZ2VuTm9kZXM9Ii8vQGRpYWdyYW0vQHRvcExldmVsTm9kZXMuMSIvPgotICAgICAgPC9ncm91cHM+Ci0gICAgICA8Z3JvdXBzCi0gICAgICAgICAgdGl0bGU9IkxpbmtzIgotICAgICAgICAgIGNvbGxhcHNlPSJ0cnVlIj4KLSAgICAgICAgPGVudHJpZXMKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46VG9vbEVudHJ5IgotICAgICAgICAgICAgdGl0bGU9IkxpbmsiCi0gICAgICAgICAgICBkZXNjcmlwdGlvbj0iQ3JlYXRlIG5ldyBsaW5rIgotICAgICAgICAgICAgZ2VuTGlua3M9Ii8vQGRpYWdyYW0vQGxpbmtzLjAiLz4KLSAgICAgIDwvZ3JvdXBzPgotICAgIDwvcGFsZXR0ZT4KLSAgICA8cHJlZmVyZW5jZVBhZ2VzCi0gICAgICAgIHhzaTp0eXBlPSJnbWZnZW46R2VuU3RhbmRhcmRQcmVmZXJlbmNlUGFnZSIKLSAgICAgICAgaUQ9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmRpYWdyYW0uZ2VuZXJhbCIKLSAgICAgICAgbmFtZT0iRGlhZ3JhbSBEaWFncmFtIj4KLSAgICAgIDxjaGlsZHJlbgotICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46R2VuU3RhbmRhcmRQcmVmZXJlbmNlUGFnZSIKLSAgICAgICAgICBpRD0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uZGlhZ3JhbS5hcHBlYXJhbmNlIgotICAgICAgICAgIG5hbWU9IkFwcGVhcmFuY2UiCi0gICAgICAgICAga2luZD0iQXBwZWFyYW5jZSIvPgotICAgICAgPGNoaWxkcmVuCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpHZW5TdGFuZGFyZFByZWZlcmVuY2VQYWdlIgotICAgICAgICAgIGlEPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5kaWFncmFtLmNvbm5lY3Rpb25zIgotICAgICAgICAgIG5hbWU9IkNvbm5lY3Rpb25zIgotICAgICAgICAgIGtpbmQ9IkNvbm5lY3Rpb25zIi8+Ci0gICAgICA8Y2hpbGRyZW4KLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOkdlblN0YW5kYXJkUHJlZmVyZW5jZVBhZ2UiCi0gICAgICAgICAgaUQ9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmRpYWdyYW0ucHJpbnRpbmciCi0gICAgICAgICAgbmFtZT0iUHJpbnRpbmciCi0gICAgICAgICAga2luZD0iUHJpbnRpbmciLz4KLSAgICAgIDxjaGlsZHJlbgotICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46R2VuU3RhbmRhcmRQcmVmZXJlbmNlUGFnZSIKLSAgICAgICAgICBpRD0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uZGlhZ3JhbS5ydWxlcnNBbmRHcmlkIgotICAgICAgICAgIG5hbWU9IlJ1bGVycyBBbmQgR3JpZCIKLSAgICAgICAgICBraW5kPSJSdWxlcnNBbmRHcmlkIi8+Ci0gICAgICA8Y2hpbGRyZW4KLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOkdlblN0YW5kYXJkUHJlZmVyZW5jZVBhZ2UiCi0gICAgICAgICAgaUQ9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmRpYWdyYW0ucGF0aG1hcHMiCi0gICAgICAgICAgbmFtZT0iUGF0aG1hcHMiCi0gICAgICAgICAga2luZD0iUGF0aG1hcHMiLz4KLSAgICA8L3ByZWZlcmVuY2VQYWdlcz4KLSAgPC9kaWFncmFtPgotICA8cGx1Z2luLz4KLSAgPGVkaXRvci8+Ci0gIDxuYXZpZ2F0b3I+Ci0gICAgPGNoaWxkUmVmZXJlbmNlcwotICAgICAgICBjaGlsZD0iLy9AZGlhZ3JhbSIvPgotICAgIDxjaGlsZFJlZmVyZW5jZXMKLSAgICAgICAgcGFyZW50PSIvL0BkaWFncmFtL0B0b3BMZXZlbE5vZGVzLjAiCi0gICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjAiLz4KLSAgICA8Y2hpbGRSZWZlcmVuY2VzCi0gICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AdG9wTGV2ZWxOb2Rlcy4wIgotICAgICAgICBjaGlsZD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4xIi8+Ci0gICAgPGNoaWxkUmVmZXJlbmNlcwotICAgICAgICBwYXJlbnQ9Ii8vQGRpYWdyYW0iCi0gICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0B0b3BMZXZlbE5vZGVzLjAiLz4KLSAgICA8Y2hpbGRSZWZlcmVuY2VzCi0gICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AdG9wTGV2ZWxOb2Rlcy4xIgotICAgICAgICBjaGlsZD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4yIi8+Ci0gICAgPGNoaWxkUmVmZXJlbmNlcwotICAgICAgICBwYXJlbnQ9Ii8vQGRpYWdyYW0iCi0gICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0B0b3BMZXZlbE5vZGVzLjEiLz4KLSAgICA8Y2hpbGRSZWZlcmVuY2VzCi0gICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbSIKLSAgICAgICAgY2hpbGQ9Ii8vQGRpYWdyYW0vQGxpbmtzLjAiCi0gICAgICAgIGdyb3VwTmFtZT0ibGlua3MiCi0gICAgICAgIGdyb3VwSWNvbj0iaWNvbnMvbGlua3NOYXZpZ2F0b3JHcm91cC5naWYiLz4KLSAgICA8Y2hpbGRSZWZlcmVuY2VzCi0gICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AbGlua3MuMCIKLSAgICAgICAgY2hpbGQ9Ii8vQGRpYWdyYW0vQHRvcExldmVsTm9kZXMuMCIKLSAgICAgICAgcmVmZXJlbmNlVHlwZT0ib3V0X3RhcmdldCIKLSAgICAgICAgZ3JvdXBOYW1lPSJ0YXJnZXQiCi0gICAgICAgIGdyb3VwSWNvbj0iaWNvbnMvbGlua1RhcmdldE5hdmlnYXRvckdyb3VwLmdpZiIvPgotICAgIDxjaGlsZFJlZmVyZW5jZXMKLSAgICAgICAgcGFyZW50PSIvL0BkaWFncmFtL0B0b3BMZXZlbE5vZGVzLjAiCi0gICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BsaW5rcy4wIgotICAgICAgICByZWZlcmVuY2VUeXBlPSJpbl9zb3VyY2UiCi0gICAgICAgIGdyb3VwTmFtZT0iaW5jb21pbmcgbGlua3MiCi0gICAgICAgIGdyb3VwSWNvbj0iaWNvbnMvaW5jb21pbmdMaW5rc05hdmlnYXRvckdyb3VwLmdpZiIvPgotICAgIDxjaGlsZFJlZmVyZW5jZXMKLSAgICAgICAgcGFyZW50PSIvL0BkaWFncmFtL0BsaW5rcy4wIgotICAgICAgICBjaGlsZD0iLy9AZGlhZ3JhbS9AdG9wTGV2ZWxOb2Rlcy4xIgotICAgICAgICByZWZlcmVuY2VUeXBlPSJvdXRfdGFyZ2V0IgotICAgICAgICBncm91cE5hbWU9InRhcmdldCIKLSAgICAgICAgZ3JvdXBJY29uPSJpY29ucy9saW5rVGFyZ2V0TmF2aWdhdG9yR3JvdXAuZ2lmIi8+Ci0gICAgPGNoaWxkUmVmZXJlbmNlcwotICAgICAgICBwYXJlbnQ9Ii8vQGRpYWdyYW0vQHRvcExldmVsTm9kZXMuMSIKLSAgICAgICAgY2hpbGQ9Ii8vQGRpYWdyYW0vQGxpbmtzLjAiCi0gICAgICAgIHJlZmVyZW5jZVR5cGU9ImluX3NvdXJjZSIKLSAgICAgICAgZ3JvdXBOYW1lPSJpbmNvbWluZyBsaW5rcyIKLSAgICAgICAgZ3JvdXBJY29uPSJpY29ucy9pbmNvbWluZ0xpbmtzTmF2aWdhdG9yR3JvdXAuZ2lmIi8+Ci0gICAgPGNoaWxkUmVmZXJlbmNlcwotICAgICAgICBwYXJlbnQ9Ii8vQGRpYWdyYW0vQGxpbmtzLjAiCi0gICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjAiCi0gICAgICAgIHJlZmVyZW5jZVR5cGU9Im91dF90YXJnZXQiCi0gICAgICAgIGdyb3VwTmFtZT0idGFyZ2V0IgotICAgICAgICBncm91cEljb249Imljb25zL2xpbmtUYXJnZXROYXZpZ2F0b3JHcm91cC5naWYiLz4KLSAgICA8Y2hpbGRSZWZlcmVuY2VzCi0gICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4wIgotICAgICAgICBjaGlsZD0iLy9AZGlhZ3JhbS9AbGlua3MuMCIKLSAgICAgICAgcmVmZXJlbmNlVHlwZT0iaW5fc291cmNlIgotICAgICAgICBncm91cE5hbWU9ImluY29taW5nIGxpbmtzIgotICAgICAgICBncm91cEljb249Imljb25zL2luY29taW5nTGlua3NOYXZpZ2F0b3JHcm91cC5naWYiLz4KLSAgICA8Y2hpbGRSZWZlcmVuY2VzCi0gICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AbGlua3MuMCIKLSAgICAgICAgY2hpbGQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMSIKLSAgICAgICAgcmVmZXJlbmNlVHlwZT0ib3V0X3RhcmdldCIKLSAgICAgICAgZ3JvdXBOYW1lPSJ0YXJnZXQiCi0gICAgICAgIGdyb3VwSWNvbj0iaWNvbnMvbGlua1RhcmdldE5hdmlnYXRvckdyb3VwLmdpZiIvPgotICAgIDxjaGlsZFJlZmVyZW5jZXMKLSAgICAgICAgcGFyZW50PSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjEiCi0gICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BsaW5rcy4wIgotICAgICAgICByZWZlcmVuY2VUeXBlPSJpbl9zb3VyY2UiCi0gICAgICAgIGdyb3VwTmFtZT0iaW5jb21pbmcgbGlua3MiCi0gICAgICAgIGdyb3VwSWNvbj0iaWNvbnMvaW5jb21pbmdMaW5rc05hdmlnYXRvckdyb3VwLmdpZiIvPgotICAgIDxjaGlsZFJlZmVyZW5jZXMKLSAgICAgICAgcGFyZW50PSIvL0BkaWFncmFtL0BsaW5rcy4wIgotICAgICAgICBjaGlsZD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4yIgotICAgICAgICByZWZlcmVuY2VUeXBlPSJvdXRfdGFyZ2V0IgotICAgICAgICBncm91cE5hbWU9InRhcmdldCIKLSAgICAgICAgZ3JvdXBJY29uPSJpY29ucy9saW5rVGFyZ2V0TmF2aWdhdG9yR3JvdXAuZ2lmIi8+Ci0gICAgPGNoaWxkUmVmZXJlbmNlcwotICAgICAgICBwYXJlbnQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMiIKLSAgICAgICAgY2hpbGQ9Ii8vQGRpYWdyYW0vQGxpbmtzLjAiCi0gICAgICAgIHJlZmVyZW5jZVR5cGU9ImluX3NvdXJjZSIKLSAgICAgICAgZ3JvdXBOYW1lPSJpbmNvbWluZyBsaW5rcyIKLSAgICAgICAgZ3JvdXBJY29uPSJpY29ucy9pbmNvbWluZ0xpbmtzTmF2aWdhdG9yR3JvdXAuZ2lmIi8+Ci0gICAgPGNoaWxkUmVmZXJlbmNlcwotICAgICAgICBwYXJlbnQ9Ii8vQGRpYWdyYW0vQGxpbmtzLjAiCi0gICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0B0b3BMZXZlbE5vZGVzLjAiCi0gICAgICAgIHJlZmVyZW5jZVR5cGU9ImluX3NvdXJjZSIKLSAgICAgICAgZ3JvdXBOYW1lPSJzb3VyY2UiCi0gICAgICAgIGdyb3VwSWNvbj0iaWNvbnMvbGlua1NvdXJjZU5hdmlnYXRvckdyb3VwLmdpZiIvPgotICAgIDxjaGlsZFJlZmVyZW5jZXMKLSAgICAgICAgcGFyZW50PSIvL0BkaWFncmFtL0B0b3BMZXZlbE5vZGVzLjAiCi0gICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BsaW5rcy4wIgotICAgICAgICByZWZlcmVuY2VUeXBlPSJvdXRfdGFyZ2V0IgotICAgICAgICBncm91cE5hbWU9Im91dGdvaW5nIGxpbmtzIgotICAgICAgICBncm91cEljb249Imljb25zL291dGdvaW5nTGlua3NOYXZpZ2F0b3JHcm91cC5naWYiLz4KLSAgICA8Y2hpbGRSZWZlcmVuY2VzCi0gICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AbGlua3MuMCIKLSAgICAgICAgY2hpbGQ9Ii8vQGRpYWdyYW0vQHRvcExldmVsTm9kZXMuMSIKLSAgICAgICAgcmVmZXJlbmNlVHlwZT0iaW5fc291cmNlIgotICAgICAgICBncm91cE5hbWU9InNvdXJjZSIKLSAgICAgICAgZ3JvdXBJY29uPSJpY29ucy9saW5rU291cmNlTmF2aWdhdG9yR3JvdXAuZ2lmIi8+Ci0gICAgPGNoaWxkUmVmZXJlbmNlcwotICAgICAgICBwYXJlbnQ9Ii8vQGRpYWdyYW0vQHRvcExldmVsTm9kZXMuMSIKLSAgICAgICAgY2hpbGQ9Ii8vQGRpYWdyYW0vQGxpbmtzLjAiCi0gICAgICAgIHJlZmVyZW5jZVR5cGU9Im91dF90YXJnZXQiCi0gICAgICAgIGdyb3VwTmFtZT0ib3V0Z29pbmcgbGlua3MiCi0gICAgICAgIGdyb3VwSWNvbj0iaWNvbnMvb3V0Z29pbmdMaW5rc05hdmlnYXRvckdyb3VwLmdpZiIvPgotICAgIDxjaGlsZFJlZmVyZW5jZXMKLSAgICAgICAgcGFyZW50PSIvL0BkaWFncmFtL0BsaW5rcy4wIgotICAgICAgICBjaGlsZD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4wIgotICAgICAgICByZWZlcmVuY2VUeXBlPSJpbl9zb3VyY2UiCi0gICAgICAgIGdyb3VwTmFtZT0ic291cmNlIgotICAgICAgICBncm91cEljb249Imljb25zL2xpbmtTb3VyY2VOYXZpZ2F0b3JHcm91cC5naWYiLz4KLSAgICA8Y2hpbGRSZWZlcmVuY2VzCi0gICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4wIgotICAgICAgICBjaGlsZD0iLy9AZGlhZ3JhbS9AbGlua3MuMCIKLSAgICAgICAgcmVmZXJlbmNlVHlwZT0ib3V0X3RhcmdldCIKLSAgICAgICAgZ3JvdXBOYW1lPSJvdXRnb2luZyBsaW5rcyIKLSAgICAgICAgZ3JvdXBJY29uPSJpY29ucy9vdXRnb2luZ0xpbmtzTmF2aWdhdG9yR3JvdXAuZ2lmIi8+Ci0gICAgPGNoaWxkUmVmZXJlbmNlcwotICAgICAgICBwYXJlbnQ9Ii8vQGRpYWdyYW0vQGxpbmtzLjAiCi0gICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjEiCi0gICAgICAgIHJlZmVyZW5jZVR5cGU9ImluX3NvdXJjZSIKLSAgICAgICAgZ3JvdXBOYW1lPSJzb3VyY2UiCi0gICAgICAgIGdyb3VwSWNvbj0iaWNvbnMvbGlua1NvdXJjZU5hdmlnYXRvckdyb3VwLmdpZiIvPgotICAgIDxjaGlsZFJlZmVyZW5jZXMKLSAgICAgICAgcGFyZW50PSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjEiCi0gICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BsaW5rcy4wIgotICAgICAgICByZWZlcmVuY2VUeXBlPSJvdXRfdGFyZ2V0IgotICAgICAgICBncm91cE5hbWU9Im91dGdvaW5nIGxpbmtzIgotICAgICAgICBncm91cEljb249Imljb25zL291dGdvaW5nTGlua3NOYXZpZ2F0b3JHcm91cC5naWYiLz4KLSAgICA8Y2hpbGRSZWZlcmVuY2VzCi0gICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AbGlua3MuMCIKLSAgICAgICAgY2hpbGQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMiIKLSAgICAgICAgcmVmZXJlbmNlVHlwZT0iaW5fc291cmNlIgotICAgICAgICBncm91cE5hbWU9InNvdXJjZSIKLSAgICAgICAgZ3JvdXBJY29uPSJpY29ucy9saW5rU291cmNlTmF2aWdhdG9yR3JvdXAuZ2lmIi8+Ci0gICAgPGNoaWxkUmVmZXJlbmNlcwotICAgICAgICBwYXJlbnQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMiIKLSAgICAgICAgY2hpbGQ9Ii8vQGRpYWdyYW0vQGxpbmtzLjAiCi0gICAgICAgIHJlZmVyZW5jZVR5cGU9Im91dF90YXJnZXQiCi0gICAgICAgIGdyb3VwTmFtZT0ib3V0Z29pbmcgbGlua3MiCi0gICAgICAgIGdyb3VwSWNvbj0iaWNvbnMvb3V0Z29pbmdMaW5rc05hdmlnYXRvckdyb3VwLmdpZiIvPgotICA8L25hdmlnYXRvcj4KLSAgPHByb3BlcnR5U2hlZXQ+Ci0gICAgPHRhYnMKLSAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpHZW5TdGFuZGFyZFByb3BlcnR5VGFiIgotICAgICAgICBpRD0iYXBwZWFyYW5jZSIvPgotICAgIDx0YWJzCi0gICAgICAgIHhzaTp0eXBlPSJnbWZnZW46R2VuU3RhbmRhcmRQcm9wZXJ0eVRhYiIKLSAgICAgICAgaUQ9ImRpYWdyYW0iLz4KLSAgICA8dGFicwotICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOkdlbkN1c3RvbVByb3BlcnR5VGFiIgotICAgICAgICBpRD0iZG9tYWluIgotICAgICAgICBsYWJlbD0iQ29yZSI+Ci0gICAgICA8ZmlsdGVyCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpUeXBlVGFiRmlsdGVyIj4KLSAgICAgICAgPHR5cGVzPm9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc8L3R5cGVzPgotICAgICAgICA8dHlwZXM+b3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0PC90eXBlcz4KLSAgICAgICAgPGdlbmVyYXRlZFR5cGVzPmFic3RyYWN0TmF2aWdhdG9ySXRlbTwvZ2VuZXJhdGVkVHlwZXM+Ci0gICAgICA8L2ZpbHRlcj4KLSAgICA8L3RhYnM+Ci0gIDwvcHJvcGVydHlTaGVldD4KLSAgPGRvbWFpbkdlbk1vZGVsCi0gICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmdlbm1vZGVsIy8iLz4KLTwvZ21mZ2VuOkdlbkVkaXRvckdlbmVyYXRvcj4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9tb2RlbC9hZGQyLmdtZm1hcCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9tb2RlbC9hZGQyLmdtZm1hcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODRjZjc2MS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvbW9kZWwvYWRkMi5nbWZtYXAKKysrIC9kZXYvbnVsbApAQCAtMSwxMzcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxnbWZtYXA6TWFwcGluZyB4bWk6dmVyc2lvbj0iMi4wIgotICAgIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIKLSAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICAgIHhtbG5zOmVjb3JlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIgotICAgIHhtbG5zOmdtZm1hcD0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9nbWYvMjAwNS9tYXBwaW5ncy8yLjAiCi0gICAgeG1sbnM6Z21mdG9vbD0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9nbWYvMjAwNS9Ub29sRGVmaW5pdGlvbiI+Ci0gIDxub2Rlcz4KLSAgICA8Y29udGFpbm1lbnRGZWF0dXJlCi0gICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZWNvcmUjLy9Ob2RlQ29udGFpbmVyL25vZGVzIi8+Ci0gICAgPG93bmVkQ2hpbGQ+Ci0gICAgICA8ZG9tYWluTWV0YUVsZW1lbnQKLSAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmVjb3JlIy8vUm9sZVRhc2tDb21wb3NpdGUiLz4KLSAgICAgIDx0b29sCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZnRvb2w6Q3JlYXRpb25Ub29sIgotICAgICAgICAgIGhyZWY9ImFkZC5nbWZ0b29sIy8vQHBhbGV0dGUvQHRvb2xzLjAvQHRvb2xzLjEiLz4KLSAgICAgIDxkaWFncmFtTm9kZQotICAgICAgICAgIGhyZWY9ImFkZC5nbWZncmFwaCNSb2xlVGFza0NvbXBvc2l0ZSIvPgotICAgICAgPGNoaWxkcmVuPgotICAgICAgICA8Y29udGFpbm1lbnRGZWF0dXJlCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmVjb3JlIy8vTm9kZUNvbnRhaW5lci9ub2RlcyIvPgotICAgICAgICA8b3duZWRDaGlsZD4KLSAgICAgICAgICA8ZG9tYWluTWV0YUVsZW1lbnQKLSAgICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5lY29yZSMvL1JvbGVOb2RlIi8+Ci0gICAgICAgICAgPGxhYmVsTWFwcGluZ3MKLSAgICAgICAgICAgICAgeHNpOnR5cGU9ImdtZm1hcDpGZWF0dXJlTGFiZWxNYXBwaW5nIj4KLSAgICAgICAgICAgIDxkaWFncmFtTGFiZWwKLSAgICAgICAgICAgICAgICBocmVmPSJhZGQuZ21mZ3JhcGgjUm9sZU5vZGVOYW1lIi8+Ci0gICAgICAgICAgICA8ZmVhdHVyZXMKLSAgICAgICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmVjb3JlIy8vTmFtZWROb2RlL25hbWUiLz4KLSAgICAgICAgICA8L2xhYmVsTWFwcGluZ3M+Ci0gICAgICAgICAgPHRvb2wKLSAgICAgICAgICAgICAgeHNpOnR5cGU9ImdtZnRvb2w6Q3JlYXRpb25Ub29sIgotICAgICAgICAgICAgICBocmVmPSJhZGQuZ21mdG9vbCMvL0BwYWxldHRlL0B0b29scy4wL0B0b29scy4wIi8+Ci0gICAgICAgICAgPGRpYWdyYW1Ob2RlCi0gICAgICAgICAgICAgIGhyZWY9ImFkZC5nbWZncmFwaCNSb2xlTm9kZSIvPgotICAgICAgICA8L293bmVkQ2hpbGQ+Ci0gICAgICA8L2NoaWxkcmVuPgotICAgICAgPGNoaWxkcmVuPgotICAgICAgICA8Y29udGFpbm1lbnRGZWF0dXJlCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmVjb3JlIy8vTm9kZUNvbnRhaW5lci9ub2RlcyIvPgotICAgICAgICA8b3duZWRDaGlsZD4KLSAgICAgICAgICA8ZG9tYWluTWV0YUVsZW1lbnQKLSAgICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5lY29yZSMvL1Rhc2tOb2RlIi8+Ci0gICAgICAgICAgPGxhYmVsTWFwcGluZ3MKLSAgICAgICAgICAgICAgeHNpOnR5cGU9ImdtZm1hcDpGZWF0dXJlTGFiZWxNYXBwaW5nIj4KLSAgICAgICAgICAgIDxkaWFncmFtTGFiZWwKLSAgICAgICAgICAgICAgICBocmVmPSJhZGQuZ21mZ3JhcGgjVGFza05vZGVOYW1lIi8+Ci0gICAgICAgICAgICA8ZmVhdHVyZXMKLSAgICAgICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmVjb3JlIy8vTmFtZWROb2RlL25hbWUiLz4KLSAgICAgICAgICA8L2xhYmVsTWFwcGluZ3M+Ci0gICAgICAgICAgPHRvb2wKLSAgICAgICAgICAgICAgeHNpOnR5cGU9ImdtZnRvb2w6Q3JlYXRpb25Ub29sIgotICAgICAgICAgICAgICBocmVmPSJhZGQuZ21mdG9vbCMvL0BwYWxldHRlL0B0b29scy4wL0B0b29scy4yIi8+Ci0gICAgICAgICAgPGRpYWdyYW1Ob2RlCi0gICAgICAgICAgICAgIGhyZWY9ImFkZC5nbWZncmFwaCNUYXNrTm9kZSIvPgotICAgICAgICA8L293bmVkQ2hpbGQ+Ci0gICAgICA8L2NoaWxkcmVuPgotICAgICAgPGNvbXBhcnRtZW50cz4KLSAgICAgICAgPGNvbXBhcnRtZW50Ci0gICAgICAgICAgICBocmVmPSJhZGQuZ21mZ3JhcGgjUm9sZVRhc2tDb21wYXJ0bWVudCIvPgotICAgICAgPC9jb21wYXJ0bWVudHM+Ci0gICAgPC9vd25lZENoaWxkPgotICA8L25vZGVzPgotICA8bm9kZXM+Ci0gICAgPGNvbnRhaW5tZW50RmVhdHVyZQotICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmVjb3JlIy8vTm9kZUNvbnRhaW5lci9ub2RlcyIvPgotICAgIDxvd25lZENoaWxkPgotICAgICAgPGRvbWFpbk1ldGFFbGVtZW50Ci0gICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5lY29yZSMvL1dvcmtQcm9kdWN0Q29tcG9zaXRlIi8+Ci0gICAgICA8dG9vbAotICAgICAgICAgIHhzaTp0eXBlPSJnbWZ0b29sOkNyZWF0aW9uVG9vbCIKLSAgICAgICAgICBocmVmPSJhZGQuZ21mdG9vbCMvL0BwYWxldHRlL0B0b29scy4wL0B0b29scy40Ii8+Ci0gICAgICA8ZGlhZ3JhbU5vZGUKLSAgICAgICAgICBocmVmPSJhZGQuZ21mZ3JhcGgjV29ya1Byb2R1Y3RDb21wb3NpdGUiLz4KLSAgICAgIDxjaGlsZHJlbj4KLSAgICAgICAgPGNvbnRhaW5tZW50RmVhdHVyZQotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5lY29yZSMvL05vZGVDb250YWluZXIvbm9kZXMiLz4KLSAgICAgICAgPG93bmVkQ2hpbGQ+Ci0gICAgICAgICAgPGRvbWFpbk1ldGFFbGVtZW50Ci0gICAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZWNvcmUjLy9Xb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlIi8+Ci0gICAgICAgICAgPGxhYmVsTWFwcGluZ3MKLSAgICAgICAgICAgICAgeHNpOnR5cGU9ImdtZm1hcDpGZWF0dXJlTGFiZWxNYXBwaW5nIj4KLSAgICAgICAgICAgIDxkaWFncmFtTGFiZWwKLSAgICAgICAgICAgICAgICBocmVmPSJhZGQuZ21mZ3JhcGgjV29ya1Byb2R1Y3ROb2RlTmFtZSIvPgotICAgICAgICAgICAgPGZlYXR1cmVzCi0gICAgICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5lY29yZSMvL05hbWVkTm9kZS9uYW1lIi8+Ci0gICAgICAgICAgPC9sYWJlbE1hcHBpbmdzPgotICAgICAgICAgIDx0b29sCi0gICAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZ0b29sOkNyZWF0aW9uVG9vbCIKLSAgICAgICAgICAgICAgaHJlZj0iYWRkLmdtZnRvb2wjLy9AcGFsZXR0ZS9AdG9vbHMuMC9AdG9vbHMuMyIvPgotICAgICAgICAgIDxkaWFncmFtTm9kZQotICAgICAgICAgICAgICBocmVmPSJhZGQuZ21mZ3JhcGgjV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZSIvPgotICAgICAgICA8L293bmVkQ2hpbGQ+Ci0gICAgICA8L2NoaWxkcmVuPgotICAgICAgPGNvbXBhcnRtZW50cz4KLSAgICAgICAgPGNvbXBhcnRtZW50Ci0gICAgICAgICAgICBocmVmPSJhZGQuZ21mZ3JhcGgjV29ya1Byb2R1Y3RDb21wYXJ0bWVudCIvPgotICAgICAgPC9jb21wYXJ0bWVudHM+Ci0gICAgPC9vd25lZENoaWxkPgotICA8L25vZGVzPgotICA8bGlua3M+Ci0gICAgPGRvbWFpbk1ldGFFbGVtZW50Ci0gICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZWNvcmUjLy9MaW5rIi8+Ci0gICAgPGxhYmVsTWFwcGluZ3MKLSAgICAgICAgeHNpOnR5cGU9ImdtZm1hcDpGZWF0dXJlTGFiZWxNYXBwaW5nIgotICAgICAgICBlZGl0UGF0dGVybj0iIj4KLSAgICAgIDxkaWFncmFtTGFiZWwKLSAgICAgICAgICBocmVmPSJhZGQuZ21mZ3JhcGgjTGlua05hbWVMYWJlbCIvPgotICAgICAgPGZlYXR1cmVzCi0gICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5lY29yZSMvL0xpbmsvbmFtZSIvPgotICAgIDwvbGFiZWxNYXBwaW5ncz4KLSAgICA8Y29udGFpbm1lbnRGZWF0dXJlCi0gICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZWNvcmUjLy9Ob2RlL291dGdvaW5nQ29ubmVjdGlvbnMiLz4KLSAgICA8dG9vbAotICAgICAgICB4c2k6dHlwZT0iZ21mdG9vbDpDcmVhdGlvblRvb2wiCi0gICAgICAgIGhyZWY9ImFkZC5nbWZ0b29sIy8vQHBhbGV0dGUvQHRvb2xzLjEvQHRvb2xzLjAiLz4KLSAgICA8ZGlhZ3JhbUxpbmsKLSAgICAgICAgaHJlZj0iYWRkLmdtZmdyYXBoI0xpbmsiLz4KLSAgICA8c291cmNlTWV0YUZlYXR1cmUKLSAgICAgICAgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiCi0gICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZWNvcmUjLy9MaW5rL3NvdXJjZSIvPgotICAgIDxsaW5rTWV0YUZlYXR1cmUKLSAgICAgICAgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiCi0gICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZWNvcmUjLy9MaW5rL3RhcmdldCIvPgotICA8L2xpbmtzPgotICA8ZGlhZ3JhbT4KLSAgICA8ZGlhZ3JhbUNhbnZhcwotICAgICAgICBocmVmPSJhZGQuZ21mZ3JhcGgjbW9kZWwiLz4KLSAgICA8ZG9tYWluTW9kZWwKLSAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5lY29yZSMvIi8+Ci0gICAgPGRvbWFpbk1ldGFFbGVtZW50Ci0gICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZWNvcmUjLy9BY3Rpdml0eURldGFpbERpYWdyYW0iLz4KLSAgICA8cGFsZXR0ZQotICAgICAgICBocmVmPSJhZGQuZ21mdG9vbCMvL0BwYWxldHRlIi8+Ci0gIDwvZGlhZ3JhbT4KLTwvZ21mbWFwOk1hcHBpbmc+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvbW9kZWwvYWRkMy5nbWZnZW4gYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvbW9kZWwvYWRkMy5nbWZnZW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3MWUzNjEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL21vZGVsL2FkZDMuZ21mZ2VuCisrKyAvZGV2L251bGwKQEAgLTEsNDAyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Z21mZ2VuOkdlbkVkaXRvckdlbmVyYXRvciB4bWk6dmVyc2lvbj0iMi4wIgotICAgIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIKLSAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICAgIHhtbG5zOmdtZmdlbj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9nbWYvMjAwNS9HZW5Nb2RlbC8yLjAiIHBhY2thZ2VOYW1lUHJlZml4PSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQiCi0gICAgbW9kZWxJRD0iQUREIgotICAgIHNhbWVGaWxlRm9yRGlhZ3JhbUFuZE1vZGVsPSJ0cnVlIgotICAgIGRpYWdyYW1GaWxlRXh0ZW5zaW9uPSJ4bWkiCi0gICAgdGVtcGxhdGVEaXJlY3Rvcnk9IiI+Ci0gIDxkaWFncmFtCi0gICAgICB2aXN1YWxJRD0iNzkiCi0gICAgICBlZGl0UGFydENsYXNzTmFtZT0iQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdFBhcnQiCi0gICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJBY3Rpdml0eURldGFpbERpYWdyYW1JdGVtU2VtYW50aWNFZGl0UG9saWN5IgotICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iQWN0aXZpdHlEZXRhaWxEaWFncmFtVmlld0ZhY3RvcnkiCi0gICAgICBjYW5vbmljYWxFZGl0UG9saWN5Q2xhc3NOYW1lPSJBY3Rpdml0eURldGFpbERpYWdyYW1DYW5vbmljYWxFZGl0UG9saWN5IgotICAgICAgaWNvblByb3ZpZGVyUHJpb3JpdHk9IkxvdyI+Ci0gICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MKLSAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vRGlhZ3JhbSIvPgotICAgIDxlbGVtZW50VHlwZQotICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOk1ldGFtb2RlbFR5cGUiCi0gICAgICAgIGVkaXRIZWxwZXJDbGFzc05hbWU9IkFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRIZWxwZXIiLz4KLSAgICA8dmlld21hcAotICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOkZpZ3VyZVZpZXdtYXAiCi0gICAgICAgIGZpZ3VyZVF1YWxpZmllZENsYXNzTmFtZT0ib3JnLmVjbGlwc2UuZHJhdzJkLkZyZWVmb3JtTGF5ZXIiLz4KLSAgICA8ZG9tYWluRGlhZ3JhbUVsZW1lbnQKLSAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5nZW5tb2RlbCMvL21vZGVsL0FjdGl2aXR5RGV0YWlsRGlhZ3JhbSIvPgotICAgIDxjaGlsZE5vZGVzCi0gICAgICAgIHZpc3VhbElEPSIyMDAxIgotICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iUm9sZU5vZGVFZGl0UGFydCIKLSAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iUm9sZU5vZGVJdGVtU2VtYW50aWNFZGl0UG9saWN5IgotICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJSb2xlTm9kZVZpZXdGYWN0b3J5IgotICAgICAgICBjYW5vbmljYWxFZGl0UG9saWN5Q2xhc3NOYW1lPSJSb2xlTm9kZUNhbm9uaWNhbEVkaXRQb2xpY3kiCi0gICAgICAgIGdyYXBoaWNhbE5vZGVFZGl0UG9saWN5Q2xhc3NOYW1lPSJSb2xlTm9kZUdyYXBoaWNhbE5vZGVFZGl0UG9saWN5IgotICAgICAgICBjb250YWluZXJzPSIvL0BkaWFncmFtL0B0b3BMZXZlbE5vZGVzLjAiPgotICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MKLSAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+Ci0gICAgICA8ZWxlbWVudFR5cGUKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOk1ldGFtb2RlbFR5cGUiCi0gICAgICAgICAgZWRpdEhlbHBlckNsYXNzTmFtZT0iUm9sZU5vZGVFZGl0SGVscGVyIi8+Ci0gICAgICA8dmlld21hcAotICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46SW5uZXJDbGFzc1ZpZXdtYXAiCi0gICAgICAgICAgY2xhc3NOYW1lPSJSb2xlTm9kZUZpZ3VyZSIKLSAgICAgICAgICBjbGFzc0JvZHk9IiYjeEQ7JiN4QTsmI3hEOyYjeEE7LyoqJiN4RDsmI3hBOyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7ICovJiN4RDsmI3hBO3B1YmxpYyBjbGFzcyBSb2xlTm9kZUZpZ3VyZSBleHRlbmRzIG9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmUgeyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHVibGljIFJvbGVOb2RlRmlndXJlKCkgeyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3g5O3RoaXMuc2V0T3V0bGluZShmYWxzZSk7JiN4RDsmI3hBOyYjeDk7JiN4OTt0aGlzLnNldEJhY2tncm91bmRDb2xvcihST0xFTk9ERUZJR1VSRV9CQUNLJiN4RDsmI3hBOyYjeEQ7JiN4QTspOyYjeEQ7JiN4QTsmI3g5OyYjeDk7Y3JlYXRlQ29udGVudHMoKTsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbnRlbnRzKCl7JiN4RDsmI3hBOyYjeDk7JiN4OTtvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZmlnXzAgPSBuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsKCk7JiN4RDsmI3hBO2ZpZ18wLnNldFRleHQoJnF1b3Q7Jmx0Oy4uLj4mcXVvdDspOyYjeEQ7JiN4QTsmI3g5OyYjeDk7ZmlnXzAuc2V0Rm9udCgmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeDk7Uk9MRU5PREVOQU1FRklHVVJFX0ZPTlQpOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5OyYjeDk7c2V0RmlndXJlUm9sZU5vZGVOYW1lRmlndXJlKGZpZ18wKTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeDk7T2JqZWN0IGxheURhdGEwID0gbnVsbDsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7JiN4OTt0aGlzLmFkZChmaWdfMCwgbGF5RGF0YTApOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCBmUm9sZU5vZGVOYW1lRmlndXJlOyAmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3B1YmxpYyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZ2V0RmlndXJlUm9sZU5vZGVOYW1lRmlndXJlKCkgeyYjeEQ7JiN4QTsmI3g5OyYjeDk7cmV0dXJuIGZSb2xlTm9kZU5hbWVGaWd1cmU7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIHZvaWQgc2V0RmlndXJlUm9sZU5vZGVOYW1lRmlndXJlKG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCBmaWcpeyYjeEQ7JiN4QTsmI3g5OyYjeDk7ZlJvbGVOb2RlTmFtZUZpZ3VyZSA9IGZpZzsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIGJvb2xlYW4gbXlVc2VMb2NhbENvb3JkaW5hdGVzID0gZmFsc2U7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcm90ZWN0ZWQgYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKCkgeyYjeEQ7JiN4QTsmI3g5OyYjeDk7cmV0dXJuIG15VXNlTG9jYWxDb29yZGluYXRlczsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcm90ZWN0ZWQgdm9pZCBzZXRVc2VMb2NhbENvb3JkaW5hdGVzKGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcykgeyYjeEQ7JiN4QTsmI3g5OyYjeDk7bXlVc2VMb2NhbENvb3JkaW5hdGVzID0gdXNlTG9jYWxDb29yZGluYXRlczsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeEQ7JiN4QTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3B1YmxpYyBzdGF0aWMgZmluYWwgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yIFJPTEVOT0RFRklHVVJFX0JBQ0sgPSBuZXcgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yKG51bGwsIDI1NSwgMjU1LCAxNTYpOyYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwdWJsaWMgc3RhdGljIGZpbmFsIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250IFJPTEVOT0RFTkFNRUZJR1VSRV9GT05UID0gbmV3IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250KG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXkuZ2V0Q3VycmVudCgpLCAmcXVvdDtBcmlhbCZxdW90OywgOCwgb3JnLmVjbGlwc2Uuc3d0LlNXVC5OT1JNQUwpOyYjeEQ7JiN4QTsiPgotICAgICAgICA8YXR0cmlidXRlcwotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpTdHlsZUF0dHJpYnV0ZXMiCi0gICAgICAgICAgICBmaXhlZEJhY2tncm91bmQ9InRydWUiLz4KLSAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmRyYXcyZDwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWk8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgPC92aWV3bWFwPgotICAgICAgPG1vZGVsRmFjZXQ+Ci0gICAgICAgIDxtZXRhQ2xhc3MKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZ2VubW9kZWwjLy9tb2RlbC9Sb2xlTm9kZSIvPgotICAgICAgICA8Y29udGFpbm1lbnRNZXRhRmVhdHVyZQotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5nZW5tb2RlbCMvL21vZGVsL05vZGVDb250YWluZXIvbm9kZXMiLz4KLSAgICAgICAgPGNoaWxkTWV0YUZlYXR1cmUKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZ2VubW9kZWwjLy9tb2RlbC9Ob2RlQ29udGFpbmVyL25vZGVzIi8+Ci0gICAgICA8L21vZGVsRmFjZXQ+Ci0gICAgICA8bGFiZWxzCi0gICAgICAgICAgdmlzdWFsSUQ9IjQwMDEiCi0gICAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9IlJvbGVOb2RlTmFtZUVkaXRQYXJ0IgotICAgICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IlJvbGVOb2RlTmFtZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiCi0gICAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iUm9sZU5vZGVOYW1lVmlld0ZhY3RvcnkiPgotICAgICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcwotICAgICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vTm9kZSIvPgotICAgICAgICA8dmlld21hcAotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpQYXJlbnRBc3NpZ25lZFZpZXdtYXAiCi0gICAgICAgICAgICBnZXR0ZXJOYW1lPSJnZXRGaWd1cmVSb2xlTm9kZU5hbWVGaWd1cmUiCi0gICAgICAgICAgICBmaWd1cmVRdWFsaWZpZWRDbGFzc05hbWU9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCI+Ci0gICAgICAgICAgPGF0dHJpYnV0ZXMKLSAgICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpTdHlsZUF0dHJpYnV0ZXMiCi0gICAgICAgICAgICAgIGZpeGVkRm9udD0idHJ1ZSIvPgotICAgICAgICA8L3ZpZXdtYXA+Ci0gICAgICAgIDxtb2RlbEZhY2V0Ci0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOkZlYXR1cmVMYWJlbE1vZGVsRmFjZXQiPgotICAgICAgICAgIDxtZXRhRmVhdHVyZXMKLSAgICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5nZW5tb2RlbCMvL21vZGVsL05hbWVkTm9kZS9uYW1lIi8+Ci0gICAgICAgIDwvbW9kZWxGYWNldD4KLSAgICAgIDwvbGFiZWxzPgotICAgIDwvY2hpbGROb2Rlcz4KLSAgICA8Y2hpbGROb2RlcwotICAgICAgICB2aXN1YWxJRD0iMjAwMiIKLSAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9IlRhc2tOb2RlRWRpdFBhcnQiCi0gICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IlRhc2tOb2RlSXRlbVNlbWFudGljRWRpdFBvbGljeSIKLSAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iVGFza05vZGVWaWV3RmFjdG9yeSIKLSAgICAgICAgY2Fub25pY2FsRWRpdFBvbGljeUNsYXNzTmFtZT0iVGFza05vZGVDYW5vbmljYWxFZGl0UG9saWN5IgotICAgICAgICBncmFwaGljYWxOb2RlRWRpdFBvbGljeUNsYXNzTmFtZT0iVGFza05vZGVHcmFwaGljYWxOb2RlRWRpdFBvbGljeSIKLSAgICAgICAgY29udGFpbmVycz0iLy9AZGlhZ3JhbS9AdG9wTGV2ZWxOb2Rlcy4wIj4KLSAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzCi0gICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vTm9kZSIvPgotICAgICAgPGVsZW1lbnRUeXBlCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpNZXRhbW9kZWxUeXBlIgotICAgICAgICAgIGVkaXRIZWxwZXJDbGFzc05hbWU9IlRhc2tOb2RlRWRpdEhlbHBlciIvPgotICAgICAgPHZpZXdtYXAKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOklubmVyQ2xhc3NWaWV3bWFwIgotICAgICAgICAgIGNsYXNzTmFtZT0iVGFza05vZGVGaWd1cmUiCi0gICAgICAgICAgY2xhc3NCb2R5PSImI3hEOyYjeEE7JiN4RDsmI3hBOy8qKiYjeEQ7JiN4QTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyAqLyYjeEQ7JiN4QTtwdWJsaWMgY2xhc3MgVGFza05vZGVGaWd1cmUgZXh0ZW5kcyBvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlIHsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3B1YmxpYyBUYXNrTm9kZUZpZ3VyZSgpIHsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4OTt0aGlzLnNldE91dGxpbmUoZmFsc2UpOyYjeEQ7JiN4QTsmI3g5OyYjeDk7dGhpcy5zZXRMaW5lV2lkdGgoMCk7JiN4RDsmI3hBOyYjeDk7JiN4OTt0aGlzLnNldEJhY2tncm91bmRDb2xvcihUQVNLTk9ERUZJR1VSRV9CQUNLJiN4RDsmI3hBOyYjeEQ7JiN4QTspOyYjeEQ7JiN4QTsmI3g5OyYjeDk7Y3JlYXRlQ29udGVudHMoKTsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbnRlbnRzKCl7JiN4RDsmI3hBOyYjeDk7JiN4OTtvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZmlnXzAgPSBuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsKCk7JiN4RDsmI3hBO2ZpZ18wLnNldFRleHQoJnF1b3Q7Jmx0Oy4uLj4mcXVvdDspOyYjeEQ7JiN4QTsmI3g5OyYjeDk7ZmlnXzAuc2V0Rm9udCgmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeDk7VEFTS05PREVOQU1FRklHVVJFX0ZPTlQpOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5OyYjeDk7c2V0RmlndXJlVGFza05vZGVOYW1lRmlndXJlKGZpZ18wKTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeDk7T2JqZWN0IGxheURhdGEwID0gbnVsbDsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7JiN4OTt0aGlzLmFkZChmaWdfMCwgbGF5RGF0YTApOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCBmVGFza05vZGVOYW1lRmlndXJlOyAmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3B1YmxpYyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZ2V0RmlndXJlVGFza05vZGVOYW1lRmlndXJlKCkgeyYjeEQ7JiN4QTsmI3g5OyYjeDk7cmV0dXJuIGZUYXNrTm9kZU5hbWVGaWd1cmU7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIHZvaWQgc2V0RmlndXJlVGFza05vZGVOYW1lRmlndXJlKG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCBmaWcpeyYjeEQ7JiN4QTsmI3g5OyYjeDk7ZlRhc2tOb2RlTmFtZUZpZ3VyZSA9IGZpZzsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIGJvb2xlYW4gbXlVc2VMb2NhbENvb3JkaW5hdGVzID0gZmFsc2U7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcm90ZWN0ZWQgYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKCkgeyYjeEQ7JiN4QTsmI3g5OyYjeDk7cmV0dXJuIG15VXNlTG9jYWxDb29yZGluYXRlczsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcm90ZWN0ZWQgdm9pZCBzZXRVc2VMb2NhbENvb3JkaW5hdGVzKGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcykgeyYjeEQ7JiN4QTsmI3g5OyYjeDk7bXlVc2VMb2NhbENvb3JkaW5hdGVzID0gdXNlTG9jYWxDb29yZGluYXRlczsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeEQ7JiN4QTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3B1YmxpYyBzdGF0aWMgZmluYWwgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnQgVEFTS05PREVOQU1FRklHVVJFX0ZPTlQgPSBuZXcgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnQob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheS5nZXRDdXJyZW50KCksICZxdW90O0FyaWFsJnF1b3Q7LCA4LCBvcmcuZWNsaXBzZS5zd3QuU1dULk5PUk1BTCk7JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3B1YmxpYyBzdGF0aWMgZmluYWwgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yIFRBU0tOT0RFRklHVVJFX0JBQ0sgPSBuZXcgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yKG51bGwsIDI1NSwgMjU1LCAxNTYpOyYjeEQ7JiN4QTsiPgotICAgICAgICA8YXR0cmlidXRlcwotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpTdHlsZUF0dHJpYnV0ZXMiCi0gICAgICAgICAgICBmaXhlZEJhY2tncm91bmQ9InRydWUiLz4KLSAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmRyYXcyZDwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWk8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgPC92aWV3bWFwPgotICAgICAgPG1vZGVsRmFjZXQ+Ci0gICAgICAgIDxtZXRhQ2xhc3MKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZ2VubW9kZWwjLy9tb2RlbC9UYXNrTm9kZSIvPgotICAgICAgICA8Y29udGFpbm1lbnRNZXRhRmVhdHVyZQotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5nZW5tb2RlbCMvL21vZGVsL05vZGVDb250YWluZXIvbm9kZXMiLz4KLSAgICAgICAgPGNoaWxkTWV0YUZlYXR1cmUKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZ2VubW9kZWwjLy9tb2RlbC9Ob2RlQ29udGFpbmVyL25vZGVzIi8+Ci0gICAgICA8L21vZGVsRmFjZXQ+Ci0gICAgICA8bGFiZWxzCi0gICAgICAgICAgdmlzdWFsSUQ9IjQwMDIiCi0gICAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9IlRhc2tOb2RlTmFtZUVkaXRQYXJ0IgotICAgICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IlRhc2tOb2RlTmFtZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiCi0gICAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iVGFza05vZGVOYW1lVmlld0ZhY3RvcnkiPgotICAgICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcwotICAgICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vTm9kZSIvPgotICAgICAgICA8dmlld21hcAotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpQYXJlbnRBc3NpZ25lZFZpZXdtYXAiCi0gICAgICAgICAgICBnZXR0ZXJOYW1lPSJnZXRGaWd1cmVUYXNrTm9kZU5hbWVGaWd1cmUiCi0gICAgICAgICAgICBmaWd1cmVRdWFsaWZpZWRDbGFzc05hbWU9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCI+Ci0gICAgICAgICAgPGF0dHJpYnV0ZXMKLSAgICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpTdHlsZUF0dHJpYnV0ZXMiCi0gICAgICAgICAgICAgIGZpeGVkRm9udD0idHJ1ZSIvPgotICAgICAgICA8L3ZpZXdtYXA+Ci0gICAgICAgIDxtb2RlbEZhY2V0Ci0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOkZlYXR1cmVMYWJlbE1vZGVsRmFjZXQiPgotICAgICAgICAgIDxtZXRhRmVhdHVyZXMKLSAgICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5nZW5tb2RlbCMvL21vZGVsL05hbWVkTm9kZS9uYW1lIi8+Ci0gICAgICAgIDwvbW9kZWxGYWNldD4KLSAgICAgIDwvbGFiZWxzPgotICAgIDwvY2hpbGROb2Rlcz4KLSAgICA8Y2hpbGROb2RlcwotICAgICAgICB2aXN1YWxJRD0iMjAwMyIKLSAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9IldvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVFZGl0UGFydCIKLSAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiCi0gICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9IldvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVWaWV3RmFjdG9yeSIKLSAgICAgICAgY2Fub25pY2FsRWRpdFBvbGljeUNsYXNzTmFtZT0iV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZUNhbm9uaWNhbEVkaXRQb2xpY3kiCi0gICAgICAgIGdyYXBoaWNhbE5vZGVFZGl0UG9saWN5Q2xhc3NOYW1lPSJXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kiCi0gICAgICAgIGNvbnRhaW5lcnM9Ii8vQGRpYWdyYW0vQHRvcExldmVsTm9kZXMuMSI+Ci0gICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcwotICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL05vZGUiLz4KLSAgICAgIDxlbGVtZW50VHlwZQotICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46TWV0YW1vZGVsVHlwZSIKLSAgICAgICAgICBlZGl0SGVscGVyQ2xhc3NOYW1lPSJXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlRWRpdEhlbHBlciIvPgotICAgICAgPHZpZXdtYXAKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOklubmVyQ2xhc3NWaWV3bWFwIgotICAgICAgICAgIGNsYXNzTmFtZT0iV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZUZpZ3VyZSIKLSAgICAgICAgICBjbGFzc0JvZHk9IiYjeEQ7JiN4QTsmI3hEOyYjeEE7LyoqJiN4RDsmI3hBOyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7ICovJiN4RDsmI3hBO3B1YmxpYyBjbGFzcyBXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlRmlndXJlIGV4dGVuZHMgb3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZSB7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwdWJsaWMgV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZUZpZ3VyZSgpIHsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4OTt0aGlzLnNldE91dGxpbmUoZmFsc2UpOyYjeEQ7JiN4QTsmI3g5OyYjeDk7dGhpcy5zZXRCYWNrZ3JvdW5kQ29sb3IoV09SS1BST0RVQ1RERVNDUklQVE9STk9ERUZJR1VSRV9CQUNLJiN4RDsmI3hBOyYjeEQ7JiN4QTspOyYjeEQ7JiN4QTsmI3g5OyYjeDk7Y3JlYXRlQ29udGVudHMoKTsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbnRlbnRzKCl7JiN4RDsmI3hBOyYjeDk7JiN4OTtvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZmlnXzAgPSBuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsKCk7JiN4RDsmI3hBO2ZpZ18wLnNldFRleHQoJnF1b3Q7Jmx0Oy4uLj4mcXVvdDspOyYjeEQ7JiN4QTsmI3g5OyYjeDk7ZmlnXzAuc2V0Rm9udCgmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeDk7V09SS1BST0RVQ1ROT0RFTkFNRUZJR1VSRV9GT05UKTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsmI3g5O3NldEZpZ3VyZVdvcmtQcm9kdWN0Tm9kZU5hbWVGaWd1cmUoZmlnXzApOyYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4OTtPYmplY3QgbGF5RGF0YTAgPSBudWxsOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsmI3g5O3RoaXMuYWRkKGZpZ18wLCBsYXlEYXRhMCk7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3ByaXZhdGUgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIGZXb3JrUHJvZHVjdE5vZGVOYW1lRmlndXJlOyAmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3B1YmxpYyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZ2V0RmlndXJlV29ya1Byb2R1Y3ROb2RlTmFtZUZpZ3VyZSgpIHsmI3hEOyYjeEE7JiN4OTsmI3g5O3JldHVybiBmV29ya1Byb2R1Y3ROb2RlTmFtZUZpZ3VyZTsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3ByaXZhdGUgdm9pZCBzZXRGaWd1cmVXb3JrUHJvZHVjdE5vZGVOYW1lRmlndXJlKG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCBmaWcpeyYjeEQ7JiN4QTsmI3g5OyYjeDk7ZldvcmtQcm9kdWN0Tm9kZU5hbWVGaWd1cmUgPSBmaWc7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJpdmF0ZSBib29sZWFuIG15VXNlTG9jYWxDb29yZGluYXRlcyA9IGZhbHNlOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJvdGVjdGVkIGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcygpIHsmI3hEOyYjeEE7JiN4OTsmI3g5O3JldHVybiBteVVzZUxvY2FsQ29vcmRpbmF0ZXM7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJvdGVjdGVkIHZvaWQgc2V0VXNlTG9jYWxDb29yZGluYXRlcyhib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMpIHsmI3hEOyYjeEE7JiN4OTsmI3g5O215VXNlTG9jYWxDb29yZGluYXRlcyA9IHVzZUxvY2FsQ29vcmRpbmF0ZXM7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3hEOyYjeEE7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwdWJsaWMgc3RhdGljIGZpbmFsIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250IFdPUktQUk9EVUNUTk9ERU5BTUVGSUdVUkVfRk9OVCA9IG5ldyBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udChvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5LmdldEN1cnJlbnQoKSwgJnF1b3Q7QXJpYWwmcXVvdDssIDgsIG9yZy5lY2xpcHNlLnN3dC5TV1QuTk9STUFMKTsmI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHVibGljIHN0YXRpYyBmaW5hbCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3IgV09SS1BST0RVQ1RERVNDUklQVE9STk9ERUZJR1VSRV9CQUNLID0gbmV3IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcihudWxsLCAyNTUsIDI1NSwgMjA1KTsmI3hEOyYjeEE7Ij4KLSAgICAgICAgPGF0dHJpYnV0ZXMKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46U3R5bGVBdHRyaWJ1dGVzIgotICAgICAgICAgICAgZml4ZWRCYWNrZ3JvdW5kPSJ0cnVlIi8+Ci0gICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5kcmF3MmQ8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgIDwvdmlld21hcD4KLSAgICAgIDxtb2RlbEZhY2V0PgotICAgICAgICA8bWV0YUNsYXNzCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmdlbm1vZGVsIy8vbW9kZWwvV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZSIvPgotICAgICAgICA8Y29udGFpbm1lbnRNZXRhRmVhdHVyZQotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5nZW5tb2RlbCMvL21vZGVsL05vZGVDb250YWluZXIvbm9kZXMiLz4KLSAgICAgICAgPGNoaWxkTWV0YUZlYXR1cmUKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZ2VubW9kZWwjLy9tb2RlbC9Ob2RlQ29udGFpbmVyL25vZGVzIi8+Ci0gICAgICA8L21vZGVsRmFjZXQ+Ci0gICAgICA8bGFiZWxzCi0gICAgICAgICAgdmlzdWFsSUQ9IjQwMDMiCi0gICAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9IldvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVOYW1lRWRpdFBhcnQiCi0gICAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZU5hbWVJdGVtU2VtYW50aWNFZGl0UG9saWN5IgotICAgICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9IldvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVOYW1lVmlld0ZhY3RvcnkiPgotICAgICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcwotICAgICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vTm9kZSIvPgotICAgICAgICA8dmlld21hcAotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpQYXJlbnRBc3NpZ25lZFZpZXdtYXAiCi0gICAgICAgICAgICBnZXR0ZXJOYW1lPSJnZXRGaWd1cmVXb3JrUHJvZHVjdE5vZGVOYW1lRmlndXJlIgotICAgICAgICAgICAgZmlndXJlUXVhbGlmaWVkQ2xhc3NOYW1lPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwiPgotICAgICAgICAgIDxhdHRyaWJ1dGVzCi0gICAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46U3R5bGVBdHRyaWJ1dGVzIgotICAgICAgICAgICAgICBmaXhlZEZvbnQ9InRydWUiLz4KLSAgICAgICAgPC92aWV3bWFwPgotICAgICAgICA8bW9kZWxGYWNldAotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpGZWF0dXJlTGFiZWxNb2RlbEZhY2V0Ij4KLSAgICAgICAgICA8bWV0YUZlYXR1cmVzCi0gICAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZ2VubW9kZWwjLy9tb2RlbC9OYW1lZE5vZGUvbmFtZSIvPgotICAgICAgICA8L21vZGVsRmFjZXQ+Ci0gICAgICA8L2xhYmVscz4KLSAgICA8L2NoaWxkTm9kZXM+Ci0gICAgPHRvcExldmVsTm9kZXMKLSAgICAgICAgdmlzdWFsSUQ9IjEwMDEiCi0gICAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJSb2xlVGFza0NvbXBvc2l0ZUVkaXRQYXJ0IgotICAgICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJSb2xlVGFza0NvbXBvc2l0ZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiCi0gICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9IlJvbGVUYXNrQ29tcG9zaXRlVmlld0ZhY3RvcnkiCi0gICAgICAgIGNhbm9uaWNhbEVkaXRQb2xpY3lDbGFzc05hbWU9IlJvbGVUYXNrQ29tcG9zaXRlQ2Fub25pY2FsRWRpdFBvbGljeSIKLSAgICAgICAgY2hpbGROb2Rlcz0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4wIC8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMSIKLSAgICAgICAgY29tcGFydG1lbnRzPSIvL0BkaWFncmFtL0Bjb21wYXJ0bWVudHMuMCIKLSAgICAgICAgZ3JhcGhpY2FsTm9kZUVkaXRQb2xpY3lDbGFzc05hbWU9IlJvbGVUYXNrQ29tcG9zaXRlR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kiPgotICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MKLSAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+Ci0gICAgICA8ZWxlbWVudFR5cGUKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOk1ldGFtb2RlbFR5cGUiCi0gICAgICAgICAgZWRpdEhlbHBlckNsYXNzTmFtZT0iUm9sZVRhc2tDb21wb3NpdGVFZGl0SGVscGVyIi8+Ci0gICAgICA8dmlld21hcAotICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46SW5uZXJDbGFzc1ZpZXdtYXAiCi0gICAgICAgICAgbGF5b3V0VHlwZT0iVE9PTEJBUl9MQVlPVVQiCi0gICAgICAgICAgY2xhc3NOYW1lPSJSb2xlVGFza0NvbXBvc2l0ZUZpZ3VyZSIKLSAgICAgICAgICBjbGFzc0JvZHk9IiYjeEQ7JiN4QTsmI3hEOyYjeEE7LyoqJiN4RDsmI3hBOyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7ICovJiN4RDsmI3hBO3B1YmxpYyBjbGFzcyBSb2xlVGFza0NvbXBvc2l0ZUZpZ3VyZSBleHRlbmRzIG9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmUgeyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHVibGljIFJvbGVUYXNrQ29tcG9zaXRlRmlndXJlKCkgeyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3g5O29yZy5lY2xpcHNlLmRyYXcyZC5Ub29sYmFyTGF5b3V0IG15R2VuTGF5b3V0TWFuYWdlciA9IG5ldyBvcmcuZWNsaXBzZS5kcmF3MmQuVG9vbGJhckxheW91dCgpOyYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4OTsmI3g5O215R2VuTGF5b3V0TWFuYWdlci5zZXRTdHJldGNoTWlub3JBeGlzKGZhbHNlKTsmI3hEOyYjeEE7JiN4OTsmI3g5O215R2VuTGF5b3V0TWFuYWdlci5zZXRNaW5vckFsaWdubWVudChvcmcuZWNsaXBzZS5kcmF3MmQuVG9vbGJhckxheW91dC5BTElHTl9DRU5URVIpOyYjeDk7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3g5O215R2VuTGF5b3V0TWFuYWdlci5zZXRTcGFjaW5nKDUpOyYjeEQ7JiN4QTsmI3g5OyYjeDk7bXlHZW5MYXlvdXRNYW5hZ2VyLnNldFZlcnRpY2FsKGZhbHNlKTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeDk7dGhpcy5zZXRMYXlvdXRNYW5hZ2VyKG15R2VuTGF5b3V0TWFuYWdlcik7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4OTt0aGlzLnNldEJhY2tncm91bmRDb2xvcihST0xFVEFTS0NPTVBPU0lURUZJR1VSRV9CQUNLJiN4RDsmI3hBOyYjeEQ7JiN4QTspOyYjeEQ7JiN4QTsmI3g5OyYjeDk7dGhpcy5zZXRCb3JkZXIoJiN4OTsmI3hEOyYjeEE7bmV3IG9yZy5lY2xpcHNlLmRyYXcyZC5NYXJnaW5Cb3JkZXIoZ2V0TWFwTW9kZSgpLkRQdG9MUCgwKSwgZ2V0TWFwTW9kZSgpLkRQdG9MUCgwKSwgZ2V0TWFwTW9kZSgpLkRQdG9MUCgwKSwgZ2V0TWFwTW9kZSgpLkRQdG9MUCgwKSkmI3hEOyYjeEE7KTsmI3hEOyYjeEE7JiN4OTsmI3g5O2NyZWF0ZUNvbnRlbnRzKCk7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3ByaXZhdGUgdm9pZCBjcmVhdGVDb250ZW50cygpeyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJpdmF0ZSBib29sZWFuIG15VXNlTG9jYWxDb29yZGluYXRlcyA9IGZhbHNlOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJvdGVjdGVkIGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcygpIHsmI3hEOyYjeEE7JiN4OTsmI3g5O3JldHVybiBteVVzZUxvY2FsQ29vcmRpbmF0ZXM7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJvdGVjdGVkIHZvaWQgc2V0VXNlTG9jYWxDb29yZGluYXRlcyhib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMpIHsmI3hEOyYjeEE7JiN4OTsmI3g5O215VXNlTG9jYWxDb29yZGluYXRlcyA9IHVzZUxvY2FsQ29vcmRpbmF0ZXM7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3hEOyYjeEE7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwdWJsaWMgc3RhdGljIGZpbmFsIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvciBST0xFVEFTS0NPTVBPU0lURUZJR1VSRV9CQUNLID0gbmV3IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcihudWxsLCAyNTUsIDI1NSwgMTU2KTsmI3hEOyYjeEE7Ij4KLSAgICAgICAgPGF0dHJpYnV0ZXMKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46U3R5bGVBdHRyaWJ1dGVzIgotICAgICAgICAgICAgZml4ZWRCYWNrZ3JvdW5kPSJ0cnVlIi8+Ci0gICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5kcmF3MmQ8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgIDwvdmlld21hcD4KLSAgICAgIDxtb2RlbEZhY2V0PgotICAgICAgICA8bWV0YUNsYXNzCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmdlbm1vZGVsIy8vbW9kZWwvUm9sZVRhc2tDb21wb3NpdGUiLz4KLSAgICAgICAgPGNvbnRhaW5tZW50TWV0YUZlYXR1cmUKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZ2VubW9kZWwjLy9tb2RlbC9Ob2RlQ29udGFpbmVyL25vZGVzIi8+Ci0gICAgICAgIDxjaGlsZE1ldGFGZWF0dXJlCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmdlbm1vZGVsIy8vbW9kZWwvTm9kZUNvbnRhaW5lci9ub2RlcyIvPgotICAgICAgPC9tb2RlbEZhY2V0PgotICAgIDwvdG9wTGV2ZWxOb2Rlcz4KLSAgICA8dG9wTGV2ZWxOb2RlcwotICAgICAgICB2aXN1YWxJRD0iMTAwMiIKLSAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9IldvcmtQcm9kdWN0Q29tcG9zaXRlRWRpdFBhcnQiCi0gICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IldvcmtQcm9kdWN0Q29tcG9zaXRlSXRlbVNlbWFudGljRWRpdFBvbGljeSIKLSAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iV29ya1Byb2R1Y3RDb21wb3NpdGVWaWV3RmFjdG9yeSIKLSAgICAgICAgY2Fub25pY2FsRWRpdFBvbGljeUNsYXNzTmFtZT0iV29ya1Byb2R1Y3RDb21wb3NpdGVDYW5vbmljYWxFZGl0UG9saWN5IgotICAgICAgICBjaGlsZE5vZGVzPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjIiCi0gICAgICAgIGNvbXBhcnRtZW50cz0iLy9AZGlhZ3JhbS9AY29tcGFydG1lbnRzLjEiCi0gICAgICAgIGdyYXBoaWNhbE5vZGVFZGl0UG9saWN5Q2xhc3NOYW1lPSJXb3JrUHJvZHVjdENvbXBvc2l0ZUdyYXBoaWNhbE5vZGVFZGl0UG9saWN5Ij4KLSAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzCi0gICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vTm9kZSIvPgotICAgICAgPGVsZW1lbnRUeXBlCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpNZXRhbW9kZWxUeXBlIgotICAgICAgICAgIGVkaXRIZWxwZXJDbGFzc05hbWU9IldvcmtQcm9kdWN0Q29tcG9zaXRlRWRpdEhlbHBlciIvPgotICAgICAgPHZpZXdtYXAKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOklubmVyQ2xhc3NWaWV3bWFwIgotICAgICAgICAgIGxheW91dFR5cGU9IlRPT0xCQVJfTEFZT1VUIgotICAgICAgICAgIGNsYXNzTmFtZT0iV29ya1Byb2R1Y3RDb21wb3NpdGVGaWd1cmUiCi0gICAgICAgICAgY2xhc3NCb2R5PSImI3hEOyYjeEE7JiN4RDsmI3hBOy8qKiYjeEQ7JiN4QTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyAqLyYjeEQ7JiN4QTtwdWJsaWMgY2xhc3MgV29ya1Byb2R1Y3RDb21wb3NpdGVGaWd1cmUgZXh0ZW5kcyBvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlIHsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3B1YmxpYyBXb3JrUHJvZHVjdENvbXBvc2l0ZUZpZ3VyZSgpIHsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4OTtvcmcuZWNsaXBzZS5kcmF3MmQuVG9vbGJhckxheW91dCBteUdlbkxheW91dE1hbmFnZXIgPSBuZXcgb3JnLmVjbGlwc2UuZHJhdzJkLlRvb2xiYXJMYXlvdXQoKTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeDk7JiN4OTtteUdlbkxheW91dE1hbmFnZXIuc2V0U3RyZXRjaE1pbm9yQXhpcyhmYWxzZSk7JiN4RDsmI3hBOyYjeDk7JiN4OTtteUdlbkxheW91dE1hbmFnZXIuc2V0TWlub3JBbGlnbm1lbnQob3JnLmVjbGlwc2UuZHJhdzJkLlRvb2xiYXJMYXlvdXQuQUxJR05fQ0VOVEVSKTsmI3g5OyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4OTtteUdlbkxheW91dE1hbmFnZXIuc2V0U3BhY2luZyg1KTsmI3hEOyYjeEE7JiN4OTsmI3g5O215R2VuTGF5b3V0TWFuYWdlci5zZXRWZXJ0aWNhbCh0cnVlKTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeDk7dGhpcy5zZXRMYXlvdXRNYW5hZ2VyKG15R2VuTGF5b3V0TWFuYWdlcik7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4OTt0aGlzLnNldEJhY2tncm91bmRDb2xvcihXT1JLUFJPRFVDVENPTVBPU0lURUZJR1VSRV9CQUNLJiN4RDsmI3hBOyYjeEQ7JiN4QTspOyYjeEQ7JiN4QTsmI3g5OyYjeDk7dGhpcy5zZXRCb3JkZXIoJiN4OTsmI3hEOyYjeEE7bmV3IG9yZy5lY2xpcHNlLmRyYXcyZC5NYXJnaW5Cb3JkZXIoZ2V0TWFwTW9kZSgpLkRQdG9MUCgwKSwgZ2V0TWFwTW9kZSgpLkRQdG9MUCgwKSwgZ2V0TWFwTW9kZSgpLkRQdG9MUCgwKSwgZ2V0TWFwTW9kZSgpLkRQdG9MUCgwKSkmI3hEOyYjeEE7KTsmI3hEOyYjeEE7JiN4OTsmI3g5O2NyZWF0ZUNvbnRlbnRzKCk7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3ByaXZhdGUgdm9pZCBjcmVhdGVDb250ZW50cygpeyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJpdmF0ZSBib29sZWFuIG15VXNlTG9jYWxDb29yZGluYXRlcyA9IGZhbHNlOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJvdGVjdGVkIGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcygpIHsmI3hEOyYjeEE7JiN4OTsmI3g5O3JldHVybiBteVVzZUxvY2FsQ29vcmRpbmF0ZXM7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJvdGVjdGVkIHZvaWQgc2V0VXNlTG9jYWxDb29yZGluYXRlcyhib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMpIHsmI3hEOyYjeEE7JiN4OTsmI3g5O215VXNlTG9jYWxDb29yZGluYXRlcyA9IHVzZUxvY2FsQ29vcmRpbmF0ZXM7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3hEOyYjeEE7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwdWJsaWMgc3RhdGljIGZpbmFsIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvciBXT1JLUFJPRFVDVENPTVBPU0lURUZJR1VSRV9CQUNLID0gbmV3IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcihudWxsLCAyNTUsIDI1NSwgMjA1KTsmI3hEOyYjeEE7Ij4KLSAgICAgICAgPGF0dHJpYnV0ZXMKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46U3R5bGVBdHRyaWJ1dGVzIgotICAgICAgICAgICAgZml4ZWRCYWNrZ3JvdW5kPSJ0cnVlIi8+Ci0gICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5kcmF3MmQ8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgIDwvdmlld21hcD4KLSAgICAgIDxtb2RlbEZhY2V0PgotICAgICAgICA8bWV0YUNsYXNzCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmdlbm1vZGVsIy8vbW9kZWwvV29ya1Byb2R1Y3RDb21wb3NpdGUiLz4KLSAgICAgICAgPGNvbnRhaW5tZW50TWV0YUZlYXR1cmUKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZ2VubW9kZWwjLy9tb2RlbC9Ob2RlQ29udGFpbmVyL25vZGVzIi8+Ci0gICAgICAgIDxjaGlsZE1ldGFGZWF0dXJlCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmdlbm1vZGVsIy8vbW9kZWwvTm9kZUNvbnRhaW5lci9ub2RlcyIvPgotICAgICAgPC9tb2RlbEZhY2V0PgotICAgIDwvdG9wTGV2ZWxOb2Rlcz4KLSAgICA8bGlua3MKLSAgICAgICAgdmlzdWFsSUQ9IjMwMDEiCi0gICAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJMaW5rRWRpdFBhcnQiCi0gICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IkxpbmtJdGVtU2VtYW50aWNFZGl0UG9saWN5IgotICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJMaW5rVmlld0ZhY3RvcnkiPgotICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MKLSAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9FZGdlIi8+Ci0gICAgICA8ZWxlbWVudFR5cGUKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOk1ldGFtb2RlbFR5cGUiCi0gICAgICAgICAgZWRpdEhlbHBlckNsYXNzTmFtZT0iTGlua0VkaXRIZWxwZXIiLz4KLSAgICAgIDx2aWV3bWFwCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpJbm5lckNsYXNzVmlld21hcCIKLSAgICAgICAgICBjbGFzc05hbWU9IkxpbmtGaWd1cmUiCi0gICAgICAgICAgY2xhc3NCb2R5PSImI3hEOyYjeEE7JiN4RDsmI3hBOy8qKiYjeEQ7JiN4QTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyAqLyYjeEQ7JiN4QTtwdWJsaWMgY2xhc3MgTGlua0ZpZ3VyZSBleHRlbmRzIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLlBvbHlsaW5lQ29ubmVjdGlvbkV4IHsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3B1YmxpYyBMaW5rRmlndXJlKCkgeyYjeEQ7JiN4QTsmI3g5OyYjeDk7dGhpcy5zZXRGb3JlZ3JvdW5kQ29sb3Iob3JnLmVjbGlwc2UuZHJhdzJkLkNvbG9yQ29uc3RhbnRzLmJsYWNrJiN4RDsmI3hBOyYjeEQ7JiN4QTspOyYjeEQ7JiN4QTsmI3g5OyYjeDk7c2V0VGFyZ2V0RGVjb3JhdGlvbihjcmVhdGVUYXJnZXREZWNvcmF0aW9uKCkpOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIG9yZy5lY2xpcHNlLmRyYXcyZC5Qb2x5bGluZURlY29yYXRpb24gY3JlYXRlVGFyZ2V0RGVjb3JhdGlvbigpIHsmI3hEOyYjeEE7b3JnLmVjbGlwc2UuZHJhdzJkLlBvbHlsaW5lRGVjb3JhdGlvbiBkZiA9IG5ldyBvcmcuZWNsaXBzZS5kcmF3MmQuUG9seWxpbmVEZWNvcmF0aW9uKCk7JiN4RDsmI3hBOy8vIGRpc3BhdGNoTmV4dD8mI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7JiN4OTtvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnRMaXN0IHBsID0gbmV3IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludExpc3QoKTsmI3hEOyYjeEE7JiN4OTsmI3g5O3BsLmFkZFBvaW50KC0xLCAxKTsmI3hEOyYjeEE7JiN4OTsmI3g5O3BsLmFkZFBvaW50KDAsIDApOyYjeEQ7JiN4QTsmI3g5OyYjeDk7cGwuYWRkUG9pbnQoLTEsIC0xKTsmI3hEOyYjeEE7JiN4OTsmI3g5O2RmLnNldFRlbXBsYXRlKHBsKTsmI3hEOyYjeEE7JiN4OTsmI3g5O2RmLnNldFNjYWxlKGdldE1hcE1vZGUoKS5EUHRvTFAoNyksIGdldE1hcE1vZGUoKS5EUHRvTFAoMykpOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsmI3g5O3JldHVybiBkZjsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeEQ7JiN4QTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyI+Ci0gICAgICAgIDxhdHRyaWJ1dGVzCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlN0eWxlQXR0cmlidXRlcyIKLSAgICAgICAgICAgIGZpeGVkRm9yZWdyb3VuZD0idHJ1ZSIvPgotICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZHJhdzJkPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aTwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICA8L3ZpZXdtYXA+Ci0gICAgICA8bW9kZWxGYWNldAotICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46VHlwZUxpbmtNb2RlbEZhY2V0Ij4KLSAgICAgICAgPG1ldGFDbGFzcwotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5nZW5tb2RlbCMvL21vZGVsL0xpbmsiLz4KLSAgICAgICAgPGNvbnRhaW5tZW50TWV0YUZlYXR1cmUKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZ2VubW9kZWwjLy9tb2RlbC9Ob2RlL291dGdvaW5nQ29ubmVjdGlvbnMiLz4KLSAgICAgICAgPGNoaWxkTWV0YUZlYXR1cmUKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZ2VubW9kZWwjLy9tb2RlbC9Ob2RlL291dGdvaW5nQ29ubmVjdGlvbnMiLz4KLSAgICAgICAgPHNvdXJjZU1ldGFGZWF0dXJlCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmdlbm1vZGVsIy8vbW9kZWwvTGluay9zb3VyY2UiLz4KLSAgICAgICAgPHRhcmdldE1ldGFGZWF0dXJlCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmdlbm1vZGVsIy8vbW9kZWwvTGluay90YXJnZXQiLz4KLSAgICAgIDwvbW9kZWxGYWNldD4KLSAgICAgIDxsYWJlbHMKLSAgICAgICAgICB2aXN1YWxJRD0iNDAwNCIKLSAgICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iTGlua05hbWVFZGl0UGFydCIKLSAgICAgICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJMaW5rTmFtZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiCi0gICAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iTGlua05hbWVWaWV3RmFjdG9yeSI+Ci0gICAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzCi0gICAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+Ci0gICAgICAgIDx2aWV3bWFwCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOkZpZ3VyZVZpZXdtYXAiCi0gICAgICAgICAgICBmaWd1cmVRdWFsaWZpZWRDbGFzc05hbWU9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCI+Ci0gICAgICAgICAgPGF0dHJpYnV0ZXMKLSAgICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpMYWJlbE9mZnNldEF0dHJpYnV0ZXMiCi0gICAgICAgICAgICAgIHk9IjQwIi8+Ci0gICAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmRyYXcyZDwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aTwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICAgIDwvdmlld21hcD4KLSAgICAgICAgPG1vZGVsRmFjZXQKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46RmVhdHVyZUxhYmVsTW9kZWxGYWNldCIKLSAgICAgICAgICAgIGVkaXRQYXR0ZXJuPSIiPgotICAgICAgICAgIDxtZXRhRmVhdHVyZXMKLSAgICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5nZW5tb2RlbCMvL21vZGVsL0xpbmsvbmFtZSIvPgotICAgICAgICA8L21vZGVsRmFjZXQ+Ci0gICAgICA8L2xhYmVscz4KLSAgICA8L2xpbmtzPgotICAgIDxjb21wYXJ0bWVudHMKLSAgICAgICAgdmlzdWFsSUQ9IjUwMDEiCi0gICAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJSb2xlVGFza0NvbXBvc2l0ZVJvbGVUYXNrQ29tcGFydG1lbnRFZGl0UGFydCIKLSAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iUm9sZVRhc2tDb21wb3NpdGVSb2xlVGFza0NvbXBhcnRtZW50SXRlbVNlbWFudGljRWRpdFBvbGljeSIKLSAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iUm9sZVRhc2tDb21wb3NpdGVSb2xlVGFza0NvbXBhcnRtZW50Vmlld0ZhY3RvcnkiCi0gICAgICAgIGNhbm9uaWNhbEVkaXRQb2xpY3lDbGFzc05hbWU9IlJvbGVUYXNrQ29tcG9zaXRlUm9sZVRhc2tDb21wYXJ0bWVudENhbm9uaWNhbEVkaXRQb2xpY3kiCi0gICAgICAgIHRpdGxlPSJSb2xlVGFza0NvbXBhcnRtZW50IgotICAgICAgICBjYW5Db2xsYXBzZT0iZmFsc2UiCi0gICAgICAgIG5lZWRzVGl0bGU9ImZhbHNlIgotICAgICAgICBub2RlPSIvL0BkaWFncmFtL0B0b3BMZXZlbE5vZGVzLjAiPgotICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MKLSAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+Ci0gICAgICA8dmlld21hcAotICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46RmlndXJlVmlld21hcCIKLSAgICAgICAgICBmaWd1cmVRdWFsaWZpZWRDbGFzc05hbWU9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZmlndXJlcy5SZXNpemFibGVDb21wYXJ0bWVudEZpZ3VyZSI+Ci0gICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5kcmF3MmQ8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgIDwvdmlld21hcD4KLSAgICA8L2NvbXBhcnRtZW50cz4KLSAgICA8Y29tcGFydG1lbnRzCi0gICAgICAgIHZpc3VhbElEPSI1MDAyIgotICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iV29ya1Byb2R1Y3RDb21wb3NpdGVXb3JrUHJvZHVjdENvbXBhcnRtZW50RWRpdFBhcnQiCi0gICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IldvcmtQcm9kdWN0Q29tcG9zaXRlV29ya1Byb2R1Y3RDb21wYXJ0bWVudEl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiCi0gICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9IldvcmtQcm9kdWN0Q29tcG9zaXRlV29ya1Byb2R1Y3RDb21wYXJ0bWVudFZpZXdGYWN0b3J5IgotICAgICAgICBjYW5vbmljYWxFZGl0UG9saWN5Q2xhc3NOYW1lPSJXb3JrUHJvZHVjdENvbXBvc2l0ZVdvcmtQcm9kdWN0Q29tcGFydG1lbnRDYW5vbmljYWxFZGl0UG9saWN5IgotICAgICAgICB0aXRsZT0iV29ya1Byb2R1Y3RDb21wYXJ0bWVudCIKLSAgICAgICAgY2FuQ29sbGFwc2U9ImZhbHNlIgotICAgICAgICBuZWVkc1RpdGxlPSJmYWxzZSIKLSAgICAgICAgbm9kZT0iLy9AZGlhZ3JhbS9AdG9wTGV2ZWxOb2Rlcy4xIj4KLSAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzCi0gICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vTm9kZSIvPgotICAgICAgPHZpZXdtYXAKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOkZpZ3VyZVZpZXdtYXAiCi0gICAgICAgICAgZmlndXJlUXVhbGlmaWVkQ2xhc3NOYW1lPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmZpZ3VyZXMuUmVzaXphYmxlQ29tcGFydG1lbnRGaWd1cmUiPgotICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZHJhdzJkPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aTwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICA8L3ZpZXdtYXA+Ci0gICAgPC9jb21wYXJ0bWVudHM+Ci0gICAgPHBhbGV0dGU+Ci0gICAgICA8Z3JvdXBzCi0gICAgICAgICAgdGl0bGU9Ik5vZGVzIgotICAgICAgICAgIGNvbGxhcHNlPSJ0cnVlIj4KLSAgICAgICAgPGVudHJpZXMKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46VG9vbEVudHJ5IgotICAgICAgICAgICAgdGl0bGU9IlJvbGVOb2RlIgotICAgICAgICAgICAgZGVzY3JpcHRpb249IkNyZWF0ZSBuZXcgUm9sZU5vZGUiCi0gICAgICAgICAgICBnZW5Ob2Rlcz0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4wIi8+Ci0gICAgICAgIDxlbnRyaWVzCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlRvb2xFbnRyeSIKLSAgICAgICAgICAgIHRpdGxlPSJSb2xlVGFza0NvbXBvc2l0ZSIKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJDcmVhdGUgbmV3IFJvbGVUYXNrQ29tcG9zaXRlIgotICAgICAgICAgICAgZ2VuTm9kZXM9Ii8vQGRpYWdyYW0vQHRvcExldmVsTm9kZXMuMCIvPgotICAgICAgICA8ZW50cmllcwotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpUb29sRW50cnkiCi0gICAgICAgICAgICB0aXRsZT0iVGFza05vZGUiCi0gICAgICAgICAgICBkZXNjcmlwdGlvbj0iQ3JlYXRlIG5ldyBUYXNrTm9kZSIKLSAgICAgICAgICAgIGdlbk5vZGVzPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjEiLz4KLSAgICAgICAgPGVudHJpZXMKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46VG9vbEVudHJ5IgotICAgICAgICAgICAgdGl0bGU9IldvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGUiCi0gICAgICAgICAgICBkZXNjcmlwdGlvbj0iQ3JlYXRlIG5ldyBXb3JrUHJvZHVjTm9kZSIKLSAgICAgICAgICAgIGdlbk5vZGVzPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjIiLz4KLSAgICAgICAgPGVudHJpZXMKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46VG9vbEVudHJ5IgotICAgICAgICAgICAgdGl0bGU9IldvcmtQcm9kdWN0Q29tcG9zaXRlIgotICAgICAgICAgICAgZGVzY3JpcHRpb249IkNyZWF0ZSBuZXcgV29ya1Byb2R1Y3RDb21wb3NpdGUiCi0gICAgICAgICAgICBnZW5Ob2Rlcz0iLy9AZGlhZ3JhbS9AdG9wTGV2ZWxOb2Rlcy4xIi8+Ci0gICAgICA8L2dyb3Vwcz4KLSAgICAgIDxncm91cHMKLSAgICAgICAgICB0aXRsZT0iTGlua3MiCi0gICAgICAgICAgY29sbGFwc2U9InRydWUiPgotICAgICAgICA8ZW50cmllcwotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpUb29sRW50cnkiCi0gICAgICAgICAgICB0aXRsZT0iTGluayIKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJDcmVhdGUgbmV3IGxpbmsiCi0gICAgICAgICAgICBnZW5MaW5rcz0iLy9AZGlhZ3JhbS9AbGlua3MuMCIvPgotICAgICAgPC9ncm91cHM+Ci0gICAgPC9wYWxldHRlPgotICA8L2RpYWdyYW0+Ci0gIDxwbHVnaW4KLSAgICAgIGlEPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQiCi0gICAgICBuYW1lPSJBY3Rpdml0eSBEZXRhaWwgRGlhZ3JhbSBQbHVnaW4iCi0gICAgICBwcm92aWRlcj0iRVBGIgotICAgICAgdmVyc2lvbj0iMS4yLjAucXVhbGlmaWVyIgotICAgICAgcHJpbnRpbmdFbmFibGVkPSJ0cnVlIgotICAgICAgYWN0aXZhdG9yQ2xhc3NOYW1lPSJBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0b3JQbHVnaW4iLz4KLSAgPGVkaXRvcgotICAgICAgY2xhc3NOYW1lPSJBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0b3IiCi0gICAgICBpRD0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLnBhcnQuQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9ySUQiLz4KLSAgPGRvbWFpbkdlbk1vZGVsCi0gICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmdlbm1vZGVsIy8iLz4KLTwvZ21mZ2VuOkdlbkVkaXRvckdlbmVyYXRvcj4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9tb2RlbC9kaWFncmFtLmVjb3JlIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL21vZGVsL2RpYWdyYW0uZWNvcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyZTc4YjUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL21vZGVsL2RpYWdyYW0uZWNvcmUKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGVjb3JlOkVQYWNrYWdlIHhtaTp2ZXJzaW9uPSIyLjAiCi0gICAgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICAgIHhtbG5zOmVjb3JlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIiBuYW1lPSJtb2RlbCIKLSAgICBuc1VSST0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvZGlhZ3JhbS8xLjAuMC9kaWFncmFtLmVjb3JlIiBuc1ByZWZpeD0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwiPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkRpYWdyYW0iIGVTdXBlclR5cGVzPSIjLy9Ob2RlQ29udGFpbmVyIi8+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iTGluayIgZVN1cGVyVHlwZXM9IiMvL0xpbmtlZE9iamVjdCI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InNvdXJjZSIgZVR5cGU9IiMvL05vZGUiCi0gICAgICAgIGVPcHBvc2l0ZT0iIy8vTm9kZS9vdXRnb2luZ0Nvbm5lY3Rpb25zIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InRhcmdldCIgZVR5cGU9IiMvL05vZGUiCi0gICAgICAgIGVPcHBvc2l0ZT0iIy8vTm9kZS9pbmNvbWluZ0Nvbm5lY3Rpb25zIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImJlbmRwb2ludHMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vQWJzb2x1dGVCZW5kcG9pbnQiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic291cmNlRW5kUG9pbnQiIGVUeXBlPSIjLy9Qb2ludCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ0YXJnZXRFbmRQb2ludCIgZVR5cGU9IiMvL1BvaW50Ii8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkxpbmtlZE9iamVjdCIgYWJzdHJhY3Q9InRydWUiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJvYmplY3QiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VKYXZhT2JqZWN0Ii8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ik5hbWVkTm9kZSIgZVN1cGVyVHlwZXM9IiMvL05vZGUiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJuYW1lIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ik5vZGUiIGFic3RyYWN0PSJ0cnVlIiBlU3VwZXJUeXBlcz0iIy8vTGlua2VkT2JqZWN0Ij4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibG9jYXRpb24iIGVUeXBlPSIjLy9Qb2ludCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ3aWR0aCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUludCIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iLTEiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaGVpZ2h0IiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FSW50IgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSItMSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJpbmNvbWluZ0Nvbm5lY3Rpb25zIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL0xpbmsiIGVPcHBvc2l0ZT0iIy8vTGluay90YXJnZXQiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ib3V0Z29pbmdDb25uZWN0aW9ucyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9MaW5rIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIiBlT3Bwb3NpdGU9IiMvL0xpbmsvc291cmNlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJlYWRPbmx5IiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJBY3Rpdml0eURpYWdyYW0iIGVTdXBlclR5cGVzPSIjLy9EaWFncmFtIi8+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iVHlwZWROb2RlIiBlU3VwZXJUeXBlcz0iIy8vTm9kZSI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InR5cGUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VJbnQiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbSIgZVN1cGVyVHlwZXM9IiMvL0RpYWdyYW0iLz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJXb3JrUHJvZHVjdE5vZGUiIGVTdXBlclR5cGVzPSIjLy9OYW1lZE5vZGUiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ0eXBlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FSW50Ii8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkFjdGl2aXR5RGV0YWlsRGlhZ3JhbSIgZVN1cGVyVHlwZXM9IiMvL0RpYWdyYW0iLz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJOb2RlQ29udGFpbmVyIiBhYnN0cmFjdD0idHJ1ZSIgZVN1cGVyVHlwZXM9IiMvL05vZGUiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJub2RlcyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9Ob2RlIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlJvbGVOb2RlIiBlU3VwZXJUeXBlcz0iIy8vTmFtZWROb2RlIi8+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUm9sZVRhc2tDb21wb3NpdGUiIGVTdXBlclR5cGVzPSIjLy9Ob2RlQ29udGFpbmVyIi8+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iVGFza05vZGUiIGVTdXBlclR5cGVzPSIjLy9OYW1lZE5vZGUiLz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlIiBlU3VwZXJUeXBlcz0iIy8vTmFtZWROb2RlIi8+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iV29ya0JyZWFrZG93bkVsZW1lbnROb2RlIiBlU3VwZXJUeXBlcz0iIy8vTmFtZWROb2RlIi8+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iV29ya1Byb2R1Y3RDb21wb3NpdGUiIGVTdXBlclR5cGVzPSIjLy9Ob2RlQ29udGFpbmVyIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idHlwZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUludCIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJBYnNvbHV0ZUJlbmRwb2ludCIgaW5zdGFuY2VDbGFzc05hbWU9Im9yZy5lY2xpcHNlLmRyYXcyZC5BYnNvbHV0ZUJlbmRwb2ludCIvPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IlBvaW50IiBpbnN0YW5jZUNsYXNzTmFtZT0ib3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50Ii8+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iUm9sZURlc2NyaXB0b3IiIGluc3RhbmNlQ2xhc3NOYW1lPSJvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdG9yIi8+Ci08L2Vjb3JlOkVQYWNrYWdlPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3BsdWdpbi5wcm9wZXJ0aWVzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZThjMTFlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBTVEFSVCBOTyBUUkFOU0xBVElPTgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXByZWZlcmVuY2VzLmdlbmVyYWw9QUREIERpYWdyYW0KLXByZWZlcmVuY2VzLmFwcGVhcmFuY2U9QXBwZWFyYW5jZQotcHJlZmVyZW5jZXMuY29ubmVjdGlvbnM9Q29ubmVjdGlvbnMKLXByZWZlcmVuY2VzLnByaW50aW5nPVByaW50aW5nCi1wcmVmZXJlbmNlcy5ydWxlcnNBbmRHcmlkPVJ1bGVycyAmIEdyaWQKLXByZWZlcmVuY2VzLnBhdGhtYXBzPVBhdGggTWFwcwotCi1lZGl0b3JOYW1lPUFERCBEaWFncmFtIEVkaXRvcgotbmV3V2l6YXJkTmFtZT1BREQgRGlhZ3JhbQotbmV3V2l6YXJkRGVzYz1DcmVhdGVzIEFERCBkaWFncmFtLgotCi1pbml0RGlhZ3JhbUFjdGlvbkxhYmVsPUluaXRpYWxpemUgYWRkIGRpYWdyYW0gZmlsZQotbG9hZFJlc291cmNlQWN0aW9uTGFiZWw9TG9hZCBSZXNvdXJjZS4uLgotCi1uYXZpZ2F0b3JDb250ZW50TmFtZT0qLmFkZCBkaWFncmFtIGNvbnRlbnRzCi0KLW1ldGF0eXBlLm5hbWUuQWN0aXZpdHlEZXRhaWxEaWFncmFtXzc5PVVuZGVmaW5lZAotbWV0YXR5cGUubmFtZS5Sb2xlVGFza0NvbXBvc2l0ZV8xMDAxPVJvbGVUYXNrQ29tcG9zaXRlCi1tZXRhdHlwZS5uYW1lLldvcmtQcm9kdWN0Q29tcG9zaXRlXzEwMDI9V29ya1Byb2R1Y3RDb21wb3NpdGUKLW1ldGF0eXBlLm5hbWUuUm9sZU5vZGVfMjAwMT1Sb2xlTm9kZQotbWV0YXR5cGUubmFtZS5UYXNrTm9kZV8yMDAyPVRhc2tOb2RlCi1tZXRhdHlwZS5uYW1lLldvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVfMjAwMz1Xb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlCi1tZXRhdHlwZS5uYW1lLkxpbmtfMzAwMT1MaW5rCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBFTkQgTk8gVFJBTlNMQVRJT04KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLXBsdWdpbk5hbWU9RVBGIEFjdGl2aXR5IERldGFpbCBEaWFncmFtCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKLQotIyBOZWVkIHRyYW5zbGF0aW9uCi1lbGVtZW50X3R5cGVfY29udHJvbF9mbG93PUNvbnRyb2wgRmxvdwotCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvcGx1Z2luLnhtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YzU2OWRiOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotCi08cGx1Z2luPgotCi0gICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMiPgotICAgICAgPGluaXRpYWxpemVyIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQucGFydC5EaWFncmFtRGlhZ3JhbVByZWZlcmVuY2VJbml0aWFsaXplciIvPgotICAgPC9leHRlbnNpb24+Ci0KLSAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudGVhbS5jb3JlLmZpbGVUeXBlcyI+Ci0gICAgICA8ZmlsZVR5cGVzCi0gICAgICAgICB0eXBlPSJ0ZXh0IgotICAgICAgICAgZXh0ZW5zaW9uPSJhZGQiPgotICAgICAgPC9maWxlVHlwZXM+Ci0gIDwvZXh0ZW5zaW9uPgotCi0gICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuZXh0ZW5zaW9uX3BhcnNlciI+Ci0gICAgICA8cGFyc2VyCi0gICAgICAgICB0eXBlPSJhZGQiCi0gICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvcmUucmVzb3VyY2VzLkdNRlJlc291cmNlRmFjdG9yeSI+Ci0gICAgICA8L3BhcnNlcj4KLSAgIDwvZXh0ZW5zaW9uPgotCi0gICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5lZGl0b3JzIj4KLSAgIDwhLS0KLSAgICAgPGVkaXRvcgotICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLnBhcnQuQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9ySUQiCi0gICAgICAgIG5hbWU9IkdNRiBBY3Rpdml0eSBEZXRhaWwgRGlhZ3JhbSBFZGl0b3IiCi0gICAgICAgIGljb249Imljb25zL29iajE2L01vZGVsRGlhZ3JhbUZpbGUuZ2lmIgotICAgICAgICBleHRlbnNpb25zPSJhZGQiCi0gICAgICAgIGRlZmF1bHQ9InRydWUiCi0gICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQucGFydC5BY3Rpdml0eURldGFpbERpYWdyYW1FZGl0b3IiCi0gICAgICAgIG1hdGNoaW5nU3RyYXRlZ3k9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5wYXJ0LkRpYWdyYW1NYXRjaGluZ1N0cmF0ZWd5IgotICAgICAgICBjb250cmlidXRvckNsYXNzPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQucGFydC5EaWFncmFtRGlhZ3JhbUFjdGlvbkJhckNvbnRyaWJ1dG9yIj4KLSAgICAgPC9lZGl0b3I+Ci0gICAtLT4KLSAgICAgPGVkaXRvcgotICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLnBhcnQuQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9ySUQiCi0gICAgICAgIG5hbWU9IkFjdGl2aXR5IERldGFpbCBEaWFncmFtIEVkaXRvciIKLSAgICAgICAgaWNvbj0iaWNvbnMvZnVsbC9ldG9vbDE2L0FEREVkaXRvci5naWYiCi0gICAgICAgIGV4dGVuc2lvbnM9ImFkZCIKLSAgICAgICAgZGVmYXVsdD0idHJ1ZSIKLSAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5wYXJ0LkFERGlhZ3JhbUVkaXRvciIKLSAgICAgICAgbWF0Y2hpbmdTdHJhdGVneT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLnBhcnQuRGlhZ3JhbU1hdGNoaW5nU3RyYXRlZ3kiCi0gICAgICAgIGNvbnRyaWJ1dG9yQ2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5wYXJ0LkRpYWdyYW1EaWFncmFtQWN0aW9uQmFyQ29udHJpYnV0b3IiPgotICAgICA8L2VkaXRvcj4gICAgCi0gICA8L2V4dGVuc2lvbj4KLQotICAgPCEtLSA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5uZXdXaXphcmRzIj4KLSAgCSAgPHdpemFyZAotICAJICAgICBuYW1lPSJBY3Rpdml0eSBEZXRhaWwgRGlhZ3JhbSIKLSAgCSAgICAgaWNvbj0iaWNvbnMvb2JqMTYvTW9kZWxEaWFncmFtRmlsZS5naWYiCi0gIAkgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS51aS5FeGFtcGxlcyIKLSAgCSAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5wYXJ0LkRpYWdyYW1DcmVhdGlvbldpemFyZCIKLSAgCSAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5wYXJ0LkRpYWdyYW1DcmVhdGlvbldpemFyZElEIj4KLSAgCSAgCSA8ZGVzY3JpcHRpb24+Ci0gIAkgIAkJQ3JlYXRlcyBBY3Rpdml0eSBEZXRhaWwgRGlhZ3JhbS4KLSAgCSAgCSA8L2Rlc2NyaXB0aW9uPiAgCi0gICAgICA8L3dpemFyZD4KLSAgIDwvZXh0ZW5zaW9uPiAtLT4KLQotICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkucG9wdXBNZW51cyI+Ci0gICAgICA8IS0tIDxvYmplY3RDb250cmlidXRpb24KLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQudWkub2JqZWN0Q29udHJpYnV0aW9uLklGaWxlMSIKLSAgICAgICAgICAgIG5hbWVGaWx0ZXI9IioubW9kZWwiCi0gICAgICAgICAgICBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGUiPgotICAgICAgICAgPGFjdGlvbgotICAgICAgICAgICAgICAgbGFiZWw9IkluaXRpYWxpemUgYWRkIGRpYWdyYW0gZmlsZSIKLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQucGFydC5EaWFncmFtSW5pdERpYWdyYW1GaWxlQWN0aW9uIgotICAgICAgICAgICAgICAgbWVudWJhclBhdGg9ImFkZGl0aW9ucyIKLSAgICAgICAgICAgICAgIGVuYWJsZXNGb3I9IjEiCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLnBhcnQuRGlhZ3JhbUluaXREaWFncmFtRmlsZUFjdGlvbklEIj4KLSAgICAgICAgIDwvYWN0aW9uPgotICAgICAgPC9vYmplY3RDb250cmlidXRpb24+ICAKLSAgICAgIDxvYmplY3RDb250cmlidXRpb24KLSAgICAgICAgICAgIGFkYXB0YWJsZT0iZmFsc2UiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLnVpLm9iamVjdENvbnRyaWJ1dGlvbi5BY3Rpdml0eURldGFpbERpYWdyYW1FZGl0UGFydDIiCi0gICAgICAgICAgICBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucGFydHMuQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdFBhcnQiPgotICAgICAgICAgPGFjdGlvbgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5wYXJ0LkRpYWdyYW1Mb2FkUmVzb3VyY2VBY3Rpb24iCi0gICAgICAgICAgICAgICBlbmFibGVzRm9yPSIxIgotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5wYXJ0LkRpYWdyYW1Mb2FkUmVzb3VyY2VBY3Rpb25JRCIKLSAgICAgICAgICAgICAgIGxhYmVsPSJMb2FkIFJlc291cmNlLi4uIgotICAgICAgICAgICAgICAgbWVudWJhclBhdGg9ImFkZGl0aW9ucyI+Ci0gICAgICAgICA8L2FjdGlvbj4KLSAgICAgIDwvb2JqZWN0Q29udHJpYnV0aW9uPiAgICAKLSAgICAgIDxvYmplY3RDb250cmlidXRpb24KLSAgICAgICAgICAgIGFkYXB0YWJsZT0idHJ1ZSIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuRGVsZXRlRGlhZ3JhbSIKLSAgICAgICAgICAgIG9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wYXJ0cy5BY3Rpdml0eURldGFpbERpYWdyYW1FZGl0UGFydCI+Ci0gICAgICAgICA8YWN0aW9uCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5hY3Rpb25zLkRlbGV0ZURpYWdyYW1BY3Rpb24iCi0gICAgICAgICAgICAgICBlbmFibGVzRm9yPSIxIgotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuYWN0aW9ucy5EZWxldGVEaWFncmFtQWN0aW9uIgotICAgICAgICAgICAgICAgbGFiZWw9IiVEZWxldGVEaWFncmFtX3RleHQiCi0gICAgICAgICAgICAgICBtZW51YmFyUGF0aD0iYWRkaXRpb25zIgotICAgICAgICAgICAgICAgc3RhdGU9ImZhbHNlIgotICAgICAgICAgICAgICAgc3R5bGU9InB1c2giCi0gICAgICAgICAgICAgICB0b29sdGlwPSIlRGVsZXRlRGlhZ3JhbV90ZXh0Ii8+Ci0gICAgICA8L29iamVjdENvbnRyaWJ1dGlvbj4KLSAgICAgIDxvYmplY3RDb250cmlidXRpb24KLSAgICAgICAgICAgIGFkYXB0YWJsZT0iZmFsc2UiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLlJlZnJlc2hGcm9tQmFzZUFjdGlvbiIKLSAgICAgICAgICAgIG9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wYXJ0cy5BY3Rpdml0eURldGFpbERpYWdyYW1FZGl0UGFydCI+Ci0gICAgICAgICA8YWN0aW9uCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5hY3Rpb25zLlJlZnJlc2hGcm9tQmFzZUFjdGlvbiIKLSAgICAgICAgICAgICAgIGVuYWJsZXNGb3I9IjEiCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5hY3Rpb25zLlJlZnJlc2hGcm9tQmFzZUFjdGlvbiIKLSAgICAgICAgICAgICAgIGxhYmVsPSIlcmVmcmVzaEZyb21CYXNlQWN0aXZpdHlfdGV4dCIKLSAgICAgICAgICAgICAgIG1lbnViYXJQYXRoPSJhZGRpdGlvbnMiCi0gICAgICAgICAgICAgICBzdGF0ZT0iZmFsc2UiCi0gICAgICAgICAgICAgICBzdHlsZT0icHVzaCIKLSAgICAgICAgICAgICAgIHRvb2x0aXA9IiVyZWZyZXNoRnJvbUJhc2VBY3Rpdml0eV90ZXh0Ii8+Ci0gICAgICA8L29iamVjdENvbnRyaWJ1dGlvbj4KLSAgICAgIDxvYmplY3RDb250cmlidXRpb24KLSAgICAgICAgICAgIGFkYXB0YWJsZT0iZmFsc2UiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLlJlZnJlc2hBY3Rpb24iCi0gICAgICAgICAgICBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucGFydHMuQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdFBhcnQiPgotICAgICAgICAgPGFjdGlvbgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuYWN0aW9ucy5SZWZyZXNoQWN0aW9uIgotICAgICAgICAgICAgICAgZW5hYmxlc0Zvcj0iMSIKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLmFjdGlvbnMuUmVmcmVzaEFjdGlvbiIKLSAgICAgICAgICAgICAgIGxhYmVsPSIlcmVmcmVzaF90ZXh0IgotICAgICAgICAgICAgICAgbWVudWJhclBhdGg9ImFkZGl0aW9ucyIKLSAgICAgICAgICAgICAgIHN0YXRlPSJmYWxzZSIKLSAgICAgICAgICAgICAgIHN0eWxlPSJwdXNoIgotICAgICAgICAgICAgICAgdG9vbHRpcD0iJXJlZnJlc2hfdGV4dCIvPgotICAgICAgPC9vYmplY3RDb250cmlidXRpb24+ICAgICAgICAgLS0+ICAgICAgICAgICAKLSAgPC9leHRlbnNpb24+Ci0KLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5hY3Rpb24uY29udHJpYnV0aW9uSXRlbVByb3ZpZGVycyI+Ci0gICAgICA8Y29udHJpYnV0aW9uSXRlbVByb3ZpZGVyIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQucHJvdmlkZXJzLkRpYWdyYW1Db250cmlidXRpb25JdGVtUHJvdmlkZXIiPgotICAgICAgICAgPFByaW9yaXR5IG5hbWU9IkxvdyI+Ci0gICAgICAgICA8L1ByaW9yaXR5PgotICAgICAgICAgPHBhcnRDb250cmlidXRpb24gaWQ9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5wYXJ0LkFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvcklEIj4KLSAgICAgICAgICAgIDxwYXJ0QWN0aW9uIG1lbnViYXJQYXRoPSIvZmlsZS9wcmludCIgaWQ9InByaW50UHJldmlld0FjdGlvbiI+Ci0gICAgICAgICAgICA8L3BhcnRBY3Rpb24+Ci0gICAgICAgICA8L3BhcnRDb250cmlidXRpb24+Ci0gICAgICA8L2NvbnRyaWJ1dGlvbkl0ZW1Qcm92aWRlcj4KLSAgICAgIDxjb250cmlidXRpb25JdGVtUHJvdmlkZXIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnByb3ZpZGVycy5EaWFncmFtQ29udHJpYnV0aW9uSXRlbVByb3ZpZGVyIgotICAgICAgICAgICAgY2hlY2tQbHVnaW5Mb2FkZWQ9ImZhbHNlIj4KLSAgICAgICAgIDxQcmlvcml0eSBuYW1lPSJMb3ciLz4KLSAgICAgICAgIDxwb3B1cENvbnRyaWJ1dGlvbiBjbGFzcz0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wcm92aWRlcnMuRGlhZ3JhbUNvbnRleHRNZW51UHJvdmlkZXIiPgotICAgICAgICAgICAgPHBvcHVwU3RydWN0dXJlZENvbnRyaWJ1dGlvbkNyaXRlcmlhIG9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wYXJ0cy5Sb2xlTm9kZUVkaXRQYXJ0Ii8+Ci0gICAgICAgICAgICA8cG9wdXBQcmVkZWZpbmVkSXRlbSBpZD0iZGVsZXRlRnJvbURpYWdyYW1BY3Rpb24iIHJlbW92ZT0idHJ1ZSIvPgotICAgICAgICAgPC9wb3B1cENvbnRyaWJ1dGlvbj4KLSAgICAgICAgIDxwb3B1cENvbnRyaWJ1dGlvbiBjbGFzcz0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wcm92aWRlcnMuRGlhZ3JhbUNvbnRleHRNZW51UHJvdmlkZXIiPgotICAgICAgICAgICAgPHBvcHVwU3RydWN0dXJlZENvbnRyaWJ1dGlvbkNyaXRlcmlhIG9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wYXJ0cy5Sb2xlTm9kZU5hbWVFZGl0UGFydCIvPgotICAgICAgICAgICAgPHBvcHVwUHJlZGVmaW5lZEl0ZW0gaWQ9ImRlbGV0ZUZyb21EaWFncmFtQWN0aW9uIiByZW1vdmU9InRydWUiLz4KLSAgICAgICAgIDwvcG9wdXBDb250cmlidXRpb24+Ci0gICAgICAgICA8cG9wdXBDb250cmlidXRpb24gY2xhc3M9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucHJvdmlkZXJzLkRpYWdyYW1Db250ZXh0TWVudVByb3ZpZGVyIj4KLSAgICAgICAgICAgIDxwb3B1cFN0cnVjdHVyZWRDb250cmlidXRpb25Dcml0ZXJpYSBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucGFydHMuVGFza05vZGVFZGl0UGFydCIvPgotICAgICAgICAgICAgPHBvcHVwUHJlZGVmaW5lZEl0ZW0gaWQ9ImRlbGV0ZUZyb21EaWFncmFtQWN0aW9uIiByZW1vdmU9InRydWUiLz4KLSAgICAgICAgIDwvcG9wdXBDb250cmlidXRpb24+Ci0gICAgICAgICA8cG9wdXBDb250cmlidXRpb24gY2xhc3M9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucHJvdmlkZXJzLkRpYWdyYW1Db250ZXh0TWVudVByb3ZpZGVyIj4KLSAgICAgICAgICAgIDxwb3B1cFN0cnVjdHVyZWRDb250cmlidXRpb25Dcml0ZXJpYSBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucGFydHMuVGFza05vZGVOYW1lRWRpdFBhcnQiLz4KLSAgICAgICAgICAgIDxwb3B1cFByZWRlZmluZWRJdGVtIGlkPSJkZWxldGVGcm9tRGlhZ3JhbUFjdGlvbiIgcmVtb3ZlPSJ0cnVlIi8+Ci0gICAgICAgICA8L3BvcHVwQ29udHJpYnV0aW9uPgotICAgICAgICAgPHBvcHVwQ29udHJpYnV0aW9uIGNsYXNzPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnByb3ZpZGVycy5EaWFncmFtQ29udGV4dE1lbnVQcm92aWRlciI+Ci0gICAgICAgICAgICA8cG9wdXBTdHJ1Y3R1cmVkQ29udHJpYnV0aW9uQ3JpdGVyaWEgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBhcnRzLldvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVFZGl0UGFydCIvPgotICAgICAgICAgICAgPHBvcHVwUHJlZGVmaW5lZEl0ZW0gaWQ9ImRlbGV0ZUZyb21EaWFncmFtQWN0aW9uIiByZW1vdmU9InRydWUiLz4KLSAgICAgICAgIDwvcG9wdXBDb250cmlidXRpb24+Ci0gICAgICAgICA8cG9wdXBDb250cmlidXRpb24gY2xhc3M9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucHJvdmlkZXJzLkRpYWdyYW1Db250ZXh0TWVudVByb3ZpZGVyIj4KLSAgICAgICAgICAgIDxwb3B1cFN0cnVjdHVyZWRDb250cmlidXRpb25Dcml0ZXJpYSBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucGFydHMuV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZU5hbWVFZGl0UGFydCIvPgotICAgICAgICAgICAgPHBvcHVwUHJlZGVmaW5lZEl0ZW0gaWQ9ImRlbGV0ZUZyb21EaWFncmFtQWN0aW9uIiByZW1vdmU9InRydWUiLz4KLSAgICAgICAgIDwvcG9wdXBDb250cmlidXRpb24+Ci0gICAgICAgICA8cG9wdXBDb250cmlidXRpb24gY2xhc3M9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucHJvdmlkZXJzLkRpYWdyYW1Db250ZXh0TWVudVByb3ZpZGVyIj4KLSAgICAgICAgICAgIDxwb3B1cFN0cnVjdHVyZWRDb250cmlidXRpb25Dcml0ZXJpYSBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucGFydHMuUm9sZVRhc2tDb21wb3NpdGVFZGl0UGFydCIvPgotICAgICAgICAgICAgPHBvcHVwUHJlZGVmaW5lZEl0ZW0gaWQ9ImRlbGV0ZUZyb21EaWFncmFtQWN0aW9uIiByZW1vdmU9InRydWUiLz4KLSAgICAgICAgIDwvcG9wdXBDb250cmlidXRpb24+Ci0gICAgICAgICA8cG9wdXBDb250cmlidXRpb24gY2xhc3M9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucHJvdmlkZXJzLkRpYWdyYW1Db250ZXh0TWVudVByb3ZpZGVyIj4KLSAgICAgICAgICAgIDxwb3B1cFN0cnVjdHVyZWRDb250cmlidXRpb25Dcml0ZXJpYSBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucGFydHMuV29ya1Byb2R1Y3RDb21wb3NpdGVFZGl0UGFydCIvPgotICAgICAgICAgICAgPHBvcHVwUHJlZGVmaW5lZEl0ZW0gaWQ9ImRlbGV0ZUZyb21EaWFncmFtQWN0aW9uIiByZW1vdmU9InRydWUiLz4KLSAgICAgICAgIDwvcG9wdXBDb250cmlidXRpb24+Ci0gICAgICAgICA8cG9wdXBDb250cmlidXRpb24gY2xhc3M9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucHJvdmlkZXJzLkRpYWdyYW1Db250ZXh0TWVudVByb3ZpZGVyIj4KLSAgICAgICAgICAgIDxwb3B1cFN0cnVjdHVyZWRDb250cmlidXRpb25Dcml0ZXJpYSBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucGFydHMuTGlua0VkaXRQYXJ0Ii8+Ci0gICAgICAgICAgICA8cG9wdXBQcmVkZWZpbmVkSXRlbSBpZD0iZGVsZXRlRnJvbURpYWdyYW1BY3Rpb24iIHJlbW92ZT0idHJ1ZSIvPgotICAgICAgICAgPC9wb3B1cENvbnRyaWJ1dGlvbj4KLSAgICAgICAgICAgICAgICAgIDxwb3B1cENvbnRyaWJ1dGlvbiBjbGFzcz0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wcm92aWRlcnMuRGlhZ3JhbUNvbnRleHRNZW51UHJvdmlkZXIiPgotICAgICAgICAgICAgPHBvcHVwU3RydWN0dXJlZENvbnRyaWJ1dGlvbkNyaXRlcmlhIG9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wYXJ0cy5MaW5rTmFtZUVkaXRQYXJ0Ii8+Ci0gICAgICAgICAgICA8cG9wdXBQcmVkZWZpbmVkSXRlbSBpZD0iZGVsZXRlRnJvbURpYWdyYW1BY3Rpb24iIHJlbW92ZT0idHJ1ZSIvPgotICAgICAgICAgICAgPHBvcHVwUHJlZGVmaW5lZEl0ZW0gaWQ9ImRlbGV0ZUZyb21Nb2RlbEFjdGlvbiIgcmVtb3ZlPSJ0cnVlIi8+Ci0gICAgICAgICA8L3BvcHVwQ29udHJpYnV0aW9uPgotICAgICAgPC9jb250cmlidXRpb25JdGVtUHJvdmlkZXI+Ci0gICA8L2V4dGVuc2lvbj4KLQotICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLmFjdGlvbi5nbG9iYWxBY3Rpb25IYW5kbGVyUHJvdmlkZXJzIj4KLSAgICAgIDxHbG9iYWxBY3Rpb25IYW5kbGVyUHJvdmlkZXIKLSAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnByb3ZpZGVycy5EaWFncmFtR2xvYmFsQWN0aW9uSGFuZGxlclByb3ZpZGVyIgotICAgICAgICAgaWQ9IkFERFByZXNlbnRhdGlvbiI+Ci0gICAgICAgICA8UHJpb3JpdHkgbmFtZT0iTG93ZXN0Ii8+Ci0gICAgICAgICA8Vmlld0lkIGlkPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQucGFydC5BY3Rpdml0eURldGFpbERpYWdyYW1FZGl0b3JJRCI+Ci0gICAgICAgICAgICA8RWxlbWVudFR5cGUgY2xhc3M9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklHcmFwaGljYWxFZGl0UGFydCI+Ci0gICAgICAgICAgICAgICA8R2xvYmFsQWN0aW9uSWQgYWN0aW9uSWQ9ImRlbGV0ZSIvPgotICAgICAgICAgICAgPC9FbGVtZW50VHlwZT4KLSAgICAgICAgICAgIDxFbGVtZW50VHlwZSBjbGFzcz0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuRGlhZ3JhbUVkaXRQYXJ0Ij4KLSAgICAgICAgICAgICAgIDxHbG9iYWxBY3Rpb25JZCBhY3Rpb25JZD0ic2F2ZSIvPgotICAgICAgICAgICAgPC9FbGVtZW50VHlwZT4KLSAgICAgICAgIDwvVmlld0lkPgotICAgICAgPC9HbG9iYWxBY3Rpb25IYW5kbGVyUHJvdmlkZXI+Ci0gICAgICA8R2xvYmFsQWN0aW9uSGFuZGxlclByb3ZpZGVyCi0gICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wcmludGluZy5yZW5kZXIucHJvdmlkZXJzLkRpYWdyYW1XaXRoUHJpbnRHbG9iYWxBY3Rpb25IYW5kbGVyUHJvdmlkZXIiCi0gICAgICAgICBpZD0iQUREUHJlc2VudGF0aW9uUHJpbnQiPgotICAgICAgICAgPFByaW9yaXR5IG5hbWU9Ikxvd2VzdCIvPgotICAgICAgICAgPFZpZXdJZCBpZD0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLnBhcnQuQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9ySUQiPgotICAgICAgICAgICAgPEVsZW1lbnRUeXBlIGNsYXNzPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JR3JhcGhpY2FsRWRpdFBhcnQiPgotICAgICAgICAgICAgICAgPEdsb2JhbEFjdGlvbklkIGFjdGlvbklkPSJwcmludCIvPgotICAgICAgICAgICAgPC9FbGVtZW50VHlwZT4KLSAgICAgICAgIDwvVmlld0lkPgotICAgICAgPC9HbG9iYWxBY3Rpb25IYW5kbGVyUHJvdmlkZXI+Ci0gICAgICA8R2xvYmFsQWN0aW9uSGFuZGxlclByb3ZpZGVyCi0gICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wcm92aWRlcnMuaWRlLnByb3ZpZGVycy5EaWFncmFtSURFR2xvYmFsQWN0aW9uSGFuZGxlclByb3ZpZGVyIgotICAgICAgICAgaWQ9IkFERFByZXNlbnRhdGlvbklERSI+Ci0gICAgICAgICA8UHJpb3JpdHkgbmFtZT0iTG93ZXN0Ii8+Ci0gICAgICAgICA8Vmlld0lkIGlkPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQucGFydC5BY3Rpdml0eURldGFpbERpYWdyYW1FZGl0b3JJRCI+Ci0gICAgICAgICAgICA8RWxlbWVudFR5cGUgY2xhc3M9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklHcmFwaGljYWxFZGl0UGFydCI+Ci0gICAgICAgICAgICAgICA8R2xvYmFsQWN0aW9uSWQgYWN0aW9uSWQ9ImJvb2ttYXJrIi8+Ci0gICAgICAgICAgICA8L0VsZW1lbnRUeXBlPgotICAgICAgICAgPC9WaWV3SWQ+Ci0gICAgICA8L0dsb2JhbEFjdGlvbkhhbmRsZXJQcm92aWRlcj4KLSAgICAgIDwhLS0KLSAgICAgIDxHbG9iYWxBY3Rpb25IYW5kbGVyUHJvdmlkZXIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlbmRlci5wcm92aWRlcnMuRGlhZ3JhbVVJUmVuZGVyR2xvYmFsQWN0aW9uSGFuZGxlclByb3ZpZGVyIgotICAgICAgICAgICAgaWQ9IkFERFJlbmRlciI+Ci0gICAgICAgICA8UHJpb3JpdHkgbmFtZT0iTG93ZXN0Ii8+Ci0gICAgICAgICA8Vmlld0lkIGlkPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQucGFydC5BY3Rpdml0eURldGFpbERpYWdyYW1FZGl0b3JJRCI+Ci0gICAgICAgICAgICA8RWxlbWVudFR5cGUgY2xhc3M9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklHcmFwaGljYWxFZGl0UGFydCI+Ci0gICAgICAgICAgICAgICA8R2xvYmFsQWN0aW9uSWQgYWN0aW9uSWQ9ImN1dCIvPgotICAgICAgICAgICAgICAgPEdsb2JhbEFjdGlvbklkIGFjdGlvbklkPSJjb3B5Ii8+Ci0gICAgICAgICAgICAgICA8R2xvYmFsQWN0aW9uSWQgYWN0aW9uSWQ9InBhc3RlIi8+Ci0gICAgICAgICAgICA8L0VsZW1lbnRUeXBlPgotICAgICAgICAgPC9WaWV3SWQ+Ci0gICAgICA8L0dsb2JhbEFjdGlvbkhhbmRsZXJQcm92aWRlcj4KLSAgICAgIC0tPgotICAgPC9leHRlbnNpb24+Ci0KLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS52aWV3UHJvdmlkZXJzIj4KLSAgICAgIDx2aWV3UHJvdmlkZXIgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5wcm92aWRlcnMuRGlhZ3JhbVZpZXdQcm92aWRlciI+Ci0gICAgICAgICA8UHJpb3JpdHkgbmFtZT0iTG93ZXN0Ii8+Ci0gICAgICAgICA8Y29udGV4dCB2aWV3Q2xhc3M9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkRpYWdyYW0iIHNlbWFudGljSGludHM9IkFERCIvPgotICAgICAgICAgPGNvbnRleHQgdmlld0NsYXNzPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob2RlIiBzZW1hbnRpY0hpbnRzPSIiLz4KLSAgICAgICAgIDxjb250ZXh0IHZpZXdDbGFzcz0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRWRnZSIgc2VtYW50aWNIaW50cz0iIi8+Ci0gICAgICA8L3ZpZXdQcm92aWRlcj4KLSAgIDwvZXh0ZW5zaW9uPgotCi0gICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0UHJvdmlkZXJzIj4KLSAgICAgIDxlZGl0cGFydFByb3ZpZGVyIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQucHJvdmlkZXJzLkRpYWdyYW1FZGl0UGFydFByb3ZpZGVyIj4KLSAgICAgICAgIDxQcmlvcml0eSBuYW1lPSJMb3dlc3QiLz4KLSAgICAgIDwvZWRpdHBhcnRQcm92aWRlcj4KLSAgIDwvZXh0ZW5zaW9uPgotCi0gICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnBhbGV0dGVQcm92aWRlcnMiPgotICAgICAgPHBhbGV0dGVQcm92aWRlciBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLnByb3ZpZGVycy5EaWFncmFtUGFsZXR0ZVByb3ZpZGVyIj4KLSAgICAgICAgIDxQcmlvcml0eSBuYW1lPSJMb3dlc3QiLz4KLSAgICAgICAgIDxlZGl0b3IgaWQ9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5wYXJ0LkFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvcklEIi8+Ci0gICAgICA8L3BhbGV0dGVQcm92aWRlcj4KLSAgICAgIDxwYWxldHRlUHJvdmlkZXIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnByb3ZpZGVycy5EZWZhdWx0UGFsZXR0ZVByb3ZpZGVyIj4KLSAgICAgICAgPFByaW9yaXR5IG5hbWU9Ik1lZGl1bSIvPgotICAgICAgICA8ZWRpdG9yIGlkPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQucGFydC5BY3Rpdml0eURldGFpbERpYWdyYW1FZGl0b3JJRCIvPgotICAgICAgICA8Y29udHJpYnV0aW9uPgotICAgICAgICAgICAgPHByZWRlZmluZWRFbnRyeSAgICAKLSAgICAgICAgICAgIAlpZD0iZ2Vvc2hhcGVEcmF3ZXIiICAgcGF0aD0iLyI+Ci0gICAgICAgICAgICAJPGV4cGFuZCBmb3JjZT0idHJ1ZSIvPgotICAgICAgICAgICAgIDwvcHJlZGVmaW5lZEVudHJ5PiAKLSAgICAgICAgPC9jb250cmlidXRpb24+Ci0gICAgICA8L3BhbGV0dGVQcm92aWRlcj4KLSAgIDwvZXh0ZW5zaW9uPgotCi0gICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudWkubW9kZWxpbmdBc3Npc3RhbnRQcm92aWRlcnMiPgotICAgICAgPG1vZGVsaW5nQXNzaXN0YW50UHJvdmlkZXIgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5wcm92aWRlcnMuRGlhZ3JhbU1vZGVsaW5nQXNzaXN0YW50UHJvdmlkZXIiPgotICAgICAgICAgPFByaW9yaXR5IG5hbWU9Ikxvd2VzdCIvPgotICAgICAgPC9tb2RlbGluZ0Fzc2lzdGFudFByb3ZpZGVyPgotICAgPC9leHRlbnNpb24+Ci0KLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wcm9wZXJ0aWVzLnByb3BlcnRpZXNQcm92aWRlcnMiPgotICAgICAgPFByb3BlcnRpZXNQcm92aWRlcgotICAgICAgICAgICAgdmVyaWZ5UGx1Z2luTG9hZGVkPSJmYWxzZSIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQucHJvdmlkZXJzLkRpYWdyYW1Qcm9wZXJ0eVByb3ZpZGVyIj4KLSAgICAgICAgIDxQcmlvcml0eSBuYW1lPSJMb3dlc3QiLz4KLSAgICAgIDwvUHJvcGVydGllc1Byb3ZpZGVyPgotICAgPC9leHRlbnNpb24+Ci0KLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5pY29uUHJvdmlkZXJzIj4KLSAgICAgIDxJY29uUHJvdmlkZXIgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5wcm92aWRlcnMuRGlhZ3JhbUljb25Qcm92aWRlciI+Ci0gICAgICAgICA8UHJpb3JpdHkgbmFtZT0iTG93Ii8+Ci0gICAgICA8L0ljb25Qcm92aWRlcj4KLSAgICAgIDxJY29uUHJvdmlkZXIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmdlb3NoYXBlcy5pbnRlcm5hbC5wcm92aWRlcnMuR2VvU2hhcGVJY29uUHJvdmlkZXIiPgotICAgICAgICAgPFByaW9yaXR5Ci0gICAgICAgICAgICAgICBuYW1lPSJNZWRpdW0iPgotICAgICAgICAgPC9Qcmlvcml0eT4KLSAgICAgICAgIDxvYmplY3QgY2xhc3M9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXcob3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24pIiBpZD0iR2VvU2hhcGUiPgotICAgICAgICAJIDxtZXRob2QgbmFtZT0iZ2V0VHlwZSgpIiB2YWx1ZT0ib3ZhbCx0cmlhbmdsZSxyZWN0YW5nbGUsc2hhZG93UmVjdGFuZ2xlLHJlY3RhbmdsZTNELHJvdW5kUmVjdGFuZ2xlLGhleGFnb24sb2N0YWdvbixwZW50YWdvbixkaWFtb25kLGN5bGluZGVyLGxpbmUiLz4KLQkgICAgIDwvb2JqZWN0PgotICAgICAgICAgPGNvbnRleHQgZWxlbWVudHM9Ikdlb1NoYXBlIj4KLSAgICAgICAgIDwvY29udGV4dD4KLSAgICAgIDwvSWNvblByb3ZpZGVyPgotICAgPC9leHRlbnNpb24+Ci0KLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXJQcm92aWRlcnMiPgotICAgICAgPFBhcnNlclByb3ZpZGVyIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQucHJvdmlkZXJzLkRpYWdyYW1QYXJzZXJQcm92aWRlciI+Ci0gICAgICAgICA8UHJpb3JpdHkgbmFtZT0iTG93ZXN0Ii8+Ci0gICAgICA8L1BhcnNlclByb3ZpZGVyPgotICAgPC9leHRlbnNpb24+Ci0KLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuZWxlbWVudFR5cGVzIj4KLQotICAgICAgPG1ldGFtb2RlbCBuc1VSST0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvZGlhZ3JhbS8xLjAuMC9kaWFncmFtLmVjb3JlIj4KLSAgICAgICAgIDxtZXRhbW9kZWxUeXBlCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLkFjdGl2aXR5RGV0YWlsRGlhZ3JhbV83OSIKLSAgICAgICAgICAgICAgIGtpbmQ9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuSUhpbnRlZFR5cGUiCi0gICAgICAgICAgICAgICBlY2xhc3M9IkFjdGl2aXR5RGV0YWlsRGlhZ3JhbSIKLSAgICAgICAgICAgICAgIGVkaXRoZWxwZXI9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LmhlbHBlcnMuQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdEhlbHBlciI+Ci0gICAgICAgICAgICA8cGFyYW0gbmFtZT0ic2VtYW50aWNIaW50IiB2YWx1ZT0iNzkiLz4KLSAgICAgICAgIDwvbWV0YW1vZGVsVHlwZT4KLSAgICAgIDwvbWV0YW1vZGVsPgotCi0gICAgICA8bWV0YW1vZGVsIG5zVVJJPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi9kaWFncmFtLzEuMC4wL2RpYWdyYW0uZWNvcmUiPgotICAgICAgICAgPG1ldGFtb2RlbFR5cGUKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuUm9sZU5vZGVfMjAwMSIKLSAgICAgICAgICAgICAgIG5hbWU9IlJvbGVOb2RlIgotICAgICAgICAgICAgICAga2luZD0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5JSGludGVkVHlwZSIKLSAgICAgICAgICAgICAgIGVjbGFzcz0iUm9sZU5vZGUiCi0gICAgICAgICAgICAgICBlZGl0aGVscGVyPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5oZWxwZXJzLlJvbGVOb2RlRWRpdEhlbHBlciI+Ci0gICAgICAgICAgICA8cGFyYW0gbmFtZT0ic2VtYW50aWNIaW50IiB2YWx1ZT0iMjAwMSIvPgotICAgICAgICAgPC9tZXRhbW9kZWxUeXBlPgotICAgICAgPC9tZXRhbW9kZWw+Ci0KLSAgICAgIDxtZXRhbW9kZWwgbnNVUkk9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL2RpYWdyYW0vMS4wLjAvZGlhZ3JhbS5lY29yZSI+Ci0gICAgICAgICA8bWV0YW1vZGVsVHlwZQotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5UYXNrTm9kZV8yMDAyIgotICAgICAgICAgICAgICAgbmFtZT0iVGFza05vZGUiCi0gICAgICAgICAgICAgICBraW5kPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLklIaW50ZWRUeXBlIgotICAgICAgICAgICAgICAgZWNsYXNzPSJUYXNrTm9kZSIKLSAgICAgICAgICAgICAgIGVkaXRoZWxwZXI9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LmhlbHBlcnMuVGFza05vZGVFZGl0SGVscGVyIj4KLSAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJzZW1hbnRpY0hpbnQiIHZhbHVlPSIyMDAyIi8+Ci0gICAgICAgICA8L21ldGFtb2RlbFR5cGU+Ci0gICAgICA8L21ldGFtb2RlbD4KLQotICAgICAgPG1ldGFtb2RlbCBuc1VSST0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvZGlhZ3JhbS8xLjAuMC9kaWFncmFtLmVjb3JlIj4KLSAgICAgICAgIDxtZXRhbW9kZWxUeXBlCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLldvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVfMjAwMyIKLSAgICAgICAgICAgICAgIG5hbWU9IldvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGUiCi0gICAgICAgICAgICAgICBraW5kPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLklIaW50ZWRUeXBlIgotICAgICAgICAgICAgICAgZWNsYXNzPSJXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlIgotICAgICAgICAgICAgICAgZWRpdGhlbHBlcj0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQuaGVscGVycy5Xb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlRWRpdEhlbHBlciI+Ci0gICAgICAgICAgICA8cGFyYW0gbmFtZT0ic2VtYW50aWNIaW50IiB2YWx1ZT0iMjAwMyIvPgotICAgICAgICAgPC9tZXRhbW9kZWxUeXBlPgotICAgICAgPC9tZXRhbW9kZWw+Ci0KLSAgICAgIDxtZXRhbW9kZWwgbnNVUkk9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL2RpYWdyYW0vMS4wLjAvZGlhZ3JhbS5lY29yZSI+Ci0gICAgICAgICA8bWV0YW1vZGVsVHlwZQotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5Sb2xlVGFza0NvbXBvc2l0ZV8xMDAxIgotICAgICAgICAgICAgICAgbmFtZT0iUm9sZVRhc2tDb21wb3NpdGUiCi0gICAgICAgICAgICAgICBraW5kPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLklIaW50ZWRUeXBlIgotICAgICAgICAgICAgICAgZWNsYXNzPSJSb2xlVGFza0NvbXBvc2l0ZSIKLSAgICAgICAgICAgICAgIGVkaXRoZWxwZXI9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LmhlbHBlcnMuUm9sZVRhc2tDb21wb3NpdGVFZGl0SGVscGVyIj4KLSAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJzZW1hbnRpY0hpbnQiIHZhbHVlPSIxMDAxIi8+Ci0gICAgICAgICA8L21ldGFtb2RlbFR5cGU+Ci0gICAgICA8L21ldGFtb2RlbD4KLQotICAgICAgPG1ldGFtb2RlbCBuc1VSST0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvZGlhZ3JhbS8xLjAuMC9kaWFncmFtLmVjb3JlIj4KLSAgICAgICAgIDxtZXRhbW9kZWxUeXBlCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLldvcmtQcm9kdWN0Q29tcG9zaXRlXzEwMDIiCi0gICAgICAgICAgICAgICBuYW1lPSJXb3JrUHJvZHVjdENvbXBvc2l0ZSIKLSAgICAgICAgICAgICAgIGtpbmQ9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuSUhpbnRlZFR5cGUiCi0gICAgICAgICAgICAgICBlY2xhc3M9IldvcmtQcm9kdWN0Q29tcG9zaXRlIgotICAgICAgICAgICAgICAgZWRpdGhlbHBlcj0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQuaGVscGVycy5Xb3JrUHJvZHVjdENvbXBvc2l0ZUVkaXRIZWxwZXIiPgotICAgICAgICAgICAgPHBhcmFtIG5hbWU9InNlbWFudGljSGludCIgdmFsdWU9IjEwMDIiLz4KLSAgICAgICAgIDwvbWV0YW1vZGVsVHlwZT4KLSAgICAgIDwvbWV0YW1vZGVsPgotCi0gICAgICA8bWV0YW1vZGVsIG5zVVJJPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi9kaWFncmFtLzEuMC4wL2RpYWdyYW0uZWNvcmUiPgotICAgICAgICAgPG1ldGFtb2RlbFR5cGUKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuTGlua18zMDAxIgotICAgICAgICAgICAgICAgbmFtZT0iJWVsZW1lbnRfdHlwZV9jb250cm9sX2Zsb3ciCi0gICAgICAgICAgICAgICBraW5kPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLklIaW50ZWRUeXBlIgotICAgICAgICAgICAgICAgZWNsYXNzPSJMaW5rIgotICAgICAgICAgICAgICAgZWRpdGhlbHBlcj0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQuaGVscGVycy5MaW5rRWRpdEhlbHBlciI+Ci0gICAgICAgICAgICA8cGFyYW0gbmFtZT0ic2VtYW50aWNIaW50IiB2YWx1ZT0iMzAwMSIvPgotICAgICAgICAgPC9tZXRhbW9kZWxUeXBlPgotICAgICAgPC9tZXRhbW9kZWw+Ci0gICA8L2V4dGVuc2lvbj4KLQotICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5lbGVtZW50VHlwZUJpbmRpbmdzIj4KLSAgICAgIDxjbGllbnRDb250ZXh0IGlkPSJBRERDbGllbnRDb250ZXh0Ij4KLSAgICAgICAgIDxlbmFibGVtZW50PgotICAgICAgICAgICAgPHRlc3QKLSAgICAgICAgICAgICAgIHByb3BlcnR5PSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29yZS5lZGl0aW5nRG9tYWluIgotICAgICAgICAgICAgICAgdmFsdWU9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLkVkaXRpbmdEb21haW4iLz4KLSAgICAgICAgIDwvZW5hYmxlbWVudD4KLSAgICAgIDwvY2xpZW50Q29udGV4dD4gCi0gICAgICA8YmluZGluZyBjb250ZXh0PSJBRERDbGllbnRDb250ZXh0Ij4KLSAgICAgICAgIDxlbGVtZW50VHlwZSByZWY9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5BY3Rpdml0eURldGFpbERpYWdyYW1fNzkiLz4KLSAgICAgICAgIDxlbGVtZW50VHlwZSByZWY9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5Sb2xlTm9kZV8yMDAxIi8+Ci0gICAgICAgICA8ZWxlbWVudFR5cGUgcmVmPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuVGFza05vZGVfMjAwMiIvPgotICAgICAgICAgPGVsZW1lbnRUeXBlIHJlZj0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLldvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVfMjAwMyIvPgotICAgICAgICAgPGVsZW1lbnRUeXBlIHJlZj0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLlJvbGVUYXNrQ29tcG9zaXRlXzEwMDEiLz4KLSAgICAgICAgIDxlbGVtZW50VHlwZSByZWY9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5Xb3JrUHJvZHVjdENvbXBvc2l0ZV8xMDAyIi8+Ci0gICAgICAgICA8ZWxlbWVudFR5cGUgcmVmPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuTGlua18zMDAxIi8+Ci0gICAgICAgICA8YWR2aWNlIHJlZj0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmFkdmljZS5ub3RhdGlvbkRlcGRlbmRlbnRzIi8+Ci0gICAgICAgICA8ZWxlbWVudFR5cGUgcGF0dGVybj0iLioiLz4KLSAgICAgIDwvYmluZGluZz4KLSAgIDwvZXh0ZW5zaW9uPgotCi08L3BsdWdpbj4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL0FEREltYWdlcy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvQURESW1hZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0Mzg1ZWEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvQURESW1hZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy9BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vL2FyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy93aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy9odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vQ29udHJpYnV0b3JzOgotLy9JQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQucGFydC5BY3Rpdml0eURldGFpbERpYWdyYW1FZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4yCi0gKi8KLXB1YmxpYyBjbGFzcyBBRERJbWFnZXMgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVMQ0wxNiA9ICJmdWxsL2VsY2wxNi8iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRExDTDE2ID0gImZ1bGwvZGxjbDE2LyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFVE9PTDE2ID0gImZ1bGwvZXRvb2wxNi8iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRFRPT0wxNiA9ICJmdWxsL2R0b29sMTYvIjsgLy8kTk9OLU5MUy0xJAotCQotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19QQVRIX1JFU0VUX0RJQUdSQU1fTEFZT1VUID0gRUxDTDE2ICsgInJlc2V0X2RpYWdyYW0uZ2lmIjsgLy8kTk9OLU5MUy0xJAkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfUEFUSF9FRElUT1IgPSBFVE9PTDE2ICsgIkFEREVkaXRvci5naWYiOyAvLyROT04tTkxTLTEkCQotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElTQUJMRURfSU1HX1BBVEhfUkVTRVRfRElBR1JBTV9MQVlPVVQgPSBETENMMTYgKyAicmVzZXRfZGlhZ3JhbS5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElTQUJMRURfSU1HX1BBVEhfRURJVE9SID0gRFRPT0wxNiArICJBRERFZGl0b3IuZ2lmIjsgLy8kTk9OLU5MUy0xJAkKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBESVNBQkxFRF9JTUdfREVTQ19SRVNFVF9ESUFHUkFNX0xBWU9VVCA9IEFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvclBsdWdpbgotCQkJLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoCi0JCQkJCURJU0FCTEVEX0lNR19QQVRIX1JFU0VUX0RJQUdSQU1fTEFZT1VUKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBESVNBQkxFRF9JTUdfREVTQ19FRElUT1IgPSBBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0b3JQbHVnaW4KLQkJCS5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKERJU0FCTEVEX0lNR19QQVRIX0VESVRPUik7CQkKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBJTUdfREVTQ19SRVNFVF9ESUFHUkFNX0xBWU9VVCA9IEFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvclBsdWdpbgotCQkJLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoSU1HX1BBVEhfUkVTRVRfRElBR1JBTV9MQVlPVVQpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIElNR19ERVNDX0VESVRPUiA9IEFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvclBsdWdpbgotCQkJLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoSU1HX1BBVEhfRURJVE9SKTsJCQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9BY3Rpdml0eURldGFpbERpYWdyYW1QbHVnaW4uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL0FjdGl2aXR5RGV0YWlsRGlhZ3JhbVBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YjVjN2FkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL0FjdGl2aXR5RGV0YWlsRGlhZ3JhbVBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS5BYnN0cmFjdFBsdWdpbjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotLyoqCi0gKiBUaGUgYWN0aXZhdG9yIGNsYXNzIGNvbnRyb2xzIHRoZSBwbHVnLWluIGxpZmUgY3ljbGUKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4yCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eURldGFpbERpYWdyYW1QbHVnaW4gZXh0ZW5kcyBBYnN0cmFjdFBsdWdpbiB7Ci0KLQkvLyBUaGUgcGx1Zy1pbiBJRAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQiOwkvLyROT04tTkxTLTEkCi0KLQkvLyBUaGUgc2hhcmVkIGluc3RhbmNlCi0JcHJpdmF0ZSBzdGF0aWMgQWN0aXZpdHlEZXRhaWxEaWFncmFtUGx1Z2luIHBsdWdpbjsKLQkKLQkvKioKLQkgKiBUaGUgY29uc3RydWN0b3IKLQkgKi8KLQlwdWJsaWMgQWN0aXZpdHlEZXRhaWxEaWFncmFtUGx1Z2luKCkgewotCQlwbHVnaW4gPSB0aGlzOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW4jc3RhcnQob3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQpCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RhcnQoY29udGV4dCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbiNzdG9wKG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcGx1Z2luID0gbnVsbDsKLQkJc3VwZXIuc3RvcChjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaGFyZWQgaW5zdGFuY2UKLQkgKgotCSAqIEByZXR1cm4gdGhlIHNoYXJlZCBpbnN0YW5jZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgQWN0aXZpdHlEZXRhaWxEaWFncmFtUGx1Z2luIGdldERlZmF1bHQoKSB7Ci0JCXJldHVybiBwbHVnaW47Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L2NvbW1hbmRzL0RpYWdyYW1SZW9yaWVudENvbm5lY3Rpb25WaWV3Q29tbWFuZC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9jb21tYW5kcy9EaWFncmFtUmVvcmllbnRDb25uZWN0aW9uVmlld0NvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTY1ZGQ5My4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L2NvbW1hbmRzL0RpYWdyYW1SZW9yaWVudENvbm5lY3Rpb25WaWV3Q29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQuY29tbWFuZHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5UcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS5jb21tYW5kLkNvbW1hbmRSZXN1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvbW1hbmRzLmNvcmUuY29tbWFuZC5BYnN0cmFjdFRyYW5zYWN0aW9uYWxDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkVkZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEaWFncmFtUmVvcmllbnRDb25uZWN0aW9uVmlld0NvbW1hbmQgZXh0ZW5kcwotCQlBYnN0cmFjdFRyYW5zYWN0aW9uYWxDb21tYW5kIHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIElBZGFwdGFibGUgZWRnZUFkYXB0b3I7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERpYWdyYW1SZW9yaWVudENvbm5lY3Rpb25WaWV3Q29tbWFuZCgKLQkJCVRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIGVkaXRpbmdEb21haW4sIFN0cmluZyBsYWJlbCkgewotCQlzdXBlcihlZGl0aW5nRG9tYWluLCBsYWJlbCwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldEFmZmVjdGVkRmlsZXMoKSB7Ci0JCVZpZXcgdmlldyA9IChWaWV3KSBlZGdlQWRhcHRvci5nZXRBZGFwdGVyKFZpZXcuY2xhc3MpOwotCQlpZiAodmlldyAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gZ2V0V29ya3NwYWNlRmlsZXModmlldyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldEFmZmVjdGVkRmlsZXMoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElBZGFwdGFibGUgZ2V0RWRnZUFkYXB0b3IoKSB7Ci0JCXJldHVybiBlZGdlQWRhcHRvcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RWRnZUFkYXB0b3IoSUFkYXB0YWJsZSBlZGdlQWRhcHRvcikgewotCQl0aGlzLmVkZ2VBZGFwdG9yID0gZWRnZUFkYXB0b3I7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kUmVzdWx0IGRvRXhlY3V0ZVdpdGhSZXN1bHQoCi0JCQlJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzTW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB7Ci0JCWFzc2VydCBudWxsICE9IGVkZ2VBZGFwdG9yIDogIk51bGwgY2hpbGQgaW4gRGlhZ3JhbVJlb3JpZW50Q29ubmVjdGlvblZpZXdDb21tYW5kIjsgLy8kTk9OLU5MUy0xJAotCQlFZGdlIGVkZ2UgPSAoRWRnZSkgZ2V0RWRnZUFkYXB0b3IoKS5nZXRBZGFwdGVyKEVkZ2UuY2xhc3MpOwotCQlhc3NlcnQgbnVsbCAhPSBlZGdlIDogIk51bGwgZWRnZSBpbiBEaWFncmFtUmVvcmllbnRDb25uZWN0aW9uVmlld0NvbW1hbmQiOyAvLyROT04tTkxTLTEkCi0KLQkJVmlldyB0ZW1wVmlldyA9IGVkZ2UuZ2V0U291cmNlKCk7Ci0JCWVkZ2Uuc2V0U291cmNlKGVkZ2UuZ2V0VGFyZ2V0KCkpOwotCQllZGdlLnNldFRhcmdldCh0ZW1wVmlldyk7Ci0KLQkJcmV0dXJuIENvbW1hbmRSZXN1bHQubmV3T0tDb21tYW5kUmVzdWx0KCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9jb21tYW5kcy9MaW5rQ3JlYXRlQ29tbWFuZC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9jb21tYW5kcy9MaW5rQ3JlYXRlQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MGMwOTI2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvY29tbWFuZHMvTGlua0NyZWF0ZUNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LmNvbW1hbmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTW9kZWxQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLmNvbW1hbmRzLkNyZWF0ZVJlbGF0aW9uc2hpcENvbW1hbmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkNyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3Q7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgTGlua0NyZWF0ZUNvbW1hbmQgZXh0ZW5kcyBDcmVhdGVSZWxhdGlvbnNoaXBDb21tYW5kIHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIE5vZGUgbXlDb250YWluZXI7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBOb2RlIG15U291cmNlOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgTm9kZSBteVRhcmdldDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlua0NyZWF0ZUNvbW1hbmQoQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdCByZXEsIE5vZGUgY29udGFpbmVyLAotCQkJTm9kZSBzb3VyY2UsIE5vZGUgdGFyZ2V0KSB7Ci0JCXN1cGVyKHJlcSk7Ci0JCXN1cGVyLnNldEVsZW1lbnRUb0VkaXQoY29udGFpbmVyKTsKLQkJbXlDb250YWluZXIgPSBjb250YWluZXI7Ci0JCW15U291cmNlID0gc291cmNlOwotCQlteVRhcmdldCA9IHRhcmdldDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vZGUgZ2V0Q29udGFpbmVyKCkgewotCQlyZXR1cm4gbXlDb250YWluZXI7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFT2JqZWN0IGdldFNvdXJjZSgpIHsKLQkJcmV0dXJuIG15U291cmNlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRU9iamVjdCBnZXRUYXJnZXQoKSB7Ci0JCXJldHVybiBteVRhcmdldDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBnZXRFQ2xhc3NUb0VkaXQoKSB7Ci0JCXJldHVybiBNb2RlbFBhY2thZ2UuZUlOU1RBTkNFLmdldE5vZGUoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0RWxlbWVudFRvRWRpdChFT2JqZWN0IGVsZW1lbnQpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFT2JqZWN0IGRvRGVmYXVsdEVsZW1lbnRDcmVhdGlvbigpIHsKLQkJTGluayBuZXdFbGVtZW50ID0gKExpbmspIHN1cGVyLmRvRGVmYXVsdEVsZW1lbnRDcmVhdGlvbigpOwotCQlpZiAobmV3RWxlbWVudCAhPSBudWxsKSB7Ci0JCQluZXdFbGVtZW50LnNldFRhcmdldChteVRhcmdldCk7Ci0JCQluZXdFbGVtZW50LnNldFNvdXJjZShteVNvdXJjZSk7Ci0JCX0KLQkJcmV0dXJuIG5ld0VsZW1lbnQ7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L2NvbW1hbmRzL0xpbmtSZW9yaWVudENvbW1hbmQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvY29tbWFuZHMvTGlua1Jlb3JpZW50Q29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNGFhMzEwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvY29tbWFuZHMvTGlua1Jlb3JpZW50Q29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQuY29tbWFuZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wb2xpY2llcy5EaWFncmFtQmFzZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi5jb3JlLmNvbW1hbmQuQ29tbWFuZFJlc3VsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLmNvbW1hbmRzLkVkaXRFbGVtZW50Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLlJlb3JpZW50UmVsYXRpb25zaGlwUmVxdWVzdDsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBMaW5rUmVvcmllbnRDb21tYW5kIGV4dGVuZHMgRWRpdEVsZW1lbnRDb21tYW5kIHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIGZpbmFsIGludCByZW9yaWVudERpcmVjdGlvbjsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIGZpbmFsIEVPYmplY3Qgb2xkRW5kOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgZmluYWwgRU9iamVjdCBuZXdFbmQ7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpbmtSZW9yaWVudENvbW1hbmQoUmVvcmllbnRSZWxhdGlvbnNoaXBSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJc3VwZXIocmVxdWVzdC5nZXRMYWJlbCgpLCByZXF1ZXN0LmdldFJlbGF0aW9uc2hpcCgpLCByZXF1ZXN0KTsKLQkJcmVvcmllbnREaXJlY3Rpb24gPSByZXF1ZXN0LmdldERpcmVjdGlvbigpOwotCQlvbGRFbmQgPSByZXF1ZXN0LmdldE9sZFJlbGF0aW9uc2hpcEVuZCgpOwotCQluZXdFbmQgPSByZXF1ZXN0LmdldE5ld1JlbGF0aW9uc2hpcEVuZCgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjYW5FeGVjdXRlKCkgewotCQlpZiAoIShnZXRFbGVtZW50VG9FZGl0KCkgaW5zdGFuY2VvZiBMaW5rKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWlmIChyZW9yaWVudERpcmVjdGlvbiA9PSBSZW9yaWVudFJlbGF0aW9uc2hpcFJlcXVlc3QuUkVPUklFTlRfU09VUkNFKSB7Ci0JCQlyZXR1cm4gY2FuUmVvcmllbnRTb3VyY2UoKTsKLQkJfQotCQlpZiAocmVvcmllbnREaXJlY3Rpb24gPT0gUmVvcmllbnRSZWxhdGlvbnNoaXBSZXF1ZXN0LlJFT1JJRU5UX1RBUkdFVCkgewotCQkJcmV0dXJuIGNhblJlb3JpZW50VGFyZ2V0KCk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBjYW5SZW9yaWVudFNvdXJjZSgpIHsKLQkJaWYgKCEob2xkRW5kIGluc3RhbmNlb2YgTm9kZSAmJiBuZXdFbmQgaW5zdGFuY2VvZiBOb2RlKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCU5vZGUgdGFyZ2V0ID0gZ2V0TGluaygpLmdldFRhcmdldCgpOwotCQlpZiAoIShnZXRMaW5rKCkuZUNvbnRhaW5lcigpIGluc3RhbmNlb2YgTm9kZSkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlOb2RlIGNvbnRhaW5lciA9IChOb2RlKSBnZXRMaW5rKCkuZUNvbnRhaW5lcigpOwotCQlyZXR1cm4gRGlhZ3JhbUJhc2VJdGVtU2VtYW50aWNFZGl0UG9saWN5LkxpbmtDb25zdHJhaW50cwotCQkJCS5jYW5FeGlzdExpbmtfMzAwMShjb250YWluZXIsIGdldE5ld1NvdXJjZSgpLCB0YXJnZXQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBjYW5SZW9yaWVudFRhcmdldCgpIHsKLQkJaWYgKCEob2xkRW5kIGluc3RhbmNlb2YgTm9kZSAmJiBuZXdFbmQgaW5zdGFuY2VvZiBOb2RlKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCU5vZGUgc291cmNlID0gZ2V0TGluaygpLmdldFNvdXJjZSgpOwotCQlpZiAoIShnZXRMaW5rKCkuZUNvbnRhaW5lcigpIGluc3RhbmNlb2YgTm9kZSkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlOb2RlIGNvbnRhaW5lciA9IChOb2RlKSBnZXRMaW5rKCkuZUNvbnRhaW5lcigpOwotCQlyZXR1cm4gRGlhZ3JhbUJhc2VJdGVtU2VtYW50aWNFZGl0UG9saWN5LkxpbmtDb25zdHJhaW50cwotCQkJCS5jYW5FeGlzdExpbmtfMzAwMShjb250YWluZXIsIHNvdXJjZSwgZ2V0TmV3VGFyZ2V0KCkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZFJlc3VsdCBkb0V4ZWN1dGVXaXRoUmVzdWx0KElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwKLQkJCUlBZGFwdGFibGUgaW5mbykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCWlmICghY2FuRXhlY3V0ZSgpKSB7Ci0JCQl0aHJvdyBuZXcgRXhlY3V0aW9uRXhjZXB0aW9uKAotCQkJCQkiSW52YWxpZCBhcmd1bWVudHMgaW4gcmVvcmllbnQgbGluayBjb21tYW5kIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlpZiAocmVvcmllbnREaXJlY3Rpb24gPT0gUmVvcmllbnRSZWxhdGlvbnNoaXBSZXF1ZXN0LlJFT1JJRU5UX1NPVVJDRSkgewotCQkJcmV0dXJuIHJlb3JpZW50U291cmNlKCk7Ci0JCX0KLQkJaWYgKHJlb3JpZW50RGlyZWN0aW9uID09IFJlb3JpZW50UmVsYXRpb25zaGlwUmVxdWVzdC5SRU9SSUVOVF9UQVJHRVQpIHsKLQkJCXJldHVybiByZW9yaWVudFRhcmdldCgpOwotCQl9Ci0JCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmRSZXN1bHQgcmVvcmllbnRTb3VyY2UoKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJZ2V0TGluaygpLnNldFNvdXJjZShnZXROZXdTb3VyY2UoKSk7Ci0JCXJldHVybiBDb21tYW5kUmVzdWx0Lm5ld09LQ29tbWFuZFJlc3VsdChnZXRMaW5rKCkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZFJlc3VsdCByZW9yaWVudFRhcmdldCgpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCQlnZXRMaW5rKCkuc2V0VGFyZ2V0KGdldE5ld1RhcmdldCgpKTsKLQkJcmV0dXJuIENvbW1hbmRSZXN1bHQubmV3T0tDb21tYW5kUmVzdWx0KGdldExpbmsoKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBMaW5rIGdldExpbmsoKSB7Ci0JCXJldHVybiAoTGluaykgZ2V0RWxlbWVudFRvRWRpdCgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTm9kZSBnZXRPbGRTb3VyY2UoKSB7Ci0JCXJldHVybiAoTm9kZSkgb2xkRW5kOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTm9kZSBnZXROZXdTb3VyY2UoKSB7Ci0JCXJldHVybiAoTm9kZSkgbmV3RW5kOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTm9kZSBnZXRPbGRUYXJnZXQoKSB7Ci0JCXJldHVybiAoTm9kZSkgb2xkRW5kOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTm9kZSBnZXROZXdUYXJnZXQoKSB7Ci0JCXJldHVybiAoTm9kZSkgbmV3RW5kOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvY29tbWFuZHMvUm9sZU5vZGVDcmVhdGVDb21tYW5kLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L2NvbW1hbmRzL1JvbGVOb2RlQ3JlYXRlQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzcyZTZiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvY29tbWFuZHMvUm9sZU5vZGVDcmVhdGVDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LmNvbW1hbmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk1vZGVsUGFja2FnZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuY29tbWFuZHMuQ3JlYXRlRWxlbWVudENvbW1hbmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkNyZWF0ZUVsZW1lbnRSZXF1ZXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBSb2xlTm9kZUNyZWF0ZUNvbW1hbmQgZXh0ZW5kcyBDcmVhdGVFbGVtZW50Q29tbWFuZCB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJvbGVOb2RlQ3JlYXRlQ29tbWFuZChDcmVhdGVFbGVtZW50UmVxdWVzdCByZXEpIHsKLQkJc3VwZXIocmVxKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBnZXRFQ2xhc3NUb0VkaXQoKSB7Ci0JCXJldHVybiBNb2RlbFBhY2thZ2UuZUlOU1RBTkNFLmdldE5vZGVDb250YWluZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVPYmplY3QgZ2V0RWxlbWVudFRvRWRpdCgpIHsKLQkJRU9iamVjdCBjb250YWluZXIgPSAoKENyZWF0ZUVsZW1lbnRSZXF1ZXN0KSBnZXRSZXF1ZXN0KCkpCi0JCQkJLmdldENvbnRhaW5lcigpOwotCQlpZiAoY29udGFpbmVyIGluc3RhbmNlb2YgVmlldykgewotCQkJY29udGFpbmVyID0gKChWaWV3KSBjb250YWluZXIpLmdldEVsZW1lbnQoKTsKLQkJfQotCQlyZXR1cm4gY29udGFpbmVyOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9jb21tYW5kcy9Sb2xlVGFza0NvbXBvc2l0ZUNyZWF0ZUNvbW1hbmQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvY29tbWFuZHMvUm9sZVRhc2tDb21wb3NpdGVDcmVhdGVDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2OTA5YTcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9jb21tYW5kcy9Sb2xlVGFza0NvbXBvc2l0ZUNyZWF0ZUNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQuY29tbWFuZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTW9kZWxQYWNrYWdlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5jb21tYW5kcy5DcmVhdGVFbGVtZW50Q29tbWFuZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ3JlYXRlRWxlbWVudFJlcXVlc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFJvbGVUYXNrQ29tcG9zaXRlQ3JlYXRlQ29tbWFuZCBleHRlbmRzIENyZWF0ZUVsZW1lbnRDb21tYW5kIHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUm9sZVRhc2tDb21wb3NpdGVDcmVhdGVDb21tYW5kKENyZWF0ZUVsZW1lbnRSZXF1ZXN0IHJlcSkgewotCQlzdXBlcihyZXEpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGdldEVDbGFzc1RvRWRpdCgpIHsKLQkJcmV0dXJuIE1vZGVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Tm9kZUNvbnRhaW5lcigpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRU9iamVjdCBnZXRFbGVtZW50VG9FZGl0KCkgewotCQlFT2JqZWN0IGNvbnRhaW5lciA9ICgoQ3JlYXRlRWxlbWVudFJlcXVlc3QpIGdldFJlcXVlc3QoKSkKLQkJCQkuZ2V0Q29udGFpbmVyKCk7Ci0JCWlmIChjb250YWluZXIgaW5zdGFuY2VvZiBWaWV3KSB7Ci0JCQljb250YWluZXIgPSAoKFZpZXcpIGNvbnRhaW5lcikuZ2V0RWxlbWVudCgpOwotCQl9Ci0JCXJldHVybiBjb250YWluZXI7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L2NvbW1hbmRzL1Rhc2tOb2RlQ3JlYXRlQ29tbWFuZC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9jb21tYW5kcy9UYXNrTm9kZUNyZWF0ZUNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTEyYzk1MC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L2NvbW1hbmRzL1Rhc2tOb2RlQ3JlYXRlQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5jb21tYW5kczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Nb2RlbFBhY2thZ2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLmNvbW1hbmRzLkNyZWF0ZUVsZW1lbnRDb21tYW5kOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5DcmVhdGVFbGVtZW50UmVxdWVzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgVGFza05vZGVDcmVhdGVDb21tYW5kIGV4dGVuZHMgQ3JlYXRlRWxlbWVudENvbW1hbmQgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUYXNrTm9kZUNyZWF0ZUNvbW1hbmQoQ3JlYXRlRWxlbWVudFJlcXVlc3QgcmVxKSB7Ci0JCXN1cGVyKHJlcSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZ2V0RUNsYXNzVG9FZGl0KCkgewotCQlyZXR1cm4gTW9kZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXROb2RlQ29udGFpbmVyKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFT2JqZWN0IGdldEVsZW1lbnRUb0VkaXQoKSB7Ci0JCUVPYmplY3QgY29udGFpbmVyID0gKChDcmVhdGVFbGVtZW50UmVxdWVzdCkgZ2V0UmVxdWVzdCgpKQotCQkJCS5nZXRDb250YWluZXIoKTsKLQkJaWYgKGNvbnRhaW5lciBpbnN0YW5jZW9mIFZpZXcpIHsKLQkJCWNvbnRhaW5lciA9ICgoVmlldykgY29udGFpbmVyKS5nZXRFbGVtZW50KCk7Ci0JCX0KLQkJcmV0dXJuIGNvbnRhaW5lcjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvY29tbWFuZHMvV29ya1Byb2R1Y3RDb21wb3NpdGVDcmVhdGVDb21tYW5kLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L2NvbW1hbmRzL1dvcmtQcm9kdWN0Q29tcG9zaXRlQ3JlYXRlQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMzY3ZTZiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvY29tbWFuZHMvV29ya1Byb2R1Y3RDb21wb3NpdGVDcmVhdGVDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LmNvbW1hbmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk1vZGVsUGFja2FnZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuY29tbWFuZHMuQ3JlYXRlRWxlbWVudENvbW1hbmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkNyZWF0ZUVsZW1lbnRSZXF1ZXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBXb3JrUHJvZHVjdENvbXBvc2l0ZUNyZWF0ZUNvbW1hbmQgZXh0ZW5kcyBDcmVhdGVFbGVtZW50Q29tbWFuZCB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFdvcmtQcm9kdWN0Q29tcG9zaXRlQ3JlYXRlQ29tbWFuZChDcmVhdGVFbGVtZW50UmVxdWVzdCByZXEpIHsKLQkJc3VwZXIocmVxKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBnZXRFQ2xhc3NUb0VkaXQoKSB7Ci0JCXJldHVybiBNb2RlbFBhY2thZ2UuZUlOU1RBTkNFLmdldE5vZGVDb250YWluZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVPYmplY3QgZ2V0RWxlbWVudFRvRWRpdCgpIHsKLQkJRU9iamVjdCBjb250YWluZXIgPSAoKENyZWF0ZUVsZW1lbnRSZXF1ZXN0KSBnZXRSZXF1ZXN0KCkpCi0JCQkJLmdldENvbnRhaW5lcigpOwotCQlpZiAoY29udGFpbmVyIGluc3RhbmNlb2YgVmlldykgewotCQkJY29udGFpbmVyID0gKChWaWV3KSBjb250YWluZXIpLmdldEVsZW1lbnQoKTsKLQkJfQotCQlyZXR1cm4gY29udGFpbmVyOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9jb21tYW5kcy9Xb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlQ3JlYXRlQ29tbWFuZC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9jb21tYW5kcy9Xb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlQ3JlYXRlQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYTUzNWQxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvY29tbWFuZHMvV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZUNyZWF0ZUNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQuY29tbWFuZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTW9kZWxQYWNrYWdlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5jb21tYW5kcy5DcmVhdGVFbGVtZW50Q29tbWFuZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ3JlYXRlRWxlbWVudFJlcXVlc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVDcmVhdGVDb21tYW5kIGV4dGVuZHMKLQkJQ3JlYXRlRWxlbWVudENvbW1hbmQgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlQ3JlYXRlQ29tbWFuZChDcmVhdGVFbGVtZW50UmVxdWVzdCByZXEpIHsKLQkJc3VwZXIocmVxKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBnZXRFQ2xhc3NUb0VkaXQoKSB7Ci0JCXJldHVybiBNb2RlbFBhY2thZ2UuZUlOU1RBTkNFLmdldE5vZGVDb250YWluZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVPYmplY3QgZ2V0RWxlbWVudFRvRWRpdCgpIHsKLQkJRU9iamVjdCBjb250YWluZXIgPSAoKENyZWF0ZUVsZW1lbnRSZXF1ZXN0KSBnZXRSZXF1ZXN0KCkpCi0JCQkJLmdldENvbnRhaW5lcigpOwotCQlpZiAoY29udGFpbmVyIGluc3RhbmNlb2YgVmlldykgewotCQkJY29udGFpbmVyID0gKChWaWV3KSBjb250YWluZXIpLmdldEVsZW1lbnQoKTsKLQkJfQotCQlyZXR1cm4gY29udGFpbmVyOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9oZWxwZXJzL0FjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRIZWxwZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvaGVscGVycy9BY3Rpdml0eURldGFpbERpYWdyYW1FZGl0SGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwZTFmYmIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9oZWxwZXJzL0FjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LmhlbHBlcnM7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdEhlbHBlciBleHRlbmRzIERpYWdyYW1CYXNlRWRpdEhlbHBlciB7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9oZWxwZXJzL0RpYWdyYW1CYXNlRWRpdEhlbHBlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9oZWxwZXJzL0RpYWdyYW1CYXNlRWRpdEhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYjkxZGJmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvaGVscGVycy9EaWFncmFtQmFzZUVkaXRIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LmhlbHBlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS5jb21tYW5kLkNvbXBvc2l0ZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUuY29tbWFuZC5JQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLmVkaXRoZWxwZXIuQWJzdHJhY3RFZGl0SGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ3JlYXRlRWxlbWVudFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5DcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuRGVzdHJveUVsZW1lbnRSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuRGVzdHJveVJlZmVyZW5jZVJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5JRWRpdENvbW1hbmRSZXF1ZXN0OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERpYWdyYW1CYXNlRWRpdEhlbHBlciBleHRlbmRzIEFic3RyYWN0RWRpdEhlbHBlciB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRURJVF9QT0xJQ1lfQ09NTUFORCA9ICJlZGl0IHBvbGljeSBjb21tYW5kIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJQ29tbWFuZCBnZXRJbnN0ZWFkQ29tbWFuZChJRWRpdENvbW1hbmRSZXF1ZXN0IHJlcSkgewotCQlJQ29tbWFuZCBlcENvbW1hbmQgPSAoSUNvbW1hbmQpIHJlcS5nZXRQYXJhbWV0ZXIoRURJVF9QT0xJQ1lfQ09NTUFORCk7Ci0JCXJlcS5zZXRQYXJhbWV0ZXIoRURJVF9QT0xJQ1lfQ09NTUFORCwgbnVsbCk7Ci0JCUlDb21tYW5kIGVoQ29tbWFuZCA9IHN1cGVyLmdldEluc3RlYWRDb21tYW5kKHJlcSk7Ci0JCWlmIChlcENvbW1hbmQgPT0gbnVsbCkgewotCQkJcmV0dXJuIGVoQ29tbWFuZDsKLQkJfQotCQlpZiAoZWhDb21tYW5kID09IG51bGwpIHsKLQkJCXJldHVybiBlcENvbW1hbmQ7Ci0JCX0KLQkJQ29tcG9zaXRlQ29tbWFuZCBjb21tYW5kID0gbmV3IENvbXBvc2l0ZUNvbW1hbmQobnVsbCk7Ci0JCWNvbW1hbmQuYWRkKGVwQ29tbWFuZCk7Ci0JCWNvbW1hbmQuYWRkKGVoQ29tbWFuZCk7Ci0JCXJldHVybiBjb21tYW5kOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUNvbW1hbmQgZ2V0Q3JlYXRlQ29tbWFuZChDcmVhdGVFbGVtZW50UmVxdWVzdCByZXEpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJQ29tbWFuZCBnZXRDcmVhdGVSZWxhdGlvbnNoaXBDb21tYW5kKAotCQkJQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdCByZXEpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJQ29tbWFuZCBnZXREZXN0cm95RWxlbWVudENvbW1hbmQoRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHJlcSkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElDb21tYW5kIGdldERlc3Ryb3lSZWZlcmVuY2VDb21tYW5kKERlc3Ryb3lSZWZlcmVuY2VSZXF1ZXN0IHJlcSkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9oZWxwZXJzL0xpbmtFZGl0SGVscGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L2hlbHBlcnMvTGlua0VkaXRIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjAxNzdjMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L2hlbHBlcnMvTGlua0VkaXRIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LmhlbHBlcnM7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgTGlua0VkaXRIZWxwZXIgZXh0ZW5kcyBEaWFncmFtQmFzZUVkaXRIZWxwZXIgewotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvaGVscGVycy9Sb2xlTm9kZUVkaXRIZWxwZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvaGVscGVycy9Sb2xlTm9kZUVkaXRIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzdlZTYyZi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L2hlbHBlcnMvUm9sZU5vZGVFZGl0SGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5oZWxwZXJzOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFJvbGVOb2RlRWRpdEhlbHBlciBleHRlbmRzIERpYWdyYW1CYXNlRWRpdEhlbHBlciB7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9oZWxwZXJzL1JvbGVUYXNrQ29tcG9zaXRlRWRpdEhlbHBlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9oZWxwZXJzL1JvbGVUYXNrQ29tcG9zaXRlRWRpdEhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNjYyM2VhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvaGVscGVycy9Sb2xlVGFza0NvbXBvc2l0ZUVkaXRIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LmhlbHBlcnM7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUm9sZVRhc2tDb21wb3NpdGVFZGl0SGVscGVyIGV4dGVuZHMgRGlhZ3JhbUJhc2VFZGl0SGVscGVyIHsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L2hlbHBlcnMvVGFza05vZGVFZGl0SGVscGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L2hlbHBlcnMvVGFza05vZGVFZGl0SGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3N2I0NDAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9oZWxwZXJzL1Rhc2tOb2RlRWRpdEhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQuaGVscGVyczsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBUYXNrTm9kZUVkaXRIZWxwZXIgZXh0ZW5kcyBEaWFncmFtQmFzZUVkaXRIZWxwZXIgewotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvaGVscGVycy9Xb3JrUHJvZHVjdENvbXBvc2l0ZUVkaXRIZWxwZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvaGVscGVycy9Xb3JrUHJvZHVjdENvbXBvc2l0ZUVkaXRIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTlkMzU1MC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L2hlbHBlcnMvV29ya1Byb2R1Y3RDb21wb3NpdGVFZGl0SGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5oZWxwZXJzOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFdvcmtQcm9kdWN0Q29tcG9zaXRlRWRpdEhlbHBlciBleHRlbmRzIERpYWdyYW1CYXNlRWRpdEhlbHBlciB7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9oZWxwZXJzL1dvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVFZGl0SGVscGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L2hlbHBlcnMvV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZUVkaXRIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjQ0NjczOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L2hlbHBlcnMvV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZUVkaXRIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LmhlbHBlcnM7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZUVkaXRIZWxwZXIgZXh0ZW5kcyBEaWFncmFtQmFzZUVkaXRIZWxwZXIgewotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvcGFydHMvQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdFBhcnQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvcGFydHMvQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdFBhcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGIxYjk2Ny4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L3BhcnRzL0FjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRQYXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NjAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucGFydHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5GaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkZyZWVmb3JtTGF5ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkZyZWVmb3JtTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5NYXJnaW5Cb3JkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LkRpbWVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5UcmFuc2FjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLkNvbW1vblBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wb2xpY2llcy5BY3Rpdml0eURldGFpbERpYWdyYW1DYW5vbmljYWxFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBvbGljaWVzLkFjdGl2aXR5RGV0YWlsRGlhZ3JhbUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5wYXJ0LkFic3RyYWN0RGlhZ3JhbUVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnBhcnQuRGlhZ3JhbUVkaXRvcklucHV0UHJveHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5wYXJ0LklEaWFncmFtRWRpdG9ySW5wdXRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnBhcnQudXRpbC5EaWFncmFtRWRpdG9yVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnNlcnZpY2VzLkRpYWdyYW1IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuVGFza05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuV29ya1Byb2R1Y3RDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC51dGlsLlR4VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5Ob2RlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuRGlhZ3JhbUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkVkaXRQb2xpY3lSb2xlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnV0aWwuTWVhc3VyZW1lbnRVbml0SGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5tYXBtb2RlLklNYXBNb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkxvY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm90YXRpb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotCi0vKioKLSAqIEBtb2RpZmllZAotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdFBhcnQgZXh0ZW5kcyBEaWFncmFtRWRpdFBhcnQgewotCi0JUG9pbnQgY2FjaGVkUG9pbnQgPSBuZXcgUG9pbnQoLTEsIC0xKTsKLQotCXByb3RlY3RlZCBib29sZWFuIGRlYnVnID0gZmFsc2U7Ci0KLQlzdGF0aWMgaW50IGNhY2hlZFdpZHRoID0gMTA7Ci0KLQlzdGF0aWMgaW50IGNhY2hlZEhlaWdodCA9IDEwOwotCi0JaW50IHkgPSA2MDsKLQotCWJvb2xlYW4geGF4aXNiZWdpbiA9IGZhbHNlOwotCi0JYm9vbGVhbiBsb2FkaW5nID0gdHJ1ZTsKLQotCWZpbmFsIHN0YXRpYyBpbnQgc3BhY2luZyA9IDQwOwotCi0JZmluYWwgc3RhdGljIGludCB5c3BhY2luZyA9IDIwOwotCi0JYm9vbGVhbiBtaXNjZWxsYW5lb3VzID0gZmFsc2U7Ci0KLQlpbnQgeCA9IDEwOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1VUUFVUUyA9ICJvdXRwdXRzIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5QVVRTID0gImlucHV0cyI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgTGlzdDxFZGl0UGFydD4gcmVjZW50bHlBZGRlZFBhcnRzID0gbmV3IEFycmF5TGlzdDxFZGl0UGFydD4oKTsKLQotCXByaXZhdGUgSU1hcE1vZGUgbWFwTW9kZTsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTU9ERUxfSUQgPSAiQUREIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZJU1VBTF9JRCA9IDc5OwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0UGFydChWaWV3IHZpZXcpIHsKLQkJc3VwZXIodmlldyk7Ci0JCQotCQltYXBNb2RlID0gTWVhc3VyZW1lbnRVbml0SGVscGVyLmdldE1hcE1vZGUodmlldy5nZXREaWFncmFtKCkuZ2V0TWVhc3VyZW1lbnRVbml0KCkpOwotCX0KLQkKLQlwcml2YXRlIFZpZXcgZ2V0VmlldygpIHsKLQkJcmV0dXJuIChWaWV3KSBnZXRNb2RlbCgpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgZG9MYXlvdXQoKSB7Ci0JCUVkaXRQYXJ0Vmlld2VyIHZpZXdlciA9IGdldFZpZXdlcigpOwotCQlpZih2aWV3ZXIgaW5zdGFuY2VvZiBJRGlhZ3JhbUVkaXRvcklucHV0UHJvdmlkZXIpIHsKLQkJCUlFZGl0b3JQYXJ0IGVkaXRvciA9ICgoSURpYWdyYW1FZGl0b3JJbnB1dFByb3ZpZGVyKXZpZXdlcikuZ2V0RWRpdG9yKCk7Ci0JCQlpZihlZGl0b3IgaW5zdGFuY2VvZiBBYnN0cmFjdERpYWdyYW1FZGl0b3IpIHsKLQkJCQkoKEFic3RyYWN0RGlhZ3JhbUVkaXRvcillZGl0b3IpLnJlc2V0TGF5b3V0KCk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuRGlhZ3JhbUVkaXRQYXJ0I2NyZWF0ZUZpZ3VyZSgpCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlRmlndXJlKCkgewotCQlGaWd1cmUgZiA9IG5ldyBGcmVlZm9ybUxheWVyKCkgewotCQkJcHJvdGVjdGVkIHZvaWQgbGF5b3V0KCkgewotCQkJCWlmIChoYXNNaXNwbGFjZWRDaGlsZHJlbigpKSB7Ci0JCQkJCXJlc2V0Q2hpbGRyZW5Mb2NhdGlvbnMoKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCXN1cGVyLmxheW91dCgpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQotCQlmLnNldEJvcmRlcihuZXcgTWFyZ2luQm9yZGVyKDIwKSk7Ci0JCWYuc2V0TGF5b3V0TWFuYWdlcihuZXcgRnJlZWZvcm1MYXlvdXQoKSk7Ci0KLQkJcmV0dXJuIGY7Ci0JfQotCi0JLyoqCi0JICogQ2hlY2tzIHdoZXRoZXIgdGhlcmUgYXJlIGFueSBtaXNwbGFjZWQgY2hpbGRyZW4KLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaGFzTWlzcGxhY2VkQ2hpbGRyZW4oKSB7Ci0JCUxpc3QgbG9jYXRpb25MaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGdldENoaWxkcmVuKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgY2hpbGQgPSBpdGVyLm5leHQoKTsKLQkJCWlmIChjaGlsZCBpbnN0YW5jZW9mIEVkaXRQYXJ0KSB7Ci0JCQkJT2JqZWN0IG1vZGVsID0gKChFZGl0UGFydCkgY2hpbGQpLmdldE1vZGVsKCk7Ci0JCQkJaWYgKG1vZGVsIGluc3RhbmNlb2YgTm9kZSkgewotCQkJCQlOb2RlIG5vZGUgPSAoTm9kZSkgbW9kZWw7Ci0JCQkJCUxvY2F0aW9uIHAgPSAoTG9jYXRpb24pIG5vZGUuZ2V0TGF5b3V0Q29uc3RyYWludCgpOwotCQkJCQlsb2NhdGlvbkxpc3QuYWRkKHApOwotCQkJCQlpZiAoZGVidWcpIHsKLQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTm9kZS0iICsgbm9kZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigibG9jLSIgKyBwKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmIChsb2NhdGlvbkxpc3Quc2l6ZSgpID09IDEpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWlmIChsb2NhdGlvbkxpc3Quc2l6ZSgpID4gMCkgewotCQkJYm9vbGVhbiBuZWVkVG9SZXNldCA9IHRydWU7Ci0KLQkJCWZvciAoaW50IGkgPSAxOyBpIDwgbG9jYXRpb25MaXN0LnNpemUoKTsgaSsrKSB7Ci0JCQkJTG9jYXRpb24gY3VycmVudExvYyA9IChMb2NhdGlvbikgbG9jYXRpb25MaXN0LmdldChpKTsKLQkJCQlMb2NhdGlvbiBwcmV2aW91c0xvYyA9IChMb2NhdGlvbikgbG9jYXRpb25MaXN0LmdldChpIC0gMSk7Ci0JCQkJaWYgKCEoKGN1cnJlbnRMb2MuZ2V0WCgpID09IHByZXZpb3VzTG9jLmdldFgoKSArIDEwKSAmJiAoY3VycmVudExvYwotCQkJCQkJLmdldFkoKSA9PSBwcmV2aW91c0xvYy5nZXRZKCkgKyAxMCkpKSB7Ci0JCQkJCW5lZWRUb1Jlc2V0ID0gZmFsc2U7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBuZWVkVG9SZXNldDsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogUmVzZXQgYWxsIGNoaWxkcmVuIGxvY2F0aW9ucwotCSAqIEluIHRoaXMsIEFsbCB0aGUgVGFzaydzIE1hbmRhdG9yeUlucHV0IHdvcmtwcm9kdWN0cyBwbGFjZWQgb24gdG9wIGFuZCBSb2xlVGFzayAKLQkgKiBjb21wb3NpdGUgaW4gdGhlIG1pZGRsZS4gYW5kIFRhc2sncyBvdXRwdXQgd29ya3Byb2R1Y3RzIGJvdHRvbS4KLQkgKiAKLQkgKiBUT0RPIC0gSGF2ZSB0byByZXZpc2l0IHRoaXMgbWV0aG9kIGFuZCBkbyBzb21lIGNsZWFudXAKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZXNldENoaWxkcmVuTG9jYXRpb25zKCkgewotCi0JCWZpbmFsIGludCB5c3BhY2luZyA9IDQwOwotCQlMaXN0IHJvbGVjb21wb3NpdGVMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlMaXN0IGlucHV0d29ya3Byb2R1Y3RDb21wb3NpdGVMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlMaXN0IG91dHB1dFdvcmtQcm9kdWN0Q29tcG9zaXRlTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJTGlzdCBtaXNjTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJTGlzdCB0YXNrTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJdGhpcy5yZWNlbnRseUFkZGVkUGFydHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJLy8JCUhhc2hNYXAgbWFwID0gbmV3IEhhc2hNYXAoKTsKLQotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBnZXRDaGlsZHJlbigpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGNoaWxkID0gaXRlci5uZXh0KCk7Ci0JCQlOb2RlIG4gPSAoTm9kZSkgKChFZGl0UGFydCkgY2hpbGQpLmdldE1vZGVsKCk7Ci0JCQkvLwkJCWlmIChuLmdldExvY2F0aW9uKCkgPT0gbnVsbCB8fCBuLmdldExvY2F0aW9uKCkueCA9PSAtMSkgewotCQkJdGhpcy5yZWNlbnRseUFkZGVkUGFydHMuYWRkKChFZGl0UGFydCkgY2hpbGQpOwotCQkJLy8JCQl9Ci0JCQlpZiAoY2hpbGQgaW5zdGFuY2VvZiBSb2xlVGFza0NvbXBvc2l0ZUVkaXRQYXJ0KSB7Ci0JCQkJcm9sZWNvbXBvc2l0ZUxpc3QuYWRkKGNoaWxkKTsKLQotCQkJCUxpc3QgbGlzdCA9ICgoUm9sZVRhc2tDb21wb3NpdGVFZGl0UGFydCkgY2hpbGQpLmdldENoaWxkcmVuKCk7Ci0JCQkJZm9yIChJdGVyYXRvciBpdCA9IGxpc3QuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCQlPYmplY3Qgb2JqID0gaXQubmV4dCgpOwotCQkJCQlpZiAob2JqIGluc3RhbmNlb2YgVGFza05vZGVFZGl0UGFydCkgewotCQkJCQkJVmlldyB2aWV3T2JqID0gKFZpZXcpICgoTm9kZUVkaXRQYXJ0KSBvYmopLmdldE1vZGVsKCk7Ci0JCQkJCQlPYmplY3QgbyA9IHZpZXdPYmouZ2V0RWxlbWVudCgpOwotCQkJCQkJaWYgKG8gaW5zdGFuY2VvZiBUYXNrTm9kZSkgewotCQkJCQkJCXRhc2tMaXN0LmFkZChvKTsKLQkJCQkJCX0KLQkJCQkJfQotCi0JCQkJfQotCQkJfSBlbHNlIGlmIChjaGlsZCBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0Q29tcG9zaXRlRWRpdFBhcnQpIHsKLQkJCQlXb3JrUHJvZHVjdENvbXBvc2l0ZUVkaXRQYXJ0IHBhcnQgPSAoV29ya1Byb2R1Y3RDb21wb3NpdGVFZGl0UGFydCkgY2hpbGQ7Ci0JCQkJVmlldyB2aWV3T2JqID0gKFZpZXcpICgoTm9kZUVkaXRQYXJ0KSBwYXJ0KS5nZXRNb2RlbCgpOwotCQkJCU9iamVjdCBvID0gdmlld09iai5nZXRFbGVtZW50KCk7Ci0KLQkJCQlpZiAobyBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0Q29tcG9zaXRlKSB7Ci0JCQkJCVdvcmtQcm9kdWN0Q29tcG9zaXRlIG5vZGUgPSAoV29ya1Byb2R1Y3RDb21wb3NpdGUpIG87Ci0JCQkJCWlmIChub2RlLmdldFR5cGUoKSA9PSBXb3JrUHJvZHVjdENvbXBvc2l0ZS5JTlBVVFMpIHsKLQkJCQkJCWlucHV0d29ya3Byb2R1Y3RDb21wb3NpdGVMaXN0LmFkZChjaGlsZCk7Ci0JCQkJCX0gZWxzZSBpZiAobm9kZS5nZXRUeXBlKCkgPT0gV29ya1Byb2R1Y3RDb21wb3NpdGUuT1VUUFVUUykgewotCQkJCQkJb3V0cHV0V29ya1Byb2R1Y3RDb21wb3NpdGVMaXN0LmFkZChjaGlsZCk7Ci0JCQkJCX0KLQkJCQkJLy8JCQkJCWNhbGNTaXplKGNoaWxkKTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCW1pc2NMaXN0LmFkZChjaGlsZCk7Ci0JCQl9Ci0JCX0KLQotCQkvLyBTZXQgc2l6ZSBmb3IgdGhlIHJvbGVjb21wb3NpdGUuCi0JCWlmICghcm9sZWNvbXBvc2l0ZUxpc3QuaXNFbXB0eSgpKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0b3IgPSByb2xlY29tcG9zaXRlTGlzdC5pdGVyYXRvcigpOyBpdG9yLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3Qgb2JqZWN0ID0gaXRvci5uZXh0KCk7Ci0JCQkJTGlzdCBsaXN0ID0gKChSb2xlVGFza0NvbXBvc2l0ZUVkaXRQYXJ0KSBvYmplY3QpLmdldENoaWxkcmVuKCk7Ci0JCQkJZm9yIChJdGVyYXRvciBpdG9yMSA9IGxpc3QuaXRlcmF0b3IoKTsgaXRvcjEuaGFzTmV4dCgpOykgewotCQkJCQlPYmplY3Qgb2JqID0gaXRvcjEubmV4dCgpOwotCQkJCQlpZiAob2JqIGluc3RhbmNlb2YgTm9kZUVkaXRQYXJ0KSB7Ci0JCQkJCQlWaWV3IHZpZXdPYmogPSAoVmlldykgKChOb2RlRWRpdFBhcnQpIG9iaikuZ2V0TW9kZWwoKTsKLQkJCQkJCU9iamVjdCBvYmpOb2RlID0gdmlld09iai5nZXRFbGVtZW50KCk7Ci0JCQkJCQlpZiAob2JqTm9kZSBpbnN0YW5jZW9mIFRhc2tOb2RlKSB7Ci0JCQkJCQkJVGFza05vZGUgdGFza05vZGUgPSAoVGFza05vZGUpIG9iak5vZGU7Ci0KLQkJCQkJCQlUYXNrRGVzY3JpcHRvciB0YXNrID0gKFRhc2tEZXNjcmlwdG9yKSB0YXNrTm9kZQotCQkJCQkJCQkJLmdldE9iamVjdCgpOwotCQkJCQkJCWZvciAoSXRlcmF0b3Igd3BpdG9yID0gaW5wdXR3b3JrcHJvZHVjdENvbXBvc2l0ZUxpc3QKLQkJCQkJCQkJCS5pdGVyYXRvcigpOyB3cGl0b3IuaGFzTmV4dCgpOykgewotCQkJCQkJCQlXb3JrUHJvZHVjdENvbXBvc2l0ZUVkaXRQYXJ0IHdwRWRpdFBhcnQgPSAoV29ya1Byb2R1Y3RDb21wb3NpdGVFZGl0UGFydCkgd3BpdG9yCi0JCQkJCQkJCQkJLm5leHQoKTsKLQkJCQkJCQkJV29ya1Byb2R1Y3RDb21wb3NpdGUgd3BDb21wb3NpdGVOb2RlID0gKFdvcmtQcm9kdWN0Q29tcG9zaXRlKSAoKFZpZXcpIHdwRWRpdFBhcnQKLQkJCQkJCQkJCQkuZ2V0TW9kZWwoKSkuZ2V0RWxlbWVudCgpOwotCQkJCQkJCQlPYmplY3Qgd3BPYmplY3QgPSB3cENvbXBvc2l0ZU5vZGUuZ2V0T2JqZWN0KCk7Ci0JCQkJCQkJCWlmICh3cE9iamVjdCAhPSBudWxsICYmIHdwT2JqZWN0LmVxdWFscyh0YXNrKSkgewotCQkJCQkJCQkJaW50IHdpZHRoID0gd3BFZGl0UGFydC5nZXRGaWd1cmUoKQotCQkJCQkJCQkJCQkuZ2V0UHJlZmVycmVkU2l6ZSgpLndpZHRoOwotCQkJCQkJCQkJaW50IGhlaWdodCA9ICgoTm9kZUVkaXRQYXJ0KSBvYmopCi0JCQkJCQkJCQkJCS5nZXRGaWd1cmUoKS5nZXRQcmVmZXJyZWRTaXplKCkuaGVpZ2h0OwotCQkJCQkJCQkJKChOb2RlRWRpdFBhcnQpIG9iaikKLQkJCQkJCQkJCQkJLmdldEZpZ3VyZSgpCi0JCQkJCQkJCQkJCS5zZXRQcmVmZXJyZWRTaXplKAotCQkJCQkJCQkJCQkJCW5ldyBEaW1lbnNpb24od2lkdGgsIGhlaWdodCkpOwotCQkJCQkJCQkJaWYgKCgoV29ya1Byb2R1Y3RDb21wb3NpdGUpICgoVmlldykgd3BFZGl0UGFydAotCQkJCQkJCQkJCQkuZ2V0TW9kZWwoKSkuZ2V0RWxlbWVudCgpKQotCQkJCQkJCQkJCQkuZ2V0VHlwZSgpID09IFdvcmtQcm9kdWN0Q29tcG9zaXRlLklOUFVUUykgewotCQkJCQkJCQkJCS8vCQkJCQkJCQkJCUxpc3QgaW5wdXRMaXN0ID0gKExpc3QpICgoSGFzaE1hcCkgbWFwCi0JCQkJCQkJCQkJLy8JCQkJCQkJCQkJCQkuZ2V0KHRhc2tOb2RlKSkuZ2V0KElOUFVUUyk7Ci0JCQkJCQkJCQkJLy8JCQkJCQkJCQkJaW5wdXRMaXN0LmFkZCh3cEVkaXRQYXJ0KTsKLQkJCQkJCQkJCX0gZWxzZSBpZiAoKChXb3JrUHJvZHVjdENvbXBvc2l0ZSkgKChWaWV3KSB3cEVkaXRQYXJ0Ci0JCQkJCQkJCQkJCS5nZXRNb2RlbCgpKS5nZXRFbGVtZW50KCkpCi0JCQkJCQkJCQkJCS5nZXRUeXBlKCkgPT0gV29ya1Byb2R1Y3RDb21wb3NpdGUuT1VUUFVUUykgewotCQkJCQkJCQkJCS8vCQkJCQkJCQkJCUxpc3Qgb3V0cHV0TGlzdCA9IChMaXN0KSAoKEhhc2hNYXApIG1hcAotCQkJCQkJCQkJCS8vCQkJCQkJCQkJCQkJLmdldCh0YXNrTm9kZSkpLmdldChPVVRQVVRTKTsKLQkJCQkJCQkJCQkvLwkJCQkJCQkJCQlvdXRwdXRMaXN0LmFkZCh3cEVkaXRQYXJ0KTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWlmICghcm9sZWNvbXBvc2l0ZUxpc3QuaXNFbXB0eSgpKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHJvbGVjb21wb3NpdGVMaXN0LnNpemUoKTsgaSsrKSB7Ci0JCQkJTGlzdCBjb25maXJtZWRTZXFJbnB1dExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJTGlzdCBjb25maXJtZWRTZXFPdXRwdXRMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCUxpc3QgbGlzdCA9ICgoUm9sZVRhc2tDb21wb3NpdGVFZGl0UGFydCkgcm9sZWNvbXBvc2l0ZUxpc3QKLQkJCQkJCS5nZXQoaSkpLmdldENoaWxkcmVuKCk7Ci0JCQkJZm9yIChpbnQgaiA9IDA7IGogPCBsaXN0LnNpemUoKTsgaisrKSB7Ci0JCQkJCU9iamVjdCBvID0gbGlzdC5nZXQoaik7Ci0JCQkJCWlmIChvIGluc3RhbmNlb2YgTm9kZUVkaXRQYXJ0KSB7Ci0JCQkJCQlOb2RlRWRpdFBhcnQgdGFzayA9IChOb2RlRWRpdFBhcnQpIGxpc3QuZ2V0KGopOwotCQkJCQkJaWYgKCgoVmlldykgdGFzay5nZXRNb2RlbCgpKS5nZXRFbGVtZW50KCkgaW5zdGFuY2VvZiBUYXNrTm9kZSkgewotCQkJCQkJCVRhc2tOb2RlIHRhc2tub2RlID0gKFRhc2tOb2RlKSAoKFZpZXcpIHRhc2sKLQkJCQkJCQkJCS5nZXRNb2RlbCgpKS5nZXRFbGVtZW50KCk7Ci0JCQkJCQkJZm9yIChpbnQgayA9IDA7IGsgPCBpbnB1dHdvcmtwcm9kdWN0Q29tcG9zaXRlTGlzdAotCQkJCQkJCQkJLnNpemUoKTsgaysrKSB7Ci0JCQkJCQkJCVdvcmtQcm9kdWN0Q29tcG9zaXRlIHdwY29tcCA9IChXb3JrUHJvZHVjdENvbXBvc2l0ZSkgKChWaWV3KSAoKFdvcmtQcm9kdWN0Q29tcG9zaXRlRWRpdFBhcnQpIGlucHV0d29ya3Byb2R1Y3RDb21wb3NpdGVMaXN0Ci0JCQkJCQkJCQkJLmdldChrKSkuZ2V0TW9kZWwoKSkuZ2V0RWxlbWVudCgpOwotCi0JCQkJCQkJCWlmICh3cGNvbXAgIT0gbnVsbCAmJiB3cGNvbXAuZ2V0T2JqZWN0KCkuZXF1YWxzKAotCQkJCQkJCQkJCXRhc2tub2RlLmdldE9iamVjdCgpKSkgewotCQkJCQkJCQkJaWYgKHdwY29tcC5nZXRUeXBlKCkgPT0gV29ya1Byb2R1Y3RDb21wb3NpdGUuSU5QVVRTKSB7Ci0JCQkJCQkJCQkJY29uZmlybWVkU2VxSW5wdXRMaXN0Ci0JCQkJCQkJCQkJCQkuYWRkKGlucHV0d29ya3Byb2R1Y3RDb21wb3NpdGVMaXN0Ci0JCQkJCQkJCQkJCQkJCS5nZXQoaykpOwotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJCWZvciAoaW50IGsgPSAwOyBrIDwgb3V0cHV0V29ya1Byb2R1Y3RDb21wb3NpdGVMaXN0Ci0JCQkJCQkJCQkuc2l6ZSgpOyBrKyspIHsKLQkJCQkJCQkJV29ya1Byb2R1Y3RDb21wb3NpdGUgd3Bjb21wID0gKFdvcmtQcm9kdWN0Q29tcG9zaXRlKSAoKFZpZXcpICgoV29ya1Byb2R1Y3RDb21wb3NpdGVFZGl0UGFydCkgb3V0cHV0V29ya1Byb2R1Y3RDb21wb3NpdGVMaXN0Ci0JCQkJCQkJCQkJLmdldChrKSkuZ2V0TW9kZWwoKSkuZ2V0RWxlbWVudCgpOwotCi0JCQkJCQkJCWlmICh3cGNvbXAuZ2V0T2JqZWN0KCkuZXF1YWxzKAotCQkJCQkJCQkJCXRhc2tub2RlLmdldE9iamVjdCgpKSkgewotCQkJCQkJCQkJaWYgKHdwY29tcC5nZXRUeXBlKCkgPT0gV29ya1Byb2R1Y3RDb21wb3NpdGUuT1VUUFVUUykgewotCQkJCQkJCQkJCWNvbmZpcm1lZFNlcU91dHB1dExpc3QKLQkJCQkJCQkJCQkJCS5hZGQob3V0cHV0V29ya1Byb2R1Y3RDb21wb3NpdGVMaXN0Ci0JCQkJCQkJCQkJCQkJCS5nZXQoaykpOwotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCWlmICghY29uZmlybWVkU2VxSW5wdXRMaXN0LmlzRW1wdHkoKSkgewotCQkJCQlzZXRPYmplY3RzTG9jYXRpb25zKGNvbmZpcm1lZFNlcUlucHV0TGlzdCk7Ci0JCQkJCXkgPSBjYWNoZWRQb2ludC55ICsgY2FjaGVkSGVpZ2h0ICsgeXNwYWNpbmc7Ci0JCQkJfQotCQkJCUxpc3Qgcm9sZUMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJcm9sZUMuYWRkKHJvbGVjb21wb3NpdGVMaXN0LmdldChpKSk7Ci0JCQkJc2V0T2JqZWN0c0xvY2F0aW9ucyhyb2xlQyk7Ci0KLQkJCQl5ID0gY2FjaGVkUG9pbnQueSArIGNhY2hlZEhlaWdodCArIHlzcGFjaW5nOwotCQkJCWlmICghY29uZmlybWVkU2VxT3V0cHV0TGlzdC5pc0VtcHR5KCkpIHsKLQkJCQkJc2V0T2JqZWN0c0xvY2F0aW9ucyhjb25maXJtZWRTZXFPdXRwdXRMaXN0KTsKLQkJCQkJeSA9IGNhY2hlZFBvaW50LnkgKyBjYWNoZWRIZWlnaHQgKyB5c3BhY2luZzsKLQkJCQl9Ci0JCQl9Ci0KLQkJfQotCi0JCS8vCQlpZiAoIW1pc2NMaXN0LmlzRW1wdHkoKSkgewotCQkvLwkJCWlmIChkZWJ1ZykgewotCQkvLwkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlByaW50IFNpemUgb2YgbWlzYzogIiArIG1pc2NMaXN0LnNpemUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJLy8JCQl9Ci0JCS8vCQkJaWYgKCFsb2FkaW5nKSB7Ci0JCS8vCQkJCW1pc2NlbGxhbmVvdXMgPSB0cnVlOwotCQkvLwkJCX0KLQkJLy8JCQlzZXRPYmplY3RzTG9jYXRpb25zKG1pc2NMaXN0KTsKLQkJLy8JCQltaXNjZWxsYW5lb3VzID0gZmFsc2U7Ci0JCS8vCQl9Ci0KLQkJZmluYWwgVmlldyB2aWV3ID0gZ2V0VmlldygpOwotCQl0cnkgewotCQkJVHhVdGlsLnJ1bkluVHJhbnNhY3Rpb24odmlldy5nZXREaWFncmFtKCksIG5ldyBSdW5uYWJsZSgpIHsKLQotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJdmlldy5wZXJzaXN0KCk7Ci0JCQkJCXZpZXcucGVyc2lzdENoaWxkcmVuKCk7Ci0JCQkJfQotCQkJCQotCQkJfSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlDb21tb25QbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQl9Ci0JCWxvYWRpbmcgPSBmYWxzZTsKLQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCkgewotCQlzdXBlci5jcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5TRU1BTlRJQ19ST0xFLAotCQkJCW5ldyBBY3Rpdml0eURldGFpbERpYWdyYW1JdGVtU2VtYW50aWNFZGl0UG9saWN5KCkpOwotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuQ0FOT05JQ0FMX1JPTEUsCi0JCQkJbmV3IEFjdGl2aXR5RGV0YWlsRGlhZ3JhbUNhbm9uaWNhbEVkaXRQb2xpY3koKSk7Ci0JfQotCi0JLyoqCi0JICogSXQgc2V0cyBvYmplY3QgbG9jYXRpb24gb24gY2F2YXMKLQkgKiBAcGFyYW0gbGlzdAotCSAqIAotCSAqLwotCXByaXZhdGUgdm9pZCBzZXRPYmplY3RzTG9jYXRpb25zKExpc3QgbGlzdCkgewotCQl4YXhpc2JlZ2luID0gdHJ1ZTsKLQkJeCA9IDUwOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBsaXN0Lml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGNoaWxkID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAoY2hpbGQgaW5zdGFuY2VvZiBHcmFwaGljYWxFZGl0UGFydCkgewotCQkJCWZpbmFsIEdyYXBoaWNhbEVkaXRQYXJ0IHBhcnQgPSAoR3JhcGhpY2FsRWRpdFBhcnQpIGNoaWxkOwotCQkJCWZpbmFsIE5vZGUgbm9kZSA9IChOb2RlKSBwYXJ0LmdldE1vZGVsKCk7Ci0KLQkJCQlpZiAobm9kZSBpbnN0YW5jZW9mIE5vZGUpIHsKLQkJCQkJZmluYWwgTG9jYXRpb24gbG9jYXRpb24gPSAoTG9jYXRpb24pIG5vZGUuZ2V0TGF5b3V0Q29uc3RyYWludCgpOwotCi0JCQkJCWlmIChkZWJ1ZykgewotCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJOb2RlIC0gIiArIHBhcnQpOyAvLyROT04tTkxTLTEkCi0JCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxvY2F0aW9uIC0gIiArIGxvY2F0aW9uKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0KLQkJCQkJaWYgKCF4YXhpc2JlZ2luKSB7Ci0JCQkJCQl4ID0gY2FjaGVkUG9pbnQueCArIGNhY2hlZFdpZHRoICsgc3BhY2luZzsKLQkJCQkJfQotCi0JCQkJCWlmICghbG9hZGluZyAmJiBtaXNjZWxsYW5lb3VzKSB7Ci0JCQkJCQlsb2NhdGlvbi5zZXRYKG1hcE1vZGUuRFB0b0xQKHgpKTsKLQkJCQkJCWxvY2F0aW9uLnNldFkobWFwTW9kZS5EUHRvTFAoMTApKTsKLQotCQkJCQl9IGVsc2UgewotCQkJCQkJdHJ5IHsKLQkJCQkJCQlUeFV0aWwucnVuSW5UcmFuc2FjdGlvbihnZXRWaWV3KCkuZ2V0RGlhZ3JhbSgpLCBuZXcgUnVubmFibGUoKSB7Ci0KLQkJCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCQkJbG9jYXRpb24uc2V0WChtYXBNb2RlLkRQdG9MUCh4KSk7Ci0JCQkJCQkJCQlsb2NhdGlvbi5zZXRZKG1hcE1vZGUuRFB0b0xQKHkpKTsKLQotCQkJCQkJCQkJaWYgKHBhcnQgaW5zdGFuY2VvZiBSb2xlVGFza0NvbXBvc2l0ZUVkaXRQYXJ0KSB7Ci0JCQkJCQkJCQkJKChSb2xlVGFza0NvbXBvc2l0ZUVkaXRQYXJ0KSBwYXJ0KQotCQkJCQkJCQkJCQkJLnVwZGF0ZWJvdW5kcygpOwotCQkJCQkJCQkJfQotCQkJCQkJCQkJaWYgKHBhcnQgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdENvbXBvc2l0ZUVkaXRQYXJ0KSB7Ci0JCQkJCQkJCQkJKChXb3JrUHJvZHVjdENvbXBvc2l0ZUVkaXRQYXJ0KSBwYXJ0KQotCQkJCQkJCQkJCQkJLnVwZGF0ZWJvdW5kcygpOwotCQkJCQkJCQkJfQotCi0JCQkJCQkJCX0KLQkJCQkJCQkJCi0JCQkJCQkJfSk7Ci0JCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJCUNvbW1vblBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkJCQl9Ci0KLQkJCQkJCWlmIChkZWJ1ZykKLQkJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIk5ld0xvY2F0aW9uIC0gIiArIGxvY2F0aW9uKTsgLy8kTk9OLU5MUy0xJAotCi0JCQkJCQlpZiAoIW1pc2NlbGxhbmVvdXMpCi0JCQkJCQkJY2FjaGVkUG9pbnQgPSBuZXcgUG9pbnQobG9jYXRpb24uZ2V0WCgpLCBsb2NhdGlvbgotCQkJCQkJCQkJLmdldFkoKSk7Ci0JCQkJCQljYWNoZWRXaWR0aCA9IHBhcnQuZ2V0RmlndXJlKCkuZ2V0UHJlZmVycmVkU2l6ZSgpLndpZHRoOwotCQkJCQkJaWYgKHBhcnQuZ2V0RmlndXJlKCkuZ2V0UHJlZmVycmVkU2l6ZSgpLmhlaWdodCA+IGNhY2hlZEhlaWdodCkKLQkJCQkJCQljYWNoZWRIZWlnaHQgPSBwYXJ0LmdldEZpZ3VyZSgpLmdldFByZWZlcnJlZFNpemUoKS5oZWlnaHQ7Ci0JCQkJCQl4YXhpc2JlZ2luID0gZmFsc2U7Ci0JCQkJCQlpZiAoZGVidWcpIHsKLQkJCQkJCQkvLwkJCQkJCQlTeXN0ZW0ub3V0Ci0JCQkJCQkJLy8JCQkJCQkJCQkucHJpbnRsbigiUG9pbnQgOiAiICsgbmV3IFBvaW50KHgsIHkpLnRvU3RyaW5nKCkgKyAiQW5kIHdpZHRoPSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQkJLy8JCQkJCQkJCQkJCSsgY2FjaGVkV2lkdGgKLQkJCQkJCQkvLwkJCQkJCQkJCQkJKyAiLCBIZWlnaHQ9IiArIGNhY2hlZEhlaWdodCArICIsIFdpZHRoIG9mIFZpZXdlcjogIiArIHZpZXdlcldpZHRoKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDYWxjdWxhdGVzIGFuZCBzZXRzIHNpemUgb2YgdGhlIGdpdmVuIG5vZGUKLQkgKiBAcGFyYW0gY2hpbGQKLQkgKiAKLQkgKiBUT0RPIC0gTm90IHVzZWQgY3VycmVudGx5LCB3ZSBuZWVkIHRvIHNlZSB3aGV0aGVyIHdlIG5lZWQgdGhpcyBtZXRob2QKLQkgKi8KLQlwcml2YXRlIHZvaWQgY2FsY1NpemUoT2JqZWN0IGNoaWxkKSB7Ci0JCUxpc3QgbGlzdCA9ICgoR3JhcGhpY2FsRWRpdFBhcnQpIGNoaWxkKS5nZXRDaGlsZHJlbigpOwotCQlpbnQgbGFyZ2VzdFdpZHRoID0gMDsKLQkJaW50IGxhcmdlc3RIZWlnaHQgPSAwOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gbGlzdC5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3Qgb2JqID0gaXQubmV4dCgpOwotCi0JCQlpZiAob2JqIGluc3RhbmNlb2YgTm9kZUVkaXRQYXJ0KSB7Ci0JCQkJVmlldyB2aWV3T2JqID0gKFZpZXcpICgoTm9kZUVkaXRQYXJ0KSBvYmopLmdldE1vZGVsKCk7Ci0JCQkJT2JqZWN0IG9iak5vZGUgPSB2aWV3T2JqLmdldEVsZW1lbnQoKTsKLQkJCQlpZiAob2JqTm9kZSBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGUpIHsKLQkJCQkJaW50IG5vZGVXaWR0aCA9ICgoTm9kZUVkaXRQYXJ0KSBvYmopLmdldEZpZ3VyZSgpCi0JCQkJCQkJLmdldFByZWZlcnJlZFNpemUoKS53aWR0aDsKLQkJCQkJaW50IG5vZGVIZWlnaHQgPSAoKE5vZGVFZGl0UGFydCkgb2JqKS5nZXRGaWd1cmUoKQotCQkJCQkJCS5nZXRQcmVmZXJyZWRTaXplKCkuaGVpZ2h0OwotCQkJCQlpZiAobm9kZVdpZHRoID4gbGFyZ2VzdFdpZHRoKQotCQkJCQkJbGFyZ2VzdFdpZHRoID0gbm9kZVdpZHRoOwotCQkJCQlpZiAobm9kZUhlaWdodCA+IGxhcmdlc3RIZWlnaHQpCi0JCQkJCQlsYXJnZXN0SGVpZ2h0ID0gbm9kZUhlaWdodDsKLQkJCQl9Ci0JCQl9Ci0KLQkJfQotCQkoKFdvcmtQcm9kdWN0Q29tcG9zaXRlRWRpdFBhcnQpIGNoaWxkKS5nZXRGaWd1cmUoKS5zZXRQcmVmZXJyZWRTaXplKAotCQkJCW5ldyBEaW1lbnNpb24obGFyZ2VzdFdpZHRoICogMiArIDEwLCAyMCArIGxhcmdlc3RIZWlnaHQKLQkJCQkJCSogKGxpc3Quc2l6ZSgpIC8gMiArIDEpKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyByZWNlbnRseSBhZGRkZWQgZWRpdHBhcnRzLiBVc3VhbGx5IGNhbGxlZCAKLQkgKiBieSBkaWFncmFtIHNlcnZpY2VzIHRvIGRvIGF1dG9sYXlvdXQgYWRqdXN0bWVudC4KLQkgKi8KLQlwdWJsaWMgTGlzdDxFZGl0UGFydD4gZ2V0UmVjZW50bHlBZGRlZFBhcnRzKCkgewotCQlyZXR1cm4gcmVjZW50bHlBZGRlZFBhcnRzOwotCX0KLQotCS8qKgotCSAqIENsZWFyIHRoZSByZWNlbnRseSBhZGRlZCBlZGl0cGFydHMgZnJvbSB0aGUgbGlzdC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBjbGVhclJlY2VudGx5QWRkZWRQYXJ0cygpIHsKLQkJcmVjZW50bHlBZGRlZFBhcnRzLmNsZWFyKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlTm90aWZpY2F0aW9uRXZlbnQoTm90aWZpY2F0aW9uIGV2ZW50KSB7Ci0JCWlmIChOb3RhdGlvblBhY2thZ2UuTGl0ZXJhbHMuVklFV19fVklTSUJMRS5lcXVhbHMoZXZlbnQuZ2V0RmVhdHVyZSgpKSkgewotCQkJT2JqZWN0IG5vdGlmaWVyID0gZXZlbnQuZ2V0Tm90aWZpZXIoKTsKLQkJCWlmIChub3RpZmllciA9PSBnZXRNb2RlbCgpKQotCQkJCXJlZnJlc2hWaXNpYmlsaXR5KCk7Ci0JCQllbHNlIGlmIChldmVudC5nZXROb3RpZmllcigpIGluc3RhbmNlb2YgTm9kZSkgewotCQkJCXJlZnJlc2hDaGlsZHJlbigpOwotCQkJCURpYWdyYW1FZGl0b3JVdGlsLnJlZnJlc2hDb25uZWN0aW9uRWRpdFBhcnRzKHRoaXMpOwotCQkJfQotCQl9IGVsc2UKLQkJCXN1cGVyLmhhbmRsZU5vdGlmaWNhdGlvbkV2ZW50KGV2ZW50KTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgYWN0aXZhdGUoKSB7Ci0JCXN1cGVyLmFjdGl2YXRlKCk7Ci0JCU9iamVjdCBtb2RlbCA9IGdldE1vZGVsKCk7Ci0JCWlmIChtb2RlbCBpbnN0YW5jZW9mIFZpZXcpIHsKLQkJCUVPYmplY3QgZSA9ICgoVmlldykgbW9kZWwpLmdldEVsZW1lbnQoKTsKLQkJCWlmIChlIGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZSkgewotCQkJCSgob3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZSkgZSkuYWRkQ29uc3VtZXIodGhpcyk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZGVhY3RpdmF0ZSgpIHsKLQkJc3VwZXIuZGVhY3RpdmF0ZSgpOwotCQlPYmplY3QgbW9kZWwgPSBnZXRNb2RlbCgpOwotCQlpZiAobW9kZWwgaW5zdGFuY2VvZiBWaWV3KSB7Ci0JCQlFT2JqZWN0IGUgPSAoKFZpZXcpIG1vZGVsKS5nZXRFbGVtZW50KCk7Ci0JCQlpZiAoZSBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGUpIHsKLQkJCQkoKG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGUpIGUpLnJlbW92ZUNvbnN1bWVyKHRoaXMpOwotCQkJfQotCQl9Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9wYXJ0cy9EaWFncmFtRWRpdFBhcnRGYWN0b3J5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L3BhcnRzL0RpYWdyYW1FZGl0UGFydEZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDhmNTY3OS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L3BhcnRzL0RpYWdyYW1FZGl0UGFydEZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wYXJ0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5GaWd1cmVVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5EaW1lbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYudG9vbHMuQ2VsbEVkaXRvckxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSVRleHRBd2FyZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2VsbEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLnBhcnQuRGlhZ3JhbVZpc3VhbElEUmVnaXN0cnk7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRGlhZ3JhbUVkaXRQYXJ0RmFjdG9yeSBpbXBsZW1lbnRzIEVkaXRQYXJ0RmFjdG9yeSB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVkaXRQYXJ0IGNyZWF0ZUVkaXRQYXJ0KEVkaXRQYXJ0IGNvbnRleHQsIE9iamVjdCBtb2RlbCkgewotCQlpZiAobW9kZWwgaW5zdGFuY2VvZiBWaWV3KSB7Ci0JCQlWaWV3IHZpZXcgPSAoVmlldykgbW9kZWw7Ci0JCQlzd2l0Y2ggKERpYWdyYW1WaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKHZpZXcpKSB7Ci0KLQkJCWNhc2UgQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJCXJldHVybiBuZXcgQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdFBhcnQodmlldyk7Ci0KLQkJCWNhc2UgUm9sZVRhc2tDb21wb3NpdGVFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQkJcmV0dXJuIG5ldyBSb2xlVGFza0NvbXBvc2l0ZUVkaXRQYXJ0KHZpZXcpOwotCi0JCQljYXNlIFdvcmtQcm9kdWN0Q29tcG9zaXRlRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJCXJldHVybiBuZXcgV29ya1Byb2R1Y3RDb21wb3NpdGVFZGl0UGFydCh2aWV3KTsKLQotCQkJY2FzZSBSb2xlTm9kZUVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCQlyZXR1cm4gbmV3IFJvbGVOb2RlRWRpdFBhcnQodmlldyk7Ci0KLQkJCWNhc2UgUm9sZU5vZGVOYW1lRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJCXJldHVybiBuZXcgUm9sZU5vZGVOYW1lRWRpdFBhcnQodmlldyk7Ci0KLQkJCWNhc2UgVGFza05vZGVFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQkJcmV0dXJuIG5ldyBUYXNrTm9kZUVkaXRQYXJ0KHZpZXcpOwotCi0JCQljYXNlIFRhc2tOb2RlTmFtZUVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCQlyZXR1cm4gbmV3IFRhc2tOb2RlTmFtZUVkaXRQYXJ0KHZpZXcpOwotCi0JCQljYXNlIFdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQkJcmV0dXJuIG5ldyBXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlRWRpdFBhcnQodmlldyk7Ci0KLQkJCWNhc2UgV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZU5hbWVFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQkJcmV0dXJuIG5ldyBXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlTmFtZUVkaXRQYXJ0KHZpZXcpOwotCi0JCQljYXNlIFJvbGVUYXNrQ29tcG9zaXRlUm9sZVRhc2tDb21wYXJ0bWVudEVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCQlyZXR1cm4gbmV3IFJvbGVUYXNrQ29tcG9zaXRlUm9sZVRhc2tDb21wYXJ0bWVudEVkaXRQYXJ0KHZpZXcpOwotCi0JCQljYXNlIFdvcmtQcm9kdWN0Q29tcG9zaXRlV29ya1Byb2R1Y3RDb21wYXJ0bWVudEVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCQlyZXR1cm4gbmV3IFdvcmtQcm9kdWN0Q29tcG9zaXRlV29ya1Byb2R1Y3RDb21wYXJ0bWVudEVkaXRQYXJ0KAotCQkJCQkJdmlldyk7Ci0KLQkJCWNhc2UgTGlua0VkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCQlyZXR1cm4gbmV3IExpbmtFZGl0UGFydCh2aWV3KTsKLQotCQkJY2FzZSBMaW5rTmFtZUVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCQlyZXR1cm4gbmV3IExpbmtOYW1lRWRpdFBhcnQodmlldyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGNyZWF0ZVVucmVjb2duaXplZEVkaXRQYXJ0KGNvbnRleHQsIG1vZGVsKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFZGl0UGFydCBjcmVhdGVVbnJlY29nbml6ZWRFZGl0UGFydChFZGl0UGFydCBjb250ZXh0LCBPYmplY3QgbW9kZWwpIHsKLQkJLy8gSGFuZGxlIGNyZWF0aW9uIG9mIHVucmVjb2duaXplZCBjaGlsZCBub2RlIEVkaXRQYXJ0cyBoZXJlCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIENlbGxFZGl0b3JMb2NhdG9yIGdldFRleHRDZWxsRWRpdG9yTG9jYXRvcigKLQkJCUlUZXh0QXdhcmVFZGl0UGFydCBzb3VyY2UpIHsKLQkJaWYgKHNvdXJjZS5nZXRGaWd1cmUoKSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkKLQkJCXJldHVybiBuZXcgVGV4dENlbGxFZGl0b3JMb2NhdG9yKChXcmFwTGFiZWwpIHNvdXJjZS5nZXRGaWd1cmUoKSk7Ci0JCWVsc2UgewotCQkJcmV0dXJuIG5ldyBMYWJlbENlbGxFZGl0b3JMb2NhdG9yKChMYWJlbCkgc291cmNlLmdldEZpZ3VyZSgpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlzdGF0aWMgcHJpdmF0ZSBjbGFzcyBUZXh0Q2VsbEVkaXRvckxvY2F0b3IgaW1wbGVtZW50cyBDZWxsRWRpdG9yTG9jYXRvciB7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgV3JhcExhYmVsIHdyYXBMYWJlbDsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIFRleHRDZWxsRWRpdG9yTG9jYXRvcihXcmFwTGFiZWwgd3JhcExhYmVsKSB7Ci0JCQl0aGlzLndyYXBMYWJlbCA9IHdyYXBMYWJlbDsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgV3JhcExhYmVsIGdldFdyYXBMYWJlbCgpIHsKLQkJCXJldHVybiB3cmFwTGFiZWw7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHZvaWQgcmVsb2NhdGUoQ2VsbEVkaXRvciBjZWxsZWRpdG9yKSB7Ci0JCQlUZXh0IHRleHQgPSAoVGV4dCkgY2VsbGVkaXRvci5nZXRDb250cm9sKCk7Ci0JCQlSZWN0YW5nbGUgcmVjdCA9IGdldFdyYXBMYWJlbCgpLmdldFRleHRCb3VuZHMoKS5nZXRDb3B5KCk7Ci0JCQlnZXRXcmFwTGFiZWwoKS50cmFuc2xhdGVUb0Fic29sdXRlKHJlY3QpOwotCQkJaWYgKGdldFdyYXBMYWJlbCgpLmlzVGV4dFdyYXBwZWQoKQotCQkJCQkmJiBnZXRXcmFwTGFiZWwoKS5nZXRUZXh0KCkubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJcmVjdC5zZXRTaXplKG5ldyBEaW1lbnNpb24odGV4dC5jb21wdXRlU2l6ZShyZWN0LndpZHRoLAotCQkJCQkJU1dULkRFRkFVTFQpKSk7Ci0JCQl9IGVsc2UgewotCQkJCWludCBhdnIgPSBGaWd1cmVVdGlsaXRpZXMuZ2V0Rm9udE1ldHJpY3ModGV4dC5nZXRGb250KCkpCi0JCQkJCQkuZ2V0QXZlcmFnZUNoYXJXaWR0aCgpOwotCQkJCXJlY3Quc2V0U2l6ZShuZXcgRGltZW5zaW9uKHRleHQuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsCi0JCQkJCQlTV1QuREVGQVVMVCkpLmV4cGFuZChhdnIgKiAyLCAwKSk7Ci0JCQl9Ci0JCQlpZiAoIXJlY3QuZXF1YWxzKG5ldyBSZWN0YW5nbGUodGV4dC5nZXRCb3VuZHMoKSkpKSB7Ci0JCQkJdGV4dC5zZXRCb3VuZHMocmVjdC54LCByZWN0LnksIHJlY3Qud2lkdGgsIHJlY3QuaGVpZ2h0KTsKLQkJCX0KLQkJfQotCi0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGNsYXNzIExhYmVsQ2VsbEVkaXRvckxvY2F0b3IgaW1wbGVtZW50cyBDZWxsRWRpdG9yTG9jYXRvciB7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgTGFiZWwgbGFiZWw7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBMYWJlbENlbGxFZGl0b3JMb2NhdG9yKExhYmVsIGxhYmVsKSB7Ci0JCQl0aGlzLmxhYmVsID0gbGFiZWw7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIExhYmVsIGdldExhYmVsKCkgewotCQkJcmV0dXJuIGxhYmVsOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyB2b2lkIHJlbG9jYXRlKENlbGxFZGl0b3IgY2VsbGVkaXRvcikgewotCQkJVGV4dCB0ZXh0ID0gKFRleHQpIGNlbGxlZGl0b3IuZ2V0Q29udHJvbCgpOwotCQkJUmVjdGFuZ2xlIHJlY3QgPSBnZXRMYWJlbCgpLmdldFRleHRCb3VuZHMoKS5nZXRDb3B5KCk7Ci0JCQlnZXRMYWJlbCgpLnRyYW5zbGF0ZVRvQWJzb2x1dGUocmVjdCk7Ci0JCQlpbnQgYXZyID0gRmlndXJlVXRpbGl0aWVzLmdldEZvbnRNZXRyaWNzKHRleHQuZ2V0Rm9udCgpKQotCQkJCQkuZ2V0QXZlcmFnZUNoYXJXaWR0aCgpOwotCQkJcmVjdC5zZXRTaXplKG5ldyBEaW1lbnNpb24odGV4dC5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwKLQkJCQkJU1dULkRFRkFVTFQpKS5leHBhbmQoYXZyICogMiwgMCkpOwotCQkJaWYgKCFyZWN0LmVxdWFscyhuZXcgUmVjdGFuZ2xlKHRleHQuZ2V0Qm91bmRzKCkpKSkgewotCQkJCXRleHQuc2V0Qm91bmRzKHJlY3QueCwgcmVjdC55LCByZWN0LndpZHRoLCByZWN0LmhlaWdodCk7Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L3BhcnRzL0RpYWdyYW1FeHROb2RlTGFiZWxFZGl0UGFydC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9wYXJ0cy9EaWFncmFtRXh0Tm9kZUxhYmVsRWRpdFBhcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDY3MjNhNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L3BhcnRzL0RpYWdyYW1FeHROb2RlTGFiZWxFZGl0UGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucGFydHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuRGltZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuR3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuTGFiZWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmZpZ3VyZXMuTGFiZWxMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vdGF0aW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERpYWdyYW1FeHROb2RlTGFiZWxFZGl0UGFydCBleHRlbmRzIExhYmVsRWRpdFBhcnQgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEaWFncmFtRXh0Tm9kZUxhYmVsRWRpdFBhcnQoVmlldyB2aWV3KSB7Ci0JCXN1cGVyKHZpZXcpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWZyZXNoQm91bmRzKCkgewotCQlJRmlndXJlIHJlZkZpZ3VyZSA9ICgoR3JhcGhpY2FsRWRpdFBhcnQpIGdldFBhcmVudCgpKS5nZXRGaWd1cmUoKTsKLQkJaW50IGR4ID0gKChJbnRlZ2VyKSBnZXRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0TG9jYXRpb25fWCgpKSkuaW50VmFsdWUoKTsKLQkJaW50IGR5ID0gKChJbnRlZ2VyKSBnZXRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0TG9jYXRpb25fWSgpKSkuaW50VmFsdWUoKTsKLQkJUG9pbnQgb2Zmc2V0ID0gbmV3IFBvaW50KGR4LCBkeSk7Ci0JCWdldEZpZ3VyZSgpLmdldFBhcmVudCgpLnNldENvbnN0cmFpbnQoZ2V0RmlndXJlKCksCi0JCQkJbmV3IExhYmVsTG9jYXRvcihyZWZGaWd1cmUsIG9mZnNldCwgZ2V0S2V5UG9pbnQoKSkgewotCi0JCQkJCXB1YmxpYyB2b2lkIHJlbG9jYXRlKElGaWd1cmUgdGFyZ2V0KSB7Ci0JCQkJCQlQb2ludCBsb2NhdGlvbiA9IGdldFJlZmVyZW5jZVBvaW50KCkuZ2V0VHJhbnNsYXRlZCgKLQkJCQkJCQkJZ2V0T2Zmc2V0KCkpOwotCQkJCQkJbG9jYXRpb24udHJhbnNsYXRlKC10YXJnZXQuZ2V0Qm91bmRzKCkud2lkdGggLyAyLCAwKTsKLQkJCQkJCXRhcmdldC5zZXRMb2NhdGlvbihsb2NhdGlvbik7Ci0JCQkJCQl0YXJnZXQuc2V0U2l6ZShuZXcgRGltZW5zaW9uKAotCQkJCQkJCQl0YXJnZXQuZ2V0UHJlZmVycmVkU2l6ZSgpLndpZHRoLCB0YXJnZXQKLQkJCQkJCQkJCQkuZ2V0UHJlZmVycmVkU2l6ZSgpLmhlaWdodCkpOwotCQkJCQl9Ci0KLQkJCQkJcHJvdGVjdGVkIFBvaW50IGdldFJlZmVyZW5jZVBvaW50KCkgewotCQkJCQkJcmV0dXJuIGdldExhYmVsTG9jYXRpb24ocGFyZW50KTsKLQkJCQkJfQotCQkJCX0pOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUG9pbnQgZ2V0UmVmZXJlbmNlUG9pbnQoKSB7Ci0JCXJldHVybiBnZXRMYWJlbExvY2F0aW9uKCgoR3JhcGhpY2FsRWRpdFBhcnQpIGdldFBhcmVudCgpKS5nZXRGaWd1cmUoKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBQb2ludCBnZXRMYWJlbExvY2F0aW9uKElGaWd1cmUgcGFyZW50KSB7Ci0JCXJldHVybiBwYXJlbnQuZ2V0Qm91bmRzKCkuZ2V0Qm90dG9tKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9wYXJ0cy9MaW5rRWRpdFBhcnQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvcGFydHMvTGlua0VkaXRQYXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwYmEyYjcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9wYXJ0cy9MaW5rRWRpdFBhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wYXJ0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Db2xvckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5FZGl0UG9saWN5Um9sZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuUG9seWxpbmVDb25uZWN0aW9uRXg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRWRnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Db25uZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlBvbHlsaW5lRGVjb3JhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnRMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBvbGljaWVzLkxpbmtJdGVtU2VtYW50aWNFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUudXRpbC5EaWFncmFtQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUudXRpbC5EaWFncmFtQ29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS51dGlsLkRpYWdyYW1Db3JlVmFsaWRhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLkNvbm5lY3Rpb25Ob2RlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIExpbmtFZGl0UGFydCBleHRlbmRzIENvbm5lY3Rpb25Ob2RlRWRpdFBhcnQgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZJU1VBTF9JRCA9IDMwMDE7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpbmtFZGl0UGFydChWaWV3IHZpZXcpIHsKLQkJc3VwZXIodmlldyk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKSB7Ci0JCXN1cGVyLmNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKTsKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLlNFTUFOVElDX1JPTEUsCi0JCQkJbmV3IExpbmtJdGVtU2VtYW50aWNFZGl0UG9saWN5KCkpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgZmlndXJlIGZvciB0aGlzIGVkaXQgcGFydC4KLQkgKiAKLQkgKiBCb2R5IG9mIHRoaXMgbWV0aG9kIGRvZXMgbm90IGRlcGVuZCBvbiBzZXR0aW5ncyBpbiBnZW5lcmF0aW9uIG1vZGVsCi0JICogc28geW91IG1heSBzYWZlbHkgcmVtb3ZlIDxpPmdlbmVyYXRlZDwvaT4gdGFnIGFuZCBtb2RpZnkgaXQuCi0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb25uZWN0aW9uIGNyZWF0ZUNvbm5lY3Rpb25GaWd1cmUoKSB7Ci0KLQkJcmV0dXJuIG5ldyBMaW5rRmlndXJlKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBjbGFzcyBMaW5rRmlndXJlIGV4dGVuZHMgUG9seWxpbmVDb25uZWN0aW9uRXggewotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgTGlua0ZpZ3VyZSgpIHsKLQkJCXRoaXMuc2V0Rm9yZWdyb3VuZENvbG9yKENvbG9yQ29uc3RhbnRzLmJsYWNrCi0KLQkJCSk7Ci0JCQlzZXRUYXJnZXREZWNvcmF0aW9uKGNyZWF0ZVRhcmdldERlY29yYXRpb24oKSk7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSBQb2x5bGluZURlY29yYXRpb24gY3JlYXRlVGFyZ2V0RGVjb3JhdGlvbigpIHsKLQkJCVBvbHlsaW5lRGVjb3JhdGlvbiBkZiA9IG5ldyBQb2x5bGluZURlY29yYXRpb24oKTsKLQkJCS8vIGRpc3BhdGNoTmV4dD8KLQotCQkJUG9pbnRMaXN0IHBsID0gbmV3IFBvaW50TGlzdCgpOwotCQkJcGwuYWRkUG9pbnQoLTEsIDEpOwotCQkJcGwuYWRkUG9pbnQoMCwgMCk7Ci0JCQlwbC5hZGRQb2ludCgtMSwgLTEpOwotCQkJZGYuc2V0VGVtcGxhdGUocGwpOwotCQkJZGYuc2V0U2NhbGUoZ2V0TWFwTW9kZSgpLkRQdG9MUCg3KSwgZ2V0TWFwTW9kZSgpLkRQdG9MUCgzKSk7Ci0KLQkJCXJldHVybiBkZjsKLQkJfQotCi0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0Rm9yZWdyb3VuZENvbG9yKENvbG9yIGNvbG9yKSB7Ci0JCUNvbG9yIG92ZXJyaWRlQ29sb3IgPSBEaWFncmFtQ29yZVV0aWwuZ2V0TGlua092ZXJyaWRlQ29sb3IoKEVkZ2UpIGdldE1vZGVsKCkpOwotCQlzdXBlci5zZXRGb3JlZ3JvdW5kQ29sb3Iob3ZlcnJpZGVDb2xvciAhPSBudWxsID8gb3ZlcnJpZGVDb2xvciA6IGNvbG9yKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBkZWFjdGl2YXRlKCkgewotCQlzdXBlci5kZWFjdGl2YXRlKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VmlzaWJpbGl0eShib29sZWFuIHZpcykgewotCQlzdXBlci5zZXRWaXNpYmlsaXR5KHZpcyk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgYWN0aXZhdGUoKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJc3VwZXIuYWN0aXZhdGUoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L3BhcnRzL0xpbmtOYW1lRWRpdFBhcnQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvcGFydHMvTGlua05hbWVFZGl0UGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYWYwMTUzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvcGFydHMvTGlua05hbWVFZGl0UGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTg2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBhcnRzOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkNvbm5lY3Rpb25Mb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5SdW5uYWJsZVdpdGhSZXN1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucG9saWNpZXMuRGlhZ3JhbVRleHRTZWxlY3Rpb25FZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5wYXJ0LkRpYWdyYW1WaXN1YWxJRFJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5wcm92aWRlcnMuRGlhZ3JhbUVsZW1lbnRUeXBlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnV0aWwuRGlhZ3JhbUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuQWNjZXNzaWJsZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5yZXF1ZXN0cy5EaXJlY3RFZGl0UmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYudG9vbHMuRGlyZWN0RWRpdE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5JUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuSVBhcnNlckVkaXRTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5QYXJzZXJFZGl0U3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuUGFyc2VyT3B0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLlBhcnNlclNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklUZXh0QXdhcmVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5MYWJlbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkxhYmVsRGlyZWN0RWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmwxMG4uRGlhZ3JhbUNvbG9yUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXF1ZXN0cy5SZXF1ZXN0Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkudG9vbHMuVGV4dERpcmVjdEVkaXRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29yZS51dGlsLkVPYmplY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuSUVsZW1lbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi51aS5zZXJ2aWNlcy5wYXJzZXIuSVNlbWFudGljUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi51aS5zZXJ2aWNlcy5wYXJzZXIuUGFyc2VySGludEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRm9udFN0eWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vdGF0aW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGVudEFzc2lzdFByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDZWxsRWRpdG9yVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJsZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIExpbmtOYW1lRWRpdFBhcnQgZXh0ZW5kcyBMYWJlbEVkaXRQYXJ0IGltcGxlbWVudHMKLQkJSVRleHRBd2FyZUVkaXRQYXJ0IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWSVNVQUxfSUQgPSA0MDA0OwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRGlyZWN0RWRpdE1hbmFnZXIgbWFuYWdlcjsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIElQYXJzZXIgcGFyc2VyOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgTGlzdCBwYXJzZXJFbGVtZW50czsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBkZWZhdWx0VGV4dDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlzdGF0aWMgewotCQlyZWdpc3RlclNuYXBCYWNrUG9zaXRpb24oRGlhZ3JhbVZpc3VhbElEUmVnaXN0cnkKLQkJCQkuZ2V0VHlwZShMaW5rTmFtZUVkaXRQYXJ0LlZJU1VBTF9JRCksIG5ldyBQb2ludCgwLCA0MCkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlua05hbWVFZGl0UGFydChWaWV3IHZpZXcpIHsKLQkJc3VwZXIodmlldyk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKSB7Ci0JCXN1cGVyLmNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKTsKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5ESVJFQ1RfRURJVF9ST0xFLAotCQkJCW5ldyBMYWJlbERpcmVjdEVkaXRQb2xpY3koKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0S2V5UG9pbnQoKSB7Ci0JCXJldHVybiBDb25uZWN0aW9uTG9jYXRvci5NSURETEU7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TGFiZWxUZXh0SGVscGVyKElGaWd1cmUgZmlndXJlKSB7Ci0JCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCXJldHVybiAoKFdyYXBMYWJlbCkgZmlndXJlKS5nZXRUZXh0KCk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gKChMYWJlbCkgZmlndXJlKS5nZXRUZXh0KCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0TGFiZWxUZXh0SGVscGVyKElGaWd1cmUgZmlndXJlLCBTdHJpbmcgdGV4dCkgewotCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQkoKFdyYXBMYWJlbCkgZmlndXJlKS5zZXRUZXh0KHRleHQpOwotCQl9IGVsc2UgewotCQkJKChMYWJlbCkgZmlndXJlKS5zZXRUZXh0KHRleHQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJbWFnZSBnZXRMYWJlbEljb25IZWxwZXIoSUZpZ3VyZSBmaWd1cmUpIHsKLQkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJcmV0dXJuICgoV3JhcExhYmVsKSBmaWd1cmUpLmdldEljb24oKTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiAoKExhYmVsKSBmaWd1cmUpLmdldEljb24oKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRMYWJlbEljb25IZWxwZXIoSUZpZ3VyZSBmaWd1cmUsIEltYWdlIGljb24pIHsKLQkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJKChXcmFwTGFiZWwpIGZpZ3VyZSkuc2V0SWNvbihpY29uKTsKLQkJfSBlbHNlIHsKLQkJCSgoTGFiZWwpIGZpZ3VyZSkuc2V0SWNvbihpY29uKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMYWJlbChJRmlndXJlIGZpZ3VyZSkgewotCQl1bnJlZ2lzdGVyVmlzdWFscygpOwotCQlzZXRGaWd1cmUoZmlndXJlKTsKLQkJZGVmYXVsdFRleHQgPSBnZXRMYWJlbFRleHRIZWxwZXIoZmlndXJlKTsKLQkJcmVnaXN0ZXJWaXN1YWxzKCk7Ci0JCXJlZnJlc2hWaXN1YWxzKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBMaXN0IGdldE1vZGVsQ2hpbGRyZW4oKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSUdyYXBoaWNhbEVkaXRQYXJ0IGdldENoaWxkQnlTZW1hbnRpY0hpbnQoU3RyaW5nIHNlbWFudGljSGludCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVPYmplY3QgZ2V0UGFyc2VyRWxlbWVudCgpIHsKLQkJRU9iamVjdCBlbGVtZW50ID0gcmVzb2x2ZVNlbWFudGljRWxlbWVudCgpOwotCQlyZXR1cm4gZWxlbWVudCAhPSBudWxsID8gZWxlbWVudCA6IChWaWV3KSBnZXRNb2RlbCgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSW1hZ2UgZ2V0TGFiZWxJY29uKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRMYWJlbFRleHQoKSB7Ci0JCVN0cmluZyB0ZXh0ID0gbnVsbDsKLQkJaWYgKGdldFBhcnNlcigpICE9IG51bGwpIHsKLQkJCXRleHQgPSBnZXRQYXJzZXIoKS5nZXRQcmludFN0cmluZygKLQkJCQkJbmV3IEVPYmplY3RBZGFwdGVyKGdldFBhcnNlckVsZW1lbnQoKSksCi0JCQkJCWdldFBhcnNlck9wdGlvbnMoKS5pbnRWYWx1ZSgpKTsKLQkJfQotCQlpZiAodGV4dCA9PSBudWxsIHx8IHRleHQubGVuZ3RoKCkgPT0gMCkgewotCQkJdGV4dCA9IGRlZmF1bHRUZXh0OwotCQl9Ci0JCXJldHVybiB0ZXh0OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMYWJlbFRleHQoU3RyaW5nIHRleHQpIHsKLQkJc2V0TGFiZWxUZXh0SGVscGVyKGdldEZpZ3VyZSgpLCB0ZXh0KTsKLQkJT2JqZWN0IHBkRWRpdFBvbGljeSA9IGdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSk7Ci0JCWlmIChwZEVkaXRQb2xpY3kgaW5zdGFuY2VvZiBEaWFncmFtVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHsKLQkJCSgoRGlhZ3JhbVRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSBwZEVkaXRQb2xpY3kpLnJlZnJlc2hGZWVkYmFjaygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RWRpdFRleHQoKSB7Ci0JCWlmIChnZXRQYXJzZXIoKSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gZ2V0UGFyc2VyKCkuZ2V0RWRpdFN0cmluZygKLQkJCQluZXcgRU9iamVjdEFkYXB0ZXIoZ2V0UGFyc2VyRWxlbWVudCgpKSwKLQkJCQlnZXRQYXJzZXJPcHRpb25zKCkuaW50VmFsdWUoKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzRWRpdGFibGUoKSB7Ci0JCXJldHVybiBnZXRQYXJzZXIoKSAhPSBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSUNlbGxFZGl0b3JWYWxpZGF0b3IgZ2V0RWRpdFRleHRWYWxpZGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgSUNlbGxFZGl0b3JWYWxpZGF0b3IoKSB7Ci0KLQkJCXB1YmxpYyBTdHJpbmcgaXNWYWxpZChmaW5hbCBPYmplY3QgdmFsdWUpIHsKLQkJCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpIHsKLQkJCQkJZmluYWwgRU9iamVjdCBlbGVtZW50ID0gZ2V0UGFyc2VyRWxlbWVudCgpOwotCQkJCQlmaW5hbCBJUGFyc2VyIHBhcnNlciA9IGdldFBhcnNlcigpOwotCQkJCQl0cnkgewotCQkJCQkJSVBhcnNlckVkaXRTdGF0dXMgdmFsaWQgPSAoSVBhcnNlckVkaXRTdGF0dXMpIGdldEVkaXRpbmdEb21haW4oKQotCQkJCQkJCQkucnVuRXhjbHVzaXZlKG5ldyBSdW5uYWJsZVdpdGhSZXN1bHQuSW1wbCgpIHsKLQotCQkJCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCQkJCXNldFJlc3VsdChwYXJzZXIuaXNWYWxpZEVkaXRTdHJpbmcoCi0JCQkJCQkJCQkJCQluZXcgRU9iamVjdEFkYXB0ZXIoZWxlbWVudCksCi0JCQkJCQkJCQkJCQkoU3RyaW5nKSB2YWx1ZSkpOwotCQkJCQkJCQkJfQotCQkJCQkJCQl9KTsKLQkJCQkJCXJldHVybiB2YWxpZC5nZXRDb2RlKCkgPT0gUGFyc2VyRWRpdFN0YXR1cy5FRElUQUJMRSA/IG51bGwKLQkJCQkJCQkJOiB2YWxpZC5nZXRNZXNzYWdlKCk7Ci0JCQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGllKSB7Ci0JCQkJCQlpZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQkJfQotCQkJCX0KLQotCQkJCS8vIHNob3VsZG4ndCBnZXQgaGVyZQotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IgZ2V0Q29tcGxldGlvblByb2Nlc3NvcigpIHsKLQkJaWYgKGdldFBhcnNlcigpID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiBnZXRQYXJzZXIoKS5nZXRDb21wbGV0aW9uUHJvY2Vzc29yKAotCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihnZXRQYXJzZXJFbGVtZW50KCkpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFBhcnNlck9wdGlvbnMgZ2V0UGFyc2VyT3B0aW9ucygpIHsKLQkJcmV0dXJuIFBhcnNlck9wdGlvbnMuTk9ORTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElQYXJzZXIgZ2V0UGFyc2VyKCkgewotCQlpZiAocGFyc2VyID09IG51bGwpIHsKLQkJCVN0cmluZyBwYXJzZXJIaW50ID0gKChWaWV3KSBnZXRNb2RlbCgpKS5nZXRUeXBlKCk7Ci0JCQlQYXJzZXJIaW50QWRhcHRlciBoaW50QWRhcHRlciA9IG5ldyBQYXJzZXJIaW50QWRhcHRlcigKLQkJCQkJZ2V0UGFyc2VyRWxlbWVudCgpLCBwYXJzZXJIaW50KSB7Ci0KLQkJCQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgYWRhcHRlcikgewotCQkJCQlpZiAoSUVsZW1lbnRUeXBlLmNsYXNzLmVxdWFscyhhZGFwdGVyKSkgewotCQkJCQkJcmV0dXJuIERpYWdyYW1FbGVtZW50VHlwZXMuTGlua18zMDAxOwotCQkJCQl9Ci0JCQkJCXJldHVybiBzdXBlci5nZXRBZGFwdGVyKGFkYXB0ZXIpOwotCQkJCX0KLQkJCX07Ci0JCQlwYXJzZXIgPSBQYXJzZXJTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0UGFyc2VyKGhpbnRBZGFwdGVyKTsKLQkJfQotCQlyZXR1cm4gcGFyc2VyOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRGlyZWN0RWRpdE1hbmFnZXIgZ2V0TWFuYWdlcigpIHsKLQkJaWYgKG1hbmFnZXIgPT0gbnVsbCkgewotCQkJc2V0TWFuYWdlcihuZXcgVGV4dERpcmVjdEVkaXRNYW5hZ2VyKHRoaXMsIFRleHREaXJlY3RFZGl0TWFuYWdlcgotCQkJCQkuZ2V0VGV4dENlbGxFZGl0b3JDbGFzcyh0aGlzKSwgRGlhZ3JhbUVkaXRQYXJ0RmFjdG9yeQotCQkJCQkuZ2V0VGV4dENlbGxFZGl0b3JMb2NhdG9yKHRoaXMpKSk7Ci0JCX0KLQkJcmV0dXJuIG1hbmFnZXI7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldE1hbmFnZXIoRGlyZWN0RWRpdE1hbmFnZXIgbWFuYWdlcikgewotCQl0aGlzLm1hbmFnZXIgPSBtYW5hZ2VyOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdCgpIHsKLQkJZ2V0TWFuYWdlcigpLnNob3coKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURpcmVjdEVkaXQoUG9pbnQgZXZlbnRMb2NhdGlvbikgewotCQlpZiAoZ2V0TWFuYWdlcigpLmdldENsYXNzKCkgPT0gVGV4dERpcmVjdEVkaXRNYW5hZ2VyLmNsYXNzKSB7Ci0JCQkoKFRleHREaXJlY3RFZGl0TWFuYWdlcikgZ2V0TWFuYWdlcigpKS5zaG93KGV2ZW50TG9jYXRpb24KLQkJCQkJLmdldFNXVFBvaW50KCkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdChjaGFyIGluaXRpYWxDaGFyYWN0ZXIpIHsKLQkJaWYgKGdldE1hbmFnZXIoKSBpbnN0YW5jZW9mIFRleHREaXJlY3RFZGl0TWFuYWdlcikgewotCQkJKChUZXh0RGlyZWN0RWRpdE1hbmFnZXIpIGdldE1hbmFnZXIoKSkuc2hvdyhpbml0aWFsQ2hhcmFjdGVyKTsKLQkJfSBlbHNlIHsKLQkJCXBlcmZvcm1EaXJlY3RFZGl0KCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURpcmVjdEVkaXRSZXF1ZXN0KFJlcXVlc3QgcmVxdWVzdCkgewotCQlmaW5hbCBSZXF1ZXN0IHRoZVJlcXVlc3QgPSByZXF1ZXN0OwotCQl0cnkgewotCQkJZ2V0RWRpdGluZ0RvbWFpbigpLnJ1bkV4Y2x1c2l2ZShuZXcgUnVubmFibGUoKSB7Ci0KLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCWlmIChpc0FjdGl2ZSgpICYmIGlzRWRpdGFibGUoKSkgewotCQkJCQkJaWYgKHRoZVJlcXVlc3QKLQkJCQkJCQkJLmdldEV4dGVuZGVkRGF0YSgpCi0JCQkJCQkJCS5nZXQoCi0JCQkJCQkJCQkJUmVxdWVzdENvbnN0YW50cy5SRVFfRElSRUNURURJVF9FWFRFTkRFRERBVEFfSU5JVElBTF9DSEFSKSBpbnN0YW5jZW9mIENoYXJhY3RlcikgewotCQkJCQkJCUNoYXJhY3RlciBpbml0aWFsQ2hhciA9IChDaGFyYWN0ZXIpIHRoZVJlcXVlc3QKLQkJCQkJCQkJCS5nZXRFeHRlbmRlZERhdGEoKQotCQkJCQkJCQkJLmdldCgKLQkJCQkJCQkJCQkJUmVxdWVzdENvbnN0YW50cy5SRVFfRElSRUNURURJVF9FWFRFTkRFRERBVEFfSU5JVElBTF9DSEFSKTsKLQkJCQkJCQlwZXJmb3JtRGlyZWN0RWRpdChpbml0aWFsQ2hhci5jaGFyVmFsdWUoKSk7Ci0JCQkJCQl9IGVsc2UgaWYgKCh0aGVSZXF1ZXN0IGluc3RhbmNlb2YgRGlyZWN0RWRpdFJlcXVlc3QpCi0JCQkJCQkJCSYmIChnZXRFZGl0VGV4dCgpLmVxdWFscyhnZXRMYWJlbFRleHQoKSkpKSB7Ci0JCQkJCQkJRGlyZWN0RWRpdFJlcXVlc3QgZWRpdFJlcXVlc3QgPSAoRGlyZWN0RWRpdFJlcXVlc3QpIHRoZVJlcXVlc3Q7Ci0JCQkJCQkJcGVyZm9ybURpcmVjdEVkaXQoZWRpdFJlcXVlc3QuZ2V0TG9jYXRpb24oKSk7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCXBlcmZvcm1EaXJlY3RFZGl0KCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9KTsKLQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoVmlzdWFscygpIHsKLQkJc3VwZXIucmVmcmVzaFZpc3VhbHMoKTsKLQkJcmVmcmVzaExhYmVsKCk7Ci0JCXJlZnJlc2hGb250KCk7Ci0JCXJlZnJlc2hGb250Q29sb3IoKTsKLQkJcmVmcmVzaFVuZGVybGluZSgpOwotCQlyZWZyZXNoU3RyaWtlVGhyb3VnaCgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoTGFiZWwoKSB7Ci0JCXNldExhYmVsVGV4dEhlbHBlcihnZXRGaWd1cmUoKSwgZ2V0TGFiZWxUZXh0KCkpOwotCQlzZXRMYWJlbEljb25IZWxwZXIoZ2V0RmlndXJlKCksIGdldExhYmVsSWNvbigpKTsKLQkJT2JqZWN0IHBkRWRpdFBvbGljeSA9IGdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSk7Ci0JCWlmIChwZEVkaXRQb2xpY3kgaW5zdGFuY2VvZiBEaWFncmFtVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHsKLQkJCSgoRGlhZ3JhbVRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSBwZEVkaXRQb2xpY3kpLnJlZnJlc2hGZWVkYmFjaygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hVbmRlcmxpbmUoKSB7Ci0JCUZvbnRTdHlsZSBzdHlsZSA9IChGb250U3R5bGUpIGdldEZvbnRTdHlsZU93bmVyVmlldygpLmdldFN0eWxlKAotCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlKCkpOwotCQlpZiAoc3R5bGUgIT0gbnVsbCAmJiBnZXRGaWd1cmUoKSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJKChXcmFwTGFiZWwpIGdldEZpZ3VyZSgpKS5zZXRUZXh0VW5kZXJsaW5lKHN0eWxlLmlzVW5kZXJsaW5lKCkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hTdHJpa2VUaHJvdWdoKCkgewotCQlGb250U3R5bGUgc3R5bGUgPSAoRm9udFN0eWxlKSBnZXRGb250U3R5bGVPd25lclZpZXcoKS5nZXRTdHlsZSgKLQkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZSgpKTsKLQkJaWYgKHN0eWxlICE9IG51bGwgJiYgZ2V0RmlndXJlKCkgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCSgoV3JhcExhYmVsKSBnZXRGaWd1cmUoKSkuc2V0VGV4dFN0cmlrZVRocm91Z2goc3R5bGUKLQkJCQkJLmlzU3RyaWtlVGhyb3VnaCgpKTsKLQkJfQotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hGb250KCkgewotCQlGb250U3R5bGUgc3R5bGUgPSAoRm9udFN0eWxlKSBnZXRGb250U3R5bGVPd25lclZpZXcoKS5nZXRTdHlsZSgKLQkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZSgpKTsKLQkJU3RyaW5nIGZvbnROYW1lID0gRGlhZ3JhbUNvbnN0YW50cy5nZXRGb250TmFtZShzdHlsZSk7Ci0JCWlmIChzdHlsZSAhPSBudWxsKSB7Ci0JCQlGb250RGF0YSBmb250RGF0YSA9IG5ldyBGb250RGF0YShmb250TmFtZSwgc3R5bGUKLQkJCQkJLmdldEZvbnRIZWlnaHQoKSwgKHN0eWxlLmlzQm9sZCgpID8gU1dULkJPTEQgOiBTV1QuTk9STUFMKQotCQkJCQl8IChzdHlsZS5pc0l0YWxpYygpID8gU1dULklUQUxJQyA6IFNXVC5OT1JNQUwpKTsKLQkJCXNldEZvbnQoZm9udERhdGEpOwotCQl9Ci0JCWVsc2UKLQkJCXNldEZvbnQoRGlhZ3JhbUNvbnN0YW50cy5nZXREZWZhdWx0Rm9udERhdGEoKSk7Ci0JfQotCQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldEZvbnRDb2xvcihDb2xvciBjb2xvcikgewotCQlnZXRGaWd1cmUoKS5zZXRGb3JlZ3JvdW5kQ29sb3IoY29sb3IpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRTZW1hbnRpY0xpc3RlbmVycygpIHsKLQkJaWYgKGdldFBhcnNlcigpIGluc3RhbmNlb2YgSVNlbWFudGljUGFyc2VyKSB7Ci0JCQlFT2JqZWN0IGVsZW1lbnQgPSByZXNvbHZlU2VtYW50aWNFbGVtZW50KCk7Ci0JCQlwYXJzZXJFbGVtZW50cyA9ICgoSVNlbWFudGljUGFyc2VyKSBnZXRQYXJzZXIoKSkKLQkJCQkJLmdldFNlbWFudGljRWxlbWVudHNCZWluZ1BhcnNlZChlbGVtZW50KTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGFyc2VyRWxlbWVudHMuc2l6ZSgpOyBpKyspIHsKLQkJCQlhZGRMaXN0ZW5lckZpbHRlcigKLQkJCQkJCSJTZW1hbnRpY01vZGVsIiArIGksIHRoaXMsIChFT2JqZWN0KSBwYXJzZXJFbGVtZW50cy5nZXQoaSkpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlzdXBlci5hZGRTZW1hbnRpY0xpc3RlbmVycygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbW92ZVNlbWFudGljTGlzdGVuZXJzKCkgewotCQlpZiAocGFyc2VyRWxlbWVudHMgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJzZXJFbGVtZW50cy5zaXplKCk7IGkrKykgewotCQkJCXJlbW92ZUxpc3RlbmVyRmlsdGVyKCJTZW1hbnRpY01vZGVsIiArIGkpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlzdXBlci5yZW1vdmVTZW1hbnRpY0xpc3RlbmVycygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBBY2Nlc3NpYmxlRWRpdFBhcnQgZ2V0QWNjZXNzaWJsZUVkaXRQYXJ0KCkgewotCQlpZiAoYWNjZXNzaWJsZUVQID09IG51bGwpIHsKLQkJCWFjY2Vzc2libGVFUCA9IG5ldyBBY2Nlc3NpYmxlR3JhcGhpY2FsRWRpdFBhcnQoKSB7Ci0KLQkJCQlwdWJsaWMgdm9pZCBnZXROYW1lKEFjY2Vzc2libGVFdmVudCBlKSB7Ci0JCQkJCWUucmVzdWx0ID0gZ2V0TGFiZWxUZXh0SGVscGVyKGdldEZpZ3VyZSgpKTsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0JCXJldHVybiBhY2Nlc3NpYmxlRVA7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgVmlldyBnZXRGb250U3R5bGVPd25lclZpZXcoKSB7Ci0JCXJldHVybiBnZXRQcmltYXJ5VmlldygpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVOb3RpZmljYXRpb25FdmVudChOb3RpZmljYXRpb24gZXZlbnQpIHsKLQkJT2JqZWN0IGZlYXR1cmUgPSBldmVudC5nZXRGZWF0dXJlKCk7Ci0JCWlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Gb250Q29sb3IoKS5lcXVhbHMoZmVhdHVyZSkpIHsKLQkJCUludGVnZXIgYyA9IChJbnRlZ2VyKSBldmVudC5nZXROZXdWYWx1ZSgpOwotCQkJc2V0Rm9udENvbG9yKERpYWdyYW1Db2xvclJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0Q29sb3IoYykpOwotCQl9IGVsc2UgaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX1VuZGVybGluZSgpLmVxdWFscygKLQkJCQlmZWF0dXJlKSkgewotCQkJcmVmcmVzaFVuZGVybGluZSgpOwotCQl9IGVsc2UgaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX1N0cmlrZVRocm91Z2goKQotCQkJCS5lcXVhbHMoZmVhdHVyZSkpIHsKLQkJCXJlZnJlc2hTdHJpa2VUaHJvdWdoKCk7Ci0JCX0gZWxzZSBpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfRm9udEhlaWdodCgpLmVxdWFscygKLQkJCQlmZWF0dXJlKQotCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0ZvbnROYW1lKCkuZXF1YWxzKAotCQkJCQkJZmVhdHVyZSkKLQkJCQl8fCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Cb2xkKCkKLQkJCQkJCS5lcXVhbHMoZmVhdHVyZSkKLQkJCQl8fCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9JdGFsaWMoKS5lcXVhbHMoCi0JCQkJCQlmZWF0dXJlKSkgewotCQkJcmVmcmVzaEZvbnQoKTsKLQkJfSBlbHNlIHsKLQkJCWlmIChnZXRQYXJzZXIoKSAhPSBudWxsCi0JCQkJCSYmIGdldFBhcnNlcigpLmlzQWZmZWN0aW5nRXZlbnQoZXZlbnQsCi0JCQkJCQkJZ2V0UGFyc2VyT3B0aW9ucygpLmludFZhbHVlKCkpKSB7Ci0JCQkJcmVmcmVzaExhYmVsKCk7Ci0JCQl9Ci0JCQlpZiAoZ2V0UGFyc2VyKCkgaW5zdGFuY2VvZiBJU2VtYW50aWNQYXJzZXIpIHsKLQkJCQlJU2VtYW50aWNQYXJzZXIgbW9kZWxQYXJzZXIgPSAoSVNlbWFudGljUGFyc2VyKSBnZXRQYXJzZXIoKTsKLQkJCQlpZiAobW9kZWxQYXJzZXIuYXJlU2VtYW50aWNFbGVtZW50c0FmZmVjdGVkKG51bGwsIGV2ZW50KSkgewotCQkJCQlyZW1vdmVTZW1hbnRpY0xpc3RlbmVycygpOwotCQkJCQlpZiAocmVzb2x2ZVNlbWFudGljRWxlbWVudCgpICE9IG51bGwpIHsKLQkJCQkJCWFkZFNlbWFudGljTGlzdGVuZXJzKCk7Ci0JCQkJCX0KLQkJCQkJcmVmcmVzaExhYmVsKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXN1cGVyLmhhbmRsZU5vdGlmaWNhdGlvbkV2ZW50KGV2ZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlRmlndXJlKCkgewotCQlJRmlndXJlIGxhYmVsID0gY3JlYXRlRmlndXJlUHJpbSgpOwotCQlkZWZhdWx0VGV4dCA9IGdldExhYmVsVGV4dEhlbHBlcihsYWJlbCk7Ci0JCXJldHVybiBsYWJlbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlRmlndXJlUHJpbSgpIHsKLQkJcmV0dXJuIG5ldyBXcmFwTGFiZWwoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvcGFydHMvUm9sZU5vZGVFZGl0UGFydC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9wYXJ0cy9Sb2xlTm9kZUVkaXRQYXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlMjkyZDkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9wYXJ0cy9Sb2xlTm9kZUVkaXRQYXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNTEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucGFydHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTGF5b3V0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5TdGFja0xheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuRGltZW5zaW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucG9saWNpZXMuUm9sZU5vZGVDYW5vbmljYWxFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBvbGljaWVzLlJvbGVOb2RlR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucG9saWNpZXMuUm9sZU5vZGVJdGVtU2VtYW50aWNFZGl0UG9saWN5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLnBhcnQuRGlhZ3JhbVZpc3VhbElEUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5maWd1cmVzLldpZGVuZWRXcmFwTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS51dGlsLkRpYWdyYW1Db3JlVXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5MYXlvdXRFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuTm9uUmVzaXphYmxlRWRpdFBvbGljeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5yZXF1ZXN0cy5DcmVhdGVSZXF1ZXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLlNoYXBlTm9kZUVkaXRQYXJ0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuRWRpdFBvbGljeVJvbGVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuQ29uc3RyYWluZWRUb29sYmFyTGF5b3V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmdlZi51aS5maWd1cmVzLkRlZmF1bHRTaXplTm9kZUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5nZWYudWkuZmlndXJlcy5Ob2RlRmlndXJlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFJvbGVOb2RlRWRpdFBhcnQgZXh0ZW5kcyBTaGFwZU5vZGVFZGl0UGFydCB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVklTVUFMX0lEID0gMjAwMTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBjb250ZW50UGFuZTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBwcmltYXJ5U2hhcGU7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJvbGVOb2RlRWRpdFBhcnQoVmlldyB2aWV3KSB7Ci0JCXN1cGVyKHZpZXcpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCkgewotCi0JCXN1cGVyLmNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKTsKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLlNFTUFOVElDX1JPTEUsCi0JCQkJbmV3IFJvbGVOb2RlSXRlbVNlbWFudGljRWRpdFBvbGljeSgpKTsKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5MQVlPVVRfUk9MRSwgY3JlYXRlTGF5b3V0RWRpdFBvbGljeSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIExheW91dEVkaXRQb2xpY3kgY3JlYXRlTGF5b3V0RWRpdFBvbGljeSgpIHsKLQkJTGF5b3V0RWRpdFBvbGljeSBsZXAgPSBuZXcgTGF5b3V0RWRpdFBvbGljeSgpIHsKLQotCQkJcHJvdGVjdGVkIEVkaXRQb2xpY3kgY3JlYXRlQ2hpbGRFZGl0UG9saWN5KEVkaXRQYXJ0IGNoaWxkKSB7Ci0JCQkJRWRpdFBvbGljeSByZXN1bHQgPSBjaGlsZAotCQkJCQkJLmdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSB7Ci0JCQkJCXJlc3VsdCA9IG5ldyBOb25SZXNpemFibGVFZGl0UG9saWN5KCk7Ci0JCQkJfQotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0KLQkJCXByb3RlY3RlZCBDb21tYW5kIGdldE1vdmVDaGlsZHJlbkNvbW1hbmQoUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0KLQkJCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZUNvbW1hbmQoQ3JlYXRlUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCX07Ci0JCXJldHVybiBsZXA7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZU5vZGVTaGFwZSgpIHsKLQkJUm9sZU5vZGVGaWd1cmUgZmlndXJlID0gbmV3IFJvbGVOb2RlRmlndXJlKCk7Ci0JCXJldHVybiBwcmltYXJ5U2hhcGUgPSBmaWd1cmU7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSb2xlTm9kZUZpZ3VyZSBnZXRQcmltYXJ5U2hhcGUoKSB7Ci0JCXJldHVybiAoUm9sZU5vZGVGaWd1cmUpIHByaW1hcnlTaGFwZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gYWRkRml4ZWRDaGlsZChFZGl0UGFydCBjaGlsZEVkaXRQYXJ0KSB7Ci0JCWlmIChjaGlsZEVkaXRQYXJ0IGluc3RhbmNlb2YgUm9sZU5vZGVOYW1lRWRpdFBhcnQpIHsKLQkJCSgoUm9sZU5vZGVOYW1lRWRpdFBhcnQpIGNoaWxkRWRpdFBhcnQpLnNldExhYmVsKGdldFByaW1hcnlTaGFwZSgpCi0JCQkJCS5nZXRGaWd1cmVSb2xlTm9kZU5hbWVGaWd1cmUoKSk7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHJlbW92ZUZpeGVkQ2hpbGQoRWRpdFBhcnQgY2hpbGRFZGl0UGFydCkgewotCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE5vZGVGaWd1cmUgY3JlYXRlTm9kZVBsYXRlKCkgewotCQlEZWZhdWx0U2l6ZU5vZGVGaWd1cmUgcmVzdWx0ID0gbmV3IERlZmF1bHRTaXplTm9kZUZpZ3VyZShnZXRNYXBNb2RlKCkKLQkJCQkuRFB0b0xQKDQwKSwgZ2V0TWFwTW9kZSgpLkRQdG9MUCg0MCkpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgZmlndXJlIGZvciB0aGlzIGVkaXQgcGFydC4KLQkgKiAKLQkgKiBCb2R5IG9mIHRoaXMgbWV0aG9kIGRvZXMgbm90IGRlcGVuZCBvbiBzZXR0aW5ncyBpbiBnZW5lcmF0aW9uIG1vZGVsCi0JICogc28geW91IG1heSBzYWZlbHkgcmVtb3ZlIDxpPmdlbmVyYXRlZDwvaT4gdGFnIGFuZCBtb2RpZnkgaXQuCi0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBOb2RlRmlndXJlIGNyZWF0ZU5vZGVGaWd1cmUoKSB7Ci0JCU5vZGVGaWd1cmUgZmlndXJlID0gY3JlYXRlTm9kZVBsYXRlKCk7Ci0JCWZpZ3VyZS5zZXRMYXlvdXRNYW5hZ2VyKG5ldyBTdGFja0xheW91dCgpKTsKLQkJSUZpZ3VyZSBzaGFwZSA9IGNyZWF0ZU5vZGVTaGFwZSgpOwotCQlmaWd1cmUuYWRkKHNoYXBlKTsKLQkJY29udGVudFBhbmUgPSBzZXR1cENvbnRlbnRQYW5lKHNoYXBlKTsKLQkJcmV0dXJuIGZpZ3VyZTsKLQl9Ci0KLQkvKioKLQkgKiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIHRyZWF0cyBwYXNzZWQgZmlndXJlIGFzIGNvbnRlbnQgcGFuZS4KLQkgKiBSZXNwZWN0cyBsYXlvdXQgb25lIG1heSBoYXZlIHNldCBmb3IgZ2VuZXJhdGVkIGZpZ3VyZS4KLQkgKiBAcGFyYW0gbm9kZVNoYXBlIGluc3RhbmNlIG9mIGdlbmVyYXRlZCBmaWd1cmUgY2xhc3MKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgc2V0dXBDb250ZW50UGFuZShJRmlndXJlIG5vZGVTaGFwZSkgewotCQlpZiAobm9kZVNoYXBlLmdldExheW91dE1hbmFnZXIoKSA9PSBudWxsKSB7Ci0JCQlDb25zdHJhaW5lZFRvb2xiYXJMYXlvdXQgbGF5b3V0ID0gbmV3IENvbnN0cmFpbmVkVG9vbGJhckxheW91dCgpOwotCQkJbGF5b3V0LnNldFNwYWNpbmcoZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSk7Ci0JCQlub2RlU2hhcGUuc2V0TGF5b3V0TWFuYWdlcihsYXlvdXQpOwotCQl9Ci0JCXJldHVybiBub2RlU2hhcGU7IC8vIHVzZSBub2RlU2hhcGUgaXRzZWxmIGFzIGNvbnRlbnRQYW5lCi0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJRmlndXJlIGdldENvbnRlbnRQYW5lKCkgewotCQlpZiAoY29udGVudFBhbmUgIT0gbnVsbCkgewotCQkJcmV0dXJuIGNvbnRlbnRQYW5lOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRDb250ZW50UGFuZSgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRWRpdFBhcnQgZ2V0UHJpbWFyeUNoaWxkRWRpdFBhcnQoKSB7Ci0JCXJldHVybiBnZXRDaGlsZEJ5U2VtYW50aWNIaW50KERpYWdyYW1WaXN1YWxJRFJlZ2lzdHJ5Ci0JCQkJLmdldFR5cGUoUm9sZU5vZGVOYW1lRWRpdFBhcnQuVklTVUFMX0lEKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZENoaWxkVmlzdWFsKEVkaXRQYXJ0IGNoaWxkRWRpdFBhcnQsIGludCBpbmRleCkgewotCQlpZiAoYWRkRml4ZWRDaGlsZChjaGlsZEVkaXRQYXJ0KSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmFkZENoaWxkVmlzdWFsKGNoaWxkRWRpdFBhcnQsIC0xKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlQ2hpbGRWaXN1YWwoRWRpdFBhcnQgY2hpbGRFZGl0UGFydCkgewotCQlpZiAocmVtb3ZlRml4ZWRDaGlsZChjaGlsZEVkaXRQYXJ0KSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLnJlbW92ZUNoaWxkVmlzdWFsKGNoaWxkRWRpdFBhcnQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBnZXRDb250ZW50UGFuZUZvcihJR3JhcGhpY2FsRWRpdFBhcnQgZWRpdFBhcnQpIHsKLQotCQlyZXR1cm4gc3VwZXIuZ2V0Q29udGVudFBhbmVGb3IoZWRpdFBhcnQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgY2xhc3MgUm9sZU5vZGVGaWd1cmUgZXh0ZW5kcyBSZWN0YW5nbGVGaWd1cmUgewotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgUm9sZU5vZGVGaWd1cmUoKSB7Ci0KLQkJCXRoaXMuc2V0T3V0bGluZShmYWxzZSk7Ci0JCQl0aGlzLnNldEJhY2tncm91bmRDb2xvcihST0xFTk9ERUZJR1VSRV9CQUNLCi0KLQkJCSk7Ci0JCQljcmVhdGVDb250ZW50cygpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBtb2RpZmllZAotCQkgKi8KLQkJcHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbnRlbnRzKCkgewotCQkJb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIGZpZ18wID0gbmV3IFdpZGVuZWRXcmFwTGFiZWwoKTsKLQkJCWZpZ18wLnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0JCQlmaWdfMC5zZXRGb250KFJPTEVOT0RFTkFNRUZJR1VSRV9GT05UKTsKLQkJCURpYWdyYW1Db3JlVXRpbC5zZXRMYWJlbFByb3BlcnRpZXMoZmlnXzApOyAvLyBtb2RpZmllZAotCQkJc2V0RmlndXJlUm9sZU5vZGVOYW1lRmlndXJlKGZpZ18wKTsKLQotCQkJT2JqZWN0IGxheURhdGEwID0gbnVsbDsKLQotCQkJdGhpcy5hZGQoZmlnXzAsIGxheURhdGEwKTsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIFdyYXBMYWJlbCBmUm9sZU5vZGVOYW1lRmlndXJlOwotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgV3JhcExhYmVsIGdldEZpZ3VyZVJvbGVOb2RlTmFtZUZpZ3VyZSgpIHsKLQkJCXJldHVybiBmUm9sZU5vZGVOYW1lRmlndXJlOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgdm9pZCBzZXRGaWd1cmVSb2xlTm9kZU5hbWVGaWd1cmUoV3JhcExhYmVsIGZpZykgewotCQkJZlJvbGVOb2RlTmFtZUZpZ3VyZSA9IGZpZzsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIGJvb2xlYW4gbXlVc2VMb2NhbENvb3JkaW5hdGVzID0gZmFsc2U7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByb3RlY3RlZCBib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMoKSB7Ci0JCQlyZXR1cm4gbXlVc2VMb2NhbENvb3JkaW5hdGVzOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByb3RlY3RlZCB2b2lkIHNldFVzZUxvY2FsQ29vcmRpbmF0ZXMoYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKSB7Ci0JCQlteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSB1c2VMb2NhbENvb3JkaW5hdGVzOwotCQl9Ci0KLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgYWN0aXZhdGUoKSB7Ci0JCXN1cGVyLmFjdGl2YXRlKCk7Ci0JCU9iamVjdCBtb2RlbCA9IGdldE1vZGVsKCk7Ci0JCWlmIChtb2RlbCBpbnN0YW5jZW9mIFZpZXcpIHsKLQkJCUVPYmplY3QgZSA9ICgoVmlldykgbW9kZWwpLmdldEVsZW1lbnQoKTsKLQkJCWlmIChlIGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZSkgewotCQkJCSgob3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZSkgZSkuYWRkQ29uc3VtZXIodGhpcyk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZGVhY3RpdmF0ZSgpIHsKLQkJc3VwZXIuZGVhY3RpdmF0ZSgpOwotCQlPYmplY3QgbW9kZWwgPSBnZXRNb2RlbCgpOwotCQlpZiAobW9kZWwgaW5zdGFuY2VvZiBWaWV3KSB7Ci0JCQlFT2JqZWN0IGUgPSAoKFZpZXcpIG1vZGVsKS5nZXRFbGVtZW50KCk7Ci0JCQlpZiAoZSBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGUpIHsKLQkJCQkoKG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGUpIGUpLnJlbW92ZUNvbnN1bWVyKHRoaXMpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29sb3IgUk9MRU5PREVGSUdVUkVfQkFDSyA9IG5ldyBDb2xvcihudWxsLCAyNTUsIDI1NSwKLQkJCTE1Nik7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBGb250IFJPTEVOT0RFTkFNRUZJR1VSRV9GT05UID0gbmV3IEZvbnQoRGlzcGxheQotCQkJLmdldEN1cnJlbnQoKSwgIkFyaWFsIiwgOCwgU1dULk5PUk1BTCk7IC8vJE5PTi1OTFMtMSQKLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9wYXJ0cy9Sb2xlTm9kZU5hbWVFZGl0UGFydC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9wYXJ0cy9Sb2xlTm9kZU5hbWVFZGl0UGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNjAxZGI1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvcGFydHMvUm9sZU5vZGVOYW1lRWRpdFBhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxNiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wYXJ0czsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlJ1bm5hYmxlV2l0aFJlc3VsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wb2xpY2llcy5EaWFncmFtVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLnBhcnQuQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5wcm92aWRlcnMuRGlhZ3JhbUVsZW1lbnRUeXBlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnByb3ZpZGVycy5EaWFncmFtSWNvblByb3ZpZGVyTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnV0aWwuRGlhZ3JhbUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnV0aWwuRGlhZ3JhbUNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5BY2Nlc3NpYmxlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuTm9uUmVzaXphYmxlRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuaGFuZGxlcy5Ob25SZXNpemFibGVIYW5kbGVLaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLkRpcmVjdEVkaXRSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi50b29scy5EaXJlY3RFZGl0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLklQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5JUGFyc2VyRWRpdFN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLlBhcnNlckVkaXRTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5QYXJzZXJPcHRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuUGFyc2VyU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5Db21wYXJ0bWVudEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklHcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JVGV4dEF3YXJlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuTGFiZWxEaXJlY3RFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkubDEwbi5EaWFncmFtQ29sb3JSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlcXVlc3RzLlJlcXVlc3RDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS50b29scy5UZXh0RGlyZWN0RWRpdE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb3JlLnV0aWwuRU9iamVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5JRWxlbWVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnVpLnNlcnZpY2VzLnBhcnNlci5JU2VtYW50aWNQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnVpLnNlcnZpY2VzLnBhcnNlci5QYXJzZXJIaW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Gb250U3R5bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm90YXRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vdGF0aW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGVudEFzc2lzdFByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDZWxsRWRpdG9yVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJsZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFJvbGVOb2RlTmFtZUVkaXRQYXJ0IGV4dGVuZHMgQ29tcGFydG1lbnRFZGl0UGFydCBpbXBsZW1lbnRzCi0JCUlUZXh0QXdhcmVFZGl0UGFydCB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVklTVUFMX0lEID0gNDAwMTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIERpcmVjdEVkaXRNYW5hZ2VyIG1hbmFnZXI7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBJUGFyc2VyIHBhcnNlcjsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIExpc3QgcGFyc2VyRWxlbWVudHM7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZGVmYXVsdFRleHQ7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJvbGVOb2RlTmFtZUVkaXRQYXJ0KFZpZXcgdmlldykgewotCQlzdXBlcih2aWV3KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpIHsKLQkJc3VwZXIuY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpOwotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LkRJUkVDVF9FRElUX1JPTEUsCi0JCQkJbmV3IExhYmVsRGlyZWN0RWRpdFBvbGljeSgpKTsKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSwKLQkJCQluZXcgTm9uUmVzaXphYmxlRWRpdFBvbGljeSgpIHsKLQotCQkJCQlwcm90ZWN0ZWQgTGlzdCBjcmVhdGVTZWxlY3Rpb25IYW5kbGVzKCkgewotCQkJCQkJTGlzdCBoYW5kbGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQkJTm9uUmVzaXphYmxlSGFuZGxlS2l0LmFkZE1vdmVIYW5kbGUoCi0JCQkJCQkJCShHcmFwaGljYWxFZGl0UGFydCkgZ2V0SG9zdCgpLCBoYW5kbGVzKTsKLQkJCQkJCXJldHVybiBoYW5kbGVzOwotCQkJCQl9Ci0KLQkJCQkJcHVibGljIENvbW1hbmQgZ2V0Q29tbWFuZChSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJCQkJCXJldHVybiBudWxsOwotCQkJCQl9Ci0KLQkJCQkJcHVibGljIGJvb2xlYW4gdW5kZXJzdGFuZHNSZXF1ZXN0KFJlcXVlc3QgcmVxdWVzdCkgewotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQl9Ci0JCQkJfSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TGFiZWxUZXh0SGVscGVyKElGaWd1cmUgZmlndXJlKSB7Ci0JCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCXJldHVybiAoKFdyYXBMYWJlbCkgZmlndXJlKS5nZXRUZXh0KCk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gKChMYWJlbCkgZmlndXJlKS5nZXRUZXh0KCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0TGFiZWxUZXh0SGVscGVyKElGaWd1cmUgZmlndXJlLCBTdHJpbmcgdGV4dCkgewotCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQkoKFdyYXBMYWJlbCkgZmlndXJlKS5zZXRUZXh0KHRleHQpOwotCQl9IGVsc2UgewotCQkJKChMYWJlbCkgZmlndXJlKS5zZXRUZXh0KHRleHQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJbWFnZSBnZXRMYWJlbEljb25IZWxwZXIoSUZpZ3VyZSBmaWd1cmUpIHsKLQkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJcmV0dXJuICgoV3JhcExhYmVsKSBmaWd1cmUpLmdldEljb24oKTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiAoKExhYmVsKSBmaWd1cmUpLmdldEljb24oKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRMYWJlbEljb25IZWxwZXIoSUZpZ3VyZSBmaWd1cmUsIEltYWdlIGljb24pIHsKLQkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJKChXcmFwTGFiZWwpIGZpZ3VyZSkuc2V0SWNvbihpY29uKTsKLQkJfSBlbHNlIHsKLQkJCSgoTGFiZWwpIGZpZ3VyZSkuc2V0SWNvbihpY29uKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMYWJlbChXcmFwTGFiZWwgZmlndXJlKSB7Ci0JCXVucmVnaXN0ZXJWaXN1YWxzKCk7Ci0JCXNldEZpZ3VyZShmaWd1cmUpOwotCQlkZWZhdWx0VGV4dCA9IGdldExhYmVsVGV4dEhlbHBlcihmaWd1cmUpOwotCQlyZWdpc3RlclZpc3VhbHMoKTsKLQkJcmVmcmVzaFZpc3VhbHMoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIExpc3QgZ2V0TW9kZWxDaGlsZHJlbigpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJR3JhcGhpY2FsRWRpdFBhcnQgZ2V0Q2hpbGRCeVNlbWFudGljSGludChTdHJpbmcgc2VtYW50aWNIaW50KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRU9iamVjdCBnZXRQYXJzZXJFbGVtZW50KCkgewotCQlFT2JqZWN0IGVsZW1lbnQgPSByZXNvbHZlU2VtYW50aWNFbGVtZW50KCk7Ci0JCXJldHVybiBlbGVtZW50ICE9IG51bGwgPyBlbGVtZW50IDogKFZpZXcpIGdldE1vZGVsKCk7Ci0JfQotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJvdGVjdGVkIEltYWdlIGdldExhYmVsSWNvbigpIHsKLQkJSW1hZ2UgaW1hZ2UgPSBEaWFncmFtSWNvblByb3ZpZGVyTWFuYWdlci5nZXRJbnN0YW5jZSgpLmdldEljb24ocmVzb2x2ZVNlbWFudGljRWxlbWVudCgpLCB0cnVlKTsKLQkJaWYgKGltYWdlID09IG51bGwpIHsKLQkJCWltYWdlID0gIEFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFNoYXJlZEltYWdlKAotCQkJCSJkaWFncmFtL1JvbGVEZXNjcmlwdG9yLmdpZiIpOwkvLyROT04tTkxTLTEkCi0JCX0KLQotCQlyZXR1cm4gaW1hZ2U7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TGFiZWxUZXh0KCkgewotCQlTdHJpbmcgdGV4dCA9IG51bGw7Ci0JCWlmIChnZXRQYXJzZXIoKSAhPSBudWxsKSB7Ci0JCQl0ZXh0ID0gZ2V0UGFyc2VyKCkuZ2V0UHJpbnRTdHJpbmcoCi0JCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihnZXRQYXJzZXJFbGVtZW50KCkpLAotCQkJCQlnZXRQYXJzZXJPcHRpb25zKCkuaW50VmFsdWUoKSk7Ci0JCX0KLQkJaWYgKHRleHQgPT0gbnVsbCB8fCB0ZXh0Lmxlbmd0aCgpID09IDApIHsKLQkJCXRleHQgPSBkZWZhdWx0VGV4dDsKLQkJfQotCQlyZXR1cm4gdGV4dDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGFiZWxUZXh0KFN0cmluZyB0ZXh0KSB7Ci0JCXNldExhYmVsVGV4dEhlbHBlcihnZXRGaWd1cmUoKSwgdGV4dCk7Ci0JCU9iamVjdCBwZEVkaXRQb2xpY3kgPSBnZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUpOwotCQlpZiAocGRFZGl0UG9saWN5IGluc3RhbmNlb2YgRGlhZ3JhbVRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSB7Ci0JCQkoKERpYWdyYW1UZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgcGRFZGl0UG9saWN5KS5yZWZyZXNoRmVlZGJhY2soKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEVkaXRUZXh0KCkgewotCQlpZiAoZ2V0UGFyc2VyKCkgPT0gbnVsbCkgewotCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIGdldFBhcnNlcigpLmdldEVkaXRTdHJpbmcoCi0JCQkJbmV3IEVPYmplY3RBZGFwdGVyKGdldFBhcnNlckVsZW1lbnQoKSksCi0JCQkJZ2V0UGFyc2VyT3B0aW9ucygpLmludFZhbHVlKCkpOwotCX0KLQotCS8qKgotCSAqIEBtb2RpZmllZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzRWRpdGFibGUoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQkJLy8JCXJldHVybiBnZXRFZGl0VGV4dCgpICE9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJQ2VsbEVkaXRvclZhbGlkYXRvciBnZXRFZGl0VGV4dFZhbGlkYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBJQ2VsbEVkaXRvclZhbGlkYXRvcigpIHsKLQotCQkJcHVibGljIFN0cmluZyBpc1ZhbGlkKGZpbmFsIE9iamVjdCB2YWx1ZSkgewotCQkJCWlmICh2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykgewotCQkJCQlmaW5hbCBFT2JqZWN0IGVsZW1lbnQgPSBnZXRQYXJzZXJFbGVtZW50KCk7Ci0JCQkJCWZpbmFsIElQYXJzZXIgcGFyc2VyID0gZ2V0UGFyc2VyKCk7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlJUGFyc2VyRWRpdFN0YXR1cyB2YWxpZCA9IChJUGFyc2VyRWRpdFN0YXR1cykgZ2V0RWRpdGluZ0RvbWFpbigpCi0JCQkJCQkJCS5ydW5FeGNsdXNpdmUobmV3IFJ1bm5hYmxlV2l0aFJlc3VsdC5JbXBsKCkgewotCi0JCQkJCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJCQkJc2V0UmVzdWx0KHBhcnNlci5pc1ZhbGlkRWRpdFN0cmluZygKLQkJCQkJCQkJCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihlbGVtZW50KSwKLQkJCQkJCQkJCQkJCShTdHJpbmcpIHZhbHVlKSk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0pOwotCQkJCQkJcmV0dXJuIHZhbGlkLmdldENvZGUoKSA9PSBQYXJzZXJFZGl0U3RhdHVzLkVESVRBQkxFID8gbnVsbAotCQkJCQkJCQk6IHZhbGlkLmdldE1lc3NhZ2UoKTsKLQkJCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gaWUpIHsKLQkJCQkJCWllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJLy8gc2hvdWxkbid0IGdldCBoZXJlCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJQ29udGVudEFzc2lzdFByb2Nlc3NvciBnZXRDb21wbGV0aW9uUHJvY2Vzc29yKCkgewotCQlpZiAoZ2V0UGFyc2VyKCkgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIGdldFBhcnNlcigpLmdldENvbXBsZXRpb25Qcm9jZXNzb3IoCi0JCQkJbmV3IEVPYmplY3RBZGFwdGVyKGdldFBhcnNlckVsZW1lbnQoKSkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUGFyc2VyT3B0aW9ucyBnZXRQYXJzZXJPcHRpb25zKCkgewotCQlyZXR1cm4gUGFyc2VyT3B0aW9ucy5OT05FOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSVBhcnNlciBnZXRQYXJzZXIoKSB7Ci0JCWlmIChwYXJzZXIgPT0gbnVsbCkgewotCQkJU3RyaW5nIHBhcnNlckhpbnQgPSAoKFZpZXcpIGdldE1vZGVsKCkpLmdldFR5cGUoKTsKLQkJCVBhcnNlckhpbnRBZGFwdGVyIGhpbnRBZGFwdGVyID0gbmV3IFBhcnNlckhpbnRBZGFwdGVyKAotCQkJCQlnZXRQYXJzZXJFbGVtZW50KCksIHBhcnNlckhpbnQpIHsKLQotCQkJCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihDbGFzcyBhZGFwdGVyKSB7Ci0JCQkJCWlmIChJRWxlbWVudFR5cGUuY2xhc3MuZXF1YWxzKGFkYXB0ZXIpKSB7Ci0JCQkJCQlyZXR1cm4gRGlhZ3JhbUVsZW1lbnRUeXBlcy5Sb2xlTm9kZV8yMDAxOwotCQkJCQl9Ci0JCQkJCXJldHVybiBzdXBlci5nZXRBZGFwdGVyKGFkYXB0ZXIpOwotCQkJCX0KLQkJCX07Ci0JCQlwYXJzZXIgPSBQYXJzZXJTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0UGFyc2VyKGhpbnRBZGFwdGVyKTsKLQkJfQotCQlyZXR1cm4gcGFyc2VyOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRGlyZWN0RWRpdE1hbmFnZXIgZ2V0TWFuYWdlcigpIHsKLQkJaWYgKG1hbmFnZXIgPT0gbnVsbCkgewotCQkJc2V0TWFuYWdlcihuZXcgVGV4dERpcmVjdEVkaXRNYW5hZ2VyKHRoaXMsIFRleHREaXJlY3RFZGl0TWFuYWdlcgotCQkJCQkuZ2V0VGV4dENlbGxFZGl0b3JDbGFzcyh0aGlzKSwgRGlhZ3JhbUVkaXRQYXJ0RmFjdG9yeQotCQkJCQkuZ2V0VGV4dENlbGxFZGl0b3JMb2NhdG9yKHRoaXMpKSk7Ci0JCX0KLQkJcmV0dXJuIG1hbmFnZXI7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldE1hbmFnZXIoRGlyZWN0RWRpdE1hbmFnZXIgbWFuYWdlcikgewotCQl0aGlzLm1hbmFnZXIgPSBtYW5hZ2VyOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdCgpIHsKLQkJZ2V0TWFuYWdlcigpLnNob3coKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURpcmVjdEVkaXQoUG9pbnQgZXZlbnRMb2NhdGlvbikgewotCQlpZiAoZ2V0TWFuYWdlcigpLmdldENsYXNzKCkgPT0gVGV4dERpcmVjdEVkaXRNYW5hZ2VyLmNsYXNzKSB7Ci0JCQkoKFRleHREaXJlY3RFZGl0TWFuYWdlcikgZ2V0TWFuYWdlcigpKS5zaG93KGV2ZW50TG9jYXRpb24KLQkJCQkJLmdldFNXVFBvaW50KCkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdChjaGFyIGluaXRpYWxDaGFyYWN0ZXIpIHsKLQkJaWYgKGdldE1hbmFnZXIoKSBpbnN0YW5jZW9mIFRleHREaXJlY3RFZGl0TWFuYWdlcikgewotCQkJKChUZXh0RGlyZWN0RWRpdE1hbmFnZXIpIGdldE1hbmFnZXIoKSkuc2hvdyhpbml0aWFsQ2hhcmFjdGVyKTsKLQkJfSBlbHNlIHsKLQkJCXBlcmZvcm1EaXJlY3RFZGl0KCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURpcmVjdEVkaXRSZXF1ZXN0KFJlcXVlc3QgcmVxdWVzdCkgewotCQlmaW5hbCBSZXF1ZXN0IHRoZVJlcXVlc3QgPSByZXF1ZXN0OwotCQl0cnkgewotCQkJZ2V0RWRpdGluZ0RvbWFpbigpLnJ1bkV4Y2x1c2l2ZShuZXcgUnVubmFibGUoKSB7Ci0KLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCWlmIChpc0FjdGl2ZSgpICYmIGlzRWRpdGFibGUoKSkgewotCQkJCQkJaWYgKHRoZVJlcXVlc3QKLQkJCQkJCQkJLmdldEV4dGVuZGVkRGF0YSgpCi0JCQkJCQkJCS5nZXQoCi0JCQkJCQkJCQkJUmVxdWVzdENvbnN0YW50cy5SRVFfRElSRUNURURJVF9FWFRFTkRFRERBVEFfSU5JVElBTF9DSEFSKSBpbnN0YW5jZW9mIENoYXJhY3RlcikgewotCQkJCQkJCUNoYXJhY3RlciBpbml0aWFsQ2hhciA9IChDaGFyYWN0ZXIpIHRoZVJlcXVlc3QKLQkJCQkJCQkJCS5nZXRFeHRlbmRlZERhdGEoKQotCQkJCQkJCQkJLmdldCgKLQkJCQkJCQkJCQkJUmVxdWVzdENvbnN0YW50cy5SRVFfRElSRUNURURJVF9FWFRFTkRFRERBVEFfSU5JVElBTF9DSEFSKTsKLQkJCQkJCQlwZXJmb3JtRGlyZWN0RWRpdChpbml0aWFsQ2hhci5jaGFyVmFsdWUoKSk7Ci0JCQkJCQl9IGVsc2UgaWYgKCh0aGVSZXF1ZXN0IGluc3RhbmNlb2YgRGlyZWN0RWRpdFJlcXVlc3QpCi0JCQkJCQkJCSYmIChnZXRFZGl0VGV4dCgpLmVxdWFscyhnZXRMYWJlbFRleHQoKSkpKSB7Ci0JCQkJCQkJRGlyZWN0RWRpdFJlcXVlc3QgZWRpdFJlcXVlc3QgPSAoRGlyZWN0RWRpdFJlcXVlc3QpIHRoZVJlcXVlc3Q7Ci0JCQkJCQkJcGVyZm9ybURpcmVjdEVkaXQoZWRpdFJlcXVlc3QuZ2V0TG9jYXRpb24oKSk7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCXBlcmZvcm1EaXJlY3RFZGl0KCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9KTsKLQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoVmlzdWFscygpIHsKLQkJc3VwZXIucmVmcmVzaFZpc3VhbHMoKTsKLQkJcmVmcmVzaExhYmVsKCk7Ci0JCXJlZnJlc2hGb250KCk7Ci0JCXJlZnJlc2hGb250Q29sb3IoKTsKLQkJcmVmcmVzaFVuZGVybGluZSgpOwotCQlyZWZyZXNoU3RyaWtlVGhyb3VnaCgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoTGFiZWwoKSB7Ci0JCXNldExhYmVsVGV4dEhlbHBlcihnZXRGaWd1cmUoKSwgZ2V0TGFiZWxUZXh0KCkpOwotCQlzZXRMYWJlbEljb25IZWxwZXIoZ2V0RmlndXJlKCksIGdldExhYmVsSWNvbigpKTsKLQkJT2JqZWN0IHBkRWRpdFBvbGljeSA9IGdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSk7Ci0JCWlmIChwZEVkaXRQb2xpY3kgaW5zdGFuY2VvZiBEaWFncmFtVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHsKLQkJCSgoRGlhZ3JhbVRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSBwZEVkaXRQb2xpY3kpLnJlZnJlc2hGZWVkYmFjaygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hVbmRlcmxpbmUoKSB7Ci0JCUZvbnRTdHlsZSBzdHlsZSA9IChGb250U3R5bGUpIGdldEZvbnRTdHlsZU93bmVyVmlldygpLmdldFN0eWxlKAotCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlKCkpOwotCQlpZiAoc3R5bGUgIT0gbnVsbCAmJiBnZXRGaWd1cmUoKSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJKChXcmFwTGFiZWwpIGdldEZpZ3VyZSgpKS5zZXRUZXh0VW5kZXJsaW5lKHN0eWxlLmlzVW5kZXJsaW5lKCkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hTdHJpa2VUaHJvdWdoKCkgewotCQlGb250U3R5bGUgc3R5bGUgPSAoRm9udFN0eWxlKSBnZXRGb250U3R5bGVPd25lclZpZXcoKS5nZXRTdHlsZSgKLQkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZSgpKTsKLQkJaWYgKHN0eWxlICE9IG51bGwgJiYgZ2V0RmlndXJlKCkgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCSgoV3JhcExhYmVsKSBnZXRGaWd1cmUoKSkuc2V0VGV4dFN0cmlrZVRocm91Z2goc3R5bGUKLQkJCQkJLmlzU3RyaWtlVGhyb3VnaCgpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoRm9udCgpIHsKLQkJRm9udFN0eWxlIHN0eWxlID0gKEZvbnRTdHlsZSkgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkuZ2V0U3R5bGUoCi0JCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGUoKSk7Ci0JCVN0cmluZyBmb250TmFtZSA9IERpYWdyYW1Db25zdGFudHMuZ2V0Rm9udE5hbWUoKTsKLQkJaWYgKHN0eWxlICE9IG51bGwpIHsKLQkJCUZvbnREYXRhIGZvbnREYXRhID0gbmV3IEZvbnREYXRhKGZvbnROYW1lLCBzdHlsZQotCQkJCQkuZ2V0Rm9udEhlaWdodCgpLCAoc3R5bGUuaXNCb2xkKCkgPyBTV1QuQk9MRCA6IFNXVC5OT1JNQUwpCi0JCQkJCXwgKHN0eWxlLmlzSXRhbGljKCkgPyBTV1QuSVRBTElDIDogU1dULk5PUk1BTCkpOwotCQkJc2V0Rm9udChmb250RGF0YSk7Ci0JCX0KLQkJZWxzZQotCQkJc2V0Rm9udChEaWFncmFtQ29uc3RhbnRzLmdldERlZmF1bHRGb250RGF0YSgpKTsKLQotCX0KLQotCS8qKgotCSAqIEBtb2RpZmllZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldEZvbnRDb2xvcihDb2xvciBjb2xvcikgewotCQlDb2xvciBjID0gRGlhZ3JhbUNvcmVVdGlsLmdldEZvbnRDb2xvcih0aGlzKTsKLQkJaWYgKGMgIT0gbnVsbCkgewotCQkJY29sb3IgPSBjOwotCQl9Ci0JCWdldEZpZ3VyZSgpLnNldEZvcmVncm91bmRDb2xvcihjb2xvcik7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFNlbWFudGljTGlzdGVuZXJzKCkgewotCQlpZiAoZ2V0UGFyc2VyKCkgaW5zdGFuY2VvZiBJU2VtYW50aWNQYXJzZXIpIHsKLQkJCUVPYmplY3QgZWxlbWVudCA9IHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKTsKLQkJCXBhcnNlckVsZW1lbnRzID0gKChJU2VtYW50aWNQYXJzZXIpIGdldFBhcnNlcigpKQotCQkJCQkuZ2V0U2VtYW50aWNFbGVtZW50c0JlaW5nUGFyc2VkKGVsZW1lbnQpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJzZXJFbGVtZW50cy5zaXplKCk7IGkrKykgewotCQkJCWFkZExpc3RlbmVyRmlsdGVyKAotCQkJCQkJIlNlbWFudGljTW9kZWwiICsgaSwgdGhpcywgKEVPYmplY3QpIHBhcnNlckVsZW1lbnRzLmdldChpKSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXN1cGVyLmFkZFNlbWFudGljTGlzdGVuZXJzKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlU2VtYW50aWNMaXN0ZW5lcnMoKSB7Ci0JCWlmIChwYXJzZXJFbGVtZW50cyAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcnNlckVsZW1lbnRzLnNpemUoKTsgaSsrKSB7Ci0JCQkJcmVtb3ZlTGlzdGVuZXJGaWx0ZXIoIlNlbWFudGljTW9kZWwiICsgaSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXN1cGVyLnJlbW92ZVNlbWFudGljTGlzdGVuZXJzKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEFjY2Vzc2libGVFZGl0UGFydCBnZXRBY2Nlc3NpYmxlRWRpdFBhcnQoKSB7Ci0JCWlmIChhY2Nlc3NpYmxlRVAgPT0gbnVsbCkgewotCQkJYWNjZXNzaWJsZUVQID0gbmV3IEFjY2Vzc2libGVHcmFwaGljYWxFZGl0UGFydCgpIHsKLQotCQkJCXB1YmxpYyB2b2lkIGdldE5hbWUoQWNjZXNzaWJsZUV2ZW50IGUpIHsKLQkJCQkJZS5yZXN1bHQgPSBnZXRMYWJlbFRleHRIZWxwZXIoZ2V0RmlndXJlKCkpOwotCQkJCX0KLQkJCX07Ci0JCX0KLQkJcmV0dXJuIGFjY2Vzc2libGVFUDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBWaWV3IGdldEZvbnRTdHlsZU93bmVyVmlldygpIHsKLQkJcmV0dXJuIChWaWV3KSBnZXRNb2RlbCgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGROb3RhdGlvbmFsTGlzdGVuZXJzKCkgewotCQlzdXBlci5hZGROb3RhdGlvbmFsTGlzdGVuZXJzKCk7Ci0JCWFkZExpc3RlbmVyRmlsdGVyKCJQcmltYXJ5VmlldyIsIHRoaXMsIGdldFByaW1hcnlWaWV3KCkpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbW92ZU5vdGF0aW9uYWxMaXN0ZW5lcnMoKSB7Ci0JCXN1cGVyLnJlbW92ZU5vdGF0aW9uYWxMaXN0ZW5lcnMoKTsKLQkJcmVtb3ZlTGlzdGVuZXJGaWx0ZXIoIlByaW1hcnlWaWV3Iik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlTm90aWZpY2F0aW9uRXZlbnQoTm90aWZpY2F0aW9uIGV2ZW50KSB7Ci0JCU9iamVjdCBmZWF0dXJlID0gZXZlbnQuZ2V0RmVhdHVyZSgpOwotCQlpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfRm9udENvbG9yKCkuZXF1YWxzKGZlYXR1cmUpKSB7Ci0JCQlJbnRlZ2VyIGMgPSAoSW50ZWdlcikgZXZlbnQuZ2V0TmV3VmFsdWUoKTsKLQkJCXNldEZvbnRDb2xvcihEaWFncmFtQ29sb3JSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldENvbG9yKGMpKTsKLQkJfSBlbHNlIGlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9VbmRlcmxpbmUoKS5lcXVhbHMoCi0JCQkJZmVhdHVyZSkpIHsKLQkJCXJlZnJlc2hVbmRlcmxpbmUoKTsKLQkJfSBlbHNlIGlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9TdHJpa2VUaHJvdWdoKCkKLQkJCQkuZXF1YWxzKGZlYXR1cmUpKSB7Ci0JCQlyZWZyZXNoU3RyaWtlVGhyb3VnaCgpOwotCQl9IGVsc2UgaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0ZvbnRIZWlnaHQoKS5lcXVhbHMoCi0JCQkJZmVhdHVyZSkKLQkJCQl8fCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Gb250TmFtZSgpLmVxdWFscygKLQkJCQkJCWZlYXR1cmUpCi0JCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfQm9sZCgpCi0JCQkJCQkuZXF1YWxzKGZlYXR1cmUpCi0JCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfSXRhbGljKCkuZXF1YWxzKAotCQkJCQkJZmVhdHVyZSkpIHsKLQkJCXJlZnJlc2hGb250KCk7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoZ2V0UGFyc2VyKCkgIT0gbnVsbAotCQkJCQkmJiBnZXRQYXJzZXIoKS5pc0FmZmVjdGluZ0V2ZW50KGV2ZW50LAotCQkJCQkJCWdldFBhcnNlck9wdGlvbnMoKS5pbnRWYWx1ZSgpKSkgewotCQkJCXJlZnJlc2hMYWJlbCgpOwotCQkJfQotCQkJaWYgKGdldFBhcnNlcigpIGluc3RhbmNlb2YgSVNlbWFudGljUGFyc2VyKSB7Ci0JCQkJSVNlbWFudGljUGFyc2VyIG1vZGVsUGFyc2VyID0gKElTZW1hbnRpY1BhcnNlcikgZ2V0UGFyc2VyKCk7Ci0JCQkJaWYgKG1vZGVsUGFyc2VyLmFyZVNlbWFudGljRWxlbWVudHNBZmZlY3RlZChudWxsLCBldmVudCkpIHsKLQkJCQkJcmVtb3ZlU2VtYW50aWNMaXN0ZW5lcnMoKTsKLQkJCQkJaWYgKHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKSAhPSBudWxsKSB7Ci0JCQkJCQlhZGRTZW1hbnRpY0xpc3RlbmVycygpOwotCQkJCQl9Ci0JCQkJCXJlZnJlc2hMYWJlbCgpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlzdXBlci5oYW5kbGVOb3RpZmljYXRpb25FdmVudChldmVudCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZUZpZ3VyZSgpIHsKLQkJLy8gUGFyZW50IHNob3VsZCBhc3NpZ24gb25lIHVzaW5nIHNldExhYmVsKCkgbWV0aG9kCi0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvcGFydHMvUm9sZVRhc2tDb21wb3NpdGVFZGl0UGFydC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9wYXJ0cy9Sb2xlVGFza0NvbXBvc2l0ZUVkaXRQYXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkZDI4YjMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9wYXJ0cy9Sb2xlVGFza0NvbXBvc2l0ZUVkaXRQYXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMjUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucGFydHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTWFyZ2luQm9yZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlN0YWNrTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Ub29sYmFyTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wb2xpY2llcy5EaWFncmFtVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucG9saWNpZXMuUm9sZVRhc2tDb21wb3NpdGVDYW5vbmljYWxFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBvbGljaWVzLlJvbGVUYXNrQ29tcG9zaXRlR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucG9saWNpZXMuUm9sZVRhc2tDb21wb3NpdGVJdGVtU2VtYW50aWNFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuZmlndXJlcy5SYWlzZWRNYXJnaW5Cb3JkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuVGFza05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5HcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLkxheW91dEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5hY3Rpb25zLkFjdGlvbklkczsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JVGV4dEF3YXJlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuU2hhcGVOb2RlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuQ29uc3RyYWluZWRUb29sYmFyTGF5b3V0RWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5DcmVhdGlvbkVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuRHJhZ0Ryb3BFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkVkaXRQb2xpY3lSb2xlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlcXVlc3RzLkFycmFuZ2VSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVxdWVzdHMuUmVxdWVzdENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5Db25zdHJhaW5lZFRvb2xiYXJMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZ2VmLnVpLmZpZ3VyZXMuRGVmYXVsdFNpemVOb2RlRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmdlZi51aS5maWd1cmVzLk5vZGVGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTG9jYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBSb2xlVGFza0NvbXBvc2l0ZUVkaXRQYXJ0IGV4dGVuZHMgU2hhcGVOb2RlRWRpdFBhcnQgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZJU1VBTF9JRCA9IDEwMDE7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgY29udGVudFBhbmU7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgcHJpbWFyeVNoYXBlOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSb2xlVGFza0NvbXBvc2l0ZUVkaXRQYXJ0KFZpZXcgdmlldykgewotCQlzdXBlcih2aWV3KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpIHsKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLkNSRUFUSU9OX1JPTEUsCi0JCQkJbmV3IENyZWF0aW9uRWRpdFBvbGljeSgpKTsKLQotCQlzdXBlci5jcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5TRU1BTlRJQ19ST0xFLAotCQkJCW5ldyBSb2xlVGFza0NvbXBvc2l0ZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3koKSk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5EUkFHX0RST1BfUk9MRSwKLQkJCQluZXcgRHJhZ0Ryb3BFZGl0UG9saWN5KCkpOwotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuQ0FOT05JQ0FMX1JPTEUsCi0JCQkJbmV3IFJvbGVUYXNrQ29tcG9zaXRlQ2Fub25pY2FsRWRpdFBvbGljeSgpKTsKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5MQVlPVVRfUk9MRSwgY3JlYXRlTGF5b3V0RWRpdFBvbGljeSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIExheW91dEVkaXRQb2xpY3kgY3JlYXRlTGF5b3V0RWRpdFBvbGljeSgpIHsKLQotCQlDb25zdHJhaW5lZFRvb2xiYXJMYXlvdXRFZGl0UG9saWN5IGxlcCA9IG5ldyBDb25zdHJhaW5lZFRvb2xiYXJMYXlvdXRFZGl0UG9saWN5KCkgewotCi0JCQlwcm90ZWN0ZWQgRWRpdFBvbGljeSBjcmVhdGVDaGlsZEVkaXRQb2xpY3koRWRpdFBhcnQgY2hpbGQpIHsKLQkJCQlpZiAoY2hpbGQuZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFKSA9PSBudWxsKSB7Ci0JCQkJCWlmIChjaGlsZCBpbnN0YW5jZW9mIElUZXh0QXdhcmVFZGl0UGFydCkgewotCQkJCQkJcmV0dXJuIG5ldyBEaWFncmFtVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3koKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlyZXR1cm4gc3VwZXIuY3JlYXRlQ2hpbGRFZGl0UG9saWN5KGNoaWxkKTsKLQkJCX0KLQkJfTsKLQkJcmV0dXJuIGxlcDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlTm9kZVNoYXBlKCkgewotCQlSb2xlVGFza0NvbXBvc2l0ZUZpZ3VyZSBmaWd1cmUgPSBuZXcgUm9sZVRhc2tDb21wb3NpdGVGaWd1cmUoKTsKLQkJcmV0dXJuIHByaW1hcnlTaGFwZSA9IGZpZ3VyZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJvbGVUYXNrQ29tcG9zaXRlRmlndXJlIGdldFByaW1hcnlTaGFwZSgpIHsKLQkJcmV0dXJuIChSb2xlVGFza0NvbXBvc2l0ZUZpZ3VyZSkgcHJpbWFyeVNoYXBlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTm9kZUZpZ3VyZSBjcmVhdGVOb2RlUGxhdGUoKSB7Ci0JCURlZmF1bHRTaXplTm9kZUZpZ3VyZSByZXN1bHQgPSBuZXcgRGVmYXVsdFNpemVOb2RlRmlndXJlKGdldE1hcE1vZGUoKQotCQkJCS5EUHRvTFAoNDApLCBnZXRNYXBNb2RlKCkuRFB0b0xQKDQwKSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBmaWd1cmUgZm9yIHRoaXMgZWRpdCBwYXJ0LgotCSAqIAotCSAqIEJvZHkgb2YgdGhpcyBtZXRob2QgZG9lcyBub3QgZGVwZW5kIG9uIHNldHRpbmdzIGluIGdlbmVyYXRpb24gbW9kZWwKLQkgKiBzbyB5b3UgbWF5IHNhZmVseSByZW1vdmUgPGk+Z2VuZXJhdGVkPC9pPiB0YWcgYW5kIG1vZGlmeSBpdC4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE5vZGVGaWd1cmUgY3JlYXRlTm9kZUZpZ3VyZSgpIHsKLQkJTm9kZUZpZ3VyZSBmaWd1cmUgPSBjcmVhdGVOb2RlUGxhdGUoKTsKLQkJZmlndXJlLnNldExheW91dE1hbmFnZXIobmV3IFN0YWNrTGF5b3V0KCkpOwotCQlJRmlndXJlIHNoYXBlID0gY3JlYXRlTm9kZVNoYXBlKCk7Ci0JCWZpZ3VyZS5hZGQoc2hhcGUpOwotCQljb250ZW50UGFuZSA9IHNldHVwQ29udGVudFBhbmUoc2hhcGUpOwotCQlyZXR1cm4gZmlndXJlOwotCX0KLQotCS8qKgotCSAqIERlZmF1bHQgaW1wbGVtZW50YXRpb24gdHJlYXRzIHBhc3NlZCBmaWd1cmUgYXMgY29udGVudCBwYW5lLgotCSAqIFJlc3BlY3RzIGxheW91dCBvbmUgbWF5IGhhdmUgc2V0IGZvciBnZW5lcmF0ZWQgZmlndXJlLgotCSAqIEBwYXJhbSBub2RlU2hhcGUgaW5zdGFuY2Ugb2YgZ2VuZXJhdGVkIGZpZ3VyZSBjbGFzcwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBzZXR1cENvbnRlbnRQYW5lKElGaWd1cmUgbm9kZVNoYXBlKSB7Ci0JCWlmIChub2RlU2hhcGUuZ2V0TGF5b3V0TWFuYWdlcigpID09IG51bGwpIHsKLQkJCUNvbnN0cmFpbmVkVG9vbGJhckxheW91dCBsYXlvdXQgPSBuZXcgQ29uc3RyYWluZWRUb29sYmFyTGF5b3V0KCk7Ci0JCQlsYXlvdXQuc2V0U3BhY2luZyhnZXRNYXBNb2RlKCkuRFB0b0xQKDUpKTsKLQkJCW5vZGVTaGFwZS5zZXRMYXlvdXRNYW5hZ2VyKGxheW91dCk7Ci0JCX0KLQkJcmV0dXJuIG5vZGVTaGFwZTsgLy8gdXNlIG5vZGVTaGFwZSBpdHNlbGYgYXMgY29udGVudFBhbmUKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElGaWd1cmUgZ2V0Q29udGVudFBhbmUoKSB7Ci0JCWlmIChjb250ZW50UGFuZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gY29udGVudFBhbmU7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldENvbnRlbnRQYW5lKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBjbGFzcyBSb2xlVGFza0NvbXBvc2l0ZUZpZ3VyZSBleHRlbmRzIFJlY3RhbmdsZUZpZ3VyZSB7Ci0KLQkJLyoqCi0JCSAqIEBAbW9kaWZpZWQKLQkJICovCi0JCXB1YmxpYyBSb2xlVGFza0NvbXBvc2l0ZUZpZ3VyZSgpIHsKLQotCQkJb3JnLmVjbGlwc2UuZHJhdzJkLlRvb2xiYXJMYXlvdXQgbXlHZW5MYXlvdXRNYW5hZ2VyID0gbmV3IG9yZy5lY2xpcHNlLmRyYXcyZC5Ub29sYmFyTGF5b3V0KCk7Ci0JCQlteUdlbkxheW91dE1hbmFnZXIuc2V0U3RyZXRjaE1pbm9yQXhpcyhmYWxzZSk7Ci0JCQlteUdlbkxheW91dE1hbmFnZXIKLQkJCQkJLnNldE1pbm9yQWxpZ25tZW50KG9yZy5lY2xpcHNlLmRyYXcyZC5Ub29sYmFyTGF5b3V0LkFMSUdOX0NFTlRFUik7Ci0JCQlteUdlbkxheW91dE1hbmFnZXIuc2V0U3BhY2luZygyMCk7Ci0JCQlteUdlbkxheW91dE1hbmFnZXIuc2V0VmVydGljYWwoZmFsc2UpOwotCi0JCQl0aGlzLnNldExheW91dE1hbmFnZXIobXlHZW5MYXlvdXRNYW5hZ2VyKTsKLQotCQkJdGhpcy5zZXRCYWNrZ3JvdW5kQ29sb3IoUk9MRVRBU0tDT01QT1NJVEVGSUdVUkVfQkFDSwotCi0JCQkpOwotCQkJLy8JCQl0aGlzLnNldEJvcmRlcihuZXcgb3JnLmVjbGlwc2UuZHJhdzJkLk1hcmdpbkJvcmRlcihnZXRNYXBNb2RlKCkKLQkJCS8vCQkJCQkuRFB0b0xQKDApLCBnZXRNYXBNb2RlKCkuRFB0b0xQKDApLCBnZXRNYXBNb2RlKCkuRFB0b0xQKDApLAotCQkJLy8JCQkJCWdldE1hcE1vZGUoKS5EUHRvTFAoMCkpKTsKLQkJCXRoaXMuc2V0Qm9yZGVyKG5ldyBSYWlzZWRNYXJnaW5Cb3JkZXIoKSk7Ci0JCQljcmVhdGVDb250ZW50cygpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgdm9pZCBjcmVhdGVDb250ZW50cygpIHsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIGJvb2xlYW4gbXlVc2VMb2NhbENvb3JkaW5hdGVzID0gZmFsc2U7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByb3RlY3RlZCBib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMoKSB7Ci0JCQlyZXR1cm4gbXlVc2VMb2NhbENvb3JkaW5hdGVzOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByb3RlY3RlZCB2b2lkIHNldFVzZUxvY2FsQ29vcmRpbmF0ZXMoYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKSB7Ci0JCQlteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSB1c2VMb2NhbENvb3JkaW5hdGVzOwotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDb2xvciBST0xFVEFTS0NPTVBPU0lURUZJR1VSRV9CQUNLID0gbmV3IENvbG9yKG51bGwsCi0JCQkyNTUsIDI1NSwgMTU2KTsKLQotCS8qKgotCSAqIEBtb2RpZmllZAotCSAqLwotCXB1YmxpYyB2b2lkIHVwZGF0ZWJvdW5kcygpIHsKLQkJUmVjdGFuZ2xlIGNvbnN0cmFpbnQgPSBuZXcgUmVjdGFuZ2xlKDAsIDAsIC0xLCAtMSk7Ci0JCU5vZGUgbm9kZSA9IChOb2RlKSB0aGlzLmdldE1vZGVsKCk7Ci0JCUxvY2F0aW9uIGxvY2F0aW9uID0gKExvY2F0aW9uKSBub2RlLmdldExheW91dENvbnN0cmFpbnQoKTsKLQkJaWYgKGxvY2F0aW9uICE9IG51bGwpIHsKLQkJCWNvbnN0cmFpbnQuc2V0TG9jYXRpb24obmV3IFBvaW50KGxvY2F0aW9uLmdldFgoKSwgbG9jYXRpb24uZ2V0WSgpKSk7Ci0JCX0KLQotCQkoKEdyYXBoaWNhbEVkaXRQYXJ0KSBnZXRQYXJlbnQoKSkuc2V0TGF5b3V0Q29uc3RyYWludCh0aGlzLAotCQkJCWdldEZpZ3VyZSgpLCBjb25zdHJhaW50KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVOb3RpZmljYXRpb25FdmVudChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCS8vCQlpZihub3RpZmljYXRpb24uZ2V0RXZlbnRUeXBlKCkgPT0gTm90aWZpY2F0aW9uLlNFVCl7Ci0JCS8vCQkJQXJyYW5nZVJlcXVlc3QgYXJyYW5nZVJlcXVlc3QgPSBuZXcgQXJyYW5nZVJlcXVlc3QoQWN0aW9uSWRzLkFDVElPTl9BUlJBTkdFX0FMTCk7IExpc3QgbCA9IGdldENoaWxkcmVuKCk7Ci0JCS8vCQkJYXJyYW5nZVJlcXVlc3Quc2V0UGFydHNUb0FycmFuZ2UobCk7IAotCQkvLwkJCUNvbW1hbmQgYXJyYW5nZUNtZCA9IGdldENvbW1hbmQoYXJyYW5nZVJlcXVlc3QpOyAKLQkJLy8JCQlhcnJhbmdlQ21kLmV4ZWN1dGUoKTsKLQkJLy8JCQkKLQkJLy8JCQlSZXF1ZXN0IHJlcXVlc3QgPSBuZXcgUmVxdWVzdChSZXF1ZXN0Q29uc3RhbnRzLlJFUV9BVVRPU0laRSk7Ci0JCS8vCQkJQ29tbWFuZCBhdXRvU2l6ZUNtZCA9IGdldENvbW1hbmQocmVxdWVzdCk7Ci0JCS8vCQkJaWYoYXV0b1NpemVDbWQgIT0gbnVsbCl7Ci0JCS8vCQkJCWF1dG9TaXplQ21kLmV4ZWN1dGUoKTsKLQkJLy8JCQl9Ci0JCS8vCQl9Ci0JCXN1cGVyLmhhbmRsZU5vdGlmaWNhdGlvbkV2ZW50KG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIExpc3QgZ2V0TW9kZWxDaGlsZHJlbigpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlMaXN0PFZpZXc+IGxpc3QgPSBzdXBlci5nZXRNb2RlbENoaWxkcmVuKCk7Ci0KLQkJQ29tcGFyYXRvcjxWaWV3PiBjID0gbmV3IENvbXBhcmF0b3I8Vmlldz4oKSB7Ci0JCQlwdWJsaWMgaW50IGNvbXBhcmUoVmlldyBvMSwgVmlldyBvMikgewotCQkJCU9iamVjdCBtb2RlbDEgPSAoKFZpZXcpIG8xKS5nZXRFbGVtZW50KCk7Ci0JCQkJT2JqZWN0IG1vZGVsMiA9ICgoVmlldykgbzIpLmdldEVsZW1lbnQoKTsKLQkJCQlpZiAobW9kZWwxIGluc3RhbmNlb2YgVGFza05vZGUgJiYgbW9kZWwyIGluc3RhbmNlb2YgVGFza05vZGUpIHsKLQkJCQkJaWYgKCgoVGFza05vZGUpIG1vZGVsMSkuZ2V0SW5kZXgoKSA+PSAoKFRhc2tOb2RlKSBtb2RlbDIpCi0JCQkJCQkJLmdldEluZGV4KCkpCi0JCQkJCQlyZXR1cm4gMTsKLQkJCQkJZWxzZQotCQkJCQkJcmV0dXJuIC0xOwotCQkJCX0KLQkJCQlyZXR1cm4gMDsKLQkJCX0KLQkJfTsKLQkJQ29sbGVjdGlvbnMuc29ydChsaXN0LCBjKTsKLQkJcmV0dXJuIGxpc3Q7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGFjdGl2YXRlKCkgewotCQlzdXBlci5hY3RpdmF0ZSgpOwotCQlPYmplY3QgbW9kZWwgPSBnZXRNb2RlbCgpOwotCQlpZiAobW9kZWwgaW5zdGFuY2VvZiBWaWV3KSB7Ci0JCQlFT2JqZWN0IGUgPSAoKFZpZXcpIG1vZGVsKS5nZXRFbGVtZW50KCk7Ci0JCQlpZiAoZSBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGUpIHsKLQkJCQkoKG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGUpIGUpLmFkZENvbnN1bWVyKHRoaXMpOwotCQkJfQotCQl9Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGRlYWN0aXZhdGUoKSB7Ci0JCXN1cGVyLmRlYWN0aXZhdGUoKTsKLQkJT2JqZWN0IG1vZGVsID0gZ2V0TW9kZWwoKTsKLQkJaWYgKG1vZGVsIGluc3RhbmNlb2YgVmlldykgewotCQkJRU9iamVjdCBlID0gKChWaWV3KSBtb2RlbCkuZ2V0RWxlbWVudCgpOwotCQkJaWYgKGUgaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlKSB7Ci0JCQkJKChvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlKSBlKS5yZW1vdmVDb25zdW1lcih0aGlzKTsKLQkJCX0KLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9wYXJ0cy9Sb2xlVGFza0NvbXBvc2l0ZVJvbGVUYXNrQ29tcGFydG1lbnRFZGl0UGFydC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9wYXJ0cy9Sb2xlVGFza0NvbXBvc2l0ZVJvbGVUYXNrQ29tcGFydG1lbnRFZGl0UGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YTBlM2Q3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvcGFydHMvUm9sZVRhc2tDb21wb3NpdGVSb2xlVGFza0NvbXBhcnRtZW50RWRpdFBhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBhcnRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLk1hcmdpbkJvcmRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucG9saWNpZXMuUm9sZVRhc2tDb21wb3NpdGVSb2xlVGFza0NvbXBhcnRtZW50SXRlbVNlbWFudGljRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQucGFydC5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5MaXN0Q29tcGFydG1lbnRFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5FZGl0UG9saWN5Um9sZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5maWd1cmVzLlJlc2l6YWJsZUNvbXBhcnRtZW50RmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUm9sZVRhc2tDb21wb3NpdGVSb2xlVGFza0NvbXBhcnRtZW50RWRpdFBhcnQgZXh0ZW5kcwotCQlMaXN0Q29tcGFydG1lbnRFZGl0UGFydCB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVklTVUFMX0lEID0gNTAwMTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUm9sZVRhc2tDb21wb3NpdGVSb2xlVGFza0NvbXBhcnRtZW50RWRpdFBhcnQoVmlldyB2aWV3KSB7Ci0JCXN1cGVyKHZpZXcpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBoYXNNb2RlbENoaWxkcmVuQ2hhbmdlZChOb3RpZmljYXRpb24gZXZ0KSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENvbXBhcnRtZW50TmFtZSgpIHsKLQkJcmV0dXJuICIiOwkvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHVibGljIElGaWd1cmUgY3JlYXRlRmlndXJlKCkgewotCQlSZXNpemFibGVDb21wYXJ0bWVudEZpZ3VyZSByZXN1bHQgPSAoUmVzaXphYmxlQ29tcGFydG1lbnRGaWd1cmUpIHN1cGVyCi0JCQkJLmNyZWF0ZUZpZ3VyZSgpOwotCi0JCS8vIHJlbW92ZSB0aGUgc3BhY2luZwotCQlyZXN1bHQuZ2V0U2Nyb2xsUGFuZSgpLmdldENvbnRlbnRzKCkuc2V0Qm9yZGVyKAotCQkJCW5ldyBNYXJnaW5Cb3JkZXIoMCwgMCwgMCwgMCkpOwotCi0JCXJlc3VsdC5zZXRUaXRsZVZpc2liaWxpdHkoZmFsc2UpOwotCQlyZXN1bHQuc2V0Qm9yZGVyKG51bGwpOwotCi0JCS8vIGRpc2FibGUgc2Nyb2xscGFuZQotCQlyZXN1bHQuZ2V0U2Nyb2xsUGFuZSgpLnNldEVuYWJsZWQoZmFsc2UpOwotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKSB7Ci0JCXN1cGVyLmNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKTsKLQkJaW5zdGFsbEVkaXRQb2xpY3koCi0JCQkJRWRpdFBvbGljeVJvbGVzLlNFTUFOVElDX1JPTEUsCi0JCQkJbmV3IFJvbGVUYXNrQ29tcG9zaXRlUm9sZVRhc2tDb21wYXJ0bWVudEl0ZW1TZW1hbnRpY0VkaXRQb2xpY3koKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldFJhdGlvKERvdWJsZSByYXRpbykgewotCQkvLyBub3RoaW5nIHRvIGRvIC0tIHBhcmVudCBsYXlvdXQgZG9lcyBub3QgYWNjZXB0IERvdWJsZSBjb25zdHJhaW50cyBhcyByYXRpbwotCQkvLyBzdXBlci5zZXRSYXRpbyhyYXRpbyk7IAotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9wYXJ0cy9UYXNrTm9kZUVkaXRQYXJ0LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L3BhcnRzL1Rhc2tOb2RlRWRpdFBhcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTE1ZmExNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L3BhcnRzL1Rhc2tOb2RlRWRpdFBhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wYXJ0czsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Qb3NpdGlvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5TdGFja0xheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuRGltZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wb2xpY2llcy5UYXNrTm9kZUNhbm9uaWNhbEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucG9saWNpZXMuVGFza05vZGVHcmFwaGljYWxOb2RlRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wb2xpY2llcy5UYXNrTm9kZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLnBhcnQuRGlhZ3JhbVZpc3VhbElEUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLnNlcnZpY2UuRGlhZ3JhbVJlc2V0U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLmZpZ3VyZXMuV2lkZW5lZFdyYXBMYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnV0aWwuRGlhZ3JhbUNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkFjdGl2aXR5RGV0YWlsRGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Nb2RlbFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5HcmFwaGljYWxWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5MYXlvdXRFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuTm9uUmVzaXphYmxlRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuQ3JlYXRlUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMuYWN0aW9uLmdsb2JhbC5HZXRHbG9iYWxBY3Rpb25IYW5kbGVyT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklHcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5Ob3RlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuU2hhcGVOb2RlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuRWRpdFBvbGljeVJvbGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucGFydHMuRGlhZ3JhbUdyYXBoaWNhbFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5Db25zdHJhaW5lZFRvb2xiYXJMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmdlZi51aS5maWd1cmVzLkRlZmF1bHRTaXplTm9kZUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5nZWYudWkuZmlndXJlcy5Ob2RlRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBUYXNrTm9kZUVkaXRQYXJ0IGV4dGVuZHMgU2hhcGVOb2RlRWRpdFBhcnQgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZJU1VBTF9JRCA9IDIwMDI7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgY29udGVudFBhbmU7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgcHJpbWFyeVNoYXBlOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUYXNrTm9kZUVkaXRQYXJ0KFZpZXcgdmlldykgewotCQlzdXBlcih2aWV3KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpIHsKLQotCQlzdXBlci5jcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5TRU1BTlRJQ19ST0xFLAotCQkJCW5ldyBUYXNrTm9kZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3koKSk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuTEFZT1VUX1JPTEUsIGNyZWF0ZUxheW91dEVkaXRQb2xpY3koKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBMYXlvdXRFZGl0UG9saWN5IGNyZWF0ZUxheW91dEVkaXRQb2xpY3koKSB7Ci0JCUxheW91dEVkaXRQb2xpY3kgbGVwID0gbmV3IExheW91dEVkaXRQb2xpY3koKSB7Ci0KLQkJCXByb3RlY3RlZCBFZGl0UG9saWN5IGNyZWF0ZUNoaWxkRWRpdFBvbGljeShFZGl0UGFydCBjaGlsZCkgewotCQkJCUVkaXRQb2xpY3kgcmVzdWx0ID0gY2hpbGQKLQkJCQkJCS5nZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgewotCQkJCQlyZXN1bHQgPSBuZXcgTm9uUmVzaXphYmxlRWRpdFBvbGljeSgpOwotCQkJCX0KLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCi0JCQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRNb3ZlQ2hpbGRyZW5Db21tYW5kKFJlcXVlc3QgcmVxdWVzdCkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCi0JCQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVDb21tYW5kKENyZWF0ZVJlcXVlc3QgcmVxdWVzdCkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9OwotCQlyZXR1cm4gbGVwOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVOb2RlU2hhcGUoKSB7Ci0JCVRhc2tOb2RlRmlndXJlIGZpZ3VyZSA9IG5ldyBUYXNrTm9kZUZpZ3VyZSgpOwotCQlyZXR1cm4gcHJpbWFyeVNoYXBlID0gZmlndXJlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVGFza05vZGVGaWd1cmUgZ2V0UHJpbWFyeVNoYXBlKCkgewotCQlyZXR1cm4gKFRhc2tOb2RlRmlndXJlKSBwcmltYXJ5U2hhcGU7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGFkZEZpeGVkQ2hpbGQoRWRpdFBhcnQgY2hpbGRFZGl0UGFydCkgewotCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIFRhc2tOb2RlTmFtZUVkaXRQYXJ0KSB7Ci0JCQkoKFRhc2tOb2RlTmFtZUVkaXRQYXJ0KSBjaGlsZEVkaXRQYXJ0KS5zZXRMYWJlbChnZXRQcmltYXJ5U2hhcGUoKQotCQkJCQkuZ2V0RmlndXJlVGFza05vZGVOYW1lRmlndXJlKCkpOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiByZW1vdmVGaXhlZENoaWxkKEVkaXRQYXJ0IGNoaWxkRWRpdFBhcnQpIHsKLQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBOb2RlRmlndXJlIGNyZWF0ZU5vZGVQbGF0ZSgpIHsKLQkJRGVmYXVsdFNpemVOb2RlRmlndXJlIHJlc3VsdCA9IG5ldyBEZWZhdWx0U2l6ZU5vZGVGaWd1cmUoZ2V0TWFwTW9kZSgpCi0JCQkJLkRQdG9MUCg0MCksIGdldE1hcE1vZGUoKS5EUHRvTFAoNDApKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGZpZ3VyZSBmb3IgdGhpcyBlZGl0IHBhcnQuCi0JICogCi0JICogQm9keSBvZiB0aGlzIG1ldGhvZCBkb2VzIG5vdCBkZXBlbmQgb24gc2V0dGluZ3MgaW4gZ2VuZXJhdGlvbiBtb2RlbAotCSAqIHNvIHlvdSBtYXkgc2FmZWx5IHJlbW92ZSA8aT5nZW5lcmF0ZWQ8L2k+IHRhZyBhbmQgbW9kaWZ5IGl0LgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTm9kZUZpZ3VyZSBjcmVhdGVOb2RlRmlndXJlKCkgewotCQlOb2RlRmlndXJlIGZpZ3VyZSA9IGNyZWF0ZU5vZGVQbGF0ZSgpOwotCQlmaWd1cmUuc2V0TGF5b3V0TWFuYWdlcihuZXcgU3RhY2tMYXlvdXQoKSk7Ci0JCUlGaWd1cmUgc2hhcGUgPSBjcmVhdGVOb2RlU2hhcGUoKTsKLQkJZmlndXJlLmFkZChzaGFwZSk7Ci0JCWNvbnRlbnRQYW5lID0gc2V0dXBDb250ZW50UGFuZShzaGFwZSk7Ci0JCXJldHVybiBmaWd1cmU7Ci0JfQotCi0JLyoqCi0JICogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiB0cmVhdHMgcGFzc2VkIGZpZ3VyZSBhcyBjb250ZW50IHBhbmUuCi0JICogUmVzcGVjdHMgbGF5b3V0IG9uZSBtYXkgaGF2ZSBzZXQgZm9yIGdlbmVyYXRlZCBmaWd1cmUuCi0JICogQHBhcmFtIG5vZGVTaGFwZSBpbnN0YW5jZSBvZiBnZW5lcmF0ZWQgZmlndXJlIGNsYXNzCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJRmlndXJlIHNldHVwQ29udGVudFBhbmUoSUZpZ3VyZSBub2RlU2hhcGUpIHsKLQkJaWYgKG5vZGVTaGFwZS5nZXRMYXlvdXRNYW5hZ2VyKCkgPT0gbnVsbCkgewotCQkJQ29uc3RyYWluZWRUb29sYmFyTGF5b3V0IGxheW91dCA9IG5ldyBDb25zdHJhaW5lZFRvb2xiYXJMYXlvdXQoKTsKLQkJCWxheW91dC5zZXRTcGFjaW5nKGdldE1hcE1vZGUoKS5EUHRvTFAoNSkpOwotCQkJbm9kZVNoYXBlLnNldExheW91dE1hbmFnZXIobGF5b3V0KTsKLQkJfQotCQlyZXR1cm4gbm9kZVNoYXBlOyAvLyB1c2Ugbm9kZVNoYXBlIGl0c2VsZiBhcyBjb250ZW50UGFuZQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSUZpZ3VyZSBnZXRDb250ZW50UGFuZSgpIHsKLQkJaWYgKGNvbnRlbnRQYW5lICE9IG51bGwpIHsKLQkJCXJldHVybiBjb250ZW50UGFuZTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0Q29udGVudFBhbmUoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVkaXRQYXJ0IGdldFByaW1hcnlDaGlsZEVkaXRQYXJ0KCkgewotCQlyZXR1cm4gZ2V0Q2hpbGRCeVNlbWFudGljSGludChEaWFncmFtVmlzdWFsSURSZWdpc3RyeQotCQkJCS5nZXRUeXBlKFRhc2tOb2RlTmFtZUVkaXRQYXJ0LlZJU1VBTF9JRCkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRDaGlsZFZpc3VhbChFZGl0UGFydCBjaGlsZEVkaXRQYXJ0LCBpbnQgaW5kZXgpIHsKLQkJaWYgKGFkZEZpeGVkQ2hpbGQoY2hpbGRFZGl0UGFydCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5hZGRDaGlsZFZpc3VhbChjaGlsZEVkaXRQYXJ0LCAtMSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbW92ZUNoaWxkVmlzdWFsKEVkaXRQYXJ0IGNoaWxkRWRpdFBhcnQpIHsKLQkJaWYgKHJlbW92ZUZpeGVkQ2hpbGQoY2hpbGRFZGl0UGFydCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5yZW1vdmVDaGlsZFZpc3VhbChjaGlsZEVkaXRQYXJ0KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgZ2V0Q29udGVudFBhbmVGb3IoSUdyYXBoaWNhbEVkaXRQYXJ0IGVkaXRQYXJ0KSB7Ci0KLQkJcmV0dXJuIHN1cGVyLmdldENvbnRlbnRQYW5lRm9yKGVkaXRQYXJ0KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGNsYXNzIFRhc2tOb2RlRmlndXJlIGV4dGVuZHMgUmVjdGFuZ2xlRmlndXJlIHsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIFRhc2tOb2RlRmlndXJlKCkgewotCi0JCQl0aGlzLnNldE91dGxpbmUoZmFsc2UpOwotCQkJdGhpcy5zZXRMaW5lV2lkdGgoMCk7Ci0JCQl0aGlzLnNldEJhY2tncm91bmRDb2xvcihUQVNLTk9ERUZJR1VSRV9CQUNLCi0KLQkJCSk7Ci0JCQljcmVhdGVDb250ZW50cygpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBtb2RpZmllZAotCQkgKi8KLQkJcHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbnRlbnRzKCkgewotCQkJb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIGZpZ18wID0gbmV3IFdpZGVuZWRXcmFwTGFiZWwoKTsKLQkJCWZpZ18wLnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0JCQlmaWdfMC5zZXRGb250KFRBU0tOT0RFTkFNRUZJR1VSRV9GT05UKTsKLQkJCURpYWdyYW1Db3JlVXRpbC5zZXRMYWJlbFByb3BlcnRpZXMoZmlnXzApOyAvLyBtb2RpZmllZAotCQkJc2V0RmlndXJlVGFza05vZGVOYW1lRmlndXJlKGZpZ18wKTsKLQkJCWZpZ18wLnNldFRleHRXcmFwQWxpZ25tZW50KFBvc2l0aW9uQ29uc3RhbnRzLkxFRlQpOwotCQkJZmlnXzAuc2V0VGV4dFdyYXBXaWR0aCgxMDApOwotCi0JCQlPYmplY3QgbGF5RGF0YTAgPSBudWxsOwotCi0JCQl0aGlzLmFkZChmaWdfMCwgbGF5RGF0YTApOwotCQl9Ci0JCQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSBXcmFwTGFiZWwgZlRhc2tOb2RlTmFtZUZpZ3VyZTsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIFdyYXBMYWJlbCBnZXRGaWd1cmVUYXNrTm9kZU5hbWVGaWd1cmUoKSB7Ci0JCQlyZXR1cm4gZlRhc2tOb2RlTmFtZUZpZ3VyZTsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIHZvaWQgc2V0RmlndXJlVGFza05vZGVOYW1lRmlndXJlKFdyYXBMYWJlbCBmaWcpIHsKLQkJCWZUYXNrTm9kZU5hbWVGaWd1cmUgPSBmaWc7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSBib29sZWFuIG15VXNlTG9jYWxDb29yZGluYXRlcyA9IGZhbHNlOwotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcm90ZWN0ZWQgYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKCkgewotCQkJcmV0dXJuIG15VXNlTG9jYWxDb29yZGluYXRlczsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcm90ZWN0ZWQgdm9pZCBzZXRVc2VMb2NhbENvb3JkaW5hdGVzKGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcykgewotCQkJbXlVc2VMb2NhbENvb3JkaW5hdGVzID0gdXNlTG9jYWxDb29yZGluYXRlczsKLQkJfQotCi0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgRm9udCBUQVNLTk9ERU5BTUVGSUdVUkVfRk9OVCA9IG5ldyBGb250KERpc3BsYXkKLQkJCS5nZXRDdXJyZW50KCksICJBcmlhbCIsIDgsIFNXVC5OT1JNQUwpOwkvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDb2xvciBUQVNLTk9ERUZJR1VSRV9CQUNLID0gbmV3IENvbG9yKG51bGwsIDI1NSwgMjU1LAotCQkJMTU2KTsKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGhhbmRsZU5vdGlmaWNhdGlvbkV2ZW50KE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJT2JqZWN0IGZlYXR1cmUgPSBub3RpZmljYXRpb24uZ2V0RmVhdHVyZSgpOwotCQlpZihNb2RlbFBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tOb2RlX0luZGV4KCkuZXF1YWxzKGZlYXR1cmUpKXsKLQkJCUVkaXRQYXJ0IHBhcmVudCA9IHRoaXMuZ2V0UGFyZW50KCk7Ci0JCQlpZihwYXJlbnQgaW5zdGFuY2VvZiBSb2xlVGFza0NvbXBvc2l0ZUVkaXRQYXJ0ICl7Ci0JCQkJKChSb2xlVGFza0NvbXBvc2l0ZUVkaXRQYXJ0KXBhcmVudCkucmVmcmVzaCgpOwotCQkJCQotCQkJfQotCQl9Ci0JCXN1cGVyLmhhbmRsZU5vdGlmaWNhdGlvbkV2ZW50KG5vdGlmaWNhdGlvbik7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBmaXJlUmVzZXRMYXlvdXQoUm9sZVRhc2tDb21wb3NpdGVFZGl0UGFydCBwYXJlbnQpewotCQlHcmFwaGljYWxWaWV3ZXIgdmlld2VyID0gKEdyYXBoaWNhbFZpZXdlcikoKFJvbGVUYXNrQ29tcG9zaXRlRWRpdFBhcnQpcGFyZW50KS5nZXRWaWV3ZXIoKTsKLQkJQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdFBhcnQgZGVwID0gKEFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRQYXJ0KXZpZXdlci5nZXRDb250ZW50cygpOwotCQlMaXN0PEVkaXRQYXJ0PiBsb2NhbCA9IG5ldyBBcnJheUxpc3Q8RWRpdFBhcnQ+KCk7Ci0JCWlmKGRlcC5nZXRDaGlsZHJlbigpICE9IG51bGwgJiYgIWRlcC5nZXRDaGlsZHJlbigpLmlzRW1wdHkoKSl7Ci0JCQlmb3IoSXRlcmF0b3IgaXRlcmF0b3IgPSBkZXAuZ2V0Q2hpbGRyZW4oKS5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KXsKLQkJCQlPYmplY3QgbmV4dCA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCQlpZighKG5leHQgaW5zdGFuY2VvZiBOb3RlRWRpdFBhcnQpKXsKLQkJCQkJbG9jYWwuYWRkKChFZGl0UGFydCluZXh0KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZGVwLmdldFJlY2VudGx5QWRkZWRQYXJ0cygpLmFkZEFsbChsb2NhbCk7Ci0vLwkJRGlhZ3JhbVJlc2V0U2VydmljZSBzZXJ2aWNlID0gbmV3IERpYWdyYW1SZXNldFNlcnZpY2UoKChEaWFncmFtR3JhcGhpY2FsVmlld2VyKXZpZXdlcikuZ2V0RQotLy8JCQkJdmlld2VyLCBnZXRFZGl0RG9tYWluKCksIGdldEFjdGlvblJlZ2lzdHJ5KCkpOwotLy8JCXNlcnZpY2UuY2xlYW5VcERpYWdyYW0oKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgYWN0aXZhdGUoKSB7Ci0JCXN1cGVyLmFjdGl2YXRlKCk7Ci0JCU9iamVjdCBtb2RlbCA9IGdldE1vZGVsKCk7Ci0JCWlmIChtb2RlbCBpbnN0YW5jZW9mIFZpZXcpIHsKLQkJCUVPYmplY3QgZSA9ICgoVmlldykgbW9kZWwpLmdldEVsZW1lbnQoKTsKLQkJCWlmIChlIGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZSkgewotCQkJCSgob3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZSkgZSkuYWRkQ29uc3VtZXIodGhpcyk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZGVhY3RpdmF0ZSgpIHsKLQkJc3VwZXIuZGVhY3RpdmF0ZSgpOwotCQlPYmplY3QgbW9kZWwgPSBnZXRNb2RlbCgpOwotCQlpZiAobW9kZWwgaW5zdGFuY2VvZiBWaWV3KSB7Ci0JCQlFT2JqZWN0IGUgPSAoKFZpZXcpIG1vZGVsKS5nZXRFbGVtZW50KCk7Ci0JCQlpZiAoZSBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGUpIHsKLQkJCQkoKG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGUpIGUpLnJlbW92ZUNvbnN1bWVyKHRoaXMpOwotCQkJfQotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L3BhcnRzL1Rhc2tOb2RlTmFtZUVkaXRQYXJ0LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L3BhcnRzL1Rhc2tOb2RlTmFtZUVkaXRQYXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3MjNlNjEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9wYXJ0cy9UYXNrTm9kZU5hbWVFZGl0UGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQ4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBhcnRzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuR3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5Ob25SZXNpemFibGVFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5oYW5kbGVzLk5vblJlc2l6YWJsZUhhbmRsZUtpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JVGV4dEF3YXJlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuTGFiZWxEaXJlY3RFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkxhYmVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uUnVubmFibGVXaXRoUmVzdWx0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucG9saWNpZXMuRGlhZ3JhbVRleHRTZWxlY3Rpb25FZGl0UG9saWN5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLnBhcnQuQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5wcm92aWRlcnMuRGlhZ3JhbUVsZW1lbnRUeXBlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnByb3ZpZGVycy5EaWFncmFtSWNvblByb3ZpZGVyTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnV0aWwuRGlhZ3JhbUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnV0aWwuRGlhZ3JhbUNvcmVVdGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkFjY2Vzc2libGVFZGl0UGFydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5yZXF1ZXN0cy5EaXJlY3RFZGl0UmVxdWVzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi50b29scy5EaXJlY3RFZGl0TWFuYWdlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuSVBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLklQYXJzZXJFZGl0U3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuUGFyc2VyRWRpdFN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLlBhcnNlck9wdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5QYXJzZXJTZXJ2aWNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuQ29tcGFydG1lbnRFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JR3JhcGhpY2FsRWRpdFBhcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmwxMG4uRGlhZ3JhbUNvbG9yUmVnaXN0cnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlcXVlc3RzLlJlcXVlc3RDb25zdGFudHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnRvb2xzLlRleHREaXJlY3RFZGl0TWFuYWdlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb3JlLnV0aWwuRU9iamVjdEFkYXB0ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLklFbGVtZW50VHlwZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi51aS5zZXJ2aWNlcy5wYXJzZXIuSVNlbWFudGljUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi51aS5zZXJ2aWNlcy5wYXJzZXIuUGFyc2VySGludEFkYXB0ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Gb250U3R5bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm90YXRpb25QYWNrYWdlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZW50QXNzaXN0UHJvY2Vzc29yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ2VsbEVkaXRvclZhbGlkYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmxlRXZlbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBUYXNrTm9kZU5hbWVFZGl0UGFydCBleHRlbmRzIENvbXBhcnRtZW50RWRpdFBhcnQgaW1wbGVtZW50cwotCQlJVGV4dEF3YXJlRWRpdFBhcnQgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZJU1VBTF9JRCA9IDQwMDI7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBEaXJlY3RFZGl0TWFuYWdlciBtYW5hZ2VyOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgSVBhcnNlciBwYXJzZXI7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBMaXN0IHBhcnNlckVsZW1lbnRzOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgU3RyaW5nIGRlZmF1bHRUZXh0OwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUYXNrTm9kZU5hbWVFZGl0UGFydChWaWV3IHZpZXcpIHsKLQkJc3VwZXIodmlldyk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKSB7Ci0JCXN1cGVyLmNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKTsKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5ESVJFQ1RfRURJVF9ST0xFLAotCQkJCW5ldyBMYWJlbERpcmVjdEVkaXRQb2xpY3koKSk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUsCi0JCQkJbmV3IE5vblJlc2l6YWJsZUVkaXRQb2xpY3koKSB7Ci0KLQkJCQkJcHJvdGVjdGVkIExpc3QgY3JlYXRlU2VsZWN0aW9uSGFuZGxlcygpIHsKLQkJCQkJCUxpc3QgaGFuZGxlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJCU5vblJlc2l6YWJsZUhhbmRsZUtpdC5hZGRNb3ZlSGFuZGxlKAotCQkJCQkJCQkoR3JhcGhpY2FsRWRpdFBhcnQpIGdldEhvc3QoKSwgaGFuZGxlcyk7Ci0JCQkJCQlyZXR1cm4gaGFuZGxlczsKLQkJCQkJfQotCi0JCQkJCXB1YmxpYyBDb21tYW5kIGdldENvbW1hbmQoUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQkJfQotCi0JCQkJCXB1YmxpYyBib29sZWFuIHVuZGVyc3RhbmRzUmVxdWVzdChSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJfQotCQkJCX0pOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldExhYmVsVGV4dEhlbHBlcihJRmlndXJlIGZpZ3VyZSkgewotCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQlyZXR1cm4gKChXcmFwTGFiZWwpIGZpZ3VyZSkuZ2V0VGV4dCgpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuICgoTGFiZWwpIGZpZ3VyZSkuZ2V0VGV4dCgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldExhYmVsVGV4dEhlbHBlcihJRmlndXJlIGZpZ3VyZSwgU3RyaW5nIHRleHQpIHsKLQkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJKChXcmFwTGFiZWwpIGZpZ3VyZSkuc2V0VGV4dCh0ZXh0KTsKLQkJfSBlbHNlIHsKLQkJCSgoTGFiZWwpIGZpZ3VyZSkuc2V0VGV4dCh0ZXh0KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSW1hZ2UgZ2V0TGFiZWxJY29uSGVscGVyKElGaWd1cmUgZmlndXJlKSB7Ci0JCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCXJldHVybiAoKFdyYXBMYWJlbCkgZmlndXJlKS5nZXRJY29uKCk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gKChMYWJlbCkgZmlndXJlKS5nZXRJY29uKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0TGFiZWxJY29uSGVscGVyKElGaWd1cmUgZmlndXJlLCBJbWFnZSBpY29uKSB7Ci0JCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCSgoV3JhcExhYmVsKSBmaWd1cmUpLnNldEljb24oaWNvbik7Ci0JCX0gZWxzZSB7Ci0JCQkoKExhYmVsKSBmaWd1cmUpLnNldEljb24oaWNvbik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGFiZWwoV3JhcExhYmVsIGZpZ3VyZSkgewotCQl1bnJlZ2lzdGVyVmlzdWFscygpOwotCQlzZXRGaWd1cmUoZmlndXJlKTsKLQkJZGVmYXVsdFRleHQgPSBnZXRMYWJlbFRleHRIZWxwZXIoZmlndXJlKTsKLQkJcmVnaXN0ZXJWaXN1YWxzKCk7Ci0JCXJlZnJlc2hWaXN1YWxzKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBMaXN0IGdldE1vZGVsQ2hpbGRyZW4oKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSUdyYXBoaWNhbEVkaXRQYXJ0IGdldENoaWxkQnlTZW1hbnRpY0hpbnQoU3RyaW5nIHNlbWFudGljSGludCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVPYmplY3QgZ2V0UGFyc2VyRWxlbWVudCgpIHsKLQkJRU9iamVjdCBlbGVtZW50ID0gcmVzb2x2ZVNlbWFudGljRWxlbWVudCgpOwotCQlyZXR1cm4gZWxlbWVudCAhPSBudWxsID8gZWxlbWVudCA6IChWaWV3KSBnZXRNb2RlbCgpOwotCX0KLQotCS8qKgotCSAqIEBtb2RpZmllZAotCSAqLwotCXByb3RlY3RlZCBJbWFnZSBnZXRMYWJlbEljb24oKSB7Ci0JCUltYWdlIGltYWdlID0gRGlhZ3JhbUljb25Qcm92aWRlck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5nZXRJY29uKHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKSwgdHJ1ZSk7Ci0JCWlmIChpbWFnZSA9PSBudWxsKSB7Ci0JCQlpbWFnZSA9ICBBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRTaGFyZWRJbWFnZSgKLQkJCQkiZGlhZ3JhbS9UYXNrRGVzY3JpcHRvci5naWYiKTsJLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJcmV0dXJuIGltYWdlOwotCX0KLQotCS8qKgotCSAqIEBtb2RpZmllZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TGFiZWxUZXh0KCkgewotCQlTdHJpbmcgdGV4dCA9IG51bGw7Ci0JCWlmIChnZXRQYXJzZXIoKSAhPSBudWxsKSB7Ci0JCQl0ZXh0ID0gZ2V0UGFyc2VyKCkuZ2V0UHJpbnRTdHJpbmcoCi0JCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihnZXRQYXJzZXJFbGVtZW50KCkpLAotCQkJCQlnZXRQYXJzZXJPcHRpb25zKCkuaW50VmFsdWUoKSk7Ci0JCX0KLQkJaWYgKHRleHQgPT0gbnVsbCB8fCB0ZXh0Lmxlbmd0aCgpID09IDApIHsKLQkJCXRleHQgPSBkZWZhdWx0VGV4dDsKLQkJfQotCQlpZiAodGV4dC5sZW5ndGgoKSA8IDE2KSB7Ci0JCQlpbnQgZ2FwID0gMTYgLSB0ZXh0Lmxlbmd0aCgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBnYXAgLyAyOyBpKyspIHsKLQkJCQl0ZXh0ICs9ICIgIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBnYXAgLyAyOyBpKyspIHsKLQkJCQl0ZXh0ID0gIiAiICsgdGV4dDsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JCXRleHQgPSBEaWFncmFtQ29yZVV0aWwud3JhcCh0ZXh0LCAxMik7Ci0JCXJldHVybiB0ZXh0OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMYWJlbFRleHQoU3RyaW5nIHRleHQpIHsKLQkJc2V0TGFiZWxUZXh0SGVscGVyKGdldEZpZ3VyZSgpLCB0ZXh0KTsKLQkJT2JqZWN0IHBkRWRpdFBvbGljeSA9IGdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSk7Ci0JCWlmIChwZEVkaXRQb2xpY3kgaW5zdGFuY2VvZiBEaWFncmFtVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHsKLQkJCSgoRGlhZ3JhbVRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSBwZEVkaXRQb2xpY3kpLnJlZnJlc2hGZWVkYmFjaygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RWRpdFRleHQoKSB7Ci0JCWlmIChnZXRQYXJzZXIoKSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gZ2V0UGFyc2VyKCkuZ2V0RWRpdFN0cmluZygKLQkJCQluZXcgRU9iamVjdEFkYXB0ZXIoZ2V0UGFyc2VyRWxlbWVudCgpKSwKLQkJCQlnZXRQYXJzZXJPcHRpb25zKCkuaW50VmFsdWUoKSk7Ci0JfQotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNFZGl0YWJsZSgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCQkvLwkJcmV0dXJuIGdldEVkaXRUZXh0KCkgIT0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElDZWxsRWRpdG9yVmFsaWRhdG9yIGdldEVkaXRUZXh0VmFsaWRhdG9yKCkgewotCQlyZXR1cm4gbmV3IElDZWxsRWRpdG9yVmFsaWRhdG9yKCkgewotCi0JCQlwdWJsaWMgU3RyaW5nIGlzVmFsaWQoZmluYWwgT2JqZWN0IHZhbHVlKSB7Ci0JCQkJaWYgKHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0JCQkJCWZpbmFsIEVPYmplY3QgZWxlbWVudCA9IGdldFBhcnNlckVsZW1lbnQoKTsKLQkJCQkJZmluYWwgSVBhcnNlciBwYXJzZXIgPSBnZXRQYXJzZXIoKTsKLQkJCQkJdHJ5IHsKLQkJCQkJCUlQYXJzZXJFZGl0U3RhdHVzIHZhbGlkID0gKElQYXJzZXJFZGl0U3RhdHVzKSBnZXRFZGl0aW5nRG9tYWluKCkKLQkJCQkJCQkJLnJ1bkV4Y2x1c2l2ZShuZXcgUnVubmFibGVXaXRoUmVzdWx0LkltcGwoKSB7Ci0KLQkJCQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQkJCQlzZXRSZXN1bHQocGFyc2VyLmlzVmFsaWRFZGl0U3RyaW5nKAotCQkJCQkJCQkJCQkJbmV3IEVPYmplY3RBZGFwdGVyKGVsZW1lbnQpLAotCQkJCQkJCQkJCQkJKFN0cmluZykgdmFsdWUpKTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfSk7Ci0JCQkJCQlyZXR1cm4gdmFsaWQuZ2V0Q29kZSgpID09IFBhcnNlckVkaXRTdGF0dXMuRURJVEFCTEUgPyBudWxsCi0JCQkJCQkJCTogdmFsaWQuZ2V0TWVzc2FnZSgpOwotCQkJCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZSkgewotCQkJCQkJaWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQkvLyBzaG91bGRuJ3QgZ2V0IGhlcmUKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElDb250ZW50QXNzaXN0UHJvY2Vzc29yIGdldENvbXBsZXRpb25Qcm9jZXNzb3IoKSB7Ci0JCWlmIChnZXRQYXJzZXIoKSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gZ2V0UGFyc2VyKCkuZ2V0Q29tcGxldGlvblByb2Nlc3NvcigKLQkJCQluZXcgRU9iamVjdEFkYXB0ZXIoZ2V0UGFyc2VyRWxlbWVudCgpKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQYXJzZXJPcHRpb25zIGdldFBhcnNlck9wdGlvbnMoKSB7Ci0JCXJldHVybiBQYXJzZXJPcHRpb25zLk5PTkU7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJUGFyc2VyIGdldFBhcnNlcigpIHsKLQkJaWYgKHBhcnNlciA9PSBudWxsKSB7Ci0JCQlTdHJpbmcgcGFyc2VySGludCA9ICgoVmlldykgZ2V0TW9kZWwoKSkuZ2V0VHlwZSgpOwotCQkJUGFyc2VySGludEFkYXB0ZXIgaGludEFkYXB0ZXIgPSBuZXcgUGFyc2VySGludEFkYXB0ZXIoCi0JCQkJCWdldFBhcnNlckVsZW1lbnQoKSwgcGFyc2VySGludCkgewotCi0JCQkJcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKENsYXNzIGFkYXB0ZXIpIHsKLQkJCQkJaWYgKElFbGVtZW50VHlwZS5jbGFzcy5lcXVhbHMoYWRhcHRlcikpIHsKLQkJCQkJCXJldHVybiBEaWFncmFtRWxlbWVudFR5cGVzLlRhc2tOb2RlXzIwMDI7Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIHN1cGVyLmdldEFkYXB0ZXIoYWRhcHRlcik7Ci0JCQkJfQotCQkJfTsKLQkJCXBhcnNlciA9IFBhcnNlclNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRQYXJzZXIoaGludEFkYXB0ZXIpOwotCQl9Ci0JCXJldHVybiBwYXJzZXI7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBEaXJlY3RFZGl0TWFuYWdlciBnZXRNYW5hZ2VyKCkgewotCQlpZiAobWFuYWdlciA9PSBudWxsKSB7Ci0JCQlzZXRNYW5hZ2VyKG5ldyBUZXh0RGlyZWN0RWRpdE1hbmFnZXIodGhpcywgVGV4dERpcmVjdEVkaXRNYW5hZ2VyCi0JCQkJCS5nZXRUZXh0Q2VsbEVkaXRvckNsYXNzKHRoaXMpLCBEaWFncmFtRWRpdFBhcnRGYWN0b3J5Ci0JCQkJCS5nZXRUZXh0Q2VsbEVkaXRvckxvY2F0b3IodGhpcykpKTsKLQkJfQotCQlyZXR1cm4gbWFuYWdlcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0TWFuYWdlcihEaXJlY3RFZGl0TWFuYWdlciBtYW5hZ2VyKSB7Ci0JCXRoaXMubWFuYWdlciA9IG1hbmFnZXI7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0KCkgewotCQlnZXRNYW5hZ2VyKCkuc2hvdygpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdChQb2ludCBldmVudExvY2F0aW9uKSB7Ci0JCWlmIChnZXRNYW5hZ2VyKCkuZ2V0Q2xhc3MoKSA9PSBUZXh0RGlyZWN0RWRpdE1hbmFnZXIuY2xhc3MpIHsKLQkJCSgoVGV4dERpcmVjdEVkaXRNYW5hZ2VyKSBnZXRNYW5hZ2VyKCkpLnNob3coZXZlbnRMb2NhdGlvbgotCQkJCQkuZ2V0U1dUUG9pbnQoKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0KGNoYXIgaW5pdGlhbENoYXJhY3RlcikgewotCQlpZiAoZ2V0TWFuYWdlcigpIGluc3RhbmNlb2YgVGV4dERpcmVjdEVkaXRNYW5hZ2VyKSB7Ci0JCQkoKFRleHREaXJlY3RFZGl0TWFuYWdlcikgZ2V0TWFuYWdlcigpKS5zaG93KGluaXRpYWxDaGFyYWN0ZXIpOwotCQl9IGVsc2UgewotCQkJcGVyZm9ybURpcmVjdEVkaXQoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdFJlcXVlc3QoUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCWZpbmFsIFJlcXVlc3QgdGhlUmVxdWVzdCA9IHJlcXVlc3Q7Ci0JCXRyeSB7Ci0JCQlnZXRFZGl0aW5nRG9tYWluKCkucnVuRXhjbHVzaXZlKG5ldyBSdW5uYWJsZSgpIHsKLQotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJaWYgKGlzQWN0aXZlKCkgJiYgaXNFZGl0YWJsZSgpKSB7Ci0JCQkJCQlpZiAodGhlUmVxdWVzdAotCQkJCQkJCQkuZ2V0RXh0ZW5kZWREYXRhKCkKLQkJCQkJCQkJLmdldCgKLQkJCQkJCQkJCQlSZXF1ZXN0Q29uc3RhbnRzLlJFUV9ESVJFQ1RFRElUX0VYVEVOREVEREFUQV9JTklUSUFMX0NIQVIpIGluc3RhbmNlb2YgQ2hhcmFjdGVyKSB7Ci0JCQkJCQkJQ2hhcmFjdGVyIGluaXRpYWxDaGFyID0gKENoYXJhY3RlcikgdGhlUmVxdWVzdAotCQkJCQkJCQkJLmdldEV4dGVuZGVkRGF0YSgpCi0JCQkJCQkJCQkuZ2V0KAotCQkJCQkJCQkJCQlSZXF1ZXN0Q29uc3RhbnRzLlJFUV9ESVJFQ1RFRElUX0VYVEVOREVEREFUQV9JTklUSUFMX0NIQVIpOwotCQkJCQkJCXBlcmZvcm1EaXJlY3RFZGl0KGluaXRpYWxDaGFyLmNoYXJWYWx1ZSgpKTsKLQkJCQkJCX0gZWxzZSBpZiAoKHRoZVJlcXVlc3QgaW5zdGFuY2VvZiBEaXJlY3RFZGl0UmVxdWVzdCkKLQkJCQkJCQkJJiYgKGdldEVkaXRUZXh0KCkuZXF1YWxzKGdldExhYmVsVGV4dCgpKSkpIHsKLQkJCQkJCQlEaXJlY3RFZGl0UmVxdWVzdCBlZGl0UmVxdWVzdCA9IChEaXJlY3RFZGl0UmVxdWVzdCkgdGhlUmVxdWVzdDsKLQkJCQkJCQlwZXJmb3JtRGlyZWN0RWRpdChlZGl0UmVxdWVzdC5nZXRMb2NhdGlvbigpKTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJcGVyZm9ybURpcmVjdEVkaXQoKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0pOwotCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hWaXN1YWxzKCkgewotCQlzdXBlci5yZWZyZXNoVmlzdWFscygpOwotCQlyZWZyZXNoTGFiZWwoKTsKLQkJcmVmcmVzaEZvbnQoKTsKLQkJcmVmcmVzaEZvbnRDb2xvcigpOwotCQlyZWZyZXNoVW5kZXJsaW5lKCk7Ci0JCXJlZnJlc2hTdHJpa2VUaHJvdWdoKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hMYWJlbCgpIHsKLQkJc2V0TGFiZWxUZXh0SGVscGVyKGdldEZpZ3VyZSgpLCBnZXRMYWJlbFRleHQoKSk7Ci0JCXNldExhYmVsSWNvbkhlbHBlcihnZXRGaWd1cmUoKSwgZ2V0TGFiZWxJY29uKCkpOwotCQlPYmplY3QgcGRFZGl0UG9saWN5ID0gZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFKTsKLQkJaWYgKHBkRWRpdFBvbGljeSBpbnN0YW5jZW9mIERpYWdyYW1UZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgewotCQkJKChEaWFncmFtVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHBkRWRpdFBvbGljeSkucmVmcmVzaEZlZWRiYWNrKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFVuZGVybGluZSgpIHsKLQkJRm9udFN0eWxlIHN0eWxlID0gKEZvbnRTdHlsZSkgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkuZ2V0U3R5bGUoCi0JCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGUoKSk7Ci0JCWlmIChzdHlsZSAhPSBudWxsICYmIGdldEZpZ3VyZSgpIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQkoKFdyYXBMYWJlbCkgZ2V0RmlndXJlKCkpLnNldFRleHRVbmRlcmxpbmUoc3R5bGUuaXNVbmRlcmxpbmUoKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFN0cmlrZVRocm91Z2goKSB7Ci0JCUZvbnRTdHlsZSBzdHlsZSA9IChGb250U3R5bGUpIGdldEZvbnRTdHlsZU93bmVyVmlldygpLmdldFN0eWxlKAotCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlKCkpOwotCQlpZiAoc3R5bGUgIT0gbnVsbCAmJiBnZXRGaWd1cmUoKSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJKChXcmFwTGFiZWwpIGdldEZpZ3VyZSgpKS5zZXRUZXh0U3RyaWtlVGhyb3VnaChzdHlsZQotCQkJCQkuaXNTdHJpa2VUaHJvdWdoKCkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hGb250KCkgewotCQlGb250U3R5bGUgc3R5bGUgPSAoRm9udFN0eWxlKSBnZXRGb250U3R5bGVPd25lclZpZXcoKS5nZXRTdHlsZSgKLQkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZSgpKTsKLQkJU3RyaW5nIGZvbnROYW1lID0gRGlhZ3JhbUNvbnN0YW50cy5nZXRGb250TmFtZShzdHlsZSk7Ci0JCWlmIChzdHlsZSAhPSBudWxsKSB7Ci0JCQlGb250RGF0YSBmb250RGF0YSA9IG5ldyBGb250RGF0YShmb250TmFtZSwgc3R5bGUKLQkJCQkJLmdldEZvbnRIZWlnaHQoKSwgKHN0eWxlLmlzQm9sZCgpID8gU1dULkJPTEQgOiBTV1QuTk9STUFMKQotCQkJCQl8IChzdHlsZS5pc0l0YWxpYygpID8gU1dULklUQUxJQyA6IFNXVC5OT1JNQUwpKTsKLQkJCXNldEZvbnQoZm9udERhdGEpOwotCQl9Ci0JCWVsc2UKLQkJCXNldEZvbnQoRGlhZ3JhbUNvbnN0YW50cy5nZXREZWZhdWx0Rm9udERhdGEoKSk7Ci0JfQotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0Rm9udENvbG9yKENvbG9yIGNvbG9yKSB7Ci0JCUNvbG9yIGMgPSBEaWFncmFtQ29yZVV0aWwuZ2V0Rm9udENvbG9yKHRoaXMpOwotCQlpZiAoYyAhPSBudWxsKSB7Ci0JCQljb2xvciA9IGM7Ci0JCX0KLQkJZ2V0RmlndXJlKCkuc2V0Rm9yZWdyb3VuZENvbG9yKGNvbG9yKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkU2VtYW50aWNMaXN0ZW5lcnMoKSB7Ci0JCWlmIChnZXRQYXJzZXIoKSBpbnN0YW5jZW9mIElTZW1hbnRpY1BhcnNlcikgewotCQkJRU9iamVjdCBlbGVtZW50ID0gcmVzb2x2ZVNlbWFudGljRWxlbWVudCgpOwotCQkJcGFyc2VyRWxlbWVudHMgPSAoKElTZW1hbnRpY1BhcnNlcikgZ2V0UGFyc2VyKCkpCi0JCQkJCS5nZXRTZW1hbnRpY0VsZW1lbnRzQmVpbmdQYXJzZWQoZWxlbWVudCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcnNlckVsZW1lbnRzLnNpemUoKTsgaSsrKSB7Ci0JCQkJYWRkTGlzdGVuZXJGaWx0ZXIoCi0JCQkJCQkiU2VtYW50aWNNb2RlbCIgKyBpLCB0aGlzLCAoRU9iamVjdCkgcGFyc2VyRWxlbWVudHMuZ2V0KGkpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9IGVsc2UgewotCQkJc3VwZXIuYWRkU2VtYW50aWNMaXN0ZW5lcnMoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVTZW1hbnRpY0xpc3RlbmVycygpIHsKLQkJaWYgKHBhcnNlckVsZW1lbnRzICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGFyc2VyRWxlbWVudHMuc2l6ZSgpOyBpKyspIHsKLQkJCQlyZW1vdmVMaXN0ZW5lckZpbHRlcigiU2VtYW50aWNNb2RlbCIgKyBpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9IGVsc2UgewotCQkJc3VwZXIucmVtb3ZlU2VtYW50aWNMaXN0ZW5lcnMoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQWNjZXNzaWJsZUVkaXRQYXJ0IGdldEFjY2Vzc2libGVFZGl0UGFydCgpIHsKLQkJaWYgKGFjY2Vzc2libGVFUCA9PSBudWxsKSB7Ci0JCQlhY2Nlc3NpYmxlRVAgPSBuZXcgQWNjZXNzaWJsZUdyYXBoaWNhbEVkaXRQYXJ0KCkgewotCi0JCQkJcHVibGljIHZvaWQgZ2V0TmFtZShBY2Nlc3NpYmxlRXZlbnQgZSkgewotCQkJCQllLnJlc3VsdCA9IGdldExhYmVsVGV4dEhlbHBlcihnZXRGaWd1cmUoKSk7Ci0JCQkJfQotCQkJfTsKLQkJfQotCQlyZXR1cm4gYWNjZXNzaWJsZUVQOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIFZpZXcgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkgewotCQlyZXR1cm4gKFZpZXcpIGdldE1vZGVsKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZE5vdGF0aW9uYWxMaXN0ZW5lcnMoKSB7Ci0JCXN1cGVyLmFkZE5vdGF0aW9uYWxMaXN0ZW5lcnMoKTsKLQkJYWRkTGlzdGVuZXJGaWx0ZXIoIlByaW1hcnlWaWV3IiwgdGhpcywgZ2V0UHJpbWFyeVZpZXcoKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlTm90YXRpb25hbExpc3RlbmVycygpIHsKLQkJc3VwZXIucmVtb3ZlTm90YXRpb25hbExpc3RlbmVycygpOwotCQlyZW1vdmVMaXN0ZW5lckZpbHRlcigiUHJpbWFyeVZpZXciKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVOb3RpZmljYXRpb25FdmVudChOb3RpZmljYXRpb24gZXZlbnQpIHsKLQkJT2JqZWN0IGZlYXR1cmUgPSBldmVudC5nZXRGZWF0dXJlKCk7Ci0JCWlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Gb250Q29sb3IoKS5lcXVhbHMoZmVhdHVyZSkpIHsKLQkJCUludGVnZXIgYyA9IChJbnRlZ2VyKSBldmVudC5nZXROZXdWYWx1ZSgpOwotCQkJc2V0Rm9udENvbG9yKERpYWdyYW1Db2xvclJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0Q29sb3IoYykpOwotCQl9IGVsc2UgaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX1VuZGVybGluZSgpLmVxdWFscygKLQkJCQlmZWF0dXJlKSkgewotCQkJcmVmcmVzaFVuZGVybGluZSgpOwotCQl9IGVsc2UgaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX1N0cmlrZVRocm91Z2goKQotCQkJCS5lcXVhbHMoZmVhdHVyZSkpIHsKLQkJCXJlZnJlc2hTdHJpa2VUaHJvdWdoKCk7Ci0JCX0gZWxzZSBpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfRm9udEhlaWdodCgpLmVxdWFscygKLQkJCQlmZWF0dXJlKQotCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0ZvbnROYW1lKCkuZXF1YWxzKAotCQkJCQkJZmVhdHVyZSkKLQkJCQl8fCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Cb2xkKCkKLQkJCQkJCS5lcXVhbHMoZmVhdHVyZSkKLQkJCQl8fCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9JdGFsaWMoKS5lcXVhbHMoCi0JCQkJCQlmZWF0dXJlKSkgewotCQkJcmVmcmVzaEZvbnQoKTsKLQkJfSBlbHNlIHsKLQkJCWlmIChnZXRQYXJzZXIoKSAhPSBudWxsCi0JCQkJCSYmIGdldFBhcnNlcigpLmlzQWZmZWN0aW5nRXZlbnQoZXZlbnQsCi0JCQkJCQkJZ2V0UGFyc2VyT3B0aW9ucygpLmludFZhbHVlKCkpKSB7Ci0JCQkJcmVmcmVzaExhYmVsKCk7Ci0JCQl9Ci0JCQlpZiAoZ2V0UGFyc2VyKCkgaW5zdGFuY2VvZiBJU2VtYW50aWNQYXJzZXIpIHsKLQkJCQlJU2VtYW50aWNQYXJzZXIgbW9kZWxQYXJzZXIgPSAoSVNlbWFudGljUGFyc2VyKSBnZXRQYXJzZXIoKTsKLQkJCQlpZiAobW9kZWxQYXJzZXIuYXJlU2VtYW50aWNFbGVtZW50c0FmZmVjdGVkKG51bGwsIGV2ZW50KSkgewotCQkJCQlyZW1vdmVTZW1hbnRpY0xpc3RlbmVycygpOwotCQkJCQlpZiAocmVzb2x2ZVNlbWFudGljRWxlbWVudCgpICE9IG51bGwpIHsKLQkJCQkJCWFkZFNlbWFudGljTGlzdGVuZXJzKCk7Ci0JCQkJCX0KLQkJCQkJcmVmcmVzaExhYmVsKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXN1cGVyLmhhbmRsZU5vdGlmaWNhdGlvbkV2ZW50KGV2ZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlRmlndXJlKCkgewotCQkvLyBQYXJlbnQgc2hvdWxkIGFzc2lnbiBvbmUgdXNpbmcgc2V0TGFiZWwoKSBtZXRob2QKLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9wYXJ0cy9Xb3JrUHJvZHVjdENvbXBvc2l0ZUVkaXRQYXJ0LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L3BhcnRzL1dvcmtQcm9kdWN0Q29tcG9zaXRlRWRpdFBhcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODI0NzdlNS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L3BhcnRzL1dvcmtQcm9kdWN0Q29tcG9zaXRlRWRpdFBhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wYXJ0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5NYXJnaW5Cb3JkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuU3RhY2tMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlRvb2xiYXJMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucG9saWNpZXMuRGlhZ3JhbVRleHRTZWxlY3Rpb25FZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBvbGljaWVzLldvcmtQcm9kdWN0Q29tcG9zaXRlQ2Fub25pY2FsRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wb2xpY2llcy5Xb3JrUHJvZHVjdENvbXBvc2l0ZUdyYXBoaWNhbE5vZGVFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBvbGljaWVzLldvcmtQcm9kdWN0Q29tcG9zaXRlSXRlbVNlbWFudGljRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLmZpZ3VyZXMuUmFpc2VkTWFyZ2luQm9yZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuR3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5MYXlvdXRFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklUZXh0QXdhcmVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5TaGFwZU5vZGVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5Db25zdHJhaW5lZFRvb2xiYXJMYXlvdXRFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkNyZWF0aW9uRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5EcmFnRHJvcEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuRWRpdFBvbGljeVJvbGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLkNvbnN0cmFpbmVkVG9vbGJhckxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5nZWYudWkuZmlndXJlcy5EZWZhdWx0U2l6ZU5vZGVGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZ2VmLnVpLmZpZ3VyZXMuTm9kZUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Mb2NhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFdvcmtQcm9kdWN0Q29tcG9zaXRlRWRpdFBhcnQgZXh0ZW5kcyBTaGFwZU5vZGVFZGl0UGFydCB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVklTVUFMX0lEID0gMTAwMjsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBjb250ZW50UGFuZTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBwcmltYXJ5U2hhcGU7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFdvcmtQcm9kdWN0Q29tcG9zaXRlRWRpdFBhcnQoVmlldyB2aWV3KSB7Ci0JCXN1cGVyKHZpZXcpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCkgewotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuQ1JFQVRJT05fUk9MRSwKLQkJCQluZXcgQ3JlYXRpb25FZGl0UG9saWN5KCkpOwotCi0JCXN1cGVyLmNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKTsKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLlNFTUFOVElDX1JPTEUsCi0JCQkJbmV3IFdvcmtQcm9kdWN0Q29tcG9zaXRlSXRlbVNlbWFudGljRWRpdFBvbGljeSgpKTsKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLkRSQUdfRFJPUF9ST0xFLAotCQkJCW5ldyBEcmFnRHJvcEVkaXRQb2xpY3koKSk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5DQU5PTklDQUxfUk9MRSwKLQkJCQluZXcgV29ya1Byb2R1Y3RDb21wb3NpdGVDYW5vbmljYWxFZGl0UG9saWN5KCkpOwotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LkxBWU9VVF9ST0xFLCBjcmVhdGVMYXlvdXRFZGl0UG9saWN5KCkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTGF5b3V0RWRpdFBvbGljeSBjcmVhdGVMYXlvdXRFZGl0UG9saWN5KCkgewotCi0JCUNvbnN0cmFpbmVkVG9vbGJhckxheW91dEVkaXRQb2xpY3kgbGVwID0gbmV3IENvbnN0cmFpbmVkVG9vbGJhckxheW91dEVkaXRQb2xpY3koKSB7Ci0KLQkJCXByb3RlY3RlZCBFZGl0UG9saWN5IGNyZWF0ZUNoaWxkRWRpdFBvbGljeShFZGl0UGFydCBjaGlsZCkgewotCQkJCWlmIChjaGlsZC5nZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUpID09IG51bGwpIHsKLQkJCQkJaWYgKGNoaWxkIGluc3RhbmNlb2YgSVRleHRBd2FyZUVkaXRQYXJ0KSB7Ci0JCQkJCQlyZXR1cm4gbmV3IERpYWdyYW1UZXh0U2VsZWN0aW9uRWRpdFBvbGljeSgpOwotCQkJCQl9Ci0JCQkJfQotCQkJCXJldHVybiBzdXBlci5jcmVhdGVDaGlsZEVkaXRQb2xpY3koY2hpbGQpOwotCQkJfQotCQl9OwotCQlyZXR1cm4gbGVwOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVOb2RlU2hhcGUoKSB7Ci0JCVdvcmtQcm9kdWN0Q29tcG9zaXRlRmlndXJlIGZpZ3VyZSA9IG5ldyBXb3JrUHJvZHVjdENvbXBvc2l0ZUZpZ3VyZSgpOwotCQlyZXR1cm4gcHJpbWFyeVNoYXBlID0gZmlndXJlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgV29ya1Byb2R1Y3RDb21wb3NpdGVGaWd1cmUgZ2V0UHJpbWFyeVNoYXBlKCkgewotCQlyZXR1cm4gKFdvcmtQcm9kdWN0Q29tcG9zaXRlRmlndXJlKSBwcmltYXJ5U2hhcGU7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBOb2RlRmlndXJlIGNyZWF0ZU5vZGVQbGF0ZSgpIHsKLQkJRGVmYXVsdFNpemVOb2RlRmlndXJlIHJlc3VsdCA9IG5ldyBEZWZhdWx0U2l6ZU5vZGVGaWd1cmUoZ2V0TWFwTW9kZSgpCi0JCQkJLkRQdG9MUCg0MCksIGdldE1hcE1vZGUoKS5EUHRvTFAoNDApKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGZpZ3VyZSBmb3IgdGhpcyBlZGl0IHBhcnQuCi0JICogCi0JICogQm9keSBvZiB0aGlzIG1ldGhvZCBkb2VzIG5vdCBkZXBlbmQgb24gc2V0dGluZ3MgaW4gZ2VuZXJhdGlvbiBtb2RlbAotCSAqIHNvIHlvdSBtYXkgc2FmZWx5IHJlbW92ZSA8aT5nZW5lcmF0ZWQ8L2k+IHRhZyBhbmQgbW9kaWZ5IGl0LgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTm9kZUZpZ3VyZSBjcmVhdGVOb2RlRmlndXJlKCkgewotCQlOb2RlRmlndXJlIGZpZ3VyZSA9IGNyZWF0ZU5vZGVQbGF0ZSgpOwotCQlmaWd1cmUuc2V0TGF5b3V0TWFuYWdlcihuZXcgU3RhY2tMYXlvdXQoKSk7Ci0JCUlGaWd1cmUgc2hhcGUgPSBjcmVhdGVOb2RlU2hhcGUoKTsKLQkJZmlndXJlLmFkZChzaGFwZSk7Ci0JCWNvbnRlbnRQYW5lID0gc2V0dXBDb250ZW50UGFuZShzaGFwZSk7Ci0JCXJldHVybiBmaWd1cmU7Ci0JfQotCi0JLyoqCi0JICogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiB0cmVhdHMgcGFzc2VkIGZpZ3VyZSBhcyBjb250ZW50IHBhbmUuCi0JICogUmVzcGVjdHMgbGF5b3V0IG9uZSBtYXkgaGF2ZSBzZXQgZm9yIGdlbmVyYXRlZCBmaWd1cmUuCi0JICogQHBhcmFtIG5vZGVTaGFwZSBpbnN0YW5jZSBvZiBnZW5lcmF0ZWQgZmlndXJlIGNsYXNzCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJRmlndXJlIHNldHVwQ29udGVudFBhbmUoSUZpZ3VyZSBub2RlU2hhcGUpIHsKLQkJaWYgKG5vZGVTaGFwZS5nZXRMYXlvdXRNYW5hZ2VyKCkgPT0gbnVsbCkgewotCQkJQ29uc3RyYWluZWRUb29sYmFyTGF5b3V0IGxheW91dCA9IG5ldyBDb25zdHJhaW5lZFRvb2xiYXJMYXlvdXQoKTsKLQkJCWxheW91dC5zZXRTcGFjaW5nKGdldE1hcE1vZGUoKS5EUHRvTFAoNSkpOwotCQkJbm9kZVNoYXBlLnNldExheW91dE1hbmFnZXIobGF5b3V0KTsKLQkJfQotCQlyZXR1cm4gbm9kZVNoYXBlOyAvLyB1c2Ugbm9kZVNoYXBlIGl0c2VsZiBhcyBjb250ZW50UGFuZQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSUZpZ3VyZSBnZXRDb250ZW50UGFuZSgpIHsKLQkJaWYgKGNvbnRlbnRQYW5lICE9IG51bGwpIHsKLQkJCXJldHVybiBjb250ZW50UGFuZTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0Q29udGVudFBhbmUoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGNsYXNzIFdvcmtQcm9kdWN0Q29tcG9zaXRlRmlndXJlIGV4dGVuZHMgUmVjdGFuZ2xlRmlndXJlIHsKLQotCQkvKioKLQkJICogQG1vZGlmaWVkCi0JCSAqLwotCQlwdWJsaWMgV29ya1Byb2R1Y3RDb21wb3NpdGVGaWd1cmUoKSB7Ci0KLQkJCW9yZy5lY2xpcHNlLmRyYXcyZC5Ub29sYmFyTGF5b3V0IG15R2VuTGF5b3V0TWFuYWdlciA9IG5ldyBvcmcuZWNsaXBzZS5kcmF3MmQuVG9vbGJhckxheW91dCgpOwotCQkJbXlHZW5MYXlvdXRNYW5hZ2VyLnNldFN0cmV0Y2hNaW5vckF4aXMoZmFsc2UpOwotCQkJbXlHZW5MYXlvdXRNYW5hZ2VyCi0JCQkJCS5zZXRNaW5vckFsaWdubWVudChvcmcuZWNsaXBzZS5kcmF3MmQuVG9vbGJhckxheW91dC5BTElHTl9DRU5URVIpOwotCQkJbXlHZW5MYXlvdXRNYW5hZ2VyLnNldFNwYWNpbmcoNSk7Ci0JCQlteUdlbkxheW91dE1hbmFnZXIuc2V0VmVydGljYWwodHJ1ZSk7Ci0KLQkJCXRoaXMuc2V0TGF5b3V0TWFuYWdlcihteUdlbkxheW91dE1hbmFnZXIpOwotCi0JCQl0aGlzLnNldEJhY2tncm91bmRDb2xvcihXT1JLUFJPRFVDVENPTVBPU0lURUZJR1VSRV9CQUNLCi0KLQkJCSk7Ci0JCQkvLwkJCXRoaXMuc2V0Qm9yZGVyKG5ldyBvcmcuZWNsaXBzZS5kcmF3MmQuTWFyZ2luQm9yZGVyKGdldE1hcE1vZGUoKQotCQkJLy8JCQkJCS5EUHRvTFAoMCksIGdldE1hcE1vZGUoKS5EUHRvTFAoMCksIGdldE1hcE1vZGUoKS5EUHRvTFAoMCksCi0JCQkvLwkJCQkJZ2V0TWFwTW9kZSgpLkRQdG9MUCgwKSkpOwotCQkJdGhpcy5zZXRCb3JkZXIobmV3IFJhaXNlZE1hcmdpbkJvcmRlcigpKTsKLQkJCWNyZWF0ZUNvbnRlbnRzKCk7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbnRlbnRzKCkgewotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgYm9vbGVhbiBteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSBmYWxzZTsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJvdGVjdGVkIGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcygpIHsKLQkJCXJldHVybiBteVVzZUxvY2FsQ29vcmRpbmF0ZXM7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJvdGVjdGVkIHZvaWQgc2V0VXNlTG9jYWxDb29yZGluYXRlcyhib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMpIHsKLQkJCW15VXNlTG9jYWxDb29yZGluYXRlcyA9IHVzZUxvY2FsQ29vcmRpbmF0ZXM7Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENvbG9yIFdPUktQUk9EVUNUQ09NUE9TSVRFRklHVVJFX0JBQ0sgPSBuZXcgQ29sb3IobnVsbCwKLQkJCTI1NSwgMjU1LCAyMDUpOwotCi0JLyoqCi0JICogQGN1c3RvbQotCSAqLwotCXB1YmxpYyB2b2lkIHVwZGF0ZWJvdW5kcygpIHsKLQkJUmVjdGFuZ2xlIGNvbnN0cmFpbnQgPSBuZXcgUmVjdGFuZ2xlKDAsIDAsIC0xLCAtMSk7Ci0JCU5vZGUgbm9kZSA9IChOb2RlKSB0aGlzLmdldE1vZGVsKCk7Ci0JCUxvY2F0aW9uIGxvY2F0aW9uID0gKExvY2F0aW9uKSBub2RlLmdldExheW91dENvbnN0cmFpbnQoKTsKLQkJaWYgKGxvY2F0aW9uICE9IG51bGwpIHsKLQkJCWNvbnN0cmFpbnQuc2V0TG9jYXRpb24obmV3IFBvaW50KGxvY2F0aW9uLmdldFgoKSwgbG9jYXRpb24uZ2V0WSgpKSk7Ci0JCX0KLQkJLy8JCWNvbnN0cmFpbnQud2lkdGggPSBnZXROb2RlKCkuZ2V0V2lkdGgoKTsKLQkJKChHcmFwaGljYWxFZGl0UGFydCkgZ2V0UGFyZW50KCkpLnNldExheW91dENvbnN0cmFpbnQodGhpcywKLQkJCQlnZXRGaWd1cmUoKSwgY29uc3RyYWludCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGFjdGl2YXRlKCkgewotCQlzdXBlci5hY3RpdmF0ZSgpOwotCQlPYmplY3QgbW9kZWwgPSBnZXRNb2RlbCgpOwotCQlpZiAobW9kZWwgaW5zdGFuY2VvZiBWaWV3KSB7Ci0JCQlFT2JqZWN0IGUgPSAoKFZpZXcpIG1vZGVsKS5nZXRFbGVtZW50KCk7Ci0JCQlpZiAoZSBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGUpIHsKLQkJCQkoKG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGUpIGUpLmFkZENvbnN1bWVyKHRoaXMpOwotCQkJfQotCQl9Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGRlYWN0aXZhdGUoKSB7Ci0JCXN1cGVyLmRlYWN0aXZhdGUoKTsKLQkJT2JqZWN0IG1vZGVsID0gZ2V0TW9kZWwoKTsKLQkJaWYgKG1vZGVsIGluc3RhbmNlb2YgVmlldykgewotCQkJRU9iamVjdCBlID0gKChWaWV3KSBtb2RlbCkuZ2V0RWxlbWVudCgpOwotCQkJaWYgKGUgaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlKSB7Ci0JCQkJKChvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlKSBlKS5yZW1vdmVDb25zdW1lcih0aGlzKTsKLQkJCX0KLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9wYXJ0cy9Xb3JrUHJvZHVjdENvbXBvc2l0ZVdvcmtQcm9kdWN0Q29tcGFydG1lbnRFZGl0UGFydC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9wYXJ0cy9Xb3JrUHJvZHVjdENvbXBvc2l0ZVdvcmtQcm9kdWN0Q29tcGFydG1lbnRFZGl0UGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOWExYTJhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvcGFydHMvV29ya1Byb2R1Y3RDb21wb3NpdGVXb3JrUHJvZHVjdENvbXBhcnRtZW50RWRpdFBhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBhcnRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuRWRpdFBvbGljeVJvbGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLk1hcmdpbkJvcmRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBvbGljaWVzLldvcmtQcm9kdWN0Q29tcG9zaXRlV29ya1Byb2R1Y3RDb21wYXJ0bWVudEl0ZW1TZW1hbnRpY0VkaXRQb2xpY3k7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQucGFydC5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5MaXN0Q29tcGFydG1lbnRFZGl0UGFydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZmlndXJlcy5SZXNpemFibGVDb21wYXJ0bWVudEZpZ3VyZTsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBXb3JrUHJvZHVjdENvbXBvc2l0ZVdvcmtQcm9kdWN0Q29tcGFydG1lbnRFZGl0UGFydCBleHRlbmRzCi0JCUxpc3RDb21wYXJ0bWVudEVkaXRQYXJ0IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWSVNVQUxfSUQgPSA1MDAyOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBXb3JrUHJvZHVjdENvbXBvc2l0ZVdvcmtQcm9kdWN0Q29tcGFydG1lbnRFZGl0UGFydChWaWV3IHZpZXcpIHsKLQkJc3VwZXIodmlldyk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGhhc01vZGVsQ2hpbGRyZW5DaGFuZ2VkKE5vdGlmaWNhdGlvbiBldnQpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEBtb2RpZmllZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q29tcGFydG1lbnROYW1lKCkgewotCQlyZXR1cm4gIiI7CS8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwdWJsaWMgSUZpZ3VyZSBjcmVhdGVGaWd1cmUoKSB7Ci0JCVJlc2l6YWJsZUNvbXBhcnRtZW50RmlndXJlIHJlc3VsdCA9IChSZXNpemFibGVDb21wYXJ0bWVudEZpZ3VyZSkgc3VwZXIKLQkJCQkuY3JlYXRlRmlndXJlKCk7Ci0KLQkJLy8gcmVtb3ZlIHRoZSBzcGFjaW5nCi0JCXJlc3VsdC5nZXRTY3JvbGxQYW5lKCkuZ2V0Q29udGVudHMoKS5zZXRCb3JkZXIoCi0JCQkJbmV3IE1hcmdpbkJvcmRlcigwLCAwLCAwLCAwKSk7Ci0KLQkJcmVzdWx0LnNldFRpdGxlVmlzaWJpbGl0eShmYWxzZSk7Ci0JCXJlc3VsdC5zZXRCb3JkZXIobnVsbCk7Ci0KLQkJLy8gZGlzYWJsZSBzY3JvbGxwYW5lICYgY29tcGFydG1lbnQgdGl0bGUKLQkJcmVzdWx0LmdldFNjcm9sbFBhbmUoKS5zZXRFbmFibGVkKGZhbHNlKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpIHsKLQkJc3VwZXIuY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpOwotCQlpbnN0YWxsRWRpdFBvbGljeSgKLQkJCQlFZGl0UG9saWN5Um9sZXMuU0VNQU5USUNfUk9MRSwKLQkJCQluZXcgV29ya1Byb2R1Y3RDb21wb3NpdGVXb3JrUHJvZHVjdENvbXBhcnRtZW50SXRlbVNlbWFudGljRWRpdFBvbGljeSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0UmF0aW8oRG91YmxlIHJhdGlvKSB7Ci0JCS8vIG5vdGhpbmcgdG8gZG8gLS0gcGFyZW50IGxheW91dCBkb2VzIG5vdCBhY2NlcHQgRG91YmxlIGNvbnN0cmFpbnRzIGFzIHJhdGlvCi0JCS8vIHN1cGVyLnNldFJhdGlvKHJhdGlvKTsgCi0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9wYXJ0cy9Xb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlRWRpdFBhcnQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvcGFydHMvV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZUVkaXRQYXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmODVhMDIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9wYXJ0cy9Xb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlRWRpdFBhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wYXJ0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Qb3NpdGlvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5TdGFja0xheW91dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBvbGljaWVzLldvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVDYW5vbmljYWxFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBvbGljaWVzLldvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVHcmFwaGljYWxOb2RlRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wb2xpY2llcy5Xb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlSXRlbVNlbWFudGljRWRpdFBvbGljeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5wYXJ0LkRpYWdyYW1WaXN1YWxJRFJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuZmlndXJlcy5XaWRlbmVkV3JhcExhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUudXRpbC5EaWFncmFtQ29yZVV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuTGF5b3V0RWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLk5vblJlc2l6YWJsZUVkaXRQb2xpY3k7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuQ3JlYXRlUmVxdWVzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklHcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5TaGFwZU5vZGVFZGl0UGFydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkVkaXRQb2xpY3lSb2xlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLkNvbnN0cmFpbmVkVG9vbGJhckxheW91dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5nZWYudWkuZmlndXJlcy5EZWZhdWx0U2l6ZU5vZGVGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZ2VmLnVpLmZpZ3VyZXMuTm9kZUZpZ3VyZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlRWRpdFBhcnQgZXh0ZW5kcyBTaGFwZU5vZGVFZGl0UGFydCB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVklTVUFMX0lEID0gMjAwMzsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBjb250ZW50UGFuZTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBwcmltYXJ5U2hhcGU7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVFZGl0UGFydChWaWV3IHZpZXcpIHsKLQkJc3VwZXIodmlldyk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKSB7Ci0KLQkJc3VwZXIuY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpOwotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuU0VNQU5USUNfUk9MRSwKLQkJCQluZXcgV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3koKSk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuTEFZT1VUX1JPTEUsIGNyZWF0ZUxheW91dEVkaXRQb2xpY3koKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBMYXlvdXRFZGl0UG9saWN5IGNyZWF0ZUxheW91dEVkaXRQb2xpY3koKSB7Ci0JCUxheW91dEVkaXRQb2xpY3kgbGVwID0gbmV3IExheW91dEVkaXRQb2xpY3koKSB7Ci0KLQkJCXByb3RlY3RlZCBFZGl0UG9saWN5IGNyZWF0ZUNoaWxkRWRpdFBvbGljeShFZGl0UGFydCBjaGlsZCkgewotCQkJCUVkaXRQb2xpY3kgcmVzdWx0ID0gY2hpbGQKLQkJCQkJCS5nZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgewotCQkJCQlyZXN1bHQgPSBuZXcgTm9uUmVzaXphYmxlRWRpdFBvbGljeSgpOwotCQkJCX0KLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCi0JCQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRNb3ZlQ2hpbGRyZW5Db21tYW5kKFJlcXVlc3QgcmVxdWVzdCkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCi0JCQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVDb21tYW5kKENyZWF0ZVJlcXVlc3QgcmVxdWVzdCkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9OwotCQlyZXR1cm4gbGVwOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVOb2RlU2hhcGUoKSB7Ci0JCVdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVGaWd1cmUgZmlndXJlID0gbmV3IFdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVGaWd1cmUoKTsKLQkJcmV0dXJuIHByaW1hcnlTaGFwZSA9IGZpZ3VyZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVGaWd1cmUgZ2V0UHJpbWFyeVNoYXBlKCkgewotCQlyZXR1cm4gKFdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVGaWd1cmUpIHByaW1hcnlTaGFwZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gYWRkRml4ZWRDaGlsZChFZGl0UGFydCBjaGlsZEVkaXRQYXJ0KSB7Ci0JCWlmIChjaGlsZEVkaXRQYXJ0IGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZU5hbWVFZGl0UGFydCkgewotCQkJKChXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlTmFtZUVkaXRQYXJ0KSBjaGlsZEVkaXRQYXJ0KQotCQkJCQkuc2V0TGFiZWwoZ2V0UHJpbWFyeVNoYXBlKCkKLQkJCQkJCQkuZ2V0RmlndXJlV29ya1Byb2R1Y3ROb2RlTmFtZUZpZ3VyZSgpKTsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gcmVtb3ZlRml4ZWRDaGlsZChFZGl0UGFydCBjaGlsZEVkaXRQYXJ0KSB7Ci0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTm9kZUZpZ3VyZSBjcmVhdGVOb2RlUGxhdGUoKSB7Ci0JCURlZmF1bHRTaXplTm9kZUZpZ3VyZSByZXN1bHQgPSBuZXcgRGVmYXVsdFNpemVOb2RlRmlndXJlKGdldE1hcE1vZGUoKQotCQkJCS5EUHRvTFAoNDApLCBnZXRNYXBNb2RlKCkuRFB0b0xQKDQwKSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBmaWd1cmUgZm9yIHRoaXMgZWRpdCBwYXJ0LgotCSAqIAotCSAqIEJvZHkgb2YgdGhpcyBtZXRob2QgZG9lcyBub3QgZGVwZW5kIG9uIHNldHRpbmdzIGluIGdlbmVyYXRpb24gbW9kZWwKLQkgKiBzbyB5b3UgbWF5IHNhZmVseSByZW1vdmUgPGk+Z2VuZXJhdGVkPC9pPiB0YWcgYW5kIG1vZGlmeSBpdC4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE5vZGVGaWd1cmUgY3JlYXRlTm9kZUZpZ3VyZSgpIHsKLQkJTm9kZUZpZ3VyZSBmaWd1cmUgPSBjcmVhdGVOb2RlUGxhdGUoKTsKLQkJZmlndXJlLnNldExheW91dE1hbmFnZXIobmV3IFN0YWNrTGF5b3V0KCkpOwotCQlJRmlndXJlIHNoYXBlID0gY3JlYXRlTm9kZVNoYXBlKCk7Ci0JCWZpZ3VyZS5hZGQoc2hhcGUpOwotCQljb250ZW50UGFuZSA9IHNldHVwQ29udGVudFBhbmUoc2hhcGUpOwotCQlyZXR1cm4gZmlndXJlOwotCX0KLQotCS8qKgotCSAqIERlZmF1bHQgaW1wbGVtZW50YXRpb24gdHJlYXRzIHBhc3NlZCBmaWd1cmUgYXMgY29udGVudCBwYW5lLgotCSAqIFJlc3BlY3RzIGxheW91dCBvbmUgbWF5IGhhdmUgc2V0IGZvciBnZW5lcmF0ZWQgZmlndXJlLgotCSAqIEBwYXJhbSBub2RlU2hhcGUgaW5zdGFuY2Ugb2YgZ2VuZXJhdGVkIGZpZ3VyZSBjbGFzcwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBzZXR1cENvbnRlbnRQYW5lKElGaWd1cmUgbm9kZVNoYXBlKSB7Ci0JCWlmIChub2RlU2hhcGUuZ2V0TGF5b3V0TWFuYWdlcigpID09IG51bGwpIHsKLQkJCUNvbnN0cmFpbmVkVG9vbGJhckxheW91dCBsYXlvdXQgPSBuZXcgQ29uc3RyYWluZWRUb29sYmFyTGF5b3V0KCk7Ci0JCQlsYXlvdXQuc2V0U3BhY2luZyhnZXRNYXBNb2RlKCkuRFB0b0xQKDUpKTsKLQkJCW5vZGVTaGFwZS5zZXRMYXlvdXRNYW5hZ2VyKGxheW91dCk7Ci0JCX0KLQkJcmV0dXJuIG5vZGVTaGFwZTsgLy8gdXNlIG5vZGVTaGFwZSBpdHNlbGYgYXMgY29udGVudFBhbmUKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElGaWd1cmUgZ2V0Q29udGVudFBhbmUoKSB7Ci0JCWlmIChjb250ZW50UGFuZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gY29udGVudFBhbmU7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldENvbnRlbnRQYW5lKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFZGl0UGFydCBnZXRQcmltYXJ5Q2hpbGRFZGl0UGFydCgpIHsKLQkJcmV0dXJuIGdldENoaWxkQnlTZW1hbnRpY0hpbnQoRGlhZ3JhbVZpc3VhbElEUmVnaXN0cnkKLQkJCQkuZ2V0VHlwZShXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlTmFtZUVkaXRQYXJ0LlZJU1VBTF9JRCkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRDaGlsZFZpc3VhbChFZGl0UGFydCBjaGlsZEVkaXRQYXJ0LCBpbnQgaW5kZXgpIHsKLQkJaWYgKGFkZEZpeGVkQ2hpbGQoY2hpbGRFZGl0UGFydCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5hZGRDaGlsZFZpc3VhbChjaGlsZEVkaXRQYXJ0LCAtMSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbW92ZUNoaWxkVmlzdWFsKEVkaXRQYXJ0IGNoaWxkRWRpdFBhcnQpIHsKLQkJaWYgKHJlbW92ZUZpeGVkQ2hpbGQoY2hpbGRFZGl0UGFydCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5yZW1vdmVDaGlsZFZpc3VhbChjaGlsZEVkaXRQYXJ0KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgZ2V0Q29udGVudFBhbmVGb3IoSUdyYXBoaWNhbEVkaXRQYXJ0IGVkaXRQYXJ0KSB7Ci0KLQkJcmV0dXJuIHN1cGVyLmdldENvbnRlbnRQYW5lRm9yKGVkaXRQYXJ0KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGNsYXNzIFdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVGaWd1cmUgZXh0ZW5kcyBSZWN0YW5nbGVGaWd1cmUgewotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZUZpZ3VyZSgpIHsKLQotCQkJdGhpcy5zZXRPdXRsaW5lKGZhbHNlKTsKLQkJCXRoaXMuc2V0QmFja2dyb3VuZENvbG9yKFdPUktQUk9EVUNUREVTQ1JJUFRPUk5PREVGSUdVUkVfQkFDSwotCi0JCQkpOwotCQkJY3JlYXRlQ29udGVudHMoKTsKLQkJfQotCi0JCS8qKgotCQkgKiBAbW9kaWZpZWQKLQkJICovCi0JCXByaXZhdGUgdm9pZCBjcmVhdGVDb250ZW50cygpIHsKLQkJCW9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCBmaWdfMCA9IG5ldyBXaWRlbmVkV3JhcExhYmVsKCk7Ci0JCQlmaWdfMC5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotCQkJZmlnXzAuc2V0Rm9udChXT1JLUFJPRFVDVE5PREVOQU1FRklHVVJFX0ZPTlQpOwotCi0JCQlEaWFncmFtQ29yZVV0aWwuc2V0TGFiZWxQcm9wZXJ0aWVzKGZpZ18wKTsgLy8gbW9kaWZpZWQKLQkJCXNldEZpZ3VyZVdvcmtQcm9kdWN0Tm9kZU5hbWVGaWd1cmUoZmlnXzApOwotCQkJZmlnXzAuc2V0VGV4dFdyYXBBbGlnbm1lbnQoUG9zaXRpb25Db25zdGFudHMuTEVGVCk7Ci0JCQlPYmplY3QgbGF5RGF0YTAgPSBudWxsOwotCi0JCQl0aGlzLmFkZChmaWdfMCwgbGF5RGF0YTApOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgV3JhcExhYmVsIGZXb3JrUHJvZHVjdE5vZGVOYW1lRmlndXJlOwotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgV3JhcExhYmVsIGdldEZpZ3VyZVdvcmtQcm9kdWN0Tm9kZU5hbWVGaWd1cmUoKSB7Ci0JCQlyZXR1cm4gZldvcmtQcm9kdWN0Tm9kZU5hbWVGaWd1cmU7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSB2b2lkIHNldEZpZ3VyZVdvcmtQcm9kdWN0Tm9kZU5hbWVGaWd1cmUoV3JhcExhYmVsIGZpZykgewotCQkJZldvcmtQcm9kdWN0Tm9kZU5hbWVGaWd1cmUgPSBmaWc7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSBib29sZWFuIG15VXNlTG9jYWxDb29yZGluYXRlcyA9IGZhbHNlOwotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcm90ZWN0ZWQgYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKCkgewotCQkJcmV0dXJuIG15VXNlTG9jYWxDb29yZGluYXRlczsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcm90ZWN0ZWQgdm9pZCBzZXRVc2VMb2NhbENvb3JkaW5hdGVzKGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcykgewotCQkJbXlVc2VMb2NhbENvb3JkaW5hdGVzID0gdXNlTG9jYWxDb29yZGluYXRlczsKLQkJfQotCi0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGFjdGl2YXRlKCkgewotCQlzdXBlci5hY3RpdmF0ZSgpOwotCQlPYmplY3QgbW9kZWwgPSBnZXRNb2RlbCgpOwotCQlpZiAobW9kZWwgaW5zdGFuY2VvZiBWaWV3KSB7Ci0JCQlFT2JqZWN0IGUgPSAoKFZpZXcpIG1vZGVsKS5nZXRFbGVtZW50KCk7Ci0JCQlpZiAoZSBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGUpIHsKLQkJCQkoKG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGUpIGUpLmFkZENvbnN1bWVyKHRoaXMpOwotCQkJfQotCQl9Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGRlYWN0aXZhdGUoKSB7Ci0JCXN1cGVyLmRlYWN0aXZhdGUoKTsKLQkJT2JqZWN0IG1vZGVsID0gZ2V0TW9kZWwoKTsKLQkJaWYgKG1vZGVsIGluc3RhbmNlb2YgVmlldykgewotCQkJRU9iamVjdCBlID0gKChWaWV3KSBtb2RlbCkuZ2V0RWxlbWVudCgpOwotCQkJaWYgKGUgaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlKSB7Ci0JCQkJKChvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlKSBlKS5yZW1vdmVDb25zdW1lcih0aGlzKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEZvbnQgV09SS1BST0RVQ1ROT0RFTkFNRUZJR1VSRV9GT05UID0gbmV3IEZvbnQoRGlzcGxheQotCQkJLmdldEN1cnJlbnQoKSwgIkFyaWFsIiwgOCwgU1dULk5PUk1BTCk7CS8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENvbG9yIFdPUktQUk9EVUNUREVTQ1JJUFRPUk5PREVGSUdVUkVfQkFDSyA9IG5ldyBDb2xvcigKLQkJCW51bGwsIDI1NSwgMjU1LCAyMDUpOwotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L3BhcnRzL1dvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVOYW1lRWRpdFBhcnQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvcGFydHMvV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZU5hbWVFZGl0UGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNjJhNWQyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvcGFydHMvV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZU5hbWVFZGl0UGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjE2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBhcnRzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uUnVubmFibGVXaXRoUmVzdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBvbGljaWVzLkRpYWdyYW1UZXh0U2VsZWN0aW9uRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQucGFydC5BY3Rpdml0eURldGFpbERpYWdyYW1FZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLnByb3ZpZGVycy5EaWFncmFtRWxlbWVudFR5cGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUucHJvdmlkZXJzLkRpYWdyYW1JY29uUHJvdmlkZXJNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUudXRpbC5EaWFncmFtQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUudXRpbC5EaWFncmFtQ29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkFjY2Vzc2libGVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuR3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5Ob25SZXNpemFibGVFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5oYW5kbGVzLk5vblJlc2l6YWJsZUhhbmRsZUtpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuRGlyZWN0RWRpdFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnRvb2xzLkRpcmVjdEVkaXRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuSVBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLklQYXJzZXJFZGl0U3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuUGFyc2VyRWRpdFN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLlBhcnNlck9wdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5QYXJzZXJTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLkNvbXBhcnRtZW50RWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklUZXh0QXdhcmVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5MYWJlbERpcmVjdEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5sMTBuLkRpYWdyYW1Db2xvclJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVxdWVzdHMuUmVxdWVzdENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnRvb2xzLlRleHREaXJlY3RFZGl0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvcmUudXRpbC5FT2JqZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLklFbGVtZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudWkuc2VydmljZXMucGFyc2VyLklTZW1hbnRpY1BhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudWkuc2VydmljZXMucGFyc2VyLlBhcnNlckhpbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkZvbnRTdHlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob3RhdGlvblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ2VsbEVkaXRvclZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2libGVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlTmFtZUVkaXRQYXJ0IGV4dGVuZHMgQ29tcGFydG1lbnRFZGl0UGFydAotCQlpbXBsZW1lbnRzIElUZXh0QXdhcmVFZGl0UGFydCB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVklTVUFMX0lEID0gNDAwMzsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIERpcmVjdEVkaXRNYW5hZ2VyIG1hbmFnZXI7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBJUGFyc2VyIHBhcnNlcjsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIExpc3QgcGFyc2VyRWxlbWVudHM7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZGVmYXVsdFRleHQ7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVOYW1lRWRpdFBhcnQoVmlldyB2aWV3KSB7Ci0JCXN1cGVyKHZpZXcpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCkgewotCQlzdXBlci5jcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuRElSRUNUX0VESVRfUk9MRSwKLQkJCQluZXcgTGFiZWxEaXJlY3RFZGl0UG9saWN5KCkpOwotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFLAotCQkJCW5ldyBOb25SZXNpemFibGVFZGl0UG9saWN5KCkgewotCi0JCQkJCXByb3RlY3RlZCBMaXN0IGNyZWF0ZVNlbGVjdGlvbkhhbmRsZXMoKSB7Ci0JCQkJCQlMaXN0IGhhbmRsZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCQlOb25SZXNpemFibGVIYW5kbGVLaXQuYWRkTW92ZUhhbmRsZSgKLQkJCQkJCQkJKEdyYXBoaWNhbEVkaXRQYXJ0KSBnZXRIb3N0KCksIGhhbmRsZXMpOwotCQkJCQkJcmV0dXJuIGhhbmRsZXM7Ci0JCQkJCX0KLQotCQkJCQlwdWJsaWMgQ29tbWFuZCBnZXRDb21tYW5kKFJlcXVlc3QgcmVxdWVzdCkgewotCQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJCX0KLQotCQkJCQlwdWJsaWMgYm9vbGVhbiB1bmRlcnN0YW5kc1JlcXVlc3QoUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCX0KLQkJCQl9KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRMYWJlbFRleHRIZWxwZXIoSUZpZ3VyZSBmaWd1cmUpIHsKLQkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJcmV0dXJuICgoV3JhcExhYmVsKSBmaWd1cmUpLmdldFRleHQoKTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiAoKExhYmVsKSBmaWd1cmUpLmdldFRleHQoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRMYWJlbFRleHRIZWxwZXIoSUZpZ3VyZSBmaWd1cmUsIFN0cmluZyB0ZXh0KSB7Ci0JCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCSgoV3JhcExhYmVsKSBmaWd1cmUpLnNldFRleHQodGV4dCk7Ci0JCX0gZWxzZSB7Ci0JCQkoKExhYmVsKSBmaWd1cmUpLnNldFRleHQodGV4dCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEltYWdlIGdldExhYmVsSWNvbkhlbHBlcihJRmlndXJlIGZpZ3VyZSkgewotCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQlyZXR1cm4gKChXcmFwTGFiZWwpIGZpZ3VyZSkuZ2V0SWNvbigpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuICgoTGFiZWwpIGZpZ3VyZSkuZ2V0SWNvbigpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldExhYmVsSWNvbkhlbHBlcihJRmlndXJlIGZpZ3VyZSwgSW1hZ2UgaWNvbikgewotCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQkoKFdyYXBMYWJlbCkgZmlndXJlKS5zZXRJY29uKGljb24pOwotCQl9IGVsc2UgewotCQkJKChMYWJlbCkgZmlndXJlKS5zZXRJY29uKGljb24pOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExhYmVsKFdyYXBMYWJlbCBmaWd1cmUpIHsKLQkJdW5yZWdpc3RlclZpc3VhbHMoKTsKLQkJc2V0RmlndXJlKGZpZ3VyZSk7Ci0JCWRlZmF1bHRUZXh0ID0gZ2V0TGFiZWxUZXh0SGVscGVyKGZpZ3VyZSk7Ci0JCXJlZ2lzdGVyVmlzdWFscygpOwotCQlyZWZyZXNoVmlzdWFscygpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBnZXRNb2RlbENoaWxkcmVuKCkgewotCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElHcmFwaGljYWxFZGl0UGFydCBnZXRDaGlsZEJ5U2VtYW50aWNIaW50KFN0cmluZyBzZW1hbnRpY0hpbnQpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFT2JqZWN0IGdldFBhcnNlckVsZW1lbnQoKSB7Ci0JCUVPYmplY3QgZWxlbWVudCA9IHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKTsKLQkJcmV0dXJuIGVsZW1lbnQgIT0gbnVsbCA/IGVsZW1lbnQgOiAoVmlldykgZ2V0TW9kZWwoKTsKLQl9Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSW1hZ2UgZ2V0TGFiZWxJY29uKCkgewotCQlJbWFnZSBpbWFnZSA9IERpYWdyYW1JY29uUHJvdmlkZXJNYW5hZ2VyLmdldEluc3RhbmNlKCkuZ2V0SWNvbihyZXNvbHZlU2VtYW50aWNFbGVtZW50KCksIHRydWUpOwotCQlpZiAoaW1hZ2UgPT0gbnVsbCkgewotCQkJaW1hZ2UgPSAgQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0U2hhcmVkSW1hZ2UoCi0JCQkJImRpYWdyYW0vV29ya1Byb2R1Y3REZXNjcmlwdG9yLmdpZiIpOwkvLyROT04tTkxTLTEkCi0JCX0KLQotCQlyZXR1cm4gaW1hZ2U7Ci0KLQl9Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldExhYmVsVGV4dCgpIHsKLQkJU3RyaW5nIHRleHQgPSBudWxsOwotCQlpZiAoZ2V0UGFyc2VyKCkgIT0gbnVsbCkgewotCQkJdGV4dCA9IGdldFBhcnNlcigpLmdldFByaW50U3RyaW5nKAotCQkJCQluZXcgRU9iamVjdEFkYXB0ZXIoZ2V0UGFyc2VyRWxlbWVudCgpKSwKLQkJCQkJZ2V0UGFyc2VyT3B0aW9ucygpLmludFZhbHVlKCkpOwotCQl9Ci0JCWlmICh0ZXh0ID09IG51bGwgfHwgdGV4dC5sZW5ndGgoKSA9PSAwKSB7Ci0JCQl0ZXh0ID0gZGVmYXVsdFRleHQ7Ci0JCX0KLQkJdGV4dCA9IERpYWdyYW1Db3JlVXRpbC53cmFwKHRleHQsIDMpOwotCQlyZXR1cm4gdGV4dDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGFiZWxUZXh0KFN0cmluZyB0ZXh0KSB7Ci0JCXNldExhYmVsVGV4dEhlbHBlcihnZXRGaWd1cmUoKSwgdGV4dCk7Ci0JCU9iamVjdCBwZEVkaXRQb2xpY3kgPSBnZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUpOwotCQlpZiAocGRFZGl0UG9saWN5IGluc3RhbmNlb2YgRGlhZ3JhbVRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSB7Ci0JCQkoKERpYWdyYW1UZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgcGRFZGl0UG9saWN5KS5yZWZyZXNoRmVlZGJhY2soKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEVkaXRUZXh0KCkgewotCQlpZiAoZ2V0UGFyc2VyKCkgPT0gbnVsbCkgewotCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIGdldFBhcnNlcigpLmdldEVkaXRTdHJpbmcoCi0JCQkJbmV3IEVPYmplY3RBZGFwdGVyKGdldFBhcnNlckVsZW1lbnQoKSksCi0JCQkJZ2V0UGFyc2VyT3B0aW9ucygpLmludFZhbHVlKCkpOwotCX0KLQotCS8qKgotCSAqIEBtb2RpZmllZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzRWRpdGFibGUoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQkJLy8JCXJldHVybiBnZXRFZGl0VGV4dCgpICE9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJQ2VsbEVkaXRvclZhbGlkYXRvciBnZXRFZGl0VGV4dFZhbGlkYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBJQ2VsbEVkaXRvclZhbGlkYXRvcigpIHsKLQotCQkJcHVibGljIFN0cmluZyBpc1ZhbGlkKGZpbmFsIE9iamVjdCB2YWx1ZSkgewotCQkJCWlmICh2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykgewotCQkJCQlmaW5hbCBFT2JqZWN0IGVsZW1lbnQgPSBnZXRQYXJzZXJFbGVtZW50KCk7Ci0JCQkJCWZpbmFsIElQYXJzZXIgcGFyc2VyID0gZ2V0UGFyc2VyKCk7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlJUGFyc2VyRWRpdFN0YXR1cyB2YWxpZCA9IChJUGFyc2VyRWRpdFN0YXR1cykgZ2V0RWRpdGluZ0RvbWFpbigpCi0JCQkJCQkJCS5ydW5FeGNsdXNpdmUobmV3IFJ1bm5hYmxlV2l0aFJlc3VsdC5JbXBsKCkgewotCi0JCQkJCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJCQkJc2V0UmVzdWx0KHBhcnNlci5pc1ZhbGlkRWRpdFN0cmluZygKLQkJCQkJCQkJCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihlbGVtZW50KSwKLQkJCQkJCQkJCQkJCShTdHJpbmcpIHZhbHVlKSk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0pOwotCQkJCQkJcmV0dXJuIHZhbGlkLmdldENvZGUoKSA9PSBQYXJzZXJFZGl0U3RhdHVzLkVESVRBQkxFID8gbnVsbAotCQkJCQkJCQk6IHZhbGlkLmdldE1lc3NhZ2UoKTsKLQkJCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gaWUpIHsKLQkJCQkJCWllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJLy8gc2hvdWxkbid0IGdldCBoZXJlCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJQ29udGVudEFzc2lzdFByb2Nlc3NvciBnZXRDb21wbGV0aW9uUHJvY2Vzc29yKCkgewotCQlpZiAoZ2V0UGFyc2VyKCkgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIGdldFBhcnNlcigpLmdldENvbXBsZXRpb25Qcm9jZXNzb3IoCi0JCQkJbmV3IEVPYmplY3RBZGFwdGVyKGdldFBhcnNlckVsZW1lbnQoKSkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUGFyc2VyT3B0aW9ucyBnZXRQYXJzZXJPcHRpb25zKCkgewotCQlyZXR1cm4gUGFyc2VyT3B0aW9ucy5OT05FOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSVBhcnNlciBnZXRQYXJzZXIoKSB7Ci0JCWlmIChwYXJzZXIgPT0gbnVsbCkgewotCQkJU3RyaW5nIHBhcnNlckhpbnQgPSAoKFZpZXcpIGdldE1vZGVsKCkpLmdldFR5cGUoKTsKLQkJCVBhcnNlckhpbnRBZGFwdGVyIGhpbnRBZGFwdGVyID0gbmV3IFBhcnNlckhpbnRBZGFwdGVyKAotCQkJCQlnZXRQYXJzZXJFbGVtZW50KCksIHBhcnNlckhpbnQpIHsKLQotCQkJCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihDbGFzcyBhZGFwdGVyKSB7Ci0JCQkJCWlmIChJRWxlbWVudFR5cGUuY2xhc3MuZXF1YWxzKGFkYXB0ZXIpKSB7Ci0JCQkJCQlyZXR1cm4gRGlhZ3JhbUVsZW1lbnRUeXBlcy5Xb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlXzIwMDM7Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIHN1cGVyLmdldEFkYXB0ZXIoYWRhcHRlcik7Ci0JCQkJfQotCQkJfTsKLQkJCXBhcnNlciA9IFBhcnNlclNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRQYXJzZXIoaGludEFkYXB0ZXIpOwotCQl9Ci0JCXJldHVybiBwYXJzZXI7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBEaXJlY3RFZGl0TWFuYWdlciBnZXRNYW5hZ2VyKCkgewotCQlpZiAobWFuYWdlciA9PSBudWxsKSB7Ci0JCQlzZXRNYW5hZ2VyKG5ldyBUZXh0RGlyZWN0RWRpdE1hbmFnZXIodGhpcywgVGV4dERpcmVjdEVkaXRNYW5hZ2VyCi0JCQkJCS5nZXRUZXh0Q2VsbEVkaXRvckNsYXNzKHRoaXMpLCBEaWFncmFtRWRpdFBhcnRGYWN0b3J5Ci0JCQkJCS5nZXRUZXh0Q2VsbEVkaXRvckxvY2F0b3IodGhpcykpKTsKLQkJfQotCQlyZXR1cm4gbWFuYWdlcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0TWFuYWdlcihEaXJlY3RFZGl0TWFuYWdlciBtYW5hZ2VyKSB7Ci0JCXRoaXMubWFuYWdlciA9IG1hbmFnZXI7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0KCkgewotCQlnZXRNYW5hZ2VyKCkuc2hvdygpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdChQb2ludCBldmVudExvY2F0aW9uKSB7Ci0JCWlmIChnZXRNYW5hZ2VyKCkuZ2V0Q2xhc3MoKSA9PSBUZXh0RGlyZWN0RWRpdE1hbmFnZXIuY2xhc3MpIHsKLQkJCSgoVGV4dERpcmVjdEVkaXRNYW5hZ2VyKSBnZXRNYW5hZ2VyKCkpLnNob3coZXZlbnRMb2NhdGlvbgotCQkJCQkuZ2V0U1dUUG9pbnQoKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0KGNoYXIgaW5pdGlhbENoYXJhY3RlcikgewotCQlpZiAoZ2V0TWFuYWdlcigpIGluc3RhbmNlb2YgVGV4dERpcmVjdEVkaXRNYW5hZ2VyKSB7Ci0JCQkoKFRleHREaXJlY3RFZGl0TWFuYWdlcikgZ2V0TWFuYWdlcigpKS5zaG93KGluaXRpYWxDaGFyYWN0ZXIpOwotCQl9IGVsc2UgewotCQkJcGVyZm9ybURpcmVjdEVkaXQoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdFJlcXVlc3QoUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCWZpbmFsIFJlcXVlc3QgdGhlUmVxdWVzdCA9IHJlcXVlc3Q7Ci0JCXRyeSB7Ci0JCQlnZXRFZGl0aW5nRG9tYWluKCkucnVuRXhjbHVzaXZlKG5ldyBSdW5uYWJsZSgpIHsKLQotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJaWYgKGlzQWN0aXZlKCkgJiYgaXNFZGl0YWJsZSgpKSB7Ci0JCQkJCQlpZiAodGhlUmVxdWVzdAotCQkJCQkJCQkuZ2V0RXh0ZW5kZWREYXRhKCkKLQkJCQkJCQkJLmdldCgKLQkJCQkJCQkJCQlSZXF1ZXN0Q29uc3RhbnRzLlJFUV9ESVJFQ1RFRElUX0VYVEVOREVEREFUQV9JTklUSUFMX0NIQVIpIGluc3RhbmNlb2YgQ2hhcmFjdGVyKSB7Ci0JCQkJCQkJQ2hhcmFjdGVyIGluaXRpYWxDaGFyID0gKENoYXJhY3RlcikgdGhlUmVxdWVzdAotCQkJCQkJCQkJLmdldEV4dGVuZGVkRGF0YSgpCi0JCQkJCQkJCQkuZ2V0KAotCQkJCQkJCQkJCQlSZXF1ZXN0Q29uc3RhbnRzLlJFUV9ESVJFQ1RFRElUX0VYVEVOREVEREFUQV9JTklUSUFMX0NIQVIpOwotCQkJCQkJCXBlcmZvcm1EaXJlY3RFZGl0KGluaXRpYWxDaGFyLmNoYXJWYWx1ZSgpKTsKLQkJCQkJCX0gZWxzZSBpZiAoKHRoZVJlcXVlc3QgaW5zdGFuY2VvZiBEaXJlY3RFZGl0UmVxdWVzdCkKLQkJCQkJCQkJJiYgKGdldEVkaXRUZXh0KCkuZXF1YWxzKGdldExhYmVsVGV4dCgpKSkpIHsKLQkJCQkJCQlEaXJlY3RFZGl0UmVxdWVzdCBlZGl0UmVxdWVzdCA9IChEaXJlY3RFZGl0UmVxdWVzdCkgdGhlUmVxdWVzdDsKLQkJCQkJCQlwZXJmb3JtRGlyZWN0RWRpdChlZGl0UmVxdWVzdC5nZXRMb2NhdGlvbigpKTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJcGVyZm9ybURpcmVjdEVkaXQoKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0pOwotCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hWaXN1YWxzKCkgewotCQlzdXBlci5yZWZyZXNoVmlzdWFscygpOwotCQlyZWZyZXNoTGFiZWwoKTsKLQkJcmVmcmVzaEZvbnQoKTsKLQkJcmVmcmVzaEZvbnRDb2xvcigpOwotCQlyZWZyZXNoVW5kZXJsaW5lKCk7Ci0JCXJlZnJlc2hTdHJpa2VUaHJvdWdoKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hMYWJlbCgpIHsKLQkJc2V0TGFiZWxUZXh0SGVscGVyKGdldEZpZ3VyZSgpLCBnZXRMYWJlbFRleHQoKSk7Ci0JCXNldExhYmVsSWNvbkhlbHBlcihnZXRGaWd1cmUoKSwgZ2V0TGFiZWxJY29uKCkpOwotCQlPYmplY3QgcGRFZGl0UG9saWN5ID0gZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFKTsKLQkJaWYgKHBkRWRpdFBvbGljeSBpbnN0YW5jZW9mIERpYWdyYW1UZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgewotCQkJKChEaWFncmFtVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHBkRWRpdFBvbGljeSkucmVmcmVzaEZlZWRiYWNrKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFVuZGVybGluZSgpIHsKLQkJRm9udFN0eWxlIHN0eWxlID0gKEZvbnRTdHlsZSkgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkuZ2V0U3R5bGUoCi0JCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGUoKSk7Ci0JCWlmIChzdHlsZSAhPSBudWxsICYmIGdldEZpZ3VyZSgpIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQkoKFdyYXBMYWJlbCkgZ2V0RmlndXJlKCkpLnNldFRleHRVbmRlcmxpbmUoc3R5bGUuaXNVbmRlcmxpbmUoKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFN0cmlrZVRocm91Z2goKSB7Ci0JCUZvbnRTdHlsZSBzdHlsZSA9IChGb250U3R5bGUpIGdldEZvbnRTdHlsZU93bmVyVmlldygpLmdldFN0eWxlKAotCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlKCkpOwotCQlpZiAoc3R5bGUgIT0gbnVsbCAmJiBnZXRGaWd1cmUoKSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJKChXcmFwTGFiZWwpIGdldEZpZ3VyZSgpKS5zZXRUZXh0U3RyaWtlVGhyb3VnaChzdHlsZQotCQkJCQkuaXNTdHJpa2VUaHJvdWdoKCkpOwotCQl9Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaEZvbnQoKSB7Ci0JCUZvbnRTdHlsZSBzdHlsZSA9IChGb250U3R5bGUpIGdldEZvbnRTdHlsZU93bmVyVmlldygpLmdldFN0eWxlKAotCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlKCkpOwotCQlTdHJpbmcgZm9udE5hbWUgPSBEaWFncmFtQ29uc3RhbnRzLmdldEZvbnROYW1lKHN0eWxlKTsKLQkJaWYgKHN0eWxlICE9IG51bGwpIHsKLQkJCUZvbnREYXRhIGZvbnREYXRhID0gbmV3IEZvbnREYXRhKGZvbnROYW1lLCBzdHlsZQotCQkJCQkuZ2V0Rm9udEhlaWdodCgpLCAoc3R5bGUuaXNCb2xkKCkgPyBTV1QuQk9MRCA6IFNXVC5OT1JNQUwpCi0JCQkJCXwgKHN0eWxlLmlzSXRhbGljKCkgPyBTV1QuSVRBTElDIDogU1dULk5PUk1BTCkpOwotCQkJc2V0Rm9udChmb250RGF0YSk7Ci0JCX0KLQkJZWxzZQotCQkJc2V0Rm9udChEaWFncmFtQ29uc3RhbnRzLmdldERlZmF1bHRGb250RGF0YSgpKTsKLQl9Ci0JCi0JCi0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRGb250Q29sb3IoQ29sb3IgY29sb3IpIHsKLQkJQ29sb3IgYyA9IERpYWdyYW1Db3JlVXRpbC5nZXRGb250Q29sb3IodGhpcyk7Ci0JCWlmIChjICE9IG51bGwpIHsKLQkJCWNvbG9yID0gYzsKLQkJfQotCQlnZXRGaWd1cmUoKS5zZXRGb3JlZ3JvdW5kQ29sb3IoY29sb3IpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRTZW1hbnRpY0xpc3RlbmVycygpIHsKLQkJaWYgKGdldFBhcnNlcigpIGluc3RhbmNlb2YgSVNlbWFudGljUGFyc2VyKSB7Ci0JCQlFT2JqZWN0IGVsZW1lbnQgPSByZXNvbHZlU2VtYW50aWNFbGVtZW50KCk7Ci0JCQlwYXJzZXJFbGVtZW50cyA9ICgoSVNlbWFudGljUGFyc2VyKSBnZXRQYXJzZXIoKSkKLQkJCQkJLmdldFNlbWFudGljRWxlbWVudHNCZWluZ1BhcnNlZChlbGVtZW50KTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGFyc2VyRWxlbWVudHMuc2l6ZSgpOyBpKyspIHsKLQkJCQlhZGRMaXN0ZW5lckZpbHRlcigKLQkJCQkJCSJTZW1hbnRpY01vZGVsIiArIGksIHRoaXMsIChFT2JqZWN0KSBwYXJzZXJFbGVtZW50cy5nZXQoaSkpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlzdXBlci5hZGRTZW1hbnRpY0xpc3RlbmVycygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbW92ZVNlbWFudGljTGlzdGVuZXJzKCkgewotCQlpZiAocGFyc2VyRWxlbWVudHMgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJzZXJFbGVtZW50cy5zaXplKCk7IGkrKykgewotCQkJCXJlbW92ZUxpc3RlbmVyRmlsdGVyKCJTZW1hbnRpY01vZGVsIiArIGkpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlzdXBlci5yZW1vdmVTZW1hbnRpY0xpc3RlbmVycygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBBY2Nlc3NpYmxlRWRpdFBhcnQgZ2V0QWNjZXNzaWJsZUVkaXRQYXJ0KCkgewotCQlpZiAoYWNjZXNzaWJsZUVQID09IG51bGwpIHsKLQkJCWFjY2Vzc2libGVFUCA9IG5ldyBBY2Nlc3NpYmxlR3JhcGhpY2FsRWRpdFBhcnQoKSB7Ci0KLQkJCQlwdWJsaWMgdm9pZCBnZXROYW1lKEFjY2Vzc2libGVFdmVudCBlKSB7Ci0JCQkJCWUucmVzdWx0ID0gZ2V0TGFiZWxUZXh0SGVscGVyKGdldEZpZ3VyZSgpKTsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0JCXJldHVybiBhY2Nlc3NpYmxlRVA7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgVmlldyBnZXRGb250U3R5bGVPd25lclZpZXcoKSB7Ci0JCXJldHVybiAoVmlldykgZ2V0TW9kZWwoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkTm90YXRpb25hbExpc3RlbmVycygpIHsKLQkJc3VwZXIuYWRkTm90YXRpb25hbExpc3RlbmVycygpOwotCQlhZGRMaXN0ZW5lckZpbHRlcigiUHJpbWFyeVZpZXciLCB0aGlzLCBnZXRQcmltYXJ5VmlldygpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVOb3RhdGlvbmFsTGlzdGVuZXJzKCkgewotCQlzdXBlci5yZW1vdmVOb3RhdGlvbmFsTGlzdGVuZXJzKCk7Ci0JCXJlbW92ZUxpc3RlbmVyRmlsdGVyKCJQcmltYXJ5VmlldyIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGhhbmRsZU5vdGlmaWNhdGlvbkV2ZW50KE5vdGlmaWNhdGlvbiBldmVudCkgewotCQlPYmplY3QgZmVhdHVyZSA9IGV2ZW50LmdldEZlYXR1cmUoKTsKLQkJaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0ZvbnRDb2xvcigpLmVxdWFscyhmZWF0dXJlKSkgewotCQkJSW50ZWdlciBjID0gKEludGVnZXIpIGV2ZW50LmdldE5ld1ZhbHVlKCk7Ci0JCQlzZXRGb250Q29sb3IoRGlhZ3JhbUNvbG9yUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXRDb2xvcihjKSk7Ci0JCX0gZWxzZSBpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfVW5kZXJsaW5lKCkuZXF1YWxzKAotCQkJCWZlYXR1cmUpKSB7Ci0JCQlyZWZyZXNoVW5kZXJsaW5lKCk7Ci0JCX0gZWxzZSBpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfU3RyaWtlVGhyb3VnaCgpCi0JCQkJLmVxdWFscyhmZWF0dXJlKSkgewotCQkJcmVmcmVzaFN0cmlrZVRocm91Z2goKTsKLQkJfSBlbHNlIGlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Gb250SGVpZ2h0KCkuZXF1YWxzKAotCQkJCWZlYXR1cmUpCi0JCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfRm9udE5hbWUoKS5lcXVhbHMoCi0JCQkJCQlmZWF0dXJlKQotCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0JvbGQoKQotCQkJCQkJLmVxdWFscyhmZWF0dXJlKQotCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0l0YWxpYygpLmVxdWFscygKLQkJCQkJCWZlYXR1cmUpKSB7Ci0JCQlyZWZyZXNoRm9udCgpOwotCQl9IGVsc2UgewotCQkJaWYgKGdldFBhcnNlcigpICE9IG51bGwKLQkJCQkJJiYgZ2V0UGFyc2VyKCkuaXNBZmZlY3RpbmdFdmVudChldmVudCwKLQkJCQkJCQlnZXRQYXJzZXJPcHRpb25zKCkuaW50VmFsdWUoKSkpIHsKLQkJCQlyZWZyZXNoTGFiZWwoKTsKLQkJCX0KLQkJCWlmIChnZXRQYXJzZXIoKSBpbnN0YW5jZW9mIElTZW1hbnRpY1BhcnNlcikgewotCQkJCUlTZW1hbnRpY1BhcnNlciBtb2RlbFBhcnNlciA9IChJU2VtYW50aWNQYXJzZXIpIGdldFBhcnNlcigpOwotCQkJCWlmIChtb2RlbFBhcnNlci5hcmVTZW1hbnRpY0VsZW1lbnRzQWZmZWN0ZWQobnVsbCwgZXZlbnQpKSB7Ci0JCQkJCXJlbW92ZVNlbWFudGljTGlzdGVuZXJzKCk7Ci0JCQkJCWlmIChyZXNvbHZlU2VtYW50aWNFbGVtZW50KCkgIT0gbnVsbCkgewotCQkJCQkJYWRkU2VtYW50aWNMaXN0ZW5lcnMoKTsKLQkJCQkJfQotCQkJCQlyZWZyZXNoTGFiZWwoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJc3VwZXIuaGFuZGxlTm90aWZpY2F0aW9uRXZlbnQoZXZlbnQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVGaWd1cmUoKSB7Ci0JCS8vIFBhcmVudCBzaG91bGQgYXNzaWduIG9uZSB1c2luZyBzZXRMYWJlbCgpIG1ldGhvZAotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L3BvbGljaWVzL0FjdGl2aXR5RGV0YWlsRGlhZ3JhbUNhbm9uaWNhbEVkaXRQb2xpY3kuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvcG9saWNpZXMvQWN0aXZpdHlEZXRhaWxEaWFncmFtQ2Fub25pY2FsRWRpdFBvbGljeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZWI2ODlmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvcG9saWNpZXMvQWN0aXZpdHlEZXRhaWxEaWFncmFtQ2Fub25pY2FsRWRpdFBvbGljeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBvbGljaWVzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBhcnRzLkFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBhcnRzLkxpbmtFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wYXJ0cy5Sb2xlTm9kZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBhcnRzLlJvbGVUYXNrQ29tcG9zaXRlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucGFydHMuVGFza05vZGVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wYXJ0cy5Xb3JrUHJvZHVjdENvbXBvc2l0ZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBhcnRzLldvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQucGFydC5EaWFncmFtVmlzdWFsSURSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQucHJvdmlkZXJzLkRpYWdyYW1FbGVtZW50VHlwZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5wYXJ0LnV0aWwuRGlhZ3JhbUVkaXRvclV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuQWN0aXZpdHlEZXRhaWxEaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTW9kZWxQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLnV0aWwuVmlld1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuRGlhZ3JhbUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklHcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5DYW5vbmljYWxDb25uZWN0aW9uRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlcXVlc3RzLkNyZWF0ZUNvbm5lY3Rpb25WaWV3UmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlcXVlc3RzLlJlcXVlc3RDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvcmUudXRpbC5FT2JqZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLklFbGVtZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5EaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkVkZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eURldGFpbERpYWdyYW1DYW5vbmljYWxFZGl0UG9saWN5IGV4dGVuZHMKLQkJQ2Fub25pY2FsQ29ubmVjdGlvbkVkaXRQb2xpY3kgewotCi0JQE92ZXJyaWRlCi0JcHVibGljIEVPYmplY3QgZ2V0U2VtYW50aWNIb3N0KCkgewotCQlyZXR1cm4gaG9zdCgpLmdldE1vZGVsKCkgIT0gbnVsbCA/IHN1cGVyLmdldFNlbWFudGljSG9zdCgpIDogbnVsbDsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaE9uQWN0aXZhdGUoKSB7CQkKLQkJc3VwZXIucmVmcmVzaE9uQWN0aXZhdGUoKTsKLQkJCi0JCUVkaXRQYXJ0IGVwID0gZ2V0SG9zdCgpOwotCQlpZihlcCBpbnN0YW5jZW9mIERpYWdyYW1FZGl0UGFydCkgewotCQkJRGlhZ3JhbUVkaXRvclV0aWwuaW5pdGlhbGl6ZU9uQWN0aXZhdGUoKERpYWdyYW1FZGl0UGFydCkgZXApOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBMaXN0IGdldFNlbWFudGljQ2hpbGRyZW5MaXN0KCkgewotCQlMaXN0IHJlc3VsdCA9IG5ldyBMaW5rZWRMaXN0KCk7Ci0JCUVPYmplY3QgbW9kZWxPYmplY3QgPSAoKFZpZXcpIGdldEhvc3QoKS5nZXRNb2RlbCgpKS5nZXRFbGVtZW50KCk7Ci0JCVZpZXcgdmlld09iamVjdCA9IChWaWV3KSBnZXRIb3N0KCkuZ2V0TW9kZWwoKTsKLQkJRU9iamVjdCBuZXh0VmFsdWU7Ci0JCWludCBub2RlVklEOwotCQlmb3IgKEl0ZXJhdG9yIHZhbHVlcyA9ICgoTm9kZUNvbnRhaW5lcikgbW9kZWxPYmplY3QpLmdldE5vZGVzKCkKLQkJCQkuaXRlcmF0b3IoKTsgdmFsdWVzLmhhc05leHQoKTspIHsKLQkJCW5leHRWYWx1ZSA9IChFT2JqZWN0KSB2YWx1ZXMubmV4dCgpOwotCQkJbm9kZVZJRCA9IERpYWdyYW1WaXN1YWxJRFJlZ2lzdHJ5LmdldE5vZGVWaXN1YWxJRCh2aWV3T2JqZWN0LAotCQkJCQluZXh0VmFsdWUpOwotCQkJc3dpdGNoIChub2RlVklEKSB7Ci0JCQljYXNlIFJvbGVUYXNrQ29tcG9zaXRlRWRpdFBhcnQuVklTVUFMX0lEOiB7Ci0JCQkJcmVzdWx0LmFkZChuZXh0VmFsdWUpOwotCQkJCWJyZWFrOwotCQkJfQotCQkJY2FzZSBXb3JrUHJvZHVjdENvbXBvc2l0ZUVkaXRQYXJ0LlZJU1VBTF9JRDogewotCQkJCXJlc3VsdC5hZGQobmV4dFZhbHVlKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIEBtb2RpZmllZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHNob3VsZERlbGV0ZVZpZXcoVmlldyB2aWV3KSB7Ci0JCXJldHVybiB2aWV3LmlzU2V0RWxlbWVudCgpCi0JCQkJJiYgdmlldy5nZXRFbGVtZW50KCkgIT0gbnVsbAotCQkJCSYmICh2aWV3LmdldEVsZW1lbnQoKS5lSXNQcm94eSgpIHx8IHZpZXcuZ2V0RWxlbWVudCgpIGluc3RhbmNlb2YgTm9kZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGVmYXVsdEZhY3RvcnlIaW50KCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGdldENvbm5lY3Rpb25zKENvbGxlY3Rpb24gY29ubmVjdGlvbnMsCi0JCQlOb2RlQ29udGFpbmVyIGNvbnRhaW5lcikgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjb250YWluZXIuZ2V0Tm9kZXMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU5vZGUgbm9kZSA9IChOb2RlKSBpdGVyLm5leHQoKTsKLQkJCWNvbm5lY3Rpb25zLmFkZEFsbChub2RlLmdldE91dGdvaW5nQ29ubmVjdGlvbnMoKSk7Ci0JCQlpZiAobm9kZSBpbnN0YW5jZW9mIE5vZGVDb250YWluZXIpIHsKLQkJCQlnZXRDb25uZWN0aW9ucyhjb25uZWN0aW9ucywgKE5vZGVDb250YWluZXIpIG5vZGUpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJvdGVjdGVkIExpc3QgZ2V0U2VtYW50aWNDb25uZWN0aW9uc0xpc3QoKSB7Ci0JCUFjdGl2aXR5RGV0YWlsRGlhZ3JhbSBhZGQgPSAoQWN0aXZpdHlEZXRhaWxEaWFncmFtKSAoKFZpZXcpIGdldEhvc3QoKQotCQkJCS5nZXRNb2RlbCgpKS5nZXRFbGVtZW50KCk7Ci0JCUxpc3QgY29ubmVjdGlvbnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWdldENvbm5lY3Rpb25zKGNvbm5lY3Rpb25zLCBhZGQpOwotCQlyZXR1cm4gY29ubmVjdGlvbnM7Ci0JfQotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJvdGVjdGVkIEVPYmplY3QgZ2V0U291cmNlRWxlbWVudChFT2JqZWN0IHJlbGF0aW9uc2hpcCkgewotCQlpZiAocmVsYXRpb25zaGlwIGluc3RhbmNlb2YgTGluaykgewotCQkJcmV0dXJuICgoTGluaykgcmVsYXRpb25zaGlwKS5nZXRTb3VyY2UoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRU9iamVjdCBnZXRUYXJnZXRFbGVtZW50KEVPYmplY3QgcmVsYXRpb25zaGlwKSB7Ci0JCWlmIChyZWxhdGlvbnNoaXAgaW5zdGFuY2VvZiBMaW5rKSB7Ci0JCQlyZXR1cm4gKChMaW5rKSByZWxhdGlvbnNoaXApLmdldFRhcmdldCgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBtb2RpZmllZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHNob3VsZEluY2x1ZGVDb25uZWN0aW9uKEVkZ2UgY29ubmVjdG9yLAotCQkJQ29sbGVjdGlvbiBjaGlsZHJlbikgewotCQlyZXR1cm4gc3VwZXIuc2hvdWxkSW5jbHVkZUNvbm5lY3Rpb24oY29ubmVjdG9yLCBjaGlsZHJlbik7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFNlbWFudGljKCkgewotCQlMaXN0IGNyZWF0ZWRWaWV3cyA9IG5ldyBMaW5rZWRMaXN0KCk7Ci0JCWNyZWF0ZWRWaWV3cy5hZGRBbGwocmVmcmVzaFNlbWFudGljQ2hpbGRyZW4oKSk7Ci0JCUxpc3QgY3JlYXRlZENvbm5lY3Rpb25WaWV3cyA9IG5ldyBMaW5rZWRMaXN0KCk7Ci0JCWNyZWF0ZWRDb25uZWN0aW9uVmlld3MuYWRkQWxsKHJlZnJlc2hTZW1hbnRpY0Nvbm5lY3Rpb25zKCkpOwotCQljcmVhdGVkQ29ubmVjdGlvblZpZXdzLmFkZEFsbChyZWZyZXNoQ29ubmVjdGlvbnMoKSk7Ci0KLQkJLy8JCWlmIChjcmVhdGVkVmlld3Muc2l6ZSgpID4gMSkgewotCQkvLwkJCS8vIHBlcmZvcm0gYSBsYXlvdXQgb2YgdGhlIGNvbnRhaW5lcgotCQkvLwkJCURlZmVycmVkTGF5b3V0Q29tbWFuZCBsYXlvdXRDbWQgPSBuZXcgRGVmZXJyZWRMYXlvdXRDb21tYW5kKGhvc3QoKQotCQkvLwkJCQkJLmdldEVkaXRpbmdEb21haW4oKSwgY3JlYXRlZFZpZXdzLCBob3N0KCkpOwotCQkvLwkJCWV4ZWN1dGVDb21tYW5kKG5ldyBJQ29tbWFuZFByb3h5KGxheW91dENtZCkpOwotCQkvLwkJfQotCi0JCWNyZWF0ZWRWaWV3cy5hZGRBbGwoY3JlYXRlZENvbm5lY3Rpb25WaWV3cyk7Ci0JCW1ha2VWaWV3c0ltbXV0YWJsZShjcmVhdGVkVmlld3MpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIENvbGxlY3Rpb24gbXlMaW5rRGVzY3JpcHRvcnMgPSBuZXcgTGlua2VkTGlzdCgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgTWFwIG15RU9iamVjdDJWaWV3TWFwID0gbmV3IEhhc2hNYXAoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIENvbGxlY3Rpb24gcmVmcmVzaENvbm5lY3Rpb25zKCkgewotCQl0cnkgewotCQkJY29sbGVjdEFsbExpbmtzKGdldERpYWdyYW0oKSk7Ci0JCQlDb2xsZWN0aW9uIGV4aXN0aW5nTGlua3MgPSBuZXcgTGlua2VkTGlzdChnZXREaWFncmFtKCkuZ2V0RWRnZXMoKSk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGRpYWdyYW1MaW5rcyA9IGV4aXN0aW5nTGlua3MuaXRlcmF0b3IoKTsgZGlhZ3JhbUxpbmtzCi0JCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJRWRnZSBuZXh0RGlhZ3JhbUxpbmsgPSAoRWRnZSkgZGlhZ3JhbUxpbmtzLm5leHQoKTsKLQkJCQlFT2JqZWN0IGRpYWdyYW1MaW5rT2JqZWN0ID0gbmV4dERpYWdyYW1MaW5rLmdldEVsZW1lbnQoKTsKLQkJCQlFT2JqZWN0IGRpYWdyYW1MaW5rU3JjID0gbmV4dERpYWdyYW1MaW5rLmdldFNvdXJjZSgpCi0JCQkJCQkuZ2V0RWxlbWVudCgpOwotCQkJCUVPYmplY3QgZGlhZ3JhbUxpbmtEc3QgPSBuZXh0RGlhZ3JhbUxpbmsuZ2V0VGFyZ2V0KCkKLQkJCQkJCS5nZXRFbGVtZW50KCk7Ci0JCQkJaW50IGRpYWdyYW1MaW5rVmlzdWFsSUQgPSBEaWFncmFtVmlzdWFsSURSZWdpc3RyeQotCQkJCQkJLmdldFZpc3VhbElEKG5leHREaWFncmFtTGluayk7Ci0JCQkJZm9yIChJdGVyYXRvciBtb2RlbExpbmtEZXNjcmlwdG9ycyA9IG15TGlua0Rlc2NyaXB0b3JzCi0JCQkJCQkuaXRlcmF0b3IoKTsgbW9kZWxMaW5rRGVzY3JpcHRvcnMuaGFzTmV4dCgpOykgewotCQkJCQlMaW5rRGVzY3JpcHRvciBuZXh0TGlua0Rlc2NyaXB0b3IgPSAoTGlua0Rlc2NyaXB0b3IpIG1vZGVsTGlua0Rlc2NyaXB0b3JzCi0JCQkJCQkJLm5leHQoKTsKLQkJCQkJaWYgKGRpYWdyYW1MaW5rT2JqZWN0ID09IG5leHRMaW5rRGVzY3JpcHRvcgotCQkJCQkJCS5nZXRMaW5rRWxlbWVudCgpCi0JCQkJCQkJJiYgZGlhZ3JhbUxpbmtTcmMgPT0gbmV4dExpbmtEZXNjcmlwdG9yLmdldFNvdXJjZSgpCi0JCQkJCQkJJiYgZGlhZ3JhbUxpbmtEc3QgPT0gbmV4dExpbmtEZXNjcmlwdG9yCi0JCQkJCQkJCQkuZ2V0RGVzdGluYXRpb24oKQotCQkJCQkJCSYmIGRpYWdyYW1MaW5rVmlzdWFsSUQgPT0gbmV4dExpbmtEZXNjcmlwdG9yCi0JCQkJCQkJCQkuZ2V0VmlzdWFsSUQoKSkgewotCQkJCQkJZGlhZ3JhbUxpbmtzLnJlbW92ZSgpOwotCQkJCQkJbW9kZWxMaW5rRGVzY3JpcHRvcnMucmVtb3ZlKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlkZWxldGVWaWV3cyhleGlzdGluZ0xpbmtzLml0ZXJhdG9yKCkpOwotCQkJcmV0dXJuIGNyZWF0ZUNvbm5lY3Rpb25zKG15TGlua0Rlc2NyaXB0b3JzKTsKLQkJfSBmaW5hbGx5IHsKLQkJCW15TGlua0Rlc2NyaXB0b3JzLmNsZWFyKCk7Ci0JCQlteUVPYmplY3QyVmlld01hcC5jbGVhcigpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgdm9pZCBjb2xsZWN0QWxsTGlua3MoVmlldyB2aWV3KSB7Ci0JCUVPYmplY3QgbW9kZWxFbGVtZW50ID0gdmlldy5nZXRFbGVtZW50KCk7Ci0JCWludCBkaWFncmFtRWxlbWVudFZpc3VhbElEID0gRGlhZ3JhbVZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQodmlldyk7Ci0JCXN3aXRjaCAoZGlhZ3JhbUVsZW1lbnRWaXN1YWxJRCkgewotCQljYXNlIFJvbGVUYXNrQ29tcG9zaXRlRWRpdFBhcnQuVklTVUFMX0lEOgotCQljYXNlIFdvcmtQcm9kdWN0Q29tcG9zaXRlRWRpdFBhcnQuVklTVUFMX0lEOgotCQljYXNlIFJvbGVOb2RlRWRpdFBhcnQuVklTVUFMX0lEOgotCQljYXNlIFRhc2tOb2RlRWRpdFBhcnQuVklTVUFMX0lEOgotCQljYXNlIFdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCWNhc2UgQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdFBhcnQuVklTVUFMX0lEOiB7Ci0JCQlteUVPYmplY3QyVmlld01hcC5wdXQobW9kZWxFbGVtZW50LCB2aWV3KTsKLQkJCXN0b3JlTGlua3MobW9kZWxFbGVtZW50LCBnZXREaWFncmFtKCkpOwotCQl9Ci0JCWRlZmF1bHQ6IHsKLQkJfQotCQkJZm9yIChJdGVyYXRvciBjaGlsZHJlbiA9IHZpZXcuZ2V0Q2hpbGRyZW4oKS5pdGVyYXRvcigpOyBjaGlsZHJlbgotCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCVZpZXcgY2hpbGRWaWV3ID0gKFZpZXcpIGNoaWxkcmVuLm5leHQoKTsKLQkJCQljb2xsZWN0QWxsTGlua3MoY2hpbGRWaWV3KTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIENvbGxlY3Rpb24gY3JlYXRlQ29ubmVjdGlvbnMoQ29sbGVjdGlvbiBsaW5rRGVzY3JpcHRvcnMpIHsKLQkJaWYgKGxpbmtEZXNjcmlwdG9ycy5pc0VtcHR5KCkpIHsKLQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCQl9Ci0JCUxpc3QgYWRhcHRlcnMgPSBuZXcgTGlua2VkTGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGxpbmtEZXNjcmlwdG9yc0l0ZXJhdG9yID0gbGlua0Rlc2NyaXB0b3JzLml0ZXJhdG9yKCk7IGxpbmtEZXNjcmlwdG9yc0l0ZXJhdG9yCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCWZpbmFsIExpbmtEZXNjcmlwdG9yIG5leHRMaW5rRGVzY3JpcHRvciA9IChMaW5rRGVzY3JpcHRvcikgbGlua0Rlc2NyaXB0b3JzSXRlcmF0b3IKLQkJCQkJLm5leHQoKTsKLQkJCUVkaXRQYXJ0IHNvdXJjZUVkaXRQYXJ0ID0gZ2V0RWRpdFBhcnRGb3IobmV4dExpbmtEZXNjcmlwdG9yCi0JCQkJCS5nZXRTb3VyY2UoKSk7Ci0JCQlFZGl0UGFydCB0YXJnZXRFZGl0UGFydCA9IGdldEVkaXRQYXJ0Rm9yKG5leHRMaW5rRGVzY3JpcHRvcgotCQkJCQkuZ2V0RGVzdGluYXRpb24oKSk7Ci0JCQlpZiAoc291cmNlRWRpdFBhcnQgPT0gbnVsbCB8fCB0YXJnZXRFZGl0UGFydCA9PSBudWxsKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlDcmVhdGVDb25uZWN0aW9uVmlld1JlcXVlc3QuQ29ubmVjdGlvblZpZXdEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBuZXcgQ3JlYXRlQ29ubmVjdGlvblZpZXdSZXF1ZXN0LkNvbm5lY3Rpb25WaWV3RGVzY3JpcHRvcigKLQkJCQkJbmV4dExpbmtEZXNjcmlwdG9yLmdldFNlbWFudGljQWRhcHRlcigpLCBudWxsLAotCQkJCQlWaWV3VXRpbC5BUFBFTkQsIGZhbHNlLCAoKElHcmFwaGljYWxFZGl0UGFydCkgZ2V0SG9zdCgpKQotCQkJCQkJCS5nZXREaWFncmFtUHJlZmVyZW5jZXNIaW50KCkpOwotCQkJQ3JlYXRlQ29ubmVjdGlvblZpZXdSZXF1ZXN0IGNjciA9IG5ldyBDcmVhdGVDb25uZWN0aW9uVmlld1JlcXVlc3QoCi0JCQkJCWRlc2NyaXB0b3IpOwotCQkJY2NyLnNldFR5cGUoUmVxdWVzdENvbnN0YW50cy5SRVFfQ09OTkVDVElPTl9TVEFSVCk7Ci0JCQljY3Iuc2V0U291cmNlRWRpdFBhcnQoc291cmNlRWRpdFBhcnQpOwotCQkJc291cmNlRWRpdFBhcnQuZ2V0Q29tbWFuZChjY3IpOwotCQkJY2NyLnNldFRhcmdldEVkaXRQYXJ0KHRhcmdldEVkaXRQYXJ0KTsKLQkJCWNjci5zZXRUeXBlKFJlcXVlc3RDb25zdGFudHMuUkVRX0NPTk5FQ1RJT05fRU5EKTsKLQkJCUNvbW1hbmQgY21kID0gdGFyZ2V0RWRpdFBhcnQuZ2V0Q29tbWFuZChjY3IpOwotCQkJaWYgKGNtZCAhPSBudWxsICYmIGNtZC5jYW5FeGVjdXRlKCkpIHsKLQkJCQlleGVjdXRlQ29tbWFuZChjbWQpOwotCQkJCUlBZGFwdGFibGUgdmlld0FkYXB0ZXIgPSAoSUFkYXB0YWJsZSkgY2NyLmdldE5ld09iamVjdCgpOwotCQkJCWlmICh2aWV3QWRhcHRlciAhPSBudWxsKSB7Ci0JCQkJCWFkYXB0ZXJzLmFkZCh2aWV3QWRhcHRlcik7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBhZGFwdGVyczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFZGl0UGFydCBnZXRFZGl0UGFydEZvcihFT2JqZWN0IG1vZGVsRWxlbWVudCkgewotCQlWaWV3IHZpZXcgPSAoVmlldykgbXlFT2JqZWN0MlZpZXdNYXAuZ2V0KG1vZGVsRWxlbWVudCk7Ci0JCWlmICh2aWV3ICE9IG51bGwpIHsKLQkJCXJldHVybiAoRWRpdFBhcnQpIGdldEhvc3QoKS5nZXRWaWV3ZXIoKS5nZXRFZGl0UGFydFJlZ2lzdHJ5KCkuZ2V0KAotCQkJCQl2aWV3KTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKkBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHZvaWQgc3RvcmVMaW5rcyhFT2JqZWN0IGNvbnRhaW5lciwgRGlhZ3JhbSBkaWFncmFtKSB7Ci0JCUVDbGFzcyBjb250YWluZXJNZXRhY2xhc3MgPSBjb250YWluZXIuZUNsYXNzKCk7Ci0JCXN0b3JlRmVhdHVyZU1vZGVsRmFjZXRMaW5rcyhjb250YWluZXIsIGNvbnRhaW5lck1ldGFjbGFzcywgZGlhZ3JhbSk7Ci0JCXN0b3JlVHlwZU1vZGVsRmFjZXRMaW5rcyhjb250YWluZXIsIGNvbnRhaW5lck1ldGFjbGFzcyk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgdm9pZCBzdG9yZVR5cGVNb2RlbEZhY2V0TGlua3MoRU9iamVjdCBjb250YWluZXIsCi0JCQlFQ2xhc3MgY29udGFpbmVyTWV0YWNsYXNzKSB7Ci0JCXN0b3JlVHlwZU1vZGVsRmFjZXRMaW5rc19MaW5rXzMwMDEoY29udGFpbmVyLCBjb250YWluZXJNZXRhY2xhc3MpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHZvaWQgc3RvcmVUeXBlTW9kZWxGYWNldExpbmtzX0xpbmtfMzAwMShFT2JqZWN0IGNvbnRhaW5lciwKLQkJCUVDbGFzcyBjb250YWluZXJNZXRhY2xhc3MpIHsKLQkJaWYgKE1vZGVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Tm9kZSgpLmlzU3VwZXJUeXBlT2YoY29udGFpbmVyTWV0YWNsYXNzKSkgewotCQkJZm9yIChJdGVyYXRvciB2YWx1ZXMgPSAoKE5vZGUpIGNvbnRhaW5lcikuZ2V0T3V0Z29pbmdDb25uZWN0aW9ucygpCi0JCQkJCS5pdGVyYXRvcigpOyB2YWx1ZXMuaGFzTmV4dCgpOykgewotCQkJCUVPYmplY3QgbmV4dFZhbHVlID0gKChFT2JqZWN0KSB2YWx1ZXMubmV4dCgpKTsKLQkJCQlpbnQgbGlua1ZJRCA9IERpYWdyYW1WaXN1YWxJRFJlZ2lzdHJ5Ci0JCQkJCQkuZ2V0TGlua1dpdGhDbGFzc1Zpc3VhbElEKG5leHRWYWx1ZSk7Ci0JCQkJaWYgKExpbmtFZGl0UGFydC5WSVNVQUxfSUQgPT0gbGlua1ZJRCkgewotCQkJCQlPYmplY3Qgc3RydWN0dXJhbEZlYXR1cmVSZXN1bHQgPSAoKExpbmspIG5leHRWYWx1ZSkKLQkJCQkJCQkuZ2V0VGFyZ2V0KCk7Ci0JCQkJCWlmIChzdHJ1Y3R1cmFsRmVhdHVyZVJlc3VsdCBpbnN0YW5jZW9mIEVPYmplY3QpIHsKLQkJCQkJCUVPYmplY3QgZHN0ID0gKEVPYmplY3QpIHN0cnVjdHVyYWxGZWF0dXJlUmVzdWx0OwotCQkJCQkJc3RydWN0dXJhbEZlYXR1cmVSZXN1bHQgPSAoKExpbmspIG5leHRWYWx1ZSkKLQkJCQkJCQkJLmdldFNvdXJjZSgpOwotCQkJCQkJaWYgKHN0cnVjdHVyYWxGZWF0dXJlUmVzdWx0IGluc3RhbmNlb2YgRU9iamVjdCkgewotCQkJCQkJCUVPYmplY3Qgc3JjID0gKEVPYmplY3QpIHN0cnVjdHVyYWxGZWF0dXJlUmVzdWx0OwotCQkJCQkJCW15TGlua0Rlc2NyaXB0b3JzLmFkZChuZXcgTGlua0Rlc2NyaXB0b3Ioc3JjLCBkc3QsCi0JCQkJCQkJCQluZXh0VmFsdWUsIERpYWdyYW1FbGVtZW50VHlwZXMuTGlua18zMDAxLAotCQkJCQkJCQkJbGlua1ZJRCkpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICpAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSB2b2lkIHN0b3JlRmVhdHVyZU1vZGVsRmFjZXRMaW5rcyhFT2JqZWN0IGNvbnRhaW5lciwKLQkJCUVDbGFzcyBjb250YWluZXJNZXRhY2xhc3MsIERpYWdyYW0gZGlhZ3JhbSkgewotCi0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRGlhZ3JhbSBnZXREaWFncmFtKCkgewotCQlyZXR1cm4gKChWaWV3KSBnZXRIb3N0KCkuZ2V0TW9kZWwoKSkuZ2V0RGlhZ3JhbSgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIGNsYXNzIExpbmtEZXNjcmlwdG9yIHsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSBFT2JqZWN0IG15U291cmNlOwotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIEVPYmplY3QgbXlEZXN0aW5hdGlvbjsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSBFT2JqZWN0IG15TGlua0VsZW1lbnQ7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgaW50IG15VmlzdWFsSUQ7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgSUFkYXB0YWJsZSBteVNlbWFudGljQWRhcHRlcjsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJvdGVjdGVkIExpbmtEZXNjcmlwdG9yKEVPYmplY3Qgc291cmNlLCBFT2JqZWN0IGRlc3RpbmF0aW9uLAotCQkJCUVPYmplY3QgbGlua0VsZW1lbnQsIElFbGVtZW50VHlwZSBlbGVtZW50VHlwZSwgaW50IGxpbmtWSUQpIHsKLQkJCXRoaXMoc291cmNlLCBkZXN0aW5hdGlvbiwgbGlua1ZJRCk7Ci0JCQlteUxpbmtFbGVtZW50ID0gbGlua0VsZW1lbnQ7Ci0JCQlmaW5hbCBJRWxlbWVudFR5cGUgZWxlbWVudFR5cGVDb3B5ID0gZWxlbWVudFR5cGU7Ci0JCQlteVNlbWFudGljQWRhcHRlciA9IG5ldyBFT2JqZWN0QWRhcHRlcihsaW5rRWxlbWVudCkgewotCQkJCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihDbGFzcyBhZGFwdGVyKSB7Ci0JCQkJCWlmIChJRWxlbWVudFR5cGUuY2xhc3MuZXF1YWxzKGFkYXB0ZXIpKSB7Ci0JCQkJCQlyZXR1cm4gZWxlbWVudFR5cGVDb3B5OwotCQkJCQl9Ci0JCQkJCXJldHVybiBzdXBlci5nZXRBZGFwdGVyKGFkYXB0ZXIpOwotCQkJCX0KLQkJCX07Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJvdGVjdGVkIExpbmtEZXNjcmlwdG9yKEVPYmplY3Qgc291cmNlLCBFT2JqZWN0IGRlc3RpbmF0aW9uLAotCQkJCUlFbGVtZW50VHlwZSBlbGVtZW50VHlwZSwgaW50IGxpbmtWSUQpIHsKLQkJCXRoaXMoc291cmNlLCBkZXN0aW5hdGlvbiwgbGlua1ZJRCk7Ci0JCQlteUxpbmtFbGVtZW50ID0gbnVsbDsKLQkJCWZpbmFsIElFbGVtZW50VHlwZSBlbGVtZW50VHlwZUNvcHkgPSBlbGVtZW50VHlwZTsKLQkJCW15U2VtYW50aWNBZGFwdGVyID0gbmV3IElBZGFwdGFibGUoKSB7Ci0JCQkJcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKENsYXNzIGFkYXB0ZXIpIHsKLQkJCQkJaWYgKElFbGVtZW50VHlwZS5jbGFzcy5lcXVhbHMoYWRhcHRlcikpIHsKLQkJCQkJCXJldHVybiBlbGVtZW50VHlwZUNvcHk7Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCQkJfTsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIExpbmtEZXNjcmlwdG9yKEVPYmplY3Qgc291cmNlLCBFT2JqZWN0IGRlc3RpbmF0aW9uLCBpbnQgbGlua1ZJRCkgewotCQkJbXlTb3VyY2UgPSBzb3VyY2U7Ci0JCQlteURlc3RpbmF0aW9uID0gZGVzdGluYXRpb247Ci0JCQlteVZpc3VhbElEID0gbGlua1ZJRDsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcm90ZWN0ZWQgRU9iamVjdCBnZXRTb3VyY2UoKSB7Ci0JCQlyZXR1cm4gbXlTb3VyY2U7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJvdGVjdGVkIEVPYmplY3QgZ2V0RGVzdGluYXRpb24oKSB7Ci0JCQlyZXR1cm4gbXlEZXN0aW5hdGlvbjsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcm90ZWN0ZWQgRU9iamVjdCBnZXRMaW5rRWxlbWVudCgpIHsKLQkJCXJldHVybiBteUxpbmtFbGVtZW50OwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByb3RlY3RlZCBpbnQgZ2V0VmlzdWFsSUQoKSB7Ci0JCQlyZXR1cm4gbXlWaXN1YWxJRDsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcm90ZWN0ZWQgSUFkYXB0YWJsZSBnZXRTZW1hbnRpY0FkYXB0ZXIoKSB7Ci0JCQlyZXR1cm4gbXlTZW1hbnRpY0FkYXB0ZXI7Ci0JCX0KLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L3BvbGljaWVzL0FjdGl2aXR5RGV0YWlsRGlhZ3JhbUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvcG9saWNpZXMvQWN0aXZpdHlEZXRhaWxEaWFncmFtSXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1N2Q0NTRkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvcG9saWNpZXMvQWN0aXZpdHlEZXRhaWxEaWFncmFtSXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucG9saWNpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb21tYW5kcy5jb3JlLmNvbW1hbmRzLkR1cGxpY2F0ZUVPYmplY3RzQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkR1cGxpY2F0ZUVsZW1lbnRzUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5jb21tYW5kcy5Sb2xlVGFza0NvbXBvc2l0ZUNyZWF0ZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQuY29tbWFuZHMuV29ya1Byb2R1Y3RDb21wb3NpdGVDcmVhdGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQucHJvdmlkZXJzLkRpYWdyYW1FbGVtZW50VHlwZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Nb2RlbFBhY2thZ2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLmNvbW1hbmRzLkNyZWF0ZUVsZW1lbnRDb21tYW5kOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5DcmVhdGVFbGVtZW50UmVxdWVzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZpdHlEZXRhaWxEaWFncmFtSXRlbVNlbWFudGljRWRpdFBvbGljeSBleHRlbmRzCi0JCURpYWdyYW1CYXNlSXRlbVNlbWFudGljRWRpdFBvbGljeSB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlQ29tbWFuZChDcmVhdGVFbGVtZW50UmVxdWVzdCByZXEpIHsKLQkJaWYgKERpYWdyYW1FbGVtZW50VHlwZXMuUm9sZVRhc2tDb21wb3NpdGVfMTAwMSA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgewotCQkJaWYgKHJlcS5nZXRDb250YWlubWVudEZlYXR1cmUoKSA9PSBudWxsKSB7Ci0JCQkJcmVxLnNldENvbnRhaW5tZW50RmVhdHVyZShNb2RlbFBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkuZ2V0Tm9kZUNvbnRhaW5lcl9Ob2RlcygpKTsKLQkJCX0KLQkJCXJldHVybiBnZXRNU0xXcmFwcGVyKG5ldyBSb2xlVGFza0NvbXBvc2l0ZUNyZWF0ZUNvbW1hbmQocmVxKSk7Ci0JCX0KLQkJaWYgKERpYWdyYW1FbGVtZW50VHlwZXMuV29ya1Byb2R1Y3RDb21wb3NpdGVfMTAwMiA9PSByZXEKLQkJCQkuZ2V0RWxlbWVudFR5cGUoKSkgewotCQkJaWYgKHJlcS5nZXRDb250YWlubWVudEZlYXR1cmUoKSA9PSBudWxsKSB7Ci0JCQkJcmVxLnNldENvbnRhaW5tZW50RmVhdHVyZShNb2RlbFBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkuZ2V0Tm9kZUNvbnRhaW5lcl9Ob2RlcygpKTsKLQkJCX0KLQkJCXJldHVybiBnZXRNU0xXcmFwcGVyKG5ldyBXb3JrUHJvZHVjdENvbXBvc2l0ZUNyZWF0ZUNvbW1hbmQocmVxKSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldENyZWF0ZUNvbW1hbmQocmVxKTsKLQl9Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXREdXBsaWNhdGVDb21tYW5kKER1cGxpY2F0ZUVsZW1lbnRzUmVxdWVzdCByZXEpIHsKLQkJcmV0dXJuIG51bGw7Ci0JCS8vCQlUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiBlZGl0aW5nRG9tYWluID0gKChJR3JhcGhpY2FsRWRpdFBhcnQpIGdldEhvc3QoKSkKLQkJLy8JCQkJLmdldEVkaXRpbmdEb21haW4oKTsKLQkJLy8JCXJldHVybiBnZXRNU0xXcmFwcGVyKG5ldyBEdXBsaWNhdGVBbnl0aGluZ0NvbW1hbmQoZWRpdGluZ0RvbWFpbiwgcmVxKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGNsYXNzIER1cGxpY2F0ZUFueXRoaW5nQ29tbWFuZCBleHRlbmRzCi0JCQlEdXBsaWNhdGVFT2JqZWN0c0NvbW1hbmQgewotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgRHVwbGljYXRlQW55dGhpbmdDb21tYW5kKAotCQkJCVRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIGVkaXRpbmdEb21haW4sCi0JCQkJRHVwbGljYXRlRWxlbWVudHNSZXF1ZXN0IHJlcSkgewotCQkJc3VwZXIoZWRpdGluZ0RvbWFpbiwgcmVxLmdldExhYmVsKCksIHJlcQotCQkJCQkuZ2V0RWxlbWVudHNUb0JlRHVwbGljYXRlZCgpLCByZXEKLQkJCQkJLmdldEFsbER1cGxpY2F0ZWRFbGVtZW50c01hcCgpKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvcG9saWNpZXMvRGlhZ3JhbUJhc2VJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L3BvbGljaWVzL0RpYWdyYW1CYXNlSXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZjU4ZDY3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvcG9saWNpZXMvRGlhZ3JhbUJhc2VJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNjcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucG9saWNpZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21wb3VuZENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLlVuZXhlY3V0YWJsZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLlJlY29ubmVjdFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUuY29tbWFuZC5JQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuY29tbWFuZHMuRGVsZXRlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUudXRpbC5WaWV3VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmNvbW1hbmRzLkNvbW1hbmRQcm94eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmNvbW1hbmRzLklDb21tYW5kUHJveHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLlNlbWFudGljRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlcXVlc3RzLkVkaXRDb21tYW5kUmVxdWVzdFdyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvbW1hbmRzLmNvcmUuY29tbWFuZC5Db21wb3NpdGVUcmFuc2FjdGlvbmFsQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLkVsZW1lbnRUeXBlUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5JRWRpdEhlbHBlckNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5JRWxlbWVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5Db25maWd1cmVSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ3JlYXRlRWxlbWVudFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5DcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuRGVzdHJveUVsZW1lbnRSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuRGVzdHJveVJlZmVyZW5jZVJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5EZXN0cm95UmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkR1cGxpY2F0ZUVsZW1lbnRzUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkdldEVkaXRDb250ZXh0UmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLklFZGl0Q29tbWFuZFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5Nb3ZlUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLlJlb3JpZW50UmVmZXJlbmNlUmVsYXRpb25zaGlwUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLlJlb3JpZW50UmVsYXRpb25zaGlwUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLlNldFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRWRnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LmhlbHBlcnMuRGlhZ3JhbUJhc2VFZGl0SGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5wYXJ0LkRpYWdyYW1WaXN1YWxJRFJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERpYWdyYW1CYXNlSXRlbVNlbWFudGljRWRpdFBvbGljeSBleHRlbmRzIFNlbWFudGljRWRpdFBvbGljeSB7Ci0KLQkvKioKLQkgKiBFeHRlbmRlZCByZXF1ZXN0IGRhdGEga2V5IHRvIGhvbGQgZWRpdHBhcnQgdmlzdWFsIGlkLgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWSVNVQUxfSURfS0VZID0gInZpc3VhbF9pZCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEFkZCB2aXN1YWwgaWQgb2YgZWRpdGVkIGVkaXRwYXJ0IHRvIGV4dGVuZGVkIGRhdGEgb2YgdGhlIHJlcXVlc3QKLQkgKiBzbyBjb21tYW5kIHN3aXRjaCBjYW4gZGVjaWRlIHdoYXQga2luZCBvZiBkaWFncmFtIGVsZW1lbnQgaXMgYmVpbmcgZWRpdGVkLgotCSAqIEl0IGlzIGRvbmUgaW4gdGhvc2UgY2FzZXMgd2hlbiBpdCdzIG5vdCBwb3NzaWJsZSB0byBkZWR1Y2UgZGlhZ3JhbQotCSAqIGVsZW1lbnQga2luZCBmcm9tIGRvbWFpbiBlbGVtZW50LgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ29tbWFuZCBnZXRDb21tYW5kKFJlcXVlc3QgcmVxdWVzdCkgewotCQlpZiAocmVxdWVzdCBpbnN0YW5jZW9mIFJlY29ubmVjdFJlcXVlc3QpIHsKLQkJCU9iamVjdCB2aWV3ID0gKChSZWNvbm5lY3RSZXF1ZXN0KSByZXF1ZXN0KS5nZXRDb25uZWN0aW9uRWRpdFBhcnQoKQotCQkJCQkuZ2V0TW9kZWwoKTsKLQkJCWlmICh2aWV3IGluc3RhbmNlb2YgVmlldykgewotCQkJCUludGVnZXIgaWQgPSBuZXcgSW50ZWdlcihEaWFncmFtVmlzdWFsSURSZWdpc3RyeQotCQkJCQkJLmdldFZpc3VhbElEKChWaWV3KSB2aWV3KSk7Ci0JCQkJcmVxdWVzdC5nZXRFeHRlbmRlZERhdGEoKS5wdXQoVklTVUFMX0lEX0tFWSwgaWQpOwotCQkJfQotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRDb21tYW5kKHJlcXVlc3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdmlzdWFsIGlkIGZyb20gcmVxdWVzdCBwYXJhbWV0ZXJzLgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgaW50IGdldFZpc3VhbElEKElFZGl0Q29tbWFuZFJlcXVlc3QgcmVxdWVzdCkgewotCQlPYmplY3QgaWQgPSByZXF1ZXN0LmdldFBhcmFtZXRlcihWSVNVQUxfSURfS0VZKTsKLQkJcmV0dXJuIGlkIGluc3RhbmNlb2YgSW50ZWdlciA/ICgoSW50ZWdlcikgaWQpLmludFZhbHVlKCkgOiAtMTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0U2VtYW50aWNDb21tYW5kKElFZGl0Q29tbWFuZFJlcXVlc3QgcmVxdWVzdCkgewotCQlJRWRpdENvbW1hbmRSZXF1ZXN0IGNvbXBsZXRlZFJlcXVlc3QgPSBjb21wbGV0ZVJlcXVlc3QocmVxdWVzdCk7Ci0JCU9iamVjdCBlZGl0SGVscGVyQ29udGV4dCA9IGNvbXBsZXRlZFJlcXVlc3QuZ2V0RWRpdEhlbHBlckNvbnRleHQoKTsKLQkJaWYgKGVkaXRIZWxwZXJDb250ZXh0IGluc3RhbmNlb2YgVmlldwotCQkJCXx8IChlZGl0SGVscGVyQ29udGV4dCBpbnN0YW5jZW9mIElFZGl0SGVscGVyQ29udGV4dCAmJiAoKElFZGl0SGVscGVyQ29udGV4dCkgZWRpdEhlbHBlckNvbnRleHQpCi0JCQkJCQkuZ2V0RU9iamVjdCgpIGluc3RhbmNlb2YgVmlldykpIHsKLQkJCS8vIG5vIHNlbWFudGljIGNvbW1hbmRzIGFyZSBwcm92aWRlZCBmb3IgcHVyZSBkZXNpZ24gZWxlbWVudHMKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCWlmIChlZGl0SGVscGVyQ29udGV4dCA9PSBudWxsKSB7Ci0JCQllZGl0SGVscGVyQ29udGV4dCA9IFZpZXdVdGlsCi0JCQkJCS5yZXNvbHZlU2VtYW50aWNFbGVtZW50KChWaWV3KSBnZXRIb3N0KCkuZ2V0TW9kZWwoKSk7Ci0JCX0KLQkJSUVsZW1lbnRUeXBlIGVsZW1lbnRUeXBlID0gRWxlbWVudFR5cGVSZWdpc3RyeS5nZXRJbnN0YW5jZSgpCi0JCQkJLmdldEVsZW1lbnRUeXBlKGVkaXRIZWxwZXJDb250ZXh0KTsKLQkJaWYgKGVsZW1lbnRUeXBlID09IEVsZW1lbnRUeXBlUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXRUeXBlKAotCQkJCSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLmRlZmF1bHQiKSkgeyAvLyROT04tTkxTLTEkIAotCQkJZWxlbWVudFR5cGUgPSBudWxsOwotCQl9Ci0JCUNvbW1hbmQgZXBDb21tYW5kID0gZ2V0U2VtYW50aWNDb21tYW5kU3dpdGNoKGNvbXBsZXRlZFJlcXVlc3QpOwotCQlpZiAoZXBDb21tYW5kICE9IG51bGwpIHsKLQkJCUlDb21tYW5kIGNvbW1hbmQgPSBlcENvbW1hbmQgaW5zdGFuY2VvZiBJQ29tbWFuZFByb3h5ID8gKChJQ29tbWFuZFByb3h5KSBlcENvbW1hbmQpCi0JCQkJCS5nZXRJQ29tbWFuZCgpCi0JCQkJCTogbmV3IENvbW1hbmRQcm94eShlcENvbW1hbmQpOwotCQkJY29tcGxldGVkUmVxdWVzdC5zZXRQYXJhbWV0ZXIoCi0JCQkJCURpYWdyYW1CYXNlRWRpdEhlbHBlci5FRElUX1BPTElDWV9DT01NQU5ELCBjb21tYW5kKTsKLQkJfQotCQlDb21tYW5kIGVoQ29tbWFuZCA9IG51bGw7Ci0JCWlmIChlbGVtZW50VHlwZSAhPSBudWxsKSB7Ci0JCQlJQ29tbWFuZCBjb21tYW5kID0gZWxlbWVudFR5cGUuZ2V0RWRpdENvbW1hbmQoY29tcGxldGVkUmVxdWVzdCk7Ci0JCQlpZiAoY29tbWFuZCAhPSBudWxsKSB7Ci0JCQkJaWYgKCEoY29tbWFuZCBpbnN0YW5jZW9mIENvbXBvc2l0ZVRyYW5zYWN0aW9uYWxDb21tYW5kKSkgewotCQkJCQlUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiBlZGl0aW5nRG9tYWluID0gKChJR3JhcGhpY2FsRWRpdFBhcnQpIGdldEhvc3QoKSkKLQkJCQkJCQkuZ2V0RWRpdGluZ0RvbWFpbigpOwotCQkJCQljb21tYW5kID0gbmV3IENvbXBvc2l0ZVRyYW5zYWN0aW9uYWxDb21tYW5kKGVkaXRpbmdEb21haW4sCi0JCQkJCQkJbnVsbCkuY29tcG9zZShjb21tYW5kKTsKLQkJCQl9Ci0JCQkJZWhDb21tYW5kID0gbmV3IElDb21tYW5kUHJveHkoY29tbWFuZCk7Ci0JCQl9Ci0JCX0KLQkJYm9vbGVhbiBzaG91bGRQcm9jZWVkID0gdHJ1ZTsKLQkJaWYgKGNvbXBsZXRlZFJlcXVlc3QgaW5zdGFuY2VvZiBEZXN0cm95UmVxdWVzdCkgewotCQkJc2hvdWxkUHJvY2VlZCA9IHNob3VsZFByb2NlZWQoKERlc3Ryb3lSZXF1ZXN0KSBjb21wbGV0ZWRSZXF1ZXN0KTsKLQkJfQotCQlpZiAoc2hvdWxkUHJvY2VlZCkgewotCQkJaWYgKGNvbXBsZXRlZFJlcXVlc3QgaW5zdGFuY2VvZiBEZXN0cm95UmVxdWVzdCkgewotCQkJCVRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIGVkaXRpbmdEb21haW4gPSAoKElHcmFwaGljYWxFZGl0UGFydCkgZ2V0SG9zdCgpKQotCQkJCQkJLmdldEVkaXRpbmdEb21haW4oKTsKLQkJCQlDb21tYW5kIGRlbGV0ZVZpZXdDb21tYW5kID0gbmV3IElDb21tYW5kUHJveHkoCi0JCQkJCQluZXcgRGVsZXRlQ29tbWFuZChlZGl0aW5nRG9tYWluLCAoVmlldykgZ2V0SG9zdCgpCi0JCQkJCQkJCS5nZXRNb2RlbCgpKSk7Ci0JCQkJZWhDb21tYW5kID0gZWhDb21tYW5kID09IG51bGwgPyBkZWxldGVWaWV3Q29tbWFuZCA6IGVoQ29tbWFuZAotCQkJCQkJLmNoYWluKGRlbGV0ZVZpZXdDb21tYW5kKTsKLQkJCX0KLQkJCXJldHVybiBlaENvbW1hbmQ7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldFNlbWFudGljQ29tbWFuZFN3aXRjaChJRWRpdENvbW1hbmRSZXF1ZXN0IHJlcSkgewotCQlpZiAocmVxIGluc3RhbmNlb2YgQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdCkgewotCQkJcmV0dXJuIGdldENyZWF0ZVJlbGF0aW9uc2hpcENvbW1hbmQoKENyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3QpIHJlcSk7Ci0JCX0gZWxzZSBpZiAocmVxIGluc3RhbmNlb2YgQ3JlYXRlRWxlbWVudFJlcXVlc3QpIHsKLQkJCXJldHVybiBnZXRDcmVhdGVDb21tYW5kKChDcmVhdGVFbGVtZW50UmVxdWVzdCkgcmVxKTsKLQkJfSBlbHNlIGlmIChyZXEgaW5zdGFuY2VvZiBDb25maWd1cmVSZXF1ZXN0KSB7Ci0JCQlyZXR1cm4gZ2V0Q29uZmlndXJlQ29tbWFuZCgoQ29uZmlndXJlUmVxdWVzdCkgcmVxKTsKLQkJfSBlbHNlIGlmIChyZXEgaW5zdGFuY2VvZiBEZXN0cm95RWxlbWVudFJlcXVlc3QpIHsKLQkJCXJldHVybiBnZXREZXN0cm95RWxlbWVudENvbW1hbmQoKERlc3Ryb3lFbGVtZW50UmVxdWVzdCkgcmVxKTsKLQkJfSBlbHNlIGlmIChyZXEgaW5zdGFuY2VvZiBEZXN0cm95UmVmZXJlbmNlUmVxdWVzdCkgewotCQkJcmV0dXJuIGdldERlc3Ryb3lSZWZlcmVuY2VDb21tYW5kKChEZXN0cm95UmVmZXJlbmNlUmVxdWVzdCkgcmVxKTsKLQkJfSBlbHNlIGlmIChyZXEgaW5zdGFuY2VvZiBEdXBsaWNhdGVFbGVtZW50c1JlcXVlc3QpIHsKLQkJCXJldHVybiBnZXREdXBsaWNhdGVDb21tYW5kKChEdXBsaWNhdGVFbGVtZW50c1JlcXVlc3QpIHJlcSk7Ci0JCX0gZWxzZSBpZiAocmVxIGluc3RhbmNlb2YgR2V0RWRpdENvbnRleHRSZXF1ZXN0KSB7Ci0JCQlyZXR1cm4gZ2V0RWRpdENvbnRleHRDb21tYW5kKChHZXRFZGl0Q29udGV4dFJlcXVlc3QpIHJlcSk7Ci0JCX0gZWxzZSBpZiAocmVxIGluc3RhbmNlb2YgTW92ZVJlcXVlc3QpIHsKLQkJCXJldHVybiBnZXRNb3ZlQ29tbWFuZCgoTW92ZVJlcXVlc3QpIHJlcSk7Ci0JCX0gZWxzZSBpZiAocmVxIGluc3RhbmNlb2YgUmVvcmllbnRSZWZlcmVuY2VSZWxhdGlvbnNoaXBSZXF1ZXN0KSB7Ci0JCQlyZXR1cm4gZ2V0UmVvcmllbnRSZWZlcmVuY2VSZWxhdGlvbnNoaXBDb21tYW5kKChSZW9yaWVudFJlZmVyZW5jZVJlbGF0aW9uc2hpcFJlcXVlc3QpIHJlcSk7Ci0JCX0gZWxzZSBpZiAocmVxIGluc3RhbmNlb2YgUmVvcmllbnRSZWxhdGlvbnNoaXBSZXF1ZXN0KSB7Ci0JCQlyZXR1cm4gZ2V0UmVvcmllbnRSZWxhdGlvbnNoaXBDb21tYW5kKChSZW9yaWVudFJlbGF0aW9uc2hpcFJlcXVlc3QpIHJlcSk7Ci0JCX0gZWxzZSBpZiAocmVxIGluc3RhbmNlb2YgU2V0UmVxdWVzdCkgewotCQkJcmV0dXJuIGdldFNldENvbW1hbmQoKFNldFJlcXVlc3QpIHJlcSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldENvbmZpZ3VyZUNvbW1hbmQoQ29uZmlndXJlUmVxdWVzdCByZXEpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZVJlbGF0aW9uc2hpcENvbW1hbmQoQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdCByZXEpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZUNvbW1hbmQoQ3JlYXRlRWxlbWVudFJlcXVlc3QgcmVxKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRTZXRDb21tYW5kKFNldFJlcXVlc3QgcmVxKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRFZGl0Q29udGV4dENvbW1hbmQoR2V0RWRpdENvbnRleHRSZXF1ZXN0IHJlcSkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0RGVzdHJveUVsZW1lbnRDb21tYW5kKERlc3Ryb3lFbGVtZW50UmVxdWVzdCByZXEpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldERlc3Ryb3lSZWZlcmVuY2VDb21tYW5kKERlc3Ryb3lSZWZlcmVuY2VSZXF1ZXN0IHJlcSkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0RHVwbGljYXRlQ29tbWFuZChEdXBsaWNhdGVFbGVtZW50c1JlcXVlc3QgcmVxKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRNb3ZlQ29tbWFuZChNb3ZlUmVxdWVzdCByZXEpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldFJlb3JpZW50UmVmZXJlbmNlUmVsYXRpb25zaGlwQ29tbWFuZCgKLQkJCVJlb3JpZW50UmVmZXJlbmNlUmVsYXRpb25zaGlwUmVxdWVzdCByZXEpIHsKLQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldFJlb3JpZW50UmVsYXRpb25zaGlwQ29tbWFuZCgKLQkJCVJlb3JpZW50UmVsYXRpb25zaGlwUmVxdWVzdCByZXEpIHsKLQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldE1TTFdyYXBwZXIoSUNvbW1hbmQgY21kKSB7Ci0JCXJldHVybiBuZXcgSUNvbW1hbmRQcm94eShjbWQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRU9iamVjdCBnZXRTZW1hbnRpY0VsZW1lbnQoKSB7Ci0JCXJldHVybiBWaWV3VXRpbC5yZXNvbHZlU2VtYW50aWNFbGVtZW50KChWaWV3KSBnZXRIb3N0KCkuZ2V0TW9kZWwoKSk7Ci0JfQotCi0JLyoqCi0JICogRmluZHMgY29udGFpbmVyIGVsZW1lbnQgZm9yIHRoZSBuZXcgcmVsYXRpb25zaGlwIG9mIHRoZSBzcGVjaWZpZWQgdHlwZS4KLQkgKiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIGdvZXMgdXAgYnkgY29udGFpbm1lbnQgaGllcmFyY2h5IHN0YXJ0aW5nIGZyb20KLQkgKiB0aGUgc3BlY2lmaWVkIGVsZW1lbnQgYW5kIHJldHVybnMgdGhlIGZpcnN0IGVsZW1lbnQgdGhhdCBpcyBpbnN0YW5jZSBvZgotCSAqIHRoZSBzcGVjaWZpZWQgY29udGFpbmVyIGNsYXNzLgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRU9iamVjdCBnZXRSZWxhdGlvbnNoaXBDb250YWluZXIoT2JqZWN0IHVlbGVtZW50LAotCQkJRUNsYXNzIGNvbnRhaW5lckNsYXNzLCBJRWxlbWVudFR5cGUgcmVsYXRpb25zaGlwVHlwZSkgewotCQlpZiAodWVsZW1lbnQgaW5zdGFuY2VvZiBFT2JqZWN0KSB7Ci0JCQlFT2JqZWN0IGVsZW1lbnQgPSAoRU9iamVjdCkgdWVsZW1lbnQ7Ci0JCQlmb3IgKDsgZWxlbWVudCAhPSBudWxsOyBlbGVtZW50ID0gZWxlbWVudC5lQ29udGFpbmVyKCkpIHsKLQkJCQlpZiAoY29udGFpbmVyQ2xhc3MuaXNTdXBlclR5cGVPZihlbGVtZW50LmVDbGFzcygpKSkgewotCQkJCQlyZXR1cm4gZWxlbWVudDsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBlZGl0aW5nIGRvbWFpbiBmcm9tIHRoZSBob3N0IGVkaXQgcGFydC4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIGdldEVkaXRpbmdEb21haW4oKSB7Ci0JCXJldHVybiAoKElHcmFwaGljYWxFZGl0UGFydCkgZ2V0SG9zdCgpKS5nZXRFZGl0aW5nRG9tYWluKCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBjb21tYW5kIHRvIGRlc3Ryb3kgdGhlIGxpbmsuCi0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldERlc3Ryb3lFbGVtZW50Q29tbWFuZChWaWV3IHZpZXcsIGJvb2xlYW4gY29uZmlybSkgewotCQlFZGl0UGFydCBlZGl0UGFydCA9IChFZGl0UGFydCkgZ2V0SG9zdCgpLmdldFZpZXdlcigpCi0JCQkJLmdldEVkaXRQYXJ0UmVnaXN0cnkoKS5nZXQodmlldyk7Ci0JCURlc3Ryb3lFbGVtZW50UmVxdWVzdCByZXF1ZXN0ID0gbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdCgKLQkJCQlnZXRFZGl0aW5nRG9tYWluKCksIGNvbmZpcm0pOwotCQlyZXR1cm4gZWRpdFBhcnQuZ2V0Q29tbWFuZChuZXcgRWRpdENvbW1hbmRSZXF1ZXN0V3JhcHBlcihyZXF1ZXN0LAotCQkJCUNvbGxlY3Rpb25zLkVNUFRZX01BUCkpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgY29tbWFuZHMgdG8gZGVzdHJveSBhbGwgaG9zdCBpbmNvbWluZyBhbmQgb3V0Z29pbmcgbGlua3MuCi0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21wb3VuZENvbW1hbmQgZ2V0RGVzdHJveUVkZ2VzQ29tbWFuZChib29sZWFuIGNvbmZpcm0pIHsKLQkJQ29tcG91bmRDb21tYW5kIGNtZCA9IG5ldyBDb21wb3VuZENvbW1hbmQoKTsKLQkJVmlldyB2aWV3ID0gKFZpZXcpIGdldEhvc3QoKS5nZXRNb2RlbCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gdmlldy5nZXRTb3VyY2VFZGdlcygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCWNtZC5hZGQoZ2V0RGVzdHJveUVsZW1lbnRDb21tYW5kKChFZGdlKSBpdC5uZXh0KCksIGNvbmZpcm0pKTsKLQkJfQotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gdmlldy5nZXRUYXJnZXRFZGdlcygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCWNtZC5hZGQoZ2V0RGVzdHJveUVsZW1lbnRDb21tYW5kKChFZGdlKSBpdC5uZXh0KCksIGNvbmZpcm0pKTsKLQkJfQotCQlyZXR1cm4gY21kOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNsYXNzIExpbmtDb25zdHJhaW50cyB7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjYW5DcmVhdGVMaW5rXzMwMDEoTm9kZSBjb250YWluZXIsIE5vZGUgc291cmNlLAotCQkJCU5vZGUgdGFyZ2V0KSB7Ci0JCQlyZXR1cm4gY2FuRXhpc3RMaW5rXzMwMDEoY29udGFpbmVyLCBzb3VyY2UsIHRhcmdldCk7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBib29sZWFuIGNhbkV4aXN0TGlua18zMDAxKE5vZGUgY29udGFpbmVyLCBOb2RlIHNvdXJjZSwKLQkJCQlOb2RlIHRhcmdldCkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9wb2xpY2llcy9EaWFncmFtRXh0Tm9kZUxhYmVsSG9zdExheW91dEVkaXRQb2xpY3kuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvcG9saWNpZXMvRGlhZ3JhbUV4dE5vZGVMYWJlbEhvc3RMYXlvdXRFZGl0UG9saWN5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxNzgxMGMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9wb2xpY2llcy9EaWFncmFtRXh0Tm9kZUxhYmVsSG9zdExheW91dEVkaXRQb2xpY3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyOSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wb2xpY2llczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuTGF5b3V0RWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuQ2hhbmdlQm91bmRzUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuR3JvdXBSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS51dGlsLlZpZXdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLlhZTGF5b3V0RWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob3RhdGlvblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEaWFncmFtRXh0Tm9kZUxhYmVsSG9zdExheW91dEVkaXRQb2xpY3kgZXh0ZW5kcyBYWUxheW91dEVkaXRQb2xpY3kgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgTGF5b3V0RWRpdFBvbGljeSByZWFsTGF5b3V0RWRpdFBvbGljeTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGF5b3V0RWRpdFBvbGljeSBnZXRSZWFsTGF5b3V0RWRpdFBvbGljeSgpIHsKLQkJcmV0dXJuIHJlYWxMYXlvdXRFZGl0UG9saWN5OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZWFsTGF5b3V0RWRpdFBvbGljeShMYXlvdXRFZGl0UG9saWN5IHJlYWxMYXlvdXRFZGl0UG9saWN5KSB7Ci0JCXRoaXMucmVhbExheW91dEVkaXRQb2xpY3kgPSByZWFsTGF5b3V0RWRpdFBvbGljeTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNFeHRlcm5hbExhYmVsKEVkaXRQYXJ0IGVkaXRQYXJ0KSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIExpc3QgZ2V0RXh0ZXJuYWxMYWJlbHMoR3JvdXBSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJTGlzdCBlZGl0UGFydHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWlmIChyZXF1ZXN0LmdldEVkaXRQYXJ0cygpICE9IG51bGwpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSByZXF1ZXN0LmdldEVkaXRQYXJ0cygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlFZGl0UGFydCBlZGl0UGFydCA9IChFZGl0UGFydCkgaXQubmV4dCgpOwotCQkJCWlmIChpc0V4dGVybmFsTGFiZWwoZWRpdFBhcnQpKSB7Ci0JCQkJCWVkaXRQYXJ0cy5hZGQoZWRpdFBhcnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZWRpdFBhcnRzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ29tbWFuZCBnZXRDb21tYW5kKFJlcXVlc3QgcmVxdWVzdCkgewotCQlpZiAoUkVRX01PVkVfQ0hJTERSRU4uZXF1YWxzKHJlcXVlc3QuZ2V0VHlwZSgpKSkgewotCQkJQ2hhbmdlQm91bmRzUmVxdWVzdCBjYlJlcXVlc3QgPSAoQ2hhbmdlQm91bmRzUmVxdWVzdCkgcmVxdWVzdDsKLQkJCUxpc3QgZXh0TGFiZWxzID0gZ2V0RXh0ZXJuYWxMYWJlbHMoY2JSZXF1ZXN0KTsKLQkJCWlmICghZXh0TGFiZWxzLmlzRW1wdHkoKSkgewotCQkJCUxpc3QgZWRpdFBhcnRzID0gY2JSZXF1ZXN0LmdldEVkaXRQYXJ0cygpOwotCQkJCUNvbW1hbmQgY21kID0gbnVsbDsKLQkJCQlpZiAocmVhbExheW91dEVkaXRQb2xpY3kgIT0gbnVsbAotCQkJCQkJJiYgZWRpdFBhcnRzLnNpemUoKSA+IGV4dExhYmVscy5zaXplKCkpIHsKLQkJCQkJTGlzdCBvdGhlciA9IG5ldyBBcnJheUxpc3QoZWRpdFBhcnRzKTsKLQkJCQkJb3RoZXIucmVtb3ZlQWxsKGV4dExhYmVscyk7Ci0JCQkJCWNiUmVxdWVzdC5zZXRFZGl0UGFydHMob3RoZXIpOwotCQkJCQljbWQgPSByZWFsTGF5b3V0RWRpdFBvbGljeS5nZXRDb21tYW5kKHJlcXVlc3QpOwotCQkJCX0KLQkJCQljYlJlcXVlc3Quc2V0RWRpdFBhcnRzKGV4dExhYmVscyk7Ci0JCQkJQ29tbWFuZCBleHRMYWJlbHNDbWQgPSBnZXRNb3ZlQ2hpbGRyZW5Db21tYW5kKHJlcXVlc3QpOwotCQkJCWNiUmVxdWVzdC5zZXRFZGl0UGFydHMoZWRpdFBhcnRzKTsKLQkJCQlyZXR1cm4gY21kID09IG51bGwgPyBleHRMYWJlbHNDbWQgOiBjbWQuY2hhaW4oZXh0TGFiZWxzQ21kKTsKLQkJCX0KLQkJfQotCQlpZiAocmVxdWVzdCBpbnN0YW5jZW9mIEdyb3VwUmVxdWVzdCkgewotCQkJTGlzdCBleHRMYWJlbHMgPSBnZXRFeHRlcm5hbExhYmVscygoR3JvdXBSZXF1ZXN0KSByZXF1ZXN0KTsKLQkJCWlmICghZXh0TGFiZWxzLmlzRW1wdHkoKSkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9Ci0JCXJldHVybiByZWFsTGF5b3V0RWRpdFBvbGljeSA9PSBudWxsID8gbnVsbCA6IHJlYWxMYXlvdXRFZGl0UG9saWN5Ci0JCQkJLmdldENvbW1hbmQocmVxdWVzdCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZ2V0Q29uc3RyYWludEZvcihDaGFuZ2VCb3VuZHNSZXF1ZXN0IHJlcXVlc3QsCi0JCQlHcmFwaGljYWxFZGl0UGFydCBjaGlsZCkgewotCQlpbnQgZHggPSAoKEludGVnZXIpIFZpZXdVdGlsLmdldFN0cnVjdHVyYWxGZWF0dXJlVmFsdWUoKFZpZXcpIGNoaWxkCi0JCQkJLmdldE1vZGVsKCksIE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TG9jYXRpb25fWCgpKSkKLQkJCQkuaW50VmFsdWUoKTsKLQkJaW50IGR5ID0gKChJbnRlZ2VyKSBWaWV3VXRpbC5nZXRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlKChWaWV3KSBjaGlsZAotCQkJCS5nZXRNb2RlbCgpLCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldExvY2F0aW9uX1koKSkpCi0JCQkJLmludFZhbHVlKCk7Ci0JCVJlY3RhbmdsZSByID0gbmV3IFJlY3RhbmdsZShkeCwgZHksIDAsIDApOwotCQljaGlsZC5nZXRGaWd1cmUoKS50cmFuc2xhdGVUb0Fic29sdXRlKHIpOwotCQlyLnRyYW5zbGF0ZShyZXF1ZXN0LmdldE1vdmVEZWx0YSgpKTsKLQkJY2hpbGQuZ2V0RmlndXJlKCkudHJhbnNsYXRlVG9SZWxhdGl2ZShyKTsKLQkJcmV0dXJuIHI7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHVuZGVyc3RhbmRzUmVxdWVzdChSZXF1ZXN0IHJlcSkgewotCQlpZiAocmVhbExheW91dEVkaXRQb2xpY3kgIT0gbnVsbAotCQkJCSYmIHJlYWxMYXlvdXRFZGl0UG9saWN5LnVuZGVyc3RhbmRzUmVxdWVzdChyZXEpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gc3VwZXIudW5kZXJzdGFuZHNSZXF1ZXN0KHJlcSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRlY29yYXRlQ2hpbGQoRWRpdFBhcnQgY2hpbGQpIHsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SG9zdChFZGl0UGFydCBob3N0KSB7Ci0JCXN1cGVyLnNldEhvc3QoaG9zdCk7Ci0JCWlmIChyZWFsTGF5b3V0RWRpdFBvbGljeSAhPSBudWxsKSB7Ci0JCQlyZWFsTGF5b3V0RWRpdFBvbGljeS5zZXRIb3N0KGhvc3QpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGFjdGl2YXRlKCkgewotCQlzdXBlci5hY3RpdmF0ZSgpOwotCQlpZiAocmVhbExheW91dEVkaXRQb2xpY3kgIT0gbnVsbCkgewotCQkJcmVhbExheW91dEVkaXRQb2xpY3kuYWN0aXZhdGUoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBkZWFjdGl2YXRlKCkgewotCQlzdXBlci5kZWFjdGl2YXRlKCk7Ci0JCWlmIChyZWFsTGF5b3V0RWRpdFBvbGljeSAhPSBudWxsKSB7Ci0JCQlyZWFsTGF5b3V0RWRpdFBvbGljeS5kZWFjdGl2YXRlKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVkaXRQYXJ0IGdldFRhcmdldEVkaXRQYXJ0KFJlcXVlc3QgcmVxdWVzdCkgewotCQlpZiAocmVhbExheW91dEVkaXRQb2xpY3kgIT0gbnVsbCkgewotCQkJcmV0dXJuIHJlYWxMYXlvdXRFZGl0UG9saWN5LmdldFRhcmdldEVkaXRQYXJ0KHJlcXVlc3QpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIHN1cGVyLmdldFRhcmdldEVkaXRQYXJ0KHJlcXVlc3QpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNob3dTb3VyY2VGZWVkYmFjayhSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJaWYgKHJlYWxMYXlvdXRFZGl0UG9saWN5ICE9IG51bGwpIHsKLQkJCXJlYWxMYXlvdXRFZGl0UG9saWN5LnNob3dTb3VyY2VGZWVkYmFjayhyZXF1ZXN0KTsKLQkJfSBlbHNlIHsKLQkJCXN1cGVyLnNob3dTb3VyY2VGZWVkYmFjayhyZXF1ZXN0KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlcmFzZVNvdXJjZUZlZWRiYWNrKFJlcXVlc3QgcmVxdWVzdCkgewotCQlpZiAocmVhbExheW91dEVkaXRQb2xpY3kgIT0gbnVsbCkgewotCQkJcmVhbExheW91dEVkaXRQb2xpY3kuZXJhc2VTb3VyY2VGZWVkYmFjayhyZXF1ZXN0KTsKLQkJfSBlbHNlIHsKLQkJCXN1cGVyLmVyYXNlU291cmNlRmVlZGJhY2socmVxdWVzdCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2hvd1RhcmdldEZlZWRiYWNrKFJlcXVlc3QgcmVxdWVzdCkgewotCQlpZiAocmVhbExheW91dEVkaXRQb2xpY3kgIT0gbnVsbCkgewotCQkJcmVhbExheW91dEVkaXRQb2xpY3kuc2hvd1RhcmdldEZlZWRiYWNrKHJlcXVlc3QpOwotCQl9IGVsc2UgewotCQkJc3VwZXIuc2hvd1RhcmdldEZlZWRiYWNrKHJlcXVlc3QpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVyYXNlVGFyZ2V0RmVlZGJhY2soUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCWlmIChyZWFsTGF5b3V0RWRpdFBvbGljeSAhPSBudWxsKSB7Ci0JCQlyZWFsTGF5b3V0RWRpdFBvbGljeS5lcmFzZVRhcmdldEZlZWRiYWNrKHJlcXVlc3QpOwotCQl9IGVsc2UgewotCQkJc3VwZXIuZXJhc2VUYXJnZXRGZWVkYmFjayhyZXF1ZXN0KTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvcG9saWNpZXMvRGlhZ3JhbUdyYXBoaWNhbE5vZGVFZGl0UG9saWN5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L3BvbGljaWVzL0RpYWdyYW1HcmFwaGljYWxOb2RlRWRpdFBvbGljeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhY2U3YmY4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvcG9saWNpZXMvRGlhZ3JhbUdyYXBoaWNhbE5vZGVFZGl0UG9saWN5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wb2xpY2llczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5UcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuQ3JlYXRlQ29ubmVjdGlvblJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUuY29tbWFuZC5Db21wb3NpdGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5lZGl0aGVscGVycy5DcmVhdGVFbGVtZW50UmVxdWVzdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5JQ29tbWFuZFByb3h5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklHcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5HcmFwaGljYWxOb2RlRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlcXVlc3RzLkNyZWF0ZUNvbm5lY3Rpb25WaWV3QW5kRWxlbWVudFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5JRWxlbWVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQuY29tbWFuZHMuRGlhZ3JhbVJlb3JpZW50Q29ubmVjdGlvblZpZXdDb21tYW5kOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERpYWdyYW1HcmFwaGljYWxOb2RlRWRpdFBvbGljeSBleHRlbmRzIEdyYXBoaWNhbE5vZGVFZGl0UG9saWN5IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUVsZW1lbnRUeXBlIGdldEVsZW1lbnRUeXBlKENyZWF0ZUNvbm5lY3Rpb25SZXF1ZXN0IHJlcXVlc3QpIHsKLQkJaWYgKHJlcXVlc3QgaW5zdGFuY2VvZiBDcmVhdGVDb25uZWN0aW9uVmlld0FuZEVsZW1lbnRSZXF1ZXN0KSB7Ci0JCQlDcmVhdGVFbGVtZW50UmVxdWVzdEFkYXB0ZXIgcmVxdWVzdEFkYXB0ZXIgPSAoKENyZWF0ZUNvbm5lY3Rpb25WaWV3QW5kRWxlbWVudFJlcXVlc3QpIHJlcXVlc3QpCi0JCQkJCS5nZXRDb25uZWN0aW9uVmlld0FuZEVsZW1lbnREZXNjcmlwdG9yKCkKLQkJCQkJLmdldENyZWF0ZUVsZW1lbnRSZXF1ZXN0QWRhcHRlcigpOwotCQkJcmV0dXJuIChJRWxlbWVudFR5cGUpIHJlcXVlc3RBZGFwdGVyLmdldEFkYXB0ZXIoSUVsZW1lbnRUeXBlLmNsYXNzKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q29ubmVjdGlvbldpdGhSZW9yaWVudGVkVmlld0NvbXBsZXRlQ29tbWFuZCgKLQkJCUNyZWF0ZUNvbm5lY3Rpb25SZXF1ZXN0IHJlcXVlc3QpIHsKLQkJSUNvbW1hbmRQcm94eSBjID0gKElDb21tYW5kUHJveHkpIHN1cGVyCi0JCQkJLmdldENvbm5lY3Rpb25Db21wbGV0ZUNvbW1hbmQocmVxdWVzdCk7Ci0JCUNvbXBvc2l0ZUNvbW1hbmQgY2MgPSAoQ29tcG9zaXRlQ29tbWFuZCkgYy5nZXRJQ29tbWFuZCgpOwotCQlUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiBlZGl0aW5nRG9tYWluID0gKChJR3JhcGhpY2FsRWRpdFBhcnQpIGdldEhvc3QoKSkKLQkJCQkuZ2V0RWRpdGluZ0RvbWFpbigpOwotCQlEaWFncmFtUmVvcmllbnRDb25uZWN0aW9uVmlld0NvbW1hbmQgcmN2Q29tbWFuZCA9IG5ldyBEaWFncmFtUmVvcmllbnRDb25uZWN0aW9uVmlld0NvbW1hbmQoCi0JCQkJZWRpdGluZ0RvbWFpbiwgbnVsbCk7Ci0JCXJjdkNvbW1hbmQuc2V0RWRnZUFkYXB0b3IoZ2V0Vmlld0FkYXB0ZXIoKSk7Ci0JCWNjLmNvbXBvc2UocmN2Q29tbWFuZCk7Ci0JCXJldHVybiBjOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvcG9saWNpZXMvRGlhZ3JhbVJlZmVyZW5jZUNvbm5lY3Rpb25FZGl0UG9saWN5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L3BvbGljaWVzL0RpYWdyYW1SZWZlcmVuY2VDb25uZWN0aW9uRWRpdFBvbGljeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZDk2ZmU4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvcG9saWNpZXMvRGlhZ3JhbVJlZmVyZW5jZUNvbm5lY3Rpb25FZGl0UG9saWN5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucG9saWNpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21wb3VuZENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLlVuZXhlY3V0YWJsZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwYXJ0cy5BYnN0cmFjdENvbm5lY3Rpb25FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLkNvbm5lY3Rpb25FZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5yZXF1ZXN0cy5Hcm91cFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5JQ29tbWFuZFByb3h5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLkdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklHcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmwxMG4uRGlhZ3JhbVVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wcmVmZXJlbmNlcy5JUHJlZmVyZW5jZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlcXVlc3RzLkVkaXRDb21tYW5kUmVxdWVzdFdyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXF1ZXN0cy5Hcm91cFJlcXVlc3RWaWFLZXlib2FyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkRlc3Ryb3lFbGVtZW50UmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2dXaXRoVG9nZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLkFzc2VydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERpYWdyYW1SZWZlcmVuY2VDb25uZWN0aW9uRWRpdFBvbGljeSBleHRlbmRzIENvbm5lY3Rpb25FZGl0UG9saWN5IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVMRVRFX0ZST01fRElBR1JBTV9ETEdfVElUTEUgPSBEaWFncmFtVUlNZXNzYWdlcy5Qcm9tcHRpbmdEZWxldGVBY3Rpb25fRGVsZXRlRnJvbURpYWdyYW1EaWFsb2dfVGl0bGU7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFTEVURV9GUk9NX0RJQUdSQU1fRExHX01FU1NBR0UgPSBEaWFncmFtVUlNZXNzYWdlcy5Qcm9tcHRpbmdEZWxldGVBY3Rpb25fRGVsZXRlRnJvbURpYWdyYW1EaWFsb2dfTWVzc2FnZTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVMRVRFX0ZST01fTU9ERUxfRExHX1RPR0dMRV9MQUJFTCA9IERpYWdyYW1VSU1lc3NhZ2VzLk1lc3NhZ2VEaWFsb2dXaXRoVG9nZ2xlX0RvTm90UHJvbXB0QWdhaW5Ub2dnbGVfbGFiZWw7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIENvbW1hbmQgZ2V0RGVsZXRlQ29tbWFuZChHcm91cFJlcXVlc3QgZGVsZXRlUmVxdWVzdCkgewotCQlib29sZWFuIGlzRGVsZXRlRnJvbUtleUJvYXJkID0gZGVsZXRlUmVxdWVzdCBpbnN0YW5jZW9mIEdyb3VwUmVxdWVzdFZpYUtleWJvYXJkOwotCQlpZiAoc2hvdWxkRGVsZXRlU2VtYW50aWMoKSkgewotCQkJcmV0dXJuIGNyZWF0ZURlbGV0ZVNlbWFudGljQ29tbWFuZChkZWxldGVSZXF1ZXN0KTsKLQkJfSBlbHNlIHsKLQkJCWJvb2xlYW4gcHJvY2VlZFRvRGVsZXRlVmlldyA9IHRydWU7Ci0JCQlpZiAoaXNEZWxldGVGcm9tS2V5Qm9hcmQpIHsKLQkJCQlHcm91cFJlcXVlc3RWaWFLZXlib2FyZCBncm91cFJlcXVlc3RWaWFLZXlib2FyZCA9IChHcm91cFJlcXVlc3RWaWFLZXlib2FyZCkgZGVsZXRlUmVxdWVzdDsKLQkJCQlpZiAoZ3JvdXBSZXF1ZXN0VmlhS2V5Ym9hcmQuaXNTaG93SW5mb3JtYXRpb25EaWFsb2coKSkgewotCQkJCQlwcm9jZWVkVG9EZWxldGVWaWV3ID0gc2hvd1Byb21wdCgpOwotCQkJCQlncm91cFJlcXVlc3RWaWFLZXlib2FyZC5zZXRTaG93SW5mb3JtYXRpb25EaWFsb2coZmFsc2UpOwotCQkJCQlpZiAoIShwcm9jZWVkVG9EZWxldGVWaWV3KSkKLQkJCQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBjcmVhdGVEZWxldGVWaWV3Q29tbWFuZChkZWxldGVSZXF1ZXN0KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBzaG91bGREZWxldGVTZW1hbnRpYygpIHsKLQkJQXNzZXJ0LmlzVHJ1ZShnZXRIb3N0KCkgaW5zdGFuY2VvZiBBYnN0cmFjdENvbm5lY3Rpb25FZGl0UGFydCk7Ci0JCUFic3RyYWN0Q29ubmVjdGlvbkVkaXRQYXJ0IGNlcCA9IChBYnN0cmFjdENvbm5lY3Rpb25FZGl0UGFydCkgZ2V0SG9zdCgpOwotCQlib29sZWFuIGlzQ2Fub25pY2FsID0gZmFsc2U7Ci0JCWlmIChjZXAuZ2V0U291cmNlKCkgIT0gbnVsbCkKLQkJCWlzQ2Fub25pY2FsID0gSXNDYW5vbmljYWwoY2VwLmdldFNvdXJjZSgpKTsKLQkJaWYgKGNlcC5nZXRUYXJnZXQoKSAhPSBudWxsKQotCQkJcmV0dXJuIGlzQ2Fub25pY2FsID8gaXNDYW5vbmljYWwgOiBJc0Nhbm9uaWNhbChjZXAuZ2V0VGFyZ2V0KCkpOwotCQlyZXR1cm4gaXNDYW5vbmljYWw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBJc0Nhbm9uaWNhbChFZGl0UGFydCBlcCkgewotCQlFZGl0UGFydCBwYXJlbnQgPSBlcC5nZXRQYXJlbnQoKTsKLQkJcmV0dXJuIHBhcmVudCBpbnN0YW5jZW9mIEdyYXBoaWNhbEVkaXRQYXJ0ID8gKChHcmFwaGljYWxFZGl0UGFydCkgcGFyZW50KQotCQkJCS5pc0Nhbm9uaWNhbCgpCi0JCQkJOiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgY3JlYXRlRGVsZXRlVmlld0NvbW1hbmQoR3JvdXBSZXF1ZXN0IGRlbGV0ZVJlcXVlc3QpIHsKLQkJVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gZWRpdGluZ0RvbWFpbiA9ICgoSUdyYXBoaWNhbEVkaXRQYXJ0KSBnZXRIb3N0KCkpCi0JCQkJLmdldEVkaXRpbmdEb21haW4oKTsKLQkJcmV0dXJuIG5ldyBJQ29tbWFuZFByb3h5KG5ldyBEZWxldGVDb21tYW5kKGVkaXRpbmdEb21haW4sCi0JCQkJKFZpZXcpIGdldEhvc3QoKS5nZXRNb2RlbCgpKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGNyZWF0ZURlbGV0ZVNlbWFudGljQ29tbWFuZChHcm91cFJlcXVlc3QgZGVsZXRlUmVxdWVzdCkgewotCQlUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiBlZGl0aW5nRG9tYWluID0gKChJR3JhcGhpY2FsRWRpdFBhcnQpIGdldEhvc3QoKSkKLQkJCQkuZ2V0RWRpdGluZ0RvbWFpbigpOwotCQlFZGl0Q29tbWFuZFJlcXVlc3RXcmFwcGVyIHNlbVJlcSA9IG5ldyBFZGl0Q29tbWFuZFJlcXVlc3RXcmFwcGVyKAotCQkJCW5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoZWRpdGluZ0RvbWFpbiwgZmFsc2UpLCBkZWxldGVSZXF1ZXN0Ci0JCQkJCQkuZ2V0RXh0ZW5kZWREYXRhKCkpOwotCQlDb21tYW5kIHNlbWFudGljQ21kID0gZ2V0SG9zdCgpLmdldENvbW1hbmQoc2VtUmVxKTsKLQkJaWYgKHNlbWFudGljQ21kICE9IG51bGwgJiYgc2VtYW50aWNDbWQuY2FuRXhlY3V0ZSgpKSB7Ci0JCQlDb21wb3VuZENvbW1hbmQgY2MgPSBuZXcgQ29tcG91bmRDb21tYW5kKCk7Ci0JCQljYy5hZGQoc2VtYW50aWNDbWQpOwotCQkJcmV0dXJuIGNjOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gc2hvd1Byb21wdCgpIHsKLQkJYm9vbGVhbiBwcm9tcHQgPSAoKElQcmVmZXJlbmNlU3RvcmUpICgoSUdyYXBoaWNhbEVkaXRQYXJ0KSBnZXRIb3N0KCkpCi0JCQkJLmdldERpYWdyYW1QcmVmZXJlbmNlc0hpbnQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKSkKLQkJCQkuZ2V0Qm9vbGVhbihJUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX1BST01QVF9PTl9ERUxfRlJPTV9ESUFHUkFNKTsKLQkJaWYgKHByb21wdCkKLQkJCWlmIChzaG93TWVzc2FnZURpYWxvZygpKQotCQkJCXJldHVybiB0cnVlOwotCQkJZWxzZQotCQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBzaG93TWVzc2FnZURpYWxvZygpIHsKLQkJTWVzc2FnZURpYWxvZ1dpdGhUb2dnbGUgZGlhbG9nID0gTWVzc2FnZURpYWxvZ1dpdGhUb2dnbGUKLQkJCQkub3Blblllc05vUXVlc3Rpb24oRGlzcGxheS5nZXRDdXJyZW50KCkuZ2V0QWN0aXZlU2hlbGwoKSwKLQkJCQkJCURFTEVURV9GUk9NX0RJQUdSQU1fRExHX1RJVExFLAotCQkJCQkJREVMRVRFX0ZST01fRElBR1JBTV9ETEdfTUVTU0FHRSwKLQkJCQkJCURFTEVURV9GUk9NX01PREVMX0RMR19UT0dHTEVfTEFCRUwsIGZhbHNlLAotCQkJCQkJKElQcmVmZXJlbmNlU3RvcmUpICgoSUdyYXBoaWNhbEVkaXRQYXJ0KSBnZXRIb3N0KCkpCi0JCQkJCQkJCS5nZXREaWFncmFtUHJlZmVyZW5jZXNIaW50KCkKLQkJCQkJCQkJLmdldFByZWZlcmVuY2VTdG9yZSgpLAotCQkJCQkJSVByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9QUk9NUFRfT05fREVMX0ZST01fRElBR1JBTSk7Ci0JCWlmIChkaWFsb2cuZ2V0UmV0dXJuQ29kZSgpID09IElEaWFsb2dDb25zdGFudHMuWUVTX0lEKQotCQkJcmV0dXJuIHRydWU7Ci0JCWVsc2UKLQkJCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENvbW1hbmQgZ2V0Q29tbWFuZChSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJaWYgKHJlcXVlc3QgaW5zdGFuY2VvZiBHcm91cFJlcXVlc3RWaWFLZXlib2FyZCkgewotCQkJcmV0dXJuIGdldERlbGV0ZUNvbW1hbmQoKEdyb3VwUmVxdWVzdCkgcmVxdWVzdCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldENvbW1hbmQocmVxdWVzdCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9wb2xpY2llcy9EaWFncmFtVGV4dE5vblJlc2l6YWJsZUVkaXRQb2xpY3kuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvcG9saWNpZXMvRGlhZ3JhbVRleHROb25SZXNpemFibGVFZGl0UG9saWN5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0NDJmYzkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9wb2xpY2llcy9EaWFncmFtVGV4dE5vblJlc2l6YWJsZUVkaXRQb2xpY3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxMyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wb2xpY2llczsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuQ29sb3JDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuR3JhcGhpY3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuR3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkxheWVyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5oYW5kbGVzLk1vdmVIYW5kbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuTm9uUmVzaXphYmxlRWRpdFBvbGljeUV4OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkudG9vbHMuRHJhZ0VkaXRQYXJ0c1RyYWNrZXJFeDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWw7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRGlhZ3JhbVRleHROb25SZXNpemFibGVFZGl0UG9saWN5IGV4dGVuZHMgTm9uUmVzaXphYmxlRWRpdFBvbGljeUV4IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIElGaWd1cmUgc2VsZWN0aW9uRmVlZGJhY2tGaWd1cmU7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBJRmlndXJlIGZvY3VzRmVlZGJhY2tGaWd1cmU7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2hvd1ByaW1hcnlTZWxlY3Rpb24oKSB7Ci0JCWlmIChnZXRIb3N0RmlndXJlKCkgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCSgoV3JhcExhYmVsKSBnZXRIb3N0RmlndXJlKCkpLnNldFNlbGVjdGVkKHRydWUpOwotCQkJKChXcmFwTGFiZWwpIGdldEhvc3RGaWd1cmUoKSkuc2V0Rm9jdXModHJ1ZSk7Ci0JCX0gZWxzZSB7Ci0JCQlzaG93U2VsZWN0aW9uKCk7Ci0JCQlzaG93Rm9jdXMoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzaG93U2VsZWN0aW9uKCkgewotCQlpZiAoZ2V0SG9zdEZpZ3VyZSgpIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQkoKFdyYXBMYWJlbCkgZ2V0SG9zdEZpZ3VyZSgpKS5zZXRTZWxlY3RlZCh0cnVlKTsKLQkJCSgoV3JhcExhYmVsKSBnZXRIb3N0RmlndXJlKCkpLnNldEZvY3VzKGZhbHNlKTsKLQkJfSBlbHNlIHsKLQkJCWhpZGVTZWxlY3Rpb24oKTsKLQkJCWFkZEZlZWRiYWNrKHNlbGVjdGlvbkZlZWRiYWNrRmlndXJlID0gY3JlYXRlU2VsZWN0aW9uRmVlZGJhY2tGaWd1cmUoKSk7Ci0JCQlyZWZyZXNoU2VsZWN0aW9uRmVlZGJhY2soKTsKLQkJCWhpZGVGb2N1cygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGhpZGVTZWxlY3Rpb24oKSB7Ci0JCWlmIChnZXRIb3N0RmlndXJlKCkgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCSgoV3JhcExhYmVsKSBnZXRIb3N0RmlndXJlKCkpLnNldFNlbGVjdGVkKGZhbHNlKTsKLQkJCSgoV3JhcExhYmVsKSBnZXRIb3N0RmlndXJlKCkpLnNldEZvY3VzKGZhbHNlKTsKLQkJfSBlbHNlIHsKLQkJCWlmIChzZWxlY3Rpb25GZWVkYmFja0ZpZ3VyZSAhPSBudWxsKSB7Ci0JCQkJcmVtb3ZlRmVlZGJhY2soc2VsZWN0aW9uRmVlZGJhY2tGaWd1cmUpOwotCQkJCXNlbGVjdGlvbkZlZWRiYWNrRmlndXJlID0gbnVsbDsKLQkJCX0KLQkJCWhpZGVGb2N1cygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNob3dGb2N1cygpIHsKLQkJaWYgKGdldEhvc3RGaWd1cmUoKSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJKChXcmFwTGFiZWwpIGdldEhvc3RGaWd1cmUoKSkuc2V0Rm9jdXModHJ1ZSk7Ci0JCX0gZWxzZSB7Ci0JCQloaWRlRm9jdXMoKTsKLQkJCWFkZEZlZWRiYWNrKGZvY3VzRmVlZGJhY2tGaWd1cmUgPSBjcmVhdGVGb2N1c0ZlZWRiYWNrRmlndXJlKCkpOwotCQkJcmVmcmVzaEZvY3VzRmVlZGJhY2soKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBoaWRlRm9jdXMoKSB7Ci0JCWlmIChnZXRIb3N0RmlndXJlKCkgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCSgoV3JhcExhYmVsKSBnZXRIb3N0RmlndXJlKCkpLnNldEZvY3VzKGZhbHNlKTsKLQkJfSBlbHNlIHsKLQkJCWlmIChmb2N1c0ZlZWRiYWNrRmlndXJlICE9IG51bGwpIHsKLQkJCQlyZW1vdmVGZWVkYmFjayhmb2N1c0ZlZWRiYWNrRmlndXJlKTsKLQkJCQlmb2N1c0ZlZWRiYWNrRmlndXJlID0gbnVsbDsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUmVjdGFuZ2xlIGdldEZlZWRiYWNrQm91bmRzKCkgewotCQlSZWN0YW5nbGUgYm91bmRzOwotCQlpZiAoZ2V0SG9zdEZpZ3VyZSgpIGluc3RhbmNlb2YgTGFiZWwpIHsKLQkJCWJvdW5kcyA9ICgoTGFiZWwpIGdldEhvc3RGaWd1cmUoKSkuZ2V0VGV4dEJvdW5kcygpOwotCQkJYm91bmRzLmludGVyc2VjdChnZXRIb3N0RmlndXJlKCkuZ2V0Qm91bmRzKCkpOwotCQl9IGVsc2UgewotCQkJYm91bmRzID0gZ2V0SG9zdEZpZ3VyZSgpLmdldEJvdW5kcygpLmdldENvcHkoKTsKLQkJfQotCQlnZXRIb3N0RmlndXJlKCkuZ2V0UGFyZW50KCkudHJhbnNsYXRlVG9BYnNvbHV0ZShib3VuZHMpOwotCQlnZXRGZWVkYmFja0xheWVyKCkudHJhbnNsYXRlVG9SZWxhdGl2ZShib3VuZHMpOwotCQlyZXR1cm4gYm91bmRzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVTZWxlY3Rpb25GZWVkYmFja0ZpZ3VyZSgpIHsKLQkJaWYgKGdldEhvc3RGaWd1cmUoKSBpbnN0YW5jZW9mIExhYmVsKSB7Ci0JCQlMYWJlbCBmZWVkYmFja0ZpZ3VyZSA9IG5ldyBMYWJlbCgpOwotCQkJZmVlZGJhY2tGaWd1cmUuc2V0T3BhcXVlKHRydWUpOwotCQkJZmVlZGJhY2tGaWd1cmUKLQkJCQkJLnNldEJhY2tncm91bmRDb2xvcihDb2xvckNvbnN0YW50cy5tZW51QmFja2dyb3VuZFNlbGVjdGVkKTsKLQkJCWZlZWRiYWNrRmlndXJlCi0JCQkJCS5zZXRGb3JlZ3JvdW5kQ29sb3IoQ29sb3JDb25zdGFudHMubWVudUZvcmVncm91bmRTZWxlY3RlZCk7Ci0JCQlyZXR1cm4gZmVlZGJhY2tGaWd1cmU7Ci0JCX0gZWxzZSB7Ci0JCQlSZWN0YW5nbGVGaWd1cmUgZmVlZGJhY2tGaWd1cmUgPSBuZXcgUmVjdGFuZ2xlRmlndXJlKCk7Ci0JCQlmZWVkYmFja0ZpZ3VyZS5zZXRGaWxsKGZhbHNlKTsKLQkJCXJldHVybiBmZWVkYmFja0ZpZ3VyZTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVGb2N1c0ZlZWRiYWNrRmlndXJlKCkgewotCQlyZXR1cm4gbmV3IEZpZ3VyZSgpIHsKLQotCQkJcHJvdGVjdGVkIHZvaWQgcGFpbnRGaWd1cmUoR3JhcGhpY3MgZ3JhcGhpY3MpIHsKLQkJCQlncmFwaGljcy5kcmF3Rm9jdXMoZ2V0Qm91bmRzKCkuZ2V0UmVzaXplZCgtMSwgLTEpKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlTGFiZWwoTGFiZWwgdGFyZ2V0KSB7Ci0JCUxhYmVsIHNvdXJjZSA9IChMYWJlbCkgZ2V0SG9zdEZpZ3VyZSgpOwotCQl0YXJnZXQuc2V0VGV4dChzb3VyY2UuZ2V0VGV4dCgpKTsKLQkJdGFyZ2V0LnNldFRleHRBbGlnbm1lbnQoc291cmNlLmdldFRleHRBbGlnbm1lbnQoKSk7Ci0JCXRhcmdldC5zZXRGb250KHNvdXJjZS5nZXRGb250KCkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoU2VsZWN0aW9uRmVlZGJhY2soKSB7Ci0JCWlmIChzZWxlY3Rpb25GZWVkYmFja0ZpZ3VyZSAhPSBudWxsKSB7Ci0JCQlpZiAoc2VsZWN0aW9uRmVlZGJhY2tGaWd1cmUgaW5zdGFuY2VvZiBMYWJlbCkgewotCQkJCXVwZGF0ZUxhYmVsKChMYWJlbCkgc2VsZWN0aW9uRmVlZGJhY2tGaWd1cmUpOwotCQkJCXNlbGVjdGlvbkZlZWRiYWNrRmlndXJlLnNldEJvdW5kcyhnZXRGZWVkYmFja0JvdW5kcygpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJc2VsZWN0aW9uRmVlZGJhY2tGaWd1cmUuc2V0Qm91bmRzKGdldEZlZWRiYWNrQm91bmRzKCkuZXhwYW5kKDUsCi0JCQkJCQk1KSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaEZvY3VzRmVlZGJhY2soKSB7Ci0JCWlmIChmb2N1c0ZlZWRiYWNrRmlndXJlICE9IG51bGwpIHsKLQkJCWZvY3VzRmVlZGJhY2tGaWd1cmUuc2V0Qm91bmRzKGdldEZlZWRiYWNrQm91bmRzKCkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHJlZnJlc2hGZWVkYmFjaygpIHsKLQkJcmVmcmVzaFNlbGVjdGlvbkZlZWRiYWNrKCk7Ci0JCXJlZnJlc2hGb2N1c0ZlZWRiYWNrKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBMaXN0IGNyZWF0ZVNlbGVjdGlvbkhhbmRsZXMoKSB7Ci0JCU1vdmVIYW5kbGUgbW92ZUhhbmRsZSA9IG5ldyBNb3ZlSGFuZGxlKChHcmFwaGljYWxFZGl0UGFydCkgZ2V0SG9zdCgpKTsKLQkJbW92ZUhhbmRsZS5zZXRCb3JkZXIobnVsbCk7Ci0JCW1vdmVIYW5kbGUuc2V0RHJhZ1RyYWNrZXIobmV3IERyYWdFZGl0UGFydHNUcmFja2VyRXgoZ2V0SG9zdCgpKSk7Ci0JCXJldHVybiBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KG1vdmVIYW5kbGUpOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvcG9saWNpZXMvRGlhZ3JhbVRleHRTZWxlY3Rpb25FZGl0UG9saWN5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L3BvbGljaWVzL0RpYWdyYW1UZXh0U2VsZWN0aW9uRWRpdFBvbGljeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNTYzMDA1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvcG9saWNpZXMvRGlhZ3JhbVRleHRTZWxlY3Rpb25FZGl0UG9saWN5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucG9saWNpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuQ29sb3JDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuR3JhcGhpY3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuTGF5ZXJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5TZWxlY3Rpb25FZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbDsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEaWFncmFtVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kgZXh0ZW5kcyBTZWxlY3Rpb25FZGl0UG9saWN5IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIElGaWd1cmUgc2VsZWN0aW9uRmVlZGJhY2tGaWd1cmU7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBJRmlndXJlIGZvY3VzRmVlZGJhY2tGaWd1cmU7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2hvd1ByaW1hcnlTZWxlY3Rpb24oKSB7Ci0JCWlmIChnZXRIb3N0RmlndXJlKCkgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCSgoV3JhcExhYmVsKSBnZXRIb3N0RmlndXJlKCkpLnNldFNlbGVjdGVkKHRydWUpOwotCQkJKChXcmFwTGFiZWwpIGdldEhvc3RGaWd1cmUoKSkuc2V0Rm9jdXModHJ1ZSk7Ci0JCX0gZWxzZSB7Ci0JCQlzaG93U2VsZWN0aW9uKCk7Ci0JCQlzaG93Rm9jdXMoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzaG93U2VsZWN0aW9uKCkgewotCQlpZiAoZ2V0SG9zdEZpZ3VyZSgpIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQkoKFdyYXBMYWJlbCkgZ2V0SG9zdEZpZ3VyZSgpKS5zZXRTZWxlY3RlZCh0cnVlKTsKLQkJCSgoV3JhcExhYmVsKSBnZXRIb3N0RmlndXJlKCkpLnNldEZvY3VzKGZhbHNlKTsKLQkJfSBlbHNlIHsKLQkJCWhpZGVTZWxlY3Rpb24oKTsKLQkJCWFkZEZlZWRiYWNrKHNlbGVjdGlvbkZlZWRiYWNrRmlndXJlID0gY3JlYXRlU2VsZWN0aW9uRmVlZGJhY2tGaWd1cmUoKSk7Ci0JCQlyZWZyZXNoU2VsZWN0aW9uRmVlZGJhY2soKTsKLQkJCWhpZGVGb2N1cygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGhpZGVTZWxlY3Rpb24oKSB7Ci0JCWlmIChnZXRIb3N0RmlndXJlKCkgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCSgoV3JhcExhYmVsKSBnZXRIb3N0RmlndXJlKCkpLnNldFNlbGVjdGVkKGZhbHNlKTsKLQkJCSgoV3JhcExhYmVsKSBnZXRIb3N0RmlndXJlKCkpLnNldEZvY3VzKGZhbHNlKTsKLQkJfSBlbHNlIHsKLQkJCWlmIChzZWxlY3Rpb25GZWVkYmFja0ZpZ3VyZSAhPSBudWxsKSB7Ci0JCQkJcmVtb3ZlRmVlZGJhY2soc2VsZWN0aW9uRmVlZGJhY2tGaWd1cmUpOwotCQkJCXNlbGVjdGlvbkZlZWRiYWNrRmlndXJlID0gbnVsbDsKLQkJCX0KLQkJCWhpZGVGb2N1cygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNob3dGb2N1cygpIHsKLQkJaWYgKGdldEhvc3RGaWd1cmUoKSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJKChXcmFwTGFiZWwpIGdldEhvc3RGaWd1cmUoKSkuc2V0Rm9jdXModHJ1ZSk7Ci0JCX0gZWxzZSB7Ci0JCQloaWRlRm9jdXMoKTsKLQkJCWFkZEZlZWRiYWNrKGZvY3VzRmVlZGJhY2tGaWd1cmUgPSBjcmVhdGVGb2N1c0ZlZWRiYWNrRmlndXJlKCkpOwotCQkJcmVmcmVzaEZvY3VzRmVlZGJhY2soKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBoaWRlRm9jdXMoKSB7Ci0JCWlmIChnZXRIb3N0RmlndXJlKCkgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCSgoV3JhcExhYmVsKSBnZXRIb3N0RmlndXJlKCkpLnNldEZvY3VzKGZhbHNlKTsKLQkJfSBlbHNlIHsKLQkJCWlmIChmb2N1c0ZlZWRiYWNrRmlndXJlICE9IG51bGwpIHsKLQkJCQlyZW1vdmVGZWVkYmFjayhmb2N1c0ZlZWRiYWNrRmlndXJlKTsKLQkJCQlmb2N1c0ZlZWRiYWNrRmlndXJlID0gbnVsbDsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUmVjdGFuZ2xlIGdldEZlZWRiYWNrQm91bmRzKCkgewotCQlSZWN0YW5nbGUgYm91bmRzOwotCQlpZiAoZ2V0SG9zdEZpZ3VyZSgpIGluc3RhbmNlb2YgTGFiZWwpIHsKLQkJCWJvdW5kcyA9ICgoTGFiZWwpIGdldEhvc3RGaWd1cmUoKSkuZ2V0VGV4dEJvdW5kcygpOwotCQkJYm91bmRzLmludGVyc2VjdChnZXRIb3N0RmlndXJlKCkuZ2V0Qm91bmRzKCkpOwotCQl9IGVsc2UgewotCQkJYm91bmRzID0gZ2V0SG9zdEZpZ3VyZSgpLmdldEJvdW5kcygpLmdldENvcHkoKTsKLQkJfQotCQlnZXRIb3N0RmlndXJlKCkuZ2V0UGFyZW50KCkudHJhbnNsYXRlVG9BYnNvbHV0ZShib3VuZHMpOwotCQlnZXRGZWVkYmFja0xheWVyKCkudHJhbnNsYXRlVG9SZWxhdGl2ZShib3VuZHMpOwotCQlyZXR1cm4gYm91bmRzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVTZWxlY3Rpb25GZWVkYmFja0ZpZ3VyZSgpIHsKLQkJaWYgKGdldEhvc3RGaWd1cmUoKSBpbnN0YW5jZW9mIExhYmVsKSB7Ci0JCQlMYWJlbCBmZWVkYmFja0ZpZ3VyZSA9IG5ldyBMYWJlbCgpOwotCQkJZmVlZGJhY2tGaWd1cmUuc2V0T3BhcXVlKHRydWUpOwotCQkJZmVlZGJhY2tGaWd1cmUKLQkJCQkJLnNldEJhY2tncm91bmRDb2xvcihDb2xvckNvbnN0YW50cy5tZW51QmFja2dyb3VuZFNlbGVjdGVkKTsKLQkJCWZlZWRiYWNrRmlndXJlCi0JCQkJCS5zZXRGb3JlZ3JvdW5kQ29sb3IoQ29sb3JDb25zdGFudHMubWVudUZvcmVncm91bmRTZWxlY3RlZCk7Ci0JCQlyZXR1cm4gZmVlZGJhY2tGaWd1cmU7Ci0JCX0gZWxzZSB7Ci0JCQlSZWN0YW5nbGVGaWd1cmUgZmVlZGJhY2tGaWd1cmUgPSBuZXcgUmVjdGFuZ2xlRmlndXJlKCk7Ci0JCQlmZWVkYmFja0ZpZ3VyZS5zZXRGaWxsKGZhbHNlKTsKLQkJCXJldHVybiBmZWVkYmFja0ZpZ3VyZTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVGb2N1c0ZlZWRiYWNrRmlndXJlKCkgewotCQlyZXR1cm4gbmV3IEZpZ3VyZSgpIHsKLQotCQkJcHJvdGVjdGVkIHZvaWQgcGFpbnRGaWd1cmUoR3JhcGhpY3MgZ3JhcGhpY3MpIHsKLQkJCQlncmFwaGljcy5kcmF3Rm9jdXMoZ2V0Qm91bmRzKCkuZ2V0UmVzaXplZCgtMSwgLTEpKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlTGFiZWwoTGFiZWwgdGFyZ2V0KSB7Ci0JCUxhYmVsIHNvdXJjZSA9IChMYWJlbCkgZ2V0SG9zdEZpZ3VyZSgpOwotCQl0YXJnZXQuc2V0VGV4dChzb3VyY2UuZ2V0VGV4dCgpKTsKLQkJdGFyZ2V0LnNldFRleHRBbGlnbm1lbnQoc291cmNlLmdldFRleHRBbGlnbm1lbnQoKSk7Ci0JCXRhcmdldC5zZXRGb250KHNvdXJjZS5nZXRGb250KCkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoU2VsZWN0aW9uRmVlZGJhY2soKSB7Ci0JCWlmIChzZWxlY3Rpb25GZWVkYmFja0ZpZ3VyZSAhPSBudWxsKSB7Ci0JCQlpZiAoc2VsZWN0aW9uRmVlZGJhY2tGaWd1cmUgaW5zdGFuY2VvZiBMYWJlbCkgewotCQkJCXVwZGF0ZUxhYmVsKChMYWJlbCkgc2VsZWN0aW9uRmVlZGJhY2tGaWd1cmUpOwotCQkJCXNlbGVjdGlvbkZlZWRiYWNrRmlndXJlLnNldEJvdW5kcyhnZXRGZWVkYmFja0JvdW5kcygpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJc2VsZWN0aW9uRmVlZGJhY2tGaWd1cmUuc2V0Qm91bmRzKGdldEZlZWRiYWNrQm91bmRzKCkuZXhwYW5kKDUsCi0JCQkJCQk1KSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaEZvY3VzRmVlZGJhY2soKSB7Ci0JCWlmIChmb2N1c0ZlZWRiYWNrRmlndXJlICE9IG51bGwpIHsKLQkJCWZvY3VzRmVlZGJhY2tGaWd1cmUuc2V0Qm91bmRzKGdldEZlZWRiYWNrQm91bmRzKCkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHJlZnJlc2hGZWVkYmFjaygpIHsKLQkJcmVmcmVzaFNlbGVjdGlvbkZlZWRiYWNrKCk7Ci0JCXJlZnJlc2hGb2N1c0ZlZWRiYWNrKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9wb2xpY2llcy9MaW5rSXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9wb2xpY2llcy9MaW5rSXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzN2NiNmVlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvcG9saWNpZXMvTGlua0l0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBvbGljaWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLmNvbW1hbmRzLkRlc3Ryb3lFbGVtZW50Q29tbWFuZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuRGVzdHJveUVsZW1lbnRSZXF1ZXN0OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIExpbmtJdGVtU2VtYW50aWNFZGl0UG9saWN5IGV4dGVuZHMKLQkJRGlhZ3JhbUJhc2VJdGVtU2VtYW50aWNFZGl0UG9saWN5IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXREZXN0cm95RWxlbWVudENvbW1hbmQoRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHJlcSkgewotCQlyZXR1cm4gZ2V0TVNMV3JhcHBlcihuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKHJlcSkpOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvcG9saWNpZXMvUm9sZU5vZGVDYW5vbmljYWxFZGl0UG9saWN5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L3BvbGljaWVzL1JvbGVOb2RlQ2Fub25pY2FsRWRpdFBvbGljeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOTdlNDM5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvcG9saWNpZXMvUm9sZU5vZGVDYW5vbmljYWxFZGl0UG9saWN5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wb2xpY2llczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkNhbm9uaWNhbEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBSb2xlTm9kZUNhbm9uaWNhbEVkaXRQb2xpY3kgZXh0ZW5kcyBDYW5vbmljYWxFZGl0UG9saWN5IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBnZXRTZW1hbnRpY0NoaWxkcmVuTGlzdCgpIHsKLQkJTGlzdCByZXN1bHQgPSBuZXcgTGlua2VkTGlzdCgpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBzaG91bGREZWxldGVWaWV3KFZpZXcgdmlldykgewotCQlyZXR1cm4gdmlldy5pc1NldEVsZW1lbnQoKSAmJiB2aWV3LmdldEVsZW1lbnQoKSAhPSBudWxsCi0JCQkJJiYgdmlldy5nZXRFbGVtZW50KCkuZUlzUHJveHkoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREZWZhdWx0RmFjdG9yeUhpbnQoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9wb2xpY2llcy9Sb2xlTm9kZUdyYXBoaWNhbE5vZGVFZGl0UG9saWN5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L3BvbGljaWVzL1JvbGVOb2RlR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2FjMjhlYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L3BvbGljaWVzL1JvbGVOb2RlR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBvbGljaWVzOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFJvbGVOb2RlR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kgZXh0ZW5kcwotCQlEaWFncmFtR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kgewotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9wb2xpY2llcy9Sb2xlTm9kZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvcG9saWNpZXMvUm9sZU5vZGVJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxMGRiOWQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9wb2xpY2llcy9Sb2xlTm9kZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wb2xpY2llczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21wb3VuZENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5jb21tYW5kcy5EZXN0cm95RWxlbWVudENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5DcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuRGVzdHJveUVsZW1lbnRSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuUmVvcmllbnRSZWxhdGlvbnNoaXBSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LmNvbW1hbmRzLkxpbmtDcmVhdGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LmNvbW1hbmRzLkxpbmtSZW9yaWVudENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucGFydHMuTGlua0VkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQucHJvdmlkZXJzLkRpYWdyYW1FbGVtZW50VHlwZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5MaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk1vZGVsUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLlVuZXhlY3V0YWJsZUNvbW1hbmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLmNvbW1hbmRzLkNyZWF0ZVJlbGF0aW9uc2hpcENvbW1hbmQ7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUm9sZU5vZGVJdGVtU2VtYW50aWNFZGl0UG9saWN5IGV4dGVuZHMKLQkJRGlhZ3JhbUJhc2VJdGVtU2VtYW50aWNFZGl0UG9saWN5IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXREZXN0cm95RWxlbWVudENvbW1hbmQoRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHJlcSkgewotCQlDb21wb3VuZENvbW1hbmQgY2MgPSBnZXREZXN0cm95RWRnZXNDb21tYW5kKHJlcQotCQkJCS5pc0NvbmZpcm1hdGlvblJlcXVpcmVkKCkpOwotCQljYy5hZGQoZ2V0TVNMV3JhcHBlcihuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKHJlcSkpKTsKLQkJcmV0dXJuIGNjLnVud3JhcCgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVSZWxhdGlvbnNoaXBDb21tYW5kKENyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3QgcmVxKSB7Ci0JCWlmIChEaWFncmFtRWxlbWVudFR5cGVzLkxpbmtfMzAwMSA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgewotCQkJcmV0dXJuIHJlcS5nZXRUYXJnZXQoKSA9PSBudWxsID8gZ2V0Q3JlYXRlU3RhcnRPdXRnb2luZ0xpbmtfMzAwMUNvbW1hbmQocmVxKQotCQkJCQk6IGdldENyZWF0ZUNvbXBsZXRlSW5jb21pbmdMaW5rXzMwMDFDb21tYW5kKHJlcSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldENyZWF0ZVJlbGF0aW9uc2hpcENvbW1hbmQocmVxKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlU3RhcnRPdXRnb2luZ0xpbmtfMzAwMUNvbW1hbmQoCi0JCQlDcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0IHJlcSkgewotCQlFT2JqZWN0IHNvdXJjZUVPYmplY3QgPSByZXEuZ2V0U291cmNlKCk7Ci0JCWlmIChmYWxzZSA9PSBzb3VyY2VFT2JqZWN0IGluc3RhbmNlb2YgTm9kZSkgewotCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCX0KLQkJTm9kZSBzb3VyY2UgPSAoTm9kZSkgc291cmNlRU9iamVjdDsKLQkJTm9kZSBjb250YWluZXIgPSAoTm9kZSkgZ2V0UmVsYXRpb25zaGlwQ29udGFpbmVyKHNvdXJjZSwKLQkJCQlNb2RlbFBhY2thZ2UuZUlOU1RBTkNFLmdldE5vZGUoKSwgcmVxLmdldEVsZW1lbnRUeXBlKCkpOwotCQlpZiAoY29udGFpbmVyID09IG51bGwpIHsKLQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQl9Ci0JCWlmICghRGlhZ3JhbUJhc2VJdGVtU2VtYW50aWNFZGl0UG9saWN5LkxpbmtDb25zdHJhaW50cwotCQkJCS5jYW5DcmVhdGVMaW5rXzMwMDEoY29udGFpbmVyLCBzb3VyY2UsIG51bGwpKSB7Ci0JCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJfQotCQlyZXR1cm4gbmV3IENvbW1hbmQoKSB7Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZUNvbXBsZXRlSW5jb21pbmdMaW5rXzMwMDFDb21tYW5kKAotCQkJQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdCByZXEpIHsKLQkJRU9iamVjdCBzb3VyY2VFT2JqZWN0ID0gcmVxLmdldFNvdXJjZSgpOwotCQlFT2JqZWN0IHRhcmdldEVPYmplY3QgPSByZXEuZ2V0VGFyZ2V0KCk7Ci0JCWlmIChmYWxzZSA9PSBzb3VyY2VFT2JqZWN0IGluc3RhbmNlb2YgTm9kZQotCQkJCXx8IGZhbHNlID09IHRhcmdldEVPYmplY3QgaW5zdGFuY2VvZiBOb2RlKSB7Ci0JCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJfQotCQlOb2RlIHNvdXJjZSA9IChOb2RlKSBzb3VyY2VFT2JqZWN0OwotCQlOb2RlIHRhcmdldCA9IChOb2RlKSB0YXJnZXRFT2JqZWN0OwotCQlOb2RlIGNvbnRhaW5lciA9IChOb2RlKSBnZXRSZWxhdGlvbnNoaXBDb250YWluZXIoc291cmNlLAotCQkJCU1vZGVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Tm9kZSgpLCByZXEuZ2V0RWxlbWVudFR5cGUoKSk7Ci0JCWlmIChjb250YWluZXIgPT0gbnVsbCkgewotCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCX0KLQkJaWYgKCFEaWFncmFtQmFzZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuTGlua0NvbnN0cmFpbnRzCi0JCQkJLmNhbkNyZWF0ZUxpbmtfMzAwMShjb250YWluZXIsIHNvdXJjZSwgdGFyZ2V0KSkgewotCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCX0KLQkJaWYgKHJlcS5nZXRDb250YWlubWVudEZlYXR1cmUoKSA9PSBudWxsKSB7Ci0JCQlyZXEuc2V0Q29udGFpbm1lbnRGZWF0dXJlKE1vZGVsUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJLmdldE5vZGVfT3V0Z29pbmdDb25uZWN0aW9ucygpKTsKLQkJfQotCQlyZXR1cm4gZ2V0TVNMV3JhcHBlcihuZXcgTGlua0NyZWF0ZUNvbW1hbmQocmVxLCBjb250YWluZXIsIHNvdXJjZSwKLQkJCQl0YXJnZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGNvbW1hbmQgdG8gcmVvcmllbnQgRUNsYXNzIGJhc2VkIGxpbmsuIE5ldyBsaW5rIHRhcmdldCBvciBzb3VyY2UKLQkgKiBzaG91bGQgYmUgdGhlIGRvbWFpbiBtb2RlbCBlbGVtZW50IGFzc29jaWF0ZWQgd2l0aCB0aGlzIG5vZGUuCi0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldFJlb3JpZW50UmVsYXRpb25zaGlwQ29tbWFuZCgKLQkJCVJlb3JpZW50UmVsYXRpb25zaGlwUmVxdWVzdCByZXEpIHsKLQkJc3dpdGNoIChnZXRWaXN1YWxJRChyZXEpKSB7Ci0JCWNhc2UgTGlua0VkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCXJldHVybiBnZXRNU0xXcmFwcGVyKG5ldyBMaW5rUmVvcmllbnRDb21tYW5kKHJlcSkpOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRSZW9yaWVudFJlbGF0aW9uc2hpcENvbW1hbmQocmVxKTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L3BvbGljaWVzL1JvbGVUYXNrQ29tcG9zaXRlQ2Fub25pY2FsRWRpdFBvbGljeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9wb2xpY2llcy9Sb2xlVGFza0NvbXBvc2l0ZUNhbm9uaWNhbEVkaXRQb2xpY3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjJlNGYzZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L3BvbGljaWVzL1JvbGVUYXNrQ29tcG9zaXRlQ2Fub25pY2FsRWRpdFBvbGljeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucG9saWNpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5DYW5vbmljYWxFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wYXJ0cy5Sb2xlTm9kZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBhcnRzLlRhc2tOb2RlRWRpdFBhcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQucGFydC5EaWFncmFtVmlzdWFsSURSZWdpc3RyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZUNvbnRhaW5lcjsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBSb2xlVGFza0NvbXBvc2l0ZUNhbm9uaWNhbEVkaXRQb2xpY3kgZXh0ZW5kcyBDYW5vbmljYWxFZGl0UG9saWN5IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBnZXRTZW1hbnRpY0NoaWxkcmVuTGlzdCgpIHsKLQkJTGlzdCByZXN1bHQgPSBuZXcgTGlua2VkTGlzdCgpOwotCQlFT2JqZWN0IG1vZGVsT2JqZWN0ID0gKChWaWV3KSBnZXRIb3N0KCkuZ2V0TW9kZWwoKSkuZ2V0RWxlbWVudCgpOwotCQlWaWV3IHZpZXdPYmplY3QgPSAoVmlldykgZ2V0SG9zdCgpLmdldE1vZGVsKCk7Ci0JCUVPYmplY3QgbmV4dFZhbHVlOwotCQlpbnQgbm9kZVZJRDsKLQkJZm9yIChJdGVyYXRvciB2YWx1ZXMgPSAoKE5vZGVDb250YWluZXIpIG1vZGVsT2JqZWN0KS5nZXROb2RlcygpCi0JCQkJLml0ZXJhdG9yKCk7IHZhbHVlcy5oYXNOZXh0KCk7KSB7Ci0JCQluZXh0VmFsdWUgPSAoRU9iamVjdCkgdmFsdWVzLm5leHQoKTsKLQkJCW5vZGVWSUQgPSBEaWFncmFtVmlzdWFsSURSZWdpc3RyeS5nZXROb2RlVmlzdWFsSUQodmlld09iamVjdCwKLQkJCQkJbmV4dFZhbHVlKTsKLQkJCXN3aXRjaCAobm9kZVZJRCkgewotCQkJY2FzZSBSb2xlTm9kZUVkaXRQYXJ0LlZJU1VBTF9JRDogewotCQkJCXJlc3VsdC5hZGQobmV4dFZhbHVlKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWNhc2UgVGFza05vZGVFZGl0UGFydC5WSVNVQUxfSUQ6IHsKLQkJCQlyZXN1bHQuYWRkKG5leHRWYWx1ZSk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBzaG91bGREZWxldGVWaWV3KFZpZXcgdmlldykgewotCQlyZXR1cm4gdmlldy5pc1NldEVsZW1lbnQoKQotCQkJCSYmIHZpZXcuZ2V0RWxlbWVudCgpICE9IG51bGwKLQkJCQkmJiAodmlldy5nZXRFbGVtZW50KCkuZUlzUHJveHkoKSB8fCB2aWV3LmdldEVsZW1lbnQoKSBpbnN0YW5jZW9mIE5vZGUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERlZmF1bHRGYWN0b3J5SGludCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L3BvbGljaWVzL1JvbGVUYXNrQ29tcG9zaXRlR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvcG9saWNpZXMvUm9sZVRhc2tDb21wb3NpdGVHcmFwaGljYWxOb2RlRWRpdFBvbGljeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNzA3MjU1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvcG9saWNpZXMvUm9sZVRhc2tDb21wb3NpdGVHcmFwaGljYWxOb2RlRWRpdFBvbGljeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucG9saWNpZXM7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUm9sZVRhc2tDb21wb3NpdGVHcmFwaGljYWxOb2RlRWRpdFBvbGljeSBleHRlbmRzCi0JCURpYWdyYW1HcmFwaGljYWxOb2RlRWRpdFBvbGljeSB7Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L3BvbGljaWVzL1JvbGVUYXNrQ29tcG9zaXRlSXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9wb2xpY2llcy9Sb2xlVGFza0NvbXBvc2l0ZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTFhNGVmMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L3BvbGljaWVzL1JvbGVUYXNrQ29tcG9zaXRlSXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBvbGljaWVzOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21wb3VuZENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5jb21tYW5kcy5EZXN0cm95RWxlbWVudENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5DcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuRGVzdHJveUVsZW1lbnRSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuUmVvcmllbnRSZWxhdGlvbnNoaXBSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LmNvbW1hbmRzLkxpbmtDcmVhdGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LmNvbW1hbmRzLkxpbmtSZW9yaWVudENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQuY29tbWFuZHMuUm9sZU5vZGVDcmVhdGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LmNvbW1hbmRzLlRhc2tOb2RlQ3JlYXRlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wYXJ0cy5MaW5rRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucGFydHMuUm9sZU5vZGVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wYXJ0cy5Sb2xlVGFza0NvbXBvc2l0ZVJvbGVUYXNrQ29tcGFydG1lbnRFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wYXJ0cy5UYXNrTm9kZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5wYXJ0LkRpYWdyYW1WaXN1YWxJRFJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQucHJvdmlkZXJzLkRpYWdyYW1FbGVtZW50VHlwZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5MaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk1vZGVsUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLlVuZXhlY3V0YWJsZUNvbW1hbmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLmNvbW1hbmRzLkNyZWF0ZUVsZW1lbnRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuY29tbWFuZHMuQ3JlYXRlUmVsYXRpb25zaGlwQ29tbWFuZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ3JlYXRlRWxlbWVudFJlcXVlc3Q7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUm9sZVRhc2tDb21wb3NpdGVJdGVtU2VtYW50aWNFZGl0UG9saWN5IGV4dGVuZHMKLQkJRGlhZ3JhbUJhc2VJdGVtU2VtYW50aWNFZGl0UG9saWN5IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVDb21tYW5kKENyZWF0ZUVsZW1lbnRSZXF1ZXN0IHJlcSkgewotCQlpZiAoRGlhZ3JhbUVsZW1lbnRUeXBlcy5Sb2xlTm9kZV8yMDAxID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7Ci0JCQlpZiAocmVxLmdldENvbnRhaW5tZW50RmVhdHVyZSgpID09IG51bGwpIHsKLQkJCQlyZXEuc2V0Q29udGFpbm1lbnRGZWF0dXJlKE1vZGVsUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCS5nZXROb2RlQ29udGFpbmVyX05vZGVzKCkpOwotCQkJfQotCQkJcmV0dXJuIGdldE1TTFdyYXBwZXIobmV3IFJvbGVOb2RlQ3JlYXRlQ29tbWFuZChyZXEpKTsKLQkJfQotCQlpZiAoRGlhZ3JhbUVsZW1lbnRUeXBlcy5UYXNrTm9kZV8yMDAyID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7Ci0JCQlpZiAocmVxLmdldENvbnRhaW5tZW50RmVhdHVyZSgpID09IG51bGwpIHsKLQkJCQlyZXEuc2V0Q29udGFpbm1lbnRGZWF0dXJlKE1vZGVsUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCS5nZXROb2RlQ29udGFpbmVyX05vZGVzKCkpOwotCQkJfQotCQkJcmV0dXJuIGdldE1TTFdyYXBwZXIobmV3IFRhc2tOb2RlQ3JlYXRlQ29tbWFuZChyZXEpKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0Q3JlYXRlQ29tbWFuZChyZXEpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXREZXN0cm95RWxlbWVudENvbW1hbmQoRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHJlcSkgewotCQlDb21wb3VuZENvbW1hbmQgY2MgPSBnZXREZXN0cm95RWRnZXNDb21tYW5kKHJlcQotCQkJCS5pc0NvbmZpcm1hdGlvblJlcXVpcmVkKCkpOwotCQlhZGREZXN0cm95Q2hpbGROb2Rlc0NvbW1hbmQoY2MsIHJlcS5pc0NvbmZpcm1hdGlvblJlcXVpcmVkKCkpOwotCQlWaWV3IHZpZXcgPSAoVmlldykgZ2V0SG9zdCgpLmdldE1vZGVsKCk7Ci0JCWlmICh2aWV3LmdldEVBbm5vdGF0aW9uKCJTaG9ydGN1dCIpICE9IG51bGwpIHsgLy8kTk9OLU5MUy0xJAotCQkJcmVxLnNldEVsZW1lbnRUb0Rlc3Ryb3kodmlldyk7Ci0JCX0KLQkJY2MuYWRkKGdldE1TTFdyYXBwZXIobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChyZXEpKSk7Ci0JCXJldHVybiBjYy51bndyYXAoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkRGVzdHJveUNoaWxkTm9kZXNDb21tYW5kKENvbXBvdW5kQ29tbWFuZCBjbWQsCi0JCQlib29sZWFuIGNvbmZpcm0pIHsKLQkJVmlldyB2aWV3ID0gKFZpZXcpIGdldEhvc3QoKS5nZXRNb2RlbCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gdmlldy5nZXRDaGlsZHJlbigpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCW9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vZGUgbm9kZSA9IChvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob2RlKSBpdAotCQkJCQkubmV4dCgpOwotCQkJc3dpdGNoIChEaWFncmFtVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRChub2RlKSkgewotCQkJY2FzZSBSb2xlTm9kZUVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCQljbWQuYWRkKGdldERlc3Ryb3lFbGVtZW50Q29tbWFuZChub2RlLCBjb25maXJtKSk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFRhc2tOb2RlRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJCWNtZC5hZGQoZ2V0RGVzdHJveUVsZW1lbnRDb21tYW5kKG5vZGUsIGNvbmZpcm0pKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgUm9sZVRhc2tDb21wb3NpdGVSb2xlVGFza0NvbXBhcnRtZW50RWRpdFBhcnQuVklTVUFMX0lEOgotCQkJCWZvciAoSXRlcmF0b3IgY2l0ID0gbm9kZS5nZXRDaGlsZHJlbigpLml0ZXJhdG9yKCk7IGNpdAotCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm9kZSBjbm9kZSA9IChvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob2RlKSBjaXQKLQkJCQkJCQkubmV4dCgpOwotCQkJCQlzd2l0Y2ggKERpYWdyYW1WaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKGNub2RlKSkgewotCQkJCQl9Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZVJlbGF0aW9uc2hpcENvbW1hbmQoQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdCByZXEpIHsKLQkJaWYgKERpYWdyYW1FbGVtZW50VHlwZXMuTGlua18zMDAxID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7Ci0JCQlyZXR1cm4gcmVxLmdldFRhcmdldCgpID09IG51bGwgPyBnZXRDcmVhdGVTdGFydE91dGdvaW5nTGlua18zMDAxQ29tbWFuZChyZXEpCi0JCQkJCTogZ2V0Q3JlYXRlQ29tcGxldGVJbmNvbWluZ0xpbmtfMzAwMUNvbW1hbmQocmVxKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0Q3JlYXRlUmVsYXRpb25zaGlwQ29tbWFuZChyZXEpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVTdGFydE91dGdvaW5nTGlua18zMDAxQ29tbWFuZCgKLQkJCUNyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3QgcmVxKSB7Ci0JCUVPYmplY3Qgc291cmNlRU9iamVjdCA9IHJlcS5nZXRTb3VyY2UoKTsKLQkJaWYgKGZhbHNlID09IHNvdXJjZUVPYmplY3QgaW5zdGFuY2VvZiBOb2RlKSB7Ci0JCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJfQotCQlOb2RlIHNvdXJjZSA9IChOb2RlKSBzb3VyY2VFT2JqZWN0OwotCQlOb2RlIGNvbnRhaW5lciA9IChOb2RlKSBnZXRSZWxhdGlvbnNoaXBDb250YWluZXIoc291cmNlLAotCQkJCU1vZGVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Tm9kZSgpLCByZXEuZ2V0RWxlbWVudFR5cGUoKSk7Ci0JCWlmIChjb250YWluZXIgPT0gbnVsbCkgewotCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCX0KLQkJaWYgKCFEaWFncmFtQmFzZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuTGlua0NvbnN0cmFpbnRzCi0JCQkJLmNhbkNyZWF0ZUxpbmtfMzAwMShjb250YWluZXIsIHNvdXJjZSwgbnVsbCkpIHsKLQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQl9Ci0JCXJldHVybiBuZXcgQ29tbWFuZCgpIHsKLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlQ29tcGxldGVJbmNvbWluZ0xpbmtfMzAwMUNvbW1hbmQoCi0JCQlDcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0IHJlcSkgewotCQlFT2JqZWN0IHNvdXJjZUVPYmplY3QgPSByZXEuZ2V0U291cmNlKCk7Ci0JCUVPYmplY3QgdGFyZ2V0RU9iamVjdCA9IHJlcS5nZXRUYXJnZXQoKTsKLQkJaWYgKGZhbHNlID09IHNvdXJjZUVPYmplY3QgaW5zdGFuY2VvZiBOb2RlCi0JCQkJfHwgZmFsc2UgPT0gdGFyZ2V0RU9iamVjdCBpbnN0YW5jZW9mIE5vZGUpIHsKLQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQl9Ci0JCU5vZGUgc291cmNlID0gKE5vZGUpIHNvdXJjZUVPYmplY3Q7Ci0JCU5vZGUgdGFyZ2V0ID0gKE5vZGUpIHRhcmdldEVPYmplY3Q7Ci0JCU5vZGUgY29udGFpbmVyID0gKE5vZGUpIGdldFJlbGF0aW9uc2hpcENvbnRhaW5lcihzb3VyY2UsCi0JCQkJTW9kZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXROb2RlKCksIHJlcS5nZXRFbGVtZW50VHlwZSgpKTsKLQkJaWYgKGNvbnRhaW5lciA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJfQotCQlpZiAoIURpYWdyYW1CYXNlSXRlbVNlbWFudGljRWRpdFBvbGljeS5MaW5rQ29uc3RyYWludHMKLQkJCQkuY2FuQ3JlYXRlTGlua18zMDAxKGNvbnRhaW5lciwgc291cmNlLCB0YXJnZXQpKSB7Ci0JCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJfQotCQlpZiAocmVxLmdldENvbnRhaW5tZW50RmVhdHVyZSgpID09IG51bGwpIHsKLQkJCXJlcS5zZXRDb250YWlubWVudEZlYXR1cmUoTW9kZWxQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkuZ2V0Tm9kZV9PdXRnb2luZ0Nvbm5lY3Rpb25zKCkpOwotCQl9Ci0JCXJldHVybiBnZXRNU0xXcmFwcGVyKG5ldyBMaW5rQ3JlYXRlQ29tbWFuZChyZXEsIGNvbnRhaW5lciwgc291cmNlLAotCQkJCXRhcmdldCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgY29tbWFuZCB0byByZW9yaWVudCBFQ2xhc3MgYmFzZWQgbGluay4gTmV3IGxpbmsgdGFyZ2V0IG9yIHNvdXJjZQotCSAqIHNob3VsZCBiZSB0aGUgZG9tYWluIG1vZGVsIGVsZW1lbnQgYXNzb2NpYXRlZCB3aXRoIHRoaXMgbm9kZS4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0UmVvcmllbnRSZWxhdGlvbnNoaXBDb21tYW5kKAotCQkJUmVvcmllbnRSZWxhdGlvbnNoaXBSZXF1ZXN0IHJlcSkgewotCQlzd2l0Y2ggKGdldFZpc3VhbElEKHJlcSkpIHsKLQkJY2FzZSBMaW5rRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJcmV0dXJuIGdldE1TTFdyYXBwZXIobmV3IExpbmtSZW9yaWVudENvbW1hbmQocmVxKSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldFJlb3JpZW50UmVsYXRpb25zaGlwQ29tbWFuZChyZXEpOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvcG9saWNpZXMvUm9sZVRhc2tDb21wb3NpdGVSb2xlVGFza0NvbXBhcnRtZW50Q2Fub25pY2FsRWRpdFBvbGljeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9wb2xpY2llcy9Sb2xlVGFza0NvbXBvc2l0ZVJvbGVUYXNrQ29tcGFydG1lbnRDYW5vbmljYWxFZGl0UG9saWN5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjYjgzMDguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9wb2xpY2llcy9Sb2xlVGFza0NvbXBvc2l0ZVJvbGVUYXNrQ29tcGFydG1lbnRDYW5vbmljYWxFZGl0UG9saWN5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wb2xpY2llczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkNhbm9uaWNhbEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBSb2xlVGFza0NvbXBvc2l0ZVJvbGVUYXNrQ29tcGFydG1lbnRDYW5vbmljYWxFZGl0UG9saWN5IGV4dGVuZHMKLQkJQ2Fub25pY2FsRWRpdFBvbGljeSB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIExpc3QgZ2V0U2VtYW50aWNDaGlsZHJlbkxpc3QoKSB7Ci0JCUxpc3QgcmVzdWx0ID0gbmV3IExpbmtlZExpc3QoKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gc2hvdWxkRGVsZXRlVmlldyhWaWV3IHZpZXcpIHsKLQkJcmV0dXJuIHZpZXcuaXNTZXRFbGVtZW50KCkgJiYgdmlldy5nZXRFbGVtZW50KCkgIT0gbnVsbAotCQkJCSYmIHZpZXcuZ2V0RWxlbWVudCgpLmVJc1Byb3h5KCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGVmYXVsdEZhY3RvcnlIaW50KCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvcG9saWNpZXMvUm9sZVRhc2tDb21wb3NpdGVSb2xlVGFza0NvbXBhcnRtZW50SXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9wb2xpY2llcy9Sb2xlVGFza0NvbXBvc2l0ZVJvbGVUYXNrQ29tcGFydG1lbnRJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0ZTY0ZDYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9wb2xpY2llcy9Sb2xlVGFza0NvbXBvc2l0ZVJvbGVUYXNrQ29tcGFydG1lbnRJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wb2xpY2llczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5DcmVhdGVFbGVtZW50UmVxdWVzdDsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBSb2xlVGFza0NvbXBvc2l0ZVJvbGVUYXNrQ29tcGFydG1lbnRJdGVtU2VtYW50aWNFZGl0UG9saWN5IGV4dGVuZHMKLQkJRGlhZ3JhbUJhc2VJdGVtU2VtYW50aWNFZGl0UG9saWN5IHsKLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9wb2xpY2llcy9UYXNrTm9kZUNhbm9uaWNhbEVkaXRQb2xpY3kuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvcG9saWNpZXMvVGFza05vZGVDYW5vbmljYWxFZGl0UG9saWN5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxOTY2NTQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9wb2xpY2llcy9UYXNrTm9kZUNhbm9uaWNhbEVkaXRQb2xpY3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBvbGljaWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuQ2Fub25pY2FsRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFRhc2tOb2RlQ2Fub25pY2FsRWRpdFBvbGljeSBleHRlbmRzIENhbm9uaWNhbEVkaXRQb2xpY3kgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBMaXN0IGdldFNlbWFudGljQ2hpbGRyZW5MaXN0KCkgewotCQlMaXN0IHJlc3VsdCA9IG5ldyBMaW5rZWRMaXN0KCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHNob3VsZERlbGV0ZVZpZXcoVmlldyB2aWV3KSB7Ci0JCXJldHVybiB2aWV3LmlzU2V0RWxlbWVudCgpICYmIHZpZXcuZ2V0RWxlbWVudCgpICE9IG51bGwKLQkJCQkmJiB2aWV3LmdldEVsZW1lbnQoKS5lSXNQcm94eSgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERlZmF1bHRGYWN0b3J5SGludCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L3BvbGljaWVzL1Rhc2tOb2RlR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvcG9saWNpZXMvVGFza05vZGVHcmFwaGljYWxOb2RlRWRpdFBvbGljeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYmQyNmI4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvcG9saWNpZXMvVGFza05vZGVHcmFwaGljYWxOb2RlRWRpdFBvbGljeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucG9saWNpZXM7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgVGFza05vZGVHcmFwaGljYWxOb2RlRWRpdFBvbGljeSBleHRlbmRzCi0JCURpYWdyYW1HcmFwaGljYWxOb2RlRWRpdFBvbGljeSB7Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L3BvbGljaWVzL1Rhc2tOb2RlSXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9wb2xpY2llcy9UYXNrTm9kZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDdjYTJjMy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L3BvbGljaWVzL1Rhc2tOb2RlSXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBvbGljaWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbXBvdW5kQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLmNvbW1hbmRzLkRlc3Ryb3lFbGVtZW50Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkNyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5EZXN0cm95RWxlbWVudFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5SZW9yaWVudFJlbGF0aW9uc2hpcFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQuY29tbWFuZHMuTGlua0NyZWF0ZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQuY29tbWFuZHMuTGlua1Jlb3JpZW50Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wYXJ0cy5MaW5rRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5wcm92aWRlcnMuRGlhZ3JhbUVsZW1lbnRUeXBlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTW9kZWxQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuVW5leGVjdXRhYmxlQ29tbWFuZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuY29tbWFuZHMuQ3JlYXRlUmVsYXRpb25zaGlwQ29tbWFuZDsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBUYXNrTm9kZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kgZXh0ZW5kcwotCQlEaWFncmFtQmFzZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldERlc3Ryb3lFbGVtZW50Q29tbWFuZChEZXN0cm95RWxlbWVudFJlcXVlc3QgcmVxKSB7Ci0JCUNvbXBvdW5kQ29tbWFuZCBjYyA9IGdldERlc3Ryb3lFZGdlc0NvbW1hbmQocmVxCi0JCQkJLmlzQ29uZmlybWF0aW9uUmVxdWlyZWQoKSk7Ci0JCWNjLmFkZChnZXRNU0xXcmFwcGVyKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQocmVxKSkpOwotCQlyZXR1cm4gY2MudW53cmFwKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZVJlbGF0aW9uc2hpcENvbW1hbmQoQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdCByZXEpIHsKLQkJaWYgKERpYWdyYW1FbGVtZW50VHlwZXMuTGlua18zMDAxID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7Ci0JCQlyZXR1cm4gcmVxLmdldFRhcmdldCgpID09IG51bGwgPyBnZXRDcmVhdGVTdGFydE91dGdvaW5nTGlua18zMDAxQ29tbWFuZChyZXEpCi0JCQkJCTogZ2V0Q3JlYXRlQ29tcGxldGVJbmNvbWluZ0xpbmtfMzAwMUNvbW1hbmQocmVxKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0Q3JlYXRlUmVsYXRpb25zaGlwQ29tbWFuZChyZXEpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVTdGFydE91dGdvaW5nTGlua18zMDAxQ29tbWFuZCgKLQkJCUNyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3QgcmVxKSB7Ci0JCUVPYmplY3Qgc291cmNlRU9iamVjdCA9IHJlcS5nZXRTb3VyY2UoKTsKLQkJaWYgKGZhbHNlID09IHNvdXJjZUVPYmplY3QgaW5zdGFuY2VvZiBOb2RlKSB7Ci0JCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJfQotCQlOb2RlIHNvdXJjZSA9IChOb2RlKSBzb3VyY2VFT2JqZWN0OwotCQlOb2RlIGNvbnRhaW5lciA9IChOb2RlKSBnZXRSZWxhdGlvbnNoaXBDb250YWluZXIoc291cmNlLAotCQkJCU1vZGVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Tm9kZSgpLCByZXEuZ2V0RWxlbWVudFR5cGUoKSk7Ci0JCWlmIChjb250YWluZXIgPT0gbnVsbCkgewotCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCX0KLQkJaWYgKCFEaWFncmFtQmFzZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuTGlua0NvbnN0cmFpbnRzCi0JCQkJLmNhbkNyZWF0ZUxpbmtfMzAwMShjb250YWluZXIsIHNvdXJjZSwgbnVsbCkpIHsKLQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQl9Ci0JCXJldHVybiBuZXcgQ29tbWFuZCgpIHsKLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlQ29tcGxldGVJbmNvbWluZ0xpbmtfMzAwMUNvbW1hbmQoCi0JCQlDcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0IHJlcSkgewotCQlFT2JqZWN0IHNvdXJjZUVPYmplY3QgPSByZXEuZ2V0U291cmNlKCk7Ci0JCUVPYmplY3QgdGFyZ2V0RU9iamVjdCA9IHJlcS5nZXRUYXJnZXQoKTsKLQkJaWYgKGZhbHNlID09IHNvdXJjZUVPYmplY3QgaW5zdGFuY2VvZiBOb2RlCi0JCQkJfHwgZmFsc2UgPT0gdGFyZ2V0RU9iamVjdCBpbnN0YW5jZW9mIE5vZGUpIHsKLQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQl9Ci0JCU5vZGUgc291cmNlID0gKE5vZGUpIHNvdXJjZUVPYmplY3Q7Ci0JCU5vZGUgdGFyZ2V0ID0gKE5vZGUpIHRhcmdldEVPYmplY3Q7Ci0JCU5vZGUgY29udGFpbmVyID0gKE5vZGUpIGdldFJlbGF0aW9uc2hpcENvbnRhaW5lcihzb3VyY2UsCi0JCQkJTW9kZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXROb2RlKCksIHJlcS5nZXRFbGVtZW50VHlwZSgpKTsKLQkJaWYgKGNvbnRhaW5lciA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJfQotCQlpZiAoIURpYWdyYW1CYXNlSXRlbVNlbWFudGljRWRpdFBvbGljeS5MaW5rQ29uc3RyYWludHMKLQkJCQkuY2FuQ3JlYXRlTGlua18zMDAxKGNvbnRhaW5lciwgc291cmNlLCB0YXJnZXQpKSB7Ci0JCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJfQotCQlpZiAocmVxLmdldENvbnRhaW5tZW50RmVhdHVyZSgpID09IG51bGwpIHsKLQkJCXJlcS5zZXRDb250YWlubWVudEZlYXR1cmUoTW9kZWxQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkuZ2V0Tm9kZV9PdXRnb2luZ0Nvbm5lY3Rpb25zKCkpOwotCQl9Ci0JCXJldHVybiBnZXRNU0xXcmFwcGVyKG5ldyBMaW5rQ3JlYXRlQ29tbWFuZChyZXEsIGNvbnRhaW5lciwgc291cmNlLAotCQkJCXRhcmdldCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgY29tbWFuZCB0byByZW9yaWVudCBFQ2xhc3MgYmFzZWQgbGluay4gTmV3IGxpbmsgdGFyZ2V0IG9yIHNvdXJjZQotCSAqIHNob3VsZCBiZSB0aGUgZG9tYWluIG1vZGVsIGVsZW1lbnQgYXNzb2NpYXRlZCB3aXRoIHRoaXMgbm9kZS4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0UmVvcmllbnRSZWxhdGlvbnNoaXBDb21tYW5kKAotCQkJUmVvcmllbnRSZWxhdGlvbnNoaXBSZXF1ZXN0IHJlcSkgewotCQlzd2l0Y2ggKGdldFZpc3VhbElEKHJlcSkpIHsKLQkJY2FzZSBMaW5rRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJcmV0dXJuIGdldE1TTFdyYXBwZXIobmV3IExpbmtSZW9yaWVudENvbW1hbmQocmVxKSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldFJlb3JpZW50UmVsYXRpb25zaGlwQ29tbWFuZChyZXEpOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvcG9saWNpZXMvV29ya1Byb2R1Y3RDb21wb3NpdGVDYW5vbmljYWxFZGl0UG9saWN5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L3BvbGljaWVzL1dvcmtQcm9kdWN0Q29tcG9zaXRlQ2Fub25pY2FsRWRpdFBvbGljeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMDQ1OTQ3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvcG9saWNpZXMvV29ya1Byb2R1Y3RDb21wb3NpdGVDYW5vbmljYWxFZGl0UG9saWN5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wb2xpY2llczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkNhbm9uaWNhbEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBhcnRzLldvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVFZGl0UGFydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5wYXJ0LkRpYWdyYW1WaXN1YWxJRFJlZ2lzdHJ5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlQ29udGFpbmVyOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFdvcmtQcm9kdWN0Q29tcG9zaXRlQ2Fub25pY2FsRWRpdFBvbGljeSBleHRlbmRzCi0JCUNhbm9uaWNhbEVkaXRQb2xpY3kgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBMaXN0IGdldFNlbWFudGljQ2hpbGRyZW5MaXN0KCkgewotCQlMaXN0IHJlc3VsdCA9IG5ldyBMaW5rZWRMaXN0KCk7Ci0JCUVPYmplY3QgbW9kZWxPYmplY3QgPSAoKFZpZXcpIGdldEhvc3QoKS5nZXRNb2RlbCgpKS5nZXRFbGVtZW50KCk7Ci0JCVZpZXcgdmlld09iamVjdCA9IChWaWV3KSBnZXRIb3N0KCkuZ2V0TW9kZWwoKTsKLQkJRU9iamVjdCBuZXh0VmFsdWU7Ci0JCWludCBub2RlVklEOwotCQlmb3IgKEl0ZXJhdG9yIHZhbHVlcyA9ICgoTm9kZUNvbnRhaW5lcikgbW9kZWxPYmplY3QpLmdldE5vZGVzKCkKLQkJCQkuaXRlcmF0b3IoKTsgdmFsdWVzLmhhc05leHQoKTspIHsKLQkJCW5leHRWYWx1ZSA9IChFT2JqZWN0KSB2YWx1ZXMubmV4dCgpOwotCQkJbm9kZVZJRCA9IERpYWdyYW1WaXN1YWxJRFJlZ2lzdHJ5LmdldE5vZGVWaXN1YWxJRCh2aWV3T2JqZWN0LAotCQkJCQluZXh0VmFsdWUpOwotCQkJaWYgKFdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZJRCkgewotCQkJCXJlc3VsdC5hZGQobmV4dFZhbHVlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIEBtb2RpZmllZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHNob3VsZERlbGV0ZVZpZXcoVmlldyB2aWV3KSB7Ci0JCXJldHVybiB2aWV3LmlzU2V0RWxlbWVudCgpCi0JCQkJJiYgdmlldy5nZXRFbGVtZW50KCkgIT0gbnVsbAotCQkJCSYmICh2aWV3LmdldEVsZW1lbnQoKS5lSXNQcm94eSgpIHx8IHZpZXcuZ2V0RWxlbWVudCgpIGluc3RhbmNlb2YgTm9kZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGVmYXVsdEZhY3RvcnlIaW50KCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvcG9saWNpZXMvV29ya1Byb2R1Y3RDb21wb3NpdGVHcmFwaGljYWxOb2RlRWRpdFBvbGljeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9wb2xpY2llcy9Xb3JrUHJvZHVjdENvbXBvc2l0ZUdyYXBoaWNhbE5vZGVFZGl0UG9saWN5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxZjZhMzkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9wb2xpY2llcy9Xb3JrUHJvZHVjdENvbXBvc2l0ZUdyYXBoaWNhbE5vZGVFZGl0UG9saWN5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wb2xpY2llczsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBXb3JrUHJvZHVjdENvbXBvc2l0ZUdyYXBoaWNhbE5vZGVFZGl0UG9saWN5IGV4dGVuZHMKLQkJRGlhZ3JhbUdyYXBoaWNhbE5vZGVFZGl0UG9saWN5IHsKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvcG9saWNpZXMvV29ya1Byb2R1Y3RDb21wb3NpdGVJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L3BvbGljaWVzL1dvcmtQcm9kdWN0Q29tcG9zaXRlSXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ODMwNTQ3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvcG9saWNpZXMvV29ya1Byb2R1Y3RDb21wb3NpdGVJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucG9saWNpZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbXBvdW5kQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLmNvbW1hbmRzLkRlc3Ryb3lFbGVtZW50Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkNyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5EZXN0cm95RWxlbWVudFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5SZW9yaWVudFJlbGF0aW9uc2hpcFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQuY29tbWFuZHMuTGlua0NyZWF0ZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQuY29tbWFuZHMuTGlua1Jlb3JpZW50Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5jb21tYW5kcy5Xb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlQ3JlYXRlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wYXJ0cy5MaW5rRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucGFydHMuV29ya1Byb2R1Y3RDb21wb3NpdGVXb3JrUHJvZHVjdENvbXBhcnRtZW50RWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucGFydHMuV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5wYXJ0LkRpYWdyYW1WaXN1YWxJRFJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQucHJvdmlkZXJzLkRpYWdyYW1FbGVtZW50VHlwZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5MaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk1vZGVsUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLlVuZXhlY3V0YWJsZUNvbW1hbmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLmNvbW1hbmRzLkNyZWF0ZUVsZW1lbnRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuY29tbWFuZHMuQ3JlYXRlUmVsYXRpb25zaGlwQ29tbWFuZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ3JlYXRlRWxlbWVudFJlcXVlc3Q7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgV29ya1Byb2R1Y3RDb21wb3NpdGVJdGVtU2VtYW50aWNFZGl0UG9saWN5IGV4dGVuZHMKLQkJRGlhZ3JhbUJhc2VJdGVtU2VtYW50aWNFZGl0UG9saWN5IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVDb21tYW5kKENyZWF0ZUVsZW1lbnRSZXF1ZXN0IHJlcSkgewotCQlpZiAoRGlhZ3JhbUVsZW1lbnRUeXBlcy5Xb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlXzIwMDMgPT0gcmVxCi0JCQkJLmdldEVsZW1lbnRUeXBlKCkpIHsKLQkJCWlmIChyZXEuZ2V0Q29udGFpbm1lbnRGZWF0dXJlKCkgPT0gbnVsbCkgewotCQkJCXJlcS5zZXRDb250YWlubWVudEZlYXR1cmUoTW9kZWxQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJLmdldE5vZGVDb250YWluZXJfTm9kZXMoKSk7Ci0JCQl9Ci0JCQlyZXR1cm4gZ2V0TVNMV3JhcHBlcihuZXcgV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZUNyZWF0ZUNvbW1hbmQocmVxKSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldENyZWF0ZUNvbW1hbmQocmVxKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0RGVzdHJveUVsZW1lbnRDb21tYW5kKERlc3Ryb3lFbGVtZW50UmVxdWVzdCByZXEpIHsKLQkJQ29tcG91bmRDb21tYW5kIGNjID0gZ2V0RGVzdHJveUVkZ2VzQ29tbWFuZChyZXEKLQkJCQkuaXNDb25maXJtYXRpb25SZXF1aXJlZCgpKTsKLQkJYWRkRGVzdHJveUNoaWxkTm9kZXNDb21tYW5kKGNjLCByZXEuaXNDb25maXJtYXRpb25SZXF1aXJlZCgpKTsKLQkJVmlldyB2aWV3ID0gKFZpZXcpIGdldEhvc3QoKS5nZXRNb2RlbCgpOwotCQlpZiAodmlldy5nZXRFQW5ub3RhdGlvbigiU2hvcnRjdXQiKSAhPSBudWxsKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXJlcS5zZXRFbGVtZW50VG9EZXN0cm95KHZpZXcpOwotCQl9Ci0JCWNjLmFkZChnZXRNU0xXcmFwcGVyKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQocmVxKSkpOwotCQlyZXR1cm4gY2MudW53cmFwKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZERlc3Ryb3lDaGlsZE5vZGVzQ29tbWFuZChDb21wb3VuZENvbW1hbmQgY21kLAotCQkJYm9vbGVhbiBjb25maXJtKSB7Ci0JCVZpZXcgdmlldyA9IChWaWV3KSBnZXRIb3N0KCkuZ2V0TW9kZWwoKTsKLQkJZm9yIChJdGVyYXRvciBpdCA9IHZpZXcuZ2V0Q2hpbGRyZW4oKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob2RlIG5vZGUgPSAob3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm9kZSkgaXQKLQkJCQkJLm5leHQoKTsKLQkJCXN3aXRjaCAoRGlhZ3JhbVZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQobm9kZSkpIHsKLQkJCWNhc2UgV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZUVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCQljbWQuYWRkKGdldERlc3Ryb3lFbGVtZW50Q29tbWFuZChub2RlLCBjb25maXJtKSk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFdvcmtQcm9kdWN0Q29tcG9zaXRlV29ya1Byb2R1Y3RDb21wYXJ0bWVudEVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCQlmb3IgKEl0ZXJhdG9yIGNpdCA9IG5vZGUuZ2V0Q2hpbGRyZW4oKS5pdGVyYXRvcigpOyBjaXQKLQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCW9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vZGUgY25vZGUgPSAob3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm9kZSkgY2l0Ci0JCQkJCQkJLm5leHQoKTsKLQkJCQkJc3dpdGNoIChEaWFncmFtVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRChjbm9kZSkpIHsKLQkJCQkJfQotCQkJCX0KLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVSZWxhdGlvbnNoaXBDb21tYW5kKENyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3QgcmVxKSB7Ci0JCWlmIChEaWFncmFtRWxlbWVudFR5cGVzLkxpbmtfMzAwMSA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgewotCQkJcmV0dXJuIHJlcS5nZXRUYXJnZXQoKSA9PSBudWxsID8gZ2V0Q3JlYXRlU3RhcnRPdXRnb2luZ0xpbmtfMzAwMUNvbW1hbmQocmVxKQotCQkJCQk6IGdldENyZWF0ZUNvbXBsZXRlSW5jb21pbmdMaW5rXzMwMDFDb21tYW5kKHJlcSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldENyZWF0ZVJlbGF0aW9uc2hpcENvbW1hbmQocmVxKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlU3RhcnRPdXRnb2luZ0xpbmtfMzAwMUNvbW1hbmQoCi0JCQlDcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0IHJlcSkgewotCQlFT2JqZWN0IHNvdXJjZUVPYmplY3QgPSByZXEuZ2V0U291cmNlKCk7Ci0JCWlmIChmYWxzZSA9PSBzb3VyY2VFT2JqZWN0IGluc3RhbmNlb2YgTm9kZSkgewotCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCX0KLQkJTm9kZSBzb3VyY2UgPSAoTm9kZSkgc291cmNlRU9iamVjdDsKLQkJTm9kZSBjb250YWluZXIgPSAoTm9kZSkgZ2V0UmVsYXRpb25zaGlwQ29udGFpbmVyKHNvdXJjZSwKLQkJCQlNb2RlbFBhY2thZ2UuZUlOU1RBTkNFLmdldE5vZGUoKSwgcmVxLmdldEVsZW1lbnRUeXBlKCkpOwotCQlpZiAoY29udGFpbmVyID09IG51bGwpIHsKLQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQl9Ci0JCWlmICghRGlhZ3JhbUJhc2VJdGVtU2VtYW50aWNFZGl0UG9saWN5LkxpbmtDb25zdHJhaW50cwotCQkJCS5jYW5DcmVhdGVMaW5rXzMwMDEoY29udGFpbmVyLCBzb3VyY2UsIG51bGwpKSB7Ci0JCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJfQotCQlyZXR1cm4gbmV3IENvbW1hbmQoKSB7Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZUNvbXBsZXRlSW5jb21pbmdMaW5rXzMwMDFDb21tYW5kKAotCQkJQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdCByZXEpIHsKLQkJRU9iamVjdCBzb3VyY2VFT2JqZWN0ID0gcmVxLmdldFNvdXJjZSgpOwotCQlFT2JqZWN0IHRhcmdldEVPYmplY3QgPSByZXEuZ2V0VGFyZ2V0KCk7Ci0JCWlmIChmYWxzZSA9PSBzb3VyY2VFT2JqZWN0IGluc3RhbmNlb2YgTm9kZQotCQkJCXx8IGZhbHNlID09IHRhcmdldEVPYmplY3QgaW5zdGFuY2VvZiBOb2RlKSB7Ci0JCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJfQotCQlOb2RlIHNvdXJjZSA9IChOb2RlKSBzb3VyY2VFT2JqZWN0OwotCQlOb2RlIHRhcmdldCA9IChOb2RlKSB0YXJnZXRFT2JqZWN0OwotCQlOb2RlIGNvbnRhaW5lciA9IChOb2RlKSBnZXRSZWxhdGlvbnNoaXBDb250YWluZXIoc291cmNlLAotCQkJCU1vZGVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Tm9kZSgpLCByZXEuZ2V0RWxlbWVudFR5cGUoKSk7Ci0JCWlmIChjb250YWluZXIgPT0gbnVsbCkgewotCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCX0KLQkJaWYgKCFEaWFncmFtQmFzZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuTGlua0NvbnN0cmFpbnRzCi0JCQkJLmNhbkNyZWF0ZUxpbmtfMzAwMShjb250YWluZXIsIHNvdXJjZSwgdGFyZ2V0KSkgewotCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCX0KLQkJaWYgKHJlcS5nZXRDb250YWlubWVudEZlYXR1cmUoKSA9PSBudWxsKSB7Ci0JCQlyZXEuc2V0Q29udGFpbm1lbnRGZWF0dXJlKE1vZGVsUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJLmdldE5vZGVfT3V0Z29pbmdDb25uZWN0aW9ucygpKTsKLQkJfQotCQlyZXR1cm4gZ2V0TVNMV3JhcHBlcihuZXcgTGlua0NyZWF0ZUNvbW1hbmQocmVxLCBjb250YWluZXIsIHNvdXJjZSwKLQkJCQl0YXJnZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGNvbW1hbmQgdG8gcmVvcmllbnQgRUNsYXNzIGJhc2VkIGxpbmsuIE5ldyBsaW5rIHRhcmdldCBvciBzb3VyY2UKLQkgKiBzaG91bGQgYmUgdGhlIGRvbWFpbiBtb2RlbCBlbGVtZW50IGFzc29jaWF0ZWQgd2l0aCB0aGlzIG5vZGUuCi0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldFJlb3JpZW50UmVsYXRpb25zaGlwQ29tbWFuZCgKLQkJCVJlb3JpZW50UmVsYXRpb25zaGlwUmVxdWVzdCByZXEpIHsKLQkJc3dpdGNoIChnZXRWaXN1YWxJRChyZXEpKSB7Ci0JCWNhc2UgTGlua0VkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCXJldHVybiBnZXRNU0xXcmFwcGVyKG5ldyBMaW5rUmVvcmllbnRDb21tYW5kKHJlcSkpOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRSZW9yaWVudFJlbGF0aW9uc2hpcENvbW1hbmQocmVxKTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L3BvbGljaWVzL1dvcmtQcm9kdWN0Q29tcG9zaXRlV29ya1Byb2R1Y3RDb21wYXJ0bWVudENhbm9uaWNhbEVkaXRQb2xpY3kuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvcG9saWNpZXMvV29ya1Byb2R1Y3RDb21wb3NpdGVXb3JrUHJvZHVjdENvbXBhcnRtZW50Q2Fub25pY2FsRWRpdFBvbGljeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYzE4OGI2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvcG9saWNpZXMvV29ya1Byb2R1Y3RDb21wb3NpdGVXb3JrUHJvZHVjdENvbXBhcnRtZW50Q2Fub25pY2FsRWRpdFBvbGljeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucG9saWNpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5DYW5vbmljYWxFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgV29ya1Byb2R1Y3RDb21wb3NpdGVXb3JrUHJvZHVjdENvbXBhcnRtZW50Q2Fub25pY2FsRWRpdFBvbGljeQotCQlleHRlbmRzIENhbm9uaWNhbEVkaXRQb2xpY3kgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBMaXN0IGdldFNlbWFudGljQ2hpbGRyZW5MaXN0KCkgewotCQlMaXN0IHJlc3VsdCA9IG5ldyBMaW5rZWRMaXN0KCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHNob3VsZERlbGV0ZVZpZXcoVmlldyB2aWV3KSB7Ci0JCXJldHVybiB2aWV3LmlzU2V0RWxlbWVudCgpICYmIHZpZXcuZ2V0RWxlbWVudCgpICE9IG51bGwKLQkJCQkmJiB2aWV3LmdldEVsZW1lbnQoKS5lSXNQcm94eSgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERlZmF1bHRGYWN0b3J5SGludCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L3BvbGljaWVzL1dvcmtQcm9kdWN0Q29tcG9zaXRlV29ya1Byb2R1Y3RDb21wYXJ0bWVudEl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvcG9saWNpZXMvV29ya1Byb2R1Y3RDb21wb3NpdGVXb3JrUHJvZHVjdENvbXBhcnRtZW50SXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNWQ4YTNhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvcG9saWNpZXMvV29ya1Byb2R1Y3RDb21wb3NpdGVXb3JrUHJvZHVjdENvbXBhcnRtZW50SXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucG9saWNpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ3JlYXRlRWxlbWVudFJlcXVlc3Q7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgV29ya1Byb2R1Y3RDb21wb3NpdGVXb3JrUHJvZHVjdENvbXBhcnRtZW50SXRlbVNlbWFudGljRWRpdFBvbGljeQotCQlleHRlbmRzIERpYWdyYW1CYXNlSXRlbVNlbWFudGljRWRpdFBvbGljeSB7Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvcG9saWNpZXMvV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZUNhbm9uaWNhbEVkaXRQb2xpY3kuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvcG9saWNpZXMvV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZUNhbm9uaWNhbEVkaXRQb2xpY3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDk2ZmNlNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L3BvbGljaWVzL1dvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVDYW5vbmljYWxFZGl0UG9saWN5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wb2xpY2llczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkNhbm9uaWNhbEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlQ2Fub25pY2FsRWRpdFBvbGljeSBleHRlbmRzCi0JCUNhbm9uaWNhbEVkaXRQb2xpY3kgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBMaXN0IGdldFNlbWFudGljQ2hpbGRyZW5MaXN0KCkgewotCQlMaXN0IHJlc3VsdCA9IG5ldyBMaW5rZWRMaXN0KCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHNob3VsZERlbGV0ZVZpZXcoVmlldyB2aWV3KSB7Ci0JCXJldHVybiB2aWV3LmlzU2V0RWxlbWVudCgpICYmIHZpZXcuZ2V0RWxlbWVudCgpICE9IG51bGwKLQkJCQkmJiB2aWV3LmdldEVsZW1lbnQoKS5lSXNQcm94eSgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERlZmF1bHRGYWN0b3J5SGludCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L3BvbGljaWVzL1dvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVHcmFwaGljYWxOb2RlRWRpdFBvbGljeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9wb2xpY2llcy9Xb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGU0M2U0OC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L3BvbGljaWVzL1dvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVHcmFwaGljYWxOb2RlRWRpdFBvbGljeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucG9saWNpZXM7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZUdyYXBoaWNhbE5vZGVFZGl0UG9saWN5IGV4dGVuZHMKLQkJRGlhZ3JhbUdyYXBoaWNhbE5vZGVFZGl0UG9saWN5IHsKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvcG9saWNpZXMvV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvcG9saWNpZXMvV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTRhNzVlZi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L3BvbGljaWVzL1dvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucG9saWNpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tcG91bmRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuY29tbWFuZHMuRGVzdHJveUVsZW1lbnRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkRlc3Ryb3lFbGVtZW50UmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLlJlb3JpZW50UmVsYXRpb25zaGlwUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5jb21tYW5kcy5MaW5rQ3JlYXRlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5jb21tYW5kcy5MaW5rUmVvcmllbnRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBhcnRzLkxpbmtFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLnByb3ZpZGVycy5EaWFncmFtRWxlbWVudFR5cGVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Nb2RlbFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5VbmV4ZWN1dGFibGVDb21tYW5kOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5jb21tYW5kcy5DcmVhdGVSZWxhdGlvbnNoaXBDb21tYW5kOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVJdGVtU2VtYW50aWNFZGl0UG9saWN5IGV4dGVuZHMKLQkJRGlhZ3JhbUJhc2VJdGVtU2VtYW50aWNFZGl0UG9saWN5IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXREZXN0cm95RWxlbWVudENvbW1hbmQoRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHJlcSkgewotCQlDb21wb3VuZENvbW1hbmQgY2MgPSBnZXREZXN0cm95RWRnZXNDb21tYW5kKHJlcQotCQkJCS5pc0NvbmZpcm1hdGlvblJlcXVpcmVkKCkpOwotCQljYy5hZGQoZ2V0TVNMV3JhcHBlcihuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKHJlcSkpKTsKLQkJcmV0dXJuIGNjLnVud3JhcCgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVSZWxhdGlvbnNoaXBDb21tYW5kKENyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3QgcmVxKSB7Ci0JCWlmIChEaWFncmFtRWxlbWVudFR5cGVzLkxpbmtfMzAwMSA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgewotCQkJcmV0dXJuIHJlcS5nZXRUYXJnZXQoKSA9PSBudWxsID8gZ2V0Q3JlYXRlU3RhcnRPdXRnb2luZ0xpbmtfMzAwMUNvbW1hbmQocmVxKQotCQkJCQk6IGdldENyZWF0ZUNvbXBsZXRlSW5jb21pbmdMaW5rXzMwMDFDb21tYW5kKHJlcSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldENyZWF0ZVJlbGF0aW9uc2hpcENvbW1hbmQocmVxKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlU3RhcnRPdXRnb2luZ0xpbmtfMzAwMUNvbW1hbmQoCi0JCQlDcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0IHJlcSkgewotCQlFT2JqZWN0IHNvdXJjZUVPYmplY3QgPSByZXEuZ2V0U291cmNlKCk7Ci0JCWlmIChmYWxzZSA9PSBzb3VyY2VFT2JqZWN0IGluc3RhbmNlb2YgTm9kZSkgewotCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCX0KLQkJTm9kZSBzb3VyY2UgPSAoTm9kZSkgc291cmNlRU9iamVjdDsKLQkJTm9kZSBjb250YWluZXIgPSAoTm9kZSkgZ2V0UmVsYXRpb25zaGlwQ29udGFpbmVyKHNvdXJjZSwKLQkJCQlNb2RlbFBhY2thZ2UuZUlOU1RBTkNFLmdldE5vZGUoKSwgcmVxLmdldEVsZW1lbnRUeXBlKCkpOwotCQlpZiAoY29udGFpbmVyID09IG51bGwpIHsKLQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQl9Ci0JCWlmICghRGlhZ3JhbUJhc2VJdGVtU2VtYW50aWNFZGl0UG9saWN5LkxpbmtDb25zdHJhaW50cwotCQkJCS5jYW5DcmVhdGVMaW5rXzMwMDEoY29udGFpbmVyLCBzb3VyY2UsIG51bGwpKSB7Ci0JCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJfQotCQlyZXR1cm4gbmV3IENvbW1hbmQoKSB7Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZUNvbXBsZXRlSW5jb21pbmdMaW5rXzMwMDFDb21tYW5kKAotCQkJQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdCByZXEpIHsKLQkJRU9iamVjdCBzb3VyY2VFT2JqZWN0ID0gcmVxLmdldFNvdXJjZSgpOwotCQlFT2JqZWN0IHRhcmdldEVPYmplY3QgPSByZXEuZ2V0VGFyZ2V0KCk7Ci0JCWlmIChmYWxzZSA9PSBzb3VyY2VFT2JqZWN0IGluc3RhbmNlb2YgTm9kZQotCQkJCXx8IGZhbHNlID09IHRhcmdldEVPYmplY3QgaW5zdGFuY2VvZiBOb2RlKSB7Ci0JCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJfQotCQlOb2RlIHNvdXJjZSA9IChOb2RlKSBzb3VyY2VFT2JqZWN0OwotCQlOb2RlIHRhcmdldCA9IChOb2RlKSB0YXJnZXRFT2JqZWN0OwotCQlOb2RlIGNvbnRhaW5lciA9IChOb2RlKSBnZXRSZWxhdGlvbnNoaXBDb250YWluZXIoc291cmNlLAotCQkJCU1vZGVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Tm9kZSgpLCByZXEuZ2V0RWxlbWVudFR5cGUoKSk7Ci0JCWlmIChjb250YWluZXIgPT0gbnVsbCkgewotCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCX0KLQkJaWYgKCFEaWFncmFtQmFzZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuTGlua0NvbnN0cmFpbnRzCi0JCQkJLmNhbkNyZWF0ZUxpbmtfMzAwMShjb250YWluZXIsIHNvdXJjZSwgdGFyZ2V0KSkgewotCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCX0KLQkJaWYgKHJlcS5nZXRDb250YWlubWVudEZlYXR1cmUoKSA9PSBudWxsKSB7Ci0JCQlyZXEuc2V0Q29udGFpbm1lbnRGZWF0dXJlKE1vZGVsUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJLmdldE5vZGVfT3V0Z29pbmdDb25uZWN0aW9ucygpKTsKLQkJfQotCQlyZXR1cm4gZ2V0TVNMV3JhcHBlcihuZXcgTGlua0NyZWF0ZUNvbW1hbmQocmVxLCBjb250YWluZXIsIHNvdXJjZSwKLQkJCQl0YXJnZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGNvbW1hbmQgdG8gcmVvcmllbnQgRUNsYXNzIGJhc2VkIGxpbmsuIE5ldyBsaW5rIHRhcmdldCBvciBzb3VyY2UKLQkgKiBzaG91bGQgYmUgdGhlIGRvbWFpbiBtb2RlbCBlbGVtZW50IGFzc29jaWF0ZWQgd2l0aCB0aGlzIG5vZGUuCi0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldFJlb3JpZW50UmVsYXRpb25zaGlwQ29tbWFuZCgKLQkJCVJlb3JpZW50UmVsYXRpb25zaGlwUmVxdWVzdCByZXEpIHsKLQkJc3dpdGNoIChnZXRWaXN1YWxJRChyZXEpKSB7Ci0JCWNhc2UgTGlua0VkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCXJldHVybiBnZXRNU0xXcmFwcGVyKG5ldyBMaW5rUmVvcmllbnRDb21tYW5kKHJlcSkpOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRSZW9yaWVudFJlbGF0aW9uc2hpcENvbW1hbmQocmVxKTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9wYXJ0L0FERGlhZ3JhbUVkaXRvci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvcGFydC9BRERpYWdyYW1FZGl0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTA5MWUxYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9wYXJ0L0FERGlhZ3JhbUVkaXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQucGFydDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkRlbGVnYXRpbmdMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkZyZWVmb3JtTGF5ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkxheWVyZWRQYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5BRERJbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucGFydHMuQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLnNlcnZpY2UuRGlhZ3JhbVJlc2V0U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLkRpYWdyYW1Db3JlUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuYWN0aW9ucy5EaWFncmFtQWN0aW9uc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5wYXJ0LkFic3RyYWN0RGlhZ3JhbUVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnBhcnQudXRpbC5EaWFncmFtRWRpdG9yVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnV0aWwuRGlhZ3JhbUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5BY3Rpdml0eURldGFpbERpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuRGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuR3JhcGhpY2FsVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5MYXllckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmFjdGlvbnMuQWN0aW9uSWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLkRpYWdyYW1Sb290RWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuTm90ZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklDb250cmlidXRpb25JdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKgotICogQHNpbmNlIDEuMgotICovCi1wdWJsaWMgY2xhc3MgQUREaWFncmFtRWRpdG9yIGV4dGVuZHMgQWJzdHJhY3REaWFncmFtRWRpdG9yIHsKLQotCURpYWdyYW1BY3Rpb25zU2VydmljZSBhY3Rpb25TZXJ2aWNlID0gbnVsbDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlR3JhcGhpY2FsVmlld2VyKCkgewotCQlzdXBlci5jb25maWd1cmVHcmFwaGljYWxWaWV3ZXIoKTsKLQkJRGlhZ3JhbVJvb3RFZGl0UGFydCByb290ID0gKERpYWdyYW1Sb290RWRpdFBhcnQpIGdldERpYWdyYW1HcmFwaGljYWxWaWV3ZXIoKQotCQkJCS5nZXRSb290RWRpdFBhcnQoKTsKLQkJTGF5ZXJlZFBhbmUgcHJpbnRhYmxlTGF5ZXJzID0gKExheWVyZWRQYW5lKSByb290Ci0JCQkJLmdldExheWVyKExheWVyQ29uc3RhbnRzLlBSSU5UQUJMRV9MQVlFUlMpOwotCQlGcmVlZm9ybUxheWVyIGV4dExhYmVsc0xheWVyID0gbmV3IEZyZWVmb3JtTGF5ZXIoKTsKLQkJZXh0TGFiZWxzTGF5ZXIuc2V0TGF5b3V0TWFuYWdlcihuZXcgRGVsZWdhdGluZ0xheW91dCgpKTsKLS8vCQlwcmludGFibGVMYXllcnMuYWRkTGF5ZXJBZnRlcihleHRMYWJlbHNMYXllciwKLS8vCQkJCURpYWdyYW1FZGl0UGFydEZhY3RvcnkuRVhURVJOQUxfTk9ERV9MQUJFTFNfTEFZRVIsCi0vLwkJCQlMYXllckNvbnN0YW50cy5QUklNQVJZX0xBWUVSKTsKLQkJTGF5ZXJlZFBhbmUgc2NhbGFibGVMYXllcnMgPSAoTGF5ZXJlZFBhbmUpIHJvb3QKLQkJCQkuZ2V0TGF5ZXIoTGF5ZXJDb25zdGFudHMuU0NBTEFCTEVfTEFZRVJTKTsKLQkJRnJlZWZvcm1MYXllciBzY2FsZWRGZWVkYmFja0xheWVyID0gbmV3IEZyZWVmb3JtTGF5ZXIoKTsKLQkJc2NhbGVkRmVlZGJhY2tMYXllci5zZXRFbmFibGVkKGZhbHNlKTsKLQkJc2NhbGFibGVMYXllcnMuYWRkTGF5ZXJBZnRlcihzY2FsZWRGZWVkYmFja0xheWVyLAotCQkJCUxheWVyQ29uc3RhbnRzLlNDQUxFRF9GRUVEQkFDS19MQVlFUiwKLQkJCQlEaWFncmFtUm9vdEVkaXRQYXJ0LkRFQ09SQVRJT05fVU5QUklOVEFCTEVfTEFZRVIpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldEdyYXBoaWNhbFZpZXdlcihHcmFwaGljYWxWaWV3ZXIgdmlld2VyKSB7Ci0JCXN1cGVyLnNldEdyYXBoaWNhbFZpZXdlcih2aWV3ZXIpOwotCQlpZihhY3Rpb25TZXJ2aWNlICE9IG51bGwpewotCQkJYWN0aW9uU2VydmljZS5zZXRHcmFwaGljYWxWaWV3ZXIodmlld2VyKTsKLQkJfQotCX0KLQkvKioKLQkgKiBAYXV0aG9yIHNrYW5ub29yCi0JICovCi0JcHVibGljIHZvaWQgY2xlYW5VcERpYWdyYW0oKSB7Ci0JCURpYWdyYW1SZXNldFNlcnZpY2Ugc2VydmljZSA9IG5ldyBEaWFncmFtUmVzZXRTZXJ2aWNlKGdldERpYWdyYW1NYW5hZ2VyKCkuZ2V0RWRpdGluZ0RvbWFpbigpLAotCQkJCWdldEdyYXBoaWNhbFZpZXdlcigpLCBnZXRFZGl0RG9tYWluKCksIGdldEFjdGlvblJlZ2lzdHJ5KCkpOwotCQlzZXJ2aWNlLmNsZWFuVXBEaWFncmFtKCk7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLkFic3RyYWN0RGlhZ3JhbUVkaXRvciNjb250cmlidXRlVG9Db250ZXh0TWVudShvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVNYW5hZ2VyKQotCSAqLwotCXB1YmxpYyB2b2lkIGNvbnRyaWJ1dGVUb0NvbnRleHRNZW51KElNZW51TWFuYWdlciBtZW51KSB7Ci0JCXN1cGVyLmNvbnRyaWJ1dGVUb0NvbnRleHRNZW51KG1lbnUpOwotCi0JCQotCQlib29sZWFuIGNhbk1vZGlmeSA9IGlzRWRpdGFibGUoKTsKLQotCQlJQWN0aW9uIGFjdGlvbiA9IGdldEFjdGlvblJlZ2lzdHJ5KCkuZ2V0QWN0aW9uKERpYWdyYW1Db25zdGFudHMuUkVTRVRfRElBR1JBTV9MQVlPVVQpOwotCQlpZiAoYWN0aW9uLmlzRW5hYmxlZCgpICYmIGNhbk1vZGlmeSkgewotCQkJbWVudS5pbnNlcnRCZWZvcmUoQWN0aW9uSWRzLkFDVElPTl9TSE9XX1BST1BFUlRJRVNfVklFVywgYWN0aW9uKTsKLQkJfQotCQlJQ29udHJpYnV0aW9uSXRlbSBpdGVtID0gbWVudS5maW5kKEFjdGlvbklkcy5BQ1RJT05fVE9PTEJBUl9BUlJBTkdFX0FMTCk7Ci0JCWlmKGl0ZW0gIT0gbnVsbCl7Ci0JCQlpdGVtLnNldFZpc2libGUoZmFsc2UpOwotCQl9Ci0JCUlDb250cmlidXRpb25JdGVtIGl0ZW0xID0gbWVudS5maW5kKEFjdGlvbklkcy5NRU5VX0ZPUk1BVCk7Ci0JCWlmKGl0ZW0xICE9IG51bGwpewotCQkJaWYoaXRlbTEgaW5zdGFuY2VvZiBJTWVudU1hbmFnZXIpewotCQkJCSgoSU1lbnVNYW5hZ2VyKWl0ZW0xKS5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJCX0KLQkJfQotCQkKLQl9Ci0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLkFic3RyYWN0RGlhZ3JhbUVkaXRvciNjcmVhdGVBY3Rpb25zKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBY3Rpb25zKCkgewotCQlzdXBlci5jcmVhdGVBY3Rpb25zKCk7Ci0JCUFjdGlvbiByZXNldExheW91dEFjdGlvbiA9IG5ldyBBY3Rpb24oCi0JCQkJRGlhZ3JhbUNvcmVSZXNvdXJjZXMuQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9yX1Jlc2V0RGlhZ3JhbUxheW91dF90ZXh0KSB7IC8vJE5PTi1OTFMtMSQKLQotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCS8vZ2V0QWN0aW9uUmVnaXN0cnkoKS5nZXRBY3Rpb24oRGlhZ3JhbUNvbnN0YW50cy5SRUZSRVNIKS5ydW4oKTsKLQkJCQlEaWFncmFtRWRpdG9yVXRpbC5yZWZyZXNoKGdldERpYWdyYW1FZGl0UGFydCgpLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJCQlpZiAoZ2V0R3JhcGhpY2FsVmlld2VyKCkuZ2V0Q29udGVudHMoKSBpbnN0YW5jZW9mIEFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRQYXJ0KSB7Ci0JCQkJCUFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRQYXJ0IGRlcCA9IChBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0UGFydCkgZ2V0R3JhcGhpY2FsVmlld2VyKCkKLQkJCQkJCQkuZ2V0Q29udGVudHMoKTsKLQkJCQkJTGlzdDxFZGl0UGFydD4gbG9jYWwgPSBuZXcgQXJyYXlMaXN0PEVkaXRQYXJ0PigpOwotCQkJCQlpZihkZXAuZ2V0Q2hpbGRyZW4oKSAhPSBudWxsICYmICFkZXAuZ2V0Q2hpbGRyZW4oKS5pc0VtcHR5KCkpewotCQkJCQkJZm9yKEl0ZXJhdG9yIGl0ZXJhdG9yID0gZGVwLmdldENoaWxkcmVuKCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOyl7Ci0JCQkJCQkJT2JqZWN0IG5leHQgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCQkJaWYoIShuZXh0IGluc3RhbmNlb2YgTm90ZUVkaXRQYXJ0KSl7Ci0JCQkJCQkJCWxvY2FsLmFkZCgoRWRpdFBhcnQpbmV4dCk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWRlcC5nZXRSZWNlbnRseUFkZGVkUGFydHMoKS5hZGRBbGwobG9jYWwpOwotCQkJCQljbGVhblVwRGlhZ3JhbSgpOwotCQkJCX0KLQkJCX0KLQotCQkJcHVibGljIGJvb2xlYW4gaXNFbmFibGVkKCkgewotCQkJCXJldHVybiBnZXRHcmFwaGljYWxWaWV3ZXIoKS5nZXRTZWxlY3RlZEVkaXRQYXJ0cygpLnNpemUoKSA9PSAwOwotCQkJfQotCi0JCQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQkJCXJldHVybiBEaWFncmFtQ29uc3RhbnRzLlJFU0VUX0RJQUdSQU1fTEFZT1VUOwotCQkJfQotCi0JCX07Ci0JCXJlc2V0TGF5b3V0QWN0aW9uLnNldERpc2FibGVkSW1hZ2VEZXNjcmlwdG9yKEFEREltYWdlcy5ESVNBQkxFRF9JTUdfREVTQ19SRVNFVF9ESUFHUkFNX0xBWU9VVCk7Ci0JCXJlc2V0TGF5b3V0QWN0aW9uLnNldEltYWdlRGVzY3JpcHRvcihBRERJbWFnZXMuSU1HX0RFU0NfUkVTRVRfRElBR1JBTV9MQVlPVVQpOwotCQlnZXRBY3Rpb25SZWdpc3RyeSgpLnJlZ2lzdGVyQWN0aW9uKHJlc2V0TGF5b3V0QWN0aW9uKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVzZXRMYXlvdXQoKSB7Ci0JCWlmKCgoQWN0aXZpdHlEZXRhaWxEaWFncmFtKWdldERpYWdyYW0oKS5nZXRFbGVtZW50KCkpLmlzQXV0b0xheW91dCgpKXsKLQkJCUlBY3Rpb24gYWN0aW9uID0gZ2V0QWN0aW9uUmVnaXN0cnkoKS5nZXRBY3Rpb24oRGlhZ3JhbUNvbnN0YW50cy5SRVNFVF9ESUFHUkFNX0xBWU9VVCk7Ci0JCQlhY3Rpb24ucnVuKCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlsYXlvdXRSZWNlbnRseUFkZGVkKCk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGxheW91dFJlY2VudGx5QWRkZWQoKSB7Ci0JCWdldEdyYXBoaWNhbFZpZXdlcigpLmdldENvbnRlbnRzKCkucmVmcmVzaCgpOwotCQlnZXREaWFncmFtRWRpdFBhcnQoKS5nZXRWaWV3cG9ydCgpLnZhbGlkYXRlKCk7Ci0JCWNsZWFuVXBEaWFncmFtKCk7Ci0JCUVPYmplY3QgZGlhZ3JhbUVsZW1lbnQgPSBnZXREaWFncmFtKCkuZ2V0RWxlbWVudCgpOwotCQlpZihkaWFncmFtRWxlbWVudCBpbnN0YW5jZW9mIERpYWdyYW0pewotCQkJQWN0aXZpdHkgYWN0aXZpdHkgPSAoQWN0aXZpdHkpKChEaWFncmFtKWRpYWdyYW1FbGVtZW50KS5nZXRMaW5rZWRFbGVtZW50KCk7Ci0JCQlpZihUbmdVdGlsLmlzTG9ja2VkKGFjdGl2aXR5KSl7Ci0JCQkJLy8gRmx1c2ggYWxsIGNvbW1hbmRzLCBtZWFucyB3aWxsIG5vdCBzYXZlLgotCQkJCWdldENvbW1hbmRTdGFjaygpLmZsdXNoKCk7Ci0JCQkJLy8gRmlyZSBkaXJ0eSBmbGFnIHByb3BlcnR5IGNoYW5nZSwgbm8gZGlydHkgZmxhZyBvbiBlZGl0b3IuCi0JCQkJZmlyZVByb3BlcnR5Q2hhbmdlKFBST1BfRElSVFkpOwotCQkJfQotCQl9Ci0JfQotCQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UGFydE5hbWVQcmVmaXgoKSB7Ci0JCXJldHVybiBEaWFncmFtQ29yZVJlc291cmNlcy5BY3Rpdml0eURldGFpbERpYWdyYW1fcHJlZml4OyAvLyROT04tTkxTLTEkCi0JfQotCQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwcm90ZWN0ZWQgSW1hZ2UgZ2V0UGFydEltYWdlKCkgewotCQlyZXR1cm4gQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0U2hhcmVkSW1hZ2UoCi0JCQkJImZ1bGwvZXRvb2wxNi9BRERFZGl0b3IuZ2lmIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCQotCS8qKgotCSAqIENsaWVudHMgY2FsbCB0aGlzIG1lZXRob2QgaWYgbmVlZGVkIHRvIHJlZnJlc2ggYW5kIGRvIHJlc2V0IGxheW91dCBmb3IgCi0JICogYWN0aXZpdHkgZGV0YWlsIGRpYWdyYW0gd2hvc2UgYXR0cmlidXRlIGlzIGF1dG9sYXlvdXQgPSB0cnVlLgotCSAqLwotCXB1YmxpYyB2b2lkIHJ1blJlc2V0TGF5b3V0QWN0aW9uKCl7Ci0JCWxheW91dFJlY2VudGx5QWRkZWQoKTsKLQkJaWYoKChBY3Rpdml0eURldGFpbERpYWdyYW0pZ2V0RGlhZ3JhbSgpLmdldEVsZW1lbnQoKSkuaXNBdXRvTGF5b3V0KCkpewotCQkJSUFjdGlvbiBhY3Rpb24gPSBnZXRBY3Rpb25SZWdpc3RyeSgpLmdldEFjdGlvbihEaWFncmFtQ29uc3RhbnRzLlJFU0VUX0RJQUdSQU1fTEFZT1VUKTsKLQkJCWFjdGlvbi5ydW4oKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL3BhcnQvQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9yLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9wYXJ0L0FjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMTI4N2MyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL3BhcnQvQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLnBhcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51aS5VUklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVpLmVkaXRvcnMuSU1ldGhvZEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucGFsZXR0ZS5QYWxldHRlUm9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMubWFya2VyLk1hcmtlck5hdmlnYXRpb25TZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5wcmVmZXJlbmNlcy5QcmVmZXJlbmNlc0hpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXNvdXJjZXMuZWRpdG9yLmRvY3VtZW50LklEaWFncmFtRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXNvdXJjZXMuZWRpdG9yLmRvY3VtZW50LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlc291cmNlcy5lZGl0b3IuZG9jdW1lbnQuSURvY3VtZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXNvdXJjZXMuZWRpdG9yLnBhcnRzLkRpYWdyYW1Eb2N1bWVudEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkVycm9yRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSU1lc3NhZ2VQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yTWF0Y2hpbmdTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklGaWxlRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLlNhdmVBc0RpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pZGUuSUdvdG9NYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5GaWxlRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5JUHJvcGVydHlTaGVldFBhZ2U7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9yIGV4dGVuZHMgRGlhZ3JhbURvY3VtZW50RWRpdG9yCi0JCWltcGxlbWVudHMgSUdvdG9NYXJrZXIsIElNZXRob2RFZGl0b3IgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEID0gIm9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5wYXJ0LkFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvcklEIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0b3IoKSB7Ci0JCXN1cGVyKHRydWUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUGFsZXR0ZVJvb3QgY3JlYXRlUGFsZXR0ZVJvb3QoUGFsZXR0ZVJvb3QgZXhpc3RpbmdQYWxldHRlUm9vdCkgewotCQlQYWxldHRlUm9vdCByb290ID0gc3VwZXIuY3JlYXRlUGFsZXR0ZVJvb3QoZXhpc3RpbmdQYWxldHRlUm9vdCk7Ci0JCW5ldyBEaWFncmFtUGFsZXR0ZUZhY3RvcnkoKS5maWxsUGFsZXR0ZShyb290KTsKLQkJcmV0dXJuIHJvb3Q7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldERvY3VtZW50UHJvdmlkZXIoSUVkaXRvcklucHV0IGlucHV0KSB7Ci0JCWlmIChpbnB1dCBpbnN0YW5jZW9mIElGaWxlRWRpdG9ySW5wdXQKLQkJCQl8fCBpbnB1dCBpbnN0YW5jZW9mIFVSSUVkaXRvcklucHV0KSB7Ci0JCQlzZXREb2N1bWVudFByb3ZpZGVyKEFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpCi0JCQkJCS5nZXREb2N1bWVudFByb3ZpZGVyKCkpOwotCQl9IGVsc2UgewotCQkJc3VwZXIuc2V0RG9jdW1lbnRQcm92aWRlcihpbnB1dCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZ290b01hcmtlcihJTWFya2VyIG1hcmtlcikgewotCQlNYXJrZXJOYXZpZ2F0aW9uU2VydmljZS5nZXRJbnN0YW5jZSgpLmdvdG9NYXJrZXIodGhpcywgbWFya2VyKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTYXZlQXNBbGxvd2VkKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZG9TYXZlQXMoKSB7Ci0JCXBlcmZvcm1TYXZlQXMobmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1TYXZlQXMoSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzc01vbml0b3IpIHsKLQkJU2hlbGwgc2hlbGwgPSBnZXRTaXRlKCkuZ2V0U2hlbGwoKTsKLQkJSUVkaXRvcklucHV0IGlucHV0ID0gZ2V0RWRpdG9ySW5wdXQoKTsKLQkJU2F2ZUFzRGlhbG9nIGRpYWxvZyA9IG5ldyBTYXZlQXNEaWFsb2coc2hlbGwpOwotCQlJRmlsZSBvcmlnaW5hbCA9IGlucHV0IGluc3RhbmNlb2YgSUZpbGVFZGl0b3JJbnB1dCA/ICgoSUZpbGVFZGl0b3JJbnB1dCkgaW5wdXQpCi0JCQkJLmdldEZpbGUoKQotCQkJCTogbnVsbDsKLQkJaWYgKG9yaWdpbmFsICE9IG51bGwpIHsKLQkJCWRpYWxvZy5zZXRPcmlnaW5hbEZpbGUob3JpZ2luYWwpOwotCQl9Ci0JCWRpYWxvZy5jcmVhdGUoKTsKLQkJSURvY3VtZW50UHJvdmlkZXIgcHJvdmlkZXIgPSBnZXREb2N1bWVudFByb3ZpZGVyKCk7Ci0JCWlmIChwcm92aWRlciA9PSBudWxsKSB7Ci0JCQkvLyBlZGl0b3IgaGFzIGJlZW4gcHJvZ3JhbW1hdGljYWxseSBjbG9zZWQgd2hpbGUgdGhlIGRpYWxvZyB3YXMgb3BlbgotCQkJcmV0dXJuOwotCQl9Ci0JCWlmIChwcm92aWRlci5pc0RlbGV0ZWQoaW5wdXQpICYmIG9yaWdpbmFsICE9IG51bGwpIHsKLQkJCVN0cmluZyBtZXNzYWdlID0gTkxTLmJpbmQoCi0JCQkJCSJUaGUgb3JpZ2luYWwgZmlsZSAnJ3swfScnIGhhcyBiZWVuIGRlbGV0ZWQuIiwgb3JpZ2luYWwKLQkJCQkJCQkuZ2V0TmFtZSgpKTsKLQkJCWRpYWxvZy5zZXRFcnJvck1lc3NhZ2UobnVsbCk7Ci0JCQlkaWFsb2cuc2V0TWVzc2FnZShtZXNzYWdlLCBJTWVzc2FnZVByb3ZpZGVyLldBUk5JTkcpOwotCQl9Ci0JCWlmIChkaWFsb2cub3BlbigpID09IFdpbmRvdy5DQU5DRUwpIHsKLQkJCWlmIChwcm9ncmVzc01vbml0b3IgIT0gbnVsbCkgewotCQkJCXByb2dyZXNzTW9uaXRvci5zZXRDYW5jZWxlZCh0cnVlKTsKLQkJCX0KLQkJCXJldHVybjsKLQkJfQotCQlJUGF0aCBmaWxlUGF0aCA9IGRpYWxvZy5nZXRSZXN1bHQoKTsKLQkJaWYgKGZpbGVQYXRoID09IG51bGwpIHsKLQkJCWlmIChwcm9ncmVzc01vbml0b3IgIT0gbnVsbCkgewotCQkJCXByb2dyZXNzTW9uaXRvci5zZXRDYW5jZWxlZCh0cnVlKTsKLQkJCX0KLQkJCXJldHVybjsKLQkJfQotCQlJV29ya3NwYWNlUm9vdCB3b3Jrc3BhY2VSb290ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKLQkJSUZpbGUgZmlsZSA9IHdvcmtzcGFjZVJvb3QuZ2V0RmlsZShmaWxlUGF0aCk7Ci0JCWZpbmFsIElFZGl0b3JJbnB1dCBuZXdJbnB1dCA9IG5ldyBGaWxlRWRpdG9ySW5wdXQoZmlsZSk7Ci0JCS8vIENoZWNrIGlmIHRoZSBlZGl0b3IgaXMgYWxyZWFkeSBvcGVuCi0JCUlFZGl0b3JNYXRjaGluZ1N0cmF0ZWd5IG1hdGNoaW5nU3RyYXRlZ3kgPSBnZXRFZGl0b3JEZXNjcmlwdG9yKCkKLQkJCQkuZ2V0RWRpdG9yTWF0Y2hpbmdTdHJhdGVneSgpOwotCQlJRWRpdG9yUmVmZXJlbmNlW10gZWRpdG9yUmVmcyA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkKLQkJCQkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0QWN0aXZlUGFnZSgpCi0JCQkJLmdldEVkaXRvclJlZmVyZW5jZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlZGl0b3JSZWZzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAobWF0Y2hpbmdTdHJhdGVneS5tYXRjaGVzKGVkaXRvclJlZnNbaV0sIG5ld0lucHV0KSkgewotCQkJCU1lc3NhZ2VEaWFsb2cKLQkJCQkJCS5vcGVuV2FybmluZyhzaGVsbCwgIlByb2JsZW0gRHVyaW5nIFNhdmUgQXMuLi4iLAotCQkJCQkJCQkiU2F2ZSBjb3VsZCBub3QgYmUgY29tcGxldGVkLiBUYXJnZXQgZmlsZSBpcyBhbHJlYWR5IG9wZW4gaW4gYW5vdGhlciBlZGl0b3IuIik7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCWJvb2xlYW4gc3VjY2VzcyA9IGZhbHNlOwotCQl0cnkgewotCQkJcHJvdmlkZXIuYWJvdXRUb0NoYW5nZShuZXdJbnB1dCk7Ci0JCQlnZXREb2N1bWVudFByb3ZpZGVyKG5ld0lucHV0KS5zYXZlRG9jdW1lbnQocHJvZ3Jlc3NNb25pdG9yLAotCQkJCQluZXdJbnB1dCwKLQkJCQkJZ2V0RG9jdW1lbnRQcm92aWRlcigpLmdldERvY3VtZW50KGdldEVkaXRvcklucHV0KCkpLCB0cnVlKTsKLQkJCXN1Y2Nlc3MgPSB0cnVlOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIHgpIHsKLQkJCUlTdGF0dXMgc3RhdHVzID0geC5nZXRTdGF0dXMoKTsKLQkJCWlmIChzdGF0dXMgPT0gbnVsbCB8fCBzdGF0dXMuZ2V0U2V2ZXJpdHkoKSAhPSBJU3RhdHVzLkNBTkNFTCkgewotCQkJCUVycm9yRGlhbG9nLm9wZW5FcnJvcihzaGVsbCwgIlNhdmUgUHJvYmxlbXMiLAotCQkJCQkJIkNvdWxkIG5vdCBzYXZlIGZpbGUuIiwgeC5nZXRTdGF0dXMoKSk7Ci0JCQl9Ci0JCX0gZmluYWxseSB7Ci0JCQlwcm92aWRlci5jaGFuZ2VkKG5ld0lucHV0KTsKLQkJCWlmIChzdWNjZXNzKSB7Ci0JCQkJc2V0SW5wdXQobmV3SW5wdXQpOwotCQkJfQotCQl9Ci0JCWlmIChwcm9ncmVzc01vbml0b3IgIT0gbnVsbCkgewotCQkJcHJvZ3Jlc3NNb25pdG9yLnNldENhbmNlbGVkKCFzdWNjZXNzKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBtb2RpZmllZAotCSAqLwotCXByb3RlY3RlZCBQcmVmZXJlbmNlc0hpbnQgZ2V0UHJlZmVyZW5jZXNIaW50KCkgewotCQlyZXR1cm4gbmV3IFByZWZlcmVuY2VzSGludChBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0b3JQbHVnaW4uSUQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgdHlwZSkgewotCQlpZiAodHlwZSA9PSBJUHJvcGVydHlTaGVldFBhZ2UuY2xhc3MpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRBZGFwdGVyKHR5cGUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSURvY3VtZW50UHJvdmlkZXIgZ2V0RG9jdW1lbnRQcm92aWRlcihJRWRpdG9ySW5wdXQgaW5wdXQpIHsKLQkJaWYgKGlucHV0IGluc3RhbmNlb2YgSUZpbGVFZGl0b3JJbnB1dAotCQkJCXx8IGlucHV0IGluc3RhbmNlb2YgVVJJRWRpdG9ySW5wdXQpIHsKLQkJCXJldHVybiBBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKQotCQkJCQkuZ2V0RG9jdW1lbnRQcm92aWRlcigpOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXREb2N1bWVudFByb3ZpZGVyKGlucHV0KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIGdldEVkaXRpbmdEb21haW4oKSB7Ci0JCUlEb2N1bWVudCBkb2N1bWVudCA9IGdldEVkaXRvcklucHV0KCkgIT0gbnVsbCA/IGdldERvY3VtZW50UHJvdmlkZXIoKQotCQkJCS5nZXREb2N1bWVudChnZXRFZGl0b3JJbnB1dCgpKSA6IG51bGw7Ci0JCWlmIChkb2N1bWVudCBpbnN0YW5jZW9mIElEaWFncmFtRG9jdW1lbnQpIHsKLQkJCXJldHVybiAoKElEaWFncmFtRG9jdW1lbnQpIGRvY3VtZW50KS5nZXRFZGl0aW5nRG9tYWluKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldEVkaXRpbmdEb21haW4oKTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9wYXJ0L0FjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvclBsdWdpbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvcGFydC9BY3Rpdml0eURldGFpbERpYWdyYW1FZGl0b3JQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjdjOTZlNS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9wYXJ0L0FjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvclBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjY2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5wYXJ0OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlZEFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5SZWZsZWN0aXZlSXRlbVByb3ZpZGVyQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIucmVzb3VyY2UuUmVzb3VyY2VJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5FeHRlbmRlZEltYWdlUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLkFjdGl2aXR5RGV0YWlsRGlhZ3JhbVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5wcm92aWRlci5Nb2RlbEl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuVW1hSXRlbVByb3ZpZGVyQWRhcHRlckZhY3Rvcnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUucHJlZmVyZW5jZXMuUHJlZmVyZW5jZXNIaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW47Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0KLS8qKgotICogQG1vZGlmaWVkCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0b3JQbHVnaW4gZXh0ZW5kcwotCQlBY3Rpdml0eURldGFpbERpYWdyYW1QbHVnaW4gewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEID0gIm9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFByZWZlcmVuY2VzSGludCBESUFHUkFNX1BSRUZFUkVOQ0VTX0hJTlQgPSBuZXcgUHJlZmVyZW5jZXNIaW50KAotCQkJSUQpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIEFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvclBsdWdpbiBpbnN0YW5jZTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIENvbXBvc2VkQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3Rvcnk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBEaWFncmFtRG9jdW1lbnRQcm92aWRlciBteURvY3VtZW50UHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvclBsdWdpbigpIHsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RhcnQoY29udGV4dCk7Ci0JCWluc3RhbmNlID0gdGhpczsKLQkJUHJlZmVyZW5jZXNIaW50LnJlZ2lzdGVyUHJlZmVyZW5jZVN0b3JlKERJQUdSQU1fUFJFRkVSRU5DRVNfSElOVCwKLQkJCQlnZXRQcmVmZXJlbmNlU3RvcmUoKSk7Ci0JCWFkYXB0ZXJGYWN0b3J5ID0gY3JlYXRlQWRhcHRlckZhY3RvcnkoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlhZGFwdGVyRmFjdG9yeS5kaXNwb3NlKCk7Ci0JCWFkYXB0ZXJGYWN0b3J5ID0gbnVsbDsKLQkJaW5zdGFuY2UgPSBudWxsOwotCQlzdXBlci5zdG9wKGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvclBsdWdpbiBnZXRJbnN0YW5jZSgpIHsKLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBjcmVhdGVBZGFwdGVyRmFjdG9yeSgpIHsKLQkJTGlzdCBmYWN0b3JpZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZpbGxJdGVtUHJvdmlkZXJGYWN0b3JpZXMoZmFjdG9yaWVzKTsKLQkJcmV0dXJuIG5ldyBDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KGZhY3Rvcmllcyk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZpbGxJdGVtUHJvdmlkZXJGYWN0b3JpZXMoTGlzdCBmYWN0b3JpZXMpIHsKLQkJZmFjdG9yaWVzLmFkZChuZXcgTW9kZWxJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpKTsKLQkJZmFjdG9yaWVzLmFkZChuZXcgTW9kZWxJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpKTsKLQkJZmFjdG9yaWVzLmFkZChuZXcgVW1hSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSk7Ci0JCWZhY3Rvcmllcy5hZGQobmV3IFJlc291cmNlSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSk7Ci0JCWZhY3Rvcmllcy5hZGQobmV3IFJlZmxlY3RpdmVJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXJGYWN0b3J5IGdldEl0ZW1Qcm92aWRlcnNBZGFwdGVyRmFjdG9yeSgpIHsKLQkJcmV0dXJuIGFkYXB0ZXJGYWN0b3J5OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSW1hZ2VEZXNjcmlwdG9yIGdldEl0ZW1JbWFnZURlc2NyaXB0b3IoT2JqZWN0IGl0ZW0pIHsKLQkJSUl0ZW1MYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIgPSAoSUl0ZW1MYWJlbFByb3ZpZGVyKSBhZGFwdGVyRmFjdG9yeQotCQkJCS5hZGFwdChpdGVtLCBJSXRlbUxhYmVsUHJvdmlkZXIuY2xhc3MpOwotCQlpZiAobGFiZWxQcm92aWRlciAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gRXh0ZW5kZWRJbWFnZVJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKAotCQkJCQlsYWJlbFByb3ZpZGVyLmdldEltYWdlKGl0ZW0pKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFuIGltYWdlIGRlc2NyaXB0b3IgZm9yIHRoZSBpbWFnZSBmaWxlIGF0IHRoZSBnaXZlbgotCSAqIHBsdWctaW4gcmVsYXRpdmUgcGF0aC4KLQkgKgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAcGFyYW0gcGF0aCB0aGUgcGF0aAotCSAqIEByZXR1cm4gdGhlIGltYWdlIGRlc2NyaXB0b3IKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEltYWdlRGVzY3JpcHRvciBnZXRCdW5kbGVkSW1hZ2VEZXNjcmlwdG9yKFN0cmluZyBwYXRoKSB7Ci0JCXJldHVybiBBYnN0cmFjdFVJUGx1Z2luLmltYWdlRGVzY3JpcHRvckZyb21QbHVnaW4oSUQsIHBhdGgpOwotCX0KLQotCS8qKgotCSAqIFJlc3BlY3RzIGltYWdlcyByZXNpZGluZyBpbiBhbnkgcGx1Zy1pbi4gSWYgcGF0aCBpcyByZWxhdGl2ZSwKLQkgKiB0aGVuIHRoaXMgYnVuZGxlIGlzIGxvb2tlZCB1cCBmb3IgdGhlIGltYWdlLCBvdGhlcndpc2UsIGZvciBhYnNvbHV0ZSAKLQkgKiBwYXRoLCBmaXJzdCBzZWdtZW50IGlzIHRha2VuIGFzIGlkIG9mIHBsdWctaW4gd2l0aCBpbWFnZQotCSAqCi0JICogQGdlbmVyYXRlZAotCSAqIEBwYXJhbSBwYXRoIHRoZSBwYXRoIHRvIGltYWdlLCBlaXRoZXIgYWJzb2x1dGUgKHdpdGggcGx1Zy1pbiBpZCBhcyBmaXJzdCBzZWdtZW50KSwgb3IgcmVsYXRpdmUgZm9yIGJ1bmRsZWQgaW1hZ2VzCi0JICogQHJldHVybiB0aGUgaW1hZ2UgZGVzY3JpcHRvcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSW1hZ2VEZXNjcmlwdG9yIGZpbmRJbWFnZURlc2NyaXB0b3IoU3RyaW5nIHBhdGgpIHsKLQkJZmluYWwgSVBhdGggcCA9IG5ldyBQYXRoKHBhdGgpOwotCQlpZiAocC5pc0Fic29sdXRlKCkgJiYgcC5zZWdtZW50Q291bnQoKSA+IDEpIHsKLQkJCXJldHVybiBBYnN0cmFjdFVJUGx1Z2luLmltYWdlRGVzY3JpcHRvckZyb21QbHVnaW4ocC5zZWdtZW50KDApLCBwCi0JCQkJCS5yZW1vdmVGaXJzdFNlZ21lbnRzKDEpLm1ha2VBYnNvbHV0ZSgpLnRvU3RyaW5nKCkpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIGdldEJ1bmRsZWRJbWFnZURlc2NyaXB0b3IocC5tYWtlQWJzb2x1dGUoKS50b1N0cmluZygpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgc3RyaW5nIGZyb20gcGx1Zy1pbidzIHJlc291cmNlIGJ1bmRsZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5KSB7Ci0JCXJldHVybiBQbGF0Zm9ybS5nZXRSZXNvdXJjZVN0cmluZyhnZXRJbnN0YW5jZSgpLmdldEJ1bmRsZSgpLCAiJSIgKyBrZXkpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhbiBpbWFnZSBmb3IgdGhlIGltYWdlIGZpbGUgYXQgdGhlIGdpdmVuIHBsdWctaW4gcmVsYXRpdmUgcGF0aC4KLQkgKiBDbGllbnQgZG8gbm90IG5lZWQgdG8gZGlzcG9zZSB0aGlzIGltYWdlLiBJbWFnZXMgd2lsbCBiZSBkaXNwb3NlZCBhdXRvbWF0aWNhbGx5LgotCSAqCi0JICogQGdlbmVyYXRlZAotCSAqIEBwYXJhbSBwYXRoIHRoZSBwYXRoCi0JICogQHJldHVybiBpbWFnZSBpbnN0YW5jZQotCSAqLwotCXB1YmxpYyBJbWFnZSBnZXRCdW5kbGVkSW1hZ2UoU3RyaW5nIHBhdGgpIHsKLQkJSW1hZ2UgaW1hZ2UgPSBnZXRJbWFnZVJlZ2lzdHJ5KCkuZ2V0KHBhdGgpOwotCQlpZiAoaW1hZ2UgPT0gbnVsbCkgewotCQkJZ2V0SW1hZ2VSZWdpc3RyeSgpLnB1dChwYXRoLCBnZXRCdW5kbGVkSW1hZ2VEZXNjcmlwdG9yKHBhdGgpKTsKLQkJCWltYWdlID0gZ2V0SW1hZ2VSZWdpc3RyeSgpLmdldChwYXRoKTsKLQkJfQotCQlyZXR1cm4gaW1hZ2U7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEaWFncmFtRG9jdW1lbnRQcm92aWRlciBnZXREb2N1bWVudFByb3ZpZGVyKCkgewotCQlpZiAobXlEb2N1bWVudFByb3ZpZGVyID09IG51bGwpIHsKLQkJCW15RG9jdW1lbnRQcm92aWRlciA9IG5ldyBEaWFncmFtRG9jdW1lbnRQcm92aWRlcigpOwotCQl9Ci0JCXJldHVybiBteURvY3VtZW50UHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGxvZ0Vycm9yKFN0cmluZyBlcnJvcikgewotCQlsb2dFcnJvcihlcnJvciwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHRocm93YWJsZSBhY3R1YWwgZXJyb3Igb3IgbnVsbCBjb3VsZCBiZSBwYXNzZWQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgbG9nRXJyb3IoU3RyaW5nIGVycm9yLCBUaHJvd2FibGUgdGhyb3dhYmxlKSB7Ci0JCWlmIChlcnJvciA9PSBudWxsICYmIHRocm93YWJsZSAhPSBudWxsKSB7Ci0JCQllcnJvciA9IHRocm93YWJsZS5nZXRNZXNzYWdlKCk7Ci0JCX0KLQkJZ2V0TG9nKCkubG9nKAotCQkJCW5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9yUGx1Z2luLklELAotCQkJCQkJSVN0YXR1cy5PSywgZXJyb3IsIHRocm93YWJsZSkpOwotCQlkZWJ1ZyhlcnJvciwgdGhyb3dhYmxlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgbG9nSW5mbyhTdHJpbmcgbWVzc2FnZSkgewotCQlsb2dJbmZvKG1lc3NhZ2UsIG51bGwpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSB0aHJvd2FibGUgYWN0dWFsIGVycm9yIG9yIG51bGwgY291bGQgYmUgcGFzc2VkCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGxvZ0luZm8oU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSB0aHJvd2FibGUpIHsKLQkJaWYgKG1lc3NhZ2UgPT0gbnVsbCAmJiB0aHJvd2FibGUgIT0gbnVsbCkgewotCQkJbWVzc2FnZSA9IHRocm93YWJsZS5nZXRNZXNzYWdlKCk7Ci0JCX0KLQkJZ2V0TG9nKCkubG9nKAotCQkJCW5ldyBTdGF0dXMoSVN0YXR1cy5JTkZPLCBBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0b3JQbHVnaW4uSUQsCi0JCQkJCQlJU3RhdHVzLk9LLCBtZXNzYWdlLCB0aHJvd2FibGUpKTsKLQkJZGVidWcobWVzc2FnZSwgdGhyb3dhYmxlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSB2b2lkIGRlYnVnKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgdGhyb3dhYmxlKSB7Ci0JCWlmICghaXNEZWJ1Z2dpbmcoKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWlmIChtZXNzYWdlICE9IG51bGwpIHsKLQkJCVN5c3RlbS5lcnIucHJpbnRsbihtZXNzYWdlKTsKLQkJfQotCQlpZiAodGhyb3dhYmxlICE9IG51bGwpIHsKLQkJCXRocm93YWJsZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvcGFydC9EaWFncmFtQ3JlYXRpb25XaXphcmQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL3BhcnQvRGlhZ3JhbUNyZWF0aW9uV2l6YXJkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiNGNiYTguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvcGFydC9EaWFncmFtQ3JlYXRpb25XaXphcmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQucGFydDsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVzb3VyY2VzLmVkaXRvci5pZGUud2l6YXJkcy5FZGl0b3JDcmVhdGlvbldpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkVycm9yRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVXaXRoUHJvZ3Jlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklOZXdXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLldvcmtzcGFjZU1vZGlmeU9wZXJhdGlvbjsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEaWFncmFtQ3JlYXRpb25XaXphcmQgZXh0ZW5kcyBXaXphcmQgaW1wbGVtZW50cyBJTmV3V2l6YXJkIHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIElXb3JrYmVuY2ggd29ya2JlbmNoOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRGlhZ3JhbUNyZWF0aW9uV2l6YXJkUGFnZSBkaWFncmFtTW9kZWxGaWxlUGFnZTsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFJlc291cmNlIGRpYWdyYW07Ci0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBvcGVuTmV3bHlDcmVhdGVkRGlhZ3JhbUVkaXRvciA9IHRydWU7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElXb3JrYmVuY2ggZ2V0V29ya2JlbmNoKCkgewotCQlyZXR1cm4gd29ya2JlbmNoOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSVN0cnVjdHVyZWRTZWxlY3Rpb24gZ2V0U2VsZWN0aW9uKCkgewotCQlyZXR1cm4gc2VsZWN0aW9uOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgZmluYWwgUmVzb3VyY2UgZ2V0RGlhZ3JhbSgpIHsKLQkJcmV0dXJuIGRpYWdyYW07Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBmaW5hbCBib29sZWFuIGlzT3Blbk5ld2x5Q3JlYXRlZERpYWdyYW1FZGl0b3IoKSB7Ci0JCXJldHVybiBvcGVuTmV3bHlDcmVhdGVkRGlhZ3JhbUVkaXRvcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0T3Blbk5ld2x5Q3JlYXRlZERpYWdyYW1FZGl0b3IoCi0JCQlib29sZWFuIG9wZW5OZXdseUNyZWF0ZWREaWFncmFtRWRpdG9yKSB7Ci0JCXRoaXMub3Blbk5ld2x5Q3JlYXRlZERpYWdyYW1FZGl0b3IgPSBvcGVuTmV3bHlDcmVhdGVkRGlhZ3JhbUVkaXRvcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgYWRkUGFnZXMoKSB7Ci0JCWRpYWdyYW1Nb2RlbEZpbGVQYWdlID0gbmV3IERpYWdyYW1DcmVhdGlvbldpemFyZFBhZ2UoCi0JCQkJIkRpYWdyYW1Nb2RlbEZpbGUiLCBnZXRTZWxlY3Rpb24oKSwgInhtaSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJZGlhZ3JhbU1vZGVsRmlsZVBhZ2Uuc2V0VGl0bGUoIkNyZWF0ZSBBREQgRGlhZ3JhbSIpOwotCQlkaWFncmFtTW9kZWxGaWxlUGFnZQotCQkJCS5zZXREZXNjcmlwdGlvbigiU2VsZWN0IGZpbGUgdGhhdCB3aWxsIGNvbnRhaW4gZGlhZ3JhbSBhbmQgZG9tYWluIG1vZGVscy4iKTsKLQkJYWRkUGFnZShkaWFncmFtTW9kZWxGaWxlUGFnZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHBlcmZvcm1GaW5pc2goKSB7Ci0JCUlSdW5uYWJsZVdpdGhQcm9ncmVzcyBvcCA9IG5ldyBXb3Jrc3BhY2VNb2RpZnlPcGVyYXRpb24obnVsbCkgewotCi0JCQlwcm90ZWN0ZWQgdm9pZCBleGVjdXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLQkJCQkJdGhyb3dzIENvcmVFeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJCQlkaWFncmFtID0gRGlhZ3JhbURpYWdyYW1FZGl0b3JVdGlsLmNyZWF0ZURpYWdyYW0oCi0JCQkJCQlkaWFncmFtTW9kZWxGaWxlUGFnZS5nZXRVUkkoKSwgbW9uaXRvcik7Ci0JCQkJaWYgKGlzT3Blbk5ld2x5Q3JlYXRlZERpYWdyYW1FZGl0b3IoKSAmJiBkaWFncmFtICE9IG51bGwpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCURpYWdyYW1EaWFncmFtRWRpdG9yVXRpbC5vcGVuRGlhZ3JhbShkaWFncmFtKTsKLQkJCQkJfSBjYXRjaCAoUGFydEluaXRFeGNlcHRpb24gZSkgewotCQkJCQkJRXJyb3JEaWFsb2cub3BlbkVycm9yKGdldENvbnRhaW5lcigpLmdldFNoZWxsKCksCi0JCQkJCQkJCSJFcnJvciBvcGVuaW5nIGRpYWdyYW0gZWRpdG9yIiwgbnVsbCwgZQotCQkJCQkJCQkJCS5nZXRTdGF0dXMoKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JCXRyeSB7Ci0JCQlnZXRDb250YWluZXIoKS5ydW4oZmFsc2UsIHRydWUsIG9wKTsKLQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKLQkJCWlmIChlLmdldFRhcmdldEV4Y2VwdGlvbigpIGluc3RhbmNlb2YgQ29yZUV4Y2VwdGlvbikgewotCQkJCUVycm9yRGlhbG9nLm9wZW5FcnJvcihnZXRDb250YWluZXIoKS5nZXRTaGVsbCgpLAotCQkJCQkJIkNyZWF0aW9uIFByb2JsZW1zIiwgbnVsbCwgKChDb3JlRXhjZXB0aW9uKSBlCi0JCQkJCQkJCS5nZXRUYXJnZXRFeGNlcHRpb24oKSkuZ2V0U3RhdHVzKCkpOwotCQkJfSBlbHNlIHsKLQkJCQlBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5sb2dFcnJvcigKLQkJCQkJCSJFcnJvciBjcmVhdGluZyBkaWFncmFtIiwgZS5nZXRUYXJnZXRFeGNlcHRpb24oKSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gZGlhZ3JhbSAhPSBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2ggd29ya2JlbmNoLCBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJdGhpcy53b3JrYmVuY2ggPSB3b3JrYmVuY2g7Ci0JCXRoaXMuc2VsZWN0aW9uID0gc2VsZWN0aW9uOwotCQlzZXRXaW5kb3dUaXRsZSgiTmV3IEFERCBEaWFncmFtIik7Ci0JCXNldERlZmF1bHRQYWdlSW1hZ2VEZXNjcmlwdG9yKEFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvclBsdWdpbgotCQkJCS5nZXRCdW5kbGVkSW1hZ2VEZXNjcmlwdG9yKCJpY29ucy93aXpiYW4vTmV3TW9kZWxXaXphcmQuZ2lmIikpOyAvLyROT04tTkxTLTEkCi0JCXNldE5lZWRzUHJvZ3Jlc3NNb25pdG9yKHRydWUpOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL3BhcnQvRGlhZ3JhbUNyZWF0aW9uV2l6YXJkUGFnZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvcGFydC9EaWFncmFtQ3JlYXRpb25XaXphcmRQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlZjVlMGQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvcGFydC9EaWFncmFtQ3JlYXRpb25XaXphcmRQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLnBhcnQ7Ci0KLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXNvdXJjZXMuZWRpdG9yLmlkZS53aXphcmRzLkVkaXRvcldpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXNvdXJjZXMuZWRpdG9yLnV0aWwuRGlhZ3JhbUZpbGVDcmVhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5XaXphcmROZXdGaWxlQ3JlYXRpb25QYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBhcnRzLkFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRQYXJ0OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERpYWdyYW1DcmVhdGlvbldpemFyZFBhZ2UgZXh0ZW5kcyBXaXphcmROZXdGaWxlQ3JlYXRpb25QYWdlIHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIGZpbmFsIFN0cmluZyBmaWxlRXh0ZW5zaW9uOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEaWFncmFtQ3JlYXRpb25XaXphcmRQYWdlKFN0cmluZyBwYWdlTmFtZSwKLQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiwgU3RyaW5nIGZpbGVFeHRlbnNpb24pIHsKLQkJc3VwZXIocGFnZU5hbWUsIHNlbGVjdGlvbik7Ci0JCXRoaXMuZmlsZUV4dGVuc2lvbiA9IGZpbGVFeHRlbnNpb247Ci0JfQotCi0JLyoqCi0JICogT3ZlcnJpZGUgdG8gY3JlYXRlIGZpbGVzIHdpdGggdGhpcyBleHRlbnNpb24uCi0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RXh0ZW5zaW9uKCkgewotCQlyZXR1cm4gZmlsZUV4dGVuc2lvbjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFVSSSBnZXRVUkkoKSB7Ci0JCXJldHVybiBVUkkuY3JlYXRlUGxhdGZvcm1SZXNvdXJjZVVSSShnZXRGaWxlUGF0aCgpLnRvU3RyaW5nKCksIGZhbHNlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElQYXRoIGdldEZpbGVQYXRoKCkgewotCQlJUGF0aCBwYXRoID0gZ2V0Q29udGFpbmVyRnVsbFBhdGgoKTsKLQkJaWYgKHBhdGggPT0gbnVsbCkgewotCQkJcGF0aCA9IG5ldyBQYXRoKCIiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCVN0cmluZyBmaWxlTmFtZSA9IGdldEZpbGVOYW1lKCk7Ci0JCWlmIChmaWxlTmFtZSAhPSBudWxsKSB7Ci0JCQlwYXRoID0gcGF0aC5hcHBlbmQoZmlsZU5hbWUpOwotCQl9Ci0JCXJldHVybiBwYXRoOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJc3VwZXIuY3JlYXRlQ29udHJvbChwYXJlbnQpOwotCQlzZXRGaWxlTmFtZShEaWFncmFtRGlhZ3JhbUVkaXRvclV0aWwuZ2V0VW5pcXVlRmlsZU5hbWUoCi0JCQkJZ2V0Q29udGFpbmVyRnVsbFBhdGgoKSwgZ2V0RmlsZU5hbWUoKSwgZ2V0RXh0ZW5zaW9uKCkpKTsKLQkJc2V0UGFnZUNvbXBsZXRlKHZhbGlkYXRlUGFnZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gdmFsaWRhdGVQYWdlKCkgewotCQlpZiAoIXN1cGVyLnZhbGlkYXRlUGFnZSgpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJU3RyaW5nIGV4dGVuc2lvbiA9IGdldEV4dGVuc2lvbigpOwotCQlpZiAoZXh0ZW5zaW9uICE9IG51bGwKLQkJCQkmJiAhZ2V0RmlsZVBhdGgoKS50b1N0cmluZygpLmVuZHNXaXRoKCIuIiArIGV4dGVuc2lvbikpIHsKLQkJCXNldEVycm9yTWVzc2FnZShOTFMuYmluZCgKLQkJCQkJIkZpbGUgbmFtZSBzaG91bGQgaGF2ZSAnJ3swfScnIGV4dGVuc2lvbi4iLCBleHRlbnNpb24pKTsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL3BhcnQvRGlhZ3JhbURpYWdyYW1BY3Rpb25CYXJDb250cmlidXRvci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvcGFydC9EaWFncmFtRGlhZ3JhbUFjdGlvbkJhckNvbnRyaWJ1dG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkYmJmZWQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvcGFydC9EaWFncmFtRGlhZ3JhbUFjdGlvbkJhckNvbnRyaWJ1dG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQucGFydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucGFydHMuRGlhZ3JhbUFjdGlvbkJhckNvbnRyaWJ1dG9yOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERpYWdyYW1EaWFncmFtQWN0aW9uQmFyQ29udHJpYnV0b3IgZXh0ZW5kcwotCQlEaWFncmFtQWN0aW9uQmFyQ29udHJpYnV0b3IgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDbGFzcyBnZXRFZGl0b3JDbGFzcygpIHsKLQkJcmV0dXJuIEFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvci5jbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRFZGl0b3JJZCgpIHsKLQkJcmV0dXJuIEFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvci5JRDsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9wYXJ0L0RpYWdyYW1EaWFncmFtRWRpdG9yVXRpbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvcGFydC9EaWFncmFtRGlhZ3JhbUVkaXRvclV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGYxN2U3OC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9wYXJ0L0RpYWdyYW1EaWFncmFtRWRpdG9yVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5wYXJ0OwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMub3BlcmF0aW9ucy5PcGVyYXRpb25IaXN0b3J5RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdWJQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuWE1JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5YTUxSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS51dGlsLkVkaXRVSVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUuY29tbWFuZC5Db21tYW5kUmVzdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5zZXJ2aWNlcy5WaWV3U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5EaWFncmFtRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklQcmltYXJ5RWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wYXJ0cy5JRGlhZ3JhbUdyYXBoaWNhbFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnBhcnRzLklEaWFncmFtV29ya2JlbmNoUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlc291cmNlcy5lZGl0b3IuaWRlLnV0aWwuSURFRWRpdG9yVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlc291cmNlcy5lZGl0b3IudXRpbC5EaWFncmFtRmlsZUNyZWF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvbW1hbmRzLmNvcmUuY29tbWFuZC5BYnN0cmFjdFRyYW5zYWN0aW9uYWxDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb3JlLkdNRkVkaXRpbmdEb21haW5GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb3JlLnV0aWwuRU1GQ29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ1NldHRpbmdzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVXaXRoUHJvZ3Jlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGFydEluaXRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi53b3Jrc3BhY2UudXRpbC5Xb3Jrc3BhY2VTeW5jaHJvbml6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucGFydHMuQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5BY3Rpdml0eURldGFpbERpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTW9kZWxGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEaWFncmFtRGlhZ3JhbUVkaXRvclV0aWwgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIE1hcCBvdXJTYXZlT3B0aW9ucyA9IG51bGw7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBNYXAgZ2V0U2F2ZU9wdGlvbnMoKSB7Ci0JCWlmIChvdXJTYXZlT3B0aW9ucyA9PSBudWxsKSB7Ci0JCQlvdXJTYXZlT3B0aW9ucyA9IG5ldyBIYXNoTWFwKCk7Ci0JCQlvdXJTYXZlT3B0aW9ucy5wdXQoWE1JUmVzb3VyY2UuT1BUSU9OX0VOQ09ESU5HLCAiVVRGLTgiKTsgLy8kTk9OLU5MUy0xJAotCQkJb3VyU2F2ZU9wdGlvbnMucHV0KFhNTFJlc291cmNlLk9QVElPTl9SRUNPUkRfVU5LTk9XTl9GRUFUVVJFLAotCQkJCQlCb29sZWFuLlRSVUUpOwotCQkJb3VyU2F2ZU9wdGlvbnMucHV0KFJlc291cmNlLk9QVElPTl9TQVZFX09OTFlfSUZfQ0hBTkdFRCwKLQkJCQkJUmVzb3VyY2UuT1BUSU9OX1NBVkVfT05MWV9JRl9DSEFOR0VEX01FTU9SWV9CVUZGRVIpOwotCQl9Ci0JCXJldHVybiBvdXJTYXZlT3B0aW9uczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIG9wZW5EaWFncmFtKFJlc291cmNlIGRpYWdyYW0pCi0JCQl0aHJvd3MgUGFydEluaXRFeGNlcHRpb24gewotCQlyZXR1cm4gRWRpdFVJVXRpbC5vcGVuRWRpdG9yKChFT2JqZWN0KSBkaWFncmFtLmdldENvbnRlbnRzKCkuZ2V0KDApKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldENoYXJzZXQoSUZpbGUgZmlsZSkgewotCQlpZiAoZmlsZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJdHJ5IHsKLQkJCWZpbGUuc2V0Q2hhcnNldCgiVVRGLTgiLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsgLy8kTk9OLU5MUy0xJAotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCUFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmxvZ0Vycm9yKAotCQkJCQkiVW5hYmxlIHRvIHNldCBjaGFyc2V0IGZvciBmaWxlICIgKyBmaWxlLmdldEZ1bGxQYXRoKCksIGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0VW5pcXVlRmlsZU5hbWUoSVBhdGggY29udGFpbmVyRnVsbFBhdGgsCi0JCQlTdHJpbmcgZmlsZU5hbWUsIFN0cmluZyBleHRlbnNpb24pIHsKLQkJaWYgKGNvbnRhaW5lckZ1bGxQYXRoID09IG51bGwpIHsKLQkJCWNvbnRhaW5lckZ1bGxQYXRoID0gbmV3IFBhdGgoIiIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJaWYgKGZpbGVOYW1lID09IG51bGwgfHwgZmlsZU5hbWUudHJpbSgpLmxlbmd0aCgpID09IDApIHsKLQkJCWZpbGVOYW1lID0gImRlZmF1bHQiOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJSVBhdGggZmlsZVBhdGggPSBjb250YWluZXJGdWxsUGF0aC5hcHBlbmQoZmlsZU5hbWUpOwotCQlpZiAoZXh0ZW5zaW9uICE9IG51bGwgJiYgIWV4dGVuc2lvbi5lcXVhbHMoZmlsZVBhdGguZ2V0RmlsZUV4dGVuc2lvbigpKSkgewotCQkJZmlsZVBhdGggPSBmaWxlUGF0aC5hZGRGaWxlRXh0ZW5zaW9uKGV4dGVuc2lvbik7Ci0JCX0KLQkJZXh0ZW5zaW9uID0gZmlsZVBhdGguZ2V0RmlsZUV4dGVuc2lvbigpOwotCQlmaWxlTmFtZSA9IGZpbGVQYXRoLnJlbW92ZUZpbGVFeHRlbnNpb24oKS5sYXN0U2VnbWVudCgpOwotCQlpbnQgaSA9IDE7Ci0JCXdoaWxlIChSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmV4aXN0cyhmaWxlUGF0aCkpIHsKLQkJCWkrKzsKLQkJCWZpbGVQYXRoID0gY29udGFpbmVyRnVsbFBhdGguYXBwZW5kKGZpbGVOYW1lICsgaSk7Ci0JCQlpZiAoZXh0ZW5zaW9uICE9IG51bGwpIHsKLQkJCQlmaWxlUGF0aCA9IGZpbGVQYXRoLmFkZEZpbGVFeHRlbnNpb24oZXh0ZW5zaW9uKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmlsZVBhdGgubGFzdFNlZ21lbnQoKTsKLQl9Ci0KLQkvKioKLQkgKiBSdW5zIHRoZSB3aXphcmQgaW4gYSBkaWFsb2cuCi0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBydW5XaXphcmQoU2hlbGwgc2hlbGwsIFdpemFyZCB3aXphcmQsIFN0cmluZyBzZXR0aW5nc0tleSkgewotCQlJRGlhbG9nU2V0dGluZ3MgcGx1Z2luRGlhbG9nU2V0dGluZ3MgPSBBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0b3JQbHVnaW4KLQkJCQkuZ2V0SW5zdGFuY2UoKS5nZXREaWFsb2dTZXR0aW5ncygpOwotCQlJRGlhbG9nU2V0dGluZ3Mgd2l6YXJkRGlhbG9nU2V0dGluZ3MgPSBwbHVnaW5EaWFsb2dTZXR0aW5ncwotCQkJCS5nZXRTZWN0aW9uKHNldHRpbmdzS2V5KTsKLQkJaWYgKHdpemFyZERpYWxvZ1NldHRpbmdzID09IG51bGwpIHsKLQkJCXdpemFyZERpYWxvZ1NldHRpbmdzID0gcGx1Z2luRGlhbG9nU2V0dGluZ3MKLQkJCQkJLmFkZE5ld1NlY3Rpb24oc2V0dGluZ3NLZXkpOwotCQl9Ci0JCXdpemFyZC5zZXREaWFsb2dTZXR0aW5ncyh3aXphcmREaWFsb2dTZXR0aW5ncyk7Ci0JCVdpemFyZERpYWxvZyBkaWFsb2cgPSBuZXcgV2l6YXJkRGlhbG9nKHNoZWxsLCB3aXphcmQpOwotCQlkaWFsb2cuY3JlYXRlKCk7Ci0JCWRpYWxvZy5nZXRTaGVsbCgpLnNldFNpemUoTWF0aC5tYXgoNTAwLCBkaWFsb2cuZ2V0U2hlbGwoKS5nZXRTaXplKCkueCksCi0JCQkJNTAwKTsKLQkJZGlhbG9nLm9wZW4oKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBzaG91bGQgYmUgY2FsbGVkIHdpdGhpbiBhIHdvcmtzcGFjZSBtb2RpZnkgb3BlcmF0aW9uIHNpbmNlIGl0IGNyZWF0ZXMgcmVzb3VyY2VzLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFJlc291cmNlIGNyZWF0ZURpYWdyYW0oVVJJIGRpYWdyYW1VUkksCi0JCQlJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzTW9uaXRvcikgewotCQlUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiBlZGl0aW5nRG9tYWluID0gR01GRWRpdGluZ0RvbWFpbkZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkuY3JlYXRlRWRpdGluZ0RvbWFpbigpOwotCQlwcm9ncmVzc01vbml0b3IuYmVnaW5UYXNrKAotCQkJCU1lc3NhZ2VzLkRpYWdyYW1EaWFncmFtRWRpdG9yVXRpbF9DcmVhdGVEaWFncmFtUHJvZ3Jlc3NUYXNrLCAzKTsKLQkJZmluYWwgUmVzb3VyY2UgZGlhZ3JhbVJlc291cmNlID0gZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpCi0JCQkJLmNyZWF0ZVJlc291cmNlKGRpYWdyYW1VUkkpOwotCQlmaW5hbCBTdHJpbmcgZGlhZ3JhbU5hbWUgPSBkaWFncmFtVVJJLmxhc3RTZWdtZW50KCk7Ci0JCUFic3RyYWN0VHJhbnNhY3Rpb25hbENvbW1hbmQgY29tbWFuZCA9IG5ldyBBYnN0cmFjdFRyYW5zYWN0aW9uYWxDb21tYW5kKAotCQkJCWVkaXRpbmdEb21haW4sCi0JCQkJTWVzc2FnZXMuRGlhZ3JhbURpYWdyYW1FZGl0b3JVdGlsX0NyZWF0ZURpYWdyYW1Db21tYW5kTGFiZWwsCi0JCQkJQ29sbGVjdGlvbnMuRU1QVFlfTElTVCkgewotCQkJcHJvdGVjdGVkIENvbW1hbmRSZXN1bHQgZG9FeGVjdXRlV2l0aFJlc3VsdCgKLQkJCQkJSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pCi0JCQkJCXRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCQkJCUFjdGl2aXR5RGV0YWlsRGlhZ3JhbSBtb2RlbCA9IGNyZWF0ZUluaXRpYWxNb2RlbCgpOwotCQkJCWF0dGFjaE1vZGVsVG9SZXNvdXJjZShtb2RlbCwgZGlhZ3JhbVJlc291cmNlKTsKLQotCQkJCURpYWdyYW0gZGlhZ3JhbSA9IFZpZXdTZXJ2aWNlCi0JCQkJCQkuY3JlYXRlRGlhZ3JhbSgKLQkJCQkJCQkJbW9kZWwsCi0JCQkJCQkJCUFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRQYXJ0Lk1PREVMX0lELAotCQkJCQkJCQlBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0b3JQbHVnaW4uRElBR1JBTV9QUkVGRVJFTkNFU19ISU5UKTsKLQkJCQlpZiAoZGlhZ3JhbSAhPSBudWxsKSB7Ci0JCQkJCWRpYWdyYW1SZXNvdXJjZS5nZXRDb250ZW50cygpLmFkZChkaWFncmFtKTsKLQkJCQkJZGlhZ3JhbS5zZXROYW1lKGRpYWdyYW1OYW1lKTsKLQkJCQkJZGlhZ3JhbS5zZXRFbGVtZW50KG1vZGVsKTsKLQkJCQl9Ci0KLQkJCQl0cnkgewotCi0JCQkJCWRpYWdyYW1SZXNvdXJjZQotCQkJCQkJCS5zYXZlKG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5wYXJ0LkRpYWdyYW1EaWFncmFtRWRpdG9yVXRpbAotCQkJCQkJCQkJLmdldFNhdmVPcHRpb25zKCkpOwotCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQotCQkJCQlBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5sb2dFcnJvcigKLQkJCQkJCQkiVW5hYmxlIHRvIHN0b3JlIG1vZGVsIGFuZCBkaWFncmFtIHJlc291cmNlcyIsIGUpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJCXJldHVybiBDb21tYW5kUmVzdWx0Lm5ld09LQ29tbWFuZFJlc3VsdCgpOwotCQkJfQotCQl9OwotCQl0cnkgewotCQkJT3BlcmF0aW9uSGlzdG9yeUZhY3RvcnkuZ2V0T3BlcmF0aW9uSGlzdG9yeSgpLmV4ZWN1dGUoY29tbWFuZCwKLQkJCQkJbmV3IFN1YlByb2dyZXNzTW9uaXRvcihwcm9ncmVzc01vbml0b3IsIDEpLCBudWxsKTsKLQkJfSBjYXRjaCAoRXhlY3V0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCUFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmxvZ0Vycm9yKAotCQkJCQkiVW5hYmxlIHRvIGNyZWF0ZSBtb2RlbCBhbmQgZGlhZ3JhbSIsIGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlzZXRDaGFyc2V0KFdvcmtzcGFjZVN5bmNocm9uaXplci5nZXRGaWxlKGRpYWdyYW1SZXNvdXJjZSkpOwotCQlyZXR1cm4gZGlhZ3JhbVJlc291cmNlOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiBkb21haW4gZWxlbWVudCBhc3NvY2lhdGVkIHdpdGggY2FudmFzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIEFjdGl2aXR5RGV0YWlsRGlhZ3JhbSBjcmVhdGVJbml0aWFsTW9kZWwoKSB7Ci0JCXJldHVybiBNb2RlbEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUFjdGl2aXR5RGV0YWlsRGlhZ3JhbSgpOwotCX0KLQotCS8qKgotCSAqIFN0b3JlIG1vZGVsIGVsZW1lbnQgaW4gdGhlIHJlc291cmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgYXR0YWNoTW9kZWxUb1Jlc291cmNlKEFjdGl2aXR5RGV0YWlsRGlhZ3JhbSBtb2RlbCwKLQkJCVJlc291cmNlIHJlc291cmNlKSB7Ci0JCXJlc291cmNlLmdldENvbnRlbnRzKCkuYWRkKG1vZGVsKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNlbGVjdEVsZW1lbnRzSW5EaWFncmFtKAotCQkJSURpYWdyYW1Xb3JrYmVuY2hQYXJ0IGRpYWdyYW1QYXJ0LCBMaXN0LypFZGl0UGFydCovZWRpdFBhcnRzKSB7Ci0JCWRpYWdyYW1QYXJ0LmdldERpYWdyYW1HcmFwaGljYWxWaWV3ZXIoKS5kZXNlbGVjdEFsbCgpOwotCi0JCUVkaXRQYXJ0IGZpcnN0UHJpbWFyeSA9IG51bGw7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSBlZGl0UGFydHMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJRWRpdFBhcnQgbmV4dFBhcnQgPSAoRWRpdFBhcnQpIGl0Lm5leHQoKTsKLQkJCWRpYWdyYW1QYXJ0LmdldERpYWdyYW1HcmFwaGljYWxWaWV3ZXIoKS5hcHBlbmRTZWxlY3Rpb24obmV4dFBhcnQpOwotCQkJaWYgKGZpcnN0UHJpbWFyeSA9PSBudWxsICYmIG5leHRQYXJ0IGluc3RhbmNlb2YgSVByaW1hcnlFZGl0UGFydCkgewotCQkJCWZpcnN0UHJpbWFyeSA9IG5leHRQYXJ0OwotCQkJfQotCQl9Ci0KLQkJaWYgKCFlZGl0UGFydHMuaXNFbXB0eSgpKSB7Ci0JCQlkaWFncmFtUGFydC5nZXREaWFncmFtR3JhcGhpY2FsVmlld2VyKCkucmV2ZWFsKAotCQkJCQlmaXJzdFByaW1hcnkgIT0gbnVsbCA/IGZpcnN0UHJpbWFyeSA6IChFZGl0UGFydCkgZWRpdFBhcnRzCi0JCQkJCQkJLmdldCgwKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgaW50IGZpbmRFbGVtZW50c0luRGlhZ3JhbUJ5SUQoRGlhZ3JhbUVkaXRQYXJ0IGRpYWdyYW1QYXJ0LAotCQkJRU9iamVjdCBlbGVtZW50LCBMaXN0IGVkaXRQYXJ0Q29sbGVjdG9yKSB7Ci0JCUlEaWFncmFtR3JhcGhpY2FsVmlld2VyIHZpZXdlciA9IChJRGlhZ3JhbUdyYXBoaWNhbFZpZXdlcikgZGlhZ3JhbVBhcnQKLQkJCQkuZ2V0Vmlld2VyKCk7Ci0JCWZpbmFsIGludCBpbnRpYWxOdW1PZkVkaXRQYXJ0cyA9IGVkaXRQYXJ0Q29sbGVjdG9yLnNpemUoKTsKLQotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFZpZXcpIHsgLy8gc3VwcG9ydCBub3RhdGlvbiBlbGVtZW50IGxvb2t1cAotCQkJRWRpdFBhcnQgZWRpdFBhcnQgPSAoRWRpdFBhcnQpIHZpZXdlci5nZXRFZGl0UGFydFJlZ2lzdHJ5KCkuZ2V0KAotCQkJCQllbGVtZW50KTsKLQkJCWlmIChlZGl0UGFydCAhPSBudWxsKSB7Ci0JCQkJZWRpdFBhcnRDb2xsZWN0b3IuYWRkKGVkaXRQYXJ0KTsKLQkJCQlyZXR1cm4gMTsKLQkJCX0KLQkJfQotCi0JCVN0cmluZyBlbGVtZW50SUQgPSBFTUZDb3JlVXRpbC5nZXRQcm94eUlEKGVsZW1lbnQpOwotCQlMaXN0IGFzc29jaWF0ZWRQYXJ0cyA9IHZpZXdlci5maW5kRWRpdFBhcnRzRm9yRWxlbWVudChlbGVtZW50SUQsCi0JCQkJSUdyYXBoaWNhbEVkaXRQYXJ0LmNsYXNzKTsKLQkJLy8gcGVyZm9ybSB0aGUgcG9zc2libGUgaGllcmFyY2h5IGRpc2pvaW50IC0+IHRha2UgdGhlIHRvcC1tb3N0IHBhcnRzIG9ubHkKLQkJZm9yIChJdGVyYXRvciBlZGl0UGFydEl0ID0gYXNzb2NpYXRlZFBhcnRzLml0ZXJhdG9yKCk7IGVkaXRQYXJ0SXQKLQkJCQkuaGFzTmV4dCgpOykgewotCQkJRWRpdFBhcnQgbmV4dFBhcnQgPSAoRWRpdFBhcnQpIGVkaXRQYXJ0SXQubmV4dCgpOwotCQkJRWRpdFBhcnQgcGFyZW50UGFydCA9IG5leHRQYXJ0LmdldFBhcmVudCgpOwotCQkJd2hpbGUgKHBhcmVudFBhcnQgIT0gbnVsbCAmJiAhYXNzb2NpYXRlZFBhcnRzLmNvbnRhaW5zKHBhcmVudFBhcnQpKSB7Ci0JCQkJcGFyZW50UGFydCA9IHBhcmVudFBhcnQuZ2V0UGFyZW50KCk7Ci0JCQl9Ci0JCQlpZiAocGFyZW50UGFydCA9PSBudWxsKSB7Ci0JCQkJZWRpdFBhcnRDb2xsZWN0b3IuYWRkKG5leHRQYXJ0KTsKLQkJCX0KLQkJfQotCi0JCWlmIChpbnRpYWxOdW1PZkVkaXRQYXJ0cyA9PSBlZGl0UGFydENvbGxlY3Rvci5zaXplKCkpIHsKLQkJCWlmICghYXNzb2NpYXRlZFBhcnRzLmlzRW1wdHkoKSkgewotCQkJCWVkaXRQYXJ0Q29sbGVjdG9yLmFkZChhc3NvY2lhdGVkUGFydHMuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQkJfSBlbHNlIHsKLQkJCQlpZiAoZWxlbWVudC5lQ29udGFpbmVyKCkgIT0gbnVsbCkgewotCQkJCQlyZXR1cm4gZmluZEVsZW1lbnRzSW5EaWFncmFtQnlJRChkaWFncmFtUGFydCwgZWxlbWVudAotCQkJCQkJCS5lQ29udGFpbmVyKCksIGVkaXRQYXJ0Q29sbGVjdG9yKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVkaXRQYXJ0Q29sbGVjdG9yLnNpemUoKSAtIGludGlhbE51bU9mRWRpdFBhcnRzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFZpZXcgZmluZFZpZXcoRGlhZ3JhbUVkaXRQYXJ0IGRpYWdyYW1FZGl0UGFydCwKLQkJCUVPYmplY3QgdGFyZ2V0RWxlbWVudCwgTGF6eUVsZW1lbnQyVmlld01hcCBsYXp5RWxlbWVudDJWaWV3TWFwKSB7Ci0JCWJvb2xlYW4gaGFzU3RydWN0dXJhbFVSSSA9IGZhbHNlOwotCQlpZiAodGFyZ2V0RWxlbWVudC5lUmVzb3VyY2UoKSBpbnN0YW5jZW9mIFhNTFJlc291cmNlKSB7Ci0JCQloYXNTdHJ1Y3R1cmFsVVJJID0gKChYTUxSZXNvdXJjZSkgdGFyZ2V0RWxlbWVudC5lUmVzb3VyY2UoKSkKLQkJCQkJLmdldElEKHRhcmdldEVsZW1lbnQpID09IG51bGw7Ci0JCX0KLQotCQlWaWV3IHZpZXcgPSBudWxsOwotCQlpZiAoaGFzU3RydWN0dXJhbFVSSQotCQkJCSYmICFsYXp5RWxlbWVudDJWaWV3TWFwLmdldEVsZW1lbnQyVmlld01hcCgpLmlzRW1wdHkoKSkgewotCQkJdmlldyA9IChWaWV3KSBsYXp5RWxlbWVudDJWaWV3TWFwLmdldEVsZW1lbnQyVmlld01hcCgpLmdldCgKLQkJCQkJdGFyZ2V0RWxlbWVudCk7Ci0JCX0gZWxzZSBpZiAoZmluZEVsZW1lbnRzSW5EaWFncmFtQnlJRChkaWFncmFtRWRpdFBhcnQsIHRhcmdldEVsZW1lbnQsCi0JCQkJbGF6eUVsZW1lbnQyVmlld01hcC5lZGl0UGFydFRtcEhvbGRlcikgPiAwKSB7Ci0JCQlFZGl0UGFydCBlZGl0UGFydCA9IChFZGl0UGFydCkgbGF6eUVsZW1lbnQyVmlld01hcC5lZGl0UGFydFRtcEhvbGRlcgotCQkJCQkuZ2V0KDApOwotCQkJbGF6eUVsZW1lbnQyVmlld01hcC5lZGl0UGFydFRtcEhvbGRlci5jbGVhcigpOwotCQkJdmlldyA9IGVkaXRQYXJ0LmdldE1vZGVsKCkgaW5zdGFuY2VvZiBWaWV3ID8gKFZpZXcpIGVkaXRQYXJ0Ci0JCQkJCS5nZXRNb2RlbCgpIDogbnVsbDsKLQkJfQotCi0JCXJldHVybiAodmlldyA9PSBudWxsKSA/IGRpYWdyYW1FZGl0UGFydC5nZXREaWFncmFtVmlldygpIDogdmlldzsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBjbGFzcyBMYXp5RWxlbWVudDJWaWV3TWFwIHsKLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgTWFwIGVsZW1lbnQyVmlld01hcDsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSBWaWV3IHNjb3BlOwotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIFNldCBlbGVtZW50U2V0OwotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgZmluYWwgTGlzdCBlZGl0UGFydFRtcEhvbGRlciA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIExhenlFbGVtZW50MlZpZXdNYXAoVmlldyBzY29wZSwgU2V0IGVsZW1lbnRzKSB7Ci0JCQl0aGlzLnNjb3BlID0gc2NvcGU7Ci0JCQl0aGlzLmVsZW1lbnRTZXQgPSBlbGVtZW50czsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgZmluYWwgTWFwIGdldEVsZW1lbnQyVmlld01hcCgpIHsKLQkJCWlmIChlbGVtZW50MlZpZXdNYXAgPT0gbnVsbCkgewotCQkJCWVsZW1lbnQyVmlld01hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCQkJLy8gbWFwIHBvc3NpYmxlIG5vdGF0aW9uIGVsZW1lbnRzIHRvIGl0c2VsZiBhcyB0aGVzZSBjYW4ndCBiZSBmb3VuZCBieSB2aWV3LmdldEVsZW1lbnQoKQotCQkJCWZvciAoSXRlcmF0b3IgaXQgPSBlbGVtZW50U2V0Lml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQkJRU9iamVjdCBlbGVtZW50ID0gKEVPYmplY3QpIGl0Lm5leHQoKTsKLQkJCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBWaWV3KSB7Ci0JCQkJCQlWaWV3IHZpZXcgPSAoVmlldykgZWxlbWVudDsKLQkJCQkJCWlmICh2aWV3LmdldERpYWdyYW0oKSA9PSBzY29wZS5nZXREaWFncmFtKCkpIHsKLQkJCQkJCQllbGVtZW50MlZpZXdNYXAucHV0KGVsZW1lbnQsIGVsZW1lbnQpOyAvLyB0YWtlIG9ubHkgdGhvc2UgdGhhdCBwYXJ0IG9mIG91ciBkaWFncmFtCi0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQlidWlsZEVsZW1lbnQyVmlld01hcChzY29wZSwgZWxlbWVudDJWaWV3TWFwLCBlbGVtZW50U2V0KTsKLQkJCX0KLQkJCXJldHVybiBlbGVtZW50MlZpZXdNYXA7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJc3RhdGljIE1hcCBidWlsZEVsZW1lbnQyVmlld01hcChWaWV3IHBhcmVudFZpZXcsIE1hcCBlbGVtZW50MlZpZXdNYXAsCi0JCQkJU2V0IGVsZW1lbnRzKSB7Ci0JCQlpZiAoZWxlbWVudHMuc2l6ZSgpID09IGVsZW1lbnQyVmlld01hcC5zaXplKCkpCi0JCQkJcmV0dXJuIGVsZW1lbnQyVmlld01hcDsKLQotCQkJaWYgKHBhcmVudFZpZXcuaXNTZXRFbGVtZW50KCkKLQkJCQkJJiYgIWVsZW1lbnQyVmlld01hcC5jb250YWluc0tleShwYXJlbnRWaWV3LmdldEVsZW1lbnQoKSkKLQkJCQkJJiYgZWxlbWVudHMuY29udGFpbnMocGFyZW50Vmlldy5nZXRFbGVtZW50KCkpKSB7Ci0JCQkJZWxlbWVudDJWaWV3TWFwLnB1dChwYXJlbnRWaWV3LmdldEVsZW1lbnQoKSwgcGFyZW50Vmlldyk7Ci0JCQkJaWYgKGVsZW1lbnRzLnNpemUoKSA9PSBlbGVtZW50MlZpZXdNYXAuc2l6ZSgpKQotCQkJCQlyZXR1cm4gZWxlbWVudDJWaWV3TWFwOwotCQkJfQotCi0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gcGFyZW50Vmlldy5nZXRDaGlsZHJlbigpLml0ZXJhdG9yKCk7IGl0Ci0JCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJYnVpbGRFbGVtZW50MlZpZXdNYXAoKFZpZXcpIGl0Lm5leHQoKSwgZWxlbWVudDJWaWV3TWFwLAotCQkJCQkJZWxlbWVudHMpOwotCQkJCWlmIChlbGVtZW50cy5zaXplKCkgPT0gZWxlbWVudDJWaWV3TWFwLnNpemUoKSkKLQkJCQkJcmV0dXJuIGVsZW1lbnQyVmlld01hcDsKLQkJCX0KLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBwYXJlbnRWaWV3LmdldFNvdXJjZUVkZ2VzKCkuaXRlcmF0b3IoKTsgaXQKLQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQlidWlsZEVsZW1lbnQyVmlld01hcCgoVmlldykgaXQubmV4dCgpLCBlbGVtZW50MlZpZXdNYXAsCi0JCQkJCQllbGVtZW50cyk7Ci0JCQkJaWYgKGVsZW1lbnRzLnNpemUoKSA9PSBlbGVtZW50MlZpZXdNYXAuc2l6ZSgpKQotCQkJCQlyZXR1cm4gZWxlbWVudDJWaWV3TWFwOwotCQkJfQotCQkJZm9yIChJdGVyYXRvciBpdCA9IHBhcmVudFZpZXcuZ2V0U291cmNlRWRnZXMoKS5pdGVyYXRvcigpOyBpdAotCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCWJ1aWxkRWxlbWVudDJWaWV3TWFwKChWaWV3KSBpdC5uZXh0KCksIGVsZW1lbnQyVmlld01hcCwKLQkJCQkJCWVsZW1lbnRzKTsKLQkJCQlpZiAoZWxlbWVudHMuc2l6ZSgpID09IGVsZW1lbnQyVmlld01hcC5zaXplKCkpCi0JCQkJCXJldHVybiBlbGVtZW50MlZpZXdNYXA7Ci0JCQl9Ci0JCQlyZXR1cm4gZWxlbWVudDJWaWV3TWFwOwotCQl9Ci0JfSAvL0xhenlFbGVtZW50MlZpZXdNYXAJCi0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL3BhcnQvRGlhZ3JhbURpYWdyYW1GaWxlQ3JlYXRvci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvcGFydC9EaWFncmFtRGlhZ3JhbUZpbGVDcmVhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1MWMxOWMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvcGFydC9EaWFncmFtRGlhZ3JhbUZpbGVDcmVhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQucGFydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVzb3VyY2VzLmVkaXRvci5pZGUudXRpbC5JREVFZGl0b3JGaWxlQ3JlYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlc291cmNlcy5lZGl0b3IudXRpbC5EaWFncmFtRmlsZUNyZWF0b3I7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRGlhZ3JhbURpYWdyYW1GaWxlQ3JlYXRvciBleHRlbmRzIElERUVkaXRvckZpbGVDcmVhdG9yIHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBEaWFncmFtRGlhZ3JhbUZpbGVDcmVhdG9yIElOU1RBTkNFID0gbmV3IERpYWdyYW1EaWFncmFtRmlsZUNyZWF0b3IoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIERpYWdyYW1GaWxlQ3JlYXRvciBnZXRJbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEV4dGVuc2lvbigpIHsKLQkJcmV0dXJuICIuYWRkIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL3BhcnQvRGlhZ3JhbURpYWdyYW1QcmVmZXJlbmNlSW5pdGlhbGl6ZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL3BhcnQvRGlhZ3JhbURpYWdyYW1QcmVmZXJlbmNlSW5pdGlhbGl6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmQ2ZDE4Yi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9wYXJ0L0RpYWdyYW1EaWFncmFtUHJlZmVyZW5jZUluaXRpYWxpemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQucGFydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUudXRpbC5EaWFncmFtQ29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wcmVmZXJlbmNlcy5EaWFncmFtUHJlZmVyZW5jZUluaXRpYWxpemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEaWFncmFtRGlhZ3JhbVByZWZlcmVuY2VJbml0aWFsaXplciBleHRlbmRzCi0JCURpYWdyYW1QcmVmZXJlbmNlSW5pdGlhbGl6ZXIgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJUHJlZmVyZW5jZVN0b3JlIGdldFByZWZlcmVuY2VTdG9yZSgpIHsKLQkJcmV0dXJuIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5wYXJ0LkFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvclBsdWdpbgotCQkJCS5nZXRJbnN0YW5jZSgpLmdldFByZWZlcmVuY2VTdG9yZSgpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplRGVmYXVsdFByZWZlcmVuY2VzKCkgewotCQlzdXBlci5pbml0aWFsaXplRGVmYXVsdFByZWZlcmVuY2VzKCk7Ci0JCURpYWdyYW1Db3JlVXRpbC5zZXREZWZhdWx0Rm9udFByZWZlcmVuY2UoZ2V0UHJlZmVyZW5jZVN0b3JlKCkpOwotCQlEaWFncmFtQ29yZVV0aWwuaGlkZUNvbm5lY3Rpb25IYW5kbGVzKGdldFByZWZlcmVuY2VTdG9yZSgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9wYXJ0L0RpYWdyYW1Eb2N1bWVudFByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9wYXJ0L0RpYWdyYW1Eb2N1bWVudFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxNTRkY2YuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvcGFydC9EaWFncmFtRG9jdW1lbnRQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA1OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQucGFydDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVN0b3JhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN1YlByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5JU2NoZWR1bGluZ1J1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuTXVsdGlSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udWkuVVJJRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVDb250ZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uRGVtdWx0aXBsZXhpbmdMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uTm90aWZpY2F0aW9uRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5UcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYud29ya3NwYWNlLnV0aWwuV29ya3NwYWNlU3luY2hyb25pemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5EaWFncmFtRWRpdGluZ0RvbWFpbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXNvdXJjZXMuZWRpdG9yLmRvY3VtZW50LkFic3RyYWN0RG9jdW1lbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlc291cmNlcy5lZGl0b3IuZG9jdW1lbnQuRGlhZ3JhbURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVzb3VyY2VzLmVkaXRvci5kb2N1bWVudC5EaWFncmFtTW9kaWZpY2F0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXNvdXJjZXMuZWRpdG9yLmRvY3VtZW50LklEaWFncmFtRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXNvdXJjZXMuZWRpdG9yLmRvY3VtZW50LklEaWFncmFtRG9jdW1lbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlc291cmNlcy5lZGl0b3IuZG9jdW1lbnQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVzb3VyY2VzLmVkaXRvci5pZGUuZG9jdW1lbnQuRmlsZURpYWdyYW1Eb2N1bWVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVzb3VyY2VzLmVkaXRvci5pZGUuZG9jdW1lbnQuRmlsZURpYWdyYW1Nb2RpZmljYXRpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlc291cmNlcy5lZGl0b3IuaW50ZXJuYWwuRWRpdG9yU3RhdHVzQ29kZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXNvdXJjZXMuZWRpdG9yLmludGVybmFsLnV0aWwuRGlhZ3JhbUlPVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29yZS5yZXNvdXJjZXMuR01GUmVzb3VyY2VGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkRpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLklSdW5uYWJsZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRmlsZUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuRmlsZUVkaXRvcklucHV0OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERpYWdyYW1Eb2N1bWVudFByb3ZpZGVyIGV4dGVuZHMgQWJzdHJhY3REb2N1bWVudFByb3ZpZGVyIGltcGxlbWVudHMKLQkJSURpYWdyYW1Eb2N1bWVudFByb3ZpZGVyIHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRWxlbWVudEluZm8gY3JlYXRlRWxlbWVudEluZm8oT2JqZWN0IGVsZW1lbnQpCi0JCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmIChmYWxzZSA9PSBlbGVtZW50IGluc3RhbmNlb2YgRmlsZUVkaXRvcklucHV0Ci0JCQkJJiYgZmFsc2UgPT0gZWxlbWVudCBpbnN0YW5jZW9mIFVSSUVkaXRvcklucHV0KSB7Ci0JCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbigKLQkJCQkJbmV3IFN0YXR1cygKLQkJCQkJCQlJU3RhdHVzLkVSUk9SLAotCQkJCQkJCUFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvclBsdWdpbi5JRCwKLQkJCQkJCQkwLAotCQkJCQkJCU5MUwotCQkJCQkJCQkJLmJpbmQoCi0JCQkJCQkJCQkJCU1lc3NhZ2VzLkRpYWdyYW1Eb2N1bWVudFByb3ZpZGVyX0luY29ycmVjdElucHV0RXJyb3IsCi0JCQkJCQkJCQkJCW5ldyBPYmplY3RbXSB7Ci0JCQkJCQkJCQkJCQkJZWxlbWVudCwKLQkJCQkJCQkJCQkJCQkib3JnLmVjbGlwc2UudWkucGFydC5GaWxlRWRpdG9ySW5wdXQiLAotCQkJCQkJCQkJCQkJCSJvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnVpLlVSSUVkaXRvcklucHV0IiB9KSwKLQkJCQkJCQludWxsKSk7Ci0JCX0KLQkJSUVkaXRvcklucHV0IGVkaXRvcklucHV0ID0gKElFZGl0b3JJbnB1dCkgZWxlbWVudDsKLQkJSURpYWdyYW1Eb2N1bWVudCBkb2N1bWVudCA9IChJRGlhZ3JhbURvY3VtZW50KSBjcmVhdGVEb2N1bWVudChlZGl0b3JJbnB1dCk7Ci0KLQkJUmVzb3VyY2VTZXRJbmZvIGluZm8gPSBuZXcgUmVzb3VyY2VTZXRJbmZvKGRvY3VtZW50LCBlZGl0b3JJbnB1dCk7Ci0JCWluZm8uc2V0TW9kaWZpY2F0aW9uU3RhbXAoY29tcHV0ZU1vZGlmaWNhdGlvblN0YW1wKGluZm8pKTsKLQkJaW5mby5mU3RhdHVzID0gbnVsbDsKLQkJcmV0dXJuIGluZm87Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJRG9jdW1lbnQgY3JlYXRlRG9jdW1lbnQoT2JqZWN0IGVsZW1lbnQpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKGZhbHNlID09IGVsZW1lbnQgaW5zdGFuY2VvZiBGaWxlRWRpdG9ySW5wdXQKLQkJCQkmJiBmYWxzZSA9PSBlbGVtZW50IGluc3RhbmNlb2YgVVJJRWRpdG9ySW5wdXQpIHsKLQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKAotCQkJCQluZXcgU3RhdHVzKAotCQkJCQkJCUlTdGF0dXMuRVJST1IsCi0JCQkJCQkJQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9yUGx1Z2luLklELAotCQkJCQkJCTAsCi0JCQkJCQkJTkxTCi0JCQkJCQkJCQkuYmluZCgKLQkJCQkJCQkJCQkJTWVzc2FnZXMuRGlhZ3JhbURvY3VtZW50UHJvdmlkZXJfSW5jb3JyZWN0SW5wdXRFcnJvciwKLQkJCQkJCQkJCQkJbmV3IE9iamVjdFtdIHsKLQkJCQkJCQkJCQkJCQllbGVtZW50LAotCQkJCQkJCQkJCQkJCSJvcmcuZWNsaXBzZS51aS5wYXJ0LkZpbGVFZGl0b3JJbnB1dCIsCi0JCQkJCQkJCQkJCQkJIm9yZy5lY2xpcHNlLmVtZi5jb21tb24udWkuVVJJRWRpdG9ySW5wdXQiIH0pLAotCQkJCQkJCW51bGwpKTsKLQkJfQotCQlJRG9jdW1lbnQgZG9jdW1lbnQgPSBjcmVhdGVFbXB0eURvY3VtZW50KCk7Ci0JCXNldERvY3VtZW50Q29udGVudChkb2N1bWVudCwgKElFZGl0b3JJbnB1dCkgZWxlbWVudCk7Ci0JCXNldHVwRG9jdW1lbnQoZWxlbWVudCwgZG9jdW1lbnQpOwotCQlyZXR1cm4gZG9jdW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB1cCB0aGUgZ2l2ZW4gZG9jdW1lbnQgYXMgaXQgd291bGQgYmUgcHJvdmlkZWQgZm9yIHRoZSBnaXZlbiBlbGVtZW50LiBUaGUKLQkgKiBjb250ZW50IG9mIHRoZSBkb2N1bWVudCBpcyBub3QgY2hhbmdlZC4gVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGlzIGVtcHR5LgotCSAqIFN1YmNsYXNzZXMgbWF5IHJlaW1wbGVtZW50LgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50IHRoZSBibHVlLXByaW50IGVsZW1lbnQKLQkgKiBAcGFyYW0gZG9jdW1lbnQgdGhlIGRvY3VtZW50IHRvIHNldCB1cAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXR1cERvY3VtZW50KE9iamVjdCBlbGVtZW50LCBJRG9jdW1lbnQgZG9jdW1lbnQpIHsKLQkJLy8gZm9yIHN1YmNsYXNzZXMKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBsb25nIGNvbXB1dGVNb2RpZmljYXRpb25TdGFtcChSZXNvdXJjZVNldEluZm8gaW5mbykgewotCQlpbnQgcmVzdWx0ID0gMDsKLQkJZm9yIChJdGVyYXRvciBpdCA9IGluZm8uZ2V0UmVzb3VyY2VTZXQoKS5nZXRSZXNvdXJjZXMoKS5pdGVyYXRvcigpOyBpdAotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQlSZXNvdXJjZSBuZXh0UmVzb3VyY2UgPSAoUmVzb3VyY2UpIGl0Lm5leHQoKTsKLQkJCUlGaWxlIGZpbGUgPSBXb3Jrc3BhY2VTeW5jaHJvbml6ZXIuZ2V0RmlsZShuZXh0UmVzb3VyY2UpOwotCQkJaWYgKGZpbGUgIT0gbnVsbCkgewotCQkJCWlmIChmaWxlLmdldExvY2F0aW9uKCkgIT0gbnVsbCkgewotCQkJCQlyZXN1bHQgKz0gZmlsZS5nZXRMb2NhdGlvbigpLnRvRmlsZSgpLmxhc3RNb2RpZmllZCgpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXJlc3VsdCArPSBmaWxlLmdldE1vZGlmaWNhdGlvblN0YW1wKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJRG9jdW1lbnQgY3JlYXRlRW1wdHlEb2N1bWVudCgpIHsKLQkJRGlhZ3JhbURvY3VtZW50IGRvY3VtZW50ID0gbmV3IERpYWdyYW1Eb2N1bWVudCgpOwotCQlkb2N1bWVudC5zZXRFZGl0aW5nRG9tYWluKGNyZWF0ZUVkaXRpbmdEb21haW4oKSk7Ci0JCXJldHVybiBkb2N1bWVudDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiBjcmVhdGVFZGl0aW5nRG9tYWluKCkgewotCQlUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiBlZGl0aW5nRG9tYWluID0gRGlhZ3JhbUVkaXRpbmdEb21haW5GYWN0b3J5Ci0JCQkJLmdldEluc3RhbmNlKCkuY3JlYXRlRWRpdGluZ0RvbWFpbigpOwotCQllZGl0aW5nRG9tYWluLnNldElEKCJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuRWRpdGluZ0RvbWFpbiIpOyAvLyROT04tTkxTLTEkCi0JCWZpbmFsIE5vdGlmaWNhdGlvbkZpbHRlciBkaWFncmFtUmVzb3VyY2VNb2RpZmllZEZpbHRlciA9IE5vdGlmaWNhdGlvbkZpbHRlcgotCQkJCS5jcmVhdGVOb3RpZmllckZpbHRlcihlZGl0aW5nRG9tYWluLmdldFJlc291cmNlU2V0KCkpLmFuZCgKLQkJCQkJCU5vdGlmaWNhdGlvbkZpbHRlcgotCQkJCQkJCQkuY3JlYXRlRXZlbnRUeXBlRmlsdGVyKE5vdGlmaWNhdGlvbi5BREQpKS5hbmQoCi0JCQkJCQlOb3RpZmljYXRpb25GaWx0ZXIuY3JlYXRlRmVhdHVyZUZpbHRlcigKLQkJCQkJCQkJUmVzb3VyY2VTZXQuY2xhc3MsCi0JCQkJCQkJCVJlc291cmNlU2V0LlJFU09VUkNFX1NFVF9fUkVTT1VSQ0VTKSk7Ci0JCWVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VTZXQoKS5lQWRhcHRlcnMoKS5hZGQobmV3IEFkYXB0ZXIoKSB7Ci0KLQkJCXByaXZhdGUgTm90aWZpZXIgbXlUYXJnZXI7Ci0KLQkJCXB1YmxpYyBOb3RpZmllciBnZXRUYXJnZXQoKSB7Ci0JCQkJcmV0dXJuIG15VGFyZ2VyOwotCQkJfQotCi0JCQlwdWJsaWMgYm9vbGVhbiBpc0FkYXB0ZXJGb3JUeXBlKE9iamVjdCB0eXBlKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJCQlpZiAoZGlhZ3JhbVJlc291cmNlTW9kaWZpZWRGaWx0ZXIubWF0Y2hlcyhub3RpZmljYXRpb24pKSB7Ci0JCQkJCU9iamVjdCB2YWx1ZSA9IG5vdGlmaWNhdGlvbi5nZXROZXdWYWx1ZSgpOwotCQkJCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBSZXNvdXJjZSkgewotCQkJCQkJKChSZXNvdXJjZSkgdmFsdWUpLnNldFRyYWNraW5nTW9kaWZpY2F0aW9uKHRydWUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBzZXRUYXJnZXQoTm90aWZpZXIgbmV3VGFyZ2V0KSB7Ci0JCQkJbXlUYXJnZXIgPSBuZXdUYXJnZXQ7Ci0JCQl9Ci0KLQkJfSk7Ci0KLQkJcmV0dXJuIGVkaXRpbmdEb21haW47Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldERvY3VtZW50Q29udGVudChJRG9jdW1lbnQgZG9jdW1lbnQsIElFZGl0b3JJbnB1dCBlbGVtZW50KQotCQkJdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJRGlhZ3JhbURvY3VtZW50IGRpYWdyYW1Eb2N1bWVudCA9IChJRGlhZ3JhbURvY3VtZW50KSBkb2N1bWVudDsKLQkJVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gZG9tYWluID0gZGlhZ3JhbURvY3VtZW50LmdldEVkaXRpbmdEb21haW4oKTsKLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBGaWxlRWRpdG9ySW5wdXQpIHsKLQkJCUlTdG9yYWdlIHN0b3JhZ2UgPSAoKEZpbGVFZGl0b3JJbnB1dCkgZWxlbWVudCkuZ2V0U3RvcmFnZSgpOwotCQkJRGlhZ3JhbSBkaWFncmFtID0gRGlhZ3JhbUlPVXRpbC5sb2FkKGRvbWFpbiwgc3RvcmFnZSwgdHJ1ZSwKLQkJCQkJZ2V0UHJvZ3Jlc3NNb25pdG9yKCkpOwotCQkJZG9jdW1lbnQuc2V0Q29udGVudChkaWFncmFtKTsKLQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgVVJJRWRpdG9ySW5wdXQpIHsKLQkJCVVSSSB1cmkgPSAoKFVSSUVkaXRvcklucHV0KSBlbGVtZW50KS5nZXRVUkkoKTsKLQkJCVJlc291cmNlIHJlc291cmNlID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJcmVzb3VyY2UgPSBkb21haW4uZ2V0UmVzb3VyY2VTZXQoKS5nZXRSZXNvdXJjZSgKLQkJCQkJCXVyaS50cmltRnJhZ21lbnQoKSwgZmFsc2UpOwotCQkJCWlmIChyZXNvdXJjZSA9PSBudWxsKSB7Ci0JCQkJCXJlc291cmNlID0gZG9tYWluLmdldFJlc291cmNlU2V0KCkuY3JlYXRlUmVzb3VyY2UoCi0JCQkJCQkJdXJpLnRyaW1GcmFnbWVudCgpKTsKLQkJCQl9Ci0JCQkJaWYgKCFyZXNvdXJjZS5pc0xvYWRlZCgpKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlNYXAgb3B0aW9ucyA9IG5ldyBIYXNoTWFwKEdNRlJlc291cmNlRmFjdG9yeQotCQkJCQkJCQkuZ2V0RGVmYXVsdExvYWRPcHRpb25zKCkpOwotCQkJCQkJLy8gQHNlZSAxNzEwNjAgCi0JCQkJCQkvLyBvcHRpb25zLnB1dChvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLlhNTFJlc291cmNlLk9QVElPTl9SRUNPUkRfVU5LTk9XTl9GRUFUVVJFLCBCb29sZWFuLlRSVUUpOwotCQkJCQkJcmVzb3VyY2UubG9hZChvcHRpb25zKTsKLQkJCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCQkJcmVzb3VyY2UudW5sb2FkKCk7Ci0JCQkJCQl0aHJvdyBlOwotCQkJCQl9Ci0JCQkJfQotCQkJCWlmIChyZXNvdXJjZSA9PSBudWxsKSB7Ci0JCQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKAotCQkJCQkJCU1lc3NhZ2VzLkRpYWdyYW1Eb2N1bWVudFByb3ZpZGVyX1VuYWJsZVRvTG9hZFJlc291cmNlRXJyb3IpOwotCQkJCX0KLQkJCQlpZiAodXJpLmZyYWdtZW50KCkgIT0gbnVsbCkgewotCQkJCQlFT2JqZWN0IHJvb3RFbGVtZW50ID0gcmVzb3VyY2UuZ2V0RU9iamVjdCh1cmkuZnJhZ21lbnQoKSk7Ci0JCQkJCWlmIChyb290RWxlbWVudCBpbnN0YW5jZW9mIERpYWdyYW0pIHsKLQkJCQkJCWRvY3VtZW50LnNldENvbnRlbnQoKERpYWdyYW0pIHJvb3RFbGVtZW50KTsKLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCWZvciAoSXRlcmF0b3IgaXQgPSByZXNvdXJjZS5nZXRDb250ZW50cygpLml0ZXJhdG9yKCk7IGl0Ci0JCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCU9iamVjdCByb290RWxlbWVudCA9IGl0Lm5leHQoKTsKLQkJCQkJCWlmIChyb290RWxlbWVudCBpbnN0YW5jZW9mIERpYWdyYW0pIHsKLQkJCQkJCQlkb2N1bWVudC5zZXRDb250ZW50KChEaWFncmFtKSByb290RWxlbWVudCk7Ci0JCQkJCQkJcmV0dXJuOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKAotCQkJCQkJTWVzc2FnZXMuRGlhZ3JhbURvY3VtZW50UHJvdmlkZXJfTm9EaWFncmFtSW5SZXNvdXJjZUVycm9yKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJQ29yZUV4Y2VwdGlvbiB0aHJvd25FeGNwID0gbnVsbDsKLQkJCQlpZiAoZSBpbnN0YW5jZW9mIENvcmVFeGNlcHRpb24pIHsKLQkJCQkJdGhyb3duRXhjcCA9IChDb3JlRXhjZXB0aW9uKSBlOwotCQkJCX0gZWxzZSB7Ci0JCQkJCVN0cmluZyBtc2cgPSBlLmdldExvY2FsaXplZE1lc3NhZ2UoKTsKLQkJCQkJdGhyb3duRXhjcCA9IG5ldyBDb3JlRXhjZXB0aW9uKAotCQkJCQkJCW5ldyBTdGF0dXMoCi0JCQkJCQkJCQlJU3RhdHVzLkVSUk9SLAotCQkJCQkJCQkJQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9yUGx1Z2luLklELAotCQkJCQkJCQkJMCwKLQkJCQkJCQkJCW1zZyAhPSBudWxsID8gbXNnCi0JCQkJCQkJCQkJCTogTWVzc2FnZXMuRGlhZ3JhbURvY3VtZW50UHJvdmlkZXJfRGlhZ3JhbUxvYWRpbmdFcnJvciwKLQkJCQkJCQkJCWUpKTsKLQkJCQl9Ci0JCQkJdGhyb3cgdGhyb3duRXhjcDsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKAotCQkJCQluZXcgU3RhdHVzKAotCQkJCQkJCUlTdGF0dXMuRVJST1IsCi0JCQkJCQkJQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9yUGx1Z2luLklELAotCQkJCQkJCTAsCi0JCQkJCQkJTkxTCi0JCQkJCQkJCQkuYmluZCgKLQkJCQkJCQkJCQkJTWVzc2FnZXMuRGlhZ3JhbURvY3VtZW50UHJvdmlkZXJfSW5jb3JyZWN0SW5wdXRFcnJvciwKLQkJCQkJCQkJCQkJbmV3IE9iamVjdFtdIHsKLQkJCQkJCQkJCQkJCQllbGVtZW50LAotCQkJCQkJCQkJCQkJCSJvcmcuZWNsaXBzZS51aS5wYXJ0LkZpbGVFZGl0b3JJbnB1dCIsCi0JCQkJCQkJCQkJCQkJIm9yZy5lY2xpcHNlLmVtZi5jb21tb24udWkuVVJJRWRpdG9ySW5wdXQiIH0pLAotCQkJCQkJCW51bGwpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgbG9uZyBnZXRNb2RpZmljYXRpb25TdGFtcChPYmplY3QgZWxlbWVudCkgewotCQlSZXNvdXJjZVNldEluZm8gaW5mbyA9IGdldFJlc291cmNlU2V0SW5mbyhlbGVtZW50KTsKLQkJaWYgKGluZm8gIT0gbnVsbCkgewotCQkJcmV0dXJuIGNvbXB1dGVNb2RpZmljYXRpb25TdGFtcChpbmZvKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0TW9kaWZpY2F0aW9uU3RhbXAoZWxlbWVudCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRGVsZXRlZChPYmplY3QgZWxlbWVudCkgewotCQlJRGlhZ3JhbURvY3VtZW50IGRvY3VtZW50ID0gZ2V0RGlhZ3JhbURvY3VtZW50KGVsZW1lbnQpOwotCQlpZiAoZG9jdW1lbnQgIT0gbnVsbCkgewotCQkJUmVzb3VyY2UgZGlhZ3JhbVJlc291cmNlID0gZG9jdW1lbnQuZ2V0RGlhZ3JhbSgpLmVSZXNvdXJjZSgpOwotCQkJaWYgKGRpYWdyYW1SZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQkJSUZpbGUgZmlsZSA9IFdvcmtzcGFjZVN5bmNocm9uaXplci5nZXRGaWxlKGRpYWdyYW1SZXNvdXJjZSk7Ci0JCQkJcmV0dXJuIGZpbGUgPT0gbnVsbCB8fCBmaWxlLmdldExvY2F0aW9uKCkgPT0gbnVsbAotCQkJCQkJfHwgIWZpbGUuZ2V0TG9jYXRpb24oKS50b0ZpbGUoKS5leGlzdHMoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXIuaXNEZWxldGVkKGVsZW1lbnQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VTZXRJbmZvIGdldFJlc291cmNlU2V0SW5mbyhPYmplY3QgZWRpdG9ySW5wdXQpIHsKLQkJcmV0dXJuIChSZXNvdXJjZVNldEluZm8pIHN1cGVyLmdldEVsZW1lbnRJbmZvKGVkaXRvcklucHV0KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZGlzcG9zZUVsZW1lbnRJbmZvKE9iamVjdCBlbGVtZW50LCBFbGVtZW50SW5mbyBpbmZvKSB7Ci0JCWlmIChpbmZvIGluc3RhbmNlb2YgUmVzb3VyY2VTZXRJbmZvKSB7Ci0JCQlSZXNvdXJjZVNldEluZm8gcmVzb3VyY2VTZXRJbmZvID0gKFJlc291cmNlU2V0SW5mbykgaW5mbzsKLQkJCXJlc291cmNlU2V0SW5mby5kaXNwb3NlKCk7Ci0JCX0KLQkJc3VwZXIuZGlzcG9zZUVsZW1lbnRJbmZvKGVsZW1lbnQsIGluZm8pOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkb1ZhbGlkYXRlU3RhdGUoT2JqZWN0IGVsZW1lbnQsIE9iamVjdCBjb21wdXRhdGlvbkNvbnRleHQpCi0JCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCVJlc291cmNlU2V0SW5mbyBpbmZvID0gZ2V0UmVzb3VyY2VTZXRJbmZvKGVsZW1lbnQpOwotCQlpZiAoaW5mbyAhPSBudWxsKSB7Ci0JCQlDb2xsZWN0aW9uIGZpbGVzMlZhbGlkYXRlID0gbmV3IEFycmF5TGlzdCgpOwotCQkJZm9yIChJdGVyYXRvciBpdCA9IGluZm8uZ2V0UmVzb3VyY2VTZXQoKS5nZXRSZXNvdXJjZXMoKS5pdGVyYXRvcigpOyBpdAotCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCVJlc291cmNlIG5leHRSZXNvdXJjZSA9IChSZXNvdXJjZSkgaXQubmV4dCgpOwotCQkJCUlGaWxlIGZpbGUgPSBXb3Jrc3BhY2VTeW5jaHJvbml6ZXIuZ2V0RmlsZShuZXh0UmVzb3VyY2UpOwotCQkJCWlmIChmaWxlICE9IG51bGwgJiYgZmlsZS5pc1JlYWRPbmx5KCkpIHsKLQkJCQkJZmlsZXMyVmFsaWRhdGUuYWRkKGZpbGUpOwotCQkJCX0KLQkJCX0KLQkJCVJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS52YWxpZGF0ZUVkaXQoCi0JCQkJCShJRmlsZVtdKSBmaWxlczJWYWxpZGF0ZS50b0FycmF5KG5ldyBJRmlsZVtmaWxlczJWYWxpZGF0ZQotCQkJCQkJCS5zaXplKCldKSwgY29tcHV0YXRpb25Db250ZXh0KTsKLQkJfQotCi0JCXN1cGVyLmRvVmFsaWRhdGVTdGF0ZShlbGVtZW50LCBjb21wdXRhdGlvbkNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1JlYWRPbmx5KE9iamVjdCBlbGVtZW50KSB7Ci0JCVJlc291cmNlU2V0SW5mbyBpbmZvID0gZ2V0UmVzb3VyY2VTZXRJbmZvKGVsZW1lbnQpOwotCQlpZiAoaW5mbyAhPSBudWxsKSB7Ci0JCQlpZiAoaW5mby5pc1VwZGF0ZUNhY2hlKCkpIHsKLQkJCQl0cnkgewotCQkJCQl1cGRhdGVDYWNoZShlbGVtZW50KTsKLQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCUFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmxvZ0Vycm9yKAotCQkJCQkJCU1lc3NhZ2VzLkRpYWdyYW1Eb2N1bWVudFByb3ZpZGVyX2lzTW9kaWZpYWJsZSwgZXgpOwotCQkJCQkvLyBFcnJvciBtZXNzYWdlIHRvIGxvZyB3YXMgaW5pdGlhbGx5IHRha2VuIGZyb20gb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXNvdXJjZXMuZWRpdG9yLmlkZS5pbnRlcm5hbC5sMTBuLkVkaXRvck1lc3NhZ2VzLlN0b3JhZ2VEb2N1bWVudFByb3ZpZGVyX2lzTW9kaWZpYWJsZQotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBpbmZvLmlzUmVhZE9ubHkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuaXNSZWFkT25seShlbGVtZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNNb2RpZmlhYmxlKE9iamVjdCBlbGVtZW50KSB7Ci0JCWlmICghaXNTdGF0ZVZhbGlkYXRlZChlbGVtZW50KSkgewotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBGaWxlRWRpdG9ySW5wdXQKLQkJCQkJfHwgZWxlbWVudCBpbnN0YW5jZW9mIFVSSUVkaXRvcklucHV0KSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJUmVzb3VyY2VTZXRJbmZvIGluZm8gPSBnZXRSZXNvdXJjZVNldEluZm8oZWxlbWVudCk7Ci0JCWlmIChpbmZvICE9IG51bGwpIHsKLQkJCWlmIChpbmZvLmlzVXBkYXRlQ2FjaGUoKSkgewotCQkJCXRyeSB7Ci0JCQkJCXVwZGF0ZUNhY2hlKGVsZW1lbnQpOwotCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZXgpIHsKLQkJCQkJQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkubG9nRXJyb3IoCi0JCQkJCQkJTWVzc2FnZXMuRGlhZ3JhbURvY3VtZW50UHJvdmlkZXJfaXNNb2RpZmlhYmxlLCBleCk7Ci0JCQkJCS8vIEVycm9yIG1lc3NhZ2UgdG8gbG9nIHdhcyBpbml0aWFsbHkgdGFrZW4gZnJvbSBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlc291cmNlcy5lZGl0b3IuaWRlLmludGVybmFsLmwxMG4uRWRpdG9yTWVzc2FnZXMuU3RvcmFnZURvY3VtZW50UHJvdmlkZXJfaXNNb2RpZmlhYmxlCi0JCQkJfQotCQkJfQotCQkJcmV0dXJuIGluZm8uaXNNb2RpZmlhYmxlKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmlzTW9kaWZpYWJsZShlbGVtZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlQ2FjaGUoT2JqZWN0IGVsZW1lbnQpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJUmVzb3VyY2VTZXRJbmZvIGluZm8gPSBnZXRSZXNvdXJjZVNldEluZm8oZWxlbWVudCk7Ci0JCWlmIChpbmZvICE9IG51bGwpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBpbmZvLmdldFJlc291cmNlU2V0KCkuZ2V0UmVzb3VyY2VzKCkuaXRlcmF0b3IoKTsgaXQKLQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQlSZXNvdXJjZSBuZXh0UmVzb3VyY2UgPSAoUmVzb3VyY2UpIGl0Lm5leHQoKTsKLQkJCQlJRmlsZSBmaWxlID0gV29ya3NwYWNlU3luY2hyb25pemVyLmdldEZpbGUobmV4dFJlc291cmNlKTsKLQkJCQlpZiAoZmlsZSAhPSBudWxsICYmIGZpbGUuaXNSZWFkT25seSgpKSB7Ci0JCQkJCWluZm8uc2V0UmVhZE9ubHkodHJ1ZSk7Ci0JCQkJCWluZm8uc2V0TW9kaWZpYWJsZShmYWxzZSk7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQl9Ci0JCQlpbmZvLnNldFJlYWRPbmx5KGZhbHNlKTsKLQkJCWluZm8uc2V0TW9kaWZpYWJsZSh0cnVlKTsKLQkJCXJldHVybjsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkb1VwZGF0ZVN0YXRlQ2FjaGUoT2JqZWN0IGVsZW1lbnQpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJUmVzb3VyY2VTZXRJbmZvIGluZm8gPSBnZXRSZXNvdXJjZVNldEluZm8oZWxlbWVudCk7Ci0JCWlmIChpbmZvICE9IG51bGwpIHsKLQkJCWluZm8uc2V0VXBkYXRlQ2FjaGUodHJ1ZSk7Ci0JCX0KLQkJc3VwZXIuZG9VcGRhdGVTdGF0ZUNhY2hlKGVsZW1lbnQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1N5bmNocm9uaXplZChPYmplY3QgZWxlbWVudCkgewotCQlSZXNvdXJjZVNldEluZm8gaW5mbyA9IGdldFJlc291cmNlU2V0SW5mbyhlbGVtZW50KTsKLQkJaWYgKGluZm8gIT0gbnVsbCkgewotCQkJcmV0dXJuIGluZm8uaXNTeW5jaHJvbml6ZWQoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuaXNTeW5jaHJvbml6ZWQoZWxlbWVudCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJU2NoZWR1bGluZ1J1bGUgZ2V0UmVzZXRSdWxlKE9iamVjdCBlbGVtZW50KSB7Ci0JCVJlc291cmNlU2V0SW5mbyBpbmZvID0gZ2V0UmVzb3VyY2VTZXRJbmZvKGVsZW1lbnQpOwotCQlpZiAoaW5mbyAhPSBudWxsKSB7Ci0JCQlDb2xsZWN0aW9uIHJ1bGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJZm9yIChJdGVyYXRvciBpdCA9IGluZm8uZ2V0UmVzb3VyY2VTZXQoKS5nZXRSZXNvdXJjZXMoKS5pdGVyYXRvcigpOyBpdAotCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCVJlc291cmNlIG5leHRSZXNvdXJjZSA9IChSZXNvdXJjZSkgaXQubmV4dCgpOwotCQkJCUlGaWxlIGZpbGUgPSBXb3Jrc3BhY2VTeW5jaHJvbml6ZXIuZ2V0RmlsZShuZXh0UmVzb3VyY2UpOwotCQkJCWlmIChmaWxlICE9IG51bGwpIHsKLQkJCQkJcnVsZXMuYWRkKFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSdWxlRmFjdG9yeSgpCi0JCQkJCQkJLm1vZGlmeVJ1bGUoZmlsZSkpOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBuZXcgTXVsdGlSdWxlKChJU2NoZWR1bGluZ1J1bGVbXSkgcnVsZXMKLQkJCQkJLnRvQXJyYXkobmV3IElTY2hlZHVsaW5nUnVsZVtydWxlcy5zaXplKCldKSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJU2NoZWR1bGluZ1J1bGUgZ2V0U2F2ZVJ1bGUoT2JqZWN0IGVsZW1lbnQpIHsKLQkJUmVzb3VyY2VTZXRJbmZvIGluZm8gPSBnZXRSZXNvdXJjZVNldEluZm8oZWxlbWVudCk7Ci0JCWlmIChpbmZvICE9IG51bGwpIHsKLQkJCUNvbGxlY3Rpb24gcnVsZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gaW5mby5nZXRSZXNvdXJjZVNldCgpLmdldFJlc291cmNlcygpLml0ZXJhdG9yKCk7IGl0Ci0JCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJUmVzb3VyY2UgbmV4dFJlc291cmNlID0gKFJlc291cmNlKSBpdC5uZXh0KCk7Ci0JCQkJSUZpbGUgZmlsZSA9IFdvcmtzcGFjZVN5bmNocm9uaXplci5nZXRGaWxlKG5leHRSZXNvdXJjZSk7Ci0JCQkJaWYgKGZpbGUgIT0gbnVsbCkgewotCQkJCQlydWxlcy5hZGQoY29tcHV0ZVNjaGVkdWxpbmdSdWxlKGZpbGUpKTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gbmV3IE11bHRpUnVsZSgoSVNjaGVkdWxpbmdSdWxlW10pIHJ1bGVzCi0JCQkJCS50b0FycmF5KG5ldyBJU2NoZWR1bGluZ1J1bGVbcnVsZXMuc2l6ZSgpXSkpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSVNjaGVkdWxpbmdSdWxlIGdldFN5bmNocm9uaXplUnVsZShPYmplY3QgZWxlbWVudCkgewotCQlSZXNvdXJjZVNldEluZm8gaW5mbyA9IGdldFJlc291cmNlU2V0SW5mbyhlbGVtZW50KTsKLQkJaWYgKGluZm8gIT0gbnVsbCkgewotCQkJQ29sbGVjdGlvbiBydWxlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBpbmZvLmdldFJlc291cmNlU2V0KCkuZ2V0UmVzb3VyY2VzKCkuaXRlcmF0b3IoKTsgaXQKLQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQlSZXNvdXJjZSBuZXh0UmVzb3VyY2UgPSAoUmVzb3VyY2UpIGl0Lm5leHQoKTsKLQkJCQlJRmlsZSBmaWxlID0gV29ya3NwYWNlU3luY2hyb25pemVyLmdldEZpbGUobmV4dFJlc291cmNlKTsKLQkJCQlpZiAoZmlsZSAhPSBudWxsKSB7Ci0JCQkJCXJ1bGVzLmFkZChSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0UnVsZUZhY3RvcnkoKQotCQkJCQkJCS5yZWZyZXNoUnVsZShmaWxlKSk7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIG5ldyBNdWx0aVJ1bGUoKElTY2hlZHVsaW5nUnVsZVtdKSBydWxlcwotCQkJCQkudG9BcnJheShuZXcgSVNjaGVkdWxpbmdSdWxlW3J1bGVzLnNpemUoKV0pKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElTY2hlZHVsaW5nUnVsZSBnZXRWYWxpZGF0ZVN0YXRlUnVsZShPYmplY3QgZWxlbWVudCkgewotCQlSZXNvdXJjZVNldEluZm8gaW5mbyA9IGdldFJlc291cmNlU2V0SW5mbyhlbGVtZW50KTsKLQkJaWYgKGluZm8gIT0gbnVsbCkgewotCQkJQ29sbGVjdGlvbiBmaWxlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBpbmZvLmdldFJlc291cmNlU2V0KCkuZ2V0UmVzb3VyY2VzKCkuaXRlcmF0b3IoKTsgaXQKLQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQlSZXNvdXJjZSBuZXh0UmVzb3VyY2UgPSAoUmVzb3VyY2UpIGl0Lm5leHQoKTsKLQkJCQlJRmlsZSBmaWxlID0gV29ya3NwYWNlU3luY2hyb25pemVyLmdldEZpbGUobmV4dFJlc291cmNlKTsKLQkJCQlpZiAoZmlsZSAhPSBudWxsKSB7Ci0JCQkJCWZpbGVzLmFkZChmaWxlKTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJ1bGVGYWN0b3J5KCkKLQkJCQkJLnZhbGlkYXRlRWRpdFJ1bGUoCi0JCQkJCQkJKElGaWxlW10pIGZpbGVzLnRvQXJyYXkobmV3IElGaWxlW2ZpbGVzLnNpemUoKV0pKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBJU2NoZWR1bGluZ1J1bGUgY29tcHV0ZVNjaGVkdWxpbmdSdWxlKElSZXNvdXJjZSB0b0NyZWF0ZU9yTW9kaWZ5KSB7Ci0JCWlmICh0b0NyZWF0ZU9yTW9kaWZ5LmV4aXN0cygpKQotCQkJcmV0dXJuIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSdWxlRmFjdG9yeSgpLm1vZGlmeVJ1bGUoCi0JCQkJCXRvQ3JlYXRlT3JNb2RpZnkpOwotCi0JCUlSZXNvdXJjZSBwYXJlbnQgPSB0b0NyZWF0ZU9yTW9kaWZ5OwotCQlkbyB7Ci0JCQkvKgotCQkJICogWFhYIFRoaXMgaXMgYSB3b3JrYXJvdW5kIGZvcgotCQkJICogaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTY3NjAxCi0JCQkgKiBJUmVzb3VyY2VSdWxlRmFjdG9yeS5jcmVhdGVSdWxlIHNob3VsZCBpdGVyYXRlIHRoZSBoaWVyYXJjaHkKLQkJCSAqIGl0c2VsZi4KLQkJCSAqLwotCQkJdG9DcmVhdGVPck1vZGlmeSA9IHBhcmVudDsKLQkJCXBhcmVudCA9IHRvQ3JlYXRlT3JNb2RpZnkuZ2V0UGFyZW50KCk7Ci0JCX0gd2hpbGUgKHBhcmVudCAhPSBudWxsICYmICFwYXJlbnQuZXhpc3RzKCkpOwotCi0JCXJldHVybiBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0UnVsZUZhY3RvcnkoKS5jcmVhdGVSdWxlKAotCQkJCXRvQ3JlYXRlT3JNb2RpZnkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkb1N5bmNocm9uaXplKE9iamVjdCBlbGVtZW50LCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCi0JCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCVJlc291cmNlU2V0SW5mbyBpbmZvID0gZ2V0UmVzb3VyY2VTZXRJbmZvKGVsZW1lbnQpOwotCQlpZiAoaW5mbyAhPSBudWxsKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gaW5mby5nZXRSZXNvdXJjZVNldCgpLmdldFJlc291cmNlcygpLml0ZXJhdG9yKCk7IGl0Ci0JCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJUmVzb3VyY2UgbmV4dFJlc291cmNlID0gKFJlc291cmNlKSBpdC5uZXh0KCk7Ci0JCQkJaGFuZGxlRWxlbWVudENoYW5nZWQoaW5mbywgbmV4dFJlc291cmNlLCBtb25pdG9yKTsKLQkJCX0KLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5kb1N5bmNocm9uaXplKGVsZW1lbnQsIG1vbml0b3IpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkb1NhdmVEb2N1bWVudChJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIE9iamVjdCBlbGVtZW50LAotCQkJSURvY3VtZW50IGRvY3VtZW50LCBib29sZWFuIG92ZXJ3cml0ZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlSZXNvdXJjZVNldEluZm8gaW5mbyA9IGdldFJlc291cmNlU2V0SW5mbyhlbGVtZW50KTsKLQkJaWYgKGluZm8gIT0gbnVsbCkgewotCQkJaWYgKCFvdmVyd3JpdGUgJiYgIWluZm8uaXNTeW5jaHJvbml6ZWQoKSkgewotCQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKAotCQkJCQkJbmV3IFN0YXR1cygKLQkJCQkJCQkJSVN0YXR1cy5FUlJPUiwKLQkJCQkJCQkJQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9yUGx1Z2luLklELAotCQkJCQkJCQlJU3RhdHVzLk9LLAotCQkJCQkJCQlNZXNzYWdlcy5EaWFncmFtRG9jdW1lbnRQcm92aWRlcl9VbnN5bmNocm9uaXplZEZpbGVTYXZlRXJyb3IsCi0JCQkJCQkJCW51bGwpKTsKLQkJCX0KLQkJCWluZm8uc3RvcFJlc291cmNlTGlzdGVuaW5nKCk7Ci0JCQlmaXJlRWxlbWVudFN0YXRlQ2hhbmdpbmcoZWxlbWVudCk7Ci0JCQlMaXN0IHJlc291cmNlcyA9IGluZm8uZ2V0UmVzb3VyY2VTZXQoKS5nZXRSZXNvdXJjZXMoKTsKLQkJCXRyeSB7Ci0JCQkJbW9uaXRvci5iZWdpblRhc2soCi0JCQkJCQlNZXNzYWdlcy5EaWFncmFtRG9jdW1lbnRQcm92aWRlcl9TYXZlRGlhZ3JhbVRhc2ssCi0JCQkJCQlyZXNvdXJjZXMuc2l6ZSgpICsgMSk7IC8vIlNhdmluZyBkaWFncmFtIgotCQkJCWZvciAoSXRlcmF0b3IgaXQgPSByZXNvdXJjZXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCQlSZXNvdXJjZSBuZXh0UmVzb3VyY2UgPSAoUmVzb3VyY2UpIGl0Lm5leHQoKTsKLQkJCQkJbW9uaXRvcgotCQkJCQkJCS5zZXRUYXNrTmFtZShOTFMKLQkJCQkJCQkJCS5iaW5kKAotCQkJCQkJCQkJCQlNZXNzYWdlcy5EaWFncmFtRG9jdW1lbnRQcm92aWRlcl9TYXZlTmV4dFJlc291cmNlVGFzaywKLQkJCQkJCQkJCQkJbmV4dFJlc291cmNlLmdldFVSSSgpKSk7Ci0JCQkJCWlmIChuZXh0UmVzb3VyY2UuaXNMb2FkZWQoKSkgewotCQkJCQkJdHJ5IHsKLQkJCQkJCQluZXh0UmVzb3VyY2Uuc2F2ZShEaWFncmFtRGlhZ3JhbUVkaXRvclV0aWwKLQkJCQkJCQkJCS5nZXRTYXZlT3B0aW9ucygpKTsKLQkJCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQlmaXJlRWxlbWVudFN0YXRlQ2hhbmdlRmFpbGVkKGVsZW1lbnQpOwotCQkJCQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwKLQkJCQkJCQkJCUFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvclBsdWdpbi5JRCwKLQkJCQkJCQkJCUVkaXRvclN0YXR1c0NvZGVzLlJFU09VUkNFX0ZBSUxVUkUsIGUKLQkJCQkJCQkJCQkJLmdldExvY2FsaXplZE1lc3NhZ2UoKSwgbnVsbCkpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCW1vbml0b3Iud29ya2VkKDEpOwotCQkJCX0KLQkJCQltb25pdG9yLmRvbmUoKTsKLQkJCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24geCkgewotCQkJCWZpcmVFbGVtZW50U3RhdGVDaGFuZ2VGYWlsZWQoZWxlbWVudCk7Ci0JCQkJdGhyb3cgeDsKLQkJCX0gZmluYWxseSB7Ci0JCQkJaW5mby5zdGFydFJlc291cmNlTGlzdGVuaW5nKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlRWxlbWVudENoYW5nZWQoUmVzb3VyY2VTZXRJbmZvIGluZm8sCi0JCQlSZXNvdXJjZSBjaGFuZ2VkUmVzb3VyY2UsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlJRmlsZSBmaWxlID0gV29ya3NwYWNlU3luY2hyb25pemVyLmdldEZpbGUoY2hhbmdlZFJlc291cmNlKTsKLQkJaWYgKGZpbGUgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlmaWxlLnJlZnJlc2hMb2NhbChJUmVzb3VyY2UuREVQVEhfSU5GSU5JVEUsIG1vbml0b3IpOwotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBleCkgewotCQkJCUFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvclBsdWdpbgotCQkJCQkJLmdldEluc3RhbmNlKCkKLQkJCQkJCS5sb2dFcnJvcigKLQkJCQkJCQkJTWVzc2FnZXMuRGlhZ3JhbURvY3VtZW50UHJvdmlkZXJfaGFuZGxlRWxlbWVudENvbnRlbnRDaGFuZ2VkLAotCQkJCQkJCQlleCk7Ci0JCQkJLy8gRXJyb3IgbWVzc2FnZSB0byBsb2cgd2FzIGluaXRpYWxseSB0YWtlbiBmcm9tIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVzb3VyY2VzLmVkaXRvci5pZGUuaW50ZXJuYWwubDEwbi5FZGl0b3JNZXNzYWdlcy5GaWxlRG9jdW1lbnRQcm92aWRlcl9oYW5kbGVFbGVtZW50Q29udGVudENoYW5nZWQKLQkJCX0KLQkJfQotCQljaGFuZ2VkUmVzb3VyY2UudW5sb2FkKCk7Ci0KLQkJZmlyZUVsZW1lbnRDb250ZW50QWJvdXRUb0JlUmVwbGFjZWQoaW5mby5nZXRFZGl0b3JJbnB1dCgpKTsKLQkJcmVtb3ZlVW5jaGFuZ2VkRWxlbWVudExpc3RlbmVycyhpbmZvLmdldEVkaXRvcklucHV0KCksIGluZm8pOwotCQlpbmZvLmZTdGF0dXMgPSBudWxsOwotCQl0cnkgewotCQkJc2V0RG9jdW1lbnRDb250ZW50KGluZm8uZkRvY3VtZW50LCBpbmZvLmdldEVkaXRvcklucHV0KCkpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCWluZm8uZlN0YXR1cyA9IGUuZ2V0U3RhdHVzKCk7Ci0JCX0KLQkJaWYgKCFpbmZvLmZDYW5CZVNhdmVkKSB7Ci0JCQlpbmZvLnNldE1vZGlmaWNhdGlvblN0YW1wKGNvbXB1dGVNb2RpZmljYXRpb25TdGFtcChpbmZvKSk7Ci0JCX0KLQkJYWRkVW5jaGFuZ2VkRWxlbWVudExpc3RlbmVycyhpbmZvLmdldEVkaXRvcklucHV0KCksIGluZm8pOwotCQlmaXJlRWxlbWVudENvbnRlbnRSZXBsYWNlZChpbmZvLmdldEVkaXRvcklucHV0KCkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVFbGVtZW50TW92ZWQoSUVkaXRvcklucHV0IGlucHV0LCBVUkkgdXJpKSB7Ci0JCWlmIChpbnB1dCBpbnN0YW5jZW9mIEZpbGVFZGl0b3JJbnB1dCkgewotCQkJSUZpbGUgbmV3RmlsZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0RmlsZSgKLQkJCQkJbmV3IFBhdGgoVVJJLmRlY29kZSh1cmkucGF0aCgpKSkucmVtb3ZlRmlyc3RTZWdtZW50cygxKSk7Ci0JCQlmaXJlRWxlbWVudE1vdmVkKGlucHV0LCBuZXdGaWxlID09IG51bGwgPyBudWxsCi0JCQkJCTogbmV3IEZpbGVFZGl0b3JJbnB1dChuZXdGaWxlKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJLy8gVE9ETzogYXBwZW5kIHN1ZmZpeCB0byB0aGUgVVJJISAodXNlIGRpYWdyYW0gYXMgYSBwYXJhbWV0ZXIpCi0JCWZpcmVFbGVtZW50TW92ZWQoaW5wdXQsIG5ldyBVUklFZGl0b3JJbnB1dCh1cmkpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElFZGl0b3JJbnB1dCBjcmVhdGVJbnB1dFdpdGhFZGl0aW5nRG9tYWluKElFZGl0b3JJbnB1dCBlZGl0b3JJbnB1dCwKLQkJCVRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIGRvbWFpbikgewotCQlyZXR1cm4gZWRpdG9ySW5wdXQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJRGlhZ3JhbURvY3VtZW50IGdldERpYWdyYW1Eb2N1bWVudChPYmplY3QgZWxlbWVudCkgewotCQlJRG9jdW1lbnQgZG9jID0gZ2V0RG9jdW1lbnQoZWxlbWVudCk7Ci0JCWlmIChkb2MgaW5zdGFuY2VvZiBJRGlhZ3JhbURvY3VtZW50KSB7Ci0JCQlyZXR1cm4gKElEaWFncmFtRG9jdW1lbnQpIGRvYzsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElSdW5uYWJsZUNvbnRleHQgZ2V0T3BlcmF0aW9uUnVubmVyKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIGNsYXNzIFJlc291cmNlU2V0SW5mbyBleHRlbmRzIEVsZW1lbnRJbmZvIHsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSBsb25nIG15TW9kaWZpY2F0aW9uU3RhbXAgPSBJUmVzb3VyY2UuTlVMTF9TVEFNUDsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSBXb3Jrc3BhY2VTeW5jaHJvbml6ZXIgbXlTeW5jaHJvbml6ZXI7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgQ29sbGVjdGlvbiBteVVuU3luY2hyb25pemVkUmVzb3VyY2VzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIElEaWFncmFtRG9jdW1lbnQgbXlEb2N1bWVudDsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSBJRWRpdG9ySW5wdXQgbXlFZGl0b3JJbnB1dDsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSBib29sZWFuIG15VXBkYXRlQ2FjaGUgPSB0cnVlOwotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIGJvb2xlYW4gbXlNb2RpZmlhYmxlID0gZmFsc2U7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgYm9vbGVhbiBteVJlYWRPbmx5ID0gdHJ1ZTsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSBSZXNvdXJjZVNldE1vZGlmaWNhdGlvbkxpc3RlbmVyIG15UmVzb3VyY2VTZXRMaXN0ZW5lcjsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIFJlc291cmNlU2V0SW5mbyhJRGlhZ3JhbURvY3VtZW50IGRvY3VtZW50LAotCQkJCUlFZGl0b3JJbnB1dCBlZGl0b3JJbnB1dCkgewotCQkJc3VwZXIoZG9jdW1lbnQpOwotCQkJbXlEb2N1bWVudCA9IGRvY3VtZW50OwotCQkJbXlFZGl0b3JJbnB1dCA9IGVkaXRvcklucHV0OwotCQkJc3RhcnRSZXNvdXJjZUxpc3RlbmluZygpOwotCQkJbXlSZXNvdXJjZVNldExpc3RlbmVyID0gbmV3IFJlc291cmNlU2V0TW9kaWZpY2F0aW9uTGlzdGVuZXIodGhpcyk7Ci0JCQlnZXRSZXNvdXJjZVNldCgpLmVBZGFwdGVycygpLmFkZChteVJlc291cmNlU2V0TGlzdGVuZXIpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBsb25nIGdldE1vZGlmaWNhdGlvblN0YW1wKCkgewotCQkJcmV0dXJuIG15TW9kaWZpY2F0aW9uU3RhbXA7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHZvaWQgc2V0TW9kaWZpY2F0aW9uU3RhbXAobG9uZyBtb2RpZmljYXRpb25TdGFtcCkgewotCQkJbXlNb2RpZmljYXRpb25TdGFtcCA9IG1vZGlmaWNhdGlvblN0YW1wOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBSZXNvdXJjZVNldCBnZXRSZXNvdXJjZVNldCgpIHsKLQkJCXJldHVybiBteURvY3VtZW50LmdldEVkaXRpbmdEb21haW4oKS5nZXRSZXNvdXJjZVNldCgpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBJRWRpdG9ySW5wdXQgZ2V0RWRpdG9ySW5wdXQoKSB7Ci0JCQlyZXR1cm4gbXlFZGl0b3JJbnB1dDsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkJc3RvcFJlc291cmNlTGlzdGVuaW5nKCk7Ci0JCQlnZXRSZXNvdXJjZVNldCgpLmVBZGFwdGVycygpLnJlbW92ZShteVJlc291cmNlU2V0TGlzdGVuZXIpOwotCQkJZm9yIChJdGVyYXRvciBpdCA9IGdldFJlc291cmNlU2V0KCkuZ2V0UmVzb3VyY2VzKCkuaXRlcmF0b3IoKTsgaXQKLQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQlSZXNvdXJjZSByZXNvdXJjZSA9IChSZXNvdXJjZSkgaXQubmV4dCgpOwotCQkJCXJlc291cmNlLnVubG9hZCgpOwotCQkJfQotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBib29sZWFuIGlzU3luY2hyb25pemVkKCkgewotCQkJcmV0dXJuIG15VW5TeW5jaHJvbml6ZWRSZXNvdXJjZXMuc2l6ZSgpID09IDA7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHZvaWQgc2V0VW5TeW5jaHJvbml6ZWQoUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJCW15VW5TeW5jaHJvbml6ZWRSZXNvdXJjZXMuYWRkKHJlc291cmNlKTsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBzZXRTeW5jaHJvbml6ZWQoUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJCW15VW5TeW5jaHJvbml6ZWRSZXNvdXJjZXMucmVtb3ZlKHJlc291cmNlKTsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgZmluYWwgdm9pZCBzdG9wUmVzb3VyY2VMaXN0ZW5pbmcoKSB7Ci0JCQlteVN5bmNocm9uaXplci5kaXNwb3NlKCk7Ci0JCQlteVN5bmNocm9uaXplciA9IG51bGw7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIGZpbmFsIHZvaWQgc3RhcnRSZXNvdXJjZUxpc3RlbmluZygpIHsKLQkJCW15U3luY2hyb25pemVyID0gbmV3IFdvcmtzcGFjZVN5bmNocm9uaXplcihteURvY3VtZW50Ci0JCQkJCS5nZXRFZGl0aW5nRG9tYWluKCksIG5ldyBTeW5jaHJvbml6ZXJEZWxlZ2F0ZSgpKTsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgYm9vbGVhbiBpc1VwZGF0ZUNhY2hlKCkgewotCQkJcmV0dXJuIG15VXBkYXRlQ2FjaGU7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHZvaWQgc2V0VXBkYXRlQ2FjaGUoYm9vbGVhbiB1cGRhdGUpIHsKLQkJCW15VXBkYXRlQ2FjaGUgPSB1cGRhdGU7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIGJvb2xlYW4gaXNNb2RpZmlhYmxlKCkgewotCQkJcmV0dXJuIG15TW9kaWZpYWJsZTsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBzZXRNb2RpZmlhYmxlKGJvb2xlYW4gbW9kaWZpYWJsZSkgewotCQkJbXlNb2RpZmlhYmxlID0gbW9kaWZpYWJsZTsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgYm9vbGVhbiBpc1JlYWRPbmx5KCkgewotCQkJcmV0dXJuIG15UmVhZE9ubHk7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHZvaWQgc2V0UmVhZE9ubHkoYm9vbGVhbiByZWFkT25seSkgewotCQkJbXlSZWFkT25seSA9IHJlYWRPbmx5OwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgY2xhc3MgU3luY2hyb25pemVyRGVsZWdhdGUgaW1wbGVtZW50cwotCQkJCVdvcmtzcGFjZVN5bmNocm9uaXplci5EZWxlZ2F0ZSB7Ci0KLQkJCS8qKgotCQkJICogQGdlbmVyYXRlZAotCQkJICovCi0JCQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkJfQotCi0JCQkvKioKLQkJCSAqIEBnZW5lcmF0ZWQKLQkJCSAqLwotCQkJcHVibGljIGJvb2xlYW4gaGFuZGxlUmVzb3VyY2VDaGFuZ2VkKGZpbmFsIFJlc291cmNlIHJlc291cmNlKSB7Ci0JCQkJc3luY2hyb25pemVkIChSZXNvdXJjZVNldEluZm8udGhpcykgewotCQkJCQlpZiAoUmVzb3VyY2VTZXRJbmZvLnRoaXMuZkNhbkJlU2F2ZWQpIHsKLQkJCQkJCVJlc291cmNlU2V0SW5mby50aGlzLnNldFVuU3luY2hyb25pemVkKHJlc291cmNlKTsKLQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQl9Ci0JCQkJfQotCQkJCURpc3BsYXkuZ2V0RGVmYXVsdCgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCWhhbmRsZUVsZW1lbnRDaGFuZ2VkKFJlc291cmNlU2V0SW5mby50aGlzLCByZXNvdXJjZSwKLQkJCQkJCQkJbnVsbCk7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQotCQkJLyoqCi0JCQkgKiBAZ2VuZXJhdGVkCi0JCQkgKi8KLQkJCXB1YmxpYyBib29sZWFuIGhhbmRsZVJlc291cmNlRGVsZXRlZChSZXNvdXJjZSByZXNvdXJjZSkgewotCQkJCXN5bmNocm9uaXplZCAoUmVzb3VyY2VTZXRJbmZvLnRoaXMpIHsKLQkJCQkJaWYgKFJlc291cmNlU2V0SW5mby50aGlzLmZDYW5CZVNhdmVkKSB7Ci0JCQkJCQlSZXNvdXJjZVNldEluZm8udGhpcy5zZXRVblN5bmNocm9uaXplZChyZXNvdXJjZSk7Ci0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJfQotCQkJCX0KLQkJCQlEaXNwbGF5LmdldERlZmF1bHQoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQlmaXJlRWxlbWVudERlbGV0ZWQoUmVzb3VyY2VTZXRJbmZvLnRoaXMKLQkJCQkJCQkJLmdldEVkaXRvcklucHV0KCkpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0KLQkJCS8qKgotCQkJICogQGdlbmVyYXRlZAotCQkJICovCi0JCQlwdWJsaWMgYm9vbGVhbiBoYW5kbGVSZXNvdXJjZU1vdmVkKFJlc291cmNlIHJlc291cmNlLAotCQkJCQlmaW5hbCBVUkkgbmV3VVJJKSB7Ci0JCQkJc3luY2hyb25pemVkIChSZXNvdXJjZVNldEluZm8udGhpcykgewotCQkJCQlpZiAoUmVzb3VyY2VTZXRJbmZvLnRoaXMuZkNhbkJlU2F2ZWQpIHsKLQkJCQkJCVJlc291cmNlU2V0SW5mby50aGlzLnNldFVuU3luY2hyb25pemVkKHJlc291cmNlKTsKLQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQl9Ci0JCQkJfQotCQkJCWlmIChteURvY3VtZW50LmdldERpYWdyYW0oKS5lUmVzb3VyY2UoKSA9PSByZXNvdXJjZSkgewotCQkJCQlEaXNwbGF5LmdldERlZmF1bHQoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCWhhbmRsZUVsZW1lbnRNb3ZlZChSZXNvdXJjZVNldEluZm8udGhpcwotCQkJCQkJCQkJLmdldEVkaXRvcklucHV0KCksIG5ld1VSSSk7Ci0JCQkJCQl9Ci0JCQkJCX0pOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWhhbmRsZVJlc291cmNlRGVsZXRlZChyZXNvdXJjZSk7Ci0JCQkJfQotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCi0JCX0KLQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIGNsYXNzIFJlc291cmNlU2V0TW9kaWZpY2F0aW9uTGlzdGVuZXIgZXh0ZW5kcyBFQ29udGVudEFkYXB0ZXIgewotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIE5vdGlmaWNhdGlvbkZpbHRlciBteU1vZGlmaWVkRmlsdGVyOwotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIFJlc291cmNlU2V0SW5mbyBteUluZm87Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBSZXNvdXJjZVNldE1vZGlmaWNhdGlvbkxpc3RlbmVyKFJlc291cmNlU2V0SW5mbyBpbmZvKSB7Ci0JCQlteUluZm8gPSBpbmZvOwotCQkJbXlNb2RpZmllZEZpbHRlciA9IE5vdGlmaWNhdGlvbkZpbHRlci5jcmVhdGVFdmVudFR5cGVGaWx0ZXIoCi0JCQkJCU5vdGlmaWNhdGlvbi5TRVQpLm9yKAotCQkJCQlOb3RpZmljYXRpb25GaWx0ZXIKLQkJCQkJCQkuY3JlYXRlRXZlbnRUeXBlRmlsdGVyKE5vdGlmaWNhdGlvbi5VTlNFVCkpLmFuZCgKLQkJCQkJTm90aWZpY2F0aW9uRmlsdGVyLmNyZWF0ZUZlYXR1cmVGaWx0ZXIoUmVzb3VyY2UuY2xhc3MsCi0JCQkJCQkJUmVzb3VyY2UuUkVTT1VSQ0VfX0lTX01PRElGSUVEKSk7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCQlpZiAobm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCkgaW5zdGFuY2VvZiBSZXNvdXJjZVNldCkgewotCQkJCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQkJCX0KLQkJCWlmICghbm90aWZpY2F0aW9uLmlzVG91Y2goKQotCQkJCQkmJiBteU1vZGlmaWVkRmlsdGVyLm1hdGNoZXMobm90aWZpY2F0aW9uKSkgewotCQkJCWlmIChub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKSBpbnN0YW5jZW9mIFJlc291cmNlKSB7Ci0JCQkJCVJlc291cmNlIHJlc291cmNlID0gKFJlc291cmNlKSBub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKTsKLQkJCQkJaWYgKHJlc291cmNlLmlzTG9hZGVkKCkpIHsKLQkJCQkJCWJvb2xlYW4gbW9kaWZpZWQgPSBmYWxzZTsKLQkJCQkJCWZvciAoSXRlcmF0b3IgaXQgPSBteUluZm8uZ2V0UmVzb3VyY2VTZXQoKQotCQkJCQkJCQkuZ2V0UmVzb3VyY2VzKCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpCi0JCQkJCQkJCSYmICFtb2RpZmllZDspIHsKLQkJCQkJCQlSZXNvdXJjZSBuZXh0UmVzb3VyY2UgPSAoUmVzb3VyY2UpIGl0Lm5leHQoKTsKLQkJCQkJCQlpZiAobmV4dFJlc291cmNlLmlzTG9hZGVkKCkpIHsKLQkJCQkJCQkJbW9kaWZpZWQgPSBuZXh0UmVzb3VyY2UuaXNNb2RpZmllZCgpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCWJvb2xlYW4gZGlydHlTdGF0ZUNoYW5nZWQgPSBmYWxzZTsKLQkJCQkJCXN5bmNocm9uaXplZCAobXlJbmZvKSB7Ci0JCQkJCQkJaWYgKG1vZGlmaWVkICE9IG15SW5mby5mQ2FuQmVTYXZlZCkgewotCQkJCQkJCQlteUluZm8uZkNhbkJlU2F2ZWQgPSBtb2RpZmllZDsKLQkJCQkJCQkJZGlydHlTdGF0ZUNoYW5nZWQgPSB0cnVlOwotCQkJCQkJCX0KLQkJCQkJCQlpZiAoIXJlc291cmNlLmlzTW9kaWZpZWQoKSkgewotCQkJCQkJCQlteUluZm8uc2V0U3luY2hyb25pemVkKHJlc291cmNlKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQlpZiAoZGlydHlTdGF0ZUNoYW5nZWQpIHsKLQkJCQkJCQlmaXJlRWxlbWVudERpcnR5U3RhdGVDaGFuZ2VkKG15SW5mbwotCQkJCQkJCQkJLmdldEVkaXRvcklucHV0KCksIG1vZGlmaWVkKTsKLQotCQkJCQkJCWlmICghbW9kaWZpZWQpIHsKLQkJCQkJCQkJbXlJbmZvCi0JCQkJCQkJCQkJLnNldE1vZGlmaWNhdGlvblN0YW1wKGNvbXB1dGVNb2RpZmljYXRpb25TdGFtcChteUluZm8pKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvcGFydC9EaWFncmFtSW5pdERpYWdyYW1GaWxlQWN0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9wYXJ0L0RpYWdyYW1Jbml0RGlhZ3JhbUZpbGVBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2M2MTQ1ZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9wYXJ0L0RpYWdyYW1Jbml0RGlhZ3JhbUZpbGVBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyOCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQucGFydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuV3JhcHBlZEV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5pbXBsLlJlc291cmNlU2V0SW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5UcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBhcnRzLkFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRQYXJ0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvcmUuR01GRWRpdGluZ0RvbWFpbkZhY3Rvcnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ1NldHRpbmdzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZERpYWxvZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSU9iamVjdEFjdGlvbkRlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERpYWdyYW1Jbml0RGlhZ3JhbUZpbGVBY3Rpb24gaW1wbGVtZW50cyBJT2JqZWN0QWN0aW9uRGVsZWdhdGUgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgSVdvcmtiZW5jaFBhcnQgdGFyZ2V0UGFydDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIFVSSSBkb21haW5Nb2RlbFVSSTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBY3RpdmVQYXJ0KElBY3Rpb24gYWN0aW9uLCBJV29ya2JlbmNoUGFydCB0YXJnZXRQYXJ0KSB7Ci0JCXRoaXMudGFyZ2V0UGFydCA9IHRhcmdldFBhcnQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoSUFjdGlvbiBhY3Rpb24sIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCWRvbWFpbk1vZGVsVVJJID0gbnVsbDsKLQkJYWN0aW9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQlpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24gPT0gZmFsc2UKLQkJCQl8fCBzZWxlY3Rpb24uaXNFbXB0eSgpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJSUZpbGUgZmlsZSA9IChJRmlsZSkgKChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uKQotCQkJCS5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJZG9tYWluTW9kZWxVUkkgPSBVUkkuY3JlYXRlUGxhdGZvcm1SZXNvdXJjZVVSSShmaWxlLmdldEZ1bGxQYXRoKCkKLQkJCQkudG9TdHJpbmcoKSwgdHJ1ZSk7Ci0JCWFjdGlvbi5zZXRFbmFibGVkKHRydWUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIFNoZWxsIGdldFNoZWxsKCkgewotCQlyZXR1cm4gdGFyZ2V0UGFydC5nZXRTaXRlKCkuZ2V0U2hlbGwoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgcnVuKElBY3Rpb24gYWN0aW9uKSB7Ci0JCVRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIGVkaXRpbmdEb21haW4gPSBHTUZFZGl0aW5nRG9tYWluRmFjdG9yeS5JTlNUQU5DRQotCQkJCS5jcmVhdGVFZGl0aW5nRG9tYWluKCk7Ci0JCVJlc291cmNlU2V0IHJlc291cmNlU2V0ID0gbmV3IFJlc291cmNlU2V0SW1wbCgpOwotCQlFT2JqZWN0IGRpYWdyYW1Sb290ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCVJlc291cmNlIHJlc291cmNlID0gcmVzb3VyY2VTZXQuZ2V0UmVzb3VyY2UoZG9tYWluTW9kZWxVUkksIHRydWUpOwotCQkJZGlhZ3JhbVJvb3QgPSAoRU9iamVjdCkgcmVzb3VyY2UuZ2V0Q29udGVudHMoKS5nZXQoMCk7Ci0JCX0gY2F0Y2ggKFdyYXBwZWRFeGNlcHRpb24gZXgpIHsKLQkJCUFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmxvZ0Vycm9yKAotCQkJCQkiVW5hYmxlIHRvIGxvYWQgcmVzb3VyY2U6ICIgKyBkb21haW5Nb2RlbFVSSSwgZXgpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJaWYgKGRpYWdyYW1Sb290ID09IG51bGwpIHsKLQkJCU1lc3NhZ2VEaWFsb2cKLQkJCQkJLm9wZW5FcnJvcigKLQkJCQkJCQlnZXRTaGVsbCgpLAotCQkJCQkJCU1lc3NhZ2VzLkRpYWdyYW1Jbml0RGlhZ3JhbUZpbGVBY3Rpb25fSW5pdERpYWdyYW1GaWxlUmVzb3VyY2VFcnJvckRpYWxvZ1RpdGxlLAotCQkJCQkJCU1lc3NhZ2VzLkRpYWdyYW1Jbml0RGlhZ3JhbUZpbGVBY3Rpb25fSW5pdERpYWdyYW1GaWxlUmVzb3VyY2VFcnJvckRpYWxvZ01lc3NhZ2UpOwotCQkJcmV0dXJuOwotCQl9Ci0JCVdpemFyZCB3aXphcmQgPSBuZXcgRGlhZ3JhbU5ld0RpYWdyYW1GaWxlV2l6YXJkKGRvbWFpbk1vZGVsVVJJLAotCQkJCWRpYWdyYW1Sb290LCBlZGl0aW5nRG9tYWluKTsKLQkJd2l6YXJkCi0JCQkJLnNldFdpbmRvd1RpdGxlKE5MUwotCQkJCQkJLmJpbmQoCi0JCQkJCQkJCU1lc3NhZ2VzLkRpYWdyYW1Jbml0RGlhZ3JhbUZpbGVBY3Rpb25fSW5pdERpYWdyYW1GaWxlV2l6YXJkVGl0bGUsCi0JCQkJCQkJCUFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRQYXJ0Lk1PREVMX0lEKSk7Ci0JCURpYWdyYW1EaWFncmFtRWRpdG9yVXRpbC5ydW5XaXphcmQoZ2V0U2hlbGwoKSwgd2l6YXJkLAotCQkJCSJJbml0RGlhZ3JhbUZpbGUiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL3BhcnQvRGlhZ3JhbUxvYWRSZXNvdXJjZUFjdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvcGFydC9EaWFncmFtTG9hZFJlc291cmNlQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5NzMyZmMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvcGFydC9EaWFncmFtTG9hZFJlc291cmNlQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQucGFydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5Mb2FkUmVzb3VyY2VBY3Rpb24uTG9hZFJlc291cmNlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklPYmplY3RBY3Rpb25EZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wYXJ0cy5BY3Rpdml0eURldGFpbERpYWdyYW1FZGl0UGFydDsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEaWFncmFtTG9hZFJlc291cmNlQWN0aW9uIGltcGxlbWVudHMgSU9iamVjdEFjdGlvbkRlbGVnYXRlIHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRQYXJ0IG15U2VsZWN0ZWRFbGVtZW50OwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgU2hlbGwgbXlTaGVsbDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBY3RpdmVQYXJ0KElBY3Rpb24gYWN0aW9uLCBJV29ya2JlbmNoUGFydCB0YXJnZXRQYXJ0KSB7Ci0JCW15U2hlbGwgPSB0YXJnZXRQYXJ0LmdldFNpdGUoKS5nZXRTaGVsbCgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBydW4oSUFjdGlvbiBhY3Rpb24pIHsKLQkJTG9hZFJlc291cmNlRGlhbG9nIGxvYWRSZXNvdXJjZURpYWxvZyA9IG5ldyBMb2FkUmVzb3VyY2VEaWFsb2cobXlTaGVsbCwKLQkJCQlteVNlbGVjdGVkRWxlbWVudC5nZXRFZGl0aW5nRG9tYWluKCkpOwotCQlsb2FkUmVzb3VyY2VEaWFsb2cub3BlbigpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElBY3Rpb24gYWN0aW9uLCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlteVNlbGVjdGVkRWxlbWVudCA9IG51bGw7Ci0JCWlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgewotCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc3RydWN0dXJlZFNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uOwotCQkJaWYgKHN0cnVjdHVyZWRTZWxlY3Rpb24uc2l6ZSgpID09IDEKLQkJCQkJJiYgc3RydWN0dXJlZFNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKSBpbnN0YW5jZW9mIEFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRQYXJ0KSB7Ci0JCQkJbXlTZWxlY3RlZEVsZW1lbnQgPSAoQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdFBhcnQpIHN0cnVjdHVyZWRTZWxlY3Rpb24KLQkJCQkJCS5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCX0KLQkJfQotCQlhY3Rpb24uc2V0RW5hYmxlZChpc0VuYWJsZWQoKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc0VuYWJsZWQoKSB7Ci0JCXJldHVybiBteVNlbGVjdGVkRWxlbWVudCAhPSBudWxsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvcGFydC9EaWFncmFtTWF0Y2hpbmdTdHJhdGVneS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvcGFydC9EaWFncmFtTWF0Y2hpbmdTdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDFkMWY3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL3BhcnQvRGlhZ3JhbU1hdGNoaW5nU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5wYXJ0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51aS5VUklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlc291cmNlcy5lZGl0b3IucGFydHMuRGlhZ3JhbURvY3VtZW50RWRpdG9yTWF0Y2hpbmdTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvck1hdGNoaW5nU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEaWFncmFtTWF0Y2hpbmdTdHJhdGVneSBpbXBsZW1lbnRzIElFZGl0b3JNYXRjaGluZ1N0cmF0ZWd5IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBtYXRjaGVzKElFZGl0b3JSZWZlcmVuY2UgZWRpdG9yUmVmLCBJRWRpdG9ySW5wdXQgaW5wdXQpIHsKLQkJSUVkaXRvcklucHV0IGVkaXRvcklucHV0OwotCQl0cnkgewotCQkJZWRpdG9ySW5wdXQgPSBlZGl0b3JSZWYuZ2V0RWRpdG9ySW5wdXQoKTsKLQkJfSBjYXRjaCAoUGFydEluaXRFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJaWYgKGVkaXRvcklucHV0LmVxdWFscyhpbnB1dCkpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWlmIChlZGl0b3JJbnB1dCBpbnN0YW5jZW9mIFVSSUVkaXRvcklucHV0Ci0JCQkJJiYgaW5wdXQgaW5zdGFuY2VvZiBVUklFZGl0b3JJbnB1dCkgewotCQkJcmV0dXJuICgoVVJJRWRpdG9ySW5wdXQpIGVkaXRvcklucHV0KS5nZXRVUkkoKS5lcXVhbHMoCi0JCQkJCSgoVVJJRWRpdG9ySW5wdXQpIGlucHV0KS5nZXRVUkkoKSk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL3BhcnQvRGlhZ3JhbU5ld0RpYWdyYW1GaWxlV2l6YXJkLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9wYXJ0L0RpYWdyYW1OZXdEaWFncmFtRmlsZVdpemFyZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZTQyYzA2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL3BhcnQvRGlhZ3JhbU5ld0RpYWdyYW1GaWxlV2l6YXJkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLnBhcnQ7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLm9wZXJhdGlvbnMuT3BlcmF0aW9uSGlzdG9yeUZhY3Rvcnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JV3JhcHBlckl0ZW1Qcm92aWRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5UcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBhcnRzLkFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRQYXJ0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUuY29tbWFuZC5Db21tYW5kUmVzdWx0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLnNlcnZpY2VzLlZpZXdTZXJ2aWNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLnNlcnZpY2VzLnZpZXcuQ3JlYXRlRGlhZ3JhbVZpZXdPcGVyYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29tbWFuZHMuY29yZS5jb21tYW5kLkFic3RyYWN0VHJhbnNhY3Rpb25hbENvbW1hbmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29yZS51dGlsLkVPYmplY3RBZGFwdGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRGlhZ3JhbTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVWaWV3ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuV2l6YXJkTmV3RmlsZUNyZWF0aW9uUGFnZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmlkZS5JREU7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRGlhZ3JhbU5ld0RpYWdyYW1GaWxlV2l6YXJkIGV4dGVuZHMgV2l6YXJkIHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIFRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIG15RWRpdGluZ0RvbWFpbjsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRGlhZ3JhbU5ld0RpYWdyYW1GaWxlV2l6YXJkKFVSSSBkb21haW5Nb2RlbFVSSSwgRU9iamVjdCBkaWFncmFtUm9vdCwKLQkJCVRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIGVkaXRpbmdEb21haW4pIHsKLQkJYXNzZXJ0IGRvbWFpbk1vZGVsVVJJICE9IG51bGwgOiAiRG9tYWluIG1vZGVsIHVyaSBtdXN0IGJlIHNwZWNpZmllZCI7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0IGRpYWdyYW1Sb290ICE9IG51bGwgOiAiRG9hZ3JhbSByb290IGVsZW1lbnQgbXVzdCBiZSBzcGVjaWZpZWQiOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydCBlZGl0aW5nRG9tYWluICE9IG51bGwgOiAiRWRpdGluZyBkb21haW4gbXVzdCBiZSBzcGVjaWZpZWQiOyAvLyROT04tTkxTLTEkCi0KLQkJbXlGaWxlQ3JlYXRpb25QYWdlID0gbmV3IFdpemFyZE5ld0ZpbGVDcmVhdGlvblBhZ2UoCi0JCQkJTWVzc2FnZXMuRGlhZ3JhbU5ld0RpYWdyYW1GaWxlV2l6YXJkX0NyZWF0aW9uUGFnZU5hbWUsCi0JCQkJU3RydWN0dXJlZFNlbGVjdGlvbi5FTVBUWSk7Ci0JCW15RmlsZUNyZWF0aW9uUGFnZQotCQkJCS5zZXRUaXRsZShNZXNzYWdlcy5EaWFncmFtTmV3RGlhZ3JhbUZpbGVXaXphcmRfQ3JlYXRpb25QYWdlVGl0bGUpOwotCQlteUZpbGVDcmVhdGlvblBhZ2Uuc2V0RGVzY3JpcHRpb24oTkxTLmJpbmQoCi0JCQkJTWVzc2FnZXMuRGlhZ3JhbU5ld0RpYWdyYW1GaWxlV2l6YXJkX0NyZWF0aW9uUGFnZURlc2NyaXB0aW9uLAotCQkJCUFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRQYXJ0Lk1PREVMX0lEKSk7Ci0JCUlQYXRoIGZpbGVQYXRoOwotCQlTdHJpbmcgZmlsZU5hbWUgPSBkb21haW5Nb2RlbFVSSS50cmltRmlsZUV4dGVuc2lvbigpLmxhc3RTZWdtZW50KCk7Ci0JCWlmIChkb21haW5Nb2RlbFVSSS5pc1BsYXRmb3JtUmVzb3VyY2UoKSkgewotCQkJZmlsZVBhdGggPSBuZXcgUGF0aChkb21haW5Nb2RlbFVSSS50cmltU2VnbWVudHMoMSkKLQkJCQkJLnRvUGxhdGZvcm1TdHJpbmcodHJ1ZSkpOwotCQl9IGVsc2UgaWYgKGRvbWFpbk1vZGVsVVJJLmlzRmlsZSgpKSB7Ci0JCQlmaWxlUGF0aCA9IG5ldyBQYXRoKGRvbWFpbk1vZGVsVVJJLnRyaW1TZWdtZW50cygxKS50b0ZpbGVTdHJpbmcoKSk7Ci0JCX0gZWxzZSB7Ci0JCQkvLyBUT0RPIDogdXNlIHNvbWUgZGVmYXVsdCBwYXRoCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAotCQkJCQkiVW5zdXBwb3J0ZWQgVVJJOiAiICsgZG9tYWluTW9kZWxVUkkpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJbXlGaWxlQ3JlYXRpb25QYWdlLnNldENvbnRhaW5lckZ1bGxQYXRoKGZpbGVQYXRoKTsKLQkJbXlGaWxlQ3JlYXRpb25QYWdlLnNldEZpbGVOYW1lKERpYWdyYW1EaWFncmFtRWRpdG9yVXRpbAotCQkJCS5nZXRVbmlxdWVGaWxlTmFtZShmaWxlUGF0aCwgZmlsZU5hbWUsICJ4bWkiKSk7IC8vJE5PTi1OTFMtMSQKLQotCQlkaWFncmFtUm9vdEVsZW1lbnRTZWxlY3Rpb25QYWdlID0gbmV3IERpYWdyYW1Sb290RWxlbWVudFNlbGVjdGlvblBhZ2UoCi0JCQkJTWVzc2FnZXMuRGlhZ3JhbU5ld0RpYWdyYW1GaWxlV2l6YXJkX1Jvb3RTZWxlY3Rpb25QYWdlTmFtZSk7Ci0JCWRpYWdyYW1Sb290RWxlbWVudFNlbGVjdGlvblBhZ2UKLQkJCQkuc2V0VGl0bGUoTWVzc2FnZXMuRGlhZ3JhbU5ld0RpYWdyYW1GaWxlV2l6YXJkX1Jvb3RTZWxlY3Rpb25QYWdlVGl0bGUpOwotCQlkaWFncmFtUm9vdEVsZW1lbnRTZWxlY3Rpb25QYWdlCi0JCQkJLnNldERlc2NyaXB0aW9uKE1lc3NhZ2VzLkRpYWdyYW1OZXdEaWFncmFtRmlsZVdpemFyZF9Sb290U2VsZWN0aW9uUGFnZURlc2NyaXB0aW9uKTsKLQkJZGlhZ3JhbVJvb3RFbGVtZW50U2VsZWN0aW9uUGFnZS5zZXRNb2RlbEVsZW1lbnQoZGlhZ3JhbVJvb3QpOwotCi0JCW15RWRpdGluZ0RvbWFpbiA9IGVkaXRpbmdEb21haW47Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgV2l6YXJkTmV3RmlsZUNyZWF0aW9uUGFnZSBteUZpbGVDcmVhdGlvblBhZ2U7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBNb2RlbEVsZW1lbnRTZWxlY3Rpb25QYWdlIGRpYWdyYW1Sb290RWxlbWVudFNlbGVjdGlvblBhZ2U7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgYWRkUGFnZXMoKSB7Ci0JCWFkZFBhZ2UobXlGaWxlQ3JlYXRpb25QYWdlKTsKLQkJYWRkUGFnZShkaWFncmFtUm9vdEVsZW1lbnRTZWxlY3Rpb25QYWdlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gcGVyZm9ybUZpbmlzaCgpIHsKLQkJTGlzdCBhZmZlY3RlZEZpbGVzID0gbmV3IExpbmtlZExpc3QoKTsKLQkJSUZpbGUgZGlhZ3JhbUZpbGUgPSBteUZpbGVDcmVhdGlvblBhZ2UuY3JlYXRlTmV3RmlsZSgpOwotCQlEaWFncmFtRGlhZ3JhbUVkaXRvclV0aWwuc2V0Q2hhcnNldChkaWFncmFtRmlsZSk7Ci0JCWFmZmVjdGVkRmlsZXMuYWRkKGRpYWdyYW1GaWxlKTsKLQkJVVJJIGRpYWdyYW1Nb2RlbFVSSSA9IFVSSS5jcmVhdGVQbGF0Zm9ybVJlc291cmNlVVJJKGRpYWdyYW1GaWxlCi0JCQkJLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKSwgdHJ1ZSk7Ci0JCVJlc291cmNlU2V0IHJlc291cmNlU2V0ID0gbXlFZGl0aW5nRG9tYWluLmdldFJlc291cmNlU2V0KCk7Ci0JCWZpbmFsIFJlc291cmNlIGRpYWdyYW1SZXNvdXJjZSA9IHJlc291cmNlU2V0Ci0JCQkJLmNyZWF0ZVJlc291cmNlKGRpYWdyYW1Nb2RlbFVSSSk7Ci0JCUFic3RyYWN0VHJhbnNhY3Rpb25hbENvbW1hbmQgY29tbWFuZCA9IG5ldyBBYnN0cmFjdFRyYW5zYWN0aW9uYWxDb21tYW5kKAotCQkJCW15RWRpdGluZ0RvbWFpbiwKLQkJCQlNZXNzYWdlcy5EaWFncmFtTmV3RGlhZ3JhbUZpbGVXaXphcmRfSW5pdERpYWdyYW1Db21tYW5kLAotCQkJCWFmZmVjdGVkRmlsZXMpIHsKLQotCQkJcHJvdGVjdGVkIENvbW1hbmRSZXN1bHQgZG9FeGVjdXRlV2l0aFJlc3VsdCgKLQkJCQkJSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pCi0JCQkJCXRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCQkJCWludCBkaWFncmFtVklEID0gRGlhZ3JhbVZpc3VhbElEUmVnaXN0cnkKLQkJCQkJCS5nZXREaWFncmFtVmlzdWFsSUQoZGlhZ3JhbVJvb3RFbGVtZW50U2VsZWN0aW9uUGFnZQotCQkJCQkJCQkuZ2V0TW9kZWxFbGVtZW50KCkpOwotCQkJCWlmIChkaWFncmFtVklEICE9IEFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRQYXJ0LlZJU1VBTF9JRCkgewotCQkJCQlyZXR1cm4gQ29tbWFuZFJlc3VsdAotCQkJCQkJCS5uZXdFcnJvckNvbW1hbmRSZXN1bHQoTWVzc2FnZXMuRGlhZ3JhbU5ld0RpYWdyYW1GaWxlV2l6YXJkX0luY29ycmVjdFJvb3RFcnJvcik7Ci0JCQkJfQotCQkJCURpYWdyYW0gZGlhZ3JhbSA9IFZpZXdTZXJ2aWNlCi0JCQkJCQkuY3JlYXRlRGlhZ3JhbSgKLQkJCQkJCQkJZGlhZ3JhbVJvb3RFbGVtZW50U2VsZWN0aW9uUGFnZQotCQkJCQkJCQkJCS5nZXRNb2RlbEVsZW1lbnQoKSwKLQkJCQkJCQkJQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdFBhcnQuTU9ERUxfSUQsCi0JCQkJCQkJCUFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvclBsdWdpbi5ESUFHUkFNX1BSRUZFUkVOQ0VTX0hJTlQpOwotCQkJCWRpYWdyYW1SZXNvdXJjZS5nZXRDb250ZW50cygpLmFkZChkaWFncmFtKTsKLQkJCQlkaWFncmFtUmVzb3VyY2UuZ2V0Q29udGVudHMoKS5hZGQoZGlhZ3JhbS5nZXRFbGVtZW50KCkpOwotCQkJCXJldHVybiBDb21tYW5kUmVzdWx0Lm5ld09LQ29tbWFuZFJlc3VsdCgpOwotCQkJfQotCQl9OwotCQl0cnkgewotCQkJT3BlcmF0aW9uSGlzdG9yeUZhY3RvcnkuZ2V0T3BlcmF0aW9uSGlzdG9yeSgpLmV4ZWN1dGUoY29tbWFuZCwKLQkJCQkJbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSwgbnVsbCk7Ci0JCQlkaWFncmFtUmVzb3VyY2Uuc2F2ZShEaWFncmFtRGlhZ3JhbUVkaXRvclV0aWwuZ2V0U2F2ZU9wdGlvbnMoKSk7Ci0JCQlEaWFncmFtRGlhZ3JhbUVkaXRvclV0aWwub3BlbkRpYWdyYW0oZGlhZ3JhbVJlc291cmNlKTsKLQkJfSBjYXRjaCAoRXhlY3V0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCUFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmxvZ0Vycm9yKAotCQkJCQkiVW5hYmxlIHRvIGNyZWF0ZSBtb2RlbCBhbmQgZGlhZ3JhbSIsIGUpOyAvLyROT04tTkxTLTEkCi0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7Ci0JCQlBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5sb2dFcnJvcigKLQkJCQkJIlNhdmUgb3BlcmF0aW9uIGZhaWxlZCBmb3I6ICIgKyBkaWFncmFtTW9kZWxVUkksIGV4KTsgLy8kTk9OLU5MUy0xJAotCQl9IGNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBleCkgewotCQkJQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkubG9nRXJyb3IoCi0JCQkJCSJVbmFibGUgdG8gb3BlbiBlZGl0b3IiLCBleCk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgRGlhZ3JhbVJvb3RFbGVtZW50U2VsZWN0aW9uUGFnZSBleHRlbmRzCi0JCQlNb2RlbEVsZW1lbnRTZWxlY3Rpb25QYWdlIHsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJvdGVjdGVkIERpYWdyYW1Sb290RWxlbWVudFNlbGVjdGlvblBhZ2UoU3RyaW5nIHBhZ2VOYW1lKSB7Ci0JCQlzdXBlcihwYWdlTmFtZSk7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJvdGVjdGVkIFN0cmluZyBnZXRTZWxlY3Rpb25UaXRsZSgpIHsKLQkJCXJldHVybiBNZXNzYWdlcy5EaWFncmFtTmV3RGlhZ3JhbUZpbGVXaXphcmRfUm9vdFNlbGVjdGlvblBhZ2VTZWxlY3Rpb25UaXRsZTsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcm90ZWN0ZWQgYm9vbGVhbiB2YWxpZGF0ZVBhZ2UoKSB7Ci0JCQlpZiAoc2VsZWN0ZWRNb2RlbEVsZW1lbnQgPT0gbnVsbCkgewotCQkJCXNldEVycm9yTWVzc2FnZShNZXNzYWdlcy5EaWFncmFtTmV3RGlhZ3JhbUZpbGVXaXphcmRfUm9vdFNlbGVjdGlvblBhZ2VOb1NlbGVjdGlvbk1lc3NhZ2UpOwotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCWJvb2xlYW4gcmVzdWx0ID0gVmlld1NlcnZpY2UKLQkJCQkJLmdldEluc3RhbmNlKCkKLQkJCQkJLnByb3ZpZGVzKAotCQkJCQkJCW5ldyBDcmVhdGVEaWFncmFtVmlld09wZXJhdGlvbigKLQkJCQkJCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihzZWxlY3RlZE1vZGVsRWxlbWVudCksCi0JCQkJCQkJCQlBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0UGFydC5NT0RFTF9JRCwKLQkJCQkJCQkJCUFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvclBsdWdpbi5ESUFHUkFNX1BSRUZFUkVOQ0VTX0hJTlQpKTsKLQkJCXNldEVycm9yTWVzc2FnZShyZXN1bHQgPyBudWxsCi0JCQkJCTogTWVzc2FnZXMuRGlhZ3JhbU5ld0RpYWdyYW1GaWxlV2l6YXJkX1Jvb3RTZWxlY3Rpb25QYWdlSW52YWxpZFNlbGVjdGlvbk1lc3NhZ2UpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9wYXJ0L0RpYWdyYW1QYWxldHRlRmFjdG9yeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvcGFydC9EaWFncmFtUGFsZXR0ZUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzEwZTNjOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9wYXJ0L0RpYWdyYW1QYWxldHRlRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5wYXJ0OwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLlRvb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnBhbGV0dGUuUGFsZXR0ZUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucGFsZXR0ZS5QYWxldHRlUm9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucGFsZXR0ZS5Ub29sRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQucHJvdmlkZXJzLkRpYWdyYW1FbGVtZW50VHlwZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucGFsZXR0ZS5QYWxldHRlRHJhd2VyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS50b29scy5VbnNwZWNpZmllZFR5cGVDb25uZWN0aW9uVG9vbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnRvb2xzLlVuc3BlY2lmaWVkVHlwZUNyZWF0aW9uVG9vbDsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEaWFncmFtUGFsZXR0ZUZhY3RvcnkgewotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHVibGljIHZvaWQgZmlsbFBhbGV0dGUoUGFsZXR0ZVJvb3QgcGFsZXR0ZVJvb3QpIHsKLQkJLy8JCXBhbGV0dGVSb290LmFkZChjcmVhdGVOb2RlczFHcm91cCgpKTsKLQkJLy8JCXBhbGV0dGVSb290LmFkZChjcmVhdGVMaW5rczJHcm91cCgpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBQYWxldHRlQ29udGFpbmVyIGNyZWF0ZU5vZGVzMUdyb3VwKCkgewotCQlQYWxldHRlRHJhd2VyIHBhbGV0dGVDb250YWluZXIgPSBuZXcgUGFsZXR0ZURyYXdlcigKLQkJCQlNZXNzYWdlcy5Ob2RlczFHcm91cF90aXRsZSk7Ci0JCXBhbGV0dGVDb250YWluZXIuYWRkKGNyZWF0ZVJvbGVOb2RlMUNyZWF0aW9uVG9vbCgpKTsKLQkJcGFsZXR0ZUNvbnRhaW5lci5hZGQoY3JlYXRlUm9sZVRhc2tDb21wb3NpdGUyQ3JlYXRpb25Ub29sKCkpOwotCQlwYWxldHRlQ29udGFpbmVyLmFkZChjcmVhdGVUYXNrTm9kZTNDcmVhdGlvblRvb2woKSk7Ci0JCXBhbGV0dGVDb250YWluZXIuYWRkKGNyZWF0ZVdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGU0Q3JlYXRpb25Ub29sKCkpOwotCQlwYWxldHRlQ29udGFpbmVyLmFkZChjcmVhdGVXb3JrUHJvZHVjdENvbXBvc2l0ZTVDcmVhdGlvblRvb2woKSk7Ci0JCXJldHVybiBwYWxldHRlQ29udGFpbmVyOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIFBhbGV0dGVDb250YWluZXIgY3JlYXRlTGlua3MyR3JvdXAoKSB7Ci0JCVBhbGV0dGVEcmF3ZXIgcGFsZXR0ZUNvbnRhaW5lciA9IG5ldyBQYWxldHRlRHJhd2VyKAotCQkJCU1lc3NhZ2VzLkxpbmtzMkdyb3VwX3RpdGxlKTsKLQkJcGFsZXR0ZUNvbnRhaW5lci5hZGQoY3JlYXRlTGluazFDcmVhdGlvblRvb2woKSk7Ci0JCXJldHVybiBwYWxldHRlQ29udGFpbmVyOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIFRvb2xFbnRyeSBjcmVhdGVSb2xlTm9kZTFDcmVhdGlvblRvb2woKSB7Ci0JCUxpc3QvKjxJRWxlbWVudFR5cGU+Ki90eXBlcyA9IG5ldyBBcnJheUxpc3QvKjxJRWxlbWVudFR5cGU+Ki8oMSk7Ci0JCXR5cGVzLmFkZChEaWFncmFtRWxlbWVudFR5cGVzLlJvbGVOb2RlXzIwMDEpOwotCQlOb2RlVG9vbEVudHJ5IGVudHJ5ID0gbmV3IE5vZGVUb29sRW50cnkoCi0JCQkJTWVzc2FnZXMuUm9sZU5vZGUxQ3JlYXRpb25Ub29sX3RpdGxlLAotCQkJCU1lc3NhZ2VzLlJvbGVOb2RlMUNyZWF0aW9uVG9vbF9kZXNjLCB0eXBlcyk7Ci0JCWVudHJ5LnNldFNtYWxsSWNvbihEaWFncmFtRWxlbWVudFR5cGVzCi0JCQkJLmdldEltYWdlRGVzY3JpcHRvcihEaWFncmFtRWxlbWVudFR5cGVzLlJvbGVOb2RlXzIwMDEpKTsKLQkJZW50cnkuc2V0TGFyZ2VJY29uKGVudHJ5LmdldFNtYWxsSWNvbigpKTsKLQkJcmV0dXJuIGVudHJ5OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIFRvb2xFbnRyeSBjcmVhdGVSb2xlVGFza0NvbXBvc2l0ZTJDcmVhdGlvblRvb2woKSB7Ci0JCUxpc3QvKjxJRWxlbWVudFR5cGU+Ki90eXBlcyA9IG5ldyBBcnJheUxpc3QvKjxJRWxlbWVudFR5cGU+Ki8oMSk7Ci0JCXR5cGVzLmFkZChEaWFncmFtRWxlbWVudFR5cGVzLlJvbGVUYXNrQ29tcG9zaXRlXzEwMDEpOwotCQlOb2RlVG9vbEVudHJ5IGVudHJ5ID0gbmV3IE5vZGVUb29sRW50cnkoCi0JCQkJTWVzc2FnZXMuUm9sZVRhc2tDb21wb3NpdGUyQ3JlYXRpb25Ub29sX3RpdGxlLAotCQkJCU1lc3NhZ2VzLlJvbGVUYXNrQ29tcG9zaXRlMkNyZWF0aW9uVG9vbF9kZXNjLCB0eXBlcyk7Ci0JCWVudHJ5Ci0JCQkJLnNldFNtYWxsSWNvbihEaWFncmFtRWxlbWVudFR5cGVzCi0JCQkJCQkuZ2V0SW1hZ2VEZXNjcmlwdG9yKERpYWdyYW1FbGVtZW50VHlwZXMuUm9sZVRhc2tDb21wb3NpdGVfMTAwMSkpOwotCQllbnRyeS5zZXRMYXJnZUljb24oZW50cnkuZ2V0U21hbGxJY29uKCkpOwotCQlyZXR1cm4gZW50cnk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgVG9vbEVudHJ5IGNyZWF0ZVRhc2tOb2RlM0NyZWF0aW9uVG9vbCgpIHsKLQkJTGlzdC8qPElFbGVtZW50VHlwZT4qL3R5cGVzID0gbmV3IEFycmF5TGlzdC8qPElFbGVtZW50VHlwZT4qLygxKTsKLQkJdHlwZXMuYWRkKERpYWdyYW1FbGVtZW50VHlwZXMuVGFza05vZGVfMjAwMik7Ci0JCU5vZGVUb29sRW50cnkgZW50cnkgPSBuZXcgTm9kZVRvb2xFbnRyeSgKLQkJCQlNZXNzYWdlcy5UYXNrTm9kZTNDcmVhdGlvblRvb2xfdGl0bGUsCi0JCQkJTWVzc2FnZXMuVGFza05vZGUzQ3JlYXRpb25Ub29sX2Rlc2MsIHR5cGVzKTsKLQkJZW50cnkuc2V0U21hbGxJY29uKERpYWdyYW1FbGVtZW50VHlwZXMKLQkJCQkuZ2V0SW1hZ2VEZXNjcmlwdG9yKERpYWdyYW1FbGVtZW50VHlwZXMuVGFza05vZGVfMjAwMikpOwotCQllbnRyeS5zZXRMYXJnZUljb24oZW50cnkuZ2V0U21hbGxJY29uKCkpOwotCQlyZXR1cm4gZW50cnk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgVG9vbEVudHJ5IGNyZWF0ZVdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGU0Q3JlYXRpb25Ub29sKCkgewotCQlMaXN0Lyo8SUVsZW1lbnRUeXBlPiovdHlwZXMgPSBuZXcgQXJyYXlMaXN0Lyo8SUVsZW1lbnRUeXBlPiovKDEpOwotCQl0eXBlcy5hZGQoRGlhZ3JhbUVsZW1lbnRUeXBlcy5Xb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlXzIwMDMpOwotCQlOb2RlVG9vbEVudHJ5IGVudHJ5ID0gbmV3IE5vZGVUb29sRW50cnkoCi0JCQkJTWVzc2FnZXMuV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZTRDcmVhdGlvblRvb2xfdGl0bGUsCi0JCQkJTWVzc2FnZXMuV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZTRDcmVhdGlvblRvb2xfZGVzYywgdHlwZXMpOwotCQllbnRyeQotCQkJCS5zZXRTbWFsbEljb24oRGlhZ3JhbUVsZW1lbnRUeXBlcwotCQkJCQkJLmdldEltYWdlRGVzY3JpcHRvcihEaWFncmFtRWxlbWVudFR5cGVzLldvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVfMjAwMykpOwotCQllbnRyeS5zZXRMYXJnZUljb24oZW50cnkuZ2V0U21hbGxJY29uKCkpOwotCQlyZXR1cm4gZW50cnk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgVG9vbEVudHJ5IGNyZWF0ZVdvcmtQcm9kdWN0Q29tcG9zaXRlNUNyZWF0aW9uVG9vbCgpIHsKLQkJTGlzdC8qPElFbGVtZW50VHlwZT4qL3R5cGVzID0gbmV3IEFycmF5TGlzdC8qPElFbGVtZW50VHlwZT4qLygxKTsKLQkJdHlwZXMuYWRkKERpYWdyYW1FbGVtZW50VHlwZXMuV29ya1Byb2R1Y3RDb21wb3NpdGVfMTAwMik7Ci0JCU5vZGVUb29sRW50cnkgZW50cnkgPSBuZXcgTm9kZVRvb2xFbnRyeSgKLQkJCQlNZXNzYWdlcy5Xb3JrUHJvZHVjdENvbXBvc2l0ZTVDcmVhdGlvblRvb2xfdGl0bGUsCi0JCQkJTWVzc2FnZXMuV29ya1Byb2R1Y3RDb21wb3NpdGU1Q3JlYXRpb25Ub29sX2Rlc2MsIHR5cGVzKTsKLQkJZW50cnkKLQkJCQkuc2V0U21hbGxJY29uKERpYWdyYW1FbGVtZW50VHlwZXMKLQkJCQkJCS5nZXRJbWFnZURlc2NyaXB0b3IoRGlhZ3JhbUVsZW1lbnRUeXBlcy5Xb3JrUHJvZHVjdENvbXBvc2l0ZV8xMDAyKSk7Ci0JCWVudHJ5LnNldExhcmdlSWNvbihlbnRyeS5nZXRTbWFsbEljb24oKSk7Ci0JCXJldHVybiBlbnRyeTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBUb29sRW50cnkgY3JlYXRlTGluazFDcmVhdGlvblRvb2woKSB7Ci0JCUxpc3QvKjxJRWxlbWVudFR5cGU+Ki90eXBlcyA9IG5ldyBBcnJheUxpc3QvKjxJRWxlbWVudFR5cGU+Ki8oMSk7Ci0JCXR5cGVzLmFkZChEaWFncmFtRWxlbWVudFR5cGVzLkxpbmtfMzAwMSk7Ci0JCUxpbmtUb29sRW50cnkgZW50cnkgPSBuZXcgTGlua1Rvb2xFbnRyeSgKLQkJCQlNZXNzYWdlcy5MaW5rMUNyZWF0aW9uVG9vbF90aXRsZSwKLQkJCQlNZXNzYWdlcy5MaW5rMUNyZWF0aW9uVG9vbF9kZXNjLCB0eXBlcyk7Ci0JCWVudHJ5LnNldFNtYWxsSWNvbihEaWFncmFtRWxlbWVudFR5cGVzCi0JCQkJLmdldEltYWdlRGVzY3JpcHRvcihEaWFncmFtRWxlbWVudFR5cGVzLkxpbmtfMzAwMSkpOwotCQllbnRyeS5zZXRMYXJnZUljb24oZW50cnkuZ2V0U21hbGxJY29uKCkpOwotCQlyZXR1cm4gZW50cnk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGNsYXNzIE5vZGVUb29sRW50cnkgZXh0ZW5kcyBUb29sRW50cnkgewotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIGZpbmFsIExpc3QgZWxlbWVudFR5cGVzOwotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIE5vZGVUb29sRW50cnkoU3RyaW5nIHRpdGxlLCBTdHJpbmcgZGVzY3JpcHRpb24sCi0JCQkJTGlzdCBlbGVtZW50VHlwZXMpIHsKLQkJCXN1cGVyKHRpdGxlLCBkZXNjcmlwdGlvbiwgbnVsbCwgbnVsbCk7Ci0JCQl0aGlzLmVsZW1lbnRUeXBlcyA9IGVsZW1lbnRUeXBlczsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgVG9vbCBjcmVhdGVUb29sKCkgewotCQkJVG9vbCB0b29sID0gbmV3IFVuc3BlY2lmaWVkVHlwZUNyZWF0aW9uVG9vbChlbGVtZW50VHlwZXMpOwotCQkJdG9vbC5zZXRQcm9wZXJ0aWVzKGdldFRvb2xQcm9wZXJ0aWVzKCkpOwotCQkJcmV0dXJuIHRvb2w7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTGlua1Rvb2xFbnRyeSBleHRlbmRzIFRvb2xFbnRyeSB7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgZmluYWwgTGlzdCByZWxhdGlvbnNoaXBUeXBlczsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSBMaW5rVG9vbEVudHJ5KFN0cmluZyB0aXRsZSwgU3RyaW5nIGRlc2NyaXB0aW9uLAotCQkJCUxpc3QgcmVsYXRpb25zaGlwVHlwZXMpIHsKLQkJCXN1cGVyKHRpdGxlLCBkZXNjcmlwdGlvbiwgbnVsbCwgbnVsbCk7Ci0JCQl0aGlzLnJlbGF0aW9uc2hpcFR5cGVzID0gcmVsYXRpb25zaGlwVHlwZXM7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIFRvb2wgY3JlYXRlVG9vbCgpIHsKLQkJCVRvb2wgdG9vbCA9IG5ldyBVbnNwZWNpZmllZFR5cGVDb25uZWN0aW9uVG9vbChyZWxhdGlvbnNoaXBUeXBlcyk7Ci0JCQl0b29sLnNldFByb3BlcnRpZXMoZ2V0VG9vbFByb3BlcnRpZXMoKSk7Ci0JCQlyZXR1cm4gdG9vbDsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL3BhcnQvRGlhZ3JhbVZpc3VhbElEUmVnaXN0cnkuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL3BhcnQvRGlhZ3JhbVZpc3VhbElEUmVnaXN0cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzY1YTViYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9wYXJ0L0RpYWdyYW1WaXN1YWxJRFJlZ2lzdHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NjggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLnBhcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBhcnRzLkFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBhcnRzLkxpbmtFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wYXJ0cy5MaW5rTmFtZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBhcnRzLlJvbGVOb2RlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucGFydHMuUm9sZU5vZGVOYW1lRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucGFydHMuUm9sZVRhc2tDb21wb3NpdGVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wYXJ0cy5Sb2xlVGFza0NvbXBvc2l0ZVJvbGVUYXNrQ29tcGFydG1lbnRFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wYXJ0cy5UYXNrTm9kZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBhcnRzLlRhc2tOb2RlTmFtZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBhcnRzLldvcmtQcm9kdWN0Q29tcG9zaXRlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucGFydHMuV29ya1Byb2R1Y3RDb21wb3NpdGVXb3JrUHJvZHVjdENvbXBhcnRtZW50RWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucGFydHMuV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZUVkaXRQYXJ0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucGFydHMuV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZU5hbWVFZGl0UGFydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkFjdGl2aXR5RGV0YWlsRGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5MaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk1vZGVsUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Sb2xlTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Sb2xlVGFza0NvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5UYXNrTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Xb3JrUHJvZHVjdENvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Xb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotCi0vKioKLSAqIFRoaXMgcmVnaXN0cnkgaXMgdXNlZCB0byBkZXRlcm1pbmUgd2hpY2ggdHlwZSBvZiB2aXN1YWwgb2JqZWN0IHNob3VsZCBiZQotICogY3JlYXRlZCBmb3IgdGhlIGNvcnJlc3BvbmRpbmcgRGlhZ3JhbSwgTm9kZSwgQ2hpbGROb2RlIG9yIExpbmsgcmVwcmVzZW50ZWQgCi0gKiBieSBhIGRvbWFpbiBtb2RlbCBvYmplY3QuCi0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRGlhZ3JhbVZpc3VhbElEUmVnaXN0cnkgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERUJVR19LRVkgPSBBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0b3JQbHVnaW4KLQkJCS5nZXRJbnN0YW5jZSgpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpCi0JCQkrICIvZGVidWcvdmlzdWFsSUQiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgZ2V0VmlzdWFsSUQoVmlldyB2aWV3KSB7Ci0JCWlmICh2aWV3IGluc3RhbmNlb2YgRGlhZ3JhbSkgewotCQkJaWYgKEFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRQYXJ0Lk1PREVMX0lELmVxdWFscyh2aWV3LmdldFR5cGUoKSkpIHsKLQkJCQlyZXR1cm4gQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdFBhcnQuVklTVUFMX0lEOwotCQkJfSBlbHNlIHsKLQkJCQlyZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGdldFZpc3VhbElEKHZpZXcuZ2V0VHlwZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TW9kZWxJRChWaWV3IHZpZXcpIHsKLQkJVmlldyBkaWFncmFtID0gdmlldy5nZXREaWFncmFtKCk7Ci0JCXdoaWxlICh2aWV3ICE9IGRpYWdyYW0pIHsKLQkJCUVBbm5vdGF0aW9uIGFubm90YXRpb24gPSB2aWV3LmdldEVBbm5vdGF0aW9uKCJTaG9ydGN1dCIpOyAvLyROT04tTkxTLTEkCi0JCQlpZiAoYW5ub3RhdGlvbiAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIChTdHJpbmcpIGFubm90YXRpb24uZ2V0RGV0YWlscygpLmdldCgibW9kZWxJRCIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQl2aWV3ID0gKFZpZXcpIHZpZXcuZUNvbnRhaW5lcigpOwotCQl9Ci0JCXJldHVybiBkaWFncmFtICE9IG51bGwgPyBkaWFncmFtLmdldFR5cGUoKSA6IG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IGdldFZpc3VhbElEKFN0cmluZyB0eXBlKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gSW50ZWdlci5wYXJzZUludCh0eXBlKTsKLQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLQkJCWlmIChCb29sZWFuLlRSVUUudG9TdHJpbmcoKS5lcXVhbHNJZ25vcmVDYXNlKAotCQkJCQlQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbihERUJVR19LRVkpKSkgewotCQkJCUFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmxvZ0Vycm9yKAotCQkJCQkJIlVuYWJsZSB0byBwYXJzZSB2aWV3IHR5cGUgYXMgYSB2aXN1YWxJRCBudW1iZXI6ICIJLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkrIHR5cGUpOwotCQkJfQotCQl9Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0VHlwZShpbnQgdmlzdWFsSUQpIHsKLQkJcmV0dXJuIFN0cmluZy52YWx1ZU9mKHZpc3VhbElEKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgZ2V0RGlhZ3JhbVZpc3VhbElEKEVPYmplY3QgZG9tYWluRWxlbWVudCkgewotCQlpZiAoZG9tYWluRWxlbWVudCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQkJRUNsYXNzIGRvbWFpbkVsZW1lbnRNZXRhY2xhc3MgPSBkb21haW5FbGVtZW50LmVDbGFzcygpOwotCQlyZXR1cm4gZ2V0RGlhZ3JhbVZpc3VhbElEKGRvbWFpbkVsZW1lbnQsIGRvbWFpbkVsZW1lbnRNZXRhY2xhc3MpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBpbnQgZ2V0RGlhZ3JhbVZpc3VhbElEKEVPYmplY3QgZG9tYWluRWxlbWVudCwKLQkJCUVDbGFzcyBkb21haW5FbGVtZW50TWV0YWNsYXNzKSB7Ci0JCWlmIChNb2RlbFBhY2thZ2UuZUlOU1RBTkNFLmdldEFjdGl2aXR5RGV0YWlsRGlhZ3JhbSgpLmlzU3VwZXJUeXBlT2YoCi0JCQkJZG9tYWluRWxlbWVudE1ldGFjbGFzcykKLQkJCQkmJiBpc0RpYWdyYW1BY3Rpdml0eURldGFpbERpYWdyYW1fNzkoKEFjdGl2aXR5RGV0YWlsRGlhZ3JhbSkgZG9tYWluRWxlbWVudCkpIHsKLQkJCXJldHVybiBBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0UGFydC5WSVNVQUxfSUQ7Ci0JCX0KLQkJcmV0dXJuIGdldFVucmVjb2duaXplZERpYWdyYW1JRChkb21haW5FbGVtZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgZ2V0Tm9kZVZpc3VhbElEKFZpZXcgY29udGFpbmVyVmlldywgRU9iamVjdCBkb21haW5FbGVtZW50KSB7Ci0JCWlmIChkb21haW5FbGVtZW50ID09IG51bGwpIHsKLQkJCXJldHVybiAtMTsKLQkJfQotCQlFQ2xhc3MgZG9tYWluRWxlbWVudE1ldGFjbGFzcyA9IGRvbWFpbkVsZW1lbnQuZUNsYXNzKCk7Ci0JCXJldHVybiBnZXROb2RlVmlzdWFsSUQoY29udGFpbmVyVmlldywgZG9tYWluRWxlbWVudCwKLQkJCQlkb21haW5FbGVtZW50TWV0YWNsYXNzLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgZ2V0Tm9kZVZpc3VhbElEKFZpZXcgY29udGFpbmVyVmlldywKLQkJCUVPYmplY3QgZG9tYWluRWxlbWVudCwgRUNsYXNzIGRvbWFpbkVsZW1lbnRNZXRhY2xhc3MsCi0JCQlTdHJpbmcgc2VtYW50aWNIaW50KSB7Ci0JCVN0cmluZyBjb250YWluZXJNb2RlbElEID0gZ2V0TW9kZWxJRChjb250YWluZXJWaWV3KTsKLQkJaWYgKCFBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0UGFydC5NT0RFTF9JRC5lcXVhbHMoY29udGFpbmVyTW9kZWxJRCkpIHsKLQkJCXJldHVybiAtMTsKLQkJfQotCQlpbnQgY29udGFpbmVyVmlzdWFsSUQ7Ci0JCWlmIChBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0UGFydC5NT0RFTF9JRC5lcXVhbHMoY29udGFpbmVyTW9kZWxJRCkpIHsKLQkJCWNvbnRhaW5lclZpc3VhbElEID0gZ2V0VmlzdWFsSUQoY29udGFpbmVyVmlldyk7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoY29udGFpbmVyVmlldyBpbnN0YW5jZW9mIERpYWdyYW0pIHsKLQkJCQljb250YWluZXJWaXN1YWxJRCA9IEFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRQYXJ0LlZJU1VBTF9JRDsKLQkJCX0gZWxzZSB7Ci0JCQkJcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWludCBub2RlVmlzdWFsSUQgPSBzZW1hbnRpY0hpbnQgIT0gbnVsbCA/IGdldFZpc3VhbElEKHNlbWFudGljSGludCkKLQkJCQk6IC0xOwotCQlzd2l0Y2ggKGNvbnRhaW5lclZpc3VhbElEKSB7Ci0JCWNhc2UgUm9sZVRhc2tDb21wb3NpdGVFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQlpZiAoUm9sZVRhc2tDb21wb3NpdGVSb2xlVGFza0NvbXBhcnRtZW50RWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgewotCQkJCXJldHVybiBSb2xlVGFza0NvbXBvc2l0ZVJvbGVUYXNrQ29tcGFydG1lbnRFZGl0UGFydC5WSVNVQUxfSUQ7Ci0JCQl9Ci0JCQlpZiAoKHNlbWFudGljSGludCA9PSBudWxsIHx8IFJvbGVOb2RlRWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkKLQkJCQkJJiYgTW9kZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRSb2xlTm9kZSgpLmlzU3VwZXJUeXBlT2YoCi0JCQkJCQkJZG9tYWluRWxlbWVudE1ldGFjbGFzcykKLQkJCQkJJiYgKGRvbWFpbkVsZW1lbnQgPT0gbnVsbCB8fCBpc05vZGVSb2xlTm9kZV8yMDAxKChSb2xlTm9kZSkgZG9tYWluRWxlbWVudCkpKSB7Ci0JCQkJcmV0dXJuIFJvbGVOb2RlRWRpdFBhcnQuVklTVUFMX0lEOwotCQkJfQotCQkJaWYgKChzZW1hbnRpY0hpbnQgPT0gbnVsbCB8fCBUYXNrTm9kZUVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpCi0JCQkJCSYmIE1vZGVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza05vZGUoKS5pc1N1cGVyVHlwZU9mKAotCQkJCQkJCWRvbWFpbkVsZW1lbnRNZXRhY2xhc3MpCi0JCQkJCSYmIChkb21haW5FbGVtZW50ID09IG51bGwgfHwgaXNOb2RlVGFza05vZGVfMjAwMigoVGFza05vZGUpIGRvbWFpbkVsZW1lbnQpKSkgewotCQkJCXJldHVybiBUYXNrTm9kZUVkaXRQYXJ0LlZJU1VBTF9JRDsKLQkJCX0KLQkJCXJldHVybiBnZXRVbnJlY29nbml6ZWRSb2xlVGFza0NvbXBvc2l0ZV8xMDAxQ2hpbGROb2RlSUQoCi0JCQkJCWRvbWFpbkVsZW1lbnQsIHNlbWFudGljSGludCk7Ci0JCWNhc2UgV29ya1Byb2R1Y3RDb21wb3NpdGVFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQlpZiAoV29ya1Byb2R1Y3RDb21wb3NpdGVXb3JrUHJvZHVjdENvbXBhcnRtZW50RWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgewotCQkJCXJldHVybiBXb3JrUHJvZHVjdENvbXBvc2l0ZVdvcmtQcm9kdWN0Q29tcGFydG1lbnRFZGl0UGFydC5WSVNVQUxfSUQ7Ci0JCQl9Ci0JCQlpZiAoKHNlbWFudGljSGludCA9PSBudWxsIHx8IFdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKQotCQkJCQkmJiBNb2RlbFBhY2thZ2UuZUlOU1RBTkNFLmdldFdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGUoKQotCQkJCQkJCS5pc1N1cGVyVHlwZU9mKGRvbWFpbkVsZW1lbnRNZXRhY2xhc3MpCi0JCQkJCSYmIChkb21haW5FbGVtZW50ID09IG51bGwgfHwgaXNOb2RlV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZV8yMDAzKChXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlKSBkb21haW5FbGVtZW50KSkpIHsKLQkJCQlyZXR1cm4gV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZUVkaXRQYXJ0LlZJU1VBTF9JRDsKLQkJCX0KLQkJCXJldHVybiBnZXRVbnJlY29nbml6ZWRXb3JrUHJvZHVjdENvbXBvc2l0ZV8xMDAyQ2hpbGROb2RlSUQoCi0JCQkJCWRvbWFpbkVsZW1lbnQsIHNlbWFudGljSGludCk7Ci0JCWNhc2UgUm9sZU5vZGVFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQlpZiAoUm9sZU5vZGVOYW1lRWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgewotCQkJCXJldHVybiBSb2xlTm9kZU5hbWVFZGl0UGFydC5WSVNVQUxfSUQ7Ci0JCQl9Ci0JCQlyZXR1cm4gZ2V0VW5yZWNvZ25pemVkUm9sZU5vZGVfMjAwMUNoaWxkTm9kZUlEKGRvbWFpbkVsZW1lbnQsCi0JCQkJCXNlbWFudGljSGludCk7Ci0JCWNhc2UgVGFza05vZGVFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQlpZiAoVGFza05vZGVOYW1lRWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgewotCQkJCXJldHVybiBUYXNrTm9kZU5hbWVFZGl0UGFydC5WSVNVQUxfSUQ7Ci0JCQl9Ci0JCQlyZXR1cm4gZ2V0VW5yZWNvZ25pemVkVGFza05vZGVfMjAwMkNoaWxkTm9kZUlEKGRvbWFpbkVsZW1lbnQsCi0JCQkJCXNlbWFudGljSGludCk7Ci0JCWNhc2UgV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZUVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCWlmIChXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlTmFtZUVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsKLQkJCQlyZXR1cm4gV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZU5hbWVFZGl0UGFydC5WSVNVQUxfSUQ7Ci0JCQl9Ci0JCQlyZXR1cm4gZ2V0VW5yZWNvZ25pemVkV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZV8yMDAzQ2hpbGROb2RlSUQoCi0JCQkJCWRvbWFpbkVsZW1lbnQsIHNlbWFudGljSGludCk7Ci0JCWNhc2UgUm9sZVRhc2tDb21wb3NpdGVSb2xlVGFza0NvbXBhcnRtZW50RWRpdFBhcnQuVklTVUFMX0lEOgotCQkJcmV0dXJuIGdldFVucmVjb2duaXplZFJvbGVUYXNrQ29tcG9zaXRlUm9sZVRhc2tDb21wYXJ0bWVudF81MDAxQ2hpbGROb2RlSUQoCi0JCQkJCWRvbWFpbkVsZW1lbnQsIHNlbWFudGljSGludCk7Ci0JCWNhc2UgV29ya1Byb2R1Y3RDb21wb3NpdGVXb3JrUHJvZHVjdENvbXBhcnRtZW50RWRpdFBhcnQuVklTVUFMX0lEOgotCQkJcmV0dXJuIGdldFVucmVjb2duaXplZFdvcmtQcm9kdWN0Q29tcG9zaXRlV29ya1Byb2R1Y3RDb21wYXJ0bWVudF81MDAyQ2hpbGROb2RlSUQoCi0JCQkJCWRvbWFpbkVsZW1lbnQsIHNlbWFudGljSGludCk7Ci0JCWNhc2UgQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJaWYgKChzZW1hbnRpY0hpbnQgPT0gbnVsbCB8fCBSb2xlVGFza0NvbXBvc2l0ZUVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpCi0JCQkJCSYmIE1vZGVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Um9sZVRhc2tDb21wb3NpdGUoKQotCQkJCQkJCS5pc1N1cGVyVHlwZU9mKGRvbWFpbkVsZW1lbnRNZXRhY2xhc3MpCi0JCQkJCSYmIChkb21haW5FbGVtZW50ID09IG51bGwgfHwgaXNOb2RlUm9sZVRhc2tDb21wb3NpdGVfMTAwMSgoUm9sZVRhc2tDb21wb3NpdGUpIGRvbWFpbkVsZW1lbnQpKSkgewotCQkJCXJldHVybiBSb2xlVGFza0NvbXBvc2l0ZUVkaXRQYXJ0LlZJU1VBTF9JRDsKLQkJCX0KLQkJCWlmICgoc2VtYW50aWNIaW50ID09IG51bGwgfHwgV29ya1Byb2R1Y3RDb21wb3NpdGVFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKQotCQkJCQkmJiBNb2RlbFBhY2thZ2UuZUlOU1RBTkNFLmdldFdvcmtQcm9kdWN0Q29tcG9zaXRlKCkKLQkJCQkJCQkuaXNTdXBlclR5cGVPZihkb21haW5FbGVtZW50TWV0YWNsYXNzKQotCQkJCQkmJiAoZG9tYWluRWxlbWVudCA9PSBudWxsIHx8IGlzTm9kZVdvcmtQcm9kdWN0Q29tcG9zaXRlXzEwMDIoKFdvcmtQcm9kdWN0Q29tcG9zaXRlKSBkb21haW5FbGVtZW50KSkpIHsKLQkJCQlyZXR1cm4gV29ya1Byb2R1Y3RDb21wb3NpdGVFZGl0UGFydC5WSVNVQUxfSUQ7Ci0JCQl9Ci0JCQlyZXR1cm4gZ2V0VW5yZWNvZ25pemVkQWN0aXZpdHlEZXRhaWxEaWFncmFtXzc5Q2hpbGROb2RlSUQoCi0JCQkJCWRvbWFpbkVsZW1lbnQsIHNlbWFudGljSGludCk7Ci0JCWNhc2UgTGlua0VkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCWlmIChMaW5rTmFtZUVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsKLQkJCQlyZXR1cm4gTGlua05hbWVFZGl0UGFydC5WSVNVQUxfSUQ7Ci0JCQl9Ci0JCQlyZXR1cm4gZ2V0VW5yZWNvZ25pemVkTGlua18zMDAxTGlua0xhYmVsSUQoc2VtYW50aWNIaW50KTsKLQkJfQotCQlyZXR1cm4gLTE7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IGdldExpbmtXaXRoQ2xhc3NWaXN1YWxJRChFT2JqZWN0IGRvbWFpbkVsZW1lbnQpIHsKLQkJaWYgKGRvbWFpbkVsZW1lbnQgPT0gbnVsbCkgewotCQkJcmV0dXJuIC0xOwotCQl9Ci0JCUVDbGFzcyBkb21haW5FbGVtZW50TWV0YWNsYXNzID0gZG9tYWluRWxlbWVudC5lQ2xhc3MoKTsKLQkJcmV0dXJuIGdldExpbmtXaXRoQ2xhc3NWaXN1YWxJRChkb21haW5FbGVtZW50LCBkb21haW5FbGVtZW50TWV0YWNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgZ2V0TGlua1dpdGhDbGFzc1Zpc3VhbElEKEVPYmplY3QgZG9tYWluRWxlbWVudCwKLQkJCUVDbGFzcyBkb21haW5FbGVtZW50TWV0YWNsYXNzKSB7Ci0JCWlmIChNb2RlbFBhY2thZ2UuZUlOU1RBTkNFLmdldExpbmsoKS5pc1N1cGVyVHlwZU9mKAotCQkJCWRvbWFpbkVsZW1lbnRNZXRhY2xhc3MpCi0JCQkJJiYgKGRvbWFpbkVsZW1lbnQgPT0gbnVsbCB8fCBpc0xpbmtXaXRoQ2xhc3NMaW5rXzMwMDEoKExpbmspIGRvbWFpbkVsZW1lbnQpKSkgewotCQkJcmV0dXJuIExpbmtFZGl0UGFydC5WSVNVQUxfSUQ7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gZ2V0VW5yZWNvZ25pemVkTGlua1dpdGhDbGFzc0lEKGRvbWFpbkVsZW1lbnQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVXNlciBjYW4gY2hhbmdlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kIHRvIGNoZWNrIHNvbWUgYWRkaXRpb25hbCAKLQkgKiBjb25kaXRpb25zIGhlcmUuCi0JICoKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0RpYWdyYW1BY3Rpdml0eURldGFpbERpYWdyYW1fNzkoCi0JCQlBY3Rpdml0eURldGFpbERpYWdyYW0gZWxlbWVudCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBVc2VyIGNhbiBjaGFuZ2UgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2QgdG8gaGFuZGxlIHNvbWUgc3BlY2lmaWMKLQkgKiBzaXR1YXRpb25zIG5vdCBjb3ZlcmVkIGJ5IGRlZmF1bHQgbG9naWMuCi0JICoKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgaW50IGdldFVucmVjb2duaXplZERpYWdyYW1JRChFT2JqZWN0IGRvbWFpbkVsZW1lbnQpIHsKLQkJcmV0dXJuIC0xOwotCX0KLQotCS8qKgotCSAqIFVzZXIgY2FuIGNoYW5nZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZCB0byBjaGVjayBzb21lIGFkZGl0aW9uYWwgCi0JICogY29uZGl0aW9ucyBoZXJlLgotCSAqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNOb2RlUm9sZVRhc2tDb21wb3NpdGVfMTAwMSgKLQkJCVJvbGVUYXNrQ29tcG9zaXRlIGVsZW1lbnQpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogVXNlciBjYW4gY2hhbmdlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kIHRvIGNoZWNrIHNvbWUgYWRkaXRpb25hbCAKLQkgKiBjb25kaXRpb25zIGhlcmUuCi0JICoKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc05vZGVXb3JrUHJvZHVjdENvbXBvc2l0ZV8xMDAyKAotCQkJV29ya1Byb2R1Y3RDb21wb3NpdGUgZWxlbWVudCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBVc2VyIGNhbiBjaGFuZ2UgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2QgdG8gY2hlY2sgc29tZSBhZGRpdGlvbmFsIAotCSAqIGNvbmRpdGlvbnMgaGVyZS4KLQkgKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzTm9kZVJvbGVOb2RlXzIwMDEoUm9sZU5vZGUgZWxlbWVudCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBVc2VyIGNhbiBjaGFuZ2UgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2QgdG8gY2hlY2sgc29tZSBhZGRpdGlvbmFsIAotCSAqIGNvbmRpdGlvbnMgaGVyZS4KLQkgKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzTm9kZVRhc2tOb2RlXzIwMDIoVGFza05vZGUgZWxlbWVudCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBVc2VyIGNhbiBjaGFuZ2UgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2QgdG8gY2hlY2sgc29tZSBhZGRpdGlvbmFsIAotCSAqIGNvbmRpdGlvbnMgaGVyZS4KLQkgKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzTm9kZVdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVfMjAwMygKLQkJCVdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGUgZWxlbWVudCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBVc2VyIGNhbiBjaGFuZ2UgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2QgdG8gaGFuZGxlIHNvbWUgc3BlY2lmaWMKLQkgKiBzaXR1YXRpb25zIG5vdCBjb3ZlcmVkIGJ5IGRlZmF1bHQgbG9naWMuCi0JICoKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgaW50IGdldFVucmVjb2duaXplZFJvbGVUYXNrQ29tcG9zaXRlXzEwMDFDaGlsZE5vZGVJRCgKLQkJCUVPYmplY3QgZG9tYWluRWxlbWVudCwgU3RyaW5nIHNlbWFudGljSGludCkgewotCQlyZXR1cm4gLTE7Ci0JfQotCi0JLyoqCi0JICogVXNlciBjYW4gY2hhbmdlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kIHRvIGhhbmRsZSBzb21lIHNwZWNpZmljCi0JICogc2l0dWF0aW9ucyBub3QgY292ZXJlZCBieSBkZWZhdWx0IGxvZ2ljLgotCSAqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGludCBnZXRVbnJlY29nbml6ZWRXb3JrUHJvZHVjdENvbXBvc2l0ZV8xMDAyQ2hpbGROb2RlSUQoCi0JCQlFT2JqZWN0IGRvbWFpbkVsZW1lbnQsIFN0cmluZyBzZW1hbnRpY0hpbnQpIHsKLQkJcmV0dXJuIC0xOwotCX0KLQotCS8qKgotCSAqIFVzZXIgY2FuIGNoYW5nZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZCB0byBoYW5kbGUgc29tZSBzcGVjaWZpYwotCSAqIHNpdHVhdGlvbnMgbm90IGNvdmVyZWQgYnkgZGVmYXVsdCBsb2dpYy4KLQkgKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBpbnQgZ2V0VW5yZWNvZ25pemVkUm9sZU5vZGVfMjAwMUNoaWxkTm9kZUlEKAotCQkJRU9iamVjdCBkb21haW5FbGVtZW50LCBTdHJpbmcgc2VtYW50aWNIaW50KSB7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQkvKioKLQkgKiBVc2VyIGNhbiBjaGFuZ2UgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2QgdG8gaGFuZGxlIHNvbWUgc3BlY2lmaWMKLQkgKiBzaXR1YXRpb25zIG5vdCBjb3ZlcmVkIGJ5IGRlZmF1bHQgbG9naWMuCi0JICoKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgaW50IGdldFVucmVjb2duaXplZFRhc2tOb2RlXzIwMDJDaGlsZE5vZGVJRCgKLQkJCUVPYmplY3QgZG9tYWluRWxlbWVudCwgU3RyaW5nIHNlbWFudGljSGludCkgewotCQlyZXR1cm4gLTE7Ci0JfQotCi0JLyoqCi0JICogVXNlciBjYW4gY2hhbmdlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kIHRvIGhhbmRsZSBzb21lIHNwZWNpZmljCi0JICogc2l0dWF0aW9ucyBub3QgY292ZXJlZCBieSBkZWZhdWx0IGxvZ2ljLgotCSAqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGludCBnZXRVbnJlY29nbml6ZWRXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlXzIwMDNDaGlsZE5vZGVJRCgKLQkJCUVPYmplY3QgZG9tYWluRWxlbWVudCwgU3RyaW5nIHNlbWFudGljSGludCkgewotCQlyZXR1cm4gLTE7Ci0JfQotCi0JLyoqCi0JICogVXNlciBjYW4gY2hhbmdlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kIHRvIGhhbmRsZSBzb21lIHNwZWNpZmljCi0JICogc2l0dWF0aW9ucyBub3QgY292ZXJlZCBieSBkZWZhdWx0IGxvZ2ljLgotCSAqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGludCBnZXRVbnJlY29nbml6ZWRSb2xlVGFza0NvbXBvc2l0ZVJvbGVUYXNrQ29tcGFydG1lbnRfNTAwMUNoaWxkTm9kZUlEKAotCQkJRU9iamVjdCBkb21haW5FbGVtZW50LCBTdHJpbmcgc2VtYW50aWNIaW50KSB7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQkvKioKLQkgKiBVc2VyIGNhbiBjaGFuZ2UgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2QgdG8gaGFuZGxlIHNvbWUgc3BlY2lmaWMKLQkgKiBzaXR1YXRpb25zIG5vdCBjb3ZlcmVkIGJ5IGRlZmF1bHQgbG9naWMuCi0JICoKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgaW50IGdldFVucmVjb2duaXplZFdvcmtQcm9kdWN0Q29tcG9zaXRlV29ya1Byb2R1Y3RDb21wYXJ0bWVudF81MDAyQ2hpbGROb2RlSUQoCi0JCQlFT2JqZWN0IGRvbWFpbkVsZW1lbnQsIFN0cmluZyBzZW1hbnRpY0hpbnQpIHsKLQkJcmV0dXJuIC0xOwotCX0KLQotCS8qKgotCSAqIFVzZXIgY2FuIGNoYW5nZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZCB0byBoYW5kbGUgc29tZSBzcGVjaWZpYwotCSAqIHNpdHVhdGlvbnMgbm90IGNvdmVyZWQgYnkgZGVmYXVsdCBsb2dpYy4KLQkgKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBpbnQgZ2V0VW5yZWNvZ25pemVkQWN0aXZpdHlEZXRhaWxEaWFncmFtXzc5Q2hpbGROb2RlSUQoCi0JCQlFT2JqZWN0IGRvbWFpbkVsZW1lbnQsIFN0cmluZyBzZW1hbnRpY0hpbnQpIHsKLQkJcmV0dXJuIC0xOwotCX0KLQotCS8qKgotCSAqIFVzZXIgY2FuIGNoYW5nZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZCB0byBoYW5kbGUgc29tZSBzcGVjaWZpYwotCSAqIHNpdHVhdGlvbnMgbm90IGNvdmVyZWQgYnkgZGVmYXVsdCBsb2dpYy4KLQkgKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBpbnQgZ2V0VW5yZWNvZ25pemVkTGlua18zMDAxTGlua0xhYmVsSUQoU3RyaW5nIHNlbWFudGljSGludCkgewotCQlyZXR1cm4gLTE7Ci0JfQotCi0JLyoqCi0JICogVXNlciBjYW4gY2hhbmdlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kIHRvIGhhbmRsZSBzb21lIHNwZWNpZmljCi0JICogc2l0dWF0aW9ucyBub3QgY292ZXJlZCBieSBkZWZhdWx0IGxvZ2ljLgotCSAqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGludCBnZXRVbnJlY29nbml6ZWRMaW5rV2l0aENsYXNzSUQoRU9iamVjdCBkb21haW5FbGVtZW50KSB7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQkvKioKLQkgKiBVc2VyIGNhbiBjaGFuZ2UgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2QgdG8gY2hlY2sgc29tZSBhZGRpdGlvbmFsIAotCSAqIGNvbmRpdGlvbnMgaGVyZS4KLQkgKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzTGlua1dpdGhDbGFzc0xpbmtfMzAwMShMaW5rIGVsZW1lbnQpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvcGFydC9NZXNzYWdlcy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvcGFydC9NZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkODFhNzE5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL3BhcnQvTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5wYXJ0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXNzYWdlcyBleHRlbmRzIE5MUyB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jc3RhdGljIHsKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcygibWVzc2FnZXMiLCBNZXNzYWdlcy5jbGFzcyk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBNZXNzYWdlcygpIHsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGlhZ3JhbURpYWdyYW1FZGl0b3JVdGlsX09wZW5Nb2RlbFJlc291cmNlRXJyb3JEaWFsb2dUaXRsZTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEaWFncmFtRGlhZ3JhbUVkaXRvclV0aWxfT3Blbk1vZGVsUmVzb3VyY2VFcnJvckRpYWxvZ01lc3NhZ2U7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGlhZ3JhbURpYWdyYW1FZGl0b3JVdGlsX0NyZWF0ZURpYWdyYW1Qcm9ncmVzc1Rhc2s7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGlhZ3JhbURpYWdyYW1FZGl0b3JVdGlsX0NyZWF0ZURpYWdyYW1Db21tYW5kTGFiZWw7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGlhZ3JhbURvY3VtZW50UHJvdmlkZXJfaXNNb2RpZmlhYmxlOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERpYWdyYW1Eb2N1bWVudFByb3ZpZGVyX2hhbmRsZUVsZW1lbnRDb250ZW50Q2hhbmdlZDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEaWFncmFtRG9jdW1lbnRQcm92aWRlcl9JbmNvcnJlY3RJbnB1dEVycm9yOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERpYWdyYW1Eb2N1bWVudFByb3ZpZGVyX1VuYWJsZVRvTG9hZFJlc291cmNlRXJyb3I7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGlhZ3JhbURvY3VtZW50UHJvdmlkZXJfTm9EaWFncmFtSW5SZXNvdXJjZUVycm9yOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERpYWdyYW1Eb2N1bWVudFByb3ZpZGVyX0RpYWdyYW1Mb2FkaW5nRXJyb3I7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGlhZ3JhbURvY3VtZW50UHJvdmlkZXJfVW5zeW5jaHJvbml6ZWRGaWxlU2F2ZUVycm9yOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERpYWdyYW1Eb2N1bWVudFByb3ZpZGVyX1NhdmVEaWFncmFtVGFzazsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEaWFncmFtRG9jdW1lbnRQcm92aWRlcl9TYXZlTmV4dFJlc291cmNlVGFzazsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEaWFncmFtSW5pdERpYWdyYW1GaWxlQWN0aW9uX0luaXREaWFncmFtRmlsZVJlc291cmNlRXJyb3JEaWFsb2dUaXRsZTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEaWFncmFtSW5pdERpYWdyYW1GaWxlQWN0aW9uX0luaXREaWFncmFtRmlsZVJlc291cmNlRXJyb3JEaWFsb2dNZXNzYWdlOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERpYWdyYW1Jbml0RGlhZ3JhbUZpbGVBY3Rpb25fSW5pdERpYWdyYW1GaWxlV2l6YXJkVGl0bGU7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGlhZ3JhbUluaXREaWFncmFtRmlsZUFjdGlvbl9PcGVuTW9kZWxGaWxlRGlhbG9nVGl0bGU7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGlhZ3JhbU5ld0RpYWdyYW1GaWxlV2l6YXJkX0NyZWF0aW9uUGFnZU5hbWU7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGlhZ3JhbU5ld0RpYWdyYW1GaWxlV2l6YXJkX0NyZWF0aW9uUGFnZVRpdGxlOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERpYWdyYW1OZXdEaWFncmFtRmlsZVdpemFyZF9DcmVhdGlvblBhZ2VEZXNjcmlwdGlvbjsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEaWFncmFtTmV3RGlhZ3JhbUZpbGVXaXphcmRfUm9vdFNlbGVjdGlvblBhZ2VOYW1lOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERpYWdyYW1OZXdEaWFncmFtRmlsZVdpemFyZF9Sb290U2VsZWN0aW9uUGFnZVRpdGxlOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERpYWdyYW1OZXdEaWFncmFtRmlsZVdpemFyZF9Sb290U2VsZWN0aW9uUGFnZURlc2NyaXB0aW9uOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERpYWdyYW1OZXdEaWFncmFtRmlsZVdpemFyZF9Sb290U2VsZWN0aW9uUGFnZVNlbGVjdGlvblRpdGxlOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERpYWdyYW1OZXdEaWFncmFtRmlsZVdpemFyZF9Sb290U2VsZWN0aW9uUGFnZU5vU2VsZWN0aW9uTWVzc2FnZTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEaWFncmFtTmV3RGlhZ3JhbUZpbGVXaXphcmRfUm9vdFNlbGVjdGlvblBhZ2VJbnZhbGlkU2VsZWN0aW9uTWVzc2FnZTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEaWFncmFtTmV3RGlhZ3JhbUZpbGVXaXphcmRfSW5pdERpYWdyYW1Db21tYW5kOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERpYWdyYW1OZXdEaWFncmFtRmlsZVdpemFyZF9JbmNvcnJlY3RSb290RXJyb3I7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgTm9kZXMxR3JvdXBfdGl0bGU7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgTGlua3MyR3JvdXBfdGl0bGU7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUm9sZU5vZGUxQ3JlYXRpb25Ub29sX3RpdGxlOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJvbGVOb2RlMUNyZWF0aW9uVG9vbF9kZXNjOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJvbGVUYXNrQ29tcG9zaXRlMkNyZWF0aW9uVG9vbF90aXRsZTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSb2xlVGFza0NvbXBvc2l0ZTJDcmVhdGlvblRvb2xfZGVzYzsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUYXNrTm9kZTNDcmVhdGlvblRvb2xfdGl0bGU7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGFza05vZGUzQ3JlYXRpb25Ub29sX2Rlc2M7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZTRDcmVhdGlvblRvb2xfdGl0bGU7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZTRDcmVhdGlvblRvb2xfZGVzYzsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXb3JrUHJvZHVjdENvbXBvc2l0ZTVDcmVhdGlvblRvb2xfdGl0bGU7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgV29ya1Byb2R1Y3RDb21wb3NpdGU1Q3JlYXRpb25Ub29sX2Rlc2M7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgTGluazFDcmVhdGlvblRvb2xfdGl0bGU7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgTGluazFDcmVhdGlvblRvb2xfZGVzYzsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSb2xlVGFza0NvbXBvc2l0ZVJvbGVUYXNrQ29tcGFydG1lbnRFZGl0UGFydF90aXRsZTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXb3JrUHJvZHVjdENvbXBvc2l0ZVdvcmtQcm9kdWN0Q29tcGFydG1lbnRFZGl0UGFydF90aXRsZTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb21tYW5kTmFtZV9PcGVuRGlhZ3JhbTsKLQotCS8vVE9ETzogcHV0IGFjY2Vzc29yIGZpZWxkcyBtYW51YWxseQkKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL3BhcnQvTW9kZWxFbGVtZW50U2VsZWN0aW9uUGFnZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvcGFydC9Nb2RlbEVsZW1lbnRTZWxlY3Rpb25QYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhZWVlZDUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvcGFydC9Nb2RlbEVsZW1lbnRTZWxlY3Rpb25QYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQucGFydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVdyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci0KLS8qKgotICogV2l6YXJkIHBhZ2UgdGhhdCBhbGxvd3MgdG8gc2VsZWN0IGVsZW1lbnQgZnJvbSBtb2RlbC4KLSAqIAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgTW9kZWxFbGVtZW50U2VsZWN0aW9uUGFnZSBleHRlbmRzIFdpemFyZFBhZ2UgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFT2JqZWN0IHNlbGVjdGVkTW9kZWxFbGVtZW50OwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgVHJlZVZpZXdlciBtb2RlbFZld2VyOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBNb2RlbEVsZW1lbnRTZWxlY3Rpb25QYWdlKFN0cmluZyBwYWdlTmFtZSkgewotCQlzdXBlcihwYWdlTmFtZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFT2JqZWN0IGdldE1vZGVsRWxlbWVudCgpIHsKLQkJcmV0dXJuIHNlbGVjdGVkTW9kZWxFbGVtZW50OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNb2RlbEVsZW1lbnQoRU9iamVjdCBtb2RlbEVsZW1lbnQpIHsKLQkJc2VsZWN0ZWRNb2RlbEVsZW1lbnQgPSBtb2RlbEVsZW1lbnQ7Ci0JCWlmIChtb2RlbFZld2VyICE9IG51bGwpIHsKLQkJCWlmIChzZWxlY3RlZE1vZGVsRWxlbWVudCAhPSBudWxsKSB7Ci0JCQkJbW9kZWxWZXdlci5zZXRJbnB1dChzZWxlY3RlZE1vZGVsRWxlbWVudC5lUmVzb3VyY2UoKSk7Ci0JCQkJbW9kZWxWZXdlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oCi0JCQkJCQlzZWxlY3RlZE1vZGVsRWxlbWVudCkpOwotCQkJfSBlbHNlIHsKLQkJCQltb2RlbFZld2VyLnNldElucHV0KG51bGwpOwotCQkJfQotCQkJc2V0UGFnZUNvbXBsZXRlKHZhbGlkYXRlUGFnZSgpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJaW5pdGlhbGl6ZURpYWxvZ1VuaXRzKHBhcmVudCk7Ci0KLQkJQ29tcG9zaXRlIHBsYXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJcGxhdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJcGxhdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0JCXNldENvbnRyb2wocGxhdGUpOwotCi0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKHBsYXRlLCBTV1QuTk9ORSk7Ci0JCWxhYmVsLnNldFRleHQoZ2V0U2VsZWN0aW9uVGl0bGUoKSk7Ci0JCWxhYmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQkVHSU5OSU5HKSk7Ci0KLQkJbW9kZWxWZXdlciA9IG5ldyBUcmVlVmlld2VyKHBsYXRlLCBTV1QuU0lOR0xFIHwgU1dULkhfU0NST0xMCi0JCQkJfCBTV1QuVl9TQ1JPTEwgfCBTV1QuQk9SREVSKTsKLQkJR3JpZERhdGEgbGF5b3V0RGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQlsYXlvdXREYXRhLmhlaWdodEhpbnQgPSAzMDA7Ci0JCWxheW91dERhdGEud2lkdGhIaW50ID0gMzAwOwotCQltb2RlbFZld2VyLmdldFRyZWUoKS5zZXRMYXlvdXREYXRhKGxheW91dERhdGEpOwotCQltb2RlbFZld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoCi0JCQkJQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkKLQkJCQkJCS5nZXRJdGVtUHJvdmlkZXJzQWRhcHRlckZhY3RvcnkoKSkpOwotCQltb2RlbFZld2VyLnNldExhYmVsUHJvdmlkZXIobmV3IEFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcigKLQkJCQlBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKQotCQkJCQkJLmdldEl0ZW1Qcm92aWRlcnNBZGFwdGVyRmFjdG9yeSgpKSk7Ci0JCWlmIChzZWxlY3RlZE1vZGVsRWxlbWVudCAhPSBudWxsKSB7Ci0JCQltb2RlbFZld2VyLnNldElucHV0KHNlbGVjdGVkTW9kZWxFbGVtZW50LmVSZXNvdXJjZSgpKTsKLQkJCW1vZGVsVmV3ZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKAotCQkJCQlzZWxlY3RlZE1vZGVsRWxlbWVudCkpOwotCQl9Ci0JCW1vZGVsVmV3ZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewotCi0JCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQkJCU1vZGVsRWxlbWVudFNlbGVjdGlvblBhZ2UudGhpcwotCQkJCQkJLnVwZGF0ZVNlbGVjdGlvbigoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGV2ZW50Ci0JCQkJCQkJCS5nZXRTZWxlY3Rpb24oKSk7Ci0JCQl9Ci0JCX0pOwotCi0JCXNldFBhZ2VDb21wbGV0ZSh2YWxpZGF0ZVBhZ2UoKSk7Ci0JfQotCi0JLyoqCi0JICogT3ZlcnJpZGUgdG8gcHJvdmlkZSBjdXN0b20gbW9kZWwgZWxlbWVudCBkZXNjcmlwdGlvbi4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTZWxlY3Rpb25UaXRsZSgpIHsKLQkJcmV0dXJuICJTZWxlY3QgbW9kZWwgZWxlbWVudDoiOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVTZWxlY3Rpb24oSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCXNlbGVjdGVkTW9kZWxFbGVtZW50ID0gbnVsbDsKLQkJaWYgKHNlbGVjdGlvbi5zaXplKCkgPT0gMSkgewotCQkJT2JqZWN0IHNlbGVjdGVkRWxlbWVudCA9IHNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCWlmIChzZWxlY3RlZEVsZW1lbnQgaW5zdGFuY2VvZiBJV3JhcHBlckl0ZW1Qcm92aWRlcikgewotCQkJCXNlbGVjdGVkRWxlbWVudCA9ICgoSVdyYXBwZXJJdGVtUHJvdmlkZXIpIHNlbGVjdGVkRWxlbWVudCkKLQkJCQkJCS5nZXRWYWx1ZSgpOwotCQkJfQotCQkJaWYgKHNlbGVjdGVkRWxlbWVudCBpbnN0YW5jZW9mIEZlYXR1cmVNYXAuRW50cnkpIHsKLQkJCQlzZWxlY3RlZEVsZW1lbnQgPSAoKEZlYXR1cmVNYXAuRW50cnkpIHNlbGVjdGVkRWxlbWVudCkKLQkJCQkJCS5nZXRWYWx1ZSgpOwotCQkJfQotCQkJaWYgKHNlbGVjdGVkRWxlbWVudCBpbnN0YW5jZW9mIEVPYmplY3QpIHsKLQkJCQlzZWxlY3RlZE1vZGVsRWxlbWVudCA9IChFT2JqZWN0KSBzZWxlY3RlZEVsZW1lbnQ7Ci0JCQl9Ci0JCX0KLQkJc2V0UGFnZUNvbXBsZXRlKHZhbGlkYXRlUGFnZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBPdmVycmlkZSB0byBwcm92aWRlIHNwZWNpZmljIHZhbGlkYXRpb24gb2YgdGhlIHNlbGVjdGVkIG1vZGVsIGVsZW1lbnQuCi0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHZhbGlkYXRlUGFnZSgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvcHJlZmVyZW5jZXMvRGlhZ3JhbUFwcGVhcmFuY2VQcmVmZXJlbmNlUGFnZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvcHJlZmVyZW5jZXMvRGlhZ3JhbUFwcGVhcmFuY2VQcmVmZXJlbmNlUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMzQzMDUxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL3ByZWZlcmVuY2VzL0RpYWdyYW1BcHBlYXJhbmNlUHJlZmVyZW5jZVBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLnByZWZlcmVuY2VzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLnBhcnQuQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucHJlZmVyZW5jZXMuQXBwZWFyYW5jZVByZWZlcmVuY2VQYWdlOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERpYWdyYW1BcHBlYXJhbmNlUHJlZmVyZW5jZVBhZ2UgZXh0ZW5kcyBBcHBlYXJhbmNlUHJlZmVyZW5jZVBhZ2UgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEaWFncmFtQXBwZWFyYW5jZVByZWZlcmVuY2VQYWdlKCkgewotCQlzZXRQcmVmZXJlbmNlU3RvcmUoQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkKLQkJCQkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL3ByZWZlcmVuY2VzL0RpYWdyYW1Db25uZWN0aW9uc1ByZWZlcmVuY2VQYWdlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9wcmVmZXJlbmNlcy9EaWFncmFtQ29ubmVjdGlvbnNQcmVmZXJlbmNlUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNmUyNmYyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL3ByZWZlcmVuY2VzL0RpYWdyYW1Db25uZWN0aW9uc1ByZWZlcmVuY2VQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5wcmVmZXJlbmNlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5wYXJ0LkFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnByZWZlcmVuY2VzLkNvbm5lY3Rpb25zUHJlZmVyZW5jZVBhZ2U7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRGlhZ3JhbUNvbm5lY3Rpb25zUHJlZmVyZW5jZVBhZ2UgZXh0ZW5kcyBDb25uZWN0aW9uc1ByZWZlcmVuY2VQYWdlIHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRGlhZ3JhbUNvbm5lY3Rpb25zUHJlZmVyZW5jZVBhZ2UoKSB7Ci0JCXNldFByZWZlcmVuY2VTdG9yZShBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKQotCQkJCS5nZXRQcmVmZXJlbmNlU3RvcmUoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvcHJlZmVyZW5jZXMvRGlhZ3JhbUdlbmVyYWxQcmVmZXJlbmNlUGFnZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvcHJlZmVyZW5jZXMvRGlhZ3JhbUdlbmVyYWxQcmVmZXJlbmNlUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOTEzMzk3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL3ByZWZlcmVuY2VzL0RpYWdyYW1HZW5lcmFsUHJlZmVyZW5jZVBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLnByZWZlcmVuY2VzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLnBhcnQuQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucHJlZmVyZW5jZXMuRGlhZ3JhbXNQcmVmZXJlbmNlUGFnZTsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEaWFncmFtR2VuZXJhbFByZWZlcmVuY2VQYWdlIGV4dGVuZHMgRGlhZ3JhbXNQcmVmZXJlbmNlUGFnZSB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERpYWdyYW1HZW5lcmFsUHJlZmVyZW5jZVBhZ2UoKSB7Ci0JCXNldFByZWZlcmVuY2VTdG9yZShBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKQotCQkJCS5nZXRQcmVmZXJlbmNlU3RvcmUoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvcHJlZmVyZW5jZXMvRGlhZ3JhbVByZWZlcmVuY2VJbml0aWFsaXplci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvcHJlZmVyZW5jZXMvRGlhZ3JhbVByZWZlcmVuY2VJbml0aWFsaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYzA5ZTZhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL3ByZWZlcmVuY2VzL0RpYWdyYW1QcmVmZXJlbmNlSW5pdGlhbGl6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLnByZWZlcmVuY2VzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLkFic3RyYWN0UHJlZmVyZW5jZUluaXRpYWxpemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5wYXJ0LkFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnV0aWwuRGlhZ3JhbUNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEaWFncmFtUHJlZmVyZW5jZUluaXRpYWxpemVyIGV4dGVuZHMgQWJzdHJhY3RQcmVmZXJlbmNlSW5pdGlhbGl6ZXIgewotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZURlZmF1bHRQcmVmZXJlbmNlcygpIHsKLQkJSVByZWZlcmVuY2VTdG9yZSBzdG9yZSA9IGdldFByZWZlcmVuY2VTdG9yZSgpOwotCQlEaWFncmFtUHJpbnRpbmdQcmVmZXJlbmNlUGFnZS5pbml0RGVmYXVsdHMoc3RvcmUpOwotCQlEaWFncmFtR2VuZXJhbFByZWZlcmVuY2VQYWdlLmluaXREZWZhdWx0cyhzdG9yZSk7Ci0JCURpYWdyYW1BcHBlYXJhbmNlUHJlZmVyZW5jZVBhZ2UuaW5pdERlZmF1bHRzKHN0b3JlKTsKLQkJRGlhZ3JhbUNvbm5lY3Rpb25zUHJlZmVyZW5jZVBhZ2UuaW5pdERlZmF1bHRzKHN0b3JlKTsKLQkJRGlhZ3JhbVJ1bGVyc0FuZEdyaWRQcmVmZXJlbmNlUGFnZS5pbml0RGVmYXVsdHMoc3RvcmUpOwotCQlEaWFncmFtQ29yZVV0aWwuc2V0RGVmYXVsdEZvbnRQcmVmZXJlbmNlKGdldFByZWZlcmVuY2VTdG9yZSgpKTsKLQkJRGlhZ3JhbUNvcmVVdGlsLnNldERlZmF1bHRMaW5lU3R5bGUoZ2V0UHJlZmVyZW5jZVN0b3JlKCkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSVByZWZlcmVuY2VTdG9yZSBnZXRQcmVmZXJlbmNlU3RvcmUoKSB7Ci0JCXJldHVybiBBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKQotCQkJCS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9wcmVmZXJlbmNlcy9EaWFncmFtUHJpbnRpbmdQcmVmZXJlbmNlUGFnZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvcHJlZmVyZW5jZXMvRGlhZ3JhbVByaW50aW5nUHJlZmVyZW5jZVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDE3MDYxYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9wcmVmZXJlbmNlcy9EaWFncmFtUHJpbnRpbmdQcmVmZXJlbmNlUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQucHJlZmVyZW5jZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQucGFydC5BY3Rpdml0eURldGFpbERpYWdyYW1FZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wcmVmZXJlbmNlcy5QcmludGluZ1ByZWZlcmVuY2VQYWdlOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERpYWdyYW1QcmludGluZ1ByZWZlcmVuY2VQYWdlIGV4dGVuZHMgUHJpbnRpbmdQcmVmZXJlbmNlUGFnZSB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERpYWdyYW1QcmludGluZ1ByZWZlcmVuY2VQYWdlKCkgewotCQlzZXRQcmVmZXJlbmNlU3RvcmUoQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkKLQkJCQkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL3ByZWZlcmVuY2VzL0RpYWdyYW1SdWxlcnNBbmRHcmlkUHJlZmVyZW5jZVBhZ2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL3ByZWZlcmVuY2VzL0RpYWdyYW1SdWxlcnNBbmRHcmlkUHJlZmVyZW5jZVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOThmY2ZiMy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9wcmVmZXJlbmNlcy9EaWFncmFtUnVsZXJzQW5kR3JpZFByZWZlcmVuY2VQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5wcmVmZXJlbmNlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5wYXJ0LkFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnByZWZlcmVuY2VzLlJ1bGVyR3JpZFByZWZlcmVuY2VQYWdlOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERpYWdyYW1SdWxlcnNBbmRHcmlkUHJlZmVyZW5jZVBhZ2UgZXh0ZW5kcyBSdWxlckdyaWRQcmVmZXJlbmNlUGFnZSB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERpYWdyYW1SdWxlcnNBbmRHcmlkUHJlZmVyZW5jZVBhZ2UoKSB7Ci0JCXNldFByZWZlcmVuY2VTdG9yZShBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKQotCQkJCS5nZXRQcmVmZXJlbmNlU3RvcmUoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvcHJvdmlkZXJzL0RpYWdyYW1BYnN0cmFjdFBhcnNlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvcHJvdmlkZXJzL0RpYWdyYW1BYnN0cmFjdFBhcnNlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTkyY2E1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL3Byb3ZpZGVycy9EaWFncmFtQWJzdHJhY3RQYXJzZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQucHJvdmlkZXJzOwotCi1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci1pbXBvcnQgamF2YS50ZXh0LlBhcnNlUG9zaXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzaWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVEYXRhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUVudW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVFbnVtTGl0ZXJhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi5jb3JlLmNvbW1hbmQuSUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUuY29tbWFuZC5VbmV4ZWN1dGFibGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuSVBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLklQYXJzZXJFZGl0U3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuUGFyc2VyRWRpdFN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLmNvbW1hbmRzLlNldFZhbHVlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLlNldFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZW50QXNzaXN0UHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5wYXJ0LkFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvclBsdWdpbjsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBEaWFncmFtQWJzdHJhY3RQYXJzZXIgaW1wbGVtZW50cyBJUGFyc2VyIHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIFN0cmluZyB2aWV3UGF0dGVybjsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIE1lc3NhZ2VGb3JtYXQgdmlld1Byb2Nlc3NvcjsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBlZGl0UGF0dGVybjsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIE1lc3NhZ2VGb3JtYXQgZWRpdFByb2Nlc3NvcjsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFZpZXdQYXR0ZXJuKCkgewotCQlyZXR1cm4gdmlld1BhdHRlcm47Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBNZXNzYWdlRm9ybWF0IGdldFZpZXdQcm9jZXNzb3IoKSB7Ci0JCXJldHVybiB2aWV3UHJvY2Vzc29yOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWaWV3UGF0dGVybihTdHJpbmcgdmlld1BhdHRlcm4pIHsKLQkJdGhpcy52aWV3UGF0dGVybiA9IHZpZXdQYXR0ZXJuOwotCQl2aWV3UHJvY2Vzc29yID0gY3JlYXRlVmlld1Byb2Nlc3Nvcih2aWV3UGF0dGVybik7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBNZXNzYWdlRm9ybWF0IGNyZWF0ZVZpZXdQcm9jZXNzb3IoU3RyaW5nIHZpZXdQYXR0ZXJuKSB7Ci0JCXJldHVybiBuZXcgTWVzc2FnZUZvcm1hdCh2aWV3UGF0dGVybik7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RWRpdFBhdHRlcm4oKSB7Ci0JCXJldHVybiBlZGl0UGF0dGVybjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE1lc3NhZ2VGb3JtYXQgZ2V0RWRpdFByb2Nlc3NvcigpIHsKLQkJcmV0dXJuIGVkaXRQcm9jZXNzb3I7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVkaXRQYXR0ZXJuKFN0cmluZyBlZGl0UGF0dGVybikgewotCQl0aGlzLmVkaXRQYXR0ZXJuID0gZWRpdFBhdHRlcm47Ci0JCWVkaXRQcm9jZXNzb3IgPSBjcmVhdGVFZGl0UHJvY2Vzc29yKGVkaXRQYXR0ZXJuKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE1lc3NhZ2VGb3JtYXQgY3JlYXRlRWRpdFByb2Nlc3NvcihTdHJpbmcgZWRpdFBhdHRlcm4pIHsKLQkJcmV0dXJuIG5ldyBNZXNzYWdlRm9ybWF0KGVkaXRQYXR0ZXJuKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQcmludFN0cmluZyhJQWRhcHRhYmxlIGFkYXB0ZXIsIGludCBmbGFncykgewotCQlyZXR1cm4gZ2V0U3RyaW5nQnlQYXR0ZXJuKGFkYXB0ZXIsIGZsYWdzLCBnZXRWaWV3UGF0dGVybigpLAotCQkJCWdldFZpZXdQcm9jZXNzb3IoKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RWRpdFN0cmluZyhJQWRhcHRhYmxlIGFkYXB0ZXIsIGludCBmbGFncykgewotCQlyZXR1cm4gZ2V0U3RyaW5nQnlQYXR0ZXJuKGFkYXB0ZXIsIGZsYWdzLCBnZXRFZGl0UGF0dGVybigpLAotCQkJCWdldEVkaXRQcm9jZXNzb3IoKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0U3RyaW5nQnlQYXR0ZXJuKElBZGFwdGFibGUgYWRhcHRlciwgaW50IGZsYWdzLAotCQkJU3RyaW5nIHBhdHRlcm4sIE1lc3NhZ2VGb3JtYXQgcHJvY2Vzc29yKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSVBhcnNlckVkaXRTdGF0dXMgaXNWYWxpZEVkaXRTdHJpbmcoSUFkYXB0YWJsZSBlbGVtZW50LAotCQkJU3RyaW5nIGVkaXRTdHJpbmcpIHsKLQkJUGFyc2VQb3NpdGlvbiBwb3MgPSBuZXcgUGFyc2VQb3NpdGlvbigwKTsKLQkJT2JqZWN0W10gdmFsdWVzID0gZ2V0RWRpdFByb2Nlc3NvcigpLnBhcnNlKGVkaXRTdHJpbmcsIHBvcyk7Ci0JCWlmICh2YWx1ZXMgPT0gbnVsbCkgewotCQkJcmV0dXJuIG5ldyBQYXJzZXJFZGl0U3RhdHVzKEFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvclBsdWdpbi5JRCwKLQkJCQkJSVBhcnNlckVkaXRTdGF0dXMuVU5FRElUQUJMRSwgIkludmFsaWQgaW5wdXQgYXQgIgotCQkJCQkJCSsgcG9zLmdldEVycm9ySW5kZXgoKSk7Ci0JCX0KLQkJcmV0dXJuIHZhbGlkYXRlTmV3VmFsdWVzKHZhbHVlcyk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJUGFyc2VyRWRpdFN0YXR1cyB2YWxpZGF0ZU5ld1ZhbHVlcyhPYmplY3RbXSB2YWx1ZXMpIHsKLQkJcmV0dXJuIFBhcnNlckVkaXRTdGF0dXMuRURJVEFCTEVfU1RBVFVTOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSUNvbW1hbmQgZ2V0UGFyc2VDb21tYW5kKElBZGFwdGFibGUgYWRhcHRlciwgU3RyaW5nIG5ld1N0cmluZywKLQkJCWludCBmbGFncykgewotCQlPYmplY3RbXSB2YWx1ZXMgPSBnZXRFZGl0UHJvY2Vzc29yKCkucGFyc2UobmV3U3RyaW5nLAotCQkJCW5ldyBQYXJzZVBvc2l0aW9uKDApKTsKLQkJaWYgKHZhbHVlcyA9PSBudWxsCi0JCQkJfHwgdmFsaWRhdGVOZXdWYWx1ZXModmFsdWVzKS5nZXRDb2RlKCkgIT0gSVBhcnNlckVkaXRTdGF0dXMuRURJVEFCTEUpIHsKLQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQl9Ci0JCXJldHVybiBnZXRQYXJzZUNvbW1hbmQoYWRhcHRlciwgdmFsdWVzKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IElDb21tYW5kIGdldFBhcnNlQ29tbWFuZChJQWRhcHRhYmxlIGFkYXB0ZXIsCi0JCQlPYmplY3RbXSB2YWx1ZXMpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJQ29udGVudEFzc2lzdFByb2Nlc3NvciBnZXRDb21wbGV0aW9uUHJvY2Vzc29yKElBZGFwdGFibGUgZWxlbWVudCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElDb21tYW5kIGdldE1vZGlmaWNhdGlvbkNvbW1hbmQoRU9iamVjdCBlbGVtZW50LAotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIE9iamVjdCB2YWx1ZSkgewotCQl2YWx1ZSA9IGdldFZhbGlkTmV3VmFsdWUoZmVhdHVyZSwgdmFsdWUpOwotCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBJbnZhbGlkVmFsdWUpIHsKLQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQl9Ci0JCVNldFJlcXVlc3QgcmVxdWVzdCA9IG5ldyBTZXRSZXF1ZXN0KGVsZW1lbnQsIGZlYXR1cmUsIHZhbHVlKTsKLQkJcmV0dXJuIG5ldyBTZXRWYWx1ZUNvbW1hbmQocmVxdWVzdCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZ2V0VmFsaWRWYWx1ZShFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgT2JqZWN0IHZhbHVlKSB7Ci0JCUVDbGFzc2lmaWVyIHR5cGUgPSBmZWF0dXJlLmdldEVUeXBlKCk7Ci0JCWlmICh0eXBlIGluc3RhbmNlb2YgRURhdGFUeXBlKSB7Ci0JCQlDbGFzcyBpQ2xhc3MgPSB0eXBlLmdldEluc3RhbmNlQ2xhc3MoKTsKLQkJCWlmIChTdHJpbmcuY2xhc3MuZXF1YWxzKGlDbGFzcykpIHsKLQkJCQlpZiAodmFsdWUgPT0gbnVsbCkgewotCQkJCQl2YWx1ZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiB2YWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBnZXRWYWxpZE5ld1ZhbHVlKEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBPYmplY3QgdmFsdWUpIHsKLQkJRUNsYXNzaWZpZXIgdHlwZSA9IGZlYXR1cmUuZ2V0RVR5cGUoKTsKLQkJaWYgKHR5cGUgaW5zdGFuY2VvZiBFRGF0YVR5cGUpIHsKLQkJCUNsYXNzIGlDbGFzcyA9IHR5cGUuZ2V0SW5zdGFuY2VDbGFzcygpOwotCQkJaWYgKEJvb2xlYW4uVFlQRS5lcXVhbHMoaUNsYXNzKSkgewotCQkJCWlmICh2YWx1ZSBpbnN0YW5jZW9mIEJvb2xlYW4pIHsKLQkJCQkJLy8gb2sKLQkJCQl9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0JCQkJCXZhbHVlID0gQm9vbGVhbi52YWx1ZU9mKChTdHJpbmcpIHZhbHVlKTsKLQkJCQl9IGVsc2UgewotCQkJCQl2YWx1ZSA9IG5ldyBJbnZhbGlkVmFsdWUoCi0JCQkJCQkJIlZhbHVlIG9mIHR5cGUgQm9vbGVhbiBpcyBleHBlY3RlZCIpOwotCQkJCX0KLQkJCX0gZWxzZSBpZiAoQ2hhcmFjdGVyLlRZUEUuZXF1YWxzKGlDbGFzcykpIHsKLQkJCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBDaGFyYWN0ZXIpIHsKLQkJCQkJLy8gb2sKLQkJCQl9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0JCQkJCVN0cmluZyBzID0gKFN0cmluZykgdmFsdWU7Ci0JCQkJCWlmIChzLmxlbmd0aCgpID09IDApIHsKLQkJCQkJCXZhbHVlID0gbnVsbDsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCXZhbHVlID0gbmV3IENoYXJhY3RlcihzLmNoYXJBdCgwKSk7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQl2YWx1ZSA9IG5ldyBJbnZhbGlkVmFsdWUoCi0JCQkJCQkJIlZhbHVlIG9mIHR5cGUgQ2hhcmFjdGVyIGlzIGV4cGVjdGVkIik7Ci0JCQkJfQotCQkJfSBlbHNlIGlmIChCeXRlLlRZUEUuZXF1YWxzKGlDbGFzcykpIHsKLQkJCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBCeXRlKSB7Ci0JCQkJCS8vIG9rCi0JCQkJfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIE51bWJlcikgewotCQkJCQl2YWx1ZSA9IG5ldyBCeXRlKCgoTnVtYmVyKSB2YWx1ZSkuYnl0ZVZhbHVlKCkpOwotCQkJCX0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpIHsKLQkJCQkJU3RyaW5nIHMgPSAoU3RyaW5nKSB2YWx1ZTsKLQkJCQkJaWYgKHMubGVuZ3RoKCkgPT0gMCkgewotCQkJCQkJdmFsdWUgPSBudWxsOwotCQkJCQl9IGVsc2UgewotCQkJCQkJdHJ5IHsKLQkJCQkJCQl2YWx1ZSA9IEJ5dGUudmFsdWVPZihzKTsKLQkJCQkJCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBuZmUpIHsKLQkJCQkJCQl2YWx1ZSA9IG5ldyBJbnZhbGlkVmFsdWUoCi0JCQkJCQkJCQkiU3RyaW5nIHZhbHVlIGRvZXMgbm90IGNvbnZlcnQgdG8gQnl0ZSB2YWx1ZSIpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJdmFsdWUgPSBuZXcgSW52YWxpZFZhbHVlKCJWYWx1ZSBvZiB0eXBlIEJ5dGUgaXMgZXhwZWN0ZWQiKTsKLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKFNob3J0LlRZUEUuZXF1YWxzKGlDbGFzcykpIHsKLQkJCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBTaG9ydCkgewotCQkJCQkvLyBvawotCQkJCX0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBOdW1iZXIpIHsKLQkJCQkJdmFsdWUgPSBuZXcgU2hvcnQoKChOdW1iZXIpIHZhbHVlKS5zaG9ydFZhbHVlKCkpOwotCQkJCX0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpIHsKLQkJCQkJU3RyaW5nIHMgPSAoU3RyaW5nKSB2YWx1ZTsKLQkJCQkJaWYgKHMubGVuZ3RoKCkgPT0gMCkgewotCQkJCQkJdmFsdWUgPSBudWxsOwotCQkJCQl9IGVsc2UgewotCQkJCQkJdHJ5IHsKLQkJCQkJCQl2YWx1ZSA9IFNob3J0LnZhbHVlT2Yocyk7Ci0JCQkJCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gbmZlKSB7Ci0JCQkJCQkJdmFsdWUgPSBuZXcgSW52YWxpZFZhbHVlKAotCQkJCQkJCQkJIlN0cmluZyB2YWx1ZSBkb2VzIG5vdCBjb252ZXJ0IHRvIFNob3J0IHZhbHVlIik7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQl2YWx1ZSA9IG5ldyBJbnZhbGlkVmFsdWUoIlZhbHVlIG9mIHR5cGUgU2hvcnQgaXMgZXhwZWN0ZWQiKTsKLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKEludGVnZXIuVFlQRS5lcXVhbHMoaUNsYXNzKSkgewotCQkJCWlmICh2YWx1ZSBpbnN0YW5jZW9mIEludGVnZXIpIHsKLQkJCQkJLy8gb2sKLQkJCQl9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgTnVtYmVyKSB7Ci0JCQkJCXZhbHVlID0gbmV3IEludGVnZXIoKChOdW1iZXIpIHZhbHVlKS5pbnRWYWx1ZSgpKTsKLQkJCQl9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0JCQkJCVN0cmluZyBzID0gKFN0cmluZykgdmFsdWU7Ci0JCQkJCWlmIChzLmxlbmd0aCgpID09IDApIHsKLQkJCQkJCXZhbHVlID0gbnVsbDsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJdmFsdWUgPSBJbnRlZ2VyLnZhbHVlT2Yocyk7Ci0JCQkJCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gbmZlKSB7Ci0JCQkJCQkJdmFsdWUgPSBuZXcgSW52YWxpZFZhbHVlKAotCQkJCQkJCQkJIlN0cmluZyB2YWx1ZSBkb2VzIG5vdCBjb252ZXJ0IHRvIEludGVnZXIgdmFsdWUiKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCXZhbHVlID0gbmV3IEludmFsaWRWYWx1ZSgKLQkJCQkJCQkiVmFsdWUgb2YgdHlwZSBJbnRlZ2VyIGlzIGV4cGVjdGVkIik7Ci0JCQkJfQotCQkJfSBlbHNlIGlmIChMb25nLlRZUEUuZXF1YWxzKGlDbGFzcykpIHsKLQkJCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBMb25nKSB7Ci0JCQkJCS8vIG9rCi0JCQkJfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIE51bWJlcikgewotCQkJCQl2YWx1ZSA9IG5ldyBMb25nKCgoTnVtYmVyKSB2YWx1ZSkubG9uZ1ZhbHVlKCkpOwotCQkJCX0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpIHsKLQkJCQkJU3RyaW5nIHMgPSAoU3RyaW5nKSB2YWx1ZTsKLQkJCQkJaWYgKHMubGVuZ3RoKCkgPT0gMCkgewotCQkJCQkJdmFsdWUgPSBudWxsOwotCQkJCQl9IGVsc2UgewotCQkJCQkJdHJ5IHsKLQkJCQkJCQl2YWx1ZSA9IExvbmcudmFsdWVPZihzKTsKLQkJCQkJCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBuZmUpIHsKLQkJCQkJCQl2YWx1ZSA9IG5ldyBJbnZhbGlkVmFsdWUoCi0JCQkJCQkJCQkiU3RyaW5nIHZhbHVlIGRvZXMgbm90IGNvbnZlcnQgdG8gTG9uZyB2YWx1ZSIpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJdmFsdWUgPSBuZXcgSW52YWxpZFZhbHVlKCJWYWx1ZSBvZiB0eXBlIExvbmcgaXMgZXhwZWN0ZWQiKTsKLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKEZsb2F0LlRZUEUuZXF1YWxzKGlDbGFzcykpIHsKLQkJCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBGbG9hdCkgewotCQkJCQkvLyBvawotCQkJCX0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBOdW1iZXIpIHsKLQkJCQkJdmFsdWUgPSBuZXcgRmxvYXQoKChOdW1iZXIpIHZhbHVlKS5mbG9hdFZhbHVlKCkpOwotCQkJCX0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpIHsKLQkJCQkJU3RyaW5nIHMgPSAoU3RyaW5nKSB2YWx1ZTsKLQkJCQkJaWYgKHMubGVuZ3RoKCkgPT0gMCkgewotCQkJCQkJdmFsdWUgPSBudWxsOwotCQkJCQl9IGVsc2UgewotCQkJCQkJdHJ5IHsKLQkJCQkJCQl2YWx1ZSA9IEZsb2F0LnZhbHVlT2Yocyk7Ci0JCQkJCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gbmZlKSB7Ci0JCQkJCQkJdmFsdWUgPSBuZXcgSW52YWxpZFZhbHVlKAotCQkJCQkJCQkJIlN0cmluZyB2YWx1ZSBkb2VzIG5vdCBjb252ZXJ0IHRvIEZsb2F0IHZhbHVlIik7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQl2YWx1ZSA9IG5ldyBJbnZhbGlkVmFsdWUoIlZhbHVlIG9mIHR5cGUgRmxvYXQgaXMgZXhwZWN0ZWQiKTsKLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKERvdWJsZS5UWVBFLmVxdWFscyhpQ2xhc3MpKSB7Ci0JCQkJaWYgKHZhbHVlIGluc3RhbmNlb2YgRG91YmxlKSB7Ci0JCQkJCS8vIG9rCi0JCQkJfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIE51bWJlcikgewotCQkJCQl2YWx1ZSA9IG5ldyBEb3VibGUoKChOdW1iZXIpIHZhbHVlKS5kb3VibGVWYWx1ZSgpKTsKLQkJCQl9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0JCQkJCVN0cmluZyBzID0gKFN0cmluZykgdmFsdWU7Ci0JCQkJCWlmIChzLmxlbmd0aCgpID09IDApIHsKLQkJCQkJCXZhbHVlID0gbnVsbDsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJdmFsdWUgPSBEb3VibGUudmFsdWVPZihzKTsKLQkJCQkJCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBuZmUpIHsKLQkJCQkJCQl2YWx1ZSA9IG5ldyBJbnZhbGlkVmFsdWUoCi0JCQkJCQkJCQkiU3RyaW5nIHZhbHVlIGRvZXMgbm90IGNvbnZlcnQgdG8gRG91YmxlIHZhbHVlIik7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQl2YWx1ZSA9IG5ldyBJbnZhbGlkVmFsdWUoIlZhbHVlIG9mIHR5cGUgRG91YmxlIGlzIGV4cGVjdGVkIik7Ci0JCQkJfQotCQkJfSBlbHNlIGlmICh0eXBlIGluc3RhbmNlb2YgRUVudW0pIHsKLQkJCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpIHsKLQkJCQkJRUVudW1MaXRlcmFsIGxpdGVyYWwgPSAoKEVFbnVtKSB0eXBlKQotCQkJCQkJCS5nZXRFRW51bUxpdGVyYWxCeUxpdGVyYWwoKFN0cmluZykgdmFsdWUpOwotCQkJCQlpZiAobGl0ZXJhbCA9PSBudWxsKSB7Ci0JCQkJCQl2YWx1ZSA9IG5ldyBJbnZhbGlkVmFsdWUoIlVua25vd24gbGl0ZXJhbDogIiArIHZhbHVlKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCXZhbHVlID0gbGl0ZXJhbC5nZXRJbnN0YW5jZSgpOwotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJdmFsdWUgPSBuZXcgSW52YWxpZFZhbHVlKCJWYWx1ZSBvZiB0eXBlIFN0cmluZyBpcyBleHBlY3RlZCIpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gdmFsdWU7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBjbGFzcyBJbnZhbGlkVmFsdWUgewotCi0JCXByaXZhdGUgU3RyaW5nIGRlc2NyaXB0aW9uOwotCi0JCXB1YmxpYyBJbnZhbGlkVmFsdWUoU3RyaW5nIGRlc2NyaXB0aW9uKSB7Ci0JCQl0aGlzLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuIGRlc2NyaXB0aW9uOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvcHJvdmlkZXJzL0RpYWdyYW1Db250cmlidXRpb25JdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL3Byb3ZpZGVycy9EaWFncmFtQ29udHJpYnV0aW9uSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzMmIwMWEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvcHJvdmlkZXJzL0RpYWdyYW1Db250cmlidXRpb25JdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5wcm92aWRlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMuYWN0aW9uLmNvbnRyaWJ1dGlvbml0ZW0uQWJzdHJhY3RDb250cmlidXRpb25JdGVtUHJvdmlkZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkudXRpbC5JV29ya2JlbmNoUGFydERlc2NyaXB0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnByaW50aW5nLmFjdGlvbnMuUHJpbnRQcmV2aWV3QWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wcmludGluZy5yZW5kZXIuYWN0aW9ucy5FbmhhbmNlZFByaW50QWN0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucHJpbnRpbmcucmVuZGVyLmFjdGlvbnMuUmVuZGVyZWRQcmludFByZXZpZXdBY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEaWFncmFtQ29udHJpYnV0aW9uSXRlbVByb3ZpZGVyIGV4dGVuZHMKLQkJQWJzdHJhY3RDb250cmlidXRpb25JdGVtUHJvdmlkZXIgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJQWN0aW9uIGNyZWF0ZUFjdGlvbihTdHJpbmcgYWN0aW9uSWQsCi0JCQlJV29ya2JlbmNoUGFydERlc2NyaXB0b3IgcGFydERlc2NyaXB0b3IpIHsKLQkJaWYgKGFjdGlvbklkLmVxdWFscyhQcmludFByZXZpZXdBY3Rpb24uSUQpKSB7Ci0JCQlyZXR1cm4gbmV3IFJlbmRlcmVkUHJpbnRQcmV2aWV3QWN0aW9uKAotCQkJCQluZXcgRW5oYW5jZWRQcmludEFjdGlvbkhlbHBlcigpKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuY3JlYXRlQWN0aW9uKGFjdGlvbklkLCBwYXJ0RGVzY3JpcHRvcik7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9wcm92aWRlcnMvRGlhZ3JhbUVkaXRQYXJ0UHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL3Byb3ZpZGVycy9EaWFncmFtRWRpdFBhcnRQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ODU5OWM3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL3Byb3ZpZGVycy9EaWFncmFtRWRpdFBhcnRQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5wcm92aWRlcnM7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmLldlYWtSZWZlcmVuY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS5zZXJ2aWNlLklPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuc2VydmljZXMuZWRpdHBhcnQuQWJzdHJhY3RFZGl0UGFydFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuc2VydmljZXMuZWRpdHBhcnQuQ3JlYXRlR3JhcGhpY0VkaXRQYXJ0T3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuc2VydmljZXMuZWRpdHBhcnQuSUVkaXRQYXJ0T3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucGFydHMuRGlhZ3JhbUVkaXRQYXJ0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wYXJ0cy5BY3Rpdml0eURldGFpbERpYWdyYW1FZGl0UGFydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5wYXJ0LkRpYWdyYW1WaXN1YWxJRFJlZ2lzdHJ5OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERpYWdyYW1FZGl0UGFydFByb3ZpZGVyIGV4dGVuZHMgQWJzdHJhY3RFZGl0UGFydFByb3ZpZGVyIHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVkaXRQYXJ0RmFjdG9yeSBmYWN0b3J5OwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBhbGxvd0NhY2hpbmc7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBXZWFrUmVmZXJlbmNlIGNhY2hlZFBhcnQ7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBXZWFrUmVmZXJlbmNlIGNhY2hlZFZpZXc7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERpYWdyYW1FZGl0UGFydFByb3ZpZGVyKCkgewotCQlzZXRGYWN0b3J5KG5ldyBEaWFncmFtRWRpdFBhcnRGYWN0b3J5KCkpOwotCQlzZXRBbGxvd0NhY2hpbmcodHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBmaW5hbCBFZGl0UGFydEZhY3RvcnkgZ2V0RmFjdG9yeSgpIHsKLQkJcmV0dXJuIGZhY3Rvcnk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldEZhY3RvcnkoRWRpdFBhcnRGYWN0b3J5IGZhY3RvcnkpIHsKLQkJdGhpcy5mYWN0b3J5ID0gZmFjdG9yeTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGZpbmFsIGJvb2xlYW4gaXNBbGxvd0NhY2hpbmcoKSB7Ci0JCXJldHVybiBhbGxvd0NhY2hpbmc7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBzeW5jaHJvbml6ZWQgdm9pZCBzZXRBbGxvd0NhY2hpbmcoYm9vbGVhbiBhbGxvd0NhY2hpbmcpIHsKLQkJdGhpcy5hbGxvd0NhY2hpbmcgPSBhbGxvd0NhY2hpbmc7Ci0JCWlmICghYWxsb3dDYWNoaW5nKSB7Ci0JCQljYWNoZWRQYXJ0ID0gbnVsbDsKLQkJCWNhY2hlZFZpZXcgPSBudWxsOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJR3JhcGhpY2FsRWRpdFBhcnQgY3JlYXRlRWRpdFBhcnQoVmlldyB2aWV3KSB7Ci0JCUVkaXRQYXJ0IHBhcnQgPSBmYWN0b3J5LmNyZWF0ZUVkaXRQYXJ0KG51bGwsIHZpZXcpOwotCQlpZiAocGFydCBpbnN0YW5jZW9mIElHcmFwaGljYWxFZGl0UGFydCkgewotCQkJcmV0dXJuIChJR3JhcGhpY2FsRWRpdFBhcnQpIHBhcnQ7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJR3JhcGhpY2FsRWRpdFBhcnQgZ2V0Q2FjaGVkUGFydChWaWV3IHZpZXcpIHsKLQkJaWYgKGNhY2hlZFZpZXcgIT0gbnVsbCAmJiBjYWNoZWRWaWV3LmdldCgpID09IHZpZXcpIHsKLQkJCXJldHVybiAoSUdyYXBoaWNhbEVkaXRQYXJ0KSBjYWNoZWRQYXJ0LmdldCgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIElHcmFwaGljYWxFZGl0UGFydCBjcmVhdGVHcmFwaGljRWRpdFBhcnQoVmlldyB2aWV3KSB7Ci0JCWlmIChpc0FsbG93Q2FjaGluZygpKSB7Ci0JCQlJR3JhcGhpY2FsRWRpdFBhcnQgcGFydCA9IGdldENhY2hlZFBhcnQodmlldyk7Ci0JCQljYWNoZWRQYXJ0ID0gbnVsbDsKLQkJCWNhY2hlZFZpZXcgPSBudWxsOwotCQkJaWYgKHBhcnQgIT0gbnVsbCkgewotCQkJCXJldHVybiBwYXJ0OwotCQkJfQotCQl9Ci0JCXJldHVybiBjcmVhdGVFZGl0UGFydCh2aWV3KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIHByb3ZpZGVzKElPcGVyYXRpb24gb3BlcmF0aW9uKSB7Ci0JCWlmIChvcGVyYXRpb24gaW5zdGFuY2VvZiBDcmVhdGVHcmFwaGljRWRpdFBhcnRPcGVyYXRpb24pIHsKLQkJCVZpZXcgdmlldyA9ICgoSUVkaXRQYXJ0T3BlcmF0aW9uKSBvcGVyYXRpb24pLmdldFZpZXcoKTsKLQkJCWlmICghQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdFBhcnQuTU9ERUxfSUQKLQkJCQkJLmVxdWFscyhEaWFncmFtVmlzdWFsSURSZWdpc3RyeS5nZXRNb2RlbElEKHZpZXcpKSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCWlmIChpc0FsbG93Q2FjaGluZygpICYmIGdldENhY2hlZFBhcnQodmlldykgIT0gbnVsbCkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQkJSUdyYXBoaWNhbEVkaXRQYXJ0IHBhcnQgPSBjcmVhdGVFZGl0UGFydCh2aWV3KTsKLQkJCWlmIChwYXJ0ICE9IG51bGwpIHsKLQkJCQlpZiAoaXNBbGxvd0NhY2hpbmcoKSkgewotCQkJCQljYWNoZWRQYXJ0ID0gbmV3IFdlYWtSZWZlcmVuY2UocGFydCk7Ci0JCQkJCWNhY2hlZFZpZXcgPSBuZXcgV2Vha1JlZmVyZW5jZSh2aWV3KTsKLQkJCQl9Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9wcm92aWRlcnMvRGlhZ3JhbUVsZW1lbnRUeXBlcy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvcHJvdmlkZXJzL0RpYWdyYW1FbGVtZW50VHlwZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWEyNTMxNS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9wcm92aWRlcnMvRGlhZ3JhbUVsZW1lbnRUeXBlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQ3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5wcm92aWRlcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSWRlbnRpdHlIYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3NpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU5hbWVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuRWxlbWVudFR5cGVSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLklFbGVtZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLnBhcnQuQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9yUGx1Z2luOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTW9kZWxQYWNrYWdlOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERpYWdyYW1FbGVtZW50VHlwZXMgZXh0ZW5kcyBFbGVtZW50SW5pdGlhbGl6ZXJzIHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIERpYWdyYW1FbGVtZW50VHlwZXMoKSB7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIE1hcCBlbGVtZW50czsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBJbWFnZVJlZ2lzdHJ5IGltYWdlUmVnaXN0cnk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgSW1hZ2VSZWdpc3RyeSBnZXRJbWFnZVJlZ2lzdHJ5KCkgewotCQlpZiAoaW1hZ2VSZWdpc3RyeSA9PSBudWxsKSB7Ci0JCQlpbWFnZVJlZ2lzdHJ5ID0gbmV3IEltYWdlUmVnaXN0cnkoKTsKLQkJfQotCQlyZXR1cm4gaW1hZ2VSZWdpc3RyeTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldEltYWdlUmVnaXN0cnlLZXkoRU5hbWVkRWxlbWVudCBlbGVtZW50KSB7Ci0JCXJldHVybiBlbGVtZW50LmdldE5hbWUoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgSW1hZ2VEZXNjcmlwdG9yIGdldFByb3ZpZGVkSW1hZ2VEZXNjcmlwdG9yKAotCQkJRU5hbWVkRWxlbWVudCBlbGVtZW50KSB7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgRVN0cnVjdHVyYWxGZWF0dXJlKSB7Ci0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9ICgoRVN0cnVjdHVyYWxGZWF0dXJlKSBlbGVtZW50KTsKLQkJCUVDbGFzcyBlQ29udGFpbmluZ0NsYXNzID0gZmVhdHVyZS5nZXRFQ29udGFpbmluZ0NsYXNzKCk7Ci0JCQlFQ2xhc3NpZmllciBlVHlwZSA9IGZlYXR1cmUuZ2V0RVR5cGUoKTsKLQkJCWlmIChlQ29udGFpbmluZ0NsYXNzICE9IG51bGwgJiYgIWVDb250YWluaW5nQ2xhc3MuaXNBYnN0cmFjdCgpKSB7Ci0JCQkJZWxlbWVudCA9IGVDb250YWluaW5nQ2xhc3M7Ci0JCQl9IGVsc2UgaWYgKGVUeXBlIGluc3RhbmNlb2YgRUNsYXNzCi0JCQkJCSYmICEoKEVDbGFzcykgZVR5cGUpLmlzQWJzdHJhY3QoKSkgewotCQkJCWVsZW1lbnQgPSBlVHlwZTsKLQkJCX0KLQkJfQotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEVDbGFzcykgewotCQkJRUNsYXNzIGVDbGFzcyA9IChFQ2xhc3MpIGVsZW1lbnQ7Ci0JCQlpZiAoIWVDbGFzcy5pc0Fic3RyYWN0KCkpIHsKLQkJCQlyZXR1cm4gQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkKLQkJCQkJCS5nZXRJdGVtSW1hZ2VEZXNjcmlwdG9yKAotCQkJCQkJCQllQ2xhc3MuZ2V0RVBhY2thZ2UoKS5nZXRFRmFjdG9yeUluc3RhbmNlKCkKLQkJCQkJCQkJCQkuY3JlYXRlKGVDbGFzcykpOwotCQkJfQotCQl9Ci0JCS8vIFRPRE8gOiBzdXBwb3J0IHN0cnVjdHVyYWwgZmVhdHVyZXMKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSW1hZ2VEZXNjcmlwdG9yIGdldEltYWdlRGVzY3JpcHRvcihFTmFtZWRFbGVtZW50IGVsZW1lbnQpIHsKLQkJU3RyaW5nIGtleSA9IGdldEltYWdlUmVnaXN0cnlLZXkoZWxlbWVudCk7Ci0JCUltYWdlRGVzY3JpcHRvciBpbWFnZURlc2NyaXB0b3IgPSBnZXRJbWFnZVJlZ2lzdHJ5KCkuZ2V0RGVzY3JpcHRvcihrZXkpOwotCQlpZiAoaW1hZ2VEZXNjcmlwdG9yID09IG51bGwpIHsKLQkJCWltYWdlRGVzY3JpcHRvciA9IGdldFByb3ZpZGVkSW1hZ2VEZXNjcmlwdG9yKGVsZW1lbnQpOwotCQkJaWYgKGltYWdlRGVzY3JpcHRvciA9PSBudWxsKSB7Ci0JCQkJaW1hZ2VEZXNjcmlwdG9yID0gSW1hZ2VEZXNjcmlwdG9yLmdldE1pc3NpbmdJbWFnZURlc2NyaXB0b3IoKTsKLQkJCX0KLQkJCWdldEltYWdlUmVnaXN0cnkoKS5wdXQoa2V5LCBpbWFnZURlc2NyaXB0b3IpOwotCQl9Ci0JCXJldHVybiBpbWFnZURlc2NyaXB0b3I7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSW1hZ2UgZ2V0SW1hZ2UoRU5hbWVkRWxlbWVudCBlbGVtZW50KSB7Ci0JCVN0cmluZyBrZXkgPSBnZXRJbWFnZVJlZ2lzdHJ5S2V5KGVsZW1lbnQpOwotCQlJbWFnZSBpbWFnZSA9IGdldEltYWdlUmVnaXN0cnkoKS5nZXQoa2V5KTsKLQkJaWYgKGltYWdlID09IG51bGwpIHsKLQkJCUltYWdlRGVzY3JpcHRvciBpbWFnZURlc2NyaXB0b3IgPSBnZXRQcm92aWRlZEltYWdlRGVzY3JpcHRvcihlbGVtZW50KTsKLQkJCWlmIChpbWFnZURlc2NyaXB0b3IgPT0gbnVsbCkgewotCQkJCWltYWdlRGVzY3JpcHRvciA9IEltYWdlRGVzY3JpcHRvci5nZXRNaXNzaW5nSW1hZ2VEZXNjcmlwdG9yKCk7Ci0JCQl9Ci0JCQlnZXRJbWFnZVJlZ2lzdHJ5KCkucHV0KGtleSwgaW1hZ2VEZXNjcmlwdG9yKTsKLQkJCWltYWdlID0gZ2V0SW1hZ2VSZWdpc3RyeSgpLmdldChrZXkpOwotCQl9Ci0JCXJldHVybiBpbWFnZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBJbWFnZURlc2NyaXB0b3IgZ2V0SW1hZ2VEZXNjcmlwdG9yKElBZGFwdGFibGUgaGludCkgewotCQlFTmFtZWRFbGVtZW50IGVsZW1lbnQgPSBnZXRFbGVtZW50KGhpbnQpOwotCQlpZiAoZWxlbWVudCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gZ2V0SW1hZ2VEZXNjcmlwdG9yKGVsZW1lbnQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEltYWdlIGdldEltYWdlKElBZGFwdGFibGUgaGludCkgewotCQlFTmFtZWRFbGVtZW50IGVsZW1lbnQgPSBnZXRFbGVtZW50KGhpbnQpOwotCQlpZiAoZWxlbWVudCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gZ2V0SW1hZ2UoZWxlbWVudCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyAndHlwZScgb2YgdGhlIGVjb3JlIG9iamVjdCBhc3NvY2lhdGVkIHdpdGggdGhlIGhpbnQuCi0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgRU5hbWVkRWxlbWVudCBnZXRFbGVtZW50KElBZGFwdGFibGUgaGludCkgewotCQlPYmplY3QgdHlwZSA9IGhpbnQuZ2V0QWRhcHRlcihJRWxlbWVudFR5cGUuY2xhc3MpOwotCQlpZiAoZWxlbWVudHMgPT0gbnVsbCkgewotCQkJZWxlbWVudHMgPSBuZXcgSWRlbnRpdHlIYXNoTWFwKCk7Ci0KLQkJCWVsZW1lbnRzLnB1dChBY3Rpdml0eURldGFpbERpYWdyYW1fNzksIE1vZGVsUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJLmdldEFjdGl2aXR5RGV0YWlsRGlhZ3JhbSgpKTsKLQotCQkJZWxlbWVudHMucHV0KFJvbGVUYXNrQ29tcG9zaXRlXzEwMDEsIE1vZGVsUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJLmdldFJvbGVUYXNrQ29tcG9zaXRlKCkpOwotCi0JCQllbGVtZW50cy5wdXQoV29ya1Byb2R1Y3RDb21wb3NpdGVfMTAwMiwgTW9kZWxQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkuZ2V0V29ya1Byb2R1Y3RDb21wb3NpdGUoKSk7Ci0KLQkJCWVsZW1lbnRzLnB1dChSb2xlTm9kZV8yMDAxLCBNb2RlbFBhY2thZ2UuZUlOU1RBTkNFLmdldFJvbGVOb2RlKCkpOwotCi0JCQllbGVtZW50cy5wdXQoVGFza05vZGVfMjAwMiwgTW9kZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrTm9kZSgpKTsKLQotCQkJZWxlbWVudHMucHV0KFdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVfMjAwMywgTW9kZWxQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkuZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZSgpKTsKLQotCQkJZWxlbWVudHMucHV0KExpbmtfMzAwMSwgTW9kZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRMaW5rKCkpOwotCQl9Ci0JCXJldHVybiAoRU5hbWVkRWxlbWVudCkgZWxlbWVudHMuZ2V0KHR5cGUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIElFbGVtZW50VHlwZSBBY3Rpdml0eURldGFpbERpYWdyYW1fNzkgPSBnZXRFbGVtZW50VHlwZSgib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLkFjdGl2aXR5RGV0YWlsRGlhZ3JhbV83OSIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJRWxlbWVudFR5cGUgUm9sZU5vZGVfMjAwMSA9IGdldEVsZW1lbnRUeXBlKCJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuUm9sZU5vZGVfMjAwMSIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJRWxlbWVudFR5cGUgVGFza05vZGVfMjAwMiA9IGdldEVsZW1lbnRUeXBlKCJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuVGFza05vZGVfMjAwMiIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJRWxlbWVudFR5cGUgV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZV8yMDAzID0gZ2V0RWxlbWVudFR5cGUoIm9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5Xb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlXzIwMDMiKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSUVsZW1lbnRUeXBlIFJvbGVUYXNrQ29tcG9zaXRlXzEwMDEgPSBnZXRFbGVtZW50VHlwZSgib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLlJvbGVUYXNrQ29tcG9zaXRlXzEwMDEiKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSUVsZW1lbnRUeXBlIFdvcmtQcm9kdWN0Q29tcG9zaXRlXzEwMDIgPSBnZXRFbGVtZW50VHlwZSgib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLldvcmtQcm9kdWN0Q29tcG9zaXRlXzEwMDIiKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSUVsZW1lbnRUeXBlIExpbmtfMzAwMSA9IGdldEVsZW1lbnRUeXBlKCJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuTGlua18zMDAxIik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBJRWxlbWVudFR5cGUgZ2V0RWxlbWVudFR5cGUoU3RyaW5nIGlkKSB7Ci0JCXJldHVybiBFbGVtZW50VHlwZVJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0VHlwZShpZCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIFNldCBLTk9XTl9FTEVNRU5UX1RZUEVTOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0tub3duRWxlbWVudFR5cGUoSUVsZW1lbnRUeXBlIGVsZW1lbnRUeXBlKSB7Ci0JCWlmIChLTk9XTl9FTEVNRU5UX1RZUEVTID09IG51bGwpIHsKLQkJCUtOT1dOX0VMRU1FTlRfVFlQRVMgPSBuZXcgSGFzaFNldCgpOwotCQkJS05PV05fRUxFTUVOVF9UWVBFUy5hZGQoQWN0aXZpdHlEZXRhaWxEaWFncmFtXzc5KTsKLQkJCUtOT1dOX0VMRU1FTlRfVFlQRVMuYWRkKFJvbGVUYXNrQ29tcG9zaXRlXzEwMDEpOwotCQkJS05PV05fRUxFTUVOVF9UWVBFUy5hZGQoV29ya1Byb2R1Y3RDb21wb3NpdGVfMTAwMik7Ci0JCQlLTk9XTl9FTEVNRU5UX1RZUEVTLmFkZChSb2xlTm9kZV8yMDAxKTsKLQkJCUtOT1dOX0VMRU1FTlRfVFlQRVMuYWRkKFRhc2tOb2RlXzIwMDIpOwotCQkJS05PV05fRUxFTUVOVF9UWVBFUy5hZGQoV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZV8yMDAzKTsKLQkJCUtOT1dOX0VMRU1FTlRfVFlQRVMuYWRkKExpbmtfMzAwMSk7Ci0JCX0KLQkJcmV0dXJuIEtOT1dOX0VMRU1FTlRfVFlQRVMuY29udGFpbnMoZWxlbWVudFR5cGUpOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL3Byb3ZpZGVycy9EaWFncmFtSWNvblByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9wcm92aWRlcnMvRGlhZ3JhbUljb25Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4Nzk1NWJjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL3Byb3ZpZGVycy9EaWFncmFtSWNvblByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQucHJvdmlkZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUuc2VydmljZS5BYnN0cmFjdFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi5jb3JlLnNlcnZpY2UuSU9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMuaWNvbi5HZXRJY29uT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5pY29uLklJY29uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERpYWdyYW1JY29uUHJvdmlkZXIgZXh0ZW5kcyBBYnN0cmFjdFByb3ZpZGVyIGltcGxlbWVudHMKLQkJSUljb25Qcm92aWRlciB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEltYWdlIGdldEljb24oSUFkYXB0YWJsZSBoaW50LCBpbnQgZmxhZ3MpIHsKLQkJcmV0dXJuIERpYWdyYW1FbGVtZW50VHlwZXMuZ2V0SW1hZ2UoaGludCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHByb3ZpZGVzKElPcGVyYXRpb24gb3BlcmF0aW9uKSB7Ci0JCWlmIChvcGVyYXRpb24gaW5zdGFuY2VvZiBHZXRJY29uT3BlcmF0aW9uKSB7Ci0JCQlyZXR1cm4gKChHZXRJY29uT3BlcmF0aW9uKSBvcGVyYXRpb24pLmV4ZWN1dGUodGhpcykgIT0gbnVsbDsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvcHJvdmlkZXJzL0RpYWdyYW1Nb2RlbGluZ0Fzc2lzdGFudFByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9wcm92aWRlcnMvRGlhZ3JhbU1vZGVsaW5nQXNzaXN0YW50UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2Q3YmY3NS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9wcm92aWRlcnMvRGlhZ3JhbU1vZGVsaW5nQXNzaXN0YW50UHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQucHJvdmlkZXJzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuRWxlbWVudFR5cGVSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLklFbGVtZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudWkuc2VydmljZXMubW9kZWxpbmdhc3Npc3RhbnQuTW9kZWxpbmdBc3Npc3RhbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5EaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuRWxlbWVudExpc3RTZWxlY3Rpb25EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBhcnRzLkFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBhcnRzLlJvbGVUYXNrQ29tcG9zaXRlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucGFydHMuV29ya1Byb2R1Y3RDb21wb3NpdGVFZGl0UGFydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5wYXJ0LkFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvclBsdWdpbjsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEaWFncmFtTW9kZWxpbmdBc3Npc3RhbnRQcm92aWRlciBleHRlbmRzIE1vZGVsaW5nQXNzaXN0YW50UHJvdmlkZXIgewotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0VHlwZXNGb3JQb3B1cEJhcihJQWRhcHRhYmxlIGhvc3QpIHsKLQkJSUdyYXBoaWNhbEVkaXRQYXJ0IGVkaXRQYXJ0ID0gKElHcmFwaGljYWxFZGl0UGFydCkgaG9zdAotCQkJCS5nZXRBZGFwdGVyKElHcmFwaGljYWxFZGl0UGFydC5jbGFzcyk7Ci0JCWlmIChlZGl0UGFydCBpbnN0YW5jZW9mIFJvbGVUYXNrQ29tcG9zaXRlRWRpdFBhcnQpIHsKLQkJCUxpc3QgdHlwZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkvLwkJCXR5cGVzLmFkZChEaWFncmFtRWxlbWVudFR5cGVzLlJvbGVOb2RlXzIwMDEpOwotCQkJLy8JCQl0eXBlcy5hZGQoRGlhZ3JhbUVsZW1lbnRUeXBlcy5UYXNrTm9kZV8yMDAyKTsKLQkJCXJldHVybiB0eXBlczsKLQkJfQotCQlpZiAoZWRpdFBhcnQgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdENvbXBvc2l0ZUVkaXRQYXJ0KSB7Ci0JCQlMaXN0IHR5cGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJLy8JCQl0eXBlcy5hZGQoRGlhZ3JhbUVsZW1lbnRUeXBlcy5Xb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlXzIwMDMpOwotCQkJcmV0dXJuIHR5cGVzOwotCQl9Ci0JCWlmIChlZGl0UGFydCBpbnN0YW5jZW9mIEFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRQYXJ0KSB7Ci0JCQlMaXN0IHR5cGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJdHlwZXMuYWRkKERpYWdyYW1FbGVtZW50VHlwZXMuUm9sZVRhc2tDb21wb3NpdGVfMTAwMSk7Ci0JCQl0eXBlcy5hZGQoRGlhZ3JhbUVsZW1lbnRUeXBlcy5Xb3JrUHJvZHVjdENvbXBvc2l0ZV8xMDAyKTsKLQkJCXJldHVybiB0eXBlczsKLQkJfQotCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0UmVsVHlwZXNPblNvdXJjZShJQWRhcHRhYmxlIHNvdXJjZSkgewotCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0UmVsVHlwZXNPblRhcmdldChJQWRhcHRhYmxlIHRhcmdldCkgewotCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0UmVsVHlwZXNPblNvdXJjZUFuZFRhcmdldChJQWRhcHRhYmxlIHNvdXJjZSwKLQkJCUlBZGFwdGFibGUgdGFyZ2V0KSB7Ci0JCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRUeXBlc0ZvclNvdXJjZShJQWRhcHRhYmxlIHRhcmdldCwKLQkJCUlFbGVtZW50VHlwZSByZWxhdGlvbnNoaXBUeXBlKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRUeXBlc0ZvclRhcmdldChJQWRhcHRhYmxlIHNvdXJjZSwKLQkJCUlFbGVtZW50VHlwZSByZWxhdGlvbnNoaXBUeXBlKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRU9iamVjdCBzZWxlY3RFeGlzdGluZ0VsZW1lbnRGb3JTb3VyY2UoSUFkYXB0YWJsZSB0YXJnZXQsCi0JCQlJRWxlbWVudFR5cGUgcmVsYXRpb25zaGlwVHlwZSkgewotCQlyZXR1cm4gc2VsZWN0RXhpc3RpbmdFbGVtZW50KHRhcmdldCwgZ2V0VHlwZXNGb3JTb3VyY2UodGFyZ2V0LAotCQkJCXJlbGF0aW9uc2hpcFR5cGUpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVPYmplY3Qgc2VsZWN0RXhpc3RpbmdFbGVtZW50Rm9yVGFyZ2V0KElBZGFwdGFibGUgc291cmNlLAotCQkJSUVsZW1lbnRUeXBlIHJlbGF0aW9uc2hpcFR5cGUpIHsKLQkJcmV0dXJuIHNlbGVjdEV4aXN0aW5nRWxlbWVudChzb3VyY2UsIGdldFR5cGVzRm9yVGFyZ2V0KHNvdXJjZSwKLQkJCQlyZWxhdGlvbnNoaXBUeXBlKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFT2JqZWN0IHNlbGVjdEV4aXN0aW5nRWxlbWVudChJQWRhcHRhYmxlIGhvc3QsIENvbGxlY3Rpb24gdHlwZXMpIHsKLQkJaWYgKHR5cGVzLmlzRW1wdHkoKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJSUdyYXBoaWNhbEVkaXRQYXJ0IGVkaXRQYXJ0ID0gKElHcmFwaGljYWxFZGl0UGFydCkgaG9zdAotCQkJCS5nZXRBZGFwdGVyKElHcmFwaGljYWxFZGl0UGFydC5jbGFzcyk7Ci0JCWlmIChlZGl0UGFydCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlEaWFncmFtIGRpYWdyYW0gPSAoRGlhZ3JhbSkgZWRpdFBhcnQuZ2V0Um9vdCgpLmdldENvbnRlbnRzKCkuZ2V0TW9kZWwoKTsKLQkJQ29sbGVjdGlvbiBlbGVtZW50cyA9IG5ldyBIYXNoU2V0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSBkaWFncmFtLmdldEVsZW1lbnQoKS5lQWxsQ29udGVudHMoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJRU9iamVjdCBlbGVtZW50ID0gKEVPYmplY3QpIGl0Lm5leHQoKTsKLQkJCWlmIChpc0FwcGxpY2FibGVFbGVtZW50KGVsZW1lbnQsIHR5cGVzKSkgewotCQkJCWVsZW1lbnRzLmFkZChlbGVtZW50KTsKLQkJCX0KLQkJfQotCQlpZiAoZWxlbWVudHMuaXNFbXB0eSgpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gc2VsZWN0RWxlbWVudCgoRU9iamVjdFtdKSBlbGVtZW50cy50b0FycmF5KG5ldyBFT2JqZWN0W2VsZW1lbnRzCi0JCQkJLnNpemUoKV0pKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNBcHBsaWNhYmxlRWxlbWVudChFT2JqZWN0IGVsZW1lbnQsIENvbGxlY3Rpb24gdHlwZXMpIHsKLQkJSUVsZW1lbnRUeXBlIHR5cGUgPSBFbGVtZW50VHlwZVJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0RWxlbWVudFR5cGUoCi0JCQkJZWxlbWVudCk7Ci0JCXJldHVybiB0eXBlcy5jb250YWlucyh0eXBlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVPYmplY3Qgc2VsZWN0RWxlbWVudChFT2JqZWN0W10gZWxlbWVudHMpIHsKLQkJU2hlbGwgc2hlbGwgPSBEaXNwbGF5LmdldEN1cnJlbnQoKS5nZXRBY3RpdmVTaGVsbCgpOwotCQlJTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyID0gbmV3IEFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcigKLQkJCQlBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKQotCQkJCQkJLmdldEl0ZW1Qcm92aWRlcnNBZGFwdGVyRmFjdG9yeSgpKTsKLQkJRWxlbWVudExpc3RTZWxlY3Rpb25EaWFsb2cgZGlhbG9nID0gbmV3IEVsZW1lbnRMaXN0U2VsZWN0aW9uRGlhbG9nKAotCQkJCXNoZWxsLCBsYWJlbFByb3ZpZGVyKTsKLQkJZGlhbG9nLnNldE1lc3NhZ2UoIkF2YWlsYWJsZSBkb21haW4gbW9kZWwgZWxlbWVudHM6Iik7Ci0JCWRpYWxvZy5zZXRUaXRsZSgiU2VsZWN0IGRvbWFpbiBtb2RlbCBlbGVtZW50Iik7Ci0JCWRpYWxvZy5zZXRNdWx0aXBsZVNlbGVjdGlvbihmYWxzZSk7Ci0JCWRpYWxvZy5zZXRFbGVtZW50cyhlbGVtZW50cyk7Ci0JCUVPYmplY3Qgc2VsZWN0ZWQgPSBudWxsOwotCQlpZiAoZGlhbG9nLm9wZW4oKSA9PSBXaW5kb3cuT0spIHsKLQkJCXNlbGVjdGVkID0gKEVPYmplY3QpIGRpYWxvZy5nZXRGaXJzdFJlc3VsdCgpOwotCQl9Ci0JCXJldHVybiBzZWxlY3RlZDsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9wcm92aWRlcnMvRGlhZ3JhbVBhbGV0dGVQcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvcHJvdmlkZXJzL0RpYWdyYW1QYWxldHRlUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTViYWU0OS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9wcm92aWRlcnMvRGlhZ3JhbVBhbGV0dGVQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLnByb3ZpZGVyczsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucGFsZXR0ZS5QYWxldHRlUm9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS5zZXJ2aWNlLkFic3RyYWN0UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUuc2VydmljZS5JT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuc2VydmljZXMucGFsZXR0ZS5JUGFsZXR0ZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5wYXJ0LkRpYWdyYW1QYWxldHRlRmFjdG9yeTsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEaWFncmFtUGFsZXR0ZVByb3ZpZGVyIGV4dGVuZHMgQWJzdHJhY3RQcm92aWRlciBpbXBsZW1lbnRzCi0JCUlQYWxldHRlUHJvdmlkZXIgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGNvbnRyaWJ1dGVUb1BhbGV0dGUoSUVkaXRvclBhcnQgZWRpdG9yLCBPYmplY3QgY29udGVudCwKLQkJCVBhbGV0dGVSb290IHJvb3QsIE1hcCBwcmVkZWZpbmVkRW50cmllcykgewotCQlEaWFncmFtUGFsZXR0ZUZhY3RvcnkgZmFjdG9yeSA9IG5ldyBEaWFncmFtUGFsZXR0ZUZhY3RvcnkoKTsKLQkJZmFjdG9yeS5maWxsUGFsZXR0ZShyb290KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29udHJpYnV0aW9ucyhJQ29uZmlndXJhdGlvbkVsZW1lbnQgY29uZmlnRWxlbWVudCkgewotCQkvLyBubyBjb25maWd1cmF0aW9uCi0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHByb3ZpZGVzKElPcGVyYXRpb24gb3BlcmF0aW9uKSB7Ci0JCXJldHVybiBmYWxzZTsgLy8gYWxsIGxvZ2ljIGlzIGRvbmUgaW4gdGhlIHNlcnZpY2UKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9wcm92aWRlcnMvRGlhZ3JhbVBhcnNlclByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9wcm92aWRlcnMvRGlhZ3JhbVBhcnNlclByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3Mjk1MDMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvcHJvdmlkZXJzL0RpYWdyYW1QYXJzZXJQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5wcm92aWRlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS5zZXJ2aWNlLkFic3RyYWN0UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUuc2VydmljZS5JT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuR2V0UGFyc2VyT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuSVBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLklQYXJzZXJQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBhcnRzLkxpbmtOYW1lRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucGFydHMuUm9sZU5vZGVOYW1lRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucGFydHMuVGFza05vZGVOYW1lRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucGFydHMuV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZU5hbWVFZGl0UGFydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5wYXJ0LkRpYWdyYW1WaXN1YWxJRFJlZ2lzdHJ5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTW9kZWxQYWNrYWdlOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERpYWdyYW1QYXJzZXJQcm92aWRlciBleHRlbmRzIEFic3RyYWN0UHJvdmlkZXIgaW1wbGVtZW50cwotCQlJUGFyc2VyUHJvdmlkZXIgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgSVBhcnNlciByb2xlTm9kZVJvbGVOb2RlTmFtZV80MDAxUGFyc2VyOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgSVBhcnNlciBnZXRSb2xlTm9kZVJvbGVOb2RlTmFtZV80MDAxUGFyc2VyKCkgewotCQlpZiAocm9sZU5vZGVSb2xlTm9kZU5hbWVfNDAwMVBhcnNlciA9PSBudWxsKSB7Ci0JCQlyb2xlTm9kZVJvbGVOb2RlTmFtZV80MDAxUGFyc2VyID0gY3JlYXRlUm9sZU5vZGVSb2xlTm9kZU5hbWVfNDAwMVBhcnNlcigpOwotCQl9Ci0JCXJldHVybiByb2xlTm9kZVJvbGVOb2RlTmFtZV80MDAxUGFyc2VyOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSVBhcnNlciBjcmVhdGVSb2xlTm9kZVJvbGVOb2RlTmFtZV80MDAxUGFyc2VyKCkgewotCQlEaWFncmFtU3RydWN0dXJhbEZlYXR1cmVQYXJzZXIgcGFyc2VyID0gbmV3IERpYWdyYW1TdHJ1Y3R1cmFsRmVhdHVyZVBhcnNlcigKLQkJCQlNb2RlbFBhY2thZ2UuZUlOU1RBTkNFLmdldE5hbWVkTm9kZV9OYW1lKCkpOwotCQlwYXJzZXIuc2V0Vmlld1BhdHRlcm4oInswfSIpOwotCQlwYXJzZXIuc2V0RWRpdFBhdHRlcm4oInswfSIpOwotCQlyZXR1cm4gcGFyc2VyOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIElQYXJzZXIgdGFza05vZGVUYXNrTm9kZU5hbWVfNDAwMlBhcnNlcjsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIElQYXJzZXIgZ2V0VGFza05vZGVUYXNrTm9kZU5hbWVfNDAwMlBhcnNlcigpIHsKLQkJaWYgKHRhc2tOb2RlVGFza05vZGVOYW1lXzQwMDJQYXJzZXIgPT0gbnVsbCkgewotCQkJdGFza05vZGVUYXNrTm9kZU5hbWVfNDAwMlBhcnNlciA9IGNyZWF0ZVRhc2tOb2RlVGFza05vZGVOYW1lXzQwMDJQYXJzZXIoKTsKLQkJfQotCQlyZXR1cm4gdGFza05vZGVUYXNrTm9kZU5hbWVfNDAwMlBhcnNlcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElQYXJzZXIgY3JlYXRlVGFza05vZGVUYXNrTm9kZU5hbWVfNDAwMlBhcnNlcigpIHsKLQkJRGlhZ3JhbVN0cnVjdHVyYWxGZWF0dXJlUGFyc2VyIHBhcnNlciA9IG5ldyBEaWFncmFtU3RydWN0dXJhbEZlYXR1cmVQYXJzZXIoCi0JCQkJTW9kZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXROYW1lZE5vZGVfTmFtZSgpKTsKLQkJcGFyc2VyLnNldFZpZXdQYXR0ZXJuKCJ7MH0iKTsKLQkJcGFyc2VyLnNldEVkaXRQYXR0ZXJuKCJ7MH0iKTsKLQkJcmV0dXJuIHBhcnNlcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBJUGFyc2VyIHdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlTmFtZV80MDAzUGFyc2VyOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgSVBhcnNlciBnZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZU5hbWVfNDAwM1BhcnNlcigpIHsKLQkJaWYgKHdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlTmFtZV80MDAzUGFyc2VyID09IG51bGwpIHsKLQkJCXdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlTmFtZV80MDAzUGFyc2VyID0gY3JlYXRlV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZVdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVOYW1lXzQwMDNQYXJzZXIoKTsKLQkJfQotCQlyZXR1cm4gd29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZVdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVOYW1lXzQwMDNQYXJzZXI7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJUGFyc2VyIGNyZWF0ZVdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlTmFtZV80MDAzUGFyc2VyKCkgewotCQlEaWFncmFtU3RydWN0dXJhbEZlYXR1cmVQYXJzZXIgcGFyc2VyID0gbmV3IERpYWdyYW1TdHJ1Y3R1cmFsRmVhdHVyZVBhcnNlcigKLQkJCQlNb2RlbFBhY2thZ2UuZUlOU1RBTkNFLmdldE5hbWVkTm9kZV9OYW1lKCkpOwotCQlwYXJzZXIuc2V0Vmlld1BhdHRlcm4oInswfSIpOwotCQlwYXJzZXIuc2V0RWRpdFBhdHRlcm4oInswfSIpOwotCQlyZXR1cm4gcGFyc2VyOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIElQYXJzZXIgbGlua0xpbmtOYW1lXzQwMDRQYXJzZXI7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBJUGFyc2VyIGdldExpbmtMaW5rTmFtZV80MDA0UGFyc2VyKCkgewotCQlpZiAobGlua0xpbmtOYW1lXzQwMDRQYXJzZXIgPT0gbnVsbCkgewotCQkJbGlua0xpbmtOYW1lXzQwMDRQYXJzZXIgPSBjcmVhdGVMaW5rTGlua05hbWVfNDAwNFBhcnNlcigpOwotCQl9Ci0JCXJldHVybiBsaW5rTGlua05hbWVfNDAwNFBhcnNlcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElQYXJzZXIgY3JlYXRlTGlua0xpbmtOYW1lXzQwMDRQYXJzZXIoKSB7Ci0JCURpYWdyYW1TdHJ1Y3R1cmFsRmVhdHVyZVBhcnNlciBwYXJzZXIgPSBuZXcgRGlhZ3JhbVN0cnVjdHVyYWxGZWF0dXJlUGFyc2VyKAotCQkJCU1vZGVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TGlua19OYW1lKCkpOwotCQlwYXJzZXIuc2V0Vmlld1BhdHRlcm4oInswfSIpOwotCQlwYXJzZXIuc2V0RWRpdFBhdHRlcm4oInswfSIpOwotCQlyZXR1cm4gcGFyc2VyOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSVBhcnNlciBnZXRQYXJzZXIoaW50IHZpc3VhbElEKSB7Ci0JCXN3aXRjaCAodmlzdWFsSUQpIHsKLQkJY2FzZSBSb2xlTm9kZU5hbWVFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQlyZXR1cm4gZ2V0Um9sZU5vZGVSb2xlTm9kZU5hbWVfNDAwMVBhcnNlcigpOwotCQljYXNlIFRhc2tOb2RlTmFtZUVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCXJldHVybiBnZXRUYXNrTm9kZVRhc2tOb2RlTmFtZV80MDAyUGFyc2VyKCk7Ci0JCWNhc2UgV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZU5hbWVFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQlyZXR1cm4gZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZVdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVOYW1lXzQwMDNQYXJzZXIoKTsKLQkJY2FzZSBMaW5rTmFtZUVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCXJldHVybiBnZXRMaW5rTGlua05hbWVfNDAwNFBhcnNlcigpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSVBhcnNlciBnZXRQYXJzZXIoSUFkYXB0YWJsZSBoaW50KSB7Ci0JCVN0cmluZyB2aWQgPSAoU3RyaW5nKSBoaW50LmdldEFkYXB0ZXIoU3RyaW5nLmNsYXNzKTsKLQkJaWYgKHZpZCAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gZ2V0UGFyc2VyKERpYWdyYW1WaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKHZpZCkpOwotCQl9Ci0JCVZpZXcgdmlldyA9IChWaWV3KSBoaW50LmdldEFkYXB0ZXIoVmlldy5jbGFzcyk7Ci0JCWlmICh2aWV3ICE9IG51bGwpIHsKLQkJCXJldHVybiBnZXRQYXJzZXIoRGlhZ3JhbVZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQodmlldykpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBwcm92aWRlcyhJT3BlcmF0aW9uIG9wZXJhdGlvbikgewotCQlpZiAob3BlcmF0aW9uIGluc3RhbmNlb2YgR2V0UGFyc2VyT3BlcmF0aW9uKSB7Ci0JCQlJQWRhcHRhYmxlIGhpbnQgPSAoKEdldFBhcnNlck9wZXJhdGlvbikgb3BlcmF0aW9uKS5nZXRIaW50KCk7Ci0JCQlpZiAoRGlhZ3JhbUVsZW1lbnRUeXBlcy5nZXRFbGVtZW50KGhpbnQpID09IG51bGwpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQlyZXR1cm4gZ2V0UGFyc2VyKGhpbnQpICE9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL3Byb3ZpZGVycy9EaWFncmFtUHJvcGVydHlQcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvcHJvdmlkZXJzL0RpYWdyYW1Qcm9wZXJ0eVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyMmNjMmYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvcHJvdmlkZXJzL0RpYWdyYW1Qcm9wZXJ0eVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQucHJvdmlkZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi5jb3JlLnNlcnZpY2UuSU9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucHJvcGVydGllcy5HZXRQcm9wZXJ0eVNvdXJjZU9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucHJvcGVydGllcy5JQ29tcG9zaXRlUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnByb3BlcnRpZXMuSVByb3BlcnRpZXNQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudWkucHJvcGVydGllcy5wcm92aWRlcnMuR2VuZXJpY0VNRlByb3BlcnRpZXNQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBhcnRzLkFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRQYXJ0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLnBhcnQuRGlhZ3JhbVZpc3VhbElEUmVnaXN0cnk7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRGlhZ3JhbVByb3BlcnR5UHJvdmlkZXIgZXh0ZW5kcyBHZW5lcmljRU1GUHJvcGVydGllc1Byb3ZpZGVyCi0JCWltcGxlbWVudHMgSVByb3BlcnRpZXNQcm92aWRlciB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gcHJvdmlkZXMoSU9wZXJhdGlvbiBvcGVyYXRpb24pIHsKLQkJaWYgKG9wZXJhdGlvbiBpbnN0YW5jZW9mIEdldFByb3BlcnR5U291cmNlT3BlcmF0aW9uKSB7Ci0JCQlPYmplY3Qgb2JqZWN0ID0gKChHZXRQcm9wZXJ0eVNvdXJjZU9wZXJhdGlvbikgb3BlcmF0aW9uKQotCQkJCQkuZ2V0T2JqZWN0KCk7Ci0JCQlyZXR1cm4gZ2V0U2VtYW50aWNFbGVtZW50KG9iamVjdCkgIT0gbnVsbDsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJQ29tcG9zaXRlUHJvcGVydHlTb3VyY2UgZ2V0UHJvcGVydHlTb3VyY2UoT2JqZWN0IG9iamVjdCkgewotCQlFT2JqZWN0IGVsZW1lbnQgPSBnZXRTZW1hbnRpY0VsZW1lbnQob2JqZWN0KTsKLQkJaWYgKGVsZW1lbnQgIT0gbnVsbCkgewotCQkJcmV0dXJuIHN1cGVyLmdldFByb3BlcnR5U291cmNlKGVsZW1lbnQpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRU9iamVjdCBnZXRTZW1hbnRpY0VsZW1lbnQoT2JqZWN0IG9iamVjdCkgewotCQlWaWV3IHZpZXcgPSBudWxsOwotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgVmlldykgewotCQkJdmlldyA9IChWaWV3KSBvYmplY3Q7Ci0JCX0gZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgRWRpdFBhcnQpIHsKLQkJCUVkaXRQYXJ0IGVkaXRQYXJ0ID0gKEVkaXRQYXJ0KSBvYmplY3Q7Ci0JCQlpZiAoZWRpdFBhcnQuZ2V0TW9kZWwoKSBpbnN0YW5jZW9mIFZpZXcpIHsKLQkJCQl2aWV3ID0gKFZpZXcpIGVkaXRQYXJ0LmdldE1vZGVsKCk7Ci0JCQl9Ci0JCX0KLQkJaWYgKHZpZXcgIT0gbnVsbAotCQkJCSYmIEFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRQYXJ0Lk1PREVMX0lECi0JCQkJCQkuZXF1YWxzKERpYWdyYW1WaXN1YWxJRFJlZ2lzdHJ5LmdldE1vZGVsSUQodmlldykpKSB7Ci0JCQlyZXR1cm4gdmlldy5nZXRFbGVtZW50KCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9wcm92aWRlcnMvRGlhZ3JhbVN0cnVjdHVyYWxGZWF0dXJlUGFyc2VyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9wcm92aWRlcnMvRGlhZ3JhbVN0cnVjdHVyYWxGZWF0dXJlUGFyc2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxOTI0Y2YuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvcHJvdmlkZXJzL0RpYWdyYW1TdHJ1Y3R1cmFsRmVhdHVyZVBhcnNlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5wcm92aWRlcnM7Ci0KLWltcG9ydCBqYXZhLnRleHQuRmllbGRQb3NpdGlvbjsKLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLnV0aWwuVHJhbnNhY3Rpb25VdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi5jb3JlLmNvbW1hbmQuSUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUuY29tbWFuZC5VbmV4ZWN1dGFibGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuSVBhcnNlckVkaXRTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5QYXJzZXJFZGl0U3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb21tYW5kcy5jb3JlLmNvbW1hbmQuQ29tcG9zaXRlVHJhbnNhY3Rpb25hbENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLnBhcnQuQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9yUGx1Z2luOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERpYWdyYW1TdHJ1Y3R1cmFsRmVhdHVyZVBhcnNlciBleHRlbmRzIERpYWdyYW1BYnN0cmFjdFBhcnNlciB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBNZXNzYWdlRm9ybWF0IERFRkFVTFRfUFJPQ0VTU09SID0gbmV3IE1lc3NhZ2VGb3JtYXQoCi0JCQkiezB9Iik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEaWFncmFtU3RydWN0dXJhbEZlYXR1cmVQYXJzZXIoRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUpIHsKLQkJdGhpcy5mZWF0dXJlID0gZmVhdHVyZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE1lc3NhZ2VGb3JtYXQgZ2V0Vmlld1Byb2Nlc3NvcigpIHsKLQkJTWVzc2FnZUZvcm1hdCBwcm9jZXNzb3IgPSBzdXBlci5nZXRWaWV3UHJvY2Vzc29yKCk7Ci0JCXJldHVybiBwcm9jZXNzb3IgPT0gbnVsbCA/IERFRkFVTFRfUFJPQ0VTU09SIDogcHJvY2Vzc29yOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTWVzc2FnZUZvcm1hdCBnZXRFZGl0UHJvY2Vzc29yKCkgewotCQlNZXNzYWdlRm9ybWF0IHByb2Nlc3NvciA9IHN1cGVyLmdldEVkaXRQcm9jZXNzb3IoKTsKLQkJcmV0dXJuIHByb2Nlc3NvciA9PSBudWxsID8gREVGQVVMVF9QUk9DRVNTT1IgOiBwcm9jZXNzb3I7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFT2JqZWN0IGdldERvbWFpbkVsZW1lbnQoRU9iamVjdCBlbGVtZW50KSB7Ci0JCXJldHVybiBlbGVtZW50OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFN0cmluZ0J5UGF0dGVybihJQWRhcHRhYmxlIGFkYXB0ZXIsIGludCBmbGFncywKLQkJCVN0cmluZyBwYXR0ZXJuLCBNZXNzYWdlRm9ybWF0IHByb2Nlc3NvcikgewotCQlFT2JqZWN0IGVsZW1lbnQgPSAoRU9iamVjdCkgYWRhcHRlci5nZXRBZGFwdGVyKEVPYmplY3QuY2xhc3MpOwotCQllbGVtZW50ID0gZ2V0RG9tYWluRWxlbWVudChlbGVtZW50KTsKLQkJcmV0dXJuIGdldFN0cmluZ0J5UGF0dGVybihlbGVtZW50LCBmZWF0dXJlLCBwcm9jZXNzb3IpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFN0cmluZ0J5UGF0dGVybihFT2JqZWN0IGVsZW1lbnQsCi0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgTWVzc2FnZUZvcm1hdCBwcm9jZXNzb3IpIHsKLQkJT2JqZWN0IHZhbHVlID0gZWxlbWVudCA9PSBudWxsID8gbnVsbCA6IGVsZW1lbnQuZUdldChmZWF0dXJlKTsKLQkJdmFsdWUgPSBnZXRWYWxpZFZhbHVlKGZlYXR1cmUsIHZhbHVlKTsKLQkJcmV0dXJuIHByb2Nlc3Nvci5mb3JtYXQobmV3IE9iamVjdFtdIHsgdmFsdWUgfSwgbmV3IFN0cmluZ0J1ZmZlcigpLAotCQkJCW5ldyBGaWVsZFBvc2l0aW9uKDApKS50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSVBhcnNlckVkaXRTdGF0dXMgdmFsaWRhdGVWYWx1ZXMoT2JqZWN0W10gdmFsdWVzKSB7Ci0JCWlmICh2YWx1ZXMubGVuZ3RoID4gMSkgewotCQkJcmV0dXJuIFBhcnNlckVkaXRTdGF0dXMuVU5FRElUQUJMRV9TVEFUVVM7Ci0JCX0KLQkJT2JqZWN0IHZhbHVlID0gdmFsdWVzLmxlbmd0aCA9PSAxID8gdmFsdWVzWzBdIDogbnVsbDsKLQkJdmFsdWUgPSBnZXRWYWxpZE5ld1ZhbHVlKGZlYXR1cmUsIHZhbHVlKTsKLQkJaWYgKHZhbHVlIGluc3RhbmNlb2YgSW52YWxpZFZhbHVlKSB7Ci0JCQlyZXR1cm4gbmV3IFBhcnNlckVkaXRTdGF0dXMoQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9yUGx1Z2luLklELAotCQkJCQlJUGFyc2VyRWRpdFN0YXR1cy5VTkVESVRBQkxFLCB2YWx1ZS50b1N0cmluZygpKTsKLQkJfQotCQlyZXR1cm4gUGFyc2VyRWRpdFN0YXR1cy5FRElUQUJMRV9TVEFUVVM7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJQ29tbWFuZCBnZXRQYXJzZUNvbW1hbmQoSUFkYXB0YWJsZSBhZGFwdGVyLCBPYmplY3RbXSB2YWx1ZXMpIHsKLQkJRU9iamVjdCBlbGVtZW50ID0gKEVPYmplY3QpIGFkYXB0ZXIuZ2V0QWRhcHRlcihFT2JqZWN0LmNsYXNzKTsKLQkJZWxlbWVudCA9IGdldERvbWFpbkVsZW1lbnQoZWxlbWVudCk7Ci0JCWlmIChlbGVtZW50ID09IG51bGwpIHsKLQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQl9Ci0JCVRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIGVkaXRpbmdEb21haW4gPSBUcmFuc2FjdGlvblV0aWwKLQkJCQkuZ2V0RWRpdGluZ0RvbWFpbihlbGVtZW50KTsKLQkJaWYgKGVkaXRpbmdEb21haW4gPT0gbnVsbCkgewotCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCX0KLQkJT2JqZWN0IHZhbHVlID0gdmFsdWVzLmxlbmd0aCA9PSAxID8gdmFsdWVzWzBdIDogbnVsbDsKLQkJSUNvbW1hbmQgY29tbWFuZCA9IGdldE1vZGlmaWNhdGlvbkNvbW1hbmQoZWxlbWVudCwgZmVhdHVyZSwgdmFsdWUpOwotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZVRyYW5zYWN0aW9uYWxDb21tYW5kKGVkaXRpbmdEb21haW4sIGNvbW1hbmQKLQkJCQkuZ2V0TGFiZWwoKSwgQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChjb21tYW5kKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQWZmZWN0aW5nRXZlbnQoT2JqZWN0IGV2ZW50LCBpbnQgZmxhZ3MpIHsKLQkJaWYgKGV2ZW50IGluc3RhbmNlb2YgTm90aWZpY2F0aW9uKSB7Ci0JCQlyZXR1cm4gaXNBZmZlY3RpbmdGZWF0dXJlKCgoTm90aWZpY2F0aW9uKSBldmVudCkuZ2V0RmVhdHVyZSgpKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzQWZmZWN0aW5nRmVhdHVyZShPYmplY3QgZXZlbnRGZWF0dXJlKSB7Ci0JCXJldHVybiBmZWF0dXJlID09IGV2ZW50RmVhdHVyZTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9wcm92aWRlcnMvRGlhZ3JhbVN0cnVjdHVyYWxGZWF0dXJlc1BhcnNlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvcHJvdmlkZXJzL0RpYWdyYW1TdHJ1Y3R1cmFsRmVhdHVyZXNQYXJzZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODc4NWM0NS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9wcm92aWRlcnMvRGlhZ3JhbVN0cnVjdHVyYWxGZWF0dXJlc1BhcnNlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5wcm92aWRlcnM7Ci0KLWltcG9ydCBqYXZhLnRleHQuRmllbGRQb3NpdGlvbjsKLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5UcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24udXRpbC5UcmFuc2FjdGlvblV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUuY29tbWFuZC5JQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS5jb21tYW5kLlVuZXhlY3V0YWJsZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5JUGFyc2VyRWRpdFN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLlBhcnNlckVkaXRTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvbW1hbmRzLmNvcmUuY29tbWFuZC5Db21wb3NpdGVUcmFuc2FjdGlvbmFsQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQucGFydC5BY3Rpdml0eURldGFpbERpYWdyYW1FZGl0b3JQbHVnaW47Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRGlhZ3JhbVN0cnVjdHVyYWxGZWF0dXJlc1BhcnNlciBleHRlbmRzIERpYWdyYW1BYnN0cmFjdFBhcnNlciB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBMaXN0IGZlYXR1cmVzOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEaWFncmFtU3RydWN0dXJhbEZlYXR1cmVzUGFyc2VyKExpc3QgZmVhdHVyZXMpIHsKLQkJdGhpcy5mZWF0dXJlcyA9IGZlYXR1cmVzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFN0cmluZ0J5UGF0dGVybihJQWRhcHRhYmxlIGFkYXB0ZXIsIGludCBmbGFncywKLQkJCVN0cmluZyBwYXR0ZXJuLCBNZXNzYWdlRm9ybWF0IHByb2Nlc3NvcikgewotCQlFT2JqZWN0IGVsZW1lbnQgPSAoRU9iamVjdCkgYWRhcHRlci5nZXRBZGFwdGVyKEVPYmplY3QuY2xhc3MpOwotCQlMaXN0IHZhbHVlcyA9IG5ldyBBcnJheUxpc3QoZmVhdHVyZXMuc2l6ZSgpKTsKLQkJZm9yIChJdGVyYXRvciBpdCA9IGZlYXR1cmVzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgaXQubmV4dCgpOwotCQkJT2JqZWN0IHZhbHVlID0gZWxlbWVudC5lR2V0KGZlYXR1cmUpOwotCQkJdmFsdWUgPSBnZXRWYWxpZFZhbHVlKGZlYXR1cmUsIHZhbHVlKTsKLQkJCXZhbHVlcy5hZGQodmFsdWUpOwotCQl9Ci0JCXJldHVybiBwcm9jZXNzb3IuZm9ybWF0KHZhbHVlcy50b0FycmF5KG5ldyBPYmplY3RbdmFsdWVzLnNpemUoKV0pLAotCQkJCW5ldyBTdHJpbmdCdWZmZXIoKSwgbmV3IEZpZWxkUG9zaXRpb24oMCkpLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJUGFyc2VyRWRpdFN0YXR1cyB2YWxpZGF0ZVZhbHVlcyhPYmplY3RbXSB2YWx1ZXMpIHsKLQkJaWYgKHZhbHVlcy5sZW5ndGggIT0gZmVhdHVyZXMuc2l6ZSgpKSB7Ci0JCQlyZXR1cm4gUGFyc2VyRWRpdFN0YXR1cy5VTkVESVRBQkxFX1NUQVRVUzsKLQkJfQotCQlmb3IgKGludCBpID0gMDsgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKykgewotCQkJT2JqZWN0IHZhbHVlID0gZ2V0VmFsaWROZXdWYWx1ZSgoRVN0cnVjdHVyYWxGZWF0dXJlKSBmZWF0dXJlcwotCQkJCQkuZ2V0KGkpLCB2YWx1ZXNbaV0pOwotCQkJaWYgKHZhbHVlIGluc3RhbmNlb2YgSW52YWxpZFZhbHVlKSB7Ci0JCQkJcmV0dXJuIG5ldyBQYXJzZXJFZGl0U3RhdHVzKAotCQkJCQkJQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9yUGx1Z2luLklELAotCQkJCQkJSVBhcnNlckVkaXRTdGF0dXMuVU5FRElUQUJMRSwgdmFsdWUudG9TdHJpbmcoKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIFBhcnNlckVkaXRTdGF0dXMuRURJVEFCTEVfU1RBVFVTOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSUNvbW1hbmQgZ2V0UGFyc2VDb21tYW5kKElBZGFwdGFibGUgYWRhcHRlciwgT2JqZWN0W10gdmFsdWVzKSB7Ci0JCUVPYmplY3QgZWxlbWVudCA9IChFT2JqZWN0KSBhZGFwdGVyLmdldEFkYXB0ZXIoRU9iamVjdC5jbGFzcyk7Ci0JCWlmIChlbGVtZW50ID09IG51bGwpIHsKLQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQl9Ci0JCVRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIGVkaXRpbmdEb21haW4gPSBUcmFuc2FjdGlvblV0aWwKLQkJCQkuZ2V0RWRpdGluZ0RvbWFpbihlbGVtZW50KTsKLQkJaWYgKGVkaXRpbmdEb21haW4gPT0gbnVsbCkgewotCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCX0KLQkJQ29tcG9zaXRlVHJhbnNhY3Rpb25hbENvbW1hbmQgY29tbWFuZCA9IG5ldyBDb21wb3NpdGVUcmFuc2FjdGlvbmFsQ29tbWFuZCgKLQkJCQllZGl0aW5nRG9tYWluLCAiU2V0IFZhbHVlcyIpOyAvLyROT04tTkxTLTEkCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgdmFsdWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IChFU3RydWN0dXJhbEZlYXR1cmUpIGZlYXR1cmVzLmdldChpKTsKLQkJCWNvbW1hbmQKLQkJCQkJLmNvbXBvc2UoZ2V0TW9kaWZpY2F0aW9uQ29tbWFuZChlbGVtZW50LCBmZWF0dXJlLCB2YWx1ZXNbaV0pKTsKLQkJfQotCQlyZXR1cm4gY29tbWFuZDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNBZmZlY3RpbmdFdmVudChPYmplY3QgZXZlbnQsIGludCBmbGFncykgewotCQlpZiAoZXZlbnQgaW5zdGFuY2VvZiBOb3RpZmljYXRpb24pIHsKLQkJCU9iamVjdCBmZWF0dXJlID0gKChOb3RpZmljYXRpb24pIGV2ZW50KS5nZXRGZWF0dXJlKCk7Ci0JCQlpZiAoZmVhdHVyZXMuY29udGFpbnMoZmVhdHVyZSkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvcHJvdmlkZXJzL0RpYWdyYW1WaWV3UHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL3Byb3ZpZGVycy9EaWFncmFtVmlld1Byb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkODJiMDguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvcHJvdmlkZXJzL0RpYWdyYW1WaWV3UHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQucHJvdmlkZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUucHJvdmlkZXJzLkFic3RyYWN0Vmlld1Byb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5JRWxlbWVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucGFydHMuQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucGFydHMuTGlua0VkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBhcnRzLkxpbmtOYW1lRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucGFydHMuUm9sZU5vZGVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wYXJ0cy5Sb2xlTm9kZU5hbWVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wYXJ0cy5Sb2xlVGFza0NvbXBvc2l0ZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBhcnRzLlJvbGVUYXNrQ29tcG9zaXRlUm9sZVRhc2tDb21wYXJ0bWVudEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBhcnRzLlRhc2tOb2RlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucGFydHMuVGFza05vZGVOYW1lRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucGFydHMuV29ya1Byb2R1Y3RDb21wb3NpdGVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wYXJ0cy5Xb3JrUHJvZHVjdENvbXBvc2l0ZVdvcmtQcm9kdWN0Q29tcGFydG1lbnRFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wYXJ0cy5Xb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlRWRpdFBhcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wYXJ0cy5Xb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlTmFtZUVkaXRQYXJ0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLnBhcnQuRGlhZ3JhbVZpc3VhbElEUmVnaXN0cnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQudmlldy5mYWN0b3JpZXMuQWN0aXZpdHlEZXRhaWxEaWFncmFtVmlld0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLnZpZXcuZmFjdG9yaWVzLkxpbmtOYW1lVmlld0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLnZpZXcuZmFjdG9yaWVzLkxpbmtWaWV3RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQudmlldy5mYWN0b3JpZXMuUm9sZU5vZGVOYW1lVmlld0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLnZpZXcuZmFjdG9yaWVzLlJvbGVOb2RlVmlld0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLnZpZXcuZmFjdG9yaWVzLlJvbGVUYXNrQ29tcG9zaXRlUm9sZVRhc2tDb21wYXJ0bWVudFZpZXdGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC52aWV3LmZhY3Rvcmllcy5Sb2xlVGFza0NvbXBvc2l0ZVZpZXdGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC52aWV3LmZhY3Rvcmllcy5UYXNrTm9kZU5hbWVWaWV3RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQudmlldy5mYWN0b3JpZXMuVGFza05vZGVWaWV3RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQudmlldy5mYWN0b3JpZXMuV29ya1Byb2R1Y3RDb21wb3NpdGVWaWV3RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQudmlldy5mYWN0b3JpZXMuV29ya1Byb2R1Y3RDb21wb3NpdGVXb3JrUHJvZHVjdENvbXBhcnRtZW50Vmlld0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLnZpZXcuZmFjdG9yaWVzLldvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVOYW1lVmlld0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLnZpZXcuZmFjdG9yaWVzLldvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVWaWV3RmFjdG9yeTsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEaWFncmFtVmlld1Byb3ZpZGVyIGV4dGVuZHMgQWJzdHJhY3RWaWV3UHJvdmlkZXIgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDbGFzcyBnZXREaWFncmFtVmlld0NsYXNzKElBZGFwdGFibGUgc2VtYW50aWNBZGFwdGVyLAotCQkJU3RyaW5nIGRpYWdyYW1LaW5kKSB7Ci0JCUVPYmplY3Qgc2VtYW50aWNFbGVtZW50ID0gZ2V0U2VtYW50aWNFbGVtZW50KHNlbWFudGljQWRhcHRlcik7Ci0JCWlmIChBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0UGFydC5NT0RFTF9JRC5lcXVhbHMoZGlhZ3JhbUtpbmQpCi0JCQkJJiYgRGlhZ3JhbVZpc3VhbElEUmVnaXN0cnkuZ2V0RGlhZ3JhbVZpc3VhbElEKHNlbWFudGljRWxlbWVudCkgIT0gLTEpIHsKLQkJCXJldHVybiBBY3Rpdml0eURldGFpbERpYWdyYW1WaWV3RmFjdG9yeS5jbGFzczsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENsYXNzIGdldE5vZGVWaWV3Q2xhc3MoSUFkYXB0YWJsZSBzZW1hbnRpY0FkYXB0ZXIsCi0JCQlWaWV3IGNvbnRhaW5lclZpZXcsIFN0cmluZyBzZW1hbnRpY0hpbnQpIHsKLQkJaWYgKGNvbnRhaW5lclZpZXcgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJSUVsZW1lbnRUeXBlIGVsZW1lbnRUeXBlID0gZ2V0U2VtYW50aWNFbGVtZW50VHlwZShzZW1hbnRpY0FkYXB0ZXIpOwotCQlpZiAoZWxlbWVudFR5cGUgIT0gbnVsbAotCQkJCSYmICFEaWFncmFtRWxlbWVudFR5cGVzLmlzS25vd25FbGVtZW50VHlwZShlbGVtZW50VHlwZSkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCUVDbGFzcyBzZW1hbnRpY1R5cGUgPSBnZXRTZW1hbnRpY0VDbGFzcyhzZW1hbnRpY0FkYXB0ZXIpOwotCQlFT2JqZWN0IHNlbWFudGljRWxlbWVudCA9IGdldFNlbWFudGljRWxlbWVudChzZW1hbnRpY0FkYXB0ZXIpOwotCQlpbnQgbm9kZVZJRCA9IERpYWdyYW1WaXN1YWxJRFJlZ2lzdHJ5LmdldE5vZGVWaXN1YWxJRChjb250YWluZXJWaWV3LAotCQkJCXNlbWFudGljRWxlbWVudCwgc2VtYW50aWNUeXBlLCBzZW1hbnRpY0hpbnQpOwotCQlzd2l0Y2ggKG5vZGVWSUQpIHsKLQkJY2FzZSBSb2xlVGFza0NvbXBvc2l0ZUVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCXJldHVybiBSb2xlVGFza0NvbXBvc2l0ZVZpZXdGYWN0b3J5LmNsYXNzOwotCQljYXNlIFdvcmtQcm9kdWN0Q29tcG9zaXRlRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJcmV0dXJuIFdvcmtQcm9kdWN0Q29tcG9zaXRlVmlld0ZhY3RvcnkuY2xhc3M7Ci0JCWNhc2UgUm9sZU5vZGVFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQlyZXR1cm4gUm9sZU5vZGVWaWV3RmFjdG9yeS5jbGFzczsKLQkJY2FzZSBSb2xlTm9kZU5hbWVFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQlyZXR1cm4gUm9sZU5vZGVOYW1lVmlld0ZhY3RvcnkuY2xhc3M7Ci0JCWNhc2UgVGFza05vZGVFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQlyZXR1cm4gVGFza05vZGVWaWV3RmFjdG9yeS5jbGFzczsKLQkJY2FzZSBUYXNrTm9kZU5hbWVFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQlyZXR1cm4gVGFza05vZGVOYW1lVmlld0ZhY3RvcnkuY2xhc3M7Ci0JCWNhc2UgV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZUVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCXJldHVybiBXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlVmlld0ZhY3RvcnkuY2xhc3M7Ci0JCWNhc2UgV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZU5hbWVFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQlyZXR1cm4gV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZU5hbWVWaWV3RmFjdG9yeS5jbGFzczsKLQkJY2FzZSBSb2xlVGFza0NvbXBvc2l0ZVJvbGVUYXNrQ29tcGFydG1lbnRFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQlyZXR1cm4gUm9sZVRhc2tDb21wb3NpdGVSb2xlVGFza0NvbXBhcnRtZW50Vmlld0ZhY3RvcnkuY2xhc3M7Ci0JCWNhc2UgV29ya1Byb2R1Y3RDb21wb3NpdGVXb3JrUHJvZHVjdENvbXBhcnRtZW50RWRpdFBhcnQuVklTVUFMX0lEOgotCQkJcmV0dXJuIFdvcmtQcm9kdWN0Q29tcG9zaXRlV29ya1Byb2R1Y3RDb21wYXJ0bWVudFZpZXdGYWN0b3J5LmNsYXNzOwotCQljYXNlIExpbmtOYW1lRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJcmV0dXJuIExpbmtOYW1lVmlld0ZhY3RvcnkuY2xhc3M7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDbGFzcyBnZXRFZGdlVmlld0NsYXNzKElBZGFwdGFibGUgc2VtYW50aWNBZGFwdGVyLAotCQkJVmlldyBjb250YWluZXJWaWV3LCBTdHJpbmcgc2VtYW50aWNIaW50KSB7Ci0JCUlFbGVtZW50VHlwZSBlbGVtZW50VHlwZSA9IGdldFNlbWFudGljRWxlbWVudFR5cGUoc2VtYW50aWNBZGFwdGVyKTsKLQkJaWYgKGVsZW1lbnRUeXBlICE9IG51bGwKLQkJCQkmJiAhRGlhZ3JhbUVsZW1lbnRUeXBlcy5pc0tub3duRWxlbWVudFR5cGUoZWxlbWVudFR5cGUpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlFQ2xhc3Mgc2VtYW50aWNUeXBlID0gZ2V0U2VtYW50aWNFQ2xhc3Moc2VtYW50aWNBZGFwdGVyKTsKLQkJaWYgKHNlbWFudGljVHlwZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlFT2JqZWN0IHNlbWFudGljRWxlbWVudCA9IGdldFNlbWFudGljRWxlbWVudChzZW1hbnRpY0FkYXB0ZXIpOwotCQlpbnQgbGlua1ZJRCA9IERpYWdyYW1WaXN1YWxJRFJlZ2lzdHJ5LmdldExpbmtXaXRoQ2xhc3NWaXN1YWxJRCgKLQkJCQlzZW1hbnRpY0VsZW1lbnQsIHNlbWFudGljVHlwZSk7Ci0JCXN3aXRjaCAobGlua1ZJRCkgewotCQljYXNlIExpbmtFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQlyZXR1cm4gTGlua1ZpZXdGYWN0b3J5LmNsYXNzOwotCQl9Ci0JCXJldHVybiBnZXRVbnJlY29nbml6ZWRDb25uZWN0b3JWaWV3Q2xhc3Moc2VtYW50aWNBZGFwdGVyLAotCQkJCWNvbnRhaW5lclZpZXcsIHNlbWFudGljSGludCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgSUVsZW1lbnRUeXBlIGdldFNlbWFudGljRWxlbWVudFR5cGUoSUFkYXB0YWJsZSBzZW1hbnRpY0FkYXB0ZXIpIHsKLQkJaWYgKHNlbWFudGljQWRhcHRlciA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gKElFbGVtZW50VHlwZSkgc2VtYW50aWNBZGFwdGVyLmdldEFkYXB0ZXIoSUVsZW1lbnRUeXBlLmNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBDbGFzcyBnZXRVbnJlY29nbml6ZWRDb25uZWN0b3JWaWV3Q2xhc3MoSUFkYXB0YWJsZSBzZW1hbnRpY0FkYXB0ZXIsCi0JCQlWaWV3IGNvbnRhaW5lclZpZXcsIFN0cmluZyBzZW1hbnRpY0hpbnQpIHsKLQkJLy8gSGFuZGxlIHVucmVjb2duaXplZCBjaGlsZCBub2RlIGNsYXNzZXMgaGVyZQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL3Byb3ZpZGVycy9FbGVtZW50SW5pdGlhbGl6ZXJzLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9wcm92aWRlcnMvRWxlbWVudEluaXRpYWxpemVycy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNTVmNzg0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL3Byb3ZpZGVycy9FbGVtZW50SW5pdGlhbGl6ZXJzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5wcm92aWRlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQucGFydC5BY3Rpdml0eURldGFpbERpYWdyYW1FZGl0b3JQbHVnaW47Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRWxlbWVudEluaXRpYWxpemVycyB7Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9zZXJ2aWNlL0RpYWdyYW1SZXNldFNlcnZpY2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL3NlcnZpY2UvRGlhZ3JhbVJlc2V0U2VydmljZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZDNiYjNmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL3NlcnZpY2UvRGlhZ3JhbVJlc2V0U2VydmljZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzk4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5zZXJ2aWNlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuUG9zaXRpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuVG9vbGJhckxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuRGltZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5UcmFuc2FjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uaW1wbC5JbnRlcm5hbFRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBhcnRzLkFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBhcnRzLlJvbGVOb2RlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucGFydHMuUm9sZVRhc2tDb21wb3NpdGVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wYXJ0cy5UYXNrTm9kZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBhcnRzLldvcmtQcm9kdWN0Q29tcG9zaXRlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5jb21tYW5kcy5DaGFuZ2VCb3VuZHNDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUudXRpbC5EaWFncmFtQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5EZWZhdWx0RWRpdERvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5HcmFwaGljYWxWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmRTdGFjazsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBhcnRzLkFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnVpLmFjdGlvbnMuQWN0aW9uUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLnV0aWwuVmlld1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuQ29ubmVjdGlvbk5vZGVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5EaWFncmFtRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLlNoYXBlTm9kZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLkZpZ3VyZVV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZ2VmLnVpLmZpZ3VyZXMuTm9kZUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vdGF0aW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udDsKLQotLyoqCi0gKiBTZXJ2aWNlIGNsYXNzIGZvciByZXNldCB0aGUgQWN0aXZpdHkgRGV0YWlsIERpYWdyYW0uCi0gKiBDb2RlIG1pZ3JhdGVkIGZyb20gb2xkIGRpYWdyYW0gY29kZS4gICAKLSAqIAotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMgotICoqLwotcHVibGljIGNsYXNzIERpYWdyYW1SZXNldFNlcnZpY2UgewotCi0JcHJpdmF0ZSBEZWZhdWx0RWRpdERvbWFpbiBlZGl0RG9tYWluOwotCi0JcHJpdmF0ZSBHcmFwaGljYWxWaWV3ZXIgZ3JhcGhpY2FsVmlld2VyOwotCi0JcHJpdmF0ZSBBY3Rpb25SZWdpc3RyeSBhY3Rpb25SZWdpc3RyeTsKLQotCXByaXZhdGUgSW50ZXJuYWxUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiB0cmFuc2FjdGlvbkRvbWFpbjsKLQkKLQlpbnQgZGVsdGEgPSAwOwotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBJTUdfSEVJR0hUID0gMzI7Ci0KLQlwdWJsaWMgRGlhZ3JhbVJlc2V0U2VydmljZShJbnRlcm5hbFRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIHRyYW5zYWN0aW9uRG9tYWluLCAKLQkJCUdyYXBoaWNhbFZpZXdlciBncmFwaGljYWxWaWV3ZXIsIERlZmF1bHRFZGl0RG9tYWluIGVkaXREb21haW4sCi0JCQlBY3Rpb25SZWdpc3RyeSBhY3Rpb25SZWdpc3RyeSkgewotCQl0aGlzLnRyYW5zYWN0aW9uRG9tYWluID0gdHJhbnNhY3Rpb25Eb21haW47Ci0JCXRoaXMuZ3JhcGhpY2FsVmlld2VyID0gZ3JhcGhpY2FsVmlld2VyOwotCQl0aGlzLmVkaXREb21haW4gPSBlZGl0RG9tYWluOwotCQl0aGlzLmFjdGlvblJlZ2lzdHJ5ID0gYWN0aW9uUmVnaXN0cnk7Ci0JfQotCi0JcHJpdmF0ZSBHcmFwaGljYWxWaWV3ZXIgZ2V0R3JhcGhpY2FsVmlld2VyKCkgewotCQlyZXR1cm4gZ3JhcGhpY2FsVmlld2VyOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGNvbW1hbmQgc3RhY2suCi0JICogCi0JICogQHJldHVybiB0aGUgY29tbWFuZCBzdGFjawotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kU3RhY2sgZ2V0Q29tbWFuZFN0YWNrKCkgewotCQlyZXR1cm4gZ2V0RWRpdERvbWFpbigpLmdldENvbW1hbmRTdGFjaygpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGVkaXQgZG9tYWluLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGVkaXQgZG9tYWluCi0JICovCi0JcHJvdGVjdGVkIERlZmF1bHRFZGl0RG9tYWluIGdldEVkaXREb21haW4oKSB7Ci0JCXJldHVybiBlZGl0RG9tYWluOwotCX0KLQotCS8qKgotCSAqIExhemlseSBjcmVhdGVzIGFuZCByZXR1cm5zIHRoZSBhY3Rpb24gcmVnaXN0cnkuCi0JICogCi0JICogQHJldHVybiB0aGUgYWN0aW9uIHJlZ2lzdHJ5Ci0JICovCi0JcHJvdGVjdGVkIEFjdGlvblJlZ2lzdHJ5IGdldEFjdGlvblJlZ2lzdHJ5KCkgewotCQlyZXR1cm4gYWN0aW9uUmVnaXN0cnk7Ci0JfQotCi0JLyoqCi0JICogTWV0aG9kIHVzZWQgb25seSBpbiBBY3Rpdml0eURldGFpbERpYWdyYW0gb3IgYW55IGRpYWdyYW0gbmVlZCBhdXRvLWxheW91dC4KLQkgKiBNZXRob2Qgd2lsbCB2ZXJpZnkgcmVjZW50bHkgYWRkZWQgZWRpdHBhcnRzIGluIHRoZSBBY3Rpdml0eWRldGFpbGRpYWdyYW0gZWRpdHBhcnQKLQkgKiBpbmRpcmVjdGx5IGZyb20gV29ya0JyZWFrZG93blN0cnVjdHVyZSAobWVhbnMgYW55IGRlc2NyaXB0b3JzIGNyZWF0ZWQgaW4gd2JzLCBjb3JyZXNwb25kaW5nCi0JICogRWRpdFBhcnQgd2lsbCBnZXQgY3JlYXRlZCBpbiBBY3Rpdml0eURldGFpbERpYWdyYW0gVmlld2VyKSBhbmQgZG9lcyBhdXRvLWxheW91dAotCSAqIGFsbCB0aGUgbmV3IGFkZGVkIGVkaXRwYXJ0cyBhbmQgZXhpc3Rpbmcgb25lcy4gCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgY2xlYW5VcERpYWdyYW0oKSB7Ci0JCWlmIChnZXRHcmFwaGljYWxWaWV3ZXIoKS5nZXRDb250ZW50cygpIGluc3RhbmNlb2YgQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdFBhcnQpIHsKLQkJCUFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRQYXJ0IGRlcCA9IChBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0UGFydCkgZ2V0R3JhcGhpY2FsVmlld2VyKCkKLQkJCQkJLmdldENvbnRlbnRzKCk7Ci0JCQlMaXN0IGNoaWxkcmVuID0gZGVwLmdldFJlY2VudGx5QWRkZWRQYXJ0cygpOwotCQkJCi0JCQkvLyBJZiBhbnkgb2JsaXF1ZSBsaW5rcyByZWN0aWZ5IHRoZW0gdG8gc3RyYWlnaHQuIAotLy8JCQlhbnlPYmxpcXVlTGlua3MoZGVwLCBjaGlsZHJlbik7Ci0JCQkKLQkJCWlmICghY2hpbGRyZW4uaXNFbXB0eSgpKSB7Ci0JCQkJQ29tcGFyYXRvcjxPYmplY3Q+IGNvbXBhcmF0b3IgPSBuZXcgQ29tcGFyYXRvcjxPYmplY3Q+KCkgewotCi0JCQkJCXB1YmxpYyBpbnQgY29tcGFyZShPYmplY3QgYXJnMCwgT2JqZWN0IGFyZzEpIHsKLQkJCQkJCWludCByYyA9IDA7Ci0JCQkJCQlpZiAoYXJnMCBpbnN0YW5jZW9mIFJvbGVUYXNrQ29tcG9zaXRlRWRpdFBhcnQpIHsKLQkJCQkJCQlpZiAoIShhcmcxIGluc3RhbmNlb2YgUm9sZVRhc2tDb21wb3NpdGVFZGl0UGFydCkpCi0JCQkJCQkJCXJjID0gLTE7Ci0JCQkJCQl9IGVsc2UgaWYgKGFyZzEgaW5zdGFuY2VvZiBSb2xlVGFza0NvbXBvc2l0ZUVkaXRQYXJ0KQotCQkJCQkJCXJjID0gMTsKLQkJCQkJCXJldHVybiByYzsKLQkJCQkJfQotCQkJCQkKLQkJCQl9OwotCi0JCQkJT2JqZWN0W10gYXJyYXkgPSBjaGlsZHJlbi50b0FycmF5KCk7Ci0JCQkJQXJyYXlzLnNvcnQoYXJyYXksIGNvbXBhcmF0b3IpOwotCQkJCWZvciAoaW50IGEgPSAwOyBhIDwgYXJyYXkubGVuZ3RoOyBhKyspIHsKLQkJCQkJQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCBlcCA9IChBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0KSBhcnJheVthXTsKLQkJCQkJYWRqdXN0U2l6ZShlcCk7Ci0JCQkJfQotCQkJCQotCQkJCS8vIGZvcmNlIHJlbGF5b3V0IGFmdGVyIHNpemUgYWRqdXN0bWVudAotCQkJCS8vCi0JCQkJZGVwLmdldFZpZXdwb3J0KCkudmFsaWRhdGUoKTsKLQkJCQkKLQkJCQlmb3IgKGludCBiID0gMDsgYiA8IGFycmF5Lmxlbmd0aDsgYisrKSB7Ci0JCQkJCUFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQgZXAgPSAoQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCkgYXJyYXlbYl07Ci0JCQkJCWNsZWFuVXAoZXApOwotCQkJCX0KLQkJCQlmb3IgKGludCBjID0gMDsgYyA8IGFycmF5Lmxlbmd0aDsgYysrKSB7Ci0JCQkJCUFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQgZXAgPSAoQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCkgYXJyYXlbY107Ci0JCQkJCXJlZHVjZUxpbmtMZW5ndGgoZXApOwotCQkJCX0KLS8vCQkJCWZvciAoaW50IGMgPSAwOyBjIDwgYXJyYXkubGVuZ3RoOyBjKyspIHsKLS8vCQkJCQlBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0IGVwID0gKEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQpIGFycmF5W2NdOwotLy8JCQkJCWlmKGVwIGluc3RhbmNlb2YgUm9sZVRhc2tDb21wb3NpdGVFZGl0UGFydCl7Ci0vLwkJCQkJCXJlc2V0U2l6ZXMoZXAsIGVwKTsKLS8vCQkJCQl9Ci0vLwkJCQl9Ci0JCQkJcGFja0RpYWdyYW0oKTsKLQkJCQlkZXAucmVmcmVzaCgpOwotCQkJCWRlcC5jbGVhclJlY2VudGx5QWRkZWRQYXJ0cygpOwotCQkJCWdldEdyYXBoaWNhbFZpZXdlcigpLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbigpKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGRvZXMgYSB2ZXJ0aWNhbCBhbGlnbm1lbnQgb2YgYWxsIG5vZGVzIHdpdGggbGlua3MKLQkgKi8KLQlwcml2YXRlIHZvaWQgY2xlYW5VcChBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0IGVwKSB7Ci0JCWlmICghKGVwIGluc3RhbmNlb2YgV29ya1Byb2R1Y3RDb21wb3NpdGVFZGl0UGFydCkpIHsKLQkJCUxpc3Qgc291cmNlTGlua3MgPSBlcC5nZXRTb3VyY2VDb25uZWN0aW9ucygpOwotCQkJaWYgKHNvdXJjZUxpbmtzLnNpemUoKSA+IDApIHsKLQkJCQlmb3IgKGludCBiID0gMDsgYiA8IHNvdXJjZUxpbmtzLnNpemUoKTsgYisrKSB7Ci0JCQkJCUNvbm5lY3Rpb25Ob2RlRWRpdFBhcnQgbGluayA9IChDb25uZWN0aW9uTm9kZUVkaXRQYXJ0KSBzb3VyY2VMaW5rcy5nZXQoYik7Ci0JCQkJCUFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQgdGFyZ2V0ID0gKEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQpIGxpbmsKLQkJCQkJCQkuZ2V0VGFyZ2V0KCk7Ci0JCQkJCWludCB3ID0gdGFyZ2V0LmdldEZpZ3VyZSgpLmdldEJvdW5kcygpLndpZHRoOwotCQkJCQlpbnQgZXcgPSBlcC5nZXRGaWd1cmUoKS5nZXRQcmVmZXJyZWRTaXplKCkud2lkdGg7Ci0JCQkJCWlmICh3IDwgZXcpIHsKLQkJCQkJCUNvbW1hbmQgYyA9IG5ldyBDaGFuZ2VCb3VuZHNDb21tYW5kKHRyYW5zYWN0aW9uRG9tYWluLCAoKE5vZGUpIGVwCi0JCQkJCQkJCS5nZXRNb2RlbCgpKSwgdGFyZ2V0LmdldEZpZ3VyZSgpLmdldEJvdW5kcygpCi0JCQkJCQkJCS5nZXRMb2NhdGlvbigpLCB3LCB0YXJnZXQuZ2V0RmlndXJlKCkuZ2V0UHJlZmVycmVkU2l6ZSgpLmhlaWdodCk7Ci0JCQkJCQlnZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKGMpOwotCQkJCQkJaW50IGggPSB0YXJnZXQuZ2V0RmlndXJlKCkuZ2V0UHJlZmVycmVkU2l6ZSgpLmhlaWdodDsKLQkJCQkJCXRhcmdldC5nZXRGaWd1cmUoKQotCQkJCQkJCQkuc2V0UHJlZmVycmVkU2l6ZShuZXcgRGltZW5zaW9uKHcsIGgpKTsKLQkJCQkJCXRhcmdldC5nZXRGaWd1cmUoKS5zZXRTaXplKG5ldyBEaW1lbnNpb24odywgaCkpOwotCQkJCQl9Ci0JCQkJCUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJbGlzdC5hZGQoZXApOwotCQkJCQlsaXN0LmFkZCh0YXJnZXQpOwotCQkJCQl2ZXJ0aWNhbEFsaWduVG9GaXJzdFNlbGVjdGVkKGxpc3QpOwotCQkJCX0KLQkJCX0KLQkJCUxpc3QgdGFyZ2V0TGlua3MgPSBlcC5nZXRUYXJnZXRDb25uZWN0aW9ucygpOwotCQkJaWYgKHRhcmdldExpbmtzLnNpemUoKSA+IDApIHsKLQkJCQlmb3IgKGludCBiID0gMDsgYiA8IHRhcmdldExpbmtzLnNpemUoKTsgYisrKSB7Ci0JCQkJCUNvbm5lY3Rpb25Ob2RlRWRpdFBhcnQgbGluayA9IChDb25uZWN0aW9uTm9kZUVkaXRQYXJ0KSB0YXJnZXRMaW5rcy5nZXQoYik7Ci0JCQkJCUFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQgc291cmNlID0gKEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQpIGxpbmsKLQkJCQkJCQkuZ2V0U291cmNlKCk7Ci0JCQkJCWludCB3ID0gc291cmNlLmdldEZpZ3VyZSgpLmdldEJvdW5kcygpLndpZHRoOwotCQkJCQlpbnQgZXcgPSBlcC5nZXRGaWd1cmUoKS5nZXRQcmVmZXJyZWRTaXplKCkud2lkdGg7Ci0JCQkJCWlmICh3IDwgZXcpIHsKLQkJCQkJCUNvbW1hbmQgYyA9IG5ldyBDaGFuZ2VCb3VuZHNDb21tYW5kKHRyYW5zYWN0aW9uRG9tYWluLCgoTm9kZSkgZXAKLQkJCQkJCQkJLmdldE1vZGVsKCkpLCBzb3VyY2UuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCkKLQkJCQkJCQkJLmdldExvY2F0aW9uKCksIHcsLTEpOwotCQkJCQkJZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShjKTsKLQkJCQkJCWludCBoID0gc291cmNlLmdldEZpZ3VyZSgpLmdldFByZWZlcnJlZFNpemUoKS5oZWlnaHQ7Ci0JCQkJCQlzb3VyY2UuZ2V0RmlndXJlKCkKLQkJCQkJCQkJLnNldFByZWZlcnJlZFNpemUobmV3IERpbWVuc2lvbih3LCBoKSk7Ci0JCQkJCQlzb3VyY2UuZ2V0RmlndXJlKCkuc2V0U2l6ZShuZXcgRGltZW5zaW9uKHcsIGgpKTsKLQkJCQkJfQotCQkJCQlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCWxpc3QuYWRkKGVwKTsKLQkJCQkJbGlzdC5hZGQoc291cmNlKTsKLQkJCQkJdmVydGljYWxBbGlnblRvRmlyc3RTZWxlY3RlZChsaXN0KTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoZXAgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdENvbXBvc2l0ZUVkaXRQYXJ0IHx8IAotCQkJCQllcCBpbnN0YW5jZW9mIFJvbGVUYXNrQ29tcG9zaXRlRWRpdFBhcnQpIHsKLQkJCQlMaXN0IGNoaWxkcmVuID0gZXAuZ2V0Q2hpbGRyZW4oKTsKLQkJCQlmb3IgKGludCBkID0gMDsgZCA8IGNoaWxkcmVuLnNpemUoKTsgZCsrKSB7Ci0JCQkJCUFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQgcCA9IChBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0KSBjaGlsZHJlbgotCQkJCQkJCS5nZXQoZCk7Ci0JCQkJCWNsZWFuVXAocCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogIEZvciBhdXRvLWxheW91dCwgbmVlZCB0byBhZGp1c3QgY29ubmVjdGlvbihvciBsaW5rKSBsZW5ndGgsIGJhc2VkIG9uCi0JICogIGNvbm5lY3RpbmcgZWRpdHBhcnRzKGZpZ3VyZXMpLgotCSAqIAotCSAqLwotCXByaXZhdGUgYm9vbGVhbiByZWR1Y2VMaW5rTGVuZ3RoKEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQgcGFydCkgewotCQlib29sZWFuIG1vdmVkID0gZmFsc2U7Ci0JCS8vIG9ubHkgbW92ZSBuZXcgV29ya1Byb2R1Y3RDb21wb3NpdGUgZWxlbWVudHMKLQkJaWYgKHBhcnQgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdENvbXBvc2l0ZUVkaXRQYXJ0KSB7Ci0JCQlBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0IGxpbmtlZFBhcnQgPSBudWxsOwotCQkJaW50IHBvc2l0aW9uID0gUG9zaXRpb25Db25zdGFudHMuQ0VOVEVSOwotCQkJLy8gaXMgdGhpcyBlbGVtZW50IGxpbmtlZCB0byBhbm90aGVyIGl0ZW0/Ci0JCQlpZiAocGFydC5nZXRUYXJnZXRDb25uZWN0aW9ucygpLnNpemUoKSA+IDApIHsKLQkJCQlsaW5rZWRQYXJ0ID0gKEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQpICgoQ29ubmVjdGlvbk5vZGVFZGl0UGFydCkgcGFydAotCQkJCQkJLmdldFRhcmdldENvbm5lY3Rpb25zKCkuZ2V0KDApKS5nZXRTb3VyY2UoKTsKLQkJCQlwb3NpdGlvbiA9IFBvc2l0aW9uQ29uc3RhbnRzLk5PUlRIOwotCQkJfSBlbHNlIGlmIChwYXJ0LmdldFNvdXJjZUNvbm5lY3Rpb25zKCkuc2l6ZSgpID4gMCkgewotCQkJCWxpbmtlZFBhcnQgPSAoQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCkgKChDb25uZWN0aW9uTm9kZUVkaXRQYXJ0KSBwYXJ0Ci0JCQkJCQkuZ2V0U291cmNlQ29ubmVjdGlvbnMoKS5nZXQoMCkpLmdldFRhcmdldCgpOwotCQkJCXBvc2l0aW9uID0gUG9zaXRpb25Db25zdGFudHMuU09VVEg7Ci0JCQl9Ci0JCQlpZiAobGlua2VkUGFydCAhPSBudWxsKSB7Ci0JCQkJaWYgKCEobGlua2VkUGFydC5nZXRQYXJlbnQoKSBpbnN0YW5jZW9mIERpYWdyYW1FZGl0UGFydCkpIHsKLQkJCQkJbGlua2VkUGFydCA9IChBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0KSBsaW5rZWRQYXJ0Ci0JCQkJCQkJLmdldFBhcmVudCgpOwotCQkJCX0KLQkJCQkvLyBnZXQgdGhlIHBhcnQncyBwb3NpdGlvbgotCQkJCVJlY3RhbmdsZSBwYXJ0Qm91bmRzID0gcGFydC5nZXRGaWd1cmUoKS5nZXRCb3VuZHMoKTsKLQkJCQkvLyBnZXQgdGhlIGxpbmtlZCBwYXJ0J3MgcG9zaXRpb24KLQkJCQlSZWN0YW5nbGUgbGlua2VkUGFydEJvdW5kcyA9IGxpbmtlZFBhcnQuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCk7Ci0JCQkJLy8gZGV0ZXJtaW5lIGluIHdoaWNoIGRpcmVjdGlvbiBpcyB0aGUgbGlua2VkIHBhcnQKLQkJCQkvLyBpbnQgcG9zaXRpb24gPSBwYXJ0Qm91bmRzLmdldFBvc2l0aW9uKGxpbmtlZFBhcnRCb3VuZHMKLQkJCQkvLyAuZ2V0TG9jYXRpb24oKSk7Ci0JCQkJLy8gYXNzdW1lIGl0IGlzIGJlbG93IHVzLCBzbyB0aGlzIHBhcnQgbW92ZXMgdXAKLQkJCQlpbnQgZGlyZWN0aW9uID0gLTE7Ci0JCQkJaWYgKChwb3NpdGlvbiAmIFBvc2l0aW9uQ29uc3RhbnRzLk5PUlRIKSA9PSBQb3NpdGlvbkNvbnN0YW50cy5OT1JUSAotCQkJCQkJfHwgKHBvc2l0aW9uICYgUG9zaXRpb25Db25zdGFudHMuQ0VOVEVSKSA9PSBQb3NpdGlvbkNvbnN0YW50cy5DRU5URVIpIHsKLQkJCQkJLy8gYWJvdmUgdXMsIG1vdmUgZG93bgotCQkJCQlkaXJlY3Rpb24gPSAxOwotCQkJCX0KLQkJCQkvLyBzZXQgbmV3IGJvdW5kcyBmb3IgdGhlIHBhcnQgc28gdGhhdCBpdCBzaXRlcyBqdXN0IG91dHNpZGUgb2YKLQkJCQkvLyB0aGUgbGlua2VkIHBhcnQKLQkJCQlSZWN0YW5nbGUgdGVzdEJvdW5kcyA9IHBhcnRCb3VuZHMuZ2V0Q29weSgpOwotCQkJCWlmIChkaXJlY3Rpb24gPT0gMSkgewotCQkJCQl0ZXN0Qm91bmRzLnkgPSBsaW5rZWRQYXJ0Qm91bmRzLnkgKyBsaW5rZWRQYXJ0Qm91bmRzLmhlaWdodAotCQkJCQkJCSsgVkVSVF9QSVhfUEFERElORzsKLQkJCQl9IGVsc2UgewotCQkJCQl0ZXN0Qm91bmRzLnkgPSBsaW5rZWRQYXJ0Qm91bmRzLnkgLSBWRVJUX1BJWF9QQURESU5HCi0JCQkJCQkJLSBwYXJ0Qm91bmRzLmhlaWdodDsKLQkJCQl9Ci0JCQkJLy8gc2V0IHRoZSBuZXcgbG9jYXRpb24gZm9yIHRoZSBwYXJ0IGluIHRoZSBtb2RlbAotCQkJCVBvaW50IG5wID0gbmV3IFBvaW50KHRlc3RCb3VuZHMueCwgdGVzdEJvdW5kcy55KTsKLQkJCQlwYXJ0LmdldEZpZ3VyZSgpLnNldExvY2F0aW9uKG5wKTsKLQkJCQlDb21tYW5kIGMgPSBuZXcgQ2hhbmdlQm91bmRzQ29tbWFuZCh0cmFuc2FjdGlvbkRvbWFpbiwoTm9kZSkgcGFydC5nZXRNb2RlbCgpLCBucCwKLQkJCQkJCXBhcnRCb3VuZHMud2lkdGgsIC0xKTsKLQkJCQlnZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKGMpOwotCQkJfQotCQl9Ci0JCXJldHVybiBtb3ZlZDsKLQl9Ci0KLQkvKioKLQkgKiBNZXRob2QgdG8gYWRqdXN0IHRoZSBzaXplIG9mIGVkaXRwYXJ0LiAgCi0JICogCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFkanVzdFNpemUoQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCBlcCkgewotCQlpZiAoZXAgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdENvbXBvc2l0ZUVkaXRQYXJ0KSB7Ci0JCQlhZGp1c3RTaXplKChXb3JrUHJvZHVjdENvbXBvc2l0ZUVkaXRQYXJ0KSBlcCwgMSk7Ci0JCX0KLQkJZWxzZSBpZiAoZXAgaW5zdGFuY2VvZiBSb2xlVGFza0NvbXBvc2l0ZUVkaXRQYXJ0KSB7Ci0JCQlhZGp1c3RTaXplKChSb2xlVGFza0NvbXBvc2l0ZUVkaXRQYXJ0KSBlcCwgNTApOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBpbnQgSE9SSVpfUElYX1BBRERJTkcgPSAzMDsKLQotCXByb3RlY3RlZCBmaW5hbCBzdGF0aWMgaW50IFZFUlRfUElYX1BBRERJTkcgPSAyMDsKLQotCS8qKgotCSAqIEFkanVzdHMgdGhlIHNpemUgb2YgQ29udGFpbmVyRWRpdFBhcnQgdG8gYWNjb21vZGF0ZSBudW1iZXIgb2YgZWRpdHBhcnRzIGluIGEgcm93LAotCSAqIHB1c2ggdGhlIHJlbWFpbmluZyB0aGUgZWRpdHBhcnRzIGluIHR3byBzZWNvbmQgcm93LiAKLQkgKiBUaGlzIGlzIHVzZWZ1bCBmb3Ige0BsaW5rIFRvb2xiYXJMYXlvdXR9Ci0JICogCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFkanVzdFNpemUoU2hhcGVOb2RlRWRpdFBhcnQgZXAsIGludCBob3JpekNvdW50KSB7Ci0JCWludCByZXF1aXJlZFdpZHRoID0gMDsKLQkJaW50IHJvd01heEhlaWdodCA9IDA7Ci0JCWludCByb3dzID0gMDsKLQkJaW50IHdpZHRoU3VtID0gMDsKLQkJaW50IGhlaWdodFN1bSA9IDA7Ci0JCWludCBjb2x1bW4gPSAwOwotCi0JCWRlbHRhID0gMDsKLQkJTGlzdCBjaGlsZHJlbiA9IGVwLmdldENoaWxkcmVuKCk7Ci0JCUlGaWd1cmUgcGFyZW50RmlndXJlICA9IGVwLmdldEZpZ3VyZSgpOwotCQkvL1RPRE86IG5lZWQgcmV2aXNpdCB0cmFuc2FjdGlvbiB1c2FnZQotCQl0cnl7Ci0JCVRyYW5zYWN0aW9uIHR4ID0gKChJbnRlcm5hbFRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluKXRyYW5zYWN0aW9uRG9tYWluKS5zdGFydFRyYW5zYWN0aW9uKGZhbHNlLCBDb2xsZWN0aW9ucy5FTVBUWV9NQVApOwotCQlmb3IgKGludCBwID0gMDsgcCA8IGNoaWxkcmVuLnNpemUoKTspIHsKLQkJCWlmIChjb2x1bW4gPT0gMCkgewotCQkJCXJvd3MrKzsKLQkJCX0KLQkJCWlmIChjb2x1bW4gPCBob3JpekNvdW50KSB7Ci0JCQkJQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCBjaGlsZCA9IChBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0KSBjaGlsZHJlbgotCQkJCQkJLmdldChwKTsKLQkJCQlpZihjaGlsZCBpbnN0YW5jZW9mIFJvbGVOb2RlRWRpdFBhcnQgfHwgY2hpbGQgaW5zdGFuY2VvZiBUYXNrTm9kZUVkaXRQYXJ0KXsKLQkJCQkJcmVzZXRTaXplKChTaGFwZU5vZGVFZGl0UGFydCljaGlsZCwgcGFyZW50RmlndXJlKTsKLS8vCQkJCQlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0vLwkJCQkJbGlzdC5hZGQoY2hpbGQuZ2V0TW9kZWwoKSk7Ci0vLwkJCQkJUGVyc2lzdFZpZXdzQ29tbWFuZCBjbWQgPSBuZXcgUGVyc2lzdFZpZXdzQ29tbWFuZCh0cmFuc2FjdGlvbkRvbWFpbiwgbGlzdCk7Ci0vLwkJCQkJY21kLmV4ZWN1dGUobmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSwgbnVsbCk7Ci0JCQkJfQotCQkJCURpbWVuc2lvbiBkID0gY2hpbGQuZ2V0RmlndXJlKCkuZ2V0UHJlZmVycmVkU2l6ZSgpOwotCQkJCXdpZHRoU3VtICs9IGQud2lkdGg7Ci0JCQkJaWYgKGQuaGVpZ2h0ID4gcm93TWF4SGVpZ2h0KSB7Ci0JCQkJCXJvd01heEhlaWdodCA9IGQuaGVpZ2h0OwotCQkJCX0KLQkJCQlwKys7Ci0JCQkJY29sdW1uKys7Ci0JCQl9IGVsc2UgewotCQkJCWlmICh3aWR0aFN1bSA+IHJlcXVpcmVkV2lkdGgpIHsKLQkJCQkJcmVxdWlyZWRXaWR0aCA9IHdpZHRoU3VtOwotCQkJCX0KLQkJCQloZWlnaHRTdW0gKz0gcm93TWF4SGVpZ2h0OwotCQkJCXJvd01heEhlaWdodCA9IDA7Ci0JCQkJd2lkdGhTdW0gPSAwOwotCQkJCWNvbHVtbiA9IDA7Ci0JCQl9Ci0JCX0KLQkJdHguY29tbWl0KCk7Ci0JCX1jYXRjaChFeGNlcHRpb24gZSl7Ci0JCQkKLQkJfQotCQlpZiAod2lkdGhTdW0gPiByZXF1aXJlZFdpZHRoKSB7Ci0JCQlyZXF1aXJlZFdpZHRoID0gd2lkdGhTdW07Ci0JCX0KLQkJaGVpZ2h0U3VtICs9IHJvd01heEhlaWdodDsKLQkJcmVxdWlyZWRXaWR0aCArPSBIT1JJWl9QSVhfUEFERElORwotCQkJCSogTWF0aC5taW4oaG9yaXpDb3VudCwgY2hpbGRyZW4uc2l6ZSgpKTsKLQkJaW50IHJlcXVpcmVkSGVpZ2h0ID0gaGVpZ2h0U3VtICsgKFZFUlRfUElYX1BBRERJTkcgKiByb3dzKTsKLQkJQ29tbWFuZCBjbWQgPSBuZXcgQ2hhbmdlQm91bmRzQ29tbWFuZCh0cmFuc2FjdGlvbkRvbWFpbiwgKChOb2RlKSBlcC5nZXRNb2RlbCgpKSwgZXAKLQkJCQkuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCkuZ2V0TG9jYXRpb24oKSwgcmVxdWlyZWRXaWR0aCwgcmVxdWlyZWRIZWlnaHQpOwotCQlnZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKGNtZCk7Ci0JCWVwLmdldEZpZ3VyZSgpLnNldFByZWZlcnJlZFNpemUoCi0JCQkJbmV3IERpbWVuc2lvbihyZXF1aXJlZFdpZHRoLCByZXF1aXJlZEhlaWdodCkpOwotCQkvLygoTm9kZSkgZXAuZ2V0TW9kZWwoKSkuc2V0SGVpZ2h0KHJlcXVpcmVkSGVpZ2h0KTsKLQkJZXAuZ2V0RmlndXJlKCkuc2V0U2l6ZShuZXcgRGltZW5zaW9uKHJlcXVpcmVkV2lkdGgsIHJlcXVpcmVkSGVpZ2h0KSk7Ci0JCWVwLmdldEZpZ3VyZSgpLmdldExheW91dE1hbmFnZXIoKS5sYXlvdXQoZXAuZ2V0RmlndXJlKCkpOwotCQkvLyBhZnRlciBsYXlvdXQsIGNoZWNrIHRoZSBib3R0b20tbW9zdCBjaGlsZCBmaWd1cmUgYWdhaW5zdCB0aGUgYm90dG9tCi0JCS8vIG9mIHRoZSBjb250YWluZXIsIGFkanVzdCB0aGUgYm90dG9tIG9mIHRoZSBjb250YWluZXIgaXMgbmVjZXNzYXJ5Ci0JCWlmIChlcCBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0Q29tcG9zaXRlRWRpdFBhcnQgJiYgY2hpbGRyZW4uc2l6ZSgpID4gMCkgewotCQkJaW50IHRvdGFsQ2FsY3VsYXRlZEhlaWdodCA9IDA7Ci0JCQlmb3IgKGludCBpPTA7IGkgPCBjaGlsZHJlbi5zaXplKCk7IGkrKykJCXsKLQkJCQlHcmFwaGljYWxFZGl0UGFydCBwYXJ0ID0gKEdyYXBoaWNhbEVkaXRQYXJ0KSBjaGlsZHJlbi5nZXQoaSk7Ci0JCQkJTm9kZSBub2RlT2JqID0gKE5vZGUpIHBhcnQuZ2V0TW9kZWwoKTsKLQkJCQlFT2JqZWN0IG8gPSBub2RlT2JqLmdldEVsZW1lbnQoKTsJCQkJCi0JCQkJdG90YWxDYWxjdWxhdGVkSGVpZ2h0ICs9IHBhcnQuZ2V0RmlndXJlKCkuZ2V0UHJlZmVycmVkU2l6ZSgpLmhlaWdodDsKLQkJCX0KLQkJCWludCBoZWlnaHQgPSB0b3RhbENhbGN1bGF0ZWRIZWlnaHQgKyAyMCArIDUgKiAoY2hpbGRyZW4uc2l6ZSgpIC0gMSk7Ci0JCQlHcmFwaGljYWxFZGl0UGFydCBsYXN0ID0gKEdyYXBoaWNhbEVkaXRQYXJ0KSBjaGlsZHJlbi5nZXQoY2hpbGRyZW4KLQkJCQkJLnNpemUoKSAtIDEpOwotCQkJUG9pbnQgY2hpbGRCb3R0b20gPSBsYXN0LmdldEZpZ3VyZSgpLmdldEJvdW5kcygpLmdldEJvdHRvbSgpOwotCQkJUG9pbnQgcGFyZW50Qm90dG9tID0gZXAuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCkuZ2V0Qm90dG9tKCk7Ci0JCQlpbnQgZGVsdGEgPSBwYXJlbnRCb3R0b20ueSAtIGNoaWxkQm90dG9tLnkgLSAoVkVSVF9QSVhfUEFERElORyAvIDIpOwotLy8JCQllcC5nZXRGaWd1cmUoKS5zZXRQcmVmZXJyZWRTaXplKAotLy8JCQkJCW5ldyBEaW1lbnNpb24ocmVxdWlyZWRXaWR0aCwgcmVxdWlyZWRIZWlnaHQgLSBkZWx0YSkpOwotLy8JCQljbWQgPSBuZXcgQ2hhbmdlQm91bmRzQ29tbWFuZCh0cmFuc2FjdGlvbkRvbWFpbiwgKChOb2RlKSBlcC5nZXRNb2RlbCgpKSwgZXAKLS8vCQkJCQkuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCkuZ2V0TG9jYXRpb24oKSwgLTEsIHJlcXVpcmVkSGVpZ2h0LWRlbHRhKTsKLS8vCQkJZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShjbWQpOwotLy8JCQllcC5nZXRGaWd1cmUoKS5zZXRTaXplKAotLy8JCQkJCW5ldyBEaW1lbnNpb24ocmVxdWlyZWRXaWR0aCwgcmVxdWlyZWRIZWlnaHQgLSBkZWx0YSkpOwotCQkJZXAuZ2V0RmlndXJlKCkuc2V0UHJlZmVycmVkU2l6ZSgKLQkJCQkJbmV3IERpbWVuc2lvbihyZXF1aXJlZFdpZHRoLCBoZWlnaHQpKTsKLQkJCWNtZCA9IG5ldyBDaGFuZ2VCb3VuZHNDb21tYW5kKHRyYW5zYWN0aW9uRG9tYWluLCAoKE5vZGUpIGVwLmdldE1vZGVsKCkpLCBlcAotCQkJCQkuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCkuZ2V0TG9jYXRpb24oKSwgLTEsIGhlaWdodCk7Ci0JCQlnZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKGNtZCk7CQkJCi0JCQllcC5nZXRGaWd1cmUoKS5zZXRTaXplKAotCQkJCQluZXcgRGltZW5zaW9uKHJlcXVpcmVkV2lkdGgsIGhlaWdodCkpOwotCQl9Ci0JfQotCQotCQotCQotCQotCXByaXZhdGUgdm9pZCByZXNldFNpemUoU2hhcGVOb2RlRWRpdFBhcnQgZXAsIElGaWd1cmUgcGFyZW50RmlndXJlKXsKLQkJCi0JCU5vZGUgbW9kZWwgPSAoTm9kZSllcC5nZXRNb2RlbCgpOwotCQlJR3JhcGhpY2FsRWRpdFBhcnQgY2hpbGQgPSAoSUdyYXBoaWNhbEVkaXRQYXJ0KWVwLmdldENoaWxkcmVuKCkuZ2V0KDApOwotCQlOb2RlRmlndXJlIG5vZGVGaWd1cmUgPSAoTm9kZUZpZ3VyZSllcC5nZXRGaWd1cmUoKTsKLQkJTGlzdCBub2RlRmlndXJlQ2hpbGRyZW4gPSAgbm9kZUZpZ3VyZS5nZXRDaGlsZHJlbigpOwotCQlJRmlndXJlIGNoaWxkRmlndXJlID0gKElGaWd1cmUpbm9kZUZpZ3VyZUNoaWxkcmVuLmdldCgwKTsKLQkJaWYoY2hpbGRGaWd1cmUgaW5zdGFuY2VvZiBSZWN0YW5nbGVGaWd1cmUpewotCQkJSUZpZ3VyZSBsYWJlbEZpZ3VyZSA9IChJRmlndXJlKSgoUmVjdGFuZ2xlRmlndXJlKWNoaWxkRmlndXJlKS5nZXRDaGlsZHJlbigpLmdldCgwKTsKLQkJCWlmKGxhYmVsRmlndXJlIGluc3RhbmNlb2YgV3JhcExhYmVsKXsKLQkJCQlEaW1lbnNpb24gZmlnRGltZW5zaW9uID0gbGFiZWxGaWd1cmUuZ2V0U2l6ZSgpOwotCQkJCURpbWVuc2lvbiBkID0gbGFiZWxGaWd1cmUuZ2V0UHJlZmVycmVkU2l6ZSgpOwotCQkJCVBvaW50IHAgPSBub2RlRmlndXJlLmdldExvY2F0aW9uKCkuZ2V0Q29weSgpOwotCQkJCXAueCA9IHAueCArIGRlbHRhOwotCQkJCW5vZGVGaWd1cmUuc2V0TG9jYXRpb24ocCk7Ci0JCQkJaWYgKGQud2lkdGggPiBub2RlRmlndXJlLmdldFNpemUoKS53aWR0aCkgewotCQkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIk5vZGUgZmlndXJlIHdpZHRoOiAiK25vZGVGaWd1cmUuZ2V0U2l6ZSgpLndpZHRoKTsKLQkJCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJUZXh0IHdpZHRoOiAiKyBkLndpZHRoKTsKLQkJCQkJZGVsdGEgKz0gZC53aWR0aCAtIG5vZGVGaWd1cmUuZ2V0U2l6ZSgpLndpZHRoOwotCQkJCX0KLQkJCQlpZihkLndpZHRoID4gZmlnRGltZW5zaW9uLndpZHRoKXsKLQkJCQkJaW50IHdpZHRoID0gZC53aWR0aDsKLQkJCQkJVmlldyB2aWV3ID0gKChWaWV3KWNoaWxkLmdldE1vZGVsKCkpOwotCQkJCQlWaWV3VXRpbC5zZXRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlKHZpZXcsCi0JCQkJCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRTaXplX1dpZHRoKCksIG5ldyBJbnRlZ2VyKAotCQkJCQkJCQkJd2lkdGgpKTsKLQkJCQkJVmlld1V0aWwuc2V0U3RydWN0dXJhbEZlYXR1cmVWYWx1ZShtb2RlbCwKLQkJCQkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldFNpemVfV2lkdGgoKSwgbmV3IEludGVnZXIoCi0JCQkJCQkJCQl3aWR0aCkpOwotCQkJCQlub2RlRmlndXJlLnNldFByZWZlcnJlZFNpemUobmV3IERpbWVuc2lvbih3aWR0aCwgbm9kZUZpZ3VyZS5nZXRQcmVmZXJyZWRTaXplKCkuaGVpZ2h0KSk7Ci0JCQkJCWNoaWxkRmlndXJlLnNldFByZWZlcnJlZFNpemUobmV3IERpbWVuc2lvbih3aWR0aCwgY2hpbGRGaWd1cmUuZ2V0UHJlZmVycmVkU2l6ZSgpLmhlaWdodCkpOwotCQkJCQlsYWJlbEZpZ3VyZS5zZXRQcmVmZXJyZWRTaXplKG5ldyBEaW1lbnNpb24od2lkdGgsIGxhYmVsRmlndXJlLmdldFByZWZlcnJlZFNpemUoKS5oZWlnaHQpKTsKLQkJCQkJbm9kZUZpZ3VyZS5zZXRTaXplKG5ldyBEaW1lbnNpb24od2lkdGgsIG5vZGVGaWd1cmUuZ2V0UHJlZmVycmVkU2l6ZSgpLmhlaWdodCkpOwotCQkJCQljaGlsZEZpZ3VyZS5zZXRTaXplKG5ldyBEaW1lbnNpb24od2lkdGgsIGNoaWxkRmlndXJlLmdldFByZWZlcnJlZFNpemUoKS5oZWlnaHQpKTsKLQkJCQkJbGFiZWxGaWd1cmUuc2V0U2l6ZShuZXcgRGltZW5zaW9uKHdpZHRoLCBsYWJlbEZpZ3VyZS5nZXRQcmVmZXJyZWRTaXplKCkuaGVpZ2h0KSk7Ci0KLS8vCQkJCQlub2RlRmlndXJlLnNldENvbnN0cmFpbnQoY2hpbGRGaWd1cmUsIG5ldyBSZWN0YW5nbGUobm9kZUZpZ3VyZS5nZXRMb2NhdGlvbigpLngsCi0vLwkJCQkJCQlub2RlRmlndXJlLmdldExvY2F0aW9uKCkueSwgd2lkdGgsIGNoaWxkRmlndXJlLmdldEJvdW5kcygpLmhlaWdodCkpOwotCQkJCQkvLyBDaGFuZ2UgdGhlIGxvY2F0aW9uIAotLy8JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiY2hpbGQgYm91bmRzIGJlZm9yZTogIiArIG5vZGVGaWd1cmUuZ2V0Qm91bmRzKCkgKyJkZWx0YTogIiArIGRlbHRhKTsJCQkJCQotCQkJCX0JCQkJCi0JCQl9Ci0JCX0KLQl9Ci0JCi0KLQlwcm90ZWN0ZWQgdm9pZCBlbnVtZXJhdGVDb25uZWN0ZWRQYXJ0cyhBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0IHBhcnQsCi0JCQlMaXN0PEVkaXRQYXJ0PiBjb25uZWN0ZWQpIHsKLQkJLy8gb25seSBhZGQgcGFydHMgZGlyZWN0bHkgb24gdGhlIGRpYWdyYW0gc3VyZmFjZQotCQlpZiAoIWNvbm5lY3RlZC5jb250YWlucyhwYXJ0KSkgewotCQkJaWYgKCEocGFydC5nZXRQYXJlbnQoKSBpbnN0YW5jZW9mIERpYWdyYW1FZGl0UGFydCkpIHsKLQkJCQlpZiAoIWNvbm5lY3RlZC5jb250YWlucyhwYXJ0LmdldFBhcmVudCgpKSkgewotCQkJCQljb25uZWN0ZWQuYWRkKHBhcnQuZ2V0UGFyZW50KCkpOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJY29ubmVjdGVkLmFkZChwYXJ0KTsKLQkJCX0KLQkJCUFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQgbGlua2VkUGFydCA9IG51bGw7Ci0JCQlMaXN0IGNoaWxkcmVuID0gcGFydC5nZXRDaGlsZHJlbigpOwotCQkJZm9yIChpbnQgeCA9IDA7IHggPCBjaGlsZHJlbi5zaXplKCk7IHgrKykgewotCQkJCUFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQgcCA9IChBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0KSBjaGlsZHJlbgotCQkJCQkJLmdldCh4KTsKLQkJCQllbnVtZXJhdGVDb25uZWN0ZWRQYXJ0cyhwLCBjb25uZWN0ZWQpOwotCQkJfQotCQkJLy8gaXMgdGhpcyBlbGVtZW50IGxpbmtlZCB0byBhbm90aGVyIGl0ZW0/Ci0JCQlmb3IgKGludCB4ID0gMDsgeCA8IHBhcnQuZ2V0VGFyZ2V0Q29ubmVjdGlvbnMoKS5zaXplKCk7IHgrKykgewotCQkJCWxpbmtlZFBhcnQgPSAoQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCkgKChDb25uZWN0aW9uTm9kZUVkaXRQYXJ0KSBwYXJ0Ci0JCQkJCQkuZ2V0VGFyZ2V0Q29ubmVjdGlvbnMoKS5nZXQoeCkpLmdldFNvdXJjZSgpOwotCQkJCWVudW1lcmF0ZUNvbm5lY3RlZFBhcnRzKGxpbmtlZFBhcnQsIGNvbm5lY3RlZCk7Ci0JCQl9Ci0JCQlmb3IgKGludCB4ID0gMDsgeCA8IHBhcnQuZ2V0U291cmNlQ29ubmVjdGlvbnMoKS5zaXplKCk7IHgrKykgewotCQkJCWxpbmtlZFBhcnQgPSAoQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCkgKChDb25uZWN0aW9uTm9kZUVkaXRQYXJ0KSBwYXJ0Ci0JCQkJCQkuZ2V0U291cmNlQ29ubmVjdGlvbnMoKS5nZXQoeCkpLmdldFRhcmdldCgpOwotCQkJCWVudW1lcmF0ZUNvbm5lY3RlZFBhcnRzKGxpbmtlZFBhcnQsIGNvbm5lY3RlZCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBmaW5kcyBzaW5nbGUgZWxlbWVudHMgYW5kIGdyb3VwcyBvZiBlbGVtZW50cywgYW5kIHBvc2l0aW9ucwotCSAqIHRoZW0gc3RhcnRpbmcgZnJvbSB0aGUgdG9wIG9mIHRoZSBkaWFncmFtIGFuZCBjb250aW51b3VzbHkgZG93biB0aGUgcGFnZS4KLQkgKi8KLQlwcml2YXRlIHZvaWQgcGFja0RpYWdyYW0oKSB7Ci0JCUFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRQYXJ0IGRpYWdyYW0gPSAoQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdFBhcnQpIGdldEdyYXBoaWNhbFZpZXdlcigpCi0JCQkJLmdldENvbnRlbnRzKCk7Ci0JCS8vIHN0YXJ0IGF0IHRoZSB0b3Agb2YgdGhlIGRpYWdyYW0KLQkJLy8gRGltZW5zaW9uIGRpYWdyYW1TaXplID0gZGlhZ3JhbS5nZXRGaWd1cmUoKS5nZXRTaXplKCk7Ci0JCS8vIG5vIG5ldyBzaGFwZXMgY2FuIGJlIG1vdmVkIGFib3ZlIHRoaXMgeS1heGlzIHZhbHVlCi0JCWludCByZXNlcnZlZCA9IDA7Ci0JCS8vIHRoZXNlIGFyZSBlbGVtZW50cyB3aXRob3V0IGNvbm5lY3Rpb25zCi0JCUxpc3Q8RWRpdFBhcnQ+IHN0cmFnZ2xlcnMgPSBuZXcgQXJyYXlMaXN0PEVkaXRQYXJ0PigpOwotCQkvLyB0aGVzZSBhcmUgZ3JvdXBzIG9mIGVsZW1lbnRzIGNvbm5lY3RlZCB3aXRoIGxpbmtzCi0JCUxpc3Q8TGlzdD4gZ3JvdXBzID0gbmV3IEFycmF5TGlzdDxMaXN0PigpOwotCQkvLyB0aGVzZSBhcmUgdG9wIGxldmVsIHBhcnRzIG9uIHRoZSBkaWFncmFtIHRoYXQgaGF2ZSBiZWVuIGFkZGVkCi0JCUxpc3QgZGlhZ3JhbVBhcnRzID0gZGlhZ3JhbS5nZXRSZWNlbnRseUFkZGVkUGFydHMoKTsKLQkJZm9yIChpbnQgeCA9IDA7IHggPCBkaWFncmFtUGFydHMuc2l6ZSgpOyB4KyspIHsKLQkJCUFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQgcCA9IChBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0KSBkaWFncmFtUGFydHMKLQkJCQkJLmdldCh4KTsKLQkJCWJvb2xlYW4gZm91bmQgPSBmYWxzZTsKLQkJCWZvciAoaW50IGcgPSAwOyBnIDwgZ3JvdXBzLnNpemUoKSAmJiBmb3VuZCA9PSBmYWxzZTsgZysrKSB7Ci0JCQkJTGlzdCBncm91cCA9IChMaXN0KSBncm91cHMuZ2V0KGcpOwotCQkJCWlmIChncm91cC5jb250YWlucyhwKSkgewotCQkJCQlmb3VuZCA9IHRydWU7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJCWlmICghZm91bmQpIHsKLQkJCQlMaXN0PEVkaXRQYXJ0PiBjb25uZWN0ZWQgPSBuZXcgQXJyYXlMaXN0PEVkaXRQYXJ0PigpOwotCQkJCWVudW1lcmF0ZUNvbm5lY3RlZFBhcnRzKHAsIGNvbm5lY3RlZCk7Ci0JCQkJaWYgKGNvbm5lY3RlZC5zaXplKCkgPT0gMSkgewotCQkJCQlzdHJhZ2dsZXJzLmFkZChwKTsKLQkJCQl9IGVsc2UgewotCQkJCQlncm91cHMuYWRkKGNvbm5lY3RlZCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCS8vIHByb2Nlc3MgZWFjaCBncm91cCBjbG9zZXN0IHRvIHRoZSB0b3AgKG1pbiB5IHZhbHVlKQotCQl3aGlsZSAoZ3JvdXBzLnNpemUoKSA+IDApIHsKLQkJCUxpc3QgdG9wID0gKExpc3QpIGdyb3Vwcy5nZXQoMCk7Ci0JCQlpbnQgdG9wWSA9IGdldFZlcnRpY2FsTWluUGFydCh0b3ApLmdldEZpZ3VyZSgpLmdldEJvdW5kcygpLnk7Ci0JCQlmb3IgKGludCB4ID0gMDsgeCA8IGdyb3Vwcy5zaXplKCk7IHgrKykgewotCQkJCUxpc3QgZyA9IChMaXN0KSBncm91cHMuZ2V0KHgpOwotCQkJCWludCB5ID0gZ2V0VmVydGljYWxNaW5QYXJ0KGcpLmdldEZpZ3VyZSgpLmdldEJvdW5kcygpLnk7Ci0JCQkJaWYgKHkgPCB0b3BZKSB7Ci0JCQkJCXRvcCA9IGc7Ci0JCQkJCXRvcFkgPSB5OwotCQkJCX0KLQkJCX0KLQkJCWludCBsaW1pdCA9IHJlc2VydmVkICsgMTsKLQkJCWludCB2ZXJ0aWNhbERlbHRhID0gbGltaXQgLSB0b3BZOwotCQkJaW50IGxlZnRYID0gZ2V0SG9yaXpvbnRhbE1pblBhcnQodG9wKS5nZXRGaWd1cmUoKS5nZXRCb3VuZHMoKS54OwotCQkJaW50IGhvcml6b250YWxEZWx0YSA9IEhPUklaX1BJWF9QQURESU5HIC0gbGVmdFg7Ci0JCQlmb3IgKGludCB4ID0gMDsgeCA8IHRvcC5zaXplKCk7IHgrKykgewotCQkJCUFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQgcCA9IChBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0KSB0b3AKLQkJCQkJCS5nZXQoeCk7Ci0JCQkJUmVjdGFuZ2xlIGJvdW5kcyA9IHAuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCk7Ci0JCQkJQ2hhbmdlQm91bmRzQ29tbWFuZCBjYmMgPSBuZXcgQ2hhbmdlQm91bmRzQ29tbWFuZCh0cmFuc2FjdGlvbkRvbWFpbiwoTm9kZSkgcAotCQkJCQkJLmdldE1vZGVsKCksIG5ldyBQb2ludChib3VuZHMueCArIGhvcml6b250YWxEZWx0YSwKLQkJCQkJCWJvdW5kcy55ICsgdmVydGljYWxEZWx0YSksIGJvdW5kcy53aWR0aCwgLTEpOwotCQkJCWdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUoY2JjKTsKLQkJCQlwLmdldEZpZ3VyZSgpLnNldExvY2F0aW9uKAotCQkJCQkJbmV3IFBvaW50KGJvdW5kcy54ICsgaG9yaXpvbnRhbERlbHRhLCBib3VuZHMueQotCQkJCQkJCQkrIHZlcnRpY2FsRGVsdGEpKTsKLQkJCQlwLnJlZnJlc2goKTsKLQkJCX0KLQkJCWludCBib3R0b21ZID0gZ2V0VmVydGljYWxNYXhQYXJ0KHRvcCkuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCkKLQkJCQkJLmJvdHRvbSgpOwotCQkJcmVzZXJ2ZWQgPSBib3R0b21ZICsgKFZFUlRfUElYX1BBRERJTkcgKiAyKTsKLQkJCWdyb3Vwcy5yZW1vdmUodG9wKTsKLQkJfQotCQlpbnQgbmV4dCA9IEhPUklaX1BJWF9QQURESU5HOwotCQlmb3IgKGludCB4ID0gMDsgeCA8IHN0cmFnZ2xlcnMuc2l6ZSgpOyB4KyspIHsKLQkJCWludCBsaW1pdCA9IHJlc2VydmVkICsgMTsKLQkJCUFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQgcCA9IChBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0KSBzdHJhZ2dsZXJzCi0JCQkJCS5nZXQoeCk7Ci0JCQlSZWN0YW5nbGUgYm91bmRzID0gcC5nZXRGaWd1cmUoKS5nZXRCb3VuZHMoKTsKLQkJCUNoYW5nZUJvdW5kc0NvbW1hbmQgY2JjID0gbmV3IENoYW5nZUJvdW5kc0NvbW1hbmQodHJhbnNhY3Rpb25Eb21haW4sIChOb2RlKSBwCi0JCQkJCS5nZXRNb2RlbCgpLCBuZXcgUG9pbnQobmV4dCwgbGltaXQpLCBib3VuZHMud2lkdGgsIC0xKTsKLQkJCWdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUoY2JjKTsKLQkJCXAuZ2V0RmlndXJlKCkuc2V0TG9jYXRpb24obmV3IFBvaW50KG5leHQsIGxpbWl0KSk7Ci0JCQlwLnJlZnJlc2goKTsKLQkJCW5leHQgKz0gYm91bmRzLndpZHRoICsgSE9SSVpfUElYX1BBRERJTkc7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQgZ2V0VmVydGljYWxNaW5QYXJ0KExpc3QgcGFydHMpIHsKLQkJQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCByYyA9IHBhcnRzLnNpemUoKSA+IDAgPyAoQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCkgcGFydHMKLQkJCQkuZ2V0KDApCi0JCQkJOiBudWxsOwotCQlmb3IgKGludCB4ID0gMDsgeCA8IHBhcnRzLnNpemUoKTsgeCsrKSB7Ci0JCQlBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0IHAgPSAoQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCkgcGFydHMKLQkJCQkJLmdldCh4KTsKLQkJCWlmIChwLmdldEZpZ3VyZSgpLmdldEJvdW5kcygpLnkgPCByYy5nZXRGaWd1cmUoKS5nZXRCb3VuZHMoKS55KSB7Ci0JCQkJcmMgPSBwOwotCQkJfQotCQl9Ci0JCXJldHVybiByYzsKLQl9Ci0KLQlwcml2YXRlIEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQgZ2V0SG9yaXpvbnRhbE1pblBhcnQoTGlzdCBwYXJ0cykgewotCQlBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0IHJjID0gcGFydHMuc2l6ZSgpID4gMCA/IChBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0KSBwYXJ0cwotCQkJCS5nZXQoMCkKLQkJCQk6IG51bGw7Ci0JCWZvciAoaW50IHggPSAwOyB4IDwgcGFydHMuc2l6ZSgpOyB4KyspIHsKLQkJCUFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQgcCA9IChBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0KSBwYXJ0cwotCQkJCQkuZ2V0KHgpOwotCQkJaWYgKHAuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCkueCA8IHJjLmdldEZpZ3VyZSgpLmdldEJvdW5kcygpLngpIHsKLQkJCQlyYyA9IHA7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJjOwotCX0KLQotCXByaXZhdGUgQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCBnZXRWZXJ0aWNhbE1heFBhcnQoTGlzdCBwYXJ0cykgewotCQlBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0IHJjID0gcGFydHMuc2l6ZSgpID4gMCA/IChBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0KSBwYXJ0cwotCQkJCS5nZXQoMCkKLQkJCQk6IG51bGw7Ci0JCWZvciAoaW50IHggPSAwOyB4IDwgcGFydHMuc2l6ZSgpOyB4KyspIHsKLQkJCUFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQgcCA9IChBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0KSBwYXJ0cwotCQkJCQkuZ2V0KHgpOwotCQkJaWYgKHAuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCkuYm90dG9tKCkgPiByYy5nZXRGaWd1cmUoKS5nZXRCb3VuZHMoKQotCQkJCQkuYm90dG9tKCkpIHsKLQkJCQlyYyA9IHA7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJjOwotCX0KLQotCXB1YmxpYyB2b2lkIHZlcnRpY2FsQWxpZ25Ub0ZpcnN0U2VsZWN0ZWQoTGlzdCBlZGl0UGFydHMpIHsKLQkJLy8gZ2V0IHRoZSBzZWxlY3RlZCBpdGVtcwotCQkvLwkJTGlzdCBlZGl0UGFydHMgPSBnZXRHcmFwaGljYWxWaWV3ZXIoKS5nZXRTZWxlY3RlZEVkaXRQYXJ0cygpOwotCQlBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0IGFsaWduVG9QYXJ0ID0gbnVsbDsKLQkJLy8gZmluZCB0aGUgZmlyc3QgZGlhZ3JhbSBwYXJ0IHdlIGNhbiBhbGlnbiB0bwotCQlmb3IgKGludCBhID0gMDsgYSA8IGVkaXRQYXJ0cy5zaXplKCk7IGErKykgewotCQkJaWYgKGVkaXRQYXJ0cy5nZXQoYSkgaW5zdGFuY2VvZiBTaGFwZU5vZGVFZGl0UGFydCkgewotCQkJCUFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQgZXAgPSAoQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCkgZWRpdFBhcnRzCi0JCQkJCQkuZ2V0KGEpOwotCQkJCWlmIChhbGlnblRvUGFydCA9PSBudWxsKSB7Ci0JCQkJCS8vIHJlbWVtYmVyIGl0IGFuZCBzdG9wCi0JCQkJCWFsaWduVG9QYXJ0ID0gZXA7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCQkvLyBsb29wIHRocm91Z2ggdGhlIGVsZW1lbnRzIGFuZCBzZXQgdGhlaXIgbmV3IHBvc2l0aW9uCi0JCWZvciAoaW50IGEgPSAwOyBhIDwgZWRpdFBhcnRzLnNpemUoKTsgYSsrKSB7Ci0JCQlpZiAoZWRpdFBhcnRzLmdldChhKSBpbnN0YW5jZW9mIFNoYXBlTm9kZUVkaXRQYXJ0KSB7Ci0JCQkJQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCBlcCA9IChBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0KSBlZGl0UGFydHMKLQkJCQkJCS5nZXQoYSk7Ci0JCQkJLy8gd2UgY2FuIHNraXAgdGhlIGZpcnN0IG9uZSBzaW5jZSB0aGlzIGlzIGFuIGFsaWduLXRvCi0JCQkJaWYgKGVwICE9IGFsaWduVG9QYXJ0KSB7Ci0JCQkJCS8vIGNhbGN1bGF0ZSB0aGUgb2Zmc2V0IGZvciBjZW50ZXJsaW5lIGFsaWdubWVudAotCQkJCQlSZWN0YW5nbGUgYm91bmRzID0gZXAuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCk7Ci0JCQkJCVJlY3RhbmdsZSBhbGlnblRvUGFydEJvdW5kcyA9IGFsaWduVG9QYXJ0LmdldEZpZ3VyZSgpLmdldEJvdW5kcygpOwkJCQkJCi0JCQkJCURpbWVuc2lvbiBwcyA9IGFsaWduVG9QYXJ0LmdldEZpZ3VyZSgpLmdldFByZWZlcnJlZFNpemUoKTsJCQkJCQotCQkJCQlpbnQgb2Zmc2V0ID0gIGJvdW5kcy5nZXRDZW50ZXIoKS54IC0gYWxpZ25Ub1BhcnRCb3VuZHMuZ2V0Q2VudGVyKCkueDsKLQkJCQkJLy8gaXMgdGhpcyBpbnNpZGUgYSBjb250YWluZXI/Ci0JCQkJCWlmICghKGVwLmdldFBhcmVudCgpIGluc3RhbmNlb2YgRGlhZ3JhbUVkaXRQYXJ0KSkgewotCQkJCQkJLy8gYWRqdXN0IHRoZSBvZmZzZXQgc2luY2Ugd2UgYXJlIG1vdmluZyB0aGUKLQkJCQkJCS8vIGNvbnRhaW5lcgotCQkJCQkJZXAgPSAoQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCkgZXAuZ2V0UGFyZW50KCk7Ci0JCQkJCQlSZWN0YW5nbGUgcGFyZW50Qm91bmRzID0gZXAuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCk7Ci0JCQkJCQlvZmZzZXQgKz0gYm91bmRzLnggLSBwYXJlbnRCb3VuZHMueDsKLQkJCQkJCWJvdW5kcyA9IHBhcmVudEJvdW5kczsKLQkJCQkJfQotCQkJCQkvLyBzZW5kIHRoZSBjb21tYW5kIHRvIG1vdmUgdGhlIGVsZW1lbnQKLQkJCQkJb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQgYyA9IG5ldyBDaGFuZ2VCb3VuZHNDb21tYW5kKAotCQkJCQkJCXRyYW5zYWN0aW9uRG9tYWluLCAoTm9kZSkgZXAuZ2V0TW9kZWwoKSwgbmV3IFBvaW50KAotCQkJCQkJCQkJYWxpZ25Ub1BhcnQuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCkueAotCQkJCQkJCQkJCQktIG9mZnNldCwgYm91bmRzLnkpLCBib3VuZHMud2lkdGgsCi0JCQkJCQkJLTEpOwotCQkJCQlnZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKGMpOwotCQkJCQllcC5nZXRGaWd1cmUoKS5zZXRMb2NhdGlvbigKLQkJCQkJCQluZXcgUG9pbnQoYWxpZ25Ub1BhcnQuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCkueAotCQkJCQkJCQkJLSBvZmZzZXQsIGJvdW5kcy55KSk7Ci0JCQkJCVBvaW50IHNwID0gYWxpZ25Ub1BhcnQuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCkuZ2V0Q2VudGVyKCk7Ci0JCQkJCWJvb2xlYW4gY29ubmVjdGVkID0gZmFsc2U7Ci0JCQkJCS8vIGNoZWNrIGlmIHRoZSBwYXJ0IGlzIGNvbm5lY3RlZCB2aWEgc291cmNlIGNvbm5lY3Rpb25zCi0JCQkJCUxpc3QgbGlzdCA9ICgoU2hhcGVOb2RlRWRpdFBhcnQpIGFsaWduVG9QYXJ0KQotCQkJCQkJCS5nZXRTb3VyY2VDb25uZWN0aW9ucygpOwotCQkJCQlmb3IgKEl0ZXJhdG9yIGl0b3IgPSBsaXN0Lml0ZXJhdG9yKCk7IGl0b3IuaGFzTmV4dCgpOykgewotCQkJCQkJQ29ubmVjdGlvbk5vZGVFZGl0UGFydCBscCA9IChDb25uZWN0aW9uTm9kZUVkaXRQYXJ0KSBpdG9yCi0JCQkJCQkJCS5uZXh0KCk7Ci0JCQkJCQlpZiAobHAuZ2V0VGFyZ2V0KCkuZXF1YWxzKGVwKSkgewotCQkJCQkJCWNvbm5lY3RlZCA9IHRydWU7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJLy8gaWYgbm90IGZvdW5kIGFib3ZlLCBjaGVjayBpZiBpdCBpcyBjb25uZWN0ZWQgdmlhIHRhcmdldCBjb25uZWN0aW9ucwotCQkJCQlpZiAoIWNvbm5lY3RlZCkgewotCQkJCQkJbGlzdCA9ICgoU2hhcGVOb2RlRWRpdFBhcnQpIGFsaWduVG9QYXJ0KQotCQkJCQkJCQkuZ2V0VGFyZ2V0Q29ubmVjdGlvbnMoKTsKLQkJCQkJCWZvciAoSXRlcmF0b3IgaXRvciA9IGxpc3QuaXRlcmF0b3IoKTsgaXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJQ29ubmVjdGlvbk5vZGVFZGl0UGFydCBscCA9IChDb25uZWN0aW9uTm9kZUVkaXRQYXJ0KSBpdG9yCi0JCQkJCQkJCQkubmV4dCgpOwotCQkJCQkJCWlmIChscC5nZXRTb3VyY2UoKS5lcXVhbHMoZXApKSB7Ci0JCQkJCQkJCWNvbm5lY3RlZCA9IHRydWU7Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlQb2ludCBwID0gbmV3IFBvaW50KCk7Ci0JCQkJCXAueCA9ICgoSW50ZWdlcikgVmlld1V0aWwuZ2V0U3RydWN0dXJhbEZlYXR1cmVWYWx1ZSgKLQkJCQkJCQkoVmlldykgZXAuZ2V0TW9kZWwoKSwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJLmdldExvY2F0aW9uX1goKSkpLmludFZhbHVlKCk7Ci0JCQkJCXAueSA9ICgoSW50ZWdlcikgVmlld1V0aWwuZ2V0U3RydWN0dXJhbEZlYXR1cmVWYWx1ZSgKLQkJCQkJCQkoVmlldykgZXAuZ2V0TW9kZWwoKSwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJLmdldExvY2F0aW9uX1koKSkpLmludFZhbHVlKCk7Ci0JCQkJCVBvaW50IHRwID0gcC5nZXRDb3B5KCk7Ci0JCQkJCVBvaW50IGNlbnRlclBvaW50ID0gZXAuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCkuZ2V0Q2VudGVyKCk7Ci0JCQkJCWludCBkZWx0YSA9IHNwLnggLSBjZW50ZXJQb2ludC54OwotCQkJCQl0cC54ID0gdHAueCArIGRlbHRhOwotCQkJCQljID0gbmV3IENoYW5nZUJvdW5kc0NvbW1hbmQodHJhbnNhY3Rpb25Eb21haW4sIChOb2RlKSBlcAotCQkJCQkJCS5nZXRNb2RlbCgpLCB0cCwgZXAuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCkud2lkdGgsCi0JCQkJCQkJLTEpOwotCQkJCQlnZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKGMpOwotCQkJCQllcC5nZXRGaWd1cmUoKS5zZXRMb2NhdGlvbihuZXcgUG9pbnQodHAueCwgdHAueSkpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkKLQotCS8qKgotCSAqIFJldHVybiBoZWlnaHQgb2YgdGV4dCBvZiB0aCBlbm9kZQotCSAqIAotCSAqIEBwYXJhbSBub2RlCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgRGltZW5zaW9uIGdldFRleHREaW1lbnNpb24oU3RyaW5nIHRleHQpIHsKLQkJaWYgKHRleHQgIT0gbnVsbCl7Ci0JCQlGb250IGYgPSBEaWFncmFtQ29uc3RhbnRzLkRFRkFVTFRfRk9OVDsKLQkJCURpbWVuc2lvbiBkID0gRmlndXJlVXRpbGl0aWVzLmdldFRleHRFeHRlbnRzKHRleHQsIGYpOwotCi0JCQlpZiAoZCAhPSBudWxsKQotCQkJCXJldHVybiBkOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgYW55T2JsaXF1ZUxpbmtzKEFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRQYXJ0IGRlcCwKLQkJCUxpc3QgcmVjZW50bHlBZGRlZENoaWxkcmVuKSB7Ci0JCUxpc3QgY2hpbGRyZW4gPSBkZXAuZ2V0Q2hpbGRyZW4oKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGNoaWxkcmVuLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCUlHcmFwaGljYWxFZGl0UGFydCBwYXJ0ID0gKElHcmFwaGljYWxFZGl0UGFydCkgaXRlcmF0b3IubmV4dCgpOwotCQkJaWYocGFydCBpbnN0YW5jZW9mIFJvbGVUYXNrQ29tcG9zaXRlRWRpdFBhcnQpewotCQkJCUxpc3QgZ3JhbmRDaGlsZHJlbiA9ICgoUm9sZVRhc2tDb21wb3NpdGVFZGl0UGFydClwYXJ0KS5nZXRDaGlsZHJlbigpOwotCQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IyID0gZ3JhbmRDaGlsZHJlbi5pdGVyYXRvcigpOyBpdGVyYXRvcjIKLQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCVNoYXBlTm9kZUVkaXRQYXJ0IGNoaWxkID0gKFNoYXBlTm9kZUVkaXRQYXJ0KSBpdGVyYXRvcjIKLQkJCQkJCQkubmV4dCgpOwotCQkJCQlpZiAoY2hpbGQgaW5zdGFuY2VvZiBUYXNrTm9kZUVkaXRQYXJ0KSB7Ci0JCQkJCQlQb2ludCBwID0gY2hpbGQuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCkuZ2V0Q2VudGVyKCk7Ci0JCQkJCQlMaXN0IGNvbm5lY3RlZCA9IGNoaWxkLmdldFRhcmdldENvbm5lY3Rpb25zKCk7Ci0JCQkJCQlpZiAoIWNvbm5lY3RlZC5pc0VtcHR5KCkpIHsKLQkJCQkJCQlBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0IGxpbmtlZFBhcnQgPSAoQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCkgKChDb25uZWN0aW9uTm9kZUVkaXRQYXJ0KSBjb25uZWN0ZWQKLQkJCQkJCQkJCS5nZXQoMCkpLmdldFNvdXJjZSgpOwotCQkJCQkJCVBvaW50IHB0ID0gbGlua2VkUGFydC5nZXRGaWd1cmUoKS5nZXRCb3VuZHMoKQotCQkJCQkJCQkJLmdldENlbnRlcigpOwotCQkJCQkJCWlmIChwLnggIT0gcHQueCkgewotCQkJCQkJCQlpZiAoIXJlY2VudGx5QWRkZWRDaGlsZHJlbi5jb250YWlucyhwYXJ0KSkgewotCQkJCQkJCQkJcmVjZW50bHlBZGRlZENoaWxkcmVuLmFkZChwYXJ0KTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCWNvbm5lY3RlZCA9IGNoaWxkLmdldFNvdXJjZUNvbm5lY3Rpb25zKCk7Ci0JCQkJCQlpZiAoIWNvbm5lY3RlZC5pc0VtcHR5KCkpIHsKLQkJCQkJCQlBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0IGxpbmtlZFBhcnQgPSAoQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCkgKChDb25uZWN0aW9uTm9kZUVkaXRQYXJ0KWNvbm5lY3RlZAotCQkJCQkJCQkJLmdldCgwKSkuZ2V0U291cmNlKCk7Ci0JCQkJCQkJUG9pbnQgcHMgPSBsaW5rZWRQYXJ0LmdldEZpZ3VyZSgpLmdldEJvdW5kcygpCi0JCQkJCQkJCQkuZ2V0Q2VudGVyKCk7Ci0JCQkJCQkJaWYgKHAueCAhPSBwcy54KSB7Ci0JCQkJCQkJCWlmICghcmVjZW50bHlBZGRlZENoaWxkcmVuLmNvbnRhaW5zKHBhcnQpKSB7Ci0JCQkJCQkJCQlyZWNlbnRseUFkZGVkQ2hpbGRyZW4uYWRkKHBhcnQpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL3ZpZXcvZmFjdG9yaWVzL0FjdGl2aXR5RGV0YWlsRGlhZ3JhbVZpZXdGYWN0b3J5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC92aWV3L2ZhY3Rvcmllcy9BY3Rpdml0eURldGFpbERpYWdyYW1WaWV3RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZTVhOTcxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL3ZpZXcvZmFjdG9yaWVzL0FjdGl2aXR5RGV0YWlsRGlhZ3JhbVZpZXdGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQudmlldy5mYWN0b3JpZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnZpZXcuZmFjdG9yaWVzLkRpYWdyYW1WaWV3RmFjdG9yeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk1lYXN1cmVtZW50VW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob3RhdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eURldGFpbERpYWdyYW1WaWV3RmFjdG9yeSBleHRlbmRzIERpYWdyYW1WaWV3RmFjdG9yeSB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIAotCSAqLwotCXByb3RlY3RlZCBMaXN0IGNyZWF0ZVN0eWxlcyhWaWV3IHZpZXcpIHsKLQkJTGlzdCBzdHlsZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXN0eWxlcy5hZGQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQYWdlU3R5bGUoKSk7Ci0JCXN0eWxlcy5hZGQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVHdWlkZVN0eWxlKCkpOwotCQlzdHlsZXMuYWRkKE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRGVzY3JpcHRpb25TdHlsZSgpKTsKLQkJcmV0dXJuIHN0eWxlczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZGVjb3JhdGVWaWV3KFZpZXcgdmlldywgSUFkYXB0YWJsZSBzZW1hbnRpY0FkYXB0ZXIsCi0JCQlTdHJpbmcgZGlhZ3JhbUtpbmQpIHsKLQkJc3VwZXIuZGVjb3JhdGVWaWV3KHZpZXcsIHNlbWFudGljQWRhcHRlciwgZGlhZ3JhbUtpbmQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTWVhc3VyZW1lbnRVbml0IGdldE1lYXN1cmVtZW50VW5pdCgpIHsKLQkJcmV0dXJuIE1lYXN1cmVtZW50VW5pdC5QSVhFTF9MSVRFUkFMOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvdmlldy9mYWN0b3JpZXMvTGlua05hbWVWaWV3RmFjdG9yeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvdmlldy9mYWN0b3JpZXMvTGlua05hbWVWaWV3RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNDk2MDllLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL3ZpZXcvZmFjdG9yaWVzL0xpbmtOYW1lVmlld0ZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC52aWV3LmZhY3RvcmllczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLnByZWZlcmVuY2VzLlByZWZlcmVuY2VzSGludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnZpZXcuZmFjdG9yaWVzLkFic3RyYWN0TGFiZWxWaWV3RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS51dGlsLk1lYXN1cmVtZW50VW5pdEhlbHBlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5tYXBtb2RlLklNYXBNb2RlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTG9jYXRpb247Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgTGlua05hbWVWaWV3RmFjdG9yeSBleHRlbmRzIEFic3RyYWN0TGFiZWxWaWV3RmFjdG9yeSB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFZpZXcgY3JlYXRlVmlldyhJQWRhcHRhYmxlIHNlbWFudGljQWRhcHRlciwgVmlldyBjb250YWluZXJWaWV3LAotCQkJU3RyaW5nIHNlbWFudGljSGludCwgaW50IGluZGV4LCBib29sZWFuIHBlcnNpc3RlZCwKLQkJCVByZWZlcmVuY2VzSGludCBwcmVmZXJlbmNlc0hpbnQpIHsKLQkJTm9kZSB2aWV3ID0gKE5vZGUpIHN1cGVyLmNyZWF0ZVZpZXcoc2VtYW50aWNBZGFwdGVyLCBjb250YWluZXJWaWV3LAotCQkJCXNlbWFudGljSGludCwgaW5kZXgsIHBlcnNpc3RlZCwgcHJlZmVyZW5jZXNIaW50KTsKLQkJTG9jYXRpb24gbG9jYXRpb24gPSAoTG9jYXRpb24pIHZpZXcuZ2V0TGF5b3V0Q29uc3RyYWludCgpOwotCQlJTWFwTW9kZSBtYXBNb2RlID0gTWVhc3VyZW1lbnRVbml0SGVscGVyLmdldE1hcE1vZGUoY29udGFpbmVyVmlldwotCQkJCS5nZXREaWFncmFtKCkuZ2V0TWVhc3VyZW1lbnRVbml0KCkpOwotCQlsb2NhdGlvbi5zZXRYKG1hcE1vZGUuRFB0b0xQKDApKTsKLQkJbG9jYXRpb24uc2V0WShtYXBNb2RlLkRQdG9MUCg0MCkpOwotCQlyZXR1cm4gdmlldzsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIExpc3QgY3JlYXRlU3R5bGVzKFZpZXcgdmlldykgewotCQlMaXN0IHN0eWxlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJcmV0dXJuIHN0eWxlczsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC92aWV3L2ZhY3Rvcmllcy9MaW5rVmlld0ZhY3RvcnkuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL3ZpZXcvZmFjdG9yaWVzL0xpbmtWaWV3RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NDBkNzI2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL3ZpZXcvZmFjdG9yaWVzL0xpbmtWaWV3RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC52aWV3LmZhY3RvcmllczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FY29yZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlRyYW5zYWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5UcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYud29ya3NwYWNlLkFic3RyYWN0RU1GT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBhcnRzLkFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBhcnRzLkxpbmtFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wYXJ0cy5MaW5rTmFtZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5wYXJ0LkRpYWdyYW1WaXN1YWxJRFJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi5jb3JlLnV0aWwuTG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi5jb3JlLnV0aWwuU3RyaW5nU3RhdGljczsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS51dGlsLlRyYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5wcmVmZXJlbmNlcy5QcmVmZXJlbmNlc0hpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLnV0aWwuVmlld1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5pbnRlcm5hbC5EaWFncmFtVUlEZWJ1Z09wdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5pbnRlcm5hbC5EaWFncmFtVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5pbnRlcm5hbC5EaWFncmFtVUlTdGF0dXNDb2RlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnZpZXcuZmFjdG9yaWVzLkNvbm5lY3Rpb25WaWV3RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5CZW5kcG9pbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkVkZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm90YXRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgTGlua1ZpZXdGYWN0b3J5IGV4dGVuZHMgQ29ubmVjdGlvblZpZXdGYWN0b3J5IHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIE1hcCBvcHRpb25zID0gbmV3IEhhc2hNYXAoKTsKLQlzdGF0aWMgewotCQlvcHRpb25zLnB1dChUcmFuc2FjdGlvbi5PUFRJT05fVU5QUk9URUNURUQsIEJvb2xlYW4uVFJVRSk7Ci0JCW9wdGlvbnMucHV0KFRyYW5zYWN0aW9uLk9QVElPTl9OT19OT1RJRklDQVRJT05TLCBCb29sZWFuLlRSVUUpOwotCQlvcHRpb25zLnB1dChUcmFuc2FjdGlvbi5PUFRJT05fTk9fVFJJR0dFUlMsIEJvb2xlYW4uVFJVRSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCAKLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBjcmVhdGVTdHlsZXMoVmlldyB2aWV3KSB7Ci0JCUxpc3Qgc3R5bGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlzdHlsZXMuYWRkKE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUm91dGluZ1N0eWxlKCkpOwotCQlzdHlsZXMuYWRkKE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRm9udFN0eWxlKCkpOwotCQlyZXR1cm4gc3R5bGVzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkZWNvcmF0ZVZpZXcoVmlldyBjb250YWluZXJWaWV3LCBWaWV3IHZpZXcsCi0JCQlJQWRhcHRhYmxlIHNlbWFudGljQWRhcHRlciwgU3RyaW5nIHNlbWFudGljSGludCwgaW50IGluZGV4LAotCQkJYm9vbGVhbiBwZXJzaXN0ZWQpIHsKLQkJaWYgKHNlbWFudGljSGludCA9PSBudWxsKSB7Ci0JCQlzZW1hbnRpY0hpbnQgPSBEaWFncmFtVmlzdWFsSURSZWdpc3RyeQotCQkJCQkuZ2V0VHlwZShMaW5rRWRpdFBhcnQuVklTVUFMX0lEKTsKLQkJCXZpZXcuc2V0VHlwZShzZW1hbnRpY0hpbnQpOwotCQl9Ci0JCXN1cGVyLmRlY29yYXRlVmlldyhjb250YWluZXJWaWV3LCB2aWV3LCBzZW1hbnRpY0FkYXB0ZXIsIHNlbWFudGljSGludCwKLQkJCQlpbmRleCwgcGVyc2lzdGVkKTsKLQkJaWYgKCFBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0UGFydC5NT0RFTF9JRAotCQkJCS5lcXVhbHMoRGlhZ3JhbVZpc3VhbElEUmVnaXN0cnkuZ2V0TW9kZWxJRChjb250YWluZXJWaWV3KSkpIHsKLQkJCUVBbm5vdGF0aW9uIHNob3J0Y3V0QW5ub3RhdGlvbiA9IEVjb3JlRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkJLmNyZWF0ZUVBbm5vdGF0aW9uKCk7Ci0JCQlzaG9ydGN1dEFubm90YXRpb24uc2V0U291cmNlKCJTaG9ydGN1dCIpOyAvLyROT04tTkxTLTEkCi0JCQlzaG9ydGN1dEFubm90YXRpb24uZ2V0RGV0YWlscygpLnB1dCgKLQkJCQkJIm1vZGVsSUQiLCBBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0UGFydC5NT0RFTF9JRCk7IC8vJE5PTi1OTFMtMSQKLQkJCXZpZXcuZ2V0RUFubm90YXRpb25zKCkuYWRkKHNob3J0Y3V0QW5ub3RhdGlvbik7Ci0JCX0KLQkJZ2V0Vmlld1NlcnZpY2UoKS5jcmVhdGVOb2RlKHNlbWFudGljQWRhcHRlciwgdmlldywKLQkJCQlEaWFncmFtVmlzdWFsSURSZWdpc3RyeS5nZXRUeXBlKExpbmtOYW1lRWRpdFBhcnQuVklTVUFMX0lEKSwKLQkJCQlWaWV3VXRpbC5BUFBFTkQsIHRydWUsIGdldFByZWZlcmVuY2VzSGludCgpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS52aWV3LmZhY3Rvcmllcy5WaWV3RmFjdG9yeSNjcmVhdGVWaWV3KG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlLCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3LCBqYXZhLmxhbmcuU3RyaW5nLCBpbnQsIGJvb2xlYW4sIGphdmEubGFuZy5TdHJpbmcpCi0JICogCi0JICogT3ZlcnJpZGUgY3JlYXRlVmlldyBzaW5jZSB0aGVyZSBpcyBhIGJ1ZyBpbiAKLQkgKiBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnZpZXcuZmFjdG9yaWVzLkNvbm5lY3Rpb25WaWV3RmFjdG9yeS5qYXZhCi0JICovCi0JcHVibGljIFZpZXcgY3JlYXRlVmlldyhmaW5hbCBJQWRhcHRhYmxlIHNlbWFudGljQWRhcHRlciwKLQkJCWZpbmFsIFZpZXcgY29udGFpbmVyVmlldywgZmluYWwgU3RyaW5nIHNlbWFudGljSGludCwKLQkJCWZpbmFsIGludCBpbmRleCwgZmluYWwgYm9vbGVhbiBwZXJzaXN0ZWQsCi0JCQlmaW5hbCBQcmVmZXJlbmNlc0hpbnQgcHJlZmVyZW5jZXNIaW50KSB7Ci0KLQkJc2V0UHJlZmVyZW5jZXNIaW50KHByZWZlcmVuY2VzSGludCk7Ci0KLQkJZmluYWwgRWRnZSBlZGdlID0gTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVFZGdlKCk7Ci0JCUxpc3Qgc3R5bGVzID0gY3JlYXRlU3R5bGVzKGVkZ2UpOwotCQlpZiAoc3R5bGVzLnNpemUoKSA+IDApIHsKLQkJCWVkZ2UuZ2V0U3R5bGVzKCkuYWRkQWxsKHN0eWxlcyk7Ci0JCX0KLQotCQlCZW5kcG9pbnRzIGJlbmRQb2ludHMgPSBjcmVhdGVCZW5kcG9pbnRzKCk7Ci0JCWlmIChiZW5kUG9pbnRzICE9IG51bGwpIHsKLQkJCWVkZ2Uuc2V0QmVuZHBvaW50cyhiZW5kUG9pbnRzKTsKLQkJfQotCi0JCUVPYmplY3Qgc2VtYW50aWNFbCA9IHNlbWFudGljQWRhcHRlciA9PSBudWxsID8gbnVsbAotCQkJCTogKEVPYmplY3QpIHNlbWFudGljQWRhcHRlci5nZXRBZGFwdGVyKEVPYmplY3QuY2xhc3MpOwotCQlpZiAoc2VtYW50aWNFbCA9PSBudWxsKQotCQkJLy8gZW5mb3JjZSBhIHNldCB0byBOVUxMCi0JCQllZGdlLnNldEVsZW1lbnQobnVsbCk7Ci0JCWVsc2UgaWYgKHJlcXVpcmVzRWxlbWVudChzZW1hbnRpY0FkYXB0ZXIsIGNvbnRhaW5lclZpZXcpKSB7Ci0JCQllZGdlLnNldEVsZW1lbnQoc2VtYW50aWNFbCk7Ci0JCX0KLQotCQllZGdlLnNldFR5cGUoc2VtYW50aWNIaW50KTsKLQotCQkvLyBkZWNvcmF0ZSB2aWV3IGFzc3VtZXMgdGhlIHZpZXcgaGFkIGJlZW4gaW5zZXJ0ZWQgYWxyZWFkeSwgc28gCi0JCS8vIHdlIGhhZCB0byBjYWxsIGluc2VydCBjaGlsZCBiZWZvcmUgY2FsbGluZyBkZWNvcmF0ZSB2aWV3Ci0JCVZpZXdVdGlsLmluc2VydENoaWxkVmlldyhjb250YWluZXJWaWV3LCBlZGdlLCBpbmRleCwgcGVyc2lzdGVkKTsKLQotCQlUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiBkb21haW4gPSBnZXRFZGl0aW5nRG9tYWluKHNlbWFudGljRWwsCi0JCQkJY29udGFpbmVyVmlldyk7Ci0KLQkJaWYgKGRvbWFpbiAhPSBudWxsKSB7Ci0JCQlpZiAoaXNVblByb3RlY3RlZFNpbGVudFRyYW5zYWN0aW9uSW5Qcm9ncmVzcyhkb21haW4pKSB7Ci0JCQkJLy8gZGVjb3JhdGUgdmlldyBoYWQgdG8gcnVuIGFzIGEgc2lsZW50IG9wZXJhdGlvbiBvdGhlciB3aXNlCi0JCQkJLy8gaXQgd2lsbCBnZW5lcmF0ZSB0b28gbWFueSBldmVudHMKLQkJCQlkZWNvcmF0ZVZpZXcoY29udGFpbmVyVmlldywgZWRnZSwgc2VtYW50aWNBZGFwdGVyLAotCQkJCQkJc2VtYW50aWNIaW50LCBpbmRleCwgdHJ1ZSk7Ci0KLQkJCX0gZWxzZSB7Ci0JCQkJQWJzdHJhY3RFTUZPcGVyYXRpb24gb3BlcmF0aW9uID0gbmV3IEFic3RyYWN0RU1GT3BlcmF0aW9uKAotCQkJCQkJZG9tYWluLCBTdHJpbmdTdGF0aWNzLkJMQU5LLCBvcHRpb25zKSB7Ci0KLQkJCQkJcHJvdGVjdGVkIElTdGF0dXMgZG9FeGVjdXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwKLQkJCQkJCQlJQWRhcHRhYmxlIGluZm8pIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCQkJCQkJZGVjb3JhdGVWaWV3KGNvbnRhaW5lclZpZXcsIGVkZ2UsIHNlbWFudGljQWRhcHRlciwKLQkJCQkJCQkJc2VtYW50aWNIaW50LCBpbmRleCwgdHJ1ZSk7Ci0KLQkJCQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCQkJCQl9Ci0JCQkJfTsKLQkJCQl0cnkgewotCQkJCQlvcGVyYXRpb24uZXhlY3V0ZShuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpLCBudWxsKTsKLQkJCQl9IGNhdGNoIChFeGVjdXRpb25FeGNlcHRpb24gZSkgewotCQkJCQlUcmFjZS5jYXRjaGluZyhEaWFncmFtVUlQbHVnaW4uZ2V0SW5zdGFuY2UoKSwKLQkJCQkJCQlEaWFncmFtVUlEZWJ1Z09wdGlvbnMuRVhDRVBUSU9OU19DQVRDSElORywKLQkJCQkJCQlnZXRDbGFzcygpLCAiY3JlYXRlVmlldyIsIGUpOyAvLyROT04tTkxTLTEkCi0JCQkJCUxvZy53YXJuaW5nKERpYWdyYW1VSVBsdWdpbi5nZXRJbnN0YW5jZSgpLAotCQkJCQkJCURpYWdyYW1VSVN0YXR1c0NvZGVzLklHTk9SRURfRVhDRVBUSU9OX1dBUk5JTkcsCi0JCQkJCQkJImNyZWF0ZVZpZXciLCBlKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiBlZGdlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvdmlldy9mYWN0b3JpZXMvUm9sZU5vZGVOYW1lVmlld0ZhY3RvcnkuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL3ZpZXcvZmFjdG9yaWVzL1JvbGVOb2RlTmFtZVZpZXdGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkNjUzOWQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvdmlldy9mYWN0b3JpZXMvUm9sZU5vZGVOYW1lVmlld0ZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC52aWV3LmZhY3RvcmllczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkudmlldy5mYWN0b3JpZXMuQmFzaWNOb2RlVmlld0ZhY3Rvcnk7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUm9sZU5vZGVOYW1lVmlld0ZhY3RvcnkgZXh0ZW5kcyBCYXNpY05vZGVWaWV3RmFjdG9yeSB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZGVjb3JhdGVWaWV3KFZpZXcgY29udGFpbmVyVmlldywgVmlldyB2aWV3LAotCQkJSUFkYXB0YWJsZSBzZW1hbnRpY0FkYXB0ZXIsIFN0cmluZyBzZW1hbnRpY0hpbnQsIGludCBpbmRleCwKLQkJCWJvb2xlYW4gcGVyc2lzdGVkKSB7Ci0JCXN1cGVyLmRlY29yYXRlVmlldyhjb250YWluZXJWaWV3LCB2aWV3LCBzZW1hbnRpY0FkYXB0ZXIsIHNlbWFudGljSGludCwKLQkJCQlpbmRleCwgcGVyc2lzdGVkKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIExpc3QgY3JlYXRlU3R5bGVzKFZpZXcgdmlldykgewotCQlMaXN0IHN0eWxlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJcmV0dXJuIHN0eWxlczsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC92aWV3L2ZhY3Rvcmllcy9Sb2xlTm9kZVZpZXdGYWN0b3J5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC92aWV3L2ZhY3Rvcmllcy9Sb2xlTm9kZVZpZXdGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlYjcyODEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvdmlldy9mYWN0b3JpZXMvUm9sZU5vZGVWaWV3RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLnZpZXcuZmFjdG9yaWVzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FY29yZUZhY3Rvcnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wYXJ0cy5BY3Rpdml0eURldGFpbERpYWdyYW1FZGl0UGFydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBhcnRzLlJvbGVOb2RlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucGFydHMuUm9sZU5vZGVOYW1lRWRpdFBhcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQucGFydC5EaWFncmFtVmlzdWFsSURSZWdpc3RyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS51dGlsLlZpZXdVdGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS52aWV3LmZhY3Rvcmllcy5BYnN0cmFjdFNoYXBlVmlld0ZhY3Rvcnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob3RhdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBSb2xlTm9kZVZpZXdGYWN0b3J5IGV4dGVuZHMgQWJzdHJhY3RTaGFwZVZpZXdGYWN0b3J5IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgCi0JICovCi0JcHJvdGVjdGVkIExpc3QgY3JlYXRlU3R5bGVzKFZpZXcgdmlldykgewotCQlMaXN0IHN0eWxlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJc3R5bGVzLmFkZChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZvbnRTdHlsZSgpKTsKLQkJc3R5bGVzLmFkZChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZURlc2NyaXB0aW9uU3R5bGUoKSk7Ci0JCXN0eWxlcy5hZGQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGaWxsU3R5bGUoKSk7Ci0JCXN0eWxlcy5hZGQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVMaW5lU3R5bGUoKSk7Ci0JCXJldHVybiBzdHlsZXM7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRlY29yYXRlVmlldyhWaWV3IGNvbnRhaW5lclZpZXcsIFZpZXcgdmlldywKLQkJCUlBZGFwdGFibGUgc2VtYW50aWNBZGFwdGVyLCBTdHJpbmcgc2VtYW50aWNIaW50LCBpbnQgaW5kZXgsCi0JCQlib29sZWFuIHBlcnNpc3RlZCkgewotCQlpZiAoc2VtYW50aWNIaW50ID09IG51bGwpIHsKLQkJCXNlbWFudGljSGludCA9IERpYWdyYW1WaXN1YWxJRFJlZ2lzdHJ5Ci0JCQkJCS5nZXRUeXBlKFJvbGVOb2RlRWRpdFBhcnQuVklTVUFMX0lEKTsKLQkJCXZpZXcuc2V0VHlwZShzZW1hbnRpY0hpbnQpOwotCQl9Ci0JCXN1cGVyLmRlY29yYXRlVmlldyhjb250YWluZXJWaWV3LCB2aWV3LCBzZW1hbnRpY0FkYXB0ZXIsIHNlbWFudGljSGludCwKLQkJCQlpbmRleCwgcGVyc2lzdGVkKTsKLQkJaWYgKCFBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0UGFydC5NT0RFTF9JRAotCQkJCS5lcXVhbHMoRGlhZ3JhbVZpc3VhbElEUmVnaXN0cnkuZ2V0TW9kZWxJRChjb250YWluZXJWaWV3KSkpIHsKLQkJCUVBbm5vdGF0aW9uIHNob3J0Y3V0QW5ub3RhdGlvbiA9IEVjb3JlRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkJLmNyZWF0ZUVBbm5vdGF0aW9uKCk7Ci0JCQlzaG9ydGN1dEFubm90YXRpb24uc2V0U291cmNlKCJTaG9ydGN1dCIpOyAvLyROT04tTkxTLTEkCi0JCQlzaG9ydGN1dEFubm90YXRpb24uZ2V0RGV0YWlscygpLnB1dCgKLQkJCQkJIm1vZGVsSUQiLCBBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0UGFydC5NT0RFTF9JRCk7IC8vJE5PTi1OTFMtMSQKLQkJCXZpZXcuZ2V0RUFubm90YXRpb25zKCkuYWRkKHNob3J0Y3V0QW5ub3RhdGlvbik7Ci0JCX0KLQkJZ2V0Vmlld1NlcnZpY2UoKQotCQkJCS5jcmVhdGVOb2RlKAotCQkJCQkJc2VtYW50aWNBZGFwdGVyLAotCQkJCQkJdmlldywKLQkJCQkJCURpYWdyYW1WaXN1YWxJRFJlZ2lzdHJ5Ci0JCQkJCQkJCS5nZXRUeXBlKFJvbGVOb2RlTmFtZUVkaXRQYXJ0LlZJU1VBTF9JRCksCi0JCQkJCQlWaWV3VXRpbC5BUFBFTkQsIHRydWUsIGdldFByZWZlcmVuY2VzSGludCgpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL3ZpZXcvZmFjdG9yaWVzL1JvbGVUYXNrQ29tcG9zaXRlUm9sZVRhc2tDb21wYXJ0bWVudFZpZXdGYWN0b3J5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC92aWV3L2ZhY3Rvcmllcy9Sb2xlVGFza0NvbXBvc2l0ZVJvbGVUYXNrQ29tcGFydG1lbnRWaWV3RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NzhkYTQzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL3ZpZXcvZmFjdG9yaWVzL1JvbGVUYXNrQ29tcG9zaXRlUm9sZVRhc2tDb21wYXJ0bWVudFZpZXdGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQudmlldy5mYWN0b3JpZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVjb3JlRmFjdG9yeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBhcnRzLkFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRQYXJ0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucGFydHMuUm9sZVRhc2tDb21wb3NpdGVSb2xlVGFza0NvbXBhcnRtZW50RWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLnBhcnQuRGlhZ3JhbVZpc3VhbElEUmVnaXN0cnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnZpZXcuZmFjdG9yaWVzLkxpc3RDb21wYXJ0bWVudFZpZXdGYWN0b3J5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRHJhd2VyU3R5bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm90YXRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vdGF0aW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5UaXRsZVN0eWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUm9sZVRhc2tDb21wb3NpdGVSb2xlVGFza0NvbXBhcnRtZW50Vmlld0ZhY3RvcnkgZXh0ZW5kcwotCQlMaXN0Q29tcGFydG1lbnRWaWV3RmFjdG9yeSB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIAotCSAqLwotCXByb3RlY3RlZCBMaXN0IGNyZWF0ZVN0eWxlcyhWaWV3IHZpZXcpIHsKLQkJTGlzdCBzdHlsZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXN0eWxlcy5hZGQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVTb3J0aW5nU3R5bGUoKSk7Ci0JCXN0eWxlcy5hZGQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGaWx0ZXJpbmdTdHlsZSgpKTsKLQkJcmV0dXJuIHN0eWxlczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZGVjb3JhdGVWaWV3KFZpZXcgY29udGFpbmVyVmlldywgVmlldyB2aWV3LAotCQkJSUFkYXB0YWJsZSBzZW1hbnRpY0FkYXB0ZXIsIFN0cmluZyBzZW1hbnRpY0hpbnQsIGludCBpbmRleCwKLQkJCWJvb2xlYW4gcGVyc2lzdGVkKSB7Ci0JCWlmIChzZW1hbnRpY0hpbnQgPT0gbnVsbCkgewotCQkJc2VtYW50aWNIaW50ID0gRGlhZ3JhbVZpc3VhbElEUmVnaXN0cnkKLQkJCQkJLmdldFR5cGUoUm9sZVRhc2tDb21wb3NpdGVSb2xlVGFza0NvbXBhcnRtZW50RWRpdFBhcnQuVklTVUFMX0lEKTsKLQkJCXZpZXcuc2V0VHlwZShzZW1hbnRpY0hpbnQpOwotCQl9Ci0JCXN1cGVyLmRlY29yYXRlVmlldyhjb250YWluZXJWaWV3LCB2aWV3LCBzZW1hbnRpY0FkYXB0ZXIsIHNlbWFudGljSGludCwKLQkJCQlpbmRleCwgcGVyc2lzdGVkKTsKLQkJc2V0dXBDb21wYXJ0bWVudFRpdGxlKHZpZXcpOwotCQlzZXR1cENvbXBhcnRtZW50Q29sbGFwc2VkKHZpZXcpOwotCQlpZiAoIUFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRQYXJ0Lk1PREVMX0lECi0JCQkJLmVxdWFscyhEaWFncmFtVmlzdWFsSURSZWdpc3RyeS5nZXRNb2RlbElEKGNvbnRhaW5lclZpZXcpKSkgewotCQkJRUFubm90YXRpb24gc2hvcnRjdXRBbm5vdGF0aW9uID0gRWNvcmVGYWN0b3J5LmVJTlNUQU5DRQotCQkJCQkuY3JlYXRlRUFubm90YXRpb24oKTsKLQkJCXNob3J0Y3V0QW5ub3RhdGlvbi5zZXRTb3VyY2UoIlNob3J0Y3V0Iik7IC8vJE5PTi1OTFMtMSQKLQkJCXNob3J0Y3V0QW5ub3RhdGlvbi5nZXREZXRhaWxzKCkucHV0KAotCQkJCQkibW9kZWxJRCIsIEFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRQYXJ0Lk1PREVMX0lEKTsgLy8kTk9OLU5MUy0xJAotCQkJdmlldy5nZXRFQW5ub3RhdGlvbnMoKS5hZGQoc2hvcnRjdXRBbm5vdGF0aW9uKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXR1cENvbXBhcnRtZW50VGl0bGUoVmlldyB2aWV3KSB7Ci0JCVRpdGxlU3R5bGUgdGl0bGVTdHlsZSA9IChUaXRsZVN0eWxlKSB2aWV3Ci0JCQkJLmdldFN0eWxlKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGl0bGVTdHlsZSgpKTsKLQkJaWYgKHRpdGxlU3R5bGUgIT0gbnVsbCkgewotCQkJdGl0bGVTdHlsZS5zZXRTaG93VGl0bGUodHJ1ZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0dXBDb21wYXJ0bWVudENvbGxhcHNlZChWaWV3IHZpZXcpIHsKLQkJRHJhd2VyU3R5bGUgZHJhd2VyU3R5bGUgPSAoRHJhd2VyU3R5bGUpIHZpZXcKLQkJCQkuZ2V0U3R5bGUoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXREcmF3ZXJTdHlsZSgpKTsKLQkJaWYgKGRyYXdlclN0eWxlICE9IG51bGwpIHsKLQkJCWRyYXdlclN0eWxlLnNldENvbGxhcHNlZChmYWxzZSk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL3ZpZXcvZmFjdG9yaWVzL1JvbGVUYXNrQ29tcG9zaXRlVmlld0ZhY3RvcnkuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL3ZpZXcvZmFjdG9yaWVzL1JvbGVUYXNrQ29tcG9zaXRlVmlld0ZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTZhZTUwZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC92aWV3L2ZhY3Rvcmllcy9Sb2xlVGFza0NvbXBvc2l0ZVZpZXdGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQudmlldy5mYWN0b3JpZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVjb3JlRmFjdG9yeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBhcnRzLkFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBhcnRzLlJvbGVUYXNrQ29tcG9zaXRlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucGFydHMuUm9sZVRhc2tDb21wb3NpdGVSb2xlVGFza0NvbXBhcnRtZW50RWRpdFBhcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQucGFydC5EaWFncmFtVmlzdWFsSURSZWdpc3RyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS51dGlsLlZpZXdVdGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS52aWV3LmZhY3Rvcmllcy5BYnN0cmFjdFNoYXBlVmlld0ZhY3Rvcnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob3RhdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBSb2xlVGFza0NvbXBvc2l0ZVZpZXdGYWN0b3J5IGV4dGVuZHMgQWJzdHJhY3RTaGFwZVZpZXdGYWN0b3J5IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgCi0JICovCi0JcHJvdGVjdGVkIExpc3QgY3JlYXRlU3R5bGVzKFZpZXcgdmlldykgewotCQlMaXN0IHN0eWxlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJc3R5bGVzLmFkZChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZvbnRTdHlsZSgpKTsKLQkJc3R5bGVzLmFkZChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZURlc2NyaXB0aW9uU3R5bGUoKSk7Ci0JCXN0eWxlcy5hZGQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGaWxsU3R5bGUoKSk7Ci0JCXN0eWxlcy5hZGQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVMaW5lU3R5bGUoKSk7Ci0JCXJldHVybiBzdHlsZXM7Ci0JfQotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZGVjb3JhdGVWaWV3KFZpZXcgY29udGFpbmVyVmlldywgVmlldyB2aWV3LAotCQkJSUFkYXB0YWJsZSBzZW1hbnRpY0FkYXB0ZXIsIFN0cmluZyBzZW1hbnRpY0hpbnQsIGludCBpbmRleCwKLQkJCWJvb2xlYW4gcGVyc2lzdGVkKSB7Ci0JCWlmIChzZW1hbnRpY0hpbnQgPT0gbnVsbCkgewotCQkJc2VtYW50aWNIaW50ID0gRGlhZ3JhbVZpc3VhbElEUmVnaXN0cnkKLQkJCQkJLmdldFR5cGUob3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucGFydHMuUm9sZVRhc2tDb21wb3NpdGVFZGl0UGFydC5WSVNVQUxfSUQpOwotCQkJdmlldy5zZXRUeXBlKHNlbWFudGljSGludCk7Ci0JCX0KLQkJc3VwZXIuZGVjb3JhdGVWaWV3KGNvbnRhaW5lclZpZXcsIHZpZXcsIHNlbWFudGljQWRhcHRlciwgc2VtYW50aWNIaW50LAotCQkJCWluZGV4LCBwZXJzaXN0ZWQpOwotCQlpZiAoIUFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRQYXJ0Lk1PREVMX0lECi0JCQkJLmVxdWFscyhEaWFncmFtVmlzdWFsSURSZWdpc3RyeS5nZXRNb2RlbElEKGNvbnRhaW5lclZpZXcpKSkgewotCQkJRUFubm90YXRpb24gc2hvcnRjdXRBbm5vdGF0aW9uID0gRWNvcmVGYWN0b3J5LmVJTlNUQU5DRQotCQkJCQkuY3JlYXRlRUFubm90YXRpb24oKTsKLQkJCXNob3J0Y3V0QW5ub3RhdGlvbi5zZXRTb3VyY2UoIlNob3J0Y3V0Iik7IC8vJE5PTi1OTFMtMSQKLQkJCXNob3J0Y3V0QW5ub3RhdGlvbi5nZXREZXRhaWxzKCkucHV0KAotCQkJCQkibW9kZWxJRCIsIEFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRQYXJ0Lk1PREVMX0lEKTsgLy8kTk9OLU5MUy0xJAotCQkJdmlldy5nZXRFQW5ub3RhdGlvbnMoKS5hZGQoc2hvcnRjdXRBbm5vdGF0aW9uKTsKLQkJfQotCQkvLyAJCW1vZGlmaWVkIG5vdCB0byBjcmVhdGUgY29tcGFydG1lbnQKLQkJLy8JCWdldFZpZXdTZXJ2aWNlKCkKLQkJLy8JCQkJLmNyZWF0ZU5vZGUoCi0JCS8vCQkJCQkJc2VtYW50aWNBZGFwdGVyLAotCQkvLwkJCQkJCXZpZXcsCi0JCS8vCQkJCQkJRGlhZ3JhbVZpc3VhbElEUmVnaXN0cnkKLQkJLy8JCQkJCQkJCS5nZXRUeXBlKFJvbGVUYXNrQ29tcG9zaXRlUm9sZVRhc2tDb21wYXJ0bWVudEVkaXRQYXJ0LlZJU1VBTF9JRCksCi0JCS8vCQkJCQkJVmlld1V0aWwuQVBQRU5ELCB0cnVlLCBnZXRQcmVmZXJlbmNlc0hpbnQoKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC92aWV3L2ZhY3Rvcmllcy9UYXNrTm9kZU5hbWVWaWV3RmFjdG9yeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvdmlldy9mYWN0b3JpZXMvVGFza05vZGVOYW1lVmlld0ZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjk0ZDYxMS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC92aWV3L2ZhY3Rvcmllcy9UYXNrTm9kZU5hbWVWaWV3RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLnZpZXcuZmFjdG9yaWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS52aWV3LmZhY3Rvcmllcy5CYXNpY05vZGVWaWV3RmFjdG9yeTsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBUYXNrTm9kZU5hbWVWaWV3RmFjdG9yeSBleHRlbmRzIEJhc2ljTm9kZVZpZXdGYWN0b3J5IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkZWNvcmF0ZVZpZXcoVmlldyBjb250YWluZXJWaWV3LCBWaWV3IHZpZXcsCi0JCQlJQWRhcHRhYmxlIHNlbWFudGljQWRhcHRlciwgU3RyaW5nIHNlbWFudGljSGludCwgaW50IGluZGV4LAotCQkJYm9vbGVhbiBwZXJzaXN0ZWQpIHsKLQkJc3VwZXIuZGVjb3JhdGVWaWV3KGNvbnRhaW5lclZpZXcsIHZpZXcsIHNlbWFudGljQWRhcHRlciwgc2VtYW50aWNIaW50LAotCQkJCWluZGV4LCBwZXJzaXN0ZWQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBjcmVhdGVTdHlsZXMoVmlldyB2aWV3KSB7Ci0JCUxpc3Qgc3R5bGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlyZXR1cm4gc3R5bGVzOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL3ZpZXcvZmFjdG9yaWVzL1Rhc2tOb2RlVmlld0ZhY3RvcnkuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL3ZpZXcvZmFjdG9yaWVzL1Rhc2tOb2RlVmlld0ZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDJjZmM4Mi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC92aWV3L2ZhY3Rvcmllcy9UYXNrTm9kZVZpZXdGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQudmlldy5mYWN0b3JpZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVjb3JlRmFjdG9yeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBhcnRzLkFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRQYXJ0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucGFydHMuVGFza05vZGVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wYXJ0cy5UYXNrTm9kZU5hbWVFZGl0UGFydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5wYXJ0LkRpYWdyYW1WaXN1YWxJRFJlZ2lzdHJ5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLnV0aWwuVmlld1V0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnZpZXcuZmFjdG9yaWVzLkFic3RyYWN0U2hhcGVWaWV3RmFjdG9yeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vdGF0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFRhc2tOb2RlVmlld0ZhY3RvcnkgZXh0ZW5kcyBBYnN0cmFjdFNoYXBlVmlld0ZhY3RvcnkgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZCAKLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBjcmVhdGVTdHlsZXMoVmlldyB2aWV3KSB7Ci0JCUxpc3Qgc3R5bGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlzdHlsZXMuYWRkKE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRm9udFN0eWxlKCkpOwotCQlzdHlsZXMuYWRkKE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRGVzY3JpcHRpb25TdHlsZSgpKTsKLQkJc3R5bGVzLmFkZChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZpbGxTdHlsZSgpKTsKLQkJc3R5bGVzLmFkZChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUxpbmVTdHlsZSgpKTsKLQkJcmV0dXJuIHN0eWxlczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZGVjb3JhdGVWaWV3KFZpZXcgY29udGFpbmVyVmlldywgVmlldyB2aWV3LAotCQkJSUFkYXB0YWJsZSBzZW1hbnRpY0FkYXB0ZXIsIFN0cmluZyBzZW1hbnRpY0hpbnQsIGludCBpbmRleCwKLQkJCWJvb2xlYW4gcGVyc2lzdGVkKSB7Ci0JCWlmIChzZW1hbnRpY0hpbnQgPT0gbnVsbCkgewotCQkJc2VtYW50aWNIaW50ID0gRGlhZ3JhbVZpc3VhbElEUmVnaXN0cnkKLQkJCQkJLmdldFR5cGUoVGFza05vZGVFZGl0UGFydC5WSVNVQUxfSUQpOwotCQkJdmlldy5zZXRUeXBlKHNlbWFudGljSGludCk7Ci0JCX0KLQkJc3VwZXIuZGVjb3JhdGVWaWV3KGNvbnRhaW5lclZpZXcsIHZpZXcsIHNlbWFudGljQWRhcHRlciwgc2VtYW50aWNIaW50LAotCQkJCWluZGV4LCBwZXJzaXN0ZWQpOwotCQlpZiAoIUFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRQYXJ0Lk1PREVMX0lECi0JCQkJLmVxdWFscyhEaWFncmFtVmlzdWFsSURSZWdpc3RyeS5nZXRNb2RlbElEKGNvbnRhaW5lclZpZXcpKSkgewotCQkJRUFubm90YXRpb24gc2hvcnRjdXRBbm5vdGF0aW9uID0gRWNvcmVGYWN0b3J5LmVJTlNUQU5DRQotCQkJCQkuY3JlYXRlRUFubm90YXRpb24oKTsKLQkJCXNob3J0Y3V0QW5ub3RhdGlvbi5zZXRTb3VyY2UoIlNob3J0Y3V0Iik7IC8vJE5PTi1OTFMtMSQKLQkJCXNob3J0Y3V0QW5ub3RhdGlvbi5nZXREZXRhaWxzKCkucHV0KAotCQkJCQkibW9kZWxJRCIsIEFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRQYXJ0Lk1PREVMX0lEKTsgLy8kTk9OLU5MUy0xJAotCQkJdmlldy5nZXRFQW5ub3RhdGlvbnMoKS5hZGQoc2hvcnRjdXRBbm5vdGF0aW9uKTsKLQkJfQotCQlnZXRWaWV3U2VydmljZSgpCi0JCQkJLmNyZWF0ZU5vZGUoCi0JCQkJCQlzZW1hbnRpY0FkYXB0ZXIsCi0JCQkJCQl2aWV3LAotCQkJCQkJRGlhZ3JhbVZpc3VhbElEUmVnaXN0cnkKLQkJCQkJCQkJLmdldFR5cGUoVGFza05vZGVOYW1lRWRpdFBhcnQuVklTVUFMX0lEKSwKLQkJCQkJCVZpZXdVdGlsLkFQUEVORCwgdHJ1ZSwgZ2V0UHJlZmVyZW5jZXNIaW50KCkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvdmlldy9mYWN0b3JpZXMvV29ya1Byb2R1Y3RDb21wb3NpdGVWaWV3RmFjdG9yeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvdmlldy9mYWN0b3JpZXMvV29ya1Byb2R1Y3RDb21wb3NpdGVWaWV3RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZGM3YzEzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL3ZpZXcvZmFjdG9yaWVzL1dvcmtQcm9kdWN0Q29tcG9zaXRlVmlld0ZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC52aWV3LmZhY3RvcmllczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRWNvcmVGYWN0b3J5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucGFydHMuQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucGFydHMuV29ya1Byb2R1Y3RDb21wb3NpdGVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wYXJ0cy5Xb3JrUHJvZHVjdENvbXBvc2l0ZVdvcmtQcm9kdWN0Q29tcGFydG1lbnRFZGl0UGFydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5wYXJ0LkRpYWdyYW1WaXN1YWxJRFJlZ2lzdHJ5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLnV0aWwuVmlld1V0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnZpZXcuZmFjdG9yaWVzLkFic3RyYWN0U2hhcGVWaWV3RmFjdG9yeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vdGF0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFdvcmtQcm9kdWN0Q29tcG9zaXRlVmlld0ZhY3RvcnkgZXh0ZW5kcyBBYnN0cmFjdFNoYXBlVmlld0ZhY3RvcnkgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZCAKLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBjcmVhdGVTdHlsZXMoVmlldyB2aWV3KSB7Ci0JCUxpc3Qgc3R5bGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlzdHlsZXMuYWRkKE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRm9udFN0eWxlKCkpOwotCQlzdHlsZXMuYWRkKE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRGVzY3JpcHRpb25TdHlsZSgpKTsKLQkJc3R5bGVzLmFkZChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZpbGxTdHlsZSgpKTsKLQkJc3R5bGVzLmFkZChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUxpbmVTdHlsZSgpKTsKLQkJcmV0dXJuIHN0eWxlczsKLQl9Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkZWNvcmF0ZVZpZXcoVmlldyBjb250YWluZXJWaWV3LCBWaWV3IHZpZXcsCi0JCQlJQWRhcHRhYmxlIHNlbWFudGljQWRhcHRlciwgU3RyaW5nIHNlbWFudGljSGludCwgaW50IGluZGV4LAotCQkJYm9vbGVhbiBwZXJzaXN0ZWQpIHsKLQkJaWYgKHNlbWFudGljSGludCA9PSBudWxsKSB7Ci0JCQlzZW1hbnRpY0hpbnQgPSBEaWFncmFtVmlzdWFsSURSZWdpc3RyeQotCQkJCQkuZ2V0VHlwZShvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wYXJ0cy5Xb3JrUHJvZHVjdENvbXBvc2l0ZUVkaXRQYXJ0LlZJU1VBTF9JRCk7Ci0JCQl2aWV3LnNldFR5cGUoc2VtYW50aWNIaW50KTsKLQkJfQotCQlzdXBlci5kZWNvcmF0ZVZpZXcoY29udGFpbmVyVmlldywgdmlldywgc2VtYW50aWNBZGFwdGVyLCBzZW1hbnRpY0hpbnQsCi0JCQkJaW5kZXgsIHBlcnNpc3RlZCk7Ci0JCWlmICghQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdFBhcnQuTU9ERUxfSUQKLQkJCQkuZXF1YWxzKERpYWdyYW1WaXN1YWxJRFJlZ2lzdHJ5LmdldE1vZGVsSUQoY29udGFpbmVyVmlldykpKSB7Ci0JCQlFQW5ub3RhdGlvbiBzaG9ydGN1dEFubm90YXRpb24gPSBFY29yZUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJCS5jcmVhdGVFQW5ub3RhdGlvbigpOwotCQkJc2hvcnRjdXRBbm5vdGF0aW9uLnNldFNvdXJjZSgiU2hvcnRjdXQiKTsgLy8kTk9OLU5MUy0xJAotCQkJc2hvcnRjdXRBbm5vdGF0aW9uLmdldERldGFpbHMoKS5wdXQoCi0JCQkJCSJtb2RlbElEIiwgQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdFBhcnQuTU9ERUxfSUQpOyAvLyROT04tTkxTLTEkCi0JCQl2aWV3LmdldEVBbm5vdGF0aW9ucygpLmFkZChzaG9ydGN1dEFubm90YXRpb24pOwotCQl9Ci0JCS8vCQltb2RpZmllZCAtIG5vdCB0byBjcmVhdGUgY29tcGFydG1lbnQKLQkJLy8JCWdldFZpZXdTZXJ2aWNlKCkKLQkJLy8JCQkJLmNyZWF0ZU5vZGUoCi0JCS8vCQkJCQkJc2VtYW50aWNBZGFwdGVyLAotCQkvLwkJCQkJCXZpZXcsCi0JCS8vCQkJCQkJRGlhZ3JhbVZpc3VhbElEUmVnaXN0cnkKLQkJLy8JCQkJCQkJCS5nZXRUeXBlKFdvcmtQcm9kdWN0Q29tcG9zaXRlV29ya1Byb2R1Y3RDb21wYXJ0bWVudEVkaXRQYXJ0LlZJU1VBTF9JRCksCi0JCS8vCQkJCQkJVmlld1V0aWwuQVBQRU5ELCB0cnVlLCBnZXRQcmVmZXJlbmNlc0hpbnQoKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC92aWV3L2ZhY3Rvcmllcy9Xb3JrUHJvZHVjdENvbXBvc2l0ZVdvcmtQcm9kdWN0Q29tcGFydG1lbnRWaWV3RmFjdG9yeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvdmlldy9mYWN0b3JpZXMvV29ya1Byb2R1Y3RDb21wb3NpdGVXb3JrUHJvZHVjdENvbXBhcnRtZW50Vmlld0ZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjhjYTgwMS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC92aWV3L2ZhY3Rvcmllcy9Xb3JrUHJvZHVjdENvbXBvc2l0ZVdvcmtQcm9kdWN0Q29tcGFydG1lbnRWaWV3RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLnZpZXcuZmFjdG9yaWVzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FY29yZUZhY3Rvcnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wYXJ0cy5BY3Rpdml0eURldGFpbERpYWdyYW1FZGl0UGFydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBhcnRzLldvcmtQcm9kdWN0Q29tcG9zaXRlV29ya1Byb2R1Y3RDb21wYXJ0bWVudEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5wYXJ0LkRpYWdyYW1WaXN1YWxJRFJlZ2lzdHJ5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS52aWV3LmZhY3Rvcmllcy5MaXN0Q29tcGFydG1lbnRWaWV3RmFjdG9yeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkRyYXdlclN0eWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vdGF0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob3RhdGlvblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVGl0bGVTdHlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFdvcmtQcm9kdWN0Q29tcG9zaXRlV29ya1Byb2R1Y3RDb21wYXJ0bWVudFZpZXdGYWN0b3J5IGV4dGVuZHMKLQkJTGlzdENvbXBhcnRtZW50Vmlld0ZhY3RvcnkgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZCAKLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBjcmVhdGVTdHlsZXMoVmlldyB2aWV3KSB7Ci0JCUxpc3Qgc3R5bGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlzdHlsZXMuYWRkKE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlU29ydGluZ1N0eWxlKCkpOwotCQlzdHlsZXMuYWRkKE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRmlsdGVyaW5nU3R5bGUoKSk7Ci0JCXJldHVybiBzdHlsZXM7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRlY29yYXRlVmlldyhWaWV3IGNvbnRhaW5lclZpZXcsIFZpZXcgdmlldywKLQkJCUlBZGFwdGFibGUgc2VtYW50aWNBZGFwdGVyLCBTdHJpbmcgc2VtYW50aWNIaW50LCBpbnQgaW5kZXgsCi0JCQlib29sZWFuIHBlcnNpc3RlZCkgewotCQlpZiAoc2VtYW50aWNIaW50ID09IG51bGwpIHsKLQkJCXNlbWFudGljSGludCA9IERpYWdyYW1WaXN1YWxJRFJlZ2lzdHJ5Ci0JCQkJCS5nZXRUeXBlKFdvcmtQcm9kdWN0Q29tcG9zaXRlV29ya1Byb2R1Y3RDb21wYXJ0bWVudEVkaXRQYXJ0LlZJU1VBTF9JRCk7Ci0JCQl2aWV3LnNldFR5cGUoc2VtYW50aWNIaW50KTsKLQkJfQotCQlzdXBlci5kZWNvcmF0ZVZpZXcoY29udGFpbmVyVmlldywgdmlldywgc2VtYW50aWNBZGFwdGVyLCBzZW1hbnRpY0hpbnQsCi0JCQkJaW5kZXgsIHBlcnNpc3RlZCk7Ci0JCXNldHVwQ29tcGFydG1lbnRUaXRsZSh2aWV3KTsKLQkJc2V0dXBDb21wYXJ0bWVudENvbGxhcHNlZCh2aWV3KTsKLQkJaWYgKCFBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0UGFydC5NT0RFTF9JRAotCQkJCS5lcXVhbHMoRGlhZ3JhbVZpc3VhbElEUmVnaXN0cnkuZ2V0TW9kZWxJRChjb250YWluZXJWaWV3KSkpIHsKLQkJCUVBbm5vdGF0aW9uIHNob3J0Y3V0QW5ub3RhdGlvbiA9IEVjb3JlRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkJLmNyZWF0ZUVBbm5vdGF0aW9uKCk7Ci0JCQlzaG9ydGN1dEFubm90YXRpb24uc2V0U291cmNlKCJTaG9ydGN1dCIpOyAvLyROT04tTkxTLTEkCi0JCQlzaG9ydGN1dEFubm90YXRpb24uZ2V0RGV0YWlscygpLnB1dCgKLQkJCQkJIm1vZGVsSUQiLCBBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0UGFydC5NT0RFTF9JRCk7IC8vJE5PTi1OTFMtMSQKLQkJCXZpZXcuZ2V0RUFubm90YXRpb25zKCkuYWRkKHNob3J0Y3V0QW5ub3RhdGlvbik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0dXBDb21wYXJ0bWVudFRpdGxlKFZpZXcgdmlldykgewotCQlUaXRsZVN0eWxlIHRpdGxlU3R5bGUgPSAoVGl0bGVTdHlsZSkgdmlldwotCQkJCS5nZXRTdHlsZShOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldFRpdGxlU3R5bGUoKSk7Ci0JCWlmICh0aXRsZVN0eWxlICE9IG51bGwpIHsKLQkJCXRpdGxlU3R5bGUuc2V0U2hvd1RpdGxlKHRydWUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldHVwQ29tcGFydG1lbnRDb2xsYXBzZWQoVmlldyB2aWV3KSB7Ci0JCURyYXdlclN0eWxlIGRyYXdlclN0eWxlID0gKERyYXdlclN0eWxlKSB2aWV3Ci0JCQkJLmdldFN0eWxlKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RHJhd2VyU3R5bGUoKSk7Ci0JCWlmIChkcmF3ZXJTdHlsZSAhPSBudWxsKSB7Ci0JCQlkcmF3ZXJTdHlsZS5zZXRDb2xsYXBzZWQoZmFsc2UpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC92aWV3L2ZhY3Rvcmllcy9Xb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlTmFtZVZpZXdGYWN0b3J5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC92aWV3L2ZhY3Rvcmllcy9Xb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlTmFtZVZpZXdGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0YjY4M2MuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvdmlldy9mYWN0b3JpZXMvV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZU5hbWVWaWV3RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLnZpZXcuZmFjdG9yaWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS52aWV3LmZhY3Rvcmllcy5CYXNpY05vZGVWaWV3RmFjdG9yeTsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlTmFtZVZpZXdGYWN0b3J5IGV4dGVuZHMKLQkJQmFzaWNOb2RlVmlld0ZhY3RvcnkgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRlY29yYXRlVmlldyhWaWV3IGNvbnRhaW5lclZpZXcsIFZpZXcgdmlldywKLQkJCUlBZGFwdGFibGUgc2VtYW50aWNBZGFwdGVyLCBTdHJpbmcgc2VtYW50aWNIaW50LCBpbnQgaW5kZXgsCi0JCQlib29sZWFuIHBlcnNpc3RlZCkgewotCQlzdXBlci5kZWNvcmF0ZVZpZXcoY29udGFpbmVyVmlldywgdmlldywgc2VtYW50aWNBZGFwdGVyLCBzZW1hbnRpY0hpbnQsCi0JCQkJaW5kZXgsIHBlcnNpc3RlZCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBMaXN0IGNyZWF0ZVN0eWxlcyhWaWV3IHZpZXcpIHsKLQkJTGlzdCBzdHlsZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXJldHVybiBzdHlsZXM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvdmlldy9mYWN0b3JpZXMvV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZVZpZXdGYWN0b3J5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC92aWV3L2ZhY3Rvcmllcy9Xb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlVmlld0ZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmRjMTNjYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC92aWV3L2ZhY3Rvcmllcy9Xb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlVmlld0ZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC52aWV3LmZhY3RvcmllczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRWNvcmVGYWN0b3J5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucGFydHMuQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdFBhcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wYXJ0cy5Xb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucGFydHMuV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZU5hbWVFZGl0UGFydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5wYXJ0LkRpYWdyYW1WaXN1YWxJRFJlZ2lzdHJ5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLnV0aWwuVmlld1V0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnZpZXcuZmFjdG9yaWVzLkFic3RyYWN0U2hhcGVWaWV3RmFjdG9yeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vdGF0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVWaWV3RmFjdG9yeSBleHRlbmRzCi0JCUFic3RyYWN0U2hhcGVWaWV3RmFjdG9yeSB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIAotCSAqLwotCXByb3RlY3RlZCBMaXN0IGNyZWF0ZVN0eWxlcyhWaWV3IHZpZXcpIHsKLQkJTGlzdCBzdHlsZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXN0eWxlcy5hZGQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGb250U3R5bGUoKSk7Ci0JCXN0eWxlcy5hZGQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVEZXNjcmlwdGlvblN0eWxlKCkpOwotCQlzdHlsZXMuYWRkKE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRmlsbFN0eWxlKCkpOwotCQlzdHlsZXMuYWRkKE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlTGluZVN0eWxlKCkpOwotCQlyZXR1cm4gc3R5bGVzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkZWNvcmF0ZVZpZXcoVmlldyBjb250YWluZXJWaWV3LCBWaWV3IHZpZXcsCi0JCQlJQWRhcHRhYmxlIHNlbWFudGljQWRhcHRlciwgU3RyaW5nIHNlbWFudGljSGludCwgaW50IGluZGV4LAotCQkJYm9vbGVhbiBwZXJzaXN0ZWQpIHsKLQkJaWYgKHNlbWFudGljSGludCA9PSBudWxsKSB7Ci0JCQlzZW1hbnRpY0hpbnQgPSBEaWFncmFtVmlzdWFsSURSZWdpc3RyeQotCQkJCQkuZ2V0VHlwZShXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlRWRpdFBhcnQuVklTVUFMX0lEKTsKLQkJCXZpZXcuc2V0VHlwZShzZW1hbnRpY0hpbnQpOwotCQl9Ci0JCXN1cGVyLmRlY29yYXRlVmlldyhjb250YWluZXJWaWV3LCB2aWV3LCBzZW1hbnRpY0FkYXB0ZXIsIHNlbWFudGljSGludCwKLQkJCQlpbmRleCwgcGVyc2lzdGVkKTsKLQkJaWYgKCFBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0UGFydC5NT0RFTF9JRAotCQkJCS5lcXVhbHMoRGlhZ3JhbVZpc3VhbElEUmVnaXN0cnkuZ2V0TW9kZWxJRChjb250YWluZXJWaWV3KSkpIHsKLQkJCUVBbm5vdGF0aW9uIHNob3J0Y3V0QW5ub3RhdGlvbiA9IEVjb3JlRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkJLmNyZWF0ZUVBbm5vdGF0aW9uKCk7Ci0JCQlzaG9ydGN1dEFubm90YXRpb24uc2V0U291cmNlKCJTaG9ydGN1dCIpOyAvLyROT04tTkxTLTEkCi0JCQlzaG9ydGN1dEFubm90YXRpb24uZ2V0RGV0YWlscygpLnB1dCgKLQkJCQkJIm1vZGVsSUQiLCBBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0UGFydC5NT0RFTF9JRCk7IC8vJE5PTi1OTFMtMSQKLQkJCXZpZXcuZ2V0RUFubm90YXRpb25zKCkuYWRkKHNob3J0Y3V0QW5ub3RhdGlvbik7Ci0JCX0KLQkJZ2V0Vmlld1NlcnZpY2UoKQotCQkJCS5jcmVhdGVOb2RlKAotCQkJCQkJc2VtYW50aWNBZGFwdGVyLAotCQkJCQkJdmlldywKLQkJCQkJCURpYWdyYW1WaXN1YWxJRFJlZ2lzdHJ5Ci0JCQkJCQkJCS5nZXRUeXBlKFdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVOYW1lRWRpdFBhcnQuVklTVUFMX0lEKSwKLQkJCQkJCVZpZXdVdGlsLkFQUEVORCwgdHJ1ZSwgZ2V0UHJlZmVyZW5jZXNIaW50KCkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS8uY2xhc3NwYXRoIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTFjOGYyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvLm9wdGlvbnMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLy5vcHRpb25zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NWFjNWUwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvLm9wdGlvbnMKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLSMgVHVybiBvbiBkZWJ1ZyB0cmFjZSBmb3IgdGhlIERpYWdyYW0gQ29yZSBwbHVnLWluCi1vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL2RlYnVnPXRydWUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvLnByb2plY3QgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YjdjMTM5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YmIyM2RhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZTtzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjUuMC5xdWFsaWZpZXIKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuRGlhZ3JhbUNvcmVQbHVnaW4KLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLnVtbDIudW1sLAotIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVzb3VyY2VzLmVkaXRvci5pZGUsCi0gb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wcm9wZXJ0aWVzLAotIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucHJvdmlkZXJzLAotIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpO3Zpc2liaWxpdHk6PXJlZXhwb3J0LAotIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuYWN0aW9ucywKLSBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpCi1FY2xpcHNlLUxhenlTdGFydDogdHJ1ZQotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUsCi0gb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5hY3Rpb25zLAotIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuYnJpZGdlLAotIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuY29tbWFuZHMsCi0gb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5maWd1cmVzLAotIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUucGFydCwKLSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnBhcnQudXRpbCwKLSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnByb3ZpZGVycywKLSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnJlc291cmNlcywKLSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnNlcnZpY2VzLAotIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUudXRpbAotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL2J1aWxkLnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyNDA4MmIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1zb3VyY2UuLiA9IHNyYy8KLW91dHB1dC4uID0gYmluLwotYmluLmluY2x1ZGVzID0gTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIC4sXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBpY29ucy8KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvaWNvbnMvZGxjbDE2L2RlbGV0ZV9kaWFncmFtLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvaWNvbnMvZGxjbDE2L2RlbGV0ZV9kaWFncmFtLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDViMGE1Mi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL2ljb25zL2RsY2wxNi9kZWxldGVfZGlhZ3JhbS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL2ljb25zL2RsY2wxNi9yZWZyZXNoLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvaWNvbnMvZGxjbDE2L3JlZnJlc2guZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZmE4OTliLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvaWNvbnMvZGxjbDE2L3JlZnJlc2guZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9pY29ucy9kbGNsMTYvcmVmcmVzaF9iYXNlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvaWNvbnMvZGxjbDE2L3JlZnJlc2hfYmFzZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3NmU4YWMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9pY29ucy9kbGNsMTYvcmVmcmVzaF9iYXNlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvaWNvbnMvZWxjbDE2L2RlbGV0ZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL2ljb25zL2VsY2wxNi9kZWxldGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNjkyMmFjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvaWNvbnMvZWxjbDE2L2RlbGV0ZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL2ljb25zL2VsY2wxNi9kZWxldGVfZGlhZ3JhbS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL2ljb25zL2VsY2wxNi9kZWxldGVfZGlhZ3JhbS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2OTIyYWMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9pY29ucy9lbGNsMTYvZGVsZXRlX2RpYWdyYW0uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9pY29ucy9lbGNsMTYvcmVmcmVzaC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL2ljb25zL2VsY2wxNi9yZWZyZXNoLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDBjNzE0MS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL2ljb25zL2VsY2wxNi9yZWZyZXNoLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvaWNvbnMvZWxjbDE2L3JlZnJlc2hfYmFzZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL2ljb25zL2VsY2wxNi9yZWZyZXNoX2Jhc2UuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YjkwOTQzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvaWNvbnMvZWxjbDE2L3JlZnJlc2hfYmFzZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL2ljb25zL2xpbmsuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9pY29ucy9saW5rLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMThmNDA4Yy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL2ljb25zL2xpbmsuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9wbHVnaW4ucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0NjQyMjAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSCi0KLSMgUGx1Zy1pbgotcGx1Z2luTmFtZT1FUEYgRGlhZ3JhbSBDb3JlCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKLQotRGVsZXRlRGlhZ3JhbV90ZXh0PURlbGV0ZSBEaWFncmFtCi1yZWZyZXNoRnJvbUJhc2VBY3Rpdml0eV90ZXh0PVJlZnJlc2ggZnJvbSBCYXNlIEFjdGl2aXR5Ci1yZWZyZXNoX3RleHQ9UmVmcmVzaAotb3Blbl9hZGRfdGV4dD1PcGVuIEFjdGl2aXR5IERldGFpbCBEaWFncmFtCi1kZWxldGVfdGV4dD1EZWxldGUKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL3BsdWdpbi54bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3NTNiNWUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjIiPz4KLTxwbHVnaW4+Ci0gICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJkaWFncmFtSWNvblByb3ZpZGVycyIgbmFtZT0iRGlhZ3JhbSBJY29uIFByb3ZpZGVycyIgc2NoZW1hPSJzY2hlbWEvZGlhZ3JhbUljb25Qcm92aWRlcnMuZXhzZCIvPgotCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5uZXN0ZWRDb21tYW5kUHJvdmlkZXJzIj4KLSAgICAgIDxuZXN0ZWRDb21tYW5kUHJvdmlkZXIgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuY29tbWFuZHMuTmVzdGVkQ29tbWFuZFByb3ZpZGVyIi8+Ci0gIDwvZXh0ZW5zaW9uPgotCi0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkucG9wdXBNZW51cyI+Ci0JIDxvYmplY3RDb250cmlidXRpb24KLSAgICAgICAgICAgIGFkYXB0YWJsZT0idHJ1ZSIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLkRlbGV0ZURpYWdyYW0iCi0gICAgICAgICAgICBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuRGlhZ3JhbUVkaXRQYXJ0Ij4KLSAgICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLmFjdGlvbnMuRGVsZXRlRGlhZ3JhbUFjdGlvbiIKLSAgICAgICAgICAgICAgIGVuYWJsZXNGb3I9IjEiCi0gICAgICAgICAgICAgICBpY29uPSJpY29ucy9lbGNsMTYvZGVsZXRlX2RpYWdyYW0uZ2lmIgotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuYWN0aW9ucy5EZWxldGVEaWFncmFtQWN0aW9uIgotICAgICAgICAgICAgICAgbGFiZWw9IiVEZWxldGVEaWFncmFtX3RleHQiCi0gICAgICAgICAgICAgICBtZW51YmFyUGF0aD0iYWRkaXRpb25zIgotICAgICAgICAgICAgICAgc3R5bGU9InB1c2giCi0gICAgICAgICAgICAgICB0b29sdGlwPSIlRGVsZXRlRGlhZ3JhbV90ZXh0Ii8+Ci0gICAgICA8L29iamVjdENvbnRyaWJ1dGlvbj4gCi0gICAgICA8b2JqZWN0Q29udHJpYnV0aW9uCi0gICAgICAgICAgICBhZGFwdGFibGU9InRydWUiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5SZWZyZXNoRnJvbUJhc2VBY3Rpb24iCi0gICAgICAgICAgICBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuRGlhZ3JhbUVkaXRQYXJ0Ij4KLSAgICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLmFjdGlvbnMuUmVmcmVzaEZyb21CYXNlQWN0aW9uIgotICAgICAgICAgICAgICAgZW5hYmxlc0Zvcj0iMSIKLSAgICAgICAgICAgICAgIGljb249Imljb25zL2VsY2wxNi9yZWZyZXNoX2Jhc2UuZ2lmIgotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuYWN0aW9ucy5SZWZyZXNoRnJvbUJhc2VBY3Rpb24iCi0gICAgICAgICAgICAgICBsYWJlbD0iJXJlZnJlc2hGcm9tQmFzZUFjdGl2aXR5X3RleHQiCi0gICAgICAgICAgICAgICBtZW51YmFyUGF0aD0iYWRkaXRpb25zIgotICAgICAgICAgICAgICAgc3R5bGU9InB1c2giCi0gICAgICAgICAgICAgICB0b29sdGlwPSIlcmVmcmVzaEZyb21CYXNlQWN0aXZpdHlfdGV4dCIvPgotICAgICAgPC9vYmplY3RDb250cmlidXRpb24+Ci0gICAgICA8b2JqZWN0Q29udHJpYnV0aW9uCi0gICAgICAgICAgICBhZGFwdGFibGU9InRydWUiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5SZWZyZXNoQWN0aW9uIgotICAgICAgICAgICAgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLkRpYWdyYW1FZGl0UGFydCI+Ci0gICAgICAgICA8YWN0aW9uCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5hY3Rpb25zLlJlZnJlc2hBY3Rpb24iCi0gICAgICAgICAgICAgICBlbmFibGVzRm9yPSIxIgotICAgICAgICAgICAgICAgaWNvbj0iaWNvbnMvZWxjbDE2L3JlZnJlc2guZ2lmIgotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuYWN0aW9ucy5SZWZyZXNoQWN0aW9uIgotICAgICAgICAgICAgICAgbGFiZWw9IiVyZWZyZXNoX3RleHQiCi0gICAgICAgICAgICAgICBtZW51YmFyUGF0aD0iYWRkaXRpb25zIgotICAgICAgICAgICAgICAgc3R5bGU9InB1c2giCi0gICAgICAgICAgICAgICB0b29sdGlwPSIlcmVmcmVzaF90ZXh0Ii8+Ci0gICAgICA8L29iamVjdENvbnRyaWJ1dGlvbj4KLSAgICAgIDxvYmplY3RDb250cmlidXRpb24KLSAgICAgICAgICAgIGFkYXB0YWJsZT0idHJ1ZSIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLkRlbGV0ZURpYWdyYW1FbGVtZW50QWN0aW9uIgotICAgICAgICAgICAgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklQcmltYXJ5RWRpdFBhcnQiPgotICAgICAgICAgPGFjdGlvbgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuYWN0aW9ucy5EZWxldGVFbGVtZW50QWN0aW9uRGVsZWdhdGUiCi0gICAgICAgICAgICAgICBlbmFibGVzRm9yPSIqIgotICAgICAgICAgICAgICAgaWNvbj0iaWNvbnMvZWxjbDE2L2RlbGV0ZS5naWYiCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5hY3Rpb25zLkRlbGV0ZURpYWdyYW1FbGVtZW50QWN0aW9uIgotICAgICAgICAgICAgICAgbGFiZWw9IiVkZWxldGVfdGV4dCIKLSAgICAgICAgICAgICAgIG1lbnViYXJQYXRoPSJhZGRpdGlvbnMiCi0gICAgICAgICAgICAgICBvdmVycmlkZUFjdGlvbklkPSJkZWxldGVGcm9tRGlhZ3JhbUFjdGlvbiIKLSAgICAgICAgICAgICAgIHN0eWxlPSJwdXNoIgotICAgICAgICAgICAgICAgdG9vbHRpcD0iJWRlbGV0ZV90ZXh0Ii8+Ci0gICAgICA8L29iamVjdENvbnRyaWJ1dGlvbj4KLSAgPC9leHRlbnNpb24+Ci08L3BsdWdpbj4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvc2NoZW1hL2RpYWdyYW1JY29uUHJvdmlkZXJzLmV4c2QgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL3NjaGVtYS9kaWFncmFtSWNvblByb3ZpZGVycy5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YmUwYmQ4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvc2NoZW1hL2RpYWdyYW1JY29uUHJvdmlkZXJzLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMDkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZSI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZSIgaWQ9ImRpYWdyYW1JY29uUHJvdmlkZXJzIiBuYW1lPSJEaWFncmFtIEljb24gUHJvdmlkZXJzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFRoaXMgZXh0ZW5zaW9uIHBvaW50IHByb3ZpZGVzIHRoZSBhYmlsaXR5IHRvIGN1c3RvbWl6ZSB0aGUgaWNvbnMgZGlzcGxheWVkIGluIGFueSBvZiB0aGUgRVBGIGRpYWdyYW0gZWRpdG9ycy4KLQotSW1wbGVtZW50b3JzIG9mIHRoaXMgZXh0ZW5zaW9uIHBvaW50IG11c3QgaW1wbGVtZW50IHRoZSBJbnRlcmZhY2UgSURpYWdyYW1JY29uUHJvdmlkZXIuCi0KLUl0IGlzIHRoZSBpbXBsZW1lbnRvcnMgcmVzcG9uc2liaWxpdHkgdG8gY2FjaGUgdGhlIGltYWdlcyBhbmQgaGFuZGxlIHRoZSBkaXNwb3Npbmcgb2YgdGhlIGltYWdlcyB1cG9uIHNodXRkb3duIG9mIHRoZSB3b3JrYmVuY2guCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImRpYWdyYW1JY29uUHJvdmlkZXIiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSB0cmFuc2xhdGFibGU9InRydWUiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0iZGlhZ3JhbUljb25Qcm92aWRlciI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUga2luZD0iamF2YSIgYmFzZWRPbj0iOm9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnByb3ZpZGVycy5JRGlhZ3JhbUljb25Qcm92aWRlciIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgdGhlIGZpcnN0IHJlbGVhc2UgaW4gd2hpY2ggdGhpcyBleHRlbnNpb24gcG9pbnQgYXBwZWFycy5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBleHRlbnNpb24gcG9pbnQgdXNhZ2UgZXhhbXBsZSBoZXJlLl0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgQVBJIGluZm9ybWF0aW9uIGhlcmUuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgaW5mb3JtYXRpb24gYWJvdXQgc3VwcGxpZWQgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBleHRlbnNpb24gcG9pbnQuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vY29yZS9EaWFncmFtQ29yZVBsdWdpbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vY29yZS9EaWFncmFtQ29yZVBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNThjN2Q0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2NvcmUvRGlhZ3JhbUNvcmVQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpLkFic3RyYWN0UGx1Z2luOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotCi0vKioKLSAqIFRoZSBhY3RpdmF0b3IgY2xhc3MgY29udHJvbHMgdGhlIHBsdWctaW4gbGlmZSBjeWNsZQotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjIKLSAqLwotcHVibGljIGNsYXNzIERpYWdyYW1Db3JlUGx1Z2luIGV4dGVuZHMgQWJzdHJhY3RQbHVnaW4gewotCi0JLy8gVGhlIHBsdWctaW4gSUQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgPSAib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZSI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIFRoZSBzaGFyZWQgaW5zdGFuY2UKLQlwcml2YXRlIHN0YXRpYyBEaWFncmFtQ29yZVBsdWdpbiBwbHVnaW47Ci0JCi0JLyoqCi0JICogVGhlIGNvbnN0cnVjdG9yCi0JICovCi0JcHVibGljIERpYWdyYW1Db3JlUGx1Z2luKCkgewotCQlwbHVnaW4gPSB0aGlzOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW4jc3RhcnQob3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQpCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RhcnQoY29udGV4dCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbiNzdG9wKG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcGx1Z2luID0gbnVsbDsKLQkJc3VwZXIuc3RvcChjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaGFyZWQgaW5zdGFuY2UKLQkgKgotCSAqIEByZXR1cm4gdGhlIHNoYXJlZCBpbnN0YW5jZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgRGlhZ3JhbUNvcmVQbHVnaW4gZ2V0RGVmYXVsdCgpIHsKLQkJcmV0dXJuIHBsdWdpbjsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UGx1Z2luSWQoKXsKLQkJcmV0dXJuIFBMVUdJTl9JRDsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9jb3JlL0RpYWdyYW1Db3JlUmVzb3VyY2VzLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9jb3JlL0RpYWdyYW1Db3JlUmVzb3VyY2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2NTAzY2QuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vY29yZS9EaWFncmFtQ29yZVJlc291cmNlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vKioKLSAqIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi0vKioKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQHNpbmNlIDEuMgotICoKLSAqLwotcHVibGljIGNsYXNzIERpYWdyYW1Db3JlUmVzb3VyY2VzIGV4dGVuZHMgTkxTIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLlJlc291cmNlcyI7Ly8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBEaWFncmFtQ29yZVJlc291cmNlcygpIHsKLQl9Ci0KLQlzdGF0aWMgewotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBEaWFncmFtQ29yZVJlc291cmNlcy5jbGFzcyk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIGxvY2FsaXplZCBzdHJpbmcgYXNzb2NpYXRlZCB3aXRoIGEgcmVzb3VyY2Uga2V5IGFuZCBmb3JtYXR0ZWQKLQkgKiB3aXRoIGEgZ2l2ZW4gb2JqZWN0LgotCSAqIAotCSAqIEBwYXJhbSBrZXkKLQkgKiAgICAgICAgICAgIEEgcmVzb3VyY2Uga2V5LgotCSAqIEBwYXJhbSBkYXRhCi0JICogICAgICAgICAgICBBbiBvYmplY3QuCi0JICogQHJldHVybiBBIGZvcm1hdHRlZCBsb2NhbGl6ZWQgc3RyaW5nLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGJpbmQoU3RyaW5nIGtleSwgT2JqZWN0IGRhdGEpIHsKLQkJcmV0dXJuIE5MUy5iaW5kKGtleSwgbmV3IE9iamVjdFtdIHsgZGF0YSB9KTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWN0aXZpdHlEaWFncmFtX1BhbGV0dGVfZmxvd3NfdGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWN0aXZpdHlEaWFncmFtX1BhbGV0dGVfZmxvd3NfY3JlYXRlX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWN0aXZpdHlEaWFncmFtX1BhbGV0dGVfY29udHJvbF9mbG93X2NyZWF0ZV90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdGl2aXR5RGlhZ3JhbV9QYWxldHRlX2NvbnRyb2xfZmxvd190ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdGl2aXR5RGlhZ3JhbV9QYWxldHRlX25vZGVzX2dyb3VwX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWN0aXZpdHlEaWFncmFtX1BhbGV0dGVfbm9kZXNfdGl0bGVzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHByZXZpb3VzX25hbWVfbnVsbDE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyX25hbWVfZW1wdHk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgbW92ZUFjdGlvbl9sYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBYnN0cmFjdERpYWdyYW1fU2VsZWN0X3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWJzdHJhY3REaWFncmFtX1NlbGVjdF90b29sdGlwOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFic3RyYWN0RGlhZ3JhbV9BZGROb2RlX3RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFic3RyYWN0RGlhZ3JhbV9BZGROb2RlX2Vycl9tc2c7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWJzdHJhY3REaWFncmFtX0xpbmtfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBYnN0cmFjdERpYWdyYW1fTGlua19zZWxlY3Q7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWJzdHJhY3REaWFncmFtX0xpbmtfdG9vbHRpcDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3Rpdml0eURpYWdyYW1fU3RhcnROb2RlX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWN0aXZpdHlEaWFncmFtX1N0YXJ0Tm9kZV90b29sdGlwOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFic3RyYWN0RGlhZ3JhbV9GcmVlVGV4dF90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFic3RyYWN0RGlhZ3JhbV9GcmVlVGV4dF90b29sdGlwOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdGl2aXR5RGlhZ3JhbV9TeW5jQmFyX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWN0aXZpdHlEaWFncmFtX1N5bmNCYXJfdG9vbHRpcDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3Rpdml0eURpYWdyYW1fRGVjaXNpb25Ob2RlX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWN0aXZpdHlEaWFncmFtX0RlY2lzaW9uTm9kZV90b29sdGlwOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdGl2aXR5RGlhZ3JhbV9FbmROb2RlX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWN0aXZpdHlEZXRhaWxEaWFncmFtX3ByZWZpeDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3Rpdml0eURpYWdyYW1fRW5kTm9kZV90b29sdGlwOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdGl2aXR5RGlhZ3JhbV9BY3Rpdml0eV90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdGl2aXR5RGlhZ3JhbV9BY3Rpdml0eV90b29sdGlwOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdGl2aXR5RGlhZ3JhbV9JdGVyYXRpb25fdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3Rpdml0eURpYWdyYW1fSXRlcmF0aW9uX3Rvb2x0aXA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWN0aXZpdHlEaWFncmFtX1BoYXNlX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWN0aXZpdHlEaWFncmFtX1BoYXNlX3Rvb2x0aXA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWJzdHJhY3REaWFncmFtX1Rhc2tEZXNjcmlwdG9yX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWJzdHJhY3REaWFncmFtX1JvbGVEZXNjcmlwdG9yX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvZ3Jlc3NfU2F2aW5nX21lc3NhZ2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgV2FybmluZ19TYXZpbmdfRGlhZ3JhbTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtX3ByZWZpeDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBYnN0cmFjdERpYWdyYW1fUm9sZURlc2NyaXB0b3JfdG9vbHRpcDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBYnN0cmFjdERpYWdyYW1fVGFza0Rlc2NyaXB0b3JfdG9vbHRpcDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3R2aXRpdml0eURpYWdyYW1fRGVsaXZlcnlQcm9jZXNzX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWN0dml0aXZpdHlEaWFncmFtX0NhcGFiaWxpdHlQYXR0ZXJuX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWN0dml0aXZpdHlEaWFncmFtX1BoYXNlX3RleDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3R2aXRpdml0eURpYWdyYW1fSXRlcmF0aW9uX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWN0dml0aXZpdHlEaWFncmFtX0FjdGl2aXR5X3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWJzdHJhY3REaWFncmFtX1dvcmtQcm9kdWN0RGVzY3JpcHRvcl90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFic3RyYWN0RGlhZ3JhbV9Xb3JrUHJvZHVjdERlc2NyaXB0b3JfdG9vbHRpcDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBYnN0cmFjdERpYWdyYW1FZGl0b3JfYWxpZ25NZW51X3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWJzdHJhY3REaWFncmFtRWRpdG9yX3JlZnJlc2hGcm9tQmFzZUFjdGl2aXR5X3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWJzdHJhY3REaWFncmFtRWRpdG9yX2Zvcm1hdFRleHRCb3hBY3Rpdml0eV90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFic3RyYWN0RGlhZ3JhbUVkaXRvcl9oQWxpZ25BdmVyYWdlQWN0aW9uX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWJzdHJhY3REaWFncmFtRWRpdG9yX2hBbGlnbkZpcnN0U2VsZWN0ZWRBY3Rpb25fdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBYnN0cmFjdERpYWdyYW1FZGl0b3JfdkFsaWduQXZlcmFnZUFjdGlvbl90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFic3RyYWN0RGlhZ3JhbUVkaXRvcl92QWxpZ25GaXJzdFNlbGVjdGVkQWN0aW9uX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWJzdHJhY3REaWFncmFtRWRpdG9yX1NhdmVfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBYnN0cmFjdERpYWdyYW1FZGl0b3JfU2F2ZV9tZXNzYWdlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFic3RyYWN0RGlhZ3JhbUVkaXRvcl9Nb3ZlTm9kZV9sYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBYnN0cmFjdERpYWdyYW1FZGl0b3JyZWZyZXNoZnJvbWJhc2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWJzdHJhY3REaWFncmFtX0JlbmRQb2ludF9jcmVhdGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWN0aXZpdHlEaWFncmFtX29wZW5BY3Rpdml0eURldGFpbERpYWdyYW1fdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZWZyZXNoQWN0aW9uX2xhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlZnJlc2hGcm9tQmFzZUNtZF9sYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkaWFncmFtX3NhdmVFcnJvcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEZWxldGVEaWFncmFtX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGVsZXRlRGlhZ3JhbV9wcm9tcHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgYWxpZ25fYmVuZF9wb2ludF90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbmZpZ3VyYXRpb25FZGl0b3JJbnB1dF9jb25maWdlZGl0b3IwOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRpYWdyYW1fbm9kZV9wcm9wZXJ0eV92YWx1ZV9wcm9ibGVtX21zZzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkaWFncmFtX2Vycm9yRGlhbG9nX3RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvcl9SZXNldERpYWdyYW1MYXlvdXRfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJvckRpYWxvZ190aXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb21tYW5kX2Nhbm5vdEVkaXQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWJzdHJhY3REaWFncmFtRWRpdG9yX1BhcmVudEVkaXRvckNsb3NlX3RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFic3RyYWN0RGlhZ3JhbUVkaXRvcl9QYXJlbnRFZGl0b3JDbG9zZV90ZXh0OwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERpYWdyYW1WYWxpZGF0aW9uX2Vycl9jYW5ub3RfY29ubmVjdF90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERpYWdyYW1WYWxpZGF0aW9uX2Vycl9zYW1lcHJlZGFuZHN1Y190ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERpYWdyYW1WYWxpZGF0aW9uX2Vycl9jYW5ub3RfZGVsZXRlX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGVsZXRlQ29tbWFuZF9sYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkZWxldGVMaW5rQ29tbWFuZF9sYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdGl2aXR5RGlhZ3JhbV9NaWxlc3RvbmVfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3Rpdml0eURpYWdyYW1fTWlsZXN0b25lX3Rvb2x0aXA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWN0aXZpdHlEaWFncmFtX0pvaW5fTm9kZV90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdGl2aXR5RGlhZ3JhbV9Kb2luX05vZGVfdG9vbHRpcDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3Rpdml0eURpYWdyYW1fTWVyZ2VfTm9kZV90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdGl2aXR5RGlhZ3JhbV9NZXJnZV9Ob2RlX3Rvb2x0aXA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWN0aXZpdHlEaWFncmFtX0ZvcmtfTm9kZV90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdGl2aXR5RGlhZ3JhbV9Gb3JrX05vZGVfdG9vbHRpcDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3Rpdml0eURpYWdyYW1fUGFydGl0aW9uX05vZGVfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3Rpdml0eURpYWdyYW1fUGFydGl0aW9uX05vZGVfdG9vbHRpcDsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3Rpdml0eURpYWdyYW1fTmV3X1Rhc2tfRGVzY3JpcHRvcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3Rpdml0eURpYWdyYW1fTmV3X01pbGVzdG9uZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXUEREX05ld19Xb3JrUHJvZHVjdERlc2NyaXB0b3I7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWN0aXZpdHlEaWFncmFtX05ld19BY3Rpdml0eTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3Rpdml0eURpYWdyYW1fTmV3X1BoYXNlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdGl2aXR5RGlhZ3JhbV9OZXdfSXRlcmF0aW9uOwotCi0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWN0aXZpdHlEaWFncmFtX2tpbmQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWN0aXZpdHlEZXRhaWxfRGlhZ3JhbV9raW5kOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdvcmtQcm9kdWN0RGVwZW5kZW5jeV9EaWFncmFtX2tpbmQ7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgV1BERF9QYWxldHRlX2NvbnRyb2xfZmxvd190ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdQRERfUGFsZXR0ZV9jb250cm9sX2Zsb3dfY3JlYXRlX3RleHQ7Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2NvcmUvUmVzb3VyY2VzLnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9jb3JlL1Jlc291cmNlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMTgxODAwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2NvcmUvUmVzb3VyY2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjQgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLQotIyBDb21wbGV0ZSBuZXcgc3RyaW5ncyBuZWVkIHRyYW5zbGF0aW9uLgotcHJldmlvdXNfbmFtZV9udWxsMT1VbmRvIG9mIGEgbmFtZSBjaGFuZ2UgaXMgbm90IGFsbG93ZWQgaWYgdGhlIHByZXZpb3VzIG5hbWUgaXMgbnVsbC4KLWVycl9uYW1lX2VtcHR5PVRoZSBuYW1lIGNhbm5vdCBiZSBlbXB0eS4gUGxlYXNlIHNwZWNpZnkgYSB2YWxpZCBuYW1lLgotbW92ZUFjdGlvbl9sYWJlbD1Nb3ZlCi0KLUFic3RyYWN0RGlhZ3JhbV9TZWxlY3RfdGV4dD1TZWxlY3QKLUFic3RyYWN0RGlhZ3JhbV9TZWxlY3RfdG9vbHRpcD1TZWxlY3Qgbm9kZSBvciBsaW5rCi1BYnN0cmFjdERpYWdyYW1fQWRkTm9kZV90aXRsZT1BZGQgTm9kZQotQWJzdHJhY3REaWFncmFtX0FkZE5vZGVfZXJyX21zZz1JWFJEMDAwMlc6IEFkZGluZyBhIG5vZGUgdG8gZGlhZ3JhbSBmYWlsZWQKLUFic3RyYWN0RGlhZ3JhbV9MaW5rX3RleHQ9TGluawotQWJzdHJhY3REaWFncmFtX0xpbmtfc2VsZWN0PVNlbGVjdCBMaW5rCi1BYnN0cmFjdERpYWdyYW1fTGlua190b29sdGlwPUNyZWF0ZSBuZXcgbGluawotQWN0aXZpdHlEaWFncmFtX1N0YXJ0Tm9kZV90ZXh0PVN0YXJ0IE5vZGUKLUFjdGl2aXR5RGlhZ3JhbV9TdGFydE5vZGVfdG9vbHRpcD1DcmVhdGUgYSBTdGFydCBOb2RlCi1BYnN0cmFjdERpYWdyYW1fRnJlZVRleHRfdGV4dD1GcmVlIFRleHQKLUFic3RyYWN0RGlhZ3JhbV9GcmVlVGV4dF90b29sdGlwPUNyZWF0ZSBuZXcgZnJlZSB0ZXh0Ci1BY3Rpdml0eURpYWdyYW1fU3luY0Jhcl90ZXh0PVN5bmNocm9uaXphdGlvbiBCYXIKLUFjdGl2aXR5RGlhZ3JhbV9TeW5jQmFyX3Rvb2x0aXA9Q3JlYXRlIG5ldyBzeW5jaHJvbml6YXRpb24gYmFyCi1BY3Rpdml0eURpYWdyYW1fRGVjaXNpb25Ob2RlX3RleHQ9RGVjaXNpb24gTm9kZQotQWN0aXZpdHlEaWFncmFtX0RlY2lzaW9uTm9kZV90b29sdGlwPUNyZWF0ZSBhIERlY2lzaW9uIE5vZGUKLUFjdGl2aXR5RGlhZ3JhbV9FbmROb2RlX3RleHQ9RW5kIE5vZGUKLUFjdGl2aXR5RGV0YWlsRGlhZ3JhbV9wcmVmaXg9QWN0aXZpdHkgRGV0YWlsOgotQWN0aXZpdHlEaWFncmFtX0VuZE5vZGVfdG9vbHRpcD1DcmVhdGUgYW4gRW5kIE5vZGUKLUFjdGl2aXR5RGlhZ3JhbV9BY3Rpdml0eV90ZXh0PUFjdGl2aXR5Ci1BY3Rpdml0eURpYWdyYW1fQWN0aXZpdHlfdG9vbHRpcD1DcmVhdGUgYW4gQWN0aXZpdHkKLUFjdGl2aXR5RGlhZ3JhbV9JdGVyYXRpb25fdGV4dD1JdGVyYXRpb24KLUFjdGl2aXR5RGlhZ3JhbV9JdGVyYXRpb25fdG9vbHRpcD1DcmVhdGUgYW4gSXRlcmF0aW9uCi1BY3Rpdml0eURpYWdyYW1fUGhhc2VfdGV4dD1QaGFzZQotQWN0aXZpdHlEaWFncmFtX1BoYXNlX3Rvb2x0aXA9Q3JlYXRlIGEgUGhhc2UKLUFic3RyYWN0RGlhZ3JhbV9UYXNrRGVzY3JpcHRvcl90ZXh0PVRhc2sgRGVzY3JpcHRvcgotQWJzdHJhY3REaWFncmFtX1JvbGVEZXNjcmlwdG9yX3RleHQ9Um9sZSBEZXNjcmlwdG9yCi1Xb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtX3ByZWZpeD1Xb3JrIFByb2R1Y3QgRGVwZW5kZW5jeSBEaWFncmFtOgotQWJzdHJhY3REaWFncmFtX1JvbGVEZXNjcmlwdG9yX3Rvb2x0aXA9Q3JlYXRlIGEgUm9sZSBEZXNjcmlwdG9yCi1BYnN0cmFjdERpYWdyYW1fVGFza0Rlc2NyaXB0b3JfdG9vbHRpcD1DcmVhdGUgYSBUYXNrIERlc2NyaXB0b3IKLUFjdHZpdGl2aXR5RGlhZ3JhbV9EZWxpdmVyeVByb2Nlc3NfdGV4dD1EZWxpdmVyeSBQcm9jZXNzCi1BY3R2aXRpdml0eURpYWdyYW1fQ2FwYWJpbGl0eVBhdHRlcm5fdGV4dD1DYXBhYmlsaXR5IFBhdHRlcm4KLUFjdHZpdGl2aXR5RGlhZ3JhbV9QaGFzZV90ZXg9UGhhc2UKLUFjdHZpdGl2aXR5RGlhZ3JhbV9JdGVyYXRpb25fdGV4dD1JdGVyYXRpb24KLUFjdHZpdGl2aXR5RGlhZ3JhbV9BY3Rpdml0eV90ZXh0PUFjdGl2aXR5Ci1BYnN0cmFjdERpYWdyYW1fV29ya1Byb2R1Y3REZXNjcmlwdG9yX3RleHQ9V29yayBQcm9kdWN0IERlc2NyaXB0b3IKLUFic3RyYWN0RGlhZ3JhbV9Xb3JrUHJvZHVjdERlc2NyaXB0b3JfdG9vbHRpcD1DcmVhdGUgYSBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvcgotCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfYWxpZ25NZW51X3RleHQ9QWxpZ24KLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl9yZWZyZXNoRnJvbUJhc2VBY3Rpdml0eV90ZXh0PVJlZnJlc2ggZnJvbSBCYXNlIEFjdGl2aXR5Ci1BYnN0cmFjdERpYWdyYW1FZGl0b3JfZm9ybWF0VGV4dEJveEFjdGl2aXR5X3RleHQ9Rm9ybWF0IFRleHQgQm94Li4uCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfaEFsaWduQXZlcmFnZUFjdGlvbl90ZXh0PUhvcml6b250YWxseSB0byBBdmVyYWdlCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfaEFsaWduRmlyc3RTZWxlY3RlZEFjdGlvbl90ZXh0PUhvcml6b250YWxseSB0byBGaXJzdCBTZWxlY3RlZAotQWJzdHJhY3REaWFncmFtRWRpdG9yX3ZBbGlnbkF2ZXJhZ2VBY3Rpb25fdGV4dD1WZXJ0aWNhbGx5IHRvIEF2ZXJhZ2UKLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl92QWxpZ25GaXJzdFNlbGVjdGVkQWN0aW9uX3RleHQ9VmVydGljYWxseSB0byBGaXJzdCBTZWxlY3RlZAotQWJzdHJhY3REaWFncmFtRWRpdG9yX1NhdmVfdGV4dD1TYXZlCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfU2F2ZV9tZXNzYWdlPVNhdmluZyB7MH0KLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl9Nb3ZlTm9kZV9sYWJlbD1Nb3ZlIE5vZGUKLUFic3RyYWN0RGlhZ3JhbUVkaXRvcnJlZnJlc2hmcm9tYmFzZT1SZWZyZXNoIEZyb20gQmFzZQotQWJzdHJhY3REaWFncmFtX0JlbmRQb2ludF9jcmVhdGU9Q3JlYXRlIEJlbmRwb2ludAotCi1BY3Rpdml0eURpYWdyYW1fb3BlbkFjdGl2aXR5RGV0YWlsRGlhZ3JhbV90ZXh0PU9wZW4gQWN0aXZpdHkgRGV0YWlsIERpYWdyYW0KLXJlZnJlc2hBY3Rpb25fbGFiZWw9UmVmcmVzaAotcmVmcmVzaEZyb21CYXNlQ21kX2xhYmVsPVJlZnJlc2ggRnJvbSBCYXNlCi1kaWFncmFtX3NhdmVFcnJvcj1JVVBEMDAwMVc6IFNhdmluZyBkaWFncmFtIGZhaWxlZAotCi1EZWxldGVEaWFncmFtX3RleHQ9RGVsZXRlIERpYWdyYW0KLURlbGV0ZURpYWdyYW1fcHJvbXB0PUFyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBjbG9zZSBhbmQgZGVsZXRlIHRoaXMgZGlhZ3JhbT9cblRoaXMgY2hhbmdlIGlzIHBlcm1hbmVudCBhbmQgY2Fubm90IGJlIHVuZG9uZS4KLWFsaWduX2JlbmRfcG9pbnRfdGV4dD1BbGlnbiBCZW5kIFBvaW50Ci1Db25maWd1cmF0aW9uRWRpdG9ySW5wdXRfY29uZmlnZWRpdG9yMD1Db25maWd1cmF0aW9uIEVkaXRvcgotZGlhZ3JhbV9ub2RlX3Byb3BlcnR5X3ZhbHVlX3Byb2JsZW1fbXNnPUVycm9yIGluIHRoZSBub2RlJ3MgcHJvcGVydHkgdmFsdWUuCi1kaWFncmFtX2Vycm9yRGlhbG9nX3RpdGxlPUVycm9yCi0KLUFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvcl9SZXNldERpYWdyYW1MYXlvdXRfdGV4dD1SZXNldCBEaWFncmFtIExheW91dAotZXJyb3JEaWFsb2dfdGl0bGU9RXJyb3IKLWNvbW1hbmRfY2Fubm90RWRpdD1JVVBEMDAwM0U6IENhbm5vdCBlZGl0IGRpYWdyYW0KLQotQWJzdHJhY3REaWFncmFtRWRpdG9yX1BhcmVudEVkaXRvckNsb3NlX3RpdGxlPVBhcmVudCBFZGl0b3IgQ2xvc2VkCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfUGFyZW50RWRpdG9yQ2xvc2VfdGV4dD17MH0gaGFzIGNsb3NlZC4gV291bGQgeW91IGFsc28gbGlrZSB0byBjbG9zZSB7MX0/Ci0KLSNCZWxvdyB0aHJlZSBzdHJpbmdzIG1vdmVkIGZyb20gQXV0aG9yaW5nVUkgcmVzb3VyY2VzLnByb3BlcnRpZXMuCi1EaWFncmFtVmFsaWRhdGlvbl9lcnJfY2Fubm90X2Nvbm5lY3RfdGV4dD1JVVBBMDAzMlc6IENhbm5vdCBjb25uZWN0Ci1EaWFncmFtVmFsaWRhdGlvbl9lcnJfc2FtZXByZWRhbmRzdWNfdGV4dD1JVVBBMDAzM1c6IENhbm5vdCBoYXZlIHRoZSBzYW1lIGJyZWFrZG93biBlbGVtZW50IGFzIHByZWRlY2Vzc29yIGFuZCBzdWNjZXNzb3IKLURpYWdyYW1WYWxpZGF0aW9uX2Vycl9jYW5ub3RfZGVsZXRlX3RleHQ9Q2Fubm90IGRlbGV0ZQotZGVsZXRlQ29tbWFuZF9sYWJlbD1EZWxldGUKLWRlbGV0ZUxpbmtDb21tYW5kX2xhYmVsPURlbGV0ZSBDb25uZWN0aW9uCi0KLUFjdGl2aXR5RGlhZ3JhbV9NaWxlc3RvbmVfdGV4dD1NaWxlc3RvbmUKLUFjdGl2aXR5RGlhZ3JhbV9NaWxlc3RvbmVfdG9vbHRpcD1DcmVhdGUgYSBNaWxlc3RvbmUKLUFjdGl2aXR5RGlhZ3JhbV9Kb2luX05vZGVfdGV4dD1Kb2luIE5vZGUKLUFjdGl2aXR5RGlhZ3JhbV9Kb2luX05vZGVfdG9vbHRpcD1DcmVhdGUgYSBKb2luIE5vZGUKLUFjdGl2aXR5RGlhZ3JhbV9NZXJnZV9Ob2RlX3RleHQ9TWVyZ2UgTm9kZQotQWN0aXZpdHlEaWFncmFtX01lcmdlX05vZGVfdG9vbHRpcD1DcmVhdGUgYSBNZXJnZSBOb2RlCi1BY3Rpdml0eURpYWdyYW1fRm9ya19Ob2RlX3RleHQ9Rm9yayBOb2RlCi1BY3Rpdml0eURpYWdyYW1fRm9ya19Ob2RlX3Rvb2x0aXA9Q3JlYXRlIGEgRm9yayBOb2RlCi1BY3Rpdml0eURpYWdyYW1fUGFydGl0aW9uX05vZGVfdGV4dD1BY3Rpdml0eSBQYXJ0aXRpb24KLUFjdGl2aXR5RGlhZ3JhbV9QYWxldHRlX2Zsb3dzX3RpdGxlPUZsb3dzCi1BY3Rpdml0eURpYWdyYW1fUGFsZXR0ZV9ub2Rlc190aXRsZXM9Tm9kZXMKLUFjdGl2aXR5RGlhZ3JhbV9QYWxldHRlX2Zsb3dzX2NyZWF0ZV90ZXh0PUNyZWF0aW9uIHRvb2wgZm9yIGZsb3dzCi1BY3Rpdml0eURpYWdyYW1fUGFsZXR0ZV9ub2Rlc19ncm91cF90ZXh0PUNyZWF0aW9uIHRvb2wgZ3JvdXAgZm9yIG5vZGVzCi1BY3Rpdml0eURpYWdyYW1fUGFsZXR0ZV9jb250cm9sX2Zsb3dfdGV4dD1Db250cm9sIEZsb3cKLUFjdGl2aXR5RGlhZ3JhbV9QYWxldHRlX2NvbnRyb2xfZmxvd19jcmVhdGVfdGV4dD1DcmVhdGUgYSBDb250cm9sIEZsb3cKLUFjdGl2aXR5RGlhZ3JhbV9QYXJ0aXRpb25fTm9kZV90b29sdGlwPUNyZWF0ZSBhbiBBY3Rpdml0eSBQYXJ0aXRpb24KLQotQWN0aXZpdHlEaWFncmFtX05ld19UYXNrX0Rlc2NyaXB0b3I9TmV3IFRhc2sgRGVzY3JpcHRvcgotQWN0aXZpdHlEaWFncmFtX05ld19NaWxlc3RvbmU9TmV3IE1pbGVzdG9uZQotV1BERF9OZXdfV29ya1Byb2R1Y3REZXNjcmlwdG9yPU5ldyBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvcgotQWN0aXZpdHlEaWFncmFtX05ld19BY3Rpdml0eT1OZXcgQWN0aXZpdHkKLUFjdGl2aXR5RGlhZ3JhbV9OZXdfUGhhc2U9TmV3IFBoYXNlCi1BY3Rpdml0eURpYWdyYW1fTmV3X0l0ZXJhdGlvbj1OZXcgSXRlcmF0aW9uCi1Qcm9ncmVzc19TYXZpbmdfbWVzc2FnZT1TYXZpbmcgezB9Ci1XYXJuaW5nX1NhdmluZ19EaWFncmFtPUlVUEQwMDAxVzogU2F2aW5nIGRpYWdyYW0gZmFpbGVkCi0KLUFjdGl2aXR5RGlhZ3JhbV9raW5kPUFjdGl2aXR5IERpYWdyYW0KLUFjdGl2aXR5RGV0YWlsX0RpYWdyYW1fa2luZD1BY3Rpdml0eSBEZXRhaWwgRGlhZ3JhbQotV29ya1Byb2R1Y3REZXBlbmRlbmN5X0RpYWdyYW1fa2luZD1Xb3JrIFByb2R1Y3QgRGVwZW5kZW5jeSBEaWFncmFtCi1XUEREX1BhbGV0dGVfY29udHJvbF9mbG93X3RleHQ9V29yayBQcm9kdWN0IERlcGVuZGVuY3kKLVdQRERfUGFsZXR0ZV9jb250cm9sX2Zsb3dfY3JlYXRlX3RleHQ9Q3JlYXRlIGEgV29yayBQcm9kdWN0IERlcGVuZGVuY3kgCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9jb3JlL2FjdGlvbnMvQWNjZXNzaWJpbGl0eU1vdmVBY3Rpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2NvcmUvYWN0aW9ucy9BY2Nlc3NpYmlsaXR5TW92ZUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZDVhNDRiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2NvcmUvYWN0aW9ucy9BY2Nlc3NpYmlsaXR5TW92ZUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI3ICswLDAgQEAKLS8qKgotICogCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkFic29sdXRlQmVuZHBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Qb3NpdGlvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuRGlhZ3JhbUNvcmVSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5icmlkZ2UuQnJpZGdlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuYnJpZGdlLkRpYWdyYW1BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuY29tbWFuZHMuQ2hhbmdlQm91bmRzQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnBhcnQuQWJzdHJhY3REaWFncmFtRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUudXRpbC5EaWFncmFtQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5Db25uZWN0aW9uRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUuY29tbWFuZC5Db21wb3NpdGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS51dGlsLlZpZXdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuYWN0aW9ucy5EaWFncmFtQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuY29tbWFuZHMuQ29tbWFuZFByb3h5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuY29tbWFuZHMuSUNvbW1hbmRQcm94eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5HcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JR3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5FZGdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm90YXRpb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlJlbGF0aXZlQmVuZHBvaW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotCi0vKioKLSAqIEFjdGlvbiBjbGFzcyB0byBtb3ZlIGRpYWdyYW0gZWxlbWVudHMgaW4gZGlhZ3JhbSBhcmVhIHVzaW5nIGtleWJvYXJkIHVwLCBkb3duLCBsZWZ0LCByaWdodCBrZXlzLgotICogVXNlZnVsIGZvciBBY2Nlc3NpYmlsaXR5LCBhbmQgYWxzbyBkb2VzIG1vdmUgYmVuZHBvaW50cyBvZiBjb250cm9sIGZsb3cuCi0gKiAKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICovCi1wdWJsaWMgY2xhc3MgQWNjZXNzaWJpbGl0eU1vdmVBY3Rpb24gZXh0ZW5kcyBEaWFncmFtQWN0aW9uIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1PVkVfTEVGVF9BQ1RJT04gPSAibW92ZV9sZWZ0X2FjdGlvbiI7CQkvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTU9WRV9SSUdIVF9BQ1RJT04gPSAibW92ZV9yaWdodF9hY3Rpb24iOwkJLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1PVkVfRE9XTl9BQ1RJT04gPSAibW92ZV9kb3duX2FjdGlvbiI7CQkvLyROT04tTkxTLTEkCQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNT1ZFX1VQX0FDVElPTiA9ICJtb3ZlX3VwX2FjdGlvbiI7CQkJLy8kTk9OLU5MUy0xJAotCQotCXByaXZhdGUgaW50IGRpcmVjdGlvbjsKLQkKLQotCS8qKgotCSAqIEBwYXJhbSB3b3JrYmVuY2hQYWdlCi0JICovCi0JcHVibGljIEFjY2Vzc2liaWxpdHlNb3ZlQWN0aW9uKElXb3JrYmVuY2hQYWdlIHdvcmtiZW5jaFBhZ2UpIHsKLQkJc3VwZXIod29ya2JlbmNoUGFnZSk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHdvcmtiZW5jaHBhcnQKLQkgKi8KLQlwdWJsaWMgQWNjZXNzaWJpbGl0eU1vdmVBY3Rpb24oSVdvcmtiZW5jaFBhcnQgd29ya2JlbmNocGFydCwgaW50IGRpcmVjdGlvbikgewotCQlzdXBlcih3b3JrYmVuY2hwYXJ0KTsKLQkJdGhpcy5kaXJlY3Rpb24gPSBkaXJlY3Rpb247Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5hY3Rpb25zLkRpYWdyYW1BY3Rpb24jY3JlYXRlVGFyZ2V0UmVxdWVzdCgpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFJlcXVlc3QgY3JlYXRlVGFyZ2V0UmVxdWVzdCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5hY3Rpb25zLkRpYWdyYW1BY3Rpb24jaXNTZWxlY3Rpb25MaXN0ZW5lcigpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgaW5pdCgpIHsKLQkJc3VwZXIuaW5pdCgpOwotCQlzZXRJZChEaWFncmFtQ29uc3RhbnRzLk1PVkVfQUNUSU9OKTsKLQkJCi0JfQotCQotCXB1YmxpYyB2b2lkIHNldERpcmVjdGlvbihpbnQgZGlyZWN0aW9uKXsKLQkJdGhpcy5kaXJlY3Rpb24gPSBkaXJlY3Rpb247Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBDb21tYW5kIGdldENvbW1hbmQoKSB7Ci0JCUxpc3QgbGlzdCA9IGdldFNlbGVjdGVkT2JqZWN0cygpOwotCQlDb21wb3NpdGVDb21tYW5kIGNjID0gbmV3IENvbXBvc2l0ZUNvbW1hbmQoRGlhZ3JhbUNvcmVSZXNvdXJjZXMuQWJzdHJhY3REaWFncmFtRWRpdG9yX01vdmVOb2RlX2xhYmVsKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGxpc3QuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IHBhcnQgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZihwYXJ0IGluc3RhbmNlb2YgR3JhcGhpY2FsRWRpdFBhcnQpewotCQkJCUNvbW1hbmQgYyA9IG1vdmUoZGlyZWN0aW9uLCAoR3JhcGhpY2FsRWRpdFBhcnQpcGFydCk7Ci0JCQkJaWYoYyAhPSBudWxsKXsKLQkJCQkJY2MuY29tcG9zZShuZXcgQ29tbWFuZFByb3h5KGMpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGNjLmlzRW1wdHkoKSA/IG51bGwgOiBuZXcgSUNvbW1hbmRQcm94eShjYy5yZWR1Y2UoKSk7Ci0JfQotCQotCXB1YmxpYyBDb21tYW5kIG1vdmUoaW50IGRpcmVjdGlvbiwgR3JhcGhpY2FsRWRpdFBhcnQgcGFydCkgewotCQlpZiAocGFydC5nZXRNb2RlbCgpIGluc3RhbmNlb2YgTm9kZSkgewotCQkJVmlldyB2aWV3ID0gKFZpZXcpIHBhcnQuZ2V0TW9kZWwoKTsKLQkJCU9iamVjdCB4ID0gVmlld1V0aWwuZ2V0U3RydWN0dXJhbEZlYXR1cmVWYWx1ZSh2aWV3LAotCQkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldExvY2F0aW9uX1goKSk7Ci0JCQlPYmplY3QgeSA9IFZpZXdVdGlsLmdldFN0cnVjdHVyYWxGZWF0dXJlVmFsdWUodmlldywKLQkJCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRMb2NhdGlvbl9ZKCkpOwotCQkJUG9pbnQgcG9pbnQgPSBuZXcgUG9pbnQoKChJbnRlZ2VyKSB4KS5pbnRWYWx1ZSgpLCAoKEludGVnZXIpIHkpLmludFZhbHVlKCkpOwotCQkJaW50IG5ld3ggPSBwb2ludC54OwotCQkJaW50IG5ld3kgPSBwb2ludC55OwotCQkJaW50IHByZXNzbGVuZ3RoID0gMTsKLQkJCXN3aXRjaCAoZGlyZWN0aW9uKSB7Ci0JCQljYXNlIFBvc2l0aW9uQ29uc3RhbnRzLkVBU1Q6Ci0JCQkJbmV3eCA9IHBvaW50LnggKyBwcmVzc2xlbmd0aDsKLQkJCQlicmVhazsKLQkJCWNhc2UgUG9zaXRpb25Db25zdGFudHMuU09VVEg6Ci0JCQkJbmV3eSArPSBwcmVzc2xlbmd0aDsKLQkJCQlicmVhazsKLQkJCWNhc2UgUG9zaXRpb25Db25zdGFudHMuTk9SVEg6Ci0JCQkJbmV3eSAtPSBwcmVzc2xlbmd0aDsKLQkJCQlicmVhazsKLQkJCWNhc2UgUG9zaXRpb25Db25zdGFudHMuV0VTVDoKLQkJCQluZXd4IC09IHByZXNzbGVuZ3RoOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCQlicmVhazsKLQkJCX0KLQkJCW9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kIGMgPSBuZXcgQ2hhbmdlQm91bmRzQ29tbWFuZCgKLQkJCQkJZ2V0RWRpdGluZ0RvbWFpbigpLAotCQkJCQl2aWV3LCBuZXcgUG9pbnQobmV3eCwgbmV3eSksIC0xLCAtMSk7Ci0KLQkJCXJldHVybiBjOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBDb21tYW5kIG1vdmVCZW5kUG9pbnQoaW50IGRpcmVjdGlvbiwgQ29ubmVjdGlvbkVkaXRQYXJ0IHBhcnQpewotCQkvLyBUT0RPLSBjaGVjayBhZGRpbmcgbW9yZSBiZW5kcG9pbnQsIGNhcHR1cmUgYmVuZHBvaW50Ci0JCS8vIGluZGV4IG9uIGZseQotCQlpZiAocGFydC5nZXRNb2RlbCgpIGluc3RhbmNlb2YgRWRnZSkgewotCQkJRWRnZSBlZGdlID0gKEVkZ2UpIHBhcnQuZ2V0TW9kZWwoKTsKLQkJCVJlbGF0aXZlQmVuZHBvaW50cyBiUG9pbnRzID0gKFJlbGF0aXZlQmVuZHBvaW50cyllZGdlLmdldEJlbmRwb2ludHMoKTsKLQkJCUxpc3QgYmxpc3QgPSBiUG9pbnRzLmdldFBvaW50cygpOwotCQkJaW50IGluZGV4ID0gMDsKLQkJCWlmIChibGlzdCAhPSBudWxsICYmIGJsaXN0LnNpemUoKSA+IDApIHsKLQkJCQlBYnNvbHV0ZUJlbmRwb2ludCBwb2ludCA9IChBYnNvbHV0ZUJlbmRwb2ludCkgYmxpc3QKLQkJCQkJCS5nZXQoaW5kZXgpOwotCQkJCWludCBuZXd4ID0gcG9pbnQueDsKLQkJCQlpbnQgbmV3eSA9IHBvaW50Lnk7Ci0JCQkJaW50IHByZXNzbGVuZ3RoID0gNTsKLQkJCQlzd2l0Y2ggKGRpcmVjdGlvbikgewotCQkJCWNhc2UgMToKLQkJCQkJbmV3eCA9IHBvaW50LnggKyBwcmVzc2xlbmd0aDsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAyOgotCQkJCQluZXd5ICs9IHByZXNzbGVuZ3RoOwotCQkJCQlicmVhazsKLQkJCQljYXNlIDM6Ci0JCQkJCW5ld3kgLT0gcHJlc3NsZW5ndGg7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgNDoKLQkJCQkJbmV3eCAtPSBwcmVzc2xlbmd0aDsKLQkJCQkJYnJlYWs7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCS8vVE9ETzogaW1wbGVtZW50IHRoZSBtb3ZlYmVuZHBvaW50IGNvbW1hbmQuCi0vLwkJCQlvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZCBjID0gbmV3IE1vdmVCZW5kcG9pbnRDb21tYW5kKAotLy8JCQkJCQlsaW5rLCBuZXcgUG9pbnQobmV3eCwgbmV3eSksIGluZGV4KTsKLS8vCQkJCWdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUoYyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCXB1YmxpYyBUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiBnZXRFZGl0aW5nRG9tYWluKCl7Ci0JCXJldHVybiAoKEFic3RyYWN0RGlhZ3JhbUVkaXRvcilnZXREaWFncmFtV29ya2JlbmNoUGFydCgpKS5nZXRFZGl0aW5nRG9tYWluKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCXN3aXRjaChkaXJlY3Rpb24pewotCQljYXNlIFBvc2l0aW9uQ29uc3RhbnRzLkVBU1Q6Ci0JCQlyZXR1cm4gTU9WRV9SSUdIVF9BQ1RJT047Ci0JCWNhc2UgUG9zaXRpb25Db25zdGFudHMuU09VVEg6Ci0JCQlyZXR1cm4gTU9WRV9ET1dOX0FDVElPTjsKLQkJY2FzZSBQb3NpdGlvbkNvbnN0YW50cy5OT1JUSDoKLQkJCXJldHVybiBNT1ZFX1VQX0FDVElPTjsKLQkJY2FzZSBQb3NpdGlvbkNvbnN0YW50cy5XRVNUOgotCQkJcmV0dXJuIE1PVkVfTEVGVF9BQ1RJT047Ci0JCX0KLQkJcmV0dXJuIERpYWdyYW1Db25zdGFudHMuTU9WRV9BQ1RJT047Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGlzRW5hYmxlZCgpIHsKLQkJaWYoVG5nVXRpbC5pc0xvY2tlZChnZXRPd25pbmdQcm9jZXNzKCkpKQotCQkJCXJldHVybiBmYWxzZTsKLQkJaWYoQnJpZGdlSGVscGVyLmlzUmVhZE9ubHkoKChBYnN0cmFjdERpYWdyYW1FZGl0b3IpZ2V0RGlhZ3JhbVdvcmtiZW5jaFBhcnQoKSkuZ2V0RGlhZ3JhbSgpKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCWlmKGdldFNlbGVjdGVkT2JqZWN0cygpLmlzRW1wdHkoKSkgcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gc3VwZXIuaXNFbmFibGVkKCk7Ci0JfQotCQotCXByaXZhdGUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzIGdldE93bmluZ1Byb2Nlc3MoKXsKLQkJSVdvcmtiZW5jaFBhcnQgdGFyZ2V0UGFydCA9IGdldERpYWdyYW1Xb3JrYmVuY2hQYXJ0KCk7Ci0JCWlmKHRhcmdldFBhcnQgIT0gbnVsbCl7Ci0JCQlEaWFncmFtIGQgPSAoKEFic3RyYWN0RGlhZ3JhbUVkaXRvcil0YXJnZXRQYXJ0KS5nZXREaWFncmFtKCk7Ci0JCQlEaWFncmFtQWRhcHRlciBhZGFwdGVyID0gQnJpZGdlSGVscGVyLmdldERpYWdyYW1BZGFwdGVyKGQuZ2V0RWxlbWVudCgpKTsKLQkJCWlmKGFkYXB0ZXIgIT0gbnVsbCl7Ci0JCQkJcmV0dXJuIFRuZ1V0aWwuZ2V0T3duaW5nUHJvY2VzcyhhZGFwdGVyLmdldEFjdGl2aXR5KCkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2NvcmUvYWN0aW9ucy9BY3Rpb25EZWxlZ2F0ZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vY29yZS9hY3Rpb25zL0FjdGlvbkRlbGVnYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwNjk5NDAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vY29yZS9hY3Rpb25zL0FjdGlvbkRlbGVnYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzUgKzAsMCBAQAotLyoqCi0gKiAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLklFZGl0aW5nRG9tYWluUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuR3JhcGhpY2FsVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kU3RhY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wYXJ0cy5EaWFncmFtQ29tbWFuZFN0YWNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucGFydHMuRGlhZ3JhbUdyYXBoaWNhbFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnByb3ZpZGVycy5EaWFncmFtQ29udGV4dE1lbnVQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklPYmplY3RBY3Rpb25EZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLQotLyoqCi0gKiAKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICoKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFjdGlvbkRlbGVnYXRlIGV4dGVuZHMgQWN0aW9uIGltcGxlbWVudHMgSU9iamVjdEFjdGlvbkRlbGVnYXRlIHsKLQotCXByb3RlY3RlZCBJV29ya2JlbmNoUGFydCB0YXJnZXRQYXJ0OwotCXByb3RlY3RlZCBMaXN0PEVkaXRQYXJ0PiBzZWxlY3RlZFBhcnRzID0gbmV3IEFycmF5TGlzdDxFZGl0UGFydD4oKTsKLQlwcm90ZWN0ZWQgUmVxdWVzdCB0YXJnZXRSZXF1ZXN0OwotCi0JcHVibGljIEFjdGlvbkRlbGVnYXRlKCl7Ci0JCQotCX0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgQWN0aW9uRGVsZWdhdGUoSUFjdGlvbiBhY3Rpb24sIElXb3JrYmVuY2hQYXJ0IHRhcmdldFBhcnQpIHsKLQkJdGhpcy50YXJnZXRQYXJ0ID0gdGFyZ2V0UGFydDsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JT2JqZWN0QWN0aW9uRGVsZWdhdGUjc2V0QWN0aXZlUGFydChvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiwgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQpCi0JICovCi0JcHVibGljIHZvaWQgc2V0QWN0aXZlUGFydChJQWN0aW9uIGFjdGlvbiwgSVdvcmtiZW5jaFBhcnQgdGFyZ2V0UGFydCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXRoaXMudGFyZ2V0UGFydCA9IHRhcmdldFBhcnQ7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkRlbGVnYXRlI3J1bihvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBydW4oSUFjdGlvbiBhY3Rpb24pIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlleGVjdXRlKGdldENvbW1hbmQoKSwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkRlbGVnYXRlI3NlbGVjdGlvbkNoYW5nZWQob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24sIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElBY3Rpb24gYWN0aW9uLCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlkcm9wTWVudUl0ZW1zKCk7Ci0JCXNlbGVjdGVkUGFydHMuY2xlYXIoKTsKLQkJaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7Ci0JCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzdHJ1Y3R1cmVkU2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb247Ci0JCQlpZiAoc3RydWN0dXJlZFNlbGVjdGlvbi5zaXplKCkgPjAKLQkJCQkJJiYgc3RydWN0dXJlZFNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKSBpbnN0YW5jZW9mIEVkaXRQYXJ0KSB7Ci0JCQkJc2VsZWN0ZWRQYXJ0cy5hZGRBbGwoc3RydWN0dXJlZFNlbGVjdGlvbi50b0xpc3QoKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogZ2l2ZXMgYWNjZXNzIHRvIHRoZSBkaWFncmFtIGNvbW1hbmQgc3RhY2sKLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBkaWFncmFtIGNvbW1hbmQgc3RhY2sKLQkgKi8KLQlwcm90ZWN0ZWQgRGlhZ3JhbUNvbW1hbmRTdGFjayBnZXREaWFncmFtQ29tbWFuZFN0YWNrKCkgewotCQlPYmplY3Qgc3RhY2sgPSB0YXJnZXRQYXJ0LmdldEFkYXB0ZXIoQ29tbWFuZFN0YWNrLmNsYXNzKTsKLQkJcmV0dXJuIChzdGFjayBpbnN0YW5jZW9mIERpYWdyYW1Db21tYW5kU3RhY2spID8gKERpYWdyYW1Db21tYW5kU3RhY2spIHN0YWNrCi0JCQk6IG51bGw7Ci0JfQotCQotCXByb3RlY3RlZCBmaW5hbCBJV29ya2JlbmNoUGFydCBnZXRXb3JrYmVuY2hQYXJ0KCkgewotCQlyZXR1cm4gdGFyZ2V0UGFydDsKLQl9Ci0JCi0JLyoqCi0JICogR2V0cyB0aGUgY29udGV4dG1lbnVwcm92aWRlci4KLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIERpYWdyYW1Db250ZXh0TWVudVByb3ZpZGVyIGdldERpYWdyYW1Db250ZXh0TWVudVByb3ZpZGVyKCkgewotCQlpZih0YXJnZXRQYXJ0ICE9IG51bGwpewotCQkJRGlhZ3JhbUdyYXBoaWNhbFZpZXdlciB2aWV3ZXIgPSAoRGlhZ3JhbUdyYXBoaWNhbFZpZXdlcikgdGFyZ2V0UGFydAotCQkJCS5nZXRBZGFwdGVyKEdyYXBoaWNhbFZpZXdlci5jbGFzcyk7Ci0JCQlEaWFncmFtQ29udGV4dE1lbnVQcm92aWRlciBwcm92aWRlciA9IChEaWFncmFtQ29udGV4dE1lbnVQcm92aWRlcikgdmlld2VyCi0JCQkJLmdldENvbnRleHRNZW51KCk7Ci0JCQlyZXR1cm4gcHJvdmlkZXI7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qKgotCSAqIEV4ZWN1dGVzIHRoZSBnaXZlbiB7QGxpbmsgQ29tbWFuZH0uCi0JICogCi0JICogQHBhcmFtIGNvbW1hbmQKLQkgKiAgICAgICAgICAgIHRoZSBjb21tYW5kIHRvIGV4ZWN1dGUKLQkgKiBAcGFyYW0gcHJvZ3Jlc3NNb25pdG9yCi0JICogICAgICAgICAgICB0aGUgcHJvZ3Jlc3MgbW9uaXRvciB0byB1c2UgZHVyaW5nIGV4ZWN1dGlvbgotCSAqLwotCXByb3RlY3RlZCBmaW5hbCB2b2lkIGV4ZWN1dGUoQ29tbWFuZCBjb21tYW5kLAotCQkJSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzc01vbml0b3IpIHsKLQkJaWYgKGNvbW1hbmQgPT0gbnVsbCB8fCAhY29tbWFuZC5jYW5FeGVjdXRlKCkpCi0JCQlyZXR1cm47Ci0JCWlmIChnZXREaWFncmFtQ29tbWFuZFN0YWNrKCkgIT0gbnVsbCkKLQkJCWdldERpYWdyYW1Db21tYW5kU3RhY2soKS5leGVjdXRlKGNvbW1hbmQsIHByb2dyZXNzTW9uaXRvcik7Ci0JfQotCQotCXByb3RlY3RlZCBhYnN0cmFjdCBDb21tYW5kIGdldENvbW1hbmQoKTsKLQkKLQlwcm90ZWN0ZWQgdm9pZCBkcm9wTWVudUl0ZW1zKCl7Ci0JfQotCQotCSAvKioKLSAgICAgKiBHZXRzIGVkaXRpbmcgZG9tYWluCi0gICAgICogCi0gICAgICogQHJldHVybiBteSBlZGl0aW5nIGRvbWFpbgotICAgICAqLwotICAgIHByb3RlY3RlZCBUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiBnZXRFZGl0aW5nRG9tYWluKCkgewotICAgICAgICAKLSAgICAgICAgLy8gdHJ5IGFkYXB0aW5nIHRoZSB3b3JrYmVuY2ggcGFydAotICAgICAgICBJV29ya2JlbmNoUGFydCBwYXJ0ID0gZ2V0V29ya2JlbmNoUGFydCgpOwotCi0gICAgICAgIGlmIChwYXJ0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIElFZGl0aW5nRG9tYWluUHJvdmlkZXIgZWRQcm92aWRlciA9IChJRWRpdGluZ0RvbWFpblByb3ZpZGVyKSBwYXJ0Ci0gICAgICAgICAgICAgICAgLmdldEFkYXB0ZXIoSUVkaXRpbmdEb21haW5Qcm92aWRlci5jbGFzcyk7Ci0KLSAgICAgICAgICAgIGlmIChlZFByb3ZpZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIAlFZGl0aW5nRG9tYWluIGRvbWFpbiA9IGVkUHJvdmlkZXIuZ2V0RWRpdGluZ0RvbWFpbigpOwotICAgICAgICAgICAgCQotICAgICAgICAgICAgCWlmIChkb21haW4gaW5zdGFuY2VvZiBUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbikgewotICAgICAgICAgICAgCQlyZXR1cm4gKFRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluKSBkb21haW47Ci0gICAgICAgICAgICAJfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLSAgICAKLSAgICAvKioKLQkgKiBHZXRzIGEgcmVxdWVzdCB0byBiZSBhZGRyZXNzZWQgdG8gdGhlIG9wZXJhdGlvbiBzZXQKLQkgKiAKLQkgKiBAcmV0dXJuIGEgdGFyZ2V0IHJlcXVlc3QKLQkgKi8KLQlwcm90ZWN0ZWQgUmVxdWVzdCBnZXRUYXJnZXRSZXF1ZXN0KCkgewotCQlpZiAodGFyZ2V0UmVxdWVzdCA9PSBudWxsKQotCQkJdGFyZ2V0UmVxdWVzdCA9IGNyZWF0ZVRhcmdldFJlcXVlc3QoKTsKLQkJcmV0dXJuIHRhcmdldFJlcXVlc3Q7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyB0YXJnZXQgcmVxdWVzdAotCSAqIAotCSAqIEByZXR1cm4gdGhlIG5ldyB0YXJnZXQgcmVxdWVzdAotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCBSZXF1ZXN0IGNyZWF0ZVRhcmdldFJlcXVlc3QoKTsKLQkKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2NvcmUvYWN0aW9ucy9DcmVhdGVFbGVtZW50QWN0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9jb3JlL2FjdGlvbnMvQ3JlYXRlRWxlbWVudEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMDZlYzk4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2NvcmUvYWN0aW9ucy9DcmVhdGVFbGVtZW50QWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0vKioKLSAqIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuYWN0aW9uczsKLQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnBhcnQuQWJzdHJhY3REaWFncmFtRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi5jb3JlLmNvbW1hbmQuQ29tbWFuZFJlc3VsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUucHJlZmVyZW5jZXMuUHJlZmVyZW5jZXNIaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuY29tbWFuZHMuSUNvbW1hbmRQcm94eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5EaWFncmFtRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXF1ZXN0cy5DcmVhdGVVbnNwZWNpZmllZFR5cGVSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci0KLS8qKgotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKgotICovCi1wdWJsaWMgY2xhc3MgQ3JlYXRlRWxlbWVudEFjdGlvbiBleHRlbmRzIEFjdGlvbiB7Ci0KLQlwcml2YXRlIElXb3JrYmVuY2hQYXJ0IHRhcmdldFBhcnQ7Ci0JcHJpdmF0ZSBMaXN0IGVsZW1lbnRUeXBlcyA9IG5ldyBBcnJheUxpc3Q8RWxlbWVudFR5cGU+KCk7Ci0JcHJpdmF0ZSBQcmVmZXJlbmNlc0hpbnQgcHJlZmVyZW5jZUhpbnQgPSBudWxsOwotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBDcmVhdGVFbGVtZW50QWN0aW9uKElXb3JrYmVuY2hQYXJ0IHRhcmdldFBhcnQsIFN0cmluZyB0ZXh0KSB7Ci0JCXN1cGVyKHRleHQpOwotCQl0aGlzLnRhcmdldFBhcnQgPSB0YXJnZXRQYXJ0OwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJUmVxdWVzdCByZXE9IG5ldyBDcmVhdGVVbnNwZWNpZmllZFR5cGVSZXF1ZXN0KGdldEVsZW1lbnRUeXBlcygpLCBnZXRQcmVmZXJlbmNlSGludCgpKTsKLQkJRGlhZ3JhbUVkaXRQYXJ0IGRpYWdyYW1FZGl0UGFydCA9IGdldERpYWdyYW1FZGl0UGFydCgpOwotCQlpZihkaWFncmFtRWRpdFBhcnQuaXNFZGl0TW9kZUVuYWJsZWQoKSl7Ci0JCQlDb21tYW5kIGNtZCA9IGdldERpYWdyYW1FZGl0UGFydCgpLmdldENvbW1hbmQocmVxKTsKLQkJCWlmKGNtZC5jYW5FeGVjdXRlKCkpewotCQkJCWNtZC5leGVjdXRlKCk7Ci0JCQkJaWYoY21kIGluc3RhbmNlb2YgSUNvbW1hbmRQcm94eSl7Ci0JCQkJCUNvbW1hbmRSZXN1bHQgcmVzdWx0cyA9ICgoSUNvbW1hbmRQcm94eSljbWQpLmdldElDb21tYW5kKCkuZ2V0Q29tbWFuZFJlc3VsdCgpOwotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4ocmVzdWx0cyk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCX0KLQkKLQlwcml2YXRlIERpYWdyYW1FZGl0UGFydCBnZXREaWFncmFtRWRpdFBhcnQoKXsKLQkJaWYodGFyZ2V0UGFydCAhPSBudWxsICYmIHRhcmdldFBhcnQgaW5zdGFuY2VvZiBBYnN0cmFjdERpYWdyYW1FZGl0b3IpewotCQkJcmV0dXJuICgoQWJzdHJhY3REaWFncmFtRWRpdG9yKXRhcmdldFBhcnQpLmdldERpYWdyYW1FZGl0UGFydCgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBMaXN0IGdldEVsZW1lbnRUeXBlcygpIHsKLQkJcmV0dXJuIGVsZW1lbnRUeXBlczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRFbGVtZW50VHlwZXMoTGlzdCBlbGVtZW50VHlwZXMpIHsKLQkJdGhpcy5lbGVtZW50VHlwZXMgPSBlbGVtZW50VHlwZXM7Ci0JfQotCi0JcHVibGljIFByZWZlcmVuY2VzSGludCBnZXRQcmVmZXJlbmNlSGludCgpIHsKLQkJcmV0dXJuIHByZWZlcmVuY2VIaW50OwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFByZWZlcmVuY2VIaW50KFByZWZlcmVuY2VzSGludCBwcmVmZXJlbmNlSGludCkgewotCQl0aGlzLnByZWZlcmVuY2VIaW50ID0gcHJlZmVyZW5jZUhpbnQ7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vY29yZS9hY3Rpb25zL0RlbGVnYXRlQWN0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9jb3JlL2FjdGlvbnMvRGVsZWdhdGVBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTdiY2NjZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9jb3JlL2FjdGlvbnMvRGVsZWdhdGVBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLS8qKgotICogCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLmFjdGlvbi5BYnN0cmFjdEFjdGlvbkhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JQWN0aW9uRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5BY3Rpb25GYWN0b3J5OwotCi0vKioKLSAqIElBY3Rpb24gdG8gZGVsZWdhdGUgdG8gSU9iamVjdEFjdGlvbkRlbGVnYXRlLiAKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICovCi1wdWJsaWMgY2xhc3MgRGVsZWdhdGVBY3Rpb24gZXh0ZW5kcyBBYnN0cmFjdEFjdGlvbkhhbmRsZXIgewotCi0JcHJpdmF0ZSBJQWN0aW9uRGVsZWdhdGUgZGVsZWdhdGU7Ci0JcHJpdmF0ZSBJV29ya2JlbmNoUGFydCBwYXJ0OwotCQotCXB1YmxpYyBEZWxlZ2F0ZUFjdGlvbihJV29ya2JlbmNoUGFnZSBwYWdlKSB7Ci0JCXN1cGVyKHBhZ2UuZ2V0QWN0aXZlUGFydCgpKTsKLQkJdGhpcy5wYXJ0ID0gcGFnZS5nZXRBY3RpdmVQYXJ0KCk7Ci0JfQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBEZWxlZ2F0ZUFjdGlvbihJV29ya2JlbmNoUGFydCBwYXJ0LCBTdHJpbmcgaWQpIHsKLQkJLy9zdXBlcih0ZXh0KTsKLQkJc3VwZXIocGFydCk7Ci0JCXRoaXMucGFydCA9IHBhcnQ7Ci0JCWNyZWF0ZURlbGVnYXRlKGlkKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQlydW5XaXRoRXZlbnQobnVsbCk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHJ1bldpdGhFdmVudChFdmVudCBldmVudCkgewotCQlpZihkZWxlZ2F0ZSAhPSBudWxsKXsKLQkJCXJlZnJlc2goKTsKLQkJCWRlbGVnYXRlLnJ1bih0aGlzKTsKLQkJfQotCQkvLyBSZXNldCBhY3Rpb24gYW5kIGRlbGVnYXRlIGFjdGlvbnMsIGJlY2F1c2Ugc2VsZWN0aW9uQ2hhbmdlZCBsaXN0ZW5lcnMgZG9uJ3Qgbm90aWZ5IGhlcmUuCi0JCWlmKGRlbGVnYXRlIGluc3RhbmNlb2YgQWN0aW9uRGVsZWdhdGUpewotCQkJKChBY3Rpb25EZWxlZ2F0ZSlkZWxlZ2F0ZSkuc2V0RW5hYmxlZCh0cnVlKTsKLQkJfQotCQlzZXRFbmFibGVkKHRydWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGRvUnVuKElQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJCi0JfQotCi0JcHVibGljIHZvaWQgcmVmcmVzaCgpIHsKLQkJSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSBwYXJ0LmdldFNpdGUoKS5nZXRTZWxlY3Rpb25Qcm92aWRlcigpLmdldFNlbGVjdGlvbigpOwotCQlpZihzZWxlY3Rpb24gPT0gbnVsbCl7Ci0JCQlzZWxlY3Rpb24gPSBTdHJ1Y3R1cmVkU2VsZWN0aW9uLkVNUFRZOwotCQl9Ci0JCWRlbGVnYXRlLnNlbGVjdGlvbkNoYW5nZWQodGhpcywgc2VsZWN0aW9uKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlRGVsZWdhdGUoU3RyaW5nIGlkKXsKLQkJaWYoaWQuZXF1YWxzKEFjdGlvbkZhY3RvcnkuREVMRVRFLmdldElkKCkpKXsKLQkJCWRlbGVnYXRlID0gbmV3IERlbGV0ZUVsZW1lbnRBY3Rpb25EZWxlZ2F0ZSh0aGlzLHBhcnQpOwotCQl9Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGlzRW5hYmxlZCgpIHsKLQkJcmVmcmVzaCgpOwotCQlyZXR1cm4gKChBY3Rpb25EZWxlZ2F0ZSlkZWxlZ2F0ZSkuaXNFbmFibGVkKCk7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vY29yZS9hY3Rpb25zL0RlbGV0ZURpYWdyYW1BY3Rpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2NvcmUvYWN0aW9ucy9EZWxldGVEaWFncmFtQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0YTIwOWEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vY29yZS9hY3Rpb25zL0RlbGV0ZURpYWdyYW1BY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLyoqCi0gKiAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5EaWFncmFtQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLkRpYWdyYW1Db3JlUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuYnJpZGdlLkJyaWRnZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLmJyaWRnZS5Ob2RlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnNlcnZpY2VzLkRpYWdyYW1IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLkZpbGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy5TZXJ2aWNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5hY3Rpb25zLkFjdGlvbklkczsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5EaWFncmFtRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUNvbnRyaWJ1dGlvbkl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuQWN0aXZpdHk7Ci0KLS8qKgotICogRGVsZXRlcyB0aGUgZGlhZ3JhbS4KLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqLwotcHVibGljIGNsYXNzIERlbGV0ZURpYWdyYW1BY3Rpb24gZXh0ZW5kcyBBY3Rpb25EZWxlZ2F0ZSB7Ci0KLQlwdWJsaWMgRGVsZXRlRGlhZ3JhbUFjdGlvbigpewotCQlzdXBlcigpOwotCX0KLQlwdWJsaWMgRGVsZXRlRGlhZ3JhbUFjdGlvbihJQWN0aW9uIGFjdGlvbiwgSVdvcmtiZW5jaFBhcnQgdGFyZ2V0UGFydCkgewotCQlzdXBlcihhY3Rpb24sIHRhcmdldFBhcnQpOwotCX0KLQotCXByaXZhdGUgRWRpdFBhcnQgbXlTZWxlY3RlZEVsZW1lbnQ7Ci0JLy9wcml2YXRlIElXb3JrYmVuY2hQYXJ0IHRhcmdldFBhcnQ7Ci0JLyoqCi0JICogCi0JICovCi0JCi0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JT2JqZWN0QWN0aW9uRGVsZWdhdGUjc2V0QWN0aXZlUGFydChvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiwgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQpCi0JICovCi0vLwlwdWJsaWMgdm9pZCBzZXRBY3RpdmVQYXJ0KElBY3Rpb24gYWN0aW9uLCBJV29ya2JlbmNoUGFydCB0YXJnZXRQYXJ0KSB7Ci0vLwkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotLy8JCXRoaXMudGFyZ2V0UGFydCA9IHRhcmdldFBhcnQ7Ci0vLwl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JQWN0aW9uRGVsZWdhdGUjcnVuKG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bihJQWN0aW9uIGFjdGlvbikgewotCQlpZiAoRGlhZ3JhbUNvcmVQbHVnaW4KLQkJCQkuZ2V0RGVmYXVsdCgpCi0JCQkJLmdldE1zZ0RpYWxvZygpCi0JCQkJLmRpc3BsYXlQcm9tcHQoCi0JCQkJCQlEaWFncmFtQ29yZVJlc291cmNlcy5EZWxldGVEaWFncmFtX3RleHQsIC8vJE5PTi1OTFMtMSQKLQkJCQkJCURpYWdyYW1Db3JlUmVzb3VyY2VzLkRlbGV0ZURpYWdyYW1fcHJvbXB0KSkgeyAvLyROT04tTkxTLTEkCi0JCQlpZihteVNlbGVjdGVkRWxlbWVudCAhPSBudWxsKXsKLQkJCQlEaWFncmFtIGRpYWdyYW0gPSAoRGlhZ3JhbSlteVNlbGVjdGVkRWxlbWVudC5nZXRNb2RlbCgpOwotCQkJCWlmKGRpYWdyYW0gIT0gbnVsbCl7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlSZXNvdXJjZSByZXNvdXJjZSA9IGRpYWdyYW0uZVJlc291cmNlKCk7Ci0JCQkJCQlpZihyZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQkJCQkJSVN0YXR1cyBzdGF0dXMgPSBTZXJ2aWNlcy5nZXRBY2Nlc3NDb250cm9sbGVyKCkuY2hlY2tNb2RpZnkobmV3IFJlc291cmNlW10geyByZXNvdXJjZSB9LCB0YXJnZXRQYXJ0LmdldFNpdGUoKS5nZXRTaGVsbCgpKTsKLQkJCQkJCQlpZighc3RhdHVzLmlzT0soKSkgewotCQkJCQkJCQlyZXR1cm47Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJCi0JCQkJCQlEaWFncmFtSGVscGVyLmRlbGV0ZURpYWdyYW0oZGlhZ3JhbSwgdHJ1ZSk7Ci0JCQkJCQl0YXJnZXRQYXJ0LmdldFNpdGUoKS5nZXRQYWdlKCkuY2xvc2VFZGl0b3IoCi0JCQkJCQkJCXRhcmdldFBhcnQuZ2V0U2l0ZSgpLmdldFBhZ2UoKQotCQkJCQkJCQkJCS5nZXRBY3RpdmVFZGl0b3IoKSwgZmFsc2UpOwotCQkJCQl9IGNhdGNoKEV4Y2VwdGlvbiBleCkgewotCQkJCQkJRGlhZ3JhbUNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGV4KTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklBY3Rpb25EZWxlZ2F0ZSNzZWxlY3Rpb25DaGFuZ2VkKG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uLCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb24pCi0JICovCi0JcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChJQWN0aW9uIGFjdGlvbiwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJZHJvcE1lbnVJdGVtcygpOwotCQlteVNlbGVjdGVkRWxlbWVudCA9IG51bGw7Ci0JCWlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgewotCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc3RydWN0dXJlZFNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uOwotCQkJaWYgKHN0cnVjdHVyZWRTZWxlY3Rpb24uc2l6ZSgpID09IDEKLQkJCQkJJiYgc3RydWN0dXJlZFNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKSBpbnN0YW5jZW9mIEVkaXRQYXJ0KSB7Ci0JCQkJbXlTZWxlY3RlZEVsZW1lbnQgPSAoRWRpdFBhcnQpIHN0cnVjdHVyZWRTZWxlY3Rpb24KLQkJCQkJCS5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCX0KLQkJfQotCQlpZihteVNlbGVjdGVkRWxlbWVudCAhPSBudWxsKXsKLQkJCWFjdGlvbi5zZXRDaGVja2VkKGZhbHNlKTsKLQkJCWlmKG15U2VsZWN0ZWRFbGVtZW50IGluc3RhbmNlb2YgRGlhZ3JhbUVkaXRQYXJ0KXsKLQkJCQlpZighKChEaWFncmFtRWRpdFBhcnQpbXlTZWxlY3RlZEVsZW1lbnQpLmlzRWRpdE1vZGVFbmFibGVkKCkpewotCQkJCQlhY3Rpb24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJCUlDb250cmlidXRpb25JdGVtIGl0ZW0gPSBnZXREaWFncmFtQ29udGV4dE1lbnVQcm92aWRlcigpLmZpbmQoQWN0aW9uSWRzLk1FTlVfRURJVCk7Ci0JCQkJCWlmKGl0ZW0gIT0gbnVsbCkgaXRlbS5zZXRWaXNpYmxlKGZhbHNlKTsgCi0JCQkJfQotCQkJfQotCQkJCi0JCQlEaWFncmFtIGRpYWdyYW0gPSAoRGlhZ3JhbSlteVNlbGVjdGVkRWxlbWVudC5nZXRNb2RlbCgpOwotCQkJaWYoZGlhZ3JhbSAhPSBudWxsKXsKLQkJCQlFT2JqZWN0IG1vZGVsID0gZGlhZ3JhbS5nZXRFbGVtZW50KCk7Ci0JCQkJaWYobW9kZWwgaW5zdGFuY2VvZiBBY3Rpdml0eSl7Ci0JCQkJCU5vZGVBZGFwdGVyIGFkYXB0ZXI9IEJyaWRnZUhlbHBlci5nZXROb2RlQWRhcHRlcihtb2RlbCk7Ci0JCQkJCWlmKGFkYXB0ZXIgIT0gbnVsbCAmJiBhZGFwdGVyLmlzVGFyZ2V0UmVhZE9ubHkoKSl7Ci0JCQkJCQlhY3Rpb24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJCQlJQ29udHJpYnV0aW9uSXRlbSBpdGVtID0gZ2V0RGlhZ3JhbUNvbnRleHRNZW51UHJvdmlkZXIoKS5maW5kKEFjdGlvbklkcy5NRU5VX0VESVQpOwotCQkJCQkJaWYoaXRlbSAhPSBudWxsKSBpdGVtLnNldFZpc2libGUoZmFsc2UpOyAKLQkJCQkJfQotCQkJCX1lbHNlIGlmKG1vZGVsIGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuRGlhZ3JhbSl7Ci0vLwkJCQkJaWYoKChvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5EaWFncmFtKWRpYWdyYW0pLmlzUmVhZE9ubHkoKSl7Ci0vLwkJCQkJCWFjdGlvbi5zZXRFbmFibGVkKGZhbHNlKTsKLS8vCQkJCQl9Ci0JCQkJfQotCQkJCQotCQkJfQotCQl9ZWxzZXsKLQkJCWFjdGlvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJfQotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBSZXF1ZXN0IGNyZWF0ZVRhcmdldFJlcXVlc3QoKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q29tbWFuZCgpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9jb3JlL2FjdGlvbnMvRGVsZXRlRWxlbWVudEFjdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vY29yZS9hY3Rpb25zL0RlbGV0ZUVsZW1lbnRBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWQxMWExMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9jb3JlL2FjdGlvbnMvRGVsZXRlRWxlbWVudEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQ3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuYWN0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkJhc2ljQ29tbWFuZFN0YWNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5BZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLklFZGl0aW5nRG9tYWluUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuRGlhZ3JhbUNvcmVSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5icmlkZ2UuQnJpZGdlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUucGFydC5BYnN0cmFjdERpYWdyYW1FZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5hY3Rpb25zLlByb2Nlc3NEZWxldGVBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3RDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLlVuZXhlY3V0YWJsZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLkdyb3VwUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUudXRpbC5WaWV3VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmFjdGlvbnMuQWJzdHJhY3REZWxldGVGcm9tQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuY29tbWFuZHMuQ29tbWFuZFByb3h5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuY29tbWFuZHMuSUNvbW1hbmRQcm94eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JR3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuQ2Fub25pY2FsRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5FZGl0UG9saWN5Um9sZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXF1ZXN0cy5FZGl0Q29tbWFuZFJlcXVlc3RXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb21tYW5kcy5jb3JlLmNvbW1hbmQuQ29tcG9zaXRlVHJhbnNhY3Rpb25hbENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5EZXN0cm95RWxlbWVudFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQnVzeUluZGljYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JU2hhcmVkSW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5BY3Rpb25GYWN0b3J5OwotCi0vKioKLSAqIFJlcGxhY2VzIHRoZSBkZWZhdWx0IHRoZSBEZWxldGUgZnJvbSBNb2RlbCBhbmQgRGVsZXRlIGZyb20gRGlhZ3JhbSBhY3Rpb25zIG9mIEdNRi4KLSAqIERlbGV0ZSB0aGUgZGlhZ3JhbSBlbGVtZW50IGFuZCBpdHMgYXNzb2NpYXRlZCBkaWFncmFtIGFuZCByZWZlcmVuY2VzLiAKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaS4KLSAqLwotcHVibGljIGNsYXNzIERlbGV0ZUVsZW1lbnRBY3Rpb24gZXh0ZW5kcyBBYnN0cmFjdERlbGV0ZUZyb21BY3Rpb24gewotCi0JYm9vbGVhbiByZW1vdmVNb2RlbCA9IHRydWU7Ci0JLyoqIHRoZSB0YXJnZXQgcmVxdWVzdCAqLwotCXByaXZhdGUgUmVxdWVzdCBzZWNvbmRhcnlUYXJnZXRSZXF1ZXN0OwotCS8qKgotCSAqIEBwYXJhbSBwYXJ0Ci0JICovCi0JcHVibGljIERlbGV0ZUVsZW1lbnRBY3Rpb24oSVdvcmtiZW5jaFBhcnQgcGFydCkgewotCQlzdXBlcihwYXJ0KTsKLQkJCi0JfQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBib29sZWFuIGNhbGN1bGF0ZUVuYWJsZWQoKSB7Ci0JCQotCQlMaXN0IG9wZXJhdGlvblNldCA9IGdldE9wZXJhdGlvblNldCgpOwotCQlpZiAob3BlcmF0aW9uU2V0LmlzRW1wdHkoKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCVJlcXVlc3QgcmVxdWVzdCA9IGdldFRhcmdldFJlcXVlc3QoKTsKLQkJSXRlcmF0b3IgZWRpdFBhcnRzID0gb3BlcmF0aW9uU2V0Lml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChlZGl0UGFydHMuaGFzTmV4dCgpKSB7Ci0JCQlFZGl0UGFydCBlZGl0UGFydCA9IChFZGl0UGFydCkgZWRpdFBhcnRzLm5leHQoKTsKLQkJCS8vIGRpc2FibGUgb24gZGlhZ3JhbSBsaW5rcyAKLQkJCWlmIChlZGl0UGFydCBpbnN0YW5jZW9mIElHcmFwaGljYWxFZGl0UGFydCkgewotCQkJCUlHcmFwaGljYWxFZGl0UGFydCBnRWRpdFBhcnQgPSAoSUdyYXBoaWNhbEVkaXRQYXJ0KSBlZGl0UGFydDsKLQkJCQlWaWV3IHZpZXcgPSAoVmlldykgZ0VkaXRQYXJ0LmdldE1vZGVsKCk7Ci0JCQkJRU9iamVjdCBlbGVtZW50ID0gVmlld1V0aWwucmVzb2x2ZVNlbWFudGljRWxlbWVudCh2aWV3KTsKLQkJCQlpZiAoKGVsZW1lbnQuZUlzUHJveHkoKSkKLQkJCQkJfHwgKGVsZW1lbnQgaW5zdGFuY2VvZiBEaWFncmFtKQotCQkJCQl8fCBCcmlkZ2VIZWxwZXIuaXNSZWFkT25seSh2aWV3KSkgewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlDb21tYW5kIGN1ckNvbW1hbmQgPSBlZGl0UGFydC5nZXRDb21tYW5kKHJlcXVlc3QpOwotCQkJCWlmIChjdXJDb21tYW5kID09IG51bGwgfHwgKGN1ckNvbW1hbmQuY2FuRXhlY3V0ZSgpID09IGZhbHNlKSkgewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCS8vcmV0dXJuIHN1cGVyLmNhbGN1bGF0ZUVuYWJsZWQoKTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGlzRW5hYmxlZCgpIHsKLQkJc2V0RW5hYmxlZCh0cnVlKTsKLQkJTGlzdCBsaXN0ID0gZ2V0U2VsZWN0ZWRPYmplY3RzKCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGxpc3QuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlFZGl0UGFydCBlbGVtZW50ID0gKEVkaXRQYXJ0KSBpdGVyLm5leHQoKTsKLQkJCVZpZXcgdmlldyA9IChWaWV3KWVsZW1lbnQuZ2V0TW9kZWwoKTsKLQkJCWlmKEJyaWRnZUhlbHBlci5pc1JlYWRPbmx5KHZpZXcpKXsKLQkJCQlzZXRFbmFibGVkKGZhbHNlKTsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmlzRW5hYmxlZCgpOwotCX0KLQkKLQkKLQkKLQlwcm90ZWN0ZWQgUmVxdWVzdCBjcmVhdGVUYXJnZXRSZXF1ZXN0KCkgewotCQlyZXR1cm4gCW5ldyBFZGl0Q29tbWFuZFJlcXVlc3RXcmFwcGVyKG5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoZ2V0RWRpdGluZ0RvbWFpbigpLCBmYWxzZSkpOwotCX0KLQkKLQkgLyoqCi0gICAgICogR2V0cyBlZGl0aW5nIGRvbWFpbgotICAgICAqIAotICAgICAqIEByZXR1cm4gbXkgZWRpdGluZyBkb21haW4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gZ2V0RWRpdGluZ0RvbWFpbigpIHsKLSAgICAgICAgCi0gICAgICAgIC8vIHRyeSBhZGFwdGluZyB0aGUgd29ya2JlbmNoIHBhcnQKLSAgICAgICAgSVdvcmtiZW5jaFBhcnQgcGFydCA9IGdldFdvcmtiZW5jaFBhcnQoKTsKLQotICAgICAgICBpZiAocGFydCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBJRWRpdGluZ0RvbWFpblByb3ZpZGVyIGVkUHJvdmlkZXIgPSAoSUVkaXRpbmdEb21haW5Qcm92aWRlcikgcGFydAotICAgICAgICAgICAgICAgIC5nZXRBZGFwdGVyKElFZGl0aW5nRG9tYWluUHJvdmlkZXIuY2xhc3MpOwotCi0gICAgICAgICAgICBpZiAoZWRQcm92aWRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAJRWRpdGluZ0RvbWFpbiBkb21haW4gPSBlZFByb3ZpZGVyLmdldEVkaXRpbmdEb21haW4oKTsKLSAgICAgICAgICAgIAkKLSAgICAgICAgICAgIAlpZiAoZG9tYWluIGluc3RhbmNlb2YgVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4pIHsKLSAgICAgICAgICAgIAkJcmV0dXJuIChUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbikgZG9tYWluOwotICAgICAgICAgICAgCX0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1NlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFJlcXVlc3QgZ2V0VGFyZ2V0UmVxdWVzdCgpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gc3VwZXIuZ2V0VGFyZ2V0UmVxdWVzdCgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgYm9vbGVhbiBzaG93SW5Db250ZXh0TWVudSgpewotCQlMaXN0IG9wZXJhdGlvblNldCA9IGdldE9wZXJhdGlvblNldCgpOwotCQlpZiAob3BlcmF0aW9uU2V0LmlzRW1wdHkoKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCVJlcXVlc3QgcmVxdWVzdCA9IGdldFRhcmdldFJlcXVlc3QoKTsKLQkJSXRlcmF0b3IgZWRpdFBhcnRzID0gb3BlcmF0aW9uU2V0Lml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChlZGl0UGFydHMuaGFzTmV4dCgpKSB7Ci0JCQlFZGl0UGFydCBlZGl0UGFydCA9IChFZGl0UGFydCkgZWRpdFBhcnRzLm5leHQoKTsKLQkJCS8vIGRpc2FibGUgb24gZGlhZ3JhbSBsaW5rcyAKLQkJCWlmIChlZGl0UGFydCBpbnN0YW5jZW9mIElHcmFwaGljYWxFZGl0UGFydCkgewotCQkJCUlHcmFwaGljYWxFZGl0UGFydCBnRWRpdFBhcnQgPSAoSUdyYXBoaWNhbEVkaXRQYXJ0KSBlZGl0UGFydDsKLQkJCQlWaWV3IHZpZXcgPSAoVmlldykgZ0VkaXRQYXJ0LmdldE1vZGVsKCk7Ci0JCQkJRU9iamVjdCBlbGVtZW50ID0gVmlld1V0aWwucmVzb2x2ZVNlbWFudGljRWxlbWVudCh2aWV3KTsKLQkJCQlpZiAoKGVsZW1lbnQuZUlzUHJveHkoKSkKLQkJCQkJfHwgKGVsZW1lbnQgaW5zdGFuY2VvZiBEaWFncmFtKSkgewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlDb21tYW5kIGN1ckNvbW1hbmQgPSBlZGl0UGFydC5nZXRDb21tYW5kKHJlcXVlc3QpOwotCQkJCWlmIChjdXJDb21tYW5kID09IG51bGwgfHwgKGN1ckNvbW1hbmQuY2FuRXhlY3V0ZSgpID09IGZhbHNlKSkgewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDb21tYW5kKFJlcXVlc3QgcmVxdWVzdCkgewotCQkvL3JldHVybiBzdXBlci5nZXRDb21tYW5kKHJlcXVlc3QpOwotCQlMaXN0IG9wZXJhdGlvblNldCA9IGdldE9wZXJhdGlvblNldCgpOwotCQlJdGVyYXRvciBlZGl0UGFydHMgPSBvcGVyYXRpb25TZXQuaXRlcmF0b3IoKTsKLQkJQ29tcG9zaXRlVHJhbnNhY3Rpb25hbENvbW1hbmQgY29tbWFuZCA9Ci0JCQluZXcgQ29tcG9zaXRlVHJhbnNhY3Rpb25hbENvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCBnZXRDb21tYW5kTGFiZWwoKSk7Ci0JCXdoaWxlIChlZGl0UGFydHMuaGFzTmV4dCgpKSB7Ci0JCQlFZGl0UGFydCBlZGl0UGFydCA9IChFZGl0UGFydCkgZWRpdFBhcnRzLm5leHQoKTsKLQkJCS8vIGRpc2FibGUgb24gZGlhZ3JhbSBsaW5rcyAKLQkJCWlmIChlZGl0UGFydCBpbnN0YW5jZW9mIElHcmFwaGljYWxFZGl0UGFydCl7Ci0JCQkJSUdyYXBoaWNhbEVkaXRQYXJ0IGdFZGl0UGFydCA9IAotCQkJCQkoSUdyYXBoaWNhbEVkaXRQYXJ0KSBlZGl0UGFydDsKLQkJCQlWaWV3IHZpZXcgPSAoVmlldylnRWRpdFBhcnQuZ2V0TW9kZWwoKTsKLQkJCQlFT2JqZWN0IGVsZW1lbnQgPSBWaWV3VXRpbC5yZXNvbHZlU2VtYW50aWNFbGVtZW50KHZpZXcpOwotCQkJCWlmKGVsZW1lbnQgaW5zdGFuY2VvZiBEaWFncmFtKQotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJCUNvbW1hbmQgY3VyQ29tbWFuZCA9IG51bGw7Ci0JCQlpZihlZGl0UGFydCBpbnN0YW5jZW9mIElHcmFwaGljYWxFZGl0UGFydCAmJiBpc0Nhbm9uaWNhbCgoSUdyYXBoaWNhbEVkaXRQYXJ0KWVkaXRQYXJ0KSl7Ci0JCQkJY3VyQ29tbWFuZCA9IGVkaXRQYXJ0LmdldENvbW1hbmQocmVxdWVzdCk7Ci0JCQl9ZWxzZXsKLQkJCQljdXJDb21tYW5kID0gZWRpdFBhcnQuZ2V0Q29tbWFuZChnZXRTZWNvbmRhcnlUYXJnZXRSZXF1ZXN0KCkpOwotCQkJfQotCQkJaWYgKGN1ckNvbW1hbmQgIT0gbnVsbCkgewotCQkJCWNvbW1hbmQuY29tcG9zZShuZXcgQ29tbWFuZFByb3h5KGN1ckNvbW1hbmQpKTsJCQkJCi0JCQl9Ci0JCX0KLQkJCi0JCWlmICgoY29tbWFuZC5pc0VtcHR5KCkpCi0JCQl8fCAoY29tbWFuZC5zaXplKCkgIT0gb3BlcmF0aW9uU2V0LnNpemUoKSkpewotCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCX0KLQkJcmV0dXJuIG5ldyBJQ29tbWFuZFByb3h5KGNvbW1hbmQpOwotCX0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBkb1J1bihJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzTW9uaXRvcikgewotCQkKLQkJTGlzdCBvcGVyYXRpb25TZXQgPSBnZXRPcGVyYXRpb25TZXQoKTsKLQkJTGlzdDxCcmVha2Rvd25FbGVtZW50PiBlbGVtZW50cyA9IG5ldyBBcnJheUxpc3Q8QnJlYWtkb3duRWxlbWVudD4oKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gb3BlcmF0aW9uU2V0Lml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGVkaXRQYXJ0ID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAoZWRpdFBhcnQgaW5zdGFuY2VvZiBFZGl0UGFydCkgewotCQkJCU9iamVjdCBvYmogPSAoKEVkaXRQYXJ0KSBlZGl0UGFydCkuZ2V0TW9kZWwoKTsKLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgTm9kZSkgewotCQkJCQlNZXRob2RFbGVtZW50IGVsZW1lbnQgPSBCcmlkZ2VIZWxwZXIuZ2V0TWV0aG9kRWxlbWVudCgoTm9kZSlvYmopOwotCQkJCQlpZiAoZWxlbWVudCAhPSBudWxsICYmIGVsZW1lbnQgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50KSB7Ci0JCQkJCQllbGVtZW50cy5hZGQoKEJyZWFrZG93bkVsZW1lbnQpZWxlbWVudCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKCFlbGVtZW50cy5pc0VtcHR5KCkpIHsKLQkJCVByb2Nlc3NEZWxldGVBY3Rpb24gZGVsZXRlQWN0aW9uID0gbmV3IFByb2Nlc3NEZWxldGVBY3Rpb24oKSB7Ci0JCQkJLyoKLQkJCQkgKiAobm9uLUphdmFkb2MpCi0JCQkJICogCi0JCQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnMuTWV0aG9kRWxlbWVudERlbGV0ZUFjdGlvbiNjcmVhdGVDb21tYW5kKGphdmEudXRpbC5Db2xsZWN0aW9uKQotCQkJCSAqLwotCQkJCXB1YmxpYyBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZCBjcmVhdGVDb21tYW5kKAotCQkJCQkJQ29sbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJCQkJZG9tYWluID0gbnVsbDsKLQkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gc2VsZWN0aW9uLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyLm5leHQoKTsKLQkJCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yKSB7Ci0JCQkJCQkJZG9tYWluID0gbmV3IEFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbigKLQkJCQkJCQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkJCQkJCS5nZXRQQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJCQkJbmV3IEJhc2ljQ29tbWFuZFN0YWNrKCkpOwotCQkJCQkJCWJyZWFrOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWlmIChkb21haW4gPT0gbnVsbCkgewotCQkJCQkJZG9tYWluID0gbmV3IEFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbigKLQkJCQkJCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJCQkJCQkuZ2V0V0JTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCQkJbmV3IEJhc2ljQ29tbWFuZFN0YWNrKCkpOwotCQkJCQl9Ci0JCQkJCXJldHVybiBzdXBlci5jcmVhdGVDb21tYW5kKHNlbGVjdGlvbik7Ci0JCQkJfQotCi0JCQl9OwotCQkJZGVsZXRlQWN0aW9uLnVwZGF0ZVNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbigKLQkJCQkJZWxlbWVudHMpKTsKLQkJCWRlbGV0ZUFjdGlvbi5ydW4oKTsKLQkJCWlmIChkZWxldGVBY3Rpb24uaXNEZWxldGlvbkNvbmZpcm1lZCgpKSB7Ci0JCQkJc3VwZXIuZG9SdW4ocHJvZ3Jlc3NNb25pdG9yKTsKLQotCQkJCS8vIHNhdmUgdGhlIGVkaXRvcgotCQkJCS8vIAotCQkJCUJ1c3lJbmRpY2F0b3Iuc2hvd1doaWxlKGdldFdvcmtiZW5jaFBhcnQoKS5nZXRTaXRlKCkuZ2V0U2hlbGwoKQotCQkJCQkJLmdldERpc3BsYXkoKSwgbmV3IFJ1bm5hYmxlKCkgewotCi0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCSgoQWJzdHJhY3REaWFncmFtRWRpdG9yKWdldFdvcmtiZW5jaFBhcnQoKSkuZG9TYXZlKG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQl9Ci0KLQkJfSBlbHNlIHsKLQkJCXN1cGVyLmRvUnVuKHByb2dyZXNzTW9uaXRvcik7Ci0JCX0KLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgaW5pdCgpIHsKLQkJc3VwZXIuaW5pdCgpOwotCQlzZXRJZChBY3Rpb25GYWN0b3J5LkRFTEVURS5nZXRJZCgpKTsKLQkJc2V0VGV4dChEaWFncmFtQ29yZVJlc291cmNlcy5kZWxldGVDb21tYW5kX2xhYmVsKTsKLQkJc2V0VG9vbFRpcFRleHQoRGlhZ3JhbUNvcmVSZXNvdXJjZXMuZGVsZXRlQ29tbWFuZF9sYWJlbCk7Ci0JCUlTaGFyZWRJbWFnZXMgd29ya2JlbmNoSW1hZ2VzID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRTaGFyZWRJbWFnZXMoKTsKLQkJc2V0SG92ZXJJbWFnZURlc2NyaXB0b3IoCi0JCQl3b3JrYmVuY2hJbWFnZXMuZ2V0SW1hZ2VEZXNjcmlwdG9yKAotCQkJCUlTaGFyZWRJbWFnZXMuSU1HX1RPT0xfREVMRVRFKSk7Ci0JCXNldEltYWdlRGVzY3JpcHRvcigKLQkJCXdvcmtiZW5jaEltYWdlcy5nZXRJbWFnZURlc2NyaXB0b3IoSVNoYXJlZEltYWdlcy5JTUdfVE9PTF9ERUxFVEUpKTsKLQkJc2V0RGlzYWJsZWRJbWFnZURlc2NyaXB0b3IoCi0JCQl3b3JrYmVuY2hJbWFnZXMuZ2V0SW1hZ2VEZXNjcmlwdG9yKAotCQkJCUlTaGFyZWRJbWFnZXMuSU1HX1RPT0xfREVMRVRFX0RJU0FCTEVEKSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBMaXN0IGNyZWF0ZU9wZXJhdGlvblNldCgpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gc3VwZXIuY3JlYXRlT3BlcmF0aW9uU2V0KCk7Ci0JfQotCQotCS8qKgotCSAqIEBwYXJhbSBnZXAKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzQ2Fub25pY2FsKElHcmFwaGljYWxFZGl0UGFydCBnZXApIHsKLQkJRWRpdFBhcnQgcGFyZW50ID0gZ2VwLmdldFBhcmVudCgpOwotCQlpZiAocGFyZW50IGluc3RhbmNlb2YgSUdyYXBoaWNhbEVkaXRQYXJ0KSB7Ci0JCQlDYW5vbmljYWxFZGl0UG9saWN5IGNlcCA9IChDYW5vbmljYWxFZGl0UG9saWN5KXBhcmVudC5nZXRFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5DQU5PTklDQUxfUk9MRSk7Ci0JCQlpZiAoIGNlcCAhPSBudWxsICkgewotCQkJCWlmIChjZXAuaXNFbmFibGVkKCkpCi0JCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JcHVibGljIFJlcXVlc3QgZ2V0U2Vjb25kYXJ5VGFyZ2V0UmVxdWVzdCgpewotCQlpZihzZWNvbmRhcnlUYXJnZXRSZXF1ZXN0ID09IG51bGwpewotCQkJc2Vjb25kYXJ5VGFyZ2V0UmVxdWVzdCA9IG5ldyBHcm91cFJlcXVlc3QoCi0JCQkJCVJlcXVlc3RDb25zdGFudHMuUkVRX0RFTEVURSk7Ci0JCX0KLQkJcmV0dXJuIHNlY29uZGFyeVRhcmdldFJlcXVlc3Q7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vY29yZS9hY3Rpb25zL0RlbGV0ZUVsZW1lbnRBY3Rpb25EZWxlZ2F0ZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vY29yZS9hY3Rpb25zL0RlbGV0ZUVsZW1lbnRBY3Rpb25EZWxlZ2F0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOGU4NDZjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2NvcmUvYWN0aW9ucy9EZWxldGVFbGVtZW50QWN0aW9uRGVsZWdhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwNiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5CYXNpY0NvbW1hbmRTdGFjazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuRGlhZ3JhbUNvcmVSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5icmlkZ2UuQnJpZGdlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuYnJpZGdlLkRpYWdyYW1BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuY29tbWFuZHMuRGVsZXRlRGlhZ3JhbUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5wYXJ0LkFic3RyYWN0RGlhZ3JhbUVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnV0aWwuRGlhZ3JhbUNvcmVWYWxpZGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkFjdGl2aXR5RGV0YWlsRGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLmFjdGlvbnMuUHJvY2Vzc0RlbGV0ZUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5VbmV4ZWN1dGFibGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5yZXF1ZXN0cy5Hcm91cFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLnV0aWwuVmlld1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5Db21tYW5kUHJveHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5JQ29tbWFuZFByb3h5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklHcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5DYW5vbmljYWxFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkVkaXRQb2xpY3lSb2xlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlcXVlc3RzLkVkaXRDb21tYW5kUmVxdWVzdFdyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvbW1hbmRzLmNvcmUuY29tbWFuZC5Db21wb3NpdGVUcmFuc2FjdGlvbmFsQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkRlc3Ryb3lFbGVtZW50UmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5EaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkVkZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5CdXN5SW5kaWNhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotCi0KLS8qKgotICogUmVwbGFjZXMgdGhlIGRlZmF1bHQgdGhlIERlbGV0ZSBmcm9tIE1vZGVsIGFuZCBEZWxldGUgZnJvbSBEaWFncmFtIGFjdGlvbnMgb2YgR01GLgotICogRGVsZXRlIHRoZSBkaWFncmFtIGVsZW1lbnQgYW5kIGl0cyBhc3NvY2lhdGVkIGRpYWdyYW0gYW5kIHJlZmVyZW5jZXMuIAotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpLgotICovCi1wdWJsaWMgY2xhc3MgRGVsZXRlRWxlbWVudEFjdGlvbkRlbGVnYXRlIGV4dGVuZHMgQWN0aW9uRGVsZWdhdGUgewotCi0JcHVibGljIERlbGV0ZUVsZW1lbnRBY3Rpb25EZWxlZ2F0ZSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JcHVibGljIERlbGV0ZUVsZW1lbnRBY3Rpb25EZWxlZ2F0ZShJQWN0aW9uIGFjdGlvbiwgSVdvcmtiZW5jaFBhcnQgdGFyZ2V0UGFydCkgewotCQlzdXBlcihhY3Rpb24sIHRhcmdldFBhcnQpOwotCX0KLQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q29tbWFuZCgpIHsKLQkJdGFyZ2V0UmVxdWVzdCA9IG51bGw7Ci0JCVJlcXVlc3QgcmVxdWVzdCA9IGdldFRhcmdldFJlcXVlc3QoKTsKLQkJSXRlcmF0b3I8RWRpdFBhcnQ+IGVkaXRQYXJ0cyA9IHNlbGVjdGVkUGFydHMuaXRlcmF0b3IoKTsKLQkJCi0JCUxpc3Q8QWN0aXZpdHk+IGFjdGl2aXRpZXMgPSBuZXcgQXJyYXlMaXN0PEFjdGl2aXR5PigpOwotCQkKLQkJCi0JCW9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzcyB0YXJnZXRQcm9jZXNzID0gZ2V0T3duaW5nUHJvY2VzcygpOwotCQkKLQkJLy8gRGVsZXRlIHRoZSBkaWFncmFtIGVsZW1lbnQgYW5kIGRpYWdyYW0gbW9kZWwuCi0JCUNvbXBvc2l0ZVRyYW5zYWN0aW9uYWxDb21tYW5kIGNvbW1hbmQgPQotCQkJbmV3IENvbXBvc2l0ZVRyYW5zYWN0aW9uYWxDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwgRGlhZ3JhbUNvcmVSZXNvdXJjZXMuZGVsZXRlQ29tbWFuZF9sYWJlbCl7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBib29sZWFuIGNhblVuZG8oKSB7Ci0JCQkJSXRlcmF0b3I8RWRpdFBhcnQ+IGVkaXRQYXJ0cyA9IHNlbGVjdGVkUGFydHMuaXRlcmF0b3IoKTsKLQkJCQl3aGlsZSAoZWRpdFBhcnRzLmhhc05leHQoKSkgewotCQkJCQlFZGl0UGFydCBlZGl0UGFydCA9IChFZGl0UGFydCkgZWRpdFBhcnRzLm5leHQoKTsKLQkJCQkJLy8gZGlzYWJsZSBvbiBkaWFncmFtIGxpbmtzIAotCQkJCQlpZiAoZWRpdFBhcnQgaW5zdGFuY2VvZiBJR3JhcGhpY2FsRWRpdFBhcnQpIHsKLQkJCQkJCUlHcmFwaGljYWxFZGl0UGFydCBnRWRpdFBhcnQgPSAoSUdyYXBoaWNhbEVkaXRQYXJ0KSBlZGl0UGFydDsKLQkJCQkJCVZpZXcgdmlldyA9IChWaWV3KSBnRWRpdFBhcnQuZ2V0TW9kZWwoKTsKLQkJCQkJCUVPYmplY3QgZWxlbWVudCA9IFZpZXdVdGlsLnJlc29sdmVTZW1hbnRpY0VsZW1lbnQodmlldyk7Ci0JCQkJCQlpZiAodmlldyBpbnN0YW5jZW9mIERpYWdyYW0gfHwgZWxlbWVudCBpbnN0YW5jZW9mIERpYWdyYW0pCi0JCQkJCQkJY29udGludWU7Ci0KLQkJCQkJCU1ldGhvZEVsZW1lbnQgZSA9IEJyaWRnZUhlbHBlci5nZXRNZXRob2RFbGVtZW50KHZpZXcpOwotCQkJCQkJaWYgKGUgIT0gbnVsbCAmJiBlIGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX07Ci0JCXdoaWxlIChlZGl0UGFydHMuaGFzTmV4dCgpKSB7Ci0JCQlFZGl0UGFydCBlZGl0UGFydCA9IChFZGl0UGFydCkgZWRpdFBhcnRzLm5leHQoKTsKLQkJCS8vIGRpc2FibGUgb24gZGlhZ3JhbSBsaW5rcyAKLQkJCWlmIChlZGl0UGFydCBpbnN0YW5jZW9mIElHcmFwaGljYWxFZGl0UGFydCkgewotCQkJCUlHcmFwaGljYWxFZGl0UGFydCBnRWRpdFBhcnQgPSAoSUdyYXBoaWNhbEVkaXRQYXJ0KSBlZGl0UGFydDsKLQkJCQlWaWV3IHZpZXcgPSAoVmlldykgZ0VkaXRQYXJ0LmdldE1vZGVsKCk7Ci0JCQkJRU9iamVjdCBlbGVtZW50ID0gVmlld1V0aWwucmVzb2x2ZVNlbWFudGljRWxlbWVudCh2aWV3KTsKLQkJCQlpZiAodmlldyBpbnN0YW5jZW9mIERpYWdyYW0gfHwgZWxlbWVudCBpbnN0YW5jZW9mIERpYWdyYW0pCi0JCQkJCXJldHVybiBudWxsOwotCi0JCQkJTWV0aG9kRWxlbWVudCBlID0gQnJpZGdlSGVscGVyLmdldE1ldGhvZEVsZW1lbnQodmlldyk7Ci0JCQkJaWYgKGUgIT0gbnVsbCAmJiBlIGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQkJYWN0aXZpdGllcy5hZGQoKEFjdGl2aXR5KSBlKTsKLQkJCQl9Ci0KLQkJCQlDb21tYW5kIGN1ckNvbW1hbmQgPSBudWxsOwotCQkJCWlmIChlZGl0UGFydCBpbnN0YW5jZW9mIElHcmFwaGljYWxFZGl0UGFydAotCQkJCQkJJiYgaXNDYW5vbmljYWwoKElHcmFwaGljYWxFZGl0UGFydCkgZWRpdFBhcnQpKSB7Ci0JCQkJCWN1ckNvbW1hbmQgPSBlZGl0UGFydC5nZXRDb21tYW5kKHJlcXVlc3QpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWN1ckNvbW1hbmQgPSBlZGl0UGFydAotCQkJCQkJCS5nZXRDb21tYW5kKGdldFNlY29uZGFyeVRhcmdldFJlcXVlc3QoKSk7Ci0JCQkJfQotCQkJCWlmKGN1ckNvbW1hbmQgPT0gbnVsbCAmJiBpc0RpYWdyYW1VSU9iamVjdCh2aWV3KSl7Ci0JCQkJCWN1ckNvbW1hbmQgPSBlZGl0UGFydAotCQkJCQkuZ2V0Q29tbWFuZChnZXRTZWNvbmRhcnlUYXJnZXRSZXF1ZXN0KCkpOwotCQkJCX0KLQkJCQlpZiAoY3VyQ29tbWFuZCAhPSBudWxsKSB7Ci0JCQkJCWNvbW1hbmQuY29tcG9zZShuZXcgQ29tbWFuZFByb3h5KGN1ckNvbW1hbmQpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKChjb21tYW5kLmlzRW1wdHkoKSkKLQkJCXx8IChjb21tYW5kLnNpemUoKSAhPSBzZWxlY3RlZFBhcnRzLnNpemUoKSkpewotCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCX0KLQkJLy8gRGVsZXRlIHRoZSByZWxhdGVkIGRpYWdyYW0gb2YgZGVsZXRlZCBBY3Rpdml0eQotCQlpZighYWN0aXZpdGllcy5pc0VtcHR5KCkpewotCQkJbmV3IERlbGV0ZURpYWdyYW1Db21tYW5kKGFjdGl2aXRpZXMsIHRhcmdldFByb2Nlc3MpLmV4ZWN1dGUoKTsKLQkJfQotCQlyZXR1cm4gbmV3IElDb21tYW5kUHJveHkoY29tbWFuZCk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzRGlhZ3JhbVVJT2JqZWN0KFZpZXcgdmlldykgewotCQlyZXR1cm4gdmlldy5nZXRFbGVtZW50KCkgPT0gbnVsbDsKLQl9Ci0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFJlcXVlc3QgY3JlYXRlVGFyZ2V0UmVxdWVzdCgpIHsKLQkJcmV0dXJuIAluZXcgRWRpdENvbW1hbmRSZXF1ZXN0V3JhcHBlcihuZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KGdldEVkaXRpbmdEb21haW4oKSwgZmFsc2UpKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChJQWN0aW9uIGFjdGlvbiwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJc2V0RW5hYmxlZCh0cnVlKTsKLQkJc3VwZXIuc2VsZWN0aW9uQ2hhbmdlZChhY3Rpb24sIHNlbGVjdGlvbik7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHNlbGVjdGVkUGFydHMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlFZGl0UGFydCBlbGVtZW50ID0gKEVkaXRQYXJ0KSBpdGVyLm5leHQoKTsKLQkJCVZpZXcgdmlldyA9IChWaWV3KWVsZW1lbnQuZ2V0TW9kZWwoKTsKLQkJCWlmKHZpZXcuZ2V0RWxlbWVudCgpID09IG51bGwpIHsKLQkJCQkvLyB0aGlzIHZpZXcgaXMgbm90IGFzc29jaWF0ZWQgd2l0aCBhbnkgbW9kZWwKLQkJCQkvLyBpdCBjYW4gYmUgZGVsZXRlZAotCQkJCS8vCi0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlpZih2aWV3IGluc3RhbmNlb2YgRGlhZ3JhbSAKLQkJCQkJfHwgQnJpZGdlSGVscGVyLmlzUmVhZE9ubHkodmlldykKLQkJCQkJfHwgVG5nVXRpbC5pc0xvY2tlZChnZXRPd25pbmdQcm9jZXNzKCkpCi0JCQkJCXx8ICh2aWV3LmdldEVsZW1lbnQoKSBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkxpbmtlZE9iamVjdCAmJiAKLQkJCQkJCQl2aWV3LmdldERpYWdyYW0oKS5nZXRFbGVtZW50KCkgaW5zdGFuY2VvZiBBY3Rpdml0eURldGFpbERpYWdyYW0pCi0JCQkJCXx8IChCcmlkZ2VIZWxwZXIuZ2V0TWV0aG9kRWxlbWVudCh2aWV3KSAhPSBudWxsICYmCi0JCQkJCQkJQnJpZGdlSGVscGVyLmlzSW5oZXJpdGVkKHZpZXcpKQotCQkJCQkJCSkgewotCQkJCWFjdGlvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQlzZXRFbmFibGVkKGZhbHNlKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWlmKHZpZXcgaW5zdGFuY2VvZiBFZGdlKXsKLQkJCQlpZihEaWFncmFtQ29yZVZhbGlkYXRpb24uY2hlY2tEZWxldGUoKEVkZ2UpdmlldykgIT0gbnVsbCl7Ci0JCQkJCWFjdGlvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQkJc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBydW4oSUFjdGlvbiBhY3Rpb24pIHsKLQkJaWYoIWlzRW5hYmxlZCgpKSByZXR1cm47Ci0JCUxpc3Q8QnJlYWtkb3duRWxlbWVudD4gZWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0PEJyZWFrZG93bkVsZW1lbnQ+KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHNlbGVjdGVkUGFydHMuaXRlcmF0b3IoKTsgaXRlcgotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZWRpdFBhcnQgPSBpdGVyLm5leHQoKTsKLQkJCWlmIChlZGl0UGFydCBpbnN0YW5jZW9mIEVkaXRQYXJ0KSB7Ci0JCQkJT2JqZWN0IG9iaiA9ICgoRWRpdFBhcnQpIGVkaXRQYXJ0KS5nZXRNb2RlbCgpOwotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBOb2RlKSB7Ci0JCQkJCU1ldGhvZEVsZW1lbnQgZWxlbWVudCA9IEJyaWRnZUhlbHBlci5nZXRNZXRob2RFbGVtZW50KChOb2RlKW9iaik7Ci0JCQkJCWlmIChlbGVtZW50ICE9IG51bGwgJiYgZWxlbWVudCBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnQpIHsKLQkJCQkJCWVsZW1lbnRzLmFkZCgoQnJlYWtkb3duRWxlbWVudCllbGVtZW50KTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAoIWVsZW1lbnRzLmlzRW1wdHkoKSkgewotCQkJUHJvY2Vzc0RlbGV0ZUFjdGlvbiBkZWxldGVBY3Rpb24gPSBuZXcgUHJvY2Vzc0RlbGV0ZUFjdGlvbigpIHsKLQkJCQkvKgotCQkJCSAqIChub24tSmF2YWRvYykKLQkJCQkgKiAKLQkJCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9ucy5NZXRob2RFbGVtZW50RGVsZXRlQWN0aW9uI2NyZWF0ZUNvbW1hbmQoamF2YS51dGlsLkNvbGxlY3Rpb24pCi0JCQkJICovCi0JCQkJcHVibGljIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kIGNyZWF0ZUNvbW1hbmQoCi0JCQkJCQlDb2xsZWN0aW9uIHNlbGVjdGlvbikgewotCQkJCQlkb21haW4gPSBudWxsOwotCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBzZWxlY3Rpb24uaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlPYmplY3QgZWxlbWVudCA9IGl0ZXIubmV4dCgpOwotCQkJCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3IpIHsKLQkJCQkJCQlkb21haW4gPSBuZXcgQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluKAotCQkJCQkJCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJCQkJCQkJLmdldFBCU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQkJCQluZXcgQmFzaWNDb21tYW5kU3RhY2soKSk7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJaWYgKGRvbWFpbiA9PSBudWxsKSB7Ci0JCQkJCQlkb21haW4gPSBuZXcgQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluKAotCQkJCQkJCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkJCQkJCS5nZXRXQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJCQluZXcgQmFzaWNDb21tYW5kU3RhY2soKSk7Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIHN1cGVyLmNyZWF0ZUNvbW1hbmQoc2VsZWN0aW9uKTsKLQkJCQl9Ci0KLQkJCX07Ci0JCQlkZWxldGVBY3Rpb24udXBkYXRlU2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKAotCQkJCQllbGVtZW50cykpOwotCQkJZGVsZXRlQWN0aW9uLnJ1bigpOwotCQkJaWYgKGRlbGV0ZUFjdGlvbi5pc0RlbGV0aW9uQ29uZmlybWVkKCkpIHsKLQkJCQlzdXBlci5ydW4oYWN0aW9uKTsKLQotCQkJCS8vIHNhdmUgdGhlIGVkaXRvcgotCQkJCS8vIAotCQkJCUJ1c3lJbmRpY2F0b3Iuc2hvd1doaWxlKHRhcmdldFBhcnQuZ2V0U2l0ZSgpLmdldFNoZWxsKCkKLQkJCQkJCS5nZXREaXNwbGF5KCksIG5ldyBSdW5uYWJsZSgpIHsKLQotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkoKEFic3RyYWN0RGlhZ3JhbUVkaXRvcil0YXJnZXRQYXJ0KS5kb1NhdmUobmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCQkJCQlpZihnZXREaWFncmFtQ29tbWFuZFN0YWNrKCkgIT0gbnVsbCl7Ci0JCQkJCQkJZ2V0RGlhZ3JhbUNvbW1hbmRTdGFjaygpLmZsdXNoKCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCX0KLQotCQl9IGVsc2UgewotCQkJc3VwZXIucnVuKGFjdGlvbik7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQHBhcmFtIGdlcAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNDYW5vbmljYWwoSUdyYXBoaWNhbEVkaXRQYXJ0IGdlcCkgewotCQlFZGl0UGFydCBwYXJlbnQgPSBnZXAuZ2V0UGFyZW50KCk7Ci0JCWlmIChwYXJlbnQgaW5zdGFuY2VvZiBJR3JhcGhpY2FsRWRpdFBhcnQpIHsKLQkJCUNhbm9uaWNhbEVkaXRQb2xpY3kgY2VwID0gKENhbm9uaWNhbEVkaXRQb2xpY3kpcGFyZW50LmdldEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLkNBTk9OSUNBTF9ST0xFKTsKLQkJCWlmICggY2VwICE9IG51bGwgKSB7Ci0JCQkJaWYgKGNlcC5pc0VuYWJsZWQoKSkKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlwdWJsaWMgUmVxdWVzdCBnZXRTZWNvbmRhcnlUYXJnZXRSZXF1ZXN0KCl7Ci0JCWlmKHNlY29uZGFyeVRhcmdldFJlcXVlc3QgPT0gbnVsbCl7Ci0JCQlzZWNvbmRhcnlUYXJnZXRSZXF1ZXN0ID0gbmV3IEdyb3VwUmVxdWVzdCgKLQkJCQkJUmVxdWVzdENvbnN0YW50cy5SRVFfREVMRVRFKTsKLQkJfQotCQlyZXR1cm4gc2Vjb25kYXJ5VGFyZ2V0UmVxdWVzdDsKLQl9Ci0JcHJpdmF0ZSBSZXF1ZXN0IHNlY29uZGFyeVRhcmdldFJlcXVlc3Q7Ci0JCi0JcHJpdmF0ZSBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3MgZ2V0T3duaW5nUHJvY2VzcygpewotCQlpZih0YXJnZXRQYXJ0ICE9IG51bGwpewotCQkJRGlhZ3JhbSBkID0gKChBYnN0cmFjdERpYWdyYW1FZGl0b3IpdGFyZ2V0UGFydCkuZ2V0RGlhZ3JhbSgpOwotCQkJRGlhZ3JhbUFkYXB0ZXIgYWRhcHRlciA9IEJyaWRnZUhlbHBlci5nZXREaWFncmFtQWRhcHRlcihkLmdldEVsZW1lbnQoKSk7Ci0JCQlpZihhZGFwdGVyICE9IG51bGwpewotCQkJCXJldHVybiBUbmdVdGlsLmdldE93bmluZ1Byb2Nlc3MoYWRhcHRlci5nZXRBY3Rpdml0eSgpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9jb3JlL2FjdGlvbnMvRGlhZ3JhbUFjdGlvbnNTZXJ2aWNlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9jb3JlL2FjdGlvbnMvRGlhZ3JhbUFjdGlvbnNTZXJ2aWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwYmY3MDkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vY29yZS9hY3Rpb25zL0RpYWdyYW1BY3Rpb25zU2VydmljZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuYWN0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5pbXBsLkludGVybmFsVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5EaWFncmFtQ29yZVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkNoYW5nZUJvdW5kc0NvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5jb21tYW5kcy5SZWNvbm5lY3RMaW5rQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnV0aWwuRGlhZ3JhbUNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5EZWZhdWx0RWRpdERvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkdyYXBoaWNhbFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZFN0YWNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cGFydHMuQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYudWkuYWN0aW9ucy5BY3Rpb25SZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYudWkuYWN0aW9ucy5HRUZBY3Rpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLnV0aWwuVmlld1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5hY3Rpb25zLkFjdGlvbklkczsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5Db25uZWN0aW9uTm9kZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLkRpYWdyYW1FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5TaGFwZU5vZGVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5FZGdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm90YXRpb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUNvbnRyaWJ1dGlvbkl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uTWVudU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLlNlcGFyYXRvcjsKLQotLyoqCi0gKiBTZXJ2aWNlIGNsYXNzIHRvIGFsbG93IGNyZWF0ZSBhbmQgcmVnaXN0ZXIgY29tbW9uIGFjdGlvbnMgdG8gdGhlIGFjdGlvbgotICogcmVnaXN0ZXIuIENvZGUgaXMgbWlncmF0ZSBmcm9tIG9sZCBtZXRob2Qgb2YgZGlhZ3JhbW1pbmcuCi0gKiAKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQHNpbmNlIDEuMgotICovCi1wdWJsaWMgY2xhc3MgRGlhZ3JhbUFjdGlvbnNTZXJ2aWNlIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFMSUdOX0hPUlpfQVZFUkFHRSA9ICJhbGlnbl9ob3Jpem9udGFsX3RvX2F2ZXJhZ2UiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBTElHTl9IT1JaX0ZJUlNUX1NFTEVDVEVEID0gImFsaWduX2hvcml6b250YWxfdG9fZmlyc3Rfc2VsZWN0aW9uIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUxJR05fVkVSVF9BVkVSQUdFID0gImFsaWduX3ZlcnRpY2FsX3RvX2F2ZXJhZ2UiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBTElHTl9WRVJUX0ZJUlNUX1NFTEVDVEVEID0gImFsaWduX3ZlcnRpY2FsX3RvX2ZpcnN0X3NlbGVjdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgRGVmYXVsdEVkaXREb21haW4gZWRpdERvbWFpbjsKLQotCXByaXZhdGUgR3JhcGhpY2FsVmlld2VyIGdyYXBoaWNhbFZpZXdlcjsKLQotCXByaXZhdGUgQWN0aW9uUmVnaXN0cnkgYWN0aW9uUmVnaXN0cnk7Ci0JCi0JcHJpdmF0ZSBJbnRlcm5hbFRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIHRyYW5zYWN0aW9uRG9tYWluOwotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgCi0JICogQHBhcmFtIGdyYXBoaWNhbFZpZXdlciB7QGxpbmsgR3JhcGhpY2FsVmlld2VyfQotCSAqIEBwYXJhbSBlZGl0RG9tYWluIAl7QGxpbmsgRGVmYXVsdEVkaXREb21haW59Ci0JICogQHBhcmFtIGFjdGlvblJlZ2lzdHJ5IAl7QGxpbmsgQWN0aW9uUmVnaXN0cnl9Ci0JICovCi0JcHVibGljIERpYWdyYW1BY3Rpb25zU2VydmljZShJbnRlcm5hbFRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIHRyYW5zYWN0aW9uRG9tYWluLCBHcmFwaGljYWxWaWV3ZXIgZ3JhcGhpY2FsVmlld2VyLAotCQkJRGVmYXVsdEVkaXREb21haW4gZWRpdERvbWFpbiwgQWN0aW9uUmVnaXN0cnkgYWN0aW9uUmVnaXN0cnkpIHsKLQkJdGhpcy50cmFuc2FjdGlvbkRvbWFpbiA9IHRyYW5zYWN0aW9uRG9tYWluOwotCQl0aGlzLmdyYXBoaWNhbFZpZXdlciA9IGdyYXBoaWNhbFZpZXdlcjsKLQkJdGhpcy5lZGl0RG9tYWluID0gZWRpdERvbWFpbjsKLQkJdGhpcy5hY3Rpb25SZWdpc3RyeSA9IGFjdGlvblJlZ2lzdHJ5OwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIEdyYXBoaWNhbFZpZXdlci4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRHcmFwaGljYWxWaWV3ZXIoR3JhcGhpY2FsVmlld2VyIGdyYXBoaWNhbFZpZXdlcikgewotCQl0aGlzLmdyYXBoaWNhbFZpZXdlciA9IGdyYXBoaWNhbFZpZXdlcjsKLQl9Ci0KLQkvKioKLQkgKiByZXR1cm5zIEdyYXBoaWNhbFZpZXdlcgotCSAqLwotCXByaXZhdGUgR3JhcGhpY2FsVmlld2VyIGdldEdyYXBoaWNhbFZpZXdlcigpIHsKLQkJcmV0dXJuIGdyYXBoaWNhbFZpZXdlcjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjb21tYW5kIHN0YWNrLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGNvbW1hbmQgc3RhY2sKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZFN0YWNrIGdldENvbW1hbmRTdGFjaygpIHsKLQkJcmV0dXJuIGdldEVkaXREb21haW4oKS5nZXRDb21tYW5kU3RhY2soKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBlZGl0IGRvbWFpbi4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBlZGl0IGRvbWFpbgotCSAqLwotCXByb3RlY3RlZCBEZWZhdWx0RWRpdERvbWFpbiBnZXRFZGl0RG9tYWluKCkgewotCQlyZXR1cm4gZWRpdERvbWFpbjsKLQl9Ci0KLQlwcm90ZWN0ZWQgQWN0aW9uUmVnaXN0cnkgZ2V0QWN0aW9uUmVnaXN0cnkoKSB7Ci0JCXJldHVybiBhY3Rpb25SZWdpc3RyeTsKLQl9Ci0KLQkvKioKLQkgKiBSZWdpc3RlciBIb3Jpem9udGFsQWxpZ25BdmVyYWdlQWN0aW9uIGFjdGlvbi4gCi0JICogSG9yaXpvbnRhbEFpZ25BdmVyYWdlIEFjdGlvbiBhbGlnbnMgc2VsZWN0ZWQgZWRpdHBhcnRzIHRvIGhvcml6b250YWwgYXZlcmFnZS4gIAotCSAqLwotCXB1YmxpYyBJQWN0aW9uIHJlZ2lzdGVySG9yaXpvbnRhbEFsaWduQXZlcmFnZUFjdGlvbigpIHsKLQkJLy8gYWxpZ24gaG9yaXpvbnRhbGx5IHRvIGF2ZXJhZ2UgeS12YWx1ZSBvZiBhbGwgbm9kZXMKLQkJSUFjdGlvbiBoQWxpZ25BdmVyYWdlQWN0aW9uID0gbmV3IEFjdGlvbigKLQkJCQlEaWFncmFtQ29yZVJlc291cmNlcy5BYnN0cmFjdERpYWdyYW1FZGl0b3JfaEFsaWduQXZlcmFnZUFjdGlvbl90ZXh0KSB7IC8vJE5PTi1OTFMtMSQKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlob3JpekFsaWduVG9BdmVyYWdlU2VsZWN0ZWQoKTsKLQkJCX0KLQotCQkJcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJCQlyZXR1cm4gQUxJR05fSE9SWl9BVkVSQUdFOwotCQkJfQotCQl9OwotCQlnZXRBY3Rpb25SZWdpc3RyeSgpLnJlZ2lzdGVyQWN0aW9uKGhBbGlnbkF2ZXJhZ2VBY3Rpb24pOwotCi0JCXJldHVybiBoQWxpZ25BdmVyYWdlQWN0aW9uOwotCX0KLQkKLQkvKioKLQkgKiBSZWdpc3RlciBIb3Jpem9udGFsQWxpZ25GaXJzdFNlbGVjdGVkQWN0aW9uIGFjdGlvbi4gCi0JICogSG9yaXpvbnRhbEFsaWduRmlyc3RTZWxlY3RlZEFjdGlvbiBhbGlnbnMgc2VsZWN0ZWQgZWRpdHBhcnRzIHdpdGggCi0JICogcmVzcGVjdCB0byBmaXJzdCBzZWxlY3RlZCBlZGl0cGFydC4gCi0JICovCi0KLQlwdWJsaWMgSUFjdGlvbiByZWdpc3Rlckhvcml6b250YWxBbGlnbkZpcnN0U2VsZWN0ZWRBY3Rpb24oKSB7Ci0JCS8vIGFsaWduIGhvcml6b250YWxseSB0byB5LXZhbHVlIG9mIGZpcnN0IHNlbGVjdGVkIG5vZGUKLQkJSUFjdGlvbiBoQWxpZ25GaXJzdFNlbGVjdGVkQWN0aW9uID0gbmV3IEFjdGlvbigKLQkJCQlEaWFncmFtQ29yZVJlc291cmNlcy5BYnN0cmFjdERpYWdyYW1FZGl0b3JfaEFsaWduRmlyc3RTZWxlY3RlZEFjdGlvbl90ZXh0KSB7IC8vJE5PTi1OTFMtMSQKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlob3J6QWxpZ25Ub0ZpcnN0U2VsZWN0ZWQoKTsKLQkJCX0KLQotCQkJcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJCQlyZXR1cm4gQUxJR05fSE9SWl9GSVJTVF9TRUxFQ1RFRDsKLQkJCX0KLQkJfTsKLQkJZ2V0QWN0aW9uUmVnaXN0cnkoKS5yZWdpc3RlckFjdGlvbihoQWxpZ25GaXJzdFNlbGVjdGVkQWN0aW9uKTsKLQotCQlyZXR1cm4gaEFsaWduRmlyc3RTZWxlY3RlZEFjdGlvbjsKLQl9Ci0JCi0JLyoqCi0JICogUmVnaXN0ZXIgdmVydGlhbEFsaWduQXZlcmFnZUFjdGlvbiBhY3Rpb24uIAotCSAqIHZlcnRpYWxBbGlnbkF2ZXJhZ2VBY3Rpb24gYWxpZ25zIHNlbGVjdGVkIGVkaXRwYXJ0cyB2ZXJ0aWNhbGx5IHcuci50IGF2ZXJhZ2UuCi0JICogCi0JICovCi0JCi0JcHVibGljIElBY3Rpb24gcmVnaXN0ZXJWZXJ0aWNhbEFsaWduQXZlcmFnZUFjdGlvbigpIHsKLQkJLy8gYWxpZ24gdmVydGljYWxseSB0byBhdmVyYWdlIHgtdmFsdWUgb2YgYWxsIHNlbGVjdGVkIG5vZGVzCi0JCUlBY3Rpb24gdkFsaWduQXZlcmFnZUFjdGlvbiA9IG5ldyBBY3Rpb24oCi0JCQkJRGlhZ3JhbUNvcmVSZXNvdXJjZXMuQWJzdHJhY3REaWFncmFtRWRpdG9yX3ZBbGlnbkF2ZXJhZ2VBY3Rpb25fdGV4dCkgeyAvLyROT04tTkxTLTEkCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJdmVydGljYWxBbGlnblRvQXZlcmFnZVNlbGVjdGVkKCk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCQkJcmV0dXJuIEFMSUdOX1ZFUlRfQVZFUkFHRTsKLQkJCX0KLQkJfTsKLQkJZ2V0QWN0aW9uUmVnaXN0cnkoKS5yZWdpc3RlckFjdGlvbih2QWxpZ25BdmVyYWdlQWN0aW9uKTsKLQotCQlyZXR1cm4gdkFsaWduQXZlcmFnZUFjdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBSZWdpc3RlciB2ZXJ0aWFsQWxpZ25GaXJzdFNlbGVjdGVkQWN0aW9uIGFjdGlvbi4gCi0JICogdmVydGlhbEFsaWduRmlyc3RTZWxlY3RlZEFjdGlvbiBhbGlnbnMgc2VsZWN0ZWQgZWRpdHBhcnRzIHZlcnRpY2FsbHkgdy5yLnQgZmlyc3Qgc2VsZWN0ZWQuCi0JICogCi0JICovCi0KLQlwdWJsaWMgSUFjdGlvbiByZWdpc3RlclZlcnRpY2FsQWxpZ25GaXJzdFNlbGVjdGVkQWN0aW9uKCkgewotCQkvLyBhbGlnbiB2ZXJ0aWNhbGx5IHRvIHgtdmFsdWUgb2YgZmlyc3Qgc2VsZWN0ZWQgbm9kZQotCQlJQWN0aW9uIHZBbGlnbkZpcnN0U2VsZWN0ZWRBY3Rpb24gPSBuZXcgQWN0aW9uKAotCQkJCURpYWdyYW1Db3JlUmVzb3VyY2VzLkFic3RyYWN0RGlhZ3JhbUVkaXRvcl92QWxpZ25GaXJzdFNlbGVjdGVkQWN0aW9uX3RleHQpIHsgLy8kTk9OLU5MUy0xJAotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCXZlcnRpY2FsQWxpZ25Ub0ZpcnN0U2VsZWN0ZWQoKTsKLQkJCX0KLQotCQkJcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJCQlyZXR1cm4gQUxJR05fVkVSVF9GSVJTVF9TRUxFQ1RFRDsKLQkJCX0KLQkJfTsKLQkJZ2V0QWN0aW9uUmVnaXN0cnkoKS5yZWdpc3RlckFjdGlvbih2QWxpZ25GaXJzdFNlbGVjdGVkQWN0aW9uKTsKLQotCQlyZXR1cm4gdkFsaWduRmlyc3RTZWxlY3RlZEFjdGlvbjsKLQl9Ci0KLQkvLyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0JLy8gYWN0aW9uIG1ldGhvZHMKLQkvLyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0JCi0JLyoqIAotCSAqIEFjdGlvbiBpbXBsZW1lbnRhdGlvbiBtZXRob2QgZm9yIGhvcml6b250YWxBbGlnbkZpcnN0ZVNFbGVjdGVkQWN0aW9uLgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIGhvcnpBbGlnblRvRmlyc3RTZWxlY3RlZCgpIHsKLQkJTGlzdCBlZGl0UGFydHMgPSBnZXRHcmFwaGljYWxWaWV3ZXIoKS5nZXRTZWxlY3RlZEVkaXRQYXJ0cygpOwotCQlBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0IGZpcnN0UGFydCA9IG51bGw7Ci0JCS8vIGxvb3AgdGhyb3VnaCBhbGwgc2VsZWN0ZWQgaXRlbXMsIHJlbWVtYmVyIHRoZSB5LXZhbHVlIG9mIHRoZQotCQkvLyBmaXJzdCBub2RlLAotCQkvLyBzZXQgdGhlIGZvbGxvd2luZyBub2RlcyB0byB0aGUgc2FtZSB5LXZhbHVlCi0JCWZvciAoaW50IGEgPSAwOyBhIDwgZWRpdFBhcnRzLnNpemUoKTsgYSsrKSB7Ci0JCQlpZiAoZWRpdFBhcnRzLmdldChhKSBpbnN0YW5jZW9mIFNoYXBlTm9kZUVkaXRQYXJ0KSB7Ci0JCQkJQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCBlcCA9IChBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0KSBlZGl0UGFydHMKLQkJCQkJCS5nZXQoYSk7Ci0JCQkJLy8gcmVtZW1iZXIgdGhlIGZpcnN0IHBhcnQgd2UgbW92ZQotCQkJCWlmIChmaXJzdFBhcnQgPT0gbnVsbCkgewotCQkJCQlmaXJzdFBhcnQgPSBlcDsKLQkJCQl9IGVsc2UgewotCQkJCQkvLyBjYWxjdWxhdGUgdGhlIG9mZnNldCBmb3IgY2VudGVybGluZSBhbGlnbm1lbnQKLQkJCQkJUmVjdGFuZ2xlIGJvdW5kcyA9IGVwLmdldEZpZ3VyZSgpLmdldEJvdW5kcygpOwotCQkJCQlpbnQgb2Zmc2V0ID0gKGludCkgKChkb3VibGUpIChib3VuZHMuaGVpZ2h0IC0gZmlyc3RQYXJ0Ci0JCQkJCQkJLmdldEZpZ3VyZSgpLmdldEJvdW5kcygpLmhlaWdodCkgLyAyLjApOwotCQkJCQkvLyBpcyB0aGlzIG5vZGUgaW4gYSBjb250YWluZXI/Ci0JCQkJCWlmICghKGVwLmdldFBhcmVudCgpIGluc3RhbmNlb2YgRGlhZ3JhbUVkaXRQYXJ0KSkgewotCQkJCQkJLy8gbmVlZCB0byBtb3ZlIHRoZSBjb250YWluZXIsIGFkanVzdCB0aGUgb2Zmc2V0Ci0JCQkJCQllcCA9IChBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0KSBlcC5nZXRQYXJlbnQoKTsKLQkJCQkJCVJlY3RhbmdsZSBwYXJlbnRCb3VuZHMgPSBlcC5nZXRGaWd1cmUoKS5nZXRCb3VuZHMoKTsKLQkJCQkJCW9mZnNldCArPSBib3VuZHMueSAtIHBhcmVudEJvdW5kcy55OwotCQkJCQkJYm91bmRzID0gcGFyZW50Qm91bmRzOwotCQkJCQl9Ci0JCQkJCS8vIHNlbmQgdGhlIGNvbW1hbmQgdG8gbW92ZSB0aGUgbm9kZQotCQkJCQlvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZCBjID0gbmV3IENoYW5nZUJvdW5kc0NvbW1hbmQodHJhbnNhY3Rpb25Eb21haW4sCi0JCQkJCQkJKE5vZGUpIGVwLmdldE1vZGVsKCksIG5ldyBQb2ludChib3VuZHMueCwgZmlyc3RQYXJ0Ci0JCQkJCQkJCQkuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCkueQotCQkJCQkJCQkJLSBvZmZzZXQpLCBib3VuZHMud2lkdGgsIC0xKTsKLQkJCQkJZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShjKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JLyoqIAotCSAqIEFjdGlvbiBpbXBsZW1lbnRhdGlvbiBtZXRob2QgZm9yIGhvcml6b250YWxBbGlnbkF2ZXJhZ2VBY3Rpb24uCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgaG9yaXpBbGlnblRvQXZlcmFnZVNlbGVjdGVkKCkgewotCQlMaXN0IGVkaXRQYXJ0cyA9IGdldEdyYXBoaWNhbFZpZXdlcigpLmdldFNlbGVjdGVkRWRpdFBhcnRzKCk7Ci0JCUFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQgZmlyc3RQYXJ0ID0gbnVsbDsKLQkJaW50IHRvdGFsID0gMDsKLQkJaW50IHlzdW0gPSAwOwotCQlmb3IgKGludCBhID0gMDsgYSA8IGVkaXRQYXJ0cy5zaXplKCk7IGErKykgewotCQkJaWYgKGVkaXRQYXJ0cy5nZXQoYSkgaW5zdGFuY2VvZiBTaGFwZU5vZGVFZGl0UGFydCkgewotCQkJCUFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQgZXAgPSAoQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCkgZWRpdFBhcnRzCi0JCQkJCQkuZ2V0KGEpOwotCQkJCS8vIHJlbWVtYmVyIHRoZSBmaXJzdCBwYXJ0IHdlIG1vdmUKLQkJCQlpZiAoZmlyc3RQYXJ0ID09IG51bGwpIHsKLQkJCQkJZmlyc3RQYXJ0ID0gZXA7Ci0JCQkJfQotCQkJCXlzdW0gKz0gZXAuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCkueTsKLQkJCQl0b3RhbCsrOwotCQkJfQotCQl9Ci0JCS8vIGNhbGN1bGF0ZSB0aGUgYXZlcmFnZSB5LXZhbHVlIGZvciBhbGwgbm9kZXMKLQkJaW50IHlhdmUgPSAoaW50KSAoKGRvdWJsZSkgeXN1bSAvIChkb3VibGUpIHRvdGFsKTsKLQkJLy8gbG9vcCB0aHJvdWdoIGFsbCB0aGUgbm9kZXMgYWdhaW4gYW5kIHNldCB0aGVtCi0JCWZvciAoaW50IGEgPSAwOyBhIDwgZWRpdFBhcnRzLnNpemUoKTsgYSsrKSB7Ci0JCQlpZiAoZWRpdFBhcnRzLmdldChhKSBpbnN0YW5jZW9mIFNoYXBlTm9kZUVkaXRQYXJ0KSB7Ci0JCQkJQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCBlcCA9IChBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0KSBlZGl0UGFydHMKLQkJCQkJCS5nZXQoYSk7Ci0JCQkJLy8gY2FsY3VsYXRlIHRoZSBoZWlnaHQgZGlmZmVyZW5jZSwgc28gdGhhdCBlbGVtZW50cyBhcmUgYWxpZ25lZAotCQkJCS8vIHRocm91Z2ggdGhlIGNlbnRlcmxpbmUKLQkJCQlSZWN0YW5nbGUgYm91bmRzID0gZXAuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCk7Ci0JCQkJaW50IG9mZnNldCA9IChpbnQpICgoZG91YmxlKSAoYm91bmRzLmhlaWdodCAtIGZpcnN0UGFydAotCQkJCQkJLmdldEZpZ3VyZSgpLmdldEJvdW5kcygpLmhlaWdodCkgLyAyLjApOwotCQkJCS8vIGlzIHRoaXMgbm9kZSBpbnNpZGUgYSBjb250YWluZXI/Ci0JCQkJaWYgKCEoZXAuZ2V0UGFyZW50KCkgaW5zdGFuY2VvZiBEaWFncmFtRWRpdFBhcnQpKSB7Ci0JCQkJCS8vIHdlIG5lZWQgdG8gbW92ZSB0aGUgY29udGFpbmVyLCBhZGp1c3QgdGhlIG9mZnNldAotCQkJCQllcCA9IChBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0KSBlcC5nZXRQYXJlbnQoKTsKLQkJCQkJUmVjdGFuZ2xlIHBhcmVudEJvdW5kcyA9IGVwLmdldEZpZ3VyZSgpLmdldEJvdW5kcygpOwotCQkJCQlvZmZzZXQgKz0gYm91bmRzLnkgLSBwYXJlbnRCb3VuZHMueTsKLQkJCQkJYm91bmRzID0gcGFyZW50Qm91bmRzOwotCQkJCX0KLQkJCQkvLyBzZW5kIHRoZSBjb21tYW5kIHRvIG1vdmUgdGhlIG5vZGUKLQkJCQlvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZCBjID0gbmV3IENoYW5nZUJvdW5kc0NvbW1hbmQodHJhbnNhY3Rpb25Eb21haW4sCi0JCQkJCQkoTm9kZSkgZXAuZ2V0TW9kZWwoKSwKLQkJCQkJCW5ldyBQb2ludChib3VuZHMueCwgeWF2ZSAtIG9mZnNldCksIGJvdW5kcy53aWR0aCwgLTEpOwotCQkJCWdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUoYyk7Ci0JCQl9Ci0JCX0KLQotCX0KLQkvKiogCi0JICogQWN0aW9uIGltcGxlbWVudGF0aW9uIG1ldGhvZCBmb3IgdmVydGljYWxBbGlnblRvQXZlcmFnZUFjdGlvbi4KLQkgKiAKLQkgKi8KLQotCXB1YmxpYyB2b2lkIHZlcnRpY2FsQWxpZ25Ub0F2ZXJhZ2VTZWxlY3RlZCgpIHsKLQkJTGlzdCBlZGl0UGFydHMgPSBnZXRHcmFwaGljYWxWaWV3ZXIoKS5nZXRTZWxlY3RlZEVkaXRQYXJ0cygpOwotCQlBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0IGZpcnN0UGFydCA9IG51bGw7Ci0JCWludCB0b3RhbCA9IDA7Ci0JCWludCB4c3VtID0gMDsKLQkJLy8gbG9vcCB0aHJvdWdoIHRoZSBzZWxlY3RlZCBwYXJ0cwotCQlmb3IgKGludCBhID0gMDsgYSA8IGVkaXRQYXJ0cy5zaXplKCk7IGErKykgewotCQkJLy8gd2UgYXJlIG9ubHkgaW50ZXJlc3RlZCBpbiBub2RlcyBhbmQgY29udGFpbmVycwotCQkJaWYgKGVkaXRQYXJ0cy5nZXQoYSkgaW5zdGFuY2VvZiBTaGFwZU5vZGVFZGl0UGFydCkgewotCQkJCUFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQgZXAgPSAoQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCkgZWRpdFBhcnRzCi0JCQkJCQkuZ2V0KGEpOwotCQkJCWlmIChmaXJzdFBhcnQgPT0gbnVsbCkgewotCQkJCQlmaXJzdFBhcnQgPSBlcDsKLQkJCQl9Ci0JCQkJLy8gc3VtIHRoZSB4IGNvb3JkaW5hdGVzIG9mIGVhY2ggZWxlbWVudAotCQkJCXhzdW0gKz0gZXAuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCkueDsKLQkJCQkvLyByZW1lbWJlciBob3cgbWFueSBzZWxlY3RlZCBlbGVtZW50cyBhcHBsaWVkIHRvIHRoaXMgb3BlcmF0aW9uCi0JCQkJdG90YWwrKzsKLQkJCX0KLQkJfQotCQkvLyBjYWxjdWxhdGUgdGhlIGF2ZXJhZ2UgeC12YWx1ZSBmb3IgYWxsIG5vZGVzCi0JCWludCB4YXZlID0gKGludCkgKChkb3VibGUpIHhzdW0gLyAoZG91YmxlKSB0b3RhbCk7Ci0JCS8vIGxvb3AgdGhyb3VnaCBhbGwgdGhlIG5vZGVzIGFnYWluIGFuZCBzZXQgdGhlbQotCQlmb3IgKGludCBhID0gMDsgYSA8IGVkaXRQYXJ0cy5zaXplKCk7IGErKykgewotCQkJaWYgKGVkaXRQYXJ0cy5nZXQoYSkgaW5zdGFuY2VvZiBTaGFwZU5vZGVFZGl0UGFydCkgewotCQkJCUFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQgZXAgPSAoQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCkgZWRpdFBhcnRzCi0JCQkJCQkuZ2V0KGEpOwotCQkJCS8vIGNhbGN1bGF0ZSB0aGUgb2Zmc2V0IGZvciBjZW50ZXJsaW5lIGFsaWdubWVudAotCQkJCVJlY3RhbmdsZSBib3VuZHMgPSBlcC5nZXRGaWd1cmUoKS5nZXRCb3VuZHMoKTsKLQkJCQlpbnQgb2Zmc2V0ID0gKGludCkgKChkb3VibGUpIChib3VuZHMud2lkdGggLSBmaXJzdFBhcnQKLQkJCQkJCS5nZXRGaWd1cmUoKS5nZXRCb3VuZHMoKS53aWR0aCkgLyAyLjApOwotCQkJCS8vIGFyZSB3ZSBpbnNpZGUgYSBjb250YWluZXI/Ci0JCQkJaWYgKCEoZXAuZ2V0UGFyZW50KCkgaW5zdGFuY2VvZiBEaWFncmFtRWRpdFBhcnQpKSB7Ci0JCQkJCS8vIGFkanVzdCB0aGUgb2Zmc2V0IHNpbmNlIHdlIGhhdmUgdG8gbW92ZSB0aGUgY29udGFpbmVyCi0JCQkJCWVwID0gKEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQpIGVwLmdldFBhcmVudCgpOwotCQkJCQlSZWN0YW5nbGUgcGFyZW50Qm91bmRzID0gZXAuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCk7Ci0JCQkJCW9mZnNldCArPSBib3VuZHMueCAtIHBhcmVudEJvdW5kcy54OwotCQkJCQlib3VuZHMgPSBwYXJlbnRCb3VuZHM7Ci0JCQkJfQotCQkJCS8vIHNlbmQgdGhlIGNvbW1hbmQgdG8gbW92ZSB0aGUgZWxlbWVudAotCQkJCW9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kIGMgPSBuZXcgQ2hhbmdlQm91bmRzQ29tbWFuZCh0cmFuc2FjdGlvbkRvbWFpbiwKLQkJCQkJCShOb2RlKSBlcC5nZXRNb2RlbCgpLAotCQkJCQkJbmV3IFBvaW50KHhhdmUgLSBvZmZzZXQsIGJvdW5kcy55KSwgYm91bmRzLndpZHRoLCAtMSk7Ci0JCQkJZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShjKTsKLQkJCX0KLQkJfQotCi0JfQotCS8qKiAKLQkgKiBBY3Rpb24gaW1wbGVtZW50YXRpb24gbWV0aG9kIGZvciB2ZXJ0aWNhbEFsaWduVG9GaXJzdFNlbGVjdGVkQWN0aW9uLgotCSAqIAotCSAqLwotCi0JcHVibGljIHZvaWQgdmVydGljYWxBbGlnblRvRmlyc3RTZWxlY3RlZCgpIHsKLQkJLy8gZ2V0IHRoZSBzZWxlY3RlZCBpdGVtcwotCQlMaXN0IGVkaXRQYXJ0cyA9IGdldEdyYXBoaWNhbFZpZXdlcigpLmdldFNlbGVjdGVkRWRpdFBhcnRzKCk7Ci0JCUFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQgYWxpZ25Ub1BhcnQgPSBudWxsOwotCQkvLyBmaW5kIHRoZSBmaXJzdCBkaWFncmFtIHBhcnQgd2UgY2FuIGFsaWduIHRvCi0JCWZvciAoaW50IGEgPSAwOyBhIDwgZWRpdFBhcnRzLnNpemUoKTsgYSsrKSB7Ci0JCQlpZiAoZWRpdFBhcnRzLmdldChhKSBpbnN0YW5jZW9mIFNoYXBlTm9kZUVkaXRQYXJ0KSB7Ci0JCQkJQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCBlcCA9IChBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0KSBlZGl0UGFydHMKLQkJCQkJCS5nZXQoYSk7Ci0JCQkJaWYgKGFsaWduVG9QYXJ0ID09IG51bGwpIHsKLQkJCQkJLy8gcmVtZW1iZXIgaXQgYW5kIHN0b3AKLQkJCQkJYWxpZ25Ub1BhcnQgPSBlcDsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCS8vIGxvb3AgdGhyb3VnaCB0aGUgZWxlbWVudHMgYW5kIHNldCB0aGVpciBuZXcgcG9zaXRpb24KLQkJZm9yIChpbnQgYSA9IDA7IGEgPCBlZGl0UGFydHMuc2l6ZSgpOyBhKyspIHsKLQkJCWlmIChlZGl0UGFydHMuZ2V0KGEpIGluc3RhbmNlb2YgU2hhcGVOb2RlRWRpdFBhcnQpIHsKLQkJCQlBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0IGVwID0gKEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQpIGVkaXRQYXJ0cwotCQkJCQkJLmdldChhKTsKLQkJCQkvLyB3ZSBjYW4gc2tpcCB0aGUgZmlyc3Qgb25lIHNpbmNlIHRoaXMgaXMgYW4gYWxpZ24tdG8KLQkJCQlpZiAoZXAgIT0gYWxpZ25Ub1BhcnQKLQkJCQkJCSYmICEoRGlhZ3JhbUNvcmVVdGlsLmlzU3luY0JhcihhbGlnblRvUGFydCkpKSB7Ci0JCQkJCS8vIGNhbGN1bGF0ZSB0aGUgb2Zmc2V0IGZvciBjZW50ZXJsaW5lIGFsaWdubWVudAotCQkJCQlpZiAoIShEaWFncmFtQ29yZVV0aWwuaXNTeW5jQmFyKGVwKSkpIHsKLQkJCQkJCVJlY3RhbmdsZSBib3VuZHMgPSBlcC5nZXRGaWd1cmUoKS5nZXRCb3VuZHMoKTsKLQkJCQkJCWludCBvZmZzZXQgPSAoaW50KSAoKGRvdWJsZSkgKGJvdW5kcy53aWR0aCAtIGFsaWduVG9QYXJ0Ci0JCQkJCQkJCS5nZXRGaWd1cmUoKS5nZXRCb3VuZHMoKS53aWR0aCkgLyAyLjApOwotCQkJCQkJLy8gaXMgdGhpcyBpbnNpZGUgYSBjb250YWluZXI/Ci0JCQkJCQlpZiAoIShlcC5nZXRQYXJlbnQoKSBpbnN0YW5jZW9mIERpYWdyYW1FZGl0UGFydCkpIHsKLQkJCQkJCQkvLyBhZGp1c3QgdGhlIG9mZnNldCBzaW5jZSB3ZSBhcmUgbW92aW5nIHRoZQotCQkJCQkJCS8vIGNvbnRhaW5lcgotCQkJCQkJCWVwID0gKEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQpIGVwLmdldFBhcmVudCgpOwotCQkJCQkJCVJlY3RhbmdsZSBwYXJlbnRCb3VuZHMgPSBlcC5nZXRGaWd1cmUoKS5nZXRCb3VuZHMoKTsKLQkJCQkJCQlvZmZzZXQgKz0gYm91bmRzLnggLSBwYXJlbnRCb3VuZHMueDsKLQkJCQkJCQlib3VuZHMgPSBwYXJlbnRCb3VuZHM7Ci0JCQkJCQl9Ci0JCQkJCQkvLyBzZW5kIHRoZSBjb21tYW5kIHRvIG1vdmUgdGhlIGVsZW1lbnQKLQkJCQkJCW9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kIGMgPSBuZXcgQ2hhbmdlQm91bmRzQ29tbWFuZCh0cmFuc2FjdGlvbkRvbWFpbiwKLQkJCQkJCQkJKE5vZGUpIGVwLmdldE1vZGVsKCksIG5ldyBQb2ludChhbGlnblRvUGFydAotCQkJCQkJCQkJCS5nZXRGaWd1cmUoKS5nZXRCb3VuZHMoKS54Ci0JCQkJCQkJCQkJLSBvZmZzZXQsIGJvdW5kcy55KSwgYm91bmRzLndpZHRoLCAtMSk7Ci0JCQkJCQlnZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKGMpOwotCQkJCQkJZXAuZ2V0RmlndXJlKCkuc2V0TG9jYXRpb24oCi0JCQkJCQkJCW5ldyBQb2ludChhbGlnblRvUGFydC5nZXRGaWd1cmUoKS5nZXRCb3VuZHMoKS54Ci0JCQkJCQkJCQkJLSBvZmZzZXQsIGJvdW5kcy55KSk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlQb2ludCB0cCA9IGVwLmdldEZpZ3VyZSgpLmdldEJvdW5kcygpLmdldENlbnRlcigpOwotCQkJCQkJYm9vbGVhbiBjb25uZWN0ZWQgPSBmYWxzZTsKLQkJCQkJCWJvb2xlYW4gc291cmNlID0gZmFsc2U7Ci0JCQkJCQlQb2ludCBlbmRQb2ludCA9IG51bGw7Ci0JCQkJCQlDb25uZWN0aW9uTm9kZUVkaXRQYXJ0IGxwID0gbnVsbDsKLQkJCQkJCS8vIGNoZWNrIHRhcmdldCBjb25uZWN0aW9ucwotCQkJCQkJTGlzdCBsaXN0ID0gKChTaGFwZU5vZGVFZGl0UGFydCkgZXApLmdldFRhcmdldENvbm5lY3Rpb25zKCk7Ci0JCQkJCQlmb3IgKEl0ZXJhdG9yIGl0b3IgPSBsaXN0Lml0ZXJhdG9yKCk7IGl0b3IuaGFzTmV4dCgpOykgewotCQkJCQkJCWxwID0gKENvbm5lY3Rpb25Ob2RlRWRpdFBhcnQpIGl0b3IubmV4dCgpOwotCQkJCQkJCWlmIChscC5nZXRTb3VyY2UoKS5lcXVhbHMoYWxpZ25Ub1BhcnQpKSB7Ci0JCQkJCQkJCWNvbm5lY3RlZCA9IHRydWU7Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCS8vIGNoZWNrIHNvdXJjZSBjb25uZWN0aW9ucyBpZiBub3QgZm91bmQgaW4gdGFyZ2V0IGNvbm5lY3Rpb25zCi0JCQkJCQlpZiAoIWNvbm5lY3RlZCkgewotCQkJCQkJCWxpc3QgPSAoKFNoYXBlTm9kZUVkaXRQYXJ0KSBlcCkuZ2V0U291cmNlQ29ubmVjdGlvbnMoKTsKLQkJCQkJCQlmb3IgKEl0ZXJhdG9yIGl0b3IgPSBsaXN0Lml0ZXJhdG9yKCk7IGl0b3IKLQkJCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJCWxwID0gKENvbm5lY3Rpb25Ob2RlRWRpdFBhcnQpIGl0b3IubmV4dCgpOwotCQkJCQkJCQlpZiAobHAuZ2V0VGFyZ2V0KCkuZXF1YWxzKGFsaWduVG9QYXJ0KSkgewotCQkJCQkJCQkJY29ubmVjdGVkID0gdHJ1ZTsKLQkJCQkJCQkJCXNvdXJjZSA9IHRydWU7Ci0JCQkJCQkJCQlicmVhazsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCWlmIChjb25uZWN0ZWQgJiYgKGFsaWduVG9QYXJ0IGluc3RhbmNlb2YgU2hhcGVOb2RlRWRpdFBhcnQpKSB7Ci0JCQkJCQkJCQlQb2ludCBjZW50ZXJQb2ludCA9IGFsaWduVG9QYXJ0LmdldEZpZ3VyZSgpCi0JCQkJCQkJCQkJCS5nZXRCb3VuZHMoKS5nZXRDZW50ZXIoKTsKLQkJCQkJCQkJCWludCBkZWx0YSA9IGNlbnRlclBvaW50LnggLSB0cC54OwotCQkJCQkJCWVuZFBvaW50LnggKz0gZGVsdGE7Ci0JCQkJCQkJCQlSZWNvbm5lY3RMaW5rQ29tbWFuZCBjID0gbmV3IFJlY29ubmVjdExpbmtDb21tYW5kKHRyYW5zYWN0aW9uRG9tYWluLAotCQkJCQkJCQkJKEVkZ2UpIGxwLmdldE1vZGVsKCksIChOb2RlKSBlcC5nZXRNb2RlbCgpLAotCQkJCQkJCQkJc291cmNlKTsKLQkJCQkJCQljLnNldEVuZFBvaW50KGVuZFBvaW50KTsKLQkJCQkJCQkJCWdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUoYyk7Ci0JCQkJCQl9Ci0KLQkJCQkJfQotCQkJCX0KLQkJCQkvLyBJZiBmaXJzdCBzZWxlY3RlZCBlZGl0IHBhcnQgaXMgc3luY2Jhcm5vZGVlZGl0cGFydCwgbmVlZCB0bwotCQkJCS8vIGhhbmRsZSBkaWZmZXJlbnRseQotCQkJCWlmIChlcCAhPSBhbGlnblRvUGFydAotCQkJCQkJJiYgIShEaWFncmFtQ29yZVV0aWwuaXNTeW5jQmFyKGFsaWduVG9QYXJ0KSkpIHsKLQotCQkJCQlQb2ludCBzcCA9IGFsaWduVG9QYXJ0LmdldEZpZ3VyZSgpLmdldEJvdW5kcygpCi0JCQkJCQkJLmdldENlbnRlcigpOwotCQkJCQlib29sZWFuIGNvbm5lY3RlZCA9IGZhbHNlOwotCQkJCQkvLyBjaGVjayBpZiB0aGUgcGFydCBpcyBjb25uZWN0ZWQgdmlhIHNvdXJjZSBjb25uZWN0aW9ucwotCQkJCQlMaXN0IGxpc3QgPSAoKFNoYXBlTm9kZUVkaXRQYXJ0KSBhbGlnblRvUGFydCkKLQkJCQkJCQkuZ2V0U291cmNlQ29ubmVjdGlvbnMoKTsKLQkJCQkJZm9yIChJdGVyYXRvciBpdG9yID0gbGlzdC5pdGVyYXRvcigpOyBpdG9yLmhhc05leHQoKTspIHsKLQkJCQkJCUNvbm5lY3Rpb25Ob2RlRWRpdFBhcnQgbHAgPSAoQ29ubmVjdGlvbk5vZGVFZGl0UGFydCkgaXRvci5uZXh0KCk7Ci0JCQkJCQlpZiAobHAuZ2V0VGFyZ2V0KCkuZXF1YWxzKGVwKSkgewotCQkJCQkJCWNvbm5lY3RlZCA9IHRydWU7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJLy8gaWYgbm90IGZvdW5kIGFib3ZlLCBjaGVjayBpZiBpdCBpcyBjb25uZWN0ZWQgdmlhIHRhcmdldCBjb25uZWN0aW9ucwotCQkJCQlpZiAoIWNvbm5lY3RlZCkgewotCQkJCQkJbGlzdCA9ICgoU2hhcGVOb2RlRWRpdFBhcnQpIGFsaWduVG9QYXJ0KQotCQkJCQkJCQkuZ2V0VGFyZ2V0Q29ubmVjdGlvbnMoKTsKLQkJCQkJCWZvciAoSXRlcmF0b3IgaXRvciA9IGxpc3QuaXRlcmF0b3IoKTsgaXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJQ29ubmVjdGlvbk5vZGVFZGl0UGFydCBscCA9IChDb25uZWN0aW9uTm9kZUVkaXRQYXJ0KSBpdG9yLm5leHQoKTsKLQkJCQkJCQlpZiAobHAuZ2V0U291cmNlKCkuZXF1YWxzKGVwKSkgewotCQkJCQkJCQljb25uZWN0ZWQgPSB0cnVlOwotCQkJCQkJCQlicmVhazsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJaWYgKERpYWdyYW1Db3JlVXRpbC5pc1N5bmNCYXIoZXApKSB7Ci0JCQkJCQlQb2ludCBwID0gbmV3IFBvaW50KCk7Ci0JCQkJCQlwLnggPSAoKEludGVnZXIpIFZpZXdVdGlsLmdldFN0cnVjdHVyYWxGZWF0dXJlVmFsdWUoKFZpZXcpZXAuZ2V0TW9kZWwoKSwKLQkJCQkJCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRMb2NhdGlvbl9YKCkpKS5pbnRWYWx1ZSgpOwotCQkJCQkJcC55ID0gKChJbnRlZ2VyKSBWaWV3VXRpbC5nZXRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlKChWaWV3KWVwLmdldE1vZGVsKCksCi0JCQkJCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TG9jYXRpb25fWSgpKSkuaW50VmFsdWUoKTsKLQkJCQkJCVBvaW50IHRwID0gcC5nZXRDb3B5KCk7Ci0JCQkJCQlQb2ludCBhbGlnblRvQ2VudGVyID0gYWxpZ25Ub1BhcnQuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCkuZ2V0Q2VudGVyKCk7Ci0JCQkJCQlQb2ludCBjZW50ZXJQb2ludCA9IGVwLmdldEZpZ3VyZSgpLmdldEJvdW5kcygpLmdldENlbnRlcigpOwotCQkJCQkJaW50IGRlbHRhID0gYWxpZ25Ub0NlbnRlci54IC0gY2VudGVyUG9pbnQueDsKLQkJCQkJCXRwLnggPSB0cC54ICsgZGVsdGE7Ci0JCQkJCQlvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZCBjID0gbmV3IENoYW5nZUJvdW5kc0NvbW1hbmQodHJhbnNhY3Rpb25Eb21haW4sCi0JCQkJCQkJCShOb2RlKSBlcC5nZXRNb2RlbCgpLCB0cCwgZXAuZ2V0RmlndXJlKCkKLQkJCQkJCQkJCQkuZ2V0Qm91bmRzKCkud2lkdGgsIC0xKTsKLQkJCQkJCWdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUoYyk7Ci0JCQkJCQllcC5nZXRGaWd1cmUoKS5zZXRMb2NhdGlvbihuZXcgUG9pbnQodHAueCwgdHAueSkpOwotCQkJCQl9IGVsc2UgaWYgKGVwIGluc3RhbmNlb2YgU2hhcGVOb2RlRWRpdFBhcnQpIHsKLQkJCQkJCVBvaW50IHAgPSBuZXcgUG9pbnQoKTsKLQkJCQkJCXAueCA9ICgoSW50ZWdlcikgVmlld1V0aWwuZ2V0U3RydWN0dXJhbEZlYXR1cmVWYWx1ZSgoVmlldyllcC5nZXRNb2RlbCgpLAotCQkJCQkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldExvY2F0aW9uX1goKSkpLmludFZhbHVlKCk7Ci0JCQkJCQlwLnkgPSAoKEludGVnZXIpIFZpZXdVdGlsLmdldFN0cnVjdHVyYWxGZWF0dXJlVmFsdWUoKFZpZXcpZXAuZ2V0TW9kZWwoKSwKLQkJCQkJCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRMb2NhdGlvbl9ZKCkpKS5pbnRWYWx1ZSgpOwotCQkJCQkJUG9pbnQgdHAgPSBwLmdldENvcHkoKTsKLQkJCQkJCVBvaW50IGNlbnRlclBvaW50ID0gZXAuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCkKLQkJCQkJCQkJLmdldENlbnRlcigpOwotCQkJCQkJaW50IGRlbHRhID0gc3AueCAtIGNlbnRlclBvaW50Lng7Ci0JCQkJCQl0cC54ID0gdHAueCArIGRlbHRhOwotCQkJCQkJb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQgYyA9IG5ldyBDaGFuZ2VCb3VuZHNDb21tYW5kKHRyYW5zYWN0aW9uRG9tYWluLAotCQkJCQkJCQkoTm9kZSkgZXAuZ2V0TW9kZWwoKSwgdHAsIGVwLmdldEZpZ3VyZSgpCi0JCQkJCQkJCQkJLmdldEJvdW5kcygpLndpZHRoLCAtMSk7Ci0JCQkJCQlnZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKGMpOwotCQkJCQkJZXAuZ2V0RmlndXJlKCkuc2V0TG9jYXRpb24obmV3IFBvaW50KHRwLngsIHRwLnkpKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCBjcmVhdGVBbGlnbk1lbnUoSU1lbnVNYW5hZ2VyIG1lbnUsIGJvb2xlYW4gY2FuTW9kaWZ5KSB7Ci0JCS8vIGNyZWF0ZSBhIG5ldyBtZW51IG1hbmFnZXIgZm9yIHRoZSBjYXNjYWRpbmcgbWVudQotCQkKLQkJSUNvbnRyaWJ1dGlvbkl0ZW0gZm9ybWF0TWVudSA9IG1lbnUuZmluZChBY3Rpb25JZHMuTUVOVV9GT1JNQVQpOwotCQkKLQkJTWVudU1hbmFnZXIgYWxpZ25NZW51TWFuYWdlciA9IG51bGw7Ci0JCWlmIChhbGlnbk1lbnVNYW5hZ2VyID09IG51bGwpIHsKLQkJCWFsaWduTWVudU1hbmFnZXIgPSBuZXcgTWVudU1hbmFnZXIoCi0JCQkJCURpYWdyYW1Db3JlUmVzb3VyY2VzLkFic3RyYWN0RGlhZ3JhbUVkaXRvcl9hbGlnbk1lbnVfdGV4dCkgeyAvLyROT04tTkxTLTEkCi0KLQkJCQlwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWQoKSB7Ci0JCQkJCWludCB0b3RhbCA9IDA7Ci0JCQkJCS8vIGVuYWJsZSB0aGUgbWVudSBvbmx5IGlmIDIgb3IgbW9yZSBub2RlcyBvciBub2RlCi0JCQkJCS8vIGNvbnRhaW5lcnMKLQkJCQkJLy8gYXJlIHNlbGVjdGVkCi0JCQkJCUxpc3QgZWRpdFBhcnRzID0gZ3JhcGhpY2FsVmlld2VyLmdldFNlbGVjdGVkRWRpdFBhcnRzKCk7Ci0JCQkJCS8vIG5lZWQgYXQgbGVhc3QgdHdvIHRoaW5ncyBzZWxlY3RlZCB0byBhbGlnbgotCQkJCQlpZiAoZWRpdFBhcnRzLnNpemUoKSA+IDEpIHsKLQkJCQkJCWZvciAoaW50IGEgPSAwOyBhIDwgZWRpdFBhcnRzLnNpemUoKTsgYSsrKSB7Ci0JCQkJCQkJRWRpdFBhcnQgZWRpdFBhcnQgPSAoRWRpdFBhcnQpIGVkaXRQYXJ0cy5nZXQoYSk7Ci0JCQkJCQkJLy8gd2UgY2FuIGFsaWduIG5vZGVzIGFuZCBjb250YWluZXJzCi0JCQkJCQkJaWYgKGVkaXRQYXJ0IGluc3RhbmNlb2YgU2hhcGVOb2RlRWRpdFBhcnQpIHsKLQkJCQkJCQkJLy8gYWRkIHVwIHRoZSBlbGVtZW50cyB3ZSBuZWVkLCB0aGVyZSBtYXkgYmUKLQkJCQkJCQkJLy8gbW9yZQotCQkJCQkJCQkvLyBlbGVtZW50cyBzZWxlY3RlZCAobGlua3MsIGV0Yy4pCi0JCQkJCQkJCXRvdGFsKys7Ci0JCQkJCQkJCWlmICh0b3RhbCA+IDEpIHsKLQkJCQkJCQkJCS8vIHdlIG9ubHkgbmVlZCB0byBrbm93IHRoZXJlIGlzIG1vcmUgdGhhbgotCQkJCQkJCQkJLy8gMSwgc28KLQkJCQkJCQkJCS8vIHdlIGNhbiBzdG9wIGhlcmUKLQkJCQkJCQkJCWJyZWFrOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCXJldHVybiB0b3RhbCA+IDE7Ci0JCQkJfQotCQkJfTsKLQkJfQotCQlpZiAoZm9ybWF0TWVudSAhPSBudWxsICYmIGZvcm1hdE1lbnUgaW5zdGFuY2VvZiBJTWVudU1hbmFnZXIgCi0JCQkJJiYgYWxpZ25NZW51TWFuYWdlci5pc0VuYWJsZWQoKSAmJiBjYW5Nb2RpZnkpIHsKLQkJCUlDb250cmlidXRpb25JdGVtIGl0ZW0gPSAgKChJTWVudU1hbmFnZXIpZm9ybWF0TWVudSkuZmluZChBY3Rpb25JZHMuTUVOVV9BTElHTik7Ci0JCQlpZihpdGVtICE9IG51bGwgJiYgaXRlbSBpbnN0YW5jZW9mIElNZW51TWFuYWdlcil7Ci0JCQkJSU1lbnVNYW5hZ2VyIGFsaWduTWVudSA9IChJTWVudU1hbmFnZXIpaXRlbTsKLQkJCQlhbGlnbk1lbnUuYWRkKGdldEFjdGlvblJlZ2lzdHJ5KCkuZ2V0QWN0aW9uKAotCQkJCQkJRGlhZ3JhbUFjdGlvbnNTZXJ2aWNlLkFMSUdOX0hPUlpfQVZFUkFHRSkpOwotCQkJCWFsaWduTWVudS5hZGQoZ2V0QWN0aW9uUmVnaXN0cnkoKS5nZXRBY3Rpb24oCi0JCQkJCQlEaWFncmFtQWN0aW9uc1NlcnZpY2UuQUxJR05fSE9SWl9GSVJTVF9TRUxFQ1RFRCkpOwotCQkJCWFsaWduTWVudS5hZGQoZ2V0QWN0aW9uUmVnaXN0cnkoKS5nZXRBY3Rpb24oCi0JCQkJCQlEaWFncmFtQWN0aW9uc1NlcnZpY2UuQUxJR05fVkVSVF9BVkVSQUdFKSk7Ci0JCQkJYWxpZ25NZW51LmFkZChnZXRBY3Rpb25SZWdpc3RyeSgpLmdldEFjdGlvbigKLQkJCQkJCURpYWdyYW1BY3Rpb25zU2VydmljZS5BTElHTl9WRVJUX0ZJUlNUX1NFTEVDVEVEKSk7Ci0JCQl9Ci0JCX1lbHNlewotCQkJYWxpZ25NZW51TWFuYWdlci5hZGQoZ2V0QWN0aW9uUmVnaXN0cnkoKS5nZXRBY3Rpb24oCi0JCQkJCURpYWdyYW1BY3Rpb25zU2VydmljZS5BTElHTl9IT1JaX0FWRVJBR0UpKTsKLQkJCWFsaWduTWVudU1hbmFnZXIuYWRkKGdldEFjdGlvblJlZ2lzdHJ5KCkuZ2V0QWN0aW9uKAotCQkJCQlEaWFncmFtQWN0aW9uc1NlcnZpY2UuQUxJR05fSE9SWl9GSVJTVF9TRUxFQ1RFRCkpOwotCQkJYWxpZ25NZW51TWFuYWdlci5hZGQoZ2V0QWN0aW9uUmVnaXN0cnkoKS5nZXRBY3Rpb24oCi0JCQkJCURpYWdyYW1BY3Rpb25zU2VydmljZS5BTElHTl9WRVJUX0FWRVJBR0UpKTsKLQkJCWFsaWduTWVudU1hbmFnZXIuYWRkKGdldEFjdGlvblJlZ2lzdHJ5KCkuZ2V0QWN0aW9uKAotCQkJCQlEaWFncmFtQWN0aW9uc1NlcnZpY2UuQUxJR05fVkVSVF9GSVJTVF9TRUxFQ1RFRCkpOwotCQkJaWYgKGFsaWduTWVudU1hbmFnZXIuaXNFbmFibGVkKCkgJiYgY2FuTW9kaWZ5KSB7Ci0JCQkJbWVudS5hcHBlbmRUb0dyb3VwKEdFRkFjdGlvbkNvbnN0YW50cy5NQl9BRERJVElPTlMsCi0JCQkJCQkJCW5ldyBTZXBhcmF0b3IoKSk7Ci0JCQkJbWVudS5hcHBlbmRUb0dyb3VwKEdFRkFjdGlvbkNvbnN0YW50cy5NQl9BRERJVElPTlMsIGFsaWduTWVudU1hbmFnZXIpOwotCQkJCW1lbnUuYXBwZW5kVG9Hcm91cChHRUZBY3Rpb25Db25zdGFudHMuTUJfQURESVRJT05TLAotCQkJCQkJCQluZXcgU2VwYXJhdG9yKCkpOwotCQkJfQotCQl9Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vY29yZS9hY3Rpb25zL0VkaXRvckFjdGlvbkRlbGVnYXRlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9jb3JlL2FjdGlvbnMvRWRpdG9yQWN0aW9uRGVsZWdhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWFmOTk3NS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9jb3JlL2FjdGlvbnMvRWRpdG9yQWN0aW9uRGVsZWdhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5JRWRpdGluZ0RvbWFpblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5UcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLmJyaWRnZS5CcmlkZ2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5icmlkZ2UuRGlhZ3JhbUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5wYXJ0LkFic3RyYWN0RGlhZ3JhbUVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuQWN0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkRpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvckFjdGlvbkRlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotCi1wdWJsaWMgY2xhc3MgRWRpdG9yQWN0aW9uRGVsZWdhdGUgaW1wbGVtZW50cyBJRWRpdG9yQWN0aW9uRGVsZWdhdGUgewotCi0JcHJvdGVjdGVkIElFZGl0b3JQYXJ0IHRhcmdldEVkaXRvcjsKLQlwcm90ZWN0ZWQgTGlzdDxFZGl0UGFydD4gc2VsZWN0ZWRQYXJ0cyA9IG5ldyBBcnJheUxpc3Q8RWRpdFBhcnQ+KCk7Ci0KLQkKLQlwdWJsaWMgRWRpdG9yQWN0aW9uRGVsZWdhdGUoKSB7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0QWN0aXZlRWRpdG9yKElBY3Rpb24gYWN0aW9uLCBJRWRpdG9yUGFydCB0YXJnZXRFZGl0b3IpIHsKLQkJdGhpcy50YXJnZXRFZGl0b3IgPSB0YXJnZXRFZGl0b3I7Ci0JfQotCi0JcHVibGljIHZvaWQgcnVuKElBY3Rpb24gYWN0aW9uKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQotCX0KLQotCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoSUFjdGlvbiBhY3Rpb24sIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCXNlbGVjdGVkUGFydHMuY2xlYXIoKTsKLQkJaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7Ci0JCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzdHJ1Y3R1cmVkU2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb247Ci0JCQlpZiAoc3RydWN0dXJlZFNlbGVjdGlvbi5zaXplKCkgPjAKLQkJCQkJJiYgc3RydWN0dXJlZFNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKSBpbnN0YW5jZW9mIElHcmFwaGljYWxFZGl0UGFydCkgewotCQkJCXNlbGVjdGVkUGFydHMuYWRkQWxsKHN0cnVjdHVyZWRTZWxlY3Rpb24udG9MaXN0KCkpOwotCQkJfQotCQl9Ci0JfQotCQotCXByb3RlY3RlZCBBY3Rpb25NYW5hZ2VyIGdldEFjdGlvbk1hbmFnZXIoKXsKLQkJaWYodGFyZ2V0RWRpdG9yICE9IG51bGwgJiYgdGFyZ2V0RWRpdG9yIGluc3RhbmNlb2YgQWJzdHJhY3REaWFncmFtRWRpdG9yKXsKLQkJCURpYWdyYW0gZGlhZ3JhbSA9ICgoQWJzdHJhY3REaWFncmFtRWRpdG9yKXRhcmdldEVkaXRvcikuZ2V0RGlhZ3JhbSgpOwotCQkJaWYoZGlhZ3JhbSAhPSBudWxsKXsKLQkJCQlEaWFncmFtQWRhcHRlciBhZGFwdGVyID0gQnJpZGdlSGVscGVyLmdldERpYWdyYW1BZGFwdGVyKGRpYWdyYW0uZ2V0RWxlbWVudCgpKTsKLQkJCQlpZihhZGFwdGVyICE9IG51bGwpewotCQkJCQlyZXR1cm4gKEFjdGlvbk1hbmFnZXIpYWRhcHRlci5nZXRBY3Rpb25NYW5hZ2VyKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkgLyoqCi0gICAgICogR2V0cyBlZGl0aW5nIGRvbWFpbgotICAgICAqIAotICAgICAqIEByZXR1cm4gbXkgZWRpdGluZyBkb21haW4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gZ2V0RWRpdGluZ0RvbWFpbigpIHsKLSAgICAgICAgCi0gICAgICAgIC8vIHRyeSBhZGFwdGluZyB0aGUgd29ya2JlbmNoIHBhcnQKLSAgICAgICAgSUVkaXRvclBhcnQgcGFydCA9IHRhcmdldEVkaXRvcjsKLQotICAgICAgICBpZiAocGFydCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBJRWRpdGluZ0RvbWFpblByb3ZpZGVyIGVkUHJvdmlkZXIgPSAoSUVkaXRpbmdEb21haW5Qcm92aWRlcikgcGFydAotICAgICAgICAgICAgICAgIC5nZXRBZGFwdGVyKElFZGl0aW5nRG9tYWluUHJvdmlkZXIuY2xhc3MpOwotCi0gICAgICAgICAgICBpZiAoZWRQcm92aWRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAJRWRpdGluZ0RvbWFpbiBkb21haW4gPSBlZFByb3ZpZGVyLmdldEVkaXRpbmdEb21haW4oKTsKLSAgICAgICAgICAgIAkKLSAgICAgICAgICAgIAlpZiAoZG9tYWluIGluc3RhbmNlb2YgVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4pIHsKLSAgICAgICAgICAgIAkJcmV0dXJuIChUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbikgZG9tYWluOwotICAgICAgICAgICAgCX0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9jb3JlL2FjdGlvbnMvUmVmcmVzaEFjdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vY29yZS9hY3Rpb25zL1JlZnJlc2hBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzAxYmI4MC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9jb3JlL2FjdGlvbnMvUmVmcmVzaEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8qKgotICogCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5wYXJ0LkFic3RyYWN0RGlhZ3JhbUVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnBhcnRzLklEaWFncmFtV29ya2JlbmNoUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSU9iamVjdEFjdGlvbkRlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotCi0vKioKLSAqIFJlZnJlc2ggYWN0aW9uIHJlZnJlc2hlcyB0aGUgRGlhZ3JhbUVkaXRQYXJ0LCBwZXJmb3JtcyBkZWFjdGl2YXRlIGFuZCBhY3RpdmF0ZS4gCi0gKiAKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqLwotcHVibGljIGNsYXNzIFJlZnJlc2hBY3Rpb24gaW1wbGVtZW50cyBJT2JqZWN0QWN0aW9uRGVsZWdhdGUgewotCXByaXZhdGUgSURpYWdyYW1Xb3JrYmVuY2hQYXJ0IGFjdGl2ZVBhcnQ7Ci0KLQlwdWJsaWMgUmVmcmVzaEFjdGlvbigpIHsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JT2JqZWN0QWN0aW9uRGVsZWdhdGUjc2V0QWN0aXZlUGFydChvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiwgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQpCi0JICovCi0JcHVibGljIHZvaWQgc2V0QWN0aXZlUGFydChJQWN0aW9uIGFjdGlvbiwgSVdvcmtiZW5jaFBhcnQgdGFyZ2V0UGFydCkgewotCQlpZih0YXJnZXRQYXJ0IGluc3RhbmNlb2YgSURpYWdyYW1Xb3JrYmVuY2hQYXJ0KSB7Ci0JCQlhY3RpdmVQYXJ0ID0gKChJRGlhZ3JhbVdvcmtiZW5jaFBhcnQpdGFyZ2V0UGFydCk7Ci0JCX0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JQWN0aW9uRGVsZWdhdGUjcnVuKG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bihJQWN0aW9uIGFjdGlvbikgewotCQlpZihhY3RpdmVQYXJ0ICE9IG51bGwpIHsKLQkJCWlmKGFjdGl2ZVBhcnQgaW5zdGFuY2VvZiBBYnN0cmFjdERpYWdyYW1FZGl0b3IpIHsKLQkJCQlBYnN0cmFjdERpYWdyYW1FZGl0b3IgZWRpdG9yID0gKChBYnN0cmFjdERpYWdyYW1FZGl0b3IpYWN0aXZlUGFydCk7IAotCQkJCWVkaXRvci5yZWZyZXNoKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JQWN0aW9uRGVsZWdhdGUjc2VsZWN0aW9uQ2hhbmdlZChvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiwgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoSUFjdGlvbiBhY3Rpb24sIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9jb3JlL2FjdGlvbnMvUmVmcmVzaEZyb21CYXNlQWN0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9jb3JlL2FjdGlvbnMvUmVmcmVzaEZyb21CYXNlQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiNWI2ZDQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vY29yZS9hY3Rpb25zL1JlZnJlc2hGcm9tQmFzZUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQ5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vKioKLSAqIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuYWN0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FTW9kZWxFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvcHlDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi51dGlsLlRyYW5zYWN0aW9uVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLkRpYWdyYW1Db3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuRGlhZ3JhbUNvcmVSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5icmlkZ2UuQnJpZGdlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuYnJpZGdlLkRpYWdyYW1BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUucGFydC5BYnN0cmFjdERpYWdyYW1FZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5wYXJ0LnV0aWwuRGlhZ3JhbUVkaXRvclV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5zZXJ2aWNlcy5EaWFncmFtSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuc2VydmljZXMuRGlhZ3JhbVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5Ob2RlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC51dGlsLlR4VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuSURpYWdyYW1NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuR3JhcGhpY2FsVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLkRpYWdyYW1FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnNlcnZpY2VzLmVkaXRwYXJ0LkVkaXRQYXJ0U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5EaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkVkZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklPYmplY3RBY3Rpb25EZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eUVkZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuQWN0aXZpdHlOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLk9iamVjdE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTsKLQotLyoqCi0gKiBBY3Rpb24gdG8gcmVmcmVzaCB0aGUgbGF0ZXN0IGNoYW5nZXMgZnJvbSBiYXNlIGFjdGl2aXR5IGRpYWdyYW0gaW50byAKLSAqIGV4dGVuZCdzIEFjdGl2aXR5IGRpYWdyYW0uIEFjdGlvbiB3aWxsIGtlZXAgdGhlIGV4aXN0aW5nIGltbWVkaWF0ZSBjaGlsZHJlbidzIAotICogaW5mb3JtYXRpb24gb2YgZXh0ZW5kIGRpYWdyYW0sIG9ubHkgcmVmcmVzaCB0aGUgYmFzZSBkaWFncmFtJ3MgcmVsYXRlZCBpbmZvcm1hdGlvbi4gCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqLwotcHVibGljIGNsYXNzIFJlZnJlc2hGcm9tQmFzZUFjdGlvbiBpbXBsZW1lbnRzIElPYmplY3RBY3Rpb25EZWxlZ2F0ZSB7Ci0KLQlwcml2YXRlIEVkaXRQYXJ0IGVkaXRQYXJ0OwotCXByaXZhdGUgSVdvcmtiZW5jaFBhcnQgdGFyZ2V0UGFydDsKLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgUmVmcmVzaEZyb21CYXNlQWN0aW9uKCkgewotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklPYmplY3RBY3Rpb25EZWxlZ2F0ZSNzZXRBY3RpdmVQYXJ0KG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uLCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBY3RpdmVQYXJ0KElBY3Rpb24gYWN0aW9uLCBJV29ya2JlbmNoUGFydCB0YXJnZXRQYXJ0KSB7Ci0JCXRoaXMudGFyZ2V0UGFydCA9IHRhcmdldFBhcnQ7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkRlbGVnYXRlI3J1bihvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBydW4oSUFjdGlvbiBhY3Rpb24pIHsKLQkJcmVmcmVzaEZyb21CYXNlQ29tbWFuZC5leGVjdXRlKCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkRlbGVnYXRlI3NlbGVjdGlvbkNoYW5nZWQob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24sIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElBY3Rpb24gYWN0aW9uLCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQllZGl0UGFydCA9IG51bGw7Ci0JCWlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgewotCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc3RydWN0dXJlZFNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uOwotCQkJaWYgKHN0cnVjdHVyZWRTZWxlY3Rpb24uc2l6ZSgpID09IDEKLQkJCQkJJiYgc3RydWN0dXJlZFNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKSBpbnN0YW5jZW9mIEVkaXRQYXJ0KSB7Ci0JCQkJZWRpdFBhcnQgPSAoRWRpdFBhcnQpIHN0cnVjdHVyZWRTZWxlY3Rpb24KLQkJCQkJCS5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCX0KLQkJfQotCQlpZihlZGl0UGFydCAhPSBudWxsKXsKLQkJCWFjdGlvbi5zZXRDaGVja2VkKGZhbHNlKTsKLQkJCS8vIENoZWNrIGlmIGRpYWdyYW0gcmVhZG9ubHkuCi0JCQlpZihlZGl0UGFydCBpbnN0YW5jZW9mIERpYWdyYW1FZGl0UGFydCl7Ci0JCQkJaWYoISgoRGlhZ3JhbUVkaXRQYXJ0KWVkaXRQYXJ0KS5pc0VkaXRNb2RlRW5hYmxlZCgpKXsKLQkJCQkJYWN0aW9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJfQotCi0JCQkvLyBDaGVja2VkIHZhcmlhYmlsaXR5IAotCQkJRGlhZ3JhbSBkaWFncmFtID0gKERpYWdyYW0pZWRpdFBhcnQuZ2V0TW9kZWwoKTsKLQkJCUVPYmplY3QgbW9kZWwgPSBkaWFncmFtLmdldEVsZW1lbnQoKTsKLQkJCUFjdGl2aXR5IGUgPSBudWxsOwotCQkJaWYobW9kZWwgaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eSl7Ci0JCQkJZSA9IChBY3Rpdml0eSlCcmlkZ2VIZWxwZXIuZ2V0TWV0aG9kRWxlbWVudCgoRU1vZGVsRWxlbWVudCltb2RlbCk7Ci0JCQl9ZWxzZSBpZihtb2RlbCBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkRpYWdyYW0pewotCQkJCWUgPSAoQWN0aXZpdHkpKChvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5EaWFncmFtKW1vZGVsKS5nZXRMaW5rZWRFbGVtZW50KCk7Ci0JCQl9Ci0JCQlpZihlICE9IG51bGwpewotCQkJCWlmKGUgaW5zdGFuY2VvZiBBY3Rpdml0eSl7Ci0JCQkJCWlmKCgoQWN0aXZpdHkpZSkuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpID09IG51bGwKLQkJCQkJCQl8fCAoKChBY3Rpdml0eSllKS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkgIT0gbnVsbAotCQkJCQkJCSYmICgoQWN0aXZpdHkpZSkuZ2V0VmFyaWFiaWxpdHlUeXBlKCkgIT0gVmFyaWFiaWxpdHlUeXBlLkVYVEVORFMpKXsKLQkJCQkJCWFjdGlvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCX0KLQotCQkJfQotCQl9ZWxzZXsKLQkJCWFjdGlvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBSZWZyZXNoIGJhc2UgZnJvbSBwcmV2aW91cyBncmFwaGljYWwgZWRpdG9yIGNvZGUuCi0JICogVE9ETzogaGFuZGxlIGNvbnN1bWVyIChzZXQpCi0JICogCi0JICovCi0JcHJpdmF0ZSBDb21tYW5kIHJlZnJlc2hGcm9tQmFzZUNvbW1hbmQgPSBuZXcgQ29tbWFuZChEaWFncmFtQ29yZVJlc291cmNlcy5BYnN0cmFjdERpYWdyYW1FZGl0b3JyZWZyZXNoZnJvbWJhc2UpIHsgLy8kTk9OLU5MUy0xJAotCQlwcml2YXRlIEFycmF5TGlzdCBvbGRDb250ZW50ID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCQlEaWFncmFtIGRpYWdyYW0gPSAoRGlhZ3JhbSkgZWRpdFBhcnQuZ2V0TW9kZWwoKTsKLQkJCQotCQkJRWRpdFBhcnQgcGFyZW50ID0gZWRpdFBhcnQuZ2V0UGFyZW50KCk7Ci0JCQkvLyBiYWNrIHVwIG9sZCBkaWFncmFtIGNvbnRlbnQKLQkJCS8vCi0JCQlvbGRDb250ZW50LmNsZWFyKCk7Ci0JCQlvbGRDb250ZW50LmFkZEFsbChkaWFncmFtLmdldFBlcnNpc3RlZENoaWxkcmVuKCkpOwotCi0JCQlib29sZWFuIHJlZnJlc2hlZCA9IC8vRGlhZ3JhbUhlbHBlci5yZWZyZXNoRnJvbUJhc2UoZGlhZ3JhbSk7Ci0JCQkJcmVmcmVzaEZyb21CYXNlKGRpYWdyYW0pOwotCQkJaWYoIXJlZnJlc2hlZCkgcmV0dXJuOwotCQkJCi0JCQlpZiAoZWRpdFBhcnQuaXNBY3RpdmUoKSkgewotCQkJCWVkaXRQYXJ0LmRlYWN0aXZhdGUoKTsKLQkJCX0KLQkJCS8vZGlhZ3JhbS5yZW1vdmVDb25zdW1lcih0aGlzKTsKLQkJCS8vY3JlYXRlRWRpdFBhcnQoKTsKLQkJCWVkaXRQYXJ0ID0gKEVkaXRQYXJ0KUVkaXRQYXJ0U2VydmljZS5nZXRJbnN0YW5jZSgpLmNyZWF0ZUdyYXBoaWNFZGl0UGFydChkaWFncmFtKTsKLQkJCWVkaXRQYXJ0LnNldFBhcmVudChwYXJlbnQpOwotCQkJcGFyZW50LmdldFZpZXdlcigpLnNldENvbnRlbnRzKGVkaXRQYXJ0KTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHVuZG8oKSB7Ci0JCQlEaWFncmFtIGRpYWdyYW0gPSAoRGlhZ3JhbSkgZWRpdFBhcnQuZ2V0TW9kZWwoKTsKLQkJCWRpYWdyYW0uZ2V0Q2hpbGRyZW4oKS5jbGVhcigpOwotCQkJZGlhZ3JhbS5nZXRDaGlsZHJlbigpLmFkZEFsbChvbGRDb250ZW50KTsKLQkJCWlmIChlZGl0UGFydC5pc0FjdGl2ZSgpKSB7Ci0JCQkJZWRpdFBhcnQuZGVhY3RpdmF0ZSgpOwotCQkJfQotCQkJLy9kaWFncmFtLnJlbW92ZUNvbnN1bWVyKHRoaXMpOwotCQkJZWRpdFBhcnQgPSAoRWRpdFBhcnQpRWRpdFBhcnRTZXJ2aWNlLmdldEluc3RhbmNlKCkuY3JlYXRlR3JhcGhpY0VkaXRQYXJ0KGRpYWdyYW0pOwotCQkJZ2V0R3JhcGhpY2FsVmlld2VyKCkuc2V0Q29udGVudHMoZWRpdFBhcnQpOwotCQkJZWRpdFBhcnQuYWN0aXZhdGUoKTsKLQkJfQotCX07Ci0JCi0JcHJpdmF0ZSBHcmFwaGljYWxWaWV3ZXIgZ2V0R3JhcGhpY2FsVmlld2VyKCl7Ci0JCXJldHVybiAoR3JhcGhpY2FsVmlld2VyKWVkaXRQYXJ0LmdldFJvb3QoKS5nZXRWaWV3ZXIoKTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gcmVmcmVzaEZyb21CYXNlKGZpbmFsIERpYWdyYW0gZGlhZ3JhbSkgewotCQlmaW5hbCBib29sZWFuW10gcmVzdWx0SG9sZGVyID0gbmV3IGJvb2xlYW5bMV07Ci0JCXRyeSB7Ci0JCQlUeFV0aWwucnVuSW5UcmFuc2FjdGlvbihkaWFncmFtLCBuZXcgUnVubmFibGUoKSB7Ci0KLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCXJlc3VsdEhvbGRlclswXSA9IGRvUmVmcmVzaEZyb21CYXNlKGRpYWdyYW0pOwotCQkJCX0KLQkJCQkKLQkJCX0pOwkJCQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJRGlhZ3JhbUNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQl9Ci0JCXJldHVybiByZXN1bHRIb2xkZXJbMF07Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIHJlZnJlc2hGcm9tQmFzZShmaW5hbCBEaWFncmFtIGRpYWdyYW0sIGZpbmFsIEFjdGl2aXR5IGFjdGl2aXR5KSB7Ci0JCWZpbmFsIGJvb2xlYW5bXSByZXN1bHRIb2xkZXIgPSBuZXcgYm9vbGVhblsxXTsKLQkJdHJ5IHsKLQkJCVR4VXRpbC5ydW5JblRyYW5zYWN0aW9uKGRpYWdyYW0sIG5ldyBSdW5uYWJsZSgpIHsKLQotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJcmVzdWx0SG9sZGVyWzBdID0gZG9SZWZyZXNoRnJvbUJhc2UoZGlhZ3JhbSwgYWN0aXZpdHkpOwotCQkJCX0KLQkJCQkKLQkJCX0pOwkJCQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJRGlhZ3JhbUNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQl9Ci0JCXJldHVybiByZXN1bHRIb2xkZXJbMF07Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgaW50ZXJmYWNlIElEaWFncmFtQXNzb2NpYXRpb25IZWxwZXIgewotCQkvKioKLQkJICogR2V0cyB0aGUge0BsaW5rIE1ldGhvZEVsZW1lbnR9IHRoYXQgdGhlIGdpdmVuIHtAbGluayBOb2RlfSByZXByZXNlbnRzLgotCQkgKiAKLQkJICogQHBhcmFtIG5vZGUKLQkJICogQHBhcmFtIHJlc291cmNlU2V0IHRoZSByZXNvdXJjZSBzZXQgb2YgdGhlIGxpYnJhcnkKLQkJICogQHJldHVybgotCQkgKi8KLQkJTWV0aG9kRWxlbWVudCBnZXRNZXRob2RFbGVtZW50KE5vZGUgbm9kZSwgUmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQpOwotCQkKLQkJLyoqCi0JCSAqIEZpbmRzIGluIHRoZSBnaXZlbiBkaWFncmFtIHRoZSBub2RlIHRoYXQgcmVwcmVzZW50cyB0aGUgZ2l2ZW4ge0BsaW5rIE1ldGhvZEVsZW1lbnR9LgotCQkgKiAgCi0JCSAqIEBwYXJhbSBkaWFncmFtCi0JCSAqIEBwYXJhbSBlCi0JCSAqIEByZXR1cm4KLQkJICovCi0JCU5vZGUgZmluZE5vZGUoRGlhZ3JhbSBkaWFncmFtLCBNZXRob2RFbGVtZW50IGUpOwotCQkJCQotCQkvKioKLQkJICogUmUtYXNzb2NpYXRlcyBhY3Rpdml0eSBub2RlcyBpbiB0aGUgYmFzZSBkaWFncmFtIGNvcHkgd2l0aCBjb3JyZXNwb25kaW5nCi0JCSAqIGxvY2FsbHkgY29udHJpYnV0b3JzIG9yIHJlcGxhY2VycyBpZiB0aGVyZSBpcyBhbnkuCi0JCSAqIAotCQkgKiBAcGFyYW0gYWN0aXZpdHkKLQkJICogQHBhcmFtIGNvcHlPZkJhc2VEaWFncmFtCi0JCSAqLwotCQl2b2lkIHJlYXNzb2NpYXRlKEFjdGl2aXR5IGFjdGl2aXR5LCBEaWFncmFtIGNvcHlPZkJhc2VEaWFncmFtKTsKLQkJCi0JCXZvaWQgYWRkTm9kZU1vZGVscyhFT2JqZWN0IGRpYWdyYW1Nb2RlbCwgQ29sbGVjdGlvbjw/PiBub2RlTW9kZWxzKTsKLQkJCi0JCXZvaWQgYWRkRWRnZU1vZGVscyhFT2JqZWN0IGRpYWdyYW1Nb2RlbCwgQ29sbGVjdGlvbjw/PiBlZGdlTW9kZWxzKTsKLQkJCi0JCXZvaWQgcmVtb3ZlTm9kZU1vZGVsKEVPYmplY3QgZGlhZ3JhbU1vZGVsLCBFT2JqZWN0IG5vZGVNb2RlbCk7Ci0JCQotCQl2b2lkIHJlbW92ZUVkZ2VNb2RlbChFT2JqZWN0IGRpYWdyYW1Nb2RlbCwgRU9iamVjdCBlZGdlTW9kZWwpOwotCi0JCUNvbGxlY3Rpb248Pz4gZ2V0Tm9kZU1vZGVscyhFT2JqZWN0IGVsZW1lbnQpOwotCi0JCUNvbGxlY3Rpb248Pz4gZ2V0RWRnZU1vZGVscyhFT2JqZWN0IGVsZW1lbnQpOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBJRGlhZ3JhbUFzc29jaWF0aW9uSGVscGVyIEFEQXNzb2NpYXRpb25IZWxwZXIgPSBuZXcgSURpYWdyYW1Bc3NvY2lhdGlvbkhlbHBlcigpIHsKLQotCQlwdWJsaWMgTm9kZSBmaW5kTm9kZShEaWFncmFtIGRpYWdyYW0sIE1ldGhvZEVsZW1lbnQgZSkgewotCQkJcmV0dXJuIERpYWdyYW1IZWxwZXIuZmluZE5vZGUoZGlhZ3JhbSwgZSk7Ci0JCX0KLQotCQlwdWJsaWMgTWV0aG9kRWxlbWVudCBnZXRNZXRob2RFbGVtZW50KE5vZGUgbm9kZSwgUmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQpIHsKLQkJCUVPYmplY3QgdW1sT2JqZWN0ID0gbm9kZS5nZXRFbGVtZW50KCk7Ci0JCQlpZiAodW1sT2JqZWN0IGluc3RhbmNlb2YgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZQotCQkJCQl8fCB1bWxPYmplY3QgaW5zdGFuY2VvZiBPYmplY3ROb2RlKSB7Ci0JCQkJTWV0aG9kRWxlbWVudCBlID0gQnJpZGdlSGVscGVyCi0JCQkJCQkuZ2V0TWV0aG9kRWxlbWVudCgoQWN0aXZpdHlOb2RlKSB1bWxPYmplY3QpOwotCQkJCWlmIChlID09IG51bGwgJiYgcmVzb3VyY2VTZXQgIT0gbnVsbCkgewotCQkJCQkvLyBiYXNlIGRpYWdyYW0gaXMgbm90IG9wZW4sIHRyeSB0byBnZXQgZnJvbQotCQkJCQkvLyBhbm5vdGF0aW9uCi0JCQkJCS8vCi0JCQkJCWUgPSBCcmlkZ2VIZWxwZXIKLQkJCQkJCQkuZ2V0TWV0aG9kRWxlbWVudEZyb21Bbm5vdGF0aW9uKAotCQkJCQkJCQkJKEVNb2RlbEVsZW1lbnQpIHVtbE9iamVjdCwgcmVzb3VyY2VTZXQpOwotCQkJCX0KLQkJCQlyZXR1cm4gZTsKLQkJCX0KLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgcmVhc3NvY2lhdGUoQWN0aXZpdHkgYWN0aXZpdHksIERpYWdyYW0gY29weU9mQmFzZURpYWdyYW0pIHsKLQkJCURpYWdyYW1IZWxwZXIucmVhc3NvY2lhdGUoYWN0aXZpdHksIGNvcHlPZkJhc2VEaWFncmFtKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGFkZEVkZ2VNb2RlbHMoRU9iamVjdCBkaWFncmFtTW9kZWwsIENvbGxlY3Rpb248Pz4gZWRnZU1vZGVscykgewotCQkJaWYoIShkaWFncmFtTW9kZWwgaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eSkpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlEaWFncmFtQWRhcHRlciBkaWFncmFtQWRhcHRlciA9IEJyaWRnZUhlbHBlci5nZXREaWFncmFtQWRhcHRlcihkaWFncmFtTW9kZWwpOwotCQkJYm9vbGVhbiBvbGROb3RpZnkgPSBmYWxzZTsKLQkJCWlmKGRpYWdyYW1BZGFwdGVyICE9IG51bGwpIHsKLQkJCQlvbGROb3RpZnkgPSBkaWFncmFtQWRhcHRlci5pc05vdGlmaWNhdGlvbkVuYWJsZWQoKTsKLQkJCQlkaWFncmFtQWRhcHRlci5zZXROb3RpZmljYXRpb25FbmFibGVkKGZhbHNlKTsKLQkJCX0KLQkJCXRyeSB7Ci0JCQkJKChvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eSkgZGlhZ3JhbU1vZGVsKS5nZXRFZGdlcygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgQWN0aXZpdHlFZGdlPikgZWRnZU1vZGVscyk7Ci0JCQl9Ci0JCQlmaW5hbGx5IHsKLQkJCQlpZihkaWFncmFtQWRhcHRlciAhPSBudWxsKSB7Ci0JCQkJCWRpYWdyYW1BZGFwdGVyLnNldE5vdGlmaWNhdGlvbkVuYWJsZWQob2xkTm90aWZ5KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBhZGROb2RlTW9kZWxzKEVPYmplY3QgZGlhZ3JhbU1vZGVsLCBDb2xsZWN0aW9uPD8+IG5vZGVNb2RlbHMpIHsKLQkJCWlmKCEoZGlhZ3JhbU1vZGVsIGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UudW1sMi51bWwuQWN0aXZpdHkpKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJRGlhZ3JhbUFkYXB0ZXIgZGlhZ3JhbUFkYXB0ZXIgPSBCcmlkZ2VIZWxwZXIuZ2V0RGlhZ3JhbUFkYXB0ZXIoZGlhZ3JhbU1vZGVsKTsKLQkJCWJvb2xlYW4gb2xkTm90aWZ5ID0gZmFsc2U7Ci0JCQlpZihkaWFncmFtQWRhcHRlciAhPSBudWxsKSB7Ci0JCQkJb2xkTm90aWZ5ID0gZGlhZ3JhbUFkYXB0ZXIuaXNOb3RpZmljYXRpb25FbmFibGVkKCk7Ci0JCQkJZGlhZ3JhbUFkYXB0ZXIuc2V0Tm90aWZpY2F0aW9uRW5hYmxlZChmYWxzZSk7Ci0JCQl9Ci0JCQl0cnkgewotCQkJCSgob3JnLmVjbGlwc2UudW1sMi51bWwuQWN0aXZpdHkpIGRpYWdyYW1Nb2RlbCkuZ2V0Tm9kZXMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIEFjdGl2aXR5Tm9kZT4pIG5vZGVNb2RlbHMpOwotCQkJfQotCQkJZmluYWxseSB7Ci0JCQkJaWYoZGlhZ3JhbUFkYXB0ZXIgIT0gbnVsbCkgewotCQkJCQlkaWFncmFtQWRhcHRlci5zZXROb3RpZmljYXRpb25FbmFibGVkKG9sZE5vdGlmeSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcHVibGljIHZvaWQgcmVtb3ZlRWRnZU1vZGVsKEVPYmplY3QgZGlhZ3JhbU1vZGVsLCBFT2JqZWN0IGVkZ2VNb2RlbCkgewotCQkJaWYoIShkaWFncmFtTW9kZWwgaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eSkpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlEaWFncmFtQWRhcHRlciBkaWFncmFtQWRhcHRlciA9IEJyaWRnZUhlbHBlci5nZXREaWFncmFtQWRhcHRlcihkaWFncmFtTW9kZWwpOwotCQkJYm9vbGVhbiBvbGROb3RpZnkgPSBmYWxzZTsKLQkJCWlmKGRpYWdyYW1BZGFwdGVyICE9IG51bGwpIHsKLQkJCQlvbGROb3RpZnkgPSBkaWFncmFtQWRhcHRlci5pc05vdGlmaWNhdGlvbkVuYWJsZWQoKTsKLQkJCQlkaWFncmFtQWRhcHRlci5zZXROb3RpZmljYXRpb25FbmFibGVkKGZhbHNlKTsKLQkJCX0KLQkJCXRyeSB7Ci0JCQkJKChvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eSkgZGlhZ3JhbU1vZGVsKS5nZXRFZGdlcygpLnJlbW92ZShlZGdlTW9kZWwpOwotCQkJfQotCQkJZmluYWxseSB7Ci0JCQkJaWYoZGlhZ3JhbUFkYXB0ZXIgIT0gbnVsbCkgewotCQkJCQlkaWFncmFtQWRhcHRlci5zZXROb3RpZmljYXRpb25FbmFibGVkKG9sZE5vdGlmeSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcHVibGljIHZvaWQgcmVtb3ZlTm9kZU1vZGVsKEVPYmplY3QgZGlhZ3JhbU1vZGVsLCBFT2JqZWN0IG5vZGVNb2RlbCkgewotCQkJaWYoIShkaWFncmFtTW9kZWwgaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eSkpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlEaWFncmFtQWRhcHRlciBkaWFncmFtQWRhcHRlciA9IEJyaWRnZUhlbHBlci5nZXREaWFncmFtQWRhcHRlcihkaWFncmFtTW9kZWwpOwotCQkJYm9vbGVhbiBvbGROb3RpZnkgPSBmYWxzZTsKLQkJCWlmKGRpYWdyYW1BZGFwdGVyICE9IG51bGwpIHsKLQkJCQlvbGROb3RpZnkgPSBkaWFncmFtQWRhcHRlci5pc05vdGlmaWNhdGlvbkVuYWJsZWQoKTsKLQkJCQlkaWFncmFtQWRhcHRlci5zZXROb3RpZmljYXRpb25FbmFibGVkKGZhbHNlKTsKLQkJCX0KLQkJCXRyeSB7Ci0JCQkJKChvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eSkgZGlhZ3JhbU1vZGVsKS5nZXROb2RlcygpLnJlbW92ZShub2RlTW9kZWwpOwotCQkJfQotCQkJZmluYWxseSB7Ci0JCQkJaWYoZGlhZ3JhbUFkYXB0ZXIgIT0gbnVsbCkgewotCQkJCQlkaWFncmFtQWRhcHRlci5zZXROb3RpZmljYXRpb25FbmFibGVkKG9sZE5vdGlmeSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcHVibGljIENvbGxlY3Rpb248Pz4gZ2V0RWRnZU1vZGVscyhFT2JqZWN0IGVsZW1lbnQpIHsKLQkJCWlmKGVsZW1lbnQgaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eSkgewotCQkJCXJldHVybiAoKG9yZy5lY2xpcHNlLnVtbDIudW1sLkFjdGl2aXR5KSBlbGVtZW50KS5nZXRFZGdlcygpOwotCQkJfQotCQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JCX0KLQotCQlwdWJsaWMgQ29sbGVjdGlvbjw/PiBnZXROb2RlTW9kZWxzKEVPYmplY3QgZWxlbWVudCkgewotCQkJaWYoZWxlbWVudCBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLnVtbDIudW1sLkFjdGl2aXR5KSB7Ci0JCQkJcmV0dXJuICgob3JnLmVjbGlwc2UudW1sMi51bWwuQWN0aXZpdHkpIGVsZW1lbnQpLmdldE5vZGVzKCk7Ci0JCQl9Ci0JCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQkJfQotCi0JfTsKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBJRGlhZ3JhbUFzc29jaWF0aW9uSGVscGVyIGRpYWdyYW1Bc3NvY2lhdGlvbkhlbHBlciA9IG5ldyBJRGlhZ3JhbUFzc29jaWF0aW9uSGVscGVyKCkgewotCi0JCXB1YmxpYyBOb2RlIGZpbmROb2RlKERpYWdyYW0gZGlhZ3JhbSwgTWV0aG9kRWxlbWVudCBlKSB7Ci0JCQlyZXR1cm4gRGlhZ3JhbUhlbHBlci5maW5kTm9kZUluTW9kZWxEaWFncmFtKGRpYWdyYW0sIGUpOwotCQl9Ci0KLQkJcHVibGljIE1ldGhvZEVsZW1lbnQgZ2V0TWV0aG9kRWxlbWVudChOb2RlIG5vZGUsIFJlc291cmNlU2V0IHJlc291cmNlU2V0KSB7Ci0JCQlFT2JqZWN0IGVsZW1lbnQgPSBub2RlLmdldEVsZW1lbnQoKTsKLQkJCXJldHVybiBlbGVtZW50IGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZT8gCi0JCQkJCSgob3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZSkgZWxlbWVudCkuZ2V0TGlua2VkRWxlbWVudCgpIDogbnVsbDsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHJlYXNzb2NpYXRlKEFjdGl2aXR5IGFjdGl2aXR5LCBEaWFncmFtIGNvcHlPZkJhc2VEaWFncmFtKSB7Ci0JCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCQkKLQkJfQotCQkKLQkJcHVibGljIHZvaWQgYWRkTm9kZU1vZGVscyhFT2JqZWN0IGRpYWdyYW1Nb2RlbCwgQ29sbGVjdGlvbjw/PiBub2RlTW9kZWxzKSB7Ci0JCQlpZighKGRpYWdyYW1Nb2RlbCBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkRpYWdyYW0pKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuRGlhZ3JhbSBkaWFncmFtID0gKG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkRpYWdyYW0pIGRpYWdyYW1Nb2RlbDsKLQkJCWJvb2xlYW4gb2xkTm90aWZ5ID0gKChOb2RlSW1wbClkaWFncmFtKS5pc05vdGlmaWNhdGlvbkVuYWJsZWQoKTsKLQkJCXRyeSB7Ci0JCQkJKChOb2RlSW1wbClkaWFncmFtKS5zZXROb3RpZmljYXRpb25FbmFibGVkKGZhbHNlKTsKLQkJCQlkaWFncmFtLmdldE5vZGVzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlPikgbm9kZU1vZGVscyk7Ci0JCQl9Ci0JCQlmaW5hbGx5IHsKLQkJCQkoKE5vZGVJbXBsKWRpYWdyYW0pLnNldE5vdGlmaWNhdGlvbkVuYWJsZWQob2xkTm90aWZ5KTsKLQkJCX0KLQkJfQotCi0JCXB1YmxpYyB2b2lkIGFkZEVkZ2VNb2RlbHMoRU9iamVjdCBkaWFncmFtTW9kZWwsIENvbGxlY3Rpb248Pz4gZWRnZU1vZGVscykgewotCQkJLy8KLQkJfQotCi0JCXB1YmxpYyB2b2lkIHJlbW92ZUVkZ2VNb2RlbChFT2JqZWN0IGRpYWdyYW1Nb2RlbCwgRU9iamVjdCBlZGdlTW9kZWwpIHsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHJlbW92ZU5vZGVNb2RlbChFT2JqZWN0IGRpYWdyYW1Nb2RlbCwgRU9iamVjdCBub2RlTW9kZWwpIHsKLQkJCWlmKCEoZGlhZ3JhbU1vZGVsIGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuRGlhZ3JhbSkpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5EaWFncmFtIGRpYWdyYW0gPSAob3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuRGlhZ3JhbSkgZGlhZ3JhbU1vZGVsOwotCQkJYm9vbGVhbiBvbGROb3RpZnkgPSAoKE5vZGVJbXBsKWRpYWdyYW0pLmlzTm90aWZpY2F0aW9uRW5hYmxlZCgpOwotCQkJdHJ5IHsKLQkJCQkoKE5vZGVJbXBsKWRpYWdyYW0pLnNldE5vdGlmaWNhdGlvbkVuYWJsZWQoZmFsc2UpOwotCQkJCWRpYWdyYW0uZ2V0Tm9kZXMoKS5yZW1vdmUobm9kZU1vZGVsKTsKLQkJCX0KLQkJCWZpbmFsbHkgewotCQkJCSgoTm9kZUltcGwpZGlhZ3JhbSkuc2V0Tm90aWZpY2F0aW9uRW5hYmxlZChvbGROb3RpZnkpOwotCQkJfQotCQl9Ci0KLQkJcHVibGljIENvbGxlY3Rpb248Pz4gZ2V0RWRnZU1vZGVscyhFT2JqZWN0IGVsZW1lbnQpIHsKLQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCQl9Ci0KLQkJcHVibGljIENvbGxlY3Rpb248Pz4gZ2V0Tm9kZU1vZGVscyhFT2JqZWN0IGVsZW1lbnQpIHsKLQkJCWlmKGVsZW1lbnQgaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5EaWFncmFtKSB7Ci0JCQkJcmV0dXJuICgob3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuRGlhZ3JhbSkgZWxlbWVudCkuZ2V0Tm9kZXMoKTsKLQkJCX0KLQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCQl9Ci0JCQotCX07Ci0JCi0JLyoqCi0JICogQ2hlY2tzIGlmIHRoZSBnaXZlbiBub2RlIGlzIG9uZSBvZiB0aGUgc3BlY2lmaWVkIG5vZGVzIG9yIHRoZWlyIGNoaWxkcmVuLgotCSAqIAotCSAqIEBwYXJhbSBub2RlcwotCSAqIEBwYXJhbSBub2RlCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBjb250YWlucyhDb2xsZWN0aW9uPD8+IG5vZGVzLCBWaWV3IG5vZGUpIHsKLQkJaWYobm9kZXMuY29udGFpbnMobm9kZSkpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWZvciAoT2JqZWN0IGNoaWxkIDogbm9kZXMpIHsKLQkJCWlmKGNoaWxkIGluc3RhbmNlb2YgTm9kZSAmJiBjb250YWlucygoKE5vZGUpIGNoaWxkKS5nZXRDaGlsZHJlbigpLCBub2RlKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JcHJpdmF0ZSBib29sZWFuIGRvUmVmcmVzaEZyb21CYXNlKERpYWdyYW0gZGlhZ3JhbSkgewotCQlBY3Rpdml0eSBhY3QgPSBudWxsOwotCQlFT2JqZWN0IG1vZGVsID0gZGlhZ3JhbS5nZXRFbGVtZW50KCk7Ci0JCWlmIChtb2RlbCBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLnVtbDIudW1sLkFjdGl2aXR5KSB7Ci0JCQlhY3QgPSAoQWN0aXZpdHkpIEJyaWRnZUhlbHBlcgotCQkJCQkuZ2V0TWV0aG9kRWxlbWVudCgoRU1vZGVsRWxlbWVudCkgbW9kZWwpOwotCQl9IGVsc2UgaWYgKG1vZGVsIGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuRGlhZ3JhbSkgewotCQkJYWN0ID0gKEFjdGl2aXR5KSAoKG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkRpYWdyYW0pIG1vZGVsKQotCQkJCQkuZ2V0TGlua2VkRWxlbWVudCgpOwotCQl9Ci0JCWlmIChhY3QgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJCi0JCXJldHVybiBkb1JlZnJlc2hGcm9tQmFzZShkaWFncmFtLCBhY3QpOwotCQkKLQl9Ci0JCi0JcHJpdmF0ZSBib29sZWFuIGRvUmVmcmVzaEZyb21CYXNlKERpYWdyYW0gZGlhZ3JhbSwgQWN0aXZpdHkgYWN0KSB7Ci0JCUVPYmplY3QgbW9kZWwgPSBkaWFncmFtLmdldEVsZW1lbnQoKTsKLQkJQWN0aXZpdHkgYmFzZSA9IChBY3Rpdml0eSkgYWN0LmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsKLQkJaWYgKGJhc2UgPT0gbnVsbAotCQkJCXx8IGFjdC5nZXRWYXJpYWJpbGl0eVR5cGUoKSA9PSBWYXJpYWJpbGl0eVR5cGUuTE9DQUxfUkVQTEFDRU1FTlQpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlpbnQgdHlwZSA9IERpYWdyYW1IZWxwZXIuZ2V0RGlhZ3JhbVR5cGUoZGlhZ3JhbSk7Ci0JCURpYWdyYW1TZXJ2aWNlIGRpYWdyYW1TdmMgPSBuZXcgRGlhZ3JhbVNlcnZpY2UoKTsKLQkJdHJ5IHsKLQkJCURpYWdyYW0gYmFzZURpYWdyYW0gPSBkaWFncmFtU3ZjLmdldEJhc2VEaWFncmFtKGFjdCwgdHlwZSk7Ci0JCQlpZiAoYmFzZURpYWdyYW0gPT0gbnVsbCkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0KLQkJCUNvbGxlY3Rpb248Tm9kZT4gb2xkTm9kZXMgPSBuZXcgSGFzaFNldDxOb2RlPigpOwotCQkJQ29sbGVjdGlvbjxFZGdlPiBvbGRFZGdlcyA9IG5ldyBIYXNoU2V0PEVkZ2U+KCk7Ci0JCQlEaWFncmFtIGJhc2VDb3B5ID0gRGlhZ3JhbUhlbHBlci5jb3B5RGlhZ3JhbShUcmFuc2FjdGlvblV0aWwKLQkJCQkJLmdldEVkaXRpbmdEb21haW4oZGlhZ3JhbSksIGJhc2VEaWFncmFtKTsKLQkJCQotCQkJSURpYWdyYW1Bc3NvY2lhdGlvbkhlbHBlciBoZWxwZXIgPSB0eXBlID09IElEaWFncmFtTWFuYWdlci5BQ1RJVklUWV9ESUFHUkFNID8gQURBc3NvY2lhdGlvbkhlbHBlcgotCQkJCQk6IGRpYWdyYW1Bc3NvY2lhdGlvbkhlbHBlcjsgCi0JCQkKLQkJCWJvb2xlYW4gbm90aWZpY2F0aW9uID0gbW9kZWwuZURlbGl2ZXIoKTsKLQkJCXRyeSB7Ci0vLwkJCQltb2RlbC5lU2V0RGVsaXZlcihmYWxzZSk7Ci0JCQkJUmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQgPSBiYXNlLmVSZXNvdXJjZSgpLmdldFJlc291cmNlU2V0KCk7Ci0JCQkJLy8gQ29sbGVjdCB0aGUgYmFzZSBub2RlcyB0aGF0IGV4aXN0IGluIGV4dGVuZCBkaWFncmFtCi0JCQkJZm9yIChJdGVyYXRvcjw/PiBpdGVyID0gYmFzZURpYWdyYW0uZ2V0Q2hpbGRyZW4oKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQlOb2RlIGJhc2VOb2RlID0gKE5vZGUpIGl0ZXIubmV4dCgpOwotCQkJCQlNZXRob2RFbGVtZW50IGUgPSBoZWxwZXIuZ2V0TWV0aG9kRWxlbWVudChiYXNlTm9kZSwgcmVzb3VyY2VTZXQpOwotCQkJCQlpZiAoZSAhPSBudWxsKSB7Ci0JCQkJCQlOb2RlIG5vZGUgPSBoZWxwZXIuZmluZE5vZGUoZGlhZ3JhbSwgZSk7Ci0JCQkJCQlpZiAobm9kZSAhPSBudWxsKSB7Ci0JCQkJCQkJb2xkTm9kZXMuYWRkKG5vZGUpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCi0JCQkJLy8gQ29sbGVjdCBvbGQgaW5oZXJpdGVkIFVJIG5vZGVzICYmIG5vZGVzIG9mCi0JCQkJLy8gY29udHJpYnV0b3IvcmVwbGFjZXIKLQkJCQlMaXN0PD8+IGNoaWxkcmVuID0gZGlhZ3JhbS5nZXRDaGlsZHJlbigpOwotCQkJCWZvciAoSXRlcmF0b3I8Pz4gaXRlciA9IGNoaWxkcmVuLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQlOb2RlIG5vZGUgPSAoTm9kZSkgaXRlci5uZXh0KCk7Ci0JCQkJCWlmIChCcmlkZ2VIZWxwZXIuaXNJbmhlcml0ZWQobm9kZSkpIHsKLQkJCQkJCW9sZE5vZGVzLmFkZChub2RlKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCU1ldGhvZEVsZW1lbnQgZSA9IGhlbHBlci5nZXRNZXRob2RFbGVtZW50KG5vZGUsIHJlc291cmNlU2V0KTsKLQkJCQkJCWlmIChlIGluc3RhbmNlb2YgQWN0aXZpdHkKLQkJCQkJCQkJJiYgKChBY3Rpdml0eSkgZSkuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpICE9IG51bGwpIHsKLQkJCQkJCQkvLyBub2RlIGlzIG9mIGNvbnRyaWJ1dG9yIG9yIHJlcGxhY2VyCi0JCQkJCQkJLy8KLQkJCQkJCQlvbGROb2Rlcy5hZGQobm9kZSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQkvLyBDb2xsZWN0IHRoZSBlZGdlcyB0aGF0cyBleGlzdHMgaW4gZXh0ZW5kIGRpYWdyYW0KLQkJCQlmb3IgKEl0ZXJhdG9yPD8+IGl0ZXIgPSBkaWFncmFtLmdldEVkZ2VzKCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJRWRnZSBlZGdlID0gKEVkZ2UpIGl0ZXIubmV4dCgpOwotCQkJCQlpZiAoY29udGFpbnMob2xkTm9kZXMsIGVkZ2UuZ2V0U291cmNlKCkpCi0JCQkJCQkJJiYgY29udGFpbnMob2xkTm9kZXMsIGVkZ2UuZ2V0VGFyZ2V0KCkpKSB7Ci0JCQkJCQlvbGRFZGdlcy5hZGQoZWRnZSk7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQkvLyByZW1vdmUgdGhlIG9sZCBiYXNlIG5vZGVzIGFuZCBlZGdlcyB0aGF0IGV4aXN0cyBpbiB0aGUKLQkJCQkvLyBleHRlbmQgZGlhZ3JhbS4KLQkJCQlmb3IgKE5vZGUgbm9kZSA6IG9sZE5vZGVzKSB7Ci0JCQkJCWRpYWdyYW0ucmVtb3ZlQ2hpbGQobm9kZSk7Ci0JCQkJCWhlbHBlci5yZW1vdmVOb2RlTW9kZWwobW9kZWwsIG5vZGUuZ2V0RWxlbWVudCgpKTsKLQkJCQl9Ci0JCQkJZm9yIChFZGdlIGVkZ2UgOiBvbGRFZGdlcykgewotCQkJCQlkaWFncmFtLnJlbW92ZUVkZ2UoZWRnZSk7Ci0JCQkJCWhlbHBlci5yZW1vdmVFZGdlTW9kZWwobW9kZWwsIGVkZ2UuZ2V0RWxlbWVudCgpKTsKLQkJCQl9Ci0KLQkJCQkvLyByZXBsYWNlIGFzc29jaWF0ZWQgYmFzZSBlbGVtZW50IHdpdGgKLQkJCQkvLyBjb250cmlidXRpbmcvcmVwbGFjaW5nCi0JCQkJLy8gZWxlbWVudAotCQkJCS8vCi0JCQkJaGVscGVyLnJlYXNzb2NpYXRlKGFjdCwgYmFzZUNvcHkpOwotCi0JCQkJLy8gTWFyayBpbmhlcml0ZWQKLQkJCQlmb3IgKE9iamVjdCBvYmogOiBiYXNlQ29weS5nZXRDaGlsZHJlbigpKSB7Ci0JCQkJCUJyaWRnZUhlbHBlci5tYXJrSW5oZXJpdGVkKChWaWV3KSBvYmopOwotCQkJCX0KLQkJCQlmb3IgKE9iamVjdCBvYmogOiBiYXNlQ29weS5nZXRFZGdlcygpKSB7Ci0JCQkJCUJyaWRnZUhlbHBlci5tYXJrSW5oZXJpdGVkKChWaWV3KSBvYmopOwotCQkJCX0KLQkJCQkKLQkJCQkvLyBBZGQgYWxsIG5ldyBub2RlcyBhbmQgZWRnZXMgZnJvbSBiYXNlIGNvcHkgdG8gZXh0ZW5kIGRpYWdyYW0uCi0JCQkJLy8KLQkJCQlkaWFncmFtLmdldFBlcnNpc3RlZENoaWxkcmVuKCkuYWRkQWxsKAotCQkJCQkJYmFzZUNvcHkuZ2V0Q2hpbGRyZW4oKSk7Ci0JCQkJZGlhZ3JhbS5nZXRQZXJzaXN0ZWRFZGdlcygpLmFkZEFsbCgKLQkJCQkJCWJhc2VDb3B5LmdldEVkZ2VzKCkpOwotCQkJCUNvbGxlY3Rpb248Pz4gYmFzZU5vZGVNb2RlbHMgPSBoZWxwZXIuZ2V0Tm9kZU1vZGVscyhiYXNlQ29weS5nZXRFbGVtZW50KCkpOwotCQkJCWlmKGJhc2VOb2RlTW9kZWxzICE9IG51bGwgJiYgIWJhc2VOb2RlTW9kZWxzLmlzRW1wdHkoKSkgewotCQkJCQloZWxwZXIuYWRkTm9kZU1vZGVscyhtb2RlbCwgYmFzZU5vZGVNb2RlbHMpOwotCQkJCX0JCQkJCQotCQkJCUNvbGxlY3Rpb248Pz4gYmFzZUVkZ2VNb2RlbHMgPSBoZWxwZXIuZ2V0RWRnZU1vZGVscyhiYXNlQ29weQotCQkJCQkJLmdldEVsZW1lbnQoKSk7Ci0JCQkJaWYgKGJhc2VFZGdlTW9kZWxzICE9IG51bGwgJiYgIWJhc2VFZGdlTW9kZWxzLmlzRW1wdHkoKSkgewotCQkJCQloZWxwZXIuYWRkRWRnZU1vZGVscyhtb2RlbCwgYmFzZUVkZ2VNb2RlbHMpOwotCQkJCX0KLQotCQkJCS8vIFRPRE86IGhhbmRsZSB0aGUgbWlzc2VkIGxpbmtzLgotCi0JCQkJLy8gQWN0aXZpdHlEaWFncmFtQWRhcHRlciBhZGFwdGVyID0KLQkJCQkvLyAoQWN0aXZpdHlEaWFncmFtQWRhcHRlcilCcmlkZ2VIZWxwZXIuZ2V0Tm9kZUFkYXB0ZXIodW1sQWN0aXZpdHkpOwotCQkJCS8vIGFkYXB0ZXIucG9wdWxhdGVEaWFncmFtKCk7Ci0JCQkJLy8gaWYodGFyZ2V0UGFydCBpbnN0YW5jZW9mIEFic3RyYWN0RGlhZ3JhbUVkaXRvcil7Ci0JCQkJLy8gRGlhZ3JhbUVkaXRvclV0aWwucmVzZXRFZGl0b3IoKEFic3RyYWN0RGlhZ3JhbUVkaXRvcil0YXJnZXRQYXJ0KTsKLQkJCQkvLyB9Ci0JCQl9IGZpbmFsbHkgewotCQkJCS8vIHJlc2V0IHRoZSBub3RpZmljYXRpb24uCi0JCQkJbW9kZWwuZVNldERlbGl2ZXIobm90aWZpY2F0aW9uKTsKLQkJCX0KLQotCQkJdHJ5IHsKLQkJCQlpZiAodGFyZ2V0UGFydCBpbnN0YW5jZW9mIEFic3RyYWN0RGlhZ3JhbUVkaXRvcikgewotCQkJCQlEaWFncmFtRWRpdG9yVXRpbAotCQkJCQkJCS5yZXNldEVkaXRvcigoQWJzdHJhY3REaWFncmFtRWRpdG9yKSB0YXJnZXRQYXJ0KTsKLQkJCQl9Ci0JCQkJLy8gZGlhZ3JhbS5lUmVzb3VyY2UoKS5zYXZlKG51bGwpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQotCQkJfQotCQl9IGZpbmFsbHkgewotCQkJZGlhZ3JhbVN2Yy5kaXNwb3NlKCk7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQgY29weURpYWdyYW0oRWRpdGluZ0RvbWFpbiBkb21haW4sIERpYWdyYW0gZGlhZ3JhbSkgewotCQlBcnJheUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJbGlzdC5hZGQoZGlhZ3JhbS5nZXRFbGVtZW50KCkpOwotCQlsaXN0LmFkZChkaWFncmFtKTsKLQkJb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQgY21kID0gQ29weUNvbW1hbmQuY3JlYXRlKGRvbWFpbiwgbGlzdCk7Ci0JCWNtZC5leGVjdXRlKCk7Ci0vLwkJZm9yIChJdGVyYXRvciBpdGVyID0gY21kLmdldFJlc3VsdCgpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotLy8JCQlPYmplY3QgZWxlbWVudCA9IChPYmplY3QpIGl0ZXIubmV4dCgpOwotLy8JCQlpZihlbGVtZW50IGluc3RhbmNlb2YgRGlhZ3JhbSkgewotLy8JCQkJcmV0dXJuIChEaWFncmFtKSBlbGVtZW50OwotLy8JCQl9Ci0vLwkJfQotCQlyZXR1cm4gY21kOwotCQkvL3JldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKCl7Ci0JCWlmKHRhcmdldFBhcnQgaW5zdGFuY2VvZiBBYnN0cmFjdERpYWdyYW1FZGl0b3IpewotCQkJQWJzdHJhY3REaWFncmFtRWRpdG9yIGVkaXRvciA9IChBYnN0cmFjdERpYWdyYW1FZGl0b3IpdGFyZ2V0UGFydDsKLQkJCURpYWdyYW1FZGl0UGFydCBwYXJ0ID0gZWRpdG9yLmdldERpYWdyYW1FZGl0UGFydCgpOwotCQkJCi0JCX0KLQkJCi0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vY29yZS9icmlkZ2UvQWN0aXZpdHlEaWFncmFtQWRhcHRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vY29yZS9icmlkZ2UvQWN0aXZpdHlEaWFncmFtQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZDJmMjgyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2NvcmUvYnJpZGdlL0FjdGl2aXR5RGlhZ3JhbUFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5icmlkZ2U7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwudXRpbC5JQWRhcHRlckZhY3RvcnlGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSUFjdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkFjdGl2aXR5V3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuQlNBY3Rpdml0eUl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLklCU0l0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuV0JTQWN0aXZpdHlJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkNvbmZpZ3VyYWJsZUNvbXBvc2VkQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWlsZXN0b25lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtCcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya09yZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkFjdGl2aXR5RWRnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuQWN0aXZpdHlQYXJhbWV0ZXJOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkNvbnRyb2xOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuVU1MRmFjdG9yeTsKLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqCi0gKiBAc2luY2UgMS4yCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eURpYWdyYW1BZGFwdGVyIGV4dGVuZHMgRGlhZ3JhbUFkYXB0ZXIgewotCQotCXB1YmxpYyBBY3Rpdml0eURpYWdyYW1BZGFwdGVyKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyIHdyYXBwZXIpIHsKLQkJc3VwZXIod3JhcHBlcik7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGUKLQkgKi8KLQlwdWJsaWMgQWN0aXZpdHlEaWFncmFtQWRhcHRlcihBY3Rpdml0eSBlKSB7Ci0JCXN1cGVyKGUpOwotCX0KLQotCXByb3RlY3RlZCBBY3Rpdml0eU5vZGUgYWRkTm9kZShDb2xsZWN0aW9uIG5vZGVzLCBPYmplY3Qgb2JqKSB7Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJQWN0aXZpdHkgYWN0ID0gKEFjdGl2aXR5KSBvYmo7Ci0JCQlWYXJpYWJpbGl0eUVsZW1lbnQgYmFzZSA9IGFjdC5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCk7Ci0JCQlpZiAoYmFzZSAhPSBudWxsKSB7Ci0JCQkJLy8gZmluZCBleGlzdGluZyBub2RlIGZvciBiYXNlIGFuZCBsaW5rIGl0IHRvIHRoZSBhY3Rpdml0eQotCQkJCS8vCi0JCQkJb3JnLmVjbGlwc2UudW1sMi51bWwuQWN0aXZpdHkgZGlhZ3JhbSA9IGdldERpYWdyYW0oKTsKLQkJCQlBY3Rpdml0eU5vZGUgYmFzZU5vZGUgPSBCcmlkZ2VIZWxwZXIuZmluZE5vZGUoZGlhZ3JhbSwgYmFzZSk7Ci0JCQkJaWYgKGJhc2VOb2RlID09IG51bGwpIHsKLQkJCQkJYmFzZU5vZGUgPSBCcmlkZ2VIZWxwZXIuZmluZE5vZGUoZGlhZ3JhbSwgYWN0KTsKLQkJCQl9Ci0JCQkJaWYgKGJhc2VOb2RlICE9IG51bGwpIHsKLQkJCQkJLy8gZGlzYXNzb2NpYXRlIHdpdGggdGhlIGJhc2UKLQkJCQkJLy8KLQkJCQkJTm9kZUFkYXB0ZXIgbm9kZUFkYXB0ZXIgPSBCcmlkZ2VIZWxwZXIuZ2V0Tm9kZUFkYXB0ZXIoYmFzZU5vZGUpOwotCQkJCQlpZihub2RlQWRhcHRlciAhPSBudWxsKSB7Ci0JCQkJCQlub2RlQWRhcHRlci5kaXNwb3NlKCk7Ci0JCQkJCX0KLQkJCQkJCi0JCQkJCS8vIGFzc29jaWF0ZSBiYXNlIG5vZGUgd2l0aCB0aGUgYWN0aXZpdHkKLQkJCQkJLy8KLQkJCQkJbm9kZUFkYXB0ZXIgPSBjcmVhdGVOb2RlQWRhcHRlcihhY3QpOwotCQkJCQlpZihub2RlQWRhcHRlciAhPSBudWxsKSB7Ci0JCQkJCQlpbml0aWFsaXplTm9kZUFkYXB0ZXIobm9kZUFkYXB0ZXIpOwotCQkJCQkJYmFzZU5vZGUuZUFkYXB0ZXJzKCkuYWRkKG5vZGVBZGFwdGVyKTsKLQkJCQkJCW5vZGVBZGFwdGVyLnVwZGF0ZVZpZXcoKTsKLS8vCQkJCQkJaWYoUHJvY2Vzc1V0aWwuaXNFeHRlbmRpbmdPckxvY2FsbHlDb250cmlidXRpbmcoYWN0KSkgewotCQkJCQkJCUJyaWRnZUhlbHBlci5hc3NvY2lhdGUoYmFzZU5vZGUsIGFjdCk7Ci0JCQkJCQkJaWYoQnJpZGdlSGVscGVyLmlzSW5oZXJpdGVkKG5vZGVBZGFwdGVyLmdldFZpZXcoKSkpewotCQkJCQkJCQlCcmlkZ2VIZWxwZXIudW5tYXJrSW5IZXJpdGVkKG5vZGVBZGFwdGVyLmdldFZpZXcoKSk7Ci0JCQkJCQkJfQotCQkJCQkJCW5vZGVBZGFwdGVyLnNldFRhcmdldFJlYWRPbmx5KGZhbHNlKTsKLS8vCQkJCQkJfQotCQkJCQl9Ci0JCQkJCQotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmFkZE5vZGUobm9kZXMsIG9iaik7Ci0JfQotCQotCXByb3RlY3RlZCBOb2RlQWRhcHRlciBjcmVhdGVOb2RlQWRhcHRlcihNZXRob2RFbGVtZW50IGUpIHsKLQkJaWYoZSBpbnN0YW5jZW9mIFdvcmtCcmVha2Rvd25FbGVtZW50KSB7Ci0JCQlyZXR1cm4gbmV3IFdvcmtCcmVha2Rvd25FbGVtZW50Tm9kZUFkYXB0ZXIoZSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGFkZFRvVW1hTW9kZWwoaW50IHBvc2l0aW9uLCBBY3Rpdml0eU5vZGUgYWRkZWROb2RlKSB7Ci0JCU1ldGhvZEVsZW1lbnQgZSA9IEJyaWRnZUhlbHBlci5nZXRNZXRob2RFbGVtZW50KGFkZGVkTm9kZSk7Ci0JCWlmKGUgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCUFjdGl2aXR5IGFjdCA9IChBY3Rpdml0eSkgZ2V0RWxlbWVudCgpOwotCi0JCS8vIHRyYW5zbGF0ZSBBY3Rpdml0eU5vZGUgaW5kZXggdG8gQWN0aXZpdHkgaW5kZXgKLQkJLy8KLQkJaW50IGkgPSB0b0FjdGl2aXR5SW5kZXgocG9zaXRpb24pOwotCi0JCU5vZGVBZGFwdGVyIG5vZGVBZGFwdGVyID0gQnJpZGdlSGVscGVyLmdldE5vZGVBZGFwdGVyKGFkZGVkTm9kZSk7Ci0JCWJvb2xlYW4gbm90aWZ5ID0gbm9kZUFkYXB0ZXIubm90aWZpY2F0aW9uRW5hYmxlZDsKLQkJdHJ5IHsKLQkJCW5vZGVBZGFwdGVyLm5vdGlmaWNhdGlvbkVuYWJsZWQgPSBmYWxzZTsKLQkJCWdldEFjdGlvbk1hbmFnZXIoKS5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5BREQsIGFjdCwgVW1hUGFja2FnZS5MaXRlcmFscy5BQ1RJVklUWV9fQlJFQUtET1dOX0VMRU1FTlRTLCBlLCBpKTsKLQkJCUJyaWRnZUhlbHBlci5hZGRFQW5ub3RhdGlvbihhZGRlZE5vZGUsIGUpOwotCQl9Ci0JCWZpbmFsbHkgewotCQkJbm9kZUFkYXB0ZXIubm90aWZpY2F0aW9uRW5hYmxlZCA9IG5vdGlmeTsKLQkJfQotCi0JCXN1cGVyLmFkZFRvVW1hTW9kZWwocG9zaXRpb24sIGFkZGVkTm9kZSk7Ci0JfQotCQotCXByaXZhdGUgaW50IHRvQWN0aXZpdHlJbmRleChpbnQgaW5kZXgpIHsKLQkJaWYgKGluZGV4ID09IC0xKQotCQkJcmV0dXJuIGluZGV4OwotCQlpbnQgc2l6ZSA9IGdldE5vZGVzKCkuc2l6ZSgpOwotCQlpbnQgaSA9IGluZGV4ICsgMTsKLQkJaWYgKGkgPT0gc2l6ZSkKLQkJCXJldHVybiAtMTsKLQkJQWN0aXZpdHlOb2RlIG5vZGUgPSAoQWN0aXZpdHlOb2RlKSBnZXROb2RlcygpLmdldChpKTsKLQkJaWYgKG5vZGUgPT0gbnVsbCkKLQkJCXJldHVybiAtMTsKLQotCQlmb3IgKDsgIShCcmlkZ2VIZWxwZXIuZ2V0TWV0aG9kRWxlbWVudChub2RlKSBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnQpICYmIGkgPCBzaXplOyBpKyspIHsKLQkJCW5vZGUgPSAoQWN0aXZpdHlOb2RlKSBnZXROb2RlcygpLmdldChpKTsKLQkJfQotCQlpZiAoaSA9PSBzaXplKQotCQkJcmV0dXJuIC0xOwotCQlBY3Rpdml0eSBhY3QgPSAoQWN0aXZpdHkpIGdldEVsZW1lbnQoKTsKLQkJcmV0dXJuIGFjdC5nZXRCcmVha2Rvd25FbGVtZW50cygpLmluZGV4T2YoQnJpZGdlSGVscGVyLmdldE1ldGhvZEVsZW1lbnQobm9kZSkpOwotCX0KLQotCXByb3RlY3RlZCBMaXN0IGdldEJyZWFrZG93bkVsZW1lbnRUeXBlcygpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QoV29ya0JyZWFrZG93bkVsZW1lbnQuY2xhc3MpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuYnJpZGdlLkRpYWdyYW1BZGFwdGVyI25ld05vZGUob3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50KQotCSAqLwotCXByb3RlY3RlZCBBY3Rpdml0eU5vZGUgbmV3Tm9kZShNZXRob2RFbGVtZW50IGUpIHsKLQkJQWN0aXZpdHlOb2RlIG5vZGUgPSBudWxsOwotCQlpZihlIGluc3RhbmNlb2YgQWN0aXZpdHkgKSB7Ci0JCQlub2RlID0gVU1MRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlU3RydWN0dXJlZEFjdGl2aXR5Tm9kZSgpOwotCQl9Ci0JCWVsc2UgaWYoZSBpbnN0YW5jZW9mIFRhc2tEZXNjcmlwdG9yIHx8IGUgaW5zdGFuY2VvZiBNaWxlc3RvbmUpIHsKLQkJCW5vZGUgPSBVTUxGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVBY3Rpdml0eVBhcmFtZXRlck5vZGUoKTsKLQkJfQotCQllbHNlIGlmKGUgaW5zdGFuY2VvZiBXb3JrQnJlYWtkb3duRWxlbWVudCkgewotCQkJbm9kZSA9IFVNTEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVN0cnVjdHVyZWRBY3Rpdml0eU5vZGUoKTsKLQkJfQotCQlpZihub2RlICE9IG51bGwpIHsKLQkJCUJyaWRnZUhlbHBlci5hc3NvY2lhdGUobm9kZSwgZSk7Ci0JCX0KLQkJcmV0dXJuIG5vZGU7Ci0JfQotCQotCQotCXByaXZhdGUgYm9vbGVhbiBpc1ZhbGlkKEFjdGl2aXR5RWRnZSBsaW5rKSB7Ci0JCWlmIChsaW5rLmdldFNvdXJjZSgpID09IG51bGwgfHwgbGluay5nZXRUYXJnZXQoKSA9PSBudWxsCi0JCQkJfHwgIWdldE5vZGVzKCkuY29udGFpbnMobGluay5nZXRTb3VyY2UoKSkKLQkJCQl8fCAhZ2V0Tm9kZXMoKS5jb250YWlucyhsaW5rLmdldFRhcmdldCgpKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzVmFsaWRXb3JrT3JkZXIoV29ya09yZGVyIHdvLCBPYmplY3QgcHJlZCkgewotCQlpZiAod28uZ2V0UHJlZCgpID09IHByZWQpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0KLQkJaWYgKHByZWQgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJQWN0aXZpdHkgYWN0ID0gKEFjdGl2aXR5KSBwcmVkOwotCQkJLy8gY2hlY2sgaWYgcHJlZGVjZXNzb3IgcmVmZXJlbmNlIGluIHRoZSBnaXZlbiB3b3JrIG9yZGVyIGlzIGJhc2Ugb2YKLQkJCS8vIHByZWQKLQkJCS8vCi0JCQlmb3IgKFZhcmlhYmlsaXR5RWxlbWVudCB2ZSA9IGFjdC5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCk7IHZlICE9IG51bGw7IHZlID0gdmUKLQkJCQkJLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSkgewotCQkJCWlmICh2ZSA9PSB3by5nZXRQcmVkKCkpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQkvKioKLQkgKiBDaGVja3MgaWYgTm9kZSBzcmMgY2FuIHJlYWNoIE5vZGUgdGFyZ2V0IGFzIHRoZSBmaXJzdCBBY3Rpdml0eU5vZGUgaW4gdGhlCi0JICogZGlhZ3JhbQotCSAqIAotCSAqIEBwYXJhbSBwcmVkTm9kZQotCSAqIEBwYXJhbSBub2RlCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gY2FuUmVhY2hBc0ZpcnN0QWN0aXZpdHlOb2RlKEFjdGl2aXR5Tm9kZSBwcmVkTm9kZSwgQWN0aXZpdHlOb2RlIG5vZGUpIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gcHJlZE5vZGUuZ2V0T3V0Z29pbmdzKCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQlBY3Rpdml0eUVkZ2UgbGluayA9IChBY3Rpdml0eUVkZ2UpIGl0ZXIubmV4dCgpOwotCQkJaWYgKGxpbmsuZ2V0VGFyZ2V0KCkgPT0gbm9kZSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQkJaWYgKGxpbmsuZ2V0VGFyZ2V0KCkgaW5zdGFuY2VvZiBDb250cm9sTm9kZQotCQkJCQkmJiBjYW5SZWFjaEFzRmlyc3RBY3Rpdml0eU5vZGUobGluay5nZXRUYXJnZXQoKSwgbm9kZSkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JQWRhcHRlckZhY3RvcnkgZ2V0QWRhcHRlckZhY3RvcnkoKXsKLQkJQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkgPSBudWxsOwotCQlpZiAoZmlsdGVyID09IG51bGwpIHsKLQkJCWFkYXB0ZXJGYWN0b3J5ID0gVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UuZ2V0V0JTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKTsKLQkJfSBlbHNlIGlmIChmaWx0ZXIgaW5zdGFuY2VvZiBJQWRhcHRlckZhY3RvcnlGaWx0ZXIpIHsKLQkJCWFkYXB0ZXJGYWN0b3J5ID0gKENvbmZpZ3VyYWJsZUNvbXBvc2VkQWRhcHRlckZhY3RvcnkpICgoSUFkYXB0ZXJGYWN0b3J5RmlsdGVyKSBmaWx0ZXIpCi0JCQkJCS5nZXRXQlNBZGFwdGVyRmFjdG9yeSgpOwotCQl9Ci0JCXJldHVybiBhZGFwdGVyRmFjdG9yeTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgcG9wdWxhdGVMaW5rcyhMaXN0PEFjdGl2aXR5Tm9kZT4gc2VsZWN0ZWROb2RlcykgewotCQlpZihzZWxlY3RlZE5vZGVzLmlzRW1wdHkoKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlzdXBlci5wb3B1bGF0ZUxpbmtzKHNlbGVjdGVkTm9kZXMpOwotCi0JCS8vIHJlbW92ZSB0aGUgaW52YWxpZCBsaW5rcwotCQkvLwotCQlmb3IgKEFjdGl2aXR5Tm9kZSBub2RlIDogc2VsZWN0ZWROb2RlcykgewotCQkJV29ya0JyZWFrZG93bkVsZW1lbnQgd2JlID0gbnVsbDsKLQkJCU1ldGhvZEVsZW1lbnQgbWU7Ci0JCQlpZiAoKG1lID0gQnJpZGdlSGVscGVyLmdldE1ldGhvZEVsZW1lbnQobm9kZSkpIGluc3RhbmNlb2YgV29ya0JyZWFrZG93bkVsZW1lbnQpIHsKLQkJCQl3YmUgPSAoV29ya0JyZWFrZG93bkVsZW1lbnQpIG1lOwotCQkJfQotCQkJQXJyYXlMaXN0PEFjdGl2aXR5RWRnZT4gbGlua3NUb1JlbW92ZSA9IG5ldyBBcnJheUxpc3Q8QWN0aXZpdHlFZGdlPigpOwotCQkJbGlua0xpc3RXYWxrOiBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gbm9kZQotCQkJCQkuZ2V0SW5jb21pbmdzKCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJCUFjdGl2aXR5RWRnZSBsaW5rID0gKEFjdGl2aXR5RWRnZSkgaXRlcmF0b3IubmV4dCgpOwotCQkJCWlmICghaXNWYWxpZChsaW5rKSkgewotCQkJCQlsaW5rc1RvUmVtb3ZlLmFkZChsaW5rKTsKLQkJCQl9Ci0KLQkJCQlpZiAod2JlICE9IG51bGwpIHsKLQkJCQkJLy8gVE9ETzogbmVlZCByZXZpc2l0IHRvIGNoZWNrIHRoZSB2YWxpZCBjb25uZWN0aW9uIGZyb20gYQotCQkJCQkvLyBGb3JrTm9kZSBvciBKb2luTm9kZQotCQkJCQkvLwotCQkJCQkKLQkJCQkJaWYgKGxpbmsuZ2V0U291cmNlKCkgIT0gbnVsbCAmJiBsaW5rLmdldFNvdXJjZSgpIGluc3RhbmNlb2YgQ29udHJvbE5vZGUpCi0JCQkJCQljb250aW51ZSBsaW5rTGlzdFdhbGs7Ci0KLQkJCQkJT2JqZWN0IHByZWQgPSBCcmlkZ2VIZWxwZXIuZ2V0TWV0aG9kRWxlbWVudChsaW5rLmdldFNvdXJjZSgpKTsKLQkJCQkJYm9vbGVhbiB3b3JrT3JkZXJGb3VuZCA9IGZhbHNlOwotCQkJCQlmaW5kX1dvcmtPcmRlcjogZm9yIChJdGVyYXRvciBpdGVyYXRvcjEgPSB3YmUKLQkJCQkJCQkuZ2V0TGlua1RvUHJlZGVjZXNzb3IoKS5pdGVyYXRvcigpOyBpdGVyYXRvcjEKLQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJV29ya09yZGVyIHdvID0gKFdvcmtPcmRlcikgaXRlcmF0b3IxLm5leHQoKTsKLQkJCQkJCWlmIChpc1ZhbGlkV29ya09yZGVyKHdvLCBwcmVkKSkgewotCQkJCQkJCXdvcmtPcmRlckZvdW5kID0gdHJ1ZTsKLQkJCQkJCQlicmVhayBmaW5kX1dvcmtPcmRlcjsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlpZiAoIXdvcmtPcmRlckZvdW5kKSB7Ci0JCQkJCQkvLyBpbnZhbGlkIGxpbmssIHJlbW92ZSBpdAotCQkJCQkJLy8KLQkJCQkJCWxpbmtzVG9SZW1vdmUuYWRkKGxpbmspOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQlmb3IgKEFjdGl2aXR5RWRnZSBsaW5rIDogbGlua3NUb1JlbW92ZSkgewotCQkJCUJyaWRnZUhlbHBlci5yZW1vdmVMaW5rKGxpbmspOwotCQkJfQotCQkJbGlua3NUb1JlbW92ZS5jbGVhcigpOwotCi0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gbm9kZS5nZXRPdXRnb2luZ3MoKS5pdGVyYXRvcigpOyBpdGVyYXRvcgotCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCUFjdGl2aXR5RWRnZSBsaW5rID0gKEFjdGl2aXR5RWRnZSkgaXRlcmF0b3IubmV4dCgpOwotCQkJCWlmICghaXNWYWxpZChsaW5rKSkgewotCQkJCQlsaW5rc1RvUmVtb3ZlLmFkZChsaW5rKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBsaW5rc1RvUmVtb3ZlLml0ZXJhdG9yKCk7IGl0ZXJhdG9yCi0JCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJQWN0aXZpdHlFZGdlIGxpbmsgPSAoQWN0aXZpdHlFZGdlKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJQnJpZGdlSGVscGVyLnJlbW92ZUxpbmsobGluayk7Ci0JCQl9Ci0JCQlsaW5rc1RvUmVtb3ZlLmNsZWFyKCk7Ci0JCQlsaW5rc1RvUmVtb3ZlID0gbnVsbDsKLQkJfQotCi0JCS8vIENoZWNrIHRoZSBsaW5rcyBvZiBlYWNoIEFjdGl2aXR5Tm9kZQotCQkvLyBzZXQgdGhlIFdvcmtPcmRlciB0byB0aGUgbGluayBpZiBuZWVkZWQKLQkJLy8gYWRkIG5ldyBsaW5rIGZvciB0aG9zZSBXb3JrT3JkZXJzIHRoYXQgc3RpbGwgZG9uJ3QgaGF2ZSB0aGUKLQkJLy8gY29ycmVzcG9uZGluZyBsaW5rCi0JCS8vCi0JCUFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5ID0gZ2V0QWRhcHRlckZhY3RvcnkoKTsKLQkJCi0JCWZvciAoQWN0aXZpdHlOb2RlIG5vZGUgOiBzZWxlY3RlZE5vZGVzKSB7Ci0JCQlNZXRob2RFbGVtZW50IGU7Ci0JCQlpZiAoKGUgPSBCcmlkZ2VIZWxwZXIuZ2V0TWV0aG9kRWxlbWVudChub2RlKSkgaW5zdGFuY2VvZiBXb3JrQnJlYWtkb3duRWxlbWVudCkgewotCQkJCUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsgCi0JCQkJLy8gR2V0IHRoZSByYXcgZGF0YSBvZiB3b3Jrb3JkZXJzIGZvciBvYmplY3QuCi0JCQkJV29ya0JyZWFrZG93bkVsZW1lbnQgbG9jYWwgPSAoV29ya0JyZWFrZG93bkVsZW1lbnQpIGU7Ci0JCQkJbGlzdC5hZGRBbGwobG9jYWwuZ2V0TGlua1RvUHJlZGVjZXNzb3IoKSk7Ci0JCQkJCi0JCQkJLy8gR2V0IHRoZSBQcmVkZWNlc3NvciBMaXN0IG9uIHRvcCBvZiByYXcgZGF0YSwgdGhpcyBpcyBuZWVkIGZvciBpbiBjYXNlIG9mIGV4dGVuZC4KLQkJCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIgYWRhcHRlciA9IG51bGw7Ci0JCQkJYWRhcHRlciA9IChJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIpYWRhcHRlckZhY3RvcnkKLQkJCQkJCQkJCS5hZGFwdChsb2NhbCwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCQlpZihhZGFwdGVyIGluc3RhbmNlb2YgSUJTSXRlbVByb3ZpZGVyKXsKLQkJCQkJbGlzdC5hZGRBbGwoKChJQlNJdGVtUHJvdmlkZXIpYWRhcHRlcikuZ2V0UHJlZGVjZXNzb3JzKCkpOwotCQkJCX0KLQkJCQkKLQkJCQkvLyBJdGVyYXRlIHdvcmsgb3JkZXJzIGFuZCBjcmVhdGUgbGlua3MuCi0JCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGxpc3QuaXRlcmF0b3IoKTsgaXRlcmF0b3IKLQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCU9iamVjdCBuZXh0ID0gaXRlcmF0b3IubmV4dCgpOwotCQkJCQlXb3JrT3JkZXIgd29ya09yZGVyID0gbnVsbDsKLQkJCQkJQnJlYWtkb3duRWxlbWVudCBwcmVkID0gbnVsbDsKLQkJCQkJaWYobmV4dCBpbnN0YW5jZW9mIFdvcmtPcmRlcil7Ci0JCQkJCQl3b3JrT3JkZXIgPSAoV29ya09yZGVyKW5leHQ7Ci0JCQkJCQlwcmVkID0gd29ya09yZGVyLmdldFByZWQoKTsKLQkJCQkJfQotCQkJCQlpZihuZXh0IGluc3RhbmNlb2YgV0JTQWN0aXZpdHlJdGVtUHJvdmlkZXIpewotCQkJCQkJcHJlZCA9IChCcmVha2Rvd25FbGVtZW50KSgoV0JTQWN0aXZpdHlJdGVtUHJvdmlkZXIpbmV4dCkuZ2V0VGFyZ2V0KCk7IAotCQkJCQl9Ci0JCQkJCQotCQkJCQlpZiAocHJlZCAhPSBudWxsICYmIHByZWQgaW5zdGFuY2VvZiBXb3JrQnJlYWtkb3duRWxlbWVudCkgewotCQkJCQkJQWN0aXZpdHlOb2RlIHByZWROb2RlID0gQnJpZGdlSGVscGVyLmZpbmROb2RlKGdldERpYWdyYW0oKSwKLQkJCQkJCQkJcHJlZCwgdHJ1ZSk7Ci0JCQkJCQlpZiAocHJlZE5vZGUgIT0gbnVsbCkgewotCQkJCQkJCS8vIGNoZWNrIGlmIHRoZXJlIGlzIGEgbGluayBmb3IgdGhpcyB3b3JrIG9yZGVyCi0JCQkJCQkJLy8gYWxyZWFkeQotCQkJCQkJCS8vCi0JCQkJCQkJYm9vbGVhbiBsaW5rRm91bmQgPSBmYWxzZTsKLQkJCQkJCQlmaW5kX2xpbms6IGZvciAoSXRlcmF0b3IgaXRlcmF0b3IxID0gbm9kZQotCQkJCQkJCQkJLmdldEluY29taW5ncygpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yMQotCQkJCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCQkJQWN0aXZpdHlFZGdlIGxpbmsgPSAoQWN0aXZpdHlFZGdlKSBpdGVyYXRvcjEubmV4dCgpOwotCQkJCQkJCQlpZiAobGluay5nZXRTb3VyY2UoKSA9PSBwcmVkTm9kZSkgewotCQkJCQkJCQkJLy8gbGluayBhbHJlYWR5IGV4aXN0cwotCQkJCQkJCQkJLy8gY2hlY2sgaWYgd29yayBvcmRlciBpcyBzZXQgdG8gdGhpcyBsaW5rCi0JCQkJCQkJCQkvLwotCQkJCQkJCQkJbGlua0ZvdW5kID0gdHJ1ZTsKLS8vCQkJCQkJCQkJTWV0aG9kRWxlbWVudCBtZSA9IEJyaWRnZUhlbHBlci5nZXRNZXRob2RFbGVtZW50KGxpbmspOwotCQkJCQkJCQkJaWYgKGxpbmsgPT0gbnVsbCkgewotCQkJCQkJCQkJCUJyaWRnZUhlbHBlci5zZXRTZW1hbnRpY01vZGVsKAotCQkJCQkJCQkJCQkJbGluaywgd29ya09yZGVyKTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJCWJyZWFrIGZpbmRfbGluazsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCQlpZiAoIWxpbmtGb3VuZCkgewotCQkJCQkJCQkvLyBjaGVjayBpZiB0aGlzIFdvcmtPcmRlciBjYW4gYmUgcmVwcmVzZW50ZWQKLQkJCQkJCQkJLy8gdmlhIGxpbmtzIG9mIFR5cGVkTm9kZXMKLQkJCQkJCQkJLy8KLQkJCQkJCQkJaWYgKCFjYW5SZWFjaEFzRmlyc3RBY3Rpdml0eU5vZGUocHJlZE5vZGUsIG5vZGUpKSB7Ci0JCQkJCQkJCQkvLyBhZGQgbmV3IGxpbmsgZm9yIHRoaXMgd29yayBvcmRlcgotCQkJCQkJCQkJLy8KLQkJCQkJCQkJCU5vZGVBZGFwdGVyIG5vZGVBZGFwdGVyID0gQnJpZGdlSGVscGVyLmdldE5vZGVBZGFwdGVyKG5vZGUpOwotCQkJCQkJCQkJTm9kZUFkYXB0ZXIgcHJlZE5vZGVBZGFwdGVyID0gQnJpZGdlSGVscGVyLmdldE5vZGVBZGFwdGVyKHByZWROb2RlKTsKLQkJCQkJCQkJCWlmKG5vZGVBZGFwdGVyICE9IG51bGwgJiYgcHJlZE5vZGVBZGFwdGVyICE9IG51bGwpIHsKLQkJCQkJCQkJCQlib29sZWFuIG9sZE5vdGlmeSA9IG5vZGVBZGFwdGVyLm5vdGlmaWNhdGlvbkVuYWJsZWQ7Ci0JCQkJCQkJCQkJYm9vbGVhbiBwcmVkTm9kZU5vdGlmeSA9IHByZWROb2RlQWRhcHRlci5ub3RpZmljYXRpb25FbmFibGVkOwotCQkJCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCQkJCW5vZGVBZGFwdGVyLm5vdGlmaWNhdGlvbkVuYWJsZWQgPSBmYWxzZTsKLQkJCQkJCQkJCQkJcHJlZE5vZGVBZGFwdGVyLm5vdGlmaWNhdGlvbkVuYWJsZWQgPSBmYWxzZTsKLQkJCQkJCQkJCQkJbm9kZUFkYXB0ZXIuYWRkSW5jb21pbmdDb25uZWN0aW9uKHByZWQpOyAKLQkJCQkJCQkJCQl9IGZpbmFsbHkgewotCQkJCQkJCQkJCQlub2RlQWRhcHRlci5ub3RpZmljYXRpb25FbmFibGVkID0gb2xkTm90aWZ5OwotCQkJCQkJCQkJCQlwcmVkTm9kZUFkYXB0ZXIubm90aWZpY2F0aW9uRW5hYmxlZCA9IHByZWROb2RlTm90aWZ5OwotCQkJCQkJCQkJCX0KLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQljbGVhbkR1cGxpY2F0ZUxpbmtzKHNlbGVjdGVkTm9kZXMpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjbGVhbkR1cGxpY2F0ZUxpbmtzKExpc3Q8QWN0aXZpdHlOb2RlPiBzZWxlY3RlZE5vZGVzKSB7Ci0JCUxpc3Q8QWN0aXZpdHlFZGdlPiBkdXBsaWNhdGVMaW5rcyA9IG5ldyBBcnJheUxpc3Q8QWN0aXZpdHlFZGdlPigpOwotCQlmb3IgKEFjdGl2aXR5Tm9kZSB3Yk5vZGUgOiBzZWxlY3RlZE5vZGVzKSB7Ci0JCQlpZih3Yk5vZGUuZ2V0SW5jb21pbmdzKCkgIT0gbnVsbCl7Ci0JCQkJZmluZER1cGxpY2F0ZUxpbmtzKGR1cGxpY2F0ZUxpbmtzLCB3Yk5vZGUuZ2V0SW5jb21pbmdzKCkpOwotCQkJfQotCQkJaWYod2JOb2RlLmdldE91dGdvaW5ncygpICE9bnVsbCl7Ci0JCQkJZmluZER1cGxpY2F0ZUxpbmtzKGR1cGxpY2F0ZUxpbmtzLCB3Yk5vZGUuZ2V0T3V0Z29pbmdzKCkpOwotCQkJfQotCQl9Ci0JCWZvciAoQWN0aXZpdHlFZGdlIGxpbmsgOiBkdXBsaWNhdGVMaW5rcykgewotCQkJQnJpZGdlSGVscGVyLnJlbW92ZUxpbmsobGluayk7Ci0JCX0KLQkJZHVwbGljYXRlTGlua3MuY2xlYXIoKTsKLQkJZHVwbGljYXRlTGlua3MgPSBudWxsOwotCX0KLQotCXByaXZhdGUgdm9pZCBmaW5kRHVwbGljYXRlTGlua3MoTGlzdCBkdXBsaWNhdGVMaW5rcywgTGlzdCBsaW5rcykgewotCQlmb3IgKGludCBpID0gMDsgaSA8IGxpbmtzLnNpemUoKTsgaSsrKSB7Ci0JCQlBY3Rpdml0eUVkZ2UgbGluayA9IChBY3Rpdml0eUVkZ2UpIGxpbmtzLmdldChpKTsKLQkJCWlmKCFkdXBsaWNhdGVMaW5rcy5jb250YWlucyhsaW5rKSl7Ci0JCQkJZm9yIChpbnQgaiA9IGkgKyAxOyBqIDwgbGlua3Muc2l6ZSgpOyBqKyspIHsKLQkJCQkJQWN0aXZpdHlFZGdlIGxpbmsxID0gKEFjdGl2aXR5RWRnZSkgbGlua3MuZ2V0KGopOwotCQkJCQlpZiAobGluazEuZ2V0U291cmNlKCkgPT0gbGluay5nZXRTb3VyY2UoKQotCQkJCQkJCSYmIGxpbmsxLmdldFRhcmdldCgpID09IGxpbmsuZ2V0VGFyZ2V0KCkpIHsKLQkJCQkJCWR1cGxpY2F0ZUxpbmtzLmFkZChsaW5rMSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgQ29sbGVjdGlvbiBwb3B1bGF0ZU5vZGVzKCkgewotCQlIYXNoU2V0IHNlbGVjdGVkTm9kZXMgPSBuZXcgSGFzaFNldCgpOwotCQlDb2xsZWN0aW9uIGNoaWxkcmVuID0gZ2V0Q2hpbGRyZW4oKTsKLQotCQkvLyBhc3NvY2lhdGUgY29udHJvbCBub2RlcwotCQkvLwotCQlzZWxlY3RlZE5vZGVzLmFkZEFsbChhc3NvY2lhdGVDb250cm9sTm9kZXMoY2hpbGRyZW4pKTsKLQkJCi0JCS8vIGFkZCBXb3JrQnJlYWtkb3duRWxlbWVudE5vZGVzCi0JCS8vCi0JCXNlbGVjdGVkTm9kZXMuYWRkQWxsKGFkZEVsZW1lbnROb2RlcyhjaGlsZHJlbikpOwotCQkKLQkJcmV0dXJuIHNlbGVjdGVkTm9kZXM7Ci0JfQotCQotCXByaXZhdGUgTGlzdCBhc3NvY2lhdGVDb250cm9sTm9kZXMoQ29sbGVjdGlvbiBtZXRob2RFbGVtZW50cykgewotCQlMaXN0IGN0cmxOb2RlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZ2V0RGlhZ3JhbSgpLmdldE5vZGVzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlBY3Rpdml0eU5vZGUgbm9kZSA9IChBY3Rpdml0eU5vZGUpIGl0ZXIubmV4dCgpOwotCQkJaWYobm9kZSBpbnN0YW5jZW9mIENvbnRyb2xOb2RlKSB7Ci0vLwkJCQkvLyBzZWxlY3QgdGhpcyBjb250cm9sIG5vZGUgZm9yIHRoZSBkaWFncmFtIG9ubHkgaWYgaXQgaGFzIGEgdGFyZ2V0IG5vZGUgb3Igc291cmNlIG5vZGUsCi0vLwkJCQkvLyBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRoYXQgaXMgYXNzb2NpYXRlZCB3aXRoIGEgbWV0aG9kIGVsZW1lbnQgaW4gdGhlIHNwZWNpZmllZAotLy8JCQkJLy8gbWV0aG9kIGVsZW1lbnQgY29sbGVjdGlvbgotLy8JCQkJLy8KLS8vCQkJCUNvbGxlY3Rpb24gYWN0Tm9kZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0vLwkJCQlCcmlkZ2VIZWxwZXIuZ2V0VGFyZ2V0Tm9kZXMoYWN0Tm9kZXMsIG5vZGUsIFdvcmtCcmVha2Rvd25FbGVtZW50LmNsYXNzKTsKLS8vCQkJCUJyaWRnZUhlbHBlci5nZXRTb3VyY2VOb2RlcyhhY3ROb2Rlcywgbm9kZSwgV29ya0JyZWFrZG93bkVsZW1lbnQuY2xhc3MpOwotLy8JCQkJaWYoIWFjdE5vZGVzLmlzRW1wdHkoKSkgewotLy8JCQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBhY3ROb2Rlcy5pdGVyYXRvcigpOyBpdGVyYXRvcgotLy8JCQkJCQkJLmhhc05leHQoKTspIHsKLS8vCQkJCQkJQWN0aXZpdHlOb2RlIGVsZW1lbnROb2RlID0gKEFjdGl2aXR5Tm9kZSkgaXRlcmF0b3IubmV4dCgpOwotLy8JCQkJCQlpZihtZXRob2RFbGVtZW50cy5jb250YWlucyhCcmlkZ2VIZWxwZXIuZ2V0TWV0aG9kRWxlbWVudChlbGVtZW50Tm9kZSkpKSB7Ci0vLwkJCQkJCQlpZihhZGROb2RlQWRhcHRlclRvKG5vZGUpICE9IG51bGwpIHsKLS8vCQkJCQkJCQljdHJsTm9kZXMuYWRkKG5vZGUpOwotLy8JCQkJCQkJfQotLy8JCQkJCQl9Ci0vLwkJCQkJfQotLy8JCQkJfQotCQkJCQotCQkJCWlmKGFkZE5vZGVBZGFwdGVyVG8obm9kZSkgIT0gbnVsbCkgewotCQkJCQljdHJsTm9kZXMuYWRkKG5vZGUpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gY3RybE5vZGVzOwotCX0KLQotCS8qKgotCSAqIEFkZHMgZWxlbWVudCBub2RlcyBmb3IgdGhlIHNwZWNpZmllZCBtZXRob2QgZWxlbWVudHMgaWYgdGhleSBkb24ndCBleGlzdCB5ZXQuCi0JICogCi0JICogQHBhcmFtIG1ldGhvZEVsZW1lbnRzCi0JICovCi0JcHJpdmF0ZSBMaXN0IGFkZEVsZW1lbnROb2RlcyhDb2xsZWN0aW9uIG1ldGhvZEVsZW1lbnRzKSB7CQotCQlBcnJheUxpc3Qgbm9kZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUFycmF5TGlzdCBuZXdOb2RlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gbWV0aG9kRWxlbWVudHMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZSA9IGl0ZXIubmV4dCgpOwotCQkJT2JqZWN0IGNoaWxkID0gVG5nVXRpbC51bndyYXAoZSk7Ci0JCQlpZiAoY2hpbGQgaW5zdGFuY2VvZiBXb3JrQnJlYWtkb3duRWxlbWVudCkgewotCQkJCUFjdGl2aXR5Tm9kZSBub2RlID0gQnJpZGdlSGVscGVyLmZpbmROb2RlKGdldERpYWdyYW0oKSwgY2hpbGQpOwotCQkJCWlmKG5vZGUgPT0gbnVsbCkgewotCQkJCQlub2RlID0gdG9Ob2RlKChNZXRob2RFbGVtZW50KSBjaGlsZCk7Ci0JCQkJCW5ld05vZGVzLmFkZChub2RlKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCS8vIHN5bmNocm9uaXplIG5hbWUgd2l0aCBsaW5rZWQgZWxlbWVudAotCQkJCQkvLwotCQkJCQlTdHJpbmcgbmFtZSA9IEJyaWRnZUhlbHBlci5nZXROb2RlTmFtZSgoTWV0aG9kRWxlbWVudCkgY2hpbGQpOwotCQkJCQlpZighbmFtZS5lcXVhbHMobm9kZS5nZXROYW1lKCkpKSB7Ci0JCQkJCQlub2RlLnNldE5hbWUobmFtZSk7Ci0JCQkJCX0KLQkJCQkJCi0JCQkJCWFkZE5vZGVBZGFwdGVyVG8obm9kZSk7Ci0JCQkJfQotCQkJCW5vZGVzLmFkZChub2RlKTsKLQkJCQlpZiAoZSBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyICYmICFpc1RhcmdldFJlYWRPbmx5KCkpIHsKLQkJCQkJQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIgd3JhcHBlciA9ICgoQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIGUpOwotCQkJCQlpZiAod3JhcHBlci5pc1JlYWRPbmx5KCkpIHsKLQkJCQkJCU5vZGVBZGFwdGVyIG5vZGVBZGFwdGVyID0gQnJpZGdlSGVscGVyLmdldE5vZGVBZGFwdGVyKG5vZGUpOwotCQkJCQkJbm9kZUFkYXB0ZXIud3JhcHBlciA9IHdyYXBwZXI7Ci0JCQkJCQkvLyByZWFkT25seSBhdHRyaWJ1dGUgaXMgc3RpbGwgbmVlZGVkCi0JCQkJCQkvLyBhZnRlciBpbnRyb2R1Y3Rpb24gb2Ygd3JhcHBlci4gCi0JCQkJCQkvLyBGb3IgZXhhbXBsZSwgd2UgY2FuIGhhdmUgYSBub2RlIGFkYXB0ZXIgZm9yIGEgcmVhZC1vbmx5IGJhc2UgYWN0aXZpdHkKLQkJCQkJCS8vIHdpdGhvdXQgc3VwcGx5aW5nIHdyYXBwZXIgZm9yIHRoaXMgYmFzZSBhY3Rpdml0eS4KLQkJCQkJCS8vCi0JCQkJCQlub2RlQWRhcHRlci5iYXNpY1NldFRhcmdldFJlYWRPbmx5KHRydWUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWdldE5vZGVzKCkuYWRkQWxsKG5ld05vZGVzKTsJCQotCQlyZXR1cm4gbm9kZXM7Ci0JfQotCi0JLyoqCi0JICogTW92ZWQgY29kZSBmcm9tIGdldENoaWxkcmVuLiBnZXRBZGFwdGVyKCkgd2lsbCByZXR1cm4gQWRhcHRlciwKLQkgKiB3aGljaCB3aWxsIGFsbG93IHVzIHRvIGZpbmQgaXRlbXByb3ZpZGVyIGZvciB0aGUgY2hpbGRyZW4uIAotCSAqIAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlciBnZXRBZGFwdGVyKCl7Ci0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciBhZGFwdGVyID0gbnVsbDsKLQkJaWYgKHdyYXBwZXIgIT0gbnVsbCkgewotCQkJYWRhcHRlciA9IHdyYXBwZXI7Ci0JCX0gZWxzZSB7Ci0JCQlhZGFwdGVyID0gKElUcmVlSXRlbUNvbnRlbnRQcm92aWRlcikgZ2V0QWRhcHRlckZhY3RvcnkoKS5hZGFwdCgKLQkJCQkJZ2V0RWxlbWVudCgpLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQl9Ci0JCXJldHVybiBhZGFwdGVyOwotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKCkgewotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIgYWRhcHRlciA9IGdldEFkYXB0ZXIoKTsKLQkJaWYgKGFkYXB0ZXIgIT0gbnVsbCkgewotCQkJCi0JCQkvL1R1cm4gb2ZmIHRoZSBWYXJpYWJpbGl0eUluZm8gZm9yIHRoZSBhY3Rpdml0eSBkaWFncmFtLgotCQkJT2JqZWN0IG9iaiA9IG51bGw7Ci0JCQlib29sZWFuIGVuYWJsZVZhcmlhYmlsaXR5SW5mbyA9IGZhbHNlOwotCQkJaWYoYWRhcHRlciBpbnN0YW5jZW9mIEFjdGl2aXR5V3JhcHBlckl0ZW1Qcm92aWRlcil7Ci0JCQkJb2JqID0gKChBY3Rpdml0eVdyYXBwZXJJdGVtUHJvdmlkZXIpYWRhcHRlcikuZ2V0RGVsZWdhdGluZ0l0ZW1Qcm92aWRlcigpOwotCQkJfQotCQkJaWYoYWRhcHRlciBpbnN0YW5jZW9mIEJTQWN0aXZpdHlJdGVtUHJvdmlkZXIpewotCQkJCW9iaiA9IGFkYXB0ZXI7Ci0JCQl9Ci0JCQkKLQkJCWlmKG9iaiBpbnN0YW5jZW9mIEJTQWN0aXZpdHlJdGVtUHJvdmlkZXIpewotCQkJCWVuYWJsZVZhcmlhYmlsaXR5SW5mbyA9ICgoQlNBY3Rpdml0eUl0ZW1Qcm92aWRlcilvYmopLmlzRW5hYmxlVmFyaWFiaWxpdHlJbmZvKCk7Ci0JCQkJKChCU0FjdGl2aXR5SXRlbVByb3ZpZGVyKW9iaikuc2V0RW5hYmxlVmFyaWFiaWxpdHlJbmZvKGZhbHNlKTsKLQkJCX0KLQkJCS8vIGVuZCBvZiB2YXJpYWJpbGl0eSBpbmZvIAotCQkJCi0JCQkKLQkJCS8vIHJldHVybiBhZGFwdGVyLmdldENoaWxkcmVuKGdldE9iamVjdCgpKTsKLQkJCS8vIGNvbW1lbnRlZCBhYm92ZSBsaW5lLCBGb3IgZGlhZ3JhbXMgLSByb2xsdXAgc2hvdWxkIGJlIGZhbHNlLCBmb3IKLQkJCS8vIGhhbmRsaW5nIHJvbGx1cCBzdGF0ZSBiZWxvdyBjb2RlLgotCQkJTGlzdCBjaGlsZHJlbiA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWV4dHJhY3RDaGlsZHJlbihhZGFwdGVyLCBnZXRFbGVtZW50KCksIGNoaWxkcmVuKTsKLQkJCQotCQkJLy8gcmVzZXQgdmFyaWFiaWxpdHlpbmZvIHN0YXR1cyBiYWNrCi0JCQlpZihvYmogaW5zdGFuY2VvZiBCU0FjdGl2aXR5SXRlbVByb3ZpZGVyKXsKLQkJCQkoKEJTQWN0aXZpdHlJdGVtUHJvdmlkZXIpb2JqKS5zZXRFbmFibGVWYXJpYWJpbGl0eUluZm8oZW5hYmxlVmFyaWFiaWxpdHlJbmZvKTsKLQkJCX0KLQkJCQotCQkJcmV0dXJuIGNoaWxkcmVuOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiByZW1vdmVOb2RlKE9iamVjdCBvYmopIHsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQlBY3Rpdml0eSBhY3QgPSAoQWN0aXZpdHkpIG9iajsKLQkJCVZhcmlhYmlsaXR5RWxlbWVudCBiYXNlID0gYWN0LmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsKLQkJCWlmIChiYXNlICE9IG51bGwpIHsKLQkJCQlvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eSBkaWFncmFtID0gZ2V0RGlhZ3JhbSgpOwotCQkJCQotCQkJCS8vIGZpbmQgZXhpc3Rpbmcgbm9kZSBmb3IgdGhlIG9sZCBhY3Rpdml0eSBhbmQgcmVsaW5rIGl0IHRvIGl0cwotCQkJCS8vIGJhc2UKLQkJCQkvLwotCQkJCUFjdGl2aXR5Tm9kZSBub2RlID0gQnJpZGdlSGVscGVyLmZpbmROb2RlKGRpYWdyYW0sIGFjdCk7Ci0JCQkJaWYobm9kZSA9PSBudWxsKSB7Ci0JCQkJCW5vZGUgPSBCcmlkZ2VIZWxwZXIuZmluZE5vZGUoZGlhZ3JhbSwgYmFzZSk7Ci0JCQkJfQotCQkJCWlmIChub2RlICE9IG51bGwpIHsKLQkJCQkJLy8gZGlzYXNzb2NpYXRlIHdpdGggdGhlIG9sZCBhY3Rpdml0eQotCQkJCQkvLwotCQkJCQlOb2RlQWRhcHRlciBub2RlQWRhcHRlciA9IEJyaWRnZUhlbHBlci5nZXROb2RlQWRhcHRlcihub2RlKTsKLQkJCQkJaWYobm9kZUFkYXB0ZXIgIT0gbnVsbCkgewotCQkJCQkJbm9kZUFkYXB0ZXIuZGlzcG9zZSgpOwotCQkJCQl9Ci0JCQkJCQotCQkJCQkvLyBhc3NvY2lhdGUgbm9kZSB3aXRoIHRoZSBiYXNlIGFjdGl2aXR5Ci0JCQkJCS8vCi0JCQkJCW5vZGVBZGFwdGVyID0gY3JlYXRlTm9kZUFkYXB0ZXIoYmFzZSk7Ci0JCQkJCWlmKG5vZGVBZGFwdGVyICE9IG51bGwpIHsKLQkJCQkJCWluaXRpYWxpemVOb2RlQWRhcHRlcihub2RlQWRhcHRlcik7Ci0JCQkJCQlub2RlQWRhcHRlci5iYXNpY1NldFRhcmdldFJlYWRPbmx5KHRydWUpOwotCQkJCQkJbm9kZS5lQWRhcHRlcnMoKS5hZGQobm9kZUFkYXB0ZXIpOwotCQkJCQkJbm9kZUFkYXB0ZXIudXBkYXRlVmlldygpOwotCQkJCQkJaWYoIUJyaWRnZUhlbHBlci5pc0luaGVyaXRlZChub2RlQWRhcHRlci5nZXRWaWV3KCkpKXsKLQkJCQkJCQlCcmlkZ2VIZWxwZXIubWFya0luaGVyaXRlZChub2RlQWRhcHRlci5nZXRWaWV3KCkpOwotCQkJCQkJfQotCQkJCQl9Ci0KLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXIucmVtb3ZlTm9kZShvYmopOwotCX0KLQotCXByb3RlY3RlZCBOb2RlQWRhcHRlciBhZGROb2RlQWRhcHRlclRvKEFjdGl2aXR5Tm9kZSBub2RlKSB7Ci0JCU5vZGVBZGFwdGVyIGFkYXB0ZXIgPSBCcmlkZ2VIZWxwZXIuZ2V0Tm9kZUFkYXB0ZXIobm9kZSk7Ci0JCWlmKGFkYXB0ZXIgIT0gbnVsbCkgewotCQkJcmV0dXJuIGFkYXB0ZXI7Ci0JCX0KLQkJaWYobm9kZSBpbnN0YW5jZW9mIENvbnRyb2xOb2RlKSB7Ci0JCQlhZGFwdGVyID0gbmV3IENvbnRyb2xOb2RlQWRhcHRlcigpOwotCQl9Ci0JCWVsc2UgewotCQkJTWV0aG9kRWxlbWVudCBlID0gQnJpZGdlSGVscGVyLmdldE1ldGhvZEVsZW1lbnQobm9kZSk7Ci0JCQlpZihlID09IG51bGwpIHsKLQkJCQlpZihub2RlIGluc3RhbmNlb2YgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZSkgewotCQkJCQlTdHJpbmcgdHlwZSA9IEJyaWRnZUhlbHBlci5nZXRUeXBlKChTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlKW5vZGUpOwotCQkJCQlpZiAoQnJpZGdlSGVscGVyLlVNQV9QSEFTRS5lcXVhbHModHlwZSkpIHsKLQkJCQkJCWUgPSBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQaGFzZSgpOwotCQkJCQl9Ci0JCQkJCWVsc2UgaWYgKEJyaWRnZUhlbHBlci5VTUFfSVRFUkFUSU9OLmVxdWFscyh0eXBlKSkgewotCQkJCQkJZSA9IFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUl0ZXJhdGlvbigpOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJZSA9IFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUFjdGl2aXR5KCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSBpZihub2RlIGluc3RhbmNlb2YgQWN0aXZpdHlQYXJhbWV0ZXJOb2RlKSB7Ci0JCQkJCVN0cmluZyB0eXBlID0gQnJpZGdlSGVscGVyLmdldFR5cGUoKEFjdGl2aXR5UGFyYW1ldGVyTm9kZSlub2RlKTsKLQkJCQkJaWYoQnJpZGdlSGVscGVyLlVNQV9NSUxFU1RPTkUuZXF1YWxzKHR5cGUpKSB7Ci0JCQkJCQllID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlTWlsZXN0b25lKCk7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQllID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlVGFza0Rlc2NyaXB0b3IoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWlmKGUgIT0gbnVsbCkgewotCQkJCWFkYXB0ZXIgPSBuZXcgV29ya0JyZWFrZG93bkVsZW1lbnROb2RlQWRhcHRlcihlKTsKLQkJCX0KLQkJfQotCQlpZihhZGFwdGVyICE9IG51bGwpIHsKLQkJCWluaXRpYWxpemVOb2RlQWRhcHRlcihhZGFwdGVyKTsKLQkJCW5vZGUuZUFkYXB0ZXJzKCkuYWRkKGFkYXB0ZXIpOwotCQkJcmV0dXJuIGFkYXB0ZXI7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXByaXZhdGUgQWN0aXZpdHlOb2RlIHJlYXNzb2NpYXRlQmFzZU5vZGUoQWN0aXZpdHkgYWN0KSB7Ci0JCVZhcmlhYmlsaXR5RWxlbWVudCBiYXNlID0gYWN0LmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsKLQkJaWYgKGJhc2UgIT0gbnVsbCkgewotCQkJLy8gZmluZCBleGlzdGluZyBub2RlIGZvciBiYXNlIGFuZCBsaW5rIGl0IHRvIHRoZSBhY3Rpdml0eQotCQkJLy8KLQkJCW9yZy5lY2xpcHNlLnVtbDIudW1sLkFjdGl2aXR5IGRpYWdyYW0gPSBnZXREaWFncmFtKCk7Ci0JCQlBY3Rpdml0eU5vZGUgYmFzZU5vZGUgPSBCcmlkZ2VIZWxwZXIuZmluZE5vZGUoZGlhZ3JhbSwgYmFzZSk7Ci0JCQlpZiAoYmFzZU5vZGUgPT0gbnVsbCkgewotCQkJCWJhc2VOb2RlID0gQnJpZGdlSGVscGVyLmZpbmROb2RlKGRpYWdyYW0sIGFjdCk7Ci0JCQl9Ci0JCQlpZiAoYmFzZU5vZGUgIT0gbnVsbCkgewotCQkJCS8vIGRpc2Fzc29jaWF0ZSB3aXRoIHRoZSBiYXNlCi0JCQkJLy8KLQkJCQlOb2RlQWRhcHRlciBub2RlQWRhcHRlciA9IEJyaWRnZUhlbHBlci5nZXROb2RlQWRhcHRlcihiYXNlTm9kZSk7Ci0JCQkJaWYobm9kZUFkYXB0ZXIgIT0gbnVsbCkgewotCQkJCQlub2RlQWRhcHRlci5kaXNwb3NlKCk7Ci0JCQkJfQotCQkJCQotCQkJCS8vIGFzc29jaWF0ZSBiYXNlIG5vZGUgd2l0aCB0aGUgYWN0aXZpdHkKLQkJCQkvLwotCQkJCW5vZGVBZGFwdGVyID0gY3JlYXRlTm9kZUFkYXB0ZXIoYWN0KTsKLQkJCQlpZihub2RlQWRhcHRlciAhPSBudWxsKSB7Ci0JCQkJCWluaXRpYWxpemVOb2RlQWRhcHRlcihub2RlQWRhcHRlcik7Ci0JCQkJCWJhc2VOb2RlLmVBZGFwdGVycygpLmFkZChub2RlQWRhcHRlcik7Ci0JCQkJCW5vZGVBZGFwdGVyLnVwZGF0ZVZpZXcoKTsKLS8vCQkJCQlpZihQcm9jZXNzVXRpbC5pc0V4dGVuZGluZ09yTG9jYWxseUNvbnRyaWJ1dGluZyhhY3QpKSB7Ci0JCQkJCQlCcmlkZ2VIZWxwZXIuYXNzb2NpYXRlKGJhc2VOb2RlLCBhY3QpOwotCQkJCQkJaWYoQnJpZGdlSGVscGVyLmlzSW5oZXJpdGVkKG5vZGVBZGFwdGVyLmdldFZpZXcoKSkpewotCQkJCQkJCUJyaWRnZUhlbHBlci51bm1hcmtJbkhlcml0ZWQobm9kZUFkYXB0ZXIuZ2V0VmlldygpKTsKLQkJCQkJCX0KLQkJCQkJCW5vZGVBZGFwdGVyLnNldFRhcmdldFJlYWRPbmx5KGZhbHNlKTsKLS8vCQkJCQl9Ci0JCQkJfQotCQkJCQotCQkJCXJldHVybiBiYXNlTm9kZTsKLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgcmVwbGFjZU5vZGUoT2JqZWN0IG9sZEVsZW1lbnQsIE9iamVjdCBuZXdFbGVtZW50KSB7Ci0JCWlmKG5ld0VsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQkvLyBmaW5kIGV4aXN0aW5nIG5vZGUgZm9yIG9sZCBlbGVtZW50IGFuZCBsaW5rIGl0IHRvIHRoZSBuZXcgZWxlbWVudAotCQkJLy8KLQkJCW9yZy5lY2xpcHNlLnVtbDIudW1sLkFjdGl2aXR5IGRpYWdyYW0gPSBnZXREaWFncmFtKCk7Ci0JCQlBY3Rpdml0eU5vZGUgb2xkTm9kZSA9IEJyaWRnZUhlbHBlci5maW5kTm9kZShkaWFncmFtLCBvbGRFbGVtZW50KTsKLQkJCWlmIChvbGROb2RlICE9IG51bGwpIHsKLQkJCQkvLyBkaXNhc3NvY2lhdGUgd2l0aCB0aGUgb2xkIGVsZW1lbnQKLQkJCQkvLwotCQkJCU5vZGVBZGFwdGVyIG5vZGVBZGFwdGVyID0gQnJpZGdlSGVscGVyLmdldE5vZGVBZGFwdGVyKG9sZE5vZGUpOwotCQkJCWlmKG5vZGVBZGFwdGVyICE9IG51bGwpIHsKLQkJCQkJbm9kZUFkYXB0ZXIuZGlzcG9zZSgpOwotCQkJCX0KLQotCQkJCS8vIGFzc29jaWF0ZSBiYXNlIG5vZGUgd2l0aCB0aGUgbmV3IGVsZW1lbnQKLQkJCQkvLwotCQkJCU1ldGhvZEVsZW1lbnQgZSA9IChNZXRob2RFbGVtZW50KSBuZXdFbGVtZW50OwotCQkJCW5vZGVBZGFwdGVyID0gY3JlYXRlTm9kZUFkYXB0ZXIoZSk7Ci0JCQkJaWYobm9kZUFkYXB0ZXIgIT0gbnVsbCkgewotCQkJCQlpbml0aWFsaXplTm9kZUFkYXB0ZXIobm9kZUFkYXB0ZXIpOwotCQkJCQlvbGROb2RlLmVBZGFwdGVycygpLmFkZChub2RlQWRhcHRlcik7Ci0JCQkJCW5vZGVBZGFwdGVyLnVwZGF0ZVZpZXcoKTsKLQkJCQkJQnJpZGdlSGVscGVyLmFzc29jaWF0ZShvbGROb2RlLCBlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9jb3JlL2JyaWRnZS9CcmlkZ2VIZWxwZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2NvcmUvYnJpZGdlL0JyaWRnZUhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YzEzZTU5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2NvcmUvYnJpZGdlL0JyaWRnZUhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTEwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLmJyaWRnZTsKLQotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU1vZGVsRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRWNvcmVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuRGlhZ3JhbUNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuRGlhZ3JhbVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5MaW5rZWRPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTmFtZWROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlByb2Nlc3NVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5TdXBwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS5JTGlicmFyeVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaWJhYmxlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkl0ZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NaWxlc3RvbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5QaGFzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtCcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya09yZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuSUVsZW1lbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkRpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eUVkZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuQWN0aXZpdHlOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkFjdGl2aXR5UGFydGl0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkNvbnRyb2xOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkZvcmtOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkpvaW5Ob2RlOwotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogCi0gKiBAc2luY2UgMS4yCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBCcmlkZ2VIZWxwZXIgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVU1BX0VMRU1FTlQgPSAidW1hX2VsZW1lbnQiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVTUFfVVJJID0gInVyaSI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVTUFfVFlQRSA9ICJ0eXBlIjsgLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVNQV9QSEFTRSA9ICJQaGFzZSI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVTUFfSVRFUkFUSU9OID0gIkl0ZXJhdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVTUFfQUNUSVZJVFkgPSAiQWN0aXZpdHkiOyAvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVU1BX1RBU0tfREVTQ1JJUFRPUiA9ICJUYXNrIjsgLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVNQV9NSUxFU1RPTkUgPSAiTWlsZXN0b25lIjsgLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFOTk9UQVRJT05fSU5IRVJJUkVEID0gImluaGVyaXRlZCI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgc3RhdGljIExpc3Q8SUVsZW1lbnRUeXBlPiBlbGVtZW50VHlwZXMgPSBuZXcgQXJyYXlMaXN0PElFbGVtZW50VHlwZT4oKTsKLQkKLQlwdWJsaWMgc3RhdGljIE1hcDxTdHJpbmcsIEVDbGFzcz4gdHlwZVN0cmluZ1RvRUNsYXNzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBFQ2xhc3M+KCk7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyA9IERpYWdyYW1Db3JlUGx1Z2luLmdldERlZmF1bHQoKS5pc0RlYnVnZ2luZygpOwotCQotCXN0YXRpYyB7Ci0JCXR5cGVTdHJpbmdUb0VDbGFzcy5wdXQoVU1BX1BIQVNFLCBVbWFQYWNrYWdlLkxpdGVyYWxzLlBIQVNFKTsKLQkJdHlwZVN0cmluZ1RvRUNsYXNzLnB1dChVTUFfSVRFUkFUSU9OLCBVbWFQYWNrYWdlLkxpdGVyYWxzLklURVJBVElPTik7Ci0JCXR5cGVTdHJpbmdUb0VDbGFzcy5wdXQoVU1BX0FDVElWSVRZLCBVbWFQYWNrYWdlLkxpdGVyYWxzLkFDVElWSVRZKTsKLQkJdHlwZVN0cmluZ1RvRUNsYXNzLnB1dChVTUFfVEFTS19ERVNDUklQVE9SLCBVbWFQYWNrYWdlLkxpdGVyYWxzLlRBU0tfREVTQ1JJUFRPUik7Ci0JCXR5cGVTdHJpbmdUb0VDbGFzcy5wdXQoVU1BX01JTEVTVE9ORSwgVW1hUGFja2FnZS5MaXRlcmFscy5NSUxFU1RPTkUpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0U2VtYW50aWNNb2RlbChBY3Rpdml0eUVkZ2UgbGluaywgV29ya09yZGVyIHdvcmtPcmRlcikgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzUmVhZE9ubHkoVmlldyB2aWV3KSB7Ci0JCU5vZGVBZGFwdGVyIG5vZGVBZGFwdGVyID0gQnJpZGdlSGVscGVyCi0JCQkJLmdldE5vZGVBZGFwdGVyKHZpZXcuZ2V0RWxlbWVudCgpKTsKLQkJaWYobm9kZUFkYXB0ZXIgIT0gbnVsbCkgewotCQkJcmV0dXJuIG5vZGVBZGFwdGVyLmlzVGFyZ2V0UmVhZE9ubHkoKTsKLQkJfQotCQlpZih2aWV3LmdldEVsZW1lbnQoKSBpbnN0YW5jZW9mIE5vZGUpIHsKLQkJCXJldHVybiAoKE5vZGUpdmlldy5nZXRFbGVtZW50KCkpLmlzUmVhZE9ubHkoKTsKLQkJfQotCQkKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQkvKioKLQkgKiBHZXRzIHRoZSBtZXRob2QgZWxlbWVudCB0aGF0IHRoZSBnaXZlbiB2aWV3IHJlcHJlc2VudHMuCi0JICogCi0JICogQHBhcmFtIG5vZGUKLQkgKiBAcmV0dXJuIG1ldGhvZCBlbGVtZW50IHRoYXQgdGhlIHZpZXcgaXMgcmVwcmVzZW50aW5nIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICogICAgICAgICBpZiB0aGUgdmlldyBkb2VzIG5vdCByZXByZXNlbnQgYW55IG1ldGhvZCBlbGVtZW50IG9yIHRoZSBkaWFncmFtCi0JICogICAgICAgICBvZiB0aGUgdmlldyBjdXJyZW50bHkgaXMgbm90IG9wZW5lZCBpbiBhIGRpYWdyYW0gZWRpdG9yLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTWV0aG9kRWxlbWVudCBnZXRNZXRob2RFbGVtZW50KFZpZXcgdmlldykgewotCQlyZXR1cm4gZ2V0TWV0aG9kRWxlbWVudCh2aWV3LmdldEVsZW1lbnQoKSk7Ci0JfQkKLQkKLQkvKioKLQkgKiBHZXRzIHRoZSBtZXRob2QgZWxlbWVudCB0aGF0IHRoZSBnaXZlbiBkaWFncmFtIG1vZGVsIG9iamVjdCByZXByZXNlbnRzLgotCSAqIAotCSAqIEBwYXJhbSBtb2RlbE9iamVjdAotCSAqIEByZXR1cm4gbWV0aG9kIGVsZW1lbnQgdGhhdCB0aGUgbW9kZWwgb2JqZWN0IGlzIHJlcHJlc2VudGluZyBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqICAgICAgICAgaWYgdGhlIG1vZGVsIG9iamVjdCBkb2VzIG5vdCByZXByZXNlbnQgYW55IG1ldGhvZCBlbGVtZW50IG9yIHRoZSBkaWFncmFtCi0JICogICAgICAgICBvZiB0aGUgbW9kZWwgb2JqZWN0IGN1cnJlbnRseSBpcyBub3Qgb3BlbmVkIGluIGEgZGlhZ3JhbSBlZGl0b3IuCi0JICovCi0JcHVibGljIHN0YXRpYyBNZXRob2RFbGVtZW50IGdldE1ldGhvZEVsZW1lbnQoRU9iamVjdCBtb2RlbE9iamVjdCkgewotCQlpZihtb2RlbE9iamVjdCBpbnN0YW5jZW9mIExpbmtlZE9iamVjdCkgewotCQkJcmV0dXJuICgoTGlua2VkT2JqZWN0KW1vZGVsT2JqZWN0KS5nZXRMaW5rZWRFbGVtZW50KCk7Ci0JCX0KLQkJZWxzZSBpZihtb2RlbE9iamVjdCBpbnN0YW5jZW9mIEVNb2RlbEVsZW1lbnQpIHsKLQkJCXJldHVybiBnZXRNZXRob2RFbGVtZW50KChFTW9kZWxFbGVtZW50KSBtb2RlbE9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgTWV0aG9kRWxlbWVudCBnZXRNZXRob2RFbGVtZW50KFZpZXcgdmlldywgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eSBvd25lcikgewotCQlFT2JqZWN0IG1vZGVsT2JqZWN0ID0gdmlldy5nZXRFbGVtZW50KCk7Ci0JCWlmKG1vZGVsT2JqZWN0IGluc3RhbmNlb2YgTGlua2VkT2JqZWN0KSB7Ci0JCQlyZXR1cm4gKChMaW5rZWRPYmplY3QpbW9kZWxPYmplY3QpLmdldExpbmtlZEVsZW1lbnQoKTsKLQkJfQotCQllbHNlIGlmKG1vZGVsT2JqZWN0IGluc3RhbmNlb2YgRU1vZGVsRWxlbWVudCkgewotCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSBvd25lci5lUmVzb3VyY2UoKTsKLQkJCWlmKHJlc291cmNlICE9IG51bGwgJiYgcmVzb3VyY2UuZ2V0UmVzb3VyY2VTZXQoKSAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIGdldE1ldGhvZEVsZW1lbnRGcm9tQW5ub3RhdGlvbigoRU1vZGVsRWxlbWVudCkgbW9kZWxPYmplY3QsIHJlc291cmNlLmdldFJlc291cmNlU2V0KCkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNTdXBwcmVzc2VkKFZpZXcgdmlldykgewotCQlFT2JqZWN0IGVsZW1lbnQgPSB2aWV3LmdldEVsZW1lbnQoKTsKLQkJaWYoZWxlbWVudCBpbnN0YW5jZW9mIE5hbWVkTm9kZSkgewotCQkJcmV0dXJuICgoTmFtZWROb2RlKWVsZW1lbnQpLmlzU3VwcHJlc3NlZCgpOwotCQl9Ci0JCWVsc2UgaWYoZWxlbWVudCBpbnN0YW5jZW9mIEVNb2RlbEVsZW1lbnQpIHsKLQkJCU5vZGVBZGFwdGVyIG5vZGVBZGFwdGVyID0gZ2V0Tm9kZUFkYXB0ZXIoZWxlbWVudCk7Ci0JCQlpZihub2RlQWRhcHRlciAhPSBudWxsKSB7Ci0JCQkJT2JqZWN0IG8gPSBub2RlQWRhcHRlci5nZXRXcmFwcGVyKCk7Ci0JCQkJaWYobyA9PSBudWxsKSB7Ci0JCQkJCW8gPSBub2RlQWRhcHRlci5nZXRFbGVtZW50KCk7Ci0JCQkJfQotCQkJCW9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHkgYWN0aXZpdHkgPSAob3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eSkgZ2V0TWV0aG9kRWxlbWVudCh2aWV3LmdldERpYWdyYW0oKSk7Ci0JCQkJUHJvY2VzcyBwcm9jID0gVG5nVXRpbC5nZXRPd25pbmdQcm9jZXNzKGFjdGl2aXR5KTsKLQkJCQlTdXBwcmVzc2lvbiBzdXBwcmVzc2lvbiA9IFN1cHByZXNzaW9uLmdldFN1cHByZXNzaW9uKHByb2MpOwotCQkJCXJldHVybiBzdXBwcmVzc2lvbi5pc1N1cHByZXNzZWQobyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLS8vCXB1YmxpYyBzdGF0aWMgT2JqZWN0IGdldFNlbWFudGljTW9kZWwoVmlldyB2aWV3KSB7Ci0vLwkJRU9iamVjdCBlbGVtZW50ID0gdmlldy5nZXRFbGVtZW50KCk7Ci0vLwkJaWYoZWxlbWVudCBpbnN0YW5jZW9mIEVNb2RlbEVsZW1lbnQpIHsKLS8vCQkJcmV0dXJuIGdldFNlbWFudGljTW9kZWxGcm9tQW5ub3RhdGlvbihlbGVtZW50LCBwcm9jZXNzLCBhZGFwdGVyRmFjdG9yeSk7Ci0vLwkJfQotLy8JCWVsc2UgaWYoZWxlbWVudCBpbnN0YW5jZW9mICkKLS8vCQkJCi0vLwkJfQotLy8JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVMaW5rKEFjdGl2aXR5RWRnZSBsaW5rKSB7Ci0JCS8vIFRPRE86IHN0aWxsIG5lZWQgdG8gZGlzYWJsZSBub3RpZmljYXRpb24gYmVmb3JlIHJlbW92aW5nIGxpbms/Pz8KLQkJQWN0aXZpdHkgYWN0aXZpdHkgPSBsaW5rLmdldEFjdGl2aXR5KCk7Ci0JCUFjdGl2aXR5Tm9kZSBzb3VyY2VOb2RlID0gbGluay5nZXRTb3VyY2UoKTsKLQkJQWN0aXZpdHlOb2RlIHRhcmdldE5vZGUgPSBsaW5rLmdldFRhcmdldCgpOwotCQlib29sZWFuIHNyY05vdGlmeSA9IHNvdXJjZU5vZGUgIT0gbnVsbCA/IHNvdXJjZU5vZGUuZURlbGl2ZXIoKSA6IGZhbHNlOwotCQlib29sZWFuIHRhcmdldE5vdGlmeSA9IHRhcmdldE5vZGUgIT0gbnVsbCA/IHRhcmdldE5vZGUuZURlbGl2ZXIoKQotCQkJCTogZmFsc2U7Ci0JCXRyeSB7Ci0JCQlpZiAoc291cmNlTm9kZSAhPSBudWxsKSB7Ci0JCQkJc291cmNlTm9kZS5lU2V0RGVsaXZlcihmYWxzZSk7Ci0JCQl9Ci0JCQlpZiAodGFyZ2V0Tm9kZSAhPSBudWxsKSB7Ci0JCQkJdGFyZ2V0Tm9kZS5lU2V0RGVsaXZlcihmYWxzZSk7Ci0JCQl9Ci0JCQlsaW5rLnNldFNvdXJjZShudWxsKTsKLQkJCWxpbmsuc2V0VGFyZ2V0KG51bGwpOwotCQkJaWYoYWN0aXZpdHkgIT0gbnVsbCl7Ci0JCQkJYWN0aXZpdHkuZ2V0RWRnZXMoKS5yZW1vdmUobGluayk7Ci0JCQl9Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAoc291cmNlTm9kZSAhPSBudWxsKSB7Ci0JCQkJc291cmNlTm9kZS5lU2V0RGVsaXZlcihzcmNOb3RpZnkpOwotCQkJfQotCQkJaWYgKHRhcmdldE5vZGUgIT0gbnVsbCkgewotCQkJCXRhcmdldE5vZGUuZVNldERlbGl2ZXIodGFyZ2V0Tm90aWZ5KTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEZpbmRzIG5vZGUgd2hvc2UgbGlua2VkIG9iamVjdCBvciBvbmUgb2YgaXRzIGJhc2UgaXMgdGhlIGdpdmVuIG9iamVjdAotCSAqIAotCSAqIEBwYXJhbSBjb250YWluZXIKLQkgKiBAcGFyYW0gb2JqZWN0Ci0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQWN0aXZpdHlOb2RlIGZpbmROb2RlKEFjdGl2aXR5IGNvbnRhaW5lciwgT2JqZWN0IG9iamVjdCwKLQkJCWJvb2xlYW4gY2hlY2tCYXNlKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGNvbnRhaW5lci5nZXROb2RlcygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJQWN0aXZpdHlOb2RlIG5vZGUgPSAoQWN0aXZpdHlOb2RlKSBpdGVyLm5leHQoKTsKLQkJCU1ldGhvZEVsZW1lbnQgZSA9IEJyaWRnZUhlbHBlci5nZXRNZXRob2RFbGVtZW50KG5vZGUpOwotCQkJaWYgKG9iamVjdCA9PSBlKSB7Ci0JCQkJcmV0dXJuIG5vZGU7Ci0JCQl9IGVsc2UgaWYgKGNoZWNrQmFzZSAmJiBlIGluc3RhbmNlb2YgVmFyaWFiaWxpdHlFbGVtZW50KSB7Ci0JCQkJZm9yIChWYXJpYWJpbGl0eUVsZW1lbnQgdmUgPSAoKFZhcmlhYmlsaXR5RWxlbWVudCkgZSkKLQkJCQkJCS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCk7IHZlICE9IG51bGw7IHZlID0gdmUKLQkJCQkJCS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkpIHsKLQkJCQkJaWYgKHZlID09IG9iamVjdCkgewotCQkJCQkJcmV0dXJuIG5vZGU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzU3luY2hCYXIoQWN0aXZpdHlOb2RlIG5vZGUpIHsKLQkJcmV0dXJuIG5vZGUgaW5zdGFuY2VvZiBGb3JrTm9kZSB8fCBub2RlIGluc3RhbmNlb2YgSm9pbk5vZGU7Ci0JfQotCi0JLyoqCi0JICogRmluZHMgbm9kZSB3aG9zZSBsaW5rZWQgb2JqZWN0IGlzIHRoZSBnaXZlbiBvYmplY3QKLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBBY3Rpdml0eU5vZGUgZmluZE5vZGUoQWN0aXZpdHkgY29udGFpbmVyLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGNvbnRhaW5lci5nZXROb2RlcygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJQWN0aXZpdHlOb2RlIG5vZGUgPSAoQWN0aXZpdHlOb2RlKSBpdGVyLm5leHQoKTsKLQkJCWlmIChvYmplY3QgPT0gQnJpZGdlSGVscGVyLmdldE1ldGhvZEVsZW1lbnQobm9kZSkpIHsKLQkJCQlyZXR1cm4gbm9kZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFVSSSBnZXRQcm94eVVSSShNZXRob2RFbGVtZW50IGUpIHsKLQkJUmVzb3VyY2UgcmVzb3VyY2UgPSBlLmVSZXNvdXJjZSgpOwotCQlpZiAocmVzb3VyY2UgaW5zdGFuY2VvZiBJTGlicmFyeVJlc291cmNlKSB7Ci0JCQlyZXR1cm4gKChJTGlicmFyeVJlc291cmNlKSByZXNvdXJjZSkuZ2V0UHJveHlVUkkoZSk7Ci0JCX0gZWxzZSBpZiAocmVzb3VyY2UgIT0gbnVsbCkgewotCQkJcmV0dXJuIHJlc291cmNlLmdldFVSSSgpLmFwcGVuZEZyYWdtZW50KGUuZ2V0R3VpZCgpKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogQXNzb2NpYXRlcyBhIHtAbGluayBFTW9kZWxFbGVtZW50fSB3aXRoIGEge0BsaW5rIE1ldGhvZEVsZW1lbnR9IGJ5Ci0JICogY3JlYXRpbmcgb3IgdXBkYXRpbmcgdGhlIFVNQV9FTEVNRU5UIGFubm90YXRpb24gb2YgdGhlIGdpdmVuCi0JICoge0BsaW5rIEVNb2RlbEVsZW1lbnR9LgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogQHBhcmFtIG1lCi0JICogQHJldHVybiB0cnVlIGlmIHN1Y2Nlc3NmdWwsIGZhbHNlIG90aGVyd2lzZQotCSAqIEBzZWUgI2FkZEVBbm5vdGF0aW9uKEVNb2RlbEVsZW1lbnQsIE1ldGhvZEVsZW1lbnQpCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGFzc29jaWF0ZShFTW9kZWxFbGVtZW50IGVsZW1lbnQsIE1ldGhvZEVsZW1lbnQgbWUpIHsKLQkJRUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFkZEVBbm5vdGF0aW9uKGVsZW1lbnQsIG1lKTsKLQkJaWYoYW5ub3RhdGlvbiAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgdHlwZSA9IGdldFR5cGUobWUpOwotCQkJaWYodHlwZSAhPSBudWxsKSB7Ci0JCQkJYW5ub3RhdGlvbi5nZXREZXRhaWxzKCkucHV0KFVNQV9UWVBFLCB0eXBlKTsKLQkJCX0KLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBFQ2xhc3MgZ2V0VHlwZShTdHJpbmcgdHlwZSkgewotCQlyZXR1cm4gdHlwZVN0cmluZ1RvRUNsYXNzLmdldCh0eXBlKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0VHlwZShNZXRob2RFbGVtZW50IG1lKSB7Ci0JCWlmKG1lIGluc3RhbmNlb2YgUGhhc2UpIHsKLQkJCXJldHVybiBVTUFfUEhBU0U7Ci0JCX0KLQkJZWxzZSBpZihtZSBpbnN0YW5jZW9mIEl0ZXJhdGlvbikgewotCQkJcmV0dXJuIFVNQV9JVEVSQVRJT047Ci0JCX0KLQkJZWxzZSBpZihtZSBpbnN0YW5jZW9mIE1pbGVzdG9uZSkgewotCQkJcmV0dXJuIFVNQV9NSUxFU1RPTkU7Ci0JCX0KLQkJZWxzZSBpZihtZSBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHkpIHsKLQkJCXJldHVybiBVTUFfQUNUSVZJVFk7Ci0JCX0KLQkJZWxzZSBpZihtZSBpbnN0YW5jZW9mIFRhc2tEZXNjcmlwdG9yKSB7Ci0JCQlyZXR1cm4gVU1BX1RBU0tfREVTQ1JJUFRPUjsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0vLwkvKioKLS8vCSAqIENyZWF0ZXMgb3IgdXBkYXRlcyB0aGUgVU1BX0VMRU1FTlQgYW5ub3RhdGlvbiBmb3IgdGhlIGdpdmVuCi0vLwkgKiB7QGxpbmsgRU1vZGVsRWxlbWVudH0gd2l0aCB0aGUgZ2l2ZW4gbWV0aG9kIGVsZW1lbnQgb3IgaXRzIHdyYXBwZXIKLS8vCSAqIAotLy8JICogQHBhcmFtIGVsZW1lbnQKLS8vCSAqIEBwYXJhbSBtZQotLy8JICogQHJldHVybgotLy8JICovCi0vLwlwdWJsaWMgc3RhdGljIEVBbm5vdGF0aW9uIGFkZEVBbm5vdGF0aW9uKEVNb2RlbEVsZW1lbnQgZWxlbWVudCwgT2JqZWN0IGJyZWFrZG93bkVsZW1lbnRPcldyYXBwZXIpIHsKLS8vCQlTdHJpbmcgdXJpU3RyID0gbnVsbDsKLS8vCQlpZihicmVha2Rvd25FbGVtZW50T3JXcmFwcGVyIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotLy8JCQlVUkkgdXJpID0gZ2V0UHJveHlVUkkoKE1ldGhvZEVsZW1lbnQpIGJyZWFrZG93bkVsZW1lbnRPcldyYXBwZXIpOwotLy8JCQlpZih1cmkgIT0gbnVsbCkgewotLy8JCQkJdXJpU3RyID0gdXJpLnRvU3RyaW5nKCk7Ci0vLwkJCX0KLS8vCQl9Ci0vLwkJZWxzZSBpZihicmVha2Rvd25FbGVtZW50T3JXcmFwcGVyIGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpewotLy8JCQl1cmlTdHIgPSBTdXBwcmVzc2lvbi5nZXRQYXRoKChCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgYnJlYWtkb3duRWxlbWVudE9yV3JhcHBlcik7Ci0vLwkJfQotLy8JCWlmKHVyaVN0ciAhPSBudWxsKSB7Ci0vLwkJCUVBbm5vdGF0aW9uIGVBbm5vdGF0aW9uID0gZWxlbWVudC5nZXRFQW5ub3RhdGlvbihVTUFfRUxFTUVOVCk7Ci0vLwkJCWlmIChlQW5ub3RhdGlvbiA9PSBudWxsKSB7Ci0vLwkJCQllQW5ub3RhdGlvbiA9IEVjb3JlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRUFubm90YXRpb24oKTsKLS8vCQkJCWVBbm5vdGF0aW9uLnNldFNvdXJjZShVTUFfRUxFTUVOVCk7Ci0vLwkJCQllbGVtZW50LmdldEVBbm5vdGF0aW9ucygpLmFkZChlQW5ub3RhdGlvbik7Ci0vLwkJCX0KLS8vCQkJZUFubm90YXRpb24uZ2V0RGV0YWlscygpLnB1dChVTUFfVVJJLCB1cmlTdHIpOwotLy8JCQlyZXR1cm4gZUFubm90YXRpb247Ci0vLwkJfQotLy8JCXJldHVybiBudWxsOwotLy8JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgb3IgdXBkYXRlcyB0aGUgVU1BX0VMRU1FTlQgYW5ub3RhdGlvbiBmb3IgdGhlIGdpdmVuCi0JICoge0BsaW5rIEVNb2RlbEVsZW1lbnR9IHdpdGggdGhlIGdpdmVuIG1ldGhvZCBlbGVtZW50Ci0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiBAcGFyYW0gbWUKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBFQW5ub3RhdGlvbiBhZGRFQW5ub3RhdGlvbihFTW9kZWxFbGVtZW50IGVsZW1lbnQsCi0JCQlNZXRob2RFbGVtZW50IG1lKSB7Ci0JCVVSSSB1cmkgPSBnZXRQcm94eVVSSShtZSk7Ci0JCWlmICh1cmkgIT0gbnVsbCkgewotCQkJRUFubm90YXRpb24gZUFubm90YXRpb24gPSBlbGVtZW50LmdldEVBbm5vdGF0aW9uKFVNQV9FTEVNRU5UKTsKLQkJCWlmIChlQW5ub3RhdGlvbiA9PSBudWxsKSB7Ci0JCQkJZUFubm90YXRpb24gPSBFY29yZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUVBbm5vdGF0aW9uKCk7Ci0JCQkJZUFubm90YXRpb24uc2V0U291cmNlKFVNQV9FTEVNRU5UKTsKLQkJCQllbGVtZW50LmdldEVBbm5vdGF0aW9ucygpLmFkZChlQW5ub3RhdGlvbik7Ci0JCQl9Ci0JCQllQW5ub3RhdGlvbi5nZXREZXRhaWxzKCkucHV0KFVNQV9VUkksIHVyaS50b1N0cmluZygpKTsKLQkJCXJldHVybiBlQW5ub3RhdGlvbjsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBBY3Rpdml0eSBnZXRBY3Rpdml0eShFTW9kZWxFbGVtZW50IGUpIHsKLQkJRU9iamVjdCBvID0gZTsKLQkJZm9yKDsgbyAhPSBudWxsICYmICEobyBpbnN0YW5jZW9mIEFjdGl2aXR5KTsgbyA9IG8uZUNvbnRhaW5lcigpKTsKLQkJcmV0dXJuIChBY3Rpdml0eSkgbzsKLQl9Ci0JCi0vLwlwdWJsaWMgc3RhdGljIE9iamVjdCBnZXRTZW1hbnRpY01vZGVsRnJvbUFubm90YXRpb24oRU1vZGVsRWxlbWVudCBtb2RlbCwgUHJvY2VzcyBwcm9jZXNzLCBBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotLy8JCUVBbm5vdGF0aW9uIGVBbm5vdGF0aW9uID0gbW9kZWwuZ2V0RUFubm90YXRpb24oVU1BX0VMRU1FTlQpOwotLy8JCWlmIChlQW5ub3RhdGlvbiAhPSBudWxsKSB7Ci0vLwkJCVN0cmluZyB1cmlTdHIgPSAoU3RyaW5nKSBlQW5ub3RhdGlvbi5nZXREZXRhaWxzKCkuZ2V0KFVNQV9VUkkpOwotLy8JCQlpZiAodXJpU3RyICE9IG51bGwpIHsKLS8vCQkJCVVSSSB1cmkgPSBVUkkuY3JlYXRlVVJJKHVyaVN0cik7Ci0vLwkJCQlpZihNdWx0aUZpbGVVUklDb252ZXJ0ZXIuU0NIRU1FLmVxdWFscyh1cmkuc2NoZW1lKCkpKSB7Ci0vLwkJCQkJRU9iamVjdCBvID0gcHJvY2Vzcy5lUmVzb3VyY2UoKS5nZXRSZXNvdXJjZVNldCgpLmdldEVPYmplY3QodXJpLCBmYWxzZSk7Ci0vLwkJCQkJaWYgKG8gaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0vLwkJCQkJCXJldHVybiAoTWV0aG9kRWxlbWVudCkgbzsKLS8vCQkJCQl9IGVsc2UgewotLy8JCQkJCQkvLyBUT0RPOiBsb2cgZXJyb3IKLS8vCQkJCQkJU3lzdGVtLmVyci5wcmludGxuKCJOb3QgYSBtZXRob2QgZWxlbWVudDogIiArIG8pOyAvLyROT04tTkxTLTEkCi0vLwkJCQkJfQotLy8JCQkJfQotLy8JCQkJZWxzZSB7Ci0vLwkJCQkJLy8gbXVzdCBiZSBhIHdyYXBwZXIgcGF0aAotLy8JCQkJCS8vCi0vLwkJCQkJU3RyaW5nW10gZ3VpZFBhdGggPSB1cmkuc2VnbWVudHMoKTsKLS8vCQkJCQlyZXR1cm4gU3VwcHJlc3Npb24uZ2V0U3VwcHJlc3Npb24ocHJvY2VzcykuZ2V0T2JqZWN0QnlQYXRoKGd1aWRQYXRoLCBhZGFwdGVyRmFjdG9yeSk7Ci0vLwkJCQl9Ci0vLwkJCX0KLS8vCQl9Ci0vLwkJcmV0dXJuIG51bGw7Ci0vLwl9Ci0JCi0JcHVibGljIHN0YXRpYyBNZXRob2RFbGVtZW50IGdldE1ldGhvZEVsZW1lbnRGcm9tQW5ub3RhdGlvbihFTW9kZWxFbGVtZW50IG5vZGUsIFJlc291cmNlU2V0IHJlc291cmNlU2V0KSB7IAotICAgICAgICBFQW5ub3RhdGlvbiBlQW5ub3RhdGlvbiA9IG5vZGUuZ2V0RUFubm90YXRpb24oVU1BX0VMRU1FTlQpOyAKLSAgICAgICAgdHJ5IHsgCi0gICAgICAgICAgICBpZiAoZUFubm90YXRpb24gIT0gbnVsbCkgeyAKLSAgICAgICAgICAgICAgICBTdHJpbmcgdXJpID0gKFN0cmluZykgZUFubm90YXRpb24uZ2V0RGV0YWlscygpLmdldChVTUFfVVJJKTsgCi0gICAgICAgICAgICAgICAgaWYgKHVyaSAhPSBudWxsKSB7IAotICAgICAgICAgICAgICAgICAgICBFT2JqZWN0IG8gPSByZXNvdXJjZVNldC5nZXRFT2JqZWN0KCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVSSS5jcmVhdGVVUkkodXJpKSwgZmFsc2UpOyAKLSAgICAgICAgICAgICAgICAgICAgaWYgKG8gaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7IAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoTWV0aG9kRWxlbWVudCkgbzsgCi0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7IAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKERFQlVHKSB7IAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJOb3QgYSBtZXRob2QgZWxlbWVudDogIiArIG8pOyAvLyROT04tTkxTLTEkIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gCi0gICAgICAgICAgICAgICAgICAgIH0gCi0gICAgICAgICAgICAgICAgfSAKLSAgICAgICAgICAgIH0gCi0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7IAotICAgICAgICAgICAgICAgIERpYWdyYW1Db3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsgCi0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7IAotICAgICAgICB9IAotICAgICAgICAKLSAgICAgICAgcmV0dXJuIG51bGw7IAotCX0gCi0JCi0JCi0JLyoqCi0JICogR2V0cyB0aGUgbWV0aG9kIGVsZW1lbnQgdGhhdCB0aGUgZ2l2ZW4gZGlhZ3JhbSBtb2RlbCBvYmplY3QgcmVwcmVzZW50cwotCSAqIGFuZCBzdG9yZXMgdGhlIGxpbmthZ2UgaW5mbyBpbiBpdHMgYW5ub3RhdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gbm9kZQotCSAqICAgICAgICAgICAgdGhlIGRpYWdyYW0gbW9kZWwgb2JqZWN0Ci0JICogQHJldHVybiBtZXRob2QgZWxlbWVudCB0aGF0IHRoZSBtb2RlbCBvYmplY3QgaXMgcmVwcmVzZW50aW5nIG9yCi0JICogICAgICAgICA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgbW9kZWwgb2JqZWN0IGRvZXMgbm90IHJlcHJlc2VudCBhbnkKLQkgKiAgICAgICAgIG1ldGhvZCBlbGVtZW50IG9yIHRoZSBkaWFncmFtIG9mIHRoZSBtb2RlbCBvYmplY3QgY3VycmVudGx5IGlzCi0JICogICAgICAgICBub3Qgb3BlbmVkIGluIGEgZGlhZ3JhbSBlZGl0b3IuCi0JICovCi0JcHVibGljIHN0YXRpYyBNZXRob2RFbGVtZW50IGdldE1ldGhvZEVsZW1lbnRGcm9tQW5ub3RhdGlvbihFTW9kZWxFbGVtZW50IG5vZGUpIHsJCQotCQlBY3Rpdml0eSBkaWFncmFtID0gZ2V0QWN0aXZpdHkobm9kZSk7Ci0JCWlmKGRpYWdyYW0gPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJTm9kZUFkYXB0ZXIgbm9kZUFkYXB0ZXIgPSBnZXROb2RlQWRhcHRlcihkaWFncmFtKTsKLQkJaWYobm9kZUFkYXB0ZXIgPT0gbnVsbCB8fCBub2RlQWRhcHRlci5nZXRFbGVtZW50KCkgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJUmVzb3VyY2UgcmVzb3VyY2UgPSBub2RlQWRhcHRlci5nZXRFbGVtZW50KCkuZVJlc291cmNlKCk7Ci0JCWlmIChyZXNvdXJjZSAhPSBudWxsICYmIHJlc291cmNlLmdldFJlc291cmNlU2V0KCkgIT0gbnVsbCkgewotCQkJcmV0dXJuIGdldE1ldGhvZEVsZW1lbnRGcm9tQW5ub3RhdGlvbihub2RlLCByZXNvdXJjZS5nZXRSZXNvdXJjZVNldCgpKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBNZXRob2RFbGVtZW50IGdldE1ldGhvZEVsZW1lbnQoRU1vZGVsRWxlbWVudCBub2RlKSB7Ci0JCU5vZGVBZGFwdGVyIG5vZGVBZGFwdGVyID0gQnJpZGdlSGVscGVyLmdldE5vZGVBZGFwdGVyKG5vZGUpOwotCQlyZXR1cm4gbm9kZUFkYXB0ZXIgIT0gbnVsbCA/IG5vZGVBZGFwdGVyLmdldEVsZW1lbnQoKQotCQkJCTogZ2V0TWV0aG9kRWxlbWVudEZyb21Bbm5vdGF0aW9uKG5vZGUpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgTm9kZUFkYXB0ZXIgZ2V0Tm9kZUFkYXB0ZXIoRU9iamVjdCBub2RlKSB7Ci0JCWlmIChub2RlICE9IG51bGwpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IG5vZGUuZUFkYXB0ZXJzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IGFkYXB0ZXIgPSAoT2JqZWN0KSBpdGVyLm5leHQoKTsKLQkJCQlpZiAoYWRhcHRlciBpbnN0YW5jZW9mIE5vZGVBZGFwdGVyKSB7Ci0JCQkJCXJldHVybiAoTm9kZUFkYXB0ZXIpIGFkYXB0ZXI7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIERpYWdyYW1BZGFwdGVyIGdldERpYWdyYW1BZGFwdGVyKEVPYmplY3Qgbm9kZSkgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBub2RlLmVBZGFwdGVycygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGFkYXB0ZXIgPSAoT2JqZWN0KSBpdGVyLm5leHQoKTsKLQkJCWlmIChhZGFwdGVyIGluc3RhbmNlb2YgRGlhZ3JhbUFkYXB0ZXIpIHsKLQkJCQlyZXR1cm4gKERpYWdyYW1BZGFwdGVyKSBhZGFwdGVyOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIE1ldGhvZCB0byBnZXQgdGhlIHNvdXJjZXMgb2YgU3luY0JhciAoRm9ya05vZGUgb3IgSm9pbk5vZGUpIGluQ29tbWluZwotCSAqIGNvbm5lY3Rpb25zIGFuZCBpZiBzeW5jYmFyIGhhdmUgaW5jb21pbmcgY29ubmVjdGlvbiBmcm9tIGRlY2lzaW9uIHBvaW50LAotCSAqIGFuZCBkZWNpc2lvbiBwb2ludCBoYXZlIGluY29tbWluZyBjb25uZWN0aW9ucyAod29ya2JyZWFkZG93biBlbGVtdG5zKQotCSAqIGNvbGxlY3Rpb25zIHdpbGwgaWdub3JlIGFsbCB0aGUgaW5jb21pbmcgY29ubmVjdGlvbiBmcm9tIGRlY2lzaW9uIHBvaW50LgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgZ2V0U3luY0JhclNvdXJjZU5vZGVzKEFjdGl2aXR5Tm9kZSBub2RlLAotCQkJQ29sbGVjdGlvbiBhY3ROb2RlcykgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBub2RlLmdldEluY29taW5ncygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJQWN0aXZpdHlFZGdlIGxpbmsgPSAoQWN0aXZpdHlFZGdlKSBpdGVyLm5leHQoKTsKLQkJCUFjdGl2aXR5Tm9kZSBzb3VyY2UgPSBsaW5rLmdldFNvdXJjZSgpOwotCQkJaWYgKGdldE1ldGhvZEVsZW1lbnQoc291cmNlKSBpbnN0YW5jZW9mIFdvcmtCcmVha2Rvd25FbGVtZW50KSB7Ci0JCQkJYWN0Tm9kZXMuYWRkKHNvdXJjZSk7Ci0JCQl9IGVsc2UgaWYgKGlzU3luY2hCYXIoc291cmNlKSkgewotCQkJCWdldFN5bmNCYXJTb3VyY2VOb2Rlcyhzb3VyY2UsIGFjdE5vZGVzKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEdldHMgYWxsIG5vZGVzIHdpdGggdGhlIGdpdmVuIHR5cGUgdGhhdCBhcmUgZGlyZWN0IG9yIGluZGlyZWN0IHRhcmdldHMgb2YKLQkgKiB0aGUgZ2l2ZW4gbm9kZS4KLQkgKiAKLQkgKiBAcGFyYW0gYWN0Tm9kZXMKLQkgKiBAcGFyYW0gbm9kZQotCSAqIEBwYXJhbSB0eXBlCi0JICogICAgICAgICAgICB0aGUgdHlwZSBvZiBtZXRob2QgZWxlbWVudCBhc3NvY2lhdGVkIHdpdGggdGhlIHZpZXcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgZ2V0VGFyZ2V0Tm9kZXMoQ29sbGVjdGlvbiBhY3ROb2RlcywgQWN0aXZpdHlOb2RlIG5vZGUsCi0JCQlDbGFzcyB0eXBlKSB7Ci0JCWlmIChub2RlICE9IG51bGwpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IG5vZGUuZ2V0T3V0Z29pbmdzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJQWN0aXZpdHlFZGdlIGxpbmsgPSAoQWN0aXZpdHlFZGdlKSBpdGVyLm5leHQoKTsKLQkJCQlBY3Rpdml0eU5vZGUgdGFyZ2V0ID0gbGluay5nZXRUYXJnZXQoKTsKLQkJCQlpZiAodHlwZS5pc0luc3RhbmNlKGdldE1ldGhvZEVsZW1lbnQodGFyZ2V0KSkpIHsKLQkJCQkJYWN0Tm9kZXMuYWRkKHRhcmdldCk7Ci0JCQkJfSBlbHNlIGlmICh0YXJnZXQgaW5zdGFuY2VvZiBDb250cm9sTm9kZSkgewotCQkJCQlnZXRUYXJnZXROb2RlcyhhY3ROb2RlcywgdGFyZ2V0LCB0eXBlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIGdldFN1Y2Nlc3Nvck5vZGVzKENvbGxlY3Rpb248QWN0aXZpdHlOb2RlPiBhY3ROb2RlcywgQWN0aXZpdHlOb2RlIG5vZGUpIHsKLQkJaWYgKG5vZGUgIT0gbnVsbCkgewotCQkJZm9yIChBY3Rpdml0eUVkZ2UgbGluayA6IG5vZGUuZ2V0T3V0Z29pbmdzKCkpIHsKLQkJCQlBY3Rpdml0eU5vZGUgdGFyZ2V0ID0gbGluay5nZXRUYXJnZXQoKTsKLQkJCQlpZiAoZ2V0TWV0aG9kRWxlbWVudCh0YXJnZXQpIGluc3RhbmNlb2YgV29ya0JyZWFrZG93bkVsZW1lbnQpIHsKLQkJCQkJYWN0Tm9kZXMuYWRkKHRhcmdldCk7Ci0JCQkJfSBlbHNlIGlmIChpc1N5bmNoQmFyKHRhcmdldCkpIHsKLQkJCQkJZ2V0U3VjY2Vzc29yTm9kZXMoYWN0Tm9kZXMsIHRhcmdldCk7Ci0JCQkJfQotCQkJfQotCQl9CQkKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIGdldFByZWRlY2Vzc29yTm9kZXMoQ29sbGVjdGlvbjxBY3Rpdml0eU5vZGU+IGFjdE5vZGVzLCBBY3Rpdml0eU5vZGUgbm9kZSkgewotCQlpZiAobm9kZSAhPSBudWxsKSB7Ci0JCQlmb3IgKEFjdGl2aXR5RWRnZSBsaW5rIDogbm9kZS5nZXRJbmNvbWluZ3MoKSkgewotCQkJCUFjdGl2aXR5Tm9kZSBzb3VyY2UgPSBsaW5rLmdldFNvdXJjZSgpOwotCQkJCWlmIChnZXRNZXRob2RFbGVtZW50KHNvdXJjZSkgaW5zdGFuY2VvZiBXb3JrQnJlYWtkb3duRWxlbWVudCkgewotCQkJCQlhY3ROb2Rlcy5hZGQoc291cmNlKTsKLQkJCQl9IGVsc2UgaWYgKGlzU3luY2hCYXIoc291cmNlKSkgewotCQkJCQlnZXRQcmVkZWNlc3Nvck5vZGVzKGFjdE5vZGVzLCBzb3VyY2UpOwotCQkJCX0KLQkJCX0KLQkJfQkJCi0JfQotCQotCS8qKgotCSAqIEdldHMgYWxsIG5vZGVzIHdpdGggdGhlIGdpdmVuIHR5cGUgdGhhdCBhcmUgZGlyZWN0IG9yIGluZGlyZWN0IHNvdXJjZXMgb2YKLQkgKiB0aGUgZ2l2ZW4gbm9kZS4KLQkgKiAKLQkgKiBAcGFyYW0gYWN0Tm9kZXMKLQkgKiBAcGFyYW0gbm9kZQotCSAqIEBwYXJhbSB0eXBlCi0JICogICAgICAgICAgICB0aGUgdHlwZSBvZiBtZXRob2QgZWxlbWVudCBhc3NvY2lhdGVkIHdpdGggdGhlIHZpZXcKLQkgKi8KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBnZXRTb3VyY2VOb2RlcyhDb2xsZWN0aW9uIGFjdE5vZGVzLCBBY3Rpdml0eU5vZGUgbm9kZSwKLQkJCUNsYXNzIHR5cGUpIHsKLQkJaWYgKG5vZGUgIT0gbnVsbCkgewotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gbm9kZS5nZXRJbmNvbWluZ3MoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlBY3Rpdml0eUVkZ2UgbGluayA9IChBY3Rpdml0eUVkZ2UpIGl0ZXIubmV4dCgpOwotCQkJCUFjdGl2aXR5Tm9kZSBzb3VyY2UgPSBsaW5rLmdldFNvdXJjZSgpOwotCQkJCWlmICh0eXBlLmlzSW5zdGFuY2UoZ2V0TWV0aG9kRWxlbWVudChzb3VyY2UpKSkgewotCQkJCQlhY3ROb2Rlcy5hZGQoc291cmNlKTsKLQkJCQl9IGVsc2UgaWYgKHNvdXJjZSBpbnN0YW5jZW9mIENvbnRyb2xOb2RlKSB7Ci0JCQkJCWdldFNvdXJjZU5vZGVzKGFjdE5vZGVzLCBzb3VyY2UsIHR5cGUpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkKLQkvKgotCSAqIE1ldGhvZCB0byBjb2xsZWN0IHN5bmNocm9uaXphdGlvbiBiYXIgb3V0Z29pbmcgY29ubmVjdGlvbgotCSAqIGV4Y2VwdCBhbnkgY29ubmVjdGlvbiBnb2luZyB0byBkZWNpc2lvbiBwb2ludHMuICAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgZ2V0U3luY0JhclRhcmdldE5vZGVzKEFjdGl2aXR5Tm9kZSB0eXBlZE5vZGUsIENvbGxlY3Rpb24gYWN0Tm9kZXMpewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB0eXBlZE5vZGUuZ2V0T3V0Z29pbmdzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJQWN0aXZpdHlFZGdlIGxpbmsgPSAoQWN0aXZpdHlFZGdlKSBpdGVyLm5leHQoKTsKLQkJCQlBY3Rpdml0eU5vZGUgdGFyZ2V0ID0gbGluay5nZXRUYXJnZXQoKTsKLQkJCQlpZihCcmlkZ2VIZWxwZXIuZ2V0TWV0aG9kRWxlbWVudCh0YXJnZXQpIGluc3RhbmNlb2YgV29ya0JyZWFrZG93bkVsZW1lbnQpewotCQkJCQlhY3ROb2Rlcy5hZGQodGFyZ2V0KTsKLQkJCQl9IGVsc2UgaWYgKGlzU3luY2hCYXIodGFyZ2V0KSkgewotCQkJCQlnZXRTeW5jQmFyVGFyZ2V0Tm9kZXModGFyZ2V0LCBhY3ROb2Rlcyk7Ci0JCQkJfQotCQl9Ci0JfQotCQotCS8qKgotCSAqIE1ldGhvZCB0byBjaGVjayBiZWZvcmUgZGVsZXRpbmcgYSBsaW5rLiBJZiBkdXBsaWNhdGUgcHJlZGVjZXNzb3IgZXhpc3RzCi0JICogaW4gdGhlIGxlZ2FjeSBkYXRhLCBjaGVjayBpZiBkZWxldGluZyBsaW5rIHNob3VsZCByZW1vdmUgYWxsIHRoZQotCSAqIHByZWRlY2Vzc29ycyBvciBub3QgYnkgdmVyaWZ5aW5nIGlmIHRhcmdldCBvciBpbmRpcmVjdCB0YXJnZXQgaGF2ZSBkaXJlY3QKLQkgKiBvciBpbmRpcmVjdCBsaW5rcy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY2FuUmVtb3ZlQWxsUHJlZHMoQWN0aXZpdHlFZGdlIGxpbmssIEFjdGl2aXR5Tm9kZSBvbGRTb3VyY2UsCi0JCQlBY3Rpdml0eU5vZGUgb2xkVGFyZ2V0KSB7Ci0JCU1ldGhvZEVsZW1lbnQgdGFyZ2V0RWxlbWVudCA9IGdldE1ldGhvZEVsZW1lbnQob2xkVGFyZ2V0KTsKLQkJaWYgKHRhcmdldEVsZW1lbnQgaW5zdGFuY2VvZiBXb3JrQnJlYWtkb3duRWxlbWVudCkgewotCQkJTGlzdCBpbmxpc3QgPSBvbGRUYXJnZXQuZ2V0SW5jb21pbmdzKCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0b3IgPSBpbmxpc3QuaXRlcmF0b3IoKTsgaXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJQWN0aXZpdHlFZGdlIGluY29taW5nbGluayA9IChBY3Rpdml0eUVkZ2UpIGl0b3IubmV4dCgpOwotCQkJCS8vIFJBVExDMDAzODQyNDUgOiBQcmVkZWNlc3NvciBjaGFuZ2VzIHNob3VsZCBiZSBkb25lIG9ubHkgaW4KLQkJCQkvLyBjYXNlIG9mIFN5bmNocm9uaXphdGlvbiBCYXIuCi0JCQkJaWYgKGlzU3luY2hCYXIoaW5jb21pbmdsaW5rLmdldFNvdXJjZSgpKSkgewotCQkJCQlDb2xsZWN0aW9uIGNvbCA9IG5ldyBBcnJheUxpc3QoKTsgCi0JCQkJCWdldFNvdXJjZU5vZGVzKGNvbCwgaW5jb21pbmdsaW5rLmdldFNvdXJjZSgpLAotCQkJCQkJCVdvcmtCcmVha2Rvd25FbGVtZW50LmNsYXNzKTsKLQkJCQkJaWYgKGNvbC5jb250YWlucyhvbGRTb3VyY2UpKSB7Ci0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgaWYgKGluY29taW5nbGluay5nZXRTb3VyY2UoKSAhPSBudWxsICYmCi0JCQkJCQlnZXRNZXRob2RFbGVtZW50KGluY29taW5nbGluay5nZXRTb3VyY2UoKSkgaW5zdGFuY2VvZiBXb3JrQnJlYWtkb3duRWxlbWVudCkgewotCQkJCQlpZiAoaW5jb21pbmdsaW5rLmdldFNvdXJjZSgpLmVxdWFscyhvbGRTb3VyY2UpKQotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIG1hcmtJbmhlcml0ZWQoRU1vZGVsRWxlbWVudCBlbGVtZW50KSB7Ci0JCUVBbm5vdGF0aW9uIGVBbm5vdGF0aW9uID0gZWxlbWVudC5nZXRFQW5ub3RhdGlvbihBTk5PVEFUSU9OX0lOSEVSSVJFRCk7Ci0JCWlmIChlQW5ub3RhdGlvbiA9PSBudWxsKSB7Ci0JCQllQW5ub3RhdGlvbiA9IEVjb3JlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRUFubm90YXRpb24oKTsKLQkJCWVBbm5vdGF0aW9uLnNldFNvdXJjZShBTk5PVEFUSU9OX0lOSEVSSVJFRCk7Ci0JCQllbGVtZW50LmdldEVBbm5vdGF0aW9ucygpLmFkZChlQW5ub3RhdGlvbik7Ci0JCX0KLQl9Ci0JcHVibGljIHN0YXRpYyB2b2lkIHVubWFya0luSGVyaXRlZChFTW9kZWxFbGVtZW50IGVsZW1lbnQpIHsKLQkJRUFubm90YXRpb24gZUFubm90YXRpb24gPSBlbGVtZW50LmdldEVBbm5vdGF0aW9uKEFOTk9UQVRJT05fSU5IRVJJUkVEKTsKLQkJaWYgKGVBbm5vdGF0aW9uICE9IG51bGwpIHsKLQkJCWVsZW1lbnQuZ2V0RUFubm90YXRpb25zKCkucmVtb3ZlKGVBbm5vdGF0aW9uKTsKLQkJfQotCX0KLQkKLQotCXB1YmxpYyBzdGF0aWMgRGlhZ3JhbSBjb3B5RGlhZ3JhbShEaWFncmFtIGJhc2VEaWFncmFtKSB7Ci0JCURpYWdyYW0gY29weSA9IChEaWFncmFtKSBFY29yZVV0aWwuY29weShiYXNlRGlhZ3JhbSk7Ci0KLQkJLy8gSEFDSzoKLQkJLy8gZ28gdGhydSB0aGUgbm9kZXMgb2YgdGhlIGRpYWdyYW0gY29weSwgaWYgYW55IG5vZGUgaXMgYSBVSS1vbmx5IG5vZGUKLQkJLy8gKHNlZSBUeXBlZE5vZGUpCi0JCS8vIHNhdmUgdGhlIEdVSUQgb2YgdGhlIG9yaWdpbmFsIG9uZSBpbiBpdHMgYnJpZWZEZXNjcmlwdGlvbiB0byByZW1lbWJlcgotCQkvLyB3aG8gaXMgYmFzZS4KLQkJLy8KLS8vCQlpbnQgc2l6ZSA9IGNvcHkuZ2V0Q29udGFpbmVkKCkuc2l6ZSgpOwotLy8JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0vLwkJCUdyYXBoTm9kZSBnTm9kZSA9IChHcmFwaE5vZGUpIGNvcHkuZ2V0Q29udGFpbmVkKCkuZ2V0KGkpOwotLy8JCQlpZiAoR3JhcGhpY2FsRGF0YUhlbHBlci5pc1VJR3JhcGhOb2RlKGdOb2RlKSkgewotLy8JCQkJZ05vZGUuc2V0QnJpZWZEZXNjcmlwdGlvbigoKERpYWdyYW1FbGVtZW50KSBiYXNlRGlhZ3JhbQotLy8JCQkJCQkuZ2V0Q29udGFpbmVkKCkuZ2V0KGkpKS5nZXRHdWlkKCkpOwotLy8JCQl9Ci0vLwkJfQotCQlMaXN0IGNoaWxkcmVuID0gY29weS5nZXRDaGlsZHJlbigpOwotCQlpbnQgc2l6ZSA9IGNoaWxkcmVuLnNpemUoKTsJCQotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJVmlldyB2aWV3ID0gKFZpZXcpIGNoaWxkcmVuLmdldChpKTsKLQkJCW1hcmtJbmhlcml0ZWQodmlldyk7Ci0JCX0KLQotCQlyZXR1cm4gY29weTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIEVMaXN0IGFkZEVBbm5vdGF0aW9uRGV0YWlsKEVNb2RlbEVsZW1lbnQgZWxlbWVudCwgU3RyaW5nIGRldGFpbE5hbWUsIFN0cmluZyBkZXRhaWxWYWx1ZSApIHsKLQkJRUFubm90YXRpb24gZUFubm90YXRpb24gPSBlbGVtZW50LmdldEVBbm5vdGF0aW9uKFVNQV9FTEVNRU5UKTsKLQkJaWYgKGVBbm5vdGF0aW9uID09IG51bGwpIHsKLQkJCWVBbm5vdGF0aW9uID0gRWNvcmVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVFQW5ub3RhdGlvbigpOwotCQkJZUFubm90YXRpb24uc2V0U291cmNlKFVNQV9FTEVNRU5UKTsKLQkJCS8vIGRldGFpbCBtdXN0IGJlIHB1dCBiZWZvcmUgdGhlIG5ldyBhbm5vdGF0aW9uIGNhbiBiZSBhZGRlZCB0byB0aGUgYW5ub3RhdGlvbiBsaXN0Ci0JCQkvLyBzbyBhbnkgYWRhcHRlciB0aGF0IGxpc3RlbiB0byBjaGFuZ2UgaW4gdGhlIGFubm90YXRpb24gbGlzdCBjYW4gZ2V0IHRoZSBkZXRhaWxzCi0JCQkvLyB3aGVuIGl0IGdldHMgbm90aWZpZWQuCi0JCQkvLwotCQkJZUFubm90YXRpb24uZ2V0RGV0YWlscygpLnB1dChVTUFfVFlQRSwgZGV0YWlsVmFsdWUpOwotCQkJZWxlbWVudC5nZXRFQW5ub3RhdGlvbnMoKS5hZGQoZUFubm90YXRpb24pOwotCQl9Ci0JCWVsc2UgewotCQkJZUFubm90YXRpb24uZ2V0RGV0YWlscygpLnB1dChVTUFfVFlQRSwgZGV0YWlsVmFsdWUpOwotCQl9CQkKLQkJcmV0dXJuIGVsZW1lbnQuZ2V0RUFubm90YXRpb25zKCk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgYW5kL29yIGFkZHMgdGhlIGVBbm5vdGF0aW9uIGRldGFpbCBmb3IgdHlwZS4ge0BsaW5rIEJyaWRnZUhlbHBlci5VTUFfVFlQRX0KLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqIEBwYXJhbSB0eXBlCi0JICovCi0JcHVibGljIHN0YXRpYyBFTGlzdCBhZGRFQW5ub3RhdGlvblR5cGUoRU1vZGVsRWxlbWVudCBlbGVtZW50LCBTdHJpbmcgdHlwZSkgewotCQlFTGlzdCByZXN1bHQgPSBhZGRFQW5ub3RhdGlvbkRldGFpbChlbGVtZW50LCBVTUFfVFlQRSwgdHlwZSk7Ci0JCQotCQlpZihlbGVtZW50IGluc3RhbmNlb2YgQWN0aXZpdHlOb2RlKSB7Ci0JCQlBY3Rpdml0eU5vZGUgbm9kZSA9IChBY3Rpdml0eU5vZGUpIGVsZW1lbnQ7Ci0vLwkJCUFjdGl2aXR5UGFyYW1ldGVyTm9kZSBub2RlID0gKEFjdGl2aXR5UGFyYW1ldGVyTm9kZSkgZWxlbWVudDsKLQkJCU1ldGhvZEVsZW1lbnQgZSA9IEJyaWRnZUhlbHBlci5nZXRNZXRob2RFbGVtZW50KG5vZGUpOwkJCQkKLQkJCWlmKGUgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50ICYmIAotCQkJCQl0eXBlICE9IG51bGwgJiYgIXR5cGUuZXF1YWxzKEJyaWRnZUhlbHBlci5nZXRUeXBlKGUpKSkgewotCQkJCS8vIHJlcGxhY2UgdGhlIGN1cnJlbnRseSBsaW5rZWQgbWV0aG9kIGVsZW1lbnQgd2l0aCB0aGUgcmlnaHQgb25lCi0JCQkJLy8KLQkJCQlFQ2xhc3MgcmlnaHRUeXBlID0gZ2V0VHlwZSh0eXBlKTsKLQkJCQlpZihyaWdodFR5cGUgIT0gbnVsbCkgewotCQkJCQlCcmVha2Rvd25FbGVtZW50IHJpZ2h0RWxlbWVudCA9IChCcmVha2Rvd25FbGVtZW50KSBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGUocmlnaHRUeXBlKTsKLQkJCQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eSBhY3Rpdml0eSA9ICgoQnJlYWtkb3duRWxlbWVudCllKS5nZXRTdXBlckFjdGl2aXRpZXMoKTsKLQkJCQkJaWYoYWN0aXZpdHkgIT0gbnVsbCkgewotCQkJCQkJTGlzdCBsaXN0ID0gYWN0aXZpdHkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKTsKLQkJCQkJCWxpc3Quc2V0KGxpc3QuaW5kZXhPZihlKSwgcmlnaHRFbGVtZW50KTsKLQkJCQkJCVByb2Nlc3NQYWNrYWdlIHBrZyA9IChQcm9jZXNzUGFja2FnZSkgYWN0aXZpdHkuZUNvbnRhaW5lcigpOwotCQkJCQkJaWYgKHBrZyAhPSBudWxsKSB7Ci0JCQkJCQkJcGtnLmdldFByb2Nlc3NFbGVtZW50cygpLmFkZChyaWdodEVsZW1lbnQpOwotCQkJCQkJCS8vIEFsc28gc2V0IHRoZSByaWdodEVsZW1lbnQgdG8gaXRzIG93biBwcm9jZXNzIHBhY2thZ2UuCi0JCQkJCQkJTGlzdCBjaGlsZFBrZ3MgPSBwa2cuZ2V0Q2hpbGRQYWNrYWdlcygpOwotCQkJCQkJCWlmICghY2hpbGRQa2dzLmlzRW1wdHkoKSkgewotCQkJCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBwa2cuZ2V0Q2hpbGRQYWNrYWdlcygpCi0JCQkJCQkJCQkJLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQkJCQkJUHJvY2Vzc1BhY2thZ2UgY2hpbGQgPSAoUHJvY2Vzc1BhY2thZ2UpIGl0ZXIKLQkJCQkJCQkJCS5uZXh0KCk7Ci0JCQkJCQkJCQlMaXN0PFByb2Nlc3NFbGVtZW50PiBwTGlzdCA9IGNoaWxkCi0JCQkJCQkJCQkuZ2V0UHJvY2Vzc0VsZW1lbnRzKCk7Ci0JCQkJCQkJCQlpZiAoIXBMaXN0LmlzRW1wdHkoKSkgewotCQkJCQkJCQkJCWlmIChwTGlzdC5jb250YWlucyhlKSkgewotCQkJCQkJCQkJCQlwTGlzdC5zZXQocExpc3QuaW5kZXhPZihlKSwKLQkJCQkJCQkJCQkJCQlyaWdodEVsZW1lbnQpOwotCQkJCQkJCQkJCX0KLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQotCQkJCQkJLy8gYXNzb2NpYXRlIHRoZSBuZXcgbWV0aG9kIGVsZW1lbnQgd2l0aCB0aGUgbm9kZQotCQkJCQkJLy8KLQkJCQkJCWFzc29jaWF0ZShub2RlLCByaWdodEVsZW1lbnQpOwotCQkJCQkJLy8gcmVtb3ZlIG9sZCBub2RlIGFkYXB0ZXIgYW5kIGFkZCBuZXcgb25lCi0JCQkJCQkvLwotCQkJCQkJTm9kZUFkYXB0ZXIgbm9kZUFkYXB0ZXIgPSBCcmlkZ2VIZWxwZXIuZ2V0Tm9kZUFkYXB0ZXIobm9kZSk7Ci0JCQkJCQlpZihub2RlQWRhcHRlciAhPSBudWxsKSB7Ci0JCQkJCQkJbm9kZUFkYXB0ZXIuZGlzcG9zZSgpOwotCQkJCQkJfQkJCQkJCi0JCQkJCQlEaWFncmFtQWRhcHRlciBkaWFncmFtQWRhcHRlciA9IChEaWFncmFtQWRhcHRlcikgZ2V0Tm9kZUFkYXB0ZXIobm9kZS5nZXRBY3Rpdml0eSgpKTsKLQkJCQkJCWRpYWdyYW1BZGFwdGVyLmFkZE5vZGVBZGFwdGVyVG8obm9kZSk7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCX0KLQkJfQotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCQotCS8qKgotCSAqIFRvIGdldCB0aGUgZUFubm90YXRpb24gZGV0YWlsIGJhc2VkIG9uIG5hbWUuIChlZzogdHlwZSkKLQkgKiBAZGVwcmVjYXRlZCByZXBsYWNlZCB3aXRoIHtAbGluayAjZ2V0RUFubm90YXRpb25EZXRhaWwoRU1vZGVsRWxlbWVudCwgU3RyaW5nKX0KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRFQW5ub3RhdGlvblR5cGUoRU1vZGVsRWxlbWVudCBlbGVtZW50LCBTdHJpbmcgZGV0YWlsTmFtZSkgewotCQlyZXR1cm4gZ2V0RUFubm90YXRpb25EZXRhaWwoZWxlbWVudCwgZGV0YWlsTmFtZSk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEVBbm5vdGF0aW9uRGV0YWlsKEVNb2RlbEVsZW1lbnQgZWxlbWVudCwgU3RyaW5nIGRldGFpbE5hbWUpIHsKLQkJRUFubm90YXRpb24gZUFubm90YXRpb24gPSBlbGVtZW50LmdldEVBbm5vdGF0aW9uKFVNQV9FTEVNRU5UKTsKLQkJaWYoZUFubm90YXRpb24gIT0gbnVsbCl7Ci0JCQlyZXR1cm4gKFN0cmluZyllQW5ub3RhdGlvbi5nZXREZXRhaWxzKCkuZ2V0KGRldGFpbE5hbWUpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRUeXBlKEFjdGl2aXR5Tm9kZSBub2RlKSB7Ci0JCXJldHVybiBnZXRFQW5ub3RhdGlvbkRldGFpbChub2RlLCBVTUFfVFlQRSk7Ci0JfQotCQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBlCi0JICogQHJldHVybiBvbmUgb2YgdGhlIHR5cGUgY29uc3RhbnRzOiB7QGxpbmsgI1VNQV9BQ1RJVklUWX0sCi0JICogICAgICAgICB7QGxpbmsgI1VNQV9JVEVSQVRJT059LCB7QGxpbmsgI1VNQV9NSUxFU1RPTkV9LAotCSAqICAgICAgICAge0BsaW5rICNVTUFfUEhBU0V9LCB7QGxpbmsgI1VNQV9UQVNLX0RFU0NSSVBUT1J9LAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFR5cGUoQnJlYWtkb3duRWxlbWVudCBlKSB7Ci0JCWlmKGUgaW5zdGFuY2VvZiBJdGVyYXRpb24pIHsKLQkJCXJldHVybiBVTUFfSVRFUkFUSU9OOwotCQl9Ci0JCWVsc2UgaWYoZSBpbnN0YW5jZW9mIFBoYXNlKSB7Ci0JCQlyZXR1cm4gVU1BX1BIQVNFOwotCQl9Ci0JCWVsc2UgaWYoZSBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHkpIHsKLQkJCXJldHVybiBVTUFfQUNUSVZJVFk7Ci0JCX0KLQkJZWxzZSBpZihlIGluc3RhbmNlb2YgTWlsZXN0b25lKSB7Ci0JCQlyZXR1cm4gVU1BX01JTEVTVE9ORTsKLQkJfQotCQllbHNlIGlmKGUgaW5zdGFuY2VvZiBUYXNrRGVzY3JpcHRvcikgewotCQkJcmV0dXJuIFVNQV9UQVNLX0RFU0NSSVBUT1I7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNJbmhlcml0ZWQoRU1vZGVsRWxlbWVudCBlKXsKLQkJRUFubm90YXRpb24gZUFubm90YXRpb24gPSBlLmdldEVBbm5vdGF0aW9uKEFOTk9UQVRJT05fSU5IRVJJUkVEKTsKLQkJaWYgKGVBbm5vdGF0aW9uICE9IG51bGwpIHsKLQkJCVN0cmluZyBzb3VyY2UgPSBlQW5ub3RhdGlvbi5nZXRTb3VyY2UoKTsKLQkJCWlmKHNvdXJjZSAhPSBudWxsICYmIHNvdXJjZS5sZW5ndGgoKSA+IDApewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgRUNsYXNzIGdldEVDbGFzc0Zyb21UeXBlKFN0cmluZyBhbm5vdGF0aW9uVHlwZSkgewotCQlpZihVTUFfQUNUSVZJVFkuZXF1YWxzKGFubm90YXRpb25UeXBlKSkgewotCQkJcmV0dXJuIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEFjdGl2aXR5KCk7Ci0JCX0KLQkJZWxzZSBpZihVTUFfSVRFUkFUSU9OLmVxdWFscyhhbm5vdGF0aW9uVHlwZSkpIHsKLQkJCXJldHVybiBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRJdGVyYXRpb24oKTsKLQkJfSBlbHNlIGlmKFVNQV9NSUxFU1RPTkUuZXF1YWxzKGFubm90YXRpb25UeXBlKSkgewotCQkJcmV0dXJuIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE1pbGVzdG9uZSgpOwotCQl9IGVsc2UgaWYoVU1BX1BIQVNFLmVxdWFscyhhbm5vdGF0aW9uVHlwZSkpIHsKLQkJCXJldHVybiBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRQaGFzZSgpOwotCQl9IGVsc2UgaWYoVU1BX1RBU0tfREVTQ1JJUFRPUi5lcXVhbHMoYW5ub3RhdGlvblR5cGUpKSB7Ci0JCQlyZXR1cm4gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza0Rlc2NyaXB0b3IoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldERlZmF1bHROYW1lKEFjdGl2aXR5Tm9kZSBub2RlKSB7Ci0JCUFjdGl2aXR5IHBhcmVudEFjdCA9IG5vZGUuZ2V0QWN0aXZpdHkoKTsKLQkJTWV0aG9kRWxlbWVudCBlbGVtZW50ID0gQnJpZGdlSGVscGVyLmdldE1ldGhvZEVsZW1lbnQocGFyZW50QWN0KTsKLQkJTWV0aG9kRWxlbWVudCBvYmogPSBCcmlkZ2VIZWxwZXIuZ2V0TWV0aG9kRWxlbWVudChub2RlKTsKLQkJaW50IGNsYXNzSUQgPSBvYmouZUNsYXNzKCkuZ2V0Q2xhc3NpZmllcklEKCk7Ci0JCW9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHkgYWN0ID0gKG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHkpIGVsZW1lbnQ7Ci0JCUFycmF5TGlzdCBzaWJsaW5ncyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gYWN0LmdldEJyZWFrZG93bkVsZW1lbnRzKCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQlCcmVha2Rvd25FbGVtZW50IGUgPSAoQnJlYWtkb3duRWxlbWVudCkgaXRlci5uZXh0KCk7Ci0JCQlpZiAoZS5lQ2xhc3MoKS5nZXRDbGFzc2lmaWVySUQoKSA9PSBjbGFzc0lEKSB7Ci0JCQkJc2libGluZ3MuYWRkKGUpOwotCQkJfQotCQl9Ci0JCVN0cmluZyBiYXNlTmFtZSA9IE1lc3NhZ2VGb3JtYXQKLQkJCQkuZm9ybWF0KAotCQkJCQkJRGlhZ3JhbVJlc291cmNlcy5kZWZhdWx0QmFzZU5hbWUsIG5ldyBPYmplY3RbXSB7IFRuZ1V0aWwuZ2V0VHlwZVRleHQob2JqLmVDbGFzcygpLmdldE5hbWUoKSkgfSk7IAotCQlUbmdVdGlsLnNldERlZmF1bHROYW1lKHNpYmxpbmdzLCBvYmosIGJhc2VOYW1lKTsKLQkJbm9kZS5zZXROYW1lKG9iai5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFZpZXcgZ2V0VmlldyhWaWV3IGRpYWdyYW0sIE9iamVjdCBub2RlKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGRpYWdyYW0uZ2V0Q2hpbGRyZW4oKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCVZpZXcgY2hpbGQgPSAoVmlldykgaXRlci5uZXh0KCk7Ci0JCQlpZihjaGlsZC5nZXRFbGVtZW50KCkgPT0gbm9kZSkgewotCQkJCXJldHVybiBjaGlsZDsKLQkJCX0KLQkJCWlmKGNoaWxkLmdldEVsZW1lbnQoKSBpbnN0YW5jZW9mIEFjdGl2aXR5UGFydGl0aW9uKXsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gY2hpbGQuZ2V0Q2hpbGRyZW4oKS5pdGVyYXRvcigpOyBpdGVyYXRvcgotCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJVmlldyBlbGVtZW50ID0gKFZpZXcpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJaWYoZWxlbWVudC5nZXRFbGVtZW50KCkgPT0gbm9kZSkgewotCQkJCQkJcmV0dXJuIGNoaWxkOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEdldHMgbm9kZSBuYW1lIGZvciB0aGUgZ2l2ZW4gbWV0aG9kIGVsZW1lbnQuCi0JICogCi0JICogQHBhcmFtIGUKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0Tm9kZU5hbWUoTWV0aG9kRWxlbWVudCBlKSB7Ci0JCWlmKGUgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50KSB7Ci0JCQlyZXR1cm4gUHJvY2Vzc1V0aWwuZ2V0UHJlc2VudGF0aW9uTmFtZSgoQnJlYWtkb3duRWxlbWVudCkgZSk7Ci0JCX0KLQkJZWxzZSBpZihlIGluc3RhbmNlb2YgRGVzY3JpYmFibGVFbGVtZW50KSB7Ci0JCQlyZXR1cm4gKChEZXNjcmliYWJsZUVsZW1lbnQpZSkuZ2V0UHJlc2VudGF0aW9uTmFtZSgpOwotCQl9Ci0JCWVsc2UgewotCQkJcmV0dXJuIGUuZ2V0TmFtZSgpOwotCQl9Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vY29yZS9icmlkZ2UvQ29udHJvbE5vZGVBZGFwdGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9jb3JlL2JyaWRnZS9Db250cm9sTm9kZUFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODVlZDM0YS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9jb3JlL2JyaWRnZS9Db250cm9sTm9kZUFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzOCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5icmlkZ2U7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JQWN0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya0JyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrT3JkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuQWN0aXZpdHlFZGdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkFjdGl2aXR5Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5Db250cm9sTm9kZTsKLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICoKLSAqIEBzaW5jZSAxLjIKLSAqLwotcHVibGljIGNsYXNzIENvbnRyb2xOb2RlQWRhcHRlciBleHRlbmRzIE5vZGVBZGFwdGVyIHsKLQotCXByb3RlY3RlZCBib29sZWFuIGFkZFRvVU1BKEFjdGl2aXR5RWRnZSBsaW5rKSB7Ci0JCWlmICghc3VwZXIuYWRkVG9VTUEobGluaykpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJTWV0aG9kRWxlbWVudCBzcmNFbGVtZW50ID0gQnJpZGdlSGVscGVyLmdldE1ldGhvZEVsZW1lbnQobGluay5nZXRTb3VyY2UoKSk7Ci0JCWlmIChzcmNFbGVtZW50IGluc3RhbmNlb2YgV29ya0JyZWFrZG93bkVsZW1lbnQpIHsKLQkJCWlmIChCcmlkZ2VIZWxwZXIuaXNTeW5jaEJhcihsaW5rLmdldFRhcmdldCgpKSkgewotCQkJCUNvbGxlY3Rpb24gdGFyZ2V0QWN0Tm9kZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJQnJpZGdlSGVscGVyLmdldFN5bmNCYXJUYXJnZXROb2RlcyhsaW5rCi0JCQkJCQkuZ2V0VGFyZ2V0KCksIHRhcmdldEFjdE5vZGVzKTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB0YXJnZXRBY3ROb2Rlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJQWN0aXZpdHlOb2RlIG5vZGUgPSAoQWN0aXZpdHlOb2RlKSBpdGVyLm5leHQoKTsKLQkJCQkJV29ya0JyZWFrZG93bkVsZW1lbnQgdGFyZ2V0RWxlbWVudCA9IChXb3JrQnJlYWtkb3duRWxlbWVudCkgQnJpZGdlSGVscGVyLmdldE1ldGhvZEVsZW1lbnQobm9kZSk7Ci0JCQkJCWlmIChVbWFVdGlsLmZpbmRXb3JrT3JkZXIodGFyZ2V0RWxlbWVudCwgc3JjRWxlbWVudCkgPT0gbnVsbCkgewotCQkJCQkJYWRkRGVmYXVsdFdvcmtPcmRlcihub2RlLCAoV29ya0JyZWFrZG93bkVsZW1lbnQpIHNyY0VsZW1lbnQpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9IGVsc2UgaWYgKEJyaWRnZUhlbHBlci5pc1N5bmNoQmFyKGxpbmsuZ2V0U291cmNlKCkpKSB7Ci0JCQkvLyBQcmVkZWNlc3NvciBzaG91bGQgYmUgY3JlYXRlZCBvbmx5IGluIGNhc2Ugb2YKLQkJCS8vIFN5bmNyb25pemF0aW9uIEJhciwgbm90IGZvciBEZWNpc2lvblBvaW50LgotCQkJQ29sbGVjdGlvbiBzcmNBY3ROb2RlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCUJyaWRnZUhlbHBlci5nZXRTeW5jQmFyU291cmNlTm9kZXMobGluay5nZXRTb3VyY2UoKSwgc3JjQWN0Tm9kZXMpOwotCQkJQ29sbGVjdGlvbiB0YXJnZXRBY3ROb2RlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCUJyaWRnZUhlbHBlci5nZXRTeW5jQmFyVGFyZ2V0Tm9kZXMobGluay5nZXRUYXJnZXQoKSwgdGFyZ2V0QWN0Tm9kZXMpOwotCi0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB0YXJnZXRBY3ROb2Rlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlBY3Rpdml0eU5vZGUgbm9kZSA9ICgoQWN0aXZpdHlOb2RlKSBpdGVyLm5leHQoKSk7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IHNyY0FjdE5vZGVzLml0ZXJhdG9yKCk7IGl0ZXJhdG9yCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCQkJV29ya0JyZWFrZG93bkVsZW1lbnQgcHJlZCA9IChXb3JrQnJlYWtkb3duRWxlbWVudCkgQnJpZGdlSGVscGVyCi0JCQkJCQkuZ2V0TWV0aG9kRWxlbWVudCgoQWN0aXZpdHlOb2RlKSBpdGVyYXRvci5uZXh0KCkpOwotCQkJCQlpZiAoVW1hVXRpbC5maW5kV29ya09yZGVyKChXb3JrQnJlYWtkb3duRWxlbWVudCkgQnJpZGdlSGVscGVyCi0JCQkJCQkJLmdldE1ldGhvZEVsZW1lbnQobm9kZSksIHByZWQpID09IG51bGwpIHsKLQkJCQkJCWFkZERlZmF1bHRXb3JrT3JkZXIobm9kZSwgcHJlZCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlRnJvbVVNQShBY3Rpdml0eUVkZ2UgbGluaywgQWN0aXZpdHlOb2RlIG9sZFNvdXJjZSwgQWN0aXZpdHlOb2RlIG9sZFRhcmdldCkgewotCQlDb2xsZWN0aW9uIHNyY0FjdE5vZGVzID0gbmV3IEFycmF5TGlzdCgpOwkJCQotCQlCcmlkZ2VIZWxwZXIuZ2V0U291cmNlTm9kZXMoc3JjQWN0Tm9kZXMsIG9sZFNvdXJjZSwgV29ya0JyZWFrZG93bkVsZW1lbnQuY2xhc3MpOwotCQlNZXRob2RFbGVtZW50IHRhcmdldEVsZW1lbnQgPSBCcmlkZ2VIZWxwZXIuZ2V0TWV0aG9kRWxlbWVudChvbGRUYXJnZXQpOwotCQlpZiAodGFyZ2V0RWxlbWVudCBpbnN0YW5jZW9mIFdvcmtCcmVha2Rvd25FbGVtZW50KSB7Ci0JCQlXb3JrQnJlYWtkb3duRWxlbWVudCB0YXJnZXRXYmUgPSAoV29ya0JyZWFrZG93bkVsZW1lbnQpIHRhcmdldEVsZW1lbnQ7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gc3JjQWN0Tm9kZXMuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJCS8vIE9iamVjdCBwcmVkID0gKChOb2RlKSBpdGVyYXRvci5uZXh0KCkpLmdldE9iamVjdCgpOwotCQkJCS8vIEdyYXBoaWNhbERhdGFIZWxwZXIucmVtb3ZlV29ya09yZGVyKChOYW1lZE5vZGVJbXBsKQotCQkJCS8vIG9sZFRhcmdldCwgcHJlZCk7Ci0JCQkJQWN0aXZpdHlOb2RlIG5vZGUgPSAoQWN0aXZpdHlOb2RlKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJaWYgKEJyaWRnZUhlbHBlci5jYW5SZW1vdmVBbGxQcmVkcyhsaW5rLCBub2RlLCBvbGRUYXJnZXQpKSB7Ci0JCQkJCU1ldGhvZEVsZW1lbnQgc3JjRWxlbWVudCA9IEJyaWRnZUhlbHBlci5nZXRNZXRob2RFbGVtZW50KG5vZGUpOwkJCQkJCi0JCQkJCVdvcmtPcmRlciB3bzsKLQkJCQkJd2hpbGUgKCh3byA9IFVtYVV0aWwuZmluZFdvcmtPcmRlcih0YXJnZXRXYmUsIHNyY0VsZW1lbnQpKSAhPSBudWxsKSB7Ci0JCQkJCQlnZXRBY3Rpb25NYW5hZ2VyKCkuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuUkVNT1ZFLCB0YXJnZXRXYmUsIAotCQkJCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLldPUktfQlJFQUtET1dOX0VMRU1FTlRfX0xJTktfVE9fUFJFREVDRVNTT1IsIHdvLCAtMSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0gZWxzZSBpZiAob2xkVGFyZ2V0IGluc3RhbmNlb2YgQ29udHJvbE5vZGUpIHsKLQkJCUNvbGxlY3Rpb24gdGFyZ2V0QWN0Tm9kZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlCcmlkZ2VIZWxwZXIuZ2V0VGFyZ2V0Tm9kZXModGFyZ2V0QWN0Tm9kZXMsCi0JCQkJCW9sZFRhcmdldCwgV29ya0JyZWFrZG93bkVsZW1lbnQuY2xhc3MpOwotCi0JCQkvLyByZW1vdmUgdGhlIHdvcmsgb3JkZXJzIG9mIHRhcmdldCBhY3Rpdml0aWVzIHRoYXQgaGF2ZSB0aGUKLQkJCS8vIHByZWRlY2Vzc29yIGluIHNyY0FjdE5vZGVzCi0JCQkvLwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gdGFyZ2V0QWN0Tm9kZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJQWN0aXZpdHlOb2RlIG5vZGUgPSAoKEFjdGl2aXR5Tm9kZSkgaXRlci5uZXh0KCkpOwotCQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBzcmNBY3ROb2Rlcy5pdGVyYXRvcigpOyBpdGVyYXRvcgotCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJLy8gT2JqZWN0IHByZWQgPSAoKE5vZGUpIGl0ZXJhdG9yLm5leHQoKSkuZ2V0T2JqZWN0KCk7Ci0JCQkJCS8vIEdyYXBoaWNhbERhdGFIZWxwZXIucmVtb3ZlV29ya09yZGVyKG5vZGUsIHByZWQpOwotCQkJCQlBY3Rpdml0eU5vZGUgcHJlZG5vZGUgPSAoQWN0aXZpdHlOb2RlKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCWlmIChCcmlkZ2VIZWxwZXIuY2FuUmVtb3ZlQWxsUHJlZHMobGluaywgcHJlZG5vZGUsCi0JCQkJCQkJbm9kZSkpIHsKLQkJCQkJCVdvcmtCcmVha2Rvd25FbGVtZW50IHRhcmdldEUgPSAoV29ya0JyZWFrZG93bkVsZW1lbnQpIEJyaWRnZUhlbHBlci5nZXRNZXRob2RFbGVtZW50KG5vZGUpOwotCQkJCQkJTWV0aG9kRWxlbWVudCBzcmNFbGVtZW50ID0gQnJpZGdlSGVscGVyLmdldE1ldGhvZEVsZW1lbnQocHJlZG5vZGUpOwotCQkJCQkJV29ya09yZGVyIHdvOwotCQkJCQkJd2hpbGUgKCh3byA9IFVtYVV0aWwuZmluZFdvcmtPcmRlcih0YXJnZXRFLCBzcmNFbGVtZW50KSkgIT0gbnVsbCkgewotCQkJCQkJCWdldEFjdGlvbk1hbmFnZXIoKS5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5SRU1PVkUsIHRhcmdldEUsIAotCQkJCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5XT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19MSU5LX1RPX1BSRURFQ0VTU09SLCB3bywgLTEpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJc3VwZXIucmVtb3ZlRnJvbVVNQShsaW5rLCBvbGRTb3VyY2UsIG9sZFRhcmdldCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vY29yZS9icmlkZ2UvRGlhZ3JhbUFkYXB0ZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2NvcmUvYnJpZGdlL0RpYWdyYW1BZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2YWNmNWQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vY29yZS9icmlkZ2UvRGlhZ3JhbUFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyMCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5icmlkZ2U7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlJvbGxiYWNrRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuRGlhZ3JhbUNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwudXRpbC5UeFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5BY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JQWN0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuQlNBY3Rpdml0eUl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLklCU0l0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuUHJvY2Vzc1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlN1cHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5FZGdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuQWN0aXZpdHlFZGdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkFjdGl2aXR5Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eVBhcnRpdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5VTUxQYWNrYWdlOwotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiAKLSAqIEBzaW5jZSAxLjIKLSAqLwotcHVibGljIGNsYXNzIERpYWdyYW1BZGFwdGVyIGV4dGVuZHMgTm9kZUFkYXB0ZXIgewotCi0JcHJpdmF0ZSBBY3Rpdml0eSBiYXNlQWN0OwotCi0JcHJvdGVjdGVkIElGaWx0ZXIgZmlsdGVyOwotCi0JcHJpdmF0ZSBTdXBwcmVzc2lvbiBzdXBwcmVzc2lvbjsKLQotCXByb3RlY3RlZCBsb25nIHVtYUxhc3RNb2RpZmllZDsKLQotCi0JcHVibGljIERpYWdyYW1BZGFwdGVyKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyIHdyYXBwZXIpIHsKLQkJdGhpcygoQWN0aXZpdHkpIFRuZ1V0aWwudW53cmFwKHdyYXBwZXIpKTsKLQkJdGhpcy53cmFwcGVyID0gd3JhcHBlcjsKLQkJYmFzaWNTZXRUYXJnZXRSZWFkT25seSh3cmFwcGVyLmlzUmVhZE9ubHkoKSk7Ci0JfQotCi0JcHVibGljIERpYWdyYW1BZGFwdGVyKEFjdGl2aXR5IGUpIHsKLQkJc3VwZXIoZSk7Ci0KLQkJLy8gbGlzdGVucyB0byBjaGFuZ2UgaW4gdGhlIGJhc2UgYWN0aXZpdHkgaWYgdGhlcmUgaXMgYW55Ci0JCS8vCi0JCWlmIChQcm9jZXNzVXRpbC5pc0V4dGVuZGluZ09yTG9jYWxseUNvbnRyaWJ1dGluZyhlKSkgewotCQkJYmFzZUFjdCA9IChBY3Rpdml0eSkgZS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCk7Ci0JCQliYXNlQWN0LmVBZGFwdGVycygpLmFkZChtZXRob2RFbGVtZW50QWRhcHRlcik7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkvLyBkaXNwb3NlIGFsbCBub2RlIGFkYXB0ZXJzIG9mIHRoZSBjaGlsZCBub2RlcwotCQkvLwotCQlmb3IgKEl0ZXJhdG9yPD8+IGl0ZXIgPSBnZXROb2RlcygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJQWN0aXZpdHlOb2RlIG5vZGUgPSAoQWN0aXZpdHlOb2RlKSBpdGVyLm5leHQoKTsKLQkJCU5vZGVBZGFwdGVyIG5vZGVBZGFwdGVyID0gQnJpZGdlSGVscGVyLmdldE5vZGVBZGFwdGVyKG5vZGUpOwotCQkJaWYgKG5vZGVBZGFwdGVyICE9IG51bGwpIHsKLQkJCQlub2RlQWRhcHRlci5kaXNwb3NlKCk7Ci0JCQl9Ci0JCX0KLQotCQlzdXBlci5kaXNwb3NlKCk7Ci0JCQotCQlpZiAoYmFzZUFjdCAhPSBudWxsKSB7Ci0JCQliYXNlQWN0LmVBZGFwdGVycygpLnJlbW92ZShtZXRob2RFbGVtZW50QWRhcHRlcik7Ci0JCX0KLQotCX0KLQotCXByb3RlY3RlZCBjbGFzcyBBY3Rpdml0eUFkYXB0ZXIgZXh0ZW5kcyBNZXRob2RFbGVtZW50QWRhcHRlciB7Ci0JCXByb3RlY3RlZCBDb2xsZWN0aW9uIGhhbmRsZU5vdGlmaWNhdGlvbihOb3RpZmljYXRpb24gbXNnKSB7Ci0JCQlDb2xsZWN0aW9uIG5ld05vZGVzVG9SZWZyZXNoID0gbmV3IEFycmF5TGlzdCgpOwotCQkJc3dpdGNoIChtc2cuZ2V0RmVhdHVyZUlEKEFjdGl2aXR5LmNsYXNzKSkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX19CUkVBS0RPV05fRUxFTUVOVFM6Ci0JCQkJc3dpdGNoIChtc2cuZ2V0RXZlbnRUeXBlKCkpIHsKLQkJCQljYXNlIE5vdGlmaWNhdGlvbi5BREQ6Ci0JCQkJCUFjdGl2aXR5Tm9kZSBub2RlID0gKEFjdGl2aXR5Tm9kZSkgYWRkTm9kZShtc2cKLQkJCQkJCQkuZ2V0TmV3VmFsdWUoKSk7Ci0JCQkJCWlmIChub2RlICE9IG51bGwpIHsKLQkJCQkJCWlmIChtc2cuZ2V0Tm90aWZpZXIoKSA9PSBiYXNlQWN0KSB7Ci0JCQkJCQkJQnJpZGdlSGVscGVyLmdldE5vZGVBZGFwdGVyKG5vZGUpCi0JCQkJCQkJCQkuYmFzaWNTZXRUYXJnZXRSZWFkT25seSh0cnVlKTsKLQkJCQkJCQluZXdOb2Rlc1RvUmVmcmVzaC5hZGQobm9kZSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBOb3RpZmljYXRpb24uUkVNT1ZFOgotCQkJCQlyZW1vdmVOb2RlKG1zZy5nZXRPbGRWYWx1ZSgpKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBOb3RpZmljYXRpb24uQUREX01BTlk6Ci0JCQkJCUNvbGxlY3Rpb24gbm9kZXMgPSBhZGROb2RlcygoQ29sbGVjdGlvbikgbXNnLmdldE5ld1ZhbHVlKCkpOwotCQkJCQlpZiAobXNnLmdldE5vdGlmaWVyKCkgPT0gYmFzZUFjdCkgewotCQkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gbm9kZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJbm9kZSA9IChBY3Rpdml0eU5vZGUpIGl0ZXIubmV4dCgpOwotCQkJCQkJCUJyaWRnZUhlbHBlci5nZXROb2RlQWRhcHRlcihub2RlKQotCQkJCQkJCQkJLmJhc2ljU2V0VGFyZ2V0UmVhZE9ubHkodHJ1ZSk7Ci0JCQkJCQkJbmV3Tm9kZXNUb1JlZnJlc2guYWRkKG5vZGUpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgTm90aWZpY2F0aW9uLlJFTU9WRV9NQU5ZOgotCQkJCQlyZW1vdmVOb2RlcygoQ29sbGVjdGlvbikgbXNnLmdldE9sZFZhbHVlKCkpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIE5vdGlmaWNhdGlvbi5NT1ZFOgotCQkJCQltb3ZlTm9kZShtc2cuZ2V0TmV3VmFsdWUoKSk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgTm90aWZpY2F0aW9uLlNFVDoKLQkJCQkJcmVwbGFjZU5vZGUobXNnLmdldE9sZFZhbHVlKCksIG1zZy5nZXROZXdWYWx1ZSgpKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCQlyZXR1cm4gc3VwZXIuaGFuZGxlTm90aWZpY2F0aW9uKG1zZyk7Ci0JCQl9Ci0JCQlyZXR1cm4gbmV3Tm9kZXNUb1JlZnJlc2g7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlTm90aWZpY2F0aW9uKE5vdGlmaWNhdGlvbiBtc2cpIHsKLQkJc3dpdGNoKG1zZy5nZXRGZWF0dXJlSUQob3JnLmVjbGlwc2UudW1sMi51bWwuQWN0aXZpdHkuY2xhc3MpKSB7Ci0JCWNhc2UgVU1MUGFja2FnZS5BQ1RJVklUWV9fTk9ERToKLQkJCUNvbGxlY3Rpb24gY29sbGVjdGlvbjsKLQkJCXN3aXRjaCAobXNnLmdldEV2ZW50VHlwZSgpKSB7Ci0JCQljYXNlIE5vdGlmaWNhdGlvbi5BREQ6Ci0JCQkJbm9kZUFkZGVkKG1zZy5nZXRQb3NpdGlvbigpLCAoQWN0aXZpdHlOb2RlKSBtc2cKLQkJCQkJCS5nZXROZXdWYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE5vdGlmaWNhdGlvbi5SRU1PVkU6Ci0JCQkJbm9kZVJlbW92ZWQoKEFjdGl2aXR5Tm9kZSkgbXNnLmdldE9sZFZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTm90aWZpY2F0aW9uLkFERF9NQU5ZOgotCQkJCWNvbGxlY3Rpb24gPSAoQ29sbGVjdGlvbikgbXNnLmdldE5ld1ZhbHVlKCk7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gY29sbGVjdGlvbi5pdGVyYXRvcigpOyBpdGVyCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCQkJQWN0aXZpdHlOb2RlIG5vZGUgPSAoQWN0aXZpdHlOb2RlKSBpdGVyLm5leHQoKTsKLQkJCQkJbm9kZUFkZGVkKG1zZy5nZXRQb3NpdGlvbigpLCBub2RlKTsKLQkJCQl9Ci0KLQkJCQlyZXR1cm47Ci0JCQljYXNlIE5vdGlmaWNhdGlvbi5SRU1PVkVfTUFOWToKLQkJCQljb2xsZWN0aW9uID0gKENvbGxlY3Rpb24pIG1zZy5nZXRPbGRWYWx1ZSgpOwotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGNvbGxlY3Rpb24uaXRlcmF0b3IoKTsgaXRlcgotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCW5vZGVSZW1vdmVkKChBY3Rpdml0eU5vZGUpIGl0ZXIubmV4dCgpKTsKLQkJCQl9Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCQotCQlzdXBlci5oYW5kbGVOb3RpZmljYXRpb24obXNnKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZXBsYWNlTm9kZShPYmplY3Qgb2xkRWxlbWVudCwgT2JqZWN0IG5ld0VsZW1lbnQpIHsKLQkJCi0JfQotCi0JcHJvdGVjdGVkIE1ldGhvZEVsZW1lbnRBZGFwdGVyIGNyZWF0ZU1ldGhvZEVsZW1lbnRBZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IEFjdGl2aXR5QWRhcHRlcigpOwotCX0KLQotCXByb3RlY3RlZCBmaW5hbCB2b2lkIHBvcHVsYXRlTGlua3MoKSB7Ci0JCXBvcHVsYXRlTGlua3MoZ2V0Tm9kZXMoKSk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHBvcHVsYXRlTGlua3MoTGlzdDxBY3Rpdml0eU5vZGU+IHNlbGVjdGVkTm9kZXMpIHsKLQkJLy8gZmlsbCBvdXRnb2luZy9pbmNvbWluZyBjb25uZWN0aW9uIGxpc3RzIG9mIGFsbCBub2RlcwotCQkvLwotCQlpbnQgc2l6ZSA9IHNlbGVjdGVkTm9kZXMuc2l6ZSgpOwotCQlib29sZWFuW10gbm90aWZpZXMgPSBuZXcgYm9vbGVhbltzaXplXTsKLQkJdHJ5IHsKLQkJCS8vIGRpc2FibGUgbm90aWZpY2F0aW9uIGZvciBhbGwgbm9kZXMgaW4gdGhpcyBkaWFncmFtIHRvIGF2b2lkCi0JCQkvLyB1bndhbnRlZCBjb25jdXJyZW50IG1vZGlmaWNhdGlvbiBvZiB0aGVpciBjb25uZWN0aW9uIGxpc3QKLQkJCS8vCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCUFjdGl2aXR5Tm9kZSBub2RlID0gc2VsZWN0ZWROb2Rlcy5nZXQoaSk7Ci0JCQkJbm90aWZpZXNbaV0gPSBub2RlLmVEZWxpdmVyKCk7Ci0JCQkJbm9kZS5lU2V0RGVsaXZlcihmYWxzZSk7Ci0JCQl9Ci0JCQlmb3IgKEFjdGl2aXR5Tm9kZSBub2RlIDogc2VsZWN0ZWROb2RlcykgewotCQkJCXBvcHVsYXRlTGlua3Mobm9kZSwgZmFsc2UpOwotCQkJfQotCQl9IGZpbmFsbHkgewotCQkJLy8gcmVzdG9yZSBub3RpZmljYXRpb24gZmxhZwotCQkJLy8KLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJc2VsZWN0ZWROb2Rlcy5nZXQoaSkuZVNldERlbGl2ZXIobm90aWZpZXNbaV0pOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIExpc3QgZ2V0Tm9kZXMoKSB7Ci0JCW9yZy5lY2xpcHNlLnVtbDIudW1sLkFjdGl2aXR5IGRpYWdyYW0gPSBnZXREaWFncmFtKCk7Ci0JCXJldHVybiBkaWFncmFtICE9IG51bGwgPyBnZXREaWFncmFtKCkuZ2V0Tm9kZXMoKSA6IENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgb3JnLmVjbGlwc2UudW1sMi51bWwuQWN0aXZpdHkgZ2V0RGlhZ3JhbSgpIHsKLQkJcmV0dXJuIChvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eSkgZ2V0VGFyZ2V0KCk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gcmVtb3ZlTm9kZShPYmplY3Qgb2JqKSB7Ci0JCWlmICghVG5nVXRpbC5pc0luc3RhbmNlT2YoZ2V0QnJlYWtkb3duRWxlbWVudFR5cGVzKCksIG9iaikpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJQWN0aXZpdHlOb2RlIG5vZGUgPSBCcmlkZ2VIZWxwZXIuZmluZE5vZGUoZ2V0RGlhZ3JhbSgpLCBvYmopOwotCQlpZiAobm9kZSA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCWZvciAoSXRlcmF0b3IgaXRlciA9IG5vZGUuZ2V0T3V0Z29pbmdzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlBY3Rpdml0eUVkZ2UgbGluayA9IChBY3Rpdml0eUVkZ2UpIGl0ZXIubmV4dCgpOwotCQkJbGluay5zZXRUYXJnZXQobnVsbCk7Ci0JCX0KLQotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBub2RlLmdldEluY29taW5ncygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJQWN0aXZpdHlFZGdlIGxpbmsgPSAoQWN0aXZpdHlFZGdlKSBpdGVyLm5leHQoKTsKLQkJCWxpbmsuc2V0U291cmNlKG51bGwpOwotCQl9Ci0JCW5vZGUuZ2V0T3V0Z29pbmdzKCkuY2xlYXIoKTsKLQkJbm9kZS5nZXRJbmNvbWluZ3MoKS5jbGVhcigpOwotCi0JCWdldE5vZGVzKCkucmVtb3ZlKG5vZGUpOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVOb2RlcyhDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gY29sbGVjdGlvbi5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCXJlbW92ZU5vZGUoaXRlci5uZXh0KCkpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIEFjdGl2aXR5Tm9kZSBhZGROb2RlKE9iamVjdCBvYmopIHsKLQkJQWN0aXZpdHlOb2RlIG5vZGUgPSBhZGROb2RlKGdldE5vZGVzKCksIG9iaik7Ci0JCWlmIChub2RlID09IG51bGwpCi0JCQlyZXR1cm4gbm9kZTsKLQkJcG9wdWxhdGVMaW5rcyhub2RlLCB0cnVlKTsKLQkJcmV0dXJuIG5vZGU7Ci0JfQotCi0JcHJvdGVjdGVkIENvbGxlY3Rpb24gYWRkTm9kZXMoQ29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCUxpc3Qgbm9kZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGNvbGxlY3Rpb24uaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlhZGROb2RlKG5vZGVzLCBpdGVyLm5leHQoKSk7Ci0JCX0KLQotCQkvLyB1c2UgYWRkQWxsKCkgdG8gYXZvaWQgdW5uZWNlc3Nhcnkgbm90aWZpY2F0aW9ucwotCQkvLwotCQlnZXROb2RlcygpLmFkZEFsbChub2Rlcyk7Ci0JCXJldHVybiBub2RlczsKLQl9Ci0KLQkvKioKLQkgKiBJbiBQcm9jZXNzIFdCUywgaWYgYnJlYWtkb3duZWxlbWVudCBpcyBtb3ZlZCB1cCBvciBkb3duLCBkaWFncmFtIHNob3VsZAotCSAqIGJlIHVwZGF0ZWQgYWNjb3JkaW5nbHkuIFN1Yi1jbGFzcyBzaG91bGQgb3ZlcnJpZGUgdGhpcyBtZXRob2QgaWYgZGlhZ3JhbQotCSAqIG5lZWRzIHVwZGF0ZSBvbiBtb3ZlLgotCSAqIAotCSAqIEBwYXJhbSBuZXdWYWx1ZQotCSAqLwotCXB1YmxpYyB2b2lkIG1vdmVOb2RlKE9iamVjdCBvbGRWYWx1ZSkgewotCX0KLQotCS8qKgotCSAqIFBvcHVsYXRlcyB0aGUgaW5jb21pbmcvb3V0Z29pbmcgbGlua3Mgb2YgdGhlIGdpdmVuIG5vZGUKLQkgKiAKLQkgKiBAcGFyYW0gbm9kZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBvcHVsYXRlTGlua3MoQWN0aXZpdHlOb2RlIG5vZGUsIGJvb2xlYW4gZGlzYWJsZU5vdGlmaWNhdGlvbikgewotCQkvLyBpbnQgc2l6ZSA9IDA7Ci0JCS8vIGJvb2xlYW5bXSBub3RpZmllcyA9IG51bGw7Ci0JCS8vIHRyeSB7Ci0JCS8vIGlmIChkaXNhYmxlTm90aWZpY2F0aW9uKSB7Ci0JCS8vIHNpemUgPSBnZXROb2RlcygpLnNpemUoKTsKLQkJLy8gbm90aWZpZXMgPSBuZXcgYm9vbGVhbltzaXplXTsKLQkJLy8gLy8gZGlzYWJsZSBub3RpZmljYXRpb24gZm9yIGFsbCBub2RlcyBpbiB0aGlzIGRpYWdyYW0gdG8gYXZvaWQKLQkJLy8gLy8gdW53YW50ZWQgY29uY3VycmVudCBtb2RpZmljYXRpb24gb2YgdGhlaXIgY29ubmVjdGlvbiBsaXN0Ci0JCS8vIC8vCi0JCS8vIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCS8vIE5vZGUgY2hpbGQgPSAoKE5vZGUpIGdldE5vZGVzKCkuZ2V0KGkpKTsKLQkJLy8gbm90aWZpZXNbaV0gPSBjaGlsZC5lRGVsaXZlcigpOwotCQkvLyBjaGlsZC5lU2V0RGVsaXZlcihmYWxzZSk7Ci0JCS8vIH0KLQkJLy8gfQotCQkvLwotCQkvLyBHcmFwaE5vZGUgZ3JhcGhOb2RlID0gbm9kZS5nZXRHcmFwaE5vZGUoKTsKLQkJLy8gaWYgKGdyYXBoTm9kZSAhPSBudWxsKSB7Ci0JCS8vIEdyYXBoaWNhbERhdGFIZWxwZXIuZmlsbENvbm5lY3Rpb25zKG5vZGUsIGdyYXBoTm9kZSk7Ci0JCS8vIH0KLQkJLy8gfSBmaW5hbGx5IHsKLQkJLy8gaWYgKGRpc2FibGVOb3RpZmljYXRpb24pIHsKLQkJLy8gLy8gcmVzdG9yZSBub3RpZmljYXRpb24gZmxhZwotCQkvLyAvLwotCQkvLyBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkvLyAoKEVPYmplY3QpIGdldE5vZGVzKCkuZ2V0KGkpKS5lU2V0RGVsaXZlcihub3RpZmllc1tpXSk7Ci0JCS8vIH0KLQkJLy8gfQotCQkvLyB9Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBuZXcgbm9kZSBmb3IgdGhpcyBkaWFncmFtIGZvciB0aGUgZ2l2ZW4gTWV0aG9kRWxlbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwcm90ZWN0ZWQgQWN0aXZpdHlOb2RlIHRvTm9kZShNZXRob2RFbGVtZW50IGUpIHsKLQkJQWN0aXZpdHlOb2RlIG5vZGUgPSBuZXdOb2RlKGUpOwotCQlpZiAobm9kZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWluaXRpYWxpemVOb2RlKG5vZGUsIGUpOwotCQlyZXR1cm4gbm9kZTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZU5vZGVBZGFwdGVyKE5vZGVBZGFwdGVyIG5vZGVBZGFwdGVyKSB7Ci0JCW5vZGVBZGFwdGVyLnNldEVkaXRpbmdEb21haW4oZG9tYWluKTsKLQkJbm9kZUFkYXB0ZXIuYWN0aW9uTWFuYWdlciA9IGFjdGlvbk1hbmFnZXI7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplTm9kZShBY3Rpdml0eU5vZGUgbm9kZSwgTWV0aG9kRWxlbWVudCBlKSB7Ci0JCVN0cmluZyBuYW1lID0gQnJpZGdlSGVscGVyLmdldE5vZGVOYW1lKGUpOwotCQlub2RlLnNldE5hbWUobmFtZSk7CQkKLQotCQlOb2RlQWRhcHRlciBub2RlQWRhcHRlciA9IEJyaWRnZUhlbHBlci5nZXROb2RlQWRhcHRlcihub2RlKTsKLQkJaWYgKG5vZGVBZGFwdGVyICE9IG51bGwgJiYgbm9kZUFkYXB0ZXIuZ2V0RWxlbWVudCgpICE9IGUpIHsKLQkJCW5vZGVBZGFwdGVyLmRpc3Bvc2UoKTsKLQkJCW5vZGVBZGFwdGVyID0gbnVsbDsKLQkJfQotCQlpZiAobm9kZUFkYXB0ZXIgPT0gbnVsbCkgewotCQkJbm9kZUFkYXB0ZXIgPSBjcmVhdGVOb2RlQWRhcHRlcihlKTsKLQkJCWluaXRpYWxpemVOb2RlQWRhcHRlcihub2RlQWRhcHRlcik7Ci0JCQlub2RlLmVBZGFwdGVycygpLmFkZChub2RlQWRhcHRlcik7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgTm9kZUFkYXB0ZXIgY3JlYXRlTm9kZUFkYXB0ZXIoTWV0aG9kRWxlbWVudCBlKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCBBY3Rpdml0eU5vZGUgbmV3Tm9kZShNZXRob2RFbGVtZW50IGUpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBub2RlIGZvciB0aGUgZ2l2ZW4gbWV0aG9kIGVsZW1lbnQgPGNvZGU+b2JqPC9jb2RlPiBhbmQKLQkgKiBhZGQgaXQgdG8gdGhlIGdpdmVuIGNvbGxlY3Rpb24gb2Ygbm9kZXMKLQkgKiAKLQkgKiBAcGFyYW0gbm9kZXMKLQkgKiBAcGFyYW0gb2JqCi0JICogICAgICAgICAgICBtZXRob2QgZWxlbWVudAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcm90ZWN0ZWQgQWN0aXZpdHlOb2RlIGFkZE5vZGUoQ29sbGVjdGlvbiBub2RlcywgT2JqZWN0IG9iaikgewotCQlpZiAoVG5nVXRpbC5pc0luc3RhbmNlT2YoZ2V0QnJlYWtkb3duRWxlbWVudFR5cGVzKCksIG9iaikpIHsKLQkJCUFjdGl2aXR5Tm9kZSBub2RlID0gdG9Ob2RlKChNZXRob2RFbGVtZW50KSBvYmopOwotCQkJaWYgKG5vZGUgIT0gbnVsbCkgewotCQkJCW5vZGVzLmFkZChub2RlKTsKLQkJCQlyZXR1cm4gbm9kZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgTGlzdCBnZXRCcmVha2Rvd25FbGVtZW50VHlwZXMoKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KEJyZWFrZG93bkVsZW1lbnQuY2xhc3MpOwotCX0KLQotCXB1YmxpYyBBY3Rpdml0eSBnZXRBY3Rpdml0eSgpIHsKLQkJcmV0dXJuIChBY3Rpdml0eSkgZWxlbWVudDsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVGcm9tVW1hTW9kZWwoQWN0aXZpdHlOb2RlIHJlbW92ZWROb2RlKSB7Ci0JCU9iamVjdCBlOwotCQlpZiAoKGUgPSBCcmlkZ2VIZWxwZXIuZ2V0TWV0aG9kRWxlbWVudChyZW1vdmVkTm9kZSkpIGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudCkgewotCQkJZ2V0QWN0aW9uTWFuYWdlcigpLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlJFTU9WRSwgZ2V0QWN0aXZpdHkoKSwgCi0JCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuQUNUSVZJVFlfX0JSRUFLRE9XTl9FTEVNRU5UUywgZSwgLTEpOwotCQl9Ci0KLQkJc3VwZXIucmVtb3ZlRnJvbVVtYU1vZGVsKHJlbW92ZWROb2RlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBleHRyYWN0Q2hpbGRyZW4oSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyIGFkYXB0ZXIsIE9iamVjdCBvYmplY3QsIENvbGxlY3Rpb24gY2hpbGRyZW4pIHsKLQkJLy8gZGlzYWJsZSByb2xsdXAgYmVmb3JlIGdldHRpbmcgdGhlIGNoaWxkcmVuCi0JCS8vCi0JCWJvb2xlYW4gb2xkUm9sbGVkVXAgPSBmYWxzZTsKLQkJaWYoYWRhcHRlciBpbnN0YW5jZW9mIEJTQWN0aXZpdHlJdGVtUHJvdmlkZXIpIHsKLQkJCUJTQWN0aXZpdHlJdGVtUHJvdmlkZXIgaXRlbVByb3ZpZGVyID0gKEJTQWN0aXZpdHlJdGVtUHJvdmlkZXIpYWRhcHRlcjsKLQkJCW9sZFJvbGxlZFVwID0gaXRlbVByb3ZpZGVyLmlzUm9sbGVkVXAoKTsKLQkJCWl0ZW1Qcm92aWRlci5iYXNpY1NldFJvbGxlZFVwKGZhbHNlKTsKLQkJfQotCQllbHNlIGlmKGFkYXB0ZXIgaW5zdGFuY2VvZiBJQlNJdGVtUHJvdmlkZXIpewotCQkJSUJTSXRlbVByb3ZpZGVyIGl0ZW1Qcm92aWRlciA9IChJQlNJdGVtUHJvdmlkZXIpYWRhcHRlcjsKLQkJCW9sZFJvbGxlZFVwID0gaXRlbVByb3ZpZGVyLmlzUm9sbGVkVXAoKTsKLQkJCWl0ZW1Qcm92aWRlci5zZXRSb2xsZWRVcChmYWxzZSk7Ci0JCX0KLQkJCi0JCXRyeSB7Ci0JCQkvLyBmaWx0ZXIgb3V0IHRoZSBzdXBwcmVzc2VkIGVsZW1lbnRzCi0JCQkvLwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gYWRhcHRlci5nZXRDaGlsZHJlbihvYmplY3QpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBjaGlsZCA9IGl0ZXIubmV4dCgpOwotCQkJCWlmKCFnZXRTdXBwcmVzc2lvbigpLmlzU3VwcHJlc3NlZChjaGlsZCkpIHsKLQkJCQkJY2hpbGRyZW4uYWRkKGNoaWxkKTsKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCS8vIGRvbid0IGZpbHRlciBzdXBwcmVzc2VkIGVsZW1lbnRzCi0JCQkvLwotCQkJLy9jaGlsZHJlbi5hZGRBbGwoYWRhcHRlci5nZXRDaGlsZHJlbihvYmplY3QpKTsKLQkJfQotCQlmaW5hbGx5IHsKLQkJCS8vIHJlc3RvcmUgdGhlIHJvbGxlZC11cCBmbGFnCi0JCQkvLwotCQkJaWYoYWRhcHRlciBpbnN0YW5jZW9mIElCU0l0ZW1Qcm92aWRlcikgewotCQkJCSgoSUJTSXRlbVByb3ZpZGVyKWFkYXB0ZXIpLnNldFJvbGxlZFVwKG9sZFJvbGxlZFVwKTsKLQkJCX0KLQkJfQotCX0KLQkKLQlwdWJsaWMgU3VwcHJlc3Npb24gZ2V0U3VwcHJlc3Npb24oKSB7Ci0JCXJldHVybiBzdXBwcmVzc2lvbjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTdXBwcmVzc2lvbihTdXBwcmVzc2lvbiBzdXBwcmVzc2lvbikgewotCQl0aGlzLnN1cHByZXNzaW9uID0gc3VwcHJlc3Npb247Ci0JfQkKLQkKLQlwcml2YXRlIHZvaWQgdXBkYXRlVmlldyhDb2xsZWN0aW9uPD8+IHNlbGVjdGVkTm9kZXMpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiwgUm9sbGJhY2tFeGNlcHRpb24gewotCQl1cGRhdGVWaWV3KGdldFZpZXcoKSwgc2VsZWN0ZWROb2Rlcyk7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIHZvaWQgdXBkYXRlVmlldyhWaWV3IHZpZXcsIENvbGxlY3Rpb248Pz4gc2VsZWN0ZWROb2RlcykgewotCQkvLyBzaG93IHRoZSBzZWxlY3RlZCBub2RlcyBhbmQgaGlkZSBhbGwgdGhlIG90aGVyCi0JCS8vCQotCQlmb3IgKEl0ZXJhdG9yPD8+IGl0ZXIgPSB2aWV3LmdldENoaWxkcmVuKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlWaWV3IG5vZGUgPSAoVmlldykgaXRlci5uZXh0KCk7Ci0JCQlpZihzZWxlY3RlZE5vZGVzLmNvbnRhaW5zKG5vZGUuZ2V0RWxlbWVudCgpKSkgewotCQkJCU5vZGVBZGFwdGVyIGFkYXB0ZXIgPSBCcmlkZ2VIZWxwZXIuZ2V0Tm9kZUFkYXB0ZXIobm9kZS5nZXRFbGVtZW50KCkpOwotCQkJCWlmKGFkYXB0ZXIgIT0gbnVsbCkgewotCQkJCQlhZGFwdGVyLnVwZGF0ZVZpZXcoKTsKLQkJCQl9Ci0vLwkJCQlpZighbm9kZS5pc1Zpc2libGUoKSkgewotCQkJCQlub2RlLnNldFZpc2libGUodHJ1ZSk7Ci0vLwkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlpZihub2RlLmdldEVsZW1lbnQoKSBpbnN0YW5jZW9mIEFjdGl2aXR5Tm9kZSkgewotCQkJCQlpZihub2RlLmlzVmlzaWJsZSgpKSB7Ci0JCQkJCQlub2RlLnNldFZpc2libGUoZmFsc2UpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgaWYobm9kZS5nZXRFbGVtZW50KCkgaW5zdGFuY2VvZiBBY3Rpdml0eVBhcnRpdGlvbikgewotCQkJCQl1cGRhdGVWaWV3KG5vZGUsIHNlbGVjdGVkTm9kZXMpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJaWYoIW5vZGUuaXNWaXNpYmxlKCkpIHsKLQkJCQkJCW5vZGUuc2V0VmlzaWJsZSh0cnVlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQkKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZUVkZ2VzKENvbGxlY3Rpb24gc2VsZWN0ZWROb2RlcykgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uLCBSb2xsYmFja0V4Y2VwdGlvbiB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGdldFZpZXcoKS5nZXRDaGlsZHJlbigpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJVmlldyBub2RlID0gKFZpZXcpIGl0ZXIubmV4dCgpOwotCQkJaWYoc2VsZWN0ZWROb2Rlcy5jb250YWlucyhub2RlLmdldEVsZW1lbnQoKSkpIHsKLQkJCQlOb2RlQWRhcHRlciBhZGFwdGVyID0gQnJpZGdlSGVscGVyLmdldE5vZGVBZGFwdGVyKG5vZGUuZ2V0RWxlbWVudCgpKTsKLQkJCQlhZGFwdGVyLnVwZGF0ZVZpZXcoKTsKLS8vCQkJCWlmKCFub2RlLmlzVmlzaWJsZSgpKSB7Ci0JCQkJCW5vZGUuc2V0VmlzaWJsZSh0cnVlKTsKLQkJCQkJc2V0RWRnZVZpc2liaWxpdHkobm9kZSwgdHJ1ZSk7Ci0vLwkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlpZihub2RlLmdldEVsZW1lbnQoKSBpbnN0YW5jZW9mIEFjdGl2aXR5Tm9kZSkgewotCQkJCQlpZihub2RlLmlzVmlzaWJsZSgpKSB7Ci0JCQkJCQlzZXRFZGdlVmlzaWJpbGl0eShub2RlLCBmYWxzZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWlmKCFub2RlLmlzVmlzaWJsZSgpKSB7Ci0JCQkJCQlub2RlLnNldFZpc2libGUodHJ1ZSk7Ci0JCQkJCQlzZXRFZGdlVmlzaWJpbGl0eShub2RlLCB0cnVlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQkKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHNldEVkZ2VWaXNpYmlsaXR5KFZpZXcgdmlldywgYm9vbGVhbiB2aXNpYmlsaXR5KXsKLQkJRGlhZ3JhbSBkaWFncmFtID0gdmlldy5nZXREaWFncmFtKCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBkaWFncmFtLmdldEVkZ2VzKCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IKLQkJCQkuaGFzTmV4dCgpOykgewotCQkJRWRnZSBlZGdlID0gKEVkZ2UpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmKGVkZ2UuZ2V0U291cmNlKCkgPT0gdmlldyB8fCBlZGdlLmdldFRhcmdldCgpID09IHZpZXcpewotCQkJCWlmKHZpc2liaWxpdHkpewotCQkJCQl2aWV3LnNldFZpc2libGUodHJ1ZSk7Ci0JCQkJfQotCQkJCWVkZ2Uuc2V0VmlzaWJsZSh2aXNpYmlsaXR5KTsKLQkJCX0KLQkJfQotCX0KLQkvKioKLQkgKiBQb3B1bGF0ZXMgdGhlIGRpYWdyYW0gd2l0aCB0aGUgZGF0YSBmcm9tIHRoZSBVTUEgbW9kZWwuIFN1YmNsYXNzIHNob3VsZAotCSAqIG92ZXJyaWRlIHRoaXMgbWV0aG9kLgotCSAqLwotCXB1YmxpYyB2b2lkIHBvcHVsYXRlRGlhZ3JhbSgpIHsKLQkJYm9vbGVhbiBub3RpZnkgPSBub3RpZmljYXRpb25FbmFibGVkOwotCQl0cnkgewotCQkJbm90aWZpY2F0aW9uRW5hYmxlZCA9IGZhbHNlOwotCQkJZmluYWwgTGlzdDxBY3Rpdml0eU5vZGU+IHNlbGVjdGVkTm9kZXMgPSBuZXcgQXJyYXlMaXN0PEFjdGl2aXR5Tm9kZT4oKTsKLQkJCW9yZy5lY2xpcHNlLnVtbDIudW1sLkFjdGl2aXR5IGRpYWdyYW0gPSBnZXREaWFncmFtKCk7CQkJCi0JCQlUeFV0aWwucnVuSW5UcmFuc2FjdGlvbihkaWFncmFtLCBuZXcgUnVubmFibGUoKSB7Ci0KLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCXNlbGVjdGVkTm9kZXMuYWRkQWxsKHBvcHVsYXRlTm9kZXMoKSk7Ci0JCQkJCXBvcHVsYXRlTGlua3Moc2VsZWN0ZWROb2Rlcyk7Ci0JCQkJfQotCQkJCQotCQkJfSk7Ci0JCQkKLQkJCS8vIGFkZCB0aGlzIGRpYWdyYW0gdG8gdGhlIGNvbnN1bWVyIGxpc3Qgb2YgYWxsIG5vZGVzIHNvIHRoZXkgd2lsbCBub3QKLQkJCS8vIGJlIGRpc3Bvc2VkCi0JCQkvLyBiZWZvcmUgdGhpcyBkaWFncmFtLgotCQkJLy8KLQkJCWZvciAoQWN0aXZpdHlOb2RlIG5vZGUgOiBzZWxlY3RlZE5vZGVzKSB7Ci0JCQkJTm9kZUFkYXB0ZXIgbm9kZUFkYXB0ZXIgPSBCcmlkZ2VIZWxwZXIuZ2V0Tm9kZUFkYXB0ZXIobm9kZSk7Ci0JCQkJaWYobm9kZUFkYXB0ZXIgIT0gbnVsbCkgewotCQkJCQlub2RlQWRhcHRlci5hZGRDb25zdW1lcih0aGlzKTsKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCVR4VXRpbC5ydW5JblRyYW5zYWN0aW9uKGRpYWdyYW0sIG5ldyBSdW5uYWJsZSgpIHsKLQotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCXVwZGF0ZUVkZ2VzKHNlbGVjdGVkTm9kZXMpOwotCQkJCQkJdXBkYXRlVmlldyhzZWxlY3RlZE5vZGVzKTsKLQkJCQkJfSBjYXRjaChFeGNlcHRpb24gZSkgewotCQkJCQkJRGlhZ3JhbUNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJCQotCQkJfSk7Ci0JCX0KLQkJY2F0Y2goRXhjZXB0aW9uIGUpIHsKLQkJCURpYWdyYW1Db3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJfQotCQlmaW5hbGx5IHsKLQkJCW5vdGlmaWNhdGlvbkVuYWJsZWQgPSBub3RpZnk7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIENvbGxlY3Rpb24gcG9wdWxhdGVOb2RlcygpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RmlsdGVyKElGaWx0ZXIgZmlsdGVyKSB7Ci0JCXRoaXMuZmlsdGVyID0gZmlsdGVyOwotCX0KLQkKLQlwdWJsaWMgSUFjdGlvbk1hbmFnZXIgZ2V0QWN0aW9uTWFuYWdlcigpIHsKLQkJaWYoYWN0aW9uTWFuYWdlciA9PSBudWxsKSB7Ci0JCQlhY3Rpb25NYW5hZ2VyID0gbmV3IEFjdGlvbk1hbmFnZXIoKSB7Ci0JCQkJcHVibGljIGJvb2xlYW4gZG9BY3Rpb24oaW50IGFjdGlvblR5cGUsIEVPYmplY3Qgb2JqZWN0LCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgT2JqZWN0IHZhbHVlLCBpbnQgaW5kZXgpIHsKLQkJCQkJYm9vbGVhbiByZXQgPSBzdXBlci5kb0FjdGlvbihhY3Rpb25UeXBlLCBvYmplY3QsIGZlYXR1cmUsIHZhbHVlLCBpbmRleCk7Ci0JCQkJCWlmKHJldCkgewotCQkJCQkJdW1hTGFzdE1vZGlmaWVkID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIHJldDsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0JCXJldHVybiBhY3Rpb25NYW5hZ2VyOwotCX0KLQkKLQlwdWJsaWMgbG9uZyBnZXRVbWFMYXN0TW9kaWZpZWQoKSB7Ci0JCXJldHVybiB1bWFMYXN0TW9kaWZpZWQ7Ci0JfQotCi0JcHVibGljIElGaWx0ZXIgZ2V0RmlsdGVyKCkgewotCQlyZXR1cm4gZmlsdGVyOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2NvcmUvYnJpZGdlL05vZGVBZGFwdGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9jb3JlL2JyaWRnZS9Ob2RlQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZjNmYWIwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2NvcmUvYnJpZGdlL05vZGVBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NTggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuYnJpZGdlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLmltcGwuSW50ZXJuYWxUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLlN0clV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwudXRpbC5UeFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklBY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmliYWJsZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtCcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya09yZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5VbWFVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkZvbnRTdHlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob3RhdGlvblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eUVkZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuQWN0aXZpdHlOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkNvbnRyb2xOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLlVNTEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuVU1MUGFja2FnZTsKLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICoKLSAqIEBzaW5jZSAxLjIKLSAqLwotcHVibGljIGNsYXNzIE5vZGVBZGFwdGVyIGV4dGVuZHMgQWRhcHRlckltcGwgewotCQotCXByb3RlY3RlZCBjbGFzcyBNZXRob2RFbGVtZW50QWRhcHRlciBleHRlbmRzIEFkYXB0ZXJJbXBsIC8vaW1wbGVtZW50cyBJTm9kZUNoYW5nZUxpc3RlbmVyIAotCXsKLQkJLyoqCi0JCSAqIAotCQkgKiBAcGFyYW0gbXNnCi0JCSAqIEByZXR1cm4gTmV3IG5vZGVzIHdob3NlIHZpZXdzIG5lZWQgcmVmcmVzaCBhZnRlciB0aGV5IGhhdmUgYmVlbiBjcmVhdGVkCi0JCSAqLwotCQlwcm90ZWN0ZWQgQ29sbGVjdGlvbiBoYW5kbGVOb3RpZmljYXRpb24oTm90aWZpY2F0aW9uIG1zZykgewotCQkJc3dpdGNoIChtc2cuZ2V0RmVhdHVyZUlEKERlc2NyaWJhYmxlRWxlbWVudC5jbGFzcykpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5ERVNDUklCQUJMRV9FTEVNRU5UX19QUkVTRU5UQVRJT05fTkFNRToKLQkJCQlzZXROYW1lKG1zZy5nZXROZXdTdHJpbmdWYWx1ZSgpKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgVW1hUGFja2FnZS5ERVNDUklCQUJMRV9FTEVNRU5UX19TSEFQRUlDT046Ci0JCQljYXNlIFVtYVBhY2thZ2UuREVTQ1JJQkFCTEVfRUxFTUVOVF9fTk9ERUlDT046Ci0JCQkgICAvLyBDcmVhdGUgYSBuZXcgbm90aWZ5IHdoZW4gd2UndmUgZGV0ZWN0ZWQgdGhhdCB0aGUgaWNvbnMgbWF5IGhhdmUgY2hhbmdlZCwKLQkJCSAgIC8vIGJ5IGp1c3QgZm9yY2luZyBhIG5vdGlmeSBvbiB0aGUgbmFtZSwgd2UgY2F1c2UgdGhlIGljb25zIHRvIGdldCAKLQkJCSAgIC8vIHJlZnJlc2hlZCBhcyB3ZWxsLgotCQkJCUFjdGl2aXR5Tm9kZSBlID0gZ2V0Tm9kZSgpOwotCQkJCWUuZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwoKEludGVybmFsRU9iamVjdCkgZSwgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJCVVNTFBhY2thZ2UuTkFNRURfRUxFTUVOVF9fTkFNRSwgZS5nZXROYW1lKCksIGUuZ2V0TmFtZSgpLCB0cnVlKSk7Ci0JCQkJZS5lTm90aWZ5KG1zZyk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQkJfQotCQkKLQkJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChmaW5hbCBOb3RpZmljYXRpb24gbXNnKSB7Ci0JCQlpZihkb21haW4gPT0gbnVsbCB8fCBkb21haW4uZ2V0Q2hhbmdlUmVjb3JkZXIoKSA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCi0JCQlpZiAoIW5vdGlmaWNhdGlvbkVuYWJsZWQpCi0JCQkJcmV0dXJuOwotCQkJbm90aWZpY2F0aW9uRW5hYmxlZCA9IGZhbHNlOwotCQkJdHJ5IHsKLQkJCQlmaW5hbCBDb2xsZWN0aW9uPEFjdGl2aXR5Tm9kZT4gbmV3Tm9kZXNUb1JlZnJlc2ggPSBuZXcgQXJyYXlMaXN0PEFjdGl2aXR5Tm9kZT4oKTsKLQkJCQlUeFV0aWwucnVuSW5UcmFuc2FjdGlvbihkb21haW4sIG5ldyBSdW5uYWJsZSgpIHsKLQotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQluZXdOb2Rlc1RvUmVmcmVzaC5hZGRBbGwoaGFuZGxlTm90aWZpY2F0aW9uKG1zZykpOwotCQkJCQl9Ci0JCQkJCQotCQkJCX0pOwotCQkJCWlmKCFuZXdOb2Rlc1RvUmVmcmVzaC5pc0VtcHR5KCkpIHsKLQkJCQkJVHhVdGlsLnJ1bkluVHJhbnNhY3Rpb24oZG9tYWluLCBuZXcgUnVubmFibGUoKSB7Ci0KLQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQlmb3IgKEFjdGl2aXR5Tm9kZSBub2RlIDogbmV3Tm9kZXNUb1JlZnJlc2gpIHsKLQkJCQkJCQkJQnJpZGdlSGVscGVyLmdldE5vZGVBZGFwdGVyKG5vZGUpLnVwZGF0ZVZpZXcoKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQkKLQkJCQkJfSk7Ci0JCQkJfQotCQkJfQotCQkJY2F0Y2goRXhjZXB0aW9uIGUpIHsKLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJfSBmaW5hbGx5IHsKLQkJCQlub3RpZmljYXRpb25FbmFibGVkID0gdHJ1ZTsKLQkJCX0KLQkJfQotCi0JCXB1YmxpYyBOb2RlQWRhcHRlciBnZXROb2RlQWRhcHRlcigpIHsKLQkJCXJldHVybiBOb2RlQWRhcHRlci50aGlzOwotCQl9Ci0KLQl9Ci0JCi0JcHJvdGVjdGVkIE1ldGhvZEVsZW1lbnQgZWxlbWVudDsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBub3RpZmljYXRpb25FbmFibGVkID0gdHJ1ZTsKLQlwcml2YXRlIENvbGxlY3Rpb24gY29uc3VtZXJzID0gbmV3IEFycmF5TGlzdCgpOwotCXByb3RlY3RlZCBNZXRob2RFbGVtZW50QWRhcHRlciBtZXRob2RFbGVtZW50QWRhcHRlcjsKLQlwcml2YXRlIGJvb2xlYW4gdGFyZ2V0UmVhZE9ubHk7Ci0JcHJvdGVjdGVkIEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyIHdyYXBwZXI7Ci0JcHJvdGVjdGVkIEludGVybmFsVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gZG9tYWluOwotCXByaXZhdGUgVmlldyB2aWV3OwotCXByb3RlY3RlZCBJQWN0aW9uTWFuYWdlciBhY3Rpb25NYW5hZ2VyOwotCQotCXByb3RlY3RlZCBOb2RlQWRhcHRlcigpIHsKLQkJCi0JfQotCQotCXB1YmxpYyBJQWN0aW9uTWFuYWdlciBnZXRBY3Rpb25NYW5hZ2VyKCkgewotCQlpZihhY3Rpb25NYW5hZ2VyICE9IG51bGwpIHsKLQkJCXJldHVybiBhY3Rpb25NYW5hZ2VyOwotCQl9Ci0JCU5vZGVBZGFwdGVyIG5vZGVBZGFwdGVyID0gQnJpZGdlSGVscGVyLmdldE5vZGVBZGFwdGVyKGdldE5vZGUoKS5nZXRBY3Rpdml0eSgpKTsKLQkJcmV0dXJuIG5vZGVBZGFwdGVyLmdldEFjdGlvbk1hbmFnZXIoKTsKLQl9Ci0JCi0JcHVibGljIE5vZGVBZGFwdGVyKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyIHdyYXBwZXIpIHsKLQkJdGhpcygoTWV0aG9kRWxlbWVudCkgVG5nVXRpbC51bndyYXAod3JhcHBlcikpOwotCQl0aGlzLndyYXBwZXIgPSB3cmFwcGVyOwotCQl0YXJnZXRSZWFkT25seSA9IHdyYXBwZXIuaXNSZWFkT25seSgpOwotCX0KLQotCXB1YmxpYyBOb2RlQWRhcHRlcihNZXRob2RFbGVtZW50IGUpIHsKLQkJZWxlbWVudCA9IGU7Ci0JCW1ldGhvZEVsZW1lbnRBZGFwdGVyID0gY3JlYXRlTWV0aG9kRWxlbWVudEFkYXB0ZXIoKTsKLQkJZS5lQWRhcHRlcnMoKS5hZGQobWV0aG9kRWxlbWVudEFkYXB0ZXIpOwkJCi0JfQkJCQotCQotCXB1YmxpYyBWaWV3IGdldFZpZXcoKSB7Ci0JCWlmKHZpZXcgIT0gbnVsbCkgewotCQkJcmV0dXJuIHZpZXc7Ci0JCX0KLQkJVmlldyBkaWFncmFtVmlldyA9IGdldERpYWdyYW1WaWV3KCk7Ci0JCWlmKGRpYWdyYW1WaWV3ICE9IG51bGwpIHsKLQkJCXJldHVybiBCcmlkZ2VIZWxwZXIuZ2V0VmlldyhkaWFncmFtVmlldywgZ2V0Tm9kZSgpKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHJpdmF0ZSBWaWV3IGdldERpYWdyYW1WaWV3KCkgewotCQlBY3Rpdml0eSBkaWFncmFtID0gZ2V0RGlhZ3JhbSgpOwotCQlpZihkaWFncmFtICE9IG51bGwpIHsKLQkJCU5vZGVBZGFwdGVyIGFkYXB0ZXIgPSBCcmlkZ2VIZWxwZXIuZ2V0Tm9kZUFkYXB0ZXIoZGlhZ3JhbSk7Ci0JCQlpZihhZGFwdGVyICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gYWRhcHRlci5nZXRWaWV3KCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VmlldyhWaWV3IHZpZXcpIHsKLQkJdGhpcy52aWV3ID0gdmlldzsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRFZGl0aW5nRG9tYWluKEludGVybmFsVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gZG9tYWluKSB7Ci0JCXRoaXMuZG9tYWluID0gZG9tYWluOwotCX0KLQkJCQotCXB1YmxpYyBib29sZWFuIGlzVGFyZ2V0UmVhZE9ubHkoKSB7Ci0JCWlmKHRhcmdldFJlYWRPbmx5KSAgewotCQkJcmV0dXJuIHRhcmdldFJlYWRPbmx5OwotCQl9Ci0JCUFjdGl2aXR5IGFjdGl2aXR5ID0gZ2V0RGlhZ3JhbSgpOwotCQlpZihhY3Rpdml0eSAhPSB0YXJnZXQpIHsKLQkJCU5vZGVBZGFwdGVyIGRpYWdyYW1BZGFwdGVyID0gQnJpZGdlSGVscGVyLmdldE5vZGVBZGFwdGVyKGFjdGl2aXR5KTsKLQkJCWlmKGRpYWdyYW1BZGFwdGVyICE9IG51bGwgJiYgZGlhZ3JhbUFkYXB0ZXIuaXNUYXJnZXRSZWFkT25seSgpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBiYXNpY1NldFRhcmdldFJlYWRPbmx5KGJvb2xlYW4gYikgewotCQl0YXJnZXRSZWFkT25seSA9IGI7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0VGFyZ2V0UmVhZE9ubHkoYm9vbGVhbiB0YXJnZXRSZWFkT25seSkgewotCQlib29sZWFuIHVwZGF0ZVZpZXcgPSB0aGlzLnRhcmdldFJlYWRPbmx5ICE9IHRhcmdldFJlYWRPbmx5OwotCQl0aGlzLnRhcmdldFJlYWRPbmx5ID0gdGFyZ2V0UmVhZE9ubHk7Ci0JCWlmKHVwZGF0ZVZpZXcpIHsKLQkJCXVwZGF0ZVZpZXcoKTsKLQkJfQotCX0JCQotCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlVmlldygpIHsKLQkJVmlldyBub2RlID0gZ2V0VmlldygpOwotCQlpZihub2RlICE9IG51bGwpIHsKLS8vCQkJbm9kZS5zZXRNdXRhYmxlKCFpc1RhcmdldFJlYWRPbmx5KCkpOwotCQkJRm9udFN0eWxlIHN0eWxlID0gKEZvbnRTdHlsZSkgbm9kZS5nZXRTdHlsZShOb3RhdGlvblBhY2thZ2UuTGl0ZXJhbHMuRk9OVF9TVFlMRSk7Ci0vLwkJCWlmKHN0eWxlICE9IG51bGwpIHsKLS8vCQkJCUNvbG9yIGNvbG9yID0gaXNUYXJnZXRSZWFkT25seSgpID8gRGlhZ3JhbUNvbnN0YW50cy5SRUFEX09OTFlfRk9OVF9DT0xPUiA6IERpYWdyYW1Db25zdGFudHMuREVGQVVMVF9GT05UX0NPTE9SOwotLy8JCQkJc3R5bGUuc2V0Rm9udENvbG9yKEZpZ3VyZVV0aWxpdGllcy5SR0JUb0ludGVnZXIoY29sb3IuZ2V0UkdCKCkpLmludFZhbHVlKCkpOwotLy8JCQl9Ci0JCQlpZihzdHlsZSA9PSBudWxsKSB7Ci0JCQkJbm9kZS5jcmVhdGVTdHlsZShOb3RhdGlvblBhY2thZ2UuTGl0ZXJhbHMuRk9OVF9TVFlMRSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgTWV0aG9kRWxlbWVudEFkYXB0ZXIgY3JlYXRlTWV0aG9kRWxlbWVudEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgTWV0aG9kRWxlbWVudEFkYXB0ZXIoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIEFjdGl2aXR5Tm9kZSBnZXROb2RlKCkgewotCQlpZih0YXJnZXQgaW5zdGFuY2VvZiBBY3Rpdml0eU5vZGUpIHsKLQkJCXJldHVybiAoQWN0aXZpdHlOb2RlKSB0YXJnZXQ7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXByb3RlY3RlZCBBY3Rpdml0eSBnZXREaWFncmFtKCkgewotCQlpZih0YXJnZXQgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJcmV0dXJuIChBY3Rpdml0eSkgdGFyZ2V0OwotCQl9Ci0JCUFjdGl2aXR5Tm9kZSBub2RlID0gZ2V0Tm9kZSgpOwotCQlyZXR1cm4gbm9kZSAhPSBudWxsID8gbm9kZS5nZXRBY3Rpdml0eSgpIDogbnVsbDsKLQl9Ci0JCi0JcHJvdGVjdGVkIEFjdGl2aXR5RWRnZSBhZGRJbmNvbWluZ0Nvbm5lY3Rpb24oTWV0aG9kRWxlbWVudCBzb3VyY2UpIHsKLQkJQWN0aXZpdHlOb2RlIHNyY05vZGUgPSBCcmlkZ2VIZWxwZXIuZmluZE5vZGUoZ2V0RGlhZ3JhbSgpLCBzb3VyY2UsIHRydWUpOwotCQlpZiAoc3JjTm9kZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJLy8gZGlzYWJsZSBub3RpZmljYXRpb24gb2Ygc3JjTm9kZSBiZWZvcmUgYXNzb2NpYXRlIGl0IHdpdGggdGhlIGxpbmsKLQkJLy8gc28gaXQgd2lsbCBub3QgY3JlYXRlIGR1cGxpY2F0ZSBVTUEgZGF0YQotCQkvLwotCQlOb2RlQWRhcHRlciBzcmNOb2RlQWRhcHRlciA9IEJyaWRnZUhlbHBlci5nZXROb2RlQWRhcHRlcihzcmNOb2RlKTsKLQkJYm9vbGVhbiBub3RpZnkgPSBzcmNOb2RlQWRhcHRlciAhPSBudWxsID8gc3JjTm9kZUFkYXB0ZXIubm90aWZpY2F0aW9uRW5hYmxlZCA6IGZhbHNlOwotCQl0cnkgewotCQkJaWYoc3JjTm9kZUFkYXB0ZXIgIT0gbnVsbCkgc3JjTm9kZUFkYXB0ZXIubm90aWZpY2F0aW9uRW5hYmxlZCA9IGZhbHNlOwotCQkJQWN0aXZpdHlFZGdlIGVkZ2UgPSBVTUxGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVDb250cm9sRmxvdygpOwotCQkJZWRnZS5zZXRTb3VyY2Uoc3JjTm9kZSk7Ci0JCQllZGdlLnNldFRhcmdldChnZXROb2RlKCkpOwotCQkJZ2V0RGlhZ3JhbSgpLmdldEVkZ2VzKCkuYWRkKGVkZ2UpOwotCQkJcmV0dXJuIGVkZ2U7Ci0JCX0gZmluYWxseSB7Ci0JCQlpZihzcmNOb2RlQWRhcHRlciAhPSBudWxsKSBzcmNOb2RlQWRhcHRlci5ub3RpZmljYXRpb25FbmFibGVkID0gbm90aWZ5OwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIEFjdGl2aXR5RWRnZSBhZGRPdXRnb2luZ0Nvbm5lY3Rpb24oTWV0aG9kRWxlbWVudCB0YXJnZXQpIHsKLQkJQWN0aXZpdHlOb2RlIHRhcmdldE5vZGUgPSBCcmlkZ2VIZWxwZXIuZmluZE5vZGUoZ2V0RGlhZ3JhbSgpLCB0YXJnZXQpOwotCQlpZiAodGFyZ2V0Tm9kZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCQkKLQkJLy8gZGlzYWJsZSBub3RpZmljYXRpb24gb2YgdGFyZ2V0Tm9kZSBiZWZvcmUgYXNzb2NpYXRlIGl0IHdpdGggdGhlIGxpbmsKLQkJLy8gc28gaXQgd2lsbCBub3QgY3JlYXRlIGR1cGxpY2F0ZSBVTUEgZGF0YQotCQkvLwotCQlOb2RlQWRhcHRlciBub2RlQWRhcHRlciA9IEJyaWRnZUhlbHBlci5nZXROb2RlQWRhcHRlcih0YXJnZXROb2RlKTsKLQkJYm9vbGVhbiBub3RpZnkgPSBub2RlQWRhcHRlciAhPSBudWxsID8gbm9kZUFkYXB0ZXIubm90aWZpY2F0aW9uRW5hYmxlZCA6IGZhbHNlOwotCQl0cnkgewotCQkJaWYobm9kZUFkYXB0ZXIgIT0gbnVsbCkgbm9kZUFkYXB0ZXIubm90aWZpY2F0aW9uRW5hYmxlZCA9IGZhbHNlOwotCQkJQWN0aXZpdHlFZGdlIGVkZ2UgPSBnZXREaWFncmFtKCkuY3JlYXRlRWRnZSgiIiwgVU1MUGFja2FnZS5MaXRlcmFscy5DT05UUk9MX0ZMT1cpOyAvLyROT04tTkxTLTEkCi0JCQllZGdlLnNldFNvdXJjZShnZXROb2RlKCkpOwotCQkJZWRnZS5zZXRUYXJnZXQodGFyZ2V0Tm9kZSk7Ci0JCQlyZXR1cm4gZWRnZTsKLQkJfSBmaW5hbGx5IHsKLQkJCWlmKG5vZGVBZGFwdGVyICE9IG51bGwpIG5vZGVBZGFwdGVyLm5vdGlmaWNhdGlvbkVuYWJsZWQgPSBub3RpZnk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQWRkcyB0aGUgZ2l2ZW4gY29uc3VtZXIgdG8gdGhlIGNvbnN1bWVyIGxpc3Qgb2YgdGhpcyBub2RlLgotCSAqIAotCSAqIEBwYXJhbSBjb25zdW1lcgotCSAqLwotCXB1YmxpYyB2b2lkIGFkZENvbnN1bWVyKE9iamVjdCBjb25zdW1lcikgewotCQlpZiAoIWNvbnN1bWVycy5jb250YWlucyhjb25zdW1lcikpIHsKLQkJCWNvbnN1bWVycy5hZGQoY29uc3VtZXIpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIFJlbW92ZXMgdGhlIGdpdmVuIGNvbnN1bWVyIGZyb20gdGhlIGNvbnN1bWVyIGxpc3Qgb2YgdGhpcyBub2RlLiBEaXNwb3NlcwotCSAqIHRoZSBub2RlIGlmIGl0IGRvZXMgbm90IGhhdmUgYW55IG1vcmUgY29uc3VtZXIgYWZ0ZXIgdGhpcyBjYWxsLiBEaXNwb3NpbmcKLQkgKiBhIG5vZGUgd2lsbCB0YWtlIGNhcmUgb2YgcmVtb3ZpbmcgdGhpcyBub2RlJ3MgbGlzdGVuZXIgZnJvbSB0aGUgVU1BCi0JICogb2JqZWN0IGFuZCBhbGwgdGhlIGFkYXB0ZXJzIHRoYXQgaGFkIGJlZW4gYWRkZWQgdG8gdGhlIGFkYXB0ZXIgbGlzdCBvZgotCSAqIHRoaXMgbm9kZS4KLQkgKiAKLQkgKiBAcGFyYW0gY29uc3VtZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVDb25zdW1lcihPYmplY3QgY29uc3VtZXIpIHsKLQkJY29uc3VtZXJzLnJlbW92ZShjb25zdW1lcik7Ci0JCWlmIChjb25zdW1lcnMuaXNFbXB0eSgpKSB7Ci0JCQkvLyBubyBtb3JlIGNvbnN1bWVyIG9mIHRoaXMgbm9kZSwgaXQgc2hvdWxkIGJlIGRpc3Bvc2VkCi0JCQlkaXNwb3NlKCk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJLy8gc2V0IGRvbWFpbiB0byBudWxsIGJlZm9yZSByZW1vdmluZyBtZXRob2RFbGVtZW50QWRhcHRlciBmcm9tIHRoZQotCQkvLyBtZXRob2QgZWxlbWVudCBzbyBtZXRob2RFbGVtZW50IGNhbiBza2lwIGhhbmRsaW5nIFJFTU9WRV9BREFQVEVSIGV2ZW50Ci0JCS8vIHRoYXQgc29tZXRpbWVzIHJlcXVpcmVzIG5ldyB0cmFuc2FjdGlvbiB0byBiZSBjcmVhdGVkIGFuZCBjYXVzZXMgZGVhZC1sb2NrCi0JCS8vCi0JCWRvbWFpbiA9IG51bGw7Ci0JCUVPYmplY3Qgb2JqID0gZWxlbWVudDsKLQkJaWYgKG9iaiAhPSBudWxsKSB7Ci0JCQlpZiAobWV0aG9kRWxlbWVudEFkYXB0ZXIgIT0gbnVsbCkgewotCQkJCW9iai5lQWRhcHRlcnMoKS5yZW1vdmUobWV0aG9kRWxlbWVudEFkYXB0ZXIpOwotCQkJfQotCQl9Ci0JCWlmKHRhcmdldCAhPSBudWxsKSB7Ci0JCQl0YXJnZXQuZUFkYXB0ZXJzKCkucmVtb3ZlKHRoaXMpOwotCQl9Ci0JCQotCQllbGVtZW50ID0gbnVsbDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmV3U3RyaW5nVmFsdWUpIHsKLQkJQWN0aXZpdHlOb2RlIGUgPSBnZXROb2RlKCk7Ci0JCWlmKGUgIT0gbnVsbCkgewotCQkJZS5zZXROYW1lKG5ld1N0cmluZ1ZhbHVlKTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVOb3RpZmljYXRpb24oTm90aWZpY2F0aW9uIG1zZykgewotCQlzd2l0Y2gobXNnLmdldEZlYXR1cmVJRChBY3Rpdml0eU5vZGUuY2xhc3MpKSB7Ci0JCWNhc2UgVU1MUGFja2FnZS5BQ1RJVklUWV9OT0RFX19OQU1FOgotCQkJaWYgKG1zZy5nZXRFdmVudFR5cGUoKSA9PSBOb3RpZmljYXRpb24uU0VUCi0JCQkJCSYmIGdldEVsZW1lbnQoKSBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnQpIHsKLQkJCQlTdHJpbmcgbmV3TmFtZSA9IG1zZy5nZXROZXdTdHJpbmdWYWx1ZSgpOwotCQkJCUJyZWFrZG93bkVsZW1lbnQgZSA9ICgoQnJlYWtkb3duRWxlbWVudCkgZ2V0RWxlbWVudCgpKTsKLQkJCQllLnNldFByZXNlbnRhdGlvbk5hbWUobmV3TmFtZSk7Ci0JCQkJaWYgKFN0clV0aWwuaXNCbGFuayhlLmdldE5hbWUoKSkpIHsKLQkJCQkJZS5zZXROYW1lKG5ld05hbWUpOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybjsKLQkJY2FzZSBVTUxQYWNrYWdlLkFDVElWSVRZX05PREVfX0lOQ09NSU5HOiAvLyBpbmNvbWluZyBjb25uZWN0aW9ucwotCQkJQWN0aXZpdHlFZGdlIGxpbms7Ci0JCQlzd2l0Y2ggKG1zZy5nZXRFdmVudFR5cGUoKSkgewotCQkJY2FzZSBOb3RpZmljYXRpb24uQUREOgotCQkJCWxpbmsgPSAoQWN0aXZpdHlFZGdlKSBtc2cuZ2V0TmV3VmFsdWUoKTsKLQkJCQlhZGRUb1VNQShsaW5rKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE5vdGlmaWNhdGlvbi5BRERfTUFOWToKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSAoKENvbGxlY3Rpb24pIG1zZy5nZXROZXdWYWx1ZSgpKQotCQkJCQkJLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQlhZGRUb1VNQSgoQWN0aXZpdHlFZGdlKSBpdGVyLm5leHQoKSk7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJY2FzZSBOb3RpZmljYXRpb24uUkVNT1ZFOgotCQkJCWxpbmsgPSAoQWN0aXZpdHlFZGdlKSBtc2cuZ2V0T2xkVmFsdWUoKTsKLQkJCQlpZiAobGluay5nZXRTb3VyY2UoKSAhPSBudWxsKSB7Ci0JCQkJCU5vZGVBZGFwdGVyIG5vZGVBZGFwdGVyID0gQnJpZGdlSGVscGVyLmdldE5vZGVBZGFwdGVyKGxpbmsuZ2V0U291cmNlKCkpOwotCQkJCQlpZihub2RlQWRhcHRlciAhPSBudWxsKSB7Ci0JCQkJCQlub2RlQWRhcHRlci5yZW1vdmVGcm9tVU1BKGxpbmssIGxpbmsKLQkJCQkJCQkJLmdldFNvdXJjZSgpLCAoQWN0aXZpdHlOb2RlKSBtc2cuZ2V0Tm90aWZpZXIoKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIE5vdGlmaWNhdGlvbi5SRU1PVkVfTUFOWToKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSAoKENvbGxlY3Rpb24pIG1zZy5nZXRPbGRWYWx1ZSgpKQotCQkJCQkJLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQlsaW5rID0gKEFjdGl2aXR5RWRnZSkgaXRlci5uZXh0KCk7Ci0JCQkJCWlmIChsaW5rLmdldFNvdXJjZSgpICE9IG51bGwpIHsKLQkJCQkJCU5vZGVBZGFwdGVyIG5vZGVBZGFwdGVyID0gQnJpZGdlSGVscGVyLmdldE5vZGVBZGFwdGVyKGxpbmsuZ2V0U291cmNlKCkpOwotCQkJCQkJaWYobm9kZUFkYXB0ZXIgIT0gbnVsbCkgewotCQkJCQkJCW5vZGVBZGFwdGVyLnJlbW92ZUZyb21VTUEobGluaywKLQkJCQkJCQkJCWxpbmsuZ2V0U291cmNlKCksIChBY3Rpdml0eU5vZGUpIG1zZy5nZXROb3RpZmllcigpKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQlicmVhazsKLQkJCX0KLQkJCXJldHVybjsKLQkJY2FzZSBVTUxQYWNrYWdlLkFDVElWSVRZX05PREVfX09VVEdPSU5HOgotCQkJc3dpdGNoIChtc2cuZ2V0RXZlbnRUeXBlKCkpIHsKLQkJCWNhc2UgTm90aWZpY2F0aW9uLkFERDoKLQkJCQlsaW5rID0gKEFjdGl2aXR5RWRnZSkgbXNnLmdldE5ld1ZhbHVlKCk7Ci0JCQkJaWYgKGxpbmsuZ2V0VGFyZ2V0KCkgIT0gbnVsbCkgewotCQkJCQlOb2RlQWRhcHRlciBub2RlQWRhcHRlciA9IEJyaWRnZUhlbHBlci5nZXROb2RlQWRhcHRlcihsaW5rLmdldFRhcmdldCgpKTsKLQkJCQkJaWYobm9kZUFkYXB0ZXIgIT0gbnVsbCkgewotCQkJCQkJbm9kZUFkYXB0ZXIuYWRkVG9VTUEobGluayk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIE5vdGlmaWNhdGlvbi5BRERfTUFOWToKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSAoKENvbGxlY3Rpb24pIG1zZy5nZXROZXdWYWx1ZSgpKQotCQkJCQkJLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQlsaW5rID0gKEFjdGl2aXR5RWRnZSkgaXRlci5uZXh0KCk7Ci0JCQkJCU5vZGVBZGFwdGVyIG5vZGVBZGFwdGVyID0gQnJpZGdlSGVscGVyLmdldE5vZGVBZGFwdGVyKGxpbmsuZ2V0VGFyZ2V0KCkpOwotCQkJCQlpZihub2RlQWRhcHRlciAhPSBudWxsKSB7Ci0JCQkJCQlub2RlQWRhcHRlci5hZGRUb1VNQShsaW5rKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlicmVhazsKLQkJCWNhc2UgTm90aWZpY2F0aW9uLlJFTU9WRToKLQkJCQlsaW5rID0gKEFjdGl2aXR5RWRnZSkgbXNnLmdldE9sZFZhbHVlKCk7Ci0JCQkJaWYgKGxpbmsuZ2V0VGFyZ2V0KCkgIT0gbnVsbCkgewotCQkJCQlyZW1vdmVGcm9tVU1BKGxpbmssIChBY3Rpdml0eU5vZGUpIG1zZy5nZXROb3RpZmllcigpLCBsaW5rCi0JCQkJCQkJLmdldFRhcmdldCgpKTsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIE5vdGlmaWNhdGlvbi5SRU1PVkVfTUFOWToKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSAoKENvbGxlY3Rpb24pIG1zZy5nZXRPbGRWYWx1ZSgpKQotCQkJCQkJLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQlsaW5rID0gKEFjdGl2aXR5RWRnZSkgaXRlci5uZXh0KCk7Ci0JCQkJCWlmIChsaW5rLmdldFRhcmdldCgpICE9IG51bGwpIHsKLQkJCQkJCXJlbW92ZUZyb21VTUEobGluaywgKEFjdGl2aXR5Tm9kZSkgbXNnLmdldE5vdGlmaWVyKCksIGxpbmsKLQkJCQkJCQkJLmdldFRhcmdldCgpKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVySW1wbCNub3RpZnlDaGFuZ2VkKG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBtc2cpIHsKLQkJaWYgKCFub3RpZmljYXRpb25FbmFibGVkKQotCQkJcmV0dXJuOwotCQlub3RpZmljYXRpb25FbmFibGVkID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQloYW5kbGVOb3RpZmljYXRpb24obXNnKTsKLQkJfSBmaW5hbGx5IHsKLQkJCW5vdGlmaWNhdGlvbkVuYWJsZWQgPSB0cnVlOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIEFkZHMgdGhlIGRhdGEgZm9yIHRoZSBuZXdseSBhZGRlZCBub2RlIHRvIHRoZSBVTUEgbW9kZWwgU3ViY2xhc3Mgc2hvdWxkCi0JICogb3ZlcnJpZGUgdGhpcyBtZXRob2QuCi0JICogCi0JICogQHBhcmFtIHBvc2l0aW9uCi0JICogQHBhcmFtIG5ld1ZhbHVlCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkVG9VbWFNb2RlbChpbnQgcG9zaXRpb24sIEFjdGl2aXR5Tm9kZSBub2RlKSB7CQkKLS8vVE9ETzogcmV2aWV3Ci0vLwkJaWYgKGFkZGVkTm9kZS5nZXRHcmFwaE5vZGUoKSA9PSBudWxsKSB7Ci0vLwkJCS8vIHRoaXMgbm9kZSBpcyByZWFkZGVkIGFmdGVyIHVuZG8KLS8vCQkJLy8KLS8vCQkJKChOb2RlSW1wbCkgYWRkZWROb2RlKS5iYXNpY1NldE9iamVjdChhZGRlZE5vZGUuZ2V0T2JqZWN0KCkpOwotLy8JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBub2RlQWRkZWQoaW50IGluZGV4LCBBY3Rpdml0eU5vZGUgbm9kZSkgewotCQlOb2RlQWRhcHRlciBub2RlQWRhcHRlciA9IEJyaWRnZUhlbHBlci5nZXROb2RlQWRhcHRlcihub2RlKTsKLQkJaWYobm9kZUFkYXB0ZXIgPT0gbnVsbCkgewotCQkJbm9kZUFkYXB0ZXIgPSBhZGROb2RlQWRhcHRlclRvKG5vZGUpOwotCQl9Ci0JCWFkZFRvVW1hTW9kZWwoaW5kZXgsIG5vZGUpOwkJCi0JCWlmKG5vZGVBZGFwdGVyICE9IG51bGwpIHsKLQkJCW5vZGVBZGFwdGVyLmFkZENvbnN1bWVyKHRoaXMpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCBOb2RlQWRhcHRlciBhZGROb2RlQWRhcHRlclRvKEFjdGl2aXR5Tm9kZSBub2RlKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKioKLQkgKiBSZW1vdmVzIHRoZSBkYXRhIGZvciB0aGUgcmVtb3ZlZCBub2RlIGZyb20gdGhlIFVNQSBtb2RlbCBTdWJjbGFzcyBzaG91bGQKLQkgKiBvdmVycmlkZSB0aGlzIG1ldGhvZC4KLQkgKiAKLQkgKiBAcGFyYW0gbm9kZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbW92ZUZyb21VbWFNb2RlbChBY3Rpdml0eU5vZGUgbm9kZSkgewotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBub2RlUmVtb3ZlZChBY3Rpdml0eU5vZGUgbm9kZSkgewotCQlyZW1vdmVGcm9tVW1hTW9kZWwobm9kZSk7Ci0JCU5vZGVBZGFwdGVyIG5vZGVBZGFwdGVyID0gQnJpZGdlSGVscGVyLmdldE5vZGVBZGFwdGVyKG5vZGUpOwotCQlpZihub2RlQWRhcHRlciAhPSBudWxsKSB7Ci0JCQlub2RlQWRhcHRlci5yZW1vdmVDb25zdW1lcih0aGlzKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGFkZFRvVU1BKEFjdGl2aXR5RWRnZSBsaW5rKSB7Ci0JCWlmIChsaW5rLmdldFRhcmdldCgpID09IG51bGwgfHwgbGluay5nZXRTb3VyY2UoKSA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwkJCi0JCXJldHVybiB0cnVlOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVGcm9tVU1BKEFjdGl2aXR5RWRnZSBsaW5rLCBBY3Rpdml0eU5vZGUgb2xkU291cmNlLCBBY3Rpdml0eU5vZGUgb2xkVGFyZ2V0KSB7Ci0JCU1ldGhvZEVsZW1lbnQgdGFyZ2V0RWxlbWVudCA9IEJyaWRnZUhlbHBlci5nZXRNZXRob2RFbGVtZW50KG9sZFRhcmdldCk7Ci0JCWlmICh0YXJnZXRFbGVtZW50IGluc3RhbmNlb2YgV29ya0JyZWFrZG93bkVsZW1lbnQpIHsKLQkJCS8vIHRoaXMgaXMgYSBkaXJlY3QgbGluawotCQkJLy8gcmVtb3ZlIFdvcmtPcmRlcgotCQkJLy8KLQkJCU5vZGVBZGFwdGVyIHRhcmdldE5vZGVBZGFwdGVyID0gQnJpZGdlSGVscGVyLmdldE5vZGVBZGFwdGVyKG9sZFRhcmdldCk7Ci0JCQlib29sZWFuIG5vdGlmeSA9IHRhcmdldE5vZGVBZGFwdGVyICE9IG51bGwgPyB0YXJnZXROb2RlQWRhcHRlci5ub3RpZmljYXRpb25FbmFibGVkIDogZmFsc2U7Ci0JCQl0cnkgewotCQkJCWlmKHRhcmdldE5vZGVBZGFwdGVyICE9IG51bGwpIHsKLQkJCQkJdGFyZ2V0Tm9kZUFkYXB0ZXIubm90aWZpY2F0aW9uRW5hYmxlZCA9IGZhbHNlOwotCQkJCX0KLQkJCQlpZiAoQnJpZGdlSGVscGVyLmNhblJlbW92ZUFsbFByZWRzKGxpbmssIG9sZFNvdXJjZSwKLQkJCQkJCW9sZFRhcmdldCkpIHsKLQkJCQkJT2JqZWN0IHByZWQgPSBCcmlkZ2VIZWxwZXIuZ2V0TWV0aG9kRWxlbWVudChvbGRTb3VyY2UpOwotCQkJCQlpZihwcmVkIGluc3RhbmNlb2YgV29ya0JyZWFrZG93bkVsZW1lbnQpIHsKLQkJCQkJCVdvcmtCcmVha2Rvd25FbGVtZW50IGUgPSAoV29ya0JyZWFrZG93bkVsZW1lbnQpIEJyaWRnZUhlbHBlci5nZXRNZXRob2RFbGVtZW50KG9sZFRhcmdldCk7Ci0JCQkJCQlDb2xsZWN0aW9uPFdvcmtPcmRlcj4gd29ya09yZGVycyA9IFVtYVV0aWwuZmluZFdvcmtPcmRlcihlLCAoV29ya0JyZWFrZG93bkVsZW1lbnQpIHByZWQsIHRydWUpOwotCQkJCQkJaWYoIXdvcmtPcmRlcnMuaXNFbXB0eSgpKSB7Ci0JCQkJCQkJZ2V0QWN0aW9uTWFuYWdlcigpLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlJFTU9WRV9NQU5ZLCBlLCAKLQkJCQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuV09SS19CUkVBS0RPV05fRUxFTUVOVF9fTElOS19UT19QUkVERUNFU1NPUiwgd29ya09yZGVycywgLTEpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfSBmaW5hbGx5IHsKLQkJCQlpZih0YXJnZXROb2RlQWRhcHRlciAhPSBudWxsKSB7Ci0JCQkJCXRhcmdldE5vZGVBZGFwdGVyLm5vdGlmaWNhdGlvbkVuYWJsZWQgPSBub3RpZnk7Ci0JCQkJfQotCQkJfQotCQl9IGVsc2UgaWYob2xkVGFyZ2V0IGluc3RhbmNlb2YgQ29udHJvbE5vZGUgJiYgQnJpZGdlSGVscGVyLmlzU3luY2hCYXIob2xkVGFyZ2V0KSkgewotCQkJLy8gZ2V0IGFsbCB0aGUgV29ya0JyZWFrZG93bkVsZW1lbnROb2RlcyB0aGF0IHRoaXMgc3luY2ggYmFyIGlzCi0JCQkvLyBjb21pbmcgdG8gYW5kCi0JCQkvLyByZW1vdmUgdGhlIFdvcmtPcmRlcnMgd2l0aCB0aGlzIFdvcmtCcmVha2Rvd25FbGVtZW50Tm9kZSdzCi0JCQkvLyBhY3Rpdml0eSBhcyBwcmVkZWNlc3NvciBmcm9tIHRoZW0KLQkJCS8vCi0JCQlDb2xsZWN0aW9uPEFjdGl2aXR5Tm9kZT4gYWN0Tm9kZXMgPSBuZXcgQXJyYXlMaXN0PEFjdGl2aXR5Tm9kZT4oKTsKLQkJCUJyaWRnZUhlbHBlci5nZXRTdWNjZXNzb3JOb2RlcyhhY3ROb2Rlcywgb2xkVGFyZ2V0KTsKLQkJCWZvciAoQWN0aXZpdHlOb2RlIG5vZGUgOiBhY3ROb2RlcykgewotCQkJCVdvcmtCcmVha2Rvd25FbGVtZW50IGUgPSAoV29ya0JyZWFrZG93bkVsZW1lbnQpIEJyaWRnZUhlbHBlci5nZXRNZXRob2RFbGVtZW50KG5vZGUpOwotCQkJCU5vZGVBZGFwdGVyIG5vZGVBZGFwdGVyID0gQnJpZGdlSGVscGVyLmdldE5vZGVBZGFwdGVyKG5vZGUpOwotCQkJCWJvb2xlYW4gbm90aWZ5ID0gbm9kZUFkYXB0ZXIgIT0gbnVsbCA/IG5vZGVBZGFwdGVyLm5vdGlmaWNhdGlvbkVuYWJsZWQgOiBmYWxzZTsKLQkJCQl0cnkgewotCQkJCQlpZihub2RlQWRhcHRlciAhPSBudWxsKSB7Ci0JCQkJCQlub2RlQWRhcHRlci5ub3RpZmljYXRpb25FbmFibGVkID0gZmFsc2U7Ci0JCQkJCX0KLQkJCQkJaWYgKEJyaWRnZUhlbHBlci5jYW5SZW1vdmVBbGxQcmVkcyhsaW5rLCBvbGRTb3VyY2UsIG5vZGUpKSB7Ci0JCQkJCQlXb3JrT3JkZXIgd287Ci0JCQkJCQl3aGlsZSAoKHdvID0gVW1hVXRpbC5maW5kV29ya09yZGVyKGUsIEJyaWRnZUhlbHBlci5nZXRNZXRob2RFbGVtZW50KG9sZFNvdXJjZSkpKSAhPSBudWxsKSB7Ci0JCQkJCQkJZ2V0QWN0aW9uTWFuYWdlcigpLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlJFTU9WRSwgZSwgCi0JCQkJCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLldPUktfQlJFQUtET1dOX0VMRU1FTlRfX0xJTktfVE9fUFJFREVDRVNTT1IsIHdvLCAtMSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9IGZpbmFsbHkgewotCQkJCQlpZihub2RlQWRhcHRlciAhPSBudWxsKSB7Ci0JCQkJCQlub2RlQWRhcHRlci5ub3RpZmljYXRpb25FbmFibGVkID0gbm90aWZ5OwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCQotCS8qKgotCSAqIGFkZERlZmF1bHRXb3JrT3JkZXIgaXMgbW92ZWQgZnJvbQotCSAqIEdyYXBoaWNhbERhdGFIZWxwZXIuYWRkRGVmYXVsdFdvcmtPcmRlcihOYW1lZE5vZGVJbXBsLAotCSAqIFdvcmticmVha2Rvd25FbGVtZW50KSBNZXRob2Qgd2lsbCBzZXQgbm90aWZpY2F0aW9uRW5hYmxlZCBmbGFnIHRvIGZhbHNlCi0JICogb2YgYWxsIGFkYXB0ZXJzIG9mIHR5cGUgTWV0aG9kRWxlbWVudEFkYXB0ZXIgb2YgU3VjY2Vzc29yIG9iamVjdCBiZWZvcmUKLQkgKiBjcmVhdGluZyBhIFdvcmtPcmRlciBvYmplY3QuIEFmdGVyIGNyZWF0aW9uIG9mIFdvcmtPcmRlciAoUHJlZGVjZXNzb3IKLQkgKiBsaW5rKSByZXN0b3JlcyB0aGUgbm90aWZpY2F0aW9uRW5hYmxlZCBmbGFnIG9mIFN1Y2Nlc3NvcidzIGFkYXB0ZXJzIG9mCi0JICogdHlwZSBNZXRob2RFbGVtZW50QWRhcHRlci4KLQkgKiAKLQkgKiBlZzogSWYgYW4gQWN0aXZpdHkgImFjdEEiIGlzIGV4dGVuZGVkIGluIGFub3RoZXIgQ1AuIEJhc2UgImFjdEEiIEFECi0JICogZGlhZ3JhbSBpcyBvcGVuZWQsIGFuZCBFeHRlbmRlZCAiYWN0QSIgQUQgRGlhZ3JhbSBpcyBvcGVuZWQuIE9uIGNyZWF0aW5nCi0JICogcHJlZGVjZXNzb3IgbGluayBiZXR3ZWVuIGFueSB0d28gY2hpbGQgYWN0aXZpdGllcywgY3JlYXRlcyBhIGV4dHJhIGxpbmsKLQkgKiBpbiBFeHRlbmRlZCAiYWN0QSIgQUQgZGlhZ3JhbSwgYmVjYXVzZSBjcmVhdGluZyB3b3Jrb3JkZXIgd2lsbCBub3RpZnkgdGhlCi0JICogZXh0ZW5kZWQgImFjdEEiIGRpYWdyYW0gdG8gZHJhdyBhIGxpbmsuIFRvIGF2b2lkIGR1cGxpY2F0ZSBsaW5rcyBpbiB0aGUKLQkgKiBleHRlbmRlZCBhY3Rpdml0eSBkaWFncmFtLCB3ZSBoYXZlIHRvIHNldCBub3RpZmljYXRpb25FbmFibGVkIGZsYWcgdG8KLQkgKiBmYWxzZSwgYmVmb3JlIGNyZWF0aW5nIGEgV29ya09yZGVyIG9iamVjdC4KLQkgKiAKLQkgKi8KLQlwdWJsaWMgV29ya09yZGVyIGFkZERlZmF1bHRXb3JrT3JkZXIoQWN0aXZpdHlOb2RlIG5vZGUsCi0JCQlXb3JrQnJlYWtkb3duRWxlbWVudCBwcmVkQnJlYWtkb3duRWxlbWVudCkgewotCQlOb2RlQWRhcHRlciBub2RlQWRhcHRlciA9IEJyaWRnZUhlbHBlci5nZXROb2RlQWRhcHRlcihub2RlKTsKLQkJYm9vbGVhbiBub3RpZnkgPSBub2RlQWRhcHRlci5ub3RpZmljYXRpb25FbmFibGVkOwotCQlNYXAgbWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJTWV0aG9kRWxlbWVudCBlID0gbm9kZUFkYXB0ZXIuZ2V0RWxlbWVudCgpOwotCQlMaXN0IGxpc3QgPSBlLmVBZGFwdGVycygpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gbGlzdC5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3Qgb2JqID0gaXRlcmF0b3IubmV4dCgpOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnRBZGFwdGVyKSB7Ci0JCQkJTm9kZUFkYXB0ZXIgb3RoZXJOb2RlQWRhcHRlciA9IChOb2RlQWRhcHRlcikgKChNZXRob2RFbGVtZW50QWRhcHRlcikgb2JqKQotCQkJCQkJLmdldE5vZGVBZGFwdGVyKCk7Ci0JCQkJYm9vbGVhbiBwcmVkTm90aWZpY2F0aW9uID0gbm9kZUFkYXB0ZXIubm90aWZpY2F0aW9uRW5hYmxlZDsKLQkJCQlvdGhlck5vZGVBZGFwdGVyLm5vdGlmaWNhdGlvbkVuYWJsZWQgPSBmYWxzZTsKLQkJCQltYXAucHV0KG90aGVyTm9kZUFkYXB0ZXIsIG5ldyBCb29sZWFuKHByZWROb3RpZmljYXRpb24pKTsKLQkJCX0KLQkJfQotCQl0cnkgewotCQkJbm9kZUFkYXB0ZXIubm90aWZpY2F0aW9uRW5hYmxlZCA9IGZhbHNlOwotCQkJV29ya09yZGVyIHdvID0gVW1hVXRpbC5jcmVhdGVEZWZhdWx0V29ya09yZGVyKChXb3JrQnJlYWtkb3duRWxlbWVudCkgZSwgcHJlZEJyZWFrZG93bkVsZW1lbnQsIGZhbHNlKTsKLQkJCWdldEFjdGlvbk1hbmFnZXIoKS5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5BREQsIGUsIAotCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLldPUktfQlJFQUtET1dOX0VMRU1FTlRfX0xJTktfVE9fUFJFREVDRVNTT1IsIHdvLCAtMSk7Ci0JCQlyZXR1cm4gd287Ci0JCX0gZmluYWxseSB7Ci0JCQlub2RlQWRhcHRlci5zZXROb3RpZmljYXRpb25FbmFibGVkKG5vdGlmeSk7Ci0JCQlTZXQgc2V0ID0gbWFwLmtleVNldCgpOwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gc2V0Lml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBvYmplY3QgPSBpdGVyLm5leHQoKTsKLQkJCQlPYmplY3Qgb2JqID0gbWFwLmdldChvYmplY3QpOwotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBCb29sZWFuKSB7Ci0JCQkJCWJvb2xlYW4gcHJlZG5vdCA9ICgoQm9vbGVhbikgb2JqKS5ib29sZWFuVmFsdWUoKTsKLQkJCQkJKChOb2RlQWRhcHRlcikgb2JqZWN0KS5ub3RpZmljYXRpb25FbmFibGVkID0gcHJlZG5vdDsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXROb3RpZmljYXRpb25FbmFibGVkKGJvb2xlYW4gbm90aWZ5KSB7Ci0JCW5vdGlmaWNhdGlvbkVuYWJsZWQgPSBub3RpZnk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGlzTm90aWZpY2F0aW9uRW5hYmxlZCgpIHsKLQkJcmV0dXJuIG5vdGlmaWNhdGlvbkVuYWJsZWQ7Ci0JfQotCQotCXB1YmxpYyBNZXRob2RFbGVtZW50IGdldEVsZW1lbnQoKSB7Ci0JCXJldHVybiBlbGVtZW50OwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFRhcmdldChOb3RpZmllciBuZXdUYXJnZXQpIHsKLQkJaWYobmV3VGFyZ2V0ID09IG51bGwpIHsKLQkJCWRpc3Bvc2UoKTsKLQkJfQotCQlzdXBlci5zZXRUYXJnZXQobmV3VGFyZ2V0KTsKLQl9Ci0JCi0JcHVibGljIEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyIGdldFdyYXBwZXIoKSB7Ci0JCXJldHVybiB3cmFwcGVyOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2NvcmUvYnJpZGdlL1dvcmtCcmVha2Rvd25FbGVtZW50Tm9kZUFkYXB0ZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2NvcmUvYnJpZGdlL1dvcmtCcmVha2Rvd25FbGVtZW50Tm9kZUFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2U1OTE2MC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9jb3JlL2JyaWRnZS9Xb3JrQnJlYWtkb3duRWxlbWVudE5vZGVBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuYnJpZGdlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtPcmRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eUVkZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuQWN0aXZpdHlOb2RlOwotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKgotICogQHNpbmNlIDEuMgotICovCi1wdWJsaWMgY2xhc3MgV29ya0JyZWFrZG93bkVsZW1lbnROb2RlQWRhcHRlciBleHRlbmRzIE5vZGVBZGFwdGVyIHsKLQlwcml2YXRlIGNsYXNzIFdvcmtCcmVha2Rvd25FbGVtZW50QWRhcHRlciBleHRlbmRzIE1ldGhvZEVsZW1lbnRBZGFwdGVyIHsKLQkJcHJvdGVjdGVkIENvbGxlY3Rpb24gaGFuZGxlTm90aWZpY2F0aW9uKE5vdGlmaWNhdGlvbiBtc2cpIHsKLQkJCVdvcmtPcmRlciBvYmo7Ci0JCQlzd2l0Y2ggKG1zZy5nZXRGZWF0dXJlSUQoV29ya0JyZWFrZG93bkVsZW1lbnQuY2xhc3MpKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19CUkVBS0RPV05fRUxFTUVOVF9fTElOS19UT19QUkVERUNFU1NPUjoKLQkJCQlzd2l0Y2ggKG1zZy5nZXRFdmVudFR5cGUoKSkgewotCQkJCWNhc2UgTm90aWZpY2F0aW9uLkFERDoKLQkJCQkJb2JqID0gKFdvcmtPcmRlcikgbXNnLmdldE5ld1ZhbHVlKCk7Ci0JCQkJCWFkZEluY29taW5nQ29ubmVjdGlvbihvYmouZ2V0UHJlZCgpKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBOb3RpZmljYXRpb24uUkVNT1ZFOgotCQkJCQlvYmogPSAoV29ya09yZGVyKSBtc2cuZ2V0T2xkVmFsdWUoKTsKLQkJCQkJcmVtb3ZlSW5jb21pbmdDb25uZWN0aW9uKG9iai5nZXRQcmVkKCkpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIE5vdGlmaWNhdGlvbi5BRERfTUFOWToKLQkJCQkJQ29sbGVjdGlvbiBjb2xsZWN0aW9uID0gKENvbGxlY3Rpb24pIG1zZy5nZXROZXdWYWx1ZSgpOwotCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjb2xsZWN0aW9uLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQkJb2JqID0gKFdvcmtPcmRlcikgaXRlci5uZXh0KCk7Ci0JCQkJCQlhZGRJbmNvbWluZ0Nvbm5lY3Rpb24ob2JqLmdldFByZWQoKSk7Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBOb3RpZmljYXRpb24uUkVNT1ZFX01BTlk6Ci0JCQkJCWNvbGxlY3Rpb24gPSAoQ29sbGVjdGlvbikgbXNnLmdldE9sZFZhbHVlKCk7Ci0JCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGNvbGxlY3Rpb24uaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlvYmogPSAoV29ya09yZGVyKSBpdGVyLm5leHQoKTsKLQkJCQkJCXJlbW92ZUluY29taW5nQ29ubmVjdGlvbihvYmouZ2V0UHJlZCgpKTsKLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19CUkVBS0RPV05fRUxFTUVOVF9fU1VQUFJFU1NFRDoKLQkJCQlzd2l0Y2ggKG1zZy5nZXRFdmVudFR5cGUoKSkgewotCQkJCWNhc2UgTm90aWZpY2F0aW9uLlNFVDoKLS8vCQkJCQlCb29sZWFuIGIgPSAoQm9vbGVhbiltc2cuZ2V0TmV3VmFsdWUoKTsKLS8vCQkJCQloYW5kbGVTdXBwcmVzc2VkKGIuYm9vbGVhblZhbHVlKCkpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0OgotCQkJCXJldHVybiBzdXBlci5oYW5kbGVOb3RpZmljYXRpb24obXNnKTsKLQkJCX0KLQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGUKLQkgKi8KLQlwdWJsaWMgV29ya0JyZWFrZG93bkVsZW1lbnROb2RlQWRhcHRlcihNZXRob2RFbGVtZW50IGUpIHsKLQkJc3VwZXIoZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgaGFuZGxlU3VwcHJlc3NlZChib29sZWFuIGIpIHsKLQkJaWYoYil7Ci0JCQlMaXN0IGluY29taW5ncyA9IGdldE5vZGUoKS5nZXRJbmNvbWluZ3MoKTsKLQkJCWZvciAoaW50IGkgPTA7IGk8aW5jb21pbmdzLnNpemUoKTsgaSsrKSB7Ci0JCQkJT2JqZWN0IG9iaiA9IGluY29taW5ncy5nZXQoaSk7Ci0JCQkJQWN0aXZpdHlFZGdlIGxpbmsgPSBudWxsOwotCQkJCWlmKG9iaiAhPSBudWxsICl7Ci0JCQkJCWxpbmsgPSAoQWN0aXZpdHlFZGdlKW9iajsKLQkJCQl9Ci0JCQkJaWYobGluayAhPSBudWxsICYmIGxpbmsuZ2V0U291cmNlKCkgIT0gbnVsbCl7Ci0JCQkJCU5vZGVBZGFwdGVyIHNvdXJjZU5vZGVBZGFwdGVyID0gQnJpZGdlSGVscGVyLmdldE5vZGVBZGFwdGVyKGxpbmsuZ2V0U291cmNlKCkpOwotCQkJCQlib29sZWFuIG9sZE5vdGlmeTEgPSBzb3VyY2VOb2RlQWRhcHRlciAhPSBudWxsID8gc291cmNlTm9kZUFkYXB0ZXIubm90aWZpY2F0aW9uRW5hYmxlZCA6IGZhbHNlOwotCQkJCQl0cnkgewotCQkJCQkJaWYoc291cmNlTm9kZUFkYXB0ZXIgIT0gbnVsbCkgc291cmNlTm9kZUFkYXB0ZXIubm90aWZpY2F0aW9uRW5hYmxlZCA9IGZhbHNlOwotCQkJCQkJbGluay5zZXRUYXJnZXQobnVsbCk7Ci0JCQkJCQlnZXROb2RlKCkuZ2V0SW5jb21pbmdzKCkucmVtb3ZlKGxpbmspOwotCQkJCQl9IGZpbmFsbHkgewotCQkJCQkJaWYoc291cmNlTm9kZUFkYXB0ZXIgIT0gbnVsbCkgc291cmNlTm9kZUFkYXB0ZXIubm90aWZpY2F0aW9uRW5hYmxlZCA9IG9sZE5vdGlmeTE7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlMaXN0IG91dEdvaW5ncyA9IGdldE5vZGUoKS5nZXRPdXRnb2luZ3MoKTsKLQkJCWZvciAoaW50IGkgPTA7IGk8b3V0R29pbmdzLnNpemUoKTsgaSsrKSB7Ci0JCQkJT2JqZWN0IG9iaiA9IG91dEdvaW5ncy5nZXQoaSk7Ci0JCQkJQWN0aXZpdHlFZGdlIGxpbmsgPSBudWxsOwotCQkJCWlmKG9iaiAhPSBudWxsICl7Ci0JCQkJCWxpbmsgPSAoQWN0aXZpdHlFZGdlKW9iajsKLQkJCQl9Ci0JCQkJaWYobGluayAhPSBudWxsICYmIGxpbmsuZ2V0VGFyZ2V0KCkgIT0gbnVsbCl7Ci0JCQkJCU5vZGVBZGFwdGVyIG5vZGVBZGFwdGVyID0gQnJpZGdlSGVscGVyLmdldE5vZGVBZGFwdGVyKGxpbmsuZ2V0VGFyZ2V0KCkpOwotCQkJCQlib29sZWFuIG9sZE5vdGlmeTEgPSBub2RlQWRhcHRlciAhPSBudWxsID8gbm9kZUFkYXB0ZXIubm90aWZpY2F0aW9uRW5hYmxlZCA6IGZhbHNlOwotCQkJCQl0cnkgewotCQkJCQkJaWYobm9kZUFkYXB0ZXIgIT0gbnVsbCkgbm9kZUFkYXB0ZXIubm90aWZpY2F0aW9uRW5hYmxlZCA9IGZhbHNlOwotCQkJCQkJbGluay5zZXRTb3VyY2UobnVsbCk7Ci0JCQkJCQlnZXROb2RlKCkuZ2V0SW5jb21pbmdzKCkucmVtb3ZlKGxpbmspOwotCQkJCQl9IGZpbmFsbHkgewotCQkJCQkJaWYobm9kZUFkYXB0ZXIgIT0gbnVsbCkgbm9kZUFkYXB0ZXIubm90aWZpY2F0aW9uRW5hYmxlZCA9IG9sZE5vdGlmeTE7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX1lbHNlewotCQkJTGlzdCBub2RlcyA9IGdldERpYWdyYW0oKS5nZXROb2RlcygpOwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gbm9kZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJQWN0aXZpdHlOb2RlIGVsZW1lbnQgPSAoQWN0aXZpdHlOb2RlKSBpdGVyLm5leHQoKTsKLQkJCQlpZihlbGVtZW50ICE9IGdldE5vZGUoKSAmJiB0YXJnZXQgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KXsKLQkJCQkJTWV0aG9kRWxlbWVudCBtZSA9IEJyaWRnZUhlbHBlci5nZXRNZXRob2RFbGVtZW50KGVsZW1lbnQpOwotCQkJCQlpZihtZSAhPSBudWxsKXsKLQkJCQkJCWFkZEluY29taW5nQ29ubmVjdGlvbihtZSk7Ci0JCQkJCQlhZGRPdXRnb2luZ0Nvbm5lY3Rpb24obWUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIE1ldGhvZEVsZW1lbnRBZGFwdGVyIGNyZWF0ZU1ldGhvZEVsZW1lbnRBZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IFdvcmtCcmVha2Rvd25FbGVtZW50QWRhcHRlcigpOwotCX0KLQkKLQlwcm90ZWN0ZWQgYm9vbGVhbiBhZGRUb1VNQShBY3Rpdml0eUVkZ2UgbGluaykgewotCQlpZiAoIXN1cGVyLmFkZFRvVU1BKGxpbmspKQotCQkJcmV0dXJuIGZhbHNlOwotCQkKLQkJTWV0aG9kRWxlbWVudCBlID0gQnJpZGdlSGVscGVyLmdldE1ldGhvZEVsZW1lbnQobGluay5nZXRTb3VyY2UoKSk7Ci0JCWlmIChlIGluc3RhbmNlb2YgV29ya0JyZWFrZG93bkVsZW1lbnQpIHsKLQkJCS8vIHRoaXMgaXMgYSBkaXJlY3QgbGluawotCQkJLy8gYWRkIG5ldyBXb3JrT3JkZXIgb2JqZWN0IHRvIFVNQQotCQkJLy8KLQkJCVdvcmtPcmRlciBvcmRlciA9IG51bGw7Ci0JCQlXb3JrQnJlYWtkb3duRWxlbWVudCBzdWNjID0gKFdvcmtCcmVha2Rvd25FbGVtZW50KSBCcmlkZ2VIZWxwZXIuZ2V0TWV0aG9kRWxlbWVudChsaW5rLmdldFRhcmdldCgpKTsKLQkJCVdvcmtCcmVha2Rvd25FbGVtZW50IHByZWQgPSAoV29ya0JyZWFrZG93bkVsZW1lbnQpIGU7Ci0JCQlpZiAoVW1hVXRpbC5maW5kV29ya09yZGVyKHN1Y2MsIHByZWQpID09IG51bGwpIHsKLQkJCQlOb2RlQWRhcHRlciBzb3VyY2VOb2RlQWRhcHRlciA9IEJyaWRnZUhlbHBlci5nZXROb2RlQWRhcHRlcihsaW5rLmdldFNvdXJjZSgpKTsJCi0JCQkJLy8gbm9kZSBhZGFwdGVyIGNhbiBiZSBOVUxMIGlmIHRoZSBub2RlIGlzIG5vdCBjdXJyZW50bHkgdmlzaWJsZSBpbiB0aGUgZGlhZ3JhbQotCQkJCS8vCi0JCQkJYm9vbGVhbiBzb3VyY2VOb3RpZnkgPSBzb3VyY2VOb2RlQWRhcHRlciAhPSBudWxsID8gc291cmNlTm9kZUFkYXB0ZXIubm90aWZpY2F0aW9uRW5hYmxlZCA6IGZhbHNlOwotCQkJCXRyeSB7Ci0JCQkJCWlmKHNvdXJjZU5vZGVBZGFwdGVyICE9IG51bGwpIHNvdXJjZU5vZGVBZGFwdGVyLm5vdGlmaWNhdGlvbkVuYWJsZWQgPSBmYWxzZTsKLQkJCQkJLy9DcmVhdGUgYSB3b3Jrb3JkZXIgYW5kIGRpc2FibGUgbm90aWZpY2F0aW9uIGZsYWcuCi0JCQkJCW9yZGVyID0gYWRkRGVmYXVsdFdvcmtPcmRlcihsaW5rLmdldFRhcmdldCgpLCBwcmVkKTsKLQkJCQl9IGZpbmFsbHkgewotCQkJCQlpZihzb3VyY2VOb2RlQWRhcHRlciAhPSBudWxsKSBzb3VyY2VOb2RlQWRhcHRlci5ub3RpZmljYXRpb25FbmFibGVkID0gc291cmNlTm90aWZ5OwotCQkJCX0KLQkJCX0KLQotCQkJLy8gc2V0IHRoZSBXb3JrT3JkZXIgYXMgdGhlIGVsZW1lbnQgb2YgdGhlIFNlbWFudGljTW9kZWwgb2YgdGhlCi0JCQkvLyBsaW5rJ3MgR3JhcGhFZGdlCi0JCQlCcmlkZ2VIZWxwZXIuc2V0U2VtYW50aWNNb2RlbChsaW5rLCBvcmRlcik7Ci0JCX0gCi0JCWVsc2UgaWYgKEJyaWRnZUhlbHBlci5pc1N5bmNoQmFyKGxpbmsuZ2V0U291cmNlKCkpKSB7Ci0JCQkvLyBnZXQgYWxsIFdvcmtCcmVha2Rvd25FbGVtZW50Tm9kZXMgdGhhdCBhcmUgY29tbWluZyB0byB0aGlzCi0JCQkvLyBUeXBlZE5vZGUsIGJvdGggZGlyZWN0bHkgYW5kIGluZGlyZWN0bHkKLQkJCS8vIGFuZCBjcmVhdGUgd29yayBvcmRlcnMgd2l0aCB0aGVpciBhY3Rpdml0eSBhcyBwcmVkZWNlc3NvcgotCQkJLy8KLQotCQkJLy8gUHJlZGVjZXNzb3Igc2hvdWxkIGJlIGNyZWF0ZWQgb25seSBpbiBjYXNlIG9mCi0JCQkvLyBTeW5jcm9uaXphdGlvbiBCYXIsIG5vdCBmb3IgRGVjaXNpb25Qb2ludC4KLQkJCS8vIFRPRE86IHJldmlldwotCQkJCi0JCQkJCi0JCQkJQ29sbGVjdGlvbiBhY3ROb2RlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkvLyBHZXQgdGhlIGNvbGxlY3Rpb24gaW5jb21pbmcgY29ubmVjdGlvbiBvZiBzeW5jYmFyIAotCQkJCS8vIGV4Y2x1ZGluZyBkZWNpc2lvbnBvaW50IGluY29taW5nIGNvbm5lY3Rpb24KLQkJCQlCcmlkZ2VIZWxwZXIuZ2V0U3luY0JhclNvdXJjZU5vZGVzKGxpbmsuZ2V0U291cmNlKCksIGFjdE5vZGVzKTsKLQkJCQlXb3JrQnJlYWtkb3duRWxlbWVudCBzdWNjID0gKFdvcmtCcmVha2Rvd25FbGVtZW50KSBCcmlkZ2VIZWxwZXIuZ2V0TWV0aG9kRWxlbWVudChsaW5rLmdldFRhcmdldCgpKTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBhY3ROb2Rlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJQWN0aXZpdHlOb2RlIG5vZGUgPSAoQWN0aXZpdHlOb2RlKSBpdGVyLm5leHQoKTsKLQkJCQkJV29ya0JyZWFrZG93bkVsZW1lbnQgcHJlZCA9IChXb3JrQnJlYWtkb3duRWxlbWVudCkgQnJpZGdlSGVscGVyLmdldE1ldGhvZEVsZW1lbnQobm9kZSk7Ci0JCQkJCWlmIChVbWFVdGlsLmZpbmRXb3JrT3JkZXIoc3VjYywgcHJlZCkgPT0gbnVsbCkgewotCQkJCQkJTm9kZUFkYXB0ZXIgc291cmNlTm9kZSA9IEJyaWRnZUhlbHBlci5nZXROb2RlQWRhcHRlcihub2RlKTsKLQkJCQkJCWJvb2xlYW4gc291cmNlTm90aWZ5ID0gc291cmNlTm9kZS5ub3RpZmljYXRpb25FbmFibGVkOwotCQkJCQkJdHJ5IHsKLQkJCQkJCQlzb3VyY2VOb2RlLm5vdGlmaWNhdGlvbkVuYWJsZWQgPSBmYWxzZTsKLQkJCQkJCQkvLyBDcmVhdGUgYSB3b3Jrb3JkZXIgYW5kIGRpc2FibGUgbm90aWZpY2F0aW9uIGZsYWcuCi0JCQkJCQkJYWRkRGVmYXVsdFdvcmtPcmRlcihsaW5rLmdldFRhcmdldCgpLCBwcmVkKTsKLQkJCQkJCX0gZmluYWxseSB7Ci0JCQkJCQkJc291cmNlTm9kZS5ub3RpZmljYXRpb25FbmFibGVkID0gc291cmNlTm90aWZ5OwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQkKLQlwcm90ZWN0ZWQgQWN0aXZpdHlFZGdlIGFkZEluY29taW5nQ29ubmVjdGlvbihNZXRob2RFbGVtZW50IHNvdXJjZSkgewotCQlBY3Rpdml0eUVkZ2UgbGluayA9IHN1cGVyLmFkZEluY29taW5nQ29ubmVjdGlvbihzb3VyY2UpOwotCQlpZiAobGluayA9PSBudWxsKQotCQkJcmV0dXJuIGxpbms7Ci0KLQkJV29ya09yZGVyIHdvcmtPcmRlciA9IFVtYVV0aWwuZmluZFdvcmtPcmRlcigKLQkJCQkoV29ya0JyZWFrZG93bkVsZW1lbnQpIGdldEVsZW1lbnQoKSwgc291cmNlKTsKLQkJQnJpZGdlSGVscGVyLnNldFNlbWFudGljTW9kZWwobGluaywgd29ya09yZGVyKTsKLQotCQlyZXR1cm4gbGluazsKLQl9Ci0KLQlwcm90ZWN0ZWQgQWN0aXZpdHlFZGdlIGFkZE91dGdvaW5nQ29ubmVjdGlvbihNZXRob2RFbGVtZW50IHRhcmdldCkgewotCQlBY3Rpdml0eUVkZ2UgbGluayA9IHN1cGVyLmFkZE91dGdvaW5nQ29ubmVjdGlvbih0YXJnZXQpOwotCi0JCVdvcmtPcmRlciB3b3JrT3JkZXIgPSBVbWFVdGlsLmZpbmRXb3JrT3JkZXIoCi0JCQkJKFdvcmtCcmVha2Rvd25FbGVtZW50KSB0YXJnZXQsIGdldEVsZW1lbnQoKSk7Ci0JCUJyaWRnZUhlbHBlci5zZXRTZW1hbnRpY01vZGVsKGxpbmssIHdvcmtPcmRlcik7Ci0KLQkJcmV0dXJuIGxpbms7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gcmVtb3ZlSW5jb21pbmdDb25uZWN0aW9uKE1ldGhvZEVsZW1lbnQgc291cmNlKSB7Ci0JCS8vIGxvb2sgZm9yIHRoZSBpbmNvbWluZyBjb25uZWN0aW9uIHdpdGggc291cmNlIGFzIGxpbmtlZCBvYmplY3Qgb2YgdGhlCi0JCS8vIHNvdXJjZSBub2RlCi0JCS8vCi0JCWZvciAoQWN0aXZpdHlFZGdlIGxpbmsgOiBnZXROb2RlKCkuZ2V0SW5jb21pbmdzKCkpIHsKLQkJCWlmIChsaW5rLmdldFNvdXJjZSgpICE9IG51bGwKLQkJCQkJJiYgQnJpZGdlSGVscGVyLmdldE1ldGhvZEVsZW1lbnQobGluay5nZXRTb3VyY2UoKSkgPT0gc291cmNlKSB7Ci0JCQkJLy8gZGlzYWJsZSBpbnRlcm5hbCBub3RpZmljYXRpb24gb2YgdGhlIHNvdXJjZSBub2RlCi0JCQkJLy8KLQkJCQlOb2RlQWRhcHRlciBub2RlQWRhcHRlciA9IEJyaWRnZUhlbHBlci5nZXROb2RlQWRhcHRlcihsaW5rLmdldFNvdXJjZSgpKTsKLQkJCQlib29sZWFuIG9sZE5vdGlmeSA9IG5vZGVBZGFwdGVyICE9IG51bGwgPyBub2RlQWRhcHRlci5ub3RpZmljYXRpb25FbmFibGVkIDogZmFsc2U7Ci0JCQkJdHJ5IHsKLQkJCQkJaWYobm9kZUFkYXB0ZXIgIT0gbnVsbCkgbm9kZUFkYXB0ZXIubm90aWZpY2F0aW9uRW5hYmxlZCA9IGZhbHNlOwotCQkJCQlsaW5rLnNldFNvdXJjZShudWxsKTsKLQkJCQl9IGZpbmFsbHkgewotCQkJCQlpZihub2RlQWRhcHRlciAhPSBudWxsKSBub2RlQWRhcHRlci5ub3RpZmljYXRpb25FbmFibGVkID0gb2xkTm90aWZ5OwotCQkJCX0KLQkJCQlsaW5rLnNldFRhcmdldChudWxsKTsKLQkJCQlCcmlkZ2VIZWxwZXIuc2V0U2VtYW50aWNNb2RlbChsaW5rLCBudWxsKTsKLQkJCQlnZXREaWFncmFtKCkuZ2V0RWRnZXMoKS5yZW1vdmUobGluayk7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLS8vCUBPdmVycmlkZQotLy8JcHJvdGVjdGVkIHZvaWQgaGFuZGxlTm90aWZpY2F0aW9uKE5vdGlmaWNhdGlvbiBtc2cpIHsKLS8vCQlzd2l0Y2gobXNnLmdldEZlYXR1cmVJRChBY3Rpdml0eVBhcmFtZXRlck5vZGUuY2xhc3MpKSB7Ci0vLwkJY2FzZSBVTUxQYWNrYWdlLkFDVElWSVRZX1BBUkFNRVRFUl9OT0RFX19FQU5OT1RBVElPTlM6Ci0vLwkJCXN3aXRjaChtc2cuZ2V0RXZlbnRUeXBlKCkpIHsKLS8vCQkJY2FzZSBOb3RpZmljYXRpb24uQUREOgotLy8JCQkJQWN0aXZpdHlQYXJhbWV0ZXJOb2RlIG5vZGUgPSAoQWN0aXZpdHlQYXJhbWV0ZXJOb2RlKSBtc2cuZ2V0Tm90aWZpZXIoKTsKLS8vCQkJCVN0cmluZyB0eXBlID0gQnJpZGdlSGVscGVyLmdldFR5cGUobm9kZSk7Ci0vLwkJCQlNZXRob2RFbGVtZW50IGUgPSBCcmlkZ2VIZWxwZXIuZ2V0TWV0aG9kRWxlbWVudChub2RlKTsJCQkJCi0vLwkJCQlpZihlIGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudCAmJiAKLS8vCQkJCQkJdHlwZSAhPSBudWxsICYmICF0eXBlLmVxdWFscyhCcmlkZ2VIZWxwZXIuZ2V0VHlwZShlKSkpIHsKLS8vCQkJCQkvLyByZXBsYWNlIHRoZSBjdXJyZW50bHkgbGlua2VkIG1ldGhvZCBlbGVtZW50IHdpdGggdGhlIHJpZ2h0IG9uZQotLy8JCQkJCS8vCi0vLwkJCQkJRUNsYXNzIHJpZ2h0VHlwZSA9IEJyaWRnZUhlbHBlci5nZXRUeXBlKHR5cGUpOwotLy8JCQkJCWlmKHJpZ2h0VHlwZSAhPSBudWxsKSB7Ci0vLwkJCQkJCU9iamVjdCByaWdodEVsZW1lbnQgPSBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGUocmlnaHRUeXBlKTsKLS8vCQkJCQkJTGlzdCBsaXN0ID0gKChCcmVha2Rvd25FbGVtZW50KWUpLmdldFN1cGVyQWN0aXZpdGllcygpLmdldEJyZWFrZG93bkVsZW1lbnRzKCk7Ci0vLwkJCQkJCWxpc3Quc2V0KGxpc3QuaW5kZXhPZihlKSwgcmlnaHRFbGVtZW50KTsKLS8vCQkJCQkJcmV0dXJuOwotLy8JCQkJCX0KLS8vCQkJCQkKLS8vCQkJCX0KLS8vCQkJfQotLy8JCX0KLS8vCQkKLS8vCQlzdXBlci5oYW5kbGVOb3RpZmljYXRpb24obXNnKTsKLS8vCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2NvcmUvY29tbWFuZHMvQ2hhbmdlQm91bmRzQ29tbWFuZC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vY29yZS9jb21tYW5kcy9DaGFuZ2VCb3VuZHNDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4NjZmYmMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vY29yZS9jb21tYW5kcy9DaGFuZ2VCb3VuZHNDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5jb21tYW5kczsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5EaWFncmFtQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC51dGlsLlR4VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSVJlc291cmNlQXdhcmVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS51dGlsLlZpZXdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vdGF0aW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotCi0vKioKLSAqIENvbW1hbmQgZm9yIGNoYW5nZSB2aWV3IGRpbWVuc2lvbnMuCi0gKiAKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQHNpbmNlIDEuMgotICovCi1wdWJsaWMgY2xhc3MgQ2hhbmdlQm91bmRzQ29tbWFuZCBleHRlbmRzIENvbW1hbmQgaW1wbGVtZW50cwotCQlJUmVzb3VyY2VBd2FyZUNvbW1hbmQgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIGxhYmVsID0gImNoYW5nZSBib3VuZHMgY29tbWFuZCBsYWJlbCI7CS8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gZG9tYWluOwotCi0JcHJpdmF0ZSBWaWV3IHZpZXc7Ci0KLQlwcml2YXRlIGludCB3aWR0aDsKLQotCXByaXZhdGUgaW50IGhlaWdodDsKLQotCXByaXZhdGUgUG9pbnQgbG9jYXRpb247Ci0KLQlwcml2YXRlIFBvaW50IG9sZExvY2F0aW9uOwotCi0JcHJpdmF0ZSBpbnQgb2xkV2lkdGg7Ci0KLQlwcml2YXRlIGludCBvbGRIZWlnaHQ7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgQ2hhbmdlQm91bmRzQ29tbWFuZChUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiBkb21haW4sIFZpZXcgdmlldywKLQkJCVBvaW50IGxvY2F0aW9uLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKLQkJc3VwZXIobGFiZWwpOwotCQl0aGlzLmRvbWFpbiA9IGRvbWFpbjsKLQkJdGhpcy52aWV3ID0gdmlldzsKLQkJdGhpcy53aWR0aCA9IHdpZHRoOwotCQl0aGlzLmhlaWdodCA9IGhlaWdodDsKLQkJdGhpcy5sb2NhdGlvbiA9IGxvY2F0aW9uOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGNhbkV4ZWN1dGUoKSB7Ci0JCXJldHVybiAodGhpcy53aWR0aCAhPSAwIHx8IHRoaXMuaGVpZ2h0ICE9IDApOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCXRyeSB7Ci0JCQlUeFV0aWwucnVuSW5UcmFuc2FjdGlvbihkb21haW4sIG5ldyBSdW5uYWJsZSgpIHsKLQotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJb2xkTG9jYXRpb24gPSBuZXcgUG9pbnQoKTsKLQkJCQkJT2JqZWN0IHggPSAgVmlld1V0aWwuZ2V0U3RydWN0dXJhbEZlYXR1cmVWYWx1ZSh2aWV3LAotCQkJCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TG9jYXRpb25fWCgpKTsKLQkJCQkJaWYoeCAhPSBudWxsKXsKLQkJCQkJCW9sZExvY2F0aW9uLnggPSAoKEludGVnZXIpeCkuaW50VmFsdWUoKTsKLQkJCQkJfQotCQkJCQlPYmplY3QgeSA9IFZpZXdVdGlsLmdldFN0cnVjdHVyYWxGZWF0dXJlVmFsdWUodmlldywKLQkJCQkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldExvY2F0aW9uX1koKSk7Ci0JCQkJCWlmKHkgIT0gbnVsbCl7Ci0JCQkJCQlvbGRMb2NhdGlvbi55ID0gKChJbnRlZ2VyKSB5KS5pbnRWYWx1ZSgpOwotCQkJCQl9Ci0JCQkJCW9sZFdpZHRoID0gKChJbnRlZ2VyKSBWaWV3VXRpbC5nZXRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlKHZpZXcsCi0JCQkJCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRTaXplX1dpZHRoKCkpKS5pbnRWYWx1ZSgpOwotCQkJCQlvbGRIZWlnaHQgPSAoKEludGVnZXIpIFZpZXdVdGlsLmdldFN0cnVjdHVyYWxGZWF0dXJlVmFsdWUodmlldywKLQkJCQkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldFNpemVfSGVpZ2h0KCkpKS5pbnRWYWx1ZSgpOwotCi0JCQkJCWlmIChsb2NhdGlvbiAhPSBudWxsKSB7Ci0JCQkJCQlWaWV3VXRpbC5zZXRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlKHZpZXcsCi0JCQkJCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TG9jYXRpb25fWCgpLCBuZXcgSW50ZWdlcigKLQkJCQkJCQkJCQlsb2NhdGlvbi54KSk7Ci0JCQkJCQlWaWV3VXRpbC5zZXRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlKHZpZXcsCi0JCQkJCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TG9jYXRpb25fWSgpLCBuZXcgSW50ZWdlcigKLQkJCQkJCQkJCQlsb2NhdGlvbi55KSk7Ci0JCQkJCX0KLQkJCQkJaWYgKHdpZHRoID4gMCkgewotCQkJCQkJVmlld1V0aWwuc2V0U3RydWN0dXJhbEZlYXR1cmVWYWx1ZSh2aWV3LAotCQkJCQkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldFNpemVfV2lkdGgoKSwgbmV3IEludGVnZXIoCi0JCQkJCQkJCQkJd2lkdGgpKTsKLQkJCQkJfQotCQkJCQlpZiAoaGVpZ2h0ID4gMCkgewotCQkJCQkJVmlld1V0aWwuc2V0U3RydWN0dXJhbEZlYXR1cmVWYWx1ZSh2aWV3LAotCQkJCQkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldFNpemVfSGVpZ2h0KCksCi0JCQkJCQkJCW5ldyBJbnRlZ2VyKGhlaWdodCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJCQotCQkJfSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlEaWFncmFtQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoIkVycm9yIGluIGNoYW5nZWJvdW5kcyBjb21tYW5kIDoiLCAgZSk7IC8vJE5PTi1OTFMtMSQgCi0JCQl1bmRvKCk7Ci0JCX0KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1bmRvKCkgewotCQl0cnkgewotCQkJVHhVdGlsLnJ1bkluVHJhbnNhY3Rpb24oZG9tYWluLCBuZXcgUnVubmFibGUoKSB7Ci0KLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCWlmIChvbGRMb2NhdGlvbiAhPSBudWxsKSB7Ci0JCQkJCQlWaWV3VXRpbC5zZXRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlKHZpZXcsCi0JCQkJCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TG9jYXRpb25fWCgpLCBuZXcgSW50ZWdlcigKLQkJCQkJCQkJCQlsb2NhdGlvbi54KSk7Ci0JCQkJCQlWaWV3VXRpbC5zZXRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlKHZpZXcsCi0JCQkJCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TG9jYXRpb25fWSgpLCBuZXcgSW50ZWdlcigKLQkJCQkJCQkJCQlsb2NhdGlvbi55KSk7Ci0JCQkJCX0KLQkJCQkJaWYgKG9sZFdpZHRoICE9IHdpZHRoKSB7Ci0JCQkJCQlWaWV3VXRpbC5zZXRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlKHZpZXcsCi0JCQkJCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2l6ZV9XaWR0aCgpLCBuZXcgSW50ZWdlcigKLQkJCQkJCQkJCQl3aWR0aCkpOwotCQkJCQl9Ci0JCQkJCWlmIChvbGRIZWlnaHQgPiBoZWlnaHQpIHsKLQkJCQkJCVZpZXdVdGlsLnNldFN0cnVjdHVyYWxGZWF0dXJlVmFsdWUodmlldywKLQkJCQkJCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRTaXplX0hlaWdodCgpLAotCQkJCQkJCQluZXcgSW50ZWdlcihoZWlnaHQpKTsKLQkJCQkJfQotCQkJCX0KLQkJCQkKLQkJCX0pOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCi0JCX0KLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRNb2RpZmllZFJlc291cmNlcygpIHsKLQkJU2V0PFJlc291cmNlPiBzZXQgPSBuZXcgSGFzaFNldDxSZXNvdXJjZT4oKTsKLQkJc2V0LmFkZCh2aWV3LmVSZXNvdXJjZSgpKTsKLQkJaWYgKCFzZXQuaXNFbXB0eSgpKQotCQkJcmV0dXJuIHNldDsKLQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JfQotCi0JcHVibGljIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kIGNoYWluKAotCQkJb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQgY29tbWFuZCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldEFmZmVjdGVkT2JqZWN0cygpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldFJlc3VsdCgpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9jb3JlL2NvbW1hbmRzL0NvcHlEaWFncmFtQ29tbWFuZC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vY29yZS9jb21tYW5kcy9Db3B5RGlhZ3JhbUNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGNmODBkZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9jb3JlL2NvbW1hbmRzL0NvcHlEaWFncmFtQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzU1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5jb21tYW5kczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkFic3RyYWN0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuV3JhcHBlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU1vZGVsRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db3B5Q29tbWFuZC5IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLmltcGwuSW50ZXJuYWxUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLkRpYWdyYW1Db3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuYnJpZGdlLkJyaWRnZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnNlcnZpY2VzLkRpYWdyYW1IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5zZXJ2aWNlcy5EaWFncmFtTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnNlcnZpY2VzLkRpYWdyYW1TZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5hbWVkTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLnV0aWwuVHhVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JUmVzb3VyY2VBd2FyZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLklEaWFncmFtTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkFjdGl2aXR5UGFyYW1ldGVyTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eVBhcnRpdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlOwotCi0vKioKLSAqIAotICogSXQgZG9lcyBjb3B5IHRoZSBkaWFncmFtIGZvciB0aGUgYWN0aXZpdHkKLSAqIAotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4yCi0gKi8KLXB1YmxpYyBjbGFzcyBDb3B5RGlhZ3JhbUNvbW1hbmQgZXh0ZW5kcyBBYnN0cmFjdENvbW1hbmQgaW1wbGVtZW50cwotCQlJUmVzb3VyY2VBd2FyZUNvbW1hbmQgewotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uPD8+IGVsZW1lbnRzOwotCi0JcHJpdmF0ZSBNYXA8RU9iamVjdCwgRU9iamVjdD4gY29weVRvT3JpZ2luYWxNYXA7Ci0KLQlwcml2YXRlIENvbGxlY3Rpb248RGlhZ3JhbT4gY29waWVkRWxlbWVudHM7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHID0gRGlhZ3JhbUNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpCi0JCQkuaXNEZWJ1Z2dpbmcoKTsKLQotCXByaXZhdGUgUHJvY2VzcyB0YXJnZXRQcm9jZXNzOwotCi0JcHJpdmF0ZSBEaWFncmFtTWFuYWdlciBtZ3I7Ci0JcHJpdmF0ZSBJbnRlcm5hbFRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIGRvbWFpbjsKLQotCXByaXZhdGUgTWFwPEVPYmplY3QsIEVPYmplY3Q+IG9yaWdpbmFsVG9Db3B5TWFwOwotCQotCXByaXZhdGUgQ29weURpYWdyYW1Db21tYW5kKENvbGxlY3Rpb248Pz4gZWxlbWVudHMsIFByb2Nlc3MgdGFyZ2V0UHJvY2VzcykgewotCQl0aGlzLmVsZW1lbnRzID0gZWxlbWVudHM7Ci0JCXRoaXMudGFyZ2V0UHJvY2VzcyA9IHRhcmdldFByb2Nlc3M7Ci0KLQkJLy8gZ2V0IGRpYWdyYW0gbWFuYWdlciBhbmQgZG9tYWluCi0JCW1nciA9IERpYWdyYW1NYW5hZ2VyLmdldEluc3RhbmNlKHRhcmdldFByb2Nlc3MsIHRoaXMpOwotCQlkb21haW4gPSBtZ3IuZ2V0RWRpdGluZ0RvbWFpbigpOwkJCQkKLQl9Ci0JCi0JcHVibGljIENvcHlEaWFncmFtQ29tbWFuZChDb2xsZWN0aW9uPD8+IGVsZW1lbnRzLCBIZWxwZXIgY29weUhlbHBlciwKLQkJCVByb2Nlc3MgdGFyZ2V0UHJvY2VzcykgewotCQl0aGlzKGVsZW1lbnRzLCB0YXJnZXRQcm9jZXNzKTsKLQkJdGhpcy5vcmlnaW5hbFRvQ29weU1hcCA9IGNvcHlIZWxwZXI7Ci0JfQotCQotCXB1YmxpYyBDb3B5RGlhZ3JhbUNvbW1hbmQoQ29sbGVjdGlvbjw/PiBlbGVtZW50cywgTWFwPEVPYmplY3QsIEVPYmplY3Q+IGNvcHlUb09yaWdpbmFsTWFwLAotCQkJUHJvY2VzcyB0YXJnZXRQcm9jZXNzKSB7Ci0JCXRoaXMoZWxlbWVudHMsIHRhcmdldFByb2Nlc3MpOwotCQl0aGlzLmNvcHlUb09yaWdpbmFsTWFwID0gY29weVRvT3JpZ2luYWxNYXA7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZCNleGVjdXRlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQl0cnkgewotCQkJVHhVdGlsLnJ1bkluVHJhbnNhY3Rpb24oZG9tYWluLCBuZXcgUnVubmFibGUoKSB7Ci0KLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCWRvRXhlY3V0ZSgpOwotCQkJCX0KLQkJCQkKLQkJCX0pOwotCQl9IGNhdGNoIChFeGVjdXRpb25FeGNlcHRpb24gZSkgewotCQkJRGlhZ3JhbUNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZCNyZWRvKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWRvKCkgewotCQlleGVjdXRlKCk7Ci0JfQotCQotCXByb3RlY3RlZCBNYXA8PywgPz4gZ2V0Q29weVRvT3JpZ2luYWxNYXAoKSB7Ci0JCWlmKGNvcHlUb09yaWdpbmFsTWFwID09IG51bGwgJiYgb3JpZ2luYWxUb0NvcHlNYXAgIT0gbnVsbCkgewotCQkJY29weVRvT3JpZ2luYWxNYXAgPSBuZXcgSGFzaE1hcDxFT2JqZWN0LCBFT2JqZWN0PigpOwotCQkJZm9yIChNYXAuRW50cnk8RU9iamVjdCwgRU9iamVjdD4gZW50cnkgOiBvcmlnaW5hbFRvQ29weU1hcC5lbnRyeVNldCgpKSB7Ci0JCQkJY29weVRvT3JpZ2luYWxNYXAucHV0KGVudHJ5LmdldFZhbHVlKCksIGVudHJ5LmdldEtleSgpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gY29weVRvT3JpZ2luYWxNYXA7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBkb0V4ZWN1dGUoKSB7CQkKLQkJaWYgKGNvcGllZEVsZW1lbnRzID09IG51bGwpIHsKLQkJCWNvcGllZEVsZW1lbnRzID0gbmV3IEFycmF5TGlzdDxEaWFncmFtPigpOwotCQl9IGVsc2UgewotCQkJY29waWVkRWxlbWVudHMuY2xlYXIoKTsKLQkJfQotCi0JCURpYWdyYW1TZXJ2aWNlIGRpYWdyYW1TdmMgPSBuZXcgRGlhZ3JhbVNlcnZpY2UoKTsKLQkJdHJ5IHsKLQkJCWZvciAoT2JqZWN0IGUgOiBlbGVtZW50cykgewotCQkJCU9iamVjdCBvcmlnID0gZ2V0Q29weVRvT3JpZ2luYWxNYXAoKS5nZXQoZSk7Ci0JCQkJaWYgKG9yaWcgIT0gbnVsbCAmJiBvcmlnIGluc3RhbmNlb2YgQWN0aXZpdHkgJiYgZSAhPSBudWxsCi0JCQkJCQkmJiBlIGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQkJQWN0aXZpdHkgY29weUFjdGl2aXR5ID0gKEFjdGl2aXR5KSBlOwotCQkJCQlBY3Rpdml0eSBvcmlnQWN0aXZpdHkgPSAoQWN0aXZpdHkpIG9yaWc7Ci0KLQkJCQkJQ29sbGVjdGlvbjxEaWFncmFtPiBkaWFncmFtcyA9IGRpYWdyYW1TdmMuZ2V0RGlhZ3JhbXMob3JpZ0FjdGl2aXR5KTsKLQkJCQkJaWYgKGRpYWdyYW1zICE9IG51bGwgJiYgIWRpYWdyYW1zLmlzRW1wdHkoKSkgewotCQkJCQkJZm9yIChEaWFncmFtIGRpYWdyYW0gOiBkaWFncmFtcykgewotCQkJCQkJCWlmIChkaWFncmFtICE9IG51bGwpIHsKLQkJCQkJCQkJLy8gY29weSB0aGUgZGlhZ3JhbQotCQkJCQkJCQlEaWFncmFtIGRpYWdyYW1Db3B5ID0gKERpYWdyYW0pIERpYWdyYW1IZWxwZXIKLQkJCQkJCQkJCQkuY29weURpYWdyYW0oZG9tYWluLCBkaWFncmFtKTsKLQotCQkJCQkJCQkvLyB1cGRhdGUgY2hpbGRyZW4gcmVmZXJlbmNlcwotCQkJCQkJCQl1cGRhdGVSZWZlcmVuY2VzKGRpYWdyYW1Db3B5KTsKLQotCQkJCQkJCQkvLyBhc3NvY2lhdGUgd2l0aCB0aGUgYWN0aXZpdHkKLQkJCQkJCQkJaW50IGRpYWdyYW1UeXBlID0gRGlhZ3JhbUhlbHBlcgotCQkJCQkJCQkJCS5nZXREaWFncmFtVHlwZShkaWFncmFtQ29weSk7Ci0JCQkJCQkJCW1nci5hc3NvY2lhdGUoZGlhZ3JhbUNvcHksIGRpYWdyYW1UeXBlLAotCQkJCQkJCQkJCShBY3Rpdml0eSkgY29weUFjdGl2aXR5KTsKLQotCQkJCQkJCQljb3BpZWRFbGVtZW50cy5hZGQoZGlhZ3JhbUNvcHkpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQlEaWFncmFtQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZXgpOwotCQkJaWYgKERFQlVHKSB7Ci0JCQkJZXgucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9Ci0JCX0gZmluYWxseSB7Ci0JCQlkaWFncmFtU3ZjLmRpc3Bvc2UoKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBVcGRhdGUgZUFubm90YXRpb25zIHJlZmVyZW5jZXMKLQkgKiAKLQkgKiBAcGFyYW0gY29weQotCSAqLwotCXB1YmxpYyB2b2lkIHVwZGF0ZVJlZmVyZW5jZXMoRGlhZ3JhbSBjb3B5KSB7Ci0JCWludCBkaWFncmFtVHlwZSA9IERpYWdyYW1IZWxwZXIuZ2V0RGlhZ3JhbVR5cGUoY29weSk7Ci0JCUxpc3Q8T2JqZWN0PiBjaGlsZHJlbiA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PigpOwotCQkvLyBjb2xsZWN0IGFsbCBjaGlsZHJlbiBmaXJzdCBlLmcuIGZvciBBY3Rpdml0eVBhcnRpdGlvbgotCQkvLyB3ZSBkb24ndCBoYXZlIHBhcnRpdGlvbiBpbnRvIHBhcnRpdGlvbiBzbyBqdXN0IGdldHRpbmcgb25lIGxldmVsIHN1Yi1jaGlsZHJlbgotCQkvLyBhcmUgZW5vdWdoIGZvciBub3cuCi0JCWZvciAoSXRlcmF0b3I8Pz4gaXRvciA9IGNvcHkuZ2V0Q2hpbGRyZW4oKS5pdGVyYXRvcigpOyBpdG9yLmhhc05leHQoKTspIHsKLQkJCU5vZGUgbm9kZSA9IChOb2RlKSBpdG9yLm5leHQoKTsKLQkJCUVPYmplY3Qgb2JqID0gbm9kZS5nZXRFbGVtZW50KCk7Ci0JCQljaGlsZHJlbi5hZGQobm9kZSk7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgQWN0aXZpdHlQYXJ0aXRpb24pewotCQkJCWNoaWxkcmVuLmFkZEFsbChub2RlLmdldENoaWxkcmVuKCkpOwotCQkJfQotCQl9Ci0JCWZvciAoSXRlcmF0b3I8Pz4gaXRvciA9IGNoaWxkcmVuLml0ZXJhdG9yKCk7IGl0b3IuaGFzTmV4dCgpOykgewotCi0JCQlOb2RlIG5vZGUgPSAoTm9kZSkgaXRvci5uZXh0KCk7Ci0JCQlFT2JqZWN0IG9iaiA9IG5vZGUuZ2V0RWxlbWVudCgpOwotCi0JCQlpZiAoZGlhZ3JhbVR5cGUgPT0gSURpYWdyYW1NYW5hZ2VyLkFDVElWSVRZX0RJQUdSQU0pIHsKLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZQotCQkJCQkJfHwgb2JqIGluc3RhbmNlb2YgQWN0aXZpdHlQYXJhbWV0ZXJOb2RlKSB7Ci0JCQkJCUVNb2RlbEVsZW1lbnQgbW9kZWxFbGVtZW50ID0gKEVNb2RlbEVsZW1lbnQpIG9iajsKLQkJCQkJTWV0aG9kRWxlbWVudCBtZSA9IEJyaWRnZUhlbHBlcgotCQkJCQkJCS5nZXRNZXRob2RFbGVtZW50RnJvbUFubm90YXRpb24obW9kZWxFbGVtZW50LAotCQkJCQkJCQkJdGFyZ2V0UHJvY2Vzcy5lUmVzb3VyY2UoKS5nZXRSZXNvdXJjZVNldCgpKTsKLQotCQkJCQlPYmplY3QgbWFwcGVkTWV0aG9kRWxlbWVudCA9IGdldENvcGllZEVsZW1lbnQobWUpOwotCQkJCQlpZiAobWFwcGVkTWV0aG9kRWxlbWVudCAhPSBudWxsKSB7Ci0JCQkJCQlCcmlkZ2VIZWxwZXIuYWRkRUFubm90YXRpb24obW9kZWxFbGVtZW50LAotCQkJCQkJCQkoTWV0aG9kRWxlbWVudCkgbWFwcGVkTWV0aG9kRWxlbWVudCk7Ci0JCQkJCX0KLQotCQkJCX0KLQkJCX0gZWxzZSBpZiAoZGlhZ3JhbVR5cGUgPT0gSURpYWdyYW1NYW5hZ2VyLkFDVElWSVRZX0RFVEFJTF9ESUFHUkFNKSB7Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIE5vZGVDb250YWluZXIpIHsKLQkJCQkJTm9kZUNvbnRhaW5lciBub2RlQ29udGFpbmVyID0gKE5vZGVDb250YWluZXIpIG9iajsKLQkJCQkJLy8gZG8gbWFwcGluZyBmb3Igbm9kZWNvbnRhaW5lcgotCQkJCQlNZXRob2RFbGVtZW50IG1lID0gbm9kZUNvbnRhaW5lci5nZXRMaW5rZWRFbGVtZW50KCk7Ci0JCQkJCU9iamVjdCBtYXBwZWRNZXRob2RFbGVtZW50ID0gZ2V0Q29waWVkRWxlbWVudChtZSk7Ci0JCQkJCWlmIChtYXBwZWRNZXRob2RFbGVtZW50ICE9IG51bGwpIHsKLQkJCQkJCW5vZGVDb250YWluZXIKLQkJCQkJCQkJLnNldExpbmtlZEVsZW1lbnQoKE1ldGhvZEVsZW1lbnQpIG1hcHBlZE1ldGhvZEVsZW1lbnQpOwotCQkJCQl9Ci0KLQkJCQkJLy8gZG8gbWFwcGluZyBmb3IgaXRzIGNoaWxkcmVuCi0JCQkJCUxpc3Q8Pz4gbm9kZXMgPSBub2RlQ29udGFpbmVyLmdldE5vZGVzKCk7Ci0KLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBub2Rlcy5zaXplKCk7IGkrKykgewotCQkJCQkJTmFtZWROb2RlIG5hbWVkTm9kZSA9IChOYW1lZE5vZGUpIG5vZGVzLmdldChpKTsKLQkJCQkJCW1lID0gbmFtZWROb2RlLmdldExpbmtlZEVsZW1lbnQoKTsKLQotCQkJCQkJbWFwcGVkTWV0aG9kRWxlbWVudCA9IGdldENvcGllZEVsZW1lbnQobWUpOwotCQkJCQkJaWYgKG1hcHBlZE1ldGhvZEVsZW1lbnQgIT0gbnVsbCkgewotCQkJCQkJCW5hbWVkTm9kZQotCQkJCQkJCQkJLnNldExpbmtlZEVsZW1lbnQoKE1ldGhvZEVsZW1lbnQpIG1hcHBlZE1ldGhvZEVsZW1lbnQpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfSBlbHNlIGlmIChkaWFncmFtVHlwZSA9PSBJRGlhZ3JhbU1hbmFnZXIuV09SS19QUk9EVUNUX0RFUEVOREVOQ1lfRElBR1JBTSkgewotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBOYW1lZE5vZGUpIHsKLQkJCQkJTmFtZWROb2RlIG5hbWVkTm9kZSA9IChOYW1lZE5vZGUpIG9iajsKLQkJCQkJTWV0aG9kRWxlbWVudCBtZSA9IG5hbWVkTm9kZS5nZXRMaW5rZWRFbGVtZW50KCk7Ci0KLQkJCQkJT2JqZWN0IG1hcHBlZE1ldGhvZEVsZW1lbnQgPSBnZXRDb3BpZWRFbGVtZW50KG1lKTsKLQkJCQkJaWYgKG1hcHBlZE1ldGhvZEVsZW1lbnQgIT0gbnVsbCkgewotCQkJCQkJbmFtZWROb2RlCi0JCQkJCQkJCS5zZXRMaW5rZWRFbGVtZW50KChNZXRob2RFbGVtZW50KSBtYXBwZWRNZXRob2RFbGVtZW50KTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEdldCBjb3BpZWQgZWxlbWVudCBmcm9tIHRoZSBtYXAKLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIE9iamVjdCBnZXRDb3BpZWRFbGVtZW50KE9iamVjdCBlbGVtZW50KSB7Ci0JCWlmKG9yaWdpbmFsVG9Db3B5TWFwID09IG51bGwgJiYgY29weVRvT3JpZ2luYWxNYXAgIT0gbnVsbCkgewotCQkJb3JpZ2luYWxUb0NvcHlNYXAgPSBuZXcgSGFzaE1hcDxFT2JqZWN0LCBFT2JqZWN0PigpOwotCQkJZm9yIChNYXAuRW50cnk8RU9iamVjdCwgRU9iamVjdD4gZW50cnkgOiBjb3B5VG9PcmlnaW5hbE1hcC5lbnRyeVNldCgpKSB7Ci0JCQkJb3JpZ2luYWxUb0NvcHlNYXAucHV0KGVudHJ5LmdldFZhbHVlKCksIGVudHJ5LmdldEtleSgpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gb3JpZ2luYWxUb0NvcHlNYXAgIT0gbnVsbCA/IG9yaWdpbmFsVG9Db3B5TWFwLmdldChlbGVtZW50KSA6IG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQWJzdHJhY3RDb21tYW5kI3ByZXBhcmUoKQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHByZXBhcmUoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkFic3RyYWN0Q29tbWFuZCN1bmRvKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bmRvKCkgewotCQlpZiAoIShjb3BpZWRFbGVtZW50cyA9PSBudWxsIHx8IGNvcGllZEVsZW1lbnRzLmlzRW1wdHkoKSkpIHsKLQkJCXRyeSB7Ci0JCQkJVHhVdGlsLnJ1bkluVHJhbnNhY3Rpb24oZG9tYWluLCBuZXcgUnVubmFibGUoKSB7Ci0KLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJdHJ5IHsKLQkJCQkJCQlmb3IgKERpYWdyYW0gZGlhZ3JhbSA6IGNvcGllZEVsZW1lbnRzKSB7Ci0JCQkJCQkJCW1nci5nZXRSZXNvdXJjZSgpLmdldENvbnRlbnRzKCkKLQkJCQkJCQkJCQkucmVtb3ZlKGRpYWdyYW0uZ2V0RWxlbWVudCgpKTsKLQkJCQkJCQkJbWdyLmdldFJlc291cmNlKCkuZ2V0Q29udGVudHMoKS5yZW1vdmUoZGlhZ3JhbSk7Ci0JCQkJCQkJfQotCQkJCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJdGhyb3cgbmV3IFdyYXBwZWRFeGNlcHRpb24oZSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJCi0JCQkJfSk7Ci0JCQkJY29waWVkRWxlbWVudHMuY2xlYXIoKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJCURpYWdyYW1Db3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihleCk7Ci0JCQkJaWYgKERFQlVHKSB7Ci0JCQkJCWV4LnByaW50U3RhY2tUcmFjZSgpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklSZXNvdXJjZUF3YXJlQ29tbWFuZCNnZXRNb2RpZmllZFJlc291cmNlcygpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb248UmVzb3VyY2U+IGdldE1vZGlmaWVkUmVzb3VyY2VzKCkgewotCQlpZiAoY29waWVkRWxlbWVudHMgPT0gbnVsbCB8fCBjb3BpZWRFbGVtZW50cy5pc0VtcHR5KCkpIHsKLQkJCS8vIGNvbW1hbmQgaXMgbm90IGV4ZWN1dGVkIHlldAotCQkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOwotCQl9Ci0JCUhhc2hTZXQ8UmVzb3VyY2U+IG1vZGlmaWVkUmVzb3VyY2VzID0gbmV3IEhhc2hTZXQ8UmVzb3VyY2U+KCk7Ci0KLQkJZm9yIChEaWFncmFtIGRpYWdyYW0gOiBjb3BpZWRFbGVtZW50cykgewotCQkJaWYoZGlhZ3JhbSAhPSBudWxsICYmIGRpYWdyYW0uZVJlc291cmNlKCkgIT0gbnVsbCkKLQkJCQltb2RpZmllZFJlc291cmNlcy5hZGQoZGlhZ3JhbS5lUmVzb3VyY2UoKSk7Ci0JCX0KLQotCQlyZXR1cm4gbW9kaWZpZWRSZXNvdXJjZXM7Ci0JfQotCQotCQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkFic3RyYWN0Q29tbWFuZCNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlpZiAobWdyICE9IG51bGwpCi0JCQltZ3IucmVtb3ZlQ29uc3VtZXIodGhpcyk7Ci0KLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2NvcmUvY29tbWFuZHMvQ29weURpYWdyYW1Gb3JEZWVwQ29weUNvbW1hbmQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2NvcmUvY29tbWFuZHMvQ29weURpYWdyYW1Gb3JEZWVwQ29weUNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDJmNDJiOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9jb3JlL2NvbW1hbmRzL0NvcHlEaWFncmFtRm9yRGVlcENvcHlDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0ODcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQWJzdHJhY3RDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5XcmFwcGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FTW9kZWxFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uaW1wbC5JbnRlcm5hbFRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuRGlhZ3JhbUNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5icmlkZ2UuQnJpZGdlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuc2VydmljZXMuRGlhZ3JhbUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnNlcnZpY2VzLkRpYWdyYW1NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuc2VydmljZXMuRGlhZ3JhbVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTmFtZWROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGVDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwudXRpbC5UeFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSVJlc291cmNlQXdhcmVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZC5Db3B5SGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Db25maWd1cmF0aW9uU2V0dGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5JRGlhZ3JhbU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlN1cHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkRpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eVBhcmFtZXRlck5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuQWN0aXZpdHlQYXJ0aXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTsKLQotaW1wb3J0IGNvbS5pYm0uaWN1LnV0aWwuU3RyaW5nVG9rZW5pemVyOwotCi0vKioKLSAqIAotICogVXBkYXRlcyBkaWFncmFtcyBvZiB0aGUgYWN0aXZpdHkncyBkZWVwIGNvcGllcy4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjIKLSAqLwotcHVibGljIGNsYXNzIENvcHlEaWFncmFtRm9yRGVlcENvcHlDb21tYW5kIGV4dGVuZHMgQWJzdHJhY3RDb21tYW5kIGltcGxlbWVudHMKLQkJSVJlc291cmNlQXdhcmVDb21tYW5kIHsKLQotCXByaXZhdGUgQ29sbGVjdGlvbjw/PiBlbGVtZW50czsKLQotCXByaXZhdGUgTWFwPD8sPz4gY29weVRvT3JpZ2luYWxNYXA7Ci0KLQlwcml2YXRlIENvbGxlY3Rpb248RGlhZ3JhbT4gY29waWVkRWxlbWVudHM7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHID0gRGlhZ3JhbUNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpCi0JCQkuaXNEZWJ1Z2dpbmcoKTsKLQotCXByaXZhdGUgUHJvY2VzcyB0YXJnZXRQcm9jZXNzOwotCi0JcHJpdmF0ZSBEaWFncmFtTWFuYWdlciBtZ3I7Ci0JcHJpdmF0ZSBJbnRlcm5hbFRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIGRvbWFpbjsKLQotCXByaXZhdGUgQ29weUhlbHBlciBjb3B5SGVscGVyOwotCi0JcHJpdmF0ZSBNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZzsKLQotCXByaXZhdGUgUHJvY2VzcyBzcmNQcm9jZXNzOwotCi0JcHJpdmF0ZSBIYXNoTWFwPEJyZWFrZG93bkVsZW1lbnQsIFN0cmluZz4gY29weVRvV3JhcHBlclBhdGhNYXA7Ci0JCi0JcHVibGljIENvcHlEaWFncmFtRm9yRGVlcENvcHlDb21tYW5kKENvbGxlY3Rpb248Pz4gZWxlbWVudHMsIE1hcDw/LCA/PiBjb3B5VG9PcmlnaW5hbE1hcCwKLQkJCVByb2Nlc3Mgc3JjUHJvY2VzcywgUHJvY2VzcyB0YXJnZXRQcm9jZXNzLCBDb3B5SGVscGVyIGNvcHlIZWxwZXIsCi0JCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZykgewotCQl0aGlzLmNvcHlIZWxwZXIgPSBjb3B5SGVscGVyOwotCQl0aGlzLmNvbmZpZyA9IGNvbmZpZzsKLQkJdGhpcy5zcmNQcm9jZXNzID0gc3JjUHJvY2VzczsKLQkJdGhpcy5lbGVtZW50cyA9IGVsZW1lbnRzOwotCQl0aGlzLmNvcHlUb09yaWdpbmFsTWFwID0gY29weVRvT3JpZ2luYWxNYXA7Ci0JCXRoaXMudGFyZ2V0UHJvY2VzcyA9IHRhcmdldFByb2Nlc3M7Ci0KLQkJLy8gZ2V0IGRpYWdyYW0gbWFuYWdlciBhbmQgZG9tYWluCi0JCW1nciA9IERpYWdyYW1NYW5hZ2VyLmdldEluc3RhbmNlKHRhcmdldFByb2Nlc3MsIHRoaXMpOwotCQlkb21haW4gPSBtZ3IuZ2V0RWRpdGluZ0RvbWFpbigpOwotCX0JCi0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kI2V4ZWN1dGUoKQotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCXRyeSB7Ci0JCQlUeFV0aWwucnVuSW5UcmFuc2FjdGlvbihkb21haW4sIG5ldyBSdW5uYWJsZSgpIHsKLQotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJZG9FeGVjdXRlKCk7Ci0JCQkJfQotCQkJCQotCQkJfSk7Ci0JCX0gY2F0Y2ggKEV4ZWN1dGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQlEaWFncmFtQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kI3JlZG8oKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlZG8oKSB7Ci0JCWV4ZWN1dGUoKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGRvRXhlY3V0ZSgpIHsJCQotCQlpZiAoY29waWVkRWxlbWVudHMgPT0gbnVsbCkgewotCQkJY29waWVkRWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0PERpYWdyYW0+KCk7Ci0JCX0gZWxzZSB7Ci0JCQljb3BpZWRFbGVtZW50cy5jbGVhcigpOwotCQl9Ci0JCWNvcHlUb1dyYXBwZXJQYXRoTWFwID0gbmV3IEhhc2hNYXA8QnJlYWtkb3duRWxlbWVudCwgU3RyaW5nPigpOwotCQlpZiAoY29weUhlbHBlciAhPSBudWxsKSB7Ci0JCQlmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIEJyZWFrZG93bkVsZW1lbnQ+IGVudHJ5IDogY29weUhlbHBlcgotCQkJCQkuZ2V0V3JhcHBlclBhdGhUb0NvcHlNYXAoKS5lbnRyeVNldCgpKSB7Ci0JCQkJY29weVRvV3JhcHBlclBhdGhNYXAucHV0KGVudHJ5LmdldFZhbHVlKCksIGVudHJ5LmdldEtleSgpKTsKLQkJCX0KLQkJfQotCQlEaWFncmFtU2VydmljZSBkaWFncmFtU3ZjID0gbmV3IERpYWdyYW1TZXJ2aWNlKCk7Ci0JCXRyeSB7CQkJCi0JCQlmb3IgKE9iamVjdCBlIDogZWxlbWVudHMpIHsKLQkJCQlPYmplY3Qgb3JpZyA9IGNvcHlUb09yaWdpbmFsTWFwLmdldChlKTsKLQkJCQlpZiAob3JpZyAhPSBudWxsICYmIG9yaWcgaW5zdGFuY2VvZiBBY3Rpdml0eSAmJiBlICE9IG51bGwKLQkJCQkJCSYmIGUgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCQlBY3Rpdml0eSBjb3B5QWN0aXZpdHkgPSAoQWN0aXZpdHkpIGU7Ci0JCQkJCUFjdGl2aXR5IG9yaWdBY3Rpdml0eSA9IChBY3Rpdml0eSkgb3JpZzsKLQotCQkJCQlDb2xsZWN0aW9uPERpYWdyYW0+IGRpYWdyYW1zID0gZGlhZ3JhbVN2Yy5nZXREaWFncmFtcyhvcmlnQWN0aXZpdHkpOwotCQkJCQlpZiAoZGlhZ3JhbXMgIT0gbnVsbCAmJiAhZGlhZ3JhbXMuaXNFbXB0eSgpKSB7Ci0JCQkJCQlmb3IgKERpYWdyYW0gZGlhZ3JhbSA6IGRpYWdyYW1zKSB7Ci0JCQkJCQkJaWYgKGRpYWdyYW0gIT0gbnVsbCkgewotCQkJCQkJCQkvLyBjb3B5IHRoZSBkaWFncmFtCi0JCQkJCQkJCURpYWdyYW0gZGlhZ3JhbUNvcHkgPSAoRGlhZ3JhbSkgRGlhZ3JhbUhlbHBlcgotCQkJCQkJCQkJCS5jb3B5RGlhZ3JhbShkb21haW4sIGRpYWdyYW0pOwotCi0JCQkJCQkJCS8vIHVwZGF0ZSBjaGlsZHJlbiByZWZlcmVuY2VzCi0JCQkJCQkJCXVwZGF0ZVJlZmVyZW5jZXMoZGlhZ3JhbUNvcHksIGNvcHlBY3Rpdml0eSwgb3JpZ0FjdGl2aXR5KTsKLQotCQkJCQkJCQkvLyBhc3NvY2lhdGUgd2l0aCB0aGUgYWN0aXZpdHkKLQkJCQkJCQkJaW50IGRpYWdyYW1UeXBlID0gRGlhZ3JhbUhlbHBlcgotCQkJCQkJCQkJCS5nZXREaWFncmFtVHlwZShkaWFncmFtQ29weSk7Ci0JCQkJCQkJCW1nci5hc3NvY2lhdGUoZGlhZ3JhbUNvcHksIGRpYWdyYW1UeXBlLAotCQkJCQkJCQkJCShBY3Rpdml0eSkgY29weUFjdGl2aXR5KTsKLQotCQkJCQkJCQljb3BpZWRFbGVtZW50cy5hZGQoZGlhZ3JhbUNvcHkpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQlEaWFncmFtQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZXgpOwotCQkJaWYgKERFQlVHKSB7Ci0JCQkJZXgucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9Ci0JCX0gZmluYWxseSB7Ci0JCQlkaWFncmFtU3ZjLmRpc3Bvc2UoKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgY2xlYXJSZWFkT25seShvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlIG5vZGUpIHsKLQkJbm9kZS5zZXRSZWFkT25seShmYWxzZSk7Ci0JCWlmIChub2RlIGluc3RhbmNlb2YgTm9kZUNvbnRhaW5lcikgewotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gKChOb2RlQ29udGFpbmVyKW5vZGUpLmdldE5vZGVzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZSBjaGlsZCA9IChvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlKSBpdGVyLm5leHQoKTsKLQkJCQljaGlsZC5zZXRSZWFkT25seShmYWxzZSk7Ci0JCQl9Ci0JCX0KLQl9CQotCQotCXByaXZhdGUgQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIgZ2V0T3JpZ2luYWxXcmFwcGVyKEFjdGl2aXR5IGNvcHkpIHsKLQkJU3RyaW5nIHdyYXBwZXJQYXRoID0gY29weVRvV3JhcHBlclBhdGhNYXAuZ2V0KGNvcHkpOwotCQlpZih3cmFwcGVyUGF0aCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlpZihzcmNQcm9jZXNzICE9IG51bGwpIHsKLQkJCVN1cHByZXNzaW9uIHN1cHByZXNzaW9uID0gU3VwcHJlc3Npb24uZ2V0U3VwcHJlc3Npb24oc3JjUHJvY2Vzcyk7Ci0JCQlBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSA9IFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFLmdldFdCU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCk7Ci0JCQlDb25maWd1cmF0aW9uU2V0dGVyIGNvbmZpZ1NldHRlciA9IG5ldyBDb25maWd1cmF0aW9uU2V0dGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQkJCXRyeSB7Ci0JCQkJY29uZmlnU2V0dGVyLnNldChjb25maWcpOwotCQkJCVN0cmluZ1Rva2VuaXplciB0b2tlbnMgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHdyYXBwZXJQYXRoLCAiLyIpOyAvLyROT04tTkxTLTEkCi0JCQkJQXJyYXlMaXN0PFN0cmluZz4gZ3VpZExpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJCQl3aGlsZSh0b2tlbnMuaGFzTW9yZVRva2VucygpKSB7Ci0JCQkJCWd1aWRMaXN0LmFkZCh0b2tlbnMubmV4dFRva2VuKCkpOwotCQkJCX0KLQkJCQlTdHJpbmdbXSBndWlkUGF0aCA9IG5ldyBTdHJpbmdbZ3VpZExpc3Quc2l6ZSgpXTsKLQkJCQlndWlkTGlzdC50b0FycmF5KGd1aWRQYXRoKTsKLQkJCQlPYmplY3QgbyA9IHN1cHByZXNzaW9uLmdldE9iamVjdEJ5UGF0aChndWlkUGF0aCwgYWRhcHRlckZhY3RvcnkpOwotCQkJCWlmKG8gaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgewotCQkJCQlyZXR1cm4gKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSBvOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJU3lzdGVtLm91dAotCQkJCQkJCS5wcmludGxuKCJDb3B5RGlhZ3JhbUNvbW1hbmQuZ2V0T3JpZ2luYWxXcmFwcGVyKCk6IGludmFsaWQgd3JhcHBlciBmb3IgY29weSBhY3Rpdml0eTogIiArIG8pOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfQotCQkJZmluYWxseSB7Ci0JCQkJY29uZmlnU2V0dGVyLnJlc3RvcmUoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHJpdmF0ZSBDb2xsZWN0aW9uPEJyZWFrZG93bkVsZW1lbnQ+IGdldEJyZWFrZG93bkVsZW1lbnRzKEFjdGl2aXR5IG9yaWdBY3Rpdml0eSwgQWN0aXZpdHkgY29weUFjdGl2aXR5KSB7Ci0JCUJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyIHdyYXBwZXIgPSBnZXRPcmlnaW5hbFdyYXBwZXIoY29weUFjdGl2aXR5KTsKLQkJT2JqZWN0IG9iamVjdCA9IHdyYXBwZXIgIT0gbnVsbCA/IHdyYXBwZXIgOiBvcmlnQWN0aXZpdHk7Ci0JCUFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5ID0gVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UuZ2V0V0JTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKTsKLQkJQ29uZmlndXJhdGlvblNldHRlciBjb25maWdTZXR0ZXIgPSBuZXcgQ29uZmlndXJhdGlvblNldHRlcihhZGFwdGVyRmFjdG9yeSk7Ci0JCXRyeSB7Ci0JCQljb25maWdTZXR0ZXIuc2V0KGNvbmZpZyk7Ci0JCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIgaXAgPSAoSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyKSBhZGFwdGVyRmFjdG9yeS5hZGFwdChvYmplY3QsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7CQkJCQkKLQkJCUNvbGxlY3Rpb248Pz4gb3JpZ0NoaWxkcmVuID0gaXAuZ2V0Q2hpbGRyZW4ob3JpZ0FjdGl2aXR5KTsKLQkJCUNvbGxlY3Rpb248QnJlYWtkb3duRWxlbWVudD4gZWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0PEJyZWFrZG93bkVsZW1lbnQ+KCk7Ci0JCQlmb3IoT2JqZWN0IG9yaWdDaGlsZCA6IG9yaWdDaGlsZHJlbikgewotCQkJCU9iamVjdCBlID0gVG5nVXRpbC51bndyYXAob3JpZ0NoaWxkKTsKLQkJCQlpZihlIGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudCkgewotCQkJCQllbGVtZW50cy5hZGQoKEJyZWFrZG93bkVsZW1lbnQpIGUpOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBlbGVtZW50czsKLQkJfQotCQlmaW5hbGx5IHsKLQkJCWNvbmZpZ1NldHRlci5yZXN0b3JlKCk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgQnJlYWtkb3duRWxlbWVudCBnZXRCcmVha2Rvd25FbGVtZW50KENvbGxlY3Rpb248QnJlYWtkb3duRWxlbWVudD4gZWxlbWVudHMsIEFjdGl2aXR5IGJhc2UpIHsKLQkJZm9yIChCcmVha2Rvd25FbGVtZW50IGUgOiBlbGVtZW50cykgewotCQkJaWYoZSBpbnN0YW5jZW9mIFZhcmlhYmlsaXR5RWxlbWVudCkgewotCQkJCWJvb2xlYW4gZm91bmQgPSBmYWxzZTsKLQkJCQlmaW5kX2Jhc2U6Ci0JCQkJZm9yKFZhcmlhYmlsaXR5RWxlbWVudCB2ZSA9IChWYXJpYWJpbGl0eUVsZW1lbnQpIGU7IHZlLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSAhPSBudWxsOyB2ZSA9IHZlLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSkgewotCQkJCQlpZih2ZS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkgPT0gYmFzZSkgewotCQkJCQkJZm91bmQgPSB0cnVlOwotCQkJCQkJYnJlYWsgZmluZF9iYXNlOwotCQkJCQl9Ci0JCQkJfQotCQkJCWlmKGZvdW5kKSB7Ci0JCQkJCXJldHVybiAoQnJlYWtkb3duRWxlbWVudCkgZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXByaXZhdGUgY2xhc3MgQ29weUZpbmRlciB7Ci0JCXByaXZhdGUgQWN0aXZpdHkgb3JpZ0FjdGl2aXR5OwotCQlwcml2YXRlIEFjdGl2aXR5IGNvcHlBY3Rpdml0eTsKLQkJcHJpdmF0ZSBNYXA8QnJlYWtkb3duRWxlbWVudCwgQnJlYWtkb3duRWxlbWVudD4gb3JpZ2luYWxUb0NvcHlNYXA7Ci0JCXByaXZhdGUgQ29sbGVjdGlvbjxCcmVha2Rvd25FbGVtZW50PiBlbGVtZW50czsKLQkJCi0JCXByaXZhdGUgQ29weUZpbmRlcihBY3Rpdml0eSBvcmlnQWN0aXZpdHksIEFjdGl2aXR5IGNvcHlBY3Rpdml0eSkgewotCQkJdGhpcy5vcmlnQWN0aXZpdHkgPSBvcmlnQWN0aXZpdHk7Ci0JCQl0aGlzLmNvcHlBY3Rpdml0eSA9IGNvcHlBY3Rpdml0eTsKLQkJfQotCQkKLQkJcHVibGljIE1hcDxCcmVha2Rvd25FbGVtZW50LCBCcmVha2Rvd25FbGVtZW50PiBnZXRPcmlnaW5hbFRvQ29weU1hcCgpIHsKLQkJCWlmKG9yaWdpbmFsVG9Db3B5TWFwID09IG51bGwpIHsKLQkJCQlvcmlnaW5hbFRvQ29weU1hcCA9IG5ldyBIYXNoTWFwPEJyZWFrZG93bkVsZW1lbnQsIEJyZWFrZG93bkVsZW1lbnQ+KCk7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGNvcHlBY3Rpdml0eS5nZXRCcmVha2Rvd25FbGVtZW50cygpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCQkJQnJlYWtkb3duRWxlbWVudCBlID0gKEJyZWFrZG93bkVsZW1lbnQpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJQnJlYWtkb3duRWxlbWVudCBvcmlnID0gKEJyZWFrZG93bkVsZW1lbnQpIGNvcHlIZWxwZXIuZ2V0T3JpZ2luYWwoZSk7Ci0JCQkJCW9yaWdpbmFsVG9Db3B5TWFwLnB1dChvcmlnLCBlKTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gb3JpZ2luYWxUb0NvcHlNYXA7Ci0JCX0KLQkJCi0JCUJyZWFrZG93bkVsZW1lbnQgZmluZENvcHkoQnJlYWtkb3duRWxlbWVudCBvcmlnaW5hbCkgewotCQkJT2JqZWN0IGNvcHkgPSBnZXRPcmlnaW5hbFRvQ29weU1hcCgpLmdldChvcmlnaW5hbCk7Ci0JCQlpZihjb3B5ID09IG51bGwpIHsKLQkJCQlpZihvcmlnaW5hbCBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJCS8vIG1lIG11c3QgYmUgYSBiYXNlIGVsZW1lbnQgb2YgYSBsb2NhbCBjb250cmlidXRvciBvciByZXBsYWNlcgotCQkJCQkvLyAKLQkJCQkJaWYoZWxlbWVudHMgPT0gbnVsbCkgewotCQkJCQkJZWxlbWVudHMgPSBnZXRCcmVha2Rvd25FbGVtZW50cyhvcmlnQWN0aXZpdHksIGNvcHlBY3Rpdml0eSk7Ci0JCQkJCX0KLQkJCQkJY29weSA9IGdldEJyZWFrZG93bkVsZW1lbnQoZWxlbWVudHMsIChBY3Rpdml0eSkgb3JpZ2luYWwpOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiAoQnJlYWtkb3duRWxlbWVudCkgY29weTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFVwZGF0ZSBlQW5ub3RhdGlvbnMgcmVmZXJlbmNlcwotCSAqIAotCSAqIEBwYXJhbSBjb3B5Ci0JICogQHBhcmFtIG9yaWdBY3Rpdml0eSAKLQkgKiBAcGFyYW0gY29weUFjdGl2aXR5IAotCSAqLwotCXB1YmxpYyB2b2lkIHVwZGF0ZVJlZmVyZW5jZXMoRGlhZ3JhbSBjb3B5LCBBY3Rpdml0eSBjb3B5QWN0aXZpdHksIEFjdGl2aXR5IG9yaWdBY3Rpdml0eSkgewotCQlpbnQgZGlhZ3JhbVR5cGUgPSBEaWFncmFtSGVscGVyLmdldERpYWdyYW1UeXBlKGNvcHkpOwotCQlDb3B5RmluZGVyIGNvcHlGaW5kZXIgPSBuZXcgQ29weUZpbmRlcihvcmlnQWN0aXZpdHksIGNvcHlBY3Rpdml0eSk7Ci0JCUxpc3Q8T2JqZWN0PiBjaGlsZHJlbiA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PigpOwotCQkvLyBjb2xsZWN0IGFsbCBjaGlsZHJlbiBmaXJzdCBlLmcuIGZvciBBY3Rpdml0eVBhcnRpdGlvbgotCQkvLyB3ZSBkb24ndCBoYXZlIHBhcnRpdGlvbiBpbnRvIHBhcnRpdGlvbiBzbyBqdXN0IGdldHRpbmcgb25lIGxldmVsIHN1Yi1jaGlsZHJlbgotCQkvLyBhcmUgZW5vdWdoIGZvciBub3cuCi0JCWZvciAoSXRlcmF0b3I8Pz4gaXRvciA9IGNvcHkuZ2V0Q2hpbGRyZW4oKS5pdGVyYXRvcigpOyBpdG9yLmhhc05leHQoKTspIHsKLQkJCU5vZGUgbm9kZSA9IChOb2RlKSBpdG9yLm5leHQoKTsKLQkJCUVPYmplY3Qgb2JqID0gbm9kZS5nZXRFbGVtZW50KCk7Ci0JCQljaGlsZHJlbi5hZGQobm9kZSk7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgQWN0aXZpdHlQYXJ0aXRpb24pewotCQkJCWNoaWxkcmVuLmFkZEFsbChub2RlLmdldENoaWxkcmVuKCkpOwotCQkJfQotCQl9Ci0JCWZvciAoSXRlcmF0b3I8Pz4gaXRvciA9IGNoaWxkcmVuLml0ZXJhdG9yKCk7IGl0b3IuaGFzTmV4dCgpOykgewotCQkJTm9kZSBub2RlID0gKE5vZGUpIGl0b3IubmV4dCgpOwotCQkJRU9iamVjdCBvYmogPSBub2RlLmdldEVsZW1lbnQoKTsKLQotCQkJaWYgKGRpYWdyYW1UeXBlID09IElEaWFncmFtTWFuYWdlci5BQ1RJVklUWV9ESUFHUkFNKSB7Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUKLQkJCQkJCXx8IG9iaiBpbnN0YW5jZW9mIEFjdGl2aXR5UGFyYW1ldGVyTm9kZSkgewotCQkJCQlFTW9kZWxFbGVtZW50IG1vZGVsRWxlbWVudCA9IChFTW9kZWxFbGVtZW50KSBvYmo7Ci0JCQkJCU1ldGhvZEVsZW1lbnQgbWUgPSBCcmlkZ2VIZWxwZXIKLQkJCQkJCQkuZ2V0TWV0aG9kRWxlbWVudEZyb21Bbm5vdGF0aW9uKG1vZGVsRWxlbWVudCwKLQkJCQkJCQkJCXRhcmdldFByb2Nlc3MuZVJlc291cmNlKCkuZ2V0UmVzb3VyY2VTZXQoKSk7Ci0JCQkJCWlmKG1lIGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudCkgewkJCQkJCQotCQkJCQkJQnJlYWtkb3duRWxlbWVudCBtYXBwZWRNZXRob2RFbGVtZW50ID0gY29weUZpbmRlci5maW5kQ29weSgoQnJlYWtkb3duRWxlbWVudCkgbWUpOwotCi0JCQkJCQlpZiAobWFwcGVkTWV0aG9kRWxlbWVudCAhPSBudWxsKSB7Ci0JCQkJCQkJQnJpZGdlSGVscGVyLmFkZEVBbm5vdGF0aW9uKG1vZGVsRWxlbWVudCwgbWFwcGVkTWV0aG9kRWxlbWVudCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKGRpYWdyYW1UeXBlID09IElEaWFncmFtTWFuYWdlci5BQ1RJVklUWV9ERVRBSUxfRElBR1JBTSkgewotCQkJCWlmKG9iaiBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGUpIHsKLQkJCQkJY2xlYXJSZWFkT25seSgob3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZSlvYmopOwotCQkJCX0KLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgTm9kZUNvbnRhaW5lcikgewotCQkJCQlOb2RlQ29udGFpbmVyIG5vZGVDb250YWluZXIgPSAoTm9kZUNvbnRhaW5lcikgb2JqOwotCQkJCQkvLyBkbyBtYXBwaW5nIGZvciBub2RlY29udGFpbmVyCi0JCQkJCU1ldGhvZEVsZW1lbnQgbWUgPSBub2RlQ29udGFpbmVyLmdldExpbmtlZEVsZW1lbnQoKTsKLQkJCQkJT2JqZWN0IG1hcHBlZE1ldGhvZEVsZW1lbnQgPSBudWxsOwotCQkJCQlpZihtZSBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnQpIHsKLQkJCQkJCW1hcHBlZE1ldGhvZEVsZW1lbnQgPSBjb3B5RmluZGVyLmZpbmRDb3B5KChCcmVha2Rvd25FbGVtZW50KSBtZSk7Ci0JCQkJCQlpZiAobWFwcGVkTWV0aG9kRWxlbWVudCAhPSBudWxsKSB7Ci0JCQkJCQkJbm9kZUNvbnRhaW5lcgotCQkJCQkJCS5zZXRMaW5rZWRFbGVtZW50KChNZXRob2RFbGVtZW50KSBtYXBwZWRNZXRob2RFbGVtZW50KTsKLQkJCQkJCX0KLQkJCQkJfQotCi0JCQkJCS8vIGRvIG1hcHBpbmcgZm9yIGl0cyBjaGlsZHJlbgotCQkJCQlMaXN0PD8+IG5vZGVzID0gbm9kZUNvbnRhaW5lci5nZXROb2RlcygpOwotCi0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbm9kZXMuc2l6ZSgpOyBpKyspIHsKLQkJCQkJCU5hbWVkTm9kZSBuYW1lZE5vZGUgPSAoTmFtZWROb2RlKSBub2Rlcy5nZXQoaSk7Ci0JCQkJCQltZSA9IG5hbWVkTm9kZS5nZXRMaW5rZWRFbGVtZW50KCk7Ci0JCQkJCQlpZiAobWUgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50KSB7Ci0JCQkJCQkJbWFwcGVkTWV0aG9kRWxlbWVudCA9IGNvcHlGaW5kZXIKLQkJCQkJCQkJCS5maW5kQ29weSgoQnJlYWtkb3duRWxlbWVudCkgbWUpOwotCQkJCQkJCWlmIChtYXBwZWRNZXRob2RFbGVtZW50ICE9IG51bGwpIHsKLQkJCQkJCQkJbmFtZWROb2RlCi0JCQkJCQkJCQkJLnNldExpbmtlZEVsZW1lbnQoKE1ldGhvZEVsZW1lbnQpIG1hcHBlZE1ldGhvZEVsZW1lbnQpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0gZWxzZSBpZiAoZGlhZ3JhbVR5cGUgPT0gSURpYWdyYW1NYW5hZ2VyLldPUktfUFJPRFVDVF9ERVBFTkRFTkNZX0RJQUdSQU0pIHsKLQkJCQlpZihvYmogaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlKSB7Ci0JCQkJCWNsZWFyUmVhZE9ubHkoKG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGUpb2JqKTsKLQkJCQl9Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIE5hbWVkTm9kZSkgewotCQkJCQlOYW1lZE5vZGUgbmFtZWROb2RlID0gKE5hbWVkTm9kZSkgb2JqOwotCQkJCQlNZXRob2RFbGVtZW50IG1lID0gbmFtZWROb2RlLmdldExpbmtlZEVsZW1lbnQoKTsKLQkJCQkJaWYgKG1lIGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudCkgewotCQkJCQkJT2JqZWN0IG1hcHBlZE1ldGhvZEVsZW1lbnQgPSBjb3B5RmluZGVyLmZpbmRDb3B5KChCcmVha2Rvd25FbGVtZW50KSBtZSk7Ci0JCQkJCQlpZiAobWFwcGVkTWV0aG9kRWxlbWVudCAhPSBudWxsKSB7Ci0JCQkJCQkJbmFtZWROb2RlCi0JCQkJCQkJCQkuc2V0TGlua2VkRWxlbWVudCgoTWV0aG9kRWxlbWVudCkgbWFwcGVkTWV0aG9kRWxlbWVudCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5BYnN0cmFjdENvbW1hbmQjcHJlcGFyZSgpCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gcHJlcGFyZSgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQWJzdHJhY3RDb21tYW5kI3VuZG8oKQotCSAqLwotCXB1YmxpYyB2b2lkIHVuZG8oKSB7Ci0JCWlmICghKGNvcGllZEVsZW1lbnRzID09IG51bGwgfHwgY29waWVkRWxlbWVudHMuaXNFbXB0eSgpKSkgewotCQkJdHJ5IHsKLQkJCQlUeFV0aWwucnVuSW5UcmFuc2FjdGlvbihkb21haW4sIG5ldyBSdW5uYWJsZSgpIHsKLQotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQl0cnkgewotCQkJCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGNvcGllZEVsZW1lbnRzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQkJCQlEaWFncmFtIGRpYWdyYW0gPSAoRGlhZ3JhbSkgaXRlci5uZXh0KCk7Ci0KLQkJCQkJCQkJbWdyLmdldFJlc291cmNlKCkuZ2V0Q29udGVudHMoKQotCQkJCQkJCQkJCS5yZW1vdmUoZGlhZ3JhbS5nZXRFbGVtZW50KCkpOwotCQkJCQkJCQltZ3IuZ2V0UmVzb3VyY2UoKS5nZXRDb250ZW50cygpLnJlbW92ZShkaWFncmFtKTsKLQkJCQkJCQl9Ci0JCQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQl0aHJvdyBuZXcgV3JhcHBlZEV4Y2VwdGlvbihlKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQkKLQkJCQl9KTsKLQkJCQljb3BpZWRFbGVtZW50cy5jbGVhcigpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQkJRGlhZ3JhbUNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGV4KTsKLQkJCQlpZiAoREVCVUcpIHsKLQkJCQkJZXgucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSVJlc291cmNlQXdhcmVDb21tYW5kI2dldE1vZGlmaWVkUmVzb3VyY2VzKCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRNb2RpZmllZFJlc291cmNlcygpIHsKLQkJaWYgKGNvcGllZEVsZW1lbnRzID09IG51bGwgfHwgY29waWVkRWxlbWVudHMuaXNFbXB0eSgpKSB7Ci0JCQkvLyBjb21tYW5kIGlzIG5vdCBleGVjdXRlZCB5ZXQKLQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCQl9Ci0JCUhhc2hTZXQ8T2JqZWN0PiBtb2RpZmllZFJlc291cmNlcyA9IG5ldyBIYXNoU2V0PE9iamVjdD4oKTsKLQotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjb3BpZWRFbGVtZW50cy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCURpYWdyYW0gZGlhZ3JhbSA9IChEaWFncmFtKSBpdGVyLm5leHQoKTsKLQkJCWlmKGRpYWdyYW0gIT0gbnVsbCAmJiBkaWFncmFtLmVSZXNvdXJjZSgpICE9IG51bGwpCi0JCQkJbW9kaWZpZWRSZXNvdXJjZXMuYWRkKGRpYWdyYW0uZVJlc291cmNlKCkpOwotCQl9Ci0KLQkJcmV0dXJuIG1vZGlmaWVkUmVzb3VyY2VzOwotCX0KLQkKLQkKLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5BYnN0cmFjdENvbW1hbmQjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJaWYgKG1nciAhPSBudWxsKQotCQkJbWdyLnJlbW92ZUNvbnN1bWVyKHRoaXMpOwotCi0JCXN1cGVyLmRpc3Bvc2UoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9jb3JlL2NvbW1hbmRzL0RlbGV0ZURpYWdyYW1Db21tYW5kLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9jb3JlL2NvbW1hbmRzL0RlbGV0ZURpYWdyYW1Db21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmMTgxMzguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vY29yZS9jb21tYW5kcy9EZWxldGVEaWFncmFtQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vKioKLSAqIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuY29tbWFuZHM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkFic3RyYWN0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLkRpYWdyYW1Db3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuc2VydmljZXMuRGlhZ3JhbUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnNlcnZpY2VzLkRpYWdyYW1NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuc2VydmljZXMuRGlhZ3JhbVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLkRlbGV0ZU1ldGhvZEVsZW1lbnRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JUmVzb3VyY2VBd2FyZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLkZpbGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMuZWRpdG9yLkVkaXRvclNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wYXJ0cy5EaWFncmFtRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkRpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLQotLyoqCi0gKiBDb21tYW5kIHRvIGRlbGV0ZSB0aGUgZGlhZ3JhbS9kaWFncmFtIGVsZW1lbnQgb2YgZ2l2ZW4gQWN0aXZpdHkvQ1AsIHRoaXMgY29tbWFuZCBpcyBwZXJmb3JtZWQKLSAqIHRocm91Z2ggbmVzdGVkIGNvbW1hbmRzIGluIHtAbGluayBEZWxldGVNZXRob2RFbGVtZW50Q29tbWFuZH0uICAKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICovCi1wdWJsaWMgY2xhc3MgRGVsZXRlRGlhZ3JhbUNvbW1hbmQgZXh0ZW5kcyBBYnN0cmFjdENvbW1hbmQgaW1wbGVtZW50cyBJUmVzb3VyY2VBd2FyZUNvbW1hbmQgewotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uIGVsZW1lbnRzVG9SZW1vdmU7Ci0JcHJpdmF0ZSBQcm9jZXNzIHRhcmdldFByb2Nlc3M7Ci0JcHJpdmF0ZSBEaWFncmFtTWFuYWdlciBkTWdyID0gbnVsbDsKLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBEZWxldGVEaWFncmFtQ29tbWFuZChDb2xsZWN0aW9uIGVsZW1lbnRzVG9SZW1vdmUsIFByb2Nlc3MgdGFyZ2V0UHJvY2VzcykgewotCQl0aGlzLmVsZW1lbnRzVG9SZW1vdmUgPSBlbGVtZW50c1RvUmVtb3ZlOwotCQl0aGlzLnRhcmdldFByb2Nlc3MgPSB0YXJnZXRQcm9jZXNzOwotCX0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZCNleGVjdXRlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQlEaWFncmFtU2VydmljZSBkaWFncmFtU3ZjID0gbmV3IERpYWdyYW1TZXJ2aWNlKCk7Ci0JCXRyeSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBlbGVtZW50c1RvUmVtb3ZlLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCU1ldGhvZEVsZW1lbnQgZWxlbWVudCA9IChNZXRob2RFbGVtZW50KSBpdGVyLm5leHQoKTsKLQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJCUNvbGxlY3Rpb248RGlhZ3JhbT4gZGlhZ3JhbXMgPSBkaWFncmFtU3ZjCi0JCQkJCQkJLmdldERpYWdyYW1zKChBY3Rpdml0eSkgZWxlbWVudCk7Ci0JCQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBkaWFncmFtcy5pdGVyYXRvcigpOyBpdGVyYXRvcgotCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlEaWFncmFtIGRpYWdyYW0gPSAoRGlhZ3JhbSkgaXRlcmF0b3IubmV4dCgpOwotCQkJCQkJaWYgKGRpYWdyYW0gIT0gbnVsbCkgewotCQkJCQkJCS8vIEJlZm9yZSBkZWxldGluZyBjbG9zZSBvcGVuZWQgZGlhZ3JhbSBlZGl0b3JzLgotCQkJCQkJCWNsb3NlRGlhZ3JhbUVkaXRvcihkaWFncmFtKTsKLQkJCQkJCQkvLyBEZWxldGUgRGlhZ3JhbS4KLQkJCQkJCQlEaWFncmFtSGVscGVyLmRlbGV0ZURpYWdyYW0oZGlhZ3JhbSwgdHJ1ZSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlEaWFncmFtQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQlkaWFncmFtU3ZjLmRpc3Bvc2UoKTsKLQkJfQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kI3JlZG8oKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlZG8oKSB7Ci0JCWV4ZWN1dGUoKTsKLQl9Ci0JCi0JcHJpdmF0ZSBEaWFncmFtTWFuYWdlciBnZXREaWFncmFtTWFuYWdlcigpIHsKLQkJaWYoZE1nciA9PSBudWxsKSB7Ci0JCQlkTWdyID0gRGlhZ3JhbU1hbmFnZXIuZ2V0SW5zdGFuY2UodGFyZ2V0UHJvY2VzcywgdGhpcyk7Ci0JCX0KLQkJcmV0dXJuIGRNZ3I7Ci0JfQotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0TW9kaWZpZWRSZXNvdXJjZXMoKSB7Ci0JCURpYWdyYW1NYW5hZ2VyIGRNZ3IgPSBnZXREaWFncmFtTWFuYWdlcigpOwotCQlIYXNoU2V0PE9iamVjdD4gbW9kaWZpZWRSZXNvdXJjZXMgPSBuZXcgSGFzaFNldDxPYmplY3Q+KCk7Ci0JCWJvb2xlYW4gZmlsZUV4aXN0ID0gdHJ1ZTsKLQkJdHJ5IHsKLQkJCWlmIChkTWdyICE9IG51bGwgJiYgZE1nci5nZXRSZXNvdXJjZSgpICE9IG51bGwKLQkJCQkJJiYgIWRNZ3IuZ2V0UmVzb3VyY2UoKS5nZXRDb250ZW50cygpLmlzRW1wdHkoKSkgewotCQkJCUZpbGUgZmlsZSA9IG5ldyBGaWxlKEZpbGVNYW5hZ2VyLnRvRmlsZVN0cmluZyhkTWdyCi0JCQkJCQkuZ2V0UmVzb3VyY2UoKS5nZXRVUkkoKSkpOwotCQkJCWlmICghZmlsZS5leGlzdHMoKSkKLQkJCQkJZmlsZUV4aXN0ID0gZmFsc2U7Ci0JCQkJaWYgKGZpbGVFeGlzdCkKLQkJCQkJbW9kaWZpZWRSZXNvdXJjZXMuYWRkKGRNZ3IuZ2V0UmVzb3VyY2UoKSk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlEaWFncmFtQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCX0KLQkJcmV0dXJuIG1vZGlmaWVkUmVzb3VyY2VzOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBjYW5FeGVjdXRlKCkgewotCQlyZXR1cm4gdGFyZ2V0UHJvY2VzcyAhPSBudWxsOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlpZihkTWdyICE9IG51bGwpewotCQkJZE1nci5yZW1vdmVDb25zdW1lcih0aGlzKTsKLQkJfQotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjbG9zZURpYWdyYW1FZGl0b3IoRGlhZ3JhbSBkaWFncmFtKXsKLQkJTGlzdCBlZGl0b3JzID0gRWRpdG9yU2VydmljZS5nZXRJbnN0YW5jZSgpLmdldFJlZ2lzdGVyZWRFZGl0b3JQYXJ0cygpOwotCQlJdGVyYXRvciBpdCA9IGVkaXRvcnMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJT2JqZWN0IG9iaiA9IGl0Lm5leHQoKTsKLQotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIERpYWdyYW1FZGl0b3IpIHsKLQkJCQlEaWFncmFtRWRpdG9yIGRpYWdyYW1FZGl0b3IgPSAoKERpYWdyYW1FZGl0b3IpIG9iaik7Ci0JCQkJaWYgKGRpYWdyYW1FZGl0b3IuZ2V0RGlhZ3JhbSgpLmVxdWFscyhkaWFncmFtKSkgewotCQkJCQkvL2l0J3MgYWxyZWFkeSBvcGVuLCBqdXN0IGNsb3NlIGl0LgotCQkJCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpCi0JCQkJCQkuZ2V0QWN0aXZlUGFnZSgpLmFjdGl2YXRlKGRpYWdyYW1FZGl0b3IpOwotCQkJCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpCi0JCQkJCS5nZXRBY3RpdmVQYWdlKCkuY2xvc2VFZGl0b3IoZGlhZ3JhbUVkaXRvciwgZmFsc2UpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2NvcmUvY29tbWFuZHMvRGVsZXRlRGlhZ3JhbU5vZGVDb21tYW5kLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9jb3JlL2NvbW1hbmRzL0RlbGV0ZURpYWdyYW1Ob2RlQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjE4Mzk5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2NvcmUvY29tbWFuZHMvRGVsZXRlRGlhZ3JhbU5vZGVDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vL0NvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy9hcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vL0NvbnRyaWJ1dG9yczoKLS8vSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5jb21tYW5kczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5BYnN0cmFjdENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkFic3RyYWN0VHJlZUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLkRpYWdyYW1Db3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuYnJpZGdlLkJyaWRnZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnNlcnZpY2VzLkRpYWdyYW1TZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JUmVzb3VyY2VBd2FyZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLnV0aWwuVmlld1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotCi0vKioKLSAqIENvbW1hbmQgdG8gZGVsZXRlIGRpYWdyYW0gbm9kZXMgb2YgdGhlIGRlbGV0ZWQgYnJlYWtkb3duIGVsZW1lbnRzLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMgotICovCi1wdWJsaWMgY2xhc3MgRGVsZXRlRGlhZ3JhbU5vZGVDb21tYW5kIGV4dGVuZHMgQWJzdHJhY3RDb21tYW5kIGltcGxlbWVudHMgSVJlc291cmNlQXdhcmVDb21tYW5kIHsKLQkKLQlwcml2YXRlIEFjdGl2aXR5IGFjdGl2aXR5OwotCXByaXZhdGUgQ29sbGVjdGlvbjw/PiBicmVha2Rvd25FbGVtZW50czsKLQlwcml2YXRlIERpYWdyYW1TZXJ2aWNlIGRpYWdyYW1TdmM7Ci0KLQlwdWJsaWMgRGVsZXRlRGlhZ3JhbU5vZGVDb21tYW5kKEFjdGl2aXR5IGFjdGl2aXR5LCBDb2xsZWN0aW9uPD8+IGJyZWFrZG93bkVsZW1lbnRzKSB7Ci0JCXRoaXMuYWN0aXZpdHkgPSBhY3Rpdml0eTsKLQkJdGhpcy5icmVha2Rvd25FbGVtZW50cyA9IGJyZWFrZG93bkVsZW1lbnRzOwotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uPFJlc291cmNlPiBnZXRNb2RpZmllZFJlc291cmNlcygpIHsKLQkJaWYoZGlhZ3JhbVN2YyAhPSBudWxsKSB7Ci0JCQlvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnNlcnZpY2VzLkRpYWdyYW1NYW5hZ2VyIG1nciA9IGRpYWdyYW1TdmMuZ2V0RGlhZ3JhbU1hbmFnZXIoYWN0aXZpdHkpOwotCQkJaWYobWdyICE9IG51bGwpIHsKLQkJCQl0cnkgewotCQkJCQlSZXNvdXJjZSByZXNvdXJjZSA9IG1nci5nZXRSZXNvdXJjZSgpOwotCQkJCQlpZihyZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQkJCQlyZXR1cm4gQ29sbGVjdGlvbnMuc2luZ2xldG9uKHJlc291cmNlKTsKLQkJCQkJfQotCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQlEaWFncmFtQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCX0KLQotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCUNvbGxlY3Rpb248RGlhZ3JhbT4gZGlhZ3JhbXMgPSBkaWFncmFtU3ZjLmdldERpYWdyYW1zKGFjdGl2aXR5KTsKLQkJQ29sbGVjdGlvbjxWaWV3PiB2aWV3c1RvRGVsZXRlID0gbmV3IEFycmF5TGlzdDxWaWV3PigpOwotCQlmb3IgKERpYWdyYW0gZGlhZ3JhbSA6IGRpYWdyYW1zKSB7Ci0JCQlBYnN0cmFjdFRyZWVJdGVyYXRvcjxWaWV3PiBpdGVyYXRvciA9IG5ldyBBYnN0cmFjdFRyZWVJdGVyYXRvcjxWaWV3PihkaWFncmFtLCBmYWxzZSkgewotCi0JCQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgSXRlcmF0b3I8PyBleHRlbmRzIFZpZXc+IGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJCQkJaWYob2JqZWN0IGluc3RhbmNlb2YgVmlldykgewotCQkJCQkJcmV0dXJuICgoVmlldylvYmplY3QpLmdldENoaWxkcmVuKCkuaXRlcmF0b3IoKTsKLQkJCQkJfQotCQkJCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVC5pdGVyYXRvcigpOwotCQkJCX0KLQotCQkJfTsKLQkJCXdoaWxlKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCVZpZXcgdmlldyA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCQlpZihicmVha2Rvd25FbGVtZW50cy5jb250YWlucyhCcmlkZ2VIZWxwZXIuZ2V0TWV0aG9kRWxlbWVudCh2aWV3LCBhY3Rpdml0eSkpKSB7Ci0JCQkJCXZpZXdzVG9EZWxldGUuYWRkKHZpZXcpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlpZighdmlld3NUb0RlbGV0ZS5pc0VtcHR5KCkpIHsKLQkJCWZvciAoVmlldyB2aWV3IDogdmlld3NUb0RlbGV0ZSkgewotCQkJCVZpZXdVdGlsLmRlc3Ryb3kodmlldyk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCByZWRvKCkgewotCQlleGVjdXRlKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGNhblVuZG8oKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIGJvb2xlYW4gcHJlcGFyZSgpIHsJCQotCQlkaWFncmFtU3ZjID0gbmV3IERpYWdyYW1TZXJ2aWNlKCk7Ci0JCUNvbGxlY3Rpb248RGlhZ3JhbT4gZGlhZ3JhbXMgPSBkaWFncmFtU3ZjLmdldERpYWdyYW1zKGFjdGl2aXR5KTsKLQkJcmV0dXJuICFkaWFncmFtcy5pc0VtcHR5KCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJYWN0aXZpdHkgPSBudWxsOwotCQlicmVha2Rvd25FbGVtZW50cyA9IG51bGw7Ci0JCWRpYWdyYW1TdmMuZGlzcG9zZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2NvcmUvY29tbWFuZHMvTmVzdGVkQ29tbWFuZFByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9jb3JlL2NvbW1hbmRzL05lc3RlZENvbW1hbmRQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMTQ1OTZjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2NvcmUvY29tbWFuZHMvTmVzdGVkQ29tbWFuZFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MzggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5jb21tYW5kczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbXBvdW5kQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQWJzdHJhY3RUcmVlSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQWRkQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLlJlbW92ZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db3B5Q29tbWFuZC5IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5Db21tb25QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5EaWFncmFtQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnBhcnQuRGlhZ3JhbUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUucGFydC5EaWFncmFtRWRpdG9ySW5wdXRQcm94eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLkRlbGV0ZU1ldGhvZEVsZW1lbnRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JTmVzdGVkQ29tbWFuZFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5NZXRob2RFbGVtZW50QWRkQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuUmVzb3VyY2VBd2FyZUNvbXBvdW5kQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQuQWN0aXZpdHlEcm9wQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZC5Db3B5SGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kLlByb2Nlc3NEZWVwQ29weUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51aS5JQWN0aW9uVHlwZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5BY3Rpdml0eUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzLklMaWJyYXJ5UGVyc2lzdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC5kb21haW4uVHJhY2VhYmxlQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBhcnRJbml0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci0KLS8qKgotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4yCi0gKi8KLXB1YmxpYyBjbGFzcyBOZXN0ZWRDb21tYW5kUHJvdmlkZXIgaW1wbGVtZW50cyBJTmVzdGVkQ29tbWFuZFByb3ZpZGVyIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUcgPSBEaWFncmFtQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCS5pc0RlYnVnZ2luZygpOwotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSU5lc3RlZENvbW1hbmRQcm92aWRlciNjcmVhdGVOZXN0ZWRDb21tYW5kKG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kKQotCSAqLwotCXB1YmxpYyBDb21tYW5kIGNyZWF0ZU5lc3RlZENvbW1hbmQoQ29tbWFuZCBjb21tYW5kKSB7Ci0JCWlmIChjb21tYW5kIGluc3RhbmNlb2YgQWN0aXZpdHlEcm9wQ29tbWFuZCkgewotCQkJQWN0aXZpdHlEcm9wQ29tbWFuZCBjbWQgPSAoQWN0aXZpdHlEcm9wQ29tbWFuZCkgY29tbWFuZDsKLQkJCWlmIChJQWN0aW9uVHlwZVByb3ZpZGVyLkNPUFkgPT0gY21kLmdldFR5cGUoKSkKLQkJCQlyZXR1cm4gY3JlYXRlTmVzdGVkQ29tbWFuZEZvckNvcHkoY21kKTsKLQkJCWVsc2UgaWYgKElBY3Rpb25UeXBlUHJvdmlkZXIuREVFUF9DT1BZID09IGNtZC5nZXRUeXBlKCkpCi0JCQkJcmV0dXJuIGNyZWF0ZU5lc3RlZENvbW1hbmRGb3JEZWVwQ29weShjbWQpOwotCQl9Ci0JCWVsc2UgaWYgKGNvbW1hbmQgaW5zdGFuY2VvZiBQcm9jZXNzRGVlcENvcHlDb21tYW5kKSB7Ci0JCQlQcm9jZXNzRGVlcENvcHlDb21tYW5kIGNtZCA9IChQcm9jZXNzRGVlcENvcHlDb21tYW5kKSBjb21tYW5kOwotCQkJUHJvY2VzcyBkZWVwQ29weSA9IG51bGw7Ci0JCQlDb2xsZWN0aW9uPD8+IHJlc3VsdCA9IGNtZC5nZXRSZXN1bHQoKTsKLQkJCWlmKCFyZXN1bHQuaXNFbXB0eSgpKSB7Ci0JCQkJZGVlcENvcHkgPSAoUHJvY2VzcykgcmVzdWx0Lml0ZXJhdG9yKCkubmV4dCgpOwotCQkJfQotCQkJaWYoZGVlcENvcHkgIT0gbnVsbCkgewotCQkJCUNvbGxlY3Rpb248QWN0aXZpdHk+IGRlZXBDb3BpZXMgPSBuZXcgQXJyYXlMaXN0PEFjdGl2aXR5PigpOwotCQkJCWRlZXBDb3BpZXMuYWRkKGRlZXBDb3B5KTsKLQkJCQlyZXR1cm4gY3JlYXRlTmVzdGVkQ29tbWFuZEZvckRlZXBDb3B5KGRlZXBDb3BpZXMsIGNtZC5nZXRUYXJnZXRQcm9jZXNzKCksIAotCQkJCQkJY21kLmdldENvcHlIZWxwZXIoKSwgY21kLmdldE1ldGhvZENvbmZpZ3VyYXRpb24oKSwgdHJ1ZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIG5lc3RlZCBjb21tYW5kIGZvciBEcmFnICYgRHJvcCBDb3B5Ci0JICogCi0JICogQHBhcmFtIGNvbW1hbmQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBDb21tYW5kIGNyZWF0ZU5lc3RlZENvbW1hbmRGb3JDb3B5KEFjdGl2aXR5RHJvcENvbW1hbmQgY29tbWFuZCkgewotCQlDb2xsZWN0aW9uPFJlc291cmNlPiBtb2RpZmllZFJlc291cmNlcyA9ICgoQWN0aXZpdHlEcm9wQ29tbWFuZCkgY29tbWFuZCkuZ2V0TW9kaWZpZWRSZXNvdXJjZXMoKTsgCi0JCWlmIChtb2RpZmllZFJlc291cmNlcyAhPSBudWxsICYmICFtb2RpZmllZFJlc291cmNlcy5pc0VtcHR5KCkpIHsKLQkJCUNvbXBvdW5kQ29tbWFuZCBjbWQgPSBuZXcgUmVzb3VyY2VBd2FyZUNvbXBvdW5kQ29tbWFuZCgKLQkJCQkJQ29tcG91bmRDb21tYW5kLk1FUkdFX0NPTU1BTkRfQUxMKTsKLQotCQkJSGVscGVyIGNvcGllZEhlbHBlciA9IGNvbW1hbmQuZ2V0QWN0aXZpdHlIYW5kbGVyKCkuZ2V0Q29weUhlbHBlcigpOwotCQkJQWN0aXZpdHkgdGFyZ2V0QWN0aXZpdHkgPSBjb21tYW5kLmdldEFjdGl2aXR5KCk7Ci0JCQlQcm9jZXNzIHRhcmdldFByb2MgPSBUbmdVdGlsLmdldE93bmluZ1Byb2Nlc3ModGFyZ2V0QWN0aXZpdHkpOwotCQkJaWYgKHRhcmdldFByb2MgIT0gbnVsbCkgewotCQkJCXRyeSB7Ci0JCQkJCWNtZC5hcHBlbmQobmV3IENvcHlEaWFncmFtQ29tbWFuZChjb3BpZWRIZWxwZXIudmFsdWVzKCksCi0JCQkJCQkJY29waWVkSGVscGVyLCB0YXJnZXRQcm9jKSk7Ci0JCQkJCi0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCUNvbW1vblBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZXgpOwotCQkJCQlpZiAoREVCVUcpIHsKLQkJCQkJCWV4LnByaW50U3RhY2tUcmFjZSgpOwotCQkJCQl9Ci0JCQkJfSBmaW5hbGx5IHsKLQkKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoIWNtZC5pc0VtcHR5KCkpIHsKLQkJCQlyZXR1cm4gY21kOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVkIG5lc3RlZCBjb21tYW5kIGZvciBEcmFnIGFuZCBEcm9wIERlZXAgY29weQotCSAqIAotCSAqIEBwYXJhbSBjb21tYW5kCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgQ29tbWFuZCBjcmVhdGVOZXN0ZWRDb21tYW5kRm9yRGVlcENvcHkoQWN0aXZpdHlEcm9wQ29tbWFuZCBjb21tYW5kKSB7Ci0JCUFjdGl2aXR5SGFuZGxlciBhY3Rpdml0eUhhbmRsZXIgPSAoKEFjdGl2aXR5RHJvcENvbW1hbmQpIGNvbW1hbmQpCi0JCQkJLmdldEFjdGl2aXR5SGFuZGxlcigpOwotCQlpZiAoYWN0aXZpdHlIYW5kbGVyICE9IG51bGwKLQkJCQkmJiAhYWN0aXZpdHlIYW5kbGVyLmdldERlZXBDb3BpZXMoKS5pc0VtcHR5KCkpIHsKLQkJCXJldHVybiBjcmVhdGVOZXN0ZWRDb21tYW5kRm9yRGVlcENvcHkoYWN0aXZpdHlIYW5kbGVyCi0JCQkJCS5nZXREZWVwQ29waWVzKCksIGFjdGl2aXR5SGFuZGxlci5nZXRUYXJnZXRQcm9jZXNzKCksCi0JCQkJCWFjdGl2aXR5SGFuZGxlci5nZXREZWVwQ29weUhlbHBlcigpLCBhY3Rpdml0eUhhbmRsZXIuZ2V0RGVlcENvcHlDb25maWcoKSwgZmFsc2UpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwcml2YXRlIENvbW1hbmQgY3JlYXRlTmVzdGVkQ29tbWFuZEZvckRlZXBDb3B5KAotCQkJQ29sbGVjdGlvbjxBY3Rpdml0eT4gZGVlcENvcGllcywgZmluYWwgUHJvY2VzcyB0YXJnZXRQcm9jLAotCQkJQ29weUhlbHBlciBjb3B5SGVscGVyLCBNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZywKLQkJCWJvb2xlYW4gc2F2ZURpYWdyYW0pIHsKLQkJQ29tcG91bmRDb21tYW5kIGNtZDsKLQkJaWYgKHNhdmVEaWFncmFtKSB7Ci0JCQljbWQgPSBuZXcgUmVzb3VyY2VBd2FyZUNvbXBvdW5kQ29tbWFuZCgKLQkJCQkJQ29tcG91bmRDb21tYW5kLk1FUkdFX0NPTU1BTkRfQUxMKSB7Ci0JCQkJQE92ZXJyaWRlCi0JCQkJcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJCQkJc3VwZXIuZXhlY3V0ZSgpOwotCi0JCQkJCS8vIHNhdmUgZGlhZ3JhbSBmaWxlCi0JCQkJCS8vCi0JCQkJCWlmIChvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnNlcnZpY2VzLkRpYWdyYW1NYW5hZ2VyCi0JCQkJCQkJLmhhc0RpYWdyYW1NYW5hZ2VyKHRhcmdldFByb2MpKSB7Ci0JCQkJCQlvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnNlcnZpY2VzLkRpYWdyYW1NYW5hZ2VyIG1nciA9IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuc2VydmljZXMuRGlhZ3JhbU1hbmFnZXIKLQkJCQkJCQkJLmdldEluc3RhbmNlKHRhcmdldFByb2MsIHRoaXMpOwotCQkJCQkJSUxpYnJhcnlQZXJzaXN0ZXIuRmFpbFNhZmVNZXRob2RMaWJyYXJ5UGVyc2lzdGVyIHBlcnNpc3RlciA9IExpYnJhcnlTZXJ2aWNlVXRpbAotCQkJCQkJCQkuZ2V0UGVyc2lzdGVyRm9yKHRhcmdldFByb2MuZVJlc291cmNlKCkpCi0JCQkJCQkJCS5nZXRGYWlsU2FmZVBlcnNpc3RlcigpOwotCQkJCQkJdHJ5IHsKLQkJCQkJCQlSZXNvdXJjZSByZXNvdXJjZSA9IG1nci5nZXRSZXNvdXJjZSgpOwotCQkJCQkJCXBlcnNpc3Rlci5zYXZlKHJlc291cmNlKTsKLQkJCQkJCQlwZXJzaXN0ZXIuY29tbWl0KCk7Ci0JCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJCURpYWdyYW1Db3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKQotCQkJCQkJCQkJLmxvZ0Vycm9yKGUpOwotCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCXBlcnNpc3Rlci5yb2xsYmFjaygpOwotCQkJCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJCQkJCQlEaWFncmFtQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkKLQkJCQkJCQkJCQkubG9nRXJyb3IoZXgpOwotCQkJCQkJCX0KLQkJCQkJCX0gZmluYWxseSB7Ci0JCQkJCQkJbWdyLnJlbW92ZUNvbnN1bWVyKHRoaXMpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfTsKLQkJfSBlbHNlIHsKLQkJCWNtZCA9IG5ldyBSZXNvdXJjZUF3YXJlQ29tcG91bmRDb21tYW5kKAotCQkJCQlDb21wb3VuZENvbW1hbmQuTUVSR0VfQ09NTUFORF9BTEwpOwotCQl9Ci0JCWZvciAoQWN0aXZpdHkgY29weUFjdCA6IGRlZXBDb3BpZXMpIHsKLQkJCUFjdGl2aXR5IG9yaWdBY3QgPSAoQWN0aXZpdHkpIGNvcHlIZWxwZXIuZ2V0T3JpZ2luYWwoY29weUFjdCk7Ci0JCQlQcm9jZXNzIHNyY1Byb2MgPSBUbmdVdGlsLmdldE93bmluZ1Byb2Nlc3Mob3JpZ0FjdCk7Ci0JCQlNYXA8QWN0aXZpdHksIEFjdGl2aXR5PiBjb3B5VG9PcmlnaW5hbE1hcCA9IG5ldyBIYXNoTWFwPEFjdGl2aXR5LCBBY3Rpdml0eT4oKTsKLQkJCUl0ZXJhdG9yPEJyZWFrZG93bkVsZW1lbnQ+IGNvcHlUcmVlID0gbmV3IEFic3RyYWN0VHJlZUl0ZXJhdG9yPEJyZWFrZG93bkVsZW1lbnQ+KAotCQkJCQljb3B5QWN0KSB7Ci0KLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgSXRlcmF0b3I8PyBleHRlbmRzIEJyZWFrZG93bkVsZW1lbnQ+IGdldENoaWxkcmVuKAotCQkJCQkJT2JqZWN0IG9iamVjdCkgewotCQkJCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQkJCXJldHVybiAoKEFjdGl2aXR5KSBvYmplY3QpLmdldEJyZWFrZG93bkVsZW1lbnRzKCkKLQkJCQkJCQkJLml0ZXJhdG9yKCk7Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1QuaXRlcmF0b3IoKTsKLQkJCQl9Ci0KLQkJCX07Ci0JCQl3aGlsZSAoY29weVRyZWUuaGFzTmV4dCgpKSB7Ci0JCQkJQnJlYWtkb3duRWxlbWVudCBlID0gY29weVRyZWUubmV4dCgpOwotCQkJCWlmIChlIGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQkJT2JqZWN0IG9yaWcgPSBjb3B5SGVscGVyLmdldE9yaWdpbmFsKGUpOwotCQkJCQlpZiAob3JpZyA9PSBudWxsKSB7Ci0JCQkJCQlTeXN0ZW0ub3V0Ci0JCQkJCQkJCS5wcmludGxuKCJOZXN0ZWRDb21tYW5kUHJvdmlkZXIuY3JlYXRlTmVzdGVkQ29tbWFuZEZvckRlZXBDb3B5KCk6IEZBVEFMIEVSUk9SOiBjb3VsZCBub3QgZmluZCBzb3VyY2UgYWN0aXZpdHkgb2YgZGVlcCBjb3B5OiAiICsgZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCWNvcHlUb09yaWdpbmFsTWFwLnB1dCgoQWN0aXZpdHkpIGUsIChBY3Rpdml0eSkgb3JpZyk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQljbWQuYXBwZW5kKG5ldyBDb3B5RGlhZ3JhbUZvckRlZXBDb3B5Q29tbWFuZChjb3B5VG9PcmlnaW5hbE1hcC5rZXlTZXQoKSwKLQkJCQkJY29weVRvT3JpZ2luYWxNYXAsIHNyY1Byb2MsIHRhcmdldFByb2MsIGNvcHlIZWxwZXIsIGNvbmZpZykpOwotCQl9Ci0JCXJldHVybiAhY21kLmlzRW1wdHkoKSA/IGNtZCA6IG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSU5lc3RlZENvbW1hbmRQcm92aWRlciNjcmVhdGVSZWxhdGVkT2JqZWN0cyhqYXZhLnV0aWwuQ29sbGVjdGlvbiwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kKQotCSAqLwotCXB1YmxpYyBDb21tYW5kIGNyZWF0ZVJlbGF0ZWRPYmplY3RzKENvbGxlY3Rpb24gY3JlYXRlZEVsZW1lbnRzLAotCQkJQ29tbWFuZCBjcmVhdGVDb21tYW5kKSB7Ci0KLQkJQ29tcG91bmRDb21tYW5kIGNtZCA9IG5ldyBSZXNvdXJjZUF3YXJlQ29tcG91bmRDb21tYW5kKAotCQkJCUNvbXBvdW5kQ29tbWFuZC5NRVJHRV9DT01NQU5EX0FMTCk7Ci0JCWlmIChjcmVhdGVDb21tYW5kIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudEFkZENvbW1hbmQpIHsKLQotCQkJTWV0aG9kRWxlbWVudEFkZENvbW1hbmQgbWVDb21tYW5kID0gKChNZXRob2RFbGVtZW50QWRkQ29tbWFuZCkgY3JlYXRlQ29tbWFuZCk7Ci0JCQlDb21tYW5kIGFkZENvbW1hbmQgPSBtZUNvbW1hbmQuZ2V0Q29tbWFuZCgpOwotCQkJaWYgKGFkZENvbW1hbmQgaW5zdGFuY2VvZiBBZGRDb21tYW5kKSB7Ci0JCQkJRWRpdGluZ0RvbWFpbiBlZCA9ICgoQWRkQ29tbWFuZCkgYWRkQ29tbWFuZCkuZ2V0RG9tYWluKCk7Ci0JCQkJCi0JCQkJaWYgKCgoQWRkQ29tbWFuZClhZGRDb21tYW5kKS5nZXRPd25lcigpIGluc3RhbmNlb2YgUHJvY2Vzc1BhY2thZ2UpIHsKLQkJCQkJaWYgKGVkIGluc3RhbmNlb2YgVHJhY2VhYmxlQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluKSB7Ci0JCQkJCQlNYXAgY29weVRvT3JpZ2luYWxNYXAgPSAoKFRyYWNlYWJsZUFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbikgZWQpCi0JCQkJCQkJCS5nZXRDb3B5VG9PcmlnaW5hbE1hcCgpOwotCQkJCQkJaWYgKCFjb3B5VG9PcmlnaW5hbE1hcC5pc0VtcHR5KCkpIHsKLQkJCQkJCQlDb2xsZWN0aW9uIGFmZmVjdHMgPSBtZUNvbW1hbmQuZ2V0QWZmZWN0ZWRPYmplY3RzKCk7Ci0JCQkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gYWZmZWN0cy5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJCQlNZXRob2RFbGVtZW50IGVsZW1lbnQgPSAoTWV0aG9kRWxlbWVudCkgaXRlcgotCQkJCQkJCQkJCS5uZXh0KCk7Ci0JCQkJCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkgewotCQkJCQkJCQkJY21kLmFwcGVuZChuZXcgQ29weURpYWdyYW1Db21tYW5kKAotCQkJCQkJCQkJCQljb3B5VG9PcmlnaW5hbE1hcC5rZXlTZXQoKSwKLQkJCQkJCQkJCQkJY29weVRvT3JpZ2luYWxNYXAsCi0JCQkJCQkJCQkJCSgoUHJvY2Vzc0NvbXBvbmVudCkgZWxlbWVudCkKLQkJCQkJCQkJCQkJCQkuZ2V0UHJvY2VzcygpKSk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQkvLyBDb3B5L3Bhc3RlIHdpdGhpbiB0aGUgcHJvY2VzcyBlZGl0b3IKLQkJCQkJaWYgKGVkIGluc3RhbmNlb2YgVHJhY2VhYmxlQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluKSB7Ci0JCQkJCQlNYXAgb3JpZ2luYWxUb0NvcHlNYXAgPSAoKFRyYWNlYWJsZUFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbikgZWQpCi0JCQkJCQkJCS5nZXRPcmlnaW5hbFRvQ2xpcGJvYXJkTWFwKCk7Ci0JCQkJCQlNYXAgY29weVRvT3JpZ2luYWxNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQkJCQkJT2JqZWN0IG93bmVyID0gKChBZGRDb21tYW5kKSBhZGRDb21tYW5kKS5nZXRPd25lcigpOwotCQkJCQkJUHJvY2VzcyB0YXJnZXRQcm9jID0gVG5nVXRpbC5nZXRPd25pbmdQcm9jZXNzKG93bmVyKTsKLQkJCQkJCWlmICh0YXJnZXRQcm9jICE9IG51bGwpIHsKLQkJCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBvcmlnaW5hbFRvQ29weU1hcC5rZXlTZXQoKQotCQkJCQkJCQkJLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQkJCQlPYmplY3Qga2V5ID0gaXRlci5uZXh0KCk7Ci0JCQkJCQkJCU9iamVjdCB2YWwgPSBvcmlnaW5hbFRvQ29weU1hcC5nZXQoa2V5KTsKLQkKLQkJCQkJCQkJY29weVRvT3JpZ2luYWxNYXAucHV0KHZhbCwga2V5KTsKLQkJCQkJCQl9Ci0JCi0JCQkJCQkJY21kLmFwcGVuZChuZXcgQ29weURpYWdyYW1Db21tYW5kKGNvcHlUb09yaWdpbmFsTWFwLmtleVNldCgpLAotCQkJCQkJCQkJY29weVRvT3JpZ2luYWxNYXAsIHRhcmdldFByb2MpKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAoIWNtZC5pc0VtcHR5KCkpIHsKLQkJCXJldHVybiBjbWQ7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSU5lc3RlZENvbW1hbmRQcm92aWRlciNyZW1vdmVSZWxhdGVkT2JqZWN0cyhqYXZhLnV0aWwuQ29sbGVjdGlvbiwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kKQotCSAqLwotCXB1YmxpYyBDb21tYW5kIHJlbW92ZVJlbGF0ZWRPYmplY3RzKENvbGxlY3Rpb24gZGVsZXRlZEVsZW1lbnRzLAotCQkJQ29tbWFuZCBkZWxldGVDb21tYW5kKSB7Ci0JCUNvbXBvdW5kQ29tbWFuZCBjbWQgPSBuZXcgUmVzb3VyY2VBd2FyZUNvbXBvdW5kQ29tbWFuZCgKLQkJCQlDb21wb3VuZENvbW1hbmQuTUVSR0VfQ09NTUFORF9BTEwpOwotCQlpZihkZWxldGVDb21tYW5kIGluc3RhbmNlb2YgRGVsZXRlTWV0aG9kRWxlbWVudENvbW1hbmQpewotCQkJQ29tbWFuZCByZW1vdmVDb21tYW5kID0gKChEZWxldGVNZXRob2RFbGVtZW50Q29tbWFuZClkZWxldGVDb21tYW5kKS5nZXRDb21tYW5kKCk7Ci0JCQlMaXN0PFJlbW92ZUNvbW1hbmQ+IHJlbW92ZUNvbW1hbmRzID0gbnVsbDsKLQkJCWlmKHJlbW92ZUNvbW1hbmQgaW5zdGFuY2VvZiBSZW1vdmVDb21tYW5kKXsKLQkJCQlyZW1vdmVDb21tYW5kcyA9IENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QoKFJlbW92ZUNvbW1hbmQpcmVtb3ZlQ29tbWFuZCk7Ci0JCQl9Ci0JCQllbHNlIGlmKHJlbW92ZUNvbW1hbmQgaW5zdGFuY2VvZiBDb21wb3VuZENvbW1hbmQpIHsKLQkJCQlyZW1vdmVDb21tYW5kcyA9IG5ldyBBcnJheUxpc3Q8UmVtb3ZlQ29tbWFuZD4oKTsKLQkJCQlmb3IgKENvbW1hbmQgY29tbWFuZCA6ICgoQ29tcG91bmRDb21tYW5kKXJlbW92ZUNvbW1hbmQpLmdldENvbW1hbmRMaXN0KCkpIHsKLQkJCQkJaWYoY29tbWFuZCBpbnN0YW5jZW9mIFJlbW92ZUNvbW1hbmQpIHsKLQkJCQkJCXJlbW92ZUNvbW1hbmRzLmFkZCgoUmVtb3ZlQ29tbWFuZCkgY29tbWFuZCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlpZihyZW1vdmVDb21tYW5kcyAhPSBudWxsICYmICFyZW1vdmVDb21tYW5kcy5pc0VtcHR5KCkpIHsKLQkJCQlPYmplY3Qgb3duZXIgPSByZW1vdmVDb21tYW5kcy5nZXQoMCkuZ2V0T3duZXIoKTsKLQkJCQlpZihvd25lciBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJCVByb2Nlc3MgcHJvY2VzcyA9IFRuZ1V0aWwuZ2V0T3duaW5nUHJvY2VzcygoQWN0aXZpdHkpb3duZXIpOwotCQkJCQlDb2xsZWN0aW9uPEFjdGl2aXR5PiBhbGxFbGVtZW50cyA9IG5ldyBIYXNoU2V0PEFjdGl2aXR5PigpOwotCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBkZWxldGVkRWxlbWVudHMuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyLm5leHQoKTsKLQkJCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQkJCQlJdGVyYXRvciBpdGVyYXRvciA9IG5ldyBBYnN0cmFjdFRyZWVJdGVyYXRvcjxPYmplY3Q+KGVsZW1lbnQpIHsKLQotCQkJCQkJCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCQkJCQkJCQlAT3ZlcnJpZGUKLQkJCQkJCQkJcHJvdGVjdGVkIEl0ZXJhdG9yPD8gZXh0ZW5kcyBPYmplY3Q+IGdldENoaWxkcmVuKAotCQkJCQkJCQkJCU9iamVjdCBvYmplY3QpIHsKLQkJCQkJCQkJCWlmKG9iamVjdCBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJCQkJCQkJcmV0dXJuICgoQWN0aXZpdHkpb2JqZWN0KS5nZXRCcmVha2Rvd25FbGVtZW50cygpLml0ZXJhdG9yKCk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCQllbHNlIHsKLQkJCQkJCQkJCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCkuaXRlcmF0b3IoKTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCi0JCQkJCQkJfTsKLQkJCQkJCQl3aGlsZShpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQkJCQkJT2JqZWN0IGUgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCQkJCWlmKGUgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCQkJCQkJYWxsRWxlbWVudHMuYWRkKChBY3Rpdml0eSkgZSk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9IAotCQkJCQl9CQkJCQkKLQkJCQkJaWYoIWFsbEVsZW1lbnRzLmlzRW1wdHkoKSl7Ci0JCQkJCQljbWQuYXBwZW5kKG5ldyBEZWxldGVEaWFncmFtQ29tbWFuZChhbGxFbGVtZW50cywgcHJvY2VzcykpOwotCQkJCQl9Ci0KLQkJCQkJZm9yIChSZW1vdmVDb21tYW5kIGNvbW1hbmQgOiByZW1vdmVDb21tYW5kcykgewotCQkJCQkJaWYoY29tbWFuZC5nZXRPd25lcigpIGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQkJCQlEZWxldGVEaWFncmFtTm9kZUNvbW1hbmQgZGVsZXRlRGlhZ3JhbU5vZGVDb21tYW5kID0gbmV3IERlbGV0ZURpYWdyYW1Ob2RlQ29tbWFuZCgKLQkJCQkJCQkJCShBY3Rpdml0eSkgY29tbWFuZC5nZXRPd25lcigpLCBjb21tYW5kLmdldENvbGxlY3Rpb24oKSk7Ci0JCQkJCQkJaWYoZGVsZXRlRGlhZ3JhbU5vZGVDb21tYW5kLmNhbkV4ZWN1dGUoKSkgewotCQkJCQkJCQljbWQuYXBwZW5kKGRlbGV0ZURpYWdyYW1Ob2RlQ29tbWFuZCk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmKCFkZWxldGVkRWxlbWVudHMuaXNFbXB0eSgpKXsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGRlbGV0ZWRFbGVtZW50cy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3QgZWxlbWVudCA9IChPYmplY3QpIGl0ZXIubmV4dCgpOwotCQkJCWlmKGVsZW1lbnQgaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50KXsKLQkJCQkJUHJvY2Vzc0NvbXBvbmVudCBwYyA9IChQcm9jZXNzQ29tcG9uZW50KWVsZW1lbnQ7Ci0JCQkJCVByb2Nlc3MgcHJvY2VzcyA9IHBjLmdldFByb2Nlc3MoKTsKLQkJCQkJY2xvc2VEaWFncmFtRWRpdG9ycyhwcm9jZXNzKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYoIWNtZC5pc0VtcHR5KCkpewotCQkJcmV0dXJuIGNtZDsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogQ2xvc2VzIERpYWdyYW0gRWRpdG9ycyBpZiB0aGUgb3duaW5nIHByb2Nlc3MgaXMgZGVsZXRlZC4KLQkgKiBAcGFyYW0gcHJvY2VzcwotCSAqLwotCXByaXZhdGUgdm9pZCBjbG9zZURpYWdyYW1FZGl0b3JzKFByb2Nlc3MgcHJvY2VzcykgewotCQlJV29ya2JlbmNoUGFnZSB3b3JrYmVuY2hQYWdlID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKQotCQkJCS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRBY3RpdmVQYWdlKCk7Ci0JCUlFZGl0b3JSZWZlcmVuY2VbXSBlZGl0b3JSZWZlcmVuY2VzID0gd29ya2JlbmNoUGFnZQotCQkJCS5nZXRFZGl0b3JSZWZlcmVuY2VzKCk7Ci0JCUFycmF5TGlzdDxJRWRpdG9yUmVmZXJlbmNlPiBlZGl0b3JzVG9DbG9zZSA9IG5ldyBBcnJheUxpc3Q8SUVkaXRvclJlZmVyZW5jZT4oKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlZGl0b3JSZWZlcmVuY2VzLmxlbmd0aDsgaSsrKSB7Ci0JCQlJRWRpdG9yUmVmZXJlbmNlIGVkaXRvclJlZiA9IGVkaXRvclJlZmVyZW5jZXNbaV07Ci0JCQlJRWRpdG9ySW5wdXQgZWRpdG9ySW5wdXQ7Ci0JCQl0cnkgewotCQkJCWVkaXRvcklucHV0ID0gZWRpdG9yUmVmLmdldEVkaXRvcklucHV0KCk7Ci0JCQkJaWYgKGVkaXRvcklucHV0IGluc3RhbmNlb2YgRGlhZ3JhbUVkaXRvcklucHV0UHJveHkpIHsKLQkJCQkJRGlhZ3JhbUVkaXRvcklucHV0IGlucHV0ID0gKChEaWFncmFtRWRpdG9ySW5wdXRQcm94eSkgZWRpdG9ySW5wdXQpCi0JCQkJCQkJLmdldERpYWdyYW1FZGl0b3JJbnB1dCgpOwotCQkJCQlPYmplY3Qgd3JhcHBlciA9IGlucHV0LmdldFdyYXBwZXIoKTsKLQkJCQkJT2JqZWN0IG93bmluZ1Byb2Nlc3MgPSBudWxsOwotCQkJCQlpZiAod3JhcHBlciAhPSBudWxsKSB7Ci0JCQkJCQlpZiAod3JhcHBlciBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSB7Ci0JCQkJCQkJb3duaW5nUHJvY2VzcyA9IFRuZ1V0aWwKLQkJCQkJCQkJCS5nZXRPd25pbmdQcm9jZXNzKCgoQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIHdyYXBwZXIpKTsKLQkJCQkJCX0KLQkJCQkJfSBlbHNlIHsKLQkJCQkJCXdyYXBwZXIgPSBpbnB1dC5nZXRNZXRob2RFbGVtZW50KCk7Ci0JCQkJCQlpZiAod3JhcHBlciBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnQpIHsKLQkJCQkJCQlvd25pbmdQcm9jZXNzID0gVG5nVXRpbAotCQkJCQkJCQkJLmdldE93bmluZ1Byb2Nlc3MoKChCcmVha2Rvd25FbGVtZW50KSB3cmFwcGVyKSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJaWYgKG93bmluZ1Byb2Nlc3MgPT0gb3duaW5nUHJvY2VzcykgewotCQkJCQkJZWRpdG9yc1RvQ2xvc2UuYWRkKGVkaXRvclJlZik7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBlKSB7Ci0JCQkJRGlhZ3JhbUNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJfQotCQl9Ci0JCWlmKCFlZGl0b3JzVG9DbG9zZS5pc0VtcHR5KCkpIHsKLQkJCUlFZGl0b3JSZWZlcmVuY2VbXSByZWZzID0gbmV3IElFZGl0b3JSZWZlcmVuY2VbZWRpdG9yc1RvQ2xvc2Uuc2l6ZSgpXTsKLQkJCWVkaXRvcnNUb0Nsb3NlLnRvQXJyYXkocmVmcyk7Ci0JCQl3b3JrYmVuY2hQYWdlLmNsb3NlRWRpdG9ycyhyZWZzLCBmYWxzZSk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9jb3JlL2NvbW1hbmRzL1JlY29ubmVjdExpbmtDb21tYW5kLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9jb3JlL2NvbW1hbmRzL1JlY29ubmVjdExpbmtDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3MjVhMWEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vY29yZS9jb21tYW5kcy9SZWNvbm5lY3RMaW5rQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuY29tbWFuZHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlRyYW5zYWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5pbXBsLkludGVybmFsVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5EaWFncmFtQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnV0aWwuRGlhZ3JhbUNvcmVWYWxpZGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLnV0aWwuVHhVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkVkZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm9kZTsKLQotLyoqCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBzaW5jZSAxLjIKLSAqLwotcHVibGljIGNsYXNzIFJlY29ubmVjdExpbmtDb21tYW5kIGV4dGVuZHMgQ29tbWFuZCB7Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNTb3VyY2U7Ci0KLQlwcml2YXRlIEVkZ2UgbGluazsKLQotCXByaXZhdGUgTm9kZSBuZXdOb2RlLCBvbGROb2RlOwotCi0JcHJpdmF0ZSBpbnQgdmlld0luZGV4OwotCi0JcHJpdmF0ZSBQb2ludCBlbmRQb2ludDsKLQotCXByaXZhdGUgSW50ZXJuYWxUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiBkb21haW47Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEFCRUwgPSAiUmVjb25uZWN0IExpbmsiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgUmVjb25uZWN0TGlua0NvbW1hbmQoSW50ZXJuYWxUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiBkb21haW4sIEVkZ2UgbGluaywgTm9kZSBuZXdOb2RlLCBib29sZWFuIGlzU291cmNlKSB7Ci0JCXN1cGVyKExBQkVMKTsKLQkJdGhpcy5kb21haW4gPSBkb21haW47Ci0JCXRoaXMubGluayA9IGxpbms7Ci0JCXRoaXMubmV3Tm9kZSA9IG5ld05vZGU7Ci0JCXRoaXMuaXNTb3VyY2UgPSBpc1NvdXJjZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRFbmRQb2ludChQb2ludCBwKSB7Ci0JCWVuZFBvaW50ID0gcC5nZXRDb3B5KCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY2FuRXhlY3V0ZSgpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBsaW5rICE9IG51bGwgJiYgbmV3Tm9kZSAhPSBudWxsOwotCQlpZiAoIXJlc3VsdCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWlmIChpc1NvdXJjZSkgewotCQkJcmV0dXJuIERpYWdyYW1Db3JlVmFsaWRhdGlvbi5jaGVja1JlY29ubmVjdChuZXdOb2RlLCAoTm9kZSlsaW5rLmdldFRhcmdldCgpLCBsaW5rKSA9PSBudWxsOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIERpYWdyYW1Db3JlVmFsaWRhdGlvbi5jaGVja1JlY29ubmVjdCgoTm9kZSlsaW5rLmdldFNvdXJjZSgpLCBuZXdOb2RlLCBsaW5rKSA9PSBudWxsOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQotCQkvLyBMaW5rCi0JCXRyeSB7Ci0JCQlUeFV0aWwucnVuSW5UcmFuc2FjdGlvbihkb21haW4sIG5ldyBSdW5uYWJsZSgpIHsKLQotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJaWYgKGlzU291cmNlKSB7Ci0JCQkJCQlvbGROb2RlID0gKE5vZGUpIGxpbmsuZ2V0U291cmNlKCk7Ci0JCQkJCQlpZiAob2xkTm9kZSAhPSBudWxsKSB7IC8vIHNhZmV0eSBjaGVjayB0byBoYW5kbGUgZGFuZ2xpbmcgbGluawotCQkJCQkJCXZpZXdJbmRleCA9IG9sZE5vZGUuZ2V0VGFyZ2V0RWRnZXMoKS5pbmRleE9mKGxpbmspOwotCQkJCQkJfQotCQkJCQkJbGluay5zZXRTb3VyY2UobmV3Tm9kZSk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlvbGROb2RlID0gKE5vZGUpIGxpbmsuZ2V0VGFyZ2V0KCk7Ci0JCQkJCQlpZiAob2xkTm9kZSAhPSBudWxsKSB7IC8vIHNhZmV0eSBjaGVjayB0byBoYW5kbGUgZGFuZ2xpbmcgbGluawotCQkJCQkJCXZpZXdJbmRleCA9IG9sZE5vZGUuZ2V0U291cmNlRWRnZXMoKS5pbmRleE9mKGxpbmspOwotCQkJCQkJfQotCQkJCQkJbGluay5zZXRUYXJnZXQobmV3Tm9kZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJCi0JCQl9KTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCURpYWdyYW1Db3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcigiRXJyb3Igd2hpbGUgcmUtY29ubmVjdCB0aGUgbGluayA6IiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHVuZG8oKSB7Ci0JCWlmIChpc1NvdXJjZSkgewotCQkJbmV3Tm9kZS5nZXRUYXJnZXRFZGdlcygpLnJlbW92ZShsaW5rKTsKLQkJCW9sZE5vZGUuZ2V0VGFyZ2V0RWRnZXMoKS5hZGQodmlld0luZGV4LCBsaW5rKTsKLQkJfSBlbHNlIHsKLQkJCW5ld05vZGUuZ2V0U291cmNlRWRnZXMoKS5yZW1vdmUobGluayk7Ci0JCQlvbGROb2RlLmdldFNvdXJjZUVkZ2VzKCkuYWRkKHZpZXdJbmRleCwgbGluayk7Ci0JCX0KLQkJb2xkTm9kZSA9IG51bGw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9jb3JlL2ZpZ3VyZXMvUmFpc2VkTWFyZ2luQm9yZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9jb3JlL2ZpZ3VyZXMvUmFpc2VkTWFyZ2luQm9yZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmNThjNmMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vY29yZS9maWd1cmVzL1JhaXNlZE1hcmdpbkJvcmRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlICBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLmZpZ3VyZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuQ29sb3JDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkdyYXBoaWNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5NYXJnaW5Cb3JkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5Lkluc2V0czsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUmVjdGFuZ2xlOwotCi0vKioKLSAqICBBIGJvcmRlciB3aXRoIGEgcmFpc2VkIG1hcmdpbi4KLSAqICAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUmFpc2VkTWFyZ2luQm9yZGVyIGV4dGVuZHMgTWFyZ2luQm9yZGVyIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIEluc2V0cyBERUZBVUxUX0lOU0VUUyA9IG5ldyBJbnNldHMoMTAsIDEwLCAxMCwgMTApOwotCi0JcHVibGljIFJhaXNlZE1hcmdpbkJvcmRlcigpIHsKLQkJdGhpcyhERUZBVUxUX0lOU0VUUyk7Ci0JfQotCi0JcHVibGljIFJhaXNlZE1hcmdpbkJvcmRlcihJbnNldHMgaW5zZXRzKSB7Ci0JCXN1cGVyKGluc2V0cyk7Ci0JfQotCi0JcHVibGljIFJhaXNlZE1hcmdpbkJvcmRlcihpbnQgdCwgaW50IGwsIGludCBiLCBpbnQgcikgewotCQlzdXBlcih0LCBsLCBiLCByKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmRyYXcyZC5Cb3JkZXIjZ2V0SW5zZXRzKElGaWd1cmUpCi0JICovCi0JcHVibGljIEluc2V0cyBnZXRJbnNldHMoSUZpZ3VyZSBmaWd1cmUpIHsKLQkJcmV0dXJuIGluc2V0czsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5kcmF3MmQuQm9yZGVyI2lzT3BhcXVlKCkKLQkgKi8JCi0JcHVibGljIGJvb2xlYW4gaXNPcGFxdWUoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZHJhdzJkLkJvcmRlciNwYWludChJRmlndXJlLCBHcmFwaGljcywgSW5zZXRzKQotCSAqLwotCXB1YmxpYyB2b2lkIHBhaW50KElGaWd1cmUgZmlndXJlLCBHcmFwaGljcyBnLCBJbnNldHMgaW5zZXRzKSB7Ci0JCWcuc2V0TGluZVN0eWxlKEdyYXBoaWNzLkxJTkVfU09MSUQpOwotCQlnLnNldExpbmVXaWR0aCgxKTsKLQkJZy5zZXRGb3JlZ3JvdW5kQ29sb3IoQ29sb3JDb25zdGFudHMuYnV0dG9uTGlnaHRlc3QpOwotCQlSZWN0YW5nbGUgciA9IGdldFBhaW50UmVjdGFuZ2xlKGZpZ3VyZSwgaW5zZXRzKTsKLQkJci5yZXNpemUoLTEsIC0xKTsKLQkJZy5kcmF3TGluZShyLngsIHIueSwgci5yaWdodCgpLCByLnkpOwotCQlnLmRyYXdMaW5lKHIueCwgci55LCByLngsIHIuYm90dG9tKCkpOwotCQlnLnNldEZvcmVncm91bmRDb2xvcihDb2xvckNvbnN0YW50cy5idXR0b25EYXJrZXIpOwotCQlnLmRyYXdMaW5lKHIueCwgci5ib3R0b20oKSwgci5yaWdodCgpLCByLmJvdHRvbSgpKTsKLQkJZy5kcmF3TGluZShyLnJpZ2h0KCksIHIueSwgci5yaWdodCgpLCByLmJvdHRvbSgpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2NvcmUvZmlndXJlcy9XaWRlbmVkV3JhcExhYmVsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9jb3JlL2ZpZ3VyZXMvV2lkZW5lZFdyYXBMYWJlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlODE2NTc2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2NvcmUvZmlndXJlcy9XaWRlbmVkV3JhcExhYmVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy9BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vL2FyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy93aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy9odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vQ29udHJpYnV0b3JzOgotLy9JQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLmZpZ3VyZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuRGltZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbDsKLQotLyoqCi0gKiBUZW1wb3JhcnkgcmVwbGFjZW1lbnQgZm9yIHtAbGluayBXcmFwTGFiZWx9IHVudGlsIHRoZSB0ZXh0IGN1dC1vZmYgaXNzdWUgaXMgZml4ZWQuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4yCi0gKi8KLXB1YmxpYyBjbGFzcyBXaWRlbmVkV3JhcExhYmVsIGV4dGVuZHMgV3JhcExhYmVsIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGZsb2F0IERFTFRBX0ZBQ1RPUiA9IDAuMDVmOwotCQotCXByaXZhdGUgRGltZW5zaW9uIHRleHRTaXplOwotCXByaXZhdGUgRGltZW5zaW9uIGFkanVzdGVkVGV4dFNpemU7Ci0JCi0JcHVibGljIFdpZGVuZWRXcmFwTGFiZWwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBEaW1lbnNpb24gZ2V0VGV4dFNpemUoaW50IHdIaW50LCBpbnQgaEhpbnQpIHsKLQkJRGltZW5zaW9uIG5ld1RleHRTaXplID0gc3VwZXIuZ2V0VGV4dFNpemUod0hpbnQsIGhIaW50KTsKLQkJaWYobmV3VGV4dFNpemUgIT0gbnVsbCAmJiBuZXdUZXh0U2l6ZSAhPSB0ZXh0U2l6ZSkgewotCQkJdGV4dFNpemUgPSBuZXdUZXh0U2l6ZTsKLQkJCQotCQkJLy8gd29yay1hcm91bmQ6IGluY3JlYXNlIHRoZSB0ZXh0IHNpemUgdG8gYXZvaWQgdGV4dCBjdXQtb2ZmCi0JCQkvLwotCQkJYWRqdXN0ZWRUZXh0U2l6ZSA9IHRleHRTaXplLmdldEV4cGFuZGVkKChpbnQpIE1hdGguY2VpbCh0ZXh0U2l6ZS53aWR0aCAqIERFTFRBX0ZBQ1RPUiksIDQpOwotCQl9Ci0JCXJldHVybiBhZGp1c3RlZFRleHRTaXplOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgUG9pbnQgZ2V0VGV4dExvY2F0aW9uKCkgewotCQlQb2ludCBwID0gc3VwZXIuZ2V0VGV4dExvY2F0aW9uKCk7Ci0JCVJlY3RhbmdsZSByID0gZ2V0Qm91bmRzKCk7Ci0JCURpbWVuc2lvbiB0cyA9IGdldFRleHRTaXplKHIud2lkdGgsIHIuaGVpZ2h0KTsKLQkJaWYoci53aWR0aCA8PSB0cy53aWR0aCkgewotCQkJcC54ID0gMDsKLQkJCWlmKCFnZXRUZXh0KCkuZXF1YWxzSWdub3JlQ2FzZShnZXRTdWJTdHJpbmdUZXh0KCkpKSB7Ci0JCQkJaW52YWxpZGF0ZSgpOwotCQkJfQotCQl9Ci0JCXJldHVybiBwOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2NvcmUvcGFydC9BYnN0cmFjdERpYWdyYW1FZGl0b3IuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2NvcmUvcGFydC9BYnN0cmFjdERpYWdyYW1FZGl0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzQyNjI1NC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9jb3JlL3BhcnQvQWJzdHJhY3REaWFncmFtRWRpdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NDggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5wYXJ0OwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuUG9zaXRpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5Db21tb25QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5EaWFncmFtQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLkRpYWdyYW1Db3JlUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuYWN0aW9ucy5BY2Nlc3NpYmlsaXR5TW92ZUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLmFjdGlvbnMuQ3JlYXRlRWxlbWVudEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLmFjdGlvbnMuRGVsZWdhdGVBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5hY3Rpb25zLkRpYWdyYW1BY3Rpb25zU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLmJyaWRnZS5CcmlkZ2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5icmlkZ2UuRGlhZ3JhbUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5wYXJ0LnV0aWwuRGlhZ3JhbUVkaXRvclV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5wcm92aWRlcnMuRGlhZ3JhbUNvbnRleHRNZW51UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5wcm92aWRlcnMuU2hhcmVkUmVzb3VyY2VEaWFncmFtRG9jdW1lbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnNlcnZpY2VzLkRpYWdyYW1NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuc2VydmljZXMuRGlhZ3JhbVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS51dGlsLkRpYWdyYW1Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTmFtZWROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LklMaWJyYXJ5TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5JTGlicmFyeVNlcnZpY2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLlByb2Nlc3NBdXRob3JpbmdDb25maWd1cmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklBY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmV2ZW50cy5JTGlicmFyeUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLklNZXRob2RFbGVtZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzLklMaWJyYXJ5UGVyc2lzdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy5TZXJ2aWNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudWkuZWRpdG9ycy5JTWV0aG9kRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuQ29udGV4dE1lbnVQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLktleUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLktleVN0cm9rZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYudWkuYWN0aW9ucy5BY3Rpb25SZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYudWkuYWN0aW9ucy5HRUZBY3Rpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnVpLnBhcnRzLlNjcm9sbGluZ0dyYXBoaWNhbFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS51dGlsLlN0cmluZ1N0YXRpY3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5hY3Rpb25zLkFjdGlvbklkczsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmFjdGlvbnMuaW50ZXJuYWwuU2VsZWN0QWxsQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLkRpYWdyYW1FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnBhcnRzLkRpYWdyYW1HcmFwaGljYWxWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wYXJ0cy5JRGlhZ3JhbUdyYXBoaWNhbFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlcXVlc3RzLkNyZWF0ZVVuc3BlY2lmaWVkVHlwZUNvbm5lY3Rpb25SZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVxdWVzdHMuUmVxdWVzdENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlc291cmNlcy5lZGl0b3IuZG9jdW1lbnQuSURvY3VtZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXNvdXJjZXMuZWRpdG9yLmlkZS5lZGl0b3IuRmlsZURpYWdyYW1FZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXNvdXJjZXMuZWRpdG9yLnBhcnRzLkRpYWdyYW1Eb2N1bWVudEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLklFbGVtZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5EaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkVkZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLlNlcGFyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRmlsZUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBhcnRJbml0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuQWN0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pZGUuSUdvdG9NYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuc2VydmljZXMuSURpc3Bvc2FibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuQWN0aXZpdHlOb2RlOwotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIHNrYW5ub29yCi0gKiBAc2luY2UgMS4yCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdERpYWdyYW1FZGl0b3IgZXh0ZW5kcyBGaWxlRGlhZ3JhbUVkaXRvciBpbXBsZW1lbnRzIElHb3RvTWFya2VyLCBJTWV0aG9kRWRpdG9yIHsKLQotCXByaXZhdGUgRGlhZ3JhbU1hbmFnZXIgZGlhZ3JhbU1ncjsKLQlwcml2YXRlIERpYWdyYW1BY3Rpb25zU2VydmljZSBhY3Rpb25TZXJ2aWNlID0gbnVsbDsKLQkKLQlwcml2YXRlIGxvbmcgZk1vZGlmaWNhdGlvblN0YW1wOwotCXByaXZhdGUgQWN0aXZpdHkgYWN0aXZpdHk7Ci0JcHJpdmF0ZSBBZGFwdGVySW1wbCB0aXRsZUFkYXB0ZXI7Ci0KLQlwcml2YXRlIElSZXNvdXJjZUNoYW5nZUxpc3RlbmVyIHJlc291cmNlQ2hhbmdlTGlzdGVuZXIgPSBuZXcgSVJlc291cmNlQ2hhbmdlTGlzdGVuZXIoKSB7Ci0KLQkJcHVibGljIHZvaWQgcmVzb3VyY2VDaGFuZ2VkKElSZXNvdXJjZUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQlpZihldmVudC5nZXRTb3VyY2UoKSA9PSBkaWFncmFtTWdyKSB7Ci0JCQkJSURvY3VtZW50UHJvdmlkZXIgZG9jUHJvdmlkZXIgPSBnZXREb2N1bWVudFByb3ZpZGVyKCk7Ci0JCQkJaWYoZG9jUHJvdmlkZXIgaW5zdGFuY2VvZiBTaGFyZWRSZXNvdXJjZURpYWdyYW1Eb2N1bWVudFByb3ZpZGVyKSB7Ci0JCQkJCWlmKCFpc0RpcnR5KCkpIHsKLQkJCQkJCSgoU2hhcmVkUmVzb3VyY2VEaWFncmFtRG9jdW1lbnRQcm92aWRlcilkb2NQcm92aWRlcikuaGFuZGxlRWxlbWVudENvbnRlbnRDaGFuZ2VkKGdldEVkaXRvcklucHV0KCkpOwotCQkJCQl9Ci0JCQkJfQkJCQkKLQkJCX0KLQkJfQotCQkKLQl9OwotCQotCS8vIExpc3RlbmVycyB0byByZWZyZXNoIGRpYWdyYW0gaWYgY29uZmlndXJhdGlvbiBnb3QgY2hhbmdlZAotCS8vCi0JcHJpdmF0ZSBJTGlicmFyeUNoYW5nZUxpc3RlbmVyIGxpYnJhcnlMaXN0ZW5lciA9IG5ldyBJTGlicmFyeUNoYW5nZUxpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBsaWJyYXJ5Q2hhbmdlZChpbnQgb3B0aW9uLCBDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJCXN3aXRjaCAob3B0aW9uKSB7Ci0JCQljYXNlIElMaWJyYXJ5Q2hhbmdlTGlzdGVuZXIuT1BUSU9OX0NIQU5HRUQ6IHsKLQkJCQlpZiAoY29sbGVjdGlvbiAhPSBudWxsICYmIGNvbGxlY3Rpb24uY29udGFpbnMoY3VycmVudENvbmZpZykpIHsKLQkJCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSBQcm9jZXNzQXV0aG9yaW5nQ29uZmlndXJhdG9yLklOU1RBTkNFLmdldE1ldGhvZENvbmZpZ3VyYXRpb24oKTsKLQkJCQkJdHJ5IHsKLQkJCQkJCVByb2Nlc3NBdXRob3JpbmdDb25maWd1cmF0b3IuSU5TVEFOQ0Uuc2V0TWV0aG9kQ29uZmlndXJhdGlvbihjdXJyZW50Q29uZmlnKTsJCQkJCQotCQkJCQkJcmVmcmVzaCgpOwotCQkJCQl9Ci0JCQkJCWZpbmFsbHkgewotCQkJCQkJUHJvY2Vzc0F1dGhvcmluZ0NvbmZpZ3VyYXRvci5JTlNUQU5DRS5zZXRNZXRob2RDb25maWd1cmF0aW9uKGNvbmZpZyk7Ci0JCQkJCX0KLQkJCQl9CQkKLQkJCQlicmVhazsKLQkJCX0KLQkJCS8vIGhhbmRsZWQgYnkgbGliU3ZjTGlzdGVuZXIKLQkJCS8vCi0vLwkJCWNhc2UgSUxpYnJhcnlDaGFuZ2VMaXN0ZW5lci5PUFRJT05fQ09ORklHVVJBVElPTl9TRUxFQ1RFRDogewotLy8JCQkJY29uZmlnQ2hhbmdlZCgpOwotLy8JCQkJYnJlYWs7Ci0vLwkJCX0KLQkJCX0KLQkJfQotCX07Ci0JCi0JcHJpdmF0ZSBJTGlicmFyeVNlcnZpY2VMaXN0ZW5lciBsaWJTdmNMaXN0ZW5lciA9IG5ldyBMaWJyYXJ5U2VydmljZUxpc3RlbmVyKCkgewotCi0JCXB1YmxpYyB2b2lkIGNvbmZpZ3VyYXRpb25TZXQoTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLQkJCWNvbmZpZ0NoYW5nZWQoKTsKLQkJfQotCi0JfTsKLQotCXByaXZhdGUgTWV0aG9kQ29uZmlndXJhdGlvbiBjdXJyZW50Q29uZmlnOwotCi0JLy9UT0RPOiBpZiB0aGlzIGZsYWcgaXMgc2V0LCByZWZyZXNoIGRpYWdyYW0gaWYgbmVlZGVkIHdoZW4gdGhlIGVkaXRvciBpcyBhY3RpdmF0ZWQgCi0JcHJpdmF0ZSBib29sZWFuIG5lZWRSZWZyZXNoOwotCXByaXZhdGUgRGlhZ3JhbVNlcnZpY2UgZGlhZ3JhbVN2YzsKLQotCXB1YmxpYyBBYnN0cmFjdERpYWdyYW1FZGl0b3IoKSB7Ci0JCXN1cGVyKHRydWUpOwotCX0KLQkKLQlwdWJsaWMgQWJzdHJhY3REaWFncmFtRWRpdG9yKGJvb2xlYW4gaGFzRmx5b3V0UGFsZXR0ZSkgewotCQlzdXBlcihoYXNGbHlvdXRQYWxldHRlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEVkaXRpbmdEb21haW5JRCgpIHsKLQkJcmV0dXJuICJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5FZGl0aW5nRG9tYWluIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByb3RlY3RlZCBEaWFncmFtTWFuYWdlciBnZXREaWFncmFtTWFuYWdlcigpIHsKLQkJaWYgKGRpYWdyYW1NZ3IgPT0gbnVsbCkgewotCQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzIHByb2MgPSBUbmdVdGlsLmdldE93bmluZ1Byb2Nlc3MoYWN0aXZpdHkpOwotCQkJZGlhZ3JhbU1nciA9IERpYWdyYW1NYW5hZ2VyLmdldEluc3RhbmNlKHByb2MsIHRoaXMpOwotCQkJZGlhZ3JhbU1nci5hZGRSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKHJlc291cmNlQ2hhbmdlTGlzdGVuZXIpOwotCQl9Ci0JCXJldHVybiBkaWFncmFtTWdyOwotCX0KLQkKLQlwcm90ZWN0ZWQgRGlhZ3JhbVNlcnZpY2UgZ2V0RGlhZ3JhbVNlcnZpY2UoKSB7Ci0JCWlmKGRpYWdyYW1TdmMgPT0gbnVsbCkgewotCQkJZGlhZ3JhbVN2YyA9IG5ldyBEaWFncmFtU2VydmljZSgpOwotCQl9Ci0JCXJldHVybiBkaWFncmFtU3ZjOwotCX0KLQotCXByb3RlY3RlZCBUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiBjcmVhdGVFZGl0aW5nRG9tYWluKCkgewotCQlUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiBkb21haW4gPSBnZXREaWFncmFtTWFuYWdlcigpLmdldEVkaXRpbmdEb21haW4oKTsKLQkJZG9tYWluLnNldElEKGdldEVkaXRpbmdEb21haW5JRCgpKTsKLQkJcmV0dXJuIGRvbWFpbjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVzb3VyY2VzLmVkaXRvci5wYXJ0cy5EaWFncmFtRG9jdW1lbnRFZGl0b3Ijc2V0RG9jdW1lbnRQcm92aWRlcihvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0RG9jdW1lbnRQcm92aWRlcihJRWRpdG9ySW5wdXQgaW5wdXQpIHsKLQkJc2V0RG9jdW1lbnRQcm92aWRlcihuZXcgU2hhcmVkUmVzb3VyY2VEaWFncmFtRG9jdW1lbnRQcm92aWRlcihnZXREaWFncmFtTWFuYWdlcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIGRvU3luY2hyb25pemUoT2JqZWN0IGVsZW1lbnQsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkJCS8vIHJlbG9hZCBkaWFncmFtJ3MgcmVzb3VyY2UKLQkJCQkvLwotCQkJCURpYWdyYW1NYW5hZ2VyIG1nciA9IGdldERpYWdyYW1NYW5hZ2VyKCk7Ci0JCQkJdHJ5IHsKLQkJCQkJbWdyLnJlbW92ZVJlc291cmNlQ2hhbmdlTGlzdGVuZXIocmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcik7Ci0JCQkJCW1nci5yZWxvYWQoKTsKLQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgRGlhZ3JhbUNvcmVQbHVnaW4uZ2V0UGx1Z2luSWQoKSwKLQkJCQkJCQkwLCAiRXJyb3IgcmVsb2FkaW5nIGRpYWdyYW0iLCBlKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQkJZmluYWxseSB7Ci0JCQkJCW1nci5hZGRSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKHJlc291cmNlQ2hhbmdlTGlzdGVuZXIpOwotCQkJCX0KLQkJCQlzdXBlci5kb1N5bmNocm9uaXplKGVsZW1lbnQsIG1vbml0b3IpOwotCQkJfQotCQl9KTsJCQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXNvdXJjZXMuZWRpdG9yLnBhcnRzLkRpYWdyYW1Eb2N1bWVudEVkaXRvciNkb1NldElucHV0KG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dCwgYm9vbGVhbikKLQkgKiBAY3VzdG9tCi0JICovCi0JcHVibGljIHZvaWQgZG9TZXRJbnB1dChJRWRpdG9ySW5wdXQgaW5wdXQsIGJvb2xlYW4gcmVsZWFzZUVkaXRvckNvbnRlbnRzKQotCQkJdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlhY3Rpdml0eSA9IChBY3Rpdml0eSkgZ2V0TWV0aG9kRWxlbWVudChpbnB1dCk7Ci0JCURpYWdyYW1FZGl0b3JJbnB1dFByb3h5IGlucHV0UHJveHkgPSBudWxsOwotCQlpZiAoaW5wdXQgaW5zdGFuY2VvZiBEaWFncmFtRWRpdG9ySW5wdXRQcm94eSkgewotCQkJaW5wdXRQcm94eSA9IChEaWFncmFtRWRpdG9ySW5wdXRQcm94eSkgaW5wdXQ7Ci0JCQlpbnB1dFByb3h5LnNldFRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluKGNyZWF0ZUVkaXRpbmdEb21haW4oKSk7Ci0JCX0KLQkJc3VwZXIuZG9TZXRJbnB1dChpbnB1dCwgcmVsZWFzZUVkaXRvckNvbnRlbnRzKTsKLQkJaWYoaXNFZGl0YWJsZSgpICYmIGlucHV0UHJveHkgIT0gbnVsbCAmJiAhaW5wdXRQcm94eS5pc05ld0RpYWdyYW0oKSkgewotCQkJZ2V0RGlhZ3JhbU1hbmFnZXIoKS5iYWNrdXBEaWFncmFtKGFjdGl2aXR5LCBnZXREaWFncmFtKCkpOwotCQl9Ci0JCWluaXRpYWxpemVUaXRsZShpbnB1dCk7Ci0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZXMgdGhlIGVkaXRvcidzIHRpdGxlIGJhc2VkIG9uIHRoZSBnaXZlbiBlZGl0b3IgaW5wdXQuCi0JICoKLQkgKiBAcGFyYW0gaW5wdXQgdGhlIGVkaXRvciBpbnB1dCB0byBiZSB1c2VkCi0JICogQGN1c3RvbQotCSAqLwotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplVGl0bGUoSUVkaXRvcklucHV0IGlucHV0KSB7Ci0KLQkJU3RyaW5nIHRpdGxlID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKGlucHV0ICE9IG51bGwpIHsKLQkJCURpYWdyYW1GaWxlRWRpdG9ySW5wdXRQcm94eSBmaWxlSW5wdXQgPSAoRGlhZ3JhbUZpbGVFZGl0b3JJbnB1dFByb3h5KSBpbnB1dDsKLQkJCURpYWdyYW1FZGl0b3JJbnB1dCBkaWFncmFtSW5wdXQgPSBmaWxlSW5wdXQuZ2V0RGlhZ3JhbUVkaXRvcklucHV0KCk7Ci0JCQlNZXRob2RFbGVtZW50IGlucHV0RWxlbWVudCA9IGRpYWdyYW1JbnB1dC5nZXRNZXRob2RFbGVtZW50KCk7Ci0JCQlpZiAoaW5wdXRFbGVtZW50ICE9IG51bGwpIHsKLQkJCQkvL3RpdGxlID0gaW5wdXRFbGVtZW50LmdldE5hbWUoKTsKLQkJCQl0aXRsZSA9IGdldFBhcnROYW1lUHJlZml4KCkgKyAKLQkJCQkJCQlpbnB1dEVsZW1lbnQuZ2V0TmFtZSgpKwotCQkJCQkJCVN0cmluZ1N0YXRpY3MuQ09NTUEgKyBTdHJpbmdTdGF0aWNzLlNQQUNFICsgCi0JCQkJCQkJZGlhZ3JhbUlucHV0LmdldFN1cHByZXNzaW9uKCkuZ2V0UHJvY2VzcygpLmdldE5hbWUoKTsgCi0vLwkJCQlJTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyID0gbmV3IEFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcigKLS8vCQkJCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLS8vCQkJCQkJCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpOwotCQkJCUltYWdlIHRpdGxlSW1hZ2UgPSBnZXRQYXJ0SW1hZ2UoKTsJCQkJCi0JCQkJc2V0VGl0bGVJbWFnZSh0aXRsZUltYWdlKTsKLQkJCX0KLQkJfQotCQlzZXRQYXJ0TmFtZSh0aXRsZSk7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZShQUk9QX0RJUlRZKTsKLQl9Ci0KLQkvKioKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlc291cmNlcy5lZGl0b3IucGFydHMuRGlhZ3JhbURvY3VtZW50RWRpdG9yI3Nhbml0eUNoZWNrU3RhdGUob3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0KQotCSAqIEBjdXN0b20KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzYW5pdHlDaGVja1N0YXRlKElFZGl0b3JJbnB1dCBpbnB1dCkgewotCQlJRG9jdW1lbnRQcm92aWRlciBwID0gZ2V0RG9jdW1lbnRQcm92aWRlcigpOwotCQlpZiAocCA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCWxvbmcgc3RhbXAgPSBwLmdldE1vZGlmaWNhdGlvblN0YW1wKGlucHV0KTsKLQkJaWYgKHN0YW1wICE9IGZNb2RpZmljYXRpb25TdGFtcCkgewotCQkJZk1vZGlmaWNhdGlvblN0YW1wID0gc3RhbXA7Ci0JCQlpZiAoIXAuaXNTeW5jaHJvbml6ZWQoaW5wdXQpKSB7Ci0JCQkJaGFuZGxlRWRpdG9ySW5wdXRDaGFuZ2VkKCk7Ci0JCQkJaWYoIXAuaXNTeW5jaHJvbml6ZWQoaW5wdXQpICYmIHAgaW5zdGFuY2VvZiBTaGFyZWRSZXNvdXJjZURpYWdyYW1Eb2N1bWVudFByb3ZpZGVyKSB7Ci0JCQkJCSgoU2hhcmVkUmVzb3VyY2VEaWFncmFtRG9jdW1lbnRQcm92aWRlcilwKS5hbGxvd0VkaXRpbmcoaW5wdXQpOwotCQkJCX0KLQkJCX0KLQkJfQotCQl1cGRhdGVTdGF0ZShnZXRFZGl0b3JJbnB1dCgpKTsKLQl9Ci0JCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlc291cmNlcy5lZGl0b3IucGFydHMuRGlhZ3JhbURvY3VtZW50RWRpdG9yI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCURpYWdyYW0gZGlhZ3JhbSA9IGdldERpYWdyYW0oKTsKLQkJCi0JCS8vIGlmIGNoYW5nZXMgZGlzY2FyZGVkLCByZXZlcnNlIHRvIHNhdmVkCi0JCS8vCQkKLQkJaWYoaXNEaXJ0eSgpKSB7Ci0JCQlyZXZlcnNlVG9TYXZlZCgpOwotCQl9CQkKLQkJCi0JCWlmKHRpdGxlQWRhcHRlciAhPSBudWxsKXsKLQkJCU1ldGhvZEVsZW1lbnQgZSA9IGdldE1ldGhvZEVsZW1lbnQoZ2V0RWRpdG9ySW5wdXQoKSk7Ci0JCQlpZihlICE9IG51bGwpewotCQkJCWUuZUFkYXB0ZXJzKCkucmVtb3ZlKHRpdGxlQWRhcHRlcik7Ci0JCQl9Ci0JCQl0aXRsZUFkYXB0ZXIgPSBudWxsOwotCQl9Ci0JCQotCQlpZihkaWFncmFtTWdyICE9IG51bGwpIHsKLQkJCWlmKGFjdGl2aXR5ICE9IG51bGwgJiYgZGlhZ3JhbSAhPSBudWxsKSB7Ci0JCQkJZGlhZ3JhbU1nci5yZW1vdmVEaWFncmFtQmFja3VwKGFjdGl2aXR5LCBkaWFncmFtLmdldFR5cGUoKSk7Ci0JCQl9Ci0JCQlkaWFncmFtTWdyLnJlbW92ZVJlc291cmNlQ2hhbmdlTGlzdGVuZXIocmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcik7Ci0JCQlkaWFncmFtTWdyLnJlbW92ZUNvbnN1bWVyKHRoaXMpOwotCQl9CQkKLQkJCi0JCWlmKGRpYWdyYW1TdmMgIT0gbnVsbCkgewotCQkJZGlhZ3JhbVN2Yy5kaXNwb3NlKCk7Ci0JCX0KLQkJCQkKLQkJSUxpYnJhcnlNYW5hZ2VyIG1hbmFnZXIgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRMaWJyYXJ5TWFuYWdlcigpOwotCQlpZiAobWFuYWdlciAhPSBudWxsKSB7Ci0JCQltYW5hZ2VyLnJlbW92ZUxpc3RlbmVyKGxpYnJhcnlMaXN0ZW5lcik7Ci0JCX0KLQkJTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5yZW1vdmVMaXN0ZW5lcihsaWJTdmNMaXN0ZW5lcik7Ci0JCQotCQkvLyBSZW1vdmUgdGhlIGFkYXB0ZXIgZnJvbSB0aGUgdW1sIGFjdGl2aXR5IGlmIGVkaXRvciBpcyBjbG9zZWQuCi0JCWlmKGdldERpYWdyYW0oKS5nZXRFbGVtZW50KCkgaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eSl7Ci0JCQlvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eSBhY3QgPSAob3JnLmVjbGlwc2UudW1sMi51bWwuQWN0aXZpdHkpZ2V0RGlhZ3JhbSgpLmdldEVsZW1lbnQoKTsKLQkJCWlmKGFjdCAhPSBudWxsICYmIGdldERpYWdyYW1BZGFwdGVyKCkgIT0gbnVsbCl7Ci0JCQkJYWN0LmVBZGFwdGVycygpLnJlbW92ZShnZXREaWFncmFtQWRhcHRlcigpKTsKLQkJCX0KLQkJfQotCQkKLQkJLy8gZGlzcG9zZSB0aGUgaW5wdXQKLQkJLy8KLQkJSUVkaXRvcklucHV0IGlucHV0ID0gZ2V0RWRpdG9ySW5wdXQoKTsKLQkJaWYoaW5wdXQgaW5zdGFuY2VvZiBJRGlzcG9zYWJsZSkgewotCQkJKChJRGlzcG9zYWJsZSlpbnB1dCkuZGlzcG9zZSgpOwotCQl9Ci0JCQotCQlEaWFncmFtRWRpdFBhcnQgZWRpdFBhcnQgPSBnZXREaWFncmFtRWRpdFBhcnQoKTsKLQkJaWYoZWRpdFBhcnQgIT0gbnVsbCkgewotCQkJZWRpdFBhcnQuc2V0TW9kZWwobnVsbCk7Ci0JCX0KLQotCQlzdXBlci5kaXNwb3NlKCk7Ci0JCi0JfQotCi0JcHJpdmF0ZSBEaWFncmFtQWRhcHRlciBnZXREaWFncmFtQWRhcHRlcigpIHsKLQkJVmlldyB2aWV3ID0gKChWaWV3KSBnZXREaWFncmFtRWRpdFBhcnQoKS5nZXRNb2RlbCgpKTsKLQkJcmV0dXJuIHZpZXcgIT0gbnVsbCA/IChEaWFncmFtQWRhcHRlcikgQnJpZGdlSGVscGVyCi0JCQkJLmdldE5vZGVBZGFwdGVyKHZpZXcuZ2V0RWxlbWVudCgpKSA6IG51bGw7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHJldmVyc2VUb1NhdmVkKCkgewotCQl0cnkgewotCQkJSURvY3VtZW50UHJvdmlkZXIgcCA9IGdldERvY3VtZW50UHJvdmlkZXIoKTsKLQkJCWlmKHAgaW5zdGFuY2VvZiBTaGFyZWRSZXNvdXJjZURpYWdyYW1Eb2N1bWVudFByb3ZpZGVyKSB7Ci0JCQkJKChTaGFyZWRSZXNvdXJjZURpYWdyYW1Eb2N1bWVudFByb3ZpZGVyKXApLnJldmVyc2VUb1NhdmVkKGdldEVkaXRvcklucHV0KCkpOwotCQkJfQotCQkJCi0JCQlEaWFncmFtQWRhcHRlciBhZGFwdGVyID0gZ2V0RGlhZ3JhbUFkYXB0ZXIoKTsKLQkJCWlmKGFkYXB0ZXIgPT0gbnVsbCkgewotCQkJCS8vVE9ETzogcmV2ZXJzZSB0byBzYXZlZCBmb3IgQUREIGFuZCBXUERECi0JCQkJcmV0dXJuOwotCQkJfQotCQkJSUFjdGlvbk1hbmFnZXIgYWN0aW9uTWdyID0gYWRhcHRlci5nZXRBY3Rpb25NYW5hZ2VyKCk7Ci0JCQlib29sZWFuIGRpcnR5ID0gYWN0aW9uTWdyLmlzU2F2ZU5lZWRlZCgpOwotCQkJaWYgKGRpcnR5KSB7Ci0JCQkJYWN0aW9uTWdyLnVuZG9BbGwoKTsKLS8vCQkJCWdldE9wZXJhdGlvbkhpc3RvcnkoKS51bmRvKGdldFVuZG9Db250ZXh0KCksIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCksIG51bGwpOwotLy8JCQkJZ2V0T3BlcmF0aW9uSGlzdG9yeSgpLmRpc3Bvc2UoZ2V0VW5kb0NvbnRleHQoKSwgdHJ1ZSwgdHJ1ZSwgdHJ1ZSk7Ci0JCQl9Ci0JCQlnZXRBY3Rpb25NYW5hZ2VyKCkuY2xlYXIoKTsKLQotCQkJLy8gc2F2ZSB0aGUgdW5kb25lIGNoYW5nZXMgb25seSBpZiB0aGUgcmVzb3VyY2UgaGFzIGJlZW4gY2hhbmdlZCBvdXRzaWRlIHRoaXMgZWRpdG9yCi0JCQkvLwotCQkJYm9vbGVhbiBzYXZlTmVlZGVkID0gZGlydHkKLQkJCSYmIGdldExhc3RNb2RpZmllZCgpID4gYWRhcHRlci5nZXRVbWFMYXN0TW9kaWZpZWQoKTsKLQkJCU1ldGhvZEVsZW1lbnQgbWU7Ci0JCQlpZiAoc2F2ZU5lZWRlZCAmJiAobWUgPSBnZXRNZXRob2RFbGVtZW50RnJvbUlucHV0KCkpICE9IG51bGwpIHsKLQkJCQlJTGlicmFyeVBlcnNpc3Rlci5GYWlsU2FmZU1ldGhvZExpYnJhcnlQZXJzaXN0ZXIgcGVyc2lzdGVyID0gTGlicmFyeVNlcnZpY2VVdGlsCi0JCQkJLmdldEN1cnJlbnRQZXJzaXN0ZXIoKS5nZXRGYWlsU2FmZVBlcnNpc3RlcigpOwotCQkJCXRyeSB7Ci0JCQkJCXBlcnNpc3Rlci5zYXZlKG1lLmVSZXNvdXJjZSgpKTsKLQkJCQkJcGVyc2lzdGVyLmNvbW1pdCgpOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCUNvbW1vblBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlwZXJzaXN0ZXIucm9sbGJhY2soKTsKLQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCQkvL1RPRE86IHJlbG9hZCBsaWJyYXJ5IG5lZWRlZAotCQkJCQkJLy8JCQkJCVZpZXdIZWxwZXIucmVsb2FkQ3VycmVudExpYnJhcnkoZ2V0U2l0ZSgpLmdldFNoZWxsKCksIG51bGwpOwotCQkJCQkJZXgucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJY2F0Y2goRXhjZXB0aW9uIGUpIHsKLQkJCUNvbW1vblBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBQcm9jZXNzIGdldFByb2Nlc3MoKSB7Ci0JCU9iamVjdCBpbnB1dCA9IGdldEVkaXRvcklucHV0KCk7Ci0JCWlmIChpbnB1dCBpbnN0YW5jZW9mIElEaWFncmFtRmlsZUVkaXRvcklucHV0UHJveHkpIHsKLQkJCXJldHVybiAoKElEaWFncmFtRmlsZUVkaXRvcklucHV0UHJveHkpIGlucHV0KQotCQkJCQkuZ2V0RGlhZ3JhbUVkaXRvcklucHV0KCkuZ2V0U3VwcHJlc3Npb24oKS5nZXRQcm9jZXNzKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXByb3RlY3RlZCBNZXRob2RFbGVtZW50IGdldE1ldGhvZEVsZW1lbnRGcm9tSW5wdXQoKSB7Ci0JCXJldHVybiBnZXRNZXRob2RFbGVtZW50KGdldEVkaXRvcklucHV0KCkpOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBNZXRob2RFbGVtZW50IGdldE1ldGhvZEVsZW1lbnQoSUVkaXRvcklucHV0IGlucHV0KSB7Ci0JCWlmIChpbnB1dCBpbnN0YW5jZW9mIERpYWdyYW1GaWxlRWRpdG9ySW5wdXRQcm94eSkgewotCQkJcmV0dXJuICgoRGlhZ3JhbUZpbGVFZGl0b3JJbnB1dFByb3h5KSBpbnB1dCkKLQkJCQkJLmdldERpYWdyYW1FZGl0b3JJbnB1dCgpLmdldE1ldGhvZEVsZW1lbnQoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIGxvbmcgZ2V0TGFzdE1vZGlmaWVkKCkgewotCQlSZXNvdXJjZSByZXNvdXJjZSA9IGdldE1ldGhvZEVsZW1lbnRGcm9tSW5wdXQoKS5lUmVzb3VyY2UoKTsKLQkJaWYgKHJlc291cmNlICE9IG51bGwgJiYgcmVzb3VyY2UuZ2V0VVJJKCkuaXNGaWxlKCkpIHsKLQkJCUZpbGUgZmlsZSA9IG5ldyBGaWxlKHJlc291cmNlLmdldFVSSSgpLnRvRmlsZVN0cmluZygpKTsKLQkJCXJldHVybiBmaWxlLmxhc3RNb2RpZmllZCgpOwotCQl9Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkb1NhdmUoSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzc01vbml0b3IpIHsKLQkJRGlhZ3JhbUFkYXB0ZXIgZGlhZ3JhbUFkYXB0ZXIgPSBnZXREaWFncmFtQWRhcHRlcigpOwotCQlpZihkaWFncmFtQWRhcHRlciAhPSBudWxsKSB7Ci0JCQlJQWN0aW9uTWFuYWdlciBhY3Rpb25NZ3IgPSBnZXREaWFncmFtQWRhcHRlcigpLmdldEFjdGlvbk1hbmFnZXIoKTsKLQkJCWlmIChhY3Rpb25NZ3IgIT0gbnVsbCAmJiBhY3Rpb25NZ3IuaXNTYXZlTmVlZGVkKCkpIHsKLQkJCQl0cnkgewotCQkJCQlwcm9ncmVzc01vbml0b3IuYmVnaW5UYXNrKCJTYXZpbmciLCBJUHJvZ3Jlc3NNb25pdG9yLlVOS05PV04pOyAvLyROT04tTkxTLTEkCi0JCQkJCUlMaWJyYXJ5UGVyc2lzdGVyLkZhaWxTYWZlTWV0aG9kTGlicmFyeVBlcnNpc3RlciBwZXJzaXN0ZXIgPSBMaWJyYXJ5U2VydmljZVV0aWwKLQkJCQkJLmdldEN1cnJlbnRQZXJzaXN0ZXIoKS5nZXRGYWlsU2FmZVBlcnNpc3RlcigpOwotCQkJCQlDb2xsZWN0aW9uPD8+IG1vZGlmaWVkUmVzb3VyY2VzID0gYWN0aW9uTWdyLmdldE1vZGlmaWVkUmVzb3VyY2VzKCk7CQkJCQkKLQkJCQkJLy8gY2hlY2sgZm9yIG1vZGlmaWFibGUKLQkJCQkJLy8KLQkJCQkJSVN0YXR1cyBzdGF0dXMgPSBTZXJ2aWNlcy5nZXRBY2Nlc3NDb250cm9sbGVyKCkuY2hlY2tNb2RpZnkobW9kaWZpZWRSZXNvdXJjZXMudG9BcnJheShuZXcgUmVzb3VyY2VbMF0pLCBnZXRTaXRlKCkuZ2V0U2hlbGwoKSk7Ci0JCQkJCWlmKCFzdGF0dXMuaXNPSygpKSB7Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCX0KLQkJCQkJdHJ5IHsKLQkJCQkJCWZvciAoSXRlcmF0b3I8Pz4gaXRlciA9IG1vZGlmaWVkUmVzb3VyY2VzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQkJCVJlc291cmNlIHJlc291cmNlID0gKFJlc291cmNlKSBpdGVyLm5leHQoKTsKLQkJCQkJCQlwcm9ncmVzc01vbml0b3Iuc2V0VGFza05hbWUoTkxTLmJpbmQoRGlhZ3JhbUNvcmVSZXNvdXJjZXMuUHJvZ3Jlc3NfU2F2aW5nX21lc3NhZ2UsCi0JCQkJCQkJCQlyZXNvdXJjZS5nZXRVUkkoKS5pc0ZpbGUoKSA/IHJlc291cmNlLmdldFVSSSgpCi0JCQkJCQkJCQkJCS50b0ZpbGVTdHJpbmcoKSA6ICIiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQlwZXJzaXN0ZXIuc2F2ZShyZXNvdXJjZSk7Ci0JCQkJCQl9Ci0JCQkJCQlwZXJzaXN0ZXIuY29tbWl0KCk7Ci0JCQkJCQlhY3Rpb25NZ3Iuc2F2ZUlzRG9uZSgpOwotCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJQ29tbW9uUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJcGVyc2lzdGVyLnJvbGxiYWNrKCk7Ci0JCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCQkJCQlDb21tb25QbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGV4KTsKLQkJCQkJCQkvLwkJCQkJCVZpZXdIZWxwZXIKLQkJCQkJCQkvLwkJCQkJCS5yZWxvYWRDdXJyZW50TGliYXJ5T25Sb2xsYmFja0Vycm9yKGdldFNpdGUoKQotCQkJCQkJCS8vCQkJCQkJLmdldFNoZWxsKCkpOwotCQkJCQkJCXJldHVybjsKLQkJCQkJCX0KLQkJCQkJCQotCQkJCQkJLyoKLQkJCQkJCSAqIE5PIFVJIG1vZHVsZSBzaG91bGQgbm90IGludm9sdmUgd2l0aCBVSSBjbGFzc2VzCi0JCQkJCQkgKiB1c2UgY2FsbGJhY2sgdG8gaGFuZGxlIHN1Y2gga2luZCBvZiBzaXR1YXRpb24KLQkJCQkJCSAqIEppbmh1YSBYaSwgMDEvMTMvMDgKLQkJCQkJCSovCi0vLwkJCQkJCUNvbW1vblBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkuZGlzcGxheVdhcm5pbmcoCi0vLwkJCQkJCQkJZ2V0U2l0ZSgpLmdldFNoZWxsKCkuZ2V0VGV4dCgpLAotLy8JCQkJCQkJCURpYWdyYW1Db3JlUmVzb3VyY2VzLldhcm5pbmdfU2F2aW5nX0RpYWdyYW0sIGUuZ2V0TWVzc2FnZSgpLAotLy8JCQkJCQkJCWUpOwotCQkJCQkJQ29tbW9uUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dDYWxsYmFjaygpLmRpc3BsYXlXYXJuaW5nKAotCQkJCQkJCQlDb21tb25QbHVnaW4uZ2V0RGVmYXVsdCgpLCAKLQkJCQkJCQkJRGlhZ3JhbUNvcmVSZXNvdXJjZXMuV2FybmluZ19TYXZpbmdfRGlhZ3JhbSwgZS5nZXRNZXNzYWdlKCksCi0JCQkJCQkJCWUpOwotCQkJCQkKLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCi0JCQkJfSBmaW5hbGx5IHsKLQkJCQkJcHJvZ3Jlc3NNb25pdG9yLmRvbmUoKTsKLQkJCQl9Ci0KLQkJCX0KLQkJfQotCi0JCXN1cGVyLmRvU2F2ZShwcm9ncmVzc01vbml0b3IpOwotCX0KLQkKLQlwcml2YXRlIGNsYXNzIERpYWdyYW1HcmFwaGljYWxWaWV3ZXJFeCBleHRlbmRzIERpYWdyYW1HcmFwaGljYWxWaWV3ZXIgaW1wbGVtZW50cyBJRGlhZ3JhbUVkaXRvcklucHV0UHJvdmlkZXIgewotCi0JCXB1YmxpYyBEaWFncmFtRWRpdG9ySW5wdXQgZ2V0RGlhZ3JhbUVkaXRvcklucHV0KCkgewotCQkJcmV0dXJuICgoSURpYWdyYW1GaWxlRWRpdG9ySW5wdXRQcm94eSlnZXRFZGl0b3JJbnB1dCgpKS5nZXREaWFncmFtRWRpdG9ySW5wdXQoKTsKLQkJfQotCi0JCXB1YmxpYyBJRWRpdG9yUGFydCBnZXRFZGl0b3IoKSB7Ci0JCQlyZXR1cm4gQWJzdHJhY3REaWFncmFtRWRpdG9yLnRoaXM7Ci0JCX0JCQkJCi0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTY3JvbGxpbmdHcmFwaGljYWxWaWV3ZXIgY3JlYXRlU2Nyb2xsaW5nR3JhcGhpY2FsVmlld2VyKCkgewotCQlyZXR1cm4gbmV3IERpYWdyYW1HcmFwaGljYWxWaWV3ZXJFeCgpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVHcmFwaGljYWxWaWV3ZXIoKSB7Ci0JCXN1cGVyLmNvbmZpZ3VyZUdyYXBoaWNhbFZpZXdlcigpOwotCQkKLQkJY3VycmVudENvbmZpZyA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudE1ldGhvZENvbmZpZ3VyYXRpb24oKTsKLQkJCi0JCS8vIGxpc3RlbiB0byBjaGFuZ2UgZm9yIGN1cnJlbnQgc2VsZWN0aW9uIG9mIE1ldGhvZENvbmZpZ3VyYXRpb24gb3IgY2hhbmdlcyBpbiAKLQkJLy8gY3VycmVudCBjb25maWd1cmF0aW9uLgotCQkvLwotCQlMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmFkZExpc3RlbmVyKGxpYlN2Y0xpc3RlbmVyKTsKLQkJSUxpYnJhcnlNYW5hZ2VyIG1hbmFnZXIgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRMaWJyYXJ5TWFuYWdlcigpOwotCQlpZiAobWFuYWdlciAhPSBudWxsKSB7Ci0JCQltYW5hZ2VyLmFkZExpc3RlbmVyKGxpYnJhcnlMaXN0ZW5lcik7Ci0JCX0KLQkJZ2V0R3JhcGhpY2FsQ29udHJvbCgpLmFkZExpc3RlbmVyKFNXVC5Nb3VzZURvdWJsZUNsaWNrLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJCWhhbmRsZURvdWJsZUNsaWNrKGV2ZW50KTsKLQkJCX0KLQkJfSk7Ci0JCUlEaWFncmFtR3JhcGhpY2FsVmlld2VyIHZpZXdlciA9ICBnZXREaWFncmFtR3JhcGhpY2FsVmlld2VyKCk7Ci0gICAgICAgIENvbnRleHRNZW51UHJvdmlkZXIgcHJvdmlkZXIgPSBuZXcgRGlhZ3JhbUNvbnRleHRNZW51UHJvdmlkZXIodGhpcywKLSAgICAgICAgICAgICAgICBnZXREaWFncmFtR3JhcGhpY2FsVmlld2VyKCkpOwotICAgICAgICAgICAgdmlld2VyLnNldENvbnRleHRNZW51KHByb3ZpZGVyKTsKLSAgICAgICAgICAgIGdldFNpdGUoKS5yZWdpc3RlckNvbnRleHRNZW51KEFjdGlvbklkcy5ESUFHUkFNX0VESVRPUl9DT05URVhUX01FTlUsCi0gICAgICAgICAgICAgICAgcHJvdmlkZXIsIHZpZXdlcik7Ci0JCWlmKGFjdGlvblNlcnZpY2UgIT0gbnVsbCl7Ci0JCQlhY3Rpb25TZXJ2aWNlLnNldEdyYXBoaWNhbFZpZXdlcih2aWV3ZXIpOwotCQl9Ci0JCQotCQl0aXRsZUFkYXB0ZXIgPSBuZXcgQWRhcHRlckltcGwoKXsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbXNnKSB7Ci0JCQkJc3dpdGNoIChtc2cuZ2V0RmVhdHVyZUlEKE1ldGhvZEVsZW1lbnQuY2xhc3MpKSB7Ci0JCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19OQU1FOgotLy8JCQkJCXNldE5hbWUobXNnLmdldE5ld1N0cmluZ1ZhbHVlKCkpOwotCQkJCQlpbml0aWFsaXplVGl0bGUoZ2V0RWRpdG9ySW5wdXQoKSk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfTsKLQkJTWV0aG9kRWxlbWVudCBlID0gZ2V0TWV0aG9kRWxlbWVudChnZXRFZGl0b3JJbnB1dCgpKTsKLQkJaWYoZSAhPSBudWxsICYmIHRpdGxlQWRhcHRlciAhPSBudWxsKXsKLQkJCWUuZUFkYXB0ZXJzKCkuYWRkKHRpdGxlQWRhcHRlcik7Ci0JCX0KLQl9Ci0JCQotCXByaXZhdGUgdm9pZCBjb25maWdDaGFuZ2VkKCkgewotCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudE1ldGhvZENvbmZpZ3VyYXRpb24oKTsKLQkJaWYoY3VycmVudENvbmZpZyAhPSBjb25maWcpIHsKLQkJCS8vIHJlZnJlc2ggb25seSBpZiB0aGUgYWN0aXZlIHBhcnQgaXMgdGhpcyBkaWFncmFtIGVkaXRvciBvciBwcm9jZXNzIGVkaXRvciBvZiB0aGUgcHJvY2VzcwotCQkJLy8gdGhhdCBvd25zIHRoaXMgZGlhZ3JhbQotCQkJLy8KLQkJCUlXb3JrYmVuY2hQYXJ0IGFjdGl2ZVBhcnQgPSBnZXRTaXRlKCkuZ2V0V29ya2JlbmNoV2luZG93KCkuZ2V0UGFydFNlcnZpY2UoKS5nZXRBY3RpdmVQYXJ0KCk7Ci0JCQlib29sZWFuIHJlZnJlc2ggPSBhY3RpdmVQYXJ0ID09IHRoaXM7Ci0JCQlpZighcmVmcmVzaCkgewotCQkJCWlmKGFjdGl2ZVBhcnQgaW5zdGFuY2VvZiBJRWRpdG9yUGFydCkgewotCQkJCQlJRWRpdG9ySW5wdXQgaW5wdXQgPSAoKElFZGl0b3JQYXJ0KWFjdGl2ZVBhcnQpLmdldEVkaXRvcklucHV0KCk7Ci0JCQkJCWlmKGlucHV0IGluc3RhbmNlb2YgSU1ldGhvZEVsZW1lbnRQcm92aWRlcikgewotCQkJCQkJT2JqZWN0IGUgPSAoKElNZXRob2RFbGVtZW50UHJvdmlkZXIpaW5wdXQpLmdldE1ldGhvZEVsZW1lbnQoKTsKLQkJCQkJCWlmKGUgaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50KSB7Ci0JCQkJCQkJcmVmcmVzaCA9IGUgaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50ICYmIAotCQkJCQkJCWdldFByb2Nlc3MoKSA9PSAoKFByb2Nlc3NDb21wb25lbnQpZSkuZ2V0UHJvY2VzcygpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJaWYocmVmcmVzaCkgewotCQkJCWN1cnJlbnRDb25maWcgPSBjb25maWc7Ci0JCQkJcmVmcmVzaCgpOwotCQkJCW5lZWRSZWZyZXNoID0gZmFsc2U7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQluZWVkUmVmcmVzaCA9IHRydWU7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVmcmVzaCgpIHsKLQkJaWYoZ2V0RG9jdW1lbnRQcm92aWRlcigpIGluc3RhbmNlb2YgU2hhcmVkUmVzb3VyY2VEaWFncmFtRG9jdW1lbnRQcm92aWRlcil7Ci0JCQlTaGFyZWRSZXNvdXJjZURpYWdyYW1Eb2N1bWVudFByb3ZpZGVyIGRvY1Byb3ZpZGVyID0gKChTaGFyZWRSZXNvdXJjZURpYWdyYW1Eb2N1bWVudFByb3ZpZGVyKWdldERvY3VtZW50UHJvdmlkZXIoKSk7Ci0JCQlEaWFncmFtRWRpdFBhcnQgZWRpdFBhcnQgPSBnZXREaWFncmFtRWRpdFBhcnQoKTsKLQkJCWJvb2xlYW4gd2FzRGlydHkgPSBpc0RpcnR5KCk7Ci0JCQlib29sZWFuIHdhc0Jhc2VEaXJ0eSA9IGZhbHNlOwotCQkJSUVkaXRvclBhcnQgYmFzZUVkaXRvciA9IG51bGw7Ci0JCQlmaW5hbCBib29sZWFuIGlzSW5oZXJpdGVkID0gRGlhZ3JhbUVkaXRvclV0aWwuaXNJbmhlcml0ZWQoZWRpdFBhcnQpOwotCQkJaWYoaXNJbmhlcml0ZWQpIHsKLQkJCQlNZXRob2RFbGVtZW50IGVsZW1lbnQgPSBCcmlkZ2VIZWxwZXIuZ2V0TWV0aG9kRWxlbWVudChlZGl0UGFydC5nZXREaWFncmFtVmlldygpKTsKLQkJCQlTdHJpbmcgdHlwZSA9IGVkaXRQYXJ0LmdldERpYWdyYW1WaWV3KCkuZ2V0VHlwZSgpOwotCQkJCQotCQkJCS8vIHRyeSB0byBmaW5kIHRoZSBkaXJ0eSBmbGFnIG9mIGJhc2UgZGlhZ3JhbSBlZGl0b3IKLQkJCQkvLwotCQkJCUlFZGl0b3JSZWZlcmVuY2VbXSBlZGl0b3JSZWZzID0gZ2V0U2l0ZSgpLmdldFBhZ2UoKS5nZXRFZGl0b3JSZWZlcmVuY2VzKCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlZGl0b3JSZWZzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCUlFZGl0b3JSZWZlcmVuY2UgcmVmID0gZWRpdG9yUmVmc1tpXTsKLQkJCQkJdHJ5IHsKLQkJCQkJCWlmKHJlZi5nZXRFZGl0b3JJbnB1dCgpIGluc3RhbmNlb2YgSURpYWdyYW1GaWxlRWRpdG9ySW5wdXRQcm94eSkgewotCQkJCQkJCURpYWdyYW1FZGl0b3JJbnB1dCBpbnB1dCA9ICgoSURpYWdyYW1GaWxlRWRpdG9ySW5wdXRQcm94eSlyZWYuZ2V0RWRpdG9ySW5wdXQoKSkuZ2V0RGlhZ3JhbUVkaXRvcklucHV0KCk7Ci0JCQkJCQkJaWYoaW5wdXQuZ2V0V3JhcHBlcigpID09IG51bGwgJiYgaW5wdXQuZ2V0TWV0aG9kRWxlbWVudCgpID09IGVsZW1lbnQgJiYKLQkJCQkJCQkJCURpYWdyYW1NYW5hZ2VyLmdldERpYWdyYW1UeXBlKHR5cGUpID09IGlucHV0LmdldERpYWdyYW1UeXBlKCkpIHsKLQkJCQkJCQkJSUVkaXRvclBhcnQgZWRpdG9yID0gcmVmLmdldEVkaXRvcihmYWxzZSk7Ci0JCQkJCQkJCWlmKGVkaXRvciAhPSBudWxsKSB7Ci0JCQkJCQkJCQl3YXNCYXNlRGlydHkgPSBlZGl0b3IuaXNEaXJ0eSgpOwotCQkJCQkJCQkJYmFzZUVkaXRvciA9IGVkaXRvcjsKLQkJCQkJCQkJCWJyZWFrOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9IGNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlEaWFncmFtQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCWRvY1Byb3ZpZGVyLnNldENvbnRlbnQoZ2V0RWRpdG9ySW5wdXQoKSk7Ci0JCQlpZih3YXNEaXJ0eSkgewotCQkJCWRvY1Byb3ZpZGVyLnNldENhblNhdmVEb2N1bWVudChnZXRFZGl0b3JJbnB1dCgpKTsKLQkJCX0KLQkJCS8vIGVkaXRvcnMgY2FuIGJlY29tZSBkaXJ0eSBhZnRlciByZWZyZXNoCi0JCQkvLyBjbGVhciBkaXJ0eSBmbGFnCi0JCQkvLwotCQkJZWxzZSBpZihpc0RpcnR5KCkpIHsKLQkJCQkoKFNoYXJlZFJlc291cmNlRGlhZ3JhbURvY3VtZW50UHJvdmlkZXIpIGdldERvY3VtZW50UHJvdmlkZXIoKSkKLQkJCQkJCS5tYXJrRG9jdW1lbnRBc1NhdmVkKChJRmlsZUVkaXRvcklucHV0KWdldEVkaXRvcklucHV0KCkpOwotCQkJfQotCQkJaWYoYmFzZUVkaXRvciAhPSBudWxsICYmICF3YXNCYXNlRGlydHkpIHsKLQkJCQkoKFNoYXJlZFJlc291cmNlRGlhZ3JhbURvY3VtZW50UHJvdmlkZXIpKChEaWFncmFtRG9jdW1lbnRFZGl0b3IpYmFzZUVkaXRvcikuZ2V0RG9jdW1lbnRQcm92aWRlcigpKQotCQkJCQkubWFya0RvY3VtZW50QXNTYXZlZCgoSUZpbGVFZGl0b3JJbnB1dCkgYmFzZUVkaXRvci5nZXRFZGl0b3JJbnB1dCgpKTsKLQkJCX0KLQkJCXVwZGF0ZVN0YXRlKGdldEVkaXRvcklucHV0KCkpOwotCQl9Ci0JfQotCQotCS8vIERvZXMgbm90aGluZyBidXQgZm9yIG92ZXJyaWRlLiAKLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVEb3VibGVDbGljayhFdmVudCBldmVudCkgewotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBpc0RpcnR5KCkgewotCQlpZighRGlhZ3JhbUVkaXRvclV0aWwuaXNNb2RpZmlhYmxlKGdldEVkaXRvcklucHV0KCkpKXsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuaXNEaXJ0eSgpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBpc0VkaXRhYmxlKCkgewotCQlpZihnZXREb2N1bWVudFByb3ZpZGVyKCkgaW5zdGFuY2VvZiBTaGFyZWRSZXNvdXJjZURpYWdyYW1Eb2N1bWVudFByb3ZpZGVyKXsKLQkJCXJldHVybiAhKChTaGFyZWRSZXNvdXJjZURpYWdyYW1Eb2N1bWVudFByb3ZpZGVyKWdldERvY3VtZW50UHJvdmlkZXIoKSkuZ2V0TG9ja2VkU3RhdGUoKTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEtleUhhbmRsZXIgZ2V0S2V5SGFuZGxlcigpIHsKLQkJS2V5SGFuZGxlciBrZXlIYW5kbGVyID0gIHN1cGVyLmdldEtleUhhbmRsZXIoKTsKLQkJaWYoa2V5SGFuZGxlciAhPSBudWxsKXsKLQkJCUFjdGlvblJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gZ2V0QWN0aW9uUmVnaXN0cnkoKTsKLQkJCUlBY3Rpb24gYWN0aW9uID0gcmVnaXN0cnkuZ2V0QWN0aW9uKEFjdGlvbkZhY3RvcnkuREVMRVRFLmdldElkKCkpOwotCQkJCi0JCQlpZihhY3Rpb24gIT0gbnVsbCAmJiAhKGFjdGlvbiBpbnN0YW5jZW9mIERlbGVnYXRlQWN0aW9uKSl7Ci0JCQkJZ2V0QWN0aW9uUmVnaXN0cnkoKS5yZW1vdmVBY3Rpb24oYWN0aW9uKTsKLQkJCQlnZXRTZWxlY3Rpb25BY3Rpb25zKCkucmVtb3ZlKGFjdGlvbik7Ci0JCQkJYWN0aW9uID0gbmV3IERlbGVnYXRlQWN0aW9uKChJV29ya2JlbmNoUGFydCl0aGlzLEFjdGlvbkZhY3RvcnkuREVMRVRFLmdldElkKCkpOwotCQkJCWFjdGlvbi5zZXRJZChBY3Rpb25GYWN0b3J5LkRFTEVURS5nZXRJZCgpKTsKLQkJCQlnZXRBY3Rpb25SZWdpc3RyeSgpLnJlZ2lzdGVyQWN0aW9uKGFjdGlvbik7Ci0JCQkJZ2V0U2VsZWN0aW9uQWN0aW9ucygpLmFkZChhY3Rpb24uZ2V0SWQoKSk7Ci0JCQl9Ci0gICAgICAgICAgICBrZXlIYW5kbGVyLnB1dChLZXlTdHJva2UuZ2V0UHJlc3NlZChTV1QuREVMLCAxMjcsIDApLAotICAgICAgICAgICAgCWdldEFjdGlvblJlZ2lzdHJ5KCkuZ2V0QWN0aW9uKEFjdGlvbkZhY3RvcnkuREVMRVRFLmdldElkKCkpKTsKLSAgICAgICAgICAgIGtleUhhbmRsZXIucHV0KEtleVN0cm9rZS5nZXRQcmVzc2VkKFNXVC5CUywgOCwgMCksCi0gICAgICAgICAgICAgICAgICAgIGdldEFjdGlvblJlZ2lzdHJ5KCkuZ2V0QWN0aW9uKEFjdGlvbkZhY3RvcnkuREVMRVRFLmdldElkKCkpKTsKLSAgICAgICAgICAgIGtleUhhbmRsZXIucHV0KC8qIENUUkwgKyBEICovCi0gICAgICAgICAgICAgICAgICAgICAgICBLZXlTdHJva2UuZ2V0UHJlc3NlZCgoY2hhcikgMHgwNCwgMTAwLCBTV1QuQ1RSTCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0QWN0aW9uUmVnaXN0cnkoKS5nZXRBY3Rpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWN0aW9uRmFjdG9yeS5ERUxFVEUuZ2V0SWQoKSkpOwotICAgICAgICAgICAgZ2V0QWN0aW9uUmVnaXN0cnkoKS5yZWdpc3RlckFjdGlvbihuZXcgQWNjZXNzaWJpbGl0eU1vdmVBY3Rpb24odGhpcyxQb3NpdGlvbkNvbnN0YW50cy5TT1VUSCkpOwotICAgICAgICAgICAgQWNjZXNzaWJpbGl0eU1vdmVBY3Rpb24gbW92ZUFjdGlvbiA9ICgoQWNjZXNzaWJpbGl0eU1vdmVBY3Rpb24pZ2V0QWN0aW9uUmVnaXN0cnkoKS5nZXRBY3Rpb24oQWNjZXNzaWJpbGl0eU1vdmVBY3Rpb24uTU9WRV9ET1dOX0FDVElPTikpOwotICAgICAgICAgICAga2V5SGFuZGxlci5wdXQoS2V5U3Ryb2tlLmdldFByZXNzZWQoU1dULkFSUk9XX0RPV04sIFNXVC5DVFJMKSwKLSAgICAgICAgICAgIAkJbW92ZUFjdGlvbik7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGdldEFjdGlvblJlZ2lzdHJ5KCkucmVnaXN0ZXJBY3Rpb24obmV3IEFjY2Vzc2liaWxpdHlNb3ZlQWN0aW9uKHRoaXMsUG9zaXRpb25Db25zdGFudHMuTk9SVEgpKTsKLSAgICAgICAgICAgIG1vdmVBY3Rpb24gPSAoKEFjY2Vzc2liaWxpdHlNb3ZlQWN0aW9uKWdldEFjdGlvblJlZ2lzdHJ5KCkuZ2V0QWN0aW9uKEFjY2Vzc2liaWxpdHlNb3ZlQWN0aW9uLk1PVkVfVVBfQUNUSU9OKSk7Ci0gICAgICAgICAgICBrZXlIYW5kbGVyLnB1dChLZXlTdHJva2UuZ2V0UHJlc3NlZChTV1QuQVJST1dfVVAsIFNXVC5DVFJMKSwKLSAgICAgICAgICAgIAkJbW92ZUFjdGlvbik7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGdldEFjdGlvblJlZ2lzdHJ5KCkucmVnaXN0ZXJBY3Rpb24obmV3IEFjY2Vzc2liaWxpdHlNb3ZlQWN0aW9uKHRoaXMsUG9zaXRpb25Db25zdGFudHMuV0VTVCkpOwotICAgICAgICAgICAgbW92ZUFjdGlvbiA9ICgoQWNjZXNzaWJpbGl0eU1vdmVBY3Rpb24pZ2V0QWN0aW9uUmVnaXN0cnkoKS5nZXRBY3Rpb24oQWNjZXNzaWJpbGl0eU1vdmVBY3Rpb24uTU9WRV9MRUZUX0FDVElPTikpOwotICAgICAgICAgICAga2V5SGFuZGxlci5wdXQoS2V5U3Ryb2tlLmdldFByZXNzZWQoU1dULkFSUk9XX0xFRlQsIFNXVC5DVFJMKSwKLSAgICAgICAgICAgIAkJbW92ZUFjdGlvbik7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGdldEFjdGlvblJlZ2lzdHJ5KCkucmVnaXN0ZXJBY3Rpb24obmV3IEFjY2Vzc2liaWxpdHlNb3ZlQWN0aW9uKHRoaXMsUG9zaXRpb25Db25zdGFudHMuRUFTVCkpOwotICAgICAgICAgICAgbW92ZUFjdGlvbiA9ICgoQWNjZXNzaWJpbGl0eU1vdmVBY3Rpb24pZ2V0QWN0aW9uUmVnaXN0cnkoKS5nZXRBY3Rpb24oQWNjZXNzaWJpbGl0eU1vdmVBY3Rpb24uTU9WRV9SSUdIVF9BQ1RJT04pKTsKLSAgICAgICAgICAgIGtleUhhbmRsZXIucHV0KEtleVN0cm9rZS5nZXRQcmVzc2VkKFNXVC5BUlJPV19SSUdIVCwgU1dULkNUUkwpLAotICAgICAgICAgICAgCQltb3ZlQWN0aW9uKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLyogQ1RSTCArIEEgKi8KLSAgICAgICAgICAgIGFjdGlvbiA9IFNlbGVjdEFsbEFjdGlvbi5jcmVhdGVTZWxlY3RBbGxBY3Rpb24oZ2V0RWRpdG9yU2l0ZSgpCi0JCQkJCS5nZXRXb3JrYmVuY2hXaW5kb3coKS5nZXRBY3RpdmVQYWdlKCkpOwotICAgICAgICAgICAgZ2V0QWN0aW9uUmVnaXN0cnkoKS5yZWdpc3RlckFjdGlvbihhY3Rpb24pOwotICAgICAgICAgICAgZ2V0U2VsZWN0aW9uQWN0aW9ucygpLmFkZChhY3Rpb24uZ2V0SWQoKSk7Ci0JCQlrZXlIYW5kbGVyLnB1dCgKLSAgICAgICAgICAgIAkJS2V5U3Ryb2tlLmdldFJlbGVhc2VkKChjaGFyKSAweDEsIDk3LCBTV1QuQ1RSTCksCi0gICAgICAgICAgICAJCWFjdGlvbik7Ci0JCQkvLyBLZXkgcHJlc3NlZCBldmVudCBmb3IgQ1RSTCArIEEgaXMgbm90IHRyaWdnZXJlZCwgdXNlIGtleSByZWxlYXNlZCBldmVudCBmb3Igbm93Ci0JCQkvLwotCQkJa2V5SGFuZGxlci5wdXQoCi0gICAgICAgICAgICAJCUtleVN0cm9rZS5nZXRSZWxlYXNlZCgoY2hhcikgMHgxLCA5NywgU1dULkNUUkwpLAotICAgICAgICAgICAgCQlhY3Rpb24pOwotIAkJfQotCQkKLQkJcmV0dXJuIGtleUhhbmRsZXI7Ci0JfQotCQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUFjdGlvbnMoKSB7Ci0JCXN1cGVyLmNyZWF0ZUFjdGlvbnMoKTsKLQkJY3JlYXRlQ29udHJvbEZsb3dBY3Rpb24oKTsKLQkJCi0JCS8vIFJlZ2lzdGVyIGFsaWdubWVudCBhY3Rpb25zOgotCQlhY3Rpb25TZXJ2aWNlID0gbmV3IERpYWdyYW1BY3Rpb25zU2VydmljZSgKLQkJCQlnZXREaWFncmFtTWFuYWdlcigpLmdldEVkaXRpbmdEb21haW4oKSwKLQkJCQlnZXRHcmFwaGljYWxWaWV3ZXIoKSwKLQkJCQlnZXRFZGl0RG9tYWluKCksIGdldEFjdGlvblJlZ2lzdHJ5KCkpOwotCQlhY3Rpb25TZXJ2aWNlLnJlZ2lzdGVySG9yaXpvbnRhbEFsaWduQXZlcmFnZUFjdGlvbigpOwotCQlhY3Rpb25TZXJ2aWNlLnJlZ2lzdGVySG9yaXpvbnRhbEFsaWduRmlyc3RTZWxlY3RlZEFjdGlvbigpOwotCQlhY3Rpb25TZXJ2aWNlLnJlZ2lzdGVyVmVydGljYWxBbGlnbkF2ZXJhZ2VBY3Rpb24oKTsKLQkJYWN0aW9uU2VydmljZS5yZWdpc3RlclZlcnRpY2FsQWxpZ25GaXJzdFNlbGVjdGVkQWN0aW9uKCk7Ci0JCQotCX0KLQkKLQlwcm90ZWN0ZWQgSUFjdGlvbiBjcmVhdGVBbkFjdGlvbihTdHJpbmcgYWN0aW9uTmFtZSwKLQkJCUxpc3Q8SUVsZW1lbnRUeXBlPiBlbGVtZW50VHlwZSwgU3RyaW5nIGFjdGlvbklkLAotCQkJU3RyaW5nIHRvb2x0aXBTdHJpbmcsIEltYWdlRGVzY3JpcHRvciBpbWFnZWRlc2MpIHsKLQkJQ3JlYXRlRWxlbWVudEFjdGlvbiBhY3Rpb24gPSBuZXcgQ3JlYXRlRWxlbWVudEFjdGlvbih0aGlzLCBhY3Rpb25OYW1lKTsKLQkJYWN0aW9uLnNldEVsZW1lbnRUeXBlcyhlbGVtZW50VHlwZSk7Ci0JCWFjdGlvbi5zZXRQcmVmZXJlbmNlSGludChnZXRQcmVmZXJlbmNlc0hpbnQoKSk7Ci0JCWFjdGlvbi5zZXRJbWFnZURlc2NyaXB0b3IoaW1hZ2VkZXNjKTsKLQkJYWN0aW9uLnNldFRvb2xUaXBUZXh0KHRvb2x0aXBTdHJpbmcpOwotCQlhY3Rpb24uc2V0SWQoYWN0aW9uSWQpOwotCQlyZXR1cm4gYWN0aW9uOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBjb250cmlidXRlVG9Db250ZXh0TWVudShJTWVudU1hbmFnZXIgbWVudSkgewotCQlpZihhY3Rpb25TZXJ2aWNlICE9IG51bGwpewotCQkJYWN0aW9uU2VydmljZS5jcmVhdGVBbGlnbk1lbnUobWVudSwgaXNFZGl0YWJsZSgpKTsKLQkJfQotCQlhZGRUb01lbnUobWVudSwgRGlhZ3JhbUNvbnN0YW50cy5DUkVBVEVfTElOSywKLQkJCQlHRUZBY3Rpb25Db25zdGFudHMuTUJfQURESVRJT05TLCB0cnVlLCB0cnVlKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgYWRkVG9NZW51KElNZW51TWFuYWdlciBtZW51LCBTdHJpbmcgaWQsIFN0cmluZyBncm91cE5hbWUsIAotCQkJYm9vbGVhbiBzZXBhcmF0b3IsIGJvb2xlYW4gYXBwZW5kKSB7Ci0JCWJvb2xlYW4gY2FuTW9kaWZ5ID0gaXNFZGl0YWJsZSgpOwotCQlpZiAoaWQgIT0gbnVsbCkgewotCQkJSUFjdGlvbiBhY3Rpb24gPSBnZXRBY3Rpb25SZWdpc3RyeSgpLmdldEFjdGlvbihpZCk7Ci0JCQlpZiAoYWN0aW9uICE9IG51bGwgJiYgYWN0aW9uLmlzRW5hYmxlZCgpICYmIGNhbk1vZGlmeSkgewotCQkJCWlmIChhcHBlbmQpIHsKLQkJCQkJbWVudS5hcHBlbmRUb0dyb3VwKGdyb3VwTmFtZSwgYWN0aW9uKTsKLQkJCQl9IGVsc2UgewotCQkJCQltZW51LnByZXBlbmRUb0dyb3VwKGdyb3VwTmFtZSwgYWN0aW9uKTsKLQkJCQl9Ci0JCQkJaWYgKHNlcGFyYXRvcikgewotCQkJCQltZW51Lmluc2VydEFmdGVyKGlkLCBuZXcgU2VwYXJhdG9yKCkpOwotCQkJCX0KLQkJCX0KLQkJfWVsc2V7Ci0JCQlpZihzZXBhcmF0b3IgJiYgY2FuTW9kaWZ5KXsKLQkJCQlpZihhcHBlbmQpewotCQkJCQltZW51LmFwcGVuZFRvR3JvdXAoZ3JvdXBOYW1lLCBuZXcgU2VwYXJhdG9yKCkpOwotCQkJCX1lbHNlewotCQkJCQltZW51LnByZXBlbmRUb0dyb3VwKGdyb3VwTmFtZSwgbmV3IFNlcGFyYXRvcigpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogVG8gcmVzZXQgdGhlIGxheW91dCBvZiB0aGUgZGlhZ3JhbS4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZXNldExheW91dCgpewotCQkvLyBkb2VzIG5vdGhpbmcuIGNsaWVudCBzaG91bGQgaW1wbGVtZW50LgotCX0KLQkKLQkKLQkvKioKLQkgKiBSZWZyZXNoIGRpYWdyYW0KLQkgKi8KLQlwdWJsaWMgdm9pZCByZWZyZXNoRGlhZ3JhbSgpewotCQlyZWZyZXNoKCk7Ci0JfQotCQotCXByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0UGFydE5hbWVQcmVmaXgoKTsKLQkKLQlwcm90ZWN0ZWQgYWJzdHJhY3QgSW1hZ2UgZ2V0UGFydEltYWdlKCk7Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbnRyb2xGbG93QWN0aW9uKCl7Ci0JCUlBY3Rpb24gbGlua0FjdGlvbiA9IG5ldyBBY3Rpb24oRGlhZ3JhbUNvcmVSZXNvdXJjZXMuQWN0aXZpdHlEaWFncmFtX1BhbGV0dGVfY29udHJvbF9mbG93X2NyZWF0ZV90ZXh0KSB7IC8vJE5PTi1OTFMtMSQKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlMaXN0IGVkaXRQYXJ0cyA9IGdldEdyYXBoaWNhbFZpZXdlcigpLmdldFNlbGVjdGVkRWRpdFBhcnRzKCk7Ci0JCQkJaWYgKGVkaXRQYXJ0cy5zaXplKCkgPT0gMikgewotCQkJCQlFZGl0UGFydCBzb3VyY2VFZGl0UGFydCA9IChFZGl0UGFydCkgZWRpdFBhcnRzLmdldCgwKTsKLQkJCQkJRWRpdFBhcnQgdGFyZ2V0RWRpdFBhcnQgPSAoRWRpdFBhcnQpIGVkaXRQYXJ0cy5nZXQoMSk7Ci0JCQkJCQotCQkJCQlWaWV3IHNvdXJjZU1vZGVsID0gKFZpZXcpc291cmNlRWRpdFBhcnQuZ2V0TW9kZWwoKTsKLQkJCQkJVmlldyB0YXJnZXRNb2RlbCA9IChWaWV3KXRhcmdldEVkaXRQYXJ0LmdldE1vZGVsKCk7Ci0JCQkJCQotCQkJCQlpZihCcmlkZ2VIZWxwZXIuaXNSZWFkT25seShzb3VyY2VNb2RlbCkgCi0JCQkJCQkJfHwgQnJpZGdlSGVscGVyLmlzUmVhZE9ubHkodGFyZ2V0TW9kZWwpKQotCQkJCQkJcmV0dXJuOwotCQkJCQkKLQkJCQkJQ3JlYXRlVW5zcGVjaWZpZWRUeXBlQ29ubmVjdGlvblJlcXVlc3QgY29ubmVjdGlvblJlcXVlc3QgPSAKLQkJCQkJCWdldENyZWF0ZUNvbnRyb2xGbG93UmVxdWVzdCgpOwotCQkJCQlpZiAoY29ubmVjdGlvblJlcXVlc3QgIT0gbnVsbCkgewotCQkJCQkJY29ubmVjdGlvblJlcXVlc3Quc2V0U291cmNlRWRpdFBhcnQobnVsbCk7Ci0JCQkJCQljb25uZWN0aW9uUmVxdWVzdC5zZXRUYXJnZXRFZGl0UGFydCh0YXJnZXRFZGl0UGFydCk7Ci0JCQkJCQljb25uZWN0aW9uUmVxdWVzdAotCQkJCQkJCQkuc2V0VHlwZShSZXF1ZXN0Q29uc3RhbnRzLlJFUV9DT05ORUNUSU9OX1NUQVJUKTsKLQkJCQkJCWNvbm5lY3Rpb25SZXF1ZXN0LnNldExvY2F0aW9uKG5ldyBQb2ludCgwLCAwKSk7Ci0JCQkJCQlzb3VyY2VFZGl0UGFydC5nZXRDb21tYW5kKGNvbm5lY3Rpb25SZXF1ZXN0KTsKLQotCQkJCQkJY29ubmVjdGlvblJlcXVlc3Quc2V0U291cmNlRWRpdFBhcnQoc291cmNlRWRpdFBhcnQpOwotCQkJCQkJY29ubmVjdGlvblJlcXVlc3Quc2V0VGFyZ2V0RWRpdFBhcnQodGFyZ2V0RWRpdFBhcnQpOwotCQkJCQkJY29ubmVjdGlvblJlcXVlc3QKLQkJCQkJCQkJLnNldFR5cGUoUmVxdWVzdENvbnN0YW50cy5SRVFfQ09OTkVDVElPTl9FTkQpOwotCQkJCQkJY29ubmVjdGlvblJlcXVlc3Quc2V0TG9jYXRpb24obmV3IFBvaW50KDAsIDApKTsKLQotCQkJCQkJRGlhZ3JhbUVkaXRQYXJ0IGRpYWdyYW1FZGl0UGFydCA9IGdldERpYWdyYW1FZGl0UGFydCgpOwotCQkJCQkJaWYgKGRpYWdyYW1FZGl0UGFydC5pc0VkaXRNb2RlRW5hYmxlZCgpKSB7Ci0JCQkJCQkJQ29tbWFuZCBjbWQgPSB0YXJnZXRFZGl0UGFydAotCQkJCQkJCQkJLmdldENvbW1hbmQoY29ubmVjdGlvblJlcXVlc3QpOwotCQkJCQkJCWlmIChjbWQgIT0gbnVsbCAmJiBjbWQuY2FuRXhlY3V0ZSgpKSB7Ci0JCQkJCQkJCWNtZC5leGVjdXRlKCk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQlwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWQoKSB7Ci0JCQkJaWYoZ2V0Q3JlYXRlQ29udHJvbEZsb3dSZXF1ZXN0KCk9PSBudWxsKSByZXR1cm4gZmFsc2U7Ci0JCQkJTGlzdCBlZGl0UGFydHMgPSBnZXRHcmFwaGljYWxWaWV3ZXIoKS5nZXRTZWxlY3RlZEVkaXRQYXJ0cygpOwotCQkJCWlmIChlZGl0UGFydHMuc2l6ZSgpID09IDIpIHsKLQkJCQkJRWRpdFBhcnQgc291cmNlRWRpdFBhcnQgPSAoRWRpdFBhcnQpIGVkaXRQYXJ0cy5nZXQoMCk7Ci0JCQkJCUVkaXRQYXJ0IHRhcmdldEVkaXRQYXJ0ID0gKEVkaXRQYXJ0KSBlZGl0UGFydHMuZ2V0KDEpOwotCi0JCQkJCVZpZXcgc291cmNlTW9kZWwgPSAoVmlldykgc291cmNlRWRpdFBhcnQuZ2V0TW9kZWwoKTsKLQkJCQkJVmlldyB0YXJnZXRNb2RlbCA9IChWaWV3KSB0YXJnZXRFZGl0UGFydC5nZXRNb2RlbCgpOwotCQkJCQlpZihCcmlkZ2VIZWxwZXIuaXNSZWFkT25seShzb3VyY2VNb2RlbCkgCi0JCQkJCQkJfHwgQnJpZGdlSGVscGVyLmlzUmVhZE9ubHkodGFyZ2V0TW9kZWwpKQotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQkKLQkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gZ2V0RGlhZ3JhbSgpLmdldEVkZ2VzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlFZGdlIGVkZ2UgPSAoRWRnZSkgaXRlci5uZXh0KCk7Ci0JCQkJCQlpZihlZGdlLmdldFNvdXJjZSgpPT0gc291cmNlTW9kZWwgJiYgZWRnZS5nZXRUYXJnZXQoKSA9PSB0YXJnZXRNb2RlbCl7Ci0JCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCQotCQkJCQlpZiAoc291cmNlTW9kZWwuZ2V0RWxlbWVudCgpIGluc3RhbmNlb2YgQWN0aXZpdHlOb2RlCi0JCQkJCQkJfCBzb3VyY2VNb2RlbC5nZXRFbGVtZW50KCkgaW5zdGFuY2VvZiBOYW1lZE5vZGUKLQkJCQkJCQl8fCB0YXJnZXRNb2RlbC5nZXRFbGVtZW50KCkgaW5zdGFuY2VvZiBBY3Rpdml0eU5vZGUKLQkJCQkJCQl8fCB0YXJnZXRNb2RlbC5nZXRFbGVtZW50KCkgaW5zdGFuY2VvZiBOYW1lZE5vZGUpIHsKLQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQl9Ci0JCQkJCQotCQkJCX0KLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCQkJcmV0dXJuIERpYWdyYW1Db25zdGFudHMuQ1JFQVRFX0xJTks7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJbWFnZURlc2NyaXB0b3IgZ2V0SW1hZ2VEZXNjcmlwdG9yKCkgewotCQkJCXJldHVybiBEaWFncmFtQ29uc3RhbnRzLkNPTlRST0xfRkxPV19JTUFHRV9ERVNDUklQVE9SOwotCQkJfQotCQl9OwotCQlnZXRBY3Rpb25SZWdpc3RyeSgpLnJlZ2lzdGVyQWN0aW9uKGxpbmtBY3Rpb24pOwotCX0KLQotCS8qKgotCSAqIERvZXMgbm90aGluZyBjbGllbnQgc2hvdWxkIGltcGxlbWVudC4KLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIENyZWF0ZVVuc3BlY2lmaWVkVHlwZUNvbm5lY3Rpb25SZXF1ZXN0IGdldENyZWF0ZUNvbnRyb2xGbG93UmVxdWVzdCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXByb3RlY3RlZCBEaWFncmFtIGdldERpYWdyYW0oQWN0aXZpdHkgYWN0aXZpdHksIGludCB0eXBlKSB7Ci0JCXJldHVybiBnZXREaWFncmFtU2VydmljZSgpLmdldERpYWdyYW0oYWN0aXZpdHksIHR5cGUpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vY29yZS9wYXJ0L0RpYWdyYW1FZGl0b3JJbnB1dC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vY29yZS9wYXJ0L0RpYWdyYW1FZGl0b3JJbnB1dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YTU3NGY0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2NvcmUvcGFydC9EaWFncmFtRWRpdG9ySW5wdXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnBhcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLklEaWFncmFtTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuU3VwcHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklQZXJzaXN0YWJsZUVsZW1lbnQ7Ci0KLS8qKgotICogRGlhZ3JhbUVkaXRvciBJbnB1dCBmb3Ige0BsaW5rIEJyZWFrZG93bkVsZW1lbnR9IAotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICovCi1wdWJsaWMgY2xhc3MgRGlhZ3JhbUVkaXRvcklucHV0IGltcGxlbWVudHMgSUVkaXRvcklucHV0IHsKLQotCXByaXZhdGUgTWV0aG9kRWxlbWVudCBtZXRob2RFbGVtZW50OwotCi0JcHJpdmF0ZSBJbWFnZURlc2NyaXB0b3IgaW1hZ2VEZXNjcmlwdG9yID0gbnVsbDsKLQkKLQlwcml2YXRlIFN1cHByZXNzaW9uIHN1cHByZXNzaW9uOwotCi0JcHJpdmF0ZSBCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlciB3cmFwcGVyOwotCi0JcHJpdmF0ZSBpbnQgZGlhZ3JhbVR5cGU7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIERpYWdyYW1FZGl0b3JJbnB1dCBmb3IgYWN0aXZpdHkgZGlhZ3JhbQotCSAqIEBwYXJhbSBvYmplY3QKLQkgKiBAZGVwcmVjYXRlZCB1c2Uge0BsaW5rICNEaWFncmFtRWRpdG9ySW5wdXQoT2JqZWN0LCBTdXBwcmVzc2lvbiwgaW50KX0KLQkgKi8KLQlwdWJsaWMgRGlhZ3JhbUVkaXRvcklucHV0KE9iamVjdCBvYmplY3QsIFN1cHByZXNzaW9uIHN1cHByZXNzaW9uKSB7Ci0JCXRoaXMob2JqZWN0LCBzdXBwcmVzc2lvbiwgSURpYWdyYW1NYW5hZ2VyLkFDVElWSVRZX0RJQUdSQU0pOwotCX0KLQkKLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gb2JqZWN0Ci0JICogQHBhcmFtIHN1cHByZXNzaW9uCi0JICogQHBhcmFtIGRpYWdyYW1UeXBlCi0JICogICAgICAgICAgICBjYW4gYmUgb25lIG9mIHRoZSBjb25zdGFudHM6Ci0JICogICAgICAgICAgICB7QGxpbmsgSURpYWdyYW1NYW5hZ2VyI0FDVElWSVRZX0RJQUdSQU19LAotCSAqICAgICAgICAgICAge0BsaW5rIElEaWFncmFtTWFuYWdlciNBQ1RJVklUWV9ERVRBSUxfRElBR1JBTX0sCi0JICogICAgICAgICAgICB7QGxpbmsgSURpYWdyYW1NYW5hZ2VyI1dPUktfUFJPRFVDVF9ERVBFTkRFTkNZX0RJQUdSQU19Ci0JICovCi0JcHVibGljIERpYWdyYW1FZGl0b3JJbnB1dChPYmplY3Qgb2JqZWN0LCBTdXBwcmVzc2lvbiBzdXBwcmVzc2lvbiwgaW50IGRpYWdyYW1UeXBlKSB7Ci0JCW1ldGhvZEVsZW1lbnQgPSAoTWV0aG9kRWxlbWVudCkgVG5nVXRpbC51bndyYXAob2JqZWN0KTsKLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSB7Ci0JCQl3cmFwcGVyID0gKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSBvYmplY3Q7Ci0JCX0KLQkJdGhpcy5zdXBwcmVzc2lvbiA9IHN1cHByZXNzaW9uOwotCQl0aGlzLmRpYWdyYW1UeXBlID0gZGlhZ3JhbVR5cGU7Ci0JfQotCQotCXB1YmxpYyBpbnQgZ2V0RGlhZ3JhbVR5cGUoKSB7Ci0JCXJldHVybiBkaWFncmFtVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIHN1cHByZXNzaW9uLgotCSAqLwotCXB1YmxpYyBTdXBwcmVzc2lvbiBnZXRTdXBwcmVzc2lvbigpIHsKLQkJcmV0dXJuIHN1cHByZXNzaW9uOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgd3JhcHBlci4KLQkgKi8KLQlwdWJsaWMgQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIgZ2V0V3JhcHBlcigpIHsKLQkJcmV0dXJuIHdyYXBwZXI7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuTWV0aG9kRWxlbWVudEVkaXRvcklucHV0I2VxdWFscyhqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7Ci0JCWlmICh0aGlzID09IG9iaikKLQkJCXJldHVybiB0cnVlOwotCQlpZiAoZ2V0Q2xhc3MoKS5pc0luc3RhbmNlKG9iaikpIHsKLQkJCURpYWdyYW1FZGl0b3JJbnB1dCBvdGhlciA9IChEaWFncmFtRWRpdG9ySW5wdXQpIG9iajsKLQkJCXJldHVybiBnZXRNZXRob2RFbGVtZW50KCkgPT0gb3RoZXIuZ2V0TWV0aG9kRWxlbWVudCgpCi0JCQkJCSYmICgoc3VwcHJlc3Npb24gPT0gbnVsbCAmJiBvdGhlci5nZXRTdXBwcmVzc2lvbigpID09IG51bGwpIHx8IAotCQkJCQkJCShzdXBwcmVzc2lvbi5nZXRQcm9jZXNzKCkgPT0gb3RoZXIuZ2V0U3VwcHJlc3Npb24oKS5nZXRQcm9jZXNzKCkpKQotCQkJCQkmJiBnZXREaWFncmFtVHlwZSgpID09IG90aGVyLmdldERpYWdyYW1UeXBlKCk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCQlpbnQgcmVzdWx0ID0gZ2V0TWV0aG9kRWxlbWVudCgpLmhhc2hDb2RlKCk7Ci0JCXJlc3VsdCBePSBzdXBwcmVzc2lvbi5nZXRQcm9jZXNzKCkuaGFzaENvZGUoKTsKLQkJcmVzdWx0IF49IGdldERpYWdyYW1UeXBlKCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCQotCXB1YmxpYyBEaWFncmFtRWRpdG9ySW5wdXQoTWV0aG9kRWxlbWVudCBlKSB7Ci0JCW1ldGhvZEVsZW1lbnQgPSBlOwotCX0KLQotCXB1YmxpYyBNZXRob2RFbGVtZW50IGdldE1ldGhvZEVsZW1lbnQoKSB7Ci0JCXJldHVybiBtZXRob2RFbGVtZW50OwotCX0KLQkKLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dCNleGlzdHMoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGV4aXN0cygpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0I2dldEltYWdlRGVzY3JpcHRvcigpCi0JICovCi0JcHVibGljIEltYWdlRGVzY3JpcHRvciBnZXRJbWFnZURlc2NyaXB0b3IoKSB7Ci0JCXJldHVybiBpbWFnZURlc2NyaXB0b3I7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0I2dldE5hbWUoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIG1ldGhvZEVsZW1lbnQuZ2V0TmFtZSgpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dCNnZXRQZXJzaXN0YWJsZSgpCi0JICovCi0JcHVibGljIElQZXJzaXN0YWJsZUVsZW1lbnQgZ2V0UGVyc2lzdGFibGUoKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0I2dldFRvb2xUaXBUZXh0KCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRvb2xUaXBUZXh0KCkgewotCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZSNnZXRBZGFwdGVyKGphdmEubGFuZy5DbGFzcykKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgYWRhcHRlcikgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBudWxsOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2NvcmUvcGFydC9EaWFncmFtRWRpdG9ySW5wdXRQcm94eS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vY29yZS9wYXJ0L0RpYWdyYW1FZGl0b3JJbnB1dFByb3h5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlOGY4NGQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vY29yZS9wYXJ0L0RpYWdyYW1FZGl0b3JJbnB1dFByb3h5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUucGFydDsKLQotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JU3RvcmFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi53b3Jrc3BhY2UudXRpbC5Xb3Jrc3BhY2VTeW5jaHJvbml6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5Db21tb25QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5EaWFncmFtQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnNlcnZpY2VzLkRpYWdyYW1NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLnByZWZlcmVuY2VzLlByZWZlcmVuY2VzSGludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5EaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5zZXJ2aWNlcy5JRGlzcG9zYWJsZTsKLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogCi0gKiBAc2luY2UgMS4yCi0gKi8KLXB1YmxpYyBjbGFzcyBEaWFncmFtRWRpdG9ySW5wdXRQcm94eSBleHRlbmRzIERpYWdyYW1GaWxlRWRpdG9ySW5wdXRQcm94eSBpbXBsZW1lbnRzIElEaXNwb3NhYmxlCi17Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyA9IERpYWdyYW1Db3JlUGx1Z2luLmdldERlZmF1bHQoKS5pc0RlYnVnZ2luZygpOwotCQotCXByaXZhdGUgRGlhZ3JhbSBkaWFncmFtOwotCi0JcHJpdmF0ZSBQcmVmZXJlbmNlc0hpbnQgcHJlZmVyZW5jZUhpbnQ7Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNOZXdEaWFncmFtOwotCQotCXB1YmxpYyBEaWFncmFtRWRpdG9ySW5wdXRQcm94eShEaWFncmFtRWRpdG9ySW5wdXQgaW5wdXQsIFByZWZlcmVuY2VzSGludCBoaW50KSB7Ci0JCXN1cGVyKGlucHV0KTsKLQkJdGhpcy5wcmVmZXJlbmNlSGludCA9IGhpbnQ7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWRpYWdyYW0gPSBudWxsOwotCX0KLQkKLQlwcml2YXRlIFJlc291cmNlIGdldFJlc291cmNlKCkgewotCQlpZihkaWFncmFtID09IG51bGwgfHwgZGlhZ3JhbS5lUmVzb3VyY2UoKSA9PSBudWxsKSB7Ci0JCQlBY3Rpdml0eSBhY3QgPSAoQWN0aXZpdHkpIGdldERpYWdyYW1FZGl0b3JJbnB1dCgpLmdldE1ldGhvZEVsZW1lbnQoKTsKLQkJCW9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzcyBwcm9jZXNzID0gVG5nVXRpbC5nZXRPd25pbmdQcm9jZXNzKGFjdCk7Ci0JCQlpZihwcm9jZXNzICE9IG51bGwpIHsKLQkJCQlEaWFncmFtTWFuYWdlciBtZ3IgPSBEaWFncmFtTWFuYWdlci5nZXRJbnN0YW5jZShwcm9jZXNzLCB0aGlzKTsKLQkJCQl0cnkgewotCQkJCQlpbnQgZGlhZ3JhbVR5cGUgPSBnZXREaWFncmFtRWRpdG9ySW5wdXQoKS5nZXREaWFncmFtVHlwZSgpOwotCQkJCQlMaXN0PERpYWdyYW0+IGxpc3QgPSBtZ3IuZ2V0RGlhZ3JhbXMoYWN0LCBkaWFncmFtVHlwZSk7Ci0JCQkJCWlmKGxpc3QuaXNFbXB0eSgpKSB7Ci0JCQkJCQlkaWFncmFtID0gbWdyLmNyZWF0ZURpYWdyYW0oYWN0LCBkaWFncmFtVHlwZSwgcHJlZmVyZW5jZUhpbnQpOwotCQkJCQkJaXNOZXdEaWFncmFtID0gZGlhZ3JhbSAhPSBudWxsOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJZGlhZ3JhbSA9IChEaWFncmFtKSBsaXN0LmdldCgwKTsKLQkJCQkJfQotCQkJCX0KLQkJCQljYXRjaChFeGNlcHRpb24gZSkgewotCQkJCQlDb21tb25QbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCQlpZihERUJVRykgewotCQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlmaW5hbGx5IHsKLQkJCQkJbWdyLnJlbW92ZUNvbnN1bWVyKHRoaXMpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZGlhZ3JhbSAhPSBudWxsID8gZGlhZ3JhbS5lUmVzb3VyY2UoKSA6IG51bGw7Ci0JfQotCQotCXB1YmxpYyBJRmlsZSBnZXRGaWxlKCkgewotCQlSZXNvdXJjZSByZXNvdXJjZSA9IGdldFJlc291cmNlKCk7Ci0JCWlmKHJlc291cmNlICE9IG51bGwpIHsKLQkJCXJldHVybiBXb3Jrc3BhY2VTeW5jaHJvbml6ZXIuZ2V0RmlsZShyZXNvdXJjZSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyBJU3RvcmFnZSBnZXRTdG9yYWdlKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlmaW5hbCBSZXNvdXJjZSByZXNvdXJjZSA9IGdldFJlc291cmNlKCk7Ci0JCWlmKHJlc291cmNlICE9IG51bGwpIHsKLQkJCXJldHVybiBuZXcgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5yZXNvdXJjZXMuSURpYWdyYW1TdG9yYWdlKCkgewotCQkJCXByaXZhdGUgSUZpbGUgZmlsZTsKLQkJCQkKLQkJCQlwcml2YXRlIElGaWxlIGdldEZpbGUoKSB7Ci0JCQkJCWlmKGZpbGUgPT0gbnVsbCkgewotCQkJCQkJZmlsZSA9IERpYWdyYW1FZGl0b3JJbnB1dFByb3h5LnRoaXMuZ2V0RmlsZSgpOwotCQkJCQl9Ci0JCQkJCXJldHVybiBmaWxlOwotCQkJCX0KLQotCQkJCXB1YmxpYyBJbnB1dFN0cmVhbSBnZXRDb250ZW50cygpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCi0JCQkJcHVibGljIElQYXRoIGdldEZ1bGxQYXRoKCkgewotCQkJCQlyZXR1cm4gZ2V0RmlsZSgpLmdldEZ1bGxQYXRoKCk7Ci0JCQkJfQotCi0JCQkJcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQkJCQlyZXR1cm4gcmVzb3VyY2UuZ2V0VVJJKCkudG9TdHJpbmcoKTsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgYm9vbGVhbiBpc1JlYWRPbmx5KCkgewotCQkJCQlyZXR1cm4gZ2V0RmlsZSgpLmlzUmVhZE9ubHkoKTsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgYWRhcHRlcikgewotCQkJCQlyZXR1cm4gZ2V0RmlsZSgpLmdldEFkYXB0ZXIoYWRhcHRlcik7Ci0JCQkJfQotCi0JCQkJcHVibGljIERpYWdyYW0gZ2V0RGlhZ3JhbSgpIHsKLQkJCQkJcmV0dXJuIGRpYWdyYW07Ci0JCQkJfQotCQkJCQotCQkJfTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQl0cnkgewotCQkJcmV0dXJuIGdldERpYWdyYW1FZGl0b3JJbnB1dCgpLmdldE1ldGhvZEVsZW1lbnQoKS5nZXROYW1lKCk7Ci0JCX0KLQkJY2F0Y2goTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIEltYWdlRGVzY3JpcHRvciBnZXRJbWFnZURlc2NyaXB0b3IoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5wYXJ0LkRpYWdyYW1GaWxlRWRpdG9ySW5wdXRQcm94eSNleGlzdHMoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGV4aXN0cygpIHsKLQkJLy8gZG9uJ3Qgc2hvdyB0aGlzIGlucHV0IGluIHRoZSBsaXN0IG9mIHJlY2VudGx5IG9wZW4gZmlsZXMKLQkJLy8KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUucGFydC5EaWFncmFtRmlsZUVkaXRvcklucHV0UHJveHkjZ2V0UGF0aCgpCi0JICovCi0JcHVibGljIElQYXRoIGdldFBhdGgoKSB7Ci0JCXJldHVybiBnZXRGaWxlKCkuZ2V0TG9jYXRpb24oKTsKLQl9Ci0JCi0JcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKENsYXNzIGFkYXB0ZXIpIHsKLQkJSUZpbGUgZmlsZSA9IGdldEZpbGUoKTsKLQkJaWYoZmlsZSAhPSBudWxsKSB7Ci0JCQlpZihhZGFwdGVyID09IElGaWxlLmNsYXNzKSB7Ci0JCQkJcmV0dXJuIGZpbGU7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlyZXR1cm4gZmlsZS5nZXRBZGFwdGVyKGFkYXB0ZXIpOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0JCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLQkJaWYob2JqID09IHRoaXMpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWlmKG9iaiBpbnN0YW5jZW9mIERpYWdyYW1FZGl0b3JJbnB1dFByb3h5KSB7Ci0JCQlyZXR1cm4gZ2V0RGlhZ3JhbUVkaXRvcklucHV0KCkuZXF1YWxzKCgoRGlhZ3JhbUVkaXRvcklucHV0UHJveHkpb2JqKS5nZXREaWFncmFtRWRpdG9ySW5wdXQoKSk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCQlyZXR1cm4gZ2V0RGlhZ3JhbUVkaXRvcklucHV0KCkuaGFzaENvZGUoKTsKLQl9Ci0JCi0JcHVibGljIFByZWZlcmVuY2VzSGludCBnZXRQcmVmZXJlbmNlSGludCgpIHsKLQkJcmV0dXJuIHByZWZlcmVuY2VIaW50OwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc05ld0RpYWdyYW0oKSB7Ci0JCXJldHVybiBpc05ld0RpYWdyYW07Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vY29yZS9wYXJ0L0RpYWdyYW1GaWxlRWRpdG9ySW5wdXRQcm94eS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vY29yZS9wYXJ0L0RpYWdyYW1GaWxlRWRpdG9ySW5wdXRQcm94eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYWE3MWU5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2NvcmUvcGFydC9EaWFncmFtRmlsZUVkaXRvcklucHV0UHJveHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLyoqCi0gKiAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnBhcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JU3RvcmFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5UcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSU1lbWVudG87Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVBlcnNpc3RhYmxlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmlkZS5JREU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5GaWxlRWRpdG9ySW5wdXRGYWN0b3J5OwotCi0vKioKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICoKLSAqLwotcHVibGljIGNsYXNzIERpYWdyYW1GaWxlRWRpdG9ySW5wdXRQcm94eSBpbXBsZW1lbnRzCi0JCUlEaWFncmFtRmlsZUVkaXRvcklucHV0UHJveHkgewotCi0JcHJpdmF0ZSBEaWFncmFtRWRpdG9ySW5wdXQgZGlhZ3JhbUVkaXRvcklucHV0OwotICAgIHByaXZhdGUgSUZpbGUgZmlsZTsKLSAgICBwcml2YXRlIFRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIGRvbWFpbjsKLQotCXByb3RlY3RlZCBEaWFncmFtRmlsZUVkaXRvcklucHV0UHJveHkoRGlhZ3JhbUVkaXRvcklucHV0IGlucHV0KSB7Ci0JCXRoaXMuZGlhZ3JhbUVkaXRvcklucHV0ID0gaW5wdXQ7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnBhcnQuSURpYWdyYW1GaWxlRWRpdG9ySW5wdXRQcm94eSNnZXREaWFncmFtRWRpdG9ySW5wdXQoKQotCSAqLwotCXB1YmxpYyBEaWFncmFtRWRpdG9ySW5wdXQgZ2V0RGlhZ3JhbUVkaXRvcklucHV0KCkgewotCQlyZXR1cm4gZGlhZ3JhbUVkaXRvcklucHV0OwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVzb3VyY2VzLmVkaXRvci5kb2N1bWVudC5NRWRpdGluZ0RvbWFpbkVsZW1lbnQjZ2V0RWRpdGluZ0RvbWFpbigpCi0JICovCi0JcHVibGljIFRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIGdldEVkaXRpbmdEb21haW4oKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIGRvbWFpbjsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIElFZGl0b3JJbnB1dC4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBleGlzdHMoKSB7Ci0gICAgICAgIHJldHVybiBmaWxlLmV4aXN0cygpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gSUFkYXB0YWJsZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgYWRhcHRlcikgewotICAgICAgICBpZiAoYWRhcHRlciA9PSBJRmlsZS5jbGFzcykgewotCQkJcmV0dXJuIGZpbGU7Ci0JCX0KLSAgICAgICAgcmV0dXJuIGZpbGUuZ2V0QWRhcHRlcihhZGFwdGVyKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIElQZXJzaXN0YWJsZUVsZW1lbnQuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRGYWN0b3J5SWQoKSB7Ci0gICAgICAgIHJldHVybiBGaWxlRWRpdG9ySW5wdXRGYWN0b3J5LmdldEZhY3RvcnlJZCgpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gSURpYWdyYW1GaWxlRWRpdG9ySW5wdXQuCi0gICAgICovCi0gICAgcHVibGljIElGaWxlIGdldEZpbGUoKSB7Ci0gICAgICAgIHJldHVybiBmaWxlOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gSUVkaXRvcklucHV0LgotICAgICAqLwotICAgIHB1YmxpYyBJbWFnZURlc2NyaXB0b3IgZ2V0SW1hZ2VEZXNjcmlwdG9yKCkgewotICAgICAgICBJQ29udGVudFR5cGUgY29udGVudFR5cGUgPSBJREUuZ2V0Q29udGVudFR5cGUoZmlsZSk7Ci0JCXJldHVybiBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEVkaXRvclJlZ2lzdHJ5KCkKLSAgICAgICAgICAgICAgICAuZ2V0SW1hZ2VEZXNjcmlwdG9yKGZpbGUuZ2V0TmFtZSgpLCBjb250ZW50VHlwZSk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBJRWRpdG9ySW5wdXQuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotICAgICAgICByZXR1cm4gZmlsZS5nZXROYW1lKCk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBJRWRpdG9ySW5wdXQuCi0gICAgICovCi0gICAgcHVibGljIElQZXJzaXN0YWJsZUVsZW1lbnQgZ2V0UGVyc2lzdGFibGUoKSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gSVN0b3JhZ2VFZGl0b3JJbnB1dC4KLSAgICAgKi8KLSAgICBwdWJsaWMgSVN0b3JhZ2UgZ2V0U3RvcmFnZSgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIGZpbGU7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBJRWRpdG9ySW5wdXQuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRUb29sVGlwVGV4dCgpIHsKLSAgICAgICAgcmV0dXJuIGRpYWdyYW1FZGl0b3JJbnB1dC5nZXRNZXRob2RFbGVtZW50KCkuZ2V0TmFtZSgpOwotICAgIH0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklQZXJzaXN0YWJsZSNzYXZlU3RhdGUob3JnLmVjbGlwc2UudWkuSU1lbWVudG8pCi0JICovCi0JcHVibGljIHZvaWQgc2F2ZVN0YXRlKElNZW1lbnRvIG1lbWVudG8pIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCi0JfQotCXB1YmxpYyB2b2lkIHNldFRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluKFRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIGRvbWFpbil7Ci0JCXRoaXMuZG9tYWluID0gZG9tYWluOwotCX0KLQotCSAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gSVBhdGhFZGl0b3JJbnB1dAotICAgICAqIEBzaW5jZSAzLjAKLSAgICAgKiBAaXNzdWUgY29uc2lkZXIgdXNpbmcgYW4gaW50ZXJuYWwgYWRhcHRlciBmb3IgSVBhdGhFZGl0b3JJbnB1dCByYXRoZXIgdGhhbiBhZGRpbmcgdGhpcyBhcyBBUEkKLSAgICAgKi8KLSAgICBwdWJsaWMgSVBhdGggZ2V0UGF0aCgpIHsKLSAgICAgICAgcmV0dXJuIGZpbGUuZ2V0TG9jYXRpb24oKTsKLSAgICB9Ci0gICAgCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCN0b1N0cmluZygpCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgcmV0dXJuIGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIigiICsgZ2V0RmlsZSgpLmdldEZ1bGxQYXRoKCkgKyAiKSI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2NvcmUvcGFydC9JRGlhZ3JhbUVkaXRvcklucHV0UHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2NvcmUvcGFydC9JRGlhZ3JhbUVkaXRvcklucHV0UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjE1N2U5Ny4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9jb3JlL3BhcnQvSURpYWdyYW1FZGl0b3JJbnB1dFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnBhcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICoKLSAqIEBzaW5jZSAxLjIKLSAqLwotcHVibGljIGludGVyZmFjZSBJRGlhZ3JhbUVkaXRvcklucHV0UHJvdmlkZXIgewotCURpYWdyYW1FZGl0b3JJbnB1dCBnZXREaWFncmFtRWRpdG9ySW5wdXQoKTsKLQlJRWRpdG9yUGFydCBnZXRFZGl0b3IoKTsKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2NvcmUvcGFydC9JRGlhZ3JhbUZpbGVFZGl0b3JJbnB1dFByb3h5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9jb3JlL3BhcnQvSURpYWdyYW1GaWxlRWRpdG9ySW5wdXRQcm94eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYmI1NTdhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2NvcmUvcGFydC9JRGlhZ3JhbUZpbGVFZGl0b3JJbnB1dFByb3h5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLyoqCi0gKiAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnBhcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXNvdXJjZXMuZWRpdG9yLmRvY3VtZW50Lk1FZGl0aW5nRG9tYWluRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRmlsZUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklQYXRoRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVBlcnNpc3RhYmxlRWxlbWVudDsKLQotLyoqCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSURpYWdyYW1GaWxlRWRpdG9ySW5wdXRQcm94eSBleHRlbmRzIE1FZGl0aW5nRG9tYWluRWxlbWVudCwKLQkJSUZpbGVFZGl0b3JJbnB1dCwgSVBhdGhFZGl0b3JJbnB1dCwgSVBlcnNpc3RhYmxlRWxlbWVudCB7Ci0JCi0JcHVibGljIERpYWdyYW1FZGl0b3JJbnB1dCBnZXREaWFncmFtRWRpdG9ySW5wdXQoKTsKLQkKLQlwdWJsaWMgdm9pZCBzZXRUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbihUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiBkb21haW4pOwotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vY29yZS9wYXJ0L3V0aWwvRGlhZ3JhbUVkaXRvclV0aWwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2NvcmUvcGFydC91dGlsL0RpYWdyYW1FZGl0b3JVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5MmY2NDguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vY29yZS9wYXJ0L3V0aWwvRGlhZ3JhbUVkaXRvclV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkwMSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5wYXJ0LnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVN0b3JhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQWJzdHJhY3RUcmVlSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5pbXBsLkludGVybmFsVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLnV0aWwuVHJhbnNhY3Rpb25VdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi53b3Jrc3BhY2UuQWJzdHJhY3RFTUZPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5Db21tb25QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5EaWFncmFtQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLmJyaWRnZS5BY3Rpdml0eURpYWdyYW1BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuYnJpZGdlLkJyaWRnZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLmJyaWRnZS5EaWFncmFtQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLmJyaWRnZS5Ob2RlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnBhcnQuQWJzdHJhY3REaWFncmFtRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUucGFydC5EaWFncmFtRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5wYXJ0LkRpYWdyYW1FZGl0b3JJbnB1dFByb3h5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUucGFydC5EaWFncmFtRmlsZUVkaXRvcklucHV0UHJveHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5wYXJ0LklEaWFncmFtRWRpdG9ySW5wdXRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnBhcnQuSURpYWdyYW1GaWxlRWRpdG9ySW5wdXRQcm94eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnByb3ZpZGVycy5TaGFyZWRSZXNvdXJjZURpYWdyYW1Eb2N1bWVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUucmVzb3VyY2VzLklEaWFncmFtU3RvcmFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnNlcnZpY2VzLkRpYWdyYW1NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUudXRpbC5EaWFncmFtQ29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuQWN0aXZpdHlEZXRhaWxEaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk1vZGVsRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5OYW1lZE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Sb2xlVGFza0NvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Xb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuRGlhZ3JhbUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5Ob2RlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC51dGlsLlR4VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuSURpYWdyYW1NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Qcm9jZXNzVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuU3VwcHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuQ29ubmVjdGlvbkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkdyYXBoaWNhbFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS51dGlsLlN0cmluZ1N0YXRpY3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLnByZWZlcmVuY2VzLlByZWZlcmVuY2VzSGludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5Db25uZWN0aW9uTm9kZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLkRpYWdyYW1FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5HcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JVGV4dEF3YXJlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wYXJ0cy5JRGlhZ3JhbVdvcmtiZW5jaFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXNvdXJjZXMuZWRpdG9yLmRvY3VtZW50LklEb2N1bWVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVzb3VyY2VzLmVkaXRvci5wYXJ0cy5EaWFncmFtRG9jdW1lbnRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5FZGdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkZvbnRTdHlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob3RhdGlvblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRmlsZUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBhcnRJbml0RXhjZXB0aW9uOwotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIHNrYW5ub29yCi0gKiBAc2luY2UgMS4yCi0gKi8KLXB1YmxpYyBjbGFzcyBEaWFncmFtRWRpdG9yVXRpbCB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFEX0VESVRPUl9JRCA9ICJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5wYXJ0LkFjdGl2aXR5RGlhZ3JhbUVkaXRvcklEIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBRERfRURJVE9SX0lEID0gIm9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5wYXJ0LkFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvcklEIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBXUEREX0VESVRPUl9JRCA9ICJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLnBhcnQuV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbUVkaXRvcklEIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RWRpdG9ySWQoaW50IGRpYWdyYW1UeXBlKSB7Ci0JCXN3aXRjaChkaWFncmFtVHlwZSkgewotCQljYXNlIElEaWFncmFtTWFuYWdlci5BQ1RJVklUWV9ESUFHUkFNOgotCQkJcmV0dXJuIEFEX0VESVRPUl9JRDsKLQkJY2FzZSBJRGlhZ3JhbU1hbmFnZXIuQUNUSVZJVFlfREVUQUlMX0RJQUdSQU06Ci0JCQlyZXR1cm4gQUREX0VESVRPUl9JRDsKLQkJY2FzZSBJRGlhZ3JhbU1hbmFnZXIuV09SS19QUk9EVUNUX0RFUEVOREVOQ1lfRElBR1JBTToKLQkJCXJldHVybiBXUEREX0VESVRPUl9JRDsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIElFZGl0b3JQYXJ0IG9wZW5EaWFncmFtRWRpdG9yKElXb3JrYmVuY2hQYWdlIHBhZ2UsIERpYWdyYW1FZGl0b3JJbnB1dCBpbnB1dCwgUHJlZmVyZW5jZXNIaW50IGhpbnQsIElQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yKSB7Ci0JCURpYWdyYW1FZGl0b3JJbnB1dFByb3h5IGlucHV0UHJveHkgPSBuZXcgRGlhZ3JhbUVkaXRvcklucHV0UHJveHkoaW5wdXQsIGhpbnQpOwotCi0JCUlFZGl0b3JQYXJ0IGVkaXRvclBhcnQgPSBudWxsOwotCQl0cnkgewotCQkJZWRpdG9yUGFydCA9IHBhZ2Uub3BlbkVkaXRvcihpbnB1dFByb3h5LCBnZXRFZGl0b3JJZChpbnB1dC5nZXREaWFncmFtVHlwZSgpKSwgdHJ1ZSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlDb21tb25QbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQl9Ci0KLQkJaWYoZWRpdG9yUGFydCBpbnN0YW5jZW9mIEFic3RyYWN0RGlhZ3JhbUVkaXRvcil7Ci0JCQlpZihpbnB1dC5nZXREaWFncmFtVHlwZSgpID09IElEaWFncmFtTWFuYWdlci5BQ1RJVklUWV9ERVRBSUxfRElBR1JBTSkgewotCQkJCUFic3RyYWN0RGlhZ3JhbUVkaXRvciBlZGl0b3IgPSAoKEFic3RyYWN0RGlhZ3JhbUVkaXRvcillZGl0b3JQYXJ0KTsKLQkJCQllZGl0b3IucmVzZXRMYXlvdXQoKTsKLQkJCQkvLyBUT0RPOiBoYXMgdG8gY2FsbCByZXNldExheW91dCB0d2ljZSBoZXJlIHNvIGl0IGNhbiBsYXlvdXQgcHJvcGVybHkKLQkJCQkvLyBuZWVkIHRvIGltcHJvdmUgdGhpcyBtZXRob2QKLQkJCQkvLwotCQkJCWVkaXRvci5yZXNldExheW91dCgpOwotCQkJfQotCQkJCi0JCQlJRG9jdW1lbnRQcm92aWRlciBkb2NQcm92aWRlciA9ICgoRGlhZ3JhbURvY3VtZW50RWRpdG9yKWVkaXRvclBhcnQpLmdldERvY3VtZW50UHJvdmlkZXIoKTsKLQotCQkJLy8gc2V0IHRoZSBkb2N1bWVudCBhcyBzYXZhYmxlIGlmIHRoZSBkaWFncmFtIGlzIG5ldwotCQkJLy8KLQkJCW9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzcyBwcm9jID0gVG5nVXRpbC5nZXRPd25pbmdQcm9jZXNzKGlucHV0LmdldE1ldGhvZEVsZW1lbnQoKSk7Ci0JCQlpZihwcm9jICE9IG51bGwpIHsKLQkJCQlEaWFncmFtTWFuYWdlciBtZ3IgPSBudWxsOwotCQkJCU9iamVjdCBjb25zdW1lciA9IG5ldyBPYmplY3QoKTsKLQkJCQl0cnkgewotCQkJCQltZ3IgPSBEaWFncmFtTWFuYWdlci5nZXRJbnN0YW5jZShwcm9jLCBjb25zdW1lcik7Ci0JCQkJCWlmKG1nciAhPSBudWxsICYmIGlucHV0UHJveHkuaXNOZXdEaWFncmFtKCkpIHsKLQkJCQkJCWRvY1Byb3ZpZGVyLnNldENhblNhdmVEb2N1bWVudChpbnB1dFByb3h5KTsKLQkJCQkJfQotCQkJCX0KLQkJCQlmaW5hbGx5IHsKLQkJCQkJaWYobWdyICE9IG51bGwpIHsKLQkJCQkJCW1nci5yZW1vdmVDb25zdW1lcihjb25zdW1lcik7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCS8vIGluaXRpYWxpemF0aW9uIG1pZ2h0IGhhdmUgbWFkZSB0aGUgZG9jdW1lbnQgZGlydHkKLQkJCS8vIHRoaXMgd2lsbCBjbGVhciBkaXJ0eSBmbGFnIG9mIHRoZSBlZGl0b3IKLQkJCS8vCi0JCQlpZiAoZG9jUHJvdmlkZXIgaW5zdGFuY2VvZiBTaGFyZWRSZXNvdXJjZURpYWdyYW1Eb2N1bWVudFByb3ZpZGVyCi0JCQkJCSYmIGVkaXRvclBhcnQuaXNEaXJ0eSgpCi0JCQkJCSYmICFpbnB1dFByb3h5LmlzTmV3RGlhZ3JhbSgpKSB7Ci0JCQkJKChTaGFyZWRSZXNvdXJjZURpYWdyYW1Eb2N1bWVudFByb3ZpZGVyKSBkb2NQcm92aWRlcikKLQkJCQkubWFya0RvY3VtZW50QXNTYXZlZChpbnB1dFByb3h5KTsKLQkJCX0JCQkKLQotCQkJLy8gQ2hlY2sgd2hldGhlciBkaWFncmFtIGlzIHJlYWQtb25seSBhbmQgcGx1Zy1pbiBpcyBsb2NrZWQuIAotCQkJLy8KLQkJCWlmKCFpc01vZGlmaWFibGUoaW5wdXRQcm94eSkpewotCQkJCSgoU2hhcmVkUmVzb3VyY2VEaWFncmFtRG9jdW1lbnRQcm92aWRlcikoKEFic3RyYWN0RGlhZ3JhbUVkaXRvcillZGl0b3JQYXJ0KS5nZXREb2N1bWVudFByb3ZpZGVyKCkpLmxvY2sodHJ1ZSk7Ci0JCQkJRGlhZ3JhbUVkaXRQYXJ0IGVkaXRQYXJ0ID0gKChJRGlhZ3JhbVdvcmtiZW5jaFBhcnQpZWRpdG9yUGFydCkuZ2V0RGlhZ3JhbUVkaXRQYXJ0KCk7Ci0JCQkJZWRpdFBhcnQuZGlzYWJsZUVkaXRNb2RlKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVkaXRvclBhcnQ7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCByZWZyZXNoVmlzdWFsKERpYWdyYW1FZGl0UGFydCBlZGl0UGFydCkgewotCQkvLyByZWZyZXNoIGxhYmVscwotCQkvLwotCQlJdGVyYXRvcjxPYmplY3Q+IGl0ZXIgPSBuZXcgQWJzdHJhY3RUcmVlSXRlcmF0b3I8T2JqZWN0PihlZGl0UGFydCwgZmFsc2UpIHsKLQotCQkJLyoqCi0JCQkgKiAKLQkJCSAqLwotCQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEl0ZXJhdG9yPD8+IGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJCQlpZihvYmplY3QgaW5zdGFuY2VvZiBFZGl0UGFydCkgewotCQkJCQlyZXR1cm4gKChFZGl0UGFydClvYmplY3QpLmdldENoaWxkcmVuKCkuaXRlcmF0b3IoKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1QuaXRlcmF0b3IoKTsKLQkJCX0KLQkJCQotCQl9OwotCQl3aGlsZShpdGVyLmhhc05leHQoKSkgewotCQkJT2JqZWN0IGNoaWxkID0gaXRlci5uZXh0KCk7Ci0JCQlpZihjaGlsZCBpbnN0YW5jZW9mIElUZXh0QXdhcmVFZGl0UGFydCB8fCBjaGlsZCBpbnN0YW5jZW9mIENvbm5lY3Rpb25Ob2RlRWRpdFBhcnQpIHsKLQkJCQkoKEVkaXRQYXJ0KWNoaWxkKS5yZWZyZXNoKCk7Ci0JCQl9Ci0JCX0KLQotCQkvLyByZWZyZXNoIGNvbm5lY3Rpb25zCi0JCS8vCi0JCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBlZGl0UGFydC5nZXRDb25uZWN0aW9ucygpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCUNvbm5lY3Rpb25FZGl0UGFydCBjb25uID0gKENvbm5lY3Rpb25FZGl0UGFydCkgaXRlcmF0b3IubmV4dCgpOwotCQkJY29ubi5yZWZyZXNoKCk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlZnJlc2hMYWJlbHMoRGlhZ3JhbUVkaXRQYXJ0IGVkaXRQYXJ0KSB7Ci0vLwkJLy8gbWFrZSBzdXJlIHRoYXQgdGhlIGVkaXQgcGFydCBmaWd1cmUgaXMgbGFyZ2UgZW5vdWdoIHRvIHNob3cgdGhlIGljb24gYW5kIGFsbCB0aGUgdGV4dAotLy8JCS8vCi0vLwkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGVkaXRQYXJ0LmdldENoaWxkcmVuKCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotLy8JCQlPYmplY3QgY2hpbGQgPSAoT2JqZWN0KSBpdGVyYXRvci5uZXh0KCk7Ci0vLwkJCWlmKGNoaWxkIGluc3RhbmNlb2YgR3JhcGhpY2FsRWRpdFBhcnQpIHsKLS8vCQkJCUlGaWd1cmUgZiA9ICgoR3JhcGhpY2FsRWRpdFBhcnQpY2hpbGQpLmdldEZpZ3VyZSgpOwotLy8JCQkJaWYoZiBpbnN0YW5jZW9mIERlZmF1bHRTaXplTm9kZUZpZ3VyZSkgewotLy8JCQkJCU9iamVjdCBmMiA9ICgoRGVmYXVsdFNpemVOb2RlRmlndXJlKWYpLmdldENoaWxkcmVuKCkuZ2V0KDApOwotLy8JCQkJaWYoZjIgaW5zdGFuY2VvZiBSZWN0YW5nbGVGaWd1cmUpIHsKLS8vCQkJCQlSZWN0YW5nbGVGaWd1cmUgZmlndXJlID0gKFJlY3RhbmdsZUZpZ3VyZSkgZjI7Ci0vLwkJCQkJTGlzdCBjaGlsZHJlbiA9ICgoUmVjdGFuZ2xlRmlndXJlKWZpZ3VyZSkuZ2V0Q2hpbGRyZW4oKTsKLS8vCQkJCQlpZighY2hpbGRyZW4uaXNFbXB0eSgpKSB7Ci0vLwkJCQkJCU9iamVjdCBsID0gY2hpbGRyZW4uZ2V0KDApOwotLy8JCQkJCQlpZihsIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0vLwkJCQkJCQlXcmFwTGFiZWwgbGFiZWwgPSAoKFdyYXBMYWJlbClsKTsKLS8vCQkJCQkJCVJlY3RhbmdsZSByID0gZmlndXJlLmdldEJvdW5kcygpOwotLy8JCQkJCQkJRGltZW5zaW9uIGQgPSBmaWd1cmUuZ2V0UHJlZmVycmVkU2l6ZSgpOwotLy8JCQkJCQkJUmVjdGFuZ2xlIHRleHRSID0gbGFiZWwuZ2V0VGV4dEJvdW5kcygpOwkJCQkJCQkKLS8vLy8vLwkJCQkJCQl0ZXh0Ui53aWR0aCArPSAodGV4dFIud2lkdGggKiBXaWRlbmVkV3JhcExhYmVsLkRFTFRBX0ZBQ1RPUik7Ci0vLy8vCQkJCQkJCXRleHRSLndpZHRoICs9IDIwOwotLy8vLwkJCQkJCQlpZihyLndpZHRoIDwgZC53aWR0aCB8fCByLmhlaWdodCA8IGQuaGVpZ2h0KSB7Ci0vLy8vCQkJCQkJCQlXcmFwTGFiZWwgbGFiZWwgPSAoKFdyYXBMYWJlbClsKTsKLS8vLy8JCQkJCQkJCWxhYmVsLmludmFsaWRhdGUoKTsKLS8vLy8JCQkJCQkJCWZpZ3VyZS5zZXRCb3VuZHMoci51bmlvbih0ZXh0UikpOwkKLS8vLy8vLwkJCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKGxhYmVsLmdldFN1YlN0cmluZ1RleHQoKSk7Ci0vLy8vCQkJCQkJCX0KLS8vLy8JCQkJCQkJaWYoIkRlc2lnbiB0aGUgU29sdXRpb24iLmVxdWFscyhsYWJlbC5nZXRUZXh0KCkpKSB7CQkKLS8vCQkJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlRleHQ6ICciICsgbGFiZWwuZ2V0VGV4dCgpICsgIiciKTsKLS8vCQkJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxhYmVsIGZvbnQ6ICIgKyBsYWJlbC5nZXRGb250KCkpOwotLy8JCQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRGVmYXVsdCBmb250OiAiICsgRGlhZ3JhbUNvbnN0YW50cy5ERUZBVUxUX0ZPTlQpOwotLy8JCQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiQ2FsY3VsYXRlZCB0ZXh0IHNpemU6ICIgKyBEaWFncmFtQ29yZVV0aWwuZ2V0VGV4dFNpemVJbldyYXBMYWJlbChsYWJlbC5nZXRUZXh0KCksIG51bGwsIHIud2lkdGgsIHIuaGVpZ2h0LCBudWxsKSk7Ci0vLwkJCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJDdXJyZW50IHRleHQgd2lkdGg6ICIgKyB0ZXh0Ui53aWR0aCk7Ci0vLwkJCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJOb2RlIHdpZHRoOiAiICsgci53aWR0aCk7Ci0vLy8vCQkJCQkJCX0KLS8vCQkJCQkJfQotLy8JCQkJCX0KLS8vCQkJCX0KLS8vCQkJCX0KLS8vCQkJfQkJCQotLy8JCX0KLQkJCi0JCUl0ZXJhdG9yIGl0ZXIgPSBuZXcgQWJzdHJhY3RUcmVlSXRlcmF0b3IoZWRpdFBhcnQsIGZhbHNlKSB7Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEl0ZXJhdG9yIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJCQlpZihvYmplY3QgaW5zdGFuY2VvZiBFZGl0UGFydCkgewotCQkJCQlyZXR1cm4gKChFZGl0UGFydClvYmplY3QpLmdldENoaWxkcmVuKCkuaXRlcmF0b3IoKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1QuaXRlcmF0b3IoKTsKLQkJCX0KLQkJCQotCQl9OwotCQl3aGlsZShpdGVyLmhhc05leHQoKSkgewotCQkJT2JqZWN0IGNoaWxkID0gaXRlci5uZXh0KCk7Ci0JCQlpZihjaGlsZCBpbnN0YW5jZW9mIElUZXh0QXdhcmVFZGl0UGFydCkgewotCQkJCSgoSVRleHRBd2FyZUVkaXRQYXJ0KWNoaWxkKS5yZWZyZXNoKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgRGlhZ3JhbSBnZXREaWFncmFtKERpYWdyYW1FZGl0b3JJbnB1dFByb3h5IGlucHV0UHJveHkpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJSVN0b3JhZ2Ugc3RvcmFnZSA9IGlucHV0UHJveHkuZ2V0U3RvcmFnZSgpOwotCQlyZXR1cm4gc3RvcmFnZSBpbnN0YW5jZW9mIElEaWFncmFtU3RvcmFnZSA/ICgoSURpYWdyYW1TdG9yYWdlKXN0b3JhZ2UpLmdldERpYWdyYW0oKSA6IG51bGw7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gZG9Jbml0aWFsaXplKAotCQkJZmluYWwgRGlhZ3JhbUVkaXRvcklucHV0UHJveHkgaW5wdXRQcm94eSwKLQkJCUlQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlmaW5hbCBEaWFncmFtIG1vZGVsID0gZ2V0RGlhZ3JhbShpbnB1dFByb3h5KTsKLQkJaWYobW9kZWwgPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWlmKERpYWdyYW1NYW5hZ2VyLkFEX2tpbmQuZXF1YWxzKG1vZGVsLmdldFR5cGUoKSkpIHsKLQkJCUFjdGl2aXR5RGlhZ3JhbUFkYXB0ZXIgYWRhcHRlciA9IChBY3Rpdml0eURpYWdyYW1BZGFwdGVyKSBCcmlkZ2VIZWxwZXIuZ2V0Tm9kZUFkYXB0ZXIobW9kZWwuZ2V0RWxlbWVudCgpKTsKLQkJCWlmKGFkYXB0ZXIgPT0gbnVsbCkgewotCQkJCWFkYXB0ZXIgPSBuZXcgQWN0aXZpdHlEaWFncmFtQWRhcHRlcigKLQkJCQkJCQkJKEFjdGl2aXR5KSBpbnB1dFByb3h5Ci0JCQkJCQkJCQkJLmdldERpYWdyYW1FZGl0b3JJbnB1dCgpLmdldE1ldGhvZEVsZW1lbnQoKSk7Ci0JCQkJYWRhcHRlcgotCQkJCQkJLnNldEVkaXRpbmdEb21haW4oKEludGVybmFsVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4pIFRyYW5zYWN0aW9uVXRpbAotCQkJCQkJCQkuZ2V0RWRpdGluZ0RvbWFpbihtb2RlbCkpOwotCQkJCWFkYXB0ZXIuc2V0U3VwcHJlc3Npb24oaW5wdXRQcm94eQotCQkJCQkJLmdldERpYWdyYW1FZGl0b3JJbnB1dCgpLmdldFN1cHByZXNzaW9uKCkpOwotCQkJCWFkYXB0ZXIuc2V0Vmlldyhtb2RlbCk7Ci0JCQkJbW9kZWwuZ2V0RWxlbWVudCgpLmVBZGFwdGVycygpLmFkZChhZGFwdGVyKTsKLQkJCX0KLQkJCWFkYXB0ZXIucG9wdWxhdGVEaWFncmFtKCk7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQllbHNlIGlmKERpYWdyYW1NYW5hZ2VyLkFERF9raW5kLmVxdWFscyhtb2RlbC5nZXRUeXBlKCkpCi0JCQkJfHwgRGlhZ3JhbU1hbmFnZXIuV1BEX2tpbmQuZXF1YWxzKG1vZGVsLmdldFR5cGUoKSkpIHsKLQkJCVRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIGRvbWFpbiA9IFRyYW5zYWN0aW9uVXRpbC5nZXRFZGl0aW5nRG9tYWluKG1vZGVsKTsKLQkJCUFic3RyYWN0RU1GT3BlcmF0aW9uIG9wID0gbmV3IEFic3RyYWN0RU1GT3BlcmF0aW9uKGRvbWFpbiwgU3RyaW5nU3RhdGljcy5CTEFOSykgewotCQkJCi0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIElTdGF0dXMgZG9FeGVjdXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKQotCQkJCQkJdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCQkJCW9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkRpYWdyYW0gZCA9IAotCQkJCQkJKG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkRpYWdyYW0pIG1vZGVsLmdldEVsZW1lbnQoKTsKLQkJCQkJRGlhZ3JhbUVkaXRvcklucHV0IGlucHV0ID0gaW5wdXRQcm94eS5nZXREaWFncmFtRWRpdG9ySW5wdXQoKTsKLQkJCQkJZC5zZXRTdXBwcmVzc2lvbihpbnB1dC5nZXRTdXBwcmVzc2lvbigpKTsKLQkJCQkJZC5zZXRMaW5rZWRFbGVtZW50KGlucHV0LmdldE1ldGhvZEVsZW1lbnQoKSk7Ci0JCQkJCWQuc2V0T2JqZWN0KGQuZ2V0TGlua2VkRWxlbWVudCgpKTsKLQotCQkJCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQkJCQl9Ci0JCQkKLQkJCX07Ci0JCQl0cnkgewotCQkJCW9wLmV4ZWN1dGUobW9uaXRvciwgbnVsbCk7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9IGNhdGNoIChFeGVjdXRpb25FeGNlcHRpb24gZSkgewotCQkJCUNvbW1vblBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQl9Ci0JCX0gCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIGluaXRpYWxpemVPbkFjdGl2YXRlKERpYWdyYW1FZGl0UGFydCBlZGl0UGFydCkgewotCQlpZihlZGl0UGFydC5nZXRWaWV3ZXIoKSBpbnN0YW5jZW9mIElEaWFncmFtRWRpdG9ySW5wdXRQcm92aWRlcikgewotCQkJSUVkaXRvclBhcnQgZWRpdG9yID0gKChJRGlhZ3JhbUVkaXRvcklucHV0UHJvdmlkZXIpZWRpdFBhcnQuZ2V0Vmlld2VyKCkpLmdldEVkaXRvcigpOwotCQkJaWYoZWRpdG9yICE9IG51bGwgJiYgZWRpdG9yLmdldEVkaXRvcklucHV0KCkgaW5zdGFuY2VvZiBEaWFncmFtRWRpdG9ySW5wdXRQcm94eSkgewotCQkJCURpYWdyYW1FZGl0b3JJbnB1dFByb3h5IGlucHV0UHJveHkgPSAoRGlhZ3JhbUVkaXRvcklucHV0UHJveHkpIGVkaXRvci5nZXRFZGl0b3JJbnB1dCgpOwotCQkJCUlQcm9ncmVzc01vbml0b3IgbW9uaXRvciA9IG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCk7Ci0JCQkJdHJ5IHsKLQkJCQkJaWYoZG9Jbml0aWFsaXplKGlucHV0UHJveHksIG1vbml0b3IpKSB7Ci0JCQkJCQlkb1JlZnJlc2goZWRpdFBhcnQsIG1vbml0b3IsIGZhbHNlKTsKLQkJCQkJCXJlZnJlc2hWaXN1YWwoZWRpdFBhcnQpOwotCQkJCQl9Ci0JCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCURpYWdyYW1Db3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCQl9Ci0JCQkJCi0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgaW5pdGlhbGl6ZShmaW5hbCBEaWFncmFtRWRpdFBhcnQgZWRpdFBhcnQsIGZpbmFsIERpYWdyYW1FZGl0b3JJbnB1dFByb3h5IGlucHV0UHJveHksIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewkJCi0JCXRyeSB7Ci0JCQlpZihkb0luaXRpYWxpemUoaW5wdXRQcm94eSwgbW9uaXRvcikpIHsKLQkJCQlyZWZyZXNoKGVkaXRQYXJ0LCBtb25pdG9yKTsKLQkJCQlyZWZyZXNoTGFiZWxzKGVkaXRQYXJ0KTsKLQkJCX0KLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlEaWFncmFtQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCX0KLQl9Ci0JcHJpdmF0ZSBzdGF0aWMgdm9pZCB1cGRhdGVFZGdlcyhWaWV3IHZpZXcpewotCQlib29sZWFuIGFsbFZpc2libGUgPSBmYWxzZTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gdmlldy5nZXRDaGlsZHJlbigpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJVmlldyBjaGlsZCA9IChWaWV3KSBpdGVyLm5leHQoKTsKLQkJCWlmKGNoaWxkLmdldEVsZW1lbnQoKSBpbnN0YW5jZW9mIE5vZGVJbXBsKSB7Ci0JCQkJTm9kZUltcGwgbm9kZSA9IChOb2RlSW1wbCljaGlsZC5nZXRFbGVtZW50KCk7Ci0JCQkJaWYoIW5vZGUuaXNWaXNpYmxlKCkpewotCQkJCQlzZXRFZGdlVmlzaWJpbGl0eSh2aWV3LCBub2RlLmlzVmlzaWJsZSgpKTsKLQkJCQl9ZWxzZXsKLQkJCQkJY2hpbGQuc2V0VmlzaWJsZShub2RlLmlzVmlzaWJsZSgpKTsKLQkJCQkJc2V0RWRnZVZpc2liaWxpdHkoY2hpbGQsIHRydWUpOwotCQkJCX0KLQkJCQlpZihub2RlIGluc3RhbmNlb2YgTmFtZWROb2RlKSB7Ci0JCQkJCUZvbnRTdHlsZSBzdHlsZSA9IChGb250U3R5bGUpIGNoaWxkLmdldFN0eWxlKE5vdGF0aW9uUGFja2FnZS5MaXRlcmFscy5GT05UX1NUWUxFKTsKLQkJCQkJaWYoc3R5bGUgPT0gbnVsbCkgewotCQkJCQkJc3R5bGUgPSAoRm9udFN0eWxlKSBjaGlsZC5jcmVhdGVTdHlsZShOb3RhdGlvblBhY2thZ2UuTGl0ZXJhbHMuRk9OVF9TVFlMRSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYoY2hpbGQuaXNWaXNpYmxlKCkgJiYgY2hpbGQuZ2V0RWxlbWVudCgpIGluc3RhbmNlb2YgTm9kZUNvbnRhaW5lcikgewotCQkJCQl1cGRhdGVFZGdlcyhjaGlsZCk7Ci0JCQkJfQotCQkJCWlmKG5vZGUuaXNWaXNpYmxlKCkpewotCQkJCQlhbGxWaXNpYmxlID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYodmlldy5nZXRFbGVtZW50KCkgaW5zdGFuY2VvZiBOb2RlQ29udGFpbmVyIAotCQkJCSYmICEodmlldy5nZXRFbGVtZW50KCkgaW5zdGFuY2VvZiBBY3Rpdml0eURldGFpbERpYWdyYW0pCi0JCQkJJiYgISh2aWV3LmdldEVsZW1lbnQoKSBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW0pKXsKLQkJCXNldEVkZ2VWaXNpYmlsaXR5KHZpZXcsIGFsbFZpc2libGUpOwotCQl9Ci0JCQotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyB2b2lkIHNldEVkZ2VWaXNpYmlsaXR5KFZpZXcgdmlldywgYm9vbGVhbiB2aXNpYmlsaXR5KXsKLQkJRGlhZ3JhbSBkaWFncmFtID0gdmlldy5nZXREaWFncmFtKCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBkaWFncmFtLmdldEVkZ2VzKCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IKLQkJCQkuaGFzTmV4dCgpOykgewotCQkJRWRnZSBlZGdlID0gKEVkZ2UpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmKGVkZ2UuZ2V0U291cmNlKCkgPT0gdmlldyB8fCBlZGdlLmdldFRhcmdldCgpID09IHZpZXcpewotCQkJCWlmKHZpc2liaWxpdHkpewotCQkJCQl2aWV3LnNldFZpc2libGUodHJ1ZSk7Ci0JCQkJfQotCQkJCWVkZ2Uuc2V0VmlzaWJsZSh2aXNpYmlsaXR5KTsKLQkJCX0KLQkJfQotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyB2b2lkIHVwZGF0ZVZpZXcoVmlldyB2aWV3KSB7Ci0JCWJvb2xlYW4gYWxsVmlzaWJsZSA9IGZhbHNlOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB2aWV3LmdldENoaWxkcmVuKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlWaWV3IGNoaWxkID0gKFZpZXcpIGl0ZXIubmV4dCgpOwotCQkJaWYoY2hpbGQuZ2V0RWxlbWVudCgpIGluc3RhbmNlb2YgTm9kZUltcGwpIHsKLQkJCQlOb2RlSW1wbCBub2RlID0gKE5vZGVJbXBsKWNoaWxkLmdldEVsZW1lbnQoKTsKLQkJCQljaGlsZC5zZXRWaXNpYmxlKG5vZGUuaXNWaXNpYmxlKCkpOwotCQkJCWlmKG5vZGUgaW5zdGFuY2VvZiBOYW1lZE5vZGUpIHsKLQkJCQkJRm9udFN0eWxlIHN0eWxlID0gKEZvbnRTdHlsZSkgY2hpbGQuZ2V0U3R5bGUoTm90YXRpb25QYWNrYWdlLkxpdGVyYWxzLkZPTlRfU1RZTEUpOwotCQkJCQlpZihzdHlsZSA9PSBudWxsKSB7Ci0JCQkJCQlzdHlsZSA9IChGb250U3R5bGUpIGNoaWxkLmNyZWF0ZVN0eWxlKE5vdGF0aW9uUGFja2FnZS5MaXRlcmFscy5GT05UX1NUWUxFKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlpZihjaGlsZC5pc1Zpc2libGUoKSAmJiBjaGlsZC5nZXRFbGVtZW50KCkgaW5zdGFuY2VvZiBOb2RlQ29udGFpbmVyKSB7Ci0JCQkJCXVwZGF0ZVZpZXcoY2hpbGQpOwotCQkJCX0KLQkJCQlpZihub2RlLmlzVmlzaWJsZSgpKXsKLQkJCQkJYWxsVmlzaWJsZSA9IHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQlpZih2aWV3LmdldEVsZW1lbnQoKSBpbnN0YW5jZW9mIE5vZGVDb250YWluZXIgCi0JCQkJJiYgISh2aWV3LmdldEVsZW1lbnQoKSBpbnN0YW5jZW9mIEFjdGl2aXR5RGV0YWlsRGlhZ3JhbSkKLQkJCQkmJiAhKHZpZXcuZ2V0RWxlbWVudCgpIGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbSkpIHsKLS8vCQkJaWYoIWFsbFZpc2libGUpIHsKLS8vCQkJCVN5c3RlbS5vdXQucHJpbnRsbigpOwotLy8JCQl9Ci0JCQl2aWV3LnNldFZpc2libGUoYWxsVmlzaWJsZSk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzSW5oZXJpdGVkKEVkaXRQYXJ0IGVkaXRQYXJ0KSB7Ci0JCUVkaXRQYXJ0Vmlld2VyIHZpZXdlciA9IGVkaXRQYXJ0LmdldFZpZXdlcigpOwotCQlpZih2aWV3ZXIgaW5zdGFuY2VvZiBJRGlhZ3JhbUVkaXRvcklucHV0UHJvdmlkZXIpIHsKLQkJCURpYWdyYW1FZGl0b3JJbnB1dCBpbnB1dCA9ICgoSURpYWdyYW1FZGl0b3JJbnB1dFByb3ZpZGVyKXZpZXdlcikuZ2V0RGlhZ3JhbUVkaXRvcklucHV0KCk7Ci0JCQlyZXR1cm4gaXNJbmhlcml0ZWQoaW5wdXQpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0luaGVyaXRlZChEaWFncmFtRWRpdG9ySW5wdXQgaW5wdXQpIHsKLQkJcmV0dXJuIGlucHV0ICE9IG51bGwgJiYgaW5wdXQuZ2V0V3JhcHBlcigpICE9IG51bGwKLQkJCQkmJiBpbnB1dC5nZXRXcmFwcGVyKCkuaXNJbmhlcml0ZWQoKTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgQ29sbGVjdGlvbiBnZXRTZW1hbnRpY0NoaWxkcmVuKERpYWdyYW1FZGl0UGFydCBlZGl0UGFydCkgewotCQlFZGl0UGFydFZpZXdlciB2aWV3ZXIgPSBlZGl0UGFydC5nZXRWaWV3ZXIoKTsKLQkJaWYodmlld2VyIGluc3RhbmNlb2YgSURpYWdyYW1FZGl0b3JJbnB1dFByb3ZpZGVyKSB7Ci0JCQlEaWFncmFtRWRpdG9ySW5wdXQgaW5wdXQgPSAoKElEaWFncmFtRWRpdG9ySW5wdXRQcm92aWRlcil2aWV3ZXIpLmdldERpYWdyYW1FZGl0b3JJbnB1dCgpOwotCQkJaWYoaW5wdXQgIT0gbnVsbCAmJiBpbnB1dC5nZXRXcmFwcGVyKCkgIT0gbnVsbCAmJgotCQkJCQlpbnB1dC5nZXRXcmFwcGVyKCkuaXNJbmhlcml0ZWQoKSkgewotCQkJCU9iamVjdCBtb2RlbCA9IGVkaXRQYXJ0LmdldE1vZGVsKCk7Ci0JCQkJaWYobW9kZWwgaW5zdGFuY2VvZiBWaWV3KSB7Ci0JCQkJCUNvbGxlY3Rpb24gY2hpbGRyZW4gPSBudWxsOwotCQkJCQlEaWFncmFtIGRpYWdyYW0gPSBlZGl0UGFydC5nZXREaWFncmFtVmlldygpOwotCQkJCQlTdHJpbmcgdHlwZSA9IGRpYWdyYW0uZ2V0VHlwZSgpOwotCQkJCQlpZihEaWFncmFtTWFuYWdlci5BRF9raW5kLmVxdWFscyh0eXBlKSkgewotCQkJCQkJRGlhZ3JhbUFkYXB0ZXIgZGEgPSAoKERpYWdyYW1BZGFwdGVyKUJyaWRnZUhlbHBlci5nZXROb2RlQWRhcHRlcihkaWFncmFtLmdldEVsZW1lbnQoKSkpOwotCQkJCQkJaWYoZGEgIT0gbnVsbCkgewotCQkJCQkJCUJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyIHdyYXBwZXIgPSBpbnB1dC5nZXRXcmFwcGVyKCk7Ci0JCQkJCQkJaWYoVG5nVXRpbC5nZXRCZXN0QWRhcHRlckZhY3Rvcnkod3JhcHBlci5nZXRBZGFwdGVyRmFjdG9yeSgpKSAhPSBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRS5nZXRXQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKSB7Ci0JCQkJCQkJCUxpc3Qgd3JhcHBlcnMgPSBQcm9jZXNzVXRpbC5nZXRXcmFwcGVycyh3cmFwcGVyLCBuZXcgQWRhcHRlckZhY3RvcnlbXSB7Ci0JCQkJCQkJCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UuZ2V0V0JTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKX0pOwotCQkJCQkJCQl3cmFwcGVyID0gKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSB3cmFwcGVycy5nZXQoMCk7Ci0JCQkJCQkJfQotCQkJCQkJCUFjdGl2aXR5RGlhZ3JhbUFkYXB0ZXIgYWRhcHRlciA9IG51bGw7Ci0JCQkJCQkJdHJ5IHsKLQkJCQkJCQkJYWRhcHRlciA9IG5ldyBBY3Rpdml0eURpYWdyYW1BZGFwdGVyKHdyYXBwZXIpOwotCQkJCQkJCQlhZGFwdGVyLnNldEZpbHRlcihkYS5nZXRGaWx0ZXIoKSk7Ci0JCQkJCQkJCWFkYXB0ZXIuc2V0U3VwcHJlc3Npb24oU3VwcHJlc3Npb24uZ2V0U3VwcHJlc3Npb24oVG5nVXRpbC5nZXRPd25pbmdQcm9jZXNzKHdyYXBwZXIpKSk7Ci0JCQkJCQkJCWNoaWxkcmVuID0gYWRhcHRlci5nZXRDaGlsZHJlbigpOwotCQkJCQkJCX0KLQkJCQkJCQlmaW5hbGx5IHsKLQkJCQkJCQkJaWYoYWRhcHRlciAhPSBudWxsKSB7Ci0JCQkJCQkJCQlhZGFwdGVyLmRpc3Bvc2UoKTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCQllbHNlIGlmKERpYWdyYW1NYW5hZ2VyLkFERF9raW5kLmVxdWFscyh0eXBlKSB8fCBEaWFncmFtTWFuYWdlci5XUERfa2luZC5lcXVhbHModHlwZSkpIHsKLQkJCQkJCURpYWdyYW1JbXBsIGQ7Ci0JCQkJCQlpZihEaWFncmFtTWFuYWdlci5BRERfa2luZC5lcXVhbHModHlwZSkpIHsKLQkJCQkJCQlkID0gKERpYWdyYW1JbXBsKSBNb2RlbEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUFjdGl2aXR5RGV0YWlsRGlhZ3JhbSgpOwotCQkJCQkJfQotCQkJCQkJZWxzZSB7Ci0JCQkJCQkJZCA9IChEaWFncmFtSW1wbCkgTW9kZWxGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVXb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtKCk7Ci0JCQkJCQl9CQkJCQkJCi0JCQkJCQlEaWFncmFtSW1wbCBkaWFncmFtSW5Vc2UgPSAoKERpYWdyYW1JbXBsKWRpYWdyYW0uZ2V0RWxlbWVudCgpKTsKLQkJCQkJCVN1cHByZXNzaW9uIHN1cHByZXNzaW9uID0gZGlhZ3JhbUluVXNlLmdldFN1cHByZXNzaW9uKCk7Ci0JCQkJCQlpZihzdXBwcmVzc2lvbiAhPSBudWxsKSB7Ci0JCQkJCQkJZC5zZXRXcmFwcGVyKGlucHV0LmdldFdyYXBwZXIoKSk7Ci0JCQkJCQkJZC5zZXRGaWx0ZXIoZGlhZ3JhbUluVXNlLmdldEZpbHRlcigpKTsKLQkJCQkJCQlkLnNldFN1cHByZXNzaW9uKGRpYWdyYW1JblVzZS5nZXRTdXBwcmVzc2lvbigpKTsKLQkJCQkJCQljaGlsZHJlbiA9IGQuZ2V0Q2hpbGRyZW4oKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlyZXR1cm4gY2hpbGRyZW47Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVmcmVzaENvbm5lY3Rpb25zKERpYWdyYW1FZGl0UGFydCBlZGl0UGFydCkgewotCQlEaWFncmFtIGRpYWdyYW0gPSBlZGl0UGFydC5nZXREaWFncmFtVmlldygpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBkaWFncmFtLmdldEVkZ2VzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlFZGdlIGVkZ2UgPSAoRWRnZSkgaXRlci5uZXh0KCk7Ci0JCQlib29sZWFuIHZpc2libGUgPSBlZGdlLmdldFNvdXJjZSgpICE9IG51bGwgJiYgZWRnZS5nZXRTb3VyY2UoKS5pc1Zpc2libGUoKQotCQkJCSYmIGVkZ2UuZ2V0VGFyZ2V0KCkgIT0gbnVsbCAmJiBlZGdlLmdldFRhcmdldCgpLmlzVmlzaWJsZSgpOwotCQkJaWYoZWRnZS5pc1Zpc2libGUoKSAhPSB2aXNpYmxlKSB7Ci0JCQkJZWRnZS5zZXRWaXNpYmxlKHZpc2libGUpOwotCQkJfQotCQl9OwotCQkKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCByZWZyZXNoQ2hpbGRyZW4oRGlhZ3JhbUVkaXRQYXJ0IGVkaXRQYXJ0KSB7Ci0JCUNvbGxlY3Rpb24gc2VtYW50aWNDaGlsZHJlbiA9IGdldFNlbWFudGljQ2hpbGRyZW4oZWRpdFBhcnQpOwotCQlpZihzZW1hbnRpY0NoaWxkcmVuICE9IG51bGwpIHsKLQkJCXJlZnJlc2hDaGlsZHJlbihlZGl0UGFydCwgc2VtYW50aWNDaGlsZHJlbik7Ci0JCQlyZWZyZXNoQ29ubmVjdGlvbnMoZWRpdFBhcnQpOwotCQl9Ci0JfQotCQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBmaWx0ZXJDaGlsZHJlbihFZGl0UGFydCBlZGl0UGFydCwgQ29sbGVjdGlvbiBjaGlsZHJlbikgewotCQlEaWFncmFtRWRpdFBhcnQgZGlhZ3JhbUVkaXRQYXJ0ID0gRGlhZ3JhbUNvcmVVdGlsLmdldERpYWdyYW1FZGl0UGFydChlZGl0UGFydCk7Ci0JCUNvbGxlY3Rpb24gc2VtYW50aWNDaGlsZHJlbiA9IGdldFNlbWFudGljQ2hpbGRyZW4oZGlhZ3JhbUVkaXRQYXJ0KTsKLQkJaWYoc2VtYW50aWNDaGlsZHJlbiA9PSBudWxsKSB7Ci0JCQljaGlsZHJlbi5jbGVhcigpOwotCQl9Ci0JCWVsc2UgewotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gY2hpbGRyZW4uaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJIEVPYmplY3QgY2hpbGQgPSAoRU9iamVjdCkgaXRlci5uZXh0KCk7Ci0JCQkJIE1ldGhvZEVsZW1lbnQgZSA9IEJyaWRnZUhlbHBlci5nZXRNZXRob2RFbGVtZW50KGNoaWxkKTsKLQkJCQkgaWYoZ2V0V3JhcHBlcihlLCBzZW1hbnRpY0NoaWxkcmVuKSA9PSBudWxsKSB7Ci0JCQkJCSBpdGVyLnJlbW92ZSgpOwotCQkJCSB9Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgT2JqZWN0IGdldFdyYXBwZXIoTWV0aG9kRWxlbWVudCBlLCBDb2xsZWN0aW9uIHNlbWFudGljQ2hpbGRyZW4pIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IHNlbWFudGljQ2hpbGRyZW4uaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGMgPSAoT2JqZWN0KSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZihUbmdVdGlsLnVud3JhcChjKSA9PSBlKSB7Ci0JCQkJcmV0dXJuIGM7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qKgotCSAqIFJlZnJlc2hlcyBlZGl0IHBhcnQgb2YgYW4gaW5oZXJpdGVkIGVsZW1lbnQuCi0JICogCi0JICogQHBhcmFtIGVkaXRQYXJ0Ci0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCByZWZyZXNoQ2hpbGRyZW4oRWRpdFBhcnQgZWRpdFBhcnQsIENvbGxlY3Rpb24gc2VtYW50aWNDaGlsZHJlbikgewkJCi0JCS8vIHNwZWNpYWwgaGFuZGxpbmcgZm9yIGVkaXQgcGFydCBvZiBSb2xlVGFza0NvbXBvc2l0ZSB0aGF0IHNob3VsZCBub3QgYmUgc2hvd24gaWYKLQkJLy8gbm9uZSBvZiBpdHMgdGFza3MgYXJlIHZpc2libGUKLQkJLy8KLQkJYm9vbGVhbiBpc1JvbGVUYXNrQ29tcG9zaXRlID0gZmFsc2U7Ci0JCWJvb2xlYW4gaGFzVGFzayA9IGZhbHNlOwotCQlPYmplY3QgbW9kZWwgPSBlZGl0UGFydC5nZXRNb2RlbCgpOwotCQlpZihtb2RlbCBpbnN0YW5jZW9mIFZpZXcgJiYgKChWaWV3KW1vZGVsKS5nZXRFbGVtZW50KCkgaW5zdGFuY2VvZiBSb2xlVGFza0NvbXBvc2l0ZSkgewotCQkJaXNSb2xlVGFza0NvbXBvc2l0ZSA9IHRydWU7Ci0JCX0KLQkJCi0JCWZvciAoSXRlcmF0b3I8Pz4gaXRlciA9IGVkaXRQYXJ0LmdldENoaWxkcmVuKCkuaXRlcmF0b3IoKTsgaXRlcgotCQkuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGNoaWxkID0gKE9iamVjdCkgaXRlci5uZXh0KCk7Ci0JCQlpZihjaGlsZCBpbnN0YW5jZW9mIEVkaXRQYXJ0KSB7Ci0JCQkJYm9vbGVhbiByZWZyZXNoQ2hpbGRyZW4gPSB0cnVlOwotCQkJCUVkaXRQYXJ0IGNoaWxkRWRpdFBhcnQgPSAoKEVkaXRQYXJ0KWNoaWxkKTsKLQkJCQlPYmplY3QgbSA9IGNoaWxkRWRpdFBhcnQuZ2V0TW9kZWwoKTsKLQkJCQlpZihtIGluc3RhbmNlb2YgVmlldykgewotCQkJCQlWaWV3IHYgPSAoVmlldykgbTsKLQkJCQkJTWV0aG9kRWxlbWVudCBlID0gQnJpZGdlSGVscGVyLmdldE1ldGhvZEVsZW1lbnQodik7Ci0JCQkJCWlmKGUgIT0gbnVsbCkgewotCQkJCQkJT2JqZWN0IG9iamVjdCA9IGdldFdyYXBwZXIoZSwgc2VtYW50aWNDaGlsZHJlbik7Ci0JCQkJCQlib29sZWFuIHZpc2libGUgPSBvYmplY3QgIT0gbnVsbDsKLQkJCQkJCWlmKHYuaXNWaXNpYmxlKCkgIT0gdmlzaWJsZSkgewotCQkJCQkJCXYuc2V0VmlzaWJsZSh2aXNpYmxlKTsKLQkJCQkJCX0KLQkJCQkJCWlmKCF2aXNpYmxlKSB7Ci0JCQkJCQkJcmVmcmVzaENoaWxkcmVuID0gZmFsc2U7Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIGlmKGlzUm9sZVRhc2tDb21wb3NpdGUgJiYgIWhhc1Rhc2sgJiYgZSBpbnN0YW5jZW9mIFRhc2tEZXNjcmlwdG9yKSB7Ci0JCQkJCQkJaGFzVGFzayA9IHRydWU7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQkvLyB0aGlzIGlzIGEgbm9uLVVNQSBub2RlIGxpa2UgY29udHJvbCBub2RlLCB0ZXh0IG5vZGUsIGZpZ3VyZS4uLgotCQkJCQkJLy8gCi0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYocmVmcmVzaENoaWxkcmVuKSB7Ci0JCQkJCXJlZnJlc2hDaGlsZHJlbihjaGlsZEVkaXRQYXJ0LCBzZW1hbnRpY0NoaWxkcmVuKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCWlmKGlzUm9sZVRhc2tDb21wb3NpdGUgJiYgIWhhc1Rhc2spIHsKLQkJCSgoVmlldyllZGl0UGFydC5nZXRNb2RlbCgpKS5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgZG9SZWZyZXNoKGZpbmFsIERpYWdyYW1FZGl0UGFydCBlZGl0UGFydCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBmaW5hbCBib29sZWFuIHJlZnJlc2hEYXRhKSB7Ci0JCWZpbmFsIGJvb2xlYW4gaXNJbmhlcml0ZWQgPSBpc0luaGVyaXRlZChlZGl0UGFydCk7Ci0JCWZpbmFsIERpYWdyYW0gZGlhZ3JhbSA9IChEaWFncmFtKSBlZGl0UGFydC5nZXRNb2RlbCgpOwotCQlpZihkaWFncmFtLmdldEVsZW1lbnQoKSBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkRpYWdyYW0pIHsKLQkJCVRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIGRvbWFpbiA9IFRyYW5zYWN0aW9uVXRpbC5nZXRFZGl0aW5nRG9tYWluKGRpYWdyYW0pOwotCQkJQWJzdHJhY3RFTUZPcGVyYXRpb24gb3AgPSBuZXcgQWJzdHJhY3RFTUZPcGVyYXRpb24oZG9tYWluLCBTdHJpbmdTdGF0aWNzLkJMQU5LKSB7Ci0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIElTdGF0dXMgZG9FeGVjdXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKQotCQkJCXRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCQkJCQlpZihyZWZyZXNoRGF0YSkgewotCQkJCQkJLy8gcmVmcmVzaCB0aGUgZGF0YQotCQkJCQkJLy8KLQkJCQkJCW9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkRpYWdyYW0gZCA9IChvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5EaWFncmFtKSBkaWFncmFtLmdldEVsZW1lbnQoKTsKLQkJCQkJCWQuc2V0T2JqZWN0KGQuZ2V0TGlua2VkRWxlbWVudCgpKTsKLQkJCQkJfQotCQkJCQkKLQkJCQkJLy8gc2hvdy9oaWRlIG5vZGVzIGFjY29yZGluZyB1cGRhdGVkIGRhdGEKLQkJCQkJLy8KLQkJCQkJaWYoaXNJbmhlcml0ZWQpIHsKLQkJCQkJCXJlZnJlc2hDaGlsZHJlbihlZGl0UGFydCk7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQl1cGRhdGVFZGdlcyhkaWFncmFtKTsKLQkJCQkJCXVwZGF0ZVZpZXcoZGlhZ3JhbSk7Ci0JCQkJCX0KLQkJCQkJCi0JCQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCQkJCX0JCi0KLQkJCX07Ci0JCQl0cnkgewotCQkJCW9wLmV4ZWN1dGUobW9uaXRvciwgbnVsbCk7CQkJCQotCQkJfSBjYXRjaCAoRXhlY3V0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCQlDb21tb25QbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJfQkJCi0JCX0KLQkJZWxzZSB7Ci0JCQlOb2RlQWRhcHRlciBhZGFwdGVyID0gQnJpZGdlSGVscGVyLmdldE5vZGVBZGFwdGVyKGRpYWdyYW0uZ2V0RWxlbWVudCgpKTsKLQkJCWlmKGFkYXB0ZXIgaW5zdGFuY2VvZiBEaWFncmFtQWRhcHRlcikgewotCQkJCWlmKHJlZnJlc2hEYXRhKSB7Ci0JCQkJCSgoRGlhZ3JhbUFkYXB0ZXIpYWRhcHRlcikucG9wdWxhdGVEaWFncmFtKCk7Ci0JCQkJfQotCQkJCWlmKGlzSW5oZXJpdGVkKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQluZXcgQWJzdHJhY3RFTUZPcGVyYXRpb24oVHJhbnNhY3Rpb25VdGlsLmdldEVkaXRpbmdEb21haW4oZGlhZ3JhbSksIFN0cmluZ1N0YXRpY3MuQkxBTkspIHsKLQotCQkJCQkJCUBPdmVycmlkZQotCQkJCQkJCXByb3RlY3RlZCBJU3RhdHVzIGRvRXhlY3V0ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCQkJCQkJCXJlZnJlc2hDaGlsZHJlbihlZGl0UGFydCk7Ci0JCQkJCQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCQkJCQkJCX0KLQkJCQkJCQkKLQkJCQkJCX0uZXhlY3V0ZShtb25pdG9yLCBudWxsKTsKLQkJCQkJfSBjYXRjaCAoRXhlY3V0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCQkJCURpYWdyYW1Db3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVmcmVzaChmaW5hbCBEaWFncmFtRWRpdFBhcnQgZWRpdFBhcnQsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlJRGlhZ3JhbUVkaXRvcklucHV0UHJvdmlkZXIgcCA9ICgoSURpYWdyYW1FZGl0b3JJbnB1dFByb3ZpZGVyKWVkaXRQYXJ0LmdldFZpZXdlcigpKTsgCi0JCWJvb2xlYW4gd2FzRGlydHkgPSBwLmdldEVkaXRvcigpICE9IG51bGwgPyBwLmdldEVkaXRvcigpLmlzRGlydHkoKSA6IGZhbHNlOwotCQlib29sZWFuIHdhc0Jhc2VEaXJ0eSA9IGZhbHNlOwotCQlJRWRpdG9yUGFydCBiYXNlRWRpdG9yID0gbnVsbDsKLQkJZmluYWwgYm9vbGVhbiBpc0luaGVyaXRlZCA9IGlzSW5oZXJpdGVkKGVkaXRQYXJ0KTsKLQkJaWYoaXNJbmhlcml0ZWQpIHsKLQkJCU1ldGhvZEVsZW1lbnQgZWxlbWVudCA9IEJyaWRnZUhlbHBlci5nZXRNZXRob2RFbGVtZW50KGVkaXRQYXJ0LmdldERpYWdyYW1WaWV3KCkpOwotCQkJU3RyaW5nIHR5cGUgPSBlZGl0UGFydC5nZXREaWFncmFtVmlldygpLmdldFR5cGUoKTsKLQkJCQotCQkJaWYocC5nZXRFZGl0b3IoKSAhPSBudWxsKSB7Ci0JCQkJLy8gdHJ5IHRvIGZpbmQgdGhlIGRpcnR5IGZsYWcgb2YgYmFzZSBkaWFncmFtIGVkaXRvcgotCQkJCS8vCi0JCQkJSUVkaXRvclJlZmVyZW5jZVtdIGVkaXRvclJlZnMgPSBwLmdldEVkaXRvcigpLmdldFNpdGUoKS5nZXRQYWdlKCkuZ2V0RWRpdG9yUmVmZXJlbmNlcygpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZWRpdG9yUmVmcy5sZW5ndGg7IGkrKykgewotCQkJCQlJRWRpdG9yUmVmZXJlbmNlIHJlZiA9IGVkaXRvclJlZnNbaV07Ci0JCQkJCXRyeSB7Ci0JCQkJCQlpZihyZWYuZ2V0RWRpdG9ySW5wdXQoKSBpbnN0YW5jZW9mIElEaWFncmFtRmlsZUVkaXRvcklucHV0UHJveHkpIHsKLQkJCQkJCQlEaWFncmFtRWRpdG9ySW5wdXQgaW5wdXQgPSAoKElEaWFncmFtRmlsZUVkaXRvcklucHV0UHJveHkpcmVmLmdldEVkaXRvcklucHV0KCkpLmdldERpYWdyYW1FZGl0b3JJbnB1dCgpOwotCQkJCQkJCWlmKGlucHV0LmdldFdyYXBwZXIoKSA9PSBudWxsICYmIGlucHV0LmdldE1ldGhvZEVsZW1lbnQoKSA9PSBlbGVtZW50ICYmCi0JCQkJCQkJCQlEaWFncmFtTWFuYWdlci5nZXREaWFncmFtVHlwZSh0eXBlKSA9PSBpbnB1dC5nZXREaWFncmFtVHlwZSgpKSB7Ci0JCQkJCQkJCUlFZGl0b3JQYXJ0IGVkaXRvciA9IHJlZi5nZXRFZGl0b3IoZmFsc2UpOwotCQkJCQkJCQlpZihlZGl0b3IgIT0gbnVsbCkgewotCQkJCQkJCQkJd2FzQmFzZURpcnR5ID0gZWRpdG9yLmlzRGlydHkoKTsKLQkJCQkJCQkJCWJhc2VFZGl0b3IgPSBlZGl0b3I7Ci0JCQkJCQkJCQlicmVhazsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfSBjYXRjaCAoUGFydEluaXRFeGNlcHRpb24gZSkgewotCQkJCQkJRGlhZ3JhbUNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQlkb1JlZnJlc2goZWRpdFBhcnQsIG1vbml0b3IsIHRydWUpOwotCQkKLQkJLy8gZWRpdG9ycyBjYW4gYmVjb21lIGRpcnR5IGFmdGVyIHJlZnJlc2gKLQkJLy8gY2xlYXIgZGlydHkgZmxhZwotCQkvLwotCQlpZighd2FzRGlydHkgJiYgcC5nZXRFZGl0b3IoKSAhPSBudWxsICYmIHAuZ2V0RWRpdG9yKCkuaXNEaXJ0eSgpKSB7Ci0JCQkoKFNoYXJlZFJlc291cmNlRGlhZ3JhbURvY3VtZW50UHJvdmlkZXIpKChEaWFncmFtRG9jdW1lbnRFZGl0b3IpcC5nZXRFZGl0b3IoKSkuZ2V0RG9jdW1lbnRQcm92aWRlcigpKQotCQkJCS5tYXJrRG9jdW1lbnRBc1NhdmVkKChJRmlsZUVkaXRvcklucHV0KSBwLmdldEVkaXRvcigpLmdldEVkaXRvcklucHV0KCkpOwotCQl9Ci0JCWlmKGJhc2VFZGl0b3IgIT0gbnVsbCAmJiAhd2FzQmFzZURpcnR5KSB7Ci0JCQkoKFNoYXJlZFJlc291cmNlRGlhZ3JhbURvY3VtZW50UHJvdmlkZXIpKChEaWFncmFtRG9jdW1lbnRFZGl0b3IpYmFzZUVkaXRvcikuZ2V0RG9jdW1lbnRQcm92aWRlcigpKQotCQkJCS5tYXJrRG9jdW1lbnRBc1NhdmVkKChJRmlsZUVkaXRvcklucHV0KSBiYXNlRWRpdG9yLmdldEVkaXRvcklucHV0KCkpOwotCQl9Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCByZWZyZXNoKGZpbmFsIERpYWdyYW1FZGl0UGFydCBlZGl0UGFydCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBib29sZWFuIGlzaW5oZXJpdGVkKXsKLQkJCi0JCWZpbmFsIGJvb2xlYW4gaXNJbmhlcml0ZWQgPSBpc0luaGVyaXRlZChlZGl0UGFydCk7Ci0JCWZpbmFsIERpYWdyYW0gZGlhZ3JhbSA9IChEaWFncmFtKSBlZGl0UGFydC5nZXRNb2RlbCgpOwotCQlpZihkaWFncmFtLmdldEVsZW1lbnQoKSBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkRpYWdyYW0pIHsKLQkJCXRyeSB7Ci0JCQkJVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gZG9tYWluID0gVHJhbnNhY3Rpb25VdGlsLmdldEVkaXRpbmdEb21haW4oZGlhZ3JhbSk7Ci0JCQkJVHhVdGlsLnJ1bkluVHJhbnNhY3Rpb24oZGlhZ3JhbS5nZXRFbGVtZW50KCksIG5ldyBSdW5uYWJsZSgpIHsKLQotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkvLyByZWZyZXNoIHRoZSBkYXRhCi0JCQkJCQkvLwotCQkJCQkJb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuRGlhZ3JhbSBkID0gKG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkRpYWdyYW0pIGRpYWdyYW0uZ2V0RWxlbWVudCgpOwotCQkJCQkJZC5zZXRPYmplY3QoZC5nZXRMaW5rZWRFbGVtZW50KCkpOwotCQkJCQl9Ci0JCQkJCQotCQkJCX0pOwotCQkJCQotCQkJCVR4VXRpbC5ydW5JblRyYW5zYWN0aW9uKGRvbWFpbiwgbmV3IFJ1bm5hYmxlKCkgewotCi0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCS8vIHNob3cvaGlkZSBub2RlcyBhY2NvcmRpbmcgdXBkYXRlZCBkYXRhCi0JCQkJCQkvLwotCQkJCQkJaWYoaXNJbmhlcml0ZWQpIHsKLQkJCQkJCQlyZWZyZXNoQ2hpbGRyZW4oZWRpdFBhcnQpOwotCQkJCQkJfQotCQkJCQkJZWxzZSB7Ci0JCQkJCQkJdXBkYXRlRWRnZXMoZGlhZ3JhbSk7Ci0JCQkJCQkJdXBkYXRlVmlldyhkaWFncmFtKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQkKLQkJCQl9KTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJRGlhZ3JhbUNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJTm9kZUFkYXB0ZXIgYWRhcHRlciA9IEJyaWRnZUhlbHBlci5nZXROb2RlQWRhcHRlcihkaWFncmFtLmdldEVsZW1lbnQoKSk7Ci0JCQlpZihhZGFwdGVyIGluc3RhbmNlb2YgRGlhZ3JhbUFkYXB0ZXIpIHsKLQkJCQkoKERpYWdyYW1BZGFwdGVyKWFkYXB0ZXIpLnBvcHVsYXRlRGlhZ3JhbSgpOwotCQkJCWlmKGlzSW5oZXJpdGVkKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQluZXcgQWJzdHJhY3RFTUZPcGVyYXRpb24oVHJhbnNhY3Rpb25VdGlsLmdldEVkaXRpbmdEb21haW4oZGlhZ3JhbSksIFN0cmluZ1N0YXRpY3MuQkxBTkspIHsKLQotCQkJCQkJCUBPdmVycmlkZQotCQkJCQkJCXByb3RlY3RlZCBJU3RhdHVzIGRvRXhlY3V0ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCQkJCQkJCXJlZnJlc2hDaGlsZHJlbihlZGl0UGFydCk7Ci0JCQkJCQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCQkJCQkJCX0KLQkJCQkJCQkKLQkJCQkJCX0uZXhlY3V0ZShtb25pdG9yLCBudWxsKTsKLQkJCQkJfSBjYXRjaCAoRXhlY3V0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCQkJCURpYWdyYW1Db3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVzZXRFZGl0b3IoQWJzdHJhY3REaWFncmFtRWRpdG9yIGVkaXRvcil7Ci0JCWlmKGVkaXRvci5pc0VkaXRhYmxlKCkpewotCQkJRGlhZ3JhbUVkaXRQYXJ0IGVkaXRQYXJ0ID1lZGl0b3IuZ2V0RGlhZ3JhbUVkaXRQYXJ0KCk7Ci0JCQlJRWRpdG9ySW5wdXQgaW5wdXQgPSBlZGl0b3IuZ2V0RWRpdG9ySW5wdXQoKTsKLQkJCWlmKGlucHV0IGluc3RhbmNlb2YgRGlhZ3JhbUVkaXRvcklucHV0UHJveHkgKXsKLQkJCQlpbml0aWFsaXplKGVkaXRQYXJ0LCAoRGlhZ3JhbUVkaXRvcklucHV0UHJveHkpaW5wdXQsIAotCQkJCQkJbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzTW9kaWZpYWJsZShPYmplY3QgZWxlbWVudCkgewotCQlpZihlbGVtZW50IGluc3RhbmNlb2YgRGlhZ3JhbUZpbGVFZGl0b3JJbnB1dFByb3h5KXsKLQkJCQlEaWFncmFtRmlsZUVkaXRvcklucHV0UHJveHkgaW5wdXQgPSAoRGlhZ3JhbUZpbGVFZGl0b3JJbnB1dFByb3h5KWVsZW1lbnQ7Ci0JCQkJaWYoaW5wdXQgIT0gbnVsbCl7Ci0JCQkJCURpYWdyYW1FZGl0b3JJbnB1dCBkSW5wdXQgPSBpbnB1dC5nZXREaWFncmFtRWRpdG9ySW5wdXQoKTsKLQkJCQkJaWYoZElucHV0ICE9IG51bGwpewotCQkJCQkJTWV0aG9kRWxlbWVudCBlID0gZElucHV0LmdldE1ldGhvZEVsZW1lbnQoKTsKLQkJCQkJCS8vIENoZWNrIGZvciBwbHVnaW4gbG9jay4KLQkJCQkJCWlmKGUgIT0gbnVsbCl7Ci0JCQkJCQkJaWYoVG5nVXRpbC5pc0xvY2tlZChlKSkgCi0JCQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJCX0KLQkJCQkJCS8vIENoZWNrIHdyYXBwZXIgaXMgcmVhZG9ubHkuCi0JCQkJCQlPYmplY3Qgd3JhcHBlciA9IGRJbnB1dC5nZXRXcmFwcGVyKCk7Ci0JCQkJCQlpZih3cmFwcGVyICE9IG51bGwgJiYgKChCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcil3cmFwcGVyKS5pc1JlYWRPbmx5KCkpewotCQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCS8qKgotCSAqIEdNRiBhbmQgR0VGIGlzIG5vdCBoYW5kbGluZyBjb25uZWN0aW9ucyB2aXNpYmlsaXR5IHByb3Blcmx5LiAKLQkgKiBUaGlzIGlzIHdvcmstYXJvdW5kIHNvbHV0aW9uIHRvIGhhbmRsZSBjb25uZWN0aW9ucyB2aXNpYmlsaXR5LiAgCi0JICogVmlzaWJpbGl0eSBvZiBlZGdlcyBuZWVkIHRvIHNldCBmaXJzdCBhbmQgdGhlbiBub2Rlcy4gCi0JICogZGVmZWN0IG9wZW5lZCBmb3IgdGhpczogCi0JICogaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE4NDA4MQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZWZyZXNoQ29ubmVjdGlvbkVkaXRQYXJ0cyhEaWFncmFtRWRpdFBhcnQgZGlhZ3JhbUVkaXRQYXJ0KSB7Ci0KLQkJR3JhcGhpY2FsVmlld2VyIHZpZXdlciA9IChHcmFwaGljYWxWaWV3ZXIpZGlhZ3JhbUVkaXRQYXJ0LmdldFZpZXdlcigpOwotCQlEaWFncmFtIGFjdCA9IChEaWFncmFtKWRpYWdyYW1FZGl0UGFydC5nZXRNb2RlbCgpOwotCQlMaXN0IGVkZ2VzID0gYWN0LmdldEVkZ2VzKCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGVkZ2VzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJRWRnZSBlZGdlID0gKEVkZ2UpIGl0ZXIubmV4dCgpOwotCQkJaWYoZWRnZS5pc1Zpc2libGUoKSl7Ci0JCQkJQ29ubmVjdGlvbkVkaXRQYXJ0IHBhcnQgPSAoQ29ubmVjdGlvbkVkaXRQYXJ0KXZpZXdlci5nZXRFZGl0UGFydFJlZ2lzdHJ5KCkuZ2V0KGVkZ2UpOyAKLQkJCQkJCi0JCQkJaWYocGFydCAhPSBudWxsKXsKLQkJCQkJaWYocGFydC5nZXRTb3VyY2UoKSA9PSBudWxsKXsKLQkJCQkJCWZvciAoSXRlcmF0b3IgaXRlcjEgPSBkaWFncmFtRWRpdFBhcnQuZ2V0Q2hpbGRyZW4oKS5pdGVyYXRvcigpOyBpdGVyMS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJRWRpdFBhcnQgZWxlbWVudCA9IChFZGl0UGFydCkgaXRlcjEubmV4dCgpOwotCQkJCQkJCU9iamVjdCBtb2RlbCA9IGVsZW1lbnQuZ2V0TW9kZWwoKTsKLQkJCQkJCQlpZihlZGdlLmdldFNvdXJjZSgpID09IG1vZGVsKXsKLQkJCQkJCQkJaWYoZWxlbWVudCBpbnN0YW5jZW9mIEdyYXBoaWNhbEVkaXRQYXJ0KXsKLQkJCQkJCQkJCWlmKCgoR3JhcGhpY2FsRWRpdFBhcnQpZWxlbWVudCkuZ2V0RmlndXJlKCkuaXNWaXNpYmxlKCkpewotCQkJCQkJCQkJCXBhcnQuc2V0U291cmNlKGVsZW1lbnQpOwotCQkJCQkJCQkJfWVsc2V7Ci0JCQkJCQkJCQkJcGFydC5zZXRTb3VyY2UobnVsbCk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJaWYocGFydC5nZXRUYXJnZXQoKSA9PSBudWxsKXsKLQkJCQkJCWZvciAoSXRlcmF0b3IgaXRlcjEgPSBkaWFncmFtRWRpdFBhcnQuZ2V0Q2hpbGRyZW4oKS5pdGVyYXRvcigpOyBpdGVyMS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJRWRpdFBhcnQgZWxlbWVudCA9IChFZGl0UGFydCkgaXRlcjEubmV4dCgpOwotCQkJCQkJCU9iamVjdCBtb2RlbCA9IGVsZW1lbnQuZ2V0TW9kZWwoKTsKLQkJCQkJCQlpZihlZGdlLmdldFRhcmdldCgpID09IG1vZGVsKXsKLQkJCQkJCQkJaWYoZWxlbWVudCBpbnN0YW5jZW9mIEdyYXBoaWNhbEVkaXRQYXJ0KXsKLQkJCQkJCQkJCWlmKCgoR3JhcGhpY2FsRWRpdFBhcnQpZWxlbWVudCkuZ2V0RmlndXJlKCkuaXNWaXNpYmxlKCkpewotCQkJCQkJCQkJCXBhcnQuc2V0VGFyZ2V0KGVsZW1lbnQpOwotCQkJCQkJCQkJfWVsc2V7Ci0JCQkJCQkJCQkJcGFydC5zZXRUYXJnZXQobnVsbCk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCXRyeXsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZWRnZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlFZGdlIGVkZ2UgPSAoRWRnZSkgaXRlci5uZXh0KCk7Ci0JCQkJb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuQ29ubmVjdGlvbkVkaXRQYXJ0IHBhcnQgPSAKLQkJCQkJKG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLkNvbm5lY3Rpb25FZGl0UGFydCl2aWV3ZXIuZ2V0RWRpdFBhcnRSZWdpc3RyeSgpLmdldChlZGdlKTsgCi0JCQkJaWYocGFydCAhPSBudWxsICYmIChwYXJ0LmdldFNvdXJjZSgpID09IG51bGwgfHwgcGFydC5nZXRUYXJnZXQoKSA9PSBudWxsKQotCQkJCQkJJiYgcGFydC5nZXRGaWd1cmUoKSAhPSBudWxsKXsKLQkJCQkJcGFydC5nZXRGaWd1cmUoKS5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJCQkgICAgcGFydC5nZXRGaWd1cmUoKS5yZXZhbGlkYXRlKCk7Ci0JCQkJCXBhcnQuZGVhY3RpdmF0ZSgpOwotCQkJCX0KLQkJfQotCQl9Y2F0Y2goRXhjZXB0aW9uIGUpewotCQkJaWYoRGlhZ3JhbUNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmlzRGVidWdnaW5nKCkpewotCQkJCURpYWdyYW1Db3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcigiRXJyb3Igb2NjdXJlZCB3aGlsZSByZWZyZXNoIHRoZSBjb25uZWN0aW9uOiAiKyBlKTsgLy8kTk9OLU5MUy0xJAotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9jb3JlL3Byb3ZpZGVycy9BY2Nlc3NpYmxlRGlhZ3JhbU1vZGlmaWNhdGlvbkxpc3RlbmVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9jb3JlL3Byb3ZpZGVycy9BY2Nlc3NpYmxlRGlhZ3JhbU1vZGlmaWNhdGlvbkxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4ZTI2MGMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vY29yZS9wcm92aWRlcnMvQWNjZXNzaWJsZURpYWdyYW1Nb2RpZmljYXRpb25MaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUucHJvdmlkZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXNvdXJjZXMuZWRpdG9yLmRvY3VtZW50LkFic3RyYWN0RG9jdW1lbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlc291cmNlcy5lZGl0b3IuZG9jdW1lbnQuRGlhZ3JhbURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVzb3VyY2VzLmVkaXRvci5kb2N1bWVudC5EaWFncmFtTW9kaWZpY2F0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRGlhZ3JhbTsKLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIAotICogQHNpbmNlIDEuMgotICovCi1wdWJsaWMgY2xhc3MgQWNjZXNzaWJsZURpYWdyYW1Nb2RpZmljYXRpb25MaXN0ZW5lciBleHRlbmRzCi0JCURpYWdyYW1Nb2RpZmljYXRpb25MaXN0ZW5lciB7Ci0KLQlwdWJsaWMgQWNjZXNzaWJsZURpYWdyYW1Nb2RpZmljYXRpb25MaXN0ZW5lcigKLQkJCUFic3RyYWN0RG9jdW1lbnRQcm92aWRlciBkb2N1bWVudFByb3ZpZGVyLCBEaWFncmFtRG9jdW1lbnQgZG9jdW1lbnQpIHsKLQkJc3VwZXIoZG9jdW1lbnRQcm92aWRlciwgZG9jdW1lbnQpOwotCX0KLQotCXB1YmxpYyBEaWFncmFtIGdldERpYWdyYW0oKSB7Ci0JCURpYWdyYW1Eb2N1bWVudCBkb2MgPSBnZXREaWFncmFtRG9jdW1lbnQoKTsKLQkJcmV0dXJuIGRvYyAhPSBudWxsID8gZG9jLmdldERpYWdyYW0oKSA6IG51bGw7Ci0JfQkJCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJaWYgKG5vdGlmaWNhdGlvbi5nZXRFdmVudFR5cGUoKSAhPSBOb3RpZmljYXRpb24uUkVNT1ZJTkdfQURBUFRFUikgewotCQkJT2JqZWN0IGZlYXR1cmUgPSBub3RpZmljYXRpb24uZ2V0RmVhdHVyZSgpOwotCQkJaWYoZmVhdHVyZSBpbnN0YW5jZW9mIEVTdHJ1Y3R1cmFsRmVhdHVyZSAmJiAoKEVTdHJ1Y3R1cmFsRmVhdHVyZSlmZWF0dXJlKS5pc1RyYW5zaWVudCgpKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJT2JqZWN0IG5vdGlmaWVyID0gbm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCk7Ci0JCQlpZiAobm90aWZpZXIgaW5zdGFuY2VvZiBFT2JqZWN0Ci0JCQkJCSYmIChVbWFVdGlsLmlzQ29udGFpbmVkQnkoKEVPYmplY3QpIG5vdGlmaWVyLCBnZXREaWFncmFtKCkpIHx8IFVtYVV0aWwKLQkJCQkJCQkuaXNDb250YWluZWRCeSgoRU9iamVjdCkgbm90aWZpZXIsIGdldERpYWdyYW0oKQotCQkJCQkJCQkJLmdldEVsZW1lbnQoKSkpKSB7Ci0JCQkJZ2V0RGlhZ3JhbURvY3VtZW50KCkuc2V0Q29udGVudCgKLQkJCQkJCWdldERpYWdyYW1Eb2N1bWVudCgpLmdldENvbnRlbnQoKSk7Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9jb3JlL3Byb3ZpZGVycy9EaWFncmFtQ29udGV4dE1lbnVQcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vY29yZS9wcm92aWRlcnMvRGlhZ3JhbUNvbnRleHRNZW51UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGEyMWM5Ny4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9jb3JlL3Byb3ZpZGVycy9EaWFncmFtQ29udGV4dE1lbnVQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoqCi0gKiAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnByb3ZpZGVyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUucGFydC5BYnN0cmFjdERpYWdyYW1FZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXREb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0Vmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuYWN0aW9ucy5BY3Rpb25JZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wYXJ0cy5EaWFncmFtRWRpdERvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUNvbnRyaWJ1dGlvbkl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLkFjdGlvbkZhY3Rvcnk7Ci0KLS8qKgotICogQ2xhc3MgdG8gaGFuZGxlIHRoZSBwb3B1cG1lbnUgaXRlbXMgCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqLwotcHVibGljIGNsYXNzIERpYWdyYW1Db250ZXh0TWVudVByb3ZpZGVyIGV4dGVuZHMKLQkJb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wcm92aWRlcnMuRGlhZ3JhbUNvbnRleHRNZW51UHJvdmlkZXIgewotCi0JLyoqCi0JICogQHBhcmFtIHBhcnQKLQkgKiBAcGFyYW0gdmlld2VyCi0JICovCi0JcHVibGljIERpYWdyYW1Db250ZXh0TWVudVByb3ZpZGVyKElXb3JrYmVuY2hQYXJ0IHBhcnQsIEVkaXRQYXJ0Vmlld2VyIHZpZXdlcikgewotCQlzdXBlcihwYXJ0LCB2aWV3ZXIpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBtZW51QWJvdXRUb1Nob3coSU1lbnVNYW5hZ2VyIG1lbnUpIHsKLQkJc3VwZXIubWVudUFib3V0VG9TaG93KG1lbnUpOwotCQlJQ29udHJpYnV0aW9uSXRlbSBpdGVtID0gIGZpbmQoQWN0aW9uSWRzLkFDVElPTl9ERUxFVEVfRlJPTV9ESUFHUkFNKTsKLQkJaWYoaXRlbSAhPSBudWxsKQotCQlpdGVtLnNldFZpc2libGUoZmFsc2UpOwotCi0JCUlDb250cmlidXRpb25JdGVtIGl0ZW0xPSAgZmluZChBY3Rpb25JZHMuQUNUSU9OX0RFTEVURV9GUk9NX01PREVMKTsKLQkJaWYoaXRlbTEgIT0gbnVsbCkKLQkJaXRlbTEuc2V0VmlzaWJsZShmYWxzZSk7Ci0JCQotCQlJQ29udHJpYnV0aW9uSXRlbSBpdGVtMiA9IGZpbmQoQWN0aW9uSWRzLk1FTlVfTkFWSUdBVEUpOwotCQlpZihpdGVtMiAhPSBudWxsKQotCQlpdGVtMi5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJCi0JCUlDb250cmlidXRpb25JdGVtIGl0ZW0zID0gZmluZChBY3Rpb25GYWN0b3J5LlBST1BFUlRJRVMuZ2V0SWQoKSk7Ci0JCWlmKGl0ZW0zICE9IG51bGwpCi0JCWl0ZW0zLnNldFZpc2libGUoZmFsc2UpOwotCQkKLQkJRWRpdERvbWFpbiBkb21haW4gPSBnZXRWaWV3ZXIoKS5nZXRFZGl0RG9tYWluKCk7Ci0JCWlmKGRvbWFpbiBpbnN0YW5jZW9mIERpYWdyYW1FZGl0RG9tYWluKXsKLQkJCUlFZGl0b3JQYXJ0IHBhcnQ9ICAoKERpYWdyYW1FZGl0RG9tYWluKWRvbWFpbikuZ2V0RWRpdG9yUGFydCgpOwotCQkJaWYocGFydCBpbnN0YW5jZW9mIEFic3RyYWN0RGlhZ3JhbUVkaXRvcil7Ci0JCQkJKChBYnN0cmFjdERpYWdyYW1FZGl0b3IpcGFydCkuY29udHJpYnV0ZVRvQ29udGV4dE1lbnUobWVudSk7Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9jb3JlL3Byb3ZpZGVycy9EaWFncmFtQ29udHJpYnV0aW9uSXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9jb3JlL3Byb3ZpZGVycy9EaWFncmFtQ29udHJpYnV0aW9uSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2YThjYTkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vY29yZS9wcm92aWRlcnMvRGlhZ3JhbUNvbnRyaWJ1dGlvbkl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoqCi0gKiAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnByb3ZpZGVyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuYWN0aW9ucy5EZWxlZ2F0ZUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkudXRpbC5JV29ya2JlbmNoUGFydERlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5BY3Rpb25GYWN0b3J5OwotCi0vKioKLSAqIENvcmUgZGlhZ3JhbSBjb250cmlidXRpb24gaXRlbSBwcm92aWRlci4gCi0gKiBJdCBwcm92aWRlcyBjb250cmlidXRpb25zIGdlbmVyaWMgdG8gRVBGIGRpYWdyYW0gZWRpdG9ycwotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKgotICovCi1wdWJsaWMgY2xhc3MgRGlhZ3JhbUNvbnRyaWJ1dGlvbkl0ZW1Qcm92aWRlcgotCQlleHRlbmRzCi0JCW9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucHJvdmlkZXJzLkRpYWdyYW1Db250cmlidXRpb25JdGVtUHJvdmlkZXIgewotCi0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSUFjdGlvbiBjcmVhdGVBY3Rpb24oU3RyaW5nIGFjdGlvbklkLCBJV29ya2JlbmNoUGFydERlc2NyaXB0b3IgcGFydERlc2NyaXB0b3IpIHsKLQkJaWYoYWN0aW9uSWQuZXF1YWxzKEFjdGlvbkZhY3RvcnkuREVMRVRFLmdldElkKCkpKXsKLQkJCXJldHVybiBuZXcgRGVsZWdhdGVBY3Rpb24ocGFydERlc2NyaXB0b3IuZ2V0UGFydFBhZ2UoKSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmNyZWF0ZUFjdGlvbihhY3Rpb25JZCwgcGFydERlc2NyaXB0b3IpOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2NvcmUvcHJvdmlkZXJzL0RpYWdyYW1JY29uUHJvdmlkZXJNYW5hZ2VyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9jb3JlL3Byb3ZpZGVycy9EaWFncmFtSWNvblByb3ZpZGVyTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MDcxYzEyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2NvcmUvcHJvdmlkZXJzL0RpYWdyYW1JY29uUHJvdmlkZXJNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnByb3ZpZGVyczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25SZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuYnJpZGdlLkJyaWRnZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5OYW1lZE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5OYW1lZE5vZGVJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5PYmplY3ROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGU7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBtYW5hZ2VzIGFsbCBvZiB0aGUgaWNvbiBwcm92aWRlcnMsIGFuZCBoYW5kbGVzIHF1ZXJ5aW5nIHRoZW0gZm9yCi0gKiBpY29ucyBiYXNlZCBvbiB0aGUgbm9kZSBwcm92aWRlZC4gSXQgd2lsbCBkZWNvZGUgdGhlIG5vZGUgYmFjayB0byB0aGUKLSAqIE1ldGhvZEVsZW1lbnQgdGhlbiB1c2UgdGhhdCB0byBjYWxsIHRoZSBwcm92aWRlciBhbmQgcmV0cmlldmUgdGhlIGljb24uCi0gKiAKLSAqIAotICogQGF1dGhvciBQaWVycmUgUGFkb3ZhbmkKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgRGlhZ3JhbUljb25Qcm92aWRlck1hbmFnZXIgewotCS8qKgotCSAqIFRoZSBleHRlbnNpb24gcG9pbnQgbmFtZXNwYWNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVEVOU0lPTl9QT0lOVF9OQU1FU1BBQ0UgPSAib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSBleHRlbnNpb24gcG9pbnQgbmFtZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRFTlNJT05fUE9JTlRfTkFNRSA9ICJkaWFncmFtSWNvblByb3ZpZGVycyI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSAiY2xhc3MiIGF0dHJpYnV0ZSBuYW1lLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENMQVNTX0FUVFJJQl9OQU1FID0gImNsYXNzIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogUmVmZXJlbmNlIHRvIG15c2VsZiBmb3Igc2luZ2xldG9uIGluc3RhbmNlCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgRGlhZ3JhbUljb25Qcm92aWRlck1hbmFnZXIgbXlzZWxmOwotCi0JLyoqCi0JICogVGhlIGxpc3Qgb2YgcmVnaXN0ZXJlZCBwcm92aWRlcnMKLQkgKi8KLQlwcml2YXRlIEFycmF5TGlzdDxJRGlhZ3JhbUljb25Qcm92aWRlcj4gcHJvdmlkZXJzOwotCi0JLyoqCi0JICogUHJpdmF0ZSBjb25zdHJ1Y3RvciB0byBhdm9pZCBvdXRzaWRlIGluc3RhbnRpYXRpb24KLQkgKi8KLQlwcml2YXRlIERpYWdyYW1JY29uUHJvdmlkZXJNYW5hZ2VyKCkgewotCQkvLyBwcml2YXRlIHRvIGF2b2lkIG91dHNpZGUgY2FsbHMKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCByZXR1cm5zIHRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcy4KLQkgKiAKLQkgKiBAcmV0dXJuIEVsZW1lbnRQcm9wZXJ0eVByb3ZpZGVyTWFuYWdlcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgRGlhZ3JhbUljb25Qcm92aWRlck1hbmFnZXIgZ2V0SW5zdGFuY2UoKSB7Ci0JCWlmIChteXNlbGYgPT0gbnVsbCkgewotCQkJbXlzZWxmID0gbmV3IERpYWdyYW1JY29uUHJvdmlkZXJNYW5hZ2VyKCk7Ci0JCX0KLQkJcmV0dXJuIG15c2VsZjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCB3aWxsIGF0dGVtcHQgdG8gcmV0dXJuIGFuIEltYWdlIGJhc2VkIG9uIGEgZGlhZ3JhbSBlbGVtZW50LgotCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBmcm9tIHRoZSBkaWFncmFtIGVkaXQgcGFydHMuIElmIHRoZXJlIGFyZSBubwotCSAqIHByb3ZpZGVycywgYSBudWxsIHdpbGwgYmUgcmV0dXJuZWQuCi0JICogCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiAgICAgICAgICAgIEVPYmplY3QKLQkgKiBAcGFyYW0gc21hbGxJY29uCi0JICogICAgICAgICAgICBUT0RPCi0JICogQHJldHVybiBJbWFnZQotCSAqLwotCXB1YmxpYyBJbWFnZSBnZXRJY29uKEVPYmplY3QgZWxlbWVudCwgYm9vbGVhbiBzbWFsbEljb24pIHsKLQkJSW1hZ2UgaW1hZ2UgPSBudWxsOwotCi0JCWlmIChwcm92aWRlcnMgPT0gbnVsbCkgewotCQkJbG9hZFByb3ZpZGVycygpOwotCQl9Ci0KLQkJLy8gV2UgZ2V0IGJhY2sgdG8gdGhlIE1ldGhvZEVsZW1lbnQgYnkgcmV0cmlldmluZyB0aGUgZUFubm90YXRpb24gY29udGFpbmluZyB0aGUgR1VJRCwgdGhlbgotCQkvLyBsb29rIHVwIHRoZSBlbGVtZW50IGZyb20gdGhhdC4KLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBPYmplY3ROb2RlKSB7Ci0JCQlFQW5ub3RhdGlvbiBlQW5ub3RhdGlvbiA9ICgoT2JqZWN0Tm9kZSkgZWxlbWVudCkKLQkJCQkJLmdldEVBbm5vdGF0aW9uKEJyaWRnZUhlbHBlci5VTUFfRUxFTUVOVCk7Ci0JCQlTdHJpbmcgbW9kZWxVcmkgPSAoU3RyaW5nKSBlQW5ub3RhdGlvbi5nZXREZXRhaWxzKCkuZ2V0KAotCQkJCQlCcmlkZ2VIZWxwZXIuVU1BX1VSSSk7Ci0JCQlTdHJpbmcgZ3VpZCA9IG1vZGVsVXJpLnN1YnN0cmluZyhtb2RlbFVyaS5pbmRleE9mKCcjJykgKyAxKTsKLQkJCU1ldGhvZEVsZW1lbnQgbWUgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJCS5nZXRDdXJyZW50TGlicmFyeU1hbmFnZXIoKS5nZXRNZXRob2RFbGVtZW50KGd1aWQpOwotCQkJZm9yIChpbnQgaW5kZXggPSAwOyBpbmRleCA8IHByb3ZpZGVycy5zaXplKCkgJiYgaW1hZ2UgPT0gbnVsbDsgaW5kZXgrKykgewotCQkJCUlEaWFncmFtSWNvblByb3ZpZGVyIGlQcm92aWRlciA9IHByb3ZpZGVycy5nZXQoaW5kZXgpOwotCQkJCWltYWdlID0gaVByb3ZpZGVyLmdldEltYWdlRm9yRWxlbWVudChtZSwgc21hbGxJY29uKTsKLQkJCX0KLQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZSkgewotCQkJU3RydWN0dXJlZEFjdGl2aXR5Tm9kZSBzYW4gPSAoU3RydWN0dXJlZEFjdGl2aXR5Tm9kZSkgZWxlbWVudDsKLQkJCUVBbm5vdGF0aW9uIGVBbm5vdGF0aW9uID0gc2FuCi0JCQkJCS5nZXRFQW5ub3RhdGlvbihCcmlkZ2VIZWxwZXIuVU1BX0VMRU1FTlQpOwotCQkJU3RyaW5nIG1vZGVsVXJpID0gKFN0cmluZykgZUFubm90YXRpb24uZ2V0RGV0YWlscygpLmdldCgKLQkJCQkJQnJpZGdlSGVscGVyLlVNQV9VUkkpOwotCQkJU3RyaW5nIGd1aWQgPSBtb2RlbFVyaS5zdWJzdHJpbmcobW9kZWxVcmkuaW5kZXhPZignIycpICsgMSk7Ci0JCQlNZXRob2RFbGVtZW50IG1lID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKQotCQkJCQkuZ2V0Q3VycmVudExpYnJhcnlNYW5hZ2VyKCkuZ2V0TWV0aG9kRWxlbWVudChndWlkKTsKLQkJCWZvciAoaW50IGluZGV4ID0gMDsgaW5kZXggPCBwcm92aWRlcnMuc2l6ZSgpICYmIGltYWdlID09IG51bGw7IGluZGV4KyspIHsKLQkJCQlJRGlhZ3JhbUljb25Qcm92aWRlciBpUHJvdmlkZXIgPSBwcm92aWRlcnMuZ2V0KGluZGV4KTsKLQkJCQlpbWFnZSA9IGlQcm92aWRlci5nZXRJbWFnZUZvckVsZW1lbnQobWUsIHNtYWxsSWNvbik7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE5hbWVkTm9kZUltcGwpIHsKLQkJCU5hbWVkTm9kZSB3cG4gPSAoTmFtZWROb2RlKSBlbGVtZW50OwotCQkJTWV0aG9kRWxlbWVudCBtZSA9IHdwbi5nZXRMaW5rZWRFbGVtZW50KCk7Ci0JCQlmb3IgKGludCBpbmRleCA9IDA7IGluZGV4IDwgcHJvdmlkZXJzLnNpemUoKSAmJiBpbWFnZSA9PSBudWxsOyBpbmRleCsrKSB7Ci0JCQkJSURpYWdyYW1JY29uUHJvdmlkZXIgaVByb3ZpZGVyID0gcHJvdmlkZXJzLmdldChpbmRleCk7Ci0JCQkJaW1hZ2UgPSBpUHJvdmlkZXIuZ2V0SW1hZ2VGb3JFbGVtZW50KG1lLCBzbWFsbEljb24pOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGltYWdlOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGxvYWRzIHRoZSBpY29uIHByb3ZpZGVycyBmcm9tIHRoZSBleHRlbnNpb24gcG9pbnQKLQkgKi8KLQlwcml2YXRlIHZvaWQgbG9hZFByb3ZpZGVycygpIHsKLQkJcHJvdmlkZXJzID0gbmV3IEFycmF5TGlzdDxJRGlhZ3JhbUljb25Qcm92aWRlcj4oKTsKLQkJSUV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5ID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKTsKLQkJSUV4dGVuc2lvblBvaW50IGV4dGVuc2lvblBvaW50ID0gZXh0ZW5zaW9uUmVnaXN0cnkuZ2V0RXh0ZW5zaW9uUG9pbnQoCi0JCQkJRVhURU5TSU9OX1BPSU5UX05BTUVTUEFDRSwgRVhURU5TSU9OX1BPSU5UX05BTUUpOwotCQlpZiAoZXh0ZW5zaW9uUG9pbnQgIT0gbnVsbCkgewotCQkJSUV4dGVuc2lvbltdIGV4dGVuc2lvbnMgPSBleHRlbnNpb25Qb2ludC5nZXRFeHRlbnNpb25zKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGV4dGVuc2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCQlJRXh0ZW5zaW9uIGV4dGVuc2lvbiA9IGV4dGVuc2lvbnNbaV07Ci0JCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gY29uZmlnRWxlbWVudHMgPSBleHRlbnNpb24KLQkJCQkJCS5nZXRDb25maWd1cmF0aW9uRWxlbWVudHMoKTsKLQkJCQlmb3IgKGludCBqID0gMDsgaiA8IGNvbmZpZ0VsZW1lbnRzLmxlbmd0aDsgaisrKSB7Ci0JCQkJCUlDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWdFbGVtZW50ID0gY29uZmlnRWxlbWVudHNbal07Ci0JCQkJCXRyeSB7Ci0JCQkJCQlwcm92aWRlcnMuYWRkKChJRGlhZ3JhbUljb25Qcm92aWRlcikgY29uZmlnRWxlbWVudAotCQkJCQkJCQkuY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbihDTEFTU19BVFRSSUJfTkFNRSkpOwotCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2NvcmUvcHJvdmlkZXJzL0lEaWFncmFtSWNvblByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9jb3JlL3Byb3ZpZGVycy9JRGlhZ3JhbUljb25Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NzUwZmUzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2NvcmUvcHJvdmlkZXJzL0lEaWFncmFtSWNvblByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUucHJvdmlkZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeGVjdXRhYmxlRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0KLS8qKgotICogVGhpcyBpbnRlcmZhY2UgaXMgdXNlZCB0byBpbXBsZW1lbnQgYW4gaWNvbiBwcm92aWRlciBmb3IgdGhlIGRpYWdyYW1zLgotICogCi0gKiBAYXV0aG9yIFBpZXJyZSBQYWRvdmFuaQotICogCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSURpYWdyYW1JY29uUHJvdmlkZXIgZXh0ZW5kcyBJRXhlY3V0YWJsZUV4dGVuc2lvbiB7Ci0KLQkvKioKLQkgKiBUaGlzIHJlcXVpcmVkIG1ldGhvZCwgc2hvdWxkIHJldHVybiBhbiBpbWFnZSBmb3IgdGhlIHN1cHBsaWVkIG1ldGhvZAotCSAqIGVsZW1lbnQsIG9yIG51bGwgaWYgbm90IGF2YWlsYWJsZS4gQSBib29sZWFuIGluZGljYXRpbmcgdGhlIHNpemUgc21hbGwKLQkgKiAoMTZ4MTYpIG9yIGxhcmdlICgzMngzMikgb2YgdGhlIGljb24gbXVzdCBiZSBob25vcmVkIGFzIHdlbGwuCi0JICogCi0JICogQHBhcmFtIG1lCi0JICogICAgICAgICAgICBNZXRob2RFbGVtZW50Ci0JICogQHBhcmFtIHNtYWxsSWNvbgotCSAqICAgICAgICAgICAgYm9vbGVhbgotCSAqIEByZXR1cm4gSW1hZ2UKLQkgKi8KLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2VGb3JFbGVtZW50KE1ldGhvZEVsZW1lbnQgbWUsIGJvb2xlYW4gc21hbGxJY29uKTsKLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vY29yZS9wcm92aWRlcnMvU2hhcmVkUmVzb3VyY2VEaWFncmFtRG9jdW1lbnRQcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vY29yZS9wcm92aWRlcnMvU2hhcmVkUmVzb3VyY2VEaWFncmFtRG9jdW1lbnRQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NzU4MmY3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2NvcmUvcHJvdmlkZXJzL1NoYXJlZFJlc291cmNlRGlhZ3JhbURvY3VtZW50UHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5wcm92aWRlcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVN0b3JhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5JU2NoZWR1bGluZ1J1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi53b3Jrc3BhY2UudXRpbC5Xb3Jrc3BhY2VTeW5jaHJvbml6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5Db21tb25QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS51dGlsLk1zZ0JveDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLkRpYWdyYW1Db3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUucGFydC5EaWFncmFtRWRpdG9ySW5wdXRQcm94eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnBhcnQuSURpYWdyYW1GaWxlRWRpdG9ySW5wdXRQcm94eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnBhcnQudXRpbC5EaWFncmFtRWRpdG9yVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnNlcnZpY2VzLkRpYWdyYW1NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuc2VydmljZXMuRmlsZVN5bmNocm9uaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC51dGlsLlR4VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VydmljZXMuU2VydmljZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzLklMaWJyYXJ5UGVyc2lzdGVyLkZhaWxTYWZlTWV0aG9kTGlicmFyeVBlcnNpc3RlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi5jb3JlLnV0aWwuTG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVzb3VyY2VzLmVkaXRvci5kb2N1bWVudC5EaWFncmFtRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXNvdXJjZXMuZWRpdG9yLmRvY3VtZW50LkRpYWdyYW1Nb2RpZmljYXRpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlc291cmNlcy5lZGl0b3IuZG9jdW1lbnQuSURpYWdyYW1Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlc291cmNlcy5lZGl0b3IuZG9jdW1lbnQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVzb3VyY2VzLmVkaXRvci5pZGUuZG9jdW1lbnQuRmlsZURpYWdyYW1Eb2N1bWVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVzb3VyY2VzLmVkaXRvci5pZGUuZG9jdW1lbnQuU3RvcmFnZURpYWdyYW1Eb2N1bWVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVzb3VyY2VzLmVkaXRvci5pZGUuZG9jdW1lbnQuV29ya3NwYWNlT3BlcmF0aW9uUnVubmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVzb3VyY2VzLmVkaXRvci5pZGUuaW50ZXJuYWwuRWRpdG9ySURFUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVzb3VyY2VzLmVkaXRvci5pZGUuaW50ZXJuYWwubDEwbi5FZGl0b3JNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlc291cmNlcy5lZGl0b3IuaW50ZXJuYWwuRWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVzb3VyY2VzLmVkaXRvci5pbnRlcm5hbC5FZGl0b3JTdGF0dXNDb2RlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5EaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLklSdW5uYWJsZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklGaWxlRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVN0b3JhZ2VFZGl0b3JJbnB1dDsKLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICoKLSAqIEBzaW5jZSAxLjIKLSAqLwotcHVibGljIGNsYXNzIFNoYXJlZFJlc291cmNlRGlhZ3JhbURvY3VtZW50UHJvdmlkZXIgZXh0ZW5kcyBTdG9yYWdlRGlhZ3JhbURvY3VtZW50UHJvdmlkZXIgCi17Ci0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgRmlsZURpYWdyYW1Eb2N1bWVudFByb3ZpZGVyRXggZXh0ZW5kcyBGaWxlRGlhZ3JhbURvY3VtZW50UHJvdmlkZXIgewotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIElTY2hlZHVsaW5nUnVsZSBnZXRTYXZlUnVsZShPYmplY3QgZWxlbWVudCkgewotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJRmlsZUVkaXRvcklucHV0KSB7Ci0JCQkJSUZpbGVFZGl0b3JJbnB1dCBpbnB1dD0gKElGaWxlRWRpdG9ySW5wdXQpIGVsZW1lbnQ7Ci0JCQkJcmV0dXJuIGNvbXB1dGVTYXZlU2NoZWR1bGluZ1J1bGUoaW5wdXQuZ2V0RmlsZSgpKTsKLQkJCX0KLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCQotCQkvKioKLQkJICogQ29tcHV0ZXMgdGhlIHNjaGVkdWxpbmcgcnVsZSBuZWVkZWQgdG8gY3JlYXRlIG9yIG1vZGlmeSBhIHJlc291cmNlLiBJZgotCQkgKiB0aGUgcmVzb3VyY2UgZXhpc3RzLCBpdHMgbW9kaWZ5IHJ1bGUgaXMgcmV0dXJuZWQuIElmIGl0IGRvZXMgbm90LCB0aGUKLQkJICogcmVzb3VyY2UgaGllcmFyY2h5IGlzIGl0ZXJhdGVkIHRvd2FyZHMgdGhlIHdvcmtzcGFjZSByb290IHRvIGZpbmQgdGhlCi0JCSAqIGZpcnN0IHBhcmVudCBvZiA8Y29kZT50b0NyZWF0ZU9yTW9kaWZ5PC9jb2RlPiB0aGF0IGV4aXN0cy4gVGhlbiB0aGUKLQkJICogJ2NyZWF0ZScgcnVsZSBmb3IgdGhlIGxhc3Qgbm9uLWV4aXN0aW5nIHJlc291cmNlIGlzIHJldHVybmVkLgotCQkgKgotCQkgKiBAcGFyYW0gdG9DcmVhdGVPck1vZGlmeSB0aGUgcmVzb3VyY2UgdG8gY3JlYXRlIG9yIG1vZGlmeQotCQkgKiBAcmV0dXJuIHRoZSBtaW5pbWFsIHNjaGVkdWxpbmcgcnVsZSBuZWVkZWQgdG8gbW9kaWZ5IG9yIGNyZWF0ZSBhIHJlc291cmNlCi0JCSAqLwotCQlwcml2YXRlIElTY2hlZHVsaW5nUnVsZSBjb21wdXRlU2F2ZVNjaGVkdWxpbmdSdWxlKElSZXNvdXJjZSB0b0NyZWF0ZU9yTW9kaWZ5KSB7Ci0JCQlpZiAodG9DcmVhdGVPck1vZGlmeS5leGlzdHMoKSAmJiB0b0NyZWF0ZU9yTW9kaWZ5LmlzU3luY2hyb25pemVkKElSZXNvdXJjZS5ERVBUSF9aRVJPKSkKLQkJCQlyZXR1cm4gZlJlc291cmNlUnVsZUZhY3RvcnkucmVmcmVzaFJ1bGUodG9DcmVhdGVPck1vZGlmeSk7Ci0KLQkJCUlSZXNvdXJjZSBwYXJlbnQ9IHRvQ3JlYXRlT3JNb2RpZnk7Ci0JCQlkbyB7Ci0JCQkJIC8qCi0JCQkJICogWFhYIFRoaXMgaXMgYSB3b3JrYXJvdW5kIGZvciBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9Njc2MDEKLQkJCQkgKiBJUmVzb3VyY2VSdWxlRmFjdG9yeS5jcmVhdGVSdWxlIHNob3VsZCBpdGVyYXRlIHRoZSBoaWVyYXJjaHkgaXRzZWxmLgotCQkJCSAqLwotCQkJCXRvQ3JlYXRlT3JNb2RpZnk9IHBhcmVudDsKLQkJCQlwYXJlbnQ9IHRvQ3JlYXRlT3JNb2RpZnkuZ2V0UGFyZW50KCk7Ci0JCQl9IHdoaWxlIChwYXJlbnQgIT0gbnVsbCAmJiAhcGFyZW50LmV4aXN0cygpICYmICFwYXJlbnQuaXNTeW5jaHJvbml6ZWQoSVJlc291cmNlLkRFUFRIX1pFUk8pKTsKLQotCQkJcmV0dXJuIGZSZXNvdXJjZVJ1bGVGYWN0b3J5LmNyZWF0ZVJ1bGUodG9DcmVhdGVPck1vZGlmeSk7Ci0JCX0KLQkJCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgSVJ1bm5hYmxlQ29udGV4dCBnZXRPcGVyYXRpb25SdW5uZXIoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCQlyZXR1cm4gc3VwZXIuZ2V0T3BlcmF0aW9uUnVubmVyKG1vbml0b3IpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIEZpbGVEaWFncmFtRG9jdW1lbnRQcm92aWRlckV4IGZpbGVEaWFncmFtRG9jdW1lbnRQcm92aWRlciA9IG5ldyBGaWxlRGlhZ3JhbURvY3VtZW50UHJvdmlkZXJFeCgpOwotCQotCS8vYSBTdG9yYWdlSW5mbyB3aXRoIGEgRGlhZ3JhbU1vZGlmaWNhdGlvbkxpc3RlbmVyIAotCXByaXZhdGUgY2xhc3MgRGlhZ3JhbVN0b3JhZ2VJbmZvIGV4dGVuZHMgU3RvcmFnZUluZm8gewotCi0JCURpYWdyYW1Nb2RpZmljYXRpb25MaXN0ZW5lciBmTGlzdGVuZXI7Ci0JCXB1YmxpYyBEaWFncmFtU3RvcmFnZUluZm8oSURvY3VtZW50IGRvY3VtZW50LCBEaWFncmFtTW9kaWZpY2F0aW9uTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJCXN1cGVyKGRvY3VtZW50KTsKLQkJCWZMaXN0ZW5lciA9IGxpc3RlbmVyOwotCQl9Ci0JCQotCX0KLQotCXByaXZhdGUgV29ya3NwYWNlT3BlcmF0aW9uUnVubmVyIGZPcGVyYXRpb25SdW5uZXI7Ci0JcHJpdmF0ZSBEaWFncmFtTWFuYWdlciBmRGlhZ3JhbU1ncjsKLQlwcml2YXRlIGJvb2xlYW4gbG9ja2VkID0gZmFsc2U7Ci0KLQlwdWJsaWMgU2hhcmVkUmVzb3VyY2VEaWFncmFtRG9jdW1lbnRQcm92aWRlcihEaWFncmFtTWFuYWdlciBkaWFncmFtTWdyKSB7Ci0JCXN1cGVyKCk7Ci0JCWZEaWFncmFtTWdyID0gZGlhZ3JhbU1ncjsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIGJvb2xlYW4gc2V0RG9jdW1lbnRDb250ZW50KElEb2N1bWVudCBkb2N1bWVudCwgSUVkaXRvcklucHV0IGVkaXRvcklucHV0KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmKGRvY3VtZW50IGluc3RhbmNlb2YgSURpYWdyYW1Eb2N1bWVudCkgewotCQkJKChJRGlhZ3JhbURvY3VtZW50KWRvY3VtZW50KS5zZXRFZGl0aW5nRG9tYWluKGZEaWFncmFtTWdyLmdldEVkaXRpbmdEb21haW4oKSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLnNldERvY3VtZW50Q29udGVudChkb2N1bWVudCwgZWRpdG9ySW5wdXQpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXNvdXJjZXMuZWRpdG9yLmlkZS5kb2N1bWVudC5TdG9yYWdlRGlhZ3JhbURvY3VtZW50UHJvdmlkZXIjc2V0RG9jdW1lbnRDb250ZW50RnJvbVN0b3JhZ2Uob3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXNvdXJjZXMuZWRpdG9yLmRvY3VtZW50LklEb2N1bWVudCwgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVN0b3JhZ2UpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0RG9jdW1lbnRDb250ZW50RnJvbVN0b3JhZ2UoSURvY3VtZW50IGRvY3VtZW50LCBJU3RvcmFnZSBzdG9yYWdlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCURpYWdyYW0gZGlhZ3JhbSA9IChEaWFncmFtKWRvY3VtZW50LmdldENvbnRlbnQoKTsKLQkJaWYoZGlhZ3JhbSAhPSBudWxsKSB7Ci0JCQlSZXNvdXJjZSByZXNvdXJjZSA9IGRpYWdyYW0uZVJlc291cmNlKCk7Ci0JCQlJRmlsZSByZXNvdXJjZUZpbGUgPSBXb3Jrc3BhY2VTeW5jaHJvbml6ZXIuZ2V0RmlsZShyZXNvdXJjZSk7Ci0JCQkvLyB1bmxvYWQgaWYgdGhlIHJlc291cmNlRmlsZSBhbmQgc3RvcmFnZSBpcyBzYW1lLgotCQkJLy8gaWYgbm90IHNhbWUgdGhyb3cgZXhjZXB0aW9uLgotCQkJaWYocmVzb3VyY2VGaWxlICE9IG51bGwpIHsKLQkJCQlpZihyZXNvdXJjZUZpbGUuZXF1YWxzKHN0b3JhZ2UpKSB7Ci0JCQkJCWRvY3VtZW50LnNldENvbnRlbnQobnVsbCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBFZGl0b3JJREVQbHVnaW4uZ2V0UGx1Z2luSWQoKSwgRWRpdG9yU3RhdHVzQ29kZXMuRVJST1IsIEVkaXRvck1lc3NhZ2VzLkZpbGVEb2N1bWVudFByb3ZpZGVyX2hhbmRsZUVsZW1lbnRDb250ZW50Q2hhbmdlZCwgbnVsbCkpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlkb2N1bWVudC5zZXRDb250ZW50KCgob3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5yZXNvdXJjZXMuSURpYWdyYW1TdG9yYWdlKXN0b3JhZ2UpLmdldERpYWdyYW0oKSk7Ci0JfQotCQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXNvdXJjZXMuZWRpdG9yLmlkZS5kb2N1bWVudC5TdG9yYWdlRGlhZ3JhbURvY3VtZW50UHJvdmlkZXIjZGlzcG9zZUVsZW1lbnRJbmZvKGphdmEubGFuZy5PYmplY3QsIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVzb3VyY2VzLmVkaXRvci5kb2N1bWVudC5BYnN0cmFjdERvY3VtZW50UHJvdmlkZXIuRWxlbWVudEluZm8pCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZGlzcG9zZUVsZW1lbnRJbmZvKE9iamVjdCBlbGVtZW50LCBFbGVtZW50SW5mbyBpbmZvKSB7Ci0JCSgoRGlhZ3JhbVN0b3JhZ2VJbmZvKWluZm8pLmZMaXN0ZW5lci5zdG9wTGlzdGVuaW5nKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZG9TYXZlRG9jdW1lbnQoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBPYmplY3QgZWxlbWVudCwgSURvY3VtZW50IGRvY3VtZW50LCBib29sZWFuIG92ZXJ3cml0ZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlmaW5hbCBEaWFncmFtIGRpYWdyYW0gPSAoRGlhZ3JhbSkgZG9jdW1lbnQuZ2V0Q29udGVudCgpOwotCQkvL1RPRE86IGhhbmRsZSBjYXNlIHdoZXJlIHVzZXIgZGlkIG5vdCByZWZyZXNoIGRpYWdyYW0gYWZ0ZXIgZGlhZ3JhbSdzIHJlc291cmNlIGhhcyBiZWVuIHJlbG9hZGVkCi0JCS8vIGRpYWdyYW0gZG9lcyBub3QgaGF2ZSBhIHJlc291cmNlIGluIHRoaXMgY2FzZQotCQkvLyBpZiBvdmVyd3JpdGUgYWxsb3dlZCwgdGhpcyBkaWFncmFtIHNob3VsZCByZXBsYWNlIHRoZSBkaWFncmFtIGluIHRoZSByZWxvYWRlZCByZXNvdXJjZS4KLQkJLy8KLQkJUmVzb3VyY2UgcmVzb3VyY2UgPSBkaWFncmFtLmVSZXNvdXJjZSgpOwotCQlpZiAoIW92ZXJ3cml0ZSkgewotCQkJRGlhZ3JhbU1hbmFnZXIuY2hlY2tTeW5jaHJvbml6YXRpb25TdGF0ZShyZXNvdXJjZSk7Ci0JCX0JCQotCQlJU3RhdHVzIHN0YXR1cyA9IFNlcnZpY2VzLmdldEFjY2Vzc0NvbnRyb2xsZXIoKS5jaGVja01vZGlmeShuZXcgUmVzb3VyY2VbXSB7cmVzb3VyY2V9LCBNc2dCb3guZ2V0RGVmYXVsdFNoZWxsKCkpOwotCQlpZighc3RhdHVzLmlzT0soKSkgewotCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24oc3RhdHVzKTsKLQkJfQotCQkKLQkJLy8gaW5mb3JtIGFib3V0IHRoZSB1cGNvbWluZyBjb250ZW50IGNoYW5nZQotCQlmaXJlRWxlbWVudFN0YXRlQ2hhbmdpbmcoZWxlbWVudCk7Ci0JCQotCQlpZihkaWFncmFtLmdldEVsZW1lbnQoKSBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkRpYWdyYW0pIHsKLQkJCXRyeSB7Ci0JCQkJVHhVdGlsLnJ1bkluVHJhbnNhY3Rpb24oZGlhZ3JhbSwgbmV3IFJ1bm5hYmxlKCkgewotCi0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCWRpYWdyYW0ucGVyc2lzdENoaWxkcmVuKCk7Ci0JCQkJCQlmb3IgKE9iamVjdCBjaGlsZCA6IGRpYWdyYW0uZ2V0Q2hpbGRyZW4oKSkgewotCQkJCQkJCSgoVmlldykgY2hpbGQpLnBlcnNpc3RDaGlsZHJlbigpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCQotCQkJCX0pOwotCQkJfSBjYXRjaCAoRXhlY3V0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCQlEaWFncmFtQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQl9Ci0JCX0KLQkJCi0JCUZhaWxTYWZlTWV0aG9kTGlicmFyeVBlcnNpc3RlciBwZXJzaXN0ZXIgPSBTZXJ2aWNlcy5nZXRMaWJyYXJ5UGVyc2lzdGVyKFNlcnZpY2VzLlhNSV9QRVJTSVNURU5DRV9UWVBFKS5nZXRGYWlsU2FmZVBlcnNpc3RlcigpOwotCQl0cnkgewotLy8JCQlyZXNvdXJjZS5zYXZlKENvbGxlY3Rpb25zLkVNUFRZX01BUCk7Ci0JCQlwZXJzaXN0ZXIuc2F2ZShyZXNvdXJjZSk7Ci0JCQlwZXJzaXN0ZXIuY29tbWl0KCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlDb21tb25QbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCi0JCQlwZXJzaXN0ZXIucm9sbGJhY2soKTsKLQkJCQotCQkJLy8gaW5mb3JtIGFib3V0IGZhaWx1cmUKLQkJCWZpcmVFbGVtZW50U3RhdGVDaGFuZ2VGYWlsZWQoZWxlbWVudCk7Ci0JCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIERpYWdyYW1Db3JlUGx1Z2luLlBMVUdJTl9JRAotCQkJCQksIEVkaXRvclN0YXR1c0NvZGVzLlJFU09VUkNFX0ZBSUxVUkUsIGUKLQkJCQkJLmdldExvY2FsaXplZE1lc3NhZ2UoKSwgbnVsbCkpOwotCQl9Ci0JCQotCQl0cnkgewotCQkJZkRpYWdyYW1NZ3IucmVtb3ZlRGlhZ3JhbUJhY2t1cChnZXRBY3Rpdml0eSgoSUVkaXRvcklucHV0KSBlbGVtZW50KSwgZGlhZ3JhbS5nZXRUeXBlKCkpOwotCQkJaWYoRGlhZ3JhbU1hbmFnZXIuQUREX2tpbmQuZXF1YWxzKGRpYWdyYW0uZ2V0VHlwZSgpKQotCQkJCQl8fCBEaWFncmFtTWFuYWdlci5XUERfa2luZC5lcXVhbHMoZGlhZ3JhbS5nZXRUeXBlKCkpKSB7Ci0JCQkJb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuRGlhZ3JhbSBkID0gKG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkRpYWdyYW0pIGRpYWdyYW0uZ2V0RWxlbWVudCgpOwotCQkJCWQuc2V0TmV3KGZhbHNlKTsKLQkJCX0KLQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiB4KSB7Ci0JCQkvLyBpbmZvcm0gYWJvdXQgZmFpbHVyZQotCQkJZmlyZUVsZW1lbnRTdGF0ZUNoYW5nZUZhaWxlZChlbGVtZW50KTsKLQkJCXRocm93IHg7Ci0JCX0KLQkJCi0JCWlmKG1vbml0b3IgIT0gbnVsbCkgewotCQkJbW9uaXRvci5kb25lKCk7Ci0JCX0KLQkJCi0JCWxvZ1Jlc291cmNlRXJyb3JzQW5kV2FybmluZ3MocmVzb3VyY2UpOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyB2b2lkIGxvZ1Jlc291cmNlRXJyb3JzQW5kV2FybmluZ3MoUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gcmVzb3VyY2UuZ2V0RXJyb3JzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlSZXNvdXJjZS5EaWFnbm9zdGljIGRpYWdub3N0aWMgPSAoUmVzb3VyY2UuRGlhZ25vc3RpYykgaXRlci5uZXh0KCk7Ci0JCQlMb2cuZXJyb3IoRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCksIEVkaXRvclN0YXR1c0NvZGVzLkVSUk9SLCBkaWFnbm9zdGljLmdldE1lc3NhZ2UoKSk7CQkJCQotCQl9Ci0KLQkJZm9yIChJdGVyYXRvciBpdGVyID0gcmVzb3VyY2UuZ2V0V2FybmluZ3MoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCVJlc291cmNlLkRpYWdub3N0aWMgZGlhZ25vc3RpYyA9IChSZXNvdXJjZS5EaWFnbm9zdGljKSBpdGVyLm5leHQoKTsKLQkJCUxvZy53YXJuaW5nKEVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLCBFZGl0b3JTdGF0dXNDb2Rlcy5XQVJOSU5HLCBkaWFnbm9zdGljLmdldE1lc3NhZ2UoKSk7CQkJCQotCQl9Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGxvbmcgZ2V0TW9kaWZpY2F0aW9uU3RhbXAoT2JqZWN0IGVsZW1lbnQpIHsKLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJRmlsZUVkaXRvcklucHV0KSB7Ci0JCQlJRmlsZUVkaXRvcklucHV0IGlucHV0PSAoSUZpbGVFZGl0b3JJbnB1dCkgZWxlbWVudDsKLQkJCXJldHVybiBGaWxlU3luY2hyb25pemVyLmNvbXB1dGVNb2RpZmljYXRpb25TdGFtcChpbnB1dC5nZXRGaWxlKCkpOwotCQl9Ci0KLQkJcmV0dXJuIHN1cGVyLmdldE1vZGlmaWNhdGlvblN0YW1wKGVsZW1lbnQpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRDb250ZW50KElFZGl0b3JJbnB1dCBpbnB1dCkgewotCQlFbGVtZW50SW5mbyBpbmZvID0gZ2V0RWxlbWVudEluZm8oaW5wdXQpOwotCQlpZiAoaW5mbyA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCUlEb2N1bWVudCBkb2N1bWVudCA9IGNyZWF0ZUVtcHR5RG9jdW1lbnQoKTsKLQkJSVN0YXR1cyBzdGF0dXMgPSBudWxsOwotCi0JCXRyeSB7Ci0JCQlzZXREb2N1bWVudENvbnRlbnQoZG9jdW1lbnQsIGlucHV0KTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiB4KSB7Ci0JCQlzdGF0dXMgPSB4LmdldFN0YXR1cygpOwotCQl9Ci0JCQotCQlPYmplY3QgbmV3Q29udGVudD0gZG9jdW1lbnQuZ2V0Q29udGVudCgpOwotCQkKLQkJLy8gc2V0IHRoZSBuZXcgY29udGVudCBhbmQgZmlyZSBjb250ZW50IHJlbGF0ZWQgZXZlbnRzCi0JCWZpcmVFbGVtZW50Q29udGVudEFib3V0VG9CZVJlcGxhY2VkKGlucHV0KTsKLQotCQlyZW1vdmVVbmNoYW5nZWRFbGVtZW50TGlzdGVuZXJzKGlucHV0LCBpbmZvKTsKLQotCQlpbmZvLmZEb2N1bWVudC5yZW1vdmVEb2N1bWVudExpc3RlbmVyKGluZm8pOwotCQlpbmZvLmZEb2N1bWVudC5zZXRDb250ZW50KG5ld0NvbnRlbnQpOwotCQlpbmZvLmZDYW5CZVNhdmVkID0gZmFsc2U7Ci0JCWluZm8uZlN0YXR1cyA9IHN0YXR1czsKLQotCQlhZGRVbmNoYW5nZWRFbGVtZW50TGlzdGVuZXJzKGlucHV0LCBpbmZvKTsKLQotCQlmaXJlRWxlbWVudENvbnRlbnRSZXBsYWNlZChpbnB1dCk7Ci0JfQotCQkKLQkvKioKLQkgKiBVcGRhdGVzIHRoZSBlbGVtZW50IGluZm8gdG8gYSBjaGFuZ2Ugb2YgdGhlIGZpbGUgY29udGVudCBhbmQgc2VuZHMgb3V0Ci0JICogYXBwcm9wcmlhdGUgbm90aWZpY2F0aW9ucy4KLQkgKgotCSAqIEBwYXJhbSBpbnB1dCB0aGUgaW5wdXQgb2YgYSBkb2N1bWVudCBlZGl0b3IKLQkgKi8KLQlwdWJsaWMgdm9pZCBoYW5kbGVFbGVtZW50Q29udGVudENoYW5nZWQoSUVkaXRvcklucHV0IGlucHV0KSB7Ci0JCUVsZW1lbnRJbmZvIGluZm8gPSBnZXRFbGVtZW50SW5mbyhpbnB1dCk7Ci0JCWlmIChpbmZvID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJSURvY3VtZW50IGRvY3VtZW50PSBjcmVhdGVFbXB0eURvY3VtZW50KCk7Ci0JCUlTdGF0dXMgc3RhdHVzPSBudWxsOwotCi0JCXRyeSB7Ci0JCQlzZXREb2N1bWVudENvbnRlbnQoZG9jdW1lbnQsIGlucHV0KTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiB4KSB7Ci0JCQlzdGF0dXM9IHguZ2V0U3RhdHVzKCk7Ci0JCX0KLQotCQlPYmplY3QgbmV3Q29udGVudD0gZG9jdW1lbnQuZ2V0Q29udGVudCgpOwotCi0JCWlmICggIW5ld0NvbnRlbnQuZXF1YWxzKGluZm8uZkRvY3VtZW50LmdldENvbnRlbnQoKSkpIHsKLQotCQkJLy8gc2V0IHRoZSBuZXcgY29udGVudCBhbmQgZmlyZSBjb250ZW50IHJlbGF0ZWQgZXZlbnRzCi0JCQlmaXJlRWxlbWVudENvbnRlbnRBYm91dFRvQmVSZXBsYWNlZChpbnB1dCk7Ci0KLQkJCXJlbW92ZVVuY2hhbmdlZEVsZW1lbnRMaXN0ZW5lcnMoaW5wdXQsIGluZm8pOwotCi0JCQlpbmZvLmZEb2N1bWVudC5yZW1vdmVEb2N1bWVudExpc3RlbmVyKGluZm8pOwotCQkJaW5mby5mRG9jdW1lbnQuc2V0Q29udGVudChuZXdDb250ZW50KTsKLQkJCWluZm8uZkNhbkJlU2F2ZWQ9IGZhbHNlOwotCQkJaW5mby5mU3RhdHVzPSBzdGF0dXM7Ci0KLQkJCWFkZFVuY2hhbmdlZEVsZW1lbnRMaXN0ZW5lcnMoaW5wdXQsIGluZm8pOwotCi0JCQlmaXJlRWxlbWVudENvbnRlbnRSZXBsYWNlZChpbnB1dCk7Ci0KLQkJfSBlbHNlIHsKLQkJCQotCQkJaGFuZGxlRXhpc3RpbmdEb2N1bWVudFNhdmVkKGlucHV0LCBpbmZvLCBzdGF0dXMpOwotCi0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgaGFuZGxlRXhpc3RpbmdEb2N1bWVudFNhdmVkKElFZGl0b3JJbnB1dCBpbnB1dCwgRWxlbWVudEluZm8gaW5mbywgSVN0YXR1cyBzdGF0dXMpIHsKLQkJcmVtb3ZlVW5jaGFuZ2VkRWxlbWVudExpc3RlbmVycyhpbnB1dCwgaW5mbyk7Ci0KLQkJLy8gZmlyZXMgb25seSB0aGUgZGlydHkgc3RhdGUgcmVsYXRlZCBldmVudAotCQlpbmZvLmZDYW5CZVNhdmVkPSBmYWxzZTsKLQkJaW5mby5mU3RhdHVzPSBzdGF0dXM7Ci0KLQkJYWRkVW5jaGFuZ2VkRWxlbWVudExpc3RlbmVycyhpbnB1dCwgaW5mbyk7Ci0KLQkJZmlyZUVsZW1lbnREaXJ0eVN0YXRlQ2hhbmdlZChpbnB1dCwgZmFsc2UpOwkJCi0JfQotCi0JcHVibGljIHZvaWQgbWFya0RvY3VtZW50QXNTYXZlZChJRmlsZUVkaXRvcklucHV0IGlucHV0KSB7Ci0JCUVsZW1lbnRJbmZvIGluZm8gPSBnZXRFbGVtZW50SW5mbyhpbnB1dCk7Ci0JCWlmIChpbmZvID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWhhbmRsZUV4aXN0aW5nRG9jdW1lbnRTYXZlZChpbnB1dCwgaW5mbywgbnVsbCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGRvU3luY2hyb25pemUoT2JqZWN0IGVsZW1lbnQsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZihlbGVtZW50IGluc3RhbmNlb2YgSUVkaXRvcklucHV0KSB7Ci0JCQloYW5kbGVFbGVtZW50Q29udGVudENoYW5nZWQoKElFZGl0b3JJbnB1dCkgZWxlbWVudCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZG9TeW5jaHJvbml6ZShlbGVtZW50LCBtb25pdG9yKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gaXNTeW5jaHJvbml6ZWQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJRWxlbWVudEluZm8gaW5mbyA9IGdldEVsZW1lbnRJbmZvKGVsZW1lbnQpOwotCQlpZihpbmZvLmZEb2N1bWVudCBpbnN0YW5jZW9mIElEaWFncmFtRG9jdW1lbnQpIHsKLQkJCURpYWdyYW0gZGlhZ3JhbSA9ICgoSURpYWdyYW1Eb2N1bWVudClpbmZvLmZEb2N1bWVudCkuZ2V0RGlhZ3JhbSgpOwotCQkJaWYoZGlhZ3JhbSAhPSBudWxsKSB7Ci0JCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSBkaWFncmFtLmVSZXNvdXJjZSgpOwotCQkJCS8vIGEgZGlhZ3JhbSB0aGF0IGRvZXMgbm90IGhhdmUgYSByZXNvdXJjZSBpcyBjb25zaWRlcmVkIGFzIG91dC1vZi1zeW5jaAotCQkJCS8vIGJlY2F1c2UgaXRzIHJlc291cmNlIG11c3QgaGF2ZSBiZWVuIHJlbG9hZGVkLgotCQkJCS8vCi0JCQkJcmV0dXJuIHJlc291cmNlICE9IG51bGwgJiYgRGlhZ3JhbU1hbmFnZXIuaXNTeW5jaHJvbml6ZWQocmVzb3VyY2UpOwotCQkJfQotCQl9Ci0JCXJldHVybiBzdXBlci5pc1N5bmNocm9uaXplZChlbGVtZW50KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgRWxlbWVudEluZm8gY3JlYXRlTmV3RWxlbWVudEluZm8oSURvY3VtZW50IGRvY3VtZW50KSB7Ci0JCURpYWdyYW1Nb2RpZmljYXRpb25MaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBBY2Nlc3NpYmxlRGlhZ3JhbU1vZGlmaWNhdGlvbkxpc3RlbmVyKHRoaXMsIChEaWFncmFtRG9jdW1lbnQpZG9jdW1lbnQpOwotCQlEaWFncmFtU3RvcmFnZUluZm8gaW5mbyA9IG5ldyBEaWFncmFtU3RvcmFnZUluZm8oZG9jdW1lbnQsIGxpc3RlbmVyKTsKLQkJbGlzdGVuZXIuc3RhcnRMaXN0ZW5pbmcoKTsKLQkJcmV0dXJuIGluZm87Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdG9yLkFic3RyYWN0RG9jdW1lbnRQcm92aWRlciNnZXRPcGVyYXRpb25SdW5uZXIob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHJvdGVjdGVkIElSdW5uYWJsZUNvbnRleHQgZ2V0T3BlcmF0aW9uUnVubmVyKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlyZXR1cm4gZmlsZURpYWdyYW1Eb2N1bWVudFByb3ZpZGVyLmdldE9wZXJhdGlvblJ1bm5lcihtb25pdG9yKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRvci5BYnN0cmFjdERvY3VtZW50UHJvdmlkZXIjZ2V0U2F2ZVJ1bGUoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgSVNjaGVkdWxpbmdSdWxlIGdldFNhdmVSdWxlKE9iamVjdCBlbGVtZW50KSB7Ci0JCXJldHVybiBmaWxlRGlhZ3JhbURvY3VtZW50UHJvdmlkZXIuZ2V0U2F2ZVJ1bGUoZWxlbWVudCk7Ci0JfQotCi0JLyoqCi0JICogQWxsb3dzIGVkaXRpbmcgZXZlbiB0aGUgZG9jdW1lbnQgaXMgb3V0IG9mIHN5bmNoLgotCSAqIAotCSAqIEBwYXJhbSBpbnB1dAotCSAqLwotCXB1YmxpYyB2b2lkIGFsbG93RWRpdGluZyhJRWRpdG9ySW5wdXQgaW5wdXQpIHsKLQkJRWxlbWVudEluZm8gaW5mbyA9IGdldEVsZW1lbnRJbmZvKGlucHV0KTsKLQkJaWYoaW5mby5mRG9jdW1lbnQgaW5zdGFuY2VvZiBJRGlhZ3JhbURvY3VtZW50KSB7Ci0JCQlEaWFncmFtIGRpYWdyYW0gPSAoKElEaWFncmFtRG9jdW1lbnQpaW5mby5mRG9jdW1lbnQpLmdldERpYWdyYW0oKTsKLQkJCWlmKGRpYWdyYW0gIT0gbnVsbCAmJiBkaWFncmFtLmVSZXNvdXJjZSgpID09IG51bGwgCi0JCQkJCSYmIGlucHV0IGluc3RhbmNlb2YgSURpYWdyYW1GaWxlRWRpdG9ySW5wdXRQcm94eSkgewotCQkJCUFjdGl2aXR5IGFjdCA9IGdldEFjdGl2aXR5KGlucHV0KTsKLQkJCQlpZihhY3QgIT0gbnVsbCkgewotCQkJCQlmRGlhZ3JhbU1nci5yZXBsYWNlVGVtcG9yYXJpbHkoYWN0LCBkaWFncmFtKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgQWN0aXZpdHkgZ2V0QWN0aXZpdHkoSUVkaXRvcklucHV0IGlucHV0KSB7Ci0JCXJldHVybiAoQWN0aXZpdHkpICgoSURpYWdyYW1GaWxlRWRpdG9ySW5wdXRQcm94eSlpbnB1dCkuZ2V0RGlhZ3JhbUVkaXRvcklucHV0KCkuZ2V0TWV0aG9kRWxlbWVudCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJldmVyc2VUb1NhdmVkKElFZGl0b3JJbnB1dCBpbnB1dCkgewotCQlFbGVtZW50SW5mbyBpbmZvID0gZ2V0RWxlbWVudEluZm8oaW5wdXQpOwotCQlpZihpbmZvLmZEb2N1bWVudCBpbnN0YW5jZW9mIElEaWFncmFtRG9jdW1lbnQpIHsKLQkJCURpYWdyYW0gZGlhZ3JhbSA9ICgoSURpYWdyYW1Eb2N1bWVudClpbmZvLmZEb2N1bWVudCkuZ2V0RGlhZ3JhbSgpOwotCQkJaWYoZGlhZ3JhbSAhPSBudWxsICYmIGRpYWdyYW0uZVJlc291cmNlKCkgIT0gbnVsbCAKLQkJCQkJJiYgaW5wdXQgaW5zdGFuY2VvZiBEaWFncmFtRWRpdG9ySW5wdXRQcm94eSkgewotCQkJCUFjdGl2aXR5IGFjdCA9IGdldEFjdGl2aXR5KGlucHV0KTsKLQkJCQlpZihhY3QgIT0gbnVsbCkgewotCQkJCQlmRGlhZ3JhbU1nci5yZXZlcnNlVG9TYXZlZChhY3QsIGRpYWdyYW0sICgoRGlhZ3JhbUVkaXRvcklucHV0UHJveHkpaW5wdXQpLmdldFByZWZlcmVuY2VIaW50KCkpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkKLQkvKioKLQkgKiBJZiBhIHBsdWdpbiBpcyBsb2NrZWQsIGRpYWdyYW0gZWRpdG9yIGFuZCBkb2N1bWVudCBwcm92aWRlcgotCSAqIHNob3VsZCBiZSBsb2NrZWQsIHRoaXMgaXMgZG9uZSBhZnRlciBsb2FkaW5nIHRoZSBkaWFncmFtIGVkaXRvcgotCSAqIHVzaW5nIHRoaXMgbWV0aG9kLgotCSAqIEBwYXJhbSBsb2NrCi0JICovCi0JcHVibGljIHZvaWQgbG9jayhib29sZWFuIGxvY2spewotCQlsb2NrZWQgPWxvY2s7IAotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVDYWNoZShJU3RvcmFnZUVkaXRvcklucHV0IGlucHV0KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnVwZGF0ZUNhY2hlKGlucHV0KTsKLQkJU3RvcmFnZUluZm8gaW5mbz0gKFN0b3JhZ2VJbmZvKSBnZXRFbGVtZW50SW5mbyhpbnB1dCk7Ci0JCWlmIChpbmZvICE9IG51bGwpIHsKLQkJCWlmKGxvY2tlZCAmJiBpbmZvLmZJc01vZGlmaWFibGUpCi0JCQkJaW5mby5mSXNNb2RpZmlhYmxlPSAhbG9ja2VkOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIAotCSAqIHJldHVybnMgdGhlIGxvY2tlZCBzdGF0ZSBvZiBwbHVnaW4uIAotCSAqIGxvY2tlZCBzdGF0ZSBpcyAgc2V0IHVzaW5nIGxvY2soYm9vbGVhbiBsb2NrKSBtZXRob2QuIAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBnZXRMb2NrZWRTdGF0ZSgpewotCQlyZXR1cm4gbG9ja2VkOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBpc01vZGlmaWFibGUoT2JqZWN0IGVsZW1lbnQpIHsKLQkJaWYoIURpYWdyYW1FZGl0b3JVdGlsLmlzTW9kaWZpYWJsZShlbGVtZW50KSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiBzdXBlci5pc01vZGlmaWFibGUoZWxlbWVudCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vY29yZS9yZXNvdXJjZXMvSURpYWdyYW1TdG9yYWdlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9jb3JlL3Jlc291cmNlcy9JRGlhZ3JhbVN0b3JhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTk2MDVjMy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9jb3JlL3Jlc291cmNlcy9JRGlhZ3JhbVN0b3JhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnJlc291cmNlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklTdG9yYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkRpYWdyYW07Ci0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqCi0gKiBAc2luY2UgMS4yCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSURpYWdyYW1TdG9yYWdlIGV4dGVuZHMgSVN0b3JhZ2UgewotCURpYWdyYW0gZ2V0RGlhZ3JhbSgpOwotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vY29yZS9zZXJ2aWNlcy9EaWFncmFtSGVscGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9jb3JlL3NlcnZpY2VzL0RpYWdyYW1IZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjNiNTE2Zi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9jb3JlL3NlcnZpY2VzL0RpYWdyYW1IZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxMyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLyoqCi0gKiAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnNlcnZpY2VzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVNb2RlbEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvcHlDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5UcmFuc2FjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uaW1wbC5JbnRlcm5hbFRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24uQ29tbW9uUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuRGlhZ3JhbUNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5EaWFncmFtQ29yZVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLmJyaWRnZS5CcmlkZ2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5icmlkZ2UuRGlhZ3JhbUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwudXRpbC5UeFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLklEaWFncmFtTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UuRmlsZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzLlNlcnZpY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy5JTGlicmFyeVBlcnNpc3Rlci5GYWlsU2FmZU1ldGhvZExpYnJhcnlQZXJzaXN0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5VbWFVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5EaWFncmFtRWRpdGluZ0RvbWFpbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci0KLS8qKgotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMgotICovCi1wdWJsaWMgY2xhc3MgRGlhZ3JhbUhlbHBlciB7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnRbXSBESUFHUkFNX1RZUEVTID0geyBJRGlhZ3JhbU1hbmFnZXIuQUNUSVZJVFlfRElBR1JBTSwKLQkJSURpYWdyYW1NYW5hZ2VyLkFDVElWSVRZX0RFVEFJTF9ESUFHUkFNLCBJRGlhZ3JhbU1hbmFnZXIuV09SS19QUk9EVUNUX0RFUEVOREVOQ1lfRElBR1JBTSB9OwotCi0JCi0JcHVibGljIHN0YXRpYyBpbnQgZ2V0RGlhZ3JhbVR5cGUoRGlhZ3JhbSBkaWFncmFtKXsKLQkJU3RyaW5nIHR5cGVTdHIgPSBkaWFncmFtLmdldFR5cGUoKTsKLQkJaWYodHlwZVN0ci5lcXVhbHMoRGlhZ3JhbU1hbmFnZXIuQURfa2luZCkpewotCQkJcmV0dXJuIElEaWFncmFtTWFuYWdlci5BQ1RJVklUWV9ESUFHUkFNOwotCQl9Ci0JCWlmKHR5cGVTdHIuZXF1YWxzKERpYWdyYW1NYW5hZ2VyLkFERF9raW5kKSl7Ci0JCQlyZXR1cm4gSURpYWdyYW1NYW5hZ2VyLkFDVElWSVRZX0RFVEFJTF9ESUFHUkFNOwotCQl9Ci0JCWlmKHR5cGVTdHIuZXF1YWxzKERpYWdyYW1NYW5hZ2VyLldQRF9raW5kKSl7Ci0JCQlyZXR1cm4gSURpYWdyYW1NYW5hZ2VyLldPUktfUFJPRFVDVF9ERVBFTkRFTkNZX0RJQUdSQU07Ci0JCX0KLQkJcmV0dXJuIC0xOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIE5vZGUgZmluZE5vZGUoRGlhZ3JhbSBkaWFncmFtLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChvYmplY3QgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBkaWFncmFtLmdldENoaWxkcmVuKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlWaWV3IHZpZXcgPSAoVmlldykgaXRlci5uZXh0KCk7CQkJCi0JCQlpZiAodmlldyBpbnN0YW5jZW9mIE5vZGUgJiYgdmlldy5nZXRFbGVtZW50KCkgIT0gbnVsbCkgewotCQkJCU9iamVjdCBlID0gbnVsbDsKLQkJCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCAmJiB2aWV3LmdldEVsZW1lbnQoKSBpbnN0YW5jZW9mIEVNb2RlbEVsZW1lbnQpIHsKLQkJCQkJRU1vZGVsRWxlbWVudCBtb2RlbEVsZW1lbnQgPSAoRU1vZGVsRWxlbWVudCkgdmlldy5nZXRFbGVtZW50KCk7Ci0JCQkJCWUgPSBCcmlkZ2VIZWxwZXIuZ2V0TWV0aG9kRWxlbWVudChtb2RlbEVsZW1lbnQpOwotCQkJCQlpZihlID09IG51bGwpIHsKLQkJCQkJCS8vIGRpYWdyYW0gaXMgbm90IG9wZW4geWV0LCB0cnkgdG8gcmVzb2x2ZSB0aGUgZWxlbWVudCBmcm9tIFVSSSBzdG9yZWQgaW4gdGhlIG5vZGUncyBhbm5vdGF0aW9uCi0JCQkJCQkvLwotCQkJCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSAoKE1ldGhvZEVsZW1lbnQpb2JqZWN0KS5lUmVzb3VyY2UoKTsKLQkJCQkJCWlmKHJlc291cmNlLmdldFJlc291cmNlU2V0KCkgIT0gbnVsbCkgewotCQkJCQkJCWUgPSBCcmlkZ2VIZWxwZXIuZ2V0TWV0aG9kRWxlbWVudEZyb21Bbm5vdGF0aW9uKG1vZGVsRWxlbWVudCwgcmVzb3VyY2UuZ2V0UmVzb3VyY2VTZXQoKSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQllID0gdmlldy5nZXRFbGVtZW50KCk7Ci0JCQkJfQotCQkJCWlmIChvYmplY3QuZXF1YWxzKGUpKSB7Ci0JCQkJCXJldHVybiAoTm9kZSkgdmlldzsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgTm9kZSBmaW5kTm9kZUluTW9kZWxEaWFncmFtKERpYWdyYW0gZGlhZ3JhbSwgTWV0aG9kRWxlbWVudCBlKXsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZGlhZ3JhbS5nZXRDaGlsZHJlbigpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJVmlldyB2aWV3ID0gKFZpZXcpIGl0ZXIubmV4dCgpOwotCQkJaWYodmlldyBpbnN0YW5jZW9mIE5vZGUpewotCQkJCU9iamVjdCBleCA9IG51bGw7Ci0JCQkJRU9iamVjdCBtb2RlbCA9IHZpZXcuZ2V0RWxlbWVudCgpOwotCQkJCWlmKG1vZGVsIGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZSl7Ci0JCQkJCWV4ID0gKChvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlKW1vZGVsKS5nZXRMaW5rZWRFbGVtZW50KCk7Ci0JCQkJCWlmKGV4ICE9IG51bGwgJiYgZXggPT0gZSl7Ci0JCQkJCQlyZXR1cm4gKE5vZGUpdmlldzsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogRGVsZXRlcyB0aGUgZGlhZ3JhbSBhbmQgc2F2ZXMgaW1tZWRpYXRlbHkuCi0JICogQHBhcmFtIGRpYWdyYW0KLQkgKiBAdGhyb3dzIEV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBkZWxldGVEaWFncmFtKGZpbmFsIERpYWdyYW0gZGlhZ3JhbSwgYm9vbGVhbiBzYXZlKQotCQkJdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWlmIChkaWFncmFtID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJYm9vbGVhbiBmaWxlRXhpc3QgPSB0cnVlOwotCQlGaWxlIGZpbGUgPSBudWxsOwotCQlPYmplY3QgbGlua2VkT2JqZWN0ID0gbnVsbDsKLQkJUHJvY2VzcyBwcm9jZXNzID0gbnVsbDsKLQkJaWYgKGRpYWdyYW0uZ2V0RWxlbWVudCgpIGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UudW1sMi51bWwuQWN0aXZpdHkpIHsKLQkJCURpYWdyYW1BZGFwdGVyIGFkYXB0ZXIgPSBCcmlkZ2VIZWxwZXIuZ2V0RGlhZ3JhbUFkYXB0ZXIoZGlhZ3JhbQotCQkJCQkuZ2V0RWxlbWVudCgpKTsKLQkJCWlmIChhZGFwdGVyICE9IG51bGwpIHsKLQkJCQlsaW5rZWRPYmplY3QgPSBhZGFwdGVyLmdldFdyYXBwZXIoKTsKLQkJCQlpZiAobGlua2VkT2JqZWN0ID09IG51bGwpIHsKLQkJCQkJbGlua2VkT2JqZWN0ID0gYWRhcHRlci5nZXRFbGVtZW50KCk7Ci0JCQkJfQotCQkJfQotCQl9IGVsc2UgewotCQkJb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuRGlhZ3JhbSBkaWFncmFtTW9kZWwgPSAob3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuRGlhZ3JhbSkgZGlhZ3JhbQotCQkJCQkuZ2V0RWxlbWVudCgpOwotCQkJbGlua2VkT2JqZWN0ID0gZGlhZ3JhbU1vZGVsLmdldExpbmtlZEVsZW1lbnQoKTsKLQkJfQotCi0JCWlmIChsaW5rZWRPYmplY3QgIT0gbnVsbCkgewotCQkJcHJvY2VzcyA9IFRuZ1V0aWwuZ2V0T3duaW5nUHJvY2VzcyhsaW5rZWRPYmplY3QpOwotCQkJU3RyaW5nIGZpbGVQYXRoID0gRGlhZ3JhbU1hbmFnZXIuZ2V0RGlhZ3JhbUZpbGVQYXRoKHByb2Nlc3MpOwotCQkJZmlsZSA9IG5ldyBGaWxlKGZpbGVQYXRoKTsKLQkJCWlmICghZmlsZS5leGlzdHMoKSkKLQkJCQlmaWxlRXhpc3QgPSBmYWxzZTsKLQkJfQotCQlmaW5hbCBSZXNvdXJjZSByZXNvdXJjZSA9IGRpYWdyYW0uZVJlc291cmNlKCk7Ci0JCWlmIChmaWxlID09IG51bGwgJiYgcmVzb3VyY2UgIT0gbnVsbCkgewotCQkJZmlsZSA9IG5ldyBGaWxlKEZpbGVNYW5hZ2VyLnRvRmlsZVN0cmluZyhyZXNvdXJjZQotCQkJCQkuZ2V0VVJJKCkpKTsKLQkJCWlmICghZmlsZS5leGlzdHMoKSkKLQkJCQlmaWxlRXhpc3QgPSBmYWxzZTsKLQkJfQotCi0JCWlmIChyZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQlUeFV0aWwucnVuSW5UcmFuc2FjdGlvbihkaWFncmFtLCBuZXcgUnVubmFibGUoKSB7Ci0KLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCXJlc291cmNlLmdldENvbnRlbnRzKCkucmVtb3ZlKGRpYWdyYW0uZ2V0RWxlbWVudCgpKTsKLQkJCQkJcmVzb3VyY2UuZ2V0Q29udGVudHMoKS5yZW1vdmUoZGlhZ3JhbSk7Ci0JCQkJCVVtYVV0aWwucmVtb3ZlQWxsQWRhcHRlcnMoZGlhZ3JhbS5nZXRFbGVtZW50KCkpOwotCQkJCQlVbWFVdGlsLnJlbW92ZUFsbEFkYXB0ZXJzKGRpYWdyYW0pOwotCQkJCX0KLQkJCQkKLQkJCX0pOwotCQkJCi0JCQlpZiAoIWZpbGVFeGlzdCkKLQkJCQlyZXR1cm47Ci0KLQkJCWlmIChzYXZlKSB7Ci0vLwkJCQlpZiAocmVzb3VyY2UuZ2V0Q29udGVudHMoKS5pc0VtcHR5KCkpIHsKLS8vCQkJCQlpZiAoZmlsZSAhPSBudWxsKSB7Ci0vLwkJCQkJCWlmIChwcm9jZXNzICE9IG51bGwKLS8vCQkJCQkJCQkmJiBEaWFncmFtTWFuYWdlci5oYXNEaWFncmFtTWFuYWdlcihwcm9jZXNzKSkgewotLy8JCQkJCQkJT2JqZWN0IGNvbnN1bWVyID0gbmV3IE9iamVjdCgpOwotLy8JCQkJCQkJRGlhZ3JhbU1hbmFnZXIgbWdyID0gRGlhZ3JhbU1hbmFnZXIuZ2V0SW5zdGFuY2UoCi0vLwkJCQkJCQkJCXByb2Nlc3MsIGNvbnN1bWVyKTsKLS8vCQkJCQkJCW1nci5kaXNwb3NlKCk7Ci0vLwkJCQkJCX0KLS8vCQkJCQkJU2VydmljZXMuZ2V0RmlsZU1hbmFnZXIoKQotLy8JCQkJCQkJCS5kZWxldGUoZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0vLwkJCQkJfQotLy8JCQkJfQotLy8JCQkJZWxzZSB7Ci0JCQkJCUZhaWxTYWZlTWV0aG9kTGlicmFyeVBlcnNpc3RlciBwZXJzaXN0ZXIgPSBTZXJ2aWNlcwotCQkJCQkJCS5nZXRMaWJyYXJ5UGVyc2lzdGVyKFNlcnZpY2VzLlhNSV9QRVJTSVNURU5DRV9UWVBFKQotCQkJCQkJCS5nZXRGYWlsU2FmZVBlcnNpc3RlcigpOwotCQkJCQl0cnkgewotCQkJCQkJcGVyc2lzdGVyLnNhdmUocmVzb3VyY2UpOwotCQkJCQkJcGVyc2lzdGVyLmNvbW1pdCgpOwotCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJQ29tbW9uUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCQkJCXBlcnNpc3Rlci5yb2xsYmFjaygpOwotCQkJCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLAotCQkJCQkJCQlEaWFncmFtQ29yZVBsdWdpbi5QTFVHSU5fSUQsIDEsIGUKLQkJCQkJCQkJCQkuZ2V0TG9jYWxpemVkTWVzc2FnZSgpLCBudWxsKSk7Ci0JCQkJCX0KLS8vCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkKLQkvKioKLQkgKiBDb252ZW5pZW50IG1ldGhvZCB0byBnZXQgZWRpdGluZyBkb21haW4KLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBJbnRlcm5hbFRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIGdldEVkaXRpbmdEb21haW4oKXsKLQkJcmV0dXJuIChJbnRlcm5hbFRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluKSBEaWFncmFtRWRpdGluZ0RvbWFpbkZhY3RvcnkuZ2V0SW5zdGFuY2UoKQotCQkuY3JlYXRlRWRpdGluZ0RvbWFpbigpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIEludGVybmFsVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gZ2V0RWRpdGluZ0RvbWFpbihEaWFncmFtIGRpYWdyYW0pewotCQlpZihkaWFncmFtID09IG51bGwpIHJldHVybiBnZXRFZGl0aW5nRG9tYWluKCk7Ci0JCVJlc291cmNlIHJlc291cmNlID0gZGlhZ3JhbS5lUmVzb3VyY2UoKTsKLQkJaWYocmVzb3VyY2UgPT0gbnVsbCkgcmV0dXJuIGdldEVkaXRpbmdEb21haW4oKTsKLQkJcmV0dXJuIChJbnRlcm5hbFRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluKURpYWdyYW1FZGl0aW5nRG9tYWluRmFjdG9yeS5nZXRJbnN0YW5jZSgpLmdldEVkaXRpbmdEb21haW4ocmVzb3VyY2UuZ2V0UmVzb3VyY2VTZXQoKSk7Ci0JfQotCQotCS8qKgotCSAqIEdldHMgYWxsIGF2YWlsYWJsZSBkaWFncmFtcyBvZiB0aGUgc3BlY2lmaWVkIGFjdGl2aXR5LgotCSAqIAotCSAqIEBwYXJhbSBhY3QKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBDb2xsZWN0aW9uPERpYWdyYW0+IGdldERpYWdyYW1zKEFjdGl2aXR5IGFjdCwgRGlhZ3JhbU1hbmFnZXIgbWdyKSB7Ci0JCXRyeSB7Ci0JCQlBcnJheUxpc3Q8RGlhZ3JhbT4gZGlhZ3JhbXMgPSBuZXcgQXJyYXlMaXN0PERpYWdyYW0+KCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IERJQUdSQU1fVFlQRVMubGVuZ3RoOyBpKyspIHsKLQkJCQlMaXN0PERpYWdyYW0+IGxpc3QgPSBtZ3IuZ2V0RGlhZ3JhbXMoYWN0LCBESUFHUkFNX1RZUEVTW2ldKTsKLQkJCQlpZiAoIWxpc3QuaXNFbXB0eSgpKSB7Ci0JCQkJCWRpYWdyYW1zLmFkZEFsbChsaXN0KTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gZGlhZ3JhbXM7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlEaWFncmFtQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RGlhZ3JhbVR5cGVTdHJpbmcoRGlhZ3JhbSBkaWFncmFtKXsKLQkJU3RyaW5nIHR5cGVTdHIgPSBkaWFncmFtLmdldFR5cGUoKTsKLQkJaWYodHlwZVN0ci5lcXVhbHMoRGlhZ3JhbU1hbmFnZXIuQURfa2luZCkpewotCQkJcmV0dXJuIERpYWdyYW1Db3JlUmVzb3VyY2VzLkFjdGl2aXR5RGlhZ3JhbV9raW5kOwotCQl9Ci0JCWlmKHR5cGVTdHIuZXF1YWxzKERpYWdyYW1NYW5hZ2VyLkFERF9raW5kKSl7Ci0JCQlyZXR1cm4gRGlhZ3JhbUNvcmVSZXNvdXJjZXMuQWN0aXZpdHlEZXRhaWxfRGlhZ3JhbV9raW5kOwotCQl9Ci0JCWlmKHR5cGVTdHIuZXF1YWxzKERpYWdyYW1NYW5hZ2VyLldQRF9raW5kKSl7Ci0JCQlyZXR1cm4gRGlhZ3JhbUNvcmVSZXNvdXJjZXMuV29ya1Byb2R1Y3REZXBlbmRlbmN5X0RpYWdyYW1fa2luZDsKLQkJfQotCQlyZXR1cm4gIiI7ICAvLyROT04tTkxTLTEkCi0JfQotCQotCXB1YmxpYyBzdGF0aWMgRGlhZ3JhbSBjb3B5RGlhZ3JhbShFZGl0aW5nRG9tYWluIGRvbWFpbiwgRGlhZ3JhbSBkaWFncmFtKSB7Ci0JCUFycmF5TGlzdDxPYmplY3Q+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PE9iamVjdD4oKTsKLQkJbGlzdC5hZGQoZGlhZ3JhbS5nZXRFbGVtZW50KCkpOwotCQlsaXN0LmFkZChkaWFncmFtKTsKLQkJQ29tbWFuZCBjbWQgPSBDb3B5Q29tbWFuZC5jcmVhdGUoZG9tYWluLCBsaXN0KTsKLQkJY21kLmV4ZWN1dGUoKTsKLQkJZm9yIChJdGVyYXRvcjw/PiBpdGVyID0gY21kLmdldFJlc3VsdCgpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGVsZW1lbnQgPSAoT2JqZWN0KSBpdGVyLm5leHQoKTsKLQkJCWlmKGVsZW1lbnQgaW5zdGFuY2VvZiBEaWFncmFtKSB7Ci0JCQkJRGlhZ3JhbSBjb3B5ID0gKERpYWdyYW0pIGVsZW1lbnQ7Ci0JCQkJcmV0dXJuIGNvcHk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qKgotCSAqIFJlYXNzb2NpYXRlcyBhY3Rpdml0eSBub2RlcyBpbiB0aGUgYmFzZSBkaWFncmFtIGNvcHkgd2l0aCBjb3JyZXNwb25kaW5nCi0JICogbG9jYWxseSBjb250cmlidXRvcnMgb3IgcmVwbGFjZXJzIGlmIHRoZXJlIGlzIGFueS4KLQkgKiAKLQkgKiBAcGFyYW0gYWN0aXZpdHkKLQkgKiBAcGFyYW0gY29weU9mQmFzZURpYWdyYW0KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVhc3NvY2lhdGUoQWN0aXZpdHkgYWN0aXZpdHksIERpYWdyYW0gY29weU9mQmFzZURpYWdyYW0pIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gYWN0aXZpdHkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJVmFyaWFiaWxpdHlFbGVtZW50IGJhc2VFbGVtZW50ID0gKChBY3Rpdml0eSkgZWxlbWVudCkKLQkJCQkJCS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCk7Ci0JCQkJaWYgKGJhc2VFbGVtZW50ICE9IG51bGwpIHsKLQkJCQkJTm9kZSBub2RlID0gRGlhZ3JhbUhlbHBlci5maW5kTm9kZShjb3B5T2ZCYXNlRGlhZ3JhbSwKLQkJCQkJCQliYXNlRWxlbWVudCk7Ci0JCQkJCWlmIChub2RlICE9IG51bGwpIHsKLQkJCQkJCUVPYmplY3QgdW1sT2JqID0gbm9kZS5nZXRFbGVtZW50KCk7Ci0JCQkJCQlCcmlkZ2VIZWxwZXIuYWRkRUFubm90YXRpb24oKEVNb2RlbEVsZW1lbnQpIHVtbE9iaiwKLQkJCQkJCQkJKE1ldGhvZEVsZW1lbnQpIGVsZW1lbnQpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vY29yZS9zZXJ2aWNlcy9EaWFncmFtTWFuYWdlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vY29yZS9zZXJ2aWNlcy9EaWFncmFtTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMzM0MjRiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2NvcmUvc2VydmljZXMvRGlhZ3JhbU1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNjYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5zZXJ2aWNlczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5pbnRlcm5hbC5ldmVudHMuUmVzb3VyY2VDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5CYXNpY0VMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVuaXF1ZUVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5XcmFwcGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FTW9kZWxFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLlhNSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuWE1MSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5pbXBsLkludGVybmFsVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLndvcmtzcGFjZS5BYnN0cmFjdEVNRk9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYud29ya3NwYWNlLnV0aWwuV29ya3NwYWNlU3luY2hyb25pemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24uQ29tbW9uUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuRGlhZ3JhbUNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5icmlkZ2UuQnJpZGdlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUucHJvdmlkZXJzLkFjY2Vzc2libGVEaWFncmFtTW9kaWZpY2F0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuQWN0aXZpdHlEZXRhaWxEaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk1vZGVsRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Xb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuRGlhZ3JhbUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwudXRpbC5UeFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuSUxpYnJhcnlTZXJ2aWNlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLklEaWFncmFtTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuUHJvY2Vzc1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UuSUxpYnJhcnlSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS5pbnRlcm5hbC5JRmFpbFNhZmVTYXZhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLnV0aWwuRXh0ZW5kZWRSZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS51dGlsLkZpbGVTeW5jaHJvbml6ZXIuRmlsZUluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLkZhaWxTYWZlUGVyc2lzdGVuY2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLkZpbGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5NdWx0aUZpbGVTYXZlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UuTXVsdGlGaWxlVVJJQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy5JTGlicmFyeVBlcnNpc3RlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5VbWFVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi5jb3JlLnV0aWwuU3RyaW5nU3RhdGljczsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuRGlhZ3JhbUVkaXRpbmdEb21haW5GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5wcmVmZXJlbmNlcy5QcmVmZXJlbmNlc0hpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLnNlcnZpY2VzLlZpZXdTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVzb3VyY2VzLmVkaXRvci5pZGUuaW50ZXJuYWwubDEwbi5FZGl0b3JNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlc291cmNlcy5lZGl0b3IuaW50ZXJuYWwudXRpbC5EaWFncmFtSU9VdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb3JlLmludGVybmFsLnV0aWwuRU1GQ29yZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29yZS5yZXNvdXJjZXMuR01GSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb3JlLnJlc291cmNlcy5HTUZSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29yZS5yZXNvdXJjZXMuR01GUmVzb3VyY2VGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkRpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLlVNTEZhY3Rvcnk7Ci0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIAotICogQHNpbmNlIDEuMgotICovCi1wdWJsaWMgY2xhc3MgRGlhZ3JhbU1hbmFnZXIgewkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHID0gRGlhZ3JhbUNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmlzRGVidWdnaW5nKCk7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERJQUdSQU1fRklMRU5BTUVfV0lUSE9VVF9FWFRFTlNJT04gPSAiZGlhZ3JhbSI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElBR1JBTV9GSUxFTkFNRSA9IERJQUdSQU1fRklMRU5BTUVfV0lUSE9VVF9FWFRFTlNJT04gKyBNdWx0aUZpbGVTYXZlVXRpbC5ERUZBVUxUX0ZJTEVfRVhURU5TSU9OOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwPFByb2Nlc3MsIERpYWdyYW1NYW5hZ2VyPiBwcm9jZXNzVG9EaWFncmFtTWFuYWdlck1hcCA9IG5ldyBIYXNoTWFwPFByb2Nlc3MsIERpYWdyYW1NYW5hZ2VyPigpOwotCQotCXByaXZhdGUgc3RhdGljIElMaWJyYXJ5U2VydmljZUxpc3RlbmVyIGxpYlN2Y0xpc3RlbmVyOwotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIEZpbGVTeW5jaHJvbml6ZXIgZmlsZVN5bmNocm9uaXplciA9IG5ldyBGaWxlU3luY2hyb25pemVyKCkgewotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIENvbGxlY3Rpb248SUZpbGU+IGhhbmRsZUNoYW5nZWRGaWxlcyhDb2xsZWN0aW9uPElGaWxlPiBjaGFuZ2VkRmlsZXMpIHsKLQkJCXRyeSB7Ci0JCQkJQ29sbGVjdGlvbjxEaWFncmFtTWFuYWdlcj4gbWdycyA9IGdldERpYWdyYW1NYW5hZ2VycygpOwotCQkJCWlmKCFtZ3JzLmlzRW1wdHkoKSkgewotCQkJCQlDb2xsZWN0aW9uPElGaWxlPiBoYW5kbGVkRmlsZXMgPSBuZXcgQXJyYXlMaXN0PElGaWxlPigpOwotCQkJCQlmb3IgKERpYWdyYW1NYW5hZ2VyIG1nciA6IG1ncnMpIHsKLQkJCQkJCVJlc291cmNlIHJlc291cmNlID0gbWdyLmdldFJlc291cmNlKGZhbHNlKTsKLQkJCQkJCWlmKHJlc291cmNlICE9IG51bGwgJiYgcmVzb3VyY2UuaXNMb2FkZWQoKSkgewotCQkJCQkJCUlGaWxlIGZpbGUgPSBXb3Jrc3BhY2VTeW5jaHJvbml6ZXIuZ2V0RmlsZShtZ3IuZ2V0UmVzb3VyY2UoKSk7Ci0JCQkJCQkJaWYoY2hhbmdlZEZpbGVzLmNvbnRhaW5zKGZpbGUpKSB7Ci0JCQkJCQkJCXRyeSB7CQkJCQkJCQkJCi0JCQkJCQkJCQltZ3IucmVsb2FkKCk7Ci0JCQkJCQkJCQloYW5kbGVkRmlsZXMuYWRkKGZpbGUpOwotCQkJCQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJCQlDb21tb25QbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCQkJCQkJaWYoREVCVUcpIHsKLQkJCQkJCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCXJldHVybiBoYW5kbGVkRmlsZXM7Ci0JCQkJfQotCQkJfQotCQkJY2F0Y2goQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJaGFuZGxlQ29yZUV4Y2VwdGlvbihlLCBlLmdldE1lc3NhZ2UoKSk7Ci0JCQl9Ci0JCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7Ci0JCX0KLQkJCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgQ29sbGVjdGlvbjxJRmlsZT4gaGFuZGxlTW92ZWRGaWxlcyhNYXA8SUZpbGUsIElQYXRoPiBtb3ZlZEZpbGVUb05ld1BhdGhNYXApIHsKLQkJCWZvciAoTWFwLkVudHJ5PElGaWxlLCBJUGF0aD4gZW50cnkgOiBtb3ZlZEZpbGVUb05ld1BhdGhNYXAuZW50cnlTZXQoKSkgewotCQkJCUlGaWxlIGlGaWxlID0gZW50cnkuZ2V0S2V5KCk7Ci0JCQkJaWYoRElBR1JBTV9GSUxFTkFNRS5lcXVhbHMoaUZpbGUuZ2V0TmFtZSgpKSkgewotCQkJCQlzeW5jaHJvbml6ZWQgKHByb2Nlc3NUb0RpYWdyYW1NYW5hZ2VyTWFwKSB7Ci0JCQkJCQlEaWFncmFtTWFuYWdlciBtZ3IgPSBnZXREaWFncmFtTWFuYWdlcihpRmlsZSk7Ci0JCQkJCQlpZihtZ3IgIT0gbnVsbCkgewotCQkJCQkJCW1nci51cGRhdGVSZXNvdXJjZVVSSSgpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIG1vdmVkRmlsZVRvTmV3UGF0aE1hcC5rZXlTZXQoKTsKLQkJfQotCQkKLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBDb2xsZWN0aW9uPElGaWxlPiBoYW5kbGVEZWxldGVkRmlsZXMoQ29sbGVjdGlvbjxJRmlsZT4gZGVsZXRlZEZpbGVzKSB7Ci0JCQlyZXR1cm4gc3VwZXIuaGFuZGxlRGVsZXRlZEZpbGVzKGRlbGV0ZWRGaWxlcyk7Ci0JCX0KLQl9OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUREX2tpbmQgPSAiQUREIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQURfa2luZCA9ICJBRCI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdQRF9raW5kID0gIldQREQiOyAvLyROT04tTkxTLTEkCQotCQotCXByaXZhdGUgc3RhdGljIERpYWdyYW1NYW5hZ2VyIGdldERpYWdyYW1NYW5hZ2VyKElGaWxlIGlGaWxlKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBwcm9jZXNzVG9EaWFncmFtTWFuYWdlck1hcC52YWx1ZXMoKS5pdGVyYXRvcigpOyBpdGVyYXRvcgotCQkuaGFzTmV4dCgpOykgewotCQkJRGlhZ3JhbU1hbmFnZXIgbWdyID0gKERpYWdyYW1NYW5hZ2VyKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZihtZ3IucmVzb3VyY2UgIT0gbnVsbCAmJiBpRmlsZS5lcXVhbHMoV29ya3NwYWNlU3luY2hyb25pemVyLmdldEZpbGUobWdyLnJlc291cmNlKSkpIHsKLQkJCQlyZXR1cm4gbWdyOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgZGlzcG9zZURpYWdyYW1NYW5hZ2VycyhNZXRob2RMaWJyYXJ5IGxpYnJhcnkpIHsKLQkJc3luY2hyb25pemVkKHByb2Nlc3NUb0RpYWdyYW1NYW5hZ2VyTWFwKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yPE1hcC5FbnRyeTxQcm9jZXNzLCBEaWFncmFtTWFuYWdlcj4+IGl0ZXJhdG9yID0gcHJvY2Vzc1RvRGlhZ3JhbU1hbmFnZXJNYXAuZW50cnlTZXQoKS5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJTWFwLkVudHJ5PFByb2Nlc3MsIERpYWdyYW1NYW5hZ2VyPiBlbnRyeSA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCQlpZihVbWFVdGlsLmdldE1ldGhvZExpYnJhcnkoZW50cnkuZ2V0S2V5KCkpID09IGxpYnJhcnkpIHsKLQkJCQkJZW50cnkuZ2V0VmFsdWUoKS5kb0Rpc3Bvc2UoKTsKLQkJCQkJaXRlcmF0b3IucmVtb3ZlKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIHN5bmNocm9uaXplZCB2b2lkIHNldHVwTGlicmFyeVNlcnZpY2VMaXN0ZW5lcigpIHsKLQkJaWYobGliU3ZjTGlzdGVuZXIgPT0gbnVsbCkgewotCQkJbGliU3ZjTGlzdGVuZXIgPSBuZXcgTGlicmFyeVNlcnZpY2VMaXN0ZW5lcigpIHsKLQkJCQkKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwdWJsaWMgdm9pZCBsaWJyYXJ5Q2xvc2VkKE1ldGhvZExpYnJhcnkgbGlicmFyeSkgewotCQkJCQlkaXNwb3NlRGlhZ3JhbU1hbmFnZXJzKGxpYnJhcnkpOwotCQkJCX0KLQkJCQkKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwdWJsaWMgdm9pZCBsaWJyYXJ5UmVvcGVuZWQoTWV0aG9kTGlicmFyeSBsaWJyYXJ5KSB7Ci0JCQkJCWRpc3Bvc2VEaWFncmFtTWFuYWdlcnMobGlicmFyeSk7Ci0JCQkJfQotCQkJfTsKLQkJCUxpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuYWRkTGlzdGVuZXIobGliU3ZjTGlzdGVuZXIpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIEdldHMgYSBpbnN0YW5jZSBvZiBEaWFncmFtTWFuYWdlciBmb3IgdGhlIHNwZWNpZmllZCBwcm9jZXNzLiBDYWxsZXIgbXVzdAotCSAqIHJlbGVhc2UgdGhlIHJldHVybmVkIERpYWdyYW1NYW5hZ2VyIGluc3RhbmNlIHdoZW4gaXQncyBubyBsb25nZXIgbmVlZGVkCi0JICogdXNpbmcge0BsaW5rICNyZW1vdmVDb25zdW1lcihPYmplY3QpfS4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvY2VzcwotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIERpYWdyYW1NYW5hZ2VyIGdldEluc3RhbmNlKFByb2Nlc3MgcHJvY2VzcywgT2JqZWN0IGNvbnN1bWVyKSB7Ci0JCWlmKERFQlVHKSB7Ci0JCQlpZihwcm9jZXNzLmVJc1Byb3h5KCkpIHsKLQkJCQlTeXN0ZW0uZXJyLnByaW50bG4oIlByb2Nlc3MgaXMgYSBwcm94eTogIiArIHByb2Nlc3MpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQkJYXNzZXJ0IHByb2Nlc3MgIT0gbnVsbCAmJiBjb25zdW1lciAhPSBudWxsICYmICFwcm9jZXNzLmVJc1Byb3h5KCk7Ci0JCXNldHVwTGlicmFyeVNlcnZpY2VMaXN0ZW5lcigpOwotCQlEaWFncmFtTWFuYWdlciBtZ3IgPSAoRGlhZ3JhbU1hbmFnZXIpIHByb2Nlc3NUb0RpYWdyYW1NYW5hZ2VyTWFwLmdldChwcm9jZXNzKTsKLQkJaWYobWdyICE9IG51bGwgJiYgbWdyLmlzRGlzcG9zZWQoKSkgewotCQkJcHJvY2Vzc1RvRGlhZ3JhbU1hbmFnZXJNYXAucmVtb3ZlKHByb2Nlc3MpOwotCQkJbWdyID0gbnVsbDsKLQkJfQotCQlpZihtZ3IgPT0gbnVsbCkgewotCQkJc3luY2hyb25pemVkKHByb2Nlc3NUb0RpYWdyYW1NYW5hZ2VyTWFwKSB7Ci0JCQkJbWdyID0gKERpYWdyYW1NYW5hZ2VyKSBwcm9jZXNzVG9EaWFncmFtTWFuYWdlck1hcC5nZXQocHJvY2Vzcyk7Ci0JCQkJaWYobWdyID09IG51bGwpIHsKLQkJCQkJbWdyID0gbmV3IERpYWdyYW1NYW5hZ2VyKHByb2Nlc3MpOwotCQkJCQlwcm9jZXNzVG9EaWFncmFtTWFuYWdlck1hcC5wdXQocHJvY2VzcywgbWdyKTsKLQkJCQkJaWYoIWZpbGVTeW5jaHJvbml6ZXIuaXNJbnN0YWxsZWQoKSkgewotCQkJCQkJZmlsZVN5bmNocm9uaXplci5pbnN0YWxsKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9CQkJCi0JCX0KLQkJbWdyLmFkZENvbnN1bWVyKGNvbnN1bWVyKTsKLQkJcmV0dXJuIG1ncjsKLQl9Ci0JCi0JLyoqCi0JICogQ2hlY2tzIGlmIGFuIGRpYWdyYW0gbWFuYWdlciBmb3IgdGhlIGdpdmVuIHByb2Nlc3MgYWxyZWFkeSBleGlzdHMuCi0JICogCi0JICogQHBhcmFtIHByb2Nlc3MKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIGhhc0RpYWdyYW1NYW5hZ2VyKFByb2Nlc3MgcHJvY2VzcykgewotCQlyZXR1cm4gcHJvY2Vzc1RvRGlhZ3JhbU1hbmFnZXJNYXAuY29udGFpbnNLZXkocHJvY2Vzcyk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBkaXNwb3NlRGlhZ3JhbU1hbmFnZXIoUHJvY2VzcyBwcm9jZXNzKSB7Ci0JCXN5bmNocm9uaXplZCAocHJvY2Vzc1RvRGlhZ3JhbU1hbmFnZXJNYXApIHsKLQkJCURpYWdyYW1NYW5hZ2VyIG1nciA9IHByb2Nlc3NUb0RpYWdyYW1NYW5hZ2VyTWFwLmdldChwcm9jZXNzKTsKLQkJCWlmKG1nciAhPSBudWxsKSB7Ci0JCQkJbWdyLmRvRGlzcG9zZSgpOwotCQkJCXByb2Nlc3NUb0RpYWdyYW1NYW5hZ2VyTWFwLnJlbW92ZShwcm9jZXNzKTsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCX0KLQkKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgc3RhdGljIENvbGxlY3Rpb248RGlhZ3JhbU1hbmFnZXI+IGdldERpYWdyYW1NYW5hZ2VycygpIHsKLQkJQXJyYXlMaXN0PERpYWdyYW1NYW5hZ2VyPiBtZ3JzOwotCQlzeW5jaHJvbml6ZWQocHJvY2Vzc1RvRGlhZ3JhbU1hbmFnZXJNYXApIHsKLQkJCW1ncnMgPSBuZXcgQXJyYXlMaXN0PERpYWdyYW1NYW5hZ2VyPihwcm9jZXNzVG9EaWFncmFtTWFuYWdlck1hcC52YWx1ZXMoKSk7Ci0JCX0KLQkJcmV0dXJuIG1ncnMuaXNFbXB0eSgpID8gQ29sbGVjdGlvbnMuRU1QVFlfTElTVCA6IG1ncnM7Ci0JfQotCQotCXByaXZhdGUgY2xhc3MgR01GUmVzb3VyY2VFeCBleHRlbmRzIEdNRlJlc291cmNlIGltcGxlbWVudHMgSUZhaWxTYWZlU2F2YWJsZSB7Ci0KLQkJcHJpdmF0ZSBGYWlsU2FmZVBlcnNpc3RlbmNlSGVscGVyIGZhaWxTYWZlUGVyc2lzdGVuY2VIZWxwZXI7Ci0KLQkJcHVibGljIEdNRlJlc291cmNlRXgoVVJJIHVyaSkgewotCQkJc3VwZXIodXJpKTsKLQkJfQotCQkKLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBYTUxIZWxwZXIgY3JlYXRlWE1MSGVscGVyKCkgewkJCQkJCi0JCQlyZXR1cm4gbmV3IEdNRkhlbHBlcih0aGlzKSB7Ci0JCQkJCi0JCQkJcHJvdGVjdGVkIFVSSSBnZXRIUkVGKFJlc291cmNlIG90aGVyUmVzb3VyY2UsIEVPYmplY3Qgb2JqKSB7Ci0JCQkJCWlmKG90aGVyUmVzb3VyY2UgaW5zdGFuY2VvZiBJTGlicmFyeVJlc291cmNlKSB7Ci0JCQkJCQlyZXR1cm4gKChJTGlicmFyeVJlc291cmNlKW90aGVyUmVzb3VyY2UpLmdldFByb3h5VVJJKG9iaik7Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIHN1cGVyLmdldEhSRUYob3RoZXJSZXNvdXJjZSwgb2JqKTsKLQkJCQl9Ci0JCQkJCi0JCQl9OwotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCB1cGRhdGVJbmZvKCkgewotCQkJSUZpbGUgZmlsZSA9IFdvcmtzcGFjZVN5bmNocm9uaXplci5nZXRGaWxlKHRoaXMpOwotCQkJaWYoRGlhZ3JhbU1hbmFnZXIudGhpcy5yZXNvdXJjZUlzTmV3KSB7Ci0JCQkJRGlhZ3JhbU1hbmFnZXIudGhpcy5yZXNvdXJjZUlzTmV3ID0gZmFsc2U7Ci0JCQkJZmlsZVN5bmNocm9uaXplci5tb25pdG9yKGZpbGUpOwotCQkJfQotCQkJZmlsZVN5bmNocm9uaXplci51cGRhdGVNb2RpZmljYXRpb25TdGFtcChmaWxlKTsKLQkJCXRyeSB7Ci0JCQkJZmlsZS5yZWZyZXNoTG9jYWwoSVJlc291cmNlLkRFUFRIX1pFUk8sIG51bGwpOwotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJQ29tbW9uUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCX0KLQkJfQotCQkKLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyB2b2lkIHNhdmUoTWFwIG9wdGlvbnMpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCQlzdXBlci5zYXZlKG9wdGlvbnMpOwotCQkJaWYoIWhhc1RlbXBVUkkoKSkgewotCQkJCXVwZGF0ZUluZm8oKTsKLQkJCX0KLQkJfQotCQkKLQkJcHJpdmF0ZSBBZGFwdGVyIHN1cGVyQ3JlYXRlTW9kaWZpY2F0aW9uQWRhcHRlcigpIHsKLQkJCXJldHVybiBzdXBlci5jcmVhdGVNb2RpZmljYXRpb25UcmFja2luZ0FkYXB0ZXIoKTsKLQkJfQotCQkKLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBBZGFwdGVyIGNyZWF0ZU1vZGlmaWNhdGlvblRyYWNraW5nQWRhcHRlcigpIHsKLQkJCXJldHVybiBuZXcgQWRhcHRlckltcGwoKSB7Ci0JCQkJcHJpdmF0ZSBBZGFwdGVyIGRlbGVnYXRlID0gc3VwZXJDcmVhdGVNb2RpZmljYXRpb25BZGFwdGVyKCk7Ci0JCQkJCi0JCQkJQE92ZXJyaWRlCi0JCQkJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbXNnKSB7Ci0JCQkJCWRlbGVnYXRlLm5vdGlmeUNoYW5nZWQobXNnKTsKLQkJCQkJbm90aWZ5RGlhZ3JhbUNoYW5nZUxpc3RlbmVycyhtc2cpOwotCQkJCX0KLQkJCX07Ci0JCX0KLQkJCi0JCS8qKgotCQkgKiBEb24ndCBub3RpZnkgRGlhZ3JhbU1vZGlmaWNhdGlvbkxpc3RlbmVyIGFib3V0IHJlc291cmNlIG1vZGlmaWNhdGlvbiBldmVudCBidXQgcmF0aGVyCi0JCSAqIGxldCB7QGxpbmsgI25vdGlmeURpYWdyYW1DaGFuZ2VMaXN0ZW5lcnMoTm90aWZpY2F0aW9uKSBoYW5kbGUgaXQuCi0JCSAqLwotCQlAT3ZlcnJpZGUKLQkJcHVibGljIHZvaWQgZU5vdGlmeShOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCQlpZihpc0xvYWRlZCgpICYmIG5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpIGluc3RhbmNlb2YgUmVzb3VyY2UgCi0JCQkJCSYmIG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoUmVzb3VyY2UuY2xhc3MpID09IFJlc291cmNlLlJFU09VUkNFX19JU19NT0RJRklFRAotCQkJCQkmJiBub3RpZmljYXRpb24uZ2V0RXZlbnRUeXBlKCkgPT0gTm90aWZpY2F0aW9uLlNFVCkgewotCQkJCWlmIChlQWRhcHRlcnMgIT0gbnVsbCAmJiBlRGVsaXZlcigpKQotCQkJCXsKLQkJCQkJaW50IHNpemUgPSBlQWRhcHRlcnMuc2l6ZSgpOwotCQkJCQlpZiAoc2l6ZSA+IDApCi0JCQkJCXsKLQkJCQkJCUFkYXB0ZXIgW10gYWRhcHRlcnMgPSAoQWRhcHRlciBbXSllQWRhcHRlcnMuZGF0YSgpOwotCQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyArK2kpCi0JCQkJCQl7Ci0JCQkJCQkJQWRhcHRlciBhZGFwdGVyID0gYWRhcHRlcnNbaV07Ci0JCQkJCQkJaWYoIShhZGFwdGVyIGluc3RhbmNlb2YgQWNjZXNzaWJsZURpYWdyYW1Nb2RpZmljYXRpb25MaXN0ZW5lcikpIHsKLQkJCQkJCQkJYWRhcHRlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJc3VwZXIuZU5vdGlmeShub3RpZmljYXRpb24pOwotCQkJfQotCQl9Ci0KLQkJcHJvdGVjdGVkIHZvaWQgbm90aWZ5RGlhZ3JhbUNoYW5nZUxpc3RlbmVycyhOb3RpZmljYXRpb24gbXNnKSB7Ci0JCQlCYXNpY0VMaXN0PEFkYXB0ZXI+IGVBZGFwdGVycyA9IGVCYXNpY0FkYXB0ZXJzKCk7Ci0JCQlpZiAoZUFkYXB0ZXJzICE9IG51bGwgJiYgZURlbGl2ZXIoKSkKLQkJCXsKLQkJCQlpbnQgc2l6ZSA9IGVBZGFwdGVycy5zaXplKCk7Ci0JCQkJaWYgKHNpemUgPiAwKQotCQkJCXsKLQkJCQkJQWRhcHRlciBbXSBhZGFwdGVycyA9IChBZGFwdGVyIFtdKWVBZGFwdGVycy5kYXRhKCk7Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgKytpKQotCQkJCQl7Ci0JCQkJCQlBZGFwdGVyIGFkYXB0ZXIgPSBhZGFwdGVyc1tpXTsKLQkJCQkJCWlmKGFkYXB0ZXIgaW5zdGFuY2VvZiBBY2Nlc3NpYmxlRGlhZ3JhbU1vZGlmaWNhdGlvbkxpc3RlbmVyKSB7Ci0JCQkJCQkJYWRhcHRlci5ub3RpZnlDaGFuZ2VkKG1zZyk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCXByaXZhdGUgRmFpbFNhZmVQZXJzaXN0ZW5jZUhlbHBlciBnZXRGYWlsU2FmZVBlcnNpc3RlbmNlSGVscGVyKCkgewotCQkJaWYoZmFpbFNhZmVQZXJzaXN0ZW5jZUhlbHBlciA9PSBudWxsKSB7Ci0JCQkJLy8gaWQgZm9ybWF0OiA8cHJvY2Vzc19ndWlkPmRpYWdyYW0KLQkJCQlTdHJpbmcgaWQgPSBEaWFncmFtTWFuYWdlci50aGlzLnByb2Nlc3MuZ2V0R3VpZCgpICsgRElBR1JBTV9GSUxFTkFNRV9XSVRIT1VUX0VYVEVOU0lPTjsKLQkJCQlmYWlsU2FmZVBlcnNpc3RlbmNlSGVscGVyID0gbmV3IEZhaWxTYWZlUGVyc2lzdGVuY2VIZWxwZXIodGhpcywgaWQpOwotCQkJCWZhaWxTYWZlUGVyc2lzdGVuY2VIZWxwZXIuc2V0Q29tbWl0RW1wdHlSZXNvdXJjZSh0cnVlKTsKLQkJCX0KLQkJCXJldHVybiBmYWlsU2FmZVBlcnNpc3RlbmNlSGVscGVyOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgY29tbWl0KCkgewotCQkJZ2V0RmFpbFNhZmVQZXJzaXN0ZW5jZUhlbHBlcigpLmNvbW1pdCgpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgZGVsZXRlQmFja3VwKCkgewotCQkJZ2V0RmFpbFNhZmVQZXJzaXN0ZW5jZUhlbHBlcigpLmRlbGV0ZUJhY2t1cCgpOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gaGFzVGVtcFVSSSgpIHsKLQkJCXJldHVybiBnZXRGYWlsU2FmZVBlcnNpc3RlbmNlSGVscGVyKCkuaGFzVGVtcFVSSSgpOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gcmVzdG9yZSgpIHsKLQkJCXJldHVybiBnZXRGYWlsU2FmZVBlcnNpc3RlbmNlSGVscGVyKCkucmVzdG9yZSgpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgc2V0VHhJRChTdHJpbmcgdHhJRCkgewotCQkJZ2V0RmFpbFNhZmVQZXJzaXN0ZW5jZUhlbHBlcigpLnNldFRlbXBVUkkodHhJRCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCB0eEZpbmlzaGVkKGJvb2xlYW4gc3VjY2Vzc2Z1bCkgewotCQkJZ2V0RmFpbFNhZmVQZXJzaXN0ZW5jZUhlbHBlcigpLnR4RmluaXNoZWQoc3VjY2Vzc2Z1bCk7Ci0JCQlpZihzdWNjZXNzZnVsKSB7Ci0JCQkJdXBkYXRlSW5mbygpOwotCQkJfQotCQl9Ci0JCQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIHZvaWQgZG9VbmxvYWQoKSB7Ci0JCQlzdXBlci5kb1VubG9hZCgpOwotCQkJCi0JCSAgICBJdGVyYXRvcjxFT2JqZWN0PiBhbGxDb250ZW50cyA9IGdldEFsbFByb3BlckNvbnRlbnRzKHVubG9hZGluZ0NvbnRlbnRzKTsKLQkJICAgIExpc3Q8RU9iamVjdD4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8RU9iamVjdD4oKTsKLQkJCXdoaWxlIChhbGxDb250ZW50cy5oYXNOZXh0KCkpIHsKLQkJCQlsaXN0LmFkZChhbGxDb250ZW50cy5uZXh0KCkpOwotCQkJfQotCQkJZm9yIChFT2JqZWN0IG9iamVjdCA6IGxpc3QpIHsKLQkJCQlFY29yZVV0aWwucmVtb3ZlKG9iamVjdCk7Ci0JCQl9Ci0JCX0KLQkJCi0JfQotCQotCXByaXZhdGUgY2xhc3MgR01GRXh0ZW5kZWRSZXNvdXJjZVNldCBleHRlbmRzIEV4dGVuZGVkUmVzb3VyY2VTZXQgewotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIGludCBnZXRVUklUeXBlKFVSSSB1cmkpIHsKLQkJCWlmKE11bHRpRmlsZVVSSUNvbnZlcnRlci5TQ0hFTUUuZXF1YWxzKHVyaS5zY2hlbWUoKSkpIHsKLQkJCQlyZXR1cm4gVVJJX1RZUEVfRVhURVJOQUw7Ci0JCQl9Ci0JCQlpZihESUFHUkFNX0ZJTEVOQU1FLmVxdWFscyh1cmkubGFzdFNlZ21lbnQoKSkpIHsKLQkJCQlyZXR1cm4gVVJJX1RZUEVfTE9DQUw7Ci0JCQl9Ci0JCQlyZXR1cm4gVVJJX1RZUEVfRVhURVJOQUw7Ci0gCQl9Ci0JCQotCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBSZXNvdXJjZSBjcmVhdGVSZXNvdXJjZShVUkkgdXJpKSB7Ci0JCQlYTUlSZXNvdXJjZSByZXNvdXJjZSA9IG5ldyBHTUZSZXNvdXJjZUV4KHVyaSk7Ci0KLQkJCXJlc291cmNlLmdldERlZmF1bHRMb2FkT3B0aW9ucygpLnB1dEFsbChHTUZSZXNvdXJjZUZhY3RvcnkuZ2V0RGVmYXVsdExvYWRPcHRpb25zKCkpOwotCQkJcmVzb3VyY2UuZ2V0RGVmYXVsdFNhdmVPcHRpb25zKCkucHV0QWxsKEdNRlJlc291cmNlRmFjdG9yeS5nZXREZWZhdWx0U2F2ZU9wdGlvbnMoKSk7Ci0KLQkJCWlmICghcmVzb3VyY2UuZ2V0RW5jb2RpbmcoKS5lcXVhbHMoRU1GQ29yZUNvbnN0YW50cy5YTUlfRU5DT0RJTkcpKQotCQkJCXJlc291cmNlLnNldEVuY29kaW5nKEVNRkNvcmVDb25zdGFudHMuWE1JX0VOQ09ESU5HKTsKLQotCQkJZ2V0UmVzb3VyY2VzKCkuYWRkKHJlc291cmNlKTsKLQkJCQotCQkJcmV0dXJuIHJlc291cmNlOwotCQl9Ci0JCQotCX0KLQotCS8qKgotCSAqIFJlZmVyZW5jZSBjb3VudCB0byB0aGlzIGRpYWdyYW0gbWFuYWdlcgotCSAqLwotCXByaXZhdGUgUHJvY2VzcyBwcm9jZXNzOwotCQotCXByaXZhdGUgUmVzb3VyY2UgcmVzb3VyY2U7Ci0JCi0JcHJpdmF0ZSBJbnRlcm5hbFRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIGVkaXRpbmdEb21haW47Ci0KLQlwcml2YXRlIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcjsKLQotCXByaXZhdGUgYm9vbGVhbiByZXNvdXJjZUlzTmV3OwotCQotCXByaXZhdGUgTGlzdDxJUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcj4gcmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcnMgPSBuZXcgVW5pcXVlRUxpc3Q8SVJlc291cmNlQ2hhbmdlTGlzdGVuZXI+KCk7Ci0KLQlwcml2YXRlIEV4dGVuZGVkUmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQ7Ci0KLQlwcml2YXRlIEhhc2hNYXA8QWN0aXZpdHksIE1hcDxTdHJpbmcsIERpYWdyYW0+PiBhY3Rpdml0eVRvU2F2ZWREaWFncmFtTWFwOyAKLQkKLQlwcm90ZWN0ZWQgVW5pcXVlRUxpc3Q8T2JqZWN0PiBjb25zdW1lcnMgPSBuZXcgVW5pcXVlRUxpc3Q8T2JqZWN0PigpOwotCQotCXByaXZhdGUgRGlhZ3JhbU1hbmFnZXIoUHJvY2VzcyBwcm9jZXNzKSB7Ci0JCXRoaXMucHJvY2VzcyA9IHByb2Nlc3M7Ci0JfQotCQotCXB1YmxpYyBQcm9jZXNzIGdldFByb2Nlc3MoKSB7Ci0JCXJldHVybiBwcm9jZXNzOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBhZGRSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKElSZXNvdXJjZUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWlmKCFyZXNvdXJjZUNoYW5nZUxpc3RlbmVycy5jb250YWlucyhsaXN0ZW5lcikpIHsKLQkJCXJlc291cmNlQ2hhbmdlTGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVtb3ZlUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcihJUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlyZXNvdXJjZUNoYW5nZUxpc3RlbmVycy5yZW1vdmUobGlzdGVuZXIpOwotCX0KLQkKLQlwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gYWRkQ29uc3VtZXIoT2JqZWN0IGNvbnN1bWVyKSB7Ci0JCXJldHVybiBjb25zdW1lcnMuYWRkKGNvbnN1bWVyKTsKLQl9Ci0JCi0JLyoqCi0JICogUmVtb3ZlcyB0aGUgZ2l2ZW4gY29uc3VtZXIgZnJvbSB0aGUgY29uc3VtZXIgbGlzdCBvZiB0aGlzIGRpYWdyYW0gbWFuYWdlci4gVW5sb2FkCi0JICogdGhpcyBkaWFncmFtIG1hbmFnZXIgaWYgaXQgZG9lcyBub3QgaGF2ZSBhbnkgbW9yZSBjb25zdW1lciBhZnRlciB0aGlzIGNhbGwuIAotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiByZW1vdmVDb25zdW1lcihPYmplY3QgY29uc3VtZXIpIHsKLQkJYm9vbGVhbiByZXQgPSBjb25zdW1lcnMucmVtb3ZlKGNvbnN1bWVyKTsKLQkJaWYocmV0ICYmIGNvbnN1bWVycy5pc0VtcHR5KCkpIHsKLQkJCXN5bmNocm9uaXplZChwcm9jZXNzVG9EaWFncmFtTWFuYWdlck1hcCkgewotCQkJCXByb2Nlc3NUb0RpYWdyYW1NYW5hZ2VyTWFwLnJlbW92ZShwcm9jZXNzKTsKLQkJCQlpZihwcm9jZXNzVG9EaWFncmFtTWFuYWdlck1hcC5pc0VtcHR5KCkpIHsKLQkJCQkJZmlsZVN5bmNocm9uaXplci51bmluc3RhbGwoKTsKLQkJCQl9Ci0JCQl9Ci0JCQlkb0Rpc3Bvc2UoKTsKLQkJfQotCQlyZXR1cm4gcmV0OwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc05ld1Jlc291cmNlKCkgewotCQlyZXR1cm4gcmVzb3VyY2VJc05ldzsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0UmVzb3VyY2VJc05ldyhib29sZWFuIHJlc291cmNlSXNOZXcpIHsKLQkJdGhpcy5yZXNvdXJjZUlzTmV3ID0gcmVzb3VyY2VJc05ldzsKLQl9Ci0JCi0JcHVibGljIEludGVybmFsVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gZ2V0RWRpdGluZ0RvbWFpbigpIHsKLQkJaWYgKGVkaXRpbmdEb21haW4gPT0gbnVsbCAmJiAhaXNEaXNwb3NlZCgpKSB7Ci0JCQllZGl0aW5nRG9tYWluID0gY3JlYXRlRWRpdGluZ0RvbWFpbigpOwotCQkJcmVzb3VyY2VTZXQgPSAoRXh0ZW5kZWRSZXNvdXJjZVNldCkgZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpOwotCQl9Ci0JCXJldHVybiBlZGl0aW5nRG9tYWluOwotCX0KLQkKLQlwcml2YXRlIEludGVybmFsVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gY3JlYXRlRWRpdGluZ0RvbWFpbigpIHsKLQkJR01GRXh0ZW5kZWRSZXNvdXJjZVNldCByZXNvdXJjZVNldCA9IG5ldyBHTUZFeHRlbmRlZFJlc291cmNlU2V0KCk7Ci0JCXJlc291cmNlU2V0LmFkZChwcm9jZXNzLmVSZXNvdXJjZSgpLmdldFJlc291cmNlU2V0KCkpOwotCQlyZXR1cm4gKEludGVybmFsVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4pIERpYWdyYW1FZGl0aW5nRG9tYWluRmFjdG9yeS5nZXRJbnN0YW5jZSgpCi0JCQkJLmNyZWF0ZUVkaXRpbmdEb21haW4ocmVzb3VyY2VTZXQpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgZG9EaXNwb3NlKCkgewotCQlpZihyZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQlJRmlsZSBmaWxlID0gV29ya3NwYWNlU3luY2hyb25pemVyLmdldEZpbGUocmVzb3VyY2UpOwotCQkJaWYoZmlsZSAhPSBudWxsKSB7Ci0JCQkJZmlsZVN5bmNocm9uaXplci51bm1vbml0b3IoZmlsZSk7CQkJCQotCQkJfQotCQkJcmVzb3VyY2UgPSBudWxsOwotCQl9Ci0KLQkJcmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcnMuY2xlYXIoKTsKLQkJCi0JCWlmKGVkaXRpbmdEb21haW4gIT0gbnVsbCkgewotCQkJcmVzb3VyY2VTZXQuZGlzcG9zZSgpOwotCQkJcmVzb3VyY2VTZXQgPSBudWxsOwotCi0JCQllZGl0aW5nRG9tYWluLmRpc3Bvc2UoKTsKLQkJCWVkaXRpbmdEb21haW4gPSBudWxsOwkJCQotCQl9CQotCQkKLQkJY29uc3VtZXJzLmNsZWFyKCk7Ci0JCQotCQlpZihhY3Rpdml0eVRvU2F2ZWREaWFncmFtTWFwICE9IG51bGwpIHsKLQkJCWFjdGl2aXR5VG9TYXZlZERpYWdyYW1NYXAuY2xlYXIoKTsKLQkJfQotCQkKLQkJcHJvY2VzcyA9IG51bGw7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCXN5bmNocm9uaXplZCAocHJvY2Vzc1RvRGlhZ3JhbU1hbmFnZXJNYXApIHsKLQkJCXByb2Nlc3NUb0RpYWdyYW1NYW5hZ2VyTWFwLnJlbW92ZShwcm9jZXNzKTsKLQkJfQotCQlkb0Rpc3Bvc2UoKTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNEaXNwb3NlZCgpIHsKLQkJcmV0dXJuIHByb2Nlc3MgPT0gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogR2V0cyBkaWFncmFtcyBvZiB0aGUgZ2l2ZW4gdHlwZSBmb3IgdGhlIHNwZWNpZmllZCBhY3Rpdml0eQotCSAqIDxjb2RlPmFjdDwvY29kZT4KLQkgKiAKLQkgKiBAcGFyYW0gYWN0Ci0JICogQHBhcmFtIHR5cGUKLQkgKiAgICAgICAgICAgIG11c3QgYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgY29uc3RhbnRzOgotCSAqICAgICAgICAgICAge0BsaW5rIElEaWFncmFtTWFuYWdlciNBQ1RJVklUWV9ESUFHUkFNfSwKLQkgKiAgICAgICAgICAgIHtAbGluayBJRGlhZ3JhbU1hbmFnZXIjQUNUSVZJVFlfREVUQUlMX0RJQUdSQU19LAotCSAqICAgICAgICAgICAge0BsaW5rIElEaWFncmFtTWFuYWdlciNXT1JLX1BST0RVQ1RfREVQRU5ERU5DWV9ESUFHUkFNfQotCSAqIEByZXR1cm4KLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgTGlzdDxEaWFncmFtPiBnZXREaWFncmFtcyhBY3Rpdml0eSBhY3QsIGludCB0eXBlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWNoZWNrQWN0aXZpdHkoYWN0KTsKLQkJUmVzb3VyY2UgcmVzb3VyY2UgPSBnZXRSZXNvdXJjZShmYWxzZSk7Ci0JCWlmKHJlc291cmNlICE9IG51bGwpIHsKLQkJCUFycmF5TGlzdDxEaWFncmFtPiBkaWFncmFtcyA9IG5ldyBBcnJheUxpc3Q8RGlhZ3JhbT4oKTsKLQkJCWZvciAoRU9iamVjdCBvIDogcmVzb3VyY2UuZ2V0Q29udGVudHMoKSkgewotCQkJCWlmKG8gaW5zdGFuY2VvZiBEaWFncmFtKSB7Ci0JCQkJCURpYWdyYW0gZGlhZ3JhbSA9IChEaWFncmFtKSBvOwotCQkJCQlTdHJpbmcgdHlwZVN0ciA9IGdldERpYWdyYW1UeXBlU3RyaW5nKHR5cGUpOwotCQkJCQlpZih0eXBlU3RyLmVxdWFscyhkaWFncmFtLmdldFR5cGUoKSkgJiYgaXNEaWFncmFtT2YoZGlhZ3JhbSwgYWN0KSkgewotCQkJCQkJRU9iamVjdCBtb2RlbCA9IGRpYWdyYW0uZ2V0RWxlbWVudCgpOwotCQkJCQkJaWYobW9kZWwgaW5zdGFuY2VvZiBEaWFncmFtSW1wbCkgewotCQkJCQkJCS8vIGRpc2FibGUgY3JlYXRpb24gb2YgVU1BIGdyYXBoaWNhbCBkYXRhCi0JCQkJCQkJLy8KLQkJCQkJCQkoKERpYWdyYW1JbXBsKW1vZGVsKS5zZXRHcmFwaGljYWxEYXRhUmVxdWlyZWQoZmFsc2UpOwotCQkJCQkJfQotCQkJCQkJZGlhZ3JhbXMuYWRkKGRpYWdyYW0pOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJaWYoIWRpYWdyYW1zLmlzRW1wdHkoKSkgewotCQkJCXJldHVybiBkaWFncmFtczsKLQkJCX0KLQkJfQotCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIHZvaWQgbWFya0luaGVyaXRlZChEaWFncmFtIGRpYWdyYW0pIHsKLQkJTGlzdDw/PiBjaGlsZHJlbiA9IGRpYWdyYW0uZ2V0Q2hpbGRyZW4oKTsKLQkJaW50IHNpemUgPSBjaGlsZHJlbi5zaXplKCk7CQkKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCVZpZXcgdmlldyA9IChWaWV3KSBjaGlsZHJlbi5nZXQoaSk7Ci0JCQlCcmlkZ2VIZWxwZXIubWFya0luaGVyaXRlZCh2aWV3KTsKLQkJfQotCQlmb3IgKE9iamVjdCBlZGdlIDogZGlhZ3JhbS5nZXRFZGdlcygpKSB7Ci0JCQlCcmlkZ2VIZWxwZXIubWFya0luaGVyaXRlZCgoVmlldykgZWRnZSk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldERpYWdyYW1UeXBlU3RyaW5nKGludCBkaWFncmFtVHlwZSkgewotCQlzd2l0Y2goZGlhZ3JhbVR5cGUpIHsKLQkJY2FzZSBJRGlhZ3JhbU1hbmFnZXIuQUNUSVZJVFlfREVUQUlMX0RJQUdSQU06Ci0JCQlyZXR1cm4gQUREX2tpbmQ7Ci0JCWNhc2UgSURpYWdyYW1NYW5hZ2VyLkFDVElWSVRZX0RJQUdSQU06Ci0JCQlyZXR1cm4gQURfa2luZDsKLQkJY2FzZSBJRGlhZ3JhbU1hbmFnZXIuV09SS19QUk9EVUNUX0RFUEVOREVOQ1lfRElBR1JBTToKLQkJCXJldHVybiBXUERfa2luZDsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBpbnQgZ2V0RGlhZ3JhbVR5cGUoU3RyaW5nIHR5cGVTdHIpIHsKLQkJaWYoQURfa2luZC5lcXVhbHModHlwZVN0cikpIHsKLQkJCXJldHVybiBJRGlhZ3JhbU1hbmFnZXIuQUNUSVZJVFlfRElBR1JBTTsJCQkKLQkJfQotCQllbHNlIGlmKEFERF9raW5kLmVxdWFscyh0eXBlU3RyKSkgewotCQkJcmV0dXJuIElEaWFncmFtTWFuYWdlci5BQ1RJVklUWV9ERVRBSUxfRElBR1JBTTsJCQkKLQkJfQotCQllbHNlIGlmKFdQRF9raW5kLmVxdWFscyh0eXBlU3RyKSkgewotCQkJcmV0dXJuIElEaWFncmFtTWFuYWdlci5XT1JLX1BST0RVQ1RfREVQRU5ERU5DWV9ESUFHUkFNOwotCQl9Ci0JCXJldHVybiAtMTsKLQl9Ci0JCi0JLyoqCi0JICogQXNzb2NpYXRlcyBhIG5ldyBkaWFncmFtIHdpdGggdGhlIGdpdmVuIGFjdGl2aXR5Ci0JICogCi0JICogQHBhcmFtIGRpYWdyYW0KLQkgKiBAcGFyYW0gdHlwZQotCSAqIEBwYXJhbSBhY3Rpdml0eQotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBhc3NvY2lhdGUoRGlhZ3JhbSBuZXdEaWFncmFtLCBpbnQgdHlwZSwgQWN0aXZpdHkgYWN0aXZpdHkpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJc3dpdGNoKHR5cGUpIHsKLQkJY2FzZSBJRGlhZ3JhbU1hbmFnZXIuQUNUSVZJVFlfRElBR1JBTToKLQkJCWFzc29jaWF0ZUFEKG5ld0RpYWdyYW0sIGFjdGl2aXR5KTsKLQkJCXJldHVybjsKLQkJY2FzZSBJRGlhZ3JhbU1hbmFnZXIuQUNUSVZJVFlfREVUQUlMX0RJQUdSQU06Ci0JCQlhc3NvY2lhdGVBREQobmV3RGlhZ3JhbSwgYWN0aXZpdHkpOwotCQkJcmV0dXJuOwotCQljYXNlIElEaWFncmFtTWFuYWdlci5XT1JLX1BST0RVQ1RfREVQRU5ERU5DWV9ESUFHUkFNOgotCQkJYXNzb2NpYXRlV1BEKG5ld0RpYWdyYW0sIGFjdGl2aXR5KTsJCi0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGFzc29jaWF0ZVdQRChEaWFncmFtIGNvcHksIEFjdGl2aXR5IGFjdGl2aXR5KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCS8vIFRPRE8gLSBjb25zb2xpZGF0ZSBvbmUgbWV0aG9kIHdpdGggQURELgotCQlpZihjb3B5LmdldEVsZW1lbnQoKSBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW0pIHsKLQkJCSgoV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbSljb3B5LmdldEVsZW1lbnQoKSkuc2V0TGlua2VkRWxlbWVudChhY3Rpdml0eSk7Ci0JCQkoKERpYWdyYW1JbXBsKWNvcHkuZ2V0RWxlbWVudCgpKS5zZXRHcmFwaGljYWxEYXRhUmVxdWlyZWQoZmFsc2UpOwotCQl9Ci0JCWdldFJlc291cmNlKCkuZ2V0Q29udGVudHMoKS5hZGQoY29weS5nZXRFbGVtZW50KCkpOwotCQlnZXRSZXNvdXJjZSgpLmdldENvbnRlbnRzKCkuYWRkKGNvcHkpOwkKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYXNzb2NpYXRlQUQoRGlhZ3JhbSBjb3B5LCBBY3Rpdml0eSBhY3QpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYoY29weS5nZXRFbGVtZW50KCkgaW5zdGFuY2VvZiBFTW9kZWxFbGVtZW50KSB7Ci0JCQlCcmlkZ2VIZWxwZXIuYXNzb2NpYXRlKChFTW9kZWxFbGVtZW50KSBjb3B5LmdldEVsZW1lbnQoKSwgYWN0KTsKLQkJfQotCQlnZXRSZXNvdXJjZSgpLmdldENvbnRlbnRzKCkuYWRkKGNvcHkuZ2V0RWxlbWVudCgpKTsKLQkJZ2V0UmVzb3VyY2UoKS5nZXRDb250ZW50cygpLmFkZChjb3B5KTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGFzc29jaWF0ZUFERChEaWFncmFtIGNvcHksIEFjdGl2aXR5IGFjdGl2aXR5KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmKGNvcHkuZ2V0RWxlbWVudCgpIGluc3RhbmNlb2YgQWN0aXZpdHlEZXRhaWxEaWFncmFtKSB7Ci0JCQkoKEFjdGl2aXR5RGV0YWlsRGlhZ3JhbSljb3B5LmdldEVsZW1lbnQoKSkuc2V0TGlua2VkRWxlbWVudChhY3Rpdml0eSk7Ci0JCQkoKERpYWdyYW1JbXBsKWNvcHkuZ2V0RWxlbWVudCgpKS5zZXRHcmFwaGljYWxEYXRhUmVxdWlyZWQoZmFsc2UpOwotCQl9Ci0JCWdldFJlc291cmNlKCkuZ2V0Q29udGVudHMoKS5hZGQoY29weS5nZXRFbGVtZW50KCkpOwotCQlnZXRSZXNvdXJjZSgpLmdldENvbnRlbnRzKCkuYWRkKGNvcHkpOwkJCi0JfQotCQotCXByaXZhdGUgRGlhZ3JhbSBjb3B5RGlhZ3JhbShEaWFncmFtIGRpYWdyYW0sIEFjdGl2aXR5IHRhcmdldEFjdGl2aXR5KSB7Ci0JCURpYWdyYW0gY29weSA9IERpYWdyYW1IZWxwZXIuY29weURpYWdyYW0oZ2V0RWRpdGluZ0RvbWFpbigpLCBkaWFncmFtKTsKLQkJRGlhZ3JhbUhlbHBlci5yZWFzc29jaWF0ZSh0YXJnZXRBY3Rpdml0eSwgY29weSk7Ci0JCXJldHVybiBjb3B5OwotCX0KLQotCXB1YmxpYyBEaWFncmFtIGNyZWF0ZURpYWdyYW0oZmluYWwgQWN0aXZpdHkgYWN0LCBmaW5hbCBpbnQgdHlwZSwgZmluYWwgUHJlZmVyZW5jZXNIaW50IGhpbnQpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJY2hlY2tBY3Rpdml0eShhY3QpOwotCQkvLyBjaGVjayBpZiB0aGlzIGFjdGl2aXR5IGNvbnRyaWJ1dGVzL2V4dGVuZHMgb3RoZXIgYWN0aXZpdHkgYW5kIHRyeQotCQkvLyBjb3B5Ci0JCS8vIHRoZSBleGlzdGluZyBkaWFncmFtIGZyb20gdGhlIGJhc2UKLQkJLy8KLQkJaWYgKFByb2Nlc3NVdGlsLmlzRXh0ZW5kaW5nT3JMb2NhbGx5Q29udHJpYnV0aW5nKGFjdCkpIHsKLQkJCUFjdGl2aXR5IGJhc2VBY3QgPSAoQWN0aXZpdHkpIGFjdC5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCk7Ci0JCQlEaWFncmFtTWFuYWdlciBtZ3IgPSBEaWFncmFtTWFuYWdlci5nZXRJbnN0YW5jZShUbmdVdGlsLmdldE93bmluZ1Byb2Nlc3MoYmFzZUFjdCksIHRoaXMpOwotCQkJdHJ5IHsKLQkJCQlMaXN0IGJhc2VEaWFncmFtcyA9IG1nci5nZXREaWFncmFtcyhiYXNlQWN0LCB0eXBlKTsKLQkJCQlpZighYmFzZURpYWdyYW1zLmlzRW1wdHkoKSkgewotCQkJCQlEaWFncmFtIGJhc2VEaWFncmFtID0gKERpYWdyYW0pIGJhc2VEaWFncmFtcy5nZXQoMCk7Ci0JCQkJCWlmIChiYXNlRGlhZ3JhbSAhPSBudWxsKSB7Ci0JCQkJCQlmaW5hbCBEaWFncmFtIGNvcHkgPSBjb3B5RGlhZ3JhbShiYXNlRGlhZ3JhbSwgYWN0KTsKLQkJCQkJCVR4VXRpbC5ydW5JblRyYW5zYWN0aW9uKGdldEVkaXRpbmdEb21haW4oKSwgbmV3IFJ1bm5hYmxlKCkgewotCi0JCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCQltYXJrSW5oZXJpdGVkKGNvcHkpOwotCQkJCQkJCQl0cnkgewotCQkJCQkJCQkJYXNzb2NpYXRlKGNvcHksIHR5cGUsIGFjdCk7Ci0JCQkJCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQkJCQkJdGhyb3cgbmV3IFdyYXBwZWRFeGNlcHRpb24oZSk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQkJCi0JCQkJCQl9KTsKLQkJCQkJCXJldHVybiBjb3B5OwotCQkJCQl9Ci0JCQkJfQotCQkJfSBjYXRjaChFeGNlcHRpb24gZSl7Ci0JCQkJQ29tbW9uUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcigiRXJyb3IgaW4gcmV0cmlldmluZyBiYXNlIGRpYWdyYW06ICIsIGUpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlmaW5hbGx5IHsKLQkJCQlpZihtZ3IgIT0gbnVsbCkgewotCQkJCQltZ3IucmVtb3ZlQ29uc3VtZXIodGhpcyk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQkJCi0JCQotCQlmaW5hbCBEaWFncmFtW10gcmVzdWx0SG9sZGVyID0gbmV3IERpYWdyYW1bMV07Ci0JCXRyeSB7Ci0JCQlUeFV0aWwucnVuSW5UcmFuc2FjdGlvbihnZXRFZGl0aW5nRG9tYWluKCksIG5ldyBSdW5uYWJsZSgpIHsKLQotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCXJlc3VsdEhvbGRlclswXSA9IGRvQ3JlYXRlRGlhZ3JhbShhY3QsIHR5cGUsIGhpbnQpOwotCQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJCXRocm93IG5ldyBXcmFwcGVkRXhjZXB0aW9uKGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJCQotCQkJfSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlEaWFncmFtQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQlpZihERUJVRykgewotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdEhvbGRlclswXTsKLQl9Ci0JCi0JcHJpdmF0ZSBEaWFncmFtIGRvQ3JlYXRlRGlhZ3JhbShBY3Rpdml0eSBhY3QsIGludCB0eXBlLCBQcmVmZXJlbmNlc0hpbnQgaGludCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlzd2l0Y2godHlwZSkgewotCQljYXNlIElEaWFncmFtTWFuYWdlci5BQ1RJVklUWV9ESUFHUkFNOgotCQkJcmV0dXJuIGNyZWF0ZUFEKGFjdCwgaGludCk7Ci0JCWNhc2UgSURpYWdyYW1NYW5hZ2VyLkFDVElWSVRZX0RFVEFJTF9ESUFHUkFNOgotCQkJcmV0dXJuIGNyZWF0ZUFERChhY3QsIGhpbnQpOwotCQljYXNlIElEaWFncmFtTWFuYWdlci5XT1JLX1BST0RVQ1RfREVQRU5ERU5DWV9ESUFHUkFNOgotCQkJcmV0dXJuIGNyZWF0ZVdQREQoYWN0LCBoaW50KTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIERpYWdyYW0gY3JlYXRlV1BERChBY3Rpdml0eSBhY3QsIFByZWZlcmVuY2VzSGludCBoaW50KQotCQkJdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkvLyBQcm9jZXNzUGFja2FnZSBtb2RlbCA9IChQcm9jZXNzUGFja2FnZSkgYWN0LmVDb250YWluZXIoKTsKLQkJV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbSBtb2RlbCA9IE1vZGVsRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkuY3JlYXRlV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbSgpOwotCQlpZiAobW9kZWwgaW5zdGFuY2VvZiBEaWFncmFtSW1wbCkgewotCQkJLy8gZGlzYWJsZSBjcmVhdGlvbiBvZiBVTUEgZ3JhcGhpY2FsIGRhdGEKLQkJCS8vCi0JCQkoKERpYWdyYW1JbXBsKSBtb2RlbCkuc2V0R3JhcGhpY2FsRGF0YVJlcXVpcmVkKGZhbHNlKTsKLQkJfQotCQltb2RlbC5zZXROZXcodHJ1ZSk7Ci0JCURpYWdyYW0gZGlhZ3JhbSA9IFZpZXdTZXJ2aWNlCi0JCQkJLmNyZWF0ZURpYWdyYW0oCi0JCQkJCQltb2RlbCwKLQkJCQkJCWdldERpYWdyYW1UeXBlU3RyaW5nKElEaWFncmFtTWFuYWdlci5XT1JLX1BST0RVQ1RfREVQRU5ERU5DWV9ESUFHUkFNKSwKLQkJCQkJCWhpbnQpOwotCQlpZiAoZGlhZ3JhbSAhPSBudWxsKSB7Ci0JCQlkaWFncmFtLnNldE5hbWUoYWN0LmdldE5hbWUoKSk7Ci0JCQltb2RlbC5zZXRMaW5rZWRFbGVtZW50KGFjdCk7Ci0JCQlnZXRSZXNvdXJjZSgpLmdldENvbnRlbnRzKCkuYWRkKG1vZGVsKTsKLQkJCWdldFJlc291cmNlKCkuZ2V0Q29udGVudHMoKS5hZGQoZGlhZ3JhbSk7Ci0KLQkJCS8vIGFkZCBSZXNvdXJjZURvbWFpbkxpbmsgdG8gdGhlIG1ldGhvZCBsaWJyYXJ5IHJlc291cmNlIHNldAotCQkJLy8KLQkJCS8vIEVjb3JlVXRpbC5nZXRBZGFwdGVyKGdldFJlc291cmNlKCkuZ2V0UmVzb3VyY2VTZXQoKS5lQWRhcHRlcnMoKSwKLQkJCS8vIFJlc291cmNlRG8pCi0JCX0KLQkJcmV0dXJuIGRpYWdyYW07Ci0JfQotCi0JcHJpdmF0ZSBEaWFncmFtIGNyZWF0ZUFERChBY3Rpdml0eSBhY3QsIFByZWZlcmVuY2VzSGludCBoaW50KQotCQkJdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlBY3Rpdml0eURldGFpbERpYWdyYW0gbW9kZWwgPSBNb2RlbEZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJLmNyZWF0ZUFjdGl2aXR5RGV0YWlsRGlhZ3JhbSgpOwotCQlpZiAobW9kZWwgaW5zdGFuY2VvZiBEaWFncmFtSW1wbCkgewotCQkJLy8gZGlzYWJsZSBjcmVhdGlvbiBvZiBVTUEgZ3JhcGhpY2FsIGRhdGEKLQkJCS8vCi0JCQkoKERpYWdyYW1JbXBsKSBtb2RlbCkuc2V0R3JhcGhpY2FsRGF0YVJlcXVpcmVkKGZhbHNlKTsKLQkJfQotCQltb2RlbC5zZXROZXcodHJ1ZSk7Ci0JCURpYWdyYW0gZGlhZ3JhbSA9IFZpZXdTZXJ2aWNlLmNyZWF0ZURpYWdyYW0obW9kZWwsCi0JCQkJZ2V0RGlhZ3JhbVR5cGVTdHJpbmcoSURpYWdyYW1NYW5hZ2VyLkFDVElWSVRZX0RFVEFJTF9ESUFHUkFNKSwKLQkJCQloaW50KTsKLQkJaWYgKGRpYWdyYW0gIT0gbnVsbCkgewotCQkJbW9kZWwuc2V0TGlua2VkRWxlbWVudChhY3QpOwotCQkJZGlhZ3JhbS5zZXROYW1lKGFjdC5nZXROYW1lKCkpOwotCQkJZ2V0UmVzb3VyY2UoKS5nZXRDb250ZW50cygpLmFkZChtb2RlbCk7Ci0JCQlnZXRSZXNvdXJjZSgpLmdldENvbnRlbnRzKCkuYWRkKGRpYWdyYW0pOwotCQl9Ci0JCXJldHVybiBkaWFncmFtOwotCX0KLQotCXByaXZhdGUgRGlhZ3JhbSBjcmVhdGVBRChBY3Rpdml0eSBhY3QsIFByZWZlcmVuY2VzSGludCBoaW50KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCW9yZy5lY2xpcHNlLnVtbDIudW1sLkFjdGl2aXR5IG1vZGVsID0gVU1MRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkuY3JlYXRlQWN0aXZpdHkoKTsKLQkJRGlhZ3JhbSBkaWFncmFtID0gVmlld1NlcnZpY2UuY3JlYXRlRGlhZ3JhbShtb2RlbCwKLQkJCQlnZXREaWFncmFtVHlwZVN0cmluZyhJRGlhZ3JhbU1hbmFnZXIuQUNUSVZJVFlfRElBR1JBTSksIGhpbnQpOwotCQlpZiAoZGlhZ3JhbSAhPSBudWxsKSB7Ci0JCQlCcmlkZ2VIZWxwZXIuYXNzb2NpYXRlKG1vZGVsLCBhY3QpOwotCQkJZGlhZ3JhbS5zZXROYW1lKGFjdC5nZXROYW1lKCkpOwotCQkJbW9kZWwuc2V0TmFtZShhY3QuZ2V0TmFtZSgpKTsKLQkJCWdldFJlc291cmNlKCkuZ2V0Q29udGVudHMoKS5hZGQobW9kZWwpOwotCQkJZ2V0UmVzb3VyY2UoKS5nZXRDb250ZW50cygpLmFkZChkaWFncmFtKTsKLQkJfQotCQlyZXR1cm4gZGlhZ3JhbTsKLQl9Ci0KLQlwcml2YXRlIElQcm9ncmVzc01vbml0b3IgZ2V0TW9uaXRvcigpIHsKLQkJaWYobW9uaXRvciA9PSBudWxsKSB7Ci0JCQltb25pdG9yID0gbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKTsKLQkJfQotCQlyZXR1cm4gbW9uaXRvcjsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RGlhZ3JhbUZpbGVQYXRoKFByb2Nlc3MgcHJvY2VzcykgewotCQl0cnkgewotCQkJUHJvY2Vzc0NvbXBvbmVudCBwcm9jQ29tcCA9IChQcm9jZXNzQ29tcG9uZW50KSBwcm9jZXNzLmVDb250YWluZXIoKTsKLQkJCWlmKHByb2NDb21wID09IG51bGwpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJCWlmKFVtYVV0aWwuaGFzRGlyZWN0UmVzb3VyY2UocHJvY0NvbXApKSB7Ci0JCQkJLy8gZXhpc3RpbmcgcHJvY2VzcwotCQkJCS8vCi0JCQkJcmV0dXJuIG5ldyBGaWxlKG5ldyBGaWxlKEZpbGVNYW5hZ2VyLnRvRmlsZVN0cmluZyhwcm9jZXNzLmVSZXNvdXJjZSgpLmdldFVSSSgpKSkuZ2V0UGFyZW50RmlsZSgpLCBESUFHUkFNX0ZJTEVOQU1FKS5nZXRDYW5vbmljYWxQYXRoKCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQkvLyBuZXcgcHJvY2VzcyB0aGF0IGhhcyBub3QgYmVlbiBzYXZlZCB5ZXQKLQkJCQkvLwotCQkJCVVSSSB1cmkgPSBNdWx0aUZpbGVTYXZlVXRpbC5jcmVhdGVVUkkocHJvY0NvbXAsIHByb2NDb21wLmVSZXNvdXJjZSgpLmdldFJlc291cmNlU2V0KCkpOwotCQkJCXJldHVybiBuZXcgRmlsZShuZXcgRmlsZSh1cmkudG9GaWxlU3RyaW5nKCkpLmdldFBhcmVudEZpbGUoKSwKLQkJCQkJCQkJRElBR1JBTV9GSUxFTkFNRSkuZ2V0Q2Fub25pY2FsUGF0aCgpOwotCQkJfQotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0JCQotCX0KLQkKLQlwdWJsaWMgdm9pZCByZWxvYWQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpZihyZXNvdXJjZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJcmVzb3VyY2UudW5sb2FkKCk7Ci0JCXJlc291cmNlLmxvYWQoQ29sbGVjdGlvbnMuRU1QVFlfTUFQKTsKLQkJSUZpbGUgZmlsZSA9IFdvcmtzcGFjZVN5bmNocm9uaXplci5nZXRGaWxlKHJlc291cmNlKTsKLQkJZmlsZVN5bmNocm9uaXplci51cGRhdGVNb2RpZmljYXRpb25TdGFtcChmaWxlKTsKLQkJbm90aWZ5UmVsb2FkZWQoKTsKLQl9Ci0JCi0JcHVibGljIFJlc291cmNlIGdldFJlc291cmNlKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZihyZXNvdXJjZSA9PSBudWxsKSB7Ci0JCQlyZXNvdXJjZSA9IGdldFJlc291cmNlKHRydWUpOwotCQl9Ci0JCXJldHVybiByZXNvdXJjZTsKLQl9CQotCQotCXByaXZhdGUgc3RhdGljIFVSSSBjcmVhdGVEaWFncmFtUmVzb3VyY2VVUkkoU3RyaW5nIHBhdGgpIHsKLQkJSUZpbGUgZGlhZ3JhbUZpbGUgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGVGb3JMb2NhdGlvbihuZXcgUGF0aChwYXRoKSk7Ci0JCXJldHVybiBVUkkuY3JlYXRlUGxhdGZvcm1SZXNvdXJjZVVSSShkaWFncmFtRmlsZQotCQkJCS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCkpOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBSZXNvdXJjZSBsb2FkRGlhZ3JhbVJlc291cmNlKElGaWxlIGZGaWxlLAotCQkJRWRpdGluZ0RvbWFpbiBkb21haW4sIE1hcCBsb2FkT3B0aW9ucywgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQotCQkJdGhyb3dzIENvcmVFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLQkJZkZpbGUucmVmcmVzaExvY2FsKElSZXNvdXJjZS5ERVBUSF9aRVJPLCBtb25pdG9yKTsKLQkJVVJJIHVyaSA9IFVSSS5jcmVhdGVQbGF0Zm9ybVJlc291cmNlVVJJKGZGaWxlLmdldEZ1bGxQYXRoKCkKLSAgICAgICAgICAgIC50b1N0cmluZygpLCB0cnVlKTsKLQkJCi0JCVJlc291cmNlIHJlc291cmNlID0gZG9tYWluLmdldFJlc291cmNlU2V0KCkuZ2V0UmVzb3VyY2UodXJpLCBmYWxzZSk7Ci0JCQotCQlpZiAocmVzb3VyY2UgPT0gbnVsbCkgewotCQkJcmVzb3VyY2UgPSBkb21haW4uZ2V0UmVzb3VyY2VTZXQoKS5jcmVhdGVSZXNvdXJjZSh1cmkpOwotCQl9Ci0JCQotCQlpZiAoIXJlc291cmNlLmlzTG9hZGVkKCkpIHsKLQkJCU1hcCBsb2FkaW5nT3B0aW9ucyA9IG5ldyBIYXNoTWFwKEdNRlJlc291cmNlRmFjdG9yeS5nZXREZWZhdWx0TG9hZE9wdGlvbnMoKSk7Ci0JCQkKLSAgICAgICAgICAgIC8vIHByb3BvZ2F0ZSBwYXNzZWQgaW4gb3B0aW9ucyB0byB0aGUgZGVmYXVsdHMKLSAgICAgICAgICAgIEl0ZXJhdG9yIGl0ZXIgPSBsb2FkT3B0aW9ucy5rZXlTZXQoKS5pdGVyYXRvcigpOwotICAgICAgICAgICAgd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgT2JqZWN0IGtleSA9IGl0ZXIubmV4dCgpOwotICAgICAgICAgICAgICAgIGxvYWRpbmdPcHRpb25zLnB1dChrZXksIGxvYWRPcHRpb25zLmdldChrZXkpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIAlyZXNvdXJjZS5sb2FkKGxvYWRpbmdPcHRpb25zKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIAlyZXNvdXJjZS51bmxvYWQoKTsKLSAgICAgICAgICAgIAl0aHJvdyBlOwotICAgICAgICAgICAgfQotCQl9Ci0JCQkJCQotCQlyZXR1cm4gcmVzb3VyY2U7Ci0KLQl9Ci0JCi0JcHJpdmF0ZSBSZXNvdXJjZSBnZXRSZXNvdXJjZShib29sZWFuIGNyZWF0ZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZihyZXNvdXJjZSA9PSBudWxsKSB7Ci0JCQlTdHJpbmcgcGF0aCA9IGdldERpYWdyYW1GaWxlUGF0aChwcm9jZXNzKTsJCi0JCQlpZihwYXRoICE9IG51bGwpIHsKLQkJCQlJUmVzb3VyY2Ugd3NSZXMgPSBGaWxlTWFuYWdlci5nZXRSZXNvdXJjZUZvckxvY2F0aW9uKHBhdGgpOwotCQkJCWlmKHdzUmVzIGluc3RhbmNlb2YgSUZpbGUpIHsKLQkJCQkJSUZpbGUgZmlsZSA9IChJRmlsZSkgd3NSZXM7Ci0JCQkJCXRyeSB7CQkJCQkJCi0JCQkJCQlEaWFncmFtIGRpYWdyYW0gPSBEaWFncmFtSU9VdGlsLmxvYWQoZ2V0RWRpdGluZ0RvbWFpbigpLCBmaWxlLCB0cnVlLCBnZXRNb25pdG9yKCkpOwkJCQkJCi0JCQkJCQlyZXNvdXJjZSA9IGRpYWdyYW0uZVJlc291cmNlKCk7Ci0JCQkJCX0KLQkJCQkJY2F0Y2goQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkvLyBoYW5kbGVkIGV4Y2VwdGlvbiB0aGF0IGlzIHRocm93biBpZiByZXNvdXJjZSBkb2VzIG5vdCBoYXZlIGFueSBkaWFncmFtCi0JCQkJCQkvLwotCQkJCQkJaWYob3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXNvdXJjZXMuZWRpdG9yLmludGVybmFsLmwxMG4uRWRpdG9yTWVzc2FnZXMuRGlhZ3JhbV9OT19ESUFHUkFNX0lOX1JFU09VUkNFCi0JCQkJCQkJCS5lcXVhbHMoZS5nZXRNZXNzYWdlKCkpKSB7Ci0JCQkJCQkJdHJ5IHsKLQkJCQkJCQkJcmVzb3VyY2UgPSBsb2FkRGlhZ3JhbVJlc291cmNlKGZpbGUsIGdldEVkaXRpbmdEb21haW4oKSwgQ29sbGVjdGlvbnMuRU1QVFlfTUFQLCBnZXRNb25pdG9yKCkpOwotCQkJCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUxKSB7Ci0JCQkJCQkJCWlmKERFQlVHKSB7Ci0JCQkJCQkJCQlEaWFncmFtQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkJCQkJCX0KLQkJCQkJCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBEaWFncmFtQ29yZVBsdWdpbi5QTFVHSU5fSUQsIGUxLmdldE1lc3NhZ2UoKSwgZTEpKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIHsKLQkJCQkJCQl0aHJvdyBlOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWZpbGVTeW5jaHJvbml6ZXIubW9uaXRvcihmaWxlKTsKLQkJCQl9Ci0JCQkJZWxzZSBpZihjcmVhdGUpIHsKLQkJCQkJcmVzb3VyY2UgPSBnZXRFZGl0aW5nRG9tYWluKCkuZ2V0UmVzb3VyY2VTZXQoKS5jcmVhdGVSZXNvdXJjZSgKLQkJCQkJCQljcmVhdGVEaWFncmFtUmVzb3VyY2VVUkkocGF0aCkpOwotCQkJCQlyZXNvdXJjZUlzTmV3ID0gdHJ1ZTsKLQkJCQkJCi0JCQkJCXRyeSB7Ci0JCQkJCQlUeFV0aWwucnVuSW5UcmFuc2FjdGlvbihnZXRFZGl0aW5nRG9tYWluKCksIG5ldyBSdW5uYWJsZSgpIHsKLQotCQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQkJcmVzb3VyY2UuZ2V0Q29udGVudHMoKS5jbGVhcigpOwotCQkJCQkJCX0KLQkJCQkJCQkKLQkJCQkJCX0pOwotCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJRGlhZ3JhbUNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWVsc2UgaWYoIXJlc291cmNlLmlzTG9hZGVkKCkpIHsKLQkJCXRyeSB7Ci0JCQkJcmVzb3VyY2UubG9hZChDb2xsZWN0aW9ucy5FTVBUWV9NQVApOwotCQkJCW5vdGlmeVJlbG9hZGVkKCk7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJQ29tbW9uUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCQlpZihERUJVRykgewotCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzb3VyY2U7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIG5vdGlmeVJlbG9hZGVkKCkgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSByZXNvdXJjZUNoYW5nZUxpc3RlbmVycy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCUlSZXNvdXJjZUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyID0gKElSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKSBpdGVyLm5leHQoKTsKLQkJCXRyeSB7Ci0JCQkJbGlzdGVuZXIucmVzb3VyY2VDaGFuZ2VkKG5ldyBSZXNvdXJjZUNoYW5nZUV2ZW50KHRoaXMsIElSZXNvdXJjZUNoYW5nZUV2ZW50LlBPU1RfQ0hBTkdFLCAwLCBudWxsKSk7Ci0JCQl9Ci0JCQljYXRjaChFeGNlcHRpb24gZSkgewotCQkJCUNvbW1vblBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkJaWYoREVCVUcpIHsKLQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgY2hlY2tBY3Rpdml0eShBY3Rpdml0eSBhY3QpIHsJCQotCQlQcm9jZXNzIHByb2MgPSBUbmdVdGlsLmdldE93bmluZ1Byb2Nlc3MoYWN0KTsKLQkJaWYocHJvYyAhPSBwcm9jZXNzKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgc3BlY2lmaWVkIGFjdGl2aXR5IGRvZXMgbm90IGJlbG9uZyB0byB0aGUgcHJvY2VzcyBvZiB0aGlzIGRpYWdyYW0gbWFuYWdlci4iKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQkKLQkKLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzRGlhZ3JhbU9mKERpYWdyYW0gZGlhZ3JhbSwgQWN0aXZpdHkgYWN0KSB7Ci0JCWlmKEFEX2tpbmQuZXF1YWxzKGRpYWdyYW0uZ2V0VHlwZSgpKSkgewotCQkJcmV0dXJuIEJyaWRnZUhlbHBlci5nZXRNZXRob2RFbGVtZW50RnJvbUFubm90YXRpb24oKEVNb2RlbEVsZW1lbnQpIGRpYWdyYW0uZ2V0RWxlbWVudCgpLCBhY3QuZVJlc291cmNlKCkuZ2V0UmVzb3VyY2VTZXQoKSkgPT0gYWN0OwotCQl9Ci0JCWVsc2UgaWYoQUREX2tpbmQuZXF1YWxzKGRpYWdyYW0uZ2V0VHlwZSgpKSkgewotCQkJRU9iamVjdCBtb2RlbCA9IGRpYWdyYW0uZ2V0RWxlbWVudCgpOwotCQkJcmV0dXJuIG1vZGVsIGluc3RhbmNlb2YgQWN0aXZpdHlEZXRhaWxEaWFncmFtICYmICgoQWN0aXZpdHlEZXRhaWxEaWFncmFtKW1vZGVsKS5nZXRMaW5rZWRFbGVtZW50KCkgPT0gYWN0OwotCQl9Ci0JCWVsc2UgaWYoV1BEX2tpbmQuZXF1YWxzKGRpYWdyYW0uZ2V0VHlwZSgpKSkgewotCQkJRU9iamVjdCBtb2RlbCA9IGRpYWdyYW0uZ2V0RWxlbWVudCgpOwotCQkJcmV0dXJuIG1vZGVsIGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbSAmJiAoKFdvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW0pbW9kZWwpLmdldExpbmtlZEVsZW1lbnQoKSA9PSBhY3Q7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQkvKioKLQkgKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gcmVzb3VyY2UgaGFzIGJlZW4gY2hhbmdlZCBvbiB0aGUKLQkgKiBsb2NhbCBmaWxlIHN5c3RlbSBieSBjb21wYXJpbmcgdGhlIGFjdHVhbCB0aW1lIHN0YW1wIHdpdGggdGhlCi0JICogY2FjaGVkIG9uZS4gSWYgdGhlIHJlc291cmNlIGhhcyBiZWVuIGNoYW5nZWQsIGEgPGNvZGU+Q29yZUV4Y2VwdGlvbjwvY29kZT4KLQkgKiBpcyB0aHJvd24uCi0JICoKLQkgKiBAcGFyYW0gY2FjaGVkTW9kaWZpY2F0aW9uU3RhbXAgdGhlIGNhY2hlZCBtb2RpZmljYXRpb24gc3RhbXAKLQkgKiBAcGFyYW0gcmVzb3VyY2UgdGhlIHJlc291cmNlIHRvIGNoZWNrCi0JICogQHRocm93cyBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbiBpZiByZXNvdXJjZSBoYXMgYmVlbiBjaGFuZ2VkIG9uIHRoZSBmaWxlIHN5c3RlbQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBjaGVja1N5bmNocm9uaXphdGlvblN0YXRlKFJlc291cmNlIHJlc291cmNlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmKCFpc1N5bmNocm9uaXplZChyZXNvdXJjZSkpIHsKLQkJCVN0YXR1cyBzdGF0dXM9IG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgUGxhdGZvcm1VSS5QTFVHSU5fSUQsIElSZXNvdXJjZVN0YXR1cy5PVVRfT0ZfU1lOQ19MT0NBTCwgRWRpdG9yTWVzc2FnZXMuRmlsZURvY3VtZW50UHJvdmlkZXJfZXJyb3Jfb3V0X29mX3N5bmMsIG51bGwpOwotCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24oc3RhdHVzKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNTeW5jaHJvbml6ZWQoUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJSUZpbGUgZmlsZSA9IFdvcmtzcGFjZVN5bmNocm9uaXplci5nZXRGaWxlKHJlc291cmNlKTsKLQkJaWYoZmlsZSAhPSBudWxsKSB7Ci0JCQkvLyBkb24ndCByZWZyZXNoIHRvIHByZXZlbnQgcmVzb3VyY2UgZnJvbSBhdXRvbWF0aWNhbGx5IHJlbG9hZGVkCi0JCQkvLwotLy8JCQlmaWxlLnJlZnJlc2hMb2NhbChJUmVzb3VyY2UuREVQVEhfWkVSTywgbW9uaXRvcik7Ci0JCQlGaWxlSW5mbyBpbmZvID0gZmlsZVN5bmNocm9uaXplci5nZXRGaWxlSW5mbyhmaWxlKTsKLQkJCWlmKGluZm8gIT0gbnVsbCkgewotCQkJCXJldHVybiBpbmZvLmZNb2RpZmljYXRpb25TdGFtcCA9PSBGaWxlU3luY2hyb25pemVyLmNvbXB1dGVNb2RpZmljYXRpb25TdGFtcChmaWxlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JcHJpdmF0ZSBNYXA8QWN0aXZpdHksIE1hcDxTdHJpbmcsIERpYWdyYW0+PiBnZXRBY3Rpdml0eVRvU2F2ZWREaWFncmFtc01hcCgpIHsKLQkJaWYoYWN0aXZpdHlUb1NhdmVkRGlhZ3JhbU1hcCA9PSBudWxsKSB7Ci0JCQlhY3Rpdml0eVRvU2F2ZWREaWFncmFtTWFwID0gbmV3IEhhc2hNYXA8QWN0aXZpdHksIE1hcDxTdHJpbmcsIERpYWdyYW0+PigpOwotCQl9Ci0JCXJldHVybiBhY3Rpdml0eVRvU2F2ZWREaWFncmFtTWFwOwotCX0KLQkKLQlwcml2YXRlIERpYWdyYW0gZ2V0RGlhZ3JhbUJhY2t1cChBY3Rpdml0eSBhY3QsIFN0cmluZyB0eXBlKSB7Ci0JCWlmKGFjdGl2aXR5VG9TYXZlZERpYWdyYW1NYXAgIT0gbnVsbCkgewotCQkJTWFwPFN0cmluZywgRGlhZ3JhbT4gdHlwZVRvRGlhZ2FtTWFwID0gYWN0aXZpdHlUb1NhdmVkRGlhZ3JhbU1hcC5nZXQoYWN0KTsKLQkJCWlmKHR5cGVUb0RpYWdhbU1hcCAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIChEaWFncmFtKSB0eXBlVG9EaWFnYW1NYXAuZ2V0KHR5cGUpOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgdm9pZCByZXBsYWNlVGVtcG9yYXJpbHkoZmluYWwgQWN0aXZpdHkgYWN0LCBmaW5hbCBEaWFncmFtIGRpYWdyYW0pIHsKLQkJdHJ5IHsKLQkJCW5ldyBBYnN0cmFjdEVNRk9wZXJhdGlvbihnZXRFZGl0aW5nRG9tYWluKCksIFN0cmluZ1N0YXRpY3MuQkxBTkspIHsKLQotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCBJU3RhdHVzIGRvRXhlY3V0ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlMaXN0IGRpYWdyYW1zID0gZ2V0RGlhZ3JhbXMoYWN0LCBnZXREaWFncmFtVHlwZShkaWFncmFtLmdldFR5cGUoKSkpOwotCQkJCQkJaWYoIWRpYWdyYW1zLmlzRW1wdHkoKSkgewotCQkJCQkJCURpYWdyYW0gc2F2ZWREaWFncmFtID0gKERpYWdyYW0pIGRpYWdyYW1zLmdldCgwKTsKLQkJCQkJCQlNYXA8U3RyaW5nLCBEaWFncmFtPiB0eXBlVG9EaWFnYW1NYXAgPSBnZXRBY3Rpdml0eVRvU2F2ZWREaWFncmFtc01hcCgpLmdldChhY3QpOwkKLQkJCQkJCQlpZih0eXBlVG9EaWFnYW1NYXAgPT0gbnVsbCkgewotCQkJCQkJCQl0eXBlVG9EaWFnYW1NYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIERpYWdyYW0+KCk7Ci0JCQkJCQkJCWdldEFjdGl2aXR5VG9TYXZlZERpYWdyYW1zTWFwKCkucHV0KGFjdCwgdHlwZVRvRGlhZ2FtTWFwKTsKLQkJCQkJCQl9Ci0JCQkJCQkJaWYodHlwZVRvRGlhZ2FtTWFwLmdldChkaWFncmFtLmdldFR5cGUoKSkgPT0gbnVsbCkgewotCQkJCQkJCQl0eXBlVG9EaWFnYW1NYXAucHV0KGRpYWdyYW0uZ2V0VHlwZSgpLCBzYXZlZERpYWdyYW0pOwotCQkJCQkJCX0KLQkJCQkJCQkoKEludGVybmFsRU9iamVjdCkgZGlhZ3JhbSkuZVNldFByb3h5VVJJKG51bGwpOwotCQkJCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGRpYWdyYW0uZUFsbENvbnRlbnRzKCk7IGl0ZXIKLQkJCQkJCQkuaGFzTmV4dCgpOyAoKEludGVybmFsRU9iamVjdCkgaXRlci5uZXh0KCkpLmVTZXRQcm94eVVSSShudWxsKSk7Ci0JCQkJCQkJKChJbnRlcm5hbEVPYmplY3QpIGRpYWdyYW0uZ2V0RWxlbWVudCgpKS5lU2V0UHJveHlVUkkobnVsbCk7Ci0JCQkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gZGlhZ3JhbS5nZXRFbGVtZW50KCkuZUFsbENvbnRlbnRzKCk7IGl0ZXIKLQkJCQkJCQkuaGFzTmV4dCgpOyAoKEludGVybmFsRU9iamVjdCkgaXRlci5uZXh0KCkpLmVTZXRQcm94eVVSSShudWxsKSk7CQkJCQkJCQotCQkJCQkJCXJlc291cmNlLmdldENvbnRlbnRzKCkuc2V0KHJlc291cmNlLmdldENvbnRlbnRzKCkuaW5kZXhPZihzYXZlZERpYWdyYW0pLCBkaWFncmFtKTsKLQkJCQkJCQlyZXNvdXJjZS5nZXRDb250ZW50cygpLnNldChyZXNvdXJjZS5nZXRDb250ZW50cygpLmluZGV4T2Yoc2F2ZWREaWFncmFtLmdldEVsZW1lbnQoKSksIGRpYWdyYW0uZ2V0RWxlbWVudCgpKTsJCQkJCi0JCQkJCQl9Ci0JCQkJCQllbHNlIHsKLQkJCQkJCQlyZXNvdXJjZS5nZXRDb250ZW50cygpLmFkZChkaWFncmFtLmdldEVsZW1lbnQoKSk7Ci0JCQkJCQkJcmVzb3VyY2UuZ2V0Q29udGVudHMoKS5hZGQoZGlhZ3JhbSk7Ci0JCQkJCQl9Ci0JCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQkJQ29tbW9uUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsJCQkKLQkJCQkJfQotCQkJCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQkJCQl9Ci0JCQkJCi0JCQl9LmV4ZWN1dGUobmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSwgbnVsbCk7Ci0JCX0gY2F0Y2ggKEV4ZWN1dGlvbkV4Y2VwdGlvbiBlMSkgewotCQkJQ29tbW9uUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlMSk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBEaWFncmFtIGdldFNhdmVkRGlhZ3JhbShBY3Rpdml0eSBhY3QsIERpYWdyYW0gZGlhZ3JhbSkgewotCQlEaWFncmFtIHNhdmVkRGlhZ3JhbSA9IGdldERpYWdyYW1CYWNrdXAoYWN0LCBkaWFncmFtLmdldFR5cGUoKSk7Ci0vLwkJaWYoc2F2ZWREaWFncmFtID09IG51bGwpIHsKLS8vCQkJLy8gdHJ5IHRvIGxvYWQgZGlhZ3JhbSBmcm9tIGZpbGUKLS8vCQkJLy8KLS8vCQkJSUZpbGUgZmlsZSA9IFdvcmtzcGFjZVN5bmNocm9uaXplci5nZXRGaWxlKHJlc291cmNlKTsKLS8vCQkJaWYoZmlsZSAhPSBudWxsKSB7Ci0vLwkJCQlUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiBkb21haW4gPSBjcmVhdGVFZGl0aW5nRG9tYWluKCk7Ci0vLwkJCQl0cnkgewotLy8JCQkJCURpYWdyYW0gZCA9IERpYWdyYW1JT1V0aWwubG9hZChkb21haW4sIGZpbGUsIHRydWUsIGdldE1vbml0b3IoKSk7Ci0vLwkJCQkJaWYoZCAhPSBudWxsKSB7Ci0vLwkJCQkJCWludCBpbmRleCA9IHJlc291cmNlLmdldENvbnRlbnRzKCkuaW5kZXhPZihkaWFncmFtKTsKLS8vCQkJCQkJc2F2ZWREaWFncmFtID0gKERpYWdyYW0pIGQuZVJlc291cmNlKCkuZ2V0Q29udGVudHMoKS5nZXQoaW5kZXgpOwotLy8JCQkJCX0KLS8vCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotLy8JCQkJCURpYWdyYW1Db3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLS8vCQkJCX0gZmluYWxseSB7Ci0vLwkJCQkJaWYoZG9tYWluICE9IG51bGwpIHsKLS8vCQkJCQkJZG9tYWluLmRpc3Bvc2UoKTsKLS8vCQkJCQl9Ci0vLwkJCQl9Ci0vLwkJCX0KLS8vCQl9Ci0JCXJldHVybiBzYXZlZERpYWdyYW07Ci0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIHJldmVyc2VUb1NhdmVkKGZpbmFsIEFjdGl2aXR5IGFjdCwgZmluYWwgRGlhZ3JhbSBkaWFncmFtLCBQcmVmZXJlbmNlc0hpbnQgaGludCkgewotCQlmaW5hbCBEaWFncmFtIHNhdmVkRGlhZ3JhbSA9IGdldFNhdmVkRGlhZ3JhbShhY3QsIGRpYWdyYW0pOwotCQl0cnkgewotCQkJbmV3IEFic3RyYWN0RU1GT3BlcmF0aW9uKGdldEVkaXRpbmdEb21haW4oKSwgU3RyaW5nU3RhdGljcy5CTEFOSykgewotCi0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIElTdGF0dXMgZG9FeGVjdXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJCQkJaWYoc2F2ZWREaWFncmFtICE9IG51bGwpIHsKLQkJCQkJCS8vIHJlc3RvcmUgZGlhZ3JhbSB0byBpdHMgYmFja3VwCi0JCQkJCQkvLwotCQkJCQkJcmVzb3VyY2UuZ2V0Q29udGVudHMoKS5zZXQocmVzb3VyY2UuZ2V0Q29udGVudHMoKS5pbmRleE9mKGRpYWdyYW0pLCBzYXZlZERpYWdyYW0pOwotCQkJCQkJcmVzb3VyY2UuZ2V0Q29udGVudHMoKS5zZXQocmVzb3VyY2UuZ2V0Q29udGVudHMoKS5pbmRleE9mKGRpYWdyYW0uZ2V0RWxlbWVudCgpKSwgc2F2ZWREaWFncmFtLmdldEVsZW1lbnQoKSk7Ci0JCQkJCQlyZW1vdmVEaWFncmFtQmFja3VwKGFjdCwgZGlhZ3JhbS5nZXRUeXBlKCkpOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJLy8gZGlhZ3JhbSBpcyBuZXdseSBjcmVhdGVkLCByZW1vdmUgaXQgZnJvbSByZXNvdXJjZQotCQkJCQkJLy8KLQkJCQkJCXJlc291cmNlLmdldENvbnRlbnRzKCkucmVtb3ZlKGRpYWdyYW0uZ2V0RWxlbWVudCgpKTsKLQkJCQkJCXJlc291cmNlLmdldENvbnRlbnRzKCkucmVtb3ZlKGRpYWdyYW0pOwotCQkJCQl9Ci0JCQkJCQotCQkJCQlJTGlicmFyeVBlcnNpc3Rlci5GYWlsU2FmZU1ldGhvZExpYnJhcnlQZXJzaXN0ZXIgcGVyc2lzdGVyID0gTGlicmFyeVNlcnZpY2VVdGlsCi0JCQkJCQkJLmdldFBlcnNpc3RlckZvcihhY3QuZVJlc291cmNlKCkpCi0JCQkJCQkJLmdldEZhaWxTYWZlUGVyc2lzdGVyKCk7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlwZXJzaXN0ZXIuc2F2ZShyZXNvdXJjZSk7Ci0JCQkJCQlwZXJzaXN0ZXIuY29tbWl0KCk7Ci0JCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlEaWFncmFtQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkJCQl0cnkgewotCQkJCQkJCXBlcnNpc3Rlci5yb2xsYmFjaygpOwotCQkJCQkJfQotCQkJCQkJY2F0Y2goRXhjZXB0aW9uIGV4KSB7fQotCQkJCQkJdGhyb3cgbmV3IEV4ZWN1dGlvbkV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSwgZSk7Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCQkJfQotCQkJCQotCQkJfS5leGVjdXRlKG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCksIG51bGwpOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0gY2F0Y2ggKEV4ZWN1dGlvbkV4Y2VwdGlvbiBlMSkgewotCQkJQ29tbW9uUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlMSk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwkJCi0JfQotCi0JLyoqCi0JICogVXBkYXRlcyBVUkkgb2YgZGlhZ3JhbSByZXNvdXJjZSBhZnRlciB0aGUgVVJJIG9mIHByb2Nlc3MgcmVzb3VyY2UgaGFzIGJlZW4gY2hhbmdlZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCB1cGRhdGVSZXNvdXJjZVVSSSgpIHsKLQkJaWYocmVzb3VyY2UgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCUZpbGUgZm9sZGVyID0gbmV3IEZpbGUoRmlsZU1hbmFnZXIudG9GaWxlU3RyaW5nKHJlc291cmNlLmdldFVSSSgpKSkuZ2V0UGFyZW50RmlsZSgpOwotCQlGaWxlIHByb2NGb2xkZXIgPSBuZXcgRmlsZShwcm9jZXNzLmVSZXNvdXJjZSgpLmdldFVSSSgpLnRvRmlsZVN0cmluZygpKS5nZXRQYXJlbnRGaWxlKCk7Ci0JCWlmKCFmb2xkZXIuZXF1YWxzKHByb2NGb2xkZXIpKSB7Ci0JCQlTdHJpbmcgcGF0aCA9IGdldERpYWdyYW1GaWxlUGF0aChwcm9jZXNzKTsKLQkJCWlmKHBhdGggIT0gbnVsbCAmJiBuZXcgRmlsZShwYXRoKS5leGlzdHMoKSkgewotCQkJCXJlc291cmNlLnNldFVSSShjcmVhdGVEaWFncmFtUmVzb3VyY2VVUkkocGF0aCkpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgYmFja3VwRGlhZ3JhbShBY3Rpdml0eSBhY3Rpdml0eSwgRGlhZ3JhbSBkaWFncmFtKSB7Ci0JCU1hcDxTdHJpbmcsIERpYWdyYW0+IHR5cGVUb0RpYWdhbU1hcCA9IGdldEFjdGl2aXR5VG9TYXZlZERpYWdyYW1zTWFwKCkuZ2V0KGFjdGl2aXR5KTsJCi0JCWlmKHR5cGVUb0RpYWdhbU1hcCA9PSBudWxsKSB7Ci0JCQl0eXBlVG9EaWFnYW1NYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIERpYWdyYW0+KCk7Ci0JCQlnZXRBY3Rpdml0eVRvU2F2ZWREaWFncmFtc01hcCgpLnB1dChhY3Rpdml0eSwgdHlwZVRvRGlhZ2FtTWFwKTsKLQkJfQotCQl0eXBlVG9EaWFnYW1NYXAucHV0KGRpYWdyYW0uZ2V0VHlwZSgpLCBEaWFncmFtSGVscGVyLmNvcHlEaWFncmFtKGdldEVkaXRpbmdEb21haW4oKSwgZGlhZ3JhbSkpOwotCX0KLQotCXB1YmxpYyBEaWFncmFtIHJlbW92ZURpYWdyYW1CYWNrdXAoQWN0aXZpdHkgYWN0LCBTdHJpbmcgdHlwZSkgewotCQlpZihhY3Rpdml0eVRvU2F2ZWREaWFncmFtTWFwICE9IG51bGwpIHsKLQkJCU1hcDxTdHJpbmcsIERpYWdyYW0+IHR5cGVUb0RpYWdhbU1hcCA9IGFjdGl2aXR5VG9TYXZlZERpYWdyYW1NYXAuZ2V0KGFjdCk7Ci0JCQlpZih0eXBlVG9EaWFnYW1NYXAgIT0gbnVsbCkgewotCQkJCXJldHVybiAoRGlhZ3JhbSkgdHlwZVRvRGlhZ2FtTWFwLnJlbW92ZSh0eXBlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vY29yZS9zZXJ2aWNlcy9EaWFncmFtU2VydmljZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vY29yZS9zZXJ2aWNlcy9EaWFncmFtU2VydmljZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYjFhOGE5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2NvcmUvc2VydmljZXMvRGlhZ3JhbVNlcnZpY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuc2VydmljZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuRGlhZ3JhbUNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlByb2Nlc3NVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkRpYWdyYW07Ci0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjIKLSAqLwotcHVibGljIGNsYXNzIERpYWdyYW1TZXJ2aWNlIHsKLQotCXByaXZhdGUgU2V0PERpYWdyYW1NYW5hZ2VyPiBkaWFncmFtTWFuYWdlcnMgPSBuZXcgSGFzaFNldDxEaWFncmFtTWFuYWdlcj4oKTsKLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBEaWFncmFtU2VydmljZSgpIHsKLQl9Ci0JCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJZm9yIChEaWFncmFtTWFuYWdlciBtZ3IgOiBkaWFncmFtTWFuYWdlcnMpIHsKLQkJCW1nci5yZW1vdmVDb25zdW1lcih0aGlzKTsKLQkJfQotCX0KLQotCXB1YmxpYyBEaWFncmFtTWFuYWdlciBnZXREaWFncmFtTWFuYWdlcihBY3Rpdml0eSBhY3QpIHsKLQkJUHJvY2VzcyBwcm9jID0gVG5nVXRpbC5nZXRPd25pbmdQcm9jZXNzKGFjdCk7Ci0JCWlmKHByb2MgIT0gbnVsbCkgewotCQkJRGlhZ3JhbU1hbmFnZXIgbWdyID0gRGlhZ3JhbU1hbmFnZXIuZ2V0SW5zdGFuY2UoVG5nVXRpbC5nZXRPd25pbmdQcm9jZXNzKGFjdCksIHRoaXMpOwotCQkJZGlhZ3JhbU1hbmFnZXJzLmFkZChtZ3IpOwotCQkJcmV0dXJuIG1ncjsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIENvbGxlY3Rpb248RGlhZ3JhbT4gZ2V0RGlhZ3JhbXMoQWN0aXZpdHkgYWN0KSB7Ci0JCURpYWdyYW1NYW5hZ2VyIG1nciA9IGdldERpYWdyYW1NYW5hZ2VyKGFjdCk7Ci0JCXJldHVybiBtZ3IgIT0gbnVsbCA/IERpYWdyYW1IZWxwZXIuZ2V0RGlhZ3JhbXMoYWN0LCBtZ3IpIDogQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyBiYXNlIGRpYWdyYW0uCi0JICogQHBhcmFtIGFjdAotCSAqIEBwYXJhbSB0eXBlCi0JICogQHJldHVybgotCSAqLwotCQotCXB1YmxpYyBEaWFncmFtIGdldEJhc2VEaWFncmFtKEFjdGl2aXR5IGFjdCwgaW50IHR5cGUpIHsJCQotCQlpZiAoUHJvY2Vzc1V0aWwuaXNFeHRlbmRpbmdPckxvY2FsbHlDb250cmlidXRpbmcoYWN0KSkgewotCQkJdHJ5IHsKLQkJCQlBY3Rpdml0eSBiYXNlQWN0ID0gKEFjdGl2aXR5KSBhY3QKLQkJCQkJCS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCk7Ci0JCQkJRGlhZ3JhbU1hbmFnZXIgbWdyID0gZ2V0RGlhZ3JhbU1hbmFnZXIoYmFzZUFjdCk7Ci0JCQkJTGlzdDxEaWFncmFtPiBiYXNlRGlhZ3JhbXMgPSBtZ3IuZ2V0RGlhZ3JhbXMoYmFzZUFjdCwgdHlwZSk7Ci0JCQkJaWYoIWJhc2VEaWFncmFtcy5pc0VtcHR5KCkpIHsKLQkJCQkJcmV0dXJuIGJhc2VEaWFncmFtcy5nZXQoMCk7Ci0JCQkJfQotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlEaWFncmFtQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoCi0JCQkJCQkiRXJyb3IgaW4gZ2V0dGluZyBiYXNlIGRpYWdyYW06ICIsIGUpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIERpYWdyYW0gZ2V0RGlhZ3JhbShBY3Rpdml0eSBhY3QsIGludCB0eXBlKSB7Ci0JCXRyeSB7Ci0JCQlEaWFncmFtTWFuYWdlciBtZ3IgPSBnZXREaWFncmFtTWFuYWdlcihhY3QpOwotCQkJTGlzdDxEaWFncmFtPiBkaWFncmFtcyA9IG1nci5nZXREaWFncmFtcyhhY3QsIHR5cGUpOwotCQkJcmV0dXJuIGRpYWdyYW1zLmlzRW1wdHkoKSA/IG51bGwgOiBkaWFncmFtcy5nZXQoMCk7Ci0JCX0KLQkJY2F0Y2goRXhjZXB0aW9uIGUpIHsKLQkJCURpYWdyYW1Db3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9jb3JlL3NlcnZpY2VzL0ZpbGVTeW5jaHJvbml6ZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2NvcmUvc2VydmljZXMvRmlsZVN5bmNocm9uaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhODhkMzM4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2NvcmUvc2VydmljZXMvRmlsZVN5bmNocm9uaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuc2VydmljZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotCi0vKioKLSAqIFN5bmNocm9uaXplcyB0aGUgZG9jdW1lbnQgd2l0aCBleHRlcm5hbCByZXNvdXJjZSBjaGFuZ2VzLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICoKLSAqIEBzaW5jZSAxLjIKLSAqLwotcHVibGljIGNsYXNzIEZpbGVTeW5jaHJvbml6ZXIgZXh0ZW5kcyBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS51dGlsLkZpbGVTeW5jaHJvbml6ZXIgewotCS8qKgotCSAqIFBvc3RzIHRoZSB1cGRhdGUgY29kZSAiYmVoaW5kIiB0aGUgcnVubmluZyBvcGVyYXRpb24uCi0JICoKLQkgKiBAcGFyYW0gcnVubmFibGUgdGhlIHVwZGF0ZSBjb2RlCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlKFJ1bm5hYmxlIHJ1bm5hYmxlKSB7Ci0JCUlXb3JrYmVuY2ggd29ya2JlbmNoPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpOwotCQlJV29ya2JlbmNoV2luZG93W10gd2luZG93cz0gd29ya2JlbmNoLmdldFdvcmtiZW5jaFdpbmRvd3MoKTsKLQkJaWYgKHdpbmRvd3MgIT0gbnVsbCAmJiB3aW5kb3dzLmxlbmd0aCA+IDApIHsKLQkJCURpc3BsYXkgZGlzcGxheT0gd2luZG93c1swXS5nZXRTaGVsbCgpLmdldERpc3BsYXkoKTsKLQkJCWRpc3BsYXkuYXN5bmNFeGVjKHJ1bm5hYmxlKTsKLQkJfSBlbHNlIHsKLQkJCXJ1bm5hYmxlLnJ1bigpOwotCQl9Ci0JfQotfQotCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9jb3JlL3V0aWwvRGlhZ3JhbUNvbnN0YW50cy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vY29yZS91dGlsL0RpYWdyYW1Db25zdGFudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjVlY2E5Ni4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9jb3JlL3V0aWwvRGlhZ3JhbUNvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuQ29sb3JDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5EaWFncmFtQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkZvbnRTdHlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnREYXRhOwotCi0vKioKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQHNpbmNlIDEuMgotICoKLSAqLwotcHVibGljIGNsYXNzIERpYWdyYW1Db25zdGFudHMgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgZGlhZ3JhbURlbGV0ZUFjdGlvbklEID0gImRlbGV0ZURpYWdyYW0iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRGVsZXRlX0RpYWdyYW1fRWxlbWVudD0iZGVsZXRlRGlhZ3JhbUVsZW1lbnQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVMRVRFX0RJQUdSQU1fSUQ9ICJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLmFjdGlvbnMuRGVsZXRlRGlhZ3JhbUFjdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRVNFVF9ESUFHUkFNX0xBWU9VVCA9ICJyZXNldF9kaWFncmFtX2xheW91dCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRUZSRVNIID0gIm9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuYWN0aW9ucy5SZWZyZXNoQWN0aW9uIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERJQUdSQU1fQUREX01FTlVfR0VORVJBTF9HUk9VUCA9ICJhZGREaWFncmFtR2VuZXJhbEdyb3VwIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFUEFSRU5UX0NPTU1BTkQgPSAicmVwYXJlbnQgY29tbWFuZCI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIENvbG9yIFJFQURfT05MWV9GT05UX0NPTE9SID0gQ29sb3JDb25zdGFudHMuZGFya0dyZWVuOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29sb3IgREVGQVVMVF9GT05UX0NPTE9SID0gQ29sb3JDb25zdGFudHMuYmxhY2s7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBDb2xvciBTVVBQUkVTU0VEX0ZPTlRfQ09MT1IgPSBDb2xvckNvbnN0YW50cy5ncmF5OwotCQotCQotCS8vIEZvciBkZWZhdWx0IGZvbnRzLgotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfRk9OVF9OQU1FID0gZ2V0Rm9udE5hbWUoKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfRk9OVF9TSVpFID0gODsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgRm9udCBERUZBVUxUX0ZPTlQgPSBuZXcgRm9udChudWxsLCBERUZBVUxUX0ZPTlRfTkFNRSwKLQkJCURFRkFVTFRfRk9OVF9TSVpFLCBqYXZhLmF3dC5Gb250LlBMQUlOKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgRm9udCBERUZBVUxUX0ZPTlRfSVRBTElDID0gbmV3IEZvbnQobnVsbCwKLQkJCURFRkFVTFRfRk9OVF9OQU1FLCBERUZBVUxUX0ZPTlRfU0laRSwgamF2YS5hd3QuRm9udC5JVEFMSUMpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0lOXzJLID0gIldpbmRvd3MgMjAwMCI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGdldEZvbnROYW1lKCkgewotCQlTdHJpbmcgbmFtZSA9ICJBcmlhbCI7IC8vJE5PTi1OTFMtMSQKLQotCQkvLyBDb3JydXB0ZWQgSmFwYW5lc2UgY2hhcmFjdGVycyBpbiBBY3Rpdml0eSBEaWFncmFtcwotCQlTdHJpbmcgY3VycmVudExvY2FsZSA9IFBsYXRmb3JtLmdldE5MKCk7Ci0JCWlmIChjdXJyZW50TG9jYWxlICE9IG51bGwKLQkJCQkmJiBjdXJyZW50TG9jYWxlLnN0YXJ0c1dpdGgoTG9jYWxlLkpBUEFORVNFLmdldExhbmd1YWdlKCkpKSB7Ci0JCQlpZiAoV0lOXzJLLmVxdWFsc0lnbm9yZUNhc2UoU3lzdGVtLmdldFByb3BlcnR5KCJvcy5uYW1lIikpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQluYW1lID0gTGlicmFyeVJlc291cmNlcy5yb2xlRGlhZ3JhbUZvbnRfbmFtZV93aW4zMjsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbmFtZTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgZ2V0Rm9udE5hbWUoRm9udFN0eWxlIHN0eWxlKSB7Ci0JCVN0cmluZyBuYW1lID0gIkFyaWFsIjsgLy8kTk9OLU5MUy0xJAotCQlpZiAoc3R5bGUgIT0gbnVsbCkgewkKLQkJCW5hbWUgPSBzdHlsZS5nZXRGb250TmFtZSgpOwotCQl9Ci0KLQkJLy8gQ29ycnVwdGVkIEphcGFuZXNlIGNoYXJhY3RlcnMgaW4gQWN0aXZpdHkgRGlhZ3JhbXMKLQkJU3RyaW5nIGN1cnJlbnRMb2NhbGUgPSBQbGF0Zm9ybS5nZXROTCgpOwotCQlpZiAoY3VycmVudExvY2FsZSAhPSBudWxsCi0JCQkJJiYgY3VycmVudExvY2FsZS5zdGFydHNXaXRoKExvY2FsZS5KQVBBTkVTRS5nZXRMYW5ndWFnZSgpKSkgewotCQkJaWYgKFdJTl8ySy5lcXVhbHNJZ25vcmVDYXNlKFN5c3RlbS5nZXRQcm9wZXJ0eSgib3MubmFtZSIpKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJbmFtZSA9IExpYnJhcnlSZXNvdXJjZXMucm9sZURpYWdyYW1Gb250X25hbWVfd2luMzJfamE7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG5hbWU7Ci0JfQotCQotCQotCS8qKgotCSAqIEdldCBkZWZhdWx0IGZvbnQgZGF0YQotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEZvbnREYXRhIGdldERlZmF1bHRGb250RGF0YSgpIHsKLQkKLQkJU3RyaW5nIGZvbnROYW1lID0gREVGQVVMVF9GT05UX05BTUU7Ci0JCQotCQkvLyBDb3JydXB0ZWQgSmFwYW5lc2UgY2hhcmFjdGVycyBpbiBBY3Rpdml0eSBEaWFncmFtcwotCQlTdHJpbmcgY3VycmVudExvY2FsZSA9IFBsYXRmb3JtLmdldE5MKCk7Ci0JCWlmIChjdXJyZW50TG9jYWxlICE9IG51bGwKLQkJCQkmJiBjdXJyZW50TG9jYWxlLnN0YXJ0c1dpdGgoTG9jYWxlLkpBUEFORVNFLmdldExhbmd1YWdlKCkpKSB7Ci0JCQlpZiAoV0lOXzJLLmVxdWFsc0lnbm9yZUNhc2UoU3lzdGVtLmdldFByb3BlcnR5KCJvcy5uYW1lIikpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQlmb250TmFtZSA9IExpYnJhcnlSZXNvdXJjZXMucm9sZURpYWdyYW1Gb250X25hbWVfd2luMzJfamE7Ci0JCQl9Ci0JCX0KLQkJRm9udERhdGEgZm9udERhdGEgPSBuZXcgRm9udERhdGEoZm9udE5hbWUsIERFRkFVTFRfRk9OVF9TSVpFLCBTV1QuTk9STUFMKTsKLQkJcmV0dXJuIGZvbnREYXRhOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDUkVBVEVfU1RBUlRfTk9ERSA9ICJjcmVhdGVfc3RhcnRfbm9kZSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENSRUFURV9FTkRfTk9ERSA9ICJjcmVhdGVfZW5kX25vZGUiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDUkVBVEVfSk9JTl9OT0RFID0gImNyZWF0ZV9qb2luX25vZGUiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDUkVBVEVfREVDSVNJT05fTk9ERSA9ICJjcmVhdGVfZGVjaXNpb25fbm9kZSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENSRUFURV9BQ1RJVklUWSA9ICJjcmVhdGVfYWN0aXZpdHkiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDUkVBVEVfUEhBU0UgPSAiY3JlYXRlX3BoYXNlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1JFQVRFX0lURVJBVElPTiA9ICJjcmVhdGVfaXRlcmF0aW9uIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1JFQVRFX1RBU0tfREVTQ1JJUFRPUiA9ICJjcmVhdGVfdGFza19kZXNjcmlwdG9yIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1JFQVRFX01JTEVTVE9ORSA9ICJjcmVhdGVfbWlsZXN0b25lIjsgLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENSRUFURV9GT1JLX05PREU9ImNyZWF0ZV9mb3JrX25vZGUiOyAvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1JFQVRFX01FUkdFX05PREU9ImNyZWF0ZV9tZXJnZV9ub2RlIjsgLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENSRUFURV9QQVJUSVRJT04gPSJjcmVhdGVfcGFydGl0aW9uIjsgLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9QRU5fQUNUSVZJVFlfREVUQUlMX0RJQUdSQU0gPSAib3Blbl9hY3Rpdml0eV9kZXRhaWxfZGlhZ3JhbSI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDUkVBVEVfV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfTk9ERT0iY3JlYXRlX3dvcmtfcHJvZHVjdF9kZXNjcmlwdG9yIjsgLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENSRUFURV9MSU5LID0gImNyZWF0ZV9kaWFncmFtX2xpbmsiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNT1ZFX0FDVElPTiA9ICJtb3ZlX2FjdGlvbl9pZCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEJlbG93IGRlZmF1bHRzIHZhcmlhYmxlcyBhcmUgdG8gZXhjbHVkZSBmcm9tIGRpYWdyYW0uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRklMTF9DT0xPUl9FREVGQVVMVCA9IDE2Nzc3MjE1OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExJTkVfQ09MT1JfRURFRkFVTFQgPSAxMTU3OTU2ODsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBDT05UUk9MX0ZMT1dfSU1BR0VfREVTQ1JJUFRPUiA9IERpYWdyYW1Db3JlUGx1Z2luLmdldERlZmF1bHQoKQotCQkJCQkJCQkJCS5nZXRJbWFnZURlc2NyaXB0b3IoImxpbmsuZ2lmIik7IC8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2NvcmUvdXRpbC9EaWFncmFtQ29yZVV0aWwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2NvcmUvdXRpbC9EaWFncmFtQ29yZVV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGY0Njg0NS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9jb3JlL3V0aWwvRGlhZ3JhbUNvcmVVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzODkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8qKgotICogCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS51dGlsOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuUG9zaXRpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LkRpbWVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuVHJhbnNsYXRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FTW9kZWxFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuYnJpZGdlLkFjdGl2aXR5RGlhZ3JhbUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5icmlkZ2UuQnJpZGdlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuZmlndXJlcy5XaWRlbmVkV3JhcExhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUucGFydC5EaWFncmFtRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5wYXJ0LklEaWFncmFtRWRpdG9ySW5wdXRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLkxpYnJhcnlVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBhcnRzLkFic3RyYWN0RWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuRGlhZ3JhbUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklHcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnByZWZlcmVuY2VzLklQcmVmZXJlbmNlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLkZpZ3VyZVV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLm1hcG1vZGUuSU1hcE1vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLm1hcG1vZGUuTWFwTW9kZVR5cGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkVkZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRm9udFN0eWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkpGYWNlUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuQWN0aXZpdHlOb2RlOwotCi1pbXBvcnQgY29tLmlibS5pY3UudGV4dC5CcmVha0l0ZXJhdG9yOwotCi0KLS8qKgotICogVXRpbGl0eSBjbGFzcyB0byBiZSB1c2VkIGZvciBFUEYgZGlhZ3JhbQotICogCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogCi0gKiBAc2luY2UgMS4yCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBEaWFncmFtQ29yZVV0aWwgewotCQotCi0JLyoqCi0JICogU2V0IGxhYmVsIHByb3BlcnRpZXMgZm9yIHRoZSBnaXZlbiBsYWJlbCBmaWd1cmUKLQkgKiBAcGFyYW0gZmlnXzAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0TGFiZWxQcm9wZXJ0aWVzKFdyYXBMYWJlbCBsYWJlbEZpZ3VyZSl7Ci0JCWxhYmVsRmlndXJlLnNldEZvbnQoRGlhZ3JhbUNvbnN0YW50cy5ERUZBVUxUX0ZPTlQpOwotCQlsYWJlbEZpZ3VyZS5zZXRJY29uQWxpZ25tZW50KFBvc2l0aW9uQ29uc3RhbnRzLlRPUCk7Ci0JCWxhYmVsRmlndXJlLnNldExhYmVsQWxpZ25tZW50KFBvc2l0aW9uQ29uc3RhbnRzLlRPUCk7Ci0JCWxhYmVsRmlndXJlLnNldFRleHRBbGlnbm1lbnQoUG9zaXRpb25Db25zdGFudHMuVE9QKTsKLQkJbGFiZWxGaWd1cmUuc2V0VGV4dFBsYWNlbWVudChQb3NpdGlvbkNvbnN0YW50cy5TT1VUSCk7Ci0JCWxhYmVsRmlndXJlLnNldFRleHRXcmFwKHRydWUpOwotCQlsYWJlbEZpZ3VyZS5zZXRUZXh0V3JhcEFsaWdubWVudChQb3NpdGlvbkNvbnN0YW50cy5DRU5URVIpOwotCQkKLQl9Ci0JCi0JLyoqCi0JICogU2V0IHRoZSBkZWZhdWx0IGZvbnQgZm9yIHRoaXMgcHJlZmVyZW5jZSBzdG9yZS4KLQkgKiBAcGFyYW0gc3RvcmUgSVByZWZlcmVuY2VTdG9yZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXREZWZhdWx0Rm9udFByZWZlcmVuY2UoSVByZWZlcmVuY2VTdG9yZSBzdG9yZSl7Ci0JCUZvbnREYXRhIGZvbnREYXRhQXJyYXlbXSA9Ci0gICAgICAgICAgICBKRmFjZVJlc291cmNlcy5nZXREZWZhdWx0Rm9udCgpLmdldEZvbnREYXRhKCk7Ci0gICAgICAgIEZvbnREYXRhIGZvbnREYXRhID0gZm9udERhdGFBcnJheVswXTsKLSAgICAgICAgZm9udERhdGEuc2V0SGVpZ2h0KERpYWdyYW1Db25zdGFudHMuREVGQVVMVF9GT05UX1NJWkUpOwotICAgICAgICBmb250RGF0YS5zZXROYW1lKERpYWdyYW1Db25zdGFudHMuREVGQVVMVF9GT05UX05BTUUpOwotICAgICAgICBQcmVmZXJlbmNlQ29udmVydGVyLnNldERlZmF1bHQoCi0gICAgICAgICAgICBzdG9yZSwKLSAgICAgICAgICAgIElQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfREVGQVVMVF9GT05ULAotICAgICAgICAgICAgZm9udERhdGEpOwkKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdmFsaWRTdHJpbmdGb3JCcmVha2Rvd25FbGVtZW50cyhFZGl0UGFydCBwYXJ0LCBTdHJpbmcgdHh0KXsKLQkJT2JqZWN0IG9iaiA9IHBhcnQuZ2V0TW9kZWwoKTsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIE5vZGUpIHsKLQkJCU5vZGUgbm9kZSA9IChOb2RlKSBvYmo7Ci0JCQlFT2JqZWN0IHVtbEUgPSBub2RlLmdldEVsZW1lbnQoKTsKLQkJCU9iamVjdCBlID0gQnJpZGdlSGVscGVyLmdldE1ldGhvZEVsZW1lbnQoKEVNb2RlbEVsZW1lbnQpdW1sRSk7Ci0JCQlFT2JqZWN0IHVtbEEgPSBub2RlLmdldERpYWdyYW0oKS5nZXRFbGVtZW50KCk7Ci0JCQlBY3Rpdml0eURpYWdyYW1BZGFwdGVyIGFkYXB0ZXIgPSAoQWN0aXZpdHlEaWFncmFtQWRhcHRlcilCcmlkZ2VIZWxwZXIuZ2V0Tm9kZUFkYXB0ZXIodW1sQSk7Ci0JCQlpZihhZGFwdGVyICE9IG51bGwpewotCQkJCWlmIChlIGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQkJcmV0dXJuIFRuZ1V0aWwuY2hlY2tXQlNBY3Rpdml0eVByZXNlbnRhdGlvbk5hbWUoZSwgdHh0LCBhZGFwdGVyLmdldFN1cHByZXNzaW9uKCkpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJcmV0dXJuIFRuZ1V0aWwKLQkJCQkJCS5jaGVja1dvcmtCcmVha2Rvd25FbGVtZW50UHJlc2VudGF0aW9uTmFtZShlLAotCQkJCQkJCQl0eHQsIGFkYXB0ZXIuZ2V0U3VwcHJlc3Npb24oKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKioKLQkgKiBHZXRzIGZvbnQgY29sb3IgZm9yIHRoZSBnaXZlbiBlZGl0IHBhcnQuIFRoZSBjb2xvciBpcyBkZXBlbmRpbmcgb24gdGhlIHN0YXRlIChzdXBwcmVzc2lvbiwgcmVhZC1vbmx5Li4uKQotCSAqIG9mIHRoZSBzZW1hbnRpYyBtb2RlbCBlbGVtZW50LgotCSAqIAotCSAqIEBwYXJhbSB2aWV3Ci0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ29sb3IgZ2V0Rm9udENvbG9yKEFic3RyYWN0RWRpdFBhcnQgZWRpdFBhcnQpIHsKLQkJT2JqZWN0IG9iamVjdCA9IG51bGw7Ci0JCQotCQkvLyBCeSBkZWZhdWx0IHB1Ymxpc2hpbmcgbW9kZSBpcyBmYWxzZS4gSWYgcHVibGlzaCBtb2RlIGlzIHNldCByZXR1cm4gYmxhY2sgY29sb3IuCi0JCWlmKExpYnJhcnlVdGlsLlBVQkxJU0hfTU9ERSl7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQkKLQkJRWRpdFBhcnRWaWV3ZXIgdmlld2VyID0gZWRpdFBhcnQuZ2V0Vmlld2VyKCk7Ci0JCWlmKHZpZXdlciBpbnN0YW5jZW9mIElEaWFncmFtRWRpdG9ySW5wdXRQcm92aWRlcikgewotCQkJRGlhZ3JhbUVkaXRvcklucHV0IGlucHV0ID0gKChJRGlhZ3JhbUVkaXRvcklucHV0UHJvdmlkZXIpdmlld2VyKS5nZXREaWFncmFtRWRpdG9ySW5wdXQoKTsKLQkJCS8vIHVzZSB0aGUgZm9sbG93aW5nIGNvbW1lbnRlZCBvdXQgY29kZSBvbmx5IGlmIHN1cHByZXNzZWQgZWxlbWVudHMgc2hvdWxkIGJlIHNob3duIGluIGdyYXkKLQkJCS8vCi0vLwkJCWlmKGlucHV0ICE9IG51bGwgJiYgaW5wdXQuZ2V0V3JhcHBlcigpICE9IG51bGwgJiYKLS8vCQkJCQlpbnB1dC5nZXRXcmFwcGVyKCkuaXNJbmhlcml0ZWQoKSkgewotLy8JCQkJT2JqZWN0IG1vZGVsID0gZWRpdFBhcnQuZ2V0TW9kZWwoKTsKLS8vCQkJCWlmKG1vZGVsIGluc3RhbmNlb2YgVmlldykgewotLy8JCQkJCUNvbGxlY3Rpb24gY2hpbGRyZW4gPSBudWxsOwotLy8JCQkJCURpYWdyYW0gZGlhZ3JhbSA9IGdldERpYWdyYW1FZGl0UGFydChlZGl0UGFydCkuZ2V0RGlhZ3JhbVZpZXcoKTsKLS8vCQkJCQlTdHJpbmcgdHlwZSA9IGRpYWdyYW0uZ2V0VHlwZSgpOwotLy8JCQkJCWlmKERpYWdyYW1NYW5hZ2VyLkFEX2tpbmQuZXF1YWxzKHR5cGUpKSB7Ci0vLwkJCQkJCURpYWdyYW1BZGFwdGVyIGRhID0gKChEaWFncmFtQWRhcHRlcilCcmlkZ2VIZWxwZXIuZ2V0Tm9kZUFkYXB0ZXIoZGlhZ3JhbS5nZXRFbGVtZW50KCkpKTsKLS8vCQkJCQkJaWYoZGEgIT0gbnVsbCkgewotLy8JCQkJCQkJQWN0aXZpdHlEaWFncmFtQWRhcHRlciBhZGFwdGVyID0gbmV3IEFjdGl2aXR5RGlhZ3JhbUFkYXB0ZXIoaW5wdXQuZ2V0V3JhcHBlcigpKTsKLS8vCQkJCQkJCWFkYXB0ZXIuc2V0RmlsdGVyKGRhLmdldEZpbHRlcigpKTsKLS8vCQkJCQkJCWFkYXB0ZXIuc2V0U3VwcHJlc3Npb24oZGEuZ2V0U3VwcHJlc3Npb24oKSk7Ci0vLwkJCQkJCQljaGlsZHJlbiA9IGFkYXB0ZXIuZ2V0Q2hpbGRyZW4oKTsKLS8vCQkJCQkJfQotLy8JCQkJCX0KLS8vCQkJCQllbHNlIGlmKERpYWdyYW1NYW5hZ2VyLkFERF9raW5kLmVxdWFscyh0eXBlKSB8fCBEaWFncmFtTWFuYWdlci5XUERfa2luZC5lcXVhbHModHlwZSkpIHsKLS8vCQkJCQkJRGlhZ3JhbUltcGwgZDsKLS8vCQkJCQkJaWYoRGlhZ3JhbU1hbmFnZXIuQUREX2tpbmQuZXF1YWxzKHR5cGUpKSB7Ci0vLwkJCQkJCQlkID0gKERpYWdyYW1JbXBsKSBNb2RlbEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUFjdGl2aXR5RGV0YWlsRGlhZ3JhbSgpOwotLy8JCQkJCQl9Ci0vLwkJCQkJCWVsc2UgewotLy8JCQkJCQkJZCA9IChEaWFncmFtSW1wbCkgTW9kZWxGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVXb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtKCk7Ci0vLwkJCQkJCX0JCQkJCQkKLS8vCQkJCQkJRGlhZ3JhbUltcGwgZGlhZ3JhbUluVXNlID0gKChEaWFncmFtSW1wbClkaWFncmFtLmdldEVsZW1lbnQoKSk7Ci0vLwkJCQkJCVN1cHByZXNzaW9uIHN1cHByZXNzaW9uID0gZGlhZ3JhbUluVXNlLmdldFN1cHByZXNzaW9uKCk7Ci0vLwkJCQkJCWlmKHN1cHByZXNzaW9uICE9IG51bGwpIHsKLS8vCQkJCQkJCWQuc2V0V3JhcHBlcihpbnB1dC5nZXRXcmFwcGVyKCkpOwotLy8JCQkJCQkJZC5zZXRGaWx0ZXIoZGlhZ3JhbUluVXNlLmdldEZpbHRlcigpKTsKLS8vCQkJCQkJCWQuc2V0U3VwcHJlc3Npb24oZGlhZ3JhbUluVXNlLmdldFN1cHByZXNzaW9uKCkpOwotLy8JCQkJCQkJY2hpbGRyZW4gPSBkLmdldENoaWxkcmVuKCk7Ci0vLwkJCQkJCX0KLS8vCQkJCQl9Ci0vLwkJCQkJaWYoY2hpbGRyZW4gIT0gbnVsbCkgewotLy8JCQkJCQlNZXRob2RFbGVtZW50IGUgPSBCcmlkZ2VIZWxwZXIuZ2V0TWV0aG9kRWxlbWVudCgoVmlldykgbW9kZWwpOwotLy8JCQkJCQlmaW5kX3dyYXBwZXI6Ci0vLwkJCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjaGlsZHJlbi5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLS8vCQkJCQkJCQlPYmplY3QgY2hpbGQgPSAoT2JqZWN0KSBpdGVyLm5leHQoKTsKLS8vCQkJCQkJCQlpZihUbmdVdGlsLnVud3JhcChjaGlsZCkgPT0gZSkgewotLy8JCQkJCQkJCQlvYmplY3QgPSBjaGlsZDsKLS8vCQkJCQkJCQkJYnJlYWsgZmluZF93cmFwcGVyOwotLy8JCQkJCQkJCX0KLS8vCQkJCQkJCX0KLS8vCQkJCQkJaWYob2JqZWN0ICE9IG51bGwpIHsKLS8vCQkJCQkJCW9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzcyBwcm9jID0gVG5nVXRpbC5nZXRPd25pbmdQcm9jZXNzKGlucHV0LmdldFdyYXBwZXIoKSk7Ci0vLwkJCQkJCQlpZihTdXBwcmVzc2lvbi5nZXRTdXBwcmVzc2lvbihwcm9jKS5pc1N1cHByZXNzZWQob2JqZWN0KSkgewotLy8JCQkJCQkJCXJldHVybiBEaWFncmFtQ29uc3RhbnRzLlNVUFBSRVNTRURfRk9OVF9DT0xPUjsKLS8vCQkJCQkJCX0KLS8vCQkJCQkJCWVsc2UgewotLy8JCQkJCQkJCXJldHVybiBEaWFncmFtQ29uc3RhbnRzLlJFQURfT05MWV9GT05UX0NPTE9SOwotLy8JCQkJCQkJfQotLy8JCQkJCQl9Ci0vLwkJCQkJfQotLy8JCQkJfQotLy8JCQl9Ci0JCQkKLQkJCWlmKGlucHV0ICE9IG51bGwgJiYgaW5wdXQuZ2V0V3JhcHBlcigpICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gRGlhZ3JhbUNvbnN0YW50cy5SRUFEX09OTFlfRk9OVF9DT0xPUjsKLQkJCX0KLQkJfQotCQkKLQkJT2JqZWN0IG1vZGVsID0gZWRpdFBhcnQuZ2V0TW9kZWwoKTsKLQkJaWYobW9kZWwgaW5zdGFuY2VvZiBWaWV3KSB7Ci0JCQlyZXR1cm4gRGlhZ3JhbUNvcmVVdGlsLmdldEZvbnRDb2xvcigoVmlldykgbW9kZWwpOwotCQl9Ci0JCi0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKioKLQkgKiBHZXRzIGZvbnQgY29sb3IgZm9yIHRoZSBnaXZlbiB2aWV3LiBUaGUgY29sb3IgaXMgZGVwZW5kaW5nIG9uIHRoZSBzdGF0ZSAoc3VwcHJlc3Npb24sIHJlYWQtb25seS4uLikKLQkgKiBvZiB0aGUgc2VtYW50aWMgbW9kZWwgZWxlbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gdmlldwotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBDb2xvciBnZXRGb250Q29sb3IoVmlldyB2aWV3KSB7Ci0vLwkJaWYgKEJyaWRnZUhlbHBlci5pc1N1cHByZXNzZWQodmlldykpIHsKLS8vCQkJcmV0dXJuIERpYWdyYW1Db25zdGFudHMuU1VQUFJFU1NFRF9GT05UX0NPTE9SOwotLy8JCX0KLQkJaWYgKEJyaWRnZUhlbHBlci5pc1JlYWRPbmx5KHZpZXcpKSB7Ci0JCQlyZXR1cm4gRGlhZ3JhbUNvbnN0YW50cy5SRUFEX09OTFlfRk9OVF9DT0xPUjsKLQkJfQotLy8JCWVsc2UgewotLy8JCQlyZXR1cm4gRGlhZ3JhbUNvbnN0YW50cy5ERUZBVUxUX0ZPTlRfQ09MT1I7Ci0vLwkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBEaWFncmFtRWRpdFBhcnQgZ2V0RGlhZ3JhbUVkaXRQYXJ0KEVkaXRQYXJ0IGVkaXRQYXJ0KSB7Ci0JCWZvcig7ZWRpdFBhcnQgIT0gbnVsbCAmJiAhKGVkaXRQYXJ0IGluc3RhbmNlb2YgRGlhZ3JhbUVkaXRQYXJ0KTsgZWRpdFBhcnQgPSBlZGl0UGFydC5nZXRQYXJlbnQoKSk7Ci0JCXJldHVybiAoRGlhZ3JhbUVkaXRQYXJ0KSBlZGl0UGFydDsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzUmVhZE9ubHkoQWJzdHJhY3RFZGl0UGFydCBlZGl0UGFydCl7Ci0JCU9iamVjdCBtb2RlbCA9IGVkaXRQYXJ0LmdldE1vZGVsKCk7Ci0JCWlmKG1vZGVsIGluc3RhbmNlb2YgVmlldykgewotCQkJcmV0dXJuIEJyaWRnZUhlbHBlci5pc1JlYWRPbmx5KChWaWV3KW1vZGVsKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1N5bmNCYXIoRWRpdFBhcnQgcGFydCl7Ci0JCWlmKHBhcnQgaW5zdGFuY2VvZiBJR3JhcGhpY2FsRWRpdFBhcnQpewotCQkJVmlldyBub2RlID0gKFZpZXcpcGFydC5nZXRNb2RlbCgpOwotCQkJT2JqZWN0IG9iaiA9IG5vZGUuZ2V0RWxlbWVudCgpOwotCQkJaWYob2JqIGluc3RhbmNlb2YgQWN0aXZpdHlOb2RlKXsKLQkJCQlyZXR1cm4gQnJpZGdlSGVscGVyLmlzU3luY2hCYXIoKEFjdGl2aXR5Tm9kZSlvYmopOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgd3JhcChTdHJpbmcgcywgaW50IHdyYXBXaWR0aCkgewotCQlTdHJpbmcgd3JhcHBlZCA9ICIiOyAvLyROT04tTkxTLTEkCi0JCUJyZWFrSXRlcmF0b3IgYmkgPSBCcmVha0l0ZXJhdG9yLmdldExpbmVJbnN0YW5jZSgpOwotCQlTdHJpbmcgcmVtYWluaW5nID0gczsKLQkJd2hpbGUgKHRydWUpIHsKLQkJCWlmIChyZW1haW5pbmcubGVuZ3RoKCkgPD0gd3JhcFdpZHRoKSB7Ci0JCQkJd3JhcHBlZCArPSByZW1haW5pbmc7Ci0JCQkJYnJlYWs7Ci0JCQl9IGVsc2UgewotCQkJCWJpLnNldFRleHQocmVtYWluaW5nKTsKLQkJCQlpbnQgcG9zID0gYmkuZm9sbG93aW5nKHdyYXBXaWR0aCk7Ci0JCQkJaWYgKHBvcyA9PSBCcmVha0l0ZXJhdG9yLkRPTkUpIHsKLQkJCQkJd3JhcHBlZCArPSByZW1haW5pbmc7Ci0JCQkJCWJyZWFrOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWlmIChwb3MgPj0gcmVtYWluaW5nLmxlbmd0aCgpKSB7Ci0JCQkJCQl3cmFwcGVkICs9IHJlbWFpbmluZzsKLQkJCQkJCWJyZWFrOwotCQkJCQl9IGVsc2UgewotCQkJCQkJd3JhcHBlZCArPSByZW1haW5pbmcuc3Vic3RyaW5nKDAsIHBvcykgKyAiXG4iOyAvLyROT04tTkxTLTEkCi0JCQkJCQlyZW1haW5pbmcgPSByZW1haW5pbmcuc3Vic3RyaW5nKHBvcyk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHdyYXBwZWQ7Ci0JfQotCQotCS8qKgotCSAqIFNldCB0aGUgZGVmYXVsdCBmb250IGZvciB0aGlzIHByZWZlcmVuY2Ugc3RvcmUuCi0JICogQHBhcmFtIHN0b3JlIElQcmVmZXJlbmNlU3RvcmUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0RGVmYXVsdExpbmVTdHlsZShJUHJlZmVyZW5jZVN0b3JlIHN0b3JlKXsKLSAgICAgICAgUHJlZmVyZW5jZUNvbnZlcnRlci5zZXREZWZhdWx0KAotICAgICAgICAgICAgc3RvcmUsCi0gICAgICAgICAgICBJUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX0xJTkVfQ09MT1IsCi0gICAgICAgICAgICBQcmVmZXJlbmNlQ29udmVydGVyLkNPTE9SX0RFRkFVTFRfREVGQVVMVCk7CQotCX0KLQkKLQkvKioKLQkgKiBIaWRlIGRlZmF1bHQgY29ubmVjdGlvbiBoYW5kbGVzIGluIEFELCBBREQsIFdQREQuCi0JICogCi0JICogQHBhcmFtIHN0b3JlCi0JICogICAgICAgICAgICBJUHJlZmVyZW5jZVN0b3JlCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGhpZGVDb25uZWN0aW9uSGFuZGxlcyhJUHJlZmVyZW5jZVN0b3JlIHN0b3JlKSB7Ci0JCXN0b3JlLnNldERlZmF1bHQoSVByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9TSE9XX0NPTk5FQ1RJT05fSEFORExFUywKLQkJCQlmYWxzZSk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0ZXh0IGhlaWdodCBiYXNlZCBvbiB0ZXh0LCBmb250IGFuZCB3aWR0aCBvZiBib3VuZHJpZXMgdGV4dCBpcyBpbgotCSAqIAotCSAqIEBwYXJhbSB0ZXh0Ci0JICogQHBhcmFtIGZvbnRTdHlsZQotCSAqIEBwYXJhbSB3aWR0aAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBnZXRUZXh0SGVpZ2h0KFN0cmluZyB0ZXh0LCBGb250U3R5bGUgZm9udFN0eWxlLCBpbnQgd2lkdGgpIHsKLQkJRm9udCBmb250ID0gbnVsbDsKLQkJU3RyaW5nIGZvbnROYW1lID0gbnVsbDsKLQkJaW50IGZvbnRIZWlnaHQgPSAwOwotCQkKLQkJaWYgKGZvbnRTdHlsZSAhPSBudWxsKSB7Ci0JCQlmb250TmFtZSA9IGZvbnRTdHlsZS5nZXRGb250TmFtZSgpOwotCQkJZm9udEhlaWdodCA9IGZvbnRTdHlsZS5nZXRGb250SGVpZ2h0KCk7Ci0JCQlpZiAoZm9udE5hbWUgPT0gbnVsbCkKLQkJCQlmb250TmFtZSA9IERpYWdyYW1Db25zdGFudHMuZ2V0Rm9udE5hbWUoKTsKLQkJCWlmIChmb250SGVpZ2h0ID09IDApCi0JCQkJZm9udEhlaWdodCA9IERpYWdyYW1Db25zdGFudHMuREVGQVVMVF9GT05UX1NJWkU7Ci0JCQkKLQkJCWZvbnQgPSBuZXcgRm9udChudWxsLCBmb250TmFtZSwgZm9udEhlaWdodCwgamF2YS5hd3QuRm9udC5QTEFJTik7Ci0JCX0KLQkJZWxzZSAKLQkJCWZvbnQgPSBEaWFncmFtQ29uc3RhbnRzLkRFRkFVTFRfRk9OVDsKLQotCQlEaW1lbnNpb24gZDsKLQkJdHJ5IHsKLQkJCWQgPSBGaWd1cmVVdGlsaXRpZXMuZ2V0VGV4dEV4dGVudHModGV4dCwgZm9udCk7Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQlpZihmb250ICE9IG51bGwgJiYgZm9udCAhPSBEaWFncmFtQ29uc3RhbnRzLkRFRkFVTFRfRk9OVCkgewotCQkJCWZvbnQuZGlzcG9zZSgpOwotCQkJfQotCQl9Ci0KLQkJaW50IG5vT2ZMaW5lcyA9IDA7Ci0JCWlmIChkICE9IG51bGwgJiYgZC53aWR0aCA+IDApIHsKLQkJCWludCBkaXYgPSBkLndpZHRoIC8gd2lkdGg7Ci0JCQlpbnQgbW9kID0gZC53aWR0aCAlIHdpZHRoOwotCQkJaWYgKG1vZCAhPSAwKQotCQkJCWRpdisrOwotCQkJbm9PZkxpbmVzID0gZGl2OwotCQkJcmV0dXJuIG5vT2ZMaW5lcyAqIGZvbnRIZWlnaHQ7Ci0JCX0KLQkJcmV0dXJuIDA7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBEaW1lbnNpb24gZ2V0VGV4dFNpemVJbldyYXBMYWJlbChTdHJpbmcgdGV4dCwgRm9udCBmLCBpbnQgd0hpbnQsIGludCBoSGludCwgSU1hcE1vZGUgbWFwTW9kZSkgewotCQljbGFzcyBNeVdyYXBMYWJlbCBleHRlbmRzIFdpZGVuZWRXcmFwTGFiZWwgaW1wbGVtZW50cyBJTWFwTW9kZSB7Ci0JCQlwcml2YXRlIElNYXBNb2RlIG1hcE1vZGU7Ci0KLQkJCXB1YmxpYyBNeVdyYXBMYWJlbChJTWFwTW9kZSBtYXBNb2RlKSB7Ci0JCQkJdGhpcy5tYXBNb2RlID0gbWFwTW9kZSAhPSBudWxsID8gbWFwTW9kZSA6IE1hcE1vZGVUeXBlcy5JREVOVElUWV9NTTsKLQkJCX0KLQotCQkJcHVibGljIGludCBEUHRvTFAoaW50IGRldmljZVVuaXQpIHsKLQkJCQlyZXR1cm4gbWFwTW9kZS5EUHRvTFAoZGV2aWNlVW5pdCk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBUcmFuc2xhdGFibGUgRFB0b0xQKFRyYW5zbGF0YWJsZSB0KSB7Ci0JCQkJcmV0dXJuIG1hcE1vZGUuRFB0b0xQKHQpOwotCQkJfQotCi0JCQlwdWJsaWMgaW50IExQdG9EUChpbnQgbG9naWNhbFVuaXQpIHsKLQkJCQlyZXR1cm4gbWFwTW9kZS5MUHRvRFAobG9naWNhbFVuaXQpOwotCQkJfQotCi0JCQlwdWJsaWMgVHJhbnNsYXRhYmxlIExQdG9EUChUcmFuc2xhdGFibGUgdCkgewotCQkJCXJldHVybiBtYXBNb2RlLkxQdG9EUCh0KTsKLQkJCX0KLQkJCQotCQl9OwotCQlNeVdyYXBMYWJlbCBsYWJlbCA9IG5ldyBNeVdyYXBMYWJlbChtYXBNb2RlKTsKLQkJRGlhZ3JhbUNvcmVVdGlsLnNldExhYmVsUHJvcGVydGllcyhsYWJlbCk7CQkKLQkJbGFiZWwuc2V0VGV4dCh0ZXh0KTsKLQkJaWYoZiAhPSBudWxsKSB7Ci0JCQlsYWJlbC5zZXRGb250KGYpOwotCQl9Ci0JCXJldHVybiBsYWJlbC5nZXRUZXh0U2l6ZSh3SGludCwgaEhpbnQpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIENvbG9yIGdldExpbmtPdmVycmlkZUNvbG9yKEVkZ2UgZWRnZSkgewotCQlyZXR1cm4gIUxpYnJhcnlVdGlsLlBVQkxJU0hfTU9ERSAmJiBEaWFncmFtQ29yZVZhbGlkYXRpb24uaXNSZWFkT25seShlZGdlKT8gCi0JCQkJRGlhZ3JhbUNvbnN0YW50cy5SRUFEX09OTFlfRk9OVF9DT0xPUiA6IG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vY29yZS91dGlsL0RpYWdyYW1Db3JlVmFsaWRhdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vY29yZS91dGlsL0RpYWdyYW1Db3JlVmFsaWRhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NjdhZThlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2NvcmUvdXRpbC9EaWFncmFtQ29yZVZhbGlkYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwNCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnV0aWw7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5pbnRlcm5hbC5sb2NhbHN0b3JlLklzU3luY2hyb25pemVkVmlzaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU1vZGVsRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5BZGFwdGVyRmFjdG9yeVRyZWVJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5EaWFncmFtQ29yZVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLmJyaWRnZS5CcmlkZ2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5icmlkZ2UuTm9kZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5zZXJ2aWNlcy5EaWFncmFtSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkFjdGl2aXR5RGV0YWlsRGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5BY3Rpdml0eURpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Sb2xlTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5UYXNrTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5UeXBlZE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuV29ya0JyZWFrZG93bkVsZW1lbnROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLnV0aWwuR3JhcGhpY2FsRGF0YUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5JQlNJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLklEaWFncmFtTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuUHJvY2Vzc1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuRGlhZ3JhbUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkRpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRWRnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuQWN0aXZpdHlFZGdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkFjdGl2aXR5Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5Db250cm9sTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5GaW5hbE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuRm9ya05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuSW5pdGlhbE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuSm9pbk5vZGU7Ci0KLS8qKgotICogVmFsaWRhdGluZyByb3V0aW5lcyBmb3IgZGlhZ3JhbSBlZGl0aW5nCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIERpYWdyYW1Db3JlVmFsaWRhdGlvbiB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgZXJyTXNnX0Nhbk5vdENvbm5lY3QgPSBEaWFncmFtQ29yZVJlc291cmNlcy5EaWFncmFtVmFsaWRhdGlvbl9lcnJfY2Fubm90X2Nvbm5lY3RfdGV4dDsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIGVyck1zZ19TYW1lUHJlZEFuZFN1Y2MgPSBEaWFncmFtQ29yZVJlc291cmNlcy5EaWFncmFtVmFsaWRhdGlvbl9lcnJfc2FtZXByZWRhbmRzdWNfdGV4dDsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIGVyck1zZ19DYW5Ob3REZWxldGUgPSBEaWFncmFtQ29yZVJlc291cmNlcy5EaWFncmFtVmFsaWRhdGlvbl9lcnJfY2Fubm90X2RlbGV0ZV90ZXh0OyAvLyROT04tTkxTLTEkCi0KLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBpc1RhcmdldFJlYWRvbmx5KEVkaXRQYXJ0IHBhcnQpewotCQlWaWV3IHZpZXcgPSAoVmlldylwYXJ0LmdldE1vZGVsKCk7Ci0JCWlmKEJyaWRnZUhlbHBlci5pc1JlYWRPbmx5KHZpZXcpKSByZXR1cm4gZXJyTXNnX0Nhbk5vdENvbm5lY3Q7Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjYW5Db25uZWN0KEVkaXRQYXJ0IHRhcmdldEVkaXRQYXJ0LCBFT2JqZWN0IHNvdXJjZUVsZW1lbnQsIEVPYmplY3QgdGFyZ2V0RWxlbWVudCl7Ci0JCQotCQlpZih0YXJnZXRFZGl0UGFydCA9PSBudWxsKSByZXR1cm4gZXJyTXNnX0Nhbk5vdENvbm5lY3Q7Ci0JCQotCQlFZGl0UGFydCBwYXJ0ID0gdGFyZ2V0RWRpdFBhcnQuZ2V0UGFyZW50KCk7Ci0JCURpYWdyYW0gZGlhZ3JhbSA9IG51bGw7Ci0JCXdoaWxlKHBhcnQgIT0gbnVsbCAmJiAhKHBhcnQgaW5zdGFuY2VvZiBEaWFncmFtRWRpdFBhcnQpKXsKLQkJCQlwYXJ0ICA9IHBhcnQuZ2V0UGFyZW50KCk7Ci0JCX0KLQkJaWYocGFydCBpbnN0YW5jZW9mIERpYWdyYW1FZGl0UGFydCl7Ci0JCQlkaWFncmFtID0gKERpYWdyYW0pKChEaWFncmFtRWRpdFBhcnQpcGFydCkuZ2V0TW9kZWwoKTsKLQkJfQotCi0JCWlmKGRpYWdyYW0gPT0gbnVsbCkgcmV0dXJuIGVyck1zZ19DYW5Ob3RDb25uZWN0OwotCQlyZXR1cm4gY2hlY2tDb25uZWN0KGRpYWdyYW0sICBzb3VyY2VFbGVtZW50LCB0YXJnZXRFbGVtZW50KTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2hlY2tDb25uZWN0KERpYWdyYW0gZGlhZ3JhbSwgRU9iamVjdCBzb3VyY2VFbGVtZW50LCBFT2JqZWN0IHRhcmdldEVsZW1lbnQpewotCQlzd2l0Y2goRGlhZ3JhbUhlbHBlci5nZXREaWFncmFtVHlwZShkaWFncmFtKSl7Ci0JCWNhc2UgSURpYWdyYW1NYW5hZ2VyLkFDVElWSVRZX0RJQUdSQU06Ci0JCQlpZihhbHdheXNBbGxvd2VkKHNvdXJjZUVsZW1lbnQsIHRhcmdldEVsZW1lbnQpKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCQkKLQkJCS8vIElmIHRhcmdldCBEaWFncmFtIGlzIHJlYWQtb25seSAtIGRvIG5vdCBjb25uZWN0Ci0JCQlpZihCcmlkZ2VIZWxwZXIuaXNSZWFkT25seShkaWFncmFtKSkgcmV0dXJuIGVyck1zZ19DYW5Ob3RDb25uZWN0OwotCQkJCQotCQkJTm9kZUFkYXB0ZXIgc291cmNlQWRhcHRlciA9IEJyaWRnZUhlbHBlci5nZXROb2RlQWRhcHRlcihzb3VyY2VFbGVtZW50KTsKLQkJCU5vZGVBZGFwdGVyIHRhcmdldEFkYXB0ZXIgPSBCcmlkZ2VIZWxwZXIuZ2V0Tm9kZUFkYXB0ZXIodGFyZ2V0RWxlbWVudCk7Ci0JCQkKLQkJCS8vIGlmIGFkYXB0ZXJzIG9mIHNvdXJjZSBhbmQgdGFyZ2V0IGlzIG51bGwgLSBubyBjb25uZWN0LgotCQkJaWYoc291cmNlQWRhcHRlciA9PSBudWxsIHx8IHRhcmdldEFkYXB0ZXIgPT0gbnVsbCkgcmV0dXJuIGVyck1zZ19DYW5Ob3RDb25uZWN0OwotCQkJCi0JCQlEaWFncmFtIHNvdXJjZURpYWdyYW0gPSBzb3VyY2VBZGFwdGVyLmdldFZpZXcoKS5nZXREaWFncmFtKCk7Ci0JCQkKLQkJCS8vIElmIHNvdXJjZSBhbmQgdGFyZ2V0IGRpYWdyYW1zIG5vdCBlcXVhbCAtIGRvIG5vdCBjb25uZWN0LgotCQkJaWYgKCFkaWFncmFtLmVxdWFscyhzb3VyY2VEaWFncmFtKSkKLQkJCQkJCQkJcmV0dXJuIGVyck1zZ19DYW5Ob3RDb25uZWN0OwotCi0JCQlBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSA9IFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCS5nZXRXQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpOwotCQkJT2JqZWN0IGFkYXB0ZXIgPSBhZGFwdGVyRmFjdG9yeS5hZGFwdChCcmlkZ2VIZWxwZXIuZ2V0TWV0aG9kRWxlbWVudChzb3VyY2VEaWFncmFtKQotCQkJCQksIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCQlPYmplY3QgcHJvYyA9IG51bGw7Ci0JCQlpZiAoYWRhcHRlciBpbnN0YW5jZW9mIElCU0l0ZW1Qcm92aWRlcikgewotCQkJCXByb2MgPSAoKElCU0l0ZW1Qcm92aWRlcikgYWRhcHRlcikuZ2V0VG9wSXRlbSgpOwotCQkJfQotCQkJLy8gZ2V0IGFsbCBicmVha2Rvd24gZWxlbWVudHMgaW4gdGhpcyBwcm9jZXNzCi0JCQkvLwotCQkJTGlzdDxPYmplY3Q+IGFsbEVsZW1lbnRzID0gbmV3IEFycmF5TGlzdDxPYmplY3Q+KCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBuZXcgQWRhcHRlckZhY3RvcnlUcmVlSXRlcmF0b3IoYWRhcHRlckZhY3RvcnksCi0JCQkJCXByb2MpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3Qgb2JqID0gaXRlci5uZXh0KCk7Ci0JCQkJYWxsRWxlbWVudHMuYWRkKFRuZ1V0aWwudW53cmFwKG9iaikpOwotCQkJfQotCQkJaWYocHJvYyAhPSBudWxsKXsKLQkJCQlFT2JqZWN0IHNvdXJjZSA9IHNvdXJjZUFkYXB0ZXIuZ2V0RWxlbWVudCgpOwotCi0JCQkJRU9iamVjdCB0YXJnZXQgPSBudWxsOwotCQkJCWlmICh0YXJnZXRBZGFwdGVyICE9IG51bGwpIHsKLQkJCQkJdGFyZ2V0ID0gdGFyZ2V0QWRhcHRlci5nZXRFbGVtZW50KCk7Ci0JCQkJfQotCQkJCWlmIChzb3VyY2UgaW5zdGFuY2VvZiAKLQkJCQkJCVdvcmtCcmVha2Rvd25FbGVtZW50KSB7Ci0JCQkJCWlmICh0YXJnZXQgaW5zdGFuY2VvZiBXb3JrQnJlYWtkb3duRWxlbWVudCkgewotCQkJCQkJaWYgKFByb2Nlc3NVdGlsLmNoZWNrQ2lyY3VsYXIoCi0JCQkJCQkJCShXb3JrQnJlYWtkb3duRWxlbWVudCkgdGFyZ2V0LAotCQkJCQkJCQkoV29ya0JyZWFrZG93bkVsZW1lbnQpIHNvdXJjZSwgYWxsRWxlbWVudHMpKQotCQkJCQkJCXJldHVybiBlcnJNc2dfU2FtZVByZWRBbmRTdWNjOwotCi0JCQkJCQlpZiAodGFyZ2V0QWRhcHRlci5pc1RhcmdldFJlYWRPbmx5KCkpCi0JCQkJCQkJcmV0dXJuIGVyck1zZ19DYW5Ob3RDb25uZWN0OwotCQkJCQl9IGVsc2UgewotCQkJCQkJQ29sbGVjdGlvbjxBY3Rpdml0eU5vZGU+IGFjdE5vZGVzID0gbmV3IEFycmF5TGlzdDxBY3Rpdml0eU5vZGU+KCk7Ci0JCQkJCQlCcmlkZ2VIZWxwZXIuZ2V0U3VjY2Vzc29yTm9kZXMoYWN0Tm9kZXMsCi0JCQkJCQkJCShBY3Rpdml0eU5vZGUpIHRhcmdldEVsZW1lbnQpOwotCQkJCQkJZm9yIChBY3Rpdml0eU5vZGUgbm9kZSA6IGFjdE5vZGVzKSB7Ci0JCQkJCQkJaWYgKEJyaWRnZUhlbHBlci5nZXROb2RlQWRhcHRlcihub2RlKS5pc1RhcmdldFJlYWRPbmx5KCkpCi0JCQkJCQkJCXJldHVybiBlcnJNc2dfQ2FuTm90Q29ubmVjdDsKLQkJCQkJCQlpZiAoUHJvY2Vzc1V0aWwuY2hlY2tDaXJjdWxhcigKLQkJCQkJCQkJCShXb3JrQnJlYWtkb3duRWxlbWVudCkgQnJpZGdlSGVscGVyCi0JCQkJCQkJCQkJCS5nZXRNZXRob2RFbGVtZW50KG5vZGUpLAotCQkJCQkJCQkJKFdvcmtCcmVha2Rvd25FbGVtZW50KSBzb3VyY2UsIGFsbEVsZW1lbnRzKSkgewotCQkJCQkJCQlyZXR1cm4gZXJyTXNnX1NhbWVQcmVkQW5kU3VjYzsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQlpZiAodGFyZ2V0IGluc3RhbmNlb2YgV29ya0JyZWFrZG93bkVsZW1lbnQpIHsKLQkJCQkJCUNvbGxlY3Rpb248QWN0aXZpdHlOb2RlPiBzcmNOb2RlcyA9IG5ldyBBcnJheUxpc3Q8QWN0aXZpdHlOb2RlPigpOwotCQkJCQkJQnJpZGdlSGVscGVyLmdldFByZWRlY2Vzc29yTm9kZXMoc3JjTm9kZXMsCi0JCQkJCQkJCShBY3Rpdml0eU5vZGUpIHNvdXJjZUVsZW1lbnQpOwotCQkJCQkJaWYgKCFzcmNOb2Rlcy5pc0VtcHR5KCkpIHsKLQkJCQkJCQlpZiAodGFyZ2V0QWRhcHRlci5pc1RhcmdldFJlYWRPbmx5KCkpCi0JCQkJCQkJCXJldHVybiBlcnJNc2dfQ2FuTm90Q29ubmVjdDsKLQkJCQkJCQlmb3IgKEFjdGl2aXR5Tm9kZSBwcmVkTm9kZSA6IHNyY05vZGVzKSB7Ci0JCQkJCQkJCU1ldGhvZEVsZW1lbnQgcHJlZCA9IEJyaWRnZUhlbHBlcgotCQkJCQkJCQkJCS5nZXRNZXRob2RFbGVtZW50KHByZWROb2RlKTsKLQkJCQkJCQkJaWYgKFByb2Nlc3NVdGlsLmNoZWNrQ2lyY3VsYXIoCi0JCQkJCQkJCQkJKFdvcmtCcmVha2Rvd25FbGVtZW50KSB0YXJnZXQsCi0JCQkJCQkJCQkJKFdvcmtCcmVha2Rvd25FbGVtZW50KSBwcmVkLAotCQkJCQkJCQkJCWFsbEVsZW1lbnRzKSkgewotCQkJCQkJCQkJcmV0dXJuIGVyck1zZ19TYW1lUHJlZEFuZFN1Y2M7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlpZiAoY2hlY2tTeW5jQmFyQ2lyY3VsYXJMb29vcCgoQWN0aXZpdHlOb2RlKXNvdXJjZUVsZW1lbnQsCi0JCQkJCQkJCShBY3Rpdml0eU5vZGUpIHRhcmdldEVsZW1lbnQpICE9IG51bGwpIHsKLQkJCQkJCQlyZXR1cm4gZXJyTXNnX0Nhbk5vdENvbm5lY3Q7Ci0JCQkJCQl9Ci0KLQkJCQkJCS8vIHNob3VsZCBub3QgYWxsb3cgaW5jb21pbmcgY29ubmVjdGlvbiB0byBzdGFydCBub2RlCi0JCQkJCQkvLyBhbmQgRnJlZVRleHQuCi0JCQkJCQlpZiAodGFyZ2V0RWxlbWVudCBpbnN0YW5jZW9mIEluaXRpYWxOb2RlKSB7Ci0JCQkJCQkJcmV0dXJuIGVyck1zZ19DYW5Ob3RDb25uZWN0OwotCQkJCQkJfQotCi0JCQkJCQlDb2xsZWN0aW9uPEFjdGl2aXR5Tm9kZT4gc3JjTm9kZXMgPSBuZXcgQXJyYXlMaXN0PEFjdGl2aXR5Tm9kZT4oKTsgCi0JCQkJCQlCcmlkZ2VIZWxwZXIuZ2V0UHJlZGVjZXNzb3JOb2RlcyhzcmNOb2RlcywgKEFjdGl2aXR5Tm9kZSkgc291cmNlRWxlbWVudCk7Ci0JCQkJCQlpZiAoIXNyY05vZGVzLmlzRW1wdHkoKSkgewotCQkJCQkJCUNvbGxlY3Rpb248QWN0aXZpdHlOb2RlPiB0YXJnZXROb2RlcyA9IG5ldyBBcnJheUxpc3Q8QWN0aXZpdHlOb2RlPigpOwotCQkJCQkJCUJyaWRnZUhlbHBlci5nZXRTdWNjZXNzb3JOb2Rlcyh0YXJnZXROb2RlcywKLQkJCQkJCQkJCShBY3Rpdml0eU5vZGUpIHRhcmdldCk7Ci0JCQkJCQkJZm9yIChBY3Rpdml0eU5vZGUgbm9kZSA6IHRhcmdldE5vZGVzKSB7Ci0JCQkJCQkJCU5vZGVBZGFwdGVyIG5vZGVBZGFwdGVyID0gQnJpZGdlSGVscGVyCi0JCQkJCQkJCQkJLmdldE5vZGVBZGFwdGVyKG5vZGUpOwotCQkJCQkJCQlpZiAobm9kZUFkYXB0ZXIuaXNUYXJnZXRSZWFkT25seSgpKQotCQkJCQkJCQkJcmV0dXJuIGVyck1zZ19DYW5Ob3RDb25uZWN0OwotCQkJCQkJCQlXb3JrQnJlYWtkb3duRWxlbWVudCBzdWNjID0gKFdvcmtCcmVha2Rvd25FbGVtZW50KSBub2RlQWRhcHRlcgotCQkJCQkJCQkJCS5nZXRFbGVtZW50KCk7Ci0JCQkJCQkJCWZvciAoQWN0aXZpdHlOb2RlIHByZWRub2RlIDogc3JjTm9kZXMpIHsKLQkJCQkJCQkJCU5vZGVBZGFwdGVyIHByZWRBZGFwdGVyID0gQnJpZGdlSGVscGVyCi0JCQkJCQkJCQkJCS5nZXROb2RlQWRhcHRlcihwcmVkbm9kZSk7Ci0JCQkJCQkJCQlXb3JrQnJlYWtkb3duRWxlbWVudCBwcmVkID0gKFdvcmtCcmVha2Rvd25FbGVtZW50KSBwcmVkQWRhcHRlcgotCQkJCQkJCQkJCQkuZ2V0RWxlbWVudCgpOwotCQkJCQkJCQkJaWYgKFByb2Nlc3NVdGlsLmNoZWNrQ2lyY3VsYXIoc3VjYywgcHJlZCwKLQkJCQkJCQkJCQkJYWxsRWxlbWVudHMpKSB7Ci0JCQkJCQkJCQkJcmV0dXJuIGVyck1zZ19TYW1lUHJlZEFuZFN1Y2M7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJCi0JCQl9Ci0JCX0KLQkJCQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoKLQkgKiBUbyBhdm9pZCBjaXJjdWxhciBsb29waW5nIGJldHdlZW4gc3luY2hyb25pemF0aW9uIGJhcnMuIElmIFN5Y25CYXIxIC0+Ci0JICogU3luY0JhcjIgKGNvbm5lY3RlZCkgdGhlbiBTeW5jQmFyMiAtPiBTeW5jQmFyMSBjYW5ub3QgY29ubmVjdC4gaWYKLQkgKiBzeW5jYmFyMSAtPiBzeW5jYmFyMi0+c3luY2JhcjMgdGhlbiBzeW5jYmFyMyAtPiBzeW5jYmFyMSBkaXNhbGxvd2VkLgotCSAqIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNoZWNrU3luY0JhckNpcmN1bGFyTG9vb3AoQWN0aXZpdHlOb2RlIHNOb2RlLAotCQkJQWN0aXZpdHlOb2RlIHROb2RlKSB7Ci0JCUxpc3QgbGlzdCA9IHROb2RlLmdldE91dGdvaW5ncygpOwotCQlpZiAoIWxpc3QuaXNFbXB0eSgpICYmIGxpc3Quc2l6ZSgpID4gMCkgewotCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGxpc3QuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJCUFjdGl2aXR5RWRnZSBsaW5rID0gKEFjdGl2aXR5RWRnZSkgaXRlcmF0b3IubmV4dCgpOwotCQkJCUFjdGl2aXR5Tm9kZSB0eXBlZG5vZGUgPSBsaW5rLmdldFRhcmdldCgpOwotCQkJCWlmIChzTm9kZS5lcXVhbHModHlwZWRub2RlKSkKLQkJCQkJcmV0dXJuIGVyck1zZ19DYW5Ob3RDb25uZWN0OwotCQkJCWlmICh0eXBlZG5vZGUgaW5zdGFuY2VvZiBDb250cm9sTm9kZSkgewotCQkJCQlyZXR1cm4gY2hlY2tTeW5jQmFyQ2lyY3VsYXJMb29vcChzTm9kZSwKLQkJCQkJCQkoQ29udHJvbE5vZGUpdHlwZWRub2RlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qCi0JICogTWV0aG9kIHRvIENoZWNrIGlmIFN5bmNCYXIgaW5Db21taW5nIGNvbm5lY3Rpb25zIGhhdmUgCi0JICogYW55IHNvdXJjZSBpcyBhIHJlYWRvbmx5LiAKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2hlY2tTeW5jQmFySW5jb21pbmdMaW5rcyhBY3Rpdml0eU5vZGUgdHlwZWROb2RlKXsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gdHlwZWROb2RlLmdldEluY29taW5ncygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJQWN0aXZpdHlFZGdlIGxpbmsgPSAoQWN0aXZpdHlFZGdlKSBpdGVyLm5leHQoKTsKLQkJCUFjdGl2aXR5Tm9kZSBzb3VyY2UgPSBsaW5rLmdldFNvdXJjZSgpOwotCQkJTm9kZUFkYXB0ZXIgYWRhcHRlciA9IEJyaWRnZUhlbHBlci5nZXROb2RlQWRhcHRlcihzb3VyY2UpOwotCQkJaWYgKGFkYXB0ZXIgIT0gbnVsbCkgewotCQkJCWlmKGFkYXB0ZXIuZ2V0RWxlbWVudCgpIGluc3RhbmNlb2YgV29ya0JyZWFrZG93bkVsZW1lbnQpewotCQkJCQlpZihhZGFwdGVyLmlzVGFyZ2V0UmVhZE9ubHkoKSkKLQkJCQkJCXJldHVybiBlcnJNc2dfQ2FuTm90RGVsZXRlOwotCQkJCX1lbHNlIGlmKHNvdXJjZSBpbnN0YW5jZW9mIENvbnRyb2xOb2RlKXsKLQkJCQkJaWYoc291cmNlIGluc3RhbmNlb2YgRm9ya05vZGUgfHwgc291cmNlIGluc3RhbmNlb2YgSm9pbk5vZGUpCi0JCQkJCQlpZihjaGVja1N5bmNCYXJJbmNvbWluZ0xpbmtzKHNvdXJjZSkhPSBudWxsKQotCQkJCQkJCXJldHVybiBlcnJNc2dfQ2FuTm90RGVsZXRlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JLyoKLQkgKk1ldGhvZCB0byBjaGVjayBpZiBzeW5jaHJvbml6YXRpb24gYmFyIG91dGdvaW5nIGNvbm5lY3Rpb24KLQkgKmhhcyBhbnkgdGFyZ2V0IGlzIHJlYWRvbmx5LiAgCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2hlY2tTeW5jQmFyT3V0Z29pbmdMaW5rcyhBY3Rpdml0eU5vZGUgdHlwZWROb2RlKXsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gdHlwZWROb2RlLmdldE91dGdvaW5ncygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJQWN0aXZpdHlFZGdlIGxpbmsgPSAoQWN0aXZpdHlFZGdlKSBpdGVyLm5leHQoKTsKLQkJCUFjdGl2aXR5Tm9kZSB0YXJnZXQgPSBsaW5rLmdldFRhcmdldCgpOwotCQkJTm9kZUFkYXB0ZXIgYWRhcHRlciA9IEJyaWRnZUhlbHBlci5nZXROb2RlQWRhcHRlcih0YXJnZXQpOwotCQkJaWYgKGFkYXB0ZXIgIT0gbnVsbCkgewotCQkJCWlmKGFkYXB0ZXIuZ2V0RWxlbWVudCgpIGluc3RhbmNlb2YgV29ya0JyZWFrZG93bkVsZW1lbnQpewotCQkJCQlpZihhZGFwdGVyLmlzVGFyZ2V0UmVhZE9ubHkoKSkKLQkJCQkJCXJldHVybiBlcnJNc2dfQ2FuTm90RGVsZXRlOwotCQkJCX1lbHNlIGlmKHRhcmdldCBpbnN0YW5jZW9mIENvbnRyb2xOb2RlKXsKLQkJCQkJaWYodGFyZ2V0IGluc3RhbmNlb2YgRm9ya05vZGUgfHwgdGFyZ2V0IGluc3RhbmNlb2YgSm9pbk5vZGUpCi0JCQkJCQlpZihjaGVja1N5bmNCYXJPdXRnb2luZ0xpbmtzKHRhcmdldCkhPSBudWxsKQotCQkJCQkJCXJldHVybiBlcnJNc2dfQ2FuTm90RGVsZXRlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2hlY2tEZWxldGUoTm9kZSBub2RlKSB7Ci0JCWlmIChCcmlkZ2VIZWxwZXIuaXNSZWFkT25seShub2RlKSkKLQkJCXJldHVybiBlcnJNc2dfQ2FuTm90RGVsZXRlOwotCQlEaWFncmFtIGRpYWdyYW0gPSBub2RlLmdldERpYWdyYW0oKTsKLQkJaWYgKGRpYWdyYW0gaW5zdGFuY2VvZiBBY3Rpdml0eURpYWdyYW0pIHsKLQkJCWlmIChub2RlLmdldEVsZW1lbnQoKSBpbnN0YW5jZW9mIENvbnRyb2xOb2RlKSB7Ci0JCQkJCi0JCQkJQ29sbGVjdGlvbjxBY3Rpdml0eU5vZGU+IHRhcmdldE5vZGVzID0gbmV3IEFycmF5TGlzdDxBY3Rpdml0eU5vZGU+KCk7IAotCQkJCUJyaWRnZUhlbHBlci5nZXRTdWNjZXNzb3JOb2Rlcyh0YXJnZXROb2RlcywgKEFjdGl2aXR5Tm9kZSlub2RlLmdldEVsZW1lbnQoKSk7Ci0JCQkJCQkKLQkJCQlmb3IgKEFjdGl2aXR5Tm9kZSB0YXJnZXROb2RlIDogdGFyZ2V0Tm9kZXMpIHsKLQkJCQkJTm9kZUFkYXB0ZXIgYWRhcHRlciA9IEJyaWRnZUhlbHBlci5nZXROb2RlQWRhcHRlcih0YXJnZXROb2RlKTsKLQkJCQkJaWYoYWRhcHRlciAhPSBudWxsICYmIGFkYXB0ZXIuaXNUYXJnZXRSZWFkT25seSgpKXsKLQkJCQkJCXJldHVybiBlcnJNc2dfQ2FuTm90RGVsZXRlOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9IGVsc2UgaWYgKGRpYWdyYW0gaW5zdGFuY2VvZiBBY3Rpdml0eURldGFpbERpYWdyYW0pIHsKLQkJCWlmIChub2RlLmdldEVsZW1lbnQoKSBpbnN0YW5jZW9mIFJvbGVOb2RlKSB7Ci0JCQkJcmV0dXJuIGVyck1zZ19DYW5Ob3REZWxldGU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNoZWNrUmVjb25uZWN0KE5vZGUgc291cmNlLCBOb2RlIHRhcmdldCwgRWRnZSBsaW5rKSB7Ci0JCWlmIChzb3VyY2UuZ2V0RGlhZ3JhbSgpIGluc3RhbmNlb2YgQWN0aXZpdHlEaWFncmFtKSB7Ci0JCQlpZiAobGluay5nZXRUYXJnZXQoKSAhPSBudWxsKSB7Ci0JCQkJaWYgKEJyaWRnZUhlbHBlci5pc1JlYWRPbmx5KGxpbmsuZ2V0VGFyZ2V0KCkpKSB7Ci0JCQkJCXJldHVybiBlcnJNc2dfQ2FuTm90Q29ubmVjdDsKLQkJCQl9IGVsc2UgewotCQkJCQlpZiAobGluay5nZXRUYXJnZXQoKSBpbnN0YW5jZW9mIFR5cGVkTm9kZSkgewotCQkJCQkJQ29sbGVjdGlvbiB0YXJnZXROb2RlcyA9IEdyYXBoaWNhbERhdGFIZWxwZXIKLQkJCQkJCQkJLmdldFRhcmdldE5vZGVzKChUeXBlZE5vZGUpIGxpbmsuZ2V0VGFyZ2V0KCksCi0JCQkJCQkJCQkJV29ya0JyZWFrZG93bkVsZW1lbnROb2RlLmNsYXNzKTsKLQkJCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHRhcmdldE5vZGVzLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCQlOb2RlIG5vZGUgPSAoTm9kZSkgaXRlci5uZXh0KCk7Ci0JCQkJCQkJaWYgKEJyaWRnZUhlbHBlci5pc1JlYWRPbmx5KG5vZGUpKSB7Ci0JCQkJCQkJCXJldHVybiBlcnJNc2dfQ2FuTm90Q29ubmVjdDsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gY2hlY2tDb25uZWN0KHNvdXJjZSwgdGFyZ2V0LCBsaW5rKTsKLQl9Ci0JCi0JLyoKLQkgKiBNZXRob2Qgd2lsbCBub3QgYWxsb3cgbXVsdGlwbGUgbGluayBiZXR3ZWVuIHR3byBub2Rlcy4gTmVlZHMgdG8gY2FsbAotCSAqIENyZWFrTGlua0NvbW1hbmQgYW5kIFJlY29ubmVjdExpbmtDb21tYW5kLiBBbnkgYWN0aW9uIG9uIGEgTGluayBzaG91bGQKLQkgKiBjYWxsIHRoaXMgY2hlY2tDb25uZWN0KE5vZGUgc291cmNlLCBOb2RlIHRhcmdldCwgTGluayBsaW5rKSBiZWZvcmUgYWxsb3cKLQkgKiB0byBjb25uZWN0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNoZWNrQ29ubmVjdChOb2RlIHNvdXJjZSwgTm9kZSB0YXJnZXQsIEVkZ2UgbGluaykgewotCi0JCWlmIChzb3VyY2UgPT0gdGFyZ2V0ICYmICEoQnJpZGdlSGVscGVyLmdldE1ldGhvZEVsZW1lbnQoc291cmNlKSBpbnN0YW5jZW9mIEFjdGl2aXR5KSkgewotCQkJcmV0dXJuIGVyck1zZ19DYW5Ob3RDb25uZWN0OwotCQl9Ci0KLQkJTGlzdCBsaW5rcyA9IHNvdXJjZS5nZXRUYXJnZXRFZGdlcygpOwotCQlpZiAobGlua3MgIT0gbnVsbCkgewotCQkJLy8gVGhpcyBpcyBuZWVkIGZvciByZWNvbm5lY3QgdG8gc2FtZSB0YXJnZXQgbm9kZS4KLQkJCWlmIChsaW5rcy5jb250YWlucyhsaW5rKSkgewotCQkJCWlmIChsaW5rLmdldFRhcmdldCgpLmVxdWFscyh0YXJnZXQpKSB7Ci0JCQkJCXJldHVybiBudWxsOwotCQkJCX0KLQkJCX0KLQkJLy8gVGhpcyBpcyBuZWVkIGZvciBuZXcgY29ubmVjdCBhbmQgcmVjb25uZWN0IHRvIGRpZmZlcmVudCB0YXJnZXQgbm9kZS4KLQkJZm9yIChJdGVyYXRvciBpdGVyID0gbGlua3MuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlMaW5rIGxpbmt4ID0gKExpbmspIGl0ZXIubmV4dCgpOwotCQkJT2JqZWN0IGxpbmt4dGFyZ2V0ID0gbGlua3guZ2V0VGFyZ2V0KCk7Ci0JCQlpZiAobGlua3h0YXJnZXQgIT0gbnVsbCAmJiBsaW5reHRhcmdldC5lcXVhbHModGFyZ2V0KSkgewotCQkJCXJldHVybiBlcnJNc2dfQ2FuTm90Q29ubmVjdDsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGNoZWNrQ29ubmVjdChzb3VyY2UuZ2V0RGlhZ3JhbSgpLCBzb3VyY2UuZ2V0RWxlbWVudCgpLCB0YXJnZXQuZ2V0RWxlbWVudCgpKTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBhbHdheXNBbGxvd2VkKE9iamVjdCBzb3VyY2VFbGVtZW50LCBPYmplY3QgdGFyZ2V0RWxlbWVudCkgewotCQlyZXR1cm4gc291cmNlRWxlbWVudCBpbnN0YW5jZW9mIEluaXRpYWxOb2RlIAotCQl8fCB0YXJnZXRFbGVtZW50IGluc3RhbmNlb2YgRmluYWxOb2RlCi0JCXx8IChzb3VyY2VFbGVtZW50IGluc3RhbmNlb2YgQ29udHJvbE5vZGUgJiYgIUJyaWRnZUhlbHBlci5pc1N5bmNoQmFyKChDb250cm9sTm9kZSlzb3VyY2VFbGVtZW50KSkKLQkJfHwgKHRhcmdldEVsZW1lbnQgaW5zdGFuY2VvZiBDb250cm9sTm9kZSAmJiAhQnJpZGdlSGVscGVyLmlzU3luY2hCYXIoKENvbnRyb2xOb2RlKXRhcmdldEVsZW1lbnQpKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2hlY2tEZWxldGUoRWRnZSBlZGdlKSB7Ci0KLQkJVmlldyBzb3VyY2UgPSBlZGdlLmdldFNvdXJjZSgpOwotCQlWaWV3IHRhcmdldCA9IGVkZ2UuZ2V0VGFyZ2V0KCk7Ci0KLQkJaWYodGFyZ2V0ICE9IG51bGwpewotCQkJRGlhZ3JhbSBkaWFncmFtID0gdGFyZ2V0LmdldERpYWdyYW0oKTsKLQkJCXN3aXRjaChEaWFncmFtSGVscGVyLmdldERpYWdyYW1UeXBlKGRpYWdyYW0pKXsKLQkJCWNhc2UgSURpYWdyYW1NYW5hZ2VyLkFDVElWSVRZX0RJQUdSQU06CQkJCQotCQkJCUVPYmplY3Qgc291cmNlRWxlbWVudCA9IHNvdXJjZS5nZXRFbGVtZW50KCk7Ci0JCQkJRU9iamVjdCB0YXJnZXRFbGVtZW50ID0gdGFyZ2V0LmdldEVsZW1lbnQoKTsKLQkJCQlpZihhbHdheXNBbGxvd2VkKHNvdXJjZUVsZW1lbnQsIHRhcmdldEVsZW1lbnQpKSB7Ci0JCQkJCXJldHVybiBudWxsOwotCQkJCX0KLQkJCQkvLyBjaGVjayBpZiB0aGlzIGVkZ2UgaXMgcmVwcmVzZW50aW5nIGFueSB3b3JrIG9yZGVyCi0JCQkJLy8KLQkJCQlpZiAoc291cmNlRWxlbWVudCBpbnN0YW5jZW9mIEFjdGl2aXR5Tm9kZQotCQkJCQkJJiYgQnJpZGdlSGVscGVyLmdldE1ldGhvZEVsZW1lbnQoc291cmNlRWxlbWVudCkgPT0gbnVsbCkgewotCQkJCQlDb2xsZWN0aW9uPEFjdGl2aXR5Tm9kZT4gYWN0Tm9kZXMgPSBuZXcgQXJyYXlMaXN0PEFjdGl2aXR5Tm9kZT4oKTsKLQkJCQkJQnJpZGdlSGVscGVyLmdldFNvdXJjZU5vZGVzKGFjdE5vZGVzLAotCQkJCQkJCShBY3Rpdml0eU5vZGUpIHNvdXJjZUVsZW1lbnQsCi0JCQkJCQkJV29ya0JyZWFrZG93bkVsZW1lbnQuY2xhc3MpOwotCQkJCQlpZiAoYWN0Tm9kZXMuaXNFbXB0eSgpKSB7Ci0JCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQkJfQotCQkJCX0KLQkJCQkKLQkJCQkvLyB0aGUgZWRnZSBkb2VzIHJlcHJlc2VudCBhIHdvcmsgb3JkZXIKLQkJCQkKLQkJCQlpZihCcmlkZ2VIZWxwZXIuaXNSZWFkT25seSh0YXJnZXQpKXsKLQkJCQkJcmV0dXJuIGVyck1zZ19DYW5Ob3REZWxldGU7Ci0JCQkJfQotCQkJCQotCQkJCWlmKHRhcmdldEVsZW1lbnQgaW5zdGFuY2VvZiBBY3Rpdml0eU5vZGUpewotCQkJCQkvLyB0YXJnZXQgZG9lcyBub3QgcmVwcmVzZW50IGEgd29yayBicmVha2Rvd24gZWxlbWVudAotCQkJCQkvLyBkaXNhbGxvdyBkZWxldGlvbiBvZiB0aGUgZWRnZSBpZiBvbmUgb2YgdGhlIHRhcmdldCBub2RlcyBvZiB0aGUgdGFyZ2V0IGlzIHJlYWQtb25seSBvciBpbmhlcml0ZWQKLQkJCQkJLy8KLQkJCQkJQ29sbGVjdGlvbjxBY3Rpdml0eU5vZGU+IGFjdE5vZGVzID0gbmV3IEFycmF5TGlzdDxBY3Rpdml0eU5vZGU+KCk7Ci0JCQkJCUJyaWRnZUhlbHBlci5nZXRTdWNjZXNzb3JOb2RlcyhhY3ROb2RlcywgKEFjdGl2aXR5Tm9kZSkgdGFyZ2V0RWxlbWVudCk7Ci0JCQkJCWZvciAoQWN0aXZpdHlOb2RlIGFjdGl2aXR5Tm9kZSA6IGFjdE5vZGVzKSB7Ci0JCQkJCQlWaWV3IHZpZXcgPSBCcmlkZ2VIZWxwZXIuZ2V0VmlldyhkaWFncmFtLCBhY3Rpdml0eU5vZGUpOwotCQkJCQkJaWYodmlldyAhPSBudWxsICYmIEJyaWRnZUhlbHBlci5pc1JlYWRPbmx5KHZpZXcpKSB7Ci0JCQkJCQkJcmV0dXJuIGVyck1zZ19DYW5Ob3REZWxldGU7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJCi0JCQkJaWYodGFyZ2V0RWxlbWVudCBpbnN0YW5jZW9mIEFjdGl2aXR5Tm9kZSAmJiBCcmlkZ2VIZWxwZXIuaXNTeW5jaEJhcigoQWN0aXZpdHlOb2RlKXRhcmdldEVsZW1lbnQpKXsKLQkJCQkJcmV0dXJuIGNoZWNrU3luY0Jhck91dGdvaW5nTGlua3MoKEFjdGl2aXR5Tm9kZSl0YXJnZXRFbGVtZW50KTsKLQkJCQl9Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQljYXNlIElEaWFncmFtTWFuYWdlci5BQ1RJVklUWV9ERVRBSUxfRElBR1JBTToKLQkJCQlyZXR1cm4gZXJyTXNnX0Nhbk5vdERlbGV0ZTsKLQkJCQkKLQkJCWNhc2UgSURpYWdyYW1NYW5hZ2VyLldPUktfUFJPRFVDVF9ERVBFTkRFTkNZX0RJQUdSQU06Ci0JCQkJaWYoQnJpZGdlSGVscGVyLmlzUmVhZE9ubHkodGFyZ2V0KSkKLQkJCQkJcmV0dXJuIGVyck1zZ19DYW5Ob3REZWxldGU7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qKgotCSAqIENoZWNrIHRvIHNlZSBsaW5rIGlzIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1JlYWRPbmx5KEVkZ2UgZWRnZSkgewotCQkKLQkJVmlldyB0YXJnZXQgPSBlZGdlLmdldFRhcmdldCgpOwotCQlWaWV3IHNvdXJjZSA9IGVkZ2UuZ2V0U291cmNlKCk7Ci0JCWlmICh0YXJnZXQgIT0gbnVsbAotCQkJCSYmIHRhcmdldC5nZXREaWFncmFtKCkuZ2V0RWxlbWVudCgpIGluc3RhbmNlb2YgQWN0aXZpdHlEZXRhaWxEaWFncmFtKSB7Ci0JCQlpZihzb3VyY2UgIT0gbnVsbCl7Ci0JCQkJT2JqZWN0IHNvdXJjZUVsZW1lbnQgPSBzb3VyY2UuZ2V0RWxlbWVudCgpOwotCQkJCWlmKHNvdXJjZUVsZW1lbnQgIT0gbnVsbCAmJiBzb3VyY2VFbGVtZW50IGluc3RhbmNlb2YgVGFza05vZGUKLQkJCQkJCSYmICgoVGFza05vZGUpc291cmNlRWxlbWVudCkuaXNSZWFkT25seSgpKXsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQotCQkJaWYodGFyZ2V0ICE9IG51bGwpewotCQkJCU9iamVjdCB0YXJnZXRFbGVtZW50ID0gdGFyZ2V0LmdldEVsZW1lbnQoKTsKLQkJCQlpZih0YXJnZXRFbGVtZW50ICE9IG51bGwgJiYgdGFyZ2V0RWxlbWVudCBpbnN0YW5jZW9mIFRhc2tOb2RlCi0JCQkJCQkmJiAoKFRhc2tOb2RlKXRhcmdldEVsZW1lbnQpLmlzUmVhZE9ubHkoKSl7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfWVsc2V7Ci0JCQlyZXR1cm4gY2hlY2tEZWxldGUoZWRnZSkgIT0gbnVsbDsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCS8qKgotCSAqIENoZWNrIGlmIGFueSBkdXBsaWNhdGUgbGlua3MgYmV0d2VlbiB0d28gZW5kcyBhbHJlYWR5IGV4aXN0cy4KLQkgKiAJIAotCSAqICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzRHVwbGljYXRlUmVsYXRpb25zaGlwKEVPYmplY3Qgc291cmNlLCBFT2JqZWN0IHRhcmdldCkgewotCQlFT2JqZWN0IGNvbnRhaW5lciA9IHNvdXJjZS5lQ29udGFpbmVyKCk7Ci0JCWlmIChjb250YWluZXIgaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eSkgewotCQkJb3JnLmVjbGlwc2UudW1sMi51bWwuQWN0aXZpdHkgYWN0aXZpdHkgPSAob3JnLmVjbGlwc2UudW1sMi51bWwuQWN0aXZpdHkpIGNvbnRhaW5lcjsKLQkJCUxpc3Q8QWN0aXZpdHlFZGdlPiBsaXN0ID0gYWN0aXZpdHkuZ2V0RWRnZXMoKTsKLQkJCWZvciAoSXRlcmF0b3I8QWN0aXZpdHlFZGdlPiBpdGVyID0gbGlzdC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlBY3Rpdml0eUVkZ2UgZWxlbWVudCA9IChBY3Rpdml0eUVkZ2UpIGl0ZXIubmV4dCgpOwotCQkJCWlmICgoZWxlbWVudC5nZXRTb3VyY2UoKSA9PSBzb3VyY2UpCi0JCQkJCQkmJiBlbGVtZW50LmdldFRhcmdldCgpID09IHRhcmdldCkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2NvcmUvdXRpbC9WYWxpZGF0aW5nVGV4dERpcmVjdEVkaXRNYW5hZ2VyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9jb3JlL3V0aWwvVmFsaWRhdGluZ1RleHREaXJlY3RFZGl0TWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4Y2NhYzg0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2NvcmUvdXRpbC9WYWxpZGF0aW5nVGV4dERpcmVjdEVkaXRNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8qKgotICogCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVNb2RlbEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS51dGlsLk1zZ0RpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLkRpYWdyYW1Db3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuRGlhZ3JhbUNvcmVSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5icmlkZ2UuQnJpZGdlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5hbWVkTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Xb3JrQnJlYWtkb3duRWxlbWVudE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlByb2Nlc3NVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5HcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYudG9vbHMuQ2VsbEVkaXRvckxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS50b29scy5UZXh0RGlyZWN0RWRpdE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkFjdGl2aXR5Tm9kZTsKLQotLyoqCi0gKiBNYW5hZ2VzIGFuZCB2YWxpZGF0ZXMgdGhlIGRpcmVjdCBlZGl0aW5nIG9mIGVkaXRwYXJ0LiBQcm9tcHRzIGFjY29yZGluZ2x5LiAgCi0gKiBTaG91bGQgaW1wbGVtZW50IGFic3RyYWN0IG1ldGhvZHMgd2hlbiBleHRlbmRzLgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgVmFsaWRhdGluZ1RleHREaXJlY3RFZGl0TWFuYWdlciBleHRlbmRzIFRleHREaXJlY3RFZGl0TWFuYWdlciB7Ci0KLQlwdWJsaWMgVmFsaWRhdGluZ1RleHREaXJlY3RFZGl0TWFuYWdlcihHcmFwaGljYWxFZGl0UGFydCBzb3VyY2UsIENsYXNzIGVkaXRvclR5cGUsIENlbGxFZGl0b3JMb2NhdG9yIGxvY2F0b3IpIHsKLQkJc3VwZXIoc291cmNlLCBlZGl0b3JUeXBlLCBsb2NhdG9yKTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5nZWYudG9vbHMuRGlyZWN0RWRpdE1hbmFnZXIjY29tbWl0KCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb21taXQoKSB7Ci0JCVN0cmluZyBtc2cgPSB2YWxpZGF0ZSgoU3RyaW5nKSBnZXRDZWxsRWRpdG9yKCkuZ2V0VmFsdWUoKSk7Ci0JCWlmIChtc2cgIT0gbnVsbCkgewotCQkJYnJpbmdEb3duKGZhbHNlKTsKLQkJCURpc3BsYXkuZ2V0Q3VycmVudCgpLmFzeW5jRXhlYygKLQkJCQkJbmV3IFByb21wdEVkaXQodGhpcywgbXNnKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuY29tbWl0KCk7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZ2VmLnRvb2xzLkRpcmVjdEVkaXRNYW5hZ2VyI2JyaW5nRG93bigpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYnJpbmdEb3duKCkgewotCQlicmluZ0Rvd24odHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5nZWYudG9vbHMuRGlyZWN0RWRpdE1hbmFnZXIjYnJpbmdEb3duKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBicmluZ0Rvd24oYm9vbGVhbiBjaGVjaykgewotCQlzdXBlci5icmluZ0Rvd24oKTsKLQkJaWYgKGNoZWNrKSB7Ci0JCQlOb2RlIG5vZGUgPSAoTm9kZSkgZ2V0RWRpdFBhcnQoKS5nZXRNb2RlbCgpOwotCQkJRU9iamVjdCBhTm9kZSA9IG5vZGUuZ2V0RWxlbWVudCgpOwotCQkJU3RyaW5nIG5hbWUgPSBudWxsOwotCQkJaWYgKGFOb2RlIGluc3RhbmNlb2YgQWN0aXZpdHlOb2RlKSB7Ci0JCQkJbmFtZSA9ICgoQWN0aXZpdHlOb2RlKWFOb2RlKS5nZXROYW1lKCk7Ci0JCQkJT2JqZWN0IHdiZWxlbWVudCA9IEJyaWRnZUhlbHBlci5nZXRNZXRob2RFbGVtZW50KChFTW9kZWxFbGVtZW50KWFOb2RlKTsKLQkJCQlpZiAod2JlbGVtZW50IGluc3RhbmNlb2YgQWN0aXZpdHkKLQkJCQkJCSYmIFByb2Nlc3NVdGlsCi0JCQkJCQkJCS5pc0V4dGVuZGluZ09yTG9jYWxseUNvbnRyaWJ1dGluZygoQnJlYWtkb3duRWxlbWVudCkgd2JlbGVtZW50KSkgewotCQkJCQluYW1lID0gUHJvY2Vzc1V0aWwKLQkJCQkJCQkuZ2V0UHJlc2VudGF0aW9uTmFtZSgoQnJlYWtkb3duRWxlbWVudCkgd2JlbGVtZW50KTsKLQkJCQl9Ci0KLQkJCX1lbHNlIGlmKGFOb2RlIGluc3RhbmNlb2YgTmFtZWROb2RlKXsKLQkJCQlOYW1lZE5vZGUgbmFtZU5vZGUgPSAoTmFtZWROb2RlKSBhTm9kZTsKLQkJCQluYW1lID0gbmFtZU5vZGUuZ2V0TmFtZSgpOwotCQkJCWlmIChub2RlIGluc3RhbmNlb2YgV29ya0JyZWFrZG93bkVsZW1lbnROb2RlKSB7Ci0JCQkJCU9iamVjdCB3YmVsZW1lbnQgPSBuYW1lTm9kZS5nZXRPYmplY3QoKTsKLQkJCQkJaWYgKHdiZWxlbWVudCBpbnN0YW5jZW9mIEFjdGl2aXR5Ci0JCQkJCQkJJiYgUHJvY2Vzc1V0aWwKLQkJCQkJCQkJCS5pc0V4dGVuZGluZ09yTG9jYWxseUNvbnRyaWJ1dGluZygoQnJlYWtkb3duRWxlbWVudCkgd2JlbGVtZW50KSkgewotCQkJCQkJbmFtZSA9IFByb2Nlc3NVdGlsCi0JCQkJCQkJCS5nZXRQcmVzZW50YXRpb25OYW1lKChCcmVha2Rvd25FbGVtZW50KSB3YmVsZW1lbnQpOwotCQkJCQl9Ci0KLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCWlmIChuYW1lID09IG51bGwgfHwgbmFtZS50cmltKCkubGVuZ3RoKCkgPT0gMCkgewotCQkJCURpc3BsYXkuZ2V0Q3VycmVudCgpLmFzeW5jRXhlYygKLQkJCQkJCW5ldyBQcm9tcHRFZGl0KHRoaXMsRGlhZ3JhbUNvcmVSZXNvdXJjZXMuZXJyX25hbWVfZW1wdHkpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JfQotCi0KLQlzdGF0aWMgY2xhc3MgUHJvbXB0RWRpdCBpbXBsZW1lbnRzIFJ1bm5hYmxlIHsKLQotCQlwcml2YXRlIFZhbGlkYXRpbmdUZXh0RGlyZWN0RWRpdE1hbmFnZXIgbWFuYWdlcjsKLQotCQlwcml2YXRlIFN0cmluZyBtc2c7Ci0KLQkJUHJvbXB0RWRpdChWYWxpZGF0aW5nVGV4dERpcmVjdEVkaXRNYW5hZ2VyIG1hbmFnZXIsIFN0cmluZyBtc2cpIHsKLQkJCXRoaXMubWFuYWdlciA9IG1hbmFnZXI7Ci0JCQl0aGlzLm1zZyA9IG1zZzsKLQkJfQotCi0JCS8qKgotCQkgKiBAc2VlIGphdmEubGFuZy5SdW5uYWJsZSNydW4oKQotCQkgKi8KLQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJU3RyaW5nIHRpdGxlID0gRGlhZ3JhbUNvcmVSZXNvdXJjZXMuZGlhZ3JhbV9lcnJvckRpYWxvZ190aXRsZTsKLQkJCU1zZ0RpYWxvZyBkaWFsb2cgPSBEaWFncmFtQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCk7Ci0JCQlkaWFsb2cuZGlzcGxheUVycm9yKHRpdGxlLCBtc2cpOyAvLyROT04tTkxTLTEkCi0JCQltYW5hZ2VyLnBlcmZvcm1EaXJlY3RFZGl0KCk7Ci0JCX0KLQotCX0KLQkKLQkvKioKLQkgKiBDaGVja3MgaWYgdGhlIGdpdmVuIHRleHQgaXMgdmFsaWQuIFN1YmNsYXNzZXMgY2FuIG92ZXJyaWRlIHRoaXMgbWV0aG9kLgotCSAqIAotCSAqIEBwYXJhbSB0eHQKLQkgKiBAcmV0dXJuIG51bGwgaWYgdGhlIGdpdmVuIHRleHQgaXMgdmFsaWQsIGFuIGVycm9yIG1lc3NhZ2Ugb3RoZXJ3aXNlCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyB2YWxpZGF0ZShTdHJpbmcgdHh0KTsKLQkKLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdCgpOwotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uZWRpdC8uY2xhc3NwYXRoIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uZWRpdC8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTFjOGYyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmVkaXQvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmVkaXQvLnByb2plY3QgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5lZGl0Ly5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZTA5ZmRhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmVkaXQvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5lZGl0PC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmVkaXQvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5lZGl0L01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjUzMTM2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmVkaXQvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uZWRpdDsgc2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS41LjAucXVhbGlmaWVyCi1CdW5kbGUtQ2xhc3NQYXRoOiAuCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5wcm92aWRlci5EaWFncmFtRWRpdFBsdWdpbiRJbXBsZW1lbnRhdGlvbgotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwucHJvdmlkZXIKLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUsCi0gb3JnLmVjbGlwc2UuZW1mLmVkaXQ7dmlzaWJpbGl0eTo9cmVleHBvcnQsCi0gb3JnLmVjbGlwc2UuZXBmLnVtYTt2aXNpYmlsaXR5Oj1yZWV4cG9ydCwKLSBvcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQ7dmlzaWJpbGl0eTo9cmVleHBvcnQsCi0gb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwsCi0gb3JnLmVjbGlwc2UuZHJhdzJkCi1FY2xpcHNlLUxhenlTdGFydDogdHJ1ZQotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5lZGl0L2J1aWxkLnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5lZGl0L2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlYmQ0ZjAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uZWRpdC9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotIyA8Y29weXJpZ2h0PgotIyA8L2NvcHlyaWdodD4KLSMKLSMgJElkOiBidWlsZC5wcm9wZXJ0aWVzLHYgMS4xIDIwMDgvMDEvMTUgMDg6NTM6MTgganRoYW0gRXhwICQKLQotYmluLmluY2x1ZGVzID0gLixcCi0gICAgICAgICAgICAgICBpY29ucy8sXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMKLWphcnMuY29tcGlsZS5vcmRlciA9IC4KLXNvdXJjZS4uID0gc3JjLwotb3V0cHV0Li4gPSBiaW4vClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlTm9kZUNvbnRhaW5lcl9ub2Rlc19BY3Rpdml0eURldGFpbERpYWdyYW0uZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlTm9kZUNvbnRhaW5lcl9ub2Rlc19BY3Rpdml0eURldGFpbERpYWdyYW0uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZTQ5Mzc2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZU5vZGVDb250YWluZXJfbm9kZXNfQWN0aXZpdHlEZXRhaWxEaWFncmFtLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZU5vZGVDb250YWluZXJfbm9kZXNfQWN0aXZpdHlEaWFncmFtLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZU5vZGVDb250YWluZXJfbm9kZXNfQWN0aXZpdHlEaWFncmFtLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjJiMGExZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVOb2RlQ29udGFpbmVyX25vZGVzX0FjdGl2aXR5RGlhZ3JhbS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVOb2RlQ29udGFpbmVyX25vZGVzX0RpYWdyYW0uZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlTm9kZUNvbnRhaW5lcl9ub2Rlc19EaWFncmFtLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDhiMjYyYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVOb2RlQ29udGFpbmVyX25vZGVzX0RpYWdyYW0uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlTm9kZUNvbnRhaW5lcl9ub2Rlc19OYW1lZE5vZGUuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlTm9kZUNvbnRhaW5lcl9ub2Rlc19OYW1lZE5vZGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NDVlOWY0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZU5vZGVDb250YWluZXJfbm9kZXNfTmFtZWROb2RlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZU5vZGVDb250YWluZXJfbm9kZXNfUm9sZU5vZGUuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlTm9kZUNvbnRhaW5lcl9ub2Rlc19Sb2xlTm9kZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4MmYyMjYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlTm9kZUNvbnRhaW5lcl9ub2Rlc19Sb2xlTm9kZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVOb2RlQ29udGFpbmVyX25vZGVzX1JvbGVUYXNrQ29tcG9zaXRlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZU5vZGVDb250YWluZXJfbm9kZXNfUm9sZVRhc2tDb21wb3NpdGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZGM2N2ZmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZU5vZGVDb250YWluZXJfbm9kZXNfUm9sZVRhc2tDb21wb3NpdGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlTm9kZUNvbnRhaW5lcl9ub2Rlc19UYXNrTm9kZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVOb2RlQ29udGFpbmVyX25vZGVzX1Rhc2tOb2RlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWRjNjdmZi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVOb2RlQ29udGFpbmVyX25vZGVzX1Rhc2tOb2RlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZU5vZGVDb250YWluZXJfbm9kZXNfVHlwZWROb2RlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZU5vZGVDb250YWluZXJfbm9kZXNfVHlwZWROb2RlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzM4NzMwOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVOb2RlQ29udGFpbmVyX25vZGVzX1R5cGVkTm9kZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVOb2RlQ29udGFpbmVyX25vZGVzX1dvcmtCcmVha2Rvd25FbGVtZW50Tm9kZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVOb2RlQ29udGFpbmVyX25vZGVzX1dvcmtCcmVha2Rvd25FbGVtZW50Tm9kZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5NzBkNWQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlTm9kZUNvbnRhaW5lcl9ub2Rlc19Xb3JrQnJlYWtkb3duRWxlbWVudE5vZGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlTm9kZUNvbnRhaW5lcl9ub2Rlc19Xb3JrUHJvZHVjdENvbXBvc2l0ZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVOb2RlQ29udGFpbmVyX25vZGVzX1dvcmtQcm9kdWN0Q29tcG9zaXRlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjkzYjNkMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVOb2RlQ29udGFpbmVyX25vZGVzX1dvcmtQcm9kdWN0Q29tcG9zaXRlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZU5vZGVDb250YWluZXJfbm9kZXNfV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVOb2RlQ29udGFpbmVyX25vZGVzX1dvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW0uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYWNlMTIyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZU5vZGVDb250YWluZXJfbm9kZXNfV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVOb2RlQ29udGFpbmVyX25vZGVzX1dvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGUuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlTm9kZUNvbnRhaW5lcl9ub2Rlc19Xb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTIzMGZhNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVOb2RlQ29udGFpbmVyX25vZGVzX1dvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlTm9kZUNvbnRhaW5lcl9ub2Rlc19Xb3JrUHJvZHVjdE5vZGUuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlTm9kZUNvbnRhaW5lcl9ub2Rlc19Xb3JrUHJvZHVjdE5vZGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YmU2ZWM0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZU5vZGVDb250YWluZXJfbm9kZXNfV29ya1Byb2R1Y3ROb2RlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZU5vZGVfb3V0Z29pbmdDb25uZWN0aW9uc19MaW5rLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZU5vZGVfb3V0Z29pbmdDb25uZWN0aW9uc19MaW5rLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODg5ZjNhZi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVOb2RlX291dGdvaW5nQ29ubmVjdGlvbnNfTGluay5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvQWN0aXZpdHlEZXRhaWxEaWFncmFtLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9BY3Rpdml0eURldGFpbERpYWdyYW0uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNWRjNzRhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9BY3Rpdml0eURldGFpbERpYWdyYW0uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uZWRpdC9pY29ucy9mdWxsL29iajE2L0FjdGl2aXR5RGlhZ3JhbS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvQWN0aXZpdHlEaWFncmFtLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTkxNTU5MS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvQWN0aXZpdHlEaWFncmFtLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9EaWFncmFtLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9EaWFncmFtLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzRhOGFmNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvRGlhZ3JhbS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvTGluay5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvTGluay5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4ZjQwOGMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uZWRpdC9pY29ucy9mdWxsL29iajE2L0xpbmsuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uZWRpdC9pY29ucy9mdWxsL29iajE2L05hbWVkTm9kZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvTmFtZWROb2RlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTE3ZGM3ZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvTmFtZWROb2RlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Sb2xlTm9kZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUm9sZU5vZGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYjE3NTVhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Sb2xlTm9kZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUm9sZVRhc2tDb21wb3NpdGUuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uZWRpdC9pY29ucy9mdWxsL29iajE2L1JvbGVUYXNrQ29tcG9zaXRlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTRiNTMwZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUm9sZVRhc2tDb21wb3NpdGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uZWRpdC9pY29ucy9mdWxsL29iajE2L1Rhc2tOb2RlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9UYXNrTm9kZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0YjUzMGUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uZWRpdC9pY29ucy9mdWxsL29iajE2L1Rhc2tOb2RlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9UeXBlZE5vZGUuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uZWRpdC9pY29ucy9mdWxsL29iajE2L1R5cGVkTm9kZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmYjgyZWEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uZWRpdC9pY29ucy9mdWxsL29iajE2L1R5cGVkTm9kZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvV29ya0JyZWFrZG93bkVsZW1lbnROb2RlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Xb3JrQnJlYWtkb3duRWxlbWVudE5vZGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMDBhZWRmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Xb3JrQnJlYWtkb3duRWxlbWVudE5vZGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uZWRpdC9pY29ucy9mdWxsL29iajE2L1dvcmtQcm9kdWN0Q29tcG9zaXRlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Xb3JrUHJvZHVjdENvbXBvc2l0ZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwZDEwZjkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uZWRpdC9pY29ucy9mdWxsL29iajE2L1dvcmtQcm9kdWN0Q29tcG9zaXRlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Xb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Xb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTRjOTUzZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyMTgyMjkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uZWRpdC9pY29ucy9mdWxsL29iajE2L1dvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uZWRpdC9pY29ucy9mdWxsL29iajE2L1dvcmtQcm9kdWN0Tm9kZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvV29ya1Byb2R1Y3ROb2RlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmFkYWFiMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvV29ya1Byb2R1Y3ROb2RlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmVkaXQvcGx1Z2luLnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5lZGl0L3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZTk1YjI1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmVkaXQvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0jIDxjb3B5cmlnaHQ+Ci0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIDwvY29weXJpZ2h0PgotIwotIyAkSWQ6IHBsdWdpbi5wcm9wZXJ0aWVzLHYgMS4xIDIwMDgvMDEvMTUgMDg6NTM6MTgganRoYW0gRXhwICQKLQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyBUbyBjb2RlIGRldmVsb3BlcjoKLSMgICBEbyBOT1QgY2hhbmdlIHRoZSBwcm9wZXJ0aWVzIGJldHdlZW4gdGhpcyBsaW5lIGFuZCB0aGUKLSMgICAiJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlIiBsaW5lLgotIyAgIE1ha2UgYSBuZXcgcHJvcGVydHkgbmFtZSwgYXBwZW5kIHRvIHRoZSBlbmQgb2YgdGhlIGZpbGUgYW5kIGNoYW5nZQotIyAgIHRoZSBjb2RlIHRvIHVzZSB0aGUgbmV3IHByb3BlcnR5LgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLQotcGx1Z2luTmFtZT1FUEYgRGlhZ3JhbSBFZGl0IFN1cHBvcnQKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotCi1fVUlfQ3JlYXRlQ2hpbGRfdGV4dCA9IHswfQotX1VJX0NyZWF0ZUNoaWxkX3RleHQyID0gezF9IHswfQotX1VJX0NyZWF0ZUNoaWxkX3RleHQzID0gezF9Ci1fVUlfQ3JlYXRlQ2hpbGRfdG9vbHRpcCA9IENyZWF0ZSBOZXcgezB9IFVuZGVyIHsxfSBGZWF0dXJlCi1fVUlfQ3JlYXRlQ2hpbGRfZGVzY3JpcHRpb24gPSBDcmVhdGUgYSBuZXcgY2hpbGQgb2YgdHlwZSB7MH0gZm9yIHRoZSB7MX0gZmVhdHVyZSBvZiB0aGUgc2VsZWN0ZWQgezJ9LgotX1VJX0NyZWF0ZVNpYmxpbmdfZGVzY3JpcHRpb24gPSBDcmVhdGUgYSBuZXcgc2libGluZyBvZiB0eXBlIHswfSBmb3IgdGhlIHNlbGVjdGVkIHsyfSwgdW5kZXIgdGhlIHsxfSBmZWF0dXJlIG9mIHRoZWlyIHBhcmVudC4KLQotX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiA9IFRoZSB7MH0gb2YgdGhlIHsxfQotCi1fVUlfRGlhZ3JhbV90eXBlID0gRGlhZ3JhbQotX1VJX0xpbmtfdHlwZSA9IExpbmsKLV9VSV9MaW5rZWRPYmplY3RfdHlwZSA9IExpbmtlZCBPYmplY3QKLV9VSV9OYW1lZE5vZGVfdHlwZSA9IE5hbWVkIE5vZGUKLV9VSV9Ob2RlX3R5cGUgPSBOb2RlCi1fVUlfQWN0aXZpdHlEaWFncmFtX3R5cGUgPSBBY3Rpdml0eSBEaWFncmFtCi1fVUlfVHlwZWROb2RlX3R5cGUgPSBUeXBlZCBOb2RlCi1fVUlfV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbV90eXBlID0gV29yayBQcm9kdWN0IERlcGVuZGVuY3kgRGlhZ3JhbQotX1VJX1dvcmtQcm9kdWN0Tm9kZV90eXBlID0gV29yayBQcm9kdWN0IE5vZGUKLV9VSV9BY3Rpdml0eURldGFpbERpYWdyYW1fdHlwZSA9IEFjdGl2aXR5IERldGFpbCBEaWFncmFtCi1fVUlfTm9kZUNvbnRhaW5lcl90eXBlID0gTm9kZSBDb250YWluZXIKLV9VSV9Sb2xlTm9kZV90eXBlID0gUm9sZSBOb2RlCi1fVUlfUm9sZVRhc2tDb21wb3NpdGVfdHlwZSA9IFJvbGUgVGFzayBDb21wb3NpdGUKLV9VSV9UYXNrTm9kZV90eXBlID0gVGFzayBOb2RlCi1fVUlfV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZV90eXBlID0gV29yayBQcm9kdWN0IERlc2NyaXB0b3IgTm9kZQotX1VJX1dvcmtCcmVha2Rvd25FbGVtZW50Tm9kZV90eXBlID0gV29yayBCcmVha2Rvd24gRWxlbWVudCBOb2RlCi1fVUlfV29ya1Byb2R1Y3RDb21wb3NpdGVfdHlwZSA9IFdvcmsgUHJvZHVjdCBDb21wb3NpdGUKLV9VSV9Vbmtub3duX3R5cGUgPSBPYmplY3QKLQotX1VJX1Vua25vd25fZGF0YXR5cGU9IFZhbHVlCi0KLV9VSV9MaW5rX3NvdXJjZV9mZWF0dXJlID0gU291cmNlCi1fVUlfTGlua190YXJnZXRfZmVhdHVyZSA9IFRhcmdldAotX1VJX0xpbmtfYmVuZHBvaW50c19mZWF0dXJlID0gQmVuZHBvaW50cwotX1VJX0xpbmtfc291cmNlRW5kUG9pbnRfZmVhdHVyZSA9IFNvdXJjZSBFbmQgUG9pbnQKLV9VSV9MaW5rX3RhcmdldEVuZFBvaW50X2ZlYXR1cmUgPSBUYXJnZXQgRW5kIFBvaW50Ci1fVUlfTGlua2VkT2JqZWN0X2xpbmtlZEVsZW1lbnRfZmVhdHVyZSA9IExpbmtlZCBFbGVtZW50Ci1fVUlfTGlua2VkT2JqZWN0X29iamVjdF9mZWF0dXJlID0gT2JqZWN0Ci1fVUlfTmFtZWROb2RlX25hbWVfZmVhdHVyZSA9IE5hbWUKLV9VSV9Ob2RlX2xvY2F0aW9uX2ZlYXR1cmUgPSBMb2NhdGlvbgotX1VJX05vZGVfd2lkdGhfZmVhdHVyZSA9IFdpZHRoCi1fVUlfTm9kZV9oZWlnaHRfZmVhdHVyZSA9IEhlaWdodAotX1VJX05vZGVfaW5jb21pbmdDb25uZWN0aW9uc19mZWF0dXJlID0gSW5jb21pbmcgQ29ubmVjdGlvbnMKLV9VSV9Ob2RlX291dGdvaW5nQ29ubmVjdGlvbnNfZmVhdHVyZSA9IE91dGdvaW5nIENvbm5lY3Rpb25zCi1fVUlfTm9kZV9yZWFkT25seV9mZWF0dXJlID0gUmVhZCBPbmx5Ci1fVUlfVHlwZWROb2RlX3R5cGVfZmVhdHVyZSA9IFR5cGUKLV9VSV9Xb3JrUHJvZHVjdE5vZGVfdHlwZV9mZWF0dXJlID0gVHlwZQotX1VJX05vZGVDb250YWluZXJfbm9kZXNfZmVhdHVyZSA9IE5vZGVzCi1fVUlfV29ya1Byb2R1Y3RDb21wb3NpdGVfdHlwZV9mZWF0dXJlID0gVHlwZQotX1VJX1Vua25vd25fZmVhdHVyZSA9IFVuc3BlY2lmaWVkCi0KLV9VSV9MaW5rX25hbWVfZmVhdHVyZSA9IE5hbWUKLV9VSV9BY3Rpdml0eURldGFpbERpYWdyYW1fYXV0b0xheW91dF9mZWF0dXJlID0gQXV0byBMYXlvdXQKLV9VSV9UYXNrTm9kZV9pbmRleF9mZWF0dXJlID0gSW5kZXgKLV9VSV9Sb2xlVGFza0NvbXBvc2l0ZV9yb3dJbmRleF9mZWF0dXJlID0gUm93IEluZGV4CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5lZGl0L3BsdWdpbi54bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5lZGl0L3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyYzUwZDAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uZWRpdC9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLQotPCEtLQotIDxjb3B5cmlnaHQ+Ci0gPC9jb3B5cmlnaHQ+Ci0KLSAkSWQ6IHBsdWdpbi54bWwsdiAxLjEgMjAwOC8wMS8xNSAwODo1MzoxOCBqdGhhbSBFeHAgJAotLS0+Ci0KLTxwbHVnaW4+Ci0gICAgCi0gIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmVtZi5lZGl0Lml0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3JpZXMiPgotICAgIDxmYWN0b3J5IAotICAgICAgIHVyaSA9ICJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi9kaWFncmFtLzEuMC4wL2RpYWdyYW0uZWNvcmUiIAotICAgICAgIGNsYXNzID0gIm9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLnByb3ZpZGVyLk1vZGVsSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkiIAotICAgICAgIHN1cHBvcnRlZFR5cGVzID0gCi0gICAgICAgICAib3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIKLSAgICAgICAgICBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIKLSAgICAgICAgICBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIKLSAgICAgICAgICBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXIKLSAgICAgICAgICBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlIiAvPgotICA8L2V4dGVuc2lvbj4KLQotPC9wbHVnaW4+Ci0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL3Byb3ZpZGVyL0FjdGl2aXR5RGV0YWlsRGlhZ3JhbUl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvcHJvdmlkZXIvQWN0aXZpdHlEZXRhaWxEaWFncmFtSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2MjNjNDcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvcHJvdmlkZXIvQWN0aXZpdHlEZXRhaWxEaWFncmFtSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogQWN0aXZpdHlEZXRhaWxEaWFncmFtSXRlbVByb3ZpZGVyLmphdmEsdiAxLjEgMjAwOC8wMS8xNSAwODo1MzowMyBqdGhhbSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLnByb3ZpZGVyOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5BY3Rpdml0eURldGFpbERpYWdyYW07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Nb2RlbFBhY2thZ2U7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5BY3Rpdml0eURldGFpbERpYWdyYW19IG9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXR5RGV0YWlsRGlhZ3JhbUl0ZW1Qcm92aWRlcgotCWV4dGVuZHMgRGlhZ3JhbUl0ZW1Qcm92aWRlcgotCWltcGxlbWVudHMJCi0JCUlFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLAkKLQkJSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAkKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLAkKLQkJSUl0ZW1MYWJlbFByb3ZpZGVyLAkKLQkJSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBY3Rpdml0eURldGFpbERpYWdyYW1JdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJYWRkQXV0b0xheW91dFByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgQXV0byBMYXlvdXQgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRBdXRvTGF5b3V0UHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkCi0JCQkoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcgotCQkJCSgoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCSBnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkgZ2V0U3RyaW5nKCJfVUlfQWN0aXZpdHlEZXRhaWxEaWFncmFtX2F1dG9MYXlvdXRfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJIGdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfQWN0aXZpdHlEZXRhaWxEaWFncmFtX2F1dG9MYXlvdXRfZmVhdHVyZSIsICJfVUlfQWN0aXZpdHlEZXRhaWxEaWFncmFtX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkgTW9kZWxQYWNrYWdlLkxpdGVyYWxzLkFDVElWSVRZX0RFVEFJTF9ESUFHUkFNX19BVVRPX0xBWU9VVCwKLQkJCQkgdHJ1ZSwKLQkJCQkgZmFsc2UsCi0JCQkJIGZhbHNlLAotCQkJCSBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkJPT0xFQU5fVkFMVUVfSU1BR0UsCi0JCQkJIG51bGwsCi0JCQkJIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgQWN0aXZpdHlEZXRhaWxEaWFncmFtLmdpZi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKCJmdWxsL29iajE2L0FjdGl2aXR5RGV0YWlsRGlhZ3JhbSIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJUG9pbnQgbGFiZWxWYWx1ZSA9ICgoQWN0aXZpdHlEZXRhaWxEaWFncmFtKW9iamVjdCkuZ2V0TG9jYXRpb24oKTsKLQkJU3RyaW5nIGxhYmVsID0gbGFiZWxWYWx1ZSA9PSBudWxsID8gbnVsbCA6IGxhYmVsVmFsdWUudG9TdHJpbmcoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/Ci0JCQlnZXRTdHJpbmcoIl9VSV9BY3Rpdml0eURldGFpbERpYWdyYW1fdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJZ2V0U3RyaW5nKCJfVUlfQWN0aXZpdHlEZXRhaWxEaWFncmFtX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCi0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChBY3Rpdml0eURldGFpbERpYWdyYW0uY2xhc3MpKSB7Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5BQ1RJVklUWV9ERVRBSUxfRElBR1JBTV9fQVVUT19MQVlPVVQ6Ci0JCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpLCBmYWxzZSwgdHJ1ZSkpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbgotCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIERpYWdyYW1FZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvcHJvdmlkZXIvQWN0aXZpdHlEaWFncmFtSXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9wcm92aWRlci9BY3Rpdml0eURpYWdyYW1JdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzUyM2ViMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9wcm92aWRlci9BY3Rpdml0eURpYWdyYW1JdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzOSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBBY3Rpdml0eURpYWdyYW1JdGVtUHJvdmlkZXIuamF2YSx2IDEuMSAyMDA4LzAxLzE1IDA4OjUzOjAzIGp0aGFtIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwucHJvdmlkZXI7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuQWN0aXZpdHlEaWFncmFtOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuQWN0aXZpdHlEaWFncmFtfSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eURpYWdyYW1JdGVtUHJvdmlkZXIKLQlleHRlbmRzIERpYWdyYW1JdGVtUHJvdmlkZXIKLQlpbXBsZW1lbnRzCQotCQlJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwJCi0JCUlTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwJCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwJCi0JCUlJdGVtTGFiZWxQcm92aWRlciwJCi0JCUlJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWN0aXZpdHlEaWFncmFtSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIEFjdGl2aXR5RGlhZ3JhbS5naWYuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9BY3Rpdml0eURpYWdyYW0iKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVBvaW50IGxhYmVsVmFsdWUgPSAoKEFjdGl2aXR5RGlhZ3JhbSlvYmplY3QpLmdldExvY2F0aW9uKCk7Ci0JCVN0cmluZyBsYWJlbCA9IGxhYmVsVmFsdWUgPT0gbnVsbCA/IG51bGwgOiBsYWJlbFZhbHVlLnRvU3RyaW5nKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPwotCQkJZ2V0U3RyaW5nKCJfVUlfQWN0aXZpdHlEaWFncmFtX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCWdldFN0cmluZygiX1VJX0FjdGl2aXR5RGlhZ3JhbV90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4KLQkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBEaWFncmFtRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL3Byb3ZpZGVyL0RpYWdyYW1FZGl0UGx1Z2luLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9wcm92aWRlci9EaWFncmFtRWRpdFBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMWQ4MGJiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL3Byb3ZpZGVyL0RpYWdyYW1FZGl0UGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogRGlhZ3JhbUVkaXRQbHVnaW4uamF2YSx2IDEuMSAyMDA4LzAxLzE1IDA4OjUzOjAzIGp0aGFtIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwucHJvdmlkZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLkVNRlBsdWdpbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLlVtYUVkaXRQbHVnaW47Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgY2VudHJhbCBzaW5nbGV0b24gZm9yIHRoZSBEaWFncmFtIGVkaXQgcGx1Z2luLgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgRGlhZ3JhbUVkaXRQbHVnaW4gZXh0ZW5kcyBFTUZQbHVnaW4gewotCS8qKgotCSAqIEtlZXAgdHJhY2sgb2YgdGhlIHNpbmdsZXRvbi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIERpYWdyYW1FZGl0UGx1Z2luIElOU1RBTkNFID0gbmV3IERpYWdyYW1FZGl0UGx1Z2luKCk7Ci0KLQkvKioKLQkgKiBLZWVwIHRyYWNrIG9mIHRoZSBzaW5nbGV0b24uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgSW1wbGVtZW50YXRpb24gcGx1Z2luOwotCi0JLyoqCi0JICogQ3JlYXRlIHRoZSBpbnN0YW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRGlhZ3JhbUVkaXRQbHVnaW4oKSB7Ci0JCXN1cGVyCi0JCSAgKG5ldyBSZXNvdXJjZUxvY2F0b3IgW10gewotCQkgICAgIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0UsCi0JCSAgIH0pOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgRWNsaXBzZSBwbHVnaW4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBzaW5nbGV0b24gaW5zdGFuY2UuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UGx1Z2luUmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gcGx1Z2luOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgRWNsaXBzZSBwbHVnaW4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBzaW5nbGV0b24gaW5zdGFuY2UuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSW1wbGVtZW50YXRpb24gZ2V0UGx1Z2luKCkgewotCQlyZXR1cm4gcGx1Z2luOwotCX0KLQotCS8qKgotCSAqIFRoZSBhY3R1YWwgaW1wbGVtZW50YXRpb24gb2YgdGhlIEVjbGlwc2UgPGI+UGx1Z2luPC9iPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNsYXNzIEltcGxlbWVudGF0aW9uIGV4dGVuZHMgRWNsaXBzZVBsdWdpbiB7Ci0JCS8qKgotCQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIEltcGxlbWVudGF0aW9uKCkgewotCQkJc3VwZXIoKTsKLQotCQkJLy8gUmVtZW1iZXIgdGhlIHN0YXRpYyBpbnN0YW5jZS4KLQkJCS8vCi0JCQlwbHVnaW4gPSB0aGlzOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9wcm92aWRlci9EaWFncmFtSXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9wcm92aWRlci9EaWFncmFtSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmNjYxMTkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvcHJvdmlkZXIvRGlhZ3JhbUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IERpYWdyYW1JdGVtUHJvdmlkZXIuamF2YSx2IDEuMSAyMDA4LzAxLzE1IDA4OjUzOjAzIGp0aGFtIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwucHJvdmlkZXI7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuRGlhZ3JhbTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkRpYWdyYW19IG9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERpYWdyYW1JdGVtUHJvdmlkZXIKLQlleHRlbmRzIE5vZGVDb250YWluZXJJdGVtUHJvdmlkZXIKLQlpbXBsZW1lbnRzCQotCQlJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwJCi0JCUlTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwJCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwJCi0JCUlJdGVtTGFiZWxQcm92aWRlciwJCi0JCUlJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRGlhZ3JhbUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIExpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBEaWFncmFtLmdpZi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKCJmdWxsL29iajE2L0RpYWdyYW0iKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVBvaW50IGxhYmVsVmFsdWUgPSAoKERpYWdyYW0pb2JqZWN0KS5nZXRMb2NhdGlvbigpOwotCQlTdHJpbmcgbGFiZWwgPSBsYWJlbFZhbHVlID09IG51bGwgPyBudWxsIDogbGFiZWxWYWx1ZS50b1N0cmluZygpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8KLQkJCWdldFN0cmluZygiX1VJX0RpYWdyYW1fdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJZ2V0U3RyaW5nKCJfVUlfRGlhZ3JhbV90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4KLQkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBEaWFncmFtRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL3Byb3ZpZGVyL0xpbmtJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL3Byb3ZpZGVyL0xpbmtJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGNiZWMyMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9wcm92aWRlci9MaW5rSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogTGlua0l0ZW1Qcm92aWRlci5qYXZhLHYgMS4xIDIwMDgvMDEvMTUgMDg6NTM6MDMganRoYW0gRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5wcm92aWRlcjsKLQotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Nb2RlbFBhY2thZ2U7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5MaW5rfSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBMaW5rSXRlbVByb3ZpZGVyCi0JZXh0ZW5kcyBMaW5rZWRPYmplY3RJdGVtUHJvdmlkZXIKLQlpbXBsZW1lbnRzCQotCQlJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwJCi0JCUlTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwJCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwJCi0JCUlJdGVtTGFiZWxQcm92aWRlciwJCi0JCUlJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlua0l0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIExpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlhZGROYW1lUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRUYXJnZXRQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZEJlbmRwb2ludHNQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZFNvdXJjZUVuZFBvaW50UHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRUYXJnZXRFbmRQb2ludFByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgTmFtZSBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZE5hbWVQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQKLQkJCShjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yCi0JCQkJKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSlhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJIGdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCSBnZXRTdHJpbmcoIl9VSV9MaW5rX25hbWVfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJIGdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfTGlua19uYW1lX2ZlYXR1cmUiLCAiX1VJX0xpbmtfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCSBNb2RlbFBhY2thZ2UuTGl0ZXJhbHMuTElOS19fTkFNRSwKLQkJCQkgdHJ1ZSwKLQkJCQkgZmFsc2UsCi0JCQkJIGZhbHNlLAotCQkJCSBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsCi0JCQkJIG51bGwsCi0JCQkJIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgVGFyZ2V0IGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkVGFyZ2V0UHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkCi0JCQkoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcgotCQkJCSgoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCSBnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkgZ2V0U3RyaW5nKCJfVUlfTGlua190YXJnZXRfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJIGdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfTGlua190YXJnZXRfZmVhdHVyZSIsICJfVUlfTGlua190eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJIE1vZGVsUGFja2FnZS5MaXRlcmFscy5MSU5LX19UQVJHRVQsCi0JCQkJIHRydWUsCi0JCQkJIGZhbHNlLAotCQkJCSB0cnVlLAotCQkJCSBudWxsLAotCQkJCSBudWxsLAotCQkJCSBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIEJlbmRwb2ludHMgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRCZW5kcG9pbnRzUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkCi0JCQkoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcgotCQkJCSgoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCSBnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkgZ2V0U3RyaW5nKCJfVUlfTGlua19iZW5kcG9pbnRzX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCSBnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0xpbmtfYmVuZHBvaW50c19mZWF0dXJlIiwgIl9VSV9MaW5rX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkgTW9kZWxQYWNrYWdlLkxpdGVyYWxzLkxJTktfX0JFTkRQT0lOVFMsCi0JCQkJIHRydWUsCi0JCQkJIGZhbHNlLAotCQkJCSBmYWxzZSwKLQkJCQkgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLAotCQkJCSBudWxsLAotCQkJCSBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFNvdXJjZSBFbmQgUG9pbnQgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRTb3VyY2VFbmRQb2ludFByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZAotCQkJKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IKLQkJCQkoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkgZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJIGdldFN0cmluZygiX1VJX0xpbmtfc291cmNlRW5kUG9pbnRfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJIGdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfTGlua19zb3VyY2VFbmRQb2ludF9mZWF0dXJlIiwgIl9VSV9MaW5rX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkgTW9kZWxQYWNrYWdlLkxpdGVyYWxzLkxJTktfX1NPVVJDRV9FTkRfUE9JTlQsCi0JCQkJIHRydWUsCi0JCQkJIGZhbHNlLAotCQkJCSBmYWxzZSwKLQkJCQkgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLAotCQkJCSBudWxsLAotCQkJCSBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFRhcmdldCBFbmQgUG9pbnQgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRUYXJnZXRFbmRQb2ludFByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZAotCQkJKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IKLQkJCQkoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkgZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJIGdldFN0cmluZygiX1VJX0xpbmtfdGFyZ2V0RW5kUG9pbnRfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJIGdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfTGlua190YXJnZXRFbmRQb2ludF9mZWF0dXJlIiwgIl9VSV9MaW5rX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkgTW9kZWxQYWNrYWdlLkxpdGVyYWxzLkxJTktfX1RBUkdFVF9FTkRfUE9JTlQsCi0JCQkJIHRydWUsCi0JCQkJIGZhbHNlLAotCQkJCSBmYWxzZSwKLQkJCQkgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLAotCQkJCSBudWxsLAotCQkJCSBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIExpbmsuZ2lmLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvTGluayIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChMaW5rKW9iamVjdCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8KLQkJCWdldFN0cmluZygiX1VJX0xpbmtfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJZ2V0U3RyaW5nKCJfVUlfTGlua190eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoTGluay5jbGFzcykpIHsKLQkJCWNhc2UgTW9kZWxQYWNrYWdlLkxJTktfX05BTUU6Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5MSU5LX19CRU5EUE9JTlRTOgotCQkJY2FzZSBNb2RlbFBhY2thZ2UuTElOS19fU09VUkNFX0VORF9QT0lOVDoKLQkJCWNhc2UgTW9kZWxQYWNrYWdlLkxJTktfX1RBUkdFVF9FTkRfUE9JTlQ6Ci0JCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpLCBmYWxzZSwgdHJ1ZSkpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbgotCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIERpYWdyYW1FZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvcHJvdmlkZXIvTGlua2VkT2JqZWN0SXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9wcm92aWRlci9MaW5rZWRPYmplY3RJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjRlYzgyMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9wcm92aWRlci9MaW5rZWRPYmplY3RJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBMaW5rZWRPYmplY3RJdGVtUHJvdmlkZXIuamF2YSx2IDEuMSAyMDA4LzAxLzE1IDA4OjUzOjAzIGp0aGFtIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwucHJvdmlkZXI7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTGlua2VkT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk1vZGVsUGFja2FnZTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkxpbmtlZE9iamVjdH0gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgTGlua2VkT2JqZWN0SXRlbVByb3ZpZGVyCi0JZXh0ZW5kcyBJdGVtUHJvdmlkZXJBZGFwdGVyCi0JaW1wbGVtZW50cwkKLQkJSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsCQotCQlJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCQotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsCQotCQlJSXRlbUxhYmVsUHJvdmlkZXIsCQotCQlJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpbmtlZE9iamVjdEl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIExpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlhZGRMaW5rZWRFbGVtZW50UHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBMaW5rZWQgRWxlbWVudCBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZExpbmtlZEVsZW1lbnRQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQKLQkJCShjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yCi0JCQkJKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSlhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJIGdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCSBnZXRTdHJpbmcoIl9VSV9MaW5rZWRPYmplY3RfbGlua2VkRWxlbWVudF9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkgZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9MaW5rZWRPYmplY3RfbGlua2VkRWxlbWVudF9mZWF0dXJlIiwgIl9VSV9MaW5rZWRPYmplY3RfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCSBNb2RlbFBhY2thZ2UuTGl0ZXJhbHMuTElOS0VEX09CSkVDVF9fTElOS0VEX0VMRU1FTlQsCi0JCQkJIHRydWUsCi0JCQkJIGZhbHNlLAotCQkJCSB0cnVlLAotCQkJCSBudWxsLAotCQkJCSBudWxsLAotCQkJCSBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gZ2V0U3RyaW5nKCJfVUlfTGlua2VkT2JqZWN0X3R5cGUiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuCi0JICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gRGlhZ3JhbUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9wcm92aWRlci9Nb2RlbEl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9wcm92aWRlci9Nb2RlbEl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4ODNjNjAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvcHJvdmlkZXIvTW9kZWxJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTI1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IE1vZGVsSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YSx2IDEuMSAyMDA4LzAxLzE1IDA4OjUzOjAzIGp0aGFtIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5DaGFuZ2VOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VkQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUNoYW5nZU5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklEaXNwb3NhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklOb3RpZnlDaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLnV0aWwuTW9kZWxBZGFwdGVyRmFjdG9yeTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBmYWN0b3J5IHRoYXQgaXMgdXNlZCB0byBwcm92aWRlIHRoZSBpbnRlcmZhY2VzIG5lZWRlZCB0byBzdXBwb3J0IFZpZXdlcnMuCi0gKiBUaGUgYWRhcHRlcnMgZ2VuZXJhdGVkIGJ5IHRoaXMgZmFjdG9yeSBjb252ZXJ0IEVNRiBhZGFwdGVyIG5vdGlmaWNhdGlvbnMgaW50byBjYWxscyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkIGZpcmVOb3RpZnlDaGFuZ2VkfS4KLSAqIFRoZSBhZGFwdGVycyBhbHNvIHN1cHBvcnQgRWNsaXBzZSBwcm9wZXJ0eSBzaGVldHMuCi0gKiBOb3RlIHRoYXQgbW9zdCBvZiB0aGUgYWRhcHRlcnMgYXJlIHNoYXJlZCBhbW9uZyBtdWx0aXBsZSBpbnN0YW5jZXMuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBNb2RlbEl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5IGV4dGVuZHMgTW9kZWxBZGFwdGVyRmFjdG9yeSBpbXBsZW1lbnRzIENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnksIElDaGFuZ2VOb3RpZmllciwgSURpc3Bvc2FibGUgewotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIHJvb3QgYWRhcHRlciBmYWN0b3J5IHRoYXQgZGVsZWdhdGVzIHRvIHRoaXMgYWRhcHRlciBmYWN0b3J5LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IHBhcmVudEFkYXB0ZXJGYWN0b3J5OwotCi0JLyoqCi0JICogVGhpcyBpcyB1c2VkIHRvIGltcGxlbWVudCB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUNoYW5nZU5vdGlmaWVyfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUNoYW5nZU5vdGlmaWVyIGNoYW5nZU5vdGlmaWVyID0gbmV3IENoYW5nZU5vdGlmaWVyKCk7Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIGFsbCB0aGUgc3VwcG9ydGVkIHR5cGVzIGNoZWNrZWQgYnkge0BsaW5rICNpc0ZhY3RvcnlGb3JUeXBlIGlzRmFjdG9yeUZvclR5cGV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb2xsZWN0aW9uPE9iamVjdD4gc3VwcG9ydGVkVHlwZXMgPSBuZXcgQXJyYXlMaXN0PE9iamVjdD4oKTsKLQotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTW9kZWxJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpIHsKLQkJc3VwcG9ydGVkVHlwZXMuYWRkKElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLmNsYXNzKTsKLQkJc3VwcG9ydGVkVHlwZXMuYWRkKElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCXN1cHBvcnRlZFR5cGVzLmFkZChJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQlzdXBwb3J0ZWRUeXBlcy5hZGQoSUl0ZW1MYWJlbFByb3ZpZGVyLmNsYXNzKTsKLQkJc3VwcG9ydGVkVHlwZXMuYWRkKElJdGVtUHJvcGVydHlTb3VyY2UuY2xhc3MpOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuRGlhZ3JhbX0gaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBEaWFncmFtSXRlbVByb3ZpZGVyIGRpYWdyYW1JdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuRGlhZ3JhbX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRGlhZ3JhbUFkYXB0ZXIoKSB7Ci0JCWlmIChkaWFncmFtSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCWRpYWdyYW1JdGVtUHJvdmlkZXIgPSBuZXcgRGlhZ3JhbUl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiBkaWFncmFtSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTGlua30gaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBMaW5rSXRlbVByb3ZpZGVyIGxpbmtJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTGlua30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlTGlua0FkYXB0ZXIoKSB7Ci0JCWlmIChsaW5rSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCWxpbmtJdGVtUHJvdmlkZXIgPSBuZXcgTGlua0l0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiBsaW5rSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTmFtZWROb2RlfSBpbnN0YW5jZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE5hbWVkTm9kZUl0ZW1Qcm92aWRlciBuYW1lZE5vZGVJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTmFtZWROb2RlfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVOYW1lZE5vZGVBZGFwdGVyKCkgewotCQlpZiAobmFtZWROb2RlSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCW5hbWVkTm9kZUl0ZW1Qcm92aWRlciA9IG5ldyBOYW1lZE5vZGVJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gbmFtZWROb2RlSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuQWN0aXZpdHlEaWFncmFtfSBpbnN0YW5jZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEFjdGl2aXR5RGlhZ3JhbUl0ZW1Qcm92aWRlciBhY3Rpdml0eURpYWdyYW1JdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuQWN0aXZpdHlEaWFncmFtfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVBY3Rpdml0eURpYWdyYW1BZGFwdGVyKCkgewotCQlpZiAoYWN0aXZpdHlEaWFncmFtSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCWFjdGl2aXR5RGlhZ3JhbUl0ZW1Qcm92aWRlciA9IG5ldyBBY3Rpdml0eURpYWdyYW1JdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gYWN0aXZpdHlEaWFncmFtSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuVHlwZWROb2RlfSBpbnN0YW5jZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFR5cGVkTm9kZUl0ZW1Qcm92aWRlciB0eXBlZE5vZGVJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuVHlwZWROb2RlfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVUeXBlZE5vZGVBZGFwdGVyKCkgewotCQlpZiAodHlwZWROb2RlSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCXR5cGVkTm9kZUl0ZW1Qcm92aWRlciA9IG5ldyBUeXBlZE5vZGVJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gdHlwZWROb2RlSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbX0gaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBXb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtSXRlbVByb3ZpZGVyIHdvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW1JdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbUFkYXB0ZXIoKSB7Ci0JCWlmICh3b3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCXdvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW1JdGVtUHJvdmlkZXIgPSBuZXcgV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbUl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiB3b3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuV29ya1Byb2R1Y3ROb2RlfSBpbnN0YW5jZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFdvcmtQcm9kdWN0Tm9kZUl0ZW1Qcm92aWRlciB3b3JrUHJvZHVjdE5vZGVJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuV29ya1Byb2R1Y3ROb2RlfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVXb3JrUHJvZHVjdE5vZGVBZGFwdGVyKCkgewotCQlpZiAod29ya1Byb2R1Y3ROb2RlSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCXdvcmtQcm9kdWN0Tm9kZUl0ZW1Qcm92aWRlciA9IG5ldyBXb3JrUHJvZHVjdE5vZGVJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gd29ya1Byb2R1Y3ROb2RlSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuQWN0aXZpdHlEZXRhaWxEaWFncmFtfSBpbnN0YW5jZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEFjdGl2aXR5RGV0YWlsRGlhZ3JhbUl0ZW1Qcm92aWRlciBhY3Rpdml0eURldGFpbERpYWdyYW1JdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuQWN0aXZpdHlEZXRhaWxEaWFncmFtfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVBY3Rpdml0eURldGFpbERpYWdyYW1BZGFwdGVyKCkgewotCQlpZiAoYWN0aXZpdHlEZXRhaWxEaWFncmFtSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCWFjdGl2aXR5RGV0YWlsRGlhZ3JhbUl0ZW1Qcm92aWRlciA9IG5ldyBBY3Rpdml0eURldGFpbERpYWdyYW1JdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gYWN0aXZpdHlEZXRhaWxEaWFncmFtSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuUm9sZU5vZGV9IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUm9sZU5vZGVJdGVtUHJvdmlkZXIgcm9sZU5vZGVJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuUm9sZU5vZGV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVJvbGVOb2RlQWRhcHRlcigpIHsKLQkJaWYgKHJvbGVOb2RlSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCXJvbGVOb2RlSXRlbVByb3ZpZGVyID0gbmV3IFJvbGVOb2RlSXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIHJvbGVOb2RlSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuUm9sZVRhc2tDb21wb3NpdGV9IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUm9sZVRhc2tDb21wb3NpdGVJdGVtUHJvdmlkZXIgcm9sZVRhc2tDb21wb3NpdGVJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuUm9sZVRhc2tDb21wb3NpdGV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVJvbGVUYXNrQ29tcG9zaXRlQWRhcHRlcigpIHsKLQkJaWYgKHJvbGVUYXNrQ29tcG9zaXRlSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCXJvbGVUYXNrQ29tcG9zaXRlSXRlbVByb3ZpZGVyID0gbmV3IFJvbGVUYXNrQ29tcG9zaXRlSXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIHJvbGVUYXNrQ29tcG9zaXRlSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuVGFza05vZGV9IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgVGFza05vZGVJdGVtUHJvdmlkZXIgdGFza05vZGVJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuVGFza05vZGV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVRhc2tOb2RlQWRhcHRlcigpIHsKLQkJaWYgKHRhc2tOb2RlSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCXRhc2tOb2RlSXRlbVByb3ZpZGVyID0gbmV3IFRhc2tOb2RlSXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIHRhc2tOb2RlSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZX0gaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlSXRlbVByb3ZpZGVyIHdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZUFkYXB0ZXIoKSB7Ci0JCWlmICh3b3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCXdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVJdGVtUHJvdmlkZXIgPSBuZXcgV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZUl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiB3b3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuV29ya0JyZWFrZG93bkVsZW1lbnROb2RlfSBpbnN0YW5jZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFdvcmtCcmVha2Rvd25FbGVtZW50Tm9kZUl0ZW1Qcm92aWRlciB3b3JrQnJlYWtkb3duRWxlbWVudE5vZGVJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuV29ya0JyZWFrZG93bkVsZW1lbnROb2RlfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVXb3JrQnJlYWtkb3duRWxlbWVudE5vZGVBZGFwdGVyKCkgewotCQlpZiAod29ya0JyZWFrZG93bkVsZW1lbnROb2RlSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCXdvcmtCcmVha2Rvd25FbGVtZW50Tm9kZUl0ZW1Qcm92aWRlciA9IG5ldyBXb3JrQnJlYWtkb3duRWxlbWVudE5vZGVJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gd29ya0JyZWFrZG93bkVsZW1lbnROb2RlSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuV29ya1Byb2R1Y3RDb21wb3NpdGV9IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgV29ya1Byb2R1Y3RDb21wb3NpdGVJdGVtUHJvdmlkZXIgd29ya1Byb2R1Y3RDb21wb3NpdGVJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuV29ya1Byb2R1Y3RDb21wb3NpdGV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVdvcmtQcm9kdWN0Q29tcG9zaXRlQWRhcHRlcigpIHsKLQkJaWYgKHdvcmtQcm9kdWN0Q29tcG9zaXRlSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCXdvcmtQcm9kdWN0Q29tcG9zaXRlSXRlbVByb3ZpZGVyID0gbmV3IFdvcmtQcm9kdWN0Q29tcG9zaXRlSXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIHdvcmtQcm9kdWN0Q29tcG9zaXRlSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcm9vdCBhZGFwdGVyIGZhY3RvcnkgdGhhdCBjb250YWlucyB0aGlzIGZhY3RvcnkuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkgZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCkgewotCQlyZXR1cm4gcGFyZW50QWRhcHRlckZhY3RvcnkgPT0gbnVsbCA/IHRoaXMgOiBwYXJlbnRBZGFwdGVyRmFjdG9yeS5nZXRSb290QWRhcHRlckZhY3RvcnkoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHNldHMgdGhlIGNvbXBvc2VkIGFkYXB0ZXIgZmFjdG9yeSB0aGF0IGNvbnRhaW5zIHRoaXMgZmFjdG9yeS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQYXJlbnRBZGFwdGVyRmFjdG9yeShDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IHBhcmVudEFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXRoaXMucGFyZW50QWRhcHRlckZhY3RvcnkgPSBwYXJlbnRBZGFwdGVyRmFjdG9yeTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBpc0ZhY3RvcnlGb3JUeXBlKE9iamVjdCB0eXBlKSB7Ci0JCXJldHVybiBzdXBwb3J0ZWRUeXBlcy5jb250YWlucyh0eXBlKSB8fCBzdXBlci5pc0ZhY3RvcnlGb3JUeXBlKHR5cGUpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gc3Vic3RpdHV0ZXMgdGhlIGZhY3RvcnkgaXRzZWxmIGFzIHRoZSBrZXkgZm9yIHRoZSBhZGFwdGVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBBZGFwdGVyIGFkYXB0KE5vdGlmaWVyIG5vdGlmaWVyLCBPYmplY3QgdHlwZSkgewotCQlyZXR1cm4gc3VwZXIuYWRhcHQobm90aWZpZXIsIHRoaXMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgYWRhcHQoT2JqZWN0IG9iamVjdCwgT2JqZWN0IHR5cGUpIHsKLQkJaWYgKGlzRmFjdG9yeUZvclR5cGUodHlwZSkpIHsKLQkJCU9iamVjdCBhZGFwdGVyID0gc3VwZXIuYWRhcHQob2JqZWN0LCB0eXBlKTsKLQkJCWlmICghKHR5cGUgaW5zdGFuY2VvZiBDbGFzcykgfHwgKCgoQ2xhc3M8Pz4pdHlwZSkuaXNJbnN0YW5jZShhZGFwdGVyKSkpIHsKLQkJCQlyZXR1cm4gYWRhcHRlcjsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIGxpc3RlbmVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKElOb3RpZnlDaGFuZ2VkTGlzdGVuZXIgbm90aWZ5Q2hhbmdlZExpc3RlbmVyKSB7Ci0JCWNoYW5nZU5vdGlmaWVyLmFkZExpc3RlbmVyKG5vdGlmeUNoYW5nZWRMaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZW1vdmVzIGEgbGlzdGVuZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoSU5vdGlmeUNoYW5nZWRMaXN0ZW5lciBub3RpZnlDaGFuZ2VkTGlzdGVuZXIpIHsKLQkJY2hhbmdlTm90aWZpZXIucmVtb3ZlTGlzdGVuZXIobm90aWZ5Q2hhbmdlZExpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGRlbGVnYXRlcyB0byB7QGxpbmsgI2NoYW5nZU5vdGlmaWVyfSBhbmQgdG8ge0BsaW5rICNwYXJlbnRBZGFwdGVyRmFjdG9yeX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZmlyZU5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQljaGFuZ2VOb3RpZmllci5maXJlTm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCi0JCWlmIChwYXJlbnRBZGFwdGVyRmFjdG9yeSAhPSBudWxsKSB7Ci0JCQlwYXJlbnRBZGFwdGVyRmFjdG9yeS5maXJlTm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhpcyBkaXNwb3NlcyBhbGwgb2YgdGhlIGl0ZW0gcHJvdmlkZXJzIGNyZWF0ZWQgYnkgdGhpcyBmYWN0b3J5LiAKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlpZiAoZGlhZ3JhbUl0ZW1Qcm92aWRlciAhPSBudWxsKSBkaWFncmFtSXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJaWYgKGxpbmtJdGVtUHJvdmlkZXIgIT0gbnVsbCkgbGlua0l0ZW1Qcm92aWRlci5kaXNwb3NlKCk7Ci0JCWlmIChuYW1lZE5vZGVJdGVtUHJvdmlkZXIgIT0gbnVsbCkgbmFtZWROb2RlSXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJaWYgKGFjdGl2aXR5RGlhZ3JhbUl0ZW1Qcm92aWRlciAhPSBudWxsKSBhY3Rpdml0eURpYWdyYW1JdGVtUHJvdmlkZXIuZGlzcG9zZSgpOwotCQlpZiAodHlwZWROb2RlSXRlbVByb3ZpZGVyICE9IG51bGwpIHR5cGVkTm9kZUl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7Ci0JCWlmICh3b3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtSXRlbVByb3ZpZGVyICE9IG51bGwpIHdvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW1JdGVtUHJvdmlkZXIuZGlzcG9zZSgpOwotCQlpZiAod29ya1Byb2R1Y3ROb2RlSXRlbVByb3ZpZGVyICE9IG51bGwpIHdvcmtQcm9kdWN0Tm9kZUl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7Ci0JCWlmIChhY3Rpdml0eURldGFpbERpYWdyYW1JdGVtUHJvdmlkZXIgIT0gbnVsbCkgYWN0aXZpdHlEZXRhaWxEaWFncmFtSXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJaWYgKHJvbGVOb2RlSXRlbVByb3ZpZGVyICE9IG51bGwpIHJvbGVOb2RlSXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJaWYgKHJvbGVUYXNrQ29tcG9zaXRlSXRlbVByb3ZpZGVyICE9IG51bGwpIHJvbGVUYXNrQ29tcG9zaXRlSXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJaWYgKHRhc2tOb2RlSXRlbVByb3ZpZGVyICE9IG51bGwpIHRhc2tOb2RlSXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJaWYgKHdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVJdGVtUHJvdmlkZXIgIT0gbnVsbCkgd29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZUl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7Ci0JCWlmICh3b3JrQnJlYWtkb3duRWxlbWVudE5vZGVJdGVtUHJvdmlkZXIgIT0gbnVsbCkgd29ya0JyZWFrZG93bkVsZW1lbnROb2RlSXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJaWYgKHdvcmtQcm9kdWN0Q29tcG9zaXRlSXRlbVByb3ZpZGVyICE9IG51bGwpIHdvcmtQcm9kdWN0Q29tcG9zaXRlSXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL3Byb3ZpZGVyL05hbWVkTm9kZUl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvcHJvdmlkZXIvTmFtZWROb2RlSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyZjc2NTcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvcHJvdmlkZXIvTmFtZWROb2RlSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogTmFtZWROb2RlSXRlbVByb3ZpZGVyLmphdmEsdiAxLjEgMjAwOC8wMS8xNSAwODo1MzowMyBqdGhhbSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLnByb3ZpZGVyOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Nb2RlbFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTmFtZWROb2RlOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTmFtZWROb2RlfSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBOYW1lZE5vZGVJdGVtUHJvdmlkZXIKLQlleHRlbmRzIE5vZGVJdGVtUHJvdmlkZXIKLQlpbXBsZW1lbnRzCQotCQlJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwJCi0JCUlTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwJCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwJCi0JCUlJdGVtTGFiZWxQcm92aWRlciwJCi0JCUlJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTmFtZWROb2RlSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCWFkZE5hbWVQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIE5hbWUgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGROYW1lUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkCi0JCQkoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcgotCQkJCSgoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCSBnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkgZ2V0U3RyaW5nKCJfVUlfTmFtZWROb2RlX25hbWVfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJIGdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfTmFtZWROb2RlX25hbWVfZmVhdHVyZSIsICJfVUlfTmFtZWROb2RlX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkgTW9kZWxQYWNrYWdlLkxpdGVyYWxzLk5BTUVEX05PREVfX05BTUUsCi0JCQkJIHRydWUsCi0JCQkJIGZhbHNlLAotCQkJCSBmYWxzZSwKLQkJCQkgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLAotCQkJCSBudWxsLAotCQkJCSBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIE5hbWVkTm9kZS5naWYuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9OYW1lZE5vZGUiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoTmFtZWROb2RlKW9iamVjdCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8KLQkJCWdldFN0cmluZygiX1VJX05hbWVkTm9kZV90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQlnZXRTdHJpbmcoIl9VSV9OYW1lZE5vZGVfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0KLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKE5hbWVkTm9kZS5jbGFzcykpIHsKLQkJCWNhc2UgTW9kZWxQYWNrYWdlLk5BTUVEX05PREVfX05BTUU6Ci0JCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpLCBmYWxzZSwgdHJ1ZSkpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbgotCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIERpYWdyYW1FZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvcHJvdmlkZXIvTm9kZUNvbnRhaW5lckl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvcHJvdmlkZXIvTm9kZUNvbnRhaW5lckl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YWQ5YjMwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL3Byb3ZpZGVyL05vZGVDb250YWluZXJJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzMyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBOb2RlQ29udGFpbmVySXRlbVByb3ZpZGVyLmphdmEsdiAxLjEgMjAwOC8wMS8xNSAwODo1MzowMyBqdGhhbSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLnByb3ZpZGVyOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk1vZGVsRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Nb2RlbFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZUNvbnRhaW5lcjsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGVDb250YWluZXJ9IG9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIE5vZGVDb250YWluZXJJdGVtUHJvdmlkZXIKLQlleHRlbmRzIE5vZGVJdGVtUHJvdmlkZXIKLQlpbXBsZW1lbnRzCQotCQlJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwJCi0JCUlTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwJCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwJCi0JCUlJdGVtTGFiZWxQcm92aWRlciwJCi0JCUlJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm9kZUNvbnRhaW5lckl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIExpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgc3BlY2lmaWVzIGhvdyB0byBpbXBsZW1lbnQge0BsaW5rICNnZXRDaGlsZHJlbn0gYW5kIGlzIHVzZWQgdG8gZGVkdWNlIGFuIGFwcHJvcHJpYXRlIGZlYXR1cmUgZm9yIGFuCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQWRkQ29tbWFuZH0sIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLlJlbW92ZUNvbW1hbmR9IG9yCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuTW92ZUNvbW1hbmR9IGluIHtAbGluayAjY3JlYXRlQ29tbWFuZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIENvbGxlY3Rpb248PyBleHRlbmRzIEVTdHJ1Y3R1cmFsRmVhdHVyZT4gZ2V0Q2hpbGRyZW5GZWF0dXJlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlbkZlYXR1cmVzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldENoaWxkcmVuRmVhdHVyZXMob2JqZWN0KTsKLQkJCWNoaWxkcmVuRmVhdHVyZXMuYWRkKE1vZGVsUGFja2FnZS5MaXRlcmFscy5OT0RFX0NPTlRBSU5FUl9fTk9ERVMpOwotCQl9Ci0JCXJldHVybiBjaGlsZHJlbkZlYXR1cmVzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFU3RydWN0dXJhbEZlYXR1cmUgZ2V0Q2hpbGRGZWF0dXJlKE9iamVjdCBvYmplY3QsIE9iamVjdCBjaGlsZCkgewotCQkvLyBDaGVjayB0aGUgdHlwZSBvZiB0aGUgc3BlY2lmaWVkIGNoaWxkIG9iamVjdCBhbmQgcmV0dXJuIHRoZSBwcm9wZXIgZmVhdHVyZSB0byB1c2UgZm9yCi0JCS8vIGFkZGluZyAoc2VlIHtAbGluayBBZGRDb21tYW5kfSkgaXQgYXMgYSBjaGlsZC4KLQotCQlyZXR1cm4gc3VwZXIuZ2V0Q2hpbGRGZWF0dXJlKG9iamVjdCwgY2hpbGQpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJUG9pbnQgbGFiZWxWYWx1ZSA9ICgoTm9kZUNvbnRhaW5lcilvYmplY3QpLmdldExvY2F0aW9uKCk7Ci0JCVN0cmluZyBsYWJlbCA9IGxhYmVsVmFsdWUgPT0gbnVsbCA/IG51bGwgOiBsYWJlbFZhbHVlLnRvU3RyaW5nKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPwotCQkJZ2V0U3RyaW5nKCJfVUlfTm9kZUNvbnRhaW5lcl90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQlnZXRTdHJpbmcoIl9VSV9Ob2RlQ29udGFpbmVyX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCi0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChOb2RlQ29udGFpbmVyLmNsYXNzKSkgewotCQkJY2FzZSBNb2RlbFBhY2thZ2UuTk9ERV9DT05UQUlORVJfX05PREVTOgotCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKSwgdHJ1ZSwgZmFsc2UpKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4KLQkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQKLQkJCShjcmVhdGVDaGlsZFBhcmFtZXRlcgotCQkJCShNb2RlbFBhY2thZ2UuTGl0ZXJhbHMuTk9ERV9DT05UQUlORVJfX05PREVTLAotCQkJCSBNb2RlbEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZURpYWdyYW0oKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkCi0JCQkoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIKLQkJCQkoTW9kZWxQYWNrYWdlLkxpdGVyYWxzLk5PREVfQ09OVEFJTkVSX19OT0RFUywKLQkJCQkgTW9kZWxGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVOYW1lZE5vZGUoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkCi0JCQkoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIKLQkJCQkoTW9kZWxQYWNrYWdlLkxpdGVyYWxzLk5PREVfQ09OVEFJTkVSX19OT0RFUywKLQkJCQkgTW9kZWxGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVBY3Rpdml0eURpYWdyYW0oKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkCi0JCQkoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIKLQkJCQkoTW9kZWxQYWNrYWdlLkxpdGVyYWxzLk5PREVfQ09OVEFJTkVSX19OT0RFUywKLQkJCQkgTW9kZWxGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVUeXBlZE5vZGUoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkCi0JCQkoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIKLQkJCQkoTW9kZWxQYWNrYWdlLkxpdGVyYWxzLk5PREVfQ09OVEFJTkVSX19OT0RFUywKLQkJCQkgTW9kZWxGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVXb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZAotCQkJKGNyZWF0ZUNoaWxkUGFyYW1ldGVyCi0JCQkJKE1vZGVsUGFja2FnZS5MaXRlcmFscy5OT0RFX0NPTlRBSU5FUl9fTk9ERVMsCi0JCQkJIE1vZGVsRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlV29ya1Byb2R1Y3ROb2RlKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZAotCQkJKGNyZWF0ZUNoaWxkUGFyYW1ldGVyCi0JCQkJKE1vZGVsUGFja2FnZS5MaXRlcmFscy5OT0RFX0NPTlRBSU5FUl9fTk9ERVMsCi0JCQkJIE1vZGVsRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQWN0aXZpdHlEZXRhaWxEaWFncmFtKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZAotCQkJKGNyZWF0ZUNoaWxkUGFyYW1ldGVyCi0JCQkJKE1vZGVsUGFja2FnZS5MaXRlcmFscy5OT0RFX0NPTlRBSU5FUl9fTk9ERVMsCi0JCQkJIE1vZGVsRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUm9sZU5vZGUoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkCi0JCQkoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIKLQkJCQkoTW9kZWxQYWNrYWdlLkxpdGVyYWxzLk5PREVfQ09OVEFJTkVSX19OT0RFUywKLQkJCQkgTW9kZWxGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVSb2xlVGFza0NvbXBvc2l0ZSgpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQKLQkJCShjcmVhdGVDaGlsZFBhcmFtZXRlcgotCQkJCShNb2RlbFBhY2thZ2UuTGl0ZXJhbHMuTk9ERV9DT05UQUlORVJfX05PREVTLAotCQkJCSBNb2RlbEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVRhc2tOb2RlKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZAotCQkJKGNyZWF0ZUNoaWxkUGFyYW1ldGVyCi0JCQkJKE1vZGVsUGFja2FnZS5MaXRlcmFscy5OT0RFX0NPTlRBSU5FUl9fTk9ERVMsCi0JCQkJIE1vZGVsRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZSgpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQKLQkJCShjcmVhdGVDaGlsZFBhcmFtZXRlcgotCQkJCShNb2RlbFBhY2thZ2UuTGl0ZXJhbHMuTk9ERV9DT05UQUlORVJfX05PREVTLAotCQkJCSBNb2RlbEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVdvcmtCcmVha2Rvd25FbGVtZW50Tm9kZSgpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQKLQkJCShjcmVhdGVDaGlsZFBhcmFtZXRlcgotCQkJCShNb2RlbFBhY2thZ2UuTGl0ZXJhbHMuTk9ERV9DT05UQUlORVJfX05PREVTLAotCQkJCSBNb2RlbEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVdvcmtQcm9kdWN0Q29tcG9zaXRlKCkpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIERpYWdyYW1FZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvcHJvdmlkZXIvTm9kZUl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvcHJvdmlkZXIvTm9kZUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NWEzY2U3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL3Byb3ZpZGVyL05vZGVJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBOb2RlSXRlbVByb3ZpZGVyLmphdmEsdiAxLjEgMjAwOC8wMS8xNSAwODo1MzowMyBqdGhhbSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLnByb3ZpZGVyOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Nb2RlbEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTW9kZWxQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGU7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlfSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBOb2RlSXRlbVByb3ZpZGVyCi0JZXh0ZW5kcyBMaW5rZWRPYmplY3RJdGVtUHJvdmlkZXIKLQlpbXBsZW1lbnRzCQotCQlJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwJCi0JCUlTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwJCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwJCi0JCUlJdGVtTGFiZWxQcm92aWRlciwJCi0JCUlJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm9kZUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIExpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlhZGRMb2NhdGlvblByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkV2lkdGhQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZEhlaWdodFByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkSW5jb21pbmdDb25uZWN0aW9uc1Byb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkUmVhZE9ubHlQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIExvY2F0aW9uIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkTG9jYXRpb25Qcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQKLQkJCShjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yCi0JCQkJKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSlhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJIGdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCSBnZXRTdHJpbmcoIl9VSV9Ob2RlX2xvY2F0aW9uX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCSBnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX05vZGVfbG9jYXRpb25fZmVhdHVyZSIsICJfVUlfTm9kZV90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJIE1vZGVsUGFja2FnZS5MaXRlcmFscy5OT0RFX19MT0NBVElPTiwKLQkJCQkgdHJ1ZSwKLQkJCQkgZmFsc2UsCi0JCQkJIGZhbHNlLAotCQkJCSBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsCi0JCQkJIG51bGwsCi0JCQkJIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgV2lkdGggZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRXaWR0aFByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZAotCQkJKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IKLQkJCQkoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkgZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJIGdldFN0cmluZygiX1VJX05vZGVfd2lkdGhfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJIGdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfTm9kZV93aWR0aF9mZWF0dXJlIiwgIl9VSV9Ob2RlX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkgTW9kZWxQYWNrYWdlLkxpdGVyYWxzLk5PREVfX1dJRFRILAotCQkJCSB0cnVlLAotCQkJCSBmYWxzZSwKLQkJCQkgZmFsc2UsCi0JCQkJIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuSU5URUdSQUxfVkFMVUVfSU1BR0UsCi0JCQkJIG51bGwsCi0JCQkJIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgSGVpZ2h0IGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkSGVpZ2h0UHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkCi0JCQkoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcgotCQkJCSgoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCSBnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkgZ2V0U3RyaW5nKCJfVUlfTm9kZV9oZWlnaHRfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJIGdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfTm9kZV9oZWlnaHRfZmVhdHVyZSIsICJfVUlfTm9kZV90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJIE1vZGVsUGFja2FnZS5MaXRlcmFscy5OT0RFX19IRUlHSFQsCi0JCQkJIHRydWUsCi0JCQkJIGZhbHNlLAotCQkJCSBmYWxzZSwKLQkJCQkgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5JTlRFR1JBTF9WQUxVRV9JTUFHRSwKLQkJCQkgbnVsbCwKLQkJCQkgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBJbmNvbWluZyBDb25uZWN0aW9ucyBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEluY29taW5nQ29ubmVjdGlvbnNQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQKLQkJCShjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yCi0JCQkJKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSlhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJIGdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCSBnZXRTdHJpbmcoIl9VSV9Ob2RlX2luY29taW5nQ29ubmVjdGlvbnNfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJIGdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfTm9kZV9pbmNvbWluZ0Nvbm5lY3Rpb25zX2ZlYXR1cmUiLCAiX1VJX05vZGVfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCSBNb2RlbFBhY2thZ2UuTGl0ZXJhbHMuTk9ERV9fSU5DT01JTkdfQ09OTkVDVElPTlMsCi0JCQkJIHRydWUsCi0JCQkJIGZhbHNlLAotCQkJCSB0cnVlLAotCQkJCSBudWxsLAotCQkJCSBudWxsLAotCQkJCSBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFJlYWQgT25seSBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFJlYWRPbmx5UHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkCi0JCQkoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcgotCQkJCSgoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCSBnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkgZ2V0U3RyaW5nKCJfVUlfTm9kZV9yZWFkT25seV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkgZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9Ob2RlX3JlYWRPbmx5X2ZlYXR1cmUiLCAiX1VJX05vZGVfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCSBNb2RlbFBhY2thZ2UuTGl0ZXJhbHMuTk9ERV9fUkVBRF9PTkxZLAotCQkJCSB0cnVlLAotCQkJCSBmYWxzZSwKLQkJCQkgZmFsc2UsCi0JCQkJIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuQk9PTEVBTl9WQUxVRV9JTUFHRSwKLQkJCQkgbnVsbCwKLQkJCQkgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgc3BlY2lmaWVzIGhvdyB0byBpbXBsZW1lbnQge0BsaW5rICNnZXRDaGlsZHJlbn0gYW5kIGlzIHVzZWQgdG8gZGVkdWNlIGFuIGFwcHJvcHJpYXRlIGZlYXR1cmUgZm9yIGFuCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQWRkQ29tbWFuZH0sIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLlJlbW92ZUNvbW1hbmR9IG9yCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuTW92ZUNvbW1hbmR9IGluIHtAbGluayAjY3JlYXRlQ29tbWFuZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIENvbGxlY3Rpb248PyBleHRlbmRzIEVTdHJ1Y3R1cmFsRmVhdHVyZT4gZ2V0Q2hpbGRyZW5GZWF0dXJlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlbkZlYXR1cmVzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldENoaWxkcmVuRmVhdHVyZXMob2JqZWN0KTsKLQkJCWNoaWxkcmVuRmVhdHVyZXMuYWRkKE1vZGVsUGFja2FnZS5MaXRlcmFscy5OT0RFX19PVVRHT0lOR19DT05ORUNUSU9OUyk7Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuRmVhdHVyZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVTdHJ1Y3R1cmFsRmVhdHVyZSBnZXRDaGlsZEZlYXR1cmUoT2JqZWN0IG9iamVjdCwgT2JqZWN0IGNoaWxkKSB7Ci0JCS8vIENoZWNrIHRoZSB0eXBlIG9mIHRoZSBzcGVjaWZpZWQgY2hpbGQgb2JqZWN0IGFuZCByZXR1cm4gdGhlIHByb3BlciBmZWF0dXJlIHRvIHVzZSBmb3IKLQkJLy8gYWRkaW5nIChzZWUge0BsaW5rIEFkZENvbW1hbmR9KSBpdCBhcyBhIGNoaWxkLgotCi0JCXJldHVybiBzdXBlci5nZXRDaGlsZEZlYXR1cmUob2JqZWN0LCBjaGlsZCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlQb2ludCBsYWJlbFZhbHVlID0gKChOb2RlKW9iamVjdCkuZ2V0TG9jYXRpb24oKTsKLQkJU3RyaW5nIGxhYmVsID0gbGFiZWxWYWx1ZSA9PSBudWxsID8gbnVsbCA6IGxhYmVsVmFsdWUudG9TdHJpbmcoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/Ci0JCQlnZXRTdHJpbmcoIl9VSV9Ob2RlX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCWdldFN0cmluZygiX1VJX05vZGVfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0KLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKE5vZGUuY2xhc3MpKSB7Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5OT0RFX19MT0NBVElPTjoKLQkJCWNhc2UgTW9kZWxQYWNrYWdlLk5PREVfX1dJRFRIOgotCQkJY2FzZSBNb2RlbFBhY2thZ2UuTk9ERV9fSEVJR0hUOgotCQkJY2FzZSBNb2RlbFBhY2thZ2UuTk9ERV9fUkVBRF9PTkxZOgotCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKSwgZmFsc2UsIHRydWUpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5OT0RFX19PVVRHT0lOR19DT05ORUNUSU9OUzoKLQkJCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCksIHRydWUsIGZhbHNlKSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuCi0JICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkCi0JCQkoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIKLQkJCQkoTW9kZWxQYWNrYWdlLkxpdGVyYWxzLk5PREVfX09VVEdPSU5HX0NPTk5FQ1RJT05TLAotCQkJCSBNb2RlbEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUxpbmsoKSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gRGlhZ3JhbUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9wcm92aWRlci9Sb2xlTm9kZUl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvcHJvdmlkZXIvUm9sZU5vZGVJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmVlNzRkMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9wcm92aWRlci9Sb2xlTm9kZUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFJvbGVOb2RlSXRlbVByb3ZpZGVyLmphdmEsdiAxLjEgMjAwOC8wMS8xNSAwODo1MzowMyBqdGhhbSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLnByb3ZpZGVyOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuUm9sZU5vZGU7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Sb2xlTm9kZX0gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUm9sZU5vZGVJdGVtUHJvdmlkZXIKLQlleHRlbmRzIE5hbWVkTm9kZUl0ZW1Qcm92aWRlcgotCWltcGxlbWVudHMJCi0JCUlFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLAkKLQkJSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAkKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLAkKLQkJSUl0ZW1MYWJlbFByb3ZpZGVyLAkKLQkJSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSb2xlTm9kZUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIExpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBSb2xlTm9kZS5naWYuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9Sb2xlTm9kZSIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChSb2xlTm9kZSlvYmplY3QpLmdldE5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/Ci0JCQlnZXRTdHJpbmcoIl9VSV9Sb2xlTm9kZV90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQlnZXRTdHJpbmcoIl9VSV9Sb2xlTm9kZV90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4KLQkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBEaWFncmFtRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL3Byb3ZpZGVyL1JvbGVUYXNrQ29tcG9zaXRlSXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9wcm92aWRlci9Sb2xlVGFza0NvbXBvc2l0ZUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNTY4MjRjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL3Byb3ZpZGVyL1JvbGVUYXNrQ29tcG9zaXRlSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogUm9sZVRhc2tDb21wb3NpdGVJdGVtUHJvdmlkZXIuamF2YSx2IDEuMSAyMDA4LzAxLzE1IDA4OjUzOjAzIGp0aGFtIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwucHJvdmlkZXI7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk1vZGVsUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Sb2xlVGFza0NvbXBvc2l0ZTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLlJvbGVUYXNrQ29tcG9zaXRlfSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBSb2xlVGFza0NvbXBvc2l0ZUl0ZW1Qcm92aWRlcgotCWV4dGVuZHMgTm9kZUNvbnRhaW5lckl0ZW1Qcm92aWRlcgotCWltcGxlbWVudHMJCi0JCUlFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLAkKLQkJSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAkKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLAkKLQkJSUl0ZW1MYWJlbFByb3ZpZGVyLAkKLQkJSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSb2xlVGFza0NvbXBvc2l0ZUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIExpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlhZGRSb3dJbmRleFByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgUm93IEluZGV4IGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkUm93SW5kZXhQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQKLQkJCShjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yCi0JCQkJKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSlhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJIGdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCSBnZXRTdHJpbmcoIl9VSV9Sb2xlVGFza0NvbXBvc2l0ZV9yb3dJbmRleF9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkgZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9Sb2xlVGFza0NvbXBvc2l0ZV9yb3dJbmRleF9mZWF0dXJlIiwgIl9VSV9Sb2xlVGFza0NvbXBvc2l0ZV90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJIE1vZGVsUGFja2FnZS5MaXRlcmFscy5ST0xFX1RBU0tfQ09NUE9TSVRFX19ST1dfSU5ERVgsCi0JCQkJIHRydWUsCi0JCQkJIGZhbHNlLAotCQkJCSBmYWxzZSwKLQkJCQkgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5JTlRFR1JBTF9WQUxVRV9JTUFHRSwKLQkJCQkgbnVsbCwKLQkJCQkgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBSb2xlVGFza0NvbXBvc2l0ZS5naWYuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9Sb2xlVGFza0NvbXBvc2l0ZSIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJUG9pbnQgbGFiZWxWYWx1ZSA9ICgoUm9sZVRhc2tDb21wb3NpdGUpb2JqZWN0KS5nZXRMb2NhdGlvbigpOwotCQlTdHJpbmcgbGFiZWwgPSBsYWJlbFZhbHVlID09IG51bGwgPyBudWxsIDogbGFiZWxWYWx1ZS50b1N0cmluZygpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8KLQkJCWdldFN0cmluZygiX1VJX1JvbGVUYXNrQ29tcG9zaXRlX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCWdldFN0cmluZygiX1VJX1JvbGVUYXNrQ29tcG9zaXRlX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCi0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChSb2xlVGFza0NvbXBvc2l0ZS5jbGFzcykpIHsKLQkJCWNhc2UgTW9kZWxQYWNrYWdlLlJPTEVfVEFTS19DT01QT1NJVEVfX1JPV19JTkRFWDoKLQkJCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCksIGZhbHNlLCB0cnVlKSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuCi0JICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gRGlhZ3JhbUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9wcm92aWRlci9UYXNrTm9kZUl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvcHJvdmlkZXIvVGFza05vZGVJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjUyNzljZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9wcm92aWRlci9UYXNrTm9kZUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFRhc2tOb2RlSXRlbVByb3ZpZGVyLmphdmEsdiAxLjEgMjAwOC8wMS8xNSAwODo1MzowMyBqdGhhbSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLnByb3ZpZGVyOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk1vZGVsUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5UYXNrTm9kZTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLlRhc2tOb2RlfSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBUYXNrTm9kZUl0ZW1Qcm92aWRlcgotCWV4dGVuZHMgTmFtZWROb2RlSXRlbVByb3ZpZGVyCi0JaW1wbGVtZW50cwkKLQkJSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsCQotCQlJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCQotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsCQotCQlJSXRlbUxhYmVsUHJvdmlkZXIsCQotCQlJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFRhc2tOb2RlSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCWFkZEluZGV4UHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBJbmRleCBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEluZGV4UHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkCi0JCQkoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcgotCQkJCSgoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCSBnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkgZ2V0U3RyaW5nKCJfVUlfVGFza05vZGVfaW5kZXhfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJIGdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfVGFza05vZGVfaW5kZXhfZmVhdHVyZSIsICJfVUlfVGFza05vZGVfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCSBNb2RlbFBhY2thZ2UuTGl0ZXJhbHMuVEFTS19OT0RFX19JTkRFWCwKLQkJCQkgdHJ1ZSwKLQkJCQkgZmFsc2UsCi0JCQkJIGZhbHNlLAotCQkJCSBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLklOVEVHUkFMX1ZBTFVFX0lNQUdFLAotCQkJCSBudWxsLAotCQkJCSBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIFRhc2tOb2RlLmdpZi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKCJmdWxsL29iajE2L1Rhc2tOb2RlIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKFRhc2tOb2RlKW9iamVjdCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8KLQkJCWdldFN0cmluZygiX1VJX1Rhc2tOb2RlX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCWdldFN0cmluZygiX1VJX1Rhc2tOb2RlX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCi0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChUYXNrTm9kZS5jbGFzcykpIHsKLQkJCWNhc2UgTW9kZWxQYWNrYWdlLlRBU0tfTk9ERV9fSU5ERVg6Ci0JCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpLCBmYWxzZSwgdHJ1ZSkpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbgotCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIERpYWdyYW1FZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvcHJvdmlkZXIvVHlwZWROb2RlSXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9wcm92aWRlci9UeXBlZE5vZGVJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjRhMjI2MC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9wcm92aWRlci9UeXBlZE5vZGVJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBUeXBlZE5vZGVJdGVtUHJvdmlkZXIuamF2YSx2IDEuMSAyMDA4LzAxLzE1IDA4OjUzOjAzIGp0aGFtIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwucHJvdmlkZXI7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Nb2RlbFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuVHlwZWROb2RlOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuVHlwZWROb2RlfSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBUeXBlZE5vZGVJdGVtUHJvdmlkZXIKLQlleHRlbmRzIE5vZGVJdGVtUHJvdmlkZXIKLQlpbXBsZW1lbnRzCQotCQlJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwJCi0JCUlTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwJCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwJCi0JCUlJdGVtTGFiZWxQcm92aWRlciwJCi0JCUlJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVHlwZWROb2RlSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCWFkZFR5cGVQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFR5cGUgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRUeXBlUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkCi0JCQkoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcgotCQkJCSgoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCSBnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkgZ2V0U3RyaW5nKCJfVUlfVHlwZWROb2RlX3R5cGVfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJIGdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfVHlwZWROb2RlX3R5cGVfZmVhdHVyZSIsICJfVUlfVHlwZWROb2RlX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkgTW9kZWxQYWNrYWdlLkxpdGVyYWxzLlRZUEVEX05PREVfX1RZUEUsCi0JCQkJIHRydWUsCi0JCQkJIGZhbHNlLAotCQkJCSBmYWxzZSwKLQkJCQkgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5JTlRFR1JBTF9WQUxVRV9JTUFHRSwKLQkJCQkgbnVsbCwKLQkJCQkgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBUeXBlZE5vZGUuZ2lmLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvVHlwZWROb2RlIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlQb2ludCBsYWJlbFZhbHVlID0gKChUeXBlZE5vZGUpb2JqZWN0KS5nZXRMb2NhdGlvbigpOwotCQlTdHJpbmcgbGFiZWwgPSBsYWJlbFZhbHVlID09IG51bGwgPyBudWxsIDogbGFiZWxWYWx1ZS50b1N0cmluZygpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8KLQkJCWdldFN0cmluZygiX1VJX1R5cGVkTm9kZV90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQlnZXRTdHJpbmcoIl9VSV9UeXBlZE5vZGVfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0KLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKFR5cGVkTm9kZS5jbGFzcykpIHsKLQkJCWNhc2UgTW9kZWxQYWNrYWdlLlRZUEVEX05PREVfX1RZUEU6Ci0JCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpLCBmYWxzZSwgdHJ1ZSkpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbgotCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIERpYWdyYW1FZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvcHJvdmlkZXIvV29ya0JyZWFrZG93bkVsZW1lbnROb2RlSXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9wcm92aWRlci9Xb3JrQnJlYWtkb3duRWxlbWVudE5vZGVJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTU1NDg3ZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9wcm92aWRlci9Xb3JrQnJlYWtkb3duRWxlbWVudE5vZGVJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBXb3JrQnJlYWtkb3duRWxlbWVudE5vZGVJdGVtUHJvdmlkZXIuamF2YSx2IDEuMSAyMDA4LzAxLzE1IDA4OjUzOjAzIGp0aGFtIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwucHJvdmlkZXI7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Xb3JrQnJlYWtkb3duRWxlbWVudE5vZGU7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Xb3JrQnJlYWtkb3duRWxlbWVudE5vZGV9IG9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFdvcmtCcmVha2Rvd25FbGVtZW50Tm9kZUl0ZW1Qcm92aWRlcgotCWV4dGVuZHMgTmFtZWROb2RlSXRlbVByb3ZpZGVyCi0JaW1wbGVtZW50cwkKLQkJSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsCQotCQlJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCQotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsCQotCQlJSXRlbUxhYmVsUHJvdmlkZXIsCQotCQlJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFdvcmtCcmVha2Rvd25FbGVtZW50Tm9kZUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIExpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBXb3JrQnJlYWtkb3duRWxlbWVudE5vZGUuZ2lmLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvV29ya0JyZWFrZG93bkVsZW1lbnROb2RlIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKFdvcmtCcmVha2Rvd25FbGVtZW50Tm9kZSlvYmplY3QpLmdldE5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/Ci0JCQlnZXRTdHJpbmcoIl9VSV9Xb3JrQnJlYWtkb3duRWxlbWVudE5vZGVfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJZ2V0U3RyaW5nKCJfVUlfV29ya0JyZWFrZG93bkVsZW1lbnROb2RlX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbgotCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIERpYWdyYW1FZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvcHJvdmlkZXIvV29ya1Byb2R1Y3RDb21wb3NpdGVJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL3Byb3ZpZGVyL1dvcmtQcm9kdWN0Q29tcG9zaXRlSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3ZmQ3N2IuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvcHJvdmlkZXIvV29ya1Byb2R1Y3RDb21wb3NpdGVJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBXb3JrUHJvZHVjdENvbXBvc2l0ZUl0ZW1Qcm92aWRlci5qYXZhLHYgMS4xIDIwMDgvMDEvMTUgMDg6NTM6MDMganRoYW0gRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5wcm92aWRlcjsKLQotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk1vZGVsUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Xb3JrUHJvZHVjdENvbXBvc2l0ZTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLldvcmtQcm9kdWN0Q29tcG9zaXRlfSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBXb3JrUHJvZHVjdENvbXBvc2l0ZUl0ZW1Qcm92aWRlcgotCWV4dGVuZHMgTm9kZUNvbnRhaW5lckl0ZW1Qcm92aWRlcgotCWltcGxlbWVudHMJCi0JCUlFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLAkKLQkJSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAkKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLAkKLQkJSUl0ZW1MYWJlbFByb3ZpZGVyLAkKLQkJSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBXb3JrUHJvZHVjdENvbXBvc2l0ZUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIExpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlhZGRUeXBlUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBUeXBlIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkVHlwZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZAotCQkJKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IKLQkJCQkoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkgZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJIGdldFN0cmluZygiX1VJX1dvcmtQcm9kdWN0Q29tcG9zaXRlX3R5cGVfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJIGdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfV29ya1Byb2R1Y3RDb21wb3NpdGVfdHlwZV9mZWF0dXJlIiwgIl9VSV9Xb3JrUHJvZHVjdENvbXBvc2l0ZV90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJIE1vZGVsUGFja2FnZS5MaXRlcmFscy5XT1JLX1BST0RVQ1RfQ09NUE9TSVRFX19UWVBFLAotCQkJCSB0cnVlLAotCQkJCSBmYWxzZSwKLQkJCQkgZmFsc2UsCi0JCQkJIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuSU5URUdSQUxfVkFMVUVfSU1BR0UsCi0JCQkJIG51bGwsCi0JCQkJIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgV29ya1Byb2R1Y3RDb21wb3NpdGUuZ2lmLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvV29ya1Byb2R1Y3RDb21wb3NpdGUiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVBvaW50IGxhYmVsVmFsdWUgPSAoKFdvcmtQcm9kdWN0Q29tcG9zaXRlKW9iamVjdCkuZ2V0TG9jYXRpb24oKTsKLQkJU3RyaW5nIGxhYmVsID0gbGFiZWxWYWx1ZSA9PSBudWxsID8gbnVsbCA6IGxhYmVsVmFsdWUudG9TdHJpbmcoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/Ci0JCQlnZXRTdHJpbmcoIl9VSV9Xb3JrUHJvZHVjdENvbXBvc2l0ZV90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQlnZXRTdHJpbmcoIl9VSV9Xb3JrUHJvZHVjdENvbXBvc2l0ZV90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoV29ya1Byb2R1Y3RDb21wb3NpdGUuY2xhc3MpKSB7Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5XT1JLX1BST0RVQ1RfQ09NUE9TSVRFX19UWVBFOgotCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKSwgZmFsc2UsIHRydWUpKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4KLQkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBEaWFncmFtRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL3Byb3ZpZGVyL1dvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW1JdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL3Byb3ZpZGVyL1dvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW1JdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTQ5NDViOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9wcm92aWRlci9Xb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbUl0ZW1Qcm92aWRlci5qYXZhLHYgMS4xIDIwMDgvMDEvMTUgMDg6NTM6MDMganRoYW0gRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5wcm92aWRlcjsKLQotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Xb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbX0gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbUl0ZW1Qcm92aWRlcgotCWV4dGVuZHMgRGlhZ3JhbUl0ZW1Qcm92aWRlcgotCWltcGxlbWVudHMJCi0JCUlFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLAkKLQkJSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAkKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLAkKLQkJSUl0ZW1MYWJlbFByb3ZpZGVyLAkKLQkJSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBXb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIFdvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW0uZ2lmLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbSIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJUG9pbnQgbGFiZWxWYWx1ZSA9ICgoV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbSlvYmplY3QpLmdldExvY2F0aW9uKCk7Ci0JCVN0cmluZyBsYWJlbCA9IGxhYmVsVmFsdWUgPT0gbnVsbCA/IG51bGwgOiBsYWJlbFZhbHVlLnRvU3RyaW5nKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPwotCQkJZ2V0U3RyaW5nKCJfVUlfV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbV90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQlnZXRTdHJpbmcoIl9VSV9Xb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbgotCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIERpYWdyYW1FZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvcHJvdmlkZXIvV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZUl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvcHJvdmlkZXIvV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzNhNDQxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL3Byb3ZpZGVyL1dvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlSXRlbVByb3ZpZGVyLmphdmEsdiAxLjEgMjAwOC8wMS8xNSAwODo1MzowMyBqdGhhbSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLnByb3ZpZGVyOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLldvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGV9IG9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVJdGVtUHJvdmlkZXIKLQlleHRlbmRzIE5hbWVkTm9kZUl0ZW1Qcm92aWRlcgotCWltcGxlbWVudHMJCi0JCUlFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLAkKLQkJSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAkKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLAkKLQkJSUl0ZW1MYWJlbFByb3ZpZGVyLAkKLQkJSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIFdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGUuZ2lmLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZSIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlKW9iamVjdCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8KLQkJCWdldFN0cmluZygiX1VJX1dvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJZ2V0U3RyaW5nKCJfVUlfV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZV90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4KLQkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBEaWFncmFtRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL3Byb3ZpZGVyL1dvcmtQcm9kdWN0Tm9kZUl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvcHJvdmlkZXIvV29ya1Byb2R1Y3ROb2RlSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjNzY2OTQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvcHJvdmlkZXIvV29ya1Byb2R1Y3ROb2RlSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogV29ya1Byb2R1Y3ROb2RlSXRlbVByb3ZpZGVyLmphdmEsdiAxLjEgMjAwOC8wMS8xNSAwODo1MzowMyBqdGhhbSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLnByb3ZpZGVyOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Nb2RlbFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuV29ya1Byb2R1Y3ROb2RlOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuV29ya1Byb2R1Y3ROb2RlfSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBXb3JrUHJvZHVjdE5vZGVJdGVtUHJvdmlkZXIKLQlleHRlbmRzIE5hbWVkTm9kZUl0ZW1Qcm92aWRlcgotCWltcGxlbWVudHMJCi0JCUlFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLAkKLQkJSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAkKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLAkKLQkJSUl0ZW1MYWJlbFByb3ZpZGVyLAkKLQkJSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBXb3JrUHJvZHVjdE5vZGVJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJYWRkVHlwZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgVHlwZSBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFR5cGVQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQKLQkJCShjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yCi0JCQkJKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSlhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJIGdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCSBnZXRTdHJpbmcoIl9VSV9Xb3JrUHJvZHVjdE5vZGVfdHlwZV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkgZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9Xb3JrUHJvZHVjdE5vZGVfdHlwZV9mZWF0dXJlIiwgIl9VSV9Xb3JrUHJvZHVjdE5vZGVfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCSBNb2RlbFBhY2thZ2UuTGl0ZXJhbHMuV09SS19QUk9EVUNUX05PREVfX1RZUEUsCi0JCQkJIHRydWUsCi0JCQkJIGZhbHNlLAotCQkJCSBmYWxzZSwKLQkJCQkgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5JTlRFR1JBTF9WQUxVRV9JTUFHRSwKLQkJCQkgbnVsbCwKLQkJCQkgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBXb3JrUHJvZHVjdE5vZGUuZ2lmLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvV29ya1Byb2R1Y3ROb2RlIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKFdvcmtQcm9kdWN0Tm9kZSlvYmplY3QpLmdldE5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/Ci0JCQlnZXRTdHJpbmcoIl9VSV9Xb3JrUHJvZHVjdE5vZGVfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJZ2V0U3RyaW5nKCJfVUlfV29ya1Byb2R1Y3ROb2RlX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCi0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChXb3JrUHJvZHVjdE5vZGUuY2xhc3MpKSB7Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5XT1JLX1BST0RVQ1RfTk9ERV9fVFlQRToKLQkJCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCksIGZhbHNlLCB0cnVlKSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuCi0JICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gRGlhZ3JhbUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC8uY2xhc3NwYXRoIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDY1YWMwNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvLnByb2plY3QgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGFkZjE0NC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL01FVEEtSU5GL01BTklGRVNULk1GIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiY2FlMDkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw7c2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS41LjAucXVhbGlmaWVyCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LAotIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZSwKLSBvcmcuZWNsaXBzZS5kcmF3MmQsCi0gb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLAotIG9yZy5lY2xpcHNlLmVtZi53b3Jrc3BhY2UKLUVjbGlwc2UtTGF6eVN0YXJ0OiB0cnVlCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwsCi0gb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbCwKLSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC51dGlsCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL2J1aWxkLnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNzJlM2NkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLXNvdXJjZS4uID0gc3JjLwotb3V0cHV0Li4gPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSAuLFwKLSAgICAgICAgICAgICAgIC5wcm9qZWN0LFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sCi0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZWNvcmUgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmVjb3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MWZhNGQzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZWNvcmUKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGVjb3JlOkVQYWNrYWdlIHhtaTp2ZXJzaW9uPSIyLjAiCi0gICAgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICAgIHhtbG5zOmVjb3JlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIiBuYW1lPSJtb2RlbCIKLSAgICBuc1VSST0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvZGlhZ3JhbS8xLjAuMC9kaWFncmFtLmVjb3JlIiBuc1ByZWZpeD0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwiPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkRpYWdyYW0iIGVTdXBlclR5cGVzPSIjLy9Ob2RlQ29udGFpbmVyIi8+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iTGluayIgZVN1cGVyVHlwZXM9IiMvL0xpbmtlZE9iamVjdCI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im5hbWUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJzb3VyY2UiIGVUeXBlPSIjLy9Ob2RlIgotICAgICAgICBlT3Bwb3NpdGU9IiMvL05vZGUvb3V0Z29pbmdDb25uZWN0aW9ucyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ0YXJnZXQiIGVUeXBlPSIjLy9Ob2RlIgotICAgICAgICBlT3Bwb3NpdGU9IiMvL05vZGUvaW5jb21pbmdDb25uZWN0aW9ucyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJiZW5kcG9pbnRzIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL0Fic29sdXRlQmVuZHBvaW50IiB0cmFuc2llbnQ9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic291cmNlRW5kUG9pbnQiIGVUeXBlPSIjLy9Qb2ludCIKLSAgICAgICAgdHJhbnNpZW50PSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InRhcmdldEVuZFBvaW50IiBlVHlwZT0iIy8vUG9pbnQiCi0gICAgICAgIHRyYW5zaWVudD0idHJ1ZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJMaW5rZWRPYmplY3QiIGFic3RyYWN0PSJ0cnVlIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ibGlua2VkRWxlbWVudCIgZVR5cGU9ImVjb3JlOkVDbGFzcyAuLi8uLi9vcmcuZWNsaXBzZS5lcGYudW1hL21vZGVsLzEuMC40L3VtYS5lY29yZSMvL01ldGhvZEVsZW1lbnQiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iTmFtZWROb2RlIiBlU3VwZXJUeXBlcz0iIy8vTm9kZSI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im5hbWUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iTm9kZSIgYWJzdHJhY3Q9InRydWUiIGVTdXBlclR5cGVzPSIjLy9MaW5rZWRPYmplY3QiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJsb2NhdGlvbiIgZVR5cGU9IiMvL1BvaW50IgotICAgICAgICB0cmFuc2llbnQ9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0id2lkdGgiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VJbnQiCi0gICAgICAgIHRyYW5zaWVudD0idHJ1ZSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iLTEiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaGVpZ2h0IiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FSW50IgotICAgICAgICB0cmFuc2llbnQ9InRydWUiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9Ii0xIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImluY29taW5nQ29ubmVjdGlvbnMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vTGluayIgZU9wcG9zaXRlPSIjLy9MaW5rL3RhcmdldCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJvdXRnb2luZ0Nvbm5lY3Rpb25zIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL0xpbmsiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiIGVPcHBvc2l0ZT0iIy8vTGluay9zb3VyY2UiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmVhZE9ubHkiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkFjdGl2aXR5RGlhZ3JhbSIgZVN1cGVyVHlwZXM9IiMvL0RpYWdyYW0iLz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJUeXBlZE5vZGUiIGVTdXBlclR5cGVzPSIjLy9Ob2RlIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idHlwZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUludCIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJXb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtIiBlU3VwZXJUeXBlcz0iIy8vRGlhZ3JhbSIvPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IldvcmtQcm9kdWN0Tm9kZSIgZVN1cGVyVHlwZXM9IiMvL05hbWVkTm9kZSI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InR5cGUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VJbnQiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQWN0aXZpdHlEZXRhaWxEaWFncmFtIiBlU3VwZXJUeXBlcz0iIy8vRGlhZ3JhbSI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImF1dG9MYXlvdXQiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ik5vZGVDb250YWluZXIiIGFic3RyYWN0PSJ0cnVlIiBlU3VwZXJUeXBlcz0iIy8vTm9kZSI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im5vZGVzIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL05vZGUiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUm9sZU5vZGUiIGVTdXBlclR5cGVzPSIjLy9OYW1lZE5vZGUiLz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJSb2xlVGFza0NvbXBvc2l0ZSIgZVN1cGVyVHlwZXM9IiMvL05vZGVDb250YWluZXIiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyb3dJbmRleCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUludCIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJUYXNrTm9kZSIgZVN1cGVyVHlwZXM9IiMvL05hbWVkTm9kZSI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImluZGV4IiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FSW50IgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSItMSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlIiBlU3VwZXJUeXBlcz0iIy8vTmFtZWROb2RlIi8+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iV29ya0JyZWFrZG93bkVsZW1lbnROb2RlIiBlU3VwZXJUeXBlcz0iIy8vTmFtZWROb2RlIi8+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iV29ya1Byb2R1Y3RDb21wb3NpdGUiIGVTdXBlclR5cGVzPSIjLy9Ob2RlQ29udGFpbmVyIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idHlwZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUludCIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJBYnNvbHV0ZUJlbmRwb2ludCIgaW5zdGFuY2VDbGFzc05hbWU9Im9yZy5lY2xpcHNlLmRyYXcyZC5BYnNvbHV0ZUJlbmRwb2ludCIvPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IlBvaW50IiBpbnN0YW5jZUNsYXNzTmFtZT0ib3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50Ii8+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iUm9sZURlc2NyaXB0b3IiIGluc3RhbmNlQ2xhc3NOYW1lPSJvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdG9yIi8+Ci08L2Vjb3JlOkVQYWNrYWdlPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5nZW5tb2RlbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZ2VubW9kZWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1OTdkMzQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5nZW5tb2RlbAorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Z2VubW9kZWw6R2VuTW9kZWwgeG1pOnZlcnNpb249IjIuMCIKLSAgICB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOmVjb3JlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIgotICAgIHhtbG5zOmdlbm1vZGVsPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIiBtb2RlbERpcmVjdG9yeT0iL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL3NyYyIKLSAgICBlZGl0RGlyZWN0b3J5PSIvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uZWRpdC9zcmMiIG1vZGVsUGx1Z2luSUQ9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsIgotICAgIG1vZGVsTmFtZT0iRGlhZ3JhbSIgbm9uTkxTTWFya2Vycz0idHJ1ZSIgaW1wb3J0ZXJJRD0ib3JnLmVjbGlwc2UuZW1mLmltcG9ydGVyLmphdmEiCi0gICAgY29tcGxpYW5jZUxldmVsPSI1LjAiIGNvcHlyaWdodEZpZWxkcz0iZmFsc2UiIHVzZWRHZW5QYWNrYWdlcz0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLnVtYS9tb2RlbC8xLjAuNC91bWEuZ2VubW9kZWwjLy91bWEiPgotICA8Zm9yZWlnbk1vZGVsPkBtb2RlbDwvZm9yZWlnbk1vZGVsPgotICA8Z2VuUGFja2FnZXMgcHJlZml4PSJNb2RlbCIgYmFzZVBhY2thZ2U9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtIiBkaXNwb3NhYmxlUHJvdmlkZXJGYWN0b3J5PSJ0cnVlIgotICAgICAgZWNvcmVQYWNrYWdlPSJkaWFncmFtLmVjb3JlIy8iPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0iZGlhZ3JhbS5lY29yZSMvL0Fic29sdXRlQmVuZHBvaW50Ii8+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJkaWFncmFtLmVjb3JlIy8vUG9pbnQiLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9ImRpYWdyYW0uZWNvcmUjLy9Sb2xlRGVzY3JpcHRvciIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImRpYWdyYW0uZWNvcmUjLy9EaWFncmFtIiBsYWJlbEZlYXR1cmU9IiMvL21vZGVsL05vZGUvbG9jYXRpb24iLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJkaWFncmFtLmVjb3JlIy8vTGluayI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZGlhZ3JhbS5lY29yZSMvL0xpbmsvbmFtZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBkaWFncmFtLmVjb3JlIy8vTGluay9zb3VyY2UiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIHByb3BlcnR5U29ydENob2ljZXM9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBkaWFncmFtLmVjb3JlIy8vTGluay90YXJnZXQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBkaWFncmFtLmVjb3JlIy8vTGluay9iZW5kcG9pbnRzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZGlhZ3JhbS5lY29yZSMvL0xpbmsvc291cmNlRW5kUG9pbnQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBkaWFncmFtLmVjb3JlIy8vTGluay90YXJnZXRFbmRQb2ludCIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9ImRpYWdyYW0uZWNvcmUjLy9MaW5rZWRPYmplY3QiPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgcHJvcGVydHlTb3J0Q2hvaWNlcz0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGRpYWdyYW0uZWNvcmUjLy9MaW5rZWRPYmplY3QvbGlua2VkRWxlbWVudCIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJkaWFncmFtLmVjb3JlIy8vTmFtZWROb2RlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBkaWFncmFtLmVjb3JlIy8vTmFtZWROb2RlL25hbWUiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJkaWFncmFtLmVjb3JlIy8vTm9kZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZGlhZ3JhbS5lY29yZSMvL05vZGUvbG9jYXRpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBkaWFncmFtLmVjb3JlIy8vTm9kZS93aWR0aCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGRpYWdyYW0uZWNvcmUjLy9Ob2RlL2hlaWdodCIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgcHJvcGVydHlTb3J0Q2hvaWNlcz0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGRpYWdyYW0uZWNvcmUjLy9Ob2RlL2luY29taW5nQ29ubmVjdGlvbnMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgZGlhZ3JhbS5lY29yZSMvL05vZGUvb3V0Z29pbmdDb25uZWN0aW9ucyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGRpYWdyYW0uZWNvcmUjLy9Ob2RlL3JlYWRPbmx5Ii8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImRpYWdyYW0uZWNvcmUjLy9BY3Rpdml0eURpYWdyYW0iLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJkaWFncmFtLmVjb3JlIy8vVHlwZWROb2RlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBkaWFncmFtLmVjb3JlIy8vVHlwZWROb2RlL3R5cGUiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iZGlhZ3JhbS5lY29yZSMvL1dvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW0iLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJkaWFncmFtLmVjb3JlIy8vV29ya1Byb2R1Y3ROb2RlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBkaWFncmFtLmVjb3JlIy8vV29ya1Byb2R1Y3ROb2RlL3R5cGUiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iZGlhZ3JhbS5lY29yZSMvL0FjdGl2aXR5RGV0YWlsRGlhZ3JhbSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZGlhZ3JhbS5lY29yZSMvL0FjdGl2aXR5RGV0YWlsRGlhZ3JhbS9hdXRvTGF5b3V0Ii8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0iZGlhZ3JhbS5lY29yZSMvL05vZGVDb250YWluZXIiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBkaWFncmFtLmVjb3JlIy8vTm9kZUNvbnRhaW5lci9ub2RlcyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJkaWFncmFtLmVjb3JlIy8vUm9sZU5vZGUiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJkaWFncmFtLmVjb3JlIy8vUm9sZVRhc2tDb21wb3NpdGUiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGRpYWdyYW0uZWNvcmUjLy9Sb2xlVGFza0NvbXBvc2l0ZS9yb3dJbmRleCIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJkaWFncmFtLmVjb3JlIy8vVGFza05vZGUiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGRpYWdyYW0uZWNvcmUjLy9UYXNrTm9kZS9pbmRleCIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJkaWFncmFtLmVjb3JlIy8vV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZSIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImRpYWdyYW0uZWNvcmUjLy9Xb3JrQnJlYWtkb3duRWxlbWVudE5vZGUiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJkaWFncmFtLmVjb3JlIy8vV29ya1Byb2R1Y3RDb21wb3NpdGUiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGRpYWdyYW0uZWNvcmUjLy9Xb3JrUHJvZHVjdENvbXBvc2l0ZS90eXBlIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICA8L2dlblBhY2thZ2VzPgotPC9nZW5tb2RlbDpHZW5Nb2RlbD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL3BsdWdpbi5wcm9wZXJ0aWVzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkZjMzMGQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUgotCi0jIFBsdWctaW4KLXBsdWdpbk5hbWU9RVBGIERpYWdyYW0gTW9kZWwKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL3BsdWdpbi54bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYTNhMWQ3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPHBsdWdpbj4KLQotICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuZ2VuZXJhdGVkX3BhY2thZ2UiPgotICAgIDxwYWNrYWdlIAotICAgICAgIHVyaSA9ICJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi9kaWFncmFtLzEuMC4wL2RpYWdyYW0uZWNvcmUiIAotICAgICAgIGNsYXNzID0gIm9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk1vZGVsUGFja2FnZSIgLz4KLSAgPC9leHRlbnNpb24+Ci0gIDxleHRlbnNpb24KLSAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuZGlhZ3JhbU1hbmFnZXIiPgotICAgICA8ZGlhZ3JhbU1hbmFnZXIgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLnV0aWwuRGlhZ3JhbU1hbmFnZXIiLz4KLSAgPC9leHRlbnNpb24+Ci0KLTwvcGx1Z2luPgotCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvQWN0aXZpdHlEZXRhaWxEaWFncmFtLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvQWN0aXZpdHlEZXRhaWxEaWFncmFtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzMjQ3NzUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL0FjdGl2aXR5RGV0YWlsRGlhZ3JhbS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw7Ci0KLS8qKgotICogSW50ZXJmYWNlIGZvciBhY3Rpdml0eSBkZXRhaWwgZGlhZ3JhbSBtb2RlbCBvYmplY3QKLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAgMS4wCi0gKiBAbW9kZWwKLSAqLwotcHVibGljIGludGVyZmFjZSBBY3Rpdml0eURldGFpbERpYWdyYW0gZXh0ZW5kcyBEaWFncmFtIHsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkF1dG8gTGF5b3V0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5BdXRvIExheW91dDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BdXRvIExheW91dDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0QXV0b0xheW91dChib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTW9kZWxQYWNrYWdlI2dldEFjdGl2aXR5RGV0YWlsRGlhZ3JhbV9BdXRvTGF5b3V0KCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc0F1dG9MYXlvdXQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkFjdGl2aXR5RGV0YWlsRGlhZ3JhbSNpc0F1dG9MYXlvdXQgPGVtPkF1dG8gTGF5b3V0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BdXRvIExheW91dDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNBdXRvTGF5b3V0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRBdXRvTGF5b3V0KGJvb2xlYW4gdmFsdWUpOwotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvQWN0aXZpdHlEaWFncmFtLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvQWN0aXZpdHlEaWFncmFtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyMmIwMzcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL0FjdGl2aXR5RGlhZ3JhbS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw7Ci0KLS8qKgotICogSW50ZXJmYWNlIGZvciBhY3Rpdml0eSBkaWFncmFtIG1vZGVsIG9iamVjdAotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICogQG1vZGVsCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQWN0aXZpdHlEaWFncmFtIGV4dGVuZHMgRGlhZ3JhbSB7Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9EaWFncmFtLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvRGlhZ3JhbS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NWNlY2ZkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9EaWFncmFtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuU3VwcHJlc3Npb247Ci0KLS8qKgotICogQmFzZSBkaWFncmFtIGludGVyZmFjZQotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICogQG1vZGVsCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRGlhZ3JhbSBleHRlbmRzIE5vZGVDb250YWluZXIgewotCi0JLyoqCi0JICogR2V0cyB0aGUgVU1BIG1vZGVsIG9iamVjdCBmb3IgdGhpcyBkaWFncmFtCi0JICogCi0JICogQHJldHVybgotCSAqLwotCW9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbSBnZXRVTUFEaWFncmFtKCk7Ci0KLQkvKioKLQkgKiBTZXRzIGRlZmF1bHQgbmFtZSBmb3IgbmV3IG5vZGUKLQkgKiAKLQkgKiBAcGFyYW0gbmV3Tm9kZQotCSAqLwotCXZvaWQgc2V0RGVmYXVsdE5hbWUoTmFtZWROb2RlIG5ld05vZGUpOwotCi0JLyoqCi0JICogU2V0cyBhIHN1cHByZXNzaW9uIGluc3RhbmNlIGZvciB0aGlzIGRpYWdyYW0KLQkgKiAKLQkgKiBAcGFyYW0gc3VwcHJlc3Npb24KLQkgKi8KLQl2b2lkIHNldFN1cHByZXNzaW9uKFN1cHByZXNzaW9uIHN1cHByZXNzaW9uKTsKLQotCS8qKgotCSAqIEdldHMgdGhlIHN1cHByZXNzaW9uIGluc3RhbmNlIHVzZWQgaW4gdGhpcyBkaWFncmFtCi0JICogCi0JICogQHJldHVybgotCSAqLwotCVN1cHByZXNzaW9uIGdldFN1cHByZXNzaW9uKCk7Ci0KLQkvKioKLQkgKiBTZXRzIGZpbHRlciB1c2VkIHRvIHRvIGZpbHRlciBkaWFncmFtIGVsZW1lbnRzIGluIHRoaXMgZGlhZ3JhbQotCSAqIAotCSAqIEBwYXJhbSBmaWx0ZXIKLQkgKi8KLQl2b2lkIHNldEZpbHRlcihJRmlsdGVyIGZpbHRlcik7Ci0KLQkvKioKLQkgKiBDaGVja3MgaWYgdGhpcyBkaWFncmFtIGlzIG5ld2x5IGNyZWF0ZWQgYW5kIG5vdCBzYXZlZCB5ZXQpCi0JICogCi0JICogQHJldHVybgotCSAqLwotCWJvb2xlYW4gaXNOZXcoKTsKLQotCS8qKgotCSAqIFNldHMgb3IgdW5zZXRzIHRoZSBpc05ldyBmbGFnIG9mIHRoaXMgZGlhZ3JhbQotCSAqIAotCSAqIEBwYXJhbSBuCi0JICogQHNlZSAjaXNOZXcoKQotCSAqLwotCXZvaWQgc2V0TmV3KGJvb2xlYW4gbik7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL0RpYWdyYW1SZXNvdXJjZXMuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9EaWFncmFtUmVzb3VyY2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1ZDUwNzcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL0RpYWdyYW1SZXNvdXJjZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLS8qKgotICogVGhlIHJlc291cmNlIGNsYXNzIG9mIGRpYWdyYW0gcGx1Z2luCi0gKiAKLSAqIEBzaW5jZSAgMS4wCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBEaWFncmFtUmVzb3VyY2VzIGV4dGVuZHMgTkxTIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5SZXNvdXJjZXMiOy8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgRGlhZ3JhbVJlc291cmNlcygpIHsKLQkJLy8gRG8gbm90IGluc3RhbnRpYXRlCi0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdHlwZV9hY3Rpdml0eTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkZWZhdWx0QmFzZU5hbWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgdHlwZV9XUEQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgdHlwZV9hY3Rpdml0eURldGFpbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhZGRGcmVlVHh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHR5cGVfdW5rbm93bjsKLQotCXN0YXRpYyB7Ci0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIERpYWdyYW1SZXNvdXJjZXMuY2xhc3MpOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9MaW5rLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvTGluay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOWJmNjdlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9MaW5rLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuQWJzb2x1dGVCZW5kcG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLQotLyoqCi0gKiBUaGlzIGludGVyZmFjZSByZXByZXNlbnRzIG1vZGVsIG9iamVjdCBmb3IgYSBsaW5rIGJldHdlZW4gZGlhZ3JhbSBub2RlcwotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICogQG1vZGVsCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgTGluayBleHRlbmRzIExpbmtlZE9iamVjdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiIiPC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0TmFtZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Nb2RlbFBhY2thZ2UjZ2V0TGlua19OYW1lKCkKLQkgKiBAbW9kZWwgZGVmYXVsdD0iIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0TmFtZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTGluayNnZXROYW1lIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXROYW1lKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBzb3VyY2Ugbm9kZSBvZiB0aGlzIGxpbmsuCi0JICogCi0JICogQG1vZGVsCi0JICovCi0JTm9kZSBnZXRTb3VyY2UoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkxpbmsjZ2V0U291cmNlIDxlbT5Tb3VyY2U8L2VtPn0nIGNvbnRhaW5lciByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U291cmNlPC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0U291cmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRTb3VyY2UoTm9kZSB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSB0YXJnZXQgbm9kZSBvZiB0aGlzIGxpbmsKLQkgKiAKLQkgKiBAbW9kZWwKLQkgKi8KLQlOb2RlIGdldFRhcmdldCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTGluayNnZXRUYXJnZXQgPGVtPlRhcmdldDwvZW0+fScgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlRhcmdldDwvZW0+JyByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0VGFyZ2V0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRUYXJnZXQoTm9kZSB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBsaXN0IG9mIGJlbmQgcG9pbnRzIGluIHRoaXMgbGluawotCSAqIAotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5kcmF3MmQuQWJzb2x1dGVCZW5kcG9pbnQiIGxvd2VyPSIwIiB0cmFuc2llbnQ9InRydWUiCi0JICovCi0JRUxpc3Q8QWJzb2x1dGVCZW5kcG9pbnQ+IGdldEJlbmRwb2ludHMoKTsKLQotCS8qKgotCSAqIEdldHMgdGhlIGVuZCBwb2ludCBvZiB0aGlzIGxpbmsgaW4gdGhlIHNvdXJjZSBub2RlCi0JICogCi0JICogQG1vZGVsIHRyYW5zaWVudD0idHJ1ZSIKLQkgKiBAcmV0dXJuCi0JICovCi0JUG9pbnQgZ2V0U291cmNlRW5kUG9pbnQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkxpbmsjZ2V0U291cmNlRW5kUG9pbnQgPGVtPlNvdXJjZSBFbmQgUG9pbnQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Tb3VyY2UgRW5kIFBvaW50PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRTb3VyY2VFbmRQb2ludCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0U291cmNlRW5kUG9pbnQoUG9pbnQgdmFsdWUpOwotCi0JLyoqCi0JICogR2V0cyB0aGUgZW5kIHBvaW50IG9mIHRoaXMgbGluayBpbiB0YXJnZXQgbm9kZQotCSAqIAotCSAqIEBtb2RlbCB0cmFuc2llbnQ9InRydWUiCi0JICogQHJldHVybgotCSAqLwotCVBvaW50IGdldFRhcmdldEVuZFBvaW50KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5MaW5rI2dldFRhcmdldEVuZFBvaW50IDxlbT5UYXJnZXQgRW5kIFBvaW50PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VGFyZ2V0IEVuZCBQb2ludDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0VGFyZ2V0RW5kUG9pbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFRhcmdldEVuZFBvaW50KFBvaW50IHZhbHVlKTsKLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9MaW5rZWRPYmplY3QuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9MaW5rZWRPYmplY3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTkzOTI2ZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvTGlua2VkT2JqZWN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLQotLyoqCi0gKiBUaGlzIGludGVyZmFjZSByZXByZXNlbnRzIG9iamVjdHMgdGhhdCBpcyBsaW5rZWQgd2l0aCBvdGhlciBvYmplY3QgaW4gYQotICogZGlmZmVyZW5jZSBtb2RlbAotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICogQG1vZGVsIGFic3RyYWN0PSJ0cnVlIgotICovCi1wdWJsaWMgaW50ZXJmYWNlIExpbmtlZE9iamVjdCBleHRlbmRzIEVPYmplY3QgewotCi0JT2JqZWN0IGdldE9iamVjdCgpOwotCi0Jdm9pZCBzZXRPYmplY3QoT2JqZWN0IHZhbHVlKTsKLQotCS8qKgotCSAqIEBtb2RlbAotCSAqLwotCU1ldGhvZEVsZW1lbnQgZ2V0TGlua2VkRWxlbWVudCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTGlua2VkT2JqZWN0I2dldExpbmtlZEVsZW1lbnQgPGVtPkxpbmtlZCBFbGVtZW50PC9lbT59JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5MaW5rZWQgRWxlbWVudDwvZW0+JyByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0TGlua2VkRWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TGlua2VkRWxlbWVudChNZXRob2RFbGVtZW50IHZhbHVlKTsKLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL01vZGVsRmFjdG9yeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL01vZGVsRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MzhmOWQxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9Nb2RlbEZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRmFjdG9yeTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogVGhlIDxiPkZhY3Rvcnk8L2I+IGZvciB0aGUgbW9kZWwuCi0gKiBJdCBwcm92aWRlcyBhIGNyZWF0ZSBtZXRob2QgZm9yIGVhY2ggbm9uLWFic3RyYWN0IGNsYXNzIG9mIHRoZSBtb2RlbC4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Nb2RlbFBhY2thZ2UKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBNb2RlbEZhY3RvcnkgZXh0ZW5kcyBFRmFjdG9yeSB7Ci0JLyoqCi0JICogVGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgZmFjdG9yeS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBNb2RlbEZhY3RvcnkgZUlOU1RBTkNFID0gb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5Nb2RlbEZhY3RvcnlJbXBsLmluaXQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RGlhZ3JhbTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RGlhZ3JhbTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgRGlhZ3JhbSBjcmVhdGVEaWFncmFtKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkxpbms8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkxpbms8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIExpbmsgY3JlYXRlTGluaygpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5OYW1lZCBOb2RlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5OYW1lZCBOb2RlPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBOYW1lZE5vZGUgY3JlYXRlTmFtZWROb2RlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkFjdGl2aXR5IERpYWdyYW08L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkFjdGl2aXR5IERpYWdyYW08L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIEFjdGl2aXR5RGlhZ3JhbSBjcmVhdGVBY3Rpdml0eURpYWdyYW0oKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+VHlwZWQgTm9kZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+VHlwZWQgTm9kZTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgVHlwZWROb2RlIGNyZWF0ZVR5cGVkTm9kZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Xb3JrIFByb2R1Y3QgRGVwZW5kZW5jeSBEaWFncmFtPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Xb3JrIFByb2R1Y3QgRGVwZW5kZW5jeSBEaWFncmFtPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlXb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtIGNyZWF0ZVdvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW0oKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+V29yayBQcm9kdWN0IE5vZGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPldvcmsgUHJvZHVjdCBOb2RlPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlXb3JrUHJvZHVjdE5vZGUgY3JlYXRlV29ya1Byb2R1Y3ROb2RlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkFjdGl2aXR5IERldGFpbCBEaWFncmFtPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5BY3Rpdml0eSBEZXRhaWwgRGlhZ3JhbTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQWN0aXZpdHlEZXRhaWxEaWFncmFtIGNyZWF0ZUFjdGl2aXR5RGV0YWlsRGlhZ3JhbSgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Sb2xlIE5vZGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlJvbGUgTm9kZTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUm9sZU5vZGUgY3JlYXRlUm9sZU5vZGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+Um9sZSBUYXNrIENvbXBvc2l0ZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+Um9sZSBUYXNrIENvbXBvc2l0ZTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUm9sZVRhc2tDb21wb3NpdGUgY3JlYXRlUm9sZVRhc2tDb21wb3NpdGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+VGFzayBOb2RlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5UYXNrIE5vZGU8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVRhc2tOb2RlIGNyZWF0ZVRhc2tOb2RlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPldvcmsgUHJvZHVjdCBEZXNjcmlwdG9yIE5vZGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPldvcmsgUHJvZHVjdCBEZXNjcmlwdG9yIE5vZGU8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGUgY3JlYXRlV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Xb3JrIEJyZWFrZG93biBFbGVtZW50IE5vZGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPldvcmsgQnJlYWtkb3duIEVsZW1lbnQgTm9kZTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JV29ya0JyZWFrZG93bkVsZW1lbnROb2RlIGNyZWF0ZVdvcmtCcmVha2Rvd25FbGVtZW50Tm9kZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Xb3JrIFByb2R1Y3QgQ29tcG9zaXRlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Xb3JrIFByb2R1Y3QgQ29tcG9zaXRlPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlXb3JrUHJvZHVjdENvbXBvc2l0ZSBjcmVhdGVXb3JrUHJvZHVjdENvbXBvc2l0ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcGFja2FnZSBzdXBwb3J0ZWQgYnkgdGhpcyBmYWN0b3J5LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgcGFja2FnZSBzdXBwb3J0ZWQgYnkgdGhpcyBmYWN0b3J5LgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBNb2RlbFBhY2thZ2UgZ2V0TW9kZWxQYWNrYWdlKCk7Ci0KLX0gLy9Nb2RlbEZhY3RvcnkKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9Nb2RlbFBhY2thZ2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9Nb2RlbFBhY2thZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmRmMGFkOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvTW9kZWxQYWNrYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDM2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRURhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogVGhlIDxiPlBhY2thZ2U8L2I+IGZvciB0aGUgbW9kZWwuCi0gKiBJdCBjb250YWlucyBhY2Nlc3NvcnMgZm9yIHRoZSBtZXRhIG9iamVjdHMgdG8gcmVwcmVzZW50Ci0gKiA8dWw+Ci0gKiAgIDxsaT5lYWNoIGNsYXNzLDwvbGk+Ci0gKiAgIDxsaT5lYWNoIGZlYXR1cmUgb2YgZWFjaCBjbGFzcyw8L2xpPgotICogICA8bGk+ZWFjaCBlbnVtLDwvbGk+Ci0gKiAgIDxsaT5hbmQgZWFjaCBkYXRhIHR5cGU8L2xpPgotICogPC91bD4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Nb2RlbEZhY3RvcnkKLSAqIEBtb2RlbCBraW5kPSJwYWNrYWdlIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIE1vZGVsUGFja2FnZSBleHRlbmRzIEVQYWNrYWdlIHsKLQkvKioKLQkgKiBUaGUgcGFja2FnZSBuYW1lLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIFN0cmluZyBlTkFNRSA9ICJtb2RlbCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSBwYWNrYWdlIG5hbWVzcGFjZSBVUkkuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgU3RyaW5nIGVOU19VUkkgPSAiaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvZGlhZ3JhbS8xLjAuMC9kaWFncmFtLmVjb3JlIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlIHBhY2thZ2UgbmFtZXNwYWNlIG5hbWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgU3RyaW5nIGVOU19QUkVGSVggPSAib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBwYWNrYWdlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIE1vZGVsUGFja2FnZSBlSU5TVEFOQ0UgPSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLk1vZGVsUGFja2FnZUltcGwuaW5pdCgpOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLk5vZGVDb250YWluZXJJbXBsIDxlbT5Ob2RlIENvbnRhaW5lcjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuTm9kZUNvbnRhaW5lckltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuTW9kZWxQYWNrYWdlSW1wbCNnZXROb2RlQ29udGFpbmVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IE5PREVfQ09OVEFJTkVSID0gMTA7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuTGlua2VkT2JqZWN0SW1wbCA8ZW0+TGlua2VkIE9iamVjdDwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuTGlua2VkT2JqZWN0SW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5Nb2RlbFBhY2thZ2VJbXBsI2dldExpbmtlZE9iamVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIGludCBMSU5LRURfT0JKRUNUID0gMjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5EaWFncmFtSW1wbCA8ZW0+RGlhZ3JhbTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuRGlhZ3JhbUltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuTW9kZWxQYWNrYWdlSW1wbCNnZXREaWFncmFtKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgaW50IERJQUdSQU0gPSAwOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLkxpbmtJbXBsIDxlbT5MaW5rPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5MaW5rSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5Nb2RlbFBhY2thZ2VJbXBsI2dldExpbmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBpbnQgTElOSyA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuTm9kZUltcGwgPGVtPk5vZGU8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLk5vZGVJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLk1vZGVsUGFja2FnZUltcGwjZ2V0Tm9kZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIGludCBOT0RFID0gNDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5OYW1lZE5vZGVJbXBsIDxlbT5OYW1lZCBOb2RlPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5OYW1lZE5vZGVJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLk1vZGVsUGFja2FnZUltcGwjZ2V0TmFtZWROb2RlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgaW50IE5BTUVEX05PREUgPSAzOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLkFjdGl2aXR5RGlhZ3JhbUltcGwgPGVtPkFjdGl2aXR5IERpYWdyYW08L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLkFjdGl2aXR5RGlhZ3JhbUltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuTW9kZWxQYWNrYWdlSW1wbCNnZXRBY3Rpdml0eURpYWdyYW0oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBpbnQgQUNUSVZJVFlfRElBR1JBTSA9IDU7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuVHlwZWROb2RlSW1wbCA8ZW0+VHlwZWQgTm9kZTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuVHlwZWROb2RlSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5Nb2RlbFBhY2thZ2VJbXBsI2dldFR5cGVkTm9kZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIGludCBUWVBFRF9OT0RFID0gNjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5Xb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtSW1wbCA8ZW0+V29yayBQcm9kdWN0IERlcGVuZGVuY3kgRGlhZ3JhbTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbUltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuTW9kZWxQYWNrYWdlSW1wbCNnZXRXb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVBFTkRFTkNZX0RJQUdSQU0gPSA3OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLldvcmtQcm9kdWN0Tm9kZUltcGwgPGVtPldvcmsgUHJvZHVjdCBOb2RlPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5Xb3JrUHJvZHVjdE5vZGVJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLk1vZGVsUGFja2FnZUltcGwjZ2V0V29ya1Byb2R1Y3ROb2RlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9OT0RFID0gODsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5BY3Rpdml0eURldGFpbERpYWdyYW1JbXBsIDxlbT5BY3Rpdml0eSBEZXRhaWwgRGlhZ3JhbTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuQWN0aXZpdHlEZXRhaWxEaWFncmFtSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5Nb2RlbFBhY2thZ2VJbXBsI2dldEFjdGl2aXR5RGV0YWlsRGlhZ3JhbSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBBQ1RJVklUWV9ERVRBSUxfRElBR1JBTSA9IDk7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuUm9sZU5vZGVJbXBsIDxlbT5Sb2xlIE5vZGU8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLlJvbGVOb2RlSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5Nb2RlbFBhY2thZ2VJbXBsI2dldFJvbGVOb2RlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFJPTEVfTk9ERSA9IDExOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLlJvbGVUYXNrQ29tcG9zaXRlSW1wbCA8ZW0+Um9sZSBUYXNrIENvbXBvc2l0ZTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuUm9sZVRhc2tDb21wb3NpdGVJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLk1vZGVsUGFja2FnZUltcGwjZ2V0Um9sZVRhc2tDb21wb3NpdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgUk9MRV9UQVNLX0NPTVBPU0lURSA9IDEyOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLlRhc2tOb2RlSW1wbCA8ZW0+VGFzayBOb2RlPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5UYXNrTm9kZUltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuTW9kZWxQYWNrYWdlSW1wbCNnZXRUYXNrTm9kZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBUQVNLX05PREUgPSAxMzsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5Xb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlSW1wbCA8ZW0+V29yayBQcm9kdWN0IERlc2NyaXB0b3IgTm9kZTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZUltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuTW9kZWxQYWNrYWdlSW1wbCNnZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVE9SX05PREUgPSAxNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5MaW5rZWQgRWxlbWVudDwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IExJTktFRF9PQkpFQ1RfX0xJTktFRF9FTEVNRU5UID0gMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5MaW5rZWQgT2JqZWN0PC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gICAgaW50IExJTktFRF9PQkpFQ1RfRkVBVFVSRV9DT1VOVCA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TGlua2VkIEVsZW1lbnQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBOT0RFX19MSU5LRURfRUxFTUVOVCA9IExJTktFRF9PQkpFQ1RfX0xJTktFRF9FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxvY2F0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgICBpbnQgTk9ERV9fTE9DQVRJT04gPSBMSU5LRURfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldpZHRoPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgICBpbnQgTk9ERV9fV0lEVEggPSBMSU5LRURfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkhlaWdodDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gICAgaW50IE5PREVfX0hFSUdIVCA9IExJTktFRF9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW5jb21pbmcgQ29ubmVjdGlvbnM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gICAgaW50IE5PREVfX0lOQ09NSU5HX0NPTk5FQ1RJT05TID0gTElOS0VEX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PdXRnb2luZyBDb25uZWN0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgICBpbnQgTk9ERV9fT1VUR09JTkdfQ09OTkVDVElPTlMgPSBMSU5LRURfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyA0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlYWQgT25seTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE5PREVfX1JFQURfT05MWSA9IExJTktFRF9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDU7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+Tm9kZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICAgIGludCBOT0RFX0ZFQVRVUkVfQ09VTlQgPSBMSU5LRURfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyA2OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxpbmtlZCBFbGVtZW50PC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTk9ERV9DT05UQUlORVJfX0xJTktFRF9FTEVNRU5UID0gTk9ERV9fTElOS0VEX0VMRU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TG9jYXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBOT0RFX0NPTlRBSU5FUl9fTE9DQVRJT04gPSBOT0RFX19MT0NBVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5XaWR0aDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE5PREVfQ09OVEFJTkVSX19XSURUSCA9IE5PREVfX1dJRFRIOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkhlaWdodDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE5PREVfQ09OVEFJTkVSX19IRUlHSFQgPSBOT0RFX19IRUlHSFQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW5jb21pbmcgQ29ubmVjdGlvbnM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE5PREVfQ09OVEFJTkVSX19JTkNPTUlOR19DT05ORUNUSU9OUyA9IE5PREVfX0lOQ09NSU5HX0NPTk5FQ1RJT05TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk91dGdvaW5nIENvbm5lY3Rpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBOT0RFX0NPTlRBSU5FUl9fT1VUR09JTkdfQ09OTkVDVElPTlMgPSBOT0RFX19PVVRHT0lOR19DT05ORUNUSU9OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZWFkIE9ubHk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBOT0RFX0NPTlRBSU5FUl9fUkVBRF9PTkxZID0gTk9ERV9fUkVBRF9PTkxZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBOT0RFX0NPTlRBSU5FUl9fTk9ERVMgPSBOT0RFX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPk5vZGUgQ29udGFpbmVyPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE5PREVfQ09OVEFJTkVSX0ZFQVRVUkVfQ09VTlQgPSBOT0RFX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxpbmtlZCBFbGVtZW50PC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElBR1JBTV9fTElOS0VEX0VMRU1FTlQgPSBOT0RFX0NPTlRBSU5FUl9fTElOS0VEX0VMRU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TG9jYXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESUFHUkFNX19MT0NBVElPTiA9IE5PREVfQ09OVEFJTkVSX19MT0NBVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5XaWR0aDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJQUdSQU1fX1dJRFRIID0gTk9ERV9DT05UQUlORVJfX1dJRFRIOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkhlaWdodDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJQUdSQU1fX0hFSUdIVCA9IE5PREVfQ09OVEFJTkVSX19IRUlHSFQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW5jb21pbmcgQ29ubmVjdGlvbnM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJQUdSQU1fX0lOQ09NSU5HX0NPTk5FQ1RJT05TID0gTk9ERV9DT05UQUlORVJfX0lOQ09NSU5HX0NPTk5FQ1RJT05TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk91dGdvaW5nIENvbm5lY3Rpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESUFHUkFNX19PVVRHT0lOR19DT05ORUNUSU9OUyA9IE5PREVfQ09OVEFJTkVSX19PVVRHT0lOR19DT05ORUNUSU9OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZWFkIE9ubHk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESUFHUkFNX19SRUFEX09OTFkgPSBOT0RFX0NPTlRBSU5FUl9fUkVBRF9PTkxZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICAgIGludCBESUFHUkFNX19OT0RFUyA9IE5PREVfQ09OVEFJTkVSX19OT0RFUzsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5EaWFncmFtPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gICAgaW50IERJQUdSQU1fRkVBVFVSRV9DT1VOVCA9IE5PREVfQ09OVEFJTkVSX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxpbmtlZCBFbGVtZW50PC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTElOS19fTElOS0VEX0VMRU1FTlQgPSBMSU5LRURfT0JKRUNUX19MSU5LRURfRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTElOS19fTkFNRSA9IExJTktFRF9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U291cmNlPC9iPjwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gICAgaW50IExJTktfX1NPVVJDRSA9IExJTktFRF9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGFyZ2V0PC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgICBpbnQgTElOS19fVEFSR0VUID0gTElOS0VEX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CZW5kcG9pbnRzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICAgIGludCBMSU5LX19CRU5EUE9JTlRTID0gTElOS0VEX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Tb3VyY2UgRW5kIFBvaW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTElOS19fU09VUkNFX0VORF9QT0lOVCA9IExJTktFRF9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGFyZ2V0IEVuZCBQb2ludDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IExJTktfX1RBUkdFVF9FTkRfUE9JTlQgPSBMSU5LRURfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyA1OwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkxpbms8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgICBpbnQgTElOS19GRUFUVVJFX0NPVU5UID0gTElOS0VEX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgNjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5MaW5rZWQgRWxlbWVudDwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE5BTUVEX05PREVfX0xJTktFRF9FTEVNRU5UID0gTk9ERV9fTElOS0VEX0VMRU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TG9jYXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICAgIGludCBOQU1FRF9OT0RFX19MT0NBVElPTiA9IE5PREVfX0xPQ0FUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldpZHRoPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgICBpbnQgTkFNRURfTk9ERV9fV0lEVEggPSBOT0RFX19XSURUSDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5IZWlnaHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICAgIGludCBOQU1FRF9OT0RFX19IRUlHSFQgPSBOT0RFX19IRUlHSFQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW5jb21pbmcgQ29ubmVjdGlvbnM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gICAgaW50IE5BTUVEX05PREVfX0lOQ09NSU5HX0NPTk5FQ1RJT05TID0gTk9ERV9fSU5DT01JTkdfQ09OTkVDVElPTlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3V0Z29pbmcgQ29ubmVjdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gICAgaW50IE5BTUVEX05PREVfX09VVEdPSU5HX0NPTk5FQ1RJT05TID0gTk9ERV9fT1VUR09JTkdfQ09OTkVDVElPTlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVhZCBPbmx5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTkFNRURfTk9ERV9fUkVBRF9PTkxZID0gTk9ERV9fUkVBRF9PTkxZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICAgIGludCBOQU1FRF9OT0RFX19OQU1FID0gTk9ERV9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5OYW1lZCBOb2RlPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gICAgaW50IE5BTUVEX05PREVfRkVBVFVSRV9DT1VOVCA9IE5PREVfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TGlua2VkIEVsZW1lbnQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9ESUFHUkFNX19MSU5LRURfRUxFTUVOVCA9IERJQUdSQU1fX0xJTktFRF9FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxvY2F0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfRElBR1JBTV9fTE9DQVRJT04gPSBESUFHUkFNX19MT0NBVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5XaWR0aDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX0RJQUdSQU1fX1dJRFRIID0gRElBR1JBTV9fV0lEVEg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SGVpZ2h0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfRElBR1JBTV9fSEVJR0hUID0gRElBR1JBTV9fSEVJR0hUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkluY29taW5nIENvbm5lY3Rpb25zPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9ESUFHUkFNX19JTkNPTUlOR19DT05ORUNUSU9OUyA9IERJQUdSQU1fX0lOQ09NSU5HX0NPTk5FQ1RJT05TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk91dGdvaW5nIENvbm5lY3Rpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9ESUFHUkFNX19PVVRHT0lOR19DT05ORUNUSU9OUyA9IERJQUdSQU1fX09VVEdPSU5HX0NPTk5FQ1RJT05TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlYWQgT25seTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX0RJQUdSQU1fX1JFQURfT05MWSA9IERJQUdSQU1fX1JFQURfT05MWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob2RlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgICBpbnQgQUNUSVZJVFlfRElBR1JBTV9fTk9ERVMgPSBESUFHUkFNX19OT0RFUzsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5BY3Rpdml0eSBEaWFncmFtPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gICAgaW50IEFDVElWSVRZX0RJQUdSQU1fRkVBVFVSRV9DT1VOVCA9IERJQUdSQU1fRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TGlua2VkIEVsZW1lbnQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUWVBFRF9OT0RFX19MSU5LRURfRUxFTUVOVCA9IE5PREVfX0xJTktFRF9FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxvY2F0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgICBpbnQgVFlQRURfTk9ERV9fTE9DQVRJT04gPSBOT0RFX19MT0NBVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5XaWR0aDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gICAgaW50IFRZUEVEX05PREVfX1dJRFRIID0gTk9ERV9fV0lEVEg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SGVpZ2h0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgICBpbnQgVFlQRURfTk9ERV9fSEVJR0hUID0gTk9ERV9fSEVJR0hUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkluY29taW5nIENvbm5lY3Rpb25zPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICAgIGludCBUWVBFRF9OT0RFX19JTkNPTUlOR19DT05ORUNUSU9OUyA9IE5PREVfX0lOQ09NSU5HX0NPTk5FQ1RJT05TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk91dGdvaW5nIENvbm5lY3Rpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICAgIGludCBUWVBFRF9OT0RFX19PVVRHT0lOR19DT05ORUNUSU9OUyA9IE5PREVfX09VVEdPSU5HX0NPTk5FQ1RJT05TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlYWQgT25seTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRZUEVEX05PREVfX1JFQURfT05MWSA9IE5PREVfX1JFQURfT05MWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgICBpbnQgVFlQRURfTk9ERV9fVFlQRSA9IE5PREVfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+VHlwZWQgTm9kZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICAgIGludCBUWVBFRF9OT0RFX0ZFQVRVUkVfQ09VTlQgPSBOT0RFX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxpbmtlZCBFbGVtZW50PC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFUEVOREVOQ1lfRElBR1JBTV9fTElOS0VEX0VMRU1FTlQgPSBESUFHUkFNX19MSU5LRURfRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Mb2NhdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVBFTkRFTkNZX0RJQUdSQU1fX0xPQ0FUSU9OID0gRElBR1JBTV9fTE9DQVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+V2lkdGg8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVQRU5ERU5DWV9ESUFHUkFNX19XSURUSCA9IERJQUdSQU1fX1dJRFRIOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkhlaWdodDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVBFTkRFTkNZX0RJQUdSQU1fX0hFSUdIVCA9IERJQUdSQU1fX0hFSUdIVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbmNvbWluZyBDb25uZWN0aW9uczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFUEVOREVOQ1lfRElBR1JBTV9fSU5DT01JTkdfQ09OTkVDVElPTlMgPSBESUFHUkFNX19JTkNPTUlOR19DT05ORUNUSU9OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PdXRnb2luZyBDb25uZWN0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFUEVOREVOQ1lfRElBR1JBTV9fT1VUR09JTkdfQ09OTkVDVElPTlMgPSBESUFHUkFNX19PVVRHT0lOR19DT05ORUNUSU9OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZWFkIE9ubHk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVQRU5ERU5DWV9ESUFHUkFNX19SRUFEX09OTFkgPSBESUFHUkFNX19SRUFEX09OTFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm9kZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVBFTkRFTkNZX0RJQUdSQU1fX05PREVTID0gRElBR1JBTV9fTk9ERVM7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+V29yayBQcm9kdWN0IERlcGVuZGVuY3kgRGlhZ3JhbTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVQRU5ERU5DWV9ESUFHUkFNX0ZFQVRVUkVfQ09VTlQgPSBESUFHUkFNX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxpbmtlZCBFbGVtZW50PC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX05PREVfX0xJTktFRF9FTEVNRU5UID0gTkFNRURfTk9ERV9fTElOS0VEX0VMRU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TG9jYXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfTk9ERV9fTE9DQVRJT04gPSBOQU1FRF9OT0RFX19MT0NBVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5XaWR0aDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9OT0RFX19XSURUSCA9IE5BTUVEX05PREVfX1dJRFRIOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkhlaWdodDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9OT0RFX19IRUlHSFQgPSBOQU1FRF9OT0RFX19IRUlHSFQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW5jb21pbmcgQ29ubmVjdGlvbnM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9OT0RFX19JTkNPTUlOR19DT05ORUNUSU9OUyA9IE5BTUVEX05PREVfX0lOQ09NSU5HX0NPTk5FQ1RJT05TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk91dGdvaW5nIENvbm5lY3Rpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfTk9ERV9fT1VUR09JTkdfQ09OTkVDVElPTlMgPSBOQU1FRF9OT0RFX19PVVRHT0lOR19DT05ORUNUSU9OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZWFkIE9ubHk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfTk9ERV9fUkVBRF9PTkxZID0gTkFNRURfTk9ERV9fUkVBRF9PTkxZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfTk9ERV9fTkFNRSA9IE5BTUVEX05PREVfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9OT0RFX19UWVBFID0gTkFNRURfTk9ERV9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Xb3JrIFByb2R1Y3QgTm9kZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfTk9ERV9GRUFUVVJFX0NPVU5UID0gTkFNRURfTk9ERV9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5MaW5rZWQgRWxlbWVudDwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX0RFVEFJTF9ESUFHUkFNX19MSU5LRURfRUxFTUVOVCA9IERJQUdSQU1fX0xJTktFRF9FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxvY2F0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfREVUQUlMX0RJQUdSQU1fX0xPQ0FUSU9OID0gRElBR1JBTV9fTE9DQVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+V2lkdGg8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9ERVRBSUxfRElBR1JBTV9fV0lEVEggPSBESUFHUkFNX19XSURUSDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5IZWlnaHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9ERVRBSUxfRElBR1JBTV9fSEVJR0hUID0gRElBR1JBTV9fSEVJR0hUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkluY29taW5nIENvbm5lY3Rpb25zPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9ERVRBSUxfRElBR1JBTV9fSU5DT01JTkdfQ09OTkVDVElPTlMgPSBESUFHUkFNX19JTkNPTUlOR19DT05ORUNUSU9OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PdXRnb2luZyBDb25uZWN0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfREVUQUlMX0RJQUdSQU1fX09VVEdPSU5HX0NPTk5FQ1RJT05TID0gRElBR1JBTV9fT1VUR09JTkdfQ09OTkVDVElPTlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVhZCBPbmx5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfREVUQUlMX0RJQUdSQU1fX1JFQURfT05MWSA9IERJQUdSQU1fX1JFQURfT05MWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob2RlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfREVUQUlMX0RJQUdSQU1fX05PREVTID0gRElBR1JBTV9fTk9ERVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXV0byBMYXlvdXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9ERVRBSUxfRElBR1JBTV9fQVVUT19MQVlPVVQgPSBESUFHUkFNX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkFjdGl2aXR5IERldGFpbCBEaWFncmFtPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX0RFVEFJTF9ESUFHUkFNX0ZFQVRVUkVfQ09VTlQgPSBESUFHUkFNX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxpbmtlZCBFbGVtZW50PC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9OT0RFX19MSU5LRURfRUxFTUVOVCA9IE5BTUVEX05PREVfX0xJTktFRF9FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxvY2F0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9OT0RFX19MT0NBVElPTiA9IE5BTUVEX05PREVfX0xPQ0FUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldpZHRoPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9OT0RFX19XSURUSCA9IE5BTUVEX05PREVfX1dJRFRIOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkhlaWdodDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfTk9ERV9fSEVJR0hUID0gTkFNRURfTk9ERV9fSEVJR0hUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkluY29taW5nIENvbm5lY3Rpb25zPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX05PREVfX0lOQ09NSU5HX0NPTk5FQ1RJT05TID0gTkFNRURfTk9ERV9fSU5DT01JTkdfQ09OTkVDVElPTlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3V0Z29pbmcgQ29ubmVjdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfTk9ERV9fT1VUR09JTkdfQ09OTkVDVElPTlMgPSBOQU1FRF9OT0RFX19PVVRHT0lOR19DT05ORUNUSU9OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZWFkIE9ubHk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX05PREVfX1JFQURfT05MWSA9IE5BTUVEX05PREVfX1JFQURfT05MWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9OT0RFX19OQU1FID0gTkFNRURfTk9ERV9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Sb2xlIE5vZGU8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9OT0RFX0ZFQVRVUkVfQ09VTlQgPSBOQU1FRF9OT0RFX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxpbmtlZCBFbGVtZW50PC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9UQVNLX0NPTVBPU0lURV9fTElOS0VEX0VMRU1FTlQgPSBOT0RFX0NPTlRBSU5FUl9fTElOS0VEX0VMRU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TG9jYXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX1RBU0tfQ09NUE9TSVRFX19MT0NBVElPTiA9IE5PREVfQ09OVEFJTkVSX19MT0NBVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5XaWR0aDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfVEFTS19DT01QT1NJVEVfX1dJRFRIID0gTk9ERV9DT05UQUlORVJfX1dJRFRIOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkhlaWdodDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfVEFTS19DT01QT1NJVEVfX0hFSUdIVCA9IE5PREVfQ09OVEFJTkVSX19IRUlHSFQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW5jb21pbmcgQ29ubmVjdGlvbnM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfVEFTS19DT01QT1NJVEVfX0lOQ09NSU5HX0NPTk5FQ1RJT05TID0gTk9ERV9DT05UQUlORVJfX0lOQ09NSU5HX0NPTk5FQ1RJT05TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk91dGdvaW5nIENvbm5lY3Rpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX1RBU0tfQ09NUE9TSVRFX19PVVRHT0lOR19DT05ORUNUSU9OUyA9IE5PREVfQ09OVEFJTkVSX19PVVRHT0lOR19DT05ORUNUSU9OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZWFkIE9ubHk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX1RBU0tfQ09NUE9TSVRFX19SRUFEX09OTFkgPSBOT0RFX0NPTlRBSU5FUl9fUkVBRF9PTkxZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX1RBU0tfQ09NUE9TSVRFX19OT0RFUyA9IE5PREVfQ09OVEFJTkVSX19OT0RFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Sb3cgSW5kZXg8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX1RBU0tfQ09NUE9TSVRFX19ST1dfSU5ERVggPSBOT0RFX0NPTlRBSU5FUl9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Sb2xlIFRhc2sgQ29tcG9zaXRlPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfVEFTS19DT01QT1NJVEVfRkVBVFVSRV9DT1VOVCA9IE5PREVfQ09OVEFJTkVSX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxpbmtlZCBFbGVtZW50PC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19OT0RFX19MSU5LRURfRUxFTUVOVCA9IE5BTUVEX05PREVfX0xJTktFRF9FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxvY2F0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19OT0RFX19MT0NBVElPTiA9IE5BTUVEX05PREVfX0xPQ0FUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldpZHRoPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19OT0RFX19XSURUSCA9IE5BTUVEX05PREVfX1dJRFRIOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkhlaWdodDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfTk9ERV9fSEVJR0hUID0gTkFNRURfTk9ERV9fSEVJR0hUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkluY29taW5nIENvbm5lY3Rpb25zPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX05PREVfX0lOQ09NSU5HX0NPTk5FQ1RJT05TID0gTkFNRURfTk9ERV9fSU5DT01JTkdfQ09OTkVDVElPTlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3V0Z29pbmcgQ29ubmVjdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfTk9ERV9fT1VUR09JTkdfQ09OTkVDVElPTlMgPSBOQU1FRF9OT0RFX19PVVRHT0lOR19DT05ORUNUSU9OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZWFkIE9ubHk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX05PREVfX1JFQURfT05MWSA9IE5BTUVEX05PREVfX1JFQURfT05MWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19OT0RFX19OQU1FID0gTkFNRURfTk9ERV9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbmRleDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfTk9ERV9fSU5ERVggPSBOQU1FRF9OT0RFX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlRhc2sgTm9kZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX05PREVfRkVBVFVSRV9DT1VOVCA9IE5BTUVEX05PREVfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TGlua2VkIEVsZW1lbnQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9OT0RFX19MSU5LRURfRUxFTUVOVCA9IE5BTUVEX05PREVfX0xJTktFRF9FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxvY2F0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfTk9ERV9fTE9DQVRJT04gPSBOQU1FRF9OT0RFX19MT0NBVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5XaWR0aDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVE9SX05PREVfX1dJRFRIID0gTkFNRURfTk9ERV9fV0lEVEg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SGVpZ2h0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfTk9ERV9fSEVJR0hUID0gTkFNRURfTk9ERV9fSEVJR0hUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkluY29taW5nIENvbm5lY3Rpb25zPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9OT0RFX19JTkNPTUlOR19DT05ORUNUSU9OUyA9IE5BTUVEX05PREVfX0lOQ09NSU5HX0NPTk5FQ1RJT05TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk91dGdvaW5nIENvbm5lY3Rpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9OT0RFX19PVVRHT0lOR19DT05ORUNUSU9OUyA9IE5BTUVEX05PREVfX09VVEdPSU5HX0NPTk5FQ1RJT05TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlYWQgT25seTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVE9SX05PREVfX1JFQURfT05MWSA9IE5BTUVEX05PREVfX1JFQURfT05MWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfTk9ERV9fTkFNRSA9IE5BTUVEX05PREVfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+V29yayBQcm9kdWN0IERlc2NyaXB0b3IgTm9kZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9OT0RFX0ZFQVRVUkVfQ09VTlQgPSBOQU1FRF9OT0RFX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLldvcmtCcmVha2Rvd25FbGVtZW50Tm9kZUltcGwgPGVtPldvcmsgQnJlYWtkb3duIEVsZW1lbnQgTm9kZTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuV29ya0JyZWFrZG93bkVsZW1lbnROb2RlSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5Nb2RlbFBhY2thZ2VJbXBsI2dldFdvcmtCcmVha2Rvd25FbGVtZW50Tm9kZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX05PREUgPSAxNTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5MaW5rZWQgRWxlbWVudDwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfTk9ERV9fTElOS0VEX0VMRU1FTlQgPSBOQU1FRF9OT0RFX19MSU5LRURfRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Mb2NhdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfTk9ERV9fTE9DQVRJT04gPSBOQU1FRF9OT0RFX19MT0NBVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5XaWR0aDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfTk9ERV9fV0lEVEggPSBOQU1FRF9OT0RFX19XSURUSDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5IZWlnaHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX05PREVfX0hFSUdIVCA9IE5BTUVEX05PREVfX0hFSUdIVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbmNvbWluZyBDb25uZWN0aW9uczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19CUkVBS0RPV05fRUxFTUVOVF9OT0RFX19JTkNPTUlOR19DT05ORUNUSU9OUyA9IE5BTUVEX05PREVfX0lOQ09NSU5HX0NPTk5FQ1RJT05TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk91dGdvaW5nIENvbm5lY3Rpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX05PREVfX09VVEdPSU5HX0NPTk5FQ1RJT05TID0gTkFNRURfTk9ERV9fT1VUR09JTkdfQ09OTkVDVElPTlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVhZCBPbmx5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19CUkVBS0RPV05fRUxFTUVOVF9OT0RFX19SRUFEX09OTFkgPSBOQU1FRF9OT0RFX19SRUFEX09OTFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfTk9ERV9fTkFNRSA9IE5BTUVEX05PREVfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+V29yayBCcmVha2Rvd24gRWxlbWVudCBOb2RlPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfTk9ERV9GRUFUVVJFX0NPVU5UID0gTkFNRURfTk9ERV9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5Xb3JrUHJvZHVjdENvbXBvc2l0ZUltcGwgPGVtPldvcmsgUHJvZHVjdCBDb21wb3NpdGU8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLldvcmtQcm9kdWN0Q29tcG9zaXRlSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5Nb2RlbFBhY2thZ2VJbXBsI2dldFdvcmtQcm9kdWN0Q29tcG9zaXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9DT01QT1NJVEUgPSAxNjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5MaW5rZWQgRWxlbWVudDwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9DT01QT1NJVEVfX0xJTktFRF9FTEVNRU5UID0gTk9ERV9DT05UQUlORVJfX0xJTktFRF9FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxvY2F0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0NPTVBPU0lURV9fTE9DQVRJT04gPSBOT0RFX0NPTlRBSU5FUl9fTE9DQVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+V2lkdGg8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfQ09NUE9TSVRFX19XSURUSCA9IE5PREVfQ09OVEFJTkVSX19XSURUSDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5IZWlnaHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfQ09NUE9TSVRFX19IRUlHSFQgPSBOT0RFX0NPTlRBSU5FUl9fSEVJR0hUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkluY29taW5nIENvbm5lY3Rpb25zPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfQ09NUE9TSVRFX19JTkNPTUlOR19DT05ORUNUSU9OUyA9IE5PREVfQ09OVEFJTkVSX19JTkNPTUlOR19DT05ORUNUSU9OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PdXRnb2luZyBDb25uZWN0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0NPTVBPU0lURV9fT1VUR09JTkdfQ09OTkVDVElPTlMgPSBOT0RFX0NPTlRBSU5FUl9fT1VUR09JTkdfQ09OTkVDVElPTlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVhZCBPbmx5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0NPTVBPU0lURV9fUkVBRF9PTkxZID0gTk9ERV9DT05UQUlORVJfX1JFQURfT05MWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob2RlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0NPTVBPU0lURV9fTk9ERVMgPSBOT0RFX0NPTlRBSU5FUl9fTk9ERVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9DT01QT1NJVEVfX1RZUEUgPSBOT0RFX0NPTlRBSU5FUl9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Xb3JrIFByb2R1Y3QgQ29tcG9zaXRlPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9DT01QT1NJVEVfRkVBVFVSRV9DT1VOVCA9IE5PREVfQ09OVEFJTkVSX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5BYnNvbHV0ZSBCZW5kcG9pbnQ8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5kcmF3MmQuQWJzb2x1dGVCZW5kcG9pbnQKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuTW9kZWxQYWNrYWdlSW1wbCNnZXRBYnNvbHV0ZUJlbmRwb2ludCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIGludCBBQlNPTFVURV9CRU5EUE9JTlQgPSAxNzsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+UG9pbnQ8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuTW9kZWxQYWNrYWdlSW1wbCNnZXRQb2ludCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIGludCBQT0lOVCA9IDE4OwotCi0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPlJvbGUgRGVzY3JpcHRvcjwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZURlc2NyaXB0b3IKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuTW9kZWxQYWNrYWdlSW1wbCNnZXRSb2xlRGVzY3JpcHRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBST0xFX0RFU0NSSVBUT1IgPSAxOTsKLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuRGlhZ3JhbSA8ZW0+RGlhZ3JhbTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5EaWFncmFtPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuRGlhZ3JhbQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBFQ2xhc3MgZ2V0RGlhZ3JhbSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTGluayA8ZW0+TGluazwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5MaW5rPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTGluawotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBFQ2xhc3MgZ2V0TGluaygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5MaW5rI2dldE5hbWUgPGVtPk5hbWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5OYW1lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTGluayNnZXROYW1lKCkKLQkgKiBAc2VlICNnZXRMaW5rKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRMaW5rX05hbWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbmVyIHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkxpbmsjZ2V0U291cmNlIDxlbT5Tb3VyY2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWluZXIgcmVmZXJlbmNlICc8ZW0+U291cmNlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTGluayNnZXRTb3VyY2UoKQotCSAqIEBzZWUgI2dldExpbmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBFUmVmZXJlbmNlIGdldExpbmtfU291cmNlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkxpbmsjZ2V0VGFyZ2V0IDxlbT5UYXJnZXQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJzxlbT5UYXJnZXQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5MaW5rI2dldFRhcmdldCgpCi0JICogQHNlZSAjZ2V0TGluaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIEVSZWZlcmVuY2UgZ2V0TGlua19UYXJnZXQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5MaW5rI2dldEJlbmRwb2ludHMgPGVtPkJlbmRwb2ludHM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPkJlbmRwb2ludHM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5MaW5rI2dldEJlbmRwb2ludHMoKQotCSAqIEBzZWUgI2dldExpbmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBFQXR0cmlidXRlIGdldExpbmtfQmVuZHBvaW50cygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5MaW5rI2dldFNvdXJjZUVuZFBvaW50IDxlbT5Tb3VyY2UgRW5kIFBvaW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+U291cmNlIEVuZCBQb2ludDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkxpbmsjZ2V0U291cmNlRW5kUG9pbnQoKQotCSAqIEBzZWUgI2dldExpbmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldExpbmtfU291cmNlRW5kUG9pbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTGluayNnZXRUYXJnZXRFbmRQb2ludCA8ZW0+VGFyZ2V0IEVuZCBQb2ludDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlRhcmdldCBFbmQgUG9pbnQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5MaW5rI2dldFRhcmdldEVuZFBvaW50KCkKLQkgKiBAc2VlICNnZXRMaW5rKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRMaW5rX1RhcmdldEVuZFBvaW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5MaW5rZWRPYmplY3QgPGVtPkxpbmtlZCBPYmplY3Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+TGlua2VkIE9iamVjdDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkxpbmtlZE9iamVjdAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBFQ2xhc3MgZ2V0TGlua2VkT2JqZWN0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkxpbmtlZE9iamVjdCNnZXRMaW5rZWRFbGVtZW50IDxlbT5MaW5rZWQgRWxlbWVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAnPGVtPkxpbmtlZCBFbGVtZW50PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTGlua2VkT2JqZWN0I2dldExpbmtlZEVsZW1lbnQoKQotCSAqIEBzZWUgI2dldExpbmtlZE9iamVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0TGlua2VkT2JqZWN0X0xpbmtlZEVsZW1lbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5hbWVkTm9kZSA8ZW0+TmFtZWQgTm9kZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5OYW1lZCBOb2RlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTmFtZWROb2RlCi0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIEVDbGFzcyBnZXROYW1lZE5vZGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTmFtZWROb2RlI2dldE5hbWUgPGVtPk5hbWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5OYW1lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTmFtZWROb2RlI2dldE5hbWUoKQotCSAqIEBzZWUgI2dldE5hbWVkTm9kZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIEVBdHRyaWJ1dGUgZ2V0TmFtZWROb2RlX05hbWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGUgPGVtPk5vZGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+Tm9kZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgRUNsYXNzIGdldE5vZGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZSNnZXRMb2NhdGlvbiA8ZW0+TG9jYXRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Mb2NhdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGUjZ2V0TG9jYXRpb24oKQotCSAqIEBzZWUgI2dldE5vZGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBFQXR0cmlidXRlIGdldE5vZGVfTG9jYXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZSNnZXRXaWR0aCA8ZW0+V2lkdGg8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5XaWR0aDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGUjZ2V0V2lkdGgoKQotCSAqIEBzZWUgI2dldE5vZGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBFQXR0cmlidXRlIGdldE5vZGVfV2lkdGgoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZSNnZXRIZWlnaHQgPGVtPkhlaWdodDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkhlaWdodDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGUjZ2V0SGVpZ2h0KCkKLQkgKiBAc2VlICNnZXROb2RlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgRUF0dHJpYnV0ZSBnZXROb2RlX0hlaWdodCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGUjZ2V0SW5jb21pbmdDb25uZWN0aW9ucyA8ZW0+SW5jb21pbmcgQ29ubmVjdGlvbnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAnPGVtPkluY29taW5nIENvbm5lY3Rpb25zPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZSNnZXRJbmNvbWluZ0Nvbm5lY3Rpb25zKCkKLQkgKiBAc2VlICNnZXROb2RlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgRVJlZmVyZW5jZSBnZXROb2RlX0luY29taW5nQ29ubmVjdGlvbnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlI2dldE91dGdvaW5nQ29ubmVjdGlvbnMgPGVtPk91dGdvaW5nIENvbm5lY3Rpb25zPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5PdXRnb2luZyBDb25uZWN0aW9uczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGUjZ2V0T3V0Z29pbmdDb25uZWN0aW9ucygpCi0JICogQHNlZSAjZ2V0Tm9kZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIEVSZWZlcmVuY2UgZ2V0Tm9kZV9PdXRnb2luZ0Nvbm5lY3Rpb25zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGUjaXNSZWFkT25seSA8ZW0+UmVhZCBPbmx5PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UmVhZCBPbmx5PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZSNpc1JlYWRPbmx5KCkKLQkgKiBAc2VlICNnZXROb2RlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXROb2RlX1JlYWRPbmx5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5BY3Rpdml0eURpYWdyYW0gPGVtPkFjdGl2aXR5IERpYWdyYW08L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+QWN0aXZpdHkgRGlhZ3JhbTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkFjdGl2aXR5RGlhZ3JhbQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBFQ2xhc3MgZ2V0QWN0aXZpdHlEaWFncmFtKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5UeXBlZE5vZGUgPGVtPlR5cGVkIE5vZGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+VHlwZWQgTm9kZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLlR5cGVkTm9kZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBFQ2xhc3MgZ2V0VHlwZWROb2RlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLlR5cGVkTm9kZSNnZXRUeXBlIDxlbT5UeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VHlwZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLlR5cGVkTm9kZSNnZXRUeXBlKCkKLQkgKiBAc2VlICNnZXRUeXBlZE5vZGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBFQXR0cmlidXRlIGdldFR5cGVkTm9kZV9UeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Xb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtIDxlbT5Xb3JrIFByb2R1Y3QgRGVwZW5kZW5jeSBEaWFncmFtPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPldvcmsgUHJvZHVjdCBEZXBlbmRlbmN5IERpYWdyYW08L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Xb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRXb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Xb3JrUHJvZHVjdE5vZGUgPGVtPldvcmsgUHJvZHVjdCBOb2RlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPldvcmsgUHJvZHVjdCBOb2RlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuV29ya1Byb2R1Y3ROb2RlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRXb3JrUHJvZHVjdE5vZGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuV29ya1Byb2R1Y3ROb2RlI2dldFR5cGUgPGVtPlR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5UeXBlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuV29ya1Byb2R1Y3ROb2RlI2dldFR5cGUoKQotCSAqIEBzZWUgI2dldFdvcmtQcm9kdWN0Tm9kZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0V29ya1Byb2R1Y3ROb2RlX1R5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkFjdGl2aXR5RGV0YWlsRGlhZ3JhbSA8ZW0+QWN0aXZpdHkgRGV0YWlsIERpYWdyYW08L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+QWN0aXZpdHkgRGV0YWlsIERpYWdyYW08L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5BY3Rpdml0eURldGFpbERpYWdyYW0KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldEFjdGl2aXR5RGV0YWlsRGlhZ3JhbSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5BY3Rpdml0eURldGFpbERpYWdyYW0jaXNBdXRvTGF5b3V0IDxlbT5BdXRvIExheW91dDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkF1dG8gTGF5b3V0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuQWN0aXZpdHlEZXRhaWxEaWFncmFtI2lzQXV0b0xheW91dCgpCi0JICogQHNlZSAjZ2V0QWN0aXZpdHlEZXRhaWxEaWFncmFtKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRBY3Rpdml0eURldGFpbERpYWdyYW1fQXV0b0xheW91dCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZUNvbnRhaW5lciA8ZW0+Tm9kZSBDb250YWluZXI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+Tm9kZSBDb250YWluZXI8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlQ29udGFpbmVyCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXROb2RlQ29udGFpbmVyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZUNvbnRhaW5lciNnZXROb2RlcyA8ZW0+Tm9kZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPk5vZGVzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZUNvbnRhaW5lciNnZXROb2RlcygpCi0JICogQHNlZSAjZ2V0Tm9kZUNvbnRhaW5lcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0Tm9kZUNvbnRhaW5lcl9Ob2RlcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuUm9sZU5vZGUgPGVtPlJvbGUgTm9kZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Sb2xlIE5vZGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Sb2xlTm9kZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0Um9sZU5vZGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLlJvbGVUYXNrQ29tcG9zaXRlIDxlbT5Sb2xlIFRhc2sgQ29tcG9zaXRlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlJvbGUgVGFzayBDb21wb3NpdGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Sb2xlVGFza0NvbXBvc2l0ZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0Um9sZVRhc2tDb21wb3NpdGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuUm9sZVRhc2tDb21wb3NpdGUjZ2V0Um93SW5kZXggPGVtPlJvdyBJbmRleDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlJvdyBJbmRleDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLlJvbGVUYXNrQ29tcG9zaXRlI2dldFJvd0luZGV4KCkKLQkgKiBAc2VlICNnZXRSb2xlVGFza0NvbXBvc2l0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0Um9sZVRhc2tDb21wb3NpdGVfUm93SW5kZXgoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLlRhc2tOb2RlIDxlbT5UYXNrIE5vZGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+VGFzayBOb2RlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuVGFza05vZGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFRhc2tOb2RlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLlRhc2tOb2RlI2dldEluZGV4IDxlbT5JbmRleDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkluZGV4PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuVGFza05vZGUjZ2V0SW5kZXgoKQotCSAqIEBzZWUgI2dldFRhc2tOb2RlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrTm9kZV9JbmRleCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZSA8ZW0+V29yayBQcm9kdWN0IERlc2NyaXB0b3IgTm9kZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Xb3JrIFByb2R1Y3QgRGVzY3JpcHRvciBOb2RlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuV29ya0JyZWFrZG93bkVsZW1lbnROb2RlIDxlbT5Xb3JrIEJyZWFrZG93biBFbGVtZW50IE5vZGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+V29yayBCcmVha2Rvd24gRWxlbWVudCBOb2RlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuV29ya0JyZWFrZG93bkVsZW1lbnROb2RlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRXb3JrQnJlYWtkb3duRWxlbWVudE5vZGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLldvcmtQcm9kdWN0Q29tcG9zaXRlIDxlbT5Xb3JrIFByb2R1Y3QgQ29tcG9zaXRlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPldvcmsgUHJvZHVjdCBDb21wb3NpdGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Xb3JrUHJvZHVjdENvbXBvc2l0ZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0V29ya1Byb2R1Y3RDb21wb3NpdGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuV29ya1Byb2R1Y3RDb21wb3NpdGUjZ2V0VHlwZSA8ZW0+VHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlR5cGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Xb3JrUHJvZHVjdENvbXBvc2l0ZSNnZXRUeXBlKCkKLQkgKiBAc2VlICNnZXRXb3JrUHJvZHVjdENvbXBvc2l0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0V29ya1Byb2R1Y3RDb21wb3NpdGVfVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIG9yZy5lY2xpcHNlLmRyYXcyZC5BYnNvbHV0ZUJlbmRwb2ludCA8ZW0+QWJzb2x1dGUgQmVuZHBvaW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5BYnNvbHV0ZSBCZW5kcG9pbnQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5kcmF3MmQuQWJzb2x1dGVCZW5kcG9pbnQKLQkgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0ib3JnLmVjbGlwc2UuZHJhdzJkLkFic29sdXRlQmVuZHBvaW50IgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBFRGF0YVR5cGUgZ2V0QWJzb2x1dGVCZW5kcG9pbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQgPGVtPlBvaW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5Qb2ludDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludAotCSAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQiCi0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIEVEYXRhVHlwZSBnZXRQb2ludCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZURlc2NyaXB0b3IgPGVtPlJvbGUgRGVzY3JpcHRvcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+Um9sZSBEZXNjcmlwdG9yPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRvcgotCSAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdG9yIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRGF0YVR5cGUgZ2V0Um9sZURlc2NyaXB0b3IoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGZhY3RvcnkgdGhhdCBjcmVhdGVzIHRoZSBpbnN0YW5jZXMgb2YgdGhlIG1vZGVsLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgZmFjdG9yeSB0aGF0IGNyZWF0ZXMgdGhlIGluc3RhbmNlcyBvZiB0aGUgbW9kZWwuCi0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIE1vZGVsRmFjdG9yeSBnZXRNb2RlbEZhY3RvcnkoKTsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogRGVmaW5lcyBsaXRlcmFscyBmb3IgdGhlIG1ldGEgb2JqZWN0cyB0aGF0IHJlcHJlc2VudAotCSAqIDx1bD4KLQkgKiAgIDxsaT5lYWNoIGNsYXNzLDwvbGk+Ci0JICogICA8bGk+ZWFjaCBmZWF0dXJlIG9mIGVhY2ggY2xhc3MsPC9saT4KLQkgKiAgIDxsaT5lYWNoIGVudW0sPC9saT4KLQkgKiAgIDxsaT5hbmQgZWFjaCBkYXRhIHR5cGU8L2xpPgotCSAqIDwvdWw+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCWludGVyZmFjZSBMaXRlcmFscyAgewotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuRGlhZ3JhbUltcGwgPGVtPkRpYWdyYW08L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLkRpYWdyYW1JbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5Nb2RlbFBhY2thZ2VJbXBsI2dldERpYWdyYW0oKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgRElBR1JBTSA9IGVJTlNUQU5DRS5nZXREaWFncmFtKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLkxpbmtJbXBsIDxlbT5MaW5rPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5MaW5rSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuTW9kZWxQYWNrYWdlSW1wbCNnZXRMaW5rKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIExJTksgPSBlSU5TVEFOQ0UuZ2V0TGluaygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIExJTktfX05BTUUgPSBlSU5TVEFOQ0UuZ2V0TGlua19OYW1lKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Tb3VyY2U8L2I+PC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgTElOS19fU09VUkNFID0gZUlOU1RBTkNFLmdldExpbmtfU291cmNlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5UYXJnZXQ8L2I+PC9lbT4nIHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBMSU5LX19UQVJHRVQgPSBlSU5TVEFOQ0UuZ2V0TGlua19UYXJnZXQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkJlbmRwb2ludHM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIExJTktfX0JFTkRQT0lOVFMgPSBlSU5TVEFOQ0UuZ2V0TGlua19CZW5kcG9pbnRzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Tb3VyY2UgRW5kIFBvaW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgTElOS19fU09VUkNFX0VORF9QT0lOVCA9IGVJTlNUQU5DRS5nZXRMaW5rX1NvdXJjZUVuZFBvaW50KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5UYXJnZXQgRW5kIFBvaW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgTElOS19fVEFSR0VUX0VORF9QT0lOVCA9IGVJTlNUQU5DRS5nZXRMaW5rX1RhcmdldEVuZFBvaW50KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLkxpbmtlZE9iamVjdEltcGwgPGVtPkxpbmtlZCBPYmplY3Q8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLkxpbmtlZE9iamVjdEltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLk1vZGVsUGFja2FnZUltcGwjZ2V0TGlua2VkT2JqZWN0KCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIExJTktFRF9PQkpFQ1QgPSBlSU5TVEFOQ0UuZ2V0TGlua2VkT2JqZWN0KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5MaW5rZWQgRWxlbWVudDwvYj48L2VtPicgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIExJTktFRF9PQkpFQ1RfX0xJTktFRF9FTEVNRU5UID0gZUlOU1RBTkNFLmdldExpbmtlZE9iamVjdF9MaW5rZWRFbGVtZW50KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLk5hbWVkTm9kZUltcGwgPGVtPk5hbWVkIE5vZGU8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLk5hbWVkTm9kZUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLk1vZGVsUGFja2FnZUltcGwjZ2V0TmFtZWROb2RlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIE5BTUVEX05PREUgPSBlSU5TVEFOQ0UuZ2V0TmFtZWROb2RlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgTkFNRURfTk9ERV9fTkFNRSA9IGVJTlNUQU5DRS5nZXROYW1lZE5vZGVfTmFtZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5Ob2RlSW1wbCA8ZW0+Tm9kZTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuTm9kZUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLk1vZGVsUGFja2FnZUltcGwjZ2V0Tm9kZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBOT0RFID0gZUlOU1RBTkNFLmdldE5vZGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkxvY2F0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgTk9ERV9fTE9DQVRJT04gPSBlSU5TVEFOQ0UuZ2V0Tm9kZV9Mb2NhdGlvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+V2lkdGg8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBOT0RFX19XSURUSCA9IGVJTlNUQU5DRS5nZXROb2RlX1dpZHRoKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5IZWlnaHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBOT0RFX19IRUlHSFQgPSBlSU5TVEFOQ0UuZ2V0Tm9kZV9IZWlnaHQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkluY29taW5nIENvbm5lY3Rpb25zPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBOT0RFX19JTkNPTUlOR19DT05ORUNUSU9OUyA9IGVJTlNUQU5DRS5nZXROb2RlX0luY29taW5nQ29ubmVjdGlvbnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk91dGdvaW5nIENvbm5lY3Rpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBOT0RFX19PVVRHT0lOR19DT05ORUNUSU9OUyA9IGVJTlNUQU5DRS5nZXROb2RlX091dGdvaW5nQ29ubmVjdGlvbnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlJlYWQgT25seTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIE5PREVfX1JFQURfT05MWSA9IGVJTlNUQU5DRS5nZXROb2RlX1JlYWRPbmx5KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLkFjdGl2aXR5RGlhZ3JhbUltcGwgPGVtPkFjdGl2aXR5IERpYWdyYW08L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLkFjdGl2aXR5RGlhZ3JhbUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLk1vZGVsUGFja2FnZUltcGwjZ2V0QWN0aXZpdHlEaWFncmFtKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIEFDVElWSVRZX0RJQUdSQU0gPSBlSU5TVEFOQ0UuZ2V0QWN0aXZpdHlEaWFncmFtKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLlR5cGVkTm9kZUltcGwgPGVtPlR5cGVkIE5vZGU8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLlR5cGVkTm9kZUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLk1vZGVsUGFja2FnZUltcGwjZ2V0VHlwZWROb2RlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFRZUEVEX05PREUgPSBlSU5TVEFOQ0UuZ2V0VHlwZWROb2RlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5UeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgVFlQRURfTk9ERV9fVFlQRSA9IGVJTlNUQU5DRS5nZXRUeXBlZE5vZGVfVHlwZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5Xb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtSW1wbCA8ZW0+V29yayBQcm9kdWN0IERlcGVuZGVuY3kgRGlhZ3JhbTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLk1vZGVsUGFja2FnZUltcGwjZ2V0V29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBXT1JLX1BST0RVQ1RfREVQRU5ERU5DWV9ESUFHUkFNID0gZUlOU1RBTkNFLmdldFdvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW0oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuV29ya1Byb2R1Y3ROb2RlSW1wbCA8ZW0+V29yayBQcm9kdWN0IE5vZGU8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLldvcmtQcm9kdWN0Tm9kZUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLk1vZGVsUGFja2FnZUltcGwjZ2V0V29ya1Byb2R1Y3ROb2RlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFdPUktfUFJPRFVDVF9OT0RFID0gZUlOU1RBTkNFLmdldFdvcmtQcm9kdWN0Tm9kZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VHlwZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFdPUktfUFJPRFVDVF9OT0RFX19UWVBFID0gZUlOU1RBTkNFLmdldFdvcmtQcm9kdWN0Tm9kZV9UeXBlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLkFjdGl2aXR5RGV0YWlsRGlhZ3JhbUltcGwgPGVtPkFjdGl2aXR5IERldGFpbCBEaWFncmFtPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5BY3Rpdml0eURldGFpbERpYWdyYW1JbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5Nb2RlbFBhY2thZ2VJbXBsI2dldEFjdGl2aXR5RGV0YWlsRGlhZ3JhbSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBBQ1RJVklUWV9ERVRBSUxfRElBR1JBTSA9IGVJTlNUQU5DRS5nZXRBY3Rpdml0eURldGFpbERpYWdyYW0oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkF1dG8gTGF5b3V0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgQUNUSVZJVFlfREVUQUlMX0RJQUdSQU1fX0FVVE9fTEFZT1VUID0gZUlOU1RBTkNFLmdldEFjdGl2aXR5RGV0YWlsRGlhZ3JhbV9BdXRvTGF5b3V0KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLk5vZGVDb250YWluZXJJbXBsIDxlbT5Ob2RlIENvbnRhaW5lcjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuTm9kZUNvbnRhaW5lckltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLk1vZGVsUGFja2FnZUltcGwjZ2V0Tm9kZUNvbnRhaW5lcigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBOT0RFX0NPTlRBSU5FUiA9IGVJTlNUQU5DRS5nZXROb2RlQ29udGFpbmVyKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Ob2RlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgTk9ERV9DT05UQUlORVJfX05PREVTID0gZUlOU1RBTkNFLmdldE5vZGVDb250YWluZXJfTm9kZXMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuUm9sZU5vZGVJbXBsIDxlbT5Sb2xlIE5vZGU8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLlJvbGVOb2RlSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuTW9kZWxQYWNrYWdlSW1wbCNnZXRSb2xlTm9kZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBST0xFX05PREUgPSBlSU5TVEFOQ0UuZ2V0Um9sZU5vZGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuUm9sZVRhc2tDb21wb3NpdGVJbXBsIDxlbT5Sb2xlIFRhc2sgQ29tcG9zaXRlPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5Sb2xlVGFza0NvbXBvc2l0ZUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLk1vZGVsUGFja2FnZUltcGwjZ2V0Um9sZVRhc2tDb21wb3NpdGUoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgUk9MRV9UQVNLX0NPTVBPU0lURSA9IGVJTlNUQU5DRS5nZXRSb2xlVGFza0NvbXBvc2l0ZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Um93IEluZGV4PC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgUk9MRV9UQVNLX0NPTVBPU0lURV9fUk9XX0lOREVYID0gZUlOU1RBTkNFLmdldFJvbGVUYXNrQ29tcG9zaXRlX1Jvd0luZGV4KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLlRhc2tOb2RlSW1wbCA8ZW0+VGFzayBOb2RlPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5UYXNrTm9kZUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLk1vZGVsUGFja2FnZUltcGwjZ2V0VGFza05vZGUoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgVEFTS19OT0RFID0gZUlOU1RBTkNFLmdldFRhc2tOb2RlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JbmRleDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFRBU0tfTk9ERV9fSU5ERVggPSBlSU5TVEFOQ0UuZ2V0VGFza05vZGVfSW5kZXgoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZUltcGwgPGVtPldvcmsgUHJvZHVjdCBEZXNjcmlwdG9yIE5vZGU8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLldvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5Nb2RlbFBhY2thZ2VJbXBsI2dldFdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGUoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfTk9ERSA9IGVJTlNUQU5DRS5nZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLldvcmtCcmVha2Rvd25FbGVtZW50Tm9kZUltcGwgPGVtPldvcmsgQnJlYWtkb3duIEVsZW1lbnQgTm9kZTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuV29ya0JyZWFrZG93bkVsZW1lbnROb2RlSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuTW9kZWxQYWNrYWdlSW1wbCNnZXRXb3JrQnJlYWtkb3duRWxlbWVudE5vZGUoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgV09SS19CUkVBS0RPV05fRUxFTUVOVF9OT0RFID0gZUlOU1RBTkNFLmdldFdvcmtCcmVha2Rvd25FbGVtZW50Tm9kZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5Xb3JrUHJvZHVjdENvbXBvc2l0ZUltcGwgPGVtPldvcmsgUHJvZHVjdCBDb21wb3NpdGU8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLldvcmtQcm9kdWN0Q29tcG9zaXRlSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuTW9kZWxQYWNrYWdlSW1wbCNnZXRXb3JrUHJvZHVjdENvbXBvc2l0ZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBXT1JLX1BST0RVQ1RfQ09NUE9TSVRFID0gZUlOU1RBTkNFLmdldFdvcmtQcm9kdWN0Q29tcG9zaXRlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5UeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgV09SS19QUk9EVUNUX0NPTVBPU0lURV9fVFlQRSA9IGVJTlNUQU5DRS5nZXRXb3JrUHJvZHVjdENvbXBvc2l0ZV9UeXBlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT5BYnNvbHV0ZSBCZW5kcG9pbnQ8L2VtPicgZGF0YSB0eXBlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5kcmF3MmQuQWJzb2x1dGVCZW5kcG9pbnQKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLk1vZGVsUGFja2FnZUltcGwjZ2V0QWJzb2x1dGVCZW5kcG9pbnQoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFRGF0YVR5cGUgQUJTT0xVVEVfQkVORFBPSU5UID0gZUlOU1RBTkNFLmdldEFic29sdXRlQmVuZHBvaW50KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT5Qb2ludDwvZW0+JyBkYXRhIHR5cGUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuTW9kZWxQYWNrYWdlSW1wbCNnZXRQb2ludCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVEYXRhVHlwZSBQT0lOVCA9IGVJTlNUQU5DRS5nZXRQb2ludCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+Um9sZSBEZXNjcmlwdG9yPC9lbT4nIGRhdGEgdHlwZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRvcgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuTW9kZWxQYWNrYWdlSW1wbCNnZXRSb2xlRGVzY3JpcHRvcigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVEYXRhVHlwZSBST0xFX0RFU0NSSVBUT1IgPSBlSU5TVEFOQ0UuZ2V0Um9sZURlc2NyaXB0b3IoKTsKLQotCX0KLQotfSAvL01vZGVsUGFja2FnZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL05hbWVkTm9kZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL05hbWVkTm9kZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZGMzY2Q2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9OYW1lZE5vZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOwotCi0vKioKLSAqIEEgZGlhZ3JhbSBub2RlIHdpdGggbmFtZQotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICogQG1vZGVsCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgTmFtZWROb2RlIGV4dGVuZHMgTm9kZSB7Ci0JLyoqCi0JICogR2V0cyBub2RlIG5hbWUKLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBuYW1lIG9mIHRoaXMgbm9kZQotCSAqIEBtb2RlbAotCSAqLwotCVN0cmluZyBnZXROYW1lKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5OYW1lZE5vZGUjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldE5hbWUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIEdldHMgdGhlIHN1cHByZXNzaW9uIHN0YXR1cyBvZiB0aGlzIG5vZGUKLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIGl0IGlzIHN1cHByZXNzZWQsIDxjb2RlPmZhbHNlPC9jb2RlPgotCSAqICAgICAgICAgb3RoZXJ3aXNlCi0JICovCi0JYm9vbGVhbiBpc1N1cHByZXNzZWQoKTsKLQotCS8qKgotCSAqIEdldHMgdGhlIHdyYXBwZXIgb2YgdGhlIG1ldGhvZCBlbGVtZW50IHRoYXQgdGhpcyBub2RlIHJlcHJlc2VudHMKLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSB3cmFwcGVyCi0JICovCi0JT2JqZWN0IGdldFdyYXBwZXIoKTsKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9Ob2RlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvTm9kZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZWRhMmFlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9Ob2RlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaE5vZGU7Ci0KLS8qKgotICogVGhlIGRpYWdyYW0gbm9kZQotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICogQG1vZGVsIGFic3RyYWN0PSJ0cnVlIgotICovCi1wdWJsaWMgaW50ZXJmYWNlIE5vZGUgZXh0ZW5kcyBMaW5rZWRPYmplY3QgewotCi0JLyoqCi0JICogR2V0cyBsb2NhdGlvbiBvZiB0aGlzIG5vZGUKLQkgKiAKLQkgKiBAbW9kZWwgdHJhbnNpZW50PSJ0cnVlIgotCSAqLwotCVBvaW50IGdldExvY2F0aW9uKCk7Ci0KLQkvKioKLQkgKiBHZXRzIHdpZHRoCi0JICogCi0JICogQG1vZGVsIGRlZmF1bHQ9Ii0xIiB0cmFuc2llbnQ9InRydWUiCi0JICovCi0JaW50IGdldFdpZHRoKCk7Ci0KLQkvKioKLQkgKiBHZXRzIGhlaWdodAotCSAqIAotCSAqIEByZXR1cm4gdGhlIGhlaWdodAotCSAqIEBtb2RlbCBkZWZhdWx0PSItMSIgdHJhbnNpZW50PSJ0cnVlIgotCSAqLwotCWludCBnZXRIZWlnaHQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGUjZ2V0SGVpZ2h0IDxlbT5IZWlnaHQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5IZWlnaHQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEhlaWdodCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0SGVpZ2h0KGludCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlI2dldFdpZHRoIDxlbT5XaWR0aDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPldpZHRoPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRXaWR0aCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0V2lkdGgoaW50IHZhbHVlKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGUjZ2V0TG9jYXRpb24gPGVtPkxvY2F0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TG9jYXRpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldExvY2F0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRMb2NhdGlvbihQb2ludCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBHZXRzIGluY29taW5nIGxpbmtzCi0JICogCi0JICogQG1vZGVsIHR5cGU9IkxpbmsiIG9wcG9zaXRlPSJ0YXJnZXQiIGxvd2VyPSIwIgotCSAqLwotCUVMaXN0PExpbms+IGdldEluY29taW5nQ29ubmVjdGlvbnMoKTsKLQotCS8qKgotCSAqIEdldHMgb3V0Z29pbmcgbGlua3MKLQkgKiAKLQkgKiBAbW9kZWwgdHlwZT0iTGluayIgY29udGFpbm1lbnQ9InRydWUiIG9wcG9zaXRlPSJzb3VyY2UiIGxvd2VyPSIwIgotCSAqLwotCUVMaXN0PExpbms+IGdldE91dGdvaW5nQ29ubmVjdGlvbnMoKTsKLQotCS8qKgotCSAqIENoZWNrcyBpZiB0aGlzIG5vZGUgaXMgcmVhZC1vbmx5Ci0JICogCi0JICogQG1vZGVsCi0JICovCi0JYm9vbGVhbiBpc1JlYWRPbmx5KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlI2lzUmVhZE9ubHkgPGVtPlJlYWQgT25seTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlJlYWQgT25seTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNSZWFkT25seSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UmVhZE9ubHkoYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBkaWFncmFtIG9mIHRoaXMgbm9kZQotCSAqIAotCSAqIEByZXR1cm4KLQkgKi8KLQlEaWFncmFtIGdldERpYWdyYW0oKTsKLQotCS8qKgotCSAqIFNldHMgZGlhZ3JhbSBmb3IgdGhpcyBub2RlCi0JICogCi0JICogQHBhcmFtIGRpYWdyYW0KLQkgKi8KLQl2b2lkIHNldERpYWdyYW0oRGlhZ3JhbSBkaWFncmFtKTsKLQotCS8qKgotCSAqIEdldHMgdGhlIEdyYXBoTm9kZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBub2RlLgotCSAqIAotCSAqIEByZXR1cm4KLQkgKi8KLQlHcmFwaE5vZGUgZ2V0R3JhcGhOb2RlKCk7Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSB0eXBlIG9mIG1ldGhvZCBlbGVtZW50IGFkYXB0ZXIuIE1ldGhvZCBlbGVtZW50IGFkYXB0ZXIgaXMgYSBub2RlCi0JICogaW50ZXJuYWwge0BsaW5rIEFkYXB0ZXIgYWRhcHRlcn0gdGhhdCBpcyBsaXN0ZW5pbmcgb24gY2hhbmdlcyBvZiBsaW5rZWQKLQkgKiBtZXRob2QgZWxlbWVudCBvciBpdHMgd3JhcHBlciB0byB1cGRhdGUgdGhlIG5vZGUgYWNjb3JkaW5nbHkuCi0JICogCi0JICogQHJldHVybiB0aGUgY2xhc3Mgb2YgdGhlIG1ldGhvZCBlbGVtZW50IGFkYXB0ZXIgb2YgdGhpcyBub2RlCi0JICovCi0JQ2xhc3MgZ2V0TWV0aG9kRWxlbWVudEFkYXB0ZXJUeXBlKCk7Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyB1c2VkIHRvIHNldCB0aGUgVU1BIGRpYWdyYW0gZm9yIHRoZSBuZXcgbm9kZSBzbyBpdCBjYW4KLQkgKiBmaW5kIHRoZSBHcmFwaE5vZGUgZm9yIHRoZSBsaW5rZWQgbWV0aG9kIGVsZW1lbnQuCi0JICogCi0JICogQHBhcmFtIHVtYURpYWdyYW0KLQkgKi8KLQl2b2lkIHNldFVNQURpYWdyYW0ob3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtIHVtYURpYWdyYW0pOwotCi0JLyoqCi0JICogU2V0cyB0aGUgZ3JhcGggbm9kZSB0aGF0IGlzIHRoZSBjb250YWluZXIgb2YgdGhlCi0JICoge0BsaW5rICNnZXRHcmFwaE5vZGUoKSBsaW5rZWQgZ3JhcGggbm9kZX0KLQkgKiAKLQkgKiBAcGFyYW0gdW1hQ29udGFpbmVyCi0JICovCi0Jdm9pZCBzZXRVTUFDb250YWluZXIoR3JhcGhOb2RlIHVtYUNvbnRhaW5lcik7Ci0KLQkvKioKLQkgKiBBZGRzIHRoZSBnaXZlbiBjb25zdW1lciB0byB0aGUgY29uc3VtZXIgbGlzdCBvZiB0aGlzIG5vZGUuCi0JICogCi0JICogQHBhcmFtIGNvbnN1bWVyCi0JICovCi0Jdm9pZCBhZGRDb25zdW1lcihPYmplY3QgY29uc3VtZXIpOwotCi0JLyoqCi0JICogUmVtb3ZlcyB0aGUgZ2l2ZW4gY29uc3VtZXIgZnJvbSB0aGUgY29uc3VtZXIgbGlzdCBvZiB0aGlzIG5vZGUuIERpc3Bvc2VzCi0JICogdGhlIG5vZGUgaWYgaXQgZG9lcyBub3QgaGF2ZSBhbnkgbW9yZSBjb25zdW1lciBhZnRlciB0aGlzIGNhbGwuIERpc3Bvc2luZwotCSAqIGEgbm9kZSB3aWxsIHRha2UgY2FyZSBvZiByZW1vdmluZyB0aGlzIG5vZGUncyBsaXN0ZW5lciBmcm9tIHRoZSBVTUEKLQkgKiBvYmplY3QgYW5kIGFsbCB0aGUgYWRhcHRlcnMgdGhhdCBoYWQgYmVlbiBhZGRlZCB0byB0aGUgYWRhcHRlciBsaXN0IG9mCi0JICogdGhpcyBub2RlLgotCSAqIAotCSAqIEBwYXJhbSBjb25zdW1lcgotCSAqLwotCXZvaWQgcmVtb3ZlQ29uc3VtZXIoT2JqZWN0IGNvbnN1bWVyKTsKLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9Ob2RlQ29udGFpbmVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvTm9kZUNvbnRhaW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMWRkZjU5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9Ob2RlQ29udGFpbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLQotLyoqCi0gKiBBIGNvbXBvc2l0ZSBub2RlIHRoYXQgY2FuIGNvbnRhaW4gY2hpbGQgbm9kZXMKLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqIEBtb2RlbCBhYnN0cmFjdD0idHJ1ZSIKLSAqLwotcHVibGljIGludGVyZmFjZSBOb2RlQ29udGFpbmVyIGV4dGVuZHMgTm9kZSB7Ci0JLyoqCi0JICogR2V0cyBjaGlsZCBub2RlcwotCSAqIAotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIgdHlwZT0iTm9kZSIKLQkgKi8KLQlFTGlzdDxOb2RlPiBnZXROb2RlcygpOwotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL1Jlc291cmNlcy5wcm9wZXJ0aWVzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL1Jlc291cmNlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZGVhZTUyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9SZXNvdXJjZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSCi0KLXR5cGVfYWN0aXZpdHk9QWN0aXZpdHkgRGlhZ3JhbQotZGVmYXVsdEJhc2VOYW1lPU5ldyB7MH0KLXR5cGVfV1BEPVdvcmsgUHJvZHVjdCBEZXBlbmRlbmN5IERpYWdyYW0KLXR5cGVfYWN0aXZpdHlEZXRhaWw9QWN0aXZpdHkgRGV0YWlsIERpYWdyYW0KLWFkZEZyZWVUeHQ9QWRkIEZyZWUgVGV4dAotdHlwZV91bmtub3duPVVua25vd24KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9Sb2xlTm9kZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL1JvbGVOb2RlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhYTQ2NzMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL1JvbGVOb2RlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDsKLQotLyoqCi0gKiBOb2RlIHRoYXQgcmVwcmVzZW50cyBhIHJvbGUgaW4gZGlhZ3JhbQotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICogQG1vZGVsCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUm9sZU5vZGUgZXh0ZW5kcyBOYW1lZE5vZGUgewotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvUm9sZVRhc2tDb21wb3NpdGUuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9Sb2xlVGFza0NvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OTYzNmVmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9Sb2xlVGFza0NvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw7Ci0KLS8qKgotICogQSBjb250YWluZXIgdGhhdCBncm91cHMgYSBSb2xlTm9kZSBhbmQgVGFza05vZGVzIHdob3NlIHRhc2tzIHRoZSBSb2xlIHBlcmZvcm1zLgotICogVGhlIGxpbmtlZCBvYmplY3QgZm9yIFJvbGVUYXNrQ29tcG9zaXRlIGlzIFJvbGVEZXNjcmlwdG9yLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICogQG1vZGVsCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUm9sZVRhc2tDb21wb3NpdGUgZXh0ZW5kcyBOb2RlQ29udGFpbmVyIHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Sb3cgSW5kZXg8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlJvdyBJbmRleDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Sb3cgSW5kZXg8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFJvd0luZGV4KGludCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk1vZGVsUGFja2FnZSNnZXRSb2xlVGFza0NvbXBvc2l0ZV9Sb3dJbmRleCgpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBnZXRSb3dJbmRleCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuUm9sZVRhc2tDb21wb3NpdGUjZ2V0Um93SW5kZXggPGVtPlJvdyBJbmRleDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Um93IEluZGV4PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRSb3dJbmRleCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Um93SW5kZXgoaW50IHZhbHVlKTsKLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL1Rhc2tOb2RlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvVGFza05vZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTA0MTNlNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvVGFza05vZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOwotCi0vKioKLSAqIE5vZGUgdGhhdCByZXByZXNlbnRzIGEgdGFzayBpbiBkaWFncmFtCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKiBAbW9kZWwKLSAqLwotcHVibGljIGludGVyZmFjZSBUYXNrTm9kZSBleHRlbmRzIE5hbWVkTm9kZSB7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JbmRleDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiItMSI8L2NvZGU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SW5kZXg8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SW5kZXg8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEluZGV4KGludCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk1vZGVsUGFja2FnZSNnZXRUYXNrTm9kZV9JbmRleCgpCi0JICogQG1vZGVsIGRlZmF1bHQ9Ii0xIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgZ2V0SW5kZXgoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLlRhc2tOb2RlI2dldEluZGV4IDxlbT5JbmRleDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SW5kZXg8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEluZGV4KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRJbmRleChpbnQgdmFsdWUpOwotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvVHlwZWROb2RlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvVHlwZWROb2RlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjMGY0Y2EuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL1R5cGVkTm9kZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw7Ci0KLS8qKgotICogTm9kZSB0aGF0IGlzIG5vdCBsaW5rZWQgdG8gYW55IG1ldGhvZCBlbGVtZW50IChub3QgYSB7QGxpbmsgTGlua2VkT2JqZWN0fSkuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKiBAbW9kZWwKLSAqLwotcHVibGljIGludGVyZmFjZSBUeXBlZE5vZGUgZXh0ZW5kcyBOb2RlIHsKLQlzdGF0aWMgZmluYWwgaW50IFNZTkNIX0JBUiA9IDE7Ci0KLQlzdGF0aWMgZmluYWwgaW50IERFQ0lTSU9OID0gMjsKLQotCXN0YXRpYyBmaW5hbCBpbnQgU1RBUlQgPSAzOwotCi0Jc3RhdGljIGZpbmFsIGludCBFTkQgPSA0OwotCi0Jc3RhdGljIGZpbmFsIGludCBTVElDS1lfTk9URSA9IDU7Ci0KLQlzdGF0aWMgZmluYWwgaW50IEZSRUVfVEVYVCA9IDY7Ci0KLQkvKioKLQkgKiBHZXRzIHR5cGUuIFRoZSB0eXBlIG11c3QgYmUgb25lIG9mIHRoZSBjb25zdGFudHMgZGVmaW5lZCBpbiB0aGlzCi0JICogaW50ZXJmYWNlLgotCSAqIAotCSAqIEBtb2RlbAotCSAqLwotCWludCBnZXRUeXBlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5UeXBlZE5vZGUjZ2V0VHlwZSA8ZW0+VHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFR5cGUoaW50IHZhbHVlKTsKLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL1dvcmtCcmVha2Rvd25FbGVtZW50Tm9kZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL1dvcmtCcmVha2Rvd25FbGVtZW50Tm9kZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMjcxNGZhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9Xb3JrQnJlYWtkb3duRWxlbWVudE5vZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrQnJlYWtkb3duRWxlbWVudDsKLQotLyoqCi0gKiBOb2RlIHRoYXQgcmVwcmVzZW50cyBhIHtAbGluayBXb3JrQnJlYWtkb3duRWxlbWVudH0KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqIEBtb2RlbAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFdvcmtCcmVha2Rvd25FbGVtZW50Tm9kZSBleHRlbmRzIE5hbWVkTm9kZSB7Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9Xb3JrUHJvZHVjdENvbXBvc2l0ZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL1dvcmtQcm9kdWN0Q29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjMTI2MTAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL1dvcmtQcm9kdWN0Q29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3Q7Ci0KLS8qKgotICogTm9kZSB0aGF0IHJlcHJlc2VudHMgYSBncm91cCBvZiB7QGxpbmsgV29ya1Byb2R1Y3R9Ci0gKiAKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQHNpbmNlIDEuMAotICogQG1vZGVsCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgV29ya1Byb2R1Y3RDb21wb3NpdGUgZXh0ZW5kcyBOb2RlQ29udGFpbmVyIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOUFVUUyA9IDE7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBPVVRQVVRTID0gMjsKLQotCS8qKgotCSAqIEdldHMgdHlwZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHtAbGluayAjSU5QVVRTfSBvciB7QGxpbmsgI09VVFBVVFN9Ci0JICogQG1vZGVsCi0JICovCi0JaW50IGdldFR5cGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLldvcmtQcm9kdWN0Q29tcG9zaXRlI2dldFR5cGUgPGVtPlR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5UeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRUeXBlKGludCB2YWx1ZSk7Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9Xb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5N2RiODFhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9Xb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDsKLQotLyoqCi0gKiBUaGlzIGludGVyZmFjZSByZXByZXNlbnRzIHRoZSBtb2RlbCBvZiB0aGUgV29yayBQcm9kdWN0IERlcGVuZGVuY3kgZGlhZ3JhbQotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICogQG1vZGVsCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbSBleHRlbmRzIERpYWdyYW0gewotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL1dvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGM0ODEyOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw7Ci0KLS8qKgotICogTm9kZSBmb3IgV29ya1Byb2R1Y3REZXNjcmlwdG9yIGluIEFjdGl2aXR5RGV0YWlsRGlhZ3JhbS4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqIEBtb2RlbAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGUgZXh0ZW5kcyBOYW1lZE5vZGUgewotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvV29ya1Byb2R1Y3ROb2RlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvV29ya1Byb2R1Y3ROb2RlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1ZDRmYWQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL1dvcmtQcm9kdWN0Tm9kZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw7Ci0KLS8qKgotICogVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgbm9kZSBpbiBXb3JrIFByb2R1Y3QgRGVwZW5kZW5jeSBEaWFncmFtCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKiBAbW9kZWwKLSAqLwotcHVibGljIGludGVyZmFjZSBXb3JrUHJvZHVjdE5vZGUgZXh0ZW5kcyBOYW1lZE5vZGUgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQVJUSUZBQ1QgPSAxOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVMSVZFUkFCTEUgPSAyOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1VUQ09NRSA9IDM7Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSB3b3JrIHByb2R1Y3QgdHlwZSBvZiB0aGlzIG5vZGUuIFRoaXMgbXVzdCBiZSBvbmUgb2YgdGhlCi0JICogZm9sbG93aW5nIGNvbnN0YW50czoge0BsaW5rICNBUlRJRkFDVH0sIHtAbGluayAjREVMSVZFUkFCTEV9LCB7QGxpbmsgI09VVENPTUV9Ci0JICogCi0JICogQG1vZGVsCi0JICovCi0JaW50IGdldFR5cGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLldvcmtQcm9kdWN0Tm9kZSNnZXRUeXBlIDxlbT5UeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VHlwZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VHlwZShpbnQgdmFsdWUpOwotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvaW1wbC9BY3Rpdml0eURldGFpbERpYWdyYW1JbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvaW1wbC9BY3Rpdml0eURldGFpbERpYWdyYW1JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjYTJjZTEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL2ltcGwvQWN0aXZpdHlEZXRhaWxEaWFncmFtSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTY2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5BZGFwdGVyRmFjdG9yeVRyZWVJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuQWN0aXZpdHlEZXRhaWxEaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTW9kZWxGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk1vZGVsUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGVDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuUm9sZVRhc2tDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuVGFza05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuV29ya1Byb2R1Y3RDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwudXRpbC5HcmFwaGljYWxEYXRhSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLnV0aWwuSUFjdGl2aXR5RGV0YWlsRGlhZ3JhbUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLnV0aWwuSUFkYXB0ZXJGYWN0b3J5RmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkJTQWN0aXZpdHlJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5JQlNJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkNvbmZpZ3VyYWJsZUNvbXBvc2VkQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlByb2Nlc3NVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BcnRpZmFjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQXNzb2NpYXRpb25IZWxwZXI7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkFjdGl2aXR5IERldGFpbCBEaWFncmFtPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLkFjdGl2aXR5RGV0YWlsRGlhZ3JhbUltcGwjaXNBdXRvTGF5b3V0IDxlbT5BdXRvIExheW91dDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXR5RGV0YWlsRGlhZ3JhbUltcGwgZXh0ZW5kcyBEaWFncmFtSW1wbCBpbXBsZW1lbnRzCi0JCUFjdGl2aXR5RGV0YWlsRGlhZ3JhbSB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzQXV0b0xheW91dCgpIDxlbT5BdXRvIExheW91dDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNBdXRvTGF5b3V0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gQVVUT19MQVlPVVRfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzQXV0b0xheW91dCgpIDxlbT5BdXRvIExheW91dDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNBdXRvTGF5b3V0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBhdXRvTGF5b3V0ID0gQVVUT19MQVlPVVRfRURFRkFVTFQ7Ci0KLQlwcml2YXRlIGNsYXNzIEFjdGl2aXR5RGV0YWlsRGlhZ3JhbUNoYW5nZUxpc3RlbmVyIGV4dGVuZHMgQWN0aXZpdHlBZGFwdGVyCi0JCQlpbXBsZW1lbnRzIElBY3Rpdml0eURldGFpbERpYWdyYW1DaGFuZ2VMaXN0ZW5lciB7Ci0JCS8vIC8qIChub24tSmF2YWRvYykKLQkJLy8gKiBAc2VlCi0JCS8vIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuRGlhZ3JhbUltcGwuQWN0aXZpdHlBZGFwdGVyI25vdGlmeUNoYW5nZWQob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uKQotCQkvLyAqLwotCQkvLyBwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBtc2cpIHsKLQkJLy8gaWYoIW5vdGlmaWNhdGlvbkVuYWJsZWQpIHJldHVybjsKLQkJLy8gbm90aWZpY2F0aW9uRW5hYmxlZCA9IGZhbHNlOwotCQkvLyB0cnkgewotCQkvLyBPYmplY3Qgb2JqOwotCQkvLyBzd2l0Y2gobXNnLmdldEZlYXR1cmVJRChBY3Rpdml0eS5jbGFzcykpIHsKLQkJLy8gY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX19CUkVBS0RPV05fRUxFTUVOVFM6Ci0JCS8vIHJlcG9wdWxhdGVEaWFncmFtKCk7Ci0JCS8vIGJyZWFrOwotCQkvLyB9Ci0JCS8vIH0KLQkJLy8gZmluYWxseSB7Ci0JCS8vIG5vdGlmaWNhdGlvbkVuYWJsZWQgPSB0cnVlOwotCQkvLyB9Ci0JCS8vCi0JCS8vIH0KLQotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqLwotCXByb3RlY3RlZCBBY3Rpdml0eURldGFpbERpYWdyYW1JbXBsKCkgewotCQlzdXBlcigpOwotCi0JCWRpYWdyYW1DaGFuZ2VMaXN0ZW5lciA9IG5ldyBBY3Rpdml0eURldGFpbERpYWdyYW1DaGFuZ2VMaXN0ZW5lcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgTW9kZWxQYWNrYWdlLkFDVElWSVRZX0RFVEFJTF9ESUFHUkFNX19BVVRPX0xBWU9VVDoKLQkJCQlyZXR1cm4gaXNBdXRvTGF5b3V0KCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5BQ1RJVklUWV9ERVRBSUxfRElBR1JBTV9fQVVUT19MQVlPVVQ6Ci0JCQkJc2V0QXV0b0xheW91dCgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBNb2RlbFBhY2thZ2UuQUNUSVZJVFlfREVUQUlMX0RJQUdSQU1fX0FVVE9fTEFZT1VUOgotCQkJCXNldEF1dG9MYXlvdXQoQVVUT19MQVlPVVRfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBNb2RlbFBhY2thZ2UuQUNUSVZJVFlfREVUQUlMX0RJQUdSQU1fX0FVVE9fTEFZT1VUOgotCQkJCXJldHVybiBhdXRvTGF5b3V0ICE9IEFVVE9fTEFZT1VUX0VERUZBVUxUOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoYXV0b0xheW91dDogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChhdXRvTGF5b3V0KTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgcmVwb3B1bGF0ZURpYWdyYW0oKSB7Ci0JCS8vIGNsZWFyIGRpYWdyYW0KLQkJLy8KLQotCQlpbnQgc2l6ZSA9IGdldE5vZGVzKCkuc2l6ZSgpOwotCi0JCS8vIGRpc2FibGUgbm90aWZpY2F0aW9uIGZvciBhbGwgbm9kZXMgaW4gdGhpcyBkaWFncmFtIHRvIGF2b2lkIHVud2FudGVkCi0JCS8vIGNvbmN1cnJlbnQgbW9kaWZpY2F0aW9uIG9mIHRoZWlyIGNvbm5lY3Rpb24gbGlzdAotCQkvLwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJTm9kZUltcGwgbm9kZSA9ICgoTm9kZUltcGwpIGdldE5vZGVzKCkuZ2V0KGkpKTsKLQkJCW5vZGUubm90aWZpY2F0aW9uRW5hYmxlZCA9IGZhbHNlOwotCQl9Ci0JCWZvciAoSXRlcmF0b3IgaXRlcmF0aW9uID0gZ2V0Tm9kZXMoKS5pdGVyYXRvcigpOyBpdGVyYXRpb24uaGFzTmV4dCgpOykgewotCQkJTm9kZSBub2RlID0gKE5vZGUpIGl0ZXJhdGlvbi5uZXh0KCk7Ci0KLQkJCS8vIGNsZWFyIGFsbCBsaW5rcwotCQkJLy8KLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IG5vZGUuZ2V0T3V0Z29pbmdDb25uZWN0aW9ucygpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQlMaW5rIGxpbmsgPSAoTGluaykgaXRlci5uZXh0KCk7Ci0JCQkJbGluay5zZXRUYXJnZXQobnVsbCk7Ci0JCQl9Ci0KLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IG5vZGUuZ2V0SW5jb21pbmdDb25uZWN0aW9ucygpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQlMaW5rIGxpbmsgPSAoTGluaykgaXRlci5uZXh0KCk7Ci0JCQkJbGluay5zZXRTb3VyY2UobnVsbCk7Ci0JCQl9Ci0JCQlub2RlLmdldE91dGdvaW5nQ29ubmVjdGlvbnMoKS5jbGVhcigpOwotCQkJbm9kZS5nZXRJbmNvbWluZ0Nvbm5lY3Rpb25zKCkuY2xlYXIoKTsKLQkJfQotCi0JCWdldE5vZGVzKCkuY2xlYXIoKTsKLQotCQlwb3B1bGF0ZURpYWdyYW0oKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBNb2RlbFBhY2thZ2UuTGl0ZXJhbHMuQUNUSVZJVFlfREVUQUlMX0RJQUdSQU07Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0F1dG9MYXlvdXQoKSB7Ci0JCWlmKGlzR3JhcGhpY2FsRGF0YVJlcXVpcmVkKCkpIHsKLQkJCXJldHVybiBHcmFwaGljYWxEYXRhSGVscGVyLlBST1BfQVVUT19MQVlPVVRfVkFMVUVfVFJVRS5lcXVhbHMoCi0JCQkJCUdyYXBoaWNhbERhdGFIZWxwZXIuZ2V0QXV0b0xheW91dEZsYWcodGhpcykpOwotCQl9Ci0JCXJldHVybiBhdXRvTGF5b3V0OwotCX0KLQotCi0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBdXRvTGF5b3V0KGJvb2xlYW4gbmV3QXV0b0xheW91dCkgewotCQlib29sZWFuIG9sZEF1dG9MYXlvdXQgPSBhdXRvTGF5b3V0OwotCQlhdXRvTGF5b3V0ID0gbmV3QXV0b0xheW91dDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTW9kZWxQYWNrYWdlLkFDVElWSVRZX0RFVEFJTF9ESUFHUkFNX19BVVRPX0xBWU9VVCwgb2xkQXV0b0xheW91dCwgYXV0b0xheW91dCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBkb1NldEF1dG9MYXlvdXQoYm9vbGVhbiBuZXdBdXRvTGF5b3V0KSB7Ci0JCWlmKGlzR3JhcGhpY2FsRGF0YVJlcXVpcmVkKCkpIHsKLQkJCUdyYXBoaWNhbERhdGFIZWxwZXIuY3JlYXRlUHJvcGVydHkodGhpcy5ncmFwaE5vZGUsIAotCQkJCQlHcmFwaGljYWxEYXRhSGVscGVyLlBST1BfQVVUT19MQVlPVVQsIAotCQkJCQlTdHJpbmcudmFsdWVPZihuZXdBdXRvTGF5b3V0KSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlzZXRBdXRvTGF5b3V0KG5ld0F1dG9MYXlvdXQpOwotCQl9Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKCkgewotCQlyZXR1cm4gZ2V0QWxsQnJlYWtkb3duRWxlbWVudHModHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyBhbGwgYnJlYWtkb3duIGVsZW1lbnRzIG9yIHRoZWlyIHdyYXBwZXJzIGZvciB0aGUgYWN0aXZpdHkgb2YgdGhpcwotCSAqIGRpYWdyYW0KLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JQ29sbGVjdGlvbiBnZXRBbGxCcmVha2Rvd25FbGVtZW50cyhib29sZWFuIGZpbHRlclN1cHByZXNzZWQpIHsKLQkJQXJyYXlMaXN0IGJyZWFrZG93bkVsZW1lbnRzID0gbmV3IEFycmF5TGlzdCgpOwotCQlBZGFwdGVyRmFjdG9yeVtdIGFkYXB0ZXJGYWN0b3JpZXM7Ci0JCWlmIChmaWx0ZXIgaW5zdGFuY2VvZiBJQWRhcHRlckZhY3RvcnlGaWx0ZXIpIHsKLQkJCUlBZGFwdGVyRmFjdG9yeUZpbHRlciBhZGFwdGVyRmFjdG9yeUZpbHRlciA9IChJQWRhcHRlckZhY3RvcnlGaWx0ZXIpIGZpbHRlcjsKLQkJCWFkYXB0ZXJGYWN0b3JpZXMgPSBuZXcgQWRhcHRlckZhY3RvcnlbXSB7Ci0JCQkJCWFkYXB0ZXJGYWN0b3J5RmlsdGVyLmdldFdCU0FkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCWFkYXB0ZXJGYWN0b3J5RmlsdGVyLmdldFRCU0FkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCWFkYXB0ZXJGYWN0b3J5RmlsdGVyLmdldFdQQlNBZGFwdGVyRmFjdG9yeSgpIH07Ci0JCX0gZWxzZSB7Ci0JCQlhZGFwdGVyRmFjdG9yaWVzID0gREVGQVVMVF9BREFQVEVSX0ZBQ1RPUklFUzsKLQkJfQotCQlpZiAod3JhcHBlciAhPSBudWxsKSB7Ci0JCQlMaXN0IHdyYXBwZXJzID0gUHJvY2Vzc1V0aWwuZ2V0V3JhcHBlcnMod3JhcHBlciwgYWRhcHRlckZhY3Rvcmllcyk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB3cmFwcGVycy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlciB3ID0gKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSBpdGVyCi0JCQkJCQkubmV4dCgpOwotCQkJCWV4dHJhY3RDaGlsZHJlbih3LCB3LCBicmVha2Rvd25FbGVtZW50cywgZmlsdGVyU3VwcHJlc3NlZCk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGFkYXB0ZXJGYWN0b3JpZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSA9IGFkYXB0ZXJGYWN0b3JpZXNbaV07Ci0JCQkJaWYgKGdldE9iamVjdCgpICE9IG51bGwpIHsKLQkJCQkJaWYgKGFkYXB0ZXJGYWN0b3J5ICE9IG51bGwpIHsKLQkJCQkJCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciBhZGFwdGVyID0gKElUcmVlSXRlbUNvbnRlbnRQcm92aWRlcikgYWRhcHRlckZhY3RvcnkKLQkJCQkJCQkJLmFkYXB0KGdldE9iamVjdCgpLAotCQkJCQkJCQkJCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCQkJCQlleHRyYWN0Q2hpbGRyZW4oYWRhcHRlciwgZ2V0T2JqZWN0KCksCi0JCQkJCQkJCWJyZWFrZG93bkVsZW1lbnRzLCBmaWx0ZXJTdXBwcmVzc2VkKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQkJLy8gYWRkIGRlc2NyaXB0b3JzIG9mIHN1YmFydGlmYWN0cwotCQkvLwotCQlBZGFwdGVyRmFjdG9yeSB3cGJzQWRhcHRlckZhY3RvcnkgPSBhZGFwdGVyRmFjdG9yaWVzWzJdOwotCQlmb3IgKEl0ZXJhdG9yPD8+IGl0ZXJhdG9yID0gbmV3IEFycmF5TGlzdChicmVha2Rvd25FbGVtZW50cykuaXRlcmF0b3IoKTsgaXRlcmF0b3IKLQkJCQkuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGNoaWxkID0gaXRlcmF0b3IubmV4dCgpOwotCQkJT2JqZWN0IGUgPSBUbmdVdGlsLnVud3JhcChjaGlsZCk7Ci0JCQlpZihlIGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yKSB7Ci0JCQkJV29ya1Byb2R1Y3Qgd3AgPSAoKFdvcmtQcm9kdWN0RGVzY3JpcHRvcillKS5nZXRXb3JrUHJvZHVjdCgpOwotCQkJCWlmKHdwIGluc3RhbmNlb2YgQXJ0aWZhY3QKLQkJCQkJCS8vIEZJWE1FOiBuZWVkIHRvIHVzZWQgcmVhbGl6ZWQgbGlzdCBvZiBzdWJhcnRpZmFjdHMgYWZ0ZXIgc2ltaWxhciBmaXggaXMgbWFkZSBpbgotCQkJCQkJLy8gb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLldvcmtQcm9kdWN0RGVzY3JpcHRvckl0ZW1Qcm92aWRlci5qYXZhCi0JCQkJCQkvLwotCQkJCQkJJiYgISgoQXJ0aWZhY3Qpd3ApLmdldENvbnRhaW5lZEFydGlmYWN0cygpLmlzRW1wdHkoKSAKLQkJCQkpIHsKLQkJCQkJY29sbGVjdFN1YmFydGlmYWN0RGVzY3JpcHRvcnMoY2hpbGQsIGZpbHRlclN1cHByZXNzZWQsIGJyZWFrZG93bkVsZW1lbnRzLCB3cGJzQWRhcHRlckZhY3RvcnkpOwotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIGJyZWFrZG93bkVsZW1lbnRzOwotCX0KLQotCXByaXZhdGUgdm9pZCBjb2xsZWN0U3ViYXJ0aWZhY3REZXNjcmlwdG9ycyhPYmplY3QgY2hpbGQsCi0JCQlib29sZWFuIGZpbHRlclN1cHByZXNzZWQsIEFycmF5TGlzdDxPYmplY3Q+IGJyZWFrZG93bkVsZW1lbnRzLAotCQkJQWRhcHRlckZhY3Rvcnkgd3Bic0FkYXB0ZXJGYWN0b3J5KSB7Ci0JCS8vIGRpc2FibGUgcm9sbHVwIGJlZm9yZSBnZXR0aW5nIHRoZSBjaGlsZHJlbgotCQkvLwotCQlib29sZWFuIG9sZFJvbGxlZFVwID0gZmFsc2U7Ci0JCUlCU0l0ZW1Qcm92aWRlciBhZGFwdGVyID0gbnVsbDsKLQkJaWYoY2hpbGQgaW5zdGFuY2VvZiBCU0FjdGl2aXR5SXRlbVByb3ZpZGVyKSB7Ci0JCQlCU0FjdGl2aXR5SXRlbVByb3ZpZGVyIGl0ZW1Qcm92aWRlciA9IChCU0FjdGl2aXR5SXRlbVByb3ZpZGVyKSBjaGlsZDsKLQkJCW9sZFJvbGxlZFVwID0gaXRlbVByb3ZpZGVyLmlzUm9sbGVkVXAoKTsKLQkJCWl0ZW1Qcm92aWRlci5iYXNpY1NldFJvbGxlZFVwKGZhbHNlKTsKLQkJCWFkYXB0ZXIgPSBpdGVtUHJvdmlkZXI7Ci0JCX0KLQkJZWxzZSBpZihhZGFwdGVyIGluc3RhbmNlb2YgSUJTSXRlbVByb3ZpZGVyKXsKLQkJCUlCU0l0ZW1Qcm92aWRlciBpdGVtUHJvdmlkZXIgPSAoSUJTSXRlbVByb3ZpZGVyKSBjaGlsZDsKLQkJCW9sZFJvbGxlZFVwID0gaXRlbVByb3ZpZGVyLmlzUm9sbGVkVXAoKTsKLQkJCWl0ZW1Qcm92aWRlci5zZXRSb2xsZWRVcChmYWxzZSk7Ci0JCQlhZGFwdGVyID0gaXRlbVByb3ZpZGVyOwotCQl9Ci0JCQotCQl0cnkgewotCi0JCQlBZGFwdGVyRmFjdG9yeVRyZWVJdGVyYXRvcjxPYmplY3Q+IGl0ZXIgPSBuZXcgQWRhcHRlckZhY3RvcnlUcmVlSXRlcmF0b3I8T2JqZWN0PigKLQkJCQkJd3Bic0FkYXB0ZXJGYWN0b3J5LCBjaGlsZCwgZmFsc2UpOwotCQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQkJT2JqZWN0IG8gPSBpdGVyLm5leHQoKTsKLQkJCQlpZihmaWx0ZXJTdXBwcmVzc2VkKSB7Ci0JCQkJCWlmKCFnZXRTdXBwcmVzc2lvbigpLmlzU3VwcHJlc3NlZChvKSkgewotCQkJCQkJYnJlYWtkb3duRWxlbWVudHMuYWRkKG8pOwotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlicmVha2Rvd25FbGVtZW50cy5hZGQobyk7Ci0JCQkJfQotCQkJfQotCQl9IGZpbmFsbHkgewotCQkJLy8gcmVzdG9yZSByb2xsZWQtdXAgZmxhZwotCQkJLy8KLQkJCWlmIChhZGFwdGVyICE9IG51bGwpIHsKLQkJCQlhZGFwdGVyLnNldFJvbGxlZFVwKG9sZFJvbGxlZFVwKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5EaWFncmFtSW1wbCNwb3B1bGF0ZU5vZGVzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwb3B1bGF0ZU5vZGVzKCkgewotCQlib29sZWFuIG9sZE5vdGlmeSA9IG5vdGlmaWNhdGlvbkVuYWJsZWQ7Ci0JCXRyeSB7Ci0JCQlub3RpZmljYXRpb25FbmFibGVkID0gZmFsc2U7Ci0JCQlBY3Rpdml0eSBhY3QgPSAoQWN0aXZpdHkpIGdldE9iamVjdCgpOwotCQkJaWYgKGFjdCA9PSBudWxsKQotCQkJCXJldHVybjsKLQotCQkJaWYgKGlzR3JhcGhpY2FsRGF0YVJlcXVpcmVkKCkpIHsKLQkJCQkvLyB0byBwb3B1bGF0ZSB0aGUgdHlwZWRub2RlLgotCQkJCXN1cGVyLnBvcHVsYXRlTm9kZXMoKTsKLQkJCX0KLQotCQkJaWYgKGZpbHRlciA9PSBudWxsKSB7Ci0JCQkJZmlsdGVyID0gKChDb25maWd1cmFibGVDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KSBERUZBVUxUX0FEQVBURVJfRkFDVE9SSUVTWzBdKQotCQkJCQkJLmdldEZpbHRlcigpOwotCQkJfQotCi0JCQkvLyBOb2RlIG5ld05vZGUgPSBudWxsOwotCQkJQXJyYXlMaXN0IG5vZGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJQ29sbGVjdGlvbiBicmVha2Rvd25FbGVtZW50cyA9IGdldEFsbEJyZWFrZG93bkVsZW1lbnRzKHRydWUpOwotCQkJQ29sbGVjdGlvbiByb2xlRGVzY3JpcHRvcnMgPSBuZXcgSGFzaFNldCgpOwotCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGJyZWFrZG93bkVsZW1lbnRzLml0ZXJhdG9yKCk7IGl0ZXJhdG9yCi0JCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IG9iamVjdCA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCQlPYmplY3QgZWxlbWVudCA9IFRuZ1V0aWwudW53cmFwKG9iamVjdCk7Ci0JCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBUYXNrRGVzY3JpcHRvcikgewotCQkJCQlUYXNrRGVzY3JpcHRvciBkZXNjcmlwdG9yID0gKFRhc2tEZXNjcmlwdG9yKSBlbGVtZW50OwotCQkJCQlMaXN0IGRlc2MgPSBkZXNjcmlwdG9yCi0JCQkJCQkJLmdldFBlcmZvcm1lZFByaW1hcmlseUJ5KCk7Ci0JCQkJCWZvciAoSXRlcmF0b3IgaXRvciA9IGRlc2MuaXRlcmF0b3IoKTsgaXRvci5oYXNOZXh0KCk7KQl7Ci0JCQkJCQlSb2xlRGVzY3JpcHRvciByb2xlRGVzY3JpcHRvciA9IChSb2xlRGVzY3JpcHRvcikgaXRvci5uZXh0KCk7Ci0JCQkJCQotCQkJCQkJaWYgKHJvbGVEZXNjcmlwdG9yICE9IG51bGwKLQkJCQkJCQkJJiYgZmlsdGVyLmFjY2VwdChyb2xlRGVzY3JpcHRvcikKLQkJCQkJCQkJLy8gVE9ETzogbmVlZCB0byBjaGVjayBpZiB0aGUgcm9sZSBkZXNjcmlwdG9yIGlzCi0JCQkJCQkJCS8vIGluaGVyaXRlZCBhbmQgbG9jYWxseSBzdXBwcmVzc2VkCi0JCQkJCQkJCS8vIGlmIGxvY2FsbHkgc3VwcHJlc3NlZCwgY2hlY2sgdGhlIHdyYXBwZXIgb2YgdGhlCi0JCQkJCQkJCS8vIHJvbGUgZGVzY3JpcHRvcgotCQkJCQkJCQkvLwotCQkJCQkJCQkmJiAhcm9sZURlc2NyaXB0b3IuZ2V0U3VwcHJlc3NlZCgpLmJvb2xlYW5WYWx1ZSgpCi0JCQkJCQkJCSYmICFyb2xlRGVzY3JpcHRvcnMuY29udGFpbnMocm9sZURlc2NyaXB0b3IpKSB7Ci0JCQkJCQkJcm9sZURlc2NyaXB0b3JzLmFkZChyb2xlRGVzY3JpcHRvcik7Ci0JCQkJCQkJLy8gbmV3Tm9kZSA9IGNyZWF0ZVJvbGVUYXNrQ29tcG9zaXRlKHJvbGVEZXNjcmlwdG9yKTsKLQkJCQkJCQkvLyBpZihuZXdOb2RlICE9IG51bGwpIHsKLQkJCQkJCQkvLyBpZihQcm9jZXNzVXRpbC5pc0luaGVyaXRlZChvYmplY3QpKSB7Ci0JCQkJCQkJLy8gLy8gdGFzayBkZXNjcmlwdG9yIGlzIGluaGVyaXRlZCwgaXRzIHByaW1hcnkKLQkJCQkJCQkvLyBwZXJmb3JtZXIgaXMgbm90IGxvY2FsCi0JCQkJCQkJLy8gLy8gc2V0IHJvbGUgbm9kZSBvZiB0aGUgUm9sZVRhc2tDb21wb3NpdGUgdG8KLQkJCQkJCQkvLyByZWFkLW9ubHkKLQkJCQkJCQkvLyAvLwotCQkJCQkJCS8vIE5vZGUgcm9sZU5vZGUgPSAoTm9kZSkKLQkJCQkJCQkvLyAoKE5vZGVDb250YWluZXIpbmV3Tm9kZSkuZ2V0Tm9kZXMoKS5nZXQoMCk7Ci0JCQkJCQkJLy8gcm9sZU5vZGUuc2V0UmVhZE9ubHkodHJ1ZSk7Ci0JCQkJCQkJLy8gfQotCQkJCQkJCS8vIG5vZGVzLmFkZChuZXdOb2RlKTsKLQkJCQkJCQkvLyB9Ci0JCQkJCQkJY3JlYXRlUm9sZVRhc2tDb21wb3NpdGVSb3dzKHJvbGVEZXNjcmlwdG9yLCBvYmplY3QsCi0JCQkJCQkJCQlub2Rlcyk7Ci0JCQkJCQl9Ci0JCQkJCQlpZiAocm9sZURlc2NyaXB0b3JzLmNvbnRhaW5zKHJvbGVEZXNjcmlwdG9yKSkgewotCQkJCQkJCWNyZWF0ZVRhc2tJbnB1dE91dHB1dE5vZGVzKGRlc2NyaXB0b3IsIG5vZGVzKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCXNlbGVjdE5vZGVzKG5vZGVzKTsKLQkJfSBmaW5hbGx5IHsKLQkJCW5vdGlmaWNhdGlvbkVuYWJsZWQgPSBvbGROb3RpZnk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgaW50IGdldE51bWJlck9mUm93cyhpbnQgdG90YWxUYXNrcywgaW50IHRhc2tzUGVyUm93KSB7Ci0JCWludCBuID0gdG90YWxUYXNrcyAvIHRhc2tzUGVyUm93OwotCQlyZXR1cm4gKHRhc2tzUGVyUm93ICogbikgPT0gdG90YWxUYXNrcyA/IG4gOiBuICsgMTsKLQl9Ci0KLSAgICBwcml2YXRlIHZvaWQgY3JlYXRlUm9sZVRhc2tDb21wb3NpdGVSb3dzKFJvbGVEZXNjcmlwdG9yIHJvbGVEZXNjcmlwdG9yLCAKLSAgICAJCU9iamVjdCBvYmplY3QsIExpc3Qgbm9kZXMpIHsKLSAgICAJCi0gICAgCWludCB0YXNrc1BlclJvdyA9IEdyYXBoaWNhbERhdGFIZWxwZXIuZ2V0VGFza3NQZXJSb3coKTsKLSAgICAJTGlzdDw/PiBwcmltYXJ5VGFza0Rlc2NyaXB0b3JzID0gLy9Bc3NvY2lhdGlvbkhlbHBlci5nZXRQcmltYXJ5VGFza0Rlc2NyaXB0b3JzKHJvbGVEZXNjcmlwdG9yKTsKLSAgICAJCWdldFJlYWxpemVkUHJpbWFyeVRhc2tEZXNjcmlwdG9ycyhyb2xlRGVzY3JpcHRvcik7Ci0gICAgCWludCB0b3RhbFRhc2tzID0gcHJpbWFyeVRhc2tEZXNjcmlwdG9ycy5zaXplKCk7Ci0gICAgCQotICAgIAlpZiAodGFza3NQZXJSb3cgPiAwICYmIHRvdGFsVGFza3MgPiAwICYmIHRvdGFsVGFza3MgPiB0YXNrc1BlclJvdwotCQkJCSYmIGlzQXV0b0xheW91dCgpKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGdldE51bWJlck9mUm93cyh0b3RhbFRhc2tzLCB0YXNrc1BlclJvdyk7IGkrKykgewotCQkJCU5vZGUgbmV3Tm9kZSA9IGNyZWF0ZVJvbGVUYXNrQ29tcG9zaXRlKHJvbGVEZXNjcmlwdG9yLCBpKTsKLQkJCQlpZiAobmV3Tm9kZSAhPSBudWxsKSB7Ci0JCQkJCWlmIChQcm9jZXNzVXRpbC5pc0luaGVyaXRlZChvYmplY3QpKSB7Ci0JCQkJCQkvLyB0YXNrIGRlc2NyaXB0b3IgaXMgaW5oZXJpdGVkLCBpdHMgcHJpbWFyeSBwZXJmb3JtZXIKLQkJCQkJCS8vIGlzIG5vdCBsb2NhbAotCQkJCQkJLy8gc2V0IHJvbGUgbm9kZSBvZiB0aGUgUm9sZVRhc2tDb21wb3NpdGUgdG8gcmVhZC1vbmx5Ci0JCQkJCQkvLwotCQkJCQkJTGlzdDxOb2RlPiBub2RzID0gKChOb2RlQ29udGFpbmVyKSBuZXdOb2RlKS5nZXROb2RlcygpOwotCQkJCQkJaWYgKCFub2RzLmlzRW1wdHkoKSkgewotCQkJCQkJCU5vZGUgcm9sZU5vZGUgPSAoTm9kZSkgbm9kcy5nZXQoMCk7Ci0JCQkJCQkJcm9sZU5vZGUuc2V0UmVhZE9ubHkodHJ1ZSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJbm9kZXMuYWRkKG5ld05vZGUpOwotCQkJCX0KLQkJCX0KLQkJfSBlbHNlIHsKLQkJCU5vZGUgbmV3Tm9kZSA9IGNyZWF0ZVJvbGVUYXNrQ29tcG9zaXRlKHJvbGVEZXNjcmlwdG9yKTsKLQkJCWlmIChuZXdOb2RlICE9IG51bGwpIHsKLQkJCQlpZiAoUHJvY2Vzc1V0aWwuaXNJbmhlcml0ZWQob2JqZWN0KSkgewotCQkJCQkvLyB0YXNrIGRlc2NyaXB0b3IgaXMgaW5oZXJpdGVkLCBpdHMgcHJpbWFyeSBwZXJmb3JtZXIgaXMKLQkJCQkJLy8gbm90IGxvY2FsCi0JCQkJCS8vIHNldCByb2xlIG5vZGUgb2YgdGhlIFJvbGVUYXNrQ29tcG9zaXRlIHRvIHJlYWQtb25seQotCQkJCQkvLwotCQkJCQlMaXN0PE5vZGU+IG5vZHMgPSAoKE5vZGVDb250YWluZXIpIG5ld05vZGUpLmdldE5vZGVzKCk7Ci0JCQkJCWlmICghbm9kcy5pc0VtcHR5KCkpIHsKLQkJCQkJCU5vZGUgcm9sZU5vZGUgPSAoTm9kZSkgbm9kcy5nZXQoMCk7Ci0JCQkJCQlyb2xlTm9kZS5zZXRSZWFkT25seSh0cnVlKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlub2Rlcy5hZGQobmV3Tm9kZSk7Ci0JCQl9Ci0JCX0KLSAgICAJCi0JfQotCi0JLyoqCi0JICogQHBhcmFtIHRhc2tEZXNjcmlwdG9yCi0JICogQHJldHVybgotCSAqLwotCU5vZGUgY3JlYXRlTm9kZShUYXNrRGVzY3JpcHRvciB0YXNrRGVzY3JpcHRvcikgewotCQlOb2RlIG5vZGUgPSBNb2RlbEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVRhc2tOb2RlKCk7Ci0JCW5vZGUuc2V0VU1BQ29udGFpbmVyKGdldEdyYXBoTm9kZSgpKTsKLQkJbm9kZS5zZXREaWFncmFtKHRoaXMpOwotCQlub2RlLnNldE9iamVjdCh0YXNrRGVzY3JpcHRvcik7Ci0JCXJldHVybiBub2RlOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBkZXNjcmlwdG9yCi0JICogQHJldHVybgotCSAqLwotCU5vZGUgY3JlYXRlTm9kZShXb3JrUHJvZHVjdERlc2NyaXB0b3IgZGVzY3JpcHRvcikgewotCQlOb2RlIG5vZGUgPSBNb2RlbEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGUoKTsKLQkJbm9kZS5zZXRVTUFDb250YWluZXIoZ2V0R3JhcGhOb2RlKCkpOwotCQlub2RlLnNldERpYWdyYW0odGhpcyk7Ci0JCW5vZGUuc2V0T2JqZWN0KGRlc2NyaXB0b3IpOwotCQlyZXR1cm4gbm9kZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuRGlhZ3JhbUltcGwjcG9wdWxhdGVMaW5rcygpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcG9wdWxhdGVMaW5rcygpIHsKLQkJcG9wdWxhdGVMaW5rcyhnZXROb2RlcygpLCB0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbmV3Tm9kZXMKLQkgKiBAcGFyYW0gZGlzYWJsZU5vdGlmaWNhdGlvbgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBvcHVsYXRlTGlua3MoQ29sbGVjdGlvbiBuZXdOb2RlcywgYm9vbGVhbiBkaXNhYmxlTm90aWZpY2F0aW9uKSB7Ci0JCS8vIGZpbGwgb3V0Z29pbmcvaW5jb21pbmcgY29ubmVjdGlvbiBsaXN0cyBvZiBhbGwgbm9kZXMKLQkJLy8KLQkJaW50IHNpemUgPSBnZXROb2RlcygpLnNpemUoKTsKLQkJYm9vbGVhbltdIG5vdGlmaWVzID0gbmV3IGJvb2xlYW5bc2l6ZV07Ci0JCXRyeSB7Ci0JCQlpZiAoZGlzYWJsZU5vdGlmaWNhdGlvbikKLQkJCQkvLyBkaXNhYmxlIG5vdGlmaWNhdGlvbiBmb3IgYWxsIG5vZGVzIGluIHRoaXMgZGlhZ3JhbSB0byBhdm9pZAotCQkJCS8vIHVud2FudGVkIGNvbmN1cnJlbnQgbW9kaWZpY2F0aW9uIG9mIHRoZWlyIGNvbm5lY3Rpb24gbGlzdAotCQkJCS8vCi0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQkJTm9kZSBub2RlID0gKChOb2RlKSBnZXROb2RlcygpLmdldChpKSk7Ci0JCQkJCW5vdGlmaWVzW2ldID0gbm9kZS5lRGVsaXZlcigpOwotCQkJCQlub2RlLmVTZXREZWxpdmVyKGZhbHNlKTsKLQkJCQl9Ci0KLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IG5ld05vZGVzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCU5vZGUgY2hpbGQgPSAoTm9kZSkgaXRlci5uZXh0KCk7Ci0JCQkJaWYgKGNoaWxkIGluc3RhbmNlb2YgV29ya1Byb2R1Y3RDb21wb3NpdGUpIHsKLQkJCQkJLy8gV29ya1Byb2R1Y3RDb21wb3NpdGUgd29ya3Byb2R1Y3RDb21wb3NpdGUgPQotCQkJCQkvLyAoV29ya1Byb2R1Y3RDb21wb3NpdGUpIGNoaWxkLmdldE9iamVjdCgpOwotCQkJCQlXb3JrUHJvZHVjdENvbXBvc2l0ZSB3b3JrcHJvZHVjdENvbXBvc2l0ZSA9IChXb3JrUHJvZHVjdENvbXBvc2l0ZSkgY2hpbGQ7Ci0JCQkJCWlmICh3b3JrcHJvZHVjdENvbXBvc2l0ZS5nZXRUeXBlKCkgPT0gV29ya1Byb2R1Y3RDb21wb3NpdGUuSU5QVVRTKSB7Ci0JCQkJCQlPYmplY3Qgb2JqZWN0ID0gd29ya3Byb2R1Y3RDb21wb3NpdGUuZ2V0T2JqZWN0KCk7Ci0JCQkJCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgVGFza0Rlc2NyaXB0b3IpIHsKLQkJCQkJCQlOb2RlIG5vZGUgPSBHcmFwaGljYWxEYXRhSGVscGVyLmZpbmROb2RlKHRoaXMsCi0JCQkJCQkJCQlvYmplY3QsIFRhc2tOb2RlLmNsYXNzKTsKLQkJCQkJCQlpZihub2RlICE9IG51bGwgJiYgR3JhcGhpY2FsRGF0YUhlbHBlci5maW5kTGluayhjaGlsZCwgb2JqZWN0KSA9PSBudWxsKSB7Ci0JCQkJCQkJCUxpbmsgbGluayA9IE1vZGVsRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlTGluaygpOwotCQkJCQkJCQlsaW5rLnNldFNvdXJjZShjaGlsZCk7Ci0JCQkJCQkJCWxpbmsuc2V0VGFyZ2V0KG5vZGUpOwotCQkJCQkJCQlpZihpc0dyYXBoaWNhbERhdGFSZXF1aXJlZCgpKSB7Ci0JCQkJCQkJCQlHcmFwaGljYWxEYXRhSGVscGVyLmFkZEdyYXBoaWNhbERhdGEobGluayk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJaWYgKHdvcmtwcm9kdWN0Q29tcG9zaXRlLmdldFR5cGUoKSA9PSBXb3JrUHJvZHVjdENvbXBvc2l0ZS5PVVRQVVRTKSB7Ci0JCQkJCQlPYmplY3Qgb2JqZWN0ID0gd29ya3Byb2R1Y3RDb21wb3NpdGUuZ2V0T2JqZWN0KCk7Ci0JCQkJCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgVGFza0Rlc2NyaXB0b3IpIHsKLQkJCQkJCQlOb2RlIG5vZGUgPSBHcmFwaGljYWxEYXRhSGVscGVyLmZpbmROb2RlKHRoaXMsCi0JCQkJCQkJCQlvYmplY3QsIFRhc2tOb2RlLmNsYXNzKTsKLQkJCQkJCQlpZihub2RlICE9IG51bGwgJiYgR3JhcGhpY2FsRGF0YUhlbHBlci5maW5kTGluayhub2RlLCBvYmplY3QpID09IG51bGwpIHsKLQkJCQkJCQkJTGluayBsaW5rID0gTW9kZWxGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVMaW5rKCk7Ci0JCQkJCQkJCWxpbmsuc2V0U291cmNlKG5vZGUpOwotCQkJCQkJCQlsaW5rLnNldFRhcmdldChjaGlsZCk7Ci0JCQkJCQkJCWlmKGlzR3JhcGhpY2FsRGF0YVJlcXVpcmVkKCkpIHsKLQkJCQkJCQkJCUdyYXBoaWNhbERhdGFIZWxwZXIuYWRkR3JhcGhpY2FsRGF0YShsaW5rKTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLSAJCX0gZmluYWxseSB7Ci0JCQlpZiAoZGlzYWJsZU5vdGlmaWNhdGlvbikKLQkJCQkvLyByZXN0b3JlIG5vdGlmaWNhdGlvbiBmbGFnCi0JCQkJLy8KLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCQkoKEVPYmplY3QpIGdldE5vZGVzKCkuZ2V0KGkpKS5lU2V0RGVsaXZlcihub3RpZmllc1tpXSk7Ci0JCQkJfQotCQl9Ci0KLQl9Ci0JCi0JcHJpdmF0ZSBSb2xlVGFza0NvbXBvc2l0ZSBkb0NyZWF0ZVJvbGVUYXNrQ29tcG9zaXRlKFJvbGVEZXNjcmlwdG9yIHJvbGVEZXNjcmlwdG9yLCBpbnQgaW5kZXgpIHsKLQkJUm9sZVRhc2tDb21wb3NpdGUgcm9sZVRhc2tDb21wb3NpdGUgPSBudWxsOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBnZXROb2RlcygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJTm9kZSBlbGVtZW50ID0gKE5vZGUpIGl0ZXIubmV4dCgpOwotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBSb2xlVGFza0NvbXBvc2l0ZSkgewotCQkJCVJvbGVUYXNrQ29tcG9zaXRlIHJ0YyA9IChSb2xlVGFza0NvbXBvc2l0ZSkgZWxlbWVudDsKLQkJCQlpZihydGMuZ2V0TGlua2VkRWxlbWVudCgpID09IHJvbGVEZXNjcmlwdG9yICYmIHJ0Yy5nZXRSb3dJbmRleCgpID09IGluZGV4KSB7Ci0JCQkJCXJvbGVUYXNrQ29tcG9zaXRlID0gcnRjOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlpZiAocm9sZVRhc2tDb21wb3NpdGUgPT0gbnVsbCkgewotCQkJcm9sZVRhc2tDb21wb3NpdGUgPSBNb2RlbEZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJCS5jcmVhdGVSb2xlVGFza0NvbXBvc2l0ZSgpOwotCQkJcm9sZVRhc2tDb21wb3NpdGUuc2V0VU1BQ29udGFpbmVyKGdldEdyYXBoTm9kZSgpKTsKLQkJCXJvbGVUYXNrQ29tcG9zaXRlLnNldERpYWdyYW0odGhpcyk7Ci0JCX0KLQkJcmV0dXJuIHJvbGVUYXNrQ29tcG9zaXRlOwotCX0KLQotCXB1YmxpYyBSb2xlVGFza0NvbXBvc2l0ZSBjcmVhdGVSb2xlVGFza0NvbXBvc2l0ZSgKLQkJCVJvbGVEZXNjcmlwdG9yIHJvbGVEZXNjcmlwdG9yKSB7Ci0JCVJvbGVUYXNrQ29tcG9zaXRlIHJvbGVUYXNrQ29tcG9zaXRlID0gZG9DcmVhdGVSb2xlVGFza0NvbXBvc2l0ZShyb2xlRGVzY3JpcHRvciwwKTsKLQkJcm9sZVRhc2tDb21wb3NpdGUuc2V0T2JqZWN0KHJvbGVEZXNjcmlwdG9yKTsKLQkJcmV0dXJuIHJvbGVUYXNrQ29tcG9zaXRlOwotCX0KLQkKLQlwdWJsaWMgUm9sZVRhc2tDb21wb3NpdGUgY3JlYXRlUm9sZVRhc2tDb21wb3NpdGUoCi0JCQlSb2xlRGVzY3JpcHRvciByb2xlRGVzY3JpcHRvciwgaW50IHJvd0luZGV4KSB7Ci0JCVJvbGVUYXNrQ29tcG9zaXRlIHJvbGVUYXNrQ29tcG9zaXRlID0gZG9DcmVhdGVSb2xlVGFza0NvbXBvc2l0ZShyb2xlRGVzY3JpcHRvciwgcm93SW5kZXgpOwotCQkoKFJvbGVUYXNrQ29tcG9zaXRlSW1wbClyb2xlVGFza0NvbXBvc2l0ZSkuc2V0Um93SW5kZXgocm93SW5kZXgpOwotCQlyb2xlVGFza0NvbXBvc2l0ZS5zZXRPYmplY3Qocm9sZURlc2NyaXB0b3IpOwotCQlyZXR1cm4gcm9sZVRhc2tDb21wb3NpdGU7Ci0JfQotCi0JcHVibGljIFdvcmtQcm9kdWN0Q29tcG9zaXRlIGNyZWF0ZVdvcmtQcm9kdWN0Q29tcG9zaXRlKAotCQkJVGFza0Rlc2NyaXB0b3IgdGFza0Rlc2NyaXB0b3IsIGludCB0eXBlKSB7Ci0JCVdvcmtQcm9kdWN0Q29tcG9zaXRlIHdvcmtwcm9kdWN0Q29tcG9zaXRlID0gbnVsbDsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZ2V0Tm9kZXMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU5vZGUgZWxlbWVudCA9IChOb2RlKSBpdGVyLm5leHQoKTsKLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgV29ya1Byb2R1Y3RDb21wb3NpdGUpIHsKLQkJCQlXb3JrUHJvZHVjdENvbXBvc2l0ZSB3cGMgPSAoV29ya1Byb2R1Y3RDb21wb3NpdGUpIGVsZW1lbnQ7Ci0JCQkJaWYod3BjLmdldExpbmtlZEVsZW1lbnQoKSA9PSB0YXNrRGVzY3JpcHRvciAmJiB3cGMuZ2V0VHlwZSgpID09IHR5cGUpIHsJCQkJCQotCQkJCQl3b3JrcHJvZHVjdENvbXBvc2l0ZSA9IHdwYzsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmKHdvcmtwcm9kdWN0Q29tcG9zaXRlID09IG51bGwpIHsKLQkJCXdvcmtwcm9kdWN0Q29tcG9zaXRlID0gTW9kZWxGYWN0b3J5LmVJTlNUQU5DRQotCQkJLmNyZWF0ZVdvcmtQcm9kdWN0Q29tcG9zaXRlKCk7Ci0JCQl3b3JrcHJvZHVjdENvbXBvc2l0ZS5zZXRUeXBlKHR5cGUpOwotCQl9Ci0JCXdvcmtwcm9kdWN0Q29tcG9zaXRlLnNldFVNQUNvbnRhaW5lcihnZXRHcmFwaE5vZGUoKSk7Ci0JCXdvcmtwcm9kdWN0Q29tcG9zaXRlLnNldERpYWdyYW0odGhpcyk7Ci0JCXdvcmtwcm9kdWN0Q29tcG9zaXRlLnNldE9iamVjdCh0YXNrRGVzY3JpcHRvcik7Ci0JCXJldHVybiB3b3JrcHJvZHVjdENvbXBvc2l0ZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuRGlhZ3JhbUltcGwjZ2V0VHlwZSgpCi0JICovCi0JcHJvdGVjdGVkIGludCBnZXRUeXBlKCkgewotCQlyZXR1cm4gR3JhcGhpY2FsRGF0YUhlbHBlci5BQ1RJVklUWV9ERVRBSUxfRElBR1JBTTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuRGlhZ3JhbUltcGwjZ2V0RGlhZ3JhbUNoYW5nZUxpc3RlbmVyVHlwZSgpCi0JICovCi0JcHJvdGVjdGVkIENsYXNzIGdldERpYWdyYW1DaGFuZ2VMaXN0ZW5lclR5cGUoKSB7Ci0JCXJldHVybiBJQWN0aXZpdHlEZXRhaWxEaWFncmFtQ2hhbmdlTGlzdGVuZXIuY2xhc3M7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLkRpYWdyYW1JbXBsI2dldEJyZWFrZG93bkVsZW1lbnRUeXBlKCkKLQkgKi8KLQlwcm90ZWN0ZWQgQ2xhc3MgZ2V0QnJlYWtkb3duRWxlbWVudFR5cGUoKSB7Ci0JCXJldHVybiBEZXNjcmlwdG9yLmNsYXNzOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5EaWFncmFtSW1wbCN0b05vZGUob3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50KQotCSAqLwotCXByb3RlY3RlZCBOb2RlIHRvTm9kZShNZXRob2RFbGVtZW50IGUpIHsKLQkJaWYgKGUgaW5zdGFuY2VvZiBSb2xlRGVzY3JpcHRvcikgewotCQkJTGlzdCBsaXN0ID0gLy9Bc3NvY2lhdGlvbkhlbHBlci5nZXRQcmltYXJ5VGFza0Rlc2NyaXB0b3JzKChSb2xlRGVzY3JpcHRvcikgZSk7Ci0JCQkJZ2V0UmVhbGl6ZWRQcmltYXJ5VGFza0Rlc2NyaXB0b3JzKChSb2xlRGVzY3JpcHRvcillKTsKLQkJCWlmKCFsaXN0LmlzRW1wdHkoKSkgewotCQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBsaXN0Lml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCQkJT2JqZWN0IG9iaiA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFRhc2tEZXNjcmlwdG9yKSB7Ci0JCQkJCQljcmVhdGVUYXNrSW5wdXRPdXRwdXROb2RlcygoVGFza0Rlc2NyaXB0b3IpIG9iaiwgZ2V0Tm9kZXMoKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJcmV0dXJuIGNyZWF0ZVJvbGVUYXNrQ29tcG9zaXRlKChSb2xlRGVzY3JpcHRvcikgZSk7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoZSBpbnN0YW5jZW9mIFRhc2tEZXNjcmlwdG9yKSB7Ci0JCQljcmVhdGVUYXNrSW5wdXRPdXRwdXROb2RlcygoVGFza0Rlc2NyaXB0b3IpIGUsIGdldE5vZGVzKCkpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5EaWFncmFtSW1wbCNhZGROb2RlKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIE5vZGUgYWRkTm9kZShPYmplY3Qgb2JqKSB7Ci0JCWlmIChmaWx0ZXIgPT0gbnVsbCkgewotCQkJZmlsdGVyID0gKChDb25maWd1cmFibGVDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KSBERUZBVUxUX0FEQVBURVJfRkFDVE9SSUVTWzBdKQotCQkJCQkuZ2V0RmlsdGVyKCk7Ci0JCX0KLQkJTm9kZSBub2RlID0gbnVsbDsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIFRhc2tEZXNjcmlwdG9yKSB7Ci0JCQlMaXN0PFJvbGVEZXNjcmlwdG9yPiBkZXNjTGlzdCA9ICgoVGFza0Rlc2NyaXB0b3IpIG9iaikuZ2V0UGVyZm9ybWVkUHJpbWFyaWx5QnkoKTsKLQkJCWZpbmRfbm9kZToKLQkJCWZvciAoUm9sZURlc2NyaXB0b3Igcm9sZURlc2NyaXB0b3IgOiBkZXNjTGlzdCkJewotCQkJCWlmIChmaWx0ZXIuYWNjZXB0KHJvbGVEZXNjcmlwdG9yKSkgewotCQkJCQlub2RlID0gZmluZE5vZGUodGhpcywgcm9sZURlc2NyaXB0b3IpOwotCQkJCQlpZiAobm9kZSA9PSBudWxsKSB7Ci0JCQkJCQlub2RlID0gY3JlYXRlUm9sZVRhc2tDb21wb3NpdGUocm9sZURlc2NyaXB0b3IpOwotCQkJCQkJZ2V0Tm9kZXMoKS5hZGQobm9kZSk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlub2RlID0gc3VwZXIuYWRkTm9kZShnZXROb2RlcygpLCBvYmopOwotCQkJCQl9Ci0JCQkJCWlmKG5vZGUgIT0gbnVsbCkgewotCQkJCQkJYnJlYWsgZmluZF9ub2RlOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9IGVsc2UgewotCQkJbm9kZSA9IHN1cGVyLmFkZE5vZGUoZ2V0Tm9kZXMoKSwgb2JqKTsKLQkJfQotCQlpZiAobm9kZSAhPSBudWxsKSB7Ci0JCQlwb3B1bGF0ZUxpbmtzKENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3Qobm9kZSksIGZhbHNlKTsKLQkJfQotCQlyZXR1cm4gbm9kZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuRGlhZ3JhbUltcGwjYWRkTm9kZXMoamF2YS51dGlsLkNvbGxlY3Rpb24pCi0JICovCi0JcHJvdGVjdGVkIENvbGxlY3Rpb24gYWRkTm9kZXMoQ29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCUNvbGxlY3Rpb24gbm9kZXMgPSBzdXBlci5hZGROb2Rlcyhjb2xsZWN0aW9uKTsKLQkJaWYgKCFub2Rlcy5pc0VtcHR5KCkpIHsKLQkJCXBvcHVsYXRlTGlua3Mobm9kZXMsIGZhbHNlKTsKLQkJfQotCQlyZXR1cm4gbm9kZXM7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLkRpYWdyYW1JbXBsI3JlbW92ZUZyb21VbWFNb2RlbChvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbW92ZUZyb21VbWFNb2RlbChOb2RlIHJlbW92ZWROb2RlKSB7Ci0JCS8vIGlmIHRoZSByZW1vdmVkIG5vZGUgaXMgYSBUYXNrTm9kZSB0aGF0IGhhZCBiZWVuIG1vdmVkIHRvIGEKLQkJLy8gUm9sZVRhc2tDb21wb3NpdGUKLQkJLy8gdGhlbiBpdHMgVGFza0Rlc2NyaXB0b3Igd2lsbCBub3QgYmUgcmVtb3ZlZCBmcm9tIG1vZGVsCi0JCS8vCi0JCWlmIChHcmFwaGljYWxEYXRhSGVscGVyLmZpbmROb2RlKHRoaXMsIHJlbW92ZWROb2RlLmdldE9iamVjdCgpKSAhPSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKHJlbW92ZWROb2RlIGluc3RhbmNlb2YgUm9sZVRhc2tDb21wb3NpdGUKLQkJCQl8fCByZW1vdmVkTm9kZSBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0Q29tcG9zaXRlKQotCQkJcmV0dXJuOwotCi0JCXN1cGVyLnJlbW92ZUZyb21VbWFNb2RlbChyZW1vdmVkTm9kZSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkVG9VbWFNb2RlbChpbnQgcG9zaXRpb24sIE5vZGUgYWRkZWROb2RlKSB7Ci0JCXN1cGVyLmFkZFRvVW1hTW9kZWwocG9zaXRpb24sIGFkZGVkTm9kZSk7Ci0KLQkJaWYgKGFkZGVkTm9kZS5nZXRPYmplY3QoKSBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnQpIHsKLQkJCUFjdGl2aXR5IGFjdCA9IChBY3Rpdml0eSkgZ2V0T2JqZWN0KCk7Ci0JCQkvLyB0cmFuc2xhdGUgTm9kZSBpbmRleCB0byBBY3Rpdml0eSBpbmRleAotCQkJaW50IGkgPSB0b0FjdGl2aXR5SW5kZXgocG9zaXRpb24pOwotCQkJU3lzdGVtLm91dAotCQkJCQkucHJpbnRsbigiQWN0aXZpdHlEZXRhaWxEaWFncmFtLmFkZFRvVW1hTW9kZWwoKTogV29ya0JyZWFrZG93bkVsZW1lbnQgaW5kZXg6ICIgKyBpKTsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKGkgPT0gLTEpIHsKLQkJCQlhY3QuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5hZGQoKEJyZWFrZG93bkVsZW1lbnQpIGFkZGVkTm9kZS5nZXRPYmplY3QoKSk7Ci0JCQl9IGVsc2UgewotCQkJCWFjdC5nZXRCcmVha2Rvd25FbGVtZW50cygpLmFkZChpLCAoQnJlYWtkb3duRWxlbWVudCkgYWRkZWROb2RlLmdldE9iamVjdCgpKTsKLQkJCX0KLQkJfQotCi0JfQotCi0JcHJpdmF0ZSBpbnQgdG9BY3Rpdml0eUluZGV4KGludCBpbmRleCkgewotCQlpZiAoaW5kZXggPT0gLTEpCi0JCQlyZXR1cm4gaW5kZXg7Ci0JCWludCBzaXplID0gZ2V0Tm9kZXMoKS5zaXplKCk7Ci0JCWludCBpID0gaW5kZXggKyAxOwotCQlpZiAoaSA9PSBzaXplKQotCQkJcmV0dXJuIC0xOwotCQlOb2RlIG5vZGUgPSAoTm9kZSkgZ2V0Tm9kZXMoKS5nZXQoaSk7Ci0JCWlmIChub2RlID09IG51bGwpCi0JCQlyZXR1cm4gLTE7Ci0KLQkJZm9yICg7ICEobm9kZS5nZXRPYmplY3QoKSBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnQpICYmIGkgPCBzaXplOyBpKyspIHsKLQkJCW5vZGUgPSAoTm9kZSkgZ2V0Tm9kZXMoKS5nZXQoaSk7Ci0JCX0KLQkJaWYgKGkgPT0gc2l6ZSkKLQkJCXJldHVybiAtMTsKLQkJQWN0aXZpdHkgYWN0ID0gKEFjdGl2aXR5KSBnZXRPYmplY3QoKTsKLQkJcmV0dXJuIGFjdC5nZXRCcmVha2Rvd25FbGVtZW50cygpLmluZGV4T2Yobm9kZS5nZXRPYmplY3QoKSk7Ci0KLQl9Ci0KLQlwdWJsaWMgTm9kZSBmaW5kTm9kZShBY3Rpdml0eURldGFpbERpYWdyYW0gZGlhZ3JhbSwgT2JqZWN0IG9iamVjdCkgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBkaWFncmFtLmdldE5vZGVzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlOb2RlIGVsZW1lbnQgPSAoTm9kZSkgaXRlci5uZXh0KCk7Ci0JCQlpZiAob2JqZWN0ID09IGVsZW1lbnQuZ2V0T2JqZWN0KCkpIHsKLQkJCQlyZXR1cm4gZWxlbWVudDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQWRhcHRlckZhY3RvcnlbXSBERUZBVUxUX0FEQVBURVJfRkFDVE9SSUVTID0gewkJCQotCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRS5nZXRXQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpLAotCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRS5nZXRPQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpLAotCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRS5nZXRQQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpIAotCX07IAotCQotCXB1YmxpYyB2b2lkIGNyZWF0ZVRhc2tJbnB1dE91dHB1dE5vZGVzKFRhc2tEZXNjcmlwdG9yIGRlc2NyaXB0b3IsIENvbGxlY3Rpb24gbm9kZXMpIHsKLQkJTm9kZSBuZXdOb2RlID0gbnVsbDsKLQkJaWYgKCFkZXNjcmlwdG9yLmdldE1hbmRhdG9yeUlucHV0KCkuaXNFbXB0eSgpKSB7Ci0JCQluZXdOb2RlID0gY3JlYXRlV29ya1Byb2R1Y3RDb21wb3NpdGUoZGVzY3JpcHRvciwKLQkJCQkJV29ya1Byb2R1Y3RDb21wb3NpdGUuSU5QVVRTKTsKLQkJCW5vZGVzLmFkZChuZXdOb2RlKTsKLQkJfQotCQlpZiAoIWRlc2NyaXB0b3IuZ2V0T3V0cHV0KCkuaXNFbXB0eSgpKSB7Ci0JCQluZXdOb2RlID0gY3JlYXRlV29ya1Byb2R1Y3RDb21wb3NpdGUoZGVzY3JpcHRvciwKLQkJCQkJV29ya1Byb2R1Y3RDb21wb3NpdGUuT1VUUFVUUyk7Ci0JCQlub2Rlcy5hZGQobmV3Tm9kZSk7Ci0JCX0KLQl9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5EaWFncmFtSW1wbCNzZXROZXcoYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXROZXcoYm9vbGVhbiBuKSB7Ci0JCXN1cGVyLnNldE5ldyhuKTsKLQkJaWYobil7Ci0JCQlkb1NldEF1dG9MYXlvdXQodHJ1ZSk7Ci0JCX0KLQl9Ci0JCi0JQE92ZXJyaWRlCi0JLyoqCi0JICogRW5hYmxlIHRoaXMgY29kZSwgb25jZSB0aGUgdGFzayBpbmRleCBpcyBmaXhlZCBpbiB0aGUgcm9sZXRhc2tjb21wb3NpdGUuCi0JICovCi0JcHVibGljIHZvaWQgbW92ZU5vZGUoT2JqZWN0IG1vdmVkT2JqZWN0LCBpbnQgcG9zaXRpb24sIE9iamVjdCBvbGRQb3NpdGlvbikgewotCQlpZighKG1vdmVkT2JqZWN0IGluc3RhbmNlb2YgVGFza0Rlc2NyaXB0b3IpKQotCQkJcmV0dXJuOwotCQlUYXNrRGVzY3JpcHRvciB0YXNrRGVzY3JpcHRvciA9IChUYXNrRGVzY3JpcHRvcikgbW92ZWRPYmplY3Q7Ci0JCUxpc3Q8Um9sZURlc2NyaXB0b3I+IGRlc2NMaXN0ID0gKChUYXNrRGVzY3JpcHRvcikgbW92ZWRPYmplY3QpCi0JCQkJLmdldFBlcmZvcm1lZFByaW1hcmlseUJ5KCk7Ci0JCWZpbmRfbm9kZToKLQkJZm9yIChSb2xlRGVzY3JpcHRvciByb2xlRGVzY3JpcHRvciA6IGRlc2NMaXN0KSB7Ci0JCQlpZiAoZmlsdGVyLmFjY2VwdChyb2xlRGVzY3JpcHRvcikpIHsKLQkJCQlOb2RlIHJvbGVOb2RlID0gZmluZE5vZGUodGhpcywgcm9sZURlc2NyaXB0b3IpOwotCQkJCWlmIChyb2xlTm9kZSAhPSBudWxsKSB7Ci0JCQkJCWludCBvbGRQb3MgPSAwOwotCQkJCQlpZiAob2xkUG9zaXRpb24gaW5zdGFuY2VvZiBJbnRlZ2VyKSB7Ci0JCQkJCQlvbGRQb3MgPSAoKEludGVnZXIpIG9sZFBvc2l0aW9uKS5pbnRWYWx1ZSgpOwotCQkJCQl9Ci0JCQkJCVRhc2tOb2RlIHRhc2tOb2RlID0gKFRhc2tOb2RlKSBHcmFwaGljYWxEYXRhSGVscGVyCi0JCQkJCQkJLmZpbmROb2RlKChOb2RlQ29udGFpbmVyKSByb2xlTm9kZSwgdGFza0Rlc2NyaXB0b3IsCi0JCQkJCQkJCQlUYXNrTm9kZS5jbGFzcyk7Ci0KLQkJCQkJLy8gbW92ZSB1cAotCQkJCQlpZiAob2xkUG9zID4gcG9zaXRpb24pIHsKLQkJCQkJCWludCBpID0gdGFza05vZGUuZ2V0SW5kZXgoKTsKLQkJCQkJCU5vZGUgcHJldk5vZGUgPSBmaW5kVGFza05vZGUoCi0JCQkJCQkJCShSb2xlVGFza0NvbXBvc2l0ZSkgcm9sZU5vZGUsIGkgLSAxKTsKLQkJCQkJCWlmIChwcmV2Tm9kZSAhPSBudWxsKSB7Ci0JCQkJCQkJdGFza05vZGUuc2V0SW5kZXgoaSAtIDEpOwotCQkJCQkJCSgoVGFza05vZGUpIHByZXZOb2RlKS5zZXRJbmRleChpKTsKLQkJCQkJCX0KLQotCQkJCQl9IGVsc2UgewotCQkJCQkJLy8gbW92ZSBkb3duCi0JCQkJCQlpbnQgaSA9IHRhc2tOb2RlLmdldEluZGV4KCk7Ci0JCQkJCQlOb2RlIG5leHROb2RlID0gZmluZFRhc2tOb2RlKAotCQkJCQkJCQkoUm9sZVRhc2tDb21wb3NpdGUpIHJvbGVOb2RlLCBpICsgMSk7Ci0JCQkJCQlpZiAobmV4dE5vZGUgIT0gbnVsbCkgewotCQkJCQkJCXRhc2tOb2RlLnNldEluZGV4KGkgKyAxKTsKLQkJCQkJCQkoKFRhc2tOb2RlKSBuZXh0Tm9kZSkuc2V0SW5kZXgoaSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJCi0JCQkJCWJyZWFrIGZpbmRfbm9kZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBOb2RlIGZpbmRUYXNrTm9kZShSb2xlVGFza0NvbXBvc2l0ZSBjb250YWluZXIsIGludCBpbmRleCkgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjb250YWluZXIuZ2V0Tm9kZXMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU5vZGUgZWxlbWVudCA9IChOb2RlKSBpdGVyLm5leHQoKTsKLQkJCWlmKGVsZW1lbnQgaW5zdGFuY2VvZiBUYXNrTm9kZSl7Ci0JCQkJaWYoKChUYXNrTm9kZSllbGVtZW50KS5nZXRJbmRleCgpID09IGluZGV4KXsKLQkJCQkJcmV0dXJuIGVsZW1lbnQ7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgTGlzdCBnZXRSZWFsaXplZFByaW1hcnlUYXNrRGVzY3JpcHRvcnMoUm9sZURlc2NyaXB0b3Igcil7Ci0JCUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJaWYociAhPSBudWxsKXsKLQkJCUxpc3QgYWN0dWFsTGlzdCA9IEFzc29jaWF0aW9uSGVscGVyLmdldFByaW1hcnlUYXNrRGVzY3JpcHRvcnMocik7Ci0JCQlDb2xsZWN0aW9uIGNvbGxlY3Rpb24gPSBnZXRBbGxCcmVha2Rvd25FbGVtZW50cyh0cnVlKTsKLQkJCWZvcihJdGVyYXRvciBpdGVyYXRvciA9IGFjdHVhbExpc3QuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOyl7Ci0JCQkJT2JqZWN0IGUgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJaWYoVG5nVXRpbC5jb250YWlucyhjb2xsZWN0aW9uLCBlKSl7Ci0JCQkJCWxpc3QuYWRkKGUpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbGlzdDsKLQl9Ci0JCi19IC8vIEFjdGl2aXR5RGV0YWlsRGlhZ3JhbUltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9pbXBsL0FjdGl2aXR5RGlhZ3JhbUltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9pbXBsL0FjdGl2aXR5RGlhZ3JhbUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzU3NjE1YS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvaW1wbC9BY3Rpdml0eURpYWdyYW1JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MzMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkFjdGl2aXR5RGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5MaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk1vZGVsRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Nb2RlbFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5UeXBlZE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwudXRpbC5HcmFwaGljYWxEYXRhSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLnV0aWwuSUFjdGl2aXR5RGlhZ3JhbUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLnV0aWwuSUFkYXB0ZXJGYWN0b3J5RmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkFjdGl2aXR5V3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuQlNBY3Rpdml0eUl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLklCU0l0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuV0JTQWN0aXZpdHlJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkNvbmZpZ3VyYWJsZUNvbXBvc2VkQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaEVkZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuU2VtYW50aWNNb2RlbEJyaWRnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlNpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVU1BU2VtYW50aWNNb2RlbEJyaWRnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtCcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya09yZGVyOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5BY3Rpdml0eSBEaWFncmFtPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZpdHlEaWFncmFtSW1wbCBleHRlbmRzIERpYWdyYW1JbXBsIGltcGxlbWVudHMgQWN0aXZpdHlEaWFncmFtIHsKLQlwcml2YXRlIGNsYXNzIEFjdGl2aXR5RGlhZ3JhbUNoYW5nZUxpc3RlbmVyIGV4dGVuZHMgQWN0aXZpdHlBZGFwdGVyCi0JCQlpbXBsZW1lbnRzIElBY3Rpdml0eURpYWdyYW1DaGFuZ2VMaXN0ZW5lciB7Ci0KLQl9OwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICovCi0JcHJvdGVjdGVkIEFjdGl2aXR5RGlhZ3JhbUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJZGlhZ3JhbUNoYW5nZUxpc3RlbmVyID0gbmV3IEFjdGl2aXR5RGlhZ3JhbUNoYW5nZUxpc3RlbmVyKCk7Ci0JfQotCi0JcHJvdGVjdGVkIENsYXNzIGdldERpYWdyYW1DaGFuZ2VMaXN0ZW5lclR5cGUoKSB7Ci0JCXJldHVybiBJQWN0aXZpdHlEaWFncmFtQ2hhbmdlTGlzdGVuZXIuY2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gTW9kZWxQYWNrYWdlLkxpdGVyYWxzLkFDVElWSVRZX0RJQUdSQU07Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcG9wdWxhdGVOb2RlcygpIHsKLQkJLy8gQWN0aXZpdHkgYWN0ID0gKEFjdGl2aXR5KSBnZXRPYmplY3QoKTsKLQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtIGRpYWdyYW0gPSBnZXRVTUFEaWFncmFtKCk7Ci0KLQkJLy8gYWRkIFR5cGVkTm9kZXMKLQkJLy8KLQkJTGlzdCB0eXBlZE5vZGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBkaWFncmFtLmdldENvbnRhaW5lZCgpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyLm5leHQoKTsKLQkJCWludCB0eXBlID0gZ2V0VHlwZShlbGVtZW50KTsKLQkJCWlmICh0eXBlID4gMCkgewotCQkJCVR5cGVkTm9kZSBub2RlID0gTW9kZWxGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVUeXBlZE5vZGUoKTsKLQkJCQlub2RlLnNldFR5cGUodHlwZSk7Ci0JCQkJbm9kZS5zZXRPYmplY3QoZWxlbWVudCk7Ci0JCQkJdHlwZWROb2Rlcy5hZGQobm9kZSk7Ci0JCQl9Ci0JCX0KLQkJZ2V0Tm9kZXMoKS5hZGRBbGwodHlwZWROb2Rlcyk7Ci0KLQkJLy8gYWRkIFdvcmtCcmVha2Rvd25FbGVtZW50Tm9kZXMKLQkJLy8KLQkJYWRkRWxlbWVudE5vZGVzKCk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1ZhbGlkV29ya09yZGVyKFdvcmtPcmRlciB3bywgT2JqZWN0IHByZWQpIHsKLQkJaWYgKHdvLmdldFByZWQoKSA9PSBwcmVkKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0JCWlmIChwcmVkIGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCUFjdGl2aXR5IGFjdCA9IChBY3Rpdml0eSkgcHJlZDsKLQkJCS8vIGNoZWNrIGlmIHByZWRlY2Vzc29yIHJlZmVyZW5jZSBpbiB0aGUgZ2l2ZW4gd29yayBvcmRlciBpcyBiYXNlIG9mCi0JCQkvLyBwcmVkCi0JCQkvLwotCQkJZm9yIChWYXJpYWJpbGl0eUVsZW1lbnQgdmUgPSBhY3QuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpOyB2ZSAhPSBudWxsOyB2ZSA9IHZlCi0JCQkJCS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkpIHsKLQkJCQlpZiAodmUgPT0gd28uZ2V0UHJlZCgpKSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNWYWxpZChMaW5rIGxpbmspIHsKLQkJaWYgKGxpbmsuZ2V0U291cmNlKCkgPT0gbnVsbCB8fCBsaW5rLmdldFRhcmdldCgpID09IG51bGwKLQkJCQl8fCAhZ2V0Tm9kZXMoKS5jb250YWlucyhsaW5rLmdldFNvdXJjZSgpKQotCQkJCXx8ICFnZXROb2RlcygpLmNvbnRhaW5zKGxpbmsuZ2V0VGFyZ2V0KCkpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcG9wdWxhdGVMaW5rcygpIHsKLQkJc3VwZXIucG9wdWxhdGVMaW5rcygpOwotCi0JCS8vIHJlbW92ZSB0aGUgaW52YWxpZCBsaW5rcwotCQkvLwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBnZXROb2RlcygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJTm9kZSBub2RlID0gKChOb2RlKSBpdGVyLm5leHQoKSk7Ci0JCQlXb3JrQnJlYWtkb3duRWxlbWVudCB3YmUgPSBudWxsOwotCQkJaWYgKG5vZGUuZ2V0T2JqZWN0KCkgaW5zdGFuY2VvZiBXb3JrQnJlYWtkb3duRWxlbWVudCkgewotCQkJCXdiZSA9IChXb3JrQnJlYWtkb3duRWxlbWVudCkgbm9kZS5nZXRPYmplY3QoKTsKLQkJCX0KLQkJCUFycmF5TGlzdCBsaW5rc1RvUmVtb3ZlID0gbmV3IEFycmF5TGlzdCgpOwotCQkJbGlua0xpc3RXYWxrOiBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gbm9kZQotCQkJCQkuZ2V0SW5jb21pbmdDb25uZWN0aW9ucygpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCQlMaW5rIGxpbmsgPSAoTGluaykgaXRlcmF0b3IubmV4dCgpOwotCQkJCWlmICghaXNWYWxpZChsaW5rKSkgewotCQkJCQlsaW5rc1RvUmVtb3ZlLmFkZChsaW5rKTsKLQkJCQl9Ci0KLQkJCQlpZiAod2JlICE9IG51bGwpIHsKLQkJCQkJLy8gVE9ETzogbmVlZCByZXZpc2l0IHRvIGNoZWNrIHRoZSB2YWxpZCBjb25uZWN0aW9uIGZyb20gYQotCQkJCQkvLyBUeXBlZE5vZGUKLQkJCQkJLy8KLQkJCQkJaWYgKGxpbmsuZ2V0U291cmNlKCkgaW5zdGFuY2VvZiBUeXBlZE5vZGUpCi0JCQkJCQljb250aW51ZSBsaW5rTGlzdFdhbGs7Ci0KLQkJCQkJT2JqZWN0IHByZWQgPSBsaW5rLmdldFNvdXJjZSgpLmdldE9iamVjdCgpOwotCQkJCQlib29sZWFuIHdvcmtPcmRlckZvdW5kID0gZmFsc2U7Ci0JCQkJCWZpbmRfV29ya09yZGVyOiBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yMSA9IHdiZQotCQkJCQkJCS5nZXRMaW5rVG9QcmVkZWNlc3NvcigpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yMQotCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlXb3JrT3JkZXIgd28gPSAoV29ya09yZGVyKSBpdGVyYXRvcjEubmV4dCgpOwotCQkJCQkJaWYgKGlzVmFsaWRXb3JrT3JkZXIod28sIHByZWQpKSB7Ci0JCQkJCQkJd29ya09yZGVyRm91bmQgPSB0cnVlOwotCQkJCQkJCWJyZWFrIGZpbmRfV29ya09yZGVyOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWlmICghd29ya09yZGVyRm91bmQpIHsKLQkJCQkJCS8vIGludmFsaWQgbGluaywgcmVtb3ZlIGl0Ci0JCQkJCQkvLwotCQkJCQkJbGlua3NUb1JlbW92ZS5hZGQobGluayk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBsaW5rc1RvUmVtb3ZlLml0ZXJhdG9yKCk7IGl0ZXJhdG9yCi0JCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJTGluayBsaW5rID0gKExpbmspIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQlHcmFwaGljYWxEYXRhSGVscGVyLnJlbW92ZUxpbmsobGluayk7Ci0JCQl9Ci0JCQlsaW5rc1RvUmVtb3ZlLmNsZWFyKCk7Ci0KLQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBub2RlLmdldE91dGdvaW5nQ29ubmVjdGlvbnMoKS5pdGVyYXRvcigpOyBpdGVyYXRvcgotCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCUxpbmsgbGluayA9IChMaW5rKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJaWYgKCFpc1ZhbGlkKGxpbmspKSB7Ci0JCQkJCWxpbmtzVG9SZW1vdmUuYWRkKGxpbmspOwotCQkJCX0KLQkJCX0KLQotCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGxpbmtzVG9SZW1vdmUuaXRlcmF0b3IoKTsgaXRlcmF0b3IKLQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQlMaW5rIGxpbmsgPSAoTGluaykgaXRlcmF0b3IubmV4dCgpOwotCQkJCUdyYXBoaWNhbERhdGFIZWxwZXIucmVtb3ZlTGluayhsaW5rKTsKLQkJCX0KLQkJCWxpbmtzVG9SZW1vdmUuY2xlYXIoKTsKLQkJCWxpbmtzVG9SZW1vdmUgPSBudWxsOwotCQl9Ci0KLQkJLy8gQ2hlY2sgdGhlIGxpbmtzIG9mIGVhY2ggQWN0aXZpdHlOb2RlCi0JCS8vIHNldCB0aGUgV29ya09yZGVyIHRvIHRoZSBsaW5rIGlmIG5lZWRlZAotCQkvLyBhZGQgbmV3IGxpbmsgZm9yIHRob3NlIFdvcmtPcmRlcnMgdGhhdCBzdGlsbCBkb24ndCBoYXZlIHRoZQotCQkvLyBjb3JyZXNwb25kaW5nIGxpbmsKLQkJLy8KLQkJQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkgPSBnZXRBZGFwdGVyRmFjdG9yeSgpOwotCQkKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZ2V0Tm9kZXMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU5vZGUgbm9kZSA9ICgoTm9kZSkgaXRlci5uZXh0KCkpOwotCQkJaWYgKG5vZGUuZ2V0T2JqZWN0KCkgaW5zdGFuY2VvZiBXb3JrQnJlYWtkb3duRWxlbWVudCkgewotCQkJCUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsgCi0JCQkJLy8gR2V0IHRoZSByYXcgZGF0YSBvZiB3b3Jrb3JkZXJzIGZvciBvYmplY3QuCi0JCQkJV29ya0JyZWFrZG93bkVsZW1lbnQgbG9jYWwgPSAoV29ya0JyZWFrZG93bkVsZW1lbnQpIG5vZGUuZ2V0T2JqZWN0KCk7Ci0JCQkJbGlzdC5hZGRBbGwobG9jYWwuZ2V0TGlua1RvUHJlZGVjZXNzb3IoKSk7Ci0JCQkJCi0JCQkJLy8gR2V0IHRoZSBQcmVkZWNlc3NvciBMaXN0IG9uIHRvcCBvZiByYXcgZGF0YSwgdGhpcyBpcyBuZWVkIGZvciBpbiBjYXNlIG9mIGV4dGVuZC4KLQkJCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIgYWRhcHRlciA9IG51bGw7Ci0JCQkJYWRhcHRlciA9IChJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIpYWRhcHRlckZhY3RvcnkKLQkJCQkJCQkJCS5hZGFwdChsb2NhbCwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCQlpZihhZGFwdGVyIGluc3RhbmNlb2YgSUJTSXRlbVByb3ZpZGVyKXsKLQkJCQkJbGlzdC5hZGRBbGwoKChJQlNJdGVtUHJvdmlkZXIpYWRhcHRlcikuZ2V0UHJlZGVjZXNzb3JzKCkpOwotCQkJCX0KLQkJCQkKLQkJCQkvLyBJdGVyYXRlIHdvcmsgb3JkZXJzIGFuZCBjcmVhdGUgbGlua3MuCi0JCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGxpc3QuaXRlcmF0b3IoKTsgaXRlcmF0b3IKLQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCU9iamVjdCBuZXh0ID0gaXRlcmF0b3IubmV4dCgpOwotCQkJCQlXb3JrT3JkZXIgd29ya09yZGVyID0gbnVsbDsKLQkJCQkJQnJlYWtkb3duRWxlbWVudCBwcmVkID0gbnVsbDsKLQkJCQkJaWYobmV4dCBpbnN0YW5jZW9mIFdvcmtPcmRlcil7Ci0JCQkJCQl3b3JrT3JkZXIgPSAoV29ya09yZGVyKW5leHQ7Ci0JCQkJCQlwcmVkID0gd29ya09yZGVyLmdldFByZWQoKTsKLQkJCQkJfQotCQkJCQlpZihuZXh0IGluc3RhbmNlb2YgV0JTQWN0aXZpdHlJdGVtUHJvdmlkZXIpewotCQkJCQkJcHJlZCA9IChCcmVha2Rvd25FbGVtZW50KSgoV0JTQWN0aXZpdHlJdGVtUHJvdmlkZXIpbmV4dCkuZ2V0VGFyZ2V0KCk7IAotCQkJCQl9Ci0JCQkJCQotCQkJCQlpZiAocHJlZCAhPSBudWxsICYmIHByZWQgaW5zdGFuY2VvZiBXb3JrQnJlYWtkb3duRWxlbWVudCkgewotCQkJCQkJTm9kZSBwcmVkTm9kZSA9IEdyYXBoaWNhbERhdGFIZWxwZXIuZmluZE5vZGUodGhpcywKLQkJCQkJCQkJcHJlZCwgdHJ1ZSk7Ci0JCQkJCQlpZiAocHJlZE5vZGUgIT0gbnVsbCkgewotCQkJCQkJCS8vIGNoZWNrIGlmIHRoZXJlIGlzIGEgbGluayBmb3IgdGhpcyB3b3JrIG9yZGVyCi0JCQkJCQkJLy8gYWxyZWFkeQotCQkJCQkJCS8vCi0JCQkJCQkJYm9vbGVhbiBsaW5rRm91bmQgPSBmYWxzZTsKLQkJCQkJCQlmaW5kX2xpbms6IGZvciAoSXRlcmF0b3IgaXRlcmF0b3IxID0gbm9kZQotCQkJCQkJCQkJLmdldEluY29taW5nQ29ubmVjdGlvbnMoKS5pdGVyYXRvcigpOyBpdGVyYXRvcjEKLQkJCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJCUxpbmsgbGluayA9IChMaW5rKSBpdGVyYXRvcjEubmV4dCgpOwotCQkJCQkJCQlpZiAobGluay5nZXRTb3VyY2UoKSA9PSBwcmVkTm9kZSkgewotCQkJCQkJCQkJLy8gbGluayBhbHJlYWR5IGV4aXN0cwotCQkJCQkJCQkJLy8gY2hlY2sgaWYgd29yayBvcmRlciBpcyBzZXQgdG8gdGhpcyBsaW5rCi0JCQkJCQkJCQkvLwotCQkJCQkJCQkJbGlua0ZvdW5kID0gdHJ1ZTsKLQkJCQkJCQkJCUdyYXBoRWRnZSBlZGdlID0gKEdyYXBoRWRnZSkgbGluawotCQkJCQkJCQkJCQkuZ2V0T2JqZWN0KCk7Ci0JCQkJCQkJCQlpZiAoZWRnZS5nZXRTZW1hbnRpY01vZGVsKCkgPT0gbnVsbCkgewotCQkJCQkJCQkJCUdyYXBoaWNhbERhdGFIZWxwZXIuc2V0U2VtYW50aWNNb2RlbCgKLQkJCQkJCQkJCQkJCWxpbmssIHdvcmtPcmRlcik7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCQlicmVhayBmaW5kX2xpbms7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQkJaWYgKCFsaW5rRm91bmQpIHsKLQkJCQkJCQkJLy8gY2hlY2sgaWYgdGhpcyBXb3JrT3JkZXIgY2FuIGJlIHJlcHJlc2VudGVkCi0JCQkJCQkJCS8vIHZpYSBsaW5rcyBvZiBUeXBlZE5vZGVzCi0JCQkJCQkJCS8vCi0JCQkJCQkJCWlmICghY2FuUmVhY2hBc0ZpcnN0QWN0aXZpdHlOb2RlKHByZWROb2RlLCBub2RlKSkgewotCQkJCQkJCQkJLy8gYWRkIG5ldyBsaW5rIGZvciB0aGlzIHdvcmsgb3JkZXIKLQkJCQkJCQkJCS8vCi0JCQkJCQkJCQlOYW1lZE5vZGVJbXBsIG5vZGVJbXBsID0gKChOYW1lZE5vZGVJbXBsKSBub2RlKTsKLQkJCQkJCQkJCU5hbWVkTm9kZUltcGwgcHJlZE5vZGVJbXBsID0gKE5hbWVkTm9kZUltcGwpIHByZWROb2RlOwotCQkJCQkJCQkJYm9vbGVhbiBvbGROb3RpZnkgPSBub2RlSW1wbC5ub3RpZmljYXRpb25FbmFibGVkOwotCQkJCQkJCQkJYm9vbGVhbiBwcmVkTm9kZU5vdGlmeSA9IHByZWROb2RlSW1wbC5ub3RpZmljYXRpb25FbmFibGVkOwotCQkJCQkJCQkJdHJ5IHsKLQkJCQkJCQkJCQlub2RlSW1wbC5ub3RpZmljYXRpb25FbmFibGVkID0gZmFsc2U7Ci0JCQkJCQkJCQkJcHJlZE5vZGVJbXBsLm5vdGlmaWNhdGlvbkVuYWJsZWQgPSBmYWxzZTsKLQkJCQkJCQkJCQlub2RlSW1wbC5hZGRJbmNvbWluZ0Nvbm5lY3Rpb24ocHJlZCk7IAotCQkJCQkJCQkJfSBmaW5hbGx5IHsKLQkJCQkJCQkJCQlub2RlSW1wbC5ub3RpZmljYXRpb25FbmFibGVkID0gb2xkTm90aWZ5OwotCQkJCQkJCQkJCXByZWROb2RlSW1wbC5ub3RpZmljYXRpb25FbmFibGVkID0gcHJlZE5vZGVOb3RpZnk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJY2xlYW5EdXBsaWNhdGVMaW5rcygpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjbGVhbkR1cGxpY2F0ZUxpbmtzKCkgewotCQlMaXN0IGR1cGxpY2F0ZUxpbmtzID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBnZXROb2RlcygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IG5vZGUgPSBpdGVyLm5leHQoKTsKLQkJCWlmIChub2RlIGluc3RhbmNlb2YgTm9kZSkgewotCQkJCU5vZGUgd2JOb2RlID0gKE5vZGUpIG5vZGU7Ci0JCQkJaWYod2JOb2RlLmdldEluY29taW5nQ29ubmVjdGlvbnMoKSAhPSBudWxsKXsKLQkJCQkJZmluZER1cGxpY2F0ZUxpbmtzKGR1cGxpY2F0ZUxpbmtzLCB3Yk5vZGUuZ2V0SW5jb21pbmdDb25uZWN0aW9ucygpKTsKLQkJCQl9Ci0JCQkJaWYod2JOb2RlLmdldE91dGdvaW5nQ29ubmVjdGlvbnMoKSAhPW51bGwpewotCQkJCQlmaW5kRHVwbGljYXRlTGlua3MoZHVwbGljYXRlTGlua3MsIHdiTm9kZS5nZXRPdXRnb2luZ0Nvbm5lY3Rpb25zKCkpOwotCQkJCX0KLQkJCX0KLQkJCQotCQl9Ci0JCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBkdXBsaWNhdGVMaW5rcy5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQlMaW5rIGxpbmsgPSAoTGluaykgaXRlcmF0b3IubmV4dCgpOwotCQkJR3JhcGhpY2FsRGF0YUhlbHBlci5yZW1vdmVMaW5rKGxpbmspOwotCQl9Ci0JCWR1cGxpY2F0ZUxpbmtzLmNsZWFyKCk7Ci0JCWR1cGxpY2F0ZUxpbmtzID0gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZmluZER1cGxpY2F0ZUxpbmtzKExpc3QgZHVwbGljYXRlTGlua3MsIExpc3QgbGlua3MpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaW5rcy5zaXplKCk7IGkrKykgewotCQkJTGluayBsaW5rID0gKExpbmspIGxpbmtzLmdldChpKTsKLQkJCWlmKCFkdXBsaWNhdGVMaW5rcy5jb250YWlucyhsaW5rKSl7Ci0JCQkJZm9yIChpbnQgaiA9IGkgKyAxOyBqIDwgbGlua3Muc2l6ZSgpOyBqKyspIHsKLQkJCQkJTGluayBsaW5rMSA9IChMaW5rKSBsaW5rcy5nZXQoaik7Ci0JCQkJCWlmIChsaW5rMS5nZXRTb3VyY2UoKSA9PSBsaW5rLmdldFNvdXJjZSgpCi0JCQkJCQkJJiYgbGluazEuZ2V0VGFyZ2V0KCkgPT0gbGluay5nZXRUYXJnZXQoKSkgewotCQkJCQkJZHVwbGljYXRlTGlua3MuYWRkKGxpbmsxKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIENoZWNrcyBpZiBOb2RlIHNyYyBjYW4gcmVhY2ggTm9kZSB0YXJnZXQgYXMgdGhlIGZpcnN0IEFjdGl2aXR5Tm9kZSBpbiB0aGUKLQkgKiBkaWFncmFtCi0JICogCi0JICogQHBhcmFtIHNyYwotCSAqIEBwYXJhbSB0YXJnZXQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBjYW5SZWFjaEFzRmlyc3RBY3Rpdml0eU5vZGUoTm9kZSBzcmMsIE5vZGUgdGFyZ2V0KSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHNyYy5nZXRPdXRnb2luZ0Nvbm5lY3Rpb25zKCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQlMaW5rIGxpbmsgPSAoTGluaykgaXRlci5uZXh0KCk7Ci0JCQlpZiAobGluay5nZXRUYXJnZXQoKSA9PSB0YXJnZXQpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJCWlmIChsaW5rLmdldFRhcmdldCgpIGluc3RhbmNlb2YgVHlwZWROb2RlCi0JCQkJCSYmIGNhblJlYWNoQXNGaXJzdEFjdGl2aXR5Tm9kZShsaW5rLmdldFRhcmdldCgpLCB0YXJnZXQpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8vIHByaXZhdGUgTGlzdCB0b05vZGVzKExpc3QgYWN0aXZpdGllcykgewotCS8vIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkvLyBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBhY3Rpdml0aWVzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCS8vIGxpc3QuYWRkKHRvTm9kZSgoTWV0aG9kRWxlbWVudCkgaXRlci5uZXh0KCkpKTsKLQkvLyB9Ci0JLy8gcmV0dXJuIGxpc3Q7Ci0JLy8gfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLkRpYWdyYW1JbXBsI25ld05vZGUoKQotCSAqLwotCXByb3RlY3RlZCBOb2RlIG5ld05vZGUoKSB7Ci0JCXJldHVybiBNb2RlbEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVdvcmtCcmVha2Rvd25FbGVtZW50Tm9kZSgpOwotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKCkgewotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIgYWRhcHRlciA9IGdldEFkYXB0ZXIoKTsKLQkJaWYgKGFkYXB0ZXIgIT0gbnVsbCkgewotCQkJCi0JCQkvL1R1cm4gb2ZmIHRoZSBWYXJpYWJpbGl0eUluZm8gZm9yIHRoZSBhY3Rpdml0eSBkaWFncmFtLgotCQkJT2JqZWN0IG9iaiA9IG51bGw7Ci0JCQlib29sZWFuIGVuYWJsZVZhcmlhYmlsaXR5SW5mbyA9IGZhbHNlOwotCQkJaWYoYWRhcHRlciBpbnN0YW5jZW9mIEFjdGl2aXR5V3JhcHBlckl0ZW1Qcm92aWRlcil7Ci0JCQkJb2JqID0gKChBY3Rpdml0eVdyYXBwZXJJdGVtUHJvdmlkZXIpYWRhcHRlcikuZ2V0RGVsZWdhdGluZ0l0ZW1Qcm92aWRlcigpOwotCQkJfQotCQkJaWYoYWRhcHRlciBpbnN0YW5jZW9mIEJTQWN0aXZpdHlJdGVtUHJvdmlkZXIpewotCQkJCW9iaiA9IGFkYXB0ZXI7Ci0JCQl9Ci0JCQkKLQkJCWlmKG9iaiBpbnN0YW5jZW9mIEJTQWN0aXZpdHlJdGVtUHJvdmlkZXIpewotCQkJCWVuYWJsZVZhcmlhYmlsaXR5SW5mbyA9ICgoQlNBY3Rpdml0eUl0ZW1Qcm92aWRlcilvYmopLmlzRW5hYmxlVmFyaWFiaWxpdHlJbmZvKCk7Ci0JCQkJKChCU0FjdGl2aXR5SXRlbVByb3ZpZGVyKW9iaikuc2V0RW5hYmxlVmFyaWFiaWxpdHlJbmZvKGZhbHNlKTsKLQkJCX0KLQkJCS8vIGVuZCBvZiB2YXJpYWJpbGl0eSBpbmZvIAotCQkJCi0JCQkKLQkJCS8vIHJldHVybiBhZGFwdGVyLmdldENoaWxkcmVuKGdldE9iamVjdCgpKTsKLQkJCS8vIGNvbW1lbnRlZCBhYm92ZSBsaW5lLCBGb3IgZGlhZ3JhbXMgLSByb2xsdXAgc2hvdWxkIGJlIGZhbHNlLCBmb3IKLQkJCS8vIGhhbmRsaW5nIHJvbGx1cCBzdGF0ZSBiZWxvdyBjb2RlLgotCQkJTGlzdCBjaGlsZHJlbiA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWV4dHJhY3RDaGlsZHJlbihhZGFwdGVyLCBnZXRPYmplY3QoKSwgY2hpbGRyZW4sIHRydWUpOwotCQkJCi0JCQkvLyByZXNldCB2YXJpYWJpbGl0eWluZm8gc3RhdHVzIGJhY2sKLQkJCWlmKG9iaiBpbnN0YW5jZW9mIEJTQWN0aXZpdHlJdGVtUHJvdmlkZXIpewotCQkJCSgoQlNBY3Rpdml0eUl0ZW1Qcm92aWRlcilvYmopLnNldEVuYWJsZVZhcmlhYmlsaXR5SW5mbyhlbmFibGVWYXJpYWJpbGl0eUluZm8pOwotCQkJfQotCQkJCi0JCQlyZXR1cm4gY2hpbGRyZW47Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBhZGRFbGVtZW50Tm9kZXMoKSB7Ci0KLQkJQXJyYXlMaXN0IG5vZGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBnZXRDaGlsZHJlbigpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGUgPSBpdGVyLm5leHQoKTsKLQkJCU9iamVjdCBjaGlsZCA9IFRuZ1V0aWwudW53cmFwKGUpOwotCQkJaWYgKGNoaWxkIGluc3RhbmNlb2YgV29ya0JyZWFrZG93bkVsZW1lbnQpIHsKLQkJCQlOYW1lZE5vZGVJbXBsIG5vZGUgPSAoTmFtZWROb2RlSW1wbCkgdG9Ob2RlKChNZXRob2RFbGVtZW50KSBjaGlsZCk7Ci0JCQkJaWYgKGUgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgewotCQkJCQlCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlciB3cmFwcGVyID0gKChCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgZSk7Ci0JCQkJCWlmICh3cmFwcGVyLmlzUmVhZE9ubHkoKSkgewotCQkJCQkJbm9kZS5pdGVtUHJvdmlkZXIgPSB3cmFwcGVyOwotCQkJCQkJLy8gVE9ETzogY2hlY2sgaWYgcmVhZE9ubHkgYXR0cmlidXRlIGlzIHN0aWxsIG5lZWRlZAotCQkJCQkJLy8gYWZ0ZXIgaW50cm9kdWN0aW9uIG9mIGl0ZW1Qcm92aWRlcgotCQkJCQkJLy8KLQkJCQkJCW5vZGUucmVhZE9ubHkgPSB0cnVlOwotCQkJCQl9Ci0JCQkJfQotCQkJCW5vZGVzLmFkZChub2RlKTsKLQkJCX0KLQkJfQotCi0JCWdldE5vZGVzKCkuYWRkQWxsKG5vZGVzKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBpbnQgZ2V0VHlwZShPYmplY3Qgb2JqKSB7Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBHcmFwaE5vZGUpIHsKLQkJCUdyYXBoTm9kZSBub2RlID0gKEdyYXBoTm9kZSkgb2JqOwotCQkJU2VtYW50aWNNb2RlbEJyaWRnZSBtb2RlbEJyaWRnZSA9IG5vZGUuZ2V0U2VtYW50aWNNb2RlbCgpOwotCQkJaWYgKG1vZGVsQnJpZGdlIGluc3RhbmNlb2YgU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnQpIHsKLQkJCQlTdHJpbmcgdHlwZSA9ICgoU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnQpIG1vZGVsQnJpZGdlKQotCQkJCQkJLmdldFR5cGVJbmZvKCk7Ci0JCQkJaWYgKEdyYXBoaWNhbERhdGFIZWxwZXIuR1JBUEhfTk9ERV9TWU5DSF9CQVIuZXF1YWxzKHR5cGUpKSB7Ci0JCQkJCXJldHVybiBUeXBlZE5vZGUuU1lOQ0hfQkFSOwotCQkJCX0gZWxzZSBpZiAoR3JhcGhpY2FsRGF0YUhlbHBlci5HUkFQSF9OT0RFX0RFQ0lTSU9OLmVxdWFscyh0eXBlKSkgewotCQkJCQlyZXR1cm4gVHlwZWROb2RlLkRFQ0lTSU9OOwotCQkJCX0gZWxzZSBpZiAoR3JhcGhpY2FsRGF0YUhlbHBlci5HUkFQSF9OT0RFX0VORC5lcXVhbHModHlwZSkpIHsKLQkJCQkJcmV0dXJuIFR5cGVkTm9kZS5FTkQ7Ci0JCQkJfSBlbHNlIGlmIChHcmFwaGljYWxEYXRhSGVscGVyLkdSQVBIX05PREVfU1RBUlQuZXF1YWxzKHR5cGUpKSB7Ci0JCQkJCXJldHVybiBUeXBlZE5vZGUuU1RBUlQ7Ci0JCQkJfSBlbHNlIGlmIChHcmFwaGljYWxEYXRhSGVscGVyLkdSQVBIX05PREVfRlJFRV9URVhUCi0JCQkJCQkuZXF1YWxzKHR5cGUpKSB7Ci0JCQkJCXJldHVybiBUeXBlZE5vZGUuRlJFRV9URVhUOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gLTE7Ci0JfQotCi0JcHJvdGVjdGVkIGludCBnZXRUeXBlKCkgewotCQlyZXR1cm4gR3JhcGhpY2FsRGF0YUhlbHBlci5BQ1RJVklUWV9ESUFHUkFNOwotCX0KLQotCXByb3RlY3RlZCBMaXN0IGdldEJyZWFrZG93bkVsZW1lbnRUeXBlcygpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QoV29ya0JyZWFrZG93bkVsZW1lbnQuY2xhc3MpOwotCX0KLQotCXByaXZhdGUgaW50IHRvQWN0aXZpdHlJbmRleChpbnQgaW5kZXgpIHsKLQkJaWYgKGluZGV4ID09IC0xKQotCQkJcmV0dXJuIGluZGV4OwotCQlpbnQgc2l6ZSA9IGdldE5vZGVzKCkuc2l6ZSgpOwotCQlpbnQgaSA9IGluZGV4ICsgMTsKLQkJaWYgKGkgPT0gc2l6ZSkKLQkJCXJldHVybiAtMTsKLQkJTm9kZSBub2RlID0gKE5vZGUpIGdldE5vZGVzKCkuZ2V0KGkpOwotCQlpZiAobm9kZSA9PSBudWxsKQotCQkJcmV0dXJuIC0xOwotCi0JCWZvciAoOyAhKG5vZGUuZ2V0T2JqZWN0KCkgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50KSAmJiBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlub2RlID0gKE5vZGUpIGdldE5vZGVzKCkuZ2V0KGkpOwotCQl9Ci0JCWlmIChpID09IHNpemUpCi0JCQlyZXR1cm4gLTE7Ci0JCUFjdGl2aXR5IGFjdCA9IChBY3Rpdml0eSkgZ2V0T2JqZWN0KCk7Ci0JCXJldHVybiBhY3QuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5pbmRleE9mKG5vZGUuZ2V0T2JqZWN0KCkpOwotCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLkRpYWdyYW1JbXBsI2FkZFRvVW1hTW9kZWwoaW50LAotCSAqICAgICAgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZSkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRUb1VtYU1vZGVsKGludCBwb3NpdGlvbiwgTm9kZSBhZGRlZE5vZGUpIHsKLQkJaWYgKGFkZGVkTm9kZS5nZXRPYmplY3QoKSBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnQpIHsKLQkJCUFjdGl2aXR5IGFjdCA9IChBY3Rpdml0eSkgZ2V0T2JqZWN0KCk7Ci0KLQkJCS8vIHRyYW5zbGF0ZSBBY3Rpdml0eU5vZGUgaW5kZXggdG8gQWN0aXZpdHkgaW5kZXgKLQkJCS8vCi0JCQlpbnQgaSA9IHRvQWN0aXZpdHlJbmRleChwb3NpdGlvbik7Ci0JCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkRpYWdyYW1JbXBsLmFkZFRvVW1hTW9kZWwoKToKLQkJCS8vIFdvcmtCcmVha2Rvd25FbGVtZW50IGluZGV4OiAiICsgaSk7Ci0JCQlpZiAoaSA9PSAtMSkgewotCQkJCWFjdC5nZXRCcmVha2Rvd25FbGVtZW50cygpLmFkZCgoQnJlYWtkb3duRWxlbWVudCkgYWRkZWROb2RlLmdldE9iamVjdCgpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJYWN0LmdldEJyZWFrZG93bkVsZW1lbnRzKCkuYWRkKGksIChCcmVha2Rvd25FbGVtZW50KSBhZGRlZE5vZGUuZ2V0T2JqZWN0KCkpOwotCQkJfQotCQl9Ci0KLQkJc3VwZXIuYWRkVG9VbWFNb2RlbChwb3NpdGlvbiwgYWRkZWROb2RlKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuRGlhZ3JhbUltcGwjYWRkTm9kZShqYXZhLnV0aWwuQ29sbGVjdGlvbiwKLQkgKiAgICAgIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIE5vZGUgYWRkTm9kZShDb2xsZWN0aW9uIG5vZGVzLCBPYmplY3Qgb2JqKSB7Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJQWN0aXZpdHkgYWN0ID0gKEFjdGl2aXR5KSBvYmo7Ci0JCQlWYXJpYWJpbGl0eUVsZW1lbnQgYmFzZSA9IGFjdC5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCk7Ci0JCQlpZiAoYmFzZSAhPSBudWxsKSB7Ci0JCQkJLy8gZmluZCBleGlzdGluZyBub2RlIGZvciBiYXNlIGFuZCBsaW5rIGl0IHRvIHRoZSBhY3Rpdml0eQotCQkJCS8vCi0JCQkJTm9kZUltcGwgYmFzZU5vZGUgPSAoTm9kZUltcGwpIEdyYXBoaWNhbERhdGFIZWxwZXIuZmluZE5vZGUoCi0JCQkJCQl0aGlzLCBiYXNlKTsKLQkJCQlpZiAoYmFzZU5vZGUgIT0gbnVsbCkgewotCQkJCQlHcmFwaE5vZGUgZ3JhcGhOb2RlID0gYmFzZU5vZGUuZ2V0R3JhcGhOb2RlKCk7Ci0JCQkJCVVNQVNlbWFudGljTW9kZWxCcmlkZ2UgYnJpZGdlID0gKFVNQVNlbWFudGljTW9kZWxCcmlkZ2UpIGdyYXBoTm9kZQotCQkJCQkJCS5nZXRTZW1hbnRpY01vZGVsKCk7Ci0JCQkJCWlmIChicmlkZ2UuZ2V0RWxlbWVudCgpICE9IGFjdCkgewotCQkJCQkJYnJpZGdlLnNldEVsZW1lbnQoYWN0KTsKLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCWJhc2VOb2RlID0gKE5vZGVJbXBsKSBHcmFwaGljYWxEYXRhSGVscGVyLmZpbmROb2RlKHRoaXMsCi0JCQkJCQkJYWN0KTsKLQkJCQl9Ci0JCQkJaWYgKGJhc2VOb2RlICE9IG51bGwpIHsKLQkJCQkJLy8gZGlzYXNzb2NpYXRlIHdpdGggdGhlIGJhc2UKLQkJCQkJLy8KLQkJCQkJaWYgKGJhc2VOb2RlLm1ldGhvZEVsZW1lbnRBZGFwdGVyICE9IG51bGwpIHsKLQkJCQkJCWJhc2UuZUFkYXB0ZXJzKCkucmVtb3ZlKGJhc2VOb2RlLm1ldGhvZEVsZW1lbnRBZGFwdGVyKTsKLQkJCQkJfQotCi0JCQkJCWJhc2VOb2RlLmJhc2ljU2V0T2JqZWN0KGFjdCk7Ci0JCQkJCWJhc2VOb2RlLnNldFJlYWRPbmx5KGZhbHNlKTsKLQotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmFkZE5vZGUobm9kZXMsIG9iaik7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLkRpYWdyYW1JbXBsI3JlbW92ZU5vZGUoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiByZW1vdmVOb2RlKE9iamVjdCBvYmopIHsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQlBY3Rpdml0eSBhY3QgPSAoQWN0aXZpdHkpIG9iajsKLQkJCVZhcmlhYmlsaXR5RWxlbWVudCBiYXNlID0gYWN0LmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsKLQkJCWlmIChiYXNlICE9IG51bGwpIHsKLQkJCQkvLyBmaW5kIGV4aXN0aW5nIG5vZGUgZm9yIHRoZSBvbGQgYWN0aXZpdHkgYW5kIHJlbGluayBpdCB0byBpdHMKLQkJCQkvLyBiYXNlCi0JCQkJLy8KLQkJCQlOb2RlSW1wbCBub2RlID0gKE5vZGVJbXBsKSBHcmFwaGljYWxEYXRhSGVscGVyLmZpbmROb2RlKHRoaXMsCi0JCQkJCQlhY3QpOwotCQkJCWlmIChub2RlICE9IG51bGwpIHsKLQkJCQkJR3JhcGhOb2RlIGdyYXBoTm9kZSA9IG5vZGUuZ2V0R3JhcGhOb2RlKCk7Ci0JCQkJCVVNQVNlbWFudGljTW9kZWxCcmlkZ2UgYnJpZGdlID0gKFVNQVNlbWFudGljTW9kZWxCcmlkZ2UpIGdyYXBoTm9kZQotCQkJCQkJCS5nZXRTZW1hbnRpY01vZGVsKCk7Ci0JCQkJCWlmIChicmlkZ2UuZ2V0RWxlbWVudCgpICE9IGJhc2UpIHsKLQkJCQkJCWJyaWRnZS5zZXRFbGVtZW50KGJhc2UpOwotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJbm9kZSA9IChOb2RlSW1wbCkgR3JhcGhpY2FsRGF0YUhlbHBlci5maW5kTm9kZSh0aGlzLCBiYXNlKTsKLQkJCQl9Ci0JCQkJaWYgKG5vZGUgIT0gbnVsbCkgewotCQkJCQkvLyBkaXNhc3NvY2lhdGUgd2l0aCB0aGUgb2xkIGFjdGl2aXR5Ci0JCQkJCS8vCi0JCQkJCWlmIChub2RlLm1ldGhvZEVsZW1lbnRBZGFwdGVyICE9IG51bGwpIHsKLQkJCQkJCWFjdC5lQWRhcHRlcnMoKS5yZW1vdmUobm9kZS5tZXRob2RFbGVtZW50QWRhcHRlcik7Ci0JCQkJCX0KLQotCQkJCQlub2RlLmJhc2ljU2V0T2JqZWN0KGJhc2UpOwotCQkJCQlub2RlLnNldFJlYWRPbmx5KHRydWUpOwotCi0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLnJlbW92ZU5vZGUob2JqKTsKLQl9Ci0JLyoqCi0JICogTW92ZWQgY29kZSBmcm9tIGdldENoaWxkcmVuLiBnZXRBZGFwdGVyKCkgd2lsbCByZXR1cm4gQWRhcHRlciwKLQkgKiB3aGljaCB3aWxsIGFsbG93IHVzIHRvIGZpbmQgaXRlbXByb3ZpZGVyIGZvciB0aGUgY2hpbGRyZW4uIAotCSAqIAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlciBnZXRBZGFwdGVyKCl7Ci0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciBhZGFwdGVyID0gbnVsbDsKLQkJaWYgKHdyYXBwZXIgIT0gbnVsbCkgewotCQkJYWRhcHRlciA9IHdyYXBwZXI7Ci0JCX0gZWxzZSB7Ci0JCQkKLQkJCWFkYXB0ZXIgPShJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIpZ2V0QWRhcHRlckZhY3RvcnkoKS5hZGFwdCgKLQkJCQkJZ2V0T2JqZWN0KCksIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCX0KLQkJcmV0dXJuIGFkYXB0ZXI7Ci0JfQotCQotCXByaXZhdGUgQWRhcHRlckZhY3RvcnkgZ2V0QWRhcHRlckZhY3RvcnkoKXsKLQkJQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkgPSBudWxsOwotCQlpZiAoZmlsdGVyID09IG51bGwpIHsKLQkJCWFkYXB0ZXJGYWN0b3J5ID0gVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UuZ2V0V0JTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKTsKLQkJfSBlbHNlIGlmIChmaWx0ZXIgaW5zdGFuY2VvZiBJQWRhcHRlckZhY3RvcnlGaWx0ZXIpIHsKLQkJCWFkYXB0ZXJGYWN0b3J5ID0gKENvbmZpZ3VyYWJsZUNvbXBvc2VkQWRhcHRlckZhY3RvcnkpICgoSUFkYXB0ZXJGYWN0b3J5RmlsdGVyKSBmaWx0ZXIpCi0JCQkJCS5nZXRXQlNBZGFwdGVyRmFjdG9yeSgpOwotCQl9Ci0JCXJldHVybiBhZGFwdGVyRmFjdG9yeTsKLQl9Ci19IC8vIEFjdGl2aXR5RGlhZ3JhbUltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9pbXBsL0RpYWdyYW1JbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvaW1wbC9EaWFncmFtSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MWJhZTcxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9pbXBsL0RpYWdyYW1JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2ODkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbDsKLQotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuRGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5EaWFncmFtUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTW9kZWxGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk1vZGVsUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5OYW1lZE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5UeXBlZE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwudXRpbC5HcmFwaGljYWxEYXRhSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLnV0aWwuR3JhcGhpY2FsRGF0YU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwudXRpbC5JRGlhZ3JhbUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuQlNBY3Rpdml0eUl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLklCU0l0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuUHJvY2Vzc1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlN1cHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlNlbWFudGljTW9kZWxCcmlkZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5TaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RGlhZ3JhbTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERpYWdyYW1JbXBsIGV4dGVuZHMgTm9kZUNvbnRhaW5lckltcGwgaW1wbGVtZW50cyBEaWFncmFtIHsKLQotCXByaXZhdGUgYm9vbGVhbiBuZXdEaWFncmFtOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBEaWFncmFtSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBNb2RlbFBhY2thZ2UuTGl0ZXJhbHMuRElBR1JBTTsKLQl9Ci0KLQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLy8KLQkvLyBTdGFydCBjdXN0b20gY29kZSAvLwotCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0vLwotCi0JcHJvdGVjdGVkIGNsYXNzIEFjdGl2aXR5QWRhcHRlciBleHRlbmRzIFRyYW5zYWN0aW9uYWxOb2RlTGluayBpbXBsZW1lbnRzCi0JCQlJRGlhZ3JhbUNoYW5nZUxpc3RlbmVyIHsKLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC51dGlsLklEaWFncmFtQ2hhbmdlTGlzdGVuZXIjZ2V0RGlhZ3JhbSgpCi0JCSAqLwotCQlwdWJsaWMgRGlhZ3JhbSBnZXREaWFncmFtKCkgewotCQkJcmV0dXJuIERpYWdyYW1JbXBsLnRoaXM7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIHZvaWQgaGFuZGxlTm90aWZpY2F0aW9uKE5vdGlmaWNhdGlvbiBtc2cpIHsKLQkJCXN3aXRjaCAobXNnLmdldEZlYXR1cmVJRChBY3Rpdml0eS5jbGFzcykpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9fQlJFQUtET1dOX0VMRU1FTlRTOgotCQkJCXN3aXRjaCAobXNnLmdldEV2ZW50VHlwZSgpKSB7Ci0JCQkJY2FzZSBOb3RpZmljYXRpb24uQUREOgotCQkJCQlOb2RlIG5vZGUgPSAoTm9kZSkgYWRkTm9kZShtc2cuZ2V0TmV3VmFsdWUoKSk7Ci0JCQkJCWlmIChub2RlICE9IG51bGwpIHsKLQkJCQkJaWYgKG1zZy5nZXROb3RpZmllcigpID09IGJhc2VBY3QpIHsKLQkJCQkJCW5vZGUuc2V0UmVhZE9ubHkodHJ1ZSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBOb3RpZmljYXRpb24uUkVNT1ZFOgotCQkJCQlyZW1vdmVOb2RlKG1zZy5nZXRPbGRWYWx1ZSgpKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBOb3RpZmljYXRpb24uQUREX01BTlk6Ci0JCQkJCUNvbGxlY3Rpb24gbm9kZXMgPSBhZGROb2RlcygoQ29sbGVjdGlvbikgbXNnCi0JCQkJCQkJLmdldE5ld1ZhbHVlKCkpOwotCQkJCQlpZiAobXNnLmdldE5vdGlmaWVyKCkgPT0gYmFzZUFjdCkgewotCQkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gbm9kZXMuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJCW5vZGUgPSAoTm9kZUltcGwpIGl0ZXIubmV4dCgpOwotCQkJCQkJCW5vZGUuc2V0UmVhZE9ubHkodHJ1ZSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBOb3RpZmljYXRpb24uUkVNT1ZFX01BTlk6Ci0JCQkJCXJlbW92ZU5vZGVzKChDb2xsZWN0aW9uKSBtc2cuZ2V0T2xkVmFsdWUoKSk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgTm90aWZpY2F0aW9uLk1PVkU6Ci0JCQkJCW1vdmVOb2RlKG1zZy5nZXROZXdWYWx1ZSgpLCBtc2cuZ2V0UG9zaXRpb24oKSwgbXNnLmdldE9sZFZhbHVlKCkpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQotCX0KLQotCXByb3RlY3RlZCBJRGlhZ3JhbUNoYW5nZUxpc3RlbmVyIGRpYWdyYW1DaGFuZ2VMaXN0ZW5lcjsKLQotCXByaXZhdGUgQWN0aXZpdHkgYmFzZUFjdDsKLQotCXByaXZhdGUgT2JqZWN0IGRpYWdyYW1BZGFwdGVyID0gbmV3IEFkYXB0ZXJJbXBsKCkgewotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGwjbm90aWZ5Q2hhbmdlZChvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb24pCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBtc2cpIHsKLQkJCWlmICghbm90aWZpY2F0aW9uRW5hYmxlZCkKLQkJCQlyZXR1cm47Ci0JCQlub3RpZmljYXRpb25FbmFibGVkID0gZmFsc2U7Ci0JCQl0cnkgewotCQkJCS8vQWN0aXZpdHkgYWN0ID0gKEFjdGl2aXR5KSBnZXRPYmplY3QoKTsKLQkJCQlzd2l0Y2ggKG1zZy5nZXRGZWF0dXJlSUQoRGlhZ3JhbS5jbGFzcykpIHsKLQkJCQljYXNlIE1vZGVsUGFja2FnZS5ESUFHUkFNX19OT0RFUzoKLQkJCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCIubm90aWZ5Q2hhbmdlZCgpOiBpbmRleD0iICsKLQkJCQkJLy8gbXNnLmdldFBvc2l0aW9uKCkpOwotCQkJCQlDb2xsZWN0aW9uIGNvbGxlY3Rpb247Ci0JCQkJCXN3aXRjaCAobXNnLmdldEV2ZW50VHlwZSgpKSB7Ci0JCQkJCWNhc2UgTm90aWZpY2F0aW9uLkFERDoKLQkJCQkJCW5vZGVBZGRlZChtc2cuZ2V0UG9zaXRpb24oKSwgKE5vZGUpIG1zZwotCQkJCQkJCQkuZ2V0TmV3VmFsdWUoKSk7Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCWNhc2UgTm90aWZpY2F0aW9uLlJFTU9WRToKLQkJCQkJCW5vZGVSZW1vdmVkKChOb2RlKSBtc2cuZ2V0T2xkVmFsdWUoKSk7Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCWNhc2UgTm90aWZpY2F0aW9uLkFERF9NQU5ZOgotCQkJCQkJY29sbGVjdGlvbiA9IChDb2xsZWN0aW9uKSBtc2cuZ2V0TmV3VmFsdWUoKTsKLQkJCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGNvbGxlY3Rpb24uaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJCU5vZGUgbm9kZSA9IChOb2RlKSBpdGVyLm5leHQoKTsKLQkJCQkJCQlub2RlQWRkZWQobXNnLmdldFBvc2l0aW9uKCksIG5vZGUpOwotCQkJCQkJfQotCi0JCQkJCQlyZXR1cm47Ci0JCQkJCWNhc2UgTm90aWZpY2F0aW9uLlJFTU9WRV9NQU5ZOgotCQkJCQkJY29sbGVjdGlvbiA9IChDb2xsZWN0aW9uKSBtc2cuZ2V0T2xkVmFsdWUoKTsKLQkJCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGNvbGxlY3Rpb24uaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJCW5vZGVSZW1vdmVkKChOb2RlKSBpdGVyLm5leHQoKSk7Ci0JCQkJCQl9Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCX0KLQotCQkJCX0KLQkJCX0gZmluYWxseSB7Ci0JCQkJbm90aWZpY2F0aW9uRW5hYmxlZCA9IHRydWU7Ci0JCQl9Ci0JCX0KLQl9OwotCi0JcHJvdGVjdGVkIE5vZGUgYWRkTm9kZShPYmplY3Qgb2JqKSB7Ci0JCU5vZGUgbm9kZSA9IGFkZE5vZGUoZ2V0Tm9kZXMoKSwgb2JqKTsKLQkJaWYgKG5vZGUgPT0gbnVsbCkKLQkJCXJldHVybiBub2RlOwotCQlwb3B1bGF0ZUxpbmtzKG5vZGUsIHRydWUpOwotCQlyZXR1cm4gbm9kZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgTm9kZSBhZGROb2RlKENvbGxlY3Rpb24gbm9kZXMsIE9iamVjdCBvYmopIHsKLQkJaWYgKFRuZ1V0aWwuaXNJbnN0YW5jZU9mKGdldEJyZWFrZG93bkVsZW1lbnRUeXBlcygpLCBvYmopKSB7Ci0JCQlOb2RlIG5vZGUgPSB0b05vZGUoKE1ldGhvZEVsZW1lbnQpIG9iaik7Ci0JCQlpZiAobm9kZSAhPSBudWxsKSB7Ci0JCQkJbm9kZXMuYWRkKG5vZGUpOwotCQkJCXJldHVybiBub2RlOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCBDb2xsZWN0aW9uIGFkZE5vZGVzKENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlMaXN0IG5vZGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjb2xsZWN0aW9uLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJYWRkTm9kZShub2RlcywgaXRlci5uZXh0KCkpOwotCQl9Ci0KLQkJLy8gdXNlIGFkZEFsbCgpIHRvIGF2b2lkIHVubmVjZXNzYXJ5IG5vdGlmaWNhdGlvbnMKLQkJLy8KLQkJZ2V0Tm9kZXMoKS5hZGRBbGwobm9kZXMpOwotCQlyZXR1cm4gbm9kZXM7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIG9iagotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHJlbW92ZU5vZGUoT2JqZWN0IG9iaikgewotCQlpZiAoIVRuZ1V0aWwuaXNJbnN0YW5jZU9mKGdldEJyZWFrZG93bkVsZW1lbnRUeXBlcygpLCBvYmopKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCU5vZGUgbm9kZSA9IEdyYXBoaWNhbERhdGFIZWxwZXIuZmluZE5vZGUodGhpcywgb2JqKTsKLQkJaWYgKG5vZGUgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBub2RlLmdldE91dGdvaW5nQ29ubmVjdGlvbnMoKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCUxpbmsgbGluayA9IChMaW5rKSBpdGVyLm5leHQoKTsKLQkJCWxpbmsuc2V0VGFyZ2V0KG51bGwpOwotCQl9Ci0KLQkJZm9yIChJdGVyYXRvciBpdGVyID0gbm9kZS5nZXRJbmNvbWluZ0Nvbm5lY3Rpb25zKCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQlMaW5rIGxpbmsgPSAoTGluaykgaXRlci5uZXh0KCk7Ci0JCQlsaW5rLnNldFNvdXJjZShudWxsKTsKLQkJfQotCQlub2RlLmdldE91dGdvaW5nQ29ubmVjdGlvbnMoKS5jbGVhcigpOwotCQlub2RlLmdldEluY29taW5nQ29ubmVjdGlvbnMoKS5jbGVhcigpOwotCi0JCWdldE5vZGVzKCkucmVtb3ZlKG5vZGUpOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVOb2RlcyhDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gY29sbGVjdGlvbi5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCXJlbW92ZU5vZGUoaXRlci5uZXh0KCkpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5EaWFncmFtI2dldFVNQURpYWdyYW0oKQotCSAqLwotCXB1YmxpYyBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW0gZ2V0VU1BRGlhZ3JhbSgpIHsKLQkJcmV0dXJuIChvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW0pIGdldEdyYXBoTm9kZSgpOwotCX0KLQotCXByb3RlY3RlZCBDbGFzcyBnZXREaWFncmFtQ2hhbmdlTGlzdGVuZXJUeXBlKCkgewotCQlyZXR1cm4gSURpYWdyYW1DaGFuZ2VMaXN0ZW5lci5jbGFzczsKLQl9Ci0KLQlwcm90ZWN0ZWQgTGlzdCBnZXRCcmVha2Rvd25FbGVtZW50VHlwZXMoKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KEJyZWFrZG93bkVsZW1lbnQuY2xhc3MpOwotCX0KLQotCXByb3RlY3RlZCBpbnQgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIC0xOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIG5vZGVBZGRlZChpbnQgaW5kZXgsIE5vZGUgbm9kZSkgewotCQlhZGRUb1VtYU1vZGVsKGluZGV4LCBub2RlKTsKLQkJbm9kZS5hZGRDb25zdW1lcih0aGlzKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBub2RlUmVtb3ZlZChOb2RlIG5vZGUpIHsKLQkJcmVtb3ZlRnJvbVVtYU1vZGVsKG5vZGUpOwotCQlub2RlLnJlbW92ZUNvbnN1bWVyKHRoaXMpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzTmV3KCkgewotCQlyZXR1cm4gdGhpcy5uZXdEaWFncmFtOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE5ldyhib29sZWFuIG4pIHsKLQkJdGhpcy5uZXdEaWFncmFtID0gbjsKLQl9Ci0KLQkvKioKLQkgKiBOT1RFOiB0aGlzIG1ldGhvZCBpcyByZS1lbnRyYW50LCBtYWtlIHN1cmUgdG8gaGFuZGxlIHRoZSBkYXRhIGNvcnJlY3RseSB0byBhdm9pZCBtZW1vcnkgbGVhayBhbmQgZGF0YSBjb3JydXB0aW9uCi0JICogCi0JICogQHBhcmFtIG5ld09iamVjdAotCSAqICAgICAgICAgICAgbXVzdCBiZSBhbiBBY3Rpdml0eQotCSAqLwotCXB1YmxpYyB2b2lkIHNldE9iamVjdChPYmplY3QgbmV3T2JqZWN0KSB7Ci0JCWlmIChuZXdPYmplY3QgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcgotCQkJCSYmICgoQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIG5ld09iamVjdCkKLQkJCQkJCS5pc1JlYWRPbmx5KCkpIHsKLQkJCXdyYXBwZXIgPSAoQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIG5ld09iamVjdDsKLQkJCXNldFJlYWRPbmx5KHRydWUpOwotCQl9Ci0JCW5ld09iamVjdCA9IFRuZ1V0aWwudW53cmFwKG5ld09iamVjdCk7Ci0KLQkJb2JqZWN0ID0gbmV3T2JqZWN0OwotCi0JCS8vIGFkZCBkaWFncmFtIGNoYW5nZSBsaXN0ZW5lciB0byB0aGUgbGlua2VkIG9iamVjdC4gUmVtb3ZlIHRoZSBvbGQKLQkJLy8gbGlzdGVuZXIgaWYgdGhlcmUgaXMgYW55LgotCQkvLyBCdXQgZmlyc3Qga2VlcCB0aGUgb2xkIGxpc3RlbmVyIHRvIGhlbHAgZmluZCB0aGUgVU1BIGRpYWdyYW0gb2YgdGhlCi0JCS8vIGFjdGl2aXR5IHF1aWNrbHkuCi0JCS8vCi0JCUFjdGl2aXR5IGUgPSAoQWN0aXZpdHkpIG5ld09iamVjdDsJCQotCQlpZihQcm9jZXNzVXRpbC5pc0V4dGVuZGluZ09yTG9jYWxseUNvbnRyaWJ1dGluZyhlKSkgewotCQkJYmFzZUFjdCA9IChBY3Rpdml0eSkgZS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCk7Ci0JCX0KLQkJYmFzZUFjdCA9IG51bGw7Ci0JCQotCQlpZihuZXdPYmplY3QgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJLy8gc2V0IHRoZSBVTUEgZGlhZ3JhbSBmb3IgdGhpcyBkaWFncmFtCi0JCS8vCi0JCWlmKGlzR3JhcGhpY2FsRGF0YVJlcXVpcmVkKCkpIHsKLQkJCWdyYXBoTm9kZSA9IEdyYXBoaWNhbERhdGFNYW5hZ2VyLmdldEluc3RhbmNlKCkuZ2V0VU1BRGlhZ3JhbShlLAotCQkJCQlnZXRUeXBlKCksIGZhbHNlKTsKLQkJCS8vIHNldCB0aGUgZmxhZyB0byBpbmRpY2F0ZSB0aGlzIGlzIGEgbmV3IGRpYWdyYW0gb3Igbm90Ci0JCQlpZiAoZ3JhcGhOb2RlID09IG51bGwpIHsKLQkJCQlncmFwaE5vZGUgPSBHcmFwaGljYWxEYXRhTWFuYWdlci5nZXRJbnN0YW5jZSgpLmdldFVNQURpYWdyYW0oZSwKLQkJCQkJCWdldFR5cGUoKSwgdHJ1ZSk7Ci0JCQkJc2V0TmV3KHRydWUpOwotCQkJfQotCQl9Ci0KLQkJaWYoIWUuZUFkYXB0ZXJzKCkuY29udGFpbnMoZGlhZ3JhbUNoYW5nZUxpc3RlbmVyKSkgewotCQkJZS5lQWRhcHRlcnMoKS5hZGQoZGlhZ3JhbUNoYW5nZUxpc3RlbmVyKTsKLQkJfQotCQlpZiAoYmFzZUFjdCAhPSBudWxsICYmICFiYXNlQWN0LmVBZGFwdGVycygpLmNvbnRhaW5zKGRpYWdyYW1DaGFuZ2VMaXN0ZW5lcikpIHsKLQkJCWJhc2VBY3QuZUFkYXB0ZXJzKCkuYWRkKGRpYWdyYW1DaGFuZ2VMaXN0ZW5lcik7Ci0JCX0KLQotCQlwb3B1bGF0ZURpYWdyYW0oKTsKLQotCQlpZighZUFkYXB0ZXJzKCkuY29udGFpbnMoZGlhZ3JhbUFkYXB0ZXIpKSB7Ci0JCQl0aGlzLmVBZGFwdGVycygpLmFkZCgoQWRhcHRlcikgZGlhZ3JhbUFkYXB0ZXIpOwotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBQb3B1bGF0ZXMgdGhlIGRpYWdyYW0gd2l0aCB0aGUgZGF0YSBmcm9tIHRoZSBVTUEgbW9kZWwuIFN1YmNsYXNzIHNob3VsZAotCSAqIG92ZXJyaWRlIHRoaXMgbWV0aG9kLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBvcHVsYXRlRGlhZ3JhbSgpIHsKLQkJcG9wdWxhdGVOb2RlcygpOwotCQlwb3B1bGF0ZUxpbmtzKCk7Ci0KLQkJLy8gYWRkIHRoaXMgZGlhZ3JhbSB0byB0aGUgY29uc3VtZXIgbGlzdCBvZiBhbGwgbm9kZXMgc28gdGhleSB3aWxsIG5vdAotCQkvLyBiZSBkaXNwb3NlZAotCQkvLyBiZWZvcmUgdGhpcyBkaWFncmFtLgotCQkvLwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBnZXROb2RlcygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJTm9kZUltcGwgbm9kZSA9IChOb2RlSW1wbCkgaXRlci5uZXh0KCk7Ci0JCQlub2RlLmFkZENvbnN1bWVyKHRoaXMpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUG9wdWxhdGVzIHRoZSBpbmNvbWluZy9vdXRnb2luZyBsaW5rcyBvZiB0aGUgZ2l2ZW4gbm9kZQotCSAqIAotCSAqIEBwYXJhbSBub2RlCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcG9wdWxhdGVMaW5rcyhOb2RlIG5vZGUsIGJvb2xlYW4gZGlzYWJsZU5vdGlmaWNhdGlvbikgewotCQlpbnQgc2l6ZSA9IDA7Ci0JCWJvb2xlYW5bXSBub3RpZmllcyA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlpZiAoZGlzYWJsZU5vdGlmaWNhdGlvbikgewotCQkJCXNpemUgPSBnZXROb2RlcygpLnNpemUoKTsKLQkJCQlub3RpZmllcyA9IG5ldyBib29sZWFuW3NpemVdOwotCQkJCS8vIGRpc2FibGUgbm90aWZpY2F0aW9uIGZvciBhbGwgbm9kZXMgaW4gdGhpcyBkaWFncmFtIHRvIGF2b2lkCi0JCQkJLy8gdW53YW50ZWQgY29uY3VycmVudCBtb2RpZmljYXRpb24gb2YgdGhlaXIgY29ubmVjdGlvbiBsaXN0Ci0JCQkJLy8KLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCQlOb2RlIGNoaWxkID0gKChOb2RlKSBnZXROb2RlcygpLmdldChpKSk7Ci0JCQkJCW5vdGlmaWVzW2ldID0gY2hpbGQuZURlbGl2ZXIoKTsKLQkJCQkJY2hpbGQuZVNldERlbGl2ZXIoZmFsc2UpOwotCQkJCX0KLQkJCX0KLQotCQkJR3JhcGhOb2RlIGdyYXBoTm9kZSA9IG5vZGUuZ2V0R3JhcGhOb2RlKCk7Ci0JCQlpZiAoZ3JhcGhOb2RlICE9IG51bGwpIHsKLQkJCQlHcmFwaGljYWxEYXRhSGVscGVyLmZpbGxDb25uZWN0aW9ucyhub2RlLCBncmFwaE5vZGUpOwotCQkJfQotCQl9IGZpbmFsbHkgewotCQkJaWYgKGRpc2FibGVOb3RpZmljYXRpb24pIHsKLQkJCQkvLyByZXN0b3JlIG5vdGlmaWNhdGlvbiBmbGFnCi0JCQkJLy8KLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCQkoKEVPYmplY3QpIGdldE5vZGVzKCkuZ2V0KGkpKS5lU2V0RGVsaXZlcihub3RpZmllc1tpXSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcG9wdWxhdGVOb2RlcygpIHsJCQotCQlvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW0gZGlhZ3JhbSA9IGdldFVNQURpYWdyYW0oKTsKLQkJaWYoZGlhZ3JhbSAhPSBudWxsKSB7Ci0JCQlMaXN0IHR5cGVkTm9kZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBkaWFncmFtLmdldENvbnRhaW5lZCgpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBlbGVtZW50ID0gaXRlci5uZXh0KCk7Ci0JCQkJaW50IHR5cGUgPSBnZXRUeXBlKGVsZW1lbnQpOwotCQkJCWlmICh0eXBlID4gMCkgewotCQkJCQlUeXBlZE5vZGUgbm9kZSA9IE1vZGVsRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlVHlwZWROb2RlKCk7Ci0JCQkJCW5vZGUuc2V0VHlwZSh0eXBlKTsKLQkJCQkJbm9kZS5zZXRPYmplY3QoZWxlbWVudCk7Ci0JCQkJCXR5cGVkTm9kZXMuYWRkKG5vZGUpOwotCQkJCX0KLQkJCX0KLQkJCWdldE5vZGVzKCkuYWRkQWxsKHR5cGVkTm9kZXMpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgaW50IGdldFR5cGUoT2JqZWN0IG9iaikgewotCQlpZiAob2JqIGluc3RhbmNlb2YgR3JhcGhOb2RlKSB7Ci0JCQlHcmFwaE5vZGUgbm9kZSA9IChHcmFwaE5vZGUpIG9iajsKLQkJCVNlbWFudGljTW9kZWxCcmlkZ2UgbW9kZWxCcmlkZ2UgPSBub2RlLmdldFNlbWFudGljTW9kZWwoKTsKLQkJCWlmIChtb2RlbEJyaWRnZSBpbnN0YW5jZW9mIFNpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50KSB7Ci0JCQkJU3RyaW5nIHR5cGUgPSAoKFNpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50KSBtb2RlbEJyaWRnZSkKLQkJCQkJCS5nZXRUeXBlSW5mbygpOwotCQkJCWlmIChHcmFwaGljYWxEYXRhSGVscGVyLkdSQVBIX05PREVfU1lOQ0hfQkFSLmVxdWFscyh0eXBlKSkgewotCQkJCQlyZXR1cm4gVHlwZWROb2RlLlNZTkNIX0JBUjsKLQkJCQl9IGVsc2UgaWYgKEdyYXBoaWNhbERhdGFIZWxwZXIuR1JBUEhfTk9ERV9ERUNJU0lPTi5lcXVhbHModHlwZSkpIHsKLQkJCQkJcmV0dXJuIFR5cGVkTm9kZS5ERUNJU0lPTjsKLQkJCQl9IGVsc2UgaWYgKEdyYXBoaWNhbERhdGFIZWxwZXIuR1JBUEhfTk9ERV9FTkQuZXF1YWxzKHR5cGUpKSB7Ci0JCQkJCXJldHVybiBUeXBlZE5vZGUuRU5EOwotCQkJCX0gZWxzZSBpZiAoR3JhcGhpY2FsRGF0YUhlbHBlci5HUkFQSF9OT0RFX1NUQVJULmVxdWFscyh0eXBlKSkgewotCQkJCQlyZXR1cm4gVHlwZWROb2RlLlNUQVJUOwotCQkJCX0gZWxzZSBpZiAoR3JhcGhpY2FsRGF0YUhlbHBlci5HUkFQSF9OT0RFX0ZSRUVfVEVYVAotCQkJCQkJLmVxdWFscyh0eXBlKSkgewotCQkJCQlyZXR1cm4gVHlwZWROb2RlLkZSRUVfVEVYVDsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIC0xOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHBvcHVsYXRlTGlua3MoKSB7Ci0JCS8vIGZpbGwgb3V0Z29pbmcvaW5jb21pbmcgY29ubmVjdGlvbiBsaXN0cyBvZiBhbGwgbm9kZXMKLQkJLy8KLQkJaW50IHNpemUgPSBnZXROb2RlcygpLnNpemUoKTsKLQkJYm9vbGVhbltdIG5vdGlmaWVzID0gbmV3IGJvb2xlYW5bc2l6ZV07Ci0JCXRyeSB7Ci0JCQkvLyBkaXNhYmxlIG5vdGlmaWNhdGlvbiBmb3IgYWxsIG5vZGVzIGluIHRoaXMgZGlhZ3JhbSB0byBhdm9pZAotCQkJLy8gdW53YW50ZWQgY29uY3VycmVudCBtb2RpZmljYXRpb24gb2YgdGhlaXIgY29ubmVjdGlvbiBsaXN0Ci0JCQkvLwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQlOb2RlIG5vZGUgPSAoKE5vZGUpIGdldE5vZGVzKCkuZ2V0KGkpKTsKLQkJCQlub3RpZmllc1tpXSA9IG5vZGUuZURlbGl2ZXIoKTsKLQkJCQlub2RlLmVTZXREZWxpdmVyKGZhbHNlKTsKLQkJCX0KLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGdldE5vZGVzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJTm9kZSBub2RlID0gKE5vZGUpIGl0ZXIubmV4dCgpOwotCQkJCXBvcHVsYXRlTGlua3Mobm9kZSwgZmFsc2UpOwotCQkJfQotCQl9IGZpbmFsbHkgewotCQkJLy8gcmVzdG9yZSBub3RpZmljYXRpb24gZmxhZwotCQkJLy8KLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJKChFT2JqZWN0KSBnZXROb2RlcygpLmdldChpKSkuZVNldERlbGl2ZXIobm90aWZpZXNbaV0pOwotCQkJfQotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmVzIHRoZSBkYXRhIGZvciB0aGUgcmVtb3ZlZCBub2RlIGZyb20gdGhlIFVNQSBtb2RlbCBTdWJjbGFzcyBzaG91bGQKLQkgKiBvdmVycmlkZSB0aGlzIG1ldGhvZC4KLQkgKiAKLQkgKiBAcGFyYW0gcmVtb3ZlZE5vZGUKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVGcm9tVW1hTW9kZWwoTm9kZSByZW1vdmVkTm9kZSkgewotCQlBY3Rpdml0eSBhY3QgPSAoQWN0aXZpdHkpIGdldE9iamVjdCgpOwotCQlpZiAocmVtb3ZlZE5vZGUuZ2V0T2JqZWN0KCkgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50KSB7Ci0JCQlhY3QuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5yZW1vdmUocmVtb3ZlZE5vZGUuZ2V0T2JqZWN0KCkpOwotCQl9Ci0JCQotCQlpZihnZXRVTUFEaWFncmFtKCkgIT0gbnVsbCkgewotCQkJZ2V0VU1BRGlhZ3JhbSgpLmdldENvbnRhaW5lZCgpLnJlbW92ZShyZW1vdmVkTm9kZS5nZXRHcmFwaE5vZGUoKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBZGRzIHRoZSBkYXRhIGZvciB0aGUgbmV3bHkgYWRkZWQgbm9kZSB0byB0aGUgVU1BIG1vZGVsIFN1YmNsYXNzIHNob3VsZAotCSAqIG92ZXJyaWRlIHRoaXMgbWV0aG9kLgotCSAqIAotCSAqIEBwYXJhbSBwb3NpdGlvbgotCSAqIEBwYXJhbSBuZXdWYWx1ZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFRvVW1hTW9kZWwoaW50IHBvc2l0aW9uLCBOb2RlIGFkZGVkTm9kZSkgewotCi0JCWlmIChhZGRlZE5vZGUuZ2V0R3JhcGhOb2RlKCkgPT0gbnVsbCkgewotCQkJLy8gdGhpcyBub2RlIGlzIHJlYWRkZWQgYWZ0ZXIgdW5kbwotCQkJLy8KLQkJCSgoTm9kZUltcGwpIGFkZGVkTm9kZSkuYmFzaWNTZXRPYmplY3QoYWRkZWROb2RlLmdldE9iamVjdCgpKTsKLQkJfQotCQkKLQkJaWYoZ2V0VU1BRGlhZ3JhbSgpICE9IG51bGwpIHsKLQkJCWdldFVNQURpYWdyYW0oKS5nZXRDb250YWluZWQoKS5hZGQoYWRkZWROb2RlLmdldEdyYXBoTm9kZSgpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgbmV3IG5vZGUgZm9yIHRoaXMgZGlhZ3JhbSBmb3IgdGhlIGdpdmVuIE1ldGhvZEVsZW1lbnQuCi0JICogCi0JICogQHBhcmFtIGUKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIE5vZGUgdG9Ob2RlKE1ldGhvZEVsZW1lbnQgZSkgewotCQlOb2RlIG5vZGUgPSBuZXdOb2RlKCk7Ci0JCWlmIChub2RlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJbm9kZS5zZXRVTUFEaWFncmFtKGdldFVNQURpYWdyYW0oKSk7Ci0JCW5vZGUuc2V0RGlhZ3JhbSh0aGlzKTsKLQkJbm9kZS5zZXRPYmplY3QoZSk7Ci0JCXJldHVybiBub2RlOwotCX0KLQotCXByb3RlY3RlZCBOb2RlIG5ld05vZGUoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZSNnZXRNZXRob2RFbGVtZW50QWRhcHRlclR5cGUoKQotCSAqLwotCXB1YmxpYyBDbGFzcyBnZXRNZXRob2RFbGVtZW50QWRhcHRlclR5cGUoKSB7Ci0JCXJldHVybiBnZXREaWFncmFtQ2hhbmdlTGlzdGVuZXJUeXBlKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLk5vZGVJbXBsI2Rpc3Bvc2UoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWlmIChkaWFncmFtQ2hhbmdlTGlzdGVuZXIgIT0gbnVsbCkgewotCQkJQWN0aXZpdHkgZSA9IChBY3Rpdml0eSkgZ2V0T2JqZWN0KCk7Ci0JCQlpZiAoYmFzZUFjdCAhPSBudWxsKSB7Ci0JCQkJYmFzZUFjdC5lQWRhcHRlcnMoKS5yZW1vdmUoZGlhZ3JhbUNoYW5nZUxpc3RlbmVyKTsKLQkJCX0KLQkJCWlmKGUgIT0gbnVsbCkgewotCQkJCWUuZUFkYXB0ZXJzKCkucmVtb3ZlKGRpYWdyYW1DaGFuZ2VMaXN0ZW5lcik7Ci0JCQl9Ci0JCX0KLQotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5EaWFncmFtI3NldERlZmF1bHROYW1lKG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5hbWVkTm9kZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZWZhdWx0TmFtZShOYW1lZE5vZGUgbmV3Tm9kZSkgewotCQlNZXRob2RFbGVtZW50IG9iaiA9IChNZXRob2RFbGVtZW50KSBuZXdOb2RlLmdldE9iamVjdCgpOwotCQlpbnQgY2xhc3NJRCA9IG9iai5lQ2xhc3MoKS5nZXRDbGFzc2lmaWVySUQoKTsKLQkJQWN0aXZpdHkgYWN0ID0gKEFjdGl2aXR5KSBnZXRPYmplY3QoKTsKLQkJQXJyYXlMaXN0IHNpYmxpbmdzID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBhY3QuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCUJyZWFrZG93bkVsZW1lbnQgZSA9IChCcmVha2Rvd25FbGVtZW50KSBpdGVyLm5leHQoKTsKLQkJCWlmIChlLmVDbGFzcygpLmdldENsYXNzaWZpZXJJRCgpID09IGNsYXNzSUQpIHsKLQkJCQlzaWJsaW5ncy5hZGQoZSk7Ci0JCQl9Ci0JCX0KLQkJU3RyaW5nIGJhc2VOYW1lID0gTWVzc2FnZUZvcm1hdAotCQkJCS5mb3JtYXQoCi0JCQkJCQlEaWFncmFtUmVzb3VyY2VzLmRlZmF1bHRCYXNlTmFtZSwgbmV3IE9iamVjdFtdIHsgVG5nVXRpbC5nZXRUeXBlVGV4dChvYmouZUNsYXNzKCkuZ2V0TmFtZSgpKSB9KTsgCi0JCVRuZ1V0aWwuc2V0RGVmYXVsdE5hbWUoc2libGluZ3MsIG9iaiwgYmFzZU5hbWUpOwotCQluZXdOb2RlLnNldE5hbWUob2JqLmdldE5hbWUoKSk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGV4dHJhY3RDaGlsZHJlbihJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIgYWRhcHRlciwgT2JqZWN0IG9iamVjdCwgQ29sbGVjdGlvbiBjaGlsZHJlbiwKLQkJCWJvb2xlYW4gZmlsdGVyU3VwcHJlc3NlZCkgewotCQkvLyBkaXNhYmxlIHJvbGx1cCBiZWZvcmUgZ2V0dGluZyB0aGUgY2hpbGRyZW4KLQkJLy8KLQkJYm9vbGVhbiBvbGRSb2xsZWRVcCA9IGZhbHNlOwotCQlpZihhZGFwdGVyIGluc3RhbmNlb2YgQlNBY3Rpdml0eUl0ZW1Qcm92aWRlcikgewotCQkJQlNBY3Rpdml0eUl0ZW1Qcm92aWRlciBpdGVtUHJvdmlkZXIgPSAoQlNBY3Rpdml0eUl0ZW1Qcm92aWRlcilhZGFwdGVyOwotCQkJb2xkUm9sbGVkVXAgPSBpdGVtUHJvdmlkZXIuaXNSb2xsZWRVcCgpOwotCQkJaXRlbVByb3ZpZGVyLmJhc2ljU2V0Um9sbGVkVXAoZmFsc2UpOwotCQl9Ci0JCWVsc2UgaWYoYWRhcHRlciBpbnN0YW5jZW9mIElCU0l0ZW1Qcm92aWRlcil7Ci0JCQlJQlNJdGVtUHJvdmlkZXIgaXRlbVByb3ZpZGVyID0gKElCU0l0ZW1Qcm92aWRlcilhZGFwdGVyOwotCQkJb2xkUm9sbGVkVXAgPSBpdGVtUHJvdmlkZXIuaXNSb2xsZWRVcCgpOwotCQkJaXRlbVByb3ZpZGVyLnNldFJvbGxlZFVwKGZhbHNlKTsKLQkJfQotCQkKLQkJdHJ5IHsKLQkJCS8vIGZpbHRlciBvdXQgdGhlIHN1cHByZXNzZWQgZWxlbWVudHMKLQkJCS8vCi0JCQlpZiAoYWRhcHRlciAhPSBudWxsKSB7Ci0JCQkJaWYoZmlsdGVyU3VwcHJlc3NlZCl7Ci0JCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGFkYXB0ZXIuZ2V0Q2hpbGRyZW4ob2JqZWN0KS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJCU9iamVjdCBjaGlsZCA9IGl0ZXIubmV4dCgpOwotCQkJCQkJaWYoIWdldFN1cHByZXNzaW9uKCkuaXNTdXBwcmVzc2VkKGNoaWxkKSkgewotCQkJCQkJCWNoaWxkcmVuLmFkZChjaGlsZCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9ZWxzZXsKLQkJCQkJLy8gZG9uJ3QgZmlsdGVyIHN1cHByZXNzZWQgZWxlbWVudHMKLQkJCQkJLy8KLQkJCQkJY2hpbGRyZW4uYWRkQWxsKGFkYXB0ZXIuZ2V0Q2hpbGRyZW4ob2JqZWN0KSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWZpbmFsbHkgewotCQkJLy8gcmVzdG9yZSB0aGUgcm9sbGVkLXVwIGZsYWcKLQkJCS8vCi0JCQlpZihhZGFwdGVyIGluc3RhbmNlb2YgSUJTSXRlbVByb3ZpZGVyKSB7Ci0JCQkJKChJQlNJdGVtUHJvdmlkZXIpYWRhcHRlcikuc2V0Um9sbGVkVXAob2xkUm9sbGVkVXApOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIFN1cHByZXNzaW9uIGdldFN1cHByZXNzaW9uKCkgewotCQlyZXR1cm4gc3VwcHJlc3Npb247Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U3VwcHJlc3Npb24oU3VwcHJlc3Npb24gc3VwcHJlc3Npb24pIHsKLQkJdGhpcy5zdXBwcmVzc2lvbiA9IHN1cHByZXNzaW9uOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuRGlhZ3JhbSNzZXRGaWx0ZXIoY29tLmlibS5saWJyYXJ5LmVkaXQuSUZpbHRlcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGaWx0ZXIoSUZpbHRlciBmaWx0ZXIpIHsKLQkJdGhpcy5maWx0ZXIgPSBmaWx0ZXI7Ci0JfQotCi0JLyoqCi0JICogSW4gUHJvY2VzcyBXQlMsIGlmIGJyZWFrZG93bmVsZW1lbnQgaXMgbW92ZWQKLQkgKiB1cCBvciBkb3duLCBkaWFncmFtIHNob3VsZCBiZSB1cGRhdGVkIGFjY29yZGluZ2x5LiAKLQkgKiBTdWItY2xhc3Mgc2hvdWxkIG92ZXJyaWRlIHRoaXMgbWV0aG9kIGlmIGRpYWdyYW0gbmVlZHMgdXBkYXRlIG9uIG1vdmUuIAotCSAqIEBwYXJhbSBuZXdWYWx1ZQotCSAqIEBwYXJhbSBuZXdwb3NpdGlvbiBpbnQKLQkgKiBAcGFyYW0gb2xkUG9zaXRpb24gT2JqZWN0KEludGVnZXIpCi0JICovCi0JcHVibGljIHZvaWQgbW92ZU5vZGUoT2JqZWN0IG1vdmVkT2JqZWN0LCBpbnQgcG9zaXRpb24sIE9iamVjdCBvbGRQb3NpdGlvbikgewotCX0KLQkJCi0JcHVibGljIGJvb2xlYW4gaXNHcmFwaGljYWxEYXRhUmVxdWlyZWQoKSB7Ci0JCXJldHVybiBncmFwaGljYWxEYXRhUmVxdWlyZWQ7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0R3JhcGhpY2FsRGF0YVJlcXVpcmVkKGJvb2xlYW4gZ3JhcGhpY2FsRGF0YVJlcXVpcmVkKSB7Ci0JCXRoaXMuZ3JhcGhpY2FsRGF0YVJlcXVpcmVkID0gZ3JhcGhpY2FsRGF0YVJlcXVpcmVkOwotCX0KLQkJCi0JcHVibGljIElGaWx0ZXIgZ2V0RmlsdGVyKCkgewotCQlyZXR1cm4gZmlsdGVyOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRXcmFwcGVyKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyIHdyYXBwZXIpIHsKLQkJdGhpcy53cmFwcGVyID0gd3JhcHBlcjsKLQl9Ci0JCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCX0KLQkKLQlwcml2YXRlIFN1cHByZXNzaW9uIHN1cHByZXNzaW9uOwotCi0JcHJvdGVjdGVkIEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyIHdyYXBwZXI7Ci0KLQlwcm90ZWN0ZWQgSUZpbHRlciBmaWx0ZXI7Ci0JCi0JcHJpdmF0ZSBib29sZWFuIGdyYXBoaWNhbERhdGFSZXF1aXJlZCA9IHRydWU7Ci0KLX0gLy8gRGlhZ3JhbUltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9pbXBsL0xpbmtJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvaW1wbC9MaW5rSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMGY5MWY3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9pbXBsL0xpbmtJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NDIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkFic29sdXRlQmVuZHBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRURhdGFUeXBlVW5pcXVlRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTW9kZWxQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwudXRpbC5HcmFwaGljYWxEYXRhSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhDb25uZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaEVkZ2U7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+TGluazwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5MaW5rSW1wbCNnZXROYW1lIDxlbT5OYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLkxpbmtJbXBsI2dldFNvdXJjZSA8ZW0+U291cmNlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLkxpbmtJbXBsI2dldFRhcmdldCA8ZW0+VGFyZ2V0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLkxpbmtJbXBsI2dldEJlbmRwb2ludHMgPGVtPkJlbmRwb2ludHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuTGlua0ltcGwjZ2V0U291cmNlRW5kUG9pbnQgPGVtPlNvdXJjZSBFbmQgUG9pbnQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuTGlua0ltcGwjZ2V0VGFyZ2V0RW5kUG9pbnQgPGVtPlRhcmdldCBFbmQgUG9pbnQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBMaW5rSW1wbCBleHRlbmRzIExpbmtlZE9iamVjdEltcGwgaW1wbGVtZW50cyBMaW5rIHsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZSgpIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX0VERUZBVUxUID0gIiI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWUoKSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBuYW1lID0gTkFNRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFRhcmdldCgpIDxlbT5UYXJnZXQ8L2VtPn0nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUYXJnZXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBOb2RlIHRhcmdldDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEJlbmRwb2ludHMoKSA8ZW0+QmVuZHBvaW50czwvZW0+fScgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QmVuZHBvaW50cygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PEFic29sdXRlQmVuZHBvaW50PiBiZW5kcG9pbnRzOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNvdXJjZUVuZFBvaW50KCkgPGVtPlNvdXJjZSBFbmQgUG9pbnQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTb3VyY2VFbmRQb2ludCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBQb2ludCBTT1VSQ0VfRU5EX1BPSU5UX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNvdXJjZUVuZFBvaW50KCkgPGVtPlNvdXJjZSBFbmQgUG9pbnQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTb3VyY2VFbmRQb2ludCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFBvaW50IHNvdXJjZUVuZFBvaW50ID0gU09VUkNFX0VORF9QT0lOVF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUYXJnZXRFbmRQb2ludCgpIDxlbT5UYXJnZXQgRW5kIFBvaW50PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VGFyZ2V0RW5kUG9pbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgUG9pbnQgVEFSR0VUX0VORF9QT0lOVF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUYXJnZXRFbmRQb2ludCgpIDxlbT5UYXJnZXQgRW5kIFBvaW50PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VGFyZ2V0RW5kUG9pbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBQb2ludCB0YXJnZXRFbmRQb2ludCA9IFRBUkdFVF9FTkRfUE9JTlRfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIExpbmtJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIE1vZGVsUGFja2FnZS5MaXRlcmFscy5MSU5LOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmV3TmFtZSkgewotCQlTdHJpbmcgb2xkTmFtZSA9IG5hbWU7Ci0JCW5hbWUgPSBuZXdOYW1lOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNb2RlbFBhY2thZ2UuTElOS19fTkFNRSwgb2xkTmFtZSwgbmFtZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm9kZSBnZXRTb3VyY2UoKSB7Ci0JCWlmIChlQ29udGFpbmVyRmVhdHVyZUlEICE9IE1vZGVsUGFja2FnZS5MSU5LX19TT1VSQ0UpIHJldHVybiBudWxsOwotCQlyZXR1cm4gKE5vZGUpZUNvbnRhaW5lcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldFNvdXJjZShOb2RlIG5ld1NvdXJjZSwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQltc2dzID0gZUJhc2ljU2V0Q29udGFpbmVyKChJbnRlcm5hbEVPYmplY3QpbmV3U291cmNlLCBNb2RlbFBhY2thZ2UuTElOS19fU09VUkNFLCBtc2dzKTsKLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNvdXJjZShOb2RlIG5ld1NvdXJjZSkgewotCQlpZiAobmV3U291cmNlICE9IGVJbnRlcm5hbENvbnRhaW5lcigpIHx8IChlQ29udGFpbmVyRmVhdHVyZUlEICE9IE1vZGVsUGFja2FnZS5MSU5LX19TT1VSQ0UgJiYgbmV3U291cmNlICE9IG51bGwpKSB7Ci0JCQlpZiAoRWNvcmVVdGlsLmlzQW5jZXN0b3IodGhpcywgbmV3U291cmNlKSkKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJSZWN1cnNpdmUgY29udGFpbm1lbnQgbm90IGFsbG93ZWQgZm9yICIgKyB0b1N0cmluZygpKTsgLy8kTk9OLU5MUy0xJAotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoZUludGVybmFsQ29udGFpbmVyKCkgIT0gbnVsbCkKLQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCWlmIChuZXdTb3VyY2UgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3U291cmNlKS5lSW52ZXJzZUFkZCh0aGlzLCBNb2RlbFBhY2thZ2UuTk9ERV9fT1VUR09JTkdfQ09OTkVDVElPTlMsIE5vZGUuY2xhc3MsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0U291cmNlKG5ld1NvdXJjZSwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNb2RlbFBhY2thZ2UuTElOS19fU09VUkNFLCBuZXdTb3VyY2UsIG5ld1NvdXJjZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm9kZSBnZXRUYXJnZXQoKSB7Ci0JCWlmICh0YXJnZXQgIT0gbnVsbCAmJiB0YXJnZXQuZUlzUHJveHkoKSkgewotCQkJSW50ZXJuYWxFT2JqZWN0IG9sZFRhcmdldCA9IChJbnRlcm5hbEVPYmplY3QpdGFyZ2V0OwotCQkJdGFyZ2V0ID0gKE5vZGUpZVJlc29sdmVQcm94eShvbGRUYXJnZXQpOwotCQkJaWYgKHRhcmdldCAhPSBvbGRUYXJnZXQpIHsKLQkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLCBNb2RlbFBhY2thZ2UuTElOS19fVEFSR0VULCBvbGRUYXJnZXQsIHRhcmdldCkpOwotCQkJfQotCQl9Ci0JCXJldHVybiB0YXJnZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb2RlIGJhc2ljR2V0VGFyZ2V0KCkgewotCQlyZXR1cm4gdGFyZ2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRUYXJnZXQoTm9kZSBuZXdUYXJnZXQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJTm9kZSBvbGRUYXJnZXQgPSB0YXJnZXQ7Ci0JCXRhcmdldCA9IG5ld1RhcmdldDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTW9kZWxQYWNrYWdlLkxJTktfX1RBUkdFVCwgb2xkVGFyZ2V0LCBuZXdUYXJnZXQpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUYXJnZXQoTm9kZSBuZXdUYXJnZXQpIHsKLQkJaWYgKG5ld1RhcmdldCAhPSB0YXJnZXQpIHsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKHRhcmdldCAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCl0YXJnZXQpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIE1vZGVsUGFja2FnZS5OT0RFX19JTkNPTUlOR19DT05ORUNUSU9OUywgTm9kZS5jbGFzcywgbXNncyk7Ci0JCQlpZiAobmV3VGFyZ2V0ICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld1RhcmdldCkuZUludmVyc2VBZGQodGhpcywgTW9kZWxQYWNrYWdlLk5PREVfX0lOQ09NSU5HX0NPTk5FQ1RJT05TLCBOb2RlLmNsYXNzLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldFRhcmdldChuZXdUYXJnZXQsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTW9kZWxQYWNrYWdlLkxJTktfX1RBUkdFVCwgbmV3VGFyZ2V0LCBuZXdUYXJnZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PEFic29sdXRlQmVuZHBvaW50PiBnZXRCZW5kcG9pbnRzKCkgewotCQlpZiAoYmVuZHBvaW50cyA9PSBudWxsKSB7Ci0JCQliZW5kcG9pbnRzID0gbmV3IEVEYXRhVHlwZVVuaXF1ZUVMaXN0PEFic29sdXRlQmVuZHBvaW50PihBYnNvbHV0ZUJlbmRwb2ludC5jbGFzcywgdGhpcywgTW9kZWxQYWNrYWdlLkxJTktfX0JFTkRQT0lOVFMpOwotCQl9Ci0JCXJldHVybiBiZW5kcG9pbnRzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUG9pbnQgZ2V0U291cmNlRW5kUG9pbnQoKSB7Ci0JCXJldHVybiBzb3VyY2VFbmRQb2ludDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0U291cmNlRW5kUG9pbnQoUG9pbnQgbmV3U291cmNlRW5kUG9pbnQpIHsKLQkJUG9pbnQgb2xkU291cmNlRW5kUG9pbnQgPSBzb3VyY2VFbmRQb2ludDsKLQkJc291cmNlRW5kUG9pbnQgPSBuZXdTb3VyY2VFbmRQb2ludDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTW9kZWxQYWNrYWdlLkxJTktfX1NPVVJDRV9FTkRfUE9JTlQsIG9sZFNvdXJjZUVuZFBvaW50LCBzb3VyY2VFbmRQb2ludCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUG9pbnQgZ2V0VGFyZ2V0RW5kUG9pbnQoKSB7Ci0JCXJldHVybiB0YXJnZXRFbmRQb2ludDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VGFyZ2V0RW5kUG9pbnQoUG9pbnQgbmV3VGFyZ2V0RW5kUG9pbnQpIHsKLQkJUG9pbnQgb2xkVGFyZ2V0RW5kUG9pbnQgPSB0YXJnZXRFbmRQb2ludDsKLQkJdGFyZ2V0RW5kUG9pbnQgPSBuZXdUYXJnZXRFbmRQb2ludDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTW9kZWxQYWNrYWdlLkxJTktfX1RBUkdFVF9FTkRfUE9JTlQsIG9sZFRhcmdldEVuZFBvaW50LCB0YXJnZXRFbmRQb2ludCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZUFkZChJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgTW9kZWxQYWNrYWdlLkxJTktfX1NPVVJDRToKLQkJCQlpZiAoZUludGVybmFsQ29udGFpbmVyKCkgIT0gbnVsbCkKLQkJCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQkJcmV0dXJuIGJhc2ljU2V0U291cmNlKChOb2RlKW90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgTW9kZWxQYWNrYWdlLkxJTktfX1RBUkdFVDoKLQkJCQlpZiAodGFyZ2V0ICE9IG51bGwpCi0JCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCl0YXJnZXQpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIE1vZGVsUGFja2FnZS5OT0RFX19JTkNPTUlOR19DT05ORUNUSU9OUywgTm9kZS5jbGFzcywgbXNncyk7Ci0JCQkJcmV0dXJuIGJhc2ljU2V0VGFyZ2V0KChOb2RlKW90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VBZGQob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBNb2RlbFBhY2thZ2UuTElOS19fU09VUkNFOgotCQkJCXJldHVybiBiYXNpY1NldFNvdXJjZShudWxsLCBtc2dzKTsKLQkJCWNhc2UgTW9kZWxQYWNrYWdlLkxJTktfX1RBUkdFVDoKLQkJCQlyZXR1cm4gYmFzaWNTZXRUYXJnZXQobnVsbCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyRmVhdHVyZShOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZUNvbnRhaW5lckZlYXR1cmVJRCkgewotCQkJY2FzZSBNb2RlbFBhY2thZ2UuTElOS19fU09VUkNFOgotCQkJCXJldHVybiBlSW50ZXJuYWxDb250YWluZXIoKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBNb2RlbFBhY2thZ2UuTk9ERV9fT1VUR09JTkdfQ09OTkVDVElPTlMsIE5vZGUuY2xhc3MsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyRmVhdHVyZShtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5MSU5LX19OQU1FOgotCQkJCXJldHVybiBnZXROYW1lKCk7Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5MSU5LX19TT1VSQ0U6Ci0JCQkJcmV0dXJuIGdldFNvdXJjZSgpOwotCQkJY2FzZSBNb2RlbFBhY2thZ2UuTElOS19fVEFSR0VUOgotCQkJCWlmIChyZXNvbHZlKSByZXR1cm4gZ2V0VGFyZ2V0KCk7Ci0JCQkJcmV0dXJuIGJhc2ljR2V0VGFyZ2V0KCk7Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5MSU5LX19CRU5EUE9JTlRTOgotCQkJCXJldHVybiBnZXRCZW5kcG9pbnRzKCk7Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5MSU5LX19TT1VSQ0VfRU5EX1BPSU5UOgotCQkJCXJldHVybiBnZXRTb3VyY2VFbmRQb2ludCgpOwotCQkJY2FzZSBNb2RlbFBhY2thZ2UuTElOS19fVEFSR0VUX0VORF9QT0lOVDoKLQkJCQlyZXR1cm4gZ2V0VGFyZ2V0RW5kUG9pbnQoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgTW9kZWxQYWNrYWdlLkxJTktfX05BTUU6Ci0JCQkJc2V0TmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5MSU5LX19TT1VSQ0U6Ci0JCQkJc2V0U291cmNlKChOb2RlKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5MSU5LX19UQVJHRVQ6Ci0JCQkJc2V0VGFyZ2V0KChOb2RlKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5MSU5LX19CRU5EUE9JTlRTOgotCQkJCWdldEJlbmRwb2ludHMoKS5jbGVhcigpOwotCQkJCWdldEJlbmRwb2ludHMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIEFic29sdXRlQmVuZHBvaW50PiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNb2RlbFBhY2thZ2UuTElOS19fU09VUkNFX0VORF9QT0lOVDoKLQkJCQlzZXRTb3VyY2VFbmRQb2ludCgoUG9pbnQpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTW9kZWxQYWNrYWdlLkxJTktfX1RBUkdFVF9FTkRfUE9JTlQ6Ci0JCQkJc2V0VGFyZ2V0RW5kUG9pbnQoKFBvaW50KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBNb2RlbFBhY2thZ2UuTElOS19fTkFNRToKLQkJCQlzZXROYW1lKE5BTUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTW9kZWxQYWNrYWdlLkxJTktfX1NPVVJDRToKLQkJCQlzZXRTb3VyY2UoKE5vZGUpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNb2RlbFBhY2thZ2UuTElOS19fVEFSR0VUOgotCQkJCXNldFRhcmdldCgoTm9kZSludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5MSU5LX19CRU5EUE9JTlRTOgotCQkJCWdldEJlbmRwb2ludHMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTW9kZWxQYWNrYWdlLkxJTktfX1NPVVJDRV9FTkRfUE9JTlQ6Ci0JCQkJc2V0U291cmNlRW5kUG9pbnQoU09VUkNFX0VORF9QT0lOVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNb2RlbFBhY2thZ2UuTElOS19fVEFSR0VUX0VORF9QT0lOVDoKLQkJCQlzZXRUYXJnZXRFbmRQb2ludChUQVJHRVRfRU5EX1BPSU5UX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgTW9kZWxQYWNrYWdlLkxJTktfX05BTUU6Ci0JCQkJcmV0dXJuIE5BTUVfRURFRkFVTFQgPT0gbnVsbCA/IG5hbWUgIT0gbnVsbCA6ICFOQU1FX0VERUZBVUxULmVxdWFscyhuYW1lKTsKLQkJCWNhc2UgTW9kZWxQYWNrYWdlLkxJTktfX1NPVVJDRToKLQkJCQlyZXR1cm4gZ2V0U291cmNlKCkgIT0gbnVsbDsKLQkJCWNhc2UgTW9kZWxQYWNrYWdlLkxJTktfX1RBUkdFVDoKLQkJCQlyZXR1cm4gdGFyZ2V0ICE9IG51bGw7Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5MSU5LX19CRU5EUE9JTlRTOgotCQkJCXJldHVybiBiZW5kcG9pbnRzICE9IG51bGwgJiYgIWJlbmRwb2ludHMuaXNFbXB0eSgpOwotCQkJY2FzZSBNb2RlbFBhY2thZ2UuTElOS19fU09VUkNFX0VORF9QT0lOVDoKLQkJCQlyZXR1cm4gU09VUkNFX0VORF9QT0lOVF9FREVGQVVMVCA9PSBudWxsID8gc291cmNlRW5kUG9pbnQgIT0gbnVsbCA6ICFTT1VSQ0VfRU5EX1BPSU5UX0VERUZBVUxULmVxdWFscyhzb3VyY2VFbmRQb2ludCk7Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5MSU5LX19UQVJHRVRfRU5EX1BPSU5UOgotCQkJCXJldHVybiBUQVJHRVRfRU5EX1BPSU5UX0VERUZBVUxUID09IG51bGwgPyB0YXJnZXRFbmRQb2ludCAhPSBudWxsIDogIVRBUkdFVF9FTkRfUE9JTlRfRURFRkFVTFQuZXF1YWxzKHRhcmdldEVuZFBvaW50KTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChuYW1lOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKG5hbWUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGJlbmRwb2ludHM6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoYmVuZHBvaW50cyk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgc291cmNlRW5kUG9pbnQ6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoc291cmNlRW5kUG9pbnQpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHRhcmdldEVuZFBvaW50OiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKHRhcmdldEVuZFBvaW50KTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0T2JqZWN0KE9iamVjdCBuZXdPYmplY3QpIHsKLQkJc3VwZXIuc2V0T2JqZWN0KG5ld09iamVjdCk7Ci0KLQkJaWYgKG5ld09iamVjdCA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCUdyYXBoRWRnZSBlZGdlID0gKEdyYXBoRWRnZSkgbmV3T2JqZWN0OwotCi0JCS8vIGNvcHkgYmVuZHBvaW50cyBmcm9tIGVkZ2UKLQkJLy8KLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZWRnZS5nZXRXYXlwb2ludHMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCWdldEJlbmRwb2ludHMoKS5hZGQoCi0JCQkJCW5ldyBBYnNvbHV0ZUJlbmRwb2ludChHcmFwaGljYWxEYXRhSGVscGVyCi0JCQkJCQkJLnRvUG9pbnQoKG9yZy5lY2xpcHNlLmVwZi51bWEuUG9pbnQpIGl0ZXIubmV4dCgpKSkpOwotCQl9Ci0KLQkJLy8gY29weSBlbmQgcG9pbnRzIGZyb20gR3JhcGhDb25uZWN0b3JzCi0JCS8vCi0JCWlmIChnZXRTb3VyY2VHcmFwaENvbm5lY3RvcigpLmdldFBvc2l0aW9uKCkgIT0gbnVsbCkgewotCQkJc291cmNlRW5kUG9pbnQgPSBHcmFwaGljYWxEYXRhSGVscGVyCi0JCQkJCS50b1BvaW50KGdldFNvdXJjZUdyYXBoQ29ubmVjdG9yKCkuZ2V0UG9zaXRpb24oKSk7Ci0JCX0KLQkJaWYgKGdldFRhcmdldEdyYXBoQ29ubmVjdG9yKCkuZ2V0UG9zaXRpb24oKSAhPSBudWxsKSB7Ci0JCQl0YXJnZXRFbmRQb2ludCA9IEdyYXBoaWNhbERhdGFIZWxwZXIKLQkJCQkJLnRvUG9pbnQoZ2V0VGFyZ2V0R3JhcGhDb25uZWN0b3IoKS5nZXRQb3NpdGlvbigpKTsKLQkJfQotCQkJCQotCQllQWRhcHRlcnMoKS5hZGQobmV3IEFkYXB0ZXJJbXBsKCkgewotCQkJLyoKLQkJCSAqIChub24tSmF2YWRvYykKLQkJCSAqIAotCQkJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsI25vdGlmeUNoYW5nZWQob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uKQotCQkJICovCi0JCQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBtc2cpIHsKLQkJCQlQb2ludCBwOwotCQkJCUdyYXBoRWRnZSBlZGdlID0gKEdyYXBoRWRnZSkgZ2V0T2JqZWN0KCk7Ci0JCQkJc3dpdGNoIChtc2cuZ2V0RmVhdHVyZUlEKExpbmsuY2xhc3MpKSB7Ci0JCQkJY2FzZSBNb2RlbFBhY2thZ2UuTElOS19fQkVORFBPSU5UUzoKLQkJCQkJc3dpdGNoIChtc2cuZ2V0RXZlbnRUeXBlKCkpIHsKLQkJCQkJY2FzZSBOb3RpZmljYXRpb24uQUREOgotCQkJCQkJcCA9IChBYnNvbHV0ZUJlbmRwb2ludCkgbXNnLmdldE5ld1ZhbHVlKCk7Ci0JCQkJCQlpbnQgaW5kZXggPSBtc2cuZ2V0UG9zaXRpb24oKTsKLQkJCQkJCW9yZy5lY2xpcHNlLmVwZi51bWEuUG9pbnQgdW1hUG9pbnQgPSBHcmFwaGljYWxEYXRhSGVscGVyCi0JCQkJCQkJCS5uZXdNb2RlbFBvaW50KHAueCwgcC55KTsKLQkJCQkJCWlmIChpbmRleCA9PSBOb3RpZmljYXRpb24uTk9fSU5ERVgpIHsKLQkJCQkJCQllZGdlLmdldFdheXBvaW50cygpLmFkZCh1bWFQb2ludCk7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCWVkZ2UuZ2V0V2F5cG9pbnRzKCkuYWRkKGluZGV4LCB1bWFQb2ludCk7Ci0JCQkJCQl9Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCWNhc2UgTm90aWZpY2F0aW9uLlJFTU9WRToKLQkJCQkJCS8vIHAgPSAoQWJzb2x1dGVCZW5kcG9pbnQpIG1zZy5nZXRPbGRWYWx1ZSgpOwotCQkJCQkJLy8gZWRnZS5nZXRXYXlwb2ludHMoKS5yZW1vdmUoR3JhcGhpY2FsRGF0YUhlbHBlci5uZXdNb2RlbFBvaW50KHAueCwKLQkJCQkJCS8vIHAueSkpOwotCi0JCQkJCQlpbmRleCA9IG1zZy5nZXRQb3NpdGlvbigpOwotCQkJCQkJaWYgKGluZGV4ID09IE5vdGlmaWNhdGlvbi5OT19JTkRFWCkgewotCQkJCQkJCWVkZ2UuZ2V0V2F5cG9pbnRzKCkucmVtb3ZlKG1zZy5nZXRQb3NpdGlvbigpKTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJZWRnZS5nZXRXYXlwb2ludHMoKS5yZW1vdmUoaW5kZXgpOwotCQkJCQkJfQotCi0JCQkJCQlyZXR1cm47Ci0JCQkJCWNhc2UgTm90aWZpY2F0aW9uLkFERF9NQU5ZOgotCQkJCQkJQ29sbGVjdGlvbiBjb2xsZWN0aW9uID0gKENvbGxlY3Rpb24pIG1zZy5nZXROZXdWYWx1ZSgpOwotCQkJCQkJQXJyYXlMaXN0IHVtYVBvaW50cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGNvbGxlY3Rpb24uaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJCXAgPSAoQWJzb2x1dGVCZW5kcG9pbnQpIGl0ZXIubmV4dCgpOwotCQkJCQkJCXVtYVBvaW50cy5hZGQoR3JhcGhpY2FsRGF0YUhlbHBlci5uZXdNb2RlbFBvaW50KAotCQkJCQkJCQkJcC54LCBwLnkpKTsKLQkJCQkJCX0KLQkJCQkJCWluZGV4ID0gbXNnLmdldFBvc2l0aW9uKCk7Ci0JCQkJCQlpZiAoaW5kZXggPT0gTm90aWZpY2F0aW9uLk5PX0lOREVYKSB7Ci0JCQkJCQkJZWRnZS5nZXRXYXlwb2ludHMoKS5hZGRBbGwodW1hUG9pbnRzKTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJZWRnZS5nZXRXYXlwb2ludHMoKS5hZGRBbGwoaW5kZXgsIHVtYVBvaW50cyk7Ci0JCQkJCQl9Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCS8vIGNhc2UgTm90aWZpY2F0aW9uLlJFTU9WRV9NQU5ZOgotCQkJCQkvLyBjb2xsZWN0aW9uID0gKENvbGxlY3Rpb24pIG1zZy5nZXRPbGRWYWx1ZSgpOwotCQkJCQkvLyBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjb2xsZWN0aW9uLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJLy8gLmhhc05leHQoKTspIHsKLQkJCQkJLy8gcCA9IChBYnNvbHV0ZUJlbmRwb2ludCkgbXNnLmdldE9sZFZhbHVlKCk7Ci0JCQkJCS8vIGVkZ2UuZ2V0V2F5cG9pbnRzKCkucmVtb3ZlKEdyYXBoaWNhbERhdGFIZWxwZXIubmV3TW9kZWxQb2ludChwLngsCi0JCQkJCS8vIHAueSkpOwotCQkJCQkvLyB9Ci0JCQkJCS8vIHJldHVybjsKLQkJCQkJY2FzZSBOb3RpZmljYXRpb24uU0VUOgotCQkJCQkJcCA9IChBYnNvbHV0ZUJlbmRwb2ludCkgbXNnLmdldE5ld1ZhbHVlKCk7Ci0vLwkJCQkJCVBvaW50IG9sZHAgPSAoQWJzb2x1dGVCZW5kcG9pbnQpIG1zZy5nZXRPbGRWYWx1ZSgpOwotCQkJCQkJaW50IHBvaW50SW5kZXggPSBtc2cuZ2V0UG9zaXRpb24oKTsKLQkJCQkJCW9yZy5lY2xpcHNlLmVwZi51bWEuUG9pbnQgbmV3VW1hUG9pbnQgPSBHcmFwaGljYWxEYXRhSGVscGVyCi0JCQkJCQkJCS5uZXdNb2RlbFBvaW50KHAueCwgcC55KTsKLS8vCQkJCQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5Qb2ludCBvbGRVbWFQb2ludCA9IEdyYXBoaWNhbERhdGFIZWxwZXIKLS8vCQkJCQkJCQkubmV3TW9kZWxQb2ludChvbGRwLngsIG9sZHAueSk7Ci0JCQkJCQlpZiAocG9pbnRJbmRleCA9PSBOb3RpZmljYXRpb24uTk9fSU5ERVgpIHsKLQkJCQkJCQlTeXN0ZW0ub3V0Ci0JCQkJCQkJCQkucHJpbnRsbigiSW5kZXggZm9yIGJlbmRwb2ludCBpcyAtMSwgQ2Fubm90IHNldCB0aGUgYmVuZCBwb2ludCBsb2NhdGlvbi4iKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQllZGdlLmdldFdheXBvaW50cygpLnJlbW92ZShwb2ludEluZGV4KTsKLQkJCQkJCQllZGdlLmdldFdheXBvaW50cygpLmFkZChwb2ludEluZGV4LCBuZXdVbWFQb2ludCk7Ci0JCQkJCQl9Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCX0KLQkJCQkJcmV0dXJuOwotCQkJCWNhc2UgTW9kZWxQYWNrYWdlLkxJTktfX1NPVVJDRV9FTkRfUE9JTlQ6Ci0JCQkJCXAgPSAoUG9pbnQpIG1zZy5nZXROZXdWYWx1ZSgpOwotCQkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIi5ub3RpZnlDaGFuZ2VkKCk6IG5ldyBzb3VyY2UgZW5kCi0JCQkJCS8vIHBvaW50OiAiICsgcCArICIuICIgKyBnZXRTb3VyY2UoKSk7Ci0JCQkJCWlmIChwICE9IG51bGwpIHsKLQkJCQkJCS8vIHRyYW5zbGF0ZSB0byByZWxhdGl2ZSBwb3NpdGlvbgotCQkJCQkJLy8KLQkJCQkJCS8vIHAudHJhbnNsYXRlKGdldFNvdXJjZSgpLmdldExvY2F0aW9uKCkuZ2V0TmVnYXRlZCgpKTsKLQkJCQkJCWdldFNvdXJjZUdyYXBoQ29ubmVjdG9yKCkuc2V0UG9zaXRpb24oCi0JCQkJCQkJCUdyYXBoaWNhbERhdGFIZWxwZXIubmV3TW9kZWxQb2ludChwLngsIHAueSkpOwotCQkJCQl9Ci0JCQkJCXJldHVybjsKLQkJCQljYXNlIE1vZGVsUGFja2FnZS5MSU5LX19UQVJHRVRfRU5EX1BPSU5UOgotCQkJCQlwID0gKFBvaW50KSBtc2cuZ2V0TmV3VmFsdWUoKTsKLQkJCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCIubm90aWZ5Q2hhbmdlZCgpOiBuZXcgdGFyZ2V0IGVuZAotCQkJCQkvLyBwb2ludDogIiArIHAgKyAiLiAiICsgZ2V0VGFyZ2V0KCkpOwotCQkJCQlpZiAocCAhPSBudWxsKSB7Ci0JCQkJCQkvLyB0cmFuc2xhdGUgdG8gcmVsYXRpdmUgcG9zaXRpb24KLQkJCQkJCS8vCi0JCQkJCQkvLyBwLnRyYW5zbGF0ZShMaW5rSW1wbC50aGlzLmdldFRhcmdldCgpLmdldExvY2F0aW9uKCkuZ2V0TmVnYXRlZCgpKTsKLQkJCQkJCWdldFRhcmdldEdyYXBoQ29ubmVjdG9yKCkuc2V0UG9zaXRpb24oCi0JCQkJCQkJCUdyYXBoaWNhbERhdGFIZWxwZXIubmV3TW9kZWxQb2ludChwLngsIHAueSkpOwotCQkJCQl9Ci0JCQkJCXJldHVybjsKLQkJCQljYXNlIE1vZGVsUGFja2FnZS5MSU5LX19TT1VSQ0U6Ci0JCQkJCS8vIFRPRE8KLQkJCQkJcmV0dXJuOwotCQkJCWNhc2UgTW9kZWxQYWNrYWdlLkxJTktfX1RBUkdFVDoKLQkJCQkJLy8gVE9ETwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcml2YXRlIEdyYXBoQ29ubmVjdG9yIGdldFNvdXJjZUdyYXBoQ29ubmVjdG9yKCkgewotCQlyZXR1cm4gKEdyYXBoQ29ubmVjdG9yKSAoKEdyYXBoRWRnZSkgZ2V0T2JqZWN0KCkpLmdldEFuY2hvcigpLmdldCgwKTsKLQl9Ci0KLQlwcml2YXRlIEdyYXBoQ29ubmVjdG9yIGdldFRhcmdldEdyYXBoQ29ubmVjdG9yKCkgewotCQlyZXR1cm4gKEdyYXBoQ29ubmVjdG9yKSAoKEdyYXBoRWRnZSkgZ2V0T2JqZWN0KCkpLmdldEFuY2hvcigpLmdldCgxKTsKLQl9Ci0KLX0gLy8gTGlua0ltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9pbXBsL0xpbmtlZE9iamVjdEltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9pbXBsL0xpbmtlZE9iamVjdEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2FlOTJjZi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvaW1wbC9MaW5rZWRPYmplY3RJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkxpbmtlZE9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Nb2RlbFBhY2thZ2U7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+TGlua2VkIE9iamVjdDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5MaW5rZWRPYmplY3RJbXBsI2dldExpbmtlZEVsZW1lbnQgPGVtPkxpbmtlZCBFbGVtZW50PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgTGlua2VkT2JqZWN0SW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMKLQkJTGlua2VkT2JqZWN0IHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRMaW5rZWRFbGVtZW50KCkgPGVtPkxpbmtlZCBFbGVtZW50PC9lbT59JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRMaW5rZWRFbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTWV0aG9kRWxlbWVudCBsaW5rZWRFbGVtZW50OwotCXByb3RlY3RlZCBPYmplY3Qgb2JqZWN0OwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBMaW5rZWRPYmplY3RJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIE1vZGVsUGFja2FnZS5MaXRlcmFscy5MSU5LRURfT0JKRUNUOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBNZXRob2RFbGVtZW50IGdldExpbmtlZEVsZW1lbnQoKSB7Ci0JCWlmIChsaW5rZWRFbGVtZW50ICE9IG51bGwgJiYgKChFT2JqZWN0KWxpbmtlZEVsZW1lbnQpLmVJc1Byb3h5KCkpIHsKLQkJCUludGVybmFsRU9iamVjdCBvbGRMaW5rZWRFbGVtZW50ID0gKEludGVybmFsRU9iamVjdClsaW5rZWRFbGVtZW50OwotCQkJbGlua2VkRWxlbWVudCA9IChNZXRob2RFbGVtZW50KWVSZXNvbHZlUHJveHkob2xkTGlua2VkRWxlbWVudCk7Ci0JCQlpZiAobGlua2VkRWxlbWVudCAhPSBvbGRMaW5rZWRFbGVtZW50KSB7Ci0JCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwgTW9kZWxQYWNrYWdlLkxJTktFRF9PQkpFQ1RfX0xJTktFRF9FTEVNRU5ULCBvbGRMaW5rZWRFbGVtZW50LCBsaW5rZWRFbGVtZW50KSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGxpbmtlZEVsZW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE1ldGhvZEVsZW1lbnQgYmFzaWNHZXRMaW5rZWRFbGVtZW50KCkgewotCQlyZXR1cm4gbGlua2VkRWxlbWVudDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMaW5rZWRFbGVtZW50KE1ldGhvZEVsZW1lbnQgbmV3TGlua2VkRWxlbWVudCkgewotCQlNZXRob2RFbGVtZW50IG9sZExpbmtlZEVsZW1lbnQgPSBsaW5rZWRFbGVtZW50OwotCQlsaW5rZWRFbGVtZW50ID0gbmV3TGlua2VkRWxlbWVudDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTW9kZWxQYWNrYWdlLkxJTktFRF9PQkpFQ1RfX0xJTktFRF9FTEVNRU5ULCBvbGRMaW5rZWRFbGVtZW50LCBsaW5rZWRFbGVtZW50KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBNb2RlbFBhY2thZ2UuTElOS0VEX09CSkVDVF9fTElOS0VEX0VMRU1FTlQ6Ci0JCQkJaWYgKHJlc29sdmUpIHJldHVybiBnZXRMaW5rZWRFbGVtZW50KCk7Ci0JCQkJcmV0dXJuIGJhc2ljR2V0TGlua2VkRWxlbWVudCgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5MSU5LRURfT0JKRUNUX19MSU5LRURfRUxFTUVOVDoKLQkJCQlzZXRMaW5rZWRFbGVtZW50KChNZXRob2RFbGVtZW50KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBNb2RlbFBhY2thZ2UuTElOS0VEX09CSkVDVF9fTElOS0VEX0VMRU1FTlQ6Ci0JCQkJc2V0TGlua2VkRWxlbWVudCgoTWV0aG9kRWxlbWVudCludWxsKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgTW9kZWxQYWNrYWdlLkxJTktFRF9PQkpFQ1RfX0xJTktFRF9FTEVNRU5UOgotCQkJCXJldHVybiBsaW5rZWRFbGVtZW50ICE9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQkKLQlwdWJsaWMgT2JqZWN0IGdldE9iamVjdCgpIHsKLQkJcmV0dXJuIG9iamVjdDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0T2JqZWN0KE9iamVjdCBuZXdPYmplY3QpIHsKLQkJdGhpcy5vYmplY3QgPSBuZXdPYmplY3Q7Ci0JfQotCi19IC8vIExpbmtlZE9iamVjdEltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9pbXBsL01vZGVsRmFjdG9yeUltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9pbXBsL01vZGVsRmFjdG9yeUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2FjNDRhYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvaW1wbC9Nb2RlbEZhY3RvcnlJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMzUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5BYnNvbHV0ZUJlbmRwb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRURhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucGx1Z2luLkVjb3JlUGx1Z2luOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkFjdGl2aXR5RGV0YWlsRGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5BY3Rpdml0eURpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuRGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5MaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk1vZGVsRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Nb2RlbFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTmFtZWROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLlJvbGVOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLlJvbGVUYXNrQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLlRhc2tOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLlR5cGVkTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Xb3JrQnJlYWtkb3duRWxlbWVudE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuV29ya1Byb2R1Y3RDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Xb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLldvcmtQcm9kdWN0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdG9yOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIDxiPkZhY3Rvcnk8L2I+LiA8IS0tCi0gKiBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBNb2RlbEZhY3RvcnlJbXBsIGV4dGVuZHMgRUZhY3RvcnlJbXBsIGltcGxlbWVudHMgTW9kZWxGYWN0b3J5IHsKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBkZWZhdWx0IGZhY3RvcnkgaW1wbGVtZW50YXRpb24uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBNb2RlbEZhY3RvcnkgaW5pdCgpIHsKLQkJdHJ5IHsKLQkJCU1vZGVsRmFjdG9yeSB0aGVNb2RlbEZhY3RvcnkgPSAoTW9kZWxGYWN0b3J5KUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVGYWN0b3J5KCJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi9kaWFncmFtLzEuMC4wL2RpYWdyYW0uZWNvcmUiKTsgLy8kTk9OLU5MUy0xJCAKLQkJCWlmICh0aGVNb2RlbEZhY3RvcnkgIT0gbnVsbCkgewotCQkJCXJldHVybiB0aGVNb2RlbEZhY3Rvcnk7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLQkJCUVjb3JlUGx1Z2luLklOU1RBTkNFLmxvZyhleGNlcHRpb24pOwotCQl9Ci0JCXJldHVybiBuZXcgTW9kZWxGYWN0b3J5SW1wbCgpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGZhY3RvcnkuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE1vZGVsRmFjdG9yeUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBFT2JqZWN0IGNyZWF0ZShFQ2xhc3MgZUNsYXNzKSB7Ci0JCXN3aXRjaCAoZUNsYXNzLmdldENsYXNzaWZpZXJJRCgpKSB7Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5ESUFHUkFNOiByZXR1cm4gY3JlYXRlRGlhZ3JhbSgpOwotCQkJY2FzZSBNb2RlbFBhY2thZ2UuTElOSzogcmV0dXJuIGNyZWF0ZUxpbmsoKTsKLQkJCWNhc2UgTW9kZWxQYWNrYWdlLk5BTUVEX05PREU6IHJldHVybiBjcmVhdGVOYW1lZE5vZGUoKTsKLQkJCWNhc2UgTW9kZWxQYWNrYWdlLkFDVElWSVRZX0RJQUdSQU06IHJldHVybiBjcmVhdGVBY3Rpdml0eURpYWdyYW0oKTsKLQkJCWNhc2UgTW9kZWxQYWNrYWdlLlRZUEVEX05PREU6IHJldHVybiBjcmVhdGVUeXBlZE5vZGUoKTsKLQkJCWNhc2UgTW9kZWxQYWNrYWdlLldPUktfUFJPRFVDVF9ERVBFTkRFTkNZX0RJQUdSQU06IHJldHVybiBjcmVhdGVXb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtKCk7Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5XT1JLX1BST0RVQ1RfTk9ERTogcmV0dXJuIGNyZWF0ZVdvcmtQcm9kdWN0Tm9kZSgpOwotCQkJY2FzZSBNb2RlbFBhY2thZ2UuQUNUSVZJVFlfREVUQUlMX0RJQUdSQU06IHJldHVybiBjcmVhdGVBY3Rpdml0eURldGFpbERpYWdyYW0oKTsKLQkJCWNhc2UgTW9kZWxQYWNrYWdlLlJPTEVfTk9ERTogcmV0dXJuIGNyZWF0ZVJvbGVOb2RlKCk7Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5ST0xFX1RBU0tfQ09NUE9TSVRFOiByZXR1cm4gY3JlYXRlUm9sZVRhc2tDb21wb3NpdGUoKTsKLQkJCWNhc2UgTW9kZWxQYWNrYWdlLlRBU0tfTk9ERTogcmV0dXJuIGNyZWF0ZVRhc2tOb2RlKCk7Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9OT0RFOiByZXR1cm4gY3JlYXRlV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZSgpOwotCQkJY2FzZSBNb2RlbFBhY2thZ2UuV09SS19CUkVBS0RPV05fRUxFTUVOVF9OT0RFOiByZXR1cm4gY3JlYXRlV29ya0JyZWFrZG93bkVsZW1lbnROb2RlKCk7Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5XT1JLX1BST0RVQ1RfQ09NUE9TSVRFOiByZXR1cm4gY3JlYXRlV29ya1Byb2R1Y3RDb21wb3NpdGUoKTsKLQkJCWRlZmF1bHQ6Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIGNsYXNzICciICsgZUNsYXNzLmdldE5hbWUoKSArICInIGlzIG5vdCBhIHZhbGlkIGNsYXNzaWZpZXIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBjcmVhdGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJc3dpdGNoIChlRGF0YVR5cGUuZ2V0Q2xhc3NpZmllcklEKCkpIHsKLQkJCWNhc2UgTW9kZWxQYWNrYWdlLkFCU09MVVRFX0JFTkRQT0lOVDoKLQkJCQlyZXR1cm4gY3JlYXRlQWJzb2x1dGVCZW5kcG9pbnRGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWNhc2UgTW9kZWxQYWNrYWdlLlBPSU5UOgotCQkJCXJldHVybiBjcmVhdGVQb2ludEZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBNb2RlbFBhY2thZ2UuUk9MRV9ERVNDUklQVE9SOgotCQkJCXJldHVybiBjcmVhdGVSb2xlRGVzY3JpcHRvckZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJZGVmYXVsdDoKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgZGF0YXR5cGUgJyIgKyBlRGF0YVR5cGUuZ2V0TmFtZSgpICsgIicgaXMgbm90IGEgdmFsaWQgY2xhc3NpZmllciIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlzd2l0Y2ggKGVEYXRhVHlwZS5nZXRDbGFzc2lmaWVySUQoKSkgewotCQkJY2FzZSBNb2RlbFBhY2thZ2UuQUJTT0xVVEVfQkVORFBPSU5UOgotCQkJCXJldHVybiBjb252ZXJ0QWJzb2x1dGVCZW5kcG9pbnRUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBNb2RlbFBhY2thZ2UuUE9JTlQ6Ci0JCQkJcmV0dXJuIGNvbnZlcnRQb2ludFRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5ST0xFX0RFU0NSSVBUT1I6Ci0JCQkJcmV0dXJuIGNvbnZlcnRSb2xlRGVzY3JpcHRvclRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQlkZWZhdWx0OgotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBkYXRhdHlwZSAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyBpcyBub3QgYSB2YWxpZCBjbGFzc2lmaWVyIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEaWFncmFtIGNyZWF0ZURpYWdyYW0oKSB7Ci0JCURpYWdyYW1JbXBsIGRpYWdyYW0gPSBuZXcgRGlhZ3JhbUltcGwoKTsKLQkJcmV0dXJuIGRpYWdyYW07Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaW5rIGNyZWF0ZUxpbmsoKSB7Ci0JCUxpbmtJbXBsIGxpbmsgPSBuZXcgTGlua0ltcGwoKTsKLQkJcmV0dXJuIGxpbms7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOYW1lZE5vZGUgY3JlYXRlTmFtZWROb2RlKCkgewotCQlOYW1lZE5vZGVJbXBsIG5hbWVkTm9kZSA9IG5ldyBOYW1lZE5vZGVJbXBsKCk7Ci0JCXJldHVybiBuYW1lZE5vZGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBY3Rpdml0eURpYWdyYW0gY3JlYXRlQWN0aXZpdHlEaWFncmFtKCkgewotCQlBY3Rpdml0eURpYWdyYW1JbXBsIGFjdGl2aXR5RGlhZ3JhbSA9IG5ldyBBY3Rpdml0eURpYWdyYW1JbXBsKCk7Ci0JCXJldHVybiBhY3Rpdml0eURpYWdyYW07Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUeXBlZE5vZGUgY3JlYXRlVHlwZWROb2RlKCkgewotCQlUeXBlZE5vZGVJbXBsIHR5cGVkTm9kZSA9IG5ldyBUeXBlZE5vZGVJbXBsKCk7Ci0JCXJldHVybiB0eXBlZE5vZGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBXb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtIGNyZWF0ZVdvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW0oKSB7Ci0JCVdvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW1JbXBsIHdvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW0gPSBuZXcgV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbUltcGwoKTsKLQkJcmV0dXJuIHdvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW07Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBXb3JrUHJvZHVjdE5vZGUgY3JlYXRlV29ya1Byb2R1Y3ROb2RlKCkgewotCQlXb3JrUHJvZHVjdE5vZGVJbXBsIHdvcmtQcm9kdWN0Tm9kZSA9IG5ldyBXb3JrUHJvZHVjdE5vZGVJbXBsKCk7Ci0JCXJldHVybiB3b3JrUHJvZHVjdE5vZGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBY3Rpdml0eURldGFpbERpYWdyYW0gY3JlYXRlQWN0aXZpdHlEZXRhaWxEaWFncmFtKCkgewotCQlBY3Rpdml0eURldGFpbERpYWdyYW1JbXBsIGFjdGl2aXR5RGV0YWlsRGlhZ3JhbSA9IG5ldyBBY3Rpdml0eURldGFpbERpYWdyYW1JbXBsKCk7Ci0JCXJldHVybiBhY3Rpdml0eURldGFpbERpYWdyYW07Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSb2xlTm9kZSBjcmVhdGVSb2xlTm9kZSgpIHsKLQkJUm9sZU5vZGVJbXBsIHJvbGVOb2RlID0gbmV3IFJvbGVOb2RlSW1wbCgpOwotCQlyZXR1cm4gcm9sZU5vZGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSb2xlVGFza0NvbXBvc2l0ZSBjcmVhdGVSb2xlVGFza0NvbXBvc2l0ZSgpIHsKLQkJUm9sZVRhc2tDb21wb3NpdGVJbXBsIHJvbGVUYXNrQ29tcG9zaXRlID0gbmV3IFJvbGVUYXNrQ29tcG9zaXRlSW1wbCgpOwotCQlyZXR1cm4gcm9sZVRhc2tDb21wb3NpdGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUYXNrTm9kZSBjcmVhdGVUYXNrTm9kZSgpIHsKLQkJVGFza05vZGVJbXBsIHRhc2tOb2RlID0gbmV3IFRhc2tOb2RlSW1wbCgpOwotCQlyZXR1cm4gdGFza05vZGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlIGNyZWF0ZVdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGUoKSB7Ci0JCVdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVJbXBsIHdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGUgPSBuZXcgV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZUltcGwoKTsKLQkJcmV0dXJuIHdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBXb3JrQnJlYWtkb3duRWxlbWVudE5vZGUgY3JlYXRlV29ya0JyZWFrZG93bkVsZW1lbnROb2RlKCkgewotCQlXb3JrQnJlYWtkb3duRWxlbWVudE5vZGVJbXBsIHdvcmtCcmVha2Rvd25FbGVtZW50Tm9kZSA9IG5ldyBXb3JrQnJlYWtkb3duRWxlbWVudE5vZGVJbXBsKCk7Ci0JCXJldHVybiB3b3JrQnJlYWtkb3duRWxlbWVudE5vZGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBXb3JrUHJvZHVjdENvbXBvc2l0ZSBjcmVhdGVXb3JrUHJvZHVjdENvbXBvc2l0ZSgpIHsKLQkJV29ya1Byb2R1Y3RDb21wb3NpdGVJbXBsIHdvcmtQcm9kdWN0Q29tcG9zaXRlID0gbmV3IFdvcmtQcm9kdWN0Q29tcG9zaXRlSW1wbCgpOwotCQlyZXR1cm4gd29ya1Byb2R1Y3RDb21wb3NpdGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBYnNvbHV0ZUJlbmRwb2ludCBjcmVhdGVBYnNvbHV0ZUJlbmRwb2ludEZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlyZXR1cm4gKEFic29sdXRlQmVuZHBvaW50KXN1cGVyLmNyZWF0ZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRBYnNvbHV0ZUJlbmRwb2ludFRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsCi0JCQlPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gc3VwZXIuY29udmVydFRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQb2ludCBjcmVhdGVQb2ludEZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlyZXR1cm4gKFBvaW50KXN1cGVyLmNyZWF0ZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRQb2ludFRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBzdXBlci5jb252ZXJ0VG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJvbGVEZXNjcmlwdG9yIGNyZWF0ZVJvbGVEZXNjcmlwdG9yRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoUm9sZURlc2NyaXB0b3Ipc3VwZXIuY3JlYXRlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydFJvbGVEZXNjcmlwdG9yVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwKLQkJCU9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBzdXBlci5jb252ZXJ0VG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE1vZGVsUGFja2FnZSBnZXRNb2RlbFBhY2thZ2UoKSB7Ci0JCXJldHVybiAoTW9kZWxQYWNrYWdlKWdldEVQYWNrYWdlKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGRlcHJlY2F0ZWQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQERlcHJlY2F0ZWQKLQlwdWJsaWMgc3RhdGljIE1vZGVsUGFja2FnZSBnZXRQYWNrYWdlKCkgewotCQlyZXR1cm4gTW9kZWxQYWNrYWdlLmVJTlNUQU5DRTsKLQl9Ci0KLX0gLy8gTW9kZWxGYWN0b3J5SW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL2ltcGwvTW9kZWxQYWNrYWdlSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL2ltcGwvTW9kZWxQYWNrYWdlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ODZmYWVkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9pbXBsL01vZGVsUGFja2FnZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc3MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkFic29sdXRlQmVuZHBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVQYWNrYWdlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5BY3Rpdml0eURldGFpbERpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuQWN0aXZpdHlEaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkRpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5MaW5rZWRPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTW9kZWxGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk1vZGVsUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5OYW1lZE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLlJvbGVOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLlJvbGVUYXNrQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLlRhc2tOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLlR5cGVkTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Xb3JrQnJlYWtkb3duRWxlbWVudE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuV29ya1Byb2R1Y3RDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Xb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLldvcmtQcm9kdWN0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdG9yOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIDxiPlBhY2thZ2U8L2I+LiA8IS0tCi0gKiBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBNb2RlbFBhY2thZ2VJbXBsIGV4dGVuZHMgRVBhY2thZ2VJbXBsIGltcGxlbWVudHMgTW9kZWxQYWNrYWdlIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgZGlhZ3JhbUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgbGlua0VDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgbGlua2VkT2JqZWN0RUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBuYW1lZE5vZGVFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIG5vZGVFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGFjdGl2aXR5RGlhZ3JhbUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgdHlwZWROb2RlRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB3b3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB3b3JrUHJvZHVjdE5vZGVFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3Mgbm9kZUNvbnRhaW5lckVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3Mgcm9sZU5vZGVFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHJvbGVUYXNrQ29tcG9zaXRlRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB0YXNrTm9kZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3Mgd29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3Mgd29ya0JyZWFrZG93bkVsZW1lbnROb2RlRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB3b3JrUHJvZHVjdENvbXBvc2l0ZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgYWJzb2x1dGVCZW5kcG9pbnRFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIHBvaW50RURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSByb2xlRGVzY3JpcHRvckVEYXRhVHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBtb2RlbCA8Yj5QYWNrYWdlPC9iPiwgcmVnaXN0ZXJlZCB3aXRoCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZS5SZWdpc3RyeSBFUGFja2FnZS5SZWdpc3RyeX0gYnkgdGhlCi0JICogcGFja2FnZSBwYWNrYWdlIFVSSSB2YWx1ZS4KLQkgKiA8cD4KLQkgKiBOb3RlOiB0aGUgY29ycmVjdCB3YXkgdG8gY3JlYXRlIHRoZSBwYWNrYWdlIGlzIHZpYSB0aGUgc3RhdGljIGZhY3RvcnkKLQkgKiBtZXRob2Qge0BsaW5rICNpbml0IGluaXQoKX0sIHdoaWNoIGFsc28gcGVyZm9ybXMgaW5pdGlhbGl6YXRpb24gb2YgdGhlCi0JICogcGFja2FnZSwgb3IgcmV0dXJucyB0aGUgcmVnaXN0ZXJlZCBwYWNrYWdlLCBpZiBvbmUgYWxyZWFkeSBleGlzdHMuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2UuUmVnaXN0cnkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk1vZGVsUGFja2FnZSNlTlNfVVJJCi0JICogQHNlZSAjaW5pdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgTW9kZWxQYWNrYWdlSW1wbCgpIHsKLQkJc3VwZXIoZU5TX1VSSSwgTW9kZWxGYWN0b3J5LmVJTlNUQU5DRSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNJbml0ZWQgPSBmYWxzZTsKLQotCS8qKgotCSAqIENyZWF0ZXMsIHJlZ2lzdGVycywgYW5kIGluaXRpYWxpemVzIHRoZSA8Yj5QYWNrYWdlPC9iPiBmb3IgdGhpcwotCSAqIG1vZGVsLCBhbmQgZm9yIGFueSBvdGhlcnMgdXBvbiB3aGljaCBpdCBkZXBlbmRzLiAgU2ltcGxlCi0JICogZGVwZW5kZW5jaWVzIGFyZSBzYXRpc2ZpZWQgYnkgY2FsbGluZyB0aGlzIG1ldGhvZCBvbiBhbGwKLQkgKiBkZXBlbmRlbnQgcGFja2FnZXMgYmVmb3JlIGRvaW5nIGFueXRoaW5nIGVsc2UuICBUaGlzIG1ldGhvZCBkcml2ZXMKLQkgKiBpbml0aWFsaXphdGlvbiBmb3IgaW50ZXJkZXBlbmRlbnQgcGFja2FnZXMgZGlyZWN0bHksIGluIHBhcmFsbGVsCi0JICogd2l0aCB0aGlzIHBhY2thZ2UsIGl0c2VsZi4KLQkgKiA8cD5PZiB0aGlzIHBhY2thZ2UgYW5kIGl0cyBpbnRlcmRlcGVuZGVuY2llcywgYWxsIHBhY2thZ2VzIHdoaWNoCi0JICogaGF2ZSBub3QgeWV0IGJlZW4gcmVnaXN0ZXJlZCBieSB0aGVpciBVUkkgdmFsdWVzIGFyZSBmaXJzdCBjcmVhdGVkCi0JICogYW5kIHJlZ2lzdGVyZWQuICBUaGUgcGFja2FnZXMgYXJlIHRoZW4gaW5pdGlhbGl6ZWQgaW4gdHdvIHN0ZXBzOgotCSAqIG1ldGEtbW9kZWwgb2JqZWN0cyBmb3IgYWxsIG9mIHRoZSBwYWNrYWdlcyBhcmUgY3JlYXRlZCBiZWZvcmUgYW55Ci0JICogYXJlIGluaXRpYWxpemVkLCBzaW5jZSBvbmUgcGFja2FnZSdzIG1ldGEtbW9kZWwgb2JqZWN0cyBtYXkgcmVmZXIgdG8KLQkgKiB0aG9zZSBvZiBhbm90aGVyLgotCSAqIDxwPkludm9jYXRpb24gb2YgdGhpcyBtZXRob2Qgd2lsbCBub3QgYWZmZWN0IGFueSBwYWNrYWdlcyB0aGF0IGhhdmUKLQkgKiBhbHJlYWR5IGJlZW4gaW5pdGlhbGl6ZWQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZU5TX1VSSQotCSAqIEBzZWUgI2NyZWF0ZVBhY2thZ2VDb250ZW50cygpCi0JICogQHNlZSAjaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgTW9kZWxQYWNrYWdlIGluaXQoKSB7Ci0JCWlmIChpc0luaXRlZCkgcmV0dXJuIChNb2RlbFBhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTW9kZWxQYWNrYWdlLmVOU19VUkkpOwotCi0JCS8vIE9idGFpbiBvciBjcmVhdGUgYW5kIHJlZ2lzdGVyIHBhY2thZ2UKLQkJTW9kZWxQYWNrYWdlSW1wbCB0aGVNb2RlbFBhY2thZ2UgPSAoTW9kZWxQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoZU5TX1VSSSkgaW5zdGFuY2VvZiBNb2RlbFBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoZU5TX1VSSSkgOiBuZXcgTW9kZWxQYWNrYWdlSW1wbCgpKTsKLQotCQlpc0luaXRlZCA9IHRydWU7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBzaW1wbGUgZGVwZW5kZW5jaWVzCi0JCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmVDbGFzcygpOwotCi0JCS8vIENyZWF0ZSBwYWNrYWdlIG1ldGEtZGF0YSBvYmplY3RzCi0JCXRoZU1vZGVsUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQotCQkvLyBJbml0aWFsaXplIGNyZWF0ZWQgbWV0YS1kYXRhCi0JCXRoZU1vZGVsUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0KLQkJLy8gTWFyayBtZXRhLWRhdGEgdG8gaW5kaWNhdGUgaXQgY2FuJ3QgYmUgY2hhbmdlZAotCQl0aGVNb2RlbFBhY2thZ2UuZnJlZXplKCk7Ci0KLQkJcmV0dXJuIHRoZU1vZGVsUGFja2FnZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXREaWFncmFtKCkgewotCQlyZXR1cm4gZGlhZ3JhbUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRMaW5rKCkgewotCQlyZXR1cm4gbGlua0VDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRMaW5rX05hbWUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlsaW5rRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldExpbmtfU291cmNlKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpbGlua0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRMaW5rX1RhcmdldCgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWxpbmtFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0TGlua19CZW5kcG9pbnRzKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpbGlua0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRMaW5rX1NvdXJjZUVuZFBvaW50KCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpbGlua0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRMaW5rX1RhcmdldEVuZFBvaW50KCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpbGlua0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldExpbmtlZE9iamVjdCgpIHsKLQkJcmV0dXJuIGxpbmtlZE9iamVjdEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRMaW5rZWRPYmplY3RfTGlua2VkRWxlbWVudCgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWxpbmtlZE9iamVjdEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldE5hbWVkTm9kZSgpIHsKLQkJcmV0dXJuIG5hbWVkTm9kZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0TmFtZWROb2RlX05hbWUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSluYW1lZE5vZGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXROb2RlKCkgewotCQlyZXR1cm4gbm9kZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0Tm9kZV9Mb2NhdGlvbigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKW5vZGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0Tm9kZV9XaWR0aCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKW5vZGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0Tm9kZV9IZWlnaHQoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlub2RlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldE5vZGVfSW5jb21pbmdDb25uZWN0aW9ucygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKW5vZGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0Tm9kZV9PdXRnb2luZ0Nvbm5lY3Rpb25zKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2Upbm9kZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXROb2RlX1JlYWRPbmx5KCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpbm9kZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldEFjdGl2aXR5RGlhZ3JhbSgpIHsKLQkJcmV0dXJuIGFjdGl2aXR5RGlhZ3JhbUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRUeXBlZE5vZGUoKSB7Ci0JCXJldHVybiB0eXBlZE5vZGVFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFR5cGVkTm9kZV9UeXBlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpdHlwZWROb2RlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0V29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbSgpIHsKLQkJcmV0dXJuIHdvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW1FQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0V29ya1Byb2R1Y3ROb2RlKCkgewotCQlyZXR1cm4gd29ya1Byb2R1Y3ROb2RlRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRXb3JrUHJvZHVjdE5vZGVfVHlwZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXdvcmtQcm9kdWN0Tm9kZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldEFjdGl2aXR5RGV0YWlsRGlhZ3JhbSgpIHsKLQkJcmV0dXJuIGFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBY3Rpdml0eURldGFpbERpYWdyYW1fQXV0b0xheW91dCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldE5vZGVDb250YWluZXIoKSB7Ci0JCXJldHVybiBub2RlQ29udGFpbmVyRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXROb2RlQ29udGFpbmVyX05vZGVzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2Upbm9kZUNvbnRhaW5lckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFJvbGVOb2RlKCkgewotCQlyZXR1cm4gcm9sZU5vZGVFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0Um9sZVRhc2tDb21wb3NpdGUoKSB7Ci0JCXJldHVybiByb2xlVGFza0NvbXBvc2l0ZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRSb2xlVGFza0NvbXBvc2l0ZV9Sb3dJbmRleCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXJvbGVUYXNrQ29tcG9zaXRlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0VGFza05vZGUoKSB7Ci0JCXJldHVybiB0YXNrTm9kZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrTm9kZV9JbmRleCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXRhc2tOb2RlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZSgpIHsKLQkJcmV0dXJuIHdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0V29ya0JyZWFrZG93bkVsZW1lbnROb2RlKCkgewotCQlyZXR1cm4gd29ya0JyZWFrZG93bkVsZW1lbnROb2RlRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFdvcmtQcm9kdWN0Q29tcG9zaXRlKCkgewotCQlyZXR1cm4gd29ya1Byb2R1Y3RDb21wb3NpdGVFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFdvcmtQcm9kdWN0Q29tcG9zaXRlX1R5cGUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl3b3JrUHJvZHVjdENvbXBvc2l0ZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldEFic29sdXRlQmVuZHBvaW50KCkgewotCQlyZXR1cm4gYWJzb2x1dGVCZW5kcG9pbnRFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0UG9pbnQoKSB7Ci0JCXJldHVybiBwb2ludEVEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXRSb2xlRGVzY3JpcHRvcigpIHsKLQkJcmV0dXJuIHJvbGVEZXNjcmlwdG9yRURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTW9kZWxGYWN0b3J5IGdldE1vZGVsRmFjdG9yeSgpIHsKLQkJcmV0dXJuIChNb2RlbEZhY3RvcnkpZ2V0RUZhY3RvcnlJbnN0YW5jZSgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNDcmVhdGVkID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBtZXRhLW1vZGVsIG9iamVjdHMgZm9yIHRoZSBwYWNrYWdlLiAgVGhpcyBtZXRob2QgaXMKLQkgKiBndWFyZGVkIHRvIGhhdmUgbm8gYWZmZWN0IG9uIGFueSBpbnZvY2F0aW9uIGJ1dCBpdHMgZmlyc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlUGFja2FnZUNvbnRlbnRzKCkgewotCQlpZiAoaXNDcmVhdGVkKSByZXR1cm47Ci0JCWlzQ3JlYXRlZCA9IHRydWU7Ci0KLQkJLy8gQ3JlYXRlIGNsYXNzZXMgYW5kIHRoZWlyIGZlYXR1cmVzCi0JCWRpYWdyYW1FQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoRElBR1JBTSk7Ci0KLQkJbGlua0VDbGFzcyA9IGNyZWF0ZUVDbGFzcyhMSU5LKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShsaW5rRUNsYXNzLCBMSU5LX19OQU1FKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShsaW5rRUNsYXNzLCBMSU5LX19TT1VSQ0UpOwotCQljcmVhdGVFUmVmZXJlbmNlKGxpbmtFQ2xhc3MsIExJTktfX1RBUkdFVCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUobGlua0VDbGFzcywgTElOS19fQkVORFBPSU5UUyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUobGlua0VDbGFzcywgTElOS19fU09VUkNFX0VORF9QT0lOVCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUobGlua0VDbGFzcywgTElOS19fVEFSR0VUX0VORF9QT0lOVCk7Ci0KLQkJbGlua2VkT2JqZWN0RUNsYXNzID0gY3JlYXRlRUNsYXNzKExJTktFRF9PQkpFQ1QpOwotCQljcmVhdGVFUmVmZXJlbmNlKGxpbmtlZE9iamVjdEVDbGFzcywgTElOS0VEX09CSkVDVF9fTElOS0VEX0VMRU1FTlQpOwotCi0JCW5hbWVkTm9kZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhOQU1FRF9OT0RFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShuYW1lZE5vZGVFQ2xhc3MsIE5BTUVEX05PREVfX05BTUUpOwotCi0JCW5vZGVFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoTk9ERSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUobm9kZUVDbGFzcywgTk9ERV9fTE9DQVRJT04pOwotCQljcmVhdGVFQXR0cmlidXRlKG5vZGVFQ2xhc3MsIE5PREVfX1dJRFRIKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShub2RlRUNsYXNzLCBOT0RFX19IRUlHSFQpOwotCQljcmVhdGVFUmVmZXJlbmNlKG5vZGVFQ2xhc3MsIE5PREVfX0lOQ09NSU5HX0NPTk5FQ1RJT05TKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShub2RlRUNsYXNzLCBOT0RFX19PVVRHT0lOR19DT05ORUNUSU9OUyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUobm9kZUVDbGFzcywgTk9ERV9fUkVBRF9PTkxZKTsKLQotCQlhY3Rpdml0eURpYWdyYW1FQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoQUNUSVZJVFlfRElBR1JBTSk7Ci0KLQkJdHlwZWROb2RlRUNsYXNzID0gY3JlYXRlRUNsYXNzKFRZUEVEX05PREUpOwotCQljcmVhdGVFQXR0cmlidXRlKHR5cGVkTm9kZUVDbGFzcywgVFlQRURfTk9ERV9fVFlQRSk7Ci0KLQkJd29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhXT1JLX1BST0RVQ1RfREVQRU5ERU5DWV9ESUFHUkFNKTsKLQotCQl3b3JrUHJvZHVjdE5vZGVFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoV09SS19QUk9EVUNUX05PREUpOwotCQljcmVhdGVFQXR0cmlidXRlKHdvcmtQcm9kdWN0Tm9kZUVDbGFzcywgV09SS19QUk9EVUNUX05PREVfX1RZUEUpOwotCi0JCWFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhBQ1RJVklUWV9ERVRBSUxfRElBR1JBTSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoYWN0aXZpdHlEZXRhaWxEaWFncmFtRUNsYXNzLCBBQ1RJVklUWV9ERVRBSUxfRElBR1JBTV9fQVVUT19MQVlPVVQpOwotCi0JCW5vZGVDb250YWluZXJFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoTk9ERV9DT05UQUlORVIpOwotCQljcmVhdGVFUmVmZXJlbmNlKG5vZGVDb250YWluZXJFQ2xhc3MsIE5PREVfQ09OVEFJTkVSX19OT0RFUyk7Ci0KLQkJcm9sZU5vZGVFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUk9MRV9OT0RFKTsKLQotCQlyb2xlVGFza0NvbXBvc2l0ZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhST0xFX1RBU0tfQ09NUE9TSVRFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShyb2xlVGFza0NvbXBvc2l0ZUVDbGFzcywgUk9MRV9UQVNLX0NPTVBPU0lURV9fUk9XX0lOREVYKTsKLQotCQl0YXNrTm9kZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhUQVNLX05PREUpOwotCQljcmVhdGVFQXR0cmlidXRlKHRhc2tOb2RlRUNsYXNzLCBUQVNLX05PREVfX0lOREVYKTsKLQotCQl3b3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlRUNsYXNzID0gY3JlYXRlRUNsYXNzKFdPUktfUFJPRFVDVF9ERVNDUklQVE9SX05PREUpOwotCi0JCXdvcmtCcmVha2Rvd25FbGVtZW50Tm9kZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX05PREUpOwotCi0JCXdvcmtQcm9kdWN0Q29tcG9zaXRlRUNsYXNzID0gY3JlYXRlRUNsYXNzKFdPUktfUFJPRFVDVF9DT01QT1NJVEUpOwotCQljcmVhdGVFQXR0cmlidXRlKHdvcmtQcm9kdWN0Q29tcG9zaXRlRUNsYXNzLCBXT1JLX1BST0RVQ1RfQ09NUE9TSVRFX19UWVBFKTsKLQotCQkvLyBDcmVhdGUgZGF0YSB0eXBlcwotCQlhYnNvbHV0ZUJlbmRwb2ludEVEYXRhVHlwZSA9IGNyZWF0ZUVEYXRhVHlwZShBQlNPTFVURV9CRU5EUE9JTlQpOwotCQlwb2ludEVEYXRhVHlwZSA9IGNyZWF0ZUVEYXRhVHlwZShQT0lOVCk7Ci0JCXJvbGVEZXNjcmlwdG9yRURhdGFUeXBlID0gY3JlYXRlRURhdGFUeXBlKFJPTEVfREVTQ1JJUFRPUik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc0luaXRpYWxpemVkID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBDb21wbGV0ZSB0aGUgaW5pdGlhbGl6YXRpb24gb2YgdGhlIHBhY2thZ2UgYW5kIGl0cyBtZXRhLW1vZGVsLiBUaGlzCi0JICogbWV0aG9kIGlzIGd1YXJkZWQgdG8gaGF2ZSBubyBhZmZlY3Qgb24gYW55IGludm9jYXRpb24gYnV0IGl0cyBmaXJzdC4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpIHsKLQkJaWYgKGlzSW5pdGlhbGl6ZWQpIHJldHVybjsKLQkJaXNJbml0aWFsaXplZCA9IHRydWU7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBwYWNrYWdlCi0JCXNldE5hbWUoZU5BTUUpOwotCQlzZXROc1ByZWZpeChlTlNfUFJFRklYKTsKLQkJc2V0TnNVUkkoZU5TX1VSSSk7Ci0KLQkJLy8gT2J0YWluIG90aGVyIGRlcGVuZGVudCBwYWNrYWdlcwotCQlVbWFQYWNrYWdlIHRoZVVtYVBhY2thZ2UgPSAoVW1hUGFja2FnZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShVbWFQYWNrYWdlLmVOU19VUkkpOwotCi0JCS8vIENyZWF0ZSB0eXBlIHBhcmFtZXRlcnMKLQotCQkvLyBTZXQgYm91bmRzIGZvciB0eXBlIHBhcmFtZXRlcnMKLQotCQkvLyBBZGQgc3VwZXJ0eXBlcyB0byBjbGFzc2VzCi0JCWRpYWdyYW1FQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXROb2RlQ29udGFpbmVyKCkpOwotCQlsaW5rRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0TGlua2VkT2JqZWN0KCkpOwotCQluYW1lZE5vZGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXROb2RlKCkpOwotCQlub2RlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0TGlua2VkT2JqZWN0KCkpOwotCQlhY3Rpdml0eURpYWdyYW1FQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXREaWFncmFtKCkpOwotCQl0eXBlZE5vZGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXROb2RlKCkpOwotCQl3b3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0RGlhZ3JhbSgpKTsKLQkJd29ya1Byb2R1Y3ROb2RlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0TmFtZWROb2RlKCkpOwotCQlhY3Rpdml0eURldGFpbERpYWdyYW1FQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXREaWFncmFtKCkpOwotCQlub2RlQ29udGFpbmVyRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0Tm9kZSgpKTsKLQkJcm9sZU5vZGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXROYW1lZE5vZGUoKSk7Ci0JCXJvbGVUYXNrQ29tcG9zaXRlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0Tm9kZUNvbnRhaW5lcigpKTsKLQkJdGFza05vZGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXROYW1lZE5vZGUoKSk7Ci0JCXdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXROYW1lZE5vZGUoKSk7Ci0JCXdvcmtCcmVha2Rvd25FbGVtZW50Tm9kZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldE5hbWVkTm9kZSgpKTsKLQkJd29ya1Byb2R1Y3RDb21wb3NpdGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXROb2RlQ29udGFpbmVyKCkpOwotCi0JCS8vIEluaXRpYWxpemUgY2xhc3NlcyBhbmQgZmVhdHVyZXM7IGFkZCBvcGVyYXRpb25zIGFuZCBwYXJhbWV0ZXJzCi0JCWluaXRFQ2xhc3MoZGlhZ3JhbUVDbGFzcywgRGlhZ3JhbS5jbGFzcywgIkRpYWdyYW0iLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKGxpbmtFQ2xhc3MsIExpbmsuY2xhc3MsICJMaW5rIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldExpbmtfTmFtZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAibmFtZSIsICIiLCAwLCAxLCBMaW5rLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0TGlua19Tb3VyY2UoKSwgdGhpcy5nZXROb2RlKCksIHRoaXMuZ2V0Tm9kZV9PdXRnb2luZ0Nvbm5lY3Rpb25zKCksICJzb3VyY2UiLCBudWxsLCAwLCAxLCBMaW5rLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRMaW5rX1RhcmdldCgpLCB0aGlzLmdldE5vZGUoKSwgdGhpcy5nZXROb2RlX0luY29taW5nQ29ubmVjdGlvbnMoKSwgInRhcmdldCIsIG51bGwsIDAsIDEsIExpbmsuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TGlua19CZW5kcG9pbnRzKCksIHRoaXMuZ2V0QWJzb2x1dGVCZW5kcG9pbnQoKSwgImJlbmRwb2ludHMiLCBudWxsLCAwLCAtMSwgTGluay5jbGFzcywgSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldExpbmtfU291cmNlRW5kUG9pbnQoKSwgdGhpcy5nZXRQb2ludCgpLCAic291cmNlRW5kUG9pbnQiLCBudWxsLCAwLCAxLCBMaW5rLmNsYXNzLCBJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TGlua19UYXJnZXRFbmRQb2ludCgpLCB0aGlzLmdldFBvaW50KCksICJ0YXJnZXRFbmRQb2ludCIsIG51bGwsIDAsIDEsIExpbmsuY2xhc3MsIElTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MobGlua2VkT2JqZWN0RUNsYXNzLCBMaW5rZWRPYmplY3QuY2xhc3MsICJMaW5rZWRPYmplY3QiLCBJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRMaW5rZWRPYmplY3RfTGlua2VkRWxlbWVudCgpLCB0aGVVbWFQYWNrYWdlLmdldE1ldGhvZEVsZW1lbnQoKSwgbnVsbCwgImxpbmtlZEVsZW1lbnQiLCBudWxsLCAwLCAxLCBMaW5rZWRPYmplY3QuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKG5hbWVkTm9kZUVDbGFzcywgTmFtZWROb2RlLmNsYXNzLCAiTmFtZWROb2RlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldE5hbWVkTm9kZV9OYW1lKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJuYW1lIiwgbnVsbCwgMCwgMSwgTmFtZWROb2RlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcyhub2RlRUNsYXNzLCBOb2RlLmNsYXNzLCAiTm9kZSIsIElTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldE5vZGVfTG9jYXRpb24oKSwgdGhpcy5nZXRQb2ludCgpLCAibG9jYXRpb24iLCBudWxsLCAwLCAxLCBOb2RlLmNsYXNzLCBJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0Tm9kZV9XaWR0aCgpLCBlY29yZVBhY2thZ2UuZ2V0RUludCgpLCAid2lkdGgiLCAiLTEiLCAwLCAxLCBOb2RlLmNsYXNzLCBJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlpbml0RUF0dHJpYnV0ZShnZXROb2RlX0hlaWdodCgpLCBlY29yZVBhY2thZ2UuZ2V0RUludCgpLCAiaGVpZ2h0IiwgIi0xIiwgMCwgMSwgTm9kZS5jbGFzcywgSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0Tm9kZV9JbmNvbWluZ0Nvbm5lY3Rpb25zKCksIHRoaXMuZ2V0TGluaygpLCB0aGlzLmdldExpbmtfVGFyZ2V0KCksICJpbmNvbWluZ0Nvbm5lY3Rpb25zIiwgbnVsbCwgMCwgLTEsIE5vZGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0Tm9kZV9PdXRnb2luZ0Nvbm5lY3Rpb25zKCksIHRoaXMuZ2V0TGluaygpLCB0aGlzLmdldExpbmtfU291cmNlKCksICJvdXRnb2luZ0Nvbm5lY3Rpb25zIiwgbnVsbCwgMCwgLTEsIE5vZGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0Tm9kZV9SZWFkT25seSgpLCBlY29yZVBhY2thZ2UuZ2V0RUJvb2xlYW4oKSwgInJlYWRPbmx5IiwgbnVsbCwgMCwgMSwgTm9kZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoYWN0aXZpdHlEaWFncmFtRUNsYXNzLCBBY3Rpdml0eURpYWdyYW0uY2xhc3MsICJBY3Rpdml0eURpYWdyYW0iLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKHR5cGVkTm9kZUVDbGFzcywgVHlwZWROb2RlLmNsYXNzLCAiVHlwZWROb2RlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldFR5cGVkTm9kZV9UeXBlKCksIGVjb3JlUGFja2FnZS5nZXRFSW50KCksICJ0eXBlIiwgbnVsbCwgMCwgMSwgVHlwZWROb2RlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcyh3b3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtRUNsYXNzLCBXb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtLmNsYXNzLCAiV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3Mod29ya1Byb2R1Y3ROb2RlRUNsYXNzLCBXb3JrUHJvZHVjdE5vZGUuY2xhc3MsICJXb3JrUHJvZHVjdE5vZGUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0V29ya1Byb2R1Y3ROb2RlX1R5cGUoKSwgZWNvcmVQYWNrYWdlLmdldEVJbnQoKSwgInR5cGUiLCBudWxsLCAwLCAxLCBXb3JrUHJvZHVjdE5vZGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKGFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVDbGFzcywgQWN0aXZpdHlEZXRhaWxEaWFncmFtLmNsYXNzLCAiQWN0aXZpdHlEZXRhaWxEaWFncmFtIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldEFjdGl2aXR5RGV0YWlsRGlhZ3JhbV9BdXRvTGF5b3V0KCksIGVjb3JlUGFja2FnZS5nZXRFQm9vbGVhbigpLCAiYXV0b0xheW91dCIsIG51bGwsIDAsIDEsIEFjdGl2aXR5RGV0YWlsRGlhZ3JhbS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3Mobm9kZUNvbnRhaW5lckVDbGFzcywgTm9kZUNvbnRhaW5lci5jbGFzcywgIk5vZGVDb250YWluZXIiLCBJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXROb2RlQ29udGFpbmVyX05vZGVzKCksIHRoaXMuZ2V0Tm9kZSgpLCBudWxsLCAibm9kZXMiLCBudWxsLCAwLCAtMSwgTm9kZUNvbnRhaW5lci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3Mocm9sZU5vZGVFQ2xhc3MsIFJvbGVOb2RlLmNsYXNzLCAiUm9sZU5vZGUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKHJvbGVUYXNrQ29tcG9zaXRlRUNsYXNzLCBSb2xlVGFza0NvbXBvc2l0ZS5jbGFzcywgIlJvbGVUYXNrQ29tcG9zaXRlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldFJvbGVUYXNrQ29tcG9zaXRlX1Jvd0luZGV4KCksIGVjb3JlUGFja2FnZS5nZXRFSW50KCksICJyb3dJbmRleCIsIG51bGwsIDAsIDEsIFJvbGVUYXNrQ29tcG9zaXRlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcyh0YXNrTm9kZUVDbGFzcywgVGFza05vZGUuY2xhc3MsICJUYXNrTm9kZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRUYXNrTm9kZV9JbmRleCgpLCBlY29yZVBhY2thZ2UuZ2V0RUludCgpLCAiaW5kZXgiLCAiLTEiLCAwLCAxLCBUYXNrTm9kZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkJaW5pdEVDbGFzcyh3b3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlRUNsYXNzLCBXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlLmNsYXNzLCAiV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3Mod29ya0JyZWFrZG93bkVsZW1lbnROb2RlRUNsYXNzLCBXb3JrQnJlYWtkb3duRWxlbWVudE5vZGUuY2xhc3MsICJXb3JrQnJlYWtkb3duRWxlbWVudE5vZGUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKHdvcmtQcm9kdWN0Q29tcG9zaXRlRUNsYXNzLCBXb3JrUHJvZHVjdENvbXBvc2l0ZS5jbGFzcywgIldvcmtQcm9kdWN0Q29tcG9zaXRlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldFdvcmtQcm9kdWN0Q29tcG9zaXRlX1R5cGUoKSwgZWNvcmVQYWNrYWdlLmdldEVJbnQoKSwgInR5cGUiLCBudWxsLCAwLCAxLCBXb3JrUHJvZHVjdENvbXBvc2l0ZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCi0JCS8vIEluaXRpYWxpemUgZGF0YSB0eXBlcwotCQlpbml0RURhdGFUeXBlKGFic29sdXRlQmVuZHBvaW50RURhdGFUeXBlLCBBYnNvbHV0ZUJlbmRwb2ludC5jbGFzcywgIkFic29sdXRlQmVuZHBvaW50IiwgSVNfU0VSSUFMSVpBQkxFLCAhSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RURhdGFUeXBlKHBvaW50RURhdGFUeXBlLCBQb2ludC5jbGFzcywgIlBvaW50IiwgSVNfU0VSSUFMSVpBQkxFLCAhSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RURhdGFUeXBlKHJvbGVEZXNjcmlwdG9yRURhdGFUeXBlLCBSb2xlRGVzY3JpcHRvci5jbGFzcywgIlJvbGVEZXNjcmlwdG9yIiwgSVNfU0VSSUFMSVpBQkxFLCAhSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCi0JCS8vIENyZWF0ZSByZXNvdXJjZQotCQljcmVhdGVSZXNvdXJjZShlTlNfVVJJKTsKLQl9Ci0KLX0gLy8gTW9kZWxQYWNrYWdlSW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL2ltcGwvTmFtZWROb2RlSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL2ltcGwvTmFtZWROb2RlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOTg0YTc2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9pbXBsL05hbWVkTm9kZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24uQ29tbW9uUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuU3RyVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5MaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk1vZGVsRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Nb2RlbFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTmFtZWROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwudXRpbC5HcmFwaGljYWxEYXRhSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLnV0aWwuVHhVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuUHJvY2Vzc1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlN1cHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaWJhYmxlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50OwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk5hbWVkIE5vZGU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuTmFtZWROb2RlSW1wbCNnZXROYW1lIDxlbT5OYW1lPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgTmFtZWROb2RlSW1wbCBleHRlbmRzIE5vZGVJbXBsIGltcGxlbWVudHMgTmFtZWROb2RlIHsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZSgpIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lKCkgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIG5hbWUgPSBOQU1FX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBOYW1lZE5vZGVJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIE1vZGVsUGFja2FnZS5MaXRlcmFscy5OQU1FRF9OT0RFOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBuYW1lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuZXdOYW1lKSB7Ci0JCVN0cmluZyBvbGROYW1lID0gbmFtZTsKLQkJbmFtZSA9IG5ld05hbWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1vZGVsUGFja2FnZS5OQU1FRF9OT0RFX19OQU1FLCBvbGROYW1lLCBuYW1lKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBNb2RlbFBhY2thZ2UuTkFNRURfTk9ERV9fTkFNRToKLQkJCQlyZXR1cm4gZ2V0TmFtZSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5OQU1FRF9OT0RFX19OQU1FOgotCQkJCXNldE5hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgTW9kZWxQYWNrYWdlLk5BTUVEX05PREVfX05BTUU6Ci0JCQkJc2V0TmFtZShOQU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgTW9kZWxQYWNrYWdlLk5BTUVEX05PREVfX05BTUU6Ci0JCQkJcmV0dXJuIE5BTUVfRURFRkFVTFQgPT0gbnVsbCA/IG5hbWUgIT0gbnVsbCA6ICFOQU1FX0VERUZBVUxULmVxdWFscyhuYW1lKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChuYW1lOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKG5hbWUpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLy8KLQkvLyBTdGFydCBjdXN0b20gY29kZSAgLy8KLQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLy8KLQotCXByb3RlY3RlZCBjbGFzcyBNZXRob2RFbGVtZW50QWRhcHRlciBleHRlbmRzIFRyYW5zYWN0aW9uYWxOb2RlTGluayB7Ci0JCXByb3RlY3RlZCB2b2lkIGhhbmRsZU5vdGlmaWNhdGlvbihOb3RpZmljYXRpb24gbXNnKSB7Ci0JCQlzd2l0Y2ggKG1zZy5nZXRGZWF0dXJlSUQoRGVzY3JpYmFibGVFbGVtZW50LmNsYXNzKSkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkRFU0NSSUJBQkxFX0VMRU1FTlRfX1BSRVNFTlRBVElPTl9OQU1FOgotCQkJCXNldE5hbWUobXNnLmdldE5ld1N0cmluZ1ZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQkKLQkJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChmaW5hbCBOb3RpZmljYXRpb24gbXNnKSB7Ci0JCQlpZiAoIW5vdGlmaWNhdGlvbkVuYWJsZWQpCi0JCQkJcmV0dXJuOwotCQkJbm90aWZpY2F0aW9uRW5hYmxlZCA9IGZhbHNlOwotCQkJdHJ5IHsKLQkJCQlUeFV0aWwucnVuSW5UcmFuc2FjdGlvbihnZXROb2RlKCksIAotCQkJCQkJbmV3IFJ1bm5hYmxlKCkgewotCi0JCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCQloYW5kbGVOb3RpZmljYXRpb24obXNnKTsKLQkJCQkJCQl9Ci0JCQkJCQotCQkJCX0pOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlDb21tb25QbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJfSBmaW5hbGx5IHsKLQkJCQlub3RpZmljYXRpb25FbmFibGVkID0gdHJ1ZTsKLQkJCX0KLQkJfQotCi0JCXB1YmxpYyBOb2RlIGdldE5vZGUoKSB7Ci0JCQlyZXR1cm4gTmFtZWROb2RlSW1wbC50aGlzOwotCQl9Ci0KLQl9Ci0KLQlwcm90ZWN0ZWQgTGluayBhZGRJbmNvbWluZ0Nvbm5lY3Rpb24oTWV0aG9kRWxlbWVudCBzb3VyY2UpIHsKLQkJTm9kZSBzcmNOb2RlID0gZmluZE5vZGUoc291cmNlKTsKLQkJaWYgKHNyY05vZGUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlMaW5rIGxpbmsgPSBNb2RlbEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUxpbmsoKTsKLQkJbGluay5zZXRUYXJnZXQodGhpcyk7Ci0KLQkJLy8gZGlzYWJsZSBub3RpZmljYXRpb24gb2Ygc3JjTm9kZSBiZWZvcmUgYXNzb2NpYXRlIGl0IHdpdGggdGhlIGxpbmsKLQkJLy8gc28gaXQgd2lsbCBub3QgY3JlYXRlIGR1cGxpY2F0ZSBVTUEgZGF0YQotCQkvLwotCQlOb2RlSW1wbCBzcmNOb2RlSW1wbCA9IChOb2RlSW1wbCkgc3JjTm9kZTsKLQkJYm9vbGVhbiBub3RpZnkgPSBzcmNOb2RlSW1wbC5ub3RpZmljYXRpb25FbmFibGVkOwotCQl0cnkgewotCQkJc3JjTm9kZUltcGwubm90aWZpY2F0aW9uRW5hYmxlZCA9IGZhbHNlOwotCQkJbGluay5zZXRTb3VyY2Uoc3JjTm9kZSk7Ci0JCX0gZmluYWxseSB7Ci0JCQlzcmNOb2RlSW1wbC5ub3RpZmljYXRpb25FbmFibGVkID0gbm90aWZ5OwotCQl9Ci0KLQkJaWYoaXNHcmFwaGljYWxEYXRhUmVxdWlyZWQoKSkgewotCQkJR3JhcGhpY2FsRGF0YUhlbHBlci5hZGRHcmFwaGljYWxEYXRhKGxpbmspOwotCQl9Ci0JCXJldHVybiBsaW5rOwotCX0KLQotCXByb3RlY3RlZCBOb2RlIGZpbmROb2RlKE1ldGhvZEVsZW1lbnQgbGlua2VkRWxlbWVudCkgewotCQlyZXR1cm4gR3JhcGhpY2FsRGF0YUhlbHBlci5maW5kTm9kZShnZXREaWFncmFtKCksIGxpbmtlZEVsZW1lbnQpOwotCX0KLQotCXByb3RlY3RlZCBMaW5rIGFkZE91dGdvaW5nQ29ubmVjdGlvbihNZXRob2RFbGVtZW50IHRhcmdldCkgewotCQlOb2RlIHRhcmdldE5vZGUgPSBmaW5kTm9kZSh0YXJnZXQpOwotCQlpZiAodGFyZ2V0Tm9kZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCUxpbmsgbGluayA9IE1vZGVsRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlTGluaygpOwotCi0JCS8vIGRpc2FibGUgbm90aWZpY2F0aW9uIG9mIHRhcmdldE5vZGUgYmVmb3JlIGFzc29jaWF0ZSBpdCB3aXRoIHRoZSBsaW5rCi0JCS8vIHNvIGl0IHdpbGwgbm90IGNyZWF0ZSBkdXBsaWNhdGUgVU1BIGRhdGEKLQkJLy8KLQkJTm9kZUltcGwgbm9kZUltcGwgPSAoTm9kZUltcGwpIHRhcmdldE5vZGU7Ci0JCWJvb2xlYW4gbm90aWZ5ID0gbm9kZUltcGwubm90aWZpY2F0aW9uRW5hYmxlZDsKLQkJdHJ5IHsKLQkJCW5vZGVJbXBsLm5vdGlmaWNhdGlvbkVuYWJsZWQgPSBmYWxzZTsKLQkJCWxpbmsuc2V0VGFyZ2V0KHRhcmdldE5vZGUpOwotCQl9IGZpbmFsbHkgewotCQkJbm9kZUltcGwubm90aWZpY2F0aW9uRW5hYmxlZCA9IG5vdGlmeTsKLQkJfQotCi0JCWxpbmsuc2V0U291cmNlKHRoaXMpOwotCQlpZihpc0dyYXBoaWNhbERhdGFSZXF1aXJlZCgpKSB7Ci0JCQlHcmFwaGljYWxEYXRhSGVscGVyLmFkZEdyYXBoaWNhbERhdGEobGluayk7Ci0JCX0KLQkJcmV0dXJuIGxpbms7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gcmVtb3ZlSW5jb21pbmdDb25uZWN0aW9uKE1ldGhvZEVsZW1lbnQgc291cmNlKSB7Ci0JCS8vIGxvb2sgZm9yIHRoZSBpbmNvbWluZyBjb25uZWN0aW9uIHdpdGggc291cmNlIGFzIGxpbmtlZCBvYmplY3Qgb2YgdGhlCi0JCS8vIHNvdXJjZSBub2RlCi0JCS8vCi0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGdldEluY29taW5nQ29ubmVjdGlvbnMoKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCUxpbmsgbGluayA9IChMaW5rKSBpdGVyLm5leHQoKTsKLQkJCWlmIChsaW5rLmdldFNvdXJjZSgpICE9IG51bGwKLQkJCQkJJiYgbGluay5nZXRTb3VyY2UoKS5nZXRPYmplY3QoKSA9PSBzb3VyY2UpIHsKLQkJCQlHcmFwaGljYWxEYXRhSGVscGVyLnJlbW92ZUdyYXBoaWNhbERhdGEobGluayk7Ci0JCQkJLy8gZGlzYWJsZSBpbnRlcm5hbCBub3RpZmljYXRpb24gb2YgdGhlIHNvdXJjZSBub2RlCi0JCQkJLy8KLQkJCQlOb2RlSW1wbCBzb3VyY2VOb2RlID0gKE5vZGVJbXBsKSBsaW5rLmdldFNvdXJjZSgpOwotCQkJCWJvb2xlYW4gb2xkTm90aWZ5ID0gc291cmNlTm9kZS5ub3RpZmljYXRpb25FbmFibGVkOwotCQkJCXRyeSB7Ci0JCQkJCXNvdXJjZU5vZGUubm90aWZpY2F0aW9uRW5hYmxlZCA9IGZhbHNlOwotCQkJCQlsaW5rLnNldFNvdXJjZShudWxsKTsKLQkJCQl9IGZpbmFsbHkgewotCQkJCQlzb3VyY2VOb2RlLm5vdGlmaWNhdGlvbkVuYWJsZWQgPSBvbGROb3RpZnk7Ci0JCQkJfQotCQkJCWxpbmsuc2V0VGFyZ2V0KG51bGwpOwotCQkJCWxpbmsuc2V0T2JqZWN0KG51bGwpOwotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiByZW1vdmVPdXRnb2luZ0Nvbm5lY3Rpb24oTWV0aG9kRWxlbWVudCB0YXJnZXQpIHsKLQkJLy8gbG9vayBmb3IgdGhlIGluY29taW5nIGNvbm5lY3Rpb24gd2l0aCBzb3VyY2UgYXMgbGlua2VkIG9iamVjdCBvZiB0aGUKLQkJLy8gc291cmNlIG5vZGUKLQkJLy8KLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZ2V0T3V0Z29pbmdDb25uZWN0aW9ucygpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkuaGFzTmV4dCgpOykgewotCQkJTGluayBsaW5rID0gKExpbmspIGl0ZXIubmV4dCgpOwotCQkJaWYgKGxpbmsuZ2V0VGFyZ2V0KCkgIT0gbnVsbAotCQkJCQkmJiBsaW5rLmdldFRhcmdldCgpLmdldE9iamVjdCgpID09IHRhcmdldCkgewotCQkJCUdyYXBoaWNhbERhdGFIZWxwZXIucmVtb3ZlR3JhcGhpY2FsRGF0YShsaW5rKTsKLQkJCQkvLyBkaXNhYmxlIGludGVybmFsIG5vdGlmaWNhdGlvbiBvZiB0aGUgc291cmNlIG5vZGUKLQkJCQkvLwotCQkJCU5vZGVJbXBsIHRhcmdldE5vZGUgPSAoTm9kZUltcGwpIGxpbmsuZ2V0VGFyZ2V0KCk7Ci0JCQkJYm9vbGVhbiBvbGROb3RpZnkgPSB0YXJnZXROb2RlLm5vdGlmaWNhdGlvbkVuYWJsZWQ7Ci0JCQkJdHJ5IHsKLQkJCQkJdGFyZ2V0Tm9kZS5ub3RpZmljYXRpb25FbmFibGVkID0gZmFsc2U7Ci0JCQkJCWxpbmsuc2V0VGFyZ2V0KG51bGwpOwotCQkJCX0gZmluYWxseSB7Ci0JCQkJCXRhcmdldE5vZGUubm90aWZpY2F0aW9uRW5hYmxlZCA9IG9sZE5vdGlmeTsKLQkJCQl9Ci0JCQkJbGluay5zZXRTb3VyY2UobnVsbCk7Ci0JCQkJbGluay5zZXRPYmplY3QobnVsbCk7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE9iamVjdChPYmplY3QgbmV3T2JqZWN0KSB7Ci0JCXN1cGVyLnNldE9iamVjdChuZXdPYmplY3QpOwotCi0JCWlmIChuZXdPYmplY3QgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJU3RyaW5nIG5hbWUgPSBudWxsOwotCi0JCS8vIHVzZSBwcmVzZW50YXRpb24gbmFtZQotCQlpZiAobmV3T2JqZWN0IGluc3RhbmNlb2YgRGVzY3JpYmFibGVFbGVtZW50KSB7Ci0JCQlEZXNjcmliYWJsZUVsZW1lbnQgZWxlbWVudCA9IChEZXNjcmliYWJsZUVsZW1lbnQpIG5ld09iamVjdDsKLQkJCW5hbWUgPSBQcm9jZXNzVXRpbC5nZXRQcmVzZW50YXRpb25OYW1lKChCcmVha2Rvd25FbGVtZW50KSBlbGVtZW50KTsKLQkJfQotCi0JCS8vIGlmIGl0J3MgYmxhbmsgdGhlbiB1c2UgbmFtZQotCQlpZiAoU3RyVXRpbC5pc0JsYW5rKG5hbWUpKSB7Ci0JCQlNZXRob2RFbGVtZW50IGVsZW1lbnQgPSAoTWV0aG9kRWxlbWVudCkgbmV3T2JqZWN0OwotCQkJbmFtZSA9IGVsZW1lbnQuZ2V0TmFtZSgpOwotCQl9Ci0KLQkJdGhpcy5uYW1lID0gbmFtZTsKLQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5Ob2RlSW1wbCNiYXNpY1NldE9iamVjdChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGJhc2ljU2V0T2JqZWN0KE9iamVjdCBuZXdPYmplY3QpIHsKLQkJc3VwZXIuYmFzaWNTZXRPYmplY3QobmV3T2JqZWN0KTsKLQotCQlpZiAobmV3T2JqZWN0IGluc3RhbmNlb2YgVmFyaWFiaWxpdHlFbGVtZW50Ci0JCQkJJiYgUHJvY2Vzc1V0aWwKLQkJCQkJCS5pc0V4dGVuZGluZ09yTG9jYWxseUNvbnRyaWJ1dGluZygoQnJlYWtkb3duRWxlbWVudCkgbmV3T2JqZWN0KSkgewotCQkJLy8gbGlzdGVuIHRvIGNoYW5nZSBpbiB0aGUgYmFzZQotCQkJLy8KLQkJCVZhcmlhYmlsaXR5RWxlbWVudCBiYXNlID0gKChWYXJpYWJpbGl0eUVsZW1lbnQpIG5ld09iamVjdCkKLQkJCQkJLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsKLQkJCWlmIChiYXNlICE9IG51bGwpIHsKLQkJCQlpZiAoYmFzZUxpc3RlbmVyID09IG51bGwpIHsKLQkJCQkJYmFzZUxpc3RlbmVyID0gbmV3IEFkYXB0ZXJJbXBsKCkgewotCQkJCQkJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbXNnKSB7Ci0JCQkJCQkJc3dpdGNoIChtc2cuZ2V0RmVhdHVyZUlEKERlc2NyaWJhYmxlRWxlbWVudC5jbGFzcykpIHsKLQkJCQkJCQljYXNlIFVtYVBhY2thZ2UuREVTQ1JJQkFCTEVfRUxFTUVOVF9fUFJFU0VOVEFUSU9OX05BTUU6Ci0JCQkJCQkJCURlc2NyaWJhYmxlRWxlbWVudCBlID0gKERlc2NyaWJhYmxlRWxlbWVudCkgZ2V0T2JqZWN0KCk7Ci0JCQkJCQkJCWlmIChTdHJVdGlsLmlzQmxhbmsoZS5nZXRQcmVzZW50YXRpb25OYW1lKCkpKSB7Ci0JCQkJCQkJCQlTdHJpbmcgb2xkTmFtZSA9IG5hbWU7Ci0JCQkJCQkJCQluYW1lID0gbXNnLmdldE5ld1N0cmluZ1ZhbHVlKCk7Ci0JCQkJCQkJCQlpZiAoIW5hbWUuZXF1YWxzKG9sZE5hbWUpKSB7Ci0JCQkJCQkJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCgKLQkJCQkJCQkJCQkJTmFtZWROb2RlSW1wbC50aGlzLCAtMSwKLQkJCQkJCQkJCQkJTW9kZWxQYWNrYWdlLk5BTUVEX05PREVfX05BTUUsCi0JCQkJCQkJCQkJCW9sZE5hbWUsIG5hbWUpKTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCQkJCQkJCQlicmVhazsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX07Ci0JCQkJfQotCQkJCWJhc2UuZUFkYXB0ZXJzKCkuYWRkKGJhc2VMaXN0ZW5lcik7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuTm9kZUltcGwjZGlzcG9zZSgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZGlzcG9zZSgpIHsKLQkJRU9iamVjdCBvYmogPSAoRU9iamVjdCkgZ2V0T2JqZWN0KCk7Ci0JCWlmIChvYmogIT0gbnVsbCkgewotCQkJaWYgKGJhc2VMaXN0ZW5lciAhPSBudWxsKSB7Ci0JCQkJb2JqLmVBZGFwdGVycygpLnJlbW92ZShiYXNlTGlzdGVuZXIpOwotCQkJfQotCQl9Ci0KLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5Ob2RlSW1wbCNjcmVhdGVOb2RlQWRhcHRlcigpCi0JICovCi0JcHJvdGVjdGVkIEFkYXB0ZXIgY3JlYXRlTm9kZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgTm9kZUFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBtc2cpIHsKLQkJCQlpZiAoIW5vdGlmaWNhdGlvbkVuYWJsZWQpCi0JCQkJCXJldHVybjsKLQkJCQlub3RpZmljYXRpb25FbmFibGVkID0gZmFsc2U7Ci0JCQkJdHJ5IHsKLQkJCQkJc3dpdGNoIChtc2cuZ2V0RmVhdHVyZUlEKE5hbWVkTm9kZS5jbGFzcykpIHsKLQkJCQkJY2FzZSBNb2RlbFBhY2thZ2UuTkFNRURfTk9ERV9fTkFNRToKLQkJCQkJCWlmIChtc2cuZ2V0RXZlbnRUeXBlKCkgPT0gTm90aWZpY2F0aW9uLlNFVAotCQkJCQkJCQkmJiBnZXRPYmplY3QoKSBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnQpIHsKLQkJCQkJCQlTdHJpbmcgbmV3TmFtZSA9IG1zZy5nZXROZXdTdHJpbmdWYWx1ZSgpOwotCQkJCQkJCUJyZWFrZG93bkVsZW1lbnQgZSA9ICgoQnJlYWtkb3duRWxlbWVudCkgZ2V0T2JqZWN0KCkpOwotCQkJCQkJCWUuc2V0UHJlc2VudGF0aW9uTmFtZShuZXdOYW1lKTsKLQkJCQkJCQlpZiAoU3RyVXRpbC5pc0JsYW5rKGUuZ2V0TmFtZSgpKSkgewotCQkJCQkJCQllLnNldE5hbWUobmV3TmFtZSk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJcmV0dXJuOwotCQkJCQl9Ci0JCQkJCXN1cGVyLm5vdGlmeUNoYW5nZWQobXNnKTsKLQkJCQl9IGZpbmFsbHkgewotCQkJCQlub3RpZmljYXRpb25FbmFibGVkID0gdHJ1ZTsKLQkJCQl9Ci0KLQkJCX0KLQkJfTsKLQotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzTm90aWZpY2F0aW9uRW5hYmxlZCgpIHsKLQkJcmV0dXJuIG5vdGlmaWNhdGlvbkVuYWJsZWQ7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Tm90aWZpY2F0aW9uRW5hYmxlZChib29sZWFuIG5vdGlmaWNhdGlvbkVuYWJsZWQpIHsKLQkJdGhpcy5ub3RpZmljYXRpb25FbmFibGVkID0gbm90aWZpY2F0aW9uRW5hYmxlZDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1N1cHByZXNzZWQoKSB7Ci0JCVN1cHByZXNzaW9uIHN1cHByZXNzaW9uID0gZ2V0RGlhZ3JhbSgpLmdldFN1cHByZXNzaW9uKCk7Ci0JCWlmIChzdXBwcmVzc2lvbiAhPSBudWxsKSB7Ci0JCQlPYmplY3QgbyA9IGl0ZW1Qcm92aWRlciAhPSBudWxsID8gaXRlbVByb3ZpZGVyIDogZ2V0TGlua2VkRWxlbWVudCgpOwotCQkJcmV0dXJuIGdldERpYWdyYW0oKS5nZXRTdXBwcmVzc2lvbigpLmlzU3VwcHJlc3NlZChvKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCXB1YmxpYyBPYmplY3QgZ2V0V3JhcHBlcigpIHsKLQkJcmV0dXJuIGl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBpdGVtIHByb3ZpZGVyIGZvciB0aGUgdGhpcyBub2RlIGlmIHRoZXJlIGlzIGEgcmVhZC1vbmx5IHdyYXBwZXIKLQkgKiBmb3IgdGhlIG5vZGUgaW4gdGhlIGdpdmVuIGVsZW1lbnQgY29sbGVjdGlvbgotCSAqIAotCSAqIEBwYXJhbSBub2RlCi0JICogQHBhcmFtIGFsbEVsZW1lbnRzCi0JICovCi0Jdm9pZCBzZXRJdGVtUHJvdmlkZXIoQ29sbGVjdGlvbiBhbGxFbGVtZW50cykgewotCQlPYmplY3Qgb2JqZWN0ID0gR3JhcGhpY2FsRGF0YUhlbHBlci5maW5kRWxlbWVudChhbGxFbGVtZW50cywKLQkJCQlnZXRPYmplY3QoKSk7Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgewotCQkJQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIgd3JhcHBlciA9IChCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgb2JqZWN0OwotCQkJaWYgKHdyYXBwZXIuaXNSZWFkT25seSgpKSB7Ci0JCQkJaXRlbVByb3ZpZGVyID0gd3JhcHBlcjsKLQkJCQlyZWFkT25seSA9IHRydWU7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIEFkYXB0ZXJJbXBsIGJhc2VMaXN0ZW5lcjsKLQotCS8qKgotCSAqIEl0ZW0gcHJvdmlkZXIgb2YgdGhlIGxpbmtlZCBvYmplY3QKLQkgKi8KLQlwcm90ZWN0ZWQgQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIgaXRlbVByb3ZpZGVyOwotCi19IC8vIE5hbWVkTm9kZUltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9pbXBsL05vZGVDb250YWluZXJJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvaW1wbC9Ob2RlQ29udGFpbmVySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZGRmMjMwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9pbXBsL05vZGVDb250YWluZXJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk1vZGVsUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGVDb250YWluZXI7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Tm9kZSBDb250YWluZXI8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuTm9kZUNvbnRhaW5lckltcGwjZ2V0Tm9kZXMgPGVtPk5vZGVzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgTm9kZUNvbnRhaW5lckltcGwgZXh0ZW5kcyBOb2RlSW1wbCBpbXBsZW1lbnRzCi0JCU5vZGVDb250YWluZXIgewotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5vZGVzKCkgPGVtPk5vZGVzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROb2RlcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PE5vZGU+IG5vZGVzOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBOb2RlQ29udGFpbmVySW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBNb2RlbFBhY2thZ2UuTGl0ZXJhbHMuTk9ERV9DT05UQUlORVI7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxOb2RlPiBnZXROb2RlcygpIHsKLQkJaWYgKG5vZGVzID09IG51bGwpIHsKLQkJCW5vZGVzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PE5vZGU+KE5vZGUuY2xhc3MsIHRoaXMsIE1vZGVsUGFja2FnZS5OT0RFX0NPTlRBSU5FUl9fTk9ERVMpOwotCQl9Ci0JCXJldHVybiBub2RlczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5OT0RFX0NPTlRBSU5FUl9fTk9ERVM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXROb2RlcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgTW9kZWxQYWNrYWdlLk5PREVfQ09OVEFJTkVSX19OT0RFUzoKLQkJCQlyZXR1cm4gZ2V0Tm9kZXMoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgTW9kZWxQYWNrYWdlLk5PREVfQ09OVEFJTkVSX19OT0RFUzoKLQkJCQlnZXROb2RlcygpLmNsZWFyKCk7Ci0JCQkJZ2V0Tm9kZXMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIE5vZGU+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBNb2RlbFBhY2thZ2UuTk9ERV9DT05UQUlORVJfX05PREVTOgotCQkJCWdldE5vZGVzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgTW9kZWxQYWNrYWdlLk5PREVfQ09OVEFJTkVSX19OT0RFUzoKLQkJCQlyZXR1cm4gbm9kZXMgIT0gbnVsbCAmJiAhbm9kZXMuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuTm9kZUltcGwjc2V0UmVhZE9ubHkoYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZWFkT25seShib29sZWFuIG5ld1JlYWRPbmx5KSB7Ci0JCXN1cGVyLnNldFJlYWRPbmx5KG5ld1JlYWRPbmx5KTsKLQkJaWYgKG5ld1JlYWRPbmx5KSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBnZXROb2RlcygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCU5vZGUgY2hpbGQgPSAoTm9kZSkgaXRlci5uZXh0KCk7Ci0JCQkJY2hpbGQuc2V0UmVhZE9ubHkobmV3UmVhZE9ubHkpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHJlbW92ZWROb2RlcwotCSAqLwotCXByb3RlY3RlZCB2b2lkIHB1c2hCYWNrVG9EaWFncmFtKENvbGxlY3Rpb24gcmVtb3ZlZE5vZGVzKSB7Ci0JCUFjdGl2aXR5RGV0YWlsRGlhZ3JhbUltcGwgZGlhZ3JhbSA9IChBY3Rpdml0eURldGFpbERpYWdyYW1JbXBsKSBnZXREaWFncmFtKCk7Ci0JCUNvbGxlY3Rpb24gYnJlYWtkb3duRWxlbWVudHMgPSBkaWFncmFtLmdldEFsbEJyZWFrZG93bkVsZW1lbnRzKHRydWUpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSByZW1vdmVkTm9kZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlOb2RlIG5vZGUgPSAoTm9kZSkgaXRlci5uZXh0KCk7Ci0JCQlpZiAoIWJyZWFrZG93bkVsZW1lbnRzLmNvbnRhaW5zKG5vZGUuZ2V0T2JqZWN0KCkpKSB7Ci0JCQkJaXRlci5yZW1vdmUoKTsKLQkJCX0KLQkJfQotCQkvLyBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBkaWFncmFtLmdldE5vZGVzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KQotCQkvLyB7Ci0JCS8vIE9iamVjdCBub2RlID0gaXRlci5uZXh0KCk7Ci0JCS8vIGlmKG5vZGUgaW5zdGFuY2VvZiBSb2xlVGFza0NvbXBvc2l0ZSl7Ci0JCS8vIExpc3QgbGlzdCA9ICgoUm9sZVRhc2tDb21wb3NpdGUpbm9kZSkuZ2V0Tm9kZXMoKTsKLQkJLy8gYm9vbGVhbiBkZXN0cm95ID0gdHJ1ZTsKLQkJLy8gZm9yKEl0ZXJhdG9yIGl0ZXJhdG9yID0gbGlzdC5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KXsKLQkJLy8gT2JqZWN0IG9iaiA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJLy8gaWYob2JqIGluc3RhbmNlb2YgVGFza05vZGUpIGRlc3Ryb3kgPSBmYWxzZTsKLQkJLy8gfQotCQkvLyBpZihkZXN0cm95KSBpdGVyLnJlbW92ZSgpOwotCQkvLyB9Ci0JCS8vIH0KLQkJaWYgKCFyZW1vdmVkTm9kZXMuaXNFbXB0eSgpKSB7Ci0JCQlkaWFncmFtLmdldE5vZGVzKCkuYWRkQWxsKHJlbW92ZWROb2Rlcyk7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2VsZWN0Tm9kZXMoQ29sbGVjdGlvbiBub2RlcykgewotCQlpZiAoIW5vZGVzLmlzRW1wdHkoKSkgewotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gbm9kZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJTm9kZUltcGwgbm9kZSA9IChOb2RlSW1wbCkgaXRlci5uZXh0KCk7Ci0JCQkJbm9kZS52aXNpYmxlID0gdHJ1ZTsKLQkJCX0KLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGdldE5vZGVzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJTm9kZUltcGwgbm9kZSA9IChOb2RlSW1wbCkgaXRlci5uZXh0KCk7Ci0JCQkJaWYoIW5vZGVzLmNvbnRhaW5zKG5vZGUpKSB7Ci0JCQkJCW5vZGUudmlzaWJsZSA9IGZhbHNlOwotCQkJCX0KLQkJCX0KLQkJCWdldE5vZGVzKCkuYWRkQWxsKG5vZGVzKTsKLQkJfQotCQllbHNlIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGdldE5vZGVzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJTm9kZUltcGwgbm9kZSA9IChOb2RlSW1wbCkgaXRlci5uZXh0KCk7Ci0JCQkJbm9kZS52aXNpYmxlID0gZmFsc2U7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZGlzcG9zZSgpIHsKLQkJLy8gZGlzcG9zZSBhbGwgbm9kZXMKLQkJLy8KLQkJZm9yIChPYmplY3Qgbm9kZSA6IG5ldyBBcnJheUxpc3Q8Tm9kZT4obm9kZXMpKSB7CQkKLQkJCSgoTm9kZUltcGwpbm9kZSkuZGlzcG9zZSgpOwotCQl9Ci0JCQotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotCQotfSAvLyBOb2RlQ29udGFpbmVySW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL2ltcGwvTm9kZUltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9pbXBsL05vZGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjOWY1NzEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL2ltcGwvTm9kZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg5OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRXaXRoSW52ZXJzZUVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RXaXRoSW52ZXJzZVJlc29sdmluZ0VMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5Db21tb25QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuRGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5MaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk1vZGVsUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuTmFtZWROb2RlSW1wbC5NZXRob2RFbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC51dGlsLkdyYXBoaWNhbERhdGFIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwudXRpbC5HcmFwaGljYWxEYXRhTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC51dGlsLklOb2RlQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwudXRpbC5UeFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya0JyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrT3JkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Tm9kZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5Ob2RlSW1wbCNnZXRMb2NhdGlvbiA8ZW0+TG9jYXRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuTm9kZUltcGwjZ2V0V2lkdGggPGVtPldpZHRoPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLk5vZGVJbXBsI2dldEhlaWdodCA8ZW0+SGVpZ2h0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLk5vZGVJbXBsI2dldEluY29taW5nQ29ubmVjdGlvbnMgPGVtPkluY29taW5nIENvbm5lY3Rpb25zPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLk5vZGVJbXBsI2dldE91dGdvaW5nQ29ubmVjdGlvbnMgPGVtPk91dGdvaW5nIENvbm5lY3Rpb25zPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLk5vZGVJbXBsI2lzUmVhZE9ubHkgPGVtPlJlYWQgT25seTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIE5vZGVJbXBsIGV4dGVuZHMgTGlua2VkT2JqZWN0SW1wbCBpbXBsZW1lbnRzIE5vZGUgewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRMb2NhdGlvbigpIDxlbT5Mb2NhdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldExvY2F0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFBvaW50IExPQ0FUSU9OX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldExvY2F0aW9uKCkgPGVtPkxvY2F0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TG9jYXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBQb2ludCBsb2NhdGlvbiA9IExPQ0FUSU9OX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFdpZHRoKCkgPGVtPldpZHRoPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0V2lkdGgoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IFdJRFRIX0VERUZBVUxUID0gLTE7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRXaWR0aCgpIDxlbT5XaWR0aDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFdpZHRoKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgaW50IHdpZHRoID0gV0lEVEhfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SGVpZ2h0KCkgPGVtPkhlaWdodDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEhlaWdodCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgSEVJR0hUX0VERUZBVUxUID0gLTE7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRIZWlnaHQoKSA8ZW0+SGVpZ2h0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SGVpZ2h0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgaW50IGhlaWdodCA9IEhFSUdIVF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEluY29taW5nQ29ubmVjdGlvbnMoKSA8ZW0+SW5jb21pbmcgQ29ubmVjdGlvbnM8L2VtPn0nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEluY29taW5nQ29ubmVjdGlvbnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxMaW5rPiBpbmNvbWluZ0Nvbm5lY3Rpb25zOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0T3V0Z29pbmdDb25uZWN0aW9ucygpIDxlbT5PdXRnb2luZyBDb25uZWN0aW9uczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0T3V0Z29pbmdDb25uZWN0aW9ucygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PExpbms+IG91dGdvaW5nQ29ubmVjdGlvbnM7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNSZWFkT25seSgpIDxlbT5SZWFkIE9ubHk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1JlYWRPbmx5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gUkVBRF9PTkxZX0VERUZBVUxUID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1JlYWRPbmx5KCkgPGVtPlJlYWQgT25seTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzUmVhZE9ubHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHJlYWRPbmx5ID0gUkVBRF9PTkxZX0VERUZBVUxUOwotCi0JcHJpdmF0ZSBBZGFwdGVyIG5vZGVBZGFwdGVyOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBOb2RlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBNb2RlbFBhY2thZ2UuTGl0ZXJhbHMuTk9ERTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFBvaW50IGdldExvY2F0aW9uKCkgewotCQlyZXR1cm4gbG9jYXRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExvY2F0aW9uKFBvaW50IG5ld0xvY2F0aW9uKSB7Ci0JCVBvaW50IG9sZExvY2F0aW9uID0gbG9jYXRpb247Ci0JCWxvY2F0aW9uID0gbmV3TG9jYXRpb247Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1vZGVsUGFja2FnZS5OT0RFX19MT0NBVElPTiwgb2xkTG9jYXRpb24sIGxvY2F0aW9uKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0V2lkdGgoKSB7Ci0JCXJldHVybiB3aWR0aDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0V2lkdGgoaW50IG5ld1dpZHRoKSB7Ci0JCWludCBvbGRXaWR0aCA9IHdpZHRoOwotCQl3aWR0aCA9IG5ld1dpZHRoOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNb2RlbFBhY2thZ2UuTk9ERV9fV0lEVEgsIG9sZFdpZHRoLCB3aWR0aCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgaW50IGdldEhlaWdodCgpIHsKLQkJcmV0dXJuIGhlaWdodDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SGVpZ2h0KGludCBuZXdIZWlnaHQpIHsKLQkJaW50IG9sZEhlaWdodCA9IGhlaWdodDsKLQkJaGVpZ2h0ID0gbmV3SGVpZ2h0OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNb2RlbFBhY2thZ2UuTk9ERV9fSEVJR0hULCBvbGRIZWlnaHQsIGhlaWdodCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8TGluaz4gZ2V0SW5jb21pbmdDb25uZWN0aW9ucygpIHsKLQkJaWYgKGluY29taW5nQ29ubmVjdGlvbnMgPT0gbnVsbCkgewotCQkJaW5jb21pbmdDb25uZWN0aW9ucyA9IG5ldyBFT2JqZWN0V2l0aEludmVyc2VSZXNvbHZpbmdFTGlzdDxMaW5rPihMaW5rLmNsYXNzLCB0aGlzLCBNb2RlbFBhY2thZ2UuTk9ERV9fSU5DT01JTkdfQ09OTkVDVElPTlMsIE1vZGVsUGFja2FnZS5MSU5LX19UQVJHRVQpOwotCQl9Ci0JCXJldHVybiBpbmNvbWluZ0Nvbm5lY3Rpb25zOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8TGluaz4gZ2V0T3V0Z29pbmdDb25uZWN0aW9ucygpIHsKLQkJaWYgKG91dGdvaW5nQ29ubmVjdGlvbnMgPT0gbnVsbCkgewotCQkJb3V0Z29pbmdDb25uZWN0aW9ucyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRXaXRoSW52ZXJzZUVMaXN0PExpbms+KExpbmsuY2xhc3MsIHRoaXMsIE1vZGVsUGFja2FnZS5OT0RFX19PVVRHT0lOR19DT05ORUNUSU9OUywgTW9kZWxQYWNrYWdlLkxJTktfX1NPVVJDRSk7Ci0JCX0KLQkJcmV0dXJuIG91dGdvaW5nQ29ubmVjdGlvbnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUmVhZE9ubHkoKSB7Ci0JCXJldHVybiByZWFkT25seTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGxvY2F0aW9uOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGxvY2F0aW9uKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCB3aWR0aDogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZCh3aWR0aCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgaGVpZ2h0OiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGhlaWdodCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcmVhZE9ubHk6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQocmVhZE9ubHkpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIGluY29taW5nIGNvbm5lY3Rpb24KLQkgKiAKLQkgKiBAcGFyYW0gbGluawotCSAqIEByZXR1cm4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBhZGRUb1VNQShMaW5rIGxpbmspIHsKLQkJaWYgKGxpbmsuZ2V0VGFyZ2V0KCkgPT0gbnVsbCB8fCBsaW5rLmdldFNvdXJjZSgpID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWlmKGlzR3JhcGhpY2FsRGF0YVJlcXVpcmVkKCkpIHsKLQkJCUdyYXBoaWNhbERhdGFIZWxwZXIuYWRkR3JhcGhpY2FsRGF0YShsaW5rKTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmVzIG91dGdvaW5nIGNvbm5lY3Rpb24KLQkgKiAKLQkgKiBAcGFyYW0gbGluawotCSAqIEBwYXJhbSBvbGRTb3VyY2UKLQkgKiBAcGFyYW0gb2xkVGFyZ2V0Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlRnJvbVVNQShMaW5rIGxpbmssIE5vZGUgb2xkU291cmNlLCBOb2RlIG9sZFRhcmdldCkgewotCQkvLyBHcmFwaGljYWxEYXRhTWFuYWdlci5nZXRJbnN0YW5jZSgpLnJlbW92ZUdyYXBoQ29ubmVjdG9yUGFpcihvbGRTb3VyY2UuZ2V0R3JhcGhOb2RlKCksCi0JCS8vIG9sZFRhcmdldC5nZXRHcmFwaE5vZGUoKSk7Ci0JCQotCQlHcmFwaGljYWxEYXRhSGVscGVyLnJlbW92ZUdyYXBoaWNhbERhdGEobGluayk7Ci0JfQotCi0JcHJvdGVjdGVkIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbSBnZXRVTUFEaWFncmFtKCkgewotCQlpZiAoZ2V0RGlhZ3JhbSgpID09IG51bGwpCi0JCQlyZXR1cm4gdW1hRGlhZ3JhbTsKLQkJcmV0dXJuIGdldERpYWdyYW0oKS5nZXRVTUFEaWFncmFtKCk7Ci0JfQotCi0JcHJvdGVjdGVkIEdyYXBoTm9kZSBnZXRVTUFDb250YWluZXIoKSB7Ci0JCU5vZGUgY29udGFpbmVyID0gKE5vZGUpIGVDb250YWluZXIoKTsKLQkJaWYgKGNvbnRhaW5lciA9PSBudWxsKQotCQkJcmV0dXJuIHVtYUNvbnRhaW5lcjsKLQkJcmV0dXJuIGNvbnRhaW5lci5nZXRHcmFwaE5vZGUoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGUjc2V0VU1BQ29udGFpbmVyKG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhOb2RlKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFVNQUNvbnRhaW5lcihHcmFwaE5vZGUgdW1hQ29udGFpbmVyKSB7Ci0JCXRoaXMudW1hQ29udGFpbmVyID0gdW1hQ29udGFpbmVyOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuQWN0aXZpdHlOb2RlI3NldFVNQURpYWdyYW0ob3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFVNQURpYWdyYW0ob3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtIHVtYURpYWdyYW0pIHsKLQkJdGhpcy51bWFEaWFncmFtID0gdW1hRGlhZ3JhbTsKLQkJdW1hQ29udGFpbmVyID0gdW1hRGlhZ3JhbTsKLQl9Ci0KLQlwcm90ZWN0ZWQgY2xhc3MgTm9kZUFkYXB0ZXIgZXh0ZW5kcyBBZGFwdGVySW1wbCB7Ci0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVySW1wbCNub3RpZnlDaGFuZ2VkKG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbikKLQkJICovCi0JCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG1zZykgewotCQkJc3dpdGNoIChtc2cuZ2V0RmVhdHVyZUlEKE5vZGUuY2xhc3MpKSB7Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5OT0RFX19XSURUSDoKLQkJCQlnZXRHcmFwaE5vZGUoKS5nZXRTaXplKCkuc2V0V2lkdGgoCi0JCQkJCQluZXcgRG91YmxlKG1zZy5nZXROZXdJbnRWYWx1ZSgpKSk7Ci0JCQkJcmV0dXJuOwotCi0JCQljYXNlIE1vZGVsUGFja2FnZS5OT0RFX19IRUlHSFQ6Ci0JCQkJaWYgKGdldEdyYXBoTm9kZSgpICE9IG51bGwpIHsKLQkJCQkJZ2V0R3JhcGhOb2RlKCkuZ2V0U2l6ZSgpLnNldEhlaWdodCgKLQkJCQkJCQluZXcgRG91YmxlKG1zZy5nZXROZXdJbnRWYWx1ZSgpKSk7Ci0JCQkJfQotCQkJCXJldHVybjsKLQotCQkJY2FzZSBNb2RlbFBhY2thZ2UuTk9ERV9fTE9DQVRJT046Ci0JCQkJaWYgKGdldEdyYXBoTm9kZSgpICE9IG51bGwgJiYgbXNnLmdldE5ld1ZhbHVlKCkgIT0gbnVsbCkgewotCQkJCQlQb2ludCBwID0gKFBvaW50KSBtc2cuZ2V0TmV3VmFsdWUoKTsKLQkJCQkJZ2V0R3JhcGhOb2RlKCkuZ2V0UG9zaXRpb24oKS5zZXRYKG5ldyBEb3VibGUocC54KSk7Ci0JCQkJCWdldEdyYXBoTm9kZSgpLmdldFBvc2l0aW9uKCkuc2V0WShuZXcgRG91YmxlKHAueSkpOwotCQkJCX0KLQkJCQlyZXR1cm47Ci0KLQkJCWNhc2UgTW9kZWxQYWNrYWdlLk5PREVfX0lOQ09NSU5HX0NPTk5FQ1RJT05TOgotCQkJCUxpbmsgbGluazsKLQkJCQlzd2l0Y2ggKG1zZy5nZXRFdmVudFR5cGUoKSkgewotCQkJCWNhc2UgTm90aWZpY2F0aW9uLkFERDoKLQkJCQkJbGluayA9IChMaW5rKSBtc2cuZ2V0TmV3VmFsdWUoKTsKLQkJCQkJYWRkVG9VTUEobGluayk7Ci0JCQkJCXJldHVybjsKLQkJCQljYXNlIE5vdGlmaWNhdGlvbi5BRERfTUFOWToKLQkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gKChDb2xsZWN0aW9uKSBtc2cuZ2V0TmV3VmFsdWUoKSkKLQkJCQkJCQkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlhZGRUb1VNQSgoTGluaykgaXRlci5uZXh0KCkpOwotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgTm90aWZpY2F0aW9uLlJFTU9WRToKLQkJCQkJbGluayA9IChMaW5rKSBtc2cuZ2V0T2xkVmFsdWUoKTsKLQkJCQkJaWYgKGxpbmsuZ2V0U291cmNlKCkgIT0gbnVsbCkgewotCQkJCQkJKChOb2RlSW1wbCkgbGluay5nZXRTb3VyY2UoKSkucmVtb3ZlRnJvbVVNQShsaW5rLCBsaW5rCi0JCQkJCQkJCS5nZXRTb3VyY2UoKSwgKE5vZGUpIG1zZy5nZXROb3RpZmllcigpKTsKLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQljYXNlIE5vdGlmaWNhdGlvbi5SRU1PVkVfTUFOWToKLQkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gKChDb2xsZWN0aW9uKSBtc2cuZ2V0T2xkVmFsdWUoKSkKLQkJCQkJCQkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlsaW5rID0gKExpbmspIGl0ZXIubmV4dCgpOwotCQkJCQkJaWYgKGxpbmsuZ2V0U291cmNlKCkgIT0gbnVsbCkgewotCQkJCQkJCSgoTm9kZUltcGwpIGxpbmsuZ2V0U291cmNlKCkpLnJlbW92ZUZyb21VTUEobGluaywKLQkJCQkJCQkJCWxpbmsuZ2V0U291cmNlKCksIChOb2RlKSBtc2cuZ2V0Tm90aWZpZXIoKSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCXJldHVybjsKLQkJCWNhc2UgTW9kZWxQYWNrYWdlLk5PREVfX09VVEdPSU5HX0NPTk5FQ1RJT05TOgotCQkJCXN3aXRjaCAobXNnLmdldEV2ZW50VHlwZSgpKSB7Ci0JCQkJY2FzZSBOb3RpZmljYXRpb24uQUREOgotCQkJCQlsaW5rID0gKExpbmspIG1zZy5nZXROZXdWYWx1ZSgpOwotCQkJCQlpZiAobGluay5nZXRUYXJnZXQoKSAhPSBudWxsKSB7Ci0JCQkJCQkoKE5vZGVJbXBsKSBsaW5rLmdldFRhcmdldCgpKS5hZGRUb1VNQShsaW5rKTsKLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQljYXNlIE5vdGlmaWNhdGlvbi5BRERfTUFOWToKLQkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gKChDb2xsZWN0aW9uKSBtc2cuZ2V0TmV3VmFsdWUoKSkKLQkJCQkJCQkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlsaW5rID0gKExpbmspIGl0ZXIubmV4dCgpOwotCQkJCQkJaWYgKGxpbmsuZ2V0VGFyZ2V0KCkgIT0gbnVsbCkgewotCQkJCQkJCSgoTm9kZUltcGwpIGxpbmsuZ2V0VGFyZ2V0KCkpLmFkZFRvVU1BKGxpbmspOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgTm90aWZpY2F0aW9uLlJFTU9WRToKLQkJCQkJbGluayA9IChMaW5rKSBtc2cuZ2V0T2xkVmFsdWUoKTsKLQkJCQkJaWYgKGxpbmsuZ2V0VGFyZ2V0KCkgIT0gbnVsbCkgewotCQkJCQkJcmVtb3ZlRnJvbVVNQShsaW5rLCAoTm9kZSkgbXNnLmdldE5vdGlmaWVyKCksIGxpbmsKLQkJCQkJCQkJLmdldFRhcmdldCgpKTsKLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQljYXNlIE5vdGlmaWNhdGlvbi5SRU1PVkVfTUFOWToKLQkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gKChDb2xsZWN0aW9uKSBtc2cuZ2V0T2xkVmFsdWUoKSkKLQkJCQkJCQkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlsaW5rID0gKExpbmspIGl0ZXIubmV4dCgpOwotCQkJCQkJaWYgKGxpbmsuZ2V0VGFyZ2V0KCkgIT0gbnVsbCkgewotCQkJCQkJCXJlbW92ZUZyb21VTUEobGluaywgKE5vZGUpIG1zZy5nZXROb3RpZmllcigpLCBsaW5rCi0JCQkJCQkJCQkuZ2V0VGFyZ2V0KCkpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQlyZXR1cm47Ci0KLQkJCX0KLQkJfQotCi0JfQotCQotCS8qKgotCSAqIExvYWRzIGdyYXBobm9kZSBkYXRhIGFuZCBhc3NvY2lhdGVzIHRoZSBhZGFwdGVycy4KLQkgKiBAcGFyYW0gbmV3T2JqZWN0Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgYmFzaWNTZXRPYmplY3QoT2JqZWN0IG5ld09iamVjdCkgewotCQlpZiAobmV3T2JqZWN0ID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJdGhpcy5vYmplY3QgPSBuZXdPYmplY3Q7Ci0JCU1ldGhvZEVsZW1lbnQgZWxlbWVudCA9IChNZXRob2RFbGVtZW50KSBuZXdPYmplY3Q7Ci0JCQotCQlncmFwaE5vZGUgPSBnZXRHcmFwaE5vZGUoZWxlbWVudCk7Ci0KLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJOb2RlSW1wbC5zZXRPYmplY3QoKTogZWxlbWVudDogJyIgKwotCQkvLyBlbGVtZW50LmdldE5hbWUoKSArICInLCBncmFwaE5vZGU6ICIgKyBncmFwaE5vZGUpOwotCi0JCWlmKGdyYXBoTm9kZSAhPSBudWxsKSB7Ci0JCQkvLyBwb3B1bGF0ZS9zeW5jaCBkYXRhCi0JCQkvLwotCQkJaWYgKGhlaWdodCA9PSBIRUlHSFRfRURFRkFVTFQpIHsKLQkJCQlzZXRIZWlnaHQoZ3JhcGhOb2RlLmdldFNpemUoKS5nZXRIZWlnaHQoKS5pbnRWYWx1ZSgpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJZ3JhcGhOb2RlLmdldFNpemUoKS5zZXRIZWlnaHQobmV3IERvdWJsZShoZWlnaHQpKTsKLQkJCX0KLQotCQkJaWYgKHdpZHRoID09IFdJRFRIX0VERUZBVUxUKSB7Ci0JCQkJc2V0V2lkdGgoZ3JhcGhOb2RlLmdldFNpemUoKS5nZXRXaWR0aCgpLmludFZhbHVlKCkpOwotCQkJfSBlbHNlIHsKLQkJCQlncmFwaE5vZGUuZ2V0U2l6ZSgpLnNldFdpZHRoKG5ldyBEb3VibGUod2lkdGgpKTsKLQkJCX0KLQotCQkJaWYgKGxvY2F0aW9uID09IExPQ0FUSU9OX0VERUZBVUxUKSB7Ci0JCQkJc2V0TG9jYXRpb24oR3JhcGhpY2FsRGF0YUhlbHBlci50b1BvaW50KGdyYXBoTm9kZS5nZXRQb3NpdGlvbigpKSk7Ci0JCQl9IGVsc2UgewotCQkJCWdyYXBoTm9kZS5nZXRQb3NpdGlvbigpLnNldFgobmV3IERvdWJsZShsb2NhdGlvbi54KSk7Ci0JCQkJZ3JhcGhOb2RlLmdldFBvc2l0aW9uKCkuc2V0WShuZXcgRG91YmxlKGxvY2F0aW9uLnkpKTsKLQkJCX0KLQkJfQotCi0JCS8vIGFkZCBtZXRob2RFbGVtZW50QWRhcHRlcgotCQkvLwotCQlnZXRNZXRob2RFbGVtZW50QWRhcHRlcigpOwotCQlpZiAobWV0aG9kRWxlbWVudEFkYXB0ZXIgIT0gbnVsbCAmJiAhZWxlbWVudC5lQWRhcHRlcnMoKS5jb250YWlucyhtZXRob2RFbGVtZW50QWRhcHRlcikpIHsKLQkJCWVsZW1lbnQuZUFkYXB0ZXJzKCkuYWRkKG1ldGhvZEVsZW1lbnRBZGFwdGVyKTsKLQkJfQotCi0JCWlmKG5vZGVBZGFwdGVyID09IG51bGwpIHsKLQkJCW5vZGVBZGFwdGVyID0gY3JlYXRlTm9kZUFkYXB0ZXIoKTsKLQkJfQotCQlpZihub2RlQWRhcHRlciAhPSBudWxsICYmICFlQWRhcHRlcnMoKS5jb250YWlucyhub2RlQWRhcHRlcikpIHsKLQkJCWVBZGFwdGVycygpLmFkZChub2RlQWRhcHRlcik7Ci0JCX0KLQkJCQkKLQkJT2JqZWN0IGUgPSBUbmdVdGlsLnVud3JhcChvYmplY3QpOwotCQlpZihlIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJc2V0TGlua2VkRWxlbWVudCgoTWV0aG9kRWxlbWVudCkgZSk7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIGFic3RyYWN0IGNsYXNzIFRyYW5zYWN0aW9uYWxOb2RlTGluayBleHRlbmRzIEFkYXB0ZXJJbXBsIAotCWltcGxlbWVudHMgSU5vZGVDaGFuZ2VMaXN0ZW5lcgotCXsKLQkJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChmaW5hbCBOb3RpZmljYXRpb24gbXNnKSB7Ci0JCQlpZihtc2cuZ2V0RXZlbnRUeXBlKCkgPT0gTm90aWZpY2F0aW9uLlJFTU9WSU5HX0FEQVBURVIpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlpZiAoIW5vdGlmaWNhdGlvbkVuYWJsZWQpCi0JCQkJcmV0dXJuOwotCQkJbm90aWZpY2F0aW9uRW5hYmxlZCA9IGZhbHNlOwotCQkJdHJ5IHsKLQkJCQlUeFV0aWwucnVuSW5UcmFuc2FjdGlvbihnZXROb2RlKCksIAotCQkJCQkJbmV3IFJ1bm5hYmxlKCkgewotCi0JCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCQloYW5kbGVOb3RpZmljYXRpb24obXNnKTsKLQkJCQkJCQl9Ci0JCQkJCQotCQkJCX0pOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlDb21tb25QbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJfSBmaW5hbGx5IHsKLQkJCQlub3RpZmljYXRpb25FbmFibGVkID0gdHJ1ZTsKLQkJCX0KLQkJfQotCi0JCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGhhbmRsZU5vdGlmaWNhdGlvbihOb3RpZmljYXRpb24gbXNnKTsKLQotCQlwdWJsaWMgTm9kZSBnZXROb2RlKCkgewotCQkJcmV0dXJuIE5vZGVJbXBsLnRoaXM7Ci0JCX0KLQl9Ci0KLQkKLQkvKioKLQkgKiBTdWJjbGFzcyBjYW4gb3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gcHJvdmlkZSBNZXRob2RFbGVtZW50QWRhcHRlciB0aGF0IHdpbGwgc3luY2hyb25pemUKLQkgKiB0aGUgY2hhbmdlIGZyb20gbWV0aG9kIGVsZW1lbnQgdG8gdGhlIG5vZGUuCi0JICogCi0JICogQHJldHVybiB0aGUgbWV0aG9kIGVsZW1lbnQgYWRhcHRlciBvZiB0aGlzIG5vZGUKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGdldE1ldGhvZEVsZW1lbnRBZGFwdGVyKCkgewotCQlyZXR1cm4gbWV0aG9kRWxlbWVudEFkYXB0ZXI7Ci0JfQotCi0JcHVibGljIEdyYXBoTm9kZSBnZXRHcmFwaE5vZGUoTWV0aG9kRWxlbWVudCBtZXRob2RFbGVtZW50KXsKLQkJaWYoaXNHcmFwaGljYWxEYXRhUmVxdWlyZWQoKSkgewotCQkJcmV0dXJuIEdyYXBoaWNhbERhdGFNYW5hZ2VyLmdldEluc3RhbmNlKCkuZ2V0R3JhcGhOb2RlKAotCQkJCQlnZXRVTUFEaWFncmFtKCksIG1ldGhvZEVsZW1lbnQpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5MaW5rZWRPYmplY3RJbXBsI3NldE9iamVjdChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldE9iamVjdChPYmplY3QgbmV3T2JqZWN0KSB7Ci0JCXN1cGVyLnNldE9iamVjdChuZXdPYmplY3QpOwotCQkKLQkJYmFzaWNTZXRPYmplY3QobmV3T2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIEFkYXB0ZXIgY3JlYXRlTm9kZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgTm9kZUFkYXB0ZXIoKTsKLQl9Ci0KLQlwdWJsaWMgR3JhcGhOb2RlIGdldEdyYXBoTm9kZSgpIHsKLQkJcmV0dXJuIGdyYXBoTm9kZTsKLQl9Ci0KLQkvLyBUT0RPOiBmb3JjZSBzdWJjbGFzcyB0byBpbXBsZW1lbnQgdGhpcyBtZXRob2QKLQlwdWJsaWMgQ2xhc3MgZ2V0TWV0aG9kRWxlbWVudEFkYXB0ZXJUeXBlKCkgewotCQlyZXR1cm4gSU5vZGVDaGFuZ2VMaXN0ZW5lci5jbGFzczsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGUjZ2V0RGlhZ3JhbSgpCi0JICovCi0JcHVibGljIERpYWdyYW0gZ2V0RGlhZ3JhbSgpIHsKLQkJRU9iamVjdCBwYXJlbnQgPSBlQ29udGFpbmVyOwotCQlmb3IgKDsgcGFyZW50ICE9IG51bGwgJiYgIShwYXJlbnQgaW5zdGFuY2VvZiBEaWFncmFtKTsgcGFyZW50ID0gcGFyZW50Ci0JCQkJLmVDb250YWluZXIoKSkKLQkJCTsKLQkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIERpYWdyYW0pIHsKLQkJCXJldHVybiAoRGlhZ3JhbSkgcGFyZW50OwotCQl9Ci0JCXJldHVybiBkaWFncmFtOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZSNzZXREaWFncmFtKG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkRpYWdyYW0pCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGlhZ3JhbShEaWFncmFtIGRpYWdyYW0pIHsKLQkJdGhpcy5kaWFncmFtID0gZGlhZ3JhbTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGUjYWRkQ29uc3VtZXIoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRDb25zdW1lcihPYmplY3QgY29uc3VtZXIpIHsKLQkJaWYgKCFjb25zdW1lcnMuY29udGFpbnMoY29uc3VtZXIpKSB7Ci0JCQljb25zdW1lcnMuYWRkKGNvbnN1bWVyKTsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZSNyZW1vdmVDb25zdW1lcihqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUNvbnN1bWVyKE9iamVjdCBjb25zdW1lcikgewotCQljb25zdW1lcnMucmVtb3ZlKGNvbnN1bWVyKTsKLQkJaWYgKGNvbnN1bWVycy5pc0VtcHR5KCkpIHsKLQkJCS8vIG5vIG1vcmUgY29uc3VtZXIgb2YgdGhpcyBub2RlLCBpdCBzaG91bGQgYmUgZGlzcG9zZWQKLQkJCWRpc3Bvc2UoKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGRpc3Bvc2UoKSB7Ci0JCUVPYmplY3Qgb2JqID0gKEVPYmplY3QpIGdldE9iamVjdCgpOwotCQlpZiAob2JqICE9IG51bGwpIHsKLQkJCWlmIChtZXRob2RFbGVtZW50QWRhcHRlciAhPSBudWxsKSB7Ci0JCQkJb2JqLmVBZGFwdGVycygpLnJlbW92ZShtZXRob2RFbGVtZW50QWRhcHRlcik7Ci0JCQl9Ci0JCX0KLQotCQlpZihub2RlQWRhcHRlciAhPSBudWxsKSB7Ci0JCQllQWRhcHRlcnMoKS5yZW1vdmUobm9kZUFkYXB0ZXIpOwotCQl9Ci0KLQkJdW1hQ29udGFpbmVyID0gbnVsbDsKLQkJdW1hRGlhZ3JhbSA9IG51bGw7Ci0JCWdyYXBoTm9kZSA9IG51bGw7Ci0JCQotCQlpZihvdXRnb2luZ0Nvbm5lY3Rpb25zICE9IG51bGwpIHsKLQkJCWZvciAoT2JqZWN0IGxpbmsgOiBvdXRnb2luZ0Nvbm5lY3Rpb25zKSB7Ci0JCQkJKChMaW5rKWxpbmspLmVBZGFwdGVycygpLmNsZWFyKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmVhZE9ubHkoYm9vbGVhbiBuZXdSZWFkT25seSkgewotCQlib29sZWFuIG9sZFJlYWRPbmx5ID0gcmVhZE9ubHk7Ci0JCXJlYWRPbmx5ID0gbmV3UmVhZE9ubHk7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1vZGVsUGFja2FnZS5OT0RFX19SRUFEX09OTFksIG9sZFJlYWRPbmx5LCByZWFkT25seSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQlAT3ZlcnJpZGUKLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VBZGQoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5OT0RFX19JTkNPTUlOR19DT05ORUNUSU9OUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PEludGVybmFsRU9iamVjdD4pKEludGVybmFsRUxpc3Q8Pz4pZ2V0SW5jb21pbmdDb25uZWN0aW9ucygpKS5iYXNpY0FkZChvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5OT0RFX19PVVRHT0lOR19DT05ORUNUSU9OUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PEludGVybmFsRU9iamVjdD4pKEludGVybmFsRUxpc3Q8Pz4pZ2V0T3V0Z29pbmdDb25uZWN0aW9ucygpKS5iYXNpY0FkZChvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlQWRkKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgTW9kZWxQYWNrYWdlLk5PREVfX0lOQ09NSU5HX0NPTk5FQ1RJT05TOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0SW5jb21pbmdDb25uZWN0aW9ucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5OT0RFX19PVVRHT0lOR19DT05ORUNUSU9OUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldE91dGdvaW5nQ29ubmVjdGlvbnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5OT0RFX19MT0NBVElPTjoKLQkJCQlyZXR1cm4gZ2V0TG9jYXRpb24oKTsKLQkJCWNhc2UgTW9kZWxQYWNrYWdlLk5PREVfX1dJRFRIOgotCQkJCXJldHVybiBuZXcgSW50ZWdlcihnZXRXaWR0aCgpKTsKLQkJCWNhc2UgTW9kZWxQYWNrYWdlLk5PREVfX0hFSUdIVDoKLQkJCQlyZXR1cm4gbmV3IEludGVnZXIoZ2V0SGVpZ2h0KCkpOwotCQkJY2FzZSBNb2RlbFBhY2thZ2UuTk9ERV9fSU5DT01JTkdfQ09OTkVDVElPTlM6Ci0JCQkJcmV0dXJuIGdldEluY29taW5nQ29ubmVjdGlvbnMoKTsKLQkJCWNhc2UgTW9kZWxQYWNrYWdlLk5PREVfX09VVEdPSU5HX0NPTk5FQ1RJT05TOgotCQkJCXJldHVybiBnZXRPdXRnb2luZ0Nvbm5lY3Rpb25zKCk7Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5OT0RFX19SRUFEX09OTFk6Ci0JCQkJcmV0dXJuIGlzUmVhZE9ubHkoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5OT0RFX19MT0NBVElPTjoKLQkJCQlzZXRMb2NhdGlvbigoUG9pbnQpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTW9kZWxQYWNrYWdlLk5PREVfX1dJRFRIOgotCQkJCXNldFdpZHRoKCgoSW50ZWdlciluZXdWYWx1ZSkuaW50VmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNb2RlbFBhY2thZ2UuTk9ERV9fSEVJR0hUOgotCQkJCXNldEhlaWdodCgoKEludGVnZXIpbmV3VmFsdWUpLmludFZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTW9kZWxQYWNrYWdlLk5PREVfX0lOQ09NSU5HX0NPTk5FQ1RJT05TOgotCQkJCWdldEluY29taW5nQ29ubmVjdGlvbnMoKS5jbGVhcigpOwotCQkJCWdldEluY29taW5nQ29ubmVjdGlvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIExpbms+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5OT0RFX19PVVRHT0lOR19DT05ORUNUSU9OUzoKLQkJCQlnZXRPdXRnb2luZ0Nvbm5lY3Rpb25zKCkuY2xlYXIoKTsKLQkJCQlnZXRPdXRnb2luZ0Nvbm5lY3Rpb25zKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBMaW5rPiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNb2RlbFBhY2thZ2UuTk9ERV9fUkVBRF9PTkxZOgotCQkJCXNldFJlYWRPbmx5KCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5OT0RFX19MT0NBVElPTjoKLQkJCQlzZXRMb2NhdGlvbihMT0NBVElPTl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNb2RlbFBhY2thZ2UuTk9ERV9fV0lEVEg6Ci0JCQkJc2V0V2lkdGgoV0lEVEhfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTW9kZWxQYWNrYWdlLk5PREVfX0hFSUdIVDoKLQkJCQlzZXRIZWlnaHQoSEVJR0hUX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5OT0RFX19JTkNPTUlOR19DT05ORUNUSU9OUzoKLQkJCQlnZXRJbmNvbWluZ0Nvbm5lY3Rpb25zKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5OT0RFX19PVVRHT0lOR19DT05ORUNUSU9OUzoKLQkJCQlnZXRPdXRnb2luZ0Nvbm5lY3Rpb25zKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5OT0RFX19SRUFEX09OTFk6Ci0JCQkJc2V0UmVhZE9ubHkoUkVBRF9PTkxZX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgTW9kZWxQYWNrYWdlLk5PREVfX0xPQ0FUSU9OOgotCQkJCXJldHVybiBMT0NBVElPTl9FREVGQVVMVCA9PSBudWxsID8gbG9jYXRpb24gIT0gbnVsbCA6ICFMT0NBVElPTl9FREVGQVVMVC5lcXVhbHMobG9jYXRpb24pOwotCQkJY2FzZSBNb2RlbFBhY2thZ2UuTk9ERV9fV0lEVEg6Ci0JCQkJcmV0dXJuIHdpZHRoICE9IFdJRFRIX0VERUZBVUxUOwotCQkJY2FzZSBNb2RlbFBhY2thZ2UuTk9ERV9fSEVJR0hUOgotCQkJCXJldHVybiBoZWlnaHQgIT0gSEVJR0hUX0VERUZBVUxUOwotCQkJY2FzZSBNb2RlbFBhY2thZ2UuTk9ERV9fSU5DT01JTkdfQ09OTkVDVElPTlM6Ci0JCQkJcmV0dXJuIGluY29taW5nQ29ubmVjdGlvbnMgIT0gbnVsbCAmJiAhaW5jb21pbmdDb25uZWN0aW9ucy5pc0VtcHR5KCk7Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5OT0RFX19PVVRHT0lOR19DT05ORUNUSU9OUzoKLQkJCQlyZXR1cm4gb3V0Z29pbmdDb25uZWN0aW9ucyAhPSBudWxsICYmICFvdXRnb2luZ0Nvbm5lY3Rpb25zLmlzRW1wdHkoKTsKLQkJCWNhc2UgTW9kZWxQYWNrYWdlLk5PREVfX1JFQURfT05MWToKLQkJCQlyZXR1cm4gcmVhZE9ubHkgIT0gUkVBRF9PTkxZX0VERUZBVUxUOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQlwcml2YXRlIENvbGxlY3Rpb24gY29uc3VtZXJzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JcHJpdmF0ZSBHcmFwaE5vZGUgdW1hQ29udGFpbmVyOwotCi0JcHJpdmF0ZSBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW0gdW1hRGlhZ3JhbTsKLQotCXByaXZhdGUgRGlhZ3JhbSBkaWFncmFtOwotCi0JcHJvdGVjdGVkIEdyYXBoTm9kZSBncmFwaE5vZGU7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBub3RpZmljYXRpb25FbmFibGVkID0gdHJ1ZTsKLQotCXByb3RlY3RlZCBJTm9kZUNoYW5nZUxpc3RlbmVyIG1ldGhvZEVsZW1lbnRBZGFwdGVyOwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gdmlzaWJsZSA9IHRydWU7Ci0JCi0JLyoqCi0JICogYWRkRGVmYXVsdFdvcmtPcmRlciBpcyBtb3ZlZCBmcm9tCi0JICogR3JhcGhpY2FsRGF0YUhlbHBlci5hZGREZWZhdWx0V29ya09yZGVyKE5hbWVkTm9kZUltcGwsCi0JICogV29ya2JyZWFrZG93bkVsZW1lbnQpIE1ldGhvZCB3aWxsIHNldCBub3RpZmljYXRpb25FbmFibGVkIGZsYWcgdG8gZmFsc2UKLQkgKiBvZiBhbGwgYWRhcHRlcnMgb2YgdHlwZSBNZXRob2RFbGVtZW50QWRhcHRlciBvZiBTdWNjZXNzb3Igb2JqZWN0IGJlZm9yZQotCSAqIGNyZWF0aW5nIGEgV29ya09yZGVyIG9iamVjdC4gQWZ0ZXIgY3JlYXRpb24gb2YgV29ya09yZGVyIChQcmVkZWNlc3NvcgotCSAqIGxpbmspIHJlc3RvcmVzIHRoZSBub3RpZmljYXRpb25FbmFibGVkIGZsYWcgb2YgU3VjY2Vzc29yJ3MgYWRhcHRlcnMgb2YKLQkgKiB0eXBlIE1ldGhvZEVsZW1lbnRBZGFwdGVyLgotCSAqIAotCSAqIGVnOiBJZiBhbiBBY3Rpdml0eSAiYWN0QSIgaXMgZXh0ZW5kZWQgaW4gYW5vdGhlciBDUC4gQmFzZSAiYWN0QSIgQUQKLQkgKiBkaWFncmFtIGlzIG9wZW5lZCwgYW5kIEV4dGVuZGVkICJhY3RBIiBBRCBEaWFncmFtIGlzIG9wZW5lZC4gT24gY3JlYXRpbmcKLQkgKiBwcmVkZWNlc3NvciBsaW5rIGJldHdlZW4gYW55IHR3byBjaGlsZCBhY3Rpdml0aWVzLCBjcmVhdGVzIGEgZXh0cmEgbGluawotCSAqIGluIEV4dGVuZGVkICJhY3RBIiBBRCBkaWFncmFtLCBiZWNhdXNlIGNyZWF0aW5nIHdvcmtvcmRlciB3aWxsIG5vdGlmeSB0aGUKLQkgKiBleHRlbmRlZCAiYWN0QSIgZGlhZ3JhbSB0byBkcmF3IGEgbGluay4gVG8gYXZvaWQgZHVwbGljYXRlIGxpbmtzIGluIHRoZQotCSAqIGV4dGVuZGVkIGFjdGl2aXR5IGRpYWdyYW0sIHdlIGhhdmUgdG8gc2V0IG5vdGlmaWNhdGlvbkVuYWJsZWQgZmxhZyB0bwotCSAqIGZhbHNlLCBiZWZvcmUgY3JlYXRpbmcgYSBXb3JrT3JkZXIgb2JqZWN0LgotCSAqIAotCSAqLwotCXB1YmxpYyBXb3JrT3JkZXIgYWRkRGVmYXVsdFdvcmtPcmRlcihOYW1lZE5vZGVJbXBsIG5vZGUsCi0JCQlXb3JrQnJlYWtkb3duRWxlbWVudCBwcmVkQnJlYWtkb3duRWxlbWVudCkgewotCQlib29sZWFuIG5vdGlmeSA9IG5vZGUuaXNOb3RpZmljYXRpb25FbmFibGVkKCk7Ci0JCU1hcCBtYXAgPSBuZXcgSGFzaE1hcCgpOwotCQlMaXN0IGxpc3QgPSAoKFdvcmtCcmVha2Rvd25FbGVtZW50KSBub2RlLmdldE9iamVjdCgpKS5lQWRhcHRlcnMoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGxpc3QuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IG9iaiA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50QWRhcHRlcikgewotCQkJCU5vZGVJbXBsIG5vZGVvYmogPSAoTm9kZUltcGwpICgoTWV0aG9kRWxlbWVudEFkYXB0ZXIpIG9iaikKLQkJCQkJCS5nZXROb2RlKCk7Ci0JCQkJYm9vbGVhbiBwcmVkTm90aWZpY2F0aW9uID0gbm9kZS5ub3RpZmljYXRpb25FbmFibGVkOwotCQkJCSgoTm9kZUltcGwpICgoKE1ldGhvZEVsZW1lbnRBZGFwdGVyKSBvYmopLmdldE5vZGUoKSkpLm5vdGlmaWNhdGlvbkVuYWJsZWQgPSBmYWxzZTsKLQkJCQltYXAucHV0KG5vZGVvYmosIG5ldyBCb29sZWFuKHByZWROb3RpZmljYXRpb24pKTsKLQkJCX0KLQkJfQotCQl0cnkgewotCQkJbm9kZS5zZXROb3RpZmljYXRpb25FbmFibGVkKGZhbHNlKTsKLQkJCXJldHVybiBVbWFVdGlsLmNyZWF0ZURlZmF1bHRXb3JrT3JkZXIoKFdvcmtCcmVha2Rvd25FbGVtZW50KSBub2RlCi0JCQkJCS5nZXRPYmplY3QoKSwgcHJlZEJyZWFrZG93bkVsZW1lbnQpOwotCQl9IGZpbmFsbHkgewotCQkJbm9kZS5zZXROb3RpZmljYXRpb25FbmFibGVkKG5vdGlmeSk7Ci0JCQlTZXQgc2V0ID0gbWFwLmtleVNldCgpOwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gc2V0Lml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBvYmplY3QgPSBpdGVyLm5leHQoKTsKLQkJCQlPYmplY3Qgb2JqID0gbWFwLmdldChvYmplY3QpOwotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBCb29sZWFuKSB7Ci0JCQkJCWJvb2xlYW4gcHJlZG5vdCA9ICgoQm9vbGVhbikgb2JqKS5ib29sZWFuVmFsdWUoKTsKLQkJCQkJKChOb2RlSW1wbCkgb2JqZWN0KS5ub3RpZmljYXRpb25FbmFibGVkID0gcHJlZG5vdDsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNHcmFwaGljYWxEYXRhUmVxdWlyZWQoKSB7Ci0JCURpYWdyYW1JbXBsIGRpYWdyYW0gPSAoRGlhZ3JhbUltcGwpIGdldERpYWdyYW0oKTsKLQkJcmV0dXJuIGRpYWdyYW0uaXNHcmFwaGljYWxEYXRhUmVxdWlyZWQoKTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNWaXNpYmxlKCkgewotCQlyZXR1cm4gdmlzaWJsZSA7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNOb3RpZmljYXRpb25FbmFibGVkKCkgewotCQlyZXR1cm4gbm90aWZpY2F0aW9uRW5hYmxlZDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXROb3RpZmljYXRpb25FbmFibGVkKGJvb2xlYW4gbm90aWZpY2F0aW9uRW5hYmxlZCkgewotCQl0aGlzLm5vdGlmaWNhdGlvbkVuYWJsZWQgPSBub3RpZmljYXRpb25FbmFibGVkOwotCX0KLQkKLX0gLy8gTm9kZUltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9pbXBsL1JvbGVOb2RlSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL2ltcGwvUm9sZU5vZGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1MDIwMGMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL2ltcGwvUm9sZU5vZGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Nb2RlbFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuUm9sZU5vZGU7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Um9sZSBOb2RlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUm9sZU5vZGVJbXBsIGV4dGVuZHMgTmFtZWROb2RlSW1wbCBpbXBsZW1lbnRzIFJvbGVOb2RlIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKi8KLQlwcm90ZWN0ZWQgUm9sZU5vZGVJbXBsKCkgewotCQlzdXBlcigpOwotCi0JCW1ldGhvZEVsZW1lbnRBZGFwdGVyID0gbmV3IFJvbGVEZXNjcmlwdG9yQWRhcHRlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIE1vZGVsUGFja2FnZS5MaXRlcmFscy5ST0xFX05PREU7Ci0JfQotCi0JcHJpdmF0ZSBjbGFzcyBSb2xlRGVzY3JpcHRvckFkYXB0ZXIgZXh0ZW5kcyBNZXRob2RFbGVtZW50QWRhcHRlciB7Ci0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuTm9kZUltcGwjZ2V0TWV0aG9kRWxlbWVudEFkYXB0ZXJUeXBlKCkKLQkgKi8KLQlwdWJsaWMgQ2xhc3MgZ2V0TWV0aG9kRWxlbWVudEFkYXB0ZXJUeXBlKCkgewotCQlyZXR1cm4gUm9sZURlc2NyaXB0b3JBZGFwdGVyLmNsYXNzOwotCX0KLX0gLy8gUm9sZU5vZGVJbXBsCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvaW1wbC9Sb2xlVGFza0NvbXBvc2l0ZUltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9pbXBsL1JvbGVUYXNrQ29tcG9zaXRlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMWI1ZDA4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9pbXBsL1JvbGVUYXNrQ29tcG9zaXRlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzg2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5BY3Rpdml0eURldGFpbERpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTW9kZWxGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk1vZGVsUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLlJvbGVOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLlJvbGVUYXNrQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLlRhc2tOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLldvcmtQcm9kdWN0Q29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLnV0aWwuR3JhcGhpY2FsRGF0YUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC51dGlsLkdyYXBoaWNhbERhdGFNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVNQVNlbWFudGljTW9kZWxCcmlkZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUudXRpbC5PcHBvc2l0ZUZlYXR1cmVOb3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkFzc29jaWF0aW9uSGVscGVyOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlJvbGUgVGFzayBDb21wb3NpdGU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuUm9sZVRhc2tDb21wb3NpdGVJbXBsI2dldFJvd0luZGV4IDxlbT5Sb3cgSW5kZXg8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBSb2xlVGFza0NvbXBvc2l0ZUltcGwgZXh0ZW5kcyBOb2RlQ29udGFpbmVySW1wbCBpbXBsZW1lbnRzCi0JCVJvbGVUYXNrQ29tcG9zaXRlIHsKLQkKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Um93SW5kZXgoKSA8ZW0+Um93IEluZGV4PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSb3dJbmRleCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgUk9XX0lOREVYX0VERUZBVUxUID0gMDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJvd0luZGV4KCkgPGVtPlJvdyBJbmRleDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Um93SW5kZXgoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBpbnQgcm93SW5kZXggPSBST1dfSU5ERVhfRURFRkFVTFQ7Ci0KLS8vCXByaXZhdGUgaW50IHJvd0luZGV4OwotCQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqLwotCXByb3RlY3RlZCBSb2xlVGFza0NvbXBvc2l0ZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJbWV0aG9kRWxlbWVudEFkYXB0ZXIgPSBuZXcgUm9sZURlc2NyaXB0b3JBZGFwdGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gTW9kZWxQYWNrYWdlLkxpdGVyYWxzLlJPTEVfVEFTS19DT01QT1NJVEU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGludCBnZXRSb3dJbmRleCgpIHsKLQkJcmV0dXJuIHJvd0luZGV4OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJvd0luZGV4KGludCBuZXdSb3dJbmRleCkgewotCQlpbnQgb2xkUm93SW5kZXggPSByb3dJbmRleDsKLQkJcm93SW5kZXggPSBuZXdSb3dJbmRleDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTW9kZWxQYWNrYWdlLlJPTEVfVEFTS19DT01QT1NJVEVfX1JPV19JTkRFWCwgb2xkUm93SW5kZXgsIHJvd0luZGV4KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBNb2RlbFBhY2thZ2UuUk9MRV9UQVNLX0NPTVBPU0lURV9fUk9XX0lOREVYOgotCQkJCXJldHVybiBuZXcgSW50ZWdlcihnZXRSb3dJbmRleCgpKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBNb2RlbFBhY2thZ2UuUk9MRV9UQVNLX0NPTVBPU0lURV9fUk9XX0lOREVYOgotCQkJCXNldFJvd0luZGV4KCgoSW50ZWdlciluZXdWYWx1ZSkuaW50VmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgTW9kZWxQYWNrYWdlLlJPTEVfVEFTS19DT01QT1NJVEVfX1JPV19JTkRFWDoKLQkJCQlzZXRSb3dJbmRleChST1dfSU5ERVhfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBNb2RlbFBhY2thZ2UuUk9MRV9UQVNLX0NPTVBPU0lURV9fUk9XX0lOREVYOgotCQkJCXJldHVybiByb3dJbmRleCAhPSBST1dfSU5ERVhfRURFRkFVTFQ7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChyb3dJbmRleDogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChyb3dJbmRleCk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gY29udGFpbnMoQ29sbGVjdGlvbiBtaXhlZENvbGxlY3Rpb24sIE9iamVjdCBlbGVtZW50KSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IG1peGVkQ29sbGVjdGlvbi5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCWlmKCBlbGVtZW50ID09IFRuZ1V0aWwudW53cmFwKGl0ZXIubmV4dCgpKSApIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0JCQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLk5vZGVJbXBsI3NldE9iamVjdChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldE9iamVjdChPYmplY3QgbmV3T2JqZWN0KSB7Ci0JCXN1cGVyLnNldE9iamVjdChuZXdPYmplY3QpOwotCQlwb3B1bGF0ZU5vZGVzKG5ld09iamVjdCk7Ci0vLwkJaWYgKG5ld09iamVjdCBpbnN0YW5jZW9mIFJvbGVEZXNjcmlwdG9yKSB7Ci0vLwkJCVJvbGVEZXNjcmlwdG9yIHJvbGVEZXNjcmlwdG9yID0gKFJvbGVEZXNjcmlwdG9yKSBuZXdPYmplY3Q7Ci0vLwkJCUFjdGl2aXR5RGV0YWlsRGlhZ3JhbUltcGwgZGlhZ3JhbSA9IChBY3Rpdml0eURldGFpbERpYWdyYW1JbXBsKSBnZXREaWFncmFtKCk7Ci0vLwkJCUNvbGxlY3Rpb24gYWxsRWxlbWVudHMgPSBkaWFncmFtLmdldEFsbEJyZWFrZG93bkVsZW1lbnRzKCk7Ci0vLwkJCUxpc3QgcHJpbWFyeVRhc2tEZXNjcmlwdG9ycyA9IEFzc29jaWF0aW9uSGVscGVyLmdldFByaW1hcnlUYXNrRGVzY3JpcHRvcnMocm9sZURlc2NyaXB0b3IpOwotLy8JCQlpZiAoIXByaW1hcnlUYXNrRGVzY3JpcHRvcnMuaXNFbXB0eSgpKSB7IC8vIG92ZXJyaWRpbmcKLS8vCQkJCQkJCQkJCQkJCQkJCQkKLS8vCQkJCS8vIHVzZSBsaXN0IHRvIG1haW50YWluIG9yZGVyIG9mCi0vLwkJCQkvLyB0YXNrZGVzY3JpcHRvcnMuCi0vLwkJCQlMaXN0IHRhc2tEZXNjcmlwdG9ycyA9IG5ldyBBcnJheUxpc3QoKTsKLS8vCQkJCXRhc2tEZXNjcmlwdG9ycy5hZGRBbGwocHJpbWFyeVRhc2tEZXNjcmlwdG9ycyk7Ci0vLwkJCQkvLyB0YXNrRGVzY3JpcHRvcnMuYWRkQWxsKHJvbGVEZXNjcmlwdG9yLmdldFBlcmZvcm1zQWRkaXRpb25hbGx5KCkpOwotLy8JCQkJLy8gdGFza0Rlc2NyaXB0b3JzLmFkZEFsbChyb2xlRGVzY3JpcHRvci5nZXRBc3Npc3RzSW4oKSk7Ci0vLwotLy8JCQkJSGFzaFNldCBzZWxlY3RlZERlc2NyaXB0b3JzID0gbmV3IEhhc2hTZXQoKTsKLS8vCQkJCUxpc3QgdGFza05vZGVzID0gbmV3IEFycmF5TGlzdCgpOwotLy8JCQkJCi0vLwkJCQlTdHJpbmcgYXV0b2xheW91dCA9IEdyYXBoaWNhbERhdGFIZWxwZXIuZ2V0QXV0b0xheW91dEZsYWcoKEFjdGl2aXR5RGV0YWlsRGlhZ3JhbSlnZXREaWFncmFtKCkpOyAKLS8vCQkJCWlmKGF1dG9sYXlvdXQgIT0gbnVsbCl7Ci0vLwkJCQkJaW50IGluZGV4ID0gMDsKLS8vCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBhbGxFbGVtZW50cy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLS8vCQkJCQkJT2JqZWN0IG9iaiA9IGl0ZXIubmV4dCgpOwotLy8JCQkJCQlvYmogPSBUbmdVdGlsLnVud3JhcChvYmopOwotLy8JCQkJCQlpZiAob2JqIGluc3RhbmNlb2YgVGFza0Rlc2NyaXB0b3IKLS8vCQkJCQkJCQkmJiBUbmdVdGlsLmNvbnRhaW5zKHRhc2tEZXNjcmlwdG9ycywgb2JqKSkgewotLy8JCQkJCQkJVGFza0Rlc2NyaXB0b3IgdGFza0Rlc2NyaXB0b3IgPSAoVGFza0Rlc2NyaXB0b3IpIG9iajsKLS8vCi0vLwkJCQkJCQkvLyBlbGltaW5hdGUgZGVzY3JpcHRvciB0aGF0IGlzIGR1cGxpY2F0ZSwKLS8vCQkJCQkJCS8vIHN1cHByZXNzZWQgb3IgZmlsdGVyZWQgb3V0Ci0vLwkJCQkJCQkvLwotLy8JCQkJCQkJaWYgKCFzZWxlY3RlZERlc2NyaXB0b3JzLmNvbnRhaW5zKHRhc2tEZXNjcmlwdG9yKQotLy8JCQkJCQkJLy8gJiYgY29udGFpbnMoYWxsRWxlbWVudHMsIHRhc2tEZXNjcmlwdG9yKSAvLyBtYWtlCi0vLwkJCQkJCQkvLyBzdXJlIHRoYXQgdGFzayBkZXNjcmlwdG9yIGlzIG9mIHRoZSBvd25pbmcKLS8vCQkJCQkJCS8vIGFjdGl2aXR5Ci0vLwkJCQkJCQkpIHsKLS8vCQkJCQkJCQlzZWxlY3RlZERlc2NyaXB0b3JzLmFkZCh0YXNrRGVzY3JpcHRvcik7Ci0vLwkJCQkJCQkJTm9kZSBub2RlID0gR3JhcGhpY2FsRGF0YUhlbHBlci5maW5kTm9kZSgKLS8vCQkJCQkJCQkJCXRoaXMsIHRhc2tEZXNjcmlwdG9yLAotLy8JCQkJCQkJCQkJVGFza05vZGUuY2xhc3MpOwotLy8JCQkJCQkJCWlmIChub2RlID09IG51bGwpIHsKLS8vCQkJCQkJCQkJbm9kZSA9IE1vZGVsRmFjdG9yeS5lSU5TVEFOQ0UKLS8vCQkJCQkJCQkJCQkuY3JlYXRlVGFza05vZGUoKTsKLS8vCQkJCQkJCQkJbm9kZS5zZXREaWFncmFtKGdldERpYWdyYW0oKSk7Ci0vLwkJCQkJCQkJCW5vZGUuc2V0T2JqZWN0KHRhc2tEZXNjcmlwdG9yKTsKLS8vCQkJCQkJCQkJKChOYW1lZE5vZGVJbXBsKSBub2RlKQotLy8JCQkJCQkJCQkJCS5zZXRJdGVtUHJvdmlkZXIoYWxsRWxlbWVudHMpOwotLy8JCQkJCQkJCQlpZihHcmFwaGljYWxEYXRhSGVscGVyLmZpbmRQcm9wZXJ0eShub2RlLmdldEdyYXBoTm9kZSgpLCAKLS8vCQkJCQkJCQkJCQlHcmFwaGljYWxEYXRhSGVscGVyLlBST1BfSU5ERVgpID09IG51bGwKLS8vCQkJCQkJCQkJCQl8fCBHcmFwaGljYWxEYXRhSGVscGVyLmlzQXV0b0xheW91dCgoQWN0aXZpdHlEZXRhaWxEaWFncmFtKWdldERpYWdyYW0oKSkpewotLy8JCQkJCQkJCQkJR3JhcGhpY2FsRGF0YUhlbHBlci5jcmVhdGVQcm9wZXJ0eShub2RlCi0vLwkJCQkJCQkJCQkJLmdldEdyYXBoTm9kZSgpLAotLy8JCQkJCQkJCQkJCUdyYXBoaWNhbERhdGFIZWxwZXIuUFJPUF9JTkRFWCwKLS8vCQkJCQkJCQkJCQluZXcgSW50ZWdlcihpbmRleCkudG9TdHJpbmcoKSk7Ci0vLwkJCQkJCQkJCQlpbmRleCsrOwotLy8JCQkJCQkJCQl9Ci0vLwkJCQkJCQkJCQotLy8JCQkJCQkJCX0KLS8vCQkJCQkJCQl0YXNrTm9kZXMuYWRkKG5vZGUpOwotLy8JCQkJCQkJfQotLy8JCQkJCQl9Ci0vLwkJCQkJfQotLy8JCQkJCS8vIFNvcnQgdGhlIHRhc2tOb2RlIGJhc2VkIG9uIHRoZWlyIGluZGV4IGlmIGF1dG9sYXlvdXQgaXMKLS8vCQkJCQkvLyBmYWxzZQotLy8JCQkJCWlmIChHcmFwaGljYWxEYXRhSGVscGVyLlBST1BfQVVUT19MQVlPVVRfVkFMVUVfRkFMU0UKLS8vCQkJCQkJCS5lcXVhbHMoYXV0b2xheW91dCkpIHsKLS8vCQkJCQkJQ29sbGVjdGlvbnMuc29ydCh0YXNrTm9kZXMsIGNvbXBhcmF0b3IpOwotLy8JCQkJCX0KLS8vCQkJICB9ZWxzZXsKLS8vCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB0YXNrRGVzY3JpcHRvcnMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0vLwkJCQkJCVRhc2tEZXNjcmlwdG9yIHRhc2tEZXNjcmlwdG9yID0gKFRhc2tEZXNjcmlwdG9yKSBpdGVyLm5leHQoKTsKLS8vCQkJCQkJCi0vLwkJCQkJCS8vIGVsaW1pbmF0ZSBkZXNjcmlwdG9yIHRoYXQgaXMgZHVwbGljYXRlLCBzdXBwcmVzc2VkIG9yIGZpbHRlcmVkIG91dAotLy8JCQkJCQkvLwotLy8JCQkJCQlpZighc2VsZWN0ZWREZXNjcmlwdG9ycy5jb250YWlucyh0YXNrRGVzY3JpcHRvcikKLS8vCQkJCQkJCQkmJiBjb250YWlucyhhbGxFbGVtZW50cywgdGFza0Rlc2NyaXB0b3IpIC8vIG1ha2Ugc3VyZSB0aGF0IHRhc2sgZGVzY3JpcHRvciBpcyBvZiB0aGUgb3duaW5nIGFjdGl2aXR5Ci0vLwkJCQkJCSkgewotLy8JCQkJCQkJc2VsZWN0ZWREZXNjcmlwdG9ycy5hZGQodGFza0Rlc2NyaXB0b3IpOwkJCQkJCi0vLwkJCQkJCU5vZGUgbm9kZSA9IEdyYXBoaWNhbERhdGFIZWxwZXIuZmluZE5vZGUoZ2V0RGlhZ3JhbSgpLAotLy8JCQkJCQkJCQl0YXNrRGVzY3JpcHRvciwgVGFza05vZGUuY2xhc3MpOwotLy8JCQkJCQlpZiAobm9kZSA9PSBudWxsKSB7Ci0vLwkJCQkJCQlub2RlID0gTW9kZWxGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVUYXNrTm9kZSgpOwotLy8JCQkJCQkJbm9kZS5zZXREaWFncmFtKGdldERpYWdyYW0oKSk7Ci0vLwkJCQkJCQlub2RlLnNldE9iamVjdCh0YXNrRGVzY3JpcHRvcik7Ci0vLwkJCQkJCQkoKE5hbWVkTm9kZUltcGwpIG5vZGUpLnNldEl0ZW1Qcm92aWRlcihhbGxFbGVtZW50cyk7Ci0vLwkJCQkJCX0KLS8vCQkJCQkJdGFza05vZGVzLmFkZChub2RlKTsKLS8vCQkJCQkJfQotLy8JCQkJCX0KLS8vCQkJCX0KLS8vCQkJCWlmKCF0YXNrTm9kZXMuaXNFbXB0eSgpKSB7Ci0vLwkJCQkJLy8gYWRkIHJvbGUgbm9kZQotLy8JCQkJCS8vCi0vLwkJCQkJTm9kZSBub2RlID0gKE5hbWVkTm9kZUltcGwpIE1vZGVsRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUm9sZU5vZGUoKTsKLS8vCQkJCQlub2RlLnNldERpYWdyYW0oZ2V0RGlhZ3JhbSgpKTsKLS8vCQkJCQlub2RlLnNldE9iamVjdChyb2xlRGVzY3JpcHRvcik7Ci0vLwkJCQkJKChOYW1lZE5vZGVJbXBsKSBub2RlKS5zZXRJdGVtUHJvdmlkZXIoYWxsRWxlbWVudHMpOwotLy8JCQkJCWdldE5vZGVzKCkuYWRkKG5vZGUpOwotLy8JCQkJCS8vIGFkZCB0YXNrIG5vZGVzCi0vLwkJCQkJLy8KLS8vCQkJCQlnZXROb2RlcygpLmFkZEFsbCh0YXNrTm9kZXMpOwotLy8JCQkJfQotLy8JCQl9Ci0vLwkJfQotCi0JCQotCX0KLQkKLQlwdWJsaWMgR3JhcGhOb2RlIGdldEdyYXBoTm9kZShNZXRob2RFbGVtZW50IG1ldGhvZEVsZW1lbnQpIHsKLQkJaWYoaXNHcmFwaGljYWxEYXRhUmVxdWlyZWQoKSkgewotCQkJaWYgKGdldFVNQURpYWdyYW0oKSA9PSBudWxsKSB7Ci0JCQkJLy8gbmV3IE1ldGhvZEVsZW1lbnQKLQkJCQkvLwotCQkJCXJldHVybiBHcmFwaGljYWxEYXRhTWFuYWdlci5nZXRJbnN0YW5jZSgpLmNyZWF0ZUdyYXBoTm9kZShtZXRob2RFbGVtZW50KTsKLQkJCX0KLQkJCUdyYXBoTm9kZSBub2RlID0gZmluZEdyYXBoTm9kZShnZXRVTUFEaWFncmFtKCksIG1ldGhvZEVsZW1lbnQpOwotCQkJaWYgKG5vZGUgPT0gbnVsbCkgewotCQkJCW5vZGUgPSBHcmFwaGljYWxEYXRhTWFuYWdlci5nZXRJbnN0YW5jZSgpLmNyZWF0ZUdyYXBoTm9kZShtZXRob2RFbGVtZW50KTsKLQkJCQkvLyBjcmVhdGVHcmFwaENvbm5lY3RvcnMobm9kZSwgZ2V0VU1BRGlhZ3JhbSgpKTsKLQkJCQlnZXRVTUFEaWFncmFtKCkuZ2V0Q29udGFpbmVkKCkuYWRkKG5vZGUpOwotCQkJfQotCQkJU3RyaW5nIGF1dG9sYXlvdXQgPSBHcmFwaGljYWxEYXRhSGVscGVyLmdldEF1dG9MYXlvdXRGbGFnKChBY3Rpdml0eURldGFpbERpYWdyYW0pZ2V0RGlhZ3JhbSgpKTsKLQkJCWlmKGF1dG9sYXlvdXQgIT0gbnVsbCl7Ci0JCQkJR3JhcGhpY2FsRGF0YUhlbHBlci5jcmVhdGVQcm9wZXJ0eShub2RlLCBHcmFwaGljYWxEYXRhSGVscGVyLlBST1BfSU5ERVgsIG5ldyBJbnRlZ2VyKHJvd0luZGV4KS50b1N0cmluZygpKTsKLQkJCX0KLQkJCXJldHVybiBub2RlOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBHcmFwaE5vZGUgZmluZEdyYXBoTm9kZShEaWFncmFtIGRpYWdyYW0sIE9iamVjdCBtZXRob2RFbGVtZW50KSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGRpYWdyYW0uZ2V0Q29udGFpbmVkKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlHcmFwaE5vZGUgZWxlbWVudCA9IChHcmFwaE5vZGUpIGl0ZXIubmV4dCgpOwotCQkJaWYgKGVsZW1lbnQuZ2V0U2VtYW50aWNNb2RlbCgpIGluc3RhbmNlb2YgVU1BU2VtYW50aWNNb2RlbEJyaWRnZQotCQkJCQkmJiBtZXRob2RFbGVtZW50ID09ICgoVU1BU2VtYW50aWNNb2RlbEJyaWRnZSkgZWxlbWVudAotCQkJCQkJCS5nZXRTZW1hbnRpY01vZGVsKCkpLmdldEVsZW1lbnQoKSkgewotCi0JCQkJUHJvcGVydHkgcHJvcGVydHkgPSBHcmFwaGljYWxEYXRhSGVscGVyLmZpbmRQcm9wZXJ0eShlbGVtZW50LCBHcmFwaGljYWxEYXRhSGVscGVyLlBST1BfSU5ERVgpOwotCQkJCQotCQkJCWlmIChwcm9wZXJ0eSAhPSBudWxsKSB7Ci0JCQkJCVN0cmluZyBpbmRleCA9IHByb3BlcnR5LmdldFZhbHVlKCk7Ci0JCQkJCWlmIChpbmRleCAhPSBudWxsKSB7Ci0JCQkJCQlpZiAoZ2V0Um93SW5kZXgoKSA9PSBuZXcgSW50ZWdlcihpbmRleCkuaW50VmFsdWUoKSkKLQkJCQkJCQlyZXR1cm4gZWxlbWVudDsKLQkJCQkJfQotCQkJCX1lbHNlewotCQkJCQlyZXR1cm4gZWxlbWVudDsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotLy8JcHVibGljIEdyYXBoTm9kZSBjcmVhdGVHcmFwaE5vZGUoTWV0aG9kRWxlbWVudCBlbGVtZW50KSB7Ci0vLwkJR3JhcGhOb2RlIG5vZGUgPSBHcmFwaGljYWxEYXRhTWFuYWdlci5nZXRJbnN0YW5jZSgpLmNyZWF0ZUdyYXBoTm9kZShlbGVtZW50KTsKLS8vCQlHcmFwaGljYWxEYXRhSGVscGVyLmNyZWF0ZVByb3BlcnR5KG5vZGUsCi0vLwkJCQlHcmFwaGljYWxEYXRhSGVscGVyLlBST1BfSU5ERVgsIG5ldyBJbnRlZ2VyKHJvd0luZGV4KQotLy8JCQkJCQkudG9TdHJpbmcoKSk7Ci0vLwkJcmV0dXJuIG5vZGU7Ci0vLwl9Ci0JCi0JcHJpdmF0ZSBjbGFzcyBSb2xlRGVzY3JpcHRvckFkYXB0ZXIgZXh0ZW5kcyBUcmFuc2FjdGlvbmFsTm9kZUxpbmsgewotCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVOb3RpZmljYXRpb24oTm90aWZpY2F0aW9uIG1zZykgewotCQkJaWYobXNnIGluc3RhbmNlb2YgT3Bwb3NpdGVGZWF0dXJlTm90aWZpY2F0aW9uKSB7Ci0JCQkJT2JqZWN0IGZlYXR1cmUgPSAoKE9wcG9zaXRlRmVhdHVyZU5vdGlmaWNhdGlvbiltc2cpLmdldE9wcHNpdGVGZWF0dXJlKCk7Ci0JCQkJaWYoZmVhdHVyZSA9PSBBc3NvY2lhdGlvbkhlbHBlci5Sb2xlRGVzY3JpcHRvcl9QcmltYXJ5VGFza0Rlc2NyaXB0b3JzKSB7Ci0JCQkJCXN3aXRjaCAobXNnLmdldEV2ZW50VHlwZSgpKSB7Ci0JCQkJCWNhc2UgTm90aWZpY2F0aW9uLkFERDoKLQkJCQkJCWFkZE5vZGUoKFRhc2tEZXNjcmlwdG9yKSBtc2cuZ2V0TmV3VmFsdWUoKSk7Ci0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSBOb3RpZmljYXRpb24uUkVNT1ZFOgotCQkJCQkJcmVtb3ZlTm9kZShtc2cuZ2V0T2xkVmFsdWUoKSk7Ci0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSBOb3RpZmljYXRpb24uQUREX01BTlk6Ci0JCQkJCQlhZGROb2RlKChDb2xsZWN0aW9uKSBtc2cuZ2V0TmV3VmFsdWUoKSk7Ci0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSBOb3RpZmljYXRpb24uUkVNT1ZFX01BTlk6Ci0JCQkJCQlyZW1vdmVOb2RlKChDb2xsZWN0aW9uKSBtc2cuZ2V0T2xkVmFsdWUoKSk7Ci0JCQkJCQlicmVhazsJCQkJCQkKLQkJCQkJfQotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJfQotCQkJc3dpdGNoIChtc2cuZ2V0RmVhdHVyZUlEKEFjdGl2aXR5LmNsYXNzKSkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX19CUkVBS0RPV05fRUxFTUVOVFM6Ci0JCQkJc3dpdGNoIChtc2cuZ2V0RXZlbnRUeXBlKCkpIHsKLQkJCQljYXNlIE5vdGlmaWNhdGlvbi5NT1ZFOgotLy8JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTU9WRUVFRUVFRUQiKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gb2xkVmFsdWUKLQkgKi8KLQlwcml2YXRlIHZvaWQgcmVtb3ZlTm9kZShPYmplY3Qgb2xkVmFsdWUpIHsKLQkJb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuRGlhZ3JhbSBkaWFncmFtID0gZ2V0RGlhZ3JhbSgpOwotCQlpZihkaWFncmFtID09IG51bGwpIHsKLQkJCVN5c3RlbS5lcnIucHJpbnRsbigiUm9sZVRhc2tDb21wb3NpdGVJbXBsLnJlbW92ZU5vZGUoKTogW0VSUk9SXSBubyBkaWFncmFtIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlDb2xsZWN0aW9uIHJlbW92ZWROb2RlcyA9IG5ldyBIYXNoU2V0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IG5vZGVzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJTm9kZSBub2RlID0gKE5vZGUpIGl0ZXIubmV4dCgpOwotCQkJaWYgKG9sZFZhbHVlIGluc3RhbmNlb2YgVGFza0Rlc2NyaXB0b3IpIHsKLQkJCQlpZiAobm9kZSBpbnN0YW5jZW9mIFJvbGVOb2RlKSB7Ci0JCQkJCUFjdGl2aXR5RGV0YWlsRGlhZ3JhbUltcGwgZCA9IChBY3Rpdml0eURldGFpbERpYWdyYW1JbXBsKWdldERpYWdyYW0oKTsKLQkJCQkJTGlzdCBsaXN0ID0gZC5nZXRSZWFsaXplZFByaW1hcnlUYXNrRGVzY3JpcHRvcnMoKFJvbGVEZXNjcmlwdG9yKSBub2RlLmdldE9iamVjdCgpKTsKLQkJCQkJaWYgKGxpc3QgPT0gbnVsbCB8fCBsaXN0LnNpemUoKSA8IDEpIHsKLQkJCQkJCWl0ZXIucmVtb3ZlKCk7Ci0JCQkJCQlyZW1vdmVkTm9kZXMuYWRkKG5vZGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJaWYgKG5vZGUuZ2V0T2JqZWN0KCkgPT0gb2xkVmFsdWUpIHsKLQkJCQlpdGVyLnJlbW92ZSgpOwotCQkJCXJlbW92ZWROb2Rlcy5hZGQobm9kZSk7Ci0JCQkJaWYgKG9sZFZhbHVlIGluc3RhbmNlb2YgVGFza0Rlc2NyaXB0b3IpIHsKLQkJCQkJTm9kZSB3cG5vZGUgPSBHcmFwaGljYWxEYXRhSGVscGVyLmZpbmROb2RlKAotCQkJCQkJCShBY3Rpdml0eURldGFpbERpYWdyYW0pIGdldERpYWdyYW0oKSwgb2xkVmFsdWUpOwotCQkJCQlnZXREaWFncmFtKCkuZ2V0Tm9kZXMoKS5yZW1vdmUod3Bub2RlKTsKLQkJCQkJd3Bub2RlID0gR3JhcGhpY2FsRGF0YUhlbHBlci5maW5kTm9kZSgKLQkJCQkJCQkoQWN0aXZpdHlEZXRhaWxEaWFncmFtKSBnZXREaWFncmFtKCksIG9sZFZhbHVlKTsKLQkJCQkJZ2V0RGlhZ3JhbSgpLmdldE5vZGVzKCkucmVtb3ZlKHdwbm9kZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmIChub2Rlcy5pc0VtcHR5KCkpIHsKLQkJCWdldERpYWdyYW0oKS5nZXROb2RlcygpLnJlbW92ZSh0aGlzKTsKLQkJfQotCQkvLyBwdXNoQmFja1RvRGlhZ3JhbShyZW1vdmVkTm9kZXMpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBkZXNjcmlwdG9yCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZE5vZGUoVGFza0Rlc2NyaXB0b3IgZGVzY3JpcHRvcikgewotCQlhZGROb2RlKGdldE5vZGVzKCksIGRlc2NyaXB0b3IpOwotCX0KLQotCXByaXZhdGUgdm9pZCBhZGROb2RlKENvbGxlY3Rpb24gbm9kZXMsIFRhc2tEZXNjcmlwdG9yIGRlc2NyaXB0b3IpIHsKLQkJaWYoZGVzY3JpcHRvci5nZXRTdXBlckFjdGl2aXRpZXMoKSA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJQWN0aXZpdHlEZXRhaWxEaWFncmFtSW1wbCBkaWFncmFtID0gKEFjdGl2aXR5RGV0YWlsRGlhZ3JhbUltcGwpIGdldERpYWdyYW0oKTsKLQkJTm9kZSBub2RlID0gR3JhcGhpY2FsRGF0YUhlbHBlci5maW5kTm9kZSh0aGlzLAotCQkJCWRlc2NyaXB0b3IsIFRhc2tOb2RlLmNsYXNzKTsKLQkJaWYgKG5vZGUgPT0gbnVsbCkgewotCQkJbm9kZSA9IGRpYWdyYW0uY3JlYXRlTm9kZShkZXNjcmlwdG9yKTsKLQkJCWlmKG5vZGUgIT0gbnVsbCkgewotCQkJCWludCBpID0gZ2V0TmV4dEluZGV4KGdldE5vZGVzKCkpOwotCQkJCWlmIChub2RlIGluc3RhbmNlb2YgVGFza05vZGVJbXBsKSB7Ci0JCQkJCSgoVGFza05vZGVJbXBsKSBub2RlKS5kb1NldEluZGV4KGkgKyAxKTsKLQkJCQl9Ci0JCQkJbm9kZXMuYWRkKG5vZGUpOwotCQkJCUNvbGxlY3Rpb24gaW5wdXRPdXRwdXROb2RlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQlkaWFncmFtLmNyZWF0ZVRhc2tJbnB1dE91dHB1dE5vZGVzKGRlc2NyaXB0b3IsIGlucHV0T3V0cHV0Tm9kZXMpOwkJCQkKLQkJCQlpZiAoIWlucHV0T3V0cHV0Tm9kZXMuaXNFbXB0eSgpKSB7Ci0JCQkJCWRpYWdyYW0uZ2V0Tm9kZXMoKS5hZGRBbGwoaW5wdXRPdXRwdXROb2Rlcyk7Ci0JCQkJCWRpYWdyYW0ucG9wdWxhdGVMaW5rcyhpbnB1dE91dHB1dE5vZGVzLCBmYWxzZSk7Ci0JCQkJfQotCQkJfQotIAkJfQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBvbGRWYWx1ZQotCSAqLwotCXByaXZhdGUgdm9pZCByZW1vdmVOb2RlKENvbGxlY3Rpb24gZWxlbWVudHMpIHsKLQkJQ29sbGVjdGlvbiBub2RlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gbm9kZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlOb2RlIG5vZGUgPSAoTm9kZSkgaXRlci5uZXh0KCk7Ci0JCQlpZiAoZWxlbWVudHMuY29udGFpbnMobm9kZS5nZXRPYmplY3QoKSkpIHsKLQkJCQlub2Rlcy5hZGQobm9kZSk7Ci0JCQl9Ci0JCX0KLQkJZ2V0Tm9kZXMoKS5yZW1vdmVBbGwobm9kZXMpOwotCQkvLyBwdXNoQmFja1RvRGlhZ3JhbShub2Rlcyk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIG5ld1ZhbHVlCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZE5vZGUoQ29sbGVjdGlvbiBlbGVtZW50cykgewotCQlDb2xsZWN0aW9uIG5vZGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBlbGVtZW50cy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCVRhc2tEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSAoVGFza0Rlc2NyaXB0b3IpIGl0ZXIubmV4dCgpOwotCQkJYWRkTm9kZShub2RlcywgZGVzY3JpcHRvcik7Ci0JCX0KLQotCQlnZXROb2RlcygpLmFkZEFsbChub2Rlcyk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLk5vZGVJbXBsI2dldE1ldGhvZEVsZW1lbnRBZGFwdGVyVHlwZSgpCi0JICovCi0JcHVibGljIENsYXNzIGdldE1ldGhvZEVsZW1lbnRBZGFwdGVyVHlwZSgpIHsKLQkJcmV0dXJuIFJvbGVEZXNjcmlwdG9yQWRhcHRlci5jbGFzczsKLQl9Ci0JCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgaW50IGdldE5leHRJbmRleChMaXN0IG5vZGVzKSB7Ci0JCWludCBpbmRleCA9IDA7Ci0JCWZvcihJdGVyYXRvciBpdGVyYXRvciA9IG5vZGVzLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspewotCQkJT2JqZWN0IG9iaiA9IGl0ZXJhdG9yLm5leHQoKTsJCQkKLS8vCQkJaWYob2JqIGluc3RhbmNlb2YgTm9kZSl7Ci0vLwkJCQlOb2RlIG5vZGUgPSAoTm9kZSlvYmo7Ci0vLwkJCQkvL1N0cmluZyB0ZW1wID0gR3JhcGhpY2FsRGF0YUhlbHBlci5maW5kUHJvcGVydHkobm9kZS5nZXRHcmFwaE5vZGUoKSwgR3JhcGhpY2FsRGF0YUhlbHBlci5QUk9QX0lOREVYKS5nZXRWYWx1ZSgpOwotLy8JCQkJTGlzdCBsaXN0ID0gbm9kZS5nZXRHcmFwaE5vZGUoKS5nZXRMaXN0KFVtYVBhY2thZ2UuR1JBUEhfTk9ERV9fUFJPUEVSVFkpOwotLy8JCQkJaWYobGlzdCAhPSBudWxsICYmICFsaXN0LmlzRW1wdHkoKSl7Ci0vLwkJCQkJZm9yIChpbnQgaSA9IGxpc3Quc2l6ZSgpIC0gMTsgaSA+IC0xOyBpLS0pIHsKLS8vCQkJCQkJUHJvcGVydHkgcHJvcCA9IChQcm9wZXJ0eSkgbGlzdC5nZXQoaSk7Ci0vLwkJCQkJCWlmIChHcmFwaGljYWxEYXRhSGVscGVyLlBST1BfSU5ERVguZXF1YWxzKHByb3AuZ2V0S2V5KCkpKXsKLS8vCQkJCQkJCWludCB0ZW1wICA9IEludGVnZXIucGFyc2VJbnQocHJvcC5nZXRWYWx1ZSgpKTsKLS8vCQkJCQkJCWlmKHRlbXAgPiBpbmRleCApIGluZGV4ID0gdGVtcDsKLS8vCQkJCQkJfQotLy8JCQkJCX0KLS8vCQkJCX0KLS8vCQkJfQotCQkJaWYob2JqIGluc3RhbmNlb2YgVGFza05vZGVJbXBsKSB7Ci0JCQkJaW50IGlkID0gKChUYXNrTm9kZUltcGwpb2JqKS5kb0dldEluZGV4KCk7Ci0JCQkJaWYoaWQgPiBpbmRleCkgewotCQkJCQlpbmRleCA9IGlkOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gaW5kZXg7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIENvbXBhcmF0b3IgY29tcGFyYXRvciA9IG5ldyBDb21wYXJhdG9yKCkgewotCi0JCXB1YmxpYyBpbnQgY29tcGFyZShPYmplY3Qgb2JqMSwgT2JqZWN0IG9iajIpIHsKLQkJCWlmIChvYmoxID09IG9iajIpCi0JCQkJcmV0dXJuIDA7Ci0JCQlpZihvYmoxIGluc3RhbmNlb2YgVGFza05vZGVJbXBsICYmIG9iajIgaW5zdGFuY2VvZiBUYXNrTm9kZUltcGwpewotCQkJCVRhc2tOb2RlSW1wbCBub2RlMSA9IChUYXNrTm9kZUltcGwpb2JqMTsKLQkJCQlUYXNrTm9kZUltcGwgbm9kZTIgPSAoVGFza05vZGVJbXBsKW9iajI7Ci0JCQkJaWYobm9kZTEuZG9HZXRJbmRleCgpID4gIG5vZGUyLmRvR2V0SW5kZXgoKSkKLQkJCQkJcmV0dXJuIDE7Ci0JCQl9Ci0JCQlyZXR1cm4gMDsKLQkJfQotCi0JfTsKLQotCXB1YmxpYyB2b2lkIGNyZWF0ZVRhc2tJbnB1dE91dHB1dE5vZGVzKFRhc2tEZXNjcmlwdG9yIGRlc2NyaXB0b3IsIENvbGxlY3Rpb24gbm9kZXMpIHsKLQkJTm9kZSBuZXdOb2RlID0gbnVsbDsKLQkJaWYgKCFkZXNjcmlwdG9yLmdldE1hbmRhdG9yeUlucHV0KCkuaXNFbXB0eSgpKSB7Ci0JCQluZXdOb2RlID0gY3JlYXRlV29ya1Byb2R1Y3RDb21wb3NpdGUoZGVzY3JpcHRvciwKLQkJCQkJV29ya1Byb2R1Y3RDb21wb3NpdGUuSU5QVVRTKTsKLQkJCW5vZGVzLmFkZChuZXdOb2RlKTsKLQkJfQotCQlpZiAoIWRlc2NyaXB0b3IuZ2V0T3V0cHV0KCkuaXNFbXB0eSgpKSB7Ci0JCQluZXdOb2RlID0gY3JlYXRlV29ya1Byb2R1Y3RDb21wb3NpdGUoZGVzY3JpcHRvciwKLQkJCQkJV29ya1Byb2R1Y3RDb21wb3NpdGUuT1VUUFVUUyk7Ci0JCQlub2Rlcy5hZGQobmV3Tm9kZSk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIFdvcmtQcm9kdWN0Q29tcG9zaXRlIGNyZWF0ZVdvcmtQcm9kdWN0Q29tcG9zaXRlKAotCQkJVGFza0Rlc2NyaXB0b3IgdGFza0Rlc2NyaXB0b3IsIGludCB0eXBlKSB7Ci0JCVdvcmtQcm9kdWN0Q29tcG9zaXRlIHdvcmtwcm9kdWN0Q29tcG9zaXRlID0gTW9kZWxGYWN0b3J5LmVJTlNUQU5DRQotCQkJCS5jcmVhdGVXb3JrUHJvZHVjdENvbXBvc2l0ZSgpOwotCQl3b3JrcHJvZHVjdENvbXBvc2l0ZS5zZXRVTUFDb250YWluZXIoZ2V0R3JhcGhOb2RlKCkpOwotCQl3b3JrcHJvZHVjdENvbXBvc2l0ZS5zZXREaWFncmFtKGdldERpYWdyYW0oKSk7Ci0JCXdvcmtwcm9kdWN0Q29tcG9zaXRlLnNldFR5cGUodHlwZSk7Ci0JCXdvcmtwcm9kdWN0Q29tcG9zaXRlLnNldE9iamVjdCh0YXNrRGVzY3JpcHRvcik7Ci0JCXJldHVybiB3b3JrcHJvZHVjdENvbXBvc2l0ZTsKLQl9Ci0JCi0JcHJpdmF0ZSBUYXNrTm9kZSBjcmVhdGVUYXNrTm9kZShUYXNrRGVzY3JpcHRvciB0ZCkgewotCQlUYXNrTm9kZSB0YXNrTm9kZSA9IG51bGw7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGdldE5vZGVzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlOb2RlIG5vZGUgPSAoTm9kZSkgaXRlci5uZXh0KCk7Ci0JCQlpZihub2RlIGluc3RhbmNlb2YgVGFza05vZGUpIHsKLQkJCQlUYXNrTm9kZSB0biA9IChUYXNrTm9kZSkgbm9kZTsKLQkJCQlpZih0bi5nZXRMaW5rZWRFbGVtZW50KCkgPT0gdGQpIHsKLQkJCQkJdGFza05vZGUgPSB0bjsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmKHRhc2tOb2RlID09IG51bGwpIHsKLQkJCXRhc2tOb2RlID0gTW9kZWxGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVUYXNrTm9kZSgpOwotCQkJdGFza05vZGUuc2V0RGlhZ3JhbShnZXREaWFncmFtKCkpOwotCQl9Ci0JCXRhc2tOb2RlLnNldE9iamVjdCh0ZCk7Ci0JCXJldHVybiB0YXNrTm9kZTsKLQl9Ci0JCi0JcHJpdmF0ZSBSb2xlTm9kZSBjcmVhdGVSb2xlTm9kZShSb2xlRGVzY3JpcHRvciByZCkgewotCQlSb2xlTm9kZSByb2xlTm9kZSA9IG51bGw7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGdldE5vZGVzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlOb2RlIG5vZGUgPSAoTm9kZSkgaXRlci5uZXh0KCk7Ci0JCQlpZihub2RlIGluc3RhbmNlb2YgUm9sZU5vZGUpIHsKLQkJCQlSb2xlTm9kZSBybiA9IChSb2xlTm9kZSkgbm9kZTsKLQkJCQlpZihybi5nZXRMaW5rZWRFbGVtZW50KCkgPT0gcmQpIHsKLQkJCQkJcm9sZU5vZGUgPSBybjsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmKHJvbGVOb2RlID09IG51bGwpIHsKLQkJCXJvbGVOb2RlID0gTW9kZWxGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVSb2xlTm9kZSgpOwotCQkJcm9sZU5vZGUuc2V0RGlhZ3JhbShnZXREaWFncmFtKCkpOwotCQkJcm9sZU5vZGUuc2V0T2JqZWN0KHJkKTsKLQkJfQotCQlyZXR1cm4gcm9sZU5vZGU7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHBvcHVsYXRlTm9kZXMoT2JqZWN0IG5ld09iamVjdCl7Ci0JCQotCQlpZiAobmV3T2JqZWN0IGluc3RhbmNlb2YgUm9sZURlc2NyaXB0b3IpIHsKLQkJCVJvbGVEZXNjcmlwdG9yIHJvbGVEZXNjcmlwdG9yID0gKFJvbGVEZXNjcmlwdG9yKSBuZXdPYmplY3Q7Ci0JCQlBY3Rpdml0eURldGFpbERpYWdyYW1JbXBsIGRpYWdyYW0gPSAoQWN0aXZpdHlEZXRhaWxEaWFncmFtSW1wbCkgZ2V0RGlhZ3JhbSgpOwotCQkJQ29sbGVjdGlvbiBhbGxFbGVtZW50cyA9IGRpYWdyYW0uZ2V0QWxsQnJlYWtkb3duRWxlbWVudHModHJ1ZSk7Ci0JCQlMaXN0IHRhc2tOb2RlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCUxpc3QgcHJpbWFyeVRhc2tEZXNjcmlwdG9ycyA9IEFzc29jaWF0aW9uSGVscGVyLmdldFByaW1hcnlUYXNrRGVzY3JpcHRvcnMocm9sZURlc2NyaXB0b3IpOwotCQkJaWYgKCFwcmltYXJ5VGFza0Rlc2NyaXB0b3JzLmlzRW1wdHkoKSkgeyAvLyBvdmVycmlkaW5nCi0JCQkJCQkJCQkJCQkJCQkJCQotCQkJCUxpc3QgdGFza0Rlc2NyaXB0b3JzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCXRhc2tEZXNjcmlwdG9ycy5hZGRBbGwocHJpbWFyeVRhc2tEZXNjcmlwdG9ycyk7Ci0JCQkJSGFzaFNldCBzZWxlY3RlZERlc2NyaXB0b3JzID0gbmV3IEhhc2hTZXQoKTsKLQkJCQlib29sZWFuIGF1dG9MYXlvdXQgPSAoKEFjdGl2aXR5RGV0YWlsRGlhZ3JhbUltcGwpZ2V0RGlhZ3JhbSgpKS5pc0F1dG9MYXlvdXQoKTsKLQkJCQlpZihhdXRvTGF5b3V0KSB7Ci0JCQkJCWludCBpbmRleCA9IDA7Ci0JCQkJCWludCByb3dUYXNrc0NvdW50ID0gMDsKLQkJCQkJaW50IHN0YXJ0Q291bnQgPSAwOwotCQkJCQkKLQkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gYWxsRWxlbWVudHMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlPYmplY3Qgb2JqID0gaXRlci5uZXh0KCk7Ci0JCQkJCQlvYmogPSBUbmdVdGlsLnVud3JhcChvYmopOwotCQkJCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFRhc2tEZXNjcmlwdG9yCi0JCQkJCQkJCSYmIFRuZ1V0aWwuY29udGFpbnModGFza0Rlc2NyaXB0b3JzLCBvYmopKSB7Ci0JCQkJCQkJVGFza0Rlc2NyaXB0b3IgdGFza0Rlc2NyaXB0b3IgPSAoVGFza0Rlc2NyaXB0b3IpIG9iajsKLQkJCQkJCQkKLQkJCQkJCQlpZihzdGFydENvdW50IDwgcm93SW5kZXggKiBHcmFwaGljYWxEYXRhSGVscGVyLmdldFRhc2tzUGVyUm93KCkpewotCQkJCQkJCQlzdGFydENvdW50Kys7Ci0JCQkJCQkJfSBlbHNlIHsKLQotCQkJCQkJCQlpZiAoIXNlbGVjdGVkRGVzY3JpcHRvcnMKLQkJCQkJCQkJCQkuY29udGFpbnModGFza0Rlc2NyaXB0b3IpKSB7Ci0JCQkJCQkJCQlzZWxlY3RlZERlc2NyaXB0b3JzLmFkZCh0YXNrRGVzY3JpcHRvcik7Ci0JCQkJCQkJCQlOb2RlIG5vZGUgPSBHcmFwaGljYWxEYXRhSGVscGVyLmZpbmROb2RlKAotCQkJCQkJCQkJCQl0aGlzLCB0YXNrRGVzY3JpcHRvciwKLQkJCQkJCQkJCQkJVGFza05vZGUuY2xhc3MpOwotCQkJCQkJCQkJaWYgKG5vZGUgPT0gbnVsbCkgewotLy8JCQkJCQkJCQkJbm9kZSA9IGNyZWF0ZVRhc2tOb2RlKHRhc2tEZXNjcmlwdG9yLAotLy8JCQkJCQkJCQkJCQlpbmRleCwgYWxsRWxlbWVudHMpOwotCQkJCQkJCQkJCW5vZGUgPSBjcmVhdGVUYXNrTm9kZSh0YXNrRGVzY3JpcHRvcik7Ci0JCQkJCQkJCQkJVGFza05vZGVJbXBsIHRuID0gKFRhc2tOb2RlSW1wbCkgbm9kZTsKLQkJCQkJCQkJCQlpZiAoYXV0b0xheW91dCB8fCB0bi5kb0dldEluZGV4KCkgPT0gLTEpIHsKLQkJCQkJCQkJCQkJdG4uZG9TZXRJbmRleChpbmRleCk7Ci0vLwkJCQkJCQkJCQkJaW5kZXgrKzsKLQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQkJLy9yZXR1cm4gbm9kZTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJCWVsc2UgewotCQkJCQkJCQkJCS8vIHRoaXMgd2lsbCBtYWtlIHN1cmUgdGhhdCBsaW5rIGJldHdlZW4gdGhlIG5vZGUgYW5kIGxpbmtlZCBlbGVtZW50IGlzIGVzdGFibGlzaGVkCi0JCQkJCQkJCQkJLy8KLQkJCQkJCQkJCQlub2RlLnNldE9iamVjdCh0YXNrRGVzY3JpcHRvcik7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCQkoKE5hbWVkTm9kZUltcGwpIG5vZGUpLnNldEl0ZW1Qcm92aWRlcihhbGxFbGVtZW50cyk7Ci0KLQkJCQkJCQkJCWlmIChyb3dUYXNrc0NvdW50IDwgR3JhcGhpY2FsRGF0YUhlbHBlcgotCQkJCQkJCQkJCQkuZ2V0VGFza3NQZXJSb3coKSkgewotCQkJCQkJCQkJCXRhc2tOb2Rlcy5hZGQobm9kZSk7Ci0JCQkJCQkJCQkJaWYobm9kZSBpbnN0YW5jZW9mIFRhc2tOb2RlKXsKLQkJCQkJCQkJCQkJKChUYXNrTm9kZSlub2RlKS5zZXRJbmRleChpbmRleCk7Ci0JCQkJCQkJCQkJCWluZGV4Kys7Ci0JCQkJCQkJCQkJfQotCQkJCQkJCQkJCXJvd1Rhc2tzQ291bnQrKzsKLQkJCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJLy8gU29ydCB0aGUgdGFza05vZGUgYmFzZWQgb24gdGhlaXIgaW5kZXggaWYgYXV0b2xheW91dCBpcwotCQkJCQkvLyBmYWxzZQotCQkJCQlpZiAoIWF1dG9MYXlvdXQpIHsKLQkJCQkJCUNvbGxlY3Rpb25zLnNvcnQodGFza05vZGVzLCBjb21wYXJhdG9yKTsKLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCUxpc3Qgb2xkVGFza0Rlc2NyaXB0b3JzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQlEaWFncmFtIHVtYURpYWdyYW0gPSBnZXRVTUFEaWFncmFtKCk7Ci0JCQkJCWlmKHVtYURpYWdyYW0gIT0gbnVsbCkgewotCQkJCQkJLy8gTGFtZSB3YXkgb2YgZG9pbmcgdGhpcywgdG8gZml4IGEgZGVmZWN0IG9mIDEuMCB0byAxLjAuMSBtaWdyYXRpb24JCQkJICAKLQkJCQkJCUxpc3QgZ3JhcGhOb2RlcyA9IHVtYURpYWdyYW0uZ2V0Q29udGFpbmVkKCk7Ci0JCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBncmFwaE5vZGVzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQkJCUdyYXBoTm9kZSBlbGVtZW50ID0gKEdyYXBoTm9kZSkgaXRlci5uZXh0KCk7Ci0JCQkJCQkJT2JqZWN0IGJyaWRnZSA9IGVsZW1lbnQuZ2V0U2VtYW50aWNNb2RlbCgpOwotCQkJCQkJCWlmKGJyaWRnZSBpbnN0YW5jZW9mIFVNQVNlbWFudGljTW9kZWxCcmlkZ2UpewotCQkJCQkJCQlPYmplY3QgdGFza09iamVjdCA9ICgoVU1BU2VtYW50aWNNb2RlbEJyaWRnZSlicmlkZ2UpLmdldEVsZW1lbnQoKTsKLQkJCQkJCQkJTGlzdCBsaXN0ID0gZWxlbWVudC5nZXRMaXN0KFVtYVBhY2thZ2UuR1JBUEhfTk9ERV9fUFJPUEVSVFkpOwotCQkJCQkJCQlQcm9wZXJ0eSBwcm9wZXJ0eSA9IEdyYXBoaWNhbERhdGFIZWxwZXIuZ2V0UHJvcGVydHlCeUtleShsaXN0LAotCQkJCQkJCQkJCUdyYXBoaWNhbERhdGFIZWxwZXIuUFJPUF9XT1JLX1BST0RVQ1RfQ09NUE9TSVRFX1RZUEUpOwotCQkJCQkJCQlpZiAodGFza0Rlc2NyaXB0b3JzLmNvbnRhaW5zKHRhc2tPYmplY3QpICYmIHByb3BlcnR5ID09IG51bGwpIHsKLQkJCQkJCQkJCW9sZFRhc2tEZXNjcmlwdG9ycy5hZGQodGFza09iamVjdCk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBnZXROb2RlcygpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCQlOb2RlIG5vZGUgPSAoTm9kZSkgaXRlci5uZXh0KCk7Ci0JCQkJCQkJaWYobm9kZS5nZXRMaW5rZWRFbGVtZW50KCkgaW5zdGFuY2VvZiBUYXNrRGVzY3JpcHRvcikgewotCQkJCQkJCQlvbGRUYXNrRGVzY3JpcHRvcnMuYWRkKG5vZGUuZ2V0TGlua2VkRWxlbWVudCgpKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gb2xkVGFza0Rlc2NyaXB0b3JzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQkJVGFza0Rlc2NyaXB0b3IgdGFza0Rlc2NyaXB0b3IgPSAoVGFza0Rlc2NyaXB0b3IpIGl0ZXIubmV4dCgpOwotCi0JCQkJCQkvLyBlbGltaW5hdGUgZGVzY3JpcHRvciB0aGF0IGlzIGR1cGxpY2F0ZSwgc3VwcHJlc3NlZCBvciBmaWx0ZXJlZCBvdXQKLQkJCQkJCS8vCi0JCQkJCQlpZighc2VsZWN0ZWREZXNjcmlwdG9ycy5jb250YWlucyh0YXNrRGVzY3JpcHRvcikKLQkJCQkJCQkJJiYgY29udGFpbnMoYWxsRWxlbWVudHMsIHRhc2tEZXNjcmlwdG9yKSAvLyBtYWtlIHN1cmUgdGhhdCB0YXNrIGRlc2NyaXB0b3IgaXMgb2YgdGhlIG93bmluZyBhY3Rpdml0eQotCQkJCQkJKSB7Ci0JCQkJCQkJc2VsZWN0ZWREZXNjcmlwdG9ycy5hZGQodGFza0Rlc2NyaXB0b3IpOwkJCQkJCi0JCQkJCQkJTm9kZSBub2RlID0gR3JhcGhpY2FsRGF0YUhlbHBlci5maW5kTm9kZShnZXREaWFncmFtKCksCi0JCQkJCQkJCQl0YXNrRGVzY3JpcHRvciwgVGFza05vZGUuY2xhc3MpOwotCQkJCQkJCWlmIChub2RlID09IG51bGwpIHsKLQkJCQkJCQkJbm9kZSA9IGNyZWF0ZVRhc2tOb2RlKHRhc2tEZXNjcmlwdG9yKTsKLQkJCQkJCQkJKChOYW1lZE5vZGVJbXBsKSBub2RlKS5zZXRJdGVtUHJvdmlkZXIoYWxsRWxlbWVudHMpOwotCQkJCQkJCX0KLQkJCQkJCQl0YXNrTm9kZXMuYWRkKG5vZGUpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJaWYoIXRhc2tOb2Rlcy5pc0VtcHR5KCkpIHsKLQkJCQkvLyBhZGQgcm9sZSBub2RlCi0JCQkJLy8KLQkJCQlOYW1lZE5vZGVJbXBsIG5hbWVkTm9kZSA9ICgoTmFtZWROb2RlSW1wbCkgY3JlYXRlUm9sZU5vZGUocm9sZURlc2NyaXB0b3IpKTsKLQkJCQluYW1lZE5vZGUudmlzaWJsZSA9IHRydWU7Ci0JCQkJbmFtZWROb2RlLnNldEl0ZW1Qcm92aWRlcihhbGxFbGVtZW50cyk7Ci0JCQkJZ2V0Tm9kZXMoKS5hZGQobmFtZWROb2RlKTsJCQotCQkJCXRhc2tOb2Rlcy5hZGQobmFtZWROb2RlKTsKLQkJCX0KLQkJCXNlbGVjdE5vZGVzKHRhc2tOb2Rlcyk7Ci0JCX0KLQkJCi0JfQotCQotLy8JcHVibGljIE5vZGUgY3JlYXRlVGFza05vZGUoVGFza0Rlc2NyaXB0b3IgdGFza0Rlc2NyaXB0b3IsIGludCBpbmRleCwgQ29sbGVjdGlvbiBhbGxFbGVtZW50cykgewotLy8JCU5vZGUgbm9kZSA9IE1vZGVsRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlVGFza05vZGUoKTsKLS8vCQlub2RlLnNldERpYWdyYW0oZ2V0RGlhZ3JhbSgpKTsKLS8vCQlub2RlLnNldE9iamVjdCh0YXNrRGVzY3JpcHRvcik7Ci0vLwkJKChOYW1lZE5vZGVJbXBsKSBub2RlKS5zZXRJdGVtUHJvdmlkZXIoYWxsRWxlbWVudHMpOwotLy8JCWlmIChHcmFwaGljYWxEYXRhSGVscGVyLmZpbmRQcm9wZXJ0eShub2RlLmdldEdyYXBoTm9kZSgpLAotLy8JCQkJR3JhcGhpY2FsRGF0YUhlbHBlci5QUk9QX0lOREVYKSA9PSBudWxsCi0vLwkJCQl8fCBHcmFwaGljYWxEYXRhSGVscGVyCi0vLwkJCQkJCS5pc0F1dG9MYXlvdXQoKEFjdGl2aXR5RGV0YWlsRGlhZ3JhbSkgZ2V0RGlhZ3JhbSgpKSkgewotLy8JCQlHcmFwaGljYWxEYXRhSGVscGVyLmNyZWF0ZVByb3BlcnR5KG5vZGUuZ2V0R3JhcGhOb2RlKCksCi0vLwkJCQkJR3JhcGhpY2FsRGF0YUhlbHBlci5QUk9QX0lOREVYLCBuZXcgSW50ZWdlcihpbmRleCkKLS8vCQkJCQkJCS50b1N0cmluZygpKTsKLS8vCQkJaW5kZXgrKzsKLS8vCQl9Ci0vLwkJcmV0dXJuIG5vZGU7Ci0vLwl9Ci0JCi19IC8vIFJvbGVUYXNrQ29tcG9zaXRlSW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL2ltcGwvVGFza05vZGVJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvaW1wbC9UYXNrTm9kZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzVhMjFlMS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvaW1wbC9UYXNrTm9kZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkRpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Nb2RlbFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5UYXNrTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC51dGlsLkdyYXBoaWNhbERhdGFIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5UYXNrIE5vZGU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuVGFza05vZGVJbXBsI2dldEluZGV4IDxlbT5JbmRleDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFRhc2tOb2RlSW1wbCBleHRlbmRzIE5hbWVkTm9kZUltcGwgaW1wbGVtZW50cyBUYXNrTm9kZSB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEluZGV4KCkgPGVtPkluZGV4PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJbmRleCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgSU5ERVhfRURFRkFVTFQgPSAtMTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEluZGV4KCkgPGVtPkluZGV4PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJbmRleCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGludCBpbmRleCA9IElOREVYX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICovCi0JcHJvdGVjdGVkIFRhc2tOb2RlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQotCQltZXRob2RFbGVtZW50QWRhcHRlciA9IG5ldyBUYXNrRGVzY3JpcHRvckFkYXB0ZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBNb2RlbFBhY2thZ2UuTGl0ZXJhbHMuVEFTS19OT0RFOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0SW5kZXgoKSB7Ci0JCXJldHVybiBpbmRleDsKLQl9Ci0JCi0JcHVibGljIGludCBkb0dldEluZGV4KCkgewotCQlpZihpc0dyYXBoaWNhbERhdGFSZXF1aXJlZCgpKSB7Ci0JCQlQcm9wZXJ0eSBwcm9wID0gR3JhcGhpY2FsRGF0YUhlbHBlci5nZXRQcm9wZXJ0eSh0aGlzLCBHcmFwaGljYWxEYXRhSGVscGVyLlBST1BfSU5ERVgpOwotCQkJaWYocHJvcCAhPSBudWxsKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJaW50IGkgPSBJbnRlZ2VyLnBhcnNlSW50KHByb3AuZ2V0VmFsdWUoKSk7Ci0JCQkJCXJldHVybiBpOwotCQkJCX0KLQkJCQljYXRjaChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotCQkJCQkvLwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZ2V0SW5kZXgoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJbmRleChpbnQgbmV3SW5kZXgpIHsKLQkJaW50IG9sZEluZGV4ID0gaW5kZXg7Ci0JCWluZGV4ID0gbmV3SW5kZXg7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1vZGVsUGFja2FnZS5UQVNLX05PREVfX0lOREVYLCBvbGRJbmRleCwgaW5kZXgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgZG9TZXRJbmRleChpbnQgbmV3SW5kZXgpIHsKLQkJaWYoaXNHcmFwaGljYWxEYXRhUmVxdWlyZWQoKSkgewotCQkJR3JhcGhpY2FsRGF0YUhlbHBlci5jcmVhdGVQcm9wZXJ0eShnZXRHcmFwaE5vZGUoKSwgCi0JCQkJCUdyYXBoaWNhbERhdGFIZWxwZXIuUFJPUF9JTkRFWCwgU3RyaW5nLnZhbHVlT2YobmV3SW5kZXgpKTsKLQkJfQotCQllbHNlIHsKLQkJCXNldEluZGV4KG5ld0luZGV4KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgTW9kZWxQYWNrYWdlLlRBU0tfTk9ERV9fSU5ERVg6Ci0JCQkJcmV0dXJuIG5ldyBJbnRlZ2VyKGdldEluZGV4KCkpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5UQVNLX05PREVfX0lOREVYOgotCQkJCXNldEluZGV4KCgoSW50ZWdlciluZXdWYWx1ZSkuaW50VmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgTW9kZWxQYWNrYWdlLlRBU0tfTk9ERV9fSU5ERVg6Ci0JCQkJc2V0SW5kZXgoSU5ERVhfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBNb2RlbFBhY2thZ2UuVEFTS19OT0RFX19JTkRFWDoKLQkJCQlyZXR1cm4gaW5kZXggIT0gSU5ERVhfRURFRkFVTFQ7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChpbmRleDogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChpbmRleCk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotCXByaXZhdGUgY2xhc3MgVGFza0Rlc2NyaXB0b3JBZGFwdGVyIGV4dGVuZHMgTWV0aG9kRWxlbWVudEFkYXB0ZXIgewotCQkKLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCB2b2lkIGhhbmRsZU5vdGlmaWNhdGlvbihOb3RpZmljYXRpb24gbXNnKSB7Ci0JCQlib29sZWFuIGhhbmRsZWQgPSBmYWxzZTsKLQkJCXN3aXRjaCAobXNnLmdldEZlYXR1cmVJRChUYXNrRGVzY3JpcHRvci5jbGFzcykpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX01BTkRBVE9SWV9JTlBVVDoKLQkJCQloYW5kbGVkID0gdHJ1ZTsKLQkJCQlicmVhazsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX09VVFBVVDoKLQkJCQloYW5kbGVkID0gdHJ1ZTsKLQkJCQlicmVhazsJCQkJCi0JCQl9Ci0JCQlpZihoYW5kbGVkICYmIChtc2cuZ2V0RXZlbnRUeXBlKCkgPT0gTm90aWZpY2F0aW9uLkFERCB8fCBtc2cuZ2V0RXZlbnRUeXBlKCkgPT0gTm90aWZpY2F0aW9uLkFERF9NQU5ZKSkgeyAKLQkJCQlBY3Rpdml0eURldGFpbERpYWdyYW1JbXBsIGRpYWdyYW0gPSAoQWN0aXZpdHlEZXRhaWxEaWFncmFtSW1wbCkgZ2V0RGlhZ3JhbSgpOwotCQkJCWlmKGRpYWdyYW0gIT0gbnVsbCkgewotLy8JCQkJCWRpYWdyYW0uc2V0T2JqZWN0KGRpYWdyYW0uZ2V0T2JqZWN0KCkpOwotCQkJCQlDb2xsZWN0aW9uIGlucHV0T3VwdXROb2RlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJZGlhZ3JhbS5jcmVhdGVUYXNrSW5wdXRPdXRwdXROb2RlcygoVGFza0Rlc2NyaXB0b3IpIG1zZy5nZXROb3RpZmllcigpLCBpbnB1dE91cHV0Tm9kZXMpOwotCQkJCQlpZighaW5wdXRPdXB1dE5vZGVzLmlzRW1wdHkoKSkgewotCQkJCQkJZGlhZ3JhbS5nZXROb2RlcygpLmFkZEFsbChpbnB1dE91cHV0Tm9kZXMpOwotCQkJCQkJZGlhZ3JhbS5wb3B1bGF0ZUxpbmtzKGlucHV0T3VwdXROb2RlcywgZmFsc2UpOwotCQkJCQl9Ci0JCQkJfQotCQkJCXJldHVybjsKLQkJCX0KLQotLy8JCQlNZXRob2RFbGVtZW50IG9iajsKLS8vCQkJc3dpdGNoIChtc2cuZ2V0RmVhdHVyZUlEKFRhc2tEZXNjcmlwdG9yLmNsYXNzKSkgewotLy8JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19NQU5EQVRPUllfSU5QVVQ6Ci0vLwkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX09QVElPTkFMX0lOUFVUOgotLy8JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19FWFRFUk5BTF9JTlBVVDoKLS8vCQkJCXN3aXRjaCAobXNnLmdldEV2ZW50VHlwZSgpKSB7Ci0vLwkJCQljYXNlIE5vdGlmaWNhdGlvbi5BREQ6Ci0vLwkJCQkJb2JqID0gKE1ldGhvZEVsZW1lbnQpIG1zZy5nZXROZXdWYWx1ZSgpOwotLy8JCQkJCWFkZEluY29taW5nQ29ubmVjdGlvbihvYmopOwotLy8JCQkJCXJldHVybjsKLS8vCQkJCWNhc2UgTm90aWZpY2F0aW9uLlJFTU9WRToKLS8vCQkJCQlvYmogPSAoTWV0aG9kRWxlbWVudCkgbXNnLmdldE9sZFZhbHVlKCk7Ci0vLwkJCQkJcmVtb3ZlSW5jb21pbmdDb25uZWN0aW9uKG9iaik7Ci0vLwkJCQkJcmV0dXJuOwotLy8JCQkJY2FzZSBOb3RpZmljYXRpb24uQUREX01BTlk6Ci0vLwkJCQkJQ29sbGVjdGlvbiBjb2xsZWN0aW9uID0gKENvbGxlY3Rpb24pIG1zZy5nZXROZXdWYWx1ZSgpOwotLy8JCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGNvbGxlY3Rpb24uaXRlcmF0b3IoKTsgaXRlcgotLy8JCQkJCQkJLmhhc05leHQoKTspIHsKLS8vCQkJCQkJb2JqID0gKE1ldGhvZEVsZW1lbnQpIGl0ZXIubmV4dCgpOwotLy8JCQkJCQlhZGRJbmNvbWluZ0Nvbm5lY3Rpb24ob2JqKTsKLS8vCQkJCQl9Ci0vLwkJCQkJcmV0dXJuOwotLy8JCQkJY2FzZSBOb3RpZmljYXRpb24uUkVNT1ZFX01BTlk6Ci0vLwkJCQkJY29sbGVjdGlvbiA9IChDb2xsZWN0aW9uKSBtc2cuZ2V0T2xkVmFsdWUoKTsKLS8vCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjb2xsZWN0aW9uLml0ZXJhdG9yKCk7IGl0ZXIKLS8vCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0vLwkJCQkJCW9iaiA9IChNZXRob2RFbGVtZW50KSBpdGVyLm5leHQoKTsKLS8vCQkJCQkJcmVtb3ZlSW5jb21pbmdDb25uZWN0aW9uKG9iaik7Ci0vLwkJCQkJfQotLy8JCQkJCXJldHVybjsKLS8vCQkJCX0KLS8vCQkJCWJyZWFrOwotLy8JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19PVVRQVVQ6Ci0vLwkJCQlzd2l0Y2ggKG1zZy5nZXRFdmVudFR5cGUoKSkgewotLy8JCQkJY2FzZSBOb3RpZmljYXRpb24uQUREOgotLy8JCQkJCW9iaiA9IChNZXRob2RFbGVtZW50KSBtc2cuZ2V0TmV3VmFsdWUoKTsKLS8vCQkJCQlhZGRPdXRnb2luZ0Nvbm5lY3Rpb24ob2JqKTsKLS8vCQkJCQlyZXR1cm47Ci0vLwkJCQljYXNlIE5vdGlmaWNhdGlvbi5SRU1PVkU6Ci0vLwkJCQkJb2JqID0gKE1ldGhvZEVsZW1lbnQpIG1zZy5nZXRPbGRWYWx1ZSgpOwotLy8JCQkJCXJlbW92ZU91dGdvaW5nQ29ubmVjdGlvbihvYmopOwotLy8JCQkJCXJldHVybjsKLS8vCQkJCWNhc2UgTm90aWZpY2F0aW9uLkFERF9NQU5ZOgotLy8JCQkJCUNvbGxlY3Rpb24gY29sbGVjdGlvbiA9IChDb2xsZWN0aW9uKSBtc2cuZ2V0TmV3VmFsdWUoKTsKLS8vCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjb2xsZWN0aW9uLml0ZXJhdG9yKCk7IGl0ZXIKLS8vCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0vLwkJCQkJCW9iaiA9IChNZXRob2RFbGVtZW50KSBpdGVyLm5leHQoKTsKLS8vCQkJCQkJYWRkT3V0Z29pbmdDb25uZWN0aW9uKG9iaik7Ci0vLwkJCQkJfQotLy8JCQkJCXJldHVybjsKLS8vCQkJCWNhc2UgTm90aWZpY2F0aW9uLlJFTU9WRV9NQU5ZOgotLy8JCQkJCWNvbGxlY3Rpb24gPSAoQ29sbGVjdGlvbikgbXNnLmdldE9sZFZhbHVlKCk7Ci0vLwkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gY29sbGVjdGlvbi5pdGVyYXRvcigpOyBpdGVyCi0vLwkJCQkJCQkuaGFzTmV4dCgpOykgewotLy8JCQkJCQlvYmogPSAoTWV0aG9kRWxlbWVudCkgaXRlci5uZXh0KCk7Ci0vLwkJCQkJCXJlbW92ZU91dGdvaW5nQ29ubmVjdGlvbihvYmopOwotLy8JCQkJCX0KLS8vCQkJCQlyZXR1cm47Ci0vLwkJCQl9Ci0vLwkJCQlicmVhazsKLS8vCQkJfQotCi0JCQlzdXBlci5oYW5kbGVOb3RpZmljYXRpb24obXNnKTsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwudXRpbC5JTm9kZUNoYW5nZUxpc3RlbmVyI2dldE5vZGUoKQotCQkgKi8KLQkJcHVibGljIE5vZGUgZ2V0Tm9kZSgpIHsKLQkJCXJldHVybiBUYXNrTm9kZUltcGwudGhpczsKLQkJfQotCX0KLQotCS8vIC8qIChub24tSmF2YWRvYykKLQkvLyAqIEBzZWUKLQkvLyBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLk5hbWVkTm9kZUltcGwjc2V0T2JqZWN0KGphdmEubGFuZy5PYmplY3QpCi0JLy8gKi8KLQkvLyBwdWJsaWMgdm9pZCBzZXRPYmplY3QoT2JqZWN0IG5ld09iamVjdCkgewotCS8vIE9iamVjdCBvbGRPYmplY3QgPSBvYmplY3Q7Ci0JLy8gb2JqZWN0ID0gbmV3T2JqZWN0OwotCS8vIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkvLyBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCS8vIE1vZGVsUGFja2FnZS5MSU5LRURfT0JKRUNUX19PQkpFQ1QsIG9sZE9iamVjdCwgb2JqZWN0KSk7Ci0JLy8KLQkvLyBpZihuZXdPYmplY3QgPT0gbnVsbCkgcmV0dXJuOwotCS8vCQkKLQkvLyBNZXRob2RFbGVtZW50IGVsZW1lbnQgPSAoTWV0aG9kRWxlbWVudCkgbmV3T2JqZWN0OwotCS8vIGlmKGVsZW1lbnQgIT0gbnVsbCAmJiBnZXRNZXRob2RFbGVtZW50QWRhcHRlclR5cGUoKSAhPSBudWxsKSB7Ci0JLy8gLy8gcmVtb3ZlIG9sZCBtZXRob2RFbGVtZW50QWRhcHRlcgotCS8vIC8vCi0JLy8gT2JqZWN0IG9sZEFkYXB0ZXIgPSBVbWFVdGlsLmdldEFkYXB0ZXIoZWxlbWVudCwKLQkvLyBnZXRNZXRob2RFbGVtZW50QWRhcHRlclR5cGUoKSk7Ci0JLy8gaWYob2xkQWRhcHRlciAhPSBudWxsKSB7Ci0JLy8gZWxlbWVudC5lQWRhcHRlcnMoKS5yZW1vdmUob2xkQWRhcHRlcik7Ci0JLy8gfQotCS8vIH0KLQkvLyBncmFwaE5vZGUgPQotCS8vIEdyYXBoaWNhbERhdGFNYW5hZ2VyLmdldEluc3RhbmNlKCkuZ2V0R3JhcGhOb2RlKGdldFVNQURpYWdyYW0oKSwKLQkvLyBlbGVtZW50KTsKLQkvLyAgICAgICAgCi0JLy8gLy8gU3lzdGVtLm91dC5wcmludGxuKCJOb2RlSW1wbC5zZXRPYmplY3QoKTogZWxlbWVudDogJyIgKwotCS8vIGVsZW1lbnQuZ2V0TmFtZSgpICsgIicsIGdyYXBoTm9kZTogIiArIGdyYXBoTm9kZSk7Ci0JLy8gICAgICAgIAotCS8vIC8vIHBvcHVsYXRlIGRhdGEKLQkvLyAvLwotCS8vIHNldEhlaWdodChncmFwaE5vZGUuZ2V0U2l6ZSgpLmdldEhlaWdodCgpLmludFZhbHVlKCkpOwotCS8vIHNldExvY2F0aW9uKEdyYXBoaWNhbERhdGFIZWxwZXIudG9Qb2ludChncmFwaE5vZGUuZ2V0UG9zaXRpb24oKSkpOwotCS8vIHNldFdpZHRoKGdyYXBoTm9kZS5nZXRTaXplKCkuZ2V0V2lkdGgoKS5pbnRWYWx1ZSgpKTsKLQkvLyAgICAgICAgCi0JLy8gLy8gYWRkIG1ldGhvZEVsZW1lbnRBZGFwdGVyCi0JLy8gLy8KLQkvLyBpZihtZXRob2RFbGVtZW50QWRhcHRlciAhPSBudWxsKSB7Ci0JLy8gZWxlbWVudC5lQWRhcHRlcnMoKS5hZGQobWV0aG9kRWxlbWVudEFkYXB0ZXIpOwotCS8vIH0KLQkvLyAgICAgICAgCi0JLy8gdGhpcy5lQWRhcHRlcnMoKS5hZGQoY3JlYXRlTm9kZUFkYXB0ZXIoKSk7Ci0JLy8KLQkvLyBzZXROYW1lKGVsZW1lbnQuZ2V0TmFtZSgpKTsKLQkvLyB9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuTm9kZUltcGwjYWRkVG9VTUEob3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTGluaykKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBhZGRUb1VNQShMaW5rIGxpbmspIHsKLQkJaWYgKCFzdXBlci5hZGRUb1VNQShsaW5rKSkKLQkJCXJldHVybiBmYWxzZTsKLQotCQkvL1Rhc2tEZXNjcmlwdG9yIHRhc2tEZXNjID0gKFRhc2tEZXNjcmlwdG9yKSBnZXRPYmplY3QoKTsKLQkJTm9kZUltcGwgbm9kZUltcGwgPSAoTm9kZUltcGwpIGxpbmsuZ2V0U291cmNlKCk7Ci0JCWJvb2xlYW4gbm90aWZ5ID0gbm90aWZpY2F0aW9uRW5hYmxlZDsKLQkJYm9vbGVhbiBub3RpZnlTb3VyY2UgPSBub2RlSW1wbC5ub3RpZmljYXRpb25FbmFibGVkOwotCQl0cnkgewotCQkJbm90aWZpY2F0aW9uRW5hYmxlZCA9IGZhbHNlOwotCQkJbm9kZUltcGwubm90aWZpY2F0aW9uRW5hYmxlZCA9IGZhbHNlOwotCQkJLy8gdGFza0Rlc2MuZ2V0TWFuZGF0b3J5SW5wdXQoKS5hZGQobGluay5nZXRTb3VyY2UoKS5nZXRPYmplY3QoKSk7Ci0JCX0gZmluYWxseSB7Ci0JCQlub3RpZmljYXRpb25FbmFibGVkID0gbm90aWZ5OwotCQkJbm9kZUltcGwubm90aWZpY2F0aW9uRW5hYmxlZCA9IG5vdGlmeVNvdXJjZTsKLQkJfQotCi0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5Ob2RlSW1wbCNyZW1vdmVGcm9tVU1BKG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkxpbmssCi0JICogICAgICBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlLCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbW92ZUZyb21VTUEoTGluayBsaW5rLCBOb2RlIG9sZFNvdXJjZSwgTm9kZSBvbGRUYXJnZXQpIHsKLQkJVGFza0Rlc2NyaXB0b3IgdGFza0Rlc2MgPSAoVGFza0Rlc2NyaXB0b3IpIGdldE9iamVjdCgpOwotCQl0YXNrRGVzYy5nZXRPdXRwdXQoKS5yZW1vdmUobGluay5nZXRUYXJnZXQoKS5nZXRPYmplY3QoKSk7Ci0KLQkJc3VwZXIucmVtb3ZlRnJvbVVNQShsaW5rLCBvbGRTb3VyY2UsIG9sZFRhcmdldCk7Ci0JfQotCi19IC8vIFRhc2tOb2RlSW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL2ltcGwvVHlwZWROb2RlSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL2ltcGwvVHlwZWROb2RlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOWY5ZmEzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9pbXBsL1R5cGVkTm9kZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Nb2RlbFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5UeXBlZE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuV29ya0JyZWFrZG93bkVsZW1lbnROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLnV0aWwuR3JhcGhpY2FsRGF0YUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtCcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5VbWFVdGlsOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlR5cGVkIE5vZGU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuVHlwZWROb2RlSW1wbCNnZXRUeXBlIDxlbT5UeXBlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgVHlwZWROb2RlSW1wbCBleHRlbmRzIE5vZGVJbXBsIGltcGxlbWVudHMgVHlwZWROb2RlIHsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VHlwZSgpIDxlbT5UeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgVFlQRV9FREVGQVVMVCA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUeXBlKCkgPGVtPlR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgaW50IHR5cGUgPSBUWVBFX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBUeXBlZE5vZGVJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIE1vZGVsUGFja2FnZS5MaXRlcmFscy5UWVBFRF9OT0RFOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgaW50IGdldFR5cGUoKSB7Ci0JCXJldHVybiB0eXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUeXBlKGludCBuZXdUeXBlKSB7Ci0JCWludCBvbGRUeXBlID0gdHlwZTsKLQkJdHlwZSA9IG5ld1R5cGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1vZGVsUGFja2FnZS5UWVBFRF9OT0RFX19UWVBFLCBvbGRUeXBlLCB0eXBlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBNb2RlbFBhY2thZ2UuVFlQRURfTk9ERV9fVFlQRToKLQkJCQlyZXR1cm4gbmV3IEludGVnZXIoZ2V0VHlwZSgpKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBNb2RlbFBhY2thZ2UuVFlQRURfTk9ERV9fVFlQRToKLQkJCQlzZXRUeXBlKCgoSW50ZWdlciluZXdWYWx1ZSkuaW50VmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgTW9kZWxQYWNrYWdlLlRZUEVEX05PREVfX1RZUEU6Ci0JCQkJc2V0VHlwZShUWVBFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgTW9kZWxQYWNrYWdlLlRZUEVEX05PREVfX1RZUEU6Ci0JCQkJcmV0dXJuIHR5cGUgIT0gVFlQRV9FREVGQVVMVDsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiICh0eXBlOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKHR5cGUpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBiYXNpY1NldE9iamVjdChPYmplY3QgbmV3T2JqZWN0KSB7Ci0JCS8vcG9wdWxhdGUgZGF0YSBmcm9tIGxpbmtlZCBHcmFwaE5vZGUKLQkJLy8gCi0JCWdyYXBoTm9kZSA9IChHcmFwaE5vZGUpIG5ld09iamVjdDsKLQkJc2V0V2lkdGgoZ3JhcGhOb2RlLmdldFNpemUoKS5nZXRXaWR0aCgpLmludFZhbHVlKCkpOwotCQlzZXRIZWlnaHQoZ3JhcGhOb2RlLmdldFNpemUoKS5nZXRIZWlnaHQoKS5pbnRWYWx1ZSgpKTsKLQkJc2V0TG9jYXRpb24oR3JhcGhpY2FsRGF0YUhlbHBlci50b1BvaW50KGdyYXBoTm9kZS5nZXRQb3NpdGlvbigpKSk7Ci0vLwkJIHRoaXMuZUFkYXB0ZXJzKCkuYWRkKG5ldyBBZGFwdGVySW1wbCgpIHsKLQkJLy8gLyogKG5vbi1KYXZhZG9jKQotCQkvLyAqIEBzZWUKLQkJLy8gb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVySW1wbCNub3RpZnlDaGFuZ2VkKG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbikKLQkJLy8gKi8KLQkJLy8gcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbXNnKSB7Ci0JCS8vIEdyYXBoTm9kZSBncmFwaE5vZGUgPSAoR3JhcGhOb2RlKSBnZXRPYmplY3QoKTsKLQkJLy8gc3dpdGNoKG1zZy5nZXRGZWF0dXJlSUQoVHlwZWROb2RlLmNsYXNzKSkgewotCQkvLyBjYXNlIE1vZGVsUGFja2FnZS5UWVBFRF9OT0RFX19XSURUSDoKLQkJLy8gZ3JhcGhOb2RlLmdldFNpemUoKS5zZXRXaWR0aChuZXcgRG91YmxlKG1zZy5nZXROZXdJbnRWYWx1ZSgpKSk7Ci0JCS8vIHJldHVybjsKLQkJLy8gICAgICAgICAgICAgICAgICAgIAotCQkvLyBjYXNlIE1vZGVsUGFja2FnZS5UWVBFRF9OT0RFX19IRUlHSFQ6Ci0JCS8vIGdyYXBoTm9kZS5nZXRTaXplKCkuc2V0SGVpZ2h0KG5ldyBEb3VibGUobXNnLmdldE5ld0ludFZhbHVlKCkpKTsKLQkJLy8gcmV0dXJuOwotCQkvLyAgICAgICAgICAgICAgICAgICAgICAgIAotCQkvLyBjYXNlIE1vZGVsUGFja2FnZS5UWVBFRF9OT0RFX19MT0NBVElPTjoKLQkJLy8gUG9pbnQgcCA9IChQb2ludCkgbXNnLmdldE5ld1ZhbHVlKCk7Ci0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiVHlwZWROb2RlSW1wbCQubm90aWZ5Q2hhbmdlZCgpOiBuZXcgbG9jYXRpb246ICIgKwotCQkvLyBwICsgIi4gIiArIFR5cGVkTm9kZUltcGwudGhpcyk7Ci0JCS8vIGdyYXBoTm9kZS5nZXRQb3NpdGlvbigpLnNldFgobmV3IERvdWJsZShwLngpKTsKLQkJLy8gZ3JhcGhOb2RlLmdldFBvc2l0aW9uKCkuc2V0WShuZXcgRG91YmxlKHAueSkpOwotCQkvLyByZXR1cm47Ci0JCS8vICAgICAgICAgICAgICAgICAgICAKLQkJLy8gY2FzZSBNb2RlbFBhY2thZ2UuVFlQRURfTk9ERV9fSU5DT01JTkdfQ09OTkVDVElPTlM6Ci0JCS8vIExpbmsgbGluazsKLQkJLy8gc3dpdGNoKG1zZy5nZXRFdmVudFR5cGUoKSkgewotCQkvLyBjYXNlIE5vdGlmaWNhdGlvbi5BREQ6Ci0JCS8vIGFkZFRvVU1BKChMaW5rKSBtc2cuZ2V0TmV3VmFsdWUoKSk7Ci0JCS8vIGJyZWFrOwotCQkvLyBjYXNlIE5vdGlmaWNhdGlvbi5BRERfTUFOWToKLQkJLy8gZm9yIChJdGVyYXRvciBpdGVyID0gKChDb2xsZWN0aW9uKW1zZy5nZXROZXdWYWx1ZSgpKS5pdGVyYXRvcigpOyBpdGVyCi0JCS8vIC5oYXNOZXh0KCk7KSB7Ci0JCS8vIGFkZFRvVU1BKChMaW5rKSBpdGVyLm5leHQoKSk7Ci0JCS8vIH0KLQkJLy8gYnJlYWs7Ci0JCS8vIGNhc2UgTm90aWZpY2F0aW9uLlJFTU9WRToKLQkJLy8gbGluayA9IChMaW5rKSBtc2cuZ2V0T2xkVmFsdWUoKTsKLQkJLy8gaWYobGluay5nZXRTb3VyY2UoKSAhPSBudWxsKSB7Ci0JCS8vICgoTm9kZUltcGwpbGluay5nZXRTb3VyY2UoKSkucmVtb3ZlRnJvbVVNQShsaW5rLCBsaW5rLmdldFNvdXJjZSgpLAotCQkvLyAoTm9kZSltc2cuZ2V0Tm90aWZpZXIoKSk7Ci0JCS8vIH0KLQkJLy8gYnJlYWs7Ci0JCS8vIGNhc2UgTm90aWZpY2F0aW9uLlJFTU9WRV9NQU5ZOgotCQkvLyBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSAoKENvbGxlY3Rpb24pbXNnLmdldE9sZFZhbHVlKCkpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJLy8gLmhhc05leHQoKTspIHsKLQkJLy8gbGluayA9IChMaW5rKSBpdGVyLm5leHQoKTsKLQkJLy8gaWYobGluay5nZXRTb3VyY2UoKSAhPSBudWxsKSB7Ci0JCS8vICgoTm9kZUltcGwpbGluay5nZXRTb3VyY2UoKSkucmVtb3ZlRnJvbVVNQShsaW5rLCBsaW5rLmdldFNvdXJjZSgpLAotCQkvLyAoTm9kZSltc2cuZ2V0Tm90aWZpZXIoKSk7Ci0JCS8vIH0KLQkJLy8gfQotCQkvLyBicmVhazsKLQkJLy8gfQotCQkvLyByZXR1cm47Ci0JCS8vCi0JCS8vIGNhc2UgTW9kZWxQYWNrYWdlLlRZUEVEX05PREVfX09VVEdPSU5HX0NPTk5FQ1RJT05TOgotCQkvLyBzd2l0Y2gobXNnLmdldEV2ZW50VHlwZSgpKSB7Ci0JCS8vIGNhc2UgTm90aWZpY2F0aW9uLkFERDoKLQkJLy8gYWRkVG9VTUEoKExpbmspIG1zZy5nZXROZXdWYWx1ZSgpKTsKLQkJLy8gYnJlYWs7Ci0JCS8vIGNhc2UgTm90aWZpY2F0aW9uLkFERF9NQU5ZOgotCQkvLyBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSAoKENvbGxlY3Rpb24pbXNnLmdldE5ld1ZhbHVlKCkpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJLy8gLmhhc05leHQoKTspIHsKLQkJLy8gYWRkVG9VTUEoKExpbmspIGl0ZXIubmV4dCgpKTsKLQkJLy8gfQotCQkvLyBicmVhazsKLQkJLy8KLQkJLy8gY2FzZSBOb3RpZmljYXRpb24uUkVNT1ZFOgotCQkvLyBsaW5rID0gKExpbmspIG1zZy5nZXRPbGRWYWx1ZSgpOwotCQkvLyBpZihsaW5rLmdldFRhcmdldCgpICE9IG51bGwpIHsKLQkJLy8gcmVtb3ZlRnJvbVVNQShsaW5rLCAoTm9kZSltc2cuZ2V0Tm90aWZpZXIoKSwgbGluay5nZXRUYXJnZXQoKSk7Ci0JCS8vIH0KLQkJLy8gYnJlYWs7Ci0JCS8vIGNhc2UgTm90aWZpY2F0aW9uLlJFTU9WRV9NQU5ZOgotCQkvLyBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSAoKENvbGxlY3Rpb24pbXNnLmdldE9sZFZhbHVlKCkpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJLy8gLmhhc05leHQoKTspIHsKLQkJLy8gbGluayA9IChMaW5rKSBpdGVyLm5leHQoKTsKLQkJLy8gaWYobGluay5nZXRUYXJnZXQoKSAhPSBudWxsKSB7Ci0JCS8vIHJlbW92ZUZyb21VTUEobGluaywgKE5vZGUpbXNnLmdldE5vdGlmaWVyKCksIGxpbmsuZ2V0VGFyZ2V0KCkpOwotCQkvLyB9Ci0JCS8vIH0KLQkJLy8gYnJlYWs7Ci0JCS8vIH0KLQkJLy8gcmV0dXJuOwotCQkvLyB9Ci0JCS8vIH0KLQkJLy8KLQkJLy8gfSk7Ci0JCWVBZGFwdGVycygpLmFkZChuZXcgTm9kZUFkYXB0ZXIoKSk7Ci0JfQotCQotCXB1YmxpYyBDbGFzcyBnZXRNZXRob2RFbGVtZW50QWRhcHRlclR5cGUoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGFkZFRvVU1BKExpbmsgbGluaykgewotCQlpZiAoIXN1cGVyLmFkZFRvVU1BKGxpbmspKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCWlmIChsaW5rLmdldFNvdXJjZSgpIGluc3RhbmNlb2YgV29ya0JyZWFrZG93bkVsZW1lbnROb2RlKSB7Ci0JCQlpZiAobGluay5nZXRUYXJnZXQoKSBpbnN0YW5jZW9mIFR5cGVkTm9kZQotCQkJCQkmJiAoKFR5cGVkTm9kZSkgbGluay5nZXRUYXJnZXQoKSkuZ2V0VHlwZSgpID09IFR5cGVkTm9kZS5TWU5DSF9CQVIpIHsKLQkJCQlDb2xsZWN0aW9uIHRhcmdldEFjdE5vZGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCUdyYXBoaWNhbERhdGFIZWxwZXIuZ2V0U3luY0JhclRhcmdldE5vZGVzKChUeXBlZE5vZGUpIGxpbmsKLQkJCQkJCS5nZXRUYXJnZXQoKSwgdGFyZ2V0QWN0Tm9kZXMpOwotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHRhcmdldEFjdE5vZGVzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQlOYW1lZE5vZGVJbXBsIG5vZGUgPSAoKE5hbWVkTm9kZUltcGwpIGl0ZXIubmV4dCgpKTsKLQkJCQkJaWYgKFVtYVV0aWwuZmluZFdvcmtPcmRlcigoV29ya0JyZWFrZG93bkVsZW1lbnQpIG5vZGUKLQkJCQkJCQkuZ2V0T2JqZWN0KCksIChXb3JrQnJlYWtkb3duRWxlbWVudCkgbGluawotCQkJCQkJCS5nZXRTb3VyY2UoKS5nZXRPYmplY3QoKSkgPT0gbnVsbCkgewotCQkJCQkJYWRkRGVmYXVsdFdvcmtPcmRlcihub2RlLCAoV29ya0JyZWFrZG93bkVsZW1lbnQpIGxpbmsKLQkJCQkJCQkJLmdldFNvdXJjZSgpLmdldE9iamVjdCgpKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSBlbHNlIGlmIChsaW5rLmdldFNvdXJjZSgpIGluc3RhbmNlb2YgVHlwZWROb2RlKSB7Ci0JCQkvLyBQcmVkZWNlc3NvciBzaG91bGQgYmUgY3JlYXRlZCBvbmx5IGluIGNhc2Ugb2YKLQkJCS8vIFN5bmNyb25pemF0aW9uIEJhciwgbm90IGZvciBEZWNpc2lvblBvaW50LgotCQkJaWYgKCgoVHlwZWROb2RlKSBsaW5rLmdldFNvdXJjZSgpKS5nZXRUeXBlKCkgPT0gVHlwZWROb2RlLlNZTkNIX0JBUikgewotCQkJCUNvbGxlY3Rpb24gc3JjQWN0Tm9kZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJR3JhcGhpY2FsRGF0YUhlbHBlci5nZXRTeW5jQmFyU291cmNlTm9kZXMoKFR5cGVkTm9kZSkgbGluawotCQkJCQkJLmdldFNvdXJjZSgpLCBzcmNBY3ROb2Rlcyk7Ci0JCQkJQ29sbGVjdGlvbiB0YXJnZXRBY3ROb2RlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQlHcmFwaGljYWxEYXRhSGVscGVyLmdldFN5bmNCYXJUYXJnZXROb2RlcygoVHlwZWROb2RlKSBsaW5rCi0JCQkJCQkuZ2V0VGFyZ2V0KCksIHRhcmdldEFjdE5vZGVzKTsKLQotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHRhcmdldEFjdE5vZGVzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQlOYW1lZE5vZGVJbXBsIG5vZGUgPSAoKE5hbWVkTm9kZUltcGwpIGl0ZXIubmV4dCgpKTsKLQkJCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IHNyY0FjdE5vZGVzLml0ZXJhdG9yKCk7IGl0ZXJhdG9yCi0JCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCVdvcmtCcmVha2Rvd25FbGVtZW50IHByZWQgPSAoV29ya0JyZWFrZG93bkVsZW1lbnQpICgoTm9kZSkgaXRlcmF0b3IKLQkJCQkJCQkJLm5leHQoKSkuZ2V0T2JqZWN0KCk7Ci0JCQkJCQlpZiAoVW1hVXRpbC5maW5kV29ya09yZGVyKChXb3JrQnJlYWtkb3duRWxlbWVudCkgbm9kZQotCQkJCQkJCQkuZ2V0T2JqZWN0KCksIHByZWQpID09IG51bGwpIHsKLQkJCQkJCQlhZGREZWZhdWx0V29ya09yZGVyKG5vZGUsIHByZWQpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlRnJvbVVNQShMaW5rIGxpbmssIE5vZGUgb2xkU291cmNlLCBOb2RlIG9sZFRhcmdldCkgewotCQlUeXBlZE5vZGUgdHlwZWROb2RlID0gKFR5cGVkTm9kZSkgb2xkU291cmNlOwotCQlDb2xsZWN0aW9uIHNyY0FjdE5vZGVzID0gR3JhcGhpY2FsRGF0YUhlbHBlci5nZXRTb3VyY2VOb2Rlcyh0eXBlZE5vZGUsCi0JCQkJV29ya0JyZWFrZG93bkVsZW1lbnROb2RlLmNsYXNzKTsKLQotCQlpZiAob2xkVGFyZ2V0IGluc3RhbmNlb2YgV29ya0JyZWFrZG93bkVsZW1lbnROb2RlKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gc3JjQWN0Tm9kZXMuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJCS8vIE9iamVjdCBwcmVkID0gKChOb2RlKSBpdGVyYXRvci5uZXh0KCkpLmdldE9iamVjdCgpOwotCQkJCS8vIEdyYXBoaWNhbERhdGFIZWxwZXIucmVtb3ZlV29ya09yZGVyKChOYW1lZE5vZGVJbXBsKQotCQkJCS8vIG9sZFRhcmdldCwgcHJlZCk7Ci0JCQkJTm9kZSBub2RlID0gKE5vZGUpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQlpZiAoR3JhcGhpY2FsRGF0YUhlbHBlcgotCQkJCQkJLmNhblJlbW92ZUFsbFByZWRzKGxpbmssIG5vZGUsIG9sZFRhcmdldCkpIHsKLQkJCQkJd2hpbGUgKFVtYVV0aWwuZmluZFdvcmtPcmRlcigKLQkJCQkJCQkoV29ya0JyZWFrZG93bkVsZW1lbnQpIG9sZFRhcmdldC5nZXRPYmplY3QoKSwKLQkJCQkJCQkoV29ya0JyZWFrZG93bkVsZW1lbnQpIG5vZGUuZ2V0T2JqZWN0KCkpICE9IG51bGwpIHsKLQkJCQkJCVVtYVV0aWwucmVtb3ZlV29ya09yZGVyKAotCQkJCQkJCQkoV29ya0JyZWFrZG93bkVsZW1lbnQpIG9sZFRhcmdldC5nZXRPYmplY3QoKSwKLQkJCQkJCQkJKFdvcmtCcmVha2Rvd25FbGVtZW50KSBub2RlLmdldE9iamVjdCgpKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSBlbHNlIGlmIChvbGRUYXJnZXQgaW5zdGFuY2VvZiBUeXBlZE5vZGUpIHsKLQkJCUNvbGxlY3Rpb24gdGFyZ2V0QWN0Tm9kZXMgPSBHcmFwaGljYWxEYXRhSGVscGVyLmdldFRhcmdldE5vZGVzKAotCQkJCQkoVHlwZWROb2RlKSBvbGRUYXJnZXQsIFdvcmtCcmVha2Rvd25FbGVtZW50Tm9kZS5jbGFzcyk7Ci0KLQkJCS8vIHJlbW92ZSB0aGUgd29yayBvcmRlcnMgb2YgdGFyZ2V0IGFjdGl2aXRpZXMgdGhhdCBoYXZlIHRoZQotCQkJLy8gcHJlZGVjZXNzb3IgaW4gc3JjQWN0Tm9kZXMKLQkJCS8vCi0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB0YXJnZXRBY3ROb2Rlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlOYW1lZE5vZGVJbXBsIG5vZGUgPSAoKE5hbWVkTm9kZUltcGwpIGl0ZXIubmV4dCgpKTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gc3JjQWN0Tm9kZXMuaXRlcmF0b3IoKTsgaXRlcmF0b3IKLQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCS8vIE9iamVjdCBwcmVkID0gKChOb2RlKSBpdGVyYXRvci5uZXh0KCkpLmdldE9iamVjdCgpOwotCQkJCQkvLyBHcmFwaGljYWxEYXRhSGVscGVyLnJlbW92ZVdvcmtPcmRlcihub2RlLCBwcmVkKTsKLQkJCQkJTm9kZSBwcmVkbm9kZSA9IChOb2RlKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCWlmIChHcmFwaGljYWxEYXRhSGVscGVyLmNhblJlbW92ZUFsbFByZWRzKGxpbmssIHByZWRub2RlLAotCQkJCQkJCW5vZGUpKSB7Ci0JCQkJCQl3aGlsZSAoVW1hVXRpbC5maW5kV29ya09yZGVyKAotCQkJCQkJCQkoV29ya0JyZWFrZG93bkVsZW1lbnQpIG5vZGUuZ2V0T2JqZWN0KCksCi0JCQkJCQkJCShXb3JrQnJlYWtkb3duRWxlbWVudCkgcHJlZG5vZGUuZ2V0T2JqZWN0KCkpICE9IG51bGwpIHsKLQkJCQkJCQlVbWFVdGlsCi0JCQkJCQkJCQkucmVtb3ZlV29ya09yZGVyKAotCQkJCQkJCQkJCQkoV29ya0JyZWFrZG93bkVsZW1lbnQpIG5vZGUKLQkJCQkJCQkJCQkJCQkuZ2V0T2JqZWN0KCksCi0JCQkJCQkJCQkJCShXb3JrQnJlYWtkb3duRWxlbWVudCkgcHJlZG5vZGUKLQkJCQkJCQkJCQkJCQkuZ2V0T2JqZWN0KCkpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJc3VwZXIucmVtb3ZlRnJvbVVNQShsaW5rLCBvbGRTb3VyY2UsIG9sZFRhcmdldCk7Ci0JfQotfSAvLyBUeXBlZE5vZGVJbXBsCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvaW1wbC9Xb3JrQnJlYWtkb3duRWxlbWVudE5vZGVJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvaW1wbC9Xb3JrQnJlYWtkb3duRWxlbWVudE5vZGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyOTgwODAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL2ltcGwvV29ya0JyZWFrZG93bkVsZW1lbnROb2RlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjY5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5MaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk1vZGVsUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLlR5cGVkTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Xb3JrQnJlYWtkb3duRWxlbWVudE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwudXRpbC5HcmFwaGljYWxEYXRhSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtPcmRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Xb3JrIEJyZWFrZG93biBFbGVtZW50IE5vZGU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBXb3JrQnJlYWtkb3duRWxlbWVudE5vZGVJbXBsIGV4dGVuZHMgTmFtZWROb2RlSW1wbCBpbXBsZW1lbnRzCi0JCVdvcmtCcmVha2Rvd25FbGVtZW50Tm9kZSB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICovCi0JcHJvdGVjdGVkIFdvcmtCcmVha2Rvd25FbGVtZW50Tm9kZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJbWV0aG9kRWxlbWVudEFkYXB0ZXIgPSBuZXcgV29ya0JyZWFrZG93bkVsZW1lbnRBZGFwdGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gTW9kZWxQYWNrYWdlLkxpdGVyYWxzLldPUktfQlJFQUtET1dOX0VMRU1FTlRfTk9ERTsKLQl9Ci0KLQlwcml2YXRlIGNsYXNzIFdvcmtCcmVha2Rvd25FbGVtZW50QWRhcHRlciBleHRlbmRzIE1ldGhvZEVsZW1lbnRBZGFwdGVyIHsKLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsI25vdGlmeUNoYW5nZWQob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uKQotCQkgKi8KLQkJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbXNnKSB7Ci0JCQlpZiAoIW5vdGlmaWNhdGlvbkVuYWJsZWQpCi0JCQkJcmV0dXJuOwotCQkJbm90aWZpY2F0aW9uRW5hYmxlZCA9IGZhbHNlOwotCQkJdHJ5IHsKLQkJCQlXb3JrT3JkZXIgb2JqOwotCQkJCXN3aXRjaCAobXNnLmdldEZlYXR1cmVJRChXb3JrQnJlYWtkb3duRWxlbWVudC5jbGFzcykpIHsKLQkJCQljYXNlIFVtYVBhY2thZ2UuV09SS19CUkVBS0RPV05fRUxFTUVOVF9fTElOS19UT19QUkVERUNFU1NPUjoKLQkJCQkJc3dpdGNoIChtc2cuZ2V0RXZlbnRUeXBlKCkpIHsKLQkJCQkJY2FzZSBOb3RpZmljYXRpb24uQUREOgotCQkJCQkJb2JqID0gKFdvcmtPcmRlcikgbXNnLmdldE5ld1ZhbHVlKCk7Ci0JCQkJCQlhZGRJbmNvbWluZ0Nvbm5lY3Rpb24ob2JqLmdldFByZWQoKSk7Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCWNhc2UgTm90aWZpY2F0aW9uLlJFTU9WRToKLQkJCQkJCW9iaiA9IChXb3JrT3JkZXIpIG1zZy5nZXRPbGRWYWx1ZSgpOwotCQkJCQkJcmVtb3ZlSW5jb21pbmdDb25uZWN0aW9uKG9iai5nZXRQcmVkKCkpOwotCQkJCQkJcmV0dXJuOwotCQkJCQljYXNlIE5vdGlmaWNhdGlvbi5BRERfTUFOWToKLQkJCQkJCUNvbGxlY3Rpb24gY29sbGVjdGlvbiA9IChDb2xsZWN0aW9uKSBtc2cuZ2V0TmV3VmFsdWUoKTsKLQkJCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGNvbGxlY3Rpb24uaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJCW9iaiA9IChXb3JrT3JkZXIpIGl0ZXIubmV4dCgpOwotCQkJCQkJCWFkZEluY29taW5nQ29ubmVjdGlvbihvYmouZ2V0UHJlZCgpKTsKLQkJCQkJCX0KLQkJCQkJCXJldHVybjsKLQkJCQkJY2FzZSBOb3RpZmljYXRpb24uUkVNT1ZFX01BTlk6Ci0JCQkJCQljb2xsZWN0aW9uID0gKENvbGxlY3Rpb24pIG1zZy5nZXRPbGRWYWx1ZSgpOwotCQkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gY29sbGVjdGlvbi5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJb2JqID0gKFdvcmtPcmRlcikgaXRlci5uZXh0KCk7Ci0JCQkJCQkJcmVtb3ZlSW5jb21pbmdDb25uZWN0aW9uKG9iai5nZXRQcmVkKCkpOwotCQkJCQkJfQotCQkJCQkJcmV0dXJuOwotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCi0JCQkJfQotCQkJfSBmaW5hbGx5IHsKLQkJCQlub3RpZmljYXRpb25FbmFibGVkID0gdHJ1ZTsKLQkJCX0KLQotCQkJc3VwZXIubm90aWZ5Q2hhbmdlZChtc2cpOwotCQl9Ci0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVGcm9tVU1BKExpbmsgbGluaywgTm9kZSBvbGRTb3VyY2UsIE5vZGUgb2xkVGFyZ2V0KSB7Ci0JCWlmIChvbGRUYXJnZXQgaW5zdGFuY2VvZiBXb3JrQnJlYWtkb3duRWxlbWVudE5vZGUpIHsKLQkJCS8vIHRoaXMgaXMgYSBkaXJlY3QgbGluawotCQkJLy8gcmVtb3ZlIFdvcmtPcmRlcgotCQkJLy8KLQkJCS8vIEdyYXBoRWRnZSBlZGdlID0gKEdyYXBoRWRnZSkgbGluay5nZXRPYmplY3QoKTsKLQkJCS8vIFdvcmtPcmRlciBvcmRlciA9IChXb3JrT3JkZXIpCi0JCQkvLyAoKFVNQVNlbWFudGljTW9kZWxCcmlkZ2UpZWRnZS5nZXRTZW1hbnRpY01vZGVsKCkpLmdldEVsZW1lbnQoKTsKLQkJCS8vIFdvcmtCcmVha2Rvd25FbGVtZW50IGJlID0gVW1hVXRpbC5nZXRPd25lcihvcmRlcik7Ci0JCQkvLyBpZihiZSAhPSBudWxsKSB7Ci0JCQlOYW1lZE5vZGVJbXBsIHRhcmdldCA9IChOYW1lZE5vZGVJbXBsKSBvbGRUYXJnZXQ7Ci0JCQlib29sZWFuIG5vdGlmeSA9IHRhcmdldC5ub3RpZmljYXRpb25FbmFibGVkOwotCQkJdHJ5IHsKLQkJCQl0YXJnZXQubm90aWZpY2F0aW9uRW5hYmxlZCA9IGZhbHNlOwotCQkJCS8vIGJlLmdldExpbmtUb1ByZWRlY2Vzc29yKCkucmVtb3ZlKG9yZGVyKTsKLQkJCQlpZiAoR3JhcGhpY2FsRGF0YUhlbHBlci5jYW5SZW1vdmVBbGxQcmVkcyhsaW5rLCBvbGRTb3VyY2UsCi0JCQkJCQlvbGRUYXJnZXQpKSB7Ci0JCQkJCXdoaWxlIChVbWFVdGlsLmZpbmRXb3JrT3JkZXIoKFdvcmtCcmVha2Rvd25FbGVtZW50KSB0YXJnZXQKLQkJCQkJCQkuZ2V0T2JqZWN0KCksIG9sZFNvdXJjZS5nZXRPYmplY3QoKSkgIT0gbnVsbCkgewotCQkJCQkJVW1hVXRpbC5yZW1vdmVXb3JrT3JkZXIoKFdvcmtCcmVha2Rvd25FbGVtZW50KSB0YXJnZXQKLQkJCQkJCQkJLmdldE9iamVjdCgpLCBvbGRTb3VyY2UuZ2V0T2JqZWN0KCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfSBmaW5hbGx5IHsKLQkJCQl0YXJnZXQubm90aWZpY2F0aW9uRW5hYmxlZCA9IG5vdGlmeTsKLQkJCX0KLQkJCS8vIH0KLQkJfSBlbHNlIGlmIChvbGRUYXJnZXQgaW5zdGFuY2VvZiBUeXBlZE5vZGUpIHsKLQkJCS8vIGdldCBhbGwgdGhlIFdvcmtCcmVha2Rvd25FbGVtZW50Tm9kZXMgdGhhdCB0aGlzIFR5cGVkTm9kZSBhcmUKLQkJCS8vIGNvbWluZyB0byBhbmQKLQkJCS8vIHJlbW92ZSB0aGUgV29ya09yZGVycyB3aXRoIHRoaXMgV29ya0JyZWFrZG93bkVsZW1lbnROb2RlJ3MKLQkJCS8vIGFjdGl2aXR5IGFzIHByZWRlY2Vzc29yIGZyb20gdGhlbQotCQkJLy8KLQkJCUNvbGxlY3Rpb24gYWN0Tm9kZXMgPSBHcmFwaGljYWxEYXRhSGVscGVyLmdldFRhcmdldE5vZGVzKAotCQkJCQkoVHlwZWROb2RlKSBvbGRUYXJnZXQsIFdvcmtCcmVha2Rvd25FbGVtZW50Tm9kZS5jbGFzcyk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBhY3ROb2Rlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlOYW1lZE5vZGVJbXBsIG5vZGUgPSAoTmFtZWROb2RlSW1wbCkgaXRlci5uZXh0KCk7Ci0JCQkJV29ya0JyZWFrZG93bkVsZW1lbnQgZSA9IChXb3JrQnJlYWtkb3duRWxlbWVudCkgbm9kZQotCQkJCQkJLmdldE9iamVjdCgpOwotCQkJCWJvb2xlYW4gbm90aWZ5ID0gbm9kZS5ub3RpZmljYXRpb25FbmFibGVkOwotCQkJCXRyeSB7Ci0JCQkJCW5vZGUubm90aWZpY2F0aW9uRW5hYmxlZCA9IGZhbHNlOwotCQkJCQlpZiAoR3JhcGhpY2FsRGF0YUhlbHBlci5jYW5SZW1vdmVBbGxQcmVkcyhsaW5rLCBvbGRTb3VyY2UsCi0JCQkJCQkJbm9kZSkpIHsKLQkJCQkJCXdoaWxlIChVbWFVdGlsLmZpbmRXb3JrT3JkZXIoZSwgb2xkU291cmNlLmdldE9iamVjdCgpKSAhPSBudWxsKSB7Ci0JCQkJCQkJVW1hVXRpbC5yZW1vdmVXb3JrT3JkZXIoZSwgb2xkU291cmNlLmdldE9iamVjdCgpKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0gZmluYWxseSB7Ci0JCQkJCW5vZGUubm90aWZpY2F0aW9uRW5hYmxlZCA9IG5vdGlmeTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJLy8gcmVtb3ZlIGdyYXBoaWNhbCBkYXRhIGZyb20gVU1BIG1vZGVsCi0JCS8vCi0JCXN1cGVyLnJlbW92ZUZyb21VTUEobGluaywgb2xkU291cmNlLCBvbGRUYXJnZXQpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBsaW5rCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gYWRkVG9VTUEoTGluayBsaW5rKSB7Ci0JCWlmICghc3VwZXIuYWRkVG9VTUEobGluaykpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJTm9kZSBzcmMgPSBsaW5rLmdldFNvdXJjZSgpOwotCQlpZiAoc3JjIGluc3RhbmNlb2YgV29ya0JyZWFrZG93bkVsZW1lbnROb2RlKSB7Ci0JCQkvLyB0aGlzIGlzIGEgZGlyZWN0IGxpbmsKLQkJCS8vIGFkZCBuZXcgV29ya09yZGVyIG9iamVjdCB0byBVTUEKLQkJCS8vCi0JCQlXb3JrT3JkZXIgb3JkZXIgPSBudWxsOwotCQkJV29ya0JyZWFrZG93bkVsZW1lbnQgc3VjYyA9IChXb3JrQnJlYWtkb3duRWxlbWVudCkgbGluay5nZXRUYXJnZXQoKQotCQkJCQkuZ2V0T2JqZWN0KCk7Ci0JCQlXb3JrQnJlYWtkb3duRWxlbWVudCBwcmVkID0gKFdvcmtCcmVha2Rvd25FbGVtZW50KSBzcmMuZ2V0T2JqZWN0KCk7Ci0JCQlpZiAoVW1hVXRpbC5maW5kV29ya09yZGVyKHN1Y2MsIHByZWQpID09IG51bGwpIHsKLQkJCQlOb2RlSW1wbCBzb3VyY2VOb2RlID0gKChOb2RlSW1wbCkgc3JjKTsKLQkJCQlib29sZWFuIHNvdXJjZU5vdGlmeSA9IHNvdXJjZU5vZGUubm90aWZpY2F0aW9uRW5hYmxlZDsKLQkJCQl0cnkgewotCQkJCQlzb3VyY2VOb2RlLm5vdGlmaWNhdGlvbkVuYWJsZWQgPSBmYWxzZTsKLQkJCQkJLy9VbWFVdGlsLmNyZWF0ZURlZmF1bHRXb3JrT3JkZXIoc3VjYywgcHJlZCk7Ci0JCQkJCS8vQ3JlYXRlIGEgd29ya29yZGVyIGFuZCBkaXNhYmxlIG5vdGlmaWNhdGlvbiBmbGFnLgotCQkJCQlhZGREZWZhdWx0V29ya09yZGVyKChOYW1lZE5vZGVJbXBsKWxpbmsuZ2V0VGFyZ2V0KCksIHByZWQpOwotCQkJCX0gZmluYWxseSB7Ci0JCQkJCXNvdXJjZU5vZGUubm90aWZpY2F0aW9uRW5hYmxlZCA9IHNvdXJjZU5vdGlmeTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCS8vIHNldCB0aGUgV29ya09yZGVyIGFzIHRoZSBlbGVtZW50IG9mIHRoZSBTZW1hbnRpY01vZGVsIG9mIHRoZQotCQkJLy8gbGluaydzIEdyYXBoRWRnZQotCQkJLy8KLQkJCUdyYXBoaWNhbERhdGFIZWxwZXIuc2V0U2VtYW50aWNNb2RlbChsaW5rLCBvcmRlcik7Ci0JCX0gZWxzZSBpZiAoc3JjIGluc3RhbmNlb2YgVHlwZWROb2RlKSB7Ci0JCQkvLyBnZXQgYWxsIFdvcmtCcmVha2Rvd25FbGVtZW50Tm9kZXMgdGhhdCBhcmUgY29tbWluZyB0byB0aGlzCi0JCQkvLyBUeXBlZE5vZGUsIGJvdGggZGlyZWN0bHkgYW5kIGluZGlyZWN0bHkKLQkJCS8vIGFuZCBjcmVhdGUgd29yayBvcmRlcnMgd2l0aCB0aGVpciBhY3Rpdml0eSBhcyBwcmVkZWNlc3NvcgotCQkJLy8KLQotCQkJLy8gUHJlZGVjZXNzb3Igc2hvdWxkIGJlIGNyZWF0ZWQgb25seSBpbiBjYXNlIG9mCi0JCQkvLyBTeW5jcm9uaXphdGlvbiBCYXIsIG5vdCBmb3IgRGVjaXNpb25Qb2ludC4KLQkJCWlmICgoKFR5cGVkTm9kZSkgc3JjKS5nZXRUeXBlKCkgPT0gVHlwZWROb2RlLlNZTkNIX0JBUikgewotCQkJCQotCQkJCUNvbGxlY3Rpb24gYWN0Tm9kZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJLy8gR2V0IHRoZSBjb2xsZWN0aW9uIGluY29taW5nIGNvbm5lY3Rpb24gb2Ygc3luY2JhciAKLQkJCQkvLyBleGNsdWRpbmcgZGVjaXNpb25wb2ludCBpbmNvbWluZyBjb25uZWN0aW9uCi0JCQkJR3JhcGhpY2FsRGF0YUhlbHBlci5nZXRTeW5jQmFyU291cmNlTm9kZXMoKFR5cGVkTm9kZSlzcmMsIGFjdE5vZGVzKTsKLQkJCQlXb3JrQnJlYWtkb3duRWxlbWVudCBzdWNjID0gKFdvcmtCcmVha2Rvd25FbGVtZW50KSBsaW5rCi0JCQkJCQkuZ2V0VGFyZ2V0KCkuZ2V0T2JqZWN0KCk7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gYWN0Tm9kZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCU5vZGUgbm9kZSA9IChOb2RlKSBpdGVyLm5leHQoKTsKLQkJCQkJV29ya0JyZWFrZG93bkVsZW1lbnQgcHJlZCA9IChXb3JrQnJlYWtkb3duRWxlbWVudCkgbm9kZQotCQkJCQkJCS5nZXRPYmplY3QoKTsKLQkJCQkJaWYgKFVtYVV0aWwuZmluZFdvcmtPcmRlcihzdWNjLCBwcmVkKSA9PSBudWxsKSB7Ci0JCQkJCQlOb2RlSW1wbCBzb3VyY2VOb2RlID0gKChOb2RlSW1wbCkgbm9kZSk7Ci0JCQkJCQlib29sZWFuIHNvdXJjZU5vdGlmeSA9IHNvdXJjZU5vZGUubm90aWZpY2F0aW9uRW5hYmxlZDsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJc291cmNlTm9kZS5ub3RpZmljYXRpb25FbmFibGVkID0gZmFsc2U7Ci0JCQkJCQkJLy9VbWFVdGlsLmNyZWF0ZURlZmF1bHRXb3JrT3JkZXIoc3VjYywgcHJlZCk7Ci0JCQkJCQkJLy8gQ3JlYXRlIGEgd29ya29yZGVyIGFuZCBkaXNhYmxlIG5vdGlmaWNhdGlvbiBmbGFnLgotCQkJCQkJCWFkZERlZmF1bHRXb3JrT3JkZXIoKE5hbWVkTm9kZUltcGwpbGluay5nZXRUYXJnZXQoKSxwcmVkKTsKLQkJCQkJCX0gZmluYWxseSB7Ci0JCQkJCQkJc291cmNlTm9kZS5ub3RpZmljYXRpb25FbmFibGVkID0gc291cmNlTm90aWZ5OwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHJvdGVjdGVkIExpbmsgYWRkSW5jb21pbmdDb25uZWN0aW9uKE1ldGhvZEVsZW1lbnQgc291cmNlKSB7Ci0JCUxpbmsgbGluayA9IHN1cGVyLmFkZEluY29taW5nQ29ubmVjdGlvbihzb3VyY2UpOwotCQlpZiAobGluayA9PSBudWxsKQotCQkJcmV0dXJuIGxpbms7Ci0KLQkJV29ya09yZGVyIHdvcmtPcmRlciA9IFVtYVV0aWwuZmluZFdvcmtPcmRlcigKLQkJCQkoV29ya0JyZWFrZG93bkVsZW1lbnQpIGdldE9iamVjdCgpLCBzb3VyY2UpOwotCQlHcmFwaGljYWxEYXRhSGVscGVyLnNldFNlbWFudGljTW9kZWwobGluaywgd29ya09yZGVyKTsKLQotCQlyZXR1cm4gbGluazsKLQl9Ci0KLQlwcm90ZWN0ZWQgTGluayBhZGRPdXRnb2luZ0Nvbm5lY3Rpb24oTWV0aG9kRWxlbWVudCB0YXJnZXQpIHsKLQkJTGluayBsaW5rID0gc3VwZXIuYWRkT3V0Z29pbmdDb25uZWN0aW9uKHRhcmdldCk7Ci0KLQkJV29ya09yZGVyIHdvcmtPcmRlciA9IFVtYVV0aWwuZmluZFdvcmtPcmRlcigKLQkJCQkoV29ya0JyZWFrZG93bkVsZW1lbnQpIHRhcmdldCwgZ2V0T2JqZWN0KCkpOwotCQlHcmFwaGljYWxEYXRhSGVscGVyLnNldFNlbWFudGljTW9kZWwobGluaywgd29ya09yZGVyKTsKLQotCQlyZXR1cm4gbGluazsKLQl9Ci0KLX0gLy8gV29ya0JyZWFrZG93bkVsZW1lbnROb2RlSW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL2ltcGwvV29ya1Byb2R1Y3RDb21wb3NpdGVJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvaW1wbC9Xb3JrUHJvZHVjdENvbXBvc2l0ZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzc0MDk3NC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvaW1wbC9Xb3JrUHJvZHVjdENvbXBvc2l0ZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkFjdGl2aXR5RGV0YWlsRGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Nb2RlbEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTW9kZWxQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuV29ya1Byb2R1Y3RDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC51dGlsLkdyYXBoaWNhbERhdGFIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwudXRpbC5JQWRhcHRlckZhY3RvcnlGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkNvbmZpZ3VyYWJsZUNvbXBvc2VkQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlN1cHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVU1BU2VtYW50aWNNb2RlbEJyaWRnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPldvcmsgUHJvZHVjdCBDb21wb3NpdGU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuV29ya1Byb2R1Y3RDb21wb3NpdGVJbXBsI2dldFR5cGUgPGVtPlR5cGU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBXb3JrUHJvZHVjdENvbXBvc2l0ZUltcGwgZXh0ZW5kcyBOb2RlQ29udGFpbmVySW1wbCBpbXBsZW1lbnRzCi0JCVdvcmtQcm9kdWN0Q29tcG9zaXRlIHsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VHlwZSgpIDxlbT5UeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgVFlQRV9FREVGQVVMVCA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUeXBlKCkgPGVtPlR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgaW50IHR5cGUgPSBUWVBFX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBXb3JrUHJvZHVjdENvbXBvc2l0ZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gTW9kZWxQYWNrYWdlLkxpdGVyYWxzLldPUktfUFJPRFVDVF9DT01QT1NJVEU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIHR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFR5cGUoaW50IG5ld1R5cGUpIHsKLQkJaW50IG9sZFR5cGUgPSB0eXBlOwotCQl0eXBlID0gbmV3VHlwZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTW9kZWxQYWNrYWdlLldPUktfUFJPRFVDVF9DT01QT1NJVEVfX1RZUEUsIG9sZFR5cGUsIHR5cGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5XT1JLX1BST0RVQ1RfQ09NUE9TSVRFX19UWVBFOgotCQkJCXJldHVybiBuZXcgSW50ZWdlcihnZXRUeXBlKCkpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5XT1JLX1BST0RVQ1RfQ09NUE9TSVRFX19UWVBFOgotCQkJCXNldFR5cGUoKChJbnRlZ2VyKW5ld1ZhbHVlKS5pbnRWYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBNb2RlbFBhY2thZ2UuV09SS19QUk9EVUNUX0NPTVBPU0lURV9fVFlQRToKLQkJCQlzZXRUeXBlKFRZUEVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBNb2RlbFBhY2thZ2UuV09SS19QUk9EVUNUX0NPTVBPU0lURV9fVFlQRToKLQkJCQlyZXR1cm4gdHlwZSAhPSBUWVBFX0VERUZBVUxUOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHR5cGU6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQodHlwZSk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotCXByaXZhdGUgY2xhc3MgVGFza0Rlc2NyaXB0b3JBZGFwdGVyIGV4dGVuZHMgVHJhbnNhY3Rpb25hbE5vZGVMaW5rIHsKLQkJcHJvdGVjdGVkIHZvaWQgaGFuZGxlTm90aWZpY2F0aW9uKE5vdGlmaWNhdGlvbiBtc2cpIHsKLQkJCWRvSGFuZGxlTm90aWZpY2F0aW9uKG1zZyk7Ci0JCQlpZihXb3JrUHJvZHVjdENvbXBvc2l0ZUltcGwudGhpcy5nZXROb2RlcygpLmlzRW1wdHkoKSkgewkJCQkKLQkJCQkvLyByZWZyZXNoIGRpYWdyYW0KLQkJCQkvLwotCQkJCW9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkRpYWdyYW0gZGlhZ3JhbSA9IGdldERpYWdyYW0oKTsKLQkJCQlpZihkaWFncmFtICE9IG51bGwpIHsKLQkJCQkJZGlhZ3JhbS5nZXROb2RlcygpLnJlbW92ZShXb3JrUHJvZHVjdENvbXBvc2l0ZUltcGwudGhpcyk7Ci0JCQkJCWRpYWdyYW0uc2V0T2JqZWN0KGRpYWdyYW0uZ2V0T2JqZWN0KCkpOwotCQkJCX0JCQkJCi0JCQl9Ci0JCX0KLQkJCi0JCXByaXZhdGUgdm9pZCBkb0hhbmRsZU5vdGlmaWNhdGlvbihOb3RpZmljYXRpb24gbXNnKSB7Ci0JCQlzd2l0Y2ggKG1zZy5nZXRGZWF0dXJlSUQoVGFza0Rlc2NyaXB0b3IuY2xhc3MpKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19PVVRQVVQ6Ci0JCQkJc3dpdGNoIChtc2cuZ2V0RXZlbnRUeXBlKCkpIHsKLQkJCQljYXNlIE5vdGlmaWNhdGlvbi5BREQ6Ci0JCQkJCU9iamVjdCBvYmogPSBtc2cuZ2V0TmV3VmFsdWUoKTsKLQkJCQkJaWYgKG9iaiAhPSBudWxsICYmIHR5cGUgPT0gV29ya1Byb2R1Y3RDb21wb3NpdGUuT1VUUFVUUykgewotCQkJCQkJYWRkTm9kZShvYmopOwotCQkJCQl9Ci0JCQkJCXJldHVybjsKLQkJCQljYXNlIE5vdGlmaWNhdGlvbi5SRU1PVkU6Ci0JCQkJCW9iaiA9IG1zZy5nZXRPbGRWYWx1ZSgpOwotCQkJCQlpZiAob2JqICE9IG51bGwgJiYgdHlwZSA9PSBXb3JrUHJvZHVjdENvbXBvc2l0ZS5PVVRQVVRTKSB7Ci0JCQkJCQlyZW1vdmVOb2RlKG9iaik7Ci0JCQkJCX0KLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX01BTkRBVE9SWV9JTlBVVDoKLQkJCQlzd2l0Y2ggKG1zZy5nZXRFdmVudFR5cGUoKSkgewotCQkJCWNhc2UgTm90aWZpY2F0aW9uLkFERDoKLQkJCQkJT2JqZWN0IG9iaiA9IG1zZy5nZXROZXdWYWx1ZSgpOwotCQkJCQlpZiAob2JqICE9IG51bGwgJiYgdHlwZSA9PSBXb3JrUHJvZHVjdENvbXBvc2l0ZS5JTlBVVFMpIHsKLQkJCQkJCWFkZE5vZGUob2JqKTsKLQkJCQkJfQotCQkJCQlyZXR1cm47Ci0JCQkJY2FzZSBOb3RpZmljYXRpb24uUkVNT1ZFOgotCQkJCQlvYmogPSBtc2cuZ2V0T2xkVmFsdWUoKTsKLQkJCQkJaWYgKG9iaiAhPSBudWxsICYmIHR5cGUgPT0gV29ya1Byb2R1Y3RDb21wb3NpdGUuSU5QVVRTKSB7Ci0JCQkJCQlyZW1vdmVOb2RlKG9iaik7Ci0JCQkJCX0KLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQkKLQl9Ci0KLQlwcml2YXRlIElGaWx0ZXIgZ2V0RmlsdGVyKCkgewotCQlEaWFncmFtSW1wbCBkaWFncmFtID0gKERpYWdyYW1JbXBsKSBnZXREaWFncmFtKCk7Ci0JCWlmIChkaWFncmFtLmZpbHRlciA9PSBudWxsKSB7Ci0JCQlDb25maWd1cmFibGVDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5ID0gKENvbmZpZ3VyYWJsZUNvbXBvc2VkQWRhcHRlckZhY3RvcnkpIFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCS5nZXRQQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpOwotCQkJcmV0dXJuIGFkYXB0ZXJGYWN0b3J5LmdldEZpbHRlcigpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIGRpYWdyYW0uZmlsdGVyOwotCQl9Ci0JfQotCXB1YmxpYyB2b2lkIHNldE9iamVjdChPYmplY3QgbmV3T2JqZWN0KSB7Ci0JCQotCQlzdXBlci5zZXRPYmplY3QobmV3T2JqZWN0KTsKLQkJcG9wdWxhdGVOb2RlcyhuZXdPYmplY3QpOwotCQkKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBiYXNpY1NldE9iamVjdChPYmplY3QgbmV3T2JqZWN0KSB7Ci0KLQkJc3VwZXIuYmFzaWNTZXRPYmplY3QobmV3T2JqZWN0KTsKLQkJCi0JCWlmKGlzR3JhcGhpY2FsRGF0YVJlcXVpcmVkKCkpIHsKLQkJCS8vIFNldCB0aGUgVHlwZSBpbmZvcm1hdGlvbiBmb3Igd29ya3Byb2R1Y3QgY29tcG9zaXRlLgotCQkJaWYgKHR5cGUgPT0gVFlQRV9FREVGQVVMVCkgewotCQkJCUxpc3QgbGlzdCA9IGdyYXBoTm9kZS5nZXRMaXN0KFVtYVBhY2thZ2UuR1JBUEhfTk9ERV9fUFJPUEVSVFkpOwotCQkJCVByb3BlcnR5IHByb3BlcnR5ID0gR3JhcGhpY2FsRGF0YUhlbHBlci5nZXRQcm9wZXJ0eUJ5S2V5KGxpc3QsCi0JCQkJCQlHcmFwaGljYWxEYXRhSGVscGVyLlBST1BfV09SS19QUk9EVUNUX0NPTVBPU0lURV9UWVBFKTsKLQkJCQlpZiAocHJvcGVydHkgIT0gbnVsbCkgewotCQkJCQlwcm9wZXJ0eS5zZXRWYWx1ZShwcm9wZXJ0eS5nZXRWYWx1ZSgpKTsKLQkJCQkJbGlzdC5hZGQocHJvcGVydHkpOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJTGlzdCBsaXN0ID0gZ3JhcGhOb2RlLmdldExpc3QoVW1hUGFja2FnZS5HUkFQSF9OT0RFX19QUk9QRVJUWSk7Ci0JCQkJUHJvcGVydHkgcHJvcGVydHkgPSBHcmFwaGljYWxEYXRhSGVscGVyLmdldFByb3BlcnR5QnlLZXkobGlzdCwKLQkJCQkJCUdyYXBoaWNhbERhdGFIZWxwZXIuUFJPUF9XT1JLX1BST0RVQ1RfQ09NUE9TSVRFX1RZUEUpOwotCQkJCWlmIChwcm9wZXJ0eSAhPSBudWxsKSB7Ci0JCQkJCXByb3BlcnR5LnNldFZhbHVlKG5ldyBJbnRlZ2VyKGdldFR5cGUoKSkudG9TdHJpbmcoKSk7Ci0JCQkJCWxpc3QuYWRkKHByb3BlcnR5KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlIGNyZWF0ZVdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGUoV29ya1Byb2R1Y3REZXNjcmlwdG9yIHdwZCkgewotCQlXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlIHdwZE5vZGUgPSBudWxsOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBnZXROb2RlcygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJTm9kZSBub2RlID0gKE5vZGUpIGl0ZXIubmV4dCgpOwotCQkJaWYobm9kZSBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGUgJiYgbm9kZS5nZXRMaW5rZWRFbGVtZW50KCkgPT0gd3BkKSB7Ci0JCQkJd3BkTm9kZSA9IChXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlKSBub2RlOwotCQkJfQotCQl9Ci0JCWlmKHdwZE5vZGUgPT0gbnVsbCkgewotCQkJd3BkTm9kZSA9IE1vZGVsRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZSgpOwotCQkJd3BkTm9kZS5zZXREaWFncmFtKGdldERpYWdyYW0oKSk7Ci0JCX0KLQkJd3BkTm9kZS5zZXRPYmplY3Qod3BkKTsKLQkJcmV0dXJuIHdwZE5vZGU7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHBvcHVsYXRlTm9kZXMoT2JqZWN0IG5ld09iamVjdCl7Ci0JCWlmIChuZXdPYmplY3QgaW5zdGFuY2VvZiBUYXNrRGVzY3JpcHRvcikgewotCQkJTGlzdCB3cGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlpZiAoZ2V0VHlwZSgpID09IFdvcmtQcm9kdWN0Q29tcG9zaXRlLklOUFVUUykgewotCQkJCWlmICghKChUYXNrRGVzY3JpcHRvcikgbmV3T2JqZWN0KS5nZXRNYW5kYXRvcnlJbnB1dCgpLmlzRW1wdHkoKSkKLQkJCQkJd3BsaXN0LmFkZEFsbCgoKFRhc2tEZXNjcmlwdG9yKSBuZXdPYmplY3QpCi0JCQkJCQkJLmdldE1hbmRhdG9yeUlucHV0KCkpOwotCQkJfSBlbHNlIHsKLQkJCQlpZiAoISgoVGFza0Rlc2NyaXB0b3IpIG5ld09iamVjdCkuZ2V0T3V0cHV0KCkuaXNFbXB0eSgpKQotCQkJCQl3cGxpc3QuYWRkQWxsKCgoVGFza0Rlc2NyaXB0b3IpIG5ld09iamVjdCkuZ2V0T3V0cHV0KCkpOwotCQkJfQotCi0JCQlJRmlsdGVyIGZpbHRlciA9IGdldEZpbHRlcigpOwotCQkJQ29sbGVjdGlvbiBhbGxFbGVtZW50cyA9ICgoQWN0aXZpdHlEZXRhaWxEaWFncmFtSW1wbClnZXREaWFncmFtKCkpCi0JCQkJCQkJCQkJLmdldEFsbEJyZWFrZG93bkVsZW1lbnRzKGZhbHNlKTsKLQkJCUFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5ID0gZ2V0QWRhcHRlckZhY3RvcnkoKTsKLQkJCQotCQkJQXJyYXlMaXN0IG5vZGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJU3VwcHJlc3Npb24gc3VwcHJlc3Npb24gPSBnZXREaWFncmFtKCkuZ2V0U3VwcHJlc3Npb24oKTsKLS8vCQkJU3VwcHJlc3Npb24gc3VwcHJlc3Npb24gPSAgbmV3IFN1cHByZXNzaW9uKFRuZ1V0aWwuZ2V0T3duaW5nUHJvY2VzcyhnZXRPYmplY3QoKSkpOwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gd3BsaXN0Lml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCVdvcmtQcm9kdWN0RGVzY3JpcHRvciB3cERlc2NyaXB0b3IgPSAoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBpdGVyCi0JCQkJCQkubmV4dCgpOwkJCQotCQkJCWlmIChmaWx0ZXIgPT0gbnVsbCB8fCBmaWx0ZXIuYWNjZXB0KHdwRGVzY3JpcHRvcikpIHsKLQkJCQkJCi0JCQkJCU9iamVjdCB3cmFwcGVyID0gbnVsbDsKLS8vCQkJCQlpZihhZGFwdGVyRmFjdG9yeSAhPSBudWxsKXsKLS8vCQkJCQkJd3JhcHBlciA9IGFkYXB0ZXJGYWN0b3J5LmFkYXB0KHdwRGVzY3JpcHRvciwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLS8vCQkJCQl9Ci0JCQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBhbGxFbGVtZW50cy5pdGVyYXRvcigpOyBpdGVyYXRvcgotCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlPYmplY3QgZWxlbWVudCA9IChPYmplY3QpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJCWlmKFRuZ1V0aWwudW53cmFwKGVsZW1lbnQpID09IHdwRGVzY3JpcHRvcil7Ci0JCQkJCQkJd3JhcHBlciA9IGVsZW1lbnQ7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJaWYod3JhcHBlciA9PSBudWxsICYmIGFkYXB0ZXJGYWN0b3J5ICE9IG51bGwpewotCQkJCQkJd3JhcHBlciA9IGFkYXB0ZXJGYWN0b3J5LmFkYXB0KHdwRGVzY3JpcHRvciwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCQkJfQotCQkJCQlpZih3cmFwcGVyID09IG51bGwpewotCQkJCQkJd3JhcHBlciA9IHdwRGVzY3JpcHRvcjsKLQkJCQkJfQotCQkJCQlpZiAoIXN1cHByZXNzaW9uLmlzU3VwcHJlc3NlZCh3cmFwcGVyKSkgewotCQkJCQkJTm9kZSBub2RlID0gR3JhcGhpY2FsRGF0YUhlbHBlci5maW5kTm9kZSh0aGlzLAotCQkJCQkJCQl3cERlc2NyaXB0b3IpOwotCQkJCQkJaWYgKG5vZGUgPT0gbnVsbCkgewotCQkJCQkJCW5vZGUgPSBjcmVhdGVXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlKHdwRGVzY3JpcHRvcik7Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIHsKLQkJCQkJCQkvLyB0aGlzIHdpbGwgbWFrZSBzdXJlIHRoYXQgbGluayBiZXR3ZWVuIHRoZSBub2RlIGFuZCBsaW5rZWQgZWxlbWVudCBpcyBlc3RhYmxpc2hlZAotCQkJCQkJCS8vCi0JCQkJCQkJbm9kZS5zZXRPYmplY3Qod3BEZXNjcmlwdG9yKTsKLQkJCQkJCX0KLQkJCQkJCSgoTmFtZWROb2RlSW1wbCkgbm9kZSkuc2V0SXRlbVByb3ZpZGVyKGFsbEVsZW1lbnRzKTsKLQkJCQkJCW5vZGVzLmFkZChub2RlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJc2VsZWN0Tm9kZXMobm9kZXMpOwotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIGFkZE5vZGUoQ29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCUNvbGxlY3Rpb24gbm9kZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGNvbGxlY3Rpb24uaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlXb3JrUHJvZHVjdERlc2NyaXB0b3IgZGVzY3JpcHRvciA9IChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIGl0ZXIKLQkJCQkJLm5leHQoKTsKLQkJCWFkZE5vZGUobm9kZXMsIGRlc2NyaXB0b3IpOwotCQl9Ci0KLQkJZ2V0Tm9kZXMoKS5hZGRBbGwobm9kZXMpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZU5vZGUoT2JqZWN0IG9sZFZhbHVlKSB7Ci0JCUNvbGxlY3Rpb24gcmVtb3ZlZE5vZGVzID0gbmV3IEhhc2hTZXQoKTsKLQkJaWYgKG9sZFZhbHVlIGluc3RhbmNlb2YgVGFza0Rlc2NyaXB0b3IpIHsKLQkJCU5vZGUgbm9kZSA9IGZpbmROb2RlKChBY3Rpdml0eURldGFpbERpYWdyYW0pIGdldERpYWdyYW0oKSwKLQkJCQkJZ2V0T2JqZWN0KCkpOwotCQkJZ2V0RGlhZ3JhbSgpLmdldE5vZGVzKCkucmVtb3ZlKG5vZGUpOwotCQl9Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IG5vZGVzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJTm9kZSBub2RlID0gKE5vZGUpIGl0ZXIubmV4dCgpOwotCQkJaWYgKG5vZGUuZ2V0T2JqZWN0KCkgPT0gb2xkVmFsdWUpIHsKLQkJCQlpdGVyLnJlbW92ZSgpOwotCQkJCXJlbW92ZWROb2Rlcy5hZGQobm9kZSk7Ci0JCQl9Ci0JCX0KLQkJLy8gcHVzaEJhY2tUb0RpYWdyYW0ocmVtb3ZlZE5vZGVzKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGROb2RlKE9iamVjdCBkZXNjcmlwdG9yKSB7Ci0JCWFkZE5vZGUoZ2V0Tm9kZXMoKSwgZGVzY3JpcHRvcik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZE5vZGUoQ29sbGVjdGlvbiBub2RlcywgT2JqZWN0IGRlc2NyaXB0b3IpIHsKLQkJCi0JCWlmIChkZXNjcmlwdG9yIGluc3RhbmNlb2YgVGFza0Rlc2NyaXB0b3IpIHsKLQkJCU5vZGUgbm9kZSA9IGZpbmROb2RlKChBY3Rpdml0eURldGFpbERpYWdyYW0pIGdldERpYWdyYW0oKSwKLQkJCQkJZGVzY3JpcHRvcik7Ci0JCQlpZiAobm9kZSA9PSBudWxsKSB7Ci0JCQkJbm9kZSA9ICgoQWN0aXZpdHlEZXRhaWxEaWFncmFtSW1wbCkgZ2V0RGlhZ3JhbSgpKQotCQkJCQkJLmNyZWF0ZVdvcmtQcm9kdWN0Q29tcG9zaXRlKAotCQkJCQkJCQkoVGFza0Rlc2NyaXB0b3IpIGRlc2NyaXB0b3IsIHRoaXMudHlwZSk7Ci0JCQkJZ2V0RGlhZ3JhbSgpLmdldE5vZGVzKCkuYWRkKG5vZGUpOwotCQkJfQotCQl9Ci0JCWlmKGRlc2NyaXB0b3IgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3IpewotCQkJQWN0aXZpdHlEZXRhaWxEaWFncmFtSW1wbCBkaWFncmFtID0gKEFjdGl2aXR5RGV0YWlsRGlhZ3JhbUltcGwpIGdldERpYWdyYW0oKTsKLQkJCU5vZGUgbm9kZSA9IEdyYXBoaWNhbERhdGFIZWxwZXIuZmluZE5vZGUodGhpcyAsCi0JCQkJCWRlc2NyaXB0b3IpOwotCQkJaWYgKG5vZGUgPT0gbnVsbCkgewotCQkJCWlmIChkZXNjcmlwdG9yIGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yKXsKLQkJCQkJbm9kZSA9IGRpYWdyYW0uY3JlYXRlTm9kZSgoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBkZXNjcmlwdG9yKTsKLQkJCQl9Ci0JCQkJbm9kZXMuYWRkKG5vZGUpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIG9sZFZhbHVlCi0JICovCi0vLwlwcml2YXRlIHZvaWQgcmVtb3ZlTm9kZShDb2xsZWN0aW9uIGVsZW1lbnRzKSB7Ci0vLwkJQ29sbGVjdGlvbiBub2RlcyA9IG5ldyBBcnJheUxpc3QoKTsKLS8vCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBub2Rlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLS8vCQkJTm9kZSBub2RlID0gKE5vZGUpIGl0ZXIubmV4dCgpOwotLy8JCQlpZiAoZWxlbWVudHMuY29udGFpbnMobm9kZS5nZXRPYmplY3QoKSkpIHsKLS8vCQkJCW5vZGVzLmFkZChub2RlKTsKLS8vCQkJfQotLy8JCX0KLS8vCQlnZXROb2RlcygpLnJlbW92ZUFsbChub2Rlcyk7Ci0vLwkJcHVzaEJhY2tUb0RpYWdyYW0obm9kZXMpOwotLy8JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLk5vZGVJbXBsI2dldE1ldGhvZEVsZW1lbnRBZGFwdGVyVHlwZSgpCi0JICovCi0JcHVibGljIENsYXNzIGdldE1ldGhvZEVsZW1lbnRBZGFwdGVyVHlwZSgpIHsKLQkJcmV0dXJuIFRhc2tEZXNjcmlwdG9yQWRhcHRlci5jbGFzczsKLQl9Ci0KLQlwdWJsaWMgUG9pbnQgZ2V0TG9jYXRpb24oKSB7Ci0JCWlmIChnZXRUeXBlKCkgPT0gV29ya1Byb2R1Y3RDb21wb3NpdGUuSU5QVVRTKSB7Ci0JCQlyZXR1cm4gc3VwZXIuZ2V0TG9jYXRpb24oKTsKLQkJfQotCQlpZiAoZ2V0VHlwZSgpID09IFdvcmtQcm9kdWN0Q29tcG9zaXRlLk9VVFBVVFMpIHsKLQkJCXJldHVybiBzdXBlci5nZXRMb2NhdGlvbigpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIG5ldyBQb2ludCgtMSwgLTEpOwotCQl9Ci0JfQotCi0JcHVibGljIEdyYXBoTm9kZSBnZXRHcmFwaE5vZGUoTWV0aG9kRWxlbWVudCBtZXRob2RFbGVtZW50KSB7Ci0JCWlmKGlzR3JhcGhpY2FsRGF0YVJlcXVpcmVkKCkpIHsKLQkJCWlmIChnZXRVTUFEaWFncmFtKCkgPT0gbnVsbCkgewotCQkJCS8vIG5ldyBNZXRob2RFbGVtZW50Ci0JCQkJLy8KLQkJCQlyZXR1cm4gY3JlYXRlR3JhcGhOb2RlKG1ldGhvZEVsZW1lbnQpOwotCQkJfQotCQkJR3JhcGhOb2RlIG5vZGUgPSBmaW5kR3JhcGhOb2RlKGdldFVNQURpYWdyYW0oKSwgbWV0aG9kRWxlbWVudCk7Ci0JCQlpZiAobm9kZSA9PSBudWxsKSB7Ci0JCQkJbm9kZSA9IGNyZWF0ZUdyYXBoTm9kZShtZXRob2RFbGVtZW50KTsKLQkJCQkvLyBjcmVhdGVHcmFwaENvbm5lY3RvcnMobm9kZSwgZ2V0VU1BRGlhZ3JhbSgpKTsKLQkJCQlnZXRVTUFEaWFncmFtKCkuZ2V0Q29udGFpbmVkKCkuYWRkKG5vZGUpOwotCQkJfQotCQkJcmV0dXJuIG5vZGU7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIEdyYXBoTm9kZSBmaW5kR3JhcGhOb2RlKERpYWdyYW0gZGlhZ3JhbSwgT2JqZWN0IG1ldGhvZEVsZW1lbnQpIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZGlhZ3JhbS5nZXRDb250YWluZWQoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCUdyYXBoTm9kZSBlbGVtZW50ID0gKEdyYXBoTm9kZSkgaXRlci5uZXh0KCk7Ci0JCQlpZiAoZWxlbWVudC5nZXRTZW1hbnRpY01vZGVsKCkgaW5zdGFuY2VvZiBVTUFTZW1hbnRpY01vZGVsQnJpZGdlCi0JCQkJCSYmIG1ldGhvZEVsZW1lbnQgPT0gKChVTUFTZW1hbnRpY01vZGVsQnJpZGdlKSBlbGVtZW50Ci0JCQkJCQkJLmdldFNlbWFudGljTW9kZWwoKSkuZ2V0RWxlbWVudCgpKSB7Ci0KLQkJCQlMaXN0IGxpc3QgPSBlbGVtZW50LmdldExpc3QoVW1hUGFja2FnZS5HUkFQSF9OT0RFX19QUk9QRVJUWSk7Ci0JCQkJUHJvcGVydHkgcHJvcGVydHkgPSBHcmFwaGljYWxEYXRhSGVscGVyLmdldFByb3BlcnR5QnlLZXkobGlzdCwKLQkJCQkJCUdyYXBoaWNhbERhdGFIZWxwZXIuUFJPUF9XT1JLX1BST0RVQ1RfQ09NUE9TSVRFX1RZUEUpOwotCQkJCWlmIChwcm9wZXJ0eSAhPSBudWxsKSB7Ci0JCQkJCVN0cmluZyB0eXBlU3RyaW5nID0gcHJvcGVydHkuZ2V0VmFsdWUoKTsKLQkJCQkJaWYgKHR5cGVTdHJpbmcgIT0gbnVsbCkgewotCQkJCQkJaWYgKGdldFR5cGUoKSA9PSBuZXcgSW50ZWdlcih0eXBlU3RyaW5nKS5pbnRWYWx1ZSgpKQotCQkJCQkJCXJldHVybiBlbGVtZW50OwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgR3JhcGhOb2RlIGNyZWF0ZUdyYXBoTm9kZShNZXRob2RFbGVtZW50IGVsZW1lbnQpIHsKLQkJR3JhcGhOb2RlIGdyYXBoTm9kZSA9IFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUdyYXBoTm9kZSgpOwotCQlVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG1vZGVsQnJpZGdlID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkuY3JlYXRlVU1BU2VtYW50aWNNb2RlbEJyaWRnZSgpOwotCQltb2RlbEJyaWRnZS5zZXRFbGVtZW50KGVsZW1lbnQpOwotCQlncmFwaE5vZGUuc2V0U2VtYW50aWNNb2RlbChtb2RlbEJyaWRnZSk7Ci0JCW9yZy5lY2xpcHNlLmVwZi51bWEuUG9pbnQgcG9pbnQgPSBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQb2ludCgpOwotCQlwb2ludC5zZXRYKG5ldyBEb3VibGUoLTEpKTsKLQkJcG9pbnQuc2V0WShuZXcgRG91YmxlKC0xKSk7Ci0JCWdyYXBoTm9kZS5zZXRQb3NpdGlvbihwb2ludCk7Ci0JCW9yZy5lY2xpcHNlLmVwZi51bWEuRGltZW5zaW9uIGRpbSA9IFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZURpbWVuc2lvbigpOwotCQlkaW0uc2V0V2lkdGgobmV3IERvdWJsZSgtMSkpOwotCQlkaW0uc2V0SGVpZ2h0KG5ldyBEb3VibGUoLTEpKTsKLQkJZ3JhcGhOb2RlLnNldFNpemUoZGltKTsKLQotCQkvLyBGb3Igc2V0dGluZyB0eXBlIG9mIFdvcmtQcm9kdWN0Q29tcG9zaXRlCi0JCVByb3BlcnR5IHByb3BlcnR5ID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUHJvcGVydHkoKTsKLQkJcHJvcGVydHkuc2V0S2V5KEdyYXBoaWNhbERhdGFIZWxwZXIuUFJPUF9XT1JLX1BST0RVQ1RfQ09NUE9TSVRFX1RZUEUpOwotCQlwcm9wZXJ0eS5zZXRWYWx1ZShuZXcgSW50ZWdlcihnZXRUeXBlKCkpLnRvU3RyaW5nKCkpOyAvLyROT04tTkxTLTEkCi0JCUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJbGlzdC5hZGQocHJvcGVydHkpOwotCQlncmFwaE5vZGUuc2V0KFVtYVBhY2thZ2UuR1JBUEhfTk9ERV9fUFJPUEVSVFksIGxpc3QpOwotCQlyZXR1cm4gZ3JhcGhOb2RlOwotCX0KLQotCXB1YmxpYyBOb2RlIGZpbmROb2RlKEFjdGl2aXR5RGV0YWlsRGlhZ3JhbSBkaWFncmFtLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGRpYWdyYW0uZ2V0Tm9kZXMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU5vZGUgZWxlbWVudCA9IChOb2RlKSBpdGVyLm5leHQoKTsKLQkJCWlmIChvYmplY3QgPT0gZWxlbWVudC5nZXRPYmplY3QoKQotCQkJCQkmJiBlbGVtZW50IGluc3RhbmNlb2YgV29ya1Byb2R1Y3RDb21wb3NpdGUpIHsKLQkJCQlpZiAoKChXb3JrUHJvZHVjdENvbXBvc2l0ZSkgZWxlbWVudCkuZ2V0VHlwZSgpID09IHRoaXMudHlwZSkKLQkJCQkJcmV0dXJuIGVsZW1lbnQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBPYmplY3QgZ2V0TWV0aG9kRWxlbWVudEFkYXB0ZXIoKSB7Ci0JCWlmKG1ldGhvZEVsZW1lbnRBZGFwdGVyID09IG51bGwpIHsKLQkJCW1ldGhvZEVsZW1lbnRBZGFwdGVyID0gbmV3IFRhc2tEZXNjcmlwdG9yQWRhcHRlcigpOwotCQl9Ci0JCXJldHVybiBtZXRob2RFbGVtZW50QWRhcHRlcjsKLQl9Ci0JCi0JcHJpdmF0ZSBBZGFwdGVyRmFjdG9yeSBnZXRBZGFwdGVyRmFjdG9yeSgpewotCQlBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSA9IG51bGw7Ci0JCUlGaWx0ZXIgZmlsdGVyID0gZ2V0RmlsdGVyKCk7Ci0JCWlmIChmaWx0ZXIgPT0gbnVsbCkgewotCQkJYWRhcHRlckZhY3RvcnkgPSBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRS5nZXRQQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpOwotCQl9IGVsc2UgaWYgKGZpbHRlciBpbnN0YW5jZW9mIElBZGFwdGVyRmFjdG9yeUZpbHRlcikgewotCQkJYWRhcHRlckZhY3RvcnkgPSAoQ29uZmlndXJhYmxlQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSkgKChJQWRhcHRlckZhY3RvcnlGaWx0ZXIpIGZpbHRlcikKLQkJCQkJLmdldFdQQlNBZGFwdGVyRmFjdG9yeSgpOwotCQl9Ci0JCXJldHVybiBhZGFwdGVyRmFjdG9yeTsKLQl9Ci19IC8vIFdvcmtQcm9kdWN0Q29tcG9zaXRlSW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL2ltcGwvV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbUltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9pbXBsL1dvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW1JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjZmQ3YjAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL2ltcGwvV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Nb2RlbEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTW9kZWxQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Xb3JrUHJvZHVjdE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwudXRpbC5HcmFwaGljYWxEYXRhSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLnV0aWwuSUFkYXB0ZXJGYWN0b3J5RmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLnV0aWwuSVdQRERpYWdyYW1DaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuUHJvY2Vzc1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFydGlmYWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk91dGNvbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Xb3JrIFByb2R1Y3QgRGVwZW5kZW5jeSBEaWFncmFtPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbUltcGwgZXh0ZW5kcyBEaWFncmFtSW1wbCBpbXBsZW1lbnRzCi0JCVdvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW0gewotCXByaXZhdGUgY2xhc3MgV1BERGlhZ3JhbUNoYW5nZUxpc3RlbmVyIGV4dGVuZHMgQWN0aXZpdHlBZGFwdGVyIGltcGxlbWVudHMKLQkJCUlXUEREaWFncmFtQ2hhbmdlTGlzdGVuZXIgewotCi0JfTsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqLwotCXByb3RlY3RlZCBXb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQotCQlkaWFncmFtQ2hhbmdlTGlzdGVuZXIgPSBuZXcgV1BERGlhZ3JhbUNoYW5nZUxpc3RlbmVyKCk7Ci0JfQotCi0JcHJvdGVjdGVkIENsYXNzIGdldERpYWdyYW1DaGFuZ2VMaXN0ZW5lclR5cGUoKSB7Ci0JCXJldHVybiBJV1BERGlhZ3JhbUNoYW5nZUxpc3RlbmVyLmNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIE1vZGVsUGFja2FnZS5MaXRlcmFscy5XT1JLX1BST0RVQ1RfREVQRU5ERU5DWV9ESUFHUkFNOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIEFkYXB0ZXJGYWN0b3J5W10gREVGQVVMVF9BREFQVEVSX0ZBQ1RPUklFUyA9IHsJCQkKLQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UuZ2V0UEJTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSAKLQl9OyAKLQotCS8vCi0JLy8gU3RhcnQgY3VzdG9tIGNvZGUKLQkvLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKCkgewotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIgYWRhcHRlciA9IG51bGw7Ci0JCUFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5ID0gbnVsbDsKLQkJaWYgKHdyYXBwZXIgIT0gbnVsbCkgewotCQkJLy9odHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTQ3NTUyCi0JCQlMaXN0IHdyYXBwZXJzID0gUHJvY2Vzc1V0aWwuZ2V0V3JhcHBlcnMod3JhcHBlciwgREVGQVVMVF9BREFQVEVSX0ZBQ1RPUklFUyk7Ci0JCQlpZih3cmFwcGVycyAhPSBudWxsICYmIHdyYXBwZXJzLnNpemUoKSA+IDApewotCQkJCWFkYXB0ZXIgPSAoSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyKXdyYXBwZXJzLmdldCgwKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWlmIChmaWx0ZXIgPT0gbnVsbCkgewotCQkJCWFkYXB0ZXIgPSAoSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyKSBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkJLmdldFBCU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkuYWRhcHQoZ2V0T2JqZWN0KCksCi0JCQkJCQkJCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCQl9IGVsc2UgaWYgKGZpbHRlciBpbnN0YW5jZW9mIElBZGFwdGVyRmFjdG9yeUZpbHRlcikgewotCQkJCWFkYXB0ZXJGYWN0b3J5ID0gKChJQWRhcHRlckZhY3RvcnlGaWx0ZXIpIGZpbHRlcikKLQkJCQkJCS5nZXRXUEJTQWRhcHRlckZhY3RvcnkoKTsKLQkJCQlhZGFwdGVyID0gKElUcmVlSXRlbUNvbnRlbnRQcm92aWRlcikgYWRhcHRlckZhY3RvcnkuYWRhcHQoCi0JCQkJCQlnZXRPYmplY3QoKSwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCX0KLQkJfQotCQlpZiAoYWRhcHRlciAhPSBudWxsKSB7Ci0JCQkvLyByZXR1cm4gYWRhcHRlci5nZXRDaGlsZHJlbihnZXRPYmplY3QoKSk7Ci0JCQkvLyBjb21tZW50ZWQgYWJvdmUgbGluZSwgRm9yIGRpYWdyYW1zIC0gcm9sbHVwIHNob3VsZCBiZSBmYWxzZSwgZm9yCi0JCQkvLyBoYW5kbGluZyByb2xsdXAgc3RhdGUgYmVsb3cgY29kZS4KLQkJCUxpc3QgY2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlleHRyYWN0Q2hpbGRyZW4oYWRhcHRlciwgZ2V0T2JqZWN0KCksIGNoaWxkcmVuLCB0cnVlKTsKLQkJCXJldHVybiBjaGlsZHJlbjsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcG9wdWxhdGVOb2RlcygpIHsKLQkJLy8gQWN0aXZpdHkgYWN0ID0gKEFjdGl2aXR5KSBnZXRPYmplY3QoKTsKLQotCQkvLyBnZXQgYWxsIFdvcmtQcm9kdWN0RGVzY3JpcHRvcnMgdW5kZXIgdGhlIGFjdGl2aXR5Ci0JCS8vCi0JCXN1cGVyLnBvcHVsYXRlTm9kZXMoKTsKLQkJLy8gSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyIGFkYXB0ZXIgPSAoSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyKQotCQkvLyBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRS5nZXRQQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpLmFkYXB0KGFjdCwKLQkJLy8gSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQotCQkvLyBBcnJheUxpc3Qgd3BEZXNjcmlwdG9ycyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJQXJyYXlMaXN0IG5vZGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBnZXRDaGlsZHJlbigpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGUgPSBpdGVyLm5leHQoKTsKLQkJCU9iamVjdCBlbGVtZW50ID0gVG5nVXRpbC51bndyYXAoZSk7Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgewotCQkJCVdvcmtQcm9kdWN0Tm9kZSBub2RlID0gKFdvcmtQcm9kdWN0Tm9kZSkgR3JhcGhpY2FsRGF0YUhlbHBlci5maW5kTm9kZSh0aGlzLCBlbGVtZW50KTsKLQkJCQlpZihub2RlID09IG51bGwpIHsKLQkJCQkJbm9kZSA9IChXb3JrUHJvZHVjdE5vZGUpIHRvTm9kZSgoTWV0aG9kRWxlbWVudCkgZWxlbWVudCk7Ci0JCQkJfQotCQkJCWlmIChlIGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIHsKLQkJCQkJQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIgd3JhcHBlciA9IChCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgZTsKLQkJCQkJaWYgKHdyYXBwZXIuaXNSZWFkT25seSgpKSB7Ci0JCQkJCQkoKE5hbWVkTm9kZUltcGwpIG5vZGUpLml0ZW1Qcm92aWRlciA9IHdyYXBwZXI7Ci0JCQkJCQlub2RlLnNldFJlYWRPbmx5KHRydWUpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWlmICgoKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgZWxlbWVudCkuZ2V0V29ya1Byb2R1Y3QoKSBpbnN0YW5jZW9mIEFydGlmYWN0KSB7Ci0JCQkJCW5vZGUuc2V0VHlwZSgxKTsKLQkJCQl9Ci0JCQkJaWYgKCgoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBlbGVtZW50KS5nZXRXb3JrUHJvZHVjdCgpIGluc3RhbmNlb2YgRGVsaXZlcmFibGUpIHsKLQkJCQkJbm9kZS5zZXRUeXBlKDIpOwotCQkJCX0KLQkJCQlpZiAoKChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIGVsZW1lbnQpLmdldFdvcmtQcm9kdWN0KCkgaW5zdGFuY2VvZiBPdXRjb21lKSB7Ci0JCQkJCW5vZGUuc2V0VHlwZSgzKTsKLQkJCQl9Ci0JCQkJbm9kZXMuYWRkKG5vZGUpOwotCQkJfQotCQl9Ci0JCXNlbGVjdE5vZGVzKG5vZGVzKTsKLQl9Ci0JcHJvdGVjdGVkIE5vZGUgdG9Ob2RlKE1ldGhvZEVsZW1lbnQgZSkgewotCQlpZihlIGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yKXsKLQkJCXJldHVybiBzdXBlci50b05vZGUoZSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIE5vZGUgbmV3Tm9kZSgpIHsKLQkJcmV0dXJuIE1vZGVsRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlV29ya1Byb2R1Y3ROb2RlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIGludCBnZXRUeXBlKCkgewotCQlyZXR1cm4gR3JhcGhpY2FsRGF0YUhlbHBlci5XT1JLX1BST0RVQ1RfREVQRU5ERU5DWV9ESUFHUkFNOwotCX0KLQotCXByb3RlY3RlZCBDbGFzcyBnZXRCcmVha2Rvd25FbGVtZW50VHlwZSgpIHsKLQkJcmV0dXJuIFdvcmtQcm9kdWN0RGVzY3JpcHRvci5jbGFzczsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRUb1VtYU1vZGVsKGludCBwb3NpdGlvbiwgTm9kZSBhZGRlZE5vZGUpIHsJCQotCQlpZiAoYWRkZWROb2RlLmdldE9iamVjdCgpIGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudCkgewotCQkJKChBY3Rpdml0eSkgZ2V0T2JqZWN0KCkpLmdldEJyZWFrZG93bkVsZW1lbnRzKCkuYWRkKAotCQkJCQkoQnJlYWtkb3duRWxlbWVudCkgYWRkZWROb2RlLmdldE9iamVjdCgpKTsKLQkJfQotCQlzdXBlci5hZGRUb1VtYU1vZGVsKHBvc2l0aW9uLCBhZGRlZE5vZGUpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBub2RlQWRkZWQoaW50IGluZGV4LCBOb2RlIG5vZGUpIHsKLQkJaWYobm9kZS5nZXRPYmplY3QoKSA9PSBudWxsKSB7Ci0JCQlpZihub2RlIGluc3RhbmNlb2YgV29ya1Byb2R1Y3ROb2RlKSB7Ci0JCQkJbm9kZS5zZXRPYmplY3QoVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlV29ya1Byb2R1Y3REZXNjcmlwdG9yKCkpOwotCQkJfQotCQl9Ci0JCXN1cGVyLm5vZGVBZGRlZChpbmRleCwgbm9kZSk7Ci0JfQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHBvcHVsYXRlTGlua3MoKSB7Ci0JCXN1cGVyLnBvcHVsYXRlTGlua3MoKTsKLQkJCi0JCS8vIENsZWFuIHVwIHVuLXVzZWQgdGhlIGxpbmtzLgotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBnZXROb2RlcygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJTm9kZSBub2RlID0gKChOb2RlKSBpdGVyLm5leHQoKSk7Ci0JCQlBcnJheUxpc3Q8TGluaz4gbGlua3NUb1JlbW92ZSA9IG5ldyBBcnJheUxpc3Q8TGluaz4oKTsKLQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBub2RlCi0JCQkJCS5nZXRJbmNvbWluZ0Nvbm5lY3Rpb25zKCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJCUxpbmsgbGluayA9IChMaW5rKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJaWYgKCFpc1ZhbGlkKGxpbmspKSB7Ci0JCQkJCWxpbmtzVG9SZW1vdmUuYWRkKGxpbmspOwotCQkJCX0KLQkJCX0KLQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBsaW5rc1RvUmVtb3ZlLml0ZXJhdG9yKCk7IGl0ZXJhdG9yCi0JCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJTGluayBsaW5rID0gKExpbmspIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQlHcmFwaGljYWxEYXRhSGVscGVyLnJlbW92ZUxpbmsobGluayk7Ci0JCQl9Ci0JCQlsaW5rc1RvUmVtb3ZlLmNsZWFyKCk7Ci0JCQlsaW5rc1RvUmVtb3ZlID0gbnVsbDsKLQkJfQotCQkvLyBSZWZyZXNoIGxpbmtzIGJhc2VkIG9uIG1vZGVsIGluZm8uCi0JCWZvcihJdGVyYXRvciBpdGVyID0gZ2V0Tm9kZXMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspewotCQkJTm9kZSBub2RlID0gKChOb2RlKWl0ZXIubmV4dCgpKTsKLQkJCU9iamVjdCB3YmUgPSBudWxsOwotCQkJLy93YmUgPSAoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBub2RlLmdldE9iamVjdCgpOwotCQkJLy9pZih3YmUgIT0gbnVsbCl7Ci0JCQl3YmUgPSAgbm9kZS5nZXRPYmplY3QoKTsKLQkJCWlmKHdiZSBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0RGVzY3JpcHRvcil7Ci0JCQkJTGlzdCBpbXBhY3RlZEJ5ID0gKChXb3JrUHJvZHVjdERlc2NyaXB0b3Ipd2JlKS5nZXRJbXBhY3RlZEJ5KCk7Ci0JCQkJaWYoIWltcGFjdGVkQnkuaXNFbXB0eSgpKXsKLQkJCQkJZm9yKEl0ZXJhdG9yIGl0ZXIxID0gaW1wYWN0ZWRCeS5pdGVyYXRvcigpOyBpdGVyMS5oYXNOZXh0KCk7KXsKLQkJCQkJCVdvcmtQcm9kdWN0RGVzY3JpcHRvciBzb3VyY2UgPSAoV29ya1Byb2R1Y3REZXNjcmlwdG9yKWl0ZXIxLm5leHQoKTsKLQkJCQkJCUxpbmsgbGluayA9IGZpbmRMaW5rKG5vZGUsIHNvdXJjZSk7Ci0JCQkJCQlpZihsaW5rID09IG51bGwpewotCQkJCQkJCU5hbWVkTm9kZUltcGwgbm9kZUltcGwgPSAoKE5hbWVkTm9kZUltcGwpIG5vZGUpOwotCQkJCQkJCWJvb2xlYW4gb2xkTm90aWZ5ID0gbm9kZUltcGwubm90aWZpY2F0aW9uRW5hYmxlZDsKLQkJCQkJCQl0cnkgewotCQkJCQkJCQlub2RlSW1wbC5ub3RpZmljYXRpb25FbmFibGVkID0gZmFsc2U7Ci0JCQkJCQkJCW5vZGVJbXBsLmFkZEluY29taW5nQ29ubmVjdGlvbihzb3VyY2UpOyAKLQkJCQkJCQl9IGZpbmFsbHkgewotCQkJCQkJCQlub2RlSW1wbC5ub3RpZmljYXRpb25FbmFibGVkID0gb2xkTm90aWZ5OwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc1ZhbGlkKExpbmsgbGluaykgewotCQlpZiAobGluay5nZXRTb3VyY2UoKSA9PSBudWxsIHx8IGxpbmsuZ2V0VGFyZ2V0KCkgPT0gbnVsbAotCQkJCXx8ICFnZXROb2RlcygpLmNvbnRhaW5zKGxpbmsuZ2V0U291cmNlKCkpCi0JCQkJfHwgIWdldE5vZGVzKCkuY29udGFpbnMobGluay5nZXRUYXJnZXQoKSkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JcHVibGljIExpbmsgZmluZExpbmsoTm9kZSB0YXJnZXQsIE9iamVjdCBzb3VyY2VMaW5rZWRFbGVtZW50KSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHRhcmdldC5nZXRJbmNvbWluZ0Nvbm5lY3Rpb25zKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlMaW5rIGxpbmsgPSAoTGluaykgaXRlci5uZXh0KCk7Ci0JCQlOb2RlIHNvdXJjZSA9IGxpbmsuZ2V0U291cmNlKCk7Ci0JCQlpZihzb3VyY2UuZ2V0TGlua2VkRWxlbWVudCgpID09IHNvdXJjZUxpbmtlZEVsZW1lbnQpIHsKLQkJCQlyZXR1cm4gbGluazsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci19IC8vIFdvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW1JbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL2ltcGwvV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZUltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9pbXBsL1dvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzNmMwZDYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL2ltcGwvV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuQWN0aXZpdHlEZXRhaWxEaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTW9kZWxQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC51dGlsLkdyYXBoaWNhbERhdGFIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPldvcmsgUHJvZHVjdCBEZXNjcmlwdG9yIE5vZGU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlSW1wbCBleHRlbmRzIE5hbWVkTm9kZUltcGwgaW1wbGVtZW50cwotCQlXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKi8KLQlwcm90ZWN0ZWQgV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJbWV0aG9kRWxlbWVudEFkYXB0ZXIgPSBuZXcgV29ya1Byb2R1Y3REZXNjcmlwdG9yQWRhcHRlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIE1vZGVsUGFja2FnZS5MaXRlcmFscy5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9OT0RFOwotCX0KLQotCXByaXZhdGUgY2xhc3MgV29ya1Byb2R1Y3REZXNjcmlwdG9yQWRhcHRlciBleHRlbmRzIE1ldGhvZEVsZW1lbnRBZGFwdGVyIHsKLQkJCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVOb3RpZmljYXRpb24oTm90aWZpY2F0aW9uIG1zZykgewotCQkJc3dpdGNoIChtc2cuZ2V0RmVhdHVyZUlEKFdvcmtQcm9kdWN0RGVzY3JpcHRvci5jbGFzcykpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfX1NVUFBSRVNTRUQ6Ci0JCQkJc3dpdGNoIChtc2cuZ2V0RXZlbnRUeXBlKCkpIHsKLQkJCQljYXNlIE5vdGlmaWNhdGlvbi5TRVQ6Ci0JCQkJCUJvb2xlYW4gYiA9IChCb29sZWFuKW1zZy5nZXROZXdWYWx1ZSgpOwotCQkJCQkvLyBUT0RPOiBpbXBsZW1lbnQgaGFuZGxpbmcgc3VwcHJlc3MuCi0JCQkJfQotCQkJfQotCQkJc3VwZXIuaGFuZGxlTm90aWZpY2F0aW9uKG1zZyk7Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuTmFtZWROb2RlSW1wbC5NZXRob2RFbGVtZW50QWRhcHRlciNnZXROb2RlKCkKLQkJICovCi0JCXB1YmxpYyBOb2RlIGdldE5vZGUoKSB7Ci0JCQlyZXR1cm4gV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZUltcGwudGhpczsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5OYW1lZE5vZGVJbXBsI2ZpbmROb2RlKG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudCkKLQkgKi8KLQlwcm90ZWN0ZWQgTm9kZSBmaW5kTm9kZShNZXRob2RFbGVtZW50IGxpbmtlZEVsZW1lbnQpIHsKLQkJcmV0dXJuIEdyYXBoaWNhbERhdGFIZWxwZXIuZmluZE5vZGUoCi0JCQkJKEFjdGl2aXR5RGV0YWlsRGlhZ3JhbSkgZ2V0RGlhZ3JhbSgpLCBsaW5rZWRFbGVtZW50KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuTm9kZUltcGwjZ2V0TWV0aG9kRWxlbWVudEFkYXB0ZXJUeXBlKCkKLQkgKi8KLQlwdWJsaWMgQ2xhc3MgZ2V0TWV0aG9kRWxlbWVudEFkYXB0ZXJUeXBlKCkgewotCQlyZXR1cm4gV29ya1Byb2R1Y3REZXNjcmlwdG9yQWRhcHRlci5jbGFzczsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuTm9kZUltcGwjYWRkVG9VTUEob3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTGluaykKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBhZGRUb1VNQShMaW5rIGxpbmspIHsKLQkJaWYgKCFzdXBlci5hZGRUb1VNQShsaW5rKSkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlXb3JrUHJvZHVjdERlc2NyaXB0b3Igd3BkID0gKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgZ2V0T2JqZWN0KCk7Ci0KLQkJLy8gZGlzYWJsZSBub3RpZmljYXRpb24gb2Ygc291cmNlIG5vZGUgYmVmb3JlIGNoYW5naW5nIHRoZSBVTUEgb2JqZWN0Ci0JCS8vIGFzc29jaWF0ZWQgd2l0aCBpdAotCQkvLyBzbyBpdCB3aWxsIG5vdCBjcmVhdGUgZHVwbGljYXRlIGxpbmtzCi0JCS8vCi0JCU5vZGVJbXBsIG5vZGVJbXBsID0gKE5vZGVJbXBsKSBsaW5rLmdldFNvdXJjZSgpOwotCQlib29sZWFuIG5vdGlmeSA9IG5vZGVJbXBsLm5vdGlmaWNhdGlvbkVuYWJsZWQ7Ci0JCWJvb2xlYW4gbm90aWZ5VGFyZ2V0ID0gbm90aWZpY2F0aW9uRW5hYmxlZDsKLQkJdHJ5IHsKLQkJCW5vZGVJbXBsLm5vdGlmaWNhdGlvbkVuYWJsZWQgPSBmYWxzZTsKLQkJCW5vdGlmaWNhdGlvbkVuYWJsZWQgPSBmYWxzZTsKLS8vCQkJd3BkLmdldE91dHB1dEZyb20oKS5hZGQobGluay5nZXRTb3VyY2UoKS5nZXRPYmplY3QoKSk7Ci0JCQlUYXNrRGVzY3JpcHRvciB0YXNrRGVzYyA9IChUYXNrRGVzY3JpcHRvcikgbGluay5nZXRTb3VyY2UoKS5nZXRPYmplY3QoKTsKLQkJCWlmKHRhc2tEZXNjICE9IG51bGwpIHsKLQkJCQl0YXNrRGVzYy5nZXRPdXRwdXQoKS5hZGQod3BkKTsKLQkJCX0KLQkJfSBmaW5hbGx5IHsKLQkJCW5vZGVJbXBsLm5vdGlmaWNhdGlvbkVuYWJsZWQgPSBub3RpZnk7Ci0JCQlub3RpZmljYXRpb25FbmFibGVkID0gbm90aWZ5VGFyZ2V0OwotCQl9Ci0KLQkJLy8gVGFza0Rlc2NyaXB0b3IgdGQgPSAoVGFza0Rlc2NyaXB0b3IpIGxpbmsuZ2V0U291cmNlKCkuZ2V0T2JqZWN0KCk7Ci0JCS8vIHRkLmdldE91dHB1dCgpLmFkZChnZXRPYmplY3QoKSk7Ci0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLk5vZGVJbXBsI3JlbW92ZUZyb21VTUEob3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTGluaywKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGUsIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGUpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlRnJvbVVNQShMaW5rIGxpbmssIE5vZGUgb2xkU291cmNlLCBOb2RlIG9sZFRhcmdldCkgewotCQlXb3JrUHJvZHVjdERlc2NyaXB0b3Igd3BkID0gKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgZ2V0T2JqZWN0KCk7Ci0vLwkJd3BkLmdldE1hbmRhdG9yeUlucHV0VG8oKS5yZW1vdmUob2xkVGFyZ2V0LmdldE9iamVjdCgpKTsKLQkJVGFza0Rlc2NyaXB0b3IgdGFza0Rlc2MgPSAoVGFza0Rlc2NyaXB0b3IpIG9sZFRhcmdldC5nZXRPYmplY3QoKTsKLQkJaWYodGFza0Rlc2MgIT0gbnVsbCkgewotCQkJdGFza0Rlc2MuZ2V0TWFuZGF0b3J5SW5wdXQoKS5yZW1vdmUod3BkKTsKLQkJfQotCi0JCXN1cGVyLnJlbW92ZUZyb21VTUEobGluaywgb2xkU291cmNlLCBvbGRUYXJnZXQpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBkaXNwb3NlKCkgewotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotfSAvLyBXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlSW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL2ltcGwvV29ya1Byb2R1Y3ROb2RlSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL2ltcGwvV29ya1Byb2R1Y3ROb2RlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NThjYzQ0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9pbXBsL1dvcmtQcm9kdWN0Tm9kZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxNCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTW9kZWxQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuV29ya1Byb2R1Y3ROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLnV0aWwuR3JhcGhpY2FsRGF0YUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPldvcmsgUHJvZHVjdCBOb2RlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLldvcmtQcm9kdWN0Tm9kZUltcGwjZ2V0VHlwZSA8ZW0+VHlwZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFdvcmtQcm9kdWN0Tm9kZUltcGwgZXh0ZW5kcyBOYW1lZE5vZGVJbXBsIGltcGxlbWVudHMKLQkJV29ya1Byb2R1Y3ROb2RlIHsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VHlwZSgpIDxlbT5UeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgVFlQRV9FREVGQVVMVCA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUeXBlKCkgPGVtPlR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgaW50IHR5cGUgPSBUWVBFX0VERUZBVUxUOwotCi0JcHJpdmF0ZSBjbGFzcyBXb3JrUHJvZHVjdERlc2NyaXB0b3JBZGFwdGVyIGV4dGVuZHMgTWV0aG9kRWxlbWVudEFkYXB0ZXIgewotCi0JCXB1YmxpYyBOb2RlIGdldE5vZGUoKSB7Ci0JCQlyZXR1cm4gV29ya1Byb2R1Y3ROb2RlSW1wbC50aGlzOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbXNnKSB7Ci0JCQlpZiAoIW5vdGlmaWNhdGlvbkVuYWJsZWQpCi0JCQkJcmV0dXJuOwotCQkJbm90aWZpY2F0aW9uRW5hYmxlZCA9IGZhbHNlOwotCi0JCQl0cnkgewotCQkJCXN3aXRjaCAobXNnLmdldEZlYXR1cmVJRChXb3JrUHJvZHVjdERlc2NyaXB0b3IuY2xhc3MpKSB7Ci0JCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX19JTVBBQ1RFRF9CWToKLQkJCQkJTWV0aG9kRWxlbWVudCBvYmo7Ci0JCQkJCXN3aXRjaCAobXNnLmdldEV2ZW50VHlwZSgpKSB7Ci0JCQkJCWNhc2UgTm90aWZpY2F0aW9uLkFERDoKLQkJCQkJCW9iaiA9IChNZXRob2RFbGVtZW50KSBtc2cuZ2V0TmV3VmFsdWUoKTsKLQkJCQkJCWFkZEluY29taW5nQ29ubmVjdGlvbihvYmopOwotCQkJCQkJcmV0dXJuOwotCQkJCQljYXNlIE5vdGlmaWNhdGlvbi5SRU1PVkU6Ci0JCQkJCQlvYmogPSAoTWV0aG9kRWxlbWVudCkgbXNnLmdldE9sZFZhbHVlKCk7Ci0JCQkJCQlyZW1vdmVJbmNvbWluZ0Nvbm5lY3Rpb24ob2JqKTsKLQkJCQkJCXJldHVybjsKLQkJCQkJY2FzZSBOb3RpZmljYXRpb24uQUREX01BTlk6Ci0JCQkJCQlDb2xsZWN0aW9uIGNvbGxlY3Rpb24gPSAoQ29sbGVjdGlvbikgbXNnLmdldE5ld1ZhbHVlKCk7Ci0JCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjb2xsZWN0aW9uLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCQlvYmogPSAoTWV0aG9kRWxlbWVudCkgaXRlci5uZXh0KCk7Ci0JCQkJCQkJYWRkSW5jb21pbmdDb25uZWN0aW9uKG9iaik7Ci0JCQkJCQl9Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCWNhc2UgTm90aWZpY2F0aW9uLlJFTU9WRV9NQU5ZOgotCQkJCQkJY29sbGVjdGlvbiA9IChDb2xsZWN0aW9uKSBtc2cuZ2V0T2xkVmFsdWUoKTsKLQkJCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGNvbGxlY3Rpb24uaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJCW9iaiA9IChNZXRob2RFbGVtZW50KSBpdGVyLm5leHQoKTsKLQkJCQkJCQlyZW1vdmVJbmNvbWluZ0Nvbm5lY3Rpb24ob2JqKTsKLQkJCQkJCX0KLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfX1NVUFBSRVNTRUQ6Ci0JCQkJCXN3aXRjaCAobXNnLmdldEV2ZW50VHlwZSgpKSB7Ci0JCQkJCWNhc2UgTm90aWZpY2F0aW9uLlNFVDoKLQkJCQkJCUJvb2xlYW4gYiA9IChCb29sZWFuKW1zZy5nZXROZXdWYWx1ZSgpOwotCQkJCQkJaWYoYi5ib29sZWFuVmFsdWUoKT09dHJ1ZSl7Ci0JCQkJCQkJcmVtb3ZlTGlua3MoKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG1zZyk7Ci0JCQl9IGZpbmFsbHkgewotCQkJCW5vdGlmaWNhdGlvbkVuYWJsZWQgPSB0cnVlOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICovCi0JcHJvdGVjdGVkIFdvcmtQcm9kdWN0Tm9kZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJbWV0aG9kRWxlbWVudEFkYXB0ZXIgPSBuZXcgV29ya1Byb2R1Y3REZXNjcmlwdG9yQWRhcHRlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIE1vZGVsUGFja2FnZS5MaXRlcmFscy5XT1JLX1BST0RVQ1RfTk9ERTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGludCBnZXRUeXBlKCkgewotCQlyZXR1cm4gdHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VHlwZShpbnQgbmV3VHlwZSkgewotCQlpbnQgb2xkVHlwZSA9IHR5cGU7Ci0JCXR5cGUgPSBuZXdUeXBlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNb2RlbFBhY2thZ2UuV09SS19QUk9EVUNUX05PREVfX1RZUEUsIG9sZFR5cGUsIHR5cGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5XT1JLX1BST0RVQ1RfTk9ERV9fVFlQRToKLQkJCQlyZXR1cm4gbmV3IEludGVnZXIoZ2V0VHlwZSgpKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBNb2RlbFBhY2thZ2UuV09SS19QUk9EVUNUX05PREVfX1RZUEU6Ci0JCQkJc2V0VHlwZSgoKEludGVnZXIpbmV3VmFsdWUpLmludFZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5XT1JLX1BST0RVQ1RfTk9ERV9fVFlQRToKLQkJCQlzZXRUeXBlKFRZUEVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBNb2RlbFBhY2thZ2UuV09SS19QUk9EVUNUX05PREVfX1RZUEU6Ci0JCQkJcmV0dXJuIHR5cGUgIT0gVFlQRV9FREVGQVVMVDsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiICh0eXBlOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKHR5cGUpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBhZGRUb1VNQShMaW5rIGxpbmspIHsKLQkJaWYgKCFzdXBlci5hZGRUb1VNQShsaW5rKSkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlXb3JrUHJvZHVjdERlc2NyaXB0b3IgZGVzY3JpcHRvciA9IChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIGxpbmsKLQkJCQkuZ2V0U291cmNlKCkuZ2V0T2JqZWN0KCk7Ci0KLQkJTm9kZUltcGwgc291cmNlID0gKE5vZGVJbXBsKSBsaW5rLmdldFNvdXJjZSgpOwotCQlOb2RlSW1wbCB0YXJnZXQgPSAoTm9kZUltcGwpIGxpbmsuZ2V0VGFyZ2V0KCk7Ci0JCWJvb2xlYW4gbm90aWZ5U291cmNlID0gc291cmNlLm5vdGlmaWNhdGlvbkVuYWJsZWQ7Ci0JCWJvb2xlYW4gbm90aWZ5VGFyZ2V0ID0gdGFyZ2V0Lm5vdGlmaWNhdGlvbkVuYWJsZWQ7Ci0JCXRyeSB7Ci0JCQlzb3VyY2Uubm90aWZpY2F0aW9uRW5hYmxlZCA9IHRhcmdldC5ub3RpZmljYXRpb25FbmFibGVkID0gZmFsc2U7Ci0JCQlkZXNjcmlwdG9yLmdldEltcGFjdHMoKS5hZGQoKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgbGluay5nZXRUYXJnZXQoKS5nZXRPYmplY3QoKSk7Ci0JCX0gZmluYWxseSB7Ci0JCQlzb3VyY2Uubm90aWZpY2F0aW9uRW5hYmxlZCA9IG5vdGlmeVNvdXJjZTsKLQkJCXRhcmdldC5ub3RpZmljYXRpb25FbmFibGVkID0gbm90aWZ5VGFyZ2V0OwotCQl9Ci0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlRnJvbVVNQShMaW5rIGxpbmssIE5vZGUgb2xkU291cmNlLCBOb2RlIG9sZFRhcmdldCkgewotCQlXb3JrUHJvZHVjdERlc2NyaXB0b3IgZGVzY3JpcHRvciA9IChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIG9sZFRhcmdldAotCQkJCS5nZXRPYmplY3QoKTsKLQkJLy8gZGlzYWJsZSBpbnRlcm5hbCBub3RpZmljYXRpb24gb2YgdGhlIHRhcmdldCBub2RlIGJlZm9yZSByZW1vdmluZyBpdHMKLQkJLy8gZGVzY3JpcHRvciBmcm9tIHRoZSBkZXBlbmRlbmN5IGxpc3QKLQkJLy8KLQkJTmFtZWROb2RlSW1wbCBub2RlSW1wbCA9IChOYW1lZE5vZGVJbXBsKSBvbGRTb3VyY2U7Ci0JCWJvb2xlYW4gbm90aWZ5ID0gbm9kZUltcGwubm90aWZpY2F0aW9uRW5hYmxlZDsKLQkJdHJ5IHsKLQkJCW5vZGVJbXBsLm5vdGlmaWNhdGlvbkVuYWJsZWQgPSBmYWxzZTsKLQkJCWRlc2NyaXB0b3IuZ2V0SW1wYWN0ZWRCeSgpLnJlbW92ZShub2RlSW1wbC5nZXRPYmplY3QoKSk7Ci0JCX0gZmluYWxseSB7Ci0JCQlub2RlSW1wbC5ub3RpZmljYXRpb25FbmFibGVkID0gbm90aWZ5OwotCQl9Ci0KLQkJc3VwZXIucmVtb3ZlRnJvbVVNQShsaW5rLCBvbGRTb3VyY2UsIG9sZFRhcmdldCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlTGlua3MoKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGdldEluY29taW5nQ29ubmVjdGlvbnMoKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCUxpbmsgbGluayA9IChMaW5rKSBpdGVyLm5leHQoKTsKLQkJCWlmIChsaW5rLmdldFNvdXJjZSgpICE9IG51bGwpIHsKLQkJCQlHcmFwaGljYWxEYXRhSGVscGVyLnJlbW92ZUdyYXBoaWNhbERhdGEobGluayk7Ci0JCQkJLy8gZGlzYWJsZSBpbnRlcm5hbCBub3RpZmljYXRpb24gb2YgdGhlIHNvdXJjZSBub2RlCi0JCQkJLy8KLQkJCQlOb2RlSW1wbCBzb3VyY2VOb2RlID0gKE5vZGVJbXBsKSBsaW5rLmdldFNvdXJjZSgpOwotCQkJCWJvb2xlYW4gb2xkTm90aWZ5ID0gc291cmNlTm9kZS5ub3RpZmljYXRpb25FbmFibGVkOwotCQkJCXRyeSB7Ci0JCQkJCXNvdXJjZU5vZGUubm90aWZpY2F0aW9uRW5hYmxlZCA9IGZhbHNlOwotCQkJCQlsaW5rLnNldFNvdXJjZShudWxsKTsKLQkJCQl9IGZpbmFsbHkgewotCQkJCQlzb3VyY2VOb2RlLm5vdGlmaWNhdGlvbkVuYWJsZWQgPSBvbGROb3RpZnk7Ci0JCQkJfQotCQkJCS8vbGluay5zZXRUYXJnZXQobnVsbCk7Ci0JCQkJbGluay5zZXRPYmplY3QobnVsbCk7Ci0JCQl9Ci0JCX0KLQotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBnZXRPdXRnb2luZ0Nvbm5lY3Rpb25zKCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQlMaW5rIGxpbmsgPSAoTGluaykgaXRlci5uZXh0KCk7Ci0JCQlpZiAobGluay5nZXRUYXJnZXQoKSAhPSBudWxsKSB7Ci0JCQkJR3JhcGhpY2FsRGF0YUhlbHBlci5yZW1vdmVHcmFwaGljYWxEYXRhKGxpbmspOwotCQkJCS8vIGRpc2FibGUgaW50ZXJuYWwgbm90aWZpY2F0aW9uIG9mIHRoZSBzb3VyY2Ugbm9kZQotCQkJCS8vCi0JCQkJTm9kZUltcGwgdGFyZ2V0Tm9kZSA9IChOb2RlSW1wbCkgbGluay5nZXRUYXJnZXQoKTsKLQkJCQlib29sZWFuIG9sZE5vdGlmeSA9IHRhcmdldE5vZGUubm90aWZpY2F0aW9uRW5hYmxlZDsKLQkJCQl0cnkgewotCQkJCQl0YXJnZXROb2RlLm5vdGlmaWNhdGlvbkVuYWJsZWQgPSBmYWxzZTsKLQkJCQkJbGluay5zZXRUYXJnZXQobnVsbCk7Ci0JCQkJfSBmaW5hbGx5IHsKLQkJCQkJdGFyZ2V0Tm9kZS5ub3RpZmljYXRpb25FbmFibGVkID0gb2xkTm90aWZ5OwotCQkJCX0KLQkJCQkvL2xpbmsuc2V0U291cmNlKG51bGwpOwotCQkJCWxpbmsuc2V0T2JqZWN0KG51bGwpOwotCQkJfQotCQl9Ci0JfQotfSAvLyBXb3JrUHJvZHVjdE5vZGVJbXBsCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvaW1wbC9wYWNrYWdlLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvaW1wbC9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiMWRmMTYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL2ltcGwvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgdGhlIGltcGxlbWVudGF0aW9uIGZvciB0aGUgYWN0aXZpdHkgZGlhZ3JhbSBtb2RlbCBvYmplY3RzLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9wYWNrYWdlLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjlkOTVlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyB0aGUgaW50ZXJmYWNlcyBmb3IgdGhlIGFjdGl2aXR5IGRpYWdyYW0gbW9kZWwgb2JqZWN0cy4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvdXRpbC9EaWFncmFtSW5mby5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL3V0aWwvRGlhZ3JhbUluZm8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjExMmE1Zi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvdXRpbC9EaWFncmFtSW5mby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuQ29uc3RyYWludE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnN0cmFpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5TdXBwb3J0aW5nTWF0ZXJpYWw7Ci0KLWltcG9ydCBjb20uaWJtLmljdS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIHN0b3JlcyBkaWFncmFtIHB1Ymxpc2ggb3B0aW9ucyBhbmQgcmVmZXJlbmNlcyB0byB1c2VyLXNwZWNpZmllZAotICogZGlhZ3JhbXMgdG8gcmVwbGFjZSB0aGUgYWN0aXZpdHkgZGlhZ3JhbSwgYWN0aXZpdHkgZGV0YWlsIGRpYWdyYW0sIG9yIHdvcmsKLSAqIHByb2R1Y3QgZGVwZW5kZW5jeSBkaWFncmFtIGZvciBhbiBhY3Rpdml0eS4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIERpYWdyYW1JbmZvIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQURfSU1BR0VfVVJJID0gImFkX2ltYWdlX3VyaSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBRERfSU1BR0VfVVJJID0gImFkZF9pbWFnZV91cmkiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgV1BEX0lNQUdFX1VSSSA9ICJ3cGRfaW1hZ2VfdXJpIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBVQkxJU0hfQURfSU1BR0UgPSAicHVibGlzaF9hZF9pbWFnZSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQVUJMSVNIX0FERF9JTUFHRSA9ICJwdWJsaXNoX2FkZF9pbWFnZSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQVUJMSVNIX1dQRF9JTUFHRSA9ICJwdWJsaXNoX3dwZF9pbWFnZSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERUxJTUlURVIgPSAifCI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgQWN0aXZpdHkgYWN0aXZpdHk7Ci0KLQlwcml2YXRlIFN0cmluZyBBRF9JbWFnZVVSSTsKLQotCXByaXZhdGUgU3RyaW5nIEFERF9JbWFnZVVSSTsKLQotCXByaXZhdGUgU3RyaW5nIFdQRF9JbWFnZVVSSTsKLQotCXByaXZhdGUgYm9vbGVhbiBwdWJsaXNoQURJbWFnZTsKLQotCXByaXZhdGUgYm9vbGVhbiBwdWJsaXNoQURESW1hZ2U7Ci0KLQlwcml2YXRlIGJvb2xlYW4gcHVibGlzaFdQREltYWdlOwotCi0JcHJpdmF0ZSBDb25zdHJhaW50IGNvbnN0cmFpbnQ7Ci0KLQlwcml2YXRlIFN1cHBvcnRpbmdNYXRlcmlhbCBhY3Rpdml0eURpYWdyYW07Ci0KLQlwcml2YXRlIFN1cHBvcnRpbmdNYXRlcmlhbCBhY3Rpdml0eURldGFpbERpYWdyYW07Ci0KLQlwcml2YXRlIFN1cHBvcnRpbmdNYXRlcmlhbCB3cGREaWFncmFtOwotCi0JLyoqCi0JICogQ29uc3RydWN0cyBhbmQgbG9hZHMgYSBEaWFncmFtSW5mbyBpbnN0YW5jZSBmb3IgYSBnaXZlbiBhY3Rpdml0eQotCSAqIAotCSAqIEBwYXJhbSBhY3Rpdml0eQotCSAqLwotCXB1YmxpYyBEaWFncmFtSW5mbyhBY3Rpdml0eSBhY3Rpdml0eSkgewotCQl0aGlzLmFjdGl2aXR5ID0gYWN0aXZpdHk7Ci0JCXJlZnJlc2goKTsKLQl9Ci0KLQlwcml2YXRlIERpYWdyYW1JbmZvKCkgewotCQlBRF9JbWFnZVVSSSA9IEFERF9JbWFnZVVSSSA9IFdQRF9JbWFnZVVSSSA9ICIiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJpdmF0ZSBEaWFncmFtSW5mbyBsb2FkKCkgewotCQlEaWFncmFtSW5mbyBpbmZvID0gbmV3IERpYWdyYW1JbmZvKCk7Ci0JCWZvciAoU3RyaW5nVG9rZW5pemVyIHRva2VucyA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoY29uc3RyYWludC5nZXRCb2R5KCksCi0JCQkJREVMSU1JVEVSKTsgdG9rZW5zLmhhc01vcmVUb2tlbnMoKTspIHsKLQkJCVN0cmluZyB0b2tlbiA9IHRva2Vucy5uZXh0VG9rZW4oKTsKLQkJCWludCBpZCA9IHRva2VuLmluZGV4T2YoJz0nKTsKLQkJCWludCBtYXggPSB0b2tlbi5sZW5ndGgoKSAtIDE7Ci0JCQlpZiAoaWQgIT0gLTEgJiYgaWQgPCBtYXgpIHsKLQkJCQlTdHJpbmcga2V5ID0gdG9rZW4uc3Vic3RyaW5nKDAsIGlkKTsKLQkJCQlpZiAoa2V5LmVxdWFsc0lnbm9yZUNhc2UoQURfSU1BR0VfVVJJKSkgewotCQkJCQlpbmZvLkFEX0ltYWdlVVJJID0gdG9rZW4uc3Vic3RyaW5nKGlkICsgMSk7Ci0JCQkJfSBlbHNlIGlmIChrZXkuZXF1YWxzSWdub3JlQ2FzZShBRERfSU1BR0VfVVJJKSkgewotCQkJCQlpbmZvLkFERF9JbWFnZVVSSSA9IHRva2VuLnN1YnN0cmluZyhpZCArIDEpOwotCQkJCX0gZWxzZSBpZiAoa2V5LmVxdWFsc0lnbm9yZUNhc2UoV1BEX0lNQUdFX1VSSSkpIHsKLQkJCQkJaW5mby5XUERfSW1hZ2VVUkkgPSB0b2tlbi5zdWJzdHJpbmcoaWQgKyAxKTsKLQkJCQl9IGVsc2UgaWYgKGtleS5lcXVhbHNJZ25vcmVDYXNlKFBVQkxJU0hfQURfSU1BR0UpKSB7Ci0JCQkJCWluZm8ucHVibGlzaEFESW1hZ2UgPSBCb29sZWFuLnZhbHVlT2YoCi0JCQkJCQkJdG9rZW4uc3Vic3RyaW5nKGlkICsgMSkpLmJvb2xlYW5WYWx1ZSgpOwotCQkJCX0gZWxzZSBpZiAoa2V5LmVxdWFsc0lnbm9yZUNhc2UoUFVCTElTSF9BRERfSU1BR0UpKSB7Ci0JCQkJCWluZm8ucHVibGlzaEFEREltYWdlID0gQm9vbGVhbi52YWx1ZU9mKAotCQkJCQkJCXRva2VuLnN1YnN0cmluZyhpZCArIDEpKS5ib29sZWFuVmFsdWUoKTsKLQkJCQl9IGVsc2UgaWYgKGtleS5lcXVhbHNJZ25vcmVDYXNlKFBVQkxJU0hfV1BEX0lNQUdFKSkgewotCQkJCQlpbmZvLnB1Ymxpc2hXUERJbWFnZSA9IEJvb2xlYW4udmFsdWVPZigKLQkJCQkJCQl0b2tlbi5zdWJzdHJpbmcoaWQgKyAxKSkuYm9vbGVhblZhbHVlKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBpbmZvOwotCX0KLQotCXByaXZhdGUgdm9pZCBzYXZlKCkgewotCQlpZiAoY29uc3RyYWludCA9PSBudWxsKSB7Ci0JCQljb25zdHJhaW50ID0gQ29uc3RyYWludE1hbmFnZXIuZ2V0Q29uc3RyYWludChhY3Rpdml0eSwKLQkJCQkJQ29uc3RyYWludE1hbmFnZXIuQUNJVElWWV9ESUFHUkFNLCB0cnVlKTsKLQkJfQotCQlpZiAoYWN0aXZpdHlEaWFncmFtICE9IG51bGwpIHsKLQkJCUFEX0ltYWdlVVJJID0gYWN0aXZpdHlEaWFncmFtLmdldEd1aWQoKTsKLQkJfQotCQlpZiAoYWN0aXZpdHlEZXRhaWxEaWFncmFtICE9IG51bGwpIHsKLQkJCUFERF9JbWFnZVVSSSA9IGFjdGl2aXR5RGV0YWlsRGlhZ3JhbS5nZXRHdWlkKCk7Ci0JCX0KLQkJaWYgKHdwZERpYWdyYW0gIT0gbnVsbCkgewotCQkJV1BEX0ltYWdlVVJJID0gd3BkRGlhZ3JhbS5nZXRHdWlkKCk7Ci0JCX0KLQotCQlEaWFncmFtSW5mbyBpbmZvID0gbG9hZCgpOwotCi0JCWlmIChBRF9JbWFnZVVSSSAhPSBudWxsKSB7Ci0JCQlpbmZvLkFEX0ltYWdlVVJJID0gQURfSW1hZ2VVUkk7Ci0JCX0KLQkJaWYgKEFERF9JbWFnZVVSSSAhPSBudWxsKSB7Ci0JCQlpbmZvLkFERF9JbWFnZVVSSSA9IEFERF9JbWFnZVVSSTsKLQkJfQotCQlpZiAoV1BEX0ltYWdlVVJJICE9IG51bGwpIHsKLQkJCWluZm8uV1BEX0ltYWdlVVJJID0gV1BEX0ltYWdlVVJJOwotCQl9Ci0JCWluZm8ucHVibGlzaEFESW1hZ2UgPSBwdWJsaXNoQURJbWFnZTsKLQkJaW5mby5wdWJsaXNoQURESW1hZ2UgPSBwdWJsaXNoQURESW1hZ2U7Ci0JCWluZm8ucHVibGlzaFdQREltYWdlID0gcHVibGlzaFdQREltYWdlOwotCi0JCVN0cmluZyBzdHIgPSBuZXcgU3RyaW5nQnVmZmVyKEFEX0lNQUdFX1VSSSkuYXBwZW5kKCc9JykuYXBwZW5kKAotCQkJCWluZm8uQURfSW1hZ2VVUkkpLmFwcGVuZChERUxJTUlURVIpLmFwcGVuZChQVUJMSVNIX0FEX0lNQUdFKQotCQkJCS5hcHBlbmQoJz0nKS5hcHBlbmQoU3RyaW5nLnZhbHVlT2YoaW5mby5wdWJsaXNoQURJbWFnZSkpCi0JCQkJLmFwcGVuZChERUxJTUlURVIpLmFwcGVuZChBRERfSU1BR0VfVVJJKS5hcHBlbmQoJz0nKS5hcHBlbmQoCi0JCQkJCQlTdHJpbmcudmFsdWVPZihpbmZvLkFERF9JbWFnZVVSSSkpLmFwcGVuZChERUxJTUlURVIpCi0JCQkJLmFwcGVuZChQVUJMSVNIX0FERF9JTUFHRSkuYXBwZW5kKCc9JykuYXBwZW5kKAotCQkJCQkJU3RyaW5nLnZhbHVlT2YoaW5mby5wdWJsaXNoQURESW1hZ2UpKS5hcHBlbmQoREVMSU1JVEVSKQotCQkJCS5hcHBlbmQoV1BEX0lNQUdFX1VSSSkuYXBwZW5kKCc9JykuYXBwZW5kKAotCQkJCQkJU3RyaW5nLnZhbHVlT2YoaW5mby5XUERfSW1hZ2VVUkkpKS5hcHBlbmQoREVMSU1JVEVSKQotCQkJCS5hcHBlbmQoUFVCTElTSF9XUERfSU1BR0UpLmFwcGVuZCgnPScpLmFwcGVuZCgKLQkJCQkJCVN0cmluZy52YWx1ZU9mKGluZm8ucHVibGlzaFdQREltYWdlKSkudG9TdHJpbmcoKTsKLQotCQljb25zdHJhaW50LnNldEJvZHkoc3RyKTsKLQl9Ci0KLQkvKioKLQkgKiBSZWZyZXNoZXMgdGhpcyBEaWFncmFtSW5mbyBvYmplY3QgZnJvbSB0aGUgbW9kZWwKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWZyZXNoKCkgewotCQljb25zdHJhaW50ID0gQ29uc3RyYWludE1hbmFnZXIuZ2V0Q29uc3RyYWludChhY3Rpdml0eSwKLQkJCQlDb25zdHJhaW50TWFuYWdlci5BQ0lUSVZZX0RJQUdSQU0sIGZhbHNlKTsKLQkJaWYgKGNvbnN0cmFpbnQgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJRGlhZ3JhbUluZm8gaW5mbyA9IGxvYWQoKTsKLQotCQlBRF9JbWFnZVVSSSA9IGluZm8uQURfSW1hZ2VVUkk7Ci0JCUFERF9JbWFnZVVSSSA9IGluZm8uQUREX0ltYWdlVVJJOwotCQlXUERfSW1hZ2VVUkkgPSBpbmZvLldQRF9JbWFnZVVSSTsKLQkJcHVibGlzaEFESW1hZ2UgPSBpbmZvLnB1Ymxpc2hBREltYWdlOwotCQlwdWJsaXNoQURESW1hZ2UgPSBpbmZvLnB1Ymxpc2hBRERJbWFnZTsKLQkJcHVibGlzaFdQREltYWdlID0gaW5mby5wdWJsaXNoV1BESW1hZ2U7Ci0KLQkJYWN0aXZpdHlEaWFncmFtID0gZ2V0U3VwcG9ydGluZ01hdGVyaWFsKEFEX0ltYWdlVVJJKTsKLQkJYWN0aXZpdHlEZXRhaWxEaWFncmFtID0gZ2V0U3VwcG9ydGluZ01hdGVyaWFsKEFERF9JbWFnZVVSSSk7Ci0JCXdwZERpYWdyYW0gPSBnZXRTdXBwb3J0aW5nTWF0ZXJpYWwoV1BEX0ltYWdlVVJJKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFEX0ltYWdlVVJJKCkgewotCQlyZXR1cm4gQURfSW1hZ2VVUkk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBRERfSW1hZ2VVUkkoKSB7Ci0JCXJldHVybiBBRERfSW1hZ2VVUkk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRXUERfSW1hZ2VVUkkoKSB7Ci0JCXJldHVybiBXUERfSW1hZ2VVUkk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgb3B0aW9uIHRvIHB1Ymxpc2ggdXNlci1zcGVjaWZpZWQgYWN0aXZpdHkgZGV0YWlsIGRpYWdyYW0KLQkgKiBpbnN0ZWFkLgotCSAqIAotCSAqIEByZXR1cm4KLQkgKiBAc2VlICNnZXRBY3Rpdml0eURldGFpbERpYWdyYW0oKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGNhblB1Ymxpc2hBRERJbWFnZSgpIHsKLQkJcmV0dXJuIHB1Ymxpc2hBRERJbWFnZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBvcHRpb24gdG8gcHVibGlzaCB1c2VyLXNwZWNpZmllZCBhY3Rpdml0eSBkZXRhaWwgZGlhZ3JhbQotCSAqIGluc3RlYWQuCi0JICogCi0JICogQHBhcmFtIHB1Ymxpc2hBRERJbWFnZQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFB1Ymxpc2hBRERJbWFnZShib29sZWFuIHB1Ymxpc2hBRERJbWFnZSkgewotCQl0aGlzLnB1Ymxpc2hBRERJbWFnZSA9IHB1Ymxpc2hBRERJbWFnZTsKLQkJc2F2ZSgpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIG9wdGlvbiB0byBwdWJsaXNoIHVzZXItc3BlY2lmaWVkIGFjdGl2aXR5IGRpYWdyYW0gaW5zdGVhZC4KLQkgKiAKLQkgKiBAcmV0dXJuCi0JICogQHNlZSAjZ2V0QWN0aXZpdHlEaWFncmFtKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjYW5QdWJsaXNoQURJbWFnZSgpIHsKLQkJcmV0dXJuIHB1Ymxpc2hBREltYWdlOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIG9wdGlvbiB0byBwdWJsaXNoIHVzZXItc3BlY2lmaWVkIGltYWdlIGZvciBhY3Rpdml0eSBkaWFncmFtCi0JICogaW5zdGVhZCBvZiB0aGUgYWN0aXZpdHkgZGlhZ3JhbQotCSAqIAotCSAqIEBwYXJhbSBwdWJsaXNoQURJbWFnZQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFB1Ymxpc2hBREltYWdlKGJvb2xlYW4gcHVibGlzaEFESW1hZ2UpIHsKLQkJdGhpcy5wdWJsaXNoQURJbWFnZSA9IHB1Ymxpc2hBREltYWdlOwotCQlzYXZlKCk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgb3B0aW9uIHRvIHB1Ymxpc2ggdXNlci1zcGVjaWZpZWQgd29yayBwcm9kdWN0IGRlcGVuZGVuY3kgZGlhZ3JhbQotCSAqIGluc3RlYWQuCi0JICogCi0JICogQHJldHVybgotCSAqIEBzZWUgI2dldFdQRERpYWdyYW0oKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGNhblB1Ymxpc2hXUERJbWFnZSgpIHsKLQkJcmV0dXJuIHB1Ymxpc2hXUERJbWFnZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBvcHRpb24gdG8gcHVibGlzaCB1c2VyLXNwZWNpZmllZCBpbWFnZSBmb3Igd29yayBwcm9kdWN0Ci0JICogZGVwZW5kZW5jeSBkaWFncmFtIGluc3RlYWQgb2YgdGhlIHdvcmsgcHJvZHVjdCBkZXBlbmRlbmN5IGRpYWdyYW0KLQkgKiAKLQkgKiBAcGFyYW0gcHVibGlzaFdQREltYWdlCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHVibGlzaFdQREltYWdlKGJvb2xlYW4gcHVibGlzaFdQREltYWdlKSB7Ci0JCXRoaXMucHVibGlzaFdQREltYWdlID0gcHVibGlzaFdQREltYWdlOwotCQlzYXZlKCk7Ci0JfQotCi0JcHVibGljIFN1cHBvcnRpbmdNYXRlcmlhbCBnZXRBY3Rpdml0eURpYWdyYW0oKSB7Ci0JCXJldHVybiBhY3Rpdml0eURpYWdyYW07Ci0JfQotCi0JLyoqCi0JICogR2V0cyB1c2VyLXNwZWNpZmllZCBhY3Rpdml0eSBkZXRhaWwgZGlhZ3JhbS4KLQkgKiAKLQkgKiBAcmV0dXJuIGEge0BsaW5rIFN1cHBvcnRpbmdNYXRlcmlhbH0gd2l0aCB0aGUgZGlncmFtIGluIGl0cyBtYWluCi0JICogICAgICAgICBkZXNjcmlwdGlvbgotCSAqLwotCXB1YmxpYyBTdXBwb3J0aW5nTWF0ZXJpYWwgZ2V0QWN0aXZpdHlEZXRhaWxEaWFncmFtKCkgewotCQlyZXR1cm4gYWN0aXZpdHlEZXRhaWxEaWFncmFtOwotCX0KLQotCS8qKgotCSAqIEdldHMgdXNlci1zcGVjaWZpZWQgd29yayBwcm9kdWN0IGRlcGVuZGVuY3kgZGlhZ3JhbS4KLQkgKiAKLQkgKiBAcmV0dXJuIGEge0BsaW5rIFN1cHBvcnRpbmdNYXRlcmlhbH0gd2l0aCB0aGUgZGlncmFtIGluIGl0cyBtYWluCi0JICogICAgICAgICBkZXNjcmlwdGlvbgotCSAqLwotCXB1YmxpYyBTdXBwb3J0aW5nTWF0ZXJpYWwgZ2V0V1BERGlhZ3JhbSgpIHsKLQkJcmV0dXJuIHdwZERpYWdyYW07Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0V1BERGlhZ3JhbShTdXBwb3J0aW5nTWF0ZXJpYWwgd3BkRGlhZ3JhbSkgewotCQlpZiAodGhpcy53cGREaWFncmFtICE9IHdwZERpYWdyYW0pIHsKLQkJCVN1cHBvcnRpbmdNYXRlcmlhbCBvbGQgPSB0aGlzLndwZERpYWdyYW07Ci0JCQl0aGlzLndwZERpYWdyYW0gPSB3cGREaWFncmFtOwotCQkJdXBkYXRlKG9sZCwgd3BkRGlhZ3JhbSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRBY3Rpdml0eURldGFpbERpYWdyYW0oCi0JCQlTdXBwb3J0aW5nTWF0ZXJpYWwgYWN0aXZpdHlEZXRhaWxEaWFncmFtKSB7Ci0JCWlmICh0aGlzLmFjdGl2aXR5RGV0YWlsRGlhZ3JhbSAhPSBhY3Rpdml0eURldGFpbERpYWdyYW0pIHsKLQkJCVN1cHBvcnRpbmdNYXRlcmlhbCBvbGQgPSB0aGlzLmFjdGl2aXR5RGV0YWlsRGlhZ3JhbTsKLQkJCXRoaXMuYWN0aXZpdHlEZXRhaWxEaWFncmFtID0gYWN0aXZpdHlEZXRhaWxEaWFncmFtOwotCQkJdXBkYXRlKG9sZCwgYWN0aXZpdHlEZXRhaWxEaWFncmFtKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHNldEFjdGl2aXR5RGlhZ3JhbShTdXBwb3J0aW5nTWF0ZXJpYWwgYWN0aXZpdHlEaWFncmFtKSB7Ci0JCWlmICh0aGlzLmFjdGl2aXR5RGlhZ3JhbSAhPSBhY3Rpdml0eURpYWdyYW0pIHsKLQkJCVN1cHBvcnRpbmdNYXRlcmlhbCBvbGQgPSB0aGlzLmFjdGl2aXR5RGlhZ3JhbTsKLQkJCXRoaXMuYWN0aXZpdHlEaWFncmFtID0gYWN0aXZpdHlEaWFncmFtOwotCQkJdXBkYXRlKG9sZCwgYWN0aXZpdHlEaWFncmFtKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIFN1cHBvcnRpbmdNYXRlcmlhbCBvYmplY3QgZm9yIHRoZSBkaWFncmFtIHdpdGggdGhlIGdpdmVuIFVSSQotCSAqIAotCSAqIEBwYXJhbSBkaWFncmFtVVJJCi0JICogQHJldHVybiBudWxsIG9mIHRoZSBTdXBwb3J0aW5nTWF0ZXJpYWwgb2JqZWN0IGNvdWxkIG5vdCBiZSBmb3VuZCBpbiB0aGUKLQkgKiAgICAgICAgIGxpYnJhcnkKLQkgKi8KLQlwcml2YXRlIFN1cHBvcnRpbmdNYXRlcmlhbCBnZXRTdXBwb3J0aW5nTWF0ZXJpYWwoU3RyaW5nIGRpYWdyYW1VUkkpIHsKLQkJLy8gZGlhZ3JhbVVSSSBpcyB0aGUgR1VJRCBvZiB0aGUgc3VwcG9ydGluZyBtYXRlcmlhbCB0aGF0IG11c3QgYmUgaW4gdGhlCi0JCS8vIGxpc3QKLQkJLy8gb2Ygc3VwcG9ydGluZyBtYXRlcmlhbHMgb2YgdGhlIGFjdGl2aXR5Ci0JCS8vCi0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGFjdGl2aXR5LmdldFN1cHBvcnRpbmdNYXRlcmlhbHMoKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCVN1cHBvcnRpbmdNYXRlcmlhbCBlID0gKFN1cHBvcnRpbmdNYXRlcmlhbCkgaXRlci5uZXh0KCk7Ci0JCQlpZiAoZS5nZXRHdWlkKCkuZXF1YWxzKGRpYWdyYW1VUkkpKSB7Ci0JCQkJcmV0dXJuIGU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZShTdXBwb3J0aW5nTWF0ZXJpYWwgb2xkLCBTdXBwb3J0aW5nTWF0ZXJpYWwgbmV1KSB7Ci0JCWlmIChvbGQgIT0gbnVsbCkgewotCQkJYWN0aXZpdHkuZ2V0U3VwcG9ydGluZ01hdGVyaWFscygpLnJlbW92ZShvbGQpOwotCQl9Ci0JCWlmIChuZXUgIT0gbnVsbCkgewotCQkJYWN0aXZpdHkuZ2V0U3VwcG9ydGluZ01hdGVyaWFscygpLmFkZChuZXUpOwotCQl9Ci0JCXNhdmUoKTsKLQl9Ci0KLQkvKioKLQkgKiBDaGVja3MgaWYgdGhlIGdpdmVuIHN1cHBvcnRpbmcgbWF0ZXJpYWwgaXMgYSB1c2VyLWRlZmluZWQgZGlhZ3JhbSBvZiB0aGlzCi0JICogRGlhZ3JhbUluZm8ncyBhY3Rpdml0eQotCSAqIAotCSAqIEBwYXJhbSBzbQotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0RpYWdyYW0oU3VwcG9ydGluZ01hdGVyaWFsIHNtKSB7Ci0JCXJldHVybiBzbSAhPSBudWxsCi0JCQkJJiYgKHNtID09IGFjdGl2aXR5RGlhZ3JhbSB8fCBzbSA9PSBhY3Rpdml0eURldGFpbERpYWdyYW0gfHwgc20gPT0gd3BkRGlhZ3JhbSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL3V0aWwvRGlhZ3JhbU1hbmFnZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC91dGlsL0RpYWdyYW1NYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4MzNiNjguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL3V0aWwvRGlhZ3JhbU1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuSURpYWdyYW1NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtOwotCi0vKioKLSAqIEV4dGVuc2lvbiB0byBjb250cmlidXRlIHRvIGV4dGVuc2lvbiBwb2ludAotICogIm9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuZGlhZ3JhbU1hbmFnZXIiCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlIC0gSnVuIDI3LCAyMDA2Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBEaWFncmFtTWFuYWdlciBpbXBsZW1lbnRzIElEaWFncmFtTWFuYWdlciB7Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5JRGlhZ3JhbU1hbmFnZXIjZ2V0RGlhZ3JhbShvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5LAotCSAqICAgICAgaW50KQotCSAqLwotCXB1YmxpYyBEaWFncmFtIGdldERpYWdyYW0oQWN0aXZpdHkgYWN0LCBpbnQgdHlwZSkgewotCQlyZXR1cm4gR3JhcGhpY2FsRGF0YU1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5nZXRVTUFEaWFncmFtKGFjdCwgdHlwZSwKLQkJCQlmYWxzZSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvdXRpbC9HcmFwaGljYWxEYXRhSGVscGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvdXRpbC9HcmFwaGljYWxEYXRhSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiZmM1NDEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL3V0aWwvR3JhcGhpY2FsRGF0YUhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE1MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkFic3RyYWN0VHJlZUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkFjdGl2aXR5RGV0YWlsRGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5EaWFncmFtUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTW9kZWxGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Sb2xlVGFza0NvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5UeXBlZE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuV29ya0JyZWFrZG93bkVsZW1lbnROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLldvcmtQcm9kdWN0Q29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuTmFtZWROb2RlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuUHJvdmlkZXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5Xb3JrUHJvZHVjdERlc2NyaXB0b3JXcmFwcGVySXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5JRGlhZ3JhbU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpbWVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoQ29ubmVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhFZGdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlNlbWFudGljTW9kZWxCcmlkZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5TaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVU1BU2VtYW50aWNNb2RlbEJyaWRnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya0JyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrT3JkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEdyYXBoaWNhbERhdGFIZWxwZXIgewotCS8qKiBEaWFncmFtIHR5cGUgY29uc3RhbnRzICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUNUSVZJVFlfRElBR1JBTSA9IElEaWFncmFtTWFuYWdlci5BQ1RJVklUWV9ESUFHUkFNOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV09SS19QUk9EVUNUX0RFUEVOREVOQ1lfRElBR1JBTSA9IElEaWFncmFtTWFuYWdlci5XT1JLX1BST0RVQ1RfREVQRU5ERU5DWV9ESUFHUkFNOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUNUSVZJVFlfREVUQUlMX0RJQUdSQU0gPSBJRGlhZ3JhbU1hbmFnZXIuQUNUSVZJVFlfREVUQUlMX0RJQUdSQU07Ci0KLQlzdGF0aWMgZmluYWwgaW50W10gRElBR1JBTV9UWVBFUyA9IHsgQUNUSVZJVFlfRElBR1JBTSwKLQkJCUFDVElWSVRZX0RFVEFJTF9ESUFHUkFNLCBXT1JLX1BST0RVQ1RfREVQRU5ERU5DWV9ESUFHUkFNIH07Ci0KLQlzdGF0aWMgZmluYWwgU3RyaW5nW10gRElBR1JBTV9UWVBFX1RFWFRTID0gewotCQkJRGlhZ3JhbVJlc291cmNlcy50eXBlX2FjdGl2aXR5LCBEaWFncmFtUmVzb3VyY2VzLnR5cGVfV1BELCBEaWFncmFtUmVzb3VyY2VzLnR5cGVfYWN0aXZpdHlEZXRhaWwgfTsgCi0KLQkvKiogUHJvcGVydHkgbmFtZXMgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QX1RZUEUgPSAidHlwZSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BfV09SS19QUk9EVUNUX0NPTVBPU0lURV9UWVBFID0gIndwQ29tcG9zaXRlVHlwZSI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKiogcHJvcGVydHkgbmFtZXMgZm9yIGFjdGl2aXR5IGRldGFpbCBkaWFncmFtICoqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BfQVVUT19MQVlPVVQgPSAiYXV0b2xheW91dCI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QX0lOREVYID0gImluZGV4IjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKiBwcm9wZXJ0eSB2YWx1ZXMgY29uc3RhbnRzIGZvciBhdXRvbGF5b3V0ICoqLwotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BfQVVUT19MQVlPVVRfVkFMVUVfVFJVRSA9ICJ0cnVlIjsgLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BfQVVUT19MQVlPVVRfVkFMVUVfRkFMU0UgPSAiZmFsc2UiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqIFR5cGUgaW5mbyBmb3IgVUkgbm9kZSAoQHNlZSBUeXBlZE5vZGUpICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgR1JBUEhfTk9ERV9TWU5DSF9CQVIgPSAic3luY2hub25pemF0aW9uIGJhciI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEdSQVBIX05PREVfU1RBUlQgPSAic3RhcnQgbm9kZSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEdSQVBIX05PREVfRU5EID0gImVuZCBub2RlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgR1JBUEhfTk9ERV9ERUNJU0lPTiA9ICJkZWNpc2lvbiBub2RlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgR1JBUEhfTk9ERV9GUkVFX1RFWFQgPSAiZnJlZSB0ZXh0IjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqIERpYWdyYW0gdHlwZSBzdHJpbmcgY29uc3RhbnRzICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElBR1JBTV9XT1JLRkxPVyA9ICJXb3JrZmxvdyI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERJQUdSQU1fV09SS19QUk9EVUNUX0RFUEVOREVOQ1kgPSAiV29yayBQcm9kdWN0IERlcGVuZGVuY3kiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBESUFHUkFNX0FDVElWSVRZX0RFVEFJTCA9ICJBY3Rpdml0eSBEZXRhaWwiOyAvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUREX0RJQUdSQU1fVEFTS1NfUEVSX1JPVyA9ICJBQ1RJVklUWV9ERVRBSUxfRElBR1JBTV9UQVNLU19QRVJfUk9XIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBQb2ludCB0b1BvaW50KG9yZy5lY2xpcHNlLmVwZi51bWEuUG9pbnQgcCkgewotCQlyZXR1cm4gbmV3IFBvaW50KHAuZ2V0WCgpLmRvdWJsZVZhbHVlKCksIHAuZ2V0WSgpLmRvdWJsZVZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qb2ludCBuZXdNb2RlbFBvaW50KGludCB4LCBpbnQgeSkgewotCQlvcmcuZWNsaXBzZS5lcGYudW1hLlBvaW50IHAgPSBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQb2ludCgpOwotCQlwLnNldFgobmV3IERvdWJsZSh4KSk7Ci0JCXAuc2V0WShuZXcgRG91YmxlKHkpKTsKLQkJcmV0dXJuIHA7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBQcm9wZXJ0eSBmaW5kUHJvcGVydHkoR3JhcGhOb2RlIG5vZGUsIFN0cmluZyBwcm9wS2V5KSB7Ci0JCWZvciAoaW50IGkgPSBub2RlLmdldFByb3BlcnR5KCkuc2l6ZSgpIC0gMTsgaSA+IC0xOyBpLS0pIHsKLQkJCVByb3BlcnR5IHByb3AgPSAoUHJvcGVydHkpIG5vZGUuZ2V0UHJvcGVydHkoKS5nZXQoaSk7Ci0JCQlpZiAocHJvcEtleS5lcXVhbHMocHJvcC5nZXRLZXkoKSkpCi0JCQkJcmV0dXJuIHByb3A7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHdpZHRoCi0JICogQHBhcmFtIGhlaWdodAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIERpbWVuc2lvbiBuZXdNb2RlbERpbWVuc2lvbihpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKLQkJRGltZW5zaW9uIHNpemUgPSBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVEaW1lbnNpb24oKTsKLQkJc2l6ZS5zZXRXaWR0aChuZXcgRG91YmxlKHdpZHRoKSk7Ci0JCXNpemUuc2V0SGVpZ2h0KG5ldyBEb3VibGUoaGVpZ2h0KSk7Ci0JCXJldHVybiBzaXplOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBmaWxsQ29ubmVjdGlvbnMoTm9kZSBub2RlLCBHcmFwaE5vZGUgZ3JhcGhOb2RlKSB7Ci0JCWJvb2xlYW4gb2xkID0gbm9kZS5lRGVsaXZlcigpOwotCQl0cnkgewotCQkJbm9kZS5lU2V0RGVsaXZlcihmYWxzZSk7Ci0JCQlvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5EaWFncmFtIGRpYWdyYW0gPSAob3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuRGlhZ3JhbSkgbm9kZQotCQkJCQkuZUNvbnRhaW5lcigpOwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gZ3JhcGhOb2RlLmdldEFuY2hvcmFnZSgpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQlHcmFwaENvbm5lY3RvciBjb25uID0gKChHcmFwaENvbm5lY3RvcikgaXRlci5uZXh0KCkpOwotCQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBjb25uLmdldEdyYXBoRWRnZSgpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yCi0JCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQlHcmFwaEVkZ2UgZWRnZSA9IChHcmFwaEVkZ2UpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJaWYoZWRnZS5nZXRBbmNob3IoKS5zaXplKCkgPiAxKSB7IAotCQkJCQkJR3JhcGhDb25uZWN0b3IgdGFyZ2V0Q29ubmVjdG9yOwotCQkJCQkJTGluayBsaW5rID0gbnVsbDsKLQkJCQkJCWlmIChlZGdlLmVDb250YWluZXIoKSA9PSBncmFwaE5vZGUpIHsKLQkJCQkJCQl0YXJnZXRDb25uZWN0b3IgPSAoR3JhcGhDb25uZWN0b3IpIGVkZ2UuZ2V0QW5jaG9yKCkKLQkJCQkJCQkuZ2V0KDEpOwotCQkJCQkJCUdyYXBoTm9kZSB0YXJnZXRHcmFwaE5vZGUgPSAoR3JhcGhOb2RlKSB0YXJnZXRDb25uZWN0b3IKLQkJCQkJCQkuZUNvbnRhaW5lcigpOwotCQkJCQkJCWlmIChncmFwaE5vZGUuZUNvbnRhaW5lcigpID09IHRhcmdldEdyYXBoTm9kZQotCQkJCQkJCQkJLmVDb250YWluZXIoKSkgewotCQkJCQkJCQlPYmplY3QgbGlua2VkT2JqZWN0ID0gdGFyZ2V0R3JhcGhOb2RlOwotCQkJCQkJCQlpZiAodGFyZ2V0R3JhcGhOb2RlLmdldFNlbWFudGljTW9kZWwoKSBpbnN0YW5jZW9mIFVNQVNlbWFudGljTW9kZWxCcmlkZ2UpIHsKLQkJCQkJCQkJCWxpbmtlZE9iamVjdCA9ICgoVU1BU2VtYW50aWNNb2RlbEJyaWRnZSkgdGFyZ2V0R3JhcGhOb2RlCi0JCQkJCQkJCQkJCS5nZXRTZW1hbnRpY01vZGVsKCkpLmdldEVsZW1lbnQoKTsKLQkJCQkJCQkJfQotCQkJCQkJCQlpZihsaW5rZWRPYmplY3QgIT0gbnVsbCl7Ci0JCQkJCQkJCQlOb2RlIHRhcmdldE5vZGUgPSBmaW5kTm9kZShkaWFncmFtLCBsaW5rZWRPYmplY3QpOwotCQkJCQkJCQkJbGluayA9IE1vZGVsRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlTGluaygpOwotCQkJCQkJCQkJbGluay5zZXRTb3VyY2Uobm9kZSk7Ci0JCQkJCQkJCQlsaW5rLnNldFRhcmdldCh0YXJnZXROb2RlKTsKLQkJCQkJCQkJCWxpbmsuc2V0T2JqZWN0KGVkZ2UpOwotCQkJCQkJCQl9ZWxzZXsKLQkJCQkJCQkJCWlmKExpYnJhcnlFZGl0UGx1Z2luLmdldERlZmF1bHQoKS5pc0RlYnVnZ2luZygpKXsKLQkJCQkJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxpbmtlZCBvYmplY3QgaXMgbnVsbDogZm9yOiAiKyBub2RlLmdldEdyYXBoTm9kZSgpICsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJCQkJIjogZm9yIGdyYXBoQ29ubmVjdG9yOiAiKwl0YXJnZXRDb25uZWN0b3IpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCX0KLQkJfSBmaW5hbGx5IHsKLQkJCW5vZGUuZVNldERlbGl2ZXIob2xkKTsKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgTm9kZSBmaW5kTm9kZShvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5EaWFncmFtIGRpYWdyYW0sCi0JCQlHcmFwaE5vZGUgZ05vZGUsIENsYXNzIGFkYXB0ZXJUeXBlKSB7Ci0JCVNlbWFudGljTW9kZWxCcmlkZ2UgYnJpZGdlID0gZ05vZGUuZ2V0U2VtYW50aWNNb2RlbCgpOwotCQlpZiAoYnJpZGdlIGluc3RhbmNlb2YgVU1BU2VtYW50aWNNb2RlbEJyaWRnZSkgewotCQkJSU5vZGVDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA9IChJTm9kZUNoYW5nZUxpc3RlbmVyKSBVbWFVdGlsCi0JCQkJCS5nZXRBZGFwdGVyKCgoVU1BU2VtYW50aWNNb2RlbEJyaWRnZSkgYnJpZGdlKS5nZXRFbGVtZW50KCksCi0JCQkJCQkJYWRhcHRlclR5cGUpOwotCQkJcmV0dXJuIGxpc3RlbmVyLmdldE5vZGUoKTsKLQkJfQotCi0JCS8vIGdOb2RlIGlzIG5vdCBhIGFjdGl2aXR5J3MgR3JhcGhOb2RlLiBUcnkgdG8gZmluZCBhIE5vZGUgd2l0aCBnTm9kZSBhcwotCQkvLyBhIGxpbmtlZCBvYmplY3QgaW4gdGhlIGRpYWdyYW0uCi0JCS8vCi0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGRpYWdyYW0uZ2V0Tm9kZXMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU5vZGUgZWxlbWVudCA9IChOb2RlKSBpdGVyLm5leHQoKTsKLQkJCWlmIChnTm9kZSA9PSBlbGVtZW50LmdldE9iamVjdCgpKSB7Ci0JCQkJcmV0dXJuIGVsZW1lbnQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogRmluZHMgbm9kZSB3aG9zZSBsaW5rZWQgb2JqZWN0IGlzIHRoZSBnaXZlbiBvYmplY3QKLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBOb2RlIGZpbmROb2RlKE5vZGVDb250YWluZXIgY29udGFpbmVyLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGNvbnRhaW5lci5nZXROb2RlcygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJTm9kZSBlbGVtZW50ID0gKE5vZGUpIGl0ZXIubmV4dCgpOwotCQkJaWYgKG9iamVjdCA9PSBlbGVtZW50LmdldE9iamVjdCgpIHx8IG9iamVjdCA9PSBlbGVtZW50LmdldExpbmtlZEVsZW1lbnQoKSkgewotCQkJCXJldHVybiBlbGVtZW50OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEZpbmRzIG5vZGUgd2hvc2UgbGlua2VkIG9iamVjdCBvciBvbmUgb2YgaXRzIGJhc2UgaXMgdGhlIGdpdmVuIG9iamVjdAotCSAqIAotCSAqIEBwYXJhbSBjb250YWluZXIKLQkgKiBAcGFyYW0gb2JqZWN0Ci0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTm9kZSBmaW5kTm9kZShOb2RlQ29udGFpbmVyIGNvbnRhaW5lciwgT2JqZWN0IG9iamVjdCwKLQkJCWJvb2xlYW4gY2hlY2tCYXNlKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGNvbnRhaW5lci5nZXROb2RlcygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJTm9kZSBub2RlID0gKE5vZGUpIGl0ZXIubmV4dCgpOwotCQkJaWYgKG9iamVjdCA9PSBub2RlLmdldE9iamVjdCgpKSB7Ci0JCQkJcmV0dXJuIG5vZGU7Ci0JCQl9IGVsc2UgaWYgKGNoZWNrQmFzZQotCQkJCQkmJiBub2RlLmdldE9iamVjdCgpIGluc3RhbmNlb2YgVmFyaWFiaWxpdHlFbGVtZW50KSB7Ci0JCQkJZm9yIChWYXJpYWJpbGl0eUVsZW1lbnQgdmUgPSAoKFZhcmlhYmlsaXR5RWxlbWVudCkgbm9kZQotCQkJCQkJLmdldE9iamVjdCgpKS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCk7IHZlICE9IG51bGw7IHZlID0gdmUKLQkJCQkJCS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkpIHsKLQkJCQkJaWYgKHZlID09IG9iamVjdCkgewotCQkJCQkJcmV0dXJuIG5vZGU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBOb2RlIGZpbmROb2RlKEFjdGl2aXR5RGV0YWlsRGlhZ3JhbSBkaWFncmFtLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCU5vZGUgbm9kZSA9IG51bGw7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGRpYWdyYW0uZ2V0Tm9kZXMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU5vZGUgZWxlbWVudCA9IChOb2RlKSBpdGVyLm5leHQoKTsKLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgUm9sZVRhc2tDb21wb3NpdGUgCi0JCQkJCXx8IGVsZW1lbnQgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdENvbXBvc2l0ZSkgewotCQkJCW5vZGUgPSBmaW5kTm9kZSgoTm9kZUNvbnRhaW5lcikgZWxlbWVudCwgb2JqZWN0KTsKLQkJCQlpZiAobm9kZSAhPSBudWxsKQotCQkJCQlyZXR1cm4gbm9kZTsKLQkJCX0KLQkJCWlmIChvYmplY3QgPT0gZWxlbWVudC5nZXRPYmplY3QoKSkgewotCQkJCXJldHVybiBlbGVtZW50OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIE5vZGUgZmluZE5vZGUoQWN0aXZpdHlEZXRhaWxEaWFncmFtIGRpYWdyYW0sIE9iamVjdCBvYmplY3QsIENsYXNzIHR5cGUpIHsKLQkJTm9kZSBub2RlID0gbnVsbDsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZGlhZ3JhbS5nZXROb2RlcygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJTm9kZSBlbGVtZW50ID0gKE5vZGUpIGl0ZXIubmV4dCgpOwotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBSb2xlVGFza0NvbXBvc2l0ZSAKLQkJCQkJfHwgZWxlbWVudCBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0Q29tcG9zaXRlKSB7Ci0JCQkJbm9kZSA9IGZpbmROb2RlKChOb2RlQ29udGFpbmVyKSBlbGVtZW50LCBvYmplY3QpOwotCQkJCWlmIChub2RlICE9IG51bGwpCi0JCQkJCXJldHVybiBub2RlOwotCQkJfQotCQkJaWYgKG9iamVjdCA9PSBlbGVtZW50LmdldE9iamVjdCgpICYmIHR5cGUuaXNJbnN0YW5jZShlbGVtZW50KSkgewotCQkJCXJldHVybiBlbGVtZW50OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIExpbmsgZmluZExpbmsoTm9kZSBzb3VyY2UsIE9iamVjdCB0YXJnZXRMaW5rZWRFbGVtZW50KSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHNvdXJjZS5nZXRPdXRnb2luZ0Nvbm5lY3Rpb25zKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlMaW5rIGxpbmsgPSAoTGluaykgaXRlci5uZXh0KCk7Ci0JCQlOb2RlIHRhcmdldCA9IGxpbmsuZ2V0VGFyZ2V0KCk7Ci0JCQlpZih0YXJnZXQgIT0gbnVsbCAmJiB0YXJnZXQuZ2V0TGlua2VkRWxlbWVudCgpID09IHRhcmdldExpbmtlZEVsZW1lbnQpIHsKLQkJCQlyZXR1cm4gbGluazsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0VHlwZVN0cmluZyhpbnQgdHlwZSkgewotCQlzd2l0Y2ggKHR5cGUpIHsKLQkJY2FzZSBUeXBlZE5vZGUuREVDSVNJT046Ci0JCQlyZXR1cm4gR1JBUEhfTk9ERV9ERUNJU0lPTjsKLQkJY2FzZSBUeXBlZE5vZGUuRU5EOgotCQkJcmV0dXJuIEdSQVBIX05PREVfRU5EOwotCQljYXNlIFR5cGVkTm9kZS5TVEFSVDoKLQkJCXJldHVybiBHUkFQSF9OT0RFX1NUQVJUOwotCQljYXNlIFR5cGVkTm9kZS5TWU5DSF9CQVI6Ci0JCQlyZXR1cm4gR1JBUEhfTk9ERV9TWU5DSF9CQVI7Ci0JCWNhc2UgVHlwZWROb2RlLkZSRUVfVEVYVDoKLQkJCXJldHVybiBHUkFQSF9OT0RFX0ZSRUVfVEVYVDsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIEdyYXBoTm9kZSBuZXdUeXBlZEdyYXBoTm9kZShpbnQgdHlwZSkgewotCQlHcmFwaE5vZGUgZ3JhcGhOb2RlID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlR3JhcGhOb2RlKCk7Ci0JCVNpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50IGJyaWRnZSA9IFVtYUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJLmNyZWF0ZVNpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50KCk7Ci0JCWJyaWRnZS5zZXRUeXBlSW5mbyhnZXRUeXBlU3RyaW5nKHR5cGUpKTsKLQkJZ3JhcGhOb2RlLnNldFNlbWFudGljTW9kZWwoYnJpZGdlKTsKLQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5Qb2ludCBwb2ludCA9IFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVBvaW50KCk7Ci0JCXBvaW50LnNldFgobmV3IERvdWJsZSgtMSkpOwotCQlwb2ludC5zZXRZKG5ldyBEb3VibGUoLTEpKTsKLQkJZ3JhcGhOb2RlLnNldFBvc2l0aW9uKHBvaW50KTsKLQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5EaW1lbnNpb24gZGltID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRGltZW5zaW9uKCk7Ci0JCWRpbS5zZXRXaWR0aChuZXcgRG91YmxlKC0xKSk7Ci0JCWRpbS5zZXRIZWlnaHQobmV3IERvdWJsZSgtMSkpOwotCQlncmFwaE5vZGUuc2V0U2l6ZShkaW0pOwotCi0JCWlmICh0eXBlID09IFR5cGVkTm9kZS5GUkVFX1RFWFQpIHsKLQkJCWdyYXBoTm9kZS5zZXROYW1lKERpYWdyYW1SZXNvdXJjZXMuYWRkRnJlZVR4dCk7IAotCQl9Ci0JCWlmICh0eXBlID09IFR5cGVkTm9kZS5GUkVFX1RFWFQpIHsKLQkJCVByb3BlcnR5IHByb3BlcnR5ID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUHJvcGVydHkoKTsKLQkJCXByb3BlcnR5LnNldEtleShHUkFQSF9OT0RFX0ZSRUVfVEVYVCk7Ci0JCQlwcm9wZXJ0eS5zZXRWYWx1ZShEaWFncmFtUmVzb3VyY2VzLmFkZEZyZWVUeHQpOyAKLQkJCUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWxpc3QuYWRkKHByb3BlcnR5KTsKLQkJCWdyYXBoTm9kZS5zZXQoVW1hUGFja2FnZS5HUkFQSF9OT0RFX19QUk9QRVJUWSwgbGlzdCk7Ci0JCX0KLQotCQlyZXR1cm4gZ3JhcGhOb2RlOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBsaW5rCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZUdyYXBoaWNhbERhdGEoTGluayBsaW5rKSB7Ci0JCS8vIEdyYXBoaWNhbERhdGFNYW5hZ2VyLmdldEluc3RhbmNlKCkucmVtb3ZlR3JhcGhDb25uZWN0b3JQYWlyKGxpbmsuZ2V0U291cmNlKCkuZ2V0R3JhcGhOb2RlKCksCi0JCS8vIGxpbmsuZ2V0VGFyZ2V0KCkuZ2V0R3JhcGhOb2RlKCkpOwotCQkKLQkJR3JhcGhFZGdlIGVkZ2UgPSAoR3JhcGhFZGdlKSBsaW5rLmdldE9iamVjdCgpOwotCQlpZihlZGdlICE9IG51bGwpIHsKLQkJCUdyYXBoaWNhbERhdGFNYW5hZ2VyLmdldEluc3RhbmNlKCkucmVtb3ZlR3JhcGhFZGdlKGVkZ2UpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGxpbmsKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgYWRkR3JhcGhpY2FsRGF0YShMaW5rIGxpbmspIHsKLQkJR3JhcGhFZGdlIGVkZ2UgPSAoR3JhcGhFZGdlKSBsaW5rLmdldE9iamVjdCgpOwotCQlpZiAoZWRnZSA9PSBudWxsKSB7Ci0JCQkvLyBuZXcgbGluawotCQkJLy8KLQkJCWVkZ2UgPSBHcmFwaGljYWxEYXRhTWFuYWdlci5nZXRJbnN0YW5jZSgpLmFkZEdyYXBoQ29ubmVjdG9yUGFpcigKLQkJCQkJbGluay5nZXRTb3VyY2UoKS5nZXRHcmFwaE5vZGUoKSwKLQkJCQkJbGluay5nZXRUYXJnZXQoKS5nZXRHcmFwaE5vZGUoKSk7Ci0JCQlsaW5rLnNldE9iamVjdChlZGdlKTsKLQotCQkJLy8gc2F2ZSB0aGUgc291cmNlIGVuZCBwb2ludCBhbmQgdGFyZ2V0IGVuZCBwb2ludCBmcm9tIHRoZSBnaXZlbgotCQkJLy8gbGluawotCQkJLy8KLQkJCWxpbmsuc2V0U291cmNlRW5kUG9pbnQobGluay5nZXRTb3VyY2VFbmRQb2ludCgpKTsKLQkJCWxpbmsuc2V0VGFyZ2V0RW5kUG9pbnQobGluay5nZXRUYXJnZXRFbmRQb2ludCgpKTsKLQkJfSBlbHNlIHsKLQkJCS8vIHVuZG8gZGVsZXRlZCBsaW5rCi0JCQkvLwotCQkJR3JhcGhOb2RlIHNyY05vZGUgPSBsaW5rLmdldFNvdXJjZSgpLmdldEdyYXBoTm9kZSgpOwotCQkJR3JhcGhOb2RlIHRhcmdldE5vZGUgPSBsaW5rLmdldFRhcmdldCgpLmdldEdyYXBoTm9kZSgpOwotCQkJT2JqZWN0IHNyY0Nvbm5lY3RvciA9IGVkZ2UuZ2V0QW5jaG9yKCkuZ2V0KDApOwotCQkJc3JjTm9kZS5nZXRBbmNob3JhZ2UoKS5hZGQoKEdyYXBoQ29ubmVjdG9yKSBzcmNDb25uZWN0b3IpOwotCQkJc3JjTm9kZS5nZXRDb250YWluZWQoKS5hZGQoZWRnZSk7Ci0JCQlPYmplY3QgdGFyZ2V0Q29ubmVjdG9yID0gZWRnZS5nZXRBbmNob3IoKS5nZXQoMSk7Ci0JCQl0YXJnZXROb2RlLmdldEFuY2hvcmFnZSgpLmFkZCgoR3JhcGhDb25uZWN0b3IpIHRhcmdldENvbm5lY3Rvcik7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0U2VtYW50aWNNb2RlbChMaW5rIGxpbmssIFdvcmtPcmRlciB3b3JrT3JkZXIpIHsKLQkJLy8gc2V0IHRoZSBXb3JrT3JkZXIgYXMgdGhlIGVsZW1lbnQgb2YgdGhlIFNlbWFudGljTW9kZWwgb2YgdGhlIGxpbmsncwotCQkvLyBHcmFwaEVkZ2UKLQkJLy8KLQkJR3JhcGhFZGdlIGVkZ2UgPSAoR3JhcGhFZGdlKSBsaW5rLmdldE9iamVjdCgpOwotCQlVTUFTZW1hbnRpY01vZGVsQnJpZGdlIGJyaWRnZSA9IFVtYUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJLmNyZWF0ZVVNQVNlbWFudGljTW9kZWxCcmlkZ2UoKTsKLQkJYnJpZGdlLnNldEVsZW1lbnQod29ya09yZGVyKTsKLQkJZWRnZS5zZXRTZW1hbnRpY01vZGVsKGJyaWRnZSk7Ci0JfQotCi0JLy8gcHVibGljIHN0YXRpYyBDb2xsZWN0aW9uIGdldFNvdXJjZUFjdGl2aXR5Tm9kZXMoVHlwZWROb2RlIHR5cGVkTm9kZSkgewotCS8vIExpc3QgYWN0Tm9kZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JLy8gZ2V0U291cmNlQWN0aXZpdHlOb2RlcyhhY3ROb2RlcywgdHlwZWROb2RlKTsKLQkvLyByZXR1cm4gYWN0Tm9kZXM7Ci0JLy8gfQotCi0JcHVibGljIHN0YXRpYyBDb2xsZWN0aW9uIGdldFNvdXJjZU5vZGVzKFR5cGVkTm9kZSB0eXBlZE5vZGUsIENsYXNzIHR5cGUpIHsKLQkJTGlzdCBhY3ROb2RlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZ2V0U291cmNlTm9kZXMoYWN0Tm9kZXMsIHR5cGVkTm9kZSwgdHlwZSk7Ci0JCXJldHVybiBhY3ROb2RlczsKLQl9Ci0KLQkvLyBwdWJsaWMgc3RhdGljIHZvaWQgZ2V0U291cmNlQWN0aXZpdHlOb2RlcyhDb2xsZWN0aW9uIGFjdE5vZGVzLCBUeXBlZE5vZGUKLQkvLyB0eXBlZE5vZGUpIHsKLQkvLyBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB0eXBlZE5vZGUuZ2V0SW5jb21pbmdDb25uZWN0aW9ucygpLml0ZXJhdG9yKCk7Ci0JLy8gaXRlci5oYXNOZXh0KCk7KSB7Ci0JLy8gTGluayBsaW5rID0gKExpbmspaXRlci5uZXh0KCk7Ci0JLy8gTm9kZSBzb3VyY2UgPSBsaW5rLmdldFNvdXJjZSgpOwotCS8vIGlmKHNvdXJjZSBpbnN0YW5jZW9mIEFjdGl2aXR5Tm9kZSkgewotCS8vIGFjdE5vZGVzLmFkZChzb3VyY2UpOwotCS8vIH0KLQkvLyBlbHNlIGlmKHNvdXJjZSBpbnN0YW5jZW9mIFR5cGVkTm9kZSkgewotCS8vIGdldFNvdXJjZUFjdGl2aXR5Tm9kZXMoYWN0Tm9kZXMsIChUeXBlZE5vZGUpIHNvdXJjZSk7Ci0JLy8gfQotCS8vIH0KLQkvLyB9Ci0KLQkvLyBwdWJsaWMgc3RhdGljIENvbGxlY3Rpb24gZ2V0VGFyZ2V0QWN0aXZpdHlOb2RlcyhUeXBlZE5vZGUgdHlwZWROb2RlKSB7Ci0JLy8gTGlzdCBhY3ROb2RlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkvLyBnZXRUYXJnZXRBY3Rpdml0eU5vZGVzKGFjdE5vZGVzLCB0eXBlZE5vZGUpOwotCS8vIHJldHVybiBhY3ROb2RlczsKLQkvLyB9Ci0KLQlwdWJsaWMgc3RhdGljIENvbGxlY3Rpb24gZ2V0VGFyZ2V0Tm9kZXMoVHlwZWROb2RlIHR5cGVkTm9kZSwgQ2xhc3MgdHlwZSkgewotCQlMaXN0IGFjdE5vZGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlnZXRUYXJnZXROb2RlcyhhY3ROb2RlcywgdHlwZWROb2RlLCB0eXBlKTsKLQkJcmV0dXJuIGFjdE5vZGVzOwotCX0KLQotCS8vIHB1YmxpYyBzdGF0aWMgdm9pZCBnZXRUYXJnZXRBY3Rpdml0eU5vZGVzKENvbGxlY3Rpb24gYWN0Tm9kZXMsIFR5cGVkTm9kZQotCS8vIHR5cGVkTm9kZSkgewotCS8vIGZvciAoSXRlcmF0b3IgaXRlciA9IHR5cGVkTm9kZS5nZXRPdXRnb2luZ0Nvbm5lY3Rpb25zKCkuaXRlcmF0b3IoKTsKLQkvLyBpdGVyLmhhc05leHQoKTspIHsKLQkvLyBMaW5rIGxpbmsgPSAoTGluaylpdGVyLm5leHQoKTsKLQkvLyBOb2RlIHRhcmdldCA9IGxpbmsuZ2V0VGFyZ2V0KCk7Ci0JLy8gaWYodGFyZ2V0IGluc3RhbmNlb2YgQWN0aXZpdHlOb2RlKSB7Ci0JLy8gYWN0Tm9kZXMuYWRkKHRhcmdldCk7Ci0JLy8gfQotCS8vIGVsc2UgaWYodGFyZ2V0IGluc3RhbmNlb2YgVHlwZWROb2RlKSB7Ci0JLy8gZ2V0VGFyZ2V0QWN0aXZpdHlOb2RlcyhhY3ROb2RlcywgKFR5cGVkTm9kZSkgdGFyZ2V0KTsKLQkvLyB9Ci0JLy8gfQotCS8vIH0KLQotCS8qKgotCSAqIEdldHMgYWxsIG5vZGVzIHdpdGggdGhlIGdpdmVuIHR5cGUgdGhhdCBhcmUgZGlyZWN0IG9yIGluZGlyZWN0IHRhcmdldHMgb2YKLQkgKiB0aGUgZ2l2ZW4gc291cmNlIHR5cGVkTm9kZS4KLQkgKiAKLQkgKiBAcGFyYW0gYWN0Tm9kZXMKLQkgKiBAcGFyYW0gdHlwZWROb2RlCi0JICogQHBhcmFtIHR5cGUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgZ2V0VGFyZ2V0Tm9kZXMoQ29sbGVjdGlvbiBhY3ROb2RlcywgVHlwZWROb2RlIHR5cGVkTm9kZSwKLQkJCUNsYXNzIHR5cGUpIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gdHlwZWROb2RlLmdldE91dGdvaW5nQ29ubmVjdGlvbnMoKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCUxpbmsgbGluayA9IChMaW5rKSBpdGVyLm5leHQoKTsKLQkJCU5vZGUgdGFyZ2V0ID0gbGluay5nZXRUYXJnZXQoKTsKLQkJCWlmICh0eXBlLmlzSW5zdGFuY2UodGFyZ2V0KSkgewotCQkJCWFjdE5vZGVzLmFkZCh0YXJnZXQpOwotCQkJfSBlbHNlIGlmICh0YXJnZXQgaW5zdGFuY2VvZiBUeXBlZE5vZGUpIHsKLQkJCQlnZXRUYXJnZXROb2RlcyhhY3ROb2RlcywgKFR5cGVkTm9kZSkgdGFyZ2V0LCB0eXBlKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBnZXRTb3VyY2VOb2RlcyhDb2xsZWN0aW9uIGFjdE5vZGVzLCBUeXBlZE5vZGUgdHlwZWROb2RlLAotCQkJQ2xhc3MgdHlwZSkgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB0eXBlZE5vZGUuZ2V0SW5jb21pbmdDb25uZWN0aW9ucygpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkuaGFzTmV4dCgpOykgewotCQkJTGluayBsaW5rID0gKExpbmspIGl0ZXIubmV4dCgpOwotCQkJTm9kZSBzb3VyY2UgPSBsaW5rLmdldFNvdXJjZSgpOwotCQkJaWYgKHR5cGUuaXNJbnN0YW5jZShzb3VyY2UpKSB7Ci0JCQkJYWN0Tm9kZXMuYWRkKHNvdXJjZSk7Ci0JCQl9IGVsc2UgaWYgKHNvdXJjZSBpbnN0YW5jZW9mIFR5cGVkTm9kZSkgewotCQkJCWdldFNvdXJjZU5vZGVzKGFjdE5vZGVzLCAoVHlwZWROb2RlKSBzb3VyY2UsIHR5cGUpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyBOb2RlIGdldEZpcnN0U291cmNlTm9kZShUeXBlZE5vZGUgdHlwZWROb2RlLCBDbGFzcyB0eXBlKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHR5cGVkTm9kZS5nZXRJbmNvbWluZ0Nvbm5lY3Rpb25zKCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQlMaW5rIGxpbmsgPSAoTGluaykgaXRlci5uZXh0KCk7Ci0JCQlOb2RlIHNvdXJjZSA9IGxpbmsuZ2V0U291cmNlKCk7Ci0JCQlpZiAodHlwZS5pc0luc3RhbmNlKHNvdXJjZSkpIHsKLQkJCQlyZXR1cm4gc291cmNlOwotCQkJfSBlbHNlIGlmIChzb3VyY2UgaW5zdGFuY2VvZiBUeXBlZE5vZGUpIHsKLQkJCQlzb3VyY2UgPSBnZXRGaXJzdFNvdXJjZU5vZGUoKFR5cGVkTm9kZSkgc291cmNlLCB0eXBlKTsKLQkJCQlpZiAoc291cmNlICE9IG51bGwpCi0JCQkJCXJldHVybiBzb3VyY2U7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBXb3JrT3JkZXIgcmVtb3ZlV29ya09yZGVyKE5hbWVkTm9kZUltcGwgbm9kZSwKLQkJCU9iamVjdCBwcmVkQnJlYWtkb3duRWxlbWVudCkgewotCQlib29sZWFuIG5vdGlmeSA9IG5vZGUuaXNOb3RpZmljYXRpb25FbmFibGVkKCk7Ci0JCXRyeSB7Ci0JCQlub2RlLnNldE5vdGlmaWNhdGlvbkVuYWJsZWQoZmFsc2UpOwotCQkJcmV0dXJuIFVtYVV0aWwucmVtb3ZlV29ya09yZGVyKChXb3JrQnJlYWtkb3duRWxlbWVudCkgbm9kZQotCQkJCQkuZ2V0T2JqZWN0KCksIHByZWRCcmVha2Rvd25FbGVtZW50KTsKLQkJfSBmaW5hbGx5IHsKLQkJCW5vZGUuc2V0Tm90aWZpY2F0aW9uRW5hYmxlZChub3RpZnkpOwotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyBXb3JrT3JkZXIgYWRkRGVmYXVsdFdvcmtPcmRlcihOYW1lZE5vZGVJbXBsIG5vZGUsCi0JCQlXb3JrQnJlYWtkb3duRWxlbWVudCBwcmVkQnJlYWtkb3duRWxlbWVudCkgewotCQlib29sZWFuIG5vdGlmeSA9IG5vZGUuaXNOb3RpZmljYXRpb25FbmFibGVkKCk7Ci0JCXRyeSB7Ci0JCQlub2RlLnNldE5vdGlmaWNhdGlvbkVuYWJsZWQoZmFsc2UpOwotCQkJcmV0dXJuIFVtYVV0aWwuY3JlYXRlRGVmYXVsdFdvcmtPcmRlcigoV29ya0JyZWFrZG93bkVsZW1lbnQpIG5vZGUKLQkJCQkJLmdldE9iamVjdCgpLCBwcmVkQnJlYWtkb3duRWxlbWVudCk7Ci0JCX0gZmluYWxseSB7Ci0JCQlub2RlLnNldE5vdGlmaWNhdGlvbkVuYWJsZWQobm90aWZ5KTsKLQkJfQotCi0JfQotCi0JLyoqCi0JICogQHBhcmFtIHRhc2tEZXNjcmlwdG9yCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBoYXNOb1JvbGVEZXNjcmlwdG9yQXNzb2NpYXRlZCgKLQkJCVRhc2tEZXNjcmlwdG9yIHRhc2tEZXNjcmlwdG9yKSB7Ci0JCXJldHVybiB0YXNrRGVzY3JpcHRvci5nZXRQZXJmb3JtZWRQcmltYXJpbHlCeSgpLmlzRW1wdHkoKTsKLQkJLy8gY29tbWVudGVkIC0gcmVxdWlyZW1lbnRzIG5vdCB0byBhbGxvdyBhZGRpdGlvbmFsIHBlcmZvcm1lciBhbmQKLQkJLy8gYXNzaXN0ZWQgYnkgaW4gZGlhZ3JhbXMuCi0JCS8vICYmIHRhc2tEZXNjcmlwdG9yLmdldEFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5KCkuaXNFbXB0eSgpOwotCQkvLyAmJiB0YXNrRGVzY3JpcHRvci5nZXRBc3Npc3RlZEJ5KCkuaXNFbXB0eSgpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBkaWFncmFtCi0JICogQHBhcmFtIG5vZGUKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNvbnRhaW5zKE5vZGVDb250YWluZXIgY29udGFpbmVyLCBOb2RlIG5vZGUpIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gY29udGFpbmVyLmdldE5vZGVzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgY2hpbGQgPSBpdGVyLm5leHQoKTsKLQkJCWlmIChjaGlsZCA9PSBub2RlKQotCQkJCXJldHVybiB0cnVlOwotCQkJaWYgKGNoaWxkIGluc3RhbmNlb2YgTm9kZUNvbnRhaW5lcgotCQkJCQkmJiBjb250YWlucygoTm9kZUNvbnRhaW5lcikgY2hpbGQsIG5vZGUpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiByZWZyZXNoRnJvbUJhc2UoRGlhZ3JhbSBkaWFncmFtKSB7Ci0JCS8vIGZpbmQgdGhlIGJhc2UgZGlhZ3JhbQotCQkvLwotCQlTZW1hbnRpY01vZGVsQnJpZGdlIG1vZGVsQnJpZGdlID0gZGlhZ3JhbS5nZXRTZW1hbnRpY01vZGVsKCk7Ci0JCWlmIChtb2RlbEJyaWRnZSBpbnN0YW5jZW9mIFVNQVNlbWFudGljTW9kZWxCcmlkZ2UpIHsKLQkJCVVNQVNlbWFudGljTW9kZWxCcmlkZ2UgdW1hTW9kZWxCcmlkZ2UgPSAoKFVNQVNlbWFudGljTW9kZWxCcmlkZ2UpIG1vZGVsQnJpZGdlKTsKLQkJCUFjdGl2aXR5IGFjdCA9IChBY3Rpdml0eSkgdW1hTW9kZWxCcmlkZ2UuZ2V0RWxlbWVudCgpOwotCQkJQWN0aXZpdHkgYmFzZSA9IChBY3Rpdml0eSkgYWN0LmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsKLQkJCWlmIChiYXNlID09IG51bGwKLQkJCQkJfHwgYWN0LmdldFZhcmlhYmlsaXR5VHlwZSgpID09IFZhcmlhYmlsaXR5VHlwZS5MT0NBTF9SRVBMQUNFTUVOVCkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCWludCBkaWFncmFtVHlwZSA9IEdyYXBoaWNhbERhdGFNYW5hZ2VyLmdldEluc3RhbmNlKCkKLQkJCQkJLmdldERpYWdyYW1UeXBlKGRpYWdyYW0pOwotCQkJc3dpdGNoIChkaWFncmFtVHlwZSkgewotCQkJY2FzZSBBQ1RJVklUWV9ESUFHUkFNOiB7Ci0JCQkJRGlhZ3JhbSBiYXNlRGlhZ3JhbSA9IEdyYXBoaWNhbERhdGFNYW5hZ2VyLmdldEluc3RhbmNlKCkKLQkJCQkJCS5nZXRVTUFEaWFncmFtKGJhc2UsIGRpYWdyYW1UeXBlLCBmYWxzZSk7Ci0JCQkJaWYgKGJhc2VEaWFncmFtID09IG51bGwpCi0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQlMaXN0IG9sZE5vZGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCURpYWdyYW0gY29weSA9IGNvcHlEaWFncmFtKGJhc2VEaWFncmFtKTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBiYXNlRGlhZ3JhbS5nZXRDb250YWluZWQoKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQlHcmFwaE5vZGUgYmFzZU5vZGUgPSAoR3JhcGhOb2RlKSBpdGVyLm5leHQoKTsKLQkJCQkJbW9kZWxCcmlkZ2UgPSBiYXNlTm9kZS5nZXRTZW1hbnRpY01vZGVsKCk7Ci0JCQkJCWlmIChtb2RlbEJyaWRnZSBpbnN0YW5jZW9mIFVNQVNlbWFudGljTW9kZWxCcmlkZ2UpIHsKLQkJCQkJCS8vIHRoaXMgaXMgYSBlbGVtZW50J3Mgbm9kZQotCQkJCQkJTWV0aG9kRWxlbWVudCBlID0gKChVTUFTZW1hbnRpY01vZGVsQnJpZGdlKSBtb2RlbEJyaWRnZSkKLQkJCQkJCQkJLmdldEVsZW1lbnQoKTsKLQkJCQkJCUdyYXBoTm9kZSBub2RlID0gR3JhcGhpY2FsRGF0YU1hbmFnZXIuZmluZEdyYXBoTm9kZSgKLQkJCQkJCQkJZGlhZ3JhbSwgZSk7Ci0JCQkJCQlpZiAobm9kZSAhPSBudWxsKSB7Ci0JCQkJCQkJb2xkTm9kZXMuYWRkKG5vZGUpOwotCQkJCQkJfQotCQkJCQl9IGVsc2UgaWYgKGlzVUlHcmFwaE5vZGUoYmFzZU5vZGUpKSB7Ci0JCQkJCQlHcmFwaE5vZGUgbm9kZSA9IGZpbmRVSUdyYXBoTm9kZShkaWFncmFtLCBiYXNlTm9kZQotCQkJCQkJCQkuZ2V0R3VpZCgpKTsKLQkJCQkJCWlmIChub2RlICE9IG51bGwpIHsKLQkJCQkJCQlvbGROb2Rlcy5hZGQobm9kZSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQkvLyAvLyByZW1vdmUgYWxsIHRoZSBHcmFwaEVkZ2VzIG9mIHRoZSBvbGQgbm9kZXMKLQkJCQkvLyAvLwotCQkJCS8vIExpc3QgcmVtb3ZlRWRnZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJLy8gZm9yIChJdGVyYXRvciBpdGVyID0gb2xkTm9kZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJLy8gR3JhcGhOb2RlIG5vZGUgPSAoR3JhcGhOb2RlKSBpdGVyLm5leHQoKTsKLQkJCQkvLyBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gbm9kZS5nZXRDb250YWluZWQoKS5pdGVyYXRvcigpOwotCQkJCS8vIGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCQkvLyBPYmplY3QgZWxlbWVudCA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkvLyBpZihlbGVtZW50IGluc3RhbmNlb2YgR3JhcGhFZGdlKSB7Ci0JCQkJLy8gcmVtb3ZlRWRnZXMuYWRkKGVsZW1lbnQpOwotCQkJCS8vIH0KLQkJCQkvLyB9Ci0JCQkJLy8gfQotCQkJCS8vIGlmKCFyZW1vdmVFZGdlcy5pc0VtcHR5KCkpIHsKLQkJCQkvLyBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSByZW1vdmVFZGdlcy5pdGVyYXRvcigpOyBpdGVyCi0JCQkJLy8gLmhhc05leHQoKTspIHsKLQkJCQkvLyBHcmFwaGljYWxEYXRhTWFuYWdlci5nZXRJbnN0YW5jZSgpLnJlbW92ZUdyYXBoRWRnZSgoR3JhcGhFZGdlKQotCQkJCS8vIGl0ZXIubmV4dCgpKTsKLQkJCQkvLyB9Ci0JCQkJLy8gfQotCi0JCQkJLy8gcmVtb3ZlIG9sZCBub2RlcwotCQkJCS8vCi0JCQkJZGlhZ3JhbS5nZXRDb250YWluZWQoKS5yZW1vdmVBbGwob2xkTm9kZXMpOwotCi0JCQkJLy8gcmVtb3ZlIHVudXNlZCBvbGQgVUkgbm9kZXMgJiYgbm9kZXMgb2YgY29udHJpYnV0b3IvcmVwbGFjZXIKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBkaWFncmFtLmdldENvbnRhaW5lZCgpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCUdyYXBoTm9kZSBub2RlID0gKEdyYXBoTm9kZSkgaXRlci5uZXh0KCk7Ci0JCQkJCWlmIChpc1VJR3JhcGhOb2RlKG5vZGUpCi0JCQkJCQkJJiYgbm9kZS5nZXRCcmllZkRlc2NyaXB0aW9uKCkgIT0gbnVsbAotCQkJCQkJCSYmIG5vZGUuZ2V0QnJpZWZEZXNjcmlwdGlvbigpLmxlbmd0aCgpID4gMAotCQkJCQkvLyAmJiBub2RlLmdldENvbnRhaW5lZCgpLmlzRW1wdHkoKQotCQkJCQkpIHsKLQkJCQkJCWl0ZXIucmVtb3ZlKCk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlTZW1hbnRpY01vZGVsQnJpZGdlIGJyaWRnZSA9IG5vZGUuZ2V0U2VtYW50aWNNb2RlbCgpOwotCQkJCQkJaWYgKGJyaWRnZSBpbnN0YW5jZW9mIFVNQVNlbWFudGljTW9kZWxCcmlkZ2UpIHsKLQkJCQkJCQlNZXRob2RFbGVtZW50IGUgPSAoKFVNQVNlbWFudGljTW9kZWxCcmlkZ2UpIGJyaWRnZSkKLQkJCQkJCQkJCS5nZXRFbGVtZW50KCk7Ci0JCQkJCQkJaWYgKGUgaW5zdGFuY2VvZiBBY3Rpdml0eQotCQkJCQkJCQkJJiYgKChBY3Rpdml0eSkgZSkKLQkJCQkJCQkJCQkJLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSAhPSBudWxsKSB7Ci0JCQkJCQkJCWl0ZXIucmVtb3ZlKCk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCi0JCQkJLy8gcmVwbGFjZSBhc3NvY2lhdGVkIGJhc2UgZWxlbWVudCB3aXRoIGNvbnRyaWJ1dGluZy9yZXBsYWNpbmcKLQkJCQkvLyBlbGVtZW50Ci0JCQkJLy8KLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBhY3QuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQlPYmplY3QgZWxlbWVudCA9IGl0ZXIubmV4dCgpOwotCQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJCQlWYXJpYWJpbGl0eUVsZW1lbnQgYmFzZUVsZW1lbnQgPSAoKEFjdGl2aXR5KSBlbGVtZW50KQotCQkJCQkJCQkuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpOwotCQkJCQkJR3JhcGhOb2RlIG5vZGUgPSBHcmFwaGljYWxEYXRhTWFuYWdlci5maW5kR3JhcGhOb2RlKAotCQkJCQkJCQljb3B5LCBiYXNlRWxlbWVudCk7Ci0JCQkJCQlpZiAobm9kZSAhPSBudWxsKSB7Ci0JCQkJCQkJVU1BU2VtYW50aWNNb2RlbEJyaWRnZSBicmlkZ2UgPSAoVU1BU2VtYW50aWNNb2RlbEJyaWRnZSkgbm9kZQotCQkJCQkJCQkJLmdldFNlbWFudGljTW9kZWwoKTsKLQkJCQkJCQlicmlkZ2Uuc2V0RWxlbWVudCgoTWV0aG9kRWxlbWVudCkgZWxlbWVudCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQkvLyBhZGQgbmV3IG5vZGVzCi0JCQkJLy8KLQkJCQlkaWFncmFtLmdldENvbnRhaW5lZCgpLmFkZEFsbChjb3B5LmdldENvbnRhaW5lZCgpKTsKLQotCQkJCWJyZWFrOwotCQkJfQotCQkJZGVmYXVsdDogewotCQkJCURpYWdyYW0gYmFzZURpYWdyYW0gPSBHcmFwaGljYWxEYXRhTWFuYWdlci5nZXRJbnN0YW5jZSgpCi0JCQkJCQkuZ2V0VU1BRGlhZ3JhbShiYXNlLCBkaWFncmFtVHlwZSwgZmFsc2UpOwotCQkJCWlmIChiYXNlRGlhZ3JhbSA9PSBudWxsKQotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJTGlzdCBvbGROb2RlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQlEaWFncmFtIGNvcHkgPSBjb3B5RGlhZ3JhbShiYXNlRGlhZ3JhbSk7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gYmFzZURpYWdyYW0uZ2V0Q29udGFpbmVkKCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJR3JhcGhOb2RlIGJhc2VOb2RlID0gKEdyYXBoTm9kZSkgaXRlci5uZXh0KCk7Ci0JCQkJCW1vZGVsQnJpZGdlID0gYmFzZU5vZGUuZ2V0U2VtYW50aWNNb2RlbCgpOwotCQkJCQlpZiAobW9kZWxCcmlkZ2UgaW5zdGFuY2VvZiBVTUFTZW1hbnRpY01vZGVsQnJpZGdlKSB7Ci0JCQkJCQkvLyB0aGlzIGlzIGEgZWxlbWVudCdzIG5vZGUKLQkJCQkJCU1ldGhvZEVsZW1lbnQgZSA9ICgoVU1BU2VtYW50aWNNb2RlbEJyaWRnZSkgbW9kZWxCcmlkZ2UpCi0JCQkJCQkJCS5nZXRFbGVtZW50KCk7Ci0JCQkJCQlHcmFwaE5vZGUgbm9kZSA9IEdyYXBoaWNhbERhdGFNYW5hZ2VyLmZpbmRHcmFwaE5vZGUoCi0JCQkJCQkJCWRpYWdyYW0sIGUpOwotCQkJCQkJaWYgKG5vZGUgIT0gbnVsbCkgewotCQkJCQkJCW9sZE5vZGVzLmFkZChub2RlKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQotCQkJCS8vIHJlbW92ZSBvbGQgbm9kZXMKLQkJCQkvLwotCQkJCWRpYWdyYW0uZ2V0Q29udGFpbmVkKCkucmVtb3ZlQWxsKG9sZE5vZGVzKTsKLQotCQkJCS8vIGFkZCBuZXcgbm9kZXMKLQkJCQkvLwotCQkJCWRpYWdyYW0uZ2V0Q29udGFpbmVkKCkuYWRkQWxsKGNvcHkuZ2V0Q29udGFpbmVkKCkpOwotCi0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBkaWFncmFtCi0JICogQHBhcmFtIGJhc2VHdWlkCi0JICogICAgICAgICAgICB0aGUgR1VJRCBvZiB0aGUgYmFzZSBVSSBHcmFwaE5vZGUKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgR3JhcGhOb2RlIGZpbmRVSUdyYXBoTm9kZShEaWFncmFtIGRpYWdyYW0sIFN0cmluZyBiYXNlR3VpZCkgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBkaWFncmFtLmdldENvbnRhaW5lZCgpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJR3JhcGhOb2RlIG5vZGUgPSAoR3JhcGhOb2RlKSBpdGVyLm5leHQoKTsKLQkJCWlmIChpc1VJR3JhcGhOb2RlKG5vZGUpCi0JCQkJCSYmIGJhc2VHdWlkLmVxdWFscyhub2RlLmdldEJyaWVmRGVzY3JpcHRpb24oKSkpIHsKLQkJCQlyZXR1cm4gbm9kZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNVSUdyYXBoTm9kZShHcmFwaE5vZGUgZ05vZGUpIHsKLQkJU2VtYW50aWNNb2RlbEJyaWRnZSBtb2RlbEJyaWRnZSA9IGdOb2RlLmdldFNlbWFudGljTW9kZWwoKTsKLQkJaWYgKG1vZGVsQnJpZGdlIGluc3RhbmNlb2YgU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnQpIHsKLQkJCVN0cmluZyB0eXBlSW5mbyA9ICgoU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnQpIG1vZGVsQnJpZGdlKQotCQkJCQkuZ2V0VHlwZUluZm8oKTsKLQkJCWlmICh0eXBlSW5mby5lcXVhbHMoR1JBUEhfTk9ERV9ERUNJU0lPTikKLQkJCQkJfHwgdHlwZUluZm8uZXF1YWxzKEdSQVBIX05PREVfRU5EKQotCQkJCQl8fCB0eXBlSW5mby5lcXVhbHMoR1JBUEhfTk9ERV9TVEFSVCkKLQkJCQkJfHwgdHlwZUluZm8uZXF1YWxzKEdSQVBIX05PREVfU1lOQ0hfQkFSKQotCQkJCQl8fCB0eXBlSW5mby5lcXVhbHMoR1JBUEhfTk9ERV9GUkVFX1RFWFQpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgRGlhZ3JhbSBjb3B5RGlhZ3JhbShEaWFncmFtIGJhc2VEaWFncmFtKSB7Ci0JCURpYWdyYW0gY29weSA9IChEaWFncmFtKSBUbmdVdGlsLmNvcHkoYmFzZURpYWdyYW0pOwotCi0JCS8vIEhBQ0s6Ci0JCS8vIGdvIHRocnUgdGhlIG5vZGVzIG9mIHRoZSBkaWFncmFtIGNvcHksIGlmIGFueSBub2RlIGlzIGEgVUktb25seSBub2RlCi0JCS8vIChzZWUgVHlwZWROb2RlKQotCQkvLyBzYXZlIHRoZSBHVUlEIG9mIHRoZSBvcmlnaW5hbCBvbmUgaW4gaXRzIGJyaWVmRGVzY3JpcHRpb24gdG8gcmVtZW1iZXIKLQkJLy8gd2hvIGlzIGJhc2UuCi0JCS8vCi0JCWludCBzaXplID0gY29weS5nZXRDb250YWluZWQoKS5zaXplKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlHcmFwaE5vZGUgZ05vZGUgPSAoR3JhcGhOb2RlKSBjb3B5LmdldENvbnRhaW5lZCgpLmdldChpKTsKLQkJCWlmIChHcmFwaGljYWxEYXRhSGVscGVyLmlzVUlHcmFwaE5vZGUoZ05vZGUpKSB7Ci0JCQkJZ05vZGUuc2V0QnJpZWZEZXNjcmlwdGlvbigoKERpYWdyYW1FbGVtZW50KSBiYXNlRGlhZ3JhbQotCQkJCQkJLmdldENvbnRhaW5lZCgpLmdldChpKSkuZ2V0R3VpZCgpKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBjb3B5OwotCX0KLQotCS8qKgotCSAqIEdldHMgYWxsIGRpYWdyYW1zIG9mIHRoaXMgYWN0aXZpdGllcy4KLQkgKiAKLQkgKiBAcGFyYW0gc2VsZWN0ZWRBY3Rpdml0eQotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIENvbGxlY3Rpb24gZ2V0RGlhZ3JhbXMoQWN0aXZpdHkgYWN0KSB7Ci0JCXJldHVybiBnZXREaWFncmFtcyhhY3QsIGZhbHNlKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIENvbGxlY3Rpb24gZ2V0RGlhZ3JhbXMoQWN0aXZpdHkgYWN0LCBib29sZWFuIGNyZWF0ZSkgewotCQlBcnJheUxpc3QgZGlhZ3JhbXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgRElBR1JBTV9UWVBFUy5sZW5ndGg7IGkrKykgewotCQkJRGlhZ3JhbSBkaWFncmFtID0gR3JhcGhpY2FsRGF0YU1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5nZXRVTUFEaWFncmFtKAotCQkJCQlhY3QsIERJQUdSQU1fVFlQRVNbaV0sIGNyZWF0ZSk7Ci0JCQlpZiAoZGlhZ3JhbSAhPSBudWxsKSB7Ci0JCQkJZGlhZ3JhbXMuYWRkKGRpYWdyYW0pOwotCQkJfQotCQl9Ci0JCXJldHVybiBkaWFncmFtczsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXREaWFncmFtVHlwZVRleHQoRGlhZ3JhbSBkaWFncmFtKSB7Ci0JCWludCB0eXBlID0gR3JhcGhpY2FsRGF0YU1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5nZXREaWFncmFtVHlwZShkaWFncmFtKTsKLQkJaWYgKHR5cGUgIT0gLTEpIHsKLQkJCXJldHVybiBESUFHUkFNX1RZUEVfVEVYVFNbdHlwZV07Ci0JCX0KLQkJcmV0dXJuIERpYWdyYW1SZXNvdXJjZXMudHlwZV91bmtub3duOyAKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIG9yIHVuc2V0cyBzdXBwcmVzc2VkIGZsYWcgb2YgYWxsIGRpYWdyYW1zIGluIHRoZSBnaXZlbiBwcm9jZXNzCi0JICogCi0JICogQHBhcmFtIHByb2MKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0QWxsRGlhZ3JhbVN1cHByZXNzZWQoUHJvY2VzcyBwcm9jLCBib29sZWFuIHN1cHByZXNzZWQpIHsKLQkJSXRlcmF0b3IgaXRlciA9IG5ldyBBYnN0cmFjdFRyZWVJdGVyYXRvcihwcm9jKSB7Ci0KLQkJCS8qKgotCQkJICogQ29tbWVudCBmb3IgPGNvZGU+c2VyaWFsVmVyc2lvblVJRDwvY29kZT4KLQkJCSAqLwotCQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTYxODk0OTAxNDQ3NjM3MTExNEw7Ci0KLQkJCXByb3RlY3RlZCBJdGVyYXRvciBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJQWN0aXZpdHkgYWN0ID0gKEFjdGl2aXR5KSBvYmplY3Q7Ci0JCQkJQXJyYXlMaXN0IGNoaWxkcmVuID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBhY3QuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5pdGVyYXRvcigpOyBpdGVyYXRvcgotCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQkJCWNoaWxkcmVuLmFkZChlbGVtZW50KTsKLQkJCQkJfQotCQkJCX0KLQkJCQlyZXR1cm4gY2hpbGRyZW4uaXRlcmF0b3IoKTsKLQkJCX0KLQotCQl9OwotCi0JCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJQ29sbGVjdGlvbiBkaWFncmFtcyA9IGdldERpYWdyYW1zKChBY3Rpdml0eSkgaXRlci5uZXh0KCksCi0JCQkJCXN1cHByZXNzZWQpOwotCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGRpYWdyYW1zLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCQlEaWFncmFtIGRpYWdyYW0gPSAoRGlhZ3JhbSkgaXRlcmF0b3IubmV4dCgpOwotCQkJCWRpYWdyYW0uc2V0U3VwcHJlc3NlZChCb29sZWFuLnZhbHVlT2Yoc3VwcHJlc3NlZCkpOwotCQkJfQotCQl9Ci0JfQotCi0JLy8gcHVibGljIHN0YXRpYyBib29sZWFuIHJlbW92ZVVNQVBvaW50KENvbGxlY3Rpb24gdW1hUG9pbnRzLCBpbnQgeCwgaW50IHkpCi0JLy8gewotCS8vIGZvciAoSXRlcmF0b3IgaXRlciA9IHVtYVBvaW50cy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkvLyBvcmcuZWNsaXBzZS5lcGYudW1hLlBvaW50IHAgPSAob3JnLmVjbGlwc2UuZXBmLnVtYS5Qb2ludCkgaXRlci5uZXh0KCk7Ci0JLy8gaWYocC5nZXRYKCkuaW50VmFsdWUoKSA9PSB4ICYmIHAuZ2V0WSgpLmludFZhbHVlKCkgPT0geSkgewotCS8vIGl0ZXIucmVtb3ZlKCk7Ci0JLy8gcmV0dXJuIHRydWU7Ci0JLy8gfQotCS8vIH0KLQkvLyByZXR1cm4gZmFsc2U7Ci0JLy8gfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZUxpbmsoTGluayBsaW5rKSB7Ci0JCU5vZGUgc291cmNlTm9kZSA9IGxpbmsuZ2V0U291cmNlKCk7Ci0JCU5vZGUgdGFyZ2V0Tm9kZSA9IGxpbmsuZ2V0VGFyZ2V0KCk7Ci0JCWJvb2xlYW4gc3JjTm90aWZ5ID0gc291cmNlTm9kZSAhPSBudWxsID8gc291cmNlTm9kZS5lRGVsaXZlcigpIDogZmFsc2U7Ci0JCWJvb2xlYW4gdGFyZ2V0Tm90aWZ5ID0gdGFyZ2V0Tm9kZSAhPSBudWxsID8gdGFyZ2V0Tm9kZS5lRGVsaXZlcigpCi0JCQkJOiBmYWxzZTsKLQkJdHJ5IHsKLQkJCWlmIChzb3VyY2VOb2RlICE9IG51bGwpIHsKLQkJCQlzb3VyY2VOb2RlLmVTZXREZWxpdmVyKGZhbHNlKTsKLQkJCX0KLQkJCWlmICh0YXJnZXROb2RlICE9IG51bGwpIHsKLQkJCQl0YXJnZXROb2RlLmVTZXREZWxpdmVyKGZhbHNlKTsKLQkJCX0KLQkJCWxpbmsuc2V0U291cmNlKG51bGwpOwotCQkJbGluay5zZXRUYXJnZXQobnVsbCk7Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAoc291cmNlTm9kZSAhPSBudWxsKSB7Ci0JCQkJc291cmNlTm9kZS5lU2V0RGVsaXZlcihzcmNOb3RpZnkpOwotCQkJfQotCQkJaWYgKHRhcmdldE5vZGUgIT0gbnVsbCkgewotCQkJCXRhcmdldE5vZGUuZVNldERlbGl2ZXIodGFyZ2V0Tm90aWZ5KTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEZpbmRzIHRoZSBvYmplY3Qgb3IgaXRzIHdyYXBwZXIgaW4gdGhlIGdpdmVuIGNvbGxlY3Rpb24KLQkgKiAKLQkgKiBAcGFyYW0gYWxsRWxlbWVudHMKLQkgKiBAcGFyYW0gZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9iamVjdCBmaW5kRWxlbWVudChDb2xsZWN0aW9uIGFsbEVsZW1lbnRzLCBPYmplY3QgZSkgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBhbGxFbGVtZW50cy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAoZSA9PSBUbmdVdGlsLnVud3JhcChlbGVtZW50KSkgewotCQkJCXJldHVybiBlbGVtZW50OwotCQkJfQotCQkJLy8gSWYgb2JqZWN0IChlKSBpcyBhIHdvcmtwcm9kdWN0IGRlc2NyaXB0b3IoIHN1Yi1hcnRpZmFjdCkKLQkJCS8vIHBhc3NlZCBjb2xsZWN0aW9uIGRvbm90IGhhdmUgd3JhcHBlciBmb3Igc3ViLWFydGlmYWN0LCBjaGVjayB0aGUKLQkJCS8vIGNvbnRhaW5lciBhcnRpZmFjdCdzIHdyYXBwZXIuCi0JCQkvL2h0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNTU5MTQKLQkJCWlmKGVsZW1lbnQgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3JXcmFwcGVySXRlbVByb3ZpZGVyKXsKLQkJCQlPYmplY3QgY2hpbGRFbGVtZW50ID0gZmluZEVsZW1lbnQoKChXb3JrUHJvZHVjdERlc2NyaXB0b3JXcmFwcGVySXRlbVByb3ZpZGVyKWVsZW1lbnQpLmdldENoaWxkcmVuKGVsZW1lbnQpLCBlKTsKLQkJCQlpZihjaGlsZEVsZW1lbnQgIT0gbnVsbCl7Ci0JCQkJCXJldHVybiBjaGlsZEVsZW1lbnQ7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogTWV0aG9kIHRvIGNoZWNrIGlmIGFueSBkdXBsaWNhdGUgcHJlZGVjZXNzb3IgaW4gdGhlIHByZWRlY2Vzc29ycyBsaXN0IG9mCi0JICogV29ya0JyZWFrZG93bkVsZW1lbnQuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGFueUR1cGxpY2F0ZVByZWRlY2Vzc29ycyhXb3JrQnJlYWtkb3duRWxlbWVudCBlKSB7Ci0JCUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJTGlzdCBwcmVkbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZ2V0UHJlZHMoZSwgcHJlZGxpc3QpOwotCQlmb3IgKEl0ZXJhdG9yIGl0b3IgPSBwcmVkbGlzdC5pdGVyYXRvcigpOyBpdG9yLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBvYmogPSBpdG9yLm5leHQoKTsKLQkJCWlmICghbGlzdC5jb250YWlucyhvYmopKSB7Ci0JCQkJbGlzdC5hZGQob2JqKTsKLQkJCX0gZWxzZSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qCi0JICogVXRpbGl0eSBtZXRob2QgdG8gZ2V0IGFsbCB0aGUgcHJlZGVjZXNzb3JzIGFjdGl2aXRpZXMgaW5zdGVhZCBvZgotCSAqIHdvcmtvcmRlcnMuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGdldFByZWRzKFdvcmtCcmVha2Rvd25FbGVtZW50IGUsIExpc3QgbGlzdCkgewotCQlMaXN0IHByZWRsaXN0ID0gZS5nZXRMaW5rVG9QcmVkZWNlc3NvcigpOwotCQlmb3IgKEl0ZXJhdG9yIGl0b3IgPSBwcmVkbGlzdC5pdGVyYXRvcigpOyBpdG9yLmhhc05leHQoKTspIHsKLQkJCVdvcmtPcmRlciB3b3Jrb3JkZXIgPSAoV29ya09yZGVyKSBpdG9yLm5leHQoKTsKLQkJCWxpc3QuYWRkKHdvcmtvcmRlci5nZXRQcmVkKCkpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBNZXRob2QgdG8gY2hlY2sgYmVmb3JlIGRlbGV0aW5nIGEgbGluay4gSWYgZHVwbGljYXRlIHByZWRlY2Vzc29yIGV4aXN0cwotCSAqIGluIHRoZSBsZWdhY3kgZGF0YSwgY2hlY2sgaWYgZGVsZXRpbmcgbGluayBzaG91bGQgcmVtb3ZlIGFsbCB0aGUKLQkgKiBwcmVkZWNlc3NvcnMgb3Igbm90IGJ5IHZlcmlmeWluZyBpZiB0YXJnZXQgb3IgaW5kaXJlY3QgdGFyZ2V0IGhhdmUgZGlyZWN0Ci0JICogb3IgaW5kaXJlY3QgbGlua3MuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNhblJlbW92ZUFsbFByZWRzKExpbmsgbGluaywgTm9kZSBvbGRTb3VyY2UsCi0JCQlOb2RlIG9sZFRhcmdldCkgewotCi0JCWlmIChvbGRUYXJnZXQgaW5zdGFuY2VvZiBXb3JrQnJlYWtkb3duRWxlbWVudE5vZGUpIHsKLQkJCUxpc3QgaW5saXN0ID0gb2xkVGFyZ2V0LmdldEluY29taW5nQ29ubmVjdGlvbnMoKTsKLQkJCWZvciAoSXRlcmF0b3IgaXRvciA9IGlubGlzdC5pdGVyYXRvcigpOyBpdG9yLmhhc05leHQoKTspIHsKLQkJCQlMaW5rIGluY29taW5nbGluayA9IChMaW5rKSBpdG9yLm5leHQoKTsKLQkJCQkvLyBSQVRMQzAwMzg0MjQ1IDogUHJlZGVjZXNzb3IgY2hhbmdlcyBzaG91bGQgYmUgZG9uZSBvbmx5IGluCi0JCQkJLy8gY2FzZSBvZiBTeW5jaHJvbml6YXRpb24gQmFyLgotCQkJCWlmIChpbmNvbWluZ2xpbmsuZ2V0U291cmNlKCkgaW5zdGFuY2VvZiBUeXBlZE5vZGUKLQkJCQkJCSYmICgoVHlwZWROb2RlKSBpbmNvbWluZ2xpbmsuZ2V0U291cmNlKCkpLmdldFR5cGUoKSA9PSBUeXBlZE5vZGUuU1lOQ0hfQkFSKSB7Ci0JCQkJCUNvbGxlY3Rpb24gY29sID0gR3JhcGhpY2FsRGF0YUhlbHBlci5nZXRTb3VyY2VOb2RlcygKLQkJCQkJCQkoVHlwZWROb2RlKSBpbmNvbWluZ2xpbmsuZ2V0U291cmNlKCksCi0JCQkJCQkJV29ya0JyZWFrZG93bkVsZW1lbnROb2RlLmNsYXNzKTsKLQkJCQkJaWYgKGNvbC5jb250YWlucyhvbGRTb3VyY2UpKSB7Ci0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgaWYgKGluY29taW5nbGluay5nZXRTb3VyY2UoKSBpbnN0YW5jZW9mIFdvcmtCcmVha2Rvd25FbGVtZW50Tm9kZSkgewotCQkJCQlpZiAoaW5jb21pbmdsaW5rLmdldFNvdXJjZSgpLmVxdWFscyhvbGRTb3VyY2UpKQotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKgotCSAqIE1ldGhvZCB0byBnZXQgdGhlIHNvdXJjZXMgb2YgU3luY0JhciBpbkNvbW1pbmcgY29ubmVjdGlvbnMKLQkgKiBhbmQgaWYgc3luY2JhciBoYXZlIGluY29taW5nIGNvbm5lY3Rpb24gZnJvbSBkZWNpc2lvbiBwb2ludCwgCi0JICogYW5kIGRlY2lzaW9uIHBvaW50IGhhdmUgaW5jb21taW5nIGNvbm5lY3Rpb25zICh3b3JrYnJlYWRkb3duIGVsZW10bnMpCi0JICogY29sbGVjdGlvbnMgd2lsbCBpZ25vcmUgYWxsIHRoZSBpbmNvbWluZyBjb25uZWN0aW9uIGZyb20gZGVjaXNpb24gcG9pbnQuICAKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGdldFN5bmNCYXJTb3VyY2VOb2RlcyhUeXBlZE5vZGUgdHlwZWROb2RlLCBDb2xsZWN0aW9uIGFjdE5vZGVzKXsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gdHlwZWROb2RlLmdldEluY29taW5nQ29ubmVjdGlvbnMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlMaW5rIGxpbmsgPSAoTGluaykgaXRlci5uZXh0KCk7Ci0JCQkJTm9kZSBzb3VyY2UgPSBsaW5rLmdldFNvdXJjZSgpOwotCQkJCWlmKHNvdXJjZSBpbnN0YW5jZW9mIFdvcmtCcmVha2Rvd25FbGVtZW50Tm9kZSl7Ci0JCQkJCWFjdE5vZGVzLmFkZChzb3VyY2UpOwotCQkJCX1lbHNlIGlmKHNvdXJjZSBpbnN0YW5jZW9mIFR5cGVkTm9kZSl7Ci0JCQkJCWlmKCgoVHlwZWROb2RlKXNvdXJjZSkuZ2V0VHlwZSgpID09IFR5cGVkTm9kZS5TWU5DSF9CQVIpCi0JCQkJCQlnZXRTeW5jQmFyU291cmNlTm9kZXMoKFR5cGVkTm9kZSlzb3VyY2UsYWN0Tm9kZXMpOwotCQkJCX0KLQkJfQotCX0KLQkvKgotCSAqIE1ldGhvZCB0byBjb2xsZWN0IHN5bmNocm9uaXphdGlvbiBiYXIgb3V0Z29pbmcgY29ubmVjdGlvbgotCSAqIGV4Y2VwdCBhbnkgY29ubmVjdGlvbiBnb2luZyBmcm9tIGRlY2lzaW9uIHBvaW50cy4gIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBnZXRTeW5jQmFyVGFyZ2V0Tm9kZXMoVHlwZWROb2RlIHR5cGVkTm9kZSwgQ29sbGVjdGlvbiBhY3ROb2Rlcyl7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHR5cGVkTm9kZS5nZXRPdXRnb2luZ0Nvbm5lY3Rpb25zKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJTGluayBsaW5rID0gKExpbmspIGl0ZXIubmV4dCgpOwotCQkJCU5vZGUgdGFyZ2V0ID0gbGluay5nZXRUYXJnZXQoKTsKLQkJCQlpZih0YXJnZXQgaW5zdGFuY2VvZiBXb3JrQnJlYWtkb3duRWxlbWVudE5vZGUpewotCQkJCQlhY3ROb2Rlcy5hZGQodGFyZ2V0KTsKLQkJCQl9ZWxzZSBpZih0YXJnZXQgaW5zdGFuY2VvZiBUeXBlZE5vZGUpewotCQkJCQlpZigoKFR5cGVkTm9kZSl0YXJnZXQpLmdldFR5cGUoKSA9PSBUeXBlZE5vZGUuU1lOQ0hfQkFSKQotCQkJCQkJZ2V0U3luY0JhclRhcmdldE5vZGVzKChUeXBlZE5vZGUpdGFyZ2V0LCBhY3ROb2Rlcyk7Ci0JCQkJfQotCQl9Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgTm9kZSBmaW5kTm9kZShOb2RlQ29udGFpbmVyIGNvbnRhaW5lciwgT2JqZWN0IG9iamVjdCwgQ2xhc3Mgbm9kZVR5cGUpIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gY29udGFpbmVyLmdldE5vZGVzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlOb2RlIGVsZW1lbnQgPSAoTm9kZSkgaXRlci5uZXh0KCk7Ci0JCQlpZiAob2JqZWN0ID09IGVsZW1lbnQuZ2V0T2JqZWN0KCkgJiYgbm9kZVR5cGUuaXNJbnN0YW5jZShlbGVtZW50KSkgewotCQkJCXJldHVybiBlbGVtZW50OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQotCS8qKgotCSAqIENvbnZlbmllbnQgbWV0aG9kIHRvIGFkZCBhIHByb3BlcnR5IHRvIEdyYXBoTm9kZSBwcm9wZXJ0eSBsaXN0Ci0JICogKFVtYVBhY2thZ2UuR1JBUEhfTk9ERV9fUFJPUEVSVFkpIFZlcmlmaWVzIHByb3BlcnR5IGV4aXN0cyBvciBub3QsIGlmIG5vdAotCSAqIGNyZWF0ZXMgYSBwcm9wZXJ0eSB3aXRoIGdpdmVuIGtleSBhbmQgdmFsdWUuIGFuZCBzZXQgaW50byBncmFwaCBub2RlCi0JICogcHJvcGVydHkgbGlzdCwgaWYgZXhpc3RzIGp1c3Qgc2V0cyB2YWx1ZSBmb3IgcHJvcGVydHkuCi0JICogCi0JICogQHBhcmFtIGdyYXBoTm9kZQotCSAqIEBwYXJhbSBrZXkKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiBAcmV0dXJuIFByb3BlcnR5Ci0JICogQGF1dGhvciBza2Fubm9vcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgUHJvcGVydHkgY3JlYXRlUHJvcGVydHkoR3JhcGhOb2RlIGdyYXBoTm9kZSwgU3RyaW5nIGtleSwKLQkJCVN0cmluZyB2YWx1ZSkgewotCQlQcm9wZXJ0eSBwcm9wZXJ0eSA9IG51bGw7Ci0JCWlmIChncmFwaE5vZGUgIT0gbnVsbCkgewotCQkJcHJvcGVydHkgPSBmaW5kUHJvcGVydHkoZ3JhcGhOb2RlLCBrZXkpOwotCQl9Ci0JCWlmIChwcm9wZXJ0eSA9PSBudWxsKSB7Ci0JCQlwcm9wZXJ0eSA9IFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVByb3BlcnR5KCk7Ci0JCQlwcm9wZXJ0eS5zZXRLZXkoa2V5KTsKLQkJCXByb3BlcnR5LnNldFZhbHVlKHZhbHVlKTsKLQkJCUxpc3QgbGlzdCA9IGdyYXBoTm9kZS5nZXRMaXN0KFVtYVBhY2thZ2UuR1JBUEhfTk9ERV9fUFJPUEVSVFkpOwotCQkJaWYgKGxpc3QgPT0gbnVsbCkgewotCQkJCWxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJZ3JhcGhOb2RlLnNldChVbWFQYWNrYWdlLkdSQVBIX05PREVfX1BST1BFUlRZLCBsaXN0KTsKLQkJCX0KLQkJCWxpc3QuYWRkKHByb3BlcnR5KTsKLQkJfSBlbHNlIHsKLQkJCXByb3BlcnR5LnNldFZhbHVlKHZhbHVlKTsKLQkJfQotCQlyZXR1cm4gcHJvcGVydHk7Ci0JfQotCQotCS8qKgotCSAqIEFjY2VzaWJsZSBtZXRob2QgZm9yIEFjdGl2aXR5RGV0YWlsRGlhZ3JhbSwgdG8gZ2V0IGEgYXV0b2xheW91dCBmbGFnIGZyb20KLQkgKiBHcmFwaGhOb2RlIHByb3BlcnR5IGxpc3QuIHJldHVybiBzdHJpbmcgY2FuIGJlCi0JICogR3JhcGhpY2FsRGF0YUhlbHBlci5QUk9QX0FVVE9MQVlPVVRfVkFMVUVfVFJVRSwKLQkgKiBHcmFwaGljYWxEYXRhSGVscGVyLlBST1BfQVVUT0xBWU9VVF9WQUxVRV9GQUxTRSwgb3IgbnVsbC4KLQkgKiAKLQkgKiBAcGFyYW0gZGlhZ3JhbQotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0QXV0b0xheW91dEZsYWcoQWN0aXZpdHlEZXRhaWxEaWFncmFtIGRpYWdyYW0pIHsKLQkJU3RyaW5nIGZsYWcgPSBudWxsOwotCQlHcmFwaE5vZGUgZ3JhcGhOb2RlID0gZGlhZ3JhbS5nZXRHcmFwaE5vZGUoKTsKLQkJaWYgKGdyYXBoTm9kZSAhPSBudWxsKSB7Ci0JCQlMaXN0IHByb3BMaXN0ID0gZ3JhcGhOb2RlLmdldExpc3QoVW1hUGFja2FnZS5HUkFQSF9OT0RFX19QUk9QRVJUWSk7Ci0JCQlpZiAocHJvcExpc3QgIT0gbnVsbCAmJiBwcm9wTGlzdC5zaXplKCkgPiAwKSB7Ci0JCQkJUHJvcGVydHkgcHJvcGVydHkgPSBHcmFwaGljYWxEYXRhSGVscGVyLmZpbmRQcm9wZXJ0eShncmFwaE5vZGUsCi0JCQkJCQlHcmFwaGljYWxEYXRhSGVscGVyLlBST1BfQVVUT19MQVlPVVQpOwotCQkJCWlmIChwcm9wZXJ0eSAhPSBudWxsKSB7Ci0JCQkJCWZsYWcgPSBwcm9wZXJ0eS5nZXRWYWx1ZSgpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZmxhZzsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzQXV0b0xheW91dChBY3Rpdml0eURldGFpbERpYWdyYW0gZGlhZ3JhbSl7Ci0JCUdyYXBoTm9kZSBncmFwaE5vZGUgPSBkaWFncmFtLmdldEdyYXBoTm9kZSgpOwotCQlpZihncmFwaE5vZGUgIT0gbnVsbCl7Ci0JCQlMaXN0IHByb3BMaXN0ID0gZ3JhcGhOb2RlLmdldExpc3QoVW1hUGFja2FnZS5HUkFQSF9OT0RFX19QUk9QRVJUWSk7Ci0JCQlpZihwcm9wTGlzdCAhPSBudWxsICYmIHByb3BMaXN0LnNpemUoKSA+IDApewotCQkJCVByb3BlcnR5IHByb3BlcnR5ID0gR3JhcGhpY2FsRGF0YUhlbHBlci5maW5kUHJvcGVydHkoCi0JCQkJCWdyYXBoTm9kZSwgR3JhcGhpY2FsRGF0YUhlbHBlci5QUk9QX0FVVE9fTEFZT1VUKTsKLQkJCQlpZihwcm9wZXJ0eSAhPSBudWxsKXsKLQkJCQkJU3RyaW5nIHRlbXAgPSBwcm9wZXJ0eS5nZXRWYWx1ZSgpOwotCQkJCQlpZih0ZW1wICE9IG51bGwgJiYgdGVtcCAhPSAiIiAmJiAgLy8kTk9OLU5MUy0xJAotCQkJCQkJCShHcmFwaGljYWxEYXRhSGVscGVyLlBST1BfQVVUT19MQVlPVVRfVkFMVUVfVFJVRS5lcXVhbHModGVtcCkKLQkJCQkJCQkJCXx8IEdyYXBoaWNhbERhdGFIZWxwZXIuUFJPUF9BVVRPX0xBWU9VVF9WQUxVRV9GQUxTRS5lcXVhbHModGVtcCkpKXsKLQkJCQkJCXJldHVybiBuZXcgQm9vbGVhbih0ZW1wKS5ib29sZWFuVmFsdWUoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgaW50IGdldFRhc2tzUGVyUm93KCl7Ci0vLwkJU3RyaW5nIGNvdW50ID0gTGlicmFyeUVkaXRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpCi0vLwkJCQkuZ2V0U3RyaW5nKEdyYXBoaWNhbERhdGFIZWxwZXIuQUREX0RJQUdSQU1fVEFTS1NfUEVSX1JPVyk7Ci0vLwkJaWYgKGNvdW50ICE9IG51bGwgJiYgY291bnQubGVuZ3RoKCkgPiAwKSB7Ci0vLwkJCXRyeSB7Ci0vLwkJCQlpbnQgaSA9IEludGVnZXIucGFyc2VJbnQoY291bnQpOwotLy8JCQkJcmV0dXJuIGk7Ci0vLwkJCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBuZSkgewotLy8JCQkJcmV0dXJuIDEwOwotLy8JCQl9Ci0vLwkJfQotLy8JCXJldHVybiAxMDsKLQkJCi0JCWludCBjb3VudCA9IFByb3ZpZGVycy5nZXRBdXRob3JpbmdQbHVnaW5QcmVmZXJlbmNlU3RvcmUoKS5nZXRJbnQoR3JhcGhpY2FsRGF0YUhlbHBlci5BRERfRElBR1JBTV9UQVNLU19QRVJfUk9XKTsKLQkJaWYgKGNvdW50IDw9IDApCi0JCQlyZXR1cm4gMTA7Ci0JCXJldHVybiBjb3VudDsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbGlzdCB0aGUgbGlzdCBvZiB7QGxpbmsgUHJvcGVydHl9IG9iamVjdHMKLQkgKiBAcGFyYW0ga2V5Ci0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgUHJvcGVydHkgZ2V0UHJvcGVydHlCeUtleShMaXN0IGxpc3QsIFN0cmluZyBrZXkpIHsKLQkJaWYgKCFsaXN0LmlzRW1wdHkoKSkgewotCQkJZm9yIChJdGVyYXRvciBpcm9yID0gbGlzdC5pdGVyYXRvcigpOyBpcm9yLmhhc05leHQoKTspIHsKLQkJCQlQcm9wZXJ0eSBwcm9wZXJ0eSA9IChQcm9wZXJ0eSkgaXJvci5uZXh0KCk7Ci0JCQkJaWYgKHByb3BlcnR5ICE9IG51bGwpIHsKLQkJCQkJaWYgKHByb3BlcnR5LmdldEtleSgpLmVxdWFscyhrZXkpKSB7Ci0JCQkJCQlyZXR1cm4gcHJvcGVydHk7Ci0JCQkJCX0KLS8vCQkJCQkJZWxzZSB7Ci0vLwkJCQkJCXJldHVybiBudWxsOwotLy8JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBQcm9wZXJ0eSBnZXRQcm9wZXJ0eShOb2RlIG5vZGUsIFN0cmluZyBrZXkpIHsKLQkJR3JhcGhOb2RlIGdyYXBoTm9kZSA9IG5vZGUuZ2V0R3JhcGhOb2RlKCk7Ci0JCWlmIChncmFwaE5vZGUgIT0gbnVsbCkgewotCQkJTGlzdCBsaXN0ID0gZ3JhcGhOb2RlLmdldFByb3BlcnR5KCk7Ci0JCQlpZiAobGlzdCAhPSBudWxsICYmICFsaXN0LmlzRW1wdHkoKSkgewotCQkJCWZvciAoaW50IGkgPSBsaXN0LnNpemUoKSAtIDE7IGkgPiAtMTsgaS0tKSB7Ci0JCQkJCVByb3BlcnR5IHByb3AgPSAoUHJvcGVydHkpIGxpc3QuZ2V0KGkpOwotCQkJCQlpZiAoa2V5LmVxdWFscyhwcm9wLmdldEtleSgpKSkgewotCQkJCQkJcmV0dXJuIHByb3A7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL3V0aWwvR3JhcGhpY2FsRGF0YU1hbmFnZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC91dGlsL0dyYXBoaWNhbERhdGFNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmZmJiYWIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL3V0aWwvR3JhcGhpY2FsRGF0YU1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JQ29tbWFuZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kLlZhcnlBY3Rpdml0eUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlByb2Nlc3NVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoQ29ubmVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhFZGdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuU2VtYW50aWNNb2RlbEJyaWRnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVNQVNlbWFudGljTW9kZWxCcmlkZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya09yZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5VbWFVdGlsOwotCi0KLS8qKgotICogRGlhZ3JhbSBkYXRhIHN0b3JlZCBpbiBVTUE6IFNlbWFudGljTW9kZWxCcmlkZ2UgLlByZXNlbnRhdGlvbiBkaWFncmFtIHR5cGUsCi0gKiBpdHMgdmFsdWUgY2FuIGJlIG9uZSBvZiBmb2xsb3dpbmcgY29uc3RhbnRzIGRlZmluZWQgaW4gR3JhcGhpY2FsRGF0YUhlbHBlcgotICogRElBR1JBTV9XT1JLRkxPVywgRElBR1JBTV9XT1JLX1BST0RVQ1RfREVQRU5ERU5DWSwgRElBR1JBTV9BQ1RJVklUWV9ERVRBSUwKLSAqIAotICogVU1BU2VtYW50aWNNb2RlbEJyaWRnZSAuRWxlbWVudCBCcmVha2Rvd25FbGVtZW50IHRoYXQgdGhlIERpYWdyYW1FbGVtZW50IG9mCi0gKiB0aGlzIFNlbWFudGljTW9kZWxCcmlkZ2UgcmVwcmVzZW50cwotICogCi0gKiBTaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudCAuVHlwZUluZm8gdHlwZSBpbmZvcm1hdGlvbiBmb3IgVHlwZWROb2RlLCBpdHMKLSAqIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGNvbnN0YW50cyBkZWZpbmVkIGluIEdyYXBoaWNhbERhdGFIZWxwZXIKLSAqIHdwQ29tcG9zaXRlVHlwZSBXb3JrUHJvZHVjdENvbXBvc2l0ZSB0eXBlCi0gKiAKLSAqIERpYWdyYW1FbGVtZW50IC5Qcm9wZXJ0eSAobGlzdCBvZiBwcm9wZXJ0aWVzKQotICogCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBHcmFwaGljYWxEYXRhTWFuYWdlciB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gZGlhZ3JhbVByZXNlbnRhdGlvbnMgPSBuZXcgU3RyaW5nW10gewotCQkJR3JhcGhpY2FsRGF0YUhlbHBlci5ESUFHUkFNX1dPUktGTE9XLAotCQkJR3JhcGhpY2FsRGF0YUhlbHBlci5ESUFHUkFNX1dPUktfUFJPRFVDVF9ERVBFTkRFTkNZLAotCQkJR3JhcGhpY2FsRGF0YUhlbHBlci5ESUFHUkFNX0FDVElWSVRZX0RFVEFJTCB9OwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ2xhc3NbXSBjaGlsZFR5cGVzID0gbmV3IENsYXNzW10geyBBY3Rpdml0eS5jbGFzcywKLQkJCVdvcmtQcm9kdWN0RGVzY3JpcHRvci5jbGFzcywgRGVzY3JpcHRvci5jbGFzcyB9OwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ2xhc3NbXSBkaWFncmFtQ2hhbmdlTGlzdGVuZXJDbGFzc2VzID0gbmV3IENsYXNzW10gewotCQkJSUFjdGl2aXR5RGlhZ3JhbUNoYW5nZUxpc3RlbmVyLmNsYXNzLAotCQkJSVdQRERpYWdyYW1DaGFuZ2VMaXN0ZW5lci5jbGFzcywKLQkJCUlBY3Rpdml0eURldGFpbERpYWdyYW1DaGFuZ2VMaXN0ZW5lci5jbGFzcyB9OwotCi0JcHJpdmF0ZSBzdGF0aWMgR3JhcGhpY2FsRGF0YU1hbmFnZXIgaW5zdGFuY2UgPSBudWxsOwotCi0JLy9wcml2YXRlIE1hcCBncmFwaGljYWxEYXRhTWFwID0gbmV3IEhhc2hNYXAoKTsKLQotCXByaXZhdGUgTGlzdDxJQ29tbWFuZExpc3RlbmVyPiBjb21tYW5kTGlzdGVuZXJzOwotCi0JcHJpdmF0ZSBHcmFwaGljYWxEYXRhTWFuYWdlcigpIHsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIEdyYXBoaWNhbERhdGFNYW5hZ2VyIGdldEluc3RhbmNlKCkgewotCQlpZiAoaW5zdGFuY2UgPT0gbnVsbCkgewotCQkJc3luY2hyb25pemVkIChHcmFwaGljYWxEYXRhTWFuYWdlci5jbGFzcykgewotCQkJCWlmIChpbnN0YW5jZSA9PSBudWxsKSB7Ci0JCQkJCWluc3RhbmNlID0gbmV3IEdyYXBoaWNhbERhdGFNYW5hZ2VyKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci0KLQkvLyBwdWJsaWMgR3JhcGhOb2RlIGdldEdyYXBoTm9kZShBY3Rpdml0eSBhY3QsIGludCBkaWFncmFtVHlwZSwgQWN0aXZpdHkKLQkvLyBwYXJlbnQpIHsKLQkvLyAvLyBJdGVtUHJvdmlkZXJBZGFwdGVyIGFkYXB0ZXIgPSAoSXRlbVByb3ZpZGVyQWRhcHRlcikKLQkvLyBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRS5nZXRXQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpLmFkYXB0KGFjdCwKLQkvLyBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCS8vIC8vIE9iamVjdCBwYXJlbnQgPSBhZGFwdGVyLmdldFBhcmVudChhY3QpOwotCS8vIC8vIGlmKHBhcmVudCBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JLy8gaWYocGFyZW50ID09IG51bGwpIHsKLQkvLyAvLyBuZXcgQWN0aXZpdHkKLQkvLyAvLwotCS8vIHJldHVybiBjcmVhdGVHcmFwaE5vZGUoYWN0KTsKLQkvLyB9Ci0JLy8gaWYoIWFjdC5nZXRTdXBlckFjdGl2aXRpZXMoKS5jb250YWlucyhwYXJlbnQpKSB7Ci0JLy8gdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiSW52YWxpZCBzdXBlciBhY3Rpdml0eSBmb3IgIiArIGFjdCArCi0JLy8gIjogIiArIHBhcmVudCk7Ci0JLy8gfQotCS8vIEFjdGl2aXR5IHBhcmVudEFjdCA9IChBY3Rpdml0eSkgcGFyZW50OwotCS8vIERpYWdyYW0gZGlhZ3JhbSA9IGdldERpYWdyYW0ocGFyZW50QWN0LCBkaWFncmFtVHlwZSkuZ2V0VU1BRGlhZ3JhbSgpOwotCS8vIHJldHVybiBnZXRHcmFwaE5vZGUoZGlhZ3JhbSwgYWN0KTsKLQkvLyB9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBHcmFwaE5vZGUgb2YgdGhlIGdpdmVuIG1ldGhvZCBlbGVtZW50IGZvciB0aGUgZ2l2ZW4gZGlhZ3JhbS4KLQkgKiBDcmVhdGUgdGhlIEdyYXBoTm9kZSBpZiBpdCBkb2VzIG5vdCBleGlzdCB5ZXQuCi0JICogCi0JICogQHBhcmFtIGRpYWdyYW0KLQkgKiBAcGFyYW0gbWV0aG9kRWxlbWVudAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgR3JhcGhOb2RlIGdldEdyYXBoTm9kZShEaWFncmFtIGRpYWdyYW0sIE1ldGhvZEVsZW1lbnQgbWV0aG9kRWxlbWVudCkgewotCQlpZiAoZGlhZ3JhbSA9PSBudWxsKSB7Ci0JCQkvLyBuZXcgTWV0aG9kRWxlbWVudAotCQkJLy8KLQkJCXJldHVybiBjcmVhdGVHcmFwaE5vZGUobWV0aG9kRWxlbWVudCk7Ci0JCX0KLQkJR3JhcGhOb2RlIG5vZGUgPSBmaW5kR3JhcGhOb2RlKGRpYWdyYW0sIG1ldGhvZEVsZW1lbnQpOwotCQlpZiAobm9kZSA9PSBudWxsKSB7Ci0JCQlub2RlID0gY3JlYXRlR3JhcGhOb2RlKG1ldGhvZEVsZW1lbnQpOwotCQkJY3JlYXRlR3JhcGhDb25uZWN0b3JzKG5vZGUsIGRpYWdyYW0pOwotCQkJZGlhZ3JhbS5nZXRDb250YWluZWQoKS5hZGQobm9kZSk7Ci0JCX0KLQkJcmV0dXJuIG5vZGU7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBHcmFwaE5vZGUgZmluZEdyYXBoTm9kZShEaWFncmFtIGRpYWdyYW0sIE9iamVjdCBtZXRob2RFbGVtZW50KSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGRpYWdyYW0uZ2V0Q29udGFpbmVkKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlHcmFwaE5vZGUgZWxlbWVudCA9IChHcmFwaE5vZGUpIGl0ZXIubmV4dCgpOwotCQkJaWYgKGVsZW1lbnQuZ2V0U2VtYW50aWNNb2RlbCgpIGluc3RhbmNlb2YgVU1BU2VtYW50aWNNb2RlbEJyaWRnZQotCQkJCQkmJiBtZXRob2RFbGVtZW50ID09ICgoVU1BU2VtYW50aWNNb2RlbEJyaWRnZSkgZWxlbWVudAotCQkJCQkJCS5nZXRTZW1hbnRpY01vZGVsKCkpLmdldEVsZW1lbnQoKSkgewotCQkJCXJldHVybiBlbGVtZW50OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8vIHB1YmxpYyBEaWFncmFtRWxlbWVudCBnZXREaWFncmFtRWxlbWVudChPYmplY3Qgb2JqZWN0KSB7Ci0JLy8gaWYob2JqZWN0IGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkvLyByZXR1cm4gZ2V0R3JhcGhOb2RlKChBY3Rpdml0eSkgb2JqZWN0KTsKLQkvLyB9Ci0JLy8gZWxzZSBpZihvYmplY3QgaW5zdGFuY2VvZiBXb3JrT3JkZXIpIHsKLQkvLyBXb3JrT3JkZXIgd29ya09yZGVyID0gKFdvcmtPcmRlcikgb2JqZWN0OwotCS8vIEJyZWFrZG93bkVsZW1lbnQgYmUgPSB3b3JrT3JkZXIuZ2V0UHJlZCgpOwotCS8vIGlmKGJlIGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkvLyBHcmFwaE5vZGUgZ3JhcGhOb2RlID0gZ2V0R3JhcGhOb2RlKChBY3Rpdml0eSkgYmUpOwotCS8vIExpc3QgbGlzdCA9IGdyYXBoTm9kZS5nZXRDb250YWluZWQoKTsKLQkvLyBQb2x5bGluZSBwb2x5bGluZSA9IG51bGw7Ci0JLy8gZm9yKGludCBpID0gMDsgaSA8IGxpc3Quc2l6ZSgpOyBpKyspIHsKLQkvLyBPYmplY3Qgb2JqID0gbGlzdC5nZXQoaSk7Ci0JLy8gaWYob2JqIGluc3RhbmNlb2YgUG9seWxpbmUpIHsKLQkvLyBwb2x5bGluZSA9IChQb2x5bGluZSkgb2JqOwotCS8vIGJyZWFrOwotCS8vIH0KLQkvLyB9Ci0JLy8gaWYocG9seWxpbmUgPT0gbnVsbCkgewotCS8vIHBvbHlsaW5lID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUG9seWxpbmUoKTsKLQkvLyBsaXN0LmFkZCgwLCBwb2x5bGluZSk7Ci0JLy8gfQotCS8vIHJldHVybiBwb2x5bGluZTsKLQkvLyB9Ci0JLy8gfQotCS8vIHJldHVybiBudWxsOwotCS8vIH0KLQotCS8qKgotCSAqIEBwYXJhbSBvYmplY3QKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBEaWFncmFtIGNyZWF0ZURpYWdyYW0oQWN0aXZpdHkgYWN0LCBpbnQgZGlhZ3JhbVR5cGUpIHsKLQkJLy8gY2hlY2sgaWYgdGhpcyBhY3Rpdml0eSBjb250cmlidXRlcy9leHRlbmRzIG90aGVyIGFjdGl2aXR5IGFuZCB0cnkKLQkJLy8gY29weQotCQkvLyB0aGUgZXhpc3RpbmcgZGlhZ3JhbSBmcm9tIHRoZSBiYXNlCi0JCS8vCi0JCWlmIChQcm9jZXNzVXRpbC5pc0V4dGVuZGluZ09yTG9jYWxseUNvbnRyaWJ1dGluZyhhY3QpKSB7Ci0JCQlEaWFncmFtIGJhc2VEaWFncmFtID0gZ2V0VU1BRGlhZ3JhbSgoQWN0aXZpdHkpIGFjdAotCQkJCQkuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpLCBkaWFncmFtVHlwZSwgZmFsc2UpOwotCQkJaWYgKGJhc2VEaWFncmFtICE9IG51bGwpIHsKLQkJCQlEaWFncmFtIGNvcHkgPSBHcmFwaGljYWxEYXRhSGVscGVyLmNvcHlEaWFncmFtKGJhc2VEaWFncmFtKTsKLQotCQkJCVVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbW9kZWxCcmlkZ2UgPSAoVU1BU2VtYW50aWNNb2RlbEJyaWRnZSkgY29weQotCQkJCQkJLmdldFNlbWFudGljTW9kZWwoKTsKLQkJCQltb2RlbEJyaWRnZS5zZXRFbGVtZW50KGFjdCk7Ci0JCQkJcmV0dXJuIGNvcHk7Ci0JCQl9Ci0JCX0KLQotCQlEaWFncmFtIGRpYWdyYW0gPSBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVEaWFncmFtKCk7Ci0JCVVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbW9kZWxCcmlkZ2UgPSBVbWFGYWN0b3J5LmVJTlNUQU5DRQotCQkJCS5jcmVhdGVVTUFTZW1hbnRpY01vZGVsQnJpZGdlKCk7Ci0JCW1vZGVsQnJpZGdlLnNldEVsZW1lbnQoYWN0KTsKLQkJbW9kZWxCcmlkZ2Uuc2V0UHJlc2VudGF0aW9uKGRpYWdyYW1QcmVzZW50YXRpb25zW2RpYWdyYW1UeXBlXSk7Ci0JCWRpYWdyYW0uc2V0U2VtYW50aWNNb2RlbChtb2RlbEJyaWRnZSk7Ci0KLQkJLy8gZ2V0RGlhZ3JhbShhY3QsIGRpYWdyYW1UeXBlKS5zZXRVTUFEaWFncmFtKGRpYWdyYW0pOwotCi0JCXBvcHVsYXRlRGlhZ3JhbShkaWFncmFtLCBhY3QsIGRpYWdyYW1UeXBlKTsKLQotCQlyZXR1cm4gZGlhZ3JhbTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcG9wdWxhdGVEaWFncmFtKERpYWdyYW0gZGlhZ3JhbSwgQWN0aXZpdHkgYWN0LCBpbnQgZGlhZ3JhbVR5cGUpIHsKLQkJLy8gY3JlYXRlIEdyYXBoTm9kZSBmb3IgZWFjaCBCcmVha2Rvd25FbGVtZW50IGFuZCBhZGQgaXQgdG8gdGhlIGRpYWdyYW0KLQkJLy8KLQkJTGlzdCBub2RlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gYWN0LmdldEJyZWFrZG93bkVsZW1lbnRzKCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZWxlbWVudCA9IGl0ZXIubmV4dCgpOwotCQkJaWYgKGNoaWxkVHlwZXNbZGlhZ3JhbVR5cGVdLmlzSW5zdGFuY2UoZWxlbWVudCkpIHsKLQkJCQlHcmFwaE5vZGUgbm9kZSA9IGNyZWF0ZUdyYXBoTm9kZSgoTWV0aG9kRWxlbWVudCkgZWxlbWVudCk7Ci0JCQkJZGlhZ3JhbS5nZXRDb250YWluZWQoKS5hZGQobm9kZSk7Ci0JCQkJbm9kZXMuYWRkKG5vZGUpOwotCQkJfQotCQl9Ci0KLQkJLy8gY3JlYXRlIEdyYXBoQ29ubmVjdG9ycyBmb3IgZWFjaCBCcmVha2Rvd25FbGVtZW50Ci0JCS8vCi0JCWZvciAoSXRlcmF0b3IgaXRlciA9IG5vZGVzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJR3JhcGhOb2RlIG5vZGUgPSAoR3JhcGhOb2RlKSBpdGVyLm5leHQoKTsKLQkJCWNyZWF0ZUdyYXBoQ29ubmVjdG9ycyhub2RlLCBkaWFncmFtLCBkaWFncmFtVHlwZSk7Ci0JCX0KLQl9Ci0KLS8vCXByaXZhdGUgdm9pZCBwb3B1bGF0ZUFjdGl2aXR5RGlhZ3JhbShEaWFncmFtIGRpYWdyYW0sIEFjdGl2aXR5IGFjdCkgewotLy8JCS8vIGNyZWF0ZSBHcmFwaE5vZGUgZm9yIGVhY2ggY2hpbGQgYWN0aXZpdHkgYW5kIGFkZCBpdCB0byB0aGUgZGlhZ3JhbQotLy8JCS8vIAotLy8JCUxpc3Qgbm9kZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0vLwkJZm9yIChJdGVyYXRvciBpdGVyID0gYWN0LmdldEJyZWFrZG93bkVsZW1lbnRzKCkuaXRlcmF0b3IoKTsgaXRlcgotLy8JCQkJLmhhc05leHQoKTspIHsKLS8vCQkJT2JqZWN0IGVsZW1lbnQgPSAoT2JqZWN0KSBpdGVyLm5leHQoKTsKLS8vCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotLy8JCQkJQWN0aXZpdHkgY2hpbGRBY3QgPSAoQWN0aXZpdHkpIGVsZW1lbnQ7Ci0vLwkJCQlHcmFwaE5vZGUgbm9kZSA9IGNyZWF0ZUdyYXBoTm9kZShjaGlsZEFjdCk7Ci0vLwkJCQlkaWFncmFtLmdldENvbnRhaW5lZCgpLmFkZChub2RlKTsKLS8vCQkJCW5vZGVzLmFkZChub2RlKTsKLS8vCQkJfQotLy8JCX0KLS8vCi0vLwkJLy8gY3JlYXRlIEdyYXBoQ29ubmVjdG9ycyBmb3IgZWFjaCBjaGlsZCBhY3Rpdml0eQotLy8JCS8vCi0vLwkJZm9yIChJdGVyYXRvciBpdGVyID0gbm9kZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0vLwkJCUdyYXBoTm9kZSBub2RlID0gKEdyYXBoTm9kZSkgaXRlci5uZXh0KCk7Ci0vLwkJCWNyZWF0ZUdyYXBoQ29ubmVjdG9ycyhub2RlLCBkaWFncmFtKTsKLS8vCQl9Ci0vLwl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gYWN0Ci0JICogQHBhcmFtIGRpYWdyYW1UeXBlCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBJRGlhZ3JhbUNoYW5nZUxpc3RlbmVyIGdldERpYWdyYW1DaGFuZ2VMaXN0ZW5lcihBY3Rpdml0eSBhY3QsCi0JCQlpbnQgZGlhZ3JhbVR5cGUpIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gYWN0LmVBZGFwdGVycygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGVsZW1lbnQgPSAoT2JqZWN0KSBpdGVyLm5leHQoKTsKLQkJCWlmIChkaWFncmFtQ2hhbmdlTGlzdGVuZXJDbGFzc2VzW2RpYWdyYW1UeXBlXS5pc0luc3RhbmNlKGVsZW1lbnQpKSB7Ci0JCQkJcmV0dXJuIChJRGlhZ3JhbUNoYW5nZUxpc3RlbmVyKSBlbGVtZW50OwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIEdyYXBoTm9kZSBjcmVhdGVHcmFwaE5vZGUoTWV0aG9kRWxlbWVudCBlbGVtZW50KSB7Ci0JCUdyYXBoTm9kZSBncmFwaE5vZGUgPSBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVHcmFwaE5vZGUoKTsKLQkJVU1BU2VtYW50aWNNb2RlbEJyaWRnZSBtb2RlbEJyaWRnZSA9IFVtYUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJLmNyZWF0ZVVNQVNlbWFudGljTW9kZWxCcmlkZ2UoKTsKLQkJbW9kZWxCcmlkZ2Uuc2V0RWxlbWVudChlbGVtZW50KTsKLQkJZ3JhcGhOb2RlLnNldFNlbWFudGljTW9kZWwobW9kZWxCcmlkZ2UpOwotCQlvcmcuZWNsaXBzZS5lcGYudW1hLlBvaW50IHBvaW50ID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUG9pbnQoKTsKLQkJcG9pbnQuc2V0WChuZXcgRG91YmxlKC0xKSk7Ci0JCXBvaW50LnNldFkobmV3IERvdWJsZSgtMSkpOwotCQlncmFwaE5vZGUuc2V0UG9zaXRpb24ocG9pbnQpOwotCQlvcmcuZWNsaXBzZS5lcGYudW1hLkRpbWVuc2lvbiBkaW0gPSBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVEaW1lbnNpb24oKTsKLQkJZGltLnNldFdpZHRoKG5ldyBEb3VibGUoLTEpKTsKLQkJZGltLnNldEhlaWdodChuZXcgRG91YmxlKC0xKSk7Ci0JCWdyYXBoTm9kZS5zZXRTaXplKGRpbSk7Ci0KLQkJcmV0dXJuIGdyYXBoTm9kZTsKLQl9Ci0KLQlwdWJsaWMgR3JhcGhFZGdlIGFkZEdyYXBoQ29ubmVjdG9yUGFpcihEaWFncmFtIGRpYWdyYW0sCi0JCQlHcmFwaE5vZGUgZ3JhcGhOb2RlLCBXb3JrT3JkZXIgZWxlbWVudCkgewotCQlHcmFwaENvbm5lY3RvciBzcmNDb25uZWN0b3IgPSBVbWFGYWN0b3J5LmVJTlNUQU5DRQotCQkJCS5jcmVhdGVHcmFwaENvbm5lY3RvcigpOwotCQlncmFwaE5vZGUuZ2V0QW5jaG9yYWdlKCkuYWRkKHNyY0Nvbm5lY3Rvcik7Ci0JCUdyYXBoRWRnZSBlZGdlID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlR3JhcGhFZGdlKCk7Ci0JCVVNQVNlbWFudGljTW9kZWxCcmlkZ2UgYnJpZGdlID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkuY3JlYXRlVU1BU2VtYW50aWNNb2RlbEJyaWRnZSgpOwotCQlicmlkZ2Uuc2V0RWxlbWVudChlbGVtZW50KTsKLQkJZWRnZS5zZXRTZW1hbnRpY01vZGVsKGJyaWRnZSk7Ci0JCWdyYXBoTm9kZS5nZXRDb250YWluZWQoKS5hZGQoZWRnZSk7Ci0JCWVkZ2UuZ2V0QW5jaG9yKCkuYWRkKHNyY0Nvbm5lY3Rvcik7Ci0KLQkJR3JhcGhOb2RlIHN1Y2NOb2RlID0gZ2V0R3JhcGhOb2RlKGRpYWdyYW0sIFVtYVV0aWwKLQkJCQkuZ2V0T3duaW5nQWN0aXZpdHkoZWxlbWVudCkpOwotCQlHcmFwaENvbm5lY3RvciB0YXJnZXRDb25uZWN0b3IgPSBVbWFGYWN0b3J5LmVJTlNUQU5DRQotCQkJCS5jcmVhdGVHcmFwaENvbm5lY3RvcigpOwotCQlzdWNjTm9kZS5nZXRBbmNob3JhZ2UoKS5hZGQodGFyZ2V0Q29ubmVjdG9yKTsKLQkJZWRnZS5nZXRBbmNob3IoKS5hZGQodGFyZ2V0Q29ubmVjdG9yKTsKLQkJcmV0dXJuIGVkZ2U7Ci0JfQotCi0JcHVibGljIEdyYXBoRWRnZSBhZGRHcmFwaENvbm5lY3RvclBhaXIoR3JhcGhOb2RlIHNyY05vZGUsCi0JCQlHcmFwaE5vZGUgdGFyZ2V0Tm9kZSkgewotCQlHcmFwaENvbm5lY3RvciBzcmNDb25uZWN0b3IgPSBVbWFGYWN0b3J5LmVJTlNUQU5DRQotCQkJCS5jcmVhdGVHcmFwaENvbm5lY3RvcigpOwotCQlzcmNOb2RlLmdldEFuY2hvcmFnZSgpLmFkZChzcmNDb25uZWN0b3IpOwotCQlHcmFwaEVkZ2UgZWRnZSA9IFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUdyYXBoRWRnZSgpOwotCQlzcmNOb2RlLmdldENvbnRhaW5lZCgpLmFkZChlZGdlKTsKLQkJZWRnZS5nZXRBbmNob3IoKS5hZGQoc3JjQ29ubmVjdG9yKTsKLQotCQlHcmFwaENvbm5lY3RvciB0YXJnZXRDb25uZWN0b3IgPSBVbWFGYWN0b3J5LmVJTlNUQU5DRQotCQkJCS5jcmVhdGVHcmFwaENvbm5lY3RvcigpOwotCQl0YXJnZXROb2RlLmdldEFuY2hvcmFnZSgpLmFkZCh0YXJnZXRDb25uZWN0b3IpOwotCQllZGdlLmdldEFuY2hvcigpLmFkZCh0YXJnZXRDb25uZWN0b3IpOwotCQlyZXR1cm4gZWRnZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVHcmFwaEVkZ2UoR3JhcGhFZGdlIGVkZ2UpIHsKLQkJRWNvcmVVdGlsLnJlbW92ZShlZGdlKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZWRnZS5nZXRBbmNob3IoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCUdyYXBoQ29ubmVjdG9yIGNvbm4gPSAoR3JhcGhDb25uZWN0b3IpIGl0ZXIubmV4dCgpOwotCQkJRWNvcmVVdGlsLnJlbW92ZShjb25uKTsKLQkJfQotCX0KLQotCS8vIHB1YmxpYyB2b2lkIHJlbW92ZUdyYXBoQ29ubmVjdG9yUGFpcihHcmFwaE5vZGUgc3JjTm9kZSwgR3JhcGhOb2RlCi0JLy8gdGFyZ2V0Tm9kZSkgewotCS8vIC8vIGZpbmQgdGhlIHNvdXJjZSBHcmFwaENvbm5lY3RvciBhbmQgcmVtb3ZlIGl0LCBpdHMgR3JhcGhFZGdlLCBhbmQgaXRzCi0JLy8gdGFyZ2V0IEdyYXBoQ29ubmVjdG9yCi0JLy8gLy8KLQkvLyBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBzcmNOb2RlLmdldEFuY2hvcmFnZSgpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykKLQkvLyB7Ci0JLy8gR3JhcGhDb25uZWN0b3IgY29ubmVjdG9yID0gKEdyYXBoQ29ubmVjdG9yKSBpdGVyLm5leHQoKTsKLQkvLyBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gY29ubmVjdG9yLmdldEdyYXBoRWRnZSgpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yCi0JLy8gLmhhc05leHQoKTspIHsKLQkvLyBHcmFwaEVkZ2UgZWRnZSA9IChHcmFwaEVkZ2UpIGl0ZXJhdG9yLm5leHQoKTsKLQkvLyBPYmplY3QgdGFyZ2V0Q29ubmVjdG9yID0gZWRnZS5nZXRBbmNob3IoKS5nZXQoMSk7Ci0JLy8gaWYodGFyZ2V0Tm9kZS5nZXRBbmNob3JhZ2UoKS5yZW1vdmUodGFyZ2V0Q29ubmVjdG9yKSkgewotCS8vIHNyY05vZGUuZ2V0Q29udGFpbmVkKCkucmVtb3ZlKGVkZ2UpOwotCS8vIC8vIGRvbid0IHJlbW92ZSB0aGUgZWRnZSBmcm9tIGNvbm5lY3RvciB0byBzdXBwb3J0IHVuZG8KLQkvLyAvLwotCS8vIC8vIGl0ZXJhdG9yLnJlbW92ZSgpOwotCS8vIH0KLQkvLyB9Ci0JLy8gaWYoY29ubmVjdG9yLmdldEdyYXBoRWRnZSgpLmlzRW1wdHkoKSkgewotCS8vIGl0ZXIucmVtb3ZlKCk7Ci0JLy8gfQotCS8vIH0KLQkvLyB9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVHcmFwaENvbm5lY3Rpb25QYWlyKEdyYXBoTm9kZSBncmFwaE5vZGUsCi0JCQlXb3JrT3JkZXIgd29ya09yZGVyKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGdyYXBoTm9kZS5nZXRBbmNob3JhZ2UoKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCUdyYXBoQ29ubmVjdG9yIGNvbm4gPSAoR3JhcGhDb25uZWN0b3IpIGl0ZXIubmV4dCgpOwotCQkJR3JhcGhFZGdlIGVkZ2UgPSAoR3JhcGhFZGdlKSBjb25uLmdldEdyYXBoRWRnZSgpLmdldCgwKTsKLQkJCWlmIChlZGdlLmVDb250YWluZXIoKSA9PSBncmFwaE5vZGUpIHsKLQkJCQlHcmFwaENvbm5lY3RvciBjb25uMiA9IChHcmFwaENvbm5lY3RvcikgZWRnZS5nZXRBbmNob3IoKS5nZXQoMSk7Ci0JCQkJU2VtYW50aWNNb2RlbEJyaWRnZSBicmlkZ2UgPSBjb25uMi5nZXRHcmFwaEVsZW1lbnQoKQotCQkJCQkJLmdldFNlbWFudGljTW9kZWwoKTsKLQkJCQlpZiAoYnJpZGdlIGluc3RhbmNlb2YgVU1BU2VtYW50aWNNb2RlbEJyaWRnZQotCQkJCQkJJiYgKChVTUFTZW1hbnRpY01vZGVsQnJpZGdlKSBicmlkZ2UpLmdldEVsZW1lbnQoKSA9PSBVbWFVdGlsCi0JCQkJCQkJCS5nZXRPd25pbmdBY3Rpdml0eSh3b3JrT3JkZXIpKSB7Ci0JCQkJCWNvbm4yLmdldEdyYXBoRWxlbWVudCgpLmdldEFuY2hvcmFnZSgpLnJlbW92ZShjb25uMik7Ci0JCQkJCWl0ZXIucmVtb3ZlKCk7Ci0JCQkJCWdyYXBoTm9kZS5nZXRDb250YWluZWQoKS5yZW1vdmUoZWRnZSk7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlR3JhcGhDb25uZWN0b3JzKEdyYXBoTm9kZSBncmFwaE5vZGUsIERpYWdyYW0gZGlhZ3JhbSkgewotCQljcmVhdGVHcmFwaENvbm5lY3RvcnMoZ3JhcGhOb2RlLCBkaWFncmFtLCBnZXREaWFncmFtVHlwZShkaWFncmFtKSk7Ci0JfQotCi0JaW50IGdldERpYWdyYW1UeXBlKERpYWdyYW0gZGlhZ3JhbSkgewotCQlTdHJpbmcgdHlwZVN0ciA9IGRpYWdyYW0uZ2V0U2VtYW50aWNNb2RlbCgpLmdldFByZXNlbnRhdGlvbigpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGRpYWdyYW1QcmVzZW50YXRpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoZGlhZ3JhbVByZXNlbnRhdGlvbnNbaV0uZXF1YWxzKHR5cGVTdHIpKQotCQkJCXJldHVybiBpOwotCQl9Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlR3JhcGhDb25uZWN0b3JzKEdyYXBoTm9kZSBncmFwaE5vZGUsIERpYWdyYW0gZGlhZ3JhbSwKLQkJCWludCBkaWFncmFtVHlwZSkgewotCQlNZXRob2RFbGVtZW50IGUgPSAoKFVNQVNlbWFudGljTW9kZWxCcmlkZ2UpIGdyYXBoTm9kZQotCQkJCS5nZXRTZW1hbnRpY01vZGVsKCkpLmdldEVsZW1lbnQoKTsKLQkJc3dpdGNoIChkaWFncmFtVHlwZSkgewotCQljYXNlIEdyYXBoaWNhbERhdGFIZWxwZXIuQUNUSVZJVFlfRElBR1JBTToKLQkJCWlmIChlIGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQlBY3Rpdml0eSBhY3QgPSAoQWN0aXZpdHkpIGU7Ci0JCQkJLy8gY3JlYXRlIGNvbm5lY3RvcnMKLQkJCQkvLwotCQkJCS8vIExpc3QgbGlzdCA9IGFjdC5nZXRMaW5rVG9QcmVkZWNlc3NvcigpOwotCQkJCS8vIGludCBzaXplID0gbGlzdC5zaXplKCk7Ci0JCQkJLy8JCQkJCi0JCQkJLy8gQWN0aXZpdHkgcGFyZW50ID0gKEFjdGl2aXR5KQotCQkJCS8vICgoVU1BU2VtYW50aWNNb2RlbEJyaWRnZSlkaWFncmFtLmdldFNlbWFudGljTW9kZWwoKSkuZ2V0RWxlbWVudCgpOwotCQkJCS8vIExpc3QgYnJlYWtkb3duRWxlbWVudHMgPSBwYXJlbnQuZ2V0QnJlYWtkb3duRWxlbWVudHMoKTsKLQkJCQkvLyBmb3IoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJLy8gV29ya09yZGVyIHdvcmtPcmRlciA9IChXb3JrT3JkZXIpIGxpc3QuZ2V0KGkpOwotCQkJCS8vIGlmKGJyZWFrZG93bkVsZW1lbnRzLmNvbnRhaW5zKHdvcmtPcmRlci5nZXRQcmVkKCkpKSB7Ci0JCQkJLy8gYWRkR3JhcGhDb25uZWN0b3JQYWlyKGRpYWdyYW0sIGdyYXBoTm9kZSwgd29ya09yZGVyKTsKLQkJCQkvLyB9Ci0JCQkJLy8gfQotCi0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gYWN0LmdldExpbmtUb1ByZWRlY2Vzc29yKCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJV29ya09yZGVyIHdvcmtPcmRlciA9IChXb3JrT3JkZXIpIGl0ZXIubmV4dCgpOwotCQkJCQlHcmFwaE5vZGUgc3JjTm9kZSA9IGZpbmRHcmFwaE5vZGUoZGlhZ3JhbSwgd29ya09yZGVyCi0JCQkJCQkJLmdldFByZWQoKSk7Ci0JCQkJCWlmIChzcmNOb2RlICE9IG51bGwpIHsKLQkJCQkJCWFkZEdyYXBoQ29ubmVjdG9yUGFpcihzcmNOb2RlLCBncmFwaE5vZGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQlicmVhazsKLQkJY2FzZSBHcmFwaGljYWxEYXRhSGVscGVyLldPUktfUFJPRFVDVF9ERVBFTkRFTkNZX0RJQUdSQU06Ci0JCQlpZiAoZSBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgewotCQkJCVdvcmtQcm9kdWN0RGVzY3JpcHRvciBkZXNjcmlwdG9yID0gKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgZTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBkZXNjcmlwdG9yLmdldEltcGFjdHMoKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQlXb3JrUHJvZHVjdERlc2NyaXB0b3IgaW1wYWN0ZWREZXNjcmlwdG9yID0gKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgaXRlcgotCQkJCQkJCS5uZXh0KCk7Ci0JCQkJCUdyYXBoTm9kZSB0YXJnZXROb2RlID0gR3JhcGhpY2FsRGF0YU1hbmFnZXIuZmluZEdyYXBoTm9kZSgKLQkJCQkJCQlkaWFncmFtLCBpbXBhY3RlZERlc2NyaXB0b3IpOwotCQkJCQlpZiAodGFyZ2V0Tm9kZSAhPSBudWxsKSB7Ci0JCQkJCQlhZGRHcmFwaENvbm5lY3RvclBhaXIoZ3JhcGhOb2RlLCB0YXJnZXROb2RlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJYnJlYWs7Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIFVNQSBkaWFncmFtIGZyb20gdGhlIFVNQSBtb2RlbCBmb3IgdGhlIGdpdmVuIGFjdGl2aXR5LgotCSAqIAotCSAqIEBwYXJhbSBlCi0JICogQHBhcmFtIGRpYWdyYW1UeXBlCi0JICogICAgICAgICAgICBvbmUgb2YgdGhlIGRpYWdyYW0gdHlwZSBjb25zdGFudHMgZGVmaW5lZCBpbgotCSAqICAgICAgICAgICAge0BsaW5rIEdyYXBoaWNhbERhdGFIZWxwZXIgR3JhcGhpY2FsRGF0YUhlbHBlciB9Ci0JICogQHBhcmFtIGNyZWF0ZQotCSAqICAgICAgICAgICAgaWYgdHJ1ZSwgbmV3IFVNQSBkaWFncmFtIHdpbGwgYmUgY3JlYXRlZCBpZiB0aGUgYWN0aXZpdHkgZG9lcwotCSAqICAgICAgICAgICAgbm90IGhhdmUgb25lIGFscmVhZHkuCi0JICogQHJldHVybgotCSAqIEBzZWUgR3JhcGhpY2FsRGF0YUhlbHBlciNBQ1RJVklUWV9ESUFHUkFNCi0JICogQHNlZSBHcmFwaGljYWxEYXRhSGVscGVyI0FDVElWSVRZX0RFVEFJTF9ESUFHUkFNCi0JICogQHNlZSBHcmFwaGljYWxEYXRhSGVscGVyI1dPUktfUFJPRFVDVF9ERVBFTkRFTkNZX0RJQUdSQU0KLQkgKi8KLQlwdWJsaWMgRGlhZ3JhbSBnZXRVTUFEaWFncmFtKEFjdGl2aXR5IGUsIGludCBkaWFncmFtVHlwZSwgYm9vbGVhbiBjcmVhdGUpIHsKLQkJRGlhZ3JhbSBkaWFncmFtID0gbnVsbDsKLQotCQkvLyAvLyBsb29rIGZvciBJRGlhZ3JhbUNoYW5nZUxpc3RlbmVyIGluIGFjdGl2aXR5J3MgYWRhcHRlciBsaXN0IGZpcnN0Ci0JCS8vIElEaWFncmFtQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgPSAoSURpYWdyYW1DaGFuZ2VMaXN0ZW5lcikKLQkJLy8gVW1hVXRpbC5nZXRBZGFwdGVyKGUsIGRpYWdyYW1MaXN0ZW5lclR5cGUpOwotCQkvLyBpZihsaXN0ZW5lciAhPSBudWxsKSB7Ci0JCS8vIGRpYWdyYW0gPSBsaXN0ZW5lci5nZXREaWFncmFtKCkuZ2V0VU1BRGlhZ3JhbSgpOwotCQkvLyBpZihkaWFncmFtICE9IG51bGwpIHJldHVybiBkaWFncmFtOwotCQkvLyB9Ci0KLQkJT2JqZWN0IGNvbnRhaW5lciA9IGUuZUNvbnRhaW5lcigpOwotCQlpZiAoY29udGFpbmVyICE9IG51bGwpIHsKLQkJCVByb2Nlc3NQYWNrYWdlIHBrZyA9IChQcm9jZXNzUGFja2FnZSkgY29udGFpbmVyOwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gcGtnLmdldERpYWdyYW1zKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJZGlhZ3JhbSA9IChEaWFncmFtKSBpdGVyLm5leHQoKTsKLQkJCQlTZW1hbnRpY01vZGVsQnJpZGdlIG1vZGVsQnJpZGdlID0gZGlhZ3JhbS5nZXRTZW1hbnRpY01vZGVsKCk7Ci0JCQkJaWYgKG1vZGVsQnJpZGdlICE9IG51bGwKLQkJCQkJCSYmIG1vZGVsQnJpZGdlIGluc3RhbmNlb2YgVU1BU2VtYW50aWNNb2RlbEJyaWRnZQotCQkJCQkJJiYgZSA9PSAoKFVNQVNlbWFudGljTW9kZWxCcmlkZ2UpIG1vZGVsQnJpZGdlKQotCQkJCQkJCQkuZ2V0RWxlbWVudCgpCi0JCQkJCQkmJiBkaWFncmFtUHJlc2VudGF0aW9uc1tkaWFncmFtVHlwZV0KLQkJCQkJCQkJLmVxdWFscygoKFVNQVNlbWFudGljTW9kZWxCcmlkZ2UpIG1vZGVsQnJpZGdlKQotCQkJCQkJCQkJCS5nZXRQcmVzZW50YXRpb24oKSkpIHsKLQkJCQkJcmV0dXJuIGRpYWdyYW07Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJaWYgKGNyZWF0ZSkgewotCQkJLy8gY291bGQgbm90IGZpbmQgaXQsIGNyZWF0ZSBuZXcgb25lCi0JCQkvLwotCQkJZGlhZ3JhbSA9IGNyZWF0ZURpYWdyYW0oZSwgZGlhZ3JhbVR5cGUpOwotCQkJaWYgKGNvbnRhaW5lciAhPSBudWxsKSB7Ci0JCQkJKChQcm9jZXNzUGFja2FnZSkgY29udGFpbmVyKS5nZXREaWFncmFtcygpLmFkZChkaWFncmFtKTsKLQkJCX0KLQkJCXJldHVybiBkaWFncmFtOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8vIHB1YmxpYyBEaWFncmFtIGdldFVNQURpYWdyYW0oQWN0aXZpdHkgYWN0LCBpbnQgZGlhZ3JhbVR5cGUpIHsKLQkvLyBEaWFncmFtIGRpYWdyYW0gPSBudWxsOwotCS8vICAgICAgICAKLQkvLyAvLyBsb29rIGZvciBJRGlhZ3JhbUNoYW5nZUxpc3RlbmVyIGluIGFjdGl2aXR5J3MgYWRhcHRlciBsaXN0IGZpcnN0Ci0JLy8gSURpYWdyYW1DaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA9IGdldERpYWdyYW1DaGFuZ2VMaXN0ZW5lcihhY3QsCi0JLy8gZGlhZ3JhbVR5cGUpOwotCS8vIGlmKGxpc3RlbmVyICE9IG51bGwpIHsKLQkvLyBkaWFncmFtID0gbGlzdGVuZXIuZ2V0RGlhZ3JhbSgpLmdldFVNQURpYWdyYW0oKTsKLQkvLyBpZihkaWFncmFtICE9IG51bGwpIHJldHVybiBkaWFncmFtOwotCS8vIH0KLQkvLyBPYmplY3QgY29udGFpbmVyID0gYWN0LmVDb250YWluZXIoKTsKLQkvLyBpZihjb250YWluZXIgIT0gbnVsbCkgewotCS8vIFByb2Nlc3NQYWNrYWdlIHBrZyA9IChQcm9jZXNzUGFja2FnZSkgY29udGFpbmVyOwotCS8vIGZvciAoSXRlcmF0b3IgaXRlciA9IHBrZy5nZXREaWFncmFtcygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCS8vIGRpYWdyYW0gPSAoRGlhZ3JhbSkgaXRlci5uZXh0KCk7Ci0JLy8gU2VtYW50aWNNb2RlbEJyaWRnZSBtb2RlbEJyaWRnZSA9IGRpYWdyYW0uZ2V0U2VtYW50aWNNb2RlbCgpOwotCS8vIGlmKG1vZGVsQnJpZGdlICE9IG51bGwgJiYgbW9kZWxCcmlkZ2UgaW5zdGFuY2VvZiBVTUFTZW1hbnRpY01vZGVsQnJpZGdlCi0JLy8gJiYgYWN0ID09ICgoVU1BU2VtYW50aWNNb2RlbEJyaWRnZSltb2RlbEJyaWRnZSkuZ2V0RWxlbWVudCgpCi0JLy8gJiYKLQkvLyBkaWFncmFtUHJlc2VudGF0aW9uc1tkaWFncmFtVHlwZV0uZXF1YWxzKCgoVU1BU2VtYW50aWNNb2RlbEJyaWRnZSltb2RlbEJyaWRnZSkuZ2V0UHJlc2VudGF0aW9uKCkpKQotCS8vIHsKLQkvLyByZXR1cm4gZGlhZ3JhbTsKLQkvLyB9Ci0JLy8gfQotCS8vIH0KLQkvLyAgICAgICAgCi0JLy8gLy8gY291bGQgbm90IGZpbmQgaXQsIGNyZWF0ZSBuZXcgb25lCi0JLy8gLy8KLQkvLyByZXR1cm4gY3JlYXRlRGlhZ3JhbShhY3QsIGRpYWdyYW1UeXBlKTsKLQkvLyB9Ci0KLQkvKioKLQkgKiBAcGFyYW0gYWN0Ci0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5EaWFncmFtIGdldERpYWdyYW0oQWN0aXZpdHkgYWN0LAotCQkJaW50IGRpYWdyYW1UeXBlKSB7Ci0JCUlEaWFncmFtQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgPSBnZXREaWFncmFtQ2hhbmdlTGlzdGVuZXIoYWN0LAotCQkJCWRpYWdyYW1UeXBlKTsKLQkJcmV0dXJuIGxpc3RlbmVyID09IG51bGwgPyBudWxsIDogbGlzdGVuZXIuZ2V0RGlhZ3JhbSgpOwotCX0KLQotCS8qKgotCSAqIEdldHMgbGlzdCBvZiBjb21tYW5kIGxpc3RlbmVycyB0aGF0IHdpbGwgaGFuZGxlIHRoZSBkaWFncmFtIHJlbGF0ZWQgY2hhbmdlcyBvZiB0aGUgY29tbWFuZHMgb2YgaW50ZXJlc3NlcwotCSAqIAotCSAqIEByZXR1cm4KLQkgKiBAc2VlIElDb21tYW5kTGlzdGVuZXIKLQkgKi8KLQlwdWJsaWMgTGlzdDxJQ29tbWFuZExpc3RlbmVyPiBnZXRDb21tYW5kTGlzdGVuZXJzKCkgewotCQlpZiAoY29tbWFuZExpc3RlbmVycyA9PSBudWxsKSB7Ci0JCQljb21tYW5kTGlzdGVuZXJzID0gbmV3IEFycmF5TGlzdDxJQ29tbWFuZExpc3RlbmVyPigpOwotCQl9Ci0KLQkJY29tbWFuZExpc3RlbmVycy5hZGQobmV3IElDb21tYW5kTGlzdGVuZXIoKSB7Ci0JCQkKLQkJCXB1YmxpYyB2b2lkIG5vdGlmeUV4ZWN1dGVkKENvbW1hbmQgY29tbWFuZCkgewotCQkJCS8vIGdldCBjb250cmlidXRvci9yZXBsYWNlciBvZiB0aGUgYWN0aXZpdHkKLQkJCQkvLwotCQkJCUFjdGl2aXR5IGFjdCA9IChBY3Rpdml0eSkgY29tbWFuZC5nZXRSZXN1bHQoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJCQlBY3Rpdml0eSBiYXNlID0gKEFjdGl2aXR5KSBhY3QuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpOwotCQkJCWlmIChiYXNlICE9IG51bGwpIHsKLQkJCQkJQWN0aXZpdHkgcGFyZW50QWN0ID0gYWN0LmdldFN1cGVyQWN0aXZpdGllcygpOwotCQkJCQlEaWFncmFtIGRpYWdyYW0gPSBnZXRVTUFEaWFncmFtKHBhcmVudEFjdCwKLQkJCQkJCQlHcmFwaGljYWxEYXRhSGVscGVyLkFDVElWSVRZX0RJQUdSQU0sIGZhbHNlKTsKLQkJCQkJaWYgKGRpYWdyYW0gIT0gbnVsbCkgewotCQkJCQkJLy8gZmluZCBleGlzdGluZyBub2RlIGZvciBiYXNlIGFuZCBsaW5rIGl0IHRvIHRoZQotCQkJCQkJLy8gY29udHJpYnV0b3JlL3JlcGxhY2VyIG9mIHRoZSBhY3Rpdml0eQotCQkJCQkJLy8KLQkJCQkJCUdyYXBoTm9kZSBncmFwaE5vZGUgPSBmaW5kR3JhcGhOb2RlKGRpYWdyYW0sIGJhc2UpOwotCQkJCQkJaWYgKGdyYXBoTm9kZSAhPSBudWxsKSB7Ci0JCQkJCQkJVU1BU2VtYW50aWNNb2RlbEJyaWRnZSBicmlkZ2UgPSAoVU1BU2VtYW50aWNNb2RlbEJyaWRnZSkgZ3JhcGhOb2RlCi0JCQkJCQkJCQkuZ2V0U2VtYW50aWNNb2RlbCgpOwotCQkJCQkJCWlmIChicmlkZ2UuZ2V0RWxlbWVudCgpICE9IGFjdCkgewotCQkJCQkJCQlicmlkZ2Uuc2V0RWxlbWVudChhY3QpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCQkKLQkJCQkJaWYoYWN0LmdldFZhcmlhYmlsaXR5VHlwZSgpID09IFZhcmlhYmlsaXR5VHlwZS5MT0NBTF9DT05UUklCVVRJT04pIHsKLQkJCQkJCS8vIGNvcHkgZGlhZ3JhbXMgYW5kIHRoZWlyIHB1Ymxpc2hpbmcgb3B0aW9ucwotCQkJCQkJLy8KLQkJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgR3JhcGhpY2FsRGF0YUhlbHBlci5ESUFHUkFNX1RZUEVTLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQkJaW50IGRpYWdyYW1UeXBlID0gR3JhcGhpY2FsRGF0YUhlbHBlci5ESUFHUkFNX1RZUEVTW2ldOwotCQkJCQkJCWRpYWdyYW0gPSBnZXRVTUFEaWFncmFtKGJhc2UsIGRpYWdyYW1UeXBlLCBmYWxzZSk7Ci0JCQkJCQkJaWYgKGRpYWdyYW0gIT0gbnVsbCkgewotCQkJCQkJCQlEaWFncmFtIGNvcHkgPSBnZXRVTUFEaWFncmFtKGFjdCwgZGlhZ3JhbVR5cGUsIHRydWUpOwotCQkJCQkJCQljb3B5LnNldFN1cHByZXNzZWQoZGlhZ3JhbS5nZXRTdXBwcmVzc2VkKCkpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJcHVibGljIENsYXNzIGdldENvbW1hbmRUeXBlKCkgewotCQkJCXJldHVybiBWYXJ5QWN0aXZpdHlDb21tYW5kLmNsYXNzOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBwcmVVbmRvKENvbW1hbmQgY29tbWFuZCkgewotCQkJCS8vIGdldCBvbGQgY29udHJpYnV0b3IvcmVwbGFjZXIgb2YgdGhlIGFjdGl2aXR5Ci0JCQkJLy8KLQkJCQlBY3Rpdml0eSBhY3QgPSAoQWN0aXZpdHkpIGNvbW1hbmQuZ2V0UmVzdWx0KCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0vLwkJCQlWYXJ5QWN0aXZpdHlDb21tYW5kIGNtZCA9IChWYXJ5QWN0aXZpdHlDb21tYW5kKSBjb21tYW5kOwotLy8JCQkJQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIgYWRhcHRlciA9IGNtZC5nZXRXcmFwcGVyKCk7Ci0JCQkJVmFyaWFiaWxpdHlFbGVtZW50IGJhc2VBY3QgPSBhY3QuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpOwotCQkJCWlmIChiYXNlQWN0ICE9IG51bGwpIHsKLQkJCQkJQWN0aXZpdHkgcGFyZW50QWN0ID0gYWN0LmdldFN1cGVyQWN0aXZpdGllcygpOwotCQkJCQlEaWFncmFtIGRpYWdyYW0gPSBnZXRVTUFEaWFncmFtKHBhcmVudEFjdCwKLQkJCQkJCQlHcmFwaGljYWxEYXRhSGVscGVyLkFDVElWSVRZX0RJQUdSQU0sIGZhbHNlKTsKLQkJCQkJaWYgKGRpYWdyYW0gIT0gbnVsbCkgewotCQkJCQkJLy8gZmluZCBleGlzdGluZyBub2RlIGZvciB0aGUgb2xkIGNvbnRyaWJ1dG9yZS9yZXBsYWNlcgotCQkJCQkJLy8gb2xkIGFuZCByZWxpbmsgaXQgdG8gdGhlIGJhc2UgYWN0aXZpdHkKLQkJCQkJCS8vCi0JCQkJCQlHcmFwaE5vZGUgZ3JhcGhOb2RlID0gZmluZEdyYXBoTm9kZShkaWFncmFtLCBhY3QpOwotCQkJCQkJaWYgKGdyYXBoTm9kZSAhPSBudWxsKSB7Ci0JCQkJCQkJVU1BU2VtYW50aWNNb2RlbEJyaWRnZSBicmlkZ2UgPSAoVU1BU2VtYW50aWNNb2RlbEJyaWRnZSkgZ3JhcGhOb2RlCi0JCQkJCQkJCQkuZ2V0U2VtYW50aWNNb2RlbCgpOwotCQkJCQkJCWlmIChicmlkZ2UuZ2V0RWxlbWVudCgpICE9IGJhc2VBY3QpIHsKLQkJCQkJCQkJYnJpZGdlLnNldEVsZW1lbnQoYmFzZUFjdCk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBwcmVFeGVjdXRlKENvbW1hbmQgY29tbWFuZCkgewotCQkJCQotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBwb3N0VW5kbyhDb21tYW5kIGNvbW1hbmQpIHsKLQkJCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCQkJCi0JCQl9Ci0KLQkJfSk7Ci0KLQkJcmV0dXJuIGNvbW1hbmRMaXN0ZW5lcnM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL3V0aWwvSUFjdGl2aXR5RGV0YWlsRGlhZ3JhbUNoYW5nZUxpc3RlbmVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvdXRpbC9JQWN0aXZpdHlEZXRhaWxEaWFncmFtQ2hhbmdlTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTcwZWE1Ni4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvdXRpbC9JQWN0aXZpdHlEZXRhaWxEaWFncmFtQ2hhbmdlTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLnV0aWw7Ci0KLS8qKgotICogRGlhZ3JhbSBjaGFuZ2UgbGlzdGVuZXIgZm9yIGFjdGl2aXR5IGRldGFpbCBkaWFncmFtCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUFjdGl2aXR5RGV0YWlsRGlhZ3JhbUNoYW5nZUxpc3RlbmVyIGV4dGVuZHMKLQkJSURpYWdyYW1DaGFuZ2VMaXN0ZW5lciB7Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC91dGlsL0lBY3Rpdml0eURpYWdyYW1DaGFuZ2VMaXN0ZW5lci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL3V0aWwvSUFjdGl2aXR5RGlhZ3JhbUNoYW5nZUxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhMmFkYzIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL3V0aWwvSUFjdGl2aXR5RGlhZ3JhbUNoYW5nZUxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC51dGlsOwotCi0vKioKLSAqIERpYWdyYW0gY2hhbmdlIGxpc3RlbmVyIGZvciBhY3Rpdml0eSBkaWFncmFtCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUFjdGl2aXR5RGlhZ3JhbUNoYW5nZUxpc3RlbmVyIGV4dGVuZHMgSURpYWdyYW1DaGFuZ2VMaXN0ZW5lciB7Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC91dGlsL0lBY3Rpdml0eU5vZGVDaGFuZ2VMaXN0ZW5lci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL3V0aWwvSUFjdGl2aXR5Tm9kZUNoYW5nZUxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxY2NlMzIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL3V0aWwvSUFjdGl2aXR5Tm9kZUNoYW5nZUxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC51dGlsOwotCi0vKioKLSAqIE5vZGUgY2hhbmdlIGxpc3RlbmVyIGZvciBhY3Rpdml0eSBub2RlCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUFjdGl2aXR5Tm9kZUNoYW5nZUxpc3RlbmVyIGV4dGVuZHMgSU5vZGVDaGFuZ2VMaXN0ZW5lciB7Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC91dGlsL0lBZGFwdGVyRmFjdG9yeUZpbHRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL3V0aWwvSUFkYXB0ZXJGYWN0b3J5RmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1YjA5NGMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL3V0aWwvSUFkYXB0ZXJGYWN0b3J5RmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JQWRhcHRlckZhY3RvcnlQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci0KLS8qKgotICogRmlsdGVyIHRoYXQgcHJvdmlkZXMgYWRhcHRlciBmYWN0b3JpZXMgZm9yIGRpZmZlcmVudCB2aWV3cyBvZiBwcm9jZXNzCi0gKiBicmVha2Rvd24gc3RydWN0dXJlLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElBZGFwdGVyRmFjdG9yeUZpbHRlciBleHRlbmRzIElGaWx0ZXIsIElBZGFwdGVyRmFjdG9yeVByb3ZpZGVyIHsKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC91dGlsL0lEaWFncmFtQ2hhbmdlTGlzdGVuZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC91dGlsL0lEaWFncmFtQ2hhbmdlTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWIxODlhOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvdXRpbC9JRGlhZ3JhbUNoYW5nZUxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5EaWFncmFtOwotCi0vKioKLSAqIEFkYXB0ZXIgdG8gbGlzdGVuIHRvIGRpYWdyYW0gY2hhbmdlcwotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElEaWFncmFtQ2hhbmdlTGlzdGVuZXIgZXh0ZW5kcyBBZGFwdGVyIHsKLQlEaWFncmFtIGdldERpYWdyYW0oKTsKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC91dGlsL0lOb2RlQ2hhbmdlTGlzdGVuZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC91dGlsL0lOb2RlQ2hhbmdlTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzQ4MGQwNS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvdXRpbC9JTm9kZUNoYW5nZUxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlOwotCi0vKioKLSAqIEFkYXB0ZXIgdG8gbGlzdGVuIHRvIGNoYW5nZXMgaW4gZGlhZ3JhbSBub2RlCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSU5vZGVDaGFuZ2VMaXN0ZW5lciBleHRlbmRzIEFkYXB0ZXIgewotCU5vZGUgZ2V0Tm9kZSgpOwotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL3V0aWwvSVdQRERpYWdyYW1DaGFuZ2VMaXN0ZW5lci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL3V0aWwvSVdQRERpYWdyYW1DaGFuZ2VMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYzYwMmU1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC91dGlsL0lXUEREaWFncmFtQ2hhbmdlTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLnV0aWw7Ci0KLS8qKgotICogRGlhZ3JhbSBjaGFuZ2UgbGlzdGVuZXIgZm9yIHdvcmsgcHJvZHVjdCBkZXBlbmRlbmN5IGRpYWdyYW0uCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVdQRERpYWdyYW1DaGFuZ2VMaXN0ZW5lciBleHRlbmRzIElEaWFncmFtQ2hhbmdlTGlzdGVuZXIgewotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvdXRpbC9Nb2RlbEFkYXB0ZXJGYWN0b3J5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvdXRpbC9Nb2RlbEFkYXB0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiODRkOGIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL3V0aWwvTW9kZWxBZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5BY3Rpdml0eURldGFpbERpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuQWN0aXZpdHlEaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkRpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5MaW5rZWRPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTW9kZWxQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5hbWVkTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGVDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuUm9sZU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuUm9sZVRhc2tDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuVGFza05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuVHlwZWROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLldvcmtCcmVha2Rvd25FbGVtZW50Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Xb3JrUHJvZHVjdENvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Xb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLldvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuV29ya1Byb2R1Y3ROb2RlOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIFRoZSA8Yj5BZGFwdGVyIEZhY3Rvcnk8L2I+IGZvciB0aGUgbW9kZWwuCi0gKiBJdCBwcm92aWRlcyBhbiBhZGFwdGVyIDxjb2RlPmNyZWF0ZVhYWDwvY29kZT4gbWV0aG9kIGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbC4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Nb2RlbFBhY2thZ2UKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIE1vZGVsQWRhcHRlckZhY3RvcnkgZXh0ZW5kcyBBZGFwdGVyRmFjdG9yeUltcGwgewotCS8qKgotCSAqIFRoZSBjYWNoZWQgbW9kZWwgcGFja2FnZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIE1vZGVsUGFja2FnZSBtb2RlbFBhY2thZ2U7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBhZGFwdGVyIGZhY3RvcnkuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgcHVibGljIE1vZGVsQWRhcHRlckZhY3RvcnkoKSB7Ci0JCWlmIChtb2RlbFBhY2thZ2UgPT0gbnVsbCkgewotCQkJbW9kZWxQYWNrYWdlID0gTW9kZWxQYWNrYWdlLmVJTlNUQU5DRTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGlzIGZhY3RvcnkgaXMgYXBwbGljYWJsZSBmb3IgdGhlIHR5cGUgb2YgdGhlIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgb2JqZWN0IGlzIGVpdGhlciB0aGUgbW9kZWwncyBwYWNrYWdlIG9yIGlzIGFuIGluc3RhbmNlIG9iamVjdCBvZiB0aGUgbW9kZWwuCi0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoaXMgZmFjdG9yeSBpcyBhcHBsaWNhYmxlIGZvciB0aGUgdHlwZSBvZiB0aGUgb2JqZWN0LgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBAT3ZlcnJpZGUKLQkJCQlwdWJsaWMgYm9vbGVhbiBpc0ZhY3RvcnlGb3JUeXBlKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKG9iamVjdCA9PSBtb2RlbFBhY2thZ2UpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBFT2JqZWN0KSB7Ci0JCQlyZXR1cm4gKChFT2JqZWN0KW9iamVjdCkuZUNsYXNzKCkuZ2V0RVBhY2thZ2UoKSA9PSBtb2RlbFBhY2thZ2U7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFRoZSBzd2l0Y2ggdGhlIGRlbGVnYXRlcyB0byB0aGUgPGNvZGU+Y3JlYXRlWFhYPC9jb2RlPiBtZXRob2RzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIHByb3RlY3RlZCBNb2RlbFN3aXRjaDxBZGFwdGVyPiBtb2RlbFN3aXRjaCA9Ci0JCW5ldyBNb2RlbFN3aXRjaDxBZGFwdGVyPigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEFkYXB0ZXIgY2FzZURpYWdyYW0oRGlhZ3JhbSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlRGlhZ3JhbUFkYXB0ZXIoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEFkYXB0ZXIgY2FzZUxpbmsoTGluayBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlTGlua0FkYXB0ZXIoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEFkYXB0ZXIgY2FzZUxpbmtlZE9iamVjdChMaW5rZWRPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUxpbmtlZE9iamVjdEFkYXB0ZXIoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEFkYXB0ZXIgY2FzZU5hbWVkTm9kZShOYW1lZE5vZGUgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZU5hbWVkTm9kZUFkYXB0ZXIoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEFkYXB0ZXIgY2FzZU5vZGUoTm9kZSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlTm9kZUFkYXB0ZXIoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEFkYXB0ZXIgY2FzZUFjdGl2aXR5RGlhZ3JhbShBY3Rpdml0eURpYWdyYW0gb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUFjdGl2aXR5RGlhZ3JhbUFkYXB0ZXIoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEFkYXB0ZXIgY2FzZVR5cGVkTm9kZShUeXBlZE5vZGUgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVR5cGVkTm9kZUFkYXB0ZXIoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEFkYXB0ZXIgY2FzZVdvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW0oV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbUFkYXB0ZXIoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEFkYXB0ZXIgY2FzZVdvcmtQcm9kdWN0Tm9kZShXb3JrUHJvZHVjdE5vZGUgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVdvcmtQcm9kdWN0Tm9kZUFkYXB0ZXIoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEFkYXB0ZXIgY2FzZUFjdGl2aXR5RGV0YWlsRGlhZ3JhbShBY3Rpdml0eURldGFpbERpYWdyYW0gb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUFjdGl2aXR5RGV0YWlsRGlhZ3JhbUFkYXB0ZXIoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEFkYXB0ZXIgY2FzZU5vZGVDb250YWluZXIoTm9kZUNvbnRhaW5lciBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlTm9kZUNvbnRhaW5lckFkYXB0ZXIoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEFkYXB0ZXIgY2FzZVJvbGVOb2RlKFJvbGVOb2RlIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVSb2xlTm9kZUFkYXB0ZXIoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEFkYXB0ZXIgY2FzZVJvbGVUYXNrQ29tcG9zaXRlKFJvbGVUYXNrQ29tcG9zaXRlIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVSb2xlVGFza0NvbXBvc2l0ZUFkYXB0ZXIoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEFkYXB0ZXIgY2FzZVRhc2tOb2RlKFRhc2tOb2RlIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVUYXNrTm9kZUFkYXB0ZXIoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEFkYXB0ZXIgY2FzZVdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGUoV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZUFkYXB0ZXIoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEFkYXB0ZXIgY2FzZVdvcmtCcmVha2Rvd25FbGVtZW50Tm9kZShXb3JrQnJlYWtkb3duRWxlbWVudE5vZGUgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVdvcmtCcmVha2Rvd25FbGVtZW50Tm9kZUFkYXB0ZXIoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEFkYXB0ZXIgY2FzZVdvcmtQcm9kdWN0Q29tcG9zaXRlKFdvcmtQcm9kdWN0Q29tcG9zaXRlIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVXb3JrUHJvZHVjdENvbXBvc2l0ZUFkYXB0ZXIoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEFkYXB0ZXIgZGVmYXVsdENhc2UoRU9iamVjdCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlRU9iamVjdEFkYXB0ZXIoKTsKLQkJCX0KLQkJfTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gYWRhcHRlciBmb3IgdGhlIDxjb2RlPnRhcmdldDwvY29kZT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdGFyZ2V0IHRoZSBvYmplY3QgdG8gYWRhcHQuCi0JICogQHJldHVybiB0aGUgYWRhcHRlciBmb3IgdGhlIDxjb2RlPnRhcmdldDwvY29kZT4uCi0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIEBPdmVycmlkZQotCQkJCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUFkYXB0ZXIoTm90aWZpZXIgdGFyZ2V0KSB7Ci0JCXJldHVybiBtb2RlbFN3aXRjaC5kb1N3aXRjaCgoRU9iamVjdCl0YXJnZXQpOwotCX0KLQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5EaWFncmFtIDxlbT5EaWFncmFtPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLSAgICAgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkRpYWdyYW0KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgcHVibGljIEFkYXB0ZXIgY3JlYXRlRGlhZ3JhbUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTGluayA8ZW0+TGluazwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0gICAgICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5MaW5rCi0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIHB1YmxpYyBBZGFwdGVyIGNyZWF0ZUxpbmtBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkxpbmtlZE9iamVjdCA8ZW0+TGlua2VkIE9iamVjdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0gICAgICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5MaW5rZWRPYmplY3QKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgcHVibGljIEFkYXB0ZXIgY3JlYXRlTGlua2VkT2JqZWN0QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5OYW1lZE5vZGUgPGVtPk5hbWVkIE5vZGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotICAgICAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTmFtZWROb2RlCi0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIHB1YmxpYyBBZGFwdGVyIGNyZWF0ZU5hbWVkTm9kZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZSA8ZW0+Tm9kZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0gICAgICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlCi0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIHB1YmxpYyBBZGFwdGVyIGNyZWF0ZU5vZGVBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkFjdGl2aXR5RGlhZ3JhbSA8ZW0+QWN0aXZpdHkgRGlhZ3JhbTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0gICAgICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5BY3Rpdml0eURpYWdyYW0KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgcHVibGljIEFkYXB0ZXIgY3JlYXRlQWN0aXZpdHlEaWFncmFtQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5UeXBlZE5vZGUgPGVtPlR5cGVkIE5vZGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotICAgICAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuVHlwZWROb2RlCi0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIHB1YmxpYyBBZGFwdGVyIGNyZWF0ZVR5cGVkTm9kZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbSA8ZW0+V29yayBQcm9kdWN0IERlcGVuZGVuY3kgRGlhZ3JhbTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Xb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVdvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW1BZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLldvcmtQcm9kdWN0Tm9kZSA8ZW0+V29yayBQcm9kdWN0IE5vZGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuV29ya1Byb2R1Y3ROb2RlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVdvcmtQcm9kdWN0Tm9kZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuQWN0aXZpdHlEZXRhaWxEaWFncmFtIDxlbT5BY3Rpdml0eSBEZXRhaWwgRGlhZ3JhbTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5BY3Rpdml0eURldGFpbERpYWdyYW0KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQWN0aXZpdHlEZXRhaWxEaWFncmFtQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlQ29udGFpbmVyIDxlbT5Ob2RlIENvbnRhaW5lcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlQ29udGFpbmVyCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZU5vZGVDb250YWluZXJBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLlJvbGVOb2RlIDxlbT5Sb2xlIE5vZGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuUm9sZU5vZGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUm9sZU5vZGVBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLlJvbGVUYXNrQ29tcG9zaXRlIDxlbT5Sb2xlIFRhc2sgQ29tcG9zaXRlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLlJvbGVUYXNrQ29tcG9zaXRlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVJvbGVUYXNrQ29tcG9zaXRlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5UYXNrTm9kZSA8ZW0+VGFzayBOb2RlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLlRhc2tOb2RlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVRhc2tOb2RlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Xb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlIDxlbT5Xb3JrIFByb2R1Y3QgRGVzY3JpcHRvciBOb2RlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLldvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuV29ya0JyZWFrZG93bkVsZW1lbnROb2RlIDxlbT5Xb3JrIEJyZWFrZG93biBFbGVtZW50IE5vZGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuV29ya0JyZWFrZG93bkVsZW1lbnROb2RlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVdvcmtCcmVha2Rvd25FbGVtZW50Tm9kZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuV29ya1Byb2R1Y3RDb21wb3NpdGUgPGVtPldvcmsgUHJvZHVjdCBDb21wb3NpdGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuV29ya1Byb2R1Y3RDb21wb3NpdGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlV29ya1Byb2R1Y3RDb21wb3NpdGVBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIHRoZSBkZWZhdWx0IGNhc2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsLgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBwdWJsaWMgQWRhcHRlciBjcmVhdGVFT2JqZWN0QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19IC8vTW9kZWxBZGFwdGVyRmFjdG9yeQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL3V0aWwvTW9kZWxTd2l0Y2guamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC91dGlsL01vZGVsU3dpdGNoLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyZTg4Y2QuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL3V0aWwvTW9kZWxTd2l0Y2guamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzMyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5BY3Rpdml0eURldGFpbERpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuQWN0aXZpdHlEaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkRpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5MaW5rZWRPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTW9kZWxQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5hbWVkTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGVDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuUm9sZU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuUm9sZVRhc2tDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuVGFza05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuVHlwZWROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLldvcmtCcmVha2Rvd25FbGVtZW50Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Xb3JrUHJvZHVjdENvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Xb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLldvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuV29ya1Byb2R1Y3ROb2RlOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIFRoZSA8Yj5Td2l0Y2g8L2I+IGZvciB0aGUgbW9kZWwncyBpbmhlcml0YW5jZSBoaWVyYXJjaHkuCi0gKiBJdCBzdXBwb3J0cyB0aGUgY2FsbCB7QGxpbmsgI2RvU3dpdGNoKEVPYmplY3QpIGRvU3dpdGNoKG9iamVjdCl9Ci0gKiB0byBpbnZva2UgdGhlIDxjb2RlPmNhc2VYWFg8L2NvZGU+IG1ldGhvZCBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwsCi0gKiBzdGFydGluZyB3aXRoIHRoZSBhY3R1YWwgY2xhc3Mgb2YgdGhlIG9iamVjdAotICogYW5kIHByb2NlZWRpbmcgdXAgdGhlIGluaGVyaXRhbmNlIGhpZXJhcmNoeQotICogdW50aWwgYSBub24tbnVsbCByZXN1bHQgaXMgcmV0dXJuZWQsCi0gKiB3aGljaCBpcyB0aGUgcmVzdWx0IG9mIHRoZSBzd2l0Y2guCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTW9kZWxQYWNrYWdlCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBNb2RlbFN3aXRjaDxUPiB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCBtb2RlbCBwYWNrYWdlCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBNb2RlbFBhY2thZ2UgbW9kZWxQYWNrYWdlOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgc3dpdGNoLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIHB1YmxpYyBNb2RlbFN3aXRjaCgpIHsKLQkJaWYgKG1vZGVsUGFja2FnZSA9PSBudWxsKSB7Ci0JCQltb2RlbFBhY2thZ2UgPSBNb2RlbFBhY2thZ2UuZUlOU1RBTkNFOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ2FsbHMgPGNvZGU+Y2FzZVhYWDwvY29kZT4gZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsIHVudGlsIG9uZSByZXR1cm5zIGEgbm9uIG51bGwgcmVzdWx0OyBpdCB5aWVsZHMgdGhhdCByZXN1bHQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBmaXJzdCBub24tbnVsbCByZXN1bHQgcmV0dXJuZWQgYnkgYSA8Y29kZT5jYXNlWFhYPC9jb2RlPiBjYWxsLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBwdWJsaWMgVCBkb1N3aXRjaChFT2JqZWN0IHRoZUVPYmplY3QpIHsKLQkJcmV0dXJuIGRvU3dpdGNoKHRoZUVPYmplY3QuZUNsYXNzKCksIHRoZUVPYmplY3QpOwotCX0KLQotCS8qKgotCSAqIENhbGxzIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbCB1bnRpbCBvbmUgcmV0dXJucyBhIG5vbiBudWxsIHJlc3VsdDsgaXQgeWllbGRzIHRoYXQgcmVzdWx0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgZmlyc3Qgbm9uLW51bGwgcmVzdWx0IHJldHVybmVkIGJ5IGEgPGNvZGU+Y2FzZVhYWDwvY29kZT4gY2FsbC4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgcHJvdGVjdGVkIFQgZG9Td2l0Y2goRUNsYXNzIHRoZUVDbGFzcywgRU9iamVjdCB0aGVFT2JqZWN0KSB7Ci0JCWlmICh0aGVFQ2xhc3MuZUNvbnRhaW5lcigpID09IG1vZGVsUGFja2FnZSkgewotCQkJcmV0dXJuIGRvU3dpdGNoKHRoZUVDbGFzcy5nZXRDbGFzc2lmaWVySUQoKSwgdGhlRU9iamVjdCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlMaXN0PEVDbGFzcz4gZVN1cGVyVHlwZXMgPSB0aGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKTsKLQkJCXJldHVybgotCQkJCWVTdXBlclR5cGVzLmlzRW1wdHkoKSA/Ci0JCQkJCWRlZmF1bHRDYXNlKHRoZUVPYmplY3QpIDoKLQkJCQkJZG9Td2l0Y2goZVN1cGVyVHlwZXMuZ2V0KDApLCB0aGVFT2JqZWN0KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENhbGxzIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbCB1bnRpbCBvbmUgcmV0dXJucyBhIG5vbiBudWxsIHJlc3VsdDsgaXQgeWllbGRzIHRoYXQgcmVzdWx0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgZmlyc3Qgbm9uLW51bGwgcmVzdWx0IHJldHVybmVkIGJ5IGEgPGNvZGU+Y2FzZVhYWDwvY29kZT4gY2FsbC4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgcHJvdGVjdGVkIFQgZG9Td2l0Y2goaW50IGNsYXNzaWZpZXJJRCwgRU9iamVjdCB0aGVFT2JqZWN0KSB7Ci0JCXN3aXRjaCAoY2xhc3NpZmllcklEKSB7Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5ESUFHUkFNOiB7Ci0JCQkJRGlhZ3JhbSBkaWFncmFtID0gKERpYWdyYW0pdGhlRU9iamVjdDsKLQkJCQlUIHJlc3VsdCA9IGNhc2VEaWFncmFtKGRpYWdyYW0pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5vZGVDb250YWluZXIoZGlhZ3JhbSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTm9kZShkaWFncmFtKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VMaW5rZWRPYmplY3QoZGlhZ3JhbSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBNb2RlbFBhY2thZ2UuTElOSzogewotCQkJCUxpbmsgbGluayA9IChMaW5rKXRoZUVPYmplY3Q7Ci0JCQkJVCByZXN1bHQgPSBjYXNlTGluayhsaW5rKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VMaW5rZWRPYmplY3QobGluayk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBNb2RlbFBhY2thZ2UuTElOS0VEX09CSkVDVDogewotCQkJCUxpbmtlZE9iamVjdCBsaW5rZWRPYmplY3QgPSAoTGlua2VkT2JqZWN0KXRoZUVPYmplY3Q7Ci0JCQkJVCByZXN1bHQgPSBjYXNlTGlua2VkT2JqZWN0KGxpbmtlZE9iamVjdCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBNb2RlbFBhY2thZ2UuTkFNRURfTk9ERTogewotCQkJCU5hbWVkTm9kZSBuYW1lZE5vZGUgPSAoTmFtZWROb2RlKXRoZUVPYmplY3Q7Ci0JCQkJVCByZXN1bHQgPSBjYXNlTmFtZWROb2RlKG5hbWVkTm9kZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTm9kZShuYW1lZE5vZGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUxpbmtlZE9iamVjdChuYW1lZE5vZGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgTW9kZWxQYWNrYWdlLk5PREU6IHsKLQkJCQlOb2RlIG5vZGUgPSAoTm9kZSl0aGVFT2JqZWN0OwotCQkJCVQgcmVzdWx0ID0gY2FzZU5vZGUobm9kZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTGlua2VkT2JqZWN0KG5vZGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgTW9kZWxQYWNrYWdlLkFDVElWSVRZX0RJQUdSQU06IHsKLQkJCQlBY3Rpdml0eURpYWdyYW0gYWN0aXZpdHlEaWFncmFtID0gKEFjdGl2aXR5RGlhZ3JhbSl0aGVFT2JqZWN0OwotCQkJCVQgcmVzdWx0ID0gY2FzZUFjdGl2aXR5RGlhZ3JhbShhY3Rpdml0eURpYWdyYW0pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZURpYWdyYW0oYWN0aXZpdHlEaWFncmFtKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VOb2RlQ29udGFpbmVyKGFjdGl2aXR5RGlhZ3JhbSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTm9kZShhY3Rpdml0eURpYWdyYW0pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUxpbmtlZE9iamVjdChhY3Rpdml0eURpYWdyYW0pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgTW9kZWxQYWNrYWdlLlRZUEVEX05PREU6IHsKLQkJCQlUeXBlZE5vZGUgdHlwZWROb2RlID0gKFR5cGVkTm9kZSl0aGVFT2JqZWN0OwotCQkJCVQgcmVzdWx0ID0gY2FzZVR5cGVkTm9kZSh0eXBlZE5vZGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5vZGUodHlwZWROb2RlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VMaW5rZWRPYmplY3QodHlwZWROb2RlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5XT1JLX1BST0RVQ1RfREVQRU5ERU5DWV9ESUFHUkFNOiB7Ci0JCQkJV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbSB3b3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtID0gKFdvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW0pdGhlRU9iamVjdDsKLQkJCQlUIHJlc3VsdCA9IGNhc2VXb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtKHdvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW0pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZURpYWdyYW0od29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTm9kZUNvbnRhaW5lcih3b3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VOb2RlKHdvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW0pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUxpbmtlZE9iamVjdCh3b3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5XT1JLX1BST0RVQ1RfTk9ERTogewotCQkJCVdvcmtQcm9kdWN0Tm9kZSB3b3JrUHJvZHVjdE5vZGUgPSAoV29ya1Byb2R1Y3ROb2RlKXRoZUVPYmplY3Q7Ci0JCQkJVCByZXN1bHQgPSBjYXNlV29ya1Byb2R1Y3ROb2RlKHdvcmtQcm9kdWN0Tm9kZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTmFtZWROb2RlKHdvcmtQcm9kdWN0Tm9kZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTm9kZSh3b3JrUHJvZHVjdE5vZGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUxpbmtlZE9iamVjdCh3b3JrUHJvZHVjdE5vZGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgTW9kZWxQYWNrYWdlLkFDVElWSVRZX0RFVEFJTF9ESUFHUkFNOiB7Ci0JCQkJQWN0aXZpdHlEZXRhaWxEaWFncmFtIGFjdGl2aXR5RGV0YWlsRGlhZ3JhbSA9IChBY3Rpdml0eURldGFpbERpYWdyYW0pdGhlRU9iamVjdDsKLQkJCQlUIHJlc3VsdCA9IGNhc2VBY3Rpdml0eURldGFpbERpYWdyYW0oYWN0aXZpdHlEZXRhaWxEaWFncmFtKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VEaWFncmFtKGFjdGl2aXR5RGV0YWlsRGlhZ3JhbSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTm9kZUNvbnRhaW5lcihhY3Rpdml0eURldGFpbERpYWdyYW0pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5vZGUoYWN0aXZpdHlEZXRhaWxEaWFncmFtKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VMaW5rZWRPYmplY3QoYWN0aXZpdHlEZXRhaWxEaWFncmFtKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5OT0RFX0NPTlRBSU5FUjogewotCQkJCU5vZGVDb250YWluZXIgbm9kZUNvbnRhaW5lciA9IChOb2RlQ29udGFpbmVyKXRoZUVPYmplY3Q7Ci0JCQkJVCByZXN1bHQgPSBjYXNlTm9kZUNvbnRhaW5lcihub2RlQ29udGFpbmVyKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VOb2RlKG5vZGVDb250YWluZXIpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUxpbmtlZE9iamVjdChub2RlQ29udGFpbmVyKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5ST0xFX05PREU6IHsKLQkJCQlSb2xlTm9kZSByb2xlTm9kZSA9IChSb2xlTm9kZSl0aGVFT2JqZWN0OwotCQkJCVQgcmVzdWx0ID0gY2FzZVJvbGVOb2RlKHJvbGVOb2RlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VOYW1lZE5vZGUocm9sZU5vZGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5vZGUocm9sZU5vZGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUxpbmtlZE9iamVjdChyb2xlTm9kZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBNb2RlbFBhY2thZ2UuUk9MRV9UQVNLX0NPTVBPU0lURTogewotCQkJCVJvbGVUYXNrQ29tcG9zaXRlIHJvbGVUYXNrQ29tcG9zaXRlID0gKFJvbGVUYXNrQ29tcG9zaXRlKXRoZUVPYmplY3Q7Ci0JCQkJVCByZXN1bHQgPSBjYXNlUm9sZVRhc2tDb21wb3NpdGUocm9sZVRhc2tDb21wb3NpdGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5vZGVDb250YWluZXIocm9sZVRhc2tDb21wb3NpdGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5vZGUocm9sZVRhc2tDb21wb3NpdGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUxpbmtlZE9iamVjdChyb2xlVGFza0NvbXBvc2l0ZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBNb2RlbFBhY2thZ2UuVEFTS19OT0RFOiB7Ci0JCQkJVGFza05vZGUgdGFza05vZGUgPSAoVGFza05vZGUpdGhlRU9iamVjdDsKLQkJCQlUIHJlc3VsdCA9IGNhc2VUYXNrTm9kZSh0YXNrTm9kZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTmFtZWROb2RlKHRhc2tOb2RlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VOb2RlKHRhc2tOb2RlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VMaW5rZWRPYmplY3QodGFza05vZGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgTW9kZWxQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX05PREU6IHsKLQkJCQlXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlIHdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGUgPSAoV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZSl0aGVFT2JqZWN0OwotCQkJCVQgcmVzdWx0ID0gY2FzZVdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGUod29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTmFtZWROb2RlKHdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5vZGUod29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTGlua2VkT2JqZWN0KHdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgTW9kZWxQYWNrYWdlLldPUktfQlJFQUtET1dOX0VMRU1FTlRfTk9ERTogewotCQkJCVdvcmtCcmVha2Rvd25FbGVtZW50Tm9kZSB3b3JrQnJlYWtkb3duRWxlbWVudE5vZGUgPSAoV29ya0JyZWFrZG93bkVsZW1lbnROb2RlKXRoZUVPYmplY3Q7Ci0JCQkJVCByZXN1bHQgPSBjYXNlV29ya0JyZWFrZG93bkVsZW1lbnROb2RlKHdvcmtCcmVha2Rvd25FbGVtZW50Tm9kZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTmFtZWROb2RlKHdvcmtCcmVha2Rvd25FbGVtZW50Tm9kZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTm9kZSh3b3JrQnJlYWtkb3duRWxlbWVudE5vZGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUxpbmtlZE9iamVjdCh3b3JrQnJlYWtkb3duRWxlbWVudE5vZGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgTW9kZWxQYWNrYWdlLldPUktfUFJPRFVDVF9DT01QT1NJVEU6IHsKLQkJCQlXb3JrUHJvZHVjdENvbXBvc2l0ZSB3b3JrUHJvZHVjdENvbXBvc2l0ZSA9IChXb3JrUHJvZHVjdENvbXBvc2l0ZSl0aGVFT2JqZWN0OwotCQkJCVQgcmVzdWx0ID0gY2FzZVdvcmtQcm9kdWN0Q29tcG9zaXRlKHdvcmtQcm9kdWN0Q29tcG9zaXRlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VOb2RlQ29udGFpbmVyKHdvcmtQcm9kdWN0Q29tcG9zaXRlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VOb2RlKHdvcmtQcm9kdWN0Q29tcG9zaXRlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VMaW5rZWRPYmplY3Qod29ya1Byb2R1Y3RDb21wb3NpdGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWRlZmF1bHQ6IHJldHVybiBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkRpYWdyYW08L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLSAgICAgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5EaWFncmFtPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBwdWJsaWMgVCBjYXNlRGlhZ3JhbShEaWFncmFtIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5MaW5rPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0gICAgICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TGluazwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgcHVibGljIFQgY2FzZUxpbmsoTGluayBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TGlua2VkIE9iamVjdDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotICAgICAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkxpbmtlZCBPYmplY3Q8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIHB1YmxpYyBUIGNhc2VMaW5rZWRPYmplY3QoTGlua2VkT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5OYW1lZCBOb2RlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0gICAgICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TmFtZWQgTm9kZTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgcHVibGljIFQgY2FzZU5hbWVkTm9kZShOYW1lZE5vZGUgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk5vZGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLSAgICAgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Ob2RlPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBwdWJsaWMgVCBjYXNlTm9kZShOb2RlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5BY3Rpdml0eSBEaWFncmFtPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0gICAgICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+QWN0aXZpdHkgRGlhZ3JhbTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgcHVibGljIFQgY2FzZUFjdGl2aXR5RGlhZ3JhbShBY3Rpdml0eURpYWdyYW0gb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlR5cGVkIE5vZGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLSAgICAgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5UeXBlZCBOb2RlPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBwdWJsaWMgVCBjYXNlVHlwZWROb2RlKFR5cGVkTm9kZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+V29yayBQcm9kdWN0IERlcGVuZGVuY3kgRGlhZ3JhbTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPldvcmsgUHJvZHVjdCBEZXBlbmRlbmN5IERpYWdyYW08L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VXb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtKFdvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW0gb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPldvcmsgUHJvZHVjdCBOb2RlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+V29yayBQcm9kdWN0IE5vZGU8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VXb3JrUHJvZHVjdE5vZGUoV29ya1Byb2R1Y3ROb2RlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5BY3Rpdml0eSBEZXRhaWwgRGlhZ3JhbTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkFjdGl2aXR5IERldGFpbCBEaWFncmFtPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlQWN0aXZpdHlEZXRhaWxEaWFncmFtKEFjdGl2aXR5RGV0YWlsRGlhZ3JhbSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Tm9kZSBDb250YWluZXI8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Ob2RlIENvbnRhaW5lcjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZU5vZGVDb250YWluZXIoTm9kZUNvbnRhaW5lciBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Um9sZSBOb2RlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Um9sZSBOb2RlPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlUm9sZU5vZGUoUm9sZU5vZGUgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlJvbGUgVGFzayBDb21wb3NpdGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Sb2xlIFRhc2sgQ29tcG9zaXRlPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlUm9sZVRhc2tDb21wb3NpdGUoUm9sZVRhc2tDb21wb3NpdGUgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlRhc2sgTm9kZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlRhc2sgTm9kZTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZVRhc2tOb2RlKFRhc2tOb2RlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Xb3JrIFByb2R1Y3QgRGVzY3JpcHRvciBOb2RlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+V29yayBQcm9kdWN0IERlc2NyaXB0b3IgTm9kZTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZVdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGUoV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+V29yayBCcmVha2Rvd24gRWxlbWVudCBOb2RlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+V29yayBCcmVha2Rvd24gRWxlbWVudCBOb2RlPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlV29ya0JyZWFrZG93bkVsZW1lbnROb2RlKFdvcmtCcmVha2Rvd25FbGVtZW50Tm9kZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+V29yayBQcm9kdWN0IENvbXBvc2l0ZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPldvcmsgUHJvZHVjdCBDb21wb3NpdGU8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VXb3JrUHJvZHVjdENvbXBvc2l0ZShXb3JrUHJvZHVjdENvbXBvc2l0ZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RU9iamVjdDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotICAgICAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLCBidXQgdGhpcyBpcyB0aGUgbGFzdCBjYXNlIGFueXdheS4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FT2JqZWN0PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBwdWJsaWMgVCBkZWZhdWx0Q2FzZShFT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0gLy9Nb2RlbFN3aXRjaApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL3V0aWwvVHhVdGlsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvdXRpbC9UeFV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTAyOWE5NS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvdXRpbC9UeFV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy9Db3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vL0FsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vL3doaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vL2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy9Db250cmlidXRvcnM6Ci0vL0lCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uVHJhbnNhY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi51dGlsLlRyYW5zYWN0aW9uVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYud29ya3NwYWNlLkFic3RyYWN0RU1GT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24uQ29tbW9uUGx1Z2luOwotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4yCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBUeFV0aWwgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBNYXAgREVGQVVMVF9UWF9PUFRJT05TID0gbmV3IEhhc2hNYXAoKTsKLQkKLQlzdGF0aWMgewotCQlUeFV0aWwuREVGQVVMVF9UWF9PUFRJT05TLnB1dChUcmFuc2FjdGlvbi5PUFRJT05fVU5QUk9URUNURUQsIEJvb2xlYW4uVFJVRSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBmaW5hbCB2b2lkIHJ1bkluVHJhbnNhY3Rpb24oRU9iamVjdCBvYmplY3RUb01vZGlmeSwKLQkJCVJ1bm5hYmxlIG1vZGlmeU9wZXJhdGlvbikgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCVRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIGRvbWFpbiA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlkb21haW4gPSBUcmFuc2FjdGlvblV0aWwuZ2V0RWRpdGluZ0RvbWFpbihvYmplY3RUb01vZGlmeSk7Ci0JCX0KLQkJY2F0Y2goRXhjZXB0aW9uIGUpIHsKLQkJCUNvbW1vblBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCX0KLQkJCQkKLQkJaWYgKGRvbWFpbiA9PSBudWxsKSB7Ci0JCQltb2RpZnlPcGVyYXRpb24ucnVuKCk7Ci0JCX0gZWxzZSB7Ci0JCQlydW5JblRyYW5zYWN0aW9uKGRvbWFpbiwgbW9kaWZ5T3BlcmF0aW9uKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIHZvaWQgcnVuSW5UcmFuc2FjdGlvbihUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiBkb21haW4sCi0JCQlmaW5hbCBSdW5uYWJsZSBtb2RpZnlPcGVyYXRpb24pIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCQluZXcgQWJzdHJhY3RFTUZPcGVyYXRpb24oZG9tYWluLCAiIiwgREVGQVVMVF9UWF9PUFRJT05TKSB7IC8vJE5PTi1OTFMtMSQKLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgSVN0YXR1cyBkb0V4ZWN1dGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLAotCQkJCQlJQWRhcHRhYmxlIGluZm8pIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCQkJCW1vZGlmeU9wZXJhdGlvbi5ydW4oKTsKLQkJCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQkJCX0KLQotCQl9LmV4ZWN1dGUobmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSwgbnVsbCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL3V0aWwvcGFja2FnZS5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL3V0aWwvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMTdjOGE3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC91dGlsL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIGltcGxlbWVudGF0aW9uIHN1cHBvcnQgZm9yIGFjY2Vzc2luZyB0aGUgYWN0aXZpdHkgZGlhZ3JhbSBtb2RlbCBvYmplY3RzLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLnVpLy5jbGFzc3BhdGggYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS51aS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTFjOGYyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLnVpLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS51aS8ucHJvamVjdCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLnVpLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MWQxZTNmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLnVpLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0udWk8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0udWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS51aS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTkwODA1Zi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS51aS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS51aQotQnVuZGxlLVZlcnNpb246IDEuNS4wLnF1YWxpZmllcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0udWkuRGlhZ3JhbVVJUGx1Z2luCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS51aSwKLSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUsCi0gb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnksCi0gb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZTt2aXNpYmlsaXR5Oj1yZWV4cG9ydCwKLSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQsCi0gb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZCwKLSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZDt2aXNpYmlsaXR5Oj1yZWV4cG9ydCwKLSBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmFjdGlvbnM7dmlzaWJpbGl0eTo9cmVleHBvcnQsCi0gb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aQotRWNsaXBzZS1MYXp5U3RhcnQ6IHRydWUKLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS51aSwKLSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS51aS5zZXJ2aWNlLAotIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLnVpLnZpZXdlcgotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS51aS9idWlsZC5wcm9wZXJ0aWVzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0udWkvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzBiMmZjNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS51aS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1zb3VyY2UuLiA9IHNyYy8KLW91dHB1dC4uID0gYmluLwotYmluLmluY2x1ZGVzID0gTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIC4sXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0udWkvcGx1Z2luLnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS51aS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDFhMDU0ZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS51aS9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSCi0KLSMgUGx1Zy1pbgotcGx1Z2luTmFtZT1FUEYgRGlhZ3JhbSBVSQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCi0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0udWkvcGx1Z2luLnhtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLnVpL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzY2E5M2MuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0udWkvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjIiPz4KLTxwbHVnaW4+Ci0KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0udWkvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3VpL0RpYWdyYW1VSVBsdWdpbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0udWkvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3VpL0RpYWdyYW1VSVBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZTJmYWJlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS91aS9EaWFncmFtVUlQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS5BYnN0cmFjdFBsdWdpbjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotLyoqCi0gKiBUaGUgYWN0aXZhdG9yIGNsYXNzIGNvbnRyb2xzIHRoZSBwbHVnLWluIGxpZmUgY3ljbGUKLSAqLwotcHVibGljIGNsYXNzIERpYWdyYW1VSVBsdWdpbiBleHRlbmRzIEFic3RyYWN0UGx1Z2luIHsKLQotCS8vIFRoZSBwbHVnLWluIElECi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLnVpIjsgIC8vJE5PTi1OTFMtMSQKLQotCS8vIFRoZSBzaGFyZWQgaW5zdGFuY2UKLQlwcml2YXRlIHN0YXRpYyBEaWFncmFtVUlQbHVnaW4gcGx1Z2luOwotCQotCS8qKgotCSAqIFRoZSBjb25zdHJ1Y3RvcgotCSAqLwotCXB1YmxpYyBEaWFncmFtVUlQbHVnaW4oKSB7Ci0JCXBsdWdpbiA9IHRoaXM7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbiNzdGFydChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdGFydChjb250ZXh0KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luI3N0b3Aob3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQpCi0JICovCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlwbHVnaW4gPSBudWxsOwotCQlzdXBlci5zdG9wKGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNoYXJlZCBpbnN0YW5jZQotCSAqCi0JICogQHJldHVybiB0aGUgc2hhcmVkIGluc3RhbmNlCi0JICovCi0JcHVibGljIHN0YXRpYyBEaWFncmFtVUlQbHVnaW4gZ2V0RGVmYXVsdCgpIHsKLQkJcmV0dXJuIHBsdWdpbjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS91aS9hY3Rpb25zL0N1c3RvbUFycmFuZ2VBY3Rpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS91aS9hY3Rpb25zL0N1c3RvbUFycmFuZ2VBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTJlZmRjZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vdWkvYWN0aW9ucy9DdXN0b21BcnJhbmdlQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKioKLSAqIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLnVpLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5HcmFwaGljYWxWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5hY3Rpb25zLmludGVybmFsLkFycmFuZ2VBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuRGlhZ3JhbUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucGFydHMuRGlhZ3JhbUNvbW1hbmRTdGFjazsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnBhcnRzLklEaWFncmFtRWRpdERvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLQotLyoqCi0gKiBAYXV0aG9yIHNrYW5ub29yCi0gKgotICovCi1wdWJsaWMgY2xhc3MgQ3VzdG9tQXJyYW5nZUFjdGlvbiBleHRlbmRzIEFycmFuZ2VBY3Rpb24gewotCi0JCi0JcHJpdmF0ZSBEaWFncmFtRWRpdFBhcnQgZGlhZ3JhbUVkaXRQYXJ0OwotCXByaXZhdGUgR3JhcGhpY2FsVmlld2VyIHZpZXdlcjsKLQotCS8qKgotCSAqIEBwYXJhbSB3b3JrYmVuY2hQYWdlCi0JICogQHBhcmFtIHNlbGVjdGlvbk9ubHkKLQkgKi8KLQlwdWJsaWMgQ3VzdG9tQXJyYW5nZUFjdGlvbihJV29ya2JlbmNoUGFnZSB3b3JrYmVuY2hQYWdlLAotCQkJYm9vbGVhbiBzZWxlY3Rpb25Pbmx5LCBEaWFncmFtRWRpdFBhcnQgZGlhZ3JhbUVkaXRQYXJ0LCBHcmFwaGljYWxWaWV3ZXIgdmlld2VyKSB7Ci0JCXN1cGVyKHdvcmtiZW5jaFBhZ2UsIHNlbGVjdGlvbk9ubHkpOwotCQl0aGlzLmRpYWdyYW1FZGl0UGFydCA9IGRpYWdyYW1FZGl0UGFydDsKLQkJdGhpcy52aWV3ZXIgPSB2aWV3ZXI7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY29uc3RydWN0b3Igc3R1YgotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBMaXN0IGdldFNlbGVjdGVkT2JqZWN0cygpIHsKLQkJcmV0dXJuIGRpYWdyYW1FZGl0UGFydC5nZXRDaGlsZHJlbigpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRGlhZ3JhbUVkaXRQYXJ0IGdldERpYWdyYW1FZGl0UGFydCgpIHsKLQkJcmV0dXJuIGRpYWdyYW1FZGl0UGFydDsKLQl9Ci0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIERpYWdyYW1Db21tYW5kU3RhY2sgZ2V0RGlhZ3JhbUNvbW1hbmRTdGFjaygpIHsKLQkJcmV0dXJuIG5ldyBEaWFncmFtQ29tbWFuZFN0YWNrKChJRGlhZ3JhbUVkaXREb21haW4pdmlld2VyLmdldEVkaXREb21haW4oKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0udWkvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3VpL3NlcnZpY2UvRGlhZ3JhbUVkaXRvckhlbHBlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0udWkvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3VpL3NlcnZpY2UvRGlhZ3JhbUVkaXRvckhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMzcyNGZhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS91aS9zZXJ2aWNlL0RpYWdyYW1FZGl0b3JIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS51aS5zZXJ2aWNlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnBhcnQuQWN0aXZpdHlEaWFncmFtRWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5wYXJ0LkFERGlhZ3JhbUVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQucGFydC5BY3Rpdml0eURldGFpbERpYWdyYW1FZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5wYXJ0LkFic3RyYWN0RGlhZ3JhbUVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnBhcnQuRGlhZ3JhbUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUucGFydC5EaWFncmFtRWRpdG9ySW5wdXRQcm94eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnBhcnQudXRpbC5EaWFncmFtRWRpdG9yVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnNlcnZpY2VzLkRpYWdyYW1IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5zZXJ2aWNlcy5EaWFncmFtTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS51aS5EaWFncmFtVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5wYXJ0LldQRERpYWdyYW1FZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JQ29tbWFuZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuRGlhZ3JhbU9wdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLklEaWFncmFtTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuUHJvY2Vzc1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlN1cHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5wcmVmZXJlbmNlcy5QcmVmZXJlbmNlc0hpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLQotLyoqCi0gKiBIZWxwZXIgY2xhc3MgZm9yIGRpYWdyYW0gZWRpdG9yLgotICogCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4yCi0gKi8KLXB1YmxpYyBjbGFzcyBEaWFncmFtRWRpdG9ySGVscGVyIHsKLQlwcml2YXRlIE1hcDxQcm9jZXNzLCBEaWFncmFtTWFuYWdlcj4gcHJvY2Vzc1RvRGlhZ3JhbU1hbmFnZXJNYXAgPSBuZXcgSGFzaE1hcDxQcm9jZXNzLCBEaWFncmFtTWFuYWdlcj4oKTsKLQkKLQlwdWJsaWMgRGlhZ3JhbUVkaXRvckhlbHBlcigpIHsKLQl9Ci0JCi0JcHVibGljIERpYWdyYW1NYW5hZ2VyIGdldERpYWdyYW1NYW5hZ2VyKFByb2Nlc3MgcHJvYykgewotCQlEaWFncmFtTWFuYWdlciBtZ3IgPSBwcm9jZXNzVG9EaWFncmFtTWFuYWdlck1hcC5nZXQocHJvYyk7Ci0JCWlmKG1nciAhPSBudWxsICYmIG1nci5pc0Rpc3Bvc2VkKCkpIHsKLQkJCXByb2Nlc3NUb0RpYWdyYW1NYW5hZ2VyTWFwLnJlbW92ZShwcm9jKTsKLQkJCW1nciA9IG51bGw7Ci0JCX0KLQkJaWYobWdyID09IG51bGwpIHsKLQkJCXN5bmNocm9uaXplZCAocHJvY2Vzc1RvRGlhZ3JhbU1hbmFnZXJNYXApIHsKLQkJCQltZ3IgPSBwcm9jZXNzVG9EaWFncmFtTWFuYWdlck1hcC5nZXQocHJvYyk7Ci0JCQkJaWYobWdyID09IG51bGwpIHsKLQkJCQkJbWdyID0gRGlhZ3JhbU1hbmFnZXIuZ2V0SW5zdGFuY2UocHJvYywgdGhpcyk7Ci0JCQkJCXByb2Nlc3NUb0RpYWdyYW1NYW5hZ2VyTWFwLnB1dChwcm9jLCBtZ3IpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbWdyOwotCX0JCi0JCi0JcHVibGljIHZvaWQgb3BlbkRpYWdyYW0oSUVkaXRvclBhcnQgcGFydCwgaW50IGRpYWdyYW1UeXBlLCBPYmplY3Qgc2VsZWN0ZWRPYmplY3QsIFN1cHByZXNzaW9uIHN1cHByZXNzaW9uKSB7Ci0JCXRyeSB7Ci0JCQlEaWFncmFtRWRpdG9ySW5wdXQgaW5wdXQgPSBuZXcgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5wYXJ0LkRpYWdyYW1FZGl0b3JJbnB1dCgKLQkJCQkJc2VsZWN0ZWRPYmplY3QsIHN1cHByZXNzaW9uLCBkaWFncmFtVHlwZSk7Ci0JCQlEaWFncmFtRWRpdG9yVXRpbC5vcGVuRGlhZ3JhbUVkaXRvcihwYXJ0LmdldFNpdGUoKS5nZXRQYWdlKCksIGlucHV0LCBnZXREaWFncmFtUHJlZmVyZW5jZXNIaW50KGRpYWdyYW1UeXBlKSwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7CQkJCQkKLQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCQlEaWFncmFtVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQl9Ci0JfQotCQotCXB1YmxpYyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5EaWFncmFtIGdldERpYWdyYW0oQWN0aXZpdHkgYWN0aXZpdHksIGludCB0eXBlKSB7Ci0JCW9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkRpYWdyYW0gZGlhZ3JhbSA9IG51bGw7Ci0JCURpYWdyYW1NYW5hZ2VyIGRNZ3IgPSBnZXREaWFncmFtTWFuYWdlcihUbmdVdGlsLmdldE93bmluZ1Byb2Nlc3MoYWN0aXZpdHkpKTsKLQkJaWYgKGRNZ3IgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlMaXN0PERpYWdyYW0+IGxpc3QgPSBkTWdyLmdldERpYWdyYW1zKGFjdGl2aXR5LCB0eXBlKTsKLQkJCQlpZiAoIWxpc3QuaXNFbXB0eSgpKSB7Ci0JCQkJCWRpYWdyYW0gPSAob3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRGlhZ3JhbSkgbGlzdC5nZXQoMCk7Ci0JCQkJfQotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlEaWFncmFtVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKAotCQkJCQkJIkNvcmUgZXJyb3IgcmV0cmlldmluZyBhIGRpYWdyYW0gaW4gcHJvY2VzcyBlZGl0b3I6IiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0gCi0JCX0KLQkJcmV0dXJuIGRpYWdyYW07Ci0JfQotCQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBhY3QKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0RGlhZ3JhbXMoQWN0aXZpdHkgYWN0KSB7Ci0KLQkJRGlhZ3JhbU1hbmFnZXIgbWdyID0gZ2V0RGlhZ3JhbU1hbmFnZXIoVG5nVXRpbC5nZXRPd25pbmdQcm9jZXNzKGFjdCkpOwotCQl0cnl7Ci0JCQlBcnJheUxpc3Q8RGlhZ3JhbT4gZGlhZ3JhbXMgPSBuZXcgQXJyYXlMaXN0PERpYWdyYW0+KCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IERpYWdyYW1IZWxwZXIuRElBR1JBTV9UWVBFUy5sZW5ndGg7IGkrKykgewotCQkJCUxpc3Q8RGlhZ3JhbT4gbGlzdCA9IG1nci5nZXREaWFncmFtcyhhY3QsIERpYWdyYW1IZWxwZXIuRElBR1JBTV9UWVBFU1tpXSk7Ci0JCQkJaWYgKCFsaXN0LmlzRW1wdHkoKSkgewotCQkJCQlkaWFncmFtcy5hZGRBbGwobGlzdCk7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIGRpYWdyYW1zOwotCQl9Y2F0Y2goRXhjZXB0aW9uIGUpewotCQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpewotCQlmb3IgKERpYWdyYW1NYW5hZ2VyIG1nciA6IHByb2Nlc3NUb0RpYWdyYW1NYW5hZ2VyTWFwLnZhbHVlcygpKSB7Ci0JCQl0cnkgewotCQkJCW1nci5yZW1vdmVDb25zdW1lcih0aGlzKTsKLQkJCX0KLQkJCWNhdGNoKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8KLQkJCX0KLQkJfQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGludCBnZXREaWFncmFtVHlwZShEaWFncmFtIGRpYWdyYW0pewotCQlyZXR1cm4gRGlhZ3JhbUhlbHBlci5nZXREaWFncmFtVHlwZShkaWFncmFtKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RGlhZ3JhbVR5cGVTdHJpbmcoRGlhZ3JhbSBkaWFncmFtKXsKLQkJcmV0dXJuIERpYWdyYW1IZWxwZXIuZ2V0RGlhZ3JhbVR5cGVTdHJpbmcoZGlhZ3JhbSk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgUHJlZmVyZW5jZXNIaW50IGdldERpYWdyYW1QcmVmZXJlbmNlc0hpbnQoaW50IGRpYWdyYW1UeXBlKSB7Ci0JCXN3aXRjaChkaWFncmFtVHlwZSkgewotCQljYXNlIElEaWFncmFtTWFuYWdlci5BQ1RJVklUWV9ESUFHUkFNOgotCQkJcmV0dXJuIEFjdGl2aXR5RGlhZ3JhbUVkaXRvclBsdWdpbi5ESUFHUkFNX1BSRUZFUkVOQ0VTX0hJTlQ7Ci0JCWNhc2UgSURpYWdyYW1NYW5hZ2VyLkFDVElWSVRZX0RFVEFJTF9ESUFHUkFNOgotCQkJcmV0dXJuIEFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvclBsdWdpbi5ESUFHUkFNX1BSRUZFUkVOQ0VTX0hJTlQ7Ci0JCWNhc2UgSURpYWdyYW1NYW5hZ2VyLldPUktfUFJPRFVDVF9ERVBFTkRFTkNZX0RJQUdSQU06Ci0JCQlyZXR1cm4gV1BERGlhZ3JhbUVkaXRvclBsdWdpbi5ESUFHUkFNX1BSRUZFUkVOQ0VTX0hJTlQ7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qKgotCSAqIENsb3NlIGRpYWdyYW0gZWRpdG9ycwotCSAqIAotCSAqIEBwYXJhbSBjbG9zZUVsZW1lbnQKLQkgKiBAcGFyYW0gY2xvc2VFZGl0b3JSZWZzCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGNsb3NlRGlhZ3JhbUVkaXRvcnMoT2JqZWN0IGNsb3NlRWxlbWVudCwgCi0JCQlqYXZhLnV0aWwuTGlzdDxJRWRpdG9yUmVmZXJlbmNlPiBjbG9zZWRFZGl0b3JSZWZzKSB7Ci0JCUlXb3JrYmVuY2hQYWdlIHdvcmtiZW5jaFBhZ2UgPSBEaWFncmFtVUlQbHVnaW4uZ2V0RGVmYXVsdCgpCi0JCQkJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpCi0JCQkJLmdldEFjdGl2ZVBhZ2UoKTsKLQkJaWYod29ya2JlbmNoUGFnZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJSUVkaXRvclJlZmVyZW5jZVtdIGVkaXRvclJlZmVyZW5jZXMgPSB3b3JrYmVuY2hQYWdlLmdldEVkaXRvclJlZmVyZW5jZXMoKTsKLQkJaWYoY2xvc2VkRWRpdG9yUmVmcyA9PSBudWxsKSB7Ci0JCQljbG9zZWRFZGl0b3JSZWZzID0gbmV3IEFycmF5TGlzdDxJRWRpdG9yUmVmZXJlbmNlPigpOwotCQl9Ci0JCUFycmF5TGlzdDxJRWRpdG9yUmVmZXJlbmNlPiBjbG9zZUVkaXRvclJlZnMgPSBuZXcgQXJyYXlMaXN0PElFZGl0b3JSZWZlcmVuY2U+KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZWRpdG9yUmVmZXJlbmNlcy5sZW5ndGg7IGkrKykgewotCQkJSUVkaXRvclJlZmVyZW5jZSByZWZlcmVuY2UgPSBlZGl0b3JSZWZlcmVuY2VzW2ldOwotCQkJSUVkaXRvclBhcnQgZWRpdG9yID0gcmVmZXJlbmNlLmdldEVkaXRvcih0cnVlKTsKLQkJCWlmIChlZGl0b3IgIT0gbnVsbCkgewotCQkJCUlFZGl0b3JJbnB1dCBpbnB1dCA9IGVkaXRvci5nZXRFZGl0b3JJbnB1dCgpOwotCQkJCU9iamVjdCBlbGVtZW50ID0gbnVsbDsKLQkJCQlpZiAoaW5wdXQgaW5zdGFuY2VvZiBEaWFncmFtRWRpdG9ySW5wdXRQcm94eSkgewotCQkJCQlEaWFncmFtRWRpdG9ySW5wdXQgZGlhZ3JhbUlucHV0ID0gKChEaWFncmFtRWRpdG9ySW5wdXRQcm94eSkgaW5wdXQpLmdldERpYWdyYW1FZGl0b3JJbnB1dCgpOwotCQkJCQlpZiAoZGlhZ3JhbUlucHV0LmdldFdyYXBwZXIoKSAhPSBudWxsKSB7Ci0JCQkJCQllbGVtZW50ID0gZGlhZ3JhbUlucHV0LmdldFdyYXBwZXIoKTsKLQkJCQkJCWlmKGVsZW1lbnQgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcil7Ci0JCQkJCQkJLy8gY2xvc2UgdGhlIHBhcmVudCBlZGl0b3IgdG9vLCBpZiBvcGVuZWQuCi0JCQkJCQkJT2JqZWN0IHBhcmVudCA9ICgoQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpZWxlbWVudCkuZ2V0UGFyZW50KGVsZW1lbnQpOwotCQkJCQkJCWlmKHBhcmVudCBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKXsKLQkJCQkJCQkJaWYoZWxlbWVudC5lcXVhbHMoY2xvc2VFbGVtZW50KSkKLQkJCQkJCQkJCWNsb3NlRGlhZ3JhbUVkaXRvcnMocGFyZW50LCBjbG9zZWRFZGl0b3JSZWZzKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQllbGVtZW50ID0gZGlhZ3JhbUlucHV0LmdldE1ldGhvZEVsZW1lbnQoKTsKLQkJCQkJfQotCQkJCX0gCi0JCQkJaWYgKGVsZW1lbnQgIT0gbnVsbCkgewotCQkJCQlpZiAoZWxlbWVudC5lcXVhbHMoY2xvc2VFbGVtZW50KSkgewotCQkJCQkJY2xvc2VFZGl0b3JSZWZzLmFkZChyZWZlcmVuY2UpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJLy8gY2hlY2sgd2hldGhlciBlbGVtZW50IGlzIGNoaWxkIG9mIGNsb3NlRWxlbWVudAotCQkJCQkJLy8gZGlyZWN0bHkvaW5kaXJlY3RseQotCQkJCQkJaWYgKGNsb3NlRWxlbWVudCBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJCQkJQ29sbGVjdGlvbiBjb2xsZWN0aW9uID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQkJCVByb2Nlc3NVdGlsLmdldENoaWxkRWxlbWVudHMoCi0JCQkJCQkJCQkoQWN0aXZpdHkpIGNsb3NlRWxlbWVudCwgQWN0aXZpdHkuY2xhc3MsCi0JCQkJCQkJCQljb2xsZWN0aW9uKTsKLQkJCQkJCQlpZiAoY29sbGVjdGlvbi5jb250YWlucyhlbGVtZW50KSkgewotCQkJCQkJCQljbG9zZUVkaXRvclJlZnMuYWRkKHJlZmVyZW5jZSk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWludCBzaXplID0gY2xvc2VFZGl0b3JSZWZzLnNpemUoKTsKLQkJSUVkaXRvclJlZmVyZW5jZVtdIHJlZmVyZW5jZXMgPSBuZXcgSUVkaXRvclJlZmVyZW5jZVtzaXplXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCXJlZmVyZW5jZXNbaV0gPSAoSUVkaXRvclJlZmVyZW5jZSkgY2xvc2VFZGl0b3JSZWZzLmdldChpKTsKLQkJfQotCQl3b3JrYmVuY2hQYWdlLmNsb3NlRWRpdG9ycyhyZWZlcmVuY2VzLCBmYWxzZSk7Ci0JCXJlZmVyZW5jZXMgPSBudWxsOwotCX0KLQkKLQkvKioKLQkgKiBEaWFncmFtIGVkaXRvcnMgb2Ygb2JqZWN0IGl0c2VsZiB3aWxsIGJlIGNsb3NlZC4gQW5kIFBhcmVudCBkaWFncmFtCi0JICogZWRpdG9ycyB3aWxsIGJlIHJlZnJlc2hlZC4KLQkgKiAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVmcmVzaFBhcmVudERpYWdyYW1FZGl0b3JzKE9iamVjdCByZWZyZXNoRWxlbWVudCwKLQkJCWphdmEudXRpbC5MaXN0PElFZGl0b3JSZWZlcmVuY2U+IG9wZW5FZGl0b3JSZWZzLCBib29sZWFuIHBhcmVudFJlZnJlc2gpIHsKLQkJb3BlbkVkaXRvclJlZnMgPSBuZXcgQXJyYXlMaXN0PElFZGl0b3JSZWZlcmVuY2U+KCk7Ci0JCS8vIE5vdyByZWZyZXNoIG9iamVjdCdzIHBhcmVudCdzIGRpYWdyYW1zLgotCQlJV29ya2JlbmNoUGFnZSB3b3JrYmVuY2hQYWdlID0gRGlhZ3JhbVVJUGx1Z2luLmdldERlZmF1bHQoKQotCQkJCS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRBY3RpdmVQYWdlKCk7Ci0JCUlFZGl0b3JSZWZlcmVuY2VbXSBlZGl0b3JSZWZlcmVuY2VzID0gd29ya2JlbmNoUGFnZQotCQkJCS5nZXRFZGl0b3JSZWZlcmVuY2VzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZWRpdG9yUmVmZXJlbmNlcy5sZW5ndGg7IGkrKykgewotCQkJSUVkaXRvclJlZmVyZW5jZSByZWZlcmVuY2UgPSBlZGl0b3JSZWZlcmVuY2VzW2ldOwotCQkJSUVkaXRvclBhcnQgZWRpdG9yID0gcmVmZXJlbmNlLmdldEVkaXRvcih0cnVlKTsKLQkJCWlmIChlZGl0b3IgIT0gbnVsbCkgewotCQkJCUlFZGl0b3JJbnB1dCBpbnB1dCA9IGVkaXRvci5nZXRFZGl0b3JJbnB1dCgpOwotCQkJCU9iamVjdCBlbGVtZW50ID0gbnVsbDsKLQkJCQlpZiAoaW5wdXQgaW5zdGFuY2VvZiBEaWFncmFtRWRpdG9ySW5wdXRQcm94eSkgewotCQkJCQlEaWFncmFtRWRpdG9ySW5wdXQgZGlhZ3JhbUlucHV0ID0gKChEaWFncmFtRWRpdG9ySW5wdXRQcm94eSkgaW5wdXQpCi0JCQkJCQkJLmdldERpYWdyYW1FZGl0b3JJbnB1dCgpOwotCQkJCQlpZiAoZGlhZ3JhbUlucHV0LmdldFdyYXBwZXIoKSAhPSBudWxsKSB7Ci0JCQkJCQllbGVtZW50ID0gZGlhZ3JhbUlucHV0LmdldFdyYXBwZXIoKTsKLQkJCQkJCWlmKHBhcmVudFJlZnJlc2gpewotCQkJCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIHsKLQkJCQkJCQlPYmplY3QgcGFyZW50ID0gKChCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgZWxlbWVudCkKLQkJCQkJCQkJCS5nZXRQYXJlbnQobnVsbCk7Ci0JCQkJCQkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSB7Ci0JCQkJCQkJCWlmIChlbGVtZW50LmVxdWFscyhyZWZyZXNoRWxlbWVudCkpCi0JCQkJCQkJCQlyZWZyZXNoUGFyZW50RGlhZ3JhbUVkaXRvcnMocGFyZW50LAotCQkJCQkJCQkJCQlvcGVuRWRpdG9yUmVmcywgcGFyZW50UmVmcmVzaCk7Ci0JCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfSBlbHNlIHsKLQkJCQkJCWVsZW1lbnQgPSBkaWFncmFtSW5wdXQuZ2V0TWV0aG9kRWxlbWVudCgpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWlmIChlbGVtZW50ICE9IG51bGwpIHsKLQkJCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCQkJaWYoIXBhcmVudFJlZnJlc2gpewotCQkJCQkJCWlmKGVsZW1lbnQgPT0gcmVmcmVzaEVsZW1lbnQpewotCQkJCQkJCQlvcGVuRWRpdG9yUmVmcy5hZGQocmVmZXJlbmNlKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQlpZiAoKChBY3Rpdml0eSkgZWxlbWVudCkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKQotCQkJCQkJCQkuY29udGFpbnMocmVmcmVzaEVsZW1lbnQpKQotCQkJCQkJCW9wZW5FZGl0b3JSZWZzLmFkZChyZWZlcmVuY2UpOwotCQkJCQkJZWxzZSBpZiAocmVmcmVzaEVsZW1lbnQgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgewotCQkJCQkJCU9iamVjdCBsb2NhbFJlZnJlc2hFbGVtZW50ID0gcmVmcmVzaEVsZW1lbnQ7Ci0JCQkJCQkJd2hpbGUgKChsb2NhbFJlZnJlc2hFbGVtZW50IGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpCi0JCQkJCQkJCQkmJiAoKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSBsb2NhbFJlZnJlc2hFbGVtZW50KQotCQkJCQkJCQkJCQkuZ2V0T3duZXIoKSAhPSBudWxsKSB7Ci0JCQkJCQkJCWlmICgoKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSBsb2NhbFJlZnJlc2hFbGVtZW50KQotCQkJCQkJCQkJCS5nZXRPd25lcigpLmVxdWFscyhlbGVtZW50KSkgewotCQkJCQkJCQkJb3BlbkVkaXRvclJlZnMuYWRkKHJlZmVyZW5jZSk7Ci0JCQkJCQkJCX0KLQkJCQkJCQkJbG9jYWxSZWZyZXNoRWxlbWVudCA9ICgoQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIGxvY2FsUmVmcmVzaEVsZW1lbnQpCi0JCQkJCQkJCQkJLmdldE93bmVyKCk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJaWYoKChBY3Rpdml0eSkgZWxlbWVudCkuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpICE9IG51bGwpewotCQkJCQkJCUFjdGl2aXR5IGJhc2UgPSAoQWN0aXZpdHkpKChBY3Rpdml0eSkgZWxlbWVudCkuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpOwotCQkJCQkJCWlmICgoKEFjdGl2aXR5KSBiYXNlKS5nZXRCcmVha2Rvd25FbGVtZW50cygpCi0JCQkJCQkJCQkuY29udGFpbnMocmVmcmVzaEVsZW1lbnQpKQotCQkJCQkJCQlvcGVuRWRpdG9yUmVmcy5hZGQocmVmZXJlbmNlKTsKLQkJCQkJCX0KLQkJCQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIHsKLQkJCQkJCUNvbGxlY3Rpb24gYyA9ICgoQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIGVsZW1lbnQpCi0JCQkJCQkJCS5nZXRDaGlsZHJlbihlbGVtZW50KTsKLQkJCQkJCWlmIChjICE9IG51bGwgJiYgYy5jb250YWlucyhyZWZyZXNoRWxlbWVudCkpIHsKLQkJCQkJCQlvcGVuRWRpdG9yUmVmcy5hZGQocmVmZXJlbmNlKTsKLQkJCQkJCX0KLQkJCQkJfQotCi0JCQkJfQotCQkJfQotCQl9Ci0JCWludCBzaXplID0gb3BlbkVkaXRvclJlZnMuc2l6ZSgpOwotCQkvLyBJRWRpdG9yUmVmZXJlbmNlW10gcmVmZXJlbmNlcyA9IG5ldyBJRWRpdG9yUmVmZXJlbmNlW3NpemVdOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJSUVkaXRvclJlZmVyZW5jZSByZWZlcmVuY2UgPSAoSUVkaXRvclJlZmVyZW5jZSkgb3BlbkVkaXRvclJlZnMKLQkJCQkJLmdldChpKTsKLQkJCUlFZGl0b3JQYXJ0IGVkaXRvciA9IHJlZmVyZW5jZS5nZXRFZGl0b3IodHJ1ZSk7Ci0JCQlpZiAoZWRpdG9yIGluc3RhbmNlb2YgQWJzdHJhY3REaWFncmFtRWRpdG9yKSB7Ci0JCQkJKChBYnN0cmFjdERpYWdyYW1FZGl0b3IpIGVkaXRvcikucmVmcmVzaERpYWdyYW0oKTsKLQkJCQlpZihlZGl0b3IgaW5zdGFuY2VvZiBBRERpYWdyYW1FZGl0b3IpewotCQkJCQkoKEFERGlhZ3JhbUVkaXRvcillZGl0b3IpLnJ1blJlc2V0TGF5b3V0QWN0aW9uKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCQotCS8qKgotCSAqIEdldHMgbGlzdCBvZiBjb21tYW5kIGxpc3RlbmVycyB0aGF0IHdpbGwgaGFuZGxlIHRoZSBkaWFncmFtIHJlbGF0ZWQgY2hhbmdlcyBvZiB0aGUgY29tbWFuZHMgb2YgaW50ZXJlc3NlcwotCSAqIAotCSAqIEByZXR1cm4KLQkgKiBAc2VlIElDb21tYW5kTGlzdGVuZXIKLQkgKi8KLS8vCXB1YmxpYyBzdGF0aWMgTGlzdDxJQ29tbWFuZExpc3RlbmVyPiBnZXRDb21tYW5kTGlzdGVuZXJzKCkgewotLy8JCWlmIChjb21tYW5kTGlzdGVuZXJzID09IG51bGwpIHsKLS8vCQkJY29tbWFuZExpc3RlbmVycyA9IG5ldyBBcnJheUxpc3Q8SUNvbW1hbmRMaXN0ZW5lcj4oKTsKLS8vCQl9Ci0vLwotLy8JCWNvbW1hbmRMaXN0ZW5lcnMuYWRkKG5ldyBJQ29tbWFuZExpc3RlbmVyKCkgewotLy8JCQkKLS8vCQkJcHVibGljIHZvaWQgbm90aWZ5RXhlY3V0ZWQoQ29tbWFuZCBjb21tYW5kKSB7Ci0vLwkJCQkvLyBnZXQgY29udHJpYnV0b3IvcmVwbGFjZXIgb2YgdGhlIGFjdGl2aXR5Ci0vLwkJCQkvLwotLy8JCQkJaWYodHJ1ZSkgcmV0dXJuOwotLy8JCQkJQWN0aXZpdHkgYWN0ID0gKEFjdGl2aXR5KSBjb21tYW5kLmdldFJlc3VsdCgpLml0ZXJhdG9yKCkubmV4dCgpOwotLy8JCQkJQWN0aXZpdHkgYmFzZSA9IChBY3Rpdml0eSkgYWN0LmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsKLS8vCQkJCURpYWdyYW1NYW5hZ2VyIGRNZ3IgPSBudWxsOwotLy8JCQkJRGlhZ3JhbU1hbmFnZXIgYmFzZU1nciA9IG51bGw7Ci0vLwkJCQl0cnkgewotLy8JCQkJCWlmIChiYXNlICE9IG51bGwpIHsKLS8vCQkJCQkJQWN0aXZpdHkgcGFyZW50QWN0ID0gYWN0LmdldFN1cGVyQWN0aXZpdGllcygpOwotLy8JCQkJCQlkTWdyID0gRGlhZ3JhbU1hbmFnZXIuZ2V0SW5zdGFuY2UoVG5nVXRpbAotLy8JCQkJCQkJCS5nZXRPd25pbmdQcm9jZXNzKHBhcmVudEFjdCkpOwotLy8JCQkJCQlEaWFncmFtIGRpYWdyYW0gPSBudWxsOwotLy8JCQkJCQlMaXN0PERpYWdyYW0+IGRpYWdyYW1zID0gZE1nci5nZXREaWFncmFtcyhwYXJlbnRBY3QsCi0vLwkJCQkJCQkJSURpYWdyYW1NYW5hZ2VyLkFDVElWSVRZX0RJQUdSQU0pOwotLy8JCQkJCQlpZiAoIWRpYWdyYW1zLmlzRW1wdHkoKSkgewotLy8JCQkJCQkJZGlhZ3JhbSA9IGRpYWdyYW1zLmdldCgwKTsKLS8vCQkJCQkJfQotLy8JCQkJCQlpZiAoZGlhZ3JhbSAhPSBudWxsKSB7Ci0vLwkJCQkJCQkvLyBmaW5kIGV4aXN0aW5nIG5vZGUgZm9yIGJhc2UgYW5kIGxpbmsgaXQgdG8gdGhlCi0vLwkJCQkJCQkvLyBjb250cmlidXRvcmUvcmVwbGFjZXIgb2YgdGhlIGFjdGl2aXR5Ci0vLwkJCQkJCQlOb2RlIG5vZGUgPSBmaW5kTm9kZShkaWFncmFtLCBiYXNlKTsKLS8vCQkJCQkJCWlmIChub2RlICE9IG51bGwpIHsKLS8vCQkJCQkJCQlOb2RlQWRhcHRlciBhZGFwdGVyID0gQnJpZGdlSGVscGVyCi0vLwkJCQkJCQkJCQkuZ2V0Tm9kZUFkYXB0ZXIobm9kZS5nZXRFbGVtZW50KCkpOwotLy8JCQkJCQkJCWlmIChhZGFwdGVyICE9IG51bGwKLS8vCQkJCQkJCQkJCSYmIGFkYXB0ZXIuZ2V0RWxlbWVudCgpICE9IGFjdCkgewotLy8JCQkJCQkJCQlCcmlkZ2VIZWxwZXIuYXNzb2NpYXRlKChFTW9kZWxFbGVtZW50KSBub2RlCi0vLwkJCQkJCQkJCQkJLmdldEVsZW1lbnQoKSwgYWN0KTsKLS8vCQkJCQkJCQkJQnJpZGdlSGVscGVyCi0vLwkJCQkJCQkJCQkJLnVubWFya0luSGVyaXRlZCgoRU1vZGVsRWxlbWVudCkgbm9kZQotLy8JCQkJCQkJCQkJCQkJLmdldEVsZW1lbnQoKSk7Ci0vLwkJCQkJCQkJfQotLy8JCQkJCQkJfQotLy8JCQkJCQl9Ci0vLwkJCQkJCWlmIChhY3QuZ2V0VmFyaWFiaWxpdHlUeXBlKCkgPT0gVmFyaWFiaWxpdHlUeXBlLkxPQ0FMX0NPTlRSSUJVVElPTl9MSVRFUkFMKSB7Ci0vLwkJCQkJCQkvLyBjb3B5IGRpYWdyYW1zIGFuZCB0aGVpciBwdWJsaXNoaW5nIG9wdGlvbnMKLS8vCQkJCQkJCWJhc2VNZ3IgPSBEaWFncmFtTWFuYWdlcgotLy8JCQkJCQkJCQkuZ2V0SW5zdGFuY2UoVG5nVXRpbC5nZXRPd25pbmdQcm9jZXNzKGJhc2UpKTsKLS8vCQkJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgRGlhZ3JhbUhlbHBlci5ESUFHUkFNX1RZUEVTLmxlbmd0aDsgaSsrKSB7Ci0vLwkJCQkJCQkJaW50IGRpYWdyYW1UeXBlID0gRGlhZ3JhbUhlbHBlci5ESUFHUkFNX1RZUEVTW2ldOwotLy8JCQkJCQkJCUxpc3QgYmFzZURpYWdyYW1zID0gYmFzZU1nci5nZXREaWFncmFtcyhiYXNlLAotLy8JCQkJCQkJCQkJZGlhZ3JhbVR5cGUpOwotLy8JCQkJCQkJCWlmICghYmFzZURpYWdyYW1zLmlzRW1wdHkoKSAmJiBiYXNlRGlhZ3JhbXMuZ2V0KDApICE9IG51bGwpIHsKLS8vCQkJCQkJCQkJRGlhZ3JhbSBjb3B5ID0gYmFzZU1nci5jcmVhdGVEaWFncmFtKGFjdCwKLS8vCQkJCQkJCQkJCQlkaWFncmFtVHlwZSwgbnVsbCk7Ci0vLwkJCQkJCQkJCWlmIChpc1B1Ymxpc2hEaWFncmFtKGJhc2UsIGRpYWdyYW1UeXBlKSkgewotLy8JCQkJCQkJCQkJc2V0RGlhZ3JhbU9wdGlvbnMoYWN0LCBkaWFncmFtVHlwZSk7Ci0vLwkJCQkJCQkJCX0KLS8vCQkJCQkJCQl9Ci0vLwkJCQkJCQl9Ci0vLwkJCQkJCX0KLS8vCQkJCQl9Ci0vLwkJCQl9Y2F0Y2goRXhjZXB0aW9uIGUpewotLy8JCQkJCQotLy8JCQkJfQotLy8JCQkJZmluYWxseXsKLS8vCQkJCQlpZihkTWdyICE9IG51bGwpewotLy8JCQkJCQlkTWdyLnJlbGVhc2UoKTsKLS8vCQkJCQl9Ci0vLwkJCQkJaWYoYmFzZU1nciAhPSBudWxsKXsKLS8vCQkJCQkJZE1nci5yZWxlYXNlKCk7Ci0vLwkJCQkJfQotLy8JCQkJfQotLy8JCQl9Ci0vLwotLy8JCQlwdWJsaWMgQ2xhc3MgZ2V0Q29tbWFuZFR5cGUoKSB7Ci0vLwkJCQlyZXR1cm4gVmFyeUFjdGl2aXR5Q29tbWFuZC5jbGFzczsKLS8vCQkJfQotLy8KLS8vCQkJcHVibGljIHZvaWQgcHJlVW5kbyhDb21tYW5kIGNvbW1hbmQpIHsKLS8vCQkJCS8vIGdldCBvbGQgY29udHJpYnV0b3IvcmVwbGFjZXIgb2YgdGhlIGFjdGl2aXR5Ci0vLwkJCQkvLwotLy8JCQkJaWYodHJ1ZSkgcmV0dXJuOwotLy8JCQkJQWN0aXZpdHkgYWN0ID0gKEFjdGl2aXR5KSBjb21tYW5kLmdldFJlc3VsdCgpLml0ZXJhdG9yKCkubmV4dCgpOwotLy8JCQkJVmFyaWFiaWxpdHlFbGVtZW50IGJhc2VBY3QgPSBhY3QuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpOwotLy8JCQkJaWYgKGJhc2VBY3QgIT0gbnVsbCkgewotLy8JCQkJCUFjdGl2aXR5IHBhcmVudEFjdCA9IGFjdC5nZXRTdXBlckFjdGl2aXRpZXMoKTsKLS8vCQkJCQlEaWFncmFtTWFuYWdlciBkTWdyID0gRGlhZ3JhbU1hbmFnZXIuZ2V0SW5zdGFuY2UoVG5nVXRpbC5nZXRPd25pbmdQcm9jZXNzKHBhcmVudEFjdCkpOwotLy8JCQkJCURpYWdyYW0gZGlhZ3JhbSA9IG51bGw7IAotLy8JCQkJCXRyeSB7Ci0vLwkJCQkJCUxpc3QgZGlhZ3JhbXMgPSBkTWdyLmdldERpYWdyYW1zKHBhcmVudEFjdCwKLS8vCQkJCQkJCQlHcmFwaGljYWxEYXRhSGVscGVyLkFDVElWSVRZX0RJQUdSQU0pOwotLy8JCQkJCQlkaWFncmFtID0gKERpYWdyYW0pIGRpYWdyYW1zLmdldCgwKTsKLS8vCQkJCQkJaWYgKGRpYWdyYW0gIT0gbnVsbCkgewotLy8JCQkJCQkJLy8gZmluZCBleGlzdGluZyBub2RlIGZvciB0aGUgb2xkCi0vLwkJCQkJCQkvLyBjb250cmlidXRvcmUvcmVwbGFjZXIKLS8vCQkJCQkJCS8vIG9sZCBhbmQgcmVsaW5rIGl0IHRvIHRoZSBiYXNlIGFjdGl2aXR5Ci0vLwkJCQkJCQlOb2RlIG5vZGUgPSBmaW5kTm9kZShkaWFncmFtLCBhY3QpOwotLy8JCQkJCQkJaWYgKG5vZGUgIT0gbnVsbCkgewotLy8JCQkJCQkJCU5vZGVBZGFwdGVyIGFkYXB0ZXIgPSBCcmlkZ2VIZWxwZXIKLS8vCQkJCQkJCQkJCS5nZXROb2RlQWRhcHRlcihub2RlLmdldEVsZW1lbnQoKSk7Ci0vLwkJCQkJCQkJaWYgKGFkYXB0ZXIgIT0gbnVsbAotLy8JCQkJCQkJCQkJJiYgYWRhcHRlci5nZXRFbGVtZW50KCkgIT0gYmFzZUFjdCkgewotLy8JCQkJCQkJCQlCcmlkZ2VIZWxwZXIuYXNzb2NpYXRlKChFTW9kZWxFbGVtZW50KSBub2RlCi0vLwkJCQkJCQkJCQkJLmdldEVsZW1lbnQoKSwgYmFzZUFjdCk7Ci0vLwkJCQkJCQkJCUJyaWRnZUhlbHBlcgotLy8JCQkJCQkJCQkJCS5tYXJrSW5oZXJpdGVkKChFTW9kZWxFbGVtZW50KSBub2RlCi0vLwkJCQkJCQkJCQkJCQkuZ2V0RWxlbWVudCgpKTsKLS8vCQkJCQkJCQl9Ci0vLwkJCQkJCQl9Ci0vLwkJCQkJCX0KLS8vCQkJCQkJLy8gcmVtb3ZlIGRpYWdyYW1zIAotLy8JCQkJCQkKLS8vCQkJCQkJCi0vLwkJCQkJfWNhdGNoKEV4Y2VwdGlvbiBlKXsKLS8vCQkJCQkJCi0vLwkJCQkJfQotLy8JCQkJCWZpbmFsbHkgewotLy8JCQkJCQkJCi0vLwkJCQkJfQotLy8JCQkJfQotLy8JCQl9Ci0vLwotLy8JCQlwdWJsaWMgdm9pZCBwcmVFeGVjdXRlKENvbW1hbmQgY29tbWFuZCkgewotLy8JCQkJCi0vLwkJCX0KLS8vCi0vLwkJfSk7Ci0vLwotLy8JCXJldHVybiBjb21tYW5kTGlzdGVuZXJzOwotLy8JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXREaWFncmFtT3B0aW9ucyhBY3Rpdml0eSBhY3Rpdml0eSAsIGludCBkaWFncmFtVHlwZSl7Ci0JCXN3aXRjaChkaWFncmFtVHlwZSl7Ci0JCWNhc2UgSURpYWdyYW1NYW5hZ2VyLkFDVElWSVRZX0RJQUdSQU06Ci0JCQlEaWFncmFtT3B0aW9ucy5zZXRQdWJsaXNoQUQoYWN0aXZpdHksIGZhbHNlKTsKLQkJCWJyZWFrOwotCQljYXNlIElEaWFncmFtTWFuYWdlci5BQ1RJVklUWV9ERVRBSUxfRElBR1JBTToKLQkJCURpYWdyYW1PcHRpb25zLnNldFB1Ymxpc2hBREQoYWN0aXZpdHksIGZhbHNlKTsKLQkJCWJyZWFrOwotCQljYXNlIElEaWFncmFtTWFuYWdlci5XT1JLX1BST0RVQ1RfREVQRU5ERU5DWV9ESUFHUkFNOgotCQkJRGlhZ3JhbU9wdGlvbnMuc2V0UHVibGlzaFdQREQoYWN0aXZpdHksIGZhbHNlKTsKLQkJCWJyZWFrOwkKLQkJfQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNQdWJsaXNoRGlhZ3JhbShBY3Rpdml0eSBhY3Rpdml0eSwgaW50IGRpYWdyYW1UeXBlKXsKLQkJc3dpdGNoKGRpYWdyYW1UeXBlKXsKLQkJY2FzZSBJRGlhZ3JhbU1hbmFnZXIuQUNUSVZJVFlfRElBR1JBTToKLQkJCXJldHVybiBEaWFncmFtT3B0aW9ucy5pc1B1Ymxpc2hBRChhY3Rpdml0eSk7Ci0JCWNhc2UgSURpYWdyYW1NYW5hZ2VyLkFDVElWSVRZX0RFVEFJTF9ESUFHUkFNOgotCQkJcmV0dXJuIERpYWdyYW1PcHRpb25zLmlzUHVibGlzaEFERChhY3Rpdml0eSk7Ci0JCWNhc2UgSURpYWdyYW1NYW5hZ2VyLldPUktfUFJPRFVDVF9ERVBFTkRFTkNZX0RJQUdSQU06Ci0JCQlyZXR1cm4gRGlhZ3JhbU9wdGlvbnMuaXNQdWJsaXNoV1BERChhY3Rpdml0eSk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS91aS9zZXJ2aWNlL0RpYWdyYW1FZGl0b3JTdGF0ZVByZXNlcnZlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0udWkvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3VpL3NlcnZpY2UvRGlhZ3JhbUVkaXRvclN0YXRlUHJlc2VydmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhZGZjYjAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0udWkvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3VpL3NlcnZpY2UvRGlhZ3JhbUVkaXRvclN0YXRlUHJlc2VydmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy9BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vL2FyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy93aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy9odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vQ29udHJpYnV0b3JzOgotLy9JQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS51aS5zZXJ2aWNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5wYXJ0LkFic3RyYWN0RGlhZ3JhbUVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnBhcnQuRGlhZ3JhbUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUucGFydC5EaWFncmFtRWRpdG9ySW5wdXRQcm94eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnBhcnQudXRpbC5EaWFncmFtRWRpdG9yVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnByb3ZpZGVycy5TaGFyZWRSZXNvdXJjZURpYWdyYW1Eb2N1bWVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLnVpLkRpYWdyYW1VSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuU3VwcHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXNvdXJjZXMuZWRpdG9yLmRvY3VtZW50LklEb2N1bWVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklGaWxlRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMgotICovCi1wdWJsaWMgY2xhc3MgRGlhZ3JhbUVkaXRvclN0YXRlUHJlc2VydmVyIHsKLQlwcml2YXRlIElFZGl0b3JSZWZlcmVuY2UgZGlhZ3JhbUVkaXRvclJlZjsKLQlwcml2YXRlIGJvb2xlYW4gZGlydHk7Ci0KLQlwdWJsaWMgRGlhZ3JhbUVkaXRvclN0YXRlUHJlc2VydmVyKE9iamVjdCBhY3Rpdml0eU9yV3JhcHBlciwgU3VwcHJlc3Npb24gc3VwcHJlc3Npb24sIGludCBkaWFncmFtVHlwZSkgewotCQlJRWRpdG9ySW5wdXQgaW5wdXQgPSBuZXcgRGlhZ3JhbUVkaXRvcklucHV0UHJveHkoCi0JCQkJbmV3IERpYWdyYW1FZGl0b3JJbnB1dChhY3Rpdml0eU9yV3JhcHBlciwgc3VwcHJlc3Npb24sIGRpYWdyYW1UeXBlKSwgCi0JCQkJRGlhZ3JhbUVkaXRvckhlbHBlci5nZXREaWFncmFtUHJlZmVyZW5jZXNIaW50KGRpYWdyYW1UeXBlKSk7Ci0JCXRyeSB7Ci0JCQlJRWRpdG9yUmVmZXJlbmNlW10gZWRpdG9yUmVmcyA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkKLQkJCQkJLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKQotCQkJCQkuZ2V0RWRpdG9yUmVmZXJlbmNlcygpOwotCQkJU3RyaW5nIGVkaXRvcklkID0gRGlhZ3JhbUVkaXRvclV0aWwuZ2V0RWRpdG9ySWQoZGlhZ3JhbVR5cGUpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlZGl0b3JSZWZzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJSUVkaXRvclJlZmVyZW5jZSBlZGl0b3JSZWYgPSBlZGl0b3JSZWZzW2ldOwotCQkJCWlmKGlucHV0LmVxdWFscyhlZGl0b3JSZWYuZ2V0RWRpdG9ySW5wdXQoKSkgJiYgZWRpdG9yUmVmLmVxdWFscyhlZGl0b3JJZCkpIHsKLQkJCQkJSUVkaXRvclBhcnQgZWRpdG9yID0gZWRpdG9yUmVmLmdldEVkaXRvcihmYWxzZSk7Ci0JCQkJCWlmKGVkaXRvciBpbnN0YW5jZW9mIEFic3RyYWN0RGlhZ3JhbUVkaXRvcikgewotCQkJCQkJZGlhZ3JhbUVkaXRvclJlZiA9IGVkaXRvclJlZjsJCQotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlpZihkaWFncmFtRWRpdG9yUmVmICE9IG51bGwpIHsKLQkJCQlkaXJ0eSA9IGRpYWdyYW1FZGl0b3JSZWYuZ2V0RWRpdG9yKGZhbHNlKS5pc0RpcnR5KCk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLwotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJlc3RvcmUoKSB7Ci0JCXRyeSB7Ci0JCQlpZiAoZGlhZ3JhbUVkaXRvclJlZiAhPSBudWxsICYmICFkaXJ0eSkgewotCQkJCUFic3RyYWN0RGlhZ3JhbUVkaXRvciBlZGl0b3IgPSAoQWJzdHJhY3REaWFncmFtRWRpdG9yKSBkaWFncmFtRWRpdG9yUmVmCi0JCQkJCQkuZ2V0RWRpdG9yKGZhbHNlKTsKLQkJCQlpZiAoZWRpdG9yICE9IG51bGwgJiYgZWRpdG9yLmlzRGlydHkoKSkgewotCQkJCQlJRG9jdW1lbnRQcm92aWRlciBkb2NQcm92aWRlciA9ICgoQWJzdHJhY3REaWFncmFtRWRpdG9yKSBlZGl0b3IpCi0JCQkJCQkJLmdldERvY3VtZW50UHJvdmlkZXIoKTsKLQotCQkJCQkvLyB0aGlzIHdpbGwgY2xlYXIgZGlydHkgZmxhZyBvZiB0aGUgZWRpdG9yCi0JCQkJCS8vCi0JCQkJCWlmIChkb2NQcm92aWRlciBpbnN0YW5jZW9mIFNoYXJlZFJlc291cmNlRGlhZ3JhbURvY3VtZW50UHJvdmlkZXIpIHsKLQkJCQkJCSgoU2hhcmVkUmVzb3VyY2VEaWFncmFtRG9jdW1lbnRQcm92aWRlcikgZG9jUHJvdmlkZXIpCi0JCQkJCQkJCS5tYXJrRG9jdW1lbnRBc1NhdmVkKChJRmlsZUVkaXRvcklucHV0KSBkaWFncmFtRWRpdG9yUmVmCi0JCQkJCQkJCQkJLmdldEVkaXRvcklucHV0KCkpOwotCQkJCQl9Ci0KLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlEaWFncmFtVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0udWkvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3VpL3NlcnZpY2UvRGlhZ3JhbUltYWdlU2VydmljZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0udWkvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3VpL3NlcnZpY2UvRGlhZ3JhbUltYWdlU2VydmljZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNGQ4ODAyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS91aS9zZXJ2aWNlL0RpYWdyYW1JbWFnZVNlcnZpY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk5OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS51aS5zZXJ2aWNlOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnBhcnQuQWN0aXZpdHlEaWFncmFtRWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5wYXJ0LkFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLmJyaWRnZS5CcmlkZ2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5zZXJ2aWNlcy5EaWFncmFtSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuc2VydmljZXMuRGlhZ3JhbU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwudXRpbC5JQWRhcHRlckZhY3RvcnlGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0udWkuRGlhZ3JhbVVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLnVpLnZpZXdlci5BYnN0cmFjdERpYWdyYW1HcmFwaGljYWxWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0udWkudmlld2VyLk5ld0FjdGl2aXR5RGV0YWlsRGlhZ3JhbVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS51aS52aWV3ZXIuTmV3QWN0aXZpdHlEaWFncmFtVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLnVpLnZpZXdlci5OZXdXUERlcGVuZGVuY3lEaWFncmFtVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQucGFydC5XUEREaWFncmFtRWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JTWV0aG9kQ29uZmlndXJhdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5WYXJpYWJpbGl0eUluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkJTQWN0aXZpdHlJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5JQlNJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkNvbmZpZ3VyYWJsZUNvbXBvc2VkQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkRpYWdyYW1PcHRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5JRGlhZ3JhbU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlN1cHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5Qcm9jZXNzQWRhcHRlckZhY3RvcnlGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LmRpYWdyYW0uRGlhZ3JhbUluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuc2VydmljZXMuU2FmZVVwZGF0ZUNvbnRyb2xsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5SZXNvdXJjZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5wcmVmZXJlbmNlcy5QcmVmZXJlbmNlc0hpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2VEYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZUxvYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLQotCi0vKioKLSAqIFByb3ZpZGVzIHNlcnZpY2UgbWV0aG9kcyBmb3IgY3JlYXRpbmcgZGlhZ3JhbSBpbWFnZXMgZm9yIGFjdGl2aXR5IGVsZW1lbnRzCi0gKiAgIAotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRGlhZ3JhbUltYWdlU2VydmljZSBpbXBsZW1lbnRzIElEaWFncmFtSW1hZ2VTZXJ2aWNlIHsKLQotCXN0YXRpYyBib29sZWFuIGRlYnVnICA9IERpYWdyYW1VSVBsdWdpbi5nZXREZWZhdWx0KCkuaXNEZWJ1Z2dpbmcoKTsKLQkKLQlwcml2YXRlIENvbXBvc2l0ZSBwYXJlbnQgPSBudWxsOwotCi0JcHJpdmF0ZSBDb21wb3NpdGUgaG9sZGVyID0gbnVsbDsKLQotCXByaXZhdGUgRmlsZSBwdWJEaXI7Ci0JCi0JcHJpdmF0ZSBib29sZWFuIGZvclhNTEV4cG9ydCA9IGZhbHNlOwotCi0JcHJpdmF0ZSBzdGF0aWMgTWFwPFN0cmluZywgSW50ZWdlcj4gdHlwZU1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgSW50ZWdlcj4oKTsKLQotCXByaXZhdGUgRGlhZ3JhbUluZm8gZGlhZ3JhbUluZm8gPSBudWxsOwotCi0JcHJpdmF0ZSBib29sZWFuIHB1Ymxpc2hVbmNyZWF0ZWRBREQgPSB0cnVlOwotCQotCXByaXZhdGUgYm9vbGVhbiBwdWJsaXNoQURGb3JBY3Rpdml0eUV4dGVuc2lvbiA9IHRydWU7Ci0JCi0JcHJpdmF0ZSBib29sZWFuIGV4aXN0ID0gdHJ1ZTsKLQkKLQlwcml2YXRlIE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gbnVsbDsKLQotCi0Jc3RhdGljIHsKLQkJdHlwZU1hcC5wdXQoUmVzb3VyY2VIZWxwZXIuRElBR1JBTV9UWVBFX1dPUktGTE9XLCBuZXcgSW50ZWdlcigKLQkJCQlJRGlhZ3JhbU1hbmFnZXIuQUNUSVZJVFlfRElBR1JBTSkpOwotCQl0eXBlTWFwLnB1dChSZXNvdXJjZUhlbHBlci5ESUFHUkFNX1RZUEVfQUNUSVZJVFlfREVUQUlMLCBuZXcgSW50ZWdlcigKLQkJCQlJRGlhZ3JhbU1hbmFnZXIuQUNUSVZJVFlfREVUQUlMX0RJQUdSQU0pKTsKLQkJdHlwZU1hcC5wdXQoUmVzb3VyY2VIZWxwZXIuRElBR1JBTV9UWVBFX1dQX0RFUEVOREVOQ1ksIG5ldyBJbnRlZ2VyKAotCQkJCUlEaWFncmFtTWFuYWdlci5XT1JLX1BST0RVQ1RfREVQRU5ERU5DWV9ESUFHUkFNKSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBpbnQgZ2V0SW50VHlwZShTdHJpbmcgZGlhZ3JhbVR5cGUpIHsKLQkJSW50ZWdlciB0eXBlID0gKEludGVnZXIpIHR5cGVNYXAuZ2V0KGRpYWdyYW1UeXBlKTsKLQkJaWYgKHR5cGUgIT0gbnVsbCkgewotCQkJcmV0dXJuIHR5cGUuaW50VmFsdWUoKTsKLQkJfQotCi0JCXJldHVybiAtMTsKLQl9Ci0JcHVibGljIHN0YXRpYyBQcmVmZXJlbmNlc0hpbnQgZ2V0UHJlZmVyZW5jZUhpbnQoU3RyaW5nIGRpYWdyYW1UeXBlKXsKLQkJaW50IHR5cGUgPSBnZXRJbnRUeXBlKGRpYWdyYW1UeXBlKTsKLQkJc3dpdGNoICh0eXBlKSB7Ci0JCWNhc2UgSURpYWdyYW1NYW5hZ2VyLkFDVElWSVRZX0RJQUdSQU06Ci0JCQlyZXR1cm4gQWN0aXZpdHlEaWFncmFtRWRpdG9yUGx1Z2luLkRJQUdSQU1fUFJFRkVSRU5DRVNfSElOVDsKLQkJY2FzZSBJRGlhZ3JhbU1hbmFnZXIuQUNUSVZJVFlfREVUQUlMX0RJQUdSQU06Ci0JCQlyZXR1cm4gQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9yUGx1Z2luLkRJQUdSQU1fUFJFRkVSRU5DRVNfSElOVDsKLQkJY2FzZSBJRGlhZ3JhbU1hbmFnZXIuV09SS19QUk9EVUNUX0RFUEVOREVOQ1lfRElBR1JBTToKLQkJCXJldHVybiBXUEREaWFncmFtRWRpdG9yUGx1Z2luLkRJQUdSQU1fUFJFRkVSRU5DRVNfSElOVDsKLQkJZGVmYXVsdDoKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCQotCX0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTdHJpbmdUeXBlKGludCB0eXBlKSB7Ci0JCXN3aXRjaCh0eXBlKSB7Ci0JCWNhc2UgSURpYWdyYW1NYW5hZ2VyLkFDVElWSVRZX0RJQUdSQU06Ci0JCQlyZXR1cm4gUmVzb3VyY2VIZWxwZXIuRElBR1JBTV9UWVBFX1dPUktGTE9XOwotCQljYXNlIElEaWFncmFtTWFuYWdlci5BQ1RJVklUWV9ERVRBSUxfRElBR1JBTToKLQkJCXJldHVybiBSZXNvdXJjZUhlbHBlci5ESUFHUkFNX1RZUEVfQUNUSVZJVFlfREVUQUlMOwotCQljYXNlIElEaWFncmFtTWFuYWdlci5XT1JLX1BST0RVQ1RfREVQRU5ERU5DWV9ESUFHUkFNOgotCQkJcmV0dXJuIFJlc291cmNlSGVscGVyLkRJQUdSQU1fVFlQRV9XUF9ERVBFTkRFTkNZOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCVNoZWxsIHNoZWxsID0gbnVsbDsKLQotCXByaXZhdGUgU2V0PERpYWdyYW1NYW5hZ2VyPiBkaWFncmFtTWFuYWdlcnMgPSBuZXcgSGFzaFNldDxEaWFncmFtTWFuYWdlcj4oKTsKLQotLy8JcHVibGljIERpYWdyYW1JbWFnZVNlcnZpY2UoKSB7Ci0vLwkJdGhpcyhudWxsLCBuZXcgRmlsZShMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5UGF0aCgpKSk7Ci0vLwl9Ci0KLQlwdWJsaWMgRGlhZ3JhbUltYWdlU2VydmljZShGaWxlIHB1YkRpcikgewotCQl0aGlzKG51bGwsIHB1YkRpcik7Ci0JfQotCi0JcHVibGljIERpYWdyYW1JbWFnZVNlcnZpY2UoQ29tcG9zaXRlIHBhcmVudCwgRmlsZSBwdWJEaXIpIHsKLQkJdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0JCXRoaXMucHViRGlyID0gcHViRGlyOwotCX0KLQotCXByaXZhdGUgQWJzdHJhY3REaWFncmFtR3JhcGhpY2FsVmlld2VyIGdldERpYWdyYW1WaWV3ZXIoaW50IGRpYWdyYW1UeXBlLCBPYmplY3Qgd3JhcHBlcikgewotCQkvLyBpZiB0aGUgc2hlbGwgd2luZG93IGlzIGRpc3Ryb3llZCwgcmVjcmVhdGUgaXQKLQkJaWYgKCh0aGlzLnNoZWxsICE9IG51bGwpICYmIHRoaXMuc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCQl0aGlzLnBhcmVudCA9IG51bGw7Ci0JCQl0aGlzLnNoZWxsID0gbnVsbDsKLQkJfQotCQlnZXRWaWV3ZXJIb2xkZXIocGFyZW50KTsKLQotCQlzd2l0Y2ggKGRpYWdyYW1UeXBlKSB7Ci0JCWNhc2UgSURpYWdyYW1NYW5hZ2VyLkFDVElWSVRZX0RJQUdSQU06Ci0JCQlyZXR1cm4gbmV3IE5ld0FjdGl2aXR5RGlhZ3JhbVZpZXdlcihob2xkZXIsIHdyYXBwZXIpOwotCi0JCWNhc2UgSURpYWdyYW1NYW5hZ2VyLkFDVElWSVRZX0RFVEFJTF9ESUFHUkFNOgotCQkJcmV0dXJuIG5ldyBOZXdBY3Rpdml0eURldGFpbERpYWdyYW1WaWV3ZXIoaG9sZGVyLHdyYXBwZXIpOwotCi0JCWNhc2UgSURpYWdyYW1NYW5hZ2VyLldPUktfUFJPRFVDVF9ERVBFTkRFTkNZX0RJQUdSQU06Ci0JCQlyZXR1cm4gbmV3IE5ld1dQRGVwZW5kZW5jeURpYWdyYW1WaWV3ZXIoaG9sZGVyLHdyYXBwZXIpOwotCi0JCWRlZmF1bHQ6Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBnZXRWaWV3ZXJIb2xkZXIoQ29tcG9zaXRlIHBhcmVudCkgewotCQlpZiAocGFyZW50ID09IG51bGwpIHsKLQkJCWlmIChzaGVsbCA9PSBudWxsIHx8IHNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQkJCXNoZWxsID0gY3JlYXRlU2hlbGwoKTsKLQkJCX0KLQkJCXNoZWxsLm9wZW4oKTsKLQkJCXBhcmVudCA9IHNoZWxsOwotCQl9Ci0KLQkJaWYgKGhvbGRlciAhPSBudWxsKSB7Ci0JCQlob2xkZXIuZGlzcG9zZSgpOwotCQl9Ci0KLQkJaG9sZGVyID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJaG9sZGVyLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKDEsIDEpKTsgLy8gc2l6ZSBjYW4ndCBiZSAwLDAKLQkJLy8gb3RoZXJ3aXNlIHRoZSBkaWFncmFtCi0JCS8vIHdpbGwgbm90IGJlIHBhaW50ZWQKLQkJaG9sZGVyLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQkJaG9sZGVyLnNldFZpc2libGUoZmFsc2UpOwotCX0KLQotCXByaXZhdGUgU2hlbGwgY3JlYXRlU2hlbGwoKSB7Ci0JCVNoZWxsIHNoZWxsID0gbnVsbDsKLQkJRGlzcGxheSBkID0gRGlzcGxheS5nZXREZWZhdWx0KCk7Ci0JCXNoZWxsID0gbmV3IFNoZWxsKGQpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQlzaGVsbC5zZXRMYXlvdXQobGF5b3V0KTsKLQkJc2hlbGwuc2V0Qm91bmRzKDAsIDAsIDAsIDApOwotCQlzaGVsbC5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJcmV0dXJuIHNoZWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWlmICgoc2hlbGwgIT0gbnVsbCkgJiYgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpKSB7Ci0JCQlzaGVsbC5jbG9zZSgpOwotCQkJc2hlbGwuZGlzcG9zZSgpOwotCQl9Ci0JCQotCQlmb3IgKERpYWdyYW1NYW5hZ2VyIG1nciA6IGRpYWdyYW1NYW5hZ2VycykgewotCQkJbWdyLnJlbW92ZUNvbnN1bWVyKHRoaXMpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogc2F2ZSB0aGUgZWxlbWVudCBkaWFncmFtIGltYWdlIGFuZCByZXR1cm5zIHRoZSBpbWFnZSBmaWxlIHVybC4KLQkgKiAKLQkgKiBAcGFyYW0gd3JhcHBlcgotCSAqIEBwYXJhbSBpbWdQYXRoCi0JICogQHBhcmFtIGRpYWdyYW1UeXBlCi0JICogQHBhcmFtIGZpbHRlcgotCSAqICAgICAgICAgICAgSUZpbHRlcgotCSAqIEBwYXJhbSBzdXAKLQkgKiAgICAgICAgICAgIFN1cHByZXNzaW9uCi0JICogQHJldHVybiBTdHJpbmcgdGhlIGltYWdlIHBhdGggcmVsYXRpdmUgdG8gdGhlIHB1Ymxpc2hpbmcgZGlyCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuZGlhZ3JhbS5JQWN0aXZpdHlEaWFncmFtU2VydmljZSNzYXZlRGlhZ3JhbShqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nLCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXIsIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5TdXBwcmVzc2lvbikKLQkgKi8KLQlwdWJsaWMgRGlhZ3JhbUluZm8gc2F2ZURpYWdyYW0oZmluYWwgT2JqZWN0IHdyYXBwZXIsIGZpbmFsIFN0cmluZyBpbWdQYXRoLCAKLQkJCWZpbmFsIFN0cmluZyBkaWFncmFtVHlwZSwgZmluYWwgSUZpbHRlciBmaWx0ZXIsCi0JCQlmaW5hbCBTdXBwcmVzc2lvbiBzdXApIHsKLQkJLy8gaW5pdGlhbGl6ZSB0aGUgZGlhZ3JhbUluZm8KLQkJZGlhZ3JhbUluZm8gPSBudWxsOwotCi0JCS8vIGdyYWIgdGhlIFVJIHRocmVhZCB0byBhdm9pZCB0aHJlYWQgYWNjZXNzIGVycm9yCi0JCVNhZmVVcGRhdGVDb250cm9sbGVyLnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlfX2ludGVybmFsX3NhdmVEaWFncmFtKHdyYXBwZXIsIGltZ1BhdGgsIGRpYWdyYW1UeXBlLCBmaWx0ZXIsIHN1cCk7Ci0JCQl9Ci0JCX0pOwotCi0JCXJldHVybiBkaWFncmFtSW5mbzsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaGFzVXNlckRlZmluZWREaWFncmFtKEFjdGl2aXR5IGUsIFN0cmluZyBpbWdQYXRoLCBpbnQgdHlwZSkKLQkJCXRocm93cyBFeGNlcHRpb24gewotCQkvLyBpZiB0aGVyZSBpcyBhIHVzZXIgZGVmaW5lZCBkaWFncmFtLCB1c2UgaXQKLQkJb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwudXRpbC5EaWFncmFtSW5mbyBpbmZvID0gbmV3IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLnV0aWwuRGlhZ3JhbUluZm8oCi0JCQkJKEFjdGl2aXR5KSBlKTsKLQkJc3dpdGNoICh0eXBlKSB7Ci0JCWNhc2UgSURpYWdyYW1NYW5hZ2VyLkFDVElWSVRZX0RJQUdSQU06Ci0JCQlpZiAoaW5mby5jYW5QdWJsaXNoQURJbWFnZSgpKSB7Ci0JCQkJcmV0dXJuIChpbmZvLmdldEFjdGl2aXR5RGlhZ3JhbSgpICE9IG51bGwpCi0JCQkJCQkmJiBpbmZvLmNhblB1Ymxpc2hBREltYWdlKCk7Ci0JCQl9Ci0JCQlicmVhazsKLQotCQljYXNlIElEaWFncmFtTWFuYWdlci5BQ1RJVklUWV9ERVRBSUxfRElBR1JBTToKLQkJCWlmIChpbmZvLmNhblB1Ymxpc2hBRERJbWFnZSgpKSB7Ci0JCQkJcmV0dXJuIChpbmZvLmdldEFjdGl2aXR5RGV0YWlsRGlhZ3JhbSgpICE9IG51bGwpCi0JCQkJCQkmJiBpbmZvLmNhblB1Ymxpc2hBRERJbWFnZSgpOwotCQkJfQotCQkJYnJlYWs7Ci0KLQkJY2FzZSBJRGlhZ3JhbU1hbmFnZXIuV09SS19QUk9EVUNUX0RFUEVOREVOQ1lfRElBR1JBTToKLQkJCWlmIChpbmZvLmNhblB1Ymxpc2hXUERJbWFnZSgpKSB7Ci0JCQkJcmV0dXJuIChpbmZvLmdldFdQRERpYWdyYW0oKSAhPSBudWxsKQotCQkJCQkJJiYgaW5mby5jYW5QdWJsaXNoV1BESW1hZ2UoKTsKLQkJCX0KLQkJCWJyZWFrOwotCi0JCWRlZmF1bHQ6Ci0JCQlicmVhazsKLQkJfQotCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIF9faW50ZXJuYWxfc2F2ZURpYWdyYW0oT2JqZWN0IHdyYXBwZXIsIGZpbmFsIFN0cmluZyBpbWdQYXRoLAotCQkJU3RyaW5nIGRpYWdyYW1UeXBlLCBJRmlsdGVyIGZpbHRlciwgU3VwcHJlc3Npb24gc3VwKSB7Ci0JCWlmIChzdXAuaXNTdXBwcmVzc2VkKHdyYXBwZXIpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJLy8gRGlhZ3JhbUluZm8gZGlhZ3JhbUluZm8gPSBudWxsOwotCi0JCWludCB0eXBlID0gZ2V0SW50VHlwZShkaWFncmFtVHlwZSk7Ci0JCWlmICh0eXBlIDwgMCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCV9pbnRlcm5hbF9nZW5lcmF0ZUltYWdlKHdyYXBwZXIsIGltZ1BhdGgsIHR5cGUsIGZpbHRlciwgc3VwLCB0cnVlLCB0cnVlKTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyBhIGRpYWdyYW0gSlBFRyBmb3IgZ2l2ZW4gQWN0aXZpdHkgYW5kICAKLQkgKiAKLQkgKiBAcGFyYW0gd3JhcHBlcgotCSAqIEBwYXJhbSBpbWdQYXRoCi0JICogQHBhcmFtIGRpYWdyYW1UeXBlCi0JICogQHBhcmFtIGZpbHRlcgotCSAqIEBwYXJhbSBzdXAKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIFN0cmluZyBnZW5lcmF0ZURpYWdyYW1JbWFnZShmaW5hbCBPYmplY3Qgd3JhcHBlciwgZmluYWwgU3RyaW5nIGltZ1BhdGgsIAotCQkJZmluYWwgaW50IGRpYWdyYW1UeXBlLCBmaW5hbCBJRmlsdGVyIGZpbHRlciwKLQkJCWZpbmFsIFN1cHByZXNzaW9uIHN1cCwgZmluYWwgYm9vbGVhbiByZWFsaXplZERpYWdyYW0pewotCQlTYWZlVXBkYXRlQ29udHJvbGxlci5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJX2ludGVybmFsX2dlbmVyYXRlSW1hZ2Uod3JhcHBlciwgaW1nUGF0aCwgZGlhZ3JhbVR5cGUsIGZpbHRlciwgc3VwLCBmYWxzZSwgcmVhbGl6ZWREaWFncmFtKTsKLQkJCX0KLQkJfSk7Ci0JCXJldHVybiBpbWdQYXRoOwotCX0KLQkKLQkvKioKLQkgKiBNZXRob2QgdG8gY3JlYXRlIGEgZGlhZ3JhbSB2aWV3ZXIgYW5kIGdlbmVyYXRlIGltYWdlIGFuZCBzYXZlcyB0aGUgaW1hZ2UuCi0JICogCi0JICogCi0JICogQHBhcmFtIHdyYXBwZXIKLQkgKiBAcGFyYW0gaW1nUGF0aAotCSAqIEBwYXJhbSBkaWFncmFtVHlwZQotCSAqIEBwYXJhbSBmaWx0ZXIKLQkgKiBAcGFyYW0gc3VwCi0JICogQHBhcmFtIGNhbGN1bGF0ZURpYWdyYW1JbmZvCi0JICovCi0JcHJpdmF0ZSB2b2lkIF9pbnRlcm5hbF9nZW5lcmF0ZUltYWdlKE9iamVjdCB3cmFwcGVyLCBmaW5hbCBTdHJpbmcgaW1nUGF0aCwKLQkJCWludCB0eXBlLCBJRmlsdGVyIGZpbHRlciwgU3VwcHJlc3Npb24gc3VwLCBib29sZWFuIGNhbGN1bGF0ZURpYWdyYW1JbmZvLAotCQkJYm9vbGVhbiByZWFsaXplZERpYWdyYW0pewotCQkKLQkJZXhpc3QgPSB0cnVlOwotCQlJbWFnZSBpbWFnZSA9IG51bGw7Ci0JCQotCQlPYmplY3QgbyA9IFRuZ1V0aWwudW53cmFwKHdyYXBwZXIpOwotCQlpZiAoIShvIGluc3RhbmNlb2YgQWN0aXZpdHkpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlBY3Rpdml0eSBlID0gKEFjdGl2aXR5KSBvOwotCQkKLQkJQWJzdHJhY3REaWFncmFtR3JhcGhpY2FsVmlld2VyIHZpZXdlciA9IG51bGw7Ci0KLQkJLy8ga2VlcCB0aGUgZGlydHkgZmxhZyBhbmQgcmVzZXQgYmFjayB0byBhdm9pZCBtYWtlIHRoZSBsaWJyYXJ5IGRpcnR5Ci0JCWJvb2xlYW4gZGlydHlGbGFnID0gZS5lUmVzb3VyY2UoKS5pc01vZGlmaWVkKCk7Ci0KLQkJdHJ5IHsKLQkJCQotCQkJT2JqZWN0IG9iamVjdCA9IGNhbkNyZWF0ZUltYWdlKHdyYXBwZXIsIGltZ1BhdGgsIHR5cGUsIGZpbHRlciwgc3VwKTsKLQkJCWlmKHJlYWxpemVkRGlhZ3JhbSAmJiBvYmplY3QgPT0gbnVsbCl7Ci0JCQkJcmV0dXJuOwotCQkJfWVsc2V7Ci0JCQkJd3JhcHBlciA9IG9iamVjdDsKLQkJCX0KLQkJCXRyeSB7Ci0JCQkJdmlld2VyID0gZ2V0RGlhZ3JhbVZpZXdlcih0eXBlLCB3cmFwcGVyKTsKLQkJCQlpZihjb25maWcgIT0gbnVsbCl7Ci0JCQkJCXZpZXdlci5zZXRNZXRob2RDb25maWd1cmF0aW9uKGNvbmZpZyk7Ci0JCQkJfQotCQkJCUVkaXRQYXJ0IGRpYWdyYW1FZGl0UGFydCA9IHZpZXdlci5sb2FkRGlhZ3JhbSh3cmFwcGVyLCAhZXhpc3QsIGZpbHRlciwgc3VwKTsKLQkJCQlpZihkaWFncmFtRWRpdFBhcnQgPT0gbnVsbCl7Ci0JCQkJCWlmKGRlYnVnKXsKLQkJCQkJCURpYWdyYW1VSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkuCi0JCQkJCQlsb2dFcnJvcigiUHVibGlzaGluZzogRGlhZ3JhbUltYWdlU2VydmljZSB2aWV3ZXIgRWRpdFBhcnQgaXMgbnVsbDogIit3cmFwcGVyKTsJLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJCXJldHVybjsKLQkJCQl9ZWxzZXsKLQkJCQkJaWYoZGlhZ3JhbUVkaXRQYXJ0LmdldENoaWxkcmVuKCkuaXNFbXB0eSgpKQotCQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlpZihjYWxjdWxhdGVEaWFncmFtSW5mbyl7Ci0JCQkJCWRpYWdyYW1JbmZvID0gdmlld2VyLmdldERpYWdyYW1JbmZvKCk7Ci0JCQkJfQotCQkJCWltYWdlID0gdmlld2VyLmNyZWF0ZURpYWdyYW1JbWFnZSgpOwotCQkJCWlmIChpbWFnZSAhPSBudWxsKSB7Ci0JCQkJCS8vIHNhdmUgdGhlIGltYWdlCi0JCQkJCUZpbGUgZiA9IG5ldyBGaWxlKHB1YkRpciwgaW1nUGF0aCk7Ci0KLQkJCQkJLy8gbWFrZSBzdXJlIHRoZSBmaWxlIGlzIGNyZWF0ZWQgb3RoZXJ3aXNlIGV4Y2VwdGlvbgotCQkJCQlGaWxlIHBhcmVudCA9IGYuZ2V0UGFyZW50RmlsZSgpOwotCQkJCQlpZiAoIXBhcmVudC5leGlzdHMoKSkgewotCQkJCQkJcGFyZW50Lm1rZGlycygpOwotCQkJCQl9Ci0KLQkJCQkJaWYgKCFmLmV4aXN0cygpKSB7Ci0JCQkJCQlmLmNyZWF0ZU5ld0ZpbGUoKTsKLQkJCQkJfQotCQkJCQlPdXRwdXRTdHJlYW0gb3MgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShmKTsKLQkJCQkJSW1hZ2VMb2FkZXIgbG9hZGVyID0gbmV3IEltYWdlTG9hZGVyKCk7Ci0JCQkJCWxvYWRlci5kYXRhID0gbmV3IEltYWdlRGF0YVtdIHsgaW1hZ2UuZ2V0SW1hZ2VEYXRhKCkgfTsKLQkJCQkJbG9hZGVyLnNhdmUob3MsIFNXVC5JTUFHRV9KUEVHKTsJCQkJCQotCQkJCX0gZWxzZSB7Ci0JCQkJCURpYWdyYW1VSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoCi0JCQkJCQkJIkZhaWxlZCB0byBjcmVhdGUgZGlhZ3JhbSBpbWFnZSBmb3IiICsgZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQkJaWYgKGNhbGN1bGF0ZURpYWdyYW1JbmZvICYmIGRpYWdyYW1JbmZvICE9IG51bGwgJiYgIWRpYWdyYW1JbmZvLmlzRW1wdHkoKSkgewotCQkJCQlkaWFncmFtSW5mby5zZXRJbWFnZUZpbGVQYXRoKGltZ1BhdGgpOwotCQkJCX0KLQkJCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZTEpIHsKLQkJCQllMS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQotCQkJLy8gZGVsZXRlIHRoZSBuZXdseSBjcmVhdGVkIGRpYWdyYW0gZnJvbSB0aGUgbGlicmFyeQotCQkJaWYgKCFleGlzdCkgewotCQkJCURpYWdyYW0gZCA9IGdldERpYWdyYW0oZSwgdHlwZSk7Ci0JCQkJaWYgKGQgIT0gbnVsbCkgewotCQkJCQlEaWFncmFtSGVscGVyLmRlbGV0ZURpYWdyYW0oZCwgZmFsc2UpOwotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQlEaWFncmFtVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKCJFeGNlcHRpb24iK2UpOyAvLyROT04tTkxTLTEkCi0JCX0gZmluYWxseSB7Ci0JCQl0cnkgewotCQkJCS8vIHJlc3RvcmUgdGhlIGRpcnR5IGZsYWcKLQkJCQllLmVSZXNvdXJjZSgpLnNldE1vZGlmaWVkKGRpcnR5RmxhZyk7Ci0KLQkJCQlpZiAodmlld2VyICE9IG51bGwpIHsKLQkJCQkJdmlld2VyLmRpc3Bvc2UoKTsKLQkJCQl9Ci0JCQkJaWYgKGltYWdlICE9IG51bGwpIHsKLQkJCQkJaW1hZ2UuZGlzcG9zZSgpOwotCQkJCX0KLQkJCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZTEpIHsKLQkJCQllMS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQkJfQotCX0KLQkKLQotCXByaXZhdGUgT2JqZWN0IGNhbkNyZWF0ZUltYWdlKE9iamVjdCB3cmFwcGVyLCBmaW5hbCBTdHJpbmcgaW1nUGF0aCwKLQkJCWludCB0eXBlLCBJRmlsdGVyIGZpbHRlciwgU3VwcHJlc3Npb24gc3VwcHJlc3Npb24pewotCi0JCU9iamVjdCBvID0gVG5nVXRpbC51bndyYXAod3JhcHBlcik7Ci0JCWlmICghKG8gaW5zdGFuY2VvZiBBY3Rpdml0eSkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXRyeXsKLQkJCS8vTWV0aG9kRWxlbWVudCBlID0gKE1ldGhvZEVsZW1lbnQpbzsKLQkJCUFjdGl2aXR5IGUgPSAoQWN0aXZpdHkpIG87Ci0JCQlpZiAoaGFzVXNlckRlZmluZWREaWFncmFtKChBY3Rpdml0eSkgZSwgaW1nUGF0aCwgdHlwZSkpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJCS8vIENoZWNrIGRpYWdyYW0gZXhpc3RzLCBkb24ndCBnZW5lcmF0ZSBmb3Igc3VwcHJlc3NlZC4KLQkJCURpYWdyYW0gZCA9IGdldERpYWdyYW0oZSwgdHlwZSk7Ci0KLQkJCS8vIENoZWNrIHB1Ymxpc2hpbmcgb3B0aW9ucy4KLQkJCWV4aXN0ID0gKGQgIT0gbnVsbCk7Ci0JCQkKLQkJCWlmIChpc0ZvclhNTEV4cG9ydCgpKSB7Ci0JCQkJaWYgKGV4aXN0ICYmIGNhblB1Ymxpc2hEaWFncmFtKGQsZSkpIHsKLQkJCQkJcmV0dXJuIGU7Ci0JCQkJfQkJCQkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJCQotCQkJaWYgKGV4aXN0KSB7Ci0JCQkJCi0JCQkJaWYoIWNhblB1Ymxpc2hEaWFncmFtKGQsZSkpIHJldHVybiBudWxsOwotCQkJCQotCQkJCWlmICh0eXBlID09IElEaWFncmFtTWFuYWdlci5BQ1RJVklUWV9ESUFHUkFNICkgewotCQkJCQkKLQkJCQkJLy8gSWYgYW4gZXh0ZW5zaW9uIGhhcyBpdHMgb3duIGRpYWdyYW0uIEJhc2UgaXMgcmVwbGFjZWQgb3IKLQkJCQkJLy8gY29udHJpYnV0ZWQuZXh0ZW5zaW9uIGRpYWdyYW0gc2hvd3MgcmVhbGl6ZWQgZWxlbWVudCBpbiB1bmRlZmluZWQKLQkJCQkJLy8gbG9jYXRpb24uIEluIHB1Ymxpc2hpbmcgZG9uJ3QgZGlzcGxheSBleHRlbnNpb24gZGlhZ3JhbSBldmVuIGlmIGl0IGhhcwotCQkJCQkvLyBpdHMgb3duIGRpYWdyYW0gaWYgcmVhbGl6ZWQgZWxlbWVudHMgYXJlIGNvbWluZyBpbiB0aHJvdWdoCi0JCQkJCS8vIHZhcmlhYmlsaXR5LgotCQkJCQlpZiAoIGlzQnJlYWtkb3duRWxlbWVudHNSZXBsYWNlZChlLCBmaWx0ZXIpICkgewotCQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJCX0KLQkJCQkKLQkJCQkJLy8gaWYgdGhlIG9iamVjdCBpcyBhIHdyYXBwZXIsIHRoZSBkaWFncmFtIGlzIGZyb20gaXQncyBiYXNlLAotCQkJCQkvLyBkb24ndCBzaG93IHRoZSBBRCBpZCB0aGUgcHJlZmVyZW5jZSBpcyBub3Qgc2V0Ci0JCQkJCWlmICggKGUgIT0gd3JhcHBlcikgJiYgIXB1Ymxpc2hBREZvckFjdGl2aXR5RXh0ZW5zaW9uICkgewotCQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJCX0KLQotCQkJCQkvLyBDaGVjayB2YXJpYWJpbGl0eSBhbmQgYmFzZSdzIHZhcmlhYmlsaXR5LgotLy8JCQkJCVZhcmlhYmlsaXR5RWxlbWVudCBjYWxjdWxhdGVkQmFzZSA9IGNoZWNrVmFyaWFiaWxpdHkoZSwKLS8vCQkJCQkJCWZpbHRlciwgdHlwZSk7Ci0vLwkJCQkJaWYgKGNhbGN1bGF0ZWRCYXNlICE9IG51bGwpIHsKLS8vCQkJCQkJd3JhcHBlciA9IGNhbGN1bGF0ZWRCYXNlOwotLy8JCQkJCX0KLQkJCQkJCi0JCQkJfSBlbHNlIGlmICggdHlwZSA9PSBJRGlhZ3JhbU1hbmFnZXIuQUNUSVZJVFlfREVUQUlMX0RJQUdSQU0pIHsKLQkJCQkJaWYgKCAoZSAhPSB3cmFwcGVyKSAmJiAhcHVibGlzaFVuY3JlYXRlZEFERCApIHsKLQkJCQkJCXJldHVybiBudWxsOwotCQkJCQl9Ci0JCQkJfQotCQkJCQotCQkJfSBlbHNlIHsKLQotCQkJCWlmICgodHlwZSA9PSBJRGlhZ3JhbU1hbmFnZXIuV09SS19QUk9EVUNUX0RFUEVOREVOQ1lfRElBR1JBTSkpCi0JCQkJCXJldHVybiBudWxsOwotCi0JCQkJLy8gRm9yIEFjdGl2aXR5IERpYWdyYW0gdW4gb3BlbmVkIGV4dGVuc2lvbiBwdWJsaXNoLgotCQkJCWlmICh0eXBlID09IElEaWFncmFtTWFuYWdlci5BQ1RJVklUWV9ESUFHUkFNKSB7Ci0JCQkJCS8vIElmIG9wdGlvbiBpcyBub3QgY2hlY2tlZCwgZG9uJ3QgZ2VuZXJhdGUgYSBkaWFncmFtCi0JCQkJCWlmICghcHVibGlzaEFERm9yQWN0aXZpdHlFeHRlbnNpb24pCi0JCQkJCQlyZXR1cm4gbnVsbDsKLQotCQkJCQkvLyBJZiBleHRlbnNpb24gaXMgbW9kaWZpZWQgZG9uJ3QgZ2VuZXJhdGUgaXQuCi0JCQkJCWlmICghZS5nZXRCcmVha2Rvd25FbGVtZW50cygpLmlzRW1wdHkoKSkKLQkJCQkJCXJldHVybiBudWxsOwotCQkJCQkKLQkJCQkJLy8gQ2hlY2sgYW55IGNoaWxkIGlzIHN1cHByZXNzZWQuIAotCQkJCQkvLyBpZiBhbnkgY2hpbGQgaXMgc3VwcHJlc2VkIGRvbid0IGdlbmVyYXRlIGRpYWdyYW0KLQkJCQkJaWYoYW55Q2hpbGRyZW5TdXBwcmVzc2VkKHdyYXBwZXIsIGZpbHRlciwgc3VwcHJlc3Npb24pKSAKLQkJCQkJCXJldHVybiBudWxsOwotCQkJCQkKLQkJCQkJLy8gQ2hlY2sgdmFyaWFiaWxpdHkgYW5kIGJhc2UncyB2YXJpYWJpbGl0eS4KLQkJCQkJVmFyaWFiaWxpdHlFbGVtZW50IGNhbGN1bGF0ZWRCYXNlID0gY2hlY2tWYXJpYWJpbGl0eShlLAotCQkJCQkJCWZpbHRlciwgdHlwZSk7Ci0JCQkJCWlmIChjYWxjdWxhdGVkQmFzZSA9PSBudWxsKSB7Ci0JCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQkJfQotCi0JCQkJCXdyYXBwZXIgPSBjYWxjdWxhdGVkQmFzZTsKLQkJCQkJZSA9IChBY3Rpdml0eSkgY2FsY3VsYXRlZEJhc2U7Ci0JCQkJCWV4aXN0ID0gdHJ1ZTsKLQkJCQl9Ci0KLQkJCQlpZiAocHVibGlzaFVuY3JlYXRlZEFERCA9PSBmYWxzZQotCQkJCQkJJiYgdHlwZSA9PSBJRGlhZ3JhbU1hbmFnZXIuQUNUSVZJVFlfREVUQUlMX0RJQUdSQU0pIHsKLQkJCQkJYm9vbGVhbiBjb250cmlidXRvcmV4aXN0ID0gZmFsc2U7Ci0JCQkJCS8vIFRoaXMgaXMgbmVlZCwgaWYgY29udHJpYnV0b3IgaGFzIGEgQUREIGRpYWdyYW0sIGJhc2UgZG9uJ3QKLQkJCQkJLy8gYmFzZSBzaG91bGQgZ2VuZXJhdGUgQUREIGluIGJyb3dzaW5nLgotCQkJCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IG51bGw7Ci0JCQkJCWlmIChmaWx0ZXIgaW5zdGFuY2VvZiBQcm9jZXNzQWRhcHRlckZhY3RvcnlGaWx0ZXIpIHsKLQkJCQkJCWNvbmZpZyA9ICgoUHJvY2Vzc0FkYXB0ZXJGYWN0b3J5RmlsdGVyKSBmaWx0ZXIpCi0JCQkJCQkJCS5nZXRNZXRob2RDb25maWd1cmF0aW9uKCk7Ci0JCQkJCX0KLQkJCQkJaWYgKGNvbmZpZyA9PSBudWxsKQotCQkJCQkJcmV0dXJuIG51bGw7Ci0KLQkJCQkJLy8gR2V0IGltbWVkaWF0ZSBjb250cmlidXRvcnMgZmlyc3QsIGFuZCBjaGVjayBpbW1lZGlhdGUKLQkJCQkJLy8gY29udHJpYnV0b3JzCi0JCQkJCS8vIGhhdmUgYW55dGhpbmcgZXh0cmEgYnJlYWtkb3duIGVsZW1lbnRzLgotCQkJCQlMaXN0IGxpc3QgPSBDb25maWd1cmF0aW9uSGVscGVyLmdldENvbnRyaWJ1dG9ycyhlLCBjb25maWcpOwotCQkJCQlpZiAoZSBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJCQlJdGVyYXRvciBpdGVyYXRvciA9IGxpc3QuaXRlcmF0b3IoKTsKLQkJCQkJCWlmIChpdGVyYXRvciAhPSBudWxsKSB7Ci0JCQkJCQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCQkJCQlPYmplY3QgYWN0ID0gaXRlcmF0b3IubmV4dCgpOwotCQkJCQkJCQlpZiAoYWN0ICE9IG51bGwpIHsKLQkJCQkJCQkJCURpYWdyYW0gZHggPSBnZXREaWFncmFtKChBY3Rpdml0eSlhY3QsIHR5cGUpOwotCQkJCQkJCQkJaWYgKGR4ICE9IG51bGwpIHsKLQkJCQkJCQkJCQljb250cmlidXRvcmV4aXN0ID0gdHJ1ZTsKLQkJCQkJCQkJCQlicmVhazsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlpZiAoIWNvbnRyaWJ1dG9yZXhpc3QpCi0JCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0JCQl9Ci0JCX1jYXRjaChFeGNlcHRpb24gZSl7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gd3JhcHBlcjsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gY2FuUHVibGlzaERpYWdyYW0oRGlhZ3JhbSBkaWFncmFtLCBBY3Rpdml0eSBhY3Rpdml0eSkgewotCQlzd2l0Y2ggKERpYWdyYW1IZWxwZXIuZ2V0RGlhZ3JhbVR5cGUoZGlhZ3JhbSkpIHsKLQkJY2FzZSBJRGlhZ3JhbU1hbmFnZXIuQUNUSVZJVFlfRElBR1JBTToKLQkJCWlmIChEaWFncmFtT3B0aW9ucy5pc1B1Ymxpc2hBRChhY3Rpdml0eSkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJCWJyZWFrOwotCQljYXNlIElEaWFncmFtTWFuYWdlci5BQ1RJVklUWV9ERVRBSUxfRElBR1JBTToKLQkJCWlmIChEaWFncmFtT3B0aW9ucy5pc1B1Ymxpc2hBREQoYWN0aXZpdHkpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCQlicmVhazsKLQkJY2FzZSBJRGlhZ3JhbU1hbmFnZXIuV09SS19QUk9EVUNUX0RFUEVOREVOQ1lfRElBR1JBTToKLQkJCWlmIChEaWFncmFtT3B0aW9ucy5pc1B1Ymxpc2hXUEREKGFjdGl2aXR5KSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQkJYnJlYWs7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlwcml2YXRlIGJvb2xlYW4gYW55Q2hpbGRyZW5TdXBwcmVzc2VkKE9iamVjdCB3cmFwcGVyLCBJRmlsdGVyIGZpbHRlciwgU3VwcHJlc3Npb24gc3VwcHJlc3Npb24pIHsKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyIGFkYXB0ZXIgPSBnZXRBZGFwdGVyKHdyYXBwZXIsIGZpbHRlcik7Ci0JCWJvb2xlYW4gb2xkUm9sbGVkVXAgPSBmYWxzZTsKLQkJaWYoYWRhcHRlciBpbnN0YW5jZW9mIEJTQWN0aXZpdHlJdGVtUHJvdmlkZXIpIHsKLQkJCUJTQWN0aXZpdHlJdGVtUHJvdmlkZXIgaXRlbVByb3ZpZGVyID0gKEJTQWN0aXZpdHlJdGVtUHJvdmlkZXIpYWRhcHRlcjsKLQkJCW9sZFJvbGxlZFVwID0gaXRlbVByb3ZpZGVyLmlzUm9sbGVkVXAoKTsKLQkJCWl0ZW1Qcm92aWRlci5iYXNpY1NldFJvbGxlZFVwKGZhbHNlKTsKLQkJfQotCQllbHNlIGlmKGFkYXB0ZXIgaW5zdGFuY2VvZiBJQlNJdGVtUHJvdmlkZXIpewotCQkJSUJTSXRlbVByb3ZpZGVyIGl0ZW1Qcm92aWRlciA9IChJQlNJdGVtUHJvdmlkZXIpYWRhcHRlcjsKLQkJCW9sZFJvbGxlZFVwID0gaXRlbVByb3ZpZGVyLmlzUm9sbGVkVXAoKTsKLQkJCWl0ZW1Qcm92aWRlci5zZXRSb2xsZWRVcChmYWxzZSk7Ci0JCX0KLQkJCi0JCXRyeSB7Ci0JCQkvLyBmaWx0ZXIgb3V0IHRoZSBzdXBwcmVzc2VkIGVsZW1lbnRzCi0JCQkvLwotCQkJT2JqZWN0IGVsZW1lbnQgPSBUbmdVdGlsLnVud3JhcCh3cmFwcGVyKTsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGFkYXB0ZXIuZ2V0Q2hpbGRyZW4oZWxlbWVudCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IGNoaWxkID0gaXRlci5uZXh0KCk7Ci0JCQkJaWYoc3VwcHJlc3Npb24uaXNTdXBwcmVzc2VkKGNoaWxkKSkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQkvLyByZXN0b3JlIHRoZSByb2xsZWQtdXAgZmxhZwotCQkJLy8KLQkJCWlmKGFkYXB0ZXIgaW5zdGFuY2VvZiBJQlNJdGVtUHJvdmlkZXIpIHsKLQkJCQkoKElCU0l0ZW1Qcm92aWRlcilhZGFwdGVyKS5zZXRSb2xsZWRVcChvbGRSb2xsZWRVcCk7Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JLyoqCi0JICogTW92ZWQgY29kZSBmcm9tIGdldENoaWxkcmVuLiBnZXRBZGFwdGVyKCkgd2lsbCByZXR1cm4gQWRhcHRlciwKLQkgKiB3aGljaCB3aWxsIGFsbG93IHVzIHRvIGZpbmQgaXRlbXByb3ZpZGVyIGZvciB0aGUgY2hpbGRyZW4uIAotCSAqIAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlciBnZXRBZGFwdGVyKE9iamVjdCB3cmFwcGVyLCBJRmlsdGVyIGZpbHRlcil7Ci0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciBhZGFwdGVyID0gbnVsbDsKLQkJaWYgKHdyYXBwZXIgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgewotCQkJYWRhcHRlciA9IChCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcil3cmFwcGVyOwotCQl9IGVsc2UgewotCQkJYWRhcHRlciA9IChJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIpIGdldEFkYXB0ZXJGYWN0b3J5KGZpbHRlcikuYWRhcHQoCi0JCQkJCXdyYXBwZXIsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCX0KLQkJcmV0dXJuIGFkYXB0ZXI7Ci0JfQotCQotCUFkYXB0ZXJGYWN0b3J5IGdldEFkYXB0ZXJGYWN0b3J5KElGaWx0ZXIgZmlsdGVyKXsKLQkJQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkgPSBudWxsOwotCQlpZiAoZmlsdGVyID09IG51bGwpIHsKLQkJCWFkYXB0ZXJGYWN0b3J5ID0gVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UuZ2V0V0JTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKTsKLQkJfSBlbHNlIGlmIChmaWx0ZXIgaW5zdGFuY2VvZiBJQWRhcHRlckZhY3RvcnlGaWx0ZXIpIHsKLQkJCWFkYXB0ZXJGYWN0b3J5ID0gKENvbmZpZ3VyYWJsZUNvbXBvc2VkQWRhcHRlckZhY3RvcnkpICgoSUFkYXB0ZXJGYWN0b3J5RmlsdGVyKSBmaWx0ZXIpCi0JCQkJCS5nZXRXQlNBZGFwdGVyRmFjdG9yeSgpOwotCQl9Ci0JCXJldHVybiBhZGFwdGVyRmFjdG9yeTsKLQl9Ci0JCi0JcHJpdmF0ZSBWYXJpYWJpbGl0eUVsZW1lbnQgY2hlY2tWYXJpYWJpbGl0eShWYXJpYWJpbGl0eUVsZW1lbnQgZSwgSUZpbHRlciBmaWx0ZXIsCi0JCQlpbnQgdHlwZSkgewotCi0JCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gbnVsbDsKLQkJaWYgKGZpbHRlciBpbnN0YW5jZW9mIFByb2Nlc3NBZGFwdGVyRmFjdG9yeUZpbHRlcikgewotCQkJY29uZmlnID0gKChQcm9jZXNzQWRhcHRlckZhY3RvcnlGaWx0ZXIpIGZpbHRlcikKLQkJCQkJLmdldE1ldGhvZENvbmZpZ3VyYXRpb24oKTsKLQkJfQotCQlpZiAoY29uZmlnID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQkvLyBHZXQgaW1tZWRpYXRlIGNvbnRyaWJ1dG9ycyBmaXJzdCwgYW5kIGNoZWNrIGltbWVkaWF0ZSBjb250cmlidXRvcnMKLQkJLy8gaGF2ZSBhbnl0aGluZyBleHRyYSBicmVha2Rvd24gZWxlbWVudHMuCi0JCUxpc3QgbGlzdCA9IENvbmZpZ3VyYXRpb25IZWxwZXIuZ2V0Q29udHJpYnV0b3JzKGUsIGNvbmZpZyk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBsaXN0Lml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBuZXh0ID0gaXRlcmF0b3IubmV4dCgpOwotCQkJaWYgKG5leHQgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCWlmICghKChBY3Rpdml0eSkgbmV4dCkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5pc0VtcHR5KCkpCi0JCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9Ci0KLQkJLy8gR2V0IGFsbCBDb250cmlidXRvcnMgZnJvbSBwYXJlbnQgY2hhaW4gYW5kIGNvbnRyaWJ1dG9yIGNoYWluIGZvciB0aGUKLQkJLy8gZWxlbWVudCBlLgotCQlWYXJpYWJpbGl0eUluZm8gZUluZm8gPSAoKFByb2Nlc3NBZGFwdGVyRmFjdG9yeUZpbHRlcikgZmlsdGVyKQotCQkJCS5nZXRWYXJpYWJpbGl0eUluZm8oKFZhcmlhYmlsaXR5RWxlbWVudCkgZSk7Ci0JCUxpc3QgY29udHJpYnV0b3JzID0gZUluZm8uZ2V0Q29udHJpYnV0b3JzKCk7Ci0KLQkJVmFyaWFiaWxpdHlFbGVtZW50IHZlID0gZS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCk7Ci0JCWlmICh2ZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQkKLQkJQWN0aXZpdHkgcmVwbGFjZXIgPSAoQWN0aXZpdHkpIENvbmZpZ3VyYXRpb25IZWxwZXIuZ2V0UmVwbGFjZXIodmUsCi0JCQkJY29uZmlnKTsKLQkJaWYgKHJlcGxhY2VyICE9IG51bGwpIHsKLQkJCXZlID0gcmVwbGFjZXI7Ci0JCQlEaWFncmFtIHJlcGxhY2VyRGlhZ3JhbSA9IGdldERpYWdyYW0ocmVwbGFjZXIsIHR5cGUpOwotCQkJaWYgKHJlcGxhY2VyRGlhZ3JhbSAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIHJlcGxhY2VyOwotCQkJfSBlbHNlIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCURpYWdyYW0gYmFzZURpYWdyYW0gPSBnZXREaWFncmFtKChBY3Rpdml0eSkgdmUsIHR5cGUpOwotCQkJaWYgKGJhc2VEaWFncmFtICE9IG51bGwpIHsKLQkJCQkKLQkJCQkvLyBDaGVjayBmaXJzdCBpZiBiYXNlRGlhZ3JhbSBpcyBzdXBwcmVzc2VkLgotCQkJCWlmKEJyaWRnZUhlbHBlci5pc1N1cHByZXNzZWQoYmFzZURpYWdyYW0pKSByZXR1cm4gbnVsbDsKLQkJCQkKLQkJCQkvLyBGaW5kIHRoZSBjb250cmlidXRvcnMgb2YgQmFzZQotCQkJCVZhcmlhYmlsaXR5SW5mbyB2ZUluZm8gPSAoKFByb2Nlc3NBZGFwdGVyRmFjdG9yeUZpbHRlcikgZmlsdGVyKQotCQkJCQkJLmdldFZhcmlhYmlsaXR5SW5mbygoVmFyaWFiaWxpdHlFbGVtZW50KSB2ZSk7Ci0JCQkJTGlzdCB2ZUNvbnRyaWJ1dG9ycyA9IHZlSW5mby5nZXRDb250cmlidXRvcnMoKTsKLQkJCQlpZiAoY29udHJpYnV0b3JzLnNpemUoKSAhPSB2ZUNvbnRyaWJ1dG9ycy5zaXplKCkpIHsKLQkJCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGNvbnRyaWJ1dG9ycy5pdGVyYXRvcigpOyBpdGVyYXRvcgotCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlPYmplY3QgbmV4dCA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJCWlmICghdmVDb250cmlidXRvcnMuY29udGFpbnMobmV4dCkpIHsKLQkJCQkJCQlpZiAoISgoQWN0aXZpdHkpIG5leHQpLmdldEJyZWFrZG93bkVsZW1lbnRzKCkKLQkJCQkJCQkJCS5pc0VtcHR5KCkpIHsKLQkJCQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCQotCQkJCXJldHVybiB2ZTsKLQkJCQkKLQkJCX1lbHNlewotCQkJCS8vIElmIG5vIGJhc2UgZGlhZ3JhbSwgY2hlY2sgYmFzZSBvZiBiYXNlIGhhZCBhbnkgZGlhZ3JhbS4KLQkJCQlyZXR1cm4gY2hlY2tWYXJpYWJpbGl0eSh2ZSwgZmlsdGVyLCB0eXBlKTsKLQkJCX0KLQkJfQotCQkKLQl9Ci0JCi0JcHVibGljIFZhcmlhYmlsaXR5RWxlbWVudCBjaGVja1ZhcmlhYmlsaXR5KFZhcmlhYmlsaXR5RWxlbWVudCBlLCBJRmlsdGVyIGZpbHRlciwKLQkJCWludCB0eXBlLCBib29sZWFuIGNoZWNrVUREKSB7Ci0KLQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSBudWxsOwotCQlvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC51dGlsLkRpYWdyYW1JbmZvIHVkZEluZm8gPSBudWxsOwotCQkKLQkJaWYgKGZpbHRlciBpbnN0YW5jZW9mIFByb2Nlc3NBZGFwdGVyRmFjdG9yeUZpbHRlcikgewotCQkJY29uZmlnID0gKChQcm9jZXNzQWRhcHRlckZhY3RvcnlGaWx0ZXIpIGZpbHRlcikKLQkJCQkJLmdldE1ldGhvZENvbmZpZ3VyYXRpb24oKTsKLQkJfQotCQlpZiAoY29uZmlnID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQkvLyBHZXQgaW1tZWRpYXRlIGNvbnRyaWJ1dG9ycyBmaXJzdCwgYW5kIGNoZWNrIGltbWVkaWF0ZSBjb250cmlidXRvcnMKLQkJLy8gaGF2ZSBhbnl0aGluZyBleHRyYSBicmVha2Rvd24gZWxlbWVudHMuCi0JCUxpc3QgbGlzdCA9IENvbmZpZ3VyYXRpb25IZWxwZXIuZ2V0Q29udHJpYnV0b3JzKGUsIGNvbmZpZyk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBsaXN0Lml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBuZXh0ID0gaXRlcmF0b3IubmV4dCgpOwotCQkJaWYgKG5leHQgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCWlmICghKChBY3Rpdml0eSkgbmV4dCkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5pc0VtcHR5KCkpCi0JCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9Ci0KLQkJLy8gR2V0IGFsbCBDb250cmlidXRvcnMgZnJvbSBwYXJlbnQgY2hhaW4gYW5kIGNvbnRyaWJ1dG9yIGNoYWluIGZvciB0aGUKLQkJLy8gZWxlbWVudCBlLgotCQlWYXJpYWJpbGl0eUluZm8gZUluZm8gPSAoKFByb2Nlc3NBZGFwdGVyRmFjdG9yeUZpbHRlcikgZmlsdGVyKQotCQkJCS5nZXRWYXJpYWJpbGl0eUluZm8oKFZhcmlhYmlsaXR5RWxlbWVudCkgZSk7Ci0JCUxpc3QgY29udHJpYnV0b3JzID0gZUluZm8uZ2V0Q29udHJpYnV0b3JzKCk7Ci0KLQkJVmFyaWFiaWxpdHlFbGVtZW50IHZlID0gZS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCk7Ci0JCWlmICh2ZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQkKLQkJQWN0aXZpdHkgcmVwbGFjZXIgPSAoQWN0aXZpdHkpIENvbmZpZ3VyYXRpb25IZWxwZXIuZ2V0UmVwbGFjZXIodmUsCi0JCQkJY29uZmlnKTsKLQkJaWYgKHJlcGxhY2VyICE9IG51bGwpIHsKLQkJCXZlID0gcmVwbGFjZXI7Ci0JCQlEaWFncmFtIHJlcGxhY2VyRGlhZ3JhbSA9IGdldERpYWdyYW0ocmVwbGFjZXIsIHR5cGUpOwotCQkJaWYoY2hlY2tVREQpewotCQkJCXVkZEluZm8gPSBuZXcgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwudXRpbC5EaWFncmFtSW5mbyhyZXBsYWNlcik7Ci0JCQkJaWYodWRkSW5mby5jYW5QdWJsaXNoQURJbWFnZSgpICYmIHVkZEluZm8uZ2V0QWN0aXZpdHlEaWFncmFtKCkgIT0gbnVsbCl7Ci0JCQkJCXJldHVybiByZXBsYWNlcjsKLQkJCQl9Ci0JCQl9ZWxzZXsKLQkJCQlpZiAocmVwbGFjZXJEaWFncmFtICE9IG51bGwpIHsKLQkJCQkJcmV0dXJuIHJlcGxhY2VyOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBudWxsOwotCQl9IGVsc2UgewotCQkJCi0JCQlEaWFncmFtIGJhc2VEaWFncmFtID0gbnVsbDsKLQkJCWlmKGNoZWNrVUREKXsKLQkJCQl1ZGRJbmZvID0gbmV3IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLnV0aWwuRGlhZ3JhbUluZm8oKEFjdGl2aXR5KXZlKTsKLQkJCX1lbHNlewotCQkJCWJhc2VEaWFncmFtID0gZ2V0RGlhZ3JhbSgoQWN0aXZpdHkpIHZlLCB0eXBlKTsKLQkJCX0KLQkJCQotCQkJaWYgKGJhc2VEaWFncmFtICE9IG51bGwgfHwgKHVkZEluZm8gIT0gbnVsbCAmJiB1ZGRJbmZvLmNhblB1Ymxpc2hBREltYWdlKCkgJiYgdWRkSW5mby5nZXRBY3Rpdml0eURpYWdyYW0oKSAhPSBudWxsKSkgewotCQkJCQotCQkJCS8vIENoZWNrIGZpcnN0IGlmIGJhc2VEaWFncmFtIGlzIHN1cHByZXNzZWQuCi0vLwkJCQlpZihCcmlkZ2VIZWxwZXIuaXNTdXBwcmVzc2VkKGJhc2VEaWFncmFtKSkgcmV0dXJuIG51bGw7Ci0JCQkJCi0JCQkJLy8gRmluZCB0aGUgY29udHJpYnV0b3JzIG9mIEJhc2UKLQkJCQlWYXJpYWJpbGl0eUluZm8gdmVJbmZvID0gKChQcm9jZXNzQWRhcHRlckZhY3RvcnlGaWx0ZXIpIGZpbHRlcikKLQkJCQkJCS5nZXRWYXJpYWJpbGl0eUluZm8oKFZhcmlhYmlsaXR5RWxlbWVudCkgdmUpOwotCQkJCUxpc3QgdmVDb250cmlidXRvcnMgPSB2ZUluZm8uZ2V0Q29udHJpYnV0b3JzKCk7Ci0JCQkJaWYgKGNvbnRyaWJ1dG9ycy5zaXplKCkgIT0gdmVDb250cmlidXRvcnMuc2l6ZSgpKSB7Ci0JCQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBjb250cmlidXRvcnMuaXRlcmF0b3IoKTsgaXRlcmF0b3IKLQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJT2JqZWN0IG5leHQgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCQlpZiAoIXZlQ29udHJpYnV0b3JzLmNvbnRhaW5zKG5leHQpKSB7Ci0JCQkJCQkJaWYgKCEoKEFjdGl2aXR5KSBuZXh0KS5nZXRCcmVha2Rvd25FbGVtZW50cygpCi0JCQkJCQkJCQkuaXNFbXB0eSgpKSB7Ci0JCQkJCQkJCXJldHVybiBudWxsOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQkKLQkJCQlyZXR1cm4gdmU7Ci0JCQkJCi0JCQl9ZWxzZXsKLQkJCQkvLyBJZiBubyBiYXNlIGRpYWdyYW0sIGNoZWNrIGJhc2Ugb2YgYmFzZSBoYWQgYW55IGRpYWdyYW0uCi0JCQkJcmV0dXJuIGNoZWNrVmFyaWFiaWxpdHkodmUsIGZpbHRlciwgdHlwZSk7Ci0JCQl9Ci0JCX0KLQkJCi0JfQotCQotCi0JLyoqCi0JICogU2V0IHRoZSB3aW5kb3cncyBwcmVmZXJlbmNlIGF0dHJpYnV0ZSBmb3IgQWN0aXZpdHkgRGV0YWlsIERpYWdyYW0uCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHVibGlzaGVkVW5DcmVhdGVkQUREKGJvb2xlYW4gZmxhZykgewotCQl0aGlzLnB1Ymxpc2hVbmNyZWF0ZWRBREQgPSBmbGFnOwotCX0KLQkvKioKLQkgKiBTZXQgdGhlIHdpbmRvdydzIHByZWZlcmVuY2UgYXR0cmlidXRlIGZvciBBY2l0aXZ5dCBEaWFncmFtCi0JICogCi0JICovCi0JCi0JcHVibGljIHZvaWQgc2V0UHVibGlzaEFERm9yQWN0aXZpdHlFeHRlbnNpb24oYm9vbGVhbiBmbGFnKXsKLQkJdGhpcy5wdWJsaXNoQURGb3JBY3Rpdml0eUV4dGVuc2lvbiA9IGZsYWc7Ci0JfQotCi0vLwlwcml2YXRlIERpYWdyYW1HZW5lcmF0b3IgY3JlYXRlRGlhZ3JhbUltYWdlKERpYWdyYW1FZGl0UGFydCBkaWFncmFtRVAsIEltYWdlRmlsZUZvcm1hdCBmaWxlRm9ybWF0KQotLy8JdGhyb3dzIENvcmVFeGNlcHRpb24gewotLy8JCUNvcHlUb0ltYWdlVXRpbCB1dGlsID0gbmV3IENvcHlUb0ltYWdlVXRpbCgpOwotLy8JCURpYWdyYW1HZW5lcmF0b3IgZEdlbiA9IHV0aWwuY29weVRvSW1hZ2UoZGlhZ3JhbUVQLCBuZXcgUGF0aChwdWJEaXIuZ2V0UGF0aCgpKSwgZmlsZUZvcm1hdCwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0vLwkJZEdlbi5jcmVhdGVBV1RJbWFnZUZvckRpYWdyYW0oKTsKLS8vCQlyZXR1cm4gZEdlbjsKLS8vCX0KLQkKLQlwdWJsaWMgRGlhZ3JhbSBnZXREaWFncmFtKEFjdGl2aXR5IGUsIGludCB0eXBlKXsKLQkJRGlhZ3JhbU1hbmFnZXIgZE1nciA9IGdldERpYWdyYW1NYW5hZ2VyKGUpOwotCQlEaWFncmFtIGRpYWdyYW0gPSBudWxsOwotCQlpZiAoZE1nciAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCUxpc3Q8RGlhZ3JhbT4gbGlzdCA9IGRNZ3IuZ2V0RGlhZ3JhbXMoZSwgdHlwZSk7Ci0JCQkJaWYgKCFsaXN0LmlzRW1wdHkoKSkgewotCQkJCQlkaWFncmFtID0gKERpYWdyYW0pIGxpc3QuZ2V0KDApOwotCQkJCX0KLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJCURpYWdyYW1VSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoCi0JCQkJCQkiRXJyb3IgaW4gZ2V0RGlhZ3JhbSgpIiArIGV4LmdldE1lc3NhZ2UoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCQlyZXR1cm4gZGlhZ3JhbTsKLQl9Ci0JCi0JcHJpdmF0ZSBEaWFncmFtTWFuYWdlciBnZXREaWFncmFtTWFuYWdlcihBY3Rpdml0eSBlKSB7Ci0JCURpYWdyYW1NYW5hZ2VyIG1nciA9IERpYWdyYW1NYW5hZ2VyLmdldEluc3RhbmNlKFRuZ1V0aWwuZ2V0T3duaW5nUHJvY2VzcyhlKSwgdGhpcyk7Ci0JCWRpYWdyYW1NYW5hZ2VycyAuYWRkKG1ncik7Ci0JCXJldHVybiBtZ3I7Ci0JfQotCQotCS8qKgotCSAqIGdldHMgdGhlIG1ldGhvZCBjb25maWd1cmF0aW9uICAKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIE1ldGhvZENvbmZpZ3VyYXRpb24gZ2V0Q29uZmlnKCkgewotCQlyZXR1cm4gY29uZmlnOwotCX0KLQkvKioKLQkgKiBzZXRzIHRoZSBtZXRob2QgY29uZmlndXJhdGlvbi4KLQkgKiBAcGFyYW0gY29uZmlnCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29uZmlnKE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0JCXRoaXMuY29uZmlnID0gY29uZmlnOwotCX0KLQkKLQotCS8qKgotCSAqIENoZWNrcyBhbnkgYnJlYWtkb3duZWxlbWVudHMgb2YgYW4gQWN0aXZpdHkgaGFzIGEgcmVwbGFjZXIuCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiAgICAgICAgICAgICAgVmFyaWFiaWxpdHlFbGVtZW50IHRoZSBlbGVtZW50Ci0JICogQHBhcmFtIGNvbmZpZyAKLQkgKiAJCQkJTWV0aG9kQ29uZmlndXJhdGlvbgotCSAqIEByZXR1cm4gVmFyaWFiaWxpdHlFbGVtZW50IHRoZSByZXBsYWNlciBpZiB0aGVyZSBpcyBvbmUgYW5kIE9OTFkgb25lLAotCSAqICAgICAgICAgbnVsbCBvdGhlcndpc2UKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNCcmVha2Rvd25FbGVtZW50c1JlcGxhY2VkKEFjdGl2aXR5IGFjdGl2aXR5LAotCQkJSUZpbHRlciBmaWx0ZXIpIHsKLQkJCi0JCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gbnVsbDsKLQkJaWYgKGZpbHRlciBpbnN0YW5jZW9mIElNZXRob2RDb25maWd1cmF0aW9uUHJvdmlkZXIpIHsKLQkJCWNvbmZpZyA9ICgoSU1ldGhvZENvbmZpZ3VyYXRpb25Qcm92aWRlcikgZmlsdGVyKQotCQkJCQkuZ2V0TWV0aG9kQ29uZmlndXJhdGlvbigpOwotCQl9Ci0JCWlmIChjb25maWcgPT0gbnVsbCkKLQkJCXJldHVybiB0cnVlOwotCQkKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gYWN0aXZpdHkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCUJyZWFrZG93bkVsZW1lbnQgZWxlbWVudCA9IChCcmVha2Rvd25FbGVtZW50KSBpdGVyLm5leHQoKTsKLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQlpZihDb25maWd1cmF0aW9uSGVscGVyLmdldFJlcGxhY2VyKChBY3Rpdml0eSllbGVtZW50LCBjb25maWcpICE9IG51bGwpCi0JCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JCi0JLyoqCi0JICogTWV0aG9kIHRvIGdldCBhIERpYWdyYW1WaWV3ZXIgZm9yIGdpdmVuIGFjdGl2aXR5LiAgCi0JICogV2l0aG91dCBkb2luZyByZWFsaXphdGlvbiBhbmQgZG9lc24ndCBjaGVjayBmb3IgZGlhZ3JhbSBleGlzdHMgb3Igbm90LiAKLQkgKi8KLQkKLQlwdWJsaWMgQWJzdHJhY3REaWFncmFtR3JhcGhpY2FsVmlld2VyIGdldERpYWdyYW1WaWV3ZXIoZmluYWwgT2JqZWN0IHdyYXBwZXIsCi0JCQlmaW5hbCBpbnQgdHlwZSwgZmluYWwgSUZpbHRlciBmaWx0ZXIsCi0JCQlmaW5hbCBTdXBwcmVzc2lvbiBzdXApewotCQlPYmplY3QgbyA9IFRuZ1V0aWwudW53cmFwKHdyYXBwZXIpOwotCQlpZiAoIShvIGluc3RhbmNlb2YgQWN0aXZpdHkpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCUFjdGl2aXR5IGUgPSAoQWN0aXZpdHkpIG87Ci0JCQotCQlBYnN0cmFjdERpYWdyYW1HcmFwaGljYWxWaWV3ZXIgdmlld2VyID0gbnVsbDsKLQkJaWYgKHR5cGUgPCAwKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQl2aWV3ZXIgPSBnZXREaWFncmFtVmlld2VyKHR5cGUsIHdyYXBwZXIpOwotCQlyZXR1cm4gdmlld2VyOwotCX0KLQkKLQlwdWJsaWMgQWN0aXZpdHkgZ2V0UmVhbGl6ZWRGb3JVbm1vZGlmaWVkKE9iamVjdCB3cmFwcGVyLCBJRmlsdGVyIGZpbHRlciwgCi0JCQlTdXBwcmVzc2lvbiBzdXBwcmVzc2lvbil7Ci0JCUFjdGl2aXR5IGFjdGl2aXR5ID0gKEFjdGl2aXR5KVRuZ1V0aWwudW53cmFwKHdyYXBwZXIpOwotCQlpZiAoIGFjdGl2aXR5ID09IG51bGwgKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQkKLQkJaWYgKCFwdWJsaXNoQURGb3JBY3Rpdml0eUV4dGVuc2lvbikKLQkJCXJldHVybiBudWxsOwotCQkvLyBJZiBleHRlbnNpb24gaXMgbW9kaWZpZWQgZG9uJ3QgZ2VuZXJhdGUgaXQuCi0JCWlmICghYWN0aXZpdHkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5pc0VtcHR5KCkpCi0JCQlyZXR1cm4gbnVsbDsKLQkJCi0JCS8vIENoZWNrIGFueSBjaGlsZCBpcyBzdXBwcmVzc2VkLiAKLQkJLy8gaWYgYW55IGNoaWxkIGlzIHN1cHByZXNlZCBkb24ndCBnZW5lcmF0ZSBkaWFncmFtCi0JCWlmKGFueUNoaWxkcmVuU3VwcHJlc3NlZChhY3Rpdml0eSwgZmlsdGVyLCBzdXBwcmVzc2lvbikpIAotCQkJcmV0dXJuIG51bGw7Ci0JCQotCQkvLyBDaGVjayB2YXJpYWJpbGl0eSBhbmQgYmFzZSdzIHZhcmlhYmlsaXR5LgotCQlWYXJpYWJpbGl0eUVsZW1lbnQgY2FsY3VsYXRlZEJhc2UgPSBjaGVja1ZhcmlhYmlsaXR5KGFjdGl2aXR5LAotCQkJCWZpbHRlciwgSURpYWdyYW1NYW5hZ2VyLkFDVElWSVRZX0RJQUdSQU0sIHRydWUpOwotCQlpZiAoY2FsY3VsYXRlZEJhc2UgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQl3cmFwcGVyID0gY2FsY3VsYXRlZEJhc2U7Ci0JCXJldHVybiAoQWN0aXZpdHkpd3JhcHBlcjsKLQl9Ci0JCi0JLyoqCi0JICogQHBhcmFtIHB1YkRpcgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFB1YkRpcihGaWxlIHB1YkRpcikgewotCQl0aGlzLnB1YkRpciA9IHB1YkRpcjsKLQl9Ci0JCi0JcHJpdmF0ZSBib29sZWFuIGlzRm9yWE1MRXhwb3J0KCkgewotCQlyZXR1cm4gZm9yWE1MRXhwb3J0OwotCX0KLQkKLQkvKioKLQkgKiBAcGFyYW0gZm9yWE1MRXhwb3J0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0Rm9yWE1MRXhwb3J0KGJvb2xlYW4gZm9yWE1MRXhwb3J0KSB7Ci0JCXRoaXMuZm9yWE1MRXhwb3J0ID0gZm9yWE1MRXhwb3J0OwotCX0KLQkKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vdWkvc2VydmljZS9EaWFncmFtVUlTZXJ2aWNlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vdWkvc2VydmljZS9EaWFncmFtVUlTZXJ2aWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhNjhlMTkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0udWkvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3VpL3NlcnZpY2UvRGlhZ3JhbVVJU2VydmljZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDg0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLnVpLnNlcnZpY2U7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU1vZGVsRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLkFjdGl2aXR5RmluYWxOb2RlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5BY3Rpdml0eUZpbmFsTm9kZU5hbWVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLkFjdGl2aXR5UGFyYW1ldGVyTm9kZTJFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLkFjdGl2aXR5UGFyYW1ldGVyTm9kZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZTJFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLkFjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLkNvbnRyb2xGbG93RWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5Db250cm9sRmxvd05hbWVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLkRlY2lzaW9uTm9kZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuRGVjaXNpb25Ob2RlTmFtZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuRm9ya05vZGVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLkluaXRpYWxOb2RlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5Jbml0aWFsTm9kZU5hbWVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLkpvaW5Ob2RlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5NZXJnZU5vZGVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLk1lcmdlTm9kZU5hbWVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGUyRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlM0VkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWUyRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZTNFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVOYW1lRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQucGFydC5BY3Rpdml0eURpYWdyYW1FZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5icmlkZ2UuQnJpZGdlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuc2VydmljZXMuRGlhZ3JhbU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0udWkuRGlhZ3JhbVVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5JdGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWlsZXN0b25lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUGhhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtCcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5zZXJ2aWNlcy5WaWV3U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5EaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkVkZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkFjdGl2aXR5RmluYWxOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkFjdGl2aXR5Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eVBhcmFtZXRlck5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuQ29udHJvbEZsb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuRGVjaXNpb25Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkZpbmFsTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5Gb3JrTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5Jbml0aWFsTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5Kb2luTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5NZXJnZU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5VTUxGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLlVNTFBhY2thZ2U7Ci0KLS8qKgotICogQSBVSSBzZXJ2aWNlIGZvciBleHRlcm5hbCBlY29yZSBtYXAgdG8gYWNlc3MgRVBGIERpYWdyYW1zIGFuZCBjcmVhdGluZwotICogZGlhZ3JhbSBlbGVtZW50cy4KLSAqIAotICogQGF1dGhvciBDaGluaCBWbwotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMgotICovCi1wdWJsaWMgY2xhc3MgRGlhZ3JhbVVJU2VydmljZSBpbXBsZW1lbnRzIElEaWFncmFtVUlTZXJ2aWNlIHsKLQotCXN0YXRpYyBib29sZWFuIGRlYnVnID0gRGlhZ3JhbVVJUGx1Z2luLmdldERlZmF1bHQoKS5pc0RlYnVnZ2luZygpOwotCi0JcHVibGljIHN0YXRpYyBIYXNoTWFwPFN0cmluZywgQ2xhc3M+IG5vZGVUeXBlc01hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgQ2xhc3M+KCk7Ci0KLQlwdWJsaWMgRGlhZ3JhbVVJU2VydmljZSgpIHsKLQotCQlub2RlVHlwZXNNYXAucHV0KElEaWFncmFtVUlTZXJ2aWNlLkFDVElWSVRZX05PREUsIEFjdGl2aXR5LmNsYXNzKTsKLQkJbm9kZVR5cGVzTWFwLnB1dChJRGlhZ3JhbVVJU2VydmljZS5QSEFTRV9OT0RFLCBQaGFzZS5jbGFzcyk7Ci0JCW5vZGVUeXBlc01hcC5wdXQoSURpYWdyYW1VSVNlcnZpY2UuSVRFUkFUSU9OX05PREUsIEl0ZXJhdGlvbi5jbGFzcyk7Ci0JCW5vZGVUeXBlc01hcC5wdXQoSURpYWdyYW1VSVNlcnZpY2UuVEFTS19ERVNDUklQVE9SX05PREUsCi0JCQkJVGFza0Rlc2NyaXB0b3IuY2xhc3MpOwotCQlub2RlVHlwZXNNYXAucHV0KElEaWFncmFtVUlTZXJ2aWNlLk1JTEVTVE9ORV9OT0RFLCBNaWxlc3RvbmUuY2xhc3MpOwotCQlub2RlVHlwZXNNYXAucHV0KElEaWFncmFtVUlTZXJ2aWNlLklOSVRJQUxfTk9ERSwgSW5pdGlhbE5vZGUuY2xhc3MpOwotCQlub2RlVHlwZXNNYXAucHV0KElEaWFncmFtVUlTZXJ2aWNlLkZJTkFMX05PREUsIEZpbmFsTm9kZS5jbGFzcyk7Ci0JCW5vZGVUeXBlc01hcC5wdXQoSURpYWdyYW1VSVNlcnZpY2UuRk9SS19OT0RFLCBGb3JrTm9kZS5jbGFzcyk7Ci0JCW5vZGVUeXBlc01hcC5wdXQoSURpYWdyYW1VSVNlcnZpY2UuSk9JTl9OT0RFLCBKb2luTm9kZS5jbGFzcyk7Ci0JCW5vZGVUeXBlc01hcC5wdXQoSURpYWdyYW1VSVNlcnZpY2UuTUVSR0VfTk9ERSwgTWVyZ2VOb2RlLmNsYXNzKTsKLQkJbm9kZVR5cGVzTWFwLnB1dChJRGlhZ3JhbVVJU2VydmljZS5ERUNJU0lPTl9OT0RFLCBEZWNpc2lvbk5vZGUuY2xhc3MpOwotCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS51aS5zZXJ2aWNlLklEaWFncmFtVUlTZXJ2aWNlI2NyZWF0ZUFjdGl2aXR5RGlhZ3JhbShvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5KQotCSAqLwotCXB1YmxpYyBEaWFncmFtIGNyZWF0ZUFjdGl2aXR5RGlhZ3JhbShBY3Rpdml0eSBhY3Rpdml0eSkgewkKLQkJRU9iamVjdCB1bWxBY3Rpdml0eSA9IFVNTEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZShVTUxQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRBY3Rpdml0eSgpKTsKLQkJaWYgKHVtbEFjdGl2aXR5IGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UudW1sMi51bWwuQWN0aXZpdHkpIHsKLQkJCSgob3JnLmVjbGlwc2UudW1sMi51bWwuQWN0aXZpdHkpdW1sQWN0aXZpdHkpLnNldE5hbWUoYWN0aXZpdHkuZ2V0TmFtZSgpKTsKLQkJfQotCQlpZiAodW1sQWN0aXZpdHkgaW5zdGFuY2VvZiBFTW9kZWxFbGVtZW50KSB7Ci0JCQlCcmlkZ2VIZWxwZXIuYXNzb2NpYXRlKChFTW9kZWxFbGVtZW50KSB1bWxBY3Rpdml0eSwgYWN0aXZpdHkpOwotCQl9Ci0JCQotCQkvLyBDcmVhdGUgZGlhZ3JhbQotCQlEaWFncmFtIGRpYWdyYW0gPSBWaWV3U2VydmljZS5jcmVhdGVEaWFncmFtKHVtbEFjdGl2aXR5LCBEaWFncmFtTWFuYWdlci5BRF9raW5kLAotCQkJCUFjdGl2aXR5RGlhZ3JhbUVkaXRvclBsdWdpbi5ESUFHUkFNX1BSRUZFUkVOQ0VTX0hJTlQpOwotCQlkaWFncmFtLnNldEVsZW1lbnQodW1sQWN0aXZpdHkpOwotCQlpZiAodW1sQWN0aXZpdHkgaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eSkgewotCQkJZGlhZ3JhbS5zZXROYW1lKGFjdGl2aXR5LmdldE5hbWUoKSk7Ci0JCX0KLQkJcmV0dXJuIGRpYWdyYW07Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS51aS5zZXJ2aWNlLklEaWFncmFtVUlTZXJ2aWNlI2NyZWF0ZUVkZ2Uob3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRGlhZ3JhbSwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXcsCi0JICogICAgICBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3KQotCSAqLwotCXB1YmxpYyBFZGdlIGNyZWF0ZUVkZ2UoRGlhZ3JhbSBkaWFncmFtLCBWaWV3IHNvdXJjZSwgVmlldyB0YXJnZXQsCi0JCQlTdHJpbmcgbGlua05hbWUpIHsKLQkJb3JnLmVjbGlwc2UudW1sMi51bWwuQWN0aXZpdHkgcGFyZW50QWN0aXZpdHkgPSBudWxsOwotCQlFT2JqZWN0IG9iaiA9IGRpYWdyYW0uZ2V0RWxlbWVudCgpOwotCQlpZiAob2JqIGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UudW1sMi51bWwuQWN0aXZpdHkpIHsKLQkJCXBhcmVudEFjdGl2aXR5ID0gKG9yZy5lY2xpcHNlLnVtbDIudW1sLkFjdGl2aXR5KSBvYmo7Ci0JCX0KLQkJaWYgKHBhcmVudEFjdGl2aXR5ICE9IG51bGwpIHsKLQkJCUNvbnRyb2xGbG93IGZsb3cgPSAob3JnLmVjbGlwc2UudW1sMi51bWwuQ29udHJvbEZsb3cpIHBhcmVudEFjdGl2aXR5Ci0JCQkJCS5jcmVhdGVFZGdlKGxpbmtOYW1lID0gKGxpbmtOYW1lICE9IG51bGwpID8gbGlua05hbWUgOiAiIiwJLy8kTk9OLU5MUy0xJAotCQkJCQkJCVVNTFBhY2thZ2UuZUlOU1RBTkNFLmdldENvbnRyb2xGbG93KCkpOwotCQkJaWYgKHNvdXJjZSAhPSBudWxsKSB7Ci0JCQkJaWYgKHNvdXJjZS5nZXRFbGVtZW50KCkgIT0gbnVsbCAmJiBzb3VyY2UuZ2V0RWxlbWVudCgpIGluc3RhbmNlb2YgQWN0aXZpdHlOb2RlKQotCQkJCQlmbG93LnNldFNvdXJjZSgoQWN0aXZpdHlOb2RlKSBzb3VyY2UuZ2V0RWxlbWVudCgpKTsKLQkJCX0KLQkJCWlmICh0YXJnZXQgIT0gbnVsbCkgewotCQkJCWlmICh0YXJnZXQuZ2V0RWxlbWVudCgpICE9IG51bGwgJiYgdGFyZ2V0LmdldEVsZW1lbnQoKSBpbnN0YW5jZW9mIEFjdGl2aXR5Tm9kZSkKLQkJCQkJZmxvdy5zZXRUYXJnZXQoKEFjdGl2aXR5Tm9kZSkgdGFyZ2V0LmdldEVsZW1lbnQoKSk7Ci0JCQl9Ci0JCQlpZiAoZmxvdyBpbnN0YW5jZW9mIENvbnRyb2xGbG93KSB7Ci0JCQkJRWRnZSBlZGdlID0gVmlld1NlcnZpY2UuY3JlYXRlRWRnZShzb3VyY2UsIHRhcmdldCwgZmxvdywKLQkJCQkJCW5ldyBJbnRlZ2VyKENvbnRyb2xGbG93RWRpdFBhcnQuVklTVUFMX0lEKS50b1N0cmluZygpLAotCQkJCQkJQWN0aXZpdHlEaWFncmFtRWRpdG9yUGx1Z2luLkRJQUdSQU1fUFJFRkVSRU5DRVNfSElOVCk7Ci0JCQkJVmlld1NlcnZpY2UuY3JlYXRlTm9kZShlZGdlLCBmbG93LCBuZXcgSW50ZWdlcigKLQkJCQkJCUNvbnRyb2xGbG93TmFtZUVkaXRQYXJ0LlZJU1VBTF9JRCkudG9TdHJpbmcoKSwKLQkJCQkJCUFjdGl2aXR5RGlhZ3JhbUVkaXRvclBsdWdpbi5ESUFHUkFNX1BSRUZFUkVOQ0VTX0hJTlQpOwotCQkJCQotCQkJCWlmIChzb3VyY2UgIT0gbnVsbCkgewotCQkJCQllZGdlLnNldFNvdXJjZShzb3VyY2UpOwkJCQkKLQkJCQl9Ci0JCQkJaWYgKHRhcmdldCAhPSBudWxsKSB7Ci0JCQkJCWVkZ2Uuc2V0VGFyZ2V0KHRhcmdldCk7CQkJCQkKLQkJCQl9Ci0JCQkJcmV0dXJuIGVkZ2U7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS51aS5zZXJ2aWNlLklEaWFncmFtVUlTZXJ2aWNlI2NyZWF0ZU5vZGUob3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRGlhZ3JhbSwKLQkgKiAgICAgIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIE5vZGUgY3JlYXRlTm9kZShEaWFncmFtIGRpYWdyYW0sIFN0cmluZyBub2RlVHlwZSwgU3RyaW5nIG5vZGVOYW1lKSB7Ci0JCW9yZy5lY2xpcHNlLnVtbDIudW1sLkFjdGl2aXR5IHBhcmVudEFjdGl2aXR5ID0gbnVsbDsKLQkJTm9kZSBub3RhdGlvbk5vZGUgPSBudWxsOwotCQlFT2JqZWN0IG9iaiA9IGRpYWdyYW0uZ2V0RWxlbWVudCgpOwotCQlpZiAob2JqIGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UudW1sMi51bWwuQWN0aXZpdHkpIHsKLQkJCXBhcmVudEFjdGl2aXR5ID0gKG9yZy5lY2xpcHNlLnVtbDIudW1sLkFjdGl2aXR5KSBvYmo7Ci0JCX0KLQotCQlpZiAocGFyZW50QWN0aXZpdHkgIT0gbnVsbCkgewotCQkJaWYgKG5vZGVUeXBlID09IElOSVRJQUxfTk9ERSkgewotCQkJCUFjdGl2aXR5Tm9kZSB1bWxOb2RlID0gKEluaXRpYWxOb2RlKSBwYXJlbnRBY3Rpdml0eS5jcmVhdGVOb2RlKAotCQkJCQkJbm9kZU5hbWUgPSAobm9kZU5hbWUgIT0gbnVsbCkgPyBub2RlTmFtZSA6ICIiLAkvLyROT04tTkxTLTEkCi0JCQkJCQlVTUxQYWNrYWdlLmVJTlNUQU5DRS5nZXRJbml0aWFsTm9kZSgpKTsKLQkJCQlub3RhdGlvbk5vZGUgPSBWaWV3U2VydmljZS5jcmVhdGVOb2RlKGRpYWdyYW0sIHVtbE5vZGUsCi0JCQkJCQluZXcgSW50ZWdlcihJbml0aWFsTm9kZUVkaXRQYXJ0LlZJU1VBTF9JRCkudG9TdHJpbmcoKSwKLQkJCQkJCUFjdGl2aXR5RGlhZ3JhbUVkaXRvclBsdWdpbi5ESUFHUkFNX1BSRUZFUkVOQ0VTX0hJTlQpOwotCQkJCVZpZXdTZXJ2aWNlLmNyZWF0ZU5vZGUobm90YXRpb25Ob2RlLCB1bWxOb2RlLCBuZXcgSW50ZWdlcigKLQkJCQkJCUluaXRpYWxOb2RlTmFtZUVkaXRQYXJ0LlZJU1VBTF9JRCkudG9TdHJpbmcoKSwKLQkJCQkJCUFjdGl2aXR5RGlhZ3JhbUVkaXRvclBsdWdpbi5ESUFHUkFNX1BSRUZFUkVOQ0VTX0hJTlQpOwotCQkJfSBlbHNlIGlmIChub2RlVHlwZSA9PSBGSU5BTF9OT0RFKSB7Ci0JCQkJQWN0aXZpdHlOb2RlIHVtbE5vZGUgPSAoQWN0aXZpdHlGaW5hbE5vZGUpIHBhcmVudEFjdGl2aXR5Ci0JCQkJCQkuY3JlYXRlTm9kZShub2RlTmFtZSA9IChub2RlTmFtZSAhPSBudWxsKSA/IG5vZGVOYW1lCi0JCQkJCQkJCTogIiIsIFVNTFBhY2thZ2UuZUlOU1RBTkNFLmdldEFjdGl2aXR5RmluYWxOb2RlKCkpOwkvLyROT04tTkxTLTEkCi0JCQkJbm90YXRpb25Ob2RlID0gVmlld1NlcnZpY2UuY3JlYXRlTm9kZShkaWFncmFtLCB1bWxOb2RlLAotCQkJCQkJbmV3IEludGVnZXIoQWN0aXZpdHlGaW5hbE5vZGVFZGl0UGFydC5WSVNVQUxfSUQpCi0JCQkJCQkJCS50b1N0cmluZygpLAotCQkJCQkJQWN0aXZpdHlEaWFncmFtRWRpdG9yUGx1Z2luLkRJQUdSQU1fUFJFRkVSRU5DRVNfSElOVCk7Ci0JCQkJVmlld1NlcnZpY2UuY3JlYXRlTm9kZShub3RhdGlvbk5vZGUsIHVtbE5vZGUsIG5ldyBJbnRlZ2VyKAotCQkJCQkJQWN0aXZpdHlGaW5hbE5vZGVOYW1lRWRpdFBhcnQuVklTVUFMX0lEKS50b1N0cmluZygpLAotCQkJCQkJQWN0aXZpdHlEaWFncmFtRWRpdG9yUGx1Z2luLkRJQUdSQU1fUFJFRkVSRU5DRVNfSElOVCk7Ci0JCQl9IGVsc2UgaWYgKG5vZGVUeXBlID09IEZPUktfTk9ERSkgewotCQkJCUFjdGl2aXR5Tm9kZSB1bWxOb2RlID0gKEZvcmtOb2RlKSBwYXJlbnRBY3Rpdml0eS5jcmVhdGVOb2RlKAotCQkJCQkJbm9kZU5hbWUgPSAobm9kZU5hbWUgIT0gbnVsbCkgPyBub2RlTmFtZSA6ICIiLAkvLyROT04tTkxTLTEkCi0JCQkJCQlVTUxQYWNrYWdlLmVJTlNUQU5DRS5nZXRGb3JrTm9kZSgpKTsKLQkJCQlub3RhdGlvbk5vZGUgPSBWaWV3U2VydmljZS5jcmVhdGVOb2RlKGRpYWdyYW0sIHVtbE5vZGUsCi0JCQkJCQluZXcgSW50ZWdlcihGb3JrTm9kZUVkaXRQYXJ0LlZJU1VBTF9JRCkudG9TdHJpbmcoKSwKLQkJCQkJCUFjdGl2aXR5RGlhZ3JhbUVkaXRvclBsdWdpbi5ESUFHUkFNX1BSRUZFUkVOQ0VTX0hJTlQpOwotCQkJfSBlbHNlIGlmIChub2RlVHlwZSA9PSBKT0lOX05PREUpIHsKLQkJCQlBY3Rpdml0eU5vZGUgdW1sTm9kZSA9IChKb2luTm9kZSkgcGFyZW50QWN0aXZpdHkuY3JlYXRlTm9kZSgKLQkJCQkJCW5vZGVOYW1lID0gKG5vZGVOYW1lICE9IG51bGwpID8gbm9kZU5hbWUgOiAiIiwJLy8kTk9OLU5MUy0xJAotCQkJCQkJVU1MUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Sm9pbk5vZGUoKSk7Ci0JCQkJbm90YXRpb25Ob2RlID0gVmlld1NlcnZpY2UuY3JlYXRlTm9kZShkaWFncmFtLCB1bWxOb2RlLAotCQkJCQkJbmV3IEludGVnZXIoSm9pbk5vZGVFZGl0UGFydC5WSVNVQUxfSUQpLnRvU3RyaW5nKCksCi0JCQkJCQlBY3Rpdml0eURpYWdyYW1FZGl0b3JQbHVnaW4uRElBR1JBTV9QUkVGRVJFTkNFU19ISU5UKTsKLQkJCX0gZWxzZSBpZiAobm9kZVR5cGUgPT0gREVDSVNJT05fTk9ERSkgewotCQkJCUFjdGl2aXR5Tm9kZSB1bWxOb2RlID0gKERlY2lzaW9uTm9kZSkgcGFyZW50QWN0aXZpdHkKLQkJCQkJCS5jcmVhdGVOb2RlKG5vZGVOYW1lID0gKG5vZGVOYW1lICE9IG51bGwpID8gbm9kZU5hbWUKLQkJCQkJCQkJOiAiIiwgVU1MUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RGVjaXNpb25Ob2RlKCkpOwkvLyROT04tTkxTLTEkCi0JCQkJbm90YXRpb25Ob2RlID0gVmlld1NlcnZpY2UuY3JlYXRlTm9kZShkaWFncmFtLCB1bWxOb2RlLAotCQkJCQkJbmV3IEludGVnZXIoRGVjaXNpb25Ob2RlRWRpdFBhcnQuVklTVUFMX0lEKS50b1N0cmluZygpLAotCQkJCQkJQWN0aXZpdHlEaWFncmFtRWRpdG9yUGx1Z2luLkRJQUdSQU1fUFJFRkVSRU5DRVNfSElOVCk7Ci0JCQkJVmlld1NlcnZpY2UuY3JlYXRlTm9kZShub3RhdGlvbk5vZGUsIHVtbE5vZGUsIG5ldyBJbnRlZ2VyKAotCQkJCQkJRGVjaXNpb25Ob2RlTmFtZUVkaXRQYXJ0LlZJU1VBTF9JRCkudG9TdHJpbmcoKSwKLQkJCQkJCUFjdGl2aXR5RGlhZ3JhbUVkaXRvclBsdWdpbi5ESUFHUkFNX1BSRUZFUkVOQ0VTX0hJTlQpOwotCQkJfSBlbHNlIGlmIChub2RlVHlwZSA9PSBNRVJHRV9OT0RFKSB7Ci0JCQkJQWN0aXZpdHlOb2RlIHVtbE5vZGUgPSAoTWVyZ2VOb2RlKSBwYXJlbnRBY3Rpdml0eS5jcmVhdGVOb2RlKAotCQkJCQkJbm9kZU5hbWUgPSAobm9kZU5hbWUgIT0gbnVsbCkgPyBub2RlTmFtZSA6ICIiLAkJCS8vJE5PTi1OTFMtMSQKLQkJCQkJCVVNTFBhY2thZ2UuZUlOU1RBTkNFLmdldE1lcmdlTm9kZSgpKTsKLQkJCQlub3RhdGlvbk5vZGUgPSBWaWV3U2VydmljZS5jcmVhdGVOb2RlKGRpYWdyYW0sIHVtbE5vZGUsCi0JCQkJCQluZXcgSW50ZWdlcihNZXJnZU5vZGVFZGl0UGFydC5WSVNVQUxfSUQpLnRvU3RyaW5nKCksCi0JCQkJCQlBY3Rpdml0eURpYWdyYW1FZGl0b3JQbHVnaW4uRElBR1JBTV9QUkVGRVJFTkNFU19ISU5UKTsKLQkJCQlWaWV3U2VydmljZS5jcmVhdGVOb2RlKG5vdGF0aW9uTm9kZSwgdW1sTm9kZSwgbmV3IEludGVnZXIoCi0JCQkJCQlNZXJnZU5vZGVOYW1lRWRpdFBhcnQuVklTVUFMX0lEKS50b1N0cmluZygpLAotCQkJCQkJQWN0aXZpdHlEaWFncmFtRWRpdG9yUGx1Z2luLkRJQUdSQU1fUFJFRkVSRU5DRVNfSElOVCk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gbm90YXRpb25Ob2RlOwotCX0KLQotCS8qCQotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLnVpLnNlcnZpY2UuSURpYWdyYW1VSVNlcnZpY2UjY3JlYXRlTm9kZShvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5EaWFncmFtLAotCSAqICAgICAgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrQnJlYWtkb3duRWxlbWVudCkKLQkgKi8KLQlwdWJsaWMgTm9kZSBjcmVhdGVOb2RlKERpYWdyYW0gZGlhZ3JhbSwgV29ya0JyZWFrZG93bkVsZW1lbnQgZSkgewotCQlvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eSBwYXJlbnRBY3Rpdml0eSA9IG51bGw7Ci0JCU5vZGUgbm90YXRpb25Ob2RlID0gbnVsbDsKLQkJRU9iamVjdCBvYmogPSBkaWFncmFtLmdldEVsZW1lbnQoKTsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLnVtbDIudW1sLkFjdGl2aXR5KSB7Ci0JCQlwYXJlbnRBY3Rpdml0eSA9IChvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eSkgb2JqOwotCQl9Ci0JCVN0cmluZyBuYW1lID0gIiI7CS8vJE5PTi1OTFMtMSQKLQkJaWYoZS5nZXRQcmVzZW50YXRpb25OYW1lKCkgIT0gbnVsbCl7Ci0JCQluYW1lID0gZS5nZXRQcmVzZW50YXRpb25OYW1lKCk7Ci0JCX1lbHNlewotCQkJbmFtZSA9IGUuZ2V0TmFtZSgpOwotCQl9Ci0JCQotCQlpZiAocGFyZW50QWN0aXZpdHkgIT0gbnVsbCkgewotCQkJaWYgKGUgaW5zdGFuY2VvZiBQaGFzZSkgewotCQkJCS8vIFBoYXNlCi0JCQkJQWN0aXZpdHlOb2RlIHVtbE5vZGUgPSAoU3RydWN0dXJlZEFjdGl2aXR5Tm9kZSkgcGFyZW50QWN0aXZpdHkKLQkJCQkJCS5jcmVhdGVOb2RlKG5hbWUsCi0JCQkJCQkJCVVNTFBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJLmdldFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUoKSk7Ci0KLQkJCQlCcmlkZ2VIZWxwZXIuYXNzb2NpYXRlKHVtbE5vZGUsICgoTWV0aG9kRWxlbWVudCkgZSkpOwotCi0JCQkJbm90YXRpb25Ob2RlID0gVmlld1NlcnZpY2UuY3JlYXRlTm9kZShkaWFncmFtLCB1bWxOb2RlLAotCQkJCQkJbmV3IEludGVnZXIoU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTJFZGl0UGFydC5WSVNVQUxfSUQpCi0JCQkJCQkJCS50b1N0cmluZygpLAotCQkJCQkJQWN0aXZpdHlEaWFncmFtRWRpdG9yUGx1Z2luLkRJQUdSQU1fUFJFRkVSRU5DRVNfSElOVCk7Ci0JCQkJVmlld1NlcnZpY2UuY3JlYXRlTm9kZShub3RhdGlvbk5vZGUsIHVtbE5vZGUsIG5ldyBJbnRlZ2VyKAotCQkJCQkJU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWUyRWRpdFBhcnQuVklTVUFMX0lEKQotCQkJCQkJLnRvU3RyaW5nKCksCi0JCQkJCQlBY3Rpdml0eURpYWdyYW1FZGl0b3JQbHVnaW4uRElBR1JBTV9QUkVGRVJFTkNFU19ISU5UKTsKLQotCQkJfSBlbHNlIGlmIChlIGluc3RhbmNlb2YgSXRlcmF0aW9uKSB7Ci0JCQkJLy8gSXRlcmF0aW9uCi0JCQkJQWN0aXZpdHlOb2RlIHVtbE5vZGUgPSAoU3RydWN0dXJlZEFjdGl2aXR5Tm9kZSkgcGFyZW50QWN0aXZpdHkKLQkJCQkJCS5jcmVhdGVOb2RlKG5hbWUsCi0JCQkJCQkJCVVNTFBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJLmdldFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUoKSk7Ci0KLQkJCQlCcmlkZ2VIZWxwZXIuYXNzb2NpYXRlKHVtbE5vZGUsICgoTWV0aG9kRWxlbWVudCkgZSkpOwotCi0JCQkJbm90YXRpb25Ob2RlID0gVmlld1NlcnZpY2UuY3JlYXRlTm9kZShkaWFncmFtLCB1bWxOb2RlLAotCQkJCQkJbmV3IEludGVnZXIoU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTNFZGl0UGFydC5WSVNVQUxfSUQpCi0JCQkJCQkJCS50b1N0cmluZygpLAotCQkJCQkJQWN0aXZpdHlEaWFncmFtRWRpdG9yUGx1Z2luLkRJQUdSQU1fUFJFRkVSRU5DRVNfSElOVCk7Ci0JCQkJVmlld1NlcnZpY2UuY3JlYXRlTm9kZShub3RhdGlvbk5vZGUsIHVtbE5vZGUsIG5ldyBJbnRlZ2VyKAotCQkJCQkJU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWUzRWRpdFBhcnQuVklTVUFMX0lEKQotCQkJCQkJLnRvU3RyaW5nKCksCi0JCQkJCQlBY3Rpdml0eURpYWdyYW1FZGl0b3JQbHVnaW4uRElBR1JBTV9QUkVGRVJFTkNFU19ISU5UKTsKLQkJCX0gZWxzZSBpZiAoZSBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJLy8gQWN0aXZpdHkKLQkJCQlBY3Rpdml0eU5vZGUgdW1sTm9kZSA9IChTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlKSBwYXJlbnRBY3Rpdml0eQotCQkJCQkJLmNyZWF0ZU5vZGUobmFtZSwKLQkJCQkJCQkJVU1MUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCQkuZ2V0U3RydWN0dXJlZEFjdGl2aXR5Tm9kZSgpKTsKLQotCQkJCUJyaWRnZUhlbHBlci5hc3NvY2lhdGUodW1sTm9kZSwgKChNZXRob2RFbGVtZW50KSBlKSk7Ci0KLQkJCQlub3RhdGlvbk5vZGUgPSBWaWV3U2VydmljZS5jcmVhdGVOb2RlKGRpYWdyYW0sIHVtbE5vZGUsCi0JCQkJCQluZXcgSW50ZWdlcihTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlRWRpdFBhcnQuVklTVUFMX0lEKQotCQkJCQkJCQkudG9TdHJpbmcoKSwKLQkJCQkJCUFjdGl2aXR5RGlhZ3JhbUVkaXRvclBsdWdpbi5ESUFHUkFNX1BSRUZFUkVOQ0VTX0hJTlQpOwotCQkJCVZpZXdTZXJ2aWNlLmNyZWF0ZU5vZGUobm90YXRpb25Ob2RlLCB1bWxOb2RlLCBuZXcgSW50ZWdlcigKLQkJCQkJCVN0cnVjdHVyZWRBY3Rpdml0eU5vZGVOYW1lRWRpdFBhcnQuVklTVUFMX0lEKQotCQkJCQkJLnRvU3RyaW5nKCksCi0JCQkJCQlBY3Rpdml0eURpYWdyYW1FZGl0b3JQbHVnaW4uRElBR1JBTV9QUkVGRVJFTkNFU19ISU5UKTsKLQkJCX0gZWxzZSBpZiAoZSBpbnN0YW5jZW9mIFRhc2tEZXNjcmlwdG9yKSB7Ci0JCQkJLy8gVGFzayBkZXNjcmlwdG9yCi0JCQkJQWN0aXZpdHlOb2RlIHVtbE5vZGUgPSAoQWN0aXZpdHlQYXJhbWV0ZXJOb2RlKSBwYXJlbnRBY3Rpdml0eQotCQkJCQkJLmNyZWF0ZU5vZGUobmFtZSwKLQkJCQkJCQkJVU1MUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QWN0aXZpdHlQYXJhbWV0ZXJOb2RlKCkpOwotCi0JCQkJQnJpZGdlSGVscGVyLmFzc29jaWF0ZSh1bWxOb2RlLCAoKE1ldGhvZEVsZW1lbnQpIGUpKTsKLQotCQkJCW5vdGF0aW9uTm9kZSA9IFZpZXdTZXJ2aWNlLmNyZWF0ZU5vZGUoZGlhZ3JhbSwgdW1sTm9kZSwKLQkJCQkJCW5ldyBJbnRlZ2VyKEFjdGl2aXR5UGFyYW1ldGVyTm9kZUVkaXRQYXJ0LlZJU1VBTF9JRCkKLQkJCQkJCQkJLnRvU3RyaW5nKCksCi0JCQkJCQlBY3Rpdml0eURpYWdyYW1FZGl0b3JQbHVnaW4uRElBR1JBTV9QUkVGRVJFTkNFU19ISU5UKTsKLQkJCQlWaWV3U2VydmljZQotCQkJCQkJLmNyZWF0ZU5vZGUoCi0JCQkJCQkJCW5vdGF0aW9uTm9kZSwKLQkJCQkJCQkJdW1sTm9kZSwKLQkJCQkJCQkJbmV3IEludGVnZXIoCi0JCQkJCQkJCQkJQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZUVkaXRQYXJ0LlZJU1VBTF9JRCkKLQkJCQkJCQkJCQkudG9TdHJpbmcoKSwKLQkJCQkJCQkJQWN0aXZpdHlEaWFncmFtRWRpdG9yUGx1Z2luLkRJQUdSQU1fUFJFRkVSRU5DRVNfSElOVCk7Ci0JCQl9IGVsc2UgaWYgKGUgaW5zdGFuY2VvZiBNaWxlc3RvbmUpIHsKLQkJCQkvLyBNaWxlc3RvbmUKLQkJCQlBY3Rpdml0eU5vZGUgdW1sTm9kZSA9IChBY3Rpdml0eVBhcmFtZXRlck5vZGUpIHBhcmVudEFjdGl2aXR5Ci0JCQkJCQkuY3JlYXRlTm9kZShuYW1lLAotCQkJCQkJCQlVTUxQYWNrYWdlLmVJTlNUQU5DRS5nZXRBY3Rpdml0eVBhcmFtZXRlck5vZGUoKSk7Ci0KLQkJCQlCcmlkZ2VIZWxwZXIuYXNzb2NpYXRlKHVtbE5vZGUsICgoTWV0aG9kRWxlbWVudCkgZSkpOwotCi0JCQkJbm90YXRpb25Ob2RlID0gVmlld1NlcnZpY2UuY3JlYXRlTm9kZShkaWFncmFtLCB1bWxOb2RlLAotCQkJCQkJbmV3IEludGVnZXIoQWN0aXZpdHlQYXJhbWV0ZXJOb2RlMkVkaXRQYXJ0LlZJU1VBTF9JRCkKLQkJCQkJCQkJLnRvU3RyaW5nKCksCi0JCQkJCQlBY3Rpdml0eURpYWdyYW1FZGl0b3JQbHVnaW4uRElBR1JBTV9QUkVGRVJFTkNFU19ISU5UKTsKLQkJCQlWaWV3U2VydmljZS5jcmVhdGVOb2RlKG5vdGF0aW9uTm9kZSwgdW1sTm9kZSwgbmV3IEludGVnZXIoCi0JCQkJCQlBY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lMkVkaXRQYXJ0LlZJU1VBTF9JRCkKLQkJCQkJCS50b1N0cmluZygpLAotCQkJCQkJQWN0aXZpdHlEaWFncmFtRWRpdG9yUGx1Z2luLkRJQUdSQU1fUFJFRkVSRU5DRVNfSElOVCk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gbm90YXRpb25Ob2RlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0udWkuc2VydmljZS5JRGlhZ3JhbVVJU2VydmljZSNnZXRFZGdlcyhvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5EaWFncmFtKQotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRFZGdlcyhEaWFncmFtIGRpYWdyYW0pIHsKLQkJcmV0dXJuIGRpYWdyYW0uZ2V0UGVyc2lzdGVkRWRnZXMoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFsbCBkaWFncmFtIG5vZGVzIGluIHRoZSBkaWFncmFtCi0JICogCi0JICogQHBhcmFtIGRpYWdyYW0KLQkgKiBAcGFyYW0gbm9kZVR5cGUKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIEVMaXN0IGdldEFsbE5vZGVzKERpYWdyYW0gZGlhZ3JhbSkgewotCQlpZiAoZGlhZ3JhbSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gZGlhZ3JhbS5nZXRQZXJzaXN0ZWRDaGlsZHJlbigpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0udWkuc2VydmljZS5JRGlhZ3JhbVVJU2VydmljZSNnZXROb2RlcyhvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5EaWFncmFtLAotCSAqICAgICAgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eSwgamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgTGlzdDxOb2RlPiBnZXROb2RlcyhEaWFncmFtIGRpYWdyYW0sIEFjdGl2aXR5IGFjdGl2aXR5LAotCQkJU3RyaW5nIG5vZGVUeXBlKSB7Ci0JCUxpc3Q8Tm9kZT4gbm9kZXMgPSBuZXcgQXJyYXlMaXN0PE5vZGU+KCk7Ci0JCWlmIChkaWFncmFtICE9IG51bGwpIHsKLQkJCUxpc3QgYWxsTm9kZXMgPSBkaWFncmFtLmdldFBlcnNpc3RlZENoaWxkcmVuKCk7Ci0KLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGFsbE5vZGVzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCU5vZGUgbm9kZSA9IChOb2RlKSBpdGVyLm5leHQoKTsKLQkJCQlFT2JqZWN0IGVsZW1lbnQgPSBub2RlLmdldEVsZW1lbnQoKTsKLQkJCQlDbGFzcyBjbGFzc1R5cGUgPSAoQ2xhc3MpIG5vZGVUeXBlc01hcC5nZXQobm9kZVR5cGUpOwotCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgRU1vZGVsRWxlbWVudCkgewotCQkJCQlNZXRob2RFbGVtZW50IGV4ID0gQnJpZGdlSGVscGVyCi0JCQkJCQkJLmdldE1ldGhvZEVsZW1lbnRGcm9tQW5ub3RhdGlvbigKLQkJCQkJCQkJCShFTW9kZWxFbGVtZW50KSBlbGVtZW50LCBhY3Rpdml0eQotCQkJCQkJCQkJCQkuZVJlc291cmNlKCkuZ2V0UmVzb3VyY2VTZXQoKSk7Ci0JCQkJCWlmIChleCAhPSBudWxsICYmIGNsYXNzVHlwZS5pc0luc3RhbmNlKGV4KSkgewotCQkJCQkJbm9kZXMuYWRkKG5vZGUpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJaWYgKGNsYXNzVHlwZSAhPSBudWxsICYmIGNsYXNzVHlwZS5pc0luc3RhbmNlKGVsZW1lbnQpKSB7Ci0JCQkJCQkJbm9kZXMuYWRkKG5vZGUpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBub2RlczsKLQl9Ci0KLS8vCXByaXZhdGUgc3RhdGljIERpYWdyYW0gZ2V0RGlhZ3JhbShBY3Rpdml0eSBhY3Rpdml0eSwgaW50IHR5cGUsCi0vLwkJCWJvb2xlYW4gY3JlYXRlKSB7Ci0vLwkJRGlhZ3JhbSBkaWFncmFtID0gbnVsbDsKLS8vCQlEaWFncmFtTWFuYWdlciBkTWdyID0gRGlhZ3JhbU1hbmFnZXIuZ2V0SW5zdGFuY2UoVG5nVXRpbAotLy8JCQkJLmdldE93bmluZ1Byb2Nlc3MoYWN0aXZpdHkpKTsKLS8vCi0vLwkJaWYgKGRNZ3IgIT0gbnVsbCkgewotLy8JCQl0cnkgewotLy8JCQkJTGlzdCBsaXN0ID0gZE1nci5nZXREaWFncmFtcyhhY3Rpdml0eSwgdHlwZSk7Ci0vLwkJCQlpZiAoIWxpc3QuaXNFbXB0eSgpKSB7Ci0vLwkJCQkJZGlhZ3JhbSA9IChEaWFncmFtKSBsaXN0LmdldCgwKTsKLS8vCQkJCX0KLS8vCQkJCWlmIChkaWFncmFtID09IG51bGwgJiYgY3JlYXRlKSB7Ci0vLwkJCQkJZGlhZ3JhbSA9IGRNZ3IuY3JlYXRlRGlhZ3JhbShhY3Rpdml0eSwgdHlwZSwKLS8vCQkJCQkJCWdldERpYWdyYW1QcmVmZXJlbmNlc0hpbnQodHlwZSkpOwotLy8JCQkJfQotLy8JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotLy8JCQkJaWYgKGRlYnVnKSB7Ci0vLwkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJDb3JlIGVycm9yIGNyZWF0aW5nIGEgZGlhZ3JhbToiIC8vJE5PTi1OTFMtMSQKLS8vCQkJCQkJCSsgZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotLy8JCQkJfQotLy8JCQkJRGlhZ3JhbVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcigKLS8vCQkJCQkJIkNvcmUgZXJyb3IgY3JlYXRpbmcgYSBkaWFncmFtOiIsIGUpOyAvLyROT04tTkxTLTEkCi0vLwkJCX0gZmluYWxseSB7Ci0vLwkJCQlpZiAoZE1nciAhPSBudWxsKSB7Ci0vLwkJCQkJZE1nci5yZWxlYXNlKCk7Ci0vLwkJCQl9Ci0vLwkJCX0KLS8vCQl9Ci0vLwkJcmV0dXJuIGRpYWdyYW07Ci0vLwl9Ci0KLS8vCXB1YmxpYyBzdGF0aWMgUHJlZmVyZW5jZXNIaW50IGdldERpYWdyYW1QcmVmZXJlbmNlc0hpbnQoaW50IGRpYWdyYW1UeXBlKSB7Ci0vLwkJc3dpdGNoIChkaWFncmFtVHlwZSkgewotLy8JCWNhc2UgSURpYWdyYW1NYW5hZ2VyLkFDVElWSVRZX0RJQUdSQU06Ci0vLwkJCXJldHVybiBBY3Rpdml0eURpYWdyYW1FZGl0b3JQbHVnaW4uRElBR1JBTV9QUkVGRVJFTkNFU19ISU5UOwotLy8JCWNhc2UgSURpYWdyYW1NYW5hZ2VyLkFDVElWSVRZX0RFVEFJTF9ESUFHUkFNOgotLy8JCQlyZXR1cm4gQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9yUGx1Z2luLkRJQUdSQU1fUFJFRkVSRU5DRVNfSElOVDsKLS8vCQljYXNlIElEaWFncmFtTWFuYWdlci5XT1JLX1BST0RVQ1RfREVQRU5ERU5DWV9ESUFHUkFNOgotLy8JCQlyZXR1cm4gV1BERGlhZ3JhbUVkaXRvclBsdWdpbi5ESUFHUkFNX1BSRUZFUkVOQ0VTX0hJTlQ7Ci0vLwkJfQotLy8JCXJldHVybiBudWxsOwotLy8JfQotCi0vLwlwdWJsaWMgc3RhdGljIHZvaWQgb3BlbkRpYWdyYW0oSUVkaXRvclBhcnQgcGFydCwgaW50IGRpYWdyYW1UeXBlLAotLy8JCQlPYmplY3Qgc2VsZWN0ZWRPYmplY3QsIFN1cHByZXNzaW9uIHN1cHByZXNzaW9uKSB7Ci0vLwkJdHJ5IHsKLS8vCQkJRGlhZ3JhbUVkaXRvcklucHV0IGlucHV0ID0gbmV3IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUucGFydC5EaWFncmFtRWRpdG9ySW5wdXQoCi0vLwkJCQkJc2VsZWN0ZWRPYmplY3QsIHN1cHByZXNzaW9uLCBkaWFncmFtVHlwZSk7Ci0vLwkJCURpYWdyYW1FZGl0b3JVdGlsLm9wZW5EaWFncmFtRWRpdG9yKHBhcnQuZ2V0U2l0ZSgpLmdldFBhZ2UoKSwKLS8vCQkJCQlpbnB1dCwgZ2V0RGlhZ3JhbVByZWZlcmVuY2VzSGludChkaWFncmFtVHlwZSksCi0vLwkJCQkJbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0vLwkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0vLwkJCURpYWdyYW1VSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0vLwkJfQotLy8JfQotCi0vLwlwdWJsaWMgc3RhdGljIERpYWdyYW0gZ2V0RGlhZ3JhbShBY3Rpdml0eSBhY3Rpdml0eSwgaW50IHR5cGUpIHsKLS8vCQlyZXR1cm4gZ2V0RGlhZ3JhbShhY3Rpdml0eSwgdHlwZSwgZmFsc2UpOwotLy8JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0udWkvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3VpL3NlcnZpY2UvSURpYWdyYW1JbWFnZVNlcnZpY2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS91aS9zZXJ2aWNlL0lEaWFncmFtSW1hZ2VTZXJ2aWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkNDMzYjAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0udWkvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3VpL3NlcnZpY2UvSURpYWdyYW1JbWFnZVNlcnZpY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLnVpLnNlcnZpY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlN1cHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5kaWFncmFtLklBY3Rpdml0eURpYWdyYW1TZXJ2aWNlOwotCi0vKioKLSAqIEludGVyZmFjZSBmb3IgdGhlIGdlbmVyYXRpbmcgZGlhZ3JhbSBpbWFnZS4gIAotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSURpYWdyYW1JbWFnZVNlcnZpY2UgZXh0ZW5kcyBJQWN0aXZpdHlEaWFncmFtU2VydmljZSB7Ci0KLQkvKioKLQkgKiBHZW5lcmF0ZXMgdGhlIGRpYWdyYW0gaW1hZ2UgZm9yIGdpdmVuIGFjdGl2aXR5IGFuZCByZXR1cm5zIGRpYWdyYW0gaW1hZ2UgcGF0aCBzdHJpbmcuCi0JICogVGhpcyBtZXRob2QgZG9uJ3QgY2FsY3VsYXRlIHRoZSBpbWFnZSBtYXAgZm9yIGdlbmVyYXRlZCBkaWFncmFtIGltYWdlLiAgSW4gb3JkZXIgdG8gY2FsY3VsYXRlCi0JICogSW1hZ2UgZm9yIGdlbmVyYXRlZCBkaWFncmFtIHVzZSB7QGxpbmsgSUFjdGl2aXR5RGlhZ3JhbVNlcnZpY2V9J3Mgc2F2ZURpYWdyYW0oT2JqZWN0IHdyYXBlciwgU3RyaW5nIGltZ1BhdGgsIFN0cmluZyBkaWFncmFtVHlwZSwKLQkJCUlGaWx0ZXIgZmlsdGVyLCBTdXBwcmVzc2lvbiBzdXApOyAKLQkgKiBAcGFyYW0gd3JhcHBlcgotCSAqIEBwYXJhbSBpbWdQYXRoCi0JICogQHBhcmFtIGRpYWdyYW1UeXBlCi0JICogQHBhcmFtIGZpbHRlcgotCSAqIEBwYXJhbSBzdXAKLQkgKiBAcGFyYW0gcmVhbGl6ZWREaWFncmFtCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2VuZXJhdGVEaWFncmFtSW1hZ2UoZmluYWwgT2JqZWN0IHdyYXBwZXIsIGZpbmFsIFN0cmluZyBpbWdQYXRoLCAKLQkJCWZpbmFsIGludCBkaWFncmFtVHlwZSwgZmluYWwgSUZpbHRlciBmaWx0ZXIsCi0JCQlmaW5hbCBTdXBwcmVzc2lvbiBzdXAsIGZpbmFsIGJvb2xlYW4gcmVhbGl6ZWREaWFncmFtKTsKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS91aS9zZXJ2aWNlL0lEaWFncmFtVUlTZXJ2aWNlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vdWkvc2VydmljZS9JRGlhZ3JhbVVJU2VydmljZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NjQ2YTY0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS91aS9zZXJ2aWNlL0lEaWFncmFtVUlTZXJ2aWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0udWkuc2VydmljZTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5EaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkVkZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotCi0vKioKLSAqIENsYXNzIGZvciBtYXBwaW5nIGJldHdlZW4gQWN0aXZpdHkgRGlhZ3JhbQotICogCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAYXV0aG9yIENoaW5oIFZvCi0gKiBAc2luY2UgMS4yCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSURpYWdyYW1VSVNlcnZpY2UgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNUSVZJVFlfTk9ERSA9ICJBY3Rpdml0eSI7CS8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBIQVNFX05PREUgPSAiUGhhc2UiOwkJLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSVRFUkFUSU9OX05PREUgPSAiSXRlcmF0aW9uIjsJLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFTS19ERVNDUklQVE9SX05PREUgPSAiVGFza0Rlc2NyaXB0b3IiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNSUxFU1RPTkVfTk9ERSA9ICJNaWxlc3RvbmUiOwkvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTklUSUFMX05PREUgPSAiSW5pdGlhbE5vZGUiOwkvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGSU5BTF9OT0RFID0gIkZpbmFsTm9kZSI7CQkvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JLX05PREUgPSAiRm9ya05vZGUiOwkJCS8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpPSU5fTk9ERSA9ICJKb2luTm9kZSI7CQkJLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVSR0VfTk9ERSA9ICJNZXJnZU5vZGUiOwkJLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVDSVNJT05fTk9ERSA9ICJEZWNpc2lvbk5vZGUiOwkvLyROT04tTkxTLTEkCi0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIGFsbCBkaWFncmFtIG5vZGVzIGluIHRoZSBkaWFncmFtCi0JICogQHBhcmFtIGRpYWdyYW0KLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIEVMaXN0IGdldEFsbE5vZGVzKERpYWdyYW0gZGlhZ3JhbSk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gZGlhZ3JhbSBub2RlIGZvciBnaXZlbiBub2RlIHR5cGUgdW5kZXIgZ2l2ZW4gYWN0aXZpdHkgYW5kIGRpYWdyYW0KLQkgKiBAcGFyYW0gZGlhZ3JhbQotCSAqIEBwYXJhbSBhY3Rpdml0eQotCSAqIEBwYXJhbSBub2RlVHlwZQotCSAqIAkJCWUuZy4gSURpYWdyYW1VSVNlcnZpY2UuQUNUSVZJVFlfTk9ERSwgZXRjCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBMaXN0PE5vZGU+IGdldE5vZGVzKERpYWdyYW0gZGlhZ3JhbSwgQWN0aXZpdHkgYWN0aXZpdHksCi0JCQlTdHJpbmcgbm9kZVR5cGUpOwotCi0JLyoqCi0JICogVG8gY3JlYXRlIGEgbGluawotCSAqIAotCSAqIEBwYXJhbSBkaWFncmFtCi0JICogQHBhcmFtIHNvdXJjZQotCSAqIEBwYXJhbSB0YXJnZXQKLQkgKiBAcGFyYW0gbGlua05hbWUKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIEVkZ2UgY3JlYXRlRWRnZShEaWFncmFtIGRpYWdyYW0sIFZpZXcgc291cmNlLCBWaWV3IHRhcmdldCwgU3RyaW5nIGxpbmtOYW1lKTsKLQotCS8qKgotCSAqIENyZWF0ZXMgZGlhZ2FtIG5vZGUgZm9yIHRoZSBnaXZlbiBub2RlIHR5cGUKLQkgKiAKLQkgKiBAcGFyYW0gZGlhZ3JhbQotCSAqIEBwYXJhbSBub2RlVHlwZQotCSAqIEBwYXJhbSBub2RlTmFtZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgTm9kZSBjcmVhdGVOb2RlKERpYWdyYW0gZGlhZ3JhbSwgU3RyaW5nIG5vZGVUeXBlLCBTdHJpbmcgbm9kZU5hbWUpOwotCi0JLyoqCi0JICogQ3JlYXRlIGRpYWdyYW0gbm9kZSBmb3IgdGhlIGdpdmVuIHdvcmsgYnJlYWtkb3duIGVsZW1lbnQKLQkgKiBAcGFyYW0gZGlhZ3JhbQotCSAqIEBwYXJhbSB3YmVFbGVtZW50Ci0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBOb2RlIGNyZWF0ZU5vZGUoRGlhZ3JhbSBkaWFncmFtLCBXb3JrQnJlYWtkb3duRWxlbWVudCB3YmVFbGVtZW50KTsKLQotCS8qKgotCSAqIFJldHVybnMgYWxsIGVkZ2VzIGluIHRoZSBkaWFncmFtCi0JICogQHBhcmFtIGRpYWdyYW0KLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIEVMaXN0IGdldEVkZ2VzKERpYWdyYW0gZGlhZ3JhbSk7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGFjdGl2aXR5IGRpYWdyYW0gZm9yIHRoZSBnaXZlbiBhY3Rpdml0eS4KLQkgKiAKLQkgKiBAcGFyYW0gYWN0aXZpdHkKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIERpYWdyYW0gY3JlYXRlQWN0aXZpdHlEaWFncmFtKEFjdGl2aXR5IGFjdGl2aXR5KTsKLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0udWkvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3VpL3ZpZXdlci9BYnN0cmFjdERpYWdyYW1HcmFwaGljYWxWaWV3ZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS91aS92aWV3ZXIvQWJzdHJhY3REaWFncmFtR3JhcGhpY2FsVmlld2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkZmYxYTguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0udWkvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3VpL3ZpZXdlci9BYnN0cmFjdERpYWdyYW1HcmFwaGljYWxWaWV3ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS51aS52aWV3ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuQ29sb3JDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlNXVEdyYXBoaWNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuRGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlN1cHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5kaWFncmFtLkRpYWdyYW1JbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5HcmFwaGljYWxWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkxheWVyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cGFydHMuTGF5ZXJNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cGFydHMuU2NhbGFibGVGcmVlZm9ybVJvb3RFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYudWkucGFydHMuU2Nyb2xsaW5nR3JhcGhpY2FsVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5HQzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLQotCi0vKioKLSAqIFRoZSBhYnN0cmFjdCBiYXNlIGNsYXNzIGZvciBhIGdyYXBoaWNhbCB2aWV3ZXIgb2YgdGhlIGVsZW1lbnQgZGlhZ3JhbS4KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3REaWFncmFtR3JhcGhpY2FsVmlld2VyIHsKLQotCXByb3RlY3RlZCBDb21wb3NpdGUgcGFyZW50OwotCi0JcHJvdGVjdGVkIEdyYXBoaWNhbFZpZXdlciBncmFwaGljYWxWaWV3ZXI7Ci0KLQlwcm90ZWN0ZWQgT2JqZWN0IHdyYXBwZXI7Ci0KLQlwdWJsaWMgQWJzdHJhY3REaWFncmFtR3JhcGhpY2FsVmlld2VyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0JCWNyZWF0ZUdyYXBoaWNhbFZpZXdlcigpOwotCX0KLQotCXB1YmxpYyBBYnN0cmFjdERpYWdyYW1HcmFwaGljYWxWaWV3ZXIoQ29tcG9zaXRlIHBhcmVudCwgT2JqZWN0IHdyYXBwZXIpIHsKLQkJdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0JCXRoaXMud3JhcHBlciA9IHdyYXBwZXI7Ci0JCWNyZWF0ZUdyYXBoaWNhbFZpZXdlcigpOwotCX0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBHcmFwaGljYWxWaWV3ZXIgb24gdGhlIHNwZWNpZmllZCA8Y29kZT5Db21wb3NpdGU8L2NvZGU+Ci0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlR3JhcGhpY2FsVmlld2VyKCkgewotCQl0aGlzLmdyYXBoaWNhbFZpZXdlciA9IG5ldyBTY3JvbGxpbmdHcmFwaGljYWxWaWV3ZXIoKTsKLQkJdGhpcy5ncmFwaGljYWxWaWV3ZXIuY3JlYXRlQ29udHJvbChwYXJlbnQpOwotCQljb25maWd1cmVHcmFwaGljYWxWaWV3ZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBncmFwaGljYWwgdmlld2VyLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGdyYXBoaWNhbCB2aWV3ZXIKLQkgKi8KLQlwdWJsaWMgR3JhcGhpY2FsVmlld2VyIGdldEdyYXBoaWNhbFZpZXdlcigpIHsKLQkJcmV0dXJuIGdyYXBoaWNhbFZpZXdlcjsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVHcmFwaGljYWxWaWV3ZXIoKSB7Ci0JCWdldEdyYXBoaWNhbFZpZXdlcigpLmdldENvbnRyb2woKS5zZXRCYWNrZ3JvdW5kKAotCQkJCUNvbG9yQ29uc3RhbnRzLmxpc3RCYWNrZ3JvdW5kKTsKLQkJU2Nyb2xsaW5nR3JhcGhpY2FsVmlld2VyIHZpZXdlciA9IChTY3JvbGxpbmdHcmFwaGljYWxWaWV3ZXIpIGdldEdyYXBoaWNhbFZpZXdlcigpOwotCi0JCVNjYWxhYmxlRnJlZWZvcm1Sb290RWRpdFBhcnQgcm9vdCA9IG5ldyBTY2FsYWJsZUZyZWVmb3JtUm9vdEVkaXRQYXJ0KCk7Ci0JCXZpZXdlci5zZXRSb290RWRpdFBhcnQocm9vdCk7Ci0JCXZpZXdlci5zZXRFZGl0UGFydEZhY3RvcnkoY3JlYXRlRWRpdFBhcnRGYWN0b3J5KCkpOwotCX0KLQotCXByb3RlY3RlZCBJRmlndXJlIGdldEZpZ3VyZSgpIHsKLQkJR3JhcGhpY2FsVmlld2VyIHZpZXdlciA9IGdldEdyYXBoaWNhbFZpZXdlcigpOwotCi0JCS8vIGZpbmQgdGhlIGZpZ3VyZSB0byBiZSBzYXZlZAotCQlMYXllck1hbmFnZXIgbG0gPSAoTGF5ZXJNYW5hZ2VyKSB2aWV3ZXIuZ2V0RWRpdFBhcnRSZWdpc3RyeSgpLmdldCgKLQkJCQlMYXllck1hbmFnZXIuSUQpOwotCQlJRmlndXJlIGZpZ3VyZSA9IGxtLmdldExheWVyKExheWVyQ29uc3RhbnRzLlBSSU5UQUJMRV9MQVlFUlMpOwotCQlyZXR1cm4gZmlndXJlOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldFN1cHByZXNzaW9uVG9EaWFncmFtKERpYWdyYW0gZGlhZ3JhbSkgewotCQlPYmplY3QgZSA9IGRpYWdyYW0uZ2V0T2JqZWN0KCk7Ci0JCWlmIChlIGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudCkgewotCQkJUHJvY2VzcyBwcm9jID0gVG5nVXRpbC5nZXRPd25pbmdQcm9jZXNzKChCcmVha2Rvd25FbGVtZW50KSBlKTsKLQkJCWlmIChwcm9jICE9IG51bGwpIHsKLQkJCQlkaWFncmFtLnNldFN1cHByZXNzaW9uKFN1cHByZXNzaW9uLmdldFN1cHByZXNzaW9uKHByb2MpKTsKLQkJCX0KLQkJfQotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIGRpYWdyYW0gaW1hZ2UgZnJvbSBmaWd1cmUgY3JlYXRlZCBpbiBsb2FkRGlhZ3JhbSBtZXRob2QuCi0JICogCi0JICovCi0JcHVibGljIEltYWdlIGNyZWF0ZURpYWdyYW1JbWFnZSgpIHsKLQkJSUZpZ3VyZSBmaWd1cmUgPSBnZXRGaWd1cmUoKTsKLQotCQlTV1RHcmFwaGljcyBncmFwaGljcyA9IG51bGw7Ci0JCUdDIGdjID0gbnVsbDsKLQkJSW1hZ2UgaW1hZ2UgPSBudWxsOwotCi0JCXRyeSB7Ci0JCQlSZWN0YW5nbGUgYm91bmRzID0gZmlndXJlLmdldEJvdW5kcygpOwotCQkJaW50IGhlaWdodCA9IGJvdW5kcy5oZWlnaHQ7Ci0JCQlpbnQgd2lkdGggPSBib3VuZHMud2lkdGg7Ci0KLQkJCS8vIGNyZWF0ZSBhIG5ldyBpbWFnZSBhbmQgcmVwYWludCB0aGUgZ3JhcGgKLQkJCWZpbmFsIERpc3BsYXkgZGlzcGxheSA9IERpc3BsYXkuZ2V0RGVmYXVsdCgpOwotCQkJaW1hZ2UgPSBuZXcgSW1hZ2UoZGlzcGxheSwgd2lkdGgsIGhlaWdodCk7Ci0JCQlnYyA9IG5ldyBHQyhpbWFnZSk7Ci0JCQlncmFwaGljcyA9IG5ldyBTV1RHcmFwaGljcyhnYyk7Ci0JCQlmaWd1cmUucGFpbnQoZ3JhcGhpY3MpOwotCi0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJZXgucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0gZmluYWxseSB7Ci0JCQkvLyByZWxlYXNlIHJlc291cmNlcwotCQkJaWYgKGdyYXBoaWNzICE9IG51bGwpCi0JCQkJZ3JhcGhpY3MuZGlzcG9zZSgpOwotCQkJaWYgKGdjICE9IG51bGwpCi0JCQkJZ2MuZGlzcG9zZSgpOwotCQl9Ci0KLQkJcmV0dXJuIGltYWdlOwotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCXRyeSB7Ci0JCQlpZiAoZ3JhcGhpY2FsVmlld2VyICE9IG51bGwpIHsKLQkJCQlDb250cm9sIGN0cmwgPSBncmFwaGljYWxWaWV3ZXIuZ2V0Q29udHJvbCgpOwotCQkJCWlmIChjdHJsICE9IG51bGwpIHsKLQkJCQkJY3RybC5kaXNwb3NlKCk7Ci0JCQkJfQotCi0JCQkJRWRpdFBhcnQgZWRpdFBhcnQgPSBncmFwaGljYWxWaWV3ZXIuZ2V0Q29udGVudHMoKTsKLQkJCQlpZihlZGl0UGFydCAhPSBudWxsKSB7Ci0JCQkJCWVkaXRQYXJ0LnNldE1vZGVsKG51bGwpOwotCQkJCX0KLQotCQkJCWdyYXBoaWNhbFZpZXdlciA9IG51bGw7Ci0JCQl9Ci0JCQkKLQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0KLQl9Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgRWRpdFBhcnRGYWN0b3J5IGNyZWF0ZUVkaXRQYXJ0RmFjdG9yeSgpOwotCi0JcHJvdGVjdGVkIGFic3RyYWN0IEVkaXRQYXJ0IGNyZWF0ZUVkaXRQYXJ0KE9iamVjdCBlLCBJRmlsdGVyIGZpbHRlciwKLQkJCVN1cHByZXNzaW9uIHN1cCk7Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldERpYWdyYW1UeXBlKCk7Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjbGVhblVwRGlhZ3JhbSgpIHsKLQkJLy8gZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdGhpbmcKLQl9Ci0JCi0JcHVibGljIGFic3RyYWN0IERpYWdyYW1JbmZvIGdldERpYWdyYW1JbmZvKCk7Ci0JcHVibGljIGFic3RyYWN0IEVkaXRQYXJ0IGxvYWREaWFncmFtKE9iamVjdCB3cmFwcGVyLCBib29sZWFuIG5lZWRSZXNldCwKLQkJCUlGaWx0ZXIgZmlsdGVyLCBTdXBwcmVzc2lvbiBzdXApOwotCi0JcHVibGljIGFic3RyYWN0IHZvaWQgc2V0TWV0aG9kQ29uZmlndXJhdGlvbihNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyk7Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vdWkvdmlld2VyL0Fic3RyYWN0RGlhZ3JhbUdyYXBoaWNhbFZpZXdlckV4LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vdWkvdmlld2VyL0Fic3RyYWN0RGlhZ3JhbUdyYXBoaWNhbFZpZXdlckV4LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5Mzg1Y2QuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0udWkvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3VpL3ZpZXdlci9BYnN0cmFjdERpYWdyYW1HcmFwaGljYWxWaWV3ZXJFeC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLnVpLnZpZXdlcjsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkNvbG9yQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5EZWxlZ2F0aW5nTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5GcmVlZm9ybUxheWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5MYXllcmVkUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FTW9kZWxFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5UcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24udXRpbC5UcmFuc2FjdGlvblV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLndvcmtzcGFjZS5BYnN0cmFjdEVNRk9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLkNvbW1vblBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLkFjdGl2aXR5RWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5icmlkZ2UuQnJpZGdlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUucGFydC5EaWFncmFtRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5wYXJ0LklEaWFncmFtRWRpdG9ySW5wdXRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnBhcnQudXRpbC5EaWFncmFtRWRpdG9yVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnNlcnZpY2VzLkRpYWdyYW1NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkxpbmtlZE9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5OYW1lZE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLnVpLkRpYWdyYW1VSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS51aS5zZXJ2aWNlLkRpYWdyYW1JbWFnZVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5Qcm9jZXNzQ29uZmlndXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuU3VwcHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LmRpYWdyYW0uRGlhZ3JhbUluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5SZXNvdXJjZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuR3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkxheWVyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS51dGlsLlZpZXdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLkRpYWdyYW1FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5EaWFncmFtUm9vdEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuaW1hZ2UuSW1hZ2VGaWxlRm9ybWF0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucGFydHMuRGlhZ3JhbUdyYXBoaWNhbFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnNlcnZpY2VzLmVkaXRwYXJ0LkVkaXRQYXJ0U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob3RhdGlvblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci0KLS8qKgotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjIKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0RGlhZ3JhbUdyYXBoaWNhbFZpZXdlckV4IGV4dGVuZHMKLQkJQWJzdHJhY3REaWFncmFtR3JhcGhpY2FsVmlld2VyIHsKLQkKLQlwcm90ZWN0ZWQgY2xhc3MgRGlhZ3JhbUdyYXBoaWNhbFZpZXdlckV4IGV4dGVuZHMgRGlhZ3JhbUdyYXBoaWNhbFZpZXdlciBpbXBsZW1lbnRzIElEaWFncmFtRWRpdG9ySW5wdXRQcm92aWRlciB7Ci0JCXByaXZhdGUgRGlhZ3JhbUVkaXRvcklucHV0IGlucHV0OwotCQlwdWJsaWMgRGlhZ3JhbUVkaXRvcklucHV0IGdldERpYWdyYW1FZGl0b3JJbnB1dCgpIHsKLQkJCWlmKGlucHV0ID09IG51bGwpIHsKLQkJCQlpbnB1dCA9IG5ldyBEaWFncmFtRWRpdG9ySW5wdXQod3JhcHBlciwgbnVsbCwgRGlhZ3JhbUltYWdlU2VydmljZS5nZXRJbnRUeXBlKGdldERpYWdyYW1UeXBlKCkpKTsKLQkJCX0KLQkJCXJldHVybiBpbnB1dDsKLQkJfQotCi0JCXB1YmxpYyBJRWRpdG9yUGFydCBnZXRFZGl0b3IoKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQkKLQl9OwotCi0JcHJvdGVjdGVkIEdyYXBoaWNhbEVkaXRQYXJ0IHBhcnQgPSBudWxsOwotCXByb3RlY3RlZCBEaWFncmFtIGRpYWdyYW07Ci0JcHJvdGVjdGVkIERpYWdyYW1NYW5hZ2VyIGRtZ3I7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gZGVidWcgPSBEaWFncmFtVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmlzRGVidWdnaW5nKCk7IAotCXByb3RlY3RlZCBNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IG51bGw7Ci0KLQlwdWJsaWMgQWJzdHJhY3REaWFncmFtR3JhcGhpY2FsVmlld2VyRXgoQ29tcG9zaXRlIHBhcmVudCwgT2JqZWN0IHdyYXBwZXIpIHsKLQkJc3VwZXIocGFyZW50LCB3cmFwcGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGRpYWdyYW0gZm9yIGdpdmVuIG9iamVjdCAob25seSBmb3Ige0BsaW5rIEFjdGl2aXR5fSBhbmQgcGFja3MgdGhlIGJvdW5kcy4KLQkgKiAKLQkgKiBAcGFyYW0gd3JhcHBlciAJe0BsaW5rIE9iamVjdH0gCQotCSAqIEBwYXJhbSBuZWVkUmVzZXQgYm9vbGVhbgotCSAqIEBwYXJhbSBmaWx0ZXIgCXtAbGluayBJRmlsdGVyfQotCSAqIEBwYXJhbSBzdXAJCXtAbGluayBTdXBwcmVzc2lvbn0KLQkgKi8KLQlwdWJsaWMgRWRpdFBhcnQgbG9hZERpYWdyYW0oT2JqZWN0IHdyYXBwZXIsIGJvb2xlYW4gbmVlZFJlc2V0LAotCQkJSUZpbHRlciBmaWx0ZXIsIFN1cHByZXNzaW9uIHN1cCkgewotCQkvLyBpbml0aWFsaXplIHRoZSB2aWV3ZXIgd2l0aCB0aGUgZWRpdCBwYXJ0Ci0JCUVkaXRQYXJ0IGVkaXRQYXJ0ID0gY3JlYXRlRWRpdFBhcnQod3JhcHBlciwgZmlsdGVyLCBzdXApOwotCQlpZihlZGl0UGFydCA9PSBudWxsKXsKLQkJCWlmIChkZWJ1ZykgewotCQkJCVN5c3RlbS5lcnIucHJpbnRsbigiRWRpdHBhcnQgaXMgbnVsbDogIisgd3JhcHBlcik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCXJldHVybiBlZGl0UGFydDsKLQkJfQotCQl0aGlzLmdyYXBoaWNhbFZpZXdlci5zZXRDb250ZW50cyhlZGl0UGFydCk7Ci0JCURpYWdyYW1FZGl0UGFydCBkaWFncmFtRWRpdFBhcnQgPSAoRGlhZ3JhbUVkaXRQYXJ0KWVkaXRQYXJ0OwkJCi0JCW9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZSByZXNvdXJjZSA9IGRpYWdyYW1FZGl0UGFydC5nZXREaWFncmFtVmlldygpLmVSZXNvdXJjZSgpOwotCQlib29sZWFuIG9sZERlbGl2ZXIgPSByZXNvdXJjZS5lRGVsaXZlcigpOwotCQl0cnkgewotCQkJLy8gZGlzYWJsZSBub3RpZmljYXRpb24gb24gdGhlIHJlc291cmNlIGNoYW5nZSBkdXJpbmcgcmVmcmVzaCB0bwotCQkJLy8gYXZvaWQgbWFraW5nIHRoZSBkaWFncmFtIGVkaXRvciBkaXJ0eQotCQkJLy8KLQkJCWlmKHJlc291cmNlICE9IG51bGwpIHsKLQkJCQlyZXNvdXJjZS5lU2V0RGVsaXZlcihmYWxzZSk7Ci0JCQl9Ci0JCQlyZWZyZXNoKGRpYWdyYW1FZGl0UGFydCk7Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQlpZihyZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQkJcmVzb3VyY2UuZVNldERlbGl2ZXIob2xkRGVsaXZlcik7Ci0JCQl9Ci0JCX0KLQkJCi0JCS8vIGFzayBmb3IgaW1tZWRpYXRlIHVwZGF0ZSBvZiB0aGUgY29udHJvbCBzbyB0aGF0IHRoZSBkaWFncmFtIGZpZ3VyZQotCQkvLyB3aWxsIGJlIGNvbXB1dGVkCi0JCXBhcmVudC5wYWNrKHRydWUpOwotCQlpZihlZGl0UGFydCAhPSBudWxsKXsKLQkJCWlmKGRlYnVnKXsKLQkJCQlmb3IgKEl0ZXJhdG9yPD8+IGl0ZXJhdG9yID0gZWRpdFBhcnQuZ2V0Q2hpbGRyZW4oKS5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJCUVkaXRQYXJ0IG5hbWUgPSAoRWRpdFBhcnQpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJVmlldyB2aWV3ID0gKFZpZXcpbmFtZS5nZXRNb2RlbCgpOwotCQkJCQlpZiAoZGVidWcpIHsKLQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbih2aWV3LmdldFR5cGUoKSArIjoiICsgVmlld1V0aWwuZ2V0U3RydWN0dXJhbEZlYXR1cmVWYWx1ZSh2aWV3LAkJLy8kTk9OLU5MUy0xJAotCQkJCQkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldExvY2F0aW9uX1goKSkgKyAiLCIgKyBWaWV3VXRpbC5nZXRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlKHZpZXcsCQkvLyROT04tTkxTLTEkCi0JCQkJCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TG9jYXRpb25fWSgpKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQkvLyBUaGlzIGNoZWNrIGlzIG5lZWRlZCBmb3IgYnJvd3NpbmcsIGluIG9yZGVyIHRvIHJlbmRlciBhY3Rpdml0eSBjb250cmlidXRpbmcncwotCQkvLyBjaGlsZHJlbi4gIEluIHByb2Nlc3NBdXRob3Jpbmcgd2UgZG9uJ3QgZG8gcmVhbGl6YXRpb24sIGluIG9yZGVyIHRvIGRpc3BsYXllZCAKLQkJLy8gcmVhbGl6ZWQgZWxlbWVudHMsIHdlIGhhdmUgdG8gY2xlYW51cCBBREQgZGlhZ3JhbSBhbmQgcmVjcmVhdGUuIG5lZWR0b1Jlc2V0IG9yIGNsZWFudXBkaWFncmFtLgotCQkvLyBPbmx5IGZvciBhY3Rpdml0eSBkZXRhaWwgZGlhZ3JhbS4KLQkJT2JqZWN0IG8gPSBUbmdVdGlsLnVud3JhcCh3cmFwcGVyKTsKLQkJaWYobyBpbnN0YW5jZW9mIFZhcmlhYmlsaXR5RWxlbWVudCAmJiBnZXREaWFncmFtVHlwZSgpICE9IG51bGwgJiYgCi0JCQkJZ2V0RGlhZ3JhbVR5cGUoKS5lcXVhbHNJZ25vcmVDYXNlKFJlc291cmNlSGVscGVyLkRJQUdSQU1fVFlQRV9BQ1RJVklUWV9ERVRBSUwpKXsKLQkJCWlmKFRuZ1V0aWwuaGFzQ29udHJpYnV0b3IoKFZhcmlhYmlsaXR5RWxlbWVudClvKSl7Ci0JCQkJbmVlZFJlc2V0ID0gdHJ1ZTsKLQkJCX0KLQkJfQotCQkKLQkJaWYgKG5lZWRSZXNldCkgewotCQkJY2xlYW5VcERpYWdyYW0oKTsKLQkJCXBhcmVudC5wYWNrKHRydWUpOwotCQl9Ci0JCUlGaWd1cmUgZmlndXJlID0gZ2V0RmlndXJlKCk7Ci0JCWlmIChmaWd1cmUgIT0gbnVsbCkgewotCQkJUmVjdGFuZ2xlIGJvdW5kcyA9IGZpZ3VyZS5nZXRCb3VuZHMoKTsKLQkJCWlmIChib3VuZHMueCA8IDAgfHwgYm91bmRzLnkgPCAwKSB7Ci0JCQkJaWYoZWRpdFBhcnQgaW5zdGFuY2VvZiBBY3Rpdml0eUVkaXRQYXJ0KXsKLQkJCQkJKChBY3Rpdml0eUVkaXRQYXJ0KSBlZGl0UGFydCkubW92ZUZpZ3VyZSgtYm91bmRzLngsIC1ib3VuZHMueSk7Ci0JCQkJfQotCQkJCXBhcmVudC5wYWNrKHRydWUpOwotCi0JCQkJYm91bmRzID0gZmlndXJlLmdldEJvdW5kcygpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGVkaXRQYXJ0OwotCX0KLQotCQotCS8qKgotCSAqIHJldHVybnMge0BsaW5rIERpYWdyYW1JbmZvfQotCSAqIAotCSAqLwotCXB1YmxpYyBEaWFncmFtSW5mbyBnZXREaWFncmFtSW5mbygpIHsKLQkJRGlhZ3JhbUluZm8gZGlhZ3JhbUluZm8gPSBudWxsOwotCi0JCU9iamVjdCBlbGVtZW50ID0gcGFydC5nZXRNb2RlbCgpOwotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIExpbmtlZE9iamVjdCkgewotCQkJZWxlbWVudCA9ICgoTGlua2VkT2JqZWN0KSBlbGVtZW50KS5nZXRPYmplY3QoKTsKLQkJfQotCQlpZihlbGVtZW50IGluc3RhbmNlb2YgVmlldyl7Ci0JCQkgZWxlbWVudCA9ICgoVmlldyllbGVtZW50KS5nZXRFbGVtZW50KCk7Ci0JCQlpZihlbGVtZW50ICE9IG51bGwgJiYgZWxlbWVudCBpbnN0YW5jZW9mIEVNb2RlbEVsZW1lbnQpewotCQkJCWVsZW1lbnQgPSBCcmlkZ2VIZWxwZXIuZ2V0TWV0aG9kRWxlbWVudCgoRU1vZGVsRWxlbWVudCllbGVtZW50KTsKLQkJCX0KLQkJCWlmKGVsZW1lbnQgaW5zdGFuY2VvZiBOb2RlKXsKLQkJCQllbGVtZW50ID0gKChOb2RlKWVsZW1lbnQpLmdldExpbmtlZEVsZW1lbnQoKTsKLQkJCX0KLQkJfQotCi0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJZGlhZ3JhbUluZm8gPSBuZXcgRGlhZ3JhbUluZm8oZ2V0RGlhZ3JhbVR5cGUoKSwKLQkJCQkJKE1ldGhvZEVsZW1lbnQpIGVsZW1lbnQpOwotCQkJbG9hZERpYWdyYW1JbmZvKHBhcnQsIGRpYWdyYW1JbmZvKTsKLQkJfQotCi0JCXJldHVybiBkaWFncmFtSW5mbzsKLQl9Ci0JCi0JcHVibGljIHZvaWQgY3JlYXRlRGlhZ3JhbUltYWdlKEltYWdlRmlsZUZvcm1hdCBpbWFnZUZpbGVGb3JtYXQpewotLy8JCUNvcHlUb0ltYWdlVXRpbCBpbSA9IG5ldyBDb3B5VG9JbWFnZVV0aWwoKTsKLQkJLy9pbS5jb3B5VG9JbWFnZShwYXJ0LCBkZXN0aW5hdGlvbiwgZm9ybWF0LCBtb25pdG9yKQotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi52aWV3ZXIuQWJzdHJhY3REaWFncmFtR3JhcGhpY2FsVmlld2VyI2NyZWF0ZUVkaXRQYXJ0RmFjdG9yeSgpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVkaXRQYXJ0RmFjdG9yeSBjcmVhdGVFZGl0UGFydEZhY3RvcnkoKSB7Ci0JCXJldHVybiBFZGl0UGFydFNlcnZpY2UuZ2V0SW5zdGFuY2UoKTsKLQl9Ci0JCi0JCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlR3JhcGhpY2FsVmlld2VyKCkgewotCQlnZXRHcmFwaGljYWxWaWV3ZXIoKS5nZXRDb250cm9sKCkuc2V0QmFja2dyb3VuZCgKLQkJCQlDb2xvckNvbnN0YW50cy5saXN0QmFja2dyb3VuZCk7Ci0JCURpYWdyYW1HcmFwaGljYWxWaWV3ZXIgdmlld2VyID0gKERpYWdyYW1HcmFwaGljYWxWaWV3ZXIpIGdldEdyYXBoaWNhbFZpZXdlcigpOwotCi0JCURpYWdyYW1Sb290RWRpdFBhcnQgcm9vdCA9IChEaWFncmFtUm9vdEVkaXRQYXJ0KSBFZGl0UGFydFNlcnZpY2UKLQkJCQkuZ2V0SW5zdGFuY2UoKS5jcmVhdGVSb290RWRpdFBhcnQoZ2V0RGlhZ3JhbSgpKTsKLS8vCQlMYXllcmVkUGFuZSBwcmludGFibGVMYXllcnMgPSAoTGF5ZXJlZFBhbmUpIHJvb3QKLS8vCQkJCS5nZXRMYXllcihMYXllckNvbnN0YW50cy5QUklOVEFCTEVfTEFZRVJTKTsKLQkJRnJlZWZvcm1MYXllciBleHRMYWJlbHNMYXllciA9IG5ldyBGcmVlZm9ybUxheWVyKCk7Ci0JCWV4dExhYmVsc0xheWVyLnNldExheW91dE1hbmFnZXIobmV3IERlbGVnYXRpbmdMYXlvdXQoKSk7Ci0vLwkJcHJpbnRhYmxlTGF5ZXJzLmFkZExheWVyQWZ0ZXIoZXh0TGFiZWxzTGF5ZXIsCi0vLwkJCQlVTUxFZGl0UGFydEZhY3RvcnkuRVhURVJOQUxfTk9ERV9MQUJFTFNfTEFZRVIsCi0vLwkJCQlMYXllckNvbnN0YW50cy5QUklNQVJZX0xBWUVSKTsKLQkJTGF5ZXJlZFBhbmUgc2NhbGFibGVMYXllcnMgPSAoTGF5ZXJlZFBhbmUpIHJvb3QKLQkJCQkuZ2V0TGF5ZXIoTGF5ZXJDb25zdGFudHMuU0NBTEFCTEVfTEFZRVJTKTsKLQkJRnJlZWZvcm1MYXllciBzY2FsZWRGZWVkYmFja0xheWVyID0gbmV3IEZyZWVmb3JtTGF5ZXIoKTsKLQkJc2NhbGVkRmVlZGJhY2tMYXllci5zZXRFbmFibGVkKGZhbHNlKTsKLQkJc2NhbGFibGVMYXllcnMuYWRkTGF5ZXJBZnRlcihzY2FsZWRGZWVkYmFja0xheWVyLAotCQkJCUxheWVyQ29uc3RhbnRzLlNDQUxFRF9GRUVEQkFDS19MQVlFUiwKLQkJCQlEaWFncmFtUm9vdEVkaXRQYXJ0LkRFQ09SQVRJT05fVU5QUklOVEFCTEVfTEFZRVIpOwotCQl2aWV3ZXIuc2V0Um9vdEVkaXRQYXJ0KHJvb3QpOwotCQl2aWV3ZXIuc2V0RWRpdFBhcnRGYWN0b3J5KGNyZWF0ZUVkaXRQYXJ0RmFjdG9yeSgpKTsKLQkJCi0JCS8vIFNldCBlZGl0aW5nIGRvbWFpbgotLy8JCURpYWdyYW1FZGl0RG9tYWluIGVkaXREb21haW4gPSBuZXcgRGlhZ3JhbUVkaXREb21haW4obnVsbCk7Ci0vLyAgICAgICAgZWRpdERvbWFpbi5zZXRDb21tYW5kU3RhY2soCi0vLyAgICAgICAgICAgIG5ldyBEaWFncmFtQ29tbWFuZFN0YWNrKGVkaXREb21haW4pKTsKLS8vCi0vLyAgICAgICAgdmlld2VyLnNldEVkaXREb21haW4oZWRpdERvbWFpbik7Ci0gICAgICAgIAotLy8gICAgICAgIFByZWZlcmVuY2VzSGludCBwcmVmZXJlbmNlc0hpbnQgPSBEaWFncmFtSW1hZ2VTZXJ2aWNlLmdldFByZWZlcmVuY2VIaW50KAotLy8gICAgICAgIAkJZ2V0RGlhZ3JhbVR5cGUoKSk7Ci0vLyAgICAgICAgaWYgKHJvb3QgaW5zdGFuY2VvZiBJRGlhZ3JhbVByZWZlcmVuY2VTdXBwb3J0KSB7Ci0vLyAgICAgICAgICAgIGlmIChwcmVmZXJlbmNlc0hpbnQgPT0gbnVsbCkgewotLy8gICAgICAgICAgICAgICAgcHJlZmVyZW5jZXNIaW50ID0gKChJRGlhZ3JhbVByZWZlcmVuY2VTdXBwb3J0KSByb290KQotLy8gICAgICAgICAgICAgICAgICAgIC5nZXRQcmVmZXJlbmNlc0hpbnQoKTsKLS8vICAgICAgICAgICAgfSBlbHNlIHsKLS8vICAgICAgICAgICAgICAgICgoSURpYWdyYW1QcmVmZXJlbmNlU3VwcG9ydCkgcm9vdCkKLS8vICAgICAgICAgICAgICAgICAgICAuc2V0UHJlZmVyZW5jZXNIaW50KHByZWZlcmVuY2VzSGludCk7Ci0vLyAgICAgICAgICAgIH0KLS8vICAgICAgICAgICAgdmlld2VyCi0vLyAgICAgICAgICAgICAgICAuaG9va1dvcmtzcGFjZVByZWZlcmVuY2VTdG9yZSgoSVByZWZlcmVuY2VTdG9yZSkgcHJlZmVyZW5jZXNIaW50Ci0vLyAgICAgICAgICAgICAgICAgICAgLmdldFByZWZlcmVuY2VTdG9yZSgpKTsKLS8vICAgICAgICB9Ci0vLyAgICAgICAgCi0vLyAgICAgICAgRGlhZ3JhbUV2ZW50QnJva2VyLnN0YXJ0TGlzdGVuaW5nKFRyYW5zYWN0aW9uVXRpbC5nZXRFZGl0aW5nRG9tYWluKGRpYWdyYW0pKTsKLS8vICAgICAgICB2aWV3ZXIuc2V0Q29udGVudHMoZGlhZ3JhbSk7Ci0JfQotCQotCS8qCi0JICogCi0JICovCi0JcHJvdGVjdGVkIERpYWdyYW0gZ2V0RGlhZ3JhbSgpewotCQlpZiAoZGlhZ3JhbSA9PSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCWlmIChkaWFncmFtID09IG51bGwpIHsKLQkJCQkJT2JqZWN0IG8gPSBUbmdVdGlsLnVud3JhcCh3cmFwcGVyKTsKLQkJCQkJaWYgKG8gaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCQkJQWN0aXZpdHkgYWN0ID0gKEFjdGl2aXR5KSBvOwotCQkJCQkJZG1nciA9IERpYWdyYW1NYW5hZ2VyLmdldEluc3RhbmNlKFRuZ1V0aWwKLQkJCQkJCQkJLmdldE93bmluZ1Byb2Nlc3MoYWN0KSwgdGhpcyk7Ci0JCQkJCQlMaXN0PERpYWdyYW0+IGxpc3QgPSBkbWdyLmdldERpYWdyYW1zKGFjdCwgRGlhZ3JhbUltYWdlU2VydmljZQotCQkJCQkJCQkuZ2V0SW50VHlwZShnZXREaWFncmFtVHlwZSgpKSk7Ci0JCQkJCQlpZiAoIWxpc3QuaXNFbXB0eSgpKSB7Ci0JCQkJCQkJZGlhZ3JhbSA9IChEaWFncmFtKSBsaXN0LmdldCgwKTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJaWYgKGRlYnVnKSB7Ci0JCQkJCQkJCVN5c3RlbS5vdXQKLQkJCQkJCQkJCQkucHJpbnRsbigiRGlhZ3JhbSBpcyBlbXB0eSBmb3IgIiArIGFjdCk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJaWYgKGRlYnVnKSB7Ci0JCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJfQotCQkJfQotCQkJaWYgKGRpYWdyYW0gPT0gbnVsbCkgewotCQkJCWlmIChkZWJ1ZykgewotCQkJCQlTeXN0ZW0ub3V0Ci0JCQkJCQkJLnByaW50bG4oIkNyZWF0aW5nIGRpYWdyYW0gb2YgICIgKyBnZXREaWFncmFtVHlwZSgpKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCQl0cnkgewotCQkJCQlkaWFncmFtID0gZG1nci5jcmVhdGVEaWFncmFtKChBY3Rpdml0eSkgVG5nVXRpbAotCQkJCQkJCS51bndyYXAod3JhcHBlciksIERpYWdyYW1JbWFnZVNlcnZpY2UKLQkJCQkJCQkuZ2V0SW50VHlwZShnZXREaWFncmFtVHlwZSgpKSwgRGlhZ3JhbUltYWdlU2VydmljZQotCQkJCQkJCS5nZXRQcmVmZXJlbmNlSGludChnZXREaWFncmFtVHlwZSgpKSk7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQotCQkJCX0KLQkJCX0KLQkJCQotCQkJaWYoZGlhZ3JhbSAhPSBudWxsKSB7Ci0JCQkJRU9iamVjdCBlID0gZGlhZ3JhbS5nZXRFbGVtZW50KCk7Ci0JCQkJaWYoZSBpbnN0YW5jZW9mIE5vZGUpIHsKLQkJCQkJKChOb2RlKWUpLmFkZENvbnN1bWVyKHRoaXMpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZGlhZ3JhbTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlR3JhcGhpY2FsVmlld2VyKCkgewotCQl0aGlzLmdyYXBoaWNhbFZpZXdlciA9IG5ldyBEaWFncmFtR3JhcGhpY2FsVmlld2VyRXgoKTsKLQkJdGhpcy5ncmFwaGljYWxWaWV3ZXIuY3JlYXRlQ29udHJvbChwYXJlbnQpOwotCQljb25maWd1cmVHcmFwaGljYWxWaWV3ZXIoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgbG9hZERpYWdyYW1JbmZvKEdyYXBoaWNhbEVkaXRQYXJ0IHBhcnQsIERpYWdyYW1JbmZvIGRpYWdyYW1JbmZvKSB7Ci0JCUxpc3Q8Pz4gY2hpbGRyZW4gPSBwYXJ0LmdldENoaWxkcmVuKCk7Ci0JCWZvciAoSXRlcmF0b3I8Pz4gaXQgPSBjaGlsZHJlbi5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgbyA9IGl0Lm5leHQoKTsKLQotCQkJaWYgKG8gaW5zdGFuY2VvZiBHcmFwaGljYWxFZGl0UGFydCkgewotCQkJCXBhcnQgPSAoR3JhcGhpY2FsRWRpdFBhcnQpIG87Ci0JCQkJT2JqZWN0IG1vZGVsID0gcGFydC5nZXRNb2RlbCgpOwotCQkJCU9iamVjdCBlID0gbW9kZWw7Ci0JCQkJaWYgKGUgaW5zdGFuY2VvZiBMaW5rZWRPYmplY3QpIHsKLQkJCQkJZSA9ICgoTGlua2VkT2JqZWN0KSBlKS5nZXRPYmplY3QoKTsKLQkJCQl9Ci0JCQkJaWYgKGUgaW5zdGFuY2VvZiBWaWV3KSB7Ci0JCQkJCWUgPSAoKFZpZXcpIGUpLmdldEVsZW1lbnQoKTsKLQkJCQkJaWYgKGUgaW5zdGFuY2VvZiBOb2RlKSB7Ci0JCQkJCQlpZiAoZSBpbnN0YW5jZW9mIE5vZGVDb250YWluZXIpIHsKLQkJCQkJCQlsb2FkRGlhZ3JhbUluZm8oKEdyYXBoaWNhbEVkaXRQYXJ0KSBvLCBkaWFncmFtSW5mbyk7Ci0JCQkJCQl9Ci0JCQkJCQllID0gKChOb2RlKSBlKS5nZXRMaW5rZWRFbGVtZW50KCk7Ci0JCQkJCX0KLQkJCQkJaWYgKGUgIT0gbnVsbCAmJiBlIGluc3RhbmNlb2YgRU1vZGVsRWxlbWVudCkgewotCQkJCQkJZSA9IEJyaWRnZUhlbHBlci5nZXRNZXRob2RFbGVtZW50KChFTW9kZWxFbGVtZW50KSBlKTsKLQkJCQkJfQotCQkJCX0KLQotCQkJCWlmIChlIGluc3RhbmNlb2YgRGlhZ3JhbUVsZW1lbnQpIHsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCi0JCQkJaWYgKGUgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQkJCWJvb2xlYW4gc3VwcHJlc3NlZDsKLQkJCQkJaWYgKG1vZGVsIGluc3RhbmNlb2YgTmFtZWROb2RlKSB7Ci0JCQkJCQlzdXBwcmVzc2VkID0gKChOYW1lZE5vZGUpIG1vZGVsKS5pc1N1cHByZXNzZWQoKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCXN1cHByZXNzZWQgPSAoKE1ldGhvZEVsZW1lbnQpIGUpLmdldFN1cHByZXNzZWQoKQotCQkJCQkJCQkuYm9vbGVhblZhbHVlKCk7Ci0JCQkJCX0KLQotCQkJCQlJRmlndXJlIGYgPSBwYXJ0LmdldEZpZ3VyZSgpOwotCQkJCQlSZWN0YW5nbGUgYm91bmRzID0gZi5nZXRCb3VuZHMoKTsKLQotCQkJCQlTdHJpbmcgYWx0VGFnID0gbnVsbDsKLQkJCQkJaWYgKGYgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCQkJCWFsdFRhZyA9ICgoV3JhcExhYmVsKSBmKS5nZXRUZXh0KCk7Ci0JCQkJCX0KLQkJCQkJZGlhZ3JhbUluZm8uYWRkQXJlYSgoTWV0aG9kRWxlbWVudCkgZSwgYm91bmRzLngsIGJvdW5kcy55LAotCQkJCQkJCWJvdW5kcy53aWR0aCwgYm91bmRzLmhlaWdodCwgYWx0VGFnLCBzdXBwcmVzc2VkKTsKLQotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJc3VwZXIuZGlzcG9zZSgpOwotCQkKLQkJaWYoZG1nciAhPSBudWxsKXsKLQkJCWRtZ3IucmVtb3ZlQ29uc3VtZXIodGhpcyk7Ci0JCX0KLQkJaWYoZGlhZ3JhbSAhPSBudWxsKSB7Ci0JCQlFT2JqZWN0IGUgPSBkaWFncmFtLmdldEVsZW1lbnQoKTsKLQkJCWlmKGUgaW5zdGFuY2VvZiBOb2RlKSB7Ci0JCQkJKChOb2RlKWUpLnJlbW92ZUNvbnN1bWVyKHRoaXMpOwotCQkJfQotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2goRGlhZ3JhbUVkaXRQYXJ0IGVkaXRQYXJ0KXsKLQkJdHJ5IHsKLQkJCURpYWdyYW1FZGl0b3JVdGlsLnJlZnJlc2goZWRpdFBhcnQsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCksIHRydWUpOwotCQkJRGlhZ3JhbUVkaXRvclV0aWwucmVmcmVzaExhYmVscyhlZGl0UGFydCk7Ci0JCX0gY2F0Y2goRXhjZXB0aW9uIGUpIHsKLQkJCWlmKGRlYnVnKXsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yIGRpYWdyYW0gcmVmcmVzaCB3aGlsZSBwdWJsaXNoaW5nIDogIiArIGUpOwkgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIHVwZGF0ZURpYWdyYW1FbGVtZW50KGZpbmFsIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkRpYWdyYW0gbW9kZWwsIGZpbmFsIE1ldGhvZEVsZW1lbnQgZWxlbWVudCwgIAotCQkJZmluYWwgU3VwcHJlc3Npb24gc3VwLCBmaW5hbCBNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24sIGZpbmFsIElGaWx0ZXIgZmlsdGVyLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpewotCQlUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiBkb21haW4gPSBUcmFuc2FjdGlvblV0aWwuZ2V0RWRpdGluZ0RvbWFpbihtb2RlbCk7Ci0JCUFic3RyYWN0RU1GT3BlcmF0aW9uIG9wID0gbmV3IEFic3RyYWN0RU1GT3BlcmF0aW9uKGRvbWFpbiwgIiIpIHsJLy8kTk9OLU5MUy0xJAotCQkKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIElTdGF0dXMgZG9FeGVjdXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJCQlvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5EaWFncmFtIGQgPSAKLQkJCQkJKG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkRpYWdyYW0pIG1vZGVsLmdldEVsZW1lbnQoKTsKLQkJCQlkLnNldFN1cHByZXNzaW9uKHN1cCk7Ci0JCQkJaWYoZmlsdGVyID09IG51bGwgJiYgY29uZmlndXJhdGlvbiAhPSBudWxsKXsKLQkJCQkJUHJvY2Vzc0NvbmZpZ3VyYXRvciBwID0gbmV3IFByb2Nlc3NDb25maWd1cmF0b3IoY29uZmlnKTsKLQkJCQkJZC5zZXRGaWx0ZXIocCk7Ci0JCQkJfWVsc2V7Ci0JCQkJCWQuc2V0RmlsdGVyKGZpbHRlcik7Ci0JCQkJfQotCQkJCWQuc2V0TGlua2VkRWxlbWVudChlbGVtZW50KTsKLQkJCQkKLQkJCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQkJCX0KLQkJCi0JCX07Ci0JCXRyeSB7Ci0JCQlvcC5leGVjdXRlKG1vbml0b3IsIG51bGwpOwotCQl9IGNhdGNoIChFeGVjdXRpb25FeGNlcHRpb24gZSkgewotCQkJQ29tbW9uUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJfQotCQkKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0TWV0aG9kQ29uZmlndXJhdGlvbihNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZykgewotCQl0aGlzLmNvbmZpZyA9IGNvbmZpZzsKLQl9Ci0JCi0JcHVibGljIE1ldGhvZENvbmZpZ3VyYXRpb24gZ2V0TWV0aG9kQ29uZmlndXJhdGlvbigpewotCQlyZXR1cm4gY29uZmlnOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS91aS92aWV3ZXIvTmV3QWN0aXZpdHlEZXRhaWxEaWFncmFtVmlld2VyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vdWkvdmlld2VyL05ld0FjdGl2aXR5RGV0YWlsRGlhZ3JhbVZpZXdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMzUxNzVjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS91aS92aWV3ZXIvTmV3QWN0aXZpdHlEZXRhaWxEaWFncmFtVmlld2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0udWkudmlld2VyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucGFydHMuQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLnNlcnZpY2UuRGlhZ3JhbVJlc2V0U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLmFjdGlvbnMuRGlhZ3JhbUFjdGlvbnNTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLnVpLkRpYWdyYW1VSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkFjdGl2aXR5V3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuU3VwcHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5SZXNvdXJjZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRGVmYXVsdEVkaXREb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi51aS5hY3Rpb25zLkFjdGlvblJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucGFydHMuRGlhZ3JhbUVkaXREb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wYXJ0cy5JRGlhZ3JhbUdyYXBoaWNhbFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnNlcnZpY2VzLmVkaXRwYXJ0LkVkaXRQYXJ0U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogVGhlIGdyYXBoaWNhbCB2aWV3ZXIgZm9yIHRoZSBBY3Rpdml0eURldGFpbCBkaWFncmFtLgotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKi8KLXB1YmxpYyBjbGFzcyBOZXdBY3Rpdml0eURldGFpbERpYWdyYW1WaWV3ZXIgZXh0ZW5kcwotCQlBYnN0cmFjdERpYWdyYW1HcmFwaGljYWxWaWV3ZXJFeCB7Ci0KLQkvKioKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogQHBhcmFtIHdyYXBwZXIKLQkgKi8KLQlwdWJsaWMgTmV3QWN0aXZpdHlEZXRhaWxEaWFncmFtVmlld2VyKENvbXBvc2l0ZSBwYXJlbnQsIE9iamVjdCB3cmFwcGVyKSB7Ci0JCXN1cGVyKHBhcmVudCwgd3JhcHBlcik7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYudmlld2VyLkFic3RyYWN0RGlhZ3JhbUdyYXBoaWNhbFZpZXdlciNjcmVhdGVFZGl0UGFydChqYXZhLmxhbmcuT2JqZWN0LCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXIsIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5TdXBwcmVzc2lvbikKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRWRpdFBhcnQgY3JlYXRlRWRpdFBhcnQoT2JqZWN0IHdyYXBwZXIsIElGaWx0ZXIgZmlsdGVyLCBTdXBwcmVzc2lvbiBzdXApIHsKLQkJQWN0aXZpdHkgZSA9IG51bGw7Ci0JCWlmICh3cmFwcGVyIGluc3RhbmNlb2YgQWN0aXZpdHlXcmFwcGVySXRlbVByb3ZpZGVyKSB7Ci0JCQllID0gKEFjdGl2aXR5KSBUbmdVdGlsLnVud3JhcCh3cmFwcGVyKTsKLQkJfSBlbHNlIGlmICh3cmFwcGVyIGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCWUgPSAoQWN0aXZpdHkpIHdyYXBwZXI7Ci0JCX0KLQkJaWYoZSBpbnN0YW5jZW9mIEFjdGl2aXR5KXsKLQkJCXVwZGF0ZURpYWdyYW1FbGVtZW50KGRpYWdyYW0sIChNZXRob2RFbGVtZW50KWUsIHN1cCwgZ2V0TWV0aG9kQ29uZmlndXJhdGlvbigpLAotCQkJCQlmaWx0ZXIsCi0JCQkJCW5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQkJRGlhZ3JhbUVkaXREb21haW4gZG9tYWluID0gbmV3IERpYWdyYW1FZGl0RG9tYWluKG51bGwpOwotCQkJKChJRGlhZ3JhbUdyYXBoaWNhbFZpZXdlcilncmFwaGljYWxWaWV3ZXIpLnNldEVkaXREb21haW4oZG9tYWluKTsKLQkJCXBhcnQgPSBFZGl0UGFydFNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5jcmVhdGVHcmFwaGljRWRpdFBhcnQoZGlhZ3JhbSk7Ci0JCQlpZihwYXJ0ID09IG51bGwpewotCQkJCURpYWdyYW1VSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkuCi0JCQkJbG9nRXJyb3IoIlB1Ymxpc2hpbmc6IEFjdGl2aXR5IERldGFpbCBEaWFncmFtIEVkaXRQYXJ0IGNyZWF0aW9uIGZhaWxlZCBmb3IgOiAiK2UpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlyZXR1cm4gcGFydDsKLQkJfQotCQlyZXR1cm4gcGFydDsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi52aWV3ZXIuQWJzdHJhY3REaWFncmFtR3JhcGhpY2FsVmlld2VyI2dldERpYWdyYW1UeXBlKCkKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERpYWdyYW1UeXBlKCkgewotCQlyZXR1cm4gUmVzb3VyY2VIZWxwZXIuRElBR1JBTV9UWVBFX0FDVElWSVRZX0RFVEFJTDsKLQl9Ci0KLQkKLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLnZpZXdlci5BYnN0cmFjdERpYWdyYW1HcmFwaGljYWxWaWV3ZXIjY2xlYW5VcERpYWdyYW0oKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNsZWFuVXBEaWFncmFtKCkgewotCQlBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0UGFydCBkZXAgPSAoQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdFBhcnQpIGdldEdyYXBoaWNhbFZpZXdlcigpCi0JCQkJLmdldENvbnRlbnRzKCk7Ci0JCWlmIChkZXAgIT0gbnVsbCkgewotCQkJZGVwLmdldFJlY2VudGx5QWRkZWRQYXJ0cygpLmFkZEFsbChkZXAuZ2V0Q2hpbGRyZW4oKSk7Ci0KLQkJCS8vIGNsZWFuIHVwIHRoZSBkaWFncmFtCi0JCQlEZWZhdWx0RWRpdERvbWFpbiBlZGl0aW5nRG9tYWluID0gbmV3IERlZmF1bHRFZGl0RG9tYWluKG51bGwpOwotCQkJQWN0aW9uUmVnaXN0cnkgYWN0aW9uUmVnaXN0cnkgPSBuZXcgQWN0aW9uUmVnaXN0cnkoKTsKLQotCQkJRGlhZ3JhbUFjdGlvbnNTZXJ2aWNlIGFjdGlvblNlcnZpY2UgPSBuZXcgRGlhZ3JhbUFjdGlvbnNTZXJ2aWNlKAotCQkJCQlkbWdyLmdldEVkaXRpbmdEb21haW4oKSwgZ2V0R3JhcGhpY2FsVmlld2VyKCksCi0JCQkJCWVkaXRpbmdEb21haW4sIGFjdGlvblJlZ2lzdHJ5KTsKLQkJCWFjdGlvblNlcnZpY2UucmVnaXN0ZXJWZXJ0aWNhbEFsaWduRmlyc3RTZWxlY3RlZEFjdGlvbigpOwotCi0JCQlEaWFncmFtUmVzZXRTZXJ2aWNlIHNlcnZpY2UgPSBuZXcgRGlhZ3JhbVJlc2V0U2VydmljZShkbWdyCi0JCQkJCS5nZXRFZGl0aW5nRG9tYWluKCksIGdldEdyYXBoaWNhbFZpZXdlcigpLCBlZGl0aW5nRG9tYWluLAotCQkJCQlhY3Rpb25SZWdpc3RyeSk7Ci0JCQlzZXJ2aWNlLmNsZWFuVXBEaWFncmFtKCk7Ci0JCQkvLyBUT0RPOiBuZWVkIHRvIGltcHJvdmUgdGhpcyBmdW5jdGlvbi4gSGF2ZSB0byBjYWxsIGl0IHR3aWNlIHJpZ2h0IG5vdwotCQkJLy8gc28gaXQgY2FuIGxheW91dCB0aGUgZGlhZ3JhbSBjb3JyZWN0bHkuCi0JCQlzZXJ2aWNlLmNsZWFuVXBEaWFncmFtKCk7CQkJCi0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vdWkvdmlld2VyL05ld0FjdGl2aXR5RGlhZ3JhbVZpZXdlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0udWkvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3VpL3ZpZXdlci9OZXdBY3Rpdml0eURpYWdyYW1WaWV3ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzFkY2I1NC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vdWkvdmlld2VyL05ld0FjdGl2aXR5RGlhZ3JhbVZpZXdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLnVpLnZpZXdlcjsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Db2xvckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuRGVsZWdhdGluZ0xheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuRnJlZWZvcm1MYXllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTGF5ZXJlZFBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU1vZGVsRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uaW1wbC5JbnRlcm5hbFRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi51dGlsLlRyYW5zYWN0aW9uVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLkFjdGl2aXR5UGFydGl0aW9uRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5icmlkZ2UuQWN0aXZpdHlEaWFncmFtQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLmJyaWRnZS5CcmlkZ2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0udWkuRGlhZ3JhbVVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuQWN0aXZpdHlXcmFwcGVySXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5TdXBwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuZGlhZ3JhbS5EaWFncmFtSW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLlJlc291cmNlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuR3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkxheWVyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLkRpYWdyYW1Sb290RWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wYXJ0cy5EaWFncmFtRWRpdERvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnBhcnRzLkRpYWdyYW1HcmFwaGljYWxWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wYXJ0cy5JRGlhZ3JhbUdyYXBoaWNhbFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnNlcnZpY2VzLmVkaXRwYXJ0LkVkaXRQYXJ0U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBUaGUgZ3JhcGhpY2FsIHZpZXdlciBmb3IgdGhlIEFjdGl2aXR5IGRpYWdyYW0uCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBzaW5jZSAxLjIKLSAqLwotcHVibGljIGNsYXNzIE5ld0FjdGl2aXR5RGlhZ3JhbVZpZXdlciBleHRlbmRzIEFic3RyYWN0RGlhZ3JhbUdyYXBoaWNhbFZpZXdlckV4IHsKLQotCi0KLQkvKioKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICovCi0JcHVibGljIE5ld0FjdGl2aXR5RGlhZ3JhbVZpZXdlcihDb21wb3NpdGUgcGFyZW50LCBPYmplY3QgYWN0KSB7Ci0JCXN1cGVyKHBhcmVudCxhY3QpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLnZpZXdlci5BYnN0cmFjdERpYWdyYW1HcmFwaGljYWxWaWV3ZXIjY3JlYXRlRWRpdFBhcnQoamF2YS5sYW5nLk9iamVjdCwgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyLCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuU3VwcHJlc3Npb24pCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVkaXRQYXJ0IGNyZWF0ZUVkaXRQYXJ0KE9iamVjdCB3cmFwcGVyLCBJRmlsdGVyIGZpbHRlciwgU3VwcHJlc3Npb24gc3VwKSB7Ci0JCUFjdGl2aXR5IGUgPSBudWxsOwotCQlBY3Rpdml0eURpYWdyYW1BZGFwdGVyIGFkYXB0ZXIgPSBudWxsOwotCQlpZiAod3JhcHBlciBpbnN0YW5jZW9mIEFjdGl2aXR5V3JhcHBlckl0ZW1Qcm92aWRlcikgewotCQkJZSA9IChBY3Rpdml0eSkgVG5nVXRpbC51bndyYXAod3JhcHBlcik7Ci0JCQlhZGFwdGVyID0gbmV3IEFjdGl2aXR5RGlhZ3JhbUFkYXB0ZXIoCi0JCQkJCShBY3Rpdml0eVdyYXBwZXJJdGVtUHJvdmlkZXIpIHdyYXBwZXIpOwotCQl9IGVsc2UgewotCQkJaWYgKHdyYXBwZXIgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCWUgPSAoQWN0aXZpdHkpIHdyYXBwZXI7Ci0JCQkJYWRhcHRlciA9IG5ldyBBY3Rpdml0eURpYWdyYW1BZGFwdGVyKGUpOwotCQkJfQotCQl9Ci0JCWlmIChhZGFwdGVyICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJYWRhcHRlci5zZXRWaWV3KGRpYWdyYW0pOwotCQkJCWFkYXB0ZXIuc2V0RmlsdGVyKGZpbHRlcik7Ci0JCQkJYWRhcHRlci5zZXRTdXBwcmVzc2lvbihzdXApOwotCQkJCWFkYXB0ZXIuc2V0RWRpdGluZ0RvbWFpbigoSW50ZXJuYWxUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbikgVHJhbnNhY3Rpb25VdGlsCi0JCQkJCQkJCS5nZXRFZGl0aW5nRG9tYWluKGRpYWdyYW0uZ2V0RWxlbWVudCgpKSk7Ci0JCQkJZGlhZ3JhbS5nZXRFbGVtZW50KCkuZUFkYXB0ZXJzKCkuYWRkKGFkYXB0ZXIpOwotCQkJCURpYWdyYW1FZGl0RG9tYWluIGRvbWFpbiA9IG5ldyBEaWFncmFtRWRpdERvbWFpbihudWxsKTsKLQkJCQkoKElEaWFncmFtR3JhcGhpY2FsVmlld2VyKSBncmFwaGljYWxWaWV3ZXIpCi0JCQkJCQkuc2V0RWRpdERvbWFpbihkb21haW4pOwotCQkJCXBhcnQgPSBFZGl0UGFydFNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5jcmVhdGVHcmFwaGljRWRpdFBhcnQoCi0JCQkJCQlkaWFncmFtKTsKLQkJCQlpZiAocGFydCA9PSBudWxsKSB7Ci0JCQkJCURpYWdyYW1VSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoCi0JCQkJCQkJIlB1Ymxpc2hpbmc6IEFjdGl2aXR5IERpYWdyYW0gRWRpdFBhcnQgY3JlYXRpb24gZmFpbGVkIGZvciA6ICIJLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJKyBlKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIHBhcnQ7Ci0KLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJCWV4LnByaW50U3RhY2tUcmFjZSgpOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLnZpZXdlci5BYnN0cmFjdERpYWdyYW1HcmFwaGljYWxWaWV3ZXIjZ2V0RGlhZ3JhbVR5cGUoKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGlhZ3JhbVR5cGUoKSB7Ci0JCXJldHVybiBSZXNvdXJjZUhlbHBlci5ESUFHUkFNX1RZUEVfV09SS0ZMT1c7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgbG9hZERpYWdyYW1JbmZvKEdyYXBoaWNhbEVkaXRQYXJ0IHBhcnQsIERpYWdyYW1JbmZvIGRpYWdyYW1JbmZvKSB7Ci0JCUxpc3QgY2hpbGRyZW4gPSBwYXJ0LmdldENoaWxkcmVuKCk7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSBjaGlsZHJlbi5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgbyA9IGl0Lm5leHQoKTsKLQkJCWlmIChvIGluc3RhbmNlb2YgQWN0aXZpdHlQYXJ0aXRpb25FZGl0UGFydCkKLQkJCXsKLQkJCQlBY3Rpdml0eVBhcnRpdGlvbkVkaXRQYXJ0IHBhcnRpdGlvbiA9IChBY3Rpdml0eVBhcnRpdGlvbkVkaXRQYXJ0KSBvOwotCQkJCUxpc3QgcGFydGl0aW9uQ2hpbGRyZW4gPSBwYXJ0aXRpb24uZ2V0Q2hpbGRyZW4oKTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGkgPSBwYXJ0aXRpb25DaGlsZHJlbi5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0JCQkJewotCQkJCQlPYmplY3QgbzEgPSBpLm5leHQoKTsKLQkJCQkJaWYgKG8xIGluc3RhbmNlb2YgR3JhcGhpY2FsRWRpdFBhcnQpewotCQkJCQkJbG9hZERpYWdyYW1JbmZvKChHcmFwaGljYWxFZGl0UGFydCkgbzEsIGRpYWdyYW1JbmZvKTsKLQkJCQkJfQotCQkJCX0KLQkJCQkKLQkJCX0gZWxzZSBpZiAobyBpbnN0YW5jZW9mIEdyYXBoaWNhbEVkaXRQYXJ0KSB7Ci0JCQkJcGFydCA9IChHcmFwaGljYWxFZGl0UGFydCkgbzsKLQkJCQlPYmplY3QgbW9kZWwgPSBwYXJ0LmdldE1vZGVsKCk7Ci0JCQkJT2JqZWN0IGUgPSBtb2RlbDsKLQkJCQkKLQkJCQlpZihlIGluc3RhbmNlb2YgVmlldyl7Ci0JCQkJCUVNb2RlbEVsZW1lbnQgZXggPSAoRU1vZGVsRWxlbWVudCkoKFZpZXcpZSkuZ2V0RWxlbWVudCgpOwotCQkJCQlpZihleCAhPSBudWxsKXsKLQkJCQkJCWUgPSBCcmlkZ2VIZWxwZXIuZ2V0TWV0aG9kRWxlbWVudChleCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJCi0JCQkJaWYgKGUgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQkJCWJvb2xlYW4gc3VwcHJlc3NlZDsKLQkJCQkJaWYgKG1vZGVsIGluc3RhbmNlb2YgTm9kZSkgewotCQkJCQkJc3VwcHJlc3NlZCA9ICgoTWV0aG9kRWxlbWVudClCcmlkZ2VIZWxwZXIuZ2V0TWV0aG9kRWxlbWVudCgoRU1vZGVsRWxlbWVudCkoKE5vZGUpbW9kZWwpLmdldEVsZW1lbnQoKSkpLmdldFN1cHByZXNzZWQoKS5ib29sZWFuVmFsdWUoKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCXN1cHByZXNzZWQgPSAoKE1ldGhvZEVsZW1lbnQpIGUpLmdldFN1cHByZXNzZWQoKQotCQkJCQkJCQkuYm9vbGVhblZhbHVlKCk7Ci0JCQkJCX0KLQotCQkJCQlJRmlndXJlIGYgPSBwYXJ0LmdldEZpZ3VyZSgpOwotCQkJCQlSZWN0YW5nbGUgYm91bmRzID0gZi5nZXRCb3VuZHMoKTsKLQotCQkJCQlTdHJpbmcgYWx0VGFnID0gbnVsbDsKLQkJCQkJaWYgKGYgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCQkJCWFsdFRhZyA9ICgoV3JhcExhYmVsKSBmKS5nZXRUZXh0KCk7Ci0JCQkJCX0KLQkJCQkJZGlhZ3JhbUluZm8uYWRkQXJlYSgoTWV0aG9kRWxlbWVudCkgZSwgYm91bmRzLngsCi0JCQkJCQlib3VuZHMueSwgYm91bmRzLndpZHRoLCBib3VuZHMuaGVpZ2h0LCBhbHRUYWcsIHN1cHByZXNzZWQpOwotCi0JCQkJfQotCQkJCWVsc2UKLQkJCQkJZGlhZ3JhbUluZm8uYWRkR3JhcGhpY2FsTm9kZXMoKTsKLQkJCX0gCi0JCX0KLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlR3JhcGhpY2FsVmlld2VyKCkgewotCQl0aGlzLmdyYXBoaWNhbFZpZXdlciA9IG5ldyBEaWFncmFtR3JhcGhpY2FsVmlld2VyKCk7Ci0JCXRoaXMuZ3JhcGhpY2FsVmlld2VyLmNyZWF0ZUNvbnRyb2wocGFyZW50KTsKLQkJY29uZmlndXJlR3JhcGhpY2FsVmlld2VyKCk7Ci0JfQotCQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZUdyYXBoaWNhbFZpZXdlcigpIHsKLQkJZ2V0R3JhcGhpY2FsVmlld2VyKCkuZ2V0Q29udHJvbCgpLnNldEJhY2tncm91bmQoCi0JCQkJQ29sb3JDb25zdGFudHMubGlzdEJhY2tncm91bmQpOwotCQlEaWFncmFtR3JhcGhpY2FsVmlld2VyIHZpZXdlciA9IChEaWFncmFtR3JhcGhpY2FsVmlld2VyKSBnZXRHcmFwaGljYWxWaWV3ZXIoKTsKLQotCQlEaWFncmFtUm9vdEVkaXRQYXJ0IHJvb3QgPSAoRGlhZ3JhbVJvb3RFZGl0UGFydCkgRWRpdFBhcnRTZXJ2aWNlCi0JCQkJLmdldEluc3RhbmNlKCkuY3JlYXRlUm9vdEVkaXRQYXJ0KGdldERpYWdyYW0oKSk7Ci0JCUxheWVyZWRQYW5lIHByaW50YWJsZUxheWVycyA9IChMYXllcmVkUGFuZSkgcm9vdAotCQkJCS5nZXRMYXllcihMYXllckNvbnN0YW50cy5QUklOVEFCTEVfTEFZRVJTKTsKLQkJRnJlZWZvcm1MYXllciBleHRMYWJlbHNMYXllciA9IG5ldyBGcmVlZm9ybUxheWVyKCk7Ci0JCWV4dExhYmVsc0xheWVyLnNldExheW91dE1hbmFnZXIobmV3IERlbGVnYXRpbmdMYXlvdXQoKSk7Ci0vLwkJcHJpbnRhYmxlTGF5ZXJzLmFkZExheWVyQWZ0ZXIoZXh0TGFiZWxzTGF5ZXIsCi0vLwkJCQlVTUxFZGl0UGFydEZhY3RvcnkuRVhURVJOQUxfTk9ERV9MQUJFTFNfTEFZRVIsCi0vLwkJCQlMYXllckNvbnN0YW50cy5QUklNQVJZX0xBWUVSKTsKLQkJTGF5ZXJlZFBhbmUgc2NhbGFibGVMYXllcnMgPSAoTGF5ZXJlZFBhbmUpIHJvb3QKLQkJCQkuZ2V0TGF5ZXIoTGF5ZXJDb25zdGFudHMuU0NBTEFCTEVfTEFZRVJTKTsKLQkJRnJlZWZvcm1MYXllciBzY2FsZWRGZWVkYmFja0xheWVyID0gbmV3IEZyZWVmb3JtTGF5ZXIoKTsKLQkJc2NhbGVkRmVlZGJhY2tMYXllci5zZXRFbmFibGVkKGZhbHNlKTsKLQkJc2NhbGFibGVMYXllcnMuYWRkTGF5ZXJBZnRlcihzY2FsZWRGZWVkYmFja0xheWVyLAotCQkJCUxheWVyQ29uc3RhbnRzLlNDQUxFRF9GRUVEQkFDS19MQVlFUiwKLQkJCQlEaWFncmFtUm9vdEVkaXRQYXJ0LkRFQ09SQVRJT05fVU5QUklOVEFCTEVfTEFZRVIpOwotCQl2aWV3ZXIuc2V0Um9vdEVkaXRQYXJ0KHJvb3QpOwotCQl2aWV3ZXIuc2V0RWRpdFBhcnRGYWN0b3J5KGNyZWF0ZUVkaXRQYXJ0RmFjdG9yeSgpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS91aS92aWV3ZXIvTmV3V1BEZXBlbmRlbmN5RGlhZ3JhbVZpZXdlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0udWkvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3VpL3ZpZXdlci9OZXdXUERlcGVuZGVuY3lEaWFncmFtVmlld2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyYmJkZDUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0udWkvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3VpL3ZpZXdlci9OZXdXUERlcGVuZGVuY3lEaWFncmFtVmlld2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0udWkudmlld2VyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkRlbGVnYXRpbmdMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkZyZWVmb3JtTGF5ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkxheWVyZWRQYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLnVpLkRpYWdyYW1VSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLmVkaXQucGFydHMuRGlhZ3JhbUVkaXRQYXJ0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkFjdGl2aXR5V3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuU3VwcHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5SZXNvdXJjZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkxheWVyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLkRpYWdyYW1Sb290RWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wYXJ0cy5EaWFncmFtRWRpdERvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnBhcnRzLkRpYWdyYW1HcmFwaGljYWxWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wYXJ0cy5JRGlhZ3JhbUdyYXBoaWNhbFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnNlcnZpY2VzLmVkaXRwYXJ0LkVkaXRQYXJ0U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogIFRoZSBncmFwaGljYWwgdmlld2VyIGZvciB0aGUgV29ya1Byb2R1Y3QgRGVwZW5kZW5jeSBkaWFncmFtLgotICogIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICovCi1wdWJsaWMgY2xhc3MgTmV3V1BEZXBlbmRlbmN5RGlhZ3JhbVZpZXdlciBleHRlbmRzCi0JCUFic3RyYWN0RGlhZ3JhbUdyYXBoaWNhbFZpZXdlckV4IHsKLQotCS8qKgotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiBAcGFyYW0gd3JhcHBlcgotCSAqLwotCXB1YmxpYyBOZXdXUERlcGVuZGVuY3lEaWFncmFtVmlld2VyKENvbXBvc2l0ZSBwYXJlbnQsIE9iamVjdCB3cmFwcGVyKSB7Ci0JCXN1cGVyKHBhcmVudCwgd3JhcHBlcik7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYudmlld2VyLkFic3RyYWN0RGlhZ3JhbUdyYXBoaWNhbFZpZXdlciNjcmVhdGVFZGl0UGFydChqYXZhLmxhbmcuT2JqZWN0LCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXIsIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5TdXBwcmVzc2lvbikKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRWRpdFBhcnQgY3JlYXRlRWRpdFBhcnQoT2JqZWN0IHdyYXBwZXIsIElGaWx0ZXIgZmlsdGVyLCBTdXBwcmVzc2lvbiBzdXApIHsKLQkJQWN0aXZpdHkgZSA9IG51bGw7Ci0JCWlmKHdyYXBwZXIgaW5zdGFuY2VvZiBBY3Rpdml0eVdyYXBwZXJJdGVtUHJvdmlkZXIpewotCQkJZSA9IChBY3Rpdml0eSlUbmdVdGlsLnVud3JhcCh3cmFwcGVyKTsKLQkJfWVsc2UgaWYod3JhcHBlciBpbnN0YW5jZW9mIEFjdGl2aXR5KXsKLQkJCWUgPSAoQWN0aXZpdHkpd3JhcHBlcjsKLQkJfQotCQlpZihlIGluc3RhbmNlb2YgQWN0aXZpdHkpewotCQkJdXBkYXRlRGlhZ3JhbUVsZW1lbnQoZGlhZ3JhbSwgKE1ldGhvZEVsZW1lbnQpZSwgc3VwLCBnZXRNZXRob2RDb25maWd1cmF0aW9uKCksCi0JCQkJCWZpbHRlciwKLQkJCQkJbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCQlEaWFncmFtRWRpdERvbWFpbiBkb21haW4gPSBuZXcgRGlhZ3JhbUVkaXREb21haW4obnVsbCk7Ci0JCQkoKElEaWFncmFtR3JhcGhpY2FsVmlld2VyKWdyYXBoaWNhbFZpZXdlcikuc2V0RWRpdERvbWFpbihkb21haW4pOwotCQkJcGFydCA9IEVkaXRQYXJ0U2VydmljZS5nZXRJbnN0YW5jZSgpLmNyZWF0ZUdyYXBoaWNFZGl0UGFydChkaWFncmFtKTsKLQkJCWlmKHBhcnQgPT0gbnVsbCl7Ci0JCQkJRGlhZ3JhbVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS4KLQkJCQlsb2dFcnJvcigiUHVibGlzaGluZzogV29ya1Byb2R1Y3QgRGlhZ3JhbSBFZGl0UGFydCBjcmVhdGlvbiBmYWlsZWQgZm9yIDogIitlKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJcmV0dXJuIHBhcnQ7Ci0JCX0KLQkJcmV0dXJuIHBhcnQ7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYudmlld2VyLkFic3RyYWN0RGlhZ3JhbUdyYXBoaWNhbFZpZXdlciNnZXREaWFncmFtVHlwZSgpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREaWFncmFtVHlwZSgpIHsKLQkJcmV0dXJuIFJlc291cmNlSGVscGVyLkRJQUdSQU1fVFlQRV9XUF9ERVBFTkRFTkNZOwotCX0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVHcmFwaGljYWxWaWV3ZXIoKSB7Ci0JCURpYWdyYW1HcmFwaGljYWxWaWV3ZXIgdmlld2VyID0gKERpYWdyYW1HcmFwaGljYWxWaWV3ZXIpIGdldEdyYXBoaWNhbFZpZXdlcigpOwotCQlEaWFncmFtUm9vdEVkaXRQYXJ0IHJvb3QgPSAoRGlhZ3JhbVJvb3RFZGl0UGFydCkgRWRpdFBhcnRTZXJ2aWNlCi0JCS5nZXRJbnN0YW5jZSgpLmNyZWF0ZVJvb3RFZGl0UGFydChnZXREaWFncmFtKCkpOwotCQlMYXllcmVkUGFuZSBwcmludGFibGVMYXllcnMgPSAoTGF5ZXJlZFBhbmUpIHJvb3QKLQkJCQkuZ2V0TGF5ZXIoTGF5ZXJDb25zdGFudHMuUFJJTlRBQkxFX0xBWUVSUyk7Ci0JCUZyZWVmb3JtTGF5ZXIgZXh0TGFiZWxzTGF5ZXIgPSBuZXcgRnJlZWZvcm1MYXllcigpOwotCQlleHRMYWJlbHNMYXllci5zZXRMYXlvdXRNYW5hZ2VyKG5ldyBEZWxlZ2F0aW5nTGF5b3V0KCkpOwotLy8JCXByaW50YWJsZUxheWVycy5hZGRMYXllckFmdGVyKGV4dExhYmVsc0xheWVyLAotLy8JCQkJRGlhZ3JhbUVkaXRQYXJ0RmFjdG9yeS5FWFRFUk5BTF9OT0RFX0xBQkVMU19MQVlFUiwKLS8vCQkJCUxheWVyQ29uc3RhbnRzLlBSSU1BUllfTEFZRVIpOwotCQlMYXllcmVkUGFuZSBzY2FsYWJsZUxheWVycyA9IChMYXllcmVkUGFuZSkgcm9vdAotCQkJCS5nZXRMYXllcihMYXllckNvbnN0YW50cy5TQ0FMQUJMRV9MQVlFUlMpOwotCQlGcmVlZm9ybUxheWVyIHNjYWxlZEZlZWRiYWNrTGF5ZXIgPSBuZXcgRnJlZWZvcm1MYXllcigpOwotCQlzY2FsZWRGZWVkYmFja0xheWVyLnNldEVuYWJsZWQoZmFsc2UpOwotCQlzY2FsYWJsZUxheWVycy5hZGRMYXllckFmdGVyKHNjYWxlZEZlZWRiYWNrTGF5ZXIsCi0JCQkJTGF5ZXJDb25zdGFudHMuU0NBTEVEX0ZFRURCQUNLX0xBWUVSLAotCQkJCURpYWdyYW1Sb290RWRpdFBhcnQuREVDT1JBVElPTl9VTlBSSU5UQUJMRV9MQVlFUik7Ci0JCXZpZXdlci5zZXRSb290RWRpdFBhcnQocm9vdCk7Ci0JCXZpZXdlci5zZXRFZGl0UGFydEZhY3RvcnkoY3JlYXRlRWRpdFBhcnRGYWN0b3J5KCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvLmNsYXNzcGF0aCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzUxYzhmMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLy5vcHRpb25zIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC8ub3B0aW9ucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmRiNjE1MC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLy5vcHRpb25zCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi0jIERlYnVnZ2luZyBvcHRpb25zIGZvciB0aGUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZCBwbHVnLWluCi0KLSMgVHVybiBvbiBnZW5lcmFsIGRlYnVnZ2luZyBmb3IgdGhlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQgcGx1Zy1pbgotb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9kZWJ1Zz1mYWxzZQotCi0jIFR1cm4gb24gZGVidWdnaW5nIG9mIHZpc3VhbElEIHByb2Nlc3NpbmcKLW9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvZGVidWcvdmlzdWFsSUQ9dHJ1ZQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvLnByb2plY3QgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNTdhZTQ1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmM2U3ODJiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZDsgc2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS41LjAucXVhbGlmaWVyCi1CdW5kbGUtQ2xhc3NQYXRoOiAuCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLnBhcnQuV1BERGlhZ3JhbUVkaXRvclBsdWdpbgotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5lZGl0LnBhcnRzLCAKLSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLnBhcnQsCi0gb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5wcm92aWRlcnMKLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUsCi0gb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMsCi0gb3JnLmVjbGlwc2UuamZhY2UsCi0gb3JnLmVjbGlwc2UudWkuaWRlLAotIG9yZy5lY2xpcHNlLnVpLnZpZXdzLAotIG9yZy5lY2xpcHNlLmVtZi5lY29yZSwKLSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLAotIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLAotIG9yZy5lY2xpcHNlLmdlZjt2aXNpYmlsaXR5Oj1yZWV4cG9ydCwKLSBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29yZSwKLSBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29tbWFuZHMuY29yZSwKLSBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudWkucHJvcGVydGllcywKLSBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLAotIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucHJpbnRpbmcucmVuZGVyLAotIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucHJpbnRpbmcsCi0gb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wcm9wZXJ0aWVzLAotIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucHJvdmlkZXJzLAotIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucHJvdmlkZXJzLmlkZSwKLSBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlbmRlciwKLSBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlc291cmNlcy5lZGl0b3IsCi0gb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXNvdXJjZXMuZWRpdG9yLmlkZSwKLSBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5wcm92aWRlcnMsCi0gb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uZWRpdDt2aXNpYmlsaXR5Oj1yZWV4cG9ydCwKLSBvcmcuZWNsaXBzZS5lcGYudW1hO3Zpc2liaWxpdHk6PXJlZXhwb3J0LAotIG9yZy5lY2xpcHNlLmVwZi51bWEuZWRpdDt2aXNpYmlsaXR5Oj1yZWV4cG9ydCwKLSBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWk7dmlzaWJpbGl0eTo9cmVleHBvcnQsCi0gb3JnLmVjbGlwc2UuZHJhdzJkO3Zpc2liaWxpdHk6PXJlZXhwb3J0LAotIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUsCi0gb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwsCi0gb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aQotRWNsaXBzZS1MYXp5U3RhcnQ6IHRydWUKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9idWlsZC5wcm9wZXJ0aWVzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZDkyZGI5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotYmluLmluY2x1ZGVzID0gLixcCi0gICAgICAgICAgICAgICBpY29ucy8sXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMKLWphcnMuY29tcGlsZS5vcmRlciA9IC4KLXNvdXJjZS4uID0gc3JjLwotb3V0cHV0Li4gPSBiaW4vClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9pY29ucy9kaWFncmFtL3dvcmtwcm9kdWN0ZGVzY3JpcHRvci5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL2ljb25zL2RpYWdyYW0vd29ya3Byb2R1Y3RkZXNjcmlwdG9yLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjIxODIyOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL2ljb25zL2RpYWdyYW0vd29ya3Byb2R1Y3RkZXNjcmlwdG9yLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvaWNvbnMvZnVsbC9kdG9vbDE2L1dQRERFZGl0b3IuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9pY29ucy9mdWxsL2R0b29sMTYvV1BEREVkaXRvci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1ZjVjN2EuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9pY29ucy9mdWxsL2R0b29sMTYvV1BEREVkaXRvci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL2ljb25zL2Z1bGwvZXRvb2wxNi9XUERERWRpdG9yLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvaWNvbnMvZnVsbC9ldG9vbDE2L1dQRERFZGl0b3IuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxODYxMmY0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvaWNvbnMvZnVsbC9ldG9vbDE2L1dQRERFZGl0b3IuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9pY29ucy9mdWxsL29iajE2L1dvcmtQcm9kdWN0RGVzY3JpcHRvci5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL2ljb25zL2Z1bGwvb2JqMTYvV29ya1Byb2R1Y3REZXNjcmlwdG9yLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjIxODIyOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL2ljb25zL2Z1bGwvb2JqMTYvV29ya1Byb2R1Y3REZXNjcmlwdG9yLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvaWNvbnMvZnVsbC9vYmoxNi9saW5rX3BhbDE2LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvaWNvbnMvZnVsbC9vYmoxNi9saW5rX3BhbDE2LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMThmNDA4Yy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL2ljb25zL2Z1bGwvb2JqMTYvbGlua19wYWwxNi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL2ljb25zL29iajE2L01vZGVsRGlhZ3JhbUZpbGUuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9pY29ucy9vYmoxNi9Nb2RlbERpYWdyYW1GaWxlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzM2NzZhNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL2ljb25zL29iajE2L01vZGVsRGlhZ3JhbUZpbGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9pY29ucy9vYmoxNi9VbWFEaWFncmFtRmlsZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL2ljb25zL29iajE2L1VtYURpYWdyYW1GaWxlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWUyMjljZi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL2ljb25zL29iajE2L1VtYURpYWdyYW1GaWxlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvaWNvbnMvd2l6YmFuL05ld01vZGVsV2l6YXJkLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvaWNvbnMvd2l6YmFuL05ld01vZGVsV2l6YXJkLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2RmODVmZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL2ljb25zL3dpemJhbi9OZXdNb2RlbFdpemFyZC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL2ljb25zL3dpemJhbi9OZXdVbWFXaXphcmQuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9pY29ucy93aXpiYW4vTmV3VW1hV2l6YXJkLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjMwNWI3Mi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL2ljb25zL3dpemJhbi9OZXdVbWFXaXphcmQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9tZXNzYWdlcy5wcm9wZXJ0aWVzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9tZXNzYWdlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OWUzNWYzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvbWVzc2FnZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSNOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIFNUQVJUIE5PIFRSQU5TTEFUSU9OCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBUT0RPOiBtYW51YWxseSBwdXQga2V5cyBhbmQgdmFsdWVzCi1EaWFncmFtRGlhZ3JhbUVkaXRvclV0aWxfT3Blbk1vZGVsUmVzb3VyY2VFcnJvckRpYWxvZ1RpdGxlPUVycm9yCi1EaWFncmFtRGlhZ3JhbUVkaXRvclV0aWxfT3Blbk1vZGVsUmVzb3VyY2VFcnJvckRpYWxvZ01lc3NhZ2U9RmFpbGVkIHRvIGxvYWQgbW9kZWwgZmlsZSB7MH0KLURpYWdyYW1EaWFncmFtRWRpdG9yVXRpbF9DcmVhdGVEaWFncmFtUHJvZ3Jlc3NUYXNrPUNyZWF0aW5nIGRpYWdyYW0gYW5kIG1vZGVsIGZpbGVzCi1EaWFncmFtRGlhZ3JhbUVkaXRvclV0aWxfQ3JlYXRlRGlhZ3JhbUNvbW1hbmRMYWJlbD1DcmVhdGluZyBkaWFncmFtIGFuZCBtb2RlbAotRGlhZ3JhbURvY3VtZW50UHJvdmlkZXJfaXNNb2RpZmlhYmxlPVVwZGF0aW5nIGNhY2hlIGZhaWxlZAotRGlhZ3JhbURvY3VtZW50UHJvdmlkZXJfaGFuZGxlRWxlbWVudENvbnRlbnRDaGFuZ2VkPUZhaWxlZCB0byByZWZyZXNoIGhpZXJhcmNoeSBmb3IgY2hhbmdlZCByZXNvdXJjZQotRGlhZ3JhbURvY3VtZW50UHJvdmlkZXJfSW5jb3JyZWN0SW5wdXRFcnJvcj17MX0KLURpYWdyYW1Eb2N1bWVudFByb3ZpZGVyX1VuYWJsZVRvTG9hZFJlc291cmNlRXJyb3I9VW5hYmxlIHRvIGxvYWQgZGlhZ3JhbSByZXNvdXJjZQotRGlhZ3JhbURvY3VtZW50UHJvdmlkZXJfTm9EaWFncmFtSW5SZXNvdXJjZUVycm9yPURpYWdyYW0gaXMgbm90IHByZXNlbnQgaW4gcmVzb3VyY2UKLURpYWdyYW1Eb2N1bWVudFByb3ZpZGVyX0RpYWdyYW1Mb2FkaW5nRXJyb3I9RXJyb3IgbG9hZGluZyBkaWFncmFtCi1EaWFncmFtRG9jdW1lbnRQcm92aWRlcl9VbnN5bmNocm9uaXplZEZpbGVTYXZlRXJyb3I9VGhlIGZpbGUgaGFzIGJlZW4gY2hhbmdlZCBvbiB0aGUgZmlsZSBzeXN0ZW0KLURpYWdyYW1Eb2N1bWVudFByb3ZpZGVyX1NhdmVEaWFncmFtVGFzaz1TYXZpbmcgZGlhZ3JhbQotRGlhZ3JhbURvY3VtZW50UHJvdmlkZXJfU2F2ZU5leHRSZXNvdXJjZVRhc2s9U2F2aW5nIHswfQotRGlhZ3JhbUluaXREaWFncmFtRmlsZUFjdGlvbl9Jbml0RGlhZ3JhbUZpbGVSZXNvdXJjZUVycm9yRGlhbG9nVGl0bGU9RXJyb3IKLURpYWdyYW1Jbml0RGlhZ3JhbUZpbGVBY3Rpb25fSW5pdERpYWdyYW1GaWxlUmVzb3VyY2VFcnJvckRpYWxvZ01lc3NhZ2U9TW9kZWwgZmlsZSBsb2FkaW5nIGZhaWxlZAotRGlhZ3JhbUluaXREaWFncmFtRmlsZUFjdGlvbl9Jbml0RGlhZ3JhbUZpbGVXaXphcmRUaXRsZT1Jbml0aWFsaXplIG5ldyB7MH0gZGlhZ3JhbSBmaWxlCi1EaWFncmFtSW5pdERpYWdyYW1GaWxlQWN0aW9uX09wZW5Nb2RlbEZpbGVEaWFsb2dUaXRsZT1TZWxlY3QgZG9tYWluIG1vZGVsCi1EaWFncmFtTmV3RGlhZ3JhbUZpbGVXaXphcmRfQ3JlYXRpb25QYWdlTmFtZT1Jbml0aWFsaXplIG5ldyBkaWFncmFtIGZpbGUKLURpYWdyYW1OZXdEaWFncmFtRmlsZVdpemFyZF9DcmVhdGlvblBhZ2VUaXRsZT1EaWFncmFtIGZpbGUKLURpYWdyYW1OZXdEaWFncmFtRmlsZVdpemFyZF9DcmVhdGlvblBhZ2VEZXNjcmlwdGlvbj1DcmVhdGUgbmV3IGRpYWdyYW0gYmFzZWQgb24gezB9IG1vZGVsIGNvbnRlbnQKLURpYWdyYW1OZXdEaWFncmFtRmlsZVdpemFyZF9Sb290U2VsZWN0aW9uUGFnZU5hbWU9U2VsZWN0IGRpYWdyYW0gcm9vdCBlbGVtZW50Ci1EaWFncmFtTmV3RGlhZ3JhbUZpbGVXaXphcmRfUm9vdFNlbGVjdGlvblBhZ2VUaXRsZT1EaWFncmFtIHJvb3QgZWxlbWVudAotRGlhZ3JhbU5ld0RpYWdyYW1GaWxlV2l6YXJkX1Jvb3RTZWxlY3Rpb25QYWdlRGVzY3JpcHRpb249U2VsZWN0IHNlbWFudGljIG1vZGVsIGVsZW1lbnQgdG8gYmUgZGVwaWN0ZWQgb24gZGlhZ3JhbQotRGlhZ3JhbU5ld0RpYWdyYW1GaWxlV2l6YXJkX1Jvb3RTZWxlY3Rpb25QYWdlU2VsZWN0aW9uVGl0bGU9U2VsZWN0IGRpYWdyYW0gcm9vdCBlbGVtZW50OgotRGlhZ3JhbU5ld0RpYWdyYW1GaWxlV2l6YXJkX1Jvb3RTZWxlY3Rpb25QYWdlTm9TZWxlY3Rpb25NZXNzYWdlPURpYWdyYW0gcm9vdCBlbGVtZW50IGlzIG5vdCBzZWxlY3RlZAotRGlhZ3JhbU5ld0RpYWdyYW1GaWxlV2l6YXJkX1Jvb3RTZWxlY3Rpb25QYWdlSW52YWxpZFNlbGVjdGlvbk1lc3NhZ2U9SW52YWxpZCBkaWFncmFtIHJvb3QgZWxlbWVudCBpcyBzZWxlY3RlZAotRGlhZ3JhbU5ld0RpYWdyYW1GaWxlV2l6YXJkX0luaXREaWFncmFtQ29tbWFuZD1Jbml0aWFsaXppbmcgZGlhZ3JhbSBjb250ZW50cwotRGlhZ3JhbU5ld0RpYWdyYW1GaWxlV2l6YXJkX0luY29ycmVjdFJvb3RFcnJvcj1JbmNvcnJlY3QgbW9kZWwgb2JqZWN0IHN0b3JlZCBhcyBhIHJvb3QgcmVzb3VyY2Ugb2JqZWN0Ci1Nb2RlbDFHcm91cF90aXRsZT1tb2RlbAotQ29udHJvbEZsb3cxQ3JlYXRpb25Ub29sX3RpdGxlPUNvbnRyb2wgRmxvdwotQ29udHJvbEZsb3cxQ3JlYXRpb25Ub29sX2Rlc2M9Q3JlYXRlIG5ldyBDb250cm9sIEZsb3cKLVdvcmtQcm9kdWN0RGVzY3JpcHRvcjJDcmVhdGlvblRvb2xfdGl0bGU9V29yayBQcm9kdWN0IERlc2NyaXB0b3IKLVdvcmtQcm9kdWN0RGVzY3JpcHRvcjJDcmVhdGlvblRvb2xfZGVzYz1DcmVhdGUgbmV3IHdvcmsgcHJvZHVjdCBkZXNjcmlwdG9yCi0KLUNvbW1hbmROYW1lX09wZW5EaWFncmFtPU9wZW4gRGlhZ3JhbQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgRU5EIE5PIFRSQU5TTEFUSU9OCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvbW9kZWwvd3BkZC5nbWZnZW4gYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL21vZGVsL3dwZGQuZ21mZ2VuCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYmRmZDFmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvbW9kZWwvd3BkZC5nbWZnZW4KKysrIC9kZXYvbnVsbApAQCAtMSwxNTggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxnbWZnZW46R2VuRWRpdG9yR2VuZXJhdG9yIHhtaTp2ZXJzaW9uPSIyLjAiCi0gICAgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIgotICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgeG1sbnM6Z21mZ2VuPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2dtZi8yMDA1L0dlbk1vZGVsIiBwYWNrYWdlTmFtZVByZWZpeD0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZCIKLSAgICBtb2RlbElEPSJXUEREIgotICAgIHNhbWVGaWxlRm9yRGlhZ3JhbUFuZE1vZGVsPSJ0cnVlIgotICAgIGRpYWdyYW1GaWxlRXh0ZW5zaW9uPSJ3cGRkIj4KLSAgPGRpYWdyYW0KLSAgICAgIHZpc3VhbElEPSI3OSIKLSAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJXb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtRWRpdFBhcnQiCi0gICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJXb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtSXRlbVNlbWFudGljRWRpdFBvbGljeSIKLSAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9IldvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW1WaWV3RmFjdG9yeSIKLSAgICAgIGljb25Qcm92aWRlclByaW9yaXR5PSJMb3ciCi0gICAgICBjYW5vbmljYWxFZGl0UG9saWN5Q2xhc3NOYW1lPSJXb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtQ2Fub25pY2FsRWRpdFBvbGljeSI+Ci0gICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MKLSAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vRGlhZ3JhbSIvPgotICAgIDxlbGVtZW50VHlwZQotICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOk1ldGFtb2RlbFR5cGUiCi0gICAgICAgIGVkaXRIZWxwZXJDbGFzc05hbWU9IldvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW1FZGl0SGVscGVyIi8+Ci0gICAgPHZpZXdtYXAKLSAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpGaWd1cmVWaWV3bWFwIgotICAgICAgICBmaWd1cmVRdWFsaWZpZWRDbGFzc05hbWU9Im9yZy5lY2xpcHNlLmRyYXcyZC5GcmVlZm9ybUxheWVyIi8+Ci0gICAgPGRvbWFpbkRpYWdyYW1FbGVtZW50Ci0gICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZ2VubW9kZWwjLy9tb2RlbC9Xb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtIi8+Ci0gICAgPHRvcExldmVsTm9kZXMKLSAgICAgICAgdmlzdWFsSUQ9IjEwMDEiCi0gICAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJXb3JrUHJvZHVjdE5vZGVFZGl0UGFydCIKLSAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iV29ya1Byb2R1Y3ROb2RlSXRlbVNlbWFudGljRWRpdFBvbGljeSIKLSAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iV29ya1Byb2R1Y3ROb2RlVmlld0ZhY3RvcnkiCi0gICAgICAgIGNhbm9uaWNhbEVkaXRQb2xpY3lDbGFzc05hbWU9IldvcmtQcm9kdWN0Tm9kZUNhbm9uaWNhbEVkaXRQb2xpY3kiCi0gICAgICAgIGdyYXBoaWNhbE5vZGVFZGl0UG9saWN5Q2xhc3NOYW1lPSJXb3JrUHJvZHVjdE5vZGVHcmFwaGljYWxOb2RlRWRpdFBvbGljeSI+Ci0gICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcwotICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL05vZGUiLz4KLSAgICAgIDxlbGVtZW50VHlwZQotICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46TWV0YW1vZGVsVHlwZSIKLSAgICAgICAgICBlZGl0SGVscGVyQ2xhc3NOYW1lPSJXb3JrUHJvZHVjdE5vZGVFZGl0SGVscGVyIi8+Ci0gICAgICA8dmlld21hcAotICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46SW5uZXJDbGFzc1ZpZXdtYXAiCi0gICAgICAgICAgY2xhc3NOYW1lPSJXb3JrUHJvZHVjdE5vZGVGaWd1cmUiCi0gICAgICAgICAgY2xhc3NCb2R5PSImI3hEOyYjeEE7JiN4RDsmI3hBOy8qKiYjeEQ7JiN4QTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyAqLyYjeEQ7JiN4QTtwdWJsaWMgY2xhc3MgV29ya1Byb2R1Y3ROb2RlRmlndXJlIGV4dGVuZHMgb3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZSB7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwdWJsaWMgV29ya1Byb2R1Y3ROb2RlRmlndXJlKCkgeyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3g5O3RoaXMuc2V0T3V0bGluZShmYWxzZSk7JiN4RDsmI3hBOyYjeDk7JiN4OTtjcmVhdGVDb250ZW50cygpOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIHZvaWQgY3JlYXRlQ29udGVudHMoKXsmI3hEOyYjeEE7JiN4OTsmI3g5O29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCBmaWdfMCA9IG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwoKTsmI3hEOyYjeEE7ZmlnXzAuc2V0VGV4dCgmcXVvdDtOZXcgV29yayBQcm9kdWN0IERlc2NyaXB0b3ImcXVvdDspOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5OyYjeDk7c2V0RmlndXJlTmFtZWROb2RlTmFtZUZpZ3VyZShmaWdfMCk7JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3g5O09iamVjdCBsYXlEYXRhMCA9IG51bGw7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5OyYjeDk7dGhpcy5hZGQoZmlnXzAsIGxheURhdGEwKTsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJpdmF0ZSBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZk5hbWVkTm9kZU5hbWVGaWd1cmU7ICYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHVibGljIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCBnZXRGaWd1cmVOYW1lZE5vZGVOYW1lRmlndXJlKCkgeyYjeEQ7JiN4QTsmI3g5OyYjeDk7cmV0dXJuIGZOYW1lZE5vZGVOYW1lRmlndXJlOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJpdmF0ZSB2b2lkIHNldEZpZ3VyZU5hbWVkTm9kZU5hbWVGaWd1cmUob3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIGZpZyl7JiN4RDsmI3hBOyYjeDk7JiN4OTtmTmFtZWROb2RlTmFtZUZpZ3VyZSA9IGZpZzsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIGJvb2xlYW4gbXlVc2VMb2NhbENvb3JkaW5hdGVzID0gZmFsc2U7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcm90ZWN0ZWQgYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKCkgeyYjeEQ7JiN4QTsmI3g5OyYjeDk7cmV0dXJuIG15VXNlTG9jYWxDb29yZGluYXRlczsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcm90ZWN0ZWQgdm9pZCBzZXRVc2VMb2NhbENvb3JkaW5hdGVzKGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcykgeyYjeEQ7JiN4QTsmI3g5OyYjeDk7bXlVc2VMb2NhbENvb3JkaW5hdGVzID0gdXNlTG9jYWxDb29yZGluYXRlczsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeEQ7JiN4QTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyI+Ci0gICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5kcmF3MmQ8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgIDwvdmlld21hcD4KLSAgICAgIDxtb2RlbEZhY2V0PgotICAgICAgICA8bWV0YUNsYXNzCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmdlbm1vZGVsIy8vbW9kZWwvV29ya1Byb2R1Y3ROb2RlIi8+Ci0gICAgICAgIDxjb250YWlubWVudE1ldGFGZWF0dXJlCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmdlbm1vZGVsIy8vbW9kZWwvTm9kZUNvbnRhaW5lci9ub2RlcyIvPgotICAgICAgICA8Y2hpbGRNZXRhRmVhdHVyZQotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5nZW5tb2RlbCMvL21vZGVsL05vZGVDb250YWluZXIvbm9kZXMiLz4KLSAgICAgIDwvbW9kZWxGYWNldD4KLSAgICAgIDxsYWJlbHMKLSAgICAgICAgICB2aXN1YWxJRD0iNDAwMSIKLSAgICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iV29ya1Byb2R1Y3ROb2RlTmFtZUVkaXRQYXJ0IgotICAgICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IldvcmtQcm9kdWN0Tm9kZU5hbWVJdGVtU2VtYW50aWNFZGl0UG9saWN5IgotICAgICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9IldvcmtQcm9kdWN0Tm9kZU5hbWVWaWV3RmFjdG9yeSIKLSAgICAgICAgICBlbGVtZW50SWNvbj0idHJ1ZSI+Ci0gICAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzCi0gICAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+Ci0gICAgICAgIDx2aWV3bWFwCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlBhcmVudEFzc2lnbmVkVmlld21hcCIKLSAgICAgICAgICAgIGdldHRlck5hbWU9ImdldEZpZ3VyZU5hbWVkTm9kZU5hbWVGaWd1cmUiCi0gICAgICAgICAgICBmaWd1cmVRdWFsaWZpZWRDbGFzc05hbWU9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCIvPgotICAgICAgICA8bW9kZWxGYWNldAotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpGZWF0dXJlTGFiZWxNb2RlbEZhY2V0IgotICAgICAgICAgICAgdmlld1BhdHRlcm49IiI+Ci0gICAgICAgICAgPG1ldGFGZWF0dXJlCi0gICAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZ2VubW9kZWwjLy9tb2RlbC9OYW1lZE5vZGUvbmFtZSIvPgotICAgICAgICA8L21vZGVsRmFjZXQ+Ci0gICAgICA8L2xhYmVscz4KLSAgICA8L3RvcExldmVsTm9kZXM+Ci0gICAgPGxpbmtzCi0gICAgICAgIHZpc3VhbElEPSIzMDAxIgotICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iTGlua0VkaXRQYXJ0IgotICAgICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJMaW5rSXRlbVNlbWFudGljRWRpdFBvbGljeSIKLSAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iTGlua1ZpZXdGYWN0b3J5Ij4KLSAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzCi0gICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vRWRnZSIvPgotICAgICAgPGVsZW1lbnRUeXBlCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpNZXRhbW9kZWxUeXBlIgotICAgICAgICAgIGVkaXRIZWxwZXJDbGFzc05hbWU9IkxpbmtFZGl0SGVscGVyIi8+Ci0gICAgICA8dmlld21hcAotICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46SW5uZXJDbGFzc1ZpZXdtYXAiCi0gICAgICAgICAgY2xhc3NOYW1lPSJMaW5rRmlndXJlIgotICAgICAgICAgIGNsYXNzQm9keT0iJiN4RDsmI3hBOyYjeEQ7JiN4QTsvKiomI3hEOyYjeEE7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsgKi8mI3hEOyYjeEE7cHVibGljIGNsYXNzIExpbmtGaWd1cmUgZXh0ZW5kcyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5Qb2x5bGluZUNvbm5lY3Rpb25FeCB7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwdWJsaWMgTGlua0ZpZ3VyZSgpIHsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7JiN4OTtzZXRUYXJnZXREZWNvcmF0aW9uKGNyZWF0ZVRhcmdldERlY29yYXRpb24oKSk7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3ByaXZhdGUgb3JnLmVjbGlwc2UuZHJhdzJkLlBvbHlsaW5lRGVjb3JhdGlvbiBjcmVhdGVUYXJnZXREZWNvcmF0aW9uKCkgeyYjeEQ7JiN4QTtvcmcuZWNsaXBzZS5kcmF3MmQuUG9seWxpbmVEZWNvcmF0aW9uIGRmID0gbmV3IG9yZy5lY2xpcHNlLmRyYXcyZC5Qb2x5bGluZURlY29yYXRpb24oKTsmI3hEOyYjeEE7Ly8gZGlzcGF0Y2hOZXh0PyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsmI3g5O29yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludExpc3QgcGwgPSBuZXcgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50TGlzdCgpOyYjeEQ7JiN4QTsmI3g5OyYjeDk7cGwuYWRkUG9pbnQoLTEsIDEpOyYjeEQ7JiN4QTsmI3g5OyYjeDk7cGwuYWRkUG9pbnQoMCwgMCk7JiN4RDsmI3hBOyYjeDk7JiN4OTtwbC5hZGRQb2ludCgtMSwgLTEpOyYjeEQ7JiN4QTsmI3g5OyYjeDk7ZGYuc2V0VGVtcGxhdGUocGwpOyYjeEQ7JiN4QTsmI3g5OyYjeDk7ZGYuc2V0U2NhbGUoZ2V0TWFwTW9kZSgpLkRQdG9MUCg3KSwgZ2V0TWFwTW9kZSgpLkRQdG9MUCgzKSk7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5OyYjeDk7cmV0dXJuIGRmOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4RDsmI3hBO30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7Ij4KLSAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmRyYXcyZDwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWk8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgPC92aWV3bWFwPgotICAgICAgPG1vZGVsRmFjZXQKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlR5cGVMaW5rTW9kZWxGYWNldCI+Ci0gICAgICAgIDxtZXRhQ2xhc3MKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZ2VubW9kZWwjLy9tb2RlbC9MaW5rIi8+Ci0gICAgICAgIDxjb250YWlubWVudE1ldGFGZWF0dXJlCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmdlbm1vZGVsIy8vbW9kZWwvTm9kZS9vdXRnb2luZ0Nvbm5lY3Rpb25zIi8+Ci0gICAgICAgIDxjaGlsZE1ldGFGZWF0dXJlCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmdlbm1vZGVsIy8vbW9kZWwvTm9kZS9vdXRnb2luZ0Nvbm5lY3Rpb25zIi8+Ci0gICAgICAgIDxzb3VyY2VNZXRhRmVhdHVyZQotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5nZW5tb2RlbCMvL21vZGVsL0xpbmsvc291cmNlIi8+Ci0gICAgICAgIDx0YXJnZXRNZXRhRmVhdHVyZQotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5nZW5tb2RlbCMvL21vZGVsL0xpbmsvdGFyZ2V0Ii8+Ci0gICAgICA8L21vZGVsRmFjZXQ+Ci0gICAgICA8bGFiZWxzCi0gICAgICAgICAgdmlzdWFsSUQ9IjQwMDIiCi0gICAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9IkxpbmtOYW1lRWRpdFBhcnQiCi0gICAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iTGlua05hbWVJdGVtU2VtYW50aWNFZGl0UG9saWN5IgotICAgICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9IkxpbmtOYW1lVmlld0ZhY3RvcnkiCi0gICAgICAgICAgZWxlbWVudEljb249InRydWUiPgotICAgICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcwotICAgICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vTm9kZSIvPgotICAgICAgICA8dmlld21hcAotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpJbm5lckNsYXNzVmlld21hcCIKLSAgICAgICAgICAgIGNsYXNzTmFtZT0iTGlua05hbWVGaWd1cmUiCi0gICAgICAgICAgICBjbGFzc0JvZHk9IiYjeEQ7JiN4QTsmI3hEOyYjeEE7LyoqJiN4RDsmI3hBOyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7ICovJiN4RDsmI3hBO3B1YmxpYyBjbGFzcyBMaW5rTmFtZUZpZ3VyZSBleHRlbmRzIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCB7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwdWJsaWMgTGlua05hbWVGaWd1cmUoKSB7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsmI3g5O3RoaXMuc2V0VGV4dCgmcXVvdDsmcXVvdDspOyYjeEQ7JiN4QTsmI3g5OyYjeDk7Y3JlYXRlQ29udGVudHMoKTsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbnRlbnRzKCl7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIGJvb2xlYW4gbXlVc2VMb2NhbENvb3JkaW5hdGVzID0gZmFsc2U7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcm90ZWN0ZWQgYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKCkgeyYjeEQ7JiN4QTsmI3g5OyYjeDk7cmV0dXJuIG15VXNlTG9jYWxDb29yZGluYXRlczsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcm90ZWN0ZWQgdm9pZCBzZXRVc2VMb2NhbENvb3JkaW5hdGVzKGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcykgeyYjeEQ7JiN4QTsmI3g5OyYjeDk7bXlVc2VMb2NhbENvb3JkaW5hdGVzID0gdXNlTG9jYWxDb29yZGluYXRlczsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeEQ7JiN4QTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyI+Ci0gICAgICAgICAgPGF0dHJpYnV0ZXMKLSAgICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpMYWJlbE9mZnNldEF0dHJpYnV0ZXMiCi0gICAgICAgICAgICAgIHk9IjQwIi8+Ci0gICAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmRyYXcyZDwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aTwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICAgIDwvdmlld21hcD4KLSAgICAgICAgPG1vZGVsRmFjZXQKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46RmVhdHVyZUxhYmVsTW9kZWxGYWNldCIKLSAgICAgICAgICAgIHZpZXdQYXR0ZXJuPSIiCi0gICAgICAgICAgICBlZGl0UGF0dGVybj0iIj4KLSAgICAgICAgICA8bWV0YUZlYXR1cmUKLSAgICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5nZW5tb2RlbCMvL21vZGVsL0xpbmsvbmFtZSIvPgotICAgICAgICA8L21vZGVsRmFjZXQ+Ci0gICAgICA8L2xhYmVscz4KLSAgICA8L2xpbmtzPgotICAgIDxwYWxldHRlPgotICAgICAgPGdyb3VwcwotICAgICAgICAgIHRpdGxlPSJtb2RlbCI+Ci0gICAgICAgIDxlbnRyaWVzCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlRvb2xFbnRyeSIKLSAgICAgICAgICAgIHRpdGxlPSJDb250cm9sIEZsb3ciCi0gICAgICAgICAgICBkZXNjcmlwdGlvbj0iQ3JlYXRlIG5ldyBDb250cm9sIEZsb3ciCi0gICAgICAgICAgICBzbWFsbEljb25QYXRoPSIvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9pY29ucy9mdWxsL29iajE2L2xpbmtfcGFsMTYuZ2lmIgotICAgICAgICAgICAgZ2VuTGlua3M9Ii8vQGRpYWdyYW0vQGxpbmtzLjAiLz4KLSAgICAgICAgPGVudHJpZXMKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46VG9vbEVudHJ5IgotICAgICAgICAgICAgdGl0bGU9IldvcmsgUHJvZHVjdCBEZXNjcmlwdG9yIgotICAgICAgICAgICAgZGVzY3JpcHRpb249IkNyZWF0ZSBuZXcgd29yayBwcm9kdWN0IGRlc2NyaXB0b3IiCi0gICAgICAgICAgICBzbWFsbEljb25QYXRoPSIvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9pY29ucy9mdWxsL29iajE2L1dvcmtQcm9kdWN0RGVzY3JpcHRvci5naWYiCi0gICAgICAgICAgICBnZW5Ob2Rlcz0iLy9AZGlhZ3JhbS9AdG9wTGV2ZWxOb2Rlcy4wIi8+Ci0gICAgICA8L2dyb3Vwcz4KLSAgICA8L3BhbGV0dGU+Ci0gIDwvZGlhZ3JhbT4KLSAgPHBsdWdpbgotICAgICAgaUQ9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQiCi0gICAgICBuYW1lPSJXb3JrIFByb2R1Y3QgRGVwZW5kZW5jeSBEaWFncmFtIFBsdWdpbiIKLSAgICAgIHByb3ZpZGVyPSJFUEYiCi0gICAgICBwcmludGluZ0VuYWJsZWQ9InRydWUiCi0gICAgICBhY3RpdmF0b3JDbGFzc05hbWU9IldQRERpYWdyYW1FZGl0b3JQbHVnaW4iLz4KLSAgPGVkaXRvcgotICAgICAgY2xhc3NOYW1lPSJXb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtRWRpdG9yIi8+Ci0gIDxkb21haW5HZW5Nb2RlbAotICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5nZW5tb2RlbCMvIi8+Ci08L2dtZmdlbjpHZW5FZGl0b3JHZW5lcmF0b3I+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL21vZGVsL3dwZGQuZ21mZ3JhcGggYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL21vZGVsL3dwZGQuZ21mZ3JhcGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2NWQyM2YuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9tb2RlbC93cGRkLmdtZmdyYXBoCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxnbWZncmFwaDpDYW52YXMgeG1pOnZlcnNpb249IjIuMCIKLSAgICB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiCi0gICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgICB4bWxuczpnbWZncmFwaD0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9nbWYvMjAwNS9HcmFwaGljYWxEZWZpbml0aW9uIiBuYW1lPSJtb2RlbCI+Ci0gIDxmaWd1cmVzCi0gICAgICBuYW1lPSJEZWZhdWx0Ij4KLSAgICA8ZmlndXJlcwotICAgICAgICB4c2k6dHlwZT0iZ21mZ3JhcGg6UG9seWxpbmVDb25uZWN0aW9uIgotICAgICAgICByZWZlcmVuY2luZ0VsZW1lbnRzPSJMaW5rIgotICAgICAgICBuYW1lPSJMaW5rRmlndXJlIgotICAgICAgICB0YXJnZXREZWNvcmF0aW9uPSJPcGVuQXJyb3ciPgotICAgICAgPGNoaWxkcmVuCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdyYXBoOlBvbHlsaW5lRGVjb3JhdGlvbiIKLSAgICAgICAgICBuYW1lPSJPcGVuQXJyb3ciPgotICAgICAgICA8dGVtcGxhdGUKLSAgICAgICAgICAgIHg9Ii0xIgotICAgICAgICAgICAgeT0iMSIvPgotICAgICAgICA8dGVtcGxhdGUvPgotICAgICAgICA8dGVtcGxhdGUKLSAgICAgICAgICAgIHg9Ii0xIgotICAgICAgICAgICAgeT0iLTEiLz4KLSAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICA8Y2hpbGRyZW4KLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ3JhcGg6TGFiZWwiCi0gICAgICAgICAgcmVmZXJlbmNpbmdFbGVtZW50cz0iTGlua05hbWUiCi0gICAgICAgICAgbmFtZT0iTGlua05hbWVGaWd1cmUiCi0gICAgICAgICAgdGV4dD0iIi8+Ci0gICAgPC9maWd1cmVzPgotICAgIDxmaWd1cmVzCi0gICAgICAgIHhzaTp0eXBlPSJnbWZncmFwaDpSZWN0YW5nbGUiCi0gICAgICAgIHJlZmVyZW5jaW5nRWxlbWVudHM9IldvcmtQcm9kdWN0Tm9kZSIKLSAgICAgICAgbmFtZT0iV29ya1Byb2R1Y3ROb2RlRmlndXJlIgotICAgICAgICBvdXRsaW5lPSJmYWxzZSI+Ci0gICAgICA8Y2hpbGRyZW4KLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ3JhcGg6TGFiZWwiCi0gICAgICAgICAgcmVmZXJlbmNpbmdFbGVtZW50cz0iTmFtZWROb2RlTmFtZSIKLSAgICAgICAgICBuYW1lPSJOYW1lZE5vZGVOYW1lRmlndXJlIgotICAgICAgICAgIHRleHQ9Ik5ldyBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvciIvPgotICAgIDwvZmlndXJlcz4KLSAgPC9maWd1cmVzPgotICA8bm9kZXMKLSAgICAgIG5hbWU9IldvcmtQcm9kdWN0Tm9kZSIKLSAgICAgIGZpZ3VyZT0iV29ya1Byb2R1Y3ROb2RlRmlndXJlIi8+Ci0gIDxjb25uZWN0aW9ucwotICAgICAgbmFtZT0iTGluayIKLSAgICAgIGZpZ3VyZT0iTGlua0ZpZ3VyZSIvPgotICA8bGFiZWxzCi0gICAgICBuYW1lPSJMaW5rTmFtZSIKLSAgICAgIGZpZ3VyZT0iTGlua05hbWVGaWd1cmUiLz4KLSAgPGxhYmVscwotICAgICAgbmFtZT0iTmFtZWROb2RlTmFtZSIKLSAgICAgIGZpZ3VyZT0iTmFtZWROb2RlTmFtZUZpZ3VyZSIvPgotPC9nbWZncmFwaDpDYW52YXM+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL21vZGVsL3dwZGQuZ21mbWFwIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9tb2RlbC93cGRkLmdtZm1hcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWZkOWY0Yi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL21vZGVsL3dwZGQuZ21mbWFwCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxnbWZtYXA6TWFwcGluZyB4bWk6dmVyc2lvbj0iMi4wIgotICAgIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIKLSAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICAgIHhtbG5zOmVjb3JlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIgotICAgIHhtbG5zOmdtZm1hcD0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9nbWYvMjAwNS9tYXBwaW5ncyIKLSAgICB4bWxuczpnbWZ0b29sPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2dtZi8yMDA1L1Rvb2xEZWZpbml0aW9uIj4KLSAgPG5vZGVzPgotICAgIDxjb250YWlubWVudEZlYXR1cmUKLSAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5lY29yZSMvL05vZGVDb250YWluZXIvbm9kZXMiLz4KLSAgICA8b3duZWRDaGlsZD4KLSAgICAgIDxkb21haW5NZXRhRWxlbWVudAotICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZWNvcmUjLy9Xb3JrUHJvZHVjdE5vZGUiLz4KLSAgICAgIDxsYWJlbE1hcHBpbmdzCi0gICAgICAgICAgdmlld1BhdHRlcm49IiI+Ci0gICAgICAgIDxkaWFncmFtTGFiZWwKLSAgICAgICAgICAgIGhyZWY9IndwZGQuZ21mZ3JhcGgjTmFtZWROb2RlTmFtZSIvPgotICAgICAgICA8ZmVhdHVyZXMKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZWNvcmUjLy9OYW1lZE5vZGUvbmFtZSIvPgotICAgICAgPC9sYWJlbE1hcHBpbmdzPgotICAgICAgPGNvbnRleHRNZW51Ci0gICAgICAgICAgaHJlZj0id3BkZC5nbWZ0b29sIy8vQGFsbE1lbnVzLjAiLz4KLSAgICAgIDx0b29sCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZnRvb2w6Q3JlYXRpb25Ub29sIgotICAgICAgICAgIGhyZWY9IndwZGQuZ21mdG9vbCMvL0BwYWxldHRlL0B0b29scy4wL0B0b29scy4xIi8+Ci0gICAgICA8ZGlhZ3JhbU5vZGUKLSAgICAgICAgICBocmVmPSJ3cGRkLmdtZmdyYXBoI1dvcmtQcm9kdWN0Tm9kZSIvPgotICAgIDwvb3duZWRDaGlsZD4KLSAgPC9ub2Rlcz4KLSAgPGxpbmtzPgotICAgIDxkb21haW5NZXRhRWxlbWVudAotICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmVjb3JlIy8vTGluayIvPgotICAgIDxsYWJlbE1hcHBpbmdzCi0gICAgICAgIHZpZXdQYXR0ZXJuPSIiCi0gICAgICAgIGVkaXRQYXR0ZXJuPSIiPgotICAgICAgPGRpYWdyYW1MYWJlbAotICAgICAgICAgIGhyZWY9IndwZGQuZ21mZ3JhcGgjTGlua05hbWUiLz4KLSAgICAgIDxmZWF0dXJlcwotICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZWNvcmUjLy9MaW5rL25hbWUiLz4KLSAgICA8L2xhYmVsTWFwcGluZ3M+Ci0gICAgPGNvbnRhaW5tZW50RmVhdHVyZQotICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmVjb3JlIy8vTm9kZS9vdXRnb2luZ0Nvbm5lY3Rpb25zIi8+Ci0gICAgPHRvb2wKLSAgICAgICAgeHNpOnR5cGU9ImdtZnRvb2w6Q3JlYXRpb25Ub29sIgotICAgICAgICBocmVmPSJ3cGRkLmdtZnRvb2wjLy9AcGFsZXR0ZS9AdG9vbHMuMC9AdG9vbHMuMCIvPgotICAgIDxkaWFncmFtTGluawotICAgICAgICBocmVmPSJ3cGRkLmdtZmdyYXBoI0xpbmsiLz4KLSAgICA8c291cmNlTWV0YUZlYXR1cmUKLSAgICAgICAgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiCi0gICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZWNvcmUjLy9MaW5rL3NvdXJjZSIvPgotICAgIDxsaW5rTWV0YUZlYXR1cmUKLSAgICAgICAgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiCi0gICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZWNvcmUjLy9MaW5rL3RhcmdldCIvPgotICA8L2xpbmtzPgotICA8ZGlhZ3JhbT4KLSAgICA8ZGlhZ3JhbUNhbnZhcwotICAgICAgICBocmVmPSJ3cGRkLmdtZmdyYXBoI21vZGVsIi8+Ci0gICAgPGRvbWFpbk1vZGVsCi0gICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZWNvcmUjLyIvPgotICAgIDxkb21haW5NZXRhRWxlbWVudAotICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmVjb3JlIy8vV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbSIvPgotICAgIDxwYWxldHRlCi0gICAgICAgIGhyZWY9IndwZGQuZ21mdG9vbCMvL0BwYWxldHRlIi8+Ci0gIDwvZGlhZ3JhbT4KLTwvZ21mbWFwOk1hcHBpbmc+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL21vZGVsL3dwZGQuZ21mdG9vbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvbW9kZWwvd3BkZC5nbWZ0b29sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYjk3OTJhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvbW9kZWwvd3BkZC5nbWZ0b29sCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxnbWZ0b29sOlRvb2xSZWdpc3RyeSB4bWk6dmVyc2lvbj0iMi4wIgotICAgIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIKLSAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICAgIHhtbG5zOmdtZnRvb2w9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZ21mLzIwMDUvVG9vbERlZmluaXRpb24iPgotICA8YWxsTWVudXMKLSAgICAgIHhzaTp0eXBlPSJnbWZ0b29sOkNvbnRleHRNZW51IgotICAgICAgZGVmYXVsdD0iLy9AYWxsTWVudXMuMC9AaXRlbXMuMCI+Ci0gICAgPGl0ZW1zCi0gICAgICAgIHhzaTp0eXBlPSJnbWZ0b29sOk1lbnVBY3Rpb24iCi0gICAgICAgIHRpdGxlPSJXb3JrUHJvZHVjdCBOb2RlIgotICAgICAgICBraW5kPSJDVVNUT00iCi0gICAgICAgIGhvdEtleT0iQUxUK1ciLz4KLSAgPC9hbGxNZW51cz4KLSAgPHBhbGV0dGU+Ci0gICAgPHRvb2xzCi0gICAgICAgIHhzaTp0eXBlPSJnbWZ0b29sOlRvb2xHcm91cCIKLSAgICAgICAgdGl0bGU9Im1vZGVsIj4KLSAgICAgIDx0b29scwotICAgICAgICAgIHhzaTp0eXBlPSJnbWZ0b29sOkNyZWF0aW9uVG9vbCIKLSAgICAgICAgICB0aXRsZT0iQ29udHJvbCBGbG93IgotICAgICAgICAgIGRlc2NyaXB0aW9uPSJDcmVhdGUgbmV3IENvbnRyb2wgRmxvdyI+Ci0gICAgICAgIDxzbWFsbEljb24KLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZ0b29sOkJ1bmRsZUltYWdlIgotICAgICAgICAgICAgcGF0aD0iaWNvbnMvZnVsbC9vYmoxNi9saW5rX3BhbDE2LmdpZiIKLSAgICAgICAgICAgIGJ1bmRsZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZCIvPgotICAgICAgPC90b29scz4KLSAgICAgIDx0b29scwotICAgICAgICAgIHhzaTp0eXBlPSJnbWZ0b29sOkNyZWF0aW9uVG9vbCIKLSAgICAgICAgICB0aXRsZT0iV29yayBQcm9kdWN0IERlc2NyaXB0b3IiCi0gICAgICAgICAgZGVzY3JpcHRpb249IkNyZWF0ZSBuZXcgd29yayBwcm9kdWN0IGRlc2NyaXB0b3IiPgotICAgICAgICA8c21hbGxJY29uCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mdG9vbDpCdW5kbGVJbWFnZSIKLSAgICAgICAgICAgIHBhdGg9Imljb25zL2Z1bGwvb2JqMTYvV29ya1Byb2R1Y3REZXNjcmlwdG9yLmdpZiIKLSAgICAgICAgICAgIGJ1bmRsZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZCIvPgotICAgICAgPC90b29scz4KLSAgICA8L3Rvb2xzPgotICA8L3BhbGV0dGU+Ci08L2dtZnRvb2w6VG9vbFJlZ2lzdHJ5PgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9tb2RlbC93cGRkMi5nbWZnZW4gYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL21vZGVsL3dwZGQyLmdtZmdlbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjU3ZTBjZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL21vZGVsL3dwZGQyLmdtZmdlbgorKysgL2Rldi9udWxsCkBAIC0xLDIzOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGdtZmdlbjpHZW5FZGl0b3JHZW5lcmF0b3IgeG1pOnZlcnNpb249IjIuMCIKLSAgICB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiCi0gICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgICB4bWxuczpnbWZnZW49Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZ21mLzIwMDUvR2VuTW9kZWwvMi4wIj4KLSAgPGRpYWdyYW0KLSAgICAgIHZpc3VhbElEPSI3OSIKLSAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJXb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtRWRpdFBhcnQiCi0gICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJXb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtSXRlbVNlbWFudGljRWRpdFBvbGljeSIKLSAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9IldvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW1WaWV3RmFjdG9yeSIKLSAgICAgIGNhbm9uaWNhbEVkaXRQb2xpY3lDbGFzc05hbWU9IldvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW1DYW5vbmljYWxFZGl0UG9saWN5IgotICAgICAgaWNvblByb3ZpZGVyUHJpb3JpdHk9IkxvdyIKLSAgICAgIHZhbGlkYXRpb25Qcm92aWRlclByaW9yaXR5PSJMb3ciPgotICAgIDxkaWFncmFtUnVuVGltZUNsYXNzCi0gICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL0RpYWdyYW0iLz4KLSAgICA8ZWxlbWVudFR5cGUKLSAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpNZXRhbW9kZWxUeXBlIgotICAgICAgICBlZGl0SGVscGVyQ2xhc3NOYW1lPSJXb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtRWRpdEhlbHBlciIvPgotICAgIDx2aWV3bWFwCi0gICAgICAgIHhzaTp0eXBlPSJnbWZnZW46RmlndXJlVmlld21hcCIKLSAgICAgICAgZmlndXJlUXVhbGlmaWVkQ2xhc3NOYW1lPSJvcmcuZWNsaXBzZS5kcmF3MmQuRnJlZWZvcm1MYXllciIvPgotICAgIDxkb21haW5EaWFncmFtRWxlbWVudAotICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmdlbm1vZGVsIy8vbW9kZWwvV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbSIvPgotICAgIDx0b3BMZXZlbE5vZGVzCi0gICAgICAgIHZpc3VhbElEPSIxMDAxIgotICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iV29ya1Byb2R1Y3ROb2RlRWRpdFBhcnQiCi0gICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IldvcmtQcm9kdWN0Tm9kZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiCi0gICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9IldvcmtQcm9kdWN0Tm9kZVZpZXdGYWN0b3J5IgotICAgICAgICBjYW5vbmljYWxFZGl0UG9saWN5Q2xhc3NOYW1lPSJXb3JrUHJvZHVjdE5vZGVDYW5vbmljYWxFZGl0UG9saWN5IgotICAgICAgICBncmFwaGljYWxOb2RlRWRpdFBvbGljeUNsYXNzTmFtZT0iV29ya1Byb2R1Y3ROb2RlR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kiCi0gICAgICAgIGNyZWF0ZUNvbW1hbmRDbGFzc05hbWU9IldvcmtQcm9kdWN0Tm9kZUNyZWF0ZUNvbW1hbmQiPgotICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MKLSAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+Ci0gICAgICA8ZWxlbWVudFR5cGUKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOk1ldGFtb2RlbFR5cGUiCi0gICAgICAgICAgZWRpdEhlbHBlckNsYXNzTmFtZT0iV29ya1Byb2R1Y3ROb2RlRWRpdEhlbHBlciIvPgotICAgICAgPHZpZXdtYXAKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOklubmVyQ2xhc3NWaWV3bWFwIgotICAgICAgICAgIGNsYXNzTmFtZT0iV29ya1Byb2R1Y3ROb2RlRmlndXJlIgotICAgICAgICAgIGNsYXNzQm9keT0iJiN4QTsvKiomI3hBOyAqIEBnZW5lcmF0ZWQmI3hBOyAqLyYjeEE7cHVibGljIGNsYXNzIFdvcmtQcm9kdWN0Tm9kZUZpZ3VyZSBleHRlbmRzIG9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmUgeyYjeEE7JiN4OTsvKiomI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEE7JiN4OTsgKi8mI3hBOyYjeDk7cHVibGljIFdvcmtQcm9kdWN0Tm9kZUZpZ3VyZSgpIHsmI3hBOyYjeDk7JiN4OTsmI3g5OyYjeDk7dGhpcy5zZXRGaWxsKHRydWUpOyYjeEE7dGhpcy5zZXRGaWxsWE9SKGZhbHNlKTsmI3hBO3RoaXMuc2V0T3V0bGluZShmYWxzZSk7JiN4QTt0aGlzLnNldE91dGxpbmVYT1IoZmFsc2UpOyYjeEE7dGhpcy5zZXRMaW5lV2lkdGgoMSk7JiN4QTt0aGlzLnNldExpbmVTdHlsZShvcmcuZWNsaXBzZS5kcmF3MmQuR3JhcGhpY3MuTElORV9TT0xJRCk7JiN4QTsmI3g5OyYjeDk7Y3JlYXRlQ29udGVudHMoKTsmI3hBOyYjeDk7fSYjeEE7JiN4OTsvKiomI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEE7JiN4OTsgKi8mI3hBOyYjeDk7cHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbnRlbnRzKCl7JiN4QTsmI3hBOyYjeEE7JiN4QTtvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgbmFtZWROb2RlTmFtZUZpZ3VyZTAgPSBuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsKCk7JiN4QTtuYW1lZE5vZGVOYW1lRmlndXJlMC5zZXRUZXh0KCZxdW90O05ldyBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvciZxdW90Oyk7JiN4QTsmI3hBO3RoaXMuYWRkKG5hbWVkTm9kZU5hbWVGaWd1cmUwKTsmI3hBO3NldEZpZ3VyZU5hbWVkTm9kZU5hbWVGaWd1cmUobmFtZWROb2RlTmFtZUZpZ3VyZTApOyYjeEE7JiN4QTsmI3g5O30mI3hBOyYjeDk7LyoqJiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hBOyYjeDk7ICovJiN4QTsmI3g5O3ByaXZhdGUgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIGZOYW1lZE5vZGVOYW1lRmlndXJlOyAmI3hBOyYjeEE7JiN4OTsvKiomI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEE7JiN4OTsgKi8mI3hBOyYjeDk7cHVibGljIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCBnZXRGaWd1cmVOYW1lZE5vZGVOYW1lRmlndXJlKCkgeyYjeEE7JiN4OTsmI3g5O3JldHVybiBmTmFtZWROb2RlTmFtZUZpZ3VyZTsmI3hBOyYjeDk7fSYjeEE7JiN4OTsmI3hBOyYjeDk7LyoqJiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hBOyYjeDk7ICovJiN4QTsmI3g5O3ByaXZhdGUgdm9pZCBzZXRGaWd1cmVOYW1lZE5vZGVOYW1lRmlndXJlKG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCBmaWcpeyYjeEE7JiN4OTsmI3g5O2ZOYW1lZE5vZGVOYW1lRmlndXJlID0gZmlnOyYjeEE7JiN4OTt9JiN4QTsmI3hBOyYjeEE7JiN4QTsmI3hBOyYjeEE7JiN4OTsvKiomI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEE7JiN4OTsgKi8mI3hBOyYjeDk7cHJpdmF0ZSBib29sZWFuIG15VXNlTG9jYWxDb29yZGluYXRlcyA9IGZhbHNlOyYjeEE7JiN4QTsmI3g5Oy8qKiYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4QTsmI3g5OyAqLyYjeEE7JiN4OTtwcm90ZWN0ZWQgYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKCkgeyYjeEE7JiN4OTsmI3g5O3JldHVybiBteVVzZUxvY2FsQ29vcmRpbmF0ZXM7JiN4QTsmI3g5O30mI3hBOyYjeEE7JiN4OTsvKiomI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEE7JiN4OTsgKi8mI3hBOyYjeDk7cHJvdGVjdGVkIHZvaWQgc2V0VXNlTG9jYWxDb29yZGluYXRlcyhib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMpIHsmI3hBOyYjeDk7JiN4OTtteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSB1c2VMb2NhbENvb3JkaW5hdGVzOyYjeEE7JiN4OTt9JiN4QTsmI3hBO30mI3hBOyYjeEE7Ij4KLSAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmRyYXcyZDwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWk8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgPC92aWV3bWFwPgotICAgICAgPG1vZGVsRmFjZXQ+Ci0gICAgICAgIDxtZXRhQ2xhc3MKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZ2VubW9kZWwjLy9tb2RlbC9Xb3JrUHJvZHVjdE5vZGUiLz4KLSAgICAgICAgPGNvbnRhaW5tZW50TWV0YUZlYXR1cmUKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZ2VubW9kZWwjLy9tb2RlbC9Ob2RlQ29udGFpbmVyL25vZGVzIi8+Ci0gICAgICAgIDxjaGlsZE1ldGFGZWF0dXJlCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmdlbm1vZGVsIy8vbW9kZWwvTm9kZUNvbnRhaW5lci9ub2RlcyIvPgotICAgICAgPC9tb2RlbEZhY2V0PgotICAgICAgPGxhYmVscwotICAgICAgICAgIHZpc3VhbElEPSI0MDAxIgotICAgICAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJXb3JrUHJvZHVjdE5vZGVOYW1lRWRpdFBhcnQiCi0gICAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iV29ya1Byb2R1Y3ROb2RlTmFtZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiCi0gICAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iV29ya1Byb2R1Y3ROb2RlTmFtZVZpZXdGYWN0b3J5IgotICAgICAgICAgIGVsZW1lbnRJY29uPSJ0cnVlIj4KLSAgICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL05vZGUiLz4KLSAgICAgICAgPHZpZXdtYXAKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46UGFyZW50QXNzaWduZWRWaWV3bWFwIgotICAgICAgICAgICAgZ2V0dGVyTmFtZT0iZ2V0RmlndXJlTmFtZWROb2RlTmFtZUZpZ3VyZSIKLSAgICAgICAgICAgIGZpZ3VyZVF1YWxpZmllZENsYXNzTmFtZT0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIi8+Ci0gICAgICAgIDxtb2RlbEZhY2V0Ci0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOkZlYXR1cmVMYWJlbE1vZGVsRmFjZXQiCi0gICAgICAgICAgICB2aWV3UGF0dGVybj0iezB9Ij4KLSAgICAgICAgICA8bWV0YUZlYXR1cmVzCi0gICAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZ2VubW9kZWwjLy9tb2RlbC9OYW1lZE5vZGUvbmFtZSIvPgotICAgICAgICA8L21vZGVsRmFjZXQ+Ci0gICAgICA8L2xhYmVscz4KLSAgICA8L3RvcExldmVsTm9kZXM+Ci0gICAgPGxpbmtzCi0gICAgICAgIHZpc3VhbElEPSIzMDAxIgotICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iTGlua0VkaXRQYXJ0IgotICAgICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJMaW5rSXRlbVNlbWFudGljRWRpdFBvbGljeSIKLSAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iTGlua1ZpZXdGYWN0b3J5IgotICAgICAgICBjcmVhdGVDb21tYW5kQ2xhc3NOYW1lPSJMaW5rQ3JlYXRlQ29tbWFuZCIKLSAgICAgICAgcmVvcmllbnRDb21tYW5kQ2xhc3NOYW1lPSJMaW5rUmVvcmllbnRDb21tYW5kIj4KLSAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzCi0gICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vRWRnZSIvPgotICAgICAgPGVsZW1lbnRUeXBlCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpNZXRhbW9kZWxUeXBlIgotICAgICAgICAgIGVkaXRIZWxwZXJDbGFzc05hbWU9IkxpbmtFZGl0SGVscGVyIi8+Ci0gICAgICA8dmlld21hcAotICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46SW5uZXJDbGFzc1ZpZXdtYXAiCi0gICAgICAgICAgY2xhc3NOYW1lPSJMaW5rRmlndXJlIgotICAgICAgICAgIGNsYXNzQm9keT0iJiN4QTsvKiomI3hBOyAqIEBnZW5lcmF0ZWQmI3hBOyAqLyYjeEE7cHVibGljIGNsYXNzIExpbmtGaWd1cmUgZXh0ZW5kcyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5Qb2x5bGluZUNvbm5lY3Rpb25FeCB7JiN4QTsmI3hBOyYjeDk7LyoqJiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hBOyYjeDk7ICovJiN4QTsmI3g5O3B1YmxpYyBMaW5rRmlndXJlKCkgeyYjeEE7JiN4OTsmI3g5O3RoaXMuc2V0RmlsbCh0cnVlKTsmI3hBO3RoaXMuc2V0RmlsbFhPUihmYWxzZSk7JiN4QTt0aGlzLnNldE91dGxpbmUodHJ1ZSk7JiN4QTt0aGlzLnNldE91dGxpbmVYT1IoZmFsc2UpOyYjeEE7dGhpcy5zZXRMaW5lV2lkdGgoMSk7JiN4QTt0aGlzLnNldExpbmVTdHlsZShvcmcuZWNsaXBzZS5kcmF3MmQuR3JhcGhpY3MuTElORV9TT0xJRCk7JiN4QTsmI3hBOyYjeDk7JiN4OTtzZXRUYXJnZXREZWNvcmF0aW9uKGNyZWF0ZVRhcmdldERlY29yYXRpb24oKSk7JiN4QTsmI3g5O30mI3hBOyYjeEE7JiN4OTsvKiomI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEE7JiN4OTsgKi8mI3hBOyYjeDk7cHJpdmF0ZSBvcmcuZWNsaXBzZS5kcmF3MmQuUm90YXRhYmxlRGVjb3JhdGlvbiBjcmVhdGVUYXJnZXREZWNvcmF0aW9uKCkgeyYjeEE7JiN4OTsmI3g5O29yZy5lY2xpcHNlLmRyYXcyZC5Qb2x5bGluZURlY29yYXRpb24gZGYgPSBuZXcgb3JnLmVjbGlwc2UuZHJhdzJkLlBvbHlsaW5lRGVjb3JhdGlvbigpOyYjeEE7ZGYuc2V0RmlsbCh0cnVlKTsmI3hBO2RmLnNldEZpbGxYT1IoZmFsc2UpOyYjeEE7ZGYuc2V0T3V0bGluZSh0cnVlKTsmI3hBO2RmLnNldE91dGxpbmVYT1IoZmFsc2UpOyYjeEE7ZGYuc2V0TGluZVdpZHRoKDEpOyYjeEE7ZGYuc2V0TGluZVN0eWxlKG9yZy5lY2xpcHNlLmRyYXcyZC5HcmFwaGljcy5MSU5FX1NPTElEKTsmI3hBO29yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludExpc3QgcGwgPSBuZXcgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50TGlzdCgpOyYjeEE7cGwuYWRkUG9pbnQoZ2V0TWFwTW9kZSgpLkRQdG9MUCgtMSkmI3hBOywgZ2V0TWFwTW9kZSgpLkRQdG9MUCgxKSYjeEE7KTsmI3hBO3BsLmFkZFBvaW50KGdldE1hcE1vZGUoKS5EUHRvTFAoMCkmI3hBOywgZ2V0TWFwTW9kZSgpLkRQdG9MUCgwKSYjeEE7KTsmI3hBO3BsLmFkZFBvaW50KGdldE1hcE1vZGUoKS5EUHRvTFAoLTEpJiN4QTssIGdldE1hcE1vZGUoKS5EUHRvTFAoLTEpJiN4QTspOyYjeEE7ZGYuc2V0VGVtcGxhdGUocGwpOyYjeEE7ZGYuc2V0U2NhbGUoZ2V0TWFwTW9kZSgpLkRQdG9MUCg3KSYjeEE7LCBnZXRNYXBNb2RlKCkuRFB0b0xQKDMpJiN4QTspOyYjeEE7JiN4OTsmI3g5O3JldHVybiBkZjsmI3hBOyYjeDk7fSYjeEE7JiN4QTt9JiN4QTsmI3hBOyI+Ci0gICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5kcmF3MmQ8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgIDwvdmlld21hcD4KLSAgICAgIDxtb2RlbEZhY2V0Ci0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpUeXBlTGlua01vZGVsRmFjZXQiPgotICAgICAgICA8bWV0YUNsYXNzCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmdlbm1vZGVsIy8vbW9kZWwvTGluayIvPgotICAgICAgICA8Y29udGFpbm1lbnRNZXRhRmVhdHVyZQotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5nZW5tb2RlbCMvL21vZGVsL05vZGUvb3V0Z29pbmdDb25uZWN0aW9ucyIvPgotICAgICAgICA8Y2hpbGRNZXRhRmVhdHVyZQotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5nZW5tb2RlbCMvL21vZGVsL05vZGUvb3V0Z29pbmdDb25uZWN0aW9ucyIvPgotICAgICAgICA8c291cmNlTWV0YUZlYXR1cmUKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZ2VubW9kZWwjLy9tb2RlbC9MaW5rL3NvdXJjZSIvPgotICAgICAgICA8dGFyZ2V0TWV0YUZlYXR1cmUKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZ2VubW9kZWwjLy9tb2RlbC9MaW5rL3RhcmdldCIvPgotICAgICAgPC9tb2RlbEZhY2V0PgotICAgICAgPGxhYmVscwotICAgICAgICAgIHZpc3VhbElEPSI0MDAyIgotICAgICAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJMaW5rTmFtZUVkaXRQYXJ0IgotICAgICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IkxpbmtOYW1lSXRlbVNlbWFudGljRWRpdFBvbGljeSIKLSAgICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJMaW5rTmFtZVZpZXdGYWN0b3J5IgotICAgICAgICAgIGVsZW1lbnRJY29uPSJ0cnVlIj4KLSAgICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL05vZGUiLz4KLSAgICAgICAgPHZpZXdtYXAKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46SW5uZXJDbGFzc1ZpZXdtYXAiCi0gICAgICAgICAgICBjbGFzc05hbWU9IkxpbmtOYW1lRmlndXJlIgotICAgICAgICAgICAgY2xhc3NCb2R5PSImI3hBOy8qKiYjeEE7ICogQGdlbmVyYXRlZCYjeEE7ICovJiN4QTtwdWJsaWMgY2xhc3MgTGlua05hbWVGaWd1cmUgZXh0ZW5kcyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgeyYjeEE7JiN4OTsvKiomI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEE7JiN4OTsgKi8mI3hBOyYjeDk7cHVibGljIExpbmtOYW1lRmlndXJlKCkgeyYjeEE7JiN4OTsmI3g5OyYjeDk7JiN4OTt0aGlzLnNldFRleHQoJnF1b3Q7JnF1b3Q7KTsmI3hBOyYjeDk7fSYjeEE7JiN4QTsmI3hBOyYjeEE7fSYjeEE7JiN4QTsiPgotICAgICAgICAgIDxhdHRyaWJ1dGVzCi0gICAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46TGFiZWxPZmZzZXRBdHRyaWJ1dGVzIgotICAgICAgICAgICAgICB5PSI0MCIvPgotICAgICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5kcmF3MmQ8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWk8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgICA8L3ZpZXdtYXA+Ci0gICAgICAgIDxtb2RlbEZhY2V0Ci0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOkZlYXR1cmVMYWJlbE1vZGVsRmFjZXQiCi0gICAgICAgICAgICB2aWV3UGF0dGVybj0iezB9IgotICAgICAgICAgICAgZWRpdFBhdHRlcm49IiI+Ci0gICAgICAgICAgPG1ldGFGZWF0dXJlcwotICAgICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmdlbm1vZGVsIy8vbW9kZWwvTGluay9uYW1lIi8+Ci0gICAgICAgIDwvbW9kZWxGYWNldD4KLSAgICAgIDwvbGFiZWxzPgotICAgIDwvbGlua3M+Ci0gICAgPHBhbGV0dGU+Ci0gICAgICA8Z3JvdXBzCi0gICAgICAgICAgdGl0bGU9Im1vZGVsIj4KLSAgICAgICAgPGVudHJpZXMKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46VG9vbEVudHJ5IgotICAgICAgICAgICAgdGl0bGU9IkNvbnRyb2wgRmxvdyIKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJDcmVhdGUgbmV3IENvbnRyb2wgRmxvdyIKLSAgICAgICAgICAgIHNtYWxsSWNvblBhdGg9Ii9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL2ljb25zL2Z1bGwvb2JqMTYvbGlua19wYWwxNi5naWYiCi0gICAgICAgICAgICBnZW5MaW5rcz0iLy9AZGlhZ3JhbS9AbGlua3MuMCIvPgotICAgICAgICA8ZW50cmllcwotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpUb29sRW50cnkiCi0gICAgICAgICAgICB0aXRsZT0iV29yayBQcm9kdWN0IERlc2NyaXB0b3IiCi0gICAgICAgICAgICBkZXNjcmlwdGlvbj0iQ3JlYXRlIG5ldyB3b3JrIHByb2R1Y3QgZGVzY3JpcHRvciIKLSAgICAgICAgICAgIHNtYWxsSWNvblBhdGg9Ii9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL2ljb25zL2Z1bGwvb2JqMTYvV29ya1Byb2R1Y3REZXNjcmlwdG9yLmdpZiIKLSAgICAgICAgICAgIGdlbk5vZGVzPSIvL0BkaWFncmFtL0B0b3BMZXZlbE5vZGVzLjAiLz4KLSAgICAgIDwvZ3JvdXBzPgotICAgIDwvcGFsZXR0ZT4KLSAgICA8cHJlZmVyZW5jZVBhZ2VzCi0gICAgICAgIHhzaTp0eXBlPSJnbWZnZW46R2VuU3RhbmRhcmRQcmVmZXJlbmNlUGFnZSIKLSAgICAgICAgaUQ9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmRpYWdyYW0uZ2VuZXJhbCIKLSAgICAgICAgbmFtZT0iRGlhZ3JhbSBEaWFncmFtIj4KLSAgICAgIDxjaGlsZHJlbgotICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46R2VuU3RhbmRhcmRQcmVmZXJlbmNlUGFnZSIKLSAgICAgICAgICBpRD0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uZGlhZ3JhbS5hcHBlYXJhbmNlIgotICAgICAgICAgIG5hbWU9IkFwcGVhcmFuY2UiCi0gICAgICAgICAga2luZD0iQXBwZWFyYW5jZSIvPgotICAgICAgPGNoaWxkcmVuCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpHZW5TdGFuZGFyZFByZWZlcmVuY2VQYWdlIgotICAgICAgICAgIGlEPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5kaWFncmFtLmNvbm5lY3Rpb25zIgotICAgICAgICAgIG5hbWU9IkNvbm5lY3Rpb25zIgotICAgICAgICAgIGtpbmQ9IkNvbm5lY3Rpb25zIi8+Ci0gICAgICA8Y2hpbGRyZW4KLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOkdlblN0YW5kYXJkUHJlZmVyZW5jZVBhZ2UiCi0gICAgICAgICAgaUQ9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmRpYWdyYW0ucHJpbnRpbmciCi0gICAgICAgICAgbmFtZT0iUHJpbnRpbmciCi0gICAgICAgICAga2luZD0iUHJpbnRpbmciLz4KLSAgICAgIDxjaGlsZHJlbgotICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46R2VuU3RhbmRhcmRQcmVmZXJlbmNlUGFnZSIKLSAgICAgICAgICBpRD0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uZGlhZ3JhbS5ydWxlcnNBbmRHcmlkIgotICAgICAgICAgIG5hbWU9IlJ1bGVycyBBbmQgR3JpZCIKLSAgICAgICAgICBraW5kPSJSdWxlcnNBbmRHcmlkIi8+Ci0gICAgICA8Y2hpbGRyZW4KLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOkdlblN0YW5kYXJkUHJlZmVyZW5jZVBhZ2UiCi0gICAgICAgICAgaUQ9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmRpYWdyYW0ucGF0aG1hcHMiCi0gICAgICAgICAgbmFtZT0iUGF0aG1hcHMiCi0gICAgICAgICAga2luZD0iUGF0aG1hcHMiLz4KLSAgICA8L3ByZWZlcmVuY2VQYWdlcz4KLSAgPC9kaWFncmFtPgotICA8cGx1Z2luLz4KLSAgPGVkaXRvci8+Ci0gIDxuYXZpZ2F0b3I+Ci0gICAgPGNoaWxkUmVmZXJlbmNlcwotICAgICAgICBjaGlsZD0iLy9AZGlhZ3JhbSIvPgotICAgIDxjaGlsZFJlZmVyZW5jZXMKLSAgICAgICAgcGFyZW50PSIvL0BkaWFncmFtIgotICAgICAgICBjaGlsZD0iLy9AZGlhZ3JhbS9AdG9wTGV2ZWxOb2Rlcy4wIi8+Ci0gICAgPGNoaWxkUmVmZXJlbmNlcwotICAgICAgICBwYXJlbnQ9Ii8vQGRpYWdyYW0iCi0gICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BsaW5rcy4wIgotICAgICAgICBncm91cE5hbWU9ImxpbmtzIgotICAgICAgICBncm91cEljb249Imljb25zL2xpbmtzTmF2aWdhdG9yR3JvdXAuZ2lmIi8+Ci0gICAgPGNoaWxkUmVmZXJlbmNlcwotICAgICAgICBwYXJlbnQ9Ii8vQGRpYWdyYW0vQGxpbmtzLjAiCi0gICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0B0b3BMZXZlbE5vZGVzLjAiCi0gICAgICAgIHJlZmVyZW5jZVR5cGU9Im91dF90YXJnZXQiCi0gICAgICAgIGdyb3VwTmFtZT0idGFyZ2V0IgotICAgICAgICBncm91cEljb249Imljb25zL2xpbmtUYXJnZXROYXZpZ2F0b3JHcm91cC5naWYiLz4KLSAgICA8Y2hpbGRSZWZlcmVuY2VzCi0gICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AdG9wTGV2ZWxOb2Rlcy4wIgotICAgICAgICBjaGlsZD0iLy9AZGlhZ3JhbS9AbGlua3MuMCIKLSAgICAgICAgcmVmZXJlbmNlVHlwZT0iaW5fc291cmNlIgotICAgICAgICBncm91cE5hbWU9ImluY29taW5nIGxpbmtzIgotICAgICAgICBncm91cEljb249Imljb25zL2luY29taW5nTGlua3NOYXZpZ2F0b3JHcm91cC5naWYiLz4KLSAgICA8Y2hpbGRSZWZlcmVuY2VzCi0gICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AbGlua3MuMCIKLSAgICAgICAgY2hpbGQ9Ii8vQGRpYWdyYW0vQHRvcExldmVsTm9kZXMuMCIKLSAgICAgICAgcmVmZXJlbmNlVHlwZT0iaW5fc291cmNlIgotICAgICAgICBncm91cE5hbWU9InNvdXJjZSIKLSAgICAgICAgZ3JvdXBJY29uPSJpY29ucy9saW5rU291cmNlTmF2aWdhdG9yR3JvdXAuZ2lmIi8+Ci0gICAgPGNoaWxkUmVmZXJlbmNlcwotICAgICAgICBwYXJlbnQ9Ii8vQGRpYWdyYW0vQHRvcExldmVsTm9kZXMuMCIKLSAgICAgICAgY2hpbGQ9Ii8vQGRpYWdyYW0vQGxpbmtzLjAiCi0gICAgICAgIHJlZmVyZW5jZVR5cGU9Im91dF90YXJnZXQiCi0gICAgICAgIGdyb3VwTmFtZT0ib3V0Z29pbmcgbGlua3MiCi0gICAgICAgIGdyb3VwSWNvbj0iaWNvbnMvb3V0Z29pbmdMaW5rc05hdmlnYXRvckdyb3VwLmdpZiIvPgotICA8L25hdmlnYXRvcj4KLSAgPHByb3BlcnR5U2hlZXQ+Ci0gICAgPHRhYnMKLSAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpHZW5TdGFuZGFyZFByb3BlcnR5VGFiIgotICAgICAgICBpRD0iYXBwZWFyYW5jZSIvPgotICAgIDx0YWJzCi0gICAgICAgIHhzaTp0eXBlPSJnbWZnZW46R2VuU3RhbmRhcmRQcm9wZXJ0eVRhYiIKLSAgICAgICAgaUQ9ImRpYWdyYW0iLz4KLSAgICA8dGFicwotICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOkdlbkN1c3RvbVByb3BlcnR5VGFiIgotICAgICAgICBpRD0iZG9tYWluIgotICAgICAgICBsYWJlbD0iQ29yZSI+Ci0gICAgICA8ZmlsdGVyCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpUeXBlVGFiRmlsdGVyIj4KLSAgICAgICAgPHR5cGVzPm9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc8L3R5cGVzPgotICAgICAgICA8dHlwZXM+b3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0PC90eXBlcz4KLSAgICAgICAgPGdlbmVyYXRlZFR5cGVzPmFic3RyYWN0TmF2aWdhdG9ySXRlbTwvZ2VuZXJhdGVkVHlwZXM+Ci0gICAgICA8L2ZpbHRlcj4KLSAgICA8L3RhYnM+Ci0gIDwvcHJvcGVydHlTaGVldD4KLSAgPGRvbWFpbkdlbk1vZGVsCi0gICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmdlbm1vZGVsIy8iLz4KLTwvZ21mZ2VuOkdlbkVkaXRvckdlbmVyYXRvcj4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvbW9kZWwvd3BkZDIuZ21mbWFwIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9tb2RlbC93cGRkMi5nbWZtYXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyZjFjYzUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9tb2RlbC93cGRkMi5nbWZtYXAKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGdtZm1hcDpNYXBwaW5nIHhtaTp2ZXJzaW9uPSIyLjAiCi0gICAgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIgotICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgeG1sbnM6ZWNvcmU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUiCi0gICAgeG1sbnM6Z21mbWFwPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2dtZi8yMDA1L21hcHBpbmdzLzIuMCIKLSAgICB4bWxuczpnbWZ0b29sPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2dtZi8yMDA1L1Rvb2xEZWZpbml0aW9uIj4KLSAgPG5vZGVzPgotICAgIDxjb250YWlubWVudEZlYXR1cmUKLSAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5lY29yZSMvL05vZGVDb250YWluZXIvbm9kZXMiLz4KLSAgICA8b3duZWRDaGlsZD4KLSAgICAgIDxkb21haW5NZXRhRWxlbWVudAotICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZWNvcmUjLy9Xb3JrUHJvZHVjdE5vZGUiLz4KLSAgICAgIDxsYWJlbE1hcHBpbmdzCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZm1hcDpGZWF0dXJlTGFiZWxNYXBwaW5nIgotICAgICAgICAgIHZpZXdQYXR0ZXJuPSIiPgotICAgICAgICA8ZGlhZ3JhbUxhYmVsCi0gICAgICAgICAgICBocmVmPSJ3cGRkLmdtZmdyYXBoI05hbWVkTm9kZU5hbWUiLz4KLSAgICAgICAgPGZlYXR1cmVzCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmVjb3JlIy8vTmFtZWROb2RlL25hbWUiLz4KLSAgICAgIDwvbGFiZWxNYXBwaW5ncz4KLSAgICAgIDxjb250ZXh0TWVudQotICAgICAgICAgIGhyZWY9IndwZGQuZ21mdG9vbCMvL0BhbGxNZW51cy4wIi8+Ci0gICAgICA8dG9vbAotICAgICAgICAgIHhzaTp0eXBlPSJnbWZ0b29sOkNyZWF0aW9uVG9vbCIKLSAgICAgICAgICBocmVmPSJ3cGRkLmdtZnRvb2wjLy9AcGFsZXR0ZS9AdG9vbHMuMC9AdG9vbHMuMSIvPgotICAgICAgPGRpYWdyYW1Ob2RlCi0gICAgICAgICAgaHJlZj0id3BkZC5nbWZncmFwaCNXb3JrUHJvZHVjdE5vZGUiLz4KLSAgICA8L293bmVkQ2hpbGQ+Ci0gIDwvbm9kZXM+Ci0gIDxsaW5rcz4KLSAgICA8ZG9tYWluTWV0YUVsZW1lbnQKLSAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5lY29yZSMvL0xpbmsiLz4KLSAgICA8bGFiZWxNYXBwaW5ncwotICAgICAgICB4c2k6dHlwZT0iZ21mbWFwOkZlYXR1cmVMYWJlbE1hcHBpbmciCi0gICAgICAgIHZpZXdQYXR0ZXJuPSIiCi0gICAgICAgIGVkaXRQYXR0ZXJuPSIiPgotICAgICAgPGRpYWdyYW1MYWJlbAotICAgICAgICAgIGhyZWY9IndwZGQuZ21mZ3JhcGgjTGlua05hbWUiLz4KLSAgICAgIDxmZWF0dXJlcwotICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZWNvcmUjLy9MaW5rL25hbWUiLz4KLSAgICA8L2xhYmVsTWFwcGluZ3M+Ci0gICAgPGNvbnRhaW5tZW50RmVhdHVyZQotICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmVjb3JlIy8vTm9kZS9vdXRnb2luZ0Nvbm5lY3Rpb25zIi8+Ci0gICAgPHRvb2wKLSAgICAgICAgeHNpOnR5cGU9ImdtZnRvb2w6Q3JlYXRpb25Ub29sIgotICAgICAgICBocmVmPSJ3cGRkLmdtZnRvb2wjLy9AcGFsZXR0ZS9AdG9vbHMuMC9AdG9vbHMuMCIvPgotICAgIDxkaWFncmFtTGluawotICAgICAgICBocmVmPSJ3cGRkLmdtZmdyYXBoI0xpbmsiLz4KLSAgICA8c291cmNlTWV0YUZlYXR1cmUKLSAgICAgICAgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiCi0gICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZWNvcmUjLy9MaW5rL3NvdXJjZSIvPgotICAgIDxsaW5rTWV0YUZlYXR1cmUKLSAgICAgICAgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiCi0gICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZWNvcmUjLy9MaW5rL3RhcmdldCIvPgotICA8L2xpbmtzPgotICA8ZGlhZ3JhbT4KLSAgICA8ZGlhZ3JhbUNhbnZhcwotICAgICAgICBocmVmPSJ3cGRkLmdtZmdyYXBoI21vZGVsIi8+Ci0gICAgPGRvbWFpbk1vZGVsCi0gICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZWNvcmUjLyIvPgotICAgIDxkb21haW5NZXRhRWxlbWVudAotICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmVjb3JlIy8vV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbSIvPgotICAgIDxwYWxldHRlCi0gICAgICAgIGhyZWY9IndwZGQuZ21mdG9vbCMvL0BwYWxldHRlIi8+Ci0gIDwvZGlhZ3JhbT4KLTwvZ21mbWFwOk1hcHBpbmc+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL21vZGVsL3dwZGQzLmdtZmdlbiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvbW9kZWwvd3BkZDMuZ21mZ2VuCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Mzk5MzUxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvbW9kZWwvd3BkZDMuZ21mZ2VuCisrKyAvZGV2L251bGwKQEAgLTEsMTY4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Z21mZ2VuOkdlbkVkaXRvckdlbmVyYXRvciB4bWk6dmVyc2lvbj0iMi4wIgotICAgIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIKLSAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICAgIHhtbG5zOmdtZmdlbj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9nbWYvMjAwNS9HZW5Nb2RlbC8yLjAiIHBhY2thZ2VOYW1lUHJlZml4PSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkIgotICAgIG1vZGVsSUQ9IldQREQiCi0gICAgc2FtZUZpbGVGb3JEaWFncmFtQW5kTW9kZWw9InRydWUiCi0gICAgZGlhZ3JhbUZpbGVFeHRlbnNpb249IndwZGQiPgotICA8ZGlhZ3JhbQotICAgICAgdmlzdWFsSUQ9Ijc5IgotICAgICAgZWRpdFBhcnRDbGFzc05hbWU9IldvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW1FZGl0UGFydCIKLSAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IldvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW1JdGVtU2VtYW50aWNFZGl0UG9saWN5IgotICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbVZpZXdGYWN0b3J5IgotICAgICAgY2Fub25pY2FsRWRpdFBvbGljeUNsYXNzTmFtZT0iV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbUNhbm9uaWNhbEVkaXRQb2xpY3kiCi0gICAgICBpY29uUHJvdmlkZXJQcmlvcml0eT0iTG93Ij4KLSAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcwotICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9EaWFncmFtIi8+Ci0gICAgPGVsZW1lbnRUeXBlCi0gICAgICAgIHhzaTp0eXBlPSJnbWZnZW46TWV0YW1vZGVsVHlwZSIKLSAgICAgICAgZWRpdEhlbHBlckNsYXNzTmFtZT0iV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbUVkaXRIZWxwZXIiLz4KLSAgICA8dmlld21hcAotICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOkZpZ3VyZVZpZXdtYXAiCi0gICAgICAgIGZpZ3VyZVF1YWxpZmllZENsYXNzTmFtZT0ib3JnLmVjbGlwc2UuZHJhdzJkLkZyZWVmb3JtTGF5ZXIiLz4KLSAgICA8ZG9tYWluRGlhZ3JhbUVsZW1lbnQKLSAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5nZW5tb2RlbCMvL21vZGVsL1dvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW0iLz4KLSAgICA8dG9wTGV2ZWxOb2RlcwotICAgICAgICB2aXN1YWxJRD0iMTAwMSIKLSAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9IldvcmtQcm9kdWN0Tm9kZUVkaXRQYXJ0IgotICAgICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJXb3JrUHJvZHVjdE5vZGVJdGVtU2VtYW50aWNFZGl0UG9saWN5IgotICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJXb3JrUHJvZHVjdE5vZGVWaWV3RmFjdG9yeSIKLSAgICAgICAgY2Fub25pY2FsRWRpdFBvbGljeUNsYXNzTmFtZT0iV29ya1Byb2R1Y3ROb2RlQ2Fub25pY2FsRWRpdFBvbGljeSIKLSAgICAgICAgZ3JhcGhpY2FsTm9kZUVkaXRQb2xpY3lDbGFzc05hbWU9IldvcmtQcm9kdWN0Tm9kZUdyYXBoaWNhbE5vZGVFZGl0UG9saWN5Ij4KLSAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzCi0gICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vTm9kZSIvPgotICAgICAgPGVsZW1lbnRUeXBlCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpNZXRhbW9kZWxUeXBlIgotICAgICAgICAgIGVkaXRIZWxwZXJDbGFzc05hbWU9IldvcmtQcm9kdWN0Tm9kZUVkaXRIZWxwZXIiLz4KLSAgICAgIDx2aWV3bWFwCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpJbm5lckNsYXNzVmlld21hcCIKLSAgICAgICAgICBjbGFzc05hbWU9IldvcmtQcm9kdWN0Tm9kZUZpZ3VyZSIKLSAgICAgICAgICBjbGFzc0JvZHk9IiYjeEQ7JiN4QTsmI3hEOyYjeEE7LyoqJiN4RDsmI3hBOyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7ICovJiN4RDsmI3hBO3B1YmxpYyBjbGFzcyBXb3JrUHJvZHVjdE5vZGVGaWd1cmUgZXh0ZW5kcyBvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlIHsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3B1YmxpYyBXb3JrUHJvZHVjdE5vZGVGaWd1cmUoKSB7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeDk7dGhpcy5zZXRPdXRsaW5lKGZhbHNlKTsmI3hEOyYjeEE7JiN4OTsmI3g5O2NyZWF0ZUNvbnRlbnRzKCk7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3ByaXZhdGUgdm9pZCBjcmVhdGVDb250ZW50cygpeyYjeEQ7JiN4QTsmI3g5OyYjeDk7b3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIGZpZ18wID0gbmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCgpOyYjeEQ7JiN4QTtmaWdfMC5zZXRUZXh0KCZxdW90O05ldyBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvciZxdW90Oyk7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7JiN4OTtzZXRGaWd1cmVOYW1lZE5vZGVOYW1lRmlndXJlKGZpZ18wKTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeDk7T2JqZWN0IGxheURhdGEwID0gbnVsbDsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7JiN4OTt0aGlzLmFkZChmaWdfMCwgbGF5RGF0YTApOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCBmTmFtZWROb2RlTmFtZUZpZ3VyZTsgJiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwdWJsaWMgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIGdldEZpZ3VyZU5hbWVkTm9kZU5hbWVGaWd1cmUoKSB7JiN4RDsmI3hBOyYjeDk7JiN4OTtyZXR1cm4gZk5hbWVkTm9kZU5hbWVGaWd1cmU7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIHZvaWQgc2V0RmlndXJlTmFtZWROb2RlTmFtZUZpZ3VyZShvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZmlnKXsmI3hEOyYjeEE7JiN4OTsmI3g5O2ZOYW1lZE5vZGVOYW1lRmlndXJlID0gZmlnOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3ByaXZhdGUgYm9vbGVhbiBteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSBmYWxzZTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3Byb3RlY3RlZCBib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMoKSB7JiN4RDsmI3hBOyYjeDk7JiN4OTtyZXR1cm4gbXlVc2VMb2NhbENvb3JkaW5hdGVzOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3Byb3RlY3RlZCB2b2lkIHNldFVzZUxvY2FsQ29vcmRpbmF0ZXMoYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKSB7JiN4RDsmI3hBOyYjeDk7JiN4OTtteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSB1c2VMb2NhbENvb3JkaW5hdGVzOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4RDsmI3hBO30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7Ij4KLSAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmRyYXcyZDwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWk8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgPC92aWV3bWFwPgotICAgICAgPG1vZGVsRmFjZXQ+Ci0gICAgICAgIDxtZXRhQ2xhc3MKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZ2VubW9kZWwjLy9tb2RlbC9Xb3JrUHJvZHVjdE5vZGUiLz4KLSAgICAgICAgPGNvbnRhaW5tZW50TWV0YUZlYXR1cmUKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZ2VubW9kZWwjLy9tb2RlbC9Ob2RlQ29udGFpbmVyL25vZGVzIi8+Ci0gICAgICAgIDxjaGlsZE1ldGFGZWF0dXJlCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmdlbm1vZGVsIy8vbW9kZWwvTm9kZUNvbnRhaW5lci9ub2RlcyIvPgotICAgICAgPC9tb2RlbEZhY2V0PgotICAgICAgPGxhYmVscwotICAgICAgICAgIHZpc3VhbElEPSI0MDAxIgotICAgICAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJXb3JrUHJvZHVjdE5vZGVOYW1lRWRpdFBhcnQiCi0gICAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iV29ya1Byb2R1Y3ROb2RlTmFtZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiCi0gICAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iV29ya1Byb2R1Y3ROb2RlTmFtZVZpZXdGYWN0b3J5IgotICAgICAgICAgIGVsZW1lbnRJY29uPSJ0cnVlIj4KLSAgICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL05vZGUiLz4KLSAgICAgICAgPHZpZXdtYXAKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46UGFyZW50QXNzaWduZWRWaWV3bWFwIgotICAgICAgICAgICAgZ2V0dGVyTmFtZT0iZ2V0RmlndXJlTmFtZWROb2RlTmFtZUZpZ3VyZSIKLSAgICAgICAgICAgIGZpZ3VyZVF1YWxpZmllZENsYXNzTmFtZT0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIi8+Ci0gICAgICAgIDxtb2RlbEZhY2V0Ci0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOkZlYXR1cmVMYWJlbE1vZGVsRmFjZXQiCi0gICAgICAgICAgICB2aWV3UGF0dGVybj0iezB9Ij4KLSAgICAgICAgICA8bWV0YUZlYXR1cmVzCi0gICAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZ2VubW9kZWwjLy9tb2RlbC9OYW1lZE5vZGUvbmFtZSIvPgotICAgICAgICA8L21vZGVsRmFjZXQ+Ci0gICAgICA8L2xhYmVscz4KLSAgICA8L3RvcExldmVsTm9kZXM+Ci0gICAgPGxpbmtzCi0gICAgICAgIHZpc3VhbElEPSIzMDAxIgotICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iTGlua0VkaXRQYXJ0IgotICAgICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJMaW5rSXRlbVNlbWFudGljRWRpdFBvbGljeSIKLSAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iTGlua1ZpZXdGYWN0b3J5Ij4KLSAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzCi0gICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vRWRnZSIvPgotICAgICAgPGVsZW1lbnRUeXBlCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpNZXRhbW9kZWxUeXBlIgotICAgICAgICAgIGVkaXRIZWxwZXJDbGFzc05hbWU9IkxpbmtFZGl0SGVscGVyIi8+Ci0gICAgICA8dmlld21hcAotICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46SW5uZXJDbGFzc1ZpZXdtYXAiCi0gICAgICAgICAgY2xhc3NOYW1lPSJMaW5rRmlndXJlIgotICAgICAgICAgIGNsYXNzQm9keT0iJiN4RDsmI3hBOyYjeEQ7JiN4QTsvKiomI3hEOyYjeEE7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsgKi8mI3hEOyYjeEE7cHVibGljIGNsYXNzIExpbmtGaWd1cmUgZXh0ZW5kcyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5Qb2x5bGluZUNvbm5lY3Rpb25FeCB7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwdWJsaWMgTGlua0ZpZ3VyZSgpIHsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7JiN4OTtzZXRUYXJnZXREZWNvcmF0aW9uKGNyZWF0ZVRhcmdldERlY29yYXRpb24oKSk7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3ByaXZhdGUgb3JnLmVjbGlwc2UuZHJhdzJkLlBvbHlsaW5lRGVjb3JhdGlvbiBjcmVhdGVUYXJnZXREZWNvcmF0aW9uKCkgeyYjeEQ7JiN4QTtvcmcuZWNsaXBzZS5kcmF3MmQuUG9seWxpbmVEZWNvcmF0aW9uIGRmID0gbmV3IG9yZy5lY2xpcHNlLmRyYXcyZC5Qb2x5bGluZURlY29yYXRpb24oKTsmI3hEOyYjeEE7Ly8gZGlzcGF0Y2hOZXh0PyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsmI3g5O29yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludExpc3QgcGwgPSBuZXcgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50TGlzdCgpOyYjeEQ7JiN4QTsmI3g5OyYjeDk7cGwuYWRkUG9pbnQoLTEsIDEpOyYjeEQ7JiN4QTsmI3g5OyYjeDk7cGwuYWRkUG9pbnQoMCwgMCk7JiN4RDsmI3hBOyYjeDk7JiN4OTtwbC5hZGRQb2ludCgtMSwgLTEpOyYjeEQ7JiN4QTsmI3g5OyYjeDk7ZGYuc2V0VGVtcGxhdGUocGwpOyYjeEQ7JiN4QTsmI3g5OyYjeDk7ZGYuc2V0U2NhbGUoZ2V0TWFwTW9kZSgpLkRQdG9MUCg3KSwgZ2V0TWFwTW9kZSgpLkRQdG9MUCgzKSk7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5OyYjeDk7cmV0dXJuIGRmOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4RDsmI3hBO30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7Ij4KLSAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmRyYXcyZDwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWk8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgPC92aWV3bWFwPgotICAgICAgPG1vZGVsRmFjZXQKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlR5cGVMaW5rTW9kZWxGYWNldCI+Ci0gICAgICAgIDxtZXRhQ2xhc3MKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZ2VubW9kZWwjLy9tb2RlbC9MaW5rIi8+Ci0gICAgICAgIDxjb250YWlubWVudE1ldGFGZWF0dXJlCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmdlbm1vZGVsIy8vbW9kZWwvTm9kZS9vdXRnb2luZ0Nvbm5lY3Rpb25zIi8+Ci0gICAgICAgIDxjaGlsZE1ldGFGZWF0dXJlCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmdlbm1vZGVsIy8vbW9kZWwvTm9kZS9vdXRnb2luZ0Nvbm5lY3Rpb25zIi8+Ci0gICAgICAgIDxzb3VyY2VNZXRhRmVhdHVyZQotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5nZW5tb2RlbCMvL21vZGVsL0xpbmsvc291cmNlIi8+Ci0gICAgICAgIDx0YXJnZXRNZXRhRmVhdHVyZQotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5nZW5tb2RlbCMvL21vZGVsL0xpbmsvdGFyZ2V0Ii8+Ci0gICAgICA8L21vZGVsRmFjZXQ+Ci0gICAgICA8bGFiZWxzCi0gICAgICAgICAgdmlzdWFsSUQ9IjQwMDIiCi0gICAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9IkxpbmtOYW1lRWRpdFBhcnQiCi0gICAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iTGlua05hbWVJdGVtU2VtYW50aWNFZGl0UG9saWN5IgotICAgICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9IkxpbmtOYW1lVmlld0ZhY3RvcnkiCi0gICAgICAgICAgZWxlbWVudEljb249InRydWUiPgotICAgICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcwotICAgICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vTm9kZSIvPgotICAgICAgICA8dmlld21hcAotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpJbm5lckNsYXNzVmlld21hcCIKLSAgICAgICAgICAgIGNsYXNzTmFtZT0iTGlua05hbWVGaWd1cmUiCi0gICAgICAgICAgICBjbGFzc0JvZHk9IiYjeEQ7JiN4QTsmI3hEOyYjeEE7LyoqJiN4RDsmI3hBOyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7ICovJiN4RDsmI3hBO3B1YmxpYyBjbGFzcyBMaW5rTmFtZUZpZ3VyZSBleHRlbmRzIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCB7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwdWJsaWMgTGlua05hbWVGaWd1cmUoKSB7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsmI3g5O3RoaXMuc2V0VGV4dCgmcXVvdDsmcXVvdDspOyYjeEQ7JiN4QTsmI3g5OyYjeDk7Y3JlYXRlQ29udGVudHMoKTsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbnRlbnRzKCl7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIGJvb2xlYW4gbXlVc2VMb2NhbENvb3JkaW5hdGVzID0gZmFsc2U7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcm90ZWN0ZWQgYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKCkgeyYjeEQ7JiN4QTsmI3g5OyYjeDk7cmV0dXJuIG15VXNlTG9jYWxDb29yZGluYXRlczsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcm90ZWN0ZWQgdm9pZCBzZXRVc2VMb2NhbENvb3JkaW5hdGVzKGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcykgeyYjeEQ7JiN4QTsmI3g5OyYjeDk7bXlVc2VMb2NhbENvb3JkaW5hdGVzID0gdXNlTG9jYWxDb29yZGluYXRlczsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeEQ7JiN4QTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyI+Ci0gICAgICAgICAgPGF0dHJpYnV0ZXMKLSAgICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpMYWJlbE9mZnNldEF0dHJpYnV0ZXMiCi0gICAgICAgICAgICAgIHk9IjQwIi8+Ci0gICAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmRyYXcyZDwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aTwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICAgIDwvdmlld21hcD4KLSAgICAgICAgPG1vZGVsRmFjZXQKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46RmVhdHVyZUxhYmVsTW9kZWxGYWNldCIKLSAgICAgICAgICAgIHZpZXdQYXR0ZXJuPSJ7MH0iCi0gICAgICAgICAgICBlZGl0UGF0dGVybj0iIj4KLSAgICAgICAgICA8bWV0YUZlYXR1cmVzCi0gICAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZ2VubW9kZWwjLy9tb2RlbC9MaW5rL25hbWUiLz4KLSAgICAgICAgPC9tb2RlbEZhY2V0PgotICAgICAgPC9sYWJlbHM+Ci0gICAgPC9saW5rcz4KLSAgICA8cGFsZXR0ZT4KLSAgICAgIDxncm91cHMKLSAgICAgICAgICB0aXRsZT0ibW9kZWwiPgotICAgICAgICA8ZW50cmllcwotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpUb29sRW50cnkiCi0gICAgICAgICAgICB0aXRsZT0iQ29udHJvbCBGbG93IgotICAgICAgICAgICAgZGVzY3JpcHRpb249IkNyZWF0ZSBuZXcgQ29udHJvbCBGbG93IgotICAgICAgICAgICAgc21hbGxJY29uUGF0aD0iL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvaWNvbnMvZnVsbC9vYmoxNi9saW5rX3BhbDE2LmdpZiIKLSAgICAgICAgICAgIGdlbkxpbmtzPSIvL0BkaWFncmFtL0BsaW5rcy4wIi8+Ci0gICAgICAgIDxlbnRyaWVzCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlRvb2xFbnRyeSIKLSAgICAgICAgICAgIHRpdGxlPSJXb3JrIFByb2R1Y3QgRGVzY3JpcHRvciIKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJDcmVhdGUgbmV3IHdvcmsgcHJvZHVjdCBkZXNjcmlwdG9yIgotICAgICAgICAgICAgc21hbGxJY29uUGF0aD0iL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvaWNvbnMvZnVsbC9vYmoxNi9Xb3JrUHJvZHVjdERlc2NyaXB0b3IuZ2lmIgotICAgICAgICAgICAgZ2VuTm9kZXM9Ii8vQGRpYWdyYW0vQHRvcExldmVsTm9kZXMuMCIvPgotICAgICAgPC9ncm91cHM+Ci0gICAgPC9wYWxldHRlPgotICA8L2RpYWdyYW0+Ci0gIDxwbHVnaW4KLSAgICAgIGlEPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkIgotICAgICAgbmFtZT0iV29yayBQcm9kdWN0IERlcGVuZGVuY3kgRGlhZ3JhbSBQbHVnaW4iCi0gICAgICBwcm92aWRlcj0iRVBGIgotICAgICAgcHJpbnRpbmdFbmFibGVkPSJ0cnVlIgotICAgICAgYWN0aXZhdG9yQ2xhc3NOYW1lPSJXUEREaWFncmFtRWRpdG9yUGx1Z2luIi8+Ci0gIDxlZGl0b3IKLSAgICAgIGNsYXNzTmFtZT0iV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbUVkaXRvciIvPgotICA8cHJvcGVydHlTaGVldD4KLSAgICA8dGFicwotICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOkdlblN0YW5kYXJkUHJvcGVydHlUYWIiCi0gICAgICAgIGlEPSJUZXN0aW5nIDEyMyIKLSAgICAgICAgbGFiZWw9IlRlc3RpbmcgMTIzIi8+Ci0gICAgPHRhYnMKLSAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpHZW5TdGFuZGFyZFByb3BlcnR5VGFiIgotICAgICAgICBpRD0iQWR2YW5jZWQiCi0gICAgICAgIGxhYmVsPSJBZHZhbmNlZCIvPgotICA8L3Byb3BlcnR5U2hlZXQ+Ci0gIDxkb21haW5HZW5Nb2RlbAotICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5nZW5tb2RlbCMvIi8+Ci08L2dtZmdlbjpHZW5FZGl0b3JHZW5lcmF0b3I+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3BsdWdpbi5wcm9wZXJ0aWVzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWEwZjA5Zi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIFNUQVJUIE5PIFRSQU5TTEFUSU9OCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotcHJlZmVyZW5jZXMuZ2VuZXJhbD1XUEREIERpYWdyYW0KLXByZWZlcmVuY2VzLmFwcGVhcmFuY2U9QXBwZWFyYW5jZQotcHJlZmVyZW5jZXMuY29ubmVjdGlvbnM9Q29ubmVjdGlvbnMKLXByZWZlcmVuY2VzLnByaW50aW5nPVByaW50aW5nCi1wcmVmZXJlbmNlcy5ydWxlcnNBbmRHcmlkPVJ1bGVycyAmIEdyaWQKLXByZWZlcmVuY2VzLnBhdGhtYXBzPVBhdGggTWFwcwotCi1lZGl0b3JOYW1lPVdQREQgRGlhZ3JhbSBFZGl0b3IKLW5ld1dpemFyZE5hbWU9V1BERCBEaWFncmFtCi1uZXdXaXphcmREZXNjPUNyZWF0ZXMgV1BERCBkaWFncmFtLgotCi1pbml0RGlhZ3JhbUFjdGlvbkxhYmVsPUluaXRpYWxpemUgd3BkZCBkaWFncmFtIGZpbGUKLWxvYWRSZXNvdXJjZUFjdGlvbkxhYmVsPUxvYWQgUmVzb3VyY2UuLi4KLQotbmF2aWdhdG9yQ29udGVudE5hbWU9Ki53cGRkIGRpYWdyYW0gY29udGVudHMKLQotbWV0YXR5cGUubmFtZS5Xb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtXzc5PVVuZGVmaW5lZAotbWV0YXR5cGUubmFtZS5Xb3JrUHJvZHVjdE5vZGVfMTAwMT1Xb3JrUHJvZHVjdE5vZGUKLW1ldGF0eXBlLm5hbWUuTGlua18zMDAxPUxpbmsKLQotdGFiLlRlc3RpbmcuMTIzPVRlc3RpbmcgMTIzCi10YWIuQWR2YW5jZWQ9QWR2YW5jZWQKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIEVORCBOTyBUUkFOU0xBVElPTgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotCi1wbHVnaW5OYW1lPUVQRiBXb3JrIFByb2R1Y3QgRGVwZW5kZW5jeSBEaWFncmFtCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKLQotCi0jIE5lZWQgdHJhbnNsYXRpb24KLWVsZW1lbnRfdHlwZV9jb250cm9sX2Zsb3c9Q29udHJvbCBGbG93Ci1lbGVtZW50X3R5cGVfd29ya3Byb2R1Y3RfZGVzY3JpcHRvcj1Xb3JrIFByb2R1Y3QgRGVzY3JpcHRvcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9wbHVnaW4ueG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMmZhYjhkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMzOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotCi08cGx1Z2luPgotCi0gICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMiPgotICAgICAgPGluaXRpYWxpemVyIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLnBhcnQuRGlhZ3JhbURpYWdyYW1QcmVmZXJlbmNlSW5pdGlhbGl6ZXIiLz4KLSAgIDwvZXh0ZW5zaW9uPgotCi0gIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnRlYW0uY29yZS5maWxlVHlwZXMiPgotICAgICAgPGZpbGVUeXBlcwotICAgICAgICAgdHlwZT0idGV4dCIKLSAgICAgICAgIGV4dGVuc2lvbj0id3BkZCI+Ci0gICAgICA8L2ZpbGVUeXBlcz4KLSAgPC9leHRlbnNpb24+Ci0KLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5leHRlbnNpb25fcGFyc2VyIj4KLSAgICAgIDxwYXJzZXIKLSAgICAgICAgIHR5cGU9IndwZGQiCi0gICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvcmUucmVzb3VyY2VzLkdNRlJlc291cmNlRmFjdG9yeSI+Ci0gICAgICA8L3BhcnNlcj4KLSAgIDwvZXh0ZW5zaW9uPgotCi0gICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5lZGl0b3JzIj4KLSAgIDwhLS0KLSAgICAgPGVkaXRvcgotICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5wYXJ0LldvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW1FZGl0b3JJRCIKLSAgICAgICAgbmFtZT0iV1BERCBEaWFncmFtIEVkaXRvciIKLSAgICAgICAgaWNvbj0iaWNvbnMvb2JqMTYvTW9kZWxEaWFncmFtRmlsZS5naWYiCi0gICAgICAgIGV4dGVuc2lvbnM9IndwZGQiCi0gICAgICAgIGRlZmF1bHQ9InRydWUiCi0gICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLnBhcnQuV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbUVkaXRvciIKLSAgICAgICAgbWF0Y2hpbmdTdHJhdGVneT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5wYXJ0LkRpYWdyYW1NYXRjaGluZ1N0cmF0ZWd5IgotICAgICAgICBjb250cmlidXRvckNsYXNzPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLnBhcnQuRGlhZ3JhbURpYWdyYW1BY3Rpb25CYXJDb250cmlidXRvciI+Ci0gICAgIDwvZWRpdG9yPgotICAgICAtLT4KLSAgICAgPGVkaXRvcgotICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5wYXJ0LldvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW1FZGl0b3JJRCIKLSAgICAgICAgbmFtZT0iV29yayBQcm9kdWN0IERlcGVuZGVuY3kgRGlhZ3JhbSBFZGl0b3IiCi0gICAgICAgIGljb249Imljb25zL2Z1bGwvZXRvb2wxNi9XUERERWRpdG9yLmdpZiIKLSAgICAgICAgZXh0ZW5zaW9ucz0id3BkZCIKLSAgICAgICAgZGVmYXVsdD0idHJ1ZSIKLSAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQucGFydC5XUEREaWFncmFtRWRpdG9yIgotICAgICAgICBtYXRjaGluZ1N0cmF0ZWd5PSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLnBhcnQuRGlhZ3JhbU1hdGNoaW5nU3RyYXRlZ3kiCi0gICAgICAgIGNvbnRyaWJ1dG9yQ2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQucGFydC5EaWFncmFtRGlhZ3JhbUFjdGlvbkJhckNvbnRyaWJ1dG9yIj4KLSAgICAgPC9lZGl0b3I+Ci0gICA8L2V4dGVuc2lvbj4KLQotCTwhLS0KLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLm5ld1dpemFyZHMiPgotICAJICA8d2l6YXJkCi0gIAkgICAgIG5hbWU9IldQREQgRGlhZ3JhbSIKLSAgCSAgICAgaWNvbj0iaWNvbnMvb2JqMTYvTW9kZWxEaWFncmFtRmlsZS5naWYiCi0gIAkgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS51aS5FeGFtcGxlcyIKLSAgCSAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQucGFydC5EaWFncmFtQ3JlYXRpb25XaXphcmQiCi0gIAkgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLnBhcnQuRGlhZ3JhbUNyZWF0aW9uV2l6YXJkSUQiPgotICAJICAJIDxkZXNjcmlwdGlvbj4KLSAgCSAgCQlDcmVhdGVzIFdQREQgZGlhZ3JhbS4KLSAgCSAgCSA8L2Rlc2NyaXB0aW9uPiAgCi0gICAgICA8L3dpemFyZD4KLSAgIDwvZXh0ZW5zaW9uPgotICAgLS0+Ci0KLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnBvcHVwTWVudXMiPgotICAgICA8IS0tIDxvYmplY3RDb250cmlidXRpb24KLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLnVpLm9iamVjdENvbnRyaWJ1dGlvbi5JRmlsZTEiCi0gICAgICAgICAgICBuYW1lRmlsdGVyPSIqLm1vZGVsIgotICAgICAgICAgICAgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlIj4KLSAgICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgICAgIGxhYmVsPSJJbml0aWFsaXplIHdwZGQgZGlhZ3JhbSBmaWxlIgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQucGFydC5EaWFncmFtSW5pdERpYWdyYW1GaWxlQWN0aW9uIgotICAgICAgICAgICAgICAgbWVudWJhclBhdGg9ImFkZGl0aW9ucyIKLSAgICAgICAgICAgICAgIGVuYWJsZXNGb3I9IjEiCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5wYXJ0LkRpYWdyYW1Jbml0RGlhZ3JhbUZpbGVBY3Rpb25JRCI+Ci0gICAgICAgICA8L2FjdGlvbj4KLSAgICAgIDwvb2JqZWN0Q29udHJpYnV0aW9uPiAgCi0gICAgICA8b2JqZWN0Q29udHJpYnV0aW9uCi0gICAgICAgICAgICBhZGFwdGFibGU9ImZhbHNlIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQudWkub2JqZWN0Q29udHJpYnV0aW9uLldvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW1FZGl0UGFydDIiCi0gICAgICAgICAgICBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5lZGl0LnBhcnRzLldvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW1FZGl0UGFydCI+Ci0gICAgICAgICA8YWN0aW9uCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5wYXJ0LkRpYWdyYW1Mb2FkUmVzb3VyY2VBY3Rpb24iCi0gICAgICAgICAgICAgICBlbmFibGVzRm9yPSIxIgotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQucGFydC5EaWFncmFtTG9hZFJlc291cmNlQWN0aW9uSUQiCi0gICAgICAgICAgICAgICBsYWJlbD0iTG9hZCBSZXNvdXJjZS4uLiIKLSAgICAgICAgICAgICAgIG1lbnViYXJQYXRoPSJhZGRpdGlvbnMiPgotICAgICAgICAgPC9hY3Rpb24+Ci0gICAgICA8L29iamVjdENvbnRyaWJ1dGlvbj4gIAotICAgICAgPG9iamVjdENvbnRyaWJ1dGlvbgotICAgICAgICAgICAgYWRhcHRhYmxlPSJ0cnVlIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQuRGVsZXRlRGlhZ3JhbSIKLSAgICAgICAgICAgIG9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLmVkaXQucGFydHMuV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbUVkaXRQYXJ0Ij4KLSAgICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLmFjdGlvbnMuRGVsZXRlRGlhZ3JhbUFjdGlvbiIKLSAgICAgICAgICAgICAgIGVuYWJsZXNGb3I9IjEiCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5hY3Rpb25zLkRlbGV0ZURpYWdyYW1BY3Rpb24iCi0gICAgICAgICAgICAgICBsYWJlbD0iJURlbGV0ZURpYWdyYW1fdGV4dCIKLSAgICAgICAgICAgICAgIG1lbnViYXJQYXRoPSJhZGRpdGlvbnMiCi0gICAgICAgICAgICAgICBzdGF0ZT0iZmFsc2UiCi0gICAgICAgICAgICAgICBzdHlsZT0icHVzaCIKLSAgICAgICAgICAgICAgIHRvb2x0aXA9IiVEZWxldGVEaWFncmFtX3RleHQiLz4KLSAgICAgIDwvb2JqZWN0Q29udHJpYnV0aW9uPgotICAgICAgPG9iamVjdENvbnRyaWJ1dGlvbgotICAgICAgICAgICAgYWRhcHRhYmxlPSJmYWxzZSIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLlJlZnJlc2hGcm9tQmFzZUFjdGlvbiIKLSAgICAgICAgICAgIG9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLmVkaXQucGFydHMuV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbUVkaXRQYXJ0Ij4KLSAgICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLmFjdGlvbnMuUmVmcmVzaEZyb21CYXNlQWN0aW9uIgotICAgICAgICAgICAgICAgZW5hYmxlc0Zvcj0iMSIKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLmFjdGlvbnMuUmVmcmVzaEZyb21CYXNlQWN0aW9uIgotICAgICAgICAgICAgICAgbGFiZWw9IiVyZWZyZXNoRnJvbUJhc2VBY3Rpdml0eV90ZXh0IgotICAgICAgICAgICAgICAgbWVudWJhclBhdGg9ImFkZGl0aW9ucyIKLSAgICAgICAgICAgICAgIHN0YXRlPSJmYWxzZSIKLSAgICAgICAgICAgICAgIHN0eWxlPSJwdXNoIgotICAgICAgICAgICAgICAgdG9vbHRpcD0iJXJlZnJlc2hGcm9tQmFzZUFjdGl2aXR5X3RleHQiLz4KLSAgICAgIDwvb2JqZWN0Q29udHJpYnV0aW9uPgotICAgICAgPG9iamVjdENvbnRyaWJ1dGlvbgotICAgICAgICAgICAgYWRhcHRhYmxlPSJmYWxzZSIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLlJlZnJlc2hBY3Rpb24iCi0gICAgICAgICAgICBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5lZGl0LnBhcnRzLldvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW1FZGl0UGFydCI+Ci0gICAgICAgICA8YWN0aW9uCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5hY3Rpb25zLlJlZnJlc2hBY3Rpb24iCi0gICAgICAgICAgICAgICBlbmFibGVzRm9yPSIxIgotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuYWN0aW9ucy5SZWZyZXNoQWN0aW9uIgotICAgICAgICAgICAgICAgbGFiZWw9IiVyZWZyZXNoX3RleHQiCi0gICAgICAgICAgICAgICBtZW51YmFyUGF0aD0iYWRkaXRpb25zIgotICAgICAgICAgICAgICAgc3RhdGU9ImZhbHNlIgotICAgICAgICAgICAgICAgc3R5bGU9InB1c2giCi0gICAgICAgICAgICAgICB0b29sdGlwPSIlcmVmcmVzaF90ZXh0Ii8+Ci0gICAgICA8L29iamVjdENvbnRyaWJ1dGlvbj4gICAtLT4gICAgICAgICAgICAgICAgICAgCi0gIDwvZXh0ZW5zaW9uPgotCi0gICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMuYWN0aW9uLmNvbnRyaWJ1dGlvbkl0ZW1Qcm92aWRlcnMiPgotICAgICAgPGNvbnRyaWJ1dGlvbkl0ZW1Qcm92aWRlciBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5wcm92aWRlcnMuRGlhZ3JhbUNvbnRyaWJ1dGlvbkl0ZW1Qcm92aWRlciI+Ci0gICAgICAgICA8UHJpb3JpdHkgbmFtZT0iTG93Ij4KLSAgICAgICAgIDwvUHJpb3JpdHk+Ci0gICAgICAgICA8cGFydENvbnRyaWJ1dGlvbiBpZD0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5wYXJ0LldvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW1FZGl0b3JJRCI+Ci0gICAgICAgICAgICA8cGFydEFjdGlvbiBtZW51YmFyUGF0aD0iL2ZpbGUvcHJpbnQiIGlkPSJwcmludFByZXZpZXdBY3Rpb24iPgotICAgICAgICAgICAgPC9wYXJ0QWN0aW9uPgotICAgICAgICAgPC9wYXJ0Q29udHJpYnV0aW9uPgotICAgICAgPC9jb250cmlidXRpb25JdGVtUHJvdmlkZXI+Ci0gICAgIDwhLS0gPGNvbnRyaWJ1dGlvbkl0ZW1Qcm92aWRlcgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucHJvdmlkZXJzLkRpYWdyYW1Db250cmlidXRpb25JdGVtUHJvdmlkZXIiCi0gICAgICAgICAgICBjaGVja1BsdWdpbkxvYWRlZD0iZmFsc2UiPgotICAgICAgICAgPFByaW9yaXR5IG5hbWU9IkxvdyIvPgotICAgICAgICAgPHBvcHVwQ29udHJpYnV0aW9uIGNsYXNzPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnByb3ZpZGVycy5EaWFncmFtQ29udGV4dE1lbnVQcm92aWRlciI+Ci0gICAgICAgICAgICA8cG9wdXBTdHJ1Y3R1cmVkQ29udHJpYnV0aW9uQ3JpdGVyaWEgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQuZWRpdC5wYXJ0cy5Xb3JrUHJvZHVjdE5vZGVFZGl0UGFydCIvPgotICAgICAgICAgICAgPHBvcHVwUHJlZGVmaW5lZEl0ZW0gaWQ9ImRlbGV0ZUZyb21EaWFncmFtQWN0aW9uIiByZW1vdmU9InRydWUiLz4KLSAgICAgICAgIDwvcG9wdXBDb250cmlidXRpb24+Ci0gICAgICAgICA8cG9wdXBDb250cmlidXRpb24gY2xhc3M9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucHJvdmlkZXJzLkRpYWdyYW1Db250ZXh0TWVudVByb3ZpZGVyIj4KLSAgICAgICAgICAgIDxwb3B1cFN0cnVjdHVyZWRDb250cmlidXRpb25Dcml0ZXJpYSBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5lZGl0LnBhcnRzLldvcmtQcm9kdWN0Tm9kZU5hbWVFZGl0UGFydCIvPgotICAgICAgICAgICAgPHBvcHVwUHJlZGVmaW5lZEl0ZW0gaWQ9ImRlbGV0ZUZyb21EaWFncmFtQWN0aW9uIiByZW1vdmU9InRydWUiLz4KLSAgICAgICAgIDwvcG9wdXBDb250cmlidXRpb24+Ci0gICAgICAgICA8cG9wdXBDb250cmlidXRpb24gY2xhc3M9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucHJvdmlkZXJzLkRpYWdyYW1Db250ZXh0TWVudVByb3ZpZGVyIj4KLSAgICAgICAgICAgIDxwb3B1cFN0cnVjdHVyZWRDb250cmlidXRpb25Dcml0ZXJpYSBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5lZGl0LnBhcnRzLkxpbmtFZGl0UGFydCIvPgotICAgICAgICAgICAgPHBvcHVwUHJlZGVmaW5lZEl0ZW0gaWQ9ImRlbGV0ZUZyb21EaWFncmFtQWN0aW9uIiByZW1vdmU9InRydWUiLz4KLSAgICAgICAgIDwvcG9wdXBDb250cmlidXRpb24+Ci0gICAgICAgICA8cG9wdXBDb250cmlidXRpb24gY2xhc3M9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucHJvdmlkZXJzLkRpYWdyYW1Db250ZXh0TWVudVByb3ZpZGVyIj4KLSAgICAgICAgICAgIDxwb3B1cFN0cnVjdHVyZWRDb250cmlidXRpb25Dcml0ZXJpYSBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5lZGl0LnBhcnRzLkxpbmtOYW1lRWRpdFBhcnQiLz4KLSAgICAgICAgICAgIDxwb3B1cFByZWRlZmluZWRJdGVtIGlkPSJkZWxldGVGcm9tRGlhZ3JhbUFjdGlvbiIgcmVtb3ZlPSJ0cnVlIi8+Ci0gICAgICAgICAgICA8cG9wdXBQcmVkZWZpbmVkSXRlbSBpZD0iZGVsZXRlRnJvbU1vZGVsQWN0aW9uIiByZW1vdmU9InRydWUiLz4KLSAgICAgICAgIDwvcG9wdXBDb250cmlidXRpb24+Ci0gICAgICA8L2NvbnRyaWJ1dGlvbkl0ZW1Qcm92aWRlcj4KLSAgICAgIC0tPgotICAgPC9leHRlbnNpb24+Ci0KLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5hY3Rpb24uZ2xvYmFsQWN0aW9uSGFuZGxlclByb3ZpZGVycyI+Ci0gICAgICA8R2xvYmFsQWN0aW9uSGFuZGxlclByb3ZpZGVyCi0gICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wcm92aWRlcnMuRGlhZ3JhbUdsb2JhbEFjdGlvbkhhbmRsZXJQcm92aWRlciIKLSAgICAgICAgIGlkPSJXUEREUHJlc2VudGF0aW9uIj4KLSAgICAgICAgIDxQcmlvcml0eSBuYW1lPSJMb3dlc3QiLz4KLSAgICAgICAgIDxWaWV3SWQgaWQ9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQucGFydC5Xb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtRWRpdG9ySUQiPgotICAgICAgICAgICAgPEVsZW1lbnRUeXBlIGNsYXNzPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JR3JhcGhpY2FsRWRpdFBhcnQiPgotICAgICAgICAgICAgICAgPEdsb2JhbEFjdGlvbklkIGFjdGlvbklkPSJkZWxldGUiLz4KLSAgICAgICAgICAgIDwvRWxlbWVudFR5cGU+Ci0gICAgICAgICAgICA8RWxlbWVudFR5cGUgY2xhc3M9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLkRpYWdyYW1FZGl0UGFydCI+Ci0gICAgICAgICAgICAgICA8R2xvYmFsQWN0aW9uSWQgYWN0aW9uSWQ9InNhdmUiLz4KLSAgICAgICAgICAgIDwvRWxlbWVudFR5cGU+Ci0gICAgICAgICA8L1ZpZXdJZD4KLSAgICAgIDwvR2xvYmFsQWN0aW9uSGFuZGxlclByb3ZpZGVyPgotICAgICAgPEdsb2JhbEFjdGlvbkhhbmRsZXJQcm92aWRlcgotICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucHJpbnRpbmcucmVuZGVyLnByb3ZpZGVycy5EaWFncmFtV2l0aFByaW50R2xvYmFsQWN0aW9uSGFuZGxlclByb3ZpZGVyIgotICAgICAgICAgaWQ9IldQRERQcmVzZW50YXRpb25QcmludCI+Ci0gICAgICAgICA8UHJpb3JpdHkgbmFtZT0iTG93ZXN0Ii8+Ci0gICAgICAgICA8Vmlld0lkIGlkPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLnBhcnQuV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbUVkaXRvcklEIj4KLSAgICAgICAgICAgIDxFbGVtZW50VHlwZSBjbGFzcz0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUdyYXBoaWNhbEVkaXRQYXJ0Ij4KLSAgICAgICAgICAgICAgIDxHbG9iYWxBY3Rpb25JZCBhY3Rpb25JZD0icHJpbnQiLz4KLSAgICAgICAgICAgIDwvRWxlbWVudFR5cGU+Ci0gICAgICAgICA8L1ZpZXdJZD4KLSAgICAgIDwvR2xvYmFsQWN0aW9uSGFuZGxlclByb3ZpZGVyPgotICAgICAgPEdsb2JhbEFjdGlvbkhhbmRsZXJQcm92aWRlcgotICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucHJvdmlkZXJzLmlkZS5wcm92aWRlcnMuRGlhZ3JhbUlERUdsb2JhbEFjdGlvbkhhbmRsZXJQcm92aWRlciIKLSAgICAgICAgIGlkPSJXUEREUHJlc2VudGF0aW9uSURFIj4KLSAgICAgICAgIDxQcmlvcml0eSBuYW1lPSJMb3dlc3QiLz4KLSAgICAgICAgIDxWaWV3SWQgaWQ9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQucGFydC5Xb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtRWRpdG9ySUQiPgotICAgICAgICAgICAgPEVsZW1lbnRUeXBlIGNsYXNzPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JR3JhcGhpY2FsRWRpdFBhcnQiPgotICAgICAgICAgICAgICAgPEdsb2JhbEFjdGlvbklkIGFjdGlvbklkPSJib29rbWFyayIvPgotICAgICAgICAgICAgPC9FbGVtZW50VHlwZT4KLSAgICAgICAgIDwvVmlld0lkPgotICAgICAgPC9HbG9iYWxBY3Rpb25IYW5kbGVyUHJvdmlkZXI+Ci0gICAgICA8IS0tCi0gICAgICA8R2xvYmFsQWN0aW9uSGFuZGxlclByb3ZpZGVyCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZW5kZXIucHJvdmlkZXJzLkRpYWdyYW1VSVJlbmRlckdsb2JhbEFjdGlvbkhhbmRsZXJQcm92aWRlciIKLSAgICAgICAgICAgIGlkPSJXUEREUmVuZGVyIj4KLSAgICAgICAgIDxQcmlvcml0eSBuYW1lPSJMb3dlc3QiLz4KLSAgICAgICAgIDxWaWV3SWQgaWQ9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQucGFydC5Xb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtRWRpdG9ySUQiPgotICAgICAgICAgICAgPEVsZW1lbnRUeXBlIGNsYXNzPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JR3JhcGhpY2FsRWRpdFBhcnQiPgotICAgICAgICAgICAgICAgPEdsb2JhbEFjdGlvbklkIGFjdGlvbklkPSJjdXQiLz4KLSAgICAgICAgICAgICAgIDxHbG9iYWxBY3Rpb25JZCBhY3Rpb25JZD0iY29weSIvPgotICAgICAgICAgICAgICAgPEdsb2JhbEFjdGlvbklkIGFjdGlvbklkPSJwYXN0ZSIvPgotICAgICAgICAgICAgPC9FbGVtZW50VHlwZT4KLSAgICAgICAgIDwvVmlld0lkPgotICAgICAgPC9HbG9iYWxBY3Rpb25IYW5kbGVyUHJvdmlkZXI+Ci0gICAgICAtLT4KLSAgIDwvZXh0ZW5zaW9uPgotCi0gICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUudmlld1Byb3ZpZGVycyI+Ci0gICAgICA8dmlld1Byb3ZpZGVyIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLnByb3ZpZGVycy5EaWFncmFtVmlld1Byb3ZpZGVyIj4KLSAgICAgICAgIDxQcmlvcml0eSBuYW1lPSJMb3dlc3QiLz4KLSAgICAgICAgIDxjb250ZXh0IHZpZXdDbGFzcz0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRGlhZ3JhbSIgc2VtYW50aWNIaW50cz0iV1BERCIvPgotICAgICAgICAgPGNvbnRleHQgdmlld0NsYXNzPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob2RlIiBzZW1hbnRpY0hpbnRzPSIiLz4KLSAgICAgICAgIDxjb250ZXh0IHZpZXdDbGFzcz0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRWRnZSIgc2VtYW50aWNIaW50cz0iIi8+Ci0gICAgICA8L3ZpZXdQcm92aWRlcj4KLSAgIDwvZXh0ZW5zaW9uPgotCi0gICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0UHJvdmlkZXJzIj4KLSAgICAgIDxlZGl0cGFydFByb3ZpZGVyIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLnByb3ZpZGVycy5EaWFncmFtRWRpdFBhcnRQcm92aWRlciI+Ci0gICAgICAgICA8UHJpb3JpdHkgbmFtZT0iTG93ZXN0Ii8+Ci0gICAgICA8L2VkaXRwYXJ0UHJvdmlkZXI+Ci0gICA8L2V4dGVuc2lvbj4KLQotICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wYWxldHRlUHJvdmlkZXJzIj4KLSAgICAgIDxwYWxldHRlUHJvdmlkZXIgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQucHJvdmlkZXJzLkRpYWdyYW1QYWxldHRlUHJvdmlkZXIiPgotICAgICAgICAgPFByaW9yaXR5IG5hbWU9Ikxvd2VzdCIvPgotICAgICAgICAgPGVkaXRvciBpZD0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5wYXJ0LldvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW1FZGl0b3JJRCIvPgotICAgICAgPC9wYWxldHRlUHJvdmlkZXI+Ci0gICAgICA8cGFsZXR0ZVByb3ZpZGVyCi0JCQljbGFzcz0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wcm92aWRlcnMuRGVmYXVsdFBhbGV0dGVQcm92aWRlciI+Ci0gICAgICAgIDxQcmlvcml0eSBuYW1lPSJNZWRpdW0iLz4KLSAgICAgICAgPGVkaXRvciBpZD0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5wYXJ0LldvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW1FZGl0b3JJRCIvPgotICAgICAgICA8Y29udHJpYnV0aW9uPgotICAgICAgICAgICAgPHByZWRlZmluZWRFbnRyeSAgICAKLSAgICAgICAgICAgIAlpZD0iZ2Vvc2hhcGVEcmF3ZXIiICAgcGF0aD0iLyI+Ci0gICAgICAgICAgICAJPGV4cGFuZCBmb3JjZT0idHJ1ZSIvPgotICAgICAgICAgICAgIDwvcHJlZGVmaW5lZEVudHJ5PiAKLSAgICAgICAgPC9jb250cmlidXRpb24+Ci0gICAgICA8L3BhbGV0dGVQcm92aWRlcj4KLSAgIDwvZXh0ZW5zaW9uPgotCi0gICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudWkubW9kZWxpbmdBc3Npc3RhbnRQcm92aWRlcnMiPgotICAgICAgPG1vZGVsaW5nQXNzaXN0YW50UHJvdmlkZXIgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQucHJvdmlkZXJzLkRpYWdyYW1Nb2RlbGluZ0Fzc2lzdGFudFByb3ZpZGVyIj4KLSAgICAgICAgIDxQcmlvcml0eSBuYW1lPSJMb3dlc3QiLz4KLSAgICAgIDwvbW9kZWxpbmdBc3Npc3RhbnRQcm92aWRlcj4KLSAgIDwvZXh0ZW5zaW9uPgotCi0gICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucHJvcGVydGllcy5wcm9wZXJ0aWVzUHJvdmlkZXJzIj4KLSAgICAgIDxQcm9wZXJ0aWVzUHJvdmlkZXIKLSAgICAgICAgICAgIHZlcmlmeVBsdWdpbkxvYWRlZD0iZmFsc2UiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5wcm92aWRlcnMuRGlhZ3JhbVByb3BlcnR5UHJvdmlkZXIiPgotICAgICAgICAgPFByaW9yaXR5IG5hbWU9Ikxvd2VzdCIvPgotICAgICAgPC9Qcm9wZXJ0aWVzUHJvdmlkZXI+Ci0gICA8L2V4dGVuc2lvbj4KLQotICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLmljb25Qcm92aWRlcnMiPgotICAgICAgPEljb25Qcm92aWRlciBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5wcm92aWRlcnMuRGlhZ3JhbUljb25Qcm92aWRlciI+Ci0gICAgICAgICA8UHJpb3JpdHkgbmFtZT0iTG93Ii8+Ci0gICAgICA8L0ljb25Qcm92aWRlcj4KLSAgICAgIDxJY29uUHJvdmlkZXIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmdlb3NoYXBlcy5pbnRlcm5hbC5wcm92aWRlcnMuR2VvU2hhcGVJY29uUHJvdmlkZXIiPgotICAgICAgICAgPFByaW9yaXR5Ci0gICAgICAgICAgICAgICBuYW1lPSJNZWRpdW0iPgotICAgICAgICAgPC9Qcmlvcml0eT4KLSAgICAgICAgIDxvYmplY3QgY2xhc3M9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXcob3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24pIiBpZD0iR2VvU2hhcGUiPgotICAgICAgICAJIDxtZXRob2QgbmFtZT0iZ2V0VHlwZSgpIiB2YWx1ZT0ib3ZhbCx0cmlhbmdsZSxyZWN0YW5nbGUsc2hhZG93UmVjdGFuZ2xlLHJlY3RhbmdsZTNELHJvdW5kUmVjdGFuZ2xlLGhleGFnb24sb2N0YWdvbixwZW50YWdvbixkaWFtb25kLGN5bGluZGVyLGxpbmUiLz4KLQkgICAgIDwvb2JqZWN0PgotICAgICAgICAgPGNvbnRleHQgZWxlbWVudHM9Ikdlb1NoYXBlIj4KLSAgICAgICAgIDwvY29udGV4dD4KLSAgICAgIDwvSWNvblByb3ZpZGVyPgotICAgPC9leHRlbnNpb24+Ci0KLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXJQcm92aWRlcnMiPgotICAgICAgPFBhcnNlclByb3ZpZGVyIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLnByb3ZpZGVycy5EaWFncmFtUGFyc2VyUHJvdmlkZXIiPgotICAgICAgICAgPFByaW9yaXR5IG5hbWU9Ikxvd2VzdCIvPgotICAgICAgPC9QYXJzZXJQcm92aWRlcj4KLSAgIDwvZXh0ZW5zaW9uPgotCi0gICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLmVsZW1lbnRUeXBlcyI+Ci0KLSAgICAgIDxtZXRhbW9kZWwgbnNVUkk9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL2RpYWdyYW0vMS4wLjAvZGlhZ3JhbS5lY29yZSI+Ci0gICAgICAgICA8bWV0YW1vZGVsVHlwZQotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQuV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbV83OSIKLSAgICAgICAgICAgICAgIGtpbmQ9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuSUhpbnRlZFR5cGUiCi0gICAgICAgICAgICAgICBlY2xhc3M9IldvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW0iCi0gICAgICAgICAgICAgICBlZGl0aGVscGVyPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLmVkaXQuaGVscGVycy5Xb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtRWRpdEhlbHBlciI+Ci0gICAgICAgICAgICA8cGFyYW0gbmFtZT0ic2VtYW50aWNIaW50IiB2YWx1ZT0iNzkiLz4KLSAgICAgICAgIDwvbWV0YW1vZGVsVHlwZT4KLSAgICAgIDwvbWV0YW1vZGVsPgotCi0gICAgICA8bWV0YW1vZGVsIG5zVVJJPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi9kaWFncmFtLzEuMC4wL2RpYWdyYW0uZWNvcmUiPgotICAgICAgICAgPG1ldGFtb2RlbFR5cGUKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLldvcmtQcm9kdWN0Tm9kZV8xMDAxIgotICAgICAgICAgICAgICAgbmFtZT0iJWVsZW1lbnRfdHlwZV93b3JrcHJvZHVjdF9kZXNjcmlwdG9yIgotICAgICAgICAgICAgICAga2luZD0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5JSGludGVkVHlwZSIKLSAgICAgICAgICAgICAgIGVjbGFzcz0iV29ya1Byb2R1Y3ROb2RlIgotICAgICAgICAgICAgICAgZWRpdGhlbHBlcj0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5lZGl0LmhlbHBlcnMuV29ya1Byb2R1Y3ROb2RlRWRpdEhlbHBlciI+Ci0gICAgICAgICAgICA8cGFyYW0gbmFtZT0ic2VtYW50aWNIaW50IiB2YWx1ZT0iMTAwMSIvPgotICAgICAgICAgPC9tZXRhbW9kZWxUeXBlPgotICAgICAgPC9tZXRhbW9kZWw+Ci0KLSAgICAgIDxtZXRhbW9kZWwgbnNVUkk9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL2RpYWdyYW0vMS4wLjAvZGlhZ3JhbS5lY29yZSI+Ci0gICAgICAgICA8bWV0YW1vZGVsVHlwZQotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQuTGlua18zMDAxIgotICAgICAgICAgICAgICAgbmFtZT0iJWVsZW1lbnRfdHlwZV9jb250cm9sX2Zsb3ciCi0gICAgICAgICAgICAgICBraW5kPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLklIaW50ZWRUeXBlIgotICAgICAgICAgICAgICAgZWNsYXNzPSJMaW5rIgotICAgICAgICAgICAgICAgZWRpdGhlbHBlcj0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5lZGl0LmhlbHBlcnMuTGlua0VkaXRIZWxwZXIiPgotICAgICAgICAgICAgPHBhcmFtIG5hbWU9InNlbWFudGljSGludCIgdmFsdWU9IjMwMDEiLz4KLSAgICAgICAgIDwvbWV0YW1vZGVsVHlwZT4KLSAgICAgIDwvbWV0YW1vZGVsPgotICAgPC9leHRlbnNpb24+Ci0KLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuZWxlbWVudFR5cGVCaW5kaW5ncyI+Ci0gICAgICA8Y2xpZW50Q29udGV4dCBpZD0iV1BERENsaWVudENvbnRleHQiPgotICAgICAgICAgPGVuYWJsZW1lbnQ+Ci0gICAgICAgICAgICA8dGVzdAotICAgICAgICAgICAgICAgcHJvcGVydHk9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb3JlLmVkaXRpbmdEb21haW4iCi0gICAgICAgICAgICAgICB2YWx1ZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uRWRpdGluZ0RvbWFpbiIvPgotICAgICAgICAgPC9lbmFibGVtZW50PgotICAgICAgPC9jbGllbnRDb250ZXh0PiAKLSAgICAgIDxiaW5kaW5nIGNvbnRleHQ9IldQRERDbGllbnRDb250ZXh0Ij4KLSAgICAgICAgIDxlbGVtZW50VHlwZSByZWY9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQuV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbV83OSIvPgotICAgICAgICAgPGVsZW1lbnRUeXBlIHJlZj0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5Xb3JrUHJvZHVjdE5vZGVfMTAwMSIvPgotICAgICAgICAgPGVsZW1lbnRUeXBlIHJlZj0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5MaW5rXzMwMDEiLz4KLSAgICAgICAgIDxhZHZpY2UgcmVmPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuYWR2aWNlLm5vdGF0aW9uRGVwZGVuZGVudHMiLz4KLSAgICAgICAgIDxlbGVtZW50VHlwZSBwYXR0ZXJuPSIuKiIvPgotICAgICAgPC9iaW5kaW5nPgotICAgPC9leHRlbnNpb24+Ci0KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9lZGl0L2NvbW1hbmRzL0RpYWdyYW1SZW9yaWVudENvbm5lY3Rpb25WaWV3Q29tbWFuZC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9lZGl0L2NvbW1hbmRzL0RpYWdyYW1SZW9yaWVudENvbm5lY3Rpb25WaWV3Q29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NjA2MmYzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvZWRpdC9jb21tYW5kcy9EaWFncmFtUmVvcmllbnRDb25uZWN0aW9uVmlld0NvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQuZWRpdC5jb21tYW5kczsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi5jb3JlLmNvbW1hbmQuQ29tbWFuZFJlc3VsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29tbWFuZHMuY29yZS5jb21tYW5kLkFic3RyYWN0VHJhbnNhY3Rpb25hbENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRWRnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERpYWdyYW1SZW9yaWVudENvbm5lY3Rpb25WaWV3Q29tbWFuZCBleHRlbmRzCi0JCUFic3RyYWN0VHJhbnNhY3Rpb25hbENvbW1hbmQgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgSUFkYXB0YWJsZSBlZGdlQWRhcHRvcjsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRGlhZ3JhbVJlb3JpZW50Q29ubmVjdGlvblZpZXdDb21tYW5kKAotCQkJVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gZWRpdGluZ0RvbWFpbiwgU3RyaW5nIGxhYmVsKSB7Ci0JCXN1cGVyKGVkaXRpbmdEb21haW4sIGxhYmVsLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0QWZmZWN0ZWRGaWxlcygpIHsKLQkJVmlldyB2aWV3ID0gKFZpZXcpIGVkZ2VBZGFwdG9yLmdldEFkYXB0ZXIoVmlldy5jbGFzcyk7Ci0JCWlmICh2aWV3ICE9IG51bGwpIHsKLQkJCXJldHVybiBnZXRXb3Jrc3BhY2VGaWxlcyh2aWV3KTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0QWZmZWN0ZWRGaWxlcygpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSUFkYXB0YWJsZSBnZXRFZGdlQWRhcHRvcigpIHsKLQkJcmV0dXJuIGVkZ2VBZGFwdG9yOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFZGdlQWRhcHRvcihJQWRhcHRhYmxlIGVkZ2VBZGFwdG9yKSB7Ci0JCXRoaXMuZWRnZUFkYXB0b3IgPSBlZGdlQWRhcHRvcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmRSZXN1bHQgZG9FeGVjdXRlV2l0aFJlc3VsdCgKLQkJCUlQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pIHsKLQkJYXNzZXJ0IG51bGwgIT0gZWRnZUFkYXB0b3IgOiAiTnVsbCBjaGlsZCBpbiBEaWFncmFtUmVvcmllbnRDb25uZWN0aW9uVmlld0NvbW1hbmQiOyAvLyROT04tTkxTLTEkCi0JCUVkZ2UgZWRnZSA9IChFZGdlKSBnZXRFZGdlQWRhcHRvcigpLmdldEFkYXB0ZXIoRWRnZS5jbGFzcyk7Ci0JCWFzc2VydCBudWxsICE9IGVkZ2UgOiAiTnVsbCBlZGdlIGluIERpYWdyYW1SZW9yaWVudENvbm5lY3Rpb25WaWV3Q29tbWFuZCI7IC8vJE5PTi1OTFMtMSQKLQotCQlWaWV3IHRlbXBWaWV3ID0gZWRnZS5nZXRTb3VyY2UoKTsKLQkJZWRnZS5zZXRTb3VyY2UoZWRnZS5nZXRUYXJnZXQoKSk7Ci0JCWVkZ2Uuc2V0VGFyZ2V0KHRlbXBWaWV3KTsKLQotCQlyZXR1cm4gQ29tbWFuZFJlc3VsdC5uZXdPS0NvbW1hbmRSZXN1bHQoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL2VkaXQvY29tbWFuZHMvTGlua0NyZWF0ZUNvbW1hbmQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvZWRpdC9jb21tYW5kcy9MaW5rQ3JlYXRlQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzY2RmODJlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvZWRpdC9jb21tYW5kcy9MaW5rQ3JlYXRlQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQuZWRpdC5jb21tYW5kczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5MaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk1vZGVsUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5jb21tYW5kcy5DcmVhdGVSZWxhdGlvbnNoaXBDb21tYW5kOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5DcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIExpbmtDcmVhdGVDb21tYW5kIGV4dGVuZHMgQ3JlYXRlUmVsYXRpb25zaGlwQ29tbWFuZCB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBOb2RlIG15Q29udGFpbmVyOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgTm9kZSBteVNvdXJjZTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIE5vZGUgbXlUYXJnZXQ7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpbmtDcmVhdGVDb21tYW5kKENyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3QgcmVxLCBOb2RlIGNvbnRhaW5lciwKLQkJCU5vZGUgc291cmNlLCBOb2RlIHRhcmdldCkgewotCQlzdXBlcihyZXEpOwotCQlzdXBlci5zZXRFbGVtZW50VG9FZGl0KGNvbnRhaW5lcik7Ci0JCW15Q29udGFpbmVyID0gY29udGFpbmVyOwotCQlteVNvdXJjZSA9IHNvdXJjZTsKLQkJbXlUYXJnZXQgPSB0YXJnZXQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb2RlIGdldENvbnRhaW5lcigpIHsKLQkJcmV0dXJuIG15Q29udGFpbmVyOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRU9iamVjdCBnZXRTb3VyY2UoKSB7Ci0JCXJldHVybiBteVNvdXJjZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVPYmplY3QgZ2V0VGFyZ2V0KCkgewotCQlyZXR1cm4gbXlUYXJnZXQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZ2V0RUNsYXNzVG9FZGl0KCkgewotCQlyZXR1cm4gTW9kZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXROb2RlKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldEVsZW1lbnRUb0VkaXQoRU9iamVjdCBlbGVtZW50KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRU9iamVjdCBkb0RlZmF1bHRFbGVtZW50Q3JlYXRpb24oKSB7Ci0JCUxpbmsgbmV3RWxlbWVudCA9IChMaW5rKSBzdXBlci5kb0RlZmF1bHRFbGVtZW50Q3JlYXRpb24oKTsKLQkJaWYgKG5ld0VsZW1lbnQgIT0gbnVsbCkgewotCQkJbmV3RWxlbWVudC5zZXRUYXJnZXQobXlUYXJnZXQpOwotCQkJbmV3RWxlbWVudC5zZXRTb3VyY2UobXlTb3VyY2UpOwotCQl9Ci0JCXJldHVybiBuZXdFbGVtZW50OwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9lZGl0L2NvbW1hbmRzL0xpbmtSZW9yaWVudENvbW1hbmQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvZWRpdC9jb21tYW5kcy9MaW5rUmVvcmllbnRDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiOGY3ZmMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9lZGl0L2NvbW1hbmRzL0xpbmtSZW9yaWVudENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLmVkaXQuY29tbWFuZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5MaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5lZGl0LnBvbGljaWVzLkRpYWdyYW1CYXNlSXRlbVNlbWFudGljRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS5jb21tYW5kLkNvbW1hbmRSZXN1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5jb21tYW5kcy5FZGl0RWxlbWVudENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5SZW9yaWVudFJlbGF0aW9uc2hpcFJlcXVlc3Q7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgTGlua1Jlb3JpZW50Q29tbWFuZCBleHRlbmRzIEVkaXRFbGVtZW50Q29tbWFuZCB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBpbnQgcmVvcmllbnREaXJlY3Rpb247Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBFT2JqZWN0IG9sZEVuZDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIGZpbmFsIEVPYmplY3QgbmV3RW5kOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaW5rUmVvcmllbnRDb21tYW5kKFJlb3JpZW50UmVsYXRpb25zaGlwUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCXN1cGVyKHJlcXVlc3QuZ2V0TGFiZWwoKSwgcmVxdWVzdC5nZXRSZWxhdGlvbnNoaXAoKSwgcmVxdWVzdCk7Ci0JCXJlb3JpZW50RGlyZWN0aW9uID0gcmVxdWVzdC5nZXREaXJlY3Rpb24oKTsKLQkJb2xkRW5kID0gcmVxdWVzdC5nZXRPbGRSZWxhdGlvbnNoaXBFbmQoKTsKLQkJbmV3RW5kID0gcmVxdWVzdC5nZXROZXdSZWxhdGlvbnNoaXBFbmQoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2FuRXhlY3V0ZSgpIHsKLQkJaWYgKCEoZ2V0RWxlbWVudFRvRWRpdCgpIGluc3RhbmNlb2YgTGluaykpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlpZiAocmVvcmllbnREaXJlY3Rpb24gPT0gUmVvcmllbnRSZWxhdGlvbnNoaXBSZXF1ZXN0LlJFT1JJRU5UX1NPVVJDRSkgewotCQkJcmV0dXJuIGNhblJlb3JpZW50U291cmNlKCk7Ci0JCX0KLQkJaWYgKHJlb3JpZW50RGlyZWN0aW9uID09IFJlb3JpZW50UmVsYXRpb25zaGlwUmVxdWVzdC5SRU9SSUVOVF9UQVJHRVQpIHsKLQkJCXJldHVybiBjYW5SZW9yaWVudFRhcmdldCgpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gY2FuUmVvcmllbnRTb3VyY2UoKSB7Ci0JCWlmICghKG9sZEVuZCBpbnN0YW5jZW9mIE5vZGUgJiYgbmV3RW5kIGluc3RhbmNlb2YgTm9kZSkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlOb2RlIHRhcmdldCA9IGdldExpbmsoKS5nZXRUYXJnZXQoKTsKLQkJaWYgKCEoZ2V0TGluaygpLmVDb250YWluZXIoKSBpbnN0YW5jZW9mIE5vZGUpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJTm9kZSBjb250YWluZXIgPSAoTm9kZSkgZ2V0TGluaygpLmVDb250YWluZXIoKTsKLQkJcmV0dXJuIERpYWdyYW1CYXNlSXRlbVNlbWFudGljRWRpdFBvbGljeS5MaW5rQ29uc3RyYWludHMKLQkJCQkuY2FuRXhpc3RMaW5rXzMwMDEoY29udGFpbmVyLCBnZXROZXdTb3VyY2UoKSwgdGFyZ2V0KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gY2FuUmVvcmllbnRUYXJnZXQoKSB7Ci0JCWlmICghKG9sZEVuZCBpbnN0YW5jZW9mIE5vZGUgJiYgbmV3RW5kIGluc3RhbmNlb2YgTm9kZSkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlOb2RlIHNvdXJjZSA9IGdldExpbmsoKS5nZXRTb3VyY2UoKTsKLQkJaWYgKCEoZ2V0TGluaygpLmVDb250YWluZXIoKSBpbnN0YW5jZW9mIE5vZGUpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJTm9kZSBjb250YWluZXIgPSAoTm9kZSkgZ2V0TGluaygpLmVDb250YWluZXIoKTsKLQkJcmV0dXJuIERpYWdyYW1CYXNlSXRlbVNlbWFudGljRWRpdFBvbGljeS5MaW5rQ29uc3RyYWludHMKLQkJCQkuY2FuRXhpc3RMaW5rXzMwMDEoY29udGFpbmVyLCBzb3VyY2UsIGdldE5ld1RhcmdldCgpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmRSZXN1bHQgZG9FeGVjdXRlV2l0aFJlc3VsdChJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsCi0JCQlJQWRhcHRhYmxlIGluZm8pIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCQlpZiAoIWNhbkV4ZWN1dGUoKSkgewotCQkJdGhyb3cgbmV3IEV4ZWN1dGlvbkV4Y2VwdGlvbigKLQkJCQkJIkludmFsaWQgYXJndW1lbnRzIGluIHJlb3JpZW50IGxpbmsgY29tbWFuZCIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJaWYgKHJlb3JpZW50RGlyZWN0aW9uID09IFJlb3JpZW50UmVsYXRpb25zaGlwUmVxdWVzdC5SRU9SSUVOVF9TT1VSQ0UpIHsKLQkJCXJldHVybiByZW9yaWVudFNvdXJjZSgpOwotCQl9Ci0JCWlmIChyZW9yaWVudERpcmVjdGlvbiA9PSBSZW9yaWVudFJlbGF0aW9uc2hpcFJlcXVlc3QuUkVPUklFTlRfVEFSR0VUKSB7Ci0JCQlyZXR1cm4gcmVvcmllbnRUYXJnZXQoKTsKLQkJfQotCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kUmVzdWx0IHJlb3JpZW50U291cmNlKCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCWdldExpbmsoKS5zZXRTb3VyY2UoZ2V0TmV3U291cmNlKCkpOwotCQlyZXR1cm4gQ29tbWFuZFJlc3VsdC5uZXdPS0NvbW1hbmRSZXN1bHQoZ2V0TGluaygpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmRSZXN1bHQgcmVvcmllbnRUYXJnZXQoKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJZ2V0TGluaygpLnNldFRhcmdldChnZXROZXdUYXJnZXQoKSk7Ci0JCXJldHVybiBDb21tYW5kUmVzdWx0Lm5ld09LQ29tbWFuZFJlc3VsdChnZXRMaW5rKCkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTGluayBnZXRMaW5rKCkgewotCQlyZXR1cm4gKExpbmspIGdldEVsZW1lbnRUb0VkaXQoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE5vZGUgZ2V0T2xkU291cmNlKCkgewotCQlyZXR1cm4gKE5vZGUpIG9sZEVuZDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE5vZGUgZ2V0TmV3U291cmNlKCkgewotCQlyZXR1cm4gKE5vZGUpIG5ld0VuZDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE5vZGUgZ2V0T2xkVGFyZ2V0KCkgewotCQlyZXR1cm4gKE5vZGUpIG9sZEVuZDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE5vZGUgZ2V0TmV3VGFyZ2V0KCkgewotCQlyZXR1cm4gKE5vZGUpIG5ld0VuZDsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL2VkaXQvY29tbWFuZHMvV29ya1Byb2R1Y3ROb2RlQ3JlYXRlQ29tbWFuZC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9lZGl0L2NvbW1hbmRzL1dvcmtQcm9kdWN0Tm9kZUNyZWF0ZUNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Y3YzVlMS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL2VkaXQvY29tbWFuZHMvV29ya1Byb2R1Y3ROb2RlQ3JlYXRlQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5lZGl0LmNvbW1hbmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5EaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk1vZGVsUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5OYW1lZE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5jb21tYW5kcy5DcmVhdGVFbGVtZW50Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkNyZWF0ZUVsZW1lbnRSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgV29ya1Byb2R1Y3ROb2RlQ3JlYXRlQ29tbWFuZCBleHRlbmRzIENyZWF0ZUVsZW1lbnRDb21tYW5kIHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgV29ya1Byb2R1Y3ROb2RlQ3JlYXRlQ29tbWFuZChDcmVhdGVFbGVtZW50UmVxdWVzdCByZXEpIHsKLQkJc3VwZXIocmVxKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBnZXRFQ2xhc3NUb0VkaXQoKSB7Ci0JCXJldHVybiBNb2RlbFBhY2thZ2UuZUlOU1RBTkNFLmdldE5vZGVDb250YWluZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVPYmplY3QgZ2V0RWxlbWVudFRvRWRpdCgpIHsKLQkJRU9iamVjdCBjb250YWluZXIgPSAoKENyZWF0ZUVsZW1lbnRSZXF1ZXN0KSBnZXRSZXF1ZXN0KCkpCi0JCQkJLmdldENvbnRhaW5lcigpOwotCQlpZiAoY29udGFpbmVyIGluc3RhbmNlb2YgVmlldykgewotCQkJY29udGFpbmVyID0gKChWaWV3KSBjb250YWluZXIpLmdldEVsZW1lbnQoKTsKLQkJfQotCQlyZXR1cm4gY29udGFpbmVyOwotCX0KLQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFT2JqZWN0IGRvRGVmYXVsdEVsZW1lbnRDcmVhdGlvbigpIHsKLQkJTmFtZWROb2RlIG5ld05vZGUgPSAoTmFtZWROb2RlKXN1cGVyLmRvRGVmYXVsdEVsZW1lbnRDcmVhdGlvbigpOwotCQlEaWFncmFtIGRpYWdyYW0gPW5ld05vZGUuZ2V0RGlhZ3JhbSgpOwotCQlkaWFncmFtLnNldERlZmF1bHROYW1lKG5ld05vZGUpOwotCQlyZXR1cm4gbmV3Tm9kZTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL2VkaXQvaGVscGVycy9EaWFncmFtQmFzZUVkaXRIZWxwZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvZWRpdC9oZWxwZXJzL0RpYWdyYW1CYXNlRWRpdEhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMzhkNDUzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvZWRpdC9oZWxwZXJzL0RpYWdyYW1CYXNlRWRpdEhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5lZGl0LmhlbHBlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS5jb21tYW5kLkNvbXBvc2l0ZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUuY29tbWFuZC5JQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLmVkaXRoZWxwZXIuQWJzdHJhY3RFZGl0SGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ3JlYXRlRWxlbWVudFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5DcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuRGVzdHJveUVsZW1lbnRSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuRGVzdHJveVJlZmVyZW5jZVJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5JRWRpdENvbW1hbmRSZXF1ZXN0OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERpYWdyYW1CYXNlRWRpdEhlbHBlciBleHRlbmRzIEFic3RyYWN0RWRpdEhlbHBlciB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRURJVF9QT0xJQ1lfQ09NTUFORCA9ICJlZGl0IHBvbGljeSBjb21tYW5kIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJQ29tbWFuZCBnZXRJbnN0ZWFkQ29tbWFuZChJRWRpdENvbW1hbmRSZXF1ZXN0IHJlcSkgewotCQlJQ29tbWFuZCBlcENvbW1hbmQgPSAoSUNvbW1hbmQpIHJlcS5nZXRQYXJhbWV0ZXIoRURJVF9QT0xJQ1lfQ09NTUFORCk7Ci0JCXJlcS5zZXRQYXJhbWV0ZXIoRURJVF9QT0xJQ1lfQ09NTUFORCwgbnVsbCk7Ci0JCUlDb21tYW5kIGVoQ29tbWFuZCA9IHN1cGVyLmdldEluc3RlYWRDb21tYW5kKHJlcSk7Ci0JCWlmIChlcENvbW1hbmQgPT0gbnVsbCkgewotCQkJcmV0dXJuIGVoQ29tbWFuZDsKLQkJfQotCQlpZiAoZWhDb21tYW5kID09IG51bGwpIHsKLQkJCXJldHVybiBlcENvbW1hbmQ7Ci0JCX0KLQkJQ29tcG9zaXRlQ29tbWFuZCBjb21tYW5kID0gbmV3IENvbXBvc2l0ZUNvbW1hbmQobnVsbCk7Ci0JCWNvbW1hbmQuYWRkKGVwQ29tbWFuZCk7Ci0JCWNvbW1hbmQuYWRkKGVoQ29tbWFuZCk7Ci0JCXJldHVybiBjb21tYW5kOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUNvbW1hbmQgZ2V0Q3JlYXRlQ29tbWFuZChDcmVhdGVFbGVtZW50UmVxdWVzdCByZXEpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJQ29tbWFuZCBnZXRDcmVhdGVSZWxhdGlvbnNoaXBDb21tYW5kKAotCQkJQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdCByZXEpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJQ29tbWFuZCBnZXREZXN0cm95RWxlbWVudENvbW1hbmQoRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHJlcSkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElDb21tYW5kIGdldERlc3Ryb3lSZWZlcmVuY2VDb21tYW5kKERlc3Ryb3lSZWZlcmVuY2VSZXF1ZXN0IHJlcSkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9lZGl0L2hlbHBlcnMvTGlua0VkaXRIZWxwZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvZWRpdC9oZWxwZXJzL0xpbmtFZGl0SGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2NzlkMzUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9lZGl0L2hlbHBlcnMvTGlua0VkaXRIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQuZWRpdC5oZWxwZXJzOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIExpbmtFZGl0SGVscGVyIGV4dGVuZHMgRGlhZ3JhbUJhc2VFZGl0SGVscGVyIHsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL2VkaXQvaGVscGVycy9Xb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtRWRpdEhlbHBlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9lZGl0L2hlbHBlcnMvV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbUVkaXRIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTA4MTg3NC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL2VkaXQvaGVscGVycy9Xb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtRWRpdEhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5lZGl0LmhlbHBlcnM7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbUVkaXRIZWxwZXIgZXh0ZW5kcwotCQlEaWFncmFtQmFzZUVkaXRIZWxwZXIgewotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvZWRpdC9oZWxwZXJzL1dvcmtQcm9kdWN0Tm9kZUVkaXRIZWxwZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvZWRpdC9oZWxwZXJzL1dvcmtQcm9kdWN0Tm9kZUVkaXRIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjFmMDI3Ny4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL2VkaXQvaGVscGVycy9Xb3JrUHJvZHVjdE5vZGVFZGl0SGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLmVkaXQuaGVscGVyczsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBXb3JrUHJvZHVjdE5vZGVFZGl0SGVscGVyIGV4dGVuZHMgRGlhZ3JhbUJhc2VFZGl0SGVscGVyIHsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL2VkaXQvcGFydHMvRGlhZ3JhbUVkaXRQYXJ0RmFjdG9yeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9lZGl0L3BhcnRzL0RpYWdyYW1FZGl0UGFydEZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTVkNGUwMy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL2VkaXQvcGFydHMvRGlhZ3JhbUVkaXRQYXJ0RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQuZWRpdC5wYXJ0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5GaWd1cmVVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5EaW1lbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYudG9vbHMuQ2VsbEVkaXRvckxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSVRleHRBd2FyZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2VsbEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5wYXJ0LkRpYWdyYW1WaXN1YWxJRFJlZ2lzdHJ5OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERpYWdyYW1FZGl0UGFydEZhY3RvcnkgaW1wbGVtZW50cyBFZGl0UGFydEZhY3RvcnkgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFZGl0UGFydCBjcmVhdGVFZGl0UGFydChFZGl0UGFydCBjb250ZXh0LCBPYmplY3QgbW9kZWwpIHsKLQkJaWYgKG1vZGVsIGluc3RhbmNlb2YgVmlldykgewotCQkJVmlldyB2aWV3ID0gKFZpZXcpIG1vZGVsOwotCQkJc3dpdGNoIChEaWFncmFtVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRCh2aWV3KSkgewotCi0JCQljYXNlIFdvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW1FZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQkJcmV0dXJuIG5ldyBXb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtRWRpdFBhcnQodmlldyk7Ci0KLQkJCWNhc2UgV29ya1Byb2R1Y3ROb2RlRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJCXJldHVybiBuZXcgV29ya1Byb2R1Y3ROb2RlRWRpdFBhcnQodmlldyk7Ci0KLQkJCWNhc2UgV29ya1Byb2R1Y3ROb2RlTmFtZUVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCQlyZXR1cm4gbmV3IFdvcmtQcm9kdWN0Tm9kZU5hbWVFZGl0UGFydCh2aWV3KTsKLQotCQkJY2FzZSBMaW5rRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJCXJldHVybiBuZXcgTGlua0VkaXRQYXJ0KHZpZXcpOwotCi0JCQljYXNlIExpbmtOYW1lRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJCXJldHVybiBuZXcgTGlua05hbWVFZGl0UGFydCh2aWV3KTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gY3JlYXRlVW5yZWNvZ25pemVkRWRpdFBhcnQoY29udGV4dCwgbW9kZWwpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVkaXRQYXJ0IGNyZWF0ZVVucmVjb2duaXplZEVkaXRQYXJ0KEVkaXRQYXJ0IGNvbnRleHQsIE9iamVjdCBtb2RlbCkgewotCQkvLyBIYW5kbGUgY3JlYXRpb24gb2YgdW5yZWNvZ25pemVkIGNoaWxkIG5vZGUgRWRpdFBhcnRzIGhlcmUKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ2VsbEVkaXRvckxvY2F0b3IgZ2V0VGV4dENlbGxFZGl0b3JMb2NhdG9yKAotCQkJSVRleHRBd2FyZUVkaXRQYXJ0IHNvdXJjZSkgewotCQlpZiAoc291cmNlLmdldEZpZ3VyZSgpIGluc3RhbmNlb2YgV3JhcExhYmVsKQotCQkJcmV0dXJuIG5ldyBUZXh0Q2VsbEVkaXRvckxvY2F0b3IoKFdyYXBMYWJlbCkgc291cmNlLmdldEZpZ3VyZSgpKTsKLQkJZWxzZSB7Ci0JCQlyZXR1cm4gbmV3IExhYmVsQ2VsbEVkaXRvckxvY2F0b3IoKExhYmVsKSBzb3VyY2UuZ2V0RmlndXJlKCkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXN0YXRpYyBwcml2YXRlIGNsYXNzIFRleHRDZWxsRWRpdG9yTG9jYXRvciBpbXBsZW1lbnRzIENlbGxFZGl0b3JMb2NhdG9yIHsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSBXcmFwTGFiZWwgd3JhcExhYmVsOwotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgVGV4dENlbGxFZGl0b3JMb2NhdG9yKFdyYXBMYWJlbCB3cmFwTGFiZWwpIHsKLQkJCXRoaXMud3JhcExhYmVsID0gd3JhcExhYmVsOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBXcmFwTGFiZWwgZ2V0V3JhcExhYmVsKCkgewotCQkJcmV0dXJuIHdyYXBMYWJlbDsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgdm9pZCByZWxvY2F0ZShDZWxsRWRpdG9yIGNlbGxlZGl0b3IpIHsKLQkJCVRleHQgdGV4dCA9IChUZXh0KSBjZWxsZWRpdG9yLmdldENvbnRyb2woKTsKLQkJCVJlY3RhbmdsZSByZWN0ID0gZ2V0V3JhcExhYmVsKCkuZ2V0VGV4dEJvdW5kcygpLmdldENvcHkoKTsKLQkJCWdldFdyYXBMYWJlbCgpLnRyYW5zbGF0ZVRvQWJzb2x1dGUocmVjdCk7Ci0JCQlpZiAoZ2V0V3JhcExhYmVsKCkuaXNUZXh0V3JhcHBlZCgpCi0JCQkJCSYmIGdldFdyYXBMYWJlbCgpLmdldFRleHQoKS5sZW5ndGgoKSA+IDApIHsKLQkJCQlyZWN0LnNldFNpemUobmV3IERpbWVuc2lvbih0ZXh0LmNvbXB1dGVTaXplKHJlY3Qud2lkdGgsCi0JCQkJCQlTV1QuREVGQVVMVCkpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJaW50IGF2ciA9IEZpZ3VyZVV0aWxpdGllcy5nZXRGb250TWV0cmljcyh0ZXh0LmdldEZvbnQoKSkKLQkJCQkJCS5nZXRBdmVyYWdlQ2hhcldpZHRoKCk7Ci0JCQkJcmVjdC5zZXRTaXplKG5ldyBEaW1lbnNpb24odGV4dC5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwKLQkJCQkJCVNXVC5ERUZBVUxUKSkuZXhwYW5kKGF2ciAqIDIsIDApKTsKLQkJCX0KLQkJCWlmICghcmVjdC5lcXVhbHMobmV3IFJlY3RhbmdsZSh0ZXh0LmdldEJvdW5kcygpKSkpIHsKLQkJCQl0ZXh0LnNldEJvdW5kcyhyZWN0LngsIHJlY3QueSwgcmVjdC53aWR0aCwgcmVjdC5oZWlnaHQpOwotCQkJfQotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTGFiZWxDZWxsRWRpdG9yTG9jYXRvciBpbXBsZW1lbnRzIENlbGxFZGl0b3JMb2NhdG9yIHsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSBMYWJlbCBsYWJlbDsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIExhYmVsQ2VsbEVkaXRvckxvY2F0b3IoTGFiZWwgbGFiZWwpIHsKLQkJCXRoaXMubGFiZWwgPSBsYWJlbDsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgTGFiZWwgZ2V0TGFiZWwoKSB7Ci0JCQlyZXR1cm4gbGFiZWw7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHZvaWQgcmVsb2NhdGUoQ2VsbEVkaXRvciBjZWxsZWRpdG9yKSB7Ci0JCQlUZXh0IHRleHQgPSAoVGV4dCkgY2VsbGVkaXRvci5nZXRDb250cm9sKCk7Ci0JCQlSZWN0YW5nbGUgcmVjdCA9IGdldExhYmVsKCkuZ2V0VGV4dEJvdW5kcygpLmdldENvcHkoKTsKLQkJCWdldExhYmVsKCkudHJhbnNsYXRlVG9BYnNvbHV0ZShyZWN0KTsKLQkJCWludCBhdnIgPSBGaWd1cmVVdGlsaXRpZXMuZ2V0Rm9udE1ldHJpY3ModGV4dC5nZXRGb250KCkpCi0JCQkJCS5nZXRBdmVyYWdlQ2hhcldpZHRoKCk7Ci0JCQlyZWN0LnNldFNpemUobmV3IERpbWVuc2lvbih0ZXh0LmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULAotCQkJCQlTV1QuREVGQVVMVCkpLmV4cGFuZChhdnIgKiAyLCAwKSk7Ci0JCQlpZiAoIXJlY3QuZXF1YWxzKG5ldyBSZWN0YW5nbGUodGV4dC5nZXRCb3VuZHMoKSkpKSB7Ci0JCQkJdGV4dC5zZXRCb3VuZHMocmVjdC54LCByZWN0LnksIHJlY3Qud2lkdGgsIHJlY3QuaGVpZ2h0KTsKLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvZWRpdC9wYXJ0cy9EaWFncmFtRXh0Tm9kZUxhYmVsRWRpdFBhcnQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvZWRpdC9wYXJ0cy9EaWFncmFtRXh0Tm9kZUxhYmVsRWRpdFBhcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjg2ZTllYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL2VkaXQvcGFydHMvRGlhZ3JhbUV4dE5vZGVMYWJlbEVkaXRQYXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLmVkaXQucGFydHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuRGltZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuR3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuTGFiZWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmZpZ3VyZXMuTGFiZWxMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vdGF0aW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERpYWdyYW1FeHROb2RlTGFiZWxFZGl0UGFydCBleHRlbmRzIExhYmVsRWRpdFBhcnQgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEaWFncmFtRXh0Tm9kZUxhYmVsRWRpdFBhcnQoVmlldyB2aWV3KSB7Ci0JCXN1cGVyKHZpZXcpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWZyZXNoQm91bmRzKCkgewotCQlJRmlndXJlIHJlZkZpZ3VyZSA9ICgoR3JhcGhpY2FsRWRpdFBhcnQpIGdldFBhcmVudCgpKS5nZXRGaWd1cmUoKTsKLQkJaW50IGR4ID0gKChJbnRlZ2VyKSBnZXRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0TG9jYXRpb25fWCgpKSkuaW50VmFsdWUoKTsKLQkJaW50IGR5ID0gKChJbnRlZ2VyKSBnZXRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0TG9jYXRpb25fWSgpKSkuaW50VmFsdWUoKTsKLQkJUG9pbnQgb2Zmc2V0ID0gbmV3IFBvaW50KGR4LCBkeSk7Ci0JCWdldEZpZ3VyZSgpLmdldFBhcmVudCgpLnNldENvbnN0cmFpbnQoZ2V0RmlndXJlKCksCi0JCQkJbmV3IExhYmVsTG9jYXRvcihyZWZGaWd1cmUsIG9mZnNldCwgZ2V0S2V5UG9pbnQoKSkgewotCi0JCQkJCXB1YmxpYyB2b2lkIHJlbG9jYXRlKElGaWd1cmUgdGFyZ2V0KSB7Ci0JCQkJCQlQb2ludCBsb2NhdGlvbiA9IGdldFJlZmVyZW5jZVBvaW50KCkuZ2V0VHJhbnNsYXRlZCgKLQkJCQkJCQkJZ2V0T2Zmc2V0KCkpOwotCQkJCQkJbG9jYXRpb24udHJhbnNsYXRlKC10YXJnZXQuZ2V0Qm91bmRzKCkud2lkdGggLyAyLCAwKTsKLQkJCQkJCXRhcmdldC5zZXRMb2NhdGlvbihsb2NhdGlvbik7Ci0JCQkJCQl0YXJnZXQuc2V0U2l6ZShuZXcgRGltZW5zaW9uKAotCQkJCQkJCQl0YXJnZXQuZ2V0UHJlZmVycmVkU2l6ZSgpLndpZHRoLCB0YXJnZXQKLQkJCQkJCQkJCQkuZ2V0UHJlZmVycmVkU2l6ZSgpLmhlaWdodCkpOwotCQkJCQl9Ci0KLQkJCQkJcHJvdGVjdGVkIFBvaW50IGdldFJlZmVyZW5jZVBvaW50KCkgewotCQkJCQkJcmV0dXJuIGdldExhYmVsTG9jYXRpb24ocGFyZW50KTsKLQkJCQkJfQotCQkJCX0pOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUG9pbnQgZ2V0UmVmZXJlbmNlUG9pbnQoKSB7Ci0JCXJldHVybiBnZXRMYWJlbExvY2F0aW9uKCgoR3JhcGhpY2FsRWRpdFBhcnQpIGdldFBhcmVudCgpKS5nZXRGaWd1cmUoKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBQb2ludCBnZXRMYWJlbExvY2F0aW9uKElGaWd1cmUgcGFyZW50KSB7Ci0JCXJldHVybiBwYXJlbnQuZ2V0Qm91bmRzKCkuZ2V0Qm90dG9tKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9lZGl0L3BhcnRzL0xpbmtFZGl0UGFydC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9lZGl0L3BhcnRzL0xpbmtFZGl0UGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNmI5ZjUxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvZWRpdC9wYXJ0cy9MaW5rRWRpdFBhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLmVkaXQucGFydHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5FZGl0UG9saWN5Um9sZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuUG9seWxpbmVDb25uZWN0aW9uRXg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRWRnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Db25uZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlBvbHlsaW5lRGVjb3JhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnRMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUudXRpbC5EaWFncmFtQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUudXRpbC5EaWFncmFtQ29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS51dGlsLkRpYWdyYW1Db3JlVmFsaWRhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLmVkaXQucG9saWNpZXMuTGlua0l0ZW1TZW1hbnRpY0VkaXRQb2xpY3k7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5Db25uZWN0aW9uTm9kZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBMaW5rRWRpdFBhcnQgZXh0ZW5kcyBDb25uZWN0aW9uTm9kZUVkaXRQYXJ0IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWSVNVQUxfSUQgPSAzMDAxOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaW5rRWRpdFBhcnQoVmlldyB2aWV3KSB7Ci0JCXN1cGVyKHZpZXcpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCkgewotCQlzdXBlci5jcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5TRU1BTlRJQ19ST0xFLAotCQkJCW5ldyBMaW5rSXRlbVNlbWFudGljRWRpdFBvbGljeSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGZpZ3VyZSBmb3IgdGhpcyBlZGl0IHBhcnQuCi0JICogCi0JICogQm9keSBvZiB0aGlzIG1ldGhvZCBkb2VzIG5vdCBkZXBlbmQgb24gc2V0dGluZ3MgaW4gZ2VuZXJhdGlvbiBtb2RlbAotCSAqIHNvIHlvdSBtYXkgc2FmZWx5IHJlbW92ZSA8aT5nZW5lcmF0ZWQ8L2k+IHRhZyBhbmQgbW9kaWZ5IGl0LgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29ubmVjdGlvbiBjcmVhdGVDb25uZWN0aW9uRmlndXJlKCkgewotCi0JCXJldHVybiBuZXcgTGlua0ZpZ3VyZSgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgY2xhc3MgTGlua0ZpZ3VyZSBleHRlbmRzIFBvbHlsaW5lQ29ubmVjdGlvbkV4IHsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIExpbmtGaWd1cmUoKSB7Ci0KLQkJCXNldFRhcmdldERlY29yYXRpb24oY3JlYXRlVGFyZ2V0RGVjb3JhdGlvbigpKTsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIFBvbHlsaW5lRGVjb3JhdGlvbiBjcmVhdGVUYXJnZXREZWNvcmF0aW9uKCkgewotCQkJUG9seWxpbmVEZWNvcmF0aW9uIGRmID0gbmV3IFBvbHlsaW5lRGVjb3JhdGlvbigpOwotCQkJLy8gZGlzcGF0Y2hOZXh0PwotCi0JCQlQb2ludExpc3QgcGwgPSBuZXcgUG9pbnRMaXN0KCk7Ci0JCQlwbC5hZGRQb2ludCgtMSwgMSk7Ci0JCQlwbC5hZGRQb2ludCgwLCAwKTsKLQkJCXBsLmFkZFBvaW50KC0xLCAtMSk7Ci0JCQlkZi5zZXRUZW1wbGF0ZShwbCk7Ci0JCQlkZi5zZXRTY2FsZShnZXRNYXBNb2RlKCkuRFB0b0xQKDcpLCBnZXRNYXBNb2RlKCkuRFB0b0xQKDMpKTsKLQotCQkJcmV0dXJuIGRmOwotCQl9Ci0KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRGb3JlZ3JvdW5kQ29sb3IoQ29sb3IgY29sb3IpIHsKLQkJQ29sb3Igb3ZlcnJpZGVDb2xvciA9IERpYWdyYW1Db3JlVXRpbC5nZXRMaW5rT3ZlcnJpZGVDb2xvcigoRWRnZSkgZ2V0TW9kZWwoKSk7Ci0JCXN1cGVyLnNldEZvcmVncm91bmRDb2xvcihvdmVycmlkZUNvbG9yICE9IG51bGwgPyBvdmVycmlkZUNvbG9yIDogY29sb3IpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9lZGl0L3BhcnRzL0xpbmtOYW1lRWRpdFBhcnQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvZWRpdC9wYXJ0cy9MaW5rTmFtZUVkaXRQYXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyZTczMTQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9lZGl0L3BhcnRzL0xpbmtOYW1lRWRpdFBhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzMSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLmVkaXQucGFydHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuQ29ubmVjdGlvbkxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlJ1bm5hYmxlV2l0aFJlc3VsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnV0aWwuRGlhZ3JhbUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLmVkaXQucG9saWNpZXMuRGlhZ3JhbVRleHRTZWxlY3Rpb25FZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQucGFydC5EaWFncmFtVmlzdWFsSURSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLnByb3ZpZGVycy5EaWFncmFtRWxlbWVudFR5cGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5BY2Nlc3NpYmxlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLkRpcmVjdEVkaXRSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi50b29scy5EaXJlY3RFZGl0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLklQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5JUGFyc2VyRWRpdFN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLlBhcnNlckVkaXRTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5QYXJzZXJPcHRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuUGFyc2VyU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JR3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSVRleHRBd2FyZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLkxhYmVsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuTGFiZWxEaXJlY3RFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkubDEwbi5EaWFncmFtQ29sb3JSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlcXVlc3RzLlJlcXVlc3RDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS50b29scy5UZXh0RGlyZWN0RWRpdE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb3JlLnV0aWwuRU9iamVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5JRWxlbWVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnVpLnNlcnZpY2VzLnBhcnNlci5JU2VtYW50aWNQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnVpLnNlcnZpY2VzLnBhcnNlci5QYXJzZXJIaW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Gb250U3R5bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm90YXRpb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZW50QXNzaXN0UHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNlbGxFZGl0b3JWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmxlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250RGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgTGlua05hbWVFZGl0UGFydCBleHRlbmRzIExhYmVsRWRpdFBhcnQgaW1wbGVtZW50cwotCQlJVGV4dEF3YXJlRWRpdFBhcnQgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZJU1VBTF9JRCA9IDQwMDI7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBEaXJlY3RFZGl0TWFuYWdlciBtYW5hZ2VyOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgSVBhcnNlciBwYXJzZXI7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBMaXN0IHBhcnNlckVsZW1lbnRzOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgU3RyaW5nIGRlZmF1bHRUZXh0OwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXN0YXRpYyB7Ci0JCXJlZ2lzdGVyU25hcEJhY2tQb3NpdGlvbihEaWFncmFtVmlzdWFsSURSZWdpc3RyeQotCQkJCS5nZXRUeXBlKExpbmtOYW1lRWRpdFBhcnQuVklTVUFMX0lEKSwgbmV3IFBvaW50KDAsIDQwKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaW5rTmFtZUVkaXRQYXJ0KFZpZXcgdmlldykgewotCQlzdXBlcih2aWV3KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpIHsKLQkJc3VwZXIuY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpOwotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LkRJUkVDVF9FRElUX1JPTEUsCi0JCQkJbmV3IExhYmVsRGlyZWN0RWRpdFBvbGljeSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGludCBnZXRLZXlQb2ludCgpIHsKLQkJcmV0dXJuIENvbm5lY3Rpb25Mb2NhdG9yLk1JRERMRTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRMYWJlbFRleHRIZWxwZXIoSUZpZ3VyZSBmaWd1cmUpIHsKLQkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJcmV0dXJuICgoV3JhcExhYmVsKSBmaWd1cmUpLmdldFRleHQoKTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiAoKExhYmVsKSBmaWd1cmUpLmdldFRleHQoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRMYWJlbFRleHRIZWxwZXIoSUZpZ3VyZSBmaWd1cmUsIFN0cmluZyB0ZXh0KSB7Ci0JCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCSgoV3JhcExhYmVsKSBmaWd1cmUpLnNldFRleHQodGV4dCk7Ci0JCX0gZWxzZSB7Ci0JCQkoKExhYmVsKSBmaWd1cmUpLnNldFRleHQodGV4dCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEltYWdlIGdldExhYmVsSWNvbkhlbHBlcihJRmlndXJlIGZpZ3VyZSkgewotCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQlyZXR1cm4gKChXcmFwTGFiZWwpIGZpZ3VyZSkuZ2V0SWNvbigpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuICgoTGFiZWwpIGZpZ3VyZSkuZ2V0SWNvbigpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldExhYmVsSWNvbkhlbHBlcihJRmlndXJlIGZpZ3VyZSwgSW1hZ2UgaWNvbikgewotCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQkoKFdyYXBMYWJlbCkgZmlndXJlKS5zZXRJY29uKGljb24pOwotCQl9IGVsc2UgewotCQkJKChMYWJlbCkgZmlndXJlKS5zZXRJY29uKGljb24pOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExhYmVsKElGaWd1cmUgZmlndXJlKSB7Ci0JCXVucmVnaXN0ZXJWaXN1YWxzKCk7Ci0JCXNldEZpZ3VyZShmaWd1cmUpOwotCQlkZWZhdWx0VGV4dCA9IGdldExhYmVsVGV4dEhlbHBlcihmaWd1cmUpOwotCQlyZWdpc3RlclZpc3VhbHMoKTsKLQkJcmVmcmVzaFZpc3VhbHMoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIExpc3QgZ2V0TW9kZWxDaGlsZHJlbigpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJR3JhcGhpY2FsRWRpdFBhcnQgZ2V0Q2hpbGRCeVNlbWFudGljSGludChTdHJpbmcgc2VtYW50aWNIaW50KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRU9iamVjdCBnZXRQYXJzZXJFbGVtZW50KCkgewotCQlFT2JqZWN0IGVsZW1lbnQgPSByZXNvbHZlU2VtYW50aWNFbGVtZW50KCk7Ci0JCXJldHVybiBlbGVtZW50ICE9IG51bGwgPyBlbGVtZW50IDogKFZpZXcpIGdldE1vZGVsKCk7Ci0JfQotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICogCi0JICovCi0JcHJvdGVjdGVkIEltYWdlIGdldExhYmVsSWNvbigpIHsKLQkJLy8JCUltYWdlRGVzY3JpcHRvciBkZXNjcmlwdG9yID0gV1BERGlhZ3JhbUVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpCi0JCS8vCQkJCS5nZXRJdGVtSW1hZ2VEZXNjcmlwdG9yKGdldFBhcnNlckVsZW1lbnQoKSk7Ci0JCS8vCQlpZiAoZGVzY3JpcHRvciA9PSBudWxsKSB7Ci0JCS8vCQkJZGVzY3JpcHRvciA9IEltYWdlRGVzY3JpcHRvci5nZXRNaXNzaW5nSW1hZ2VEZXNjcmlwdG9yKCk7Ci0JCS8vCQl9Ci0JCS8vCQlyZXR1cm4gZGVzY3JpcHRvci5jcmVhdGVJbWFnZSgpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRMYWJlbFRleHQoKSB7Ci0JCVN0cmluZyB0ZXh0ID0gbnVsbDsKLQkJaWYgKGdldFBhcnNlcigpICE9IG51bGwpIHsKLQkJCXRleHQgPSBnZXRQYXJzZXIoKS5nZXRQcmludFN0cmluZygKLQkJCQkJbmV3IEVPYmplY3RBZGFwdGVyKGdldFBhcnNlckVsZW1lbnQoKSksCi0JCQkJCWdldFBhcnNlck9wdGlvbnMoKS5pbnRWYWx1ZSgpKTsKLQkJfQotCQlpZiAodGV4dCA9PSBudWxsIHx8IHRleHQubGVuZ3RoKCkgPT0gMCkgewotCQkJdGV4dCA9IGRlZmF1bHRUZXh0OwotCQl9Ci0JCXJldHVybiB0ZXh0OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMYWJlbFRleHQoU3RyaW5nIHRleHQpIHsKLQkJc2V0TGFiZWxUZXh0SGVscGVyKGdldEZpZ3VyZSgpLCB0ZXh0KTsKLQkJT2JqZWN0IHBkRWRpdFBvbGljeSA9IGdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSk7Ci0JCWlmIChwZEVkaXRQb2xpY3kgaW5zdGFuY2VvZiBEaWFncmFtVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHsKLQkJCSgoRGlhZ3JhbVRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSBwZEVkaXRQb2xpY3kpLnJlZnJlc2hGZWVkYmFjaygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RWRpdFRleHQoKSB7Ci0JCWlmIChnZXRQYXJzZXIoKSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gZ2V0UGFyc2VyKCkuZ2V0RWRpdFN0cmluZygKLQkJCQluZXcgRU9iamVjdEFkYXB0ZXIoZ2V0UGFyc2VyRWxlbWVudCgpKSwKLQkJCQlnZXRQYXJzZXJPcHRpb25zKCkuaW50VmFsdWUoKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzRWRpdGFibGUoKSB7Ci0JCXJldHVybiBnZXRQYXJzZXIoKSAhPSBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSUNlbGxFZGl0b3JWYWxpZGF0b3IgZ2V0RWRpdFRleHRWYWxpZGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgSUNlbGxFZGl0b3JWYWxpZGF0b3IoKSB7Ci0KLQkJCXB1YmxpYyBTdHJpbmcgaXNWYWxpZChmaW5hbCBPYmplY3QgdmFsdWUpIHsKLQkJCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpIHsKLQkJCQkJZmluYWwgRU9iamVjdCBlbGVtZW50ID0gZ2V0UGFyc2VyRWxlbWVudCgpOwotCQkJCQlmaW5hbCBJUGFyc2VyIHBhcnNlciA9IGdldFBhcnNlcigpOwotCQkJCQl0cnkgewotCQkJCQkJSVBhcnNlckVkaXRTdGF0dXMgdmFsaWQgPSAoSVBhcnNlckVkaXRTdGF0dXMpIGdldEVkaXRpbmdEb21haW4oKQotCQkJCQkJCQkucnVuRXhjbHVzaXZlKG5ldyBSdW5uYWJsZVdpdGhSZXN1bHQuSW1wbCgpIHsKLQotCQkJCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCQkJCXNldFJlc3VsdChwYXJzZXIuaXNWYWxpZEVkaXRTdHJpbmcoCi0JCQkJCQkJCQkJCQluZXcgRU9iamVjdEFkYXB0ZXIoZWxlbWVudCksCi0JCQkJCQkJCQkJCQkoU3RyaW5nKSB2YWx1ZSkpOwotCQkJCQkJCQkJfQotCQkJCQkJCQl9KTsKLQkJCQkJCXJldHVybiB2YWxpZC5nZXRDb2RlKCkgPT0gUGFyc2VyRWRpdFN0YXR1cy5FRElUQUJMRSA/IG51bGwKLQkJCQkJCQkJOiB2YWxpZC5nZXRNZXNzYWdlKCk7Ci0JCQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGllKSB7Ci0JCQkJCQlpZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQkJfQotCQkJCX0KLQotCQkJCS8vIHNob3VsZG4ndCBnZXQgaGVyZQotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IgZ2V0Q29tcGxldGlvblByb2Nlc3NvcigpIHsKLQkJaWYgKGdldFBhcnNlcigpID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiBnZXRQYXJzZXIoKS5nZXRDb21wbGV0aW9uUHJvY2Vzc29yKAotCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihnZXRQYXJzZXJFbGVtZW50KCkpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFBhcnNlck9wdGlvbnMgZ2V0UGFyc2VyT3B0aW9ucygpIHsKLQkJcmV0dXJuIFBhcnNlck9wdGlvbnMuTk9ORTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElQYXJzZXIgZ2V0UGFyc2VyKCkgewotCQlpZiAocGFyc2VyID09IG51bGwpIHsKLQkJCVN0cmluZyBwYXJzZXJIaW50ID0gKChWaWV3KSBnZXRNb2RlbCgpKS5nZXRUeXBlKCk7Ci0JCQlQYXJzZXJIaW50QWRhcHRlciBoaW50QWRhcHRlciA9IG5ldyBQYXJzZXJIaW50QWRhcHRlcigKLQkJCQkJZ2V0UGFyc2VyRWxlbWVudCgpLCBwYXJzZXJIaW50KSB7Ci0KLQkJCQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgYWRhcHRlcikgewotCQkJCQlpZiAoSUVsZW1lbnRUeXBlLmNsYXNzLmVxdWFscyhhZGFwdGVyKSkgewotCQkJCQkJcmV0dXJuIERpYWdyYW1FbGVtZW50VHlwZXMuTGlua18zMDAxOwotCQkJCQl9Ci0JCQkJCXJldHVybiBzdXBlci5nZXRBZGFwdGVyKGFkYXB0ZXIpOwotCQkJCX0KLQkJCX07Ci0JCQlwYXJzZXIgPSBQYXJzZXJTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0UGFyc2VyKGhpbnRBZGFwdGVyKTsKLQkJfQotCQlyZXR1cm4gcGFyc2VyOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRGlyZWN0RWRpdE1hbmFnZXIgZ2V0TWFuYWdlcigpIHsKLQkJaWYgKG1hbmFnZXIgPT0gbnVsbCkgewotCQkJc2V0TWFuYWdlcihuZXcgVGV4dERpcmVjdEVkaXRNYW5hZ2VyKHRoaXMsIFRleHREaXJlY3RFZGl0TWFuYWdlcgotCQkJCQkuZ2V0VGV4dENlbGxFZGl0b3JDbGFzcyh0aGlzKSwgRGlhZ3JhbUVkaXRQYXJ0RmFjdG9yeQotCQkJCQkuZ2V0VGV4dENlbGxFZGl0b3JMb2NhdG9yKHRoaXMpKSk7Ci0JCX0KLQkJcmV0dXJuIG1hbmFnZXI7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldE1hbmFnZXIoRGlyZWN0RWRpdE1hbmFnZXIgbWFuYWdlcikgewotCQl0aGlzLm1hbmFnZXIgPSBtYW5hZ2VyOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdCgpIHsKLQkJZ2V0TWFuYWdlcigpLnNob3coKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURpcmVjdEVkaXQoUG9pbnQgZXZlbnRMb2NhdGlvbikgewotCQlpZiAoZ2V0TWFuYWdlcigpLmdldENsYXNzKCkgPT0gVGV4dERpcmVjdEVkaXRNYW5hZ2VyLmNsYXNzKSB7Ci0JCQkoKFRleHREaXJlY3RFZGl0TWFuYWdlcikgZ2V0TWFuYWdlcigpKS5zaG93KGV2ZW50TG9jYXRpb24KLQkJCQkJLmdldFNXVFBvaW50KCkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdChjaGFyIGluaXRpYWxDaGFyYWN0ZXIpIHsKLQkJaWYgKGdldE1hbmFnZXIoKSBpbnN0YW5jZW9mIFRleHREaXJlY3RFZGl0TWFuYWdlcikgewotCQkJKChUZXh0RGlyZWN0RWRpdE1hbmFnZXIpIGdldE1hbmFnZXIoKSkuc2hvdyhpbml0aWFsQ2hhcmFjdGVyKTsKLQkJfSBlbHNlIHsKLQkJCXBlcmZvcm1EaXJlY3RFZGl0KCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURpcmVjdEVkaXRSZXF1ZXN0KFJlcXVlc3QgcmVxdWVzdCkgewotCQlmaW5hbCBSZXF1ZXN0IHRoZVJlcXVlc3QgPSByZXF1ZXN0OwotCQl0cnkgewotCQkJZ2V0RWRpdGluZ0RvbWFpbigpLnJ1bkV4Y2x1c2l2ZShuZXcgUnVubmFibGUoKSB7Ci0KLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCWlmIChpc0FjdGl2ZSgpICYmIGlzRWRpdGFibGUoKSkgewotCQkJCQkJaWYgKHRoZVJlcXVlc3QKLQkJCQkJCQkJLmdldEV4dGVuZGVkRGF0YSgpCi0JCQkJCQkJCS5nZXQoCi0JCQkJCQkJCQkJUmVxdWVzdENvbnN0YW50cy5SRVFfRElSRUNURURJVF9FWFRFTkRFRERBVEFfSU5JVElBTF9DSEFSKSBpbnN0YW5jZW9mIENoYXJhY3RlcikgewotCQkJCQkJCUNoYXJhY3RlciBpbml0aWFsQ2hhciA9IChDaGFyYWN0ZXIpIHRoZVJlcXVlc3QKLQkJCQkJCQkJCS5nZXRFeHRlbmRlZERhdGEoKQotCQkJCQkJCQkJLmdldCgKLQkJCQkJCQkJCQkJUmVxdWVzdENvbnN0YW50cy5SRVFfRElSRUNURURJVF9FWFRFTkRFRERBVEFfSU5JVElBTF9DSEFSKTsKLQkJCQkJCQlwZXJmb3JtRGlyZWN0RWRpdChpbml0aWFsQ2hhci5jaGFyVmFsdWUoKSk7Ci0JCQkJCQl9IGVsc2UgaWYgKCh0aGVSZXF1ZXN0IGluc3RhbmNlb2YgRGlyZWN0RWRpdFJlcXVlc3QpCi0JCQkJCQkJCSYmIChnZXRFZGl0VGV4dCgpLmVxdWFscyhnZXRMYWJlbFRleHQoKSkpKSB7Ci0JCQkJCQkJRGlyZWN0RWRpdFJlcXVlc3QgZWRpdFJlcXVlc3QgPSAoRGlyZWN0RWRpdFJlcXVlc3QpIHRoZVJlcXVlc3Q7Ci0JCQkJCQkJcGVyZm9ybURpcmVjdEVkaXQoZWRpdFJlcXVlc3QuZ2V0TG9jYXRpb24oKSk7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCXBlcmZvcm1EaXJlY3RFZGl0KCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9KTsKLQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoVmlzdWFscygpIHsKLQkJc3VwZXIucmVmcmVzaFZpc3VhbHMoKTsKLQkJcmVmcmVzaExhYmVsKCk7Ci0JCXJlZnJlc2hGb250KCk7Ci0JCXJlZnJlc2hGb250Q29sb3IoKTsKLQkJcmVmcmVzaFVuZGVybGluZSgpOwotCQlyZWZyZXNoU3RyaWtlVGhyb3VnaCgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoTGFiZWwoKSB7Ci0JCXNldExhYmVsVGV4dEhlbHBlcihnZXRGaWd1cmUoKSwgZ2V0TGFiZWxUZXh0KCkpOwotCQlzZXRMYWJlbEljb25IZWxwZXIoZ2V0RmlndXJlKCksIGdldExhYmVsSWNvbigpKTsKLQkJT2JqZWN0IHBkRWRpdFBvbGljeSA9IGdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSk7Ci0JCWlmIChwZEVkaXRQb2xpY3kgaW5zdGFuY2VvZiBEaWFncmFtVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHsKLQkJCSgoRGlhZ3JhbVRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSBwZEVkaXRQb2xpY3kpLnJlZnJlc2hGZWVkYmFjaygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hVbmRlcmxpbmUoKSB7Ci0JCUZvbnRTdHlsZSBzdHlsZSA9IChGb250U3R5bGUpIGdldEZvbnRTdHlsZU93bmVyVmlldygpLmdldFN0eWxlKAotCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlKCkpOwotCQlpZiAoc3R5bGUgIT0gbnVsbCAmJiBnZXRGaWd1cmUoKSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJKChXcmFwTGFiZWwpIGdldEZpZ3VyZSgpKS5zZXRUZXh0VW5kZXJsaW5lKHN0eWxlLmlzVW5kZXJsaW5lKCkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hTdHJpa2VUaHJvdWdoKCkgewotCQlGb250U3R5bGUgc3R5bGUgPSAoRm9udFN0eWxlKSBnZXRGb250U3R5bGVPd25lclZpZXcoKS5nZXRTdHlsZSgKLQkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZSgpKTsKLQkJaWYgKHN0eWxlICE9IG51bGwgJiYgZ2V0RmlndXJlKCkgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCSgoV3JhcExhYmVsKSBnZXRGaWd1cmUoKSkuc2V0VGV4dFN0cmlrZVRocm91Z2goc3R5bGUKLQkJCQkJLmlzU3RyaWtlVGhyb3VnaCgpKTsKLQkJfQotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hGb250KCkgewotCQlGb250U3R5bGUgc3R5bGUgPSAoRm9udFN0eWxlKSBnZXRGb250U3R5bGVPd25lclZpZXcoKS5nZXRTdHlsZSgKLQkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZSgpKTsKLQkJaWYgKHN0eWxlICE9IG51bGwpIHsKLQkJCVN0cmluZyBmb250TmFtZSA9IERpYWdyYW1Db25zdGFudHMuZ2V0Rm9udE5hbWUoc3R5bGUpOwotCQkJRm9udERhdGEgZm9udERhdGEgPSBuZXcgRm9udERhdGEoZm9udE5hbWUsIHN0eWxlCi0JCQkJCS5nZXRGb250SGVpZ2h0KCksIChzdHlsZS5pc0JvbGQoKSA/IFNXVC5CT0xEIDogU1dULk5PUk1BTCkKLQkJCQkJfCAoc3R5bGUuaXNJdGFsaWMoKSA/IFNXVC5JVEFMSUMgOiBTV1QuTk9STUFMKSk7Ci0JCQlzZXRGb250KGZvbnREYXRhKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRGb250Q29sb3IoQ29sb3IgY29sb3IpIHsKLQkJZ2V0RmlndXJlKCkuc2V0Rm9yZWdyb3VuZENvbG9yKGNvbG9yKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkU2VtYW50aWNMaXN0ZW5lcnMoKSB7Ci0JCWlmIChnZXRQYXJzZXIoKSBpbnN0YW5jZW9mIElTZW1hbnRpY1BhcnNlcikgewotCQkJRU9iamVjdCBlbGVtZW50ID0gcmVzb2x2ZVNlbWFudGljRWxlbWVudCgpOwotCQkJcGFyc2VyRWxlbWVudHMgPSAoKElTZW1hbnRpY1BhcnNlcikgZ2V0UGFyc2VyKCkpCi0JCQkJCS5nZXRTZW1hbnRpY0VsZW1lbnRzQmVpbmdQYXJzZWQoZWxlbWVudCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcnNlckVsZW1lbnRzLnNpemUoKTsgaSsrKSB7Ci0JCQkJYWRkTGlzdGVuZXJGaWx0ZXIoCi0JCQkJCQkiU2VtYW50aWNNb2RlbCIgKyBpLCB0aGlzLCAoRU9iamVjdCkgcGFyc2VyRWxlbWVudHMuZ2V0KGkpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9IGVsc2UgewotCQkJc3VwZXIuYWRkU2VtYW50aWNMaXN0ZW5lcnMoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVTZW1hbnRpY0xpc3RlbmVycygpIHsKLQkJaWYgKHBhcnNlckVsZW1lbnRzICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGFyc2VyRWxlbWVudHMuc2l6ZSgpOyBpKyspIHsKLQkJCQlyZW1vdmVMaXN0ZW5lckZpbHRlcigiU2VtYW50aWNNb2RlbCIgKyBpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9IGVsc2UgewotCQkJc3VwZXIucmVtb3ZlU2VtYW50aWNMaXN0ZW5lcnMoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQWNjZXNzaWJsZUVkaXRQYXJ0IGdldEFjY2Vzc2libGVFZGl0UGFydCgpIHsKLQkJaWYgKGFjY2Vzc2libGVFUCA9PSBudWxsKSB7Ci0JCQlhY2Nlc3NpYmxlRVAgPSBuZXcgQWNjZXNzaWJsZUdyYXBoaWNhbEVkaXRQYXJ0KCkgewotCi0JCQkJcHVibGljIHZvaWQgZ2V0TmFtZShBY2Nlc3NpYmxlRXZlbnQgZSkgewotCQkJCQllLnJlc3VsdCA9IGdldExhYmVsVGV4dEhlbHBlcihnZXRGaWd1cmUoKSk7Ci0JCQkJfQotCQkJfTsKLQkJfQotCQlyZXR1cm4gYWNjZXNzaWJsZUVQOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIFZpZXcgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkgewotCQlyZXR1cm4gZ2V0UHJpbWFyeVZpZXcoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlTm90aWZpY2F0aW9uRXZlbnQoTm90aWZpY2F0aW9uIGV2ZW50KSB7Ci0JCU9iamVjdCBmZWF0dXJlID0gZXZlbnQuZ2V0RmVhdHVyZSgpOwotCQlpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfRm9udENvbG9yKCkuZXF1YWxzKGZlYXR1cmUpKSB7Ci0JCQlJbnRlZ2VyIGMgPSAoSW50ZWdlcikgZXZlbnQuZ2V0TmV3VmFsdWUoKTsKLQkJCXNldEZvbnRDb2xvcihEaWFncmFtQ29sb3JSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldENvbG9yKGMpKTsKLQkJfSBlbHNlIGlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9VbmRlcmxpbmUoKS5lcXVhbHMoCi0JCQkJZmVhdHVyZSkpIHsKLQkJCXJlZnJlc2hVbmRlcmxpbmUoKTsKLQkJfSBlbHNlIGlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9TdHJpa2VUaHJvdWdoKCkKLQkJCQkuZXF1YWxzKGZlYXR1cmUpKSB7Ci0JCQlyZWZyZXNoU3RyaWtlVGhyb3VnaCgpOwotCQl9IGVsc2UgaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0ZvbnRIZWlnaHQoKS5lcXVhbHMoCi0JCQkJZmVhdHVyZSkKLQkJCQl8fCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Gb250TmFtZSgpLmVxdWFscygKLQkJCQkJCWZlYXR1cmUpCi0JCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfQm9sZCgpCi0JCQkJCQkuZXF1YWxzKGZlYXR1cmUpCi0JCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfSXRhbGljKCkuZXF1YWxzKAotCQkJCQkJZmVhdHVyZSkpIHsKLQkJCXJlZnJlc2hGb250KCk7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoZ2V0UGFyc2VyKCkgIT0gbnVsbAotCQkJCQkmJiBnZXRQYXJzZXIoKS5pc0FmZmVjdGluZ0V2ZW50KGV2ZW50LAotCQkJCQkJCWdldFBhcnNlck9wdGlvbnMoKS5pbnRWYWx1ZSgpKSkgewotCQkJCXJlZnJlc2hMYWJlbCgpOwotCQkJfQotCQkJaWYgKGdldFBhcnNlcigpIGluc3RhbmNlb2YgSVNlbWFudGljUGFyc2VyKSB7Ci0JCQkJSVNlbWFudGljUGFyc2VyIG1vZGVsUGFyc2VyID0gKElTZW1hbnRpY1BhcnNlcikgZ2V0UGFyc2VyKCk7Ci0JCQkJaWYgKG1vZGVsUGFyc2VyLmFyZVNlbWFudGljRWxlbWVudHNBZmZlY3RlZChudWxsLCBldmVudCkpIHsKLQkJCQkJcmVtb3ZlU2VtYW50aWNMaXN0ZW5lcnMoKTsKLQkJCQkJaWYgKHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKSAhPSBudWxsKSB7Ci0JCQkJCQlhZGRTZW1hbnRpY0xpc3RlbmVycygpOwotCQkJCQl9Ci0JCQkJCXJlZnJlc2hMYWJlbCgpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlzdXBlci5oYW5kbGVOb3RpZmljYXRpb25FdmVudChldmVudCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZUZpZ3VyZSgpIHsKLQkJSUZpZ3VyZSBsYWJlbCA9IGNyZWF0ZUZpZ3VyZVByaW0oKTsKLQkJZGVmYXVsdFRleHQgPSBnZXRMYWJlbFRleHRIZWxwZXIobGFiZWwpOwotCQlyZXR1cm4gbGFiZWw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZUZpZ3VyZVByaW0oKSB7Ci0JCXJldHVybiBuZXcgTGlua05hbWVGaWd1cmUoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGNsYXNzIExpbmtOYW1lRmlndXJlIGV4dGVuZHMgV3JhcExhYmVsIHsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIExpbmtOYW1lRmlndXJlKCkgewotCi0JCQl0aGlzLnNldFRleHQoIiIpOwkvLyROT04tTkxTLTEkCi0JCQljcmVhdGVDb250ZW50cygpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgdm9pZCBjcmVhdGVDb250ZW50cygpIHsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIGJvb2xlYW4gbXlVc2VMb2NhbENvb3JkaW5hdGVzID0gZmFsc2U7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByb3RlY3RlZCBib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMoKSB7Ci0JCQlyZXR1cm4gbXlVc2VMb2NhbENvb3JkaW5hdGVzOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByb3RlY3RlZCB2b2lkIHNldFVzZUxvY2FsQ29vcmRpbmF0ZXMoYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKSB7Ci0JCQlteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSB1c2VMb2NhbENvb3JkaW5hdGVzOwotCQl9Ci0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvZWRpdC9wYXJ0cy9Xb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtRWRpdFBhcnQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvZWRpdC9wYXJ0cy9Xb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtRWRpdFBhcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjVkZjA0OC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL2VkaXQvcGFydHMvV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbUVkaXRQYXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLmVkaXQucGFydHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5FZGl0UG9saWN5Um9sZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob3RhdGlvblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5wYXJ0LnV0aWwuRGlhZ3JhbUVkaXRvclV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5lZGl0LnBvbGljaWVzLldvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW1DYW5vbmljYWxFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQuZWRpdC5wb2xpY2llcy5Xb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtSXRlbVNlbWFudGljRWRpdFBvbGljeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLkRpYWdyYW1FZGl0UGFydDsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBXb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtRWRpdFBhcnQgZXh0ZW5kcyBEaWFncmFtRWRpdFBhcnQgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1PREVMX0lEID0gIldQREQiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVklTVUFMX0lEID0gNzk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFdvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW1FZGl0UGFydChWaWV3IHZpZXcpIHsKLQkJc3VwZXIodmlldyk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKSB7Ci0JCXN1cGVyLmNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKTsKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLlNFTUFOVElDX1JPTEUsCi0JCQkJbmV3IFdvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW1JdGVtU2VtYW50aWNFZGl0UG9saWN5KCkpOwotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuQ0FOT05JQ0FMX1JPTEUsCi0JCQkJbmV3IFdvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW1DYW5vbmljYWxFZGl0UG9saWN5KCkpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGhhbmRsZU5vdGlmaWNhdGlvbkV2ZW50KE5vdGlmaWNhdGlvbiBldmVudCkgewotCQlpZiAoTm90YXRpb25QYWNrYWdlLkxpdGVyYWxzLlZJRVdfX1ZJU0lCTEUuZXF1YWxzKGV2ZW50LmdldEZlYXR1cmUoKSkpIHsKLQkJCU9iamVjdCBub3RpZmllciA9IGV2ZW50LmdldE5vdGlmaWVyKCk7Ci0JCQlpZiAobm90aWZpZXIgPT0gZ2V0TW9kZWwoKSkKLQkJCQlyZWZyZXNoVmlzaWJpbGl0eSgpOwotCQkJZWxzZSBpZiAoZXZlbnQuZ2V0Tm90aWZpZXIoKSBpbnN0YW5jZW9mIE5vZGUpIHsKLQkJCQlyZWZyZXNoQ2hpbGRyZW4oKTsKLQkJCQlEaWFncmFtRWRpdG9yVXRpbC5yZWZyZXNoQ29ubmVjdGlvbkVkaXRQYXJ0cyh0aGlzKTsKLQkJCX0KLQkJfSBlbHNlCi0JCQlzdXBlci5oYW5kbGVOb3RpZmljYXRpb25FdmVudChldmVudCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGFjdGl2YXRlKCkgewotCQlzdXBlci5hY3RpdmF0ZSgpOwotCQlPYmplY3QgbW9kZWwgPSBnZXRNb2RlbCgpOwotCQlpZiAobW9kZWwgaW5zdGFuY2VvZiBWaWV3KSB7Ci0JCQlFT2JqZWN0IGUgPSAoKFZpZXcpIG1vZGVsKS5nZXRFbGVtZW50KCk7Ci0JCQlpZiAoZSBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGUpIHsKLQkJCQkoKG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGUpIGUpLmFkZENvbnN1bWVyKHRoaXMpOwotCQkJfQotCQl9Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGRlYWN0aXZhdGUoKSB7Ci0JCXN1cGVyLmRlYWN0aXZhdGUoKTsKLQkJT2JqZWN0IG1vZGVsID0gZ2V0TW9kZWwoKTsKLQkJaWYgKG1vZGVsIGluc3RhbmNlb2YgVmlldykgewotCQkJRU9iamVjdCBlID0gKChWaWV3KSBtb2RlbCkuZ2V0RWxlbWVudCgpOwotCQkJaWYgKGUgaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlKSB7Ci0JCQkJKChvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlKSBlKS5yZW1vdmVDb25zdW1lcih0aGlzKTsKLQkJCX0KLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9lZGl0L3BhcnRzL1dvcmtQcm9kdWN0Tm9kZUVkaXRQYXJ0LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL2VkaXQvcGFydHMvV29ya1Byb2R1Y3ROb2RlRWRpdFBhcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGVjODA5Yy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL2VkaXQvcGFydHMvV29ya1Byb2R1Y3ROb2RlRWRpdFBhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxOSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLmVkaXQucGFydHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5TdGFja0xheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLkRpYWdyYW1Db3JlUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUudXRpbC5EaWFncmFtQ29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5lZGl0LnBvbGljaWVzLldvcmtQcm9kdWN0Tm9kZUNhbm9uaWNhbEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5lZGl0LnBvbGljaWVzLldvcmtQcm9kdWN0Tm9kZUdyYXBoaWNhbE5vZGVFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQuZWRpdC5wb2xpY2llcy5Xb3JrUHJvZHVjdE5vZGVJdGVtU2VtYW50aWNFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQucGFydC5EaWFncmFtVmlzdWFsSURSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5MYXlvdXRFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuTm9uUmVzaXphYmxlRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuQ3JlYXRlUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JR3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuU2hhcGVOb2RlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuRWRpdFBvbGljeVJvbGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLkNvbnN0cmFpbmVkVG9vbGJhckxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZ2VmLnVpLmZpZ3VyZXMuRGVmYXVsdFNpemVOb2RlRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmdlZi51aS5maWd1cmVzLk5vZGVGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBXb3JrUHJvZHVjdE5vZGVFZGl0UGFydCBleHRlbmRzIFNoYXBlTm9kZUVkaXRQYXJ0IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWSVNVQUxfSUQgPSAxMDAxOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJRmlndXJlIGNvbnRlbnRQYW5lOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJRmlndXJlIHByaW1hcnlTaGFwZTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgV29ya1Byb2R1Y3ROb2RlRWRpdFBhcnQoVmlldyB2aWV3KSB7Ci0JCXN1cGVyKHZpZXcpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCkgewotCi0JCXN1cGVyLmNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKTsKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLlNFTUFOVElDX1JPTEUsCi0JCQkJbmV3IFdvcmtQcm9kdWN0Tm9kZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3koKSk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuTEFZT1VUX1JPTEUsIGNyZWF0ZUxheW91dEVkaXRQb2xpY3koKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBMYXlvdXRFZGl0UG9saWN5IGNyZWF0ZUxheW91dEVkaXRQb2xpY3koKSB7Ci0JCUxheW91dEVkaXRQb2xpY3kgbGVwID0gbmV3IExheW91dEVkaXRQb2xpY3koKSB7Ci0KLQkJCXByb3RlY3RlZCBFZGl0UG9saWN5IGNyZWF0ZUNoaWxkRWRpdFBvbGljeShFZGl0UGFydCBjaGlsZCkgewotCQkJCUVkaXRQb2xpY3kgcmVzdWx0ID0gY2hpbGQKLQkJCQkJCS5nZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgewotCQkJCQlyZXN1bHQgPSBuZXcgTm9uUmVzaXphYmxlRWRpdFBvbGljeSgpOwotCQkJCX0KLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCi0JCQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRNb3ZlQ2hpbGRyZW5Db21tYW5kKFJlcXVlc3QgcmVxdWVzdCkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCi0JCQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVDb21tYW5kKENyZWF0ZVJlcXVlc3QgcmVxdWVzdCkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9OwotCQlyZXR1cm4gbGVwOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVOb2RlU2hhcGUoKSB7Ci0JCVdvcmtQcm9kdWN0Tm9kZUZpZ3VyZSBmaWd1cmUgPSBuZXcgV29ya1Byb2R1Y3ROb2RlRmlndXJlKCk7Ci0JCXJldHVybiBwcmltYXJ5U2hhcGUgPSBmaWd1cmU7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBXb3JrUHJvZHVjdE5vZGVGaWd1cmUgZ2V0UHJpbWFyeVNoYXBlKCkgewotCQlyZXR1cm4gKFdvcmtQcm9kdWN0Tm9kZUZpZ3VyZSkgcHJpbWFyeVNoYXBlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBhZGRGaXhlZENoaWxkKEVkaXRQYXJ0IGNoaWxkRWRpdFBhcnQpIHsKLQkJaWYgKGNoaWxkRWRpdFBhcnQgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdE5vZGVOYW1lRWRpdFBhcnQpIHsKLQkJCSgoV29ya1Byb2R1Y3ROb2RlTmFtZUVkaXRQYXJ0KSBjaGlsZEVkaXRQYXJ0KQotCQkJCQkuc2V0TGFiZWwoZ2V0UHJpbWFyeVNoYXBlKCkuZ2V0RmlndXJlTmFtZWROb2RlTmFtZUZpZ3VyZSgpKTsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gcmVtb3ZlRml4ZWRDaGlsZChFZGl0UGFydCBjaGlsZEVkaXRQYXJ0KSB7Ci0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTm9kZUZpZ3VyZSBjcmVhdGVOb2RlUGxhdGUoKSB7Ci0JCURlZmF1bHRTaXplTm9kZUZpZ3VyZSByZXN1bHQgPSBuZXcgRGVmYXVsdFNpemVOb2RlRmlndXJlKGdldE1hcE1vZGUoKQotCQkJCS5EUHRvTFAoNDApLCBnZXRNYXBNb2RlKCkuRFB0b0xQKDQwKSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBmaWd1cmUgZm9yIHRoaXMgZWRpdCBwYXJ0LgotCSAqIAotCSAqIEJvZHkgb2YgdGhpcyBtZXRob2QgZG9lcyBub3QgZGVwZW5kIG9uIHNldHRpbmdzIGluIGdlbmVyYXRpb24gbW9kZWwKLQkgKiBzbyB5b3UgbWF5IHNhZmVseSByZW1vdmUgPGk+Z2VuZXJhdGVkPC9pPiB0YWcgYW5kIG1vZGlmeSBpdC4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE5vZGVGaWd1cmUgY3JlYXRlTm9kZUZpZ3VyZSgpIHsKLQkJTm9kZUZpZ3VyZSBmaWd1cmUgPSBjcmVhdGVOb2RlUGxhdGUoKTsKLQkJZmlndXJlLnNldExheW91dE1hbmFnZXIobmV3IFN0YWNrTGF5b3V0KCkpOwotCQlJRmlndXJlIHNoYXBlID0gY3JlYXRlTm9kZVNoYXBlKCk7Ci0JCWZpZ3VyZS5hZGQoc2hhcGUpOwotCQljb250ZW50UGFuZSA9IHNldHVwQ29udGVudFBhbmUoc2hhcGUpOwotCQlyZXR1cm4gZmlndXJlOwotCX0KLQotCS8qKgotCSAqIERlZmF1bHQgaW1wbGVtZW50YXRpb24gdHJlYXRzIHBhc3NlZCBmaWd1cmUgYXMgY29udGVudCBwYW5lLgotCSAqIFJlc3BlY3RzIGxheW91dCBvbmUgbWF5IGhhdmUgc2V0IGZvciBnZW5lcmF0ZWQgZmlndXJlLgotCSAqIEBwYXJhbSBub2RlU2hhcGUgaW5zdGFuY2Ugb2YgZ2VuZXJhdGVkIGZpZ3VyZSBjbGFzcwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBzZXR1cENvbnRlbnRQYW5lKElGaWd1cmUgbm9kZVNoYXBlKSB7Ci0JCWlmIChub2RlU2hhcGUuZ2V0TGF5b3V0TWFuYWdlcigpID09IG51bGwpIHsKLQkJCUNvbnN0cmFpbmVkVG9vbGJhckxheW91dCBsYXlvdXQgPSBuZXcgQ29uc3RyYWluZWRUb29sYmFyTGF5b3V0KCk7Ci0JCQlsYXlvdXQuc2V0U3BhY2luZyhnZXRNYXBNb2RlKCkuRFB0b0xQKDUpKTsKLQkJCW5vZGVTaGFwZS5zZXRMYXlvdXRNYW5hZ2VyKGxheW91dCk7Ci0JCX0KLQkJcmV0dXJuIG5vZGVTaGFwZTsgLy8gdXNlIG5vZGVTaGFwZSBpdHNlbGYgYXMgY29udGVudFBhbmUKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElGaWd1cmUgZ2V0Q29udGVudFBhbmUoKSB7Ci0JCWlmIChjb250ZW50UGFuZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gY29udGVudFBhbmU7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldENvbnRlbnRQYW5lKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFZGl0UGFydCBnZXRQcmltYXJ5Q2hpbGRFZGl0UGFydCgpIHsKLQkJcmV0dXJuIGdldENoaWxkQnlTZW1hbnRpY0hpbnQoRGlhZ3JhbVZpc3VhbElEUmVnaXN0cnkKLQkJCQkuZ2V0VHlwZShXb3JrUHJvZHVjdE5vZGVOYW1lRWRpdFBhcnQuVklTVUFMX0lEKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZENoaWxkVmlzdWFsKEVkaXRQYXJ0IGNoaWxkRWRpdFBhcnQsIGludCBpbmRleCkgewotCQlpZiAoYWRkRml4ZWRDaGlsZChjaGlsZEVkaXRQYXJ0KSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmFkZENoaWxkVmlzdWFsKGNoaWxkRWRpdFBhcnQsIC0xKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlQ2hpbGRWaXN1YWwoRWRpdFBhcnQgY2hpbGRFZGl0UGFydCkgewotCQlpZiAocmVtb3ZlRml4ZWRDaGlsZChjaGlsZEVkaXRQYXJ0KSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLnJlbW92ZUNoaWxkVmlzdWFsKGNoaWxkRWRpdFBhcnQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBnZXRDb250ZW50UGFuZUZvcihJR3JhcGhpY2FsRWRpdFBhcnQgZWRpdFBhcnQpIHsKLQotCQlyZXR1cm4gc3VwZXIuZ2V0Q29udGVudFBhbmVGb3IoZWRpdFBhcnQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgY2xhc3MgV29ya1Byb2R1Y3ROb2RlRmlndXJlIGV4dGVuZHMgUmVjdGFuZ2xlRmlndXJlIHsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIFdvcmtQcm9kdWN0Tm9kZUZpZ3VyZSgpIHsKLQotCQkJdGhpcy5zZXRPdXRsaW5lKGZhbHNlKTsKLQkJCWNyZWF0ZUNvbnRlbnRzKCk7Ci0JCX0KLQotCQkvKioKLQkJICogQG1vZGlmaWVkCi0JCSAqIAotCQkgKi8KLQkJcHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbnRlbnRzKCkgewotCQkJb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIGZpZ18wID0gbmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCgpOwotCQkJZmlnXzAuc2V0VGV4dChEaWFncmFtQ29yZVJlc291cmNlcy5XUEREX05ld19Xb3JrUHJvZHVjdERlc2NyaXB0b3IpOwotCi0JCQlEaWFncmFtQ29yZVV0aWwuc2V0TGFiZWxQcm9wZXJ0aWVzKGZpZ18wKTsKLQkJCXNldEZpZ3VyZU5hbWVkTm9kZU5hbWVGaWd1cmUoZmlnXzApOwotCi0JCQlPYmplY3QgbGF5RGF0YTAgPSBudWxsOwotCi0JCQl0aGlzLmFkZChmaWdfMCwgbGF5RGF0YTApOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgV3JhcExhYmVsIGZOYW1lZE5vZGVOYW1lRmlndXJlOwotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgV3JhcExhYmVsIGdldEZpZ3VyZU5hbWVkTm9kZU5hbWVGaWd1cmUoKSB7Ci0JCQlyZXR1cm4gZk5hbWVkTm9kZU5hbWVGaWd1cmU7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSB2b2lkIHNldEZpZ3VyZU5hbWVkTm9kZU5hbWVGaWd1cmUoV3JhcExhYmVsIGZpZykgewotCQkJZk5hbWVkTm9kZU5hbWVGaWd1cmUgPSBmaWc7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSBib29sZWFuIG15VXNlTG9jYWxDb29yZGluYXRlcyA9IGZhbHNlOwotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcm90ZWN0ZWQgYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKCkgewotCQkJcmV0dXJuIG15VXNlTG9jYWxDb29yZGluYXRlczsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcm90ZWN0ZWQgdm9pZCBzZXRVc2VMb2NhbENvb3JkaW5hdGVzKGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcykgewotCQkJbXlVc2VMb2NhbENvb3JkaW5hdGVzID0gdXNlTG9jYWxDb29yZGluYXRlczsKLQkJfQotCi0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgYWN0aXZhdGUoKSB7Ci0JCXN1cGVyLmFjdGl2YXRlKCk7Ci0JCU9iamVjdCBtb2RlbCA9IGdldE1vZGVsKCk7Ci0JCWlmIChtb2RlbCBpbnN0YW5jZW9mIFZpZXcpIHsKLQkJCUVPYmplY3QgZSA9ICgoVmlldykgbW9kZWwpLmdldEVsZW1lbnQoKTsKLQkJCWlmIChlIGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZSkgewotCQkJCSgob3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZSkgZSkuYWRkQ29uc3VtZXIodGhpcyk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZGVhY3RpdmF0ZSgpIHsKLQkJc3VwZXIuZGVhY3RpdmF0ZSgpOwotCQlPYmplY3QgbW9kZWwgPSBnZXRNb2RlbCgpOwotCQlpZiAobW9kZWwgaW5zdGFuY2VvZiBWaWV3KSB7Ci0JCQlFT2JqZWN0IGUgPSAoKFZpZXcpIG1vZGVsKS5nZXRFbGVtZW50KCk7Ci0JCQlpZiAoZSBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGUpIHsKLQkJCQkoKG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGUpIGUpLnJlbW92ZUNvbnN1bWVyKHRoaXMpOwotCQkJfQotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL2VkaXQvcGFydHMvV29ya1Byb2R1Y3ROb2RlTmFtZUVkaXRQYXJ0LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL2VkaXQvcGFydHMvV29ya1Byb2R1Y3ROb2RlTmFtZUVkaXRQYXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0NTM4YzYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9lZGl0L3BhcnRzL1dvcmtQcm9kdWN0Tm9kZU5hbWVFZGl0UGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQ3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQuZWRpdC5wYXJ0czsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlJ1bm5hYmxlV2l0aFJlc3VsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnByb3ZpZGVycy5EaWFncmFtSWNvblByb3ZpZGVyTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnV0aWwuRGlhZ3JhbUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnV0aWwuRGlhZ3JhbUNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUudXRpbC5WYWxpZGF0aW5nVGV4dERpcmVjdEVkaXRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLldvcmtQcm9kdWN0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLmVkaXQucG9saWNpZXMuRGlhZ3JhbVRleHRTZWxlY3Rpb25FZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQucGFydC5XUEREaWFncmFtRWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQucHJvdmlkZXJzLkRpYWdyYW1FbGVtZW50VHlwZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlN1cHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5BY2Nlc3NpYmxlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuTm9uUmVzaXphYmxlRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuaGFuZGxlcy5Ob25SZXNpemFibGVIYW5kbGVLaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLkRpcmVjdEVkaXRSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi50b29scy5EaXJlY3RFZGl0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLklQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5JUGFyc2VyRWRpdFN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLlBhcnNlckVkaXRTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5QYXJzZXJPcHRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuUGFyc2VyU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5Db21wYXJ0bWVudEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklHcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JVGV4dEF3YXJlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuTGFiZWxEaXJlY3RFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkubDEwbi5EaWFncmFtQ29sb3JSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlcXVlc3RzLlJlcXVlc3RDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS50b29scy5UZXh0RGlyZWN0RWRpdE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb3JlLnV0aWwuRU9iamVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5JRWxlbWVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnVpLnNlcnZpY2VzLnBhcnNlci5JU2VtYW50aWNQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnVpLnNlcnZpY2VzLnBhcnNlci5QYXJzZXJIaW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Gb250U3R5bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob3RhdGlvblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ2VsbEVkaXRvclZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2libGVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBXb3JrUHJvZHVjdE5vZGVOYW1lRWRpdFBhcnQgZXh0ZW5kcyBDb21wYXJ0bWVudEVkaXRQYXJ0IGltcGxlbWVudHMKLQkJSVRleHRBd2FyZUVkaXRQYXJ0IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWSVNVQUxfSUQgPSA0MDAxOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRGlyZWN0RWRpdE1hbmFnZXIgbWFuYWdlcjsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIElQYXJzZXIgcGFyc2VyOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgTGlzdCBwYXJzZXJFbGVtZW50czsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBkZWZhdWx0VGV4dDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgV29ya1Byb2R1Y3ROb2RlTmFtZUVkaXRQYXJ0KFZpZXcgdmlldykgewotCQlzdXBlcih2aWV3KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpIHsKLQkJc3VwZXIuY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpOwotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LkRJUkVDVF9FRElUX1JPTEUsCi0JCQkJbmV3IExhYmVsRGlyZWN0RWRpdFBvbGljeSgpKTsKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSwKLQkJCQluZXcgTm9uUmVzaXphYmxlRWRpdFBvbGljeSgpIHsKLQotCQkJCQlwcm90ZWN0ZWQgTGlzdCBjcmVhdGVTZWxlY3Rpb25IYW5kbGVzKCkgewotCQkJCQkJTGlzdCBoYW5kbGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQkJTm9uUmVzaXphYmxlSGFuZGxlS2l0LmFkZE1vdmVIYW5kbGUoCi0JCQkJCQkJCShHcmFwaGljYWxFZGl0UGFydCkgZ2V0SG9zdCgpLCBoYW5kbGVzKTsKLQkJCQkJCXJldHVybiBoYW5kbGVzOwotCQkJCQl9Ci0KLQkJCQkJcHVibGljIENvbW1hbmQgZ2V0Q29tbWFuZChSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJCQkJCXJldHVybiBudWxsOwotCQkJCQl9Ci0KLQkJCQkJcHVibGljIGJvb2xlYW4gdW5kZXJzdGFuZHNSZXF1ZXN0KFJlcXVlc3QgcmVxdWVzdCkgewotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQl9Ci0JCQkJfSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TGFiZWxUZXh0SGVscGVyKElGaWd1cmUgZmlndXJlKSB7Ci0JCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCXJldHVybiAoKFdyYXBMYWJlbCkgZmlndXJlKS5nZXRUZXh0KCk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gKChMYWJlbCkgZmlndXJlKS5nZXRUZXh0KCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0TGFiZWxUZXh0SGVscGVyKElGaWd1cmUgZmlndXJlLCBTdHJpbmcgdGV4dCkgewotCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQkoKFdyYXBMYWJlbCkgZmlndXJlKS5zZXRUZXh0KHRleHQpOwotCQl9IGVsc2UgewotCQkJKChMYWJlbCkgZmlndXJlKS5zZXRUZXh0KHRleHQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJbWFnZSBnZXRMYWJlbEljb25IZWxwZXIoSUZpZ3VyZSBmaWd1cmUpIHsKLQkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJcmV0dXJuICgoV3JhcExhYmVsKSBmaWd1cmUpLmdldEljb24oKTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiAoKExhYmVsKSBmaWd1cmUpLmdldEljb24oKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRMYWJlbEljb25IZWxwZXIoSUZpZ3VyZSBmaWd1cmUsIEltYWdlIGljb24pIHsKLQkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJKChXcmFwTGFiZWwpIGZpZ3VyZSkuc2V0SWNvbihpY29uKTsKLQkJfSBlbHNlIHsKLQkJCSgoTGFiZWwpIGZpZ3VyZSkuc2V0SWNvbihpY29uKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMYWJlbChXcmFwTGFiZWwgZmlndXJlKSB7Ci0JCXVucmVnaXN0ZXJWaXN1YWxzKCk7Ci0JCXNldEZpZ3VyZShmaWd1cmUpOwotCQlkZWZhdWx0VGV4dCA9IGdldExhYmVsVGV4dEhlbHBlcihmaWd1cmUpOwotCQlyZWdpc3RlclZpc3VhbHMoKTsKLQkJcmVmcmVzaFZpc3VhbHMoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIExpc3QgZ2V0TW9kZWxDaGlsZHJlbigpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJR3JhcGhpY2FsRWRpdFBhcnQgZ2V0Q2hpbGRCeVNlbWFudGljSGludChTdHJpbmcgc2VtYW50aWNIaW50KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRU9iamVjdCBnZXRQYXJzZXJFbGVtZW50KCkgewotCQlFT2JqZWN0IGVsZW1lbnQgPSByZXNvbHZlU2VtYW50aWNFbGVtZW50KCk7Ci0JCXJldHVybiBlbGVtZW50ICE9IG51bGwgPyBlbGVtZW50IDogKFZpZXcpIGdldE1vZGVsKCk7Ci0JfQotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICogCi0JICovCi0JcHJvdGVjdGVkIEltYWdlIGdldExhYmVsSWNvbigpIHsKLQkJLy8JCUltYWdlRGVzY3JpcHRvciBkZXNjcmlwdG9yID0gV1BERGlhZ3JhbUVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpCi0JCS8vCQkJCS5nZXRJdGVtSW1hZ2VEZXNjcmlwdG9yKGdldFBhcnNlckVsZW1lbnQoKSk7Ci0JCS8vCQlpZiAoZGVzY3JpcHRvciA9PSBudWxsKSB7Ci0JCS8vCQkJZGVzY3JpcHRvciA9IEltYWdlRGVzY3JpcHRvci5nZXRNaXNzaW5nSW1hZ2VEZXNjcmlwdG9yKCk7Ci0JCS8vCQl9Ci0JCS8vCQlyZXR1cm4gZGVzY3JpcHRvci5jcmVhdGVJbWFnZSgpOwotCQlJbWFnZSBpbWFnZSA9IERpYWdyYW1JY29uUHJvdmlkZXJNYW5hZ2VyLmdldEluc3RhbmNlKCkuZ2V0SWNvbihyZXNvbHZlU2VtYW50aWNFbGVtZW50KCksIHRydWUpOwotCQlpZiAoaW1hZ2UgPT0gbnVsbCkgewotCQkJaW1hZ2UgPSAgV1BERGlhZ3JhbUVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFNoYXJlZEltYWdlKAotCQkJCQkiZnVsbC9vYmoxNi9Xb3JrUHJvZHVjdERlc2NyaXB0b3IuZ2lmIik7CS8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gaW1hZ2U7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TGFiZWxUZXh0KCkgewotCQlTdHJpbmcgdGV4dCA9IG51bGw7Ci0JCWlmIChnZXRQYXJzZXIoKSAhPSBudWxsKSB7Ci0JCQl0ZXh0ID0gZ2V0UGFyc2VyKCkuZ2V0UHJpbnRTdHJpbmcoCi0JCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihnZXRQYXJzZXJFbGVtZW50KCkpLAotCQkJCQlnZXRQYXJzZXJPcHRpb25zKCkuaW50VmFsdWUoKSk7Ci0JCX0KLQkJaWYgKHRleHQgPT0gbnVsbCB8fCB0ZXh0Lmxlbmd0aCgpID09IDApIHsKLQkJCXRleHQgPSBkZWZhdWx0VGV4dDsKLQkJfQotCQlyZXR1cm4gdGV4dDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGFiZWxUZXh0KFN0cmluZyB0ZXh0KSB7Ci0JCXNldExhYmVsVGV4dEhlbHBlcihnZXRGaWd1cmUoKSwgdGV4dCk7Ci0JCU9iamVjdCBwZEVkaXRQb2xpY3kgPSBnZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUpOwotCQlpZiAocGRFZGl0UG9saWN5IGluc3RhbmNlb2YgRGlhZ3JhbVRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSB7Ci0JCQkoKERpYWdyYW1UZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgcGRFZGl0UG9saWN5KS5yZWZyZXNoRmVlZGJhY2soKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEVkaXRUZXh0KCkgewotCQlpZiAoZ2V0UGFyc2VyKCkgPT0gbnVsbCkgewotCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIGdldFBhcnNlcigpLmdldEVkaXRTdHJpbmcoCi0JCQkJbmV3IEVPYmplY3RBZGFwdGVyKGdldFBhcnNlckVsZW1lbnQoKSksCi0JCQkJZ2V0UGFyc2VyT3B0aW9ucygpLmludFZhbHVlKCkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0VkaXRhYmxlKCkgewotCQlyZXR1cm4gZ2V0RWRpdFRleHQoKSAhPSBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSUNlbGxFZGl0b3JWYWxpZGF0b3IgZ2V0RWRpdFRleHRWYWxpZGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgSUNlbGxFZGl0b3JWYWxpZGF0b3IoKSB7Ci0KLQkJCXB1YmxpYyBTdHJpbmcgaXNWYWxpZChmaW5hbCBPYmplY3QgdmFsdWUpIHsKLQkJCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpIHsKLQkJCQkJZmluYWwgRU9iamVjdCBlbGVtZW50ID0gZ2V0UGFyc2VyRWxlbWVudCgpOwotCQkJCQlmaW5hbCBJUGFyc2VyIHBhcnNlciA9IGdldFBhcnNlcigpOwotCQkJCQl0cnkgewotCQkJCQkJSVBhcnNlckVkaXRTdGF0dXMgdmFsaWQgPSAoSVBhcnNlckVkaXRTdGF0dXMpIGdldEVkaXRpbmdEb21haW4oKQotCQkJCQkJCQkucnVuRXhjbHVzaXZlKG5ldyBSdW5uYWJsZVdpdGhSZXN1bHQuSW1wbCgpIHsKLQotCQkJCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCQkJCXNldFJlc3VsdChwYXJzZXIuaXNWYWxpZEVkaXRTdHJpbmcoCi0JCQkJCQkJCQkJCQluZXcgRU9iamVjdEFkYXB0ZXIoZWxlbWVudCksCi0JCQkJCQkJCQkJCQkoU3RyaW5nKSB2YWx1ZSkpOwotCQkJCQkJCQkJfQotCQkJCQkJCQl9KTsKLQkJCQkJCXJldHVybiB2YWxpZC5nZXRDb2RlKCkgPT0gUGFyc2VyRWRpdFN0YXR1cy5FRElUQUJMRSA/IG51bGwKLQkJCQkJCQkJOiB2YWxpZC5nZXRNZXNzYWdlKCk7Ci0JCQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGllKSB7Ci0JCQkJCQlpZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQkJfQotCQkJCX0KLQotCQkJCS8vIHNob3VsZG4ndCBnZXQgaGVyZQotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IgZ2V0Q29tcGxldGlvblByb2Nlc3NvcigpIHsKLQkJaWYgKGdldFBhcnNlcigpID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiBnZXRQYXJzZXIoKS5nZXRDb21wbGV0aW9uUHJvY2Vzc29yKAotCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihnZXRQYXJzZXJFbGVtZW50KCkpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFBhcnNlck9wdGlvbnMgZ2V0UGFyc2VyT3B0aW9ucygpIHsKLQkJcmV0dXJuIFBhcnNlck9wdGlvbnMuTk9ORTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElQYXJzZXIgZ2V0UGFyc2VyKCkgewotCQlpZiAocGFyc2VyID09IG51bGwpIHsKLQkJCVN0cmluZyBwYXJzZXJIaW50ID0gKChWaWV3KSBnZXRNb2RlbCgpKS5nZXRUeXBlKCk7Ci0JCQlQYXJzZXJIaW50QWRhcHRlciBoaW50QWRhcHRlciA9IG5ldyBQYXJzZXJIaW50QWRhcHRlcigKLQkJCQkJZ2V0UGFyc2VyRWxlbWVudCgpLCBwYXJzZXJIaW50KSB7Ci0KLQkJCQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgYWRhcHRlcikgewotCQkJCQlpZiAoSUVsZW1lbnRUeXBlLmNsYXNzLmVxdWFscyhhZGFwdGVyKSkgewotCQkJCQkJcmV0dXJuIERpYWdyYW1FbGVtZW50VHlwZXMuV29ya1Byb2R1Y3ROb2RlXzEwMDE7Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIHN1cGVyLmdldEFkYXB0ZXIoYWRhcHRlcik7Ci0JCQkJfQotCQkJfTsKLQkJCXBhcnNlciA9IFBhcnNlclNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRQYXJzZXIoaGludEFkYXB0ZXIpOwotCQl9Ci0JCXJldHVybiBwYXJzZXI7Ci0JfQotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJvdGVjdGVkIERpcmVjdEVkaXRNYW5hZ2VyIGdldE1hbmFnZXIoKSB7Ci0JCWlmIChtYW5hZ2VyID09IG51bGwpIHsKLQkJCXNldE1hbmFnZXIobmV3IFZhbGlkYXRpbmdUZXh0RGlyZWN0RWRpdE1hbmFnZXIodGhpcywKLQkJCQkJVmFsaWRhdGluZ1RleHREaXJlY3RFZGl0TWFuYWdlcgotCQkJCQkJCS5nZXRUZXh0Q2VsbEVkaXRvckNsYXNzKHRoaXMpLCBEaWFncmFtRWRpdFBhcnRGYWN0b3J5Ci0JCQkJCQkJLmdldFRleHRDZWxsRWRpdG9yTG9jYXRvcih0aGlzKSkgewotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCBTdHJpbmcgdmFsaWRhdGUoU3RyaW5nIHR4dCkgewotCi0JCQkJCU9iamVjdCBvYmogPSBnZXRFZGl0UGFydCgpLmdldE1vZGVsKCk7Ci0JCQkJCWlmIChvYmogaW5zdGFuY2VvZiBOb2RlKSB7Ci0JCQkJCQlOb2RlIG1vZGVsID0gKE5vZGUpIG9iajsKLQkJCQkJCUVPYmplY3QgdW1hTm9kZSA9IG1vZGVsLmdldEVsZW1lbnQoKTsKLQkJCQkJCQotCQkJCQkJaWYgKHVtYU5vZGUgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdE5vZGUpIHsKLQkJCQkJCQlvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlIG5vZGUgPSAob3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZSkgdW1hTm9kZTsKLQkJCQkJCQlPYmplY3QgZSA9IG5vZGUuZ2V0T2JqZWN0KCk7Ci0JCQkJCQkJU3VwcHJlc3Npb24gc3VwcHJlc3Npb24gPSBub2RlLmdldERpYWdyYW0oKS5nZXRTdXBwcmVzc2lvbigpOwotCQkJCQkJCXJldHVybiBUbmdVdGlsLmNoZWNrV29ya1Byb2R1Y3REZXNjcmlwdG9yUHJlc2VudGF0aW9uTmFtZSgKLQkJCQkJCQkJCWUsIHR4dCwgc3VwcHJlc3Npb24pOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCXJldHVybiBudWxsOwotCQkJCX0KLQotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0KCkgewotCQkJCQkoKFdvcmtQcm9kdWN0Tm9kZU5hbWVFZGl0UGFydCkgZ2V0RWRpdFBhcnQoKSkKLQkJCQkJCQkucGVyZm9ybURpcmVjdEVkaXQoKTsKLQkJCQl9Ci0KLQkJCX0pOwotCQl9Ci0JCXJldHVybiBtYW5hZ2VyOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRNYW5hZ2VyKERpcmVjdEVkaXRNYW5hZ2VyIG1hbmFnZXIpIHsKLQkJdGhpcy5tYW5hZ2VyID0gbWFuYWdlcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURpcmVjdEVkaXQoKSB7Ci0JCWdldE1hbmFnZXIoKS5zaG93KCk7Ci0JfQotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURpcmVjdEVkaXQoUG9pbnQgZXZlbnRMb2NhdGlvbikgewotCQlpZiAoZ2V0TWFuYWdlcigpIGluc3RhbmNlb2YgVGV4dERpcmVjdEVkaXRNYW5hZ2VyKSB7Ci0JCQkoKFRleHREaXJlY3RFZGl0TWFuYWdlcikgZ2V0TWFuYWdlcigpKS5zaG93KGV2ZW50TG9jYXRpb24KLQkJCQkJLmdldFNXVFBvaW50KCkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdChjaGFyIGluaXRpYWxDaGFyYWN0ZXIpIHsKLQkJaWYgKGdldE1hbmFnZXIoKSBpbnN0YW5jZW9mIFRleHREaXJlY3RFZGl0TWFuYWdlcikgewotCQkJKChUZXh0RGlyZWN0RWRpdE1hbmFnZXIpIGdldE1hbmFnZXIoKSkuc2hvdyhpbml0aWFsQ2hhcmFjdGVyKTsKLQkJfSBlbHNlIHsKLQkJCXBlcmZvcm1EaXJlY3RFZGl0KCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURpcmVjdEVkaXRSZXF1ZXN0KFJlcXVlc3QgcmVxdWVzdCkgewotCQlmaW5hbCBSZXF1ZXN0IHRoZVJlcXVlc3QgPSByZXF1ZXN0OwotCQl0cnkgewotCQkJZ2V0RWRpdGluZ0RvbWFpbigpLnJ1bkV4Y2x1c2l2ZShuZXcgUnVubmFibGUoKSB7Ci0KLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCWlmIChpc0FjdGl2ZSgpICYmIGlzRWRpdGFibGUoKSkgewotCQkJCQkJaWYgKHRoZVJlcXVlc3QKLQkJCQkJCQkJLmdldEV4dGVuZGVkRGF0YSgpCi0JCQkJCQkJCS5nZXQoCi0JCQkJCQkJCQkJUmVxdWVzdENvbnN0YW50cy5SRVFfRElSRUNURURJVF9FWFRFTkRFRERBVEFfSU5JVElBTF9DSEFSKSBpbnN0YW5jZW9mIENoYXJhY3RlcikgewotCQkJCQkJCUNoYXJhY3RlciBpbml0aWFsQ2hhciA9IChDaGFyYWN0ZXIpIHRoZVJlcXVlc3QKLQkJCQkJCQkJCS5nZXRFeHRlbmRlZERhdGEoKQotCQkJCQkJCQkJLmdldCgKLQkJCQkJCQkJCQkJUmVxdWVzdENvbnN0YW50cy5SRVFfRElSRUNURURJVF9FWFRFTkRFRERBVEFfSU5JVElBTF9DSEFSKTsKLQkJCQkJCQlwZXJmb3JtRGlyZWN0RWRpdChpbml0aWFsQ2hhci5jaGFyVmFsdWUoKSk7Ci0JCQkJCQl9IGVsc2UgaWYgKCh0aGVSZXF1ZXN0IGluc3RhbmNlb2YgRGlyZWN0RWRpdFJlcXVlc3QpCi0JCQkJCQkJCSYmIChnZXRFZGl0VGV4dCgpLmVxdWFscyhnZXRMYWJlbFRleHQoKSkpKSB7Ci0JCQkJCQkJRGlyZWN0RWRpdFJlcXVlc3QgZWRpdFJlcXVlc3QgPSAoRGlyZWN0RWRpdFJlcXVlc3QpIHRoZVJlcXVlc3Q7Ci0JCQkJCQkJcGVyZm9ybURpcmVjdEVkaXQoZWRpdFJlcXVlc3QuZ2V0TG9jYXRpb24oKSk7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCXBlcmZvcm1EaXJlY3RFZGl0KCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9KTsKLQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoVmlzdWFscygpIHsKLQkJc3VwZXIucmVmcmVzaFZpc3VhbHMoKTsKLQkJcmVmcmVzaExhYmVsKCk7Ci0JCXJlZnJlc2hGb250KCk7Ci0JCXJlZnJlc2hGb250Q29sb3IoKTsKLQkJcmVmcmVzaFVuZGVybGluZSgpOwotCQlyZWZyZXNoU3RyaWtlVGhyb3VnaCgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoTGFiZWwoKSB7Ci0JCXNldExhYmVsVGV4dEhlbHBlcihnZXRGaWd1cmUoKSwgZ2V0TGFiZWxUZXh0KCkpOwotCQlzZXRMYWJlbEljb25IZWxwZXIoZ2V0RmlndXJlKCksIGdldExhYmVsSWNvbigpKTsKLQkJT2JqZWN0IHBkRWRpdFBvbGljeSA9IGdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSk7Ci0JCWlmIChwZEVkaXRQb2xpY3kgaW5zdGFuY2VvZiBEaWFncmFtVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHsKLQkJCSgoRGlhZ3JhbVRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSBwZEVkaXRQb2xpY3kpLnJlZnJlc2hGZWVkYmFjaygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hVbmRlcmxpbmUoKSB7Ci0JCUZvbnRTdHlsZSBzdHlsZSA9IChGb250U3R5bGUpIGdldEZvbnRTdHlsZU93bmVyVmlldygpLmdldFN0eWxlKAotCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlKCkpOwotCQlpZiAoc3R5bGUgIT0gbnVsbCAmJiBnZXRGaWd1cmUoKSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJKChXcmFwTGFiZWwpIGdldEZpZ3VyZSgpKS5zZXRUZXh0VW5kZXJsaW5lKHN0eWxlLmlzVW5kZXJsaW5lKCkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hTdHJpa2VUaHJvdWdoKCkgewotCQlGb250U3R5bGUgc3R5bGUgPSAoRm9udFN0eWxlKSBnZXRGb250U3R5bGVPd25lclZpZXcoKS5nZXRTdHlsZSgKLQkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZSgpKTsKLQkJaWYgKHN0eWxlICE9IG51bGwgJiYgZ2V0RmlndXJlKCkgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCSgoV3JhcExhYmVsKSBnZXRGaWd1cmUoKSkuc2V0VGV4dFN0cmlrZVRocm91Z2goc3R5bGUKLQkJCQkJLmlzU3RyaWtlVGhyb3VnaCgpKTsKLQkJfQotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hGb250KCkgewotCQlGb250U3R5bGUgc3R5bGUgPSAoRm9udFN0eWxlKSBnZXRGb250U3R5bGVPd25lclZpZXcoKS5nZXRTdHlsZSgKLQkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZSgpKTsKLQkJaWYgKHN0eWxlICE9IG51bGwpIHsKLQkJCVN0cmluZyBmb250TmFtZSA9IERpYWdyYW1Db25zdGFudHMuZ2V0Rm9udE5hbWUoc3R5bGUpOwotCQkJRm9udERhdGEgZm9udERhdGEgPSBuZXcgRm9udERhdGEoZm9udE5hbWUsIHN0eWxlCi0JCQkJCS5nZXRGb250SGVpZ2h0KCksIChzdHlsZS5pc0JvbGQoKSA/IFNXVC5CT0xEIDogU1dULk5PUk1BTCkKLQkJCQkJfCAoc3R5bGUuaXNJdGFsaWMoKSA/IFNXVC5JVEFMSUMgOiBTV1QuTk9STUFMKSk7Ci0JCQlzZXRGb250KGZvbnREYXRhKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBtb2RpZmllZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldEZvbnRDb2xvcihDb2xvciBjb2xvcikgewotCQlDb2xvciBjID0gRGlhZ3JhbUNvcmVVdGlsLmdldEZvbnRDb2xvcih0aGlzKTsKLQkJaWYgKGMgIT0gbnVsbCkgewotCQkJY29sb3IgPSBjOwotCQl9Ci0JCWdldEZpZ3VyZSgpLnNldEZvcmVncm91bmRDb2xvcihjb2xvcik7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFNlbWFudGljTGlzdGVuZXJzKCkgewotCQlpZiAoZ2V0UGFyc2VyKCkgaW5zdGFuY2VvZiBJU2VtYW50aWNQYXJzZXIpIHsKLQkJCUVPYmplY3QgZWxlbWVudCA9IHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKTsKLQkJCXBhcnNlckVsZW1lbnRzID0gKChJU2VtYW50aWNQYXJzZXIpIGdldFBhcnNlcigpKQotCQkJCQkuZ2V0U2VtYW50aWNFbGVtZW50c0JlaW5nUGFyc2VkKGVsZW1lbnQpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJzZXJFbGVtZW50cy5zaXplKCk7IGkrKykgewotCQkJCWFkZExpc3RlbmVyRmlsdGVyKAotCQkJCQkJIlNlbWFudGljTW9kZWwiICsgaSwgdGhpcywgKEVPYmplY3QpIHBhcnNlckVsZW1lbnRzLmdldChpKSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXN1cGVyLmFkZFNlbWFudGljTGlzdGVuZXJzKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlU2VtYW50aWNMaXN0ZW5lcnMoKSB7Ci0JCWlmIChwYXJzZXJFbGVtZW50cyAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcnNlckVsZW1lbnRzLnNpemUoKTsgaSsrKSB7Ci0JCQkJcmVtb3ZlTGlzdGVuZXJGaWx0ZXIoIlNlbWFudGljTW9kZWwiICsgaSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXN1cGVyLnJlbW92ZVNlbWFudGljTGlzdGVuZXJzKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEFjY2Vzc2libGVFZGl0UGFydCBnZXRBY2Nlc3NpYmxlRWRpdFBhcnQoKSB7Ci0JCWlmIChhY2Nlc3NpYmxlRVAgPT0gbnVsbCkgewotCQkJYWNjZXNzaWJsZUVQID0gbmV3IEFjY2Vzc2libGVHcmFwaGljYWxFZGl0UGFydCgpIHsKLQotCQkJCXB1YmxpYyB2b2lkIGdldE5hbWUoQWNjZXNzaWJsZUV2ZW50IGUpIHsKLQkJCQkJZS5yZXN1bHQgPSBnZXRMYWJlbFRleHRIZWxwZXIoZ2V0RmlndXJlKCkpOwotCQkJCX0KLQkJCX07Ci0JCX0KLQkJcmV0dXJuIGFjY2Vzc2libGVFUDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBWaWV3IGdldEZvbnRTdHlsZU93bmVyVmlldygpIHsKLQkJcmV0dXJuIGdldFByaW1hcnlWaWV3KCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZE5vdGF0aW9uYWxMaXN0ZW5lcnMoKSB7Ci0JCXN1cGVyLmFkZE5vdGF0aW9uYWxMaXN0ZW5lcnMoKTsKLQkJYWRkTGlzdGVuZXJGaWx0ZXIoIlByaW1hcnlWaWV3IiwgdGhpcywgZ2V0UHJpbWFyeVZpZXcoKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlTm90YXRpb25hbExpc3RlbmVycygpIHsKLQkJc3VwZXIucmVtb3ZlTm90YXRpb25hbExpc3RlbmVycygpOwotCQlyZW1vdmVMaXN0ZW5lckZpbHRlcigiUHJpbWFyeVZpZXciKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVOb3RpZmljYXRpb25FdmVudChOb3RpZmljYXRpb24gZXZlbnQpIHsKLQkJT2JqZWN0IGZlYXR1cmUgPSBldmVudC5nZXRGZWF0dXJlKCk7Ci0JCWlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Gb250Q29sb3IoKS5lcXVhbHMoZmVhdHVyZSkpIHsKLQkJCUludGVnZXIgYyA9IChJbnRlZ2VyKSBldmVudC5nZXROZXdWYWx1ZSgpOwotCQkJc2V0Rm9udENvbG9yKERpYWdyYW1Db2xvclJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0Q29sb3IoYykpOwotCQl9IGVsc2UgaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX1VuZGVybGluZSgpLmVxdWFscygKLQkJCQlmZWF0dXJlKSkgewotCQkJcmVmcmVzaFVuZGVybGluZSgpOwotCQl9IGVsc2UgaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX1N0cmlrZVRocm91Z2goKQotCQkJCS5lcXVhbHMoZmVhdHVyZSkpIHsKLQkJCXJlZnJlc2hTdHJpa2VUaHJvdWdoKCk7Ci0JCX0gZWxzZSBpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfRm9udEhlaWdodCgpLmVxdWFscygKLQkJCQlmZWF0dXJlKQotCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0ZvbnROYW1lKCkuZXF1YWxzKAotCQkJCQkJZmVhdHVyZSkKLQkJCQl8fCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Cb2xkKCkKLQkJCQkJCS5lcXVhbHMoZmVhdHVyZSkKLQkJCQl8fCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9JdGFsaWMoKS5lcXVhbHMoCi0JCQkJCQlmZWF0dXJlKSkgewotCQkJcmVmcmVzaEZvbnQoKTsKLQkJfSBlbHNlIHsKLQkJCWlmIChnZXRQYXJzZXIoKSAhPSBudWxsCi0JCQkJCSYmIGdldFBhcnNlcigpLmlzQWZmZWN0aW5nRXZlbnQoZXZlbnQsCi0JCQkJCQkJZ2V0UGFyc2VyT3B0aW9ucygpLmludFZhbHVlKCkpKSB7Ci0JCQkJcmVmcmVzaExhYmVsKCk7Ci0JCQl9Ci0JCQlpZiAoZ2V0UGFyc2VyKCkgaW5zdGFuY2VvZiBJU2VtYW50aWNQYXJzZXIpIHsKLQkJCQlJU2VtYW50aWNQYXJzZXIgbW9kZWxQYXJzZXIgPSAoSVNlbWFudGljUGFyc2VyKSBnZXRQYXJzZXIoKTsKLQkJCQlpZiAobW9kZWxQYXJzZXIuYXJlU2VtYW50aWNFbGVtZW50c0FmZmVjdGVkKG51bGwsIGV2ZW50KSkgewotCQkJCQlyZW1vdmVTZW1hbnRpY0xpc3RlbmVycygpOwotCQkJCQlpZiAocmVzb2x2ZVNlbWFudGljRWxlbWVudCgpICE9IG51bGwpIHsKLQkJCQkJCWFkZFNlbWFudGljTGlzdGVuZXJzKCk7Ci0JCQkJCX0KLQkJCQkJcmVmcmVzaExhYmVsKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXN1cGVyLmhhbmRsZU5vdGlmaWNhdGlvbkV2ZW50KGV2ZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlRmlndXJlKCkgewotCQkvLyBQYXJlbnQgc2hvdWxkIGFzc2lnbiBvbmUgdXNpbmcgc2V0TGFiZWwoKSBtZXRob2QKLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9lZGl0L3BvbGljaWVzL0RpYWdyYW1CYXNlSXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9lZGl0L3BvbGljaWVzL0RpYWdyYW1CYXNlSXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMmI2ZDliLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvZWRpdC9wb2xpY2llcy9EaWFncmFtQmFzZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLmVkaXQucG9saWNpZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbXBvdW5kQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuVW5leGVjdXRhYmxlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuUmVjb25uZWN0UmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS5jb21tYW5kLklDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5jb21tYW5kcy5EZWxldGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS51dGlsLlZpZXdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuY29tbWFuZHMuQ29tbWFuZFByb3h5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuY29tbWFuZHMuSUNvbW1hbmRQcm94eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JR3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuU2VtYW50aWNFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVxdWVzdHMuRWRpdENvbW1hbmRSZXF1ZXN0V3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29tbWFuZHMuY29yZS5jb21tYW5kLkNvbXBvc2l0ZVRyYW5zYWN0aW9uYWxDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuRWxlbWVudFR5cGVSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLklFZGl0SGVscGVyQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLklFbGVtZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkNvbmZpZ3VyZVJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5DcmVhdGVFbGVtZW50UmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkNyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5EZXN0cm95RWxlbWVudFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5EZXN0cm95UmVmZXJlbmNlUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkRlc3Ryb3lSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuRHVwbGljYXRlRWxlbWVudHNSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuR2V0RWRpdENvbnRleHRSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuSUVkaXRDb21tYW5kUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLk1vdmVSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuUmVvcmllbnRSZWZlcmVuY2VSZWxhdGlvbnNoaXBSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuUmVvcmllbnRSZWxhdGlvbnNoaXBSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuU2V0UmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5FZGdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5lZGl0LmhlbHBlcnMuRGlhZ3JhbUJhc2VFZGl0SGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQucGFydC5EaWFncmFtVmlzdWFsSURSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3Q7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRGlhZ3JhbUJhc2VJdGVtU2VtYW50aWNFZGl0UG9saWN5IGV4dGVuZHMgU2VtYW50aWNFZGl0UG9saWN5IHsKLQotCS8qKgotCSAqIEV4dGVuZGVkIHJlcXVlc3QgZGF0YSBrZXkgdG8gaG9sZCBlZGl0cGFydCB2aXN1YWwgaWQuCi0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZJU1VBTF9JRF9LRVkgPSAidmlzdWFsX2lkIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQWRkIHZpc3VhbCBpZCBvZiBlZGl0ZWQgZWRpdHBhcnQgdG8gZXh0ZW5kZWQgZGF0YSBvZiB0aGUgcmVxdWVzdAotCSAqIHNvIGNvbW1hbmQgc3dpdGNoIGNhbiBkZWNpZGUgd2hhdCBraW5kIG9mIGRpYWdyYW0gZWxlbWVudCBpcyBiZWluZyBlZGl0ZWQuCi0JICogSXQgaXMgZG9uZSBpbiB0aG9zZSBjYXNlcyB3aGVuIGl0J3Mgbm90IHBvc3NpYmxlIHRvIGRlZHVjZSBkaWFncmFtCi0JICogZWxlbWVudCBraW5kIGZyb20gZG9tYWluIGVsZW1lbnQuCi0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb21tYW5kIGdldENvbW1hbmQoUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCWlmIChyZXF1ZXN0IGluc3RhbmNlb2YgUmVjb25uZWN0UmVxdWVzdCkgewotCQkJT2JqZWN0IHZpZXcgPSAoKFJlY29ubmVjdFJlcXVlc3QpIHJlcXVlc3QpLmdldENvbm5lY3Rpb25FZGl0UGFydCgpCi0JCQkJCS5nZXRNb2RlbCgpOwotCQkJaWYgKHZpZXcgaW5zdGFuY2VvZiBWaWV3KSB7Ci0JCQkJSW50ZWdlciBpZCA9IG5ldyBJbnRlZ2VyKERpYWdyYW1WaXN1YWxJRFJlZ2lzdHJ5Ci0JCQkJCQkuZ2V0VmlzdWFsSUQoKFZpZXcpIHZpZXcpKTsKLQkJCQlyZXF1ZXN0LmdldEV4dGVuZGVkRGF0YSgpLnB1dChWSVNVQUxfSURfS0VZLCBpZCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldENvbW1hbmQocmVxdWVzdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB2aXN1YWwgaWQgZnJvbSByZXF1ZXN0IHBhcmFtZXRlcnMuCi0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBpbnQgZ2V0VmlzdWFsSUQoSUVkaXRDb21tYW5kUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCU9iamVjdCBpZCA9IHJlcXVlc3QuZ2V0UGFyYW1ldGVyKFZJU1VBTF9JRF9LRVkpOwotCQlyZXR1cm4gaWQgaW5zdGFuY2VvZiBJbnRlZ2VyID8gKChJbnRlZ2VyKSBpZCkuaW50VmFsdWUoKSA6IC0xOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRTZW1hbnRpY0NvbW1hbmQoSUVkaXRDb21tYW5kUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCUlFZGl0Q29tbWFuZFJlcXVlc3QgY29tcGxldGVkUmVxdWVzdCA9IGNvbXBsZXRlUmVxdWVzdChyZXF1ZXN0KTsKLQkJT2JqZWN0IGVkaXRIZWxwZXJDb250ZXh0ID0gY29tcGxldGVkUmVxdWVzdC5nZXRFZGl0SGVscGVyQ29udGV4dCgpOwotCQlpZiAoZWRpdEhlbHBlckNvbnRleHQgaW5zdGFuY2VvZiBWaWV3Ci0JCQkJfHwgKGVkaXRIZWxwZXJDb250ZXh0IGluc3RhbmNlb2YgSUVkaXRIZWxwZXJDb250ZXh0ICYmICgoSUVkaXRIZWxwZXJDb250ZXh0KSBlZGl0SGVscGVyQ29udGV4dCkKLQkJCQkJCS5nZXRFT2JqZWN0KCkgaW5zdGFuY2VvZiBWaWV3KSkgewotCQkJLy8gbm8gc2VtYW50aWMgY29tbWFuZHMgYXJlIHByb3ZpZGVkIGZvciBwdXJlIGRlc2lnbiBlbGVtZW50cwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJaWYgKGVkaXRIZWxwZXJDb250ZXh0ID09IG51bGwpIHsKLQkJCWVkaXRIZWxwZXJDb250ZXh0ID0gVmlld1V0aWwKLQkJCQkJLnJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKFZpZXcpIGdldEhvc3QoKS5nZXRNb2RlbCgpKTsKLQkJfQotCQlJRWxlbWVudFR5cGUgZWxlbWVudFR5cGUgPSBFbGVtZW50VHlwZVJlZ2lzdHJ5LmdldEluc3RhbmNlKCkKLQkJCQkuZ2V0RWxlbWVudFR5cGUoZWRpdEhlbHBlckNvbnRleHQpOwotCQlpZiAoZWxlbWVudFR5cGUgPT0gRWxlbWVudFR5cGVSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldFR5cGUoCi0JCQkJIm9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuZGVmYXVsdCIpKSB7IC8vJE5PTi1OTFMtMSQgCi0JCQllbGVtZW50VHlwZSA9IG51bGw7Ci0JCX0KLQkJQ29tbWFuZCBlcENvbW1hbmQgPSBnZXRTZW1hbnRpY0NvbW1hbmRTd2l0Y2goY29tcGxldGVkUmVxdWVzdCk7Ci0JCWlmIChlcENvbW1hbmQgIT0gbnVsbCkgewotCQkJSUNvbW1hbmQgY29tbWFuZCA9IGVwQ29tbWFuZCBpbnN0YW5jZW9mIElDb21tYW5kUHJveHkgPyAoKElDb21tYW5kUHJveHkpIGVwQ29tbWFuZCkKLQkJCQkJLmdldElDb21tYW5kKCkKLQkJCQkJOiBuZXcgQ29tbWFuZFByb3h5KGVwQ29tbWFuZCk7Ci0JCQljb21wbGV0ZWRSZXF1ZXN0LnNldFBhcmFtZXRlcigKLQkJCQkJRGlhZ3JhbUJhc2VFZGl0SGVscGVyLkVESVRfUE9MSUNZX0NPTU1BTkQsIGNvbW1hbmQpOwotCQl9Ci0JCUNvbW1hbmQgZWhDb21tYW5kID0gbnVsbDsKLQkJaWYgKGVsZW1lbnRUeXBlICE9IG51bGwpIHsKLQkJCUlDb21tYW5kIGNvbW1hbmQgPSBlbGVtZW50VHlwZS5nZXRFZGl0Q29tbWFuZChjb21wbGV0ZWRSZXF1ZXN0KTsKLQkJCWlmIChjb21tYW5kICE9IG51bGwpIHsKLQkJCQlpZiAoIShjb21tYW5kIGluc3RhbmNlb2YgQ29tcG9zaXRlVHJhbnNhY3Rpb25hbENvbW1hbmQpKSB7Ci0JCQkJCVRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIGVkaXRpbmdEb21haW4gPSAoKElHcmFwaGljYWxFZGl0UGFydCkgZ2V0SG9zdCgpKQotCQkJCQkJCS5nZXRFZGl0aW5nRG9tYWluKCk7Ci0JCQkJCWNvbW1hbmQgPSBuZXcgQ29tcG9zaXRlVHJhbnNhY3Rpb25hbENvbW1hbmQoZWRpdGluZ0RvbWFpbiwKLQkJCQkJCQludWxsKS5jb21wb3NlKGNvbW1hbmQpOwotCQkJCX0KLQkJCQllaENvbW1hbmQgPSBuZXcgSUNvbW1hbmRQcm94eShjb21tYW5kKTsKLQkJCX0KLQkJfQotCQlib29sZWFuIHNob3VsZFByb2NlZWQgPSB0cnVlOwotCQlpZiAoY29tcGxldGVkUmVxdWVzdCBpbnN0YW5jZW9mIERlc3Ryb3lSZXF1ZXN0KSB7Ci0JCQlzaG91bGRQcm9jZWVkID0gc2hvdWxkUHJvY2VlZCgoRGVzdHJveVJlcXVlc3QpIGNvbXBsZXRlZFJlcXVlc3QpOwotCQl9Ci0JCWlmIChzaG91bGRQcm9jZWVkKSB7Ci0JCQlpZiAoY29tcGxldGVkUmVxdWVzdCBpbnN0YW5jZW9mIERlc3Ryb3lSZXF1ZXN0KSB7Ci0JCQkJVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gZWRpdGluZ0RvbWFpbiA9ICgoSUdyYXBoaWNhbEVkaXRQYXJ0KSBnZXRIb3N0KCkpCi0JCQkJCQkuZ2V0RWRpdGluZ0RvbWFpbigpOwotCQkJCUNvbW1hbmQgZGVsZXRlVmlld0NvbW1hbmQgPSBuZXcgSUNvbW1hbmRQcm94eSgKLQkJCQkJCW5ldyBEZWxldGVDb21tYW5kKGVkaXRpbmdEb21haW4sIChWaWV3KSBnZXRIb3N0KCkKLQkJCQkJCQkJLmdldE1vZGVsKCkpKTsKLQkJCQllaENvbW1hbmQgPSBlaENvbW1hbmQgPT0gbnVsbCA/IGRlbGV0ZVZpZXdDb21tYW5kIDogZWhDb21tYW5kCi0JCQkJCQkuY2hhaW4oZGVsZXRlVmlld0NvbW1hbmQpOwotCQkJfQotCQkJcmV0dXJuIGVoQ29tbWFuZDsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0U2VtYW50aWNDb21tYW5kU3dpdGNoKElFZGl0Q29tbWFuZFJlcXVlc3QgcmVxKSB7Ci0JCWlmIChyZXEgaW5zdGFuY2VvZiBDcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0KSB7Ci0JCQlyZXR1cm4gZ2V0Q3JlYXRlUmVsYXRpb25zaGlwQ29tbWFuZCgoQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdCkgcmVxKTsKLQkJfSBlbHNlIGlmIChyZXEgaW5zdGFuY2VvZiBDcmVhdGVFbGVtZW50UmVxdWVzdCkgewotCQkJcmV0dXJuIGdldENyZWF0ZUNvbW1hbmQoKENyZWF0ZUVsZW1lbnRSZXF1ZXN0KSByZXEpOwotCQl9IGVsc2UgaWYgKHJlcSBpbnN0YW5jZW9mIENvbmZpZ3VyZVJlcXVlc3QpIHsKLQkJCXJldHVybiBnZXRDb25maWd1cmVDb21tYW5kKChDb25maWd1cmVSZXF1ZXN0KSByZXEpOwotCQl9IGVsc2UgaWYgKHJlcSBpbnN0YW5jZW9mIERlc3Ryb3lFbGVtZW50UmVxdWVzdCkgewotCQkJcmV0dXJuIGdldERlc3Ryb3lFbGVtZW50Q29tbWFuZCgoRGVzdHJveUVsZW1lbnRSZXF1ZXN0KSByZXEpOwotCQl9IGVsc2UgaWYgKHJlcSBpbnN0YW5jZW9mIERlc3Ryb3lSZWZlcmVuY2VSZXF1ZXN0KSB7Ci0JCQlyZXR1cm4gZ2V0RGVzdHJveVJlZmVyZW5jZUNvbW1hbmQoKERlc3Ryb3lSZWZlcmVuY2VSZXF1ZXN0KSByZXEpOwotCQl9IGVsc2UgaWYgKHJlcSBpbnN0YW5jZW9mIER1cGxpY2F0ZUVsZW1lbnRzUmVxdWVzdCkgewotCQkJcmV0dXJuIGdldER1cGxpY2F0ZUNvbW1hbmQoKER1cGxpY2F0ZUVsZW1lbnRzUmVxdWVzdCkgcmVxKTsKLQkJfSBlbHNlIGlmIChyZXEgaW5zdGFuY2VvZiBHZXRFZGl0Q29udGV4dFJlcXVlc3QpIHsKLQkJCXJldHVybiBnZXRFZGl0Q29udGV4dENvbW1hbmQoKEdldEVkaXRDb250ZXh0UmVxdWVzdCkgcmVxKTsKLQkJfSBlbHNlIGlmIChyZXEgaW5zdGFuY2VvZiBNb3ZlUmVxdWVzdCkgewotCQkJcmV0dXJuIGdldE1vdmVDb21tYW5kKChNb3ZlUmVxdWVzdCkgcmVxKTsKLQkJfSBlbHNlIGlmIChyZXEgaW5zdGFuY2VvZiBSZW9yaWVudFJlZmVyZW5jZVJlbGF0aW9uc2hpcFJlcXVlc3QpIHsKLQkJCXJldHVybiBnZXRSZW9yaWVudFJlZmVyZW5jZVJlbGF0aW9uc2hpcENvbW1hbmQoKFJlb3JpZW50UmVmZXJlbmNlUmVsYXRpb25zaGlwUmVxdWVzdCkgcmVxKTsKLQkJfSBlbHNlIGlmIChyZXEgaW5zdGFuY2VvZiBSZW9yaWVudFJlbGF0aW9uc2hpcFJlcXVlc3QpIHsKLQkJCXJldHVybiBnZXRSZW9yaWVudFJlbGF0aW9uc2hpcENvbW1hbmQoKFJlb3JpZW50UmVsYXRpb25zaGlwUmVxdWVzdCkgcmVxKTsKLQkJfSBlbHNlIGlmIChyZXEgaW5zdGFuY2VvZiBTZXRSZXF1ZXN0KSB7Ci0JCQlyZXR1cm4gZ2V0U2V0Q29tbWFuZCgoU2V0UmVxdWVzdCkgcmVxKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q29uZmlndXJlQ29tbWFuZChDb25maWd1cmVSZXF1ZXN0IHJlcSkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlUmVsYXRpb25zaGlwQ29tbWFuZChDcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0IHJlcSkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlQ29tbWFuZChDcmVhdGVFbGVtZW50UmVxdWVzdCByZXEpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldFNldENvbW1hbmQoU2V0UmVxdWVzdCByZXEpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldEVkaXRDb250ZXh0Q29tbWFuZChHZXRFZGl0Q29udGV4dFJlcXVlc3QgcmVxKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXREZXN0cm95RWxlbWVudENvbW1hbmQoRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHJlcSkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0RGVzdHJveVJlZmVyZW5jZUNvbW1hbmQoRGVzdHJveVJlZmVyZW5jZVJlcXVlc3QgcmVxKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXREdXBsaWNhdGVDb21tYW5kKER1cGxpY2F0ZUVsZW1lbnRzUmVxdWVzdCByZXEpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldE1vdmVDb21tYW5kKE1vdmVSZXF1ZXN0IHJlcSkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0UmVvcmllbnRSZWZlcmVuY2VSZWxhdGlvbnNoaXBDb21tYW5kKAotCQkJUmVvcmllbnRSZWZlcmVuY2VSZWxhdGlvbnNoaXBSZXF1ZXN0IHJlcSkgewotCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0UmVvcmllbnRSZWxhdGlvbnNoaXBDb21tYW5kKAotCQkJUmVvcmllbnRSZWxhdGlvbnNoaXBSZXF1ZXN0IHJlcSkgewotCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0TVNMV3JhcHBlcihJQ29tbWFuZCBjbWQpIHsKLQkJcmV0dXJuIG5ldyBJQ29tbWFuZFByb3h5KGNtZCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFT2JqZWN0IGdldFNlbWFudGljRWxlbWVudCgpIHsKLQkJcmV0dXJuIFZpZXdVdGlsLnJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKFZpZXcpIGdldEhvc3QoKS5nZXRNb2RlbCgpKTsKLQl9Ci0KLQkvKioKLQkgKiBGaW5kcyBjb250YWluZXIgZWxlbWVudCBmb3IgdGhlIG5ldyByZWxhdGlvbnNoaXAgb2YgdGhlIHNwZWNpZmllZCB0eXBlLgotCSAqIERlZmF1bHQgaW1wbGVtZW50YXRpb24gZ29lcyB1cCBieSBjb250YWlubWVudCBoaWVyYXJjaHkgc3RhcnRpbmcgZnJvbQotCSAqIHRoZSBzcGVjaWZpZWQgZWxlbWVudCBhbmQgcmV0dXJucyB0aGUgZmlyc3QgZWxlbWVudCB0aGF0IGlzIGluc3RhbmNlIG9mCi0JICogdGhlIHNwZWNpZmllZCBjb250YWluZXIgY2xhc3MuCi0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFT2JqZWN0IGdldFJlbGF0aW9uc2hpcENvbnRhaW5lcihPYmplY3QgdWVsZW1lbnQsCi0JCQlFQ2xhc3MgY29udGFpbmVyQ2xhc3MsIElFbGVtZW50VHlwZSByZWxhdGlvbnNoaXBUeXBlKSB7Ci0JCWlmICh1ZWxlbWVudCBpbnN0YW5jZW9mIEVPYmplY3QpIHsKLQkJCUVPYmplY3QgZWxlbWVudCA9IChFT2JqZWN0KSB1ZWxlbWVudDsKLQkJCWZvciAoOyBlbGVtZW50ICE9IG51bGw7IGVsZW1lbnQgPSBlbGVtZW50LmVDb250YWluZXIoKSkgewotCQkJCWlmIChjb250YWluZXJDbGFzcy5pc1N1cGVyVHlwZU9mKGVsZW1lbnQuZUNsYXNzKCkpKSB7Ci0JCQkJCXJldHVybiBlbGVtZW50OwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGVkaXRpbmcgZG9tYWluIGZyb20gdGhlIGhvc3QgZWRpdCBwYXJ0LgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gZ2V0RWRpdGluZ0RvbWFpbigpIHsKLQkJcmV0dXJuICgoSUdyYXBoaWNhbEVkaXRQYXJ0KSBnZXRIb3N0KCkpLmdldEVkaXRpbmdEb21haW4oKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGNvbW1hbmQgdG8gZGVzdHJveSB0aGUgbGluay4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0RGVzdHJveUVsZW1lbnRDb21tYW5kKFZpZXcgdmlldywgYm9vbGVhbiBjb25maXJtKSB7Ci0JCUVkaXRQYXJ0IGVkaXRQYXJ0ID0gKEVkaXRQYXJ0KSBnZXRIb3N0KCkuZ2V0Vmlld2VyKCkKLQkJCQkuZ2V0RWRpdFBhcnRSZWdpc3RyeSgpLmdldCh2aWV3KTsKLQkJRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHJlcXVlc3QgPSBuZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KAotCQkJCWdldEVkaXRpbmdEb21haW4oKSwgY29uZmlybSk7Ci0JCXJldHVybiBlZGl0UGFydC5nZXRDb21tYW5kKG5ldyBFZGl0Q29tbWFuZFJlcXVlc3RXcmFwcGVyKHJlcXVlc3QsCi0JCQkJQ29sbGVjdGlvbnMuRU1QVFlfTUFQKSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBjb21tYW5kcyB0byBkZXN0cm95IGFsbCBob3N0IGluY29taW5nIGFuZCBvdXRnb2luZyBsaW5rcy4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbXBvdW5kQ29tbWFuZCBnZXREZXN0cm95RWRnZXNDb21tYW5kKGJvb2xlYW4gY29uZmlybSkgewotCQlDb21wb3VuZENvbW1hbmQgY21kID0gbmV3IENvbXBvdW5kQ29tbWFuZCgpOwotCQlWaWV3IHZpZXcgPSAoVmlldykgZ2V0SG9zdCgpLmdldE1vZGVsKCk7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSB2aWV3LmdldFNvdXJjZUVkZ2VzKCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJY21kLmFkZChnZXREZXN0cm95RWxlbWVudENvbW1hbmQoKEVkZ2UpIGl0Lm5leHQoKSwgY29uZmlybSkpOwotCQl9Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSB2aWV3LmdldFRhcmdldEVkZ2VzKCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJY21kLmFkZChnZXREZXN0cm95RWxlbWVudENvbW1hbmQoKEVkZ2UpIGl0Lm5leHQoKSwgY29uZmlybSkpOwotCQl9Ci0JCXJldHVybiBjbWQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2xhc3MgTGlua0NvbnN0cmFpbnRzIHsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBib29sZWFuIGNhbkNyZWF0ZUxpbmtfMzAwMShOb2RlIGNvbnRhaW5lciwgTm9kZSBzb3VyY2UsCi0JCQkJTm9kZSB0YXJnZXQpIHsKLQkJCXJldHVybiBjYW5FeGlzdExpbmtfMzAwMShjb250YWluZXIsIHNvdXJjZSwgdGFyZ2V0KTsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY2FuRXhpc3RMaW5rXzMwMDEoTm9kZSBjb250YWluZXIsIE5vZGUgc291cmNlLAotCQkJCU5vZGUgdGFyZ2V0KSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL2VkaXQvcG9saWNpZXMvRGlhZ3JhbUV4dE5vZGVMYWJlbEhvc3RMYXlvdXRFZGl0UG9saWN5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL2VkaXQvcG9saWNpZXMvRGlhZ3JhbUV4dE5vZGVMYWJlbEhvc3RMYXlvdXRFZGl0UG9saWN5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiNzNhYjUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9lZGl0L3BvbGljaWVzL0RpYWdyYW1FeHROb2RlTGFiZWxIb3N0TGF5b3V0RWRpdFBvbGljeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQuZWRpdC5wb2xpY2llczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuTGF5b3V0RWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuQ2hhbmdlQm91bmRzUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuR3JvdXBSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS51dGlsLlZpZXdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLlhZTGF5b3V0RWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob3RhdGlvblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEaWFncmFtRXh0Tm9kZUxhYmVsSG9zdExheW91dEVkaXRQb2xpY3kgZXh0ZW5kcyBYWUxheW91dEVkaXRQb2xpY3kgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgTGF5b3V0RWRpdFBvbGljeSByZWFsTGF5b3V0RWRpdFBvbGljeTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGF5b3V0RWRpdFBvbGljeSBnZXRSZWFsTGF5b3V0RWRpdFBvbGljeSgpIHsKLQkJcmV0dXJuIHJlYWxMYXlvdXRFZGl0UG9saWN5OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZWFsTGF5b3V0RWRpdFBvbGljeShMYXlvdXRFZGl0UG9saWN5IHJlYWxMYXlvdXRFZGl0UG9saWN5KSB7Ci0JCXRoaXMucmVhbExheW91dEVkaXRQb2xpY3kgPSByZWFsTGF5b3V0RWRpdFBvbGljeTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNFeHRlcm5hbExhYmVsKEVkaXRQYXJ0IGVkaXRQYXJ0KSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIExpc3QgZ2V0RXh0ZXJuYWxMYWJlbHMoR3JvdXBSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJTGlzdCBlZGl0UGFydHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWlmIChyZXF1ZXN0LmdldEVkaXRQYXJ0cygpICE9IG51bGwpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSByZXF1ZXN0LmdldEVkaXRQYXJ0cygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlFZGl0UGFydCBlZGl0UGFydCA9IChFZGl0UGFydCkgaXQubmV4dCgpOwotCQkJCWlmIChpc0V4dGVybmFsTGFiZWwoZWRpdFBhcnQpKSB7Ci0JCQkJCWVkaXRQYXJ0cy5hZGQoZWRpdFBhcnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZWRpdFBhcnRzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ29tbWFuZCBnZXRDb21tYW5kKFJlcXVlc3QgcmVxdWVzdCkgewotCQlpZiAoUkVRX01PVkVfQ0hJTERSRU4uZXF1YWxzKHJlcXVlc3QuZ2V0VHlwZSgpKSkgewotCQkJQ2hhbmdlQm91bmRzUmVxdWVzdCBjYlJlcXVlc3QgPSAoQ2hhbmdlQm91bmRzUmVxdWVzdCkgcmVxdWVzdDsKLQkJCUxpc3QgZXh0TGFiZWxzID0gZ2V0RXh0ZXJuYWxMYWJlbHMoY2JSZXF1ZXN0KTsKLQkJCWlmICghZXh0TGFiZWxzLmlzRW1wdHkoKSkgewotCQkJCUxpc3QgZWRpdFBhcnRzID0gY2JSZXF1ZXN0LmdldEVkaXRQYXJ0cygpOwotCQkJCUNvbW1hbmQgY21kID0gbnVsbDsKLQkJCQlpZiAocmVhbExheW91dEVkaXRQb2xpY3kgIT0gbnVsbAotCQkJCQkJJiYgZWRpdFBhcnRzLnNpemUoKSA+IGV4dExhYmVscy5zaXplKCkpIHsKLQkJCQkJTGlzdCBvdGhlciA9IG5ldyBBcnJheUxpc3QoZWRpdFBhcnRzKTsKLQkJCQkJb3RoZXIucmVtb3ZlQWxsKGV4dExhYmVscyk7Ci0JCQkJCWNiUmVxdWVzdC5zZXRFZGl0UGFydHMob3RoZXIpOwotCQkJCQljbWQgPSByZWFsTGF5b3V0RWRpdFBvbGljeS5nZXRDb21tYW5kKHJlcXVlc3QpOwotCQkJCX0KLQkJCQljYlJlcXVlc3Quc2V0RWRpdFBhcnRzKGV4dExhYmVscyk7Ci0JCQkJQ29tbWFuZCBleHRMYWJlbHNDbWQgPSBnZXRNb3ZlQ2hpbGRyZW5Db21tYW5kKHJlcXVlc3QpOwotCQkJCWNiUmVxdWVzdC5zZXRFZGl0UGFydHMoZWRpdFBhcnRzKTsKLQkJCQlyZXR1cm4gY21kID09IG51bGwgPyBleHRMYWJlbHNDbWQgOiBjbWQuY2hhaW4oZXh0TGFiZWxzQ21kKTsKLQkJCX0KLQkJfQotCQlpZiAocmVxdWVzdCBpbnN0YW5jZW9mIEdyb3VwUmVxdWVzdCkgewotCQkJTGlzdCBleHRMYWJlbHMgPSBnZXRFeHRlcm5hbExhYmVscygoR3JvdXBSZXF1ZXN0KSByZXF1ZXN0KTsKLQkJCWlmICghZXh0TGFiZWxzLmlzRW1wdHkoKSkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9Ci0JCXJldHVybiByZWFsTGF5b3V0RWRpdFBvbGljeSA9PSBudWxsID8gbnVsbCA6IHJlYWxMYXlvdXRFZGl0UG9saWN5Ci0JCQkJLmdldENvbW1hbmQocmVxdWVzdCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZ2V0Q29uc3RyYWludEZvcihDaGFuZ2VCb3VuZHNSZXF1ZXN0IHJlcXVlc3QsCi0JCQlHcmFwaGljYWxFZGl0UGFydCBjaGlsZCkgewotCQlpbnQgZHggPSAoKEludGVnZXIpIFZpZXdVdGlsLmdldFN0cnVjdHVyYWxGZWF0dXJlVmFsdWUoKFZpZXcpIGNoaWxkCi0JCQkJLmdldE1vZGVsKCksIE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TG9jYXRpb25fWCgpKSkKLQkJCQkuaW50VmFsdWUoKTsKLQkJaW50IGR5ID0gKChJbnRlZ2VyKSBWaWV3VXRpbC5nZXRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlKChWaWV3KSBjaGlsZAotCQkJCS5nZXRNb2RlbCgpLCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldExvY2F0aW9uX1koKSkpCi0JCQkJLmludFZhbHVlKCk7Ci0JCVJlY3RhbmdsZSByID0gbmV3IFJlY3RhbmdsZShkeCwgZHksIDAsIDApOwotCQljaGlsZC5nZXRGaWd1cmUoKS50cmFuc2xhdGVUb0Fic29sdXRlKHIpOwotCQlyLnRyYW5zbGF0ZShyZXF1ZXN0LmdldE1vdmVEZWx0YSgpKTsKLQkJY2hpbGQuZ2V0RmlndXJlKCkudHJhbnNsYXRlVG9SZWxhdGl2ZShyKTsKLQkJcmV0dXJuIHI7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHVuZGVyc3RhbmRzUmVxdWVzdChSZXF1ZXN0IHJlcSkgewotCQlpZiAocmVhbExheW91dEVkaXRQb2xpY3kgIT0gbnVsbAotCQkJCSYmIHJlYWxMYXlvdXRFZGl0UG9saWN5LnVuZGVyc3RhbmRzUmVxdWVzdChyZXEpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gc3VwZXIudW5kZXJzdGFuZHNSZXF1ZXN0KHJlcSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRlY29yYXRlQ2hpbGQoRWRpdFBhcnQgY2hpbGQpIHsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SG9zdChFZGl0UGFydCBob3N0KSB7Ci0JCXN1cGVyLnNldEhvc3QoaG9zdCk7Ci0JCWlmIChyZWFsTGF5b3V0RWRpdFBvbGljeSAhPSBudWxsKSB7Ci0JCQlyZWFsTGF5b3V0RWRpdFBvbGljeS5zZXRIb3N0KGhvc3QpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGFjdGl2YXRlKCkgewotCQlzdXBlci5hY3RpdmF0ZSgpOwotCQlpZiAocmVhbExheW91dEVkaXRQb2xpY3kgIT0gbnVsbCkgewotCQkJcmVhbExheW91dEVkaXRQb2xpY3kuYWN0aXZhdGUoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBkZWFjdGl2YXRlKCkgewotCQlzdXBlci5kZWFjdGl2YXRlKCk7Ci0JCWlmIChyZWFsTGF5b3V0RWRpdFBvbGljeSAhPSBudWxsKSB7Ci0JCQlyZWFsTGF5b3V0RWRpdFBvbGljeS5kZWFjdGl2YXRlKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVkaXRQYXJ0IGdldFRhcmdldEVkaXRQYXJ0KFJlcXVlc3QgcmVxdWVzdCkgewotCQlpZiAocmVhbExheW91dEVkaXRQb2xpY3kgIT0gbnVsbCkgewotCQkJcmV0dXJuIHJlYWxMYXlvdXRFZGl0UG9saWN5LmdldFRhcmdldEVkaXRQYXJ0KHJlcXVlc3QpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIHN1cGVyLmdldFRhcmdldEVkaXRQYXJ0KHJlcXVlc3QpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNob3dTb3VyY2VGZWVkYmFjayhSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJaWYgKHJlYWxMYXlvdXRFZGl0UG9saWN5ICE9IG51bGwpIHsKLQkJCXJlYWxMYXlvdXRFZGl0UG9saWN5LnNob3dTb3VyY2VGZWVkYmFjayhyZXF1ZXN0KTsKLQkJfSBlbHNlIHsKLQkJCXN1cGVyLnNob3dTb3VyY2VGZWVkYmFjayhyZXF1ZXN0KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlcmFzZVNvdXJjZUZlZWRiYWNrKFJlcXVlc3QgcmVxdWVzdCkgewotCQlpZiAocmVhbExheW91dEVkaXRQb2xpY3kgIT0gbnVsbCkgewotCQkJcmVhbExheW91dEVkaXRQb2xpY3kuZXJhc2VTb3VyY2VGZWVkYmFjayhyZXF1ZXN0KTsKLQkJfSBlbHNlIHsKLQkJCXN1cGVyLmVyYXNlU291cmNlRmVlZGJhY2socmVxdWVzdCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2hvd1RhcmdldEZlZWRiYWNrKFJlcXVlc3QgcmVxdWVzdCkgewotCQlpZiAocmVhbExheW91dEVkaXRQb2xpY3kgIT0gbnVsbCkgewotCQkJcmVhbExheW91dEVkaXRQb2xpY3kuc2hvd1RhcmdldEZlZWRiYWNrKHJlcXVlc3QpOwotCQl9IGVsc2UgewotCQkJc3VwZXIuc2hvd1RhcmdldEZlZWRiYWNrKHJlcXVlc3QpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVyYXNlVGFyZ2V0RmVlZGJhY2soUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCWlmIChyZWFsTGF5b3V0RWRpdFBvbGljeSAhPSBudWxsKSB7Ci0JCQlyZWFsTGF5b3V0RWRpdFBvbGljeS5lcmFzZVRhcmdldEZlZWRiYWNrKHJlcXVlc3QpOwotCQl9IGVsc2UgewotCQkJc3VwZXIuZXJhc2VUYXJnZXRGZWVkYmFjayhyZXF1ZXN0KTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvZWRpdC9wb2xpY2llcy9EaWFncmFtR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvZWRpdC9wb2xpY2llcy9EaWFncmFtR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTUxZDVjNS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL2VkaXQvcG9saWNpZXMvRGlhZ3JhbUdyYXBoaWNhbE5vZGVFZGl0UG9saWN5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLmVkaXQucG9saWNpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLkNyZWF0ZUNvbm5lY3Rpb25SZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi5jb3JlLmNvbW1hbmQuQ29tcG9zaXRlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuZWRpdGhlbHBlcnMuQ3JlYXRlRWxlbWVudFJlcXVlc3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuY29tbWFuZHMuSUNvbW1hbmRQcm94eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JR3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXF1ZXN0cy5DcmVhdGVDb25uZWN0aW9uVmlld0FuZEVsZW1lbnRSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuSUVsZW1lbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQuZWRpdC5jb21tYW5kcy5EaWFncmFtUmVvcmllbnRDb25uZWN0aW9uVmlld0NvbW1hbmQ7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRGlhZ3JhbUdyYXBoaWNhbE5vZGVFZGl0UG9saWN5IGV4dGVuZHMgR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJRWxlbWVudFR5cGUgZ2V0RWxlbWVudFR5cGUoQ3JlYXRlQ29ubmVjdGlvblJlcXVlc3QgcmVxdWVzdCkgewotCQlpZiAocmVxdWVzdCBpbnN0YW5jZW9mIENyZWF0ZUNvbm5lY3Rpb25WaWV3QW5kRWxlbWVudFJlcXVlc3QpIHsKLQkJCUNyZWF0ZUVsZW1lbnRSZXF1ZXN0QWRhcHRlciByZXF1ZXN0QWRhcHRlciA9ICgoQ3JlYXRlQ29ubmVjdGlvblZpZXdBbmRFbGVtZW50UmVxdWVzdCkgcmVxdWVzdCkKLQkJCQkJLmdldENvbm5lY3Rpb25WaWV3QW5kRWxlbWVudERlc2NyaXB0b3IoKQotCQkJCQkuZ2V0Q3JlYXRlRWxlbWVudFJlcXVlc3RBZGFwdGVyKCk7Ci0JCQlyZXR1cm4gKElFbGVtZW50VHlwZSkgcmVxdWVzdEFkYXB0ZXIuZ2V0QWRhcHRlcihJRWxlbWVudFR5cGUuY2xhc3MpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDb25uZWN0aW9uV2l0aFJlb3JpZW50ZWRWaWV3Q29tcGxldGVDb21tYW5kKAotCQkJQ3JlYXRlQ29ubmVjdGlvblJlcXVlc3QgcmVxdWVzdCkgewotCQlJQ29tbWFuZFByb3h5IGMgPSAoSUNvbW1hbmRQcm94eSkgc3VwZXIKLQkJCQkuZ2V0Q29ubmVjdGlvbkNvbXBsZXRlQ29tbWFuZChyZXF1ZXN0KTsKLQkJQ29tcG9zaXRlQ29tbWFuZCBjYyA9IChDb21wb3NpdGVDb21tYW5kKSBjLmdldElDb21tYW5kKCk7Ci0JCVRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIGVkaXRpbmdEb21haW4gPSAoKElHcmFwaGljYWxFZGl0UGFydCkgZ2V0SG9zdCgpKQotCQkJCS5nZXRFZGl0aW5nRG9tYWluKCk7Ci0JCURpYWdyYW1SZW9yaWVudENvbm5lY3Rpb25WaWV3Q29tbWFuZCByY3ZDb21tYW5kID0gbmV3IERpYWdyYW1SZW9yaWVudENvbm5lY3Rpb25WaWV3Q29tbWFuZCgKLQkJCQllZGl0aW5nRG9tYWluLCBudWxsKTsKLQkJcmN2Q29tbWFuZC5zZXRFZGdlQWRhcHRvcihnZXRWaWV3QWRhcHRlcigpKTsKLQkJY2MuY29tcG9zZShyY3ZDb21tYW5kKTsKLQkJcmV0dXJuIGM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9lZGl0L3BvbGljaWVzL0RpYWdyYW1SZWZlcmVuY2VDb25uZWN0aW9uRWRpdFBvbGljeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9lZGl0L3BvbGljaWVzL0RpYWdyYW1SZWZlcmVuY2VDb25uZWN0aW9uRWRpdFBvbGljeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZWU3NDM0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvZWRpdC9wb2xpY2llcy9EaWFncmFtUmVmZXJlbmNlQ29ubmVjdGlvbkVkaXRQb2xpY3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLmVkaXQucG9saWNpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21wb3VuZENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLlVuZXhlY3V0YWJsZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwYXJ0cy5BYnN0cmFjdENvbm5lY3Rpb25FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLkNvbm5lY3Rpb25FZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5yZXF1ZXN0cy5Hcm91cFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5JQ29tbWFuZFByb3h5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLkdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklHcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmwxMG4uRGlhZ3JhbVVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wcmVmZXJlbmNlcy5JUHJlZmVyZW5jZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlcXVlc3RzLkVkaXRDb21tYW5kUmVxdWVzdFdyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXF1ZXN0cy5Hcm91cFJlcXVlc3RWaWFLZXlib2FyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkRlc3Ryb3lFbGVtZW50UmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2dXaXRoVG9nZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLkFzc2VydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERpYWdyYW1SZWZlcmVuY2VDb25uZWN0aW9uRWRpdFBvbGljeSBleHRlbmRzIENvbm5lY3Rpb25FZGl0UG9saWN5IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVMRVRFX0ZST01fRElBR1JBTV9ETEdfVElUTEUgPSBEaWFncmFtVUlNZXNzYWdlcy5Qcm9tcHRpbmdEZWxldGVBY3Rpb25fRGVsZXRlRnJvbURpYWdyYW1EaWFsb2dfVGl0bGU7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFTEVURV9GUk9NX0RJQUdSQU1fRExHX01FU1NBR0UgPSBEaWFncmFtVUlNZXNzYWdlcy5Qcm9tcHRpbmdEZWxldGVBY3Rpb25fRGVsZXRlRnJvbURpYWdyYW1EaWFsb2dfTWVzc2FnZTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVMRVRFX0ZST01fTU9ERUxfRExHX1RPR0dMRV9MQUJFTCA9IERpYWdyYW1VSU1lc3NhZ2VzLk1lc3NhZ2VEaWFsb2dXaXRoVG9nZ2xlX0RvTm90UHJvbXB0QWdhaW5Ub2dnbGVfbGFiZWw7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIENvbW1hbmQgZ2V0RGVsZXRlQ29tbWFuZChHcm91cFJlcXVlc3QgZGVsZXRlUmVxdWVzdCkgewotCQlib29sZWFuIGlzRGVsZXRlRnJvbUtleUJvYXJkID0gZGVsZXRlUmVxdWVzdCBpbnN0YW5jZW9mIEdyb3VwUmVxdWVzdFZpYUtleWJvYXJkOwotCQlpZiAoc2hvdWxkRGVsZXRlU2VtYW50aWMoKSkgewotCQkJcmV0dXJuIGNyZWF0ZURlbGV0ZVNlbWFudGljQ29tbWFuZChkZWxldGVSZXF1ZXN0KTsKLQkJfSBlbHNlIHsKLQkJCWJvb2xlYW4gcHJvY2VlZFRvRGVsZXRlVmlldyA9IHRydWU7Ci0JCQlpZiAoaXNEZWxldGVGcm9tS2V5Qm9hcmQpIHsKLQkJCQlHcm91cFJlcXVlc3RWaWFLZXlib2FyZCBncm91cFJlcXVlc3RWaWFLZXlib2FyZCA9IChHcm91cFJlcXVlc3RWaWFLZXlib2FyZCkgZGVsZXRlUmVxdWVzdDsKLQkJCQlpZiAoZ3JvdXBSZXF1ZXN0VmlhS2V5Ym9hcmQuaXNTaG93SW5mb3JtYXRpb25EaWFsb2coKSkgewotCQkJCQlwcm9jZWVkVG9EZWxldGVWaWV3ID0gc2hvd1Byb21wdCgpOwotCQkJCQlncm91cFJlcXVlc3RWaWFLZXlib2FyZC5zZXRTaG93SW5mb3JtYXRpb25EaWFsb2coZmFsc2UpOwotCQkJCQlpZiAoIShwcm9jZWVkVG9EZWxldGVWaWV3KSkKLQkJCQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBjcmVhdGVEZWxldGVWaWV3Q29tbWFuZChkZWxldGVSZXF1ZXN0KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBzaG91bGREZWxldGVTZW1hbnRpYygpIHsKLQkJQXNzZXJ0LmlzVHJ1ZShnZXRIb3N0KCkgaW5zdGFuY2VvZiBBYnN0cmFjdENvbm5lY3Rpb25FZGl0UGFydCk7Ci0JCUFic3RyYWN0Q29ubmVjdGlvbkVkaXRQYXJ0IGNlcCA9IChBYnN0cmFjdENvbm5lY3Rpb25FZGl0UGFydCkgZ2V0SG9zdCgpOwotCQlib29sZWFuIGlzQ2Fub25pY2FsID0gZmFsc2U7Ci0JCWlmIChjZXAuZ2V0U291cmNlKCkgIT0gbnVsbCkKLQkJCWlzQ2Fub25pY2FsID0gSXNDYW5vbmljYWwoY2VwLmdldFNvdXJjZSgpKTsKLQkJaWYgKGNlcC5nZXRUYXJnZXQoKSAhPSBudWxsKQotCQkJcmV0dXJuIGlzQ2Fub25pY2FsID8gaXNDYW5vbmljYWwgOiBJc0Nhbm9uaWNhbChjZXAuZ2V0VGFyZ2V0KCkpOwotCQlyZXR1cm4gaXNDYW5vbmljYWw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBJc0Nhbm9uaWNhbChFZGl0UGFydCBlcCkgewotCQlFZGl0UGFydCBwYXJlbnQgPSBlcC5nZXRQYXJlbnQoKTsKLQkJcmV0dXJuIHBhcmVudCBpbnN0YW5jZW9mIEdyYXBoaWNhbEVkaXRQYXJ0ID8gKChHcmFwaGljYWxFZGl0UGFydCkgcGFyZW50KQotCQkJCS5pc0Nhbm9uaWNhbCgpCi0JCQkJOiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgY3JlYXRlRGVsZXRlVmlld0NvbW1hbmQoR3JvdXBSZXF1ZXN0IGRlbGV0ZVJlcXVlc3QpIHsKLQkJVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gZWRpdGluZ0RvbWFpbiA9ICgoSUdyYXBoaWNhbEVkaXRQYXJ0KSBnZXRIb3N0KCkpCi0JCQkJLmdldEVkaXRpbmdEb21haW4oKTsKLQkJcmV0dXJuIG5ldyBJQ29tbWFuZFByb3h5KG5ldyBEZWxldGVDb21tYW5kKGVkaXRpbmdEb21haW4sCi0JCQkJKFZpZXcpIGdldEhvc3QoKS5nZXRNb2RlbCgpKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGNyZWF0ZURlbGV0ZVNlbWFudGljQ29tbWFuZChHcm91cFJlcXVlc3QgZGVsZXRlUmVxdWVzdCkgewotCQlUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiBlZGl0aW5nRG9tYWluID0gKChJR3JhcGhpY2FsRWRpdFBhcnQpIGdldEhvc3QoKSkKLQkJCQkuZ2V0RWRpdGluZ0RvbWFpbigpOwotCQlFZGl0Q29tbWFuZFJlcXVlc3RXcmFwcGVyIHNlbVJlcSA9IG5ldyBFZGl0Q29tbWFuZFJlcXVlc3RXcmFwcGVyKAotCQkJCW5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoZWRpdGluZ0RvbWFpbiwgZmFsc2UpLCBkZWxldGVSZXF1ZXN0Ci0JCQkJCQkuZ2V0RXh0ZW5kZWREYXRhKCkpOwotCQlDb21tYW5kIHNlbWFudGljQ21kID0gZ2V0SG9zdCgpLmdldENvbW1hbmQoc2VtUmVxKTsKLQkJaWYgKHNlbWFudGljQ21kICE9IG51bGwgJiYgc2VtYW50aWNDbWQuY2FuRXhlY3V0ZSgpKSB7Ci0JCQlDb21wb3VuZENvbW1hbmQgY2MgPSBuZXcgQ29tcG91bmRDb21tYW5kKCk7Ci0JCQljYy5hZGQoc2VtYW50aWNDbWQpOwotCQkJcmV0dXJuIGNjOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gc2hvd1Byb21wdCgpIHsKLQkJYm9vbGVhbiBwcm9tcHQgPSAoKElQcmVmZXJlbmNlU3RvcmUpICgoSUdyYXBoaWNhbEVkaXRQYXJ0KSBnZXRIb3N0KCkpCi0JCQkJLmdldERpYWdyYW1QcmVmZXJlbmNlc0hpbnQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKSkKLQkJCQkuZ2V0Qm9vbGVhbihJUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX1BST01QVF9PTl9ERUxfRlJPTV9ESUFHUkFNKTsKLQkJaWYgKHByb21wdCkKLQkJCWlmIChzaG93TWVzc2FnZURpYWxvZygpKQotCQkJCXJldHVybiB0cnVlOwotCQkJZWxzZQotCQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBzaG93TWVzc2FnZURpYWxvZygpIHsKLQkJTWVzc2FnZURpYWxvZ1dpdGhUb2dnbGUgZGlhbG9nID0gTWVzc2FnZURpYWxvZ1dpdGhUb2dnbGUKLQkJCQkub3Blblllc05vUXVlc3Rpb24oRGlzcGxheS5nZXRDdXJyZW50KCkuZ2V0QWN0aXZlU2hlbGwoKSwKLQkJCQkJCURFTEVURV9GUk9NX0RJQUdSQU1fRExHX1RJVExFLAotCQkJCQkJREVMRVRFX0ZST01fRElBR1JBTV9ETEdfTUVTU0FHRSwKLQkJCQkJCURFTEVURV9GUk9NX01PREVMX0RMR19UT0dHTEVfTEFCRUwsIGZhbHNlLAotCQkJCQkJKElQcmVmZXJlbmNlU3RvcmUpICgoSUdyYXBoaWNhbEVkaXRQYXJ0KSBnZXRIb3N0KCkpCi0JCQkJCQkJCS5nZXREaWFncmFtUHJlZmVyZW5jZXNIaW50KCkKLQkJCQkJCQkJLmdldFByZWZlcmVuY2VTdG9yZSgpLAotCQkJCQkJSVByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9QUk9NUFRfT05fREVMX0ZST01fRElBR1JBTSk7Ci0JCWlmIChkaWFsb2cuZ2V0UmV0dXJuQ29kZSgpID09IElEaWFsb2dDb25zdGFudHMuWUVTX0lEKQotCQkJcmV0dXJuIHRydWU7Ci0JCWVsc2UKLQkJCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENvbW1hbmQgZ2V0Q29tbWFuZChSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJaWYgKHJlcXVlc3QgaW5zdGFuY2VvZiBHcm91cFJlcXVlc3RWaWFLZXlib2FyZCkgewotCQkJcmV0dXJuIGdldERlbGV0ZUNvbW1hbmQoKEdyb3VwUmVxdWVzdCkgcmVxdWVzdCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldENvbW1hbmQocmVxdWVzdCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9lZGl0L3BvbGljaWVzL0RpYWdyYW1UZXh0Tm9uUmVzaXphYmxlRWRpdFBvbGljeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9lZGl0L3BvbGljaWVzL0RpYWdyYW1UZXh0Tm9uUmVzaXphYmxlRWRpdFBvbGljeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYzg0ZTcxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvZWRpdC9wb2xpY2llcy9EaWFncmFtVGV4dE5vblJlc2l6YWJsZUVkaXRQb2xpY3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxMyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLmVkaXQucG9saWNpZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkNvbG9yQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5GaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkdyYXBoaWNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5MYXllckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuaGFuZGxlcy5Nb3ZlSGFuZGxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLk5vblJlc2l6YWJsZUVkaXRQb2xpY3lFeDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnRvb2xzLkRyYWdFZGl0UGFydHNUcmFja2VyRXg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERpYWdyYW1UZXh0Tm9uUmVzaXphYmxlRWRpdFBvbGljeSBleHRlbmRzIE5vblJlc2l6YWJsZUVkaXRQb2xpY3lFeCB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBJRmlndXJlIHNlbGVjdGlvbkZlZWRiYWNrRmlndXJlOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgSUZpZ3VyZSBmb2N1c0ZlZWRiYWNrRmlndXJlOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNob3dQcmltYXJ5U2VsZWN0aW9uKCkgewotCQlpZiAoZ2V0SG9zdEZpZ3VyZSgpIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQkoKFdyYXBMYWJlbCkgZ2V0SG9zdEZpZ3VyZSgpKS5zZXRTZWxlY3RlZCh0cnVlKTsKLQkJCSgoV3JhcExhYmVsKSBnZXRIb3N0RmlndXJlKCkpLnNldEZvY3VzKHRydWUpOwotCQl9IGVsc2UgewotCQkJc2hvd1NlbGVjdGlvbigpOwotCQkJc2hvd0ZvY3VzKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2hvd1NlbGVjdGlvbigpIHsKLQkJaWYgKGdldEhvc3RGaWd1cmUoKSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJKChXcmFwTGFiZWwpIGdldEhvc3RGaWd1cmUoKSkuc2V0U2VsZWN0ZWQodHJ1ZSk7Ci0JCQkoKFdyYXBMYWJlbCkgZ2V0SG9zdEZpZ3VyZSgpKS5zZXRGb2N1cyhmYWxzZSk7Ci0JCX0gZWxzZSB7Ci0JCQloaWRlU2VsZWN0aW9uKCk7Ci0JCQlhZGRGZWVkYmFjayhzZWxlY3Rpb25GZWVkYmFja0ZpZ3VyZSA9IGNyZWF0ZVNlbGVjdGlvbkZlZWRiYWNrRmlndXJlKCkpOwotCQkJcmVmcmVzaFNlbGVjdGlvbkZlZWRiYWNrKCk7Ci0JCQloaWRlRm9jdXMoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBoaWRlU2VsZWN0aW9uKCkgewotCQlpZiAoZ2V0SG9zdEZpZ3VyZSgpIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQkoKFdyYXBMYWJlbCkgZ2V0SG9zdEZpZ3VyZSgpKS5zZXRTZWxlY3RlZChmYWxzZSk7Ci0JCQkoKFdyYXBMYWJlbCkgZ2V0SG9zdEZpZ3VyZSgpKS5zZXRGb2N1cyhmYWxzZSk7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoc2VsZWN0aW9uRmVlZGJhY2tGaWd1cmUgIT0gbnVsbCkgewotCQkJCXJlbW92ZUZlZWRiYWNrKHNlbGVjdGlvbkZlZWRiYWNrRmlndXJlKTsKLQkJCQlzZWxlY3Rpb25GZWVkYmFja0ZpZ3VyZSA9IG51bGw7Ci0JCQl9Ci0JCQloaWRlRm9jdXMoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzaG93Rm9jdXMoKSB7Ci0JCWlmIChnZXRIb3N0RmlndXJlKCkgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCSgoV3JhcExhYmVsKSBnZXRIb3N0RmlndXJlKCkpLnNldEZvY3VzKHRydWUpOwotCQl9IGVsc2UgewotCQkJaGlkZUZvY3VzKCk7Ci0JCQlhZGRGZWVkYmFjayhmb2N1c0ZlZWRiYWNrRmlndXJlID0gY3JlYXRlRm9jdXNGZWVkYmFja0ZpZ3VyZSgpKTsKLQkJCXJlZnJlc2hGb2N1c0ZlZWRiYWNrKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaGlkZUZvY3VzKCkgewotCQlpZiAoZ2V0SG9zdEZpZ3VyZSgpIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQkoKFdyYXBMYWJlbCkgZ2V0SG9zdEZpZ3VyZSgpKS5zZXRGb2N1cyhmYWxzZSk7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoZm9jdXNGZWVkYmFja0ZpZ3VyZSAhPSBudWxsKSB7Ci0JCQkJcmVtb3ZlRmVlZGJhY2soZm9jdXNGZWVkYmFja0ZpZ3VyZSk7Ci0JCQkJZm9jdXNGZWVkYmFja0ZpZ3VyZSA9IG51bGw7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFJlY3RhbmdsZSBnZXRGZWVkYmFja0JvdW5kcygpIHsKLQkJUmVjdGFuZ2xlIGJvdW5kczsKLQkJaWYgKGdldEhvc3RGaWd1cmUoKSBpbnN0YW5jZW9mIExhYmVsKSB7Ci0JCQlib3VuZHMgPSAoKExhYmVsKSBnZXRIb3N0RmlndXJlKCkpLmdldFRleHRCb3VuZHMoKTsKLQkJCWJvdW5kcy5pbnRlcnNlY3QoZ2V0SG9zdEZpZ3VyZSgpLmdldEJvdW5kcygpKTsKLQkJfSBlbHNlIHsKLQkJCWJvdW5kcyA9IGdldEhvc3RGaWd1cmUoKS5nZXRCb3VuZHMoKS5nZXRDb3B5KCk7Ci0JCX0KLQkJZ2V0SG9zdEZpZ3VyZSgpLmdldFBhcmVudCgpLnRyYW5zbGF0ZVRvQWJzb2x1dGUoYm91bmRzKTsKLQkJZ2V0RmVlZGJhY2tMYXllcigpLnRyYW5zbGF0ZVRvUmVsYXRpdmUoYm91bmRzKTsKLQkJcmV0dXJuIGJvdW5kczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlU2VsZWN0aW9uRmVlZGJhY2tGaWd1cmUoKSB7Ci0JCWlmIChnZXRIb3N0RmlndXJlKCkgaW5zdGFuY2VvZiBMYWJlbCkgewotCQkJTGFiZWwgZmVlZGJhY2tGaWd1cmUgPSBuZXcgTGFiZWwoKTsKLQkJCWZlZWRiYWNrRmlndXJlLnNldE9wYXF1ZSh0cnVlKTsKLQkJCWZlZWRiYWNrRmlndXJlCi0JCQkJCS5zZXRCYWNrZ3JvdW5kQ29sb3IoQ29sb3JDb25zdGFudHMubWVudUJhY2tncm91bmRTZWxlY3RlZCk7Ci0JCQlmZWVkYmFja0ZpZ3VyZQotCQkJCQkuc2V0Rm9yZWdyb3VuZENvbG9yKENvbG9yQ29uc3RhbnRzLm1lbnVGb3JlZ3JvdW5kU2VsZWN0ZWQpOwotCQkJcmV0dXJuIGZlZWRiYWNrRmlndXJlOwotCQl9IGVsc2UgewotCQkJUmVjdGFuZ2xlRmlndXJlIGZlZWRiYWNrRmlndXJlID0gbmV3IFJlY3RhbmdsZUZpZ3VyZSgpOwotCQkJZmVlZGJhY2tGaWd1cmUuc2V0RmlsbChmYWxzZSk7Ci0JCQlyZXR1cm4gZmVlZGJhY2tGaWd1cmU7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlRm9jdXNGZWVkYmFja0ZpZ3VyZSgpIHsKLQkJcmV0dXJuIG5ldyBGaWd1cmUoKSB7Ci0KLQkJCXByb3RlY3RlZCB2b2lkIHBhaW50RmlndXJlKEdyYXBoaWNzIGdyYXBoaWNzKSB7Ci0JCQkJZ3JhcGhpY3MuZHJhd0ZvY3VzKGdldEJvdW5kcygpLmdldFJlc2l6ZWQoLTEsIC0xKSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZUxhYmVsKExhYmVsIHRhcmdldCkgewotCQlMYWJlbCBzb3VyY2UgPSAoTGFiZWwpIGdldEhvc3RGaWd1cmUoKTsKLQkJdGFyZ2V0LnNldFRleHQoc291cmNlLmdldFRleHQoKSk7Ci0JCXRhcmdldC5zZXRUZXh0QWxpZ25tZW50KHNvdXJjZS5nZXRUZXh0QWxpZ25tZW50KCkpOwotCQl0YXJnZXQuc2V0Rm9udChzb3VyY2UuZ2V0Rm9udCgpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFNlbGVjdGlvbkZlZWRiYWNrKCkgewotCQlpZiAoc2VsZWN0aW9uRmVlZGJhY2tGaWd1cmUgIT0gbnVsbCkgewotCQkJaWYgKHNlbGVjdGlvbkZlZWRiYWNrRmlndXJlIGluc3RhbmNlb2YgTGFiZWwpIHsKLQkJCQl1cGRhdGVMYWJlbCgoTGFiZWwpIHNlbGVjdGlvbkZlZWRiYWNrRmlndXJlKTsKLQkJCQlzZWxlY3Rpb25GZWVkYmFja0ZpZ3VyZS5zZXRCb3VuZHMoZ2V0RmVlZGJhY2tCb3VuZHMoKSk7Ci0JCQl9IGVsc2UgewotCQkJCXNlbGVjdGlvbkZlZWRiYWNrRmlndXJlLnNldEJvdW5kcyhnZXRGZWVkYmFja0JvdW5kcygpLmV4cGFuZCg1LAotCQkJCQkJNSkpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hGb2N1c0ZlZWRiYWNrKCkgewotCQlpZiAoZm9jdXNGZWVkYmFja0ZpZ3VyZSAhPSBudWxsKSB7Ci0JCQlmb2N1c0ZlZWRiYWNrRmlndXJlLnNldEJvdW5kcyhnZXRGZWVkYmFja0JvdW5kcygpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWZyZXNoRmVlZGJhY2soKSB7Ci0JCXJlZnJlc2hTZWxlY3Rpb25GZWVkYmFjaygpOwotCQlyZWZyZXNoRm9jdXNGZWVkYmFjaygpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBjcmVhdGVTZWxlY3Rpb25IYW5kbGVzKCkgewotCQlNb3ZlSGFuZGxlIG1vdmVIYW5kbGUgPSBuZXcgTW92ZUhhbmRsZSgoR3JhcGhpY2FsRWRpdFBhcnQpIGdldEhvc3QoKSk7Ci0JCW1vdmVIYW5kbGUuc2V0Qm9yZGVyKG51bGwpOwotCQltb3ZlSGFuZGxlLnNldERyYWdUcmFja2VyKG5ldyBEcmFnRWRpdFBhcnRzVHJhY2tlckV4KGdldEhvc3QoKSkpOwotCQlyZXR1cm4gQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChtb3ZlSGFuZGxlKTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL2VkaXQvcG9saWNpZXMvRGlhZ3JhbVRleHRTZWxlY3Rpb25FZGl0UG9saWN5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL2VkaXQvcG9saWNpZXMvRGlhZ3JhbVRleHRTZWxlY3Rpb25FZGl0UG9saWN5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwOGQzOTguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9lZGl0L3BvbGljaWVzL0RpYWdyYW1UZXh0U2VsZWN0aW9uRWRpdFBvbGljeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQuZWRpdC5wb2xpY2llczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Db2xvckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5HcmFwaGljczsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5MYXllckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLlNlbGVjdGlvbkVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERpYWdyYW1UZXh0U2VsZWN0aW9uRWRpdFBvbGljeSBleHRlbmRzIFNlbGVjdGlvbkVkaXRQb2xpY3kgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgSUZpZ3VyZSBzZWxlY3Rpb25GZWVkYmFja0ZpZ3VyZTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIElGaWd1cmUgZm9jdXNGZWVkYmFja0ZpZ3VyZTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzaG93UHJpbWFyeVNlbGVjdGlvbigpIHsKLQkJaWYgKGdldEhvc3RGaWd1cmUoKSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJKChXcmFwTGFiZWwpIGdldEhvc3RGaWd1cmUoKSkuc2V0U2VsZWN0ZWQodHJ1ZSk7Ci0JCQkoKFdyYXBMYWJlbCkgZ2V0SG9zdEZpZ3VyZSgpKS5zZXRGb2N1cyh0cnVlKTsKLQkJfSBlbHNlIHsKLQkJCXNob3dTZWxlY3Rpb24oKTsKLQkJCXNob3dGb2N1cygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNob3dTZWxlY3Rpb24oKSB7Ci0JCWlmIChnZXRIb3N0RmlndXJlKCkgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCSgoV3JhcExhYmVsKSBnZXRIb3N0RmlndXJlKCkpLnNldFNlbGVjdGVkKHRydWUpOwotCQkJKChXcmFwTGFiZWwpIGdldEhvc3RGaWd1cmUoKSkuc2V0Rm9jdXMoZmFsc2UpOwotCQl9IGVsc2UgewotCQkJaGlkZVNlbGVjdGlvbigpOwotCQkJYWRkRmVlZGJhY2soc2VsZWN0aW9uRmVlZGJhY2tGaWd1cmUgPSBjcmVhdGVTZWxlY3Rpb25GZWVkYmFja0ZpZ3VyZSgpKTsKLQkJCXJlZnJlc2hTZWxlY3Rpb25GZWVkYmFjaygpOwotCQkJaGlkZUZvY3VzKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaGlkZVNlbGVjdGlvbigpIHsKLQkJaWYgKGdldEhvc3RGaWd1cmUoKSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJKChXcmFwTGFiZWwpIGdldEhvc3RGaWd1cmUoKSkuc2V0U2VsZWN0ZWQoZmFsc2UpOwotCQkJKChXcmFwTGFiZWwpIGdldEhvc3RGaWd1cmUoKSkuc2V0Rm9jdXMoZmFsc2UpOwotCQl9IGVsc2UgewotCQkJaWYgKHNlbGVjdGlvbkZlZWRiYWNrRmlndXJlICE9IG51bGwpIHsKLQkJCQlyZW1vdmVGZWVkYmFjayhzZWxlY3Rpb25GZWVkYmFja0ZpZ3VyZSk7Ci0JCQkJc2VsZWN0aW9uRmVlZGJhY2tGaWd1cmUgPSBudWxsOwotCQkJfQotCQkJaGlkZUZvY3VzKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2hvd0ZvY3VzKCkgewotCQlpZiAoZ2V0SG9zdEZpZ3VyZSgpIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQkoKFdyYXBMYWJlbCkgZ2V0SG9zdEZpZ3VyZSgpKS5zZXRGb2N1cyh0cnVlKTsKLQkJfSBlbHNlIHsKLQkJCWhpZGVGb2N1cygpOwotCQkJYWRkRmVlZGJhY2soZm9jdXNGZWVkYmFja0ZpZ3VyZSA9IGNyZWF0ZUZvY3VzRmVlZGJhY2tGaWd1cmUoKSk7Ci0JCQlyZWZyZXNoRm9jdXNGZWVkYmFjaygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGhpZGVGb2N1cygpIHsKLQkJaWYgKGdldEhvc3RGaWd1cmUoKSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJKChXcmFwTGFiZWwpIGdldEhvc3RGaWd1cmUoKSkuc2V0Rm9jdXMoZmFsc2UpOwotCQl9IGVsc2UgewotCQkJaWYgKGZvY3VzRmVlZGJhY2tGaWd1cmUgIT0gbnVsbCkgewotCQkJCXJlbW92ZUZlZWRiYWNrKGZvY3VzRmVlZGJhY2tGaWd1cmUpOwotCQkJCWZvY3VzRmVlZGJhY2tGaWd1cmUgPSBudWxsOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBSZWN0YW5nbGUgZ2V0RmVlZGJhY2tCb3VuZHMoKSB7Ci0JCVJlY3RhbmdsZSBib3VuZHM7Ci0JCWlmIChnZXRIb3N0RmlndXJlKCkgaW5zdGFuY2VvZiBMYWJlbCkgewotCQkJYm91bmRzID0gKChMYWJlbCkgZ2V0SG9zdEZpZ3VyZSgpKS5nZXRUZXh0Qm91bmRzKCk7Ci0JCQlib3VuZHMuaW50ZXJzZWN0KGdldEhvc3RGaWd1cmUoKS5nZXRCb3VuZHMoKSk7Ci0JCX0gZWxzZSB7Ci0JCQlib3VuZHMgPSBnZXRIb3N0RmlndXJlKCkuZ2V0Qm91bmRzKCkuZ2V0Q29weSgpOwotCQl9Ci0JCWdldEhvc3RGaWd1cmUoKS5nZXRQYXJlbnQoKS50cmFuc2xhdGVUb0Fic29sdXRlKGJvdW5kcyk7Ci0JCWdldEZlZWRiYWNrTGF5ZXIoKS50cmFuc2xhdGVUb1JlbGF0aXZlKGJvdW5kcyk7Ci0JCXJldHVybiBib3VuZHM7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZVNlbGVjdGlvbkZlZWRiYWNrRmlndXJlKCkgewotCQlpZiAoZ2V0SG9zdEZpZ3VyZSgpIGluc3RhbmNlb2YgTGFiZWwpIHsKLQkJCUxhYmVsIGZlZWRiYWNrRmlndXJlID0gbmV3IExhYmVsKCk7Ci0JCQlmZWVkYmFja0ZpZ3VyZS5zZXRPcGFxdWUodHJ1ZSk7Ci0JCQlmZWVkYmFja0ZpZ3VyZQotCQkJCQkuc2V0QmFja2dyb3VuZENvbG9yKENvbG9yQ29uc3RhbnRzLm1lbnVCYWNrZ3JvdW5kU2VsZWN0ZWQpOwotCQkJZmVlZGJhY2tGaWd1cmUKLQkJCQkJLnNldEZvcmVncm91bmRDb2xvcihDb2xvckNvbnN0YW50cy5tZW51Rm9yZWdyb3VuZFNlbGVjdGVkKTsKLQkJCXJldHVybiBmZWVkYmFja0ZpZ3VyZTsKLQkJfSBlbHNlIHsKLQkJCVJlY3RhbmdsZUZpZ3VyZSBmZWVkYmFja0ZpZ3VyZSA9IG5ldyBSZWN0YW5nbGVGaWd1cmUoKTsKLQkJCWZlZWRiYWNrRmlndXJlLnNldEZpbGwoZmFsc2UpOwotCQkJcmV0dXJuIGZlZWRiYWNrRmlndXJlOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZUZvY3VzRmVlZGJhY2tGaWd1cmUoKSB7Ci0JCXJldHVybiBuZXcgRmlndXJlKCkgewotCi0JCQlwcm90ZWN0ZWQgdm9pZCBwYWludEZpZ3VyZShHcmFwaGljcyBncmFwaGljcykgewotCQkJCWdyYXBoaWNzLmRyYXdGb2N1cyhnZXRCb3VuZHMoKS5nZXRSZXNpemVkKC0xLCAtMSkpOwotCQkJfQotCQl9OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVMYWJlbChMYWJlbCB0YXJnZXQpIHsKLQkJTGFiZWwgc291cmNlID0gKExhYmVsKSBnZXRIb3N0RmlndXJlKCk7Ci0JCXRhcmdldC5zZXRUZXh0KHNvdXJjZS5nZXRUZXh0KCkpOwotCQl0YXJnZXQuc2V0VGV4dEFsaWdubWVudChzb3VyY2UuZ2V0VGV4dEFsaWdubWVudCgpKTsKLQkJdGFyZ2V0LnNldEZvbnQoc291cmNlLmdldEZvbnQoKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hTZWxlY3Rpb25GZWVkYmFjaygpIHsKLQkJaWYgKHNlbGVjdGlvbkZlZWRiYWNrRmlndXJlICE9IG51bGwpIHsKLQkJCWlmIChzZWxlY3Rpb25GZWVkYmFja0ZpZ3VyZSBpbnN0YW5jZW9mIExhYmVsKSB7Ci0JCQkJdXBkYXRlTGFiZWwoKExhYmVsKSBzZWxlY3Rpb25GZWVkYmFja0ZpZ3VyZSk7Ci0JCQkJc2VsZWN0aW9uRmVlZGJhY2tGaWd1cmUuc2V0Qm91bmRzKGdldEZlZWRiYWNrQm91bmRzKCkpOwotCQkJfSBlbHNlIHsKLQkJCQlzZWxlY3Rpb25GZWVkYmFja0ZpZ3VyZS5zZXRCb3VuZHMoZ2V0RmVlZGJhY2tCb3VuZHMoKS5leHBhbmQoNSwKLQkJCQkJCTUpKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoRm9jdXNGZWVkYmFjaygpIHsKLQkJaWYgKGZvY3VzRmVlZGJhY2tGaWd1cmUgIT0gbnVsbCkgewotCQkJZm9jdXNGZWVkYmFja0ZpZ3VyZS5zZXRCb3VuZHMoZ2V0RmVlZGJhY2tCb3VuZHMoKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgcmVmcmVzaEZlZWRiYWNrKCkgewotCQlyZWZyZXNoU2VsZWN0aW9uRmVlZGJhY2soKTsKLQkJcmVmcmVzaEZvY3VzRmVlZGJhY2soKTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL2VkaXQvcG9saWNpZXMvTGlua0l0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvZWRpdC9wb2xpY2llcy9MaW5rSXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NmY1OGNmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvZWRpdC9wb2xpY2llcy9MaW5rSXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5lZGl0LnBvbGljaWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLmNvbW1hbmRzLkRlc3Ryb3lFbGVtZW50Q29tbWFuZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuRGVzdHJveUVsZW1lbnRSZXF1ZXN0OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIExpbmtJdGVtU2VtYW50aWNFZGl0UG9saWN5IGV4dGVuZHMKLQkJRGlhZ3JhbUJhc2VJdGVtU2VtYW50aWNFZGl0UG9saWN5IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXREZXN0cm95RWxlbWVudENvbW1hbmQoRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHJlcSkgewotCQlyZXR1cm4gZ2V0TVNMV3JhcHBlcihuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKHJlcSkpOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvZWRpdC9wb2xpY2llcy9Xb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtQ2Fub25pY2FsRWRpdFBvbGljeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9lZGl0L3BvbGljaWVzL1dvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW1DYW5vbmljYWxFZGl0UG9saWN5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3YzExNDIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9lZGl0L3BvbGljaWVzL1dvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW1DYW5vbmljYWxFZGl0UG9saWN5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NzMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5lZGl0LnBvbGljaWVzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUucGFydC51dGlsLkRpYWdyYW1FZGl0b3JVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTW9kZWxQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Xb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQuZWRpdC5wYXJ0cy5MaW5rRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5lZGl0LnBhcnRzLldvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW1FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLmVkaXQucGFydHMuV29ya1Byb2R1Y3ROb2RlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5wYXJ0LkRpYWdyYW1WaXN1YWxJRFJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQucHJvdmlkZXJzLkRpYWdyYW1FbGVtZW50VHlwZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS51dGlsLlZpZXdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuY29tbWFuZHMuRGVmZXJyZWRMYXlvdXRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuY29tbWFuZHMuSUNvbW1hbmRQcm94eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5EaWFncmFtRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkNhbm9uaWNhbENvbm5lY3Rpb25FZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVxdWVzdHMuQ3JlYXRlQ29ubmVjdGlvblZpZXdSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVxdWVzdHMuUmVxdWVzdENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29yZS51dGlsLkVPYmplY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuSUVsZW1lbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkRpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRWRnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFdvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW1DYW5vbmljYWxFZGl0UG9saWN5IGV4dGVuZHMKLQkJQ2Fub25pY2FsQ29ubmVjdGlvbkVkaXRQb2xpY3kgewotCQotCUBPdmVycmlkZQotCXB1YmxpYyBFT2JqZWN0IGdldFNlbWFudGljSG9zdCgpIHsKLQkJcmV0dXJuIGhvc3QoKS5nZXRNb2RlbCgpICE9IG51bGwgPyBzdXBlci5nZXRTZW1hbnRpY0hvc3QoKSA6IG51bGw7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hPbkFjdGl2YXRlKCkgewkJCi0JCXN1cGVyLnJlZnJlc2hPbkFjdGl2YXRlKCk7Ci0JCQotCQlFZGl0UGFydCBlcCA9IGdldEhvc3QoKTsKLQkJaWYoZXAgaW5zdGFuY2VvZiBEaWFncmFtRWRpdFBhcnQpIHsKLQkJCURpYWdyYW1FZGl0b3JVdGlsLmluaXRpYWxpemVPbkFjdGl2YXRlKChEaWFncmFtRWRpdFBhcnQpIGVwKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBnZXRTZW1hbnRpY0NoaWxkcmVuTGlzdCgpIHsKLQkJTGlzdCByZXN1bHQgPSBuZXcgTGlua2VkTGlzdCgpOwotCQlFT2JqZWN0IG1vZGVsT2JqZWN0ID0gKChWaWV3KSBnZXRIb3N0KCkuZ2V0TW9kZWwoKSkuZ2V0RWxlbWVudCgpOwotCQlWaWV3IHZpZXdPYmplY3QgPSAoVmlldykgZ2V0SG9zdCgpLmdldE1vZGVsKCk7Ci0JCUVPYmplY3QgbmV4dFZhbHVlOwotCQlpbnQgbm9kZVZJRDsKLQkJZm9yIChJdGVyYXRvciB2YWx1ZXMgPSAoKE5vZGVDb250YWluZXIpIG1vZGVsT2JqZWN0KS5nZXROb2RlcygpCi0JCQkJLml0ZXJhdG9yKCk7IHZhbHVlcy5oYXNOZXh0KCk7KSB7Ci0JCQluZXh0VmFsdWUgPSAoRU9iamVjdCkgdmFsdWVzLm5leHQoKTsKLQkJCW5vZGVWSUQgPSBEaWFncmFtVmlzdWFsSURSZWdpc3RyeS5nZXROb2RlVmlzdWFsSUQodmlld09iamVjdCwKLQkJCQkJbmV4dFZhbHVlKTsKLQkJCWlmIChXb3JrUHJvZHVjdE5vZGVFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZJRCkgewotCQkJCXJlc3VsdC5hZGQobmV4dFZhbHVlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIEBtb2RpZmllZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHNob3VsZERlbGV0ZVZpZXcoVmlldyB2aWV3KSB7Ci0JCXJldHVybiB2aWV3LmlzU2V0RWxlbWVudCgpCi0JCQkJJiYgdmlldy5nZXRFbGVtZW50KCkgIT0gbnVsbAotCQkJCSYmICh2aWV3LmdldEVsZW1lbnQoKS5lSXNQcm94eSgpIHx8IHZpZXcuZ2V0RWxlbWVudCgpIGluc3RhbmNlb2YgTm9kZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGVmYXVsdEZhY3RvcnlIaW50KCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBnZXRTZW1hbnRpY0Nvbm5lY3Rpb25zTGlzdCgpIHsKLQkJTGlzdCBjb25uZWN0aW9ucyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbSBkaWFncmFtID0gKFdvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW0pICgoVmlldykgZ2V0SG9zdCgpCi0JCQkJLmdldE1vZGVsKCkpLmdldEVsZW1lbnQoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZGlhZ3JhbS5nZXROb2RlcygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJTm9kZSBub2RlID0gKE5vZGUpIGl0ZXIubmV4dCgpOwotCQkJY29ubmVjdGlvbnMuYWRkQWxsKG5vZGUuZ2V0T3V0Z29pbmdDb25uZWN0aW9ucygpKTsKLQkJfQotCQlyZXR1cm4gY29ubmVjdGlvbnM7Ci0JfQotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJvdGVjdGVkIEVPYmplY3QgZ2V0U291cmNlRWxlbWVudChFT2JqZWN0IHJlbGF0aW9uc2hpcCkgewotCQlpZiAocmVsYXRpb25zaGlwIGluc3RhbmNlb2YgTGluaykgewotCQkJcmV0dXJuICgoTGluaykgcmVsYXRpb25zaGlwKS5nZXRTb3VyY2UoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRU9iamVjdCBnZXRUYXJnZXRFbGVtZW50KEVPYmplY3QgcmVsYXRpb25zaGlwKSB7Ci0JCWlmIChyZWxhdGlvbnNoaXAgaW5zdGFuY2VvZiBMaW5rKSB7Ci0JCQlyZXR1cm4gKChMaW5rKSByZWxhdGlvbnNoaXApLmdldFRhcmdldCgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBtb2RpZmllZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHNob3VsZEluY2x1ZGVDb25uZWN0aW9uKEVkZ2UgY29ubmVjdG9yLAotCQkJQ29sbGVjdGlvbiBjaGlsZHJlbikgewotCQlyZXR1cm4gc3VwZXIuc2hvdWxkSW5jbHVkZUNvbm5lY3Rpb24oY29ubmVjdG9yLCBjaGlsZHJlbik7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hTZW1hbnRpYygpIHsKLQkJTGlzdCBjcmVhdGVkVmlld3MgPSBuZXcgTGlua2VkTGlzdCgpOwotCQljcmVhdGVkVmlld3MuYWRkQWxsKHJlZnJlc2hTZW1hbnRpY0NoaWxkcmVuKCkpOwotCQlMaXN0IGNyZWF0ZWRDb25uZWN0aW9uVmlld3MgPSBuZXcgTGlua2VkTGlzdCgpOwotCQljcmVhdGVkQ29ubmVjdGlvblZpZXdzLmFkZEFsbChyZWZyZXNoU2VtYW50aWNDb25uZWN0aW9ucygpKTsKLQkJY3JlYXRlZENvbm5lY3Rpb25WaWV3cy5hZGRBbGwocmVmcmVzaENvbm5lY3Rpb25zKCkpOwotCi0JCWlmIChjcmVhdGVkVmlld3Muc2l6ZSgpID4gMSkgewotCQkJLy8gcGVyZm9ybSBhIGxheW91dCBvZiB0aGUgY29udGFpbmVyCi0JCQlEZWZlcnJlZExheW91dENvbW1hbmQgbGF5b3V0Q21kID0gbmV3IERlZmVycmVkTGF5b3V0Q29tbWFuZChob3N0KCkKLQkJCQkJLmdldEVkaXRpbmdEb21haW4oKSwgY3JlYXRlZFZpZXdzLCBob3N0KCkpOwotCQkJZXhlY3V0ZUNvbW1hbmQobmV3IElDb21tYW5kUHJveHkobGF5b3V0Q21kKSk7Ci0JCX0KLQotCQljcmVhdGVkVmlld3MuYWRkQWxsKGNyZWF0ZWRDb25uZWN0aW9uVmlld3MpOwotCQltYWtlVmlld3NJbW11dGFibGUoY3JlYXRlZFZpZXdzKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBDb2xsZWN0aW9uIG15TGlua0Rlc2NyaXB0b3JzID0gbmV3IExpbmtlZExpc3QoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIE1hcCBteUVPYmplY3QyVmlld01hcCA9IG5ldyBIYXNoTWFwKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBDb2xsZWN0aW9uIHJlZnJlc2hDb25uZWN0aW9ucygpIHsKLQkJdHJ5IHsKLQkJCWNvbGxlY3RBbGxMaW5rcyhnZXREaWFncmFtKCkpOwotCQkJQ29sbGVjdGlvbiBleGlzdGluZ0xpbmtzID0gbmV3IExpbmtlZExpc3QoZ2V0RGlhZ3JhbSgpLmdldEVkZ2VzKCkpOwotCQkJZm9yIChJdGVyYXRvciBkaWFncmFtTGlua3MgPSBleGlzdGluZ0xpbmtzLml0ZXJhdG9yKCk7IGRpYWdyYW1MaW5rcwotCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCUVkZ2UgbmV4dERpYWdyYW1MaW5rID0gKEVkZ2UpIGRpYWdyYW1MaW5rcy5uZXh0KCk7Ci0JCQkJRU9iamVjdCBkaWFncmFtTGlua09iamVjdCA9IG5leHREaWFncmFtTGluay5nZXRFbGVtZW50KCk7Ci0JCQkJRU9iamVjdCBkaWFncmFtTGlua1NyYyA9IG5leHREaWFncmFtTGluay5nZXRTb3VyY2UoKQotCQkJCQkJLmdldEVsZW1lbnQoKTsKLQkJCQlFT2JqZWN0IGRpYWdyYW1MaW5rRHN0ID0gbmV4dERpYWdyYW1MaW5rLmdldFRhcmdldCgpCi0JCQkJCQkuZ2V0RWxlbWVudCgpOwotCQkJCWludCBkaWFncmFtTGlua1Zpc3VhbElEID0gRGlhZ3JhbVZpc3VhbElEUmVnaXN0cnkKLQkJCQkJCS5nZXRWaXN1YWxJRChuZXh0RGlhZ3JhbUxpbmspOwotCQkJCWZvciAoSXRlcmF0b3IgbW9kZWxMaW5rRGVzY3JpcHRvcnMgPSBteUxpbmtEZXNjcmlwdG9ycwotCQkJCQkJLml0ZXJhdG9yKCk7IG1vZGVsTGlua0Rlc2NyaXB0b3JzLmhhc05leHQoKTspIHsKLQkJCQkJTGlua0Rlc2NyaXB0b3IgbmV4dExpbmtEZXNjcmlwdG9yID0gKExpbmtEZXNjcmlwdG9yKSBtb2RlbExpbmtEZXNjcmlwdG9ycwotCQkJCQkJCS5uZXh0KCk7Ci0JCQkJCWlmIChkaWFncmFtTGlua09iamVjdCA9PSBuZXh0TGlua0Rlc2NyaXB0b3IKLQkJCQkJCQkuZ2V0TGlua0VsZW1lbnQoKQotCQkJCQkJCSYmIGRpYWdyYW1MaW5rU3JjID09IG5leHRMaW5rRGVzY3JpcHRvci5nZXRTb3VyY2UoKQotCQkJCQkJCSYmIGRpYWdyYW1MaW5rRHN0ID09IG5leHRMaW5rRGVzY3JpcHRvcgotCQkJCQkJCQkJLmdldERlc3RpbmF0aW9uKCkKLQkJCQkJCQkmJiBkaWFncmFtTGlua1Zpc3VhbElEID09IG5leHRMaW5rRGVzY3JpcHRvcgotCQkJCQkJCQkJLmdldFZpc3VhbElEKCkpIHsKLQkJCQkJCWRpYWdyYW1MaW5rcy5yZW1vdmUoKTsKLQkJCQkJCW1vZGVsTGlua0Rlc2NyaXB0b3JzLnJlbW92ZSgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJZGVsZXRlVmlld3MoZXhpc3RpbmdMaW5rcy5pdGVyYXRvcigpKTsKLQkJCXJldHVybiBjcmVhdGVDb25uZWN0aW9ucyhteUxpbmtEZXNjcmlwdG9ycyk7Ci0JCX0gZmluYWxseSB7Ci0JCQlteUxpbmtEZXNjcmlwdG9ycy5jbGVhcigpOwotCQkJbXlFT2JqZWN0MlZpZXdNYXAuY2xlYXIoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHZvaWQgY29sbGVjdEFsbExpbmtzKFZpZXcgdmlldykgewotCQlFT2JqZWN0IG1vZGVsRWxlbWVudCA9IHZpZXcuZ2V0RWxlbWVudCgpOwotCQlpbnQgZGlhZ3JhbUVsZW1lbnRWaXN1YWxJRCA9IERpYWdyYW1WaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKHZpZXcpOwotCQlzd2l0Y2ggKGRpYWdyYW1FbGVtZW50VmlzdWFsSUQpIHsKLQkJY2FzZSBXb3JrUHJvZHVjdE5vZGVFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCWNhc2UgV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbUVkaXRQYXJ0LlZJU1VBTF9JRDogewotCQkJbXlFT2JqZWN0MlZpZXdNYXAucHV0KG1vZGVsRWxlbWVudCwgdmlldyk7Ci0JCQlzdG9yZUxpbmtzKG1vZGVsRWxlbWVudCwgZ2V0RGlhZ3JhbSgpKTsKLQkJfQotCQlkZWZhdWx0OiB7Ci0JCX0KLQkJCWZvciAoSXRlcmF0b3IgY2hpbGRyZW4gPSB2aWV3LmdldENoaWxkcmVuKCkuaXRlcmF0b3IoKTsgY2hpbGRyZW4KLQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQlWaWV3IGNoaWxkVmlldyA9IChWaWV3KSBjaGlsZHJlbi5uZXh0KCk7Ci0JCQkJY29sbGVjdEFsbExpbmtzKGNoaWxkVmlldyk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBDb2xsZWN0aW9uIGNyZWF0ZUNvbm5lY3Rpb25zKENvbGxlY3Rpb24gbGlua0Rlc2NyaXB0b3JzKSB7Ci0JCWlmIChsaW5rRGVzY3JpcHRvcnMuaXNFbXB0eSgpKSB7Ci0JCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQkJfQotCQlMaXN0IGFkYXB0ZXJzID0gbmV3IExpbmtlZExpc3QoKTsKLQkJZm9yIChJdGVyYXRvciBsaW5rRGVzY3JpcHRvcnNJdGVyYXRvciA9IGxpbmtEZXNjcmlwdG9ycy5pdGVyYXRvcigpOyBsaW5rRGVzY3JpcHRvcnNJdGVyYXRvcgotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQlmaW5hbCBMaW5rRGVzY3JpcHRvciBuZXh0TGlua0Rlc2NyaXB0b3IgPSAoTGlua0Rlc2NyaXB0b3IpIGxpbmtEZXNjcmlwdG9yc0l0ZXJhdG9yCi0JCQkJCS5uZXh0KCk7Ci0JCQlFZGl0UGFydCBzb3VyY2VFZGl0UGFydCA9IGdldEVkaXRQYXJ0Rm9yKG5leHRMaW5rRGVzY3JpcHRvcgotCQkJCQkuZ2V0U291cmNlKCkpOwotCQkJRWRpdFBhcnQgdGFyZ2V0RWRpdFBhcnQgPSBnZXRFZGl0UGFydEZvcihuZXh0TGlua0Rlc2NyaXB0b3IKLQkJCQkJLmdldERlc3RpbmF0aW9uKCkpOwotCQkJaWYgKHNvdXJjZUVkaXRQYXJ0ID09IG51bGwgfHwgdGFyZ2V0RWRpdFBhcnQgPT0gbnVsbCkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJQ3JlYXRlQ29ubmVjdGlvblZpZXdSZXF1ZXN0LkNvbm5lY3Rpb25WaWV3RGVzY3JpcHRvciBkZXNjcmlwdG9yID0gbmV3IENyZWF0ZUNvbm5lY3Rpb25WaWV3UmVxdWVzdC5Db25uZWN0aW9uVmlld0Rlc2NyaXB0b3IoCi0JCQkJCW5leHRMaW5rRGVzY3JpcHRvci5nZXRTZW1hbnRpY0FkYXB0ZXIoKSwgbnVsbCwKLQkJCQkJVmlld1V0aWwuQVBQRU5ELCBmYWxzZSwgKChJR3JhcGhpY2FsRWRpdFBhcnQpIGdldEhvc3QoKSkKLQkJCQkJCQkuZ2V0RGlhZ3JhbVByZWZlcmVuY2VzSGludCgpKTsKLQkJCUNyZWF0ZUNvbm5lY3Rpb25WaWV3UmVxdWVzdCBjY3IgPSBuZXcgQ3JlYXRlQ29ubmVjdGlvblZpZXdSZXF1ZXN0KAotCQkJCQlkZXNjcmlwdG9yKTsKLQkJCWNjci5zZXRUeXBlKFJlcXVlc3RDb25zdGFudHMuUkVRX0NPTk5FQ1RJT05fU1RBUlQpOwotCQkJY2NyLnNldFNvdXJjZUVkaXRQYXJ0KHNvdXJjZUVkaXRQYXJ0KTsKLQkJCXNvdXJjZUVkaXRQYXJ0LmdldENvbW1hbmQoY2NyKTsKLQkJCWNjci5zZXRUYXJnZXRFZGl0UGFydCh0YXJnZXRFZGl0UGFydCk7Ci0JCQljY3Iuc2V0VHlwZShSZXF1ZXN0Q29uc3RhbnRzLlJFUV9DT05ORUNUSU9OX0VORCk7Ci0JCQlDb21tYW5kIGNtZCA9IHRhcmdldEVkaXRQYXJ0LmdldENvbW1hbmQoY2NyKTsKLQkJCWlmIChjbWQgIT0gbnVsbCAmJiBjbWQuY2FuRXhlY3V0ZSgpKSB7Ci0JCQkJZXhlY3V0ZUNvbW1hbmQoY21kKTsKLQkJCQlJQWRhcHRhYmxlIHZpZXdBZGFwdGVyID0gKElBZGFwdGFibGUpIGNjci5nZXROZXdPYmplY3QoKTsKLQkJCQlpZiAodmlld0FkYXB0ZXIgIT0gbnVsbCkgewotCQkJCQlhZGFwdGVycy5hZGQodmlld0FkYXB0ZXIpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gYWRhcHRlcnM7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRWRpdFBhcnQgZ2V0RWRpdFBhcnRGb3IoRU9iamVjdCBtb2RlbEVsZW1lbnQpIHsKLQkJVmlldyB2aWV3ID0gKFZpZXcpIG15RU9iamVjdDJWaWV3TWFwLmdldChtb2RlbEVsZW1lbnQpOwotCQlpZiAodmlldyAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gKEVkaXRQYXJ0KSBnZXRIb3N0KCkuZ2V0Vmlld2VyKCkuZ2V0RWRpdFBhcnRSZWdpc3RyeSgpLmdldCgKLQkJCQkJdmlldyk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICpAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSB2b2lkIHN0b3JlTGlua3MoRU9iamVjdCBjb250YWluZXIsIERpYWdyYW0gZGlhZ3JhbSkgewotCQlFQ2xhc3MgY29udGFpbmVyTWV0YWNsYXNzID0gY29udGFpbmVyLmVDbGFzcygpOwotCQlzdG9yZUZlYXR1cmVNb2RlbEZhY2V0TGlua3MoY29udGFpbmVyLCBjb250YWluZXJNZXRhY2xhc3MsIGRpYWdyYW0pOwotCQlzdG9yZVR5cGVNb2RlbEZhY2V0TGlua3MoY29udGFpbmVyLCBjb250YWluZXJNZXRhY2xhc3MpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHZvaWQgc3RvcmVUeXBlTW9kZWxGYWNldExpbmtzKEVPYmplY3QgY29udGFpbmVyLAotCQkJRUNsYXNzIGNvbnRhaW5lck1ldGFjbGFzcykgewotCQlzdG9yZVR5cGVNb2RlbEZhY2V0TGlua3NfTGlua18zMDAxKGNvbnRhaW5lciwgY29udGFpbmVyTWV0YWNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSB2b2lkIHN0b3JlVHlwZU1vZGVsRmFjZXRMaW5rc19MaW5rXzMwMDEoRU9iamVjdCBjb250YWluZXIsCi0JCQlFQ2xhc3MgY29udGFpbmVyTWV0YWNsYXNzKSB7Ci0JCWlmIChNb2RlbFBhY2thZ2UuZUlOU1RBTkNFLmdldE5vZGUoKS5pc1N1cGVyVHlwZU9mKGNvbnRhaW5lck1ldGFjbGFzcykpIHsKLQkJCWZvciAoSXRlcmF0b3IgdmFsdWVzID0gKChOb2RlKSBjb250YWluZXIpLmdldE91dGdvaW5nQ29ubmVjdGlvbnMoKQotCQkJCQkuaXRlcmF0b3IoKTsgdmFsdWVzLmhhc05leHQoKTspIHsKLQkJCQlFT2JqZWN0IG5leHRWYWx1ZSA9ICgoRU9iamVjdCkgdmFsdWVzLm5leHQoKSk7Ci0JCQkJaW50IGxpbmtWSUQgPSBEaWFncmFtVmlzdWFsSURSZWdpc3RyeQotCQkJCQkJLmdldExpbmtXaXRoQ2xhc3NWaXN1YWxJRChuZXh0VmFsdWUpOwotCQkJCWlmIChMaW5rRWRpdFBhcnQuVklTVUFMX0lEID09IGxpbmtWSUQpIHsKLQkJCQkJT2JqZWN0IHN0cnVjdHVyYWxGZWF0dXJlUmVzdWx0ID0gKChMaW5rKSBuZXh0VmFsdWUpCi0JCQkJCQkJLmdldFRhcmdldCgpOwotCQkJCQlpZiAoc3RydWN0dXJhbEZlYXR1cmVSZXN1bHQgaW5zdGFuY2VvZiBFT2JqZWN0KSB7Ci0JCQkJCQlFT2JqZWN0IGRzdCA9IChFT2JqZWN0KSBzdHJ1Y3R1cmFsRmVhdHVyZVJlc3VsdDsKLQkJCQkJCXN0cnVjdHVyYWxGZWF0dXJlUmVzdWx0ID0gKChMaW5rKSBuZXh0VmFsdWUpCi0JCQkJCQkJCS5nZXRTb3VyY2UoKTsKLQkJCQkJCWlmIChzdHJ1Y3R1cmFsRmVhdHVyZVJlc3VsdCBpbnN0YW5jZW9mIEVPYmplY3QpIHsKLQkJCQkJCQlFT2JqZWN0IHNyYyA9IChFT2JqZWN0KSBzdHJ1Y3R1cmFsRmVhdHVyZVJlc3VsdDsKLQkJCQkJCQlteUxpbmtEZXNjcmlwdG9ycy5hZGQobmV3IExpbmtEZXNjcmlwdG9yKHNyYywgZHN0LAotCQkJCQkJCQkJbmV4dFZhbHVlLCBEaWFncmFtRWxlbWVudFR5cGVzLkxpbmtfMzAwMSwKLQkJCQkJCQkJCWxpbmtWSUQpKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgdm9pZCBzdG9yZUZlYXR1cmVNb2RlbEZhY2V0TGlua3MoRU9iamVjdCBjb250YWluZXIsCi0JCQlFQ2xhc3MgY29udGFpbmVyTWV0YWNsYXNzLCBEaWFncmFtIGRpYWdyYW0pIHsKLQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIERpYWdyYW0gZ2V0RGlhZ3JhbSgpIHsKLQkJcmV0dXJuICgoVmlldykgZ2V0SG9zdCgpLmdldE1vZGVsKCkpLmdldERpYWdyYW0oKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBjbGFzcyBMaW5rRGVzY3JpcHRvciB7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgRU9iamVjdCBteVNvdXJjZTsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSBFT2JqZWN0IG15RGVzdGluYXRpb247Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgRU9iamVjdCBteUxpbmtFbGVtZW50OwotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIGludCBteVZpc3VhbElEOwotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIElBZGFwdGFibGUgbXlTZW1hbnRpY0FkYXB0ZXI7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByb3RlY3RlZCBMaW5rRGVzY3JpcHRvcihFT2JqZWN0IHNvdXJjZSwgRU9iamVjdCBkZXN0aW5hdGlvbiwKLQkJCQlFT2JqZWN0IGxpbmtFbGVtZW50LCBJRWxlbWVudFR5cGUgZWxlbWVudFR5cGUsIGludCBsaW5rVklEKSB7Ci0JCQl0aGlzKHNvdXJjZSwgZGVzdGluYXRpb24sIGxpbmtWSUQpOwotCQkJbXlMaW5rRWxlbWVudCA9IGxpbmtFbGVtZW50OwotCQkJZmluYWwgSUVsZW1lbnRUeXBlIGVsZW1lbnRUeXBlQ29weSA9IGVsZW1lbnRUeXBlOwotCQkJbXlTZW1hbnRpY0FkYXB0ZXIgPSBuZXcgRU9iamVjdEFkYXB0ZXIobGlua0VsZW1lbnQpIHsKLQkJCQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgYWRhcHRlcikgewotCQkJCQlpZiAoSUVsZW1lbnRUeXBlLmNsYXNzLmVxdWFscyhhZGFwdGVyKSkgewotCQkJCQkJcmV0dXJuIGVsZW1lbnRUeXBlQ29weTsKLQkJCQkJfQotCQkJCQlyZXR1cm4gc3VwZXIuZ2V0QWRhcHRlcihhZGFwdGVyKTsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByb3RlY3RlZCBMaW5rRGVzY3JpcHRvcihFT2JqZWN0IHNvdXJjZSwgRU9iamVjdCBkZXN0aW5hdGlvbiwKLQkJCQlJRWxlbWVudFR5cGUgZWxlbWVudFR5cGUsIGludCBsaW5rVklEKSB7Ci0JCQl0aGlzKHNvdXJjZSwgZGVzdGluYXRpb24sIGxpbmtWSUQpOwotCQkJbXlMaW5rRWxlbWVudCA9IG51bGw7Ci0JCQlmaW5hbCBJRWxlbWVudFR5cGUgZWxlbWVudFR5cGVDb3B5ID0gZWxlbWVudFR5cGU7Ci0JCQlteVNlbWFudGljQWRhcHRlciA9IG5ldyBJQWRhcHRhYmxlKCkgewotCQkJCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihDbGFzcyBhZGFwdGVyKSB7Ci0JCQkJCWlmIChJRWxlbWVudFR5cGUuY2xhc3MuZXF1YWxzKGFkYXB0ZXIpKSB7Ci0JCQkJCQlyZXR1cm4gZWxlbWVudFR5cGVDb3B5OwotCQkJCQl9Ci0JCQkJCXJldHVybiBudWxsOwotCQkJCX0KLQkJCX07Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSBMaW5rRGVzY3JpcHRvcihFT2JqZWN0IHNvdXJjZSwgRU9iamVjdCBkZXN0aW5hdGlvbiwgaW50IGxpbmtWSUQpIHsKLQkJCW15U291cmNlID0gc291cmNlOwotCQkJbXlEZXN0aW5hdGlvbiA9IGRlc3RpbmF0aW9uOwotCQkJbXlWaXN1YWxJRCA9IGxpbmtWSUQ7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJvdGVjdGVkIEVPYmplY3QgZ2V0U291cmNlKCkgewotCQkJcmV0dXJuIG15U291cmNlOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByb3RlY3RlZCBFT2JqZWN0IGdldERlc3RpbmF0aW9uKCkgewotCQkJcmV0dXJuIG15RGVzdGluYXRpb247Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJvdGVjdGVkIEVPYmplY3QgZ2V0TGlua0VsZW1lbnQoKSB7Ci0JCQlyZXR1cm4gbXlMaW5rRWxlbWVudDsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcm90ZWN0ZWQgaW50IGdldFZpc3VhbElEKCkgewotCQkJcmV0dXJuIG15VmlzdWFsSUQ7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJvdGVjdGVkIElBZGFwdGFibGUgZ2V0U2VtYW50aWNBZGFwdGVyKCkgewotCQkJcmV0dXJuIG15U2VtYW50aWNBZGFwdGVyOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL2VkaXQvcG9saWNpZXMvV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvZWRpdC9wb2xpY2llcy9Xb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtSXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyODBkZTVlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvZWRpdC9wb2xpY2llcy9Xb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtSXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5lZGl0LnBvbGljaWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuRGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Nb2RlbFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTmFtZWROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQuZWRpdC5jb21tYW5kcy5Xb3JrUHJvZHVjdE5vZGVDcmVhdGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQucHJvdmlkZXJzLkRpYWdyYW1FbGVtZW50VHlwZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb21tYW5kcy5jb3JlLmNvbW1hbmRzLkR1cGxpY2F0ZUVPYmplY3RzQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLmNvbW1hbmRzLkNyZWF0ZUVsZW1lbnRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ3JlYXRlRWxlbWVudFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5EdXBsaWNhdGVFbGVtZW50c1JlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBXb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtSXRlbVNlbWFudGljRWRpdFBvbGljeSBleHRlbmRzCi0JCURpYWdyYW1CYXNlSXRlbVNlbWFudGljRWRpdFBvbGljeSB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlQ29tbWFuZChDcmVhdGVFbGVtZW50UmVxdWVzdCByZXEpIHsKLQkJaWYgKERpYWdyYW1FbGVtZW50VHlwZXMuV29ya1Byb2R1Y3ROb2RlXzEwMDEgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsKLQkJCWlmIChyZXEuZ2V0Q29udGFpbm1lbnRGZWF0dXJlKCkgPT0gbnVsbCkgewotCQkJCXJlcS5zZXRDb250YWlubWVudEZlYXR1cmUoTW9kZWxQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJLmdldE5vZGVDb250YWluZXJfTm9kZXMoKSk7Ci0JCQl9Ci0JCQlyZXR1cm4gZ2V0TVNMV3JhcHBlcihuZXcgV29ya1Byb2R1Y3ROb2RlQ3JlYXRlQ29tbWFuZChyZXEpKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0Q3JlYXRlQ29tbWFuZChyZXEpOwotCX0KLQotCS8qKgotCSAqIEBtb2RpZmllZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldER1cGxpY2F0ZUNvbW1hbmQoRHVwbGljYXRlRWxlbWVudHNSZXF1ZXN0IHJlcSkgewotCQkvLwkJVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gZWRpdGluZ0RvbWFpbiA9ICgoSUdyYXBoaWNhbEVkaXRQYXJ0KSBnZXRIb3N0KCkpCi0JCS8vCQkJCS5nZXRFZGl0aW5nRG9tYWluKCk7Ci0JCS8vCQlyZXR1cm4gZ2V0TVNMV3JhcHBlcihuZXcgRHVwbGljYXRlQW55dGhpbmdDb21tYW5kKGVkaXRpbmdEb21haW4sIHJlcSkpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgRHVwbGljYXRlQW55dGhpbmdDb21tYW5kIGV4dGVuZHMKLQkJCUR1cGxpY2F0ZUVPYmplY3RzQ29tbWFuZCB7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBEdXBsaWNhdGVBbnl0aGluZ0NvbW1hbmQoCi0JCQkJVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gZWRpdGluZ0RvbWFpbiwKLQkJCQlEdXBsaWNhdGVFbGVtZW50c1JlcXVlc3QgcmVxKSB7Ci0JCQlzdXBlcihlZGl0aW5nRG9tYWluLCByZXEuZ2V0TGFiZWwoKSwgcmVxCi0JCQkJCS5nZXRFbGVtZW50c1RvQmVEdXBsaWNhdGVkKCksIHJlcQotCQkJCQkuZ2V0QWxsRHVwbGljYXRlZEVsZW1lbnRzTWFwKCkpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9lZGl0L3BvbGljaWVzL1dvcmtQcm9kdWN0Tm9kZUNhbm9uaWNhbEVkaXRQb2xpY3kuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvZWRpdC9wb2xpY2llcy9Xb3JrUHJvZHVjdE5vZGVDYW5vbmljYWxFZGl0UG9saWN5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1ZGEwMGQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9lZGl0L3BvbGljaWVzL1dvcmtQcm9kdWN0Tm9kZUNhbm9uaWNhbEVkaXRQb2xpY3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQuZWRpdC5wb2xpY2llczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkNhbm9uaWNhbEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBXb3JrUHJvZHVjdE5vZGVDYW5vbmljYWxFZGl0UG9saWN5IGV4dGVuZHMgQ2Fub25pY2FsRWRpdFBvbGljeSB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIExpc3QgZ2V0U2VtYW50aWNDaGlsZHJlbkxpc3QoKSB7Ci0JCUxpc3QgcmVzdWx0ID0gbmV3IExpbmtlZExpc3QoKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gc2hvdWxkRGVsZXRlVmlldyhWaWV3IHZpZXcpIHsKLQkJcmV0dXJuIHZpZXcuaXNTZXRFbGVtZW50KCkgJiYgdmlldy5nZXRFbGVtZW50KCkgIT0gbnVsbAotCQkJCSYmIHZpZXcuZ2V0RWxlbWVudCgpLmVJc1Byb3h5KCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGVmYXVsdEZhY3RvcnlIaW50KCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvZWRpdC9wb2xpY2llcy9Xb3JrUHJvZHVjdE5vZGVHcmFwaGljYWxOb2RlRWRpdFBvbGljeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9lZGl0L3BvbGljaWVzL1dvcmtQcm9kdWN0Tm9kZUdyYXBoaWNhbE5vZGVFZGl0UG9saWN5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhZDE3ZDQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9lZGl0L3BvbGljaWVzL1dvcmtQcm9kdWN0Tm9kZUdyYXBoaWNhbE5vZGVFZGl0UG9saWN5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLmVkaXQucG9saWNpZXM7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgV29ya1Byb2R1Y3ROb2RlR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kgZXh0ZW5kcwotCQlEaWFncmFtR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kgewotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9lZGl0L3BvbGljaWVzL1dvcmtQcm9kdWN0Tm9kZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvZWRpdC9wb2xpY2llcy9Xb3JrUHJvZHVjdE5vZGVJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlMjc0NjQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9lZGl0L3BvbGljaWVzL1dvcmtQcm9kdWN0Tm9kZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLmVkaXQucG9saWNpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tcG91bmRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuY29tbWFuZHMuRGVzdHJveUVsZW1lbnRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkRlc3Ryb3lFbGVtZW50UmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLlJlb3JpZW50UmVsYXRpb25zaGlwUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Nb2RlbFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQuZWRpdC5jb21tYW5kcy5MaW5rQ3JlYXRlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLmVkaXQuY29tbWFuZHMuTGlua1Jlb3JpZW50Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLmVkaXQucGFydHMuTGlua0VkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQucHJvdmlkZXJzLkRpYWdyYW1FbGVtZW50VHlwZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuVW5leGVjdXRhYmxlQ29tbWFuZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuY29tbWFuZHMuQ3JlYXRlUmVsYXRpb25zaGlwQ29tbWFuZDsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBXb3JrUHJvZHVjdE5vZGVJdGVtU2VtYW50aWNFZGl0UG9saWN5IGV4dGVuZHMKLQkJRGlhZ3JhbUJhc2VJdGVtU2VtYW50aWNFZGl0UG9saWN5IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXREZXN0cm95RWxlbWVudENvbW1hbmQoRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHJlcSkgewotCQlDb21wb3VuZENvbW1hbmQgY2MgPSBnZXREZXN0cm95RWRnZXNDb21tYW5kKHJlcQotCQkJCS5pc0NvbmZpcm1hdGlvblJlcXVpcmVkKCkpOwotCQlWaWV3IHZpZXcgPSAoVmlldykgZ2V0SG9zdCgpLmdldE1vZGVsKCk7Ci0JCWlmICh2aWV3LmdldEVBbm5vdGF0aW9uKCJTaG9ydGN1dCIpICE9IG51bGwpIHsgLy8kTk9OLU5MUy0xJAotCQkJcmVxLnNldEVsZW1lbnRUb0Rlc3Ryb3kodmlldyk7Ci0JCX0KLQkJY2MuYWRkKGdldE1TTFdyYXBwZXIobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChyZXEpKSk7Ci0JCXJldHVybiBjYy51bndyYXAoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlUmVsYXRpb25zaGlwQ29tbWFuZChDcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0IHJlcSkgewotCQlpZiAoRGlhZ3JhbUVsZW1lbnRUeXBlcy5MaW5rXzMwMDEgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsKLQkJCXJldHVybiByZXEuZ2V0VGFyZ2V0KCkgPT0gbnVsbCA/IGdldENyZWF0ZVN0YXJ0T3V0Z29pbmdMaW5rXzMwMDFDb21tYW5kKHJlcSkKLQkJCQkJOiBnZXRDcmVhdGVDb21wbGV0ZUluY29taW5nTGlua18zMDAxQ29tbWFuZChyZXEpOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRDcmVhdGVSZWxhdGlvbnNoaXBDb21tYW5kKHJlcSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZVN0YXJ0T3V0Z29pbmdMaW5rXzMwMDFDb21tYW5kKAotCQkJQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdCByZXEpIHsKLQkJRU9iamVjdCBzb3VyY2VFT2JqZWN0ID0gcmVxLmdldFNvdXJjZSgpOwotCQlpZiAoZmFsc2UgPT0gc291cmNlRU9iamVjdCBpbnN0YW5jZW9mIE5vZGUpIHsKLQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQl9Ci0JCU5vZGUgc291cmNlID0gKE5vZGUpIHNvdXJjZUVPYmplY3Q7Ci0JCU5vZGUgY29udGFpbmVyID0gKE5vZGUpIGdldFJlbGF0aW9uc2hpcENvbnRhaW5lcihzb3VyY2UsCi0JCQkJTW9kZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXROb2RlKCksIHJlcS5nZXRFbGVtZW50VHlwZSgpKTsKLQkJaWYgKGNvbnRhaW5lciA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJfQotCQlpZiAoIURpYWdyYW1CYXNlSXRlbVNlbWFudGljRWRpdFBvbGljeS5MaW5rQ29uc3RyYWludHMKLQkJCQkuY2FuQ3JlYXRlTGlua18zMDAxKGNvbnRhaW5lciwgc291cmNlLCBudWxsKSkgewotCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCX0KLQkJcmV0dXJuIG5ldyBDb21tYW5kKCkgewotCQl9OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVDb21wbGV0ZUluY29taW5nTGlua18zMDAxQ29tbWFuZCgKLQkJCUNyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3QgcmVxKSB7Ci0JCUVPYmplY3Qgc291cmNlRU9iamVjdCA9IHJlcS5nZXRTb3VyY2UoKTsKLQkJRU9iamVjdCB0YXJnZXRFT2JqZWN0ID0gcmVxLmdldFRhcmdldCgpOwotCQlpZiAoZmFsc2UgPT0gc291cmNlRU9iamVjdCBpbnN0YW5jZW9mIE5vZGUKLQkJCQl8fCBmYWxzZSA9PSB0YXJnZXRFT2JqZWN0IGluc3RhbmNlb2YgTm9kZSkgewotCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCX0KLQkJTm9kZSBzb3VyY2UgPSAoTm9kZSkgc291cmNlRU9iamVjdDsKLQkJTm9kZSB0YXJnZXQgPSAoTm9kZSkgdGFyZ2V0RU9iamVjdDsKLQkJTm9kZSBjb250YWluZXIgPSAoTm9kZSkgZ2V0UmVsYXRpb25zaGlwQ29udGFpbmVyKHNvdXJjZSwKLQkJCQlNb2RlbFBhY2thZ2UuZUlOU1RBTkNFLmdldE5vZGUoKSwgcmVxLmdldEVsZW1lbnRUeXBlKCkpOwotCQlpZiAoY29udGFpbmVyID09IG51bGwpIHsKLQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQl9Ci0JCWlmICghRGlhZ3JhbUJhc2VJdGVtU2VtYW50aWNFZGl0UG9saWN5LkxpbmtDb25zdHJhaW50cwotCQkJCS5jYW5DcmVhdGVMaW5rXzMwMDEoY29udGFpbmVyLCBzb3VyY2UsIHRhcmdldCkpIHsKLQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQl9Ci0JCWlmIChyZXEuZ2V0Q29udGFpbm1lbnRGZWF0dXJlKCkgPT0gbnVsbCkgewotCQkJcmVxLnNldENvbnRhaW5tZW50RmVhdHVyZShNb2RlbFBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCS5nZXROb2RlX091dGdvaW5nQ29ubmVjdGlvbnMoKSk7Ci0JCX0KLQkJcmV0dXJuIGdldE1TTFdyYXBwZXIobmV3IExpbmtDcmVhdGVDb21tYW5kKHJlcSwgY29udGFpbmVyLCBzb3VyY2UsCi0JCQkJdGFyZ2V0KSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBjb21tYW5kIHRvIHJlb3JpZW50IEVDbGFzcyBiYXNlZCBsaW5rLiBOZXcgbGluayB0YXJnZXQgb3Igc291cmNlCi0JICogc2hvdWxkIGJlIHRoZSBkb21haW4gbW9kZWwgZWxlbWVudCBhc3NvY2lhdGVkIHdpdGggdGhpcyBub2RlLgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRSZW9yaWVudFJlbGF0aW9uc2hpcENvbW1hbmQoCi0JCQlSZW9yaWVudFJlbGF0aW9uc2hpcFJlcXVlc3QgcmVxKSB7Ci0JCXN3aXRjaCAoZ2V0VmlzdWFsSUQocmVxKSkgewotCQljYXNlIExpbmtFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQlyZXR1cm4gZ2V0TVNMV3JhcHBlcihuZXcgTGlua1Jlb3JpZW50Q29tbWFuZChyZXEpKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0UmVvcmllbnRSZWxhdGlvbnNoaXBDb21tYW5kKHJlcSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9wYXJ0L0RpYWdyYW1DcmVhdGlvbldpemFyZC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9wYXJ0L0RpYWdyYW1DcmVhdGlvbldpemFyZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NDQ2YjVlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvcGFydC9EaWFncmFtQ3JlYXRpb25XaXphcmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLnBhcnQ7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlc291cmNlcy5lZGl0b3IuaWRlLndpemFyZHMuRWRpdG9yQ3JlYXRpb25XaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5FcnJvckRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uSVJ1bm5hYmxlV2l0aFByb2dyZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JTmV3V2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGFydEluaXRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5Xb3Jrc3BhY2VNb2RpZnlPcGVyYXRpb247Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRGlhZ3JhbUNyZWF0aW9uV2l6YXJkIGV4dGVuZHMgV2l6YXJkIGltcGxlbWVudHMgSU5ld1dpemFyZCB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBJV29ya2JlbmNoIHdvcmtiZW5jaDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbjsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIERpYWdyYW1DcmVhdGlvbldpemFyZFBhZ2UgZGlhZ3JhbU1vZGVsRmlsZVBhZ2U7Ci0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBSZXNvdXJjZSBkaWFncmFtOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gb3Blbk5ld2x5Q3JlYXRlZERpYWdyYW1FZGl0b3IgPSB0cnVlOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJV29ya2JlbmNoIGdldFdvcmtiZW5jaCgpIHsKLQkJcmV0dXJuIHdvcmtiZW5jaDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIGdldFNlbGVjdGlvbigpIHsKLQkJcmV0dXJuIHNlbGVjdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGZpbmFsIFJlc291cmNlIGdldERpYWdyYW0oKSB7Ci0JCXJldHVybiBkaWFncmFtOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBpc09wZW5OZXdseUNyZWF0ZWREaWFncmFtRWRpdG9yKCkgewotCQlyZXR1cm4gb3Blbk5ld2x5Q3JlYXRlZERpYWdyYW1FZGl0b3I7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE9wZW5OZXdseUNyZWF0ZWREaWFncmFtRWRpdG9yKAotCQkJYm9vbGVhbiBvcGVuTmV3bHlDcmVhdGVkRGlhZ3JhbUVkaXRvcikgewotCQl0aGlzLm9wZW5OZXdseUNyZWF0ZWREaWFncmFtRWRpdG9yID0gb3Blbk5ld2x5Q3JlYXRlZERpYWdyYW1FZGl0b3I7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFBhZ2VzKCkgewotCQlkaWFncmFtTW9kZWxGaWxlUGFnZSA9IG5ldyBEaWFncmFtQ3JlYXRpb25XaXphcmRQYWdlKAotCQkJCSJEaWFncmFtTW9kZWxGaWxlIiwgZ2V0U2VsZWN0aW9uKCksICJ3cGRkIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlkaWFncmFtTW9kZWxGaWxlUGFnZS5zZXRUaXRsZSgiQ3JlYXRlIFdQREQgRGlhZ3JhbSIpOwotCQlkaWFncmFtTW9kZWxGaWxlUGFnZQotCQkJCS5zZXREZXNjcmlwdGlvbigiU2VsZWN0IGZpbGUgdGhhdCB3aWxsIGNvbnRhaW4gZGlhZ3JhbSBhbmQgZG9tYWluIG1vZGVscy4iKTsKLQkJYWRkUGFnZShkaWFncmFtTW9kZWxGaWxlUGFnZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHBlcmZvcm1GaW5pc2goKSB7Ci0JCUlSdW5uYWJsZVdpdGhQcm9ncmVzcyBvcCA9IG5ldyBXb3Jrc3BhY2VNb2RpZnlPcGVyYXRpb24obnVsbCkgewotCi0JCQlwcm90ZWN0ZWQgdm9pZCBleGVjdXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLQkJCQkJdGhyb3dzIENvcmVFeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJCQlkaWFncmFtID0gRGlhZ3JhbURpYWdyYW1FZGl0b3JVdGlsLmNyZWF0ZURpYWdyYW0oCi0JCQkJCQlkaWFncmFtTW9kZWxGaWxlUGFnZS5nZXRVUkkoKSwgbW9uaXRvcik7Ci0JCQkJaWYgKGlzT3Blbk5ld2x5Q3JlYXRlZERpYWdyYW1FZGl0b3IoKSAmJiBkaWFncmFtICE9IG51bGwpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCURpYWdyYW1EaWFncmFtRWRpdG9yVXRpbC5vcGVuRGlhZ3JhbShkaWFncmFtKTsKLQkJCQkJfSBjYXRjaCAoUGFydEluaXRFeGNlcHRpb24gZSkgewotCQkJCQkJRXJyb3JEaWFsb2cub3BlbkVycm9yKGdldENvbnRhaW5lcigpLmdldFNoZWxsKCksCi0JCQkJCQkJCSJFcnJvciBvcGVuaW5nIGRpYWdyYW0gZWRpdG9yIiwgbnVsbCwgZQotCQkJCQkJCQkJCS5nZXRTdGF0dXMoKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JCXRyeSB7Ci0JCQlnZXRDb250YWluZXIoKS5ydW4oZmFsc2UsIHRydWUsIG9wKTsKLQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKLQkJCWlmIChlLmdldFRhcmdldEV4Y2VwdGlvbigpIGluc3RhbmNlb2YgQ29yZUV4Y2VwdGlvbikgewotCQkJCUVycm9yRGlhbG9nLm9wZW5FcnJvcihnZXRDb250YWluZXIoKS5nZXRTaGVsbCgpLAotCQkJCQkJIkNyZWF0aW9uIFByb2JsZW1zIiwgbnVsbCwgKChDb3JlRXhjZXB0aW9uKSBlCi0JCQkJCQkJCS5nZXRUYXJnZXRFeGNlcHRpb24oKSkuZ2V0U3RhdHVzKCkpOwotCQkJfSBlbHNlIHsKLQkJCQlXUEREaWFncmFtRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkubG9nRXJyb3IoCi0JCQkJCQkiRXJyb3IgY3JlYXRpbmcgZGlhZ3JhbSIsIGUuZ2V0VGFyZ2V0RXhjZXB0aW9uKCkpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIGRpYWdyYW0gIT0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoIHdvcmtiZW5jaCwgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCXRoaXMud29ya2JlbmNoID0gd29ya2JlbmNoOwotCQl0aGlzLnNlbGVjdGlvbiA9IHNlbGVjdGlvbjsKLQkJc2V0V2luZG93VGl0bGUoIk5ldyBXUEREIERpYWdyYW0iKTsKLQkJc2V0RGVmYXVsdFBhZ2VJbWFnZURlc2NyaXB0b3IoV1BERGlhZ3JhbUVkaXRvclBsdWdpbgotCQkJCS5nZXRCdW5kbGVkSW1hZ2VEZXNjcmlwdG9yKCJpY29ucy93aXpiYW4vTmV3TW9kZWxXaXphcmQuZ2lmIikpOyAvLyROT04tTkxTLTEkCi0JCXNldE5lZWRzUHJvZ3Jlc3NNb25pdG9yKHRydWUpOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvcGFydC9EaWFncmFtQ3JlYXRpb25XaXphcmRQYWdlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL3BhcnQvRGlhZ3JhbUNyZWF0aW9uV2l6YXJkUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYjYxZjVlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvcGFydC9EaWFncmFtQ3JlYXRpb25XaXphcmRQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5wYXJ0OwotCi1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVzb3VyY2VzLmVkaXRvci5pZGUud2l6YXJkcy5FZGl0b3JXaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVzb3VyY2VzLmVkaXRvci51dGlsLkRpYWdyYW1GaWxlQ3JlYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuV2l6YXJkTmV3RmlsZUNyZWF0aW9uUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLmVkaXQucGFydHMuV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbUVkaXRQYXJ0OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERpYWdyYW1DcmVhdGlvbldpemFyZFBhZ2UgZXh0ZW5kcyBXaXphcmROZXdGaWxlQ3JlYXRpb25QYWdlIHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIGZpbmFsIFN0cmluZyBmaWxlRXh0ZW5zaW9uOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEaWFncmFtQ3JlYXRpb25XaXphcmRQYWdlKFN0cmluZyBwYWdlTmFtZSwKLQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiwgU3RyaW5nIGZpbGVFeHRlbnNpb24pIHsKLQkJc3VwZXIocGFnZU5hbWUsIHNlbGVjdGlvbik7Ci0JCXRoaXMuZmlsZUV4dGVuc2lvbiA9IGZpbGVFeHRlbnNpb247Ci0JfQotCi0JLyoqCi0JICogT3ZlcnJpZGUgdG8gY3JlYXRlIGZpbGVzIHdpdGggdGhpcyBleHRlbnNpb24uCi0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RXh0ZW5zaW9uKCkgewotCQlyZXR1cm4gZmlsZUV4dGVuc2lvbjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFVSSSBnZXRVUkkoKSB7Ci0JCXJldHVybiBVUkkuY3JlYXRlUGxhdGZvcm1SZXNvdXJjZVVSSShnZXRGaWxlUGF0aCgpLnRvU3RyaW5nKCksIGZhbHNlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElQYXRoIGdldEZpbGVQYXRoKCkgewotCQlJUGF0aCBwYXRoID0gZ2V0Q29udGFpbmVyRnVsbFBhdGgoKTsKLQkJaWYgKHBhdGggPT0gbnVsbCkgewotCQkJcGF0aCA9IG5ldyBQYXRoKCIiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCVN0cmluZyBmaWxlTmFtZSA9IGdldEZpbGVOYW1lKCk7Ci0JCWlmIChmaWxlTmFtZSAhPSBudWxsKSB7Ci0JCQlwYXRoID0gcGF0aC5hcHBlbmQoZmlsZU5hbWUpOwotCQl9Ci0JCXJldHVybiBwYXRoOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJc3VwZXIuY3JlYXRlQ29udHJvbChwYXJlbnQpOwotCQlzZXRGaWxlTmFtZShEaWFncmFtRGlhZ3JhbUVkaXRvclV0aWwuZ2V0VW5pcXVlRmlsZU5hbWUoCi0JCQkJZ2V0Q29udGFpbmVyRnVsbFBhdGgoKSwgZ2V0RmlsZU5hbWUoKSwgZ2V0RXh0ZW5zaW9uKCkpKTsKLQkJc2V0UGFnZUNvbXBsZXRlKHZhbGlkYXRlUGFnZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gdmFsaWRhdGVQYWdlKCkgewotCQlpZiAoIXN1cGVyLnZhbGlkYXRlUGFnZSgpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJU3RyaW5nIGV4dGVuc2lvbiA9IGdldEV4dGVuc2lvbigpOwotCQlpZiAoZXh0ZW5zaW9uICE9IG51bGwKLQkJCQkmJiAhZ2V0RmlsZVBhdGgoKS50b1N0cmluZygpLmVuZHNXaXRoKCIuIiArIGV4dGVuc2lvbikpIHsKLQkJCXNldEVycm9yTWVzc2FnZShOTFMuYmluZCgKLQkJCQkJIkZpbGUgbmFtZSBzaG91bGQgaGF2ZSAnJ3swfScnIGV4dGVuc2lvbi4iLCBleHRlbnNpb24pKTsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvcGFydC9EaWFncmFtRGlhZ3JhbUFjdGlvbkJhckNvbnRyaWJ1dG9yLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL3BhcnQvRGlhZ3JhbURpYWdyYW1BY3Rpb25CYXJDb250cmlidXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYmQyMmRhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvcGFydC9EaWFncmFtRGlhZ3JhbUFjdGlvbkJhckNvbnRyaWJ1dG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLnBhcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnBhcnRzLkRpYWdyYW1BY3Rpb25CYXJDb250cmlidXRvcjsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEaWFncmFtRGlhZ3JhbUFjdGlvbkJhckNvbnRyaWJ1dG9yIGV4dGVuZHMKLQkJRGlhZ3JhbUFjdGlvbkJhckNvbnRyaWJ1dG9yIHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ2xhc3MgZ2V0RWRpdG9yQ2xhc3MoKSB7Ci0JCXJldHVybiBXb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtRWRpdG9yLmNsYXNzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEVkaXRvcklkKCkgewotCQlyZXR1cm4gV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbUVkaXRvci5JRDsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL3BhcnQvRGlhZ3JhbURpYWdyYW1FZGl0b3JVdGlsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL3BhcnQvRGlhZ3JhbURpYWdyYW1FZGl0b3JVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwZGIwMGYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9wYXJ0L0RpYWdyYW1EaWFncmFtRWRpdG9yVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQucGFydDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLm9wZXJhdGlvbnMuT3BlcmF0aW9uSGlzdG9yeUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3ViUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLlhNSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuWE1MUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkudXRpbC5FZGl0VUlVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi5jb3JlLmNvbW1hbmQuQ29tbWFuZFJlc3VsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuc2VydmljZXMuVmlld1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuRGlhZ3JhbUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklHcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JUHJpbWFyeUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucGFydHMuSURpYWdyYW1HcmFwaGljYWxWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wYXJ0cy5JRGlhZ3JhbVdvcmtiZW5jaFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXNvdXJjZXMuZWRpdG9yLmlkZS51dGlsLklERUVkaXRvclV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXNvdXJjZXMuZWRpdG9yLnV0aWwuRGlhZ3JhbUZpbGVDcmVhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb21tYW5kcy5jb3JlLmNvbW1hbmQuQWJzdHJhY3RUcmFuc2FjdGlvbmFsQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29yZS5HTUZFZGl0aW5nRG9tYWluRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29yZS51dGlsLkVNRkNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkRpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dTZXR0aW5nczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uSVJ1bm5hYmxlQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uSVJ1bm5hYmxlV2l0aFByb2dyZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZERpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBhcnRJbml0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5UcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYud29ya3NwYWNlLnV0aWwuV29ya3NwYWNlU3luY2hyb25pemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTW9kZWxGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLldvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5lZGl0LnBhcnRzLldvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW1FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRGlhZ3JhbURpYWdyYW1FZGl0b3JVdGlsIHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBNYXAgb3VyU2F2ZU9wdGlvbnMgPSBudWxsOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgTWFwIGdldFNhdmVPcHRpb25zKCkgewotCQlpZiAob3VyU2F2ZU9wdGlvbnMgPT0gbnVsbCkgewotCQkJb3VyU2F2ZU9wdGlvbnMgPSBuZXcgSGFzaE1hcCgpOwotCQkJb3VyU2F2ZU9wdGlvbnMucHV0KFhNSVJlc291cmNlLk9QVElPTl9FTkNPRElORywgIlVURi04Iik7IC8vJE5PTi1OTFMtMSQKLQkJCW91clNhdmVPcHRpb25zLnB1dChYTUxSZXNvdXJjZS5PUFRJT05fUkVDT1JEX1VOS05PV05fRkVBVFVSRSwKLQkJCQkJQm9vbGVhbi5UUlVFKTsKLQkJCW91clNhdmVPcHRpb25zLnB1dChSZXNvdXJjZS5PUFRJT05fU0FWRV9PTkxZX0lGX0NIQU5HRUQsCi0JCQkJCVJlc291cmNlLk9QVElPTl9TQVZFX09OTFlfSUZfQ0hBTkdFRF9NRU1PUllfQlVGRkVSKTsKLQkJfQotCQlyZXR1cm4gb3VyU2F2ZU9wdGlvbnM7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBvcGVuRGlhZ3JhbShSZXNvdXJjZSBkaWFncmFtKQotCQkJdGhyb3dzIFBhcnRJbml0RXhjZXB0aW9uIHsKLQkJcmV0dXJuIEVkaXRVSVV0aWwub3BlbkVkaXRvcigoRU9iamVjdCkgZGlhZ3JhbS5nZXRDb250ZW50cygpLmdldCgwKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRDaGFyc2V0KElGaWxlIGZpbGUpIHsKLQkJaWYgKGZpbGUgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCXRyeSB7Ci0JCQlmaWxlLnNldENoYXJzZXQoIlVURi04IiwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7IC8vJE5PTi1OTFMtMSQKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlXUEREaWFncmFtRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkubG9nRXJyb3IoCi0JCQkJCSJVbmFibGUgdG8gc2V0IGNoYXJzZXQgZm9yIGZpbGUgIiArIGZpbGUuZ2V0RnVsbFBhdGgoKSwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRVbmlxdWVGaWxlTmFtZShJUGF0aCBjb250YWluZXJGdWxsUGF0aCwKLQkJCVN0cmluZyBmaWxlTmFtZSwgU3RyaW5nIGV4dGVuc2lvbikgewotCQlpZiAoY29udGFpbmVyRnVsbFBhdGggPT0gbnVsbCkgewotCQkJY29udGFpbmVyRnVsbFBhdGggPSBuZXcgUGF0aCgiIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlpZiAoZmlsZU5hbWUgPT0gbnVsbCB8fCBmaWxlTmFtZS50cmltKCkubGVuZ3RoKCkgPT0gMCkgewotCQkJZmlsZU5hbWUgPSAiZGVmYXVsdCI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlJUGF0aCBmaWxlUGF0aCA9IGNvbnRhaW5lckZ1bGxQYXRoLmFwcGVuZChmaWxlTmFtZSk7Ci0JCWlmIChleHRlbnNpb24gIT0gbnVsbCAmJiAhZXh0ZW5zaW9uLmVxdWFscyhmaWxlUGF0aC5nZXRGaWxlRXh0ZW5zaW9uKCkpKSB7Ci0JCQlmaWxlUGF0aCA9IGZpbGVQYXRoLmFkZEZpbGVFeHRlbnNpb24oZXh0ZW5zaW9uKTsKLQkJfQotCQlleHRlbnNpb24gPSBmaWxlUGF0aC5nZXRGaWxlRXh0ZW5zaW9uKCk7Ci0JCWZpbGVOYW1lID0gZmlsZVBhdGgucmVtb3ZlRmlsZUV4dGVuc2lvbigpLmxhc3RTZWdtZW50KCk7Ci0JCWludCBpID0gMTsKLQkJd2hpbGUgKFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZXhpc3RzKGZpbGVQYXRoKSkgewotCQkJaSsrOwotCQkJZmlsZVBhdGggPSBjb250YWluZXJGdWxsUGF0aC5hcHBlbmQoZmlsZU5hbWUgKyBpKTsKLQkJCWlmIChleHRlbnNpb24gIT0gbnVsbCkgewotCQkJCWZpbGVQYXRoID0gZmlsZVBhdGguYWRkRmlsZUV4dGVuc2lvbihleHRlbnNpb24pOwotCQkJfQotCQl9Ci0JCXJldHVybiBmaWxlUGF0aC5sYXN0U2VnbWVudCgpOwotCX0KLQotCS8qKgotCSAqIFJ1bnMgdGhlIHdpemFyZCBpbiBhIGRpYWxvZy4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHJ1bldpemFyZChTaGVsbCBzaGVsbCwgV2l6YXJkIHdpemFyZCwgU3RyaW5nIHNldHRpbmdzS2V5KSB7Ci0JCUlEaWFsb2dTZXR0aW5ncyBwbHVnaW5EaWFsb2dTZXR0aW5ncyA9IFdQRERpYWdyYW1FZGl0b3JQbHVnaW4KLQkJCQkuZ2V0SW5zdGFuY2UoKS5nZXREaWFsb2dTZXR0aW5ncygpOwotCQlJRGlhbG9nU2V0dGluZ3Mgd2l6YXJkRGlhbG9nU2V0dGluZ3MgPSBwbHVnaW5EaWFsb2dTZXR0aW5ncwotCQkJCS5nZXRTZWN0aW9uKHNldHRpbmdzS2V5KTsKLQkJaWYgKHdpemFyZERpYWxvZ1NldHRpbmdzID09IG51bGwpIHsKLQkJCXdpemFyZERpYWxvZ1NldHRpbmdzID0gcGx1Z2luRGlhbG9nU2V0dGluZ3MKLQkJCQkJLmFkZE5ld1NlY3Rpb24oc2V0dGluZ3NLZXkpOwotCQl9Ci0JCXdpemFyZC5zZXREaWFsb2dTZXR0aW5ncyh3aXphcmREaWFsb2dTZXR0aW5ncyk7Ci0JCVdpemFyZERpYWxvZyBkaWFsb2cgPSBuZXcgV2l6YXJkRGlhbG9nKHNoZWxsLCB3aXphcmQpOwotCQlkaWFsb2cuY3JlYXRlKCk7Ci0JCWRpYWxvZy5nZXRTaGVsbCgpLnNldFNpemUoTWF0aC5tYXgoNTAwLCBkaWFsb2cuZ2V0U2hlbGwoKS5nZXRTaXplKCkueCksCi0JCQkJNTAwKTsKLQkJZGlhbG9nLm9wZW4oKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBzaG91bGQgYmUgY2FsbGVkIHdpdGhpbiBhIHdvcmtzcGFjZSBtb2RpZnkgb3BlcmF0aW9uIHNpbmNlIGl0IGNyZWF0ZXMgcmVzb3VyY2VzLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFJlc291cmNlIGNyZWF0ZURpYWdyYW0oVVJJIGRpYWdyYW1VUkksCi0JCQlJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzTW9uaXRvcikgewotCQlUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiBlZGl0aW5nRG9tYWluID0gR01GRWRpdGluZ0RvbWFpbkZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkuY3JlYXRlRWRpdGluZ0RvbWFpbigpOwotCQlwcm9ncmVzc01vbml0b3IuYmVnaW5UYXNrKAotCQkJCU1lc3NhZ2VzLkRpYWdyYW1EaWFncmFtRWRpdG9yVXRpbF9DcmVhdGVEaWFncmFtUHJvZ3Jlc3NUYXNrLCAzKTsKLQkJZmluYWwgUmVzb3VyY2UgZGlhZ3JhbVJlc291cmNlID0gZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpCi0JCQkJLmNyZWF0ZVJlc291cmNlKGRpYWdyYW1VUkkpOwotCQlmaW5hbCBTdHJpbmcgZGlhZ3JhbU5hbWUgPSBkaWFncmFtVVJJLmxhc3RTZWdtZW50KCk7Ci0JCUFic3RyYWN0VHJhbnNhY3Rpb25hbENvbW1hbmQgY29tbWFuZCA9IG5ldyBBYnN0cmFjdFRyYW5zYWN0aW9uYWxDb21tYW5kKAotCQkJCWVkaXRpbmdEb21haW4sCi0JCQkJTWVzc2FnZXMuRGlhZ3JhbURpYWdyYW1FZGl0b3JVdGlsX0NyZWF0ZURpYWdyYW1Db21tYW5kTGFiZWwsCi0JCQkJQ29sbGVjdGlvbnMuRU1QVFlfTElTVCkgewotCQkJcHJvdGVjdGVkIENvbW1hbmRSZXN1bHQgZG9FeGVjdXRlV2l0aFJlc3VsdCgKLQkJCQkJSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pCi0JCQkJCXRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCQkJCVdvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW0gbW9kZWwgPSBjcmVhdGVJbml0aWFsTW9kZWwoKTsKLQkJCQlhdHRhY2hNb2RlbFRvUmVzb3VyY2UobW9kZWwsIGRpYWdyYW1SZXNvdXJjZSk7Ci0KLQkJCQlEaWFncmFtIGRpYWdyYW0gPSBWaWV3U2VydmljZS5jcmVhdGVEaWFncmFtKG1vZGVsLAotCQkJCQkJV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbUVkaXRQYXJ0Lk1PREVMX0lELAotCQkJCQkJV1BERGlhZ3JhbUVkaXRvclBsdWdpbi5ESUFHUkFNX1BSRUZFUkVOQ0VTX0hJTlQpOwotCQkJCWlmIChkaWFncmFtICE9IG51bGwpIHsKLQkJCQkJZGlhZ3JhbVJlc291cmNlLmdldENvbnRlbnRzKCkuYWRkKGRpYWdyYW0pOwotCQkJCQlkaWFncmFtLnNldE5hbWUoZGlhZ3JhbU5hbWUpOwotCQkJCQlkaWFncmFtLnNldEVsZW1lbnQobW9kZWwpOwotCQkJCX0KLQotCQkJCXRyeSB7Ci0KLQkJCQkJZGlhZ3JhbVJlc291cmNlCi0JCQkJCQkJLnNhdmUob3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5wYXJ0LkRpYWdyYW1EaWFncmFtRWRpdG9yVXRpbAotCQkJCQkJCQkJLmdldFNhdmVPcHRpb25zKCkpOwotCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQotCQkJCQlXUEREaWFncmFtRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkubG9nRXJyb3IoCi0JCQkJCQkJIlVuYWJsZSB0byBzdG9yZSBtb2RlbCBhbmQgZGlhZ3JhbSByZXNvdXJjZXMiLCBlKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCQlyZXR1cm4gQ29tbWFuZFJlc3VsdC5uZXdPS0NvbW1hbmRSZXN1bHQoKTsKLQkJCX0KLQkJfTsKLQkJdHJ5IHsKLQkJCU9wZXJhdGlvbkhpc3RvcnlGYWN0b3J5LmdldE9wZXJhdGlvbkhpc3RvcnkoKS5leGVjdXRlKGNvbW1hbmQsCi0JCQkJCW5ldyBTdWJQcm9ncmVzc01vbml0b3IocHJvZ3Jlc3NNb25pdG9yLCAxKSwgbnVsbCk7Ci0JCX0gY2F0Y2ggKEV4ZWN1dGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQlXUEREaWFncmFtRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkubG9nRXJyb3IoCi0JCQkJCSJVbmFibGUgdG8gY3JlYXRlIG1vZGVsIGFuZCBkaWFncmFtIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCXNldENoYXJzZXQoV29ya3NwYWNlU3luY2hyb25pemVyLmdldEZpbGUoZGlhZ3JhbVJlc291cmNlKSk7Ci0JCXJldHVybiBkaWFncmFtUmVzb3VyY2U7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIGRvbWFpbiBlbGVtZW50IGFzc29jaWF0ZWQgd2l0aCBjYW52YXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbSBjcmVhdGVJbml0aWFsTW9kZWwoKSB7Ci0JCXJldHVybiBNb2RlbEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVdvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW0oKTsKLQl9Ci0KLQkvKioKLQkgKiBTdG9yZSBtb2RlbCBlbGVtZW50IGluIHRoZSByZXNvdXJjZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGF0dGFjaE1vZGVsVG9SZXNvdXJjZSgKLQkJCVdvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW0gbW9kZWwsIFJlc291cmNlIHJlc291cmNlKSB7Ci0JCXJlc291cmNlLmdldENvbnRlbnRzKCkuYWRkKG1vZGVsKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNlbGVjdEVsZW1lbnRzSW5EaWFncmFtKAotCQkJSURpYWdyYW1Xb3JrYmVuY2hQYXJ0IGRpYWdyYW1QYXJ0LCBMaXN0LypFZGl0UGFydCovZWRpdFBhcnRzKSB7Ci0JCWRpYWdyYW1QYXJ0LmdldERpYWdyYW1HcmFwaGljYWxWaWV3ZXIoKS5kZXNlbGVjdEFsbCgpOwotCi0JCUVkaXRQYXJ0IGZpcnN0UHJpbWFyeSA9IG51bGw7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSBlZGl0UGFydHMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJRWRpdFBhcnQgbmV4dFBhcnQgPSAoRWRpdFBhcnQpIGl0Lm5leHQoKTsKLQkJCWRpYWdyYW1QYXJ0LmdldERpYWdyYW1HcmFwaGljYWxWaWV3ZXIoKS5hcHBlbmRTZWxlY3Rpb24obmV4dFBhcnQpOwotCQkJaWYgKGZpcnN0UHJpbWFyeSA9PSBudWxsICYmIG5leHRQYXJ0IGluc3RhbmNlb2YgSVByaW1hcnlFZGl0UGFydCkgewotCQkJCWZpcnN0UHJpbWFyeSA9IG5leHRQYXJ0OwotCQkJfQotCQl9Ci0KLQkJaWYgKCFlZGl0UGFydHMuaXNFbXB0eSgpKSB7Ci0JCQlkaWFncmFtUGFydC5nZXREaWFncmFtR3JhcGhpY2FsVmlld2VyKCkucmV2ZWFsKAotCQkJCQlmaXJzdFByaW1hcnkgIT0gbnVsbCA/IGZpcnN0UHJpbWFyeSA6IChFZGl0UGFydCkgZWRpdFBhcnRzCi0JCQkJCQkJLmdldCgwKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgaW50IGZpbmRFbGVtZW50c0luRGlhZ3JhbUJ5SUQoRGlhZ3JhbUVkaXRQYXJ0IGRpYWdyYW1QYXJ0LAotCQkJRU9iamVjdCBlbGVtZW50LCBMaXN0IGVkaXRQYXJ0Q29sbGVjdG9yKSB7Ci0JCUlEaWFncmFtR3JhcGhpY2FsVmlld2VyIHZpZXdlciA9IChJRGlhZ3JhbUdyYXBoaWNhbFZpZXdlcikgZGlhZ3JhbVBhcnQKLQkJCQkuZ2V0Vmlld2VyKCk7Ci0JCWZpbmFsIGludCBpbnRpYWxOdW1PZkVkaXRQYXJ0cyA9IGVkaXRQYXJ0Q29sbGVjdG9yLnNpemUoKTsKLQotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFZpZXcpIHsgLy8gc3VwcG9ydCBub3RhdGlvbiBlbGVtZW50IGxvb2t1cAotCQkJRWRpdFBhcnQgZWRpdFBhcnQgPSAoRWRpdFBhcnQpIHZpZXdlci5nZXRFZGl0UGFydFJlZ2lzdHJ5KCkuZ2V0KAotCQkJCQllbGVtZW50KTsKLQkJCWlmIChlZGl0UGFydCAhPSBudWxsKSB7Ci0JCQkJZWRpdFBhcnRDb2xsZWN0b3IuYWRkKGVkaXRQYXJ0KTsKLQkJCQlyZXR1cm4gMTsKLQkJCX0KLQkJfQotCi0JCVN0cmluZyBlbGVtZW50SUQgPSBFTUZDb3JlVXRpbC5nZXRQcm94eUlEKGVsZW1lbnQpOwotCQlMaXN0IGFzc29jaWF0ZWRQYXJ0cyA9IHZpZXdlci5maW5kRWRpdFBhcnRzRm9yRWxlbWVudChlbGVtZW50SUQsCi0JCQkJSUdyYXBoaWNhbEVkaXRQYXJ0LmNsYXNzKTsKLQkJLy8gcGVyZm9ybSB0aGUgcG9zc2libGUgaGllcmFyY2h5IGRpc2pvaW50IC0+IHRha2UgdGhlIHRvcC1tb3N0IHBhcnRzIG9ubHkKLQkJZm9yIChJdGVyYXRvciBlZGl0UGFydEl0ID0gYXNzb2NpYXRlZFBhcnRzLml0ZXJhdG9yKCk7IGVkaXRQYXJ0SXQKLQkJCQkuaGFzTmV4dCgpOykgewotCQkJRWRpdFBhcnQgbmV4dFBhcnQgPSAoRWRpdFBhcnQpIGVkaXRQYXJ0SXQubmV4dCgpOwotCQkJRWRpdFBhcnQgcGFyZW50UGFydCA9IG5leHRQYXJ0LmdldFBhcmVudCgpOwotCQkJd2hpbGUgKHBhcmVudFBhcnQgIT0gbnVsbCAmJiAhYXNzb2NpYXRlZFBhcnRzLmNvbnRhaW5zKHBhcmVudFBhcnQpKSB7Ci0JCQkJcGFyZW50UGFydCA9IHBhcmVudFBhcnQuZ2V0UGFyZW50KCk7Ci0JCQl9Ci0JCQlpZiAocGFyZW50UGFydCA9PSBudWxsKSB7Ci0JCQkJZWRpdFBhcnRDb2xsZWN0b3IuYWRkKG5leHRQYXJ0KTsKLQkJCX0KLQkJfQotCi0JCWlmIChpbnRpYWxOdW1PZkVkaXRQYXJ0cyA9PSBlZGl0UGFydENvbGxlY3Rvci5zaXplKCkpIHsKLQkJCWlmICghYXNzb2NpYXRlZFBhcnRzLmlzRW1wdHkoKSkgewotCQkJCWVkaXRQYXJ0Q29sbGVjdG9yLmFkZChhc3NvY2lhdGVkUGFydHMuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQkJfSBlbHNlIHsKLQkJCQlpZiAoZWxlbWVudC5lQ29udGFpbmVyKCkgIT0gbnVsbCkgewotCQkJCQlyZXR1cm4gZmluZEVsZW1lbnRzSW5EaWFncmFtQnlJRChkaWFncmFtUGFydCwgZWxlbWVudAotCQkJCQkJCS5lQ29udGFpbmVyKCksIGVkaXRQYXJ0Q29sbGVjdG9yKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVkaXRQYXJ0Q29sbGVjdG9yLnNpemUoKSAtIGludGlhbE51bU9mRWRpdFBhcnRzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFZpZXcgZmluZFZpZXcoRGlhZ3JhbUVkaXRQYXJ0IGRpYWdyYW1FZGl0UGFydCwKLQkJCUVPYmplY3QgdGFyZ2V0RWxlbWVudCwgTGF6eUVsZW1lbnQyVmlld01hcCBsYXp5RWxlbWVudDJWaWV3TWFwKSB7Ci0JCWJvb2xlYW4gaGFzU3RydWN0dXJhbFVSSSA9IGZhbHNlOwotCQlpZiAodGFyZ2V0RWxlbWVudC5lUmVzb3VyY2UoKSBpbnN0YW5jZW9mIFhNTFJlc291cmNlKSB7Ci0JCQloYXNTdHJ1Y3R1cmFsVVJJID0gKChYTUxSZXNvdXJjZSkgdGFyZ2V0RWxlbWVudC5lUmVzb3VyY2UoKSkKLQkJCQkJLmdldElEKHRhcmdldEVsZW1lbnQpID09IG51bGw7Ci0JCX0KLQotCQlWaWV3IHZpZXcgPSBudWxsOwotCQlpZiAoaGFzU3RydWN0dXJhbFVSSQotCQkJCSYmICFsYXp5RWxlbWVudDJWaWV3TWFwLmdldEVsZW1lbnQyVmlld01hcCgpLmlzRW1wdHkoKSkgewotCQkJdmlldyA9IChWaWV3KSBsYXp5RWxlbWVudDJWaWV3TWFwLmdldEVsZW1lbnQyVmlld01hcCgpLmdldCgKLQkJCQkJdGFyZ2V0RWxlbWVudCk7Ci0JCX0gZWxzZSBpZiAoZmluZEVsZW1lbnRzSW5EaWFncmFtQnlJRChkaWFncmFtRWRpdFBhcnQsIHRhcmdldEVsZW1lbnQsCi0JCQkJbGF6eUVsZW1lbnQyVmlld01hcC5lZGl0UGFydFRtcEhvbGRlcikgPiAwKSB7Ci0JCQlFZGl0UGFydCBlZGl0UGFydCA9IChFZGl0UGFydCkgbGF6eUVsZW1lbnQyVmlld01hcC5lZGl0UGFydFRtcEhvbGRlcgotCQkJCQkuZ2V0KDApOwotCQkJbGF6eUVsZW1lbnQyVmlld01hcC5lZGl0UGFydFRtcEhvbGRlci5jbGVhcigpOwotCQkJdmlldyA9IGVkaXRQYXJ0LmdldE1vZGVsKCkgaW5zdGFuY2VvZiBWaWV3ID8gKFZpZXcpIGVkaXRQYXJ0Ci0JCQkJCS5nZXRNb2RlbCgpIDogbnVsbDsKLQkJfQotCi0JCXJldHVybiAodmlldyA9PSBudWxsKSA/IGRpYWdyYW1FZGl0UGFydC5nZXREaWFncmFtVmlldygpIDogdmlldzsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBjbGFzcyBMYXp5RWxlbWVudDJWaWV3TWFwIHsKLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgTWFwIGVsZW1lbnQyVmlld01hcDsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSBWaWV3IHNjb3BlOwotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIFNldCBlbGVtZW50U2V0OwotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgZmluYWwgTGlzdCBlZGl0UGFydFRtcEhvbGRlciA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIExhenlFbGVtZW50MlZpZXdNYXAoVmlldyBzY29wZSwgU2V0IGVsZW1lbnRzKSB7Ci0JCQl0aGlzLnNjb3BlID0gc2NvcGU7Ci0JCQl0aGlzLmVsZW1lbnRTZXQgPSBlbGVtZW50czsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgZmluYWwgTWFwIGdldEVsZW1lbnQyVmlld01hcCgpIHsKLQkJCWlmIChlbGVtZW50MlZpZXdNYXAgPT0gbnVsbCkgewotCQkJCWVsZW1lbnQyVmlld01hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCQkJLy8gbWFwIHBvc3NpYmxlIG5vdGF0aW9uIGVsZW1lbnRzIHRvIGl0c2VsZiBhcyB0aGVzZSBjYW4ndCBiZSBmb3VuZCBieSB2aWV3LmdldEVsZW1lbnQoKQotCQkJCWZvciAoSXRlcmF0b3IgaXQgPSBlbGVtZW50U2V0Lml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQkJRU9iamVjdCBlbGVtZW50ID0gKEVPYmplY3QpIGl0Lm5leHQoKTsKLQkJCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBWaWV3KSB7Ci0JCQkJCQlWaWV3IHZpZXcgPSAoVmlldykgZWxlbWVudDsKLQkJCQkJCWlmICh2aWV3LmdldERpYWdyYW0oKSA9PSBzY29wZS5nZXREaWFncmFtKCkpIHsKLQkJCQkJCQllbGVtZW50MlZpZXdNYXAucHV0KGVsZW1lbnQsIGVsZW1lbnQpOyAvLyB0YWtlIG9ubHkgdGhvc2UgdGhhdCBwYXJ0IG9mIG91ciBkaWFncmFtCi0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQlidWlsZEVsZW1lbnQyVmlld01hcChzY29wZSwgZWxlbWVudDJWaWV3TWFwLCBlbGVtZW50U2V0KTsKLQkJCX0KLQkJCXJldHVybiBlbGVtZW50MlZpZXdNYXA7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJc3RhdGljIE1hcCBidWlsZEVsZW1lbnQyVmlld01hcChWaWV3IHBhcmVudFZpZXcsIE1hcCBlbGVtZW50MlZpZXdNYXAsCi0JCQkJU2V0IGVsZW1lbnRzKSB7Ci0JCQlpZiAoZWxlbWVudHMuc2l6ZSgpID09IGVsZW1lbnQyVmlld01hcC5zaXplKCkpCi0JCQkJcmV0dXJuIGVsZW1lbnQyVmlld01hcDsKLQotCQkJaWYgKHBhcmVudFZpZXcuaXNTZXRFbGVtZW50KCkKLQkJCQkJJiYgIWVsZW1lbnQyVmlld01hcC5jb250YWluc0tleShwYXJlbnRWaWV3LmdldEVsZW1lbnQoKSkKLQkJCQkJJiYgZWxlbWVudHMuY29udGFpbnMocGFyZW50Vmlldy5nZXRFbGVtZW50KCkpKSB7Ci0JCQkJZWxlbWVudDJWaWV3TWFwLnB1dChwYXJlbnRWaWV3LmdldEVsZW1lbnQoKSwgcGFyZW50Vmlldyk7Ci0JCQkJaWYgKGVsZW1lbnRzLnNpemUoKSA9PSBlbGVtZW50MlZpZXdNYXAuc2l6ZSgpKQotCQkJCQlyZXR1cm4gZWxlbWVudDJWaWV3TWFwOwotCQkJfQotCi0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gcGFyZW50Vmlldy5nZXRDaGlsZHJlbigpLml0ZXJhdG9yKCk7IGl0Ci0JCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJYnVpbGRFbGVtZW50MlZpZXdNYXAoKFZpZXcpIGl0Lm5leHQoKSwgZWxlbWVudDJWaWV3TWFwLAotCQkJCQkJZWxlbWVudHMpOwotCQkJCWlmIChlbGVtZW50cy5zaXplKCkgPT0gZWxlbWVudDJWaWV3TWFwLnNpemUoKSkKLQkJCQkJcmV0dXJuIGVsZW1lbnQyVmlld01hcDsKLQkJCX0KLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBwYXJlbnRWaWV3LmdldFNvdXJjZUVkZ2VzKCkuaXRlcmF0b3IoKTsgaXQKLQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQlidWlsZEVsZW1lbnQyVmlld01hcCgoVmlldykgaXQubmV4dCgpLCBlbGVtZW50MlZpZXdNYXAsCi0JCQkJCQllbGVtZW50cyk7Ci0JCQkJaWYgKGVsZW1lbnRzLnNpemUoKSA9PSBlbGVtZW50MlZpZXdNYXAuc2l6ZSgpKQotCQkJCQlyZXR1cm4gZWxlbWVudDJWaWV3TWFwOwotCQkJfQotCQkJZm9yIChJdGVyYXRvciBpdCA9IHBhcmVudFZpZXcuZ2V0U291cmNlRWRnZXMoKS5pdGVyYXRvcigpOyBpdAotCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCWJ1aWxkRWxlbWVudDJWaWV3TWFwKChWaWV3KSBpdC5uZXh0KCksIGVsZW1lbnQyVmlld01hcCwKLQkJCQkJCWVsZW1lbnRzKTsKLQkJCQlpZiAoZWxlbWVudHMuc2l6ZSgpID09IGVsZW1lbnQyVmlld01hcC5zaXplKCkpCi0JCQkJCXJldHVybiBlbGVtZW50MlZpZXdNYXA7Ci0JCQl9Ci0JCQlyZXR1cm4gZWxlbWVudDJWaWV3TWFwOwotCQl9Ci0JfSAvL0xhenlFbGVtZW50MlZpZXdNYXAJCi0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvcGFydC9EaWFncmFtRGlhZ3JhbUZpbGVDcmVhdG9yLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL3BhcnQvRGlhZ3JhbURpYWdyYW1GaWxlQ3JlYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ODU4Nzk4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvcGFydC9EaWFncmFtRGlhZ3JhbUZpbGVDcmVhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLnBhcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlc291cmNlcy5lZGl0b3IuaWRlLnV0aWwuSURFRWRpdG9yRmlsZUNyZWF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXNvdXJjZXMuZWRpdG9yLnV0aWwuRGlhZ3JhbUZpbGVDcmVhdG9yOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERpYWdyYW1EaWFncmFtRmlsZUNyZWF0b3IgZXh0ZW5kcyBJREVFZGl0b3JGaWxlQ3JlYXRvciB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgRGlhZ3JhbURpYWdyYW1GaWxlQ3JlYXRvciBJTlNUQU5DRSA9IG5ldyBEaWFncmFtRGlhZ3JhbUZpbGVDcmVhdG9yKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBEaWFncmFtRmlsZUNyZWF0b3IgZ2V0SW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRFeHRlbnNpb24oKSB7Ci0JCXJldHVybiAiLndwZGQiOyAvLyROT04tTkxTLTEkCi0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9wYXJ0L0RpYWdyYW1EaWFncmFtUHJlZmVyZW5jZUluaXRpYWxpemVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL3BhcnQvRGlhZ3JhbURpYWdyYW1QcmVmZXJlbmNlSW5pdGlhbGl6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDFkZjE1Ni4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL3BhcnQvRGlhZ3JhbURpYWdyYW1QcmVmZXJlbmNlSW5pdGlhbGl6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQucGFydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUudXRpbC5EaWFncmFtQ29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wcmVmZXJlbmNlcy5EaWFncmFtUHJlZmVyZW5jZUluaXRpYWxpemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEaWFncmFtRGlhZ3JhbVByZWZlcmVuY2VJbml0aWFsaXplciBleHRlbmRzCi0JCURpYWdyYW1QcmVmZXJlbmNlSW5pdGlhbGl6ZXIgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJUHJlZmVyZW5jZVN0b3JlIGdldFByZWZlcmVuY2VTdG9yZSgpIHsKLQkJcmV0dXJuIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQucGFydC5XUEREaWFncmFtRWRpdG9yUGx1Z2luCi0JCQkJLmdldEluc3RhbmNlKCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZURlZmF1bHRQcmVmZXJlbmNlcygpIHsKLQkJc3VwZXIuaW5pdGlhbGl6ZURlZmF1bHRQcmVmZXJlbmNlcygpOwotCQlEaWFncmFtQ29yZVV0aWwuc2V0RGVmYXVsdEZvbnRQcmVmZXJlbmNlKGdldFByZWZlcmVuY2VTdG9yZSgpKTsKLQkJRGlhZ3JhbUNvcmVVdGlsLmhpZGVDb25uZWN0aW9uSGFuZGxlcyhnZXRQcmVmZXJlbmNlU3RvcmUoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9wYXJ0L0RpYWdyYW1Eb2N1bWVudFByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL3BhcnQvRGlhZ3JhbURvY3VtZW50UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWM3YzFiNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL3BhcnQvRGlhZ3JhbURvY3VtZW50UHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNTggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5wYXJ0OwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JU3RvcmFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3ViUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLklTY2hlZHVsaW5nUnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5NdWx0aVJ1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51aS5VUklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRUNvbnRlbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5EZW11bHRpcGxleGluZ0xpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5Ob3RpZmljYXRpb25GaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi53b3Jrc3BhY2UudXRpbC5Xb3Jrc3BhY2VTeW5jaHJvbml6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLkRpYWdyYW1FZGl0aW5nRG9tYWluRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlc291cmNlcy5lZGl0b3IuZG9jdW1lbnQuQWJzdHJhY3REb2N1bWVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVzb3VyY2VzLmVkaXRvci5kb2N1bWVudC5EaWFncmFtRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXNvdXJjZXMuZWRpdG9yLmRvY3VtZW50LkRpYWdyYW1Nb2RpZmljYXRpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlc291cmNlcy5lZGl0b3IuZG9jdW1lbnQuSURpYWdyYW1Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlc291cmNlcy5lZGl0b3IuZG9jdW1lbnQuSURpYWdyYW1Eb2N1bWVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVzb3VyY2VzLmVkaXRvci5kb2N1bWVudC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXNvdXJjZXMuZWRpdG9yLmlkZS5kb2N1bWVudC5GaWxlRGlhZ3JhbURvY3VtZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXNvdXJjZXMuZWRpdG9yLmlkZS5kb2N1bWVudC5GaWxlRGlhZ3JhbU1vZGlmaWNhdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVzb3VyY2VzLmVkaXRvci5pbnRlcm5hbC5FZGl0b3JTdGF0dXNDb2RlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlc291cmNlcy5lZGl0b3IuaW50ZXJuYWwudXRpbC5EaWFncmFtSU9VdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb3JlLnJlc291cmNlcy5HTUZSZXNvdXJjZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uSVJ1bm5hYmxlQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklGaWxlRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5GaWxlRWRpdG9ySW5wdXQ7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRGlhZ3JhbURvY3VtZW50UHJvdmlkZXIgZXh0ZW5kcyBBYnN0cmFjdERvY3VtZW50UHJvdmlkZXIgaW1wbGVtZW50cwotCQlJRGlhZ3JhbURvY3VtZW50UHJvdmlkZXIgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFbGVtZW50SW5mbyBjcmVhdGVFbGVtZW50SW5mbyhPYmplY3QgZWxlbWVudCkKLQkJCXRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKGZhbHNlID09IGVsZW1lbnQgaW5zdGFuY2VvZiBGaWxlRWRpdG9ySW5wdXQKLQkJCQkmJiBmYWxzZSA9PSBlbGVtZW50IGluc3RhbmNlb2YgVVJJRWRpdG9ySW5wdXQpIHsKLQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKAotCQkJCQluZXcgU3RhdHVzKAotCQkJCQkJCUlTdGF0dXMuRVJST1IsCi0JCQkJCQkJV1BERGlhZ3JhbUVkaXRvclBsdWdpbi5JRCwKLQkJCQkJCQkwLAotCQkJCQkJCU5MUwotCQkJCQkJCQkJLmJpbmQoCi0JCQkJCQkJCQkJCU1lc3NhZ2VzLkRpYWdyYW1Eb2N1bWVudFByb3ZpZGVyX0luY29ycmVjdElucHV0RXJyb3IsCi0JCQkJCQkJCQkJCW5ldyBPYmplY3RbXSB7Ci0JCQkJCQkJCQkJCQkJZWxlbWVudCwKLQkJCQkJCQkJCQkJCQkib3JnLmVjbGlwc2UudWkucGFydC5GaWxlRWRpdG9ySW5wdXQiLAotCQkJCQkJCQkJCQkJCSJvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnVpLlVSSUVkaXRvcklucHV0IiB9KSwKLQkJCQkJCQludWxsKSk7Ci0JCX0KLQkJSUVkaXRvcklucHV0IGVkaXRvcklucHV0ID0gKElFZGl0b3JJbnB1dCkgZWxlbWVudDsKLQkJSURpYWdyYW1Eb2N1bWVudCBkb2N1bWVudCA9IChJRGlhZ3JhbURvY3VtZW50KSBjcmVhdGVEb2N1bWVudChlZGl0b3JJbnB1dCk7Ci0KLQkJUmVzb3VyY2VTZXRJbmZvIGluZm8gPSBuZXcgUmVzb3VyY2VTZXRJbmZvKGRvY3VtZW50LCBlZGl0b3JJbnB1dCk7Ci0JCWluZm8uc2V0TW9kaWZpY2F0aW9uU3RhbXAoY29tcHV0ZU1vZGlmaWNhdGlvblN0YW1wKGluZm8pKTsKLQkJaW5mby5mU3RhdHVzID0gbnVsbDsKLQkJcmV0dXJuIGluZm87Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJRG9jdW1lbnQgY3JlYXRlRG9jdW1lbnQoT2JqZWN0IGVsZW1lbnQpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKGZhbHNlID09IGVsZW1lbnQgaW5zdGFuY2VvZiBGaWxlRWRpdG9ySW5wdXQKLQkJCQkmJiBmYWxzZSA9PSBlbGVtZW50IGluc3RhbmNlb2YgVVJJRWRpdG9ySW5wdXQpIHsKLQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKAotCQkJCQluZXcgU3RhdHVzKAotCQkJCQkJCUlTdGF0dXMuRVJST1IsCi0JCQkJCQkJV1BERGlhZ3JhbUVkaXRvclBsdWdpbi5JRCwKLQkJCQkJCQkwLAotCQkJCQkJCU5MUwotCQkJCQkJCQkJLmJpbmQoCi0JCQkJCQkJCQkJCU1lc3NhZ2VzLkRpYWdyYW1Eb2N1bWVudFByb3ZpZGVyX0luY29ycmVjdElucHV0RXJyb3IsCi0JCQkJCQkJCQkJCW5ldyBPYmplY3RbXSB7Ci0JCQkJCQkJCQkJCQkJZWxlbWVudCwKLQkJCQkJCQkJCQkJCQkib3JnLmVjbGlwc2UudWkucGFydC5GaWxlRWRpdG9ySW5wdXQiLAotCQkJCQkJCQkJCQkJCSJvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnVpLlVSSUVkaXRvcklucHV0IiB9KSwKLQkJCQkJCQludWxsKSk7Ci0JCX0KLQkJSURvY3VtZW50IGRvY3VtZW50ID0gY3JlYXRlRW1wdHlEb2N1bWVudCgpOwotCQlzZXREb2N1bWVudENvbnRlbnQoZG9jdW1lbnQsIChJRWRpdG9ySW5wdXQpIGVsZW1lbnQpOwotCQlzZXR1cERvY3VtZW50KGVsZW1lbnQsIGRvY3VtZW50KTsKLQkJcmV0dXJuIGRvY3VtZW50OwotCX0KLQotCS8qKgotCSAqIFNldHMgdXAgdGhlIGdpdmVuIGRvY3VtZW50IGFzIGl0IHdvdWxkIGJlIHByb3ZpZGVkIGZvciB0aGUgZ2l2ZW4gZWxlbWVudC4gVGhlCi0JICogY29udGVudCBvZiB0aGUgZG9jdW1lbnQgaXMgbm90IGNoYW5nZWQuIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBpcyBlbXB0eS4KLQkgKiBTdWJjbGFzc2VzIG1heSByZWltcGxlbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudCB0aGUgYmx1ZS1wcmludCBlbGVtZW50Ci0JICogQHBhcmFtIGRvY3VtZW50IHRoZSBkb2N1bWVudCB0byBzZXQgdXAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0dXBEb2N1bWVudChPYmplY3QgZWxlbWVudCwgSURvY3VtZW50IGRvY3VtZW50KSB7Ci0JCS8vIGZvciBzdWJjbGFzc2VzCi0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgbG9uZyBjb21wdXRlTW9kaWZpY2F0aW9uU3RhbXAoUmVzb3VyY2VTZXRJbmZvIGluZm8pIHsKLQkJaW50IHJlc3VsdCA9IDA7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSBpbmZvLmdldFJlc291cmNlU2V0KCkuZ2V0UmVzb3VyY2VzKCkuaXRlcmF0b3IoKTsgaXQKLQkJCQkuaGFzTmV4dCgpOykgewotCQkJUmVzb3VyY2UgbmV4dFJlc291cmNlID0gKFJlc291cmNlKSBpdC5uZXh0KCk7Ci0JCQlJRmlsZSBmaWxlID0gV29ya3NwYWNlU3luY2hyb25pemVyLmdldEZpbGUobmV4dFJlc291cmNlKTsKLQkJCWlmIChmaWxlICE9IG51bGwpIHsKLQkJCQlpZiAoZmlsZS5nZXRMb2NhdGlvbigpICE9IG51bGwpIHsKLQkJCQkJcmVzdWx0ICs9IGZpbGUuZ2V0TG9jYXRpb24oKS50b0ZpbGUoKS5sYXN0TW9kaWZpZWQoKTsKLQkJCQl9IGVsc2UgewotCQkJCQlyZXN1bHQgKz0gZmlsZS5nZXRNb2RpZmljYXRpb25TdGFtcCgpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSURvY3VtZW50IGNyZWF0ZUVtcHR5RG9jdW1lbnQoKSB7Ci0JCURpYWdyYW1Eb2N1bWVudCBkb2N1bWVudCA9IG5ldyBEaWFncmFtRG9jdW1lbnQoKTsKLQkJZG9jdW1lbnQuc2V0RWRpdGluZ0RvbWFpbihjcmVhdGVFZGl0aW5nRG9tYWluKCkpOwotCQlyZXR1cm4gZG9jdW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gY3JlYXRlRWRpdGluZ0RvbWFpbigpIHsKLQkJVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gZWRpdGluZ0RvbWFpbiA9IERpYWdyYW1FZGl0aW5nRG9tYWluRmFjdG9yeQotCQkJCS5nZXRJbnN0YW5jZSgpLmNyZWF0ZUVkaXRpbmdEb21haW4oKTsKLQkJZWRpdGluZ0RvbWFpbi5zZXRJRCgib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5FZGl0aW5nRG9tYWluIik7IC8vJE5PTi1OTFMtMSQKLQkJZmluYWwgTm90aWZpY2F0aW9uRmlsdGVyIGRpYWdyYW1SZXNvdXJjZU1vZGlmaWVkRmlsdGVyID0gTm90aWZpY2F0aW9uRmlsdGVyCi0JCQkJLmNyZWF0ZU5vdGlmaWVyRmlsdGVyKGVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VTZXQoKSkuYW5kKAotCQkJCQkJTm90aWZpY2F0aW9uRmlsdGVyCi0JCQkJCQkJCS5jcmVhdGVFdmVudFR5cGVGaWx0ZXIoTm90aWZpY2F0aW9uLkFERCkpLmFuZCgKLQkJCQkJCU5vdGlmaWNhdGlvbkZpbHRlci5jcmVhdGVGZWF0dXJlRmlsdGVyKAotCQkJCQkJCQlSZXNvdXJjZVNldC5jbGFzcywKLQkJCQkJCQkJUmVzb3VyY2VTZXQuUkVTT1VSQ0VfU0VUX19SRVNPVVJDRVMpKTsKLQkJZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpLmVBZGFwdGVycygpLmFkZChuZXcgQWRhcHRlcigpIHsKLQotCQkJcHJpdmF0ZSBOb3RpZmllciBteVRhcmdlcjsKLQotCQkJcHVibGljIE5vdGlmaWVyIGdldFRhcmdldCgpIHsKLQkJCQlyZXR1cm4gbXlUYXJnZXI7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBib29sZWFuIGlzQWRhcHRlckZvclR5cGUoT2JqZWN0IHR5cGUpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQkJCWlmIChkaWFncmFtUmVzb3VyY2VNb2RpZmllZEZpbHRlci5tYXRjaGVzKG5vdGlmaWNhdGlvbikpIHsKLQkJCQkJT2JqZWN0IHZhbHVlID0gbm90aWZpY2F0aW9uLmdldE5ld1ZhbHVlKCk7Ci0JCQkJCWlmICh2YWx1ZSBpbnN0YW5jZW9mIFJlc291cmNlKSB7Ci0JCQkJCQkoKFJlc291cmNlKSB2YWx1ZSkuc2V0VHJhY2tpbmdNb2RpZmljYXRpb24odHJ1ZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHNldFRhcmdldChOb3RpZmllciBuZXdUYXJnZXQpIHsKLQkJCQlteVRhcmdlciA9IG5ld1RhcmdldDsKLQkJCX0KLQotCQl9KTsKLQotCQlyZXR1cm4gZWRpdGluZ0RvbWFpbjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0RG9jdW1lbnRDb250ZW50KElEb2N1bWVudCBkb2N1bWVudCwgSUVkaXRvcklucHV0IGVsZW1lbnQpCi0JCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlEaWFncmFtRG9jdW1lbnQgZGlhZ3JhbURvY3VtZW50ID0gKElEaWFncmFtRG9jdW1lbnQpIGRvY3VtZW50OwotCQlUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiBkb21haW4gPSBkaWFncmFtRG9jdW1lbnQuZ2V0RWRpdGluZ0RvbWFpbigpOwotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEZpbGVFZGl0b3JJbnB1dCkgewotCQkJSVN0b3JhZ2Ugc3RvcmFnZSA9ICgoRmlsZUVkaXRvcklucHV0KSBlbGVtZW50KS5nZXRTdG9yYWdlKCk7Ci0JCQlEaWFncmFtIGRpYWdyYW0gPSBEaWFncmFtSU9VdGlsLmxvYWQoZG9tYWluLCBzdG9yYWdlLCB0cnVlLAotCQkJCQlnZXRQcm9ncmVzc01vbml0b3IoKSk7Ci0JCQlkb2N1bWVudC5zZXRDb250ZW50KGRpYWdyYW0pOwotCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBVUklFZGl0b3JJbnB1dCkgewotCQkJVVJJIHVyaSA9ICgoVVJJRWRpdG9ySW5wdXQpIGVsZW1lbnQpLmdldFVSSSgpOwotCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSBudWxsOwotCQkJdHJ5IHsKLQkJCQlyZXNvdXJjZSA9IGRvbWFpbi5nZXRSZXNvdXJjZVNldCgpLmdldFJlc291cmNlKAotCQkJCQkJdXJpLnRyaW1GcmFnbWVudCgpLCBmYWxzZSk7Ci0JCQkJaWYgKHJlc291cmNlID09IG51bGwpIHsKLQkJCQkJcmVzb3VyY2UgPSBkb21haW4uZ2V0UmVzb3VyY2VTZXQoKS5jcmVhdGVSZXNvdXJjZSgKLQkJCQkJCQl1cmkudHJpbUZyYWdtZW50KCkpOwotCQkJCX0KLQkJCQlpZiAoIXJlc291cmNlLmlzTG9hZGVkKCkpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCU1hcCBvcHRpb25zID0gbmV3IEhhc2hNYXAoR01GUmVzb3VyY2VGYWN0b3J5Ci0JCQkJCQkJCS5nZXREZWZhdWx0TG9hZE9wdGlvbnMoKSk7Ci0JCQkJCQkvLyBAc2VlIDE3MTA2MCAKLQkJCQkJCS8vIG9wdGlvbnMucHV0KG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuWE1MUmVzb3VyY2UuT1BUSU9OX1JFQ09SRF9VTktOT1dOX0ZFQVRVUkUsIEJvb2xlYW4uVFJVRSk7Ci0JCQkJCQlyZXNvdXJjZS5sb2FkKG9wdGlvbnMpOwotCQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlyZXNvdXJjZS51bmxvYWQoKTsKLQkJCQkJCXRocm93IGU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKHJlc291cmNlID09IG51bGwpIHsKLQkJCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oCi0JCQkJCQkJTWVzc2FnZXMuRGlhZ3JhbURvY3VtZW50UHJvdmlkZXJfVW5hYmxlVG9Mb2FkUmVzb3VyY2VFcnJvcik7Ci0JCQkJfQotCQkJCWlmICh1cmkuZnJhZ21lbnQoKSAhPSBudWxsKSB7Ci0JCQkJCUVPYmplY3Qgcm9vdEVsZW1lbnQgPSByZXNvdXJjZS5nZXRFT2JqZWN0KHVyaS5mcmFnbWVudCgpKTsKLQkJCQkJaWYgKHJvb3RFbGVtZW50IGluc3RhbmNlb2YgRGlhZ3JhbSkgewotCQkJCQkJZG9jdW1lbnQuc2V0Q29udGVudCgoRGlhZ3JhbSkgcm9vdEVsZW1lbnQpOwotCQkJCQkJcmV0dXJuOwotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJZm9yIChJdGVyYXRvciBpdCA9IHJlc291cmNlLmdldENvbnRlbnRzKCkuaXRlcmF0b3IoKTsgaXQKLQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJT2JqZWN0IHJvb3RFbGVtZW50ID0gaXQubmV4dCgpOwotCQkJCQkJaWYgKHJvb3RFbGVtZW50IGluc3RhbmNlb2YgRGlhZ3JhbSkgewotCQkJCQkJCWRvY3VtZW50LnNldENvbnRlbnQoKERpYWdyYW0pIHJvb3RFbGVtZW50KTsKLQkJCQkJCQlyZXR1cm47Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oCi0JCQkJCQlNZXNzYWdlcy5EaWFncmFtRG9jdW1lbnRQcm92aWRlcl9Ob0RpYWdyYW1JblJlc291cmNlRXJyb3IpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlDb3JlRXhjZXB0aW9uIHRocm93bkV4Y3AgPSBudWxsOwotCQkJCWlmIChlIGluc3RhbmNlb2YgQ29yZUV4Y2VwdGlvbikgewotCQkJCQl0aHJvd25FeGNwID0gKENvcmVFeGNlcHRpb24pIGU7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJU3RyaW5nIG1zZyA9IGUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpOwotCQkJCQl0aHJvd25FeGNwID0gbmV3IENvcmVFeGNlcHRpb24oCi0JCQkJCQkJbmV3IFN0YXR1cygKLQkJCQkJCQkJCUlTdGF0dXMuRVJST1IsCi0JCQkJCQkJCQlXUEREaWFncmFtRWRpdG9yUGx1Z2luLklELAotCQkJCQkJCQkJMCwKLQkJCQkJCQkJCW1zZyAhPSBudWxsID8gbXNnCi0JCQkJCQkJCQkJCTogTWVzc2FnZXMuRGlhZ3JhbURvY3VtZW50UHJvdmlkZXJfRGlhZ3JhbUxvYWRpbmdFcnJvciwKLQkJCQkJCQkJCWUpKTsKLQkJCQl9Ci0JCQkJdGhyb3cgdGhyb3duRXhjcDsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKAotCQkJCQluZXcgU3RhdHVzKAotCQkJCQkJCUlTdGF0dXMuRVJST1IsCi0JCQkJCQkJV1BERGlhZ3JhbUVkaXRvclBsdWdpbi5JRCwKLQkJCQkJCQkwLAotCQkJCQkJCU5MUwotCQkJCQkJCQkJLmJpbmQoCi0JCQkJCQkJCQkJCU1lc3NhZ2VzLkRpYWdyYW1Eb2N1bWVudFByb3ZpZGVyX0luY29ycmVjdElucHV0RXJyb3IsCi0JCQkJCQkJCQkJCW5ldyBPYmplY3RbXSB7Ci0JCQkJCQkJCQkJCQkJZWxlbWVudCwKLQkJCQkJCQkJCQkJCQkib3JnLmVjbGlwc2UudWkucGFydC5GaWxlRWRpdG9ySW5wdXQiLAotCQkJCQkJCQkJCQkJCSJvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnVpLlVSSUVkaXRvcklucHV0IiB9KSwKLQkJCQkJCQludWxsKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGxvbmcgZ2V0TW9kaWZpY2F0aW9uU3RhbXAoT2JqZWN0IGVsZW1lbnQpIHsKLQkJUmVzb3VyY2VTZXRJbmZvIGluZm8gPSBnZXRSZXNvdXJjZVNldEluZm8oZWxlbWVudCk7Ci0JCWlmIChpbmZvICE9IG51bGwpIHsKLQkJCXJldHVybiBjb21wdXRlTW9kaWZpY2F0aW9uU3RhbXAoaW5mbyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldE1vZGlmaWNhdGlvblN0YW1wKGVsZW1lbnQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0RlbGV0ZWQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJSURpYWdyYW1Eb2N1bWVudCBkb2N1bWVudCA9IGdldERpYWdyYW1Eb2N1bWVudChlbGVtZW50KTsKLQkJaWYgKGRvY3VtZW50ICE9IG51bGwpIHsKLQkJCVJlc291cmNlIGRpYWdyYW1SZXNvdXJjZSA9IGRvY3VtZW50LmdldERpYWdyYW0oKS5lUmVzb3VyY2UoKTsKLQkJCWlmIChkaWFncmFtUmVzb3VyY2UgIT0gbnVsbCkgewotCQkJCUlGaWxlIGZpbGUgPSBXb3Jrc3BhY2VTeW5jaHJvbml6ZXIuZ2V0RmlsZShkaWFncmFtUmVzb3VyY2UpOwotCQkJCXJldHVybiBmaWxlID09IG51bGwgfHwgZmlsZS5nZXRMb2NhdGlvbigpID09IG51bGwKLQkJCQkJCXx8ICFmaWxlLmdldExvY2F0aW9uKCkudG9GaWxlKCkuZXhpc3RzKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmlzRGVsZXRlZChlbGVtZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJlc291cmNlU2V0SW5mbyBnZXRSZXNvdXJjZVNldEluZm8oT2JqZWN0IGVkaXRvcklucHV0KSB7Ci0JCXJldHVybiAoUmVzb3VyY2VTZXRJbmZvKSBzdXBlci5nZXRFbGVtZW50SW5mbyhlZGl0b3JJbnB1dCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRpc3Bvc2VFbGVtZW50SW5mbyhPYmplY3QgZWxlbWVudCwgRWxlbWVudEluZm8gaW5mbykgewotCQlpZiAoaW5mbyBpbnN0YW5jZW9mIFJlc291cmNlU2V0SW5mbykgewotCQkJUmVzb3VyY2VTZXRJbmZvIHJlc291cmNlU2V0SW5mbyA9IChSZXNvdXJjZVNldEluZm8pIGluZm87Ci0JCQlyZXNvdXJjZVNldEluZm8uZGlzcG9zZSgpOwotCQl9Ci0JCXN1cGVyLmRpc3Bvc2VFbGVtZW50SW5mbyhlbGVtZW50LCBpbmZvKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZG9WYWxpZGF0ZVN0YXRlKE9iamVjdCBlbGVtZW50LCBPYmplY3QgY29tcHV0YXRpb25Db250ZXh0KQotCQkJdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlSZXNvdXJjZVNldEluZm8gaW5mbyA9IGdldFJlc291cmNlU2V0SW5mbyhlbGVtZW50KTsKLQkJaWYgKGluZm8gIT0gbnVsbCkgewotCQkJQ29sbGVjdGlvbiBmaWxlczJWYWxpZGF0ZSA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBpbmZvLmdldFJlc291cmNlU2V0KCkuZ2V0UmVzb3VyY2VzKCkuaXRlcmF0b3IoKTsgaXQKLQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQlSZXNvdXJjZSBuZXh0UmVzb3VyY2UgPSAoUmVzb3VyY2UpIGl0Lm5leHQoKTsKLQkJCQlJRmlsZSBmaWxlID0gV29ya3NwYWNlU3luY2hyb25pemVyLmdldEZpbGUobmV4dFJlc291cmNlKTsKLQkJCQlpZiAoZmlsZSAhPSBudWxsICYmIGZpbGUuaXNSZWFkT25seSgpKSB7Ci0JCQkJCWZpbGVzMlZhbGlkYXRlLmFkZChmaWxlKTsKLQkJCQl9Ci0JCQl9Ci0JCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkudmFsaWRhdGVFZGl0KAotCQkJCQkoSUZpbGVbXSkgZmlsZXMyVmFsaWRhdGUudG9BcnJheShuZXcgSUZpbGVbZmlsZXMyVmFsaWRhdGUKLQkJCQkJCQkuc2l6ZSgpXSksIGNvbXB1dGF0aW9uQ29udGV4dCk7Ci0JCX0KLQotCQlzdXBlci5kb1ZhbGlkYXRlU3RhdGUoZWxlbWVudCwgY29tcHV0YXRpb25Db250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNSZWFkT25seShPYmplY3QgZWxlbWVudCkgewotCQlSZXNvdXJjZVNldEluZm8gaW5mbyA9IGdldFJlc291cmNlU2V0SW5mbyhlbGVtZW50KTsKLQkJaWYgKGluZm8gIT0gbnVsbCkgewotCQkJaWYgKGluZm8uaXNVcGRhdGVDYWNoZSgpKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJdXBkYXRlQ2FjaGUoZWxlbWVudCk7Ci0JCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBleCkgewotCQkJCQlXUEREaWFncmFtRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkubG9nRXJyb3IoCi0JCQkJCQkJTWVzc2FnZXMuRGlhZ3JhbURvY3VtZW50UHJvdmlkZXJfaXNNb2RpZmlhYmxlLCBleCk7Ci0JCQkJCS8vIEVycm9yIG1lc3NhZ2UgdG8gbG9nIHdhcyBpbml0aWFsbHkgdGFrZW4gZnJvbSBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlc291cmNlcy5lZGl0b3IuaWRlLmludGVybmFsLmwxMG4uRWRpdG9yTWVzc2FnZXMuU3RvcmFnZURvY3VtZW50UHJvdmlkZXJfaXNNb2RpZmlhYmxlCi0JCQkJfQotCQkJfQotCQkJcmV0dXJuIGluZm8uaXNSZWFkT25seSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5pc1JlYWRPbmx5KGVsZW1lbnQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc01vZGlmaWFibGUoT2JqZWN0IGVsZW1lbnQpIHsKLQkJaWYgKCFpc1N0YXRlVmFsaWRhdGVkKGVsZW1lbnQpKSB7Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEZpbGVFZGl0b3JJbnB1dAotCQkJCQl8fCBlbGVtZW50IGluc3RhbmNlb2YgVVJJRWRpdG9ySW5wdXQpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlSZXNvdXJjZVNldEluZm8gaW5mbyA9IGdldFJlc291cmNlU2V0SW5mbyhlbGVtZW50KTsKLQkJaWYgKGluZm8gIT0gbnVsbCkgewotCQkJaWYgKGluZm8uaXNVcGRhdGVDYWNoZSgpKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJdXBkYXRlQ2FjaGUoZWxlbWVudCk7Ci0JCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBleCkgewotCQkJCQlXUEREaWFncmFtRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkubG9nRXJyb3IoCi0JCQkJCQkJTWVzc2FnZXMuRGlhZ3JhbURvY3VtZW50UHJvdmlkZXJfaXNNb2RpZmlhYmxlLCBleCk7Ci0JCQkJCS8vIEVycm9yIG1lc3NhZ2UgdG8gbG9nIHdhcyBpbml0aWFsbHkgdGFrZW4gZnJvbSBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlc291cmNlcy5lZGl0b3IuaWRlLmludGVybmFsLmwxMG4uRWRpdG9yTWVzc2FnZXMuU3RvcmFnZURvY3VtZW50UHJvdmlkZXJfaXNNb2RpZmlhYmxlCi0JCQkJfQotCQkJfQotCQkJcmV0dXJuIGluZm8uaXNNb2RpZmlhYmxlKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmlzTW9kaWZpYWJsZShlbGVtZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlQ2FjaGUoT2JqZWN0IGVsZW1lbnQpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJUmVzb3VyY2VTZXRJbmZvIGluZm8gPSBnZXRSZXNvdXJjZVNldEluZm8oZWxlbWVudCk7Ci0JCWlmIChpbmZvICE9IG51bGwpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBpbmZvLmdldFJlc291cmNlU2V0KCkuZ2V0UmVzb3VyY2VzKCkuaXRlcmF0b3IoKTsgaXQKLQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQlSZXNvdXJjZSBuZXh0UmVzb3VyY2UgPSAoUmVzb3VyY2UpIGl0Lm5leHQoKTsKLQkJCQlJRmlsZSBmaWxlID0gV29ya3NwYWNlU3luY2hyb25pemVyLmdldEZpbGUobmV4dFJlc291cmNlKTsKLQkJCQlpZiAoZmlsZSAhPSBudWxsICYmIGZpbGUuaXNSZWFkT25seSgpKSB7Ci0JCQkJCWluZm8uc2V0UmVhZE9ubHkodHJ1ZSk7Ci0JCQkJCWluZm8uc2V0TW9kaWZpYWJsZShmYWxzZSk7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQl9Ci0JCQlpbmZvLnNldFJlYWRPbmx5KGZhbHNlKTsKLQkJCWluZm8uc2V0TW9kaWZpYWJsZSh0cnVlKTsKLQkJCXJldHVybjsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkb1VwZGF0ZVN0YXRlQ2FjaGUoT2JqZWN0IGVsZW1lbnQpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJUmVzb3VyY2VTZXRJbmZvIGluZm8gPSBnZXRSZXNvdXJjZVNldEluZm8oZWxlbWVudCk7Ci0JCWlmIChpbmZvICE9IG51bGwpIHsKLQkJCWluZm8uc2V0VXBkYXRlQ2FjaGUodHJ1ZSk7Ci0JCX0KLQkJc3VwZXIuZG9VcGRhdGVTdGF0ZUNhY2hlKGVsZW1lbnQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1N5bmNocm9uaXplZChPYmplY3QgZWxlbWVudCkgewotCQlSZXNvdXJjZVNldEluZm8gaW5mbyA9IGdldFJlc291cmNlU2V0SW5mbyhlbGVtZW50KTsKLQkJaWYgKGluZm8gIT0gbnVsbCkgewotCQkJcmV0dXJuIGluZm8uaXNTeW5jaHJvbml6ZWQoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuaXNTeW5jaHJvbml6ZWQoZWxlbWVudCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJU2NoZWR1bGluZ1J1bGUgZ2V0UmVzZXRSdWxlKE9iamVjdCBlbGVtZW50KSB7Ci0JCVJlc291cmNlU2V0SW5mbyBpbmZvID0gZ2V0UmVzb3VyY2VTZXRJbmZvKGVsZW1lbnQpOwotCQlpZiAoaW5mbyAhPSBudWxsKSB7Ci0JCQlDb2xsZWN0aW9uIHJ1bGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJZm9yIChJdGVyYXRvciBpdCA9IGluZm8uZ2V0UmVzb3VyY2VTZXQoKS5nZXRSZXNvdXJjZXMoKS5pdGVyYXRvcigpOyBpdAotCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCVJlc291cmNlIG5leHRSZXNvdXJjZSA9IChSZXNvdXJjZSkgaXQubmV4dCgpOwotCQkJCUlGaWxlIGZpbGUgPSBXb3Jrc3BhY2VTeW5jaHJvbml6ZXIuZ2V0RmlsZShuZXh0UmVzb3VyY2UpOwotCQkJCWlmIChmaWxlICE9IG51bGwpIHsKLQkJCQkJcnVsZXMuYWRkKFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSdWxlRmFjdG9yeSgpCi0JCQkJCQkJLm1vZGlmeVJ1bGUoZmlsZSkpOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBuZXcgTXVsdGlSdWxlKChJU2NoZWR1bGluZ1J1bGVbXSkgcnVsZXMKLQkJCQkJLnRvQXJyYXkobmV3IElTY2hlZHVsaW5nUnVsZVtydWxlcy5zaXplKCldKSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJU2NoZWR1bGluZ1J1bGUgZ2V0U2F2ZVJ1bGUoT2JqZWN0IGVsZW1lbnQpIHsKLQkJUmVzb3VyY2VTZXRJbmZvIGluZm8gPSBnZXRSZXNvdXJjZVNldEluZm8oZWxlbWVudCk7Ci0JCWlmIChpbmZvICE9IG51bGwpIHsKLQkJCUNvbGxlY3Rpb24gcnVsZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gaW5mby5nZXRSZXNvdXJjZVNldCgpLmdldFJlc291cmNlcygpLml0ZXJhdG9yKCk7IGl0Ci0JCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJUmVzb3VyY2UgbmV4dFJlc291cmNlID0gKFJlc291cmNlKSBpdC5uZXh0KCk7Ci0JCQkJSUZpbGUgZmlsZSA9IFdvcmtzcGFjZVN5bmNocm9uaXplci5nZXRGaWxlKG5leHRSZXNvdXJjZSk7Ci0JCQkJaWYgKGZpbGUgIT0gbnVsbCkgewotCQkJCQlydWxlcy5hZGQoY29tcHV0ZVNjaGVkdWxpbmdSdWxlKGZpbGUpKTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gbmV3IE11bHRpUnVsZSgoSVNjaGVkdWxpbmdSdWxlW10pIHJ1bGVzCi0JCQkJCS50b0FycmF5KG5ldyBJU2NoZWR1bGluZ1J1bGVbcnVsZXMuc2l6ZSgpXSkpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSVNjaGVkdWxpbmdSdWxlIGdldFN5bmNocm9uaXplUnVsZShPYmplY3QgZWxlbWVudCkgewotCQlSZXNvdXJjZVNldEluZm8gaW5mbyA9IGdldFJlc291cmNlU2V0SW5mbyhlbGVtZW50KTsKLQkJaWYgKGluZm8gIT0gbnVsbCkgewotCQkJQ29sbGVjdGlvbiBydWxlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBpbmZvLmdldFJlc291cmNlU2V0KCkuZ2V0UmVzb3VyY2VzKCkuaXRlcmF0b3IoKTsgaXQKLQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQlSZXNvdXJjZSBuZXh0UmVzb3VyY2UgPSAoUmVzb3VyY2UpIGl0Lm5leHQoKTsKLQkJCQlJRmlsZSBmaWxlID0gV29ya3NwYWNlU3luY2hyb25pemVyLmdldEZpbGUobmV4dFJlc291cmNlKTsKLQkJCQlpZiAoZmlsZSAhPSBudWxsKSB7Ci0JCQkJCXJ1bGVzLmFkZChSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0UnVsZUZhY3RvcnkoKQotCQkJCQkJCS5yZWZyZXNoUnVsZShmaWxlKSk7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIG5ldyBNdWx0aVJ1bGUoKElTY2hlZHVsaW5nUnVsZVtdKSBydWxlcwotCQkJCQkudG9BcnJheShuZXcgSVNjaGVkdWxpbmdSdWxlW3J1bGVzLnNpemUoKV0pKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElTY2hlZHVsaW5nUnVsZSBnZXRWYWxpZGF0ZVN0YXRlUnVsZShPYmplY3QgZWxlbWVudCkgewotCQlSZXNvdXJjZVNldEluZm8gaW5mbyA9IGdldFJlc291cmNlU2V0SW5mbyhlbGVtZW50KTsKLQkJaWYgKGluZm8gIT0gbnVsbCkgewotCQkJQ29sbGVjdGlvbiBmaWxlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBpbmZvLmdldFJlc291cmNlU2V0KCkuZ2V0UmVzb3VyY2VzKCkuaXRlcmF0b3IoKTsgaXQKLQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQlSZXNvdXJjZSBuZXh0UmVzb3VyY2UgPSAoUmVzb3VyY2UpIGl0Lm5leHQoKTsKLQkJCQlJRmlsZSBmaWxlID0gV29ya3NwYWNlU3luY2hyb25pemVyLmdldEZpbGUobmV4dFJlc291cmNlKTsKLQkJCQlpZiAoZmlsZSAhPSBudWxsKSB7Ci0JCQkJCWZpbGVzLmFkZChmaWxlKTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJ1bGVGYWN0b3J5KCkKLQkJCQkJLnZhbGlkYXRlRWRpdFJ1bGUoCi0JCQkJCQkJKElGaWxlW10pIGZpbGVzLnRvQXJyYXkobmV3IElGaWxlW2ZpbGVzLnNpemUoKV0pKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBJU2NoZWR1bGluZ1J1bGUgY29tcHV0ZVNjaGVkdWxpbmdSdWxlKElSZXNvdXJjZSB0b0NyZWF0ZU9yTW9kaWZ5KSB7Ci0JCWlmICh0b0NyZWF0ZU9yTW9kaWZ5LmV4aXN0cygpKQotCQkJcmV0dXJuIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSdWxlRmFjdG9yeSgpLm1vZGlmeVJ1bGUoCi0JCQkJCXRvQ3JlYXRlT3JNb2RpZnkpOwotCi0JCUlSZXNvdXJjZSBwYXJlbnQgPSB0b0NyZWF0ZU9yTW9kaWZ5OwotCQlkbyB7Ci0JCQkvKgotCQkJICogWFhYIFRoaXMgaXMgYSB3b3JrYXJvdW5kIGZvcgotCQkJICogaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTY3NjAxCi0JCQkgKiBJUmVzb3VyY2VSdWxlRmFjdG9yeS5jcmVhdGVSdWxlIHNob3VsZCBpdGVyYXRlIHRoZSBoaWVyYXJjaHkKLQkJCSAqIGl0c2VsZi4KLQkJCSAqLwotCQkJdG9DcmVhdGVPck1vZGlmeSA9IHBhcmVudDsKLQkJCXBhcmVudCA9IHRvQ3JlYXRlT3JNb2RpZnkuZ2V0UGFyZW50KCk7Ci0JCX0gd2hpbGUgKHBhcmVudCAhPSBudWxsICYmICFwYXJlbnQuZXhpc3RzKCkpOwotCi0JCXJldHVybiBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0UnVsZUZhY3RvcnkoKS5jcmVhdGVSdWxlKAotCQkJCXRvQ3JlYXRlT3JNb2RpZnkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkb1N5bmNocm9uaXplKE9iamVjdCBlbGVtZW50LCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCi0JCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCVJlc291cmNlU2V0SW5mbyBpbmZvID0gZ2V0UmVzb3VyY2VTZXRJbmZvKGVsZW1lbnQpOwotCQlpZiAoaW5mbyAhPSBudWxsKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gaW5mby5nZXRSZXNvdXJjZVNldCgpLmdldFJlc291cmNlcygpLml0ZXJhdG9yKCk7IGl0Ci0JCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJUmVzb3VyY2UgbmV4dFJlc291cmNlID0gKFJlc291cmNlKSBpdC5uZXh0KCk7Ci0JCQkJaGFuZGxlRWxlbWVudENoYW5nZWQoaW5mbywgbmV4dFJlc291cmNlLCBtb25pdG9yKTsKLQkJCX0KLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5kb1N5bmNocm9uaXplKGVsZW1lbnQsIG1vbml0b3IpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkb1NhdmVEb2N1bWVudChJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIE9iamVjdCBlbGVtZW50LAotCQkJSURvY3VtZW50IGRvY3VtZW50LCBib29sZWFuIG92ZXJ3cml0ZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlSZXNvdXJjZVNldEluZm8gaW5mbyA9IGdldFJlc291cmNlU2V0SW5mbyhlbGVtZW50KTsKLQkJaWYgKGluZm8gIT0gbnVsbCkgewotCQkJaWYgKCFvdmVyd3JpdGUgJiYgIWluZm8uaXNTeW5jaHJvbml6ZWQoKSkgewotCQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKAotCQkJCQkJbmV3IFN0YXR1cygKLQkJCQkJCQkJSVN0YXR1cy5FUlJPUiwKLQkJCQkJCQkJV1BERGlhZ3JhbUVkaXRvclBsdWdpbi5JRCwKLQkJCQkJCQkJSVN0YXR1cy5PSywKLQkJCQkJCQkJTWVzc2FnZXMuRGlhZ3JhbURvY3VtZW50UHJvdmlkZXJfVW5zeW5jaHJvbml6ZWRGaWxlU2F2ZUVycm9yLAotCQkJCQkJCQludWxsKSk7Ci0JCQl9Ci0JCQlpbmZvLnN0b3BSZXNvdXJjZUxpc3RlbmluZygpOwotCQkJZmlyZUVsZW1lbnRTdGF0ZUNoYW5naW5nKGVsZW1lbnQpOwotCQkJTGlzdCByZXNvdXJjZXMgPSBpbmZvLmdldFJlc291cmNlU2V0KCkuZ2V0UmVzb3VyY2VzKCk7Ci0JCQl0cnkgewotCQkJCW1vbml0b3IuYmVnaW5UYXNrKAotCQkJCQkJTWVzc2FnZXMuRGlhZ3JhbURvY3VtZW50UHJvdmlkZXJfU2F2ZURpYWdyYW1UYXNrLAotCQkJCQkJcmVzb3VyY2VzLnNpemUoKSArIDEpOyAvLyJTYXZpbmcgZGlhZ3JhbSIKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ID0gcmVzb3VyY2VzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQkJUmVzb3VyY2UgbmV4dFJlc291cmNlID0gKFJlc291cmNlKSBpdC5uZXh0KCk7Ci0JCQkJCW1vbml0b3IKLQkJCQkJCQkuc2V0VGFza05hbWUoTkxTCi0JCQkJCQkJCQkuYmluZCgKLQkJCQkJCQkJCQkJTWVzc2FnZXMuRGlhZ3JhbURvY3VtZW50UHJvdmlkZXJfU2F2ZU5leHRSZXNvdXJjZVRhc2ssCi0JCQkJCQkJCQkJCW5leHRSZXNvdXJjZS5nZXRVUkkoKSkpOwotCQkJCQlpZiAobmV4dFJlc291cmNlLmlzTG9hZGVkKCkpIHsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJbmV4dFJlc291cmNlLnNhdmUoRGlhZ3JhbURpYWdyYW1FZGl0b3JVdGlsCi0JCQkJCQkJCQkuZ2V0U2F2ZU9wdGlvbnMoKSk7Ci0JCQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJZmlyZUVsZW1lbnRTdGF0ZUNoYW5nZUZhaWxlZChlbGVtZW50KTsKLQkJCQkJCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsCi0JCQkJCQkJCQlXUEREaWFncmFtRWRpdG9yUGx1Z2luLklELAotCQkJCQkJCQkJRWRpdG9yU3RhdHVzQ29kZXMuUkVTT1VSQ0VfRkFJTFVSRSwgZQotCQkJCQkJCQkJCQkuZ2V0TG9jYWxpemVkTWVzc2FnZSgpLCBudWxsKSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJbW9uaXRvci53b3JrZWQoMSk7Ci0JCQkJfQotCQkJCW1vbml0b3IuZG9uZSgpOwotCQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiB4KSB7Ci0JCQkJZmlyZUVsZW1lbnRTdGF0ZUNoYW5nZUZhaWxlZChlbGVtZW50KTsKLQkJCQl0aHJvdyB4OwotCQkJfSBmaW5hbGx5IHsKLQkJCQlpbmZvLnN0YXJ0UmVzb3VyY2VMaXN0ZW5pbmcoKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVFbGVtZW50Q2hhbmdlZChSZXNvdXJjZVNldEluZm8gaW5mbywKLQkJCVJlc291cmNlIGNoYW5nZWRSZXNvdXJjZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCUlGaWxlIGZpbGUgPSBXb3Jrc3BhY2VTeW5jaHJvbml6ZXIuZ2V0RmlsZShjaGFuZ2VkUmVzb3VyY2UpOwotCQlpZiAoZmlsZSAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCWZpbGUucmVmcmVzaExvY2FsKElSZXNvdXJjZS5ERVBUSF9JTkZJTklURSwgbW9uaXRvcik7Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGV4KSB7Ci0JCQkJV1BERGlhZ3JhbUVkaXRvclBsdWdpbgotCQkJCQkJLmdldEluc3RhbmNlKCkKLQkJCQkJCS5sb2dFcnJvcigKLQkJCQkJCQkJTWVzc2FnZXMuRGlhZ3JhbURvY3VtZW50UHJvdmlkZXJfaGFuZGxlRWxlbWVudENvbnRlbnRDaGFuZ2VkLAotCQkJCQkJCQlleCk7Ci0JCQkJLy8gRXJyb3IgbWVzc2FnZSB0byBsb2cgd2FzIGluaXRpYWxseSB0YWtlbiBmcm9tIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVzb3VyY2VzLmVkaXRvci5pZGUuaW50ZXJuYWwubDEwbi5FZGl0b3JNZXNzYWdlcy5GaWxlRG9jdW1lbnRQcm92aWRlcl9oYW5kbGVFbGVtZW50Q29udGVudENoYW5nZWQKLQkJCX0KLQkJfQotCQljaGFuZ2VkUmVzb3VyY2UudW5sb2FkKCk7Ci0KLQkJZmlyZUVsZW1lbnRDb250ZW50QWJvdXRUb0JlUmVwbGFjZWQoaW5mby5nZXRFZGl0b3JJbnB1dCgpKTsKLQkJcmVtb3ZlVW5jaGFuZ2VkRWxlbWVudExpc3RlbmVycyhpbmZvLmdldEVkaXRvcklucHV0KCksIGluZm8pOwotCQlpbmZvLmZTdGF0dXMgPSBudWxsOwotCQl0cnkgewotCQkJc2V0RG9jdW1lbnRDb250ZW50KGluZm8uZkRvY3VtZW50LCBpbmZvLmdldEVkaXRvcklucHV0KCkpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCWluZm8uZlN0YXR1cyA9IGUuZ2V0U3RhdHVzKCk7Ci0JCX0KLQkJaWYgKCFpbmZvLmZDYW5CZVNhdmVkKSB7Ci0JCQlpbmZvLnNldE1vZGlmaWNhdGlvblN0YW1wKGNvbXB1dGVNb2RpZmljYXRpb25TdGFtcChpbmZvKSk7Ci0JCX0KLQkJYWRkVW5jaGFuZ2VkRWxlbWVudExpc3RlbmVycyhpbmZvLmdldEVkaXRvcklucHV0KCksIGluZm8pOwotCQlmaXJlRWxlbWVudENvbnRlbnRSZXBsYWNlZChpbmZvLmdldEVkaXRvcklucHV0KCkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVFbGVtZW50TW92ZWQoSUVkaXRvcklucHV0IGlucHV0LCBVUkkgdXJpKSB7Ci0JCWlmIChpbnB1dCBpbnN0YW5jZW9mIEZpbGVFZGl0b3JJbnB1dCkgewotCQkJSUZpbGUgbmV3RmlsZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0RmlsZSgKLQkJCQkJbmV3IFBhdGgoVVJJLmRlY29kZSh1cmkucGF0aCgpKSkucmVtb3ZlRmlyc3RTZWdtZW50cygxKSk7Ci0JCQlmaXJlRWxlbWVudE1vdmVkKGlucHV0LCBuZXdGaWxlID09IG51bGwgPyBudWxsCi0JCQkJCTogbmV3IEZpbGVFZGl0b3JJbnB1dChuZXdGaWxlKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJLy8gVE9ETzogYXBwZW5kIHN1ZmZpeCB0byB0aGUgVVJJISAodXNlIGRpYWdyYW0gYXMgYSBwYXJhbWV0ZXIpCi0JCWZpcmVFbGVtZW50TW92ZWQoaW5wdXQsIG5ldyBVUklFZGl0b3JJbnB1dCh1cmkpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElFZGl0b3JJbnB1dCBjcmVhdGVJbnB1dFdpdGhFZGl0aW5nRG9tYWluKElFZGl0b3JJbnB1dCBlZGl0b3JJbnB1dCwKLQkJCVRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIGRvbWFpbikgewotCQlyZXR1cm4gZWRpdG9ySW5wdXQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJRGlhZ3JhbURvY3VtZW50IGdldERpYWdyYW1Eb2N1bWVudChPYmplY3QgZWxlbWVudCkgewotCQlJRG9jdW1lbnQgZG9jID0gZ2V0RG9jdW1lbnQoZWxlbWVudCk7Ci0JCWlmIChkb2MgaW5zdGFuY2VvZiBJRGlhZ3JhbURvY3VtZW50KSB7Ci0JCQlyZXR1cm4gKElEaWFncmFtRG9jdW1lbnQpIGRvYzsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElSdW5uYWJsZUNvbnRleHQgZ2V0T3BlcmF0aW9uUnVubmVyKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIGNsYXNzIFJlc291cmNlU2V0SW5mbyBleHRlbmRzIEVsZW1lbnRJbmZvIHsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSBsb25nIG15TW9kaWZpY2F0aW9uU3RhbXAgPSBJUmVzb3VyY2UuTlVMTF9TVEFNUDsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSBXb3Jrc3BhY2VTeW5jaHJvbml6ZXIgbXlTeW5jaHJvbml6ZXI7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgQ29sbGVjdGlvbiBteVVuU3luY2hyb25pemVkUmVzb3VyY2VzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIElEaWFncmFtRG9jdW1lbnQgbXlEb2N1bWVudDsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSBJRWRpdG9ySW5wdXQgbXlFZGl0b3JJbnB1dDsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSBib29sZWFuIG15VXBkYXRlQ2FjaGUgPSB0cnVlOwotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIGJvb2xlYW4gbXlNb2RpZmlhYmxlID0gZmFsc2U7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgYm9vbGVhbiBteVJlYWRPbmx5ID0gdHJ1ZTsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSBSZXNvdXJjZVNldE1vZGlmaWNhdGlvbkxpc3RlbmVyIG15UmVzb3VyY2VTZXRMaXN0ZW5lcjsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIFJlc291cmNlU2V0SW5mbyhJRGlhZ3JhbURvY3VtZW50IGRvY3VtZW50LAotCQkJCUlFZGl0b3JJbnB1dCBlZGl0b3JJbnB1dCkgewotCQkJc3VwZXIoZG9jdW1lbnQpOwotCQkJbXlEb2N1bWVudCA9IGRvY3VtZW50OwotCQkJbXlFZGl0b3JJbnB1dCA9IGVkaXRvcklucHV0OwotCQkJc3RhcnRSZXNvdXJjZUxpc3RlbmluZygpOwotCQkJbXlSZXNvdXJjZVNldExpc3RlbmVyID0gbmV3IFJlc291cmNlU2V0TW9kaWZpY2F0aW9uTGlzdGVuZXIodGhpcyk7Ci0JCQlnZXRSZXNvdXJjZVNldCgpLmVBZGFwdGVycygpLmFkZChteVJlc291cmNlU2V0TGlzdGVuZXIpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBsb25nIGdldE1vZGlmaWNhdGlvblN0YW1wKCkgewotCQkJcmV0dXJuIG15TW9kaWZpY2F0aW9uU3RhbXA7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHZvaWQgc2V0TW9kaWZpY2F0aW9uU3RhbXAobG9uZyBtb2RpZmljYXRpb25TdGFtcCkgewotCQkJbXlNb2RpZmljYXRpb25TdGFtcCA9IG1vZGlmaWNhdGlvblN0YW1wOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBSZXNvdXJjZVNldCBnZXRSZXNvdXJjZVNldCgpIHsKLQkJCXJldHVybiBteURvY3VtZW50LmdldEVkaXRpbmdEb21haW4oKS5nZXRSZXNvdXJjZVNldCgpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBJRWRpdG9ySW5wdXQgZ2V0RWRpdG9ySW5wdXQoKSB7Ci0JCQlyZXR1cm4gbXlFZGl0b3JJbnB1dDsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkJc3RvcFJlc291cmNlTGlzdGVuaW5nKCk7Ci0JCQlnZXRSZXNvdXJjZVNldCgpLmVBZGFwdGVycygpLnJlbW92ZShteVJlc291cmNlU2V0TGlzdGVuZXIpOwotCQkJZm9yIChJdGVyYXRvciBpdCA9IGdldFJlc291cmNlU2V0KCkuZ2V0UmVzb3VyY2VzKCkuaXRlcmF0b3IoKTsgaXQKLQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQlSZXNvdXJjZSByZXNvdXJjZSA9IChSZXNvdXJjZSkgaXQubmV4dCgpOwotCQkJCXJlc291cmNlLnVubG9hZCgpOwotCQkJfQotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBib29sZWFuIGlzU3luY2hyb25pemVkKCkgewotCQkJcmV0dXJuIG15VW5TeW5jaHJvbml6ZWRSZXNvdXJjZXMuc2l6ZSgpID09IDA7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHZvaWQgc2V0VW5TeW5jaHJvbml6ZWQoUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJCW15VW5TeW5jaHJvbml6ZWRSZXNvdXJjZXMuYWRkKHJlc291cmNlKTsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBzZXRTeW5jaHJvbml6ZWQoUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJCW15VW5TeW5jaHJvbml6ZWRSZXNvdXJjZXMucmVtb3ZlKHJlc291cmNlKTsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgZmluYWwgdm9pZCBzdG9wUmVzb3VyY2VMaXN0ZW5pbmcoKSB7Ci0JCQlteVN5bmNocm9uaXplci5kaXNwb3NlKCk7Ci0JCQlteVN5bmNocm9uaXplciA9IG51bGw7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIGZpbmFsIHZvaWQgc3RhcnRSZXNvdXJjZUxpc3RlbmluZygpIHsKLQkJCW15U3luY2hyb25pemVyID0gbmV3IFdvcmtzcGFjZVN5bmNocm9uaXplcihteURvY3VtZW50Ci0JCQkJCS5nZXRFZGl0aW5nRG9tYWluKCksIG5ldyBTeW5jaHJvbml6ZXJEZWxlZ2F0ZSgpKTsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgYm9vbGVhbiBpc1VwZGF0ZUNhY2hlKCkgewotCQkJcmV0dXJuIG15VXBkYXRlQ2FjaGU7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHZvaWQgc2V0VXBkYXRlQ2FjaGUoYm9vbGVhbiB1cGRhdGUpIHsKLQkJCW15VXBkYXRlQ2FjaGUgPSB1cGRhdGU7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIGJvb2xlYW4gaXNNb2RpZmlhYmxlKCkgewotCQkJcmV0dXJuIG15TW9kaWZpYWJsZTsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBzZXRNb2RpZmlhYmxlKGJvb2xlYW4gbW9kaWZpYWJsZSkgewotCQkJbXlNb2RpZmlhYmxlID0gbW9kaWZpYWJsZTsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgYm9vbGVhbiBpc1JlYWRPbmx5KCkgewotCQkJcmV0dXJuIG15UmVhZE9ubHk7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHZvaWQgc2V0UmVhZE9ubHkoYm9vbGVhbiByZWFkT25seSkgewotCQkJbXlSZWFkT25seSA9IHJlYWRPbmx5OwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgY2xhc3MgU3luY2hyb25pemVyRGVsZWdhdGUgaW1wbGVtZW50cwotCQkJCVdvcmtzcGFjZVN5bmNocm9uaXplci5EZWxlZ2F0ZSB7Ci0KLQkJCS8qKgotCQkJICogQGdlbmVyYXRlZAotCQkJICovCi0JCQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkJfQotCi0JCQkvKioKLQkJCSAqIEBnZW5lcmF0ZWQKLQkJCSAqLwotCQkJcHVibGljIGJvb2xlYW4gaGFuZGxlUmVzb3VyY2VDaGFuZ2VkKGZpbmFsIFJlc291cmNlIHJlc291cmNlKSB7Ci0JCQkJc3luY2hyb25pemVkIChSZXNvdXJjZVNldEluZm8udGhpcykgewotCQkJCQlpZiAoUmVzb3VyY2VTZXRJbmZvLnRoaXMuZkNhbkJlU2F2ZWQpIHsKLQkJCQkJCVJlc291cmNlU2V0SW5mby50aGlzLnNldFVuU3luY2hyb25pemVkKHJlc291cmNlKTsKLQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQl9Ci0JCQkJfQotCQkJCURpc3BsYXkuZ2V0RGVmYXVsdCgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCWhhbmRsZUVsZW1lbnRDaGFuZ2VkKFJlc291cmNlU2V0SW5mby50aGlzLCByZXNvdXJjZSwKLQkJCQkJCQkJbnVsbCk7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQotCQkJLyoqCi0JCQkgKiBAZ2VuZXJhdGVkCi0JCQkgKi8KLQkJCXB1YmxpYyBib29sZWFuIGhhbmRsZVJlc291cmNlRGVsZXRlZChSZXNvdXJjZSByZXNvdXJjZSkgewotCQkJCXN5bmNocm9uaXplZCAoUmVzb3VyY2VTZXRJbmZvLnRoaXMpIHsKLQkJCQkJaWYgKFJlc291cmNlU2V0SW5mby50aGlzLmZDYW5CZVNhdmVkKSB7Ci0JCQkJCQlSZXNvdXJjZVNldEluZm8udGhpcy5zZXRVblN5bmNocm9uaXplZChyZXNvdXJjZSk7Ci0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJfQotCQkJCX0KLQkJCQlEaXNwbGF5LmdldERlZmF1bHQoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQlmaXJlRWxlbWVudERlbGV0ZWQoUmVzb3VyY2VTZXRJbmZvLnRoaXMKLQkJCQkJCQkJLmdldEVkaXRvcklucHV0KCkpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0KLQkJCS8qKgotCQkJICogQGdlbmVyYXRlZAotCQkJICovCi0JCQlwdWJsaWMgYm9vbGVhbiBoYW5kbGVSZXNvdXJjZU1vdmVkKFJlc291cmNlIHJlc291cmNlLAotCQkJCQlmaW5hbCBVUkkgbmV3VVJJKSB7Ci0JCQkJc3luY2hyb25pemVkIChSZXNvdXJjZVNldEluZm8udGhpcykgewotCQkJCQlpZiAoUmVzb3VyY2VTZXRJbmZvLnRoaXMuZkNhbkJlU2F2ZWQpIHsKLQkJCQkJCVJlc291cmNlU2V0SW5mby50aGlzLnNldFVuU3luY2hyb25pemVkKHJlc291cmNlKTsKLQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQl9Ci0JCQkJfQotCQkJCWlmIChteURvY3VtZW50LmdldERpYWdyYW0oKS5lUmVzb3VyY2UoKSA9PSByZXNvdXJjZSkgewotCQkJCQlEaXNwbGF5LmdldERlZmF1bHQoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCWhhbmRsZUVsZW1lbnRNb3ZlZChSZXNvdXJjZVNldEluZm8udGhpcwotCQkJCQkJCQkJLmdldEVkaXRvcklucHV0KCksIG5ld1VSSSk7Ci0JCQkJCQl9Ci0JCQkJCX0pOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWhhbmRsZVJlc291cmNlRGVsZXRlZChyZXNvdXJjZSk7Ci0JCQkJfQotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCi0JCX0KLQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIGNsYXNzIFJlc291cmNlU2V0TW9kaWZpY2F0aW9uTGlzdGVuZXIgZXh0ZW5kcyBFQ29udGVudEFkYXB0ZXIgewotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIE5vdGlmaWNhdGlvbkZpbHRlciBteU1vZGlmaWVkRmlsdGVyOwotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIFJlc291cmNlU2V0SW5mbyBteUluZm87Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBSZXNvdXJjZVNldE1vZGlmaWNhdGlvbkxpc3RlbmVyKFJlc291cmNlU2V0SW5mbyBpbmZvKSB7Ci0JCQlteUluZm8gPSBpbmZvOwotCQkJbXlNb2RpZmllZEZpbHRlciA9IE5vdGlmaWNhdGlvbkZpbHRlci5jcmVhdGVFdmVudFR5cGVGaWx0ZXIoCi0JCQkJCU5vdGlmaWNhdGlvbi5TRVQpLm9yKAotCQkJCQlOb3RpZmljYXRpb25GaWx0ZXIKLQkJCQkJCQkuY3JlYXRlRXZlbnRUeXBlRmlsdGVyKE5vdGlmaWNhdGlvbi5VTlNFVCkpLmFuZCgKLQkJCQkJTm90aWZpY2F0aW9uRmlsdGVyLmNyZWF0ZUZlYXR1cmVGaWx0ZXIoUmVzb3VyY2UuY2xhc3MsCi0JCQkJCQkJUmVzb3VyY2UuUkVTT1VSQ0VfX0lTX01PRElGSUVEKSk7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCQlpZiAobm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCkgaW5zdGFuY2VvZiBSZXNvdXJjZVNldCkgewotCQkJCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQkJCX0KLQkJCWlmICghbm90aWZpY2F0aW9uLmlzVG91Y2goKQotCQkJCQkmJiBteU1vZGlmaWVkRmlsdGVyLm1hdGNoZXMobm90aWZpY2F0aW9uKSkgewotCQkJCWlmIChub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKSBpbnN0YW5jZW9mIFJlc291cmNlKSB7Ci0JCQkJCVJlc291cmNlIHJlc291cmNlID0gKFJlc291cmNlKSBub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKTsKLQkJCQkJaWYgKHJlc291cmNlLmlzTG9hZGVkKCkpIHsKLQkJCQkJCWJvb2xlYW4gbW9kaWZpZWQgPSBmYWxzZTsKLQkJCQkJCWZvciAoSXRlcmF0b3IgaXQgPSBteUluZm8uZ2V0UmVzb3VyY2VTZXQoKQotCQkJCQkJCQkuZ2V0UmVzb3VyY2VzKCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpCi0JCQkJCQkJCSYmICFtb2RpZmllZDspIHsKLQkJCQkJCQlSZXNvdXJjZSBuZXh0UmVzb3VyY2UgPSAoUmVzb3VyY2UpIGl0Lm5leHQoKTsKLQkJCQkJCQlpZiAobmV4dFJlc291cmNlLmlzTG9hZGVkKCkpIHsKLQkJCQkJCQkJbW9kaWZpZWQgPSBuZXh0UmVzb3VyY2UuaXNNb2RpZmllZCgpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCWJvb2xlYW4gZGlydHlTdGF0ZUNoYW5nZWQgPSBmYWxzZTsKLQkJCQkJCXN5bmNocm9uaXplZCAobXlJbmZvKSB7Ci0JCQkJCQkJaWYgKG1vZGlmaWVkICE9IG15SW5mby5mQ2FuQmVTYXZlZCkgewotCQkJCQkJCQlteUluZm8uZkNhbkJlU2F2ZWQgPSBtb2RpZmllZDsKLQkJCQkJCQkJZGlydHlTdGF0ZUNoYW5nZWQgPSB0cnVlOwotCQkJCQkJCX0KLQkJCQkJCQlpZiAoIXJlc291cmNlLmlzTW9kaWZpZWQoKSkgewotCQkJCQkJCQlteUluZm8uc2V0U3luY2hyb25pemVkKHJlc291cmNlKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQlpZiAoZGlydHlTdGF0ZUNoYW5nZWQpIHsKLQkJCQkJCQlmaXJlRWxlbWVudERpcnR5U3RhdGVDaGFuZ2VkKG15SW5mbwotCQkJCQkJCQkJLmdldEVkaXRvcklucHV0KCksIG1vZGlmaWVkKTsKLQotCQkJCQkJCWlmICghbW9kaWZpZWQpIHsKLQkJCQkJCQkJbXlJbmZvCi0JCQkJCQkJCQkJLnNldE1vZGlmaWNhdGlvblN0YW1wKGNvbXB1dGVNb2RpZmljYXRpb25TdGFtcChteUluZm8pKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9wYXJ0L0RpYWdyYW1Jbml0RGlhZ3JhbUZpbGVBY3Rpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvcGFydC9EaWFncmFtSW5pdERpYWdyYW1GaWxlQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3YjQ5OWQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9wYXJ0L0RpYWdyYW1Jbml0RGlhZ3JhbUZpbGVBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyOCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLnBhcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLldyYXBwZWRFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuaW1wbC5SZXNvdXJjZVNldEltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLmVkaXQucGFydHMuV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbUVkaXRQYXJ0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvcmUuR01GRWRpdGluZ0RvbWFpbkZhY3Rvcnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ1NldHRpbmdzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZERpYWxvZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSU9iamVjdEFjdGlvbkRlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERpYWdyYW1Jbml0RGlhZ3JhbUZpbGVBY3Rpb24gaW1wbGVtZW50cyBJT2JqZWN0QWN0aW9uRGVsZWdhdGUgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgSVdvcmtiZW5jaFBhcnQgdGFyZ2V0UGFydDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIFVSSSBkb21haW5Nb2RlbFVSSTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBY3RpdmVQYXJ0KElBY3Rpb24gYWN0aW9uLCBJV29ya2JlbmNoUGFydCB0YXJnZXRQYXJ0KSB7Ci0JCXRoaXMudGFyZ2V0UGFydCA9IHRhcmdldFBhcnQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoSUFjdGlvbiBhY3Rpb24sIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCWRvbWFpbk1vZGVsVVJJID0gbnVsbDsKLQkJYWN0aW9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQlpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24gPT0gZmFsc2UKLQkJCQl8fCBzZWxlY3Rpb24uaXNFbXB0eSgpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJSUZpbGUgZmlsZSA9IChJRmlsZSkgKChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uKQotCQkJCS5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJZG9tYWluTW9kZWxVUkkgPSBVUkkuY3JlYXRlUGxhdGZvcm1SZXNvdXJjZVVSSShmaWxlLmdldEZ1bGxQYXRoKCkKLQkJCQkudG9TdHJpbmcoKSwgdHJ1ZSk7Ci0JCWFjdGlvbi5zZXRFbmFibGVkKHRydWUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIFNoZWxsIGdldFNoZWxsKCkgewotCQlyZXR1cm4gdGFyZ2V0UGFydC5nZXRTaXRlKCkuZ2V0U2hlbGwoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgcnVuKElBY3Rpb24gYWN0aW9uKSB7Ci0JCVRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIGVkaXRpbmdEb21haW4gPSBHTUZFZGl0aW5nRG9tYWluRmFjdG9yeS5JTlNUQU5DRQotCQkJCS5jcmVhdGVFZGl0aW5nRG9tYWluKCk7Ci0JCVJlc291cmNlU2V0IHJlc291cmNlU2V0ID0gbmV3IFJlc291cmNlU2V0SW1wbCgpOwotCQlFT2JqZWN0IGRpYWdyYW1Sb290ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCVJlc291cmNlIHJlc291cmNlID0gcmVzb3VyY2VTZXQuZ2V0UmVzb3VyY2UoZG9tYWluTW9kZWxVUkksIHRydWUpOwotCQkJZGlhZ3JhbVJvb3QgPSAoRU9iamVjdCkgcmVzb3VyY2UuZ2V0Q29udGVudHMoKS5nZXQoMCk7Ci0JCX0gY2F0Y2ggKFdyYXBwZWRFeGNlcHRpb24gZXgpIHsKLQkJCVdQRERpYWdyYW1FZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5sb2dFcnJvcigKLQkJCQkJIlVuYWJsZSB0byBsb2FkIHJlc291cmNlOiAiICsgZG9tYWluTW9kZWxVUkksIGV4KTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWlmIChkaWFncmFtUm9vdCA9PSBudWxsKSB7Ci0JCQlNZXNzYWdlRGlhbG9nCi0JCQkJCS5vcGVuRXJyb3IoCi0JCQkJCQkJZ2V0U2hlbGwoKSwKLQkJCQkJCQlNZXNzYWdlcy5EaWFncmFtSW5pdERpYWdyYW1GaWxlQWN0aW9uX0luaXREaWFncmFtRmlsZVJlc291cmNlRXJyb3JEaWFsb2dUaXRsZSwKLQkJCQkJCQlNZXNzYWdlcy5EaWFncmFtSW5pdERpYWdyYW1GaWxlQWN0aW9uX0luaXREaWFncmFtRmlsZVJlc291cmNlRXJyb3JEaWFsb2dNZXNzYWdlKTsKLQkJCXJldHVybjsKLQkJfQotCQlXaXphcmQgd2l6YXJkID0gbmV3IERpYWdyYW1OZXdEaWFncmFtRmlsZVdpemFyZChkb21haW5Nb2RlbFVSSSwKLQkJCQlkaWFncmFtUm9vdCwgZWRpdGluZ0RvbWFpbik7Ci0JCXdpemFyZAotCQkJCS5zZXRXaW5kb3dUaXRsZShOTFMKLQkJCQkJCS5iaW5kKAotCQkJCQkJCQlNZXNzYWdlcy5EaWFncmFtSW5pdERpYWdyYW1GaWxlQWN0aW9uX0luaXREaWFncmFtRmlsZVdpemFyZFRpdGxlLAotCQkJCQkJCQlXb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtRWRpdFBhcnQuTU9ERUxfSUQpKTsKLQkJRGlhZ3JhbURpYWdyYW1FZGl0b3JVdGlsLnJ1bldpemFyZChnZXRTaGVsbCgpLCB3aXphcmQsCi0JCQkJIkluaXREaWFncmFtRmlsZSIpOyAvLyROT04tTkxTLTEkCi0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9wYXJ0L0RpYWdyYW1Mb2FkUmVzb3VyY2VBY3Rpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvcGFydC9EaWFncmFtTG9hZFJlc291cmNlQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5OGNmZmMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9wYXJ0L0RpYWdyYW1Mb2FkUmVzb3VyY2VBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQucGFydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5Mb2FkUmVzb3VyY2VBY3Rpb24uTG9hZFJlc291cmNlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklPYmplY3RBY3Rpb25EZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLmVkaXQucGFydHMuV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbUVkaXRQYXJ0OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERpYWdyYW1Mb2FkUmVzb3VyY2VBY3Rpb24gaW1wbGVtZW50cyBJT2JqZWN0QWN0aW9uRGVsZWdhdGUgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbUVkaXRQYXJ0IG15U2VsZWN0ZWRFbGVtZW50OwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgU2hlbGwgbXlTaGVsbDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBY3RpdmVQYXJ0KElBY3Rpb24gYWN0aW9uLCBJV29ya2JlbmNoUGFydCB0YXJnZXRQYXJ0KSB7Ci0JCW15U2hlbGwgPSB0YXJnZXRQYXJ0LmdldFNpdGUoKS5nZXRTaGVsbCgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBydW4oSUFjdGlvbiBhY3Rpb24pIHsKLQkJTG9hZFJlc291cmNlRGlhbG9nIGxvYWRSZXNvdXJjZURpYWxvZyA9IG5ldyBMb2FkUmVzb3VyY2VEaWFsb2cobXlTaGVsbCwKLQkJCQlteVNlbGVjdGVkRWxlbWVudC5nZXRFZGl0aW5nRG9tYWluKCkpOwotCQlsb2FkUmVzb3VyY2VEaWFsb2cub3BlbigpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElBY3Rpb24gYWN0aW9uLCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlteVNlbGVjdGVkRWxlbWVudCA9IG51bGw7Ci0JCWlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgewotCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc3RydWN0dXJlZFNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uOwotCQkJaWYgKHN0cnVjdHVyZWRTZWxlY3Rpb24uc2l6ZSgpID09IDEKLQkJCQkJJiYgc3RydWN0dXJlZFNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKSBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW1FZGl0UGFydCkgewotCQkJCW15U2VsZWN0ZWRFbGVtZW50ID0gKFdvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW1FZGl0UGFydCkgc3RydWN0dXJlZFNlbGVjdGlvbgotCQkJCQkJLmdldEZpcnN0RWxlbWVudCgpOwotCQkJfQotCQl9Ci0JCWFjdGlvbi5zZXRFbmFibGVkKGlzRW5hYmxlZCgpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzRW5hYmxlZCgpIHsKLQkJcmV0dXJuIG15U2VsZWN0ZWRFbGVtZW50ICE9IG51bGw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL3BhcnQvRGlhZ3JhbU1hdGNoaW5nU3RyYXRlZ3kuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvcGFydC9EaWFncmFtTWF0Y2hpbmdTdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZmYwN2FhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvcGFydC9EaWFncmFtTWF0Y2hpbmdTdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5wYXJ0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51aS5VUklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlc291cmNlcy5lZGl0b3IucGFydHMuRGlhZ3JhbURvY3VtZW50RWRpdG9yTWF0Y2hpbmdTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvck1hdGNoaW5nU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEaWFncmFtTWF0Y2hpbmdTdHJhdGVneSBpbXBsZW1lbnRzIElFZGl0b3JNYXRjaGluZ1N0cmF0ZWd5IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBtYXRjaGVzKElFZGl0b3JSZWZlcmVuY2UgZWRpdG9yUmVmLCBJRWRpdG9ySW5wdXQgaW5wdXQpIHsKLQkJSUVkaXRvcklucHV0IGVkaXRvcklucHV0OwotCQl0cnkgewotCQkJZWRpdG9ySW5wdXQgPSBlZGl0b3JSZWYuZ2V0RWRpdG9ySW5wdXQoKTsKLQkJfSBjYXRjaCAoUGFydEluaXRFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJaWYgKGVkaXRvcklucHV0LmVxdWFscyhpbnB1dCkpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWlmIChlZGl0b3JJbnB1dCBpbnN0YW5jZW9mIFVSSUVkaXRvcklucHV0Ci0JCQkJJiYgaW5wdXQgaW5zdGFuY2VvZiBVUklFZGl0b3JJbnB1dCkgewotCQkJcmV0dXJuICgoVVJJRWRpdG9ySW5wdXQpIGVkaXRvcklucHV0KS5nZXRVUkkoKS5lcXVhbHMoCi0JCQkJCSgoVVJJRWRpdG9ySW5wdXQpIGlucHV0KS5nZXRVUkkoKSk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvcGFydC9EaWFncmFtTmV3RGlhZ3JhbUZpbGVXaXphcmQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvcGFydC9EaWFncmFtTmV3RGlhZ3JhbUZpbGVXaXphcmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2NlYTUyYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL3BhcnQvRGlhZ3JhbU5ld0RpYWdyYW1GaWxlV2l6YXJkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5wYXJ0OwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5vcGVyYXRpb25zLk9wZXJhdGlvbkhpc3RvcnlGYWN0b3J5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVdyYXBwZXJJdGVtUHJvdmlkZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLmVkaXQucGFydHMuV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbUVkaXRQYXJ0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUuY29tbWFuZC5Db21tYW5kUmVzdWx0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLnNlcnZpY2VzLlZpZXdTZXJ2aWNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLnNlcnZpY2VzLnZpZXcuQ3JlYXRlRGlhZ3JhbVZpZXdPcGVyYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29tbWFuZHMuY29yZS5jb21tYW5kLkFic3RyYWN0VHJhbnNhY3Rpb25hbENvbW1hbmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29yZS51dGlsLkVPYmplY3RBZGFwdGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRGlhZ3JhbTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVWaWV3ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuV2l6YXJkTmV3RmlsZUNyZWF0aW9uUGFnZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmlkZS5JREU7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRGlhZ3JhbU5ld0RpYWdyYW1GaWxlV2l6YXJkIGV4dGVuZHMgV2l6YXJkIHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIFRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIG15RWRpdGluZ0RvbWFpbjsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRGlhZ3JhbU5ld0RpYWdyYW1GaWxlV2l6YXJkKFVSSSBkb21haW5Nb2RlbFVSSSwgRU9iamVjdCBkaWFncmFtUm9vdCwKLQkJCVRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIGVkaXRpbmdEb21haW4pIHsKLQkJYXNzZXJ0IGRvbWFpbk1vZGVsVVJJICE9IG51bGwgOiAiRG9tYWluIG1vZGVsIHVyaSBtdXN0IGJlIHNwZWNpZmllZCI7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0IGRpYWdyYW1Sb290ICE9IG51bGwgOiAiRG9hZ3JhbSByb290IGVsZW1lbnQgbXVzdCBiZSBzcGVjaWZpZWQiOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydCBlZGl0aW5nRG9tYWluICE9IG51bGwgOiAiRWRpdGluZyBkb21haW4gbXVzdCBiZSBzcGVjaWZpZWQiOyAvLyROT04tTkxTLTEkCi0KLQkJbXlGaWxlQ3JlYXRpb25QYWdlID0gbmV3IFdpemFyZE5ld0ZpbGVDcmVhdGlvblBhZ2UoCi0JCQkJTWVzc2FnZXMuRGlhZ3JhbU5ld0RpYWdyYW1GaWxlV2l6YXJkX0NyZWF0aW9uUGFnZU5hbWUsCi0JCQkJU3RydWN0dXJlZFNlbGVjdGlvbi5FTVBUWSk7Ci0JCW15RmlsZUNyZWF0aW9uUGFnZQotCQkJCS5zZXRUaXRsZShNZXNzYWdlcy5EaWFncmFtTmV3RGlhZ3JhbUZpbGVXaXphcmRfQ3JlYXRpb25QYWdlVGl0bGUpOwotCQlteUZpbGVDcmVhdGlvblBhZ2Uuc2V0RGVzY3JpcHRpb24oTkxTLmJpbmQoCi0JCQkJTWVzc2FnZXMuRGlhZ3JhbU5ld0RpYWdyYW1GaWxlV2l6YXJkX0NyZWF0aW9uUGFnZURlc2NyaXB0aW9uLAotCQkJCVdvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW1FZGl0UGFydC5NT0RFTF9JRCkpOwotCQlJUGF0aCBmaWxlUGF0aDsKLQkJU3RyaW5nIGZpbGVOYW1lID0gZG9tYWluTW9kZWxVUkkudHJpbUZpbGVFeHRlbnNpb24oKS5sYXN0U2VnbWVudCgpOwotCQlpZiAoZG9tYWluTW9kZWxVUkkuaXNQbGF0Zm9ybVJlc291cmNlKCkpIHsKLQkJCWZpbGVQYXRoID0gbmV3IFBhdGgoZG9tYWluTW9kZWxVUkkudHJpbVNlZ21lbnRzKDEpCi0JCQkJCS50b1BsYXRmb3JtU3RyaW5nKHRydWUpKTsKLQkJfSBlbHNlIGlmIChkb21haW5Nb2RlbFVSSS5pc0ZpbGUoKSkgewotCQkJZmlsZVBhdGggPSBuZXcgUGF0aChkb21haW5Nb2RlbFVSSS50cmltU2VnbWVudHMoMSkudG9GaWxlU3RyaW5nKCkpOwotCQl9IGVsc2UgewotCQkJLy8gVE9ETyA6IHVzZSBzb21lIGRlZmF1bHQgcGF0aAotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKLQkJCQkJIlVuc3VwcG9ydGVkIFVSSTogIiArIGRvbWFpbk1vZGVsVVJJKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCW15RmlsZUNyZWF0aW9uUGFnZS5zZXRDb250YWluZXJGdWxsUGF0aChmaWxlUGF0aCk7Ci0JCW15RmlsZUNyZWF0aW9uUGFnZS5zZXRGaWxlTmFtZShEaWFncmFtRGlhZ3JhbUVkaXRvclV0aWwKLQkJCQkuZ2V0VW5pcXVlRmlsZU5hbWUoZmlsZVBhdGgsIGZpbGVOYW1lLCAid3BkZCIpKTsgLy8kTk9OLU5MUy0xJAotCi0JCWRpYWdyYW1Sb290RWxlbWVudFNlbGVjdGlvblBhZ2UgPSBuZXcgRGlhZ3JhbVJvb3RFbGVtZW50U2VsZWN0aW9uUGFnZSgKLQkJCQlNZXNzYWdlcy5EaWFncmFtTmV3RGlhZ3JhbUZpbGVXaXphcmRfUm9vdFNlbGVjdGlvblBhZ2VOYW1lKTsKLQkJZGlhZ3JhbVJvb3RFbGVtZW50U2VsZWN0aW9uUGFnZQotCQkJCS5zZXRUaXRsZShNZXNzYWdlcy5EaWFncmFtTmV3RGlhZ3JhbUZpbGVXaXphcmRfUm9vdFNlbGVjdGlvblBhZ2VUaXRsZSk7Ci0JCWRpYWdyYW1Sb290RWxlbWVudFNlbGVjdGlvblBhZ2UKLQkJCQkuc2V0RGVzY3JpcHRpb24oTWVzc2FnZXMuRGlhZ3JhbU5ld0RpYWdyYW1GaWxlV2l6YXJkX1Jvb3RTZWxlY3Rpb25QYWdlRGVzY3JpcHRpb24pOwotCQlkaWFncmFtUm9vdEVsZW1lbnRTZWxlY3Rpb25QYWdlLnNldE1vZGVsRWxlbWVudChkaWFncmFtUm9vdCk7Ci0KLQkJbXlFZGl0aW5nRG9tYWluID0gZWRpdGluZ0RvbWFpbjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBXaXphcmROZXdGaWxlQ3JlYXRpb25QYWdlIG15RmlsZUNyZWF0aW9uUGFnZTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIE1vZGVsRWxlbWVudFNlbGVjdGlvblBhZ2UgZGlhZ3JhbVJvb3RFbGVtZW50U2VsZWN0aW9uUGFnZTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRQYWdlcygpIHsKLQkJYWRkUGFnZShteUZpbGVDcmVhdGlvblBhZ2UpOwotCQlhZGRQYWdlKGRpYWdyYW1Sb290RWxlbWVudFNlbGVjdGlvblBhZ2UpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtRmluaXNoKCkgewotCQlMaXN0IGFmZmVjdGVkRmlsZXMgPSBuZXcgTGlua2VkTGlzdCgpOwotCQlJRmlsZSBkaWFncmFtRmlsZSA9IG15RmlsZUNyZWF0aW9uUGFnZS5jcmVhdGVOZXdGaWxlKCk7Ci0JCURpYWdyYW1EaWFncmFtRWRpdG9yVXRpbC5zZXRDaGFyc2V0KGRpYWdyYW1GaWxlKTsKLQkJYWZmZWN0ZWRGaWxlcy5hZGQoZGlhZ3JhbUZpbGUpOwotCQlVUkkgZGlhZ3JhbU1vZGVsVVJJID0gVVJJLmNyZWF0ZVBsYXRmb3JtUmVzb3VyY2VVUkkoZGlhZ3JhbUZpbGUKLQkJCQkuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpLCB0cnVlKTsKLQkJUmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQgPSBteUVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VTZXQoKTsKLQkJZmluYWwgUmVzb3VyY2UgZGlhZ3JhbVJlc291cmNlID0gcmVzb3VyY2VTZXQKLQkJCQkuY3JlYXRlUmVzb3VyY2UoZGlhZ3JhbU1vZGVsVVJJKTsKLQkJQWJzdHJhY3RUcmFuc2FjdGlvbmFsQ29tbWFuZCBjb21tYW5kID0gbmV3IEFic3RyYWN0VHJhbnNhY3Rpb25hbENvbW1hbmQoCi0JCQkJbXlFZGl0aW5nRG9tYWluLAotCQkJCU1lc3NhZ2VzLkRpYWdyYW1OZXdEaWFncmFtRmlsZVdpemFyZF9Jbml0RGlhZ3JhbUNvbW1hbmQsCi0JCQkJYWZmZWN0ZWRGaWxlcykgewotCi0JCQlwcm90ZWN0ZWQgQ29tbWFuZFJlc3VsdCBkb0V4ZWN1dGVXaXRoUmVzdWx0KAotCQkJCQlJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykKLQkJCQkJdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCQkJaW50IGRpYWdyYW1WSUQgPSBEaWFncmFtVmlzdWFsSURSZWdpc3RyeQotCQkJCQkJLmdldERpYWdyYW1WaXN1YWxJRChkaWFncmFtUm9vdEVsZW1lbnRTZWxlY3Rpb25QYWdlCi0JCQkJCQkJCS5nZXRNb2RlbEVsZW1lbnQoKSk7Ci0JCQkJaWYgKGRpYWdyYW1WSUQgIT0gV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbUVkaXRQYXJ0LlZJU1VBTF9JRCkgewotCQkJCQlyZXR1cm4gQ29tbWFuZFJlc3VsdAotCQkJCQkJCS5uZXdFcnJvckNvbW1hbmRSZXN1bHQoTWVzc2FnZXMuRGlhZ3JhbU5ld0RpYWdyYW1GaWxlV2l6YXJkX0luY29ycmVjdFJvb3RFcnJvcik7Ci0JCQkJfQotCQkJCURpYWdyYW0gZGlhZ3JhbSA9IFZpZXdTZXJ2aWNlLmNyZWF0ZURpYWdyYW0oCi0JCQkJCQlkaWFncmFtUm9vdEVsZW1lbnRTZWxlY3Rpb25QYWdlLmdldE1vZGVsRWxlbWVudCgpLAotCQkJCQkJV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbUVkaXRQYXJ0Lk1PREVMX0lELAotCQkJCQkJV1BERGlhZ3JhbUVkaXRvclBsdWdpbi5ESUFHUkFNX1BSRUZFUkVOQ0VTX0hJTlQpOwotCQkJCWRpYWdyYW1SZXNvdXJjZS5nZXRDb250ZW50cygpLmFkZChkaWFncmFtKTsKLQkJCQlkaWFncmFtUmVzb3VyY2UuZ2V0Q29udGVudHMoKS5hZGQoZGlhZ3JhbS5nZXRFbGVtZW50KCkpOwotCQkJCXJldHVybiBDb21tYW5kUmVzdWx0Lm5ld09LQ29tbWFuZFJlc3VsdCgpOwotCQkJfQotCQl9OwotCQl0cnkgewotCQkJT3BlcmF0aW9uSGlzdG9yeUZhY3RvcnkuZ2V0T3BlcmF0aW9uSGlzdG9yeSgpLmV4ZWN1dGUoY29tbWFuZCwKLQkJCQkJbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSwgbnVsbCk7Ci0JCQlkaWFncmFtUmVzb3VyY2Uuc2F2ZShEaWFncmFtRGlhZ3JhbUVkaXRvclV0aWwuZ2V0U2F2ZU9wdGlvbnMoKSk7Ci0JCQlEaWFncmFtRGlhZ3JhbUVkaXRvclV0aWwub3BlbkRpYWdyYW0oZGlhZ3JhbVJlc291cmNlKTsKLQkJfSBjYXRjaCAoRXhlY3V0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCVdQRERpYWdyYW1FZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5sb2dFcnJvcigKLQkJCQkJIlVuYWJsZSB0byBjcmVhdGUgbW9kZWwgYW5kIGRpYWdyYW0iLCBlKTsgLy8kTk9OLU5MUy0xJAotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgewotCQkJV1BERGlhZ3JhbUVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmxvZ0Vycm9yKAotCQkJCQkiU2F2ZSBvcGVyYXRpb24gZmFpbGVkIGZvcjogIiArIGRpYWdyYW1Nb2RlbFVSSSwgZXgpOyAvLyROT04tTkxTLTEkCi0JCX0gY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIGV4KSB7Ci0JCQlXUEREaWFncmFtRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkubG9nRXJyb3IoCi0JCQkJCSJVbmFibGUgdG8gb3BlbiBlZGl0b3IiLCBleCk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgRGlhZ3JhbVJvb3RFbGVtZW50U2VsZWN0aW9uUGFnZSBleHRlbmRzCi0JCQlNb2RlbEVsZW1lbnRTZWxlY3Rpb25QYWdlIHsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJvdGVjdGVkIERpYWdyYW1Sb290RWxlbWVudFNlbGVjdGlvblBhZ2UoU3RyaW5nIHBhZ2VOYW1lKSB7Ci0JCQlzdXBlcihwYWdlTmFtZSk7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJvdGVjdGVkIFN0cmluZyBnZXRTZWxlY3Rpb25UaXRsZSgpIHsKLQkJCXJldHVybiBNZXNzYWdlcy5EaWFncmFtTmV3RGlhZ3JhbUZpbGVXaXphcmRfUm9vdFNlbGVjdGlvblBhZ2VTZWxlY3Rpb25UaXRsZTsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcm90ZWN0ZWQgYm9vbGVhbiB2YWxpZGF0ZVBhZ2UoKSB7Ci0JCQlpZiAoc2VsZWN0ZWRNb2RlbEVsZW1lbnQgPT0gbnVsbCkgewotCQkJCXNldEVycm9yTWVzc2FnZShNZXNzYWdlcy5EaWFncmFtTmV3RGlhZ3JhbUZpbGVXaXphcmRfUm9vdFNlbGVjdGlvblBhZ2VOb1NlbGVjdGlvbk1lc3NhZ2UpOwotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCWJvb2xlYW4gcmVzdWx0ID0gVmlld1NlcnZpY2UuZ2V0SW5zdGFuY2UoKS5wcm92aWRlcygKLQkJCQkJbmV3IENyZWF0ZURpYWdyYW1WaWV3T3BlcmF0aW9uKG5ldyBFT2JqZWN0QWRhcHRlcigKLQkJCQkJCQlzZWxlY3RlZE1vZGVsRWxlbWVudCksCi0JCQkJCQkJV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbUVkaXRQYXJ0Lk1PREVMX0lELAotCQkJCQkJCVdQRERpYWdyYW1FZGl0b3JQbHVnaW4uRElBR1JBTV9QUkVGRVJFTkNFU19ISU5UKSk7Ci0JCQlzZXRFcnJvck1lc3NhZ2UocmVzdWx0ID8gbnVsbAotCQkJCQk6IE1lc3NhZ2VzLkRpYWdyYW1OZXdEaWFncmFtRmlsZVdpemFyZF9Sb290U2VsZWN0aW9uUGFnZUludmFsaWRTZWxlY3Rpb25NZXNzYWdlKTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9wYXJ0L0RpYWdyYW1QYWxldHRlRmFjdG9yeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9wYXJ0L0RpYWdyYW1QYWxldHRlRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZGQ4OTMwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvcGFydC9EaWFncmFtUGFsZXR0ZUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLnBhcnQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5EaWFncmFtQ29yZVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Nb2RlbFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5wcm92aWRlcnMuRGlhZ3JhbUVsZW1lbnRUeXBlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuVG9vbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucGFsZXR0ZS5QYWxldHRlQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5wYWxldHRlLlBhbGV0dGVHcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucGFsZXR0ZS5QYWxldHRlUm9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucGFsZXR0ZS5Ub29sRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS50b29scy5VbnNwZWNpZmllZFR5cGVDb25uZWN0aW9uVG9vbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnRvb2xzLlVuc3BlY2lmaWVkVHlwZUNyZWF0aW9uVG9vbDsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEaWFncmFtUGFsZXR0ZUZhY3RvcnkgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGZpbGxQYWxldHRlKFBhbGV0dGVSb290IHBhbGV0dGVSb290KSB7Ci0JCXBhbGV0dGVSb290LmFkZChjcmVhdGVNb2RlbDFHcm91cCgpKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzICJtb2RlbCIgcGFsZXR0ZSB0b29sIGdyb3VwCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgUGFsZXR0ZUNvbnRhaW5lciBjcmVhdGVNb2RlbDFHcm91cCgpIHsKLQkJUGFsZXR0ZUdyb3VwIHBhbGV0dGVDb250YWluZXIgPSBuZXcgUGFsZXR0ZUdyb3VwKAotCQkJCU1lc3NhZ2VzLk1vZGVsMUdyb3VwX3RpdGxlKTsKLQkJcGFsZXR0ZUNvbnRhaW5lci5hZGQoY3JlYXRlQ29udHJvbEZsb3cxQ3JlYXRpb25Ub29sKCkpOwotCQlwYWxldHRlQ29udGFpbmVyLmFkZChjcmVhdGVXb3JrUHJvZHVjdERlc2NyaXB0b3IyQ3JlYXRpb25Ub29sKCkpOwotCQlyZXR1cm4gcGFsZXR0ZUNvbnRhaW5lcjsKLQl9Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcml2YXRlIFRvb2xFbnRyeSBjcmVhdGVDb250cm9sRmxvdzFDcmVhdGlvblRvb2woKSB7Ci0JCUxpc3QvKjxJRWxlbWVudFR5cGU+Ki90eXBlcyA9IG5ldyBBcnJheUxpc3QvKjxJRWxlbWVudFR5cGU+Ki8oMSk7Ci0JCXR5cGVzLmFkZChEaWFncmFtRWxlbWVudFR5cGVzLkxpbmtfMzAwMSk7Ci0JCUxpbmtUb29sRW50cnkgZW50cnkgPSBuZXcgTGlua1Rvb2xFbnRyeSgKLQkJCQlEaWFncmFtQ29yZVJlc291cmNlcy5XUEREX1BhbGV0dGVfY29udHJvbF9mbG93X3RleHQsCi0JCQkJRGlhZ3JhbUNvcmVSZXNvdXJjZXMuV1BERF9QYWxldHRlX2NvbnRyb2xfZmxvd19jcmVhdGVfdGV4dCwgdHlwZXMpOwotCQllbnRyeS5zZXRTbWFsbEljb24oRGlhZ3JhbUVsZW1lbnRUeXBlcy5nZXRJbWFnZURlc2NyaXB0b3IoTW9kZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRMaW5rKCkpKTsKLQkJZW50cnkuc2V0TGFyZ2VJY29uKGVudHJ5LmdldFNtYWxsSWNvbigpKTsKLQkJcmV0dXJuIGVudHJ5OwotCX0KLQotCS8qKgotCSAqIEBtb2RpZmllZAotCSAqLwotCXByaXZhdGUgVG9vbEVudHJ5IGNyZWF0ZVdvcmtQcm9kdWN0RGVzY3JpcHRvcjJDcmVhdGlvblRvb2woKSB7Ci0JCUxpc3QvKjxJRWxlbWVudFR5cGU+Ki90eXBlcyA9IG5ldyBBcnJheUxpc3QvKjxJRWxlbWVudFR5cGU+Ki8oMSk7Ci0JCXR5cGVzLmFkZChEaWFncmFtRWxlbWVudFR5cGVzLldvcmtQcm9kdWN0Tm9kZV8xMDAxKTsKLQkJTm9kZVRvb2xFbnRyeSBlbnRyeSA9IG5ldyBOb2RlVG9vbEVudHJ5KAotCQkJCURpYWdyYW1Db3JlUmVzb3VyY2VzLkFic3RyYWN0RGlhZ3JhbV9Xb3JrUHJvZHVjdERlc2NyaXB0b3JfdGV4dCwKLQkJCQkgRGlhZ3JhbUNvcmVSZXNvdXJjZXMuQWJzdHJhY3REaWFncmFtX1dvcmtQcm9kdWN0RGVzY3JpcHRvcl90b29sdGlwLCB0eXBlcyk7Ci0JCWVudHJ5LnNldFNtYWxsSWNvbihEaWFncmFtRWxlbWVudFR5cGVzLmdldEltYWdlRGVzY3JpcHRvcihNb2RlbFBhY2thZ2UuZUlOU1RBTkNFLmdldFdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGUoKSkpOwotCQllbnRyeS5zZXRMYXJnZUljb24oZW50cnkuZ2V0U21hbGxJY29uKCkpOwotCQlyZXR1cm4gZW50cnk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGNsYXNzIE5vZGVUb29sRW50cnkgZXh0ZW5kcyBUb29sRW50cnkgewotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIGZpbmFsIExpc3QgZWxlbWVudFR5cGVzOwotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIE5vZGVUb29sRW50cnkoU3RyaW5nIHRpdGxlLCBTdHJpbmcgZGVzY3JpcHRpb24sCi0JCQkJTGlzdCBlbGVtZW50VHlwZXMpIHsKLQkJCXN1cGVyKHRpdGxlLCBkZXNjcmlwdGlvbiwgbnVsbCwgbnVsbCk7Ci0JCQl0aGlzLmVsZW1lbnRUeXBlcyA9IGVsZW1lbnRUeXBlczsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgVG9vbCBjcmVhdGVUb29sKCkgewotCQkJVG9vbCB0b29sID0gbmV3IFVuc3BlY2lmaWVkVHlwZUNyZWF0aW9uVG9vbChlbGVtZW50VHlwZXMpOwotCQkJdG9vbC5zZXRQcm9wZXJ0aWVzKGdldFRvb2xQcm9wZXJ0aWVzKCkpOwotCQkJcmV0dXJuIHRvb2w7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTGlua1Rvb2xFbnRyeSBleHRlbmRzIFRvb2xFbnRyeSB7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgZmluYWwgTGlzdCByZWxhdGlvbnNoaXBUeXBlczsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSBMaW5rVG9vbEVudHJ5KFN0cmluZyB0aXRsZSwgU3RyaW5nIGRlc2NyaXB0aW9uLAotCQkJCUxpc3QgcmVsYXRpb25zaGlwVHlwZXMpIHsKLQkJCXN1cGVyKHRpdGxlLCBkZXNjcmlwdGlvbiwgbnVsbCwgbnVsbCk7Ci0JCQl0aGlzLnJlbGF0aW9uc2hpcFR5cGVzID0gcmVsYXRpb25zaGlwVHlwZXM7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIFRvb2wgY3JlYXRlVG9vbCgpIHsKLQkJCVRvb2wgdG9vbCA9IG5ldyBVbnNwZWNpZmllZFR5cGVDb25uZWN0aW9uVG9vbChyZWxhdGlvbnNoaXBUeXBlcyk7Ci0JCQl0b29sLnNldFByb3BlcnRpZXMoZ2V0VG9vbFByb3BlcnRpZXMoKSk7Ci0JCQlyZXR1cm4gdG9vbDsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvcGFydC9EaWFncmFtVmlzdWFsSURSZWdpc3RyeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9wYXJ0L0RpYWdyYW1WaXN1YWxJRFJlZ2lzdHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlZGQ5OTEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9wYXJ0L0RpYWdyYW1WaXN1YWxJRFJlZ2lzdHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5wYXJ0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5MaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk1vZGVsUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Xb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLldvcmtQcm9kdWN0Tm9kZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQuZWRpdC5wYXJ0cy5MaW5rRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5lZGl0LnBhcnRzLkxpbmtOYW1lRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5lZGl0LnBhcnRzLldvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW1FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLmVkaXQucGFydHMuV29ya1Byb2R1Y3ROb2RlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5lZGl0LnBhcnRzLldvcmtQcm9kdWN0Tm9kZU5hbWVFZGl0UGFydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkRpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLQotLyoqCi0gKiBUaGlzIHJlZ2lzdHJ5IGlzIHVzZWQgdG8gZGV0ZXJtaW5lIHdoaWNoIHR5cGUgb2YgdmlzdWFsIG9iamVjdCBzaG91bGQgYmUKLSAqIGNyZWF0ZWQgZm9yIHRoZSBjb3JyZXNwb25kaW5nIERpYWdyYW0sIE5vZGUsIENoaWxkTm9kZSBvciBMaW5rIHJlcHJlc2VudGVkIAotICogYnkgYSBkb21haW4gbW9kZWwgb2JqZWN0LgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERpYWdyYW1WaXN1YWxJRFJlZ2lzdHJ5IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVCVUdfS0VZID0gV1BERGlhZ3JhbUVkaXRvclBsdWdpbgotCQkJLmdldEluc3RhbmNlKCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCkKLQkJCSsgIi9kZWJ1Zy92aXN1YWxJRCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBnZXRWaXN1YWxJRChWaWV3IHZpZXcpIHsKLQkJaWYgKHZpZXcgaW5zdGFuY2VvZiBEaWFncmFtKSB7Ci0JCQlpZiAoV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbUVkaXRQYXJ0Lk1PREVMX0lELmVxdWFscyh2aWV3Ci0JCQkJCS5nZXRUeXBlKCkpKSB7Ci0JCQkJcmV0dXJuIFdvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW1FZGl0UGFydC5WSVNVQUxfSUQ7Ci0JCQl9IGVsc2UgewotCQkJCXJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZ2V0VmlzdWFsSUQodmlldy5nZXRUeXBlKCkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRNb2RlbElEKFZpZXcgdmlldykgewotCQlWaWV3IGRpYWdyYW0gPSB2aWV3LmdldERpYWdyYW0oKTsKLQkJd2hpbGUgKHZpZXcgIT0gZGlhZ3JhbSkgewotCQkJRUFubm90YXRpb24gYW5ub3RhdGlvbiA9IHZpZXcuZ2V0RUFubm90YXRpb24oIlNob3J0Y3V0Iik7IC8vJE5PTi1OTFMtMSQKLQkJCWlmIChhbm5vdGF0aW9uICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gKFN0cmluZykgYW5ub3RhdGlvbi5nZXREZXRhaWxzKCkuZ2V0KCJtb2RlbElEIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCXZpZXcgPSAoVmlldykgdmlldy5lQ29udGFpbmVyKCk7Ci0JCX0KLQkJcmV0dXJuIGRpYWdyYW0gIT0gbnVsbCA/IGRpYWdyYW0uZ2V0VHlwZSgpIDogbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgZ2V0VmlzdWFsSUQoU3RyaW5nIHR5cGUpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBJbnRlZ2VyLnBhcnNlSW50KHR5cGUpOwotCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotCQkJaWYgKEJvb2xlYW4uVFJVRS50b1N0cmluZygpLmVxdWFsc0lnbm9yZUNhc2UoCi0JCQkJCVBsYXRmb3JtLmdldERlYnVnT3B0aW9uKERFQlVHX0tFWSkpKSB7Ci0JCQkJV1BERGlhZ3JhbUVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmxvZ0Vycm9yKAotCQkJCQkJIlVuYWJsZSB0byBwYXJzZSB2aWV3IHR5cGUgYXMgYSB2aXN1YWxJRCBudW1iZXI6ICIJLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkrIHR5cGUpOwotCQkJfQotCQl9Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0VHlwZShpbnQgdmlzdWFsSUQpIHsKLQkJcmV0dXJuIFN0cmluZy52YWx1ZU9mKHZpc3VhbElEKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgZ2V0RGlhZ3JhbVZpc3VhbElEKEVPYmplY3QgZG9tYWluRWxlbWVudCkgewotCQlpZiAoZG9tYWluRWxlbWVudCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQkJRUNsYXNzIGRvbWFpbkVsZW1lbnRNZXRhY2xhc3MgPSBkb21haW5FbGVtZW50LmVDbGFzcygpOwotCQlyZXR1cm4gZ2V0RGlhZ3JhbVZpc3VhbElEKGRvbWFpbkVsZW1lbnQsIGRvbWFpbkVsZW1lbnRNZXRhY2xhc3MpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBpbnQgZ2V0RGlhZ3JhbVZpc3VhbElEKEVPYmplY3QgZG9tYWluRWxlbWVudCwKLQkJCUVDbGFzcyBkb21haW5FbGVtZW50TWV0YWNsYXNzKSB7Ci0JCWlmIChNb2RlbFBhY2thZ2UuZUlOU1RBTkNFLmdldFdvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW0oKQotCQkJCS5pc1N1cGVyVHlwZU9mKGRvbWFpbkVsZW1lbnRNZXRhY2xhc3MpCi0JCQkJJiYgaXNEaWFncmFtV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbV83OSgoV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbSkgZG9tYWluRWxlbWVudCkpIHsKLQkJCXJldHVybiBXb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtRWRpdFBhcnQuVklTVUFMX0lEOwotCQl9Ci0JCXJldHVybiBnZXRVbnJlY29nbml6ZWREaWFncmFtSUQoZG9tYWluRWxlbWVudCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IGdldE5vZGVWaXN1YWxJRChWaWV3IGNvbnRhaW5lclZpZXcsIEVPYmplY3QgZG9tYWluRWxlbWVudCkgewotCQlpZiAoZG9tYWluRWxlbWVudCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQkJRUNsYXNzIGRvbWFpbkVsZW1lbnRNZXRhY2xhc3MgPSBkb21haW5FbGVtZW50LmVDbGFzcygpOwotCQlyZXR1cm4gZ2V0Tm9kZVZpc3VhbElEKGNvbnRhaW5lclZpZXcsIGRvbWFpbkVsZW1lbnQsCi0JCQkJZG9tYWluRWxlbWVudE1ldGFjbGFzcywgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IGdldE5vZGVWaXN1YWxJRChWaWV3IGNvbnRhaW5lclZpZXcsCi0JCQlFT2JqZWN0IGRvbWFpbkVsZW1lbnQsIEVDbGFzcyBkb21haW5FbGVtZW50TWV0YWNsYXNzLAotCQkJU3RyaW5nIHNlbWFudGljSGludCkgewotCQlTdHJpbmcgY29udGFpbmVyTW9kZWxJRCA9IGdldE1vZGVsSUQoY29udGFpbmVyVmlldyk7Ci0JCWlmICghV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbUVkaXRQYXJ0Lk1PREVMX0lECi0JCQkJLmVxdWFscyhjb250YWluZXJNb2RlbElEKSkgewotCQkJcmV0dXJuIC0xOwotCQl9Ci0JCWludCBjb250YWluZXJWaXN1YWxJRDsKLQkJaWYgKFdvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW1FZGl0UGFydC5NT0RFTF9JRAotCQkJCS5lcXVhbHMoY29udGFpbmVyTW9kZWxJRCkpIHsKLQkJCWNvbnRhaW5lclZpc3VhbElEID0gZ2V0VmlzdWFsSUQoY29udGFpbmVyVmlldyk7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoY29udGFpbmVyVmlldyBpbnN0YW5jZW9mIERpYWdyYW0pIHsKLQkJCQljb250YWluZXJWaXN1YWxJRCA9IFdvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW1FZGl0UGFydC5WSVNVQUxfSUQ7Ci0JCQl9IGVsc2UgewotCQkJCXJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpbnQgbm9kZVZpc3VhbElEID0gc2VtYW50aWNIaW50ICE9IG51bGwgPyBnZXRWaXN1YWxJRChzZW1hbnRpY0hpbnQpCi0JCQkJOiAtMTsKLQkJc3dpdGNoIChjb250YWluZXJWaXN1YWxJRCkgewotCQljYXNlIFdvcmtQcm9kdWN0Tm9kZUVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCWlmIChXb3JrUHJvZHVjdE5vZGVOYW1lRWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgewotCQkJCXJldHVybiBXb3JrUHJvZHVjdE5vZGVOYW1lRWRpdFBhcnQuVklTVUFMX0lEOwotCQkJfQotCQkJcmV0dXJuIGdldFVucmVjb2duaXplZFdvcmtQcm9kdWN0Tm9kZV8xMDAxQ2hpbGROb2RlSUQoCi0JCQkJCWRvbWFpbkVsZW1lbnQsIHNlbWFudGljSGludCk7Ci0JCWNhc2UgV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbUVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCWlmICgoc2VtYW50aWNIaW50ID09IG51bGwgfHwgV29ya1Byb2R1Y3ROb2RlRWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkKLQkJCQkJJiYgTW9kZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRXb3JrUHJvZHVjdE5vZGUoKQotCQkJCQkJCS5pc1N1cGVyVHlwZU9mKGRvbWFpbkVsZW1lbnRNZXRhY2xhc3MpCi0JCQkJCSYmIChkb21haW5FbGVtZW50ID09IG51bGwgfHwgaXNOb2RlV29ya1Byb2R1Y3ROb2RlXzEwMDEoKFdvcmtQcm9kdWN0Tm9kZSkgZG9tYWluRWxlbWVudCkpKSB7Ci0JCQkJcmV0dXJuIFdvcmtQcm9kdWN0Tm9kZUVkaXRQYXJ0LlZJU1VBTF9JRDsKLQkJCX0KLQkJCXJldHVybiBnZXRVbnJlY29nbml6ZWRXb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtXzc5Q2hpbGROb2RlSUQoCi0JCQkJCWRvbWFpbkVsZW1lbnQsIHNlbWFudGljSGludCk7Ci0JCWNhc2UgTGlua0VkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCWlmIChMaW5rTmFtZUVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsKLQkJCQlyZXR1cm4gTGlua05hbWVFZGl0UGFydC5WSVNVQUxfSUQ7Ci0JCQl9Ci0JCQlyZXR1cm4gZ2V0VW5yZWNvZ25pemVkTGlua18zMDAxTGlua0xhYmVsSUQoc2VtYW50aWNIaW50KTsKLQkJfQotCQlyZXR1cm4gLTE7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IGdldExpbmtXaXRoQ2xhc3NWaXN1YWxJRChFT2JqZWN0IGRvbWFpbkVsZW1lbnQpIHsKLQkJaWYgKGRvbWFpbkVsZW1lbnQgPT0gbnVsbCkgewotCQkJcmV0dXJuIC0xOwotCQl9Ci0JCUVDbGFzcyBkb21haW5FbGVtZW50TWV0YWNsYXNzID0gZG9tYWluRWxlbWVudC5lQ2xhc3MoKTsKLQkJcmV0dXJuIGdldExpbmtXaXRoQ2xhc3NWaXN1YWxJRChkb21haW5FbGVtZW50LCBkb21haW5FbGVtZW50TWV0YWNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgZ2V0TGlua1dpdGhDbGFzc1Zpc3VhbElEKEVPYmplY3QgZG9tYWluRWxlbWVudCwKLQkJCUVDbGFzcyBkb21haW5FbGVtZW50TWV0YWNsYXNzKSB7Ci0JCWlmIChNb2RlbFBhY2thZ2UuZUlOU1RBTkNFLmdldExpbmsoKS5pc1N1cGVyVHlwZU9mKAotCQkJCWRvbWFpbkVsZW1lbnRNZXRhY2xhc3MpCi0JCQkJJiYgKGRvbWFpbkVsZW1lbnQgPT0gbnVsbCB8fCBpc0xpbmtXaXRoQ2xhc3NMaW5rXzMwMDEoKExpbmspIGRvbWFpbkVsZW1lbnQpKSkgewotCQkJcmV0dXJuIExpbmtFZGl0UGFydC5WSVNVQUxfSUQ7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gZ2V0VW5yZWNvZ25pemVkTGlua1dpdGhDbGFzc0lEKGRvbWFpbkVsZW1lbnQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVXNlciBjYW4gY2hhbmdlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kIHRvIGNoZWNrIHNvbWUgYWRkaXRpb25hbCAKLQkgKiBjb25kaXRpb25zIGhlcmUuCi0JICoKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0RpYWdyYW1Xb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtXzc5KAotCQkJV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbSBlbGVtZW50KSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIFVzZXIgY2FuIGNoYW5nZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZCB0byBoYW5kbGUgc29tZSBzcGVjaWZpYwotCSAqIHNpdHVhdGlvbnMgbm90IGNvdmVyZWQgYnkgZGVmYXVsdCBsb2dpYy4KLQkgKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBpbnQgZ2V0VW5yZWNvZ25pemVkRGlhZ3JhbUlEKEVPYmplY3QgZG9tYWluRWxlbWVudCkgewotCQlyZXR1cm4gLTE7Ci0JfQotCi0JLyoqCi0JICogVXNlciBjYW4gY2hhbmdlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kIHRvIGNoZWNrIHNvbWUgYWRkaXRpb25hbCAKLQkgKiBjb25kaXRpb25zIGhlcmUuCi0JICoKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc05vZGVXb3JrUHJvZHVjdE5vZGVfMTAwMShXb3JrUHJvZHVjdE5vZGUgZWxlbWVudCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBVc2VyIGNhbiBjaGFuZ2UgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2QgdG8gaGFuZGxlIHNvbWUgc3BlY2lmaWMKLQkgKiBzaXR1YXRpb25zIG5vdCBjb3ZlcmVkIGJ5IGRlZmF1bHQgbG9naWMuCi0JICoKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgaW50IGdldFVucmVjb2duaXplZFdvcmtQcm9kdWN0Tm9kZV8xMDAxQ2hpbGROb2RlSUQoCi0JCQlFT2JqZWN0IGRvbWFpbkVsZW1lbnQsIFN0cmluZyBzZW1hbnRpY0hpbnQpIHsKLQkJcmV0dXJuIC0xOwotCX0KLQotCS8qKgotCSAqIFVzZXIgY2FuIGNoYW5nZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZCB0byBoYW5kbGUgc29tZSBzcGVjaWZpYwotCSAqIHNpdHVhdGlvbnMgbm90IGNvdmVyZWQgYnkgZGVmYXVsdCBsb2dpYy4KLQkgKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBpbnQgZ2V0VW5yZWNvZ25pemVkV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbV83OUNoaWxkTm9kZUlEKAotCQkJRU9iamVjdCBkb21haW5FbGVtZW50LCBTdHJpbmcgc2VtYW50aWNIaW50KSB7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQkvKioKLQkgKiBVc2VyIGNhbiBjaGFuZ2UgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2QgdG8gaGFuZGxlIHNvbWUgc3BlY2lmaWMKLQkgKiBzaXR1YXRpb25zIG5vdCBjb3ZlcmVkIGJ5IGRlZmF1bHQgbG9naWMuCi0JICoKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgaW50IGdldFVucmVjb2duaXplZExpbmtfMzAwMUxpbmtMYWJlbElEKFN0cmluZyBzZW1hbnRpY0hpbnQpIHsKLQkJcmV0dXJuIC0xOwotCX0KLQotCS8qKgotCSAqIFVzZXIgY2FuIGNoYW5nZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZCB0byBoYW5kbGUgc29tZSBzcGVjaWZpYwotCSAqIHNpdHVhdGlvbnMgbm90IGNvdmVyZWQgYnkgZGVmYXVsdCBsb2dpYy4KLQkgKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBpbnQgZ2V0VW5yZWNvZ25pemVkTGlua1dpdGhDbGFzc0lEKEVPYmplY3QgZG9tYWluRWxlbWVudCkgewotCQlyZXR1cm4gLTE7Ci0JfQotCi0JLyoqCi0JICogVXNlciBjYW4gY2hhbmdlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kIHRvIGNoZWNrIHNvbWUgYWRkaXRpb25hbCAKLQkgKiBjb25kaXRpb25zIGhlcmUuCi0JICoKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0xpbmtXaXRoQ2xhc3NMaW5rXzMwMDEoTGluayBlbGVtZW50KSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvcGFydC9NZXNzYWdlcy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9wYXJ0L01lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhMjk1MTUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9wYXJ0L01lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5wYXJ0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotCS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgTWVzc2FnZXMgZXh0ZW5kcyBOTFMgewotCi0JCS8qKgotICogQGdlbmVyYXRlZAotICovCi0Jc3RhdGljIHsKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcygibWVzc2FnZXMiLCBNZXNzYWdlcy5jbGFzcyk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkJLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLQlwcml2YXRlIE1lc3NhZ2VzKCkgewotCX0KLQotCQotICAgIAotCQkvKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIERpYWdyYW1EaWFncmFtRWRpdG9yVXRpbF9PcGVuTW9kZWxSZXNvdXJjZUVycm9yRGlhbG9nVGl0bGU7Ci0KLQkJLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBEaWFncmFtRGlhZ3JhbUVkaXRvclV0aWxfT3Blbk1vZGVsUmVzb3VyY2VFcnJvckRpYWxvZ01lc3NhZ2U7Ci0KLQkJLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBEaWFncmFtRGlhZ3JhbUVkaXRvclV0aWxfQ3JlYXRlRGlhZ3JhbVByb2dyZXNzVGFzazsKLQotCQkvKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIERpYWdyYW1EaWFncmFtRWRpdG9yVXRpbF9DcmVhdGVEaWFncmFtQ29tbWFuZExhYmVsOwotCQkKLQkJLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBEaWFncmFtRG9jdW1lbnRQcm92aWRlcl9pc01vZGlmaWFibGU7Ci0JCi0JCS8qKgotICogQGdlbmVyYXRlZAotICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgRGlhZ3JhbURvY3VtZW50UHJvdmlkZXJfaGFuZGxlRWxlbWVudENvbnRlbnRDaGFuZ2VkOwotCQotCQkvKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIERpYWdyYW1Eb2N1bWVudFByb3ZpZGVyX0luY29ycmVjdElucHV0RXJyb3I7Ci0JCi0JCS8qKgotICogQGdlbmVyYXRlZAotICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgRGlhZ3JhbURvY3VtZW50UHJvdmlkZXJfVW5hYmxlVG9Mb2FkUmVzb3VyY2VFcnJvcjsKLQkKLQkJLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBEaWFncmFtRG9jdW1lbnRQcm92aWRlcl9Ob0RpYWdyYW1JblJlc291cmNlRXJyb3I7Ci0JCi0JCS8qKgotICogQGdlbmVyYXRlZAotICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgRGlhZ3JhbURvY3VtZW50UHJvdmlkZXJfRGlhZ3JhbUxvYWRpbmdFcnJvcjsKLQkKLQkJLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBEaWFncmFtRG9jdW1lbnRQcm92aWRlcl9VbnN5bmNocm9uaXplZEZpbGVTYXZlRXJyb3I7Ci0JCi0JCS8qKgotICogQGdlbmVyYXRlZAotICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgRGlhZ3JhbURvY3VtZW50UHJvdmlkZXJfU2F2ZURpYWdyYW1UYXNrOwotCQotCQkvKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIERpYWdyYW1Eb2N1bWVudFByb3ZpZGVyX1NhdmVOZXh0UmVzb3VyY2VUYXNrOwotCQotCQkvKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIERpYWdyYW1Jbml0RGlhZ3JhbUZpbGVBY3Rpb25fSW5pdERpYWdyYW1GaWxlUmVzb3VyY2VFcnJvckRpYWxvZ1RpdGxlOwotCi0JCS8qKgotICogQGdlbmVyYXRlZAotICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgRGlhZ3JhbUluaXREaWFncmFtRmlsZUFjdGlvbl9Jbml0RGlhZ3JhbUZpbGVSZXNvdXJjZUVycm9yRGlhbG9nTWVzc2FnZTsKLQotCQkvKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIERpYWdyYW1Jbml0RGlhZ3JhbUZpbGVBY3Rpb25fSW5pdERpYWdyYW1GaWxlV2l6YXJkVGl0bGU7Ci0KLQkJLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBEaWFncmFtSW5pdERpYWdyYW1GaWxlQWN0aW9uX09wZW5Nb2RlbEZpbGVEaWFsb2dUaXRsZTsKLQkKLQkJLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBEaWFncmFtTmV3RGlhZ3JhbUZpbGVXaXphcmRfQ3JlYXRpb25QYWdlTmFtZTsKLQotCQkvKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIERpYWdyYW1OZXdEaWFncmFtRmlsZVdpemFyZF9DcmVhdGlvblBhZ2VUaXRsZTsKLQotCQkvKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIERpYWdyYW1OZXdEaWFncmFtRmlsZVdpemFyZF9DcmVhdGlvblBhZ2VEZXNjcmlwdGlvbjsKLQotCQkvKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIERpYWdyYW1OZXdEaWFncmFtRmlsZVdpemFyZF9Sb290U2VsZWN0aW9uUGFnZU5hbWU7Ci0KLQkJLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBEaWFncmFtTmV3RGlhZ3JhbUZpbGVXaXphcmRfUm9vdFNlbGVjdGlvblBhZ2VUaXRsZTsKLQotCQkvKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIERpYWdyYW1OZXdEaWFncmFtRmlsZVdpemFyZF9Sb290U2VsZWN0aW9uUGFnZURlc2NyaXB0aW9uOwotCi0JCS8qKgotICogQGdlbmVyYXRlZAotICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgRGlhZ3JhbU5ld0RpYWdyYW1GaWxlV2l6YXJkX1Jvb3RTZWxlY3Rpb25QYWdlU2VsZWN0aW9uVGl0bGU7Ci0KLQkJLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBEaWFncmFtTmV3RGlhZ3JhbUZpbGVXaXphcmRfUm9vdFNlbGVjdGlvblBhZ2VOb1NlbGVjdGlvbk1lc3NhZ2U7Ci0KLQkJLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBEaWFncmFtTmV3RGlhZ3JhbUZpbGVXaXphcmRfUm9vdFNlbGVjdGlvblBhZ2VJbnZhbGlkU2VsZWN0aW9uTWVzc2FnZTsKLQotCQkvKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIERpYWdyYW1OZXdEaWFncmFtRmlsZVdpemFyZF9Jbml0RGlhZ3JhbUNvbW1hbmQ7Ci0KLQkJLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBEaWFncmFtTmV3RGlhZ3JhbUZpbGVXaXphcmRfSW5jb3JyZWN0Um9vdEVycm9yOwotCQotCQkvKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIE1vZGVsMUdyb3VwX3RpdGxlOwotCi0JCS8qKgotICogQGdlbmVyYXRlZAotICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgQ29udHJvbEZsb3cxQ3JlYXRpb25Ub29sX3RpdGxlOwotCi0JCS8qKgotICogQGdlbmVyYXRlZAotICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgQ29udHJvbEZsb3cxQ3JlYXRpb25Ub29sX2Rlc2M7Ci0KLQkJLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXb3JrUHJvZHVjdERlc2NyaXB0b3IyQ3JlYXRpb25Ub29sX3RpdGxlOwotCi0JCS8qKgotICogQGdlbmVyYXRlZAotICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV29ya1Byb2R1Y3REZXNjcmlwdG9yMkNyZWF0aW9uVG9vbF9kZXNjOwotCSAgICAgICAgCi0gICAgICAgIAotCQkvKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbW1hbmROYW1lX09wZW5EaWFncmFtOwotICAgIAotICAgIC8vVE9ETzogcHV0IGFjY2Vzc29yIGZpZWxkcyBtYW51YWxseQkKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvcGFydC9Nb2RlbEVsZW1lbnRTZWxlY3Rpb25QYWdlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL3BhcnQvTW9kZWxFbGVtZW50U2VsZWN0aW9uUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NzdjZWU1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvcGFydC9Nb2RlbEVsZW1lbnRTZWxlY3Rpb25QYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5wYXJ0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JV3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLQotLyoqCi0gKiBXaXphcmQgcGFnZSB0aGF0IGFsbG93cyB0byBzZWxlY3QgZWxlbWVudCBmcm9tIG1vZGVsLgotICogCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBNb2RlbEVsZW1lbnRTZWxlY3Rpb25QYWdlIGV4dGVuZHMgV2l6YXJkUGFnZSB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVPYmplY3Qgc2VsZWN0ZWRNb2RlbEVsZW1lbnQ7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBUcmVlVmlld2VyIG1vZGVsVmV3ZXI7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE1vZGVsRWxlbWVudFNlbGVjdGlvblBhZ2UoU3RyaW5nIHBhZ2VOYW1lKSB7Ci0JCXN1cGVyKHBhZ2VOYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVPYmplY3QgZ2V0TW9kZWxFbGVtZW50KCkgewotCQlyZXR1cm4gc2VsZWN0ZWRNb2RlbEVsZW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1vZGVsRWxlbWVudChFT2JqZWN0IG1vZGVsRWxlbWVudCkgewotCQlzZWxlY3RlZE1vZGVsRWxlbWVudCA9IG1vZGVsRWxlbWVudDsKLQkJaWYgKG1vZGVsVmV3ZXIgIT0gbnVsbCkgewotCQkJaWYgKHNlbGVjdGVkTW9kZWxFbGVtZW50ICE9IG51bGwpIHsKLQkJCQltb2RlbFZld2VyLnNldElucHV0KHNlbGVjdGVkTW9kZWxFbGVtZW50LmVSZXNvdXJjZSgpKTsKLQkJCQltb2RlbFZld2VyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbigKLQkJCQkJCXNlbGVjdGVkTW9kZWxFbGVtZW50KSk7Ci0JCQl9IGVsc2UgewotCQkJCW1vZGVsVmV3ZXIuc2V0SW5wdXQobnVsbCk7Ci0JCQl9Ci0JCQlzZXRQYWdlQ29tcGxldGUodmFsaWRhdGVQYWdlKCkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCQlpbml0aWFsaXplRGlhbG9nVW5pdHMocGFyZW50KTsKLQotCQlDb21wb3NpdGUgcGxhdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlwbGF0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQlwbGF0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQkJc2V0Q29udHJvbChwbGF0ZSk7Ci0KLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwocGxhdGUsIFNXVC5OT05FKTsKLQkJbGFiZWwuc2V0VGV4dChnZXRTZWxlY3Rpb25UaXRsZSgpKTsKLQkJbGFiZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9CRUdJTk5JTkcpKTsKLQotCQltb2RlbFZld2VyID0gbmV3IFRyZWVWaWV3ZXIocGxhdGUsIFNXVC5TSU5HTEUgfCBTV1QuSF9TQ1JPTEwKLQkJCQl8IFNXVC5WX1NDUk9MTCB8IFNXVC5CT1JERVIpOwotCQlHcmlkRGF0YSBsYXlvdXREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCWxheW91dERhdGEuaGVpZ2h0SGludCA9IDMwMDsKLQkJbGF5b3V0RGF0YS53aWR0aEhpbnQgPSAzMDA7Ci0JCW1vZGVsVmV3ZXIuZ2V0VHJlZSgpLnNldExheW91dERhdGEobGF5b3V0RGF0YSk7Ci0JCW1vZGVsVmV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcigKLQkJCQlXUEREaWFncmFtRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkKLQkJCQkJCS5nZXRJdGVtUHJvdmlkZXJzQWRhcHRlckZhY3RvcnkoKSkpOwotCQltb2RlbFZld2VyLnNldExhYmVsUHJvdmlkZXIobmV3IEFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcigKLQkJCQlXUEREaWFncmFtRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkKLQkJCQkJCS5nZXRJdGVtUHJvdmlkZXJzQWRhcHRlckZhY3RvcnkoKSkpOwotCQlpZiAoc2VsZWN0ZWRNb2RlbEVsZW1lbnQgIT0gbnVsbCkgewotCQkJbW9kZWxWZXdlci5zZXRJbnB1dChzZWxlY3RlZE1vZGVsRWxlbWVudC5lUmVzb3VyY2UoKSk7Ci0JCQltb2RlbFZld2VyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbigKLQkJCQkJc2VsZWN0ZWRNb2RlbEVsZW1lbnQpKTsKLQkJfQotCQltb2RlbFZld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQotCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQlNb2RlbEVsZW1lbnRTZWxlY3Rpb25QYWdlLnRoaXMKLQkJCQkJCS51cGRhdGVTZWxlY3Rpb24oKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBldmVudAotCQkJCQkJCQkuZ2V0U2VsZWN0aW9uKCkpOwotCQkJfQotCQl9KTsKLQotCQlzZXRQYWdlQ29tcGxldGUodmFsaWRhdGVQYWdlKCkpOwotCX0KLQotCS8qKgotCSAqIE92ZXJyaWRlIHRvIHByb3ZpZGUgY3VzdG9tIG1vZGVsIGVsZW1lbnQgZGVzY3JpcHRpb24uCi0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VsZWN0aW9uVGl0bGUoKSB7Ci0JCXJldHVybiAiU2VsZWN0IG1vZGVsIGVsZW1lbnQ6IjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlU2VsZWN0aW9uKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlzZWxlY3RlZE1vZGVsRWxlbWVudCA9IG51bGw7Ci0JCWlmIChzZWxlY3Rpb24uc2l6ZSgpID09IDEpIHsKLQkJCU9iamVjdCBzZWxlY3RlZEVsZW1lbnQgPSBzZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCQlpZiAoc2VsZWN0ZWRFbGVtZW50IGluc3RhbmNlb2YgSVdyYXBwZXJJdGVtUHJvdmlkZXIpIHsKLQkJCQlzZWxlY3RlZEVsZW1lbnQgPSAoKElXcmFwcGVySXRlbVByb3ZpZGVyKSBzZWxlY3RlZEVsZW1lbnQpCi0JCQkJCQkuZ2V0VmFsdWUoKTsKLQkJCX0KLQkJCWlmIChzZWxlY3RlZEVsZW1lbnQgaW5zdGFuY2VvZiBGZWF0dXJlTWFwLkVudHJ5KSB7Ci0JCQkJc2VsZWN0ZWRFbGVtZW50ID0gKChGZWF0dXJlTWFwLkVudHJ5KSBzZWxlY3RlZEVsZW1lbnQpCi0JCQkJCQkuZ2V0VmFsdWUoKTsKLQkJCX0KLQkJCWlmIChzZWxlY3RlZEVsZW1lbnQgaW5zdGFuY2VvZiBFT2JqZWN0KSB7Ci0JCQkJc2VsZWN0ZWRNb2RlbEVsZW1lbnQgPSAoRU9iamVjdCkgc2VsZWN0ZWRFbGVtZW50OwotCQkJfQotCQl9Ci0JCXNldFBhZ2VDb21wbGV0ZSh2YWxpZGF0ZVBhZ2UoKSk7Ci0JfQotCi0JLyoqCi0JICogT3ZlcnJpZGUgdG8gcHJvdmlkZSBzcGVjaWZpYyB2YWxpZGF0aW9uIG9mIHRoZSBzZWxlY3RlZCBtb2RlbCBlbGVtZW50LgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiB2YWxpZGF0ZVBhZ2UoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvcGFydC9XUERESW1hZ2VzLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL3BhcnQvV1BEREltYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZTI0OWE0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvcGFydC9XUERESW1hZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy9BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vL2FyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy93aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy9odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vQ29udHJpYnV0b3JzOgotLy9JQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLnBhcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjIKLSAqLwotcHVibGljIGNsYXNzIFdQRERJbWFnZXMgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVMQ0wxNiA9ICJpY29ucy9mdWxsL2VsY2wxNi8iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRExDTDE2ID0gImljb25zL2Z1bGwvZGxjbDE2LyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFVE9PTDE2ID0gImljb25zL2Z1bGwvZXRvb2wxNi8iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRFRPT0wxNiA9ICJpY29ucy9mdWxsL2R0b29sMTYvIjsgLy8kTk9OLU5MUy0xJAotCQotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19QQVRIX0VESVRPUiA9IEVUT09MMTYgKyAiV1BEREVkaXRvci5naWYiOyAvLyROT04tTkxTLTEkCQotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElTQUJMRURfSU1HX1BBVEhfRURJVE9SID0gRFRPT0wxNgotCQkJKyAiV1BEREVkaXRvci5naWYiOyAvLyROT04tTkxTLTEkCQotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgRElTQUJMRURfSU1HX0RFU0NfRURJVE9SID0gV1BERGlhZ3JhbUVkaXRvclBsdWdpbgotCQkJLmdldEJ1bmRsZWRJbWFnZURlc2NyaXB0b3IoRElTQUJMRURfSU1HX1BBVEhfRURJVE9SKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIElNR19ERVNDX0VESVRPUiA9IFdQRERpYWdyYW1FZGl0b3JQbHVnaW4KLQkJCS5nZXRCdW5kbGVkSW1hZ2VEZXNjcmlwdG9yKElNR19QQVRIX0VESVRPUik7CQkKLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9wYXJ0L1dQRERpYWdyYW1FZGl0b3IuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvcGFydC9XUEREaWFncmFtRWRpdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyZTE2NzMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9wYXJ0L1dQRERpYWdyYW1FZGl0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLyoqCi0gKiAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLnBhcnQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkRlbGVnYXRpbmdMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkZyZWVmb3JtTGF5ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkxheWVyZWRQYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuRGlhZ3JhbUNvcmVSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5wYXJ0LkFic3RyYWN0RGlhZ3JhbUVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnV0aWwuRGlhZ3JhbUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLmVkaXQucGFydHMuRGlhZ3JhbUVkaXRQYXJ0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLnByb3ZpZGVycy5EaWFncmFtRWxlbWVudFR5cGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5MYXllckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUucHJlZmVyZW5jZXMuUHJlZmVyZW5jZXNIaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuYWN0aW9ucy5BY3Rpb25JZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuRGlhZ3JhbVJvb3RFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlcXVlc3RzLkNyZWF0ZVVuc3BlY2lmaWVkVHlwZUNvbm5lY3Rpb25SZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuSUVsZW1lbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQ29udHJpYnV0aW9uSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotLyoqCi0gKiBEaWFncmFtIEVkaXRvciBmb3IgV29yayBQcm9kdWN0IERlcGVuZGVuY3kgRGlhZ3JhbS4KLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQGN1c3RvbQotICovCi1wdWJsaWMgY2xhc3MgV1BERGlhZ3JhbUVkaXRvciBleHRlbmRzIEFic3RyYWN0RGlhZ3JhbUVkaXRvciB7Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVHcmFwaGljYWxWaWV3ZXIoKSB7Ci0JCXN1cGVyLmNvbmZpZ3VyZUdyYXBoaWNhbFZpZXdlcigpOwotCQlEaWFncmFtUm9vdEVkaXRQYXJ0IHJvb3QgPSAoRGlhZ3JhbVJvb3RFZGl0UGFydCkgZ2V0RGlhZ3JhbUdyYXBoaWNhbFZpZXdlcigpCi0JCQkJLmdldFJvb3RFZGl0UGFydCgpOwotCQlMYXllcmVkUGFuZSBwcmludGFibGVMYXllcnMgPSAoTGF5ZXJlZFBhbmUpIHJvb3QKLQkJCQkuZ2V0TGF5ZXIoTGF5ZXJDb25zdGFudHMuUFJJTlRBQkxFX0xBWUVSUyk7Ci0JCUZyZWVmb3JtTGF5ZXIgZXh0TGFiZWxzTGF5ZXIgPSBuZXcgRnJlZWZvcm1MYXllcigpOwotCQlleHRMYWJlbHNMYXllci5zZXRMYXlvdXRNYW5hZ2VyKG5ldyBEZWxlZ2F0aW5nTGF5b3V0KCkpOwotLy8JCXByaW50YWJsZUxheWVycy5hZGRMYXllckFmdGVyKGV4dExhYmVsc0xheWVyLAotLy8JCQkJRGlhZ3JhbUVkaXRQYXJ0RmFjdG9yeS5FWFRFUk5BTF9OT0RFX0xBQkVMU19MQVlFUiwKLS8vCQkJCUxheWVyQ29uc3RhbnRzLlBSSU1BUllfTEFZRVIpOwotCQlMYXllcmVkUGFuZSBzY2FsYWJsZUxheWVycyA9IChMYXllcmVkUGFuZSkgcm9vdAotCQkJCS5nZXRMYXllcihMYXllckNvbnN0YW50cy5TQ0FMQUJMRV9MQVlFUlMpOwotCQlGcmVlZm9ybUxheWVyIHNjYWxlZEZlZWRiYWNrTGF5ZXIgPSBuZXcgRnJlZWZvcm1MYXllcigpOwotCQlzY2FsZWRGZWVkYmFja0xheWVyLnNldEVuYWJsZWQoZmFsc2UpOwotCQlzY2FsYWJsZUxheWVycy5hZGRMYXllckFmdGVyKHNjYWxlZEZlZWRiYWNrTGF5ZXIsCi0JCQkJTGF5ZXJDb25zdGFudHMuU0NBTEVEX0ZFRURCQUNLX0xBWUVSLAotCQkJCURpYWdyYW1Sb290RWRpdFBhcnQuREVDT1JBVElPTl9VTlBSSU5UQUJMRV9MQVlFUik7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFByZWZlcmVuY2VzSGludCBnZXRQcmVmZXJlbmNlc0hpbnQoKSB7Ci0JCXJldHVybiBuZXcgUHJlZmVyZW5jZXNIaW50KFdQRERpYWdyYW1FZGl0b3JQbHVnaW4uSUQpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBY3Rpb25zKCkgewotCQlzdXBlci5jcmVhdGVBY3Rpb25zKCk7Ci0JCUxpc3Q8SUVsZW1lbnRUeXBlPiBlbGVtZW50VHlwZXMgPSBuZXcgQXJyYXlMaXN0PElFbGVtZW50VHlwZT4oKTsKLQkJZWxlbWVudFR5cGVzLmFkZChEaWFncmFtRWxlbWVudFR5cGVzLldvcmtQcm9kdWN0Tm9kZV8xMDAxKTsKLQkJSUFjdGlvbiBhY3Rpb24gPSBjcmVhdGVBbkFjdGlvbigKLQkJCQlEaWFncmFtQ29yZVJlc291cmNlcy5BYnN0cmFjdERpYWdyYW1fV29ya1Byb2R1Y3REZXNjcmlwdG9yX3RleHQsIGVsZW1lbnRUeXBlcywgLy8kTk9OLU5MUy0xJAotCQkJCURpYWdyYW1Db25zdGFudHMuQ1JFQVRFX1dPUktfUFJPRFVDVF9ERVNDUklQVE9SX05PREUsIAotCQkJCURpYWdyYW1Db3JlUmVzb3VyY2VzLkFic3RyYWN0RGlhZ3JhbV9Xb3JrUHJvZHVjdERlc2NyaXB0b3JfdG9vbHRpcAotCQkJCSwgV1BERGlhZ3JhbUVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldEltYWdlRGVzY3JpcHRvcigiZnVsbC9vYmoxNi9Xb3JrUHJvZHVjdERlc2NyaXB0b3IuZ2lmIikpOyAvLyROT04tTkxTLTEkCi0JCWdldEFjdGlvblJlZ2lzdHJ5KCkucmVnaXN0ZXJBY3Rpb24oYWN0aW9uKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgY29udHJpYnV0ZVRvQ29udGV4dE1lbnUoSU1lbnVNYW5hZ2VyIG1lbnUpIHsKLQkJc3VwZXIuY29udHJpYnV0ZVRvQ29udGV4dE1lbnUobWVudSk7Ci0JCUlDb250cmlidXRpb25JdGVtIGl0ZW0gPSBtZW51LmZpbmQoQWN0aW9uSWRzLk1FTlVfRElBR1JBTV9BREQpOwotCQlpZihpdGVtICE9IG51bGwgJiYgaXRlbSBpbnN0YW5jZW9mIElNZW51TWFuYWdlcil7Ci0JCQlJTWVudU1hbmFnZXIgYWRkTWVudSA9IChJTWVudU1hbmFnZXIpaXRlbTsKLQkJCWlmKGdldEdyYXBoaWNhbFZpZXdlcigpLmdldFNlbGVjdGVkRWRpdFBhcnRzKCkuc2l6ZSgpID09IDApewotCQkJCWFkZFRvTWVudShhZGRNZW51LCBudWxsLCBEaWFncmFtQ29uc3RhbnRzLkRJQUdSQU1fQUREX01FTlVfR0VORVJBTF9HUk9VUCwgCi0JCQkJCQl0cnVlLCB0cnVlKTsJCi0JCQkJYWRkVG9NZW51KGFkZE1lbnUsRGlhZ3JhbUNvbnN0YW50cy5DUkVBVEVfV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfTk9ERSwgCi0JCQkJCQlEaWFncmFtQ29uc3RhbnRzLkRJQUdSQU1fQUREX01FTlVfR0VORVJBTF9HUk9VUCwgdHJ1ZSwgdHJ1ZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JcHJvdGVjdGVkIFN0cmluZyBnZXRQYXJ0TmFtZVByZWZpeCgpIHsKLQkJcmV0dXJuIERpYWdyYW1Db3JlUmVzb3VyY2VzLldvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW1fcHJlZml4OyAKLQl9Ci0JCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBJbWFnZSBnZXRQYXJ0SW1hZ2UoKSB7Ci0JCXJldHVybiBXUEREaWFncmFtRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0U2hhcmVkSW1hZ2UoCi0JCQkJImZ1bGwvZXRvb2wxNi9XUERERWRpdG9yLmdpZiIpOyAvLyROT04tTkxTLTEkCi0JfQotCQotCXByb3RlY3RlZCBDcmVhdGVVbnNwZWNpZmllZFR5cGVDb25uZWN0aW9uUmVxdWVzdCBnZXRDcmVhdGVDb250cm9sRmxvd1JlcXVlc3QoKXsKLQkJTGlzdDxJRWxlbWVudFR5cGU+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PElFbGVtZW50VHlwZT4oKTsKLQkJbGlzdC5hZGQoRGlhZ3JhbUVsZW1lbnRUeXBlcy5MaW5rXzMwMDEpOwotCQlDcmVhdGVVbnNwZWNpZmllZFR5cGVDb25uZWN0aW9uUmVxdWVzdCBjb25uZWN0aW9uUmVxdWVzdCA9IAotCQkJbmV3IENyZWF0ZVVuc3BlY2lmaWVkVHlwZUNvbm5lY3Rpb25SZXF1ZXN0KGxpc3QsIGZhbHNlLAotCQkJCQlXUEREaWFncmFtRWRpdG9yUGx1Z2luLkRJQUdSQU1fUFJFRkVSRU5DRVNfSElOVCk7Ci0JCXJldHVybiBjb25uZWN0aW9uUmVxdWVzdDsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL3BhcnQvV1BERGlhZ3JhbUVkaXRvclBsdWdpbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9wYXJ0L1dQRERpYWdyYW1FZGl0b3JQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTM5MWZhYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL3BhcnQvV1BERGlhZ3JhbUVkaXRvclBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjY3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQucGFydDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlZEFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5SZWZsZWN0aXZlSXRlbVByb3ZpZGVyQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIucmVzb3VyY2UuUmVzb3VyY2VJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5FeHRlbmRlZEltYWdlUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLnByZWZlcmVuY2VzLlByZWZlcmVuY2VzSGludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udWkuQWJzdHJhY3RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwucHJvdmlkZXIuTW9kZWxJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuVW1hSXRlbVByb3ZpZGVyQWRhcHRlckZhY3Rvcnk7Ci0KLS8qKgotICogQG1vZGlmaWVkCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFdQRERpYWdyYW1FZGl0b3JQbHVnaW4gZXh0ZW5kcyBBYnN0cmFjdFBsdWdpbiB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUQgPSAib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFByZWZlcmVuY2VzSGludCBESUFHUkFNX1BSRUZFUkVOQ0VTX0hJTlQgPSBuZXcgUHJlZmVyZW5jZXNIaW50KAotCQkJSUQpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIFdQRERpYWdyYW1FZGl0b3JQbHVnaW4gaW5zdGFuY2U7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5OwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRGlhZ3JhbURvY3VtZW50UHJvdmlkZXIgbXlEb2N1bWVudFByb3ZpZGVyOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBXUEREaWFncmFtRWRpdG9yUGx1Z2luKCkgewotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdGFydChjb250ZXh0KTsKLQkJaW5zdGFuY2UgPSB0aGlzOwotCQlQcmVmZXJlbmNlc0hpbnQucmVnaXN0ZXJQcmVmZXJlbmNlU3RvcmUoRElBR1JBTV9QUkVGRVJFTkNFU19ISU5ULAotCQkJCWdldFByZWZlcmVuY2VTdG9yZSgpKTsKLQkJYWRhcHRlckZhY3RvcnkgPSBjcmVhdGVBZGFwdGVyRmFjdG9yeSgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFkYXB0ZXJGYWN0b3J5LmRpc3Bvc2UoKTsKLQkJYWRhcHRlckZhY3RvcnkgPSBudWxsOwotCQlpbnN0YW5jZSA9IG51bGw7Ci0JCXN1cGVyLnN0b3AoY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgV1BERGlhZ3JhbUVkaXRvclBsdWdpbiBnZXRJbnN0YW5jZSgpIHsKLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBjcmVhdGVBZGFwdGVyRmFjdG9yeSgpIHsKLQkJTGlzdCBmYWN0b3JpZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZpbGxJdGVtUHJvdmlkZXJGYWN0b3JpZXMoZmFjdG9yaWVzKTsKLQkJcmV0dXJuIG5ldyBDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KGZhY3Rvcmllcyk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZpbGxJdGVtUHJvdmlkZXJGYWN0b3JpZXMoTGlzdCBmYWN0b3JpZXMpIHsKLQkJZmFjdG9yaWVzLmFkZChuZXcgTW9kZWxJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpKTsKLQkJZmFjdG9yaWVzLmFkZChuZXcgTW9kZWxJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpKTsKLQkJZmFjdG9yaWVzLmFkZChuZXcgVW1hSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSk7Ci0JCWZhY3Rvcmllcy5hZGQobmV3IFJlc291cmNlSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSk7Ci0JCWZhY3Rvcmllcy5hZGQobmV3IFJlZmxlY3RpdmVJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXJGYWN0b3J5IGdldEl0ZW1Qcm92aWRlcnNBZGFwdGVyRmFjdG9yeSgpIHsKLQkJcmV0dXJuIGFkYXB0ZXJGYWN0b3J5OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSW1hZ2VEZXNjcmlwdG9yIGdldEl0ZW1JbWFnZURlc2NyaXB0b3IoT2JqZWN0IGl0ZW0pIHsKLQkJSUl0ZW1MYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIgPSAoSUl0ZW1MYWJlbFByb3ZpZGVyKSBhZGFwdGVyRmFjdG9yeQotCQkJCS5hZGFwdChpdGVtLCBJSXRlbUxhYmVsUHJvdmlkZXIuY2xhc3MpOwotCQlpZiAobGFiZWxQcm92aWRlciAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gRXh0ZW5kZWRJbWFnZVJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKAotCQkJCQlsYWJlbFByb3ZpZGVyLmdldEltYWdlKGl0ZW0pKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFuIGltYWdlIGRlc2NyaXB0b3IgZm9yIHRoZSBpbWFnZSBmaWxlIGF0IHRoZSBnaXZlbgotCSAqIHBsdWctaW4gcmVsYXRpdmUgcGF0aC4KLQkgKgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAcGFyYW0gcGF0aCB0aGUgcGF0aAotCSAqIEByZXR1cm4gdGhlIGltYWdlIGRlc2NyaXB0b3IKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEltYWdlRGVzY3JpcHRvciBnZXRCdW5kbGVkSW1hZ2VEZXNjcmlwdG9yKFN0cmluZyBwYXRoKSB7Ci0JCXJldHVybiBBYnN0cmFjdFVJUGx1Z2luLmltYWdlRGVzY3JpcHRvckZyb21QbHVnaW4oSUQsIHBhdGgpOwotCX0KLQotCS8qKgotCSAqIFJlc3BlY3RzIGltYWdlcyByZXNpZGluZyBpbiBhbnkgcGx1Zy1pbi4gSWYgcGF0aCBpcyByZWxhdGl2ZSwKLQkgKiB0aGVuIHRoaXMgYnVuZGxlIGlzIGxvb2tlZCB1cCBmb3IgdGhlIGltYWdlLCBvdGhlcndpc2UsIGZvciBhYnNvbHV0ZSAKLQkgKiBwYXRoLCBmaXJzdCBzZWdtZW50IGlzIHRha2VuIGFzIGlkIG9mIHBsdWctaW4gd2l0aCBpbWFnZQotCSAqCi0JICogQGdlbmVyYXRlZAotCSAqIEBwYXJhbSBwYXRoIHRoZSBwYXRoIHRvIGltYWdlLCBlaXRoZXIgYWJzb2x1dGUgKHdpdGggcGx1Zy1pbiBpZCBhcyBmaXJzdCBzZWdtZW50KSwgb3IgcmVsYXRpdmUgZm9yIGJ1bmRsZWQgaW1hZ2VzCi0JICogQHJldHVybiB0aGUgaW1hZ2UgZGVzY3JpcHRvcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSW1hZ2VEZXNjcmlwdG9yIGZpbmRJbWFnZURlc2NyaXB0b3IoU3RyaW5nIHBhdGgpIHsKLQkJZmluYWwgSVBhdGggcCA9IG5ldyBQYXRoKHBhdGgpOwotCQlpZiAocC5pc0Fic29sdXRlKCkgJiYgcC5zZWdtZW50Q291bnQoKSA+IDEpIHsKLQkJCXJldHVybiBBYnN0cmFjdFVJUGx1Z2luLmltYWdlRGVzY3JpcHRvckZyb21QbHVnaW4ocC5zZWdtZW50KDApLCBwCi0JCQkJCS5yZW1vdmVGaXJzdFNlZ21lbnRzKDEpLm1ha2VBYnNvbHV0ZSgpLnRvU3RyaW5nKCkpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIGdldEJ1bmRsZWRJbWFnZURlc2NyaXB0b3IocC5tYWtlQWJzb2x1dGUoKS50b1N0cmluZygpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgc3RyaW5nIGZyb20gcGx1Zy1pbidzIHJlc291cmNlIGJ1bmRsZQotCSAqIEBtb2RpZmllZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXkpIHsKLQkJcmV0dXJuIFBsYXRmb3JtLmdldFJlc291cmNlU3RyaW5nKGdldEluc3RhbmNlKCkuZ2V0QnVuZGxlKCksICIlIiArIGtleSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFuIGltYWdlIGZvciB0aGUgaW1hZ2UgZmlsZSBhdCB0aGUgZ2l2ZW4gcGx1Zy1pbiByZWxhdGl2ZSBwYXRoLgotCSAqIENsaWVudCBkbyBub3QgbmVlZCB0byBkaXNwb3NlIHRoaXMgaW1hZ2UuIEltYWdlcyB3aWxsIGJlIGRpc3Bvc2VkIGF1dG9tYXRpY2FsbHkuCi0JICoKLQkgKiBAZ2VuZXJhdGVkCi0JICogQHBhcmFtIHBhdGggdGhlIHBhdGgKLQkgKiBAcmV0dXJuIGltYWdlIGluc3RhbmNlCi0JICovCi0JcHVibGljIEltYWdlIGdldEJ1bmRsZWRJbWFnZShTdHJpbmcgcGF0aCkgewotCQlJbWFnZSBpbWFnZSA9IGdldEltYWdlUmVnaXN0cnkoKS5nZXQocGF0aCk7Ci0JCWlmIChpbWFnZSA9PSBudWxsKSB7Ci0JCQlnZXRJbWFnZVJlZ2lzdHJ5KCkucHV0KHBhdGgsIGdldEJ1bmRsZWRJbWFnZURlc2NyaXB0b3IocGF0aCkpOwotCQkJaW1hZ2UgPSBnZXRJbWFnZVJlZ2lzdHJ5KCkuZ2V0KHBhdGgpOwotCQl9Ci0JCXJldHVybiBpbWFnZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERpYWdyYW1Eb2N1bWVudFByb3ZpZGVyIGdldERvY3VtZW50UHJvdmlkZXIoKSB7Ci0JCWlmIChteURvY3VtZW50UHJvdmlkZXIgPT0gbnVsbCkgewotCQkJbXlEb2N1bWVudFByb3ZpZGVyID0gbmV3IERpYWdyYW1Eb2N1bWVudFByb3ZpZGVyKCk7Ci0JCX0KLQkJcmV0dXJuIG15RG9jdW1lbnRQcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgbG9nRXJyb3IoU3RyaW5nIGVycm9yKSB7Ci0JCWxvZ0Vycm9yKGVycm9yLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gdGhyb3dhYmxlIGFjdHVhbCBlcnJvciBvciBudWxsIGNvdWxkIGJlIHBhc3NlZAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBsb2dFcnJvcihTdHJpbmcgZXJyb3IsIFRocm93YWJsZSB0aHJvd2FibGUpIHsKLQkJaWYgKGVycm9yID09IG51bGwgJiYgdGhyb3dhYmxlICE9IG51bGwpIHsKLQkJCWVycm9yID0gdGhyb3dhYmxlLmdldE1lc3NhZ2UoKTsKLQkJfQotCQlnZXRMb2coKS5sb2coCi0JCQkJbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBXUEREaWFncmFtRWRpdG9yUGx1Z2luLklELAotCQkJCQkJSVN0YXR1cy5PSywgZXJyb3IsIHRocm93YWJsZSkpOwotCQlkZWJ1ZyhlcnJvciwgdGhyb3dhYmxlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgbG9nSW5mbyhTdHJpbmcgbWVzc2FnZSkgewotCQlsb2dJbmZvKG1lc3NhZ2UsIG51bGwpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSB0aHJvd2FibGUgYWN0dWFsIGVycm9yIG9yIG51bGwgY291bGQgYmUgcGFzc2VkCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGxvZ0luZm8oU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSB0aHJvd2FibGUpIHsKLQkJaWYgKG1lc3NhZ2UgPT0gbnVsbCAmJiB0aHJvd2FibGUgIT0gbnVsbCkgewotCQkJbWVzc2FnZSA9IHRocm93YWJsZS5nZXRNZXNzYWdlKCk7Ci0JCX0KLQkJZ2V0TG9nKCkubG9nKAotCQkJCW5ldyBTdGF0dXMoSVN0YXR1cy5JTkZPLCBXUEREaWFncmFtRWRpdG9yUGx1Z2luLklELCBJU3RhdHVzLk9LLAotCQkJCQkJbWVzc2FnZSwgdGhyb3dhYmxlKSk7Ci0JCWRlYnVnKG1lc3NhZ2UsIHRocm93YWJsZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgdm9pZCBkZWJ1ZyhTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIHRocm93YWJsZSkgewotCQlpZiAoIWlzRGVidWdnaW5nKCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAobWVzc2FnZSAhPSBudWxsKSB7Ci0JCQlTeXN0ZW0uZXJyLnByaW50bG4obWVzc2FnZSk7Ci0JCX0KLQkJaWYgKHRocm93YWJsZSAhPSBudWxsKSB7Ci0JCQl0aHJvd2FibGUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvcGFydC9Xb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtRWRpdG9yLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL3BhcnQvV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbUVkaXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZjhjNWQ5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvcGFydC9Xb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtRWRpdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5wYXJ0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUm9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udWkuVVJJRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51aS5lZGl0b3JzLklNZXRob2RFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnBhbGV0dGUuUGFsZXR0ZVJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLm1hcmtlci5NYXJrZXJOYXZpZ2F0aW9uU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUucHJlZmVyZW5jZXMuUHJlZmVyZW5jZXNIaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVzb3VyY2VzLmVkaXRvci5kb2N1bWVudC5JRGlhZ3JhbURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVzb3VyY2VzLmVkaXRvci5kb2N1bWVudC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXNvdXJjZXMuZWRpdG9yLmRvY3VtZW50LklEb2N1bWVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVzb3VyY2VzLmVkaXRvci5wYXJ0cy5EaWFncmFtRG9jdW1lbnRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5FcnJvckRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklNZXNzYWdlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5NZXNzYWdlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvck1hdGNoaW5nU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRmlsZUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5TYXZlQXNEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaWRlLklHb3RvTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuRmlsZUVkaXRvcklucHV0OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFdvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW1FZGl0b3IgZXh0ZW5kcyBEaWFncmFtRG9jdW1lbnRFZGl0b3IKLQkJaW1wbGVtZW50cyBJR290b01hcmtlciwgSU1ldGhvZEVkaXRvciB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUQgPSAib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5wYXJ0LldvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW1FZGl0b3JJRCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbUVkaXRvcigpIHsKLQkJc3VwZXIodHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBQYWxldHRlUm9vdCBjcmVhdGVQYWxldHRlUm9vdChQYWxldHRlUm9vdCBleGlzdGluZ1BhbGV0dGVSb290KSB7Ci0JCVBhbGV0dGVSb290IHJvb3QgPSBzdXBlci5jcmVhdGVQYWxldHRlUm9vdChleGlzdGluZ1BhbGV0dGVSb290KTsKLQkJbmV3IERpYWdyYW1QYWxldHRlRmFjdG9yeSgpLmZpbGxQYWxldHRlKHJvb3QpOwotCQlyZXR1cm4gcm9vdDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0RG9jdW1lbnRQcm92aWRlcihJRWRpdG9ySW5wdXQgaW5wdXQpIHsKLQkJaWYgKGlucHV0IGluc3RhbmNlb2YgSUZpbGVFZGl0b3JJbnB1dAotCQkJCXx8IGlucHV0IGluc3RhbmNlb2YgVVJJRWRpdG9ySW5wdXQpIHsKLQkJCXNldERvY3VtZW50UHJvdmlkZXIoV1BERGlhZ3JhbUVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpCi0JCQkJCS5nZXREb2N1bWVudFByb3ZpZGVyKCkpOwotCQl9IGVsc2UgewotCQkJc3VwZXIuc2V0RG9jdW1lbnRQcm92aWRlcihpbnB1dCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZ290b01hcmtlcihJTWFya2VyIG1hcmtlcikgewotCQlNYXJrZXJOYXZpZ2F0aW9uU2VydmljZS5nZXRJbnN0YW5jZSgpLmdvdG9NYXJrZXIodGhpcywgbWFya2VyKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTYXZlQXNBbGxvd2VkKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZG9TYXZlQXMoKSB7Ci0JCXBlcmZvcm1TYXZlQXMobmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1TYXZlQXMoSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzc01vbml0b3IpIHsKLQkJU2hlbGwgc2hlbGwgPSBnZXRTaXRlKCkuZ2V0U2hlbGwoKTsKLQkJSUVkaXRvcklucHV0IGlucHV0ID0gZ2V0RWRpdG9ySW5wdXQoKTsKLQkJU2F2ZUFzRGlhbG9nIGRpYWxvZyA9IG5ldyBTYXZlQXNEaWFsb2coc2hlbGwpOwotCQlJRmlsZSBvcmlnaW5hbCA9IGlucHV0IGluc3RhbmNlb2YgSUZpbGVFZGl0b3JJbnB1dCA/ICgoSUZpbGVFZGl0b3JJbnB1dCkgaW5wdXQpCi0JCQkJLmdldEZpbGUoKQotCQkJCTogbnVsbDsKLQkJaWYgKG9yaWdpbmFsICE9IG51bGwpIHsKLQkJCWRpYWxvZy5zZXRPcmlnaW5hbEZpbGUob3JpZ2luYWwpOwotCQl9Ci0JCWRpYWxvZy5jcmVhdGUoKTsKLQkJSURvY3VtZW50UHJvdmlkZXIgcHJvdmlkZXIgPSBnZXREb2N1bWVudFByb3ZpZGVyKCk7Ci0JCWlmIChwcm92aWRlciA9PSBudWxsKSB7Ci0JCQkvLyBlZGl0b3IgaGFzIGJlZW4gcHJvZ3JhbW1hdGljYWxseSBjbG9zZWQgd2hpbGUgdGhlIGRpYWxvZyB3YXMgb3BlbgotCQkJcmV0dXJuOwotCQl9Ci0JCWlmIChwcm92aWRlci5pc0RlbGV0ZWQoaW5wdXQpICYmIG9yaWdpbmFsICE9IG51bGwpIHsKLQkJCVN0cmluZyBtZXNzYWdlID0gTkxTLmJpbmQoCi0JCQkJCSJUaGUgb3JpZ2luYWwgZmlsZSAnJ3swfScnIGhhcyBiZWVuIGRlbGV0ZWQuIiwgb3JpZ2luYWwKLQkJCQkJCQkuZ2V0TmFtZSgpKTsKLQkJCWRpYWxvZy5zZXRFcnJvck1lc3NhZ2UobnVsbCk7Ci0JCQlkaWFsb2cuc2V0TWVzc2FnZShtZXNzYWdlLCBJTWVzc2FnZVByb3ZpZGVyLldBUk5JTkcpOwotCQl9Ci0JCWlmIChkaWFsb2cub3BlbigpID09IFdpbmRvdy5DQU5DRUwpIHsKLQkJCWlmIChwcm9ncmVzc01vbml0b3IgIT0gbnVsbCkgewotCQkJCXByb2dyZXNzTW9uaXRvci5zZXRDYW5jZWxlZCh0cnVlKTsKLQkJCX0KLQkJCXJldHVybjsKLQkJfQotCQlJUGF0aCBmaWxlUGF0aCA9IGRpYWxvZy5nZXRSZXN1bHQoKTsKLQkJaWYgKGZpbGVQYXRoID09IG51bGwpIHsKLQkJCWlmIChwcm9ncmVzc01vbml0b3IgIT0gbnVsbCkgewotCQkJCXByb2dyZXNzTW9uaXRvci5zZXRDYW5jZWxlZCh0cnVlKTsKLQkJCX0KLQkJCXJldHVybjsKLQkJfQotCQlJV29ya3NwYWNlUm9vdCB3b3Jrc3BhY2VSb290ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKLQkJSUZpbGUgZmlsZSA9IHdvcmtzcGFjZVJvb3QuZ2V0RmlsZShmaWxlUGF0aCk7Ci0JCWZpbmFsIElFZGl0b3JJbnB1dCBuZXdJbnB1dCA9IG5ldyBGaWxlRWRpdG9ySW5wdXQoZmlsZSk7Ci0JCS8vIENoZWNrIGlmIHRoZSBlZGl0b3IgaXMgYWxyZWFkeSBvcGVuCi0JCUlFZGl0b3JNYXRjaGluZ1N0cmF0ZWd5IG1hdGNoaW5nU3RyYXRlZ3kgPSBnZXRFZGl0b3JEZXNjcmlwdG9yKCkKLQkJCQkuZ2V0RWRpdG9yTWF0Y2hpbmdTdHJhdGVneSgpOwotCQlJRWRpdG9yUmVmZXJlbmNlW10gZWRpdG9yUmVmcyA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkKLQkJCQkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0QWN0aXZlUGFnZSgpCi0JCQkJLmdldEVkaXRvclJlZmVyZW5jZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlZGl0b3JSZWZzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAobWF0Y2hpbmdTdHJhdGVneS5tYXRjaGVzKGVkaXRvclJlZnNbaV0sIG5ld0lucHV0KSkgewotCQkJCU1lc3NhZ2VEaWFsb2cKLQkJCQkJCS5vcGVuV2FybmluZyhzaGVsbCwgIlByb2JsZW0gRHVyaW5nIFNhdmUgQXMuLi4iLAotCQkJCQkJCQkiU2F2ZSBjb3VsZCBub3QgYmUgY29tcGxldGVkLiBUYXJnZXQgZmlsZSBpcyBhbHJlYWR5IG9wZW4gaW4gYW5vdGhlciBlZGl0b3IuIik7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCWJvb2xlYW4gc3VjY2VzcyA9IGZhbHNlOwotCQl0cnkgewotCQkJcHJvdmlkZXIuYWJvdXRUb0NoYW5nZShuZXdJbnB1dCk7Ci0JCQlnZXREb2N1bWVudFByb3ZpZGVyKG5ld0lucHV0KS5zYXZlRG9jdW1lbnQocHJvZ3Jlc3NNb25pdG9yLAotCQkJCQluZXdJbnB1dCwKLQkJCQkJZ2V0RG9jdW1lbnRQcm92aWRlcigpLmdldERvY3VtZW50KGdldEVkaXRvcklucHV0KCkpLCB0cnVlKTsKLQkJCXN1Y2Nlc3MgPSB0cnVlOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIHgpIHsKLQkJCUlTdGF0dXMgc3RhdHVzID0geC5nZXRTdGF0dXMoKTsKLQkJCWlmIChzdGF0dXMgPT0gbnVsbCB8fCBzdGF0dXMuZ2V0U2V2ZXJpdHkoKSAhPSBJU3RhdHVzLkNBTkNFTCkgewotCQkJCUVycm9yRGlhbG9nLm9wZW5FcnJvcihzaGVsbCwgIlNhdmUgUHJvYmxlbXMiLAotCQkJCQkJIkNvdWxkIG5vdCBzYXZlIGZpbGUuIiwgeC5nZXRTdGF0dXMoKSk7Ci0JCQl9Ci0JCX0gZmluYWxseSB7Ci0JCQlwcm92aWRlci5jaGFuZ2VkKG5ld0lucHV0KTsKLQkJCWlmIChzdWNjZXNzKSB7Ci0JCQkJc2V0SW5wdXQobmV3SW5wdXQpOwotCQkJfQotCQl9Ci0JCWlmIChwcm9ncmVzc01vbml0b3IgIT0gbnVsbCkgewotCQkJcHJvZ3Jlc3NNb25pdG9yLnNldENhbmNlbGVkKCFzdWNjZXNzKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUHJlZmVyZW5jZXNIaW50IGdldFByZWZlcmVuY2VzSGludCgpIHsKLQkJcmV0dXJuIFdQRERpYWdyYW1FZGl0b3JQbHVnaW4uRElBR1JBTV9QUkVGRVJFTkNFU19ISU5UOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENvbnRyaWJ1dG9ySWQoKSB7Ci0JCXJldHVybiBXUEREaWFncmFtRWRpdG9yUGx1Z2luLklEOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSURvY3VtZW50UHJvdmlkZXIgZ2V0RG9jdW1lbnRQcm92aWRlcihJRWRpdG9ySW5wdXQgaW5wdXQpIHsKLQkJaWYgKGlucHV0IGluc3RhbmNlb2YgSUZpbGVFZGl0b3JJbnB1dAotCQkJCXx8IGlucHV0IGluc3RhbmNlb2YgVVJJRWRpdG9ySW5wdXQpIHsKLQkJCXJldHVybiBXUEREaWFncmFtRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0RG9jdW1lbnRQcm92aWRlcigpOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXREb2N1bWVudFByb3ZpZGVyKGlucHV0KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIGdldEVkaXRpbmdEb21haW4oKSB7Ci0JCUlEb2N1bWVudCBkb2N1bWVudCA9IGdldEVkaXRvcklucHV0KCkgIT0gbnVsbCA/IGdldERvY3VtZW50UHJvdmlkZXIoKQotCQkJCS5nZXREb2N1bWVudChnZXRFZGl0b3JJbnB1dCgpKSA6IG51bGw7Ci0JCWlmIChkb2N1bWVudCBpbnN0YW5jZW9mIElEaWFncmFtRG9jdW1lbnQpIHsKLQkJCXJldHVybiAoKElEaWFncmFtRG9jdW1lbnQpIGRvY3VtZW50KS5nZXRFZGl0aW5nRG9tYWluKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldEVkaXRpbmdEb21haW4oKTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL3ByZWZlcmVuY2VzL0RpYWdyYW1BcHBlYXJhbmNlUHJlZmVyZW5jZVBhZ2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvcHJlZmVyZW5jZXMvRGlhZ3JhbUFwcGVhcmFuY2VQcmVmZXJlbmNlUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OWY2M2JiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvcHJlZmVyZW5jZXMvRGlhZ3JhbUFwcGVhcmFuY2VQcmVmZXJlbmNlUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5wcmVmZXJlbmNlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQucGFydC5XUEREaWFncmFtRWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucHJlZmVyZW5jZXMuQXBwZWFyYW5jZVByZWZlcmVuY2VQYWdlOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERpYWdyYW1BcHBlYXJhbmNlUHJlZmVyZW5jZVBhZ2UgZXh0ZW5kcyBBcHBlYXJhbmNlUHJlZmVyZW5jZVBhZ2UgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEaWFncmFtQXBwZWFyYW5jZVByZWZlcmVuY2VQYWdlKCkgewotCQlzZXRQcmVmZXJlbmNlU3RvcmUoV1BERGlhZ3JhbUVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpCi0JCQkJLmdldFByZWZlcmVuY2VTdG9yZSgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL3ByZWZlcmVuY2VzL0RpYWdyYW1Db25uZWN0aW9uc1ByZWZlcmVuY2VQYWdlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL3ByZWZlcmVuY2VzL0RpYWdyYW1Db25uZWN0aW9uc1ByZWZlcmVuY2VQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2MTc5ZmMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9wcmVmZXJlbmNlcy9EaWFncmFtQ29ubmVjdGlvbnNQcmVmZXJlbmNlUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5wcmVmZXJlbmNlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQucGFydC5XUEREaWFncmFtRWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucHJlZmVyZW5jZXMuQ29ubmVjdGlvbnNQcmVmZXJlbmNlUGFnZTsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEaWFncmFtQ29ubmVjdGlvbnNQcmVmZXJlbmNlUGFnZSBleHRlbmRzIENvbm5lY3Rpb25zUHJlZmVyZW5jZVBhZ2UgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEaWFncmFtQ29ubmVjdGlvbnNQcmVmZXJlbmNlUGFnZSgpIHsKLQkJc2V0UHJlZmVyZW5jZVN0b3JlKFdQRERpYWdyYW1FZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKQotCQkJCS5nZXRQcmVmZXJlbmNlU3RvcmUoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9wcmVmZXJlbmNlcy9EaWFncmFtR2VuZXJhbFByZWZlcmVuY2VQYWdlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL3ByZWZlcmVuY2VzL0RpYWdyYW1HZW5lcmFsUHJlZmVyZW5jZVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTQxZWNmNy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL3ByZWZlcmVuY2VzL0RpYWdyYW1HZW5lcmFsUHJlZmVyZW5jZVBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQucHJlZmVyZW5jZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLnBhcnQuV1BERGlhZ3JhbUVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnByZWZlcmVuY2VzLkRpYWdyYW1zUHJlZmVyZW5jZVBhZ2U7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRGlhZ3JhbUdlbmVyYWxQcmVmZXJlbmNlUGFnZSBleHRlbmRzIERpYWdyYW1zUHJlZmVyZW5jZVBhZ2UgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEaWFncmFtR2VuZXJhbFByZWZlcmVuY2VQYWdlKCkgewotCQlzZXRQcmVmZXJlbmNlU3RvcmUoV1BERGlhZ3JhbUVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpCi0JCQkJLmdldFByZWZlcmVuY2VTdG9yZSgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL3ByZWZlcmVuY2VzL0RpYWdyYW1QcmVmZXJlbmNlSW5pdGlhbGl6ZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvcHJlZmVyZW5jZXMvRGlhZ3JhbVByZWZlcmVuY2VJbml0aWFsaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MGMzNjczLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvcHJlZmVyZW5jZXMvRGlhZ3JhbVByZWZlcmVuY2VJbml0aWFsaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5wcmVmZXJlbmNlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5BYnN0cmFjdFByZWZlcmVuY2VJbml0aWFsaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnV0aWwuRGlhZ3JhbUNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQucGFydC5XUEREaWFncmFtRWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEaWFncmFtUHJlZmVyZW5jZUluaXRpYWxpemVyIGV4dGVuZHMgQWJzdHJhY3RQcmVmZXJlbmNlSW5pdGlhbGl6ZXIgewotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZURlZmF1bHRQcmVmZXJlbmNlcygpIHsKLQkJSVByZWZlcmVuY2VTdG9yZSBzdG9yZSA9IGdldFByZWZlcmVuY2VTdG9yZSgpOwotCQlEaWFncmFtUHJpbnRpbmdQcmVmZXJlbmNlUGFnZS5pbml0RGVmYXVsdHMoc3RvcmUpOwotCQlEaWFncmFtR2VuZXJhbFByZWZlcmVuY2VQYWdlLmluaXREZWZhdWx0cyhzdG9yZSk7Ci0JCURpYWdyYW1BcHBlYXJhbmNlUHJlZmVyZW5jZVBhZ2UuaW5pdERlZmF1bHRzKHN0b3JlKTsKLQkJRGlhZ3JhbUNvbm5lY3Rpb25zUHJlZmVyZW5jZVBhZ2UuaW5pdERlZmF1bHRzKHN0b3JlKTsKLQkJRGlhZ3JhbVJ1bGVyc0FuZEdyaWRQcmVmZXJlbmNlUGFnZS5pbml0RGVmYXVsdHMoc3RvcmUpOwotCQlEaWFncmFtQ29yZVV0aWwuc2V0RGVmYXVsdEZvbnRQcmVmZXJlbmNlKGdldFByZWZlcmVuY2VTdG9yZSgpKTsKLQkJRGlhZ3JhbUNvcmVVdGlsLnNldERlZmF1bHRMaW5lU3R5bGUoZ2V0UHJlZmVyZW5jZVN0b3JlKCkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSVByZWZlcmVuY2VTdG9yZSBnZXRQcmVmZXJlbmNlU3RvcmUoKSB7Ci0JCXJldHVybiBXUEREaWFncmFtRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9wcmVmZXJlbmNlcy9EaWFncmFtUHJpbnRpbmdQcmVmZXJlbmNlUGFnZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9wcmVmZXJlbmNlcy9EaWFncmFtUHJpbnRpbmdQcmVmZXJlbmNlUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OWRlMjJkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvcHJlZmVyZW5jZXMvRGlhZ3JhbVByaW50aW5nUHJlZmVyZW5jZVBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQucHJlZmVyZW5jZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLnBhcnQuV1BERGlhZ3JhbUVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnByZWZlcmVuY2VzLlByaW50aW5nUHJlZmVyZW5jZVBhZ2U7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRGlhZ3JhbVByaW50aW5nUHJlZmVyZW5jZVBhZ2UgZXh0ZW5kcyBQcmludGluZ1ByZWZlcmVuY2VQYWdlIHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRGlhZ3JhbVByaW50aW5nUHJlZmVyZW5jZVBhZ2UoKSB7Ci0JCXNldFByZWZlcmVuY2VTdG9yZShXUEREaWFncmFtRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkKLQkJCQkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvcHJlZmVyZW5jZXMvRGlhZ3JhbVJ1bGVyc0FuZEdyaWRQcmVmZXJlbmNlUGFnZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9wcmVmZXJlbmNlcy9EaWFncmFtUnVsZXJzQW5kR3JpZFByZWZlcmVuY2VQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyODE0ZWQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9wcmVmZXJlbmNlcy9EaWFncmFtUnVsZXJzQW5kR3JpZFByZWZlcmVuY2VQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLnByZWZlcmVuY2VzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5wYXJ0LldQRERpYWdyYW1FZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wcmVmZXJlbmNlcy5SdWxlckdyaWRQcmVmZXJlbmNlUGFnZTsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEaWFncmFtUnVsZXJzQW5kR3JpZFByZWZlcmVuY2VQYWdlIGV4dGVuZHMgUnVsZXJHcmlkUHJlZmVyZW5jZVBhZ2UgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEaWFncmFtUnVsZXJzQW5kR3JpZFByZWZlcmVuY2VQYWdlKCkgewotCQlzZXRQcmVmZXJlbmNlU3RvcmUoV1BERGlhZ3JhbUVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpCi0JCQkJLmdldFByZWZlcmVuY2VTdG9yZSgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL3Byb3ZpZGVycy9EaWFncmFtQWJzdHJhY3RQYXJzZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvcHJvdmlkZXJzL0RpYWdyYW1BYnN0cmFjdFBhcnNlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhY2QyZTFlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvcHJvdmlkZXJzL0RpYWdyYW1BYnN0cmFjdFBhcnNlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzk5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQucHJvdmlkZXJzOwotCi1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci1pbXBvcnQgamF2YS50ZXh0LlBhcnNlUG9zaXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzaWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVEYXRhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUVudW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVFbnVtTGl0ZXJhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi5jb3JlLmNvbW1hbmQuSUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUuY29tbWFuZC5VbmV4ZWN1dGFibGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuSVBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLklQYXJzZXJFZGl0U3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuUGFyc2VyRWRpdFN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLmNvbW1hbmRzLlNldFZhbHVlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLlNldFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZW50QXNzaXN0UHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQucGFydC5XUEREaWFncmFtRWRpdG9yUGx1Z2luOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIERpYWdyYW1BYnN0cmFjdFBhcnNlciBpbXBsZW1lbnRzIElQYXJzZXIgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgU3RyaW5nIHZpZXdQYXR0ZXJuOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgTWVzc2FnZUZvcm1hdCB2aWV3UHJvY2Vzc29yOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgU3RyaW5nIGVkaXRQYXR0ZXJuOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgTWVzc2FnZUZvcm1hdCBlZGl0UHJvY2Vzc29yOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Vmlld1BhdHRlcm4oKSB7Ci0JCXJldHVybiB2aWV3UGF0dGVybjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE1lc3NhZ2VGb3JtYXQgZ2V0Vmlld1Byb2Nlc3NvcigpIHsKLQkJcmV0dXJuIHZpZXdQcm9jZXNzb3I7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZpZXdQYXR0ZXJuKFN0cmluZyB2aWV3UGF0dGVybikgewotCQl0aGlzLnZpZXdQYXR0ZXJuID0gdmlld1BhdHRlcm47Ci0JCXZpZXdQcm9jZXNzb3IgPSBjcmVhdGVWaWV3UHJvY2Vzc29yKHZpZXdQYXR0ZXJuKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE1lc3NhZ2VGb3JtYXQgY3JlYXRlVmlld1Byb2Nlc3NvcihTdHJpbmcgdmlld1BhdHRlcm4pIHsKLQkJcmV0dXJuIG5ldyBNZXNzYWdlRm9ybWF0KHZpZXdQYXR0ZXJuKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRFZGl0UGF0dGVybigpIHsKLQkJcmV0dXJuIGVkaXRQYXR0ZXJuOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTWVzc2FnZUZvcm1hdCBnZXRFZGl0UHJvY2Vzc29yKCkgewotCQlyZXR1cm4gZWRpdFByb2Nlc3NvcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RWRpdFBhdHRlcm4oU3RyaW5nIGVkaXRQYXR0ZXJuKSB7Ci0JCXRoaXMuZWRpdFBhdHRlcm4gPSBlZGl0UGF0dGVybjsKLQkJZWRpdFByb2Nlc3NvciA9IGNyZWF0ZUVkaXRQcm9jZXNzb3IoZWRpdFBhdHRlcm4pOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTWVzc2FnZUZvcm1hdCBjcmVhdGVFZGl0UHJvY2Vzc29yKFN0cmluZyBlZGl0UGF0dGVybikgewotCQlyZXR1cm4gbmV3IE1lc3NhZ2VGb3JtYXQoZWRpdFBhdHRlcm4pOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFByaW50U3RyaW5nKElBZGFwdGFibGUgYWRhcHRlciwgaW50IGZsYWdzKSB7Ci0JCXJldHVybiBnZXRTdHJpbmdCeVBhdHRlcm4oYWRhcHRlciwgZmxhZ3MsIGdldFZpZXdQYXR0ZXJuKCksCi0JCQkJZ2V0Vmlld1Byb2Nlc3NvcigpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRFZGl0U3RyaW5nKElBZGFwdGFibGUgYWRhcHRlciwgaW50IGZsYWdzKSB7Ci0JCXJldHVybiBnZXRTdHJpbmdCeVBhdHRlcm4oYWRhcHRlciwgZmxhZ3MsIGdldEVkaXRQYXR0ZXJuKCksCi0JCQkJZ2V0RWRpdFByb2Nlc3NvcigpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXRTdHJpbmdCeVBhdHRlcm4oSUFkYXB0YWJsZSBhZGFwdGVyLCBpbnQgZmxhZ3MsCi0JCQlTdHJpbmcgcGF0dGVybiwgTWVzc2FnZUZvcm1hdCBwcm9jZXNzb3IpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJUGFyc2VyRWRpdFN0YXR1cyBpc1ZhbGlkRWRpdFN0cmluZyhJQWRhcHRhYmxlIGVsZW1lbnQsCi0JCQlTdHJpbmcgZWRpdFN0cmluZykgewotCQlQYXJzZVBvc2l0aW9uIHBvcyA9IG5ldyBQYXJzZVBvc2l0aW9uKDApOwotCQlPYmplY3RbXSB2YWx1ZXMgPSBnZXRFZGl0UHJvY2Vzc29yKCkucGFyc2UoZWRpdFN0cmluZywgcG9zKTsKLQkJaWYgKHZhbHVlcyA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbmV3IFBhcnNlckVkaXRTdGF0dXMoV1BERGlhZ3JhbUVkaXRvclBsdWdpbi5JRCwKLQkJCQkJSVBhcnNlckVkaXRTdGF0dXMuVU5FRElUQUJMRSwgIkludmFsaWQgaW5wdXQgYXQgIgotCQkJCQkJCSsgcG9zLmdldEVycm9ySW5kZXgoKSk7Ci0JCX0KLQkJcmV0dXJuIHZhbGlkYXRlTmV3VmFsdWVzKHZhbHVlcyk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJUGFyc2VyRWRpdFN0YXR1cyB2YWxpZGF0ZU5ld1ZhbHVlcyhPYmplY3RbXSB2YWx1ZXMpIHsKLQkJcmV0dXJuIFBhcnNlckVkaXRTdGF0dXMuRURJVEFCTEVfU1RBVFVTOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSUNvbW1hbmQgZ2V0UGFyc2VDb21tYW5kKElBZGFwdGFibGUgYWRhcHRlciwgU3RyaW5nIG5ld1N0cmluZywKLQkJCWludCBmbGFncykgewotCQlPYmplY3RbXSB2YWx1ZXMgPSBnZXRFZGl0UHJvY2Vzc29yKCkucGFyc2UobmV3U3RyaW5nLAotCQkJCW5ldyBQYXJzZVBvc2l0aW9uKDApKTsKLQkJaWYgKHZhbHVlcyA9PSBudWxsCi0JCQkJfHwgdmFsaWRhdGVOZXdWYWx1ZXModmFsdWVzKS5nZXRDb2RlKCkgIT0gSVBhcnNlckVkaXRTdGF0dXMuRURJVEFCTEUpIHsKLQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQl9Ci0JCXJldHVybiBnZXRQYXJzZUNvbW1hbmQoYWRhcHRlciwgdmFsdWVzKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IElDb21tYW5kIGdldFBhcnNlQ29tbWFuZChJQWRhcHRhYmxlIGFkYXB0ZXIsCi0JCQlPYmplY3RbXSB2YWx1ZXMpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJQ29udGVudEFzc2lzdFByb2Nlc3NvciBnZXRDb21wbGV0aW9uUHJvY2Vzc29yKElBZGFwdGFibGUgZWxlbWVudCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElDb21tYW5kIGdldE1vZGlmaWNhdGlvbkNvbW1hbmQoRU9iamVjdCBlbGVtZW50LAotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIE9iamVjdCB2YWx1ZSkgewotCQl2YWx1ZSA9IGdldFZhbGlkTmV3VmFsdWUoZmVhdHVyZSwgdmFsdWUpOwotCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBJbnZhbGlkVmFsdWUpIHsKLQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQl9Ci0JCVNldFJlcXVlc3QgcmVxdWVzdCA9IG5ldyBTZXRSZXF1ZXN0KGVsZW1lbnQsIGZlYXR1cmUsIHZhbHVlKTsKLQkJcmV0dXJuIG5ldyBTZXRWYWx1ZUNvbW1hbmQocmVxdWVzdCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZ2V0VmFsaWRWYWx1ZShFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgT2JqZWN0IHZhbHVlKSB7Ci0JCUVDbGFzc2lmaWVyIHR5cGUgPSBmZWF0dXJlLmdldEVUeXBlKCk7Ci0JCWlmICh0eXBlIGluc3RhbmNlb2YgRURhdGFUeXBlKSB7Ci0JCQlDbGFzcyBpQ2xhc3MgPSB0eXBlLmdldEluc3RhbmNlQ2xhc3MoKTsKLQkJCWlmIChTdHJpbmcuY2xhc3MuZXF1YWxzKGlDbGFzcykpIHsKLQkJCQlpZiAodmFsdWUgPT0gbnVsbCkgewotCQkJCQl2YWx1ZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiB2YWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBnZXRWYWxpZE5ld1ZhbHVlKEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBPYmplY3QgdmFsdWUpIHsKLQkJRUNsYXNzaWZpZXIgdHlwZSA9IGZlYXR1cmUuZ2V0RVR5cGUoKTsKLQkJaWYgKHR5cGUgaW5zdGFuY2VvZiBFRGF0YVR5cGUpIHsKLQkJCUNsYXNzIGlDbGFzcyA9IHR5cGUuZ2V0SW5zdGFuY2VDbGFzcygpOwotCQkJaWYgKEJvb2xlYW4uVFlQRS5lcXVhbHMoaUNsYXNzKSkgewotCQkJCWlmICh2YWx1ZSBpbnN0YW5jZW9mIEJvb2xlYW4pIHsKLQkJCQkJLy8gb2sKLQkJCQl9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0JCQkJCXZhbHVlID0gQm9vbGVhbi52YWx1ZU9mKChTdHJpbmcpIHZhbHVlKTsKLQkJCQl9IGVsc2UgewotCQkJCQl2YWx1ZSA9IG5ldyBJbnZhbGlkVmFsdWUoCi0JCQkJCQkJIlZhbHVlIG9mIHR5cGUgQm9vbGVhbiBpcyBleHBlY3RlZCIpOwotCQkJCX0KLQkJCX0gZWxzZSBpZiAoQ2hhcmFjdGVyLlRZUEUuZXF1YWxzKGlDbGFzcykpIHsKLQkJCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBDaGFyYWN0ZXIpIHsKLQkJCQkJLy8gb2sKLQkJCQl9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0JCQkJCVN0cmluZyBzID0gKFN0cmluZykgdmFsdWU7Ci0JCQkJCWlmIChzLmxlbmd0aCgpID09IDApIHsKLQkJCQkJCXZhbHVlID0gbnVsbDsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCXZhbHVlID0gbmV3IENoYXJhY3RlcihzLmNoYXJBdCgwKSk7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQl2YWx1ZSA9IG5ldyBJbnZhbGlkVmFsdWUoCi0JCQkJCQkJIlZhbHVlIG9mIHR5cGUgQ2hhcmFjdGVyIGlzIGV4cGVjdGVkIik7Ci0JCQkJfQotCQkJfSBlbHNlIGlmIChCeXRlLlRZUEUuZXF1YWxzKGlDbGFzcykpIHsKLQkJCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBCeXRlKSB7Ci0JCQkJCS8vIG9rCi0JCQkJfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIE51bWJlcikgewotCQkJCQl2YWx1ZSA9IG5ldyBCeXRlKCgoTnVtYmVyKSB2YWx1ZSkuYnl0ZVZhbHVlKCkpOwotCQkJCX0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpIHsKLQkJCQkJU3RyaW5nIHMgPSAoU3RyaW5nKSB2YWx1ZTsKLQkJCQkJaWYgKHMubGVuZ3RoKCkgPT0gMCkgewotCQkJCQkJdmFsdWUgPSBudWxsOwotCQkJCQl9IGVsc2UgewotCQkJCQkJdHJ5IHsKLQkJCQkJCQl2YWx1ZSA9IEJ5dGUudmFsdWVPZihzKTsKLQkJCQkJCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBuZmUpIHsKLQkJCQkJCQl2YWx1ZSA9IG5ldyBJbnZhbGlkVmFsdWUoCi0JCQkJCQkJCQkiU3RyaW5nIHZhbHVlIGRvZXMgbm90IGNvbnZlcnQgdG8gQnl0ZSB2YWx1ZSIpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJdmFsdWUgPSBuZXcgSW52YWxpZFZhbHVlKCJWYWx1ZSBvZiB0eXBlIEJ5dGUgaXMgZXhwZWN0ZWQiKTsKLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKFNob3J0LlRZUEUuZXF1YWxzKGlDbGFzcykpIHsKLQkJCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBTaG9ydCkgewotCQkJCQkvLyBvawotCQkJCX0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBOdW1iZXIpIHsKLQkJCQkJdmFsdWUgPSBuZXcgU2hvcnQoKChOdW1iZXIpIHZhbHVlKS5zaG9ydFZhbHVlKCkpOwotCQkJCX0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpIHsKLQkJCQkJU3RyaW5nIHMgPSAoU3RyaW5nKSB2YWx1ZTsKLQkJCQkJaWYgKHMubGVuZ3RoKCkgPT0gMCkgewotCQkJCQkJdmFsdWUgPSBudWxsOwotCQkJCQl9IGVsc2UgewotCQkJCQkJdHJ5IHsKLQkJCQkJCQl2YWx1ZSA9IFNob3J0LnZhbHVlT2Yocyk7Ci0JCQkJCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gbmZlKSB7Ci0JCQkJCQkJdmFsdWUgPSBuZXcgSW52YWxpZFZhbHVlKAotCQkJCQkJCQkJIlN0cmluZyB2YWx1ZSBkb2VzIG5vdCBjb252ZXJ0IHRvIFNob3J0IHZhbHVlIik7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQl2YWx1ZSA9IG5ldyBJbnZhbGlkVmFsdWUoIlZhbHVlIG9mIHR5cGUgU2hvcnQgaXMgZXhwZWN0ZWQiKTsKLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKEludGVnZXIuVFlQRS5lcXVhbHMoaUNsYXNzKSkgewotCQkJCWlmICh2YWx1ZSBpbnN0YW5jZW9mIEludGVnZXIpIHsKLQkJCQkJLy8gb2sKLQkJCQl9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgTnVtYmVyKSB7Ci0JCQkJCXZhbHVlID0gbmV3IEludGVnZXIoKChOdW1iZXIpIHZhbHVlKS5pbnRWYWx1ZSgpKTsKLQkJCQl9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0JCQkJCVN0cmluZyBzID0gKFN0cmluZykgdmFsdWU7Ci0JCQkJCWlmIChzLmxlbmd0aCgpID09IDApIHsKLQkJCQkJCXZhbHVlID0gbnVsbDsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJdmFsdWUgPSBJbnRlZ2VyLnZhbHVlT2Yocyk7Ci0JCQkJCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gbmZlKSB7Ci0JCQkJCQkJdmFsdWUgPSBuZXcgSW52YWxpZFZhbHVlKAotCQkJCQkJCQkJIlN0cmluZyB2YWx1ZSBkb2VzIG5vdCBjb252ZXJ0IHRvIEludGVnZXIgdmFsdWUiKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCXZhbHVlID0gbmV3IEludmFsaWRWYWx1ZSgKLQkJCQkJCQkiVmFsdWUgb2YgdHlwZSBJbnRlZ2VyIGlzIGV4cGVjdGVkIik7Ci0JCQkJfQotCQkJfSBlbHNlIGlmIChMb25nLlRZUEUuZXF1YWxzKGlDbGFzcykpIHsKLQkJCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBMb25nKSB7Ci0JCQkJCS8vIG9rCi0JCQkJfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIE51bWJlcikgewotCQkJCQl2YWx1ZSA9IG5ldyBMb25nKCgoTnVtYmVyKSB2YWx1ZSkubG9uZ1ZhbHVlKCkpOwotCQkJCX0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpIHsKLQkJCQkJU3RyaW5nIHMgPSAoU3RyaW5nKSB2YWx1ZTsKLQkJCQkJaWYgKHMubGVuZ3RoKCkgPT0gMCkgewotCQkJCQkJdmFsdWUgPSBudWxsOwotCQkJCQl9IGVsc2UgewotCQkJCQkJdHJ5IHsKLQkJCQkJCQl2YWx1ZSA9IExvbmcudmFsdWVPZihzKTsKLQkJCQkJCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBuZmUpIHsKLQkJCQkJCQl2YWx1ZSA9IG5ldyBJbnZhbGlkVmFsdWUoCi0JCQkJCQkJCQkiU3RyaW5nIHZhbHVlIGRvZXMgbm90IGNvbnZlcnQgdG8gTG9uZyB2YWx1ZSIpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJdmFsdWUgPSBuZXcgSW52YWxpZFZhbHVlKCJWYWx1ZSBvZiB0eXBlIExvbmcgaXMgZXhwZWN0ZWQiKTsKLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKEZsb2F0LlRZUEUuZXF1YWxzKGlDbGFzcykpIHsKLQkJCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBGbG9hdCkgewotCQkJCQkvLyBvawotCQkJCX0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBOdW1iZXIpIHsKLQkJCQkJdmFsdWUgPSBuZXcgRmxvYXQoKChOdW1iZXIpIHZhbHVlKS5mbG9hdFZhbHVlKCkpOwotCQkJCX0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpIHsKLQkJCQkJU3RyaW5nIHMgPSAoU3RyaW5nKSB2YWx1ZTsKLQkJCQkJaWYgKHMubGVuZ3RoKCkgPT0gMCkgewotCQkJCQkJdmFsdWUgPSBudWxsOwotCQkJCQl9IGVsc2UgewotCQkJCQkJdHJ5IHsKLQkJCQkJCQl2YWx1ZSA9IEZsb2F0LnZhbHVlT2Yocyk7Ci0JCQkJCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gbmZlKSB7Ci0JCQkJCQkJdmFsdWUgPSBuZXcgSW52YWxpZFZhbHVlKAotCQkJCQkJCQkJIlN0cmluZyB2YWx1ZSBkb2VzIG5vdCBjb252ZXJ0IHRvIEZsb2F0IHZhbHVlIik7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQl2YWx1ZSA9IG5ldyBJbnZhbGlkVmFsdWUoIlZhbHVlIG9mIHR5cGUgRmxvYXQgaXMgZXhwZWN0ZWQiKTsKLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKERvdWJsZS5UWVBFLmVxdWFscyhpQ2xhc3MpKSB7Ci0JCQkJaWYgKHZhbHVlIGluc3RhbmNlb2YgRG91YmxlKSB7Ci0JCQkJCS8vIG9rCi0JCQkJfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIE51bWJlcikgewotCQkJCQl2YWx1ZSA9IG5ldyBEb3VibGUoKChOdW1iZXIpIHZhbHVlKS5kb3VibGVWYWx1ZSgpKTsKLQkJCQl9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0JCQkJCVN0cmluZyBzID0gKFN0cmluZykgdmFsdWU7Ci0JCQkJCWlmIChzLmxlbmd0aCgpID09IDApIHsKLQkJCQkJCXZhbHVlID0gbnVsbDsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJdmFsdWUgPSBEb3VibGUudmFsdWVPZihzKTsKLQkJCQkJCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBuZmUpIHsKLQkJCQkJCQl2YWx1ZSA9IG5ldyBJbnZhbGlkVmFsdWUoCi0JCQkJCQkJCQkiU3RyaW5nIHZhbHVlIGRvZXMgbm90IGNvbnZlcnQgdG8gRG91YmxlIHZhbHVlIik7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQl2YWx1ZSA9IG5ldyBJbnZhbGlkVmFsdWUoIlZhbHVlIG9mIHR5cGUgRG91YmxlIGlzIGV4cGVjdGVkIik7Ci0JCQkJfQotCQkJfSBlbHNlIGlmICh0eXBlIGluc3RhbmNlb2YgRUVudW0pIHsKLQkJCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpIHsKLQkJCQkJRUVudW1MaXRlcmFsIGxpdGVyYWwgPSAoKEVFbnVtKSB0eXBlKQotCQkJCQkJCS5nZXRFRW51bUxpdGVyYWxCeUxpdGVyYWwoKFN0cmluZykgdmFsdWUpOwotCQkJCQlpZiAobGl0ZXJhbCA9PSBudWxsKSB7Ci0JCQkJCQl2YWx1ZSA9IG5ldyBJbnZhbGlkVmFsdWUoIlVua25vd24gbGl0ZXJhbDogIiArIHZhbHVlKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCXZhbHVlID0gbGl0ZXJhbC5nZXRJbnN0YW5jZSgpOwotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJdmFsdWUgPSBuZXcgSW52YWxpZFZhbHVlKCJWYWx1ZSBvZiB0eXBlIFN0cmluZyBpcyBleHBlY3RlZCIpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gdmFsdWU7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBjbGFzcyBJbnZhbGlkVmFsdWUgewotCi0JCXByaXZhdGUgU3RyaW5nIGRlc2NyaXB0aW9uOwotCi0JCXB1YmxpYyBJbnZhbGlkVmFsdWUoU3RyaW5nIGRlc2NyaXB0aW9uKSB7Ci0JCQl0aGlzLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuIGRlc2NyaXB0aW9uOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9wcm92aWRlcnMvRGlhZ3JhbUNvbnRyaWJ1dGlvbkl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9wcm92aWRlcnMvRGlhZ3JhbUNvbnRyaWJ1dGlvbkl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MmQ0NDAyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvcHJvdmlkZXJzL0RpYWdyYW1Db250cmlidXRpb25JdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQucHJvdmlkZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLmFjdGlvbi5jb250cmlidXRpb25pdGVtLkFic3RyYWN0Q29udHJpYnV0aW9uSXRlbVByb3ZpZGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnV0aWwuSVdvcmtiZW5jaFBhcnREZXNjcmlwdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wcmludGluZy5hY3Rpb25zLlByaW50UHJldmlld0FjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucHJpbnRpbmcucmVuZGVyLmFjdGlvbnMuRW5oYW5jZWRQcmludEFjdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnByaW50aW5nLnJlbmRlci5hY3Rpb25zLlJlbmRlcmVkUHJpbnRQcmV2aWV3QWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRGlhZ3JhbUNvbnRyaWJ1dGlvbkl0ZW1Qcm92aWRlciBleHRlbmRzCi0JCUFic3RyYWN0Q29udHJpYnV0aW9uSXRlbVByb3ZpZGVyIHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUFjdGlvbiBjcmVhdGVBY3Rpb24oU3RyaW5nIGFjdGlvbklkLAotCQkJSVdvcmtiZW5jaFBhcnREZXNjcmlwdG9yIHBhcnREZXNjcmlwdG9yKSB7Ci0JCWlmIChhY3Rpb25JZC5lcXVhbHMoUHJpbnRQcmV2aWV3QWN0aW9uLklEKSkgewotCQkJcmV0dXJuIG5ldyBSZW5kZXJlZFByaW50UHJldmlld0FjdGlvbigKLQkJCQkJbmV3IEVuaGFuY2VkUHJpbnRBY3Rpb25IZWxwZXIoKSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmNyZWF0ZUFjdGlvbihhY3Rpb25JZCwgcGFydERlc2NyaXB0b3IpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9wcm92aWRlcnMvRGlhZ3JhbUVkaXRQYXJ0UHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvcHJvdmlkZXJzL0RpYWdyYW1FZGl0UGFydFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjMDJhZjkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9wcm92aWRlcnMvRGlhZ3JhbUVkaXRQYXJ0UHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLnByb3ZpZGVyczsKLQotaW1wb3J0IGphdmEubGFuZy5yZWYuV2Vha1JlZmVyZW5jZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi5jb3JlLnNlcnZpY2UuSU9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JR3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5zZXJ2aWNlcy5lZGl0cGFydC5BYnN0cmFjdEVkaXRQYXJ0UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5zZXJ2aWNlcy5lZGl0cGFydC5DcmVhdGVHcmFwaGljRWRpdFBhcnRPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5zZXJ2aWNlcy5lZGl0cGFydC5JRWRpdFBhcnRPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLmVkaXQucGFydHMuRGlhZ3JhbUVkaXRQYXJ0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLmVkaXQucGFydHMuV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbUVkaXRQYXJ0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5wYXJ0LkRpYWdyYW1WaXN1YWxJRFJlZ2lzdHJ5OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERpYWdyYW1FZGl0UGFydFByb3ZpZGVyIGV4dGVuZHMgQWJzdHJhY3RFZGl0UGFydFByb3ZpZGVyIHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVkaXRQYXJ0RmFjdG9yeSBmYWN0b3J5OwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBhbGxvd0NhY2hpbmc7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBXZWFrUmVmZXJlbmNlIGNhY2hlZFBhcnQ7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBXZWFrUmVmZXJlbmNlIGNhY2hlZFZpZXc7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERpYWdyYW1FZGl0UGFydFByb3ZpZGVyKCkgewotCQlzZXRGYWN0b3J5KG5ldyBEaWFncmFtRWRpdFBhcnRGYWN0b3J5KCkpOwotCQlzZXRBbGxvd0NhY2hpbmcodHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBmaW5hbCBFZGl0UGFydEZhY3RvcnkgZ2V0RmFjdG9yeSgpIHsKLQkJcmV0dXJuIGZhY3Rvcnk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldEZhY3RvcnkoRWRpdFBhcnRGYWN0b3J5IGZhY3RvcnkpIHsKLQkJdGhpcy5mYWN0b3J5ID0gZmFjdG9yeTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGZpbmFsIGJvb2xlYW4gaXNBbGxvd0NhY2hpbmcoKSB7Ci0JCXJldHVybiBhbGxvd0NhY2hpbmc7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBzeW5jaHJvbml6ZWQgdm9pZCBzZXRBbGxvd0NhY2hpbmcoYm9vbGVhbiBhbGxvd0NhY2hpbmcpIHsKLQkJdGhpcy5hbGxvd0NhY2hpbmcgPSBhbGxvd0NhY2hpbmc7Ci0JCWlmICghYWxsb3dDYWNoaW5nKSB7Ci0JCQljYWNoZWRQYXJ0ID0gbnVsbDsKLQkJCWNhY2hlZFZpZXcgPSBudWxsOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJR3JhcGhpY2FsRWRpdFBhcnQgY3JlYXRlRWRpdFBhcnQoVmlldyB2aWV3KSB7Ci0JCUVkaXRQYXJ0IHBhcnQgPSBmYWN0b3J5LmNyZWF0ZUVkaXRQYXJ0KG51bGwsIHZpZXcpOwotCQlpZiAocGFydCBpbnN0YW5jZW9mIElHcmFwaGljYWxFZGl0UGFydCkgewotCQkJcmV0dXJuIChJR3JhcGhpY2FsRWRpdFBhcnQpIHBhcnQ7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJR3JhcGhpY2FsRWRpdFBhcnQgZ2V0Q2FjaGVkUGFydChWaWV3IHZpZXcpIHsKLQkJaWYgKGNhY2hlZFZpZXcgIT0gbnVsbCAmJiBjYWNoZWRWaWV3LmdldCgpID09IHZpZXcpIHsKLQkJCXJldHVybiAoSUdyYXBoaWNhbEVkaXRQYXJ0KSBjYWNoZWRQYXJ0LmdldCgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIElHcmFwaGljYWxFZGl0UGFydCBjcmVhdGVHcmFwaGljRWRpdFBhcnQoVmlldyB2aWV3KSB7Ci0JCWlmIChpc0FsbG93Q2FjaGluZygpKSB7Ci0JCQlJR3JhcGhpY2FsRWRpdFBhcnQgcGFydCA9IGdldENhY2hlZFBhcnQodmlldyk7Ci0JCQljYWNoZWRQYXJ0ID0gbnVsbDsKLQkJCWNhY2hlZFZpZXcgPSBudWxsOwotCQkJaWYgKHBhcnQgIT0gbnVsbCkgewotCQkJCXJldHVybiBwYXJ0OwotCQkJfQotCQl9Ci0JCXJldHVybiBjcmVhdGVFZGl0UGFydCh2aWV3KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIHByb3ZpZGVzKElPcGVyYXRpb24gb3BlcmF0aW9uKSB7Ci0JCWlmIChvcGVyYXRpb24gaW5zdGFuY2VvZiBDcmVhdGVHcmFwaGljRWRpdFBhcnRPcGVyYXRpb24pIHsKLQkJCVZpZXcgdmlldyA9ICgoSUVkaXRQYXJ0T3BlcmF0aW9uKSBvcGVyYXRpb24pLmdldFZpZXcoKTsKLQkJCWlmICghV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbUVkaXRQYXJ0Lk1PREVMX0lECi0JCQkJCS5lcXVhbHMoRGlhZ3JhbVZpc3VhbElEUmVnaXN0cnkuZ2V0TW9kZWxJRCh2aWV3KSkpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQlpZiAoaXNBbGxvd0NhY2hpbmcoKSAmJiBnZXRDYWNoZWRQYXJ0KHZpZXcpICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJCUlHcmFwaGljYWxFZGl0UGFydCBwYXJ0ID0gY3JlYXRlRWRpdFBhcnQodmlldyk7Ci0JCQlpZiAocGFydCAhPSBudWxsKSB7Ci0JCQkJaWYgKGlzQWxsb3dDYWNoaW5nKCkpIHsKLQkJCQkJY2FjaGVkUGFydCA9IG5ldyBXZWFrUmVmZXJlbmNlKHBhcnQpOwotCQkJCQljYWNoZWRWaWV3ID0gbmV3IFdlYWtSZWZlcmVuY2Uodmlldyk7Ci0JCQkJfQotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9wcm92aWRlcnMvRGlhZ3JhbUVsZW1lbnRUeXBlcy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9wcm92aWRlcnMvRGlhZ3JhbUVsZW1lbnRUeXBlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOWIxOTlkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvcHJvdmlkZXJzL0RpYWdyYW1FbGVtZW50VHlwZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxMyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLnByb3ZpZGVyczsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JZGVudGl0eUhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzc2lmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FTmFtZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5FbGVtZW50VHlwZVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuSUVsZW1lbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Nb2RlbFBhY2thZ2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLnBhcnQuV1BERGlhZ3JhbUVkaXRvclBsdWdpbjsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEaWFncmFtRWxlbWVudFR5cGVzIGV4dGVuZHMgRWxlbWVudEluaXRpYWxpemVycyB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBEaWFncmFtRWxlbWVudFR5cGVzKCkgewotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBNYXAgZWxlbWVudHM7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgSW1hZ2VSZWdpc3RyeSBpbWFnZVJlZ2lzdHJ5OwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIEltYWdlUmVnaXN0cnkgZ2V0SW1hZ2VSZWdpc3RyeSgpIHsKLQkJaWYgKGltYWdlUmVnaXN0cnkgPT0gbnVsbCkgewotCQkJaW1hZ2VSZWdpc3RyeSA9IG5ldyBJbWFnZVJlZ2lzdHJ5KCk7Ci0JCX0KLQkJcmV0dXJuIGltYWdlUmVnaXN0cnk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRJbWFnZVJlZ2lzdHJ5S2V5KEVOYW1lZEVsZW1lbnQgZWxlbWVudCkgewotCQlyZXR1cm4gZWxlbWVudC5nZXROYW1lKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIEltYWdlRGVzY3JpcHRvciBnZXRQcm92aWRlZEltYWdlRGVzY3JpcHRvcigKLQkJCUVOYW1lZEVsZW1lbnQgZWxlbWVudCkgewotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEVTdHJ1Y3R1cmFsRmVhdHVyZSkgewotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSAoKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgZWxlbWVudCk7Ci0JCQlFQ2xhc3MgZUNvbnRhaW5pbmdDbGFzcyA9IGZlYXR1cmUuZ2V0RUNvbnRhaW5pbmdDbGFzcygpOwotCQkJRUNsYXNzaWZpZXIgZVR5cGUgPSBmZWF0dXJlLmdldEVUeXBlKCk7Ci0JCQlpZiAoZUNvbnRhaW5pbmdDbGFzcyAhPSBudWxsICYmICFlQ29udGFpbmluZ0NsYXNzLmlzQWJzdHJhY3QoKSkgewotCQkJCWVsZW1lbnQgPSBlQ29udGFpbmluZ0NsYXNzOwotCQkJfSBlbHNlIGlmIChlVHlwZSBpbnN0YW5jZW9mIEVDbGFzcwotCQkJCQkmJiAhKChFQ2xhc3MpIGVUeXBlKS5pc0Fic3RyYWN0KCkpIHsKLQkJCQllbGVtZW50ID0gZVR5cGU7Ci0JCQl9Ci0JCX0KLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBFQ2xhc3MpIHsKLQkJCUVDbGFzcyBlQ2xhc3MgPSAoRUNsYXNzKSBlbGVtZW50OwotCQkJaWYgKCFlQ2xhc3MuaXNBYnN0cmFjdCgpKSB7Ci0JCQkJcmV0dXJuIFdQRERpYWdyYW1FZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKQotCQkJCQkJLmdldEl0ZW1JbWFnZURlc2NyaXB0b3IoCi0JCQkJCQkJCWVDbGFzcy5nZXRFUGFja2FnZSgpLmdldEVGYWN0b3J5SW5zdGFuY2UoKQotCQkJCQkJCQkJCS5jcmVhdGUoZUNsYXNzKSk7Ci0JCQl9Ci0JCX0KLQkJLy8gVE9ETyA6IHN1cHBvcnQgc3RydWN0dXJhbCBmZWF0dXJlcwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBJbWFnZURlc2NyaXB0b3IgZ2V0SW1hZ2VEZXNjcmlwdG9yKEVOYW1lZEVsZW1lbnQgZWxlbWVudCkgewotCQlTdHJpbmcga2V5ID0gZ2V0SW1hZ2VSZWdpc3RyeUtleShlbGVtZW50KTsKLQkJSW1hZ2VEZXNjcmlwdG9yIGltYWdlRGVzY3JpcHRvciA9IGdldEltYWdlUmVnaXN0cnkoKS5nZXREZXNjcmlwdG9yKGtleSk7Ci0JCWlmIChpbWFnZURlc2NyaXB0b3IgPT0gbnVsbCkgewotCQkJaW1hZ2VEZXNjcmlwdG9yID0gZ2V0UHJvdmlkZWRJbWFnZURlc2NyaXB0b3IoZWxlbWVudCk7Ci0JCQlpZiAoaW1hZ2VEZXNjcmlwdG9yID09IG51bGwpIHsKLQkJCQlpbWFnZURlc2NyaXB0b3IgPSBJbWFnZURlc2NyaXB0b3IuZ2V0TWlzc2luZ0ltYWdlRGVzY3JpcHRvcigpOwotCQkJfQotCQkJZ2V0SW1hZ2VSZWdpc3RyeSgpLnB1dChrZXksIGltYWdlRGVzY3JpcHRvcik7Ci0JCX0KLQkJcmV0dXJuIGltYWdlRGVzY3JpcHRvcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBJbWFnZSBnZXRJbWFnZShFTmFtZWRFbGVtZW50IGVsZW1lbnQpIHsKLQkJU3RyaW5nIGtleSA9IGdldEltYWdlUmVnaXN0cnlLZXkoZWxlbWVudCk7Ci0JCUltYWdlIGltYWdlID0gZ2V0SW1hZ2VSZWdpc3RyeSgpLmdldChrZXkpOwotCQlpZiAoaW1hZ2UgPT0gbnVsbCkgewotCQkJSW1hZ2VEZXNjcmlwdG9yIGltYWdlRGVzY3JpcHRvciA9IGdldFByb3ZpZGVkSW1hZ2VEZXNjcmlwdG9yKGVsZW1lbnQpOwotCQkJaWYgKGltYWdlRGVzY3JpcHRvciA9PSBudWxsKSB7Ci0JCQkJaW1hZ2VEZXNjcmlwdG9yID0gSW1hZ2VEZXNjcmlwdG9yLmdldE1pc3NpbmdJbWFnZURlc2NyaXB0b3IoKTsKLQkJCX0KLQkJCWdldEltYWdlUmVnaXN0cnkoKS5wdXQoa2V5LCBpbWFnZURlc2NyaXB0b3IpOwotCQkJaW1hZ2UgPSBnZXRJbWFnZVJlZ2lzdHJ5KCkuZ2V0KGtleSk7Ci0JCX0KLQkJcmV0dXJuIGltYWdlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEltYWdlRGVzY3JpcHRvciBnZXRJbWFnZURlc2NyaXB0b3IoSUFkYXB0YWJsZSBoaW50KSB7Ci0JCUVOYW1lZEVsZW1lbnQgZWxlbWVudCA9IGdldEVsZW1lbnQoaGludCk7Ci0JCWlmIChlbGVtZW50ID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiBnZXRJbWFnZURlc2NyaXB0b3IoZWxlbWVudCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSW1hZ2UgZ2V0SW1hZ2UoSUFkYXB0YWJsZSBoaW50KSB7Ci0JCUVOYW1lZEVsZW1lbnQgZWxlbWVudCA9IGdldEVsZW1lbnQoaGludCk7Ci0JCWlmIChlbGVtZW50ID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiBnZXRJbWFnZShlbGVtZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zICd0eXBlJyBvZiB0aGUgZWNvcmUgb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGUgaGludC4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBFTmFtZWRFbGVtZW50IGdldEVsZW1lbnQoSUFkYXB0YWJsZSBoaW50KSB7Ci0JCU9iamVjdCB0eXBlID0gaGludC5nZXRBZGFwdGVyKElFbGVtZW50VHlwZS5jbGFzcyk7Ci0JCWlmIChlbGVtZW50cyA9PSBudWxsKSB7Ci0JCQllbGVtZW50cyA9IG5ldyBJZGVudGl0eUhhc2hNYXAoKTsKLQotCQkJZWxlbWVudHMucHV0KFdvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW1fNzksCi0JCQkJCU1vZGVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbSgpKTsKLQotCQkJZWxlbWVudHMucHV0KFdvcmtQcm9kdWN0Tm9kZV8xMDAxLCBNb2RlbFBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCS5nZXRXb3JrUHJvZHVjdE5vZGUoKSk7Ci0KLQkJCWVsZW1lbnRzLnB1dChMaW5rXzMwMDEsIE1vZGVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TGluaygpKTsKLQkJfQotCQlyZXR1cm4gKEVOYW1lZEVsZW1lbnQpIGVsZW1lbnRzLmdldCh0eXBlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJRWxlbWVudFR5cGUgV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbV83OSA9IGdldEVsZW1lbnRUeXBlKCJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLldvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW1fNzkiKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSUVsZW1lbnRUeXBlIFdvcmtQcm9kdWN0Tm9kZV8xMDAxID0gZ2V0RWxlbWVudFR5cGUoIm9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQuV29ya1Byb2R1Y3ROb2RlXzEwMDEiKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSUVsZW1lbnRUeXBlIExpbmtfMzAwMSA9IGdldEVsZW1lbnRUeXBlKCJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLkxpbmtfMzAwMSIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgSUVsZW1lbnRUeXBlIGdldEVsZW1lbnRUeXBlKFN0cmluZyBpZCkgewotCQlyZXR1cm4gRWxlbWVudFR5cGVSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldFR5cGUoaWQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBTZXQgS05PV05fRUxFTUVOVF9UWVBFUzsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNLbm93bkVsZW1lbnRUeXBlKElFbGVtZW50VHlwZSBlbGVtZW50VHlwZSkgewotCQlpZiAoS05PV05fRUxFTUVOVF9UWVBFUyA9PSBudWxsKSB7Ci0JCQlLTk9XTl9FTEVNRU5UX1RZUEVTID0gbmV3IEhhc2hTZXQoKTsKLQkJCUtOT1dOX0VMRU1FTlRfVFlQRVMuYWRkKFdvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW1fNzkpOwotCQkJS05PV05fRUxFTUVOVF9UWVBFUy5hZGQoV29ya1Byb2R1Y3ROb2RlXzEwMDEpOwotCQkJS05PV05fRUxFTUVOVF9UWVBFUy5hZGQoTGlua18zMDAxKTsKLQkJfQotCQlyZXR1cm4gS05PV05fRUxFTUVOVF9UWVBFUy5jb250YWlucyhlbGVtZW50VHlwZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9wcm92aWRlcnMvRGlhZ3JhbUljb25Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9wcm92aWRlcnMvRGlhZ3JhbUljb25Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NGNmNDBkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvcHJvdmlkZXJzL0RpYWdyYW1JY29uUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQucHJvdmlkZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUuc2VydmljZS5BYnN0cmFjdFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi5jb3JlLnNlcnZpY2UuSU9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMuaWNvbi5HZXRJY29uT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5pY29uLklJY29uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERpYWdyYW1JY29uUHJvdmlkZXIgZXh0ZW5kcyBBYnN0cmFjdFByb3ZpZGVyIGltcGxlbWVudHMKLQkJSUljb25Qcm92aWRlciB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEltYWdlIGdldEljb24oSUFkYXB0YWJsZSBoaW50LCBpbnQgZmxhZ3MpIHsKLQkJcmV0dXJuIERpYWdyYW1FbGVtZW50VHlwZXMuZ2V0SW1hZ2UoaGludCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHByb3ZpZGVzKElPcGVyYXRpb24gb3BlcmF0aW9uKSB7Ci0JCWlmIChvcGVyYXRpb24gaW5zdGFuY2VvZiBHZXRJY29uT3BlcmF0aW9uKSB7Ci0JCQlyZXR1cm4gKChHZXRJY29uT3BlcmF0aW9uKSBvcGVyYXRpb24pLmV4ZWN1dGUodGhpcykgIT0gbnVsbDsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9wcm92aWRlcnMvRGlhZ3JhbU1vZGVsaW5nQXNzaXN0YW50UHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvcHJvdmlkZXJzL0RpYWdyYW1Nb2RlbGluZ0Fzc2lzdGFudFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1ZTQ3NzEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9wcm92aWRlcnMvRGlhZ3JhbU1vZGVsaW5nQXNzaXN0YW50UHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLnByb3ZpZGVyczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklHcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLkVsZW1lbnRUeXBlUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5JRWxlbWVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnVpLnNlcnZpY2VzLm1vZGVsaW5nYXNzaXN0YW50Lk1vZGVsaW5nQXNzaXN0YW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLkVsZW1lbnRMaXN0U2VsZWN0aW9uRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLmVkaXQucGFydHMuV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbUVkaXRQYXJ0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5wYXJ0LldQRERpYWdyYW1FZGl0b3JQbHVnaW47Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRGlhZ3JhbU1vZGVsaW5nQXNzaXN0YW50UHJvdmlkZXIgZXh0ZW5kcyBNb2RlbGluZ0Fzc2lzdGFudFByb3ZpZGVyIHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRUeXBlc0ZvclBvcHVwQmFyKElBZGFwdGFibGUgaG9zdCkgewotCQlJR3JhcGhpY2FsRWRpdFBhcnQgZWRpdFBhcnQgPSAoSUdyYXBoaWNhbEVkaXRQYXJ0KSBob3N0Ci0JCQkJLmdldEFkYXB0ZXIoSUdyYXBoaWNhbEVkaXRQYXJ0LmNsYXNzKTsKLQkJaWYgKGVkaXRQYXJ0IGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbUVkaXRQYXJ0KSB7Ci0JCQlMaXN0IHR5cGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJdHlwZXMuYWRkKERpYWdyYW1FbGVtZW50VHlwZXMuV29ya1Byb2R1Y3ROb2RlXzEwMDEpOwotCQkJcmV0dXJuIHR5cGVzOwotCQl9Ci0JCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRSZWxUeXBlc09uU291cmNlKElBZGFwdGFibGUgc291cmNlKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRSZWxUeXBlc09uVGFyZ2V0KElBZGFwdGFibGUgdGFyZ2V0KSB7Ci0JCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRSZWxUeXBlc09uU291cmNlQW5kVGFyZ2V0KElBZGFwdGFibGUgc291cmNlLAotCQkJSUFkYXB0YWJsZSB0YXJnZXQpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFR5cGVzRm9yU291cmNlKElBZGFwdGFibGUgdGFyZ2V0LAotCQkJSUVsZW1lbnRUeXBlIHJlbGF0aW9uc2hpcFR5cGUpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFR5cGVzRm9yVGFyZ2V0KElBZGFwdGFibGUgc291cmNlLAotCQkJSUVsZW1lbnRUeXBlIHJlbGF0aW9uc2hpcFR5cGUpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFT2JqZWN0IHNlbGVjdEV4aXN0aW5nRWxlbWVudEZvclNvdXJjZShJQWRhcHRhYmxlIHRhcmdldCwKLQkJCUlFbGVtZW50VHlwZSByZWxhdGlvbnNoaXBUeXBlKSB7Ci0JCXJldHVybiBzZWxlY3RFeGlzdGluZ0VsZW1lbnQodGFyZ2V0LCBnZXRUeXBlc0ZvclNvdXJjZSh0YXJnZXQsCi0JCQkJcmVsYXRpb25zaGlwVHlwZSkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRU9iamVjdCBzZWxlY3RFeGlzdGluZ0VsZW1lbnRGb3JUYXJnZXQoSUFkYXB0YWJsZSBzb3VyY2UsCi0JCQlJRWxlbWVudFR5cGUgcmVsYXRpb25zaGlwVHlwZSkgewotCQlyZXR1cm4gc2VsZWN0RXhpc3RpbmdFbGVtZW50KHNvdXJjZSwgZ2V0VHlwZXNGb3JUYXJnZXQoc291cmNlLAotCQkJCXJlbGF0aW9uc2hpcFR5cGUpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVPYmplY3Qgc2VsZWN0RXhpc3RpbmdFbGVtZW50KElBZGFwdGFibGUgaG9zdCwgQ29sbGVjdGlvbiB0eXBlcykgewotCQlpZiAodHlwZXMuaXNFbXB0eSgpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlJR3JhcGhpY2FsRWRpdFBhcnQgZWRpdFBhcnQgPSAoSUdyYXBoaWNhbEVkaXRQYXJ0KSBob3N0Ci0JCQkJLmdldEFkYXB0ZXIoSUdyYXBoaWNhbEVkaXRQYXJ0LmNsYXNzKTsKLQkJaWYgKGVkaXRQYXJ0ID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCURpYWdyYW0gZGlhZ3JhbSA9IChEaWFncmFtKSBlZGl0UGFydC5nZXRSb290KCkuZ2V0Q29udGVudHMoKS5nZXRNb2RlbCgpOwotCQlDb2xsZWN0aW9uIGVsZW1lbnRzID0gbmV3IEhhc2hTZXQoKTsKLQkJZm9yIChJdGVyYXRvciBpdCA9IGRpYWdyYW0uZ2V0RWxlbWVudCgpLmVBbGxDb250ZW50cygpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlFT2JqZWN0IGVsZW1lbnQgPSAoRU9iamVjdCkgaXQubmV4dCgpOwotCQkJaWYgKGlzQXBwbGljYWJsZUVsZW1lbnQoZWxlbWVudCwgdHlwZXMpKSB7Ci0JCQkJZWxlbWVudHMuYWRkKGVsZW1lbnQpOwotCQkJfQotCQl9Ci0JCWlmIChlbGVtZW50cy5pc0VtcHR5KCkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiBzZWxlY3RFbGVtZW50KChFT2JqZWN0W10pIGVsZW1lbnRzLnRvQXJyYXkobmV3IEVPYmplY3RbZWxlbWVudHMKLQkJCQkuc2l6ZSgpXSkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0FwcGxpY2FibGVFbGVtZW50KEVPYmplY3QgZWxlbWVudCwgQ29sbGVjdGlvbiB0eXBlcykgewotCQlJRWxlbWVudFR5cGUgdHlwZSA9IEVsZW1lbnRUeXBlUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXRFbGVtZW50VHlwZSgKLQkJCQllbGVtZW50KTsKLQkJcmV0dXJuIHR5cGVzLmNvbnRhaW5zKHR5cGUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRU9iamVjdCBzZWxlY3RFbGVtZW50KEVPYmplY3RbXSBlbGVtZW50cykgewotCQlTaGVsbCBzaGVsbCA9IERpc3BsYXkuZ2V0Q3VycmVudCgpLmdldEFjdGl2ZVNoZWxsKCk7Ci0JCUlMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIgPSBuZXcgQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyKAotCQkJCVdQRERpYWdyYW1FZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKQotCQkJCQkJLmdldEl0ZW1Qcm92aWRlcnNBZGFwdGVyRmFjdG9yeSgpKTsKLQkJRWxlbWVudExpc3RTZWxlY3Rpb25EaWFsb2cgZGlhbG9nID0gbmV3IEVsZW1lbnRMaXN0U2VsZWN0aW9uRGlhbG9nKAotCQkJCXNoZWxsLCBsYWJlbFByb3ZpZGVyKTsKLQkJZGlhbG9nLnNldE1lc3NhZ2UoIkF2YWlsYWJsZSBkb21haW4gbW9kZWwgZWxlbWVudHM6Iik7Ci0JCWRpYWxvZy5zZXRUaXRsZSgiU2VsZWN0IGRvbWFpbiBtb2RlbCBlbGVtZW50Iik7Ci0JCWRpYWxvZy5zZXRNdWx0aXBsZVNlbGVjdGlvbihmYWxzZSk7Ci0JCWRpYWxvZy5zZXRFbGVtZW50cyhlbGVtZW50cyk7Ci0JCUVPYmplY3Qgc2VsZWN0ZWQgPSBudWxsOwotCQlpZiAoZGlhbG9nLm9wZW4oKSA9PSBXaW5kb3cuT0spIHsKLQkJCXNlbGVjdGVkID0gKEVPYmplY3QpIGRpYWxvZy5nZXRGaXJzdFJlc3VsdCgpOwotCQl9Ci0JCXJldHVybiBzZWxlY3RlZDsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL3Byb3ZpZGVycy9EaWFncmFtUGFsZXR0ZVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL3Byb3ZpZGVycy9EaWFncmFtUGFsZXR0ZVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkYzQ0YTUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9wcm92aWRlcnMvRGlhZ3JhbVBhbGV0dGVQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5wcm92aWRlcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnBhbGV0dGUuUGFsZXR0ZVJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUuc2VydmljZS5BYnN0cmFjdFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi5jb3JlLnNlcnZpY2UuSU9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnNlcnZpY2VzLnBhbGV0dGUuSVBhbGV0dGVQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLnBhcnQuRGlhZ3JhbVBhbGV0dGVGYWN0b3J5OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERpYWdyYW1QYWxldHRlUHJvdmlkZXIgZXh0ZW5kcyBBYnN0cmFjdFByb3ZpZGVyIGltcGxlbWVudHMKLQkJSVBhbGV0dGVQcm92aWRlciB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgY29udHJpYnV0ZVRvUGFsZXR0ZShJRWRpdG9yUGFydCBlZGl0b3IsIE9iamVjdCBjb250ZW50LAotCQkJUGFsZXR0ZVJvb3Qgcm9vdCwgTWFwIHByZWRlZmluZWRFbnRyaWVzKSB7Ci0JCURpYWdyYW1QYWxldHRlRmFjdG9yeSBmYWN0b3J5ID0gbmV3IERpYWdyYW1QYWxldHRlRmFjdG9yeSgpOwotCQlmYWN0b3J5LmZpbGxQYWxldHRlKHJvb3QpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb250cmlidXRpb25zKElDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWdFbGVtZW50KSB7Ci0JCS8vIG5vIGNvbmZpZ3VyYXRpb24KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gcHJvdmlkZXMoSU9wZXJhdGlvbiBvcGVyYXRpb24pIHsKLQkJcmV0dXJuIGZhbHNlOyAvLyBhbGwgbG9naWMgaXMgZG9uZSBpbiB0aGUgc2VydmljZQotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvcHJvdmlkZXJzL0RpYWdyYW1QYXJzZXJQcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9wcm92aWRlcnMvRGlhZ3JhbVBhcnNlclByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxNDMyYzQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9wcm92aWRlcnMvRGlhZ3JhbVBhcnNlclByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5wcm92aWRlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS5zZXJ2aWNlLkFic3RyYWN0UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUuc2VydmljZS5JT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuR2V0UGFyc2VyT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuSVBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLklQYXJzZXJQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk1vZGVsUGFja2FnZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQuZWRpdC5wYXJ0cy5MaW5rTmFtZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQuZWRpdC5wYXJ0cy5Xb3JrUHJvZHVjdE5vZGVOYW1lRWRpdFBhcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLnBhcnQuRGlhZ3JhbVZpc3VhbElEUmVnaXN0cnk7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRGlhZ3JhbVBhcnNlclByb3ZpZGVyIGV4dGVuZHMgQWJzdHJhY3RQcm92aWRlciBpbXBsZW1lbnRzCi0JCUlQYXJzZXJQcm92aWRlciB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBJUGFyc2VyIHdvcmtQcm9kdWN0Tm9kZVdvcmtQcm9kdWN0Tm9kZU5hbWVfNDAwMVBhcnNlcjsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIElQYXJzZXIgZ2V0V29ya1Byb2R1Y3ROb2RlV29ya1Byb2R1Y3ROb2RlTmFtZV80MDAxUGFyc2VyKCkgewotCQlpZiAod29ya1Byb2R1Y3ROb2RlV29ya1Byb2R1Y3ROb2RlTmFtZV80MDAxUGFyc2VyID09IG51bGwpIHsKLQkJCXdvcmtQcm9kdWN0Tm9kZVdvcmtQcm9kdWN0Tm9kZU5hbWVfNDAwMVBhcnNlciA9IGNyZWF0ZVdvcmtQcm9kdWN0Tm9kZVdvcmtQcm9kdWN0Tm9kZU5hbWVfNDAwMVBhcnNlcigpOwotCQl9Ci0JCXJldHVybiB3b3JrUHJvZHVjdE5vZGVXb3JrUHJvZHVjdE5vZGVOYW1lXzQwMDFQYXJzZXI7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJUGFyc2VyIGNyZWF0ZVdvcmtQcm9kdWN0Tm9kZVdvcmtQcm9kdWN0Tm9kZU5hbWVfNDAwMVBhcnNlcigpIHsKLQkJRGlhZ3JhbVN0cnVjdHVyYWxGZWF0dXJlUGFyc2VyIHBhcnNlciA9IG5ldyBEaWFncmFtU3RydWN0dXJhbEZlYXR1cmVQYXJzZXIoCi0JCQkJTW9kZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXROYW1lZE5vZGVfTmFtZSgpKTsKLQkJcGFyc2VyLnNldFZpZXdQYXR0ZXJuKCJ7MH0iKTsKLQkJcGFyc2VyLnNldEVkaXRQYXR0ZXJuKCJ7MH0iKTsKLQkJcmV0dXJuIHBhcnNlcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBJUGFyc2VyIGxpbmtMaW5rTmFtZV80MDAyUGFyc2VyOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgSVBhcnNlciBnZXRMaW5rTGlua05hbWVfNDAwMlBhcnNlcigpIHsKLQkJaWYgKGxpbmtMaW5rTmFtZV80MDAyUGFyc2VyID09IG51bGwpIHsKLQkJCWxpbmtMaW5rTmFtZV80MDAyUGFyc2VyID0gY3JlYXRlTGlua0xpbmtOYW1lXzQwMDJQYXJzZXIoKTsKLQkJfQotCQlyZXR1cm4gbGlua0xpbmtOYW1lXzQwMDJQYXJzZXI7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJUGFyc2VyIGNyZWF0ZUxpbmtMaW5rTmFtZV80MDAyUGFyc2VyKCkgewotCQlEaWFncmFtU3RydWN0dXJhbEZlYXR1cmVQYXJzZXIgcGFyc2VyID0gbmV3IERpYWdyYW1TdHJ1Y3R1cmFsRmVhdHVyZVBhcnNlcigKLQkJCQlNb2RlbFBhY2thZ2UuZUlOU1RBTkNFLmdldExpbmtfTmFtZSgpKTsKLQkJcGFyc2VyLnNldFZpZXdQYXR0ZXJuKCJ7MH0iKTsKLQkJcGFyc2VyLnNldEVkaXRQYXR0ZXJuKCJ7MH0iKTsKLQkJcmV0dXJuIHBhcnNlcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElQYXJzZXIgZ2V0UGFyc2VyKGludCB2aXN1YWxJRCkgewotCQlzd2l0Y2ggKHZpc3VhbElEKSB7Ci0JCWNhc2UgV29ya1Byb2R1Y3ROb2RlTmFtZUVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCXJldHVybiBnZXRXb3JrUHJvZHVjdE5vZGVXb3JrUHJvZHVjdE5vZGVOYW1lXzQwMDFQYXJzZXIoKTsKLQkJY2FzZSBMaW5rTmFtZUVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCXJldHVybiBnZXRMaW5rTGlua05hbWVfNDAwMlBhcnNlcigpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSVBhcnNlciBnZXRQYXJzZXIoSUFkYXB0YWJsZSBoaW50KSB7Ci0JCVN0cmluZyB2aWQgPSAoU3RyaW5nKSBoaW50LmdldEFkYXB0ZXIoU3RyaW5nLmNsYXNzKTsKLQkJaWYgKHZpZCAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gZ2V0UGFyc2VyKERpYWdyYW1WaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKHZpZCkpOwotCQl9Ci0JCVZpZXcgdmlldyA9IChWaWV3KSBoaW50LmdldEFkYXB0ZXIoVmlldy5jbGFzcyk7Ci0JCWlmICh2aWV3ICE9IG51bGwpIHsKLQkJCXJldHVybiBnZXRQYXJzZXIoRGlhZ3JhbVZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQodmlldykpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBwcm92aWRlcyhJT3BlcmF0aW9uIG9wZXJhdGlvbikgewotCQlpZiAob3BlcmF0aW9uIGluc3RhbmNlb2YgR2V0UGFyc2VyT3BlcmF0aW9uKSB7Ci0JCQlJQWRhcHRhYmxlIGhpbnQgPSAoKEdldFBhcnNlck9wZXJhdGlvbikgb3BlcmF0aW9uKS5nZXRIaW50KCk7Ci0JCQlpZiAoRGlhZ3JhbUVsZW1lbnRUeXBlcy5nZXRFbGVtZW50KGhpbnQpID09IG51bGwpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQlyZXR1cm4gZ2V0UGFyc2VyKGhpbnQpICE9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvcHJvdmlkZXJzL0RpYWdyYW1Qcm9wZXJ0eVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL3Byb3ZpZGVycy9EaWFncmFtUHJvcGVydHlQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMTFkYzRkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvcHJvdmlkZXJzL0RpYWdyYW1Qcm9wZXJ0eVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLnByb3ZpZGVyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS5zZXJ2aWNlLklPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnByb3BlcnRpZXMuR2V0UHJvcGVydHlTb3VyY2VPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnByb3BlcnRpZXMuSUNvbXBvc2l0ZVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wcm9wZXJ0aWVzLklQcm9wZXJ0aWVzUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnVpLnByb3BlcnRpZXMucHJvdmlkZXJzLkdlbmVyaWNFTUZQcm9wZXJ0aWVzUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLmVkaXQucGFydHMuV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbUVkaXRQYXJ0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5wYXJ0LkRpYWdyYW1WaXN1YWxJRFJlZ2lzdHJ5OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERpYWdyYW1Qcm9wZXJ0eVByb3ZpZGVyIGV4dGVuZHMgR2VuZXJpY0VNRlByb3BlcnRpZXNQcm92aWRlcgotCQlpbXBsZW1lbnRzIElQcm9wZXJ0aWVzUHJvdmlkZXIgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHByb3ZpZGVzKElPcGVyYXRpb24gb3BlcmF0aW9uKSB7Ci0JCWlmIChvcGVyYXRpb24gaW5zdGFuY2VvZiBHZXRQcm9wZXJ0eVNvdXJjZU9wZXJhdGlvbikgewotCQkJT2JqZWN0IG9iamVjdCA9ICgoR2V0UHJvcGVydHlTb3VyY2VPcGVyYXRpb24pIG9wZXJhdGlvbikKLQkJCQkJLmdldE9iamVjdCgpOwotCQkJcmV0dXJuIGdldFNlbWFudGljRWxlbWVudChvYmplY3QpICE9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSUNvbXBvc2l0ZVByb3BlcnR5U291cmNlIGdldFByb3BlcnR5U291cmNlKE9iamVjdCBvYmplY3QpIHsKLQkJRU9iamVjdCBlbGVtZW50ID0gZ2V0U2VtYW50aWNFbGVtZW50KG9iamVjdCk7Ci0JCWlmIChlbGVtZW50ICE9IG51bGwpIHsKLQkJCXJldHVybiBzdXBlci5nZXRQcm9wZXJ0eVNvdXJjZShlbGVtZW50KTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVPYmplY3QgZ2V0U2VtYW50aWNFbGVtZW50KE9iamVjdCBvYmplY3QpIHsKLQkJVmlldyB2aWV3ID0gbnVsbDsKLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIFZpZXcpIHsKLQkJCXZpZXcgPSAoVmlldykgb2JqZWN0OwotCQl9IGVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIEVkaXRQYXJ0KSB7Ci0JCQlFZGl0UGFydCBlZGl0UGFydCA9IChFZGl0UGFydCkgb2JqZWN0OwotCQkJaWYgKGVkaXRQYXJ0LmdldE1vZGVsKCkgaW5zdGFuY2VvZiBWaWV3KSB7Ci0JCQkJdmlldyA9IChWaWV3KSBlZGl0UGFydC5nZXRNb2RlbCgpOwotCQkJfQotCQl9Ci0JCWlmICh2aWV3ICE9IG51bGwKLQkJCQkmJiBXb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtRWRpdFBhcnQuTU9ERUxfSUQKLQkJCQkJCS5lcXVhbHMoRGlhZ3JhbVZpc3VhbElEUmVnaXN0cnkuZ2V0TW9kZWxJRCh2aWV3KSkpIHsKLQkJCXJldHVybiB2aWV3LmdldEVsZW1lbnQoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvcHJvdmlkZXJzL0RpYWdyYW1TdHJ1Y3R1cmFsRmVhdHVyZVBhcnNlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9wcm92aWRlcnMvRGlhZ3JhbVN0cnVjdHVyYWxGZWF0dXJlUGFyc2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkMzI2ZDQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9wcm92aWRlcnMvRGlhZ3JhbVN0cnVjdHVyYWxGZWF0dXJlUGFyc2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5wcm92aWRlcnM7Ci0KLWltcG9ydCBqYXZhLnRleHQuRmllbGRQb3NpdGlvbjsKLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLnV0aWwuVHJhbnNhY3Rpb25VdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi5jb3JlLmNvbW1hbmQuSUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUuY29tbWFuZC5VbmV4ZWN1dGFibGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuSVBhcnNlckVkaXRTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5QYXJzZXJFZGl0U3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb21tYW5kcy5jb3JlLmNvbW1hbmQuQ29tcG9zaXRlVHJhbnNhY3Rpb25hbENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5wYXJ0LldQRERpYWdyYW1FZGl0b3JQbHVnaW47Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRGlhZ3JhbVN0cnVjdHVyYWxGZWF0dXJlUGFyc2VyIGV4dGVuZHMgRGlhZ3JhbUFic3RyYWN0UGFyc2VyIHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIE1lc3NhZ2VGb3JtYXQgREVGQVVMVF9QUk9DRVNTT1IgPSBuZXcgTWVzc2FnZUZvcm1hdCgKLQkJCSJ7MH0iKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmU7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERpYWdyYW1TdHJ1Y3R1cmFsRmVhdHVyZVBhcnNlcihFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSkgewotCQl0aGlzLmZlYXR1cmUgPSBmZWF0dXJlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTWVzc2FnZUZvcm1hdCBnZXRWaWV3UHJvY2Vzc29yKCkgewotCQlNZXNzYWdlRm9ybWF0IHByb2Nlc3NvciA9IHN1cGVyLmdldFZpZXdQcm9jZXNzb3IoKTsKLQkJcmV0dXJuIHByb2Nlc3NvciA9PSBudWxsID8gREVGQVVMVF9QUk9DRVNTT1IgOiBwcm9jZXNzb3I7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBNZXNzYWdlRm9ybWF0IGdldEVkaXRQcm9jZXNzb3IoKSB7Ci0JCU1lc3NhZ2VGb3JtYXQgcHJvY2Vzc29yID0gc3VwZXIuZ2V0RWRpdFByb2Nlc3NvcigpOwotCQlyZXR1cm4gcHJvY2Vzc29yID09IG51bGwgPyBERUZBVUxUX1BST0NFU1NPUiA6IHByb2Nlc3NvcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVPYmplY3QgZ2V0RG9tYWluRWxlbWVudChFT2JqZWN0IGVsZW1lbnQpIHsKLQkJcmV0dXJuIGVsZW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U3RyaW5nQnlQYXR0ZXJuKElBZGFwdGFibGUgYWRhcHRlciwgaW50IGZsYWdzLAotCQkJU3RyaW5nIHBhdHRlcm4sIE1lc3NhZ2VGb3JtYXQgcHJvY2Vzc29yKSB7Ci0JCUVPYmplY3QgZWxlbWVudCA9IChFT2JqZWN0KSBhZGFwdGVyLmdldEFkYXB0ZXIoRU9iamVjdC5jbGFzcyk7Ci0JCWVsZW1lbnQgPSBnZXREb21haW5FbGVtZW50KGVsZW1lbnQpOwotCQlyZXR1cm4gZ2V0U3RyaW5nQnlQYXR0ZXJuKGVsZW1lbnQsIGZlYXR1cmUsIHByb2Nlc3Nvcik7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U3RyaW5nQnlQYXR0ZXJuKEVPYmplY3QgZWxlbWVudCwKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBNZXNzYWdlRm9ybWF0IHByb2Nlc3NvcikgewotCQlPYmplY3QgdmFsdWUgPSBlbGVtZW50ID09IG51bGwgPyBudWxsIDogZWxlbWVudC5lR2V0KGZlYXR1cmUpOwotCQl2YWx1ZSA9IGdldFZhbGlkVmFsdWUoZmVhdHVyZSwgdmFsdWUpOwotCQlyZXR1cm4gcHJvY2Vzc29yLmZvcm1hdChuZXcgT2JqZWN0W10geyB2YWx1ZSB9LCBuZXcgU3RyaW5nQnVmZmVyKCksCi0JCQkJbmV3IEZpZWxkUG9zaXRpb24oMCkpLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJUGFyc2VyRWRpdFN0YXR1cyB2YWxpZGF0ZVZhbHVlcyhPYmplY3RbXSB2YWx1ZXMpIHsKLQkJaWYgKHZhbHVlcy5sZW5ndGggPiAxKSB7Ci0JCQlyZXR1cm4gUGFyc2VyRWRpdFN0YXR1cy5VTkVESVRBQkxFX1NUQVRVUzsKLQkJfQotCQlPYmplY3QgdmFsdWUgPSB2YWx1ZXMubGVuZ3RoID09IDEgPyB2YWx1ZXNbMF0gOiBudWxsOwotCQl2YWx1ZSA9IGdldFZhbGlkTmV3VmFsdWUoZmVhdHVyZSwgdmFsdWUpOwotCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBJbnZhbGlkVmFsdWUpIHsKLQkJCXJldHVybiBuZXcgUGFyc2VyRWRpdFN0YXR1cyhXUEREaWFncmFtRWRpdG9yUGx1Z2luLklELAotCQkJCQlJUGFyc2VyRWRpdFN0YXR1cy5VTkVESVRBQkxFLCB2YWx1ZS50b1N0cmluZygpKTsKLQkJfQotCQlyZXR1cm4gUGFyc2VyRWRpdFN0YXR1cy5FRElUQUJMRV9TVEFUVVM7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJQ29tbWFuZCBnZXRQYXJzZUNvbW1hbmQoSUFkYXB0YWJsZSBhZGFwdGVyLCBPYmplY3RbXSB2YWx1ZXMpIHsKLQkJRU9iamVjdCBlbGVtZW50ID0gKEVPYmplY3QpIGFkYXB0ZXIuZ2V0QWRhcHRlcihFT2JqZWN0LmNsYXNzKTsKLQkJZWxlbWVudCA9IGdldERvbWFpbkVsZW1lbnQoZWxlbWVudCk7Ci0JCWlmIChlbGVtZW50ID09IG51bGwpIHsKLQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQl9Ci0JCVRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIGVkaXRpbmdEb21haW4gPSBUcmFuc2FjdGlvblV0aWwKLQkJCQkuZ2V0RWRpdGluZ0RvbWFpbihlbGVtZW50KTsKLQkJaWYgKGVkaXRpbmdEb21haW4gPT0gbnVsbCkgewotCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCX0KLQkJT2JqZWN0IHZhbHVlID0gdmFsdWVzLmxlbmd0aCA9PSAxID8gdmFsdWVzWzBdIDogbnVsbDsKLQkJSUNvbW1hbmQgY29tbWFuZCA9IGdldE1vZGlmaWNhdGlvbkNvbW1hbmQoZWxlbWVudCwgZmVhdHVyZSwgdmFsdWUpOwotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZVRyYW5zYWN0aW9uYWxDb21tYW5kKGVkaXRpbmdEb21haW4sIGNvbW1hbmQKLQkJCQkuZ2V0TGFiZWwoKSwgQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChjb21tYW5kKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQWZmZWN0aW5nRXZlbnQoT2JqZWN0IGV2ZW50LCBpbnQgZmxhZ3MpIHsKLQkJaWYgKGV2ZW50IGluc3RhbmNlb2YgTm90aWZpY2F0aW9uKSB7Ci0JCQlyZXR1cm4gaXNBZmZlY3RpbmdGZWF0dXJlKCgoTm90aWZpY2F0aW9uKSBldmVudCkuZ2V0RmVhdHVyZSgpKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzQWZmZWN0aW5nRmVhdHVyZShPYmplY3QgZXZlbnRGZWF0dXJlKSB7Ci0JCXJldHVybiBmZWF0dXJlID09IGV2ZW50RmVhdHVyZTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL3Byb3ZpZGVycy9EaWFncmFtU3RydWN0dXJhbEZlYXR1cmVzUGFyc2VyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL3Byb3ZpZGVycy9EaWFncmFtU3RydWN0dXJhbEZlYXR1cmVzUGFyc2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3NzdmOGIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9wcm92aWRlcnMvRGlhZ3JhbVN0cnVjdHVyYWxGZWF0dXJlc1BhcnNlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQucHJvdmlkZXJzOwotCi1pbXBvcnQgamF2YS50ZXh0LkZpZWxkUG9zaXRpb247Ci1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLnV0aWwuVHJhbnNhY3Rpb25VdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi5jb3JlLmNvbW1hbmQuSUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUuY29tbWFuZC5VbmV4ZWN1dGFibGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuSVBhcnNlckVkaXRTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5QYXJzZXJFZGl0U3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb21tYW5kcy5jb3JlLmNvbW1hbmQuQ29tcG9zaXRlVHJhbnNhY3Rpb25hbENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5wYXJ0LldQRERpYWdyYW1FZGl0b3JQbHVnaW47Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRGlhZ3JhbVN0cnVjdHVyYWxGZWF0dXJlc1BhcnNlciBleHRlbmRzIERpYWdyYW1BYnN0cmFjdFBhcnNlciB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBMaXN0IGZlYXR1cmVzOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEaWFncmFtU3RydWN0dXJhbEZlYXR1cmVzUGFyc2VyKExpc3QgZmVhdHVyZXMpIHsKLQkJdGhpcy5mZWF0dXJlcyA9IGZlYXR1cmVzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFN0cmluZ0J5UGF0dGVybihJQWRhcHRhYmxlIGFkYXB0ZXIsIGludCBmbGFncywKLQkJCVN0cmluZyBwYXR0ZXJuLCBNZXNzYWdlRm9ybWF0IHByb2Nlc3NvcikgewotCQlFT2JqZWN0IGVsZW1lbnQgPSAoRU9iamVjdCkgYWRhcHRlci5nZXRBZGFwdGVyKEVPYmplY3QuY2xhc3MpOwotCQlMaXN0IHZhbHVlcyA9IG5ldyBBcnJheUxpc3QoZmVhdHVyZXMuc2l6ZSgpKTsKLQkJZm9yIChJdGVyYXRvciBpdCA9IGZlYXR1cmVzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgaXQubmV4dCgpOwotCQkJT2JqZWN0IHZhbHVlID0gZWxlbWVudC5lR2V0KGZlYXR1cmUpOwotCQkJdmFsdWUgPSBnZXRWYWxpZFZhbHVlKGZlYXR1cmUsIHZhbHVlKTsKLQkJCXZhbHVlcy5hZGQodmFsdWUpOwotCQl9Ci0JCXJldHVybiBwcm9jZXNzb3IuZm9ybWF0KHZhbHVlcy50b0FycmF5KG5ldyBPYmplY3RbdmFsdWVzLnNpemUoKV0pLAotCQkJCW5ldyBTdHJpbmdCdWZmZXIoKSwgbmV3IEZpZWxkUG9zaXRpb24oMCkpLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJUGFyc2VyRWRpdFN0YXR1cyB2YWxpZGF0ZVZhbHVlcyhPYmplY3RbXSB2YWx1ZXMpIHsKLQkJaWYgKHZhbHVlcy5sZW5ndGggIT0gZmVhdHVyZXMuc2l6ZSgpKSB7Ci0JCQlyZXR1cm4gUGFyc2VyRWRpdFN0YXR1cy5VTkVESVRBQkxFX1NUQVRVUzsKLQkJfQotCQlmb3IgKGludCBpID0gMDsgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKykgewotCQkJT2JqZWN0IHZhbHVlID0gZ2V0VmFsaWROZXdWYWx1ZSgoRVN0cnVjdHVyYWxGZWF0dXJlKSBmZWF0dXJlcwotCQkJCQkuZ2V0KGkpLCB2YWx1ZXNbaV0pOwotCQkJaWYgKHZhbHVlIGluc3RhbmNlb2YgSW52YWxpZFZhbHVlKSB7Ci0JCQkJcmV0dXJuIG5ldyBQYXJzZXJFZGl0U3RhdHVzKFdQRERpYWdyYW1FZGl0b3JQbHVnaW4uSUQsCi0JCQkJCQlJUGFyc2VyRWRpdFN0YXR1cy5VTkVESVRBQkxFLCB2YWx1ZS50b1N0cmluZygpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gUGFyc2VyRWRpdFN0YXR1cy5FRElUQUJMRV9TVEFUVVM7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJQ29tbWFuZCBnZXRQYXJzZUNvbW1hbmQoSUFkYXB0YWJsZSBhZGFwdGVyLCBPYmplY3RbXSB2YWx1ZXMpIHsKLQkJRU9iamVjdCBlbGVtZW50ID0gKEVPYmplY3QpIGFkYXB0ZXIuZ2V0QWRhcHRlcihFT2JqZWN0LmNsYXNzKTsKLQkJaWYgKGVsZW1lbnQgPT0gbnVsbCkgewotCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCX0KLQkJVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gZWRpdGluZ0RvbWFpbiA9IFRyYW5zYWN0aW9uVXRpbAotCQkJCS5nZXRFZGl0aW5nRG9tYWluKGVsZW1lbnQpOwotCQlpZiAoZWRpdGluZ0RvbWFpbiA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJfQotCQlDb21wb3NpdGVUcmFuc2FjdGlvbmFsQ29tbWFuZCBjb21tYW5kID0gbmV3IENvbXBvc2l0ZVRyYW5zYWN0aW9uYWxDb21tYW5kKAotCQkJCWVkaXRpbmdEb21haW4sICJTZXQgVmFsdWVzIik7IC8vJE5PTi1OTFMtMSQKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB2YWx1ZXMubGVuZ3RoOyBpKyspIHsKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgZmVhdHVyZXMuZ2V0KGkpOwotCQkJY29tbWFuZAotCQkJCQkuY29tcG9zZShnZXRNb2RpZmljYXRpb25Db21tYW5kKGVsZW1lbnQsIGZlYXR1cmUsIHZhbHVlc1tpXSkpOwotCQl9Ci0JCXJldHVybiBjb21tYW5kOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0FmZmVjdGluZ0V2ZW50KE9iamVjdCBldmVudCwgaW50IGZsYWdzKSB7Ci0JCWlmIChldmVudCBpbnN0YW5jZW9mIE5vdGlmaWNhdGlvbikgewotCQkJT2JqZWN0IGZlYXR1cmUgPSAoKE5vdGlmaWNhdGlvbikgZXZlbnQpLmdldEZlYXR1cmUoKTsKLQkJCWlmIChmZWF0dXJlcy5jb250YWlucyhmZWF0dXJlKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL3Byb3ZpZGVycy9EaWFncmFtVmlld1Byb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL3Byb3ZpZGVycy9EaWFncmFtVmlld1Byb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiMTNkZGQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9wcm92aWRlcnMvRGlhZ3JhbVZpZXdQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQucHJvdmlkZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUucHJvdmlkZXJzLkFic3RyYWN0Vmlld1Byb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5JRWxlbWVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5lZGl0LnBhcnRzLkxpbmtFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLmVkaXQucGFydHMuTGlua05hbWVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLmVkaXQucGFydHMuV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQuZWRpdC5wYXJ0cy5Xb3JrUHJvZHVjdE5vZGVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLmVkaXQucGFydHMuV29ya1Byb2R1Y3ROb2RlTmFtZUVkaXRQYXJ0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5wYXJ0LkRpYWdyYW1WaXN1YWxJRFJlZ2lzdHJ5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC52aWV3LmZhY3Rvcmllcy5MaW5rTmFtZVZpZXdGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQudmlldy5mYWN0b3JpZXMuTGlua1ZpZXdGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQudmlldy5mYWN0b3JpZXMuV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbVZpZXdGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQudmlldy5mYWN0b3JpZXMuV29ya1Byb2R1Y3ROb2RlTmFtZVZpZXdGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQudmlldy5mYWN0b3JpZXMuV29ya1Byb2R1Y3ROb2RlVmlld0ZhY3Rvcnk7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRGlhZ3JhbVZpZXdQcm92aWRlciBleHRlbmRzIEFic3RyYWN0Vmlld1Byb3ZpZGVyIHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ2xhc3MgZ2V0RGlhZ3JhbVZpZXdDbGFzcyhJQWRhcHRhYmxlIHNlbWFudGljQWRhcHRlciwKLQkJCVN0cmluZyBkaWFncmFtS2luZCkgewotCQlFT2JqZWN0IHNlbWFudGljRWxlbWVudCA9IGdldFNlbWFudGljRWxlbWVudChzZW1hbnRpY0FkYXB0ZXIpOwotCQlpZiAoV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbUVkaXRQYXJ0Lk1PREVMX0lELmVxdWFscyhkaWFncmFtS2luZCkKLQkJCQkmJiBEaWFncmFtVmlzdWFsSURSZWdpc3RyeS5nZXREaWFncmFtVmlzdWFsSUQoc2VtYW50aWNFbGVtZW50KSAhPSAtMSkgewotCQkJcmV0dXJuIFdvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW1WaWV3RmFjdG9yeS5jbGFzczsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENsYXNzIGdldE5vZGVWaWV3Q2xhc3MoSUFkYXB0YWJsZSBzZW1hbnRpY0FkYXB0ZXIsCi0JCQlWaWV3IGNvbnRhaW5lclZpZXcsIFN0cmluZyBzZW1hbnRpY0hpbnQpIHsKLQkJaWYgKGNvbnRhaW5lclZpZXcgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJSUVsZW1lbnRUeXBlIGVsZW1lbnRUeXBlID0gZ2V0U2VtYW50aWNFbGVtZW50VHlwZShzZW1hbnRpY0FkYXB0ZXIpOwotCQlpZiAoZWxlbWVudFR5cGUgIT0gbnVsbAotCQkJCSYmICFEaWFncmFtRWxlbWVudFR5cGVzLmlzS25vd25FbGVtZW50VHlwZShlbGVtZW50VHlwZSkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCUVDbGFzcyBzZW1hbnRpY1R5cGUgPSBnZXRTZW1hbnRpY0VDbGFzcyhzZW1hbnRpY0FkYXB0ZXIpOwotCQlFT2JqZWN0IHNlbWFudGljRWxlbWVudCA9IGdldFNlbWFudGljRWxlbWVudChzZW1hbnRpY0FkYXB0ZXIpOwotCQlpbnQgbm9kZVZJRCA9IERpYWdyYW1WaXN1YWxJRFJlZ2lzdHJ5LmdldE5vZGVWaXN1YWxJRChjb250YWluZXJWaWV3LAotCQkJCXNlbWFudGljRWxlbWVudCwgc2VtYW50aWNUeXBlLCBzZW1hbnRpY0hpbnQpOwotCQlzd2l0Y2ggKG5vZGVWSUQpIHsKLQkJY2FzZSBXb3JrUHJvZHVjdE5vZGVFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQlyZXR1cm4gV29ya1Byb2R1Y3ROb2RlVmlld0ZhY3RvcnkuY2xhc3M7Ci0JCWNhc2UgV29ya1Byb2R1Y3ROb2RlTmFtZUVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCXJldHVybiBXb3JrUHJvZHVjdE5vZGVOYW1lVmlld0ZhY3RvcnkuY2xhc3M7Ci0JCWNhc2UgTGlua05hbWVFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQlyZXR1cm4gTGlua05hbWVWaWV3RmFjdG9yeS5jbGFzczsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENsYXNzIGdldEVkZ2VWaWV3Q2xhc3MoSUFkYXB0YWJsZSBzZW1hbnRpY0FkYXB0ZXIsCi0JCQlWaWV3IGNvbnRhaW5lclZpZXcsIFN0cmluZyBzZW1hbnRpY0hpbnQpIHsKLQkJSUVsZW1lbnRUeXBlIGVsZW1lbnRUeXBlID0gZ2V0U2VtYW50aWNFbGVtZW50VHlwZShzZW1hbnRpY0FkYXB0ZXIpOwotCQlpZiAoZWxlbWVudFR5cGUgIT0gbnVsbAotCQkJCSYmICFEaWFncmFtRWxlbWVudFR5cGVzLmlzS25vd25FbGVtZW50VHlwZShlbGVtZW50VHlwZSkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCUVDbGFzcyBzZW1hbnRpY1R5cGUgPSBnZXRTZW1hbnRpY0VDbGFzcyhzZW1hbnRpY0FkYXB0ZXIpOwotCQlpZiAoc2VtYW50aWNUeXBlID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCUVPYmplY3Qgc2VtYW50aWNFbGVtZW50ID0gZ2V0U2VtYW50aWNFbGVtZW50KHNlbWFudGljQWRhcHRlcik7Ci0JCWludCBsaW5rVklEID0gRGlhZ3JhbVZpc3VhbElEUmVnaXN0cnkuZ2V0TGlua1dpdGhDbGFzc1Zpc3VhbElEKAotCQkJCXNlbWFudGljRWxlbWVudCwgc2VtYW50aWNUeXBlKTsKLQkJc3dpdGNoIChsaW5rVklEKSB7Ci0JCWNhc2UgTGlua0VkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCXJldHVybiBMaW5rVmlld0ZhY3RvcnkuY2xhc3M7Ci0JCX0KLQkJcmV0dXJuIGdldFVucmVjb2duaXplZENvbm5lY3RvclZpZXdDbGFzcyhzZW1hbnRpY0FkYXB0ZXIsCi0JCQkJY29udGFpbmVyVmlldywgc2VtYW50aWNIaW50KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBJRWxlbWVudFR5cGUgZ2V0U2VtYW50aWNFbGVtZW50VHlwZShJQWRhcHRhYmxlIHNlbWFudGljQWRhcHRlcikgewotCQlpZiAoc2VtYW50aWNBZGFwdGVyID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiAoSUVsZW1lbnRUeXBlKSBzZW1hbnRpY0FkYXB0ZXIuZ2V0QWRhcHRlcihJRWxlbWVudFR5cGUuY2xhc3MpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIENsYXNzIGdldFVucmVjb2duaXplZENvbm5lY3RvclZpZXdDbGFzcyhJQWRhcHRhYmxlIHNlbWFudGljQWRhcHRlciwKLQkJCVZpZXcgY29udGFpbmVyVmlldywgU3RyaW5nIHNlbWFudGljSGludCkgewotCQkvLyBIYW5kbGUgdW5yZWNvZ25pemVkIGNoaWxkIG5vZGUgY2xhc3NlcyBoZXJlCi0JCXJldHVybiBudWxsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9wcm92aWRlcnMvRWxlbWVudEluaXRpYWxpemVycy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9wcm92aWRlcnMvRWxlbWVudEluaXRpYWxpemVycy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMjFkZjYwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvcHJvdmlkZXJzL0VsZW1lbnRJbml0aWFsaXplcnMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQucHJvdmlkZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5wYXJ0LldQRERpYWdyYW1FZGl0b3JQbHVnaW47Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRWxlbWVudEluaXRpYWxpemVycyB7Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL3NoZWV0L0RpYWdyYW1TaGVldExhYmVsUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvc2hlZXQvRGlhZ3JhbVNoZWV0TGFiZWxQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YTllNDA4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvc2hlZXQvRGlhZ3JhbVNoZWV0TGFiZWxQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5zaGVldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLnBhcnQuV1BERGlhZ3JhbUVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkRlY29yYXRpbmdMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERpYWdyYW1TaGVldExhYmVsUHJvdmlkZXIgZXh0ZW5kcyBEZWNvcmF0aW5nTGFiZWxQcm92aWRlciB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERpYWdyYW1TaGVldExhYmVsUHJvdmlkZXIoKSB7Ci0JCXN1cGVyKG5ldyBBZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIoV1BERGlhZ3JhbUVkaXRvclBsdWdpbgotCQkJCS5nZXRJbnN0YW5jZSgpLmdldEl0ZW1Qcm92aWRlcnNBZGFwdGVyRmFjdG9yeSgpKSwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgewotCQlPYmplY3Qgc2VsZWN0ZWQgPSB1bndyYXAoZWxlbWVudCk7Ci0JCXJldHVybiBzdXBlci5nZXRUZXh0KHNlbGVjdGVkKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEltYWdlIGdldEltYWdlKE9iamVjdCBlbGVtZW50KSB7Ci0JCXJldHVybiBzdXBlci5nZXRJbWFnZSh1bndyYXAoZWxlbWVudCkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIE9iamVjdCB1bndyYXAoT2JqZWN0IGVsZW1lbnQpIHsKLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgewotCQkJcmV0dXJuIHVud3JhcCgoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBlbGVtZW50KS5nZXRGaXJzdEVsZW1lbnQoKSk7Ci0JCX0KLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBFZGl0UGFydCkgewotCQkJcmV0dXJuIHVud3JhcEVkaXRQYXJ0KChFZGl0UGFydCkgZWxlbWVudCk7Ci0JCX0KLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJQWRhcHRhYmxlKSB7Ci0JCQlWaWV3IHZpZXcgPSAoVmlldykgKChJQWRhcHRhYmxlKSBlbGVtZW50KS5nZXRBZGFwdGVyKFZpZXcuY2xhc3MpOwotCQkJaWYgKHZpZXcgIT0gbnVsbCkgewotCQkJCXJldHVybiB1bndyYXBWaWV3KHZpZXcpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlbGVtZW50OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIE9iamVjdCB1bndyYXBFZGl0UGFydChFZGl0UGFydCBwKSB7Ci0JCWlmIChwLmdldE1vZGVsKCkgaW5zdGFuY2VvZiBWaWV3KSB7Ci0JCQlyZXR1cm4gdW53cmFwVmlldygoVmlldykgcC5nZXRNb2RlbCgpKTsKLQkJfQotCQlyZXR1cm4gcC5nZXRNb2RlbCgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIE9iamVjdCB1bndyYXBWaWV3KFZpZXcgdmlldykgewotCQlyZXR1cm4gdmlldy5nZXRFbGVtZW50KCkgPT0gbnVsbCA/IHZpZXcgOiB2aWV3LmdldEVsZW1lbnQoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvdmlldy9mYWN0b3JpZXMvTGlua05hbWVWaWV3RmFjdG9yeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC92aWV3L2ZhY3Rvcmllcy9MaW5rTmFtZVZpZXdGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmOGQ2ZmEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC92aWV3L2ZhY3Rvcmllcy9MaW5rTmFtZVZpZXdGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLnZpZXcuZmFjdG9yaWVzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUucHJlZmVyZW5jZXMuUHJlZmVyZW5jZXNIaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkudmlldy5mYWN0b3JpZXMuQWJzdHJhY3RMYWJlbFZpZXdGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnV0aWwuTWVhc3VyZW1lbnRVbml0SGVscGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLm1hcG1vZGUuSU1hcE1vZGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Mb2NhdGlvbjsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBMaW5rTmFtZVZpZXdGYWN0b3J5IGV4dGVuZHMgQWJzdHJhY3RMYWJlbFZpZXdGYWN0b3J5IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVmlldyBjcmVhdGVWaWV3KElBZGFwdGFibGUgc2VtYW50aWNBZGFwdGVyLCBWaWV3IGNvbnRhaW5lclZpZXcsCi0JCQlTdHJpbmcgc2VtYW50aWNIaW50LCBpbnQgaW5kZXgsIGJvb2xlYW4gcGVyc2lzdGVkLAotCQkJUHJlZmVyZW5jZXNIaW50IHByZWZlcmVuY2VzSGludCkgewotCQlOb2RlIHZpZXcgPSAoTm9kZSkgc3VwZXIuY3JlYXRlVmlldyhzZW1hbnRpY0FkYXB0ZXIsIGNvbnRhaW5lclZpZXcsCi0JCQkJc2VtYW50aWNIaW50LCBpbmRleCwgcGVyc2lzdGVkLCBwcmVmZXJlbmNlc0hpbnQpOwotCQlMb2NhdGlvbiBsb2NhdGlvbiA9IChMb2NhdGlvbikgdmlldy5nZXRMYXlvdXRDb25zdHJhaW50KCk7Ci0JCUlNYXBNb2RlIG1hcE1vZGUgPSBNZWFzdXJlbWVudFVuaXRIZWxwZXIuZ2V0TWFwTW9kZShjb250YWluZXJWaWV3Ci0JCQkJLmdldERpYWdyYW0oKS5nZXRNZWFzdXJlbWVudFVuaXQoKSk7Ci0JCWxvY2F0aW9uLnNldFgobWFwTW9kZS5EUHRvTFAoMCkpOwotCQlsb2NhdGlvbi5zZXRZKG1hcE1vZGUuRFB0b0xQKDQwKSk7Ci0JCXJldHVybiB2aWV3OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBjcmVhdGVTdHlsZXMoVmlldyB2aWV3KSB7Ci0JCUxpc3Qgc3R5bGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlyZXR1cm4gc3R5bGVzOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvdmlldy9mYWN0b3JpZXMvTGlua1ZpZXdGYWN0b3J5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL3ZpZXcvZmFjdG9yaWVzL0xpbmtWaWV3RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOTgxYWJlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvdmlldy9mYWN0b3JpZXMvTGlua1ZpZXdGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC52aWV3LmZhY3RvcmllczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVjb3JlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uVHJhbnNhY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi53b3Jrc3BhY2UuQWJzdHJhY3RFTUZPcGVyYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLmVkaXQucGFydHMuTGlua0VkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQuZWRpdC5wYXJ0cy5MaW5rTmFtZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQuZWRpdC5wYXJ0cy5Xb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtRWRpdFBhcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLnBhcnQuRGlhZ3JhbVZpc3VhbElEUmVnaXN0cnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS51dGlsLkxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS51dGlsLlN0cmluZ1N0YXRpY3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUudXRpbC5UcmFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUucHJlZmVyZW5jZXMuUHJlZmVyZW5jZXNIaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS51dGlsLlZpZXdVdGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5pbnRlcm5hbC5EaWFncmFtVUlEZWJ1Z09wdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5pbnRlcm5hbC5EaWFncmFtVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5pbnRlcm5hbC5EaWFncmFtVUlTdGF0dXNDb2RlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnZpZXcuZmFjdG9yaWVzLkNvbm5lY3Rpb25WaWV3RmFjdG9yeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkJlbmRwb2ludHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRWRnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob3RhdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBMaW5rVmlld0ZhY3RvcnkgZXh0ZW5kcyBDb25uZWN0aW9uVmlld0ZhY3RvcnkgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwIG9wdGlvbnMgPSBuZXcgSGFzaE1hcCgpOwotCXN0YXRpYyB7Ci0JCW9wdGlvbnMucHV0KFRyYW5zYWN0aW9uLk9QVElPTl9VTlBST1RFQ1RFRCwgQm9vbGVhbi5UUlVFKTsKLQkJb3B0aW9ucy5wdXQoVHJhbnNhY3Rpb24uT1BUSU9OX05PX05PVElGSUNBVElPTlMsIEJvb2xlYW4uVFJVRSk7Ci0JCW9wdGlvbnMucHV0KFRyYW5zYWN0aW9uLk9QVElPTl9OT19UUklHR0VSUywgQm9vbGVhbi5UUlVFKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIAotCSAqLwotCXByb3RlY3RlZCBMaXN0IGNyZWF0ZVN0eWxlcyhWaWV3IHZpZXcpIHsKLQkJTGlzdCBzdHlsZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXN0eWxlcy5hZGQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVSb3V0aW5nU3R5bGUoKSk7Ci0JCXN0eWxlcy5hZGQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGb250U3R5bGUoKSk7Ci0JCXN0eWxlcy5hZGQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVMaW5lU3R5bGUoKSk7Ci0JCXJldHVybiBzdHlsZXM7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRlY29yYXRlVmlldyhWaWV3IGNvbnRhaW5lclZpZXcsIFZpZXcgdmlldywKLQkJCUlBZGFwdGFibGUgc2VtYW50aWNBZGFwdGVyLCBTdHJpbmcgc2VtYW50aWNIaW50LCBpbnQgaW5kZXgsCi0JCQlib29sZWFuIHBlcnNpc3RlZCkgewotCQlpZiAoc2VtYW50aWNIaW50ID09IG51bGwpIHsKLQkJCXNlbWFudGljSGludCA9IERpYWdyYW1WaXN1YWxJRFJlZ2lzdHJ5Ci0JCQkJCS5nZXRUeXBlKExpbmtFZGl0UGFydC5WSVNVQUxfSUQpOwotCQkJdmlldy5zZXRUeXBlKHNlbWFudGljSGludCk7Ci0JCX0KLQkJc3VwZXIuZGVjb3JhdGVWaWV3KGNvbnRhaW5lclZpZXcsIHZpZXcsIHNlbWFudGljQWRhcHRlciwgc2VtYW50aWNIaW50LAotCQkJCWluZGV4LCBwZXJzaXN0ZWQpOwotCQlpZiAoIVdvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW1FZGl0UGFydC5NT0RFTF9JRAotCQkJCS5lcXVhbHMoRGlhZ3JhbVZpc3VhbElEUmVnaXN0cnkuZ2V0TW9kZWxJRChjb250YWluZXJWaWV3KSkpIHsKLQkJCUVBbm5vdGF0aW9uIHNob3J0Y3V0QW5ub3RhdGlvbiA9IEVjb3JlRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkJLmNyZWF0ZUVBbm5vdGF0aW9uKCk7Ci0JCQlzaG9ydGN1dEFubm90YXRpb24uc2V0U291cmNlKCJTaG9ydGN1dCIpOyAvLyROT04tTkxTLTEkCi0JCQlzaG9ydGN1dEFubm90YXRpb24uZ2V0RGV0YWlscygpLnB1dCgKLQkJCQkJIm1vZGVsSUQiLCBXb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtRWRpdFBhcnQuTU9ERUxfSUQpOyAvLyROT04tTkxTLTEkCi0JCQl2aWV3LmdldEVBbm5vdGF0aW9ucygpLmFkZChzaG9ydGN1dEFubm90YXRpb24pOwotCQl9Ci0JCWdldFZpZXdTZXJ2aWNlKCkuY3JlYXRlTm9kZShzZW1hbnRpY0FkYXB0ZXIsIHZpZXcsCi0JCQkJRGlhZ3JhbVZpc3VhbElEUmVnaXN0cnkuZ2V0VHlwZShMaW5rTmFtZUVkaXRQYXJ0LlZJU1VBTF9JRCksCi0JCQkJVmlld1V0aWwuQVBQRU5ELCB0cnVlLCBnZXRQcmVmZXJlbmNlc0hpbnQoKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUudmlldy5mYWN0b3JpZXMuVmlld0ZhY3RvcnkjY3JlYXRlVmlldyhvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZSwgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldywgamF2YS5sYW5nLlN0cmluZywgaW50LCBib29sZWFuLCBqYXZhLmxhbmcuU3RyaW5nKQotCSAqIAotCSAqIE92ZXJyaWRlIGNyZWF0ZVZpZXcgc2luY2UgdGhlcmUgaXMgYSBidWcgaW4gCi0JICogb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS52aWV3LmZhY3Rvcmllcy5Db25uZWN0aW9uVmlld0ZhY3RvcnkuamF2YQotCSAqLwotCXB1YmxpYyBWaWV3IGNyZWF0ZVZpZXcoZmluYWwgSUFkYXB0YWJsZSBzZW1hbnRpY0FkYXB0ZXIsCi0JCQlmaW5hbCBWaWV3IGNvbnRhaW5lclZpZXcsIGZpbmFsIFN0cmluZyBzZW1hbnRpY0hpbnQsCi0JCQlmaW5hbCBpbnQgaW5kZXgsIGZpbmFsIGJvb2xlYW4gcGVyc2lzdGVkLAotCQkJZmluYWwgUHJlZmVyZW5jZXNIaW50IHByZWZlcmVuY2VzSGludCkgewotCi0JCXNldFByZWZlcmVuY2VzSGludChwcmVmZXJlbmNlc0hpbnQpOwotCi0JCWZpbmFsIEVkZ2UgZWRnZSA9IE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRWRnZSgpOwotCQlMaXN0IHN0eWxlcyA9IGNyZWF0ZVN0eWxlcyhlZGdlKTsKLQkJaWYgKHN0eWxlcy5zaXplKCkgPiAwKSB7Ci0JCQllZGdlLmdldFN0eWxlcygpLmFkZEFsbChzdHlsZXMpOwotCQl9Ci0KLQkJQmVuZHBvaW50cyBiZW5kUG9pbnRzID0gY3JlYXRlQmVuZHBvaW50cygpOwotCQlpZiAoYmVuZFBvaW50cyAhPSBudWxsKSB7Ci0JCQllZGdlLnNldEJlbmRwb2ludHMoYmVuZFBvaW50cyk7Ci0JCX0KLQotCQlFT2JqZWN0IHNlbWFudGljRWwgPSBzZW1hbnRpY0FkYXB0ZXIgPT0gbnVsbCA/IG51bGwKLQkJCQk6IChFT2JqZWN0KSBzZW1hbnRpY0FkYXB0ZXIuZ2V0QWRhcHRlcihFT2JqZWN0LmNsYXNzKTsKLQkJaWYgKHNlbWFudGljRWwgPT0gbnVsbCkKLQkJCS8vIGVuZm9yY2UgYSBzZXQgdG8gTlVMTAotCQkJZWRnZS5zZXRFbGVtZW50KG51bGwpOwotCQllbHNlIGlmIChyZXF1aXJlc0VsZW1lbnQoc2VtYW50aWNBZGFwdGVyLCBjb250YWluZXJWaWV3KSkgewotCQkJZWRnZS5zZXRFbGVtZW50KHNlbWFudGljRWwpOwotCQl9Ci0KLQkJZWRnZS5zZXRUeXBlKHNlbWFudGljSGludCk7Ci0KLQkJLy8gZGVjb3JhdGUgdmlldyBhc3N1bWVzIHRoZSB2aWV3IGhhZCBiZWVuIGluc2VydGVkIGFscmVhZHksIHNvIAotCQkvLyB3ZSBoYWQgdG8gY2FsbCBpbnNlcnQgY2hpbGQgYmVmb3JlIGNhbGxpbmcgZGVjb3JhdGUgdmlldwotCQlWaWV3VXRpbC5pbnNlcnRDaGlsZFZpZXcoY29udGFpbmVyVmlldywgZWRnZSwgaW5kZXgsIHBlcnNpc3RlZCk7Ci0KLQkJVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gZG9tYWluID0gZ2V0RWRpdGluZ0RvbWFpbihzZW1hbnRpY0VsLAotCQkJCWNvbnRhaW5lclZpZXcpOwotCi0JCWlmIChkb21haW4gIT0gbnVsbCkgewotCQkJaWYgKGlzVW5Qcm90ZWN0ZWRTaWxlbnRUcmFuc2FjdGlvbkluUHJvZ3Jlc3MoZG9tYWluKSkgewotCQkJCS8vIGRlY29yYXRlIHZpZXcgaGFkIHRvIHJ1biBhcyBhIHNpbGVudCBvcGVyYXRpb24gb3RoZXIgd2lzZQotCQkJCS8vIGl0IHdpbGwgZ2VuZXJhdGUgdG9vIG1hbnkgZXZlbnRzCi0JCQkJZGVjb3JhdGVWaWV3KGNvbnRhaW5lclZpZXcsIGVkZ2UsIHNlbWFudGljQWRhcHRlciwKLQkJCQkJCXNlbWFudGljSGludCwgaW5kZXgsIHRydWUpOwotCi0JCQl9IGVsc2UgewotCQkJCUFic3RyYWN0RU1GT3BlcmF0aW9uIG9wZXJhdGlvbiA9IG5ldyBBYnN0cmFjdEVNRk9wZXJhdGlvbigKLQkJCQkJCWRvbWFpbiwgU3RyaW5nU3RhdGljcy5CTEFOSywgb3B0aW9ucykgewotCi0JCQkJCXByb3RlY3RlZCBJU3RhdHVzIGRvRXhlY3V0ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsCi0JCQkJCQkJSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJCQkJCWRlY29yYXRlVmlldyhjb250YWluZXJWaWV3LCBlZGdlLCBzZW1hbnRpY0FkYXB0ZXIsCi0JCQkJCQkJCXNlbWFudGljSGludCwgaW5kZXgsIHRydWUpOwotCi0JCQkJCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQkJCQkJfQotCQkJCX07Ci0JCQkJdHJ5IHsKLQkJCQkJb3BlcmF0aW9uLmV4ZWN1dGUobmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSwgbnVsbCk7Ci0JCQkJfSBjYXRjaCAoRXhlY3V0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCQkJVHJhY2UuY2F0Y2hpbmcoRGlhZ3JhbVVJUGx1Z2luLmdldEluc3RhbmNlKCksCi0JCQkJCQkJRGlhZ3JhbVVJRGVidWdPcHRpb25zLkVYQ0VQVElPTlNfQ0FUQ0hJTkcsCi0JCQkJCQkJZ2V0Q2xhc3MoKSwgImNyZWF0ZVZpZXciLCBlKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlMb2cud2FybmluZyhEaWFncmFtVUlQbHVnaW4uZ2V0SW5zdGFuY2UoKSwKLQkJCQkJCQlEaWFncmFtVUlTdGF0dXNDb2Rlcy5JR05PUkVEX0VYQ0VQVElPTl9XQVJOSU5HLAotCQkJCQkJCSJjcmVhdGVWaWV3IiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gZWRnZTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL3ZpZXcvZmFjdG9yaWVzL1dvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW1WaWV3RmFjdG9yeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC92aWV3L2ZhY3Rvcmllcy9Xb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtVmlld0ZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2UyNThhNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL3ZpZXcvZmFjdG9yaWVzL1dvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW1WaWV3RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC52aWV3LmZhY3RvcmllczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkudmlldy5mYWN0b3JpZXMuRGlhZ3JhbVZpZXdGYWN0b3J5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTWVhc3VyZW1lbnRVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vdGF0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFdvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW1WaWV3RmFjdG9yeSBleHRlbmRzIERpYWdyYW1WaWV3RmFjdG9yeSB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIAotCSAqLwotCXByb3RlY3RlZCBMaXN0IGNyZWF0ZVN0eWxlcyhWaWV3IHZpZXcpIHsKLQkJTGlzdCBzdHlsZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXN0eWxlcy5hZGQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQYWdlU3R5bGUoKSk7Ci0JCXN0eWxlcy5hZGQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVHdWlkZVN0eWxlKCkpOwotCQlzdHlsZXMuYWRkKE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRGVzY3JpcHRpb25TdHlsZSgpKTsKLQkJcmV0dXJuIHN0eWxlczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZGVjb3JhdGVWaWV3KFZpZXcgdmlldywgSUFkYXB0YWJsZSBzZW1hbnRpY0FkYXB0ZXIsCi0JCQlTdHJpbmcgZGlhZ3JhbUtpbmQpIHsKLQkJc3VwZXIuZGVjb3JhdGVWaWV3KHZpZXcsIHNlbWFudGljQWRhcHRlciwgZGlhZ3JhbUtpbmQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTWVhc3VyZW1lbnRVbml0IGdldE1lYXN1cmVtZW50VW5pdCgpIHsKLQkJcmV0dXJuIE1lYXN1cmVtZW50VW5pdC5QSVhFTF9MSVRFUkFMOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC92aWV3L2ZhY3Rvcmllcy9Xb3JrUHJvZHVjdE5vZGVOYW1lVmlld0ZhY3RvcnkuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvdmlldy9mYWN0b3JpZXMvV29ya1Byb2R1Y3ROb2RlTmFtZVZpZXdGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkYjlmZTQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC92aWV3L2ZhY3Rvcmllcy9Xb3JrUHJvZHVjdE5vZGVOYW1lVmlld0ZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQudmlldy5mYWN0b3JpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnZpZXcuZmFjdG9yaWVzLkJhc2ljTm9kZVZpZXdGYWN0b3J5OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFdvcmtQcm9kdWN0Tm9kZU5hbWVWaWV3RmFjdG9yeSBleHRlbmRzIEJhc2ljTm9kZVZpZXdGYWN0b3J5IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkZWNvcmF0ZVZpZXcoVmlldyBjb250YWluZXJWaWV3LCBWaWV3IHZpZXcsCi0JCQlJQWRhcHRhYmxlIHNlbWFudGljQWRhcHRlciwgU3RyaW5nIHNlbWFudGljSGludCwgaW50IGluZGV4LAotCQkJYm9vbGVhbiBwZXJzaXN0ZWQpIHsKLQkJc3VwZXIuZGVjb3JhdGVWaWV3KGNvbnRhaW5lclZpZXcsIHZpZXcsIHNlbWFudGljQWRhcHRlciwgc2VtYW50aWNIaW50LAotCQkJCWluZGV4LCBwZXJzaXN0ZWQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBjcmVhdGVTdHlsZXMoVmlldyB2aWV3KSB7Ci0JCUxpc3Qgc3R5bGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlyZXR1cm4gc3R5bGVzOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvdmlldy9mYWN0b3JpZXMvV29ya1Byb2R1Y3ROb2RlVmlld0ZhY3RvcnkuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvdmlldy9mYWN0b3JpZXMvV29ya1Byb2R1Y3ROb2RlVmlld0ZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGM1Nzk0MC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL3ZpZXcvZmFjdG9yaWVzL1dvcmtQcm9kdWN0Tm9kZVZpZXdGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLnZpZXcuZmFjdG9yaWVzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FY29yZUZhY3Rvcnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLmVkaXQucGFydHMuV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQuZWRpdC5wYXJ0cy5Xb3JrUHJvZHVjdE5vZGVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLmVkaXQucGFydHMuV29ya1Byb2R1Y3ROb2RlTmFtZUVkaXRQYXJ0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5wYXJ0LkRpYWdyYW1WaXN1YWxJRFJlZ2lzdHJ5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLnV0aWwuVmlld1V0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnZpZXcuZmFjdG9yaWVzLkFic3RyYWN0U2hhcGVWaWV3RmFjdG9yeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vdGF0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFdvcmtQcm9kdWN0Tm9kZVZpZXdGYWN0b3J5IGV4dGVuZHMgQWJzdHJhY3RTaGFwZVZpZXdGYWN0b3J5IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgCi0JICovCi0JcHJvdGVjdGVkIExpc3QgY3JlYXRlU3R5bGVzKFZpZXcgdmlldykgewotCQlMaXN0IHN0eWxlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJc3R5bGVzLmFkZChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZvbnRTdHlsZSgpKTsKLQkJc3R5bGVzLmFkZChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZURlc2NyaXB0aW9uU3R5bGUoKSk7Ci0JCXN0eWxlcy5hZGQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGaWxsU3R5bGUoKSk7Ci0JCXN0eWxlcy5hZGQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVMaW5lU3R5bGUoKSk7Ci0JCXJldHVybiBzdHlsZXM7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRlY29yYXRlVmlldyhWaWV3IGNvbnRhaW5lclZpZXcsIFZpZXcgdmlldywKLQkJCUlBZGFwdGFibGUgc2VtYW50aWNBZGFwdGVyLCBTdHJpbmcgc2VtYW50aWNIaW50LCBpbnQgaW5kZXgsCi0JCQlib29sZWFuIHBlcnNpc3RlZCkgewotCQlpZiAoc2VtYW50aWNIaW50ID09IG51bGwpIHsKLQkJCXNlbWFudGljSGludCA9IERpYWdyYW1WaXN1YWxJRFJlZ2lzdHJ5Ci0JCQkJCS5nZXRUeXBlKFdvcmtQcm9kdWN0Tm9kZUVkaXRQYXJ0LlZJU1VBTF9JRCk7Ci0JCQl2aWV3LnNldFR5cGUoc2VtYW50aWNIaW50KTsKLQkJfQotCQlzdXBlci5kZWNvcmF0ZVZpZXcoY29udGFpbmVyVmlldywgdmlldywgc2VtYW50aWNBZGFwdGVyLCBzZW1hbnRpY0hpbnQsCi0JCQkJaW5kZXgsIHBlcnNpc3RlZCk7Ci0JCWlmICghV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbUVkaXRQYXJ0Lk1PREVMX0lECi0JCQkJLmVxdWFscyhEaWFncmFtVmlzdWFsSURSZWdpc3RyeS5nZXRNb2RlbElEKGNvbnRhaW5lclZpZXcpKSkgewotCQkJRUFubm90YXRpb24gc2hvcnRjdXRBbm5vdGF0aW9uID0gRWNvcmVGYWN0b3J5LmVJTlNUQU5DRQotCQkJCQkuY3JlYXRlRUFubm90YXRpb24oKTsKLQkJCXNob3J0Y3V0QW5ub3RhdGlvbi5zZXRTb3VyY2UoIlNob3J0Y3V0Iik7IC8vJE5PTi1OTFMtMSQKLQkJCXNob3J0Y3V0QW5ub3RhdGlvbi5nZXREZXRhaWxzKCkucHV0KAotCQkJCQkibW9kZWxJRCIsIFdvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW1FZGl0UGFydC5NT0RFTF9JRCk7IC8vJE5PTi1OTFMtMSQKLQkJCXZpZXcuZ2V0RUFubm90YXRpb25zKCkuYWRkKHNob3J0Y3V0QW5ub3RhdGlvbik7Ci0JCX0KLQkJZ2V0Vmlld1NlcnZpY2UoKS5jcmVhdGVOb2RlKAotCQkJCXNlbWFudGljQWRhcHRlciwKLQkJCQl2aWV3LAotCQkJCURpYWdyYW1WaXN1YWxJRFJlZ2lzdHJ5Ci0JCQkJCQkuZ2V0VHlwZShXb3JrUHJvZHVjdE5vZGVOYW1lRWRpdFBhcnQuVklTVUFMX0lEKSwKLQkJCQlWaWV3VXRpbC5BUFBFTkQsIHRydWUsIGdldFByZWZlcmVuY2VzSGludCgpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kb2MvLnByb2plY3QgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZG9jLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOTljM2VmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kb2MvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5lcGYuZG9jPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRvYy9NRVRBLUlORi9NQU5JRkVTVC5NRiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kb2MvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1ZmQ0ZGUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRvYy9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJWZlYXR1cmVQbHVnaW5OYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5lcGYuZG9jOyBzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjUuMC5xdWFsaWZpZXIKLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotRWNsaXBzZS1MYXp5U3RhcnQ6IHRydWUKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRvYy9hYm91dC5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRvYy9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Yzk5MDg2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kb2MvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0gCi08cD5GZWJydWFyeSAyNCwgMjAwNTwvcD4JCi08aDM+TGljZW5zZTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQotYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQotaW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQuPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRvYy9hYm91dC5pbmkgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZG9jL2Fib3V0LmluaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjA0ZjRmYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZG9jL2Fib3V0LmluaQorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24uICBBbGwgUmlnaHRzIFJlc2VydmVkLgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotIyBhYm91dC5pbmkKLSMgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgYSBmZWF0dXJlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jICIla2V5IiBhcmUgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZGVmaW5lZCBpbiBhYm91dC5wcm9wZXJ0aWVzCi0jIFRoaXMgZmlsZSBkb2VzIG5vdCBuZWVkIHRvIGJlIHRyYW5zbGF0ZWQuCi0KLSMgUHJvcGVydHkgImFib3V0VGV4dCIgY29udGFpbnMgYmx1cmIgZm9yICJBYm91dCIgZGlhbG9nICh0cmFuc2xhdGVkKQotYWJvdXRUZXh0PSVmZWF0dXJlVGV4dAotCi0jIFByb3BlcnR5ICJmZWF0dXJlSW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gZmVhdHVyZSBpbWFnZSAoMzJ4MzIpCi1mZWF0dXJlSW1hZ2U9YXBwbGljYXRpb25fMzIuZ2lmCi0KLSMgUHJvcGVydHkgImFwcE5hbWUiIGNvbnRhaW5zIG5hbWUgb2YgdGhlIGFwcGxpY2F0aW9uICh0cmFuc2xhdGVkKQotYXBwTmFtZT0lZmVhdHVyZU5hbWUKLQotIyBQcm9wZXJ0eSAid2VsY29tZVBhZ2UiIGNvbnRhaW5zIHBhdGggdG8gd2VsY29tZSBwYWdlIChzcGVjaWFsIFhNTC1iYXNlZCBmb3JtYXQpCi13ZWxjb21lUGFnZT0kbmwkL3dlbGNvbWUueG1sCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZG9jL2Fib3V0Lm1hcHBpbmdzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRvYy9hYm91dC5tYXBwaW5ncwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDkyYjY2Mi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZG9jL2Fib3V0Lm1hcHBpbmdzCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi0jIGFib3V0Lm1hcHBpbmdzCi0jIGNvbnRhaW5zIGZpbGwtaW5zIGZvciBhYm91dC5wcm9wZXJ0aWVzCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIFRoaXMgZmlsZSBkb2VzIG5vdCBuZWVkIHRvIGJlIHRyYW5zbGF0ZWQuCi0jIFVzdWFsbHkgZ2VuZXJhdGVkIGF0IGJ1aWxkIHRpbWUuCi0KLTA9QGJ1aWxkLUlEQAotMT0xLjIuMApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRvYy9hYm91dC5wcm9wZXJ0aWVzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRvYy9hYm91dC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZjdjZTQ5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kb2MvYWJvdXQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgRG8gbm90IGNoYW5nZSB0aGUgcHJvcGVydGllcyBiZXR3ZWVuIHRoaXMgbGluZSBhbmQgdGhlIGxhc3QgbGluZSBjb250YWluaW5nOgotIyAlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUKLSMgSW5zdGVhZCwgZWl0aGVyIHJlZGVmaW5lIGFuIGV4aXN0aW5nIHByb3BlcnR5LCBvciBjcmVhdGUgYSBuZXcgcHJvcGVydHksCi0jIGFwcGVuZCBpdCB0byB0aGUgZW5kIG9mIHRoZSBmaWxlLCBhbmQgY2hhbmdlIHRoZSBjb2RlIHRvIHVzZSB0aGUgbmV3IG5hbWUuCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0jIGFib3V0LnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGFib3V0LmluaQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBmaWxsLWlucyBhcmUgc3VwcGxpZWQgYnkgYWJvdXQubWFwcGluZ3MKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotCi1mZWF0dXJlTmFtZT1FUEYgRG9jdW1lbnRhdGlvbgotCi1mZWF0dXJlVGV4dD1FUEYgRG9jdW1lbnRhdGlvblxuXAotXG5cCi1WZXJzaW9uOiB7MX0gXG5cCi1CdWlsZCBMYWJlbDogezB9XG5cCi1cblwKLShjKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgYW5kIG90aGVycyAyMDAwLCAyMDA3LiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC5cblwKLVxuXAotCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyAlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUKLSMgVGhlIGFib3ZlIHByb3BlcnRpZXMgaGF2ZSBiZWVuIHNoaXBwZWQgZm9yIHRyYW5zbGF0aW9uLgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kb2MvYXBwbGljYXRpb25fMzIuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRvYy9hcHBsaWNhdGlvbl8zMi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2YWQ3Y2MuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRvYy9hcHBsaWNhdGlvbl8zMi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZG9jL2J1aWxkLnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZG9jL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyMTI5ZjkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRvYy9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1iaW4uaW5jbHVkZXMgPSAuLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIGFib3V0LnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgYWJvdXQuaW5pLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIGFib3V0Lm1hcHBpbmdzLFwKLSAgICAgICAgICAgICAgIG5sLwotCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZG9jL25sL2RhL2Fib3V0LnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZG9jL25sL2RhL2Fib3V0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5Mzk0MTUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRvYy9ubC9kYS9hYm91dC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUgotCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyBEbyBub3QgY2hhbmdlIHRoZSBwcm9wZXJ0aWVzIGJldHdlZW4gdGhpcyBsaW5lIGFuZCB0aGUgbGFzdCBsaW5lIGNvbnRhaW5pbmc6Ci0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQotIyBJbnN0ZWFkLCBlaXRoZXIgcmVkZWZpbmUgYW4gZXhpc3RpbmcgcHJvcGVydHksIG9yIGNyZWF0ZSBhIG5ldyBwcm9wZXJ0eSwKLSMgYXBwZW5kIGl0IHRvIHRoZSBlbmQgb2YgdGhlIGZpbGUsIGFuZCBjaGFuZ2UgdGhlIGNvZGUgdG8gdXNlIHRoZSBuZXcgbmFtZS4KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSMgYWJvdXQucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgYWJvdXQuaW5pCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIGZpbGwtaW5zIGFyZSBzdXBwbGllZCBieSBhYm91dC5tYXBwaW5ncwotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0KLWZlYXR1cmVOYW1lPUVQRiAtIGRva3VtZW50YXRpb24KLQotZmVhdHVyZVRleHQ9RVBGLWRva3VtZW50YXRpb25cblwKLVxuXAotVmVyc2lvbjogezF9IFxuXAotQnlnZ2VldGlrZXQ6IHswfVxuXAotXG5cCi0oYykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIGFuZCBvdGhlcnMgMjAwMCwgMjAwNy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cblwKLVxuCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyAlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUKLSMgVGhlIGFib3ZlIHByb3BlcnRpZXMgaGF2ZSBiZWVuIHNoaXBwZWQgZm9yIHRyYW5zbGF0aW9uLgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kb2MvbmwvZGUvYWJvdXQucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kb2MvbmwvZGUvYWJvdXQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzAxYzRjMy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZG9jL25sL2RlL2Fib3V0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSCi0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jIERvIG5vdCBjaGFuZ2UgdGhlIHByb3BlcnRpZXMgYmV0d2VlbiB0aGlzIGxpbmUgYW5kIHRoZSBsYXN0IGxpbmUgY29udGFpbmluZzoKLSMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlCi0jIEluc3RlYWQsIGVpdGhlciByZWRlZmluZSBhbiBleGlzdGluZyBwcm9wZXJ0eSwgb3IgY3JlYXRlIGEgbmV3IHByb3BlcnR5LAotIyBhcHBlbmQgaXQgdG8gdGhlIGVuZCBvZiB0aGUgZmlsZSwgYW5kIGNoYW5nZSB0aGUgY29kZSB0byB1c2UgdGhlIG5ldyBuYW1lLgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotIyBhYm91dC5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBhYm91dC5pbmkKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgZmlsbC1pbnMgYXJlIHN1cHBsaWVkIGJ5IGFib3V0Lm1hcHBpbmdzCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLQotZmVhdHVyZU5hbWU9RVBGIC0gRG9rdW1lbnRhdGlvbgotCi1mZWF0dXJlVGV4dD1FUEYgLSBEb2t1bWVudGF0aW9uXG5cCi1cblwKLVZlcnNpb246IHsxfSBcblwKLUJ1aWxkLUtlbm51bmc6IHswfVxuXAotXG5cCi0oYykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIGFuZCBvdGhlcnMgMjAwMCwgMjAwNy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG5cCi1cbgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlCi0jIFRoZSBhYm92ZSBwcm9wZXJ0aWVzIGhhdmUgYmVlbiBzaGlwcGVkIGZvciB0cmFuc2xhdGlvbi4KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZG9jL25sL2VzL2Fib3V0LnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZG9jL25sL2VzL2Fib3V0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlNGVhMTguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRvYy9ubC9lcy9hYm91dC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUgotCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyBEbyBub3QgY2hhbmdlIHRoZSBwcm9wZXJ0aWVzIGJldHdlZW4gdGhpcyBsaW5lIGFuZCB0aGUgbGFzdCBsaW5lIGNvbnRhaW5pbmc6Ci0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQotIyBJbnN0ZWFkLCBlaXRoZXIgcmVkZWZpbmUgYW4gZXhpc3RpbmcgcHJvcGVydHksIG9yIGNyZWF0ZSBhIG5ldyBwcm9wZXJ0eSwKLSMgYXBwZW5kIGl0IHRvIHRoZSBlbmQgb2YgdGhlIGZpbGUsIGFuZCBjaGFuZ2UgdGhlIGNvZGUgdG8gdXNlIHRoZSBuZXcgbmFtZS4KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSMgYWJvdXQucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgYWJvdXQuaW5pCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIGZpbGwtaW5zIGFyZSBzdXBwbGllZCBieSBhYm91dC5tYXBwaW5ncwotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0KLWZlYXR1cmVOYW1lPURvY3VtZW50YWNpXHUwMGYzbiBkZSBFUEYKLQotZmVhdHVyZVRleHQ9RG9jdW1lbnRhY2lcdTAwZjNuIGRlIEVQRlxuXAotXG5cCi1WZXJzaVx1MDBmM246IHsxfSBcblwKLUV0aXF1ZXRhIGRlIGJ1aWxkOiB7MH1cblwKLVxuXAotKGMpIENvcHlyaWdodCBDb2xhYm9yYWRvcmVzIGRlIEVjbGlwc2UgeSBvdHJvcyAyMDAwLCAyMDA3LiAgUmVzZXJ2YWRvcyB0b2RvcyBsb3MgZGVyZWNob3MuXG5cCi1cbgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlCi0jIFRoZSBhYm92ZSBwcm9wZXJ0aWVzIGhhdmUgYmVlbiBzaGlwcGVkIGZvciB0cmFuc2xhdGlvbi4KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZG9jL25sL2ZyL2Fib3V0LnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZG9jL25sL2ZyL2Fib3V0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0YWM2ZjAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRvYy9ubC9mci9hYm91dC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUgotCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyBEbyBub3QgY2hhbmdlIHRoZSBwcm9wZXJ0aWVzIGJldHdlZW4gdGhpcyBsaW5lIGFuZCB0aGUgbGFzdCBsaW5lIGNvbnRhaW5pbmc6Ci0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQotIyBJbnN0ZWFkLCBlaXRoZXIgcmVkZWZpbmUgYW4gZXhpc3RpbmcgcHJvcGVydHksIG9yIGNyZWF0ZSBhIG5ldyBwcm9wZXJ0eSwKLSMgYXBwZW5kIGl0IHRvIHRoZSBlbmQgb2YgdGhlIGZpbGUsIGFuZCBjaGFuZ2UgdGhlIGNvZGUgdG8gdXNlIHRoZSBuZXcgbmFtZS4KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSMgYWJvdXQucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgYWJvdXQuaW5pCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIGZpbGwtaW5zIGFyZSBzdXBwbGllZCBieSBhYm91dC5tYXBwaW5ncwotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0KLWZlYXR1cmVOYW1lPURvY3VtZW50YXRpb24gRVBGCi0KLWZlYXR1cmVUZXh0PURvY3VtZW50YXRpb24gRUZGXG5cCi1cblwKLVZlcnNpb246IHsxfSBcblwKLUxpYmVsbFx1MDBlOSBkZSB2ZXJzaW9uIDogezB9XG5cCi1cblwKLShjKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgYW5kIG90aGVycyAyMDAwLCAyMDA3LiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC5cblwKLVxuCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyAlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUKLSMgVGhlIGFib3ZlIHByb3BlcnRpZXMgaGF2ZSBiZWVuIHNoaXBwZWQgZm9yIHRyYW5zbGF0aW9uLgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kb2MvbmwvaXQvYWJvdXQucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kb2MvbmwvaXQvYWJvdXQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGRkYWNmZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZG9jL25sL2l0L2Fib3V0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSCi0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jIERvIG5vdCBjaGFuZ2UgdGhlIHByb3BlcnRpZXMgYmV0d2VlbiB0aGlzIGxpbmUgYW5kIHRoZSBsYXN0IGxpbmUgY29udGFpbmluZzoKLSMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlCi0jIEluc3RlYWQsIGVpdGhlciByZWRlZmluZSBhbiBleGlzdGluZyBwcm9wZXJ0eSwgb3IgY3JlYXRlIGEgbmV3IHByb3BlcnR5LAotIyBhcHBlbmQgaXQgdG8gdGhlIGVuZCBvZiB0aGUgZmlsZSwgYW5kIGNoYW5nZSB0aGUgY29kZSB0byB1c2UgdGhlIG5ldyBuYW1lLgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotIyBhYm91dC5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBhYm91dC5pbmkKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgZmlsbC1pbnMgYXJlIHN1cHBsaWVkIGJ5IGFib3V0Lm1hcHBpbmdzCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLQotZmVhdHVyZU5hbWU9RG9jdW1lbnRhemlvbmUgRVBGCi0KLWZlYXR1cmVUZXh0PURvY3VtZW50YXppb25lIEVQRlxuXAotXG5cCi1WZXJzaW9uZTogezF9IFxuXAotRXRpY2hldHRhIGJ1aWxkOiB7MH1cblwKLVxuXAotKGMpIENvcHlyaWdodCBjb250cmlidXRvciBFY2xpcHNlIGUgYWx0cmkgMjAwMCwgMjAwNy4gIFR1dHRpIGkgZGlyaXR0aSByaXNlcnZhdGkuXG5cCi1cbgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlCi0jIFRoZSBhYm92ZSBwcm9wZXJ0aWVzIGhhdmUgYmVlbiBzaGlwcGVkIGZvciB0cmFuc2xhdGlvbi4KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZG9jL25sL2phL2Fib3V0LnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZG9jL25sL2phL2Fib3V0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyYjNiZmMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRvYy9ubC9qYS9hYm91dC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUgotCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyBEbyBub3QgY2hhbmdlIHRoZSBwcm9wZXJ0aWVzIGJldHdlZW4gdGhpcyBsaW5lIGFuZCB0aGUgbGFzdCBsaW5lIGNvbnRhaW5pbmc6Ci0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQotIyBJbnN0ZWFkLCBlaXRoZXIgcmVkZWZpbmUgYW4gZXhpc3RpbmcgcHJvcGVydHksIG9yIGNyZWF0ZSBhIG5ldyBwcm9wZXJ0eSwKLSMgYXBwZW5kIGl0IHRvIHRoZSBlbmQgb2YgdGhlIGZpbGUsIGFuZCBjaGFuZ2UgdGhlIGNvZGUgdG8gdXNlIHRoZSBuZXcgbmFtZS4KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSMgYWJvdXQucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgYWJvdXQuaW5pCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIGZpbGwtaW5zIGFyZSBzdXBwbGllZCBieSBhYm91dC5tYXBwaW5ncwotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0KLWZlYXR1cmVOYW1lPUVQRiBEb2N1bWVudGF0aW9uCi0KLWZlYXR1cmVUZXh0PUVQRiBcdThjYzdcdTY1OTlcblwKLVxuXAotXHUzMGQwXHUzMGZjXHUzMGI4XHUzMGU3XHUzMGYzOiB7MX0gXG5cCi1cdTMwZDNcdTMwZWJcdTMwYzlcdTMwZmJcdTMwZTlcdTMwZDlcdTMwZWI6IHswfVxuXAotXG5cCi0oYykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIGFuZCBvdGhlcnMgMjAwMCwgMjAwNy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG5cCi1cbgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlCi0jIFRoZSBhYm92ZSBwcm9wZXJ0aWVzIGhhdmUgYmVlbiBzaGlwcGVkIGZvciB0cmFuc2xhdGlvbi4KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZG9jL25sL2tvL2Fib3V0LnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZG9jL25sL2tvL2Fib3V0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2ZTBhZTcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRvYy9ubC9rby9hYm91dC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUgotCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyBEbyBub3QgY2hhbmdlIHRoZSBwcm9wZXJ0aWVzIGJldHdlZW4gdGhpcyBsaW5lIGFuZCB0aGUgbGFzdCBsaW5lIGNvbnRhaW5pbmc6Ci0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQotIyBJbnN0ZWFkLCBlaXRoZXIgcmVkZWZpbmUgYW4gZXhpc3RpbmcgcHJvcGVydHksIG9yIGNyZWF0ZSBhIG5ldyBwcm9wZXJ0eSwKLSMgYXBwZW5kIGl0IHRvIHRoZSBlbmQgb2YgdGhlIGZpbGUsIGFuZCBjaGFuZ2UgdGhlIGNvZGUgdG8gdXNlIHRoZSBuZXcgbmFtZS4KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSMgYWJvdXQucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgYWJvdXQuaW5pCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIGZpbGwtaW5zIGFyZSBzdXBwbGllZCBieSBhYm91dC5tYXBwaW5ncwotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0KLWZlYXR1cmVOYW1lPUVQRiBcdWJiMzhcdWMxMWMKLQotZmVhdHVyZVRleHQ9RVBGIFx1YmIzOFx1YzExY1xuXAotXG5cCi1cdWJjODRcdWM4MDQ6IHsxfSBcblwKLVx1YmU0Y1x1YjRkYyBcdWI4MDhcdWM3NzRcdWJlMTQ6IHswfVxuXAotXG5cCi0oYykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIGFuZCBvdGhlcnMgMjAwMCwgMjAwNy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG5cCi1cbgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlCi0jIFRoZSBhYm92ZSBwcm9wZXJ0aWVzIGhhdmUgYmVlbiBzaGlwcGVkIGZvciB0cmFuc2xhdGlvbi4KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZG9jL25sL3B0L0JSL2Fib3V0LnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZG9jL25sL3B0L0JSL2Fib3V0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4NzdmNzcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRvYy9ubC9wdC9CUi9hYm91dC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUgotCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyBEbyBub3QgY2hhbmdlIHRoZSBwcm9wZXJ0aWVzIGJldHdlZW4gdGhpcyBsaW5lIGFuZCB0aGUgbGFzdCBsaW5lIGNvbnRhaW5pbmc6Ci0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQotIyBJbnN0ZWFkLCBlaXRoZXIgcmVkZWZpbmUgYW4gZXhpc3RpbmcgcHJvcGVydHksIG9yIGNyZWF0ZSBhIG5ldyBwcm9wZXJ0eSwKLSMgYXBwZW5kIGl0IHRvIHRoZSBlbmQgb2YgdGhlIGZpbGUsIGFuZCBjaGFuZ2UgdGhlIGNvZGUgdG8gdXNlIHRoZSBuZXcgbmFtZS4KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSMgYWJvdXQucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgYWJvdXQuaW5pCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIGZpbGwtaW5zIGFyZSBzdXBwbGllZCBieSBhYm91dC5tYXBwaW5ncwotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0KLWZlYXR1cmVOYW1lPURvY3VtZW50YVx1MDBlN1x1MDBlM28gZG8gRVBGCi0KLWZlYXR1cmVUZXh0PURvY3VtZW50YVx1MDBlN1x1MDBlM28gZG8gRVBGXG5cCi1cblwKLVZlcnNcdTAwZTNvOiB7MX0gXG5cCi1Db25zdHJ1XHUwMGU3XHUwMGUzbzogezB9XG5cCi1cblwKLShjKSBDb3B5cmlnaHQgY29udHJpYnVpZG9yZXMgRWNsaXBzZSBlIG91dHJvcyAyMDAwLCAyMDA3LiBUb2RvcyBvcyBEaXJlaXRvcyBSZXNlcnZhZG9zLlxuXAotXG4KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQotIyBUaGUgYWJvdmUgcHJvcGVydGllcyBoYXZlIGJlZW4gc2hpcHBlZCBmb3IgdHJhbnNsYXRpb24uCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRvYy9ubC9ydS9hYm91dC5wcm9wZXJ0aWVzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRvYy9ubC9ydS9hYm91dC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMTM3ODRlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kb2MvbmwvcnUvYWJvdXQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgRG8gbm90IGNoYW5nZSB0aGUgcHJvcGVydGllcyBiZXR3ZWVuIHRoaXMgbGluZSBhbmQgdGhlIGxhc3QgbGluZSBjb250YWluaW5nOgotIyAlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUKLSMgSW5zdGVhZCwgZWl0aGVyIHJlZGVmaW5lIGFuIGV4aXN0aW5nIHByb3BlcnR5LCBvciBjcmVhdGUgYSBuZXcgcHJvcGVydHksCi0jIGFwcGVuZCBpdCB0byB0aGUgZW5kIG9mIHRoZSBmaWxlLCBhbmQgY2hhbmdlIHRoZSBjb2RlIHRvIHVzZSB0aGUgbmV3IG5hbWUuCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0jIGFib3V0LnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGFib3V0LmluaQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBmaWxsLWlucyBhcmUgc3VwcGxpZWQgYnkgYWJvdXQubWFwcGluZ3MKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotCi1mZWF0dXJlTmFtZT1cdTA0MTRcdTA0M2VcdTA0M2FcdTA0NDNcdTA0M2NcdTA0MzVcdTA0M2RcdTA0NDJcdTA0MzBcdTA0NDZcdTA0MzhcdTA0NGYgRVBGCi0KLWZlYXR1cmVUZXh0PVx1MDQxNFx1MDQzZVx1MDQzYVx1MDQ0M1x1MDQzY1x1MDQzNVx1MDQzZFx1MDQ0Mlx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQ0ZiBFUEZcblwKLVxuXAotXHUwNDEyXHUwNDM1XHUwNDQwXHUwNDQxXHUwNDM4XHUwNDRmOiB7MX0gXG5cCi1cdTA0MWFcdTA0M2VcdTA0M2NcdTA0M2ZcdTA0M2VcdTA0M2RcdTA0M2VcdTA0MzJcdTA0M2FcdTA0MzA6IHswfVxuXAotXG5cCi0oYykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIGFuZCBvdGhlcnMgMjAwMCwgMjAwNy4gIFx1MDQxMlx1MDQ0MVx1MDQzNSBcdTA0M2ZcdTA0NDBcdTA0MzBcdTA0MzJcdTA0MzAgXHUwNDM3XHUwNDMwXHUwNDQ5XHUwNDM4XHUwNDQ5XHUwNDM1XHUwNDNkXHUwNDRiLlxuXAotXG4KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQotIyBUaGUgYWJvdmUgcHJvcGVydGllcyBoYXZlIGJlZW4gc2hpcHBlZCBmb3IgdHJhbnNsYXRpb24uCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRvYy9ubC96aC9DTi9hYm91dC5wcm9wZXJ0aWVzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRvYy9ubC96aC9DTi9hYm91dC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZGVkMDczLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kb2MvbmwvemgvQ04vYWJvdXQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgRG8gbm90IGNoYW5nZSB0aGUgcHJvcGVydGllcyBiZXR3ZWVuIHRoaXMgbGluZSBhbmQgdGhlIGxhc3QgbGluZSBjb250YWluaW5nOgotIyAlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUKLSMgSW5zdGVhZCwgZWl0aGVyIHJlZGVmaW5lIGFuIGV4aXN0aW5nIHByb3BlcnR5LCBvciBjcmVhdGUgYSBuZXcgcHJvcGVydHksCi0jIGFwcGVuZCBpdCB0byB0aGUgZW5kIG9mIHRoZSBmaWxlLCBhbmQgY2hhbmdlIHRoZSBjb2RlIHRvIHVzZSB0aGUgbmV3IG5hbWUuCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0jIGFib3V0LnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGFib3V0LmluaQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBmaWxsLWlucyBhcmUgc3VwcGxpZWQgYnkgYWJvdXQubWFwcGluZ3MKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotCi1mZWF0dXJlTmFtZT1FUEYgXHU2NTg3XHU2ODYzCi0KLWZlYXR1cmVUZXh0PUVQRiBcdTY1ODdcdTY4NjNcblwKLVxuXAotXHU3MjQ4XHU2NzJjXHVmZjFhezF9IFxuXAotXHU1ZGU1XHU0ZjVjXHU3MjQ4XHU2NzJjXHU2ODA3XHU3YjdlXHVmZjFhezB9XG5cCi1cblwKLShjKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgYW5kIG90aGVycyAyMDAwLCAyMDA3LiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiBcbgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlCi0jIFRoZSBhYm92ZSBwcm9wZXJ0aWVzIGhhdmUgYmVlbiBzaGlwcGVkIGZvciB0cmFuc2xhdGlvbi4KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZG9jL25sL3poL1RXL2Fib3V0LnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZG9jL25sL3poL1RXL2Fib3V0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2YTBkNjAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRvYy9ubC96aC9UVy9hYm91dC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUgotCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyBEbyBub3QgY2hhbmdlIHRoZSBwcm9wZXJ0aWVzIGJldHdlZW4gdGhpcyBsaW5lIGFuZCB0aGUgbGFzdCBsaW5lIGNvbnRhaW5pbmc6Ci0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQotIyBJbnN0ZWFkLCBlaXRoZXIgcmVkZWZpbmUgYW4gZXhpc3RpbmcgcHJvcGVydHksIG9yIGNyZWF0ZSBhIG5ldyBwcm9wZXJ0eSwKLSMgYXBwZW5kIGl0IHRvIHRoZSBlbmQgb2YgdGhlIGZpbGUsIGFuZCBjaGFuZ2UgdGhlIGNvZGUgdG8gdXNlIHRoZSBuZXcgbmFtZS4KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSMgYWJvdXQucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgYWJvdXQuaW5pCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIGZpbGwtaW5zIGFyZSBzdXBwbGllZCBieSBhYm91dC5tYXBwaW5ncwotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0KLWZlYXR1cmVOYW1lPUVQRiBEb2N1bWVudGF0aW9uCi0KLWZlYXR1cmVUZXh0PUVQRiBcdTY1ODdcdTRlZjZcblwKLVxuXAotXHU3MjQ4XHU2NzJjXHVmZjFhezF9XG5cCi1cdTVlZmFcdTdmNmVcdTZhMTlcdTdjNjRcdWZmMWF7MH1cblwKLVxuXAotKGMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyBhbmQgb3RoZXJzIDIwMDAsIDIwMDcuICBBbGwgUmlnaHRzIFJlc2VydmVkLlxuXAotXG4KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQotIyBUaGUgYWJvdmUgcHJvcGVydGllcyBoYXZlIGJlZW4gc2hpcHBlZCBmb3IgdHJhbnNsYXRpb24uCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRvYy9wbHVnaW4ucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kb2MvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhN2EzNjQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRvYy9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSCi0KLSMgUGx1Zy1pbgotZmVhdHVyZVBsdWdpbk5hbWU9RVBGIERvY3VtZW50YXRpb24gRmVhdHVyZQotI2ZlYXR1cmVQbHVnaW5OYW1lTkw9RVBGIERvY3VtZW50YXRpb24gRmVhdHVyZSAoTkxTKQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AudWkvLmNsYXNzcGF0aCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLnVpLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1MWM4ZjIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AudWkvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLnVpLy5vcHRpb25zIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AudWkvLm9wdGlvbnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmMjc0ZWMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AudWkvLm9wdGlvbnMKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLSMgVHVybiBvbiBkZWJ1ZyB0cmFjZSBmb3IgdGhlIFJpY2ggVGV4dCBwbHVnLWluCi1vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC9kZWJ1Zz10cnVlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC51aS8ucHJvamVjdCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLnVpLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YTRiZmE4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLnVpLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AudWk8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC51aS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTYxN2YwNy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC51aS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC51aTsgc2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS41LjAucXVhbGlmaWVyCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC51aS5FeHBvcnRNU1BVSVBsdWdpbgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLAotIG9yZy5lY2xpcHNlLmVwZi5leHBvcnQ7dmlzaWJpbGl0eTo9cmVleHBvcnQsCi0gb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3A7dmlzaWJpbGl0eTo9cmVleHBvcnQsCi0gb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWk7dmlzaWJpbGl0eTo9cmVleHBvcnQsCi0gb3JnLmVjbGlwc2UudWksCi0gb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aQotRWNsaXBzZS1MYXp5U3RhcnQ6IHRydWUKLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUJ1bmRsZS1DbGFzc1BhdGg6IGV4cG9ydG1zcHVpLmphcgotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLnVpLAotIG9yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLnVpLnByZWZlcmVuY2VzLAotIG9yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLnVpLndpemFyZHMKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AudWkvYnVpbGQucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLnVpL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyZDQzYzAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AudWkvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLXNvdXJjZS5leHBvcnRtc3B1aS5qYXIgPSBzcmMvCi1vdXRwdXQuZXhwb3J0bXNwdWkuamFyID0gYmluLwotYmluLmluY2x1ZGVzID0gZXhwb3J0bXNwdWkuamFyLFwKLSAgICAgICAgICAgICAgIGljb25zLyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBzY2hlbWEvLFwKLSAgICAgICAgICAgICAgIC5vcHRpb25zCi0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLnVpL2ljb25zL2V0b29sMTYvZXhwX21zX3Byai5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC51aS9pY29ucy9ldG9vbDE2L2V4cF9tc19wcmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOTk4ZDMwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLnVpL2ljb25zL2V0b29sMTYvZXhwX21zX3Byai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC51aS9pY29ucy9mdWxsL3dpemJhbi9leHBfbXNfcHJqX3dpemJhbi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC51aS9pY29ucy9mdWxsL3dpemJhbi9leHBfbXNfcHJqX3dpemJhbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxODU4OWYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AudWkvaWNvbnMvZnVsbC93aXpiYW4vZXhwX21zX3Byal93aXpiYW4uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AudWkvcGx1Z2luLnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC51aS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2U2NGVkZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC51aS9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSCi0KLSMgUGx1Zy1pbgotcGx1Z2luTmFtZT1FUEYgRXhwb3J0IE1pY3Jvc29mdCBQcm9qZWN0Ci1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKLQotIyBXaXphcmRzCi1leHBvcnRQcm9qZWN0VGVtcGxhdGVXaXphcmROYW1lPU1pY3Jvc29mdCBQcm9qZWN0Ci1leHBvcnRQcm9qZWN0VGVtcGxhdGVXaXphcmREZXNjcmlwdGlvbj1FeHBvcnQgYSBwcm9jZXNzIHRvIGEgTWljcm9zb2Z0IFByb2plY3QuCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC51aS9wbHVnaW4ueG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AudWkvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzlkMDkzMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC51aS9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTxwbHVnaW4+Ci0KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5leHBvcnRXaXphcmRzIj4KLSAgICAgIDx3aXphcmQKLSAgICAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5lcGYudWkuZXhwb3J0V2l6YXJkcy5jYXRlZ29yeSIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC51aS53aXphcmRzLkV4cG9ydE1TUFdpemFyZCIKLSAgICAgICAgICAgIGljb249Imljb25zL2V0b29sMTYvZXhwX21zX3Byai5naWYiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AudWkud2l6YXJkcy5FeHBvcnRNU1BXaXphcmQiCi0gICAgICAgICAgICBuYW1lPSIlZXhwb3J0UHJvamVjdFRlbXBsYXRlV2l6YXJkTmFtZSI+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAlZXhwb3J0UHJvamVjdFRlbXBsYXRlV2l6YXJkRGVzY3JpcHRpb24KLSAgICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICA8L3dpemFyZD4KLSAgIDwvZXh0ZW5zaW9uPgotICAgCi0gICA8ZXh0ZW5zaW9uLXBvaW50Ci0gICAgICAgICBpZD0iZXhwb3J0TVNQV2l6YXJkIgotICAgICAgICAgbmFtZT0iRXhwb3J0IE1pY3Jvc29mdCBQcm9qZWN0IFdpemFyZCBFeHRlbnNpb24iCi0gICAgICAgICBzY2hlbWE9InNjaGVtYS9FeHBvcnRNU1BXaXphcmQuZXhzZCIgLz4KLQotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmVwZi51aS5leHBvcnRXaXphcmRzIj4KLSAgICAgIDx3aXphcmQgaWQ9Im9yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLnVpLndpemFyZHMuRXhwb3J0TVNQV2l6YXJkIi8+Ci0gICA8L2V4dGVuc2lvbj4KLQotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC51aS9zY2hlbWEvRXhwb3J0TVNQV2l6YXJkLmV4c2QgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC51aS9zY2hlbWEvRXhwb3J0TVNQV2l6YXJkLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5ZjlhM2QuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AudWkvc2NoZW1hL0V4cG9ydE1TUFdpemFyZC5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTU1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLnVpIj4KLTxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC51aSIgaWQ9ImV4cG9ydE1TUFdpemFyZCIgbmFtZT0iRXhwb3J0IE1pY3Jvc29mdCBQcm9qZWN0IFdpemFyZCBFeHRlbnNpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgRW5hYmxlcyBhIHBsdWctaW4gdG8gZXh0ZW5kIHRoZSBFeHBvcnQgTWljcm9zb2Z0IFByb2plY3Qgd2l6YXJkIGJ5IHJlcGxhY2luZyBleGlzdGluZyB3aXphcmQgcGFnZXMgb3IgYWRkaW5nIG5ldyBvbmVzLgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJ3aXphcmRFeHRlbmRlciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIEEgZnVsbHkgcXVhbGlmaWVkIGlkZW50aWZpZXIgb2YgdGhlIHRhcmdldCBleHRlbnNpb24gcG9pbnQuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgQW4gb3B0aW9uYWwgaWRlbnRpZmllciBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgQW4gb3B0aW9uYWwgbmFtZSBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJ3aXphcmRFeHRlbmRlciI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9IndpemFyZFBhZ2UiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSBKYXZhIGNsYXNzIHRoYXQgaW1wbGVtZW50cyB0aGUgd2l6YXJkIGV4dGVuZGVyLiBUaGlzIGNsYXNzIG11c3QgaW1wbGVtZW50cyAmbHQ7Y29kZSZndDtvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS53aXphcmRzLklQdWJsaXNoQ29uZmlnV2l6YXJkRXh0ZW5kZXImbHQ7L2NvZGUmZ3Q7LgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJ3aXphcmRQYWdlIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhlIEphdmEgY2xhc3MgdGhhdCBpbXBsZW1lbnRzIHRoZSB3aXphcmQgcGFnZS4gVGhpcyBjbGFzcyBtdXN0IGltcGxlbWVudHMgJmx0O2NvZGUmZ3Q7b3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmRQYWdlJmx0Oy9jb2RlJmd0Oy4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ0eXBlIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSB0eXBlIG9mIGV4dGVuc2lvbiAtICZxdW90O3JlcGxhY2UmcXVvdDsgb3IgJnF1b3Q7bmV3JnF1b3Q7LgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InRhcmdldCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgbmFtZSBvZiB0aGUgYmFzZSB3aXphcmQgcGFnZSB0byBiZSByZXBsYWNlZCBvciB1c2VkIGFzIGEgcmVmZXJlbmNlIGZvciBpbnNlcnRpbmcgYSBuZXcgd2l6YXJkIHBhZ2UuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaW5zZXJ0IiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSBpbnNlcnRpb24gdHlwZSBmb3IgYSBuZXcgd2l6YXJkIHBhZ2UgLSAmcXVvdDtiZWZvcmUmcXVvdDsgb3IgJnF1b3Q7YWZ0ZXImcXVvdDsuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIDEuMgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBUaGUgZm9sbG93aW5nIGlzIGFuIGV4YW1wbGUgb2YgaG93IHRoZSBleHRlbnNpb24gcG9pbnQgY2FuIGJlIHVzZWQ6IAotJmx0O3AmZ3Q7Ci0mbHQ7cHJlJmd0OwotICAgJmx0O2V4dGVuc2lvbiBwb2ludD0mcXVvdDtvcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC51aS5leHBvcnRNU1BXaXphcmQmcXVvdDsmZ3Q7Ci0gICAgICAmbHQ7d2l6YXJkCi0gICAgICAgICAgICBjbGFzcz0mcXVvdDtvcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC51aS53aXphcmRzLk15RXhwb3J0TVNQV2l6YXJkJnF1b3Q7Jmd0OwotICAgICAgICAgJmx0O3dpemFyZFBhZ2UKLSAgICAgICAgICAgICAgIGNsYXNzPSZxdW90O29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLnVpLndpemFyZHMuTXlTZWxlY3RQcm9jZXNzUGFnZSZxdW90OwotICAgICAgICAgICAgICAgdHlwZT0mcXVvdDtyZXBsYWNlJnF1b3Q7Ci0gICAgICAgICAgICAgICB0YXJnZXQ9JnF1b3Q7b3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AudWkud2l6YXJkcy5TZWxlY3RQcm9jZXNzUGFnZSZxdW90Oy8mZ3Q7Ci0gICAgICAgICAmbHQ7d2l6YXJkUGFnZQotICAgICAgICAgICAgICAgY2xhc3M9JnF1b3Q7b3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AudWkud2l6YXJkcy5NeU5ld1dpemFyZFBhZ2UmcXVvdDsKLSAgICAgICAgICAgICAgIHR5cGU9JnF1b3Q7bmV3JnF1b3Q7Ci0gICAgICAgICAgICAgICB0YXJnZXQ9JnF1b3Q7b3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AudWkud2l6YXJkcy5TZWxlY3RQdWJsaXNoT3B0aW9uc1Byb2Nlc3NQYWdlJnF1b3Q7Ci0gICAgICAgICAgICAgICBpbnNlcnQ9JnF1b3Q7YWZ0ZXImcXVvdDsvJmd0OyAgICAgICAgICAgICAgICAgICAgIAotICAgICAgJmx0Oy93aXphcmQmZ3Q7Ci0gICAmbHQ7L2V4dGVuc2lvbiZndDsKLSZsdDsvcHJlJmd0OwotJmx0Oy9wJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4mbHQ7YnImZ3Q7Ci1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAmbHQ7YSAKLWhyZWY9JnF1b3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmcXVvdDsmZ3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmbHQ7L2EmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvbXNwL3VpL0V4cG9ydE1TUFVJUGx1Z2luLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9tc3AvdWkvRXhwb3J0TVNQVUlQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmNmNjMzYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9tc3AvdWkvRXhwb3J0TVNQVUlQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS5BYnN0cmFjdFBsdWdpbjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotLyoqCi0gKiBUaGUgRXhwb3J0IE1pY3Jvc29mdCBQcm9qZWN0IFVJIHBsdWctaW4gY2xhc3MuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRXhwb3J0TVNQVUlQbHVnaW4gZXh0ZW5kcyBBYnN0cmFjdFBsdWdpbiB7Ci0KLQkvLyBUaGUgc2hhcmVkIGluc3RhbmNlLgotCXByaXZhdGUgc3RhdGljIEV4cG9ydE1TUFVJUGx1Z2luIHBsdWdpbjsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIEV4cG9ydE1TUFVJUGx1Z2luKCkgewotCQlzdXBlcigpOwotCQlwbHVnaW4gPSB0aGlzOwotCX0KLQotCS8qKgotCSAqIEBzZWUgQWJzdHJhY3RQbHVnaW4jc3RhcnQoQnVuZGxlQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdGFydChjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIEFic3RyYWN0UGx1Z2luI3N0b3AoQnVuZGxlQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0b3AoY29udGV4dCk7Ci0JCXBsdWdpbiA9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2hhcmVkIGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgRXhwb3J0TVNQVUlQbHVnaW4gZ2V0RGVmYXVsdCgpIHsKLQkJcmV0dXJuIHBsdWdpbjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L21zcC91aS9FeHBvcnRNU1BVSVJlc291cmNlcy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvbXNwL3VpL0V4cG9ydE1TUFVJUmVzb3VyY2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwNDFhMGEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvbXNwL3VpL0V4cG9ydE1TUFVJUmVzb3VyY2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLS8qKgotICogVGhlIEV4cG9ydCBNaWNyb3NvZnQgUHJvamVjdCBVSSBtZXNzYWdlIHJlc291cmNlIGJ1bmRsZSBhY2Nlc3NvciBjbGFzcy4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4yCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBFeHBvcnRNU1BVSVJlc291cmNlcyBleHRlbmRzIE5MUyB7Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgQlVORExFX05BTUUgPSBFeHBvcnRNU1BVSVJlc291cmNlcy5jbGFzcy5nZXRQYWNrYWdlKCkKLQkJCS5nZXROYW1lKCkKLQkJCSsgIi5SZXNvdXJjZXMiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIEV4cG9ydE1TUFVJUmVzb3VyY2VzKCkgewotCQkvLyBEbyBub3QgaW5zdGFudGlhdGUKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBleHBvcnRNU1BXaXphcmRfdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzZWxlY3RFeHBvcnRPcHRpb25zV2l6YXJkUGFnZV90aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlbGVjdEV4cG9ydE9wdGlvbnNXaXphcmRQYWdlX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzZWxlY3RlZFByb2Nlc3NMYWJlbF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29uZmlndXJhdGlvbkxhYmVsX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwdWJsaXNoV2ViU2l0ZUNoZWNrQm94X3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwdWJsaXNoQ29uZmlnQnV0dG9uX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwdWJsaXNoUHJvY2Vzc0J1dHRvbl90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXhwb3J0T25seVBsYW5uZWRFbGVtZW50c0NoZWNrQm94X3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzZWxlY3RQdWJsaXNoT3B0aW9uc1dpemFyZFBhZ2VfdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzZWxlY3RQdWJsaXNoT3B0aW9uc1dpemFyZFBhZ2VfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlbGVjdEV4cG9ydERpcldpemFyZFBhZ2VfdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzZWxlY3RFeHBvcnREaXJXaXphcmRQYWdlX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwcm9qZWN0TmFtZUxhYmVsX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkaXJMYWJlbF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgYnJvd3NlQnV0dG9uX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBleHBvcnRNU1BUYXNrX25hbWU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBvdmVyd3JpdGVUZXh0X21zZzsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBtaXNzaW5nUHJvY2Vzc0NvbnRlbnRXYXJuaW5nX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbXBsZXRlZFRleHRfbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXhwb3J0TVNQRXJyb3JfbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXhwb3J0TVNQRXJyb3JfcmVhc29uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXhwb3J0TVNQSW50ZXJuYWxFcnJvcl9tc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBpbGxlZ2FsQXJndW1lbnRfbXNnOwotCi0Jc3RhdGljIHsKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgRXhwb3J0TVNQVUlSZXNvdXJjZXMuY2xhc3MpOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L21zcC91aS9SZXNvdXJjZXMucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L21zcC91aS9SZXNvdXJjZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDZlNmYxZi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9tc3AvdWkvUmVzb3VyY2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSCi0KLSMgRXhwb3J0IE1pY3Jvc29mdCBQcm9qZWN0IFdpemFyZAotZXhwb3J0TVNQV2l6YXJkX3RpdGxlPUV4cG9ydCBNaWNyb3NvZnQgUHJvamVjdAotCi0jIFNlbGVjdCBFeHBvcnQgT3B0aW9ucyBXaXphcmQgUGFnZQotc2VsZWN0RXhwb3J0T3B0aW9uc1dpemFyZFBhZ2VfdGl0bGU9U2VsZWN0IGV4cG9ydCBvcHRpb25zCi1zZWxlY3RFeHBvcnRPcHRpb25zV2l6YXJkUGFnZV90ZXh0PVNlbGVjdCB0aGUgbWV0aG9kIGNvbmZpZ3VyYXRpb24gYW5kIGV4cG9ydCBvcHRpb25zIHRoYXQgd2lsbCBiZSB1c2VkIHRvIGV4cG9ydCB0aGUgc2VsZWN0ZWQgcHJvY2Vzcy4KLXNlbGVjdGVkUHJvY2Vzc0xhYmVsX3RleHQ9U2VsZWN0ZWQgcHJvY2VzczoKLWNvbmZpZ3VyYXRpb25MYWJlbF90ZXh0PU1ldGhvZCBjb25maWd1cmF0aW9uOgotcHVibGlzaFdlYlNpdGVDaGVja0JveF90ZXh0PVB1Ymxpc2ggdGhlIHByb2Nlc3Mgd2Vic2l0ZQotcHVibGlzaENvbmZpZ0J1dHRvbl90ZXh0PVB1Ymxpc2ggdGhlIGVudGlyZSBtZXRob2QgY29uZmlndXJhdGlvbgotcHVibGlzaFByb2Nlc3NCdXR0b25fdGV4dD1QdWJsaXNoIGNvbnRlbnQgdGhhdCBpcyBvbmx5IHJlbGV2YW50IHRvIHRoZSBzZWxlY3RlZCBwcm9jZXNzCi1leHBvcnRPbmx5UGxhbm5lZEVsZW1lbnRzQ2hlY2tCb3hfdGV4dD1FeHBvcnQgb25seSBicmVha2Rvd24gZWxlbWVudHMgdGhhdCBhcmUgcGxhbm5lZAotCi0jIFNlbGVjdCBQdWJsaXNoaW5nIE9wdGlvbnMgV2l6YXJkIFBhZ2UKLXNlbGVjdFB1Ymxpc2hPcHRpb25zV2l6YXJkUGFnZV90aXRsZT1TZWxlY3QgcHVibGlzaGluZyBvcHRpb25zCi1zZWxlY3RQdWJsaXNoT3B0aW9uc1dpemFyZFBhZ2VfdGV4dD1TZWxlY3QgdGhlIHB1Ymxpc2hpbmcgb3B0aW9ucyB0aGF0IHdpbGwgYmUgdXNlZCB0byBwdWJsaXNoIHRoZSB3ZWJzaXRlIGZvciB0aGUgZXhwb3J0ZWQgcHJvY2Vzcy4KLQotIyBTZWxlY3QgRXhwb3J0IERpcmVjdG9yeSBXaXphcmQgcGFnZQotc2VsZWN0RXhwb3J0RGlyV2l6YXJkUGFnZV90aXRsZT1TcGVjaWZ5IHByb2plY3QgbmFtZSBhbmQgZXhwb3J0IGRpcmVjdG9yeQotc2VsZWN0RXhwb3J0RGlyV2l6YXJkUGFnZV90ZXh0PVNwZWNpZnkgdGhlIE1pY3Jvc29mdCBQcm9qZWN0IG5hbWUgYW5kIGV4cG9ydCBkaXJlY3RvcnkuCi1wcm9qZWN0TmFtZUxhYmVsX3RleHQ9TmFtZToKLWRpckxhYmVsX3RleHQ9RGlyZWN0b3J5OgotYnJvd3NlQnV0dG9uX3RleHQ9QnJvd3NlLi4uCi0KLSMgUHJvZ3Jlc3MgTWVzc2FnZXMKLWV4cG9ydE1TUFRhc2tfbmFtZT1FeHBvcnRpbmcgc2VsZWN0ZWQgcHJvY2VzcyB0byBNaWNyb3NvZnQgUHJvamVjdC4uLgotCi0jIFdhcm5pbmcgTWVzc2FnZXMKLW92ZXJ3cml0ZVRleHRfbXNnPUlVUE0wMTAwVzogQSBNaWNyb3NvZnQgUHJvamVjdCAnJ3swfScnIGFscmVhZHkgZXhpc3RzIGluICcnezF9JycuXG5cbkRvIHlvdSB3YW50IHRvIG92ZXJ3cml0ZSBpdD8KLW1pc3NpbmdQcm9jZXNzQ29udGVudFdhcm5pbmdfbXNnPUlVUE0wMTAyVzogVGhlIHB1Ymxpc2hlZCBwcm9jZXNzIHdlYnNpdGUgd2lsbCBub3QgY29udGFpbiBhbnkgY29udGVudCByZWxhdGVkIHRvIHRoZSBleHBvcnRlZCBwcm9jZXNzLlxuXG5EbyB5b3Ugd2FudCB0byBwcm9jZWVkPwotCi0jIEluZm9ybWF0aW9uYWwgTWVzc2FnZXMKLWNvbXBsZXRlZFRleHRfbXNnPUlVUE0wMTAzSTogVGhlIHNlbGVjdGVkIHByb2Nlc3MgJyd7MH0nJyBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgZXhwb3J0ZWQgdG8gTWljcm9zb2Z0IFByb2plY3QgWE1MIGZpbGUgJyd7MX0nJy4KLQotIyBFcnJvciBNZXNzYWdlcwotZXhwb3J0TVNQRXJyb3JfbXNnPUlVUE0wMTA1RTogQW4gZXJyb3IgaGFzIG9jY3VycmVkIHdoaWxlIGV4cG9ydGluZyB0aGUgc2VsZWN0ZWQgcHJvY2VzcyAnJ3swfScnIHRvIE1pY3Jvc29mdCBQcm9qZWN0ICcnezF9JycuCi1leHBvcnRNU1BFcnJvcl9yZWFzb249Q2xpY2sgRGV0YWlscyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLWV4cG9ydE1TUEludGVybmFsRXJyb3JfbXNnPUFuIGludGVybmFsIGVycm9yIGhhcyBvY2N1cnJlZC4KLWlsbGVnYWxBcmd1bWVudF9tc2c9ezB9IHJldHVybnMgYSBudWxsIG9yIGludmFsaWQgdmFsdWUuCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9tc3AvdWkvcGFja2FnZS5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvbXNwL3VpL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjQ2OGFkZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9tc3AvdWkvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgcmVzb3VyY2luZyBzdXBwb3J0IGZvciB0aGUgRXhwb3J0IE1pY3Jvc29mdCBQcm9qZWN0IHdpemFyZC4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9tc3AvdWkvcHJlZmVyZW5jZXMvRXhwb3J0TVNQVUlQcmVmZXJlbmNlcy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvbXNwL3VpL3ByZWZlcmVuY2VzL0V4cG9ydE1TUFVJUHJlZmVyZW5jZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDY3NzgzZi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9tc3AvdWkvcHJlZmVyZW5jZXMvRXhwb3J0TVNQVUlQcmVmZXJlbmNlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjM0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDcgSUJNIENvcnBvcmF0aW9uLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLnVpLnByZWZlcmVuY2VzOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpLnV0aWwuUHJlZmVyZW5jZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5GaWxlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC51aS5FeHBvcnRNU1BVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5wcmVmZXJlbmNlcy5MaWJyYXJ5VUlQcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci0KLS8qKgotICogVGhlIEV4cG9ydCBNaWNyb3NvZnQgUHJvamVjdCBVSSBwcmVmZXJlbmNlcy4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4yCi0gKi8KLXB1YmxpYyBjbGFzcyBFeHBvcnRNU1BVSVByZWZlcmVuY2VzIHsKLQotCS8vIFRoZSBwdWJsaXNoIHdlYiBzaXRlIHByZWZlcmVuY2Uga2V5LgotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQVUJMSVNIX1dFQlNJVEUgPSAicHVibGlzaFdlYlNpdGUiOyAvLyROT04tTkxTLTEkCi0KLQkvLyBUaGUgcHVibGlzaCBjb25maWd1cmF0aW9uIHByZWZlcmVuY2Uga2V5LgotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQVUJMSVNIX0NPTkZJR1VSQVRJT04gPSAicHVibGlzaENvbmZpZ3VyYXRpb24iOyAvLyROT04tTkxTLTEkCi0KLQkvLyBUaGUgZXhwb3J0IG9ubHkgcGxhbm5lZCBXQlMgZWxlbWVudHMgcHJlZmVyZW5jZSBrZXkuCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVYUE9SVF9PTkxZX1BMQU5ORURfV0JTX0VMRU1FTlRTID0gImV4cG9ydE9ubHlQbGFubmVkV0JTRWxlbWVudHMiOyAvLyROT04tTkxTLTEkCi0KLQkvLyBUaGUgcHJvY2VzcyBuYW1lIHByZWZlcmVuY2Uga2V5LgotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9DRVNTX05BTUUgPSAicHJvY2Vzc05hbWUiOyAvLyROT04tTkxTLTEkCi0KLQkvLyBUaGUgbWV0aG9kIGNvbmZpZ3VyYXRpb24gbmFtciBwcmVmZXJlbmNlIGtleS4KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09ORklHVVJBVElPTl9OQU1FID0gImNvbmZpZ3VyYXRpb25OYW1lIjsgLy8kTk9OLU5MUy0xJAotCi0JLy8gVGhlIE1pY3Jvc29mdCBQcm9qZWN0IG5hbWVzIHByZWZlcmVuY2Uga2V5LgotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNU19QUk9KRUNUX05BTUVTID0gIm1zcHJvamVjdE5hbWVzIjsgLy8kTk9OLU5MUy0xJAotCi0JLy8gVGhlIGV4cG9ydCBkaXJlY3RvcmllcyBwcmVmZXJlbmNlIGtleS4KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhQT1JUX0RJUkVDVE9SSUVTID0gImV4cG9ydERpcnMiOyAvLyROT04tTkxTLTEkCi0KLQkvLyBUaGUgZGVmYXVsdCBleHBvcnQgTVNQIGRpcmVjdG9yeSBuYW1lLgotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0VYUE9SVF9ESVJfTkFNRSA9ICJFeHBvcnQiICsgRmlsZVV0aWwuRklMRV9TRVAgKyAiTVNQIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCSAKLQkKLQkvLyBUaGUgcGx1Zy1pbiBzcGVjaWZpYyBwcmVmZXJlbmNlIHN0b3JlLgotCXByaXZhdGUgc3RhdGljIElQcmVmZXJlbmNlU3RvcmUgcHJlZlN0b3JlID0gRXhwb3J0TVNQVUlQbHVnaW4uZ2V0RGVmYXVsdCgpCi0JCQkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0KLQkvLyBUaGUgZGVmYXVsdCBleHBvcnQgTVNQIGRpcmVjdG9yeS4KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZGVmYXVsdEV4cG9ydERpciA9IG51bGw7Ci0JCi0Jc3RhdGljIHsKLQkJcHJlZlN0b3JlLnNldERlZmF1bHQoUFVCTElTSF9XRUJTSVRFLCB0cnVlKTsKLQkJcHJlZlN0b3JlLnNldERlZmF1bHQoUFVCTElTSF9DT05GSUdVUkFUSU9OLCB0cnVlKTsKLQkJcHJlZlN0b3JlLnNldERlZmF1bHQoRVhQT1JUX09OTFlfUExBTk5FRF9XQlNfRUxFTUVOVFMsIGZhbHNlKTsKLQkJcHJlZlN0b3JlLnNldERlZmF1bHQoQ09ORklHVVJBVElPTl9OQU1FLCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJcHJlZlN0b3JlLnNldERlZmF1bHQoUFJPQ0VTU19OQU1FLCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJcHJlZlN0b3JlLnNldERlZmF1bHQoTVNfUFJPSkVDVF9OQU1FUywgIiIpOyAvLyROT04tTkxTLTEkCi0JCXByZWZTdG9yZS5zZXREZWZhdWx0KEVYUE9SVF9ESVJFQ1RPUklFUywgZ2V0RGVmYXVsdEV4cG9ydERpcigpKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBwdWJsaXNoIHdlYiBzaXRlIHByZWZlcmVuY2UgdmFsdWUuCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpcyB0aGUgcHJlZmVyZW5jZSBpcyBzZXQuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGdldFB1Ymxpc2hXZWJTaXRlKCkgewotCQlyZXR1cm4gcHJlZlN0b3JlLmdldEJvb2xlYW4oUFVCTElTSF9XRUJTSVRFKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBwdWJsaXNoIHdlYiBzaXRlIHByZWZlcmVuY2UgdmFsdWUuCi0JICogCi0JICogQHBhcmFtIHZhbHVlCi0JICogICAgICAgICAgICB0aGUgcHJlZmVyZW5jZSB2YWx1ZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRQdWJsaXNoV2ViU2l0ZShib29sZWFuIHZhbHVlKSB7Ci0JCXByZWZTdG9yZS5zZXRWYWx1ZShQVUJMSVNIX1dFQlNJVEUsIHZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBwdWJsaXNoIGNvbmZpZ3VyYXRpb24gcHJlZmVyZW5jZSB2YWx1ZS4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlzIHRoZSBwcmVmZXJlbmNlIGlzIHNldAotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBnZXRQdWJsaXNoQ29uZmlndXJhdGlvbigpIHsKLQkJcmV0dXJuIHByZWZTdG9yZS5nZXRCb29sZWFuKFBVQkxJU0hfQ09ORklHVVJBVElPTik7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgcHVibGlzaCBjb25maWd1cmF0aW9uIHByZWZlcmVuY2UgdmFsdWUuCi0JICogCi0JICogQHBhcmFtIHZhbHVlCi0JICogICAgICAgICAgICB0aGUgcHJlZmVyZW5jZSB2YWx1ZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRQdWJsaXNoQ29uZmlndXJhdGlvbihib29sZWFuIHZhbHVlKSB7Ci0JCXByZWZTdG9yZS5zZXRWYWx1ZShQVUJMSVNIX0NPTkZJR1VSQVRJT04sIHZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBleHBvcnQgb25seSBwbGFubmVkIFdCUyBlbGVtZW50cyBwcmVmZXJlbmNlIHZhbHVlLgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaXMgdGhlIHByZWZlcmVuY2UgaXMgc2V0Ci0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGdldEV4cG9ydE9ubHlQbGFubmVkV0JTRWxlbWVudHMoKSB7Ci0JCXJldHVybiBwcmVmU3RvcmUuZ2V0Qm9vbGVhbihFWFBPUlRfT05MWV9QTEFOTkVEX1dCU19FTEVNRU5UUyk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgZXhwb3J0IG9ubHkgcGxhbm5lZCBXQlMgZWxlbWVudHMgcHJlZmVyZW5jZSB2YWx1ZS4KLQkgKiAKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiAgICAgICAgICAgIHRoZSBwcmVmZXJlbmNlIHZhbHVlCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldEV4cG9ydE9ubHlQbGFubmVkV0JTRWxlbWVudHMoYm9vbGVhbiB2YWx1ZSkgewotCQlwcmVmU3RvcmUuc2V0VmFsdWUoRVhQT1JUX09OTFlfUExBTk5FRF9XQlNfRUxFTUVOVFMsIHZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBwcm9jZXNzIG5hbWUgcHJlZmVyZW5jZSB2YWx1ZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBwcmVmZXJlbmNlIHZhbHVlCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UHJvY2Vzc05hbWUoKSB7Ci0JCXJldHVybiBwcmVmU3RvcmUuZ2V0U3RyaW5nKFBST0NFU1NfTkFNRSk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgcHJvY2VzcyBuYW1lIHByZWZlcmVuY2UgdmFsdWUuCi0JICogCi0JICogQHBhcmFtIHZhbHVlCi0JICogICAgICAgICAgICB0aGUgcHJlZmVyZW5jZSB2YWx1ZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRQcm9jZXNzTmFtZShTdHJpbmcgdmFsdWUpIHsKLQkJcHJlZlN0b3JlLnNldFZhbHVlKFBST0NFU1NfTkFNRSwgdmFsdWUpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIG1ldGhvZCBjb25maWd1cmF0aW9uIG5hbWUgcHJlZmVyZW5jZSB2YWx1ZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBwcmVmZXJlbmNlIHZhbHVlCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0Q29uZmlndXJhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBwcmVmU3RvcmUuZ2V0U3RyaW5nKENPTkZJR1VSQVRJT05fTkFNRSk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgbWV0aG9kIGNvbmZpZ3VyYXRpb24gbmFtZSBwcmVmZXJlbmNlIHZhbHVlLgotCSAqIAotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgdGhlIHByZWZlcmVuY2UgdmFsdWUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0Q29uZmlndXJhdGlvbk5hbWUoU3RyaW5nIHZhbHVlKSB7Ci0JCXByZWZTdG9yZS5zZXRWYWx1ZShDT05GSUdVUkFUSU9OX05BTUUsIHZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBNaWNyb3NvZnQgUHJvamVjdCBuYW1lcyBwcmVmZXJlbmNlIHZhbHVlLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHByZWZlcmVuY2UgdmFsdWUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZ1tdIGdldE1TUHJvamVjdE5hbWVzKCkgewotCQlyZXR1cm4gUHJlZmVyZW5jZVV0aWwuZ2V0U3RyaW5nVmFsdWVzKHByZWZTdG9yZSwgTVNfUFJPSkVDVF9OQU1FUyk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgTWljcm9zb2Z0IFByb2plY3QgbmFtZXMgcHJlZmVyZW5jZSB2YWx1ZS4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgY29sbGVjdGlvbiBvZiBNaWNyb3NvZnQgUHJvamVjdCBuYW1lcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdDxTdHJpbmc+IGdldE1TUHJvamVjdE5hbWVzTGlzdCgpIHsKLQkJcmV0dXJuIFByZWZlcmVuY2VVdGlsLmdldExpc3QocHJlZlN0b3JlLCBNU19QUk9KRUNUX05BTUVTKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIGEgTWljcm9zb2Z0IFByb2plY3QgbmFtZSB0byB0aGUgTWljcm9zb2Z0IFByb2plY3QgbmFtZXMgcHJlZmVyZW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gbmFtZQotCSAqICAgICAgICAgICAgYSB0ZW1wbGF0ZSBuYW1lCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGFkZE1TUHJvamVjdE5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJUHJlZmVyZW5jZVV0aWwuYWRkVG9MaXN0KHByZWZTdG9yZSwgTVNfUFJPSkVDVF9OQU1FUywgbmFtZSk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgZGVmYXVsdCBleHBvcnQgTVNQIGRpcmVjdG9yeS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBkZWZhdWx0IGV4cG9ydCBNU1AgZGlyZWN0b3J5Ci0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RGVmYXVsdEV4cG9ydERpcigpIHsKLQkJaWYgKGRlZmF1bHRFeHBvcnREaXIgPT0gbnVsbCkgewotCQkJZGVmYXVsdEV4cG9ydERpciA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgidXNlci5ob21lIik7IC8vJE5PTi1OTFMtMSQKLQkJCVN0cmluZyBhcHBOYW1lID0gTGlicmFyeVVJUHJlZmVyZW5jZXMuZ2V0QXBwbGljYXRpb25TaG9ydE5hbWUoKTsKLQkJCWlmIChhcHBOYW1lICE9IG51bGwgJiYgYXBwTmFtZS5sZW5ndGgoKSA+IDApIHsKLQkJCQlkZWZhdWx0RXhwb3J0RGlyID0gZGVmYXVsdEV4cG9ydERpciArIEZpbGVVdGlsLkZJTEVfU0VQCi0JCQkJCQkrIGFwcE5hbWUgKyBGaWxlVXRpbC5GSUxFX1NFUCArIERFRkFVTFRfRVhQT1JUX0RJUl9OQU1FOwotCQkJfSBlbHNlIHsKLQkJCQlkZWZhdWx0RXhwb3J0RGlyID0gZGVmYXVsdEV4cG9ydERpciArIEZpbGVVdGlsLkZJTEVfU0VQCi0JCQkJCQkrIERFRkFVTFRfRVhQT1JUX0RJUl9OQU1FOwotCQkJfQotCQl9Ci0JCXJldHVybiBkZWZhdWx0RXhwb3J0RGlyOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGV4cG9ydCBkaXJlY3RvcmllcyBwcmVmZXJlbmNlIHZhbHVlLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHByZWZlcmVuY2UgdmFsdWUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZ1tdIGdldEV4cG9ydERpcmVjdG9yaWVzKCkgewotCQlyZXR1cm4gUHJlZmVyZW5jZVV0aWwuZ2V0U3RyaW5nVmFsdWVzKHByZWZTdG9yZSwgRVhQT1JUX0RJUkVDVE9SSUVTKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBleHBvcnQgZGlyZWN0b3JpZXMgcHJlZmVyZW5jZSB2YWx1ZS4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgY29sbGVjdGlvbiBvZiBleHBvcnQgZGlyZWN0b3JpZXMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3Q8U3RyaW5nPiBnZXRFeHBvcnREaXJlY3Rvcmllc0xpc3QoKSB7Ci0JCXJldHVybiBQcmVmZXJlbmNlVXRpbC5nZXRMaXN0KHByZWZTdG9yZSwgRVhQT1JUX0RJUkVDVE9SSUVTKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIGEgZXhwb3J0IGRpcmVjdG9yeSB0byB0aGUgZXhwb3J0IGRpcmVjdG9yaWVzIHByZWZlcmVuY2UuCi0JICogCi0JICogQHBhcmFtIGRpcgotCSAqICAgICAgICAgICAgYW4gZXhwb3J0IGRpcmVjdG9yeQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBhZGRFeHBvcnREaXIoU3RyaW5nIGRpcikgewotCQlQcmVmZXJlbmNlVXRpbC5hZGRUb0xpc3QocHJlZlN0b3JlLCBFWFBPUlRfRElSRUNUT1JJRVMsIGRpcik7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9tc3AvdWkvcHJlZmVyZW5jZXMvcGFja2FnZS5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvbXNwL3VpL3ByZWZlcmVuY2VzL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2ViZjgwMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9tc3AvdWkvcHJlZmVyZW5jZXMvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgcHJlZmVyZW5jZSBzdXBwb3J0IGZvciB0aGUgRXhwb3J0IE1pY3Jvc29mdCBQcm9qZWN0IHdpemFyZC4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9tc3AvdWkvd2l6YXJkcy9FeHBvcnRNU1BXaXphcmQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L21zcC91aS93aXphcmRzL0V4cG9ydE1TUFdpemFyZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOWU2ZWI4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L21zcC91aS93aXphcmRzL0V4cG9ydE1TUFdpemFyZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzU3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLnVpLndpemFyZHM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC5FeHBvcnRNU1BPcHRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLkV4cG9ydE1TUFNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AuRXhwb3J0TVNQU2VydmljZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC5JRXhwb3J0TVNQU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC51aS5FeHBvcnRNU1BVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC51aS5FeHBvcnRNU1BVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS53aXphcmRzLlNlbGVjdFByb2Nlc3NQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnNlcnZpY2VzLlB1Ymxpc2hPcHRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnV0aWwuUHVibGlzaGluZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVpLndpemFyZHMuQmFzZVdpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFeHBvcnRXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLQotLyoqCi0gKiBUaGUgRXhwb3J0IE1pY3Jvc29mdCBQcm9qZWN0IHdpemFyZC4KLSAqIDxwPgotICogVGhpcyB3aXphcmQgZXhwb3J0cyBhIGNhcGFiaWxpdHkgcGF0dGVybiBvciBkZWxpdmVyeSBwcm9jZXNzIHRvIGEgTWljcm9zb2Z0Ci0gKiBQcm9qZWN0LiBUaGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiBnZW5lcmF0ZXMgYSBYTUwgZmlsZSB0aGF0IGFkaGVyZXMgdG8gdGhlCi0gKiBNaWNyb3NvZnQgUHJvamVjdCAyMDAzIFhNTCBTY2hlbWEuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRXhwb3J0TVNQV2l6YXJkIGV4dGVuZHMgQmFzZVdpemFyZCBpbXBsZW1lbnRzIElFeHBvcnRXaXphcmQgewotCi0JLyoqCi0JICogVGhlIHdpemFyZCBJRC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXSVpBUkRfSUQgPSBFeHBvcnRNU1BXaXphcmQuY2xhc3MuZ2V0TmFtZSgpOwotCi0JLyoqCi0JICogVGhlIFB1Ymxpc2ggQ29uZmlndXJhdGlvbiB3aXphcmQgZXh0ZW5zaW9uIHBvaW50IElELgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdJWkFSRF9FWFRFTlNJT05fUE9JTlRfSUQgPSAib3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AudWkuZXhwb3J0TVNQV2l6YXJkIjsgLy8kTk9OLU5MUy0xJAkKLQotCS8vIFRoZSB3aXphcmQgcGFnZSB0aGF0IHByb21wdHMgdGhlIHVzZXIgdG8gc2VsZWN0IGEgcHJvY2Vzcy4KLQlwcm90ZWN0ZWQgU2VsZWN0UHJvY2Vzc1BhZ2Ugc2VsZWN0UHJvY2Vzc1BhZ2U7Ci0KLQkvLyBUaGUgd2l6YXJkIHBhZ2UgdGhhdCBwcm9tcHRzIHRoZSB1c2VyIHRvIHNwZWNpZnkgdGhlIGV4cG9ydCBvcHRpb25zLgotCXByb3RlY3RlZCBTZWxlY3RFeHBvcnRPcHRpb25zUGFnZSBzZWxlY3RFeHBvcnRPcHRpb25zUGFnZTsKLQotCS8vIFRoZSB3aXphcmQgcGFnZSB0aGF0IHByb21wdHMgdGhlIHVzZXIgdG8gc3BlY2lmeSB0aGUgcHVibGlzaGluZyBvcHRpb25zLgotCXByb3RlY3RlZCBTZWxlY3RQdWJsaXNoaW5nT3B0aW9uc1BhZ2Ugc2VsZWN0UHVibGlzaGluZ09wdGlvbnNQYWdlOwotCi0JLy8gVGhlIHdpemFyZCBwYWdlIHRoYXQgcHJvbXB0cyB0aGUgdXNlciB0byBzcGVjaWZ5IHRoZSBleHBvcnQgZGlyZWN0b3J5LgotCXByb3RlY3RlZCBTZWxlY3RFeHBvcnREaXJlY3RvcnlQYWdlIHNlbGVjdEV4cG9ydERpclBhZ2U7Ci0KLQkvLyBUaGUgZXhwb3J0IG9wdGlvbnMuCi0JcHJvdGVjdGVkIEV4cG9ydE1TUE9wdGlvbnMgZXhwb3J0T3B0aW9ucyA9IG5ldyBFeHBvcnRNU1BPcHRpb25zKCk7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBFeHBvcnRNU1BXaXphcmQoKSB7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudWkud2l6YXJkcy5CYXNlV2l6YXJkI2luaXQoSVdvcmtiZW5jaCwKLQkgKiAgICAgIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaCB3b3JrYmVuY2gsIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlzdXBlci5pbml0KHdvcmtiZW5jaCwgc2VsZWN0aW9uKTsKLQkJc2V0V2luZG93VGl0bGUoRXhwb3J0TVNQVUlSZXNvdXJjZXMuZXhwb3J0TVNQV2l6YXJkX3RpdGxlKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51aS53aXphcmRzLkJhc2VXaXphcmQjZ2V0V2l6YXJkRXh0ZW5kZXJFeHRlbnNpb25Qb2ludElkKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFdpemFyZEV4dGVuZGVyRXh0ZW5zaW9uUG9pbnRJZCgpIHsKLQkJcmV0dXJuIFdJWkFSRF9FWFRFTlNJT05fUE9JTlRfSUQ7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkI2FkZFBhZ2VzKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRQYWdlcygpIHsKLQkJaWYgKHdpemFyZEV4dGVuZGVyID09IG51bGwpIHsKLQkJCXNlbGVjdFByb2Nlc3NQYWdlID0gbmV3IFNlbGVjdFByb2Nlc3NQYWdlKCk7Ci0JCQlzZWxlY3RFeHBvcnRPcHRpb25zUGFnZSA9IG5ldyBTZWxlY3RFeHBvcnRPcHRpb25zUGFnZSgpOwotCQkJc2VsZWN0UHVibGlzaGluZ09wdGlvbnNQYWdlID0gbmV3IFNlbGVjdFB1Ymxpc2hpbmdPcHRpb25zUGFnZSgpOwotCQkJc2VsZWN0RXhwb3J0RGlyUGFnZSA9IG5ldyBTZWxlY3RFeHBvcnREaXJlY3RvcnlQYWdlKCk7Ci0JCQlzdXBlci5hZGRQYWdlKHNlbGVjdFByb2Nlc3NQYWdlKTsKLQkJCXN1cGVyLmFkZFBhZ2Uoc2VsZWN0RXhwb3J0T3B0aW9uc1BhZ2UpOwotCQkJc3VwZXIuYWRkUGFnZShzZWxlY3RQdWJsaXNoaW5nT3B0aW9uc1BhZ2UpOwotCQkJc3VwZXIuYWRkUGFnZShzZWxlY3RFeHBvcnREaXJQYWdlKTsKLQkJfSBlbHNlIHsKLQkJCUxpc3Q8SVdpemFyZFBhZ2U+IHdpemFyZFBhZ2VzID0gbmV3IEFycmF5TGlzdDxJV2l6YXJkUGFnZT4oKTsKLQotCQkJSVdpemFyZFBhZ2UgcGFnZSA9IHdpemFyZEV4dGVuZGVyCi0JCQkJCS5nZXRSZXBsYWNlV2l6YXJkUGFnZShTZWxlY3RQcm9jZXNzUGFnZS5QQUdFX05BTUUpOwotCQkJaWYgKHBhZ2UgIT0gbnVsbCkgewotCQkJCXdpemFyZFBhZ2VzLmFkZChwYWdlKTsKLQkJCX0gZWxzZSB7Ci0JCQkJc2VsZWN0UHJvY2Vzc1BhZ2UgPSBuZXcgU2VsZWN0UHJvY2Vzc1BhZ2UoKTsKLQkJCQl3aXphcmRQYWdlcy5hZGQoc2VsZWN0UHJvY2Vzc1BhZ2UpOwotCQkJfQotCi0JCQlwYWdlID0gd2l6YXJkRXh0ZW5kZXIKLQkJCQkJLmdldFJlcGxhY2VXaXphcmRQYWdlKFNlbGVjdEV4cG9ydE9wdGlvbnNQYWdlLlBBR0VfTkFNRSk7Ci0JCQlpZiAocGFnZSAhPSBudWxsKSB7Ci0JCQkJd2l6YXJkUGFnZXMuYWRkKHBhZ2UpOwotCQkJfSBlbHNlIHsKLQkJCQlzZWxlY3RFeHBvcnRPcHRpb25zUGFnZSA9IG5ldyBTZWxlY3RFeHBvcnRPcHRpb25zUGFnZSgpOwotCQkJCXdpemFyZFBhZ2VzLmFkZChzZWxlY3RFeHBvcnRPcHRpb25zUGFnZSk7Ci0JCQl9Ci0KLQkJCXBhZ2UgPSB3aXphcmRFeHRlbmRlcgotCQkJCQkuZ2V0UmVwbGFjZVdpemFyZFBhZ2UoU2VsZWN0UHVibGlzaGluZ09wdGlvbnNQYWdlLlBBR0VfTkFNRSk7Ci0JCQlpZiAocGFnZSAhPSBudWxsKSB7Ci0JCQkJd2l6YXJkUGFnZXMuYWRkKHBhZ2UpOwotCQkJfSBlbHNlIHsKLQkJCQlzZWxlY3RQdWJsaXNoaW5nT3B0aW9uc1BhZ2UgPSBuZXcgU2VsZWN0UHVibGlzaGluZ09wdGlvbnNQYWdlKCk7Ci0JCQkJd2l6YXJkUGFnZXMuYWRkKHNlbGVjdFB1Ymxpc2hpbmdPcHRpb25zUGFnZSk7Ci0JCQl9Ci0KLQkJCXBhZ2UgPSB3aXphcmRFeHRlbmRlcgotCQkJCQkuZ2V0UmVwbGFjZVdpemFyZFBhZ2UoU2VsZWN0RXhwb3J0RGlyZWN0b3J5UGFnZS5QQUdFX05BTUUpOwotCQkJaWYgKHBhZ2UgIT0gbnVsbCkgewotCQkJCXdpemFyZFBhZ2VzLmFkZChwYWdlKTsKLQkJCX0gZWxzZSB7Ci0JCQkJc2VsZWN0RXhwb3J0RGlyUGFnZSA9IG5ldyBTZWxlY3RFeHBvcnREaXJlY3RvcnlQYWdlKCk7Ci0JCQkJd2l6YXJkUGFnZXMuYWRkKHNlbGVjdEV4cG9ydERpclBhZ2UpOwotCQkJfQotCi0JCQlzdXBlci5nZXROZXdXaXphcmRQYWdlcyh3aXphcmRQYWdlcyk7Ci0KLQkJCWZvciAoSXRlcmF0b3I8SVdpemFyZFBhZ2U+IGl0ID0gd2l6YXJkUGFnZXMuaXRlcmF0b3IoKTsgaXQKLQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQlJV2l6YXJkUGFnZSB3aXphcmRQYWdlID0gaXQubmV4dCgpOwotCQkJCXN1cGVyLmFkZFBhZ2Uod2l6YXJkUGFnZSk7Ci0JCQl9Ci0KLQkJCXdpemFyZEV4dGVuZGVyLmluaXRXaXphcmRQYWdlcyh3aXphcmRQYWdlcyk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmQjY3JlYXRlUGFnZUNvbnRyb2xzKENvbXBvc2l0ZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVQYWdlQ29udHJvbHMoQ29tcG9zaXRlIHBhZ2VDb250YWluZXIpIHsKLQkJc3VwZXIuY3JlYXRlUGFnZUNvbnRyb2xzKHBhZ2VDb250YWluZXIpOwotCQlwYWdlQ29udGFpbmVyLmdldFNoZWxsKCkuc2V0SW1hZ2UoCi0JCQkJRXhwb3J0TVNQVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFNoYXJlZEltYWdlKAotCQkJCQkJImZ1bGwvb2JqMTYvTVNQcm9qZWN0LmdpZiIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZCNwZXJmb3JtRmluaXNoKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjYW5GaW5pc2goKSB7Ci0JCWlmICh3aXphcmRFeHRlbmRlciAhPSBudWxsKSB7Ci0JCQlpZiAoISB3aXphcmRFeHRlbmRlci5jYW5GaW5pc2goKSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZ2V0Q29udGFpbmVyKCkuZ2V0Q3VycmVudFBhZ2UoKSA9PSBzZWxlY3RFeHBvcnREaXJQYWdlCi0JCQkJJiYgc2VsZWN0RXhwb3J0RGlyUGFnZS5pc1BhZ2VDb21wbGV0ZSgpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVpLndpemFyZHMuQmFzZVdpemFyZCNkb0ZpbmlzaCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gZG9GaW5pc2goKSB7Ci0JCXJldHVybiBleHBvcnRNU1Aoc2VsZWN0UHJvY2Vzc1BhZ2UuZ2V0UHJvY2VzcygpLCBnZXRFeHBvcnRPcHRpb25zKCksCi0JCQkJRXhwb3J0TVNQU2VydmljZS5nZXRJbnN0YW5jZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBFeHBvcnRzIHRoZSBzZWxlY3RlZCBwcm9jZXNzLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGV4cG9ydE1TUChQcm9jZXNzIHByb2Nlc3MsIEV4cG9ydE1TUE9wdGlvbnMgZXhwb3J0T3B0aW9ucywKLQkJCUlFeHBvcnRNU1BTZXJ2aWNlIHNlcnZpY2UpIHsKLQkJaWYgKHByb2Nlc3MgPT0gbnVsbCB8fCBleHBvcnRPcHRpb25zID09IG51bGwgfHwgc2VydmljZSA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0JCX0KLQotCQlGaWxlIGV4cG9ydERpcjsKLQkJU3RyaW5nIG1zcHJvamVjdE5hbWU7Ci0KLQkJdHJ5IHsKLQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gZXhwb3J0T3B0aW9ucy5nZXRNZXRob2RDb25maWd1cmF0aW9uKCk7Ci0JCQlpZiAoY29uZmlnID09IG51bGwpIHsKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAotCQkJCQkJImV4cG9ydE9wdGlvbnMuZ2V0TWV0aG9kQ29uZmlndXJhdGlvbigpIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWlmIChleHBvcnRPcHRpb25zLmdldFB1Ymxpc2hXZWJTaXRlKCkpIHsKLQkJCQlpZiAoc2VsZWN0UHVibGlzaGluZ09wdGlvbnNQYWdlICE9IG51bGwpIHsKLQkJCQkJc2VsZWN0UHVibGlzaGluZ09wdGlvbnNQYWdlLnNhdmVQcmVmZXJlbmNlcygpOwotCQkJCX0KLQotCQkJCWlmICghUHVibGlzaGluZ1V0aWwuaGFzVmFsaWRQcm9jZXNzVmlldyhjb25maWcsIHByb2Nlc3MpKSB7Ci0JCQkJCWJvb2xlYW4gb2sgPSBFeHBvcnRNU1BVSVBsdWdpbgotCQkJCQkJCS5nZXREZWZhdWx0KCkKLQkJCQkJCQkuZ2V0TXNnRGlhbG9nKCkKLQkJCQkJCQkuZGlzcGxheVByb21wdCgKLQkJCQkJCQkJCUV4cG9ydE1TUFVJUmVzb3VyY2VzLmV4cG9ydE1TUFdpemFyZF90aXRsZSwKLQkJCQkJCQkJCUV4cG9ydE1TUFVJUmVzb3VyY2VzLm1pc3NpbmdQcm9jZXNzQ29udGVudFdhcm5pbmdfbXNnKTsKLQkJCQkJaWYgKCFvaykgewotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQlleHBvcnREaXIgPSBleHBvcnRPcHRpb25zLmdldEV4cG9ydERpcigpOwotCQkJaWYgKGV4cG9ydERpciA9PSBudWxsKSB7Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKLQkJCQkJCSJleHBvcnRPcHRpb25zLmdldEV4cG9ydERpcigpIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQotCQkJbXNwcm9qZWN0TmFtZSA9IGV4cG9ydE9wdGlvbnMuZ2V0TVNQcm9qZWN0TmFtZSgpOwotCQkJaWYgKG1zcHJvamVjdE5hbWUgPT0gbnVsbCkgewotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCi0JCQkJCQkiZXhwb3J0T3B0aW9ucy5nZXRNU1Byb2plY3ROYW1lKCkiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQkJZGlzcGxheUlsbGVnYWxBcmd1bWVudEVycm9yKGUuZ2V0TWVzc2FnZSgpKTsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0KLQkJU3RyaW5nIG1zcHJvamVjdEZpbGVOYW1lID0gbXNwcm9qZWN0TmFtZSArICIueG1sIjsgLy8kTk9OLU5MUy0xJAotCQlGaWxlIG1zcHJvamVjdEZpbGUgPSBuZXcgRmlsZShleHBvcnREaXIsIG1zcHJvamVjdEZpbGVOYW1lKTsKLQkJaWYgKG1zcHJvamVjdEZpbGUuZXhpc3RzKCkpIHsKLQkJCWJvb2xlYW4gb2sgPSBFeHBvcnRNU1BVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkKLQkJCQkJLmRpc3BsYXlQcm9tcHQoCi0JCQkJCQkJRXhwb3J0TVNQVUlSZXNvdXJjZXMuZXhwb3J0TVNQV2l6YXJkX3RpdGxlLAotCQkJCQkJCU5MUy5iaW5kKEV4cG9ydE1TUFVJUmVzb3VyY2VzLm92ZXJ3cml0ZVRleHRfbXNnLAotCQkJCQkJCQkJKG5ldyBTdHJpbmdbXSB7IG1zcHJvamVjdEZpbGVOYW1lLAotCQkJCQkJCQkJCQlleHBvcnREaXIuZ2V0QWJzb2x1dGVQYXRoKCkgfSkpKTsKLQkJCWlmICghb2spIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQotCQl0cnkgewotCQkJYm9vbGVhbiBzdWNjZXNzID0gc2VydmljZS5leHBvcnRNU1Byb2plY3QocHJvY2VzcywgZXhwb3J0T3B0aW9ucyk7Ci0JCQlpZiAoc3VjY2VzcykgewotCQkJCUV4cG9ydE1TUFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKS5kaXNwbGF5SW5mbygKLQkJCQkJCUV4cG9ydE1TUFVJUmVzb3VyY2VzLmV4cG9ydE1TUFdpemFyZF90aXRsZSwKLQkJCQkJCU5MUy5iaW5kKEV4cG9ydE1TUFVJUmVzb3VyY2VzLmNvbXBsZXRlZFRleHRfbXNnLAotCQkJCQkJCQkobmV3IFN0cmluZ1tdIHsgcHJvY2Vzcy5nZXROYW1lKCksCi0JCQkJCQkJCQkJbXNwcm9qZWN0RmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSB9KSkpOwotCQkJfQotCQl9IGNhdGNoIChFeHBvcnRNU1BTZXJ2aWNlRXhjZXB0aW9uIGUpIHsKLQkJCUV4cG9ydE1TUFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKS5kaXNwbGF5RXJyb3IoCi0JCQkJCUV4cG9ydE1TUFVJUmVzb3VyY2VzLmV4cG9ydE1TUFdpemFyZF90aXRsZSwKLQkJCQkJTkxTLmJpbmQoRXhwb3J0TVNQVUlSZXNvdXJjZXMuZXhwb3J0TVNQRXJyb3JfbXNnLAotCQkJCQkJCShuZXcgU3RyaW5nW10geyBwcm9jZXNzLmdldE5hbWUoKSwKLQkJCQkJCQkJCW1zcHJvamVjdEZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkgfSkpLAotCQkJCQlFeHBvcnRNU1BVSVJlc291cmNlcy5leHBvcnRNU1BFcnJvcl9yZWFzb24sIGUpOwotCQl9Ci0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgd2l6YXJkIHBhZ2UgdGhhdCBwcm9tcHRzIHRoZSB1c2VyIHRvIHNlbGVjdCBhIHByb2Nlc3MgdG8KLQkgKiBleHBvcnQuCi0JICovCi0JcHVibGljIFNlbGVjdFByb2Nlc3NQYWdlIGdldFNlbGVjdFByb2Nlc3NQYWdlKCkgewotCQlyZXR1cm4gc2VsZWN0UHJvY2Vzc1BhZ2U7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgd2l6YXJkIHBhZ2UgdGhhdCBwcm9tcHRzIHRoZSB1c2VyIHRoZSBleHBvcnQgb3B0aW9ucy4KLQkgKi8KLQlwdWJsaWMgU2VsZWN0RXhwb3J0T3B0aW9uc1BhZ2UgZ2V0RXhwb3J0T3B0aW9uc1BhZ2UoKSB7Ci0JCXJldHVybiBzZWxlY3RFeHBvcnRPcHRpb25zUGFnZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB3aXphcmQgcGFnZSB0aGF0IHByb21wdHMgdGhlIHVzZXIgdG8gc3BlY2lmeSB0aGUgcHVibGlzaGluZwotCSAqIG9wdGlvbnMuCi0JICovCi0JcHVibGljIFNlbGVjdFB1Ymxpc2hpbmdPcHRpb25zUGFnZSBzZWxlY3RQdWJsaXNoaW5nT3B0aW9uc1BhZ2UoKSB7Ci0JCXJldHVybiBzZWxlY3RQdWJsaXNoaW5nT3B0aW9uc1BhZ2U7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgd2l6YXJkIHBhZ2UgdGhhdCBwcm9tcHRzIHRoZSB1c2VyIHRvIHNwZWNpZnkgdGhlIGV4cG9ydAotCSAqIGRpcmVjdG9yeS4KLQkgKi8KLQlwdWJsaWMgU2VsZWN0RXhwb3J0RGlyZWN0b3J5UGFnZSBnZXRTZWxlY3RFeHBvcnREaXJlY3RvcnlQYWdlKCkgewotCQlyZXR1cm4gc2VsZWN0RXhwb3J0RGlyUGFnZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBleHBvcnQgb3B0aW9ucy4KLQkgKi8KLQlwdWJsaWMgRXhwb3J0TVNQT3B0aW9ucyBnZXRFeHBvcnRPcHRpb25zKCkgewotCQlleHBvcnRPcHRpb25zLnNldE1ldGhvZENvbmZpZ3VyYXRpb24oc2VsZWN0RXhwb3J0T3B0aW9uc1BhZ2UKLQkJCQkuZ2V0TWV0aG9kQ29uZmlndXJhdGlvbigpKTsKLQkJZXhwb3J0T3B0aW9ucy5zZXRFeHBvcnREaXIobmV3IEZpbGUoc2VsZWN0RXhwb3J0RGlyUGFnZQotCQkJCS5nZXRFeHBvcnREaXJlY3RvcnkoKSkpOwotCQlleHBvcnRPcHRpb25zLnNldE1TUHJvamVjdE5hbWUoc2VsZWN0RXhwb3J0RGlyUGFnZS5nZXRNU1Byb2plY3ROYW1lKCkpOwotCQlleHBvcnRPcHRpb25zLnNldEV4cG9ydE9ubHlQbGFubmVkV0JTRWxlbWVudHMoc2VsZWN0RXhwb3J0T3B0aW9uc1BhZ2UKLQkJCQkuZ2V0RXhwb3J0T25seVBsYW5uZWRXQlNFbGVtZW50c1NlbGVjdGlvbigpKTsKLQotCQlpZiAoc2VsZWN0RXhwb3J0T3B0aW9uc1BhZ2UuZ2V0UHVibGlzaFdlYlNpdGVTZWxlY3Rpb24oKSkgewotCQkJUHVibGlzaE9wdGlvbnMgcHVibGlzaGluZ09wdGlvbnMgPSBzZWxlY3RQdWJsaXNoaW5nT3B0aW9uc1BhZ2UKLQkJCQkJLmdldFB1Ymxpc2hpbmdPcHRpb25zKCk7Ci0JCQlib29sZWFuIHB1Ymxpc2hDb25maWcgPSBzZWxlY3RFeHBvcnRPcHRpb25zUGFnZQotCQkJCQkuZ2V0UHVibGlzaENvbmZpZ1NlbGVjdGlvbigpOwotCQkJYm9vbGVhbiBwdWJsaXNoUHJvY2VzcyA9IHNlbGVjdEV4cG9ydE9wdGlvbnNQYWdlCi0JCQkJCS5nZXRQdWJsaXNoUHJvY2Vzc1NlbGVjdGlvbigpOwotCQkJcHVibGlzaGluZ09wdGlvbnMuc2V0UHVibGlzaENvbmZpZ3VyYXRpb24ocHVibGlzaENvbmZpZyk7Ci0JCQlwdWJsaXNoaW5nT3B0aW9ucy5zZXRQdWJsaXNoUHJvY2VzcyhwdWJsaXNoUHJvY2Vzcyk7Ci0JCQlleHBvcnRPcHRpb25zLnNldFB1Ymxpc2hXZWJTaXRlKHB1Ymxpc2hpbmdPcHRpb25zICE9IG51bGwKLQkJCQkJJiYgKHB1Ymxpc2hDb25maWcgfHwgcHVibGlzaFByb2Nlc3MpKTsKLQkJCWV4cG9ydE9wdGlvbnMuc2V0UHVibGlzaGluZ09wdGlvbnMocHVibGlzaGluZ09wdGlvbnMpOwotCQl9IGVsc2UgewotCQkJZXhwb3J0T3B0aW9ucy5zZXRQdWJsaXNoV2ViU2l0ZShmYWxzZSk7Ci0JCQlleHBvcnRPcHRpb25zLnNldFB1Ymxpc2hpbmdPcHRpb25zKG51bGwpOwotCQl9Ci0KLQkJcmV0dXJuIGV4cG9ydE9wdGlvbnM7Ci0JfQotCi0JLyoqCi0JICogRGlzcGxheXMgYW4gZXJyb3IgZGlhbG9nIGFib3V0IGFuIGlsbGVnYWwgYXJndW1lbnQuCi0JICogCi0JICogQHBhcmFtIG5hbWUKLQkgKiAgICAgICAgICAgIG5hbWUgb2YgdGhlIGFyZ3VtZW50Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgZGlzcGxheUlsbGVnYWxBcmd1bWVudEVycm9yKFN0cmluZyBuYW1lKSB7Ci0JCVN0cmluZyBtc2cgPSBOTFMuYmluZChFeHBvcnRNU1BVSVJlc291cmNlcy5pbGxlZ2FsQXJndW1lbnRfbXNnLAotCQkJCShuZXcgU3RyaW5nW10geyBuYW1lIH0pKTsKLQkJRXhwb3J0TVNQVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpLmRpc3BsYXlFcnJvcigKLQkJCQlFeHBvcnRNU1BVSVJlc291cmNlcy5leHBvcnRNU1BXaXphcmRfdGl0bGUsCi0JCQkJRXhwb3J0TVNQVUlSZXNvdXJjZXMuZXhwb3J0TVNQSW50ZXJuYWxFcnJvcl9tc2csCi0JCQkJRXhwb3J0TVNQVUlSZXNvdXJjZXMuZXhwb3J0TVNQRXJyb3JfcmVhc29uLAotCQkJCW5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24obXNnKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9tc3AvdWkvd2l6YXJkcy9TZWxlY3RFeHBvcnREaXJlY3RvcnlQYWdlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9tc3AvdWkvd2l6YXJkcy9TZWxlY3RFeHBvcnREaXJlY3RvcnlQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2ZTJlYmIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvbXNwL3VpL3dpemFyZHMvU2VsZWN0RXhwb3J0RGlyZWN0b3J5UGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLnVpLndpemFyZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC51aS5FeHBvcnRNU1BVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC51aS5FeHBvcnRNU1BVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC51aS5wcmVmZXJlbmNlcy5FeHBvcnRNU1BVSVByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51aS53aXphcmRzLkJhc2VXaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlyZWN0b3J5RGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotCi0vKioKLSAqIEEgd2l6YXJkIHBhZ2UgdGhhdCBwcm9tcHRzIHRoZSB1c2VyIHRvIHNwZWNpZnkgdGhlIE1pY3Jvc29mdCBQcm9qZWN0IG5hbWUgYW5kCi0gKiBleHBvcnQgZGlyZWN0b3J5LgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjIKLSAqLwotcHVibGljIGNsYXNzIFNlbGVjdEV4cG9ydERpcmVjdG9yeVBhZ2UgZXh0ZW5kcyBCYXNlV2l6YXJkUGFnZSB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQUdFX05BTUUgPSBTZWxlY3RFeHBvcnREaXJlY3RvcnlQYWdlLmNsYXNzCi0JCQkuZ2V0TmFtZSgpOwotCi0JcHJvdGVjdGVkIFNoZWxsIHNoZWxsOwotCi0JcHJvdGVjdGVkIENvbXBvc2l0ZSBjb21wb3NpdGU7Ci0KLQlwcm90ZWN0ZWQgQ29tcG9zaXRlIHRlbXBsYXRlQ29tcG9zaXRlOwotCi0JcHJvdGVjdGVkIENvbWJvIHByb2plY3ROYW1lQ29tYm87Ci0KLQlwcm90ZWN0ZWQgQ29tYm8gZXhwb3J0RGlyQ29tYm87Ci0KLQlwcm90ZWN0ZWQgQnV0dG9uIGJyb3dzZUJ1dHRvbjsKLQotCXByb3RlY3RlZCBNb2RpZnlMaXN0ZW5lciBtb2RpZnlMaXN0ZW5lciA9IG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0JCQlzZXRQYWdlQ29tcGxldGUoaXNQYWdlQ29tcGxldGUoKSk7Ci0JCX0KLQl9OwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgU2VsZWN0RXhwb3J0RGlyZWN0b3J5UGFnZShTdHJpbmcgcGFnZU5hbWUpIHsKLQkJc3VwZXIocGFnZU5hbWUpOwotCQlzZXRUaXRsZShFeHBvcnRNU1BVSVJlc291cmNlcy5zZWxlY3RFeHBvcnREaXJXaXphcmRQYWdlX3RpdGxlKTsKLQkJc2V0RGVzY3JpcHRpb24oRXhwb3J0TVNQVUlSZXNvdXJjZXMuc2VsZWN0RXhwb3J0RGlyV2l6YXJkUGFnZV90ZXh0KTsKLQkJc2V0SW1hZ2VEZXNjcmlwdG9yKEV4cG9ydE1TUFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoCi0JCQkJImZ1bGwvd2l6YmFuL2V4cF9tc19wcmpfd2l6YmFuLmdpZiIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFNlbGVjdEV4cG9ydERpcmVjdG9yeVBhZ2UoKSB7Ci0JCXRoaXMoUEFHRV9OQU1FKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ1BhZ2UjY3JlYXRlQ29udHJvbChDb21wb3NpdGUpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXNoZWxsID0gcGFyZW50LmdldFNoZWxsKCk7Ci0KLQkJY29tcG9zaXRlID0gY3JlYXRlR3JpZExheW91dENvbXBvc2l0ZShwYXJlbnQsIDEpOwotCi0JCXRlbXBsYXRlQ29tcG9zaXRlID0gY3JlYXRlR3JpZExheW91dENvbXBvc2l0ZShjb21wb3NpdGUsIDMpOwotCi0JCWNyZWF0ZUxhYmVsKHRlbXBsYXRlQ29tcG9zaXRlLAotCQkJCUV4cG9ydE1TUFVJUmVzb3VyY2VzLnByb2plY3ROYW1lTGFiZWxfdGV4dCk7Ci0KLQkJcHJvamVjdE5hbWVDb21ibyA9IGNyZWF0ZUNvbWJvYm94KHRlbXBsYXRlQ29tcG9zaXRlLCAyKTsKLQotCQljcmVhdGVMYWJlbCh0ZW1wbGF0ZUNvbXBvc2l0ZSwgRXhwb3J0TVNQVUlSZXNvdXJjZXMuZGlyTGFiZWxfdGV4dCk7Ci0KLQkJZXhwb3J0RGlyQ29tYm8gPSBjcmVhdGVDb21ib2JveCh0ZW1wbGF0ZUNvbXBvc2l0ZSk7Ci0KLQkJYnJvd3NlQnV0dG9uID0gY3JlYXRlQnV0dG9uKHRlbXBsYXRlQ29tcG9zaXRlLAotCQkJCUV4cG9ydE1TUFVJUmVzb3VyY2VzLmJyb3dzZUJ1dHRvbl90ZXh0KTsKLQotCQlpbml0Q29udHJvbHMoKTsKLQotCQlhZGRMaXN0ZW5lcnMoKTsKLQotCQlzZXRDb250cm9sKGNvbXBvc2l0ZSk7Ci0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZXMgdGhlIHdpemFyZCBwYWdlIGNvbnRyb2xzIHdpdGggZGF0YS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0Q29udHJvbHMoKSB7Ci0JCVN0cmluZ1tdIHRlbXBsYXRlTmFtZXMgPSBFeHBvcnRNU1BVSVByZWZlcmVuY2VzLmdldE1TUHJvamVjdE5hbWVzKCk7Ci0JCWlmICh0ZW1wbGF0ZU5hbWVzICE9IG51bGwgJiYgdGVtcGxhdGVOYW1lcy5sZW5ndGggPiAwKSB7Ci0JCQlwcm9qZWN0TmFtZUNvbWJvLnNldEl0ZW1zKHRlbXBsYXRlTmFtZXMpOwotCQkJcHJvamVjdE5hbWVDb21iby5zZXRUZXh0KHRlbXBsYXRlTmFtZXNbMF0pOwotCQl9Ci0KLQkJU3RyaW5nW10gZXhwb3J0RGlycyA9IEV4cG9ydE1TUFVJUHJlZmVyZW5jZXMuZ2V0RXhwb3J0RGlyZWN0b3JpZXMoKTsKLQkJaWYgKGV4cG9ydERpcnMgIT0gbnVsbCAmJiBleHBvcnREaXJzLmxlbmd0aCA+IDApIHsKLQkJCWV4cG9ydERpckNvbWJvLnNldEl0ZW1zKGV4cG9ydERpcnMpOwotCQkJZXhwb3J0RGlyQ29tYm8uc2V0VGV4dChleHBvcnREaXJzWzBdKTsKLQkJfQotCi0JCWJyb3dzZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJdHJ5IHsKLQkJCQkJRGlyZWN0b3J5RGlhbG9nIGRpYWxvZyA9IG5ldyBEaXJlY3RvcnlEaWFsb2coc2hlbGwsCi0JCQkJCQkJU1dULk5PTkUpOwotCQkJCQlTdHJpbmcgc2VsZWN0ZWREaXIgPSBkaWFsb2cub3BlbigpOwotCQkJCQlpZiAoc2VsZWN0ZWREaXIgIT0gbnVsbCkgewotCQkJCQkJZXhwb3J0RGlyQ29tYm8uYWRkKHNlbGVjdGVkRGlyLCAwKTsKLQkJCQkJCWV4cG9ydERpckNvbWJvLnNldFRleHQoc2VsZWN0ZWREaXIpOwotCQkJCQl9Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJRXhwb3J0TVNQVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JfQotCi0JLyoqCi0JICogQWRkcyBldmVudCBoYW5kbGVycyB0byB0aGUgd2l6YXJkIHBhZ2UgY29udHJvbHMuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkTGlzdGVuZXJzKCkgewotCQlwcm9qZWN0TmFtZUNvbWJvLmFkZE1vZGlmeUxpc3RlbmVyKG1vZGlmeUxpc3RlbmVyKTsKLQkJZXhwb3J0RGlyQ29tYm8uYWRkTW9kaWZ5TGlzdGVuZXIobW9kaWZ5TGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2UjaXNQYWdlQ29tcGxldGUoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUGFnZUNvbXBsZXRlKCkgewotCQlyZXR1cm4gZ2V0TVNQcm9qZWN0TmFtZSgpLmxlbmd0aCgpID4gMAotCQkJCSYmIGdldEV4cG9ydERpcmVjdG9yeSgpLmxlbmd0aCgpID4gMDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBNaWNyb3NvZnQgUHJvamVjdCBuYW1lLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TVNQcm9qZWN0TmFtZSgpIHsKLQkJcmV0dXJuIHByb2plY3ROYW1lQ29tYm8uZ2V0VGV4dCgpLnRyaW0oKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBleHBvcnQgZGlyZWN0b3J5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RXhwb3J0RGlyZWN0b3J5KCkgewotCQlyZXR1cm4gZXhwb3J0RGlyQ29tYm8uZ2V0VGV4dCgpLnRyaW0oKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCUV4cG9ydE1TUFVJUHJlZmVyZW5jZXMuYWRkTVNQcm9qZWN0TmFtZShnZXRNU1Byb2plY3ROYW1lKCkpOwotCQlFeHBvcnRNU1BVSVByZWZlcmVuY2VzLmFkZEV4cG9ydERpcihnZXRFeHBvcnREaXJlY3RvcnkoKSk7Ci0JCW1vZGlmeUxpc3RlbmVyID0gbnVsbDsKLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L21zcC91aS93aXphcmRzL1NlbGVjdEV4cG9ydE9wdGlvbnNQYWdlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9tc3AvdWkvd2l6YXJkcy9TZWxlY3RFeHBvcnRPcHRpb25zUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMmVhZmE4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L21zcC91aS93aXphcmRzL1NlbGVjdEV4cG9ydE9wdGlvbnNQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AudWkud2l6YXJkczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLnVpLkV4cG9ydE1TUFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLnVpLkV4cG9ydE1TUFVJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLnVpLnByZWZlcmVuY2VzLkV4cG9ydE1TUFVJUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2VVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLlB1Ymxpc2hpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudWkud2l6YXJkcy5CYXNlV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLQotLyoqCi0gKiBBIHdpemFyZCBwYWdlIHRoYXQgcHJvbXB0cyB0aGUgdXNlciB0byBzZWxlY3QgdGhlIGV4cG9ydCBvcHRpb25zLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjIKLSAqLwotcHVibGljIGNsYXNzIFNlbGVjdEV4cG9ydE9wdGlvbnNQYWdlIGV4dGVuZHMgQmFzZVdpemFyZFBhZ2UgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFHRV9OQU1FID0gU2VsZWN0RXhwb3J0T3B0aW9uc1BhZ2UuY2xhc3MKLQkJCS5nZXROYW1lKCk7Ci0KLQlwcm90ZWN0ZWQgQ29tcG9zaXRlIGNvbXBvc2l0ZTsKLQotCXByb3RlY3RlZCBDb21wb3NpdGUgY29uZmlnQ29tcG9zaXRlOwotCi0JcHJvdGVjdGVkIFRleHQgcHJvY2Vzc1RleHQ7Ci0KLQlwcm90ZWN0ZWQgQ29tYm8gY29uZmlnQ29tYm87Ci0KLQlwcm90ZWN0ZWQgQ29tcG9zaXRlIG9wdGlvbnNDb21wb3NpdGU7Ci0KLQlwcm90ZWN0ZWQgQnV0dG9uIHB1Ymxpc2hXZWJTaXRlUmFkaW9CdXR0b247Ci0KLQlwcm90ZWN0ZWQgQ29tcG9zaXRlIHB1Ymxpc2hPcHRpb25zQ29tcG9zaXRlOwotCi0JcHJvdGVjdGVkIEJ1dHRvbiBwdWJsaXNoQ29uZmlnUmFkaW9CdXR0b247Ci0KLQlwcm90ZWN0ZWQgQnV0dG9uIHB1Ymxpc2hQcm9jZXNzUmFkaW9CdXR0b247Ci0KLQlwcm90ZWN0ZWQgQnV0dG9uIGV4cG9ydE9ubHlQbGFubmVkV0JTRWxlbWVudHNDaGVja0JveDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFNlbGVjdEV4cG9ydE9wdGlvbnNQYWdlKFN0cmluZyBwYWdlTmFtZSkgewotCQlzdXBlcihwYWdlTmFtZSk7Ci0JCXNldFRpdGxlKEV4cG9ydE1TUFVJUmVzb3VyY2VzLnNlbGVjdEV4cG9ydE9wdGlvbnNXaXphcmRQYWdlX3RpdGxlKTsKLQkJc2V0RGVzY3JpcHRpb24oRXhwb3J0TVNQVUlSZXNvdXJjZXMuc2VsZWN0RXhwb3J0T3B0aW9uc1dpemFyZFBhZ2VfdGV4dCk7Ci0JCXNldEltYWdlRGVzY3JpcHRvcihFeHBvcnRNU1BVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKAotCQkJCSJmdWxsL3dpemJhbi9leHBfbXNfcHJqX3dpemJhbi5naWYiKSk7IC8vJE5PTi1OTFMtMSQJCi0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgU2VsZWN0RXhwb3J0T3B0aW9uc1BhZ2UoKSB7Ci0JCXRoaXMoUEFHRV9OQU1FKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ1BhZ2UjY3JlYXRlQ29udHJvbChDb21wb3NpdGUpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCWNvbXBvc2l0ZSA9IGNyZWF0ZUdyaWRMYXlvdXRDb21wb3NpdGUocGFyZW50LCAxKTsKLQotCQljb25maWdDb21wb3NpdGUgPSBjcmVhdGVHcmlkTGF5b3V0Q29tcG9zaXRlKGNvbXBvc2l0ZSwgMik7Ci0KLQkJY3JlYXRlTGFiZWwoY29uZmlnQ29tcG9zaXRlLAotCQkJCUV4cG9ydE1TUFVJUmVzb3VyY2VzLnNlbGVjdGVkUHJvY2Vzc0xhYmVsX3RleHQpOwotCi0JCXByb2Nlc3NUZXh0ID0gY3JlYXRlVGV4dChjb25maWdDb21wb3NpdGUsICIiKTsgLy8kTk9OLU5MUy0xJAotCi0JCWNyZWF0ZUxhYmVsKGNvbmZpZ0NvbXBvc2l0ZSwKLQkJCQlFeHBvcnRNU1BVSVJlc291cmNlcy5jb25maWd1cmF0aW9uTGFiZWxfdGV4dCk7Ci0KLQkJY29uZmlnQ29tYm8gPSBuZXcgQ29tYm8oY29uZmlnQ29tcG9zaXRlLCBTV1QuQk9SREVSIHwgU1dULlJFQURfT05MWSk7Ci0JCWNvbmZpZ0NvbWJvLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCi0JCW9wdGlvbnNDb21wb3NpdGUgPSBjcmVhdGVHcmlkTGF5b3V0Q29tcG9zaXRlKGNvbXBvc2l0ZSwgMSk7Ci0KLQkJcHVibGlzaFdlYlNpdGVSYWRpb0J1dHRvbiA9IGNyZWF0ZUNoZWNrYm94KG9wdGlvbnNDb21wb3NpdGUsCi0JCQkJRXhwb3J0TVNQVUlSZXNvdXJjZXMucHVibGlzaFdlYlNpdGVDaGVja0JveF90ZXh0KTsKLQotCQlwdWJsaXNoT3B0aW9uc0NvbXBvc2l0ZSA9IGNyZWF0ZUdyaWRMYXlvdXRDb21wb3NpdGUob3B0aW9uc0NvbXBvc2l0ZSwgMSk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gKEdyaWRMYXlvdXQpIHB1Ymxpc2hPcHRpb25zQ29tcG9zaXRlLmdldExheW91dCgpOwotCQlsYXlvdXQubWFyZ2luVG9wID0gLTU7Ci0JCWxheW91dC5tYXJnaW5MZWZ0ID0gMTI7Ci0KLQkJcHVibGlzaENvbmZpZ1JhZGlvQnV0dG9uID0gY3JlYXRlUmFkaW9CdXR0b24ocHVibGlzaE9wdGlvbnNDb21wb3NpdGUsCi0JCQkJRXhwb3J0TVNQVUlSZXNvdXJjZXMucHVibGlzaENvbmZpZ0J1dHRvbl90ZXh0KTsKLQotCQlwdWJsaXNoUHJvY2Vzc1JhZGlvQnV0dG9uID0gY3JlYXRlUmFkaW9CdXR0b24ocHVibGlzaE9wdGlvbnNDb21wb3NpdGUsCi0JCQkJRXhwb3J0TVNQVUlSZXNvdXJjZXMucHVibGlzaFByb2Nlc3NCdXR0b25fdGV4dCk7Ci0KLQkJZXhwb3J0T25seVBsYW5uZWRXQlNFbGVtZW50c0NoZWNrQm94ID0gY3JlYXRlQ2hlY2tib3gob3B0aW9uc0NvbXBvc2l0ZSwKLQkJCQlFeHBvcnRNU1BVSVJlc291cmNlcy5leHBvcnRPbmx5UGxhbm5lZEVsZW1lbnRzQ2hlY2tCb3hfdGV4dCk7Ci0KLQkJaW5pdENvbnRyb2xzKCk7Ci0KLQkJYWRkTGlzdGVuZXJzKCk7Ci0KLQkJc2V0Q29udHJvbChjb21wb3NpdGUpOwotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemVzIHRoZSB3aXphcmQgcGFnZSBjb250cm9scyB3aXRoIGRhdGEuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdENvbnRyb2xzKCkgewotCQlpZiAoRXhwb3J0TVNQVUlQcmVmZXJlbmNlcy5nZXRQdWJsaXNoV2ViU2l0ZSgpKSB7Ci0JCQlwdWJsaXNoV2ViU2l0ZVJhZGlvQnV0dG9uLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJfQotCi0JCWJvb2xlYW4gcHVibGlzaENvbmZpZyA9IEV4cG9ydE1TUFVJUHJlZmVyZW5jZXMKLQkJCQkuZ2V0UHVibGlzaENvbmZpZ3VyYXRpb24oKTsKLQkJcHVibGlzaENvbmZpZ1JhZGlvQnV0dG9uLnNldFNlbGVjdGlvbihwdWJsaXNoQ29uZmlnKTsKLQkJcHVibGlzaFByb2Nlc3NSYWRpb0J1dHRvbi5zZXRTZWxlY3Rpb24oIXB1Ymxpc2hDb25maWcpOwotCi0JCXVwZGF0ZVB1Ymxpc2hPcHRpb25zQnV0dG9ucygpOwotCi0JCWV4cG9ydE9ubHlQbGFubmVkV0JTRWxlbWVudHNDaGVja0JveAotCQkJCS5zZXRTZWxlY3Rpb24oRXhwb3J0TVNQVUlQcmVmZXJlbmNlcwotCQkJCQkJLmdldEV4cG9ydE9ubHlQbGFubmVkV0JTRWxlbWVudHMoKSk7Ci0JfQotCi0JLyoqCi0JICogQWRkcyBldmVudCBoYW5kbGVycyB0byB0aGUgd2l6YXJkIHBhZ2UgY29udHJvbHMuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkTGlzdGVuZXJzKCkgewotCQljb25maWdDb21iby5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJCQlzZXRQYWdlQ29tcGxldGUoaXNQYWdlQ29tcGxldGUoKSk7Ci0JCQl9Ci0JCX0pOwotCi0JCXB1Ymxpc2hXZWJTaXRlUmFkaW9CdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQl1cGRhdGVQdWJsaXNoT3B0aW9uc0J1dHRvbnMoKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCS8qKgotCSAqIFVwZGF0ZXMgdGhlIENvbmZpZ3VyYXRpb24gQ29tYm8uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlQ29uZmlnQ29tYm8oUHJvY2VzcyBwcm9jZXNzKSB7Ci0JCVN0cmluZ1tdIGNvbnRleHROYW1lcyA9IExpYnJhcnlTZXJ2aWNlVXRpbC5nZXRDb250ZXh0cyhwcm9jZXNzKTsKLQkJY29uZmlnQ29tYm8uc2V0SXRlbXMoY29udGV4dE5hbWVzKTsKLQkJU3RyaW5nIGRlZmF1bHRDb250ZXh0ID0gcHJvY2Vzcy5nZXREZWZhdWx0Q29udGV4dCgpLmdldE5hbWUoKTsKLQkJY29uZmlnQ29tYm8uc2V0VGV4dChkZWZhdWx0Q29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogVXBkYXRlcyB0aGUgcHVibGlzaGluZyBvcHRpb25zIHJhZGlvIGJ1dHRvbnMuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlUHVibGlzaE9wdGlvbnNCdXR0b25zKCkgewotCQlib29sZWFuIGVuYWJsZWQgPSBnZXRQdWJsaXNoV2ViU2l0ZVNlbGVjdGlvbigpOwotCQlwdWJsaXNoQ29uZmlnUmFkaW9CdXR0b24uc2V0RW5hYmxlZChlbmFibGVkKTsKLQkJcHVibGlzaFByb2Nlc3NSYWRpb0J1dHRvbi5zZXRFbmFibGVkKGVuYWJsZWQpOwotCQlzZXRQYWdlQ29tcGxldGUoaXNQYWdlQ29tcGxldGUoKSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudWkud2l6YXJkcy5CYXNlV2l6YXJkUGFnZSNvbkVudGVyUGFnZShPYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgb25FbnRlclBhZ2UoT2JqZWN0IG9iaikgewotCQlpZiAob2JqICE9IG51bGwgJiYgb2JqIGluc3RhbmNlb2YgUHJvY2VzcykgewotCQkJUHJvY2VzcyBwcm9jZXNzID0gKFByb2Nlc3MpIG9iajsKLQkJCXByb2Nlc3NUZXh0LnNldFRleHQocHJvY2Vzcy5nZXROYW1lKCkpOwotCQkJdXBkYXRlQ29uZmlnQ29tYm8ocHJvY2Vzcyk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlI2lzUGFnZUNvbXBsZXRlZCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNQYWdlQ29tcGxldGUoKSB7Ci0JCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gZ2V0TWV0aG9kQ29uZmlndXJhdGlvbigpOwotCQlpZiAoY29uZmlnID09IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCWlmIChnZXRQdWJsaXNoV2ViU2l0ZVNlbGVjdGlvbigpCi0JCQkJJiYgY29uZmlnLmdldFByb2Nlc3NWaWV3cygpLnNpemUoKSA9PSAwKSB7Ci0JCQlzZXRFcnJvck1lc3NhZ2UoUHVibGlzaGluZ1VJUmVzb3VyY2VzLm1pc3NpbmdWaWV3RXJyb3JfbXNnKTsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCXNldEVycm9yTWVzc2FnZShudWxsKTsKLQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51aS53aXphcmRzLkJhc2VXaXphcmRQYWdlI2dldE5leHRQYWdlRGF0YSgpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXROZXh0UGFnZURhdGEoKSB7Ci0JCXJldHVybiBnZXRNZXRob2RDb25maWd1cmF0aW9uKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkUGFnZSNnZXROZXh0UGFnZSgpCi0JICovCi0JcHVibGljIElXaXphcmRQYWdlIGdldE5leHRQYWdlKCkgewotCQlJV2l6YXJkUGFnZSBuZXh0UGFnZSA9IG51bGw7Ci0KLQkJaWYgKGdldFB1Ymxpc2hXZWJTaXRlU2VsZWN0aW9uKCkpIHsKLQkJCW5leHRQYWdlID0gc3VwZXIuZ2V0TmV4dFBhZ2UoKTsKLQkJfSBlbHNlIHsKLQkJCW5leHRQYWdlID0gc3VwZXIuZ2V0TmV4dFBhZ2UoKS5nZXROZXh0UGFnZSgpOwotCQl9Ci0KLQkJcmV0dXJuIG5leHRQYWdlOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHVzZXIgc2VsZWN0ZWQgbWV0aG9kIGNvbmZpZ3VyYXRpb24uCi0JICovCi0JcHVibGljIE1ldGhvZENvbmZpZ3VyYXRpb24gZ2V0TWV0aG9kQ29uZmlndXJhdGlvbigpIHsKLQkJU3RyaW5nIGNvbmZpZ05hbWUgPSBjb25maWdDb21iby5nZXRUZXh0KCkudHJpbSgpOwotCQlNZXRob2RMaWJyYXJ5IGxpYnJhcnkgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCk7Ci0JCXJldHVybiBMaWJyYXJ5U2VydmljZVV0aWwuZ2V0TWV0aG9kQ29uZmlndXJhdGlvbihsaWJyYXJ5LCBjb25maWdOYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBwdWJsaXNoIHdlYiBzaXRlIHNlbGVjdGlvbi4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBnZXRQdWJsaXNoV2ViU2l0ZVNlbGVjdGlvbigpIHsKLQkJcmV0dXJuIHB1Ymxpc2hXZWJTaXRlUmFkaW9CdXR0b24uZ2V0U2VsZWN0aW9uKCk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgcHVibGlzaCBjb25maWd1cmF0aW9uIHNlbGVjdGlvbi4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBnZXRQdWJsaXNoQ29uZmlnU2VsZWN0aW9uKCkgewotCQlyZXR1cm4gcHVibGlzaENvbmZpZ1JhZGlvQnV0dG9uLmdldFNlbGVjdGlvbigpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHB1Ymxpc2ggcHJvY2VzcyBzZWxlY3Rpb24uCi0JICovCi0JcHVibGljIGJvb2xlYW4gZ2V0UHVibGlzaFByb2Nlc3NTZWxlY3Rpb24oKSB7Ci0JCXJldHVybiBwdWJsaXNoUHJvY2Vzc1JhZGlvQnV0dG9uLmdldFNlbGVjdGlvbigpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHB1Ymxpc2ggY29uZmlndXJhdGlvbiBzZWxlY3Rpb24uCi0JICovCi0JcHVibGljIGJvb2xlYW4gZ2V0RXhwb3J0T25seVBsYW5uZWRXQlNFbGVtZW50c1NlbGVjdGlvbigpIHsKLQkJcmV0dXJuIGV4cG9ydE9ubHlQbGFubmVkV0JTRWxlbWVudHNDaGVja0JveC5nZXRTZWxlY3Rpb24oKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCUV4cG9ydE1TUFVJUHJlZmVyZW5jZXMuc2V0UHVibGlzaFdlYlNpdGUoZ2V0UHVibGlzaFdlYlNpdGVTZWxlY3Rpb24oKSk7Ci0JCUV4cG9ydE1TUFVJUHJlZmVyZW5jZXMKLQkJCQkuc2V0UHVibGlzaENvbmZpZ3VyYXRpb24oZ2V0UHVibGlzaENvbmZpZ1NlbGVjdGlvbigpKTsKLQkJRXhwb3J0TVNQVUlQcmVmZXJlbmNlcwotCQkJCS5zZXRFeHBvcnRPbmx5UGxhbm5lZFdCU0VsZW1lbnRzKGdldEV4cG9ydE9ubHlQbGFubmVkV0JTRWxlbWVudHNTZWxlY3Rpb24oKSk7Ci0JCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gZ2V0TWV0aG9kQ29uZmlndXJhdGlvbigpOwotCQlpZiAoY29uZmlnICE9IG51bGwpIHsKLQkJCUV4cG9ydE1TUFVJUHJlZmVyZW5jZXMuc2V0Q29uZmlndXJhdGlvbk5hbWUoY29uZmlnLmdldE5hbWUoKSk7Ci0JCX0KLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L21zcC91aS93aXphcmRzL1NlbGVjdFB1Ymxpc2hpbmdPcHRpb25zUGFnZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvbXNwL3VpL3dpemFyZHMvU2VsZWN0UHVibGlzaGluZ09wdGlvbnNQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiYzMwNzguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvbXNwL3VpL3dpemFyZHMvU2VsZWN0UHVibGlzaGluZ09wdGlvbnNQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC51aS53aXphcmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AudWkuRXhwb3J0TVNQVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AudWkuRXhwb3J0TVNQVUlSZXNvdXJjZXM7Ci0KLS8qKgotICogQSB3aXphcmQgcGFnZSB0aGF0IHByb21wdHMgdGhlIHVzZXIgdG8gc2VsZWN0IHRoZSBwdWJsaXNoaW5nIG9wdGlvbnMgZm9yIHRoZQotICogcHJvY2VzcyB3ZWIgc2l0ZS4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4yCi0gKi8KLXB1YmxpYyBjbGFzcyBTZWxlY3RQdWJsaXNoaW5nT3B0aW9uc1BhZ2UgZXh0ZW5kcwotCQlvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS53aXphcmRzLlNlbGVjdFB1Ymxpc2hpbmdPcHRpb25zUGFnZSB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQUdFX05BTUUgPSBTZWxlY3RQdWJsaXNoaW5nT3B0aW9uc1BhZ2UuY2xhc3MKLQkJCS5nZXROYW1lKCk7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBTZWxlY3RQdWJsaXNoaW5nT3B0aW9uc1BhZ2UoU3RyaW5nIHBhZ2VOYW1lKSB7Ci0JCXN1cGVyKHBhZ2VOYW1lKTsKLQkJc2V0VGl0bGUoRXhwb3J0TVNQVUlSZXNvdXJjZXMuc2VsZWN0UHVibGlzaE9wdGlvbnNXaXphcmRQYWdlX3RpdGxlKTsKLQkJc2V0RGVzY3JpcHRpb24oRXhwb3J0TVNQVUlSZXNvdXJjZXMuc2VsZWN0UHVibGlzaE9wdGlvbnNXaXphcmRQYWdlX3RleHQpOwotCQlzZXRJbWFnZURlc2NyaXB0b3IoRXhwb3J0TVNQVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcigKLQkJCQkiZnVsbC93aXpiYW4vZXhwX21zX3Byal93aXpiYW4uZ2lmIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgU2VsZWN0UHVibGlzaGluZ09wdGlvbnNQYWdlKCkgewotCQl0aGlzKFBBR0VfTkFNRSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9tc3AvdWkvd2l6YXJkcy9wYWNrYWdlLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9tc3AvdWkvd2l6YXJkcy9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxYmQ1MjQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvbXNwL3VpL3dpemFyZHMvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgd2l6YXJkcyBmb3IgZXhwb3J0aW5nIHByb2Nlc3NlcyB0byBNaWNyb3NvZnQgUHJvamVjdHMuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AvLmNsYXNzcGF0aCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1MWM4ZjIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLy5vcHRpb25zIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AvLm9wdGlvbnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmMjc0ZWMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AvLm9wdGlvbnMKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLSMgVHVybiBvbiBkZWJ1ZyB0cmFjZSBmb3IgdGhlIFJpY2ggVGV4dCBwbHVnLWluCi1vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC9kZWJ1Zz10cnVlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC8ucHJvamVjdCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NDAzMWJhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3A8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGM2YzljOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcDsgc2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS41LjAucXVhbGlmaWVyCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC5FeHBvcnRNU1BQbHVnaW4KLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZSwKLSBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0O3Zpc2liaWxpdHk6PXJlZXhwb3J0LAotIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Q7dmlzaWJpbGl0eTo9cmVleHBvcnQsCi0gb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcsCi0gb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWk7dmlzaWJpbGl0eTo9cmVleHBvcnQsCi0gb3JnLmVjbGlwc2UudWksCi0gb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aSwKLSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnVpCi1FY2xpcHNlLUxhenlTdGFydDogdHJ1ZQotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLUNsYXNzUGF0aDogZXhwb3J0bXNwLmphcgotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwL2J1aWxkLnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZDJlNDZjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLXNvdXJjZS5leHBvcnRtc3AuamFyID0gc3JjLwotb3V0cHV0LmV4cG9ydG1zcC5qYXIgPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSBleHBvcnRtc3AuamFyLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgdGVtcGxhdGUvLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICAub3B0aW9ucwotCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC9wbHVnaW4ucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZTY0ZWRlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLQotIyBQbHVnLWluCi1wbHVnaW5OYW1lPUVQRiBFeHBvcnQgTWljcm9zb2Z0IFByb2plY3QKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotCi0jIFdpemFyZHMKLWV4cG9ydFByb2plY3RUZW1wbGF0ZVdpemFyZE5hbWU9TWljcm9zb2Z0IFByb2plY3QKLWV4cG9ydFByb2plY3RUZW1wbGF0ZVdpemFyZERlc2NyaXB0aW9uPUV4cG9ydCBhIHByb2Nlc3MgdG8gYSBNaWNyb3NvZnQgUHJvamVjdC4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwL3BsdWdpbi54bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNjdlMmY4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPHBsdWdpbj4KLQotPCEtLQotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmV4cG9ydFdpemFyZHMiPgotICAgICAgPHdpemFyZAotICAgICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLmVwZi51aS5leHBvcnRXaXphcmRzLmNhdGVnb3J5IgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLnVpLndpemFyZHMuRXhwb3J0TVNQV2l6YXJkIgotICAgICAgICAgICAgaWNvbj0iaWNvbnMvZnVsbC9vYmoxNi9NU1Byb2plY3QuZ2lmIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLndpemFyZHMuRXhwb3J0VG9NU1Byb2plY3RXaXphcmQiCi0gICAgICAgICAgICBuYW1lPSIlZXhwb3J0UHJvamVjdFRlbXBsYXRlV2l6YXJkTmFtZSI+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAlZXhwb3J0UHJvamVjdFRlbXBsYXRlV2l6YXJkRGVzY3JpcHRpb24KLSAgICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICA8L3dpemFyZD4KLSAgIDwvZXh0ZW5zaW9uPgotICAgCi0gICA8ZXh0ZW5zaW9uLXBvaW50Ci0gICAgICAgICBpZD0iZXhwb3J0TVNQV2l6YXJkIgotICAgICAgICAgbmFtZT0iRXhwb3J0IE1pY3Jvc29mdCBQcm9qZWN0IFdpemFyZCBFeHRlbnNpb24iCi0gICAgICAgICBzY2hlbWE9InNjaGVtYS9FeHBvcnRNU1BXaXphcmQuZXhzZCIgLz4KLQotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmVwZi51aS5leHBvcnRXaXphcmRzIj4KLSAgICAgIDx3aXphcmQgaWQ9Im9yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLndpemFyZHMuRXhwb3J0VG9NU1Byb2plY3RXaXphcmQiLz4KLSAgIDwvZXh0ZW5zaW9uPgotLS0+Ci0KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3Avc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvbXNwL0V4cG9ydE1TUEV4Y2VwdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3Avc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvbXNwL0V4cG9ydE1TUEV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNGJjNzI2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L21zcC9FeHBvcnRNU1BFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwOwotCi0vKioKLSAqIFNpZ25hbHMgdGhhdCBhbiBFeHBvcnQgTWljcm9zb2Z0IFByb2plY3Qgb3BlcmF0aW9uIGhhcyBmYWlsZWQuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRXhwb3J0TVNQRXhjZXB0aW9uIGV4dGVuZHMgRXhwb3J0TVNQU2VydmljZUV4Y2VwdGlvbiB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtOTIzMTg5NzAwNTYxODA2MjYyTDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIEV4cG9ydE1TUEV4Y2VwdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIGdpdmVuIHRoZSByb290IGNhdXNlIG9mIHRoZSBleGNlcHRpb24uCi0JICogCi0JICogQHBhcmFtIHJvb3RDYXVzZQotCSAqICAgICAgICAgICAgdGhlIHJvb3QgY2F1c2Ugb2YgdGhlIGV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBFeHBvcnRNU1BFeGNlcHRpb24oVGhyb3dhYmxlIHJvb3RDYXVzZSkgewotCQlzdXBlcihyb290Q2F1c2UpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UgZ2l2ZW4gdGhlIGVycm9yIG1lc3NhZ2UuCi0JICogCi0JICogQHBhcmFtIGVycm9yTXNnCi0JICogICAgICAgICAgICB0aGUgZXJyb3IgbWVzc2FnZQotCSAqLwotCXB1YmxpYyBFeHBvcnRNU1BFeGNlcHRpb24oU3RyaW5nIGVycm9yTXNnKSB7Ci0JCXN1cGVyKGVycm9yTXNnKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIGdpdmVuIHRoZSByb290IGNhdXNlIG9mIHRoZSBleGNlcHRpb24gYW5kIHRoZQotCSAqIGVycm9yIG1lc3NhZ2UuCi0JICogCi0JICogQHBhcmFtIHJvb3RDYXVzZQotCSAqICAgICAgICAgICAgdGhlIHJvb3QgY2F1c2Ugb2YgdGhlIGV4Y2VwdGlvbgotCSAqIEBwYXJhbSBlcnJvck1zZwotCSAqICAgICAgICAgICAgdGhlIGVycm9yIG1lc3NhZ2UKLQkgKi8KLQlwdWJsaWMgRXhwb3J0TVNQRXhjZXB0aW9uKFRocm93YWJsZSByb290Q2F1c2UsIFN0cmluZyBlcnJvck1zZykgewotCQlzdXBlcihyb290Q2F1c2UsIGVycm9yTXNnKTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9tc3AvRXhwb3J0TVNQT3B0aW9ucy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3Avc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvbXNwL0V4cG9ydE1TUE9wdGlvbnMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjljNzI1NC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9tc3AvRXhwb3J0TVNQT3B0aW9ucy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3A7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LkV4cG9ydFByb2Nlc3NPcHRpb25zOwotCi0vKioKLSAqIFRoZSBleHBvcnQgTWljcm9zb2Z0IFByb2plY3Qgb3B0aW9ucy4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgNy4yCi0gKi8KLXB1YmxpYyBjbGFzcyBFeHBvcnRNU1BPcHRpb25zIGV4dGVuZHMgRXhwb3J0UHJvY2Vzc09wdGlvbnMgewotCi0JcHJpdmF0ZSBTdHJpbmcgbXNwcm9qZWN0TmFtZTsKLQotCS8qKgotCSAqIEdldHMgdGhlIE1pY3Jvc29mdCBQcm9qZWN0IG5hbWUuCi0JICogCi0JICogQHJldHVybiB0aGUgbmFtZSBvZiB0aGUgZXhwb3J0ZWQgTWljcm9zb2Z0IFByb2plY3QgbmFtZQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TVNQcm9qZWN0TmFtZSgpIHsKLQkJcmV0dXJuIG1zcHJvamVjdE5hbWU7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgTWljcm9zb2Z0IFByb2plY3QgbmFtZS4KLQkgKiAKLQkgKiBAcGFyYW0gdGVtcGxhdGVOYW1lCi0JICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgZXhwb3J0ZWQgTWljcm9zb2Z0IFByb2plY3QKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNU1Byb2plY3ROYW1lKFN0cmluZyBtc3Byb2plY3ROYW1lKSB7Ci0JCXRoaXMubXNwcm9qZWN0TmFtZSA9IG1zcHJvamVjdE5hbWU7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9tc3AvRXhwb3J0TVNQUGx1Z2luLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9tc3AvRXhwb3J0TVNQUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxMzRkMjQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3Avc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvbXNwL0V4cG9ydE1TUFBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3A7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpLkFic3RyYWN0UGx1Z2luOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotCi0vKioKLSAqIFRoZSBFeHBvcnQgTWljcm9zb2Z0IFByb2plY3QgcGx1Zy1pbiBjbGFzcy4KLSAqIAotICogQGF1dGhvciBCaW5neHVlIFh1Ci0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEV4cG9ydE1TUFBsdWdpbiBleHRlbmRzIEFic3RyYWN0UGx1Z2luIHsKLQotCS8vIFRoZSBzaGFyZWQgaW5zdGFuY2UuCi0JcHJpdmF0ZSBzdGF0aWMgRXhwb3J0TVNQUGx1Z2luIHBsdWdpbjsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIEV4cG9ydE1TUFBsdWdpbigpIHsKLQkJc3VwZXIoKTsKLQkJcGx1Z2luID0gdGhpczsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIEFic3RyYWN0UGx1Z2luI3N0YXJ0KEJ1bmRsZUNvbnRleHQpCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RhcnQoY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBBYnN0cmFjdFBsdWdpbiNzdG9wKEJ1bmRsZUNvbnRleHQpCi0JICovCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdG9wKGNvbnRleHQpOwotCQlwbHVnaW4gPSBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNoYXJlZCBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEV4cG9ydE1TUFBsdWdpbiBnZXREZWZhdWx0KCkgewotCQlyZXR1cm4gcGx1Z2luOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3Avc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvbXNwL0V4cG9ydE1TUFJlc291cmNlcy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3Avc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvbXNwL0V4cG9ydE1TUFJlc291cmNlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMTM4Yzk3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L21zcC9FeHBvcnRNU1BSZXNvdXJjZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotLyoqCi0gKiBUaGUgRXhwb3J0IE1pY3Jvc29mdCBQcm9qZWN0IG1lc3NhZ2UgcmVzb3VyY2UgYnVuZGxlIGFjY2Vzc29yIGNsYXNzLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEV4cG9ydE1TUFJlc291cmNlcyBleHRlbmRzIE5MUyB7Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgQlVORExFX05BTUUgPSBFeHBvcnRNU1BSZXNvdXJjZXMuY2xhc3MuZ2V0UGFja2FnZSgpCi0JCQkuZ2V0TmFtZSgpCi0JCQkrICIuUmVzb3VyY2VzIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBFeHBvcnRNU1BSZXNvdXJjZXMoKSB7Ci0JCS8vIERvIG5vdCBpbnN0YW50aWF0ZQotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGV4cG9ydE1TUFdpemFyZF90aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGV4cG9ydE1TUFRhc2tfbmFtZTsKLQotCXN0YXRpYyB7Ci0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIEV4cG9ydE1TUFJlc291cmNlcy5jbGFzcyk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L21zcC9FeHBvcnRNU1BTZXJ2aWNlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9tc3AvRXhwb3J0TVNQU2VydmljZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YjYyNzBkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L21zcC9FeHBvcnRNU1BTZXJ2aWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzczsKLQotLyoqCi0gKiBUaGUgZGVmYXVsdCBFeHBvcnQgTWljcm9zb2Z0IFByb2plY3QgU2VydmljZSBpbXBsZW1lbnRhdGlvbi4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBFeHBvcnRNU1BTZXJ2aWNlIGltcGxlbWVudHMgSUV4cG9ydE1TUFNlcnZpY2UgewotCi0JLy8gVGhlIHNoYXJlZCBpbnN0YW5jZS4KLQlwcml2YXRlIHN0YXRpYyBFeHBvcnRNU1BTZXJ2aWNlIGluc3RhbmNlID0gbnVsbDsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNoYXJlZCBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEV4cG9ydE1TUFNlcnZpY2UgZ2V0SW5zdGFuY2UoKSB7Ci0JCWlmIChpbnN0YW5jZSA9PSBudWxsKSB7Ci0JCQlzeW5jaHJvbml6ZWQgKEV4cG9ydE1TUFNlcnZpY2UuY2xhc3MpIHsKLQkJCQlpZiAoaW5zdGFuY2UgPT0gbnVsbCkgewotCQkJCQlpbnN0YW5jZSA9IG5ldyBFeHBvcnRNU1BTZXJ2aWNlKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLklFeHBvcnRNU1BTZXJ2aWNlI2V4cG9ydE1TUHJvamVjdChQcm9jZXNzLAotCSAqICAgICAgRXhwb3J0TVNQT3B0aW9ucykKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBleHBvcnRNU1Byb2plY3QoUHJvY2VzcyBwcm9jZXNzLAotCQkJRXhwb3J0TVNQT3B0aW9ucyBleHBvcnRPcHRpb25zKSB0aHJvd3MgRXhwb3J0TVNQU2VydmljZUV4Y2VwdGlvbiB7Ci0JCXJldHVybiBuZXcgRXhwb3J0TVNQWE1MU2VydmljZSgpLmV4cG9ydChwcm9jZXNzLCBleHBvcnRPcHRpb25zKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L21zcC9FeHBvcnRNU1BTZXJ2aWNlRXhjZXB0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9tc3AvRXhwb3J0TVNQU2VydmljZUV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZmZhMTFmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L21zcC9FeHBvcnRNU1BTZXJ2aWNlRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcDsKLQotLyoqCi0gKiBTaWduYWxzIHRoYXQgYSBFeHBvcnQgUHJvamVjdCBQbGFuIFNlcnZpY2Ugb3BlcmF0aW9uIGhhcyBmYWlsZWQuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRXhwb3J0TVNQU2VydmljZUV4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbiB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtNjEwMzY4OTg2ODU3MjQ4MDM1OUw7Ci0KLQkvKioKLQkgKiBUaGUgcm9vdCBjYXVzZSBvZiB0aGUgZXhjZXB0aW9uLgotCSAqLwotCXByb3RlY3RlZCBUaHJvd2FibGUgcm9vdENhdXNlOwotCi0JLyoqCi0JICogVGhlIGVycm9yIG1lc3NhZ2UgYXNzb2NpYXRlZCB3aXRoIHRoZSBleGNlcHRpb24uCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBlcnJvck1zZzsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIEV4cG9ydE1TUFNlcnZpY2VFeGNlcHRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBnaXZlbiB0aGUgcm9vdCBjYXVzZSBvZiB0aGUgZXhjZXB0aW9uLgotCSAqIAotCSAqIEBwYXJhbSByb290Q2F1c2UKLQkgKiAgICAgICAgICAgIHRoZSByb290IGNhdXNlIG9mIHRoZSBleGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgRXhwb3J0TVNQU2VydmljZUV4Y2VwdGlvbihUaHJvd2FibGUgcm9vdENhdXNlKSB7Ci0JCXRoaXMocm9vdENhdXNlLCByb290Q2F1c2UuZ2V0TWVzc2FnZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIGdpdmVuIHRoZSBlcnJvciBtZXNzYWdlLgotCSAqIAotCSAqIEBwYXJhbSBlcnJvck1zZwotCSAqICAgICAgICAgICAgdGhlIGVycm9yIG1lc3NhZ2UKLQkgKi8KLQlwdWJsaWMgRXhwb3J0TVNQU2VydmljZUV4Y2VwdGlvbihTdHJpbmcgZXJyb3JNc2cpIHsKLQkJdGhpcyhudWxsLCBlcnJvck1zZyk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBnaXZlbiB0aGUgcm9vdCBjYXVzZSBvZiB0aGUgZXhjZXB0aW9uIGFuZCB0aGUKLQkgKiBlcnJvciBtZXNzYWdlLgotCSAqIAotCSAqIEBwYXJhbSByb290Q2F1c2UKLQkgKiAgICAgICAgICAgIHRoZSByb290IGNhdXNlIG9mIHRoZSBleGNlcHRpb24KLQkgKiBAcGFyYW0gZXJyb3JNc2cKLQkgKiAgICAgICAgICAgIHRoZSBlcnJvciBtZXNzYWdlCi0JICovCi0JcHVibGljIEV4cG9ydE1TUFNlcnZpY2VFeGNlcHRpb24oVGhyb3dhYmxlIHJvb3RDYXVzZSwgU3RyaW5nIGVycm9yTXNnKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMucm9vdENhdXNlID0gcm9vdENhdXNlOwotCQl0aGlzLmVycm9yTXNnID0gZXJyb3JNc2c7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcm9vdCBjYXVzZSBvZiB0aGUgZXhjZXB0aW9uLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHJvb3QgY2F1c2Ugb2YgdGhlIGV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBUaHJvd2FibGUgZ2V0Um9vdENhdXNlKCkgewotCQlyZXR1cm4gcm9vdENhdXNlOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L21zcC9FeHBvcnRNU1BYTUxPcGVyYXRpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L21zcC9FeHBvcnRNU1BYTUxPcGVyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmVlZjAwZi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9tc3AvRXhwb3J0TVNQWE1MT3BlcmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcDsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuSVJ1bm5hYmxlV2l0aFByb2dyZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnNlcnZpY2VzLkFic3RyYWN0UHVibGlzaE1hbmFnZXI7Ci0KLS8qKgotICogVGhlIEV4cG9ydCBNaWNyb3NvZnQgUHJvamVjdCBYTUwgZmlsZSBvcGVyYXRpb24uCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRXhwb3J0TVNQWE1MT3BlcmF0aW9uIGltcGxlbWVudHMgSVJ1bm5hYmxlV2l0aFByb2dyZXNzIHsKLQotCXByaXZhdGUgQWJzdHJhY3RQdWJsaXNoTWFuYWdlciBwdWJsaXNoTWdyOwotCi0JcHJpdmF0ZSBTdHJpbmcgcHVibGlzaGVkX3VybDsKLQotCXByaXZhdGUgRXhjZXB0aW9uIGV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIEV4cG9ydE1TUFhNTE9wZXJhdGlvbihBYnN0cmFjdFB1Ymxpc2hNYW5hZ2VyIHB1Ymxpc2hNZ3IpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5wdWJsaXNoTWdyID0gcHVibGlzaE1ncjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwdWJsaXNoZWQgVVJMLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UHVibGlzaGVkVXJsKCkgewotCQlyZXR1cm4gcHVibGlzaGVkX3VybDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBleGNlcHRpb24sIGlmIGFueSwgdGhhdCBvY2N1cnJlZCB3aGlsZSBydW5uaW5nIHRoZSBvcGVyYXRpb24uCi0JICovCi0JcHVibGljIEV4Y2VwdGlvbiBnZXRFeGNlcHRpb24oKSB7Ci0JCXJldHVybiBleGNlcHRpb247Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uSVJ1bm5hYmxlV2l0aFByb2dyZXNzI3J1bihJUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLAotCQkJSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQlleGNlcHRpb24gPSBudWxsOwotCQltb25pdG9yLmJlZ2luVGFzaygiIiwgSVByb2dyZXNzTW9uaXRvci5VTktOT1dOKTsgLy8kTk9OLU5MUy0xJAotCQltb25pdG9yLnNldFRhc2tOYW1lKEV4cG9ydE1TUFJlc291cmNlcy5leHBvcnRNU1BUYXNrX25hbWUpOwotCQl0cnkgewotCQkJcHVibGlzaE1nci5wdWJsaXNoKG1vbml0b3IpOwotCQkJcHVibGlzaGVkX3VybCA9IHB1Ymxpc2hNZ3IuZ2V0UHVibGlzaGVkVXJsKCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlleGNlcHRpb24gPSBlOwotCQl9IGZpbmFsbHkgewotCQkJbW9uaXRvci5kb25lKCk7Ci0JCQlwdWJsaXNoTWdyID0gbnVsbDsKLQkJfQotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L21zcC9FeHBvcnRNU1BYTUxTZXJ2aWNlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9tc3AvRXhwb3J0TVNQWE1MU2VydmljZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNDMxMWMzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L21zcC9FeHBvcnRNU1BYTUxTZXJ2aWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzk2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKLWltcG9ydCBqYXZhLnV0aWwuR3JlZ29yaWFuQ2FsZW5kYXI7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlN0YWNrOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5YTUxSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5BZGFwdGVyRmFjdG9yeVRyZWVJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlZEFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuRmlsZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5YTUxVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLlByb2Nlc3NDb25maWd1cmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuQWN0aXZpdHlXcmFwcGVySXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuSUJTSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5Sb2xlRGVzY3JpcHRvcldyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLlRhc2tEZXNjcmlwdG9yV3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnVpLlVJSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Db25maWd1cmFibGVDb21wb3NlZEFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5QcmVkZWNlc3Nvckxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlByb2Nlc3NVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5TdXBwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLlJlc291cmNlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkRvY3VtZW50Um9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5QcmVkZWNlc3Nvckxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QudXRpbC5Nc3Byb2plY3RSZXNvdXJjZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcuc2VydmljZXMuUHVibGlzaEhUTUxPcHRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnNlcnZpY2VzLlB1Ymxpc2hNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnNlcnZpY2VzLlB1Ymxpc2hPcHRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLndpemFyZHMuUHVibGlzaFByb2dyZXNzTW9uaXRvckRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNhcGFiaWxpdHlQYXR0ZXJuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcnlQcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpYmFibGVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWlsZXN0b25lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtCcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya09yZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya09yZGVyVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLlByb2dyZXNzTW9uaXRvckRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uSVJ1bm5hYmxlV2l0aFByb2dyZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLQotLyoqCi0gKiBUaGUgZGVmYXVsdCBFeHBvcnQgTWljcm9zb2Z0IFByb2plY3QgUGxhbiBTZXJ2aWNlIGltcGxlbWVudGF0aW9uLgotICogCi0gKiBAYXV0aG9yIEJpbmd4dWUgWHUKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICogCi0gKiBCdWdzIGZpeGVkOiBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTU1MDg5Ci0gKiBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTU1MDg2Ci0gKiBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTU1MDk1Ci0gKiBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTU3MjY1Ci0gKiBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTU1MTU1Ci0gKiBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTU2OTU5Ci0gKiBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTU3MzIxCi0gKiBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTU5MjMwCi0gKiBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTYyMzM2Ci0gKiBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTY4ODAxIGZpeCBmb3IKLSAqIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNzY5NTEKLSAqIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNzc0MjgKLSAqLwotcHVibGljIGNsYXNzIEV4cG9ydE1TUFhNTFNlcnZpY2UgewotCi0JLy8gSWYgdHJ1ZSwgZ2VuZXJhdGUgZGVidWcgdHJhY2VzLgotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gZGVidWcgPSBFeHBvcnRNU1BQbHVnaW4uZ2V0RGVmYXVsdCgpLmlzRGVidWdnaW5nKCk7Ci0KLQkvLyBBbGwgVGFza3MgcmVmZXJlbmNlZCBieSB0aGUgZXhwb3J0ZWQgUHJvamVjdCBUZW1wbGF0ZS4KLQlwcml2YXRlIExpc3QgcmVmZXJlbmNlZFRhc2tzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JcHJpdmF0ZSBIYXNoTWFwIHJvbGVzVG9VaWRNYXAgPSBuZXcgSGFzaE1hcCgpOwotCi0JcHJpdmF0ZSBIYXNoTWFwIHRhc2tVaWRUb1dic1dhcHBlclBhdGhNYXAgPSBuZXcgSGFzaE1hcCgpOwotCi0JcHJpdmF0ZSBIYXNoTWFwIHdic1dhcHBlclBhdGhUb0xvY2FsUHJlZExpc3RNYXAgPSBuZXcgSGFzaE1hcCgpOwotCi0JcHJpdmF0ZSBIYXNoTWFwIHdic0d1aWRUb1Rhc2tVaWRNYXAgPSBuZXcgSGFzaE1hcCgpOwotCi0JcHJpdmF0ZSBIYXNoTWFwIHdic1dyYXBwZXJQYXRoVG9QcmVkTGlzdE1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0KLQkvLyBUaGUgbmFtZSBvZiB0aGUgY29udGVudCBmb2xkZXIuIFRoaXMgd2lsbCBiZSBuYW1lZCBhZnRlciB0aGUgY29udGV4dC4KLQlwcml2YXRlIFN0cmluZyBjb250ZW50Rm9sZGVyTmFtZTsKLQotCXByaXZhdGUgU3RyaW5nIGFiVGFyZ2V0RGlyOwotCi0JLy8gSWYgdHJ1ZSwgb25seSBleHBvcnQgYnJlYWtkb3duIGVsZW1lbnRzIHdpdGggJ2lzUGxhbm5lZCcgYXR0cmlidXRlcyBzZXQKLQkvLyB0byB0cnVlLgotCXByb3RlY3RlZCBib29sZWFuIGV4cG9ydE9ubHlQbGFubmVkRWxlbWVudHM7Ci0KLQlwcml2YXRlIGJvb2xlYW4gcHVibGlzaENvbnRlbnRTaXRlID0gZmFsc2U7Ci0KLQlwcml2YXRlIGludCB0YXNrX3VpZCA9IDE7Ci0KLQlwcml2YXRlIGludCByZXNfdWlkID0gMTsKLQotCXByaXZhdGUgaW50IGFzc2lnbl91aWQgPSAxOwotCi0JcHJvdGVjdGVkIE1zcHJvamVjdEZhY3RvcnkgcHJvamVjdEZhY3RvcnkgPSBNc3Byb2plY3RGYWN0b3J5LmVJTlNUQU5DRTsKLQotCS8vIFRoZSBwcm9jZXNzIHRvIGJlIGV4cG9ydGVkLgotCXByaXZhdGUgUHJvY2VzcyBwcm9jZXNzOwotCXByaXZhdGUgTWV0aG9kQ29uZmlndXJhdGlvbiBwcm9jZXNzQ29uZmlnOwotCi0JcHJpdmF0ZSBDb25maWd1cmFibGVDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IHdic0FkYXB0ZXJGYWN0b3J5OwotCi0JLy8gVGhlIHByb2Nlc3MgY29uZmlndXJhdG9yIGZvciBmaWx0ZXJpbmcgYnJlYWtkb3duIGVsZW1lbnRzIGluIGEKLQkvLyBjb25maWd1cmF0aW9uLgotCXByaXZhdGUgUHJvY2Vzc0NvbmZpZ3VyYXRvciBicmVha2Rvd25FbGVtZW50RmlsdGVyOwotCi0JcHJpdmF0ZSBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciB3YnNDb250ZW50UHJvdmlkZXI7Ci0KLQkvLyBNYXAgcHJvY2Vzc2VzIHRvIHN1cHByZXNzaW9uIG9iamVjdHMuCi0JcHJpdmF0ZSBNYXAgc3VwcHJlc3Npb25NYXAgPSBuZXcgSGFzaE1hcCgpOwotCi0JLy8gVGhlIHN1cHByZXNzaW9uIG9iamVjdCBhc3NvY2lhdGVkIHdpdGggdGhlIHNlbGVjdGVkIHByb2Nlc3MgdG8gYmUKLQkvLyBleHBvcnRlZC4KLQlwcml2YXRlIFN1cHByZXNzaW9uIHN1cHByZXNzaW9uOwotCi0JLy8gVGhlIFdCUyBlbGVtZW50IHBhdGhzLgotCXByaXZhdGUgU3RhY2sgZWxlbWVudFBhdGhzID0gbmV3IFN0YWNrKCk7Ci0KLQlwcml2YXRlIE9iamVjdCBjdXJyZW50RWxlbWVudDsKLQotCXByaXZhdGUgU3RyaW5nIGN1cnJlbnRFbGVtZW50UGF0aDsKLQotCXByaXZhdGUgUHJlZGVjZXNzb3JMaXN0IGN1cnJlbnRQcmVkTGlzdDsKLQkKLQlwcml2YXRlIEhhc2hNYXA8VGFzaywgV29ya0JyZWFrZG93bkVsZW1lbnQ+IHRhc2tUb1diZU1hcDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIEV4cG9ydE1TUFhNTFNlcnZpY2UoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogRXhwb3J0IGEgcHJvY2VzcyB0byBhIE1pY3Jvc29mdCBQcm9qZWN0IFhNTCBmaWxlLgotCSAqIAotCSAqIEBwYXJhbSBwcm9jZXNzCi0JICogICAgICAgICAgICBhIGNhcGFiaWxpdHkgcGF0dGVybiBvciBkZWxpdmVyeSBwcm9jZXNzCi0JICogQHBhcmFtIGV4cG9ydE9wdGlvbnMKLQkgKiAgICAgICAgICAgIGEgY29sbGVjdGlvbiBvZiB1c2VyIHNwZWNpZmllZCBleHBvcnQgb3B0aW9ucwotCSAqIEB0aHJvd3MgRXhwb3J0TVNQU2VydmljZUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycyB3aGlsZSBleGVjdXRpbmcgdGhlIG9wZXJhdGlvbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGV4cG9ydChQcm9jZXNzIHByb2Nlc3MsIEV4cG9ydE1TUE9wdGlvbnMgZXhwb3J0T3B0aW9ucykKLQkJCXRocm93cyBFeHBvcnRNU1BTZXJ2aWNlRXhjZXB0aW9uIHsKLQkJU3RyaW5nIG1zcHJvamVjdE5hbWUgPSBleHBvcnRPcHRpb25zLmdldE1TUHJvamVjdE5hbWUoKTsKLQkJRmlsZSBleHBvcnREaXIgPSBleHBvcnRPcHRpb25zLmdldEV4cG9ydERpcigpOwotCQlwdWJsaXNoQ29udGVudFNpdGUgPSBleHBvcnRPcHRpb25zLmdldFB1Ymxpc2hXZWJTaXRlKCk7Ci0JCVB1Ymxpc2hPcHRpb25zIHB1Ymxpc2hpbmdPcHRpb25zID0gZXhwb3J0T3B0aW9ucy5nZXRQdWJsaXNoaW5nT3B0aW9ucygpOwotCQlwcm9jZXNzQ29uZmlnID0gZXhwb3J0T3B0aW9ucy5nZXRNZXRob2RDb25maWd1cmF0aW9uKCk7Ci0JCWlmIChkZWJ1ZykgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCIkJCQgZXhwb3J0aW5nIHRvIE1pY3Jvc29mdCBQcm9qZWN0ISIpOyAvLyROT04tTkxTLTEkCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIiQkJCBwcm9jZXNzICAgICAgICAgID0gIiArIHByb2Nlc3MpOyAvLyROT04tTkxTLTEkCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIiQkJCBjb25maWd1cmF0aW9uICAgID0gIiArIHByb2Nlc3NDb25maWcpOyAvLyROT04tTkxTLTEkCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIiQkJCBtc3Byb2plY3ROYW1lICAgID0gIiAvLyROT04tTkxTLTEkCi0JCQkJCSsgbXNwcm9qZWN0TmFtZSk7Ci0JCQlTeXN0ZW0ub3V0Ci0JCQkJCS5wcmludGxuKCIkJCQgdGFyZ2V0RGlyICAgICAgICAgICAgICAgICA9ICIgKyBleHBvcnREaXIuZ2V0QWJzb2x1dGVQYXRoKCkpOyAvLyROT04tTkxTLTEkCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIiQkJCBleHBvcnRPbmx5UGxhbm5lZEVsZW1lbnRzID0gIiAvLyROT04tTkxTLTEkCi0JCQkJCSsgZXhwb3J0T25seVBsYW5uZWRFbGVtZW50cyk7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIiQkJCBwdWJsaXNoQ29uZmlnT3B0aW9ucyAgICAgID0gIiAvLyROT04tTkxTLTEkCi0JCQkJCSsgcHVibGlzaGluZ09wdGlvbnMpOwotCQl9Ci0KLQkJLy8gY29uc3RydWN0IHRoZSBleHBvcnQgdGFyZ2V0IHhtbCBmaWxlIHBhdGgKLQkJaWYgKCFleHBvcnREaXIuZXhpc3RzKCkpIHsKLQkJCWV4cG9ydERpci5ta2RpcnMoKTsKLQkJfQotCQlhYlRhcmdldERpciA9IGV4cG9ydERpci5nZXRBYnNvbHV0ZVBhdGgoKTsKLQkJUGF0aCBleHBvcnRQYXRoID0gbmV3IFBhdGgoYWJUYXJnZXREaXIpOwotCQlib29sZWFuIGVuZFdpdGhYbWxFeHQgPSBtc3Byb2plY3ROYW1lLnRvTG93ZXJDYXNlKCkuZW5kc1dpdGgoIi54bWwiKTsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgZXhwb3J0UGF0aFN0ciA9IChleHBvcnRQYXRoLmFwcGVuZChlbmRXaXRoWG1sRXh0ID8gbXNwcm9qZWN0TmFtZQotCQkJCTogKG1zcHJvamVjdE5hbWUgKyAiLnhtbCIpKSkudG9PU1N0cmluZygpOyAvLyROT04tTkxTLTEkCi0JCWlmIChkZWJ1ZykKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiJCQkIGV4cG9ydFBhdGhTdHIgICAgICAgICAgICAgICAgID0gIiAvLyROT04tTkxTLTEkCi0JCQkJCSsgZXhwb3J0UGF0aFN0cik7Ci0KLQkJLy8gY29uc3RydWN0IHRoZSBlbXB0eSBNUyBwcm9qZWN0IHhtbCB0ZW1wbGF0ZSBmaWxlIHBhdGgKLQkJU3RyaW5nIGVtcHR5VGVtcGxhdGVGaWxlID0gRXhwb3J0TVNQUGx1Z2luLmdldERlZmF1bHQoKQotCQkJCS5nZXRJbnN0YWxsUGF0aCgpCi0JCQkJKyAidGVtcGxhdGUiIC8vJE5PTi1OTFMtMSQKLQkJCQkrIEZpbGUuc2VwYXJhdG9yICsgIm1zcHJvamVjdF8yMDAzX3RlbXBsYXRlLnhtbCI7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKGRlYnVnKQotCQkJU3lzdGVtLm91dC5wcmludGxuKCIkJCQgZW1wdHlUZW1wbGF0ZUZpbGUgICAgICAgICAgICAgPSAiIC8vJE5PTi1OTFMtMSQKLQkJCQkJKyBlbXB0eVRlbXBsYXRlRmlsZSk7Ci0KLQkJLy8gY29weSB0aGUgZW1wdHkgdGVtcGxhdGUgTVMgcHJvamVjdCB4bWwgZmlsZSB0byB0aGUgZXhwb3J0IHRhcmdldAotCQl0cnkgewotCQkJRmlsZSBzcmMgPSBuZXcgRmlsZShlbXB0eVRlbXBsYXRlRmlsZSk7Ci0JCQlGaWxlIGRzdCA9IG5ldyBGaWxlKGV4cG9ydFBhdGhTdHIpOwotCQkJRmlsZVV0aWwuY29weUZpbGUoc3JjLCBkc3QpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCi0JCVByb2plY3QgcHJvamVjdCA9IG51bGw7Ci0JCVVSSSBmaWxlVVJJID0gVVJJLmNyZWF0ZUZpbGVVUkkoZXhwb3J0UGF0aFN0cik7Ci0KLQkJdHJ5IHsKLQotCQkJWE1MUmVzb3VyY2UgcmVzID0gbmV3IE1zcHJvamVjdFJlc291cmNlSW1wbChmaWxlVVJJKTsKLQkJCXJlcy5nZXREZWZhdWx0U2F2ZU9wdGlvbnMoKS5wdXQoCi0JCQkJCVhNTFJlc291cmNlLk9QVElPTl9FWFRFTkRFRF9NRVRBX0RBVEEsIEJvb2xlYW4uVFJVRSk7Ci0JCQlyZXMuZ2V0RGVmYXVsdExvYWRPcHRpb25zKCkucHV0KAotCQkJCQlYTUxSZXNvdXJjZS5PUFRJT05fRVhURU5ERURfTUVUQV9EQVRBLCBCb29sZWFuLlRSVUUpOwotCQkJcmVzLmdldERlZmF1bHRTYXZlT3B0aW9ucygpLnB1dChYTUxSZXNvdXJjZS5PUFRJT05fU0NIRU1BX0xPQ0FUSU9OLAotCQkJCQlCb29sZWFuLlRSVUUpOwotCQkJcmVzLmdldERlZmF1bHRTYXZlT3B0aW9ucygpLnB1dCgKLQkJCQkJWE1MUmVzb3VyY2UuT1BUSU9OX1VTRV9FTkNPREVEX0FUVFJJQlVURV9TVFlMRSwKLQkJCQkJQm9vbGVhbi5UUlVFKTsKLQkJCXJlcy5nZXREZWZhdWx0TG9hZE9wdGlvbnMoKS5wdXQoCi0JCQkJCVhNTFJlc291cmNlLk9QVElPTl9VU0VfTEVYSUNBTF9IQU5ETEVSLCBCb29sZWFuLlRSVUUpOwotCQkJcmVzLmxvYWQobnVsbCk7Ci0KLQkJCURvY3VtZW50Um9vdCBkb2NSb290ID0gKERvY3VtZW50Um9vdCkgcmVzLmdldEVPYmplY3QoIi8iKTsgLy8kTk9OLU5MUy0xJAotCQkJcHJvamVjdCA9IChQcm9qZWN0KSBkb2NSb290LmdldFByb2plY3QoKTsKLQotCQkJdGFza1RvV2JlTWFwID0gbmV3IEhhc2hNYXA8VGFzaywgV29ya0JyZWFrZG93bkVsZW1lbnQ+KCk7Ci0JCQlpZiAoISBnZW5lcmF0ZU1TUHJvamVjdChwcm9jZXNzLCBwcm9qZWN0LCBleHBvcnRPcHRpb25zKSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQotCQkJcmVzLnNhdmUobnVsbCk7Ci0KLQkJCWlmIChkZWJ1ZykgewotCQkJCXByaW50TVNQcm9qZWN0KHByb2plY3QpOwotCQkJfQotCi0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJdGhyb3cgbmV3IEV4cG9ydE1TUEV4Y2VwdGlvbihlKTsKLQkJfQotCi0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIEV4cG9ydHMgYSBjYXBhYmlsaXR5IHBhdHRlcm4gb3IgZGVsaXZlcnkgcHJvY2VzcyB0byBhIE1pY3Jvc29mdCBQcm9qZWN0Ci0JICogWE1MIGZpbGUuCi0JICogCi0JICogQHBhcmFtIHByb2Nlc3MKLQkgKiAgICAgICAgICAgIGEgY2FwYWJpbGl0eSBwYXR0ZXJuIG9yIGRlbGl2ZXJ5IHByb2Nlc3MKLQkgKiBAcGFyYW0gcHJvamVjdAotCSAqICAgICAgICAgICAgYSBNaWNyb3NvZnQgUHJvamVjdCBvYmplY3QKLQkgKiBAcGFyYW0gZXhwb3J0T3B0aW9ucwotCSAqICAgICAgICAgICAgYSBjb2xsZWN0aW9uIG9mIHVzZXIgc3BlY2lmaWVkIGV4cG9ydCBvcHRpb25zCi0JICogQHRocm93cyBFeHBvcnRNU1BTZXJ2aWNlRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlIGV4ZWN1dGluZyB0aGUgb3BlcmF0aW9uCi0JICovCi0JcHVibGljIGJvb2xlYW4gZ2VuZXJhdGVNU1Byb2plY3QoUHJvY2VzcyBwcm9jZXNzLCBQcm9qZWN0IHByb2plY3QsCi0JCQlFeHBvcnRNU1BPcHRpb25zIGV4cG9ydE9wdGlvbnMpIHRocm93cyBFeGNlcHRpb24gewotCQlpZiAocHJvY2VzcyA9PSBudWxsIHx8IHByb2plY3QgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotCQl9Ci0KLQkJdHJ5IHsKLQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gZXhwb3J0T3B0aW9ucy5nZXRNZXRob2RDb25maWd1cmF0aW9uKCk7Ci0JCQlpZiAoY29uZmlnID09IG51bGwpIHsKLQkJCQkvLyBHZXQgdGhlIGRlZmF1bHQgbWV0aG9kIGNvbmZpZ3VyYXRpb24gYXNzb2NpYXRlZCB3aXRoIHRoZQotCQkJCS8vIHByb2Nlc3MuCi0JCQkJaWYgKHByb2Nlc3MgaW5zdGFuY2VvZiBEZWxpdmVyeVByb2Nlc3MpIHsKLQkJCQkJY29uZmlnID0gKChEZWxpdmVyeVByb2Nlc3MpIHByb2Nlc3MpLmdldERlZmF1bHRDb250ZXh0KCk7Ci0JCQkJfSBlbHNlIGlmIChwcm9jZXNzIGluc3RhbmNlb2YgQ2FwYWJpbGl0eVBhdHRlcm4pIHsKLQkJCQkJY29uZmlnID0gKChDYXBhYmlsaXR5UGF0dGVybikgcHJvY2VzcykuZ2V0RGVmYXVsdENvbnRleHQoKTsKLQkJCQl9IGVsc2UgewotCQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0JCQkJfQotCQkJfQotCi0JCQkvLyBDcmVhdGUgdGhlIHN1YiBmb2xkZXIgdG8gc3RvcmUgdGhlIHB1Ymxpc2hlZCBIVE1MIGNvbnRlbnQgZmlsZXMuCi0JCQljb250ZW50Rm9sZGVyTmFtZSA9IGNvbmZpZy5nZXROYW1lKCk7Ci0KLQkJCVB1Ymxpc2hPcHRpb25zIHB1Ymxpc2hpbmdPcHRpb25zID0gZXhwb3J0T3B0aW9ucwotCQkJCQkuZ2V0UHVibGlzaGluZ09wdGlvbnMoKTsKLQkJCWlmIChwdWJsaXNoQ29udGVudFNpdGUgJiYgcHVibGlzaGluZ09wdGlvbnMgIT0gbnVsbCkgewotCQkJCUZpbGUgY29udGVudERpciA9IG5ldyBGaWxlKGV4cG9ydE9wdGlvbnMuZ2V0RXhwb3J0RGlyKCksCi0JCQkJCQljb250ZW50Rm9sZGVyTmFtZSk7Ci0JCQkJaWYgKCFjb250ZW50RGlyLmV4aXN0cygpKSB7Ci0JCQkJCWNvbnRlbnREaXIubWtkaXJzKCk7Ci0JCQkJfQotCQkJCWlmIChkZWJ1ZykgewotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIiQkJCB2aWVCdWlsZGVyIG1ldGhvZENvbmZpZyA9ICIgLy8kTk9OLU5MUy0xJAotCQkJCQkJCSsgY29uZmlnKTsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCIkJCQgdmllQnVpbGRlciBwdWJsaXNoQ29uZmlnT3B0aW9ucyA9ICIgLy8kTk9OLU5MUy0xJAotCQkJCQkJCSsgcHVibGlzaGluZ09wdGlvbnMpOwotCQkJCX0KLQotCQkJCS8vIFB1Ymxpc2ggdGhlIGFzc29jaWF0ZWQgY29uZmlndXJhdGlvbi4KLQkJCQlpZiAoIXB1Ymxpc2hDb25maWd1cmF0aW9uKGNvbnRlbnREaXIuZ2V0QWJzb2x1dGVQYXRoKCksIGNvbmZpZywKLQkJCQkJCXB1Ymxpc2hpbmdPcHRpb25zKSkgewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJfQotCi0JCQlleHBvcnRPbmx5UGxhbm5lZEVsZW1lbnRzID0gZXhwb3J0T3B0aW9ucwotCQkJCQkuZ2V0RXhwb3J0T25seVBsYW5uZWRXQlNFbGVtZW50cygpOwotCi0JCQkvLyBHZW5lcmF0ZSB0aGUgTWljcm9zb2Z0IFByb2plY3QgWE1MIGZpbGUuCi0JCQkvLyBwb3B1bGF0ZSB0aGUgcHJvamVjdCdzIGF0dHJpYnV0ZXMKLQkJCXByb2plY3Quc2V0TmFtZShwcm9jZXNzLmdldE5hbWUoKSk7Ci0JCQlwcm9qZWN0LnNldFN0YXJ0RGF0ZShuZXcgRGF0ZSgpKTsKLQkJCXByb2plY3Quc2V0Q3JlYXRpb25EYXRlKG5ldyBEYXRlKCkpOwotCQkJcHJvamVjdC5zZXRMYXN0U2F2ZWQobmV3IERhdGUoKSk7Ci0JCQlwcm9qZWN0LnNldEZpbmlzaERhdGUobmV3IERhdGUoKSk7Ci0JCQkKLQkJCXNldFByb2plY3RFeHRlbmRlZEF0dHJpYnV0ZXMocHJvamVjdCk7Ci0KLQkJCWdlbmVyYXRlT3BlcmF0b25SdW4ocHJvY2VzcywgcHJvamVjdCwgY29uZmlnKTsKLQkJCQotCQkJcmV0dXJuIHRydWU7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBlOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGdlbmVyYXRlT3BlcmF0b25SdW4oUHJvY2VzcyBwcm9jZXNzLCBQcm9qZWN0IHByb2plY3QsCi0JCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZykgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sCi0JCQlJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCWZpbmFsIFByb2Nlc3MgZnByb2Nlc3MgPSBwcm9jZXNzOwotCQlmaW5hbCBQcm9qZWN0IGZwcm9qZWN0ID0gcHJvamVjdDsKLQkJZmluYWwgTWV0aG9kQ29uZmlndXJhdGlvbiBmY29uZmlnID0gY29uZmlnOwotCQkKLQkJSVJ1bm5hYmxlV2l0aFByb2dyZXNzIG9wID0gbmV3IElSdW5uYWJsZVdpdGhQcm9ncmVzcygpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCi0JCQkJCXRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsKLQkJCQl0cnkgewotCQkJCQltb25pdG9yLmJlZ2luVGFzayhFeHBvcnRNU1BSZXNvdXJjZXMuZXhwb3J0TVNQV2l6YXJkX3RpdGxlLAotCQkJCQkJCUlQcm9ncmVzc01vbml0b3IuVU5LTk9XTik7Ci0KLQkJCQkJZ2VuZXJhdGUoZnByb2Nlc3MsIGZwcm9qZWN0LCBmY29uZmlnKTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQl0aHJvdyBuZXcgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbihlKTsKLQkJCQl9IGZpbmFsbHkgewotCQkJCQltb25pdG9yLmRvbmUoKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JCVByb2dyZXNzTW9uaXRvckRpYWxvZyBwbURpYWxvZyA9IG5ldyBQcm9ncmVzc01vbml0b3JEaWFsb2coRGlzcGxheS5nZXRDdXJyZW50KCkuZ2V0QWN0aXZlU2hlbGwoKSk7Ci0JCXBtRGlhbG9nLnJ1bih0cnVlLCBmYWxzZSwgb3ApOwotCX0KLQotCXByaXZhdGUgdm9pZCBnZW5lcmF0ZShQcm9jZXNzIHByb2Nlc3MsIFByb2plY3QgcHJvamVjdCwKLQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJZ2VuZXJhdGVQcm9qZWN0UmVzb3VyY2VzKHByb2Nlc3MsIGNvbmZpZywgcHJvamVjdCk7Ci0JCWdlbmVyYXRlUHJvamVjdFRhc2tzKHByb2Nlc3MsIGNvbmZpZywgcHJvamVjdCk7Ci0JCWdlbmVyYXRlTGlua3MocHJvY2VzcywgcHJvamVjdCk7Ci0JCWdlbmVyYXRlV1BEcyhjb25maWcpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGV4cG9ydCBvcHRpb25zLgotCSAqIAotCSAqIEBwYXJhbSBleHBvcnRPcHRpb25zCi0JICogICAgICAgICAgICBhIGNvbGxlY3Rpb24gb2YgdXNlciBzcGVjaWZpZWQgZXhwb3J0IG9wdGlvbnMKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRFeHBvcnRPcHRpb25zKEV4cG9ydE9wdGlvbnMgZXhwb3J0T3B0aW9ucykgewotCQlCb29sZWFuIGV4cG9ydE9ubHlQbGFubmVkRWxlbWVudHMgPSAoQm9vbGVhbikgZXhwb3J0T3B0aW9ucwotCQkJCS5nZXQoRXhwb3J0T3B0aW9ucy5FWFBPUlRfT05MWV9QTEFOTkVEX0VMRU1FTlRTKTsKLQkJdGhpcy5leHBvcnRPbmx5UGxhbm5lZEVsZW1lbnRzID0gZXhwb3J0T25seVBsYW5uZWRFbGVtZW50cwotCQkJCS5ib29sZWFuVmFsdWUoKTsKLQl9Ci0KLQkvKioKLQkgKiBHZW5lcmF0ZXMgdGhlIHByb2plY3QgcmVzb3VyY2VzIGZvciBhbGwgdGhlIHRhc2sgZGVzY3JpcHRvcnMgaW4gdGhlCi0JICogcHJvY2Vzcy4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvY2VzcwotCSAqICAgICAgICAgICAgYSBwcm9jZXNzCi0JICogQHBhcmFtIGNvbmZpZwotCSAqICAgICAgICAgICAgYSBtZXRob2QgY29uZmlndXJhdGlvbiB1c2VkIHRvIGZpbHRlciB0aGUgd29yayBicmVha2Rvd24KLQkgKiAgICAgICAgICAgIGVsZW1lbnRzIGluIHRoZSBwcm9jZXNzCi0JICogQHBhcmFtIHByb2plY3QKLQkgKiAgICAgICAgICAgIGFuIG9iamVjdCB0byBzdG9yZSB0aGUgZ2VuZXJhdGVkIE1pY3Jvc29mdCBQcm9qZWN0IFdCUwotCSAqIEB0aHJvd3MgRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlIGdlbmVyYXRpbmcgdGhlIE1pY3Jvc29mdCBQcm9qZWN0IFdCUwotCSAqLwotCXByb3RlY3RlZCB2b2lkIGdlbmVyYXRlUHJvamVjdFJlc291cmNlcyhQcm9jZXNzIHByb2Nlc3MsCi0JCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZywgUHJvamVjdCBwcm9qZWN0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlhZGFwdGVyRmFjdG9yeSA9IFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCS5jcmVhdGVUQlNDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KCk7Ci0JCQlpZiAoYWRhcHRlckZhY3RvcnkgaW5zdGFuY2VvZiBDb25maWd1cmFibGVDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KSB7Ci0JCQkJKChDb25maWd1cmFibGVDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCS5zZXRGaWx0ZXIobmV3IFByb2Nlc3NDb25maWd1cmF0b3IoY29uZmlnKSk7Ci0JCQl9Ci0JCQlJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciBjb250ZW50UHJvdmlkZXIgPSBuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoCi0JCQkJCWFkYXB0ZXJGYWN0b3J5KTsKLQotCQkJTGlzdCBlbGVtZW50cyA9IHByb2Nlc3MuZ2V0QnJlYWtkb3duRWxlbWVudHMoKTsKLQkJCWlmIChlbGVtZW50cy5zaXplKCkgPiAwKSB7Ci0JCQkJZ2VuZXJhdGVQcm9qZWN0UmVzb3VyY2UoY29udGVudFByb3ZpZGVyLAotCQkJCQkJKEJyZWFrZG93bkVsZW1lbnQpIHByb2Nlc3MsIHByb2plY3QpOwotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCXRocm93IGU7Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAoYWRhcHRlckZhY3RvcnkgIT0gbnVsbCkgewotCQkJCWFkYXB0ZXJGYWN0b3J5LmRpc3Bvc2UoKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEdlbmVyYXRlcyB0aGUgcHJvamVjdCByZXNvdXJjZXMgZm9yIGFsbCB0aGUgcm9sZSBkZXNjcmlwdG9ycyBpbiB0aGUKLQkgKiBwcm9jZXNzLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGdlbmVyYXRlUHJvamVjdFJlc291cmNlKAotCQkJSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIgY29udGVudFByb3ZpZGVyLAotCQkJQnJlYWtkb3duRWxlbWVudCBicmVha2Rvd25FbGVtZW50LCBQcm9qZWN0IHByb2plY3QpCi0JCQl0aHJvd3MgRXhjZXB0aW9uIHsKLQkJaWYgKGJyZWFrZG93bkVsZW1lbnQgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3IKLQkJCQl8fCBicmVha2Rvd25FbGVtZW50LmdldFN1cHByZXNzZWQoKS5ib29sZWFuVmFsdWUoKQotCQkJCXx8IChleHBvcnRPbmx5UGxhbm5lZEVsZW1lbnRzICYmICFicmVha2Rvd25FbGVtZW50Ci0JCQkJCQkuZ2V0SXNQbGFubmVkKCkuYm9vbGVhblZhbHVlKCkpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlpZiAoYnJlYWtkb3duRWxlbWVudCBpbnN0YW5jZW9mIFJvbGVEZXNjcmlwdG9yKSB7Ci0JCQlhZGRSZXNvdXJjZShicmVha2Rvd25FbGVtZW50LCBwcm9qZWN0KTsKLQkJCXJldHVybjsKLQkJfQotCi0JCWlmIChjb250ZW50UHJvdmlkZXIgIT0gbnVsbCkgewotCQkJT2JqZWN0W10gZWxlbWVudHMgPSBjb250ZW50UHJvdmlkZXIuZ2V0RWxlbWVudHMoYnJlYWtkb3duRWxlbWVudCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJT2JqZWN0IGVsZW1lbnQgPSBlbGVtZW50c1tpXTsKLQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFJvbGVEZXNjcmlwdG9yV3JhcHBlckl0ZW1Qcm92aWRlcikgewotCQkJCQlSb2xlRGVzY3JpcHRvcldyYXBwZXJJdGVtUHJvdmlkZXIgcHJvdmlkZXIgPSAoUm9sZURlc2NyaXB0b3JXcmFwcGVySXRlbVByb3ZpZGVyKSBlbGVtZW50OwotCQkJCQlPYmplY3QgdmFsdWUgPSBwcm92aWRlci5nZXRWYWx1ZSgpOwotCQkJCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBSb2xlRGVzY3JpcHRvcikgewotCQkJCQkJYWRkUmVzb3VyY2UoKEJyZWFrZG93bkVsZW1lbnQpIHZhbHVlLCBwcm9qZWN0KTsKLQkJCQkJfQotCQkJCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFJvbGVEZXNjcmlwdG9yKSB7Ci0JCQkJCWFkZFJlc291cmNlKChCcmVha2Rvd25FbGVtZW50KSBlbGVtZW50LCBwcm9qZWN0KTsKLQkJCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgewotCQkJCQlCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlciBwcm92aWRlciA9IChCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgZWxlbWVudDsKLQkJCQkJT2JqZWN0IHZhbHVlID0gcHJvdmlkZXIuZ2V0VmFsdWUoKTsKLQkJCQkJaWYgKHZhbHVlIGluc3RhbmNlb2YgV29ya0JyZWFrZG93bkVsZW1lbnQpIHsKLQkJCQkJCWdlbmVyYXRlUHJvamVjdFJlc291cmNlKGNvbnRlbnRQcm92aWRlciwKLQkJCQkJCQkJKFdvcmtCcmVha2Rvd25FbGVtZW50KSB2YWx1ZSwgcHJvamVjdCk7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBXb3JrQnJlYWtkb3duRWxlbWVudCkgewotCQkJCQlnZW5lcmF0ZVByb2plY3RSZXNvdXJjZShjb250ZW50UHJvdmlkZXIsCi0JCQkJCQkJKFdvcmtCcmVha2Rvd25FbGVtZW50KSBlbGVtZW50LCBwcm9qZWN0KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCX0KLQotCS8vIGZvciBlYWNoIFJvbGVEZXNjcmlwdG9yLCBjcmVhdGUgYSBNUyBQcm9qZWN0IHJlc291cmNlCi0JLy8gZm9yIHRoZSBSb2xlRGVzY3JpcHRvciBhbmQgaXRzIHVuZGVybHlpbmcgcm9sZSwgcmVtZW1iZXIgdGhlIGFzc2lnbmVkCi0JLy8gcmVzX3VpZAotCXByb3RlY3RlZCB2b2lkIGFkZFJlc291cmNlKEJyZWFrZG93bkVsZW1lbnQgYnJlYWtkb3duRWxlbWVudCwgUHJvamVjdCBwcm9qKQotCQkJdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWlmICghKGJyZWFrZG93bkVsZW1lbnQgaW5zdGFuY2VvZiBSb2xlRGVzY3JpcHRvcikpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCS8vIGNoZWNrIHRoZSBleGlzdGVuY2Ugb2YgdGhlIHVuZGVybHlpbmcgcm9sZSBvZiB0aGlzIHJvbGVEZXNjcmlwdG9yCi0JCS8vIGFuZCBza2lwIHRoZSBjcmVhdGlvbiBpZiBhIHJlc291cmNlIGZvciB0aGUgcm9sZSBhbHJlYWR5IGV4aXN0cwotCQlSb2xlRGVzY3JpcHRvciByb2xlRGVzY3JpcHRvciA9IChSb2xlRGVzY3JpcHRvcikgYnJlYWtkb3duRWxlbWVudDsKLQkJaWYgKGRlYnVnKQotCQkJU3lzdGVtLm91dC5wcmludGxuKCIkJCQgaGFuZGxlIFJvbGVEZXNjcmlwdG9yID0gIiArIHJvbGVEZXNjcmlwdG9yKTsgLy8kTk9OLU5MUy0xJAotCQlSb2xlIHJlZl9lZFJvbGUgPSByb2xlRGVzY3JpcHRvci5nZXRSb2xlKCk7Ci0JCWlmIChkZWJ1ZykKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiJCQkIGhhbmRsZSBSZWYtZWQgUm9sZSA9ICIgKyByZWZfZWRSb2xlKTsgLy8kTk9OLU5MUy0xJAotCi0JCS8vIGNoZWNrIHRoZSBuZWVkIHRvIGFkZCBhIG5ldyByZXNvdXJjZSBiYXNlZCBvbiBSb2xlRGVzY3JpcHRvcidzIGRpc3BseQotCQkvLyBuYW1lCi0JCWJvb2xlYW4gbmV3UkRSZXNvdXJjZSA9IHRydWU7Ci0JCVN0cmluZyByZFJlc291cmNlTmFtZSA9IGdldERpc3BsYXlOYW1lKHJvbGVEZXNjcmlwdG9yKTsKLQkJaWYgKHJvbGVzVG9VaWRNYXAuZ2V0KHJkUmVzb3VyY2VOYW1lKSAhPSBudWxsKSB7Ci0JCQluZXdSRFJlc291cmNlID0gZmFsc2U7Ci0JCX0KLQotCQkvLyBjaGVjayB0aGUgbmVlZCB0byBhZGQgYSBuZXcgcmVzb3VyY2UgYmFzZWQgb24gYXNzb2NpYXRlZCByb2xlJ3MKLQkJLy8gZGlzcGx5IG5hbWUKLQkJYm9vbGVhbiBuZXdSb2xlUmVvdXJjZSA9IGZhbHNlOwotCQlTdHJpbmcgcm9sZVJlc291cmNlTmFtZSA9IG51bGw7Ci0JCWlmIChyZWZfZWRSb2xlICE9IG51bGwKLQkJCQkmJiByb2xlc1RvVWlkTWFwCi0JCQkJCQkuZ2V0KChyb2xlUmVzb3VyY2VOYW1lID0gZ2V0RGlzcGxheU5hbWUocmVmX2VkUm9sZSkpKSA9PSBudWxsCi0JCQkJJiYgIXJvbGVSZXNvdXJjZU5hbWUuZXF1YWxzSWdub3JlQ2FzZShyZFJlc291cmNlTmFtZSkpIHsKLQkJCW5ld1JvbGVSZW91cmNlID0gdHJ1ZTsKLQkJfQotCi0JCS8vIGNyZWF0ZSBhIHJlc291cmNlIGZvciB0aGUgUm9sZURlc2NyaXB0b3IKLQkJaWYgKG5ld1JEUmVzb3VyY2UpIHsKLQkJCVJlc291cmNlIGFSZXMgPSBwcm9qZWN0RmFjdG9yeS5jcmVhdGVSZXNvdXJjZSgpOwotCi0JCQlhUmVzLnNldFVJRChCaWdJbnRlZ2VyLnZhbHVlT2YocmVzX3VpZCkpOwotCQkJYVJlcy5zZXRJRChCaWdJbnRlZ2VyLnZhbHVlT2YocmVzX3VpZCkpOwotCQkJYVJlcy5zZXROYW1lKHJkUmVzb3VyY2VOYW1lKTsKLQkJCXByb2ouZ2V0UmVzb3VyY2VzKCkuZ2V0UmVzb3VyY2UoKS5hZGQoYVJlcyk7Ci0KLQkJCXJvbGVzVG9VaWRNYXAucHV0KHJkUmVzb3VyY2VOYW1lLCBCaWdJbnRlZ2VyLnZhbHVlT2YocmVzX3VpZCkpOwotCQkJcmVzX3VpZCsrOwotCQl9Ci0KLQkJLy8gY3JlYXRlIGEgcmVzb3VyY2UgZm9yIHRoZSB1bmRlcmx5aW5nIGFzc29jaWF0ZWQgcm9sZSB0b28KLQkJaWYgKG5ld1JvbGVSZW91cmNlKSB7Ci0JCQlSZXNvdXJjZSBhUmVzID0gcHJvamVjdEZhY3RvcnkuY3JlYXRlUmVzb3VyY2UoKTsKLQotCQkJYVJlcy5zZXRVSUQoQmlnSW50ZWdlci52YWx1ZU9mKHJlc191aWQpKTsKLQkJCWFSZXMuc2V0SUQoQmlnSW50ZWdlci52YWx1ZU9mKHJlc191aWQpKTsKLQkJCWFSZXMuc2V0TmFtZShyb2xlUmVzb3VyY2VOYW1lKTsKLQkJCXByb2ouZ2V0UmVzb3VyY2VzKCkuZ2V0UmVzb3VyY2UoKS5hZGQoYVJlcyk7Ci0KLQkJCXJvbGVzVG9VaWRNYXAucHV0KHJvbGVSZXNvdXJjZU5hbWUsIEJpZ0ludGVnZXIudmFsdWVPZihyZXNfdWlkKSk7Ci0JCQlyZXNfdWlkKys7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBHZW5lcmF0ZXMgdGhlIE1TIFByb2plY3QgV0JTIGZvciBhIGNhcGFiaWxpdHkgcGF0dGVybiBvciBkZWxpdmVyeQotCSAqIHByb2Nlc3MuCi0JICogCi0JICogQHBhcmFtIHByb2Nlc3MKLQkgKiAgICAgICAgICAgIGEgcHJvY2VzcwotCSAqIEBwYXJhbSBjb25maWcKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24gdXNlZCB0byBmaWx0ZXIgdGhlIHdvcmsgYnJlYWtkb3duCi0JICogICAgICAgICAgICBlbGVtZW50cyBpbiB0aGUgcHJvY2VzcwotCSAqIEBwYXJhbSBwcm9qZWN0Ci0JICogICAgICAgICAgICBhbiBvYmplY3QgdG8gc3RvcmUgdGhlIGdlbmVyYXRlZCBNaWNyb3NvZnQgUHJvamVjdCBXQlMKLQkgKiBAdGhyb3dzIEV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycyB3aGlsZSBnZW5lcmF0aW5nIHRoZSBNaWNyb3NvZnQgUHJvamVjdCBXQlMKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBnZW5lcmF0ZVByb2plY3RUYXNrcyhQcm9jZXNzIHByb2Nlc3MsCi0JCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZywgUHJvamVjdCBwcm9qZWN0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJLy8gU2F2ZSB0aGUgcmVmZXJlbmNlIHRvIHRoZSBleHBvcnRlZCBwcm9jZXNzLgotCQl0aGlzLnByb2Nlc3MgPSBwcm9jZXNzOwotCi0JCXdic0FkYXB0ZXJGYWN0b3J5ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCS8vIEFkZCB0aGUgc3VwcHJlc3Npb24gb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGUgcHJvY2VzcyB0byBiZQotCQkJLy8gZXhwb3J0ZWQKLQkJCS8vIHRvIHRoZSBzdXBwcmVzc2lvbiBtYXAuCi0JCQlzdXBwcmVzc2lvbiA9IG5ldyBTdXBwcmVzc2lvbihwcm9jZXNzKTsKLQkJCXN1cHByZXNzaW9uTWFwLnB1dChwcm9jZXNzLCBzdXBwcmVzc2lvbik7Ci0KLQkJCXdic0FkYXB0ZXJGYWN0b3J5ID0gKENvbmZpZ3VyYWJsZUNvbXBvc2VkQWRhcHRlckZhY3RvcnkpIFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCS5jcmVhdGVXQlNDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KCk7Ci0JCQlicmVha2Rvd25FbGVtZW50RmlsdGVyID0gbmV3IFByb2Nlc3NDb25maWd1cmF0b3IoY29uZmlnKTsKLQkJCXdic0FkYXB0ZXJGYWN0b3J5LnNldEZpbHRlcihicmVha2Rvd25FbGVtZW50RmlsdGVyKTsKLQotCQkJd2JzQ29udGVudFByb3ZpZGVyID0gbmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKAotCQkJCQl3YnNBZGFwdGVyRmFjdG9yeSk7Ci0KLQkJCS8vIHRlc3QKLQkJCS8vIGVudW1lcmF0ZVByb2Nlc3NQcmVkZWNlc3Nvckxpc3RzKCk7Ci0KLQkJCWN1cnJlbnRFbGVtZW50ID0gcHJvY2VzczsKLQkJCWlmIChwcm9jZXNzIGluc3RhbmNlb2YgQ2FwYWJpbGl0eVBhdHRlcm4pIHsKLQkJCQlnZW5lcmF0ZVByb2plY3RUYXNrKHdic0NvbnRlbnRQcm92aWRlciwKLQkJCQkJCShCcmVha2Rvd25FbGVtZW50KSBwcm9jZXNzLCAxLCBwcm9qZWN0KTsKLQkJCX0gZWxzZSB7Ci0JCQkJTGlzdCBicmVha2Rvd25FbGVtZW50cyA9IHByb2Nlc3MuZ2V0QnJlYWtkb3duRWxlbWVudHMoKTsKLQkJCQlpZiAoYnJlYWtkb3duRWxlbWVudHMuc2l6ZSgpID4gMCkgewotCQkJCQlnZW5lcmF0ZVByb2plY3RUYXNrKHdic0NvbnRlbnRQcm92aWRlciwKLQkJCQkJCQkoQnJlYWtkb3duRWxlbWVudCkgcHJvY2VzcywgMSwgcHJvamVjdCk7Ci0JCQkJfQotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCXRocm93IGU7Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAod2JzQWRhcHRlckZhY3RvcnkgIT0gbnVsbCkgewotCQkJCXdic0FkYXB0ZXJGYWN0b3J5LmRpc3Bvc2UoKTsKLQkJCX0KLQkJCWlmIChzdXBwcmVzc2lvbk1hcCAhPSBudWxsKSB7Ci0JCQkJc3VwcHJlc3Npb25NYXAuY2xlYXIoKTsKLQkJCQlzdXBwcmVzc2lvbk1hcCA9IG51bGw7Ci0JCQl9Ci0JCQlpZiAod2JzQ29udGVudFByb3ZpZGVyICE9IG51bGwpIHsKLQkJCQl3YnNDb250ZW50UHJvdmlkZXIuZGlzcG9zZSgpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGVudW1lcmF0ZVByb2Nlc3NQcmVkZWNlc3Nvckxpc3RzKCkgewotCQkvLyBXQlMgdHJlZQotCQlJdGVyYXRvciB3YnNUcmVlSXRlcmF0b3IgPSBuZXcgQWRhcHRlckZhY3RvcnlUcmVlSXRlcmF0b3IoCi0JCQkJd2JzQWRhcHRlckZhY3RvcnksIHByb2Nlc3MpOwotCQlPYmplY3Qgb2JqOwotCQl3aGlsZSAod2JzVHJlZUl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJb2JqID0gd2JzVHJlZUl0ZXJhdG9yLm5leHQoKTsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigidHJlZUl0ZXJhdG9yOiAiICsgb2JqKTsgLy8kTk9OLU5MUy0xJAotCQkJSUJTSXRlbVByb3ZpZGVyIGFkYXB0ZXIgPSAoSUJTSXRlbVByb3ZpZGVyKSB3YnNBZGFwdGVyRmFjdG9yeQotCQkJCQkuYWRhcHQob2JqLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkJUHJlZGVjZXNzb3JMaXN0IHByZWRMaXN0ID0gYWRhcHRlci5nZXRQcmVkZWNlc3NvcnMoKTsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHByZWRMaXN0Lml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCUlCU0l0ZW1Qcm92aWRlciBlID0gKElCU0l0ZW1Qcm92aWRlcikgaXRlci5uZXh0KCk7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCIgICAgcHJlZExpc3Q6ICIgKyBlKTsgLy8kTk9OLU5MUy0xJAotCQkJCWlmIChlIGluc3RhbmNlb2YgSXRlbVByb3ZpZGVyQWRhcHRlcikgewotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIiAgICB1bndyYXBwZWRQcmVkTGlzdDogIiAvLyROT04tTkxTLTEkCi0JCQkJCQkJKyAoKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIGUpLmdldFRhcmdldCgpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBHZW5lcmF0ZXMgdGhlIE1pY3Jvc2Z0IFByb2plY3QgdGFzayBmb3IgYSBicmVha2Rvd24gZWxlbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gY29udGVudFByb3ZpZGVyCi0JICogICAgICAgICAgICBhIGNvbnRlbnQgcHJvdmlkZXIKLQkgKiBAcGFyYW0gYnJlYWtkb3duRWxlbWVudAotCSAqICAgICAgICAgICAgYSBicmVha2Rvd24gZWxlbWVudAotCSAqIEBwYXJhbSBzdHJCdWYKLQkgKiAgICAgICAgICAgIGEgPGNvZGU+U3RyaW5nQnVmZmVyPC9jb2RlPiB0byBzdG9yZSB0aGUgZ2VuZXJhdGVkIFhNTAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGdlbmVyYXRlUHJvamVjdFRhc2soCi0JCQlJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciBjb250ZW50UHJvdmlkZXIsCi0JCQlPYmplY3QgZWxlbWVudE9yV3JhcHBlciwgaW50IHRhc2tPTGV2ZWwsIFByb2plY3QgcHJvaikKLQkJCXRocm93cyBFeGNlcHRpb24gewotCi0JCVdvcmtCcmVha2Rvd25FbGVtZW50IGJyZWFrZG93bkVsZW1lbnQgPSAoV29ya0JyZWFrZG93bkVsZW1lbnQpIFRuZ1V0aWwKLQkJCQkudW53cmFwKGVsZW1lbnRPcldyYXBwZXIpOwotCi0JCS8vIG5vdCByZWFsbHkgbmVjY2Vzc2FyeSBoZXJlCi0JCWlmIChicmVha2Rvd25FbGVtZW50IGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yCi0JCQkJfHwgYnJlYWtkb3duRWxlbWVudCBpbnN0YW5jZW9mIFJvbGVEZXNjcmlwdG9yCi0JCQkJfHwgYnJlYWtkb3duRWxlbWVudC5nZXRTdXBwcmVzc2VkKCkuYm9vbGVhblZhbHVlKCkKLQkJCQl8fCAoZXhwb3J0T25seVBsYW5uZWRFbGVtZW50cyAmJiAhYnJlYWtkb3duRWxlbWVudAotCQkJCQkJLmdldElzUGxhbm5lZCgpLmJvb2xlYW5WYWx1ZSgpKSkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJYm9vbGVhbiBpc1N1YlRhc2tzUGxhbm5lZCA9IGZhbHNlOwotCQlpZiAoZXhwb3J0T25seVBsYW5uZWRFbGVtZW50cyAmJiBicmVha2Rvd25FbGVtZW50IGluc3RhbmNlb2YgQWN0aXZpdHkKLQkJCQkmJiBjb250ZW50UHJvdmlkZXIgIT0gbnVsbCkgewotCQkJT2JqZWN0W10gZWxlbWVudHMgPSBjb250ZW50UHJvdmlkZXIuZ2V0RWxlbWVudHMoZWxlbWVudE9yV3JhcHBlcik7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJT2JqZWN0IGVsZW1lbnQgPSBlbGVtZW50c1tpXTsKLQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJCWlmICghZXhwb3J0T25seVBsYW5uZWRFbGVtZW50cwotCQkJCQkJCXx8ICgoQWN0aXZpdHkpIGVsZW1lbnQpLmdldElzUGxhbm5lZCgpCi0JCQkJCQkJCQkuYm9vbGVhblZhbHVlKCkpIHsKLQkJCQkJCWlzU3ViVGFza3NQbGFubmVkID0gdHJ1ZTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgQWN0aXZpdHlXcmFwcGVySXRlbVByb3ZpZGVyKSB7Ci0JCQkJCU9iamVjdCB3cmFwcGVkRWxlbWVudCA9IFRuZ1V0aWwudW53cmFwKGVsZW1lbnQpOwotCQkJCQlpZiAod3JhcHBlZEVsZW1lbnQgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCQkJaWYgKCFleHBvcnRPbmx5UGxhbm5lZEVsZW1lbnRzCi0JCQkJCQkJCXx8ICgoQWN0aXZpdHkpIHdyYXBwZWRFbGVtZW50KS5nZXRJc1BsYW5uZWQoKQotCQkJCQkJCQkJCS5ib29sZWFuVmFsdWUoKSkgewotCQkJCQkJCWlzU3ViVGFza3NQbGFubmVkID0gdHJ1ZTsKLQkJCQkJCQlicmVhazsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFRhc2tEZXNjcmlwdG9yKSB7Ci0JCQkJCVRhc2tEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSAoVGFza0Rlc2NyaXB0b3IpIGVsZW1lbnQ7Ci0JCQkJCWlmICghZXhwb3J0T25seVBsYW5uZWRFbGVtZW50cwotCQkJCQkJCXx8IGRlc2NyaXB0b3IuZ2V0SXNQbGFubmVkKCkuYm9vbGVhblZhbHVlKCkpIHsKLQkJCQkJCWlzU3ViVGFza3NQbGFubmVkID0gdHJ1ZTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgVGFza0Rlc2NyaXB0b3JXcmFwcGVySXRlbVByb3ZpZGVyKSB7Ci0JCQkJCU9iamVjdCB3cmFwcGVkRWxlbWVudCA9IFRuZ1V0aWwudW53cmFwKGVsZW1lbnQpOwotCQkJCQlpZiAod3JhcHBlZEVsZW1lbnQgaW5zdGFuY2VvZiBUYXNrRGVzY3JpcHRvcikgewotCQkJCQkJVGFza0Rlc2NyaXB0b3IgZGVzY3JpcHRvciA9IChUYXNrRGVzY3JpcHRvcikgd3JhcHBlZEVsZW1lbnQ7Ci0JCQkJCQlpZiAoIWV4cG9ydE9ubHlQbGFubmVkRWxlbWVudHMKLQkJCQkJCQkJfHwgZGVzY3JpcHRvci5nZXRJc1BsYW5uZWQoKS5ib29sZWFuVmFsdWUoKSkgewotCQkJCQkJCWlzU3ViVGFza3NQbGFubmVkID0gdHJ1ZTsKLQkJCQkJCQlicmVhazsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCS8vIGNyZWF0ZSBhIHRhc2sgZm9yIHRoZSBXb3JrQnJlYWtkb3duRWxlbWVudAotCQkvLyBkZWNpZGVkIGp1c3QgdG8gY2hlY2sgdGhlIGlzUGxhbm5lZCBmbGFnIG9uIHRoZSBXQlMKLQkJYm9vbGVhbiBpc1BsYW5uZWRUYXNrID0gYnJlYWtkb3duRWxlbWVudC5nZXRJc1BsYW5uZWQoKS5ib29sZWFuVmFsdWUoKTsKLQkJVGFzayBuZXdUYXNrID0gbnVsbDsKLQkJaWYgKCFleHBvcnRPbmx5UGxhbm5lZEVsZW1lbnRzIHx8IGV4cG9ydE9ubHlQbGFubmVkRWxlbWVudHMKLQkJCQkmJiBpc1BsYW5uZWRUYXNrKSB7Ci0JCQlib29sZWFuIHN1cHByZXNzZWQgPSBpc1N1cHByZXNzZWQoYnJlYWtkb3duRWxlbWVudCk7Ci0JCQlpZiAoIXN1cHByZXNzZWQpIHsKLQkJCQluZXdUYXNrID0gYWRkVGFzayhlbGVtZW50T3JXcmFwcGVyLCB0YXNrT0xldmVsLCBwcm9qKTsKLQkJCX0KLQkJfQotCi0JCS8vIGlmIGV4cG9ydCBwbGFubmVkIG9ubHkgd2JzLCB0aGVuIHdlIG5lZWQgdG8gZG8gdGhlIHJvbGUgcm9sbHVwCi0JCS8vIGNhbGN1bGF0aW9uCi0JCWlmIChleHBvcnRPbmx5UGxhbm5lZEVsZW1lbnRzICYmIG5ld1Rhc2sgIT0gbnVsbAotCQkJCSYmIGJyZWFrZG93bkVsZW1lbnQgaW5zdGFuY2VvZiBBY3Rpdml0eQotCQkJCSYmIGNvbnRlbnRQcm92aWRlciAhPSBudWxsICYmICFpc1N1YlRhc2tzUGxhbm5lZCkgewotCQkJQXJyYXlMaXN0IHJvbGx1cFJvbGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJYm9vbGVhbiByYiA9IGNhbGN1bGF0ZVJvbGx1cFJvbGVzKGNvbnRlbnRQcm92aWRlciwKLQkJCQkJYnJlYWtkb3duRWxlbWVudCwgcm9sbHVwUm9sZXMpOwotCQkJLy8gaWYgdGhlIHdob2xlIHN1YnRyZWUgb2YgdGhlIGJyZWFrZG93bkVsZW1udCBpcyBub3QgcGxhbm5lZAotCQkJLy8gdGhlbiByb2xsIHVwIGFsbCB0aGUgcm9sZXMKLQkJCWlmICghcmIpIHsKLQkJCQlIYXNoU2V0IHJvbGVzU2V0ID0gbmV3IEhhc2hTZXQocm9sbHVwUm9sZXMpOwotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHJvbGVzU2V0Lml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQlTdHJpbmcgcm9sZU5hbWUgPSAoU3RyaW5nKSBpdGVyLm5leHQoKTsKLQkJCQkJYWRkQXNzaWdubWVudChyb2xlTmFtZSwgbmV3VGFzay5nZXRVSUQoKS5pbnRWYWx1ZSgpLCBwcm9qKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQkvLyBleHBvcnQgdGhlIG5leHQgbGV2ZWwgd2JzCi0JCWlmIChjb250ZW50UHJvdmlkZXIgIT0gbnVsbCkgewotCQkJYm9vbGVhbiBzdXBwcmVzc2VkID0gaXNTdXBwcmVzc2VkKGJyZWFrZG93bkVsZW1lbnQpOwotCQkJaWYgKCFzdXBwcmVzc2VkKSB7Ci0JCQkJZWxlbWVudFBhdGhzLnB1c2goYnJlYWtkb3duRWxlbWVudC5nZXRHdWlkKCkpOwotCQkJCU9iamVjdFtdIGVsZW1lbnRzID0gY29udGVudFByb3ZpZGVyCi0JCQkJCQkuZ2V0RWxlbWVudHMoZWxlbWVudE9yV3JhcHBlcik7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykgewotCQkJCQlPYmplY3QgZWxlbWVudCA9IGVsZW1lbnRzW2ldOwotCi0JCQkJCS8vIGdldCB0aGUgY3VycmVudCBlbGVtZW50T3JXcmFwcGVyIGFuZCB0aGUgaGllcmFyY2FsIGd1aWQKLQkJCQkJLy8gcGF0aCB0byBpdAotCQkJCQljdXJyZW50RWxlbWVudCA9IGVsZW1lbnQ7Ci0JCQkJCVN0cmluZ1tdIHBhdGhzID0gbmV3IFN0cmluZ1tlbGVtZW50UGF0aHMuc2l6ZSgpXTsKLQkJCQkJZWxlbWVudFBhdGhzLnRvQXJyYXkocGF0aHMpOwotCQkJCQlTdHJpbmdCdWZmZXIgcGF0aFN0ciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBwYXRocy5sZW5ndGg7IGorKykgewotCQkJCQkJcGF0aFN0ci5hcHBlbmQocGF0aHNbal0gKyAiLiIpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQkJaWYgKGN1cnJlbnRFbGVtZW50IGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIHsKLQkJCQkJCU9iamVjdCB3cmFwcGVkID0gVG5nVXRpbC51bndyYXAoZWxlbWVudCk7Ci0JCQkJCQlwYXRoU3RyLmFwcGVuZCgoKEJyZWFrZG93bkVsZW1lbnQpIHdyYXBwZWQpLmdldEd1aWQoKSk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlwYXRoU3RyLmFwcGVuZCgoKEJyZWFrZG93bkVsZW1lbnQpIGN1cnJlbnRFbGVtZW50KQotCQkJCQkJCQkuZ2V0R3VpZCgpKTsKLQkJCQkJfQotCQkJCQljdXJyZW50RWxlbWVudFBhdGggPSBwYXRoU3RyLnRvU3RyaW5nKCk7Ci0JCQkJCS8vIGlmIChkZWJ1ZykgU3lzdGVtLm91dC5wcmludGxuKCIgcGF0aDogIiArCi0JCQkJCS8vIGN1cnJlbnRFbGVtZW50UGF0aCk7Ci0KLQkJCQkJZ2VuZXJhdGVQcm9qZWN0VGFzayhjb250ZW50UHJvdmlkZXIsIGVsZW1lbnQsCi0JCQkJCQkJdGFza09MZXZlbCArIDEsIHByb2opOwotCQkJCX0KLQkJCQlnZW5lcmF0ZUxpbmtzKHByb2Nlc3MsIHByb2opOwotCQkJCWVsZW1lbnRQYXRocy5wb3AoKTsKLQkJCX0KLQkJfQotCi0JfQotCi0JLyoqCi0JICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIG9iamVjdCBpcyBhIHN1cHByZXNzZWQgd29yayBicmVha2Rvd24gZWxlbWVudCBpbgotCSAqIGl0cyBvd25pbmcgcHJvY2Vzcy4KLQkgKiAKLQkgKiBAcGFyYW0gb2JqZWN0Ci0JICogICAgICAgICAgICBhbiBvYmplY3QKLQkgKiBAcmV0dXJuIDxvY2RlPnRydWU8L2NvZGU+IGlmIHRoZSBvYmplY3QgaXMgYSBzdXBwcmVzc2VkIHdvcmsgYnJlYWtkb3duCi0JICogICAgICAgICBlbGVtZW50IGluIGl0cyBvd25pbmcgcHJvY2Vzcy4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1N1cHByZXNzZWQoT2JqZWN0IG9iamVjdCkgewotCQlpZiAob2JqZWN0ICE9IG51bGwpIHsKLQkJCWlmIChvYmplY3QgaW5zdGFuY2VvZiBEZXNjcmlwdG9yKSB7Ci0JCQkJaWYgKGRlYnVnKQotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkRlc2NyaXB0b3IgPSAiIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkrICgoRGVzY3JpcHRvcikgb2JqZWN0KS5nZXROYW1lKCkpOwotCQkJfQotCQkJUHJvY2VzcyBvd25pbmdQcm9jZXNzID0gVG5nVXRpbC5nZXRPd25pbmdQcm9jZXNzKG9iamVjdCk7Ci0JCQlTdXBwcmVzc2lvbiBvd25pbmdQcm9jZXNzU3VwcHJlc3Npb24gPSAoU3VwcHJlc3Npb24pIHN1cHByZXNzaW9uTWFwCi0JCQkJCS5nZXQob3duaW5nUHJvY2Vzcyk7Ci0JCQlpZiAob3duaW5nUHJvY2Vzc1N1cHByZXNzaW9uID09IG51bGwpIHsKLQkJCQlvd25pbmdQcm9jZXNzU3VwcHJlc3Npb24gPSBuZXcgU3VwcHJlc3Npb24ob3duaW5nUHJvY2Vzcyk7Ci0JCQkJc3VwcHJlc3Npb25NYXAucHV0KG93bmluZ1Byb2Nlc3MsIG93bmluZ1Byb2Nlc3NTdXBwcmVzc2lvbik7Ci0JCQl9Ci0JCQlpZiAob3duaW5nUHJvY2Vzc1N1cHByZXNzaW9uLmlzU3VwcHJlc3NlZChvYmplY3QpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCQlpZiAob3duaW5nUHJvY2VzcyAhPSBwcm9jZXNzCi0JCQkJCSYmIG9iamVjdCBpbnN0YW5jZW9mIFdvcmtCcmVha2Rvd25FbGVtZW50KSB7Ci0JCQkJZWxlbWVudFBhdGhzLnB1c2goKChXb3JrQnJlYWtkb3duRWxlbWVudCkgb2JqZWN0KS5nZXRHdWlkKCkpOwotCQkJCVN0cmluZ1tdIHBhdGhzID0gbmV3IFN0cmluZ1tlbGVtZW50UGF0aHMuc2l6ZSgpXTsKLQkJCQllbGVtZW50UGF0aHMudG9BcnJheShwYXRocyk7Ci0JCQkJT2JqZWN0IHdyYXBwZXIgPSBzdXBwcmVzc2lvbi5nZXRPYmplY3RCeVBhdGgocGF0aHMsCi0JCQkJCQl3YnNBZGFwdGVyRmFjdG9yeSk7Ci0JCQkJZWxlbWVudFBhdGhzLnBvcCgpOwotCQkJCXJldHVybiBzdXBwcmVzc2lvbi5pc1N1cHByZXNzZWQod3JhcHBlcik7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEFkZHMgYSB0YXNrIHRvIGEgTWljcm9zb2Z0IFByb2plY3QuCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiAgICAgICAgICAgIGEgd29yayBicmVha2Rvd24gZWxlbWVudAotCSAqIEBwYXJhbSB0YXNrT0xldmVsCi0JICogICAgICAgICAgICB0aGUgb3V0bGluZSBsZXZlbAotCSAqIEBwYXJhbSBwcm9qZWN0Ci0JICogICAgICAgICAgICBhIE1pY3Jvc29mdCBQcm9qZWN0IG9iamVjdAotCSAqIEByZXR1cm4gdGhlIG5ld2x5IGFkZGVkIHRhc2sKLQkgKiBAdGhyb3dzIEV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycnMgd2hpbGUgcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCi0JICovCi0JcHJvdGVjdGVkIFRhc2sgYWRkVGFzayhPYmplY3QgZWxlbWVudE9yV3JhcHBlciwgaW50IHRhc2tPTGV2ZWwsCi0JCQlQcm9qZWN0IHByb2plY3QpIHRocm93cyBFeGNlcHRpb24gewotCQlUYXNrIHRhc2sgPSBhZGRUYXNrXyhlbGVtZW50T3JXcmFwcGVyLCB0YXNrT0xldmVsLCBwcm9qZWN0KTsKLQkJaWYgKHRhc2sgIT0gbnVsbCkgewotCQkJV29ya0JyZWFrZG93bkVsZW1lbnQgZWxlbWVudCA9IChXb3JrQnJlYWtkb3duRWxlbWVudCkgVG5nVXRpbAotCQkJCS51bndyYXAoZWxlbWVudE9yV3JhcHBlcik7Ci0JCQl0YXNrVG9XYmVNYXAucHV0KHRhc2ssIGVsZW1lbnQpOwotCQl9Ci0JCXJldHVybiB0YXNrOwotCX0KLQkKLQlwcml2YXRlIFRhc2sgYWRkVGFza18oT2JqZWN0IGVsZW1lbnRPcldyYXBwZXIsIGludCB0YXNrT0xldmVsLAotCQkJUHJvamVjdCBwcm9qZWN0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQlpZiAoZWxlbWVudE9yV3JhcHBlciA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCVdvcmtCcmVha2Rvd25FbGVtZW50IGVsZW1lbnQgPSAoV29ya0JyZWFrZG93bkVsZW1lbnQpIFRuZ1V0aWwKLQkJCQkudW53cmFwKGVsZW1lbnRPcldyYXBwZXIpOwotCQkKLQkJVGFzayB0YXNrID0gcHJvamVjdEZhY3RvcnkuY3JlYXRlVGFzaygpOwotCQl0YXNrLnNldE5hbWUoZ2V0RGlzcGxheU5hbWUoZWxlbWVudCkpOwotCQl0YXNrLnNldE91dGxpbmVMZXZlbChCaWdJbnRlZ2VyLnZhbHVlT2YodGFza09MZXZlbCkpOwotCQl0YXNrLnNldFVJRChCaWdJbnRlZ2VyLnZhbHVlT2YodGFza191aWQpKTsKLQkJdGFzay5zZXRJRChCaWdJbnRlZ2VyLnZhbHVlT2YodGFza191aWQpKTsKLQkJdGFzay5zZXRUeXBlKEJpZ0ludGVnZXIudmFsdWVPZigwKSk7Ci0KLQkJR3JlZ29yaWFuQ2FsZW5kYXIgZ2NEYXRlID0gbmV3IEdyZWdvcmlhbkNhbGVuZGFyKCk7Ci0JCS8vIGdjRGF0ZS5hZGQoR3JlZ29yaWFuQ2FsZW5kYXIuREFURSwgODApOwotCQlEYXRlIHN0YXJ0RGF0ZSA9IGdjRGF0ZS5nZXRUaW1lKCk7Ci0JCXRhc2suc2V0U3RhcnQoc3RhcnREYXRlKTsKLQkJLy8gdGFzay5zZXREdXJhdGlvbigiUFQyMEgwTTBTIik7Ci0KLQkJU3RyaW5nIG5vdGVzID0gZ2V0QnJpZWZEZXNjcmlwdGlvbihlbGVtZW50KTsKLQkJaWYgKG5vdGVzICE9IG51bGwgJiYgbm90ZXMudHJpbSgpLmxlbmd0aCgpID4gMCkgewotCQkJdGFzay5zZXROb3Rlcyhub3Rlcyk7Ci0JCX0KLQotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE1pbGVzdG9uZSkgewotCQkJdGFzay5zZXRNaWxlc3RvbmUodHJ1ZSk7Ci0JCQl0YXNrLnNldER1cmF0aW9uRm9ybWF0KEJpZ0ludGVnZXIudmFsdWVPZig3KSk7Ci0JCX0KLQotCQkvLyBBc3NpZ24gdGhlIHRhc2sgdG8gYWxsIHRoZSBhc3NvY2lhdGVkIHJvbGVzLgotCQlMaXN0IHJvbGVzTGlzdCA9IG51bGw7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgVGFza0Rlc2NyaXB0b3IpIHsKLQkJCXJvbGVzTGlzdCA9IGdldFJvbGVzRm9yVGFza0QoKFRhc2tEZXNjcmlwdG9yKSBlbGVtZW50KTsKLQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrKSB7Ci0JCQlyb2xlc0xpc3QgPSBnZXRSb2xlc0ZvclRhc2soKG9yZy5lY2xpcHNlLmVwZi51bWEuVGFzaykgZWxlbWVudCk7Ci0JCX0KLQkJaWYgKHJvbGVzTGlzdCAhPSBudWxsKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSByb2xlc0xpc3QuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJU3RyaW5nIHJvbGVOYW1lID0gKFN0cmluZykgaXRlci5uZXh0KCk7Ci0JCQkJYWRkQXNzaWdubWVudChyb2xlTmFtZSwgdGFza191aWQsIHByb2plY3QpOwotCQkJfQotCQl9Ci0KLQkJLy8gQWRkIHRoZSBnZW5lcmF0ZWQgVVJMIGxpbmsgdG8gdGhlIHRhc2suCi0JCWlmIChwdWJsaXNoQ29udGVudFNpdGUpIHsKLQkJCVN0cmluZyBsaW5rVVJMID0gZ2V0RWxlbWVudFVSTChlbGVtZW50KTsKLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgVGFza0Rlc2NyaXB0b3IpIHsKLQkJCQlUYXNrRGVzY3JpcHRvciB0YXNrRGVzY3JpcHRvciA9IChUYXNrRGVzY3JpcHRvcikgZWxlbWVudDsKLQkJCQlvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2sgcmVmX2VkVGFzayA9IHRhc2tEZXNjcmlwdG9yLmdldFRhc2soKTsKLQkJCQlyZWZlcmVuY2VkVGFza3MuYWRkKHJlZl9lZFRhc2spOwotCQkJfQotCQkJdGFzay5zZXRIeXBlcmxpbmtBZGRyZXNzKGxpbmtVUkwpOwotCQl9Ci0KLQkJLy8gYVRhc2suc2V0VHlwZShuZXcgQmlnSW50ZWdlcigiMSIpKTsKLQkJLy8gYVRhc2suc2V0U3RhcnQobmV3IERhdGUoKSk7Ci0JCS8vIGFUYXNrLnNldFN1bW1hcnkoZmFsc2UpOwotCQkvLyBhVGFzay5zZXRDb25zdHJhaW50VHlwZShuZXcgQmlnSW50ZWdlcigiMiIpKTsKLQotCQkvLyBBZGQgdGhlIHRhc2sgdG8gdGhlIE1pY3Jvc29mdCBQcm9qZWN0IG9iamVjdC4KLQkJcHJvamVjdC5nZXRUYXNrcygpLmdldFRhc2soKS5hZGQodGFzayk7Ci0KLQkJaWYgKGRlYnVnKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIiQkJCB0aGVDdXJyZW50IGVsZW1lbnQ6IHRhc2tVaWQ9IiArIHRhc2tfdWlkIC8vJE5PTi1OTFMtMSQKLQkJCQkJKyAiLCAiICsgY3VycmVudEVsZW1lbnQpOyAvLyROT04tTkxTLTEkCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIiAgICAgICAgICAgICAgICAgIHBhdGg6ICIgKyBjdXJyZW50RWxlbWVudFBhdGgpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQkvLyBTdG9yZSB0aGUgdGFzaydzIGxvY2FsIHByZWRlY2Vzc29ycy4KLQkJc3RvcmVUYXNrUHJlZGVjZXNzb3JzKGVsZW1lbnQpOwotCi0JCXRhc2tVaWRUb1dic1dhcHBlclBhdGhNYXAucHV0KEJpZ0ludGVnZXIudmFsdWVPZih0YXNrX3VpZCksCi0JCQkJY3VycmVudEVsZW1lbnRQYXRoKTsKLQkJd2JzR3VpZFRvVGFza1VpZE1hcAotCQkJCS5wdXQoZWxlbWVudC5nZXRHdWlkKCksIEJpZ0ludGVnZXIudmFsdWVPZih0YXNrX3VpZCkpOwotCi0JCS8vIGdldCBwcmVkZWNlc3NvcnMgb2YgYSB3b3JrIGJyZWFrZG93biBlbGVtZW50Ci0JCUlCU0l0ZW1Qcm92aWRlciBhZGFwdGVyID0gKElCU0l0ZW1Qcm92aWRlcikgd2JzQWRhcHRlckZhY3RvcnkuYWRhcHQoCi0JCQkJZWxlbWVudE9yV3JhcHBlciwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJUHJlZGVjZXNzb3JMaXN0IGN1cnJlbnRQcmVkTGlzdCA9IGFkYXB0ZXIuZ2V0UHJlZGVjZXNzb3JzKCk7Ci0JCUxpc3Q8TWV0aG9kRWxlbWVudD4gZ3VpZFByZWRMaXN0ID0gbmV3IEFycmF5TGlzdDxNZXRob2RFbGVtZW50PigpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjdXJyZW50UHJlZExpc3QuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZSA9IChPYmplY3QpIGl0ZXIubmV4dCgpOwotCQkJaWYgKGRlYnVnKQotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiICAgIHdyYXBwZXJQcmVkTGlzdE1lbWJlcjogIiArIGUpOyAvLyROT04tTkxTLTEkCi0JCQlPYmplY3QgdW53cmFwcGVkRSA9IFRuZ1V0aWwudW53cmFwKGUpOwotCQkJaWYgKHVud3JhcHBlZEUgaW5zdGFuY2VvZiBXb3JrQnJlYWtkb3duRWxlbWVudCkgewotCQkJCS8vZ3VpZFByZWRMaXN0LmFkZCgoKFdvcmtCcmVha2Rvd25FbGVtZW50KSB1bndyYXBwZWRFKS5nZXRHdWlkKCkpOwotCQkJCWd1aWRQcmVkTGlzdC5hZGQoKFdvcmtCcmVha2Rvd25FbGVtZW50KSB1bndyYXBwZWRFKTsKLQkJCQlpZiAoZGVidWcpCi0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiICAgIHVud3JhcHBlZFByZWRMaXN0TWVtYmVyOiAiIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkrIHVud3JhcHBlZEUpOwotCQkJfQotCQkJaWYgKGUgaW5zdGFuY2VvZiBJdGVtUHJvdmlkZXJBZGFwdGVyKSB7Ci0JCQkJdW53cmFwcGVkRSA9ICgoSXRlbVByb3ZpZGVyQWRhcHRlcikgZSkuZ2V0VGFyZ2V0KCk7Ci0JCQkJLy9ndWlkUHJlZExpc3QuYWRkKCgoQnJlYWtkb3duRWxlbWVudCkgdW53cmFwcGVkRSkuZ2V0R3VpZCgpKTsKLQkJCQlndWlkUHJlZExpc3QuYWRkKChCcmVha2Rvd25FbGVtZW50KSB1bndyYXBwZWRFKTsKLQkJCQlpZiAoZGVidWcpCi0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiICAgIHVud3JhcHBlZFByZWRMaXN0TWVtYmVyOiAiIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkrIHVud3JhcHBlZEUpOwotCQkJfQotCQl9Ci0JCXdic1dyYXBwZXJQYXRoVG9QcmVkTGlzdE1hcC5wdXQoY3VycmVudEVsZW1lbnRQYXRoLCBndWlkUHJlZExpc3QpOwotCQlpZiAoZGVidWcpCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIiAgICBfX3dyYXBwZXJQcmVkTGlzdDogIiArIGd1aWRQcmVkTGlzdCk7IC8vJE5PTi1OTFMtMSQKLQotCQl0YXNrX3VpZCsrOwotCi0JCXJldHVybiB0YXNrOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldEJyaWVmRGVzY3JpcHRpb24oV29ya0JyZWFrZG93bkVsZW1lbnQgZWxlbWVudCkgewotCQlpZiAoZWxlbWVudCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJU3RyaW5nIGJyaWVmRGVzYyA9IGVsZW1lbnQuZ2V0QnJpZWZEZXNjcmlwdGlvbigpOwotCQlpZiAoKGJyaWVmRGVzYyA9PSBudWxsIHx8IGJyaWVmRGVzYy50cmltKCkubGVuZ3RoKCkgPD0gMCkpIHsKLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgVGFza0Rlc2NyaXB0b3IpIHsKLQkJCQlUYXNrRGVzY3JpcHRvciB0YXNrRGVzY3JpcHRvciA9IChUYXNrRGVzY3JpcHRvcikgZWxlbWVudDsKLQkJCQlvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2sgcmVmX2VkVGFzayA9IHRhc2tEZXNjcmlwdG9yLmdldFRhc2soKTsKLQkJCQlpZiAocmVmX2VkVGFzayAhPSBudWxsKSB7Ci0JCQkJCU1ldGhvZEVsZW1lbnQgcmVhbGl6ZWRFbGVtZW50ID0gQ29uZmlndXJhdGlvbkhlbHBlci5nZXRDYWxjdWxhdGVkRWxlbWVudChyZWZfZWRUYXNrLCBwcm9jZXNzQ29uZmlnKTsKLQkJCQkJaWYgKGRlYnVnKSBTeXN0ZW0ub3V0LnByaW50bG4oIiQkJCByZWFsaXplZEVsZW1lbnQgPSAiICsgcmVhbGl6ZWRFbGVtZW50KTsgLy8kTk9OLU5MUy0xJAotCQkJCQlpZiAocmVhbGl6ZWRFbGVtZW50ICE9IG51bGwpIHsKLQkJCQkJCUVBdHRyaWJ1dGUgYXR0cmlidXRlID0gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWV0aG9kRWxlbWVudF9CcmllZkRlc2NyaXB0aW9uKCk7Ci0JCQkJCQlPYmplY3QgYnJpZWZEZXNjT2JqID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjQXR0cmlidXRlRmVhdHVyZVZhbHVlKHJlYWxpemVkRWxlbWVudCwgYXR0cmlidXRlLCBwcm9jZXNzQ29uZmlnKTsKLQkJCQkJCWJyaWVmRGVzYyA9IGJyaWVmRGVzY09iai50b1N0cmluZygpOwotCQkJCQkJaWYgKGRlYnVnKSBTeXN0ZW0ub3V0LnByaW50bG4oIiQkJCByZWFsaXplZCBicmllZiBkZXNjID0gIiArIGJyaWVmRGVzYyk7CSAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gYnJpZWZEZXNjOwotCX0KLQotCXByaXZhdGUgdm9pZCBhZGRBc3NpZ25tZW50KFN0cmluZyByZXNOYW1lLCBpbnQgdGFza1VpZCwgUHJvamVjdCBwcm9qKSB7Ci0JCUFzc2lnbm1lbnQgYXNzaWdubWVudCA9IHByb2plY3RGYWN0b3J5LmNyZWF0ZUFzc2lnbm1lbnQoKTsKLQotCQlhc3NpZ25tZW50LnNldFVJRChCaWdJbnRlZ2VyLnZhbHVlT2YoYXNzaWduX3VpZCkpOwotCQlhc3NpZ25tZW50LnNldFRhc2tVSUQoQmlnSW50ZWdlci52YWx1ZU9mKHRhc2tVaWQpKTsKLQkJQmlnSW50ZWdlciByZXNJRCA9IChCaWdJbnRlZ2VyKSByb2xlc1RvVWlkTWFwLmdldChyZXNOYW1lKTsKLQkJYXNzaWdubWVudC5zZXRSZXNvdXJjZVVJRChyZXNJRCk7Ci0KLQkJcHJvai5nZXRBc3NpZ25tZW50cygpLmdldEFzc2lnbm1lbnQoKS5hZGQoYXNzaWdubWVudCk7Ci0KLQkJYXNzaWduX3VpZCsrOwotCX0KLQotCXByaXZhdGUgTGlzdCBnZXRSb2xlc0ZvclRhc2tEKFRhc2tEZXNjcmlwdG9yIHRhc2tEZXNjcmlwdG9yKSB7Ci0JCUFycmF5TGlzdCByb2xlc0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJZm9yIChSb2xlRGVzY3JpcHRvciByZCA6IHRhc2tEZXNjcmlwdG9yLmdldFBlcmZvcm1lZFByaW1hcmlseUJ5KCkpIHsKLQotCQkJLy8gUm9sZURlc2NyaXB0b3Igcm9sZURlc2NycCA9Ci0JCQkvLyB0YXNrRGVzY3JpcHRvci5nZXRQZXJmb3JtZWRQcmltYXJpbHlCeSgpOwotCQkJUm9sZURlc2NyaXB0b3Igcm9sZURlc2NycCA9IChSb2xlRGVzY3JpcHRvcikgQ29uZmlndXJhdGlvbkhlbHBlcgotCQkJCQkuZ2V0Q2FsY3VsYXRlZEVsZW1lbnQocmQsIGJyZWFrZG93bkVsZW1lbnRGaWx0ZXIKLQkJCQkJCQkuZ2V0TWV0aG9kQ29uZmlndXJhdGlvbigpKTsKLQotCQkJaWYgKHJvbGVEZXNjcnAgIT0gbnVsbCkgewotCQkJCXJvbGVzTGlzdC5hZGQoZ2V0RGlzcGxheU5hbWUocm9sZURlc2NycCkpOwotCQkJfQotCQl9Ci0KLQkJLy8gTGlzdCByb2xlRGVzY3JwTGlzdCA9Ci0JCS8vIHRhc2tEZXNjcmlwdG9yLmdldEFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5KCk7Ci0JCUxpc3Qgcm9sZURlc2NycExpc3QgPSBDb25maWd1cmF0aW9uSGVscGVyLmdldENhbGN1bGF0ZWRFbGVtZW50cygKLQkJCQl0YXNrRGVzY3JpcHRvci5nZXRBZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSgpLAotCQkJCWJyZWFrZG93bkVsZW1lbnRGaWx0ZXIuZ2V0TWV0aG9kQ29uZmlndXJhdGlvbigpKTsKLQotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSByb2xlRGVzY3JwTGlzdC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCVJvbGVEZXNjcmlwdG9yIHJvbGVEZXNjcnAgPSAoUm9sZURlc2NyaXB0b3IpIGl0ZXIubmV4dCgpOwotCQkJcm9sZXNMaXN0LmFkZChnZXREaXNwbGF5TmFtZShyb2xlRGVzY3JwKSk7Ci0JCX0KLQotCQlyZXR1cm4gcm9sZXNMaXN0OwotCX0KLQotCXByaXZhdGUgTGlzdCBnZXRSb2xlc0ZvclRhc2sob3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrIHVtYVRhc2spIHsKLQkJQXJyYXlMaXN0IHJvbGVzTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQlmb3IgKFJvbGUgcm9sZTogdW1hVGFzay5nZXRQZXJmb3JtZWRCeSgpKSB7Ci0JCQlpZiAocm9sZSAhPSBudWxsKSB7Ci0JCQkJcm9sZXNMaXN0LmFkZChnZXREaXNwbGF5TmFtZShyb2xlKSk7Ci0JCQl9Ci0JCX0KLQotCQlMaXN0IGxpc3QgPSB1bWFUYXNrLmdldEFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGxpc3QuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlSb2xlIHJvbGUgPSAoUm9sZSkgaXRlci5uZXh0KCk7Ci0JCQlyb2xlc0xpc3QuYWRkKGdldERpc3BsYXlOYW1lKHJvbGUpKTsKLQkJfQotCi0JCXJldHVybiByb2xlc0xpc3Q7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGNhbGN1bGF0ZVJvbGx1cFJvbGVzKAotCQkJSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIgY29udGVudFByb3ZpZGVyLAotCQkJQnJlYWtkb3duRWxlbWVudCBicmVha2Rvd25FbGVtZW50LCBMaXN0IHJvbGx1cFJvbGVzKSB7Ci0KLQkJYm9vbGVhbiBpc0FueVN1YlRhc2tQbGFubmVkID0gZmFsc2U7Ci0KLQkJT2JqZWN0W10gZWxlbWVudHMgPSBjb250ZW50UHJvdmlkZXIuZ2V0RWxlbWVudHMoYnJlYWtkb3duRWxlbWVudCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gZWxlbWVudHNbaV07Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJaWYgKCFleHBvcnRPbmx5UGxhbm5lZEVsZW1lbnRzCi0JCQkJCQl8fCAoKEFjdGl2aXR5KSBlbGVtZW50KS5nZXRJc1BsYW5uZWQoKS5ib29sZWFuVmFsdWUoKSkgewotCQkJCQlpc0FueVN1YlRhc2tQbGFubmVkID0gdHJ1ZTsKLQkJCQl9IGVsc2UgewotCQkJCQlpc0FueVN1YlRhc2tQbGFubmVkID0gY2FsY3VsYXRlUm9sbHVwUm9sZXMoY29udGVudFByb3ZpZGVyLAotCQkJCQkJCShCcmVha2Rvd25FbGVtZW50KSBlbGVtZW50LCByb2xsdXBSb2xlcyk7Ci0JCQkJfQotCQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgQWN0aXZpdHlXcmFwcGVySXRlbVByb3ZpZGVyKSB7Ci0JCQkJT2JqZWN0IHdyYXBwZWRFbGVtZW50ID0gVG5nVXRpbC51bndyYXAoZWxlbWVudCk7Ci0JCQkJaWYgKHdyYXBwZWRFbGVtZW50IGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQkJaWYgKCFleHBvcnRPbmx5UGxhbm5lZEVsZW1lbnRzCi0JCQkJCQkJfHwgKChBY3Rpdml0eSkgd3JhcHBlZEVsZW1lbnQpLmdldElzUGxhbm5lZCgpCi0JCQkJCQkJCQkuYm9vbGVhblZhbHVlKCkpIHsKLQkJCQkJCWlzQW55U3ViVGFza1BsYW5uZWQgPSB0cnVlOwotCQkJCQl9IGVsc2UgewotCQkJCQkJaXNBbnlTdWJUYXNrUGxhbm5lZCA9IGNhbGN1bGF0ZVJvbGx1cFJvbGVzKAotCQkJCQkJCQljb250ZW50UHJvdmlkZXIsCi0JCQkJCQkJCShCcmVha2Rvd25FbGVtZW50KSB3cmFwcGVkRWxlbWVudCwgcm9sbHVwUm9sZXMpOwotCQkJCQl9Ci0JCQkJfQotCQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgVGFza0Rlc2NyaXB0b3IpIHsKLQkJCQlUYXNrRGVzY3JpcHRvciBkZXNjcmlwdG9yID0gKFRhc2tEZXNjcmlwdG9yKSBlbGVtZW50OwotCQkJCWlmICghZXhwb3J0T25seVBsYW5uZWRFbGVtZW50cwotCQkJCQkJfHwgZGVzY3JpcHRvci5nZXRJc1BsYW5uZWQoKS5ib29sZWFuVmFsdWUoKSkgewotCQkJCQlpc0FueVN1YlRhc2tQbGFubmVkID0gdHJ1ZTsKLQkJCQl9IGVsc2UgewotCQkJCQlyb2xsdXBSb2xlcwotCQkJCQkJCS5hZGRBbGwoZ2V0Um9sZXNGb3JUYXNrRCgoVGFza0Rlc2NyaXB0b3IpIGVsZW1lbnQpKTsKLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBUYXNrRGVzY3JpcHRvcldyYXBwZXJJdGVtUHJvdmlkZXIpIHsKLQkJCQlPYmplY3Qgd3JhcHBlZEVsZW1lbnQgPSBUbmdVdGlsLnVud3JhcChlbGVtZW50KTsKLQkJCQlpZiAod3JhcHBlZEVsZW1lbnQgaW5zdGFuY2VvZiBUYXNrRGVzY3JpcHRvcikgewotCQkJCQlUYXNrRGVzY3JpcHRvciBkZXNjcmlwdG9yID0gKFRhc2tEZXNjcmlwdG9yKSB3cmFwcGVkRWxlbWVudDsKLQkJCQkJaWYgKCFleHBvcnRPbmx5UGxhbm5lZEVsZW1lbnRzCi0JCQkJCQkJfHwgZGVzY3JpcHRvci5nZXRJc1BsYW5uZWQoKS5ib29sZWFuVmFsdWUoKSkgewotCQkJCQkJaXNBbnlTdWJUYXNrUGxhbm5lZCA9IHRydWU7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlyb2xsdXBSb2xlcwotCQkJCQkJCQkuYWRkQWxsKGdldFJvbGVzRm9yVGFza0QoKFRhc2tEZXNjcmlwdG9yKSB3cmFwcGVkRWxlbWVudCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGlzQW55U3ViVGFza1BsYW5uZWQ7Ci0JfQotCi0JLyoqCi0JICogUmV0cmlldmVzIGEgd29yayBicmVha2Rvd24gZWxlbWVudCdzIHByZWRlY2Vzc29ycywgc3RvcmVzIHRoZW0gaW4gYW4KLQkgKiA8b2NkZT5BcnJheUxpc3Q8L2NvZGU+LCBhbmQgcHV0IGl0IGludG8gYSBtYXAuCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiAgICAgICAgICAgIGEgd29yayBicmVha2Rvd24gZWxlbWVudAotCSAqLwotCXByaXZhdGUgdm9pZCBzdG9yZVRhc2tQcmVkZWNlc3NvcnMoV29ya0JyZWFrZG93bkVsZW1lbnQgZWxlbWVudCkgewotCQlpZiAoZWxlbWVudCA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlMaXN0IHByZWRlY2Vzc29ycyA9IGVsZW1lbnQuZ2V0TGlua1RvUHJlZGVjZXNzb3IoKTsKLQkJTGlzdCBwcmVkTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJaWYgKHByZWRlY2Vzc29ycyAhPSBudWxsICYmIHByZWRlY2Vzc29ycy5zaXplKCkgPiAwKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGkgPSBwcmVkZWNlc3NvcnMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQkJV29ya09yZGVyIHdvcmtPcmRlciA9IChXb3JrT3JkZXIpIGkubmV4dCgpOwotCQkJCUJyZWFrZG93bkVsZW1lbnQgcHJlZGVjZXNzb3IgPSB3b3JrT3JkZXIuZ2V0UHJlZCgpOwotCQkJCWlmIChkZWJ1ZykgewotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIiAgICBsb2NhbFByZWRMaXN0TWVtYmVyOiAiIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkrIHByZWRlY2Vzc29yKTsKLQkJCQl9Ci0JCQkJaWYgKHByZWRlY2Vzc29yICE9IG51bGwpIHsKLQkJCQkJU3RyaW5nIHByZWRHdWlkID0gcHJlZGVjZXNzb3IuZ2V0R3VpZCgpOwotCQkJCQlpZiAocHJlZEd1aWQgIT0gbnVsbCkKLQkJCQkJCXByZWRMaXN0LmFkZChwcmVkR3VpZCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmIChkZWJ1ZykgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCIgICBsb2NhbCBwcmVkbGlzdCBmb3IgIiArIGVsZW1lbnQuZ2V0TmFtZSgpIC8vJE5PTi1OTFMtMSQKLQkJCQkJKyAiID0gIiArIHByZWRMaXN0LnRvU3RyaW5nKCkpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQl3YnNXYXBwZXJQYXRoVG9Mb2NhbFByZWRMaXN0TWFwLnB1dChjdXJyZW50RWxlbWVudFBhdGgsIHByZWRMaXN0KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBnZW5lcmF0ZUxpbmtzKFByb2Nlc3MgcHJvY2VzcywgUHJvamVjdCBwcm9qZWN0KQotCQkJdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUVMaXN0IHRhc2tzID0gcHJvamVjdC5nZXRUYXNrcygpLmdldFRhc2soKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gdGFza3MuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlUYXNrIHRhc2sgPSAoVGFzaykgaXRlci5uZXh0KCk7Ci0JCQkKLQkJCUJpZ0ludGVnZXIgdGFza1VpZCA9IHRhc2suZ2V0VUlEKCk7Ci0JCQkvLyBza2lwIHRoZSBNUyBwcm9qZWN0IGhpZGRlbiB0YXNrIHdpdGggdWlkID0gMAotCQkJaWYgKHRhc2tVaWQuaW50VmFsdWUoKSA9PSAwKQotCQkJCWNvbnRpbnVlOwotCi0JCQlTdHJpbmcgd2JzUGF0aFN0ciA9IChTdHJpbmcpIHRhc2tVaWRUb1dic1dhcHBlclBhdGhNYXAuZ2V0KHRhc2tVaWQpOwotCi0JCQlIYXNoTWFwPFN0cmluZywgV29ya09yZGVyPiBwcmVkR3VpZFRvV09NYXAgPSBnZXRQcmVkR3VpZFRvV09NYXAodGFza1RvV2JlTWFwLmdldCh0YXNrKSk7Ci0JCQkKLQkJCS8vIExpc3QgcHJlZExpc3QgPSAoQXJyYXlMaXN0KQotCQkJLy8gd2JzV2FwcGVyUGF0aFRvTG9jYWxQcmVkTGlzdE1hcC5nZXQod2JzUGF0aFN0cik7Ci0JCQlMaXN0IHByZWRMaXN0ID0gKEFycmF5TGlzdCkgd2JzV3JhcHBlclBhdGhUb1ByZWRMaXN0TWFwCi0JCQkJCS5nZXQod2JzUGF0aFN0cik7Ci0JCQlpZiAocHJlZExpc3QgIT0gbnVsbCkgewotCQkJCUxpc3QgcmVtb3ZlTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gcHJlZExpc3QuaXRlcmF0b3IoKTsgaXRlcmF0b3IKLQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCS8vU3RyaW5nIHByZWRHdWlkID0gKFN0cmluZykgaXRlcmF0b3IubmV4dCgpOwotCQkJCQlNZXRob2RFbGVtZW50IHByZWRFbGVtID0gKE1ldGhvZEVsZW1lbnQpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJU3RyaW5nIHByZWRHdWlkID0gcHJlZEVsZW0uZ2V0R3VpZCgpOwotCQkJCQkKLQkJCQkJQmlnSW50ZWdlciBwcmVkVGFza1VpZCA9IChCaWdJbnRlZ2VyKSB3YnNHdWlkVG9UYXNrVWlkTWFwCi0JCQkJCQkJLmdldChwcmVkR3VpZCk7Ci0KLQkJCQkJaWYgKHByZWRUYXNrVWlkID09IG51bGwKLQkJCQkJCQl8fCBwcmVkVGFza1VpZC5pbnRWYWx1ZSgpID09IHRhc2tVaWQuaW50VmFsdWUoKSkgewotCQkJCQkJY29udGludWU7Ci0JCQkJCX0KLQotCQkJCQlpZiAoZGVidWcpIHsKLQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiJCQkIHRhc2tVaWQgPSAiICsgdGFza1VpZCAvLyROT04tTkxTLTEkCi0JCQkJCQkJCSsgIiwgd2JzUGF0aFN0ciA9ICIgKyB3YnNQYXRoU3RyKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCIgICAgbG9jYWxQcmVkTGlzdDogIiArIHByZWRMaXN0KTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCIgICAgZm91bmQgcHJlZCBndWlkOiAiICsgcHJlZEd1aWQpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQotCQkJCQkvL3JlbW92ZUxpc3QuYWRkKHByZWRHdWlkKTsKLQkJCQkJcmVtb3ZlTGlzdC5hZGQocHJlZEVsZW0pOwotCi0JCQkJCVByZWRlY2Vzc29yTGluayBwcmVMaW5rID0gcHJvamVjdEZhY3RvcnkKLQkJCQkJCQkuY3JlYXRlUHJlZGVjZXNzb3JMaW5rKCk7Ci0JCQkJCXRhc2suZ2V0UHJlZGVjZXNzb3JMaW5rKCkuYWRkKHByZUxpbmspOwotCQkJCQlwcmVMaW5rLnNldFByZWRlY2Vzc29yVUlEKHByZWRUYXNrVWlkKTsKLQkJCQkJCi0JCQkJCS8vcHJlTGluay5zZXRUeXBlKG5ldyBCaWdJbnRlZ2VyKCIxIikpOyAvLyROT04tTkxTLTEkCi0JCQkJCUJpZ0ludGVnZXIgYmlnSW50ID0gZ2V0TGlua1R5cGVJbnQocHJlZEd1aWRUb1dPTWFwLmdldChwcmVkR3VpZCkpOwotCQkJCQlpZiAoYmlnSW50ICE9IG51bGwpIHsKLQkJCQkJCXByZUxpbmsuc2V0VHlwZShiaWdJbnQpOwotCQkJCQl9Ci0JCQkJCQotCQkJCQlwcmVMaW5rLnNldENyb3NzUHJvamVjdChmYWxzZSk7Ci0JCQkJCXByZUxpbmsuc2V0TGlua0xhZyhuZXcgQmlnSW50ZWdlcigiMCIpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlwcmVMaW5rLnNldExhZ0Zvcm1hdChuZXcgQmlnSW50ZWdlcigiNyIpKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCQlwcmVkTGlzdC5yZW1vdmVBbGwocmVtb3ZlTGlzdCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIEJpZ0ludGVnZXIgZ2V0TGlua1R5cGVJbnQoV29ya09yZGVyIHdvKSB7Ci0JCWlmICh3byA9PSBudWxsKSB7Ci0JCQlpZiAoZGVidWcpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIldhcm5pbmc+IGdldExpbmtUeXBlSW50LCB3byA9PSBudWxsLiIpOy8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCVdvcmtPcmRlclR5cGUgd29UeXBlID0gd28uZ2V0TGlua1R5cGUoKTsKLQkJaWYgKHdvVHlwZSA9PSBXb3JrT3JkZXJUeXBlLkZJTklTSF9UT19TVEFSVCkgewotCQkJcmV0dXJuIG5ldyBCaWdJbnRlZ2VyKCIxIik7IC8vJE5PTi1OTFMtMSQKLQkJfSAKLQkJaWYgKHdvVHlwZSA9PSBXb3JrT3JkZXJUeXBlLlNUQVJUX1RPX1NUQVJUKSB7Ci0JCQlyZXR1cm4gbmV3IEJpZ0ludGVnZXIoIjMiKTsgLy8kTk9OLU5MUy0xJAotCQl9IAotCQlpZiAod29UeXBlID09IFdvcmtPcmRlclR5cGUuRklOSVNIX1RPX0ZJTklTSCkgewotCQkJcmV0dXJuIG5ldyBCaWdJbnRlZ2VyKCIwIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlpZiAod29UeXBlID09IFdvcmtPcmRlclR5cGUuU1RBUlRfVE9fRklOSVNIKSB7Ci0JCQlyZXR1cm4gbmV3IEJpZ0ludGVnZXIoIjIiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgSGFzaE1hcDxTdHJpbmcsIFdvcmtPcmRlcj4gZ2V0UHJlZEd1aWRUb1dPTWFwKFdvcmtCcmVha2Rvd25FbGVtZW50IHdiZSkgewotCQlIYXNoTWFwPFN0cmluZywgV29ya09yZGVyPiBwcmVkR3VpZFRvV09NYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFdvcmtPcmRlcj4oKTsKLQkJaWYgKHdiZSAhPSBudWxsKSB7Ci0JCQlMaXN0PFdvcmtPcmRlcj4gd29MaXN0ID0gd2JlLmdldExpbmtUb1ByZWRlY2Vzc29yKCk7Ci0JCQlpbnQgc3ogPSB3b0xpc3QgPT0gbnVsbCA/IDAgOiB3b0xpc3Quc2l6ZSgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzejsgaSsrKSB7Ci0JCQkJV29ya09yZGVyIHdvID0gd29MaXN0LmdldChpKTsKLQkJCQlpZiAod28gPT0gbnVsbCB8fCB3by5nZXRQcmVkKCkgPT0gbnVsbCkgewotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJcHJlZEd1aWRUb1dPTWFwLnB1dCh3by5nZXRQcmVkKCkuZ2V0R3VpZCgpLCB3byk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHByZWRHdWlkVG9XT01hcDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBnZW5lcmF0ZWQgSFRNTCBjb250ZW50IGZpbGUgVVJMIGZvciBhIG1ldGhvZCBlbGVtZW50LgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogICAgICAgICAgICBhIG1ldGhvZCBlbGVtZW50Ci0JICogQHJldHVybiB0aGUgVVJMIG9mIHRoZSBnZW5lcmF0ZWQgSFRNTCBjb250ZW50IGZpbGUKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEVsZW1lbnRVUkwoTWV0aG9kRWxlbWVudCBlbGVtZW50KSB7Ci0JCWlmIChlbGVtZW50ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlTdHJpbmcgZWxlbWVudFBhdGggPSBudWxsOwotCQlTdHJpbmcgZWxlbWVudEZpbGVOYW1lID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWVsZW1lbnRQYXRoID0gUmVzb3VyY2VIZWxwZXIuZ2V0RWxlbWVudFBhdGgoZWxlbWVudCk7Ci0JCQllbGVtZW50RmlsZU5hbWUgPSBSZXNvdXJjZUhlbHBlci5nZXRGaWxlTmFtZShlbGVtZW50LAotCQkJCQlSZXNvdXJjZUhlbHBlci5GSUxFX0VYVF9IVE1MKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlpZiAoZWxlbWVudFBhdGggIT0gbnVsbCAmJiBlbGVtZW50RmlsZU5hbWUgIT0gbnVsbCkgewotCQkJZWxlbWVudFBhdGggPSBlbGVtZW50UGF0aC5yZXBsYWNlKCdcXCcsICcvJyk7Ci0JCQllbGVtZW50RmlsZU5hbWUgPSBlbGVtZW50RmlsZU5hbWUucmVwbGFjZSgnXFwnLCAnLycpOwotCQkJU3RyaW5nIHVybCA9IGNvbnRlbnRGb2xkZXJOYW1lCi0JCQkJCSsgIi8iICsgZWxlbWVudFBhdGggKyBlbGVtZW50RmlsZU5hbWU7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBhYlRhcmdldERpciArIEZpbGUuc2VwYXJhdG9yICsgdXJsOwotCQl9IGVsc2UgewotCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBkaXNwbGF5IG5hbWUgb2YgYSBtZXRob2QgZWxlbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqICAgICAgICAgICAgYSBtZXRob2QgZWxlbWVudAotCSAqIEByZXR1cm4gdGhlIGRpc3BsYXkgbmFtZSBvZiB0aGUgZ2l2ZW4gZWxlbWVudAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGlzcGxheU5hbWUoTWV0aG9kRWxlbWVudCBlbGVtZW50KSB7Ci0JCVN0cmluZyBuYW1lID0gbnVsbDsKLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50KSB7Ci0JCQluYW1lID0gUHJvY2Vzc1V0aWwuZ2V0UHJlc2VudGF0aW9uTmFtZSgoQnJlYWtkb3duRWxlbWVudCkgZWxlbWVudCk7Ci0JCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIERlc2NyaWJhYmxlRWxlbWVudCkgewotCQkJbmFtZSA9ICgoRGVzY3JpYmFibGVFbGVtZW50KSBlbGVtZW50KS5nZXRQcmVzZW50YXRpb25OYW1lKCk7Ci0JCX0KLQkJaWYgKG5hbWUgPT0gbnVsbCB8fCBuYW1lLmxlbmd0aCgpID09IDApIHsKLQkJCW5hbWUgPSBlbGVtZW50LmdldE5hbWUoKTsKLQkJfQotCQlyZXR1cm4gWE1MVXRpbC5lc2NhcGVBdHRyKG5hbWUpOwotCX0KLQotCS8qKgotCSAqIFB1Ymxpc2hlcyB0aGUgc2VsZWN0ZWQgY29uZmlndXJhdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhlIGV4cG9ydGVkCi0JICogcHJvY2Vzcy4KLQkgKiAKLQkgKiBAcGFyYW0gZGlyCi0JICogICAgICAgICAgICB0aGUgb3V0cHV0IGRpcmVjdG9yeQotCSAqIEBwYXJhbSBjb25maWcKLQkgKiAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIHRvIHB1Ymxpc2gKLQkgKiBAcGFyYW0gcHVibGlzaENvbmZpZ09wdGlvbnMKLQkgKiAgICAgICAgICAgIHRoZSBwdWJsaXNoaW5nIG9wdGlvbnMKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBjb25maWd1cmF0aW9uIHdhcyBwdWJsaXNoZWQKLQkgKiAgICAgICAgIHN1Y2Nlc3NmdWxseSwgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotCSAqIEB0aHJvd3MgRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlIHB1Ymxpc2hpbmcgdGhlIGNvbmZpZ3VyYXRpb24KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBwdWJsaXNoQ29uZmlndXJhdGlvbihTdHJpbmcgZGlyLAotCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcsIFB1Ymxpc2hPcHRpb25zIHB1Ymxpc2hDb25maWdPcHRpb25zKQotCQkJdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVB1Ymxpc2hNYW5hZ2VyIHB1Ymxpc2hNZ3IgPSBudWxsOwotCQl0cnkgewotCQkJcHVibGlzaE1nciA9IG5ldyBQdWJsaXNoTWFuYWdlcigpOwotCQkJcHVibGlzaE1nci5pbml0KGRpciwgY29uZmlnLCBuZXcgUHVibGlzaEhUTUxPcHRpb25zKAotCQkJCQlwdWJsaXNoQ29uZmlnT3B0aW9ucykpOwotCi0JCQlFeHBvcnRNU1BYTUxPcGVyYXRpb24gb3BlcmF0aW9uID0gbmV3IEV4cG9ydE1TUFhNTE9wZXJhdGlvbigKLQkJCQkJcHVibGlzaE1ncik7Ci0JCQlQdWJsaXNoUHJvZ3Jlc3NNb25pdG9yRGlhbG9nIGRsZyA9IG5ldyBQdWJsaXNoUHJvZ3Jlc3NNb25pdG9yRGlhbG9nKAotCQkJCQlEaXNwbGF5LmdldEN1cnJlbnQoKS5nZXRBY3RpdmVTaGVsbCgpLCBwdWJsaXNoTWdyCi0JCQkJCQkJLmdldFZpZXdCdWlsZGVyKCkpOwotCQkJYm9vbGVhbiBzdWNjZXNzID0gVUlIZWxwZXIucnVuV2l0aFByb2dyZXNzKG9wZXJhdGlvbiwKLQkJCQkJZGxnLCB0cnVlLCBFeHBvcnRNU1BSZXNvdXJjZXMuZXhwb3J0TVNQV2l6YXJkX3RpdGxlKTsKLQkJCWlmIChvcGVyYXRpb24uZ2V0RXhjZXB0aW9uKCkgIT0gbnVsbCkgewotCQkJCXRocm93IG9wZXJhdGlvbi5nZXRFeGNlcHRpb24oKTsKLQkJCX0KLQkJCXJldHVybiBzdWNjZXNzICYmICFkbGcuZ2V0UHJvZ3Jlc3NNb25pdG9yKCkuaXNDYW5jZWxlZCgpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJdGhyb3cgZTsKLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChwdWJsaXNoTWdyICE9IG51bGwpIHsKLQkJCQlwdWJsaXNoTWdyLmRpc3Bvc2UoKTsKLQkJCQlwdWJsaXNoTWdyID0gbnVsbDsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFByaW50cyB0aGUgdHJhY2UgaW5mb3JtYXRpb24gZm9yIHRoZSBNaWNyb3NvZnQgUHJvamVjdC4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHByaW50TVNQcm9qZWN0KFByb2plY3QgcHJvamVjdCkgewotCQlTeXN0ZW0ub3V0LnByaW50bG4oIlxuJCQkIHJlYWQtaW4gcHJvamVjdCA9ICIgKyBwcm9qZWN0KTsgLy8kTk9OLU5MUy0xJAotCi0JCUVMaXN0IHRhc2tzID0gcHJvamVjdC5nZXRUYXNrcygpLmdldFRhc2soKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gdGFza3MuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlUYXNrIGVsZW1lbnQgPSAoVGFzaykgaXRlci5uZXh0KCk7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIiQkJCBhIHRhc2sgPSAiICsgZWxlbWVudCk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCUVMaXN0IHJlc291cmNlcyA9IHByb2plY3QuZ2V0UmVzb3VyY2VzKCkuZ2V0UmVzb3VyY2UoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gcmVzb3VyY2VzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSBlbGVtZW50ID0gKG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UpIGl0ZXIKLQkJCQkJLm5leHQoKTsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiJCQkIGEgcmVzb3VyY2UgPSAiICsgZWxlbWVudCk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCUVMaXN0IGFzc2lnbm1lbnRzID0gcHJvamVjdC5nZXRBc3NpZ25tZW50cygpLmdldEFzc2lnbm1lbnQoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gYXNzaWdubWVudHMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlBc3NpZ25tZW50IGVsZW1lbnQgPSAoQXNzaWdubWVudCkgaXRlci5uZXh0KCk7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIiQkJCBhbiBhc3NpZ25tZW50ID0gIiArIGVsZW1lbnQpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlTeXN0ZW0ub3V0LnByaW50bG4oIiQkJD09PVxuIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JcHJvdGVjdGVkIEhhc2hNYXA8VGFzaywgV29ya0JyZWFrZG93bkVsZW1lbnQ+IGdldFRhc2tUb1diZU1hcCgpIHsKLQkJcmV0dXJuIHRhc2tUb1diZU1hcDsKLQl9Ci0JCi0JLy9UbyBiZSBvdmVycmlkZW4gYnkgc3ViY2xhc3NlcwotCXByb3RlY3RlZCB2b2lkIHNldFByb2plY3RFeHRlbmRlZEF0dHJpYnV0ZXMoUHJvamVjdCBwcm9qZWN0KSB7Ci0JfQotCi0JLy9UbyBiZSBvdmVycmlkZW4gYnkgc3ViY2xhc3NlcwotCXByb3RlY3RlZCB2b2lkIGdlbmVyYXRlV1BEcyhNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZykgewotCX0JCi0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L21zcC9FeHBvcnRPcHRpb25zLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9tc3AvRXhwb3J0T3B0aW9ucy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDlhODQ0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L21zcC9FeHBvcnRPcHRpb25zLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcDsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotCi0vKioKLSAqIEEgSGFzaE1hcCBmb3IgRXhwb3J0IE9wdGlvbnMKLSAqIAotICogQGF1dGhvciBCaW5neHVlIFh1Ci0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgRXhwb3J0T3B0aW9ucyBleHRlbmRzIEhhc2hNYXAgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTU4OTcwMTIxNTkxMzIxMjI3M0w7Ci0JCi0JLyoqCi0JICogVGhlIHB1Ymxpc2ggc2VsZWN0ZWQgY29uZmlndXJhdGlvbiBvcHRpb24uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFVCTElTSF9DT05GSUcgPSAicHVibGlzaENvbmZpZyI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSBleHBvcnQgb25seSBwbGFubmVkIHdvcmticmVha2Rvd24gZWxlbWVudHMgb3B0aW9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYUE9SVF9PTkxZX1BMQU5ORURfRUxFTUVOVFMgPSAiZXhwb3J0T25seVBsYW5uZWRFbGVtZW50cyI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSBleHBvcnQgZWZmb3J0IGVzdGltYXRlcyBmb3Igd29ya2JyZWFrZG93biBlbGVtZW50cyBvcHRpb24uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhQT1JUX0VTVElNQVRFUyA9ICJleHBvcnRFc3RpbWF0ZXMiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgZXN0aW1hdGluZyBtb2RlbCB1c2VkIHRvIGNhbGN1bGF0ZSB0aGUgZWZmb3J0IGVzdGltYXRlcyBvZiB0aGUKLQkgKiBleHBvcnRlZCB3b3JrYnJlYWtkb3duIGVsZW1lbnRzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVTVElNQVRJTkdfTU9ERUwgPSAiZXN0aW1hdGluZ01vZGVsIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIEV4cG9ydE9wdGlvbnMoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9tc3AvSUV4cG9ydE1TUFNlcnZpY2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L21zcC9JRXhwb3J0TVNQU2VydmljZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNDkzNGEwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L21zcC9JRXhwb3J0TVNQU2VydmljZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3A7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M7Ci0KLS8qKgotICogVGhlIGludGVyZmFjZSBmb3IgdGhlIEV4cG9ydCBNaWNyb3NvZnQgUHJvamVjdCBTZXJ2aWNlLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJRXhwb3J0TVNQU2VydmljZSB7Ci0KLQkvKioKLQkgKiBFeHBvcnQgYSBwcm9jZXNzIHRvIGEgTWljcm9zb2Z0IFByb2plY3QgZmlsZS4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvY2VzcwotCSAqICAgICAgICAgICAgYSBjYXBhYmlsaXR5IHBhdHRlcm4gb3IgZGVsaXZlcnkgcHJvY2VzcwotCSAqIEBwYXJhbSBleHBvcnRPcHRpb25zCi0JICogICAgICAgICAgICBhIGNvbGxlY3Rpb24gb2YgdXNlciBzcGVjaWZpZWQgZXhwb3J0IG9wdGlvbnMKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBvcGVyYXRpb24gd2FzIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkKLQkgKiBAdGhyb3dzIEV4cG9ydE1TUFNlcnZpY2VFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUgZXhlY3V0aW5nIHRoZSBvcGVyYXRpb24KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBleHBvcnRNU1Byb2plY3QoUHJvY2VzcyBwcm9jZXNzLAotCQkJRXhwb3J0TVNQT3B0aW9ucyBleHBvcnRPcHRpb25zKSB0aHJvd3MgRXhwb3J0TVNQU2VydmljZUV4Y2VwdGlvbjsKLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3Avc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvbXNwL1Jlc291cmNlcy5wcm9wZXJ0aWVzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3Avc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvbXNwL1Jlc291cmNlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOWFjOTYwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L21zcC9SZXNvdXJjZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLQotIyBFeHBvcnQgTWljcm9zb2Z0IFByb2plY3QgV2l6YXJkCi1leHBvcnRNU1BXaXphcmRfdGl0bGU9RXhwb3J0IE1pY3Jvc29mdCBQcm9qZWN0Ci0KLSMgUHJvZ3Jlc3MgTWVzc2FnZXMKLWV4cG9ydE1TUFRhc2tfbmFtZT1FeHBvcnRpbmcgc2VsZWN0ZWQgcHJvY2VzcyB0byBNaWNyb3NvZnQgUHJvamVjdC4uLgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3Avc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvbXNwL3BhY2thZ2UuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L21zcC9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmYTUyMjAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3Avc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvbXNwL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIHRoZSBpbnRlcmZhY2VzIGFuZCBpbXBsZW1lbnRhdGlvbiBmb3IgdGhlIEV4cG9ydCBNaWNyb3NvZnQgUHJvamVjdCBzZXJ2aWNlLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwL3RlbXBsYXRlL21zcHJvamVjdF8yMDAzX3RlbXBsYXRlLnhtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwL3RlbXBsYXRlL21zcHJvamVjdF8yMDAzX3RlbXBsYXRlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZlNTBjMy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC90ZW1wbGF0ZS9tc3Byb2plY3RfMjAwM190ZW1wbGF0ZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNjkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08UHJvamVjdCB4bWxucz0iaHR0cDovL2VwZi5lY2xpcHNlLm9yZy9tc3Byb2plY3QiPgotPE5hbWU+bXNwcm9qZWN0XzIwMDNfdGVtcGxhdGUueG1sPC9OYW1lPgotPENvbXBhbnk+RWNsaXBzZS5vcmc8L0NvbXBhbnk+Ci08QXV0aG9yPjwvQXV0aG9yPgotPENyZWF0aW9uRGF0ZT4yMDA2LTAyLTEwVDE0OjM2OjAwPC9DcmVhdGlvbkRhdGU+Ci08TGFzdFNhdmVkPjIwMDYtMDItMTBUMTU6MTk6MDA8L0xhc3RTYXZlZD4KLTxTY2hlZHVsZUZyb21TdGFydD4xPC9TY2hlZHVsZUZyb21TdGFydD4KLTxTdGFydERhdGU+MjAwNi0wMi0xMFQwODowMDowMDwvU3RhcnREYXRlPgotPEZpbmlzaERhdGU+MjAwNi0wMi0xMFQwODowMDowMDwvRmluaXNoRGF0ZT4KLTxGWVN0YXJ0RGF0ZT4xPC9GWVN0YXJ0RGF0ZT4KLTxDcml0aWNhbFNsYWNrTGltaXQ+MDwvQ3JpdGljYWxTbGFja0xpbWl0PgotPEN1cnJlbmN5RGlnaXRzPjI8L0N1cnJlbmN5RGlnaXRzPgotPEN1cnJlbmN5U3ltYm9sPiQ8L0N1cnJlbmN5U3ltYm9sPgotPEN1cnJlbmN5U3ltYm9sUG9zaXRpb24+MDwvQ3VycmVuY3lTeW1ib2xQb3NpdGlvbj4KLTxDYWxlbmRhclVJRD4xPC9DYWxlbmRhclVJRD4KLTxEZWZhdWx0U3RhcnRUaW1lPjA4OjAwOjAwPC9EZWZhdWx0U3RhcnRUaW1lPgotPERlZmF1bHRGaW5pc2hUaW1lPjE3OjAwOjAwPC9EZWZhdWx0RmluaXNoVGltZT4KLTxNaW51dGVzUGVyRGF5PjQ4MDwvTWludXRlc1BlckRheT4KLTxNaW51dGVzUGVyV2Vlaz4yNDAwPC9NaW51dGVzUGVyV2Vlaz4KLTxEYXlzUGVyTW9udGg+MjA8L0RheXNQZXJNb250aD4KLTxEZWZhdWx0VGFza1R5cGU+MDwvRGVmYXVsdFRhc2tUeXBlPgotPERlZmF1bHRGaXhlZENvc3RBY2NydWFsPjM8L0RlZmF1bHRGaXhlZENvc3RBY2NydWFsPgotPERlZmF1bHRTdGFuZGFyZFJhdGU+MDwvRGVmYXVsdFN0YW5kYXJkUmF0ZT4KLTxEZWZhdWx0T3ZlcnRpbWVSYXRlPjA8L0RlZmF1bHRPdmVydGltZVJhdGU+Ci08RHVyYXRpb25Gb3JtYXQ+NzwvRHVyYXRpb25Gb3JtYXQ+Ci08V29ya0Zvcm1hdD4yPC9Xb3JrRm9ybWF0PgotPEVkaXRhYmxlQWN0dWFsQ29zdHM+MDwvRWRpdGFibGVBY3R1YWxDb3N0cz4KLTxIb25vckNvbnN0cmFpbnRzPjA8L0hvbm9yQ29uc3RyYWludHM+Ci08SW5zZXJ0ZWRQcm9qZWN0c0xpa2VTdW1tYXJ5PjE8L0luc2VydGVkUHJvamVjdHNMaWtlU3VtbWFyeT4KLTxNdWx0aXBsZUNyaXRpY2FsUGF0aHM+MDwvTXVsdGlwbGVDcml0aWNhbFBhdGhzPgotPE5ld1Rhc2tzRWZmb3J0RHJpdmVuPjE8L05ld1Rhc2tzRWZmb3J0RHJpdmVuPgotPE5ld1Rhc2tzRXN0aW1hdGVkPjE8L05ld1Rhc2tzRXN0aW1hdGVkPgotPFNwbGl0c0luUHJvZ3Jlc3NUYXNrcz4xPC9TcGxpdHNJblByb2dyZXNzVGFza3M+Ci08U3ByZWFkQWN0dWFsQ29zdD4wPC9TcHJlYWRBY3R1YWxDb3N0PgotPFNwcmVhZFBlcmNlbnRDb21wbGV0ZT4wPC9TcHJlYWRQZXJjZW50Q29tcGxldGU+Ci08VGFza1VwZGF0ZXNSZXNvdXJjZT4xPC9UYXNrVXBkYXRlc1Jlc291cmNlPgotPEZpc2NhbFllYXJTdGFydD4wPC9GaXNjYWxZZWFyU3RhcnQ+Ci08V2Vla1N0YXJ0RGF5PjA8L1dlZWtTdGFydERheT4KLTxNb3ZlQ29tcGxldGVkRW5kc0JhY2s+MDwvTW92ZUNvbXBsZXRlZEVuZHNCYWNrPgotPE1vdmVSZW1haW5pbmdTdGFydHNCYWNrPjA8L01vdmVSZW1haW5pbmdTdGFydHNCYWNrPgotPE1vdmVSZW1haW5pbmdTdGFydHNGb3J3YXJkPjA8L01vdmVSZW1haW5pbmdTdGFydHNGb3J3YXJkPgotPE1vdmVDb21wbGV0ZWRFbmRzRm9yd2FyZD4wPC9Nb3ZlQ29tcGxldGVkRW5kc0ZvcndhcmQ+Ci08QmFzZWxpbmVGb3JFYXJuZWRWYWx1ZT4wPC9CYXNlbGluZUZvckVhcm5lZFZhbHVlPgotPEF1dG9BZGROZXdSZXNvdXJjZXNBbmRUYXNrcz4xPC9BdXRvQWRkTmV3UmVzb3VyY2VzQW5kVGFza3M+Ci08Q3VycmVudERhdGU+MjAwNi0wMi0xMFQwODowMDowMDwvQ3VycmVudERhdGU+Ci08TWljcm9zb2Z0UHJvamVjdFNlcnZlclVSTD4xPC9NaWNyb3NvZnRQcm9qZWN0U2VydmVyVVJMPgotPEF1dG9saW5rPjE8L0F1dG9saW5rPgotPE5ld1Rhc2tTdGFydERhdGU+MDwvTmV3VGFza1N0YXJ0RGF0ZT4KLTxEZWZhdWx0VGFza0VWTWV0aG9kPjA8L0RlZmF1bHRUYXNrRVZNZXRob2Q+Ci08UHJvamVjdEV4dGVybmFsbHlFZGl0ZWQ+MDwvUHJvamVjdEV4dGVybmFsbHlFZGl0ZWQ+Ci08RXh0ZW5kZWRDcmVhdGlvbkRhdGU+MTk4NC0wMS0wMVQwMDowMDowMDwvRXh0ZW5kZWRDcmVhdGlvbkRhdGU+Ci08QWN0dWFsc0luU3luYz4xPC9BY3R1YWxzSW5TeW5jPgotPFJlbW92ZUZpbGVQcm9wZXJ0aWVzPjA8L1JlbW92ZUZpbGVQcm9wZXJ0aWVzPgotPEFkbWluUHJvamVjdD4wPC9BZG1pblByb2plY3Q+Ci08T3V0bGluZUNvZGVzLz4KLTxXQlNNYXNrcy8+Ci08RXh0ZW5kZWRBdHRyaWJ1dGVzLz4KLTxDYWxlbmRhcnM+Ci08Q2FsZW5kYXI+Ci08VUlEPjE8L1VJRD4KLTxOYW1lPlN0YW5kYXJkPC9OYW1lPgotPElzQmFzZUNhbGVuZGFyPjE8L0lzQmFzZUNhbGVuZGFyPgotPEJhc2VDYWxlbmRhclVJRD4tMTwvQmFzZUNhbGVuZGFyVUlEPgotPFdlZWtEYXlzPgotPFdlZWtEYXk+Ci08RGF5VHlwZT4xPC9EYXlUeXBlPgotPERheVdvcmtpbmc+MDwvRGF5V29ya2luZz4KLTwvV2Vla0RheT4KLTxXZWVrRGF5PgotPERheVR5cGU+MjwvRGF5VHlwZT4KLTxEYXlXb3JraW5nPjE8L0RheVdvcmtpbmc+Ci08V29ya2luZ1RpbWVzPgotPFdvcmtpbmdUaW1lPgotPEZyb21UaW1lPjA4OjAwOjAwPC9Gcm9tVGltZT4KLTxUb1RpbWU+MTI6MDA6MDA8L1RvVGltZT4KLTwvV29ya2luZ1RpbWU+Ci08V29ya2luZ1RpbWU+Ci08RnJvbVRpbWU+MTM6MDA6MDA8L0Zyb21UaW1lPgotPFRvVGltZT4xNzowMDowMDwvVG9UaW1lPgotPC9Xb3JraW5nVGltZT4KLTwvV29ya2luZ1RpbWVzPgotPC9XZWVrRGF5PgotPFdlZWtEYXk+Ci08RGF5VHlwZT4zPC9EYXlUeXBlPgotPERheVdvcmtpbmc+MTwvRGF5V29ya2luZz4KLTxXb3JraW5nVGltZXM+Ci08V29ya2luZ1RpbWU+Ci08RnJvbVRpbWU+MDg6MDA6MDA8L0Zyb21UaW1lPgotPFRvVGltZT4xMjowMDowMDwvVG9UaW1lPgotPC9Xb3JraW5nVGltZT4KLTxXb3JraW5nVGltZT4KLTxGcm9tVGltZT4xMzowMDowMDwvRnJvbVRpbWU+Ci08VG9UaW1lPjE3OjAwOjAwPC9Ub1RpbWU+Ci08L1dvcmtpbmdUaW1lPgotPC9Xb3JraW5nVGltZXM+Ci08L1dlZWtEYXk+Ci08V2Vla0RheT4KLTxEYXlUeXBlPjQ8L0RheVR5cGU+Ci08RGF5V29ya2luZz4xPC9EYXlXb3JraW5nPgotPFdvcmtpbmdUaW1lcz4KLTxXb3JraW5nVGltZT4KLTxGcm9tVGltZT4wODowMDowMDwvRnJvbVRpbWU+Ci08VG9UaW1lPjEyOjAwOjAwPC9Ub1RpbWU+Ci08L1dvcmtpbmdUaW1lPgotPFdvcmtpbmdUaW1lPgotPEZyb21UaW1lPjEzOjAwOjAwPC9Gcm9tVGltZT4KLTxUb1RpbWU+MTc6MDA6MDA8L1RvVGltZT4KLTwvV29ya2luZ1RpbWU+Ci08L1dvcmtpbmdUaW1lcz4KLTwvV2Vla0RheT4KLTxXZWVrRGF5PgotPERheVR5cGU+NTwvRGF5VHlwZT4KLTxEYXlXb3JraW5nPjE8L0RheVdvcmtpbmc+Ci08V29ya2luZ1RpbWVzPgotPFdvcmtpbmdUaW1lPgotPEZyb21UaW1lPjA4OjAwOjAwPC9Gcm9tVGltZT4KLTxUb1RpbWU+MTI6MDA6MDA8L1RvVGltZT4KLTwvV29ya2luZ1RpbWU+Ci08V29ya2luZ1RpbWU+Ci08RnJvbVRpbWU+MTM6MDA6MDA8L0Zyb21UaW1lPgotPFRvVGltZT4xNzowMDowMDwvVG9UaW1lPgotPC9Xb3JraW5nVGltZT4KLTwvV29ya2luZ1RpbWVzPgotPC9XZWVrRGF5PgotPFdlZWtEYXk+Ci08RGF5VHlwZT42PC9EYXlUeXBlPgotPERheVdvcmtpbmc+MTwvRGF5V29ya2luZz4KLTxXb3JraW5nVGltZXM+Ci08V29ya2luZ1RpbWU+Ci08RnJvbVRpbWU+MDg6MDA6MDA8L0Zyb21UaW1lPgotPFRvVGltZT4xMjowMDowMDwvVG9UaW1lPgotPC9Xb3JraW5nVGltZT4KLTxXb3JraW5nVGltZT4KLTxGcm9tVGltZT4xMzowMDowMDwvRnJvbVRpbWU+Ci08VG9UaW1lPjE3OjAwOjAwPC9Ub1RpbWU+Ci08L1dvcmtpbmdUaW1lPgotPC9Xb3JraW5nVGltZXM+Ci08L1dlZWtEYXk+Ci08V2Vla0RheT4KLTxEYXlUeXBlPjc8L0RheVR5cGU+Ci08RGF5V29ya2luZz4wPC9EYXlXb3JraW5nPgotPC9XZWVrRGF5PgotPC9XZWVrRGF5cz4KLTwvQ2FsZW5kYXI+Ci08L0NhbGVuZGFycz4KLTxUYXNrcz4KLTxUYXNrPgotPFVJRD4wPC9VSUQ+Ci08SUQ+MDwvSUQ+Ci08VHlwZT4xPC9UeXBlPgotPElzTnVsbD4wPC9Jc051bGw+Ci08Q3JlYXRlRGF0ZT4yMDA2LTAyLTEwVDE0OjM2OjAwPC9DcmVhdGVEYXRlPgotPFdCUz4wPC9XQlM+Ci08T3V0bGluZU51bWJlcj4wPC9PdXRsaW5lTnVtYmVyPgotPE91dGxpbmVMZXZlbD4wPC9PdXRsaW5lTGV2ZWw+Ci08UHJpb3JpdHk+NTAwPC9Qcmlvcml0eT4KLTxTdGFydD4yMDA2LTAyLTEwVDA4OjAwOjAwPC9TdGFydD4KLTxGaW5pc2g+MjAwNi0wMi0xMFQwODowMDowMDwvRmluaXNoPgotPER1cmF0aW9uPlBUMEgwTTBTPC9EdXJhdGlvbj4KLTxEdXJhdGlvbkZvcm1hdD41MzwvRHVyYXRpb25Gb3JtYXQ+Ci08V29yaz5QVDBIME0wUzwvV29yaz4KLTxSZXN1bWVWYWxpZD4wPC9SZXN1bWVWYWxpZD4KLTxFZmZvcnREcml2ZW4+MDwvRWZmb3J0RHJpdmVuPgotPFJlY3VycmluZz4wPC9SZWN1cnJpbmc+Ci08T3ZlckFsbG9jYXRlZD4wPC9PdmVyQWxsb2NhdGVkPgotPEVzdGltYXRlZD4xPC9Fc3RpbWF0ZWQ+Ci08TWlsZXN0b25lPjA8L01pbGVzdG9uZT4KLTxTdW1tYXJ5PjE8L1N1bW1hcnk+Ci08Q3JpdGljYWw+MTwvQ3JpdGljYWw+Ci08SXNTdWJwcm9qZWN0PjA8L0lzU3VicHJvamVjdD4KLTxJc1N1YnByb2plY3RSZWFkT25seT4wPC9Jc1N1YnByb2plY3RSZWFkT25seT4KLTxFeHRlcm5hbFRhc2s+MDwvRXh0ZXJuYWxUYXNrPgotPEVhcmx5U3RhcnQ+MjAwNi0wMi0xMFQwODowMDowMDwvRWFybHlTdGFydD4KLTxFYXJseUZpbmlzaD4yMDA2LTAyLTEwVDA4OjAwOjAwPC9FYXJseUZpbmlzaD4KLTxMYXRlU3RhcnQ+MjAwNi0wMi0xMFQwODowMDowMDwvTGF0ZVN0YXJ0PgotPExhdGVGaW5pc2g+MjAwNi0wMi0xMFQwODowMDowMDwvTGF0ZUZpbmlzaD4KLTxTdGFydFZhcmlhbmNlPjA8L1N0YXJ0VmFyaWFuY2U+Ci08RmluaXNoVmFyaWFuY2U+MDwvRmluaXNoVmFyaWFuY2U+Ci08V29ya1ZhcmlhbmNlPjA8L1dvcmtWYXJpYW5jZT4KLTxGcmVlU2xhY2s+MDwvRnJlZVNsYWNrPgotPFRvdGFsU2xhY2s+MDwvVG90YWxTbGFjaz4KLTxGaXhlZENvc3Q+MDwvRml4ZWRDb3N0PgotPEZpeGVkQ29zdEFjY3J1YWw+MzwvRml4ZWRDb3N0QWNjcnVhbD4KLTxQZXJjZW50Q29tcGxldGU+MDwvUGVyY2VudENvbXBsZXRlPgotPFBlcmNlbnRXb3JrQ29tcGxldGU+MDwvUGVyY2VudFdvcmtDb21wbGV0ZT4KLTxDb3N0PjA8L0Nvc3Q+Ci08T3ZlcnRpbWVDb3N0PjA8L092ZXJ0aW1lQ29zdD4KLTxPdmVydGltZVdvcms+UFQwSDBNMFM8L092ZXJ0aW1lV29yaz4KLTxBY3R1YWxEdXJhdGlvbj5QVDBIME0wUzwvQWN0dWFsRHVyYXRpb24+Ci08QWN0dWFsQ29zdD4wPC9BY3R1YWxDb3N0PgotPEFjdHVhbE92ZXJ0aW1lQ29zdD4wPC9BY3R1YWxPdmVydGltZUNvc3Q+Ci08QWN0dWFsV29yaz5QVDBIME0wUzwvQWN0dWFsV29yaz4KLTxBY3R1YWxPdmVydGltZVdvcms+UFQwSDBNMFM8L0FjdHVhbE92ZXJ0aW1lV29yaz4KLTxSZWd1bGFyV29yaz5QVDBIME0wUzwvUmVndWxhcldvcms+Ci08UmVtYWluaW5nRHVyYXRpb24+UFQwSDBNMFM8L1JlbWFpbmluZ0R1cmF0aW9uPgotPFJlbWFpbmluZ0Nvc3Q+MDwvUmVtYWluaW5nQ29zdD4KLTxSZW1haW5pbmdXb3JrPlBUMEgwTTBTPC9SZW1haW5pbmdXb3JrPgotPFJlbWFpbmluZ092ZXJ0aW1lQ29zdD4wPC9SZW1haW5pbmdPdmVydGltZUNvc3Q+Ci08UmVtYWluaW5nT3ZlcnRpbWVXb3JrPlBUMEgwTTBTPC9SZW1haW5pbmdPdmVydGltZVdvcms+Ci08QUNXUD4wPC9BQ1dQPgotPENWPjA8L0NWPgotPENvbnN0cmFpbnRUeXBlPjA8L0NvbnN0cmFpbnRUeXBlPgotPENhbGVuZGFyVUlEPi0xPC9DYWxlbmRhclVJRD4KLTxMZXZlbEFzc2lnbm1lbnRzPjE8L0xldmVsQXNzaWdubWVudHM+Ci08TGV2ZWxpbmdDYW5TcGxpdD4xPC9MZXZlbGluZ0NhblNwbGl0PgotPExldmVsaW5nRGVsYXk+MDwvTGV2ZWxpbmdEZWxheT4KLTxMZXZlbGluZ0RlbGF5Rm9ybWF0Pjg8L0xldmVsaW5nRGVsYXlGb3JtYXQ+Ci08SWdub3JlUmVzb3VyY2VDYWxlbmRhcj4wPC9JZ25vcmVSZXNvdXJjZUNhbGVuZGFyPgotPEhpZGVCYXI+MDwvSGlkZUJhcj4KLTxSb2xsdXA+MDwvUm9sbHVwPgotPEJDV1M+MDwvQkNXUz4KLTxCQ1dQPjA8L0JDV1A+Ci08UGh5c2ljYWxQZXJjZW50Q29tcGxldGU+MDwvUGh5c2ljYWxQZXJjZW50Q29tcGxldGU+Ci08RWFybmVkVmFsdWVNZXRob2Q+MDwvRWFybmVkVmFsdWVNZXRob2Q+Ci08QWN0dWFsV29ya1Byb3RlY3RlZD5QVDBIME0wUzwvQWN0dWFsV29ya1Byb3RlY3RlZD4KLTxBY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQ+UFQwSDBNMFM8L0FjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZD4KLTwvVGFzaz4KLTwvVGFza3M+Ci08UmVzb3VyY2VzPgotPFJlc291cmNlPgotPFVJRD4wPC9VSUQ+Ci08SUQ+MDwvSUQ+Ci08VHlwZT4xPC9UeXBlPgotPElzTnVsbD4wPC9Jc051bGw+Ci08V29ya0dyb3VwPjA8L1dvcmtHcm91cD4KLTxNYXhVbml0cz4xPC9NYXhVbml0cz4KLTxQZWFrVW5pdHM+MDwvUGVha1VuaXRzPgotPE92ZXJBbGxvY2F0ZWQ+MDwvT3ZlckFsbG9jYXRlZD4KLTxDYW5MZXZlbD4xPC9DYW5MZXZlbD4KLTxBY2NydWVBdD4zPC9BY2NydWVBdD4KLTxXb3JrPlBUMEgwTTBTPC9Xb3JrPgotPFJlZ3VsYXJXb3JrPlBUMEgwTTBTPC9SZWd1bGFyV29yaz4KLTxPdmVydGltZVdvcms+UFQwSDBNMFM8L092ZXJ0aW1lV29yaz4KLTxBY3R1YWxXb3JrPlBUMEgwTTBTPC9BY3R1YWxXb3JrPgotPFJlbWFpbmluZ1dvcms+UFQwSDBNMFM8L1JlbWFpbmluZ1dvcms+Ci08QWN0dWFsT3ZlcnRpbWVXb3JrPlBUMEgwTTBTPC9BY3R1YWxPdmVydGltZVdvcms+Ci08UmVtYWluaW5nT3ZlcnRpbWVXb3JrPlBUMEgwTTBTPC9SZW1haW5pbmdPdmVydGltZVdvcms+Ci08UGVyY2VudFdvcmtDb21wbGV0ZT4wPC9QZXJjZW50V29ya0NvbXBsZXRlPgotPFN0YW5kYXJkUmF0ZT4wPC9TdGFuZGFyZFJhdGU+Ci08U3RhbmRhcmRSYXRlRm9ybWF0PjI8L1N0YW5kYXJkUmF0ZUZvcm1hdD4KLTxDb3N0PjA8L0Nvc3Q+Ci08T3ZlcnRpbWVSYXRlPjA8L092ZXJ0aW1lUmF0ZT4KLTxPdmVydGltZVJhdGVGb3JtYXQ+MjwvT3ZlcnRpbWVSYXRlRm9ybWF0PgotPE92ZXJ0aW1lQ29zdD4wPC9PdmVydGltZUNvc3Q+Ci08Q29zdFBlclVzZT4wPC9Db3N0UGVyVXNlPgotPEFjdHVhbENvc3Q+MDwvQWN0dWFsQ29zdD4KLTxBY3R1YWxPdmVydGltZUNvc3Q+MDwvQWN0dWFsT3ZlcnRpbWVDb3N0PgotPFJlbWFpbmluZ0Nvc3Q+MDwvUmVtYWluaW5nQ29zdD4KLTxSZW1haW5pbmdPdmVydGltZUNvc3Q+MDwvUmVtYWluaW5nT3ZlcnRpbWVDb3N0PgotPFdvcmtWYXJpYW5jZT4wPC9Xb3JrVmFyaWFuY2U+Ci08Q29zdFZhcmlhbmNlPjA8L0Nvc3RWYXJpYW5jZT4KLTxTVj4wPC9TVj4KLTxDVj4wPC9DVj4KLTxBQ1dQPjA8L0FDV1A+Ci08Q2FsZW5kYXJVSUQ+MjwvQ2FsZW5kYXJVSUQ+Ci08QkNXUz4wPC9CQ1dTPgotPEJDV1A+MDwvQkNXUD4KLTxJc0dlbmVyaWM+MDwvSXNHZW5lcmljPgotPElzSW5hY3RpdmU+MDwvSXNJbmFjdGl2ZT4KLTxJc0VudGVycHJpc2U+MDwvSXNFbnRlcnByaXNlPgotPEJvb2tpbmdUeXBlPjA8L0Jvb2tpbmdUeXBlPgotPEFjdHVhbFdvcmtQcm90ZWN0ZWQ+UFQwSDBNMFM8L0FjdHVhbFdvcmtQcm90ZWN0ZWQ+Ci08QWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkPlBUMEgwTTBTPC9BY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQ+Ci08Q3JlYXRpb25EYXRlPjIwMDYtMDItMTBUMTQ6MzY6MDA8L0NyZWF0aW9uRGF0ZT4KLTwvUmVzb3VyY2U+Ci08L1Jlc291cmNlcz4KLTxBc3NpZ25tZW50cy8+Ci08L1Byb2plY3Q+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC8uY2xhc3NwYXRoIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzUxYzhmMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwvLm9wdGlvbnMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC8ub3B0aW9ucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDczMWJkNy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC8ub3B0aW9ucworKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotIyBUdXJuIG9uIGRlYnVnIHRyYWNlIGZvciB0aGUgeG1sIGV4cG9ydCBwbHVnLWluCi1vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC9kZWJ1Zz10cnVlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC8ucHJvamVjdCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MTc5ZTA2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWw8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzI5YWM3OC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbDtzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjUuMC5xdWFsaWZpZXIKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sLkV4cG9ydFhNTFBsdWdpbgotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLAotIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWk7dmlzaWJpbGl0eTo9cmVleHBvcnQsCi0gb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZTt2aXNpYmlsaXR5Oj1yZWV4cG9ydCwKLSBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0O3Zpc2liaWxpdHk6PXJlZXhwb3J0LAotIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hO3Zpc2liaWxpdHk6PXJlZXhwb3J0LAotIG9yZy5lY2xpcHNlLnVpLAotIG9yZy5lY2xpcHNlLmVwZi5jb21tb24udWkKLUVjbGlwc2UtTGF6eVN0YXJ0OiB0cnVlCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwsCi0gb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwucHJlZmVyZW5jZXMsCi0gb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwuc2VydmljZXMsCi0gb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwud2l6YXJkcwotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC9idWlsZC5wcm9wZXJ0aWVzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjhiY2MyZi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1zb3VyY2UuLiA9IHNyYy8KLW91dHB1dC4uID0gYmluLwotYmluLmluY2x1ZGVzID0gLixcCi0gICAgICAgICAgICAgICAub3B0aW9ucyxcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBpY29ucy8KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sL2ljb25zL2Z1bGwvb2JqMTYvWE1MRmlsZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC9pY29ucy9mdWxsL29iajE2L1hNTEZpbGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4M2I0NGJiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sL2ljb25zL2Z1bGwvb2JqMTYvWE1MRmlsZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC9pY29ucy9mdWxsL3dpemJhbi9FeHBvcnRYTUwuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwvaWNvbnMvZnVsbC93aXpiYW4vRXhwb3J0WE1MLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTI0OTgzMS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC9pY29ucy9mdWxsL3dpemJhbi9FeHBvcnRYTUwuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwvcGx1Z2luLnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2UzMDRhYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLQotIyBQbHVnLWluCi1wbHVnaW5OYW1lPUVQRiBFeHBvcnQgWE1MIFBsdWctaW4KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotCi0jIEV4cG9ydCBYTUwgV2l6YXJkCi1leHBvcnRYTUxXaXphcmROYW1lPVhNTAotZXhwb3J0WE1MV2l6YXJkRGVzY3JpcHRpb249RXhwb3J0IG1ldGhvZCBsaWJyYXJ5IGNvbnRlbnQgdG8gYSBYTUwgZmlsZS4KLQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwvcGx1Z2luLnhtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiNDY0NjQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08cGx1Z2luPgotCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkuZXhwb3J0V2l6YXJkcyI+Ci0gICAgICA8d2l6YXJkCi0gICAgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2UuZXBmLnVpLmV4cG9ydFdpemFyZHMuY2F0ZWdvcnkiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwud2l6YXJkcy5FeHBvcnRYTUxXaXphcmQiCi0gICAgICAgICAgICBpY29uPSJpY29ucy9mdWxsL29iajE2L1hNTEZpbGUuZ2lmIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sLndpemFyZHMuRXhwb3J0WE1MV2l6YXJkIgotICAgICAgICAgICAgbmFtZT0iJWV4cG9ydFhNTFdpemFyZE5hbWUiPgotICAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgJWV4cG9ydFhNTFdpemFyZERlc2NyaXB0aW9uCi0gICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgPC93aXphcmQ+Ci0gICA8L2V4dGVuc2lvbj4KLQotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmVwZi51aS5leHBvcnRXaXphcmRzIj4KLSAgICAgIDx3aXphcmQgaWQ9Im9yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sLndpemFyZHMuRXhwb3J0WE1MV2l6YXJkIi8+Ci0gICA8L2V4dGVuc2lvbj4KLQotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC94bWwvRXhwb3J0WE1MUGx1Z2luLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC94bWwvRXhwb3J0WE1MUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjOGMxZjguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQveG1sL0V4cG9ydFhNTFBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpLkFic3RyYWN0UGx1Z2luOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotCi0vKioKLSAqIFRoZSBFeHBvcnQgWE1MIHBsdWctaW4gY2xhc3MuCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEV4cG9ydFhNTFBsdWdpbiBleHRlbmRzIEFic3RyYWN0UGx1Z2luIHsKLQotCS8vIFRoZSBzaGFyZWQgcGx1Zy1pbiBpbnN0YW5jZS4KLQlwcml2YXRlIHN0YXRpYyBFeHBvcnRYTUxQbHVnaW4gcGx1Z2luOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgRXhwb3J0WE1MUGx1Z2luKCkgewotCQlwbHVnaW4gPSB0aGlzOwotCX0KLQotCS8qKgotCSAqIEBzZWUgQWJzdHJhY3RQbHVnaW4jc3RhcnQoQnVuZGxlQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdGFydChjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIEFic3RyYWN0UGx1Z2luI3N0b3AoQnVuZGxlQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0b3AoY29udGV4dCk7Ci0JCXBsdWdpbiA9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2hhcmVkIHBsdWctaW4gaW5zdGFuY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBFeHBvcnRYTUxQbHVnaW4gZ2V0RGVmYXVsdCgpIHsKLQkJcmV0dXJuIHBsdWdpbjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3htbC9FeHBvcnRYTUxSZXNvdXJjZXMuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3htbC9FeHBvcnRYTUxSZXNvdXJjZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWJlMTQzOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC94bWwvRXhwb3J0WE1MUmVzb3VyY2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLS8qKgotICogVGhlIEV4cG9ydCBYTUwgbWVzc2FnZSByZXNvdXJjZSBidW5kbGUgYWNjZXNzb3IgY2xhc3MuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgRXhwb3J0WE1MUmVzb3VyY2VzIGV4dGVuZHMgTkxTIHsKLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBCVU5ETEVfTkFNRSA9IEV4cG9ydFhNTFJlc291cmNlcy5jbGFzcy5nZXRQYWNrYWdlKCkKLQkJCS5nZXROYW1lKCkKLQkJCSsgIi5SZXNvdXJjZXMiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIEV4cG9ydFhNTFJlc291cmNlcygpIHsKLQkJLy8gRG8gbm90IGluc3RhbnRpYXRlCi0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXhwb3J0WE1MV2l6YXJkX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXhwb3J0TGlicmFyeVJhZGlvQnV0dG9uX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBleHBvcnRQbHVnaW5zUmFkaW9CdXR0b25fdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGV4cG9ydENvbmZpZ3NSYWRpb0J1dHRvbl90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VsZWN0WE1MRmlsZVBhZ2VfdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzZWxlY3RYTUxGaWxlUGFnZV9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZmlsZUxhYmVsX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBicm93c2VCdXR0b25fdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG92ZXJ3cml0ZVRleHRfbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXhwb3J0aW5nWE1MX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBpbnZhbGlkWE1MRmlsZV9lcnJvcjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGV4cG9ydFhNTFdpemFyZF9lcnJvcjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGV4cG9ydFhNTFdpemFyZF9yZXZpZXdMb2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzZWxlY3RFeHBvcnRUeXBlUGFnZV9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXhwb3J0WE1MU2VydmljZV9lcnJvcjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGV4cG9ydFhNTFNlcnZpY2VfZmVhdHVyZV9lcnJvcjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHhtbExpYnJhcnlfZXJyb3JfbG9hZF94bWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB4bWxMaWJyYXJ5X25vX3BsdWdpbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHhtbExpYnJhcnlfbm9fZmVhdHVyZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHhtbExpYnJhcnlfbm9fY2xhc3M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB4bWxMaWJyYXJ5X2Vycm9yX2NyZWF0ZV9lbGVtZW50OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgeG1sTGlicmFyeV9lcnJvcl9zZXRfdmFsdWU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB4bWxMaWJyYXJ5X2ludmFsaWRfZmVhdHVyZV92YWx1ZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHhtbExpYnJhcnlfZXJyb3Jfc2V0X3ZhbHVlXzI7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB4bWxMaWJyYXJ5X2Vycm9yX3NldF92YWx1ZV8zOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgeG1sTGlicmFyeV9lcnJvcl9zZXRfcmVmZXJlbmNlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgeG1sTGlicmFyeV9lcnJvcl9wcm9jZXNzX3dyb25nX2NvbnRhaW5lcjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHhtbExpYnJhcnlfbmV3X2lkOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgeG1sTGlicmFyeV9pZF9ub3RfdW5pcXVlOwotCi0Jc3RhdGljIHsKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgRXhwb3J0WE1MUmVzb3VyY2VzLmNsYXNzKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQveG1sL1Jlc291cmNlcy5wcm9wZXJ0aWVzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQveG1sL1Jlc291cmNlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyODI3ZTdjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3htbC9SZXNvdXJjZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSCi0jCi0jIE1lc3NhZ2UgSUQgUmFuZ2U6Ci0jCi0KLSMgRXhwb3J0IFhNTCBXaXphcmQKLWV4cG9ydFhNTFdpemFyZF90aXRsZT1FeHBvcnQgWE1MCi0KLSMgU2VsZWN0IEV4cG9ydCBUeXBlIFdpemFyZCBQYWdlCi1zZWxlY3RFeHBvcnRUeXBlUGFnZV9kZXNjPVNlbGVjdCB0aGUgdHlwZSBvZiBtZXRob2QgbGlicmFyeSBjb250ZW50IHRvIGV4cG9ydC4KLWV4cG9ydExpYnJhcnlSYWRpb0J1dHRvbl90ZXh0PUV4cG9ydCB0aGUgZW50aXJlIG1ldGhvZCBsaWJyYXJ5Ci1leHBvcnRQbHVnaW5zUmFkaW9CdXR0b25fdGV4dD1FeHBvcnQgb25lIG9yIG1vcmUgbWV0aG9kIHBsdWctaW5zCi1leHBvcnRDb25maWdzUmFkaW9CdXR0b25fdGV4dD1FeHBvcnQgYSBtZXRob2QgY29uZmlndXJhdGlvbgotCi0jIFNlbGVjdCBEZXN0aW5hdGlvbiBYTUwgRmlsZSBXaXphcmQgUGFnZQotc2VsZWN0WE1MRmlsZVBhZ2VfdGl0bGU9U3BlY2lmeSBleHBvcnQgZmlsZQotc2VsZWN0WE1MRmlsZVBhZ2VfZGVzYz1TcGVjaWZ5IGEgZGVzdGluYXRpb24gWE1MIGZpbGUgdG8gc3RvcmUgdGhlIGV4cG9ydGVkIG1ldGhvZCBsaWJyYXJ5IGNvbnRlbnQuCi1maWxlTGFiZWxfdGV4dD1YTUwgRmlsZToKLWJyb3dzZUJ1dHRvbl90ZXh0PUJyb3dzZS4uLgotCi0jIE92ZXJ3cml0ZSBDb25maXJtYXRpb24gRGlhbG9nCi1vdmVyd3JpdGVUZXh0X21zZz0nJ3swfScnIGFscmVhZHkgZXhpc3RzLlxuRG8geW91IHdhbnQgdG8gb3ZlcndyaXRlIGl0PwotCi0jIFByb2dyZXNzIE1lc3NhZ2VzCi1leHBvcnRpbmdYTUxfdGV4dD1FeHBvcnQgbWV0aG9kIGxpYnJhcnkgY29udGVudCB0byBYTUwgZmlsZS4uLgotCi0jIEVycm9yIE1lc3NhZ2VzCi1pbnZhbGlkWE1MRmlsZV9lcnJvcj1UaGUgc3BlY2lmaWVkIFhNTCBmaWxlIGlzIG5vdCB2YWxpZC4KLWV4cG9ydFhNTFdpemFyZF9lcnJvcj1JVVBNMDAwMEU6IFRoZSBFeHBvcnQgZmFpbGVkOiB7MH0KLWV4cG9ydFhNTFdpemFyZF9yZXZpZXdMb2c9RXhwb3J0IGNvbXBsZXRlZC4gUGxlYXNlIHJldmlldyB0aGUgbG9nIGZpbGVzIHVuZGVyIHRoZSBleHBvcnQgZGlyZWN0b3J5LgotZXhwb3J0WE1MU2VydmljZV9lcnJvcj1FcnJvciBleHBvcnRpbmcgbGlicmFyeTogezB9Ci1leHBvcnRYTUxTZXJ2aWNlX2ZlYXR1cmVfZXJyb3I9RXJyb3Igc2V0dGluZyBmZWF0dXJlIHZhbHVlOjogRWxlbWVudD17MH0sIGZlYXR1cmU9ezF9Ci14bWxMaWJyYXJ5X2Vycm9yX2xvYWRfeG1sPVVuYWJsZSB0byBsb2FkIFhNTCBzb3VyY2UgJyd7MH0nJwoteG1sTGlicmFyeV9ub19wbHVnaW49Tm8gbWV0aG9kIHBsdWctaW4gZm9yIGlkIHswfQoteG1sTGlicmFyeV9ub19mZWF0dXJlPVVuYWJsZSB0byBnZXQgWE1MIGZlYXR1cmUgZm9yIHswfV97MX0KLXhtbExpYnJhcnlfbm9fY2xhc3M9VW5hYmxlIHRvIGdldCBFQ2xhc3MgZm9yIHswfQoteG1sTGlicmFyeV9lcnJvcl9jcmVhdGVfZWxlbWVudD1FcnJvciBjcmVhdGluZyBlbGVtZW50LCBkbyBub3Qga25vdyBob3cgdG8gc2V0IHZhbHVlIGZvciBmZWF0dXJlIHswfQoteG1sTGlicmFyeV9lcnJvcl9zZXRfdmFsdWU9RXJyb3IgY3JlYXRpbmcgZWxlbWVudCwgY2Fubm90IHNldCB2YWx1ZSB7MH0gdG8gY29udGFpbmVyIHsxfQoteG1sTGlicmFyeV9pbnZhbGlkX2ZlYXR1cmVfdmFsdWU9SW52YWxpZCBhdHRyaWJ1dGUgZmVhdHVyZSB2YWx1ZSBmb3IgZmVhdHVyZSB7MH0sIHdpdGggdmFsdWUgezF9Ci14bWxMaWJyYXJ5X2Vycm9yX3NldF92YWx1ZV8yPUVycm9yIHNldHRpbmcgYXR0cmlidXRlLCBVbmFibGUgdG8gc2V0IHZhbHVlIGZvciBmZWF0dXJlPXswfSwgb2JqZWN0PXsxfSwgdmFsdWU9ezJ9Ci14bWxMaWJyYXJ5X2Vycm9yX3NldF92YWx1ZV8zPURvbicndCBrbm93IGhvdyB0byBzZXQgdmFsdWUgZm9yIGZlYXR1cmU9ezB9LCBvYmplY3Q9ezF9LCB2YWx1ZT17Mn0KLXhtbExpYnJhcnlfZXJyb3Jfc2V0X3JlZmVyZW5jZT1FcnJvciBzZXR0aW5nIHJlZmVyZW5jZSwgVW5hYmxlIHRvIHNldCB2YWx1ZSBmb3IgZmVhdHVyZT17MH0sIG9iamVjdD17MX0sIHZhbHVlPXsyfQoteG1sTGlicmFyeV9lcnJvcl9wcm9jZXNzX3dyb25nX2NvbnRhaW5lcj1Qcm9jZXNzICcnezB9JycgZG9lcyBub3QgaGF2ZSBhIHZhbGlkIGNvbnRhaW5lci4gVGhlIGNvbnRhaW5lciBpcyBvZiB0eXBlICcnezF9JycsIHdoaWNoIGlzIG5vdCBhIHByb2Nlc3MgcGFja2FnZS4KLXhtbExpYnJhcnlfbmV3X2lkPUVsZW1lbnQgezB9IGlzIGFzc2lnbmVkIHdpdGggYSBuZXcgaWQgezF9IGJlY2F1c2UgaXQgZG9lcyBub3QgaGF2ZSBhIHZhbGlkIG9uZQoteG1sTGlicmFyeV9pZF9ub3RfdW5pcXVlPUVsZW1lbnQgSWQgJyd7MH0nJyBpcyB1c2VkIGJ5IG1vcmUgdGhhbiBvbmUgZWxlbWVudAotCi0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3htbC9wYWNrYWdlLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC94bWwvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMzA5OTg5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3htbC9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyB0aGUgYWN0aXZhdG9yIGZvciBtYW5hZ2luZyB0aGUgRXhwb3J0IFhNTCBwbHVnLWluJ3MgbGlmZSBjeWNsZS4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC94bWwvcHJlZmVyZW5jZXMvRXhwb3J0WE1MUHJlZmVyZW5jZXMuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3htbC9wcmVmZXJlbmNlcy9FeHBvcnRYTUxQcmVmZXJlbmNlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMDVmYmM0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3htbC9wcmVmZXJlbmNlcy9FeHBvcnRYTUxQcmVmZXJlbmNlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24uICBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwucHJlZmVyZW5jZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC5FeHBvcnRYTUxQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwuc2VydmljZXMuRXhwb3J0WE1MRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci0KLS8qKgotICogVGhlIEV4cG9ydCBYTUwgcHJlZmVyZW5jZXMuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRXhwb3J0WE1MUHJlZmVyZW5jZXMgewotCi0JLyoqCi0JICogVGhlIGV4cG9ydCB0eXBlIHByZWZlcmVuY2Uga2V5LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYUE9SVF9UWVBFID0gImV4cG9ydFR5cGUiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgZXhwb3J0ZWQgWE1MIGZpbGUgcHJlZmVyZW5jZSBrZXkuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX0ZJTEUgPSAieG1sRmlsZSI7IC8vJE5PTi1OTFMtMSQKLQotCXN0YXRpYyB7Ci0JCS8vIEluaXRpYWxpemUgdGhlIGRlZmF1bHQgcHJlZmVyZW5jZSB2YWx1ZXMuCi0JCUlQcmVmZXJlbmNlU3RvcmUgc3RvcmUgPSBFeHBvcnRYTUxQbHVnaW4uZ2V0RGVmYXVsdCgpCi0JCQkJLmdldFByZWZlcmVuY2VTdG9yZSgpOwotCQlzdG9yZS5zZXREZWZhdWx0KEVYUE9SVF9UWVBFLCBFeHBvcnRYTUxEYXRhLkVYUE9SVF9NRVRIT0RfTElCUkFSWSk7IAotCQlzdG9yZS5zZXREZWZhdWx0KFhNTF9GSUxFLCAiIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBleHBvcnQgdHlwZSBwcmVmZXJlbmNlLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGV4cG9ydCB0eXBlIHByZWZlcmVuY2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBnZXRFeHBvcnRUeXBlKCkgewotCQlyZXR1cm4gRXhwb3J0WE1MUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKS5nZXRJbnQoCi0JCQkJRVhQT1JUX1RZUEUpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGV4cG9ydGVkIHR5cGUgcHJlZmVyZW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gZXhwb3J0VHlwZQotCSAqICAgICAgICAgICAgdGhlIHVzZXIgc3BlY2lmaWVkIGV4cG9ydCB0eXBlCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldEV4cG9ydFR5cGUoaW50IGV4cG9ydFR5cGUpIHsKLQkJRXhwb3J0WE1MUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKS5zZXRWYWx1ZShFWFBPUlRfVFlQRSwKLQkJCQlleHBvcnRUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBleHBvcnRlZCBYTUwgZmlsZSBwcmVmZXJlbmNlLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGV4cG9ydGVkIFhNTCBmaWxlIHByZWZlcmVuY2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRYTUxGaWxlKCkgewotCQlyZXR1cm4gRXhwb3J0WE1MUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKS5nZXRTdHJpbmcoCi0JCQkJWE1MX0ZJTEUpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGV4cG9ydGVkIFhNTCBmaWxlIHByZWZlcmVuY2UuCi0JICogCi0JICogQHBhcmFtIHBhdGgKLQkgKiAgICAgICAgICAgIHRoZSBhYnNvbHV0ZSBwYXRoIHRvIGEgWE1MIGZpbGUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0WE1MRmlsZShTdHJpbmcgcGF0aCkgewotCQlFeHBvcnRYTUxQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpLnNldFZhbHVlKFhNTF9GSUxFLAotCQkJCXBhdGgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQveG1sL3ByZWZlcmVuY2VzL3BhY2thZ2UuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3htbC9wcmVmZXJlbmNlcy9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyYzIwYzUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQveG1sL3ByZWZlcmVuY2VzL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIHByZWZlcmVuY2Ugc3VwcG9ydCBmb3IgdGhlIEV4cG9ydCBYTUwgc2VydmljZS4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC94bWwvc2VydmljZXMvRXhwb3J0UmVzb3VyY2VIYW5kbGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC94bWwvc2VydmljZXMvRXhwb3J0UmVzb3VyY2VIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiNDBmNDIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQveG1sL3NlcnZpY2VzL0V4cG9ydFJlc291cmNlSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sLnNlcnZpY2VzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLkZpbGVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuTmV0VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlLnV0aWwuQmFzZVJlc291cmNlSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlLnV0aWwuVXJsSW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5JTGlicmFyeU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuSUxpYnJhcnlSZXNvdXJjZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5SZXNvdXJjZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci0KLS8qKgotICogVGhlIHJlc291cmNlIGhhbmRsZXIgZm9yIGNvbnRlbnQgaW4gdGhlIGV4cG9ydGVkIGxpYnJhcnkuCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBFeHBvcnRSZXNvdXJjZUhhbmRsZXIgZXh0ZW5kcyBCYXNlUmVzb3VyY2VIYW5kbGVyIHsKLQkKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBFeHBvcnRSZXNvdXJjZUhhbmRsZXIoRmlsZSBzb3VyY2VMaWJSb290LCBGaWxlIHRhcmdldExpYlJvb3QpIHsKLQkJc3VwZXIoc291cmNlTGliUm9vdCwgdGFyZ2V0TGliUm9vdCk7Ci0JfQotCi0JLyoqCi0JICogcmVzb2x2ZSB0aGUgdXJsLiBGb3IgWE1MIGV4cG9ydCwgd2Ugc2hvdWxkIHJlc2VydmUgdGhlIHJlc291cmNlIGxvY2F0aW9ucy4KLQkgKi8KLQlwdWJsaWMgVXJsSW5mbyByZXNvbHZlRmlsZVVybChPYmplY3Qgb3duZXIsIFN0cmluZyBzcmNVcmwpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gbG9hZFVybEluZm9XaXRoRml4ZWRQYXRoKG93bmVyLCBzcmNVcmwpOwotCX0KLQotCQotCS8qKgotCSAqIHRoZSByZXNvdXJjZSBwYXRoIHdpbGwgYmUgcmVsYXRpdmUgdG8gdGhlIGxpYmFyeSByb290LiB1cmxzIG5lZWRzIHRvIGJlCi0JICogZml4ZWQKLQkgKiAKLQkgKiBAcGFyYW0gb3duZXIKLQkgKiAgICAgICAgICAgIHRoZSBvd25lciBvYmplY3QgaW4gdGhlIHRhcmdldCBsaWJyYXJ5Ci0JICogQHBhcmFtIHNyY1VybAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIFVybEluZm8gbG9hZFVybEluZm9XaXRoRml4ZWRQYXRoKE9iamVjdCBvd25lciwgU3RyaW5nIHNyY1VybCkgewotCQlVcmxJbmZvIGluZm8gPSBuZXcgVXJsSW5mbygpOwotCQlpbmZvLnNvdXJjZVVybCA9IHNyY1VybDsKLQkJaW5mby50YXJnZXRVcmwgPSBzcmNVcmw7Ci0JCVN0cmluZyBzcmNGaWxlID0gZ2V0RmlsZVJlbFBhdGgob3duZXIsIHNyY1VybCk7Ci0JCW9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZEVsZW1lbnQgb3duZXJFbGVtID0gbnVsbDsKLQkJaWYgKG93bmVyIGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kRWxlbWVudCkgewotCQkJb3duZXJFbGVtID0gKG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZEVsZW1lbnQpIG93bmVyOwotCQl9Ci0JCWlmIChzcmNGaWxlICE9IG51bGwgJiYgb3duZXJFbGVtICE9IG51bGwpIHsJCQkKLQkJCU1ldGhvZFBsdWdpbiBzcmNQbHVnaW4gPSBnZXRTb3VyY2VQbHVnaW4ob3duZXJFbGVtKTsKLQkJCUlMaWJyYXJ5UmVzb3VyY2VNYW5hZ2VyIGxpYlJlc01nciA9IFJlc291cmNlSGVscGVyLmdldFJlc291cmNlTWdyKHNyY1BsdWdpbik7Ci0JCQlTdHJpbmcgc3JjUGx1Z2luUGF0aCA9IGxpYlJlc01nci5nZXRQaHlzaWNhbFBsdWdpblBhdGgoc3JjUGx1Z2luKTsKLQkJCUZpbGUgc3JjUm9vdCA9IChuZXcgRmlsZShzcmNQbHVnaW5QYXRoKSkuZ2V0UGFyZW50RmlsZSgpOwotCQkJCi0JCQlpbmZvLnNvdXJjZUZpbGUgPSBuZXcgRmlsZShzcmNSb290LCBzcmNGaWxlKTsKLQkJCWlmICghaW5mby5zb3VyY2VGaWxlLmlzRmlsZSgpIHx8ICFpbmZvLnNvdXJjZUZpbGUuZXhpc3RzKCkpIHsKLQkJCQlTdHJpbmcgbmV3U3JjRmlsZSA9IG51bGw7Ci0JCQkJdHJ5IHsKLQkJCQkJbmV3U3JjRmlsZSA9IE5ldFV0aWwuZGVjb2RlVVJMKHNyY0ZpbGUpOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJfQotCQkJCWlmIChuZXdTcmNGaWxlICE9IG51bGwpIHsKLQkJCQkJc3JjRmlsZSA9IG5ld1NyY0ZpbGU7Ci0JCQkJCWluZm8uc291cmNlRmlsZSA9IG5ldyBGaWxlKHNyY1Jvb3QsIHNyY0ZpbGUpOwotCQkJCX0KLQkJCX0KLQkJCWluZm8udGFyZ2V0RmlsZSA9IG5ldyBGaWxlKHRhcmdldExpYlJvb3QsIHNyY0ZpbGUpOwotCQkJaW5mby50YXJnZXRVcmwgPSBzcmNGaWxlLnJlcGxhY2UoRmlsZS5zZXBhcmF0b3JDaGFyLCAnLycpOwotCQl9Ci0KLQkJcmV0dXJuIGluZm87Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBNZXRob2RQbHVnaW4gZ2V0U291cmNlUGx1Z2luKG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZEVsZW1lbnQgb3duZXJFbGVtKSB7Ci0JCUlMaWJyYXJ5TWFuYWdlciBtYW5hZ2VyID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKQotCQkuZ2V0Q3VycmVudExpYnJhcnlNYW5hZ2VyKCk7Ci0JCWlmIChtYW5hZ2VyID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCQl9Ci0JCU1ldGhvZEVsZW1lbnQgZWxlbWVudCA9IG1hbmFnZXIuZ2V0TWV0aG9kRWxlbWVudChvd25lckVsZW0uZ2V0SWQoKSk7Ci0JCWlmIChlbGVtZW50ID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCQl9Ci0JCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSBVbWFVdGlsLmdldE1ldGhvZFBsdWdpbihlbGVtZW50KTsKLQkJaWYgKHBsdWdpbiA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQkJfQotCQlyZXR1cm4gcGx1Z2luOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldEZpbGVSZWxQYXRoKE9iamVjdCBvd25lciwgU3RyaW5nIHNyY1VybCkgewotCQl0cnkgewotCQkJaWYgKG93bmVyIGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kRWxlbWVudCkgewotCQkJCVN0cmluZyBpZCA9ICgob3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kRWxlbWVudCkgb3duZXIpCi0JCQkJCQkuZ2V0SWQoKTsKLQkJCQlJTGlicmFyeU1hbmFnZXIgbWFuYWdlciA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLQkJCQkJCS5nZXRDdXJyZW50TGlicmFyeU1hbmFnZXIoKTsKLQkJCQlpZiAobWFuYWdlciAhPSBudWxsKSB7Ci0JCQkJCU1ldGhvZEVsZW1lbnQgZWxlbWVudCA9IG1hbmFnZXIuZ2V0TWV0aG9kRWxlbWVudChpZCk7Ci0JCQkJCWlmIChlbGVtZW50ICE9IG51bGwpIHsKLQkJCQkJCUZpbGUgZiA9IG5ldyBGaWxlKG5ldyBGaWxlKHNvdXJjZUxpYlJvb3QsCi0JCQkJCQkJCVJlc291cmNlSGVscGVyLmdldEVsZW1lbnRQYXRoKGVsZW1lbnQpKSwgc3JjVXJsKTsKLQkJCQkJCVN0cmluZyBwYXRoID0gZi5nZXRDYW5vbmljYWxQYXRoKCk7Ci0JCQkJCQlyZXR1cm4gcGF0aC5zdWJzdHJpbmcoc291cmNlTGliUm9vdC5nZXRDYW5vbmljYWxQYXRoKCkKLQkJCQkJCQkJLmxlbmd0aCgpICsgMSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCS8vIExvZyBlcnJvciBoZXJlCi0JCX0KLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBjb3B5aW5nIHRoZSByZXNvdXJjZSBmaWxlIGZyb20gdGhlIHNvdXJjZSBsaWJyYXJ5IHRvIHRoZSB0YXJnZXQKLQkgKiAKLQkgKiBAcGFyYW0gc291cmNlRmlsZSB0aGUgZmlsZSBwYXRoIHJlbGF0aXZlIHRvIHRoZSBzb3VyY2Ugcm9vdAotCSAqLwotCXB1YmxpYyB2b2lkIGNvcHlSZXNvdXJjZShTdHJpbmcgc291cmNlRmlsZSwgRU9iamVjdCBvYmosIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luIHVtYVBsdWdpbikgewotCQlJTGlicmFyeVJlc291cmNlTWFuYWdlciBsaWJSZXNNZ3IgPSBSZXNvdXJjZUhlbHBlci5nZXRSZXNvdXJjZU1ncih1bWFQbHVnaW4pOwotCQlTdHJpbmcgc3JjUGx1Z2luUGF0aCA9IGxpYlJlc01nci5nZXRQaHlzaWNhbFBsdWdpblBhdGgodW1hUGx1Z2luKTsKLQkJRmlsZSBzcmNQbHVnaW5Sb290ID0gbmV3IEZpbGUoc3JjUGx1Z2luUGF0aCk7Ci0JCQotCQlGaWxlIHNyYyA9IG5ldyBGaWxlKHNyY1BsdWdpblJvb3QuZ2V0UGFyZW50RmlsZSgpLCBzb3VyY2VGaWxlKTsKLQkJaWYgKCBzcmMuZXhpc3RzKCkgKSB7Ci0JCQlGaWxlIHRndCA9IG5ldyBGaWxlKHRhcmdldExpYlJvb3QsIHNvdXJjZUZpbGUpOwotCQkJRmlsZVV0aWwuY29weUZpbGUoc3JjLCB0Z3QpOwotCQl9Ci0JfQotCQotLy8JLyoqCi0vLwkgKiB0aGUgcmVzb3VyY2UgcGF0aCB3aWxsIGJlIHJlbGF0aXZlIHRvIHRoZSBvd25lciBlbGVtZW50LiB1cmxzIHdpbGwgbm90IGJlCi0vLwkgKiBjaGFuZ2VkIGJ1dCByZXNvdXJjZSBmaWxlcyBpcyByZWxpY2F0ZWQuCi0vLwkgKiAKLS8vCSAqIEBwYXJhbSBvd25lcgotLy8JICogQHBhcmFtIHNyY1VybAotLy8JICogQHJldHVybgotLy8JICovCi0vLwlwcml2YXRlIFVybEluZm8gbG9hZFVybEluZm9XaXRoUmVsYXRpdmVQYXRoKE9iamVjdCBvd25lciwgU3RyaW5nIHNyY1VybCkgewotLy8JCVVybEluZm8gaW5mbyA9IG5ldyBVcmxJbmZvKCk7Ci0vLwotLy8JCXRyeSB7Ci0vLwkJCWluZm8uc291cmNlVXJsID0gc3JjVXJsOwotLy8JCQlpbmZvLnRhcmdldFVybCA9IHNyY1VybDsgLy8gbm8gdXJsIGNoYW5nZQotLy8KLS8vCQkJLy8gZ2V0IHRoZSBybWMgb2JqZWN0Ci0vLwkJCWlmIChvd25lciBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZEVsZW1lbnQpIHsKLS8vCQkJCVN0cmluZyBpZCA9ICgob3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kRWxlbWVudCkgb3duZXIpCi0vLwkJCQkJCS5nZXRJZCgpOwotLy8JCQkJSUxpYnJhcnlNYW5hZ2VyIG1hbmFnZXIgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0vLwkJCQkJCS5nZXRDdXJyZW50TGlicmFyeU1hbmFnZXIoKTsKLS8vCQkJCWlmIChtYW5hZ2VyICE9IG51bGwpIHsKLS8vCQkJCQlNZXRob2RFbGVtZW50IGVsZW1lbnQgPSBtYW5hZ2VyLmdldE1ldGhvZEVsZW1lbnQoaWQpOwotLy8JCQkJCWlmIChlbGVtZW50ICE9IG51bGwpIHsKLS8vCQkJCQkJRmlsZSBmID0gbmV3IEZpbGUobmV3IEZpbGUoc291cmNlTGliUm9vdCwKLS8vCQkJCQkJCQlSZXNvdXJjZUhlbHBlci5nZXRFbGVtZW50UGF0aChlbGVtZW50KSksIHNyY1VybCk7Ci0vLwkJCQkJCWYgPSBmLmdldENhbm9uaWNhbEZpbGUoKTsKLS8vCi0vLwkJCQkJCWluZm8uc291cmNlRmlsZSA9IGY7Ci0vLwkJCQkJfQotLy8JCQkJfQotLy8JCQl9Ci0vLwotLy8JCQlpbmZvLnRhcmdldEZpbGUgPSBuZXcgRmlsZSh0YXJnZXRMaWJSb290LCBzcmNVcmwpCi0vLwkJCQkJLmdldENhbm9uaWNhbEZpbGUoKTsKLS8vCi0vLwkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotLy8JCQkvLyBsb2cgZXJyb3IgVE9ETwotLy8JCX0KLS8vCQlyZXR1cm4gaW5mbzsKLS8vCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQveG1sL3NlcnZpY2VzL0V4cG9ydFhNTERhdGEuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3htbC9zZXJ2aWNlcy9FeHBvcnRYTUxEYXRhLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczYzY2YWIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQveG1sL3NlcnZpY2VzL0V4cG9ydFhNTERhdGEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC5zZXJ2aWNlczsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotCi0vKioKLSAqIFN0b3JlcyB0aGUgc2VsZWN0aW9ucyBhbmQgc2V0dGluZ3MgbWFkZSBieSB0aGUgdXNlciBpbiB0aGUgRXhwb3J0IFhNTCB3aXphcmQuCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEV4cG9ydFhNTERhdGEgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVhQT1JUX01FVEhPRF9MSUJSQVJZID0gMTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVYUE9SVF9NRVRIT0RfUExVR0lOUyA9IDI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFWFBPUlRfTUVUSE9EX0NPTkZJR1MgPSAzOwotCi0JcHJvdGVjdGVkIGludCBleHBvcnRUeXBlID0gRVhQT1JUX01FVEhPRF9MSUJSQVJZOwotCi0JcHJvdGVjdGVkIENvbGxlY3Rpb248TWV0aG9kUGx1Z2luPiBzZWxlY3RlZFBsdWdpbnM7Ci0JCi0JcHJvdGVjdGVkIEhhc2hTZXQgYXNzb2NpYXRlZENvbmZpZ3M7Ci0KLQlwcm90ZWN0ZWQgTGlzdCBzZWxlY3RlZENvbmZpZ3M7Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIHhtbEZpbGU7Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSB1c2VyIHNwZWNpZmllZCBleHBvcnQgdHlwZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSB0eXBlIG9mIGV4cG9ydCBvcGVyYXRpb24gdG8gcGVyZm9ybS4KLQkgKi8KLQlwdWJsaWMgaW50IGdldEV4cG9ydFR5cGUoKSB7Ci0JCXJldHVybiBleHBvcnRUeXBlOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHVzZXIgc3BlY2lmaWVkIGV4cG9ydCB0eXBlLgotCSAqIAotCSAqIEBwYXJhbSBleHBvclR5cGUKLQkgKiAgICAgICAgICAgIHRoZSB0eXBlIG9mIGV4cG9ydCBvcGVyYXRpb24gdG8gcGVyZm9ybQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEV4cG9ydFR5cGUoaW50IGV4cG9ydFR5cGUpIHsKLQkJdGhpcy5leHBvcnRUeXBlID0gZXhwb3J0VHlwZTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSB1c2VyIHNlbGVjdGVkIG1ldGhvZCBwbHVnLWlucy4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgbGlzdCBvZiBtZXRob2QgcGx1Zy1pbnMKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbjxNZXRob2RQbHVnaW4+IGdldFNlbGVjdGVkUGx1Z2lucygpIHsKLQkJcmV0dXJuIHNlbGVjdGVkUGx1Z2luczsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBhc3NvY2lhdGVkIGNvbmZpZ3Mgd2l0aCByZXNwZWN0ZWQgdG8gc2VsZWN0ZWQgcGx1Zy1pbnMKLQkgKiAKLQkgKiBAcGFyYW0gYXNzb2NpYXRlZENvbmZpZ01hcAotCSAqICAgICAgICAgICBNYXAgb2Ygc2VsZWN0ZWQgcGx1Zy1pbnMgdG8gYXNzb2NpYXRlZCBjb25maWdzCi0JICovCi0JcHVibGljIHZvaWQgc2V0QXNzb2NpYXRlZENvbmZpZ3MoTWFwIGFzc29jaWF0ZWRDb25maWdNYXApIHsKLQkJaWYgKGFzc29jaWF0ZWRDb25maWdNYXAgPT0gbnVsbCB8fCBhc3NvY2lhdGVkQ29uZmlnTWFwLmlzRW1wdHkoKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWFzc29jaWF0ZWRDb25maWdzID0gbmV3IEhhc2hTZXQoKTsgCi0JCWZvciAoSXRlcmF0b3IgaXQgPSBhc3NvY2lhdGVkQ29uZmlnTWFwLnZhbHVlcygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCUxpc3QgY29uZmlnTGlzdCA9IChMaXN0KSBpdC5uZXh0KCk7Ci0JCQlpbnQgc3ogPSBjb25maWdMaXN0ID09IG51bGwgPyAwIDogY29uZmlnTGlzdC5zaXplKCk7Ci0JCQlmb3IgKGludCBpPTA7IGk8c3o7IGkrKykgewotCQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gKE1ldGhvZENvbmZpZ3VyYXRpb24pIGNvbmZpZ0xpc3QuZ2V0KGkpOwotCQkJCWlmICghYXNzb2NpYXRlZENvbmZpZ3MuY29udGFpbnMoY29uZmlnLmdldEd1aWQoKSkpIHsKLQkJCQkJYXNzb2NpYXRlZENvbmZpZ3MuYWRkKGNvbmZpZy5nZXRHdWlkKCkpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHVzZXIgc2VsZWN0ZWQgbWV0aG9kIHBsdWctaW5zLgotCSAqIAotCSAqIEBwYXJhbSBwbHVnaW5zCi0JICogICAgICAgICAgICBhIGxpc3Qgb2YgbWV0aG9kIHBsdWctaW5zCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2VsZWN0ZWRQbHVnaW5zKENvbGxlY3Rpb248TWV0aG9kUGx1Z2luPiBwbHVnaW5zKSB7Ci0JCXNlbGVjdGVkUGx1Z2lucyA9IHBsdWdpbnM7Ci0JfQotCQotCS8qKgotCSAqIEdldHMgdGhlIHVzZXIgc2VsZWN0ZWQgbWV0aG9kIGNvbmZpZ3VyYXRpb25zLgotCSAqIAotCSAqIEByZXR1cm4gYSBsaXN0IG9mIG1ldGhvZCBjb25maWd1cmF0aW9ucwotCSAqLwotCXB1YmxpYyBMaXN0IGdldFNlbGVjdGVkQ29uZmlncygpIHsKLQkJcmV0dXJuIHNlbGVjdGVkQ29uZmlnczsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB1c2VyIHNlbGVjdGVkIG1ldGhvZCBjb25maWd1cmF0aW9ucy4KLQkgKiAKLQkgKiBAcGFyYW0gY29uZmlncwotCSAqICAgICAgICAgICAgYSBsaXN0IG9mIG1ldGhvZCBjb25maWd1cmF0aW9ucwotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNlbGVjdGVkQ29uZmlncyhMaXN0IGNvbmZpZ3MpIHsKLQkJc2VsZWN0ZWRDb25maWdzID0gY29uZmlnczsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSB1c2VyIHNwZWNpZmllZCBkZXN0aW5hdGlvbiBYTUwgZmlsZS4KLQkgKiAKLQkgKiBAcmV0dXJuIGFuIGFic29sdXRlIHBhdGggdG8gdGhlIFhNTCBmaWxlCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRYTUxGaWxlKCkgewotCQlyZXR1cm4geG1sRmlsZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB1c2VyIHNwZWNpZmllZCBkZXN0aW5hdGlvbiBYTUwgZmlsZS4KLQkgKiAKLQkgKiBAcGFyYW0geG1sRmlsZQotCSAqICAgICAgICAgICAgYW4gYWJzb2x1dGUgcGF0aCB0byB0aGUgWE1MIGZpbGUKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRYTUxGaWxlKFN0cmluZyB4bWxGaWxlKSB7Ci0JCXRoaXMueG1sRmlsZSA9IHhtbEZpbGU7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC94bWwvc2VydmljZXMvRXhwb3J0WE1MTG9nZ2VyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC94bWwvc2VydmljZXMvRXhwb3J0WE1MTG9nZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhNTMzNDguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQveG1sL3NlcnZpY2VzL0V4cG9ydFhNTExvZ2dlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwuc2VydmljZXM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlLnV0aWwuRmlsZUxvZ2dlcjsKLQotCi0vKioKLSAqIExvZ2dlciBjbGFzcyBmb3IgeG1sIGV4cG9ydAotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICoKLSAqLwotcHVibGljIGNsYXNzIEV4cG9ydFhNTExvZ2dlciBleHRlbmRzIEZpbGVMb2dnZXIgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExPR1NfRk9MREVSID0gImxvZ3MiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgRXhwb3J0WE1MTG9nZ2VyKEZpbGUgbG9nUm9vdCkgewotCQlzdXBlcihuZXcgRmlsZShsb2dSb290LCBMT0dTX0ZPTERFUikpOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3htbC9zZXJ2aWNlcy9FeHBvcnRYTUxTZXJ2aWNlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC94bWwvc2VydmljZXMvRXhwb3J0WE1MU2VydmljZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZjQ4NTdjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3htbC9zZXJ2aWNlcy9FeHBvcnRYTUxTZXJ2aWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NjcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwuc2VydmljZXM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuc2RvLkVEYXRhT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2UudXRpbC5Db250ZW50UHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2UudXRpbC5JUmVzb3VyY2VIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLnVpLnNlcnZpY2UuRGlhZ3JhbUltYWdlU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnNlcnZpY2VzLkRpYWdyYW1IYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sLkV4cG9ydFhNTFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC5FeHBvcnRYTUxSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuSUNvbmZpZ3VyYXRpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuTW9kZWxTdHJ1Y3R1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlN1cHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5FbGVtZW50TGF5b3V0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5zZXJ2aWNlcy5TYWZlVXBkYXRlQ29udHJvbGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLkxpYnJhcnlVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuTWlncmF0aW9uVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLlJlc291cmNlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya09yZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya09yZGVyVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi0vKioKLSAqIFhtbEV4cG9ydCBzZXJ2aWNlIGNsYXNzIHRvIHByb2Nlc3MgdGhlIGV4cG9ydGluZyB0YXNrCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBFeHBvcnRYTUxTZXJ2aWNlIHsKLQotCS8vIFN0cmluZyB4bWxQYXRoOwotCXByaXZhdGUgRXhwb3J0WE1MRGF0YSBkYXRhOwotCQotCXByaXZhdGUgYm9vbGVhbiBkZWJ1ZyA9IEV4cG9ydFhNTFBsdWdpbi5nZXREZWZhdWx0KCkuaXNEZWJ1Z2dpbmcoKTsKLQotCXByaXZhdGUgWE1MTGlicmFyeSB4bWxMaWI7Ci0KLQlwcml2YXRlIExpc3QgZGlzY2FyZGVkRWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQlFeHBvcnRYTUxMb2dnZXIgbG9nZ2VyID0gbnVsbDsKLQotCS8vIGluIGNhc2Ugd2UgbmVlZCB0byBtYXBwaW5nIHRoZSB1bWEgb2JqZWN0cyB0byB4bWwgb2JqZWN0cwotCS8vIHN1Y2ggYXMgdGhlIGNvbnRlbnQgY2F0ZWdvcmllcwotCXByaXZhdGUgTWFwIHVtYUlkVG9YbWxJZE1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCi0JcHJpdmF0ZSBEaWFncmFtSGFuZGxlciBkaWFncmFtSGFuZGxlcjsKLQkKLQkvL3RkcyB3aXRoIHN0ZXBzCi0JcHJpdmF0ZSBNYXA8U3RyaW5nLCBUYXNrRGVzY3JpcHRvcj4gdGRNYXA7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBFeHBvcnRYTUxTZXJ2aWNlKEV4cG9ydFhNTERhdGEgZGF0YSkgewotCQl0aGlzLmRhdGEgPSBkYXRhOwotCQlsb2dnZXIgPSBuZXcgRXhwb3J0WE1MTG9nZ2VyKG5ldyBGaWxlKHRoaXMuZGF0YS54bWxGaWxlKQotCQkJCS5nZXRQYXJlbnRGaWxlKCkpOwotCX0KLQkvKioKLQkgKiBHZXRzIHRoZSBsb2dnZXIgZmlsZS4KLQkgKi8KLQlwdWJsaWMgRmlsZSBnZXRMb2dQYXRoKCkgewotCQlyZXR1cm4gbG9nZ2VyLmdldExvZ1BhdGgoKTsKLQl9Ci0KLQkvKioKLQkgKiBEaXNwb3NlCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJbG9nZ2VyLmRpc3Bvc2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBEb2VzIFhNTCBsaWJyYXJ5IGV4cG9ydC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBkb0V4cG9ydChJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJdHJ5IHsKLQotCQkJSVJlc291cmNlSGFuZGxlciBoYW5kbGVyID0gbmV3IEV4cG9ydFJlc291cmNlSGFuZGxlcigKLQkJCQkJbmV3IEZpbGUoTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKQotCQkJCQkJCS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeUxvY2F0aW9uKCkpLCBuZXcgRmlsZShkYXRhCi0JCQkJCQkJLmdldFhNTEZpbGUoKSkuZ2V0UGFyZW50RmlsZSgpKTsKLQkJCUNvbnRlbnRQcm9jZXNzb3IgY29udGVudFByb2MgPSBuZXcgQ29udGVudFByb2Nlc3NvcihoYW5kbGVyLAotCQkJCQl0aGlzLmxvZ2dlcik7Ci0JCQkKLQkJCWRpYWdyYW1IYW5kbGVyID0gbmV3IERpYWdyYW1IYW5kbGVyKAotCQkJCQluZXcgRmlsZShMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJCQkJLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5TG9jYXRpb24oKSksIG5ldyBGaWxlKGRhdGEKLQkJCQkJCQkuZ2V0WE1MRmlsZSgpKS5nZXRQYXJlbnRGaWxlKCkpIHsKLQkJCQkKLQkJCQlwdWJsaWMgdm9pZCB2aXNpdEVsZW1lbnRNYXAoaW50IHBhc3NJZCkgewotCQkJCQlpZiAocGFzc0lkICE9IDApIHsKLQkJCQkJCXJldHVybjsKLQkJCQkJfQotLyoJCQkJCVN0cmluZyBsaWJGb2xkZXJQYXRoID0gZ2V0U291cmNlTGliUm9vdCgpLmdldEFic29sdXRlUGF0aCgpOwotCQkJCQlpbnQgaXggPSBsaWJGb2xkZXJQYXRoLmxlbmd0aCgpOyovCi0JCQkJCQotCQkJCQlNYXA8U3RyaW5nLCBNYXBFbnRyeVZhbHVlPiBtYXAgPSBnZXRFbGVtZW50TWFwKCk7Ci0JCQkJCWZvciAoSXRlcmF0b3I8TWFwRW50cnlWYWx1ZT4gaXQgPSBtYXAudmFsdWVzKCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOyApIHsKLQkJCQkJCU1hcEVudHJ5VmFsdWUgdmFsdWUgPSBpdC5uZXh0KCk7Ci0JCQkJCQlpZiAodmFsdWUudGFyZ2V0RmlsZSA9PSBudWxsKSB7Ci0JCQkJCQkJY29udGludWU7Ci0JCQkJCQl9IGVsc2UgaWYgKHZhbHVlLnNvdXJjZUZpbGUgIT0gbnVsbCkgewotCQkJCQkJCUVEYXRhT2JqZWN0IHhtbE9iaiA9IGdldFhtbE9iamVjdCh2YWx1ZS5lbGVtZW50KTsKLQkJCQkJCQlpZiAoeG1sT2JqIGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2VzcykgewotCQkJCQkJCQlvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzIHByb2MgPSAKLQkJCQkJCQkJCQkJCQkob3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2VzcykgeG1sT2JqOwotCQkJCQkJCQlTdHJpbmcgdXJpID0gdmFsdWUuc291cmNlRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKTsKLQkJCQkJCQkJU3RyaW5nIHNyY1Jvb3RGb2xkZXJQYXRoID0gZ2V0Um9vdCh2YWx1ZS5lbGVtZW50KS5nZXRBYnNvbHV0ZVBhdGgoKTsKLQkJCQkJCQkJaW50IGl4ID0gc3JjUm9vdEZvbGRlclBhdGgubGVuZ3RoKCk7Ci0JCQkJCQkJCQotCQkJCQkJCQl1cmkgPSB1cmkuc3Vic3RyaW5nKGl4ICsgMSk7Ci0JCQkJCQkJCXVyaSA9IFVSSS5jcmVhdGVGaWxlVVJJKHVyaSkudG9TdHJpbmcoKTsKLQkJCQkJCQkJcHJvYy5zZXREaWFncmFtVVJJKHVyaSk7Ci0JCQkJCQkJfQkJCi0JCQkJCQl9IAotCQkJCQl9CQotCQkJCX0KLQkJCQkKLQkJCQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQkJCQlzdXBlci5leGVjdXRlKCk7Ci0JCQkJCVNhZmVVcGRhdGVDb250cm9sbGVyLnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQlleHBvcnREaWFncmFtSW1hZ2VGaWxlcygpOwotCQkJCQkJfQotCQkJCQl9KTsKLQkJCQl9Ci0KLQkJCQlwcml2YXRlIHZvaWQgZXhwb3J0RGlhZ3JhbUltYWdlRmlsZXMoKSB7Ci0JCQkJCVN0cmluZyBmb2xkZXJQYXRoID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeUxvY2F0aW9uKCk7Ci0JCQkJCQotCQkJCQlEaWFncmFtSW1hZ2VTZXJ2aWNlIGRpYWdyYW1TZXJ2aWNlID0gbmV3IERpYWdyYW1JbWFnZVNlcnZpY2UobnVsbCk7Ci0JCQkJCWRpYWdyYW1TZXJ2aWNlLnNldEZvclhNTEV4cG9ydCh0cnVlKTsKLQkJCQkJCi0JCQkJCXRyeSB7Ci0JCQkJCQlNYXA8U3RyaW5nLCBNYXBFbnRyeVZhbHVlPiBtYXAgPSBnZXRFbGVtZW50TWFwKCk7Ci0JCQkJCQlmb3IgKEl0ZXJhdG9yPE1hcEVudHJ5VmFsdWU+IGl0ID0gbWFwLnZhbHVlcygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTsgKSB7Ci0JCQkJCQkJTWFwRW50cnlWYWx1ZSB2YWx1ZSA9IGl0Lm5leHQoKTsKLQkJCQkJCQlvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3MgcHJvYyA9IChvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3MpIHZhbHVlLmVsZW1lbnQ7Ci0JCQkJCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSBwcm9jLmdldERlZmF1bHRDb250ZXh0KCk7Ci0JCQkJCQkJaWYgKGNvbmZpZyA9PSBudWxsKSB7Ci0JCQkJCQkJCWNvbnRpbnVlOwotCQkJCQkJCX0KLQkJCQkJCQlkaWFncmFtU2VydmljZS5zZXRDb25maWcoY29uZmlnKTsKLQkJCQkJCQlJQ29uZmlndXJhdGlvbk1hbmFnZXIgbWdyID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRDb25maWd1cmF0aW9uTWFuYWdlcihjb25maWcpOwotCQkJCQkJCWlmIChtZ3IgPT0gbnVsbCkgewotCQkJCQkJCQljb250aW51ZTsKLQkJCQkJCQl9Ci0JCQkJCQkJRWxlbWVudExheW91dE1hbmFnZXIgbGF5b3V0TWdyID0gbWdyLmdldEVsZW1lbnRMYXlvdXRNYW5hZ2VyKCk7Ci0JCQkJCQkJaWYgKGxheW91dE1nciA9PSBudWxsKSB7Ci0JCQkJCQkJCWNvbnRpbnVlOwotCQkJCQkJCX0KLQkJCQkJCQlJRmlsdGVyIGZpbHRlciA9IGxheW91dE1nci5nZXREaWFncmFtQWRhcHRlckZhY3RvcnkoKS5nZXRGaWx0ZXIoKTsKLQkJCQkJCQkKLQkJCQkJCQlGaWxlIGRpYWdyYW1YbWlGaWxlID0gdmFsdWUudGFyZ2V0RmlsZTsKLQkJCQkJCQlpZiAoZGlhZ3JhbVhtaUZpbGUgPT0gbnVsbCB8fCAhZGlhZ3JhbVhtaUZpbGUuZXhpc3RzKCkpIHsKLQkJCQkJCQkJY29udGludWU7Ci0JCQkJCQkJfQotCQkJCQkJCWRpYWdyYW1TZXJ2aWNlLnNldFB1YkRpcihkaWFncmFtWG1pRmlsZS5nZXRQYXJlbnRGaWxlKCkpOwotCQkJCQkJCQotCQkJCQkJCU1hcCBhY3Rpdml0aWVzID0gTWlncmF0aW9uVXRpbC5nZXRBY3Rpdml0aWVzKHByb2MsIHRydWUpOwkKLQkJCQkJCQlmb3IgKEFjdGl2aXR5IGFjdDogKENvbGxlY3Rpb248QWN0aXZpdHk+KSBhY3Rpdml0aWVzLnZhbHVlcygpKSB7Ci0JCQkJCQkJCVN0cmluZ1tdIHR5cGVzID0gewlSZXNvdXJjZUhlbHBlci5ESUFHUkFNX1RZUEVfV09SS0ZMT1csCi0JCQkJCQkJCQkJCQkJUmVzb3VyY2VIZWxwZXIuRElBR1JBTV9UWVBFX0FDVElWSVRZX0RFVEFJTCwKLQkJCQkJCQkJCQkJCQlSZXNvdXJjZUhlbHBlci5ESUFHUkFNX1RZUEVfV1BfREVQRU5ERU5DWX07Ci0JCQkJCQkJCQotCQkJCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHR5cGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQkJCQlTdHJpbmcgaW1hZ2VQYXRoID0gUmVzb3VyY2VIZWxwZXIuZ2V0WG1sRXhwb3J0ZWREaWFncmFtSW1hZ2VGaWxlTmFtZShhY3QsIHR5cGVzW2ldLCBSZXNvdXJjZUhlbHBlci5GSUxFX0VYVF9KUEVHKTsKLQkJCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCQkJZGlhZ3JhbVNlcnZpY2Uuc2F2ZURpYWdyYW0oYWN0LCBpbWFnZVBhdGgsIHR5cGVzW2ldLCBmaWx0ZXIsIFN1cHByZXNzaW9uLmdldFN1cHByZXNzaW9uKHByb2MpKTsKLQkJCQkJCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJCQkJaWYgKGRlYnVnKSB7Ci0JCQkJCQkJCQkJCWxvZ2dlci5sb2dFcnJvcihOTFMuYmluZChFeHBvcnRYTUxSZXNvdXJjZXMuZXhwb3J0WE1MU2VydmljZV9lcnJvciwKLQkJCQkJCQkJCQkJCQllLmdldE1lc3NhZ2UoKSksIGUpOwotCQkJCQkJCQkJCX0KLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCQotCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJaWYgKGRlYnVnKSB7Ci0JCQkJCQkJbG9nZ2VyLmxvZ0Vycm9yKE5MUy5iaW5kKEV4cG9ydFhNTFJlc291cmNlcy5leHBvcnRYTUxTZXJ2aWNlX2Vycm9yLAotCQkJCQkJCQkJZS5nZXRNZXNzYWdlKCkpLCBlKTsKLQkJCQkJCX0KLQkJCQkJfSBmaW5hbGx5IHsJCQkJCQkJCQkJCi0JCQkJCQlkaWFncmFtU2VydmljZS5kaXNwb3NlKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9OwotCi0JCQkvLyBGZWF0dXJlTWFuYWdlci5JTlNUQU5DRS5wcmludEZlYXR1cmVOYW1lTWFwcGluZygpOwotCi0JCQkvLyBleHBvcnQgdGhlIGN1cnJlbnQgbGlicmFyeSB0byB0aGUgeG1sIGZpbGUKLQkJCS8vIGdldCB0aGUgY3VycmVudCBsaWJyYXJ5IGluc3RhbmNlIGFuZCBleHBvcnQgYWxsIHRvIHRoZSB4bWwKLQkJCU1ldGhvZExpYnJhcnkgc3JjID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKQotCQkJCQkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKTsKLQotCQkJdGhpcy54bWxMaWIgPSBuZXcgWE1MTGlicmFyeShjb250ZW50UHJvYywgbG9nZ2VyLCBkYXRhCi0JCQkJCS5nZXRYTUxGaWxlKCkpOwotCi0JCQl0aGlzLnhtbExpYi5jcmVhdGVMaWJyYXJ5KHNyYy5nZXRHdWlkKCksIHNyYy5nZXROYW1lKCkpOwotCQkJRURhdGFPYmplY3QgdGFyZ2V0ID0gdGhpcy54bWxMaWIuZ2V0Um9vdCgpOwotCi0JCQljcmVhdEVEYXRhT2JqZWN0VHJlZShzcmMsIHRhcmdldCk7Ci0JCQlpdGVyYXRFRGF0YU9iamVjdChzcmMpOwotCi0JCQl0aGlzLnhtbExpYi5maXhMaWJyYXJ5Rm9yRXhwb3J0KCk7Ci0JCQl0aGlzLnhtbExpYi5maXhUYXNrRGVzY3JpcHRvcnNGb3JFeHBvcnQodGRNYXApOwotCQkJCi0JCQlkaWFncmFtSGFuZGxlci52aXNpdEVsZW1lbnRNYXAoMCk7Ci0JCQlpZiAoZGF0YS5leHBvcnRUeXBlID09IEV4cG9ydFhNTERhdGEuRVhQT1JUX01FVEhPRF9QTFVHSU5TKSB7Ci0JCQkJeG1sTGliLnN0b3JlRXh0cmFJbmZvKHNyYy5nZXRNZXRob2RQbHVnaW5zKCkpOwotCQkJfQotCQkJdGhpcy54bWxMaWIuc2F2ZSgpOwotCQkJZGlhZ3JhbUhhbmRsZXIuZXhlY3V0ZSgpOwotCi0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlsb2dnZXIubG9nRXJyb3IoTkxTLmJpbmQoRXhwb3J0WE1MUmVzb3VyY2VzLmV4cG9ydFhNTFNlcnZpY2VfZXJyb3IsCi0JCQkJCWUuZ2V0TWVzc2FnZSgpKSwgZSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNQbHVnaW5TZWxlY3RlZChNZXRob2RQbHVnaW4gcGx1Z2luKSB7Ci0JCWlmIChkYXRhLmV4cG9ydFR5cGUgPT0gRXhwb3J0WE1MRGF0YS5FWFBPUlRfTUVUSE9EX0xJQlJBUlkpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9IGVsc2UgaWYgKGRhdGEuZXhwb3J0VHlwZSA9PSBFeHBvcnRYTUxEYXRhLkVYUE9SVF9NRVRIT0RfUExVR0lOUykgewotCQkJcmV0dXJuIChkYXRhLnNlbGVjdGVkUGx1Z2lucyAhPSBudWxsKQotCQkJCQkmJiBkYXRhLnNlbGVjdGVkUGx1Z2lucy5jb250YWlucyhwbHVnaW4pOwotCQl9IGVsc2UgaWYgKGRhdGEuZXhwb3J0VHlwZSA9PSBFeHBvcnRYTUxEYXRhLkVYUE9SVF9NRVRIT0RfQ09ORklHUykgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNDb25maWdFeGNsdWRlZChNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZykgewotCQlpZiAoZGF0YS5leHBvcnRUeXBlID09IEV4cG9ydFhNTERhdGEuRVhQT1JUX01FVEhPRF9QTFVHSU5TKSB7Ci0JCQlyZXR1cm4gZGF0YS5hc3NvY2lhdGVkQ29uZmlncyA9PSBudWxsIHx8IAotCQkJCQkhZGF0YS5hc3NvY2lhdGVkQ29uZmlncy5jb250YWlucyhjb25maWcuZ2V0R3VpZCgpKTsKLQkJfSAKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRFRGF0YU9iamVjdFRyZWUoTWV0aG9kRWxlbWVudCBzcmNPYmosCi0JCQlFRGF0YU9iamVjdCB0YXJnZXRPYmopIHsKLQotCQkvLyBpZiBpdCdzIGEgcGx1Z2luLCBza2lwIGFsbCB0aGUgc3lzdGVtIHBhY2thZ2VzCi0JCS8vIGFuZCBmaW5kIHRoZSB0b3AgbW9zdCB1c2VyIHBhY2thZ2VzCi0JCWlmIChzcmNPYmogaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pIHsKLQotCQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IChNZXRob2RQbHVnaW4pIHNyY09iajsKLQkJCWlmICghaXNQbHVnaW5TZWxlY3RlZChwbHVnaW4pKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCi0JCQkvLyBhbGwgc3lzdGVtIHBhY2thZ2VzIGFyZSBkaXNjYXJkZWQKLQkJCWRpc2NhcmRlZEVsZW1lbnRzLmFkZEFsbChUbmdVdGlsLmdldEFsbFN5c3RlbVBhY2thZ2VzKHBsdWdpbikpOwotCi0JCQlMaXN0IHRvcG1vc3RVc2VyUGFja2FnZXMgPSBnZXRUb3Btb3N0VXNlclBhY2thZ2UocGx1Z2luKTsKLQkJCUxpc3QgY2F0ZWdvcnlQa2dzID0gVG5nVXRpbC5nZXRDb250ZW50Q2F0ZWdvcnlQYWNrYWdlcyhwbHVnaW4pOwotCi0JCQlvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db250ZW50Q2F0ZWdvcnlQYWNrYWdlIHhtbFBrZyA9IChvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db250ZW50Q2F0ZWdvcnlQYWNrYWdlKSB0aGlzLnhtbExpYgotCQkJCQkuZ2V0Q29udGVudENhdGVnb3J5UGFja2FnZShwbHVnaW4uZ2V0R3VpZCgpKTsKLQkJCVN0cmluZyBjb250ZW50Q2F0ZWdvcnlQYWNrYWdlSWQgPSB4bWxQa2cuZ2V0SWQoKTsKLQotCQkJZm9yIChJdGVyYXRvciBpdHAgPSB0b3Btb3N0VXNlclBhY2thZ2VzLml0ZXJhdG9yKCk7IGl0cC5oYXNOZXh0KCk7KSB7Ci0JCQkJTWV0aG9kUGFja2FnZSBwa2cgPSAoTWV0aG9kUGFja2FnZSkgaXRwLm5leHQoKTsKLQotCQkJCS8vIGlmIGl0J3MgYSBjYXRlZ29yeSBwYWNrYWdlLAotCQkJCS8vIGNyZWF0ZSBhbGwgY29udGFpbmVkIGVsZW1lbnRzIGluIHRoZSBzaW5nbGUgY3VzdG9tIGNhdGVnb3J5Ci0JCQkJLy8gcGFja2FnZQotCQkJCWlmIChjYXRlZ29yeVBrZ3MuY29udGFpbnMocGtnKSkgewotCi0JCQkJCS8vIHNldCB0aGUgaXQgbWFwcGluZwotCQkJCQlzZXRJZE1hcHBpbmcocGtnLmdldEd1aWQoKSwgY29udGVudENhdGVnb3J5UGFja2FnZUlkKTsKLQkJCQkJY3JlYXRFRGF0YU9iamVjdFRyZWUocGtnLCB4bWxQa2cpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWNyZWF0RURhdGFPYmplY3RUcmVlKHBrZywgdGFyZ2V0T2JqKTsKLQkJCQl9Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gc3JjT2JqLmVDb250ZW50cygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlPYmplY3QgbmV4dE9iaiA9IGl0Lm5leHQoKTsKLQkJCQlNZXRob2RFbGVtZW50IGNoaWxkID0gbmV4dE9iaiBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQgPwotCQkJCQkJKE1ldGhvZEVsZW1lbnQpIG5leHRPYmogOiBudWxsOwotCQkJCWlmIChjaGlsZCA9PSBudWxsKSB7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQotCQkJCS8vIGluIHVtYSBtb2RlbCwgV29ya09yZGVyIGlzIGNvbnRhaW5lZCBpbiBwYWNrYWdlCi0JCQkJLy8gaW4geG1sIG1vZGVsLCBXb3JrT3JkZXIgaXMgY29udGFpbmVkIGJ5IHRoZSBvd25pbmcKLQkJCQkvLyBXb3JrQnJlYWtkb3duRWxlbWVudCwKLQkJCQkvLyBzbyBkZWxheSB0aGUgY3JlYXRpb24gaWYgdGhlIG93bmVyIGlzIGEgcGFja2FnZQotCQkJCWlmIChjaGlsZCBpbnN0YW5jZW9mIFdvcmtPcmRlcgotCQkJCQkJJiYgc3JjT2JqIGluc3RhbmNlb2YgTWV0aG9kUGFja2FnZSkgewotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0KLQkJCQlpZiAoKGNoaWxkIGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luKQotCQkJCQkJJiYgIWlzUGx1Z2luU2VsZWN0ZWQoKE1ldGhvZFBsdWdpbikgY2hpbGQpKSB7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCQkKLQkJCQlpZiAoY2hpbGQgaW5zdGFuY2VvZiBNZXRob2RDb25maWd1cmF0aW9uICYmCi0JCQkJCWlzQ29uZmlnRXhjbHVkZWQoKE1ldGhvZENvbmZpZ3VyYXRpb24pIGNoaWxkKSkgewotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0KLQkJCQlpZiAoIWlzRGlzY2FyZGVkKGNoaWxkKSkgewotCQkJCQljcmVhdGVYbWxPYmplY3QoY2hpbGQsIHRhcmdldE9iaik7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldElkTWFwcGluZyhTdHJpbmcgdW1hSWQsIFN0cmluZyB4bWxJZCkgewotCQlpZiAoIXVtYUlkVG9YbWxJZE1hcC5jb250YWluc0tleSh1bWFJZCkpIHsKLQkJCXVtYUlkVG9YbWxJZE1hcC5wdXQodW1hSWQsIHhtbElkKTsKLQkJfQotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldFhtbElkKFN0cmluZyB1bWFJZCkgewotCQlpZiAodW1hSWRUb1htbElkTWFwLmNvbnRhaW5zS2V5KHVtYUlkKSkgewotCQkJcmV0dXJuIChTdHJpbmcpIHVtYUlkVG9YbWxJZE1hcC5nZXQodW1hSWQpOwotCQl9Ci0JCXJldHVybiB1bWFJZDsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNEaXNjYXJkZWQoT2JqZWN0IG8pIHsKLQkJaWYgKG8gaW5zdGFuY2VvZiBEaWFncmFtKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZGlzY2FyZGVkRWxlbWVudHMuY29udGFpbnMobyk7Ci0JfQotCi0JcHJpdmF0ZSBFRGF0YU9iamVjdCBnZXRYbWxPYmplY3QoTWV0aG9kRWxlbWVudCBzcmNPYmopIHsKLQkJU3RyaW5nIGlkID0gc3JjT2JqLmdldEd1aWQoKTsKLQkJaWYgKHVtYUlkVG9YbWxJZE1hcC5jb250YWluc0tleShpZCkpIHsKLQkJCWlkID0gKFN0cmluZykgdW1hSWRUb1htbElkTWFwLmdldChpZCk7Ci0JCX0KLQkJcmV0dXJuIHRoaXMueG1sTGliLmdldEVsZW1lbnQoaWQpOwotCX0KLQotCS8qKgotCSAqIGNyZWF0ZSBhbiB4bWwgZWxlbWVudCBmb3IgdGhlIGNvbnRhaW5lciwgYmFzZWQgb24gdGhlIHVtYSBlbGVtZW50Ci0JICogCi0JICogQHBhcmFtIHVtYUVsZW1lbnQKLQkgKiBAcGFyYW0gdGFyZ2V0Q29udGFpbmVyCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVhtbE9iamVjdChNZXRob2RFbGVtZW50IHVtYUVsZW1lbnQsCi0JCQlFRGF0YU9iamVjdCB0YXJnZXRDb250YWluZXIpIHsKLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSB1bWFFbGVtZW50LmVDb250YWlubWVudEZlYXR1cmUoKTsKLQkJY3JlYXRlWG1sT2JqZWN0KHVtYUVsZW1lbnQsIHRhcmdldENvbnRhaW5lciwgZmVhdHVyZS5nZXROYW1lKCkpOwotCX0KLQotCS8qKgotCSAqIGNyZWF0ZSBhbiB4bWwgZWxlbWVudCBmb3IgdGhlIGNvbnRhaW5lciwgYmFzZWQgb24gdGhlIHVtYSBlbGVtZW50Ci0JICogCi0JICogQHBhcmFtIHVtYUVsZW1lbnQKLQkgKiBAcGFyYW0gdGFyZ2V0Q29udGFpbmVyCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVhtbE9iamVjdChNZXRob2RFbGVtZW50IHVtYUVsZW1lbnQsCi0JCQlFRGF0YU9iamVjdCB0YXJnZXRDb250YWluZXIsIFN0cmluZyBjb250YWlubWVudEZlYXR1cmUpIHsKLQotCQl0cnkgewotCQkJaWYgKHVtYUVsZW1lbnQgPT0gbnVsbCkgewotCQkJCXJldHVybjsKLQkJCX0KLQotCQkJLy8gZ2V0IHRoZSBjb250YWlubWVudCBmZWF0dXJlIHNvIHdlIGNhbiBjcmVhdGUgdGhlIG9iamVjdCBvZiB0aGUKLQkJCS8vIHNhbWUgdHlwZQotCQkJU3RyaW5nIGVsZW1lbnRUeXBlID0gdW1hRWxlbWVudC5nZXRUeXBlKCkuZ2V0TmFtZSgpOwotCQkJRURhdGFPYmplY3QgeG1sRWxlbWVudCA9IHhtbExpYi5jcmVhdGVFbGVtZW50KHRhcmdldENvbnRhaW5lciwKLQkJCQkJY29udGFpbm1lbnRGZWF0dXJlLCB1bWFFbGVtZW50LmVDbGFzcygpLmdldE5hbWUoKSwKLQkJCQkJZWxlbWVudFR5cGUsIHVtYUVsZW1lbnQuZ2V0R3VpZCgpKTsKLQkJCQotCQkJaWYgKHVtYUVsZW1lbnQgaW5zdGFuY2VvZiBUYXNrRGVzY3JpcHRvcikgewkJCQkJCi0JCQkJVGFza0Rlc2NyaXB0b3IgdGQgPSAoVGFza0Rlc2NyaXB0b3IpIHVtYUVsZW1lbnQ7Ci0JCQkJaWYgKHRkLmdldFRhc2soKSAhPSBudWxsKSB7Ci0JCQkJCUxpc3Qgc3RlcHMgPSB0ZC5nZXRTZWxlY3RlZFN0ZXBzKCk7Ci0JCQkJCWlmIChzdGVwcyAhPSBudWxsICYmICFzdGVwcy5pc0VtcHR5KCkpIHsKLQkJCQkJCWlmICh0ZE1hcCA9PSBudWxsKSB7Ci0JCQkJCQkJdGRNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFRhc2tEZXNjcmlwdG9yPigpOwotCQkJCQkJfQotCQkJCQkJdGRNYXAucHV0KHRkLmdldEd1aWQoKSwgdGQpOwotCQkJCQl9Ci0JCQkJfQkJCQotCQkJfQotCQkJCi0JCQlpZiAoeG1sRWxlbWVudCAhPSBudWxsKSB7Ci0KLQkJCQkvLyByZWN1cnNpdmUKLQkJCQljcmVhdEVEYXRhT2JqZWN0VHJlZSh1bWFFbGVtZW50LCB4bWxFbGVtZW50KTsKLQkJCX0KLQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLy8gbG9nIHRoZSBlcnJvciBhbmQgY29udGludWU/Pz8KLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgaXRlcmF0RURhdGFPYmplY3QoTWV0aG9kRWxlbWVudCBzcmNPYmopIHsKLQkJZGlhZ3JhbUhhbmRsZXIucmVnaXN0ZXJFbGVtZW50KHNyY09iaiwgdHJ1ZSk7Ci0JCQotCQlpZiAoc3JjT2JqIGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luKSB7Ci0JCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gKE1ldGhvZFBsdWdpbikgc3JjT2JqOwotCQkJaWYgKCFpc1BsdWdpblNlbGVjdGVkKHBsdWdpbikpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQotCQlpZiAoaXNQcm9jZXNzZWQoc3JjT2JqLmdldEd1aWQoKSkpIHsKLQkJCXJldHVybjsKLQkJfQotCQlzZXRQcm9jZXNzZWQoc3JjT2JqLmdldEd1aWQoKSk7Ci0KLQkJRURhdGFPYmplY3QgdGFyZ2V0T2JqID0gZ2V0WG1sT2JqZWN0KHNyY09iaik7Ci0KLQkJLy8gaWYgb2JqZWN0IGlzIG5vdCBjcmVhdGVkLAotCQkvLyB3aGljaCBtZWFucyBpdCdzIGVpdGhlciBhIHN5c3RlbSBwYWNrYWdlIG9yIHNvbWV0aGluZyB3cm9uZwotCQlpZiAodGFyZ2V0T2JqID09IG51bGwpIHsKLQkJCWlmIChzcmNPYmogaW5zdGFuY2VvZiBNZXRob2RQYWNrYWdlKSB7Ci0JCQkJLy8gaXRlcmF0ZSB0aGUgY2hpbGQgcGFja2FnZXMKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ID0gKChNZXRob2RQYWNrYWdlKSBzcmNPYmopLmdldENoaWxkUGFja2FnZXMoKQotCQkJCQkJLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQkJaXRlcmF0RURhdGFPYmplY3QoKE1ldGhvZEVsZW1lbnQpIGl0Lm5leHQoKSk7Ci0JCQkJfQotCQkJfQotCi0JCQkvLyAvLyBlbGVtZW50cyBjYW4gYmUgcmVmZXJlbmNlIGluIG90aGVyIHBsdWdpbnMKLQkJCS8vIC8vIGRvbid0IG5lZWQgdG8gY2FyZSBhYm91dCB0aGlzCi0JCQkvLyBlbHNlIGlmICghaXNEaXNjYXJkZWQoc3JjT2JqKSApIHsKLQkJCS8vIGxvZ2dlci5sb2dXYXJuaW5nKCJXYXJuaW5nOiB4bWwgb2JqZWN0IG5vdCBjcmVhdGVkIGZvciAiICsKLQkJCS8vIExpYnJhcnlVdGlsLmdldFR5cGVOYW1lKHNyY09iaikgKTsKLQkJCS8vIH0KLQotCQkJcmV0dXJuOwotCQl9Ci0KLQkJRUNsYXNzIGVDbGFzcyA9IHNyY09iai5lQ2xhc3MoKTsKLQotCQlFTGlzdCBmZWF0dXJlcyA9IGVDbGFzcy5nZXRFQWxsU3RydWN0dXJhbEZlYXR1cmVzKCk7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSBmZWF0dXJlcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IChFU3RydWN0dXJhbEZlYXR1cmUpIGl0Lm5leHQoKTsKLQotCQkJT2JqZWN0IHZhbHVlID0gc3JjT2JqLmVHZXQoZmVhdHVyZSk7Ci0KLQkJCXRyeSB7Ci0JCQkJaWYgKHZhbHVlIGluc3RhbmNlb2YgTGlzdCAmJiAhIGZlYXR1cmUuZ2V0TmFtZSgpLmVxdWFscygibWV0aG9kRWxlbWVudFByb3BlcnR5IikpIHsvLyROT04tTkxTLTEkCQotCQkJCQlmb3IgKEl0ZXJhdG9yIGl0diA9ICgoTGlzdCkgdmFsdWUpLml0ZXJhdG9yKCk7IGl0dgotCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlNZXRob2RFbGVtZW50IHNyY192YWx1ZSA9IChNZXRob2RFbGVtZW50KSBpdHYubmV4dCgpOwotCi0JCQkJCQkvLyBoYW5kbGUgdGhlCi0JCQkJCQkvLyBVbWFQYWNrYWdlI2dldFdvcmtCcmVha2Rvd25FbGVtZW50X0xpbmtUb1ByZWRlY2Vzc29yCi0JCQkJCQkvLyBmZWF0dXJlIHZhbHVlCi0JCQkJCQkvLyB0aGUgV29ya09yZGVyIGluIHVtYSBpcyBhIHByb2Nlc3MgZWxlbWVudCBpbiBhCi0JCQkJCQkvLyBwYWNrYWdlCi0JCQkJCQkvLyBpbiB4bWwgbW9kZWwsIGl0J3MgYW4gRURhdGFPYmplY3QgY29udGFpbmVkIGJ5IHRoZQotCQkJCQkJLy8gV29ya0JyZWFrZG93bkVsZW1lbnQKLQkJCQkJCWlmIChzcmNfdmFsdWUgaW5zdGFuY2VvZiBXb3JrT3JkZXIpIHsKLQkJCQkJCQkvLyBnZXQgdGhlIG93bmVyIG9mIHRoZSBXb3JrT3JkZXIKLQkJCQkJCQlFRGF0YU9iamVjdCB3b3JrT3JkZXIgPSBnZXRYbWxPYmplY3Qoc3JjX3ZhbHVlKTsKLQkJCQkJCQlpZiAod29ya09yZGVyID09IG51bGwpIHsKLQkJCQkJCQkJY3JlYXRlWG1sT2JqZWN0KHNyY192YWx1ZSwgdGFyZ2V0T2JqLCBmZWF0dXJlCi0JCQkJCQkJCQkJLmdldE5hbWUoKSk7Ci0JCQkJCQkJfQotCQkJCQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigid29ya29yZGVyIHZhbHVlIik7Ci0JCQkJCQl9Ci0KLQkJCQkJCS8vIHNldCB0aGUgcmVmZXJlbmNlCi0JCQkJCQlTdHJpbmcgeG1sSWQgPSBnZXRYbWxJZChzcmNfdmFsdWUuZ2V0R3VpZCgpKTsKLQkJCQkJCXhtbExpYi5zZXRSZWZlcmVuY2VWYWx1ZSh0YXJnZXRPYmosIGZlYXR1cmUuZ2V0TmFtZSgpLAotCQkJCQkJCQl4bWxJZCwgc3JjX3ZhbHVlLmdldFR5cGUoKSk7Ci0KLQkJCQkJCWl0ZXJhdEVEYXRhT2JqZWN0KHNyY192YWx1ZSk7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJCQkvLyBnZXQgdGhlIHhtbCBvYmplY3QgYW5kIGl0ZXJhdGUgYWdhaW4KLQkJCQkJTWV0aG9kRWxlbWVudCBzcmNfdmFsdWUgPSAoTWV0aG9kRWxlbWVudCkgdmFsdWU7Ci0KLQkJCQkJLy8gaWYgKCBzcmNfdmFsdWUgaW5zdGFuY2VvZiBXb3JrT3JkZXIgKSB7Ci0JCQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigid29ya29yZGVyIHZhbHVlIik7Ci0JCQkJCS8vIH0KLQotCQkJCQkvLyBlbGVtZW50cyBsaWtlIFByZXNlbnRhdGlvbiBtYXkgbm90IGhhdmUgYSBDb250ZW50Ci0JCQkJCS8vIERlc2NyaXB0aW9uCi0JCQkJCS8vIHRoZSBvbmUgcmV0dXJuZWQgbWF5IG5vdCBoYXZlIGEgY29udGFpbmVyCi0JCQkJCWlmIChzcmNfdmFsdWUuZUNvbnRhaW5lcigpICE9IG51bGwpIHsKLQkJCQkJCVN0cmluZyB4bWxJZCA9IGdldFhtbElkKHNyY192YWx1ZS5nZXRHdWlkKCkpOwotCQkJCQkJeG1sTGliLnNldFJlZmVyZW5jZVZhbHVlKHRhcmdldE9iaiwgZmVhdHVyZS5nZXROYW1lKCksCi0JCQkJCQkJCXhtbElkLCBzcmNfdmFsdWUuZ2V0VHlwZSgpKTsKLQotCQkJCQkJaXRlcmF0RURhdGFPYmplY3Qoc3JjX3ZhbHVlKTsKLQkJCQkJfQotCQkJCX0gZWxzZSBpZiAoIWlzRGlzY2FyZGVkKHNyY09iaikpIHsKLQkJCQkJLy8gaWYgKCB0YXJnZXRPYmogaW5zdGFuY2VvZiBDb250ZW50Q2F0ZWdvcnlQYWNrYWdlKSB7Ci0JCQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiaHJyZSIpOwotCQkJCQkvLyB9Ci0KLQkJCQkJaWYgKHZhbHVlIGluc3RhbmNlb2YgV29ya09yZGVyVHlwZSkgewotCQkJCQkJdmFsdWUgPSAoKFdvcmtPcmRlclR5cGUpIHZhbHVlKS5nZXROYW1lKCk7Ci0JCQkJCX0KLQotCQkJCQl4bWxMaWIuc2V0QXRyaWJ1dGVGZWF0dXJlVmFsdWUodGFyZ2V0T2JqLAotCQkJCQkJCWZlYXR1cmUuZ2V0TmFtZSgpLCB2YWx1ZSk7Ci0JCQkJfQotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlTdHJpbmcgbXNnID0gTkxTLmJpbmQoCi0JCQkJCQlFeHBvcnRYTUxSZXNvdXJjZXMuZXhwb3J0WE1MU2VydmljZV9mZWF0dXJlX2Vycm9yLAotCQkJCQkJTGlicmFyeVV0aWwuZ2V0VHlwZU5hbWUoc3JjT2JqKSwgZmVhdHVyZS5nZXROYW1lKCkpOwotCQkJCWxvZ2dlci5sb2dFcnJvcihtc2csIGUpOwotCQkJfQotCi0JCX0KLQotCX0KLQotCS8vIGdvaWQgb2YgcHJvY2Vzc2VkIGVsZW1lbnQKLQlwcml2YXRlIExpc3QgcHJvY2Vzc2VkRWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNQcm9jZXNzZWQoU3RyaW5nIGd1aWQpIHsKLQkJcmV0dXJuIHByb2Nlc3NlZEVsZW1lbnRzLmNvbnRhaW5zKGd1aWQpOwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRQcm9jZXNzZWQoU3RyaW5nIGd1aWQpIHsKLQkJaWYgKCFwcm9jZXNzZWRFbGVtZW50cy5jb250YWlucyhndWlkKSkgewotCQkJcHJvY2Vzc2VkRWxlbWVudHMuYWRkKGd1aWQpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBMaXN0IGdldFRvcG1vc3RVc2VyUGFja2FnZShNZXRob2RQbHVnaW4gcGx1Z2luKSB7Ci0KLQkJTWV0aG9kUGFja2FnZSBwa2dfY29yZV9jb250ZW50ID0gVW1hVXRpbC5maW5kTWV0aG9kUGFja2FnZShwbHVnaW4sCi0JCQkJTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC5jb3JlQ29udGVudFBhdGgpOwotCi0JCU1ldGhvZFBhY2thZ2UgcGtnX2N1c3RvbV9jYXRlZ29yaWVzID0gVW1hVXRpbC5maW5kTWV0aG9kUGFja2FnZShwbHVnaW4sCi0JCQkJTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC5jdXN0b21DYXRlZ29yeVBhdGgpOwotCi0JCU1ldGhvZFBhY2thZ2UgcGtnX2Rpc2NpcGxpbmVzID0gVW1hVXRpbC5maW5kTWV0aG9kUGFja2FnZShwbHVnaW4sCi0JCQkJTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC5kaXNjaXBsaW5lRGVmaW5pdGlvblBhdGgpOwotCi0JCU1ldGhvZFBhY2thZ2UgcGtnX2RvbWFpbnMgPSBVbWFVdGlsLmZpbmRNZXRob2RQYWNrYWdlKHBsdWdpbiwKLQkJCQlNb2RlbFN0cnVjdHVyZS5ERUZBVUxULmRvbWFpblBhdGgpOwotCi0JCU1ldGhvZFBhY2thZ2UgcGtnX3JvbGVzZXRzID0gVW1hVXRpbC5maW5kTWV0aG9kUGFja2FnZShwbHVnaW4sCi0JCQkJTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC5yb2xlU2V0UGF0aCk7Ci0KLQkJTWV0aG9kUGFja2FnZSBwa2dfdG9vbHMgPSBVbWFVdGlsLmZpbmRNZXRob2RQYWNrYWdlKHBsdWdpbiwKLQkJCQlNb2RlbFN0cnVjdHVyZS5ERUZBVUxULnRvb2xQYXRoKTsKLQotCQlNZXRob2RQYWNrYWdlIHBrZ193cHR5cGVzID0gVW1hVXRpbC5maW5kTWV0aG9kUGFja2FnZShwbHVnaW4sCi0JCQkJTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC53b3JrUHJvZHVjdFR5cGVQYXRoKTsKLQotCQlNZXRob2RQYWNrYWdlIHBrZ19jcCA9IFVtYVV0aWwuZmluZE1ldGhvZFBhY2thZ2UocGx1Z2luLAotCQkJCU1vZGVsU3RydWN0dXJlLkRFRkFVTFQuY2FwYWJpbGl0eVBhdHRlcm5QYXRoKTsKLQotCQlNZXRob2RQYWNrYWdlIHBrZ19kcCA9IFVtYVV0aWwuZmluZE1ldGhvZFBhY2thZ2UocGx1Z2luLAotCQkJCU1vZGVsU3RydWN0dXJlLkRFRkFVTFQuZGVsaXZlcnlQcm9jZXNzUGF0aCk7Ci0KLQkJTWV0aG9kUGFja2FnZSBwa2dfcHJvY19jb250cmlidXRpb24gPSBVbWFVdGlsLmZpbmRNZXRob2RQYWNrYWdlKHBsdWdpbiwKLQkJCQlNb2RlbFN0cnVjdHVyZS5ERUZBVUxULnByb2Nlc3NDb250cmlidXRpb25QYXRoKTsKLQotCQlMaXN0IHBrZ3MgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXBrZ3MuYWRkKHBrZ19jb3JlX2NvbnRlbnQpOwotCQlwa2dzLmFkZChwa2dfY3VzdG9tX2NhdGVnb3JpZXMpOwotCQlwa2dzLmFkZChwa2dfZGlzY2lwbGluZXMpOwotCQlwa2dzLmFkZChwa2dfZG9tYWlucyk7Ci0JCXBrZ3MuYWRkKHBrZ19yb2xlc2V0cyk7Ci0JCXBrZ3MuYWRkKHBrZ190b29scyk7Ci0JCXBrZ3MuYWRkKHBrZ193cHR5cGVzKTsKLQkJcGtncy5hZGQocGtnX2NwKTsKLQkJcGtncy5hZGQocGtnX2RwKTsKLQotCQlpZiAoIHBrZ19wcm9jX2NvbnRyaWJ1dGlvbiAhPSBudWxsICkgewotCQkJcGtncy5hZGQocGtnX3Byb2NfY29udHJpYnV0aW9uKTsKLQkJfQotCQkKLQkJcmV0dXJuIHBrZ3M7Ci0KLQkJLy8gTGlzdCBzeXN0ZW1Qa2dzID0gVG5nVXRpbC5nZXRBbGxTeXN0ZW1QYWNrYWdlcyhwbHVnaW4pOwotCQkvLwkJCi0JCS8vIExpc3QgdW5wcm9jZXNzZWRQa2dzID0gbmV3IEFycmF5TGlzdChwbHVnaW4uZ2V0TWV0aG9kUGFja2FnZXMoKSk7Ci0JCS8vIHdoaWxlICh1bnByb2Nlc3NlZFBrZ3Muc2l6ZSgpID4gMCApIHsKLQkJLy8gTWV0aG9kUGFja2FnZSBwa2cgPSAoTWV0aG9kUGFja2FnZSkgdW5wcm9jZXNzZWRQa2dzLnJlbW92ZSgwKTsKLQkJLy8gaWYgKCAhc3lzdGVtUGtncy5jb250YWlucyhwa2cpICkgewotCQkvLyBpZiAoICFwa2dzLmNvbnRhaW5zKHBrZykgKSB7Ci0JCS8vIHBrZ3MuYWRkKHBrZyk7Ci0JCS8vIH0KLQkJLy8gY29udGludWU7Ci0JCS8vIH0KLQkJLy8JCQkKLQkJLy8gZm9yICggSXRlcmF0b3IgaXQgPSBwa2cuZ2V0Q2hpbGRQYWNrYWdlcygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTsKLQkJLy8gKSB7Ci0JCS8vIE1ldGhvZFBhY2thZ2UgcCA9IChNZXRob2RQYWNrYWdlKWl0Lm5leHQoKTsKLQkJLy8gaWYgKCBzeXN0ZW1Qa2dzLmNvbnRhaW5zKHApICkKLQkJLy8gewotCQkvLyBpZiAoICF1bnByb2Nlc3NlZFBrZ3MuY29udGFpbnMocCkgKSB7Ci0JCS8vIHVucHJvY2Vzc2VkUGtncy5hZGQocCk7Ci0JCS8vIH0KLQkJLy8gfSBlbHNlIHsKLQkJLy8gaWYgKCAhcGtncy5jb250YWlucyhwKSApIHsKLQkJLy8gcGtncy5hZGQocCk7Ci0JCS8vIH0KLQkJLy8gfQotCQkvLyB9Ci0JCS8vCQkJCi0JCS8vIGlmICggdW5wcm9jZXNzZWRQa2dzLnNpemUoKSA9PSAwICkgewotCQkvLyBicmVhazsKLQkJLy8gfQotCQkvLyB9Ci0JCS8vCQkKLQkJLy8gLy8gbmVlZCB0byBpbmNsdWRlIHRoZSBjb250ZW50IHBhY2thZ2VzCi0JCS8vIHBrZ3MuYWRkQWxsKFRuZ1V0aWwuZ2V0Q29udGVudENhdGVnb3J5UGFja2FnZXMocGx1Z2luKSk7Ci0KLQl9Ci0KLQkvLyBwcml2YXRlIGJvb2xlYW4gaXNTeXN0ZW1QYWNrYWdlKEVEYXRhT2JqZWN0IGVsZW1lbnQpIHsKLQkvLwkJCi0JLy8gaWYgKCAhKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RQYWNrYWdlKSApIHsKLQkvLyByZXR1cm4gZmFsc2U7Ci0JLy8gfQotCS8vCQkKLQkvLyBNZXRob2RQbHVnaW4gcGx1Z2luID0gTGlicmFyeVV0aWwuZ2V0TWV0aG9kUGx1Z2luKGVsZW1lbnQpOwotCS8vIGlmICggcGx1Z2luID09IG51bGwgKSB7Ci0JLy8gcmV0dXJuIGZhbHNlOwotCS8vIH0KLQkvLwkJCi0JLy8gcmV0dXJuIFRuZ1V0aWwuZ2V0QWxsU3lzdGVtUGFja2FnZXMocGx1Z2luKS5jb250YWlucyhlbGVtZW50KTsKLQkvLwkJCi0JLy8gfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQveG1sL3NlcnZpY2VzL0ZlYXR1cmVNYW5hZ2VyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC94bWwvc2VydmljZXMvRmVhdHVyZU1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGUyZTU4Yy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC94bWwvc2VydmljZXMvRmVhdHVyZU1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC5zZXJ2aWNlczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlRyZWVNYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzaWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FeHRlbmRlZE1ldGFEYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hRmFjdG9yeTsKLQotCi0vKioKLSAqIG1hbmFnZSB0aGUgZmVhdHVyZXMgb2YgRUNsYXNzLgotICogbWFpbnRhaW5zIGEgbWFwIG9mIGZlYXR1cmUgbmFtZSB0byB0aGUgRVN0cnVjdHVyYWxGZWF0dXJlIG9iamVjdCBmb3IgZWFzaWVyIGFjY2VzcwotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICoKLSAqLwotcHVibGljIGNsYXNzIEZlYXR1cmVNYW5hZ2VyIHsKLQotCXB1YmxpYyBzdGF0aWMgRmVhdHVyZU1hbmFnZXIgSU5TVEFOQ0UgPSBuZXcgRmVhdHVyZU1hbmFnZXIoKTsKLQkKLQkvL3ByaXZhdGUgTWFwIGNsYXNzTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkKLQkvLyBtYXAgb2YgdW1hIGZlYXR1cmUgbmFtZSB0byB0aGUgY29ycmVzcG9uZGluZyB4bWwgZmVhdHVyZSBuYW1lCi0JcHJpdmF0ZSBNYXAgZmVhdHVyZU5hbWVNYXAgPSBuZXcgVHJlZU1hcCgpOwotCQotCS8vIHVtYSBmZWF0dXJlcyB0aGF0IHNob3VsZCBiZSBpZ25vcmVkCi0JcHJpdmF0ZSBMaXN0IHVubmVlZGVkUm1jRmVhdHVyZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkvLyB4bWwgZmVhdHVyZXMgdGhhdCBjYW4gYmUgaWdub3JlZAotCXByaXZhdGUgTGlzdCB1bm5lZWRlZFhtbEZlYXR1cmVzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JLy8gbWFwIG9mIEVDbGFzcyBuYW1lIHRvIEVDbGFzcyBPYmplY3QgZm9yIHhtbCBtb2RlbAotCS8vIG5vdGU6IHdlIGNhbid0IHVzZSBmZWF0dXJlLmdldEVUeXBlKCkgdG8gZ2V0IHRoZSBFQ2xhc3MgZnJvbSBmZWF0dXJlCi0JLy8gdGhlIHByb2JsZW0gaXMgdGhlIGFib3ZlIHJldHVybmVkIEVDbGFzcyBtYXkgbm90IGJlIHRoZSBjb25jcmVhdGUgRUNsYXNzLCBpbnN0ZWFkLCBpdCBpcyB0aGUgYmFzZSBjbGFzcwotCS8vIGZvciBleGFtcGxlLCBpdCByZXR1cm5zIE1ldGhvZFBhY2thZ2UgaW5zdGVhZCBvZiBQcm9jZXNzUGFja2FnZSBvciBDb250ZW50UGFja2FnZQotCS8vIHNvIHdlIGhhdmUgdG8gbWFpbnRhaW4gYSBtYXAgbWFudWFsbHkKLQlwcml2YXRlIE1hcCB4bWxFQ2xhc3NNYXAgPSBuZXcgVHJlZU1hcCgpOwotCQotCS8vIG1hcCBvZiBFY2xhcyBuYW1lIHRvIEVDbGFzcyBvYmplY3QgZm9yIHVtYSBtb2RlbAotCXByaXZhdGUgTWFwIHVtYUVDbGFzc01hcCA9IG5ldyBUcmVlTWFwKCk7Ci0JCi0JcHJpdmF0ZSBGZWF0dXJlTWFuYWdlcigpIHsKLQkJCi0JCWZlYXR1cmVOYW1lTWFwLnB1dCgiT3B0aW9uYWxJbnB1dFRvIiwgIm9wdGlvbmFsSW5wdXRUbyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJZmVhdHVyZU5hbWVNYXAucHV0KCJSb2xlIiwgInJvbGUiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWZlYXR1cmVOYW1lTWFwLnB1dCgiVGFzayIsICJ0YXNrIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlmZWF0dXJlTmFtZU1hcC5wdXQoImFjdGl2aXR5UmVmZXJlbmNlcyIsICJhY3Rpdml0eVJlZmVyZW5jZSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJZmVhdHVyZU5hbWVNYXAucHV0KCJhZ2dyZWdhdGVkUm9sZXMiLCAiYWdncmVnYXRlZFJvbGUiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWZlYXR1cmVOYW1lTWFwLnB1dCgiYXNzZXRzIiwgInJldXNhYmxlQXNzZXQiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWZlYXR1cmVOYW1lTWFwLnB1dCgiYXR0YWNobWVudHMiLCAiYXR0YWNobWVudCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJZmVhdHVyZU5hbWVNYXAucHV0KCJiYXNlQ29uZmlndXJhdGlvbnMiLCAiYmFzZUNvbmZpZ3VyYXRpb24iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWZlYXR1cmVOYW1lTWFwLnB1dCgiYmFzZWRPblByb2Nlc3NlcyIsICJiYXNlUHJvY2VzcyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJZmVhdHVyZU5hbWVNYXAucHV0KCJiYXNlcyIsICJyZWZlcmVuY2VkTWV0aG9kUGx1Z2luIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlmZWF0dXJlTmFtZU1hcC5wdXQoImJvZHkiLCAibWFpbkRlc2NyaXB0aW9uIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlmZWF0dXJlTmFtZU1hcC5wdXQoImJyZWFrZG93bkVsZW1lbnRzIiwgImJyZWFrZG93bkVsZW1lbnQiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWZlYXR1cmVOYW1lTWFwLnB1dCgiY2F0ZWdvcml6ZWRFbGVtZW50cyIsICJjYXRlZ29yaXplZEVsZW1lbnQiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWZlYXR1cmVOYW1lTWFwLnB1dCgiY2hlY2tsaXN0cyIsICJjaGVja2xpc3QiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWZlYXR1cmVOYW1lTWFwLnB1dCgiY2hpbGRQYWNrYWdlcyIsICJtZXRob2RQYWNrYWdlIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlmZWF0dXJlTmFtZU1hcC5wdXQoImNvbW11bmljYXRpb25zTWF0ZXJpYWxzIiwgImNvbW11bmljYXRpb25zTWF0ZXJpYWwiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWZlYXR1cmVOYW1lTWFwLnB1dCgiY29uY2VwdHMiLCAiY29uY2VwdCx3aGl0ZXBhcGVyIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlmZWF0dXJlTmFtZU1hcC5wdXQoImNvbmNlcHRzQW5kUGFwZXJzIiwgImNvbmNlcHQsd2hpdGVwYXBlciIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJZmVhdHVyZU5hbWVNYXAucHV0KCJjb250YWluZWRBcnRpZmFjdHMiLCAiY29udGFpbmVkQXJ0aWZhY3QiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWZlYXR1cmVOYW1lTWFwLnB1dCgiY29udGVudEVsZW1lbnRzIiwgImNvbnRlbnRFbGVtZW50Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlmZWF0dXJlTmFtZU1hcC5wdXQoImNvbnRlbnRSZWZlcmVuY2VzIiwgImNvbnRlbnRSZWZlcmVuY2UiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWZlYXR1cmVOYW1lTWFwLnB1dCgiY29weXJpZ2h0U3RhdGVtZW50IiwgImNvcHlyaWdodCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJZmVhdHVyZU5hbWVNYXAucHV0KCJkZWxpdmVyZWRXb3JrUHJvZHVjdHMiLCAiZGVsaXZlcmVkV29ya1Byb2R1Y3QiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWZlYXR1cmVOYW1lTWFwLnB1dCgiZGlzY2lwbGluZXMiLCAiZGlzY2lwbGluZSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJZmVhdHVyZU5hbWVNYXAucHV0KCJlZHVjYXRpb25NYXRlcmlhbHMiLCAiZWR1Y2F0aW9uTWF0ZXJpYWwiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWZlYXR1cmVOYW1lTWFwLnB1dCgiZXN0aW1hdGlvbkNvbmRlcmF0aW9ucyIsICJlc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWZlYXR1cmVOYW1lTWFwLnB1dCgiZXhhbXBsZXMiLCAiZXhhbXBsZSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJZmVhdHVyZU5hbWVNYXAucHV0KCJndWlkIiwgImlkIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlmZWF0dXJlTmFtZU1hcC5wdXQoImd1aWRlbGluZXMiLCAiZ3VpZGVsaW5lIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlmZWF0dXJlTmFtZU1hcC5wdXQoImhvd3RvU3RhZmYiLCAiaG93VG9TdGFmZiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJZmVhdHVyZU5hbWVNYXAucHV0KCJpbmNsdWRlc1BhdHRlcm5zIiwgImluY2x1ZGVzUGF0dGVybiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJZmVhdHVyZU5hbWVNYXAucHV0KCJpbnRlcmZhY2VzIiwgImludGVyZmFjZSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJZmVhdHVyZU5hbWVNYXAucHV0KCJsaW5rVG9QcmVkZWNlc3NvciIsICJwcmVkZWNlc3NvciIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJZmVhdHVyZU5hbWVNYXAucHV0KCJtZXRob2RQYWNrYWdlcyIsICJtZXRob2RQYWNrYWdlIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlmZWF0dXJlTmFtZU1hcC5wdXQoIm1ldGhvZFBsdWdpbnMiLCAibWV0aG9kUGx1Z2luIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlmZWF0dXJlTmFtZU1hcC5wdXQoIm93bmVkUnVsZXMiLCAib3duZWRSdWxlIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlmZWF0dXJlTmFtZU1hcC5wdXQoInByZWRlZmluZWRDb25maWd1cmF0aW9ucyIsICJtZXRob2RDb25maWd1cmF0aW9uIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlmZWF0dXJlTmFtZU1hcC5wdXQoInByb2Nlc3NFbGVtZW50cyIsICJwcm9jZXNzRWxlbWVudCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJZmVhdHVyZU5hbWVNYXAucHV0KCJwcm9jZXNzVmlld3MiLCAicHJvY2Vzc1ZpZXciKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWZlYXR1cmVOYW1lTWFwLnB1dCgicmVmZXJlbmNlV29ya2Zsb3dzIiwgInJlZmVyZW5jZVdvcmtmbG93Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlmZWF0dXJlTmFtZU1hcC5wdXQoInJlcG9ydHMiLCAicmVwb3J0Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlmZWF0dXJlTmFtZU1hcC5wdXQoInJldXNhYmxlQXNzZXRzIiwgInJldXNhYmxlQXNzZXQiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWZlYXR1cmVOYW1lTWFwLnB1dCgicmV1c2VkUGFja2FnZXMiLCAicmV1c2VkUGFja2FnZSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJZmVhdHVyZU5hbWVNYXAucHV0KCJyb2FkbWFwcyIsICJyb2FkbWFwIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlmZWF0dXJlTmFtZU1hcC5wdXQoInJvbGVTZXRzIiwgInJvbGVTZXQiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWZlYXR1cmVOYW1lTWFwLnB1dCgicm9sZXMiLCAicm9sZSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJZmVhdHVyZU5hbWVNYXAucHV0KCJzZWN0aW9uRGVzY3JpcHRpb24iLCAiZGVzY3JpcHRpb24iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWZlYXR1cmVOYW1lTWFwLnB1dCgic2VjdGlvbnMiLCAic2VjdGlvbiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJZmVhdHVyZU5hbWVNYXAucHV0KCJzZWxlY3RlZFN0ZXBzIiwgInN0ZXAiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWZlYXR1cmVOYW1lTWFwLnB1dCgic3ViQ2F0ZWdvcmllcyIsICJzdWJDYXRlZ29yeSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJZmVhdHVyZU5hbWVNYXAucHV0KCJzdWJkaXNjaXBsaW5lIiwgInN1YkRpc2NpcGxpbmUiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWZlYXR1cmVOYW1lTWFwLnB1dCgic3ViUHJhY3RpY2VzIiwgInN1YlByYWN0aWNlIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlmZWF0dXJlTmFtZU1hcC5wdXQoInN1YlNlY3Rpb25zIiwgInN1YlNlY3Rpb24iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWZlYXR1cmVOYW1lTWFwLnB1dCgic3ViZG9tYWlucyIsICJzdWJkb21haW4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWZlYXR1cmVOYW1lTWFwLnB1dCgic3VwZXJBY3Rpdml0aWVzIiwgInN1cGVyQWN0aXZpdHkiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWZlYXR1cmVOYW1lTWFwLnB1dCgic3VwcG9ydGluZ01hdGVyaWFscyIsICJzdXBwb3J0aW5nTWF0ZXJpYWwiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWZlYXR1cmVOYW1lTWFwLnB1dCgidGFza3MiLCAidGFzayIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJZmVhdHVyZU5hbWVNYXAucHV0KCJ0ZWFtUm9sZXMiLCAicm9sZSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJZmVhdHVyZU5hbWVNYXAucHV0KCJ0ZW1wbGF0ZXMiLCAidGVtcGxhdGUiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWZlYXR1cmVOYW1lTWFwLnB1dCgidG9vbE1lbnRvcnMiLCAidG9vbE1lbnRvciIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJZmVhdHVyZU5hbWVNYXAucHV0KCJXb3JrUHJvZHVjdCIsICJ3b3JrUHJvZHVjdCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJZmVhdHVyZU5hbWVNYXAucHV0KCJ3b3JrUHJvZHVjdHMiLCAid29ya1Byb2R1Y3QiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWZlYXR1cmVOYW1lTWFwLnB1dCgicHJlZCIsICJ2YWx1ZSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJZmVhdHVyZU5hbWVNYXAucHV0KCJtZXRob2RFbGVtZW50UHJvcGVydHkiLCAibWV0aG9kRWxlbWVudFByb3BlcnR5Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlmZWF0dXJlTmFtZU1hcC5wdXQoInJlcXVpcmVkUmVzdWx0cyIsICJyZXF1aXJlZFJlc3VsdCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJZmVhdHVyZU5hbWVNYXAucHV0KCJmdWxmaWxscyIsICJmdWxmaWxsIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkKLQkJdW5uZWVkZWRSbWNGZWF0dXJlcy5hZGQoImNvbnRhaW5lckFydGlmYWN0Iik7IC8vJE5PTi1OTFMtMSQKLQkJdW5uZWVkZWRSbWNGZWF0dXJlcy5hZGQoIm1vZGlmaWVzIik7IC8vJE5PTi1OTFMtMSQKLQkJdW5uZWVkZWRSbWNGZWF0dXJlcy5hZGQoInBhcmVudFBhY2thZ2UiKTsgLy8kTk9OLU5MUy0xJAotCQl1bm5lZWRlZFJtY0ZlYXR1cmVzLmFkZCgiZGlhZ3JhbXMiKTsgLy8kTk9OLU5MUy0xJAotCQl1bm5lZWRlZFJtY0ZlYXR1cmVzLmFkZCgibW9kaWZpZXMiKTsgLy8kTk9OLU5MUy0xJAotCQl1bm5lZWRlZFJtY0ZlYXR1cmVzLmFkZCgic3RlcHMiKTsgLy8kTk9OLU5MUy0xJAotCQl1bm5lZWRlZFJtY0ZlYXR1cmVzLmFkZCgid29ya2VkT25CeSIpOyAvLyROT04tTkxTLTEkCi0JCXVubmVlZGVkUm1jRmVhdHVyZXMuYWRkKCJkaWFncmFtcyIpOyAvLyROT04tTkxTLTEkCi0JCQotCQl1bm5lZWRlZFhtbEZlYXR1cmVzLmFkZCgiZ3JvdXAiKTsgLy8kTk9OLU5MUy0xJAotCQl1bm5lZWRlZFhtbEZlYXR1cmVzLmFkZCgiZ3JvdXAxIik7IC8vJE5PTi1OTFMtMSQKLQkJdW5uZWVkZWRYbWxGZWF0dXJlcy5hZGQoImdyb3VwMiIpOyAvLyROT04tTkxTLTEkCi0JCXVubmVlZGVkWG1sRmVhdHVyZXMuYWRkKCJwcmVkZWNlc3NvcjEiKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJbG9hZFhtbENsYXNzZXMoKTsKLQkJbG9hZFJtY0NsYXNzZXMoKTsKLQkJCi0vLwkJLy8gcHJpbnQgb3V0IHRoZSBFQ2xhc3NlcyBhbmQgZmVhdHVyZSBtYXAsIGZvciB0ZXN0aW5nIHB1cnBvc2UKLS8vCQkvLyBkb24ndCBkZWxldGUgdGhpcyBjb2RlIHNlZ21lbnQKLS8vCQlTeXN0ZW0ub3V0LnByaW50bG4oIj09PT09PT09PT09PSBMb2FkaW5nIEVDbGFzc2VzIGZvciBYTUwgVW1hIG1vZGVsID09PT09PT09PT09PT09PT09Iik7Ci0vLwkJZm9yIChJdGVyYXRvciBpdCA9IHhtbEVDbGFzc01hcC5rZXlTZXQoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7ICkgewotLy8JCQlTeXN0ZW0ub3V0LnByaW50bG4oIlx0IiArIGl0Lm5leHQoKSk7CQkJCi0vLwkJfQotLy8JCVN5c3RlbS5vdXQucHJpbnRsbigiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0iKTsKLS8vCi0vLwkJZm9yIChJdGVyYXRvciBpdCA9IGZlYXR1cmVOYW1lTWFwLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOyApIHsKLS8vCQkJTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSkgaXQubmV4dCgpOwotLy8JCQlTdHJpbmcga2V5ID0gKFN0cmluZyllbnRyeS5nZXRLZXkoKTsKLS8vCQkJU3RyaW5nIHZhbHVlID0gKFN0cmluZyllbnRyeS5nZXRWYWx1ZSgpOwotLy8JCQlpZiAodmFsdWUgIT0gbnVsbCAmJiB2YWx1ZS5sZW5ndGgoKSA+IDAgKSB7Ci0vLwkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlx0ZmVhdHVyZU5hbWVNYXAucHV0KFwiIiArIGtleSArICJcIiwgXCIiICsgdmFsdWUgKyAiXCIpOyIpOwkKLS8vCQkJfQotLy8JCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGxvYWRSbWNDbGFzc2VzKCkgewotCQkKLQkJLy8gbG9hZCBFQ2xhc3MgbWFwCi0JCWxvYWRNb2RlbENsYXNzZXModW1hRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEFjdGl2aXR5KCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHVtYUVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRBY3Rpdml0eURlc2NyaXB0aW9uKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHVtYUVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRBcnRpZmFjdCgpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh1bWFFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QXJ0aWZhY3REZXNjcmlwdGlvbigpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh1bWFFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QnJlYWtkb3duRWxlbWVudCgpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh1bWFFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHVtYUVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRDYXBhYmlsaXR5UGF0dGVybigpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh1bWFFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q2hlY2tsaXN0KCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHVtYUVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb21wb3NpdGVSb2xlKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHVtYUVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb25jZXB0KCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHVtYUVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb25zdHJhaW50KCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHVtYUVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb250ZW50Q2F0ZWdvcnkoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXModW1hRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbnRlbnREZXNjcmlwdGlvbigpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh1bWFFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29udGVudEVsZW1lbnQoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXModW1hRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbnRlbnRQYWNrYWdlKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHVtYUVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRDdXN0b21DYXRlZ29yeSgpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh1bWFFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RGVsaXZlcmFibGUoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXModW1hRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldERlbGl2ZXJhYmxlRGVzY3JpcHRpb24oKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXModW1hRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldERlbGl2ZXJ5UHJvY2VzcygpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh1bWFFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24oKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXModW1hRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldERlc2NyaWJhYmxlRWxlbWVudCgpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh1bWFFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RGVzY3JpcHRvcigpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh1bWFFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RGVzY3JpcHRvckRlc2NyaXB0aW9uKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHVtYUVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXREaXNjaXBsaW5lKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHVtYUVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXREaXNjaXBsaW5lR3JvdXBpbmcoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXModW1hRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldERvbWFpbigpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh1bWFFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHVtYUVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRFeGFtcGxlKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHVtYUVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRHdWlkYW5jZSgpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh1bWFFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0R3VpZGFuY2VEZXNjcmlwdGlvbigpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh1bWFFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0R3VpZGVsaW5lKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHVtYUVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRJdGVyYXRpb24oKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXModW1hRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE1ldGhvZENvbmZpZ3VyYXRpb24oKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXModW1hRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE1ldGhvZEVsZW1lbnQoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXModW1hRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE1ldGhvZExpYnJhcnkoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXModW1hRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE1ldGhvZFBhY2thZ2UoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXModW1hRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE1ldGhvZFBsdWdpbigpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh1bWFFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWV0aG9kVW5pdCgpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh1bWFFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWlsZXN0b25lKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHVtYUVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXROYW1lZEVsZW1lbnQoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXModW1hRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE91dGNvbWUoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXModW1hRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFBhY2thZ2VhYmxlRWxlbWVudCgpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh1bWFFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UGhhc2UoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXModW1hRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFBsYW5uaW5nRGF0YSgpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh1bWFFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UHJhY3RpY2UoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXModW1hRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFByYWN0aWNlRGVzY3JpcHRpb24oKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXModW1hRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFByb2Nlc3MoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXModW1hRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFByb2Nlc3NDb21wb25lbnQoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXModW1hRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXModW1hRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFByb2Nlc3NEZXNjcmlwdGlvbigpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh1bWFFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UHJvY2Vzc0VsZW1lbnQoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXModW1hRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFByb2Nlc3NQYWNrYWdlKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHVtYUVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSgpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh1bWFFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UmVwb3J0KCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHVtYUVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRSZXVzYWJsZUFzc2V0KCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHVtYUVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRSb2FkbWFwKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHVtYUVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRSb2xlKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHVtYUVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRSb2xlRGVzY3JpcHRpb24oKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXModW1hRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFJvbGVEZXNjcmlwdG9yKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHVtYUVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRSb2xlU2V0KCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHVtYUVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRSb2xlU2V0R3JvdXBpbmcoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXModW1hRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFNlY3Rpb24oKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXModW1hRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFN1cHBvcnRpbmdNYXRlcmlhbCgpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh1bWFFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFzaygpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh1bWFFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza0Rlc2NyaXB0aW9uKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHVtYUVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrRGVzY3JpcHRvcigpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh1bWFFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGVhbVByb2ZpbGUoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXModW1hRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRlbXBsYXRlKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHVtYUVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUZXJtRGVmaW5pdGlvbigpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh1bWFFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VG9vbCgpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh1bWFFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VG9vbE1lbnRvcigpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh1bWFFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V2hpdGVwYXBlcigpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh1bWFFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V29ya0JyZWFrZG93bkVsZW1lbnQoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXModW1hRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFdvcmtEZWZpbml0aW9uKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHVtYUVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRXb3JrT3JkZXIoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXModW1hRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFdvcmtQcm9kdWN0KCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHVtYUVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRXb3JrUHJvZHVjdERlc2NyaXB0aW9uKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHVtYUVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRXb3JrUHJvZHVjdERlc2NyaXB0b3IoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXModW1hRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFdvcmtQcm9kdWN0VHlwZSgpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh1bWFFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWV0aG9kRWxlbWVudFByb3BlcnR5KCkpOwkKLQl9Ci0JCi0JCi0JcHJpdmF0ZSB2b2lkIGxvYWRYbWxDbGFzc2VzKCkgewotCQkKLQkJLy8gbG9hZCBFQ2xhc3MgbWFwCi0JCWxvYWRNb2RlbENsYXNzZXMoeG1sRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRBY3Rpdml0eSgpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh4bWxFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEFjdGl2aXR5RGVzY3JpcHRpb24oKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXMoeG1sRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRBcnRpZmFjdCgpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh4bWxFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEFydGlmYWN0RGVzY3JpcHRpb24oKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXMoeG1sRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRCcmVha2Rvd25FbGVtZW50KCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHhtbEVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHhtbEVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q2FwYWJpbGl0eVBhdHRlcm4oKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXMoeG1sRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRDaGVja2xpc3QoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXMoeG1sRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb21wb3NpdGVSb2xlKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHhtbEVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29uY2VwdCgpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh4bWxFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbnN0cmFpbnQoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXMoeG1sRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb250ZW50Q2F0ZWdvcnkoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXMoeG1sRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb250ZW50Q2F0ZWdvcnlQYWNrYWdlKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHhtbEVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29udGVudERlc2NyaXB0aW9uKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHhtbEVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29udGVudEVsZW1lbnQoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXMoeG1sRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb250ZW50UGFja2FnZSgpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh4bWxFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEN1c3RvbUNhdGVnb3J5KCkpOwotLy8JCWxvYWRNb2RlbENsYXNzZXMoeG1sRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRDYXRlZ29yeVR5cGUoKSk7Ci0vLwkJbG9hZE1vZGVsQ2xhc3Nlcyh4bWxFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldENhdGVnb3J5VHlwZU9iamVjdCgpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh4bWxFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldERlbGl2ZXJhYmxlKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHhtbEVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RGVsaXZlcmFibGVEZXNjcmlwdGlvbigpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh4bWxFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldERlbGl2ZXJ5UHJvY2VzcygpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh4bWxFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHhtbEVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RGVzY3JpYmFibGVFbGVtZW50KCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHhtbEVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RGVzY3JpcHRvcigpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh4bWxFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldERlc2NyaXB0b3JEZXNjcmlwdGlvbigpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh4bWxFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldERpc2NpcGxpbmUoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXMoeG1sRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXREaXNjaXBsaW5lR3JvdXBpbmcoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXMoeG1sRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXREb21haW4oKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXMoeG1sRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRFc3RpbWF0ZSgpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh4bWxFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEVzdGltYXRpbmdNZXRyaWMoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXMoeG1sRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXMoeG1sRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRFeGFtcGxlKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHhtbEVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0R3VpZGFuY2UoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXMoeG1sRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRHdWlkYW5jZURlc2NyaXB0aW9uKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHhtbEVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0R3VpZGVsaW5lKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHhtbEVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SXRlcmF0aW9uKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHhtbEVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWV0aG9kQ29uZmlndXJhdGlvbigpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh4bWxFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE1ldGhvZEVsZW1lbnQoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXMoeG1sRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRNZXRob2RMaWJyYXJ5KCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHhtbEVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWV0aG9kUGFja2FnZSgpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh4bWxFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE1ldGhvZFBsdWdpbigpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh4bWxFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE1ldGhvZFVuaXQoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXMoeG1sRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRNaWxlc3RvbmUoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXMoeG1sRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXROYW1lZEVsZW1lbnQoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXMoeG1sRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRPdXRjb21lKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHhtbEVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UGFja2FnZWFibGVFbGVtZW50KCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHhtbEVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UGhhc2UoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXMoeG1sRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRQbGFubmluZ0RhdGEoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXMoeG1sRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRQcmFjdGljZSgpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh4bWxFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFByYWN0aWNlRGVzY3JpcHRpb24oKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXMoeG1sRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRQcm9jZXNzKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHhtbEVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UHJvY2Vzc0NvbXBvbmVudCgpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh4bWxFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXMoeG1sRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRQcm9jZXNzRGVzY3JpcHRpb24oKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXMoeG1sRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRQcm9jZXNzRWxlbWVudCgpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh4bWxFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFByb2Nlc3NQYWNrYWdlKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHhtbEVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXMoeG1sRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRSZXBvcnQoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXMoeG1sRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRSZXVzYWJsZUFzc2V0KCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHhtbEVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Um9hZG1hcCgpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh4bWxFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFJvbGUoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXMoeG1sRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRSb2xlRGVzY3JpcHRpb24oKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXMoeG1sRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRSb2xlRGVzY3JpcHRvcigpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh4bWxFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFJvbGVTZXQoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXMoeG1sRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRSb2xlU2V0R3JvdXBpbmcoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXMoeG1sRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRTZWN0aW9uKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHhtbEVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U3VwcG9ydGluZ01hdGVyaWFsKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHhtbEVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFzaygpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh4bWxFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tEZXNjcmlwdGlvbigpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh4bWxFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tEZXNjcmlwdG9yKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHhtbEVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGVhbVByb2ZpbGUoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXMoeG1sRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUZW1wbGF0ZSgpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh4bWxFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRlcm1EZWZpbml0aW9uKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHhtbEVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VG9vbCgpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh4bWxFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRvb2xNZW50b3IoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXMoeG1sRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRXaGl0ZXBhcGVyKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHhtbEVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V29ya0JyZWFrZG93bkVsZW1lbnQoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXMoeG1sRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRXb3JrRGVmaW5pdGlvbigpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh4bWxFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFdvcmtPcmRlcigpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh4bWxFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFdvcmtQcm9kdWN0KCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHhtbEVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V29ya1Byb2R1Y3REZXNjcmlwdGlvbigpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh4bWxFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcigpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh4bWxFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFdvcmtQcm9kdWN0VHlwZSgpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh4bWxFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE1ldGhvZEVsZW1lbnRQcm9wZXJ0eSgpKTsJCi0JfQotCQotCXByaXZhdGUgdm9pZCBsb2FkTW9kZWxDbGFzc2VzKE1hcCBjbGFzc01hcCwgRUNsYXNzIGNsYXp6KSB7Ci0KLQkJU3RyaW5nIG5hbWUgPSBjbGF6ei5nZXROYW1lKCk7Ci0JCWlmKCBjbGFzc01hcC5jb250YWluc0tleShuYW1lKSApIHsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJY2xhc3NNYXAucHV0KG5hbWUsIGNsYXp6KTsKLQkJCQotCQkvL2ZvciAoSXRlcmF0b3IgaXQgPSBjbGF6ei5nZXRFQWxsU3RydWN0dXJhbEZlYXR1cmVzKCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOyApIHsKLQkJZm9yIChJdGVyYXRvciBlbGVtZW50cyA9IEV4dGVuZGVkTWV0YURhdGEuSU5TVEFOQ0UuZ2V0QWxsRWxlbWVudHMoY2xhenopLml0ZXJhdG9yKCk7IAotCQkJCWVsZW1lbnRzLmhhc05leHQoKTsgKSB7Ci0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZVN0cnVjdHVyYWxGZWF0dXJlID0gKEVTdHJ1Y3R1cmFsRmVhdHVyZSllbGVtZW50cy5uZXh0KCk7Ci0JCQlFQ2xhc3NpZmllciBlQ2xhc3NpZmllciA9IGVTdHJ1Y3R1cmFsRmVhdHVyZS5nZXRFVHlwZSgpOwotCQkJaWYgKGVDbGFzc2lmaWVyIGluc3RhbmNlb2YgRUNsYXNzKSB7Ci0JCQkJRUNsYXNzIGVDbGFzcyA9IChFQ2xhc3MpZUNsYXNzaWZpZXI7CQkJCQotCQkJCS8vIHJlY3Vyc2l2ZWx5IGZpbmQgdGhlIG5lc3RlZHQgZmVhdHVyZXMKLQkJCQlsb2FkTW9kZWxDbGFzc2VzKGNsYXNzTWFwLCBlQ2xhc3MpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGNsYXp6Ci0JICogQHBhcmFtIHVtYUZlYXR1cmVOYW1lCi0JICogQHJldHVybiB0aGUgY29ycmVzcG9uZGluZyB4bWwgZmVhdHVyZS4KLQkgKi8KLQlwdWJsaWMgRVN0cnVjdHVyYWxGZWF0dXJlIGdldFhtbEZlYXR1cmUoRUNsYXNzIGNsYXp6LCBTdHJpbmcgdW1hRmVhdHVyZU5hbWUpIHsKLQkJcmV0dXJuIGdldFhtbEZlYXR1cmUoY2xhenosIHVtYUZlYXR1cmVOYW1lLCBudWxsKTsKLQl9Ci0JCi0JLyoqCi0JICogQHBhcmFtIHVtYUNsYXp6Ci0JICogQHBhcmFtIHhtbEZlYXR1cmVOYW1lCi0JICogQHJldHVybiB0aGUgY29ycmVzcG9uZGluZyBFU3RydWN0dXJhbEZlYXR1cmUgb2JqZWN0LgotCSAqLwotCXB1YmxpYyBFU3RydWN0dXJhbEZlYXR1cmUgZ2V0Um1jRmVhdHVyZShFQ2xhc3MgdW1hQ2xhenosIFN0cmluZyB4bWxGZWF0dXJlTmFtZSkgewotCQlmb3IgKCBJdGVyYXRvciBpdCA9IHVtYUNsYXp6LmdldEVBbGxTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7ICkKLQkJewotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSAoRVN0cnVjdHVyYWxGZWF0dXJlKWl0Lm5leHQoKTsKLQkJCVN0cmluZyB1bWFGZWF0dXJlbmFtZSA9IGZlYXR1cmUuZ2V0TmFtZSgpOwotCQkJCi0JCQkvLyBpZiB0aGUgZmVhdHVyZSBuYW1lIGlzIHRoZSBzYW1lLCBnb3QgaXQKLQkJCWlmICggdW1hRmVhdHVyZW5hbWUuZXF1YWxzKHhtbEZlYXR1cmVOYW1lKSApIHsKLQkJCQlyZXR1cm4gZmVhdHVyZTsKLQkJCX0KLQkJCQotCQkJLy8gY2hlY2sgaWYgdGhlIGZlYXR1cmUgbmFtZSBpcyBtYXBwZWQgdG8gYW5vdGhlciB4bWwgZmVhdHVyZSBuYW1lCi0JCQlTdHJpbmcgZmVhdHVyZU5hbWUgPSAoU3RyaW5nKWZlYXR1cmVOYW1lTWFwLmdldCh1bWFGZWF0dXJlbmFtZSk7Ci0JCQlpZiAoIGZlYXR1cmVOYW1lICE9IG51bGwgKSB7Ci0JCQkJaW50IGkgPSBmZWF0dXJlTmFtZS5pbmRleE9mKCIsIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlpZiAoIGkgPiAwICkgewotCQkJCQlpZiAoIGZlYXR1cmVOYW1lLnN1YnN0cmluZygwLGkpLmVxdWFscyh4bWxGZWF0dXJlTmFtZSkgfHwgCi0JCQkJCQkgZmVhdHVyZU5hbWUuc3Vic3RyaW5nKGkrMSkuZXF1YWxzKHhtbEZlYXR1cmVOYW1lKQkpIHsKLQkJCQkJCXJldHVybiBmZWF0dXJlOwotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJaWYgKCBmZWF0dXJlTmFtZS5lcXVhbHMoeG1sRmVhdHVyZU5hbWUpICkgewotCQkJCQkJcmV0dXJuIGZlYXR1cmU7Ci0JCQkJCX0KLQkJCQl9CQkJCQotCQkJfQotCQl9Ci0KLQkJLy9TeXN0ZW0ub3V0LnByaW50KCJGZWF0dXJlTWFuYWdlcjogVW5hYmxlIHRvIGZpbmQgdW1hIGZlYXR1cmUgZm9yIHhtbCBmZWF0dXJlIiArIHhtbEZlYXR1cmVOYW1lKTsKLQkJCi0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKioKLQkgKiBAcGFyYW0gY2xhenoKLQkgKiBAcGFyYW0gdW1hRmVhdHVyZU5hbWUKLQkgKiBAcGFyYW0gb2JqZWN0VHlwZQotCSAqIEByZXR1cm4gdGhlIGNvcnJzcG9uZGluZyB4bWwgZmVhdHVyZS4KLQkgKi8KLQlwdWJsaWMgRVN0cnVjdHVyYWxGZWF0dXJlIGdldFhtbEZlYXR1cmUoRUNsYXNzIGNsYXp6LCBTdHJpbmcgdW1hRmVhdHVyZU5hbWUsIFN0cmluZyBvYmplY3RUeXBlKSB7Ci0KLQkJU3RyaW5nIGZlYXR1cmVOYW1lID0gdW1hRmVhdHVyZU5hbWU7Ci0JCWlmICggZmVhdHVyZU5hbWVNYXAuY29udGFpbnNLZXkoZmVhdHVyZU5hbWUpICkgewotCQkJZmVhdHVyZU5hbWUgPSAoU3RyaW5nKWZlYXR1cmVOYW1lTWFwLmdldChmZWF0dXJlTmFtZSk7Ci0JCQkKLQkJCS8vIGlmIHRoZSBmZWF0dXJlIGlzIG5vdCB1bmlxdWUsIHVzZSB0aGUgZmlyc3Qgb25lCi0JCQlpbnQgaSA9IGZlYXR1cmVOYW1lLmluZGV4T2YoIiwiKTsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKCBpID4gMCApIHsKLQkJCQlTdHJpbmcgbmFtZSA9IGZlYXR1cmVOYW1lLnN1YnN0cmluZygwLCBpKTsKLQkJCQlpZiAoIG9iamVjdFR5cGUgIT0gbnVsbCApIHsJCQkJCi0JCQkJCS8vIHBpY2sgdGhlIGZlYXR1cmUgYmFzZWQgb24gb2JqZWN0IHR5cGUKLQkJCQkJaWYgKCAhbmFtZS5lcXVhbHNJZ25vcmVDYXNlKG9iamVjdFR5cGUpICkgewotCQkJCQkJbmFtZSA9IGZlYXR1cmVOYW1lLnN1YnN0cmluZyhpKzEpOwotCQkJCQl9Ci0JCQkJCWlmICggIW5hbWUuZXF1YWxzSWdub3JlQ2FzZShvYmplY3RUeXBlKSApIHsKLQkJCQkJCW5hbWUgPSBudWxsOwotCQkJCQl9Ci0JCQkJfQotCQkJCQotCQkJCWZlYXR1cmVOYW1lID0gbmFtZTsKLQkJCX0KLQkJfQotCQkKLQkJaWYgKCBmZWF0dXJlTmFtZSA9PSBudWxsICkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJCi0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gY2xhenouZ2V0RVN0cnVjdHVyYWxGZWF0dXJlKGZlYXR1cmVOYW1lKTsKLQkJaWYgKCAoZmVhdHVyZT09bnVsbCkgJiYgKGNsYXp6LmdldE5hbWUoKS5lcXVhbHMoIkNvbnRlbnRDYXRlZ29yeVBhY2thZ2UiKSkgJiYgZmVhdHVyZU5hbWUuZXF1YWxzKCJjb250ZW50RWxlbWVudCIpICkgeyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCWZlYXR1cmUgPSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb250ZW50Q2F0ZWdvcnlQYWNrYWdlX0NvbnRlbnRDYXRlZ29yeSgpOwotCQl9Ci0KLS8vCQlpZiAoIGZlYXR1cmUgPT0gbnVsbCApIHsKLS8vCQkJU3lzdGVtLm91dC5wcmludGxuKCJObyB4bWwgZmVhdHVyZSAiICsgZmVhdHVyZU5hbWUgKyAiIGZvciBjbGFzcyAiICsgY2xhenouZ2V0TmFtZSgpKTsKLS8vCQl9Ci0JCQotCQlyZXR1cm4gZmVhdHVyZTsKLQl9Ci0JCi0JLyoqCi0JICogQHBhcmFtIHVtYUVDbGFzc05hbWUKLQkgKiBAcmV0dXJuIHRoZSBjb3JyZXNwb25kaW5nIHhtbCBlY2xhc3MKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFhtbEVDbGFzcyhTdHJpbmcgdW1hRUNsYXNzTmFtZSkgewotLy8JCUVDbGFzcyByb290Q2xhc3MgPSBFeHRlbmRlZE1ldGFEYXRhLklOU1RBTkNFLmdldERvY3VtZW50Um9vdChvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRSk7Ci0vLwkJRUNsYXNzIGVDbGFzcyA9IChFQ2xhc3Mpcm9vdENsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZSh1bWFFQ2xhc3NOYW1lKTsKLS8vCQlyZXR1cm4gZUNsYXNzOwotCQkKLQkJRUNsYXNzIGNscyA9IChFQ2xhc3MpeG1sRUNsYXNzTWFwLmdldCh1bWFFQ2xhc3NOYW1lKTsKLS8vCQlpZiAoIGNscyA9PSBudWxsICkgewotLy8JCQlTeXN0ZW0ub3V0LnByaW50bG4oIk5vIHhtbCBFQ2xhc3MgZm9yIHVtYSBjbGFzcyAiICsgdW1hRUNsYXNzTmFtZSk7Ci0vLwkJfQotCQkKLQkJcmV0dXJuIGNsczsKLQl9Ci0JCi0JLyoqCi0JICogQHBhcmFtIHhtbEVDbGFzc05hbWUKLQkgKiBAcmV0dXJuIHRoZSBjb3JyZXNwb25kaW5nIEVDbGFzcyBvYmplY3QuCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRSbWNFQ2xhc3MoU3RyaW5nIHhtbEVDbGFzc05hbWUpIHsKLQkJRUNsYXNzIGNscyA9IChFQ2xhc3MpdW1hRUNsYXNzTWFwLmdldCh4bWxFQ2xhc3NOYW1lKTsKLS8vCQlpZiAoIGNscyA9PSBudWxsICkgewotLy8JCQlTeXN0ZW0ub3V0LnByaW50bG4oIk5vIHVtYSBFQ2xhc3MgZm9yIHhtbCBjbGFzcyAiICsgeG1sRUNsYXNzTmFtZSk7Ci0vLwkJfQotCQkKLQkJcmV0dXJuIGNsczsKLQl9Ci0JCi0JLyoqCi0JICogQHBhcmFtIGZlYXR1cmVuYW1lCi0JICogQHJldHVybiB0cnVlIGlmIHRoZSBmZWF0dXJlIGlzIHVubmVlZGVkIGdpdmVuIGJ5IGZlYXR1cmVuYW1lLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzVW5uZWVkZWRSbWNGZWF0dXJlKFN0cmluZyBmZWF0dXJlbmFtZSkgewotCQlyZXR1cm4gdW5uZWVkZWRSbWNGZWF0dXJlcy5jb250YWlucyhmZWF0dXJlbmFtZSk7Ci0JfQotCQotCS8qKgotCSAqIEBwYXJhbSBmZWF0dXJlbmFtZQotCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgeG1sIGZlYXR1cmUgaXMgdW5uZWVkZWQgZ2l2ZW4gYnkgZmVhdHVyZW5hbWUuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNVbm5lZWRlZFhtbEZlYXR1cmUoU3RyaW5nIGZlYXR1cmVuYW1lKSB7Ci0JCXJldHVybiB1bm5lZWRlZFhtbEZlYXR1cmVzLmNvbnRhaW5zKGZlYXR1cmVuYW1lKTsKLQl9Ci0JCi0JLyoqCi0JICogUHJpbnRzIHRoZSBmZWF0dXJlLW5hbWUgbWFwLgotCSAqLwotCXB1YmxpYyB2b2lkIHByaW50RmVhdHVyZU5hbWVNYXBwaW5nKCkgewotCQlwcmludEZlYXR1cmUoVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQWN0aXZpdHkoKSwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQWN0aXZpdHkoKSk7Ci0JCXByaW50RmVhdHVyZShVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVBY3Rpdml0eURlc2NyaXB0aW9uKCksIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUFjdGl2aXR5RGVzY3JpcHRpb24oKSk7Ci0JCXByaW50RmVhdHVyZShVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVBcnRpZmFjdCgpLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVBcnRpZmFjdCgpKTsKLQkJcHJpbnRGZWF0dXJlKFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUFydGlmYWN0RGVzY3JpcHRpb24oKSwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQXJ0aWZhY3REZXNjcmlwdGlvbigpKTsKLQkJcHJpbnRGZWF0dXJlKFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbigpLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24oKSk7Ci0JCXByaW50RmVhdHVyZShVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVDYXBhYmlsaXR5UGF0dGVybigpLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVDYXBhYmlsaXR5UGF0dGVybigpKTsKLQkJcHJpbnRGZWF0dXJlKFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUNoZWNrbGlzdCgpLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVDaGVja2xpc3QoKSk7Ci0JCXByaW50RmVhdHVyZShVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVDb21wb3NpdGVSb2xlKCksIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUNvbXBvc2l0ZVJvbGUoKSk7Ci0JCXByaW50RmVhdHVyZShVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVDb25jZXB0KCksIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUNvbmNlcHQoKSk7Ci0JCXByaW50RmVhdHVyZShVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVDb25zdHJhaW50KCksIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUNvbnN0cmFpbnQoKSk7Ci0JCXByaW50RmVhdHVyZShVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVDb250ZW50RGVzY3JpcHRpb24oKSwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQ29udGVudERlc2NyaXB0aW9uKCkpOwotCQlwcmludEZlYXR1cmUoVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQ29udGVudFBhY2thZ2UoKSwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQ29udGVudFBhY2thZ2UoKSk7Ci0JCXByaW50RmVhdHVyZShVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVDdXN0b21DYXRlZ29yeSgpLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVDdXN0b21DYXRlZ29yeSgpKTsKLQkJcHJpbnRGZWF0dXJlKFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZURlbGl2ZXJhYmxlKCksIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZURlbGl2ZXJhYmxlKCkpOwotCQlwcmludEZlYXR1cmUoVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRGVsaXZlcmFibGVEZXNjcmlwdGlvbigpLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVEZWxpdmVyYWJsZURlc2NyaXB0aW9uKCkpOwotCQlwcmludEZlYXR1cmUoVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRGVsaXZlcnlQcm9jZXNzKCksIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZURlbGl2ZXJ5UHJvY2VzcygpKTsKLQkJcHJpbnRGZWF0dXJlKFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZURlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uKCksIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZURlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uKCkpOwotCQlwcmludEZlYXR1cmUoVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRGVzY3JpcHRvckRlc2NyaXB0aW9uKCksIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZURlc2NyaXB0b3JEZXNjcmlwdGlvbigpKTsKLQkJcHJpbnRGZWF0dXJlKFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZURpc2NpcGxpbmUoKSwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRGlzY2lwbGluZSgpKTsKLQkJcHJpbnRGZWF0dXJlKFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZURpc2NpcGxpbmVHcm91cGluZygpLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVEaXNjaXBsaW5lR3JvdXBpbmcoKSk7Ci0JCXByaW50RmVhdHVyZShVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVEb21haW4oKSwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRG9tYWluKCkpOwotCQlwcmludEZlYXR1cmUoVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKCksIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUVzdGltYXRpb25Db25zaWRlcmF0aW9ucygpKTsKLQkJcHJpbnRGZWF0dXJlKFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUV4YW1wbGUoKSwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRXhhbXBsZSgpKTsKLQkJcHJpbnRGZWF0dXJlKFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUd1aWRhbmNlRGVzY3JpcHRpb24oKSwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlR3VpZGFuY2VEZXNjcmlwdGlvbigpKTsKLQkJcHJpbnRGZWF0dXJlKFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUd1aWRlbGluZSgpLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVHdWlkZWxpbmUoKSk7Ci0JCXByaW50RmVhdHVyZShVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVJdGVyYXRpb24oKSwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlSXRlcmF0aW9uKCkpOwotCQlwcmludEZlYXR1cmUoVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlTWV0aG9kQ29uZmlndXJhdGlvbigpLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVNZXRob2RDb25maWd1cmF0aW9uKCkpOwotCQlwcmludEZlYXR1cmUoVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlTWV0aG9kTGlicmFyeSgpLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVNZXRob2RMaWJyYXJ5KCkpOwotCQlwcmludEZlYXR1cmUoVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlTWV0aG9kUGx1Z2luKCksIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZU1ldGhvZFBsdWdpbigpKTsKLQkJcHJpbnRGZWF0dXJlKFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZU1pbGVzdG9uZSgpLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVNaWxlc3RvbmUoKSk7Ci0JCXByaW50RmVhdHVyZShVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVPdXRjb21lKCksIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZU91dGNvbWUoKSk7Ci0JCXByaW50RmVhdHVyZShVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQaGFzZSgpLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQaGFzZSgpKTsKLQkJcHJpbnRGZWF0dXJlKFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVBsYW5uaW5nRGF0YSgpLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQbGFubmluZ0RhdGEoKSk7Ci0JCXByaW50RmVhdHVyZShVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQcmFjdGljZSgpLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQcmFjdGljZSgpKTsKLQkJcHJpbnRGZWF0dXJlKFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVByYWN0aWNlRGVzY3JpcHRpb24oKSwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUHJhY3RpY2VEZXNjcmlwdGlvbigpKTsKLQkJcHJpbnRGZWF0dXJlKFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVByb2Nlc3NDb21wb25lbnQoKSwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUHJvY2Vzc0NvbXBvbmVudCgpKTsKLQkJcHJpbnRGZWF0dXJlKFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVByb2Nlc3NEZXNjcmlwdGlvbigpLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQcm9jZXNzRGVzY3JpcHRpb24oKSk7Ci0JCXByaW50RmVhdHVyZShVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQcm9jZXNzUGFja2FnZSgpLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQcm9jZXNzUGFja2FnZSgpKTsKLQkJcHJpbnRGZWF0dXJlKFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVByb2Nlc3NQbGFubmluZ1RlbXBsYXRlKCksIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVByb2Nlc3NQbGFubmluZ1RlbXBsYXRlKCkpOwotCQlwcmludEZlYXR1cmUoVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUmVwb3J0KCksIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVJlcG9ydCgpKTsKLQkJcHJpbnRGZWF0dXJlKFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVJldXNhYmxlQXNzZXQoKSwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUmV1c2FibGVBc3NldCgpKTsKLQkJcHJpbnRGZWF0dXJlKFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVJvYWRtYXAoKSwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUm9hZG1hcCgpKTsKLQkJcHJpbnRGZWF0dXJlKFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVJvbGUoKSwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUm9sZSgpKTsKLQkJcHJpbnRGZWF0dXJlKFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVJvbGVEZXNjcmlwdGlvbigpLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVSb2xlRGVzY3JpcHRpb24oKSk7Ci0JCXByaW50RmVhdHVyZShVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVSb2xlRGVzY3JpcHRvcigpLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVSb2xlRGVzY3JpcHRvcigpKTsKLQkJcHJpbnRGZWF0dXJlKFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVJvbGVTZXQoKSwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUm9sZVNldCgpKTsKLQkJcHJpbnRGZWF0dXJlKFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVJvbGVTZXRHcm91cGluZygpLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVSb2xlU2V0R3JvdXBpbmcoKSk7Ci0JCXByaW50RmVhdHVyZShVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVTZWN0aW9uKCksIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVNlY3Rpb24oKSk7Ci0JCXByaW50RmVhdHVyZShVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVTdXBwb3J0aW5nTWF0ZXJpYWwoKSwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlU3VwcG9ydGluZ01hdGVyaWFsKCkpOwotCQlwcmludEZlYXR1cmUoVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlVGFzaygpLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVUYXNrKCkpOwotCQlwcmludEZlYXR1cmUoVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlVGFza0Rlc2NyaXB0aW9uKCksIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVRhc2tEZXNjcmlwdGlvbigpKTsKLQkJcHJpbnRGZWF0dXJlKFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVRhc2tEZXNjcmlwdG9yKCksIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVRhc2tEZXNjcmlwdG9yKCkpOwotCQlwcmludEZlYXR1cmUoVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlVGVhbVByb2ZpbGUoKSwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlVGVhbVByb2ZpbGUoKSk7Ci0JCXByaW50RmVhdHVyZShVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVUZW1wbGF0ZSgpLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVUZW1wbGF0ZSgpKTsKLQkJcHJpbnRGZWF0dXJlKFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVRlcm1EZWZpbml0aW9uKCksIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVRlcm1EZWZpbml0aW9uKCkpOwotCQlwcmludEZlYXR1cmUoVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlVG9vbCgpLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVUb29sKCkpOwotCQlwcmludEZlYXR1cmUoVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlVG9vbE1lbnRvcigpLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVUb29sTWVudG9yKCkpOwotCQlwcmludEZlYXR1cmUoVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlV2hpdGVwYXBlcigpLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVXaGl0ZXBhcGVyKCkpOwotCQlwcmludEZlYXR1cmUoVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlV29ya09yZGVyKCksIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVdvcmtPcmRlcigpKTsKLQkJcHJpbnRGZWF0dXJlKFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVdvcmtQcm9kdWN0RGVzY3JpcHRpb24oKSwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlV29ya1Byb2R1Y3REZXNjcmlwdGlvbigpKTsKLQkJcHJpbnRGZWF0dXJlKFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVdvcmtQcm9kdWN0RGVzY3JpcHRvcigpLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVXb3JrUHJvZHVjdERlc2NyaXB0b3IoKSk7Ci0JCXByaW50RmVhdHVyZShVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVXb3JrUHJvZHVjdFR5cGUoKSwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlV29ya1Byb2R1Y3RUeXBlKCkpOwotLy8JCXByaW50RmVhdHVyZShVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGUoKSwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlKCkpOwotLy8JCXByaW50RmVhdHVyZShVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGUoKSwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlKCkpOwotCi0KLQl9Ci0JCi0JCi0JcHJpdmF0ZSB2b2lkIHByaW50RmVhdHVyZShFT2JqZWN0IG9iajEsIEVPYmplY3Qgb2JqMikgewotCQlMaXN0IG1hdGNoZWQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUxpc3QgdW5tYXRjaGVkID0gbmV3IEFycmF5TGlzdCgpOwotCQlMaXN0IHVtYUZlYXR1cmVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQotCQlFTGlzdCBmZWF0dXJlcyA9IG9iajEuZUNsYXNzKCkuZ2V0RUFsbFN0cnVjdHVyYWxGZWF0dXJlcygpOwotCQlmb3IgKCBJdGVyYXRvciBpdCA9IGZlYXR1cmVzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTsgKSB7Ci0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IChFU3RydWN0dXJhbEZlYXR1cmUpaXQubmV4dCgpOwotCQkJU3RyaW5nIG5hbWUgPSBmZWF0dXJlLmdldE5hbWUoKTsKLQkJCWlmICggZmVhdHVyZU5hbWVNYXAuY29udGFpbnNLZXkobmFtZSkgKSB7Ci0JCQkJU3RyaW5nIHhtbF9uYW1lID0gKFN0cmluZykgZmVhdHVyZU5hbWVNYXAuZ2V0KG5hbWUpOwotCQkJCWludCBpbmR4ID0geG1sX25hbWUuaW5kZXhPZigiLCIpOyAvLyROT04tTkxTLTEkCi0JCQkJaWYgKCBpbmR4ID4gMCApIHsKLQkJCQkJbWF0Y2hlZC5hZGQoeG1sX25hbWUuc3Vic3RyaW5nKDAsIGluZHgpKTsKLQkJCQkJbWF0Y2hlZC5hZGQoeG1sX25hbWUuc3Vic3RyaW5nKGluZHgrMSkudHJpbSgpKTsJCQkJCQotCQkJCX0KLQkJCQllbHNlIGlmICggIW1hdGNoZWQuY29udGFpbnMoeG1sX25hbWUpICkgewotCQkJCQltYXRjaGVkLmFkZCh4bWxfbmFtZSk7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSBpZiAoIXVubmVlZGVkUm1jRmVhdHVyZXMuY29udGFpbnMobmFtZSkgJiYgIXVtYUZlYXR1cmVzLmNvbnRhaW5zKG5hbWUpICkgewotCQkJCXVtYUZlYXR1cmVzLmFkZChuYW1lKTsKLQkJCX0KLQkJfQkJCQotCQkKLQkJZmVhdHVyZXMgPSBvYmoyLmVDbGFzcygpLmdldEVBbGxTdHJ1Y3R1cmFsRmVhdHVyZXMoKTsKLQkJZm9yICggSXRlcmF0b3IgaXQgPSBmZWF0dXJlcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7ICkgewotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSAoRVN0cnVjdHVyYWxGZWF0dXJlKWl0Lm5leHQoKTsKLQkJCVN0cmluZyBuYW1lID0gZmVhdHVyZS5nZXROYW1lKCk7Ci0JCQlpZiAoIHVtYUZlYXR1cmVzLmNvbnRhaW5zKG5hbWUpICkgewotCQkJCXVtYUZlYXR1cmVzLnJlbW92ZShuYW1lKTsKLQkJCX0gZWxzZSBpZiAoIXVubmVlZGVkWG1sRmVhdHVyZXMuY29udGFpbnMobmFtZSkgJiYgIW1hdGNoZWQuY29udGFpbnMobmFtZSkgJiYgIXVubWF0Y2hlZC5jb250YWlucyhuYW1lKSApIHsKLQkJCQl1bm1hdGNoZWQuYWRkKG5hbWUpOwotCQkJfQotCQl9CQotCQkKLQkJaWYgKCB1bWFGZWF0dXJlcy5zaXplKCkgKyB1bm1hdGNoZWQuc2l6ZSgpID09IDAgKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCVN5c3RlbS5vdXQucHJpbnRsbigiPT09PT09PT09PT09PT0gdW4tbWF0Y2hlZCBmZWF0dXJlcyBmb3IgIiArIG9iajEuZUNsYXNzKCkuZ2V0TmFtZSgpICsgIiA9PT09PT09PT09PT09PT09PT0iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWZvciAoIEl0ZXJhdG9yIGl0ID0gdW1hRmVhdHVyZXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOyApIHsKLQkJCVN0cmluZyBuYW1lID0gKFN0cmluZylpdC5uZXh0KCk7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIlx0ZmVhdHVyZU5hbWVNYXAucHV0KFwiIiArIG5hbWUgKyAiXCIsIFwiXCIpOyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCS8vU3lzdGVtLm91dC5wcmludGxuKG5hbWUpOwotCQl9Ci0JCWZvciAoIEl0ZXJhdG9yIGl0ID0gdW5tYXRjaGVkLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTsgKSB7Ci0JCQlTdHJpbmcgbmFtZSA9IChTdHJpbmcpaXQubmV4dCgpOwotCQkJU3lzdGVtLm91dC5wcmludGxuKCJcdFx0IiArIG5hbWUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlTeXN0ZW0ub3V0LnByaW50bG4oIiIpOyAvLyROT04tTkxTLTEkCi0JCQotCX0KLQkKLS8vCXB1YmxpYyBjbGFzcyBGZWF0dXJlTWFwIHsKLS8vCQlwcml2YXRlIE1hcCBmZWF0dXJlTWFwID0gbmV3IEhhc2hNYXAoKTsKLS8vCQkKLS8vCQlGZWF0dXJlTWFwKEVDbGFzcyBjbGF6eikgewotLy8JCQlFTGlzdCBmZWF0dXJlcyA9IGNsYXp6LmdldEVBbGxTdHJ1Y3R1cmFsRmVhdHVyZXMoKTsKLS8vCQkJZm9yICggSXRlcmF0b3IgaXQgPSBmZWF0dXJlcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7ICkgewotLy8JCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSAoRVN0cnVjdHVyYWxGZWF0dXJlKWl0Lm5leHQoKTsKLS8vCQkJCWZlYXR1cmVNYXAucHV0KGZlYXR1cmUuZ2V0TmFtZSgpLCBmZWF0dXJlKTsKLS8vCQkJfQkJCQotLy8JCX0KLS8vCQkKLS8vCQlwdWJsaWMgRVN0cnVjdHVyYWxGZWF0dXJlIGdldEZlYXR1cmUoU3RyaW5nIGZlYXR1cmVOYW1lKSB7Ci0vLwkJCXJldHVybiAoRVN0cnVjdHVyYWxGZWF0dXJlKSBmZWF0dXJlTWFwLmdldChmZWF0dXJlTmFtZSk7CQkJCi0vLwkJfQotLy8JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQveG1sL3NlcnZpY2VzL1hNTExpYnJhcnkuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3htbC9zZXJ2aWNlcy9YTUxMaWJyYXJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4NjlmMTkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQveG1sL3NlcnZpY2VzL1hNTExpYnJhcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOTQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwuc2VydmljZXM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5pbXBsLlJlc291cmNlU2V0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuc2RvLkVEYXRhT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLlhNTFJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5YTUxUeXBlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuWE1MVHlwZVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5zZXJ2aWNlLnZlcnNpb25pbmcuVmVyc2lvblV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS51dGlsLkNvbnRlbnRQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS51dGlsLklMb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwuRXhwb3J0WE1MUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LklMaWJyYXJ5TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkJyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudENhdGVnb3J5UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db250ZW50RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db250ZW50UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Eb2N1bWVudFJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RFbGVtZW50UHJvcGVydHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlNlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlZhcmlhYmlsaXR5VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrT3JkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya09yZGVyVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS51dGlsLlVtYVJlc291cmNlRmFjdG9yeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotaW1wb3J0IGNvbS5pYm0uaWN1LnRleHQuU2ltcGxlRGF0ZUZvcm1hdDsKLWltcG9ydCBjb21tb25qLnNkby5UeXBlOwotCi0vKioKLSAqIFhtbExpYnJhcnkgcmVwcmVzZW50cyBhIG1ldGhvZCBsaWJyYXJ5IGxvYWRlZCBmcm9tIGEgc3BlY2lmaWVkIHhtbCBmaWxlIFRoZQotICogeG1sIGZpbGUgc2hvdWxkIGJlIHZhbGlkIHRvIHRoZSB4bWwgc2NoZW1hIGZvciBNZXRob2RMaWJyYXJ5Ci0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKiBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTYyMTUzCi0gKi8KLXB1YmxpYyBjbGFzcyBYTUxMaWJyYXJ5IHsKLQotCXByaXZhdGUgU3RyaW5nIGZpbGVQYXRoOwotCi0JcHJpdmF0ZSBJTG9nZ2VyIGxvZ2dlcjsKLQotCXByaXZhdGUgQ29udGVudFByb2Nlc3NvciBjb250ZW50UHJvYyA9IG51bGw7Ci0KLQlwcml2YXRlIE1ldGhvZExpYnJhcnkgcm9vdE9iamVjdDsKLQotCS8vIG1hcCBvZiBjb250ZW50IGNhdGVnb3J5IHBhY2thZ2UgZm9yIGVhY2ggcGx1Z2luIGlkCi0JcHJpdmF0ZSBNYXAgY29udGVudENhdGVnb3J5UGtnTWFwID0gbmV3IEhhc2hNYXAoKTsKLQotCS8vIG1hcCBvZiBjcmVhdGVkIGVsZW1lbnRzLCBndWlkIC0gRURhdGFPYmplY3QKLQlwcml2YXRlIE1hcCBlbGVtZW50c01hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCi0JcHJpdmF0ZSBNYXA8U3RyaW5nLCBTdHJpbmc+IGd1aWRUb1BsdWdOYW1lTWFwOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgWE1MTGlicmFyeShDb250ZW50UHJvY2Vzc29yIGNvbnRlbnRQcm9jLCBJTG9nZ2VyIGxvZ2dlciwKLQkJCVN0cmluZyBmaWxlUGF0aCkgewotCQl0aGlzLmNvbnRlbnRQcm9jID0gY29udGVudFByb2M7Ci0JCXRoaXMubG9nZ2VyID0gbG9nZ2VyOwotCQl0aGlzLmZpbGVQYXRoID0gZmlsZVBhdGg7Ci0KLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHJvb3Qgb2JqZWN0LgotCSAqLwotCXB1YmxpYyBFRGF0YU9iamVjdCBnZXRSb290KCkgewotCQlyZXR1cm4gdGhpcy5yb290T2JqZWN0OwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gZmlsZSBwYXRoIHN0cmluZy4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEZpbGVQYXRoKCkgewotCQlyZXR1cm4gdGhpcy5maWxlUGF0aDsKLQl9Ci0KLQkvKioKLQkgKiBnZXQgYW4gYXJyYXkgb2YgcGx1Z2luIGlkcyBpbiB0aGUgbGlicmFyeQotCSAqIAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nW10gZ2V0UGx1Z2luSWRzKCkgewotCQlMaXN0IHBsdWdpbnMgPSByb290T2JqZWN0LmdldE1ldGhvZFBsdWdpbigpOwotCQlTdHJpbmdbXSBpZHMgPSBuZXcgU3RyaW5nW3BsdWdpbnMuc2l6ZSgpXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwbHVnaW5zLnNpemUoKTsgaSsrKSB7Ci0JCQlpZHNbaV0gPSAoKE1ldGhvZFBsdWdpbikgcGx1Z2lucy5nZXQoaSkpLmdldElkKCk7Ci0JCX0KLQotCQlyZXR1cm4gaWRzOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBpZAotCSAqIEBwYXJhbSBuYW1lCi0JICogQHJldHVybiBhIG5ldyBYTUwgbGlicmFyeS4KLQkgKi8KLQlwdWJsaWMgRURhdGFPYmplY3QgY3JlYXRlTGlicmFyeShTdHJpbmcgaWQsIFN0cmluZyBuYW1lKSB7Ci0KLQkJTWV0aG9kTGlicmFyeSByb290ID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlTWV0aG9kTGlicmFyeSgpOwotCQlTdHJpbmcgdmVyc2lvbiA9ICIiOwkJCQkJCQkJLy8kTk9OLU5MUy0xJAkKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gVmVyc2lvblV0aWwuZ2V0QWxsVG9vbElEcygpLml0ZXJhdG9yKCk7aXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlTdHJpbmcgdG9vbElEID0gKFN0cmluZylpdGVyLm5leHQoKTsKLQkJCVN0cmluZyB0b29sVmVyc2lvbiA9IFZlcnNpb25VdGlsLmdldFZlcnNpb25zKHRvb2xJRCkuZ2V0TWluVG9vbFZlcnNpb25Gb3JDdXJyZW50WE1MU2NoZW1hVmVyc2lvbigpLmdldFRvb2xWZXJzaW9uKCkudG9TdHJpbmcoKTsKLQkJCWlmICh2ZXJzaW9uLmxlbmd0aCgpID4gMCkgewotCQkJCXZlcnNpb24gKz0gVmVyc2lvblV0aWwuWE1MX1ZFUlNJT05TX1NFUEFSQVRPUjsKLQkJCX0KLQkJCXZlcnNpb24gKz0gdG9vbElEICsgVmVyc2lvblV0aWwuWE1MX1RPT0xfVkVSU0lPTl9TRVBBUkFUT1IgKyB0b29sVmVyc2lvbjsJCQotCQl9Ci0JCWlmICh2ZXJzaW9uLmxlbmd0aCgpID4gMCkgewotCQkJcm9vdC5zZXRUb29sKHZlcnNpb24pOwotCQl9Ci0JCXJldHVybiBjcmVhdGUoaWQsIG5hbWUsIHJvb3QpOwotCX0KLQotCS8qKgotCSAqIExvYWRzIHRoZSB4bWwgZmlsZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBsb2FkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0vKgkJdHJ5IHsqLwotCQkJUmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQgPSBuZXcgUmVzb3VyY2VTZXRJbXBsKCk7Ci0KLQkJCS8vIEdldCB0aGUgVVJJIG9mIHRoZSBtb2RlbCBmaWxlLgotCQkJLy8KLQkJCVVSSSBmaWxlVVJJID0gVVJJLmNyZWF0ZUZpbGVVUkkoKG5ldyBGaWxlKHRoaXMuZmlsZVBhdGgpKS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0KLQkJCS8vIENyZWF0ZSBhIHJlc291cmNlIGZvciB0aGlzIGZpbGUuCi0JCQkvLwotCQkJLy8gUmVzb3VyY2UgcmVzb3VyY2UgPSByZXNvdXJjZVNldC5jcmVhdGVSZXNvdXJjZShmaWxlVVJJKTsKLQkJCVJlc291cmNlIHJlc291cmNlID0gbmV3IFVtYVJlc291cmNlRmFjdG9yeUltcGwoKQotCQkJCQkuY3JlYXRlUmVzb3VyY2UoZmlsZVVSSSk7Ci0JCQlyZXNvdXJjZVNldC5nZXRSZXNvdXJjZXMoKS5hZGQocmVzb3VyY2UpOwotCi0JCQlyZXNvdXJjZS5sb2FkKG5ldyBIYXNoTWFwKCkpOwotCi0JCQkvLyBSZXNvdXJjZSByZXNvdXJjZSA9IHJlc291cmNlU2V0LmdldFJlc291cmNlKGZpbGVVUkksIGZhbHNlKTsKLQotCQkJLy8gRUNsYXNzIGVDbGFzcyA9Ci0JCQkvLyBFeHRlbmRlZE1ldGFEYXRhLklOU1RBTkNFLmdldERvY3VtZW50Um9vdCh1bWFQYWNrYWdlKTsKLQotCQkJRG9jdW1lbnRSb290IHJvb3QgPSAoRG9jdW1lbnRSb290KSByZXNvdXJjZS5nZXRDb250ZW50cygpLmdldCgwKTsKLQkJCWZvciAoSXRlcmF0b3IgaXRyID0gcm9vdC5lQ29udGVudHMoKS5pdGVyYXRvcigpOyBpdHIuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBvID0gaXRyLm5leHQoKTsKLQkJCQlpZiAobyBpbnN0YW5jZW9mIE1ldGhvZExpYnJhcnkpIHsKLQkJCQkJdGhpcy5yb290T2JqZWN0ID0gKE1ldGhvZExpYnJhcnkpIG87Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLS8qCi0JCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlJlc291cmNlIGxvYWRlZCIpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlsb2dnZXIubG9nRXJyb3IoTkxTLmJpbmQoCi0JCQkJCUV4cG9ydFhNTFJlc291cmNlcy54bWxMaWJyYXJ5X2Vycm9yX2xvYWRfeG1sLCBmaWxlUGF0aCksIGUpOwotCQl9Ki8KLQl9Ci0KLQkvKioKLQkgKiBjcmVhdGUgdGhlIGxpYnJhcnkgYW5kIHJldHVybiB0aGUgcm9vdCBvYmplY3QKLQkgKiAKLQkgKiBAcGFyYW0gZmlsZVBhdGgKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBNZXRob2RMaWJyYXJ5IGNyZWF0ZShTdHJpbmcgaWQsIFN0cmluZyBuYW1lLCBNZXRob2RFbGVtZW50IHJvb3QpIHsKLQotCQkvLyBDcmVhdGUgYSByZXNvdXJjZSBzZXQKLQkJLy8KLQkJUmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQgPSBuZXcgUmVzb3VyY2VTZXRJbXBsKCk7Ci0KLQkJLy8gR2V0IHRoZSBVUkkgb2YgdGhlIG1vZGVsIGZpbGUuCi0JCS8vCi0JCUZpbGUgZmlsZSA9IG5ldyBGaWxlKHRoaXMuZmlsZVBhdGgpOwotCQlVUkkgZmlsZVVSSSA9IFVSSS5jcmVhdGVGaWxlVVJJKGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOwotCi0JCS8vIENyZWF0ZSBhIHJlc291cmNlIGZvciB0aGlzIGZpbGUuCi0JCS8vCi0JCS8vIFJlc291cmNlIHJlc291cmNlID0gcmVzb3VyY2VTZXQuY3JlYXRlUmVzb3VyY2UoZmlsZVVSSSk7Ci0JCVJlc291cmNlIHJlc291cmNlID0gbmV3IFVtYVJlc291cmNlRmFjdG9yeUltcGwoKQotCQkJCS5jcmVhdGVSZXNvdXJjZShmaWxlVVJJKTsKLQkJcmVzb3VyY2VTZXQuZ2V0UmVzb3VyY2VzKCkuYWRkKHJlc291cmNlKTsKLQotCQkvLyBBZGQgdGhlIGluaXRpYWwgbW9kZWwgb2JqZWN0IHRvIHRoZSBjb250ZW50cy4KLQkJLy8gcm9vdC5zZXRJZChpZCk7Ci0JCS8vIHJvb3Quc2V0TmFtZShuYW1lKTsKLQotCQlzZXRFbGVtZW50KGlkLCByb290KTsKLQotCQkvLyB0aGlzLnJvb3RPYmplY3QgPSByb290OwotCQlpZiAocm9vdCAhPSBudWxsKSB7Ci0JCQlyZXNvdXJjZS5nZXRDb250ZW50cygpLmFkZChyb290KTsKLQkJfQotCi0JCXRyeSB7Ci0JCQlNYXAgb3B0aW9ucyA9IG5ldyBIYXNoTWFwKCk7Ci0JCQlvcHRpb25zLnB1dChYTUxSZXNvdXJjZS5PUFRJT05fRU5DT0RJTkcsICJVVEYtOCIpOyAvLyROT04tTkxTLTEkCi0JCQlyZXNvdXJjZS5zYXZlKG9wdGlvbnMpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCi0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0KLQkJaWYgKHJvb3QgaW5zdGFuY2VvZiBNZXRob2RMaWJyYXJ5KSB7Ci0JCQl0aGlzLnJvb3RPYmplY3QgPSAoTWV0aG9kTGlicmFyeSkgcm9vdDsKLQkJfQotCi0JCXJldHVybiB0aGlzLnJvb3RPYmplY3Q7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHBsdWdpbklkCi0JICogQHJldHVybiBhIGNvbnRlbnQgY2F0ZXJnb3J5IHBhY2thZ2UgaW4gdGhlIHBsdWdpbiBnaXZlbiBieSBwbHVnaW5JZC4KLQkgKi8KLQlwdWJsaWMgRURhdGFPYmplY3QgZ2V0Q29udGVudENhdGVnb3J5UGFja2FnZShTdHJpbmcgcGx1Z2luSWQpIHsKLQotCQlDb250ZW50Q2F0ZWdvcnlQYWNrYWdlIHBrZyA9IChDb250ZW50Q2F0ZWdvcnlQYWNrYWdlKSBjb250ZW50Q2F0ZWdvcnlQa2dNYXAKLQkJCQkuZ2V0KHBsdWdpbklkKTsKLQkJaWYgKHBrZyAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gcGtnOwotCQl9Ci0KLQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IChNZXRob2RQbHVnaW4pIGdldEVsZW1lbnQocGx1Z2luSWQpOwotCQlpZiAocGx1Z2luID09IG51bGwpIHsKLQkJCWxvZ2dlci5sb2dXYXJuaW5nKE5MUy5iaW5kKEV4cG9ydFhNTFJlc291cmNlcy54bWxMaWJyYXJ5X25vX3BsdWdpbiwKLQkJCQkJcGx1Z2luSWQpKTsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJcGtnID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQ29udGVudENhdGVnb3J5UGFja2FnZSgpOwotCQlwa2cuc2V0TmFtZSgiQ29udGVudENhdGVnb3JpZXMiKTsgLy8kTk9OLU5MUy0xJAotCi0JCXNldEVsZW1lbnQoRWNvcmVVdGlsLmdlbmVyYXRlVVVJRCgpLCBwa2cpOwotCi0JCXBsdWdpbi5nZXRNZXRob2RQYWNrYWdlKCkuYWRkKHBrZyk7Ci0KLQkJY29udGVudENhdGVnb3J5UGtnTWFwLnB1dChwbHVnaW5JZCwgcGtnKTsKLQkJcmV0dXJuIHBrZzsKLQl9Ci0KLQkvKioKLQkgKiBTYXZlcyB0aGUgeG1sIGZpbGUuCi0JICovCi0JcHVibGljIHZvaWQgc2F2ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQkvLyBTYXZlIHRoZSBjb250ZW50cyBvZiB0aGUgcmVzb3VyY2UgdG8gdGhlIGZpbGUgc3lzdGVtLgotCQkvLwotCQlNYXAgb3B0aW9ucyA9IG5ldyBIYXNoTWFwKCk7Ci0JCW9wdGlvbnMucHV0KFhNTFJlc291cmNlLk9QVElPTl9FTkNPRElORywgIlVURi04Iik7IC8vJE5PTi1OTFMtMSQKLQkJUmVzb3VyY2UgcmVzb3VyY2UgPSByb290T2JqZWN0LmVSZXNvdXJjZSgpOwotCQlyZXNvdXJjZS5zYXZlKG9wdGlvbnMpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gdGhlIHJvb3Qgb2JqZWN0LgotCSAqLwotCXB1YmxpYyBFRGF0YU9iamVjdCBvcGVuKCkgewotCQlyZXR1cm4gcm9vdE9iamVjdDsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZ3VpZAotCSAqIEByZXR1cm4gdGhlIGNvcnJlc3BvbmRpbmcgYmFzZSBsaWJyYXJ5IGVsZW1lbnQuCi0JICovCi0JcHVibGljIEVEYXRhT2JqZWN0IGdldEVsZW1lbnQoU3RyaW5nIGd1aWQpIHsKLQkJcmV0dXJuIChFRGF0YU9iamVjdCkgZWxlbWVudHNNYXAuZ2V0KGd1aWQpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBvYmoKLQkgKiBAcmV0dXJuIHRoZSBjb3JyZXNwb25kaW5nIGJhc2UgbGlicmFyeSBlbGVtZW50LgotCSAqLwotCXB1YmxpYyBFRGF0YU9iamVjdCBnZXRFbGVtZW50KE9iamVjdCBvYmopIHsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCXJldHVybiBnZXRFbGVtZW50KCgoTWV0aG9kRWxlbWVudCkgb2JqKS5nZXRJZCgpKTsKLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotCQotCS8qKgotCSAqIEBwYXJhbSBvYmoKLQkgKiBAcmV0dXJuIGVsbWVuZW50IGlkIHN0cmluZy4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEVsZW1lbnRJZChFRGF0YU9iamVjdCBvYmopIHsKLQotCQlpZiAob2JqIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJcmV0dXJuICgoTWV0aG9kRWxlbWVudCkgb2JqKS5nZXRJZCgpOwotCQl9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIFdvcmtPcmRlcikgewotCQkJcmV0dXJuICgoV29ya09yZGVyKSBvYmopLmdldElkKCk7Ci0JCX0KLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0RWxlbWVudChTdHJpbmcgZ3VpZCwgRURhdGFPYmplY3Qgb2JqKSB7Ci0JCS8vIGFkZEVsZW1lbnRUb0NvbnRhaW5lcihjb250YWluZXIsIG9iaik7Ci0JCWlmICghZWxlbWVudHNNYXAuY29udGFpbnNLZXkoZ3VpZCkpIHsKLQotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCQkoKE1ldGhvZEVsZW1lbnQpIG9iaikuc2V0SWQoZ3VpZCk7Ci0JCQl9Ci0KLQkJCWVsZW1lbnRzTWFwLnB1dChndWlkLCBvYmopOwotCQl9Ci0JfQotCi0JLy8gcHJpdmF0ZSB2b2lkIGFkZEVsZW1lbnRUb0NvbnRhaW5lcihFRGF0YU9iamVjdCBjb250YWluZXIsIEVEYXRhT2JqZWN0Ci0JLy8gY2hpbGQpIHsKLQkvLwkJCi0JLy8gdHJ5IHsKLQkvLyBpZiAoIGNvbnRhaW5lciA9PSBudWxsICkgewotCS8vIHJldHVybjsKLQkvLyB9Ci0JLy8JCQkKLQkvLyBpZiAoIGNoaWxkIGluc3RhbmNlb2YgTWV0aG9kTGlicmFyeSB8fCBjaGlsZCBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbiB8fAotCS8vIGNoaWxkIGluc3RhbmNlb2YgTWV0aG9kUGFja2FnZSApIHsKLQkvLyByZXR1cm47Ci0JLy8gfQotCS8vCQkJCi0JLy8gd2hpbGUgKCAhKGNvbnRhaW5lciBpbnN0YW5jZW9mIE1ldGhvZFBhY2thZ2UpICYmIChjb250YWluZXIgIT0gbnVsbCkgKSB7Ci0JLy8gY29udGFpbmVyID0gY29udGFpbmVyLmVDb250YWluZXIoKTsKLQkvLyB9Ci0JLy8JCQkKLQkvLyBpZiAoIGNvbnRhaW5lciBpbnN0YW5jZW9mIENvbnRlbnRQYWNrYWdlICkgewotCS8vICgoQ29udGVudFBhY2thZ2UpY29udGFpbmVyKS5nZXRDb250ZW50RWxlbWVudCgpLmFkZChjaGlsZCk7Ci0JLy8gfSBlbHNlIGlmICggY29udGFpbmVyIGluc3RhbmNlb2YgUHJvY2Vzc1BhY2thZ2UgKSB7Ci0JLy8gKChQcm9jZXNzUGFja2FnZSljb250YWluZXIpLmdldFByb2Nlc3NFbGVtZW50KCkuYWRkKGNoaWxkKTsKLQkvLyB9IGVsc2UgewotCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiRG9uJ3Qga25vdyBob3cgdG8gc2V0IGVsZW1lbnQgIiArIGNoaWxkKTsKLQkvLyB9Ci0JLy8gfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JLy8gLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jawotCS8vIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0JLy8gfQotCS8vIH0KLQotCS8qKgotCSAqIGNyZWF0ZSBhIGNoaWxkIGVsZW1lbnQgd2l0aCB0aGUgc3BlY2lmaWVkIGd1aWQKLQkgKiAKLQkgKiBAcGFyYW0gY29udGFpbmVyCi0JICogICAgICAgICAgICBjb250YWluZXIgb2YgdGhlIGVsZW1lbnQgdG8gYmUgY3JlYXRlZAotCSAqIEBwYXJhbSB1bWFGZWF0dXJlTmFtZQotCSAqICAgICAgICAgICAgdW1hIGZlYXR1cmUgZm9yIHRoZSBlbGVtZW50IHRvIGJlIGNyZWF0ZWQKLQkgKiBAcGFyYW0gdW1hRUNsYXNzTmFtZQotCSAqICAgICAgICAgICAgdW1hIEVDbGFzcyBuYW1lIGZvciB0aGUgZmVhdHVyZQotCSAqIEBwYXJhbSB1bWFFbGVtZW50VHlwZQotCSAqICAgICAgICAgICAgdW1hIGVsZW1lbnQgdHlwZSBmb3IgdGhlIGVsZW1lbnQgdG8gYmUgY3JlYXRlZAotCSAqIEBwYXJhbSBndWlkCi0JICogICAgICAgICAgICBndWlkIG9mIHRoZSBlbGVtZW50IHRvIGJlIGNyZWF0ZWQKLQkgKiBAcmV0dXJuIEVEYXRhT2JqZWN0IHRoZSBYbWwgdW1hIGVsZW1lbnQKLQkgKi8KLQlwdWJsaWMgRURhdGFPYmplY3QgY3JlYXRlRWxlbWVudChFRGF0YU9iamVjdCBjb250YWluZXIsCi0JCQlTdHJpbmcgdW1hRmVhdHVyZU5hbWUsIFN0cmluZyB1bWFFQ2xhc3NOYW1lLCBTdHJpbmcgdW1hRWxlbWVudFR5cGUsCi0JCQlTdHJpbmcgZ3VpZCkgewotCi0JCUVEYXRhT2JqZWN0IG9iaiA9IGdldEVsZW1lbnQoZ3VpZCk7Ci0JCWlmIChvYmogPT0gbnVsbCkgewotCQkJaWYgKEZlYXR1cmVNYW5hZ2VyLklOU1RBTkNFLmlzVW5uZWVkZWRSbWNGZWF0dXJlKHVtYUZlYXR1cmVOYW1lKSkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBGZWF0dXJlTWFuYWdlci5JTlNUQU5DRS5nZXRYbWxGZWF0dXJlKAotCQkJCQljb250YWluZXIuZUNsYXNzKCksIHVtYUZlYXR1cmVOYW1lLCB1bWFFbGVtZW50VHlwZSk7Ci0JCQlpZiAoZmVhdHVyZSA9PSBudWxsKSB7Ci0JCQkJbG9nZ2VyLmxvZ1dhcm5pbmcoTkxTLmJpbmQoCi0JCQkJCQlFeHBvcnRYTUxSZXNvdXJjZXMueG1sTGlicmFyeV9ub19mZWF0dXJlLCBjb250YWluZXIKLQkJCQkJCQkJLmVDbGFzcygpLmdldE5hbWUoKSwgdW1hRmVhdHVyZU5hbWUpKTsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQotCQkJLy8gaWYgKCAhKGZlYXR1cmUgaW5zdGFuY2VvZiBFUmVmZXJlbmNlKSApIHsKLQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiRXJyb3IgY3JlYXRpbmcgZWxlbWVudDogY29udGFpbm1lbnQgZmVhdHVyZQotCQkJLy8gc2hvdWxkIGJlIEVSZWZlcmVuY2UgdHlwZS4gIiArIGZlYXR1cmUuZ2V0TmFtZSgpKTsKLQkJCS8vIC8vcmV0dXJuIG51bGw7Ci0JCQkvLyB9Ci0KLQkJCS8vIC8vIHRoaXMgaXMgYW4gZWFzaWVyIHdheSwgdGVzdCBpdCwKLQkJCS8vIC8vIGRvZXMgbm90IHdvcmsgc2luY2UgZmVhdHVyZS5nZXRFVHlwZSgpIHJldHVybnMgdGhlIGJhc2UKLQkJCS8vIGVsZW1lbnQgdHlwZSwgbm90IHRoZSBleHRlbmRlZCBvbmUKLQkJCS8vIC8vIGZvciBleGFtcGxlLCBpdCByZXR1cm5zIE1ldGhvZFBhY2thZ2UgaW5zdGVhZCBvZgotCQkJLy8gUHJvY2Vzc1BhY2thZ2Ugb3IgQ29udGVudFBhY2thZ2UKLQkJCS8vIC8vIHNvIHdlIG5lZWQgdG8gbWFrZSBvdXIgb3duIG1hcAotCQkJLy8gRUNsYXNzaWZpZXIgYyA9IGZlYXR1cmUuZ2V0RVR5cGUoKTsKLQkJCS8vIGlmICggIWMuZ2V0TmFtZSgpLmVxdWFscyh1bWFFQ2xhc3NOYW1lKSApIHsKLQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiRUNsYXNzIG5hbWUgbm90IG1hdGNoOiAiICsgYy5nZXROYW1lKCkgKyAiCi0JCQkvLyAtLS0gIiArIHVtYUVDbGFzc05hbWUpOwotCQkJLy8gfQotCi0JCQlFQ2xhc3Mgb2JqQ2xhc3MgPSBGZWF0dXJlTWFuYWdlci5JTlNUQU5DRQotCQkJCQkuZ2V0WG1sRUNsYXNzKHVtYUVDbGFzc05hbWUpOwotCQkJaWYgKG9iakNsYXNzID09IG51bGwpIHsKLQkJCQlsb2dnZXIubG9nV2FybmluZyhOTFMuYmluZCgKLQkJCQkJCUV4cG9ydFhNTFJlc291cmNlcy54bWxMaWJyYXJ5X25vX2NsYXNzLCB1bWFFQ2xhc3NOYW1lKSk7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0KLQkJCW9iaiA9IChFRGF0YU9iamVjdCkgRWNvcmVVdGlsLmNyZWF0ZShvYmpDbGFzcyk7Ci0JCQlzZXRFbGVtZW50KGd1aWQsIG9iaik7Ci0KLQkJCWlmIChvYmogaW5zdGFuY2VvZiBXb3JrT3JkZXIpIHsKLQkJCQkvLyBXb3JrT3JkZXIgaXMgbm90IGNvbnRhaW5lZCBpbiBhIHByb2Nlc3NQYWNrYWdlIGluIHhtbCBtb2RlbAotCQkJCS8vIGl0J3MgY29udGFpbmVkIGJ5IHRoZSBicmVha2Rvd25FbGVtZW50Ci0JCQkJLy8gc28gd2Ugc2F2ZSB0aGUgZWxlbWVudCBpZC1vYmplY3QgdG8gdGhlIG1hcCBhbmQgY29udGludWUKLQkJCQkvLyBkb24ndCBzZXQgdGhlIGZlYXR1cmUgdmFsdWUKLQkJCQkKLQkJCQkvLyB0aGUgd29ya09yZGVyIGluIEVQRiBVTUEgbW9kZWwgaXMgcmVmZXJlbmNlZCBieSBmZWF0dXJlCi0JCQkJLy8gV29ya0JyZWFrRG93bkVsZW1lbnRfTGlua1RvUHJlZGVjZXNzb3IsCi0JCQkJLy8gdGhlIGNvcnJlc3BvbmRpbmcgZmVhdHVyZSBpbiB0aGUgeG1sIG1vZGVsIGlzIAotCQkJCS8vIFdvcmtCcmVha0Rvd25FbGVtZW50X1ByZWRlY2Vzc29yLCAKLQkJCQkvLyB0aGUgZmVhdHVyZSB2YWx1ZSBpcyBhIGxpc3Qgb2YgZ3VpZCBvZiB0aGUgV29ya09yZGVycwotCQkJCS8vIHdoZW4gdGhpcyBmZWF0dXJlIHZhbHVlIGlzIHNldCBpbiB0aGUgc2V0UmVmZXJlbmNlVmFsdWUoKSBjYWxsCi0JCQkJLy8gZ2V0IHRoZSBYbWxVbWEgb2JqZWN0LCBpZiBpdCdzIFdvcmtPcmRlciwgCi0JCQkJLy8gYWRkIHRvIHRoZSBjdXJyZW50IHdvcmtvcmRlciB0byB0aGUgV29ya0JyZWFrRG93bkVsZW1lbnQKLQkJCQkvLyBKaW5odWEgWGksIDA4LzI0LzIwMDYKLQkJCQlyZXR1cm4gb2JqOwotCQkJfQotCi0JCQkvLyBub3RlOiBhbGwgZWxlbWVudCByZWZlcmVuY2VzIGFyZSBzdHJpbmcgdHlwZSAoaWQpCi0JCQkvLyBwYWNrYWdlIHJlZmVyZW5jZXMgYXJlIG9iamVjdCByZWZlcmVuY2VzCi0JCQlpZiAoZmVhdHVyZS5pc01hbnkoKSkgewotCQkJCUxpc3QgdmFsdWVzID0gKExpc3QpIGNvbnRhaW5lci5lR2V0KGZlYXR1cmUpOwotCQkJCXRyeSB7Ci0JCQkJCWlmIChmZWF0dXJlIGluc3RhbmNlb2YgRUF0dHJpYnV0ZSkgewotCQkJCQkJdmFsdWVzLmFkZChndWlkKTsKLQotCQkJCQkJLy8gbmVlZCB0byBwdXQgdGhlIG9iamVjdCBpbiBhIGNvbnRhaW5lcgotCQkJCQkJLy8gZm9yIGV4YW1wbGUsIHRoZSBDb250YWllZEFydGlmYWN0cwotCQkJCQkJYWRkVG9Db250YWluZXIoY29udGFpbmVyLCBvYmopOwotCi0JCQkJCX0gZWxzZSBpZiAoZmVhdHVyZSBpbnN0YW5jZW9mIEVSZWZlcmVuY2UpIHsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJdmFsdWVzLmFkZChvYmopOwotCQkJCQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jawotCQkJCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJCQl9Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlsb2dnZXIKLQkJCQkJCQkJLmxvZ1dhcm5pbmcoTkxTCi0JCQkJCQkJCQkJLmJpbmQoCi0JCQkJCQkJCQkJCQlFeHBvcnRYTUxSZXNvdXJjZXMueG1sTGlicmFyeV9lcnJvcl9jcmVhdGVfZWxlbWVudCwKLQkJCQkJCQkJCQkJCWZlYXR1cmUuZ2V0TmFtZSgpKSk7Ci0JCQkJCX0KLQkJCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCQkJbG9nZ2VyLmxvZ0Vycm9yKE5MUy5iaW5kKAotCQkJCQkJCUV4cG9ydFhNTFJlc291cmNlcy54bWxMaWJyYXJ5X2Vycm9yX3NldF92YWx1ZSwgb2JqLAotCQkJCQkJCWNvbnRhaW5lciksIGUpOwotCQkJCQkvLyBlLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKGZlYXR1cmUgaW5zdGFuY2VvZiBFQXR0cmlidXRlKSB7Ci0JCQkJCWNvbnRhaW5lci5lU2V0KGZlYXR1cmUsIGd1aWQpOwotCQkJCQlhZGRUb0NvbnRhaW5lcihjb250YWluZXIsIG9iaik7Ci0JCQkJfSBlbHNlIGlmIChmZWF0dXJlIGluc3RhbmNlb2YgRVJlZmVyZW5jZSkgewotCQkJCQljb250YWluZXIuZVNldChmZWF0dXJlLCBvYmopOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWxvZ2dlci5sb2dXYXJuaW5nKE5MUy5iaW5kKAotCQkJCQkJCUV4cG9ydFhNTFJlc291cmNlcy54bWxMaWJyYXJ5X2Vycm9yX2NyZWF0ZV9lbGVtZW50LAotCQkJCQkJCWZlYXR1cmUuZ2V0TmFtZSgpKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIG9iajsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkVG9Db250YWluZXIoRU9iamVjdCBjb250YWluZXIsIEVPYmplY3Qgb2JqKSB7Ci0KLQkJaWYgKGNvbnRhaW5lciA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKGNvbnRhaW5lciBpbnN0YW5jZW9mIENvbnRlbnRQYWNrYWdlKSB7Ci0JCQkoKENvbnRlbnRQYWNrYWdlKSBjb250YWluZXIpLmdldENvbnRlbnRFbGVtZW50KCkuYWRkKChDb250ZW50RWxlbWVudClvYmopOwotCQl9IGVsc2UgaWYgKGNvbnRhaW5lciBpbnN0YW5jZW9mIFByb2Nlc3NQYWNrYWdlKSB7Ci0JCQkoKFByb2Nlc3NQYWNrYWdlKSBjb250YWluZXIpLmdldFByb2Nlc3NFbGVtZW50KCkuYWRkKChQcm9jZXNzRWxlbWVudClvYmopOwotCQkJLy8gfSBlbHNlIGlmICggKG9iaiBpbnN0YW5jZW9mIENvbnN0cmFpbnQpICYmIChjb250YWluZXIgaW5zdGFuY2VvZgotCQkJLy8gTWV0aG9kRWxlbWVudCkgKSB7Ci0JCQkvLyAvLyB0aGUgb3duZXIgcnVsZSBzaG91bGQgYmUgYSBjb250YWlubWVudCAwLi5uIGZlYXR1cmUsIHdhaXRpbmcKLQkJCS8vIGZvciBtb2RlbCBmaXgKLQkJCS8vIC8vKChNZXRob2RFbGVtZW50KWNvbnRhaW5lcikuc2V0TwotCQl9IGVsc2UgewotCQkJYWRkVG9Db250YWluZXIoY29udGFpbmVyLmVDb250YWluZXIoKSwgb2JqKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNldHMgYXR0cmlidXRlIGZlYXR1cmUgdmFsdWUuCi0JICogQHBhcmFtIG9iagotCSAqIEBwYXJhbSBmZWF0dXJlTmFtZQotCSAqIEBwYXJhbSB2YWx1ZQotCSAqIEB0aHJvd3MgRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHZvaWQgc2V0QXRyaWJ1dGVGZWF0dXJlVmFsdWUoRURhdGFPYmplY3Qgb2JqLCBTdHJpbmcgZmVhdHVyZU5hbWUsCi0JCQlPYmplY3QgdmFsdWUpIHRocm93cyBFeGNlcHRpb24gewotCQlpZiAob2JqID09IG51bGwgfHwgZmVhdHVyZU5hbWUgPT0gbnVsbCB8fCB2YWx1ZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBMaXN0IHx8IHZhbHVlIGluc3RhbmNlb2YgRURhdGFPYmplY3QpIHsKLQkJCWlmIChmZWF0dXJlTmFtZS5lcXVhbHMoIm1ldGhvZEVsZW1lbnRQcm9wZXJ0eSIpKSB7CQkvLyROT04tTkxTLTEkCi0JCQkJc2V0TWVwRmVhdHVyZVZhbHVlKG9iaiwgZmVhdHVyZU5hbWUsIHZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlsb2dnZXIubG9nV2FybmluZyhOTFMuYmluZCgKLQkJCQkJRXhwb3J0WE1MUmVzb3VyY2VzLnhtbExpYnJhcnlfaW52YWxpZF9mZWF0dXJlX3ZhbHVlLAotCQkJCQlmZWF0dXJlTmFtZSwgdmFsdWUpKTsKLQotCQkJcmV0dXJuOwotCQl9Ci0KLQkJLy8gZmluZCB0aGUgZmVhdHVyZSBhbmQgc2V0IHRoZSB2YWx1ZQotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IEZlYXR1cmVNYW5hZ2VyLklOU1RBTkNFLmdldFhtbEZlYXR1cmUob2JqCi0JCQkJLmVDbGFzcygpLCBmZWF0dXJlTmFtZSk7Ci0JCWlmIChmZWF0dXJlID09IG51bGwpIHsKLQotCQkJLy8gaWdub3JlIG1pc3NpbmcgZmVhdHVyZXMgZm9yIFdvcmtPcmRlcgotCQkJaWYgKCEob2JqIGluc3RhbmNlb2YgV29ya09yZGVyKSkgewotCQkJCU9iamVjdFtdIHBhcmFzID0gbmV3IE9iamVjdFtdIHsgZmVhdHVyZU5hbWUsIG9iaiwgdmFsdWUgfTsKLQkJCQlsb2dnZXIKLQkJCQkJCS5sb2dXYXJuaW5nKE5MUwotCQkJCQkJCQkuYmluZCgKLQkJCQkJCQkJCQlFeHBvcnRYTUxSZXNvdXJjZXMueG1sTGlicmFyeV9lcnJvcl9zZXRfdmFsdWVfMiwKLQkJCQkJCQkJCQlwYXJhcykpOwotCQkJfQotCQkJcmV0dXJuOwotCQl9Ci0KLQkJLy8gMTU4Njg4IC0gTWlzc2luZyB0ZW1wbGF0ZSBmaWxlcyBpbiBleHBvcnRlZCB4bWwgbGlicmFyeQotCQkvLyBwcm9jZXNzIHRoZSBhdHRhY2htZW50IHVybAotCQlpZiAoIGZlYXR1cmUgPT0gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0R3VpZGFuY2VEZXNjcmlwdGlvbl9BdHRhY2htZW50KCkgKSB7Ci0JCQlpZiAoIHZhbHVlICE9IG51bGwgKSB7Ci0JCQkJdmFsdWUgPSBjb250ZW50UHJvYy5yZXNvbHZlQXR0YWNobWVudFJlc291cmNlcyhvYmosIHZhbHVlLnRvU3RyaW5nKCkudHJpbSgpKTsKLQkJCX0KLQkJCW9iai5lU2V0KGZlYXR1cmUsIHZhbHVlKTsKLQkJfQotCQkKLQkJaWYgKGZlYXR1cmUgaW5zdGFuY2VvZiBFQXR0cmlidXRlKSB7Ci0JCQl0cnkgewotCQkJCWlmIChmZWF0dXJlLmdldE5hbWUoKS5lcXVhbHMoInZhcmlhYmlsaXR5VHlwZSIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJdmFsdWUgPSBWYXJpYWJpbGl0eVR5cGUuZ2V0KHZhbHVlLnRvU3RyaW5nKCkpOwotCQkJCX0gZWxzZSBpZiAoZmVhdHVyZS5nZXROYW1lKCkuZXF1YWxzKCJsaW5rVHlwZSIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJdmFsdWUgPSBXb3JrT3JkZXJUeXBlLmdldCh2YWx1ZS50b1N0cmluZygpKTsKLQkJCQl9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgamF2YS51dGlsLkRhdGUpIHsKLQkJCQkJLy8gY29udmVydCBqYXZhLnV0aWwuRGF0ZSB0byB4bWwgRGF0ZQotCQkJCQl2YWx1ZSA9IGdldFhtbERhdGUoKGphdmEudXRpbC5EYXRlKSB2YWx1ZSk7Ci0JCQkJfSBlbHNlIGlmICgoY29udGVudFByb2MgIT0gbnVsbCkKLQkJCQkJCSYmIChvYmogaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KQotCQkJCQkJJiYgKHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSkgewotCQkJCQl2YWx1ZSA9IGNvbnRlbnRQcm9jLnJlc29sdmVSZXNvdXJjZUZpbGVzKAotCQkJCQkJCShNZXRob2RFbGVtZW50KSBvYmosIChTdHJpbmcpIHZhbHVlKTsKLQkJCQl9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgamF2YS5uZXQuVVJJKSB7CQkJCQkJCQkJCi0JCQkJCW9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luIHNyY1BsdWdpbiA9IEV4cG9ydFJlc291cmNlSGFuZGxlci5nZXRTb3VyY2VQbHVnaW4oKG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZEVsZW1lbnQpIG9iaik7CQkKLQkJCQkJdmFsdWUgPSBzcmNQbHVnaW4uZ2V0TmFtZSgpICsgIi8iICsgKChqYXZhLm5ldC5VUkkpIHZhbHVlKS5nZXRQYXRoKCk7IC8vLy8kTk9OLU5MUy0xJAotCQkJCQlpZiAoY29udGVudFByb2MgIT0gbnVsbCkgewotCQkJCQkJY29udGVudFByb2MuY29weVJlc291cmNlKChTdHJpbmcpIHZhbHVlLCBvYmosIHNyY1BsdWdpbik7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJb2JqLmVTZXQoZmVhdHVyZSwgdmFsdWUpOwotCQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJT2JqZWN0W10gcGFyYXMgPSBuZXcgT2JqZWN0W10geyBmZWF0dXJlTmFtZSwgb2JqLCB2YWx1ZSB9OwotCQkJCWxvZ2dlcgotCQkJCQkJLmxvZ0Vycm9yKAotCQkJCQkJCQlOTFMKLQkJCQkJCQkJCQkuYmluZCgKLQkJCQkJCQkJCQkJCUV4cG9ydFhNTFJlc291cmNlcy54bWxMaWJyYXJ5X2Vycm9yX3NldF92YWx1ZV8yLAotCQkJCQkJCQkJCQkJcGFyYXMpLCBlKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbihFeHBvcnRYTUxSZXNvdXJjZXMueG1sTGlicmFyeV9lcnJvcl9zZXRfdmFsdWVfMyk7IAotCQl9Ci0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0TWVwRmVhdHVyZVZhbHVlKEVEYXRhT2JqZWN0IG9iaiwgU3RyaW5nIGZlYXR1cmVOYW1lLCBPYmplY3QgdmFsdWUpIHsKLQkJTGlzdCBzcmNMaXN0ID0gKExpc3QpIHZhbHVlOwotCQlpZiAoc3JjTGlzdCA9PSBudWxsIHx8IHNyY0xpc3QuaXNFbXB0eSgpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBGZWF0dXJlTWFuYWdlci5JTlNUQU5DRS5nZXRYbWxGZWF0dXJlKG9iagotCQkJCS5lQ2xhc3MoKSwgZmVhdHVyZU5hbWUpOwotCQlMaXN0IHRndExpc3QgPSAoTGlzdCkgb2JqLmVHZXQoZmVhdHVyZSk7Ci0JCWZvciAoaW50IGk9MDsgaSA8IHNyY0xpc3Quc2l6ZSgpOyBpKyspIHsKLQkJCU9iamVjdCBzcmNJdGVtID0gc3JjTGlzdC5nZXQoaSk7Ci0JCQlpZiAoc3JjSXRlbSBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudFByb3BlcnR5KSB7Ci0JCQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50UHJvcGVydHkgbWVwID0gCi0JCQkJCQkob3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50UHJvcGVydHkpIHNyY0l0ZW07Ci0JCQkJRUNsYXNzIG9iakNsYXNzID0gRmVhdHVyZU1hbmFnZXIuSU5TVEFOQ0UKLQkJCQkuZ2V0WG1sRUNsYXNzKCJNZXRob2RFbGVtZW50UHJvcGVydHkiKTsJLy8kTk9OLU5MUy0xJAotCQkJCU1ldGhvZEVsZW1lbnRQcm9wZXJ0eSB4bWxNZXAgPSAoTWV0aG9kRWxlbWVudFByb3BlcnR5KSBFY29yZVV0aWwuY3JlYXRlKG9iakNsYXNzKTsKLQkJCQl4bWxNZXAuc2V0VmFsdWUobWVwLmdldFZhbHVlKCkpOwotCQkJCXhtbE1lcC5zZXROYW1lKG1lcC5nZXROYW1lKCkpOwotCQkJCXRndExpc3QuYWRkKHhtbE1lcCk7Ci0JCQl9Ci0JCX0KLQkJLy9vYmouZVNldChmZWF0dXJlLCB0Z3RMaXN0KTsKLQl9Ci0KLQkvKioKLQkgKiBzZXQgdGhlIGlkIHJlZmVyZW5jZXMgZm9yIHRoZSBvYmplY3QKLQkgKiAKLQkgKiBAcGFyYW0gb2JqCi0JICogICAgICAgICAgICBFRGF0YU9iamVjdCB0aGUgb2JqZWN0Ci0JICogQHBhcmFtIGZlYXR1cmVOYW1lCi0JICogICAgICAgICAgICBTdHJpbmcgdGhlIGZlYXR1cmUgb2YgdGhlIG9iamVjdAotCSAqIEBwYXJhbSBpZFZhbHVlCi0JICogICAgICAgICAgICBTdHJpbmcgdGhlIGlkIHJlZmVyZW5jZSB2YWx1ZSBvZiB0aGUgZmVhdHVyZQotCSAqIEBwYXJhbSB2YWx1ZVR5cGUKLQkgKiAgICAgICAgICAgIFR5cGUgdGhlIG9iamVjdCB0eXBlIG9mIHRoZSByZWZlcmVuY2UuIE5lZWQgdG8gaGF2ZSB0aGlzIHRvCi0JICogICAgICAgICAgICBkZXRlcm1pbmUgdGhlIHhtbCBmZWF0dXJlIGluIGNhc2UgdGhlIGZlYXR1cmUgbWFwcHRpbmcgaXMgbm90Ci0JICogICAgICAgICAgICB1bmlxdWUKLQkgKiBAdGhyb3dzIEV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlZmVyZW5jZVZhbHVlKEVEYXRhT2JqZWN0IG9iaiwgU3RyaW5nIGZlYXR1cmVOYW1lLAotCQkJU3RyaW5nIGlkVmFsdWUsIFR5cGUgdmFsdWVUeXBlKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJaWYgKG9iaiA9PSBudWxsIHx8IGZlYXR1cmVOYW1lID09IG51bGwgfHwgaWRWYWx1ZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlpZiAoRmVhdHVyZU1hbmFnZXIuSU5TVEFOQ0UuaXNVbm5lZWRlZFJtY0ZlYXR1cmUoZmVhdHVyZU5hbWUpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQkvLyBmaW5kIHRoZSBmZWF0dXJlIGFuZCBzZXQgdGhlIHZhbHVlCi0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gRmVhdHVyZU1hbmFnZXIuSU5TVEFOQ0UuZ2V0WG1sRmVhdHVyZShvYmoKLQkJCQkuZUNsYXNzKCksIGZlYXR1cmVOYW1lLCB2YWx1ZVR5cGUuZ2V0TmFtZSgpKTsKLQkJaWYgKGZlYXR1cmUgPT0gbnVsbCkgewotCQkJT2JqZWN0W10gcGFyYXMgPSBuZXcgT2JqZWN0W10geyBmZWF0dXJlTmFtZSwgb2JqLCBpZFZhbHVlIH07Ci0JCQlsb2dnZXIubG9nV2FybmluZyhOTFMuYmluZCgKLQkJCQkJRXhwb3J0WE1MUmVzb3VyY2VzLnhtbExpYnJhcnlfZXJyb3Jfc2V0X3JlZmVyZW5jZSwgcGFyYXMpKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCVN0cmluZyBzdHIgPSBmZWF0dXJlLmdldEVUeXBlKCkuZ2V0TmFtZSgpOwotCQlpZiAoc3RyLmVxdWFscygiU3RyaW5nIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKGZlYXR1cmUuaXNNYW55KCkpIHsKLQkJCQlMaXN0IGwgPSAoTGlzdCkgb2JqLmVHZXQoZmVhdHVyZSk7Ci0JCQkJaWYgKCFsLmNvbnRhaW5zKGlkVmFsdWUpKSB7Ci0JCQkJCWwuYWRkKGlkVmFsdWUpOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJb2JqLmVTZXQoZmVhdHVyZSwgaWRWYWx1ZSk7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoZmVhdHVyZSA9PSBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRBY3Rpdml0eV9CcmVha2Rvd25FbGVtZW50KCkpIHsKLQkJCS8vIHNwZWNpYWwgaGFuZGxpbmcgZm9yIGJyZWFrZG93biBlbGVtZW50LiBJbiB1bWEsIGJyZWFrZG93bgotCQkJLy8gZWxlbWVudHMgYXJlIHVuZGVyIHByb2Nlc3MgcGFja2FnZXMKLQkJCS8vIGluIHhtbCBtb2RlbCwgdGhleSBhcmUgb3duZWQgYnkgdGhlIGFjdGl2aXR5Ci0JCQlFRGF0YU9iamVjdCB2ID0gZ2V0RWxlbWVudChpZFZhbHVlKTsKLQkJCWlmICh2IGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudCkgewotCQkJCUVPYmplY3Qgb2xkX2NvbnRhaW5lciA9IHYuZUNvbnRhaW5lcigpOwotCQkJCUxpc3QgbCA9IChMaXN0KSBvYmouZUdldChmZWF0dXJlKTsKLQkJCQlpZiAoIWwuY29udGFpbnModikpIHsKLQkJCQkJbC5hZGQodik7Ci0JCQkJfQotCi0JCQkJLy8gaWYgdGhlIG9sZCBjb250YWluZXIgcGFja2FnZSBpcyBlbXB0eSwgZGVsZXRlIGl0Ci0JCQkJaWYgKChvbGRfY29udGFpbmVyIGluc3RhbmNlb2YgUHJvY2Vzc1BhY2thZ2UpCi0JCQkJCQkmJiAob2xkX2NvbnRhaW5lci5lQ29udGFpbmVyKCkgaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50KSkgewotCQkJCQlpZiAoKChQcm9jZXNzUGFja2FnZSkgb2xkX2NvbnRhaW5lcikuZ2V0UHJvY2Vzc0VsZW1lbnQoKQotCQkJCQkJCS5zaXplKCkgPT0gMCkgewotCQkJCQkJKChQcm9jZXNzUGFja2FnZSkgb2xkX2NvbnRhaW5lci5lQ29udGFpbmVyKCkpCi0JCQkJCQkJCS5nZXRNZXRob2RQYWNrYWdlKCkucmVtb3ZlKG9sZF9jb250YWluZXIpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9IGVsc2UgaWYgKCBmZWF0dXJlID09IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFdvcmtCcmVha2Rvd25FbGVtZW50X1ByZWRlY2Vzc29yKCkgKSB7Ci0JCQkvLyB0aGUgb3JrZXIgb3JkZXIgbmVlZHMgdG8gYmUgYWRkZWQgdG8gdGhlIFdvcmtCcmVha2Rvd25FbGVtZW50Ci0JCQkvLyBzaW5jZSBpbiBYbWwgbW9kZWwgdGhlIHdvcmsgb3JkZXIgaXMgY29udGFpbmVkIGJ5IHRoZSBXb3JrQnJlYWtkb3duRWxlbWVudAotCQkJLy8gSmluaHVhIFhpLCAwOC8yNC8yMDA2Ci0JCQlPYmplY3QgdiA9IGdldEVsZW1lbnQoaWRWYWx1ZSk7Ci0JCQlpZiAodiBpbnN0YW5jZW9mIFdvcmtPcmRlcikgewotCQkJCSgoV29ya0JyZWFrZG93bkVsZW1lbnQpb2JqKS5nZXRQcmVkZWNlc3NvcigpLmFkZCgoV29ya09yZGVyKXYpOwotCQkJfQotCQl9IGVsc2UgewotCQkJLy8gbm90IGhhbmRsZWQsIGFkZCB3YXJuaW5nIGxvZwotCQkJLy8gdGhlIGlkIGZlYXR1cmUgdmFsdWUgaXMgbm90IHNldAotCQkJLy8gSkluaHVhIFhpLCBUT0RPCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZHQKLQkgKiBAcmV0dXJuIGEgWG1sIGRhdGUuCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRYbWxEYXRlKGphdmEudXRpbC5EYXRlIGR0KSB7Ci0JCVNpbXBsZURhdGVGb3JtYXQgc2RmID0gbmV3IFNpbXBsZURhdGVGb3JtYXQoInl5eXktTU0tZGQgaGg6bW06c3MiKTsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgZHRTdHIgPSBzZGYuZm9ybWF0KGR0KTsKLQkJZHRTdHIgPSBkdFN0ci5yZXBsYWNlKCcgJywgJ1QnKTsKLQkJRURhdGFUeXBlIHR5cGUgPSBYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RGF0ZVRpbWUoKTsKLQkJcmV0dXJuIFhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGcm9tU3RyaW5nKHR5cGUsIGR0U3RyKTsKLQotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldFN0cmluZyhPYmplY3Qgb2JqKSB7Ci0JCVN0cmluZyBzdHIgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQlpZiAob2JqIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJTWV0aG9kRWxlbWVudCBtZSA9IChNZXRob2RFbGVtZW50KSBvYmo7Ci0JCQlzdHIgPSBtZS5nZXRUeXBlKCkuZ2V0TmFtZSgpICsgIjoiICsgbWUuZ2V0TmFtZSgpOyAvLyROT04tTkxTLTEkCi0JCX0gZWxzZSBpZiAob2JqICE9IG51bGwpIHsKLQkJCXN0ciA9IG9iai50b1N0cmluZygpOwotCQl9Ci0KLQkJcmV0dXJuIHN0cjsKLQl9Ci0KLQkvKioKLQkgKiBmaXggdGhlIGxpYnJhcnkgc28gdGhhdCBpdCBtZWV0cyB0aGUgdW1hIGxpYnJhcnkgc3RhbmRhcmRzCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgZml4TGlicmFyeUZvckltcG9ydCgpIHsKLQotCQlmaXhHdWlkKChNZXRob2RFbGVtZW50KSByb290T2JqZWN0KTsKLQotCQlpZiAocm9vdE9iamVjdCBpbnN0YW5jZW9mIE1ldGhvZExpYnJhcnkpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSAoKE1ldGhvZExpYnJhcnkpIHJvb3RPYmplY3QpLmdldE1ldGhvZFBsdWdpbigpCi0JCQkJCS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJZml4UGx1Z2luKChNZXRob2RQbHVnaW4pIGl0Lm5leHQoKSk7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAocm9vdE9iamVjdCBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikgewotCQkJZml4UGx1Z2luKChNZXRob2RQbHVnaW4pIHJvb3RPYmplY3QpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogZml4IHRoZSBsaWJyYXJ5IHNvIHRoYXQgaXQgbWVldHMgdGhlIHhtbCBzY2hlbWEgc3RhbmRhcmRzCi0JICogYWxzbyByZW1vdmUgcG9zc2libGUgc3RydWN0dXJlIGVycm9ycyBzdWNoIGFzIFByb2Nlc3NDb21wb25lbnQgd2l0aG91dCBwcm9jZXNzIGluIGl0LgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIGZpeExpYnJhcnlGb3JFeHBvcnQoKSB7Ci0KLQkJTGlzdCBpbnZhbGlkSXRlbXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSAoKE1ldGhvZExpYnJhcnkpIHJvb3RPYmplY3QpLmVBbGxDb250ZW50cygpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3Qgb2JqID0gaXQubmV4dCgpOwotCQkJaWYgKCBvYmogaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50ICkgewotCQkJCW9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3MgcHJvYyA9ICgoUHJvY2Vzc0NvbXBvbmVudClvYmopLmdldFByb2Nlc3MoKTsKLQkJCQlpZiAoIHByb2MgPT0gbnVsbCApIHsKLQkJCQkJaW52YWxpZEl0ZW1zLmFkZChvYmopOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCS8vIHJlbW92ZSB0aGUgb2JqZWN0cwotCQl3aGlsZSAoaW52YWxpZEl0ZW1zLnNpemUoKSA+IDAgKSB7Ci0JCQlFT2JqZWN0IG9iaiA9IChFT2JqZWN0KWludmFsaWRJdGVtcy5yZW1vdmUoMCk7Ci0JCQlFY29yZVV0aWwucmVtb3ZlKG9iaik7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogZml4IHRhc2sgZGVzY3JpcHRvcnMgZm9yIGV4cG9ydAotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIGZpeFRhc2tEZXNjcmlwdG9yc0ZvckV4cG9ydChNYXA8U3RyaW5nLCBUYXNrRGVzY3JpcHRvcj4gdGRNYXApIHsKLQkJaWYgKHRkTWFwID09IG51bGwgfHwgdGRNYXAuaXNFbXB0eSgpKSB7Ci0JCQlyZXR1cm47Ci0JCX0JCQotCQlmb3IgKEl0ZXJhdG9yPE1hcC5FbnRyeTxTdHJpbmcsIFRhc2tEZXNjcmlwdG9yPj4gaXQgPSB0ZE1hcC5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCU1hcC5FbnRyeTxTdHJpbmcsIFRhc2tEZXNjcmlwdG9yPiBlbnRyeSA9IGl0Lm5leHQoKTsKLQkJCVN0cmluZyBndWlkID0gZW50cnkuZ2V0S2V5KCk7Ci0JCQlUYXNrRGVzY3JpcHRvciB0ZCA9IGVudHJ5LmdldFZhbHVlKCk7Ci0JCQlvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UYXNrRGVzY3JpcHRvciB4bWxUZCA9IChvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UYXNrRGVzY3JpcHRvcikgZWxlbWVudHNNYXAuZ2V0KGd1aWQpOwotCQkJYXNzZXJ0KHhtbFRkICE9IG51bGwpOwotCQkJaWYgKHhtbFRkID09IG51bGwpIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCUxpc3Qgc3RlcHMgPSB0ZC5nZXRTZWxlY3RlZFN0ZXBzKCk7Ci0JCQlmb3IgKGludCBpPTA7IGk8c3RlcHMuc2l6ZSgpOyBpKyspIHsKLQkJCQlvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQgc3RlcCA9IChvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQpIHN0ZXBzLmdldChpKTsKLQkJCQlTZWN0aW9uIHhtbFN0ZXAgPSAgKFNlY3Rpb24pIGVsZW1lbnRzTWFwLmdldChzdGVwLmdldEd1aWQoKSk7Ci0JCQkJYXNzZXJ0KHhtbFN0ZXAgIT0gbnVsbCk7Ci0JCQkJaWYgKHhtbFN0ZXAgIT0gbnVsbCkgewotCQkJCQl4bWxTdGVwID0gKFNlY3Rpb24pIEVjb3JlVXRpbC5jb3B5KHhtbFN0ZXApOwotCQkJCQl4bWxUZC5nZXRTdGVwKCkuYWRkKHhtbFN0ZXApOwotCQkJCX0KLQkJCX0JCQkKLQkJfQkJCi0JfQotCQkJCi0JLyoqCi0JICogZ2V0IGEgbGlzdCBvZiByZWZlcmVuY2VkIHBsdWdpbnMgZm9yIHRoZSBsaWJyYXJ5LiBUaGUgcmVmZXJlbmNlZCBwbHVnaW5zCi0JICogZG9lcyBub3QgaW5jbHVkZSB0aGUgb25lcyBpbnNpZGUgdGhpcyBsaWJyYXJ5LiBXaGVuIGltcG9ydGluZywgdGhlc2UKLQkgKiBwbHVnaW5zIG11c3QgYmUgaW4gdGhlIHRhcmdldCBsaWJyYXJ5IGFscmVhZHkuCi0JICogCi0JICogQHJldHVybiBMaXN0IGEgbGlzdCBvZiByZWZlcmVuY2VkIHBsdWdpbnMKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRSZWZlcmVuY2VkUGx1Z2lucygpIHsKLQotCQlMaXN0IGV4dGVybmFsUGx1Z2lucyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQlpZiAoIShyb290T2JqZWN0IGluc3RhbmNlb2YgTWV0aG9kTGlicmFyeSkpIHsKLQkJCXJldHVybiBleHRlcm5hbFBsdWdpbnM7Ci0JCX0KLQotCQlMaXN0IHNlbGVjdGVkUGx1Z2lucyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChJdGVyYXRvciBpdCA9ICgoTWV0aG9kTGlicmFyeSkgcm9vdE9iamVjdCkuZ2V0TWV0aG9kUGx1Z2luKCkKLQkJCQkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IChNZXRob2RQbHVnaW4pIGl0Lm5leHQoKTsKLQkJCVN0cmluZyBpZCA9IHBsdWdpbi5nZXRJZCgpOwotCQkJc2VsZWN0ZWRQbHVnaW5zLmFkZChpZCk7Ci0JCQlpZiAoZXh0ZXJuYWxQbHVnaW5zLmNvbnRhaW5zKGlkKSkgewotCQkJCWV4dGVybmFsUGx1Z2lucy5yZW1vdmUoaWQpOwotCQkJfQotCi0JCQlmb3IgKEl0ZXJhdG9yIGl0ciA9IHBsdWdpbi5nZXRSZWZlcmVuY2VkTWV0aG9kUGx1Z2luKCkuaXRlcmF0b3IoKTsgaXRyCi0JCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJU3RyaW5nIHJlZiA9IChTdHJpbmcpIGl0ci5uZXh0KCk7Ci0JCQkJaWYgKCFzZWxlY3RlZFBsdWdpbnMuY29udGFpbnMocmVmKQotCQkJCQkJJiYgIWV4dGVybmFsUGx1Z2lucy5jb250YWlucyhyZWYpKSB7Ci0JCQkJCWV4dGVybmFsUGx1Z2lucy5hZGQocmVmKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gZXh0ZXJuYWxQbHVnaW5zOwotCX0KLQotCXByaXZhdGUgdm9pZCBmaXhHdWlkKE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgewotCQlpZiAoZWxlbWVudCA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQkvLyBpZiB0aGUgeG1sIGVsZW1lbnQgZG9lcyBub3QgaGF2ZSBhbiBpZCBzcGVjaWZpZWQsIGNyZWF0ZSBhIG5ldyBvbmUKLQkJU3RyaW5nIGlkID0gZWxlbWVudC5nZXRJZCgpOwotCQlpZiAoaWQgPT0gbnVsbCB8fCBpZC5lcXVhbHMoIiIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCWlkID0gRWNvcmVVdGlsLmdlbmVyYXRlVVVJRCgpOwotCQkJZWxlbWVudC5zZXRJZChpZCk7Ci0JCQlTdHJpbmcgbXNnID0gTkxTLmJpbmQoRXhwb3J0WE1MUmVzb3VyY2VzLnhtbExpYnJhcnlfbmV3X2lkLAotCQkJCQlnZXRTdHJpbmcoZWxlbWVudCksIGlkKTsKLQkJCWxvZ2dlci5sb2dXYXJuaW5nKG1zZyk7Ci0JCX0gZWxzZSB7Ci0JCQkvLyBjaGVjayBpZiB0aGUgZWxlbWVudCBoYXMgYSB1bmlxdWUgaWQgb3Igbm90Ci0JCQlPYmplY3Qgb2xkID0gZ2V0RWxlbWVudChpZCk7Ci0JCQlpZiAoKG9sZCAhPSBudWxsKSAmJiAob2xkICE9IGVsZW1lbnQpKSB7Ci0JCQkJaWYgKCEgKCAob2xkIGluc3RhbmNlb2YgU2VjdGlvbikgJiYgCi0JCQkJCQkoZWxlbWVudCBpbnN0YW5jZW9mIFNlY3Rpb24pIAotCQkJCQkgICApKSB7Ci0JCQkJCWxvZ2dlci5sb2dXYXJuaW5nKE5MUy5iaW5kKAotCQkJCQkJRXhwb3J0WE1MUmVzb3VyY2VzLnhtbExpYnJhcnlfaWRfbm90X3VuaXF1ZSwgaWQpKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCXNldEVsZW1lbnQoaWQsIGVsZW1lbnQpOwotCQl9Ci0JCS8vIGl0ZXJhdGUgdGhlIGNoaWxkcmVuCi0JCWZvciAoSXRlcmF0b3IgaXQgPSBlbGVtZW50LmVDb250ZW50cygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBvID0gaXQubmV4dCgpOwotCQkJaWYgKG8gaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQkJZml4R3VpZCgoTWV0aG9kRWxlbWVudCkgbyk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgZml4UGx1Z2luKE1ldGhvZFBsdWdpbiBwbHVnaW4pIHsKLQotCQkvLyBmaW5kIGFsbCBwcm9jZXNzZXMgYW5kIG1ha2Ugc3VyZSB0aGV5IGFyZSB3cmFwcGVkIHdpdGggYQotCQkvLyBQcm9jZXNzQ29tcG9uZW50LAotCQkvLyBpZiBub3QsIGNyZWF0ZSBvbmUuCi0JCS8vIGNvbGxlY3QgdGhlIHByb2Nlc3NlcyB0byBiZSBmaXhlZCwKLQkJLy8gZG9uJ3QgZml4IHdpdGhpbiB0aGUgaXRlcmF0aW9uLCBtYXkgY2F1c2UgY29uY3VycmVudCBtb2RpZmljYXRpb24KLQkJLy8gZXhlY2VwdGlvbgotCQlMaXN0IHByb2NzID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gcGx1Z2luLmVBbGxDb250ZW50cygpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlFT2JqZWN0IG8gPSAoRU9iamVjdCkgaXQubmV4dCgpOwotCQkJaWYgKGlzUHJvY2VzcyhvKSkgewotCQkJCXByb2NzLmFkZChvKTsKLQkJCX0KLQkJfQotCi0JCWlmIChwcm9jcy5zaXplKCkgPiAwKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gcHJvY3MuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCWZpeFByb2Nlc3MoKG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3MpIGl0Lm5leHQoKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBJbiBFUEYsIGEgcHJvY2VzcyAoQ2FwYWJpbGl0eSBwYXR0ZXJuIGFuZCBEZWxpdmVyeSBQcm9jZXNzKSBjYW4gYmUgcmVzaWRlCi0JICogaW4gYSBQcm9jZXNzUGFja2FnZSBvciBhIFByb2Nlc3NDb21wb25lbnQuIElmIGl0J3MgaW4gYSBwcm9jZXNzQ29tcG9uZW50LAotCSAqIGl0IGlzIHRyZWF0ZWQgYXMgYSByb290IGxldmVsIHByb2Nlc3MuIElmIGl0J3MgaW4gYSBQcm9jZXNzUGFja2FnZSwgaXQgaXMKLQkgKiB0cmVhdGVkIGFzIGEgbG9jYWwgY29weSBvZiBhbm90aGVyIHByb2Nlc3MuIFNvIHdlIG5lZWQgdG8gY2hlY2sgdGhlCi0JICogcGFyZW50IGFuZCBzZWUgaXQgdGhpcyBwcm9jZXNzIGlzIGNvbnRhaW5lZCBieSBhIFByb2Nlc3NDb21wb25lbnQuCi0JICogCi0JICogQHBhcmFtIE9iagotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc1Byb2Nlc3MoRU9iamVjdCBvYmopIHsKLQkJaWYgKCEob2JqIGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2VzcykpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCW9iaiA9IG9iai5lQ29udGFpbmVyKCk7Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50KSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0JCS8vIGlmIGl0J3MgaW1tZWRpYXRlIHBhcmVudCBpcyBub3QgYSBQcm9jZXNzQ29tcG9uZW50IGJ1dCBpdCdzIHdpdGhpbiBhCi0JCS8vIFByb2Nlc3NDb21wb25lbnQKLQkJLy8gaXQncyBhIGxvY2FsIGNvcHkgb2YgdGhlIHByb2Nlc3MKLQkJd2hpbGUgKCgob2JqID0gb2JqLmVDb250YWluZXIoKSkgIT0gbnVsbCkKLQkJCQkmJiAob2JqIGluc3RhbmNlb2YgUHJvY2Vzc1BhY2thZ2UpKSB7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiB0cnVlOwotCX0KLQotCXByaXZhdGUgdm9pZCBmaXhQcm9jZXNzKG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3MgcHJvYykgewotCQlFRGF0YU9iamVjdCBjb250YWluZXIgPSAoRURhdGFPYmplY3QpIHByb2MuZUNvbnRhaW5lcigpOwotCQlQcm9jZXNzQ29tcG9uZW50IHBjID0gbnVsbDsKLQkJaWYgKGNvbnRhaW5lciBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCWlmICghKGNvbnRhaW5lciBpbnN0YW5jZW9mIFByb2Nlc3NQYWNrYWdlKSkgewotCQkJU3RyaW5nIG1zZyA9IE5MUwotCQkJCQkuYmluZCgKLQkJCQkJCQlFeHBvcnRYTUxSZXNvdXJjZXMueG1sTGlicmFyeV9lcnJvcl9wcm9jZXNzX3dyb25nX2NvbnRhaW5lciwKLQkJCQkJCQlwcm9jLmdldE5hbWUoKSwgY29udGFpbmVyLmdldFR5cGUoKS5nZXROYW1lKCkpOwotCQkJbG9nZ2VyLmxvZ1dhcm5pbmcobXNnKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCXBjID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUHJvY2Vzc0NvbXBvbmVudCgpOwotCQlTdHJpbmcgaWQgPSBnZXRUYXJnZXRQYXJlbnRJZChwcm9jLmdldElkKCkpOwotCQlpZiAoaWQgPT0gbnVsbCkgewotCQkJaWQgPSBFY29yZVV0aWwuZ2VuZXJhdGVVVUlEKCk7Ci0JCX0KLQotCQlwYy5zZXRJZChpZCk7Ci0JCXBjLnNldE5hbWUocHJvYy5nZXROYW1lKCkpOwotCQkoKFByb2Nlc3NQYWNrYWdlKSBjb250YWluZXIpLmdldFByb2Nlc3NFbGVtZW50KCkucmVtb3ZlKHByb2MpOwotCQkoKFByb2Nlc3NQYWNrYWdlKSBjb250YWluZXIpLmdldE1ldGhvZFBhY2thZ2UoKS5hZGQocGMpOwotCQlwYy5zZXRQcm9jZXNzKHByb2MpOwotCi0JfQotCi0JLyoqCi0JICogaWYgdGhlIHByb2Nlc3MgZXhpc3RzIGluIHRoZSB0YXJnZXQgbGlicmFyeSwgZ2V0IHRoZSBwcm9jZXNzIGNvbXBvbmVudCBpZAotCSAqIGZyb20gdGhlIHRhcmdldCBsaWJyYXJ5Ci0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0VGFyZ2V0UGFyZW50SWQoU3RyaW5nIGlkKSB7Ci0JCUlMaWJyYXJ5TWFuYWdlciBtYW5hZ2VyID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKQotCQkJCS5nZXRDdXJyZW50TGlicmFyeU1hbmFnZXIoKTsKLQkJaWYgKG1hbmFnZXIgIT0gbnVsbCkgewotCQkJRU9iamVjdCBvYmogPSBtYW5hZ2VyLmdldE1ldGhvZEVsZW1lbnQoaWQpOwotCQkJaWYgKG9iaiAhPSBudWxsKSB7Ci0JCQkJb2JqID0gb2JqLmVDb250YWluZXIoKTsKLQkJCQlpZiAob2JqIGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50KSB7Ci0JCQkJCXJldHVybiAoKG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudCkgb2JqKS5nZXRHdWlkKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHBrZwotCSAqIEByZXR1cm4gdGhlIGxpc3Qgb2YgYWxsIHByb2Nlc3NlcyBpbiBwa2cuCi0JICovCi0JcHVibGljIExpc3QgZ2V0QWxsUHJvY2Vzc2VzKE1ldGhvZFBhY2thZ2UgcGtnKSB7Ci0JCUxpc3QgcHJvY2Vzc2VzID0gbmV3IEFycmF5TGlzdCgpOwotCQlfaXRlcmF0ZVBhY2thZ2VGb3JQcm9jZXNzZXMocGtnLCBwcm9jZXNzZXMpOwotCi0JCXJldHVybiBwcm9jZXNzZXM7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIF9pdGVyYXRlUGFja2FnZUZvclByb2Nlc3NlcyhNZXRob2RQYWNrYWdlIHBrZywgTGlzdCBwcm9jZXNzZXMpIHsKLQkJaWYgKHBrZyBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpIHsKLQkJCW9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3MgcCA9ICgoUHJvY2Vzc0NvbXBvbmVudCkgcGtnKQotCQkJCQkuZ2V0UHJvY2VzcygpOwotCQkJaWYgKHAgIT0gbnVsbCAmJiAhcHJvY2Vzc2VzLmNvbnRhaW5zKHApKSB7Ci0JCQkJcHJvY2Vzc2VzLmFkZChwKTsKLQkJCX0KLQkJfQotCi0JCWZvciAoSXRlcmF0b3IgaXQgPSBwa2cuZ2V0TWV0aG9kUGFja2FnZSgpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCV9pdGVyYXRlUGFja2FnZUZvclByb2Nlc3NlcygoTWV0aG9kUGFja2FnZSkgaXQubmV4dCgpLCBwcm9jZXNzZXMpOwotCQl9Ci0JfQotCi0JCi0JLyoqCi0JICogU2F2ZSBleHRyYSBpbmZvIChhbGwgcGx1Z2luIGd1aWRzIGFuZCBuYW1lcykgaW4gbGliVGFnJ3MgTWV0aG9kRWxlbWVudFByb3BlcnR5Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgc3RvcmVFeHRyYUluZm8oTGlzdDxvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbj4gcGx1Z2lucykgewotCQlpZiAocGx1Z2lucyA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0JCQotCQkKLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBGZWF0dXJlTWFuYWdlci5JTlNUQU5DRS5nZXRYbWxGZWF0dXJlKHJvb3RPYmplY3QKLQkJCQkuZUNsYXNzKCksICJtZXRob2RFbGVtZW50UHJvcGVydHkiKTsJCS8vJE5PTi1OTFMtMSQKLQkJCi0JCUxpc3QgbWVwTGlzdCA9IChMaXN0KSByb290T2JqZWN0LmVHZXQoZmVhdHVyZSk7Ci0JCUVDbGFzcyBtZXBDbGFzcyA9IEZlYXR1cmVNYW5hZ2VyLklOU1RBTkNFLmdldFhtbEVDbGFzcygiTWV0aG9kRWxlbWVudFByb3BlcnR5Iik7CS8vJE5PTi1OTFMtMSQKLQkJCi0JCU1ldGhvZEVsZW1lbnRQcm9wZXJ0eSB4bWxNZXAgPSAoTWV0aG9kRWxlbWVudFByb3BlcnR5KSBFY29yZVV0aWwuY3JlYXRlKG1lcENsYXNzKTsKLQkJCi0JCS8vVmVyc2lvbgotCQl4bWxNZXAuc2V0VmFsdWUoIjAiKTsJLy8kTk9OLU5MUy0xJAotCQltZXBMaXN0LmFkZCh4bWxNZXApOwotCQkJCQkKLQkJZm9yIChJdGVyYXRvcjxvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbj4gaXQgPSBwbHVnaW5zLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCW9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luIHBsdWcgPSBpdC5uZXh0KCk7Ci0JCQkKLQkJCXhtbE1lcCA9IChNZXRob2RFbGVtZW50UHJvcGVydHkpIEVjb3JlVXRpbC5jcmVhdGUobWVwQ2xhc3MpOwotCQkJeG1sTWVwLnNldFZhbHVlKHBsdWcuZ2V0R3VpZCgpKTsKLQkJCW1lcExpc3QuYWRkKHhtbE1lcCk7Ci0JCQkKLQkJCXhtbE1lcCA9IChNZXRob2RFbGVtZW50UHJvcGVydHkpIEVjb3JlVXRpbC5jcmVhdGUobWVwQ2xhc3MpOwotCQkJeG1sTWVwLnNldFZhbHVlKHBsdWcuZ2V0TmFtZSgpKTsKLQkJCW1lcExpc3QuYWRkKHhtbE1lcCk7Ci0JCX0KLQkJCi0JfQotCQotCS8qKgotCSAqIEdldCBndWlkIHRvIHBsdWdpbiBtYXAKLQkgKi8KLQlwdWJsaWMgTWFwPFN0cmluZywgU3RyaW5nPiBnZXRHdWlkVG9QbHVnTmFtZU1hcCgpIHsKLQkJaWYgKGd1aWRUb1BsdWdOYW1lTWFwID09IG51bGwpIHsKLQkJCXJlY2FsbEV4dHJhSW5mbygpOwotCQl9CQkKLQkJcmV0dXJuIGd1aWRUb1BsdWdOYW1lTWFwOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgcmVjYWxsRXh0cmFJbmZvKCkgewotCQl0cnkgewotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBGZWF0dXJlTWFuYWdlci5JTlNUQU5DRS5nZXRYbWxGZWF0dXJlKHJvb3RPYmplY3QKLQkJCQkJLmVDbGFzcygpLCAibWV0aG9kRWxlbWVudFByb3BlcnR5Iik7CQkvLyROT04tTkxTLTEkCi0JCQkKLQkJCUxpc3Q8TWV0aG9kRWxlbWVudFByb3BlcnR5PiBtZXBMaXN0ID0gKExpc3Q8TWV0aG9kRWxlbWVudFByb3BlcnR5Pikgcm9vdE9iamVjdC5lR2V0KGZlYXR1cmUpOwotCQkJaWYgKG1lcExpc3QgPT0gbnVsbCB8fCBtZXBMaXN0LmlzRW1wdHkoKSkgewotCQkJCXJldHVybjsKLQkJCX0KLQkJCWd1aWRUb1BsdWdOYW1lTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7Ci0JCQkKLQkJCU1ldGhvZEVsZW1lbnRQcm9wZXJ0eSBtZXAgPSBtZXBMaXN0LmdldCgwKTsKLQkJCWlmIChtZXAuZ2V0VmFsdWUoKS5lcXVhbHMoIjAiKSkgeyAvLyROT04tTkxTLTEkICAKLQkJCQlmb3IgKGludCBpID0gMTsgaSA8IG1lcExpc3Quc2l6ZSgpOykgewotCQkJCQlTdHJpbmcgZ3VpZCA9IG1lcExpc3QuZ2V0KGkpLmdldFZhbHVlKCk7Ci0JCQkJCVN0cmluZyBuYW1lID0gbWVwTGlzdC5nZXQoaSsxKS5nZXRWYWx1ZSgpOwotCQkJCQlndWlkVG9QbHVnTmFtZU1hcC5wdXQoZ3VpZCwgbmFtZSk7Ci0JCQkJCWkgKz0gMjsKLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlndWlkVG9QbHVnTmFtZU1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOwotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0KLQkKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3htbC9zZXJ2aWNlcy9wYWNrYWdlLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC94bWwvc2VydmljZXMvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmI3Njc1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3htbC9zZXJ2aWNlcy9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyB0aGUgaW50ZXJmYWNlcyBhbmQgaW1wbGVtZW50YXRpb24gZm9yIHRoZSBFeHBvcnQgWE1MIHNlcnZpY2UuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQveG1sL3dpemFyZHMvRXhwb3J0WE1MV2l6YXJkLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC94bWwvd2l6YXJkcy9FeHBvcnRYTUxXaXphcmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzYwNDI4NS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC94bWwvd2l6YXJkcy9FeHBvcnRYTUxXaXphcmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC53aXphcmRzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpLnV0aWwuTXNnQm94OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQuc2VydmljZXMuQ29uZmlndXJhdGlvbkV4cG9ydERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5zZXJ2aWNlcy5QbHVnaW5FeHBvcnREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sLkV4cG9ydFhNTFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC5FeHBvcnRYTUxSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwucHJlZmVyZW5jZXMuRXhwb3J0WE1MUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwuc2VydmljZXMuRXhwb3J0WE1MRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC5zZXJ2aWNlcy5FeHBvcnRYTUxTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVXaXRoUHJvZ3Jlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUltcG9ydFdpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotCi0vKioKLSAqIFRoZSBFeHBvcnQgWE1MIHdpemFyZC4KLSAqIDxwPgotICogVGhpcyB3aXphcmQgaXMgdXNlZCB0byBleHBvcnQgbWV0aG9kIGxpYnJhcnkgY29udGVudCB0byBYTUwgZmlsZXMuCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEV4cG9ydFhNTFdpemFyZCBleHRlbmRzIFdpemFyZCBpbXBsZW1lbnRzIElJbXBvcnRXaXphcmQgewotCi0JcHJpdmF0ZSBTZWxlY3RFeHBvcnRUeXBlUGFnZSBzZWxlY3RFeHBvcnRUeXBlUGFnZTsKLQotCXByb3RlY3RlZCBTZWxlY3RQbHVnaW5QYWdlIHNlbGVjdFBsdWdpblBhZ2U7Ci0KLQlwcm90ZWN0ZWQgVmlld1BsdWdpbkluZm9QYWdlIHZpZXdQbHVnaW5JbmZvUGFnZTsKLQotCXByb3RlY3RlZCBWaWV3RXhwb3J0U3VtbWFyeVBhZ2Ugdmlld0V4cG9ydFN1bW1hcnlQYWdlOwotCi0JcHJvdGVjdGVkIFNlbGVjdENvbmZpZ1BhZ2Ugc2VsZWN0Q29uZmlnUGFnZTsKLQotCXByb3RlY3RlZCBTZWxlY3RYTUxGaWxlUGFnZSBzZWxlY3RYTUxGaWxlUGFnZTsKLQotCXByb3RlY3RlZCBFeHBvcnRYTUxEYXRhIHhtbERhdGEgPSBuZXcgRXhwb3J0WE1MRGF0YSgpOwotCi0JcHJvdGVjdGVkIFBsdWdpbkV4cG9ydERhdGEgcGx1Z2luRGF0YSA9IG5ldyBQbHVnaW5FeHBvcnREYXRhKCk7Ci0KLQlwcm90ZWN0ZWQgQ29uZmlndXJhdGlvbkV4cG9ydERhdGEgY29uZmlnRGF0YSA9IG5ldyBDb25maWd1cmF0aW9uRXhwb3J0RGF0YSgpOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgRXhwb3J0WE1MV2l6YXJkKCkgewotCQlzdXBlcigpOwotCQlzZXRXaW5kb3dUaXRsZShFeHBvcnRYTUxSZXNvdXJjZXMuZXhwb3J0WE1MV2l6YXJkX3RpdGxlKTsKLQkJc2V0TmVlZHNQcm9ncmVzc01vbml0b3IodHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2l6YXJkI2luaXQoSVdvcmtiZW5jaCwKLQkgKiAgICAgIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaCB3b3JrYmVuY2gsIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZCNhZGRQYWdlcygpCi0JICovCi0JcHVibGljIHZvaWQgYWRkUGFnZXMoKSB7Ci0JCXNlbGVjdEV4cG9ydFR5cGVQYWdlID0gbmV3IFNlbGVjdEV4cG9ydFR5cGVQYWdlKCk7Ci0JCXNlbGVjdFBsdWdpblBhZ2UgPSBuZXcgU2VsZWN0UGx1Z2luUGFnZShwbHVnaW5EYXRhKTsKLQkJdmlld1BsdWdpbkluZm9QYWdlID0gbmV3IFZpZXdQbHVnaW5JbmZvUGFnZShwbHVnaW5EYXRhKTsKLQkJdmlld0V4cG9ydFN1bW1hcnlQYWdlID0gbmV3IFZpZXdFeHBvcnRTdW1tYXJ5UGFnZShwbHVnaW5EYXRhKTsKLQkJc2VsZWN0Q29uZmlnUGFnZSA9IG5ldyBTZWxlY3RDb25maWdQYWdlKGNvbmZpZ0RhdGEpOwotCQlzZWxlY3RYTUxGaWxlUGFnZSA9IG5ldyBTZWxlY3RYTUxGaWxlUGFnZSgpOwotCi0JCWFkZFBhZ2Uoc2VsZWN0RXhwb3J0VHlwZVBhZ2UpOwotCQlhZGRQYWdlKHNlbGVjdFBsdWdpblBhZ2UpOwotCQlhZGRQYWdlKHZpZXdQbHVnaW5JbmZvUGFnZSk7Ci0JCWFkZFBhZ2Uodmlld0V4cG9ydFN1bW1hcnlQYWdlKTsKLQkJYWRkUGFnZShzZWxlY3RDb25maWdQYWdlKTsKLQkJYWRkUGFnZShzZWxlY3RYTUxGaWxlUGFnZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkI2NyZWF0ZVBhZ2VDb250cm9scyhDb21wb3NpdGUpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlUGFnZUNvbnRyb2xzKENvbXBvc2l0ZSBwYWdlQ29udGFpbmVyKSB7Ci0JCXN1cGVyLmNyZWF0ZVBhZ2VDb250cm9scyhwYWdlQ29udGFpbmVyKTsKLQkJcGFnZUNvbnRhaW5lci5nZXRTaGVsbCgpLnNldEltYWdlKAotCQkJCUV4cG9ydFhNTFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0U2hhcmVkSW1hZ2UoCi0JCQkJCQkiZnVsbC9vYmoxNi9YTUxGaWxlLmdpZiIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmQjY2FuRmluaXNoKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjYW5GaW5pc2goKSB7Ci0JCXJldHVybiBnZXRDb250YWluZXIoKS5nZXRDdXJyZW50UGFnZSgpID09IHNlbGVjdFhNTEZpbGVQYWdlCi0JCQkJJiYgc2VsZWN0WE1MRmlsZVBhZ2UuaXNQYWdlQ29tcGxldGUoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkI3BlcmZvcm1GaW5pc2goKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHBlcmZvcm1GaW5pc2goKSB7Ci0JCVN0cmluZyB4bWxGaWxlUGF0aCA9IHNlbGVjdFhNTEZpbGVQYWdlLmdldFBhdGgoKTsKLQkJRmlsZSB4bWxGaWxlID0gbmV3IEZpbGUoeG1sRmlsZVBhdGgpOwotCQlpZiAoeG1sRmlsZS5leGlzdHMoKSkgewotCQkJYm9vbGVhbiBvayA9IEV4cG9ydFhNTFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkKLQkJCQkJLmRpc3BsYXlQcm9tcHQoCi0JCQkJCQkJRXhwb3J0WE1MUmVzb3VyY2VzLmV4cG9ydFhNTFdpemFyZF90aXRsZSwKLQkJCQkJCQlFeHBvcnRYTUxSZXNvdXJjZXMuYmluZCgKLQkJCQkJCQkJCUV4cG9ydFhNTFJlc291cmNlcy5vdmVyd3JpdGVUZXh0X21zZywKLQkJCQkJCQkJCW5ldyBTdHJpbmdbXSB7IHhtbEZpbGVQYXRoIH0pKTsKLQkJCWlmICghb2spIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQotCQlJUnVubmFibGVXaXRoUHJvZ3Jlc3Mgb3AgPSBuZXcgSVJ1bm5hYmxlV2l0aFByb2dyZXNzKCkgewotCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLQkJCQkJdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gewotCQkJCUV4cG9ydFhNTFNlcnZpY2Ugc2VydmljZSA9IG51bGw7Ci0JCQkJdHJ5IHsKLQkJCQkJbW9uaXRvci5iZWdpblRhc2soRXhwb3J0WE1MUmVzb3VyY2VzLmV4cG9ydGluZ1hNTF90ZXh0LAotCQkJCQkJCUlQcm9ncmVzc01vbml0b3IuVU5LTk9XTik7Ci0KLQkJCQkJeG1sRGF0YS5zZXRYTUxGaWxlKHNlbGVjdFhNTEZpbGVQYWdlLmdldFBhdGgoKSk7Ci0JCQkJCXNlcnZpY2UgPSBuZXcgRXhwb3J0WE1MU2VydmljZSh4bWxEYXRhKTsKLQkJCQkJc2VydmljZS5kb0V4cG9ydChtb25pdG9yKTsKLQkJCQkJRXhwb3J0WE1MUHJlZmVyZW5jZXMuc2V0RXhwb3J0VHlwZSh4bWxEYXRhLmdldEV4cG9ydFR5cGUoKSk7Ci0JCQkJCUV4cG9ydFhNTFByZWZlcmVuY2VzLnNldFhNTEZpbGUoeG1sRGF0YS5nZXRYTUxGaWxlKCkpOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCXRocm93IG5ldyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uKGUpOwotCQkJCX0gZmluYWxseSB7Ci0JCQkJCW1vbml0b3IuZG9uZSgpOwotCQkJCQlpZiAoc2VydmljZSAhPSBudWxsKSB7Ci0JCQkJCQlzZXJ2aWNlLmRpc3Bvc2UoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfTsKLQkJdHJ5IHsKLQkJCWdldENvbnRhaW5lcigpLnJ1bih0cnVlLCBmYWxzZSwgb3ApOwotCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotCQkJVGhyb3dhYmxlIHJlYWxFeGNlcHRpb24gPSBlLmdldFRhcmdldEV4Y2VwdGlvbigpOwotCQkJRXhwb3J0WE1MUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKS5kaXNwbGF5RXJyb3IoCi0JCQkJCUV4cG9ydFhNTFJlc291cmNlcy5leHBvcnRYTUxXaXphcmRfdGl0bGUsCi0JCQkJCU5MUy5iaW5kKEV4cG9ydFhNTFJlc291cmNlcy5leHBvcnRYTUxXaXphcmRfZXJyb3IsCi0JCQkJCQkJcmVhbEV4Y2VwdGlvbi5nZXRNZXNzYWdlKCkpLCByZWFsRXhjZXB0aW9uKTsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCVN0cmluZyBtc2cgPSBFeHBvcnRYTUxSZXNvdXJjZXMuZXhwb3J0WE1MV2l6YXJkX3Jldmlld0xvZzsKLQkJTXNnQm94LnByb21wdChtc2csIFNXVC5PSyk7Ci0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC94bWwvd2l6YXJkcy9TZWxlY3RDb25maWdQYWdlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC94bWwvd2l6YXJkcy9TZWxlY3RDb25maWdQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxZTZjYmMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQveG1sL3dpemFyZHMvU2VsZWN0Q29uZmlnUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwud2l6YXJkczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQuc2VydmljZXMuQ29uZmlndXJhdGlvbkV4cG9ydERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC53aXphcmRzLkV4cG9ydENvbmZpZ1NlbGVjdENvbmZpZ1BhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmRQYWdlOwotCi0vKioKLSAqIEEgd2l6YXJkIHBhZ2UgdGhhdCBwcm9tcHRzIHRoZSB1c2VyIHRvIHNlbGVjdCBvbmUgb3IgbW9yZSBtZXRob2QgY29uZmlndXJhdGlvbgotICogc3BlY2lmaWNhdGlvbnMgdG8gZXhwb3J0LgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFNlbGVjdENvbmZpZ1BhZ2UgZXh0ZW5kcyBFeHBvcnRDb25maWdTZWxlY3RDb25maWdQYWdlIHsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXMgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFNlbGVjdENvbmZpZ1BhZ2UoQ29uZmlndXJhdGlvbkV4cG9ydERhdGEgZGF0YSkgewotCQlzdXBlcihkYXRhKTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkUGFnZSNnZXROZXh0UGFnZSgpCi0JICovCi0JcHVibGljIElXaXphcmRQYWdlIGdldE5leHRQYWdlKCkgewotCQlzdXBlci5zYXZlRGF0YVRvTW9kZWwoKTsKLQkJRXhwb3J0WE1MV2l6YXJkIHdpemFyZCA9IChFeHBvcnRYTUxXaXphcmQpIGdldFdpemFyZCgpOwotCQl3aXphcmQueG1sRGF0YS5zZXRTZWxlY3RlZENvbmZpZ3Mod2l6YXJkLmNvbmZpZ0RhdGEuc2VsZWN0ZWRDb25maWdzKTsJCQotCQlyZXR1cm4gd2l6YXJkLnNlbGVjdFhNTEZpbGVQYWdlOwotCX0JCi0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3htbC93aXphcmRzL1NlbGVjdEV4cG9ydFR5cGVQYWdlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC94bWwvd2l6YXJkcy9TZWxlY3RFeHBvcnRUeXBlUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMTRhMTA4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3htbC93aXphcmRzL1NlbGVjdEV4cG9ydFR5cGVQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwud2l6YXJkczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQuRXhwb3J0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sLkV4cG9ydFhNTFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC5FeHBvcnRYTUxSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwucHJlZmVyZW5jZXMuRXhwb3J0WE1MUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwuc2VydmljZXMuRXhwb3J0WE1MRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5MaWJyYXJ5VUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVpLndpemFyZHMuQmFzZVdpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci0KLS8qKgotICogQSB3aXphcmQgcGFnZSB0aGF0IGRpc3BsYXlzIHRoZSB0eXBlIG9mIG1ldGhvZCBsaWJyYXJ5IGNvbnRlbnQgdG8gZXhwb3J0LgotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBTZWxlY3RFeHBvcnRUeXBlUGFnZSBleHRlbmRzIEJhc2VXaXphcmRQYWdlIGltcGxlbWVudHMgTGlzdGVuZXIgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFHRV9OQU1FID0gU2VsZWN0RXhwb3J0VHlwZVBhZ2UuY2xhc3MuZ2V0TmFtZSgpOwotCi0JcHJpdmF0ZSBCdXR0b24gZXhwb3J0TGlicmFyeVJhZGlvQnV0dG9uOwotCi0JcHJpdmF0ZSBCdXR0b24gZXhwb3J0UGx1Z2luc1JhZGlvQnV0dG9uOwotCi0JLy8gUG9zdHBvbmVkIHRvIG5leHQgcmVsZWFzZS4KLQkvL3ByaXZhdGUgQnV0dG9uIGV4cG9ydENvbmZpZ3NSYWRpb0J1dHRvbjsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFNlbGVjdEV4cG9ydFR5cGVQYWdlKCkgewotCQlzdXBlcihQQUdFX05BTUUpOwotCQlzZXRUaXRsZShFeHBvcnRSZXNvdXJjZXMuc2VsZWN0RXhwb3J0VHlwZVBhZ2VfdGl0bGUpOwotCQlzZXREZXNjcmlwdGlvbihFeHBvcnRYTUxSZXNvdXJjZXMuc2VsZWN0RXhwb3J0VHlwZVBhZ2VfZGVzYyk7Ci0JCXNldEltYWdlRGVzY3JpcHRvcihFeHBvcnRYTUxQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcigKLQkJCQkiZnVsbC93aXpiYW4vRXhwb3J0WE1MLmdpZiIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nUGFnZSNjcmVhdGVDb250cm9sKENvbXBvc2l0ZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGNvbnRhaW5lciA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCWNvbnRhaW5lci5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0KLQkJZXhwb3J0TGlicmFyeVJhZGlvQnV0dG9uID0gY3JlYXRlUmFkaW9CdXR0b24oY29udGFpbmVyLAotCQkJCUV4cG9ydFhNTFJlc291cmNlcy5leHBvcnRMaWJyYXJ5UmFkaW9CdXR0b25fdGV4dCwgMSwgZmFsc2UpOwotCi0JCWV4cG9ydFBsdWdpbnNSYWRpb0J1dHRvbiA9IGNyZWF0ZVJhZGlvQnV0dG9uKGNvbnRhaW5lciwKLQkJCQlFeHBvcnRYTUxSZXNvdXJjZXMuZXhwb3J0UGx1Z2luc1JhZGlvQnV0dG9uX3RleHQsIDEsIGZhbHNlKTsKLQotCQkvLyBQb3N0cG9uZWQgdG8gbmV4dCByZWxlYXNlLgotCQkvL2V4cG9ydENvbmZpZ3NSYWRpb0J1dHRvbiA9IGNyZWF0ZVJhZGlvQnV0dG9uKGNvbnRhaW5lciwKLQkJLy8JCUV4cG9ydFhNTFJlc291cmNlcy5leHBvcnRDb25maWdzUmFkaW9CdXR0b25fdGV4dCwgMSwgZmFsc2UpOwotCQkKLQkJc3dpdGNoIChFeHBvcnRYTUxQcmVmZXJlbmNlcy5nZXRFeHBvcnRUeXBlKCkpIHsKLQkJY2FzZSBFeHBvcnRYTUxEYXRhLkVYUE9SVF9NRVRIT0RfTElCUkFSWToKLQkJCWV4cG9ydExpYnJhcnlSYWRpb0J1dHRvbi5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCQlicmVhazsKLQkJY2FzZSBFeHBvcnRYTUxEYXRhLkVYUE9SVF9NRVRIT0RfUExVR0lOUzoKLQkJCWV4cG9ydFBsdWdpbnNSYWRpb0J1dHRvbi5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCQlicmVhazsKLQkJLy8gUG9zdHBvbmVkIHRvIG5leHQgcmVsZWFzZS4JCQkKLQkJLy9jYXNlIEV4cG9ydFhNTERhdGEuRVhQT1JUX01FVEhPRF9DT05GSUdTOgotCQkvLwlleHBvcnRDb25maWdzUmFkaW9CdXR0b24uc2V0U2VsZWN0aW9uKHRydWUpOwotCQkvLwlicmVhazsKLQkJfQotCi0JCWFkZExpc3RlbmVycygpOwotCi0JCXNldENvbnRyb2woY29udGFpbmVyKTsKLQkJc2V0UGFnZUNvbXBsZXRlKHRydWUpOwotCX0KLQotCXByaXZhdGUgdm9pZCBhZGRMaXN0ZW5lcnMoKSB7Ci0JCWV4cG9ydExpYnJhcnlSYWRpb0J1dHRvbi5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCB0aGlzKTsKLQkJZXhwb3J0UGx1Z2luc1JhZGlvQnV0dG9uLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIHRoaXMpOwotCQkvLyBQb3N0cG9uZWQgdG8gbmV4dCByZWxlYXNlLgkJCi0JCS8vZXhwb3J0Q29uZmlnc1JhZGlvQnV0dG9uLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIHRoaXMpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXIjaGFuZGxlRXZlbnQoRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJc2V0UGFnZUNvbXBsZXRlKGlzUGFnZUNvbXBsZXRlKCkpOwotCQlnZXRXaXphcmQoKS5nZXRDb250YWluZXIoKS51cGRhdGVCdXR0b25zKCk7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2UjaXNQYWdlQ29tcGxldGUoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUGFnZUNvbXBsZXRlKCkgewotCQlpZiAoTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpID09IG51bGwpIHsKLQkJCXNldEVycm9yTWVzc2FnZShMaWJyYXJ5VUlSZXNvdXJjZXMubm9PcGVuTGlicmFyeVdhcm5pbmdfbXNnKTsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCXJldHVybiBnZXRFcnJvck1lc3NhZ2UoKSA9PSBudWxsOwotCX0JCi0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlI2lzQ29tcGxldGVkKCkKLQkgKi8KLQlwdWJsaWMgSVdpemFyZFBhZ2UgZ2V0TmV4dFBhZ2UoKSB7Ci0JCUV4cG9ydFhNTFdpemFyZCB3aXphcmQgPSAoRXhwb3J0WE1MV2l6YXJkKSBnZXRXaXphcmQoKTsKLQotCQlpZiAoZXhwb3J0TGlicmFyeVJhZGlvQnV0dG9uLmdldFNlbGVjdGlvbigpKSB7Ci0JCQl3aXphcmQueG1sRGF0YS5zZXRFeHBvcnRUeXBlKEV4cG9ydFhNTERhdGEuRVhQT1JUX01FVEhPRF9MSUJSQVJZKTsKLQkJCXJldHVybiB3aXphcmQuc2VsZWN0WE1MRmlsZVBhZ2U7Ci0JCX0gZWxzZSBpZiAoZXhwb3J0UGx1Z2luc1JhZGlvQnV0dG9uLmdldFNlbGVjdGlvbigpKSB7Ci0JCQl3aXphcmQueG1sRGF0YS5zZXRFeHBvcnRUeXBlKEV4cG9ydFhNTERhdGEuRVhQT1JUX01FVEhPRF9QTFVHSU5TKTsKLQkJCXJldHVybiB3aXphcmQuc2VsZWN0UGx1Z2luUGFnZTsKLQkJfQotCQkvLyBQb3N0cG9uZWQgdG8gbmV4dCByZWxlYXNlLgotCQkvL2Vsc2UgaWYgKGV4cG9ydENvbmZpZ3NSYWRpb0J1dHRvbi5nZXRTZWxlY3Rpb24oKSkgewotCQkvLwl3aXphcmQueG1sRGF0YS5zZXRFeHBvcnRUeXBlKEV4cG9ydFhNTERhdGEuRVhQT1JUX01FVEhPRF9DT05GSUdTKTsKLQkJLy8JcmV0dXJuIHdpemFyZC5zZWxlY3RDb25maWdQYWdlOwotCQkvL30KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC94bWwvd2l6YXJkcy9TZWxlY3RQbHVnaW5QYWdlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC94bWwvd2l6YXJkcy9TZWxlY3RQbHVnaW5QYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExYjZmMzQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQveG1sL3dpemFyZHMvU2VsZWN0UGx1Z2luUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwud2l6YXJkczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQuc2VydmljZXMuUGx1Z2luRXhwb3J0RGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZFBhZ2U7Ci0KLS8qKgotICogQSB3aXphcmQgcGFnZSB0aGF0IHByb21wdHMgdGhlIHVzZXIgdG8gc2VsZWN0IG9uZSBvciBtb3JlIG1ldGhvZCBwbHVnLWlucyB0bwotICogZXhwb3J0LgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFNlbGVjdFBsdWdpblBhZ2UgZXh0ZW5kcwotCQlvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LndpemFyZHMuU2VsZWN0UGx1Z2luUGFnZSB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBTZWxlY3RQbHVnaW5QYWdlKFBsdWdpbkV4cG9ydERhdGEgZGF0YSkgewotCQlzdXBlcihkYXRhKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlI2dldE5leHRQYWdlKCkKLQkgKi8KLQlwdWJsaWMgSVdpemFyZFBhZ2UgZ2V0TmV4dFBhZ2UoKSB7Ci0JCXN1cGVyLnNhdmVEYXRhVG9Nb2RlbCgpOwotCQlFeHBvcnRYTUxXaXphcmQgd2l6YXJkID0gKEV4cG9ydFhNTFdpemFyZCkgZ2V0V2l6YXJkKCk7Ci0JCXdpemFyZC54bWxEYXRhLnNldFNlbGVjdGVkUGx1Z2lucyh3aXphcmQucGx1Z2luRGF0YS5zZWxlY3RlZFBsdWdpbnMpOwotCQlWaWV3UGx1Z2luSW5mb1BhZ2UgcGFnZSA9IHdpemFyZC52aWV3UGx1Z2luSW5mb1BhZ2U7Ci0JCXBhZ2Uub25FbnRlclBhZ2UobnVsbCk7Ci0JCXJldHVybiBwYWdlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQveG1sL3dpemFyZHMvU2VsZWN0WE1MRmlsZVBhZ2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3htbC93aXphcmRzL1NlbGVjdFhNTEZpbGVQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0MDcxZWMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQveG1sL3dpemFyZHMvU2VsZWN0WE1MRmlsZVBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC53aXphcmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sLkV4cG9ydFhNTFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC5FeHBvcnRYTUxSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwucHJlZmVyZW5jZXMuRXhwb3J0WE1MUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5GaWxlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci0KLS8qKgotICogQSB3aXphcmQgcGFnZSB0aGF0IHByb21wdHMgdGhlIHVzZXIgdG8gc3BlY2lmeSBhIFhNTCBmaWxlIHRvIHN0b3JlIHRoZQotICogZXhwb3J0ZWQgbWV0aG9kIGxpYnJhcnkgY29udGVudC4KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgU2VsZWN0WE1MRmlsZVBhZ2UgZXh0ZW5kcyBXaXphcmRQYWdlIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBR0VfTkFNRSA9IFNlbGVjdFhNTEZpbGVQYWdlLmNsYXNzLmdldE5hbWUoKTsKLQotCXByaXZhdGUgVGV4dCBwYXRoVGV4dDsKLQotCXByaXZhdGUgU3RyaW5nIHBhdGg7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBTZWxlY3RYTUxGaWxlUGFnZSgpIHsKLQkJc3VwZXIoUEFHRV9OQU1FKTsKLQkJc2V0VGl0bGUoRXhwb3J0WE1MUmVzb3VyY2VzLnNlbGVjdFhNTEZpbGVQYWdlX3RpdGxlKTsKLQkJc2V0RGVzY3JpcHRpb24oRXhwb3J0WE1MUmVzb3VyY2VzLnNlbGVjdFhNTEZpbGVQYWdlX2Rlc2MpOwotCQlzZXRJbWFnZURlc2NyaXB0b3IoRXhwb3J0WE1MUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoCi0JCQkJImZ1bGwvd2l6YmFuL0V4cG9ydFhNTC5naWYiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ1BhZ2UjY3JlYXRlQ29udHJvbChDb21wb3NpdGUpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDMsIGZhbHNlKSk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQotCQlMYWJlbCBmaWxlTGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWZpbGVMYWJlbC5zZXRUZXh0KEV4cG9ydFhNTFJlc291cmNlcy5maWxlTGFiZWxfdGV4dCk7Ci0KLQkJcGF0aFRleHQgPSBuZXcgVGV4dChjb21wb3NpdGUsIFNXVC5CT1JERVIpOwotCQlwYXRoVGV4dC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJcGF0aFRleHQuc2V0VGV4dChFeHBvcnRYTUxQcmVmZXJlbmNlcy5nZXRYTUxGaWxlKCkpOwotCQlwYXRoVGV4dC5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJCQlpZiAoaXNWYWxpZFBhdGgocGF0aFRleHQuZ2V0VGV4dCgpLnRyaW0oKSkpIHsKLQkJCQkJc2V0UGFnZUNvbXBsZXRlKHRydWUpOwotCQkJCQlzZXRFcnJvck1lc3NhZ2UobnVsbCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJc2V0UGFnZUNvbXBsZXRlKGZhbHNlKTsKLQkJCQkJc2V0RXJyb3JNZXNzYWdlKEV4cG9ydFhNTFJlc291cmNlcy5pbnZhbGlkWE1MRmlsZV9lcnJvcik7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQotCQlCdXR0b24gYnJvd3NlQnV0dG9uID0gbmV3IEJ1dHRvbihjb21wb3NpdGUsIFNXVC5QVVNIKTsKLQkJYnJvd3NlQnV0dG9uLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkVORCkpOwotCQlicm93c2VCdXR0b24uc2V0VGV4dChFeHBvcnRYTUxSZXNvdXJjZXMuYnJvd3NlQnV0dG9uX3RleHQpOwotCQlicm93c2VCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJRmlsZURpYWxvZyBmZCA9IG5ldyBGaWxlRGlhbG9nKERpc3BsYXkuZ2V0Q3VycmVudCgpCi0JCQkJCQkuZ2V0QWN0aXZlU2hlbGwoKSwgU1dULlNBVkUpOwotCQkJCWZkLnNldEZpbHRlckV4dGVuc2lvbnMobmV3IFN0cmluZ1tdIHsgIioueG1sIiwgIiouKiIgfSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCVN0cmluZyBwYXRoID0gZmQub3BlbigpOwotCQkJCWJvb2xlYW4gb2sgPSBmYWxzZTsKLQkJCQlpZiAocGF0aCAhPSBudWxsKSB7Ci0JCQkJCXBhdGhUZXh0LnNldFRleHQocGF0aCk7Ci0JCQkJCW9rID0gaXNWYWxpZFBhdGgocGF0aCk7Ci0JCQkJfQotCQkJCXNldFBhZ2VDb21wbGV0ZShvayk7Ci0JCQkJZ2V0V2l6YXJkKCkuZ2V0Q29udGFpbmVyKCkudXBkYXRlQnV0dG9ucygpOwotCQkJfQotCQl9KTsKLQotCQlzZXRDb250cm9sKGNvbXBvc2l0ZSk7Ci0KLQkJc2V0UGFnZUNvbXBsZXRlKGlzVmFsaWRQYXRoKHBhdGhUZXh0LmdldFRleHQoKS50cmltKCkpKTsKLQl9Ci0KLQkvKioKLQkgKiBDaGVja3Mgd2hldGhlciB0aGUgdXNlciBzcGVjaWZpYyBwYXRoIGlzIHZhbGlkLgotCSAqIAotCSAqIEBwYXJhbSBwYXRoCi0JICogICAgICAgICAgICB0aGUgdXNlciBzcGVjaWZpYyBwYXRoCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgdXNlciBzcGVjaWZpZWQgcGF0aCBpcyB2YWxpZC4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNWYWxpZFBhdGgoU3RyaW5nIHBhdGgpIHsKLQkJSVBhdGggZWNQYXRoID0gUGF0aC5mcm9tT1NTdHJpbmcocGF0aCk7Ci0JCWlmIChlY1BhdGguaXNWYWxpZFBhdGgocGF0aCkgJiYgcGF0aC5lbmRzV2l0aCgiLnhtbCIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXRoaXMucGF0aCA9IHBhdGg7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkUGFnZSNpc0NvbXBsZXRlZCgpCi0JICovCi0JcHVibGljIElXaXphcmRQYWdlIGdldE5leHRQYWdlKCkgewotCQlyZXR1cm4gbnVsbDsgLy8gbm8gbW9yZSBwYWdlCi0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgdXNlciBzcGVjaWZpZWQgWE1MIGZpbGUuCi0JICogCi0JICogQHJldHVybiBhbiBhYnNvbHV0ZSBwYXRoIHRvIHRoZSBYTUwgZmlsZQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UGF0aCgpIHsKLQkJcmV0dXJuIHRoaXMucGF0aDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3htbC93aXphcmRzL1ZpZXdFeHBvcnRTdW1tYXJ5UGFnZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQveG1sL3dpemFyZHMvVmlld0V4cG9ydFN1bW1hcnlQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0Yzg2MzMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQveG1sL3dpemFyZHMvVmlld0V4cG9ydFN1bW1hcnlQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC53aXphcmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5zZXJ2aWNlcy5QbHVnaW5FeHBvcnREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQud2l6YXJkcy5FeHBvcnRQbHVnaW5TdW1tYXJ5UGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZFBhZ2U7Ci0KLS8qKgotICogQSB3aXphcmQgcGFnZSB0aGF0IGRpc3BsYXlzIGEgc3VtbWFyeSBvZiB0aGUgc2VsZWN0ZWQgbWV0aG9kIHBsdWctaW5zIHRoYXQKLSAqIHdpbGwgYmUgZXhwb3J0ZWQuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgVmlld0V4cG9ydFN1bW1hcnlQYWdlIGV4dGVuZHMgRXhwb3J0UGx1Z2luU3VtbWFyeVBhZ2UgewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgVmlld0V4cG9ydFN1bW1hcnlQYWdlKFBsdWdpbkV4cG9ydERhdGEgZGF0YSkgewotCQlzdXBlcihkYXRhKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlI2dldE5leHRQYWdlKCkKLQkgKi8KLQlwdWJsaWMgSVdpemFyZFBhZ2UgZ2V0TmV4dFBhZ2UoKSB7Ci0JCUV4cG9ydFhNTFdpemFyZCB3aXphcmQgPSAoRXhwb3J0WE1MV2l6YXJkKSBnZXRXaXphcmQoKTsKLQkJcmV0dXJuIHdpemFyZC5zZWxlY3RYTUxGaWxlUGFnZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3htbC93aXphcmRzL1ZpZXdQbHVnaW5JbmZvUGFnZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQveG1sL3dpemFyZHMvVmlld1BsdWdpbkluZm9QYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkNzlkYzQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQveG1sL3dpemFyZHMvVmlld1BsdWdpbkluZm9QYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC53aXphcmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5zZXJ2aWNlcy5QbHVnaW5FeHBvcnREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQud2l6YXJkcy5QbHVnaW5JbmZvUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZFBhZ2U7Ci0KLS8qKgotICogQSB3aXphcmQgcGFnZSB0aGF0IHByb21wdHMgdGhlIHVzZXIgdG8gcmV2aWV3IHRoZSBkZXBlbmRlbmNpZXMgb2YgdGhlIG1ldGhvZAotICogcGx1Zy1pbnMgdGhhdCBoYXZlIGJlZW4gc2VsZWN0ZWQgZm9yIGV4cG9ydC4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBWaWV3UGx1Z2luSW5mb1BhZ2UgZXh0ZW5kcyBQbHVnaW5JbmZvUGFnZSB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBWaWV3UGx1Z2luSW5mb1BhZ2UoUGx1Z2luRXhwb3J0RGF0YSBkYXRhKSB7Ci0JCXN1cGVyKGRhdGEpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2UjZ2V0TmV4dFBhZ2UoKQotCSAqLwotCXB1YmxpYyBJV2l6YXJkUGFnZSBnZXROZXh0UGFnZSgpIHsKLQkJc3VwZXIuc2F2ZURhdGFUb01vZGVsKCk7Ci0JCUV4cG9ydFhNTFdpemFyZCB3aXphcmQgPSAoRXhwb3J0WE1MV2l6YXJkKSBnZXRXaXphcmQoKTsKLQkJd2l6YXJkLnhtbERhdGEuc2V0QXNzb2NpYXRlZENvbmZpZ3Mod2l6YXJkLnBsdWdpbkRhdGEuYXNzb2NpYXRlZENvbmZpZ01hcCk7Ci0JCVZpZXdFeHBvcnRTdW1tYXJ5UGFnZSBwYWdlID0gd2l6YXJkLnZpZXdFeHBvcnRTdW1tYXJ5UGFnZTsKLQkJcGFnZS5vbkVudGVyUGFnZShudWxsKTsKLQkJcmV0dXJuIHBhZ2U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC94bWwvd2l6YXJkcy9wYWNrYWdlLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC94bWwvd2l6YXJkcy9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0YzFjY2YuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQveG1sL3dpemFyZHMvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgd2l6YXJkcyBmb3IgZXhwb3J0aW5nIG1ldGhvZCBsaWJyYXJ5IGNvbnRlbnQgdG8gWE1MLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvLmNsYXNzcGF0aCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGM0ZjIwZi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Ly5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiPgotCQk8YXR0cmlidXRlcz4KLQkJPC9hdHRyaWJ1dGVzPgotCTwvY2xhc3NwYXRoZW50cnk+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIj4KLQkJPGF0dHJpYnV0ZXM+Ci0JCTwvYXR0cmlidXRlcz4KLQk8L2NsYXNzcGF0aGVudHJ5PgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiI+Ci0JCTxhdHRyaWJ1dGVzPgotCQk8L2F0dHJpYnV0ZXM+Ci0JPC9jbGFzc3BhdGhlbnRyeT4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC8ub3B0aW9ucyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvLm9wdGlvbnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmNzU5NDIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC8ub3B0aW9ucworKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotIyBUdXJuIG9uIGRlYnVnIHRyYWNlIGZvciB0aGUgZXhwb3J0IHBsdWctaW4KLW9yZy5lY2xpcHNlLmVwZi5leHBvcnQvZGVidWc9dHJ1ZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC8ucHJvamVjdCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1YWE0OTAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmVwZi5leHBvcnQ8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9NRVRBLUlORi9NQU5JRkVTVC5NRiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2Yzk4MmIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0OyBzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjUuMC5xdWFsaWZpZXIKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQuRXhwb3J0UGx1Z2luCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUVjbGlwc2UtTGF6eVN0YXJ0OiB0cnVlCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuZXBmLmV4cG9ydCwKLSBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnNlcnZpY2VzLAotIG9yZy5lY2xpcHNlLmVwZi5leHBvcnQud2l6YXJkcwotUmVxdWlyZS1CdW5kbGU6IG9yZy5hcGFjaGUuYW50LAotIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLAotIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZSwKLSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLAotIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LAotIG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLAotIG9yZy5lY2xpcHNlLmVwZi5jb21tb24udWkKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9idWlsZC5wcm9wZXJ0aWVzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2Yzc4MGNkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotc291cmNlLi4gPSBzcmMvCi1vdXRwdXQuLiA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IC4sXAotICAgICAgICAgICAgICAgLm9wdGlvbnMsXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIGljb25zLyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L2ljb25zL0F1dGhvcmluZy5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L2ljb25zL0F1dGhvcmluZy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzMWJhZjIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9pY29ucy9BdXRob3JpbmcuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9pY29ucy9Db250ZW50UGFja2FnZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L2ljb25zL0NvbnRlbnRQYWNrYWdlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDBhMzExZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L2ljb25zL0NvbnRlbnRQYWNrYWdlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvaWNvbnMvRm9sZGVyLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvaWNvbnMvRm9sZGVyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDY0MTlkOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L2ljb25zL0ZvbGRlci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L2ljb25zL1BhY2thZ2luZy5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L2ljb25zL1BhY2thZ2luZy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5NjM5NGYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9pY29ucy9QYWNrYWdpbmcuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9pY29ucy9Sb2xlcy5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L2ljb25zL1JvbGVzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTRhM2Y2Ny4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L2ljb25zL1JvbGVzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvaWNvbnMvVGFza3MuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9pY29ucy9UYXNrcy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzOGJkODMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9pY29ucy9UYXNrcy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L2ljb25zL2Vycm9yLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvaWNvbnMvZXJyb3IuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNWU3YTk0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvaWNvbnMvZXJyb3IuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9pY29ucy9ldG9vbDE2L2V4cF9saWJfY29uZi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L2ljb25zL2V0b29sMTYvZXhwX2xpYl9jb25mLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWQ3ZDRlMS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L2ljb25zL2V0b29sMTYvZXhwX2xpYl9jb25mLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvaWNvbnMvZXRvb2wxNi9leHBfbWV0aF9wbHVnaW4uZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9pY29ucy9ldG9vbDE2L2V4cF9tZXRoX3BsdWdpbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmNmY4YmQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9pY29ucy9ldG9vbDE2L2V4cF9tZXRoX3BsdWdpbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L2ljb25zL2Z1bGwvd2l6YmFuL2V4cF9saWJfY29uZl93aXpiYW4uZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9pY29ucy9mdWxsL3dpemJhbi9leHBfbGliX2NvbmZfd2l6YmFuLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjg0NGI1Yi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L2ljb25zL2Z1bGwvd2l6YmFuL2V4cF9saWJfY29uZl93aXpiYW4uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9pY29ucy9mdWxsL3dpemJhbi9leHBfbWV0aF9wbHVnaW5fd2l6YmFuLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvaWNvbnMvZnVsbC93aXpiYW4vZXhwX21ldGhfcGx1Z2luX3dpemJhbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkYzU2NzMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9pY29ucy9mdWxsL3dpemJhbi9leHBfbWV0aF9wbHVnaW5fd2l6YmFuLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvaWNvbnMvd2FybmluZy5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L2ljb25zL3dhcm5pbmcuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZWUyMGFhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvaWNvbnMvd2FybmluZy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L3BsdWdpbi5wcm9wZXJ0aWVzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmVmN2U1Yi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLQotIyBQbHVnLWluCi1wbHVnaW5OYW1lPUVQRiBFeHBvcnQKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotCi0jIFBlcnNwZWN0aXZlCi1wYWNrYWdpbmdQZXJzcGVjdGl2ZU5hbWU9UGFja2FnaW5nCi0KLSMgQ2F0ZWdvcnkKLXBhY2thZ2luZ0NhdGVnb3J5TmFtZT1QYWNrYWdpbmcKLQotIyBWaWV3cwotcGFja2FnaW5nVmlld05hbWU9UGFja2FnaW5nIE1ldGhvZCBMaWJyYXJ5Ci1wYWNrYWdpbmdNZXNzYWdlVmlld05hbWU9TGlicmFyeSBQYWNrYWdpbmcgTWVzc2FnZQotCi0jIEFjdGlvbiBTZXQKLXBhY2thZ2luZ0FjdGlvblNldD1QYWNrYWdpbmcKLQotIyBBY3Rpb25zCi1uZXdDb25maWdBY3Rpb249JkNvbmZpZ3VyYXRpb24KLW5ld0NvbmZpZ0FjdGlvblRvb2x0aXA9Q3JlYXRlIGEgbmV3IGxpYnJhcnkgQ29uZmlndXJhdGlvbgotb3BlbkNvbmZpZ0FjdGlvbj0mQ29uZmlndXJhdGlvbgotb3BlbkNvbmZpZ0FjdGlvblRvb2x0aXA9T3BlbiBhbiBleGlzdGluZyBsaWJyYXJ5IGNvbmZpZ3VyYXRpb24KLQotIyBFeHBvcnQgV2l6YXJkIENhdGVnb3J5Ci1leHBvcnRDYXRlZ29yeU5hbWU9TWV0aG9kCi0KLSMgRXhwb3J0IExpYnJhcnkgQ29uZmlndXJhdGlvbiBXaXphcmQKLWV4cG9ydExpYnJhcnlDb25maWd1cmF0aW9uV2l6YXJkTmFtZT1MaWJyYXJ5IENvbmZpZ3VyYXRpb24KLWV4cG9ydExpYnJhcnlDb25maWd1cmF0aW9uPUV4cG9ydCBhIGxpYnJhcnkgY29uZmlndXJhdGlvbi4KLQotIyBFeHBvcnQgTWV0aG9kIFBsdWctaW5zIFdpemFyZAotZXhwb3J0TWV0aG9kUGx1Z2luc1dpemFyZE5hbWU9TWV0aG9kIFBsdWctaW5zCi1leHBvcnRNZXRob2RQbHVnaW5zPUV4cG9ydCBvbmUgb3IgbW9yZSBtZXRob2QgcGx1Zy1pbnMuCi0KLQotCi0gICAgICAgICAgICAgICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L3BsdWdpbi54bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3M2Y0OGQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTxwbHVnaW4+Ci0KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5leHBvcnRXaXphcmRzIj4KLSAgICAgIDx3aXphcmQKLSAgICAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5lcGYudWkuZXhwb3J0V2l6YXJkcy5jYXRlZ29yeSIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LndpemFyZHMuRXhwb3J0Q29uZmlndXJhdGlvbldpemFyZCIKLSAgICAgICAgICAgIGljb249Ii9pY29ucy9ldG9vbDE2L2V4cF9saWJfY29uZi5naWYiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmV4cG9ydC53aXphcmRzLkV4cG9ydENvbmZpZ3VyYXRpb25XaXphcmQiCi0gICAgICAgICAgICBuYW1lPSIlZXhwb3J0TGlicmFyeUNvbmZpZ3VyYXRpb25XaXphcmROYW1lIj4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICVleHBvcnRMaWJyYXJ5Q29uZmlndXJhdGlvbgotICAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvd2l6YXJkPgotICAgICAgPHdpemFyZAotICAgICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLmVwZi51aS5leHBvcnRXaXphcmRzLmNhdGVnb3J5IgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5leHBvcnQud2l6YXJkcy5FeHBvcnRQbHVnaW5XaXphcmQiCi0gICAgICAgICAgICBpY29uPSIvaWNvbnMvZXRvb2wxNi9leHBfbWV0aF9wbHVnaW4uZ2lmIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5leHBvcnQud2l6YXJkcy5FeHBvcnRQbHVnaW5XaXphcmQiCi0gICAgICAgICAgICBuYW1lPSIlZXhwb3J0TWV0aG9kUGx1Z2luc1dpemFyZE5hbWUiPgotICAgICAgICAgPGRlc2NyaXB0aW9uPiAKLSAgICAgICAgICAgICAgICVleHBvcnRNZXRob2RQbHVnaW5zCi0gICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgPC93aXphcmQ+IAotICAgPC9leHRlbnNpb24+Ci0KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5lcGYudWkuZXhwb3J0V2l6YXJkcyI+Ci0gICAgICA8d2l6YXJkIGlkPSJvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LndpemFyZHMuRXhwb3J0Q29uZmlndXJhdGlvbldpemFyZCIvPgotICAgICAgPHdpemFyZCBpZD0ib3JnLmVjbGlwc2UuZXBmLmV4cG9ydC53aXphcmRzLkV4cG9ydFBsdWdpbldpemFyZCIvPgotICAgPC9leHRlbnNpb24+Ci0KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9FeHBvcnRPcHRpb25zLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L0V4cG9ydE9wdGlvbnMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzIxM2I0OC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L0V4cG9ydE9wdGlvbnMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5leHBvcnQ7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLS8qKgotICogVGhlIGV4cG9ydCBvcHRpb25zLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjIKLSAqLwotcHVibGljIGNsYXNzIEV4cG9ydE9wdGlvbnMgewotCi0JcHJvdGVjdGVkIEZpbGUgZXhwb3J0RGlyOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgRXhwb3J0T3B0aW9ucygpIHsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSB1c2VyIHNlbGVjdGVkIGV4cG9ydCBkaXJlY3RvcnkuCi0JICogCi0JICogQHJldHVybiBhIGRpcmVjdG9yeSBmb3Igc3RvcmluZyB0aGUgZXhwb3J0ZWQgY29udGVudAotCSAqLwotCXB1YmxpYyBGaWxlIGdldEV4cG9ydERpcigpIHsKLQkJcmV0dXJuIGV4cG9ydERpcjsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB1c2VyIHNlbGVjdGVkIGV4cG9ydCBkaXJlY3RvcnkuCi0JICogCi0JICogQHBhcmFtIGV4cG9ydERpcgotCSAqICAgICAgICAgICAgYSBkaXJlY3RvcnkgZm9yIHN0b3JpbmcgdGhlIGV4cG9ydGVkIGNvbnRlbnQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFeHBvcnREaXIoRmlsZSBleHBvcnREaXIpIHsKLQkJdGhpcy5leHBvcnREaXIgPSBleHBvcnREaXI7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L0V4cG9ydFBsdWdpbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9FeHBvcnRQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjEyZjVjOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L0V4cG9ydFBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmV4cG9ydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udWkuQWJzdHJhY3RQbHVnaW47Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0KLQotLyoqCi0gKiBUaGUgRXhwb3J0IHBsdWdpbiBjbGFzcy4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBFeHBvcnRQbHVnaW4gZXh0ZW5kcyBBYnN0cmFjdFBsdWdpbiB7Ci0KLQkvLyBUaGUgc2hhcmVkIHBsdWctaW4gaW5zdGFuY2UuCi0JcHJpdmF0ZSBzdGF0aWMgRXhwb3J0UGx1Z2luIHBsdWdpbjsKLQotCS8qKgotCSAqIERlZmF1bHQgY29uc3RydWN0b3IuCi0JICovCi0JcHVibGljIEV4cG9ydFBsdWdpbigpIHsKLQkJc3VwZXIoKTsKLQkJcGx1Z2luID0gdGhpczsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuY29yZS5wbHVnaW4uQWJzdHJhY3RQbHVnaW4jc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0YXJ0KGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5jb3JlLnBsdWdpbi5BYnN0cmFjdFBsdWdpbiNzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpCi0JICovCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdG9wKGNvbnRleHQpOwotCQlwbHVnaW4gPSBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNoYXJlZCBwbHVnLWluIGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgRXhwb3J0UGx1Z2luIGdldERlZmF1bHQoKSB7Ci0JCXJldHVybiBwbHVnaW47Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L0V4cG9ydFByb2Nlc3NPcHRpb25zLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L0V4cG9ydFByb2Nlc3NPcHRpb25zLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjODU5OTYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9FeHBvcnRQcm9jZXNzT3B0aW9ucy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5leHBvcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5zZXJ2aWNlcy5QdWJsaXNoT3B0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci0KLS8qKgotICogVGhlIGV4cG9ydCBwcmNvZXNzIG9wdGlvbnMuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMgotICovCi1wdWJsaWMgY2xhc3MgRXhwb3J0UHJvY2Vzc09wdGlvbnMgZXh0ZW5kcyBFeHBvcnRPcHRpb25zIHsKLQotCXByb3RlY3RlZCBNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZzsKLQotCXByaXZhdGUgYm9vbGVhbiBwdWJsaXNoV2ViU2l0ZTsKLQotCXByaXZhdGUgUHVibGlzaE9wdGlvbnMgcHVibGlzaGluZ09wdGlvbnM7Ci0KLQlwcml2YXRlIGJvb2xlYW4gZXhwb3J0T25seVBsYW5uZWRXQlNFbGVtZW50czsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIEV4cG9ydFByb2Nlc3NPcHRpb25zKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIG1ldGhvZCBjb25maWd1cmF0aW9uIHRoYXQgd2lsbCBiZSB1c2VkIGV4cG9ydCB0aGUgcHJvY2Vzcy4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24KLQkgKi8KLQlwdWJsaWMgTWV0aG9kQ29uZmlndXJhdGlvbiBnZXRNZXRob2RDb25maWd1cmF0aW9uKCkgewotCQlyZXR1cm4gY29uZmlnOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIG1ldGhvZCBjb25maWd1cmF0aW9uIHRoYXQgd2lsbCBiZSB1c2VkIGV4cG9ydCB0aGUgcHJvY2Vzcy4KLQkgKiAKLQkgKiBAcGFyYW0gY29uZmlnCi0JICogICAgICAgICAgICBhIG1ldGhvZCBjb25maWd1cmF0aW9uCi0JICovCi0JcHVibGljIHZvaWQgc2V0TWV0aG9kQ29uZmlndXJhdGlvbihNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZykgewotCQl0aGlzLmNvbmZpZyA9IGNvbmZpZzsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBwdWJsaXNoIHByb2Nlc3Mgd2ViIHNpdGUgb3B0aW9uLgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHByb2Nlc3Mgd2ViIHNpdGUgc2hvdWxkIGJlIHB1Ymxpc2hlZAotCSAqICAgICAgICAgYXMgcGFydCBvZiB0aGUgZXhwb3J0IG9wZXJhdGlvbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGdldFB1Ymxpc2hXZWJTaXRlKCkgewotCQlyZXR1cm4gcHVibGlzaFdlYlNpdGU7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgcHVibGlzaCBwcm9jZXNzIHdlYiBzaXRlIG9wdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gcHVibGlzaFdlYlNpdGUKLQkgKiAgICAgICAgICAgIGlmIDxjb2RlPnRydWU8L2NvZGU+LCBwdWJsaXNoIHRoZSBwcm9jZXNzIHdlYiBzaXRlCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHVibGlzaFdlYlNpdGUoYm9vbGVhbiBwdWJsaXNoV2ViU2l0ZSkgewotCQl0aGlzLnB1Ymxpc2hXZWJTaXRlID0gcHVibGlzaFdlYlNpdGU7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgcHVibGlzaGluZyBvcHRpb25zLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHB1Ymxpc2hpbmcgb3B0aW9ucyB0aGF0IHdpbGwgYmUgdXNlZCB0byBwdWJsaXNoIHRoZSBwcm9jZXNzCi0JICogICAgICAgICB3ZWIgc2l0ZQotCSAqLwotCXB1YmxpYyBQdWJsaXNoT3B0aW9ucyBnZXRQdWJsaXNoaW5nT3B0aW9ucygpIHsKLQkJcmV0dXJuIHB1Ymxpc2hpbmdPcHRpb25zOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHB1Ymxpc2hpbmcgb3B0aW9ucy4KLQkgKiAKLQkgKiBAcGFyYW0gcHVibGlzaGluZ09wdGlvbnMKLQkgKiAgICAgICAgICAgIHRoZSBwdWJsaXNoaW5nIG9wdGlvbnMgdGhhdCB3aWxsIGJlIHVzZWQgdG8gcHVibGlzaCB0aGUKLQkgKiAgICAgICAgICAgIHByb2Nlc3Mgd2ViIHNpdGUKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQdWJsaXNoaW5nT3B0aW9ucyhQdWJsaXNoT3B0aW9ucyBwdWJsaXNoaW5nT3B0aW9ucykgewotCQl0aGlzLnB1Ymxpc2hpbmdPcHRpb25zID0gcHVibGlzaGluZ09wdGlvbnM7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgZXhwb3J0IG9ubHkgcGxhbm5lZCBXQlMgZWxlbWVudHMgb3B0aW9uLgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgb25seSBwbGFubmVkIFdCUyBlbGVtZW50cyBzaG91bGQgYmUKLQkgKiAgICAgICAgIGV4cG9ydGVkLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGdldEV4cG9ydE9ubHlQbGFubmVkV0JTRWxlbWVudHMoKSB7Ci0JCXJldHVybiBleHBvcnRPbmx5UGxhbm5lZFdCU0VsZW1lbnRzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGV4cG9ydCBvbmx5IHBsYW5uZWQgV0JTIGVsZW1lbnRzIG9wdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gZXhwb3J0T25seVBsYW5uZWRXQlNFbGVtZW50cwotCSAqICAgICAgICAgICAgaWYgPGNvZGU+dHJ1ZTwvY29kZT4sIGV4cG9ydCBvbmx5IHBsYW5uZWQgV0JTIGVsZW1lbnRzCi0JICovCi0JcHVibGljIHZvaWQgc2V0RXhwb3J0T25seVBsYW5uZWRXQlNFbGVtZW50cygKLQkJCWJvb2xlYW4gZXhwb3J0T25seVBsYW5uZWRXQlNFbGVtZW50cykgewotCQl0aGlzLmV4cG9ydE9ubHlQbGFubmVkV0JTRWxlbWVudHMgPSBleHBvcnRPbmx5UGxhbm5lZFdCU0VsZW1lbnRzOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9FeHBvcnRSZXNvdXJjZXMuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvRXhwb3J0UmVzb3VyY2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiNGQ1NjIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9FeHBvcnRSZXNvdXJjZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotcHVibGljIGZpbmFsIGNsYXNzIEV4cG9ydFJlc291cmNlcyBleHRlbmRzIE5MUyB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAib3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5SZXNvdXJjZXMiOy8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgRXhwb3J0UmVzb3VyY2VzKCkgewotCQkvLyBEbyBub3QgaW5zdGFudGlhdGUKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBleHBvcnRDb25maWdXaXphcmRfdGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VsZWN0RXhwb3J0VHlwZVBhZ2VfdGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VsZWN0RXhwb3J0VHlwZVBhZ2VfZGVzYzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzZWxlY3RFeHBvcnRUeXBlUGFnZV9jb25maWdMYWJlbF90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlbGVjdEV4cG9ydFR5cGVQYWdlX2NvbmZpZ1NwZWNzTGFiZWxfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzZWxlY3RDb25maWdQYWdlX3RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlbGVjdENvbmZpZ1BhZ2VfZGVzYzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzZWxlY3RDb25maWdQYWdlX2NvbmZpZ3NMYWJlbF90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlbGVjdENvbmZpZ1NwZWNzUGFnZV90aXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzZWxlY3RDb25maWdTcGVjc1BhZ2VfZGVzYzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzZWxlY3RDb25maWdTcGVjc1BhZ2VfY29uZmlnc0xhYmVsX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2hlY2tDb25maWdQYWdlX3RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNoZWNrQ29uZmlnUGFnZV9kZXNjOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlbGVjdERlc3RpbmF0aW9uUGFnZV90aXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzZWxlY3REZXN0aW5hdGlvblBhZ2VfZGVzYzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBleHBvcnRQbHVnaW5zV2l6YXJkX3RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlbGVjdFBsdWdpbnNQYWdlX3RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlbGVjdFBsdWdpbnNQYWdlX2Rlc2M7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VsZWN0UGx1Z2luc1BhZ2VfcGx1Z2luc0xhYmVsX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmV2aWV3UGx1Z2luc1BhZ2VfdGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmV2aWV3UGx1Z2luc1BhZ2VfZGVzYzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZXZpZXdQbHVnaW5zUGFnZV9wbHVnaW5zTGFiZWxfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZXZpZXdQbHVnaW5zUGFnZV9kZXBlbmRlbnRQbHVnaW5zTGFiZWxfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZXZpZXdQbHVnaW5zUGFnZV9hc3NvY2lhdGVkQ29uZmlnc0xhYmVsX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXhwb3J0UGx1Z2luU3VtbWFyeVBhZ2VfdGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXhwb3J0UGx1Z2luU3VtbWFyeVBhZ2VfZGVzYzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBleHBvcnRQbHVnaW5TdW1tYXJ5UGFnZV9ub1BsdWdpbl90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNwZWNpZnlQYXRoUGFnZV90aXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzcGVjaWZ5UGF0aFBhZ2VfZGVzYzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTYXZlUGx1Z2luUGFnZV9kZXNjOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEV4cG9ydFBsdWdpbldpemFyZF90aXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFeHBvcnRQbHVnaW5FcnJvcl9tc2c7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXhwb3J0Q29uZmlnRXJyb3JEaWFsb2dfdGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXhwb3J0Q29uZmlnRXJyb3JEaWFsb2dfbXNnOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGFuYWx5emluZ0NvbmZpZ1Rhc2tfbmFtZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb25maWd1cmF0aW9uU3BlY3NFeHBvcnRTZXJ2aWNlX01TRzA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29uZmlndXJhdGlvblNwZWNzRXhwb3J0U2VydmljZV9NU0cxOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEV4cG9ydENvbmZpZ0NoZWNraW5nUGFnZV9zdW1tYXJ5XzE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRXhwb3J0Q29uZmlnQ2hlY2tpbmdQYWdlX3N1bW1hcnlfMjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFeHBvcnRDb25maWdDaGVja2luZ1BhZ2Vfc3VtbWFyeV8zOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEV4cG9ydENvbmZpZ0NoZWNraW5nUGFnZV9zdW1tYXJ5XzQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRXhwb3J0Q29uZmlnQ2hlY2tpbmdQYWdlX2NoZWNraW5nOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEV4cG9ydENvbmZpZ1NlbGVjdENvbmZpZ1BhZ2VfdGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGVzdGluYXRpb25Db21tb25QYWdlX2xhYmVsX2Jyb3dzZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEZXN0aW5hdGlvbkNvbW1vblBhZ2VfbGFiZWxfZGVmYXVsdF9kaXI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29uZmlndXJhdGlvbkV4cG9ydFNlcnZpY2VfTVNHMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb25maWd1cmF0aW9uRXhwb3J0U2VydmljZV9NU0cyOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbmZpZ3VyYXRpb25FeHBvcnRTZXJ2aWNlX01TRzQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29uZmlndXJhdGlvbkV4cG9ydFNlcnZpY2VfTVNHMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb25maWd1cmF0aW9uRXhwb3J0U2VydmljZV9NU0c5OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERlc3RpbmF0aW9uQ29tbW9uUGFnZV9sYWJlbF9uYW1lOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERlc3RpbmF0aW9uQ29tbW9uUGFnZV9sYWJlbF9kaXI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRXhwb3J0UGx1Z2luV2l6YXJkX2Vycm9yOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERlc3RpbmF0aW9uQ29tbW9uUGFnZV90aXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEZXN0aW5hdGlvbkNvbW1vblBhZ2VfZGVzYzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQbHVnaW5FeHBvcnRTZXJ2aWNlX01TRzA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGx1Z2luRXhwb3J0U2VydmljZV9NU0cxOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBsdWdpbkV4cG9ydFNlcnZpY2VfTVNHMjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQbHVnaW5FeHBvcnRTZXJ2aWNlX01TRzM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGx1Z2luRXhwb3J0U2VydmljZV9NU0c0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNhdmVMaWJyYXJ5UGFnZV90aXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTYXZlUGx1Z2luUGFnZV9sYWJlbF9uYW1lOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNhdmVMaWJyYXJ5UGFnZV9kZXNjOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEV4cG9ydFBsdWdpbldpemFyZF9NU0cxOwotCi0Jc3RhdGljIHsKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgRXhwb3J0UmVzb3VyY2VzLmNsYXNzKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9SZXNvdXJjZXMucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvUmVzb3VyY2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzYTQ5YjMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9SZXNvdXJjZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSCi0jCi0jIE1lc3NhZ2UgSUQgUmFuZ2U6IElVUEUwMDAwRSAtIElVUEUwMDk5RQotIwotCi0jIEV4cG9ydCBMaWJyYXJ5IENvbmZpZ3VyYXRpb24gV2l6YXJkCi1leHBvcnRDb25maWdXaXphcmRfdGl0bGU9RXhwb3J0IExpYnJhcnkgQ29uZmlndXJhdGlvbgotc2VsZWN0RXhwb3J0VHlwZVBhZ2VfdGl0bGU9U2VsZWN0IGV4cG9ydCB0eXBlCi1zZWxlY3RFeHBvcnRUeXBlUGFnZV9kZXNjPVNlbGVjdCB0aGUgdHlwZSBvZiBsaWJyYXJ5IGNvbmZpZ3VyYXRpb24gdG8gZXhwb3J0Lgotc2VsZWN0RXhwb3J0VHlwZVBhZ2VfY29uZmlnTGFiZWxfdGV4dD1FeHBvcnQgYSBtZXRob2QgY29uZmlndXJhdGlvbiBhbmQgYWxsIGl0cyBtZXRob2QgcGx1Zy1pbnMKLXNlbGVjdEV4cG9ydFR5cGVQYWdlX2NvbmZpZ1NwZWNzTGFiZWxfdGV4dD1FeHBvcnQgb25lIG9yIG1vcmUgbWV0aG9kIGNvbmZpZ3VyYXRpb24gc3BlY2lmaWNhdGlvbnMKLXNlbGVjdENvbmZpZ1BhZ2VfdGl0bGU9U2VsZWN0IG1ldGhvZCBjb25maWd1cmF0aW9uCi1zZWxlY3RDb25maWdQYWdlX2Rlc2M9U2VsZWN0IGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24gdG8gZXhwb3J0LiBBbGwgcmVmZXJlbmNlZCBtZXRob2QgcGx1Zy1pbnMgaW4gdGhlIHNlbGVjdGVkIGNvbmZpZ3VyYXRpb24gd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUgZXhwb3J0Lgotc2VsZWN0Q29uZmlnUGFnZV9jb25maWdzTGFiZWxfdGV4dD1NZXRob2QgY29uZmlndXJhdGlvbnM6Ci1zZWxlY3RDb25maWdTcGVjc1BhZ2VfdGl0bGU9U2VsZWN0IGNvbmZpZ3VyYXRpb24gc3BlY2lmaWNhdGlvbnMKLXNlbGVjdENvbmZpZ1NwZWNzUGFnZV9kZXNjPVNlbGVjdCBvbmUgb3IgbW9yZSBtZXRob2QgY29uZmlndXJhdGlvbiBzcGVjaWZpY2F0aW9ucyB0byBleHBvcnQuCi1zZWxlY3RDb25maWdTcGVjc1BhZ2VfY29uZmlnc0xhYmVsX3RleHQ9TWV0aG9kIGNvbmZpZ3VyYXRpb25zOgotY2hlY2tDb25maWdQYWdlX3RpdGxlPVJldmlldyBjb25maWd1cmF0aW9uIGVycm9ycwotY2hlY2tDb25maWdQYWdlX2Rlc2M9QW4gaW50ZWdyaXR5IGNoZWNrIGhhcyBiZWVuIHBlcmZvcm1lZCBvbiB0aGUgc2VsZWN0ZWQgbWV0aG9kIGNvbmZpZ3VyYXRpb24uIFJldmlldyB0aGUgZXJyb3IgcmVwb3J0IGFuZCBwZXJmb3JtIHRoZSBuZWNlc3NhcnkgY29ycmVjdGl2ZSBhY3Rpb25zLgotc2VsZWN0RGVzdGluYXRpb25QYWdlX3RpdGxlPVNwZWNpZnkgZXhwb3J0IGRpcmVjdG9yeQotc2VsZWN0RGVzdGluYXRpb25QYWdlX2Rlc2M9U3BlY2lmeSBhIGRlc3RpbmF0aW9uIGRpcmVjdG9yeSB0byBzdG9yZSB0aGUgZXhwb3J0ZWQgY29uZmlndXJhdGlvbi4KLQotIyBFeHBvcnQgTWV0aG9kIFBsdWctaW5zIFdpemFyZAotZXhwb3J0UGx1Z2luc1dpemFyZF90aXRsZT1FeHBvcnQgTWV0aG9kIFBsdWctaW5zCi1zZWxlY3RQbHVnaW5zUGFnZV90aXRsZT1TZWxlY3QgbWV0aG9kIHBsdWctaW5zCi1zZWxlY3RQbHVnaW5zUGFnZV9kZXNjPVNlbGVjdCBvbmUgb3IgbW9yZSBtZXRob2QgcGx1Zy1pbnMgdG8gZXhwb3J0Lgotc2VsZWN0UGx1Z2luc1BhZ2VfcGx1Z2luc0xhYmVsX3RleHQ9TWV0aG9kIHBsdWctaW5zOgotcmV2aWV3UGx1Z2luc1BhZ2VfdGl0bGU9UmV2aWV3IGRlcGVuZGVuY2llcwotcmV2aWV3UGx1Z2luc1BhZ2VfZGVzYz1TZWxlY3QgZWFjaCBtZXRob2QgcGx1Zy1pbiB0byByZXZpZXcgaXRzIGRlcGVuZGVuY2llcy4gQ2xpY2sgQmFjayB0byBzZWxlY3QgdGhlIGRlcGVuZGVudCBwbHVnLWlucyBpZiB0aGV5IG11c3QgYmUgaW5jbHVkZWQgaW4gdGhlIGV4cG9ydC4KLXJldmlld1BsdWdpbnNQYWdlX3BsdWdpbnNMYWJlbF90ZXh0PU1ldGhvZCBQbHVnLWluczoKLXJldmlld1BsdWdpbnNQYWdlX2RlcGVuZGVudFBsdWdpbnNMYWJlbF90ZXh0PURlcGVuZGVudCBtZXRob2QgcGx1Zy1pbnM6Ci1yZXZpZXdQbHVnaW5zUGFnZV9hc3NvY2lhdGVkQ29uZmlnc0xhYmVsX3RleHQ9QXNzb2NpYXRlZCBtZXRob2QgY29uZmlndXJhdGlvbnM6Ci1leHBvcnRQbHVnaW5TdW1tYXJ5UGFnZV90aXRsZT1Db25maXJtIGV4cG9ydAotZXhwb3J0UGx1Z2luU3VtbWFyeVBhZ2VfZGVzYz1Db25maXJtIHRoZSBtZXRob2QgcGx1Zy1pbnMgdGhhdCB3aWxsIGJlIGV4cG9ydGVkLgotZXhwb3J0UGx1Z2luU3VtbWFyeVBhZ2Vfbm9QbHVnaW5fdGV4dD1ObyBtZXRob2QgcGx1Zy1pbiBoYXMgYmVlbiBzZWxlY3RlZC4KLXNwZWNpZnlQYXRoUGFnZV90aXRsZT1TcGVjaWZ5IGV4cG9ydCBkaXJlY3RvcnkKLXNwZWNpZnlQYXRoUGFnZV9kZXNjPVNwZWNpZnkgYSBkZXN0aW5hdGlvbiBkaXJlY3RvcnkgdG8gc3RvcmUgdGhlIGV4cG9ydGVkIG1ldGhvZCBwbHVnLWlucy4KLVNhdmVQbHVnaW5QYWdlX2Rlc2M9RXhwb3J0IHRoZSBzZWxlY3RlZCBwbHVnLWlucyBhbmQgY29uZmlndXJhdGlvbnMgdG8gdGhlIHNwZWNpZmllZCBkZXN0aW5hdGlvbiBkaXJlY3RvcnkuCi1FeHBvcnRQbHVnaW5XaXphcmRfdGl0bGU9RXhwb3J0IE1ldGhvZCBQbHVnLWluIFdpemFyZCBFcnJvcgotRXhwb3J0UGx1Z2luRXJyb3JfbXNnPUlVUEUwMDAwRTogRXJyb3IgZW5jb3VudGVyZWQgaW4gZXhwb3J0aW5nCi0KLSMgRXhwb3J0IExpYnJhcnkgQ29uZmlndXJhdGlvbiBFcnJvciBEaWFsb2cKLWV4cG9ydENvbmZpZ0Vycm9yRGlhbG9nX3RpdGxlPUV4cG9ydCBMaWJyYXJ5IENvbmZpZ3VyYXRpb24KLWV4cG9ydENvbmZpZ0Vycm9yRGlhbG9nX21zZz1JVVBFMDAwMUU6IFRoZSBleHBvcnQgb3BlcmF0aW9uIGNhbm5vdCBwcm9jZWVkLgotCi0jIFByb2dyZXNzIE1lc3NhZ2VzCi1hbmFseXppbmdDb25maWdUYXNrX25hbWU9QW5hbHl6aW5nIGxpYnJhcnkgY29uZmlndXJhdGlvbi4uLgotCi0jIFRoZSBmb2xsb3dpbmcgbWVzc2FnZXMgaGF2ZSBub3QgYmVlbiByZXZpZXdlZC4KLUNvbmZpZ3VyYXRpb25TcGVjc0V4cG9ydFNlcnZpY2VfTVNHMD1FeHBvcnRpbmcgY29uZmlndXJhdGlvbi4uLgotQ29uZmlndXJhdGlvblNwZWNzRXhwb3J0U2VydmljZV9NU0cxPUV4cG9ydCBkb25lLgotRXhwb3J0Q29uZmlnQ2hlY2tpbmdQYWdlX3N1bW1hcnlfMT1DaGVja2luZyB0aGUgaW50ZWdyaXR5IG9mIHRoZSBzZWxlY3RlZCBjb25maWd1cmF0aW9uLi4uXG4KLUV4cG9ydENvbmZpZ0NoZWNraW5nUGFnZV9zdW1tYXJ5XzI9Tm8gY29uZmlndXJhdGlvbiBzZWxlY3RlZC5cbgotRXhwb3J0Q29uZmlnQ2hlY2tpbmdQYWdlX3N1bW1hcnlfMz1UaGVyZSBpcyBubyBwcm9ibGVtIGluIHRoZSBzZWxlY3RlZCBjb25maWd1cmF0aW9uLlxuCi1FeHBvcnRDb25maWdDaGVja2luZ1BhZ2Vfc3VtbWFyeV80PVRoZXJlIGFyZSB7MH0gcHJvYmxlbXMgKHsxfSBlcnJvcnMsIHsyfSB3YXJuaW5ncywgezN9IGluZm9zKSBpbiB0aGUgc2VsZWN0ZWQgY29uZmlndXJhdGlvbi4gXG5Zb3UgY2FuIG9wZW4gdGhlIGNvbmZpZ3VyYXRpb24gZWRpdG9yIGFuZCBmaXggdGhvc2UgcHJvYmxlbXMuIFxuT3IgeW91IGNhbiBjaG9vc2UgdG8gaWdub3JlIHRoZXNlIHByb2JsZW1zIGFuZCBjb250aW51ZS4KLUV4cG9ydENvbmZpZ0NoZWNraW5nUGFnZV9jaGVja2luZz1DaGVja2luZyBjb25maWd1cmF0aW9uLCBwbGVhc2Ugd2FpdC4uLgotRXhwb3J0Q29uZmlnU2VsZWN0Q29uZmlnUGFnZV90aXRsZT1DaG9vc2UgTWV0aG9kIENvbmZpZ3VyYXRpb24KLURlc3RpbmF0aW9uQ29tbW9uUGFnZV9sYWJlbF9icm93c2U9QnJvd3NlLi4uCi1EZXN0aW5hdGlvbkNvbW1vblBhZ2VfbGFiZWxfZGVmYXVsdF9kaXI9VXNlIGRlZmF1bHQgZGlyZWN0b3J5Ci1Db25maWd1cmF0aW9uRXhwb3J0U2VydmljZV9NU0cwPUV4cG9ydGluZyBjb25maWd1cmF0aW9uLi4uCi1Db25maWd1cmF0aW9uRXhwb3J0U2VydmljZV9NU0cyPUlVUEUwMDAyRTogRXhwb3J0IGZhaWxlZDogRXJyb3IgbG9hZGluZyBsaWJyYXJ5Ci1Db25maWd1cmF0aW9uRXhwb3J0U2VydmljZV9NU0c0PUlVUEUwMDAzRTogRXhwb3J0IGZhaWxlZDogRXJyb3IgY29weWluZyBsaWJyYXJ5Ci1Db25maWd1cmF0aW9uRXhwb3J0U2VydmljZV9NU0cxPUlVUEUwMDA0RTogRXhwb3J0IGZhaWxlZDogRXJyb3IgbWFraW5nIGxpYnJhcnkgY29uZmlndXJhdGlvbiBjbG9zdXJlCi1Db25maWd1cmF0aW9uRXhwb3J0U2VydmljZV9NU0c5PUlVUEUwMDA1RTogRXhwb3J0IGZhaWxlZDogRXJyb3Igc2F2aW5nIGxpYnJhcnkKLURlc3RpbmF0aW9uQ29tbW9uUGFnZV9sYWJlbF9uYW1lPU5hbWU6Ci1EZXN0aW5hdGlvbkNvbW1vblBhZ2VfbGFiZWxfZGlyPURpcmVjdG9yeToKLUV4cG9ydFBsdWdpbldpemFyZF9lcnJvcj1FcnJvcgotRGVzdGluYXRpb25Db21tb25QYWdlX3RpdGxlPURlZmF1bHQgVGl0bGUKLURlc3RpbmF0aW9uQ29tbW9uUGFnZV9kZXNjPURlZmF1bHQgZGVzY3JpcHRpb246Ci1QbHVnaW5FeHBvcnRTZXJ2aWNlX01TRzA9RXhwb3J0aW5nIHBsdWctaW5zLi4uCi1QbHVnaW5FeHBvcnRTZXJ2aWNlX01TRzE9Q3JlYXRpbmcgZXhwb3J0IGRpcmVjdG9yeS4uLgotUGx1Z2luRXhwb3J0U2VydmljZV9NU0cyPUNvcHlpbmcgZmlsZXMuLi4KLVBsdWdpbkV4cG9ydFNlcnZpY2VfTVNHMz1HZW5lcmF0aW5nIGxpYnJhcnkgYW5kIHJlc291cmNlIGZpbGUuLi4KLVBsdWdpbkV4cG9ydFNlcnZpY2VfTVNHND1FeHBvcnQgZG9uZS4KLVNhdmVMaWJyYXJ5UGFnZV90aXRsZT1FeHBvcnQgTWV0aG9kIFBsdWctaW4KLVNhdmVQbHVnaW5QYWdlX2xhYmVsX25hbWU9RXhwb3J0IG5hbWU6Ci1TYXZlTGlicmFyeVBhZ2VfZGVzYz1FeHBvcnQgdGhlIHNlbGVjdGVkIG1ldGhvZCBwbHVnLWlucyBhbmQgYXNzb2NpYXRlZCBjb25maWd1cmF0aW9ucwotRXhwb3J0UGx1Z2luV2l6YXJkX01TRzE9QW5hbHl6aW5nIGxpYnJhcnkgY29uZmlndXJhdGlvbi4uLgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9wYWNrYWdlLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjNiNmFhYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIHRoZSBhY3RpdmF0b3IgZm9yIG1hbmFnaW5nIHRoZSBFeHBvcnQgcGx1Zy1pbidzIGxpZmUgY3ljbGUuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9zZXJ2aWNlcy9CYXNlRXhwb3J0U2VydmljZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9zZXJ2aWNlcy9CYXNlRXhwb3J0U2VydmljZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MjY1MzUwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvc2VydmljZXMvQmFzZUV4cG9ydFNlcnZpY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnNlcnZpY2VzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEubmV0LlVSTERlY29kZXI7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5NZXRob2RFbGVtZW50VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotCi0vKioKLSAqIFRoZSBhYnN0cmFjdCBiYXNlIGNsYXNzIGZvciB0aGUgRXhwb3J0IFNlcnZpY2UuCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAYXV0aG9yIFdlaXBpbmcgTHUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEJhc2VFeHBvcnRTZXJ2aWNlIHsKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIGV4cG9ydEZpbGUgPSAiZXhwb3J0LnhtaSI7IC8vJE5PTi1OTFMtMSQKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIGxpYnJhcnlGaWxlID0gImxpYnJhcnkueG1pIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJvdGVjdGVkIExpc3Qgc2VsZWN0ZWRJZHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQlwcm90ZWN0ZWQgTGlzdCBzZWxlY3RlZFBsdWdpbk5hbWVzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNJZFNlbGVjdGVkKFN0cmluZyB1cmkpIHsKLQkJZm9yIChJdGVyYXRvciBpdCA9IHNlbGVjdGVkSWRzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCVN0cmluZyBpZCA9IChTdHJpbmcpIGl0Lm5leHQoKTsKLQkJCWlmICh1cmkuaW5kZXhPZihpZCkgPj0gMCkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1NlbGVjdGVkUGx1Z2luUmVzb3VyY2UoU3RyaW5nIHVyaSkgewotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gc2VsZWN0ZWRQbHVnaW5OYW1lcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlTdHJpbmcgcGx1Z2luX25hbWUgPSAoU3RyaW5nKSBpdC5uZXh0KCk7Ci0JCQlpZiAodXJpLnN0YXJ0c1dpdGgocGx1Z2luX25hbWUgKyAiLyIpKSAvLyROT04tTkxTLTEkCi0JCQl7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNSZXNvdXJjZVNlbGVjdGVkKFN0cmluZyB1cmkpIHsKLQkJaWYgKGlzSWRTZWxlY3RlZCh1cmkpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gaXNTZWxlY3RlZFBsdWdpblJlc291cmNlKHVyaSk7Ci0JfQotCi0JcHJvdGVjdGVkIExpYnJhcnlEb2N1bWVudCBwcm9jZXNzTGlicmFyeUZpbGUoRmlsZSBzb3VyY2UsIEZpbGUgdGFyZ2V0KSB7Ci0JCXRyeSB7Ci0JCQlMaWJyYXJ5RG9jdW1lbnQgZG9jdW1lbnQgPSBuZXcgTGlicmFyeURvY3VtZW50KHNvdXJjZSk7Ci0KLQkJCS8vIFJlbG9hZCB0aGUgZWxlbWVudCBtYXBwaW5nLgotCQkJTm9kZUxpc3Qgbm9kZXMgPSBkb2N1bWVudC5nZXRQbHVnaW5zKCk7Ci0JCQlpbnQgaSA9IDA7Ci0JCQl3aGlsZSAoaSA8IG5vZGVzLmdldExlbmd0aCgpKSB7Ci0JCQkJRWxlbWVudCBub2RlID0gKEVsZW1lbnQpIG5vZGVzLml0ZW0oaSk7Ci0JCQkJU3RyaW5nIHVyaSA9IG5vZGUuZ2V0QXR0cmlidXRlKExpYnJhcnlEb2N1bWVudC5BVFRSX2hyZWYpOwotCQkJCWlmICghaXNJZFNlbGVjdGVkKHVyaSkpIHsKLQkJCQkJZG9jdW1lbnQucmVtb3ZlUGx1Z2luKG5vZGUpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWkrKzsKLQkJCQl9Ci0JCQl9Ci0KLQkJCS8vIFJlbW92ZSB0aGUgdW5uZWVkZWQgY29uZmlndXJhdGlvbnMuCi0JCQlub2RlcyA9IGRvY3VtZW50LmdldENvbmZpZ3VyYXRpb25zKCk7Ci0JCQlpID0gMDsKLQkJCXdoaWxlIChpIDwgbm9kZXMuZ2V0TGVuZ3RoKCkpIHsKLQkJCQlFbGVtZW50IG5vZGUgPSAoRWxlbWVudCkgbm9kZXMuaXRlbShpKTsKLQkJCQkKLQkJCQkvLyAxNDIzNzkgLSB1cGRhdGUgcGx1Z2luIGltcG9ydGluZyBhbmQgZXhwb3J0aW5nIHRvIG1hdGNoIHdpdGggdGhlIG5ldyBmaWxlIGZvcm1hdAotCQkJCS8vIGNvbmZpZ3VyYXRpb24gaXMgc2F2ZWQgYXMgc2VwZXJhdGUgcmVzb3VyY2Ugc2luY2UgMS4wbTMKLQkJCQlTdHJpbmcgdXJpID0gbm9kZS5nZXRBdHRyaWJ1dGUoTGlicmFyeURvY3VtZW50LkFUVFJfaHJlZik7Ci0JCQkJaWYgKCFpc0lkU2VsZWN0ZWQodXJpKSkgewotCQkJCQlkb2N1bWVudC5yZW1vdmVDb25maWd1cmF0aW9uKG5vZGUpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWkrKzsKLQkJCQl9Ci0JCQl9Ci0KLQkJCS8vIFJlbG9hZCB0aGUgZWxlbWVudCBtYXBwaW5nLgotCQkJTGlzdCBwbHVnaW5zID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpCi0JCQkJCQkJCS5nZXRNZXRob2RQbHVnaW5zKCk7Ci0JCQlNYXAgcGx1Z2luTWFwID0gTWV0aG9kRWxlbWVudFV0aWwuYnVpbGRNYXAocGx1Z2lucyk7Ci0KLQkJCW5vZGVzID0gZG9jdW1lbnQuZ2V0UmVzb3VyY2VEZXNjcmlwdG9ycygpOwotCQkJaSA9IDA7Ci0JCQl3aGlsZSAoaSA8IG5vZGVzLmdldExlbmd0aCgpKSB7Ci0JCQkJRWxlbWVudCBub2RlID0gKEVsZW1lbnQpIG5vZGVzLml0ZW0oaSk7Ci0JCQkJU3RyaW5nIGlkID0gbm9kZS5nZXRBdHRyaWJ1dGUoTGlicmFyeURvY3VtZW50LkFUVFJfaWQpOwotCQkJCVN0cmluZyB1cmkgPSBnZXRQbHVnaW5SZXNNZ3JVcmkoaWQsIG5vZGUsIHBsdWdpbk1hcCk7Ci0JCQkJaWYgKCFpc0lkU2VsZWN0ZWQoaWQpCi0JCQkJCQkmJiAhaXNSZXNvdXJjZVNlbGVjdGVkKFVSTERlY29kZXIuZGVjb2RlKHVyaSwgIlVURi04IikpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJZG9jdW1lbnQucmVtb3ZlUmVzb3VyY2VEZXNjcmlwdG9yKG5vZGUpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWkrKzsKLQkJCQl9Ci0JCQl9Ci0KLQkJCW5vZGVzID0gZG9jdW1lbnQuZ2V0UmVzb3VyY2VTdWJNYW5hZ2VycygpOwotCQkJaSA9IDA7Ci0JCQl3aGlsZSAoaSA8IG5vZGVzLmdldExlbmd0aCgpKSB7Ci0JCQkJRWxlbWVudCBub2RlID0gKEVsZW1lbnQpIG5vZGVzLml0ZW0oaSk7Ci0JCQkJU3RyaW5nIHVyaSA9IG5vZGUuZ2V0QXR0cmlidXRlKExpYnJhcnlEb2N1bWVudC5BVFRSX2hyZWYpOwotCQkJCWlmICghaXNSZXNvdXJjZVNlbGVjdGVkKHVyaSkpIHsKLQkJCQkJZG9jdW1lbnQucmVtb3ZlUmVzb3VyY2VEZXNjcmlwdG9yKG5vZGUpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWkrKzsKLQkJCQl9Ci0JCQl9Ci0KLQkJCUxpc3QgcGx1Z2luTGlzdCA9ICBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCkKLQkJCS5nZXRNZXRob2RQbHVnaW5zKCk7Ci0JCQlkb2N1bWVudC5zdG9yZUV4dHJhSW5mbyhwbHVnaW5MaXN0KTsKLQkJCQotCQkJZG9jdW1lbnQuc2F2ZUFzKHRhcmdldC5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0JCQkKLQkJCXJldHVybiBkb2N1bWVudDsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQlleC5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCQkKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0UGx1Z2luUmVzTWdyVXJpKFN0cmluZyBpZCwgRWxlbWVudCBub2RlLCBNYXA8U3RyaW5nLCBNZXRob2RQbHVnaW4+IHBsdWdpbk1hcCkgewotCQlTdHJpbmcgdXJpID0gbm9kZS5nZXRBdHRyaWJ1dGUoTGlicmFyeURvY3VtZW50LkFUVFJfdXJpKTsKLQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IHBsdWdpbk1hcC5nZXQoaWQpOwotCQlpZiAocGx1Z2luICE9IG51bGwpIHsKLQkJCVN0cmluZyBuZXdVcmkgPSBwbHVnaW4uZ2V0TmFtZSgpICsgIi9wbHVnaW4ueG1pIjsgIC8vJE5PTi1OTFMtMSQKLQkJCWlmICghIG5ld1VyaS5lcXVhbHModXJpKSkgewotCQkJCW5vZGUuc2V0QXR0cmlidXRlKExpYnJhcnlEb2N1bWVudC5BVFRSX3VyaSwgbmV3VXJpKTsKLQkJCQlyZXR1cm4gbmV3VXJpOwotCQkJfQotCQl9Ci0JCXJldHVybiB1cmk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3NlcnZpY2VzL0NvbmZpZ3VyYXRpb25FeHBvcnREYXRhLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3NlcnZpY2VzL0NvbmZpZ3VyYXRpb25FeHBvcnREYXRhLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1YmY5ZDAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9zZXJ2aWNlcy9Db25maWd1cmF0aW9uRXhwb3J0RGF0YS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5zZXJ2aWNlczsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcmVmZXJlbmNlcy5MaWJyYXJ5TG9jYXRpb25EYXRhOwotCi0KLS8qKgotICogRW5jYXBzdWxhdGVzIHRoZSBpbnB1dCBkYXRhIHJlcXVpcmVkIHRvIGV4cG9ydCBhIGxpYnJhcnkgY29uZmlndXJhdGlvbi4KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIENvbmZpZ3VyYXRpb25FeHBvcnREYXRhIHsKLQotCXB1YmxpYyBib29sZWFuIGV4cG9ydE9uZUNvbmZpZzsKLQotCXB1YmxpYyBib29sZWFuIGV4cG9ydENvbmZpZ1NwZWNzOwotCi0JcHVibGljIExpc3Qgc2VsZWN0ZWRDb25maWdzOwotCi0JLyoqCi0JICogSW5kaWNhdGVzIGlmIHRoZSBicm9rZW4gcmVmZXJlbmNlcyBzaG91bGQgYmUgcmVtb3ZlZCBvciBub3QuCi0JICovCi0JcHVibGljIGJvb2xlYW4gcmVtb3ZlQnJva2VuUmVmZXJlbmNlcyA9IGZhbHNlOwotCi0JcHVibGljIExpYnJhcnlMb2NhdGlvbkRhdGEgbGxEYXRhID0gbnVsbDsKLQotCXB1YmxpYyBTdHJpbmcgZXJyb3JNc2cgPSAiIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5lcyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgQ29uZmlndXJhdGlvbkV4cG9ydERhdGEoKSB7Ci0JCWxsRGF0YSA9IG5ldyBMaWJyYXJ5TG9jYXRpb25EYXRhKCk7Ci0JCWxsRGF0YS5sb2FkRnJvbVByZWZlcmVuY2VTdG9yZSgpOwotCX0KLQotCS8qKgotCSAqIFZhbGlkYXRlIGF0dHJpYnV0ZQotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvc2VydmljZXMvQ29uZmlndXJhdGlvbkV4cG9ydFNlcnZpY2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvc2VydmljZXMvQ29uZmlndXJhdGlvbkV4cG9ydFNlcnZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTcxZjhmNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3NlcnZpY2VzL0NvbmZpZ3VyYXRpb25FeHBvcnRTZXJ2aWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5zZXJ2aWNlczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQuRXhwb3J0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQuRXhwb3J0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LklDb25maWd1cmF0aW9uQ2xvc3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5JTGlicmFyeU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuSUxpYnJhcnlSZXNvdXJjZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeU1hbmFnZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLmNsb3N1cmUuQ29uZmlndXJhdGlvbkNsb3N1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLk1ldGhvZEVsZW1lbnRVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5MYXlvdXRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5MaWJyYXJ5VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UucmVmcmVzaC5SZWZyZXNoSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci0KLS8qKgotICogRXhwb3J0cyBhIGxpYnJhcnkgY29uZmlndXJhdGlvbi4KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBhdXRob3IgV2VpcGluZyBMdQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQ29uZmlndXJhdGlvbkV4cG9ydFNlcnZpY2UgewotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXhjbHVkZXMgPSAiLmNvcHlhcmVhLmRhdCwgKiovLmNvcHlhcmVhLmRhdCwgLmNvcHlhcmVhLmRiLCAqKi8uY29weWFyZWEuZGIiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBDb25maWd1cmF0aW9uRXhwb3J0RGF0YSBkYXRhOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgQ29uZmlndXJhdGlvbkV4cG9ydFNlcnZpY2UoQ29uZmlndXJhdGlvbkV4cG9ydERhdGEgZGF0YSkgewotCQl0aGlzLmRhdGEgPSBkYXRhOwotCX0KLQkKLQkvKioKLQkgKiBSdW4gdG8gZXhwb3J0IGEgY29uZmlndXJhdGlvbiBjbG9zdXJlCi0JICovCi0JcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQl0cnkgewotCQkJaWYgKGRhdGEuc2VsZWN0ZWRDb25maWdzID09IG51bGwKLQkJCQkJfHwgZGF0YS5zZWxlY3RlZENvbmZpZ3Muc2l6ZSgpID09IDApIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQltb25pdG9yLnNldFRhc2tOYW1lKEV4cG9ydFJlc291cmNlcy5Db25maWd1cmF0aW9uRXhwb3J0U2VydmljZV9NU0cwKTsgCi0JCQlTdHJpbmcgZXhwb3J0TGliUGF0aCA9IGRhdGEubGxEYXRhLmdldFBhcmVudEZvbGRlcigpOwotCQkJRmlsZSBleHBvcnRMaWJGb2xkZXIgPSBuZXcgRmlsZShleHBvcnRMaWJQYXRoKTsKLQkJCWlmICghZXhwb3J0TGliRm9sZGVyLmV4aXN0cygpKSB7Ci0JCQkJZXhwb3J0TGliRm9sZGVyLm1rZGlyKCk7Ci0JCQl9Ci0JCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IChNZXRob2RDb25maWd1cmF0aW9uKSBkYXRhLnNlbGVjdGVkQ29uZmlncwotCQkJCQkuZ2V0KDApOwotCQkJZXhwb3J0Q29uZmlnKGNvbmZpZy5nZXROYW1lKCksIGV4cG9ydExpYkZvbGRlci5nZXRBYnNvbHV0ZVBhdGgoKSwKLQkJCQkJbW9uaXRvcik7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlFeHBvcnRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogRXhwb3J0IGEgY29uZmlndXJhdGlvbiBjbG9zdXJlCi0JICovCi0JcHVibGljIHZvaWQgZXhwb3J0Q29uZmlnKFN0cmluZyBzZWxlY3RlZENvbmZpZ05hbWUsIFN0cmluZyBmaWxlUGF0aCwKLQkJCUlQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJLy8gbmVlZCB0byBkaXNhYmxlIHRoZSB3b3Jrc3BhY2UgcmVmcmVzaGluZwotCQlib29sZWFuIHJlZnJlc2ggPSBSZWZyZXNoSm9iLmdldEluc3RhbmNlKCkuaXNFbmFibGVkKCk7Ci0JCXRyeSB7Ci0JCQlpZiAocmVmcmVzaCkgewotCQkJCS8vIGRpc2FibGUgcmVzb3VyY2UgcmVmcmVzaGluZyBkdXJpbmcgaW1wb3J0Ci0JCQkJLy8KLQkJCQlSZWZyZXNoSm9iLmdldEluc3RhbmNlKCkuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQl9Ci0JCQlkb0VleHBvcnRDb25maWcoc2VsZWN0ZWRDb25maWdOYW1lLCBmaWxlUGF0aCwgbW9uaXRvcik7Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAocmVmcmVzaCkgewotCQkJCS8vIHJlLWVuYWJsZSByZXNvdXJjZSByZWZyZXNoaW5nCi0JCQkJLy8KLQkJCQlSZWZyZXNoSm9iLmdldEluc3RhbmNlKCkuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBkb0VleHBvcnRDb25maWcoU3RyaW5nIHNlbGVjdGVkQ29uZmlnTmFtZSwgU3RyaW5nIGZpbGVQYXRoLAotCQkJSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQlNZXRob2RMaWJyYXJ5IGN1cnJlbnRMaWIgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCk7Ci0KLQkJdHJ5IHsKLQkJCS8vIExvYWQgdGhlIHdob2xlIE1ldGhvZCBMaWJyYXJ5LgotCQkJTGlicmFyeVV0aWwubG9hZEFsbChjdXJyZW50TGliKTsKLQkJfSBjYXRjaCAoVGhyb3dhYmxlIGUpIHsKLQkJCUV4cG9ydFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoCi0JCQkJCSJFcnJvciBsb2FkaW5nIGxpYnJhcnkiLCBlKTsgLy8kTk9OLU5MUy0xJAotCQkJZGF0YS5lcnJvck1zZyA9IEV4cG9ydFJlc291cmNlcy5Db25maWd1cmF0aW9uRXhwb3J0U2VydmljZV9NU0cyOyAKLQkJCXJldHVybjsKLQkJfQotCi0JCS8vIENvcHkgdGhlIGN1cnJlbnQgbGlicmFyeSB0byBhIG5ldyBsaWJyYXJ5LAotCQkvLyBzaW5jZSB3ZSBuZWVkIHRvIG1ha2UgY2hhbmdlcyB3aGVuIHBhY2thZ2luZyB0aGUgbmV3IGxpYnJhcnkuCi0JCU1ldGhvZExpYnJhcnkgbmV3TGlicmFyeSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQluZXdMaWJyYXJ5ID0gKE1ldGhvZExpYnJhcnkpIEVjb3JlVXRpbC5jb3B5KGN1cnJlbnRMaWIpOwotCQl9IGNhdGNoIChUaHJvd2FibGUgZSkgewotCQkJRXhwb3J0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCWRhdGEuZXJyb3JNc2cgPSBFeHBvcnRSZXNvdXJjZXMuQ29uZmlndXJhdGlvbkV4cG9ydFNlcnZpY2VfTVNHNDsgCi0JCQlyZXR1cm47Ci0JCX0KLQotCQlJQ29uZmlndXJhdGlvbkNsb3N1cmUgY2xvc3VyZSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQkvLyBEZXRhY2ggdGhlIG5ldyBsaWJyYXJ5IGZyb20gdGhlIGN1cnJlbnQgcmVzb3VyY2Ugc28gaXQgY2FuIGJlCi0JCQkvLyBhZGRlZCB0byBhIG5ldyBMaWJyYXJ5IFByb2Nlc3NvciBpbnN0YW5jZS4KLQkJCUxpYnJhcnlVdGlsLmRldGFjaEZyb21SZXNvdXJjZShuZXdMaWJyYXJ5KTsKLQotCQkJLy8gQ3JlYXRlIGEgbmV3IExpYnJhcnkgTWFuYWdlciBhbmQgY3JlYXRlIGEgbmV3IHJlc291cmNlIGZvciB0aGUKLQkJCS8vIG5ldyBsaWJyYXJ5LgotCQkJLy8gVE9ETzogVXBkYXRlIHRoZSBVSSB0byBwcm9tcHQgZm9yIHRoZSBtZXRob2QgbGlicmFyeSB0eXBlLgotCQkJTWFwIHBhcmFtcyA9IG5ldyBIYXNoTWFwKCk7Ci0JCQlwYXJhbXMucHV0KCJsaWJyYXJ5LnBhdGgiLCBmaWxlUGF0aCk7IAkvLyROT04tTkxTLTEkCi0JCQlwYXJhbXMucHV0KCJsaWJyYXJ5UmVnaXN0ZXJUeXBlIiwgIkNvbmZpZ0V4cG9ydCIpOyAJCS8vJE5PTi1OTFMtMSQJCS8vJE5PTi1OTFMtMiQJCQotCQkJCi0JCQlMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLnJlZ2lzdGVyTWV0aG9kTGlicmFyeShuZXdMaWJyYXJ5LCAieG1pIiwgcGFyYW1zKTsJCS8vJE5PTi1OTFMtMSQKLQkJCQotCQkJLy8gQmVnaW4gcGFja2FnaW5nIHRoZSBuZXcgbGlicmFyeSBmb3IgZXhwb3J0LgotCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSBMaWJyYXJ5U2VydmljZVV0aWwKLQkJCQkJLmdldE1ldGhvZENvbmZpZ3VyYXRpb24obmV3TGlicmFyeSwgc2VsZWN0ZWRDb25maWdOYW1lKTsKLQotCQkJLy8gVmFsaWRhdGUgdGhlIGNvbmZpZ3VyYXRpb24gYW5kIG1ha2Ugc3VyZSB0aGUgZ2xvYmFsIHBhY2thZ2VzIGFyZQotCQkJLy8gc2VsZWN0ZWQuIElmIGdsb2JhbCBwYWNrYWdlcyBhcmUgbWlzc2luZywgdGhlIGV4cG9ydGVkIGxpYnJhcnkKLQkJCS8vIGNhbid0IGJlIGxvYWRlZC4KLQkJCUxpYnJhcnlVdGlsLnZhbGlkYXRlTWV0aG9kQ29uZmlndXJhdGlvbihudWxsLCBjb25maWcpOwotCi0JCQljbG9zdXJlID0gbmV3IENvbmZpZ3VyYXRpb25DbG9zdXJlKG51bGwsIGNvbmZpZyk7Ci0JCQljbG9zdXJlLnBhY2thZ2VMaWJyYXJ5KGRhdGEucmVtb3ZlQnJva2VuUmVmZXJlbmNlcyk7Ci0JCX0gY2F0Y2ggKFRocm93YWJsZSBlKSB7Ci0JCQlFeHBvcnRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKAotCQkJCQkiRXJyb3IgbWFraW5nIGxpYnJhcnkgY29uZmlndXJhdGlvbiBjbG9zdXJlIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJCWRhdGEuZXJyb3JNc2cgPSBFeHBvcnRSZXNvdXJjZXMuQ29uZmlndXJhdGlvbkV4cG9ydFNlcnZpY2VfTVNHMTsgCi0KLQkJCWlmIChjbG9zdXJlICE9IG51bGwpCi0JCQkJY2xvc3VyZS5kaXNwb3NlKCk7Ci0JCQkKLQkJCUxpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkudW5SZWdpc3Rlck1ldGhvZExpYnJhcnkobmV3TGlicmFyeSk7Ci0JCQkKLQkJCXJldHVybjsKLQkJfQotCi0JCXRyeSB7Ci0JCQlMaWJyYXJ5VXRpbC5zYXZlQWxsKG5ld0xpYnJhcnkpOwotCi0JCQkvLyB0aGUgZmlyc3Qgcm91bmQgb2Ygc2F2ZSB3aWxsIGNyZWF0ZSB0aGUgcmVzb3VyY2Ugc3RydWN0dXJlLAotCQkJLy8gbmVlZCB0byBzYXZlIGFnYWluIHRvIG1ha2Ugc3VyZSBhbGwgcmVmZXJlbmNlcyBhcmUgc2F2ZWQuCi0JCQkvLyBUaGlzIHN0ZXAgaXMgY3JpdGljYWwgc2luY2UgdGhlIGZpcnN0IHJvdW5kIG9ubHkgY3JlYXRlZCB0aGUgZGF0YQotCQkJLy8gc3RydWN0dXJlCi0JCQkvLyBzb21lIG9mIHRoZSBjcm9zcy1yZWZlcmVuY2VkIGVsZW1lbnRzIG1pZ2h0IGJlIGxvc3Qgb24gdGhlIGZpcnN0Ci0JCQkvLyBzYXZpbmcKLQkJCS8vIGZvciBleGFtcGxlLCB3aGVuIGNyZWF0ZSBhIG1ldGhvZCBjb25maWd1cmF0aW9uIHdpdGggcmVmZXJlbmNlcwotCQkJLy8gdG8gYSBuZXcgcGx1Z2luLAotCQkJLy8gd2hpY2ggYXJlIG5vdCBzYXZlZCB5ZXQsIHRob3NlIHJlZmVyZW5jZXMgd2lsbCBiZSBsb3N0LgotCQkJLy8gMTQ1ODkxIC0gSW1wb3J0IENvbmZpZ3VyYXRpb246IGRlZmF1bHQgY29uZmlnIGlzIGxvc3MgYWZ0ZXIKLQkJCS8vIGltcG9ydAotCQkJTGlicmFyeVV0aWwuc2F2ZUFsbChuZXdMaWJyYXJ5KTsKLQotCQl9IGNhdGNoIChUaHJvd2FibGUgZSkgewotCQkJRXhwb3J0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcigKLQkJCQkJIkVycm9yIHNhdmluZyBsaWJyYXJ5IiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJCWRhdGEuZXJyb3JNc2cgPSBFeHBvcnRSZXNvdXJjZXMuQ29uZmlndXJhdGlvbkV4cG9ydFNlcnZpY2VfTVNHOTsgCi0KLQkJCWlmIChjbG9zdXJlICE9IG51bGwpCi0JCQkJY2xvc3VyZS5kaXNwb3NlKCk7Ci0KLQkJCUxpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkudW5SZWdpc3Rlck1ldGhvZExpYnJhcnkobmV3TGlicmFyeSk7Ci0KLQkJCXJldHVybjsKLQkJfQotCi0JCS8vIENvcHkgdGhlIHJlc291cmNlIGZpbGVzIGluIHRoZSBjdXJyZW50IGxpYnJhcnkgdG8gdGhlIG5ldyBsaWJyYXJ5LgotCQkvLyBGb3Igc2ltcGxpY2l0eSBzYWtlLCBjb3B5IGFsbCByZXNvdXJjZSBmaWxlcyBpZiB0aGUgZmlsZXMgZG8gbm90Ci0JCS8vIGV4aXN0IGluIHRoZSB0YXJnZXQgbGlicmFyeSBvciBpZiB0aGUgZmlsZXMgYXJlIG5ld2VyCi0JCS8vU3RyaW5nIGluY2x1ZGVzID0gInJlc291cmNlcy8qKiwgKiovcmVzb3VyY2VzLyoqIjsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgaW5jbHVkZXMgPSAicmVzb3VyY2VzLyoqLCAqKi9yZXNvdXJjZXMvKiosICoqL2RpYWdyYW0ueG1pIjsgLy8kTk9OLU5MUy0xJAotCi0JCUZpbGUgc3JjRGlyID0gTGlicmFyeVV0aWwuZ2V0TGlicmFyeVJvb3RQYXRoKGN1cnJlbnRMaWIpOwotCQlGaWxlIGRlc3REaXIgPSBMaWJyYXJ5VXRpbC5nZXRMaWJyYXJ5Um9vdFBhdGgobmV3TGlicmFyeSk7Ci0KLQkJTGF5b3V0UmVzb3VyY2VzLmNvcHlEaXIoc3JjRGlyLCBkZXN0RGlyLCBpbmNsdWRlcywgZXhjbHVkZXMpOwotCQloYW5kbGVFeHRyYVJlc291cmNlQ29weShjdXJyZW50TGliLCBuZXdMaWJyYXJ5LCBzcmNEaXIsIGRlc3REaXIsIGluY2x1ZGVzKTsKLQotCQkvLyBDbG9zZSB0aGUgbmV3bHkgY3JlYXRlZCBsaWJyYXJ5LgotCQlpZiAoY2xvc3VyZSAhPSBudWxsKQotCQkJY2xvc3VyZS5kaXNwb3NlKCk7Ci0JCQotCQlMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLnVuUmVnaXN0ZXJNZXRob2RMaWJyYXJ5KG5ld0xpYnJhcnkpOwotCi0JfQotCQotCXByaXZhdGUgdm9pZCBoYW5kbGVFeHRyYVJlc291cmNlQ29weShNZXRob2RMaWJyYXJ5IGJhc2VMaWIsIE1ldGhvZExpYnJhcnkgZXhwb3J0ZWRMaWIsIEZpbGUgYmFzZUxpYkRpciwgRmlsZSBleHBvcnRlZExpYkRpciwgU3RyaW5nIGluY2x1ZGVzKSB7Ci0JCUlMaWJyYXJ5UmVzb3VyY2VNYW5hZ2VyIGxpYlJlc01nciA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudExpYnJhcnlNYW5hZ2VyKCkuZ2V0UmVzb3VyY2VNYW5hZ2VyKCk7Ci0JCU1hcCBleHBvcnRlZFBsdWdpbk1hcCA9IE1ldGhvZEVsZW1lbnRVdGlsLmJ1aWxkTWFwKGJhc2VMaWIuZ2V0TWV0aG9kUGx1Z2lucygpKTsKLQkJCi0JCUxpc3Q8TWV0aG9kUGx1Z2luPiBiYXNlUGx1Z2lucyA9IGJhc2VMaWIuZ2V0TWV0aG9kUGx1Z2lucygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGJhc2VQbHVnaW5zLnNpemUoKTsgaSsrKSB7Ci0JCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gYmFzZVBsdWdpbnMuZ2V0KGkpOwotCQkJRmlsZSBwbHVnaW5Gb2xkZXIgPSBuZXcgRmlsZShsaWJSZXNNZ3IuZ2V0UGh5c2ljYWxQYXRoKHBsdWdpbikpOwotCQkJYm9vbGVhbiBwcm9jZXNzZWQgPSBiYXNlTGliRGlyLmVxdWFscyhwbHVnaW5Gb2xkZXIuZ2V0UGFyZW50RmlsZSgpKTsJCQkKLQkJCS8vU3lzdGVtLm91dC5wcmludGxuKCJMRCBwbHVnaW5Gb2xkZXI6ICIgKyBwbHVnaW5Gb2xkZXIgKyAiLCBwcm9jZXNzZWQ6ICIgKyBwcm9jZXNzZWQpOwotCQkJaWYgKCEgcHJvY2Vzc2VkKSB7Ci0JCQkJTWV0aG9kUGx1Z2luIGV4cG9ydGVkUGx1Z2luID0gKE1ldGhvZFBsdWdpbikgZXhwb3J0ZWRQbHVnaW5NYXAuZ2V0KHBsdWdpbi5nZXRHdWlkKCkpOwotCQkJCWlmIChleHBvcnRlZFBsdWdpbiA9PSBudWxsKSB7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCQlGaWxlIGRlc3REaXIgPSBuZXcgRmlsZShleHBvcnRlZExpYkRpciwgZXhwb3J0ZWRQbHVnaW4uZ2V0TmFtZSgpKTsKLQkJCQlMYXlvdXRSZXNvdXJjZXMuY29weURpcihwbHVnaW5Gb2xkZXIsIGRlc3REaXIsIGluY2x1ZGVzLCBleGNsdWRlcyk7Ci0JCQl9Ci0KLQkJfQkJCi0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9zZXJ2aWNlcy9Db25maWd1cmF0aW9uU3BlYy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9zZXJ2aWNlcy9Db25maWd1cmF0aW9uU3BlYy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYWRkYzk5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvc2VydmljZXMvQ29uZmlndXJhdGlvblNwZWMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5leHBvcnQuc2VydmljZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIE1vZGVscyBhIGxpYnJhcnkgY29uZmlndXJhdGlvbiBzcGVjaWZpY2F0aW9uLgotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQ29uZmlndXJhdGlvblNwZWMgewotCi0JcHVibGljIFN0cmluZyBuYW1lOwotCi0JcHVibGljIFN0cmluZyBndWlkOwotCi0JcHVibGljIFN0cmluZyB2ZXJzaW9uOwotCi0JcHVibGljIFN0cmluZyBicmllZl9kZXNjOwotCi0JcHVibGljIExpc3QgcGx1Z2luSWRzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JcHVibGljIExpc3QgcGFja2FnZUlkcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCXB1YmxpYyBMaXN0IHZpZXdJZHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBDb25maWd1cmF0aW9uU3BlYygpIHsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvc2VydmljZXMvQ29uZmlndXJhdGlvblNwZWNzRXhwb3J0U2VydmljZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9zZXJ2aWNlcy9Db25maWd1cmF0aW9uU3BlY3NFeHBvcnRTZXJ2aWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4ZTUzZjEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9zZXJ2aWNlcy9Db25maWd1cmF0aW9uU3BlY3NFeHBvcnRTZXJ2aWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5zZXJ2aWNlczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuRmlsZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5FeHBvcnRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5FeHBvcnRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLk11bHRpRmlsZVNhdmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLQotCi0vKioKLSAqIEV4cG9ydHMgYSBsaWJyYXJ5IGNvbmZpZ3VyYXRpb24gc3BlY2lmaWNhdGlvbi4KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNjIxNTMKLSAqLwotcHVibGljIGNsYXNzIENvbmZpZ3VyYXRpb25TcGVjc0V4cG9ydFNlcnZpY2UgZXh0ZW5kcyBCYXNlRXhwb3J0U2VydmljZSB7Ci0KLQlwcml2YXRlIENvbmZpZ3VyYXRpb25FeHBvcnREYXRhIGRhdGE7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBDb25maWd1cmF0aW9uU3BlY3NFeHBvcnRTZXJ2aWNlKENvbmZpZ3VyYXRpb25FeHBvcnREYXRhIGRhdGEpIHsKLQkJdGhpcy5kYXRhID0gZGF0YTsKLQl9Ci0KLQkvKioKLQkgKiBSdW4gdG8gZXhwb3J0IGEgY29uZmlndXJhdGlvbiBzcGVjaWZpY2FpdG9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJaWYgKGRhdGEuc2VsZWN0ZWRDb25maWdzID09IG51bGwgfHwgZGF0YS5zZWxlY3RlZENvbmZpZ3Muc2l6ZSgpID09IDApIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCW1vbml0b3Iuc2V0VGFza05hbWUoRXhwb3J0UmVzb3VyY2VzLkNvbmZpZ3VyYXRpb25TcGVjc0V4cG9ydFNlcnZpY2VfTVNHMCk7IAotCi0JCS8vIENyZWF0ZSB0aGUgZXhwb3J0IGxpYnJhcnkgZm9sZGVyLgotCQlGaWxlIGxpYkZvbGRlcjsKLQkJRmlsZSBleHBvcnRMaWJGb2xkZXI7Ci0KLQkJU3RyaW5nIGV4cG9ydExpYlBhdGggPSAobmV3IEZpbGUoZGF0YS5sbERhdGEuZ2V0UGFyZW50Rm9sZGVyKCkpKS5nZXRBYnNvbHV0ZVBhdGgoKTsKLQkJZXhwb3J0TGliRm9sZGVyID0gbmV3IEZpbGUoZXhwb3J0TGliUGF0aCk7Ci0JCWlmICghZXhwb3J0TGliRm9sZGVyLmV4aXN0cygpKSB7Ci0JCQlleHBvcnRMaWJGb2xkZXIubWtkaXIoKTsKLQkJfQotCi0JCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gKE1ldGhvZENvbmZpZ3VyYXRpb24pIGRhdGEuc2VsZWN0ZWRDb25maWdzCi0JCQkJLmdldCgwKTsKLQkJTWV0aG9kTGlicmFyeSBsaWIgPSAoTWV0aG9kTGlicmFyeSkgY29uZmlnLmVDb250YWluZXIoKTsKLQkJVVJJIHVyaSA9IGxpYi5lUmVzb3VyY2UoKS5nZXRVUkkoKTsKLQkJU3RyaW5nIHBhdGggPSB1cmkudG9GaWxlU3RyaW5nKCk7Ci0JCWxpYkZvbGRlciA9IChuZXcgRmlsZShwYXRoKSkuZ2V0UGFyZW50RmlsZSgpOwotCi0JCS8vIFByZXBhcmUgdGhlIGlkIHNlbGVjdGlvbnMsCi0JCWdldFNlbGVjdGVkSWRzKGRhdGEuc2VsZWN0ZWRDb25maWdzKTsKLQotCQkvLyBMb2FkIHRoZSBsaWJyYXJ5LnhtaSBhbmQgcmVtb3ZlIHVubmVlZGVkIGVsZW1lbnRzLgotCQlMaWJyYXJ5RG9jdW1lbnQgZG9jdW1lbnQgPSBwcm9jZXNzTGlicmFyeUZpbGUobmV3IEZpbGUobGliRm9sZGVyLCBsaWJyYXJ5RmlsZSksIG5ldyBGaWxlKAotCQkJCWV4cG9ydExpYkZvbGRlciwgZXhwb3J0RmlsZSkpOwotCi0JCWlmICggZG9jdW1lbnQgIT0gbnVsbCApIHsKLQkJCS8vIGNvcHkgdGhlIGNvbmlmdXJhdGlvbiBmaWxlcwotCQkJLy8gMTQzMDMzIC0gdXBkYXRlIGNvbmZpZyBzcGVjcycgaW1wb3J0aW5nIGFuZCBleHBvcnRpbmcgdG8gbWF0Y2ggd2l0aCB0aGUgbmV3IGZpbGUgZm9ybWF0Ci0JCQljb3B5Q29uZmlndXJhdGlvbkZpbGVzKGRvY3VtZW50LCBsaWJGb2xkZXIsIGV4cG9ydExpYkZvbGRlcik7Ci0JCX0KLQkJCi0JCW1vbml0b3Iuc2V0VGFza05hbWUoRXhwb3J0UmVzb3VyY2VzLkNvbmZpZ3VyYXRpb25TcGVjc0V4cG9ydFNlcnZpY2VfTVNHMSk7IAotCi0JfQotCi0JcHJpdmF0ZSB2b2lkIGNvcHlDb25maWd1cmF0aW9uRmlsZXMoTGlicmFyeURvY3VtZW50IGRvY3VtZW50LCBGaWxlIGxpYkZvbGRlciwgRmlsZSBleHBvcnRMaWJGb2xkZXIpIHsKLQkJLy8gMTQzMDMzIC0gdXBkYXRlIGNvbmZpZyBzcGVjcycgaW1wb3J0aW5nIGFuZCBleHBvcnRpbmcgdG8gbWF0Y2ggd2l0aCB0aGUgbmV3IGZpbGUgZm9ybWF0Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSBkYXRhLnNlbGVjdGVkQ29uZmlncy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IChNZXRob2RDb25maWd1cmF0aW9uKSBpdC5uZXh0KCk7Ci0JCQlTdHJpbmcgZ3VpZCA9IGNvbmZpZy5nZXRHdWlkKCk7Ci0JCQlTdHJpbmcgdXJpID0gZG9jdW1lbnQuZ2V0UmVzb3VyY2VVcmkoZ3VpZCk7Ci0JCQlTdHJpbmcgc3JjVXJpID0gbnVsbDsKLQkJCWlmICh1cmkgPT0gbnVsbCkgewotCQkJCVVSSSByZXNVcmkgPSBjb25maWcuZVJlc291cmNlKCkuZ2V0VVJJKCk7Ci0JCQkJc3JjVXJpID0gcmVzVXJpLnRvRmlsZVN0cmluZygpOwotCQkJCXVyaSA9IE11bHRpRmlsZVNhdmVVdGlsLk1FVEhPRF9DT05GSUdVUkFUSU9OX0ZPTERFUl9OQU1FICsgRmlsZS5zZXBhcmF0b3IgKyByZXNVcmkubGFzdFNlZ21lbnQoKTsKLQkJCQl1cmkgPSBkb2N1bWVudC5kZWNvZGVVcmkodXJpKTsKLQkJCX0KLQkJCWlmICggdXJpICE9IG51bGwgKSB7Ci0JCQkJRmlsZSBzcmMgPSBzcmNVcmkgPT0gbnVsbCA/IG5ldyBGaWxlKGxpYkZvbGRlciwgdXJpKSA6IG5ldyBGaWxlKHNyY1VyaSk7Ci0JCQkJRmlsZSB0YXJnZXQgPSAgbmV3IEZpbGUoZXhwb3J0TGliRm9sZGVyLCB1cmkpOwotCQkJCUZpbGVVdGlsLmNvcHlGaWxlKHNyYywgdGFyZ2V0KTsKLQkJCX0KLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgZ2V0U2VsZWN0ZWRJZHMoTGlzdCBjb25maWdzKSB7Ci0JCXNlbGVjdGVkSWRzLmNsZWFyKCk7Ci0JCXNlbGVjdGVkUGx1Z2luTmFtZXMuY2xlYXIoKTsKLQotCQkvLyBHZXQgc2VsZWN0ZWQgY29uZmlnIGlkcy4KLQkJaWYgKGNvbmZpZ3MgPT0gbnVsbCB8fCBjb25maWdzLnNpemUoKSA9PSAwKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gY29uZmlncy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IChNZXRob2RDb25maWd1cmF0aW9uKSBpdC5uZXh0KCk7Ci0JCQlTdHJpbmcgZ3VpZCA9IGNvbmZpZy5nZXRHdWlkKCk7Ci0JCQlpZiAoc2VsZWN0ZWRJZHMuY29udGFpbnMoZ3VpZCkpIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQotCQkJLy8gQWRkIHRoZSBjb25maWd1cmF0aW9uLgotCQkJc2VsZWN0ZWRJZHMuYWRkKGd1aWQpOwotCi0JCQkvLyBGb3IgZWFjaCBjb25maWd1cmF0aW9uLCB3ZSBuZWVkIHRvIHNhdmUgdGhlIG1ldGhvZCBwbHVnaW4gaWRzIGFuZAotCQkJLy8gbWV0aG9kIHBhY2thZ2UgaWRzIHNvIHRoYXQgdGhlaXIgZW50cmllcyBpbiB0aGUgcmVzb3VyY2UgZmlsZSBjYW4KLQkJCS8vIGJlIGtlcHQuCi0JCQlMaXN0IHJlZnMgPSBjb25maWcuZUNyb3NzUmVmZXJlbmNlcygpOwotCQkJZm9yIChJdGVyYXRvciBpdHIgPSByZWZzLml0ZXJhdG9yKCk7IGl0ci5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IG8gPSBpdHIubmV4dCgpOwotCQkJCWlmIChvIGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luIHx8IG8gaW5zdGFuY2VvZiBNZXRob2RQYWNrYWdlKSB7Ci0JCQkJCWd1aWQgPSAoKE1ldGhvZEVsZW1lbnQpIG8pLmdldEd1aWQoKTsKLQkJCQkJaWYgKCFzZWxlY3RlZElkcy5jb250YWlucyhndWlkKSkgewotCQkJCQkJc2VsZWN0ZWRJZHMuYWRkKGd1aWQpOwotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJRXhwb3J0UGx1Z2luCi0JCQkJCQkJLmdldERlZmF1bHQoKQotCQkJCQkJCS5nZXRMb2dnZXIoKQotCQkJCQkJCS5sb2dFcnJvcigKLQkJCQkJCQkJCSJVbmV4cGVjdGVkIGVsZW1lbnQgdHlwZSAnIiArICgoTWV0aG9kRWxlbWVudCkgbykuZ2V0VHlwZSgpLmdldE5hbWUoKSAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQkJCSsgIicgaW4gY29uZmlndXJhdGlvbiAnIiArIGNvbmZpZy5nZXROYW1lKCkgKyAiJyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3NlcnZpY2VzL0RpYWdyYW1IYW5kbGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3NlcnZpY2VzL0RpYWdyYW1IYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0MGNiOTEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9zZXJ2aWNlcy9EaWFncmFtSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjc3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5leHBvcnQuc2VydmljZXM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLkZpbGVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LklMaWJyYXJ5UmVzb3VyY2VNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuUmVzb3VyY2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DYXBhYmlsaXR5UGF0dGVybjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJ5UHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5VbWFVdGlsOwotCi0KLS8qKgotICogVXRpbGl0eSBjbGFzcyB0byBoYW5kbGUgZGlhZ3JhbSBleHBvcnQvaW1wb3J0Ci0gKiBAYXV0aG9yIFdlaXBpbmcgTHUKLSAqIEBzaW5jZSAxLjIKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBEaWFncmFtSGFuZGxlciB7Ci0JCi0JLy9UbyBkbzogbmVlZCB0byBjb25zaWRlciBlbGVtZW50IHJlbmFtZSBpc3N1ZS4gCi0JLy8JCSAtPiBSZXNvdmxlIHRoZSBpbnZvbHZlZCBmaWxlIG5hbWVzIGFmdGVyIGFsbCByZXNvdXJjZSBuYW1lcyBhcmUgc2V0dGxlZC4KLQkvLwkJIC0+IExldCBhIHN1YiBjbGFzcyB0byB0YWtlIG9mIGl0PwotCi0JcHJpdmF0ZSBGaWxlIHNvdXJjZUxpYlJvb3Q7Ci0JcHJpdmF0ZSBGaWxlIHRhcmdldExpYlJvb3Q7Ci0JcHJpdmF0ZSBNYXA8U3RyaW5nLCBNYXBFbnRyeVZhbHVlPiBlbGVtZW50TWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBNYXBFbnRyeVZhbHVlPigpOwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gZGVidWcgPSBmYWxzZTsKLQkJCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8JCi0JcHVibGljIERpYWdyYW1IYW5kbGVyKEZpbGUgc291cmNlTGliUm9vdCwgRmlsZSB0YXJnZXRMaWJSb290KSB7Ci0JCXRoaXMuc291cmNlTGliUm9vdCA9IHNvdXJjZUxpYlJvb3Q7Ci0JCXRoaXMudGFyZ2V0TGliUm9vdCA9IHRhcmdldExpYlJvb3Q7Ci0JfQotCQotCXByb3RlY3RlZCBNYXA8U3RyaW5nLCBNYXBFbnRyeVZhbHVlPiBnZXRFbGVtZW50TWFwKCkgewotCQlyZXR1cm4gZWxlbWVudE1hcDsKLQl9Ci0JCi0JcHJpdmF0ZSBib29sZWFuIG5lZWRUb1Byb2Nlc3MoTWV0aG9kRWxlbWVudCBlbGVtKSB7Ci0JCWJvb2xlYW4gYiA9IGVsZW0gaW5zdGFuY2VvZiBDYXBhYmlsaXR5UGF0dGVybiB8fAotCQkJCQkJCQllbGVtIGluc3RhbmNlb2YgRGVsaXZlcnlQcm9jZXNzOwotCQlyZXR1cm4gYjsJCi0JfQotCQotCXB1YmxpYyB2b2lkIHJlZ2lzdGVyRWxlbWVudChNZXRob2RFbGVtZW50IGVsZW0pIHsKLQkJcmVnaXN0ZXJFbGVtZW50KGVsZW0sIGZhbHNlKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVnaXN0ZXJFbGVtZW50KE1ldGhvZEVsZW1lbnQgZWxlbSwgYm9vbGVhbiBwcm9jZXNzRW50cnkpIHsKLQkJaWYgKCEgbmVlZFRvUHJvY2VzcyhlbGVtKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWlmIChlbGVtZW50TWFwLmNvbnRhaW5zS2V5KGVsZW0uZ2V0R3VpZCgpKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlNYXBFbnRyeVZhbHVlIG1hcEVudHJ5VmFsdWUgPSBuZXcgTWFwRW50cnlWYWx1ZSgpOwotCQltYXBFbnRyeVZhbHVlLmVsZW1lbnQgPSBlbGVtOwotCQllbGVtZW50TWFwLnB1dChlbGVtLmdldEd1aWQoKSwgbWFwRW50cnlWYWx1ZSk7CQkKLQkJCi0JCWlmIChwcm9jZXNzRW50cnkpIHsKLQkJCXByb2Nlc3NFbnRyeShlbGVtLCBtYXBFbnRyeVZhbHVlKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCBwb3N0UmVnaXN0ZXJFbGVtZW50cygpIHsKLQkJZm9yIChJdGVyYXRvcjxNYXBFbnRyeVZhbHVlPiBpdCA9IGVsZW1lbnRNYXAudmFsdWVzKCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJTWFwRW50cnlWYWx1ZSB2YWx1ZSA9IGl0Lm5leHQoKTsKLQkJCXByb2Nlc3NFbnRyeSh2YWx1ZS5lbGVtZW50LCB2YWx1ZSk7Ci0JCX0JCi0JfQotCi0JcHJpdmF0ZSB2b2lkIHByb2Nlc3NFbnRyeShNZXRob2RFbGVtZW50IGVsZW0sIE1hcEVudHJ5VmFsdWUgbWFwRW50cnlWYWx1ZSkgewotCQlGaWxlW10gZmlsZXMgPSBnZXRGaWxlcyhlbGVtKTsKLQkJRmlsZSBzb3VyY2VGaWxlID0gZmlsZXNbMF07Ci0JCUZpbGUgdGFyZ2V0RmlsZSA9IGZpbGVzWzFdOwotCi0JCWlmIChzb3VyY2VGaWxlICE9IG51bGwgJiYgc291cmNlRmlsZS5leGlzdHMoKSkgewotCQkJbWFwRW50cnlWYWx1ZS5zb3VyY2VGaWxlID0gc291cmNlRmlsZTsKLQkJfQotCi0JCWlmICh0YXJnZXRGaWxlLmV4aXN0cygpKSB7Ci0JCQlpZiAobWFwRW50cnlWYWx1ZS5zb3VyY2VGaWxlID09IG51bGwgfHwgbmVlZENvcHkobWFwRW50cnlWYWx1ZS5zb3VyY2VGaWxlLCB0YXJnZXRGaWxlKSkgewotCQkJCW1hcEVudHJ5VmFsdWUudGFyZ2V0RmlsZSA9IHRhcmdldEZpbGU7Ci0JCQl9Ci0JCQltYXBFbnRyeVZhbHVlLmV4aXN0aW5nID0gdHJ1ZTsKLQkJfSBlbHNlIHsKLQkJCWlmIChtYXBFbnRyeVZhbHVlLnNvdXJjZUZpbGUgIT0gbnVsbCkgewotCQkJCW1hcEVudHJ5VmFsdWUudGFyZ2V0RmlsZSA9IHRhcmdldEZpbGU7Ci0JCQl9Ci0JCX0KLQkJCi0JCWlmIChkZWJ1ZykgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJMRD4gbWFwRW50cnlWYWx1ZTogIik7CQkJCQkvLyROT04tTkxTLTEkCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4obWFwRW50cnlWYWx1ZS50b0RlYnVnU3RyaW5nKCJMRD4gIikpOwkvLyROT04tTkxTLTEkCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIiIpOwkJCQkJCQkJCQkvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0JCi0JcHVibGljIExpc3QgZ2V0TW9kaWZpZWRGaWxlcygpIHsKLQkJTGlzdCByZXQgPSBuZXcgQXJyYXlMaXN0KCk7CQkKLQkJZm9yIChJdGVyYXRvcjxNYXBFbnRyeVZhbHVlPiBpdCA9IGVsZW1lbnRNYXAudmFsdWVzKCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJTWFwRW50cnlWYWx1ZSB2YWx1ZSA9IGl0Lm5leHQoKTsKLQkJCWlmICh2YWx1ZS5leGlzdGluZyAmJiB2YWx1ZS50YXJnZXRGaWxlICE9IG51bGwpIHsKLQkJCQlyZXQuYWRkKHZhbHVlLnRhcmdldEZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOwotCQkJfQotCQl9CQkKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQkvKioKLQkgKiBjb3B5IGFsbCB0aGUgZmlsZXMgdG8gdGhlIGRlc3RpbmF0aW9uCi0JICoKLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQl0cnkgewotCQkJZXhlY3V0ZV8oKTsKLQkJfSBjYXRjaCAoVGhyb3dhYmxlIGUpIHsKLQkJCWlmIChkZWJ1ZykgewotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9Ci0JCX0JCi0JfQotCQotCXByaXZhdGUgdm9pZCBleGVjdXRlXygpIHsKLQkJCi0JCWZvciAoSXRlcmF0b3I8TWFwRW50cnlWYWx1ZT4gaXQgPSBlbGVtZW50TWFwLnZhbHVlcygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTsgKSB7Ci0JCQlNYXBFbnRyeVZhbHVlIHZhbHVlID0gaXQubmV4dCgpOwotCQkJaWYgKHZhbHVlLnRhcmdldEZpbGUgPT0gbnVsbCkgewotCQkJCWNvbnRpbnVlOwotCQkJfSBlbHNlIGlmICh2YWx1ZS5zb3VyY2VGaWxlICE9IG51bGwpIHsKLQkJCQlGaWxlIHBhcmVudEZpbGUgPSB2YWx1ZS50YXJnZXRGaWxlLmdldFBhcmVudEZpbGUoKTsKLQkJCQlGaWxlVXRpbC5jb3B5RmlsZSh2YWx1ZS5zb3VyY2VGaWxlLCB2YWx1ZS50YXJnZXRGaWxlKTsKLQkJCQlpZiAoZGVidWcpIHsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJMRDogRmlsZSBjb3BpZWQ6ICIgKyB2YWx1ZS5zb3VyY2VGaWxlKTsJLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJdmFsdWUudGFyZ2V0RmlsZS5kZWxldGUoKTsKLQkJCX0KLQkJfQkKLQl9Ci0JCQotCS8qKgotCSAqIENoZWNrcyB0byBzZWUgaWYgdGhlIGNvcHkgYWN0aW9uIGlzIG5lZWRlZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gbmVlZENvcHkoRmlsZSBzb3VyY2UsIEZpbGUgZGVzdCkgewotCQlib29sZWFuIHJldCA9IHRydWU7Ci0JCWlmIChkZXN0LmV4aXN0cygpKSB7Ci0JCQlyZXQgPSAoZGVzdC5sYXN0TW9kaWZpZWQoKSAhPSBzb3VyY2UubGFzdE1vZGlmaWVkKCkpCi0JCQkJCXx8IChkZXN0Lmxlbmd0aCgpICE9IHNvdXJjZS5sZW5ndGgoKSk7Ci0JCX0KLQkJcmV0dXJuIHJldDsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBjbGFzcyBNYXBFbnRyeVZhbHVlIHsKLQotCQlwdWJsaWMgTWV0aG9kRWxlbWVudCBlbGVtZW50OwotCQlwdWJsaWMgRmlsZSBzb3VyY2VGaWxlOwotCQlwdWJsaWMgRmlsZSB0YXJnZXRGaWxlOwotCQlwdWJsaWMgYm9vbGVhbiBleGlzdGluZyA9IGZhbHNlOwkJCi0JCQotCQlwdWJsaWMgU3RyaW5nIHRvRGVidWdTdHJpbmcoU3RyaW5nIHByb21wdCkgewotCQkJU3RyaW5nIHN0ciA9IHByb21wdCArICJlbGVtZW50OiAiICsgZWxlbWVudC5nZXROYW1lKCk7CQkvLyROT04tTkxTLTEkCi0JCQlzdHIgKz0gIlxuIiArIHByb21wdCArICJzb3VyY2VGaWxlOiAiICsgc291cmNlRmlsZTsJCS8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJc3RyICs9ICJcbiIgKyBwcm9tcHQgKyAidGFyZ2V0RmlsZTogIiArIHRhcmdldEZpbGU7CQkvLyROT04tTkxTLTEkIAkvLyROT04tTkxTLTIkCi0JCQlzdHIgKz0gIlxuIiArIHByb21wdCArICJleGlzdGluZzogIiArIGV4aXN0aW5nOwkJCS8vJE5PTi1OTFMtMSQgCS8vJE5PTi1OTFMtMiQJCQkKLQkJCXJldHVybiBzdHI7Ci0JCX0KLQkJCi0JfQotCi0JcHJvdGVjdGVkIEZpbGVbXSBnZXRGaWxlcyhNZXRob2RFbGVtZW50IGVsZW0pIHsKLQkJcmV0dXJuIGdldEZpbGVzKGVsZW0sIHRydWUpOwotCX0KLQkKLQkvL1swXTogc291cmNlRmlsZQotCS8vWzFdOiB0YXJnZXRGaWxlCi0JcHJvdGVjdGVkIEZpbGVbXSBnZXRGaWxlcyhNZXRob2RFbGVtZW50IGVsZW0sIGJvb2xlYW4gZXhwb3J0KSB7Ci0JCUZpbGVbXSBmaWxlcyA9IG5ldyBGaWxlWzJdOwotCQkKLQkJU3RyaW5nIGVsZW1lbnRQYXRoID0gUmVzb3VyY2VIZWxwZXIuZ2V0RWxlbWVudFBhdGgoZWxlbSk7Ci0JCWlmIChkZWJ1ZykgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJMRD4gZWxlbWVudFBhdGg6ICIgKyBlbGVtZW50UGF0aCk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlpZiAoZWxlbWVudFBhdGggPT0gbnVsbCB8fCBlbGVtZW50UGF0aC5sZW5ndGgoKSA9PSAwKSB7Ci0JCQlpZiAoZGVidWcpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxEPiBlbGVtZW50UGF0aCBpcyBudWxsIG9yIGVtcHR5ISIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlyZXR1cm4gZmlsZXM7Ci0JCX0KLQotCQlTdHJpbmcgZGlhZ3JhbVBhdGggPSBlbGVtZW50UGF0aCArIGVsZW0uZ2V0TmFtZSgpICsgRmlsZS5zZXBhcmF0b3IgKyAKLQkJCQkJCQkJImRpYWdyYW0ueG1pIjsJCQkJLy8kTk9OLU5MUy0xJAotCQkKLQkJaWYgKGRlYnVnKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxEPiBkaWFncmFtUGF0aCAwOiAiICsgZGlhZ3JhbVBhdGgpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlGaWxlIHNyY1Jvb3QgPSBzb3VyY2VMaWJSb290OwotCQlGaWxlIHRndFJvb3QgPSB0YXJnZXRMaWJSb290OwotCQkKLQkJCi0JCWlmIChleHBvcnQpIHsKLQkJCXNyY1Jvb3QgPSAgZ2V0Um9vdChlbGVtKTsKLQkJfSBlbHNlIHsKLQkJCXRndFJvb3QgPSAgZ2V0Um9vdChlbGVtKTsKLQkJfQotCQkKLQkJaWYgKGV4cG9ydCkgewotCQkJUmVzb3VyY2UgcmVzID0gZWxlbS5lUmVzb3VyY2UoKTsKLQkJCWlmIChyZXMgIT0gbnVsbCkgewotCQkJCUZpbGUgbW9kZWxGaWxlID0gbmV3IEZpbGUocmVzLmdldFVSSSgpLnRvRmlsZVN0cmluZygpKTsKLQkJCQlGaWxlIGZvbGRlciA9IG1vZGVsRmlsZS5nZXRQYXJlbnRGaWxlKCk7Ci0JCQkJU3RyaW5nIGZvbGRlclBhdGggPSBmb2xkZXIuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0KLQkJCQlpbnQgaXggPSBzcmNSb290LmdldEFic29sdXRlUGF0aCgpLmxlbmd0aCgpOwotCQkJCWlmIChmb2xkZXJQYXRoLmxlbmd0aCgpID4gaXgKLQkJCQkJCSYmIGZvbGRlclBhdGguc3Vic3RyaW5nKDAsIGl4KS5lcXVhbHNJZ25vcmVDYXNlKAotCQkJCQkJCQlzcmNSb290LmdldEFic29sdXRlUGF0aCgpKSkgewotCQkJCQlkaWFncmFtUGF0aCA9IGZvbGRlclBhdGguc3Vic3RyaW5nKGl4ICsgMSkgKyBGaWxlLnNlcGFyYXRvcgotCQkJCQkJCSsgImRpYWdyYW0ueG1pIjsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCX0KLQkJfSBlbHNlIHsKLQkJCVByb2Nlc3NDb21wb25lbnQgcGMgPSBVbWFVdGlsLmdldFByb2Nlc3NDb21wb25lbnQoZWxlbSk7Ci0JCQlpZiAocGMgIT0gbnVsbCAmJiAhIHBjLmdldE5hbWUoKS5lcXVhbHMoZWxlbS5nZXROYW1lKCkpKSB7Ci0JCQkJZGlhZ3JhbVBhdGggPSBlbGVtZW50UGF0aCArIHBjLmdldE5hbWUoKSArIEZpbGUuc2VwYXJhdG9yCi0JCQkJCQkrICJkaWFncmFtLnhtaSI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCQkKLQkJZmlsZXNbMF0gPSBuZXcgRmlsZShzcmNSb290LCBkaWFncmFtUGF0aCk7Ci0JCWZpbGVzWzFdID0gbmV3IEZpbGUodGd0Um9vdCwgZGlhZ3JhbVBhdGgpOwkJCi0KLQkJcmV0dXJuIGZpbGVzOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB2aXNpdEVsZW1lbnRNYXAoaW50IHBhc3NJZCkgewotCX0KLQotCXB1YmxpYyBGaWxlIGdldFNvdXJjZUxpYlJvb3QoKSB7Ci0JCXJldHVybiBzb3VyY2VMaWJSb290OwotCX0KLQkKLQlwcm90ZWN0ZWQgRmlsZSBnZXRSb290KE1ldGhvZEVsZW1lbnQgZWxlbSkgewotCQlJTGlicmFyeVJlc291cmNlTWFuYWdlciBsaWJSZXNNZ3IgPSBSZXNvdXJjZUhlbHBlci5nZXRSZXNvdXJjZU1ncihlbGVtKTsKLQkJU3RyaW5nIHBsdWdpblBhdGggPSBsaWJSZXNNZ3IuZ2V0UGh5c2ljYWxQbHVnaW5QYXRoKGVsZW0pOwotCQlGaWxlIHJvb3QgPSAobmV3IEZpbGUocGx1Z2luUGF0aCkpLmdldFBhcmVudEZpbGUoKTsKLQkJcmV0dXJuIHJvb3Q7Ci0JfQotCi0JcHVibGljIEZpbGUgZ2V0VGFyZ2V0TGliUm9vdCgpIHsKLQkJcmV0dXJuIHRhcmdldExpYlJvb3Q7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9zZXJ2aWNlcy9MaWJyYXJ5RG9jdW1lbnQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvc2VydmljZXMvTGlicmFyeURvY3VtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhZWZjZjYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9zZXJ2aWNlcy9MaWJyYXJ5RG9jdW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczMiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnNlcnZpY2VzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZUZpbHRlcjsKLWltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMRGVjb2RlcjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwucmVnZXguTWF0Y2hlcjsKLWltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKLQotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlcjsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5YTUxVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQuRXhwb3J0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5NdWx0aUZpbGVTYXZlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci0KLQotLyoqCi0gKiBFbmNhcHN1bGF0ZXMgYSBtZXRob2QgbGlicmFyeSB1c2luZyBhIERPTSBkb2N1bWVudC4KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBhdXRob3IgV2VpcGluZyBMdQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTGlicmFyeURvY3VtZW50IHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19tZXRob2RQbHVnaW5zID0gIm1ldGhvZFBsdWdpbnMiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfcHJlZGVmaW5lZENvbmZpZ3VyYXRpb25zID0gInByZWRlZmluZWRDb25maWd1cmF0aW9ucyI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19yZXNvdXJjZURlc2NyaXB0b3JzID0gInJlc291cmNlRGVzY3JpcHRvcnMiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfcmVzb3VyY2VTdWJNYW5hZ2VycyA9ICJzdWJNYW5hZ2VycyI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfbWV0aG9kRWxlbWVudFByb3BlcnR5ID0gIm1ldGhvZEVsZW1lbnRQcm9wZXJ0eSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfaHJlZiA9ICJocmVmIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9pZCA9ICJpZCI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfdXJpID0gInVyaSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfZ3VpZCA9ICJndWlkIjsgLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfdmFsdWUgPSAidmFsdWUiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBleHBvcnRGaWxlID0gImV4cG9ydC54bWkiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBsaWJyYXJ5RmlsZSA9ICJsaWJyYXJ5LnhtaSI7IC8vJE5PTi1OTFMtMSQKLQotCXByb3RlY3RlZCBGaWxlIGxpYkZpbGU7Ci0KLQlwcm90ZWN0ZWQgRG9jdW1lbnQgZG9jdW1lbnQ7Ci0KLQlwcm90ZWN0ZWQgRWxlbWVudCBsaWJUYWcgPSBudWxsOwotCi0JcHJvdGVjdGVkIEVsZW1lbnQgcmVzVGFnID0gbnVsbDsKLQkKLQlwcml2YXRlIEhhc2hNYXAgZ3VpZFRvVXJpTWFwID0gbnVsbDsKLQkKLQlwcml2YXRlIE1hcDxTdHJpbmcsIFN0cmluZz4gZ3VpZFRvUGx1Z05hbWVNYXA7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBMaWJyYXJ5RG9jdW1lbnQoRmlsZSBsaWJGaWxlKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5saWJGaWxlID0gbGliRmlsZTsKLQkJaW5pdCgpOwotCX0KLQotCXByaXZhdGUgdm9pZCBpbml0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuZG9jdW1lbnQgPSBYTUxVdGlsLmxvYWRYbWwobGliRmlsZSk7Ci0KLQkJRWxlbWVudCByb290ID0gZG9jdW1lbnQuZ2V0RG9jdW1lbnRFbGVtZW50KCk7Ci0JCU5vZGVMaXN0IG5vZGVzID0gcm9vdC5nZXRFbGVtZW50c0J5VGFnTmFtZSgib3JnLmVjbGlwc2UuZXBmLnVtYTpNZXRob2RMaWJyYXJ5Iik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKG5vZGVzICE9IG51bGwgJiYgbm9kZXMuZ2V0TGVuZ3RoKCkgPiAwKSB7Ci0JCQlsaWJUYWcgPSAoRWxlbWVudCkgbm9kZXMuaXRlbSgwKTsKLQkJfQotCi0JCW5vZGVzID0gcm9vdAotCQkJCS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib3JnLmVjbGlwc2UuZXBmLnVtYS5yZXNvdXJjZW1hbmFnZXI6UmVzb3VyY2VNYW5hZ2VyIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKG5vZGVzICE9IG51bGwgJiYgbm9kZXMuZ2V0TGVuZ3RoKCkgPiAwKSB7Ci0JCQlyZXNUYWcgPSAoRWxlbWVudCkgbm9kZXMuaXRlbSgwKTsKLQkJfQotCX0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGRvY3VtZW50IGZpZWxkCi0gICAgICovCi0JcHVibGljIERvY3VtZW50IGdldERvY3VtZW50KCkgewotCQlyZXR1cm4gdGhpcy5kb2N1bWVudDsKLQl9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBsaWJGaWxlIGZpZWxkCi0gICAgICovCi0JcHVibGljIEZpbGUgZ2V0RmlsZSgpIHsKLQkJcmV0dXJuIGxpYkZpbGU7Ci0JfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbGliVGFnIGZpZWxkCi0gICAgICovCi0JcHVibGljIEVsZW1lbnQgZ2V0TGliVGFnKCkgewotCQlyZXR1cm4gbGliVGFnOwotCX0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGxpYnJhcnkgbmFtZQotICAgICAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TGlicmFyeU5hbWUoKSB7Ci0JCXJldHVybiBsaWJUYWcuZ2V0QXR0cmlidXRlKCJuYW1lIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBsaWJyYXJ5IGd1aWQKLSAgICAgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExpYnJhcnlHdWlkKCkgewotCQlyZXR1cm4gbGliVGFnLmdldEF0dHJpYnV0ZSgiZ3VpZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgcmVzb3VyY2UgdGFnCi0gICAgICovCi0JcHVibGljIEVsZW1lbnQgZ2V0UmVzb3VyY2VUYWcoKSB7Ci0JCXJldHVybiByZXNUYWc7Ci0JfQotCi0gICAgLyoqCi0gICAgICogUmVtb3ZlcyBhIHBsdWdpbiBub2RlCi0gICAgICovCi0JcHVibGljIHZvaWQgcmVtb3ZlUGx1Z2luKEVsZW1lbnQgbm9kZSkgewotCQlsaWJUYWcucmVtb3ZlQ2hpbGQobm9kZSk7Ci0JfQotCi0gICAgLyoqCi0gICAgICogUmVtb3ZlcyBhIGNvbmZpZyBub2RlCi0gICAgICovCi0JcHVibGljIHZvaWQgcmVtb3ZlQ29uZmlndXJhdGlvbihFbGVtZW50IG5vZGUpIHsKLQkJbGliVGFnLnJlbW92ZUNoaWxkKG5vZGUpOwotCX0KLQotICAgIC8qKgotICAgICAqIFJlbW92ZXMgYSByZXNvdXJjZSBkZXNjcmlwdG9yIG5vZGUKLSAgICAgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVSZXNvdXJjZURlc2NyaXB0b3IoRWxlbWVudCBub2RlKSB7Ci0JCXJlc1RhZy5yZW1vdmVDaGlsZChub2RlKTsKLQl9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHBsdWdpbiBub2RlIGxpc3QKLSAgICAgKi8KLQlwdWJsaWMgTm9kZUxpc3QgZ2V0UGx1Z2lucygpIHsKLQkJcmV0dXJuIGxpYlRhZy5nZXRFbGVtZW50c0J5VGFnTmFtZShUQUdfbWV0aG9kUGx1Z2lucyk7Ci0JfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBjb25maWd1cmF0aW9uIG5vZGUgbGlzdAotICAgICAqLwotCXB1YmxpYyBOb2RlTGlzdCBnZXRDb25maWd1cmF0aW9ucygpIHsKLQkJcmV0dXJuIGxpYlRhZy5nZXRFbGVtZW50c0J5VGFnTmFtZShUQUdfcHJlZGVmaW5lZENvbmZpZ3VyYXRpb25zKTsKLQl9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHJlc291cmNlIGRlc2NyaXB0b3Igbm9kZSBsaXN0Ci0gICAgICovCi0JcHVibGljIE5vZGVMaXN0IGdldFJlc291cmNlRGVzY3JpcHRvcnMoKSB7Ci0JCXJldHVybiByZXNUYWcuZ2V0RWxlbWVudHNCeVRhZ05hbWUoVEFHX3Jlc291cmNlRGVzY3JpcHRvcnMpOwotCX0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgcmVzb3VyY2Ugc3VibWFuYWdlciBub2RlIGxpc3QKLSAgICAgKi8KLQlwdWJsaWMgTm9kZUxpc3QgZ2V0UmVzb3VyY2VTdWJNYW5hZ2VycygpIHsKLQkJcmV0dXJuIHJlc1RhZy5nZXRFbGVtZW50c0J5VGFnTmFtZShUQUdfcmVzb3VyY2VTdWJNYW5hZ2Vycyk7Ci0JfQotCi0gICAgLyoqCi0gICAgICogQWRkcyBhIHBsdWdpbiBub2RlCi0gICAgICovCi0JcHVibGljIHZvaWQgYWRkUGx1Z2luKEVsZW1lbnQgbm9kZSkgewotCQlsaWJUYWcuYXBwZW5kQ2hpbGQoZ2V0VmFsaWROb2RlKG5vZGUpKTsKLQl9Ci0KLSAgICAvKioKLSAgICAgKiBBZGRzIGEgY29uZmlndXJhdGlvbiBub2RlCi0gICAgICovCi0JcHVibGljIHZvaWQgYWRkQ29uZmlndXJhdGlvbihFbGVtZW50IG5vZGUpIHsKLQkJbGliVGFnLmFwcGVuZENoaWxkKGdldFZhbGlkTm9kZShub2RlKSk7Ci0JfQotCi0gICAgLyoqCi0gICAgICogQWRkcyBhIHJlc291cmNlIG5vZGUKLSAgICAgKi8KLQlwdWJsaWMgdm9pZCBhZGRSZXNvdXJjZShFbGVtZW50IG5vZGUpIHsKLQkJcmVzVGFnLmFwcGVuZENoaWxkKGdldFZhbGlkTm9kZShub2RlKSk7Ci0JfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIHZhbGlkIG5vZGUKLSAgICAgKi8KLQlwdWJsaWMgTm9kZSBnZXRWYWxpZE5vZGUoTm9kZSBub2RlKSB7Ci0JCWlmIChub2RlLmdldE93bmVyRG9jdW1lbnQoKSA9PSBkb2N1bWVudCkgewotCQkJcmV0dXJuIG5vZGU7Ci0JCX0KLQotCQlyZXR1cm4gZG9jdW1lbnQuaW1wb3J0Tm9kZShub2RlLCB0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiByZW1vdmUgcGx1Z2lucyBieSBndWlkCi0JICogCi0JICogQHBhcmFtIHJlbW92ZUxpc3QKLQkgKiAgICAgICAgICAgIExpc3QgYSBsaXN0IG9mIGd1aWRzCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlUGx1Z2lucyhMaXN0IHJlbW92ZUxpc3QpIHsKLQkJLy8gSW1wb3J0aW5nIGEgcGFja2FnZSBvZiBwbGdpbnMgdHdpY2UgZ2VuZXJhdGVzIDIKLQkJLy8gaWRlbnRpY2FsIHBsdWdpbnMKLQkJLy8gcmVtb3ZlIHRoZSBub2RlIHdpbGwgY2F1c2UgdGhlIG5vZGUgbGlzdCB0byBzaHJpbmssIHNvIGRvbid0IGluY3JlYXNlCi0JCS8vIHRoZSBpbmRleAotCQlOb2RlTGlzdCBub2RlcyA9IGdldFBsdWdpbnMoKTsKLQkJaW50IGkgPSAwOwotCQl3aGlsZSAoaSA8IG5vZGVzLmdldExlbmd0aCgpKSB7Ci0JCQlFbGVtZW50IG5vZGUgPSAoRWxlbWVudCkgbm9kZXMuaXRlbShpKTsKLQkJCVN0cmluZyBndWlkID0gZ2V0R3VpZChub2RlKTsKLQkJCWlmIChyZW1vdmVMaXN0LmNvbnRhaW5zKGd1aWQpKSB7Ci0JCQkJbGliVGFnLnJlbW92ZUNoaWxkKG5vZGUpOwotCQkJfSBlbHNlIHsKLQkJCQlpKys7Ci0JCQl9Ci0JCX0KLQl9Ci0KLSAgICAvKioKLSAgICAgKiBSZW1vdmUgdGhlIGxpc3QgZnJvbSB0aGUgY29uZmlndXJhdGlvbiBub2RlcwotICAgICAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUNvbmZpZ3VyYXRpb25zKExpc3QgcmVtb3ZlTGlzdCkgewotCQkvLyByZW1vdmUgdGhlIHVubmVlZGVkIGNvbmZpZ3VyYXRpb25zCi0JCU5vZGVMaXN0IG5vZGVzID0gZ2V0Q29uZmlndXJhdGlvbnMoKTsKLQkJaW50IGkgPSAwOwotCQl3aGlsZSAoaSA8IG5vZGVzLmdldExlbmd0aCgpKSB7Ci0JCQlFbGVtZW50IG5vZGUgPSAoRWxlbWVudCkgbm9kZXMuaXRlbShpKTsKLQkJCVN0cmluZyBndWlkID0gZ2V0R3VpZChub2RlKTsKLQkJCWlmIChyZW1vdmVMaXN0LmNvbnRhaW5zKGd1aWQpKSB7Ci0JCQkJbGliVGFnLnJlbW92ZUNoaWxkKG5vZGUpOwotCQkJfSBlbHNlIHsKLQkJCQlpKys7Ci0JCQl9Ci0JCX0KLQl9Ci0KLSAgICAvKioKLSAgICAgKiBSZW1vdmUgdGhlIGxpc3QgZnJvbSB0aGUgcmVzb3VyY2Ugbm9kZXMKLSAgICAgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVSZXNvdXJjZUVudHJpZXMoTGlzdCByZW1vdmVMaXN0KSB7Ci0JCU5vZGVMaXN0IG5vZGVzID0gZ2V0UmVzb3VyY2VEZXNjcmlwdG9ycygpOwotCQlpbnQgaSA9IDA7Ci0JCXdoaWxlIChpIDwgbm9kZXMuZ2V0TGVuZ3RoKCkpIHsKLQkJCUVsZW1lbnQgbm9kZSA9IChFbGVtZW50KSBub2Rlcy5pdGVtKGkpOwotCQkJU3RyaW5nIGd1aWQgPSBub2RlLmdldEF0dHJpYnV0ZShBVFRSX2lkKTsKLQkJCVN0cmluZyB1cmkgPSBub2RlLmdldEF0dHJpYnV0ZShBVFRSX3VyaSk7Ci0JCQlpZiAocmVtb3ZlTGlzdC5jb250YWlucyhndWlkKSkgewotCQkJCXJlc1RhZy5yZW1vdmVDaGlsZChub2RlKTsKLQotCQkJCS8vIGNoZWNrIHRoZSBwbHVnaW4geG1pIGZpbGUsIGlmIGV4aXN0cywgZGVsZXRlIHRoZSBmb2xkZXIKLQkJCQlGaWxlIHBsdWduX2ZpbGUgPSBnZXRGaWxlRnJvbVVyaSh1cmkpOwotCQkJCWlmIChwbHVnbl9maWxlLmV4aXN0cygpKSB7Ci0JCQkJCS8vIGRlbGV0ZSB0aGUgZm9sZGVyID8/PwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJaSsrOwotCQkJfQotCQl9Ci0KLQkJLy8gYWxzbyByZW1vdmUgdGhlIHN1YiBtYW5hZ2VycwotCQlub2RlcyA9IGdldFJlc291cmNlU3ViTWFuYWdlcnMoKTsKLQkJaSA9IDA7Ci0JCXdoaWxlIChpIDwgbm9kZXMuZ2V0TGVuZ3RoKCkpIHsKLQkJCUVsZW1lbnQgbm9kZSA9IChFbGVtZW50KSBub2Rlcy5pdGVtKGkpOwotCQkJU3RyaW5nIGd1aWQgPSBnZXRTdWJNYW5hZ2VyQmFzZUd1aWQobm9kZS5nZXRBdHRyaWJ1dGUoQVRUUl9ocmVmKSk7Ci0JCQlpZiAocmVtb3ZlTGlzdC5jb250YWlucyhndWlkKSkgewotCQkJCXJlc1RhZy5yZW1vdmVDaGlsZChub2RlKTsKLQkJCX0gZWxzZSB7Ci0JCQkJaSsrOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogZ2V0IHRoZSByZXNvdXJjZSB1cmkgZm9yIHRoZSByZXNvdXJjZSBndWlkCi0JICogQHBhcmFtIGd1aWQKLQkgKiBAcmV0dXJuIFN0cmluZyB0aGUgdXJpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRSZXNvdXJjZVVyaShTdHJpbmcgZ3VpZCkgewotCQlTdHJpbmcgdXJpID0gZ2V0VXJpRnJvbUd1aWRUb1VyaU1hcChndWlkKTsKLQkJaWYgKHVyaSA9PSBudWxsKSB7Ci0JCQl1cmkgPSBnZXRSZXNvdXJjZVVyaV8oZ3VpZCk7Ci0JCQlpZiAodXJpICE9IG51bGwpIHsKLQkJCQkvL2FkZFRvR3VpZFRvVXJpTWFwKGd1aWQsIHVyaSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHVyaTsKLQl9Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0UmVzb3VyY2VVcmlfKFN0cmluZyBndWlkKSB7Ci0JCi0JCU5vZGVMaXN0IG5vZGVzID0gZ2V0UmVzb3VyY2VEZXNjcmlwdG9ycygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG5vZGVzLmdldExlbmd0aCgpOyBpKysgKSB7Ci0JCQlFbGVtZW50IG5vZGUgPSAoRWxlbWVudCkgbm9kZXMuaXRlbShpKTsKLQkJCVN0cmluZyBpZCA9IG5vZGUuZ2V0QXR0cmlidXRlKEFUVFJfaWQpOwotCQkJU3RyaW5nIHVyaSA9IG5vZGUuZ2V0QXR0cmlidXRlKEFUVFJfdXJpKTsKLQkJCWlmICggZ3VpZC5lcXVhbHMoaWQpICkgewotCQkJCXJldHVybiBkZWNvZGVVcmkodXJpKTsKLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZGVjb3JlZCBVUkkuCi0JICovCi0JcHVibGljIFN0cmluZyBkZWNvZGVVcmkoU3RyaW5nIHVyaSkgewotCQl0cnkgewotCQkJdXJpID0gVVJMRGVjb2Rlci5kZWNvZGUodXJpLCAiVVRGLTgiKTsgLy8kTk9OLU5MUy0xJAotCQl9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQkJCi0JCXJldHVybiB1cmk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIGZpbGUgZ2l2ZW4gdGhlIHVyaS4KLQkgKi8KLQlwdWJsaWMgRmlsZSBnZXRGaWxlRnJvbVVyaShTdHJpbmcgdXJpKSB7Ci0JCXVyaSA9IGRlY29kZVVyaSh1cmkpOwotCQkKLQkJaW50IGkgPSB1cmkuaW5kZXhPZigiIyIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChpID4gMCkgewotCQkJdXJpID0gdXJpLnN1YnN0cmluZygwLCBpKTsKLQkJfQotCi0JCXJldHVybiBuZXcgRmlsZShsaWJGaWxlLmdldFBhcmVudEZpbGUoKSwgdXJpKTsKLQl9Ci0KLQkvKioKLQkgKiBTYXZlcyB0aGUgZG9jdW1lbnQuCi0JICovCi0JcHVibGljIHZvaWQgc2F2ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlzYXZlQXMobGliRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0JfQotCi0JLyoqCi0JICogU2F2ZXMgdGhlIGRvY3VtZW50IGluIHRoZSBmaWxlIGdpdmVuIGJ5IGZpbGVQYXRoTmFtZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzYXZlQXMoU3RyaW5nIGZpbGVQYXRoTmFtZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVhNTFV0aWwuc2F2ZURvY3VtZW50KHRoaXMuZG9jdW1lbnQsIGZpbGVQYXRoTmFtZSk7Ci0JfQotCi0JLyoqCi0JICogSXMgdGhlIGRvY3VtZW50IGZvciBjb25maWd1dGF0aW9uIHNwZWNpZmljYXRpb24gZXhwb3J0L2ltcG9ydCBvbmx5PwotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQ29uZmlnU3BlY3NPbmx5KCkgewotCQlOb2RlTGlzdCBub2RlcyA9IGdldFBsdWdpbnMoKTsKLQkJaWYgKG5vZGVzID09IG51bGwgfHwgbm9kZXMuZ2V0TGVuZ3RoKCkgPT0gMCkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQotCQlmb3IgKGludCBpID0gMDsgaSA8IG5vZGVzLmdldExlbmd0aCgpOyBpKyspIHsKLQkJCUVsZW1lbnQgbm9kZSA9IChFbGVtZW50KSBub2Rlcy5pdGVtKGkpOwotCQkJU3RyaW5nIGhyZWYgPSBub2RlLmdldEF0dHJpYnV0ZShMaWJyYXJ5RG9jdW1lbnQuQVRUUl9ocmVmKTsKLQkJCVN0cmluZyBndWlkID0gZ2V0R3VpZEZyb21IcmVmKGhyZWYpOwotCQkJU3RyaW5nIHVyaSA9IGdldFJlc291cmNlVXJpKGd1aWQpOwotCQkJCi0JCQkvLyBjaGVjayBpZiB0aGUgcmVzb3VyY2UgZmlsZXMgYXJlIHRoZXJlCi0JCQlGaWxlIHBsdWduX2ZpbGUgPSBnZXRGaWxlRnJvbVVyaSh1cmkpOwotCQkJaWYgKHBsdWduX2ZpbGUuZXhpc3RzKCkpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvLyBzdGF0aWMgaGxwZXIgbWV0aG9kcyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0JLyoqCi0JICogUmV0dXJucyBzdWJtYW5hZ2VyJ3MgYmFzZSBndWlkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFN1Yk1hbmFnZXJCYXNlR3VpZChTdHJpbmcgaHJlZikgewotCQlmaW5hbCBQYXR0ZXJuIHAgPSBQYXR0ZXJuLmNvbXBpbGUoCi0JCQkJInVtYTovLyguKj8pIyguKj8pIiwgUGF0dGVybi5DQVNFX0lOU0VOU0lUSVZFIHwgUGF0dGVybi5ET1RBTEwpOyAvLyROT04tTkxTLTEkCi0JCU1hdGNoZXIgbSA9IHAubWF0Y2hlcihocmVmKTsKLQkJaWYgKG0uZmluZCgpKSB7Ci0JCQlyZXR1cm4gbS5ncm91cCgxKTsKLQkJfQotCi0JCXJldHVybiBocmVmOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgY2hpbGQgdmFsdWUgb2YgdGhlIGNoaWxkIHRhZyBnaXZlbiBieSBjaGlsZFRhZ05hbWUuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0Q2hpbGRWYWx1ZShFbGVtZW50IHRhZywgU3RyaW5nIGNoaWxkVGFnTmFtZSkgewotCQlOb2RlTGlzdCBub2RlcyA9IHRhZy5nZXRDaGlsZE5vZGVzKCk7Ci0JCWlmIChub2RlcyA9PSBudWxsIHx8IG5vZGVzLmdldExlbmd0aCgpID09IDApIHsKLQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJaW50IHNpemUgPSBub2Rlcy5nZXRMZW5ndGgoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCU5vZGUgbm9kZSA9IG5vZGVzLml0ZW0oaSk7Ci0JCQlpZiAoKG5vZGUgaW5zdGFuY2VvZiBFbGVtZW50KQotCQkJCQkmJiAoKEVsZW1lbnQpIG5vZGUpLmdldFRhZ05hbWUoKS5lcXVhbHMoY2hpbGRUYWdOYW1lKSkgewotCQkJCXJldHVybiBnZXROb2RlVGV4dCgoRWxlbWVudCkgbm9kZSk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiB0ZXh0IG9mIGEgbGVhZiBub2RlLCB3aXRob3V0IGNoaWxkIGVsZW1lbnQKLQkgKiAKLQkgKiBAcGFyYW0gdGFnCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE5vZGVUZXh0KEVsZW1lbnQgdGFnKSB7Ci0KLQkJTm9kZUxpc3Qgbm9kZXMgPSB0YWcuZ2V0Q2hpbGROb2RlcygpOwotCQlpZiAobm9kZXMgPT0gbnVsbCB8fCBub2Rlcy5nZXRMZW5ndGgoKSA9PSAwKSB7Ci0JCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCWludCBzaXplID0gbm9kZXMuZ2V0TGVuZ3RoKCk7Ci0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlOb2RlIG5vZGUgPSBub2Rlcy5pdGVtKGkpOwotCQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSkgewotCQkJCWJ1ZmZlci5hcHBlbmQobm9kZS5nZXROb2RlVmFsdWUoKSk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBndWlkIGZyb20gaHJlZi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRHdWlkRnJvbUhyZWYoU3RyaW5nIGhyZWYpIHsKLQkJaW50IGkgPSBocmVmLmluZGV4T2YoIiMiKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAoaSA+IDApIHsKLQkJCXJldHVybiBocmVmLnN1YnN0cmluZyhpICsgMSk7Ci0JCX0KLQotCQlyZXR1cm4gaHJlZjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGd1aWQgb2YgdGhlIG5vZGUuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0R3VpZChFbGVtZW50IG5vZGUpIHsKLQkJU3RyaW5nIGlkID0gbm9kZS5nZXRBdHRyaWJ1dGUoInhtaTppZCIpOyAvLyROT04tTkxTLTEkCi0JCWlmICggaWQgPT0gbnVsbCB8fCBpZC5sZW5ndGgoKSA9PSAwICkgewotCQkJU3RyaW5nIGhyZWYgPSBub2RlLmdldEF0dHJpYnV0ZShBVFRSX2hyZWYpOwotCQkJaWQgPSBnZXRHdWlkRnJvbUhyZWYoaHJlZik7Ci0JCX0KLQkJCi0JCXJldHVybiBpZDsKLQl9Ci0JCi0JLy8gMTQzMDMzIC0gdXBkYXRlIGNvbmZpZyBzcGVjcycgaW1wb3J0aW5nIGFuZCBleHBvcnRpbmcgdG8gbWF0Y2ggd2l0aCB0aGUgbmV3IGZpbGUgZm9ybWF0Ci0JcHJvdGVjdGVkIEVsZW1lbnQgZ2V0Q29uZmlnTm9kZShFbGVtZW50IGNvbmZpZ05vZGUpIHsKLQkJdHJ5IHsKLQkJCQotCQkJLy8gbmV3IG1vZGVsIGRlZmluZXMgaHJlZiBmb3IgY29uZmlndXJhdGlvbiAKLQkJCVN0cmluZyBocmVmID0gY29uZmlnTm9kZS5nZXRBdHRyaWJ1dGUoQVRUUl9ocmVmKTsKLQkJCWlmIChocmVmID09IG51bGwgfHwgaHJlZi5sZW5ndGgoKSA9PSAwICkgewotCQkJCXJldHVybiBjb25maWdOb2RlOwotCQkJfSAKLQotCQkJU3RyaW5nIGd1aWQgPSBnZXRHdWlkRnJvbUhyZWYoaHJlZik7Ci0JCQlTdHJpbmcgdXJpID0gZ2V0UmVzb3VyY2VVcmkoZ3VpZCk7Ci0JCQlpZiAoIHVyaSA9PSBudWxsICkgewotCQkJCXJldHVybiBjb25maWdOb2RlOwotCQkJfQotCQkJCi0JCQlGaWxlIHNvdXJjZSA9IGdldEZpbGVGcm9tVXJpKHVyaSk7Ci0JCQlEb2N1bWVudCBkb2N1bWVudCA9IFhNTFV0aWwubG9hZFhtbChzb3VyY2UpOwotCQkJRWxlbWVudCByb290ID0gZG9jdW1lbnQuZ2V0RG9jdW1lbnRFbGVtZW50KCk7Ci0KLQkJCUVsZW1lbnQgY29uZmlnVGFnID0gbnVsbDsKLQkJCWlmIChyb290LmdldFRhZ05hbWUoKS5lcXVhbHMoIm9yZy5lY2xpcHNlLmVwZi51bWE6TWV0aG9kQ29uZmlndXJhdGlvbiIpKSAvLyROT04tTkxTLTEkCi0JCQl7Ci0JCQkJY29uZmlnVGFnID0gcm9vdDsKLQkJCX0gZWxzZSB7Ci0JCQkJTm9kZUxpc3Qgbm9kZXMgPSByb290Ci0JCQkJCQkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9yZy5lY2xpcHNlLmVwZi51bWE6TWV0aG9kQ29uZmlndXJhdGlvbiIpOyAvLyROT04tTkxTLTEkCi0JCQkJaWYgKG5vZGVzLmdldExlbmd0aCgpID4gMCkgewotCQkJCQljb25maWdUYWcgPSAoRWxlbWVudCkgbm9kZXMuaXRlbSgwKTsKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCXJldHVybiBjb25maWdUYWc7Ci0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCUV4cG9ydFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCX0KLQkJCi0JCXJldHVybiBjb25maWdOb2RlOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIENvbmZpZ3VyYXRpb25TcGVjIGluc3RhbmNlIGdpdmVuIHRoZSBlbGVtZW50IG5vZGUgY29uZmlnLgotCSAqLwotCXB1YmxpYyBDb25maWd1cmF0aW9uU3BlYyBnZXRDb25maWd1cmF0aW9uU3BlYyhFbGVtZW50IGNvbmZpZykgewotCQlDb25maWd1cmF0aW9uU3BlYyBzcGVjID0gbmV3IENvbmZpZ3VyYXRpb25TcGVjKCk7Ci0JCQotCQlFbGVtZW50IGNvbmZpZ05vZGUgPSBnZXRDb25maWdOb2RlKGNvbmZpZyk7Ci0JCXNwZWMuZ3VpZCA9IGNvbmZpZ05vZGUuZ2V0QXR0cmlidXRlKCJ4bWk6aWQiKTsgLy8kTk9OLU5MUy0xJAotCQlzcGVjLm5hbWUgPSBjb25maWdOb2RlLmdldEF0dHJpYnV0ZSgibmFtZSIpOyAvLyROT04tTkxTLTEkCi0JCXNwZWMuYnJpZWZfZGVzYyA9IGNvbmZpZ05vZGUuZ2V0QXR0cmlidXRlKCJicmllZkRlc2NyaXB0aW9uIik7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCS8vIGdldCBwbHVnaW5zCi0JCU5vZGVMaXN0IG5vZGVzID0gY29uZmlnTm9kZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgibWV0aG9kUGx1Z2luU2VsZWN0aW9uIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKG5vZGVzICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbm9kZXMuZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJCUVsZW1lbnQgbm9kZSA9IChFbGVtZW50KSBub2Rlcy5pdGVtKGkpOwotCQkJCVN0cmluZyBndWlkID0gZ2V0R3VpZEZyb21IcmVmKG5vZGUuZ2V0QXR0cmlidXRlKEFUVFJfaHJlZikpOwotCQkJCXNwZWMucGx1Z2luSWRzLmFkZChndWlkKTsKLQkJCX0KLQkJfQotCi0JCS8vIGdldCBwYWNrYWdlcwotCQlub2RlcyA9IGNvbmZpZ05vZGUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm1ldGhvZFBhY2thZ2VTZWxlY3Rpb24iKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAobm9kZXMgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBub2Rlcy5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCQkJRWxlbWVudCBub2RlID0gKEVsZW1lbnQpIG5vZGVzLml0ZW0oaSk7Ci0JCQkJU3RyaW5nIGd1aWQgPSBnZXRHdWlkRnJvbUhyZWYobm9kZS5nZXRBdHRyaWJ1dGUoQVRUUl9ocmVmKSk7Ci0JCQkJc3BlYy5wYWNrYWdlSWRzLmFkZChndWlkKTsKLQkJCX0KLQkJfQotCi0JCS8vIGdldCB2aWV3cwotCQlub2RlcyA9IGNvbmZpZ05vZGUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInByb2Nlc3NWaWV3cyIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChub2RlcyAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IG5vZGVzLmdldExlbmd0aCgpOyBpKyspIHsKLQkJCQlFbGVtZW50IG5vZGUgPSAoRWxlbWVudCkgbm9kZXMuaXRlbShpKTsKLQkJCQlTdHJpbmcgZ3VpZCA9IGdldEd1aWRGcm9tSHJlZihub2RlLmdldEF0dHJpYnV0ZShBVFRSX2hyZWYpKTsKLQkJCQlzcGVjLnZpZXdJZHMuYWRkKGd1aWQpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHNwZWM7Ci0JfQotCQotCS8qKgotCSAqIEFkZHMgZ3VpZC91cmkgcGFpciB0byBndWlkVG9VcmlNYXAuCi0JICovCi0JcHVibGljIHZvaWQgYWRkVG9HdWlkVG9VcmlNYXAoU3RyaW5nIGd1aWQsIFN0cmluZyB1cmkpIHsKLQkJaWYgKGd1aWRUb1VyaU1hcCA9PSBudWxsKSB7Ci0JCQlndWlkVG9VcmlNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQl9Ci0JCWd1aWRUb1VyaU1hcC5wdXQoZ3VpZCwgdXJpKTsKLQl9Ci0JCi0JLyoqCi0JICogR2V0cyB1cmkgZnJvbSBndWlkLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VXJpRnJvbUd1aWRUb1VyaU1hcChTdHJpbmcgZ3VpZCkgewotCQlyZXR1cm4gZ3VpZFRvVXJpTWFwID09IG51bGwgPyBudWxsIDogKFN0cmluZykgZ3VpZFRvVXJpTWFwLmdldChndWlkKTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlIGFuIGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2xhc3MgQ29uZmlnRG9jVmlzaXRvciB7Ci0JCXB1YmxpYyB2b2lkIHZpc2l0KEZpbGUgZmlsZSwgRWxlbWVudCBub2RlKSB7CQkJCi0JCX0KLQl9Ci0JCi0JLyoqCi0JICogVmlzaXQgY29uZmlndXJhdGlvbiBmaWxlcyBnaXZlbiBieSB0aGUgY29uZmlndXJhdGlvbiBmaWxlIGZvbGRlciBjb25maWdEaXIuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHZpc2l0Q29uZmlnRmlsZXMoRmlsZSBjb25maWdEaXIsIENvbmZpZ0RvY1Zpc2l0b3IgdmlzaXRvcikgewkKLQkJRmlsZUZpbHRlciBmaWx0ZXIgPSBuZXcgRmlsZUZpbHRlcigpIHsKLQkJCXB1YmxpYyBib29sZWFuIGFjY2VwdChGaWxlIHBhdGhuYW1lKSB7Ci0JCQkJcmV0dXJuICFwYXRobmFtZS5nZXROYW1lKCkuZXF1YWxzSWdub3JlQ2FzZSgiY3ZzIikgJiYgCQkvLyROT04tTkxTLTEkCi0JCQkJCQlwYXRobmFtZS5pc0RpcmVjdG9yeSgpIHx8IHBhdGhuYW1lLmdldE5hbWUoKS5lbmRzV2l0aChNdWx0aUZpbGVTYXZlVXRpbC5ERUZBVUxUX0ZJTEVfRVhURU5TSU9OKTsKLQkJCX0JCQkKLQkJfTsJCQotCQlGaWxlW10gZmlsZXMgPSBjb25maWdEaXIubGlzdEZpbGVzKGZpbHRlcik7Ci0JCWlmIChmaWxlcyA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJZm9yIChpbnQgaT0wOyBpPGZpbGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlGaWxlIGZpbGUgPSBmaWxlc1tpXTsKLQkJCXRyeSB7Ci0JCQkJRG9jdW1lbnRCdWlsZGVyIGJ1aWxkZXIgPSBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCkKLQkJCQkJCS5uZXdEb2N1bWVudEJ1aWxkZXIoKTsKLQkJCQlEb2N1bWVudCBkb2MgPSBidWlsZGVyLnBhcnNlKGZpbGUpOwotCQkJCUVsZW1lbnQgcm9vdCA9IGRvYy5nZXREb2N1bWVudEVsZW1lbnQoKTsKLQkJCQl2aXNpdG9yLnZpc2l0KGZpbGUsIHJvb3QpOwkJCQkKLQkJCX0gY2F0Y2ggKFRocm93YWJsZSBlKSB7Ci0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQkJfQkJCi0JfQotCQotCS8qKgotCSAqIEJ1aWxkIGEgbWFwIGZyb20gcGx1aWduIGd1aWRzIHRvIHJlc291cmNlIG1hbmFnZXIgZ3VpZHMuCi0JICovCi0JcHVibGljIE1hcCBidWlsZFBsdWdpbkd1aWRUb1Jlc01nckd1aWRNYXAoTGlzdCBwbHVnaW5HdWlkcykgewotCQlpZiAocGx1Z2luR3VpZHMgPT0gbnVsbCB8fCBwbHVnaW5HdWlkcy5zaXplKCkgPT0gMCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJTm9kZUxpc3Qgc3ViTWdycyA9IGdldFJlc291cmNlU3ViTWFuYWdlcnMoKTsKLQkJaWYgKHN1Yk1ncnMgPT0gbnVsbCB8fCBzdWJNZ3JzLmdldExlbmd0aCgpID09IDApIHsKLQkJCXJldHVybiBudWxsOwotCQl9CQkJCQotCQlIYXNoTWFwIHBsdWdpbkd1aWRUb1Jlc01nckd1aWRNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQlmb3IgKGludCBpPTA7IGk8cGx1Z2luR3VpZHMuc2l6ZSgpOyBpKyspIHsJCQkKLQkJCVN0cmluZyBwbHVnaW5HdWlkID0gKFN0cmluZykgcGx1Z2luR3VpZHMuZ2V0KGkpOwotCQkJcGx1Z2luR3VpZFRvUmVzTWdyR3VpZE1hcC5wdXQocGx1Z2luR3VpZCwgbnVsbCk7Ci0JCX0KLQkJYm9vbGVhbiBpc0VtcHR5ID0gdHJ1ZTsKLQkJZm9yIChpbnQgaT0wOyBpPHN1Yk1ncnMuZ2V0TGVuZ3RoKCk7IGkrKykgewkJCQotCQkJRWxlbWVudCBtZ3IgPSAoRWxlbWVudCkgc3ViTWdycy5pdGVtKGkpOwotCQkJU3RyaW5nICBocmVmID0gbWdyLmdldEF0dHJpYnV0ZShBVFRSX2hyZWYpOwotCQkJU3RyaW5nIHBsdWdpbkd1aWQgPSBnZXRTdWJNYW5hZ2VyQmFzZUd1aWQoaHJlZik7Ci0JCQlpZiAocGx1Z2luR3VpZFRvUmVzTWdyR3VpZE1hcC5jb250YWluc0tleShwbHVnaW5HdWlkKSkgewotCQkJCXBsdWdpbkd1aWRUb1Jlc01nckd1aWRNYXAucHV0KHBsdWdpbkd1aWQsIGdldEd1aWRGcm9tSHJlZihocmVmKSk7Ci0JCQkJaXNFbXB0eSA9IGZhbHNlOwotCQkJfQotCQl9CQkKLQkJcmV0dXJuIGlzRW1wdHkgPyAgbnVsbCA6IHBsdWdpbkd1aWRUb1Jlc01nckd1aWRNYXA7Ci0JfQotCQotCS8qKgotCSAqIFNhdmUgZXh0cmEgaW5mbyAoYWxsIHBsdWdpbiBndWlkcyBhbmQgbmFtZXMpIGluIGxpYlRhZydzIE1ldGhvZEVsZW1lbnRQcm9wZXJ0eQotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3JlRXh0cmFJbmZvKExpc3Q8TWV0aG9kUGx1Z2luPiBwbHVnaW5zKSB7Ci0JCWlmIChwbHVnaW5zID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQkJCi0KLQkJRWxlbWVudCB2ZXJzaW9uTm9kZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoVEFHX21ldGhvZEVsZW1lbnRQcm9wZXJ0eSk7Ci0JCXZlcnNpb25Ob2RlLnNldEF0dHJpYnV0ZShBVFRSX3ZhbHVlLCAiMCIpOwkvLyROT04tTkxTLTEkIAotCQlsaWJUYWcuYXBwZW5kQ2hpbGQodmVyc2lvbk5vZGUpOwkJCi0JCQotCQlmb3IgKEl0ZXJhdG9yPE1ldGhvZFBsdWdpbj4gaXQgPSBwbHVnaW5zLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCU1ldGhvZFBsdWdpbiBwbHVnID0gaXQubmV4dCgpOwotCQkJCi0JCQlFbGVtZW50IGd1aWROb2RlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChUQUdfbWV0aG9kRWxlbWVudFByb3BlcnR5KTsJCi0JCQlndWlkTm9kZS5zZXRBdHRyaWJ1dGUoQVRUUl92YWx1ZSwgcGx1Zy5nZXRHdWlkKCkpOwotCQkJRWxlbWVudCBuYW1lTm9kZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoVEFHX21ldGhvZEVsZW1lbnRQcm9wZXJ0eSk7CQotCQkJbmFtZU5vZGUuc2V0QXR0cmlidXRlKEFUVFJfdmFsdWUsIHBsdWcuZ2V0TmFtZSgpKTsKLQkJCQotCQkJbGliVGFnLmFwcGVuZENoaWxkKGd1aWROb2RlKTsKLQkJCWxpYlRhZy5hcHBlbmRDaGlsZChuYW1lTm9kZSk7Ci0JCX0KLQkJCi0JfQkKLQkKLQlwcml2YXRlIHZvaWQgcmVjYWxsRXh0cmFJbmZvKCkgewotCQl0cnkgewotCQkJTm9kZUxpc3Qgbm9kZXMgPSBnZXRNZXRob2RFbGVtZW50UHJvcGVydGllcygpOwotCQkJaWYgKG5vZGVzID09IG51bGwgfHwgbm9kZXMuZ2V0TGVuZ3RoKCkgPT0gMCkgewotCQkJCXJldHVybjsKLQkJCX0KLQkJCUVsZW1lbnQgdmVyc2lvbk5vZGUgPSAoRWxlbWVudCkgbm9kZXMuaXRlbSgwKTsKLQkJCVN0cmluZyB2ZXJzaW9uU3RyID0gdmVyc2lvbk5vZGUuZ2V0QXR0cmlidXRlKEFUVFJfdmFsdWUpOwotCQkJCi0JCQlpZiAodmVyc2lvblN0ci5lcXVhbHMoIjAiKSkgeyAvLyROT04tTkxTLTEkIAotCQkJCWd1aWRUb1BsdWdOYW1lTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7Ci0JCQkJZm9yIChpbnQgaSA9IDE7IGkgPCBub2Rlcy5nZXRMZW5ndGgoKTspIHsKLQkJCQkJRWxlbWVudCBub2RlID0gKEVsZW1lbnQpIG5vZGVzLml0ZW0oaSk7Ci0JCQkJCVN0cmluZyBndWlkID0gbm9kZS5nZXRBdHRyaWJ1dGUoQVRUUl92YWx1ZSk7Ci0JCQkJCW5vZGUgPSAoRWxlbWVudCkgbm9kZXMuaXRlbShpICsgMSk7Ci0JCQkJCVN0cmluZyBuYW1lID0gbm9kZS5nZXRBdHRyaWJ1dGUoQVRUUl92YWx1ZSk7Ci0JCQkJCWd1aWRUb1BsdWdOYW1lTWFwLnB1dChndWlkLCBuYW1lKTsKLQkJCQkJaWYgKGZhbHNlKSB7CQkJCQotCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJMRD4gZ3VpZDogIiArIGd1aWQpOyAvLyROT04tTkxTLTEkCi0JCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxEPiBuYW1lOiAiICsgbmFtZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQkJCQkJCi0JCQkJCWkgKz0gMjsKLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKFRocm93YWJsZSBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJZ3VpZFRvUGx1Z05hbWVNYXAgPSBudWxsOwotCQl9Ci0JCQotCX0KLQkKLQkvKioKLQkgKiBHZXQgZ3VpZCB0byBwbHVnaW4gbWFwCi0JICovCi0JcHVibGljIE1hcDxTdHJpbmcsIFN0cmluZz4gZ2V0R3VpZFRvUGx1Z05hbWVNYXAoKSB7Ci0JCWlmIChndWlkVG9QbHVnTmFtZU1hcCA9PSBudWxsKSB7Ci0JCQlyZWNhbGxFeHRyYUluZm8oKTsKLQkJfQkJCi0JCXJldHVybiBndWlkVG9QbHVnTmFtZU1hcDsKLQl9Ci0JCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBtZXRob2RFbGVtZW50UHJvcGVydHkgbm9kZSBsaXN0Ci0gICAgICovCi0JcHJpdmF0ZSBOb2RlTGlzdCBnZXRNZXRob2RFbGVtZW50UHJvcGVydGllcygpIHsKLQkJcmV0dXJuIGxpYlRhZy5nZXRFbGVtZW50c0J5VGFnTmFtZShUQUdfbWV0aG9kRWxlbWVudFByb3BlcnR5KTsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3NlcnZpY2VzL1BsdWdpbkV4cG9ydERhdGEuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvc2VydmljZXMvUGx1Z2luRXhwb3J0RGF0YS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YTU4MzMwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvc2VydmljZXMvUGx1Z2luRXhwb3J0RGF0YS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5zZXJ2aWNlczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByZWZlcmVuY2VzLkxpYnJhcnlMb2NhdGlvbkRhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5MaWJyYXJ5VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLQotCi0vKioKLSAqIEVuY2Fwc3VsYXRlcyB0aGUgaW5wdXQgZGF0YSByZXF1aXJlZCB0byBleHBvcnQgYSBtZXRob2QgcGx1Zy1pbi4KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUGx1Z2luRXhwb3J0RGF0YSB7Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbjxNZXRob2RQbHVnaW4+IHNlbGVjdGVkUGx1Z2lucyA9IG51bGw7Ci0KLQlwdWJsaWMgTGlicmFyeUxvY2F0aW9uRGF0YSBsbERhdGEgPSBudWxsOwotCi0JcHVibGljIEhhc2h0YWJsZSBhc3NvY2lhdGVkQ29uZmlnTWFwID0gbmV3IEhhc2h0YWJsZSgpOwotCi0JLy8gZG9uJ3QgbmVlZCBpdCBhZnRlciB0aGUgc2VydmljZSBjb2RlIGNoYW5nZXMKLQlwdWJsaWMgTGlzdCBhc3NvY2lhdGVkQ29uZmlncyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFBsdWdpbkV4cG9ydERhdGEoKSB7Ci0JCWxsRGF0YSA9IG5ldyBMaWJyYXJ5TG9jYXRpb25EYXRhKCk7Ci0JCWxsRGF0YS5sb2FkRnJvbVByZWZlcmVuY2VTdG9yZSgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGxpc3Qgb2Ygc2VsZWN0ZWQgcGx1Z2lucy4KLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbjxNZXRob2RQbHVnaW4+IGdldFNlbGVjdGVkUGx1Z2lucygpIHsKLQkJcmV0dXJuIHNlbGVjdGVkUGx1Z2luczsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBsaXN0IG9mIHNlbGVjdGVkIHBsdWdpbnMuCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2VsZWN0ZWRQbHVnaW5zKENvbGxlY3Rpb248TWV0aG9kUGx1Z2luPiBzZWxlY3RlZFBsdWdpbnMpIHsKLQkJdGhpcy5zZWxlY3RlZFBsdWdpbnMgPSBzZWxlY3RlZFBsdWdpbnM7Ci0JfTsKLQotCS8qKgotCSAqIHZhbGlkYXRlIGF0dHJpYnV0ZQotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JLyoqCi0JICogQnVpbGRzIGFzc29jaWF0ZWRDb25maWdNYXAuCi0JICovCi0JcHVibGljIHZvaWQgYnVpbGRBc3NvY2lhdGVkQ29uZmlnTWFwKCkgewotCQlpZiAoZ2V0U2VsZWN0ZWRQbHVnaW5zKCkgIT0gbnVsbCkgewotCQkJYXNzb2NpYXRlZENvbmZpZ01hcC5jbGVhcigpOwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gZ2V0U2VsZWN0ZWRQbHVnaW5zKCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCU1ldGhvZFBsdWdpbiBlbGVtZW50ID0gKE1ldGhvZFBsdWdpbikgaXRlci5uZXh0KCk7Ci0JCQkJYXNzb2NpYXRlZENvbmZpZ01hcC5wdXQoZWxlbWVudCwgTGlicmFyeVV0aWwKLQkJCQkJCS5nZXRBc3NvY2lhdGVkQ29uZmlndXJhdGlvbnMoZWxlbWVudCkpOwotCQkJfQotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3NlcnZpY2VzL1BsdWdpbkV4cG9ydFNlcnZpY2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvc2VydmljZXMvUGx1Z2luRXhwb3J0U2VydmljZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOGEyZWUwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvc2VydmljZXMvUGx1Z2luRXhwb3J0U2VydmljZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjM0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5leHBvcnQuc2VydmljZXM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLkNvcHk7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuRmlsZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuRmlsZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5FeHBvcnRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLk11bHRpRmlsZVNhdmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLQotLyoqCi0gKiBFeHBvcnRzIG9uZSBvciBtb3JlIG1ldGhvZCBwbHVnLWlucyB0byBhIHRhcmdldCBkaXJlY3RvcnkuCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNjIxNTMKLSAqLwotcHVibGljIGNsYXNzIFBsdWdpbkV4cG9ydFNlcnZpY2UgZXh0ZW5kcyBCYXNlRXhwb3J0U2VydmljZSB7Ci0KLQlQbHVnaW5FeHBvcnREYXRhIGRhdGE7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBQbHVnaW5FeHBvcnRTZXJ2aWNlKFBsdWdpbkV4cG9ydERhdGEgZGF0YSkgewotCQl0aGlzLmRhdGEgPSBkYXRhOwotCX0KLQotCS8qKgotCSAqIFJ1biB0byBleHBvcnQgcGx1Z2lucwotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJbW9uaXRvci5zZXRUYXNrTmFtZShFeHBvcnRSZXNvdXJjZXMuUGx1Z2luRXhwb3J0U2VydmljZV9NU0cwKTsgCi0KLQkJQ29sbGVjdGlvbjxNZXRob2RQbHVnaW4+IHBsdWdpbnMgPSBkYXRhLnNlbGVjdGVkUGx1Z2luczsKLQkJaWYgKHBsdWdpbnMgPT0gbnVsbCB8fCBwbHVnaW5zLnNpemUoKSA9PSAwKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQltb25pdG9yLnNldFRhc2tOYW1lKEV4cG9ydFJlc291cmNlcy5QbHVnaW5FeHBvcnRTZXJ2aWNlX01TRzEpOyAKLQotCQkvLyBDcmVhdGUgdGhlIGxpYnJhcnkgZm9sZGVyIGluIHRoZSB0YXJnZXQgZGlyZWN0b3J5LgotCQlTdHJpbmcgZXhwb3J0TGliUGF0aCA9IChuZXcgRmlsZShkYXRhLmxsRGF0YS5nZXRQYXJlbnRGb2xkZXIoKSkpLmdldEFic29sdXRlUGF0aCgpOwotCQlGaWxlIGV4cG9ydExpYkZvbGRlciA9IG5ldyBGaWxlKGV4cG9ydExpYlBhdGgpOwotCQlpZiAoIWV4cG9ydExpYkZvbGRlci5leGlzdHMoKSkgewotCQkJZXhwb3J0TGliRm9sZGVyLm1rZGlyKCk7Ci0JCX0KLQotCQltb25pdG9yLnNldFRhc2tOYW1lKEV4cG9ydFJlc291cmNlcy5QbHVnaW5FeHBvcnRTZXJ2aWNlX01TRzIpOyAKLQotCQlNZXRob2RMaWJyYXJ5IGN1cnJMaWIgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCk7Ci0JCVN0cmluZyBjdXJyTGliUGF0aCA9IGN1cnJMaWIuZVJlc291cmNlKCkuZ2V0VVJJKCkudG9GaWxlU3RyaW5nKCk7Ci0JCUZpbGUgY3VyckxpYkZpbGUgPSBuZXcgRmlsZShjdXJyTGliUGF0aCk7Ci0JCQotCQkvLyBJdGVyYXRlIHRoZSBzZWxlY3RlZCBwbHVnLWlucyBhbmQgY29weSB0aGVpciBhc3NvY2lhdGVkIG1vZGVsIGZpbGVzLgotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gcGx1Z2lucy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gKE1ldGhvZFBsdWdpbikgaXQubmV4dCgpOwotCQkJaWYgKHBsdWdpbiA9PSBudWxsKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0KLQkJCS8vIFN0ZXAgMTogQ3JlYXRlIHRoZSBwbHVnLWluIGZvbGRlci4KLQkJCVVSSSB1cmkgPSBwbHVnaW4uZVJlc291cmNlKCkuZ2V0VVJJKCk7Ci0JCQlTdHJpbmcgcGF0aCA9IHVyaS50b0ZpbGVTdHJpbmcoKTsKLQotCQkJRmlsZSBwbHVnaW5Gb2xkZXIgPSAobmV3IEZpbGUocGF0aCkpLmdldFBhcmVudEZpbGUoKTsKLQotCQkJU3RyaW5nIHBsdWdpblBhdGggPSBwbHVnaW4uZ2V0TmFtZSgpICsgRmlsZS5zZXBhcmF0b3I7Ci0JCQlGaWxlIGV4cG9ydFBsdWdpbkZvbGRlciA9IG5ldyBGaWxlKGV4cG9ydExpYkZvbGRlciwgcGx1Z2luUGF0aCk7Ci0KLQkJCS8vIFN0ZXAgMjogQ29weSB0aGUgcGx1Zy1pbiBmaWxlcy4KLQkJCWNvcHlEaXIocGx1Z2luRm9sZGVyLCBleHBvcnRQbHVnaW5Gb2xkZXIpOwkJCQotCQl9Ci0KLQkJbW9uaXRvci5zZXRUYXNrTmFtZShFeHBvcnRSZXNvdXJjZXMuUGx1Z2luRXhwb3J0U2VydmljZV9NU0czKTsgCi0KLQkJLy8gR2V0IHRoZSBzZWxlY3RlZCBwbHVnLWluIGFuZCBjb25maWd1cmF0aW9uIGlkcyBzbyB3ZSBjYW4gcmVtb3ZlIHRoZQotCQkvLyB1bm5lZWRlZCBzdHVmZi4KLQkJZ2V0U2VsZWN0ZWRJZHMoZGF0YS5zZWxlY3RlZFBsdWdpbnMsIGRhdGEuYXNzb2NpYXRlZENvbmZpZ01hcCk7Ci0KLQkJLy8gU3RlcCAzOiBMb2FkIHRoZSBsaWJyYXJ5LnhtaSBhbmQgdGhlIHJlc21nci54bWksIHJlbW92ZSB0aGUgdW5uZWVkZWQKLQkJLy8gc3R1ZmYuCi0JCUZpbGUgbGliRm9sZGVyID0gbmV3IEZpbGUoTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeUxvY2F0aW9uKCkpOwotCQlMaWJyYXJ5RG9jdW1lbnQgZG9jdW1lbnQgPSBwcm9jZXNzTGlicmFyeUZpbGUoY3VyckxpYkZpbGUsIG5ldyBGaWxlKAotCQkJCWV4cG9ydExpYkZvbGRlciwgZXhwb3J0RmlsZSkpOwotCi0JCWlmICggZG9jdW1lbnQgIT0gbnVsbCApIHsKLQkJCS8vIGNvcHkgdGhlIGNvbmlmdXJhdGlvbiBmaWxlcwotCQkJLy8gMTQyMzc5IC0gdXBkYXRlIHBsdWdpbiBpbXBvcnRpbmcgYW5kIGV4cG9ydGluZyB0byBtYXRjaCB3aXRoIHRoZSBuZXcgZmlsZSBmb3JtYXQKLQkJCWNvcHlDb25maWd1cmF0aW9uRmlsZXMoZG9jdW1lbnQsIGxpYkZvbGRlciwgZXhwb3J0TGliRm9sZGVyKTsKLQkJfQotCQkKLQkJbW9uaXRvci5zZXRUYXNrTmFtZShFeHBvcnRSZXNvdXJjZXMuUGx1Z2luRXhwb3J0U2VydmljZV9NU0c0KTsgCi0JfQotCi0JCi0JcHJpdmF0ZSB2b2lkIGNvcHlDb25maWd1cmF0aW9uRmlsZXMoTGlicmFyeURvY3VtZW50IGRvY3VtZW50LCBGaWxlIGxpYkZvbGRlciwgRmlsZSBleHBvcnRMaWJGb2xkZXIpIHsKLQkJLy8gLy8gMTQyMzc5IC0gdXBkYXRlIHBsdWdpbiBpbXBvcnRpbmcgYW5kIGV4cG9ydGluZyB0byBtYXRjaCB3aXRoIHRoZSBuZXcgZmlsZSBmb3JtYXQKLQkJLy8gR2V0IHRoZSBzZWxlY3RlZCBjb25maWd1cmF0aW9uIGlkcy4KLQkJZm9yIChJdGVyYXRvciBpdGMgPSBkYXRhLmFzc29jaWF0ZWRDb25maWdNYXAudmFsdWVzKCkuaXRlcmF0b3IoKTsgaXRjLmhhc05leHQoKTspIHsKLQkJCUxpc3QgY29uZmlncyA9IChMaXN0KSBpdGMubmV4dCgpOwotCQkJaWYgKGNvbmZpZ3MgPT0gbnVsbCB8fCBjb25maWdzLnNpemUoKSA9PSAwKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0KLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBjb25maWdzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IChNZXRob2RDb25maWd1cmF0aW9uKSBpdC5uZXh0KCk7Ci0JCQkJU3RyaW5nIGd1aWQgPSBjb25maWcuZ2V0R3VpZCgpOwotCQkJCVN0cmluZyB1cmkgPSBkb2N1bWVudC5nZXRSZXNvdXJjZVVyaShndWlkKTsKLQkJCQlGaWxlIHNyYyA9IG51bGw7Ci0JCQkJaWYgKHVyaSA9PSBudWxsKSB7Ci0JCQkJCS8vaWYgYSBwcm9jZXNzIHJlZmVycyB0byBhIGNvbmZpZyB0aGF0IGRvZXMgbm90IGV4aXN0Ci0JCQkJCS8vdGhlbiB0aGVyZSB3b3VsZCBiZSBubyByZXNvdXJjZSBmb3IgdGhlIGNvbmZpZwotCQkJCQlpZiAoY29uZmlnLmVSZXNvdXJjZSgpID09IG51bGwpIHsKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQl9Ci0JCQkJCVVSSSByZXNVcmkgPSBjb25maWcuZVJlc291cmNlKCkuZ2V0VVJJKCk7Ci0JCQkJCXVyaSA9IE11bHRpRmlsZVNhdmVVdGlsLk1FVEhPRF9DT05GSUdVUkFUSU9OX0ZPTERFUl9OQU1FICsgRmlsZS5zZXBhcmF0b3IgKyByZXNVcmkubGFzdFNlZ21lbnQoKTsKLQkJCQkJdXJpID0gZG9jdW1lbnQuZGVjb2RlVXJpKHVyaSk7Ci0JCQkJCXNyYyA9IG5ldyBGaWxlKHJlc1VyaS50b0ZpbGVTdHJpbmcoKSk7Ci0JCQkJfQkJCQkKLQkJCQlpZiAoIHVyaSAhPSBudWxsICkgewotCQkJCQkvL0ZpbGUgc3JjID0gbmV3IEZpbGUobGliRm9sZGVyLCB1cmkpOwotCQkJCQlpZiAoc3JjID09IG51bGwpIHsKLQkJCQkJCXNyYyA9IG5ldyBGaWxlKGxpYkZvbGRlciwgdXJpKTsKLQkJCQkJfQotCQkJCQlGaWxlIHRhcmdldCA9ICBuZXcgRmlsZShleHBvcnRMaWJGb2xkZXIsIHVyaSk7Ci0JCQkJCUZpbGVVdGlsLmNvcHlGaWxlKHNyYywgdGFyZ2V0KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDb3BpZXMgZGlyZWN0b3JpZXMgZnJvbSAiZnJvbURpciIgdG8gInRvRGlyIi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgY29weURpcihGaWxlIGZyb21EaXIsIEZpbGUgdG9EaXIpIHsKLQkJQ29weSBjcCA9IG5ldyBDb3B5KCk7Ci0JCWNwLnNldE92ZXJ3cml0ZSh0cnVlKTsKLQkJRmlsZVNldCBzZXQgPSBuZXcgRmlsZVNldCgpOwotCQlzZXQuc2V0RXhjbHVkZXMoQ29uZmlndXJhdGlvbkV4cG9ydFNlcnZpY2UuZXhjbHVkZXMpOwotCQlzZXQuc2V0RGlyKGZyb21EaXIpOwotCQljcC5hZGRGaWxlc2V0KHNldCk7Ci0JCWNwLnNldFRvZGlyKHRvRGlyKTsKLQkJY3Auc2V0UHJvamVjdChuZXcgUHJvamVjdCgpKTsKLQkJY3Auc2V0UHJlc2VydmVMYXN0TW9kaWZpZWQodHJ1ZSk7Ci0JCWNwLmV4ZWN1dGUoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZ2V0U2VsZWN0ZWRJZHMoQ29sbGVjdGlvbjxNZXRob2RQbHVnaW4+IHBsdWdpbnMsIE1hcCBjb25maWdzTWFwKSB7Ci0JCXNlbGVjdGVkSWRzLmNsZWFyKCk7Ci0JCXNlbGVjdGVkUGx1Z2luTmFtZXMuY2xlYXIoKTsKLQotCQkvLyBHZXQgdGhlIHBsdWctaW4gaWRzIGFuZCBuYW1lcy4KLQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IG51bGw7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSBwbHVnaW5zLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCXBsdWdpbiA9IChNZXRob2RQbHVnaW4pIGl0Lm5leHQoKTsKLQkJCVN0cmluZyBndWlkID0gcGx1Z2luLmdldEd1aWQoKTsKLQkJCXNlbGVjdGVkUGx1Z2luTmFtZXMuYWRkKHBsdWdpbi5nZXROYW1lKCkpOwotCQkJaWYgKCFzZWxlY3RlZElkcy5jb250YWlucyhndWlkKSkgewotCQkJCXNlbGVjdGVkSWRzLmFkZChndWlkKTsKLQkJCX0KLQkJfQotCi0JCS8vIFNhdmUgdGhlIGxpYnJhcnkgZ3VpZCBzbyB0aGF0IHRoZSBlbnRyeSBpbiByZXNnci54bWkgd2lsbCBiZSBrZXB0LgotCQlpZiAocGx1Z2luICE9IG51bGwpIHsKLQkJCU1ldGhvZExpYnJhcnkgbGliID0gKE1ldGhvZExpYnJhcnkpIHBsdWdpbi5lQ29udGFpbmVyKCk7Ci0JCQlpZiAobGliICE9IG51bGwpIHsKLQkJCQlzZWxlY3RlZElkcy5hZGQobGliLmdldEd1aWQoKSk7Ci0JCQl9Ci0JCX0KLQotCQkvLyBHZXQgdGhlIHNlbGVjdGVkIGNvbmZpZ3VyYXRpb24gaWRzLgotCQlmb3IgKEl0ZXJhdG9yIGl0YyA9IGNvbmZpZ3NNYXAudmFsdWVzKCkuaXRlcmF0b3IoKTsgaXRjLmhhc05leHQoKTspIHsKLQkJCUxpc3QgY29uZmlncyA9IChMaXN0KSBpdGMubmV4dCgpOwotCQkJaWYgKGNvbmZpZ3MgPT0gbnVsbCB8fCBjb25maWdzLnNpemUoKSA9PSAwKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0KLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBjb25maWdzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IChNZXRob2RDb25maWd1cmF0aW9uKSBpdC5uZXh0KCk7Ci0JCQkJU3RyaW5nIGd1aWQgPSBjb25maWcuZ2V0R3VpZCgpOwotCQkJCWlmIChzZWxlY3RlZElkcy5jb250YWlucyhndWlkKSkgewotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0KLQkJCQkvLyBBZGQgdGhlIGNvbmZpZ3VyYXRpb24uCi0JCQkJc2VsZWN0ZWRJZHMuYWRkKGd1aWQpOwotCi0JCQkJLy8gRm9yIGVhY2ggY29uZmlndXJhdGlvbiwgc2F2ZSB0aGUgbWV0aG9kIHBsdWctaW4gYW5kIHBhY2thZ2UKLQkJCQkvLyBpZHMgc28gdGhhdCB0aGVpciBlbnRyaWVzIGluIHRoZSByZXNvdXJjZSBmaWxlIGNhbiBiZSBrZXB0LgotCQkJCUxpc3QgcmVmcyA9IGNvbmZpZy5lQ3Jvc3NSZWZlcmVuY2VzKCk7Ci0JCQkJZm9yIChJdGVyYXRvciBpdHIgPSByZWZzLml0ZXJhdG9yKCk7IGl0ci5oYXNOZXh0KCk7KSB7Ci0JCQkJCU9iamVjdCBvID0gaXRyLm5leHQoKTsKLQkJCQkJaWYgKG8gaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4gfHwgbyBpbnN0YW5jZW9mIE1ldGhvZFBhY2thZ2UpIHsKLQkJCQkJCWd1aWQgPSAoKE1ldGhvZEVsZW1lbnQpIG8pLmdldEd1aWQoKTsKLQkJCQkJCWlmICghc2VsZWN0ZWRJZHMuY29udGFpbnMoZ3VpZCkpIHsKLQkJCQkJCQlzZWxlY3RlZElkcy5hZGQoZ3VpZCk7Ci0JCQkJCQl9Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlTeXN0ZW0ub3V0Ci0JCQkJCQkJCS5wcmludGxuKCJVbmV4cGVjdGVkIGVsZW1lbnQgdHlwZSAnIiArICgoTWV0aG9kRWxlbWVudCkgbykuZ2V0VHlwZSgpLmdldE5hbWUoKSAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQkJKyAiJyBpbiBjb25maWd1cmF0aW9uICciICsgY29uZmlnLmdldE5hbWUoKSArICInIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3NlcnZpY2VzL3BhY2thZ2UuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvc2VydmljZXMvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZDRhYWE1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvc2VydmljZXMvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgdGhlIGludGVyZmFjZXMgYW5kIGltcGxlbWVudGF0aW9uIGZvciB0aGUgbWV0aG9kIHBsdWctaW4gYW5kIGNvbmZpZ3VyYXRpb24gZXhwb3J0IHNlcnZpY2VzLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvd2l6YXJkcy9EZXN0aW5hdGlvbkNvbW1vblBhZ2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvd2l6YXJkcy9EZXN0aW5hdGlvbkNvbW1vblBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTkzOTU1Ni4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3dpemFyZHMvRGVzdGluYXRpb25Db21tb25QYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC53aXphcmRzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcmVmZXJlbmNlcy5MaWJyYXJ5TG9jYXRpb25EYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQuRXhwb3J0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51aS53aXphcmRzLkJhc2VXaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpcmVjdG9yeURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotCi0vKioKLSAqIEEgd2l6YXJkIHBhZ2UgdGhhdCBwcm9tcHRzIHRoZSB1c2VyIHRvIHNlbGVjdCBhIGRlc3RpbmF0aW9uIGRpcmVjdG9yeSBmb3IgYW4KLSAqIGV4cG9ydCBvciBpbXBvcnQgb3BlcmF0aW9uLgotICogCi0gKiBAYXV0aG9yIEJpbmd4dWUgWHUKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRGVzdGluYXRpb25Db21tb25QYWdlIGV4dGVuZHMgQmFzZVdpemFyZFBhZ2UgaW1wbGVtZW50cyBMaXN0ZW5lciB7Ci0KLQlwcm90ZWN0ZWQgQ29tcG9zaXRlIGNvbXBvc2l0ZTsKLQotCXByb3RlY3RlZCBDb21ibyBleHBvcnRQYXRoQ29tYm87Ci0KLQlwcm90ZWN0ZWQgQnV0dG9uIGJyb3dzZUJ1dHRvbjsKLQotCXByb3RlY3RlZCBMaWJyYXJ5TG9jYXRpb25EYXRhIGxsRGF0YTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIERlc3RpbmF0aW9uQ29tbW9uUGFnZShTdHJpbmcgcGFnZU5hbWUsIExpYnJhcnlMb2NhdGlvbkRhdGEgbGxEYXRhKSB7Ci0JCXN1cGVyKHBhZ2VOYW1lKTsKLQkJc2V0VGl0bGUoRXhwb3J0UmVzb3VyY2VzLkRlc3RpbmF0aW9uQ29tbW9uUGFnZV90aXRsZSk7Ci0JCXNldERlc2NyaXB0aW9uKEV4cG9ydFJlc291cmNlcy5EZXN0aW5hdGlvbkNvbW1vblBhZ2VfZGVzYyk7Ci0JCXRoaXMubGxEYXRhID0gbGxEYXRhOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nUGFnZSNjcmVhdGVDb250cm9sKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJY29tcG9zaXRlID0gY3JlYXRlR3JpZExheW91dENvbXBvc2l0ZShwYXJlbnQsIDMpOwotCi0JCWNyZWF0ZUxhYmVsKGNvbXBvc2l0ZSwgRXhwb3J0UmVzb3VyY2VzLkRlc3RpbmF0aW9uQ29tbW9uUGFnZV9sYWJlbF9kaXIpOwotCQkKLQkJZXhwb3J0UGF0aENvbWJvID0gY3JlYXRlQ29tYm9ib3goY29tcG9zaXRlLCAxKTsKLQkJCi0JCWJyb3dzZUJ1dHRvbiA9IGNyZWF0ZUJ1dHRvbihjb21wb3NpdGUsCi0JCQkJRXhwb3J0UmVzb3VyY2VzLkRlc3RpbmF0aW9uQ29tbW9uUGFnZV9sYWJlbF9icm93c2UpOwotCi0JCWNyZWF0ZUxhYmVsKGNvbXBvc2l0ZSwgIiIpOyAvLyROT04tTkxTLTEkCQkKLQotCQlpbml0Q29udHJvbHMoKTsKLQkJCi0JCWFkZExpc3RlbmVycygpOwotCi0JCXNldENvbnRyb2woY29tcG9zaXRlKTsKLQotCQljcmVhdGVBZGRpdGlvbmFsQ29udHJvbHMoY29tcG9zaXRlKTsKLQotCQlzZXRQYWdlQ29tcGxldGUoZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemVzIHRoZSB3aXphcmQgcGFnZSBjb250cm9scyB3aXRoIGRhdGEuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdENvbnRyb2xzKCkgewotCQlleHBvcnRQYXRoQ29tYm8uc2V0RW5hYmxlZCh0cnVlKTsKLQkJYnJvd3NlQnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JfQotCQotCS8qKgotCSAqIEFkZHMgZXZlbnQgaGFuZGxlcnMgdG8gdGhlIHdpemFyZCBwYWdlIGNvbnRyb2xzLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZExpc3RlbmVycygpIHsJCi0JCWV4cG9ydFBhdGhDb21iby5hZGRMaXN0ZW5lcihTV1QuRm9jdXNJbiwgdGhpcyk7Ci0JCWV4cG9ydFBhdGhDb21iby5hZGRMaXN0ZW5lcihTV1QuTW9kaWZ5LCB0aGlzKTsKLQkJZXhwb3J0UGF0aENvbWJvLmFkZExpc3RlbmVyKFNXVC5Gb2N1c091dCwgdGhpcyk7Ci0JCWV4cG9ydFBhdGhDb21iby5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCB0aGlzKTsKLQkJCi0JCWJyb3dzZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlvcGVuRGlyZWN0b3J5RGlhbG9nKCk7Ci0JCQl9Ci0JCX0pOwkJCi0JfQotCQotCS8qKgotCSAqIEFkZHMgYWRkaXRpb25hbCBjb250cm9scyB0byB0aGlzIHdpemFyZCBwYWdlLgotCSAqIAotCSAqIEBwYXJhbSBjb21wb3NpdGUgdGhlIHBhcmVudCBjb21wb3NpdGUKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBZGRpdGlvbmFsQ29udHJvbHMoQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2dQYWdlI3NldFZpc2libGUoYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWaXNpYmxlKGJvb2xlYW4gdmlzaWJsZSkgewotCQlzdXBlci5zZXRWaXNpYmxlKHZpc2libGUpOwotCQlpZiAodmlzaWJsZSkgewotCQkJRGlzcGxheSBkaXNwbGF5ID0gY29tcG9zaXRlLmdldERpc3BsYXkoKTsKLQkJCWlmICghKGRpc3BsYXkgPT0gbnVsbCB8fCBkaXNwbGF5LmlzRGlzcG9zZWQoKSkpIHsKLQkJCQlkaXNwbGF5LmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCWV4cG9ydFBhdGhDb21iby5zZXRGb2N1cygpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyI2hhbmRsZUV2ZW50KG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCVdpemFyZCB3aXphcmQgPSAoV2l6YXJkKSBnZXRXaXphcmQoKTsKLQkJc2V0UGFnZUNvbXBsZXRlKGlzUGFnZUNvbXBsZXRlKCkpOwotCQl3aXphcmQuZ2V0Q29udGFpbmVyKCkudXBkYXRlQnV0dG9ucygpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNhdmVUb0RhdGFNb2RlbCgpIHsKLQkJU3RyaW5nIGxpYk5hbWUgPSBleHBvcnRQYXRoQ29tYm8uZ2V0VGV4dCgpOwotCQlpZiAobGliTmFtZS5sZW5ndGgoKSA+IDApIHsKLQkJCWlmICghbGliTmFtZS5lbmRzV2l0aChGaWxlLnNlcGFyYXRvcikpIHsKLQkJCQlsaWJOYW1lID0gbGliTmFtZS5zdWJzdHJpbmcoCi0JCQkJCQlsaWJOYW1lLmxhc3RJbmRleE9mKEZpbGUuc2VwYXJhdG9yKSArIDEsIGxpYk5hbWUKLQkJCQkJCQkJLmxlbmd0aCgpKTsKLQkJCX0gZWxzZQotCQkJCWxpYk5hbWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWxsRGF0YS5zZXRMaWJOYW1lKGxpYk5hbWUpOwotCQlsbERhdGEuc2V0UGFyZW50Rm9sZGVyKGV4cG9ydFBhdGhDb21iby5nZXRUZXh0KCkpOwotCX0KLQotCXByaXZhdGUgdm9pZCBvcGVuRGlyZWN0b3J5RGlhbG9nKCkgewotCQl0cnkgewotCQkJRGlyZWN0b3J5RGlhbG9nIGRkID0gbmV3IERpcmVjdG9yeURpYWxvZyhjb21wb3NpdGUuZ2V0U2hlbGwoKSwKLQkJCQkJU1dULk5PTkUpOwotCQkJZGQuc2V0RmlsdGVyUGF0aChleHBvcnRQYXRoQ29tYm8uZ2V0VGV4dCgpKTsKLQotCQkJU3RyaW5nIGRlc3RpbmF0aW9uID0gZGQub3BlbigpOwotCQkJaWYgKGRlc3RpbmF0aW9uICE9IG51bGwpIHsKLQkJCQlleHBvcnRQYXRoQ29tYm8uc2V0VGV4dChkZXN0aW5hdGlvbik7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJZXgucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiB1c2UgdGhlIG9wZW5lZCBkaXJzIHRvIGluaXQgY29tYm8gbGlzdAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRDb21ib0l0ZW1zKCkgewotCQlyZXR1cm47Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3dpemFyZHMvRXhwb3J0Q29uZmlnQ2hlY2tpbmdQYWdlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3dpemFyZHMvRXhwb3J0Q29uZmlnQ2hlY2tpbmdQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlMjNlMjYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC93aXphcmRzL0V4cG9ydENvbmZpZ0NoZWNraW5nUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5leHBvcnQud2l6YXJkczsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LkV4cG9ydFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LkV4cG9ydFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnNlcnZpY2VzLkNvbmZpZ3VyYXRpb25FeHBvcnREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LklDb25maWd1cmF0aW9uQ2xvc3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLmNsb3N1cmUuQ29uZmlndXJhdGlvbkNsb3N1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5jbG9zdXJlLkVsZW1lbnRFcnJvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnVpLlVzZXJJbnRlcmFjdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudWkud2l6YXJkcy5CYXNlV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlRleHRQcmVzZW50YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5UZXh0Vmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBBIHdpemFyZCBwYWdlIHRoYXQgZGlzcGxheXMgdGhlIHJlc3VsdCBvZiBhIGNvbmZpZ3VyYXRpb24gaW50ZWdyaXR5IGNoZWNrLgotICogCi0gKiBAYXV0aG9yIEJpbmd4dWUgWHUKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRXhwb3J0Q29uZmlnQ2hlY2tpbmdQYWdlIGV4dGVuZHMgQmFzZVdpemFyZFBhZ2UgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFHRV9OQU1FID0gRXhwb3J0Q29uZmlnQ2hlY2tpbmdQYWdlLmNsYXNzCi0JCQkuZ2V0TmFtZSgpOwotCi0JcHJpdmF0ZSBUZXh0Vmlld2VyIHRleHRWaWV3ZXI7Ci0KLQlwcml2YXRlIFRleHRQcmVzZW50YXRpb24gc3R5bGU7Ci0KLQlwcml2YXRlIENvbmZpZ3VyYXRpb25FeHBvcnREYXRhIGRhdGE7Ci0KLQlwcml2YXRlIElDb25maWd1cmF0aW9uQ2xvc3VyZSBjbG9zdXJlID0gbnVsbDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIEV4cG9ydENvbmZpZ0NoZWNraW5nUGFnZShDb25maWd1cmF0aW9uRXhwb3J0RGF0YSBkYXRhKSB7Ci0JCXN1cGVyKFBBR0VfTkFNRSk7Ci0JCXNldFRpdGxlKEV4cG9ydFJlc291cmNlcy5jaGVja0NvbmZpZ1BhZ2VfdGl0bGUpOwotCQlzZXREZXNjcmlwdGlvbihFeHBvcnRSZXNvdXJjZXMuY2hlY2tDb25maWdQYWdlX2Rlc2MpOwotCQlzZXRJbWFnZURlc2NyaXB0b3IoRXhwb3J0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoCi0JCQkJImZ1bGwvd2l6YmFuL2V4cF9saWJfY29uZl93aXpiYW4uZ2lmIikpOyAvLyROT04tTkxTLTEkCi0JCXRoaXMuZGF0YSA9IGRhdGE7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dQYWdlI2NyZWF0ZUNvbnRyb2woQ29tcG9zaXRlKQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgY29udGFpbmVyID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJY29udGFpbmVyLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQotCQl0ZXh0Vmlld2VyID0gY3JlYXRlVGV4dFZpZXdlcihjb250YWluZXIsIDM2MCwgMTYwLCAxKTsKLQkJRG9jdW1lbnQgZG9jID0gbmV3IERvY3VtZW50KCIgIik7IC8vJE5PTi1OTFMtMSQKLQkJdGV4dFZpZXdlci5zZXREb2N1bWVudChkb2MpOwotCi0JCXNldENvbnRyb2woY29udGFpbmVyKTsKLQkJc2V0UGFnZUNvbXBsZXRlKHRydWUpOwotCX0KLQotCXByaXZhdGUgdm9pZCBkaXNwbGF5U3VtbWFyeSgpIHsKLQkJc3R5bGUgPSBuZXcgVGV4dFByZXNlbnRhdGlvbigpOwotCQlEb2N1bWVudCBkb2MgPSBnZXRTdW1tYXJ5VGV4dCgpOwotCQl0ZXh0Vmlld2VyLnNldERvY3VtZW50KGRvYyk7Ci0JCXRleHRWaWV3ZXIuY2hhbmdlVGV4dFByZXNlbnRhdGlvbihzdHlsZSwgdHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudWkud2l6YXJkcy5CYXNlV2l6YXJkUGFnZSNvbkVudGVyUGFnZShPYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgb25FbnRlclBhZ2UoT2JqZWN0IG9iaikgewotCQlkaXNwbGF5U3VtbWFyeSgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSBkb2N1bWVudCBvZiBzdW1tYXJ5IHRleHQuCi0JICovCi0JcHVibGljIERvY3VtZW50IGdldFN1bW1hcnlUZXh0KCkgewotCQlmaW5hbCBTdHJpbmdCdWZmZXIgdGV4dEJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQotCQlpZiAoZGF0YS5zZWxlY3RlZENvbmZpZ3Muc2l6ZSgpID09IDApIHsKLQkJCXRleHRCdWYuYXBwZW5kKEV4cG9ydFJlc291cmNlcy5FeHBvcnRDb25maWdDaGVja2luZ1BhZ2Vfc3VtbWFyeV8yKTsKLQkJfSBlbHNlIHsKLQkJCWZpbmFsIE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gKE1ldGhvZENvbmZpZ3VyYXRpb24pIGRhdGEuc2VsZWN0ZWRDb25maWdzCi0JCQkJCS5nZXQoMCk7Ci0JCQlpZiAoKGNsb3N1cmUgPT0gbnVsbCkgfHwgKGNsb3N1cmUuZ2V0Q29uZmlndXJhdGlvbigpICE9IGNvbmZpZykpIHsKLQkJCQlSdW5uYWJsZSBydW5uYWJsZSA9IG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJLy8gQ2hlY2sgdGhlIGNvbmZpZ3VyYXRpb24gY2xvc3VyZS4KLQkJCQkJCWNsb3N1cmUgPSBuZXcgQ29uZmlndXJhdGlvbkNsb3N1cmUobnVsbCwgY29uZmlnKTsKLQkJCQkJfQotCQkJCX07Ci0KLQkJCQlVc2VySW50ZXJhY3Rpb25IZWxwZXIucnVuV2l0aFByb2dyZXNzKHJ1bm5hYmxlLAotCQkJCQkJRXhwb3J0UmVzb3VyY2VzLkV4cG9ydENvbmZpZ0NoZWNraW5nUGFnZV9jaGVja2luZyk7Ci0JCQl9Ci0JCX0KLQotCQlMaXN0PEVsZW1lbnRFcnJvcj4gZXJyb3JzID0gY2xvc3VyZS5nZXRBbGxFcnJvcnMoKTsKLQkJaWYgKGVycm9ycy5zaXplKCkgPT0gMCkgewotCQkJdGV4dEJ1Zi5hcHBlbmQoRXhwb3J0UmVzb3VyY2VzLkV4cG9ydENvbmZpZ0NoZWNraW5nUGFnZV9zdW1tYXJ5XzMpOwotCQl9IGVsc2UgewotCQkJaW50IGVTeiA9IDA7Ci0JCQlpbnQgd1N6ID0gMDsKLQkJCWludCBpU3ogPSAwOwotCQkJZm9yIChFbGVtZW50RXJyb3IgZXJyb3I6IGVycm9ycykgewotCQkJCWlmIChlcnJvci5nZXRTZXZlcml0eSgpID09IElNYXJrZXIuU0VWRVJJVFlfRVJST1IpIHsKLQkJCQkJZVN6Kys7Ci0JCQkJfSBlbHNlIGlmIChlcnJvci5nZXRTZXZlcml0eSgpID09IElNYXJrZXIuU0VWRVJJVFlfV0FSTklORykgewotCQkJCQl3U3orKzsKLQkJCQl9IGVsc2UgewotCQkJCQlpU3orKzsKLQkJCQl9Ci0JCQl9Ci0JCQl0ZXh0QnVmLmFwcGVuZChFeHBvcnRSZXNvdXJjZXMuYmluZCgKLQkJCQkJRXhwb3J0UmVzb3VyY2VzLkV4cG9ydENvbmZpZ0NoZWNraW5nUGFnZV9zdW1tYXJ5XzQsCi0JCQkJCShuZXcgT2JqZWN0W10geyAKLQkJCQkJCQlJbnRlZ2VyLnRvU3RyaW5nKGVycm9ycy5zaXplKCkpLAotCQkJCQkJCUludGVnZXIudG9TdHJpbmcoZVN6KSwgCi0JCQkJCQkJSW50ZWdlci50b1N0cmluZyh3U3opLCAKLQkJCQkJCQlJbnRlZ2VyLnRvU3RyaW5nKGlTeiksIAotCQkJCQkJCX0pKSk7Ci0JCX0KLQotCQlEb2N1bWVudCBkb2MgPSBuZXcgRG9jdW1lbnQodGV4dEJ1Zi50b1N0cmluZygpKTsKLQkJcmV0dXJuIGRvYzsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvd2l6YXJkcy9FeHBvcnRDb25maWdDaG9vc2VNb2RlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3dpemFyZHMvRXhwb3J0Q29uZmlnQ2hvb3NlTW9kZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MjY4ZDk1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvd2l6YXJkcy9FeHBvcnRDb25maWdDaG9vc2VNb2RlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC53aXphcmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5FeHBvcnRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5FeHBvcnRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5zZXJ2aWNlcy5Db25maWd1cmF0aW9uRXhwb3J0RGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5MaWJyYXJ5VUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVpLndpemFyZHMuQmFzZVdpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci0KLS8qKgotICogQSB3aXphcmQgcGFnZSB0aGF0IGRpc3BsYXlzIHRoZSB0eXBlcyBvZiBjb25maWd1cmF0aW9uIHRoYXQgY2FuIGJlIGV4cG9ydGVkLgotICogCi0gKiBAYXV0aG9yIEJpbmd4dWUgWHUKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRXhwb3J0Q29uZmlnQ2hvb3NlTW9kZSBleHRlbmRzIEJhc2VXaXphcmRQYWdlIGltcGxlbWVudHMgTGlzdGVuZXIgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFHRV9OQU1FID0gRXhwb3J0Q29uZmlnQ2hvb3NlTW9kZS5jbGFzcwotCQkJLmdldE5hbWUoKTsKLQotCXByaXZhdGUgQnV0dG9uIG9uZUNvbmZpZ0J1dHRvbjsKLQotCXByaXZhdGUgQnV0dG9uIGNvbmZpZ1NwZWNCdXR0b247Ci0KLQlwcml2YXRlIENvbmZpZ3VyYXRpb25FeHBvcnREYXRhIGRhdGE7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBFeHBvcnRDb25maWdDaG9vc2VNb2RlKENvbmZpZ3VyYXRpb25FeHBvcnREYXRhIGRhdGEpIHsKLQkJc3VwZXIoUEFHRV9OQU1FKTsKLQkJc2V0VGl0bGUoRXhwb3J0UmVzb3VyY2VzLnNlbGVjdEV4cG9ydFR5cGVQYWdlX3RpdGxlKTsKLQkJc2V0RGVzY3JpcHRpb24oRXhwb3J0UmVzb3VyY2VzLnNlbGVjdEV4cG9ydFR5cGVQYWdlX2Rlc2MpOwotCQlzZXRJbWFnZURlc2NyaXB0b3IoRXhwb3J0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoCi0JCQkJImZ1bGwvd2l6YmFuL2V4cF9saWJfY29uZl93aXpiYW4uZ2lmIikpOyAvLyROT04tTkxTLTEkCi0JCXRoaXMuZGF0YSA9IGRhdGE7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dQYWdlI2NyZWF0ZUNvbnRyb2woQ29tcG9zaXRlKQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgY29udGFpbmVyID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJY29udGFpbmVyLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQotCQlvbmVDb25maWdCdXR0b24gPSBjcmVhdGVSYWRpb0J1dHRvbihjb250YWluZXIsCi0JCQkJRXhwb3J0UmVzb3VyY2VzLnNlbGVjdEV4cG9ydFR5cGVQYWdlX2NvbmZpZ0xhYmVsX3RleHQsIDEsIHRydWUpOwotCi0JCWNvbmZpZ1NwZWNCdXR0b24gPSBjcmVhdGVSYWRpb0J1dHRvbihjb250YWluZXIsCi0JCQkJRXhwb3J0UmVzb3VyY2VzLnNlbGVjdEV4cG9ydFR5cGVQYWdlX2NvbmZpZ1NwZWNzTGFiZWxfdGV4dCwgMSwKLQkJCQlmYWxzZSk7Ci0KLQkJYWRkTGlzdGVuZXJzKCk7Ci0KLQkJc2V0Q29udHJvbChjb250YWluZXIpOwotCQlzZXRQYWdlQ29tcGxldGUodHJ1ZSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZExpc3RlbmVycygpIHsKLQkJb25lQ29uZmlnQnV0dG9uLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIHRoaXMpOwotCQljb25maWdTcGVjQnV0dG9uLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIHRoaXMpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXIjaGFuZGxlRXZlbnQob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJc2V0UGFnZUNvbXBsZXRlKGlzUGFnZUNvbXBsZXRlKCkpOwotCQlnZXRXaXphcmQoKS5nZXRDb250YWluZXIoKS51cGRhdGVCdXR0b25zKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNhdmVEYXRhVG9Nb2RlbCgpIHsKLQkJZGF0YS5leHBvcnRPbmVDb25maWcgPSBvbmVDb25maWdCdXR0b24uZ2V0U2VsZWN0aW9uKCk7Ci0JCWRhdGEuZXhwb3J0Q29uZmlnU3BlY3MgPSBjb25maWdTcGVjQnV0dG9uLmdldFNlbGVjdGlvbigpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2UjaXNQYWdlQ29tcGxldGUoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUGFnZUNvbXBsZXRlKCkgewotCQlpZiAoTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpID09IG51bGwpIHsKLQkJCXNldEVycm9yTWVzc2FnZShMaWJyYXJ5VUlSZXNvdXJjZXMubm9PcGVuTGlicmFyeVdhcm5pbmdfbXNnKTsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCXJldHVybiBnZXRFcnJvck1lc3NhZ2UoKSA9PSBudWxsOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2UjZ2V0TmV4dFBhZ2UoKQotCSAqLwotCXB1YmxpYyBJV2l6YXJkUGFnZSBnZXROZXh0UGFnZSgpIHsKLQkJc2F2ZURhdGFUb01vZGVsKCk7Ci0JCWlmIChkYXRhLmV4cG9ydE9uZUNvbmZpZykgewotCQkJRXhwb3J0Q29uZmlnU2VsZWN0Q29uZmlnUGFnZSBwYWdlID0gKChFeHBvcnRDb25maWd1cmF0aW9uV2l6YXJkKSBnZXRXaXphcmQoKSkuc2VsZWN0Q29uZmlnUGFnZTsKLQkJCXJldHVybiBwYWdlOwotCQl9IGVsc2UgaWYgKGRhdGEuZXhwb3J0Q29uZmlnU3BlY3MpIHsKLQkJCUV4cG9ydENvbmZpZ1NlbGVjdFNwZWNzUGFnZSBwYWdlID0gKChFeHBvcnRDb25maWd1cmF0aW9uV2l6YXJkKSBnZXRXaXphcmQoKSkuc2VsZWN0U3BlY3NQYWdlOwotCQkJcmV0dXJuIHBhZ2U7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3dpemFyZHMvRXhwb3J0Q29uZmlnRGVzdGluYXRpb25QYWdlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3dpemFyZHMvRXhwb3J0Q29uZmlnRGVzdGluYXRpb25QYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmZGNjNDcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC93aXphcmRzL0V4cG9ydENvbmZpZ0Rlc3RpbmF0aW9uUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC53aXphcmRzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5FeHBvcnRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5FeHBvcnRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5zZXJ2aWNlcy5Db25maWd1cmF0aW9uRXhwb3J0RGF0YTsKLQotLyoqCi0gKiBBIHdpemFyZCBwYWdlIHRoYXQgcHJvbXB0cyB0aGUgdXNlciBmb3IgdGhlIGRlc3RpbmF0aW9uIGRpcmVjdG9yeSBvZiBhbgotICogZXhwb3J0IG9wZXJhdGlvbi4KLSAqIAotICogQGF1dGhvciBCaW5neHVlIFh1Ci0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEV4cG9ydENvbmZpZ0Rlc3RpbmF0aW9uUGFnZSBleHRlbmRzIERlc3RpbmF0aW9uQ29tbW9uUGFnZSB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQUdFX05BTUUgPSBFeHBvcnRDb25maWdEZXN0aW5hdGlvblBhZ2UuY2xhc3MKLQkJCS5nZXROYW1lKCk7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBFeHBvcnRDb25maWdEZXN0aW5hdGlvblBhZ2UoQ29uZmlndXJhdGlvbkV4cG9ydERhdGEgZGF0YSkgewotCQlzdXBlcihQQUdFX05BTUUsIGRhdGEubGxEYXRhKTsKLQkJc2V0VGl0bGUoRXhwb3J0UmVzb3VyY2VzLnNlbGVjdERlc3RpbmF0aW9uUGFnZV90aXRsZSk7Ci0JCXNldERlc2NyaXB0aW9uKEV4cG9ydFJlc291cmNlcy5zZWxlY3REZXN0aW5hdGlvblBhZ2VfZGVzYyk7Ci0JCXNldEltYWdlRGVzY3JpcHRvcihFeHBvcnRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcigKLQkJCQkiZnVsbC93aXpiYW4vZXhwX2xpYl9jb25mX3dpemJhbi5naWYiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplcyB0aGUgd2l6YXJkIHBhZ2UgY29udHJvbHMgd2l0aCBkYXRhLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRDb250cm9scygpIHsKLQkJU3RyaW5nW10gZXhwb3J0RGlycyA9IEV4cG9ydFVJUHJlZmVyZW5jZXMuZ2V0RXhwb3J0Q29uZmlnRGlycygpOwotCQlpZiAoZXhwb3J0RGlycyAhPSBudWxsICYmIGV4cG9ydERpcnMubGVuZ3RoID4gMCkgewotCQkJZXhwb3J0UGF0aENvbWJvLnNldEl0ZW1zKGV4cG9ydERpcnMpOwotCQkJZXhwb3J0UGF0aENvbWJvLnNldFRleHQoZXhwb3J0RGlyc1swXSk7Ci0JCX0KLQkJc3VwZXIuaW5pdENvbnRyb2xzKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkUGFnZSNpc1BhZ2VDb21wbGV0ZSgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNQYWdlQ29tcGxldGUoKSB7Ci0JCUV4cG9ydENvbmZpZ3VyYXRpb25XaXphcmQgd2l6YXJkID0gKEV4cG9ydENvbmZpZ3VyYXRpb25XaXphcmQpIGdldFdpemFyZCgpOwotCQlpZiAoZXhwb3J0UGF0aENvbWJvLmdldFRleHQoKS5sZW5ndGgoKSA+IDAKLQkJCQkmJiAhZXhwb3J0UGF0aENvbWJvLmdldFRleHQoKS5lbmRzV2l0aChGaWxlLnNlcGFyYXRvcikpIHsKLQkJCXNhdmVUb0RhdGFNb2RlbCgpOwotCQkJd2l6YXJkLm9rVG9Db21wbGV0ZSA9IHRydWU7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQl3aXphcmQub2tUb0NvbXBsZXRlID0gZmFsc2U7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvd2l6YXJkcy9FeHBvcnRDb25maWdTZWxlY3RDb25maWdQYWdlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3dpemFyZHMvRXhwb3J0Q29uZmlnU2VsZWN0Q29uZmlnUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1N2UwY2ViLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvd2l6YXJkcy9FeHBvcnRDb25maWdTZWxlY3RDb25maWdQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC53aXphcmRzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LkV4cG9ydFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LkV4cG9ydFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnNlcnZpY2VzLkNvbmZpZ3VyYXRpb25FeHBvcnREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuUHJlc2VudGF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5MaWJyYXJ5VUlJbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVpLndpemFyZHMuQmFzZVdpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQXJyYXlDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLQotLyoqCi0gKiBBIHdpemFyZCBwYWdlIHRoYXQgcHJvbXB0cyB0aGUgdXNlciB0byBzZWxlY3QgYSBtZXRob2QgY29uZmlndXJhdGlvbiB0bwotICogZXhwb3J0LgotICogCi0gKiBAYXV0aG9yIEJpbmd4dWUgWHUKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRXhwb3J0Q29uZmlnU2VsZWN0Q29uZmlnUGFnZSBleHRlbmRzIEJhc2VXaXphcmRQYWdlIGltcGxlbWVudHMKLQkJSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciwgTGlzdGVuZXIgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFHRV9OQU1FID0gRXhwb3J0Q29uZmlnU2VsZWN0Q29uZmlnUGFnZS5jbGFzcwotCQkJLmdldE5hbWUoKTsKLQotCXByaXZhdGUgVGFibGUgdGFibGU7Ci0KLQlwcml2YXRlIFRhYmxlVmlld2VyIGN0cmxfdGFibGVWaWV3ZXI7Ci0KLQlwcml2YXRlIFRleHQgY3RybF9icmllZkRlc2M7Ci0KLQlwcml2YXRlIENvbmZpZ3VyYXRpb25FeHBvcnREYXRhIGRhdGE7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBFeHBvcnRDb25maWdTZWxlY3RDb25maWdQYWdlKENvbmZpZ3VyYXRpb25FeHBvcnREYXRhIGRhdGEpIHsKLQkJc3VwZXIoUEFHRV9OQU1FKTsKLQkJc2V0VGl0bGUoRXhwb3J0UmVzb3VyY2VzLnNlbGVjdENvbmZpZ1BhZ2VfdGl0bGUpOwotCQlzZXREZXNjcmlwdGlvbihFeHBvcnRSZXNvdXJjZXMuc2VsZWN0Q29uZmlnUGFnZV9kZXNjKTsKLQkJc2V0SW1hZ2VEZXNjcmlwdG9yKEV4cG9ydFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKAotCQkJCSJmdWxsL3dpemJhbi9leHBfbGliX2NvbmZfd2l6YmFuLmdpZiIpKTsgLy8kTk9OLU5MUy0xJAotCQl0aGlzLmRhdGEgPSBkYXRhOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nUGFnZSNjcmVhdGVDb250cm9sKENvbXBvc2l0ZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGNvbnRhaW5lciA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCWNvbnRhaW5lci5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0KLQkJY3JlYXRlTGFiZWwoY29udGFpbmVyLAotCQkJCUV4cG9ydFJlc291cmNlcy5zZWxlY3RDb25maWdQYWdlX2NvbmZpZ3NMYWJlbF90ZXh0KTsKLQotCQljdHJsX3RhYmxlVmlld2VyID0gY3JlYXRlVGFibGVWaWV3ZXIoY29udGFpbmVyLCAzNjAsIDEyMCwgMSk7Ci0JCXRhYmxlID0gY3RybF90YWJsZVZpZXdlci5nZXRUYWJsZSgpOwotCi0vKgkJTWV0aG9kQ29uZmlndXJhdGlvbltdIGNvbmZpZ3MgPSBMaWJyYXJ5U2VydmljZVV0aWwKLQkJCQkuZ2V0TWV0aG9kQ29uZmlndXJhdGlvbnMoTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKQotCQkJCQkJLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCkpOyovCi0JCQotCQlMaXN0PE1ldGhvZENvbmZpZ3VyYXRpb24+IGNvbmZpZ0xpc3QgPSBuZXcgQXJyYXlMaXN0PE1ldGhvZENvbmZpZ3VyYXRpb24+KAotCQkJCUxpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKQotCQkJCQkJLmdldFByZWRlZmluZWRDb25maWd1cmF0aW9ucygpKTsKLQkJaWYgKGNvbmZpZ0xpc3Quc2l6ZSgpID4gMSkgewotCQkJQ29tcGFyYXRvciBjb21wYXJhdG9yID0gUHJlc2VudGF0aW9uQ29udGV4dC5JTlNUQU5DRQotCQkJCQkuZ2V0Q29tcGFyYXRvcigpOwotCQkJQ29sbGVjdGlvbnMuPE1ldGhvZENvbmZpZ3VyYXRpb24+IHNvcnQoY29uZmlnTGlzdCwgY29tcGFyYXRvcik7Ci0JCX0KLQkJCi0JCU1ldGhvZENvbmZpZ3VyYXRpb25bXSBhID0gbmV3IE1ldGhvZENvbmZpZ3VyYXRpb25bY29uZmlnTGlzdC5zaXplKCldOwotCQlNZXRob2RDb25maWd1cmF0aW9uW10gY29uZmlncyA9IGNvbmZpZ0xpc3QudG9BcnJheShhKTsKLQotCQlJTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyID0gbmV3IExhYmVsUHJvdmlkZXIoKSB7Ci0JCQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCQlyZXR1cm4gTGlicmFyeVVJSW1hZ2VzLklNR19NRVRIT0RfUExVR0lOOwotCQkJfQotCi0JCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZENvbmZpZ3VyYXRpb24pIHsKLQkJCQkJcmV0dXJuICgoTWV0aG9kQ29uZmlndXJhdGlvbikgZWxlbWVudCkuZ2V0TmFtZSgpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXJldHVybiBlbGVtZW50LnRvU3RyaW5nKCk7Ci0JCQkJfQotCQkJfQotCQl9OwotCQljdHJsX3RhYmxlVmlld2VyLnNldExhYmVsUHJvdmlkZXIobGFiZWxQcm92aWRlcik7Ci0JCWN0cmxfdGFibGVWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBBcnJheUNvbnRlbnRQcm92aWRlcigpKTsKLQkJaWYgKGNvbmZpZ3MgIT0gbnVsbCkgewotCQkJY3RybF90YWJsZVZpZXdlci5zZXRJbnB1dChjb25maWdzKTsKLQkJfQotCi0JCWNyZWF0ZUxhYmVsKGNvbnRhaW5lciwgQXV0aG9yaW5nVUlUZXh0LkJSSUVGX0RFU0NSSVBUSU9OX1RFWFQpOwotCi0JCWN0cmxfYnJpZWZEZXNjID0gY3JlYXRlTXVsdGlMaW5lVGV4dChjb250YWluZXIsICIiLCAzNjAsIDgwLCAzKTsgLy8kTk9OLU5MUy0xJAotCi0JCWlmIChjb25maWdzICE9IG51bGwgJiYgY29uZmlncy5sZW5ndGggPiAwKSB7Ci0JCQl0YWJsZS5zZWxlY3QoMCk7Ci0JCQlzZXREaXNwbGF5QXR0cmlidXRlcygoTWV0aG9kQ29uZmlndXJhdGlvbikgY29uZmlnc1swXSk7Ci0JCX0KLQotCQlhZGRMaXN0ZW5lcnMoKTsKLQotCQlzZXRDb250cm9sKGNvbnRhaW5lcik7Ci0JCXNldFBhZ2VDb21wbGV0ZSh0cnVlKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkTGlzdGVuZXJzKCkgewotCQljdHJsX3RhYmxlVmlld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcih0aGlzKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciNzZWxlY3Rpb25DaGFuZ2VkKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKFN0cnVjdHVyZWRTZWxlY3Rpb24pIGV2ZW50Ci0JCQkJLmdldFNlbGVjdGlvbigpOwotCQlpZiAoIXNlbGVjdGlvbi5pc0VtcHR5KCkpIHsKLQkJCU9iamVjdFtdIGNvbmZpZ3MgPSBzZWxlY3Rpb24udG9BcnJheSgpOwotCQkJc2V0RGlzcGxheUF0dHJpYnV0ZXMoKE1ldGhvZENvbmZpZ3VyYXRpb24pIGNvbmZpZ3NbMF0pOwotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyI2hhbmRsZUV2ZW50KG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCXNldFBhZ2VDb21wbGV0ZShpc1BhZ2VDb21wbGV0ZSgpKTsKLQkJZ2V0V2l6YXJkKCkuZ2V0Q29udGFpbmVyKCkudXBkYXRlQnV0dG9ucygpOwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXREaXNwbGF5QXR0cmlidXRlcyhNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZykgewotCQljdHJsX2JyaWVmRGVzYy5zZXRUZXh0KGNvbmZpZy5nZXRCcmllZkRlc2NyaXB0aW9uKCkpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNhdmVEYXRhVG9Nb2RlbCgpIHsKLQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBjdHJsX3RhYmxlVmlld2VyCi0JCQkJLmdldFNlbGVjdGlvbigpOwotCQlPYmplY3RbXSBjb25maWdzID0gc2VsZWN0aW9uLnRvQXJyYXkoKTsKLQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSAoTWV0aG9kQ29uZmlndXJhdGlvbikgY29uZmlnc1swXTsKLQkJTGlzdCBhcnJMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlhcnJMaXN0LmFkZChjb25maWcpOwotCQlkYXRhLnNlbGVjdGVkQ29uZmlncyA9IGFyckxpc3Q7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkUGFnZSNnZXROZXh0UGFnZSgpCi0JICovCi0JcHVibGljIElXaXphcmRQYWdlIGdldE5leHRQYWdlKCkgewotCQlzYXZlRGF0YVRvTW9kZWwoKTsKLQkJRXhwb3J0Q29uZmlnQ2hlY2tpbmdQYWdlIHBhZ2UgPSAoKEV4cG9ydENvbmZpZ3VyYXRpb25XaXphcmQpIGdldFdpemFyZCgpKS5jb25maWdDaGVja2luZ1BhZ2U7Ci0JCXBhZ2Uub25FbnRlclBhZ2UobnVsbCk7Ci0JCXJldHVybiBwYWdlOwotCX0KLQkKLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkUGFnZSNpc1BhZ2VDb21wbGV0ZSgpCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNQYWdlQ29tcGxldGUoKSB7Ci0JCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgY3RybF90YWJsZVZpZXdlcgotCQkJCQkJCQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0gICAgCWlmIChzZWxlY3Rpb24gPT0gbnVsbCB8fCBzZWxlY3Rpb24uaXNFbXB0eSgpKSB7Ci0gICAgCQlyZXR1cm4gZmFsc2U7Ci0gICAgCX0KLSAgICAgICAgcmV0dXJuIHN1cGVyLmlzUGFnZUNvbXBsZXRlKCk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3dpemFyZHMvRXhwb3J0Q29uZmlnU2VsZWN0U3BlY3NQYWdlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3dpemFyZHMvRXhwb3J0Q29uZmlnU2VsZWN0U3BlY3NQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkYTczMmQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC93aXphcmRzL0V4cG9ydENvbmZpZ1NlbGVjdFNwZWNzUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5leHBvcnQud2l6YXJkczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LkV4cG9ydFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LkV4cG9ydFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnNlcnZpY2VzLkNvbmZpZ3VyYXRpb25FeHBvcnREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuUHJlc2VudGF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5MaWJyYXJ5VUlJbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVpLndpemFyZHMuQmFzZVdpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkFycmF5Q29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2hlY2tTdGF0ZUNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNoZWNrYm94VGFibGVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ2hlY2tTdGF0ZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotCi0vKioKLSAqIEEgd2l6YXJkIHBhZ2UgdGhhdCBwcm9tcHRzIHRoZSB1c2VyIHRvIHNlbGVjdCBvbmUgb3IgbW9yZSBtZXRob2QKLSAqIGNvbmZpZ3VyYXRpb24gc3BlY2lmaWNhdGlvbnMgdG8gZXhwb3J0LgotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBFeHBvcnRDb25maWdTZWxlY3RTcGVjc1BhZ2UgZXh0ZW5kcyBCYXNlV2l6YXJkUGFnZSBpbXBsZW1lbnRzCi0JCUlTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIsIElDaGVja1N0YXRlTGlzdGVuZXIsIExpc3RlbmVyIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBR0VfTkFNRSA9IEV4cG9ydENvbmZpZ1NlbGVjdFNwZWNzUGFnZS5jbGFzcwotCQkJLmdldE5hbWUoKTsKLQotCXByaXZhdGUgVGFibGUgdGFibGU7Ci0KLQlwcml2YXRlIENoZWNrYm94VGFibGVWaWV3ZXIgY3RybF9jaGtib3hUYWJsZVZpZXdlcjsKLQotCXByaXZhdGUgVGV4dCBjdHJsX2JyaWVmRGVzYzsKLQotCXByaXZhdGUgaW50IGNoZWNrZWRDb3VudCA9IDA7Ci0KLQlwcml2YXRlIExpc3QgY2hlY2tlZENvbmZpZ0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQlwcml2YXRlIENvbmZpZ3VyYXRpb25FeHBvcnREYXRhIGRhdGE7CQotCQotCXByaXZhdGUgQnV0dG9uIHNlbGVjdEFsbEJ1dHRvbjsKLQkKLQlwcml2YXRlIEJ1dHRvbiBkZXNlbGVjdEFsbEJ1dHRvbjsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIEV4cG9ydENvbmZpZ1NlbGVjdFNwZWNzUGFnZShDb25maWd1cmF0aW9uRXhwb3J0RGF0YSBkYXRhKSB7Ci0JCXN1cGVyKFBBR0VfTkFNRSk7Ci0JCXNldFRpdGxlKEV4cG9ydFJlc291cmNlcy5zZWxlY3RDb25maWdTcGVjc1BhZ2VfdGl0bGUpOwotCQlzZXREZXNjcmlwdGlvbihFeHBvcnRSZXNvdXJjZXMuc2VsZWN0Q29uZmlnU3BlY3NQYWdlX2Rlc2MpOwotCQlzZXRJbWFnZURlc2NyaXB0b3IoRXhwb3J0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoCi0JCQkJImZ1bGwvd2l6YmFuL2V4cF9saWJfY29uZl93aXpiYW4uZ2lmIikpOyAvLyROT04tTkxTLTEkCi0JCXRoaXMuZGF0YSA9IGRhdGE7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dQYWdlI2NyZWF0ZUNvbnRyb2woQ29tcG9zaXRlKQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgY29udGFpbmVyID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJY29udGFpbmVyLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQotCQlDb21wb3NpdGUgY29udGFpbmVyMSA9IG5ldyBDb21wb3NpdGUoY29udGFpbmVyLCBTV1QuTk9ORSk7Ci0JCWNvbnRhaW5lcjEuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDMsIGZhbHNlKSk7Ci0JCWNyZWF0ZUxhYmVsKGNvbnRhaW5lcjEsCi0JCQkJRXhwb3J0UmVzb3VyY2VzLnNlbGVjdENvbmZpZ1NwZWNzUGFnZV9jb25maWdzTGFiZWxfdGV4dCk7Ci0KLQkJc2VsZWN0QWxsQnV0dG9uID0gY3JlYXRlQnV0dG9uKAotCQkJCWNvbnRhaW5lcjEsCi0JCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuQXV0aG9yaW5nVUlQbHVnaW5fU2F2ZUFsbEVkaXRvcnNQYWdlX1NlbGVjdEFsbEJ1dHRvbkxhYmVsKTsKLQkJZGVzZWxlY3RBbGxCdXR0b24gPSBjcmVhdGVCdXR0b24oCi0JCQkJY29udGFpbmVyMSwKLQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5BdXRob3JpbmdVSVBsdWdpbl9TYXZlQWxsRWRpdG9yc1BhZ2VfRGVzZWxlY3RBbGxCdXR0b25MYWJlbCk7Ci0KLQkJY3RybF9jaGtib3hUYWJsZVZpZXdlciA9IGNyZWF0ZUNoZWNrYm94VGFibGVWaWV3ZXIoY29udGFpbmVyLCAxKTsKLQkJdGFibGUgPSBjdHJsX2Noa2JveFRhYmxlVmlld2VyLmdldFRhYmxlKCk7Ci0KLS8qCQlNZXRob2RDb25maWd1cmF0aW9uW10gY29uZmlncyA9IExpYnJhcnlTZXJ2aWNlVXRpbAotCQkJCS5nZXRNZXRob2RDb25maWd1cmF0aW9ucyhMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJCQkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKSk7Ki8KLQkJCi0JCUxpc3Q8TWV0aG9kQ29uZmlndXJhdGlvbj4gY29uZmlnTGlzdCA9IG5ldyBBcnJheUxpc3Q8TWV0aG9kQ29uZmlndXJhdGlvbj4oCi0JCQkJTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpCi0JCQkJCQkuZ2V0UHJlZGVmaW5lZENvbmZpZ3VyYXRpb25zKCkpOwotCQlpZiAoY29uZmlnTGlzdC5zaXplKCkgPiAxKSB7Ci0JCQlDb21wYXJhdG9yIGNvbXBhcmF0b3IgPSBQcmVzZW50YXRpb25Db250ZXh0LklOU1RBTkNFCi0JCQkJCS5nZXRDb21wYXJhdG9yKCk7Ci0JCQlDb2xsZWN0aW9ucy48TWV0aG9kQ29uZmlndXJhdGlvbj4gc29ydChjb25maWdMaXN0LCBjb21wYXJhdG9yKTsKLQkJfQotCQkKLQkJTWV0aG9kQ29uZmlndXJhdGlvbltdIGEgPSBuZXcgTWV0aG9kQ29uZmlndXJhdGlvbltjb25maWdMaXN0LnNpemUoKV07Ci0JCU1ldGhvZENvbmZpZ3VyYXRpb25bXSBjb25maWdzID0gY29uZmlnTGlzdC50b0FycmF5KGEpOwotCi0JCUlMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIgPSBuZXcgTGFiZWxQcm92aWRlcigpIHsKLQkJCXB1YmxpYyBJbWFnZSBnZXRJbWFnZShPYmplY3QgZWxlbWVudCkgewotCQkJCXJldHVybiBMaWJyYXJ5VUlJbWFnZXMuSU1HX01FVEhPRF9QTFVHSU47Ci0JCQl9Ci0KLQkJCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgewotCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kQ29uZmlndXJhdGlvbikgewotCQkJCQlyZXR1cm4gKChNZXRob2RDb25maWd1cmF0aW9uKSBlbGVtZW50KS5nZXROYW1lKCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJcmV0dXJuIGVsZW1lbnQudG9TdHJpbmcoKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JCWN0cmxfY2hrYm94VGFibGVWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihsYWJlbFByb3ZpZGVyKTsKLQkJY3RybF9jaGtib3hUYWJsZVZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIobmV3IEFycmF5Q29udGVudFByb3ZpZGVyKCkpOwotCQlpZiAoY29uZmlncyAhPSBudWxsKSB7Ci0JCQljdHJsX2Noa2JveFRhYmxlVmlld2VyLnNldElucHV0KGNvbmZpZ3MpOwotCQl9Ci0KLQkJY3JlYXRlTGFiZWwoY29udGFpbmVyLCBBdXRob3JpbmdVSVRleHQuQlJJRUZfREVTQ1JJUFRJT05fVEVYVCk7Ci0JCWN0cmxfYnJpZWZEZXNjID0gY3JlYXRlTXVsdGlMaW5lVGV4dChjb250YWluZXIsICIiLCAzNjAsIDgwLCAzKTsgLy8kTk9OLU5MUy0xJAotCi0JCWlmIChjb25maWdzICE9IG51bGwgJiYgY29uZmlncy5sZW5ndGggPiAwKSB7Ci0JCQlzZXREaXNwbGF5QXR0cmlidXRlcygoTWV0aG9kQ29uZmlndXJhdGlvbikgY29uZmlnc1swXSk7Ci0JCX0KLQotCQlhZGRMaXN0ZW5lcnMoKTsKLQotCQlzZXRDb250cm9sKGNvbnRhaW5lcik7Ci0JCXNldFBhZ2VDb21wbGV0ZSh0cnVlKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkTGlzdGVuZXJzKCkgewotCQljdHJsX2Noa2JveFRhYmxlVmlld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcih0aGlzKTsKLQkJY3RybF9jaGtib3hUYWJsZVZpZXdlci5hZGRDaGVja1N0YXRlTGlzdGVuZXIodGhpcyk7Ci0KLQkJZmluYWwgTWV0aG9kTGlicmFyeSBsaWIgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCk7Ci0JCXNlbGVjdEFsbEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJY3RybF9jaGtib3hUYWJsZVZpZXdlci5zZXRBbGxDaGVja2VkKHRydWUpOwotCQkJCWlmIChsaWIgIT0gbnVsbCkgewotCQkJCQljaGVja2VkQ29uZmlnTGlzdC5jbGVhcigpOwotCQkJCQljaGVja2VkQ29uZmlnTGlzdC5hZGRBbGwobGliLmdldFByZWRlZmluZWRDb25maWd1cmF0aW9ucygpKTsKLQkJCQkJY2hlY2tlZENvdW50ID0gY2hlY2tlZENvbmZpZ0xpc3Quc2l6ZSgpOwotCQkJCX0KLQotCQkJCXNldFBhZ2VDb21wbGV0ZShpc1BhZ2VDb21wbGV0ZSgpKTsKLQkJCQlnZXRXaXphcmQoKS5nZXRDb250YWluZXIoKS51cGRhdGVCdXR0b25zKCk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJd2lkZ2V0U2VsZWN0ZWQoZSk7Ci0JCQl9Ci0KLQkJfSk7Ci0KLQkJZGVzZWxlY3RBbGxCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWN0cmxfY2hrYm94VGFibGVWaWV3ZXIuc2V0QWxsQ2hlY2tlZChmYWxzZSk7Ci0JCQkJaWYgKGxpYiAhPSBudWxsKSB7Ci0JCQkJCWNoZWNrZWRDb25maWdMaXN0LmNsZWFyKCk7Ci0JCQkJCWNoZWNrZWRDb3VudCA9IDA7Ci0JCQkJfQotCi0JCQkJc2V0UGFnZUNvbXBsZXRlKGlzUGFnZUNvbXBsZXRlKCkpOwotCQkJCWdldFdpemFyZCgpLmdldENvbnRhaW5lcigpLnVwZGF0ZUJ1dHRvbnMoKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQl3aWRnZXRTZWxlY3RlZChlKTsKLQkJCX0KLQotCQl9KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNoZWNrU3RhdGVMaXN0ZW5lciNjaGVja1N0YXRlQ2hhbmdlZChvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNoZWNrU3RhdGVDaGFuZ2VkRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgY2hlY2tTdGF0ZUNoYW5nZWQoQ2hlY2tTdGF0ZUNoYW5nZWRFdmVudCBldmVudCkgewotCQlPYmplY3Qgb2JqID0gZXZlbnQuZ2V0RWxlbWVudCgpOwotCi0JCWlmIChldmVudC5nZXRDaGVja2VkKCkpIHsKLQkJCWNoZWNrZWRDb3VudCsrOwotCQkJY2hlY2tlZENvbmZpZ0xpc3QuYWRkKG9iaik7Ci0JCX0gZWxzZSB7Ci0JCQljaGVja2VkQ291bnQtLTsKLQkJCWNoZWNrZWRDb25maWdMaXN0LnJlbW92ZShvYmopOwotCQl9Ci0KLQkJc2V0UGFnZUNvbXBsZXRlKGlzUGFnZUNvbXBsZXRlKCkpOwotCQlnZXRXaXphcmQoKS5nZXRDb250YWluZXIoKS51cGRhdGVCdXR0b25zKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIjc2VsZWN0aW9uQ2hhbmdlZChvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBldmVudAotCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQkJaWYgKCFzZWxlY3Rpb24uaXNFbXB0eSgpKSB7Ci0JCQlPYmplY3RbXSBjb25maWdzID0gc2VsZWN0aW9uLnRvQXJyYXkoKTsKLQkJCXNldERpc3BsYXlBdHRyaWJ1dGVzKChNZXRob2RDb25maWd1cmF0aW9uKSBjb25maWdzWzBdKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXIjaGFuZGxlRXZlbnQob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJc2V0UGFnZUNvbXBsZXRlKGlzUGFnZUNvbXBsZXRlKCkpOwotCQlnZXRXaXphcmQoKS5nZXRDb250YWluZXIoKS51cGRhdGVCdXR0b25zKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldERpc3BsYXlBdHRyaWJ1dGVzKE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0JCWN0cmxfYnJpZWZEZXNjLnNldFRleHQoY29uZmlnLmdldEJyaWVmRGVzY3JpcHRpb24oKSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkUGFnZSNpc1BhZ2VDb21wbGV0ZSgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNQYWdlQ29tcGxldGUoKSB7Ci0JCWlmIChnZXRFcnJvck1lc3NhZ2UoKSAhPSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gY2hlY2tlZENvdW50ID4gMDsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzYXZlRGF0YVRvTW9kZWwoKSB7Ci0JCWRhdGEuc2VsZWN0ZWRDb25maWdzID0gY2hlY2tlZENvbmZpZ0xpc3Q7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkUGFnZSNnZXROZXh0UGFnZSgpCi0JICovCi0JcHVibGljIElXaXphcmRQYWdlIGdldE5leHRQYWdlKCkgewotCQlzYXZlRGF0YVRvTW9kZWwoKTsKLQkJRXhwb3J0Q29uZmlnRGVzdGluYXRpb25QYWdlIHBhZ2UgPSAoKEV4cG9ydENvbmZpZ3VyYXRpb25XaXphcmQpIGdldFdpemFyZCgpKS5kZXN0aW5hdGlvblBhZ2U7Ci0JCXJldHVybiBwYWdlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC93aXphcmRzL0V4cG9ydENvbmZpZ3VyYXRpb25XaXphcmQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvd2l6YXJkcy9FeHBvcnRDb25maWd1cmF0aW9uV2l6YXJkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiYzI2YjguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC93aXphcmRzL0V4cG9ydENvbmZpZ3VyYXRpb25XaXphcmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LndpemFyZHM7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS53aXphcmRzLlNhdmVBbGxFZGl0b3JzUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LkV4cG9ydFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LkV4cG9ydFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnNlcnZpY2VzLkNvbmZpZ3VyYXRpb25FeHBvcnREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQuc2VydmljZXMuQ29uZmlndXJhdGlvbkV4cG9ydFNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5zZXJ2aWNlcy5Db25maWd1cmF0aW9uU3BlY3NFeHBvcnRTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLkxpYnJhcnlVSUltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS53aXphcmRzLkRpcmVjdG9yeVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uSVJ1bm5hYmxlV2l0aFByb2dyZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUltcG9ydFdpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotCi0vKioKLSAqIFRoZSBFeHBvcnQgTGlicmFyeSBDb25maWd1cmF0aW9uIHdpemFyZC4KLSAqIAotICogQGF1dGhvciBCaW5neHVlIFh1Ci0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEV4cG9ydENvbmZpZ3VyYXRpb25XaXphcmQgZXh0ZW5kcyBXaXphcmQgaW1wbGVtZW50cyBJSW1wb3J0V2l6YXJkIHsKLQotCXByb3RlY3RlZCBFeHBvcnRDb25maWdDaG9vc2VNb2RlIG1vZGVQYWdlOwotCi0JcHJvdGVjdGVkIEV4cG9ydENvbmZpZ1NlbGVjdFNwZWNzUGFnZSBzZWxlY3RTcGVjc1BhZ2U7Ci0KLQlwcm90ZWN0ZWQgRXhwb3J0Q29uZmlnU2VsZWN0Q29uZmlnUGFnZSBzZWxlY3RDb25maWdQYWdlOwotCi0JcHJvdGVjdGVkIEV4cG9ydENvbmZpZ0NoZWNraW5nUGFnZSBjb25maWdDaGVja2luZ1BhZ2U7Ci0KLQlwcm90ZWN0ZWQgRXhwb3J0Q29uZmlnRGVzdGluYXRpb25QYWdlIGRlc3RpbmF0aW9uUGFnZTsKLQotCXByb3RlY3RlZCBib29sZWFuIG9rVG9Db21wbGV0ZSA9IGZhbHNlOwotCi0JcHJvdGVjdGVkIENvbmZpZ3VyYXRpb25FeHBvcnREYXRhIGRhdGEgPSBuZXcgQ29uZmlndXJhdGlvbkV4cG9ydERhdGEoKTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIEV4cG9ydENvbmZpZ3VyYXRpb25XaXphcmQoKSB7Ci0JCXNldFdpbmRvd1RpdGxlKEV4cG9ydFJlc291cmNlcy5leHBvcnRDb25maWdXaXphcmRfdGl0bGUpOwotCQlzZXROZWVkc1Byb2dyZXNzTW9uaXRvcih0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaXphcmQjaW5pdChJV29ya2JlbmNoLAotCSAqICAgICAgSVN0cnVjdHVyZWRTZWxlY3Rpb24pCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoIHdvcmtiZW5jaCwgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkI2FkZFBhZ2VzKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRQYWdlcygpIHsKLQkJU2F2ZUFsbEVkaXRvcnNQYWdlLmFkZFBhZ2VJZk5lZWRlZCh0aGlzLCBmYWxzZSwgbnVsbCwgbnVsbCwKLQkJCQlFeHBvcnRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcigKLQkJCQkJCSJmdWxsL3dpemJhbi9FeHBvcnRMaWJyYXJ5Q29uZmlndXJhdGlvbi5naWYiKSk7IC8vJE5PTi1OTFMtMSQKLQotCQltb2RlUGFnZSA9IG5ldyBFeHBvcnRDb25maWdDaG9vc2VNb2RlKGRhdGEpOwotCQlhZGRQYWdlKG1vZGVQYWdlKTsKLQotCQlzZWxlY3RTcGVjc1BhZ2UgPSBuZXcgRXhwb3J0Q29uZmlnU2VsZWN0U3BlY3NQYWdlKGRhdGEpOwotCQlhZGRQYWdlKHNlbGVjdFNwZWNzUGFnZSk7Ci0KLQkJc2VsZWN0Q29uZmlnUGFnZSA9IG5ldyBFeHBvcnRDb25maWdTZWxlY3RDb25maWdQYWdlKGRhdGEpOwotCQlhZGRQYWdlKHNlbGVjdENvbmZpZ1BhZ2UpOwotCi0JCWNvbmZpZ0NoZWNraW5nUGFnZSA9IG5ldyBFeHBvcnRDb25maWdDaGVja2luZ1BhZ2UoZGF0YSk7Ci0JCWFkZFBhZ2UoY29uZmlnQ2hlY2tpbmdQYWdlKTsKLQotCQlkZXN0aW5hdGlvblBhZ2UgPSBuZXcgRXhwb3J0Q29uZmlnRGVzdGluYXRpb25QYWdlKGRhdGEpOwotCQlhZGRQYWdlKGRlc3RpbmF0aW9uUGFnZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkI2NyZWF0ZVBhZ2VDb250cm9scyhDb21wb3NpdGUpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlUGFnZUNvbnRyb2xzKENvbXBvc2l0ZSBwYWdlQ29udGFpbmVyKSB7Ci0JCXN1cGVyLmNyZWF0ZVBhZ2VDb250cm9scyhwYWdlQ29udGFpbmVyKTsKLQkJcGFnZUNvbnRhaW5lci5nZXRTaGVsbCgpLnNldEltYWdlKAotCQkJCUxpYnJhcnlVSUltYWdlcy5JTUdfTUVUSE9EX0NPTkZJR1VSQVRPTik7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZCNjYW5GaW5pc2goKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGNhbkZpbmlzaCgpIHsKLQkJLy8gQ2Fubm90IGNvbXBsZXRlIHRoZSB3aXphcmQgaWYgaXQncyBub3QgdGhlIGxhc3QgcGFnZS4KLQkJaWYgKHRoaXMuZ2V0Q29udGFpbmVyKCkuZ2V0Q3VycmVudFBhZ2UoKSAhPSBkZXN0aW5hdGlvblBhZ2UpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiBva1RvQ29tcGxldGU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZCNwZXJmb3JtRmluaXNoKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtRmluaXNoKCkgewotCQlTdHJpbmcgZXhwb3J0TGliUGF0aCA9IGRhdGEubGxEYXRhLmdldFBhcmVudEZvbGRlcigpOwotCQlpZiAoIWNoZWNrQW5kQ3JlYXRlRGlyKGV4cG9ydExpYlBhdGgpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlJUnVubmFibGVXaXRoUHJvZ3Jlc3Mgb3AgPSBuZXcgSVJ1bm5hYmxlV2l0aFByb2dyZXNzKCkgewotCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLQkJCQkJdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gewotCQkJCXRyeSB7Ci0JCQkJCW1vbml0b3IuYmVnaW5UYXNrKAotCQkJCQkJCUV4cG9ydFJlc291cmNlcy5leHBvcnRDb25maWdFcnJvckRpYWxvZ190aXRsZSwKLQkJCQkJCQlJUHJvZ3Jlc3NNb25pdG9yLlVOS05PV04pOwotCi0JCQkJCWlmIChkYXRhLnZhbGlkYXRlKCkpIHsKLQkJCQkJCWlmIChkYXRhLmV4cG9ydENvbmZpZ1NwZWNzKSB7Ci0JCQkJCQkJLy8gRXhwb3J0IGNvbmZpZ3VyYXRpb24gc3BlY3Mgb25seS4KLQkJCQkJCQkobmV3IENvbmZpZ3VyYXRpb25TcGVjc0V4cG9ydFNlcnZpY2UoZGF0YSkpCi0JCQkJCQkJCQkucnVuKG1vbml0b3IpOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkvLyBFeHBvcnQgYSBjb25maWd1cmF0aW9uIGNsb3N1cmUuCi0JCQkJCQkJKG5ldyBDb25maWd1cmF0aW9uRXhwb3J0U2VydmljZShkYXRhKSkucnVuKG1vbml0b3IpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJdGhyb3cgbmV3IEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24oZSk7Ci0JCQkJfSBmaW5hbGx5IHsKLQkJCQkJbW9uaXRvci5kb25lKCk7Ci0JCQkJfQotCQkJfQotCQl9OwotCi0JCXRyeSB7Ci0JCQlnZXRDb250YWluZXIoKS5ydW4odHJ1ZSwgZmFsc2UsIG9wKTsKLQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKLQkJCVRocm93YWJsZSByZWFsRXhjZXB0aW9uID0gZS5nZXRUYXJnZXRFeGNlcHRpb24oKTsKLQkJCUV4cG9ydFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkuZGlzcGxheUVycm9yKAotCQkJCQlFeHBvcnRSZXNvdXJjZXMuZXhwb3J0Q29uZmlnRXJyb3JEaWFsb2dfdGl0bGUsCi0JCQkJCXJlYWxFeGNlcHRpb24uZ2V0TWVzc2FnZSgpKTsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCWlmIChkYXRhLmVycm9yTXNnICE9IG51bGwgJiYgZGF0YS5lcnJvck1zZy5sZW5ndGgoKSA+IDApIHsKLQkJCUV4cG9ydFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkuZGlzcGxheUVycm9yKAotCQkJCQlFeHBvcnRSZXNvdXJjZXMuZXhwb3J0Q29uZmlnRXJyb3JEaWFsb2dfdGl0bGUsCi0JCQkJCWRhdGEuZXJyb3JNc2cpOwotCQl9Ci0KLQkJLy8gU2F2ZSB0aGUgZXhwb3J0IHBhdGggdG8gcHJlZmVyZW5jZSBzdG9yZS4KLQkJRXhwb3J0VUlQcmVmZXJlbmNlcy5hZGRFeHBvcnRDb25maWdEaXIoZXhwb3J0TGliUGF0aCk7Ci0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGNoZWNrQW5kQ3JlYXRlRGlyKFN0cmluZyBkaXIpIHsKLQkJcmV0dXJuIERpcmVjdG9yeVZhbGlkYXRvci5jaGVja0FuZENyZWF0ZURpcihkaXIsCi0JCQkJRXhwb3J0UmVzb3VyY2VzLmV4cG9ydENvbmZpZ0Vycm9yRGlhbG9nX3RpdGxlLAotCQkJCUV4cG9ydFJlc291cmNlcy5FeHBvcnRQbHVnaW5FcnJvcl9tc2csIGZhbHNlKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvd2l6YXJkcy9FeHBvcnRQbHVnaW5TdW1tYXJ5UGFnZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC93aXphcmRzL0V4cG9ydFBsdWdpblN1bW1hcnlQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlMjdjNDAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC93aXphcmRzL0V4cG9ydFBsdWdpblN1bW1hcnlQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC53aXphcmRzOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5FeHBvcnRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5FeHBvcnRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5zZXJ2aWNlcy5QbHVnaW5FeHBvcnREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51aS53aXphcmRzLkJhc2VXaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkRvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuVGV4dFByZXNlbnRhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlRleHRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlN0eWxlUmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBBIHdpemFyZCBwYWdlIHRoYXQgZGlzcGxheXMgYSBzdW1tYXJ5IG9mIHRoZSBzZWxlY3RlZCBtZXRob2QgcGx1Zy1pbnMgdGhhdAotICogd2lsbCBiZSBleHBvcnRlZC4KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRXhwb3J0UGx1Z2luU3VtbWFyeVBhZ2UgZXh0ZW5kcyBCYXNlV2l6YXJkUGFnZSB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQUdFX05BTUUgPSBFeHBvcnRQbHVnaW5TdW1tYXJ5UGFnZS5jbGFzcwotCQkJLmdldE5hbWUoKTsKLQotCXByaXZhdGUgVGV4dFZpZXdlciB0ZXh0Vmlld2VyOwotCi0JcHJpdmF0ZSBUZXh0UHJlc2VudGF0aW9uIHN0eWxlOwotCi0JcHJpdmF0ZSBQbHVnaW5FeHBvcnREYXRhIGRhdGE7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBFeHBvcnRQbHVnaW5TdW1tYXJ5UGFnZShQbHVnaW5FeHBvcnREYXRhIGRhdGEpIHsKLQkJc3VwZXIoUEFHRV9OQU1FKTsKLQkJc2V0VGl0bGUoRXhwb3J0UmVzb3VyY2VzLmV4cG9ydFBsdWdpblN1bW1hcnlQYWdlX3RpdGxlKTsKLQkJc2V0RGVzY3JpcHRpb24oRXhwb3J0UmVzb3VyY2VzLmV4cG9ydFBsdWdpblN1bW1hcnlQYWdlX2Rlc2MpOwotCQlzZXRJbWFnZURlc2NyaXB0b3IoRXhwb3J0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoCi0JCQkJImZ1bGwvd2l6YmFuL2V4cF9tZXRoX3BsdWdpbl93aXpiYW4uZ2lmIikpOyAvLyROT04tTkxTLTEkCQkKLQkJdGhpcy5kYXRhID0gZGF0YTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ1BhZ2UjY3JlYXRlQ29udHJvbChDb21wb3NpdGUpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBjb250YWluZXIgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQljb250YWluZXIuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCi0JCXRleHRWaWV3ZXIgPSBjcmVhdGVUZXh0Vmlld2VyKGNvbnRhaW5lciwgMzYwLCAxNjAsIDEpOwotCQlEb2N1bWVudCBkb2MgPSBuZXcgRG9jdW1lbnQoIiIpOyAvLyROT04tTkxTLTEkCQkKLQkJdGV4dFZpZXdlci5zZXREb2N1bWVudChkb2MpOwotCi0JCXNldENvbnRyb2woY29udGFpbmVyKTsKLQkJc2V0UGFnZUNvbXBsZXRlKHRydWUpOwotCX0KLQotCXByaXZhdGUgdm9pZCBkaXNwbGF5U3VtbWFyeSgpIHsKLQkJc3R5bGUgPSBuZXcgVGV4dFByZXNlbnRhdGlvbigpOwotCQlEb2N1bWVudCBkb2MgPSBnZXRTdW1tYXJ5VGV4dCgpOwotCQl0ZXh0Vmlld2VyLnNldERvY3VtZW50KGRvYyk7Ci0JCXRleHRWaWV3ZXIuY2hhbmdlVGV4dFByZXNlbnRhdGlvbihzdHlsZSwgdHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudWkud2l6YXJkcy5CYXNlV2l6YXJkUGFnZSNvbkVudGVyUGFnZShPYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgb25FbnRlclBhZ2UoT2JqZWN0IG9iaikgewotCQlkaXNwbGF5U3VtbWFyeSgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSBkb2N1bWVudCBvZiB0aGUgc3VtbWFyeSB0ZXh0LgotCSAqLwotCXB1YmxpYyBEb2N1bWVudCBnZXRTdW1tYXJ5VGV4dCgpIHsKLQkJU3RyaW5nQnVmZmVyIHRleHRCdWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0KLQkJaWYgKGRhdGEuc2VsZWN0ZWRQbHVnaW5zID09IG51bGwgfHwgZGF0YS5zZWxlY3RlZFBsdWdpbnMuaXNFbXB0eSgpKQotCQkJcmV0dXJuIG5ldyBEb2N1bWVudCgKLQkJCQkJRXhwb3J0UmVzb3VyY2VzLmV4cG9ydFBsdWdpblN1bW1hcnlQYWdlX25vUGx1Z2luX3RleHQpOwotCi0JCWludCBzdGFydCA9IDA7Ci0JCWludCBvZmZzZXQgPSAwOwotCQlmb3IgKE1ldGhvZFBsdWdpbiBwbHVnaW4gOiBkYXRhLnNlbGVjdGVkUGx1Z2lucykgewotCQkJc3RhcnQgPSB0ZXh0QnVmLmxlbmd0aCgpOwotCQkJb2Zmc2V0ID0gcGx1Z2luLmdldE5hbWUoKS5sZW5ndGgoKTsKLQkJCXN0eWxlLmFkZFN0eWxlUmFuZ2UobmV3IFN0eWxlUmFuZ2Uoc3RhcnQsIG9mZnNldCwgbnVsbCwgbnVsbCwKLQkJCQkJU1dULkJPTEQpKTsKLQkJCXRleHRCdWYuYXBwZW5kKHBsdWdpbi5nZXROYW1lKCkpLmFwcGVuZCgiXG4iKTsgLy8kTk9OLU5MUy0xJAotCi0JCQlzdGFydCA9IHRleHRCdWYubGVuZ3RoKCk7Ci0JCQlvZmZzZXQgPSBBdXRob3JpbmdVSVRleHQuQVVUSE9SU19URVhULmxlbmd0aCgpOwotCQkJc3R5bGUuYWRkU3R5bGVSYW5nZShuZXcgU3R5bGVSYW5nZShzdGFydCwgb2Zmc2V0LCBudWxsLCBudWxsLAotCQkJCQlTV1QuQk9MRCB8IFNXVC5JVEFMSUMpKTsKLQkJCXRleHRCdWYKLQkJCQkJLmFwcGVuZCgiXHQiKS5hcHBlbmQoQXV0aG9yaW5nVUlUZXh0LkFVVEhPUlNfVEVYVCkuYXBwZW5kKCJcbiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCXRleHRCdWYuYXBwZW5kKCJcdFx0IikuYXBwZW5kKHBsdWdpbi5nZXRBdXRob3JzKCkpLmFwcGVuZCgiXG4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkJCXN0YXJ0ID0gdGV4dEJ1Zi5sZW5ndGgoKTsKLQkJCW9mZnNldCA9IEF1dGhvcmluZ1VJVGV4dC5WRVJTSU9OX1RFWFQubGVuZ3RoKCk7Ci0JCQlzdHlsZS5hZGRTdHlsZVJhbmdlKG5ldyBTdHlsZVJhbmdlKHN0YXJ0LCBvZmZzZXQsIG51bGwsIG51bGwsCi0JCQkJCVNXVC5CT0xEIHwgU1dULklUQUxJQykpOwotCQkJdGV4dEJ1ZgotCQkJCQkuYXBwZW5kKCJcdCIpLmFwcGVuZChBdXRob3JpbmdVSVRleHQuVkVSU0lPTl9URVhUKS5hcHBlbmQoIlxuIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJdGV4dEJ1Zi5hcHBlbmQoIlx0XHQiKS5hcHBlbmQocGx1Z2luLmdldFZlcnNpb24oKSkuYXBwZW5kKCJcbiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCQkJc3RhcnQgPSB0ZXh0QnVmLmxlbmd0aCgpOwotCQkJb2Zmc2V0ID0gQXV0aG9yaW5nVUlUZXh0LkJSSUVGX0RFU0NSSVBUSU9OX1RFWFQubGVuZ3RoKCk7Ci0JCQlzdHlsZS5hZGRTdHlsZVJhbmdlKG5ldyBTdHlsZVJhbmdlKHN0YXJ0LCBvZmZzZXQsIG51bGwsIG51bGwsCi0JCQkJCVNXVC5CT0xEIHwgU1dULklUQUxJQykpOwotCQkJdGV4dEJ1ZgotCQkJCQkuYXBwZW5kKCJcdCIpLmFwcGVuZChBdXRob3JpbmdVSVRleHQuQlJJRUZfREVTQ1JJUFRJT05fVEVYVCkuYXBwZW5kKCJcbiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCXRleHRCdWYKLQkJCQkJLmFwcGVuZCgiXHRcdCIpLmFwcGVuZChwbHVnaW4uZ2V0QnJpZWZEZXNjcmlwdGlvbigpKS5hcHBlbmQoIlxuIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JCQlzdGFydCA9IHRleHRCdWYubGVuZ3RoKCk7Ci0JCQlvZmZzZXQgPSBFeHBvcnRSZXNvdXJjZXMucmV2aWV3UGx1Z2luc1BhZ2VfZGVwZW5kZW50UGx1Z2luc0xhYmVsX3RleHQKLQkJCQkJLmxlbmd0aCgpOyAKLQkJCXN0eWxlLmFkZFN0eWxlUmFuZ2UobmV3IFN0eWxlUmFuZ2Uoc3RhcnQsIG9mZnNldCwgbnVsbCwgbnVsbCwKLQkJCQkJU1dULkJPTEQgfCBTV1QuSVRBTElDKSk7Ci0JCQl0ZXh0QnVmCi0JCQkJCS5hcHBlbmQoIlx0IikgLy8kTk9OLU5MUy0xJAotCQkJCQkuYXBwZW5kKAotCQkJCQkJCUV4cG9ydFJlc291cmNlcy5yZXZpZXdQbHVnaW5zUGFnZV9kZXBlbmRlbnRQbHVnaW5zTGFiZWxfdGV4dCkKLQkJCQkJLmFwcGVuZCgiXG4iKTsgLy8kTk9OLU5MUy0xJAotCQkJTGlzdCBkZXBlbmRlbnRQbHVnaW5MaXN0ID0gcGx1Z2luLmdldEJhc2VzKCk7Ci0JCQlib29sZWFuIGFkZExpbmVmZWVkID0gdHJ1ZTsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGRlcGVuZGVudFBsdWdpbkxpc3QuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJTWV0aG9kUGx1Z2luIGVsZW1lbnQgPSAoTWV0aG9kUGx1Z2luKSBpdGVyLm5leHQoKTsKLQkJCQl0ZXh0QnVmLmFwcGVuZCgiXHRcdCIpLmFwcGVuZChlbGVtZW50LmdldE5hbWUoKSkuYXBwZW5kKCJcbiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQlhZGRMaW5lZmVlZCA9IGZhbHNlOwotCQkJfQotCQkJaWYgKGFkZExpbmVmZWVkKQotCQkJCXRleHRCdWYuYXBwZW5kKCJcbiIpOyAvLyROT04tTkxTLTEkCi0KLQkJCXN0YXJ0ID0gdGV4dEJ1Zi5sZW5ndGgoKTsKLQkJCW9mZnNldCA9IEV4cG9ydFJlc291cmNlcy5yZXZpZXdQbHVnaW5zUGFnZV9hc3NvY2lhdGVkQ29uZmlnc0xhYmVsX3RleHQKLQkJCQkJLmxlbmd0aCgpOwotCQkJc3R5bGUuYWRkU3R5bGVSYW5nZShuZXcgU3R5bGVSYW5nZShzdGFydCwgb2Zmc2V0LCBudWxsLCBudWxsLAotCQkJCQlTV1QuQk9MRCB8IFNXVC5JVEFMSUMpKTsKLQkJCXRleHRCdWYKLQkJCQkJLmFwcGVuZCgiXHQiKSAvLyROT04tTkxTLTEkCi0JCQkJCS5hcHBlbmQoCi0JCQkJCQkJRXhwb3J0UmVzb3VyY2VzLnJldmlld1BsdWdpbnNQYWdlX2Fzc29jaWF0ZWRDb25maWdzTGFiZWxfdGV4dCkKLQkJCQkJLmFwcGVuZCgiXG4iKTsgLy8kTk9OLU5MUy0xJAotCQkJTGlzdCBhc3NvY2lhdGVkQ29uZmlnTGlzdCA9IChMaXN0KSBkYXRhLmFzc29jaWF0ZWRDb25maWdNYXAKLQkJCQkJLmdldChwbHVnaW4pOwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gYXNzb2NpYXRlZENvbmZpZ0xpc3QuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gZWxlbWVudCA9IChNZXRob2RDb25maWd1cmF0aW9uKSBpdGVyLm5leHQoKTsKLQkJCQl0ZXh0QnVmLmFwcGVuZCgiXHRcdCIpLmFwcGVuZChlbGVtZW50LmdldE5hbWUoKSkuYXBwZW5kKCJcbiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCX0KLQotCQkJdGV4dEJ1Zi5hcHBlbmQoIlxuIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCURvY3VtZW50IGRvYyA9IG5ldyBEb2N1bWVudCh0ZXh0QnVmLnRvU3RyaW5nKCkpOwotCQlyZXR1cm4gZG9jOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC93aXphcmRzL0V4cG9ydFBsdWdpbldpemFyZC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC93aXphcmRzL0V4cG9ydFBsdWdpbldpemFyZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNjk5MGJhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvd2l6YXJkcy9FeHBvcnRQbHVnaW5XaXphcmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LndpemFyZHM7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS53aXphcmRzLlNhdmVBbGxFZGl0b3JzUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LkV4cG9ydFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LkV4cG9ydFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnNlcnZpY2VzLlBsdWdpbkV4cG9ydERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5zZXJ2aWNlcy5QbHVnaW5FeHBvcnRTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLkxpYnJhcnlVSUltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS53aXphcmRzLkRpcmVjdG9yeVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uSVJ1bm5hYmxlV2l0aFByb2dyZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUltcG9ydFdpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotCi0vKioKLSAqIFRoZSBFeHBvcnQgTWV0aG9kIFBsdWctaW4gd2l6YXJkLgotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBFeHBvcnRQbHVnaW5XaXphcmQgZXh0ZW5kcyBXaXphcmQgaW1wbGVtZW50cyBJSW1wb3J0V2l6YXJkIHsKLQotCXByb3RlY3RlZCBTZWxlY3RQbHVnaW5QYWdlIHBhZ2UxOwotCi0JcHJvdGVjdGVkIFBsdWdpbkluZm9QYWdlIHBhZ2UyOwotCi0JcHJvdGVjdGVkIEV4cG9ydFBsdWdpblN1bW1hcnlQYWdlIHBhZ2UzOwotCi0JcHJvdGVjdGVkIFNhdmVQbHVnaW5QYWdlIHBhZ2U0OwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gb2tUb0NvbXBsZXRlID0gZmFsc2U7Ci0KLQlwcm90ZWN0ZWQgUGx1Z2luRXhwb3J0RGF0YSBkYXRhID0gbmV3IFBsdWdpbkV4cG9ydERhdGEoKTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIEV4cG9ydFBsdWdpbldpemFyZCgpIHsKLQkJc2V0V2luZG93VGl0bGUoRXhwb3J0UmVzb3VyY2VzLmV4cG9ydFBsdWdpbnNXaXphcmRfdGl0bGUpOwotCQlzZXROZWVkc1Byb2dyZXNzTW9uaXRvcih0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaXphcmQjaW5pdChJV29ya2JlbmNoLAotCSAqICAgICAgSVN0cnVjdHVyZWRTZWxlY3Rpb24pCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoIHdvcmtiZW5jaCwgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkI2FkZFBhZ2VzKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRQYWdlcygpIHsKLQkJU2F2ZUFsbEVkaXRvcnNQYWdlLmFkZFBhZ2VJZk5lZWRlZCh0aGlzLCBmYWxzZSwgbnVsbCwgbnVsbCwKLQkJCQlFeHBvcnRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcigKLQkJCQkJCSJmdWxsL3dpemJhbi9FeHBvcnRNZXRob2RQbHVnaW5zLmdpZiIpKTsgLy8kTk9OLU5MUy0xJAotCi0JCXBhZ2UxID0gbmV3IFNlbGVjdFBsdWdpblBhZ2UoZGF0YSk7Ci0JCWFkZFBhZ2UocGFnZTEpOwotCi0JCXBhZ2UyID0gbmV3IFBsdWdpbkluZm9QYWdlKGRhdGEpOwotCQlhZGRQYWdlKHBhZ2UyKTsKLQotCQlwYWdlMyA9IG5ldyBFeHBvcnRQbHVnaW5TdW1tYXJ5UGFnZShkYXRhKTsKLQkJYWRkUGFnZShwYWdlMyk7Ci0KLQkJcGFnZTQgPSBuZXcgU2F2ZVBsdWdpblBhZ2UoZGF0YSk7Ci0JCWFkZFBhZ2UocGFnZTQpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZCNjcmVhdGVQYWdlQ29udHJvbHMoQ29tcG9zaXRlKQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZVBhZ2VDb250cm9scyhDb21wb3NpdGUgcGFnZUNvbnRhaW5lcikgewotCQlzdXBlci5jcmVhdGVQYWdlQ29udHJvbHMocGFnZUNvbnRhaW5lcik7Ci0JCXBhZ2VDb250YWluZXIuZ2V0U2hlbGwoKS5zZXRJbWFnZShMaWJyYXJ5VUlJbWFnZXMuSU1HX01FVEhPRF9QTFVHSU4pOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmQjY2FuRmluaXNoKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjYW5GaW5pc2goKSB7Ci0JCWlmICh0aGlzLmdldENvbnRhaW5lcigpLmdldEN1cnJlbnRQYWdlKCkgIT0gcGFnZTQpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiBva1RvQ29tcGxldGU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZCNwZXJmb3JtRmluaXNoKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtRmluaXNoKCkgewotCQlTdHJpbmcgZXhwb3J0TGliUGF0aCA9IGRhdGEubGxEYXRhLmdldFBhcmVudEZvbGRlcigpOwotCQlpZiAoY2hlY2tBbmRDcmVhdGVEaXIoZXhwb3J0TGliUGF0aCkgPT0gZmFsc2UpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCUlSdW5uYWJsZVdpdGhQcm9ncmVzcyBvcCA9IG5ldyBJUnVubmFibGVXaXRoUHJvZ3Jlc3MoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQotCQkJCQl0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB7Ci0JCQkJdHJ5IHsKLQkJCQkJbW9uaXRvci5iZWdpblRhc2soRXhwb3J0UmVzb3VyY2VzLkV4cG9ydFBsdWdpbldpemFyZF9NU0cxLAotCQkJCQkJCUlQcm9ncmVzc01vbml0b3IuVU5LTk9XTik7Ci0KLQkJCQkJaWYgKGRhdGEudmFsaWRhdGUoKSkgewotCQkJCQkJKG5ldyBQbHVnaW5FeHBvcnRTZXJ2aWNlKGRhdGEpKS5ydW4obW9uaXRvcik7Ci0JCQkJCX0KLQotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCXRocm93IG5ldyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uKGUpOwotCQkJCX0gZmluYWxseSB7Ci0JCQkJCW1vbml0b3IuZG9uZSgpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQotCQl0cnkgewotCQkJZ2V0Q29udGFpbmVyKCkucnVuKHRydWUsIGZhbHNlLCBvcCk7Ci0JCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0JCQlUaHJvd2FibGUgcmVhbEV4Y2VwdGlvbiA9IGUuZ2V0VGFyZ2V0RXhjZXB0aW9uKCk7Ci0JCQlFeHBvcnRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpLmRpc3BsYXlFcnJvcigKLQkJCQkJRXhwb3J0UmVzb3VyY2VzLkV4cG9ydFBsdWdpbldpemFyZF9lcnJvciwKLQkJCQkJcmVhbEV4Y2VwdGlvbi5nZXRNZXNzYWdlKCkpOwotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJLy8gU2F2ZSB0aGUgZXhwb3J0IHBhdGggdG8gcHJlZmVyZW5jZSBzdG9yZS4KLQkJRXhwb3J0VUlQcmVmZXJlbmNlcy5hZGRFeHBvcnRQbHVnaW5EaXIoZXhwb3J0TGliUGF0aCk7Ci0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGNoZWNrQW5kQ3JlYXRlRGlyKFN0cmluZyBkaXIpIHsKLQkJcmV0dXJuIERpcmVjdG9yeVZhbGlkYXRvci5jaGVja0FuZENyZWF0ZURpcihkaXIsCi0JCQkJRXhwb3J0UmVzb3VyY2VzLkV4cG9ydFBsdWdpbldpemFyZF90aXRsZSwKLQkJCQlFeHBvcnRSZXNvdXJjZXMuRXhwb3J0UGx1Z2luRXJyb3JfbXNnLCBmYWxzZSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3dpemFyZHMvRXhwb3J0VUlQcmVmZXJlbmNlcy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC93aXphcmRzL0V4cG9ydFVJUHJlZmVyZW5jZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjQ5OGVlNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3dpemFyZHMvRXhwb3J0VUlQcmVmZXJlbmNlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5leHBvcnQud2l6YXJkczsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS51dGlsLlByZWZlcmVuY2VVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuRmlsZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5FeHBvcnRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkucHJlZmVyZW5jZXMuTGlicmFyeVVJUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotCi0vKioKLSAqIE1hbmFnZXMgdGhlIEV4cG9ydCBVSSBwcmVmZXJlbmNlcy4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4yCi0gKi8KLXB1YmxpYyBjbGFzcyBFeHBvcnRVSVByZWZlcmVuY2VzIHsKLQotCS8vIFRoZSBleHBvcnQgcGx1Zy1pbiBkaXJlY3RvcmllcyBwcmVmZXJlbmNlIGtleS4KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhQT1JUX1BMVUdJTl9ESVJTID0gImV4cG9ydFBsdWdpbkRpcnMiOyAvLyROT04tTkxTLTEkCi0KLQkvLyBUaGUgZXhwb3J0IGNvbmZpZ3VyYXRpb24gZGlyZWN0b3JpZXMgcHJlZmVyZW5jZSBrZXkuCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVYUE9SVF9DT05GSUdfRElSUyA9ICJleHBvcnRDb25maWdEaXJzIjsgLy8kTk9OLU5MUy0xJAotCi0JLy8gVGhlIGRlZmF1bHQgZXhwb3J0IHBsdWctaW4gZGlyZWN0b3J5IG5hbWUuCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfRVhQT1JUX1BMVUdJTl9ESVJfTkFNRSA9ICJFeHBvcnQiICsgRmlsZVV0aWwuRklMRV9TRVAgKyAiUGx1Z2lucyI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAkgCi0KLQkvLyBUaGUgZGVmYXVsdCBleHBvcnQgY29uZmlndXJhdGlvbiBkaXJlY3RvcnkgbmFtZS4KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9FWFBPUlRfQ09ORklHX0RJUl9OQU1FID0gIkV4cG9ydCIgKyBGaWxlVXRpbC5GSUxFX1NFUCArICJDb25maWd1cmF0aW9ucyI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAkgCi0KLQkvLyBUaGUgZGVmYXVsdCBleHBvcnQgcGx1Zy1pbiBkaXJlY3RvcnkuCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGRlZmF1bHRFeHBvcnRQbHVnaW5EaXIgPSBudWxsOwotCi0JLy8gVGhlIGRlZmF1bHQgZXhwb3J0IGNvbmZpZ3VyYXRpb24gZGlyZWN0b3J5LgotCXByaXZhdGUgc3RhdGljIFN0cmluZyBkZWZhdWx0RXhwb3J0Q29uZmlnRGlyID0gbnVsbDsKLQotCS8vIFRoZSBwbHVnLWluIHNwZWNpZmljIHByZWZlcmVuY2Ugc3RvcmUuCi0JcHJpdmF0ZSBzdGF0aWMgSVByZWZlcmVuY2VTdG9yZSBwcmVmU3RvcmUgPSBFeHBvcnRQbHVnaW4uZ2V0RGVmYXVsdCgpCi0JCQkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0KLQlzdGF0aWMgewotCQlwcmVmU3RvcmUuc2V0RGVmYXVsdChFWFBPUlRfUExVR0lOX0RJUlMsIGdldERlZmF1bHRFeHBvcnRQbHVnaW5EaXIoKSk7Ci0JCXByZWZTdG9yZS5zZXREZWZhdWx0KEVYUE9SVF9DT05GSUdfRElSUywgZ2V0RGVmYXVsdEV4cG9ydENvbmZpZ0RpcigpKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBkZWZhdWx0IGV4cG9ydCBwbHVnLWluIGRpcmVjdG9yeS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBkZWZhdWx0IGV4cG9ydCBwbHVnLWluIGRpcmVjdG9yeQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldERlZmF1bHRFeHBvcnRQbHVnaW5EaXIoKSB7Ci0JCWlmIChkZWZhdWx0RXhwb3J0UGx1Z2luRGlyID09IG51bGwpIHsKLQkJCWRlZmF1bHRFeHBvcnRQbHVnaW5EaXIgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoInVzZXIuaG9tZSIpOyAvLyROT04tTkxTLTEkCi0JCQlTdHJpbmcgYXBwTmFtZSA9IExpYnJhcnlVSVByZWZlcmVuY2VzLmdldEFwcGxpY2F0aW9uU2hvcnROYW1lKCk7Ci0JCQlpZiAoYXBwTmFtZSAhPSBudWxsICYmIGFwcE5hbWUubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJZGVmYXVsdEV4cG9ydFBsdWdpbkRpciA9IGRlZmF1bHRFeHBvcnRQbHVnaW5EaXIKLQkJCQkJCSsgRmlsZVV0aWwuRklMRV9TRVAgKyBhcHBOYW1lICsgRmlsZVV0aWwuRklMRV9TRVAKLQkJCQkJCSsgREVGQVVMVF9FWFBPUlRfUExVR0lOX0RJUl9OQU1FOwotCQkJfSBlbHNlIHsKLQkJCQlkZWZhdWx0RXhwb3J0UGx1Z2luRGlyID0gZGVmYXVsdEV4cG9ydFBsdWdpbkRpcgotCQkJCQkJKyBGaWxlVXRpbC5GSUxFX1NFUCArIERFRkFVTFRfRVhQT1JUX1BMVUdJTl9ESVJfTkFNRTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZGVmYXVsdEV4cG9ydFBsdWdpbkRpcjsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBleHBvcnQgcGx1Zy1pbiBkaXJlY3RvcmllcyBwcmVmZXJlbmNlIHZhbHVlLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHByZWZlcmVuY2UgdmFsdWUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZ1tdIGdldEV4cG9ydFBsdWdpbkRpcnMoKSB7Ci0JCXJldHVybiBQcmVmZXJlbmNlVXRpbC5nZXRTdHJpbmdWYWx1ZXMocHJlZlN0b3JlLCBFWFBPUlRfUExVR0lOX0RJUlMpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGV4cG9ydCBwbHVnLWluIGRpcmVjdG9yaWVzIHByZWZlcmVuY2UgdmFsdWUuCi0JICogCi0JICogQHJldHVybiBhIGNvbGxlY3Rpb24gb2YgZXhwb3J0IHBsdWctaW4gZGlyZWN0b3JpZXMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3Q8U3RyaW5nPiBnZXRFeHBvcnRQbHVnaW5EaXJzTGlzdCgpIHsKLQkJcmV0dXJuIFByZWZlcmVuY2VVdGlsLmdldExpc3QocHJlZlN0b3JlLCBFWFBPUlRfUExVR0lOX0RJUlMpOwotCX0KLQotCS8qKgotCSAqIEFkZHMgYSBleHBvcnQgZGlyZWN0b3J5IHRvIHRoZSBleHBvcnQgcGx1Zy1pbiBkaXJlY3RvcmllcyBwcmVmZXJlbmNlLgotCSAqIAotCSAqIEBwYXJhbSBkaXIKLQkgKiAgICAgICAgICAgIGFuIGV4cG9ydCBkaXJlY3RvcnkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgYWRkRXhwb3J0UGx1Z2luRGlyKFN0cmluZyBkaXIpIHsKLQkJUHJlZmVyZW5jZVV0aWwuYWRkVG9MaXN0KHByZWZTdG9yZSwgRVhQT1JUX1BMVUdJTl9ESVJTLCBkaXIpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGRlZmF1bHQgZXhwb3J0IGNvbmZpZ3VyYXRpb24gZGlyZWN0b3J5LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGRlZmF1bHQgZXhwb3J0IGNvbmZpZ3VyYXRpb24gZGlyZWN0b3J5Ci0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RGVmYXVsdEV4cG9ydENvbmZpZ0RpcigpIHsKLQkJaWYgKGRlZmF1bHRFeHBvcnRDb25maWdEaXIgPT0gbnVsbCkgewotCQkJZGVmYXVsdEV4cG9ydENvbmZpZ0RpciA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgidXNlci5ob21lIik7IC8vJE5PTi1OTFMtMSQKLQkJCVN0cmluZyBhcHBOYW1lID0gTGlicmFyeVVJUHJlZmVyZW5jZXMuZ2V0QXBwbGljYXRpb25TaG9ydE5hbWUoKTsKLQkJCWlmIChhcHBOYW1lICE9IG51bGwgJiYgYXBwTmFtZS5sZW5ndGgoKSA+IDApIHsKLQkJCQlkZWZhdWx0RXhwb3J0Q29uZmlnRGlyID0gZGVmYXVsdEV4cG9ydENvbmZpZ0RpcgotCQkJCQkJKyBGaWxlVXRpbC5GSUxFX1NFUCArIGFwcE5hbWUgKyBGaWxlVXRpbC5GSUxFX1NFUAotCQkJCQkJKyBERUZBVUxUX0VYUE9SVF9DT05GSUdfRElSX05BTUU7Ci0JCQl9IGVsc2UgewotCQkJCWRlZmF1bHRFeHBvcnRDb25maWdEaXIgPSBkZWZhdWx0RXhwb3J0Q29uZmlnRGlyCi0JCQkJCQkrIEZpbGVVdGlsLkZJTEVfU0VQICsgREVGQVVMVF9FWFBPUlRfQ09ORklHX0RJUl9OQU1FOwotCQkJfQotCQl9Ci0JCXJldHVybiBkZWZhdWx0RXhwb3J0Q29uZmlnRGlyOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGV4cG9ydCBjb25maWd1cmF0aW9uIGRpcmVjdG9yaWVzIHByZWZlcmVuY2UgdmFsdWUuCi0JICogCi0JICogQHJldHVybiB0aGUgcHJlZmVyZW5jZSB2YWx1ZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nW10gZ2V0RXhwb3J0Q29uZmlnRGlycygpIHsKLQkJcmV0dXJuIFByZWZlcmVuY2VVdGlsLmdldFN0cmluZ1ZhbHVlcyhwcmVmU3RvcmUsIEVYUE9SVF9DT05GSUdfRElSUyk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgZXhwb3J0IGNvbmZpZ3VyYXRpb24gZGlyZWN0b3JpZXMgcHJlZmVyZW5jZSB2YWx1ZS4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgY29sbGVjdGlvbiBvZiBleHBvcnQgY29uZmlndXJhdGlvbiBkaXJlY3RvcmllcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdDxTdHJpbmc+IGdldEV4cG9ydENvbmZpZ0RpcnNMaXN0KCkgewotCQlyZXR1cm4gUHJlZmVyZW5jZVV0aWwuZ2V0TGlzdChwcmVmU3RvcmUsIEVYUE9SVF9DT05GSUdfRElSUyk7Ci0JfQotCi0JLyoqCi0JICogQWRkcyBhIGV4cG9ydCBkaXJlY3RvcnkgdG8gdGhlIGV4cG9ydCBjb25maWd1cmF0aW9uIGRpcmVjdG9yaWVzCi0JICogcHJlZmVyZW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gZGlyCi0JICogICAgICAgICAgICBhbiBleHBvcnQgZGlyZWN0b3J5Ci0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGFkZEV4cG9ydENvbmZpZ0RpcihTdHJpbmcgZGlyKSB7Ci0JCVByZWZlcmVuY2VVdGlsLmFkZFRvTGlzdChwcmVmU3RvcmUsIEVYUE9SVF9DT05GSUdfRElSUywgZGlyKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvd2l6YXJkcy9QbHVnaW5JbmZvUGFnZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC93aXphcmRzL1BsdWdpbkluZm9QYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwZWIzNjQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC93aXphcmRzL1BsdWdpbkluZm9QYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC53aXphcmRzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLndpemFyZHMuQ29uZmlndXJhdGlvblRhYmxlTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LkV4cG9ydFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LkV4cG9ydFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnNlcnZpY2VzLlBsdWdpbkV4cG9ydERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuTGlicmFyeVVJSW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuTGlicmFyeVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVpLndpemFyZHMuQmFzZVdpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5BcnJheUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGU7Ci0KLS8qKgotICogQSB3aXphcmQgcGFnZSB0aGF0IHByb21wdHMgdGhlIHVzZXIgdG8gcmV2aWV3IHRoZSBkZXBlbmRlbmNpZXMgb2YgdGhlIG1ldGhvZAotICogcGx1Zy1pbnMgdGhhdCBoYXZlIGJlZW4gc2VsZWN0ZWQgZm9yIGV4cG9ydC4KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUGx1Z2luSW5mb1BhZ2UgZXh0ZW5kcyBCYXNlV2l6YXJkUGFnZSBpbXBsZW1lbnRzCi0JCUlTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIsIExpc3RlbmVyIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBR0VfTkFNRSA9IFBsdWdpbkluZm9QYWdlLmNsYXNzLmdldE5hbWUoKTsKLQotCXByaXZhdGUgVGFibGUgdGFibGU7Ci0KLQlwcml2YXRlIFRhYmxlVmlld2VyIGN0cmxfdGFibGVWaWV3ZXI7Ci0KLQlwcml2YXRlIFRhYmxlVmlld2VyIGN0cmxfZGVwZW5kUGx1Z2luc1ZpZXdlcjsKLQotCXByaXZhdGUgVGFibGVWaWV3ZXIgY3RybF9hc3NvY2lhdGVkQ29uZmlnVmlld2VyOwotCi0JcHJpdmF0ZSBMaXN0IGRlcGVuZGVudFBsdWdpbkxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQlwcml2YXRlIExpc3QgYXNzb2NpYXRlZENvbmZpZ0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQlwcml2YXRlIFBsdWdpbkV4cG9ydERhdGEgZGF0YTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFBsdWdpbkluZm9QYWdlKFBsdWdpbkV4cG9ydERhdGEgZGF0YSkgewotCQlzdXBlcihQQUdFX05BTUUpOwotCQlzZXRUaXRsZShFeHBvcnRSZXNvdXJjZXMucmV2aWV3UGx1Z2luc1BhZ2VfdGl0bGUpOwotCQlzZXREZXNjcmlwdGlvbihFeHBvcnRSZXNvdXJjZXMucmV2aWV3UGx1Z2luc1BhZ2VfZGVzYyk7Ci0JCXNldEltYWdlRGVzY3JpcHRvcihFeHBvcnRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcigKLQkJCQkiZnVsbC93aXpiYW4vZXhwX21ldGhfcGx1Z2luX3dpemJhbi5naWYiKSk7IC8vJE5PTi1OTFMtMSQJCQotCQl0aGlzLmRhdGEgPSBkYXRhOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nUGFnZSNjcmVhdGVDb250cm9sKENvbXBvc2l0ZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGNvbnRhaW5lciA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCWNvbnRhaW5lci5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0KLQkJY3JlYXRlTGFiZWwoY29udGFpbmVyLAotCQkJCUV4cG9ydFJlc291cmNlcy5yZXZpZXdQbHVnaW5zUGFnZV9wbHVnaW5zTGFiZWxfdGV4dCk7Ci0KLQkJY3RybF90YWJsZVZpZXdlciA9IGNyZWF0ZVRhYmxlVmlld2VyKGNvbnRhaW5lciwgMzYwLCA2MCwgMSk7Ci0JCXRhYmxlID0gY3RybF90YWJsZVZpZXdlci5nZXRUYWJsZSgpOwotCi0JCUlMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIgPSBuZXcgTGFiZWxQcm92aWRlcigpIHsKLQkJCXB1YmxpYyBJbWFnZSBnZXRJbWFnZShPYmplY3QgZWxlbWVudCkgewotCQkJCXJldHVybiBMaWJyYXJ5VUlJbWFnZXMuSU1HX01FVEhPRF9QTFVHSU47Ci0JCQl9Ci0KLQkJCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgewotCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luKSB7Ci0JCQkJCXJldHVybiAoKE1ldGhvZFBsdWdpbikgZWxlbWVudCkuZ2V0TmFtZSgpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXJldHVybiBlbGVtZW50LnRvU3RyaW5nKCk7Ci0JCQkJfQotCQkJfQotCQl9OwotCQljdHJsX3RhYmxlVmlld2VyLnNldExhYmVsUHJvdmlkZXIobGFiZWxQcm92aWRlcik7Ci0JCWN0cmxfdGFibGVWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBBcnJheUNvbnRlbnRQcm92aWRlcigpKTsKLQkJaWYgKGRhdGEuZ2V0U2VsZWN0ZWRQbHVnaW5zKCkgIT0gbnVsbCkgewotCQkJY3RybF90YWJsZVZpZXdlci5zZXRJbnB1dChkYXRhLmdldFNlbGVjdGVkUGx1Z2lucygpLnRvQXJyYXkoKSk7Ci0JCX0KLQotCQljcmVhdGVMYWJlbChjb250YWluZXIsCi0JCQkJRXhwb3J0UmVzb3VyY2VzLnJldmlld1BsdWdpbnNQYWdlX2RlcGVuZGVudFBsdWdpbnNMYWJlbF90ZXh0KTsKLQotCQljdHJsX2RlcGVuZFBsdWdpbnNWaWV3ZXIgPSBjcmVhdGVUYWJsZVZpZXdlcihjb250YWluZXIsIDM2MCwgNjAsIDEpOwotCQljdHJsX2RlcGVuZFBsdWdpbnNWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihsYWJlbFByb3ZpZGVyKTsKLQkJY3RybF9kZXBlbmRQbHVnaW5zVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgQXJyYXlDb250ZW50UHJvdmlkZXIoKSk7Ci0JCWN0cmxfZGVwZW5kUGx1Z2luc1ZpZXdlci5zZXRJbnB1dChkZXBlbmRlbnRQbHVnaW5MaXN0KTsKLQotCQljcmVhdGVMYWJlbChjb250YWluZXIsCi0JCQkJRXhwb3J0UmVzb3VyY2VzLnJldmlld1BsdWdpbnNQYWdlX2Fzc29jaWF0ZWRDb25maWdzTGFiZWxfdGV4dCk7Ci0KLQkJY3RybF9hc3NvY2lhdGVkQ29uZmlnVmlld2VyID0gY3JlYXRlVGFibGVWaWV3ZXIoY29udGFpbmVyLCAzNjAsIDYwLCAxKTsKLQkJY3RybF9hc3NvY2lhdGVkQ29uZmlnVmlld2VyCi0JCQkJLnNldExhYmVsUHJvdmlkZXIobmV3IENvbmZpZ3VyYXRpb25UYWJsZUxhYmVsUHJvdmlkZXIoKSk7Ci0JCWN0cmxfYXNzb2NpYXRlZENvbmZpZ1ZpZXdlcgotCQkJCS5zZXRDb250ZW50UHJvdmlkZXIobmV3IEFycmF5Q29udGVudFByb3ZpZGVyKCkpOwotCQljdHJsX2Fzc29jaWF0ZWRDb25maWdWaWV3ZXIuc2V0SW5wdXQoYXNzb2NpYXRlZENvbmZpZ0xpc3QpOwotCi0JCWlmIChkYXRhLmdldFNlbGVjdGVkUGx1Z2lucygpICE9IG51bGwKLQkJCQkmJiAhZGF0YS5nZXRTZWxlY3RlZFBsdWdpbnMoKS5pc0VtcHR5KCkpIHsKLQkJCXRhYmxlLnNlbGVjdCgwKTsKLQkJCWRpc3BsYXlSZWxhdGVkSW5mbyhkYXRhLmdldFNlbGVjdGVkUGx1Z2lucygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJfQotCi0JCWFkZExpc3RlbmVycygpOwotCi0JCXNldENvbnRyb2woY29udGFpbmVyKTsKLQkJc2V0UGFnZUNvbXBsZXRlKGZhbHNlKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkTGlzdGVuZXJzKCkgewotCQljdHJsX3RhYmxlVmlld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcih0aGlzKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciNzZWxlY3Rpb25DaGFuZ2VkKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKFN0cnVjdHVyZWRTZWxlY3Rpb24pIGV2ZW50Ci0JCQkJLmdldFNlbGVjdGlvbigpOwotCQlpZiAoIXNlbGVjdGlvbi5pc0VtcHR5KCkpIHsKLQkJCU9iamVjdFtdIHBsdWdpbiA9IHNlbGVjdGlvbi50b0FycmF5KCk7Ci0JCQlkaXNwbGF5UmVsYXRlZEluZm8oKE1ldGhvZFBsdWdpbikgcGx1Z2luWzBdKTsKLQkJfQotCi0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lciNoYW5kbGVFdmVudChvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQlzZXRQYWdlQ29tcGxldGUoaXNQYWdlQ29tcGxldGUoKSk7Ci0JCWdldFdpemFyZCgpLmdldENvbnRhaW5lcigpLnVwZGF0ZUJ1dHRvbnMoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51aS53aXphcmRzLkJhc2VXaXphcmRQYWdlI29uRW50ZXJQYWdlKE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBvbkVudGVyUGFnZShPYmplY3Qgb2JqKSB7Ci0JCWlmIChkYXRhLmdldFNlbGVjdGVkUGx1Z2lucygpICE9IG51bGwKLQkJCQkmJiAhZGF0YS5nZXRTZWxlY3RlZFBsdWdpbnMoKS5pc0VtcHR5KCkpIHsKLQkJCWN0cmxfdGFibGVWaWV3ZXIuc2V0SW5wdXQoZGF0YS5nZXRTZWxlY3RlZFBsdWdpbnMoKS50b0FycmF5KCkpOwotCQkJdGFibGUuc2VsZWN0KDApOwotCQkJZGlzcGxheVJlbGF0ZWRJbmZvKGRhdGEuZ2V0U2VsZWN0ZWRQbHVnaW5zKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGRpc3BsYXlSZWxhdGVkSW5mbyhNZXRob2RQbHVnaW4gcGx1Z2luKSB7Ci0JCWlmIChwbHVnaW4gPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlkZXBlbmRlbnRQbHVnaW5MaXN0ID0gcGx1Z2luLmdldEJhc2VzKCk7Ci0JCWN0cmxfZGVwZW5kUGx1Z2luc1ZpZXdlci5zZXRJbnB1dChkZXBlbmRlbnRQbHVnaW5MaXN0LnRvQXJyYXkoKSk7Ci0JCWFzc29jaWF0ZWRDb25maWdMaXN0ID0gTGlicmFyeVV0aWwuZ2V0QXNzb2NpYXRlZENvbmZpZ3VyYXRpb25zKHBsdWdpbik7Ci0JCWN0cmxfYXNzb2NpYXRlZENvbmZpZ1ZpZXdlci5zZXRJbnB1dChhc3NvY2lhdGVkQ29uZmlnTGlzdC50b0FycmF5KCkpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2UjaXNQYWdlQ29tcGxldGUoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUGFnZUNvbXBsZXRlKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzYXZlRGF0YVRvTW9kZWwoKSB7Ci0JCS8vIEZJWE1FISBSZWZhY3RvciB0byB1c2U6IGRhdGEuYnVpbGRBc3NvY2lhdGVkQ29uZmlnTWFwKCkKLQkJaWYgKGRhdGEuZ2V0U2VsZWN0ZWRQbHVnaW5zKCkgIT0gbnVsbCkgewotCQkJZGF0YS5hc3NvY2lhdGVkQ29uZmlnTWFwLmNsZWFyKCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBkYXRhLmdldFNlbGVjdGVkUGx1Z2lucygpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQlNZXRob2RQbHVnaW4gZWxlbWVudCA9IChNZXRob2RQbHVnaW4pIGl0ZXIubmV4dCgpOwotCQkJCWRhdGEuYXNzb2NpYXRlZENvbmZpZ01hcC5wdXQoZWxlbWVudCwgTGlicmFyeVV0aWwKLQkJCQkJCS5nZXRBc3NvY2lhdGVkQ29uZmlndXJhdGlvbnMoZWxlbWVudCkpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkUGFnZSNnZXROZXh0UGFnZSgpCi0JICovCi0JcHVibGljIElXaXphcmRQYWdlIGdldE5leHRQYWdlKCkgewotCQlzYXZlRGF0YVRvTW9kZWwoKTsKLQkJRXhwb3J0UGx1Z2luU3VtbWFyeVBhZ2UgcGFnZSA9ICgoRXhwb3J0UGx1Z2luV2l6YXJkKSBnZXRXaXphcmQoKSkucGFnZTM7Ci0JCXBhZ2Uub25FbnRlclBhZ2UobnVsbCk7Ci0JCXJldHVybiBwYWdlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC93aXphcmRzL1NhdmVQbHVnaW5QYWdlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3dpemFyZHMvU2F2ZVBsdWdpblBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjQ5YjliNS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3dpemFyZHMvU2F2ZVBsdWdpblBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5leHBvcnQud2l6YXJkczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQuRXhwb3J0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQuRXhwb3J0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQuc2VydmljZXMuUGx1Z2luRXhwb3J0RGF0YTsKLQotLyoqCi0gKiBBIHdpemFyZCBwYWdlIHRoYXQgaW5mb3JtcyB0aGUgdXNlciB0aGF0IGNoYW5nZXMgdG8gdGhlIGV4aXN0aW5nIG1ldGhvZAotICogcGx1Zy1pbnMgd2lsbCBiZSBzYXZlZCBwcmlvciB0byBhbiBleHBvcnQgb3BlcmF0aW9uLgotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBTYXZlUGx1Z2luUGFnZSBleHRlbmRzIERlc3RpbmF0aW9uQ29tbW9uUGFnZSB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQUdFX05BTUUgPSBTYXZlUGx1Z2luUGFnZS5jbGFzcy5nZXROYW1lKCk7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBTYXZlUGx1Z2luUGFnZShQbHVnaW5FeHBvcnREYXRhIGRhdGEpIHsKLQkJc3VwZXIoUEFHRV9OQU1FLCBkYXRhLmxsRGF0YSk7Ci0JCXNldFRpdGxlKEV4cG9ydFJlc291cmNlcy5zcGVjaWZ5UGF0aFBhZ2VfdGl0bGUpOwotCQlzZXREZXNjcmlwdGlvbihFeHBvcnRSZXNvdXJjZXMuc3BlY2lmeVBhdGhQYWdlX2Rlc2MpOwotCQlzZXRJbWFnZURlc2NyaXB0b3IoRXhwb3J0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoCi0JCQkJImZ1bGwvd2l6YmFuL2V4cF9tZXRoX3BsdWdpbl93aXpiYW4uZ2lmIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZXMgdGhlIHdpemFyZCBwYWdlIGNvbnRyb2xzIHdpdGggZGF0YS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0Q29udHJvbHMoKSB7Ci0JCVN0cmluZ1tdIGV4cG9ydERpcnMgPSBFeHBvcnRVSVByZWZlcmVuY2VzLmdldEV4cG9ydFBsdWdpbkRpcnMoKTsKLQkJaWYgKGV4cG9ydERpcnMgIT0gbnVsbCAmJiBleHBvcnREaXJzLmxlbmd0aCA+IDApIHsKLQkJCWV4cG9ydFBhdGhDb21iby5zZXRJdGVtcyhleHBvcnREaXJzKTsKLQkJCWV4cG9ydFBhdGhDb21iby5zZXRUZXh0KGV4cG9ydERpcnNbMF0pOwotCQl9Ci0JCXN1cGVyLmluaXRDb250cm9scygpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2UjaXNQYWdlQ29tcGxldGUoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUGFnZUNvbXBsZXRlKCkgewotCQlFeHBvcnRQbHVnaW5XaXphcmQgd2l6YXJkID0gKEV4cG9ydFBsdWdpbldpemFyZCkgZ2V0V2l6YXJkKCk7Ci0JCWlmIChleHBvcnRQYXRoQ29tYm8uZ2V0VGV4dCgpLmxlbmd0aCgpID4gMAotCQkJCSYmICFleHBvcnRQYXRoQ29tYm8uZ2V0VGV4dCgpLmVuZHNXaXRoKEZpbGUuc2VwYXJhdG9yKSkgewotCQkJc2F2ZVRvRGF0YU1vZGVsKCk7Ci0JCQl3aXphcmQub2tUb0NvbXBsZXRlID0gdHJ1ZTsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXdpemFyZC5va1RvQ29tcGxldGUgPSBmYWxzZTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC93aXphcmRzL1NlbGVjdFBsdWdpblBhZ2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvd2l6YXJkcy9TZWxlY3RQbHVnaW5QYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwNzczMzYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC93aXphcmRzL1NlbGVjdFBsdWdpblBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LndpemFyZHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5FeHBvcnRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5FeHBvcnRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5zZXJ2aWNlcy5QbHVnaW5FeHBvcnREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuUHJlc2VudGF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5MaWJyYXJ5VUlJbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuTGlicmFyeVVJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51aS53aXphcmRzLkJhc2VXaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkFycmF5Q29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2hlY2tTdGF0ZUNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNoZWNrYm94VGFibGVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ2hlY2tTdGF0ZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotCi0vKioKLSAqIEEgd2l6YXJkIHBhZ2UgdGhhdCBwcm9tcHRzIHRoZSB1c2VyIHRvIHNlbGVjdCB0aGUgbWV0aG9kIHBsdWctaW5zIHRvIGJlCi0gKiBleHBvcnRlZC4KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgU2VsZWN0UGx1Z2luUGFnZSBleHRlbmRzIEJhc2VXaXphcmRQYWdlIGltcGxlbWVudHMKLQkJSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciwgSUNoZWNrU3RhdGVMaXN0ZW5lciwgTGlzdGVuZXIgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFHRV9OQU1FID0gU2VsZWN0UGx1Z2luUGFnZS5jbGFzcy5nZXROYW1lKCk7Ci0KLQlwcml2YXRlIFRhYmxlIHRhYmxlOwotCi0JcHJpdmF0ZSBDaGVja2JveFRhYmxlVmlld2VyIGN0cmxfY2hrYm94VGFibGVWaWV3ZXI7Ci0KLQlwcml2YXRlIFRleHQgY3RybF9hdXRob3I7Ci0KLQlwcml2YXRlIFRleHQgY3RybF92ZXJzaW9uOwotCi0JcHJpdmF0ZSBUZXh0IGN0cmxfYnJpZWZEZXNjOwotCi0JcHJpdmF0ZSBpbnQgY2hlY2tlZENvdW50ID0gMDsKLQotCXByaXZhdGUgQ29sbGVjdGlvbjxNZXRob2RQbHVnaW4+IGNoZWNrZWRQbHVnaW5MaXN0ID0gbmV3IEFycmF5TGlzdDxNZXRob2RQbHVnaW4+KCk7Ci0KLQlwcml2YXRlIFBsdWdpbkV4cG9ydERhdGEgZGF0YTsKLQkKLQlwcml2YXRlIEJ1dHRvbiBzZWxlY3RBbGxCdXR0b247Ci0JCi0JcHJpdmF0ZSBCdXR0b24gZGVzZWxlY3RBbGxCdXR0b247Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBTZWxlY3RQbHVnaW5QYWdlKFBsdWdpbkV4cG9ydERhdGEgZGF0YSkgewotCQlzdXBlcihQQUdFX05BTUUpOwotCQlzZXRUaXRsZShFeHBvcnRSZXNvdXJjZXMuc2VsZWN0UGx1Z2luc1BhZ2VfdGl0bGUpOwotCQlzZXREZXNjcmlwdGlvbihFeHBvcnRSZXNvdXJjZXMuc2VsZWN0UGx1Z2luc1BhZ2VfZGVzYyk7Ci0JCXNldEltYWdlRGVzY3JpcHRvcihFeHBvcnRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcigKLQkJCQkiZnVsbC93aXpiYW4vZXhwX21ldGhfcGx1Z2luX3dpemJhbi5naWYiKSk7IC8vJE5PTi1OTFMtMSQKLQkJdGhpcy5kYXRhID0gZGF0YTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ1BhZ2UjY3JlYXRlQ29udHJvbChDb21wb3NpdGUpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBjb250YWluZXIgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQljb250YWluZXIuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCi0JCUNvbXBvc2l0ZSBjb250YWluZXIxID0gbmV3IENvbXBvc2l0ZShjb250YWluZXIsIFNXVC5OT05FKTsKLQkJY29udGFpbmVyMS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMywgZmFsc2UpKTsKLQkJY3JlYXRlTGFiZWwoY29udGFpbmVyMSwKLQkJCQlFeHBvcnRSZXNvdXJjZXMuc2VsZWN0UGx1Z2luc1BhZ2VfcGx1Z2luc0xhYmVsX3RleHQpOwotCi0JCXNlbGVjdEFsbEJ1dHRvbiA9IGNyZWF0ZUJ1dHRvbigKLQkJCQljb250YWluZXIxLAotCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLkF1dGhvcmluZ1VJUGx1Z2luX1NhdmVBbGxFZGl0b3JzUGFnZV9TZWxlY3RBbGxCdXR0b25MYWJlbCk7Ci0JCWRlc2VsZWN0QWxsQnV0dG9uID0gY3JlYXRlQnV0dG9uKAotCQkJCWNvbnRhaW5lcjEsCi0JCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuQXV0aG9yaW5nVUlQbHVnaW5fU2F2ZUFsbEVkaXRvcnNQYWdlX0Rlc2VsZWN0QWxsQnV0dG9uTGFiZWwpOwotCi0JCWN0cmxfY2hrYm94VGFibGVWaWV3ZXIgPSBjcmVhdGVDaGVja2JveFRhYmxlVmlld2VyKGNvbnRhaW5lciwgMSk7Ci0JCXRhYmxlID0gY3RybF9jaGtib3hUYWJsZVZpZXdlci5nZXRUYWJsZSgpOwotCi0JCU1ldGhvZExpYnJhcnkgbGlicmFyeSA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLQkJCQkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKTsKLQkJTGlzdCBwbHVnaW5zID0gKGxpYnJhcnkgPT0gbnVsbCkgPyBuZXcgQXJyYXlMaXN0KCkgOiBuZXcgQXJyYXlMaXN0KGxpYnJhcnkKLQkJCQkuZ2V0TWV0aG9kUGx1Z2lucygpKTsKLQkJCi0JCWlmIChwbHVnaW5zLnNpemUoKSA+IDEpIHsKLQkJCUNvbXBhcmF0b3IgY29tcGFyYXRvciA9IFByZXNlbnRhdGlvbkNvbnRleHQuSU5TVEFOQ0UuZ2V0Q29tcGFyYXRvcigpOwotCQkJQ29sbGVjdGlvbnMuPE1ldGhvZFBsdWdpbj5zb3J0KHBsdWdpbnMsIGNvbXBhcmF0b3IpOwotCQl9Ci0JCQotCQlJTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyID0gbmV3IExhYmVsUHJvdmlkZXIoKSB7Ci0JCQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCQlyZXR1cm4gTGlicmFyeVVJSW1hZ2VzLklNR19NRVRIT0RfUExVR0lOOwotCQkJfQotCi0JCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikgewotCQkJCQlyZXR1cm4gKChNZXRob2RQbHVnaW4pIGVsZW1lbnQpLmdldE5hbWUoKTsKLQkJCQl9IGVsc2UgewotCQkJCQlyZXR1cm4gZWxlbWVudC50b1N0cmluZygpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQotCQljdHJsX2Noa2JveFRhYmxlVmlld2VyLnNldExhYmVsUHJvdmlkZXIobGFiZWxQcm92aWRlcik7Ci0JCWN0cmxfY2hrYm94VGFibGVWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBBcnJheUNvbnRlbnRQcm92aWRlcigpKTsKLQkJaWYgKHBsdWdpbnMgIT0gbnVsbCkgewotCQkJY3RybF9jaGtib3hUYWJsZVZpZXdlci5zZXRJbnB1dChwbHVnaW5zLnRvQXJyYXkoKSk7Ci0JCX0KLQotCQljcmVhdGVMYWJlbChjb250YWluZXIsIEF1dGhvcmluZ1VJVGV4dC5BVVRIT1JTX1RFWFQpOwotCQljdHJsX2F1dGhvciA9IGNyZWF0ZU11bHRpTGluZVRleHQoY29udGFpbmVyLCAiIiwgMzYwLCA0MCwgMyk7IC8vJE5PTi1OTFMtMSQKLQotCQljcmVhdGVMYWJlbChjb250YWluZXIsIEF1dGhvcmluZ1VJVGV4dC5WRVJTSU9OX1RFWFQpOwotCQljdHJsX3ZlcnNpb24gPSBjcmVhdGVUZXh0KGNvbnRhaW5lciwgIiIsIDM2MCwgMyk7IC8vJE5PTi1OTFMtMSQKLQotCQljcmVhdGVMYWJlbChjb250YWluZXIsIEF1dGhvcmluZ1VJVGV4dC5CUklFRl9ERVNDUklQVElPTl9URVhUKTsKLQkJY3RybF9icmllZkRlc2MgPSBjcmVhdGVNdWx0aUxpbmVUZXh0KGNvbnRhaW5lciwgIiIsIDM2MCwgODAsIDMpOyAvLyROT04tTkxTLTEkCi0KLQkJaWYgKHBsdWdpbnMgIT0gbnVsbCAmJiAhcGx1Z2lucy5pc0VtcHR5KCkpIHsKLQkJCXRhYmxlLnNlbGVjdCgwKTsKLQkJCXNldERpc3BsYXlBdHRyaWJ1dGVzKChNZXRob2RQbHVnaW4pIHBsdWdpbnMuZ2V0KDApKTsKLQkJfQotCi0JCWFkZExpc3RlbmVycyhwbHVnaW5zKTsKLQotCQlzZXRDb250cm9sKGNvbnRhaW5lcik7Ci0JCXNldFBhZ2VDb21wbGV0ZShmYWxzZSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZExpc3RlbmVycyhmaW5hbCBMaXN0PE1ldGhvZFBsdWdpbj4gcGx1Z2lucykgewotCQljdHJsX2Noa2JveFRhYmxlVmlld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcih0aGlzKTsKLQkJY3RybF9jaGtib3hUYWJsZVZpZXdlci5hZGRDaGVja1N0YXRlTGlzdGVuZXIodGhpcyk7Ci0JCQotCQlmaW5hbCBNZXRob2RMaWJyYXJ5IGxpYiA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLQkJCQkJCS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpOwotCQlzZWxlY3RBbGxCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWN0cmxfY2hrYm94VGFibGVWaWV3ZXIuc2V0QWxsQ2hlY2tlZCh0cnVlKTsKLQkJCQlpZiAobGliICE9IG51bGwpIHsKLQkJCQkJY2hlY2tlZFBsdWdpbkxpc3QuY2xlYXIoKTsKLQkJCQkJY2hlY2tlZFBsdWdpbkxpc3QuYWRkQWxsKHBsdWdpbnMpOwotCQkJCQljaGVja2VkQ291bnQgPSBjaGVja2VkUGx1Z2luTGlzdC5zaXplKCk7Ci0JCQkJfQotCQkJCQotCQkJCXNldFBhZ2VDb21wbGV0ZShpc1BhZ2VDb21wbGV0ZSgpKTsKLQkJCQlnZXRXaXphcmQoKS5nZXRDb250YWluZXIoKS51cGRhdGVCdXR0b25zKCk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJd2lkZ2V0U2VsZWN0ZWQoZSk7Ci0JCQl9Ci0KLQkJfSk7Ci0KLQkJZGVzZWxlY3RBbGxCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWN0cmxfY2hrYm94VGFibGVWaWV3ZXIuc2V0QWxsQ2hlY2tlZChmYWxzZSk7Ci0JCQkJaWYgKGxpYiAhPSBudWxsKSB7Ci0JCQkJCWNoZWNrZWRQbHVnaW5MaXN0LmNsZWFyKCk7Ci0JCQkJCWNoZWNrZWRDb3VudCA9IDA7Ci0JCQkJfQotCQkJCQotCQkJCXNldFBhZ2VDb21wbGV0ZShpc1BhZ2VDb21wbGV0ZSgpKTsKLQkJCQlnZXRXaXphcmQoKS5nZXRDb250YWluZXIoKS51cGRhdGVCdXR0b25zKCk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJd2lkZ2V0U2VsZWN0ZWQoZSk7Ci0JCQl9Ci0KLQkJfSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDaGVja1N0YXRlTGlzdGVuZXIjY2hlY2tTdGF0ZUNoYW5nZWQob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DaGVja1N0YXRlQ2hhbmdlZEV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGNoZWNrU3RhdGVDaGFuZ2VkKENoZWNrU3RhdGVDaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJT2JqZWN0IG9iaiA9IGV2ZW50LmdldEVsZW1lbnQoKTsKLQotCQlpZiAob2JqIGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luKSB7Ci0JCQlpZiAoZXZlbnQuZ2V0Q2hlY2tlZCgpKSB7Ci0JCQkJY2hlY2tlZENvdW50Kys7Ci0JCQkJY2hlY2tlZFBsdWdpbkxpc3QuYWRkKChNZXRob2RQbHVnaW4pb2JqKTsKLQkJCX0gZWxzZSB7Ci0JCQkJY2hlY2tlZENvdW50LS07Ci0JCQkJY2hlY2tlZFBsdWdpbkxpc3QucmVtb3ZlKG9iaik7Ci0JCQl9Ci0JCQlzZXRQYWdlQ29tcGxldGUoaXNQYWdlQ29tcGxldGUoKSk7Ci0JCQlnZXRXaXphcmQoKS5nZXRDb250YWluZXIoKS51cGRhdGVCdXR0b25zKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciNzZWxlY3Rpb25DaGFuZ2VkKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKFN0cnVjdHVyZWRTZWxlY3Rpb24pIGV2ZW50Ci0JCQkJLmdldFNlbGVjdGlvbigpOwotCQlpZiAoIXNlbGVjdGlvbi5pc0VtcHR5KCkpIHsKLQkJCU9iamVjdFtdIHBsdWdpbiA9IHNlbGVjdGlvbi50b0FycmF5KCk7Ci0JCQlzZXREaXNwbGF5QXR0cmlidXRlcygoTWV0aG9kUGx1Z2luKSBwbHVnaW5bMF0pOwotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyI2hhbmRsZUV2ZW50KG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCXNldFBhZ2VDb21wbGV0ZShpc1BhZ2VDb21wbGV0ZSgpKTsKLQkJZ2V0V2l6YXJkKCkuZ2V0Q29udGFpbmVyKCkudXBkYXRlQnV0dG9ucygpOwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXREaXNwbGF5QXR0cmlidXRlcyhNZXRob2RQbHVnaW4gcGx1Z2luKSB7Ci0JCWN0cmxfYXV0aG9yLnNldFRleHQocGx1Z2luLmdldEF1dGhvcnMoKSk7Ci0JCWN0cmxfdmVyc2lvbi5zZXRUZXh0KHBsdWdpbi5nZXRWZXJzaW9uKCkpOwotCQljdHJsX2JyaWVmRGVzYy5zZXRUZXh0KHBsdWdpbi5nZXRCcmllZkRlc2NyaXB0aW9uKCkpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2UjaXNQYWdlQ29tcGxldGUoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUGFnZUNvbXBsZXRlKCkgewotCQlpZiAoTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpID09IG51bGwpIHsKLQkJCXNldEVycm9yTWVzc2FnZShMaWJyYXJ5VUlSZXNvdXJjZXMubm9PcGVuTGlicmFyeVdhcm5pbmdfbXNnKTsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCWlmIChnZXRFcnJvck1lc3NhZ2UoKSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlyZXR1cm4gY2hlY2tlZENvdW50ID4gMDsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzYXZlRGF0YVRvTW9kZWwoKSB7Ci0JCWRhdGEuc2V0U2VsZWN0ZWRQbHVnaW5zKGNoZWNrZWRQbHVnaW5MaXN0KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlI2dldE5leHRQYWdlKCkKLQkgKi8KLQlwdWJsaWMgSVdpemFyZFBhZ2UgZ2V0TmV4dFBhZ2UoKSB7Ci0JCXNhdmVEYXRhVG9Nb2RlbCgpOwotCQlQbHVnaW5JbmZvUGFnZSBwYWdlID0gKChFeHBvcnRQbHVnaW5XaXphcmQpIGdldFdpemFyZCgpKS5wYWdlMjsKLQkJcGFnZS5vbkVudGVyUGFnZShudWxsKTsKLQkJcmV0dXJuIHBhZ2U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3dpemFyZHMvcGFja2FnZS5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC93aXphcmRzL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGM3Njc5ZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3dpemFyZHMvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgd2l6YXJkcyBmb3IgZXhwb3J0aW5nIG1ldGhvZCBwbHVnLWlucyBhbmQgY29uZmlndXJhdGlvbnMuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jLy5jbGFzc3BhdGggYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDY1YWMwNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy8ucHJvamVjdCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWEzNmRjNy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2M8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL01FVEEtSU5GL01BTklGRVNULk1GIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMjhkZmUxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5lcGYuaGVscC5kb2M7IHNpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuNS4wLnF1YWxpZmllcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jLkRvY1BsdWdpbgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLAotIG9yZy5lY2xpcHNlLnVpLAotIG9yZy5lY2xpcHNlLmhlbHAKLUVjbGlwc2UtTGF6eVN0YXJ0OiB0cnVlCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtQ2xhc3NQYXRoOiBkb2MuamFyCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9hY2Nlc3NpYmlsaXR5LnhtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9hY2Nlc3NpYmlsaXR5LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTFlMDZjNy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvYWNjZXNzaWJpbGl0eS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPD9OTFMgIFRZUEU9Im9yZy5lY2xpcHNlLmhlbHAudG9jIj8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLTx0b2MgbGFiZWw9IkFjY2Vzc2liaWxpdHkiIGxpbmtfdG89Im1haW4ueG1sI2FjY2Vzc2liaWxpdHlfaWQiPgotICAgPHRvcGljIGxhYmVsPSJBY2Nlc3NpYmlsaXR5IG92ZXJ2aWV3IiBocmVmPSJodG1sL3RvcGljcy9jX2FjY2Vzc2liaWxpdHkuaHRtbCIvPgotICAgPHRvcGljIGxhYmVsPSJTZXR0aW5nIGFjY2Vzc2liaWxpdHkgcHJlZmVyZW5jZXMiIGhyZWY9Imh0bWwvdG9waWNzL3RfYWNjZXNzaWJpbGl0eV9wcmVmZXJlbmNlcy5odG1sIi8+Ci0gICA8dG9waWMgbGFiZWw9IlNlbGVjdGluZyBhbiBhbHRlcm5hdGUgYnJvd3NlciIgaHJlZj0iaHRtbC90b3BpY3MvdF9hY2Nlc3NpYmlsaXR5X3NldF9icm93c2VyLmh0bWwiLz4KLSAgIDx0b3BpYyBsYWJlbD0iS2V5Ym9hcmQgbmF2aWdhdGlvbiIgaHJlZj0iaHRtbC90b3BpY3Mvcl9hY2Nlc3NpYmlsaXR5X25hdmlnYXRpb24uaHRtbCIvPgotICAgPHRvcGljIGxhYmVsPSJGb250cyBhbmQgY29sb3JzIiBocmVmPSJodG1sL3RvcGljcy9yX2FjY2Vzc2liaWxpdHlfZm9udHMuaHRtbCIvPgotPC90b2M+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvYnVpbGQucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNjAwZmE5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotc291cmNlLmRvYy5qYXIgPSBzcmMvCi1vdXRwdXQuZG9jLmphciA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgZG9jLmphcixcCi0gICAgICAgICAgICAgICBkb2MuemlwLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIGFjY2Vzc2liaWxpdHkueG1sLFwKLSAgICAgICAgICAgICAgIGNhdGVnb3JpemluZ19tZXRob2RfY29udGVudC54bWwsXAotICAgICAgICAgICAgICAgY29udGV4dHNfYXV0aG9yaW5nX3VpLnhtbCxcCi0gICAgICAgICAgICAgICBjcmVhdGluZ19tZXRob2RfY29udGVudC54bWwsXAotICAgICAgICAgICAgICAgY3JlYXRpbmdfcHJvY2Vzc2VzLnhtbCxcCi0gICAgICAgICAgICAgICBnZXR0aW5nX3N0YXJ0ZWQueG1sLFwKLSAgICAgICAgICAgICAgIGdsb3NzYXJ5LnhtbCxcCi0gICAgICAgICAgICAgICBtYWluLnhtbCxcCi0gICAgICAgICAgICAgICBvdmVydmlldy54bWwsXAotICAgICAgICAgICAgICAgcHVibGlzaGluZ19leHBvcnRpbmcueG1sLFwKLSAgICAgICAgICAgICAgIHR1dG9yaWFscy54bWwsXAotICAgICAgICAgICAgICAgdmVyc2lvbl9jb250cm9sLnhtbCxcCi0gICAgICAgICAgICAgICBjaGVhdHNoZWV0cy8sXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvY2F0ZWdvcml6ZW1ldGhjb250LnhtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9jYXRlZ29yaXplbWV0aGNvbnQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZDUyNjlhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9jYXRlZ29yaXplbWV0aGNvbnQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTw/TkxTICBUWVBFPSJvcmcuZWNsaXBzZS5oZWxwLnRvYyI/PgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08dG9jIGxhYmVsPSJDYXRlZ29yaXplIG1ldGhvZCBjb250ZW50IiBsaW5rX3RvPSJtYWluLnhtbCNjYXRlZ29yaXplbWV0aG9kY29udF9pZCI+Ci0gICA8dG9waWMgbGFiZWw9Ik1ldGhvZCBjb250ZW50IGNhdGVnb3JpZXMiIGhyZWY9Imh0bWwvaGVscC9jb250ZW50X2NhdGVnb3JpZXMuaHRtbCIvPgotICAgPHRvcGljIGxhYmVsPSJDcmVhdGUgYSBtZXRob2QgdmlldyB3aXRoIGN1c3RvbSBjYXRlZ29yaWVzIiBocmVmPSJodG1sL2hlbHAvY3JlYXRlX2N1c3RvbV9jYXRlZ29yaWVzLmh0bWwiLz4KLTwvdG9jPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2NhdGVnb3JpemluZ19tZXRob2RfY29udGVudC54bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvY2F0ZWdvcml6aW5nX21ldGhvZF9jb250ZW50LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjBiN2VmYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvY2F0ZWdvcml6aW5nX21ldGhvZF9jb250ZW50LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08P05MUyAgVFlQRT0ib3JnLmVjbGlwc2UuaGVscC50b2MiPz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotPHRvYyBsYWJlbD0iQ2F0ZWdvcml6aW5nIG1ldGhvZCBjb250ZW50IiBsaW5rX3RvPSJtYWluLnhtbCNjYXRlZ29yaXppbmdfbWV0aG9kX2NvbnRlbnRfaWQiPiAgCi0gIDx0b3BpYyBsYWJlbD0iU3RhbmRhcmQgYW5kIGN1c3RvbSBjYXRlZ29yaWVzIiBocmVmPSJodG1sL3RvcGljcy9jX21ldGhvZF9jb250ZW50X2NhdGVnb3JpZXMuaHRtbCIvPgotICA8dG9waWMgbGFiZWw9IkNyZWF0ZSBhIG1ldGhvZCB2aWV3IHdpdGggY3VzdG9tIGNhdGVnb3JpZXMiIGhyZWY9Imh0bWwvdG9waWNzL3RfY3JlYXRlX2N1c3RvbV9jYXRlZ29yaWVzLmh0bWwiLz4KLTwvdG9jPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2NoZWF0c2hlZXRzL2FkZG1ldGhvZHJlZl9vcl9oeXBlcmxpbmsueG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2NoZWF0c2hlZXRzL2FkZG1ldGhvZHJlZl9vcl9oeXBlcmxpbmsueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZDk4N2VmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9jaGVhdHNoZWV0cy9hZGRtZXRob2RyZWZfb3JfaHlwZXJsaW5rLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiA/PiAKLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotCi08Y2hlYXRzaGVldCB0aXRsZT0iQWRkIGEgTWV0aG9kIFJlZmVyZW5jZSBvciBIeXBlcmxpbmsgKFVSTCkiPgotCTxpbnRybyAKLQkJaHJlZj0iL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2FkZGFyZWZlcmVuY2Vvcmh5cGVybGluay5odG1sIj4KLQkJPGRlc2NyaXB0aW9uPlRoZXJlIGFyZSB0d28gdHlwZXMgb2YgcmVmZXJlbmNlcyBvciBoeXBlcmxpbmtzIHRvIG90aGVyIGNvbnRlbnQgd2l0aGluIHlvdXIgY29udGVudCB0ZXh0OiByZWZlcmVuY2VzICB0byBvdGhlciBlbGVtZW50cyBpbiB0aGUgbWV0aG9kIGxpYnJhcnkgb3IgcmVmZXJlbmNlcyB0byBleHRlcm5hbCB0ZXh0IG91dHNpZGUgdGhlIG1ldGhvZCBsaWJyYXJ5IHdpdGggYSBVUkwuIFRoaXMgY2hlYXQgc2hlZXQgd2Fsa3MgeW91IHRocm91Z2ggY3JlYXRpbmcgYm90aCB0eXBlcy48L2Rlc2NyaXB0aW9uPgotCTwvaW50cm8+Ci0KLQk8aXRlbQotCQl0aXRsZT0iQ3JlYXRlIGEgSHlwZXJsaW5rIHRvIGFub3RoZXIgZWxlbWVudCBpbiB0aGUgTWV0aG9kIExpYnJhcnkiCi0JCXNraXA9ImZhbHNlIj4KLQkJPGRlc2NyaXB0aW9uPllvdSBjYW4gcmVjb2duaXplIGEgdGV4dCBmaWVsZCB0aGF0IHN1cHBvcnRzIGh5cGVybGlua3MgYnkgdGhlIGxpdHRsZSB0cmlhbmdsZSBuZXh0IHRvIHRoZSB0ZXh0IGZpZWxkJ3MgbGFiZWwuICBUaGlzIHRyaWFuZ2xlIGFsbG93cyB5b3UgdG8gZXhwYW5kIHRoZSB0ZXh0IGZpZWxkIGludG8gYSBmdWxsIHNpemUgZWRpdG9yIHdpdGggYW4gZWRpdG9yIHRvb2xiYXIgcHJvdmlkaW5nIHJpY2ggdGV4dCBlZGl0aW5nIGZ1bmN0aW9uYWxpdHkgc3VjaCBhcyBmb250IHN0eWxlcywgYnVsbGV0IHBvaW50cywgZXRjLjxici8+PGJyLz5UbyBpbnNlcnQgYSBoeXBlcmxpbmsgdG8gYW5vdGhlciBlbGVtZW50IGluIHRoZSBtZXRob2QgbGlicmFyeSBpbiB0aGUgdGV4dCBmaWVsZCBzaW1wbHkgZmluZCB0aGUgZWxlbWVudCBpbiB0aGUgbGlicmFyeSBvciBjb25maWd1cmF0aW9uIHZpZXcgYW5kIGRyYWcgaXQgaW50byBhbiBleHBhbmRlZCBvciBjb2xsYXBzZWQgZm9ybSBmaWVsZC48YnIvPjxici8+QWx0ZXJuYXRpdmVseSwgeW91IGNhbiBhbHNvIHBvc2l0aW9uIHRoZSBjdXJzb3Igd2hlcmUgeW91IHdhbnQgdGhlIGxpbmsgdG8gYmUgYWRkZWQgYW5kIGNsaWNrIHRoZSBBZGQgTGluayBidXR0b24gaW4gdGhlIHRvb2wgYmFyLiBJdCBvcGVucyB0aGUgQWRkIExpbmsgZGlhbG9nIHRoYXQgcHJvdmlkZXMgeW91IGFtb25nc3Qgb3RoZXJzIHdpdGggdGhyZWUgb3B0aW9ucyBmb3IgY3JlYXRpbmcgbGlua3MgdG8gb3RoZXIgY29udGVudCBlbGVtZW50cyBieSBzZWxlY3RpbmcgdGhlIGVsZW1lbnQgdmlhIHRoZSAiQnJvd3NlLi4uIiBidXR0b24uICBFdmVyeSBvcHRpb24gb2ZmZXJzIGEgZGlmZmVyZW50IHdheSBmb3IgZGlzcGxheWluZyB0aGUgbGluaydzIG5hbWU6PGJyLz48YnIvPiJNZXRob2QgRWxlbWVudCI6IGxpbmtzIHRoYXQgZGlzcGxheXMgdGhlIGVsZW1lbnQgbmFtZS4iPGJyLz48YnIvPiJNZXRob2Qgd2l0aCB0eXBlIHByZWZpeCI6IGxpbmsgdGhhdCBkaXNwbGF5cyB0aGUgZWxlbWVudCBuYW1lIGFuZCB0eXBlLjxici8+PGJyLz4iTWV0aG9kIGVsZW1lbnQgd2l0aCBjdXN0b20gdGV4dCI6IGxpbmsgdGhhdCBkaXNwbGF5cyBhIHVzZXIgZGVmaW5lZCB0ZXh0LiBUbyBkZWZpbmUgdGhpcyB0ZXh0IG1hbmlwdWxhdGUgdGhlIHRleHQgaW4gYmV0d2VlbiB0aGUgJmx0O2EmZ3Q7Jmx0Oy9hJmd0OyB0YWdzIGluIHRoZSBVUkwgdGV4dCBmaWVsZCBvbmNlIHlvdSBoYXZlIHNlbGVjdGVkIGFuIGVsZW1lbnQgdXNpbmcgdGhlICJCcm93c2UuLi4iIGJ1dHRvbi48L2Rlc2NyaXB0aW9uPgotCTwvaXRlbT4KLQotCTxpdGVtCi0JCXRpdGxlPSJDcmVhdGUgYSBIeXBlcmxpbmsgdG8gYW4gRXh0ZXJuYWwgcGFnZSB1c2luZyBhIFVSTCIKLQkJc2tpcD0iZmFsc2UiPgotCQk8ZGVzY3JpcHRpb24+VG8gaW5zZXJ0IGEgaHlwZXJsaW5rIHRvIGFuIGV4dGVybmFsIFVSTCwgZXhwYW5kIHRoZSBlZGl0b3IsIHBvc2l0aW9uIHRoZSBjdXJzb3Igd2hlcmUgeW91IHdhbnQgdGhlIGxpbmsgdG8gYmUgYWRkZWQgYW5kIHRoZW4gY2xpY2sgdGhlICJBZGQgTGluayIgYnV0dG9uIGluIHRoZSB0b29sIGJhci4gRmlsbCBpbiB0aGUgZGlhbG9nIHdpdGggdGhlIGxpbmsgVVJMIGRldGFpbHMgYW5kIHRoZW4gY2xpY2sgT0suPC9kZXNjcmlwdGlvbj4KLQk8L2l0ZW0+Ci0JPGl0ZW0gdGl0bGU9IkRvbmUiPjxkZXNjcmlwdGlvbj48L2Rlc2NyaXB0aW9uPjwvaXRlbT4KLTwvY2hlYXRzaGVldD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9jaGVhdHNoZWV0cy9hZGRuZXdtZXRob2Rjb250ZW50LnhtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9jaGVhdHNoZWV0cy9hZGRuZXdtZXRob2Rjb250ZW50LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGM3ZDU0Yi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvY2hlYXRzaGVldHMvYWRkbmV3bWV0aG9kY29udGVudC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgPz4gCi08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLQotPGNoZWF0c2hlZXQgdGl0bGU9IkFkZCBuZXcgTWV0aG9kIENvbnRlbnQgc3VjaCBhcyBSb2xlcywgVGFza3MsIFdvcmsgUHJvZHVjdHMgb3IgR3VpZGFuY2UiPgotCi0JPGludHJvIAotCQlocmVmPSIvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvY3JlYXRlbWV0aG9kY29udGVudC5odG1sIj4KLQkJPGRlc2NyaXB0aW9uPlRoaXMgY2hlYXQgc2hlZXQgZ3VpZGVzIHlvdSB0aG91Z2ggdGhlIHN0ZXBzIG9mIGNyZWF0aW5nIHlvdXIgb3duIG1ldGhvZCBjb250ZW50LiBZb3Ugc2hvdWxkIGFsd2F5cyBjcmVhdGUgbWV0aG9kIGNvbnRlbnQgaW4gYSBtZXRob2QgcGx1Zy1pbiB0aGF0IHlvdSBwcm9kdWNlLiBUaGlzIHNlcGFyYXRlcyB5b3VyIGNvbnRlbnQgZnJvbSBjb250ZW50IHRoYXQgeW91IHJldXNlZCBmcm9tIHRoaXJkIHBhcnRpZXMgYW5kIGFsbG93cyB5b3UgdG8gdXBkYXRlIHlvdXIgb3duIGxpYnJhcnkgd2l0aCBuZXcgcmVsZWFzZXMgb2Ygc3VjaCB0aGlyZCBwYXJ0eSBwbHVnLWlucyB3aXRob3V0IGFmZmVjdGluZyB0aGUgY29udGVudCB0aGF0IHlvdSBoYXZlIGNyZWF0ZWQgaW4geW91ciBvd24gcGx1Zy1pbnMuPGJyLz48YnIvPkFsbCBwbHVnLWlucyBzaGlwcGVkIHdpdGggeW91ciBtZXRob2QgbGlicmFyeSBhcmUgcHJvdGVjdGVkIGZyb20gZGlyZWN0IG1vZGlmaWNhdGlvbi4gQ3JlYXRpbmcgbmV3IGVsZW1lbnRzIGluIHlvdXIgb3duIHBsdWctaW4gYW5kIHRoZW4gcmVsYXRpbmcgdGhvc2UgZWxlbWVudHMgdG8gdGhlIGVsZW1lbnRzIGluIHRoZSBsb2NrZWQgcGx1Zy1pbiBhbGxvd3MgeW91IHRvIHRhaWxvciB0aGUgY29udGVudHMgb2YgdGhlIGxvY2tlZCBwbHVnLWluIGZvciB5b3VyIG93biB1c2UuIElmIHlvdSBoYXZlIG5vdCBjcmVhdGVkIHlvdXIgb3duIG1ldGhvZCBwbHVnLWluLCBwZXJmb3JtIHRoZSAiQ3JlYXRlIHlvdXIgb3duIE1ldGhvZCBQbHVnLWluIiBjaGVhdCBzaGVldCBmaXJzdC48L2Rlc2NyaXB0aW9uPgotCTwvaW50cm8+Ci0KLQk8aXRlbQotCQlocmVmPSIvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvbWV0aG9kY29udGVudHBhY2thZ2UuaHRtbCIKLQkJdGl0bGU9IlNlbGVjdCBvciBDcmVhdGUgYSBDb250ZW50IFBhY2thZ2UiCi0JCXNraXA9ImZhbHNlIj4KLQkJPGRlc2NyaXB0aW9uPkNvbnRlbnQgcGFja2FnZXMgYXJlIHVzZWQgdG8gZ3JvdXAgcmVsYXRlZCBtZXRob2QgY29udGVudCB0b2dldGhlci4gU2luY2UgY29udGVudCBwYWNrYWdlcyBhcmUgc2VsZWN0YWJsZSBhdCBwdWJsaWNhdGlvbiB0aW1lLCBpdCBpcyByZWNvbW1lbmRlZCBwcmFjdGljZSB0byBncm91cCBjb250ZW50IHRoYXQgbmVlZHMgdG8gYmUgcHVibGlzaGVkIHRvZ2V0aGVyIGludG8gdGhlIHNhbWUgY29udGVudCBwYWNrYWdlLjxici8+PGJyLz5GaW5kIHlvdXIgbWV0aG9kIHBsdWctaW4gaW4gdGhlIExpYnJhcnkgdmlldy4gRHJpbGwgaW50byB0aGUgcGx1Zy1pbidzIHBhY2thZ2VzIHRvIGxvY2F0ZSB0aGUgcGFja2FnZSBjYWxsZWQgIkNvbnRlbnQgUGFja2FnZXMiLiBUaGlzIHBhY2thZ2UgY29udGFpbnMgYWxsIHBhY2thZ2VzIHRoYXQgYXJlIGFsbG93ZWQgdG8gY29udGFpbiBtZXRob2QgZWxlbWVudHMuIFNlbGVjdCBhbmQgZXhwYW5kIGEgcGFja2FnZSBpbiB0aGUgIkNvbnRlbnQgUGFja2FnZXMiIGhpZXJhcmNoeSBpbiB3aGljaCB5b3Ugd2FudCB0byBjcmVhdGUgeW91ciBlbGVtZW50LCBvciB0byBjcmVhdGUgYSBuZXcgY29udGVudCBwYWNrYWdlLiBSaWdodCBjbGljayBhIHBhY2thZ2UgYW5kIHNlbGVjdCBOZXcgLSZndDsgQ29udGVudCBQYWNrYWdlLjxici8+PGJyLz5BbiBlZGl0b3Igb3BlbnMgdGhhdCBhbGxvd3MgeW91IHRvIHByb3ZpZGUgYSB1bmlxdWUgbmFtZSBmb3IgdGhlIHBhY2thZ2UgYXMgd2VsbCBhcyB0byBicmllZmx5IGRlc2NyaWJlIGl0cyBwdXJwb3NlLjwvZGVzY3JpcHRpb24+Ci0JPC9pdGVtPgotCi0JPGl0ZW0KLQkJaHJlZj0iL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL21ldGhvZGNvbnRlbnQuaHRtbCIKLQkJdGl0bGU9IkNyZWF0ZSBNZXRob2QgQ29udGVudCBFbGVtZW50IgotCQlza2lwPSJmYWxzZSI+Ci0JCTxkZXNjcmlwdGlvbj5JbiB5b3VyIGV4cGFuZGVkIGNvbnRlbnQgcGFja2FnZSB3aXRoaW4gdGhlIGxpYnJhcnkgdmlldywgcmlnaHQgY2xpY2sgYW55IG9uZSBvZiByb2xlcywgdGFza3MsIHdvcmsgcHJvZHVjdHMsIG9yIGd1aWRhbmNlIHRvIGNyZWF0ZSBhbnkgb2YgdGhlc2UgY29udGVudCBlbGVtZW50cy4gSGlnaGxpZ2h0ICJOZXciIGFuZCB0aGVuIHNlbGVjdCB0aGUgY29uY3JldGUgdHlwZSBvZiB0aGUgZWxlbWVudCB5b3Ugd2FudCB0byBjcmVhdGUgKGUuZy4gZm9yIHdvcmsgcHJvZHVjdHMgY2hvb3NlIGJldHdlZW4gYXJ0aWZhY3QsIG91dGNvbWUsIG9yIGRlbGl2ZXJhYmxlKS4gVGhlIG5ldyBlbGVtZW50IGlzIGNyZWF0ZWQgYW5kIGl0cyByZXNwZWN0aXZlIGVkaXRvciBpcyBvcGVuZWQuPC9kZXNjcmlwdGlvbj4KLQk8L2l0ZW0+Ci0KLQk8aXRlbQotCQl0aXRsZT0iRGV0YWlsIHRoZSBOZXdseSBDcmVhdGVkIE1ldGhvZCBDb250ZW50IEVsZW1lbnQiCi0JCXNraXA9ImZhbHNlIj4KLQkJPGRlc2NyaXB0aW9uPlVzZSB0aGUgZmllbGRzIGluIHRoZSBjb250ZW50IGVsZW1lbnQgZWRpdG9yIHRvIHNwZWNpZnkgdGhlIGNvbnRlbnQgZWxlbWVudCBkZXRhaWxzLiBTdGFydCBieSBhc3NpZ25pbmcgYSB1bmlxdWUgIk5hbWUiIHRvIHRoZSBlbGVtZW50IGFzIHdlbGwgYXMgZ2l2aW5nIGl0IGEgIlByZXNlbnRhdGlvbiBOYW1lIiB0aGF0IHdpbGwgYmUgdXNlZCBhcyB0aGUgZXh0ZXJuYWwgdmlzaWJsZSBuYW1lIHdoZW4gb3RoZXIgZWxlbWVudHMgcmVmZXIgdG8gdGhpcyBlbGVtZW50IG9yIHdoZW4gdGhlIGVsZW1lbnQgaXMgcHVibGlzaGVkLjxici8+PGJyLz5FdmVyeSBlbGVtZW50IG93bnMgc2V2ZXJhbCBzcGVjaWZpYyBjb250ZW50IGZpZWxkcyBkaXN0cmlidXRlZCBvbiBzZXZlcmFsIHN0YWNrZWQgZWRpdG9yIHRhYnMgYW5kIHNlY3Rpb25zIHdpdGhpbiB0aGVzZSB0YWJzIHRoYXQgeW91IGNhbiB1c2UgZm9yIHlvdXIgZGVzY3JpcHRpb25zLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGVzZSBkZXNjcmlwdGlvbiBmaWVsZHMgYXMgd2VsbCBhcyBob3cgdG8gdXNlIHRoZSByaWNoIHRleHQgZWRpdG9yIHNlZSB0aGUgb25saW5lIGhlbHAuPC9kZXNjcmlwdGlvbj4KLQk8L2l0ZW0+Ci0JPGl0ZW0gdGl0bGU9IkRvbmUiPjxkZXNjcmlwdGlvbj48L2Rlc2NyaXB0aW9uPjwvaXRlbT4KLTwvY2hlYXRzaGVldD4KLQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2NoZWF0c2hlZXRzL2FwcGx5Y2FwYWJpbGl0eXBhdHRlcm4ueG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2NoZWF0c2hlZXRzL2FwcGx5Y2FwYWJpbGl0eXBhdHRlcm4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OTg1NDM2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9jaGVhdHNoZWV0cy9hcHBseWNhcGFiaWxpdHlwYXR0ZXJuLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiA/PiAKLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotCi08Y2hlYXRzaGVldCB0aXRsZT0iQXBwbHkgYSBDYXBhYmlsaXR5IFBhdHRlcm4iPgotCi0JPGludHJvIAotCQlocmVmPSIvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvYXBwbHlhY2FwYWJpbGl0eXBhdHRlcm4uaHRtbCI+Ci0JCTxkZXNjcmlwdGlvbj5XaGVuIGRldmVsb3BpbmcgYSBwcm9jZXNzIHlvdSBkbyBub3QgbmVlZCB0byB3b3JrIGZyb20gc2NyYXRjaCBieSBjcmVhdGluZyBhY3Rpdml0aWVzIGFuZCBkZXNjcmlwdG9ycyBvbmUgYnkgb25lLiAgVGhpcyBjaGVhdCBzaGVldCB3YWxrcyB5b3UgdGhyb3VnaCBhcHBseWluZyBwcmUtZGVmaW5lZCBjYXBhYmlsaXR5IHBhdHRlcm5zIG9yIGV2ZW4gY2FwYWJpbGl0eSBwYXR0ZXJuIG9yIGRlbGl2ZXJ5IHByb2Nlc3MgcGFydHMgYXMgYnVpbGRpbmcgYmxvY2tzIHRvIHlvdXIgcHJvY2Vzcy48YnIvPjxici8+QSBjYXBhYmlsaXR5IHBhdHRlcm4gaXMgYSBzcGVjaWFsIHByb2Nlc3MgdGhhdCBkZXNjcmliZXMgYSByZXVzYWJsZSBjbHVzdGVyIG9mIGFjdGl2aXRpZXMgaW4gY29tbW9uIHByb2Nlc3MgYXJlYXMuICBDYXBhYmlsaXRpZXMgcGF0dGVybnMgZXhwcmVzcyBhbmQgY29tbXVuaWNhdGUgcHJvY2VzcyBrbm93bGVkZ2UgZm9yIGEga2V5IGFyZWEgb2YgaW50ZXJlc3Qgc3VjaCBhcyBhIGRpc2NpcGxpbmUgYW5kIGNhbiBiZSBkaXJlY3RseSB1c2VkIGJ5IGEgcHJvY2VzcyBwcmFjdGl0aW9uZXIgdG8gZ3VpZGUgaGlzIHdvcmsuICBUaGV5IGFyZSBhbHNvIHVzZWQgYXMgYnVpbGRpbmcgYmxvY2tzIHRvIGFzc2VtYmxlIGRlbGl2ZXJ5IHByb2Nlc3NlcyBvciBsYXJnZXIgY2FwYWJpbGl0eSBwYXR0ZXJucyBlbnN1cmluZyBvcHRpbWFsIHJldXNlIGFuZCBhcHBsaWNhdGlvbiBvZiB0aGUga2V5IHByYWN0aWNlcyB0aGV5IGV4cHJlc3MuIFlvdSBjYW4gYXBwbHkgdGhlIHNhbWUgcGF0dGVybiBzZXZlcmFsIHRpbWVzIHRvIHRoZSBzYW1lIHByb2Nlc3MgYW5kIGRlZmluZSBsb2NhbCBtb2RpZmljYXRpb25zIHRvIGVhY2ggaW5kaXZpZHVhbCBwYXR0ZXJuIGFwcGxpY2F0aW9uLiBUaGlzIGFsbG93cyB5b3UgdG8gZXhwcmVzcyBzcGVjaWZpYyBjaGFuZ2VzIGVhY2ggdGltZSB0aGUgcGF0dGVybiBpcyBiZWluZyBwZXJmb3JtZWQgdGhyb3VnaG91dCBhIGxpZmVjeWNsZSBhIHByb2Nlc3MgcmVwcmVzZW50cy48L2Rlc2NyaXB0aW9uPgotCTwvaW50cm8+Ci0KLQk8aXRlbQotCQl0aXRsZT0iRmluZCBhbiBBY3Rpdml0eSB0byB3aGljaCBhIFBhdHRlcm4gd2lsbCBiZSBBcHBsaWVkIgotCQlza2lwPSJmYWxzZSI+Ci0JCTxkZXNjcmlwdGlvbj5HaXZlbiB0aGF0IHlvdSBoYXZlIGFscmVhZHkgb3BlbmVkIHlvdXIgcHJvY2VzcyBpbiB0aGUgcHJvY2VzcyBlZGl0b3IsIHN3aXRjaCB0byB0aGUgd29yayBicmVha2Rvd24gc3RydWN0dXJlIHRhYiBhbmQgcmV2aWV3IHlvdXIgcHJvY2Vzcy4gRmluZCB0aGUgbG9jYXRpb24gd2hlcmUgeW91IHdhbnQgdG8gYXBwbHkgYSBjYXBhYmlsaXR5IHBhdHRlcm4uIEEgY2FwYWJpbGl0eSBwYXR0ZXJuIGhhcyB0byBiZSBhcHBsaWVkIHRvIG9uZSBzcGVjaWZpYyBhY3Rpdml0eSAoaW5jbHVkaW5nIGl0ZXJhdGlvbiBvciBwaGFzZSB3aGljaCBhcmUgc3BlY2lhbCBhY3Rpdml0aWVzKSBpbiBhIHByb2Nlc3MuIFN1Y2ggYW4gYWN0aXZpdHkgY2FuIGVpdGhlciBiZSBkZWZpbmVkIGxvY2FsbHkgaW4gdGhlIHByb2Nlc3MgKHByZXNlbnRlZCBhcyBhIG5hbWUgaW4gYSBzdGFuZGFyZCBibGFjayBmb250KSBvciBhbiBhY3Rpdml0eSB3aGljaCBoYWQgYmVlbiBhZGRlZCB0byB0aGUgcHJvY2VzcyBieSBhcHBseWluZyBhbm90aGVyIGNhcGFiaWxpdHkgcGF0dGVybiAocHJlc2VudGVkIGFzIGEgbmFtZSBpbiBhIGdyZWVuLWl0YWxpYyBmb250KS48YnIvPjxici8+SWYgeW91IHdhbnQgdG8gYXBwbHkgYSBwYXR0ZXJuIHRvIGEgbG9jYWwgYWN0aXZpdHkgKGJsYWNrIGZvbnQpLCBnbyB0byBzdGVwICJTZWxlY3QgYSBDYXBhYmlsaXR5IFBhdHRlcm4gaW4gdGhlIENvbmZpZ3VyYXRpb24gVmlldyIuIElmIHlvdSB3YW50IHRvIGFwcGx5IGEgcGF0dGVybiB0byBhbiBhY3Rpdml0eSBmcm9tIGFub3RoZXIgcGF0dGVybiAoZ3JlZW4gaXRhbGljIGZvbnQpLCBwbGVhc2UgZ28gdG8gc3RlcCAiQ29udHJpYnV0ZSB0byBhbiBBY3Rpdml0eSBmcm9tIEFub3RoZXIgUGF0dGVybiIuPC9kZXNjcmlwdGlvbj4KLQk8L2l0ZW0+Ci0KLQk8aXRlbQotCQl0aXRsZT0iQ29udHJpYnV0ZSB0byBhbiBBY3Rpdml0eSBmcm9tIEFub3RoZXIgUGF0dGVybiIKLQkJc2tpcD0idHJ1ZSI+Ci0JCTxkZXNjcmlwdGlvbj5Pbmx5IGlmIHlvdSB3YW50IHRvIGFwcGx5IGEgcGF0dGVybiB0byBhbiBhY3Rpdml0eSBmcm9tIGFub3RoZXIgcGF0dGVybiAocmVjb2duaXphYmxlIGJ5IHRoZSBncmVlbiBpdGFsaWMgZm9udCkgdGhlbiB5b3UgbmVlZCB0byBjcmVhdGUgYW4gYWN0aXZpdHkgY29udHJpYnV0aW9uLCB3aGljaCBhbGxvd3MgeW91IHRvIG1ha2UgbG9jYWwgY2hhbmdlcyB0byB0aGUgYWN0aXZpdHkuPGJyLz48YnIvPkZpbmQgdGhlIGFjdGl2aXR5J3MgcGFyZW50IGVsZW1lbnQuIElmIHRoaXMgZWxlbWVudCBpcyBhIG5vdCBhIGxvY2FsIGVsZW1lbnQgKGdyZWVuIGl0YWxpYyBmb250KSB0aGVuIHlvdSBmaXJzdCBuZWVkIGNyZWF0ZSBhIGNvbnRyaWJ1dGlvbiB0byB0aGlzIHBhcmVudCBhbmQgc28gb24gKGlmIHRoZSBwYXJlbnQncyBwYXJlbnQgaXMgbm90IGxvY2FsIHRoZW4gY3JlYXRlIGEgY29udHJpYnV0aW9uIHRvIHRoZSBwYXJlbnQncyBwYXJlbnQgZmlyc3QsIGV0Yy4pIDxici8+PGJyLz5UbyBjcmVhdGUgYSBjb250cmlidXRpb24gdG8gYSBub24tbG9jYWwgYWN0aXZpdHksIHJpZ2h0LWNsaWNrIHRoZSBub24tbG9jYWwgYWN0aXZpdHkgYW5kIHRoZW4gY2xpY2sgIkNvbnRyaWJ1dGUiLiBEbyB0aGlzIHdpdGggYWxsIHBhcmVudHMgdG9wLWRvd24gdW50aWwgeW91IHJlYWNoIHRoZSBhY3Rpdml0eSB0byB3aGljaCB5b3Ugd2FudCB0byBhcHBseSB0aGUgcGF0dGVybi4gT25jZSB5b3UgY2xpY2tlZCAiQ29udHJpYnV0ZSIsIHRoZSBhY3Rpdml0eSBiZWNvbWUgbG9jYWwgYW5kIGlzIHByZXNlbnRlZCB3aXRoIGEgc3RhbmRhcmQgYmxhY2sgZm9udC48L2Rlc2NyaXB0aW9uPgotCTwvaXRlbT4KLQotCTxpdGVtCi0JCWhyZWY9Ii9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9jb25maWd1cmF0aW9udmlldy5odG1sIiAKLQkJdGl0bGU9IlNlbGVjdCBhIENhcGFiaWxpdHkgUGF0dGVybiBpbiB0aGUgQ29uZmlndXJhdGlvbiBWaWV3IgotCQlza2lwPSJmYWxzZSI+Ci0JCTxkZXNjcmlwdGlvbj5GaW5kIGEgY2FwYWJpbGl0eSBwYXR0ZXJuIGluIHRoZSBjb25maWd1cmF0aW9uIHZpZXcuIEV4cGFuZCB0aGUgcGFja2FnZSAiUHJvY2Vzc2VzIC0mZ3Q7IENhcGFiaWxpdHkgUGF0dGVybnMiIGFzIHdlbGwgYXMgaXRzIHN1Yi1wYWNrYWdlcy4gU2VsZWN0IHRoZSBwYXR0ZXJuIHlvdSB3YW50IHRvIGFwcGx5IHRvIHlvdXIgcHJvY2Vzcy48L2Rlc2NyaXB0aW9uPgotCTwvaXRlbT4KLQotCTxpdGVtCi0JCXRpdGxlPSJBcHBseSB0aGUgQ2FwYWJpbGl0eSBQYXR0ZXJuIG9yIENhcGFiaWxpdHkgUGF0dGVybnMgQWN0aXZpdHkiCi0JCXNraXA9ImZhbHNlIj4KLQkJPGRlc2NyaXB0aW9uPllvdSBjYW4gYXBwbHkgZWl0aGVyIHRoZSB3aG9sZSBjYXBhYmlsaXR5IHBhdHRlcm4gdG8geW91ciBwcm9jZXNzIG9yIGp1c3Qgb25lIG9yIG1vcmUgYWN0aXZpdGllcyBmcm9tIGl0LiBUbyBhcHBseSB0aGUgd2hvbGUgY2FwYWJpbGl0eSBwYXR0ZXJuIGRyYWcgdGhlIHBhdHRlcm4gb3ZlciB0aGUgYWN0aXZpdHkgc2VsZWN0ZWQgZWFybGllciBpbiB5b3VyIHByb2Nlc3MuIFRvIGFwcGx5IG9uZSBvciBtb3JlIGFjdGl2aXRpZXMgb2YgdGhlIGNhcGFiaWxpdHkgcGF0dGVybiBzZWxlY3QgdGhlbSBpbiB0aGUgY29uZmlndXJhdGlvbiB2aWV3LiBZb3UgY2FuIG11bHRpIHNlbGVjdCBieSBwcmVzc2luZyBjdHJsICsgc2VsZWN0LCBvciBzaGlmdCArIHNlbGVjdCB0byBjYXB0dXJlIGFuIGFsbC1pbmNsdXNpdmUgc2VjdGlvbi48YnIvPjxici8+RHJhZyB0aGVtIHRvIHRoZSBhY3Rpdml0eSBzZWxlY3RlZCBlYXJsaWVyIGluIHlvdXIgcHJvY2Vzcy4gQWZ0ZXIgZHJhZ2dpbmcgdGhlIHBhdHRlcm4gb3IgYWN0aXZpdGllcyB5b3Ugd2lsbCBiZSBwcm9tcHRlZCB5b3UgdG8gYXBwbHkgdGhlIHBhdHRlcm4vYWN0aXZpdGllcyB2aWEgRXh0ZW5kcyAoZHluYW1pYyBiaW5kaW5nKSBvciBDb3B5IChTZWUgdGhlIG9ubGluZSBoZWxwIHNlY3Rpb24gIlByb2Nlc3MgQXV0aG9yaW5nIE92ZXJ2aWV3IiBmb3IgbW9yZSBkZXRhaWxzIG9uIHRoZXNlIHR3byBjaG9pY2VzKS4gTWFrZSB5b3VyIGNob2ljZSBieSBjbGlja2luZy48YnIvPjxici8+QXMgYW4gYWx0ZXJuYXRpdmUgdG8gZHJhZ2dpbmcgdGhlIGNhcGFiaWxpdHkgcGF0dGVybiB5b3UgY2FuIGFsc28gcmlnaHQtY2xpY2sgdGhlIGFjdGl2aXR5IHRvIHdoaWNoIHlvdSB3YW50IHRvIGFwcGx5IHRoZSBwYXR0ZXJuIGFuZCBzZWxlY3QgdGhlIG1lbnUgb3B0aW9uICJBcHBseSBQYXR0ZXJuIC0mZ3Q7IENvcHkuLi4iIG9yICJBcHBseSBQYXR0ZXJuIC0mZ3Q7IEV4dGVuZC4uLiI8L2Rlc2NyaXB0aW9uPgotCTwvaXRlbT4KLQkKLQk8aXRlbQotCQl0aXRsZT0iTWFrZSBMb2NhbCBDaGFuZ2VzIHRvIGEgUGF0dGVybiBBcHBsaWNhdGlvbiIKLQkJc2tpcD0idHJ1ZSI+Ci0JCTxkZXNjcmlwdGlvbj5JZiB5b3UgYXBwbGllZCB0aGUgcGF0dGVybiB2aWEgY29weSwgeW91IGNhbiBmcmVlbHkgbWFrZSBtb2RpZmljYXRpb25zIHRvIHRoZSBjb3BpZWQgZWxlbWVudHMuIElmIHlvdSBhcHBsaWVkIHRoZSBwYXR0ZXJuIHZpYSBleHRlbmRzIChkeW5hbWljIGJpbmRpbmcpIHlvdSBjYW4gc3RpbGwgcHJvdmlkZSBsb2NhbCBhZGRpdGlvbnMgdG8gdGhlIHBhdHRlcm4gYnkgZGVmaW5pbmcgYSBjb250cmlidXRpb24gdG8gdGhlIHBhdHRlcm4ncyBhY3Rpdml0aWVzLiBGb2xsb3cgdGhlIGluc3RydWN0aW9ucyBvZiB0aGUgc3RlcCAiQ29udHJpYnV0ZSB0byBhbiBBY3Rpdml0eSBmcm9tIEFub3RoZXIgUGF0dGVybiIgYWJvdmUgdG8gZGVmaW5lIHN1Y2ggYSBjb250cmlidXRpb24uIEFmdGVyIHlvdSBjcmVhdGUgdGhlIGxvY2FsIGFjdGl2aXR5IGNvbnRyaWJ1dGlvbiwgeW91IGNhbiBhZGQgYWRkaXRpb25hbCBkZXNjcmlwdG9ycyBvciBwYXR0ZXJucyB0byB0aGlzIGFjdGl2aXR5LjwvZGVzY3JpcHRpb24+Ci0JPC9pdGVtPgotCQotCTxpdGVtCi0JCXRpdGxlPSJTdXBwcmVzcyBQYXR0ZXJuIEVsZW1lbnRzIgotCQlza2lwPSJ0cnVlIj4KLQkJPGRlc2NyaXB0aW9uPllvdSBjYW4gc3VwcHJlc3MgZWxlbWVudHMgc3VjaCBhcyBkZXNjcmlwdG9ycyBvciBhY3Rpdml0aWVzIG9mIGEgZHluYW1pY2FsbHkgYm91bmRzIHBhdHRlcm4gKHZpYSBleHRlbmRzKSBieSByaWdodCBjbGlja2luZyBhbmQgc2VsZWN0aW5nICJTdXBwcmVzcyIgZnJvbSB0aGUgY29udGV4dCBtZW51LjwvZGVzY3JpcHRpb24+Ci0JPC9pdGVtPgotCTxpdGVtIHRpdGxlPSJEb25lIj48ZGVzY3JpcHRpb24+PC9kZXNjcmlwdGlvbj48L2l0ZW0+Ci08L2NoZWF0c2hlZXQ+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvY2hlYXRzaGVldHMvY3JlYXRlYXByb2Nlc3MueG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2NoZWF0c2hlZXRzL2NyZWF0ZWFwcm9jZXNzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzRjNzk1My4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvY2hlYXRzaGVldHMvY3JlYXRlYXByb2Nlc3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiID8+IAotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci0KLTxjaGVhdHNoZWV0IHRpdGxlPSJDcmVhdGUgYSBQcm9jZXNzIChDYXBhYmlsaXR5IFBhdHRlcm4gb3IgRGVsaXZlcnkgUHJvY2VzcykiPgotCi0JPGludHJvIAotCQlocmVmPSIvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvcHJvY2Vzc2F1dGhvcmluZ292ZXJ2aWV3Lmh0bWwiPgotCQk8ZGVzY3JpcHRpb24+VGhpcyBjaGVhdCBzaGVldCBndWlkZXMgeW91IHRocm91Z2ggdGhlIHN0ZXBzIG9mIGNyZWF0aW5nIGEgUHJvY2Vzcy4gVGhlcmUgYXJlIHR3byBtYWluIHR5cGVzIG9mIHByb2Nlc3NlczogQ2FwYWJpbGl0eSBQYXR0ZXJucyBhbmQgRGVsaXZlcnkgUHJvY2Vzc2VzLiBBIENhcGFiaWxpdHkgUGF0dGVybiBpcyBhIHNwZWNpYWwgUHJvY2VzcyB0aGF0IGRlc2NyaWJlcyBhIHJldXNhYmxlIGNsdXN0ZXIgb2YgQWN0aXZpdGllcyBpbiBjb21tb24gcHJvY2VzcyBhcmVhcywgd2hpbGUgYSBEZWxpdmVyeSBQcm9jZXNzIGRlc2NyaWJlcyBhIGNvbXBsZXRlIGFuZCBpbnRlZ3JhdGVkIGFwcHJvYWNoIGZvciBwZXJmb3JtaW5nIGEgc3BlY2lmaWMgdHlwZSBvZiBkZXZlbG9wbWVudCBwcm9qZWN0LiBTZWUgdGhlIG9ubGluZSBoZWxwIHNlY3Rpb24gIlByb2Nlc3MgQXV0aG9yaW5nIE92ZXJ2aWV3IiBmb3IgbW9yZSBkZXRhaWxzLjwvZGVzY3JpcHRpb24+Ci0JPC9pbnRybz4KLQotCTxpdGVtCi0JCWhyZWY9Ii9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9jcmVhdGVhbWV0aG9kY29uZmlndXJhdGlvbi5odG1sIgotCQl0aXRsZT0iU2VsZWN0IG9yIENyZWF0ZSBhIERlZmF1bHQgTWV0aG9kIENvbmZpZ3VyYXRpb24gZm9yIHlvdXIgUHJvY2VzcyIKLQkJc2tpcD0idHJ1ZSI+Ci0JCTxkZXNjcmlwdGlvbj5Zb3VyIHByb2Nlc3MgY2FuIGNvbnRhaW4gY29udGVudCBmcm9tIG1hbnkgZGlmZmVyZW50IG1ldGhvZCBwbHVnLWlucy4gVGhlIGNvbnRlbnQgZWxlbWVudHMgZnJvbSB0aGVzZSBwbHVnLWlucywgc3VjaCBhcyB0YXNrcyBvciB3b3JrIHByb2R1Y3RzLCBhcHBsaWVkIHRvIHlvdXIgcHJvY2VzcyB2aWEgZHJhZyBhbmQgZHJvcCwgY2FuIGhhdmUgbWFueSBjb250cmlidXRpb25zIG9yIHJlcGxhY2VtZW50cy4gU3VjaCBjb250cmlidXRpb25zIG9yIHJlcGxhY2VtZW50cyBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIHJlbGF0aW9uc2hpcHMgdGhhdCBuZWVkIHRvIGJlIGNvbnNpZGVyZWQgZm9yIGNyZWF0aW5nIHRoZSBwcm9jZXNzIGVsZW1lbnRzIHdpdGggdGhlaXIgbWlycm9yZWQgc2V0IG9mIHJlbGF0aW9uc2hpcHMuPGJyLz48YnIvPkZvciB0aGF0IHJlYXNvbiB5b3UgbmVlZCB0byBkZWZpbmUgYSBjb25maWd1cmF0aW9uIHRoYXQgZGVmaW5lcyB0aGUgdmlzaWJsZSBzZXQgb2YgZWxlbWVudHMgYW5kIHJlbGF0aW9uc2hpcHMgd2hlbiB0aGUgcHJvY2VzcyBpcyBhdXRob3JlZC4gVGhpcyBwcm9jZXNzIGF1dGhvcmluZyBjb25maWd1cmF0aW9uIGlzIHJlZmVycmVkIHRvIGFzIHRoZSAiRGVmYXVsdCBDb25maWd1cmF0aW9uIiBmb3IgdGhlIHByb2Nlc3MgYW5kIHNob3VsZCBkZWZpbmUgdGhlIGxhcmdlc3QgcmVhc29uYWJsZSBzZXQgb2YgbWV0aG9kIHBsdWctaW5zLCBjb250ZW50IHBhY2thZ2VzLCBhbmQgb3RoZXIgcHJvY2Vzc2VzIGZyb20gdGhlIG1ldGhvZCBsaWJyYXJ5IHRoYXQgd2lsbCBiZSByZWZlcnJlZCB0byBieSB0aGUgcHJvY2VzcyBhdCBzb21lIHBvaW50Ljxici8+PGJyLz5JbiBhZGRpdGlvbiB0byB0aGUgZGVmYXVsdCBjb25maWd1cmF0aW9uLCBhIHByb2Nlc3MgY2FuIGJlIGxpbmtlZCB0byBtYW55IGFkZGl0aW9uYWwgbWV0aG9kIGNvbmZpZ3VyYXRpb25zIHRoYXQgaGF2ZSBiZWVuIHZlcmlmaWVkIHRvIGFsc28gcHJvZHVjZSB2YWxpZCByZXN1bHRzLiBIb3dldmVyLCBhbGwgb3RoZXIgdmFsaWQgY29uZmlndXJhdGlvbnMgbmVlZCB0byBkZWZpbmUgc3ViLXNldHMgb2YgdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbi4gIEluIG90aGVyIHdvcmRzLCBpdCBpcyBub3QgcG9zc2libGUgdG8gbGluayBhIG1ldGhvZCBjb25maWd1cmF0aW9uIHRvIGEgcHJvY2VzcyB0aGF0IHJlZmVycyB0byBlbGVtZW50cyB0aGF0IGFyZSBub3QgcGFydCBvZiB0aGUgZGVmYXVsdCBjb25maWd1cmF0aW9uLCBiZWNhdXNlIHN1Y2ggZWxlbWVudHMgd2VyZSBub3QgY29uc2lkZXJlZCB3aGVuIHRoZSBwcm9jZXNzIHdhcyBjcmVhdGVkLjxici8+PGJyLz5Qcm9jZXNzIGVsZW1lbnRzIHRoYXQgcmVmZXIgdG8gY29udGVudCBwYWNrYWdlcyB0aGF0IGFyZSBkZWZpbmVkIG91dHNpZGUgdGhlIHNjb3BlIG9mIHN1Y2ggYSBjb25maWd1cmF0aW9uIHdpbGwgbm90IGJlIHNob3duIGluIHRoZSBwcm9jZXNzIHdoZW4gcHVibGlzaGVkIG9yIHVzZWQgdW5kZXIgc3VjaCBhIGNvbmZpZ3VyYXRpb24uIFRoaXMgYWxsb3dzIHlvdSB0byBlYXNpbHkgaGlkZSBjb250ZW50IGZyb20gYSBwcm9jZXNzIGJ5IG1vdmluZyBjb250ZW50IHBhY2thZ2VzIGluIG9yIG91dCBvZiB0aGUgcmVsYXRlZCBjb25maWd1cmF0aW9uLjxici8+PGJyLz5UaGVyZWZvcmUsIGJlZm9yZSB5b3Ugc3RhcnQgY3JlYXRpbmcgYSBwcm9jZXNzLCByZXZpZXcgeW91ciBsaXN0IG9mIGNvbmZpZ3VyYXRpb25zIGluIHRoZSBsaWJyYXJ5IHZpZXcgYW5kIGRlY2lkZSB3aGljaCBjb25maWd1cmF0aW9uIHlvdSBhcmUgZ29pbmcgdG8gdXNlLiAgSWYgbmVjZXNzYXJ5LCBvcGVuIGNvbmZpZ3VyYXRpb25zIGFuZCBleGFtaW5lIHRoZWlyIHNwZWNpZmljYXRpb24uIElmIHlvdSBkbyBub3QgZmluZCBhIGZpdHRpbmcgY29uZmlndXJhdGlvbiB0aGF0IGRlZmluZXMgdGhlIHJpZ2h0IHNldCBvZiBlbGVtZW50cywgY3JlYXRlIGEgbmV3IG1ldGhvZCBjb25maWd1cmF0aW9uLiAgRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gcHJvY2VzcyBhbmQgbWV0aG9kIGNvbmZpZ3VyYXRpb24gc2VlIHRoZSBzZWN0aW9uICJQcm9jZXNzIEF1dGhvcmluZyBPdmVydmlldyIgaW4gdGhlIG9ubGluZSBoZWxwLjwvZGVzY3JpcHRpb24+Ci0JPC9pdGVtPgotCi0JPGl0ZW0KLQkJaHJlZj0iL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2NyZWF0ZWFtZXRob2RwbHVnaW4uaHRtbCIKLQkJdGl0bGU9IkNob29zZSBhIE1ldGhvZCBQbHVnLWluIHRvIEhvbGQgeW91ciBQcm9jZXNzIgotCQlza2lwPSJmYWxzZSI+Ci0JCTxkZXNjcmlwdGlvbj5TaW5jZSB5b3UgY2Fubm90IGFkZCBwcm9jZXNzZXMgdG8gd3JpdGUtbG9ja2VkIHRoaXJkLXBhcnR5IG1ldGhvZCBwbHVnLWlucyB5b3VyIHByb2Nlc3MgbmVlZHMgdG8gYmUgY3JlYXRlZCBpbiBvbmUgb2YgeW91ciBvd24gbWV0aG9kIHBsdWctaW5zLiBUaGVyZWZvcmUsIGl0IGlzIGJlc3QgdG8gY3JlYXRlIHlvdXIgcHJvY2VzcyB3aXRoaW4gdGhlIHBsdWctaW4gaW4gd2hpY2ggaXQgaXMgZ29pbmcgdG8gYmUgdXNlZC4gRm9yIGluc3RhbmNlLCBpZiB5b3Ugd2FudCB0byBkZXZlbG9wIGEgc2V0IG9mIGNhcGFiaWxpdHkgcGF0dGVybnMgdG8gdXNlIHRvIGFzc2VtYmxlIGEgZGVsaXZlcnkgcHJvY2VzcywgdHJ5IHRvIG1haW50YWluIGFsbCBvZiB0aGUgY2FwYWJpbGl0eSBwYXR0ZXJucyBpbiB0aGUgc2FtZSBtZXRob2QgcGx1Zy1pbi48YnIvPjxici8+SWYgeW91IGhhdmUgbm90IGNyZWF0ZWQgYSBtZXRob2QgcGx1Zy1pbiwgZ28gdG8gdGhlICJDcmVhdGUgeW91ciBvd24gTWV0aG9kIFBsdWctaW4iIGNoZWF0IHNoZWV0Ljxici8+PGJyLz5JbiB0aGUgbGlicmFyeSB2aWV3LCBzZWxlY3QgYSBwbHVnLWluIGZyb20gdGhlIGxpc3Qgb2YgYXZhaWxhYmxlIG1ldGhvZCBwbHVnLWlucy4gSWNvbnMgdGhhdCBhcHBlYXIgdG8gYmUgZ3JheWVkLW91dCBoYXZlIGJlZW4gbG9ja2VkIGZvciBtb2RpZmljYXRpb24gYW5kIGNhbm5vdCBiZSB1c2VkLjwvZGVzY3JpcHRpb24+Ci0JPC9pdGVtPgotCi0JPGl0ZW0KLQkJaHJlZj0iL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3Byb2Nlc3MuaHRtbCIgCi0JCXRpdGxlPSJGaW5kIG9yIENyZWF0ZSBhIFByb2Nlc3MgUGFja2FnZSIKLQkJc2tpcD0iZmFsc2UiPgotCQk8ZGVzY3JpcHRpb24+UHJvY2Vzc2VzIGNhbiBiZSBvcmdhbml6ZWQgd2l0aCBwcm9jZXNzIHBhY2thZ2VzIHRvIGluY3JlYXNlIG1haW50YWluYWJpbGl0eSBhbmQgdG8gbWFrZSBpdCBlYXNpZXIgZm9yIHRoZSBwcm9jZXNzIHVzZXIgdG8gYnJvd3NlIGFuZCBmaW5kIHRoZW0uIFBsZWFzZSBiZSBhd2FyZSB0aGF0IHlvdSBjYW4gY3JlYXRlIGNhcGFiaWxpdHkgcGF0dGVybnMgb25seSBpbiBhIGNhcGFiaWxpdHkgcGF0dGVybnMgcGFja2FnZSBvciBzdWItcGFja2FnZSBhbmQgZGVsaXZlcnkgcHJvY2Vzc2VzIG9ubHkgaW4gYSBkZWxpdmVyeSBwcm9jZXNzIHBhY2thZ2Ugb3Igc3ViLXBhY2thZ2UuPGJyLz48YnIvPlVzaW5nIHRoZSBsaWJyYXJ5IHZpZXcsIHJldmlldyB0aGUgc3RydWN0dXJlIG9mIHByb2Nlc3MgcGFja2FnZXMgYXZhaWxhYmxlIGluIHRoZSBtZXRob2QgcGx1Zy1pbiB0aGF0IHlvdSBzZWxlY3RlZCBvciBjcmVhdGVkIGluIHRoZSBsYXN0IHN0ZXAgYW5kIHRoZW4gc2VsZWN0IG9uZSBvZiB0aGUgcGFja2FnZXMgcHJlc2VudCBhcyBhIGNvbnRhaW5lciBmb3IgeW91ciBwcm9jZXNzLiBBbHRlcm5hdGl2ZWx5LCB5b3UgY2FuIGNyZWF0ZSBhIG5ldyBQcm9jZXNzIFBhY2thZ2UgYnkgcmlnaHQtY2xpY2tpbmcgYSBjYXBhYmlsaXR5IHBhdHRlcm4gb3IgZGVsaXZlcnkgcHJvY2VzcyBwYWNrYWdlIG9yIHN1Yi1wYWNrYWdlIGFuZCB0aGVuIGNsaWNraW5nIE5ldyAtJmd0OyBQcm9jZXNzIFBhY2thZ2UuIEluIHRoZSBkaWFsb2cgYm94IHRoYXQgYXBwZWFycywgc3BlY2lmeSB0aGUgbmFtZSBvZiB0aGUgcGFja2FnZSBhbmQgdGhlbiBjbGljayBPSy48L2Rlc2NyaXB0aW9uPgotCTwvaXRlbT4KLQotCTxpdGVtCi0JCWhyZWY9Ii9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9jcmVhdGVhcmV1c2FibGVjYXBhYmlsaXR5cGF0dGVybi5odG1sIiAKLQkJdGl0bGU9IkNyZWF0ZSB0aGUgQ2FwYWJpbGl0eSBQYXR0ZXJuIG9yIERlbGl2ZXJ5IFByb2Nlc3MiCi0JCXNraXA9ImZhbHNlIj4JCi0JCTxkZXNjcmlwdGlvbj5UbyBjcmVhdGUgYSBuZXcgY2FwYWJpbGl0eSBwYXR0ZXJuIG9yIGRlbGl2ZXJ5IHByb2Nlc3M6IFJpZ2h0IGNsaWNrIHRoZSBzZWxlY3RlZCBvciBuZXdseSBjcmVhdGVkIHByb2Nlc3MgcGFja2FnZSBhbmQgdGhlbiBjbGljayBOZXcgLSZndDsgQ2FwYWJpbGl0eSBQYXR0ZXJuIG9yIE5ldyAtJmd0OyBEZWxpdmVyeSBQcm9jZXNzLiAgSW4gdGhlIGRpYWxvZyBib3ggdGhhdCBhcHBlYXJzLCBzcGVjaWZ5IHRoZSBwcm9jZXNzIG5hbWUgYW5kIGRlZmF1bHQgY29uZmlndXJhdGlvbiBhbmQgdGhlbiBjbGljayBPSy4gVGhlIHByb2Nlc3MgaXMgY3JlYXRlZCBhbmQgdGhlIGVkaXRvciBpcyBvcGVuZWQuPC9kZXNjcmlwdGlvbj4KLQk8L2l0ZW0+Ci0JCi0JPGl0ZW0KLQkJdGl0bGU9IkRvY3VtZW50IHlvdXIgUHJvY2VzcyIKLQkJc2tpcD0iZmFsc2UiPgotCQk8ZGVzY3JpcHRpb24+V2l0aCB0aGUgcHJvY2VzcyBlZGl0b3Igb3BlbmVkIGluIHRoZSBEZXNjcmlwdGlvbiB0YWIsIGRvY3VtZW50IHlvdXIgcHJvY2VzcyB1c2luZyB0aGUgYXZhaWxhYmxlIHRleHQgZmllbGRzLiAgQXQgYSBtaW5pbXVtIHByb3ZpZGUgYSBwcmVzZW50YXRpb24gbmFtZSBhbmQgYSBicmllZiBkZXNjcmlwdGlvbiBmb3IgeW91ciBwcm9jZXNzLiAgU2VlIHRoZSBvbmxpbmUgaGVscCBmb3IgZGVmaW5pdGlvbnMgb2YgZWFjaCBhdmFpbGFibGUgZG9jdW1lbnRhdGlvbiBmaWVsZC48L2Rlc2NyaXB0aW9uPgotCTwvaXRlbT4KLQkKLTxpdGVtCi0JCXRpdGxlPSJEZWNpZGUgb24geW91ciBQcmltYXJ5IFByb2Nlc3MgQXV0aG9yaW5nIFZpZXciCi0JCXNraXA9ImZhbHNlIj4KLQkJPGRlc2NyaXB0aW9uPllvdSBjYW4gZGV2ZWxvcCBhIHByb2Nlc3MgZnJvbSB0aHJlZSBkaWZmZXJlbnQgdmlld3M6PGJyLz48YnIvPkJyZWFrZG93biBTdHJ1Y3R1cmU6ICBDcmVhdGUgeW91ciBwcm9jZXNzIGJ5IGRlZmluaW5nIGEgd29yayBicmVha2Rvd24gc3RydWN0dXJlLiAgQ3JlYXRlIGl0ZXJhdGlvbnMgYW5kIGFjdGl2aXRpZXMgZmlyc3QgYW5kIHRoZW4gcG9wdWxhdGUgeW91ciBhY3Rpdml0aWVzIGJ5IGVpdGhlciBhcHBseWluZyB0YXNrcyBmcm9tIHlvdXIgbWV0aG9kIGNvbnRlbnQgb3IgYXBwbHlpbmcgY2FwYWJpbGl0eSBwYXR0ZXJucy4gR28gdG8gc3RlcCAiRGV2ZWxvcCB0aGUgV29yayBCcmVha2Rvd24gU3RydWN0dXJlIiB0byB3b3JrIHdpdGggdGhpcyB2aWV3Ljxici8+PGJyLz5UZWFtIEFsbG9jYXRpb246IENyZWF0ZSB5b3VyIHByb2Nlc3MgYnkgZGVmaW5pbmcgd2hpY2ggdGVhbXMgYW5kIHJvbGVzIHNoYWxsIHBhcnRpY2lwYXRlIGluIGFjdGl2aXRpZXMgYW5kIGZpbmRpbmcgcmVzcG9uc2libGUgd29yayBwcm9kdWN0cyBhbmQgdGFza3MgZnJvbSB0aGVyZS4gIEdvIHRvIHN0ZXAgIkRldmVsb3AgdGhlIFRlYW0gQWxsb2NhdGlvbiBTdHJ1Y3R1cmUiIHRvIHdvcmsgd2l0aCB0aGlzIHZpZXcuPGJyLz48YnIvPldvcmsgUHJvZHVjdCBVc2FnZTogQ3JlYXRlIHlvdXIgcHJvY2VzcyBieSBkZWZpbmluZyB3aGljaCB3b3JrIHByb2R1Y3RzIHNob3VsZCBiZSBjcmVhdGVkIGluIGFjdGl2aXRpZXMgYW5kIGZpbmRpbmcgdGFza3MgYW5kIHJvbGVzIGZyb20gdGhlcmUuIEdvIHRvIHN0ZXAgIkRldmVsb3AgV29yayBQcm9kdWN0IFVzYWdlIFN0cnVjdHVyZSIgdG8gd29yayB3aXRoIHRoaXMgdmlldy48L2Rlc2NyaXB0aW9uPgotCTwvaXRlbT4KLQotCTxpdGVtCi0JCWhyZWY9Ii9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9kZXZlbG9wYXdvcmticmVha2Rvd25zdHJ1Y3R1cmUuaHRtbCIgCi0JCXRpdGxlPSJEZXZlbG9wIHRoZSBXb3JrIEJyZWFrZG93biBTdHJ1Y3R1cmUiCi0JCXNraXA9InRydWUiPgotCQk8ZGVzY3JpcHRpb24+QmVmb3JlIHlvdSBzdGFydCwgZW5zdXJlIHRoZSBtZXRob2QgY29uZmlndXJhdGlvbiBzZWxlY3RlZCBpbiB0aGUgdG9vbCBiYXIgaXMgdGhlIHNhbWUgYXMgdGhlIGNvbmZpZ3VyYXRpb24geW91IHNlbGVjdGVkIGFzIHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gZm9yIHlvdXIgcHJvY2Vzcy48YnIvPjxici8+VG8gYWNjZXNzIHRoZSB3b3JrIGJyZWFrZG93biBzdHJ1Y3R1cmUgZWRpdG9yLCBzZWxlY3QgdGhlICJXb3JrIEJyZWFrZG93biBTdHJ1Y3R1cmUiIHRhYiBpbiB0aGUgcHJvY2VzcyBlZGl0b3IuPGJyLz48YnIvPlJpZ2h0LWNsaWNrIHRoZSBlbGVtZW50IGluIHRoZSBmaXJzdCByb3cgb2YgdGhlIGJyZWFrZG93biBzdHJ1Y3R1cmUgYW5kIHRoZW4gY2xpY2sgTmV3IENoaWxkIC0mZ3Q7IEFjdGl2aXR5IHRvIGNyZWF0ZSBhIG5ldyBhY3Rpdml0eS4gQWx0ZXJuYXRpdmVseSwgeW91IGNhbiBjcmVhdGUgYSBwaGFzZSBvciBpdGVyYXRpb24sIGRlcGVuZGluZyBvbiB0aGUgc2NvcGUgb2YgeW91ciBwcm9jZXNzLiBJZiBuZWVkZWQsIGNyZWF0ZSBtb3JlIGFjdGl2aXRpZXMgdG8gc2V0LXVwIHlvdXIgYnJlYWtkb3duIHN0cnVjdHVyZS4gQWN0aXZpdGllcyBjYW4gYmUgbmVzdGVkIGluc2lkZSBlYWNoIG90aGVyLjxici8+PGJyLz5SZXZpZXcgdGhlIGxpc3Qgb2YgdGFza3MgaW4gdGhlIGNvbmZpZ3VyYXRpb24gdmlldy4gSW4gdGhpcyB2aWV3IHRhc2tzIGFyZSBzb3J0ZWQgYnkgZGlzY2lwbGluZS4gRHJpbGwgaW50byB0aGUgZGlzY2lwbGluZXMgaGllcmFyY2h5IHRvIHNlZSB3aGljaCB0YXNrcyBhcmUgYXZhaWxhYmxlIGluIHRoaXMgY29uZmlndXJhdGlvbi4gU2VsZWN0IGEgdGFzayB0aGF0IHlvdSB3YW50IHRvIGFkZCB0byB5b3VyIGJyZWFrZG93biBzdHJ1Y3R1cmUgYW5kIGRyYWcgaXQgb24gdG9wIG9mIG9uZSBvZiB0aGUgYWN0aXZpdGllcyB5b3UganVzdCBjcmVhdGVkLiBUaGUgdGFzayBpcyBhZGRlZCBhcyBhIHNvLWNhbGxlZCB0YXNrIGRlc2NyaXB0b3IgKGFuIG9jY3VycmVuY2Ugb2YgYSB0YXNrIGluIG9uZSBzcGVjaWZpYyBhY3Rpdml0eSkuPGJyLz48YnIvPlJldmlldyB0aGUgdGFzayBkZXNjcmlwdG9yJ3MgZGV0YWlscyBpbiBpdHMgcHJvcGVydGllcyB2aWV3LiBJZiB0aGUgcHJvcGVydGllcyB2aWV3IGlzIG5vdCBkaXNwbGF5ZWQgdGhlbiBzZWxlY3QgdGhlIHRhc2sgaW4gdGhlIHdvcmsgYnJlYWtkb3duIHN0cnVjdHVyZSBlZGl0b3IsIHJpZ2h0LWNsaWNrLCBhbmQgc2VsZWN0ICJQcm9wZXJ0aWVzIi4gVXNlIHRoZSB0YWJzIG9uIHRoZSBzaWRlIG9mIHRoZSBwcm9wZXJ0aWVzIHZpZXcgdG8gcmV2aWV3IGRpZmZlcmVudCBhc3BlY3RzIG9mIHRoZSB0YXNrIGRlc2NyaXB0b3IuPGJyLz48YnIvPlBlcmZvcm0gaW5kaXZpZHVhbCBtb2RpZmljYXRpb25zIG9mIHRoZSB0YXNrIGRlc2NyaXB0b3IgaW4gdGhlIHByb3BlcnRpZXMgdmlldy4gIEZvciBleGFtcGxlLCB5b3UgY2FuIGNoYW5nZSB0aGUgcHJlc2VudGF0aW9uIG5hbWUsIGFkZCB0ZXh0dWFsIGRlc2NyaXB0aW9ucywgY2hhbmdlIHBlcmZvcm1pbmcgcm9sZXMsIGNoYW5nZSB0aGUgaW5wdXRzIGFuZCBvdXRwdXRzLCBldGMuIFdoZW4gY2hhbmdpbmcgdGhlIHRhc2sgZGVzY3JpcHRvcidzIHJlbGF0aW9uc2hpcHMgaW4gdGhlIHByb3BlcnR5IHdpbmRvdyB0YWJzIHJvbGVzIG9yIHdvcmsgcHJvZHVjdHMsIHlvdSBjYW4gZWl0aGVyIGFkZCBuZXcgZWxlbWVudHMgZnJvbSB5b3VyIG1ldGhvZCBjb250ZW50IGJ5IHVzaW5nIHRoZSAnQWRkLi4nIGJ1dHRvbiBvciBjb25uZWN0IHlvdXIgdGFzayBkZXNjcmlwdG9yIHdpdGggdGFza3MgYWxyZWFkeSBwcmVzZW50IGluIHRoaXMgYWN0aXZpdHkuPGJyLz48YnIvPkluc3RlYWQgb2YgZHJhZ2dpbmcgdGFzayBvbmUgYnkgb25lIHlvdSBjYW4gYWxzbyBhcHBseSB3aG9sZSBjYXBhYmlsaXR5IHBhdHRlcm5zIG9yIGFjdGl2aXRpZXMgZnJvbSBvdGhlciBwcm9jZXNzZXMgYXZhaWxhYmxlIGluIHlvdXIgY3VycmVudCBtZXRob2QgY29uZmlndXJhdGlvbi4gIFNlbGVjdCBhIGNhcGFiaWxpdHkgcGF0dGVybiBvciBhbnkgYWN0aXZpdHkgb2Ygc3VjaCBhIHBhdHRlcm4gb3IgZGVsaXZlcnkgcHJvY2VzcyBhdmFpbGFibGUgaW4gdGhlIGNvbmZpZ3VyYXRpb24gdmlldyBhbmQgZHJhZyBpdCBvbiB0b3Agb2YgYW4gYWN0aXZpdHkgd2l0aGluIHlvdXIgcHJvY2VzcyBicmVha2Rvd24gaW4gdGhlIHByb2Nlc3MgZWRpdG9yLiAoRmluZCBhIGRldGFpbGVkIHdhbGt0aHJvdWdoIHRvIGFwcGx5aW5nIGNhcGFiaWxpdHkgcGF0dGVybiBpbiB0aGUgY2hlYXQgc2hlZXQgIkFwcGx5IGEgQ2FwYWJpbGl0eSBQYXR0ZXJuIi4pPGJyLz48YnIvPkNvbnRpbnVlIGFkZGluZyBtb3JlIHRhc2tzLCBhY3Rpdml0aWVzIG9yIHBhdHRlcm5zIHRvIHlvdXIgYWN0aXZpdGllcyBvciBzd2l0Y2ggdG8gdGhlIHRlYW0gYWxsb2NhdGlvbiB0YWIgdG8gYWRkIHJvbGVzIG9yIHRvIHRoZSB3b3JrIHByb2R1Y3QgdXNhZ2UgdGFiIHRvIGFkZCB3b3JrIHByb2R1Y3RzLjwvZGVzY3JpcHRpb24+Ci0JPC9pdGVtPgotCi08aXRlbQotCQlocmVmPSIvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvZGV2ZWxvcGF0ZWFtYWxsb2NhdGlvbnN0cnVjdHVyZS5odG1sIiAKLQkJdGl0bGU9IkRldmVsb3AgdGhlIFRlYW0gQWxsb2NhdGlvbiBTdHJ1Y3R1cmUiCi0JCXNraXA9InRydWUiPgotCQk8ZGVzY3JpcHRpb24+QmVmb3JlIHlvdSBzdGFydCwgZW5zdXJlIHRoZSBjb25maWd1cmF0aW9uIHNlbGVjdGVkIGluIHRoZSB0b29sIGJhciBpcyB0aGUgc2FtZSBhcyB0aGUgY29uZmlndXJhdGlvbiB5b3Ugc2VsZWN0ZWQgYXMgdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbiBmb3IgeW91ciBwcm9jZXNzLjxici8+PGJyLz5JbiB0aGUgcHJvY2VzcyBlZGl0b3IsIGNsaWNrIHRoZSAiVGVhbSBBbGxvY2F0aW9uIiB0YWIgdG8gb3BlbiB0aGUgdGVhbSBhbGxvY2F0aW9uIGVkaXRvci48YnIvPjxici8+UmlnaHQtY2xpY2sgdGhlIGVsZW1lbnQgaW4gdGhlIGZpcnN0IHJvdyBvZiB0aGUgYnJlYWtkb3duIHN0cnVjdHVyZSBhbmQgdGhlbiBjbGljayBOZXcgQ2hpbGQgLSZndDsgQWN0aXZpdHkgdG8gY3JlYXRlIGEgbmV3IGFjdGl2aXR5LiBBbHRlcm5hdGl2ZWx5LCB5b3UgY2FuIGNyZWF0ZSBhIHBoYXNlIG9yIGl0ZXJhdGlvbiwgZGVwZW5kaW5nIG9uIHRoZSBzY29wZSBvZiB5b3VyIHByb2Nlc3MuIElmIG5lZWRlZCwgY3JlYXRlIG1vcmUgYWN0aXZpdGllcyB0byBzZXQtdXAgeW91ciBicmVha2Rvd24gc3RydWN0dXJlLiBBY3Rpdml0aWVzIGNhbiBiZSBuZXN0ZWQgaW5zaWRlIGVhY2ggb3RoZXIuPGJyLz48YnIvPllvdSBjYW4gYWRkIHJvbGVzIGRpcmVjdGx5IHRvIHlvdXIgYWN0aXZpdGllcyBub3cuIEluIHRoZSBjb25maWd1cmF0aW9uIHZpZXcsIHJldmlldyB0aGUgbGlzdCBvZiByb2xlcy4gSW4gdGhpcyB2aWV3IHJvbGVzIGFyZSBvcmdhbml6ZWQgaW50byByb2xlIHNldHMuIERyaWxsIGludG8gdGhlIHJvbGUgc2V0cyBoaWVyYXJjaHkgdG8gc2VlIHdoaWNoIHJvbGVzIGFyZSBhdmFpbGFibGUgaW4gdGhpcyBjb25maWd1cmF0aW9uLiBTZWxlY3QgYSBSb2xlIHRoYXQgeW91IHdhbnQgdG8gYWRkIHRvIHlvdXIgYWN0aXZpdHkgYW5kIGRyYWcgaXQgb24gdG9wIG9mIHRoZSBhY3Rpdml0eSB5b3UgY3JlYXRlZCBlYXJsaWVyLiBUaGUgcm9sZSBpcyBhZGRlZCBhcyBhIHJvbGUgZGVzY3JpcHRvciAoYW4gb2NjdXJyZW5jZSBvZiBhIHJvbGUgaW4gb25lIHNwZWNpZmljIGFjdGl2aXR5KS48YnIvPjxici8+SWYgdGhlIHJvbGUgdGhhdCB5b3UganVzdCBkcmFnZ2VkIGhhcyByZXNwb25zaWJpbGl0eSByZWxhdGlvbnNoaXBzIHRvIHdvcmsgcHJvZHVjdHMgZGVmaW5lZCwgYSB3aXphcmQgYXBwZWFycyBwcm9tcHRpbmcgeW91IHRvIGFkZCBhbnkgb2YgdGhlIHdvcmsgcHJvZHVjdHMgdG8gdGhlIHByb2Nlc3MuIFNlbGVjdCB6ZXJvIHRvIG1hbnkgd29yayBwcm9kdWN0cyBhbmQgdGhlbiBjbGljayBPSy48YnIvPjxici8+Rm9yIGVhY2ggc2VsZWN0ZWQgd29yayBwcm9kdWN0IHRoZSBuZXh0IHdpemFyZCB3aW5kb3cgcHJvbXB0cyB5b3UgdG8gc2VsZWN0IHRhc2tzIHRoYXQgcHJvZHVjZSB0aGVzZSB3b3JrIHByb2R1Y3RzLiBBZ2Fpbiwgc2VsZWN0IHplcm8gdG8gbWFueSB0YXNrcyBhbmQgdGhlbiBjbGljayBPSyB0byBhZGQgdGhlc2UgZWxlbWVudHMgdG8geW91ciBwcm9jZXNzLjxici8+PGJyLz5SZXZpZXcgdGhlIHJvbGUgZGVzY3JpcHRvcidzIGRldGFpbHMgaW4gaXRzIHByb3BlcnRpZXMgdmlldy4gSWYgdGhlIHByb3BlcnRpZXMgdmlldyBpcyBub3QgZGlzcGxheWVkIHRoZW4gc2VsZWN0IHRoZSByb2xlIGluIHRoZSBicmVha2Rvd24gc3RydWN0dXJlIGVkaXRvciwgcmlnaHQtY2xpY2ssIGFuZCBzZWxlY3QgIlByb3BlcnRpZXMiLiBVc2UgdGhlIHRhYnMgb24gdGhlIHNpZGUgb2YgdGhlIHByb3BlcnRpZXMgdmlldyB0byByZXZpZXcgZGlmZmVyZW50IGFzcGVjdHMgb2YgdGhlIHJvbGUgZGVzY3JpcHRvci4gWW91IGNhbiBhbHNvIHBlcmZvcm0gaW5kaXZpZHVhbCBtb2RpZmljYXRpb25zIG9mIHRoZSByb2xlIGRlc2NyaXB0b3IsIHN1Y2ggYXMgY2hhbmdlIHRoZSBwcmVzZW50YXRpb24gbmFtZSwgYWRkIHRleHR1YWwgZGVzY3JpcHRpb25zLCBjaGFuZ2Ugd29yayBwcm9kdWN0cyB0aGUgcm9sZSBpcyByZXNwb25zaWJsZSBmb3IsIGV0Yy48YnIvPjxici8+V2hlbiBjaGFuZ2luZyB0aGUgcm9sZSBkZXNjcmlwdG9y4oCZcyByZWxhdGlvbnNoaXBzIGluIHRoZSBwcm9wZXJ0eSB3aW5kb3cgdGFi4oCZcyByb2xlcyBvciB3b3JrIHByb2R1Y3RzLCB5b3UgY2FuIGFkZCBuZXcgZWxlbWVudHMgZnJvbSB5b3VyIG1ldGhvZCBjb250ZW50IGJ5IHVzaW5nIHRoZSAiQWRk4oCmIiBidXR0b24sIG9yIGNvbm5lY3QgeW91ciByb2xlIGRlc2NyaXB0b3Igd2l0aCB3b3JrIHByb2R1Y3RzIGFscmVhZHkgcHJlc2VudCBpbiB0aGlzIGFjdGl2aXR5Ljxici8+PGJyLz5Db250aW51ZSBhZGRpbmcgbW9yZSByb2xlcyB0byB5b3VyIGFjdGl2aXRpZXMsIG9yIHN3aXRjaCB0byB0aGUgd29yayBicmVha2Rvd24gc3RydWN0dXJlIHRhYiB0byBhZGQgdGFza3Mgb3IgdG8gdGhlIHdvcmsgcHJvZHVjdCB1c2FnZSB0YWIgdG8gYWRkIHdvcmsgcHJvZHVjdHMuPC9kZXNjcmlwdGlvbj4KLQk8L2l0ZW0+Ci0KLTxpdGVtCi0JCWhyZWY9Ii9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9kZXZlbG9wYXdvcmtwcm9kdWN0dXNhZ2VzdHJ1Y3R1cmUuaHRtbCIgCi0JCXRpdGxlPSJEZXZlbG9wIHRoZSBXb3JrIFByb2R1Y3QgVXNhZ2UgU3RydWN0dXJlIgotCQlza2lwPSJ0cnVlIj4KLQkJPGRlc2NyaXB0aW9uPkJlZm9yZSB5b3Ugc3RhcnQsIGVuc3VyZSB0aGUgY29uZmlndXJhdGlvbiBzZWxlY3RlZCBpbiB0aGUgdG9vbCBiYXIgaXMgdGhlIHNhbWUgYXMgdGhlIGNvbmZpZ3VyYXRpb24geW91IHNlbGVjdGVkIGFzIHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gZm9yIHlvdXIgcHJvY2Vzcy48YnIvPjxici8+SW4gdGhlIHByb2Nlc3MgZWRpdG9yLCBjbGljayB0aGUgIldvcmsgUHJvZHVjdCBVc2FnZSIgdGFiIHRvIG9wZW4gdGhlIHdvcmsgcHJvZHVjdCB1c2FnZSBlZGl0b3IuPGJyLz48YnIvPlJpZ2h0LWNsaWNrIHRoZSBlbGVtZW50IGluIHRoZSBmaXJzdCByb3cgb2YgdGhlIGJyZWFrZG93biBzdHJ1Y3R1cmUgYW5kIHRoZW4gY2xpY2sgTmV3IENoaWxkIC0mZ3Q7IEFjdGl2aXR5IHRvIGNyZWF0ZSBhIG5ldyBhY3Rpdml0eS4gQWx0ZXJuYXRpdmVseSwgeW91IGNhbiBjcmVhdGUgYSBwaGFzZSBvciBpdGVyYXRpb24sIGRlcGVuZGluZyBvbiB0aGUgc2NvcGUgb2YgeW91ciBwcm9jZXNzLiBJZiBuZWVkZWQsIGNyZWF0ZSBtb3JlIGFjdGl2aXRpZXMgdG8gc2V0LXVwIHlvdXIgYnJlYWtkb3duIHN0cnVjdHVyZS4gQWN0aXZpdGllcyBjYW4gYmUgbmVzdGVkIGluc2lkZSBlYWNoIG90aGVyLjxici8+PGJyLz5SZXZpZXcgdGhlIGxpc3Qgb2Ygd29yayBwcm9kdWN0cyBpbiB0aGUgY29uZmlndXJhdGlvbiB2aWV3LiBJbiB0aGlzIHZpZXcgd29yayBwcm9kdWN0cyBhcmUgc29ydGVkIGJ5IGRvbWFpbiBhcyB3ZWxsIGFzIHdvcmsgcHJvZHVjdCB0eXBlcy4gIERyaWxsIGludG8gZWl0aGVyIG9mIHRoZXNlIGhpZXJhcmNoaWVzIHRvIHNlZSB3aGljaCB3b3JrIHByb2R1Y3RzIGFyZSBhdmFpbGFibGUgaW4gdGhpcyBjb25maWd1cmF0aW9uLiBTZWxlY3QgYSB3b3JrIHByb2R1Y3QgeW91IHdhbnQgdG8gYWRkIHRvIGFuIGFjdGl2aXR5IGFuZCB0aGVuIGRyYWcgaXQgb24gdG9wIG9mIGFuIEFjdGl2aXR5IHRoYXQgeW91IGNyZWF0ZWQgZWFybGllci4gVGhlIHdvcmsgcHJvZHVjdCBpcyBhZGRlZCBhcyBhIHdvcmsgcHJvZHVjdCBkZXNjcmlwdG9yIChhbiBvY2N1cnJlbmNlIG9mIGEgd29yayBwcm9kdWN0IGluIG9uZSBzcGVjaWZpYyBhY3Rpdml0eSkuPGJyLz48YnIvPkFmdGVyIHlvdSBoYXZlIGFkZGVkIHRoZSB3b3JrIHByb2R1Y3QgdG8gdGhlIGFjdGl2aXR5LCBhIHdpemFyZCBwcm9tcHRzIHlvdSB0byBhZGQgdGFza3MgdGhhdCBwcm9kdWNlIHRoaXMgd29yayBwcm9kdWN0IHRvIHRoaXMgYWN0aXZpdHkuIFNlbGVjdCB6ZXJvIHRvIG1hbnkgdGFza3MgYW5kIHRoZW4gY2xpY2sgT0suIFRoZSB3aXphcmQgYWRkcyB0YXNrIGRlc2NyaXB0b3JzIGZvciBlYWNoIHNlbGVjdGVkIHRhc2sgdG8gdGhlIHdvcmsgYnJlYWtkb3duIHN0cnVjdHVyZS48YnIvPjxici8+UmV2aWV3IHRoZSBuZXcgd29yayBwcm9kdWN0IGRlc2NyaXB0b3LigJlzIGRldGFpbHMgaW4gaXRzIHByb3BlcnRpZXMgdmlldy4gSWYgdGhlIHByb3BlcnRpZXMgdmlldyBpcyBub3QgZGlzcGxheWVkIHRoZW4gc2VsZWN0IHRoZSB3b3JrIHByb2R1Y3QgZGVzY3JpcHRvciBpbiB0aGUgcHJvY2VzcyBlZGl0b3IsIHJpZ2h0LWNsaWNrLCBhbmQgc2VsZWN0ICJQcm9wZXJ0aWVzIi4gVXNlIHRoZSB0YWJzIG9uIHRoZSBzaWRlIG9mIHRoZSBwcm9wZXJ0aWVzIHZpZXcgdG8gcmV2aWV3IGRpZmZlcmVudCBhc3BlY3RzIG9mIHRoZSB3b3JrIHByb2R1Y3QgZGVzY3JpcHRvci4gWW91IGNhbiBhbHNvIHBlcmZvcm0gaW5kaXZpZHVhbCBtb2RpZmljYXRpb25zIG9mIHRoZSByb2xlIGRlc2NyaXB0b3IsIHN1Y2ggYXMgY2hhbmdlIHRoZSBwcmVzZW50YXRpb24gbmFtZSBhZGQgdGV4dHVhbCBkZXNjcmlwdGlvbnMsIGFkZCBlbnRyeSBhbmQgZXhpdCBzdGF0ZXMsIGV0Yy48YnIvPjxici8+V2hlbiBjaGFuZ2luZyB0aGUgcm9sZSBkZXNjcmlwdG9y4oCZcyByZWxhdGlvbnNoaXBzIGluIHRoZSBwcm9wZXJ0eSB3aW5kb3cgdGFi4oCZcyByb2xlcyBvciB3b3JrIHByb2R1Y3RzLCB5b3UgY2FuIGFkZCBuZXcgZWxlbWVudHMgZnJvbSB5b3VyIG1ldGhvZCBjb250ZW50IGJ5IHVzaW5nIHRoZSAiQWRk4oCmIiBidXR0b24sIG9yIGNvbm5lY3QgeW91ciByb2xlIGRlc2NyaXB0b3Igd2l0aCB3b3JrIHByb2R1Y3RzIGFscmVhZHkgcHJlc2VudCBpbiB0aGlzIEFjdGl2aXR5Ljxici8+PGJyLz5Db250aW51ZSBieSBhZGRpbmcgbW9yZSB3b3JrIHByb2R1Y3RzIHRvIHlvdXIgYWN0aXZpdGllcywgb3Igc3dpdGNoIHRvIHRoZSB3b3JrIGJyZWFrZG93biBzdHJ1Y3R1cmUgdGFiIHRvIGFkZCB0YXNrcyBvciB0aGUgdGVhbSBhbGxvY2F0aW9uIHRhYiB0byBhZGQgcm9sZXMuPC9kZXNjcmlwdGlvbj4KLQk8L2l0ZW0+Ci0KLTxpdGVtCi0JCWhyZWY9Ii9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9hcHBseWFjYXBhYmlsaXR5cGF0dGVybi5odG1sIiAKLQkJdGl0bGU9IkFwcGx5IGEgQ2FwYWJpbGl0eSBQYXR0ZXIgb3IgQ2FwYWJpbGl0eSBQYXR0ZXJuJ3MgQWN0aXZpdHkiCi0JCXNraXA9InRydWUiPgotCQk8ZGVzY3JpcHRpb24+WW91IGRvIG5vdCBuZWVkIHRvIGRldmVsb3AgeW91ciBwcm9jZXNzIGZyb20gc2NyYXRjaCBieSBhZGRpbmcgZGVzY3JpcHRvcnMgb25lIGJ5IG9uZSBhcyBkZXNjcmliZWQgaW4gdGhlIGxhc3Qgc3RlcHMuICBZb3UgY2FuIGFsc28gcmV1c2UgZXhpc3RpbmcgY2FwYWJpbGl0eSBwYXR0ZXJucyBvciBldmVuIGNhcGFiaWxpdHkgcGF0dGVybiBwYXJ0cy4gR28gdG8gdGhlIGNoZWF0IHNoZWV0ICJBcHBseSBhIENhcGFiaWxpdHkgUGF0dGVybiIgdG8gc2VlIGhvdy48L2Rlc2NyaXB0aW9uPgotCTwvaXRlbT4KLQk8aXRlbSB0aXRsZT0iRG9uZSI+PGRlc2NyaXB0aW9uPjwvZGVzY3JpcHRpb24+PC9pdGVtPgotPC9jaGVhdHNoZWV0PgotCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvY2hlYXRzaGVldHMvY3JlYXRlbWV0aG9kY29uZmlndXJhdGlvbi54bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvY2hlYXRzaGVldHMvY3JlYXRlbWV0aG9kY29uZmlndXJhdGlvbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwYmQzMDQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2NoZWF0c2hlZXRzL2NyZWF0ZW1ldGhvZGNvbmZpZ3VyYXRpb24ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiID8+IAotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci0KLTxjaGVhdHNoZWV0IHRpdGxlPSJDcmVhdGUgeW91ciBvd24gTWV0aG9kIENvbmZpZ3VyYXRpb24iPgotCTxpbnRybyBocmVmPSIvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvY3JlYXRlYW1ldGhvZGNvbmZpZ3VyYXRpb24uaHRtbCI+Ci0JCTxkZXNjcmlwdGlvbj5UaGlzIGNoZWF0IHNoZWV0IGd1aWRlcyB5b3UgdGhvdWdoIHRoZSBzdGVwcyBvZiBjcmVhdGluZyB5b3VyIG93biBtZXRob2QgY29uZmlndXJhdGlvbi4gQmVjYXVzZSB0aGUgbWV0aG9kIGxpYnJhcnkgY2FuIGNvbnRhaW4gbGFyZ2UgbnVtYmVycyBvZiBlbGVtZW50cywgeW91IG1heSB3YW50IHRvIGxpbWl0IHlvdXIgd29yayB0byBhIHVzZXItZGVmaW5lZCBzdWJzZXQgb2YgdGhlIGxpYnJhcnkgY2FsbGVkIG1ldGhvZCBjb25maWd1cmF0aW9uLiBBIG1ldGhvZCBjb25maWd1cmF0aW9uIGRlZmluZXMgYSB3b3JraW5nIHNldCBvZiBwYWNrYWdlcyB3aXRoaW4gdGhlIG1ldGhvZCBsaWJyYXJ5IHRoYXQgaGVscHMgeW91IGxpbWl0IHlvdXIgdmlldyB0byBhIHN1YnNldCBvZiBhbGwgZWxlbWVudHMuIE1ldGhvZCBjb25maWd1cmF0aW9ucyBhcmUgbm90IG9ubHkgdXNlZCBmb3IgY3JlYXRpbmcgcHJvY2Vzc2VzICh5b3UgZHJhZyBhbmQgZHJvcCBlbGVtZW50cyBpbnRvIGEgcHJvY2VzcyBmcm9tIGhlcmUpLCBidXQgYWxzbyBmb3IgcHVibGljYXRpb24sIGJlY2F1c2UgYSBjb25maWd1cmF0aW9uIGRlZmluZXMgd2hpY2ggZWxlbWVudHMgd2lsbCBiZSBwdWJsaXNoZWQgaW4gSFRNTCBhbmQgd2hpY2ggd2lsbCBub3QuPGJyLz48YnIvPlRoZSBlbGVtZW50cyB0aGF0IGFyZSBwYXJ0IG9mIGEgc2VsZWN0ZWQgY29uZmlndXJhdGlvbiBhcmUgZGlzcGxheWVkIGluIHRoZSBjb25maWd1cmF0aW9uIHZpZXcuIFRoZSBjb25maWd1cmF0aW9uIHZpZXcgYWxsb3dzIHlvdSB0byBicm93c2UgdGhlIGNvbGxlY3Rpb24gb2YgbWV0aG9kIGVsZW1lbnRzIHRoYXQgYXJlIHBhcnQgb2YgdGhlIHNlbGVjdGVkIGNvbmZpZ3VyYXRpb24sIGFuZCB0byBwb3B1bGF0ZSBwcm9jZXNzZXMgYnkgZHJhZ2dpbmcgZWxlbWVudHMgZnJvbSB0aGUgY29uZmlndXJhdGlvbiB2aWV3IGludG8gdGhlIHByb2Nlc3MgZWRpdG9yLjwvZGVzY3JpcHRpb24+Ci0JPC9pbnRybz4KLQotCTxpdGVtCi0JCWhyZWY9Ii9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9tZXRob2Rjb25maWd1cmF0aW9ucy5odG1sIgotCQl0aXRsZT0iUHJlcGFyZSBDcmVhdGluZyBhIE1ldGhvZCBDb25maWd1cmF0aW9uIgotCQlza2lwPSJmYWxzZSI+Ci0JCTxkZXNjcmlwdGlvbj5CZWZvcmUgY3JlYXRpbmcgYSBtZXRob2QgY29uZmlndXJhdGlvbiB5b3Ugc2hvdWxkIGRldGVybWluZSB5b3VyIG5lZWRzIGFuZCBnb2FscyBmb3IgdGhlIGNvbmZpZ3VyYXRpb24uIE9uZSBzY2VuYXJpbyBmb3IgY3JlYXRpbmcgYSBtZXRob2QgY29uZmlndXJhdGlvbiBpcyB0aGF0IHlvdSBoYXZlIGFscmVhZHkgY3JlYXRlZCBhIG5ldyBtZXRob2QgcGx1Zy1pbiBpbiB3aGljaCB5b3Ugd2FudCB0byBkZWZpbmUgbWV0aG9kIGVsZW1lbnRzIHRoYXQgZXh0ZW5kIGFuIGFscmVhZHkgZXhpc3RpbmcgcGx1Zy1pbi4gSW4gdGhpcyBjYXNlLCB5b3UgbmVlZCB0byBjcmVhdGUgYSBjb25maWd1cmF0aW9uIHRoYXQgaW5jbHVkZXMgeW91ciBuZXcgcGx1Zy1pbiBhcyB3ZWxsIGFzIHRoZSBleGlzdGluZyBwbHVnLWluLiBJZiB5b3Ugd2FudCB0byBjcmVhdGUgeW91ciBvd24gbWV0aG9kIHBsdWctaW4gZmlyc3QgdGhlbiBnbyB0aGUgY2hlYXQgIkNyZWF0ZSB5b3VyIG93biBNZXRob2QgUGx1Zy1pbiIuPGJyLz48YnIvPkFub3RoZXIgc2NlbmFyaW8gZm9yIGNyZWF0aW5nIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24gaXMgdGhhdCB5b3Ugd2FudCB0byBkZWZpbmUgYSBuZXcgY29uZmlndXJhdGlvbiBmb3IgcHVibGljYXRpb24gcHVycG9zZXMgb24gZXhpc3RpbmcgcGx1Zy1pbnMsIGRlZmluaW5nIHdoaWNoIGVsZW1lbnRzIHRvIHB1Ymxpc2guIEZvciBleGFtcGxlLCBpZiB0aGUgY3VycmVudCBzZXQgb2YgY29uZmlndXJhdGlvbnMgYXZhaWxhYmxlIGRvZXMgbm90IG1lZXQgeW91ciBuZWVkcywgeW91IGNvdWxkIG5vdyBlaXRoZXIgY3VzdG9taXplIGFuIGV4aXN0aW5nIGNvbmZpZ3VyYXRpb24gb3IgY3JlYXRlIGEgY29tcGxldGVseSBuZXcgY29uZmlndXJhdGlvbiBmcm9tIHNjcmF0Y2guPGJyLz48YnIvPklmIHlvdSB3YW50IHRvIGNyZWF0ZSBhIG1ldGhvZCBjb25maWd1cmF0aW9uIGJ5IGNvcHlpbmcgYW4gZXhpc3RpbmcgY29uZmlndXJhdGlvbiBnbyB0byB0aGUgbmV4dCBzdGVwICJDcmVhdGUgYSBNZXRob2QgQ29uZmlndXJhdGlvbiBieSBjb3B5aW5nIGFuIGV4aXN0aW5nIGNvbmZpZ3VyYXRpb24iLjxici8+PGJyLz5JZiB5b3Ugd2FudCB0byBjcmVhdGUgYSBjb21wbGV0ZWx5IG5ldyBtZXRob2QgY29uZmlndXJhdGlvbiwgc2tpcCB0byBzdGVwICJDcmVhdGUgYSBuZXcgTWV0aG9kIENvbmZpZ3VyYXRpb24gZnJvbSBzY3JhdGNoIi48L2Rlc2NyaXB0aW9uPgotCTwvaXRlbT4KLQotCTxpdGVtCi0JCXRpdGxlPSJDcmVhdGUgYSBNZXRob2QgQ29uZmlndXJhdGlvbiBieSBDb3B5aW5nIGFuIEV4aXN0aW5nIENvbmZpZ3VyYXRpb24iCi0JCXNraXA9InRydWUiPgotCQk8ZGVzY3JpcHRpb24+RXhwYW5kIHRoZSAiQ29uZmlndXJhdGlvbnMiIHBhY2thZ2UgYXQgdGhlIGVuZCBvZiB0aGUgTGlicmFyeSB2aWV3LiBSaWdodCBjbGljayB0aGUgbWV0aG9kIGNvbmZpZ3VyYXRpb24geW91IHdhbnQgdG8gY29weSwgYW5kIHRoZW4gc2VsZWN0ICJDb3B5IiBmcm9tIHRoZSBtZW51LiBSaWdodCBjbGljayB0aGUgY29uZmlndXJhdGlvbnMgcGFja2FnZSBhbmQgdGhlbiBzZWxlY3QgIlBhc3RlIiBmcm9tIHRoZSBtZW51Ljxici8+PGJyLz5BIGRpYWxvZyBwcm9tcHRzIHlvdXIgZm9yIGEgbmV3IGNvbmZpZ3VyYXRpb24gbmFtZS4gUHJvdmlkZSBhIG5hbWUgdGhhdCByZWZsZWN0cyB0aGUgY2hhcmFjdGVyIG9yIHB1cnBvc2Ugb2YgdGhpcyBjb25maWd1cmF0aW9uLiBUbyBjb250aW51ZSBzcGVjaWZ5aW5nIHlvdXIgbWV0aG9kIGNvbmZpZ3VyYXRpb24sIHNraXAgdG8gc3RlcCAiU3BlY2lmeSB0aGUgTWV0aG9kIENvbmZpZ3VyYXRpb24iLjwvZGVzY3JpcHRpb24+Ci0JPC9pdGVtPgotCi0JPGl0ZW0KLQkJdGl0bGU9IkNyZWF0ZSBhIG5ldyBNZXRob2QgQ29uZmlndXJhdGlvbiBmcm9tIFNjcmF0Y2giCi0JCXNraXA9InRydWUiPgotCQk8ZGVzY3JpcHRpb24+UmlnaHQgY2xpY2sgdGhlIGNvbmZpZ3VyYXRpb25zIHBhY2thZ2UgYW5kIHNlbGVjdCBOZXcgLSZndDsgTWV0aG9kIENvbmZpZ3VyYXRpb24gZnJvbSB0aGUgbWVudS4gVGhlIG5ldyBjb25maWd1cmF0aW9uIGlzIGFkZGVkIHRvIHRoZSBsaXN0IGFuZCBpdHMgZWRpdG9yIGlzIG9wZW5lZC4gQ2hhbmdlIHRoZSBuYW1lIG9mIHRoZSBuZXcgY29uZmlndXJhdGlvbiB0byByZWZsZWN0IGl0cyBjaGFyYWN0ZXIgb3IgcHVycG9zZSBhbmQgdGhlbiBjb250aW51ZSB0byB0aGUgbmV4dCBzdGVwLCAiU3BlY2lmeSB0aGUgTWV0aG9kIENvbmZpZ3VyYXRpb24iLjwvZGVzY3JpcHRpb24+Ci0JPC9pdGVtPgotCi0JPGl0ZW0KLQkJdGl0bGU9IlNwZWNpZnkgdGhlIE1ldGhvZCBDb25maWd1cmF0aW9uIgotCQlza2lwPSJmYWxzZSI+Ci0JCTxkZXNjcmlwdGlvbj5DbGljayB0aGUgIlBsdWctaW4gYW5kIFBhY2thZ2UgU2VsZWN0aW9uIiB0YWIgaW4gdGhlIG1ldGhvZCBjb25maWd1cmF0aW9uIGVkaXRvciB0byBnbyB0byB0aGUgY29uZmlndXJhdGlvbiBzcGVjaWZpY2F0aW9uIGZvcm0uIFRoaXMgZm9ybSBkaXNwbGF5cyBhIGxpc3Qgb2YgYWxsIG1ldGhvZCBwbHVnLWlucyBhbmQgZm9yIGV2ZXJ5IHBsdWctaW4gYWxsIG9mIGl0cyBjb250ZW50IHBhY2thZ2VzIGFzIHdlbGwgYXMgYWxsIHByb2Nlc3Nlcy4gVXNlIHRoZSBjaGVjayBib3hlcyB0byBhZGQgb3IgcmVtb3ZlIHBsdWctaW5zLCBwYWNrYWdlcywgYW5kIHByb2Nlc3NlcyB0byBvciBmcm9tIHlvdXIgY29uZmlndXJhdGlvbi48L2Rlc2NyaXB0aW9uPgotCTwvaXRlbT4KLQkKLQk8aXRlbQotCQlocmVmPSIvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvY29uZmlndXJhdGlvbnZpZXcuaHRtbCIgCi0JCXRpdGxlPSJQcmV2aWV3IHlvdXIgQ29uZmlndXJhdGlvbiBpbiB0aGUgQ29uZmlndXJhdGlvbiBWaWV3IgotCQlza2lwPSJmYWxzZSI+Ci0JCTxkZXNjcmlwdGlvbj5Zb3UgY2FuIGltbWVkaWF0ZWx5IHByZXZpZXcgeW91ciBtZXRob2QgY29uZmlndXJhdGlvbiB1c2luZyB0aGUgY29uZmlndXJhdGlvbiB2aWV3LiBSZWZyZXNoIHlvdXIgY29uZmlndXJhdGlvbiB2aWV3IGJ5IGNsaWNraW5nIHRoZSB2aWV3J3MgIlJlZnJlc2ggQWxsIiBpY29uLiBEcmlsbCBpbnRvIHRoZSB0cmVlIHN0cnVjdHVyZXMgZGlzcGxheWVkIGJ5IHRoZSBjb25maWd1cmF0aW9uIHZpZXcgdG8gc2VlIGVsZW1lbnRzIGluY2x1ZGVkIGluIHRoZSBjb25maWd1cmF0aW9uLjwvZGVzY3JpcHRpb24+Ci0JPC9pdGVtPgotCQotCTxpdGVtCi0JCWhyZWY9Ii9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9tZXRob2Rjb250ZW50Y2F0ZWdvcmllcy5odG1sIiAKLQkJdGl0bGU9IkRlZmluZSBOYXZpZ2F0aW9uIFZpZXdzIGZvciB0aGUgTWV0aG9kIENvbmZpZ3VyYXRpb24iCi0JCXNraXA9ImZhbHNlIj4KLQkJPGRlc2NyaXB0aW9uPkEgbmF2aWdhdGlvbiB2aWV3IGlzIGEgbmF2aWdhdGlvbiB0cmVlIGJyb3dzZXIgZm9yIGEgY29uZmlndXJhdGlvbiBwdWJsaXNoZWQgYXMgSFRNTC4gRXZlcnkgcHVibGlzaGVkIGNvbmZpZ3VyYXRpb24gY2FuIGhhdmUgc2V2ZXJhbCB2aWV3cyB0aGF0IGFyZSBkaXNwbGF5ZWQgYXMgc3RhY2tlZCB0cmVlIGJyb3dzZXIgdGFicy4gVGhlIHN0cnVjdHVyZSBvZiB0aGUgbmF2aWdhdGlvbiB2aWV3IGlzIGRlZmluZWQgYXMgY3VzdG9tIGNhdGVnb3JpZXMuIEEgY3VzdG9tIGNhdGVnb3J5IGlzIGEgdXNlci1kZWZpbmVkIGNvbGxlY3Rpb24gb2YgY2F0ZWdvcml6aW5nIGVsZW1lbnRzLCB3aGljaCBtYXkgaXRzZWxmIGNvbnRhaW4gc3ViY2F0ZWdvcmllcy4gVGhpcyBzdHJ1Y3R1cmUgaXMgd2hhdCBkZWZpbmVzIHRoZSBzdHJ1Y3R1cmUgZm9yIHRoZSB0cmVlIGJyb3dzZXIuIChGb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBDdXN0b20gQ2F0ZWdvcmllcywgc2VlIHRoZSBvbmxpbmUgaGVscC4pIFRoZXJlZm9yZSwgdG8gZGVmaW5lIGEgbmF2aWdhdGlvbiB2aWV3IHlvdSBzZWxlY3QgYSBjdXN0b20gY2F0ZWdvcnkgYW5kIGFsbCBvZiB0aGlzIGNhdGVnb3JpZXMgc3ViLWVsZW1lbnRzIG1ha2UgdXAgdGhlIHRyZWUgYnJvd3NlciBzdHJ1Y3R1cmUgZGlzcGxheWVkIGJ5IHRoZSB2aWV3Ljxici8+PGJyLz5UbyBhZGQgbmF2aWdhdGlvbiB2aWV3cyB0byB5b3VyIGNvbmZpZ3VyYXRpb24gY2xpY2sgdGhlICJWaWV3cyIgdGFiIGluIHRoZSBjb25maWd1cmF0aW9uIGVkaXRvci4gVXNlIHRoZSAiQWRkIFZpZXcuLi4iIGFuZCAiUmVtb3ZlIFZpZXciIGJ1dHRvbnMgdG8gc2VsZWN0IHRoZSBjdXN0b20gY2F0ZWdvcmllcyB5b3Ugd2FudCB0byBhZGQgYW5kIHJlbW92ZSBhcyBhIHZpZXcsIHJlc3BlY3RpdmVseS4gQ2xpY2sgdGhlIHRhYiBvZiB0aGUgdmlld3MgeW91IGp1c3QgYWRkZWQgdG8gcHJldmlldy48YnIvPjxici8+VG8gc2VsZWN0IGEgdmlldyB0byBkaXNwbGF5IGFzIHRoZSBzdGFydC11cCB2aWV3LCBjbGljayB0aGUgIk1ha2UgRGVmYXVsdCIgYnV0dG9uLiBUaGUgc3RhcnQtdXAgdmlldyBpcyB0aGUgZmlyc3QgdmlldyBzaG93biB3aGVuIGEgcHVibGlzaGVkIGNvbmZpZ3VyYXRpb24gaXMgZGlzcGxheWVkIHdoZW4gc3RhcnRpbmcgdXAuPC9kZXNjcmlwdGlvbj4KLQk8L2l0ZW0+Ci0JPGl0ZW0gdGl0bGU9IkRvbmUiPjxkZXNjcmlwdGlvbj48L2Rlc2NyaXB0aW9uPgotCTwvaXRlbT4KLTwvY2hlYXRzaGVldD4KLQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2NoZWF0c2hlZXRzL2NyZWF0ZW1ldGhvZHBsdWdpbi54bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvY2hlYXRzaGVldHMvY3JlYXRlbWV0aG9kcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTQzYWIwZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvY2hlYXRzaGVldHMvY3JlYXRlbWV0aG9kcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiA/PiAKLTwhLS0gQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbi4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuIC0tPgotPGNoZWF0c2hlZXQgdGl0bGU9IkNyZWF0ZSB5b3VyIG93biBNZXRob2QgUGx1Zy1pbiI+Ci0KLQk8aW50cm8gCi0JCWhyZWY9Ii9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9jcmVhdGVhbWV0aG9kcGx1Z2luLmh0bWwiPgotCQk8ZGVzY3JpcHRpb24+QmVjYXVzZSB0aGUgcGx1Zy1pbnMgc2hpcHBlZCB3aXRoIHRoZSBtZXRob2QgbGlicmFyeSBhcmUgbG9ja2VkIGFuZCByZWFkLW9ubHksIGFsbCB5b3VyIGNoYW5nZXMsIGFkZGl0aW9ucywgYW5kIGV4dGVuc2lvbnMgdG8gZXhpc3RpbmcgbWV0aG9kIGNvbnRlbnQgYW5kIHByb2Nlc3NlcyBoYXZlIHRvIGJlIHBsYWNlZCBpbiB5b3VyIG93biBtZXRob2QgcGx1Zy1pbnMuIEhvd2V2ZXIsIHlvdSBjYW4gdXNlIHZhcmlvdXMgY2FwYWJpbGl0aWVzIHRvIGxvZ2ljYWxseSBtZXJnZSB5b3VyIHBsdWctaW4gY29udGVudHMgaW50byBvdGhlciBwbHVnLWlucyBhbGxvd2luZyB5b3UsIGFzIGEgcmVzdWx0LCB0byBwdWJsaXNoIGV4dGVuZGVkIG1ldGhvZHMgYW5kIHByb2Nlc3NlcyB0aGF0IHNlYW1sZXNzbHkgaW5jb3Jwb3JhdGUgeW91ciBtZXRob2QgZWxlbWVudHMuIFRvIGNyZWF0ZSB5b3VyIG93biBtZXRob2QgcGx1Zy1pbnMgZm9sbG93IHRoZXNlIHN0ZXBzLjwvZGVzY3JpcHRpb24+Ci0JPC9pbnRybz4KLQotCTxpdGVtCi0JCXRpdGxlPSJVc2UgdGhlIE1ldGhvZCBQbHVnLWluIFdpemFyZCIKLQkJc2tpcD0iZmFsc2UiPgotCQk8ZGVzY3JpcHRpb24+Q3JlYXRlIGEgbmV3IG1ldGhvZCBwbHVnLWluIHVzaW5nIHRoZSAiTmV3IE1ldGhvZCBQbHVnLWluIiB3aXphcmQuIFRvIG9wZW4gdGhlIHdpemFyZCBzZWxlY3QgRmlsZSAtJmd0OyBOZXcgLSZndDsgTWV0aG9kIFBsdWctaW4uIFNwZWNpZnkgYXQgbGVhc3QgdGhlIG5hbWUgZm9yIHlvdXIgbmV3IG1ldGhvZCBwbHVnLWluIGFuZCBzZWxlY3QgdGhlIGNoZWNrIGJveCBmb3IgYW55IG90aGVyIG1ldGhvZCBwbHVnLWlucyB3aGljaCBjb250ZW50IHlvdSB3aXNoIHRvIGV4dGVuZCBvciByZXVzZS48L2Rlc2NyaXB0aW9uPgotCTwvaXRlbT4KLQotCTxpdGVtCi0JCXRpdGxlPSJPcGVuIHRoZSBNZXRob2QgUGx1Z2luIEVkaXRvciIKLQkJc2tpcD0iZmFsc2UiPgotCQk8ZGVzY3JpcHRpb24+QWZ0ZXIgeW91IGhhdmUgY3JlYXRlZCB0aGUgcGx1Zy1pbiwgeW91IGNhbiBtYWtlIGNoYW5nZXMgdG8gaXRzIHNwZWNpZmljYXRpb25zIGluIHRoZSBtZXRob2QgcGx1Zy1pbiBlZGl0b3IuIEluIHRoZSBsaWJyYXJ5IHZpZXcsIGRvdWJsZSBjbGljayB0aGUgbWV0aG9kIHBsdWctaW4gdGhhdCB5b3UganVzdCBjcmVhdGVkIHRvIG9wZW4gdGhlIGVkaXRvci48L2Rlc2NyaXB0aW9uPgotCTwvaXRlbT4KLQotCTxpdGVtCi0JCXRpdGxlPSJTcGVjaWZ5IFZlcnNpb24gSW5mb3JtYXRpb24iCi0JCXNraXA9ImZhbHNlIj4KLQkJPGRlc2NyaXB0aW9uPkluIGFkZGl0aW9uIHRvIHRoZSBpbmZvcm1hdGlvbiBhbHJlYWR5IHNwZWNpZmllZCBpbiB0aGUgbWV0aG9kIHBsdWctaW4gd2l6YXJkLCB5b3UgY2FuIHByb3ZpZGUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGN1cnJlbnQgdmVyc2lvbiBvZiB0aGUgcGx1Zy1pbi48L2Rlc2NyaXB0aW9uPgotCTwvaXRlbT4KLQotCTxpdGVtCi0JCXRpdGxlPSJTZWxlY3QgdGhlIERlZmF1bHQgQ29weXJpZ2h0IERlZmluaXRpb24gRmlsZSIKLQkJc2tpcD0iZmFsc2UiPgotCQk8ZGVzY3JpcHRpb24+VXNlIHRoZSAiU2VsZWN0IiBidXR0b24gdG8gc3BlY2lmeSB3aGljaCBwYWdlIG9mIHRoZSB0eXBlICJTdXBwb3J0aW5nIE1hdGVyaWFsIiBjb250YWlucyB0aGUgY29weXJpZ2h0IGluZm9ybWF0aW9uIGZvciBlbGVtZW50cyBvZiB0aGlzIHBsdWctaW4uICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIHdpbGwgYmUgYXBwZW5kZWQgdG8gZXZlcnkgcGFnZSB0aGF0IGdldHMgcHVibGlzaGVkIGJhc2VkIG9uIGFuIGVsZW1lbnQgZnJvbSB0aGlzIHBsdWctaW4uICBOb3RlLCB0aGF0IGluZGl2aWR1YWwgbWV0aG9kIGVsZW1lbnRzIGNhbiBvdmVycmlkZSB0aGlzIHN0YW5kYXJkIHNlbGVjdGlvbiB3aXRoIHRoZSBjb3B5cmlnaHQgZmllbGQgaW4gdGhlaXIgb3duIGVkaXRvcnMuPC9kZXNjcmlwdGlvbj4KLQk8L2l0ZW0+Ci0JPGl0ZW0gdGl0bGU9IkRvbmUiPjxkZXNjcmlwdGlvbj48L2Rlc2NyaXB0aW9uPjwvaXRlbT4KLTwvY2hlYXRzaGVldD4KLQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2NoZWF0c2hlZXRzL25hdmlnYXRlbWV0aG9kY29udGVudC54bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvY2hlYXRzaGVldHMvbmF2aWdhdGVtZXRob2Rjb250ZW50LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjdlNjUxMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvY2hlYXRzaGVldHMvbmF2aWdhdGVtZXRob2Rjb250ZW50LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLQotPGNoZWF0c2hlZXQgdGl0bGU9Ik5hdmlnYXRlIE1ldGhvZCBDb250ZW50Ij4KLQk8aW50cm8gaHJlZj0iL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3VzZXJpbnRlcmZhY2VvdmVydmlldy5odG1sIj4KLQkJPGRlc2NyaXB0aW9uPlRoZXJlIGFyZSB0d28gd2F5cyB0byBuYXZpZ2F0ZSBtZXRob2QgY29udGVudDogYnkgdXNpbmcgdGhlIHBoeXNpY2FsIGxpYnJhcnkgc3RydWN0dXJlIGluIHRoZSBsaWJyYXJ5IHZpZXcgb3IgYnkgdXNpbmcgdGhlIGxvZ2ljYWwgY2F0ZWdvcml6YXRpb24gb2YgbWV0aG9kIGNvbnRlbnQgaW4gdGhlIGNvbmZpZ3VyYXRpb24gdmlldy4gIFRoaXMgY2hlYXQgc2hlZXQgd2Fsa3MgeW91IHRocm91Z2ggYm90aCBzY2VuYXJpb3MuPC9kZXNjcmlwdGlvbj4KLQk8L2ludHJvPgotCTxpdGVtIGhyZWY9Ii9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9hdXRob3JpbmdwZXJzcGVjdGl2ZS5odG1sIiB0aXRsZT0iU3dpdGNoIHRvIEF1dGhvcmluZyBQZXJzcGVjdGl2ZSIgc2tpcD0idHJ1ZSI+Ci0JCTxkZXNjcmlwdGlvbj5Zb3UgY2FuIHdvcmsgd2l0aCB0d28gcGVyc3BlY3RpdmVzOiB0aGUgYXV0aG9yaW5nIHBlcnNwZWN0aXZlIGFuZCB0aGUgYnJvd3NpbmcgcGVyc3BlY3RpdmUuIEEgcGVyc3BlY3RpdmUgZGVmaW5lcyBhIHNldCBvZiB2aWV3cyBhbmQgZnVuY3Rpb25zIHRvIGJlIGF2YWlsYWJsZSBmb3Igc3BlY2lmaWMgdGFza3MuIFRoZSBhdXRob3JpbmcgcGVyc3BlY3RpdmUgcHJvdmlkZXMgdmlld3MgYW5kIGZ1bmN0aW9ucyB0byBuYXZpZ2F0ZSBhbmQgYXV0aG9yIG1ldGhvZCBjb250ZW50IGFuZCBwcm9jZXNzZXMsIHdoaWxlIHRoZSBicm93c2luZyBwZXJzcGVjdGl2ZSBhbGxvd3MgeW91IHRvIHByZXZpZXcgYW5kIGJyb3dzZSBhIG1ldGhvZCBjb25maWd1cmF0aW9uLiBUaGlzIGNoZWF0IHNoZWV0IHJlZmVycyB0byB0aGUgYXV0aG9yaW5nIHBlcnNwZWN0aXZlLjxici8+PGJyLz5DbGljayB0aGUgIk9wZW4gUGVyc3BlY3RpdmUiIGJ1dHRvbiBvciB0aGUgV2luZG93LSZndDtPcGVuIFBlcnNwZWN0aXZlIG1lbnUgYW5kIHRoZW4gc2VsZWN0ICJBdXRob3JpbmciIHRvIHN3aXRjaCB0byB0aGUgYXV0aG9yaW5nIHBlcnNwZWN0aXZlLjwvZGVzY3JpcHRpb24+Ci0JPC9pdGVtPgotCTxpdGVtIGhyZWY9Ii9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9saWJyYXJ5dmlldy5odG1sIiB0aXRsZT0iT3BlbiB0aGUgTGlicmFyeSBWaWV3IiBza2lwPSJ0cnVlIj4KLQkJPGRlc2NyaXB0aW9uPklmIHlvdSBkbyBub3Qgc2VlIGEgdHJlZS1icm93c2VyIHZpZXcgbGFiZWxlZCAiTGlicmFyeSIgaW4geW91ciBhdXRob3JpbmcgcGVyc3BlY3RpdmUgY2xpY2sgdGhlIFdpbmRvdy0mZ3Q7UmVzZXQgUGVyc3BlY3RpdmUgbWVudS48L2Rlc2NyaXB0aW9uPgotCTwvaXRlbT4KLQk8aXRlbSBocmVmPSIvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvbWV0aG9kY29udGVudHBhY2thZ2UuaHRtbCIgdGl0bGU9IkRyaWxsIGludG8gTWV0aG9kIENvbnRlbnQgUGFja2FnZXMiIHNraXA9ImZhbHNlIj4KLQkJPGRlc2NyaXB0aW9uPldpdGhpbiB0aGUgbGlicmFyeSB2aWV3IHRyZWUtYnJvd3NlciwgZXhwYW5kIGEgcGx1Zy1pbiBhbmQgZHJpbGwgaW50byB0aGUgcGFja2FnZXMgIk1ldGhvZCBDb250ZW50Ii0mZ3Q7IkNvbnRlbnQgUGFja2FnZXMiIGFuZCBpdHMgc3ViLXBhY2thZ2VzLiBFeGFtaW5lIHRoZSBjb250ZW50cy4KLQkJPC9kZXNjcmlwdGlvbj4KLQk8L2l0ZW0+Ci0JPGl0ZW0gdGl0bGU9IlJldmlldyBDb250ZW50IFBhY2thZ2VzIiBza2lwPSJmYWxzZSI+Ci0JCTxkZXNjcmlwdGlvbj5FdmVyeSBjb250ZW50IHBhY2thZ2UgY29udGFpbnMgZGlmZmVyZW50IHR5cGVzIG9mIG1ldGhvZCBjb250ZW50IGVsZW1lbnRzIHdoaWNoIGFyZSBzb3J0ZWQgaW50byBkaWZmZXJlbnQgY2F0ZWdvcmllcy4gVGhlIGNhdGVnb3JpZXMgYXJlIHJvbGVzLCB0YXNrcywgd29yayBwcm9kdWN0cywgYW5kIGd1aWRhbmNlLjwvZGVzY3JpcHRpb24+Ci0JPC9pdGVtPgotCTxpdGVtIGhyZWY9Ii9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9tZXRob2Rjb250ZW50Lmh0bWwiIHRpdGxlPSJPcGVuIGEgTWV0aG9kIENvbnRlbnQgRWxlbWVudCBFZGl0b3IiIHNraXA9ImZhbHNlIj4KLQkJPGRlc2NyaXB0aW9uPlNlbGVjdCBhIG1ldGhvZCBlbGVtZW50LCBzdWNoIGFzIGEgdGFzaywgYW5kIGRvdWJsZSBjbGljayB0byBvcGVuIGl0cyBlZGl0b3IuPGJyLz48YnIvPlRoZSBlZGl0b3IgcHJvdmlkZXMgdGFicyBhbmQgZm9ybXMgdG8gb3JnYW5pemUgdGV4dHVhbCBkZXNjcmlwdGlvbiBmb3IgdGhlIGVsZW1lbnQuICBTZWxlY3QgdGhlIGRpZmZlcmVudCB0YWJzIGFuZCB0aGUgYm90dG9tIG9mIGV2ZXJ5IGVkaXRvciBhbmQgcmV2aWV3IHRoZSBkaWZmZXJlbnQgZm9ybXMgZGlzcGxheWVkLjwvZGVzY3JpcHRpb24+Ci0JPC9pdGVtPgotCTxpdGVtIGhyZWY9Ii9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9tZXRob2Rjb250ZW50Y2F0ZWdvcmllcy5odG1sIiB0aXRsZT0iRXhhbWluZSBDYXRlZ29yaWVzIiBza2lwPSJmYWxzZSI+Ci0JCTxkZXNjcmlwdGlvbj5XaXRoaW4gdGhlIGxpYnJhcnkgdmlldyB0cmVlLWJyb3dzZXIsIGV4cGFuZCB0aGUgcGFja2FnZXMgdG8gdGhlIHNhbWUgbGV2ZWwgYXMgY29udGVudCBwYWNrYWdlcyB1bnRpbCB5b3UgZmluZCB0aGUgIkN1c3RvbSBDYXRlZ29yaWVzIiBhbmQgIlN0YW5kYXJkIENhdGVnb3JpZXMiIHBhY2thZ2VzLiBEcmlsbCBpbnRvIHRoZXNlIHBhY2thZ2VzIGFuZCB0aGVuIGV4YW1pbmUgdGhlaXIgY29udGVudHMuPGJyLz48YnIvPkV2ZXJ5IGNhdGVnb3J5IGxpc3RlZCBoZXJlIGlzIGEgY29udGVudCBlbGVtZW50IGFzIHdlbGwuICBPcGVuIHRoZSBkZXNjcmlwdGlvbiBvZiBhIGNhdGVnb3J5IHN1Y2ggYXMgYSBkaXNjaXBsaW5lIG9yIGEgZG9tYWluIGJ5IGRvdWJsZSBjbGlja2luZyB0aGUgY2F0ZWdvcnkgd2hpY2ggb3BlbnMgdGhlIGNhdGVnb3J5IGVkaXRvci48L2Rlc2NyaXB0aW9uPgotCTwvaXRlbT4KLQk8aXRlbSBocmVmPSIvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvY29uZmlndXJhdGlvbnZpZXcuaHRtbCIgdGl0bGU9IlNlbGVjdCBhIENvbmZpZ3VyYXRpb24gZm9yIHRoZSBDb25maWd1cmF0aW9uIFZpZXciIHNraXA9InRydWUiPgotCQk8ZGVzY3JpcHRpb24+QmVjYXVzZSB0aGUgbWV0aG9kIGxpYnJhcnkgY2FuIGNvbnRhaW4gbGFyZ2UgbnVtYmVycyBvZiBlbGVtZW50cywgeW91IG1heSB3YW50IHRvIGxpbWl0IHlvdXIgd29yayB0byBhIHVzZXItZGVmaW5lZCBzdWJzZXQgb2YgdGhlIGxpYnJhcnkgY2FsbGVkIG1ldGhvZCBjb25maWd1cmF0aW9uLiBBIGNvbmZpZ3VyYXRpb24gZGVmaW5lcyBhIHdvcmtpbmcgc2V0IG9mIHBhY2thZ2VzIHdpdGhpbiB0aGUgbWV0aG9kIGxpYnJhcnkgdGhhdCBoZWxwcyB5b3UgbGltaXQgeW91ciB2aWV3IHRvIGEgc3Vic2V0IG9mIGFsbCBlbGVtZW50cy4gVGhlIGVsZW1lbnRzIHRoYXQgYXJlIHBhcnQgb2YgYSBzZWxlY3RlZCBjb25maWd1cmF0aW9uIGFyZSBkaXNwbGF5ZWQgaW4gdGhlIGNvbmZpZ3VyYXRpb24gdmlldy48YnIvPjxici8+VGhlIGNvbmZpZ3VyYXRpb24gdmlldyBkaXNwbGF5cyBjYXRlZ29yaXplZCBtZXRob2QgZWxlbWVudHMgb2YgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBjb25maWd1cmF0aW9uLiAgVGhpcyBpcyB0aGUgY29uZmlndXJhdGlvbiB0aGF0IGhhcyBiZWVuIHNlbGVjdGVkIGluIHRoZSB1bmxhYmVsZWQgY29tYm8gYm94IGluIHRoZSB0b29sIGJhci4gIFVzZSB0aGlzIGNvbWJvIGJveCB0byBzZWxlY3QgYSBjb25maWd1cmF0aW9uLjxici8+PGJyLz5BZnRlciBzZWxlY3RpbmcgYSBjb25maWd1cmF0aW9uIHRoZSBjb25maWd1cmF0aW9uIHZpZXcgaXMgKHJlLSlwb3B1bGF0ZWQgd2l0aCBuZXcgdHJlZXMgc2hvd2luZyBlbGVtZW50cyBmcm9tIHRoYXQgY29uZmlndXJhdGlvbi48L2Rlc2NyaXB0aW9uPgotCTwvaXRlbT4KLQk8aXRlbSB0aXRsZT0iRHJpbGwgaW50byBDYXRlZ29yaWVzIGluIENvbmZpZ3VyYXRpb24gVmlldyIgc2tpcD0iZmFsc2UiPgotCQk8ZGVzY3JpcHRpb24+RHJpbGwgaW50byB0aGUgY29uZmlndXJhdGlvbiB2aWV3J3MgY2F0ZWdvcmllcyBmb2xkZXJzIGFuZCBleGFtaW5lIHRoZSBlbGVtZW50cyBsaXN0ZWQgdGhlcmUuPGJyLz48YnIvPkFzIGluIHRoZSBsaWJyYXJ5IHZpZXcgeW91IGNhbiBvcGVuIGVsZW1lbnRzIGxpc3RlZCBoZXJlIHZpYSBhIGRvdWJsZS1jbGljay4gSG93ZXZlciwgdGhlIGNvbmZpZ3VyYXRpb24gdmlldyBjb21wdXRlcyBzby1jYWxsZWQgY29udHJpYnV0aW9ucyBhbmQgcmVwbGFjZW1lbnRzIG9mIG1ldGhvZCBjb250ZW50IGVsZW1lbnRzIChzZWUgIlZhcmlhYmlsaXR5IE92ZXJ2aWV3IiBpbiB0aGUgb25saW5lIGhlbHAgZm9yIG1vcmUgZGV0YWlscykuIElmIGFuIGVsZW1lbnQgaGFzIGNvbnRyaWJ1dGluZyBlbGVtZW50cyB0aGVuIGEgZG91YmxlIGNsaWNrIHdpbGwgc2hvdyB5b3UgYSBkaWFsb2cgd2l0aCBhbGwgdGhlIGVsZW1lbnRzIHBhcnRpY2lwYXRpbmcgaW4gdGhlIGNvbnRyaWJ1dGlvbi4gIFNlbGVjdCBvbmUgZWxlbWVudCB0byBvcGVuIGl0cyBlZGl0b3IuPC9kZXNjcmlwdGlvbj4KLQk8L2l0ZW0+Ci0JPGl0ZW0gdGl0bGU9IkRvbmUiPgotCQk8ZGVzY3JpcHRpb24vPgotCTwvaXRlbT4KLTwvY2hlYXRzaGVldD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9jaGVhdHNoZWV0cy9yZXBsYWNlZXhpc3RpbmdtZXRob2RlbGVtZW50cy54bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvY2hlYXRzaGVldHMvcmVwbGFjZWV4aXN0aW5nbWV0aG9kZWxlbWVudHMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNzVmYjYyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9jaGVhdHNoZWV0cy9yZXBsYWNlZXhpc3RpbmdtZXRob2RlbGVtZW50cy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgPz4gCi08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLQotPGNoZWF0c2hlZXQgdGl0bGU9IlJlcGxhY2UgRXhpc3RpbmcgTWV0aG9kIEVsZW1lbnRzIChSb2xlcywgVGFza3MsIFdvcmsgUHJvZHVjdHMsIG9yIEd1aWRhbmNlKSI+Ci0KLQk8aW50cm8gCi0JCWhyZWY9Ii9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC92YXJpYWJpbGl0eS5odG1sIj4KLQkJPGRlc2NyaXB0aW9uPllvdSBjYW4gdGFpbG9yIGV4aXN0aW5nIG1ldGhvZCBlbGVtZW50cywgc3VjaCBhcyBhbiBlbGVtZW50IHRoYXQgaXMgZGVmaW5lZCBpbiBhIGxvY2tlZCBwbHVnLWluLCB3aXRob3V0IGRpcmVjdGx5IG1vZGlmeWluZyBpdCwgYnV0IGJ5IHJlcGxhY2luZyBpdCB3aXRoIG9uZSBvZiB5b3VyIG93biBlbGVtZW50cyBkZWZpbmVkIGluIHlvdXIgb3duIG1ldGhvZCBwbHVnLWluLiBUaGlzIGNoZWF0IHNoZWV0IHdhbGtzIHlvdSB0aHJvdWdoIHRoZSBzdGVwcyBvZiBjcmVhdGluZyBzdWNoIGEgcmVwbGFjZW1lbnQuICBTZWUgdGhlIG9ubGluZSBoZWxwIHNlY3Rpb24gIlZhcmlhYmlsaXR5IE92ZXJ2aWV3IiBmb3IgYW4gaW50cm9kdWN0aW9uIG9uIHZhcmlhYmlsaXR5IGFuZCByZXBsYWNlbWVudHMuPGJyLz48YnIvPlJlcGxhY2VtZW50cyBjYW4gYWxzbyBiZSBhcHBsaWVkIHdpdGhpbiB0aGUgc2FtZSBtZXRob2QgcGx1Zy1pbiBiZXR3ZWVuIG1ldGhvZCBjb250ZW50IGVsZW1lbnRzIGZyb20gZGlmZmVyZW50IGNvbnRlbnQgcGFja2FnZXMuICBUaGlzIGlzIHVzZWZ1bCBpbiB0aGUgY2FzZSB3aGVyZSB5b3Ugd2FudCB0byBwcm92aWRlIGFsdGVybmF0aXZlIGNvbnRlbnQgdGhhdCBjYW4gYmUgc2VsZWN0ZWQgdXNpbmcgZGlmZmVyZW50IG1ldGhvZCBjb25maWd1cmF0aW9ucy48L2Rlc2NyaXB0aW9uPgotCTwvaW50cm8+Ci0KLQk8aXRlbQotCQl0aXRsZT0iUGxhbiB5b3VyIFJlcGxhY2VtZW50IgotCQlza2lwPSJmYWxzZSI+Ci0JCTxkZXNjcmlwdGlvbj5XaGVuIGRlZmluaW5nIHRoZSByZXBsYWNlbWVudCBvZiBhbiBleGlzdGluZyBtZXRob2QgZWxlbWVudCB5b3UgbmVlZCB0byBrbm93IHdoZXJlIHRoZSBleGlzdGluZyBlbGVtZW50IHRoYXQgeW91IHdhbnQgdG8gcmVwbGFjZSBpcyBwaHlzaWNhbGx5IGxvY2F0ZWQgd2l0aGluIGl0cyBtZXRob2QgcGx1Zy1pbi4gWW91IGFsc28gbmVlZCB0byBkZWNpZGUgd2VyZSB0byBjcmVhdGUgYW5kIHBsYWNlIHRoZSByZXBsYWNpbmcgZWxlbWVudC4gVHlwaWNhbGx5IHlvdSBjcmVhdGUgdGhlIHJlcGxhY2luZyBlbGVtZW50IHdpdGhpbiBhIHNwZWNpZmljIGNvbnRlbnQgcGFja2FnZSBpbiB5b3VyIG93biBtZXRob2QgcGx1Zy1pbi4gRmluYWxseSwgeW91IG5lZWQgdG8ga25vdyB3aGF0IHRoZSByZXBsYWNpbmcgZWxlbWVudCdzIGNvbnRlbnQgaXMsIGJlY2F1c2UgYWxsIG9mIHRoZSByZXBsYWNlZCBlbGVtZW504oCZcyBjb250ZW50IChpLmUuIGl0cyB0ZXh0IGF0dHJpYnV0ZXMgYXMgd2VsbCBhcyBpdHMgcmVsYXRpb25zaGlwcyB0aGF0IHBvaW50IHRvIG90aGVyIGVsZW1lbnRzKSB3aWxsIGJlIHJlbW92ZWQuPC9kZXNjcmlwdGlvbj4KLQk8L2l0ZW0+Ci0KLQk8aXRlbQotCQlocmVmPSIvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvY3JlYXRlbWV0aG9kY29udGVudC5odG1sIgotCQl0aXRsZT0iQ3JlYXRlIGEgUmVwbGFjaW5nIENvbnRlbnQgRWxlbWVudCIKLQkJc2tpcD0iZmFsc2UiPgotCQk8ZGVzY3JpcHRpb24+Q3JlYXRlIGEgbWV0aG9kIGNvbnRlbnQgZWxlbWVudCBpbiB5b3VyIG1ldGhvZCBwbHVnLWluIHRoYXQgeW91IGludGVuZCB0byBiZSB0aGUgcmVwbGFjaW5nIGNvbnRlbnQgZWxlbWVudC4gUmVtZW1iZXIsIHlvdSBtdXN0IHByb3ZpZGUgdGhpcyBlbGVtZW50IHdpdGggaXRzIG93biBjb250ZW50IGJlY2F1c2UgYWxsIGF0dHJpYnV0ZXMgb2YgdGhlIHJlcGxhY2VkIGVsZW1lbnQgd2lsbCBiZSByZXBsYWNlZCB3aXRoIGVtcHR5IGZpZWxkcywgaWYgeW91IGRvIG5vdCBwcm92aWRlIG5ldyBkZXNjcmlwdGlvbnMuPGJyLz48YnIvPkdvIHRvIGNoZWF0IHNoZWV0ICJBZGQgYSBuZXcgTWV0aG9kIENvbnRlbnQgc3VjaCBhcyBSb2xlcywgVGFza3MsIFdvcmsgUHJvZHVjdHMsIG9yIEd1aWRhbmNlIiB0byBiZSBndWlkZWQgdGhyb3VnaCB0aGVzZSBzdGVwcy48L2Rlc2NyaXB0aW9uPgotCTwvaXRlbT4KLQotCTxpdGVtCi0JCWhyZWY9Ii9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9yZXBsYWNlLmh0bWwiIAotCQl0aXRsZT0iU3BlY2lmeSB0aGUgUmVwbGFjZW1lbnQgUmVsYXRpb25zaGlwIgotCQlza2lwPSJmYWxzZSI+Ci0JCTxkZXNjcmlwdGlvbj5HbyB0byB0aGUgIkNvbnRlbnQgVmFyaWFiaWxpdHkiIHNlY3Rpb24gb2YgdGhlIGVsZW1lbnRzIGRlc2NyaXB0aW9uIHRhYi4gU2VsZWN0ICJSZXBsYWNlcyIgZnJvbSB0aGUgY29tYm8gYm94LiBDbGljayB0aGUgIlNlbGVjdC4uLiIgYnV0dG9uIG9mIHRoZSBiYXNlIHJvbGUgZmllbGQgYW5kIHNlbGVjdCB0aGUgZWxlbWVudCB0aGF0IHlvdXIgbmV3IGVsZW1lbnQgcmVwbGFjZXMuPC9kZXNjcmlwdGlvbj4KLQk8L2l0ZW0+Ci0KLQk8aXRlbQotCQlocmVmPSIvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvYnJvd3NlYW5kcHJldmlld21ldGhvZGNvbnRlbnQuaHRtbCIgCi0JCXRpdGxlPSJSZXZpZXcgeW91ciBSZXBsYWNlZCBFbGVtZW50IgotCQlza2lwPSJmYWxzZSI+Ci0JCTxkZXNjcmlwdGlvbj5UbyByZXZpZXcgeW91ciByZXBsYWNlZCBlbGVtZW50LCBzZWxlY3QgYSBtZXRob2QgY29uZmlndXJhdGlvbiBpbiB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uIGNvbWJvIGJveCBpbiB0aGUgdG9vbCBiYXIgdGhhdCBjb250YWlucyB0aGUgbWV0aG9kIHBsdWctaW5zIGFuZCBjb250ZW50IHBhY2thZ2VzIG9mIGJvdGggZWxlbWVudHMgcGFydGljaXBhdGluZyBpbiB5b3VyIHJlcGxhY2VtZW50LiBJbiBvdGhlciB3b3JkcywgdGhlIGNvbmZpZ3VyYXRpb24gbXVzdCBjb250YWluIHRoZSByZXBsYWNpbmcgZWxlbWVudCBhcyB3ZWxsIGFzIHRoZSByZXBsYWNlZCBiYXNlIGVsZW1lbnQuPGJyLz48YnIvPlN3aXRjaCB0byB0aGUgQnJvd3NpbmcgcGVyc3BlY3RpdmUuIEZpbmQgYW5kIHNlbGVjdCB0aGUgcmVwbGFjaW5nIGVsZW1lbnQgKGkuZS4geW91ciBuZXcgZWxlbWVudCkgaW4gdGhlIGNvbmZpZ3VyYXRpb24gdmlldy4gVGhlIGNvbnRlbnQgd2luZG93IGRpc3BsYXlzIHRoZSByZXN1bHRzIG9mIHRoZSByZXBsYWNlbWVudC4gUmV2aWV3IGFuIGVsZW1lbnQgdGhhdCByZWZlcnJlZCB0byB0aGUgcmVwbGFjZWQgZWxlbWVudC4gSW4gb3RoZXIgd29yZHMsIGlmIHlvdSByZXBsYWNlZCBhbiBhcnRpZmFjdCwgZmluZCBhIHRhc2sgdGhhdCB1c2VkIHRoaXMgYXJ0aWZhY3QgYXMgYW4gaW5wdXQgb3Igb3V0cHV0LiBNYWtlIHN1cmUgdGhpcyBlbGVtZW50IG5vdyByZWZlcnMgdG8gdGhlIHJlcGxhY2luZyBlbGVtZW50LjwvZGVzY3JpcHRpb24+Ci0JPC9pdGVtPgotCTxpdGVtIHRpdGxlPSJEb25lIj48ZGVzY3JpcHRpb24+PC9kZXNjcmlwdGlvbj48L2l0ZW0+Ci08L2NoZWF0c2hlZXQ+Ci0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9jaGVhdHNoZWV0cy90YWlsb3JleGlzdGluZ21ldGhvZGVsZW1lbnRzLnhtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9jaGVhdHNoZWV0cy90YWlsb3JleGlzdGluZ21ldGhvZGVsZW1lbnRzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGFmNzI2MC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvY2hlYXRzaGVldHMvdGFpbG9yZXhpc3RpbmdtZXRob2RlbGVtZW50cy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgPz4gCi08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLQotPGNoZWF0c2hlZXQgdGl0bGU9IlRhaWxvciBFeGlzdGluZyBNZXRob2QgRWxlbWVudHMgKFJvbGVzLCBUYXNrcywgV29yayBQcm9kdWN0cywgb3IgR3VpZGFuY2UpIFVzaW5nIENvbnRyaWJ1dGlvbiI+Ci0KLQk8aW50cm8gCi0JCWhyZWY9Ii9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC92YXJpYWJpbGl0eS5odG1sIj4KLQkJPGRlc2NyaXB0aW9uPllvdSBjYW4gdGFpbG9yIGV4aXN0aW5nIG1ldGhvZCBlbGVtZW50cywgc3VjaCBhcyBhbiBlbGVtZW50IHRoYXQgaXMgZGVmaW5lZCBpbiBhIGxvY2tlZCBtZXRob2QgcGx1Zy1pbiwgd2l0aG91dCBkaXJlY3RseSBtb2RpZnlpbmcgaXQsIGJ1dCBieSBjb250cmlidXRpbmcgbmV3IGNvbnRlbnQgb3IgcmVsYXRpb25zaGlwcyB0byBpdCBmcm9tIGFuIGVsZW1lbnQgZGVmaW5lZCBpbiBvbmUgb2YgeW91ciBvd24gbWV0aG9kIHBsdWctaW5zLiBUaGlzIGNoZWF0IHNoZWV0IHdhbGtzIHlvdSB0aHJvdWdoIHRoZSBzdGVwcyBvZiBjcmVhdGluZyBzdWNoIGEgY29udHJpYnV0aW9uLiAgU2VlIHRoZSBvbmxpbmUgaGVscCBzZWN0aW9uICJWYXJpYWJpbGl0eSBPdmVydmlldyIgZm9yIGFuIGludHJvZHVjdGlvbiBvbiB2YXJpYWJpbGl0eSBhbmQgY29udHJpYnV0aW9ucy48YnIvPjxici8+Q29udHJpYnV0aW9ucyBjYW4gYWxzbyBiZSBhcHBsaWVkIHdpdGhpbiB0aGUgc2FtZSBtZXRob2QgcGx1Zy1pbiBiZXR3ZWVuIGVsZW1lbnRzIGZyb20gZGlmZmVyZW50IGNvbnRlbnQgcGFja2FnZXMuIFRoaXMgaXMgdXNlZnVsIGluIHRoZSBldmVudCB5b3Ugd2FudCB0byBidWlsZCB1cCB5b3VyIGNvbnRlbnQgZWxlbWVudHMgaW4gbGF5ZXJzIG9mIGNvbXBsZXhpdHkgYnkgZ3JhZHVhbGx5IGFkZGluZyBtb3JlIGFuZCBtb3JlIGNvbnRlbnQgdmlhIGNvbnRyaWJ1dGlvbi4gIFRoZSByZXNwZWN0aXZlIGxldmVscyBvZiBjb250cmlidXRpb24gY2FuIHRoZW4gYmUgc2VsZWN0ZWQgd2l0aGluIG1ldGhvZCBjb25maWd1cmF0aW9ucyB0aGF0IGFsbG93IHlvdSB0byBpbmNsdWRlIG9yIGV4Y2x1ZGUgdGhlIGNvbnRlbnQgcGFja2FnZXMgd2l0aCB0aGUgY29udHJpYnV0aW5nIGVsZW1lbnRzLjwvZGVzY3JpcHRpb24+Ci0JPC9pbnRybz4KLQotCTxpdGVtCi0JCXRpdGxlPSJQbGFuIHlvdXIgQ29udHJpYnV0aW9uIgotCQlza2lwPSJmYWxzZSI+Ci0JCTxkZXNjcmlwdGlvbj5CZWZvcmUgeW91IGNhbiBjcmVhdGUgYSBjb250cmlidXRpb24gdG8gYW4gZXhpc3RpbmcgbWV0aG9kIGNvbnRlbnQgZWxlbWVudCB5b3UgbmVlZCB0byBrbm93IHdoZXJlIHRoaXMgZWxlbWVudCBpcyBsb2NhdGVkIHdpdGhpbiBpdHMgbWV0aG9kIHBsdWctaW4uIFlvdSBhbHNvIG5lZWQgdG8gZGVjaWRlIHdoZXJlIHRvIGNyZWF0ZSBhbmQgcGxhY2UgdGhlIGNvbnRyaWJ1dGluZyBlbGVtZW50LiBUeXBpY2FsbHksIHlvdSBjcmVhdGUgdGhpcyBlbGVtZW50IGluIHlvdXIgb3duIG1ldGhvZCBwbHVnLWluLCBpbiBhIHNwZWNpZmljIGNvbnRlbnQgcGFja2FnZS4gRmluYWxseSwgeW91IG5lZWQgdG8ga25vdyB3aGF0IGl0IGlzIHlvdSBhY3R1YWxseSB3YW50IHRvIGNvbnRyaWJ1dGUuIFRoaXMgY291bGQgYmUgYWRkaXRpb25hbCB0ZXh0IGZvciB0aGUgZm9ybSBmaWVsZHMsIG5ldyByZWxhdGlvbnNoaXBzIHRvIG90aGVyIGVsZW1lbnRzLCBvciBuZXcgY2F0ZWdvcml6YXRpb25zLiAoU2VlIHRoZSBvbmxpbmUgaGVscCBmb3IgbW9yZSBkZXRhaWxzIG9uIHRoZXNlIGZpZWxkcyBhbmQgcmVsYXRpb25zaGlwcy4pPC9kZXNjcmlwdGlvbj4KLQk8L2l0ZW0+Ci0KLQk8aXRlbQotCQlocmVmPSIvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvY3JlYXRlbWV0aG9kY29udGVudC5odG1sIgotCQl0aXRsZT0iQ3JlYXRlIGEgQ29udHJpYnV0aW5nIENvbnRlbnQgRWxlbWVudCIKLQkJc2tpcD0iZmFsc2UiPgotCQk8ZGVzY3JpcHRpb24+Q3JlYXRlIGEgY29udGVudCBlbGVtZW50IGluIHlvdXIgbWV0aG9kIHBsdWctaW4gdGhhdCBwcm92aWRlcyBjb250cmlidXRpb25zIHRvIHRoZSBjb250ZW50IGVsZW1lbnQgdGhhdCB5b3Ugd2lzaCB0byB0YWlsb3IuICBHbyB0byB0aGUgY2hlYXQgc2hlZXQgIkFkZCBhIG5ldyBNZXRob2QgQ29udGVudCBzdWNoIGFzIFJvbGVzLCBUYXNrcywgV29yayBQcm9kdWN0cywgb3IgR3VpZGFuY2UiIHRvIGJlIGd1aWRlZCB0aHJvdWdoIHRoZXNlIHN0ZXBzLjxici8+PGJyLz5BZGQgeW91ciBjb250cmlidXRpb25zIHN1Y2ggYXMgcmV2aXNlZCB0ZXh0IGZvciBmb3JtIGZpZWxkcyBvciBhZGRpdGlvbmFsIHJlbGF0aW9uc2hpcHMgdG8geW91ciBtZXRob2QgY29udGVudCBlbGVtZW50LjwvZGVzY3JpcHRpb24+Ci0JPC9pdGVtPgotCi0JPGl0ZW0KLQkJaHJlZj0iL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2NvbnRyaWJ1dGVzLmh0bWwiIAotCQl0aXRsZT0iU3BlY2lmeSB0aGUgQ29udHJpYnV0aW9uIFJlbGF0aW9uc2hpcCIKLQkJc2tpcD0iZmFsc2UiPgotCQk8ZGVzY3JpcHRpb24+R28gdG8gdGhlICJDb250ZW50IFZhcmlhYmlsaXR5IiBzZWN0aW9uIG9mIHRoZSBlbGVtZW50cyBkZXNjcmlwdGlvbiB0YWIuIFNlbGVjdCAiQ29udHJpYnV0ZXMiIGZyb20gdGhlIGNvbWJvIGJveC4gQ2xpY2sgdGhlICJTZWxlY3QuLi4iIGJ1dHRvbiBvZiB0aGUgYmFzZSByb2xlIGZpZWxkIGFuZCB0aGVuIHNlbGVjdCB0aGUgZWxlbWVudCB0aGF0IHlvdSB3YW50IHlvdXIgbmV3IGVsZW1lbnQgdG8gY29udHJpYnV0ZSB0by48L2Rlc2NyaXB0aW9uPgotCTwvaXRlbT4KLQotCTxpdGVtCi0JCWhyZWY9Ii9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9icm93c2VhbmRwcmV2aWV3bWV0aG9kY29udGVudC5odG1sIiAKLQkJdGl0bGU9IlJldmlldyB5b3VyIENvbnRyaWJ1dGlvbnMiCi0JCXNraXA9ImZhbHNlIj4KLQkJPGRlc2NyaXB0aW9uPlRvIHJldmlldyB5b3VyIGNvbnRyaWJ1dGlvbnMgc2VsZWN0IChvciBjcmVhdGUgZmlyc3QgYW5kIHRoZW4gc2VsZWN0KSBhIG1ldGhvZCBjb25maWd1cmF0aW9uIGluIHRoZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24gY29tYm8gYm94IGluIHRoZSB0b29sIGJhciB0aGF0IGNvbnRhaW5zIHRoZSBwbHVnLWlucyBhbmQgcGFja2FnZXMgb2YgYm90aCBvZiB0aGUgZWxlbWVudHMgcGFydGljaXBhdGluZyBpbiB5b3VyIGNvbnRyaWJ1dGlvbi4gIEluIG90aGVyIHdvcmRzIHRoZSBjb25maWd1cmF0aW9uIGhhcyB0byBjb250YWluIHRoZSBjb250cmlidXRpbmcgZWxlbWVudCBhcyB3ZWxsIGFzIHRoZSBiYXNlIGVsZW1lbnQuPGJyLz48YnIvPlN3aXRjaCB0byB0aGUgIkJyb3dzaW5nIFBlcnNwZWN0aXZlIi4gRmluZCBhbmQgc2VsZWN0IHRoZSBiYXNlIGVsZW1lbnQgKGkuZS4gdGhlIGVsZW1lbnQgeW91IGNvbnRyaWJ1dGVkIHRvKSBpbiB0aGUgY29uZmlndXJhdGlvbiB2aWV3LiBUaGUgY29udGVudCB3aW5kb3cgZGlzcGxheXMgdGhlIHJlc3VsdHMgb2YgdGhlIGNvbnRyaWJ1dGlvbi48L2Rlc2NyaXB0aW9uPgotCTwvaXRlbT4JCi0JPGl0ZW0gdGl0bGU9IkRvbmUiPjxkZXNjcmlwdGlvbj48L2Rlc2NyaXB0aW9uPjwvaXRlbT4KLTwvY2hlYXRzaGVldD4KLQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2NvZGVfbWFuYWdlbWVudC54bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvY29kZV9tYW5hZ2VtZW50LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDJiMzJiNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvY29kZV9tYW5hZ2VtZW50LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08P05MUyAgVFlQRT0ib3JnLmVjbGlwc2UuaGVscC50b2MiPz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotCi08dG9jIGxhYmVsPSJTdXBwb3J0IGZvciBjb2RlIG1hbmFnZW1lbnQiIGxpbmtfdG89Im1haW4ueG1sI2NvZGVfbWFuYWdlbWVudF9pZCI+Ci0gICA8dG9waWMgbGFiZWw9IlN1cHBvcnQgZm9yIENWUyIgaHJlZj0iaHRtbC9oZWxwL2NtX2N2cy5odG1sIi8+Ci0gICA8dG9waWMgbGFiZWw9IlN1cG9ydCBmb3IgUmF0aW9uYWwgQ2xlYXJDYXNlIiBocmVmPSJodG1sL2hlbHAvY21fcmF0aW9uYWxjYy5odG1sIi8+Ci0gICA8dG9waWMgbGFiZWw9IlN1cHBvcnQgZm9yIFJhdGlvbmFsIENDUkMiIGhyZWY9Imh0bWwvaGVscC9jbV9jY3JjLmh0bWwiLz4KLTwvdG9jPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2NvbmNlcHRzLnhtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9jb25jZXB0cy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxODgxYjIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2NvbmNlcHRzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08P05MUyAgVFlQRT0ib3JnLmVjbGlwc2UuaGVscC50b2MiPz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotPHRvYyBsYWJlbD0iQ29uY2VwdHMiIGxpbmtfdG89Im1haW4ueG1sI2NvbmNlcHRzX2lkIj4KLSAgIDx0b3BpYyBsYWJlbD0iT3ZlcnZpZXcgb2YgRVBGIENvbXBvc2VyIiBocmVmPSJodG1sL292ZXJ2aWV3L3Byb2R1Y3Rfb3ZlcnZpZXcuaHRtbCIvPgotICAgPHRvcGljIGxhYmVsPSJNZXRob2QgY29udGVudCBhdXRob3Jpbmcgb3ZlcnZpZXciIGhyZWY9Imh0bWwvb3ZlcnZpZXcvbWV0aG9kX2NvbnRlbnRfYXV0aG9yaW5nX292ZXJ2aWV3Lmh0bWwiLz4KLSAgIDx0b3BpYyBsYWJlbD0iUHJvY2VzcyBhdXRob3Jpbmcgb3ZlcnZpZXciIGhyZWY9Imh0bWwvb3ZlcnZpZXcvcHJvY2Vzc19hdXRob3Jpbmdfb3ZlcnZpZXcuaHRtbCIvPgotICAgPHRvcGljIGxhYmVsPSJNZXRob2QgY29uZmlndXJhdGlvbnMgb3ZlcnZpZXciIGhyZWY9Imh0bWwvb3ZlcnZpZXcvbWV0aG9kX2NvbmZpZ3VyYXRpb25zX292ZXJ2aWV3Lmh0bWwiLz4KLSAgIDx0b3BpYyBsYWJlbD0iVXNlciByb2xlcyBhbmQgcm9sZSBzcGVjaWZpYyB0YXNrcyIgaHJlZj0iaHRtbC9oZWxwL3VzZXJfcm9sZXMuaHRtbCIvPgotICAgPHRvcGljIGxhYmVsPSJNZXRob2QgY29udGVudCIgaHJlZj0iaHRtbC9oZWxwL21ldGhvZF9jb250ZW50Lmh0bWwiLz4KLTwvdG9jPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2NvbnRleHRzX1NlYXJjaC54bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvY29udGV4dHNfU2VhcmNoLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDQ3YjgwNy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvY29udGV4dHNfU2VhcmNoLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P05MUyBUWVBFPSJvcmcuZWNsaXBzZS5oZWxwLmNvbnRleHRzIj8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLTxjb250ZXh0cz4KLQk8Y29udGV4dCAgaWQ9Im9wZW5fc2VhcmNoX2RpYWxvZ19hY3Rpb25fY29udGV4dCIgPgotICAgICAgCTxkZXNjcmlwdGlvbj48L2Rlc2NyaXB0aW9uPgotIAkJPHRvcGljIGxhYmVsPSJTZWFyY2ggZm9yIG1ldGhvZCBjb250ZW50IiBocmVmPSJodG1sL2hlbHAvc2VhcmNoZm9ybWV0aG9kX2NvbnRlbnQuaHRtbCIvPgotICAgCTwvY29udGV4dD4KLQotICAgCTxjb250ZXh0ICBpZD0iZmlsZV9zZWFyY2hfYWN0aW9uX2NvbnRleHQiID4KLSAgICAgCSA8ZGVzY3JpcHRpb24+PC9kZXNjcmlwdGlvbj4KLSAJCTx0b3BpYyBsYWJlbD0iU2VhcmNoIGZvciBtZXRob2QgY29udGVudCIgaHJlZj0iaHRtbC9oZWxwL3NlYXJjaGZvcm1ldGhvZF9jb250ZW50Lmh0bWwiLz4KLSAgIAk8L2NvbnRleHQ+Ci0gICAJCi08L2NvbnRleHRzPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2NvbnRleHRzX2F1dGhvcmluZ191aS54bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvY29udGV4dHNfYXV0aG9yaW5nX3VpLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDM5ZjEwZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvY29udGV4dHNfYXV0aG9yaW5nX3VpLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyMCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPD9OTFMgIFRZUEU9Im9yZy5lY2xpcHNlLmhlbHAudG9jIj8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLTxjb250ZXh0cz4gCi0JPGNvbnRleHQgIGlkPSJmaWxlX25ld19saWJyYXJ5X2NvbnRleHQiPiAKLQkJPGRlc2NyaXB0aW9uPjwvZGVzY3JpcHRpb24+IAotICAgICAgICA8dG9waWMgaHJlZj0iaHRtbC9oZWxwL2xpYnJhcnlfb3ZlcnZpZXcuaHRtbCIgIGxhYmVsPSJNZXRob2QgbGlicmFyeSBvdmVydmlldyIvPiAgCi0JPC9jb250ZXh0PiAKLQkKLQk8Y29udGV4dCAgaWQ9ImZpbGVfbmV3X3BsdWdpbl9jb250ZXh0Ij4gCi0JCTxkZXNjcmlwdGlvbj48L2Rlc2NyaXB0aW9uPiAKLSAgICAgICAgPHRvcGljIGhyZWY9Imh0bWwvaGVscC9jcmVhdGVfbWV0aG9kX3BsdWdpbi5odG1sIiAgbGFiZWw9IkNyZWF0ZSBhIG1ldGhvZCBwbHVnLWluIi8+IAotCTwvY29udGV4dD4gCi0JCi0JPGNvbnRleHQgIGlkPSJmaWxlX25ld19jb25maWd1cmF0aW9uX2NvbnRleHQiPiAKLQkJPGRlc2NyaXB0aW9uPjwvZGVzY3JpcHRpb24+IAotICAgICAgICA8dG9waWMgaHJlZj0iaHRtbC9oZWxwL21ldGhvZGNvbmZpZ3VyYXRpb25zLmh0bWwiICBsYWJlbD0iTWV0aG9kIGNvbmZpZ3VyYXRpb25zIG92ZXJ2aWV3Ii8+IAotCTwvY29udGV4dD4gCi0JCi0JPGNvbnRleHQgIGlkPSJmaWxlX29wZW5fbGlicmFyeV9jb250ZXh0Ij4gCi0JCTxkZXNjcmlwdGlvbj48L2Rlc2NyaXB0aW9uPiAKLSAgICAgICAgPHRvcGljIGhyZWY9Imh0bWwvaGVscC9saWJyYXJ5X292ZXJ2aWV3Lmh0bWwiICBsYWJlbD0iTWV0aG9kIGxpYnJhcnkgb3ZlcnZpZXciLz4gCi0JPC9jb250ZXh0PiAKLQkKLQk8Y29udGV4dCAgaWQ9ImZpbGVfb3Blbl9jb25maWd1cmF0aW9uX2NvbnRleHQiPiAKLQkJPGRlc2NyaXB0aW9uPjwvZGVzY3JpcHRpb24+IAotICAgICAgICA8dG9waWMgaHJlZj0iaHRtbC9oZWxwL21ldGhvZGNvbmZpZ3VyYXRpb25zLmh0bWwiICBsYWJlbD0iTWV0aG9kIGNvbmZpZ3VyYXRpb25zIG92ZXJ2aWV3Ii8+IAotCTwvY29udGV4dD4gCi0JCi0JPGNvbnRleHQgIGlkPSJsaWJyYXJ5X25hdmlnYXRvcl92aWV3X2NvbnRleHQiPiAKLQkJPGRlc2NyaXB0aW9uPiA8L2Rlc2NyaXB0aW9uPiAKLSAgICAgICAgPHRvcGljIGhyZWY9Imh0bWwvaGVscC9saWJyYXJ5X3ZpZXcuaHRtbCIgIGxhYmVsPSJMaWJyYXJ5IHZpZXciLz4gCi0gICAgICAgIDx0b3BpYyBocmVmPSJodG1sL2hlbHAvYXV0aG9yaW5nX3BlcnNwZWN0aXZlLmh0bWwiICBsYWJlbD0iQXV0aG9yaW5nIHBlcnNwZWN0aXZlIi8+IAotCTwvY29udGV4dD4gCi0KLQk8Y29udGV4dCAgaWQ9ImNvbmZpZ3VyYXRpb25fdmlld19jb250ZXh0Ij4gCi0JCTxkZXNjcmlwdGlvbj48L2Rlc2NyaXB0aW9uPiAKLSAgICAgICAgPHRvcGljIGhyZWY9Imh0bWwvaGVscC9jb25maWd1cmF0aW9uX3ZpZXcuaHRtbCIgIGxhYmVsPSJDb25maWd1cmF0aW9uIHZpZXciLz4gCi0gICAgICAgIDx0b3BpYyBocmVmPSJodG1sL2hlbHAvYnJvd3NpbmdwZXJzcGVjdGl2ZS5odG1sIiAgbGFiZWw9IkJyb3dzaW5nIHBlcnNwZWN0aXZlIi8+IAotCTwvY29udGV4dD4gCi0JCi0JCQk8IS0tIGJlZ2lubmluZyBvZiB0aGUgbGlicmFyeSBuYXZpZ2F0b3Igbm9kZSBzZW5zaXRpdmUgRjEgY29udGV4dCBoZWxwcyAtLT4KLQkJCTxjb250ZXh0ICBpZD0ibGlicmFyeV92aWV3X21ldGhvZF9wbHVnaW5fY29udGV4dCI+IAotCQkJCTxkZXNjcmlwdGlvbj4gVGhpcyBpcyBhIHNhbXBsZSBGMSBoZWxwIHRleHQgZm9yIGxpYnJhcnkgdmlldyBtZXRob2QgcGx1Zy1pbiBub2RlLjwvZGVzY3JpcHRpb24+IAotCQkgICAgICAgIDx0b3BpYyBocmVmPSJodG1sL2hlbHAvbWFpbnRvcGljLmh0bWwiICBsYWJlbD0iSGVscFRvcGljMSIvPiAKLQkJICAgICAgICA8dG9waWMgaHJlZj0iaHRtbC9oZWxwL3N1YnRvcGljMi5odG1sIiAgbGFiZWw9IkhlbHBUb3BpYzIiLz4gCi0JCQk8L2NvbnRleHQ+IAotCQkJCi0JCQkJPGNvbnRleHQgIGlkPSJsaWJyYXJ5X3ZpZXdfY29udGVudF9wYWNrYWdlX2NvbnRleHQiPiAKLQkJCQk8ZGVzY3JpcHRpb24+IFRoaXMgaXMgYSBzYW1wbGUgRjEgaGVscCB0ZXh0IGZvciBsaWJyYXJ5IHZpZXcgQ29udGVudFBhY2thZ2Ugbm9kZS48L2Rlc2NyaXB0aW9uPiAKLQkJICAgICAgICA8dG9waWMgaHJlZj0iaHRtbC9oZWxwL21haW50b3BpYy5odG1sIiAgbGFiZWw9IkhlbHBUb3BpYzEiLz4gCi0JCSAgICAgICAgPHRvcGljIGhyZWY9Imh0bWwvaGVscC9zdWJ0b3BpYzIuaHRtbCIgIGxhYmVsPSJIZWxwVG9waWMyIi8+IAotCQkJPC9jb250ZXh0PiAKLQkJCQotCQkJCTxjb250ZXh0ICBpZD0ibGlicmFyeV92aWV3X3Rhc2tfY29udGV4dCI+IAotCQkJCTxkZXNjcmlwdGlvbj4gVGhpcyBpcyBhIHNhbXBsZSBGMSBoZWxwIHRleHQgZm9yIGxpYnJhcnkgdmlldyBtZXRob2QgVGFzayBub2RlLjwvZGVzY3JpcHRpb24+IAotCQkgICAgICAgIDx0b3BpYyBocmVmPSJodG1sL2hlbHAvbWFpbnRvcGljLmh0bWwiICBsYWJlbD0iSGVscFRvcGljMSIvPiAKLQkJICAgICAgICA8dG9waWMgaHJlZj0iaHRtbC9oZWxwL3N1YnRvcGljMi5odG1sIiAgbGFiZWw9IkhlbHBUb3BpYzIiLz4gCi0JCQk8L2NvbnRleHQ+IAotCQkJCi0JCQkJPGNvbnRleHQgIGlkPSJsaWJyYXJ5X3ZpZXdfd29ya19wcm9kdWN0X2NvbnRleHQiPiAKLQkJCQk8ZGVzY3JpcHRpb24+IFRoaXMgaXMgYSBzYW1wbGUgRjEgaGVscCB0ZXh0IGZvciBsaWJyYXJ5IHZpZXcgV29ya1Byb2R1Y3Qgbm9kZS48L2Rlc2NyaXB0aW9uPiAKLQkJICAgICAgICA8dG9waWMgaHJlZj0iaHRtbC9oZWxwL21haW50b3BpYy5odG1sIiAgbGFiZWw9IkhlbHBUb3BpYzEiLz4gCi0JCSAgICAgICAgPHRvcGljIGhyZWY9Imh0bWwvaGVscC9zdWJ0b3BpYzIuaHRtbCIgIGxhYmVsPSJIZWxwVG9waWMyIi8+IAotCQkJPC9jb250ZXh0PiAKLQkJCQotCQkJCTxjb250ZXh0ICBpZD0ibGlicmFyeV92aWV3X2d1aWRhbmNlX2NvbnRleHQiPiAKLQkJCQk8ZGVzY3JpcHRpb24+IFRoaXMgaXMgYSBzYW1wbGUgRjEgaGVscCB0ZXh0IGZvciBsaWJyYXJ5IHZpZXcgR3VpZGFuY2Ugbm9kZS48L2Rlc2NyaXB0aW9uPiAKLQkJICAgICAgICA8dG9waWMgaHJlZj0iaHRtbC9oZWxwL21haW50b3BpYy5odG1sIiAgbGFiZWw9IkhlbHBUb3BpYzEiLz4gCi0JCSAgICAgICAgPHRvcGljIGhyZWY9Imh0bWwvaGVscC9zdWJ0b3BpYzIuaHRtbCIgIGxhYmVsPSJIZWxwVG9waWMyIi8+IAotCQkJPC9jb250ZXh0PiAKLQkJCQotCQkJCTxjb250ZXh0ICBpZD0ibGlicmFyeV92aWV3X2Rpc2NpcGxpbmVfY29udGV4dCI+IAotCQkJCTxkZXNjcmlwdGlvbj4gVGhpcyBpcyBhIHNhbXBsZSBGMSBoZWxwIHRleHQgZm9yIGxpYnJhcnkgdmlldyBEaXNjaXBsaW5lIG5vZGUuPC9kZXNjcmlwdGlvbj4gCi0JCSAgICAgICAgPHRvcGljIGhyZWY9Imh0bWwvaGVscC9tYWludG9waWMuaHRtbCIgIGxhYmVsPSJIZWxwVG9waWMxIi8+IAotCQkgICAgICAgIDx0b3BpYyBocmVmPSJodG1sL2hlbHAvc3VidG9waWMyLmh0bWwiICBsYWJlbD0iSGVscFRvcGljMiIvPiAKLQkJCTwvY29udGV4dD4gCi0JCQkKLQkJCQk8Y29udGV4dCAgaWQ9ImxpYnJhcnlfdmlld19kaXNjaXBsaW5lX2dyb3VwaW5nX2NvbnRleHQiPiAKLQkJCQk8ZGVzY3JpcHRpb24+IFRoaXMgaXMgYSBzYW1wbGUgRjEgaGVscCB0ZXh0IGZvciBsaWJyYXJ5IHZpZXcgRGlzY2lwbGluZUdyb3VwaW5nIG5vZGUuPC9kZXNjcmlwdGlvbj4gCi0JCSAgICAgICAgPHRvcGljIGhyZWY9Imh0bWwvaGVscC9tYWludG9waWMuaHRtbCIgIGxhYmVsPSJIZWxwVG9waWMxIi8+IAotCQkgICAgICAgIDx0b3BpYyBocmVmPSJodG1sL2hlbHAvc3VidG9waWMyLmh0bWwiICBsYWJlbD0iSGVscFRvcGljMiIvPiAKLQkJCTwvY29udGV4dD4gCi0JCQkKLQkJCQk8Y29udGV4dCAgaWQ9ImxpYnJhcnlfdmlld19kb21haW5fY29udGV4dCI+IAotCQkJCTxkZXNjcmlwdGlvbj4gVGhpcyBpcyBhIHNhbXBsZSBGMSBoZWxwIHRleHQgZm9yIGxpYnJhcnkgdmlldyBEb21haW4gbm9kZS48L2Rlc2NyaXB0aW9uPiAKLQkJICAgICAgICA8dG9waWMgaHJlZj0iaHRtbC9oZWxwL21haW50b3BpYy5odG1sIiAgbGFiZWw9IkhlbHBUb3BpYzEiLz4gCi0JCSAgICAgICAgPHRvcGljIGhyZWY9Imh0bWwvaGVscC9zdWJ0b3BpYzIuaHRtbCIgIGxhYmVsPSJIZWxwVG9waWMyIi8+IAotCQkJPC9jb250ZXh0PiAKLQkJCQotCQkJCTxjb250ZXh0ICBpZD0ibGlicmFyeV92aWV3X3JvbGVfY29udGV4dCI+IAotCQkJCTxkZXNjcmlwdGlvbj4gVGhpcyBpcyBhIHNhbXBsZSBGMSBoZWxwIHRleHQgZm9yIGxpYnJhcnkgdmlldyBSb2xlIG5vZGUuPC9kZXNjcmlwdGlvbj4gCi0JCSAgICAgICAgPHRvcGljIGhyZWY9Imh0bWwvaGVscC9tYWludG9waWMuaHRtbCIgIGxhYmVsPSJIZWxwVG9waWMxIi8+IAotCQkgICAgICAgIDx0b3BpYyBocmVmPSJodG1sL2hlbHAvc3VidG9waWMyLmh0bWwiICBsYWJlbD0iSGVscFRvcGljMiIvPiAKLQkJCTwvY29udGV4dD4gCi0JCQkKLQkJCQk8Y29udGV4dCAgaWQ9ImxpYnJhcnlfdmlld193b3JrX3Byb2R1Y3RfdHlwZV9jb250ZXh0Ij4gCi0JCQkJPGRlc2NyaXB0aW9uPiBUaGlzIGlzIGEgc2FtcGxlIEYxIGhlbHAgdGV4dCBmb3IgbGlicmFyeSB2aWV3IFdvcmtQcm9kdWN0VHlwZSBub2RlLjwvZGVzY3JpcHRpb24+IAotCQkgICAgICAgIDx0b3BpYyBocmVmPSJodG1sL2hlbHAvbWFpbnRvcGljLmh0bWwiICBsYWJlbD0iSGVscFRvcGljMSIvPiAKLQkJICAgICAgICA8dG9waWMgaHJlZj0iaHRtbC9oZWxwL3N1YnRvcGljMi5odG1sIiAgbGFiZWw9IkhlbHBUb3BpYzIiLz4gCi0JCQk8L2NvbnRleHQ+IAotCQkJCi0JCQk8Y29udGV4dCAgaWQ9ImxpYnJhcnlfdmlld19yb2xlX3NldF9jb250ZXh0Ij4gCi0JCQkJPGRlc2NyaXB0aW9uPiBUaGlzIGlzIGEgc2FtcGxlIEYxIGhlbHAgdGV4dCBmb3IgbGlicmFyeSB2aWV3IFJvbGVTZXQgbm9kZS48L2Rlc2NyaXB0aW9uPiAKLQkJICAgICAgICA8dG9waWMgaHJlZj0iaHRtbC9oZWxwL21haW50b3BpYy5odG1sIiAgbGFiZWw9IkhlbHBUb3BpYzEiLz4gCi0JCSAgICAgICAgPHRvcGljIGhyZWY9Imh0bWwvaGVscC9zdWJ0b3BpYzIuaHRtbCIgIGxhYmVsPSJIZWxwVG9waWMyIi8+IAotCQkJPC9jb250ZXh0PiAKLQkJCQotCQkJCi0JCQk8Y29udGV4dCAgaWQ9ImxpYnJhcnlfdmlld190b29sX2NvbnRleHQiPiAKLQkJCQk8ZGVzY3JpcHRpb24+IFRoaXMgaXMgYSBzYW1wbGUgRjEgaGVscCB0ZXh0IGZvciBsaWJyYXJ5IHZpZXcgbWV0aG9kIFRvb2wgbm9kZS48L2Rlc2NyaXB0aW9uPiAKLQkJICAgICAgICA8dG9waWMgaHJlZj0iaHRtbC9oZWxwL21haW50b3BpYy5odG1sIiAgbGFiZWw9IkhlbHBUb3BpYzEiLz4gCi0JCSAgICAgICAgPHRvcGljIGhyZWY9Imh0bWwvaGVscC9zdWJ0b3BpYzIuaHRtbCIgIGxhYmVsPSJIZWxwVG9waWMyIi8+IAotCQkJPC9jb250ZXh0PiAKLQkJCQotCQkJPGNvbnRleHQgIGlkPSJsaWJyYXJ5X3ZpZXdfcm9sZV9zZXRfZ3JvdXBpbmdfY29udGV4dCI+IAotCQkJCTxkZXNjcmlwdGlvbj4gVGhpcyBpcyBhIHNhbXBsZSBGMSBoZWxwIHRleHQgZm9yIGxpYnJhcnkgdmlldyBSb2xlU2V0R3JvdXBpbmcgbm9kZS48L2Rlc2NyaXB0aW9uPiAKLQkJICAgICAgICA8dG9waWMgaHJlZj0iaHRtbC9oZWxwL21haW50b3BpYy5odG1sIiAgbGFiZWw9IkhlbHBUb3BpYzEiLz4gCi0JCSAgICAgICAgPHRvcGljIGhyZWY9Imh0bWwvaGVscC9zdWJ0b3BpYzIuaHRtbCIgIGxhYmVsPSJIZWxwVG9waWMyIi8+IAotCQkJPC9jb250ZXh0PiAKLQkJCQotCQkJPGNvbnRleHQgIGlkPSJsaWJyYXJ5X3ZpZXdfY3VzdG9tX2NhdGVnb3J5X2NvbnRleHQiPiAKLQkJCQk8ZGVzY3JpcHRpb24+IFRoaXMgaXMgYSBzYW1wbGUgRjEgaGVscCB0ZXh0IGZvciBsaWJyYXJ5IHZpZXcgQ3VzdG9tQ2F0ZWdvcnkgbm9kZS48L2Rlc2NyaXB0aW9uPiAKLQkJICAgICAgICA8dG9waWMgaHJlZj0iaHRtbC9oZWxwL21haW50b3BpYy5odG1sIiAgbGFiZWw9IkhlbHBUb3BpYzEiLz4gCi0JCSAgICAgICAgPHRvcGljIGhyZWY9Imh0bWwvaGVscC9zdWJ0b3BpYzIuaHRtbCIgIGxhYmVsPSJIZWxwVG9waWMyIi8+IAotCQkJPC9jb250ZXh0PiAKLQkJCQotCQkJPGNvbnRleHQgIGlkPSJsaWJyYXJ5X3ZpZXdfcHJvY2Vzc19jb21wb25lbnRfY29udGV4dCI+IAotCQkJCTxkZXNjcmlwdGlvbj4gVGhpcyBpcyBhIHNhbXBsZSBGMSBoZWxwIHRleHQgZm9yIGxpYnJhcnkgdmlldyBQcm9jZXNzQ29tcG9uZW50IG5vZGUuPC9kZXNjcmlwdGlvbj4gCi0JCSAgICAgICAgPHRvcGljIGhyZWY9Imh0bWwvaGVscC9tYWludG9waWMuaHRtbCIgIGxhYmVsPSJIZWxwVG9waWMxIi8+IAotCQkgICAgICAgIDx0b3BpYyBocmVmPSJodG1sL2hlbHAvc3VidG9waWMyLmh0bWwiICBsYWJlbD0iSGVscFRvcGljMiIvPiAKLQkJCTwvY29udGV4dD4gCi0JCQkKLQkJCQk8Y29udGV4dCAgaWQ9ImxpYnJhcnlfdmlld19wcm9jZXNzX2NvbnRleHQiPiAKLQkJCQk8ZGVzY3JpcHRpb24+IFRoaXMgaXMgYSBzYW1wbGUgRjEgaGVscCB0ZXh0IGZvciBsaWJyYXJ5IHZpZXcgUHJvY2VzcyBub2RlLjwvZGVzY3JpcHRpb24+IAotCQkgICAgICAgIDx0b3BpYyBocmVmPSJodG1sL2hlbHAvbWFpbnRvcGljLmh0bWwiICBsYWJlbD0iSGVscFRvcGljMSIvPiAKLQkJICAgICAgICA8dG9waWMgaHJlZj0iaHRtbC9oZWxwL3N1YnRvcGljMi5odG1sIiAgbGFiZWw9IkhlbHBUb3BpYzIiLz4gCi0JCQk8L2NvbnRleHQ+IAotCQkJCi0JCQkJPGNvbnRleHQgIGlkPSJsaWJyYXJ5X3ZpZXdfbWV0aG9kX2NvbmZpZ3VyYXRpb25fY29udGV4dCI+IAotCQkJCTxkZXNjcmlwdGlvbj4gVGhpcyBpcyBhIHNhbXBsZSBGMSBoZWxwIHRleHQgZm9yIGxpYnJhcnkgdmlldyBNZXRob2RDb25maWd1cmF0aW9uIG5vZGUuPC9kZXNjcmlwdGlvbj4gCi0JCSAgICAgICAgPHRvcGljIGhyZWY9Imh0bWwvaGVscC9tYWludG9waWMuaHRtbCIgIGxhYmVsPSJIZWxwVG9waWMxIi8+IAotCQkgICAgICAgIDx0b3BpYyBocmVmPSJodG1sL2hlbHAvc3VidG9waWMyLmh0bWwiICBsYWJlbD0iSGVscFRvcGljMiIvPiAKLQkJCTwvY29udGV4dD4gCi0JCQk8IS0tIGVuZCBvZiB0aGUgbGlicmFyeSBuYXZpZ2F0b3Igbm9kZSBzZW5zaXRpdmUgRjEgY29udGV4dCBoZWxwcyAtLT4KLQkKLQkKLQk8IS0tIGZvcm0gZWRpdG9yIHNlY3Rpb24gY29udGV4dCBoZWxwIC0tPgotCQotCTxjb250ZXh0ICBpZD0icGx1Z2luX2VkaXRvcl9kZXNjcmlwdGlvbl9hbGxfY29udGV4dCI+IAotCQk8ZGVzY3JpcHRpb24+IDwvZGVzY3JpcHRpb24+IAotICAgICAgICA8dG9waWMgaHJlZj0iaHRtbC9oZWxwL2NyZWF0ZV9tZXRob2RfcGx1Z2luLmh0bWwiICBsYWJlbD0iQ3JlYXRlIGEgbWV0aG9kIHBsdWctaW4iLz4gCi0gICAgICAgIDx0b3BpYyBocmVmPSJodG1sL2hlbHAvbWV0aG9kcGx1Z2luLmh0bWwiICBsYWJlbD0iTWV0aG9kIHBsdWctaW4iLz4gCi0JPC9jb250ZXh0PiAKLQkKLQk8Y29udGV4dCAgaWQ9ImNvbmZpZ3VyYXRpb25fZWRpdG9yX2FsbF9jb250ZXh0Ij4gCi0JCTxkZXNjcmlwdGlvbj48L2Rlc2NyaXB0aW9uPiAKLSAgICAgICAgPHRvcGljIGhyZWY9Imh0bWwvaGVscC9jcmVhdGVfbWV0aG9kX2NvbmZpZ3VyYXRpb24uaHRtbCIgIGxhYmVsPSJDcmVhdGUgYSBtZXRob2QgY29uZmlndXJhdGlvbiIvPiAKLSAgICAgICAgPHRvcGljIGhyZWY9Imh0bWwvaGVscC9tZXRob2Rjb25maWd1cmF0aW9ucy5odG1sIiAgbGFiZWw9Ik1ldGhvZCBjb25maWd1cmF0aW9ucyBvdmVydmlldyIvPiAKLQk8L2NvbnRleHQ+IAotCQotCTxjb250ZXh0ICBpZD0iY29udGVudF9wYWNrYWdlX2VkaXRvcl9hbGxfY29udGV4dCI+IAotCQk8ZGVzY3JpcHRpb24+PC9kZXNjcmlwdGlvbj4gCi0gICAgICAgIDx0b3BpYyBocmVmPSJodG1sL2hlbHAvY3JlYXRlX2NvbnRlbnRwYWNrYWdlLmh0bWwiICBsYWJlbD0iQ3JlYXRpbmcgYSBjb250ZW50IHBhY2thZ2UiLz4gCi0gICAgICAgIDx0b3BpYyBocmVmPSJodG1sL2hlbHAvbWV0aG9kY29udGVudHBhY2thZ2UuaHRtbCIgIGxhYmVsPSJNZXRob2QgY29udGVudCBwYWNrYWdlIi8+IAotCTwvY29udGV4dD4gCi0JCi0JCi0JPGNvbnRleHQgIGlkPSJlZGl0b3Jfcm9sZV9jb250ZXh0X2hlbHBfSUQiPiAKLQkJPGRlc2NyaXB0aW9uPjwvZGVzY3JpcHRpb24+IAotICAgICAgICA8dG9waWMgaHJlZj0iaHRtbC9oZWxwL2NyZWF0ZV9yb2xlLmh0bWwiICBsYWJlbD0iQ3JlYXRlIGEgcm9sZSIvPiAKLQk8L2NvbnRleHQ+IAotCi0JPGNvbnRleHQgIGlkPSJlZGl0b3JfdGFza19jb250ZXh0X2hlbHBfSUQiPiAKLQkJPGRlc2NyaXB0aW9uPjwvZGVzY3JpcHRpb24+IAotICAgICAgICA8dG9waWMgaHJlZj0iaHRtbC9oZWxwL2NyZWF0ZV90YXNrLmh0bWwiICBsYWJlbD0iQ3JlYXRlIGEgdGFzayIvPiAgCi0JPC9jb250ZXh0PiAKLQotCTxjb250ZXh0ICBpZD0iZWRpdG9yX3dvcmtfcHJvZHVjdF9jb250ZXh0X2hlbHBfSUQiPiAKLQkJPGRlc2NyaXB0aW9uPjwvZGVzY3JpcHRpb24+IAotICAgICAgICA8dG9waWMgaHJlZj0iaHRtbC9oZWxwL2NyZWF0ZV93b3JrcHJvZHVjdC5odG1sIiAgbGFiZWw9IkNyZWF0ZSB3b3JrIHByb2R1Y3QiLz4gCi0JPC9jb250ZXh0PiAKLQotCTxjb250ZXh0ICBpZD0iZWRpdG9yX2d1aWRhbmNlX2NvbnRleHRfaGVscF9JRCI+IAotCQk8ZGVzY3JpcHRpb24+PC9kZXNjcmlwdGlvbj4gCi0gICAgICAgIDx0b3BpYyBocmVmPSJodG1sL2hlbHAvY3JlYXRlX2d1aWRhbmNlLmh0bWwiICBsYWJlbD0iQ3JlYXRpbmcgZ3VpZGFuY2UiLz4gCi0JPC9jb250ZXh0PiAKLQotCTxjb250ZXh0ICBpZD0iZWRpdG9yX2Rpc2NpcGxpbmVfY29udGV4dF9oZWxwX0lEIj4gCi0JCTxkZXNjcmlwdGlvbj48L2Rlc2NyaXB0aW9uPiAKLSAgICAgICAgPHRvcGljIGhyZWY9Imh0bWwvaGVscC9jb250ZW50X2NhdGVnb3JpZXMuaHRtbCIgIGxhYmVsPSJNZXRob2QgY29udGVudCBjYXRlZ29yaWVzIi8+IAotCTwvY29udGV4dD4gCi0KLQk8Y29udGV4dCAgaWQ9ImVkaXRvcl9kaXNjaXBsaW5lX2dyb3VwaW5nX2NvbnRleHRfaGVscF9JRCI+IAotCQk8ZGVzY3JpcHRpb24+PC9kZXNjcmlwdGlvbj4gCi0gICAgICAgIDx0b3BpYyBocmVmPSJodG1sL2hlbHAvY29udGVudF9jYXRlZ29yaWVzLmh0bWwiICBsYWJlbD0iTWV0aG9kIGNvbnRlbnQgY2F0ZWdvcmllcyIvPiAKLQk8L2NvbnRleHQ+IAotCi0JPGNvbnRleHQgIGlkPSJlZGl0b3JfZG9tYWluX2NvbnRleHRfaGVscF9JRCI+IAotCQk8ZGVzY3JpcHRpb24+PC9kZXNjcmlwdGlvbj4gCi0gICAgICAgIDx0b3BpYyBocmVmPSJodG1sL2hlbHAvY29udGVudF9jYXRlZ29yaWVzLmh0bWwiICBsYWJlbD0iTWV0aG9kIGNvbnRlbnQgY2F0ZWdvcmllcyIvPiAKLQk8L2NvbnRleHQ+IAotCi0JPGNvbnRleHQgIGlkPSJlZGl0b3Jfd29ya19wcm9kdWN0X3R5cGVfY29udGV4dF9oZWxwX0lEIj4gCi0JCTxkZXNjcmlwdGlvbj4gPC9kZXNjcmlwdGlvbj4gCi0gICAgICAgIDx0b3BpYyBocmVmPSJodG1sL2hlbHAvY29udGVudF9jYXRlZ29yaWVzLmh0bWwiICBsYWJlbD0iTWV0aG9kIGNvbnRlbnQgY2F0ZWdvcmllcyIvPiAKLQk8L2NvbnRleHQ+IAotCi0JPGNvbnRleHQgIGlkPSJlZGl0b3Jfcm9sZV9zZXRfY29udGV4dF9oZWxwX0lEIj4gCi0JCTxkZXNjcmlwdGlvbj48L2Rlc2NyaXB0aW9uPiAKLSAgICAgICAgPHRvcGljIGhyZWY9Imh0bWwvaGVscC9jb250ZW50X2NhdGVnb3JpZXMuaHRtbCIgIGxhYmVsPSJNZXRob2QgY29udGVudCBjYXRlZ29yaWVzIi8+IAotCTwvY29udGV4dD4gCi0KLQk8Y29udGV4dCAgaWQ9ImVkaXRvcl9yb2xzZV9zZXRfZ3JvdXBpbmdfY29udGV4dF9oZWxwX0lEIj4gCi0JCTxkZXNjcmlwdGlvbj48L2Rlc2NyaXB0aW9uPiAKLSAgICAgICAgPHRvcGljIGhyZWY9Imh0bWwvaGVscC9jb250ZW50X2NhdGVnb3JpZXMuaHRtbCIgIGxhYmVsPSJNZXRob2QgY29udGVudCBjYXRlZ29yaWVzIi8+IAotCTwvY29udGV4dD4gCi0KLQk8Y29udGV4dCAgaWQ9ImVkaXRvcl90b29sX2NvbnRleHRfaGVscF9JRCI+IAotCQk8ZGVzY3JpcHRpb24+PC9kZXNjcmlwdGlvbj4gCi0gICAgICAgIDx0b3BpYyBocmVmPSJodG1sL2hlbHAvY29udGVudF9jYXRlZ29yaWVzLmh0bWwiICBsYWJlbD0iTWV0aG9kIGNvbnRlbnQgY2F0ZWdvcmllcyIvPiAKLQk8L2NvbnRleHQ+IAotCi0JPGNvbnRleHQgIGlkPSJlZGl0b3JfY3VzdG9tX2NhdGVnb3J5X2NvbnRleHRfaGVscF9JRCI+IAotCQk8ZGVzY3JpcHRpb24+PC9kZXNjcmlwdGlvbj4gCi0gICAgICAgIDx0b3BpYyBocmVmPSJodG1sL2hlbHAvY29udGVudF9jYXRlZ29yaWVzLmh0bWwiICBsYWJlbD0iTWV0aG9kIGNvbnRlbnQgY2F0ZWdvcmllcyIvPiAKLQk8L2NvbnRleHQ+IAotCQotCQkJPCEtLSBiZWdpbm5pbmcgb2Ygc2VjdGlvbiBiYXNlZCBGMSBjb250ZXh0IGhlbHAgLS0+Ci0JCQk8Y29udGV4dCAgaWQ9ImZvcm1fZWRpdG9yX2Rlc2NyaXB0aW9uX2dlbmVyYWxfY29udGV4dCI+IAotCQkJCTxkZXNjcmlwdGlvbj4gVGhpcyBpcyBhIHNhbXBsZSBGMSBoZWxwIHRleHQgZm9yIGZvcm1fZWRpdG9yX2Rlc2NyaXB0aW9uX2dlbmVyYWxfY29udGV4dC48L2Rlc2NyaXB0aW9uPiAKLQkJICAgICAgICA8dG9waWMgaHJlZj0iaHRtbC9oZWxwL21haW50b3BpYy5odG1sIiAgbGFiZWw9IkhlbHBUb3BpYzEiLz4gCi0JCSAgICAgICAgPHRvcGljIGhyZWY9Imh0bWwvaGVscC9zdWJ0b3BpYzIuaHRtbCIgIGxhYmVsPSJIZWxwVG9waWMyIi8+IAotCQkJPC9jb250ZXh0PiAKLQkJCQotCQkJCTxjb250ZXh0ICBpZD0iZm9ybV9lZGl0b3JfZGVzY3JpcHRpb25fZGV0YWlsX2NvbnRleHQiPiAKLQkJCQk8ZGVzY3JpcHRpb24+IFRoaXMgaXMgYSBzYW1wbGUgRjEgaGVscCB0ZXh0IGZvciBmb3JtX2VkaXRvcl9kZXNjcmlwdGlvbl9kZXRhaWxfY29udGV4dC48L2Rlc2NyaXB0aW9uPiAKLQkJICAgICAgICA8dG9waWMgaHJlZj0iaHRtbC9oZWxwL21haW50b3BpYy5odG1sIiAgbGFiZWw9IkhlbHBUb3BpYzEiLz4gCi0JCSAgICAgICAgPHRvcGljIGhyZWY9Imh0bWwvaGVscC9zdWJ0b3BpYzIuaHRtbCIgIGxhYmVsPSJIZWxwVG9waWMyIi8+IAotCQkJPC9jb250ZXh0PiAKLQkJCQotCQkJCTxjb250ZXh0ICBpZD0iZm9ybV9lZGl0b3JfZGVzY3JpcHRpb25fbm90YXRpb25fY29udGV4dCI+IAotCQkJCTxkZXNjcmlwdGlvbj4gVGhpcyBpcyBhIHNhbXBsZSBGMSBoZWxwIHRleHQgZm9yIGZvcm1fZWRpdG9yX2Rlc2NyaXB0aW9uX25vdGF0aW9uX2NvbnRleHQuPC9kZXNjcmlwdGlvbj4gCi0JCSAgICAgICAgPHRvcGljIGhyZWY9Imh0bWwvaGVscC9tYWludG9waWMuaHRtbCIgIGxhYmVsPSJIZWxwVG9waWMxIi8+IAotCQkgICAgICAgIDx0b3BpYyBocmVmPSJodG1sL2hlbHAvc3VidG9waWMyLmh0bWwiICBsYWJlbD0iSGVscFRvcGljMiIvPiAKLQkJCTwvY29udGV4dD4gCi0JCQkKLQkJCQk8Y29udGV4dCAgaWQ9ImZvcm1fZWRpdG9yX2Rlc2NyaXB0aW9uX3RhaWxvcmluZ19jb250ZXh0Ij4gCi0JCQkJPGRlc2NyaXB0aW9uPiBUaGlzIGlzIGEgc2FtcGxlIEYxIGhlbHAgdGV4dCBmb3IgZm9ybV9lZGl0b3JfZGVzY3JpcHRpb25fdGFpbG9yaW5nX2NvbnRleHQuPC9kZXNjcmlwdGlvbj4gCi0JCSAgICAgICAgPHRvcGljIGhyZWY9Imh0bWwvaGVscC9tYWludG9waWMuaHRtbCIgIGxhYmVsPSJIZWxwVG9waWMxIi8+IAotCQkgICAgICAgIDx0b3BpYyBocmVmPSJodG1sL2hlbHAvc3VidG9waWMyLmh0bWwiICBsYWJlbD0iSGVscFRvcGljMiIvPiAKLQkJCTwvY29udGV4dD4gCi0JCQkKLQkJCQk8Y29udGV4dCAgaWQ9ImZvcm1fZWRpdG9yX2Rlc2NyaXB0aW9uX3ZlcnNpb25fY29udGV4dCI+IAotCQkJCTxkZXNjcmlwdGlvbj4gVGhpcyBpcyBhIHNhbXBsZSBGMSBoZWxwIHRleHQgZm9yIGZvcm1fZWRpdG9yX2Rlc2NyaXB0aW9uX3ZlcnNpb25fY29udGV4dC48L2Rlc2NyaXB0aW9uPiAKLQkJICAgICAgICA8dG9waWMgaHJlZj0iaHRtbC9oZWxwL21haW50b3BpYy5odG1sIiAgbGFiZWw9IkhlbHBUb3BpYzEiLz4gCi0JCSAgICAgICAgPHRvcGljIGhyZWY9Imh0bWwvaGVscC9zdWJ0b3BpYzIuaHRtbCIgIGxhYmVsPSJIZWxwVG9waWMyIi8+IAotCQkJPC9jb250ZXh0PiAKLQkJCQotCQkJPGNvbnRleHQgIGlkPSJmb3JtX2VkaXRvcl9kZXNjcmlwdGlvbl9lbGVtZW50X2NvbnRleHQiPiAKLQkJCQk8ZGVzY3JpcHRpb24+IFRoaXMgaXMgYSBzYW1wbGUgRjEgaGVscCB0ZXh0IGZvciBmb3JtX2VkaXRvcl9kZXNjcmlwdGlvbl9lbGVtZW50X2NvbnRleHQuPC9kZXNjcmlwdGlvbj4gCi0JCSAgICAgICAgPHRvcGljIGhyZWY9Imh0bWwvaGVscC9tYWludG9waWMuaHRtbCIgIGxhYmVsPSJIZWxwVG9waWMxIi8+IAotCQkgICAgICAgIDx0b3BpYyBocmVmPSJodG1sL2hlbHAvc3VidG9waWMyLmh0bWwiICBsYWJlbD0iSGVscFRvcGljMiIvPiAKLQkJCTwvY29udGV4dD4gCi0JCQkKLQkJCTxjb250ZXh0ICBpZD0iZm9ybV9lZGl0b3JfZGVzY3JpcHRpb25faWNvbl9jb250ZXh0Ij4gCi0JCQkJPGRlc2NyaXB0aW9uPiBUaGlzIGlzIGEgc2FtcGxlIEYxIGhlbHAgdGV4dCBmb3IgZm9ybV9lZGl0b3JfZGVzY3JpcHRpb25faWNvbl9jb250ZXh0LjwvZGVzY3JpcHRpb24+IAotCQkgICAgICAgIDx0b3BpYyBocmVmPSJodG1sL2hlbHAvbWFpbnRvcGljLmh0bWwiICBsYWJlbD0iSGVscFRvcGljMSIvPiAKLQkJICAgICAgICA8dG9waWMgaHJlZj0iaHRtbC9oZWxwL3N1YnRvcGljMi5odG1sIiAgbGFiZWw9IkhlbHBUb3BpYzIiLz4gCi0JCQk8L2NvbnRleHQ+IAotCQkJPCEtLSBlbmQgb2Ygc2VjdGlvbiBiYXNlZCBGMSBjb250ZXh0IGhlbHAgLS0+Ci0JCi0JPGNvbnRleHQgIGlkPSJlZGl0b3JfY3BfZGVzY3JpcHRpb25fY29udGV4dF9oZWxwX0lEIj4gCi0JCTxkZXNjcmlwdGlvbj48L2Rlc2NyaXB0aW9uPiAKLQkJPHRvcGljIGhyZWY9Imh0bWwvaGVscC9jYXBhYmlsaXR5cGF0dGVybi5odG1sIiAgbGFiZWw9IkNhcGFiaWxpdHkgcGF0dGVybiIvPiAKLSAgICAgICAgPHRvcGljIGhyZWY9Imh0bWwvaGVscC9jcmVhdGVfY2FwYWJpbGl0eV9wYXR0ZXJuLmh0bWwiICBsYWJlbD0iQ3JlYXRlIGEgcmV1c2FibGUgY2FwYWJpbGl0eSBwYXR0ZXJuIi8+IAotCTwvY29udGV4dD4gCi0JCi0JPGNvbnRleHQgIGlkPSJlZGl0b3JfZHBfZGVzY3JpcHRpb25fY29udGV4dF9oZWxwX0lEIj4gCi0JCTxkZXNjcmlwdGlvbj48L2Rlc2NyaXB0aW9uPiAKLQkJPHRvcGljIGhyZWY9Imh0bWwvaGVscC9kZWxpdmVyeV9wcm9jZXNzLmh0bWwiICBsYWJlbD0iRGVsaXZlcnkgcHJvY2VzcyIvPiAKLSAgICAgICAgPHRvcGljIGhyZWY9Imh0bWwvaGVscC9jcmVhdGVfZGVsaXZlcnlfcHJvY2Vzcy5odG1sIiAgbGFiZWw9IkNyZWF0ZSBhIGRlbGl2ZXJ5IHByb2Nlc3MiLz4gCi0JPC9jb250ZXh0PiAKLQkKLQk8Y29udGV4dCAgaWQ9ImZvcm1fZWRpdG9yX3Byb2Nlc3Nfd2JzX2NvbnRleHQiPiAKLQkJPGRlc2NyaXB0aW9uPjwvZGVzY3JpcHRpb24+IAotICAgICAgICA8dG9waWMgaHJlZj0iaHRtbC9oZWxwL2RldmVsb3Bfd2JzLmh0bWwiICBsYWJlbD0iRGV2ZWxvcCBhIHdvcmsgYnJlYWtkb3duIHN0cnVjdHVyZSIvPiAKLQk8L2NvbnRleHQ+IAotCQotCTxjb250ZXh0ICBpZD0iZm9ybV9lZGl0b3JfcHJvY2Vzc19vYnNfY29udGV4dCI+IAotCQk8ZGVzY3JpcHRpb24+PC9kZXNjcmlwdGlvbj4gCi0gICAgICAgIDx0b3BpYyBocmVmPSJodG1sL2hlbHAvZGV2ZWxvcF90ZWFtX3N0cnVjdHVyZS5odG1sIiAgbGFiZWw9IkRldmVsb3AgYSB0ZWFtIGFsbG9jYXRpb24gc3RydWN0dXJlIi8+IAotCTwvY29udGV4dD4gCi0JCi0JPGNvbnRleHQgIGlkPSJmb3JtX2VkaXRvcl9wcm9jZXNzX3Bic19jb250ZXh0Ij4gCi0JCTxkZXNjcmlwdGlvbj48L2Rlc2NyaXB0aW9uPiAKLSAgICAgICAgPHRvcGljIGhyZWY9Imh0bWwvaGVscC9kZXZlbG9wX3dvcmtwcm9kdWN0X3N0cnVjdHVyZS5odG1sIiAgbGFiZWw9IkRldmVsb3AgYSB3b3JrIHByb2R1Y3QgdXNhZ2Ugc3RydWN0dXJlIi8+IAotCTwvY29udGV4dD4gCi0KLQkKLQk8Y29udGV4dCAgaWQ9ImNvbmZpZ3VyYXRpb25fcHVibGlzaF93aXphcmRfYWxsX3BhZ2VzX2NvbnRleHQiPiAKLQkJPGRlc2NyaXB0aW9uPjwvZGVzY3JpcHRpb24+IAotICAgICAgICA8dG9waWMgaHJlZj0iaHRtbC9oZWxwL3B1Ymxpc2hpbmdvdmVydmlldy5odG1sIiAgbGFiZWw9IlB1Ymxpc2hpbmcgb3ZlcnZpZXciLz4gCi0JPC9jb250ZXh0PiAKLQkKLQk8Y29udGV4dCAgaWQ9InJpY2hfdGV4dF9lZGl0b3JfY29udGV4dF9JRCI+IAotCQk8ZGVzY3JpcHRpb24+PC9kZXNjcmlwdGlvbj4gCi0gICAgICAgIDx0b3BpYyBocmVmPSJodG1sL2hlbHAvcmljaHRleHRlZGl0b3IuaHRtbCIgIGxhYmVsPSJSaWNoIHRleHQgZWRpdG9yIi8+IAotICAgICAgICA8dG9waWMgaHJlZj0iaHRtbC9oZWxwL2FkZF9oeXBlcmxpbmsuaHRtbCIgIGxhYmVsPSJBZGRpbmcgYSByZWZlcmVuY2Ugb3IgaHlwZXJsaW5rIi8+IAotCTwvY29udGV4dD4gCi0JCi08L2NvbnRleHRzPiAKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9jcmVhdGVyZXVzYWJsZW1ldGhvZGNvbnRlbnQueG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2NyZWF0ZXJldXNhYmxlbWV0aG9kY29udGVudC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4ZWVmYjQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2NyZWF0ZXJldXNhYmxlbWV0aG9kY29udGVudC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPD9OTFMgIFRZUEU9Im9yZy5lY2xpcHNlLmhlbHAudG9jIj8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLTx0b2MgbGFiZWw9IkNyZWF0ZSBSZXVzYWJsZSBNZXRob2QgQ29udGVudCIgbGlua190bz0ibWFpbi54bWwjY3JlYXRlcmV1c2FibGVtZXRob2Rjb250ZW50X2lkIj4KLSAgPHRvcGljIGxhYmVsPSJNZXRob2QgY29udGVudCBhdXRob3Jpbmcgb3ZlcnZpZXciIGhyZWY9Imh0bWwvaGVscC9tZXRob2RhdXRob3JpbmdvdmVydmlldy5odG1sIi8+Ci0gICA8dG9waWMgbGFiZWw9Ik1ldGhvZCBjb250ZW50IiBocmVmPSJodG1sL2hlbHAvbWV0aG9kX2NvbnRlbnQuaHRtbCIvPgotICAgPHRvcGljIGxhYmVsPSJDcmVhdGUgbWV0aG9kIGNvbnRlbnQiIGhyZWY9Imh0bWwvaGVscC9jcmVhdGVfbWV0aG9kX2NvbnRlbnQuaHRtbCI+Ci0gICAgICA8dG9waWMgbGFiZWw9IkNyZWF0ZSBhIHJvbGUiIGhyZWY9Imh0bWwvaGVscC9jcmVhdGVfcm9sZS5odG1sIi8+Ci0gICAgICA8dG9waWMgbGFiZWw9IkNyZWF0ZSBhIHRhc2siIGhyZWY9Imh0bWwvaGVscC9jcmVhdGVfdGFzay5odG1sIi8+Ci0gICAgICA8dG9waWMgbGFiZWw9IkNyZWF0ZSBhIHdvcmsgcHJvZHVjdCIgaHJlZj0iaHRtbC9oZWxwL2NyZWF0ZV93b3JrcHJvZHVjdC5odG1sIi8+Ci0gICAgICA8dG9waWMgbGFiZWw9IkNyZWF0ZSBndWlkYW5jZSIgaHJlZj0iaHRtbC9oZWxwL2NyZWF0ZV9ndWlkYW5jZS5odG1sIi8+Ci0gICAgICA8dG9waWMgbGFiZWw9IlZhcmlhYmlsaXR5IiBocmVmPSJodG1sL2hlbHAvdmFyaWFiaWxpdHkuaHRtbCI+Ci0gICAgICAgICA8dG9waWMgbGFiZWw9IkNvbnRyaWJ1dGVzIiBocmVmPSJodG1sL2hlbHAvdmFyaWFiaWxpdHlfY29udHJpYnV0ZXMuaHRtbCIvPgotICAgICAgICAgPHRvcGljIGxhYmVsPSJFeHRlbmRzIiBocmVmPSJodG1sL2hlbHAvdmFyaWFiaWxpdHlfZXh0ZW5kcy5odG1sIi8+Ci0gICAgICAgICA8dG9waWMgbGFiZWw9IlJlcGxhY2VzIiBocmVmPSJodG1sL2hlbHAvdmFyaWFiaWxpdHlfcmVwbGFjZS5odG1sIi8+Ci0gICAgICAgICA8dG9waWMgbGFiZWw9IlZhcmlhYmlsaXR5IGFzc29jaWF0aW9ucyIgaHJlZj0iaHRtbC9oZWxwL3ZhcmlhYmlsaXR5X2Fzc29jaWF0aW9ucy5odG1sIi8+Ci0gICAgICA8L3RvcGljPgotICAgPC90b3BpYz4KLSAgIDx0b3BpYyBsYWJlbD0iQnJvd3NlIGFuZCBwcmV2aWV3IG1ldGhvZCBjb250ZW50IiBocmVmPSJodG1sL2hlbHAvYnJvd3NlX2NvbnRlbnQuaHRtbCIvPgotPC90b2M+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvY3JlYXRpbmdfbWV0aG9kX2NvbnRlbnQueG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2NyZWF0aW5nX21ldGhvZF9jb250ZW50LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTFjYmI3NS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvY3JlYXRpbmdfbWV0aG9kX2NvbnRlbnQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTw/TkxTICBUWVBFPSJvcmcuZWNsaXBzZS5oZWxwLnRvYyI/PgotPHRvYyBsYWJlbD0iQ3JlYXRpbmcgcmV1c2FibGUgbWV0aG9kIGNvbnRlbnQiIGxpbmtfdG89Im1haW4ueG1sI2NyZWF0aW5nX21ldGhvZF9jb250ZW50X2lkIj4KLSAgIDx0b3BpYyBsYWJlbD0iQ3JlYXRlIE1ldGhvZCBDb250ZW50IiBocmVmPSJodG1sL3RvcGljcy90X2NyZWF0ZV9tZXRob2RfY29udGVudC5odG1sIi8+Ci0gICA8dG9waWMgbGFiZWw9IkNyZWF0ZSBhIFJvbGUiIGhyZWY9Imh0bWwvdG9waWNzL3RfY3JlYXRlX3JvbGUuaHRtbCIvPgotICAgPHRvcGljIGxhYmVsPSJDcmVhdGUgYSBUYXNrIiBocmVmPSJodG1sL3RvcGljcy90X2NyZWF0ZV90YXNrLmh0bWwiLz4KLSAgIDx0b3BpYyBsYWJlbD0iQ3JlYXRlIGEgV29yayBQcm9kdWN0IiBocmVmPSJodG1sL3RvcGljcy90X2NyZWF0ZV93b3JrcHJvZHVjdC5odG1sIi8+Ci0gICA8dG9waWMgbGFiZWw9IkNyZWF0ZSBHdWlkYW5jZSIgaHJlZj0iaHRtbC90b3BpY3MvdF9jcmVhdGVfZ3VpZGFuY2UuaHRtbCIvPgotICAgPHRvcGljIGxhYmVsPSJHdWlkYW5jZSBSZWxhdGlvbnNoaXBzIiBocmVmPSJodG1sL3RvcGljcy9yX2d1aWRhbmNlX3JlbGF0aW9uc2hpcHMuaHRtbCIvPgotICAgPHRvcGljIGxhYmVsPSJSaWNoIFRleHQgRWRpdG9yIiBocmVmPSJodG1sL3RvcGljcy9jX3JpY2h0ZXh0X2VkaXRvci5odG1sIi8+Ci0gICA8dG9waWMgbGFiZWw9IkFkZCBhIFJlZmVyZW5jZSBvciBIeXBlcmxpbmsiIGhyZWY9Imh0bWwvdG9waWNzL3RfYWRkX2h5cGVybGluay5odG1sIi8+Ci0gICA8dG9waWMgbGFiZWw9Ik1ldGhvZCBDb250ZW50IFZhcmlhYmlsaXR5IiBocmVmPSJodG1sL3RvcGljcy9jX3ZhcmlhYmlsaXR5Lmh0bWwiPgotICAgICAgPHRvcGljIGxhYmVsPSJDb250cmlidXRlcyBWYXJpYWJpbGl0eSIgaHJlZj0iaHRtbC90b3BpY3MvY192YXJpYWJpbGl0eV9jb250cmlidXRlcy5odG1sIi8+Ci0gICAgICA8dG9waWMgbGFiZWw9IkV4dGVuZHMgVmFyaWFiaWxpdHkiIGhyZWY9Imh0bWwvdG9waWNzL2NfdmFyaWFiaWxpdHlfZXh0ZW5kcy5odG1sIi8+Ci0gICAgICA8dG9waWMgbGFiZWw9IlJlcGxhY2VzIFZhcmlhYmlsaXR5IiBocmVmPSJodG1sL3RvcGljcy9jX3ZhcmlhYmlsaXR5X3JlcGxhY2VzLmh0bWwiLz4KLSAgICAgIDx0b3BpYyBsYWJlbD0iRXh0ZW5kcyBhbmQgcmVwbGFjZXMgdmFyaWFiaWxpdHkiIGhyZWY9Imh0bWwvdG9waWNzL2NfdmFyaWFiaWxpdHlfZXh0ZW5kX3JlcGxhY2UuaHRtbCIvPgotICAgICAgPHRvcGljIGxhYmVsPSJBc3NvY2lhdGlvbnMgSW1wYWN0ZWQgYnkgVmFyaWFiaWxpdHkiIGhyZWY9Imh0bWwvdG9waWNzL3JfdmFyaWFiaWxpdHlfYXNzb2NpYXRpb25zLmh0bWwiLz4KLSAgICAgIDx0b3BpYyBsYWJlbD0iQnJvd3NpbmcgVmFyaWFiaWxpdHkgUmVsYXRpb25zaGlwcyIgaHJlZj0iaHRtbC90b3BpY3MvdF92YXJpYWJpbGl0eV9icm93c2luZy5odG1sIi8+Ci0gICA8L3RvcGljPgotICAgPHRvcGljIGxhYmVsPSJCcm93c2UgYW5kIFByZXZpZXcgTWV0aG9kIENvbnRlbnQiIGhyZWY9Imh0bWwvdG9waWNzL3RfYnJvd3NlX2NvbnRlbnQuaHRtbCIvPgotICAgPHRvcGljIGxhYmVsPSJDcmVhdGluZyBJbmRleCBFbnRyaWVzIiBocmVmPSJodG1sL3RvcGljcy9yX2luZGV4X3N5bnRheC5odG1sIi8+Ci0gICA8dG9waWMgbGFiZWw9IkNoYW5naW5nIFRoZSBGZWVkYmFjayBBZGRyZXNzIiBocmVmPSJodG1sL3RvcGljcy9jX2NoYW5naW5nX2ZlZWRiYWNrLmh0bWwiLz4KLSAgIDx0b3BpYyBsYWJlbD0iV2ViIFNpdGUgU2VhcmNoIiBocmVmPSJodG1sL3RvcGljcy9jX3NpdGVfc2VhcmNoLmh0bWwiLz4KLSAgIDx0b3BpYyBsYWJlbD0iR2xvc3NhcnkgZW50cmllcyIgaHJlZj0iaHRtbC90b3BpY3MvY19nbG9zc2FyeS5odG1sIj4KLSAgICAgIDx0b3BpYyBsYWJlbD0iQ3JlYXRpbmcgR2xvc3NhcnkgRW50cmllcyIgaHJlZj0iaHRtbC90b3BpY3MvdF9nbG9zc2FyeV9jcmVhdGUuaHRtbCIvPgotICAgICAgPHRvcGljIGxhYmVsPSJFZGl0aW5nIEdsb3NzYXJ5IEVudHJpZXMiIGhyZWY9Imh0bWwvdG9waWNzL3RfZ2xvc3NhcnlfZWRpdC5odG1sIi8+Ci0gICAgICA8dG9waWMgbGFiZWw9IkRlbGV0aW5nIEdsb3NzYXJ5IEVudHJpZXMiIGhyZWY9Imh0bWwvdG9waWNzL3RfZ2xvc3NhcnlfZGVsZXRlLmh0bWwiLz4KLSAgIDwvdG9waWM+Ci0gICA8dG9waWMgbGFiZWw9IkNvcHlyaWdodCBub3RpY2VzIiBocmVmPSJodG1sL3RvcGljcy9jX2NvcHlyaWdodC5odG1sIj4KLSAgICAgIDx0b3BpYyBsYWJlbD0iQ29weXJpZ2h0IE5vdGljZXMgaW4gYSBOZXcgUGx1Zy1JbiIgaHJlZj0iaHRtbC90b3BpY3MvdF9jb3B5cmlnaHRfbmV3X3BsdWdpbi5odG1sIi8+Ci0gICAgICA8dG9waWMgbGFiZWw9IkNoYW5naW5nIHRoZSBEZWZhdWx0IENvcHlyaWdodCBOb3RpY2UiIGhyZWY9Imh0bWwvdG9waWNzL3RfY29weXJpZ2h0X2NoYW5naW5nX2RlZmF1bHQuaHRtbCIvPgotICAgICAgPHRvcGljIGxhYmVsPSJPdmVycmlkaW5nIHRoZSBDb3B5cmlnaHQgTm90aWNlIGluIGEgUGx1Zy1pbiIgaHJlZj0iaHRtbC90b3BpY3MvdF9jb3B5cmlnaHRfb3ZlcnJpZGluZ19kZWZhdWx0Lmh0bWwiLz4KLSAgIDwvdG9waWM+Ci08L3RvYz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvY3JlYXRpbmdfcHJvY2Vzc2VzLnhtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9jcmVhdGluZ19wcm9jZXNzZXMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZmU5ZjQzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9jcmVhdGluZ19wcm9jZXNzZXMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTw/TkxTICBUWVBFPSJvcmcuZWNsaXBzZS5oZWxwLnRvYyI/PgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08dG9jIGxhYmVsPSJDcmVhdGluZyBwcm9jZXNzZXMiIGxpbmtfdG89Im1haW4ueG1sI2NyZWF0aW5nX3Byb2Nlc3Nlc19pZCI+ICAKLSAgPHRvcGljIGxhYmVsPSJDcmVhdGUgYSByZXVzYWJsZSBjYXBhYmlsaXR5IHBhdHRlcm4iIGhyZWY9Imh0bWwvdG9waWNzL3RfY2FwYWJpbGl0eV9wYXR0ZXJuX2NyZWF0ZS5odG1sIi8+Ci0gIDx0b3BpYyBsYWJlbD0iQ3JlYXRlIGEgZGVsaXZlcnkgcHJvY2VzcyIgaHJlZj0iaHRtbC90b3BpY3MvdF9jcmVhdGVfZGVsaXZlcnlfcHJvY2Vzcy5odG1sIi8+Ci0gIDx0b3BpYyBsYWJlbD0iRGV2ZWxvcCBhIHdvcmsgYnJlYWtkb3duIHN0cnVjdHVyZSIgaHJlZj0iaHRtbC90b3BpY3MvdF9kZXZlbG9wX3dicy5odG1sIi8+Ci0gIDx0b3BpYyBsYWJlbD0iRGV2ZWxvcCBhIHRlYW0gYWxsb2NhdGlvbiBzdHJ1Y3R1cmUiIGhyZWY9Imh0bWwvdG9waWNzL3RfZGV2ZWxvcF90ZWFtX3N0cnVjdHVyZS5odG1sIi8+Ci0gIDx0b3BpYyBsYWJlbD0iRGV2ZWxvcCBhIHdvcmsgcHJvZHVjdCB1c2FnZSBzdHJ1Y3R1cmUiIGhyZWY9Imh0bWwvdG9waWNzL3RfZGV2ZWxvcF93b3JrcHJvZHVjdF9zdHJ1Y3R1cmUuaHRtbCIvPgotICA8dG9waWMgbGFiZWw9IkFwcGx5aW5nIGNhcGFiaWxpdHkgcGF0dGVybnMiIGhyZWY9Imh0bWwvdG9waWNzL2NfY2FwYWJpbGl0eV9wYXR0ZXJuLmh0bWwiPgotICAgIDx0b3BpYyBsYWJlbD0iQ29weWluZyBhIGNhcGFiaWxpdHkgcGF0dGVybiIgaHJlZj0iaHRtbC90b3BpY3MvdF9jYXBhYmlsaXR5X3BhdHRlcm5fY29weS5odG1sIi8+Ci0gICAgPHRvcGljIGxhYmVsPSJFeHRlbmRpbmcgYSBjYXBhYmlsaXR5IHBhdHRlcm4iIGhyZWY9Imh0bWwvdG9waWNzL3RfY2FwYWJpbGl0eV9wYXR0ZXJuX2V4dGVuZC5odG1sIi8+Ci0gICAgPHRvcGljIGxhYmVsPSJEZWVwIGNvcHlpbmcgYSBjYXBhYmlsaXR5IHBhdHRlcm4iIGhyZWY9Imh0bWwvdG9waWNzL3RfY2FwYWJpbGl0eV9wYXR0ZXJuX2RlZXBfY29weS5odG1sIi8+Ci0gICAgPC90b3BpYz4KLSAgPHRvcGljIGxhYmVsPSJQcm9jZXNzIGVsZW1lbnQgcHJvcGVydGllcyB2aWV3IiBocmVmPSJodG1sL3RvcGljcy9jX3Byb3BlcnRpZXNfdmlldy5odG1sIi8+Ci0gIDx0b3BpYyBsYWJlbD0iVXNpbmcgYWN0aXZpdHkgdmFyaWFiaWxpdHkiIGhyZWY9Imh0bWwvdG9waWNzL2NfYWN0aXZpdHlfdmFyaWFiaWxpdHkuaHRtbCIvPgotICA8dG9waWMgbGFiZWw9IlVzaW5nIHByb2Nlc3MgdG8gbWV0aG9kIHN5bmNocm9uaXphdGlvbiIgaHJlZj0iaHRtbC90b3BpY3MvdF91c2luZ19zeW5jaHJvbml6YXRpb24uaHRtbCIvPgotICA8dG9waWMgbGFiZWw9Ildvcmtpbmcgd2l0aCBwcm9jZXNzIGRpYWdyYW1zIiBocmVmPSJodG1sL3RvcGljcy9jX3Byb2Nlc3NfZGlhZ3JhbXMuaHRtbCI+Ci0gICAgIDx0b3BpYyBsYWJlbD0iV29ya2luZyB3aXRoIGFjdGl2aXR5IGRpYWdyYW1zIiBocmVmPSJodG1sL3RvcGljcy9jX2FjdGl2aXR5X2RpYWdyYW1zLmh0bWwiLz4KLSAgICAgPHRvcGljIGxhYmVsPSJXb3JraW5nIHdpdGggYWN0aXZpdHkgZGV0YWlsIGRpYWdyYW1zIiBocmVmPSJodG1sL3RvcGljcy9jX2FjdGl2aXR5X2RldGFpbF9kaWFncmFtcy5odG1sIi8+Ci0gIDwvdG9waWM+Ci08L3RvYz4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9jcmVhdGluZ3Byb2Nlc3Nlcy54bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvY3JlYXRpbmdwcm9jZXNzZXMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OGZjN2IzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9jcmVhdGluZ3Byb2Nlc3Nlcy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPD9OTFMgIFRZUEU9Im9yZy5lY2xpcHNlLmhlbHAudG9jIj8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLTx0b2MgbGFiZWw9IkNyZWF0aW5nIFByb2Nlc3NlcyIgbGlua190bz0ibWFpbi54bWwjY3JlYXRpbmdwcm9jZXNzZXNfaWQiPgotICAgICAgPHRvcGljIGxhYmVsPSJQcm9jZXNzIGF1dGhvcmluZyBvdmVydmlldyIgaHJlZj0iaHRtbC9oZWxwL3Byb2Nlc3NhdXRob3JpbmdvdmVydmlldy5odG1sIj4KLSAgICAgIDx0b3BpYyBsYWJlbD0iUHJvY2VzcyIgaHJlZj0iaHRtbC9oZWxwL3Byb2Nlc3MuaHRtbCIvPgotICAgPC90b3BpYz4KLSAgIDx0b3BpYyBsYWJlbD0iQ3JlYXRlIGEgcmV1c2FibGUgY2FwYWJpbGl0eSBwYXR0ZXJuIiBocmVmPSJodG1sL2hlbHAvY3JlYXRlX2NhcGFiaWxpdHlfcGF0dGVybi5odG1sIj4KLSAgICAgIDx0b3BpYyBsYWJlbD0iQ2FwYWJpbGl0eSBwYXR0ZXJuIiBocmVmPSJodG1sL2hlbHAvY2FwYWJpbGl0eXBhdHRlcm4uaHRtbCIvPgotICAgPC90b3BpYz4KLSAgIDx0b3BpYyBsYWJlbD0iQ3JlYXRlIGEgZGVsaXZlcnkgcHJvY2VzcyIgaHJlZj0iaHRtbC9oZWxwL2NyZWF0ZV9kZWxpdmVyeV9wcm9jZXNzLmh0bWwiPgotICAgICAgPHRvcGljIGxhYmVsPSJEZWxpdmVyeSBwcm9jZXNzIiBocmVmPSJodG1sL2hlbHAvZGVsaXZlcnlfcHJvY2Vzcy5odG1sIi8+Ci0gICA8L3RvcGljPgotICAgPHRvcGljIGxhYmVsPSJEZXZlbG9wIGEgd29yayBicmVha2Rvd24gc3RydWN0dXJlIiBocmVmPSJodG1sL2hlbHAvZGV2ZWxvcF93YnMuaHRtbCIvPgotICAgPHRvcGljIGxhYmVsPSJEZXZlbG9wIGEgdGVhbSBhbGxvY2F0aW9uIHN0cnVjdHVyZSIgaHJlZj0iaHRtbC9oZWxwL2RldmVsb3BfdGVhbV9zdHJ1Y3R1cmUuaHRtbCIvPgotICAgPHRvcGljIGxhYmVsPSJEZXZlbG9wIGEgd29yayBwcm9kdWN0IHVzYWdlIHN0cnVjdHVyZSIgaHJlZj0iaHRtbC9oZWxwL2RldmVsb3Bfd29ya3Byb2R1Y3Rfc3RydWN0dXJlLmh0bWwiLz4KLSAgIDx0b3BpYyBsYWJlbD0iQXBwbHkgYSBjYXBhYmlsaXR5IHBhdHRlcm4iIGhyZWY9Imh0bWwvaGVscC9hcHBseV9jYXBhYmlsaXR5cGF0dGVybi5odG1sIi8+Ci0gICA8dG9waWMgbGFiZWw9IlByb2Nlc3MgZWxlbWVudCBwcm9wZXJ0aWVzIHZpZXciIGhyZWY9Imh0bWwvaGVscC9wcm9wZXJ0aWVzX3ZpZXcuaHRtbCIvPgotICAgPHRvcGljIGxhYmVsPSJXb3JraW5nIHdpdGggcHJvY2VzcyBkaWFncmFtcyIgaHJlZj0iaHRtbC9oZWxwL3Byb2Nlc3NfZGlhZ3JhbXMuaHRtbCI+Ci0gICAgICA8dG9waWMgbGFiZWw9Ildvcmtpbmcgd2l0aCBhY3Rpdml0eSBkaWFncmFtcyIgaHJlZj0iaHRtbC9oZWxwL2FjdGl2aXR5X2RpYWdyYW1zLmh0bWwiLz4KLSAgICAgIDx0b3BpYyBsYWJlbD0iV29ya2luZyB3aXRoIGFjdGl2aXR5IGRldGFpbCBkaWFncmFtcyIgaHJlZj0iaHRtbC9oZWxwL2FjdGl2aXR5X2RldGFpbF9kaWFncmFtcy5odG1sIi8+Ci0gICA8L3RvcGljPgotPC90b2M+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvZG9jLnppcCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9kb2MuemlwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMTQ4YzQ0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9kb2MuemlwCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2dldHRpbmdfc3RhcnRlZC54bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvZ2V0dGluZ19zdGFydGVkLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTA0NWMyZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvZ2V0dGluZ19zdGFydGVkLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08P05MUyAgVFlQRT0ib3JnLmVjbGlwc2UuaGVscC50b2MiPz4KLTx0b2MgbGFiZWw9IkdldHRpbmcgc3RhcnRlZCIgbGlua190bz0ibWFpbi54bWwjZ2V0dGluZ19zdGFydGVkX2lkIj4KLSAgIDx0b3BpYyBsYWJlbD0iVXNlciBJbnRlcmZhY2UgUmVmZXJlbmNlIiBocmVmPSJodG1sL3RvcGljcy9yX3VzZXJfaW50ZXJmYWNlLmh0bWwiLz4KLSAgIDx0b3BpYyBsYWJlbD0iQXV0aG9yaW5nIFBlcnNwZWN0aXZlIiBocmVmPSJodG1sL3RvcGljcy9jX2F1dGhvcmluZ19wZXJzcGVjdGl2ZS5odG1sIi8+Ci0gICA8dG9waWMgbGFiZWw9IkJyb3dzaW5nIFBlcnNwZWN0aXZlIiBocmVmPSJodG1sL3RvcGljcy9jX2Jyb3dzaW5nX3BlcnNwZWN0aXZlLmh0bWwiLz4KLSAgIDx0b3BpYyBsYWJlbD0iQ29uZmlndXJhdGlvbiB2aWV3IiBocmVmPSJodG1sL3RvcGljcy9jX2NvbmZpZ3VyYXRpb25fdmlldy5odG1sIi8+Ci0gICA8dG9waWMgbGFiZWw9IkJyb3dzZSBhbmQgUHJldmlldyBNZXRob2QgQ29udGVudCIgaHJlZj0iaHRtbC90b3BpY3MvdF9icm93c2VfY29udGVudC5odG1sIi8+Ci0gICA8dG9waWMgbGFiZWw9IlNlYXJjaCBmb3IgTWV0aG9kIENvbnRlbnQiIGhyZWY9Imh0bWwvdG9waWNzL3Rfc2VhcmNoX2NvbnRlbnQuaHRtbCIvPgotICAgPHRvcGljIGxhYmVsPSJDcmVhdGUgYSBNZXRob2QgUGx1Zy1pbiIgaHJlZj0iaHRtbC90b3BpY3MvdF9jcmVhdGVfbWV0aG9kX3BsdWdpbi5odG1sIi8+Ci0gICA8dG9waWMgbGFiZWw9IkNyZWF0ZSBhIENvbnRlbnQgUGFja2FnZSIgaHJlZj0iaHRtbC90b3BpY3MvdF9jcmVhdGVfY29udGVudF9wYWNrYWdlLmh0bWwiLz4KLSAgIDx0b3BpYyBsYWJlbD0iQ3JlYXRpbmcgYSBOZXcgTWV0aG9kIENvbmZpZ3VyYXRpb24iIGhyZWY9Imh0bWwvdG9waWNzL3RfbWV0aG9kX2NvbmZpZ3VyYXRpb25fbmV3Lmh0bWwiLz4KLSAgIDx0b3BpYyBsYWJlbD0iQ3JlYXRpbmcgQSBDb3B5IG9mIGEgTWV0aG9kIENvbmZpZ3VyYXRpb24iIGhyZWY9Imh0bWwvdG9waWNzL3RfbWV0aG9kX2NvbmZpZ3VyYXRpb25fY29weS5odG1sIi8+Ci08L3RvYz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvZ2V0dGluZ3N0YXJ0ZWQueG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2dldHRpbmdzdGFydGVkLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODhiMTdlMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvZ2V0dGluZ3N0YXJ0ZWQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTw/TkxTICBUWVBFPSJvcmcuZWNsaXBzZS5oZWxwLnRvYyI/PgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08dG9jIGxhYmVsPSJHZXR0aW5nIFN0YXJ0ZWQiIGxpbmtfdG89Im1haW4ueG1sI2dldHRpbmdzdGFydGVkX2lkIj4KLSAgPHRvcGljIGxhYmVsPSJNZXRob2QgbGlicmFyeSBvdmVydmlldyIgaHJlZj0iaHRtbC9oZWxwL2xpYnJhcnlfb3ZlcnZpZXcuaHRtbCIvPgotICAgPHRvcGljIGxhYmVsPSJUb29sIGludGVyZmFjZSIgaHJlZj0iaHRtbC9oZWxwL3VzZXJpbnRlcmZhY2Vfb3ZlcnZpZXcuaHRtbCI+Ci0gICAgICA8dG9waWMgbGFiZWw9IkF1dGhvcmluZyBwZXJzcGVjdGl2ZSIgaHJlZj0iaHRtbC9oZWxwL2F1dGhvcmluZ19wZXJzcGVjdGl2ZS5odG1sIi8+Ci0gICAgICA8dG9waWMgbGFiZWw9IkJyb3dzaW5nIHBlcnNwZWN0aXZlIiBocmVmPSJodG1sL2hlbHAvYnJvd3NpbmdfcGVyc3BlY3RpdmUuaHRtbCIvPgotICAgICAgPHRvcGljIGxhYmVsPSJDb25maWd1cmF0aW9uIFZpZXciIGhyZWY9Imh0bWwvaGVscC9jb25maWd1cmF0aW9uX3ZpZXcuaHRtbCIvPgotICAgICAgPHRvcGljIGxhYmVsPSJMaWJyYXJ5IHZpZXciIGhyZWY9Imh0bWwvaGVscC9saWJyYXJ5X3ZpZXcuaHRtbCIvPgotICAgICAgPHRvcGljIGxhYmVsPSJCcm93c2UgYW5kIHByZXZpZXcgbWV0aG9kIGNvbnRlbnQiIGhyZWY9Imh0bWwvaGVscC9icm93c2VfY29udGVudC5odG1sIi8+Ci0gICAgICA8dG9waWMgbGFiZWw9IlNlYXJjaCBmb3IgbWV0aG9kIGNvbnRlbnQiIGhyZWY9Imh0bWwvaGVscC9zZWFyY2hfY29udGVudC5odG1sIi8+Ci0gICA8L3RvcGljPgotICAgICAgPHRvcGljIGxhYmVsPSJDcmVhdGUgYSBtZXRob2QgcGx1Zy1pbiIgaHJlZj0iaHRtbC9oZWxwL2NyZWF0ZV9tZXRob2RfcGx1Z2luLmh0bWwiLz4KLSAgICAgIDx0b3BpYyBsYWJlbD0iQ3JlYXRlIGEgY29udGVudCBwYWNrYWdlIiBocmVmPSJodG1sL2hlbHAvY3JlYXRlX2NvbnRlbnRwYWNrYWdlLmh0bWwiLz4KLSAgICAgIDx0b3BpYyBsYWJlbD0iQ3JlYXRlIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24iIGhyZWY9Imh0bWwvaGVscC9jcmVhdGVfbWV0aG9kX2NvbmZpZ3VyYXRpb24uaHRtbCIvPgotPC90b2M+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvZ2xvc3NhcnkueG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2dsb3NzYXJ5LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGQwZGY3YS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvZ2xvc3NhcnkueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTw/TkxTICBUWVBFPSJvcmcuZWNsaXBzZS5oZWxwLnRvYyI/PgotPHRvYyBsYWJlbD0iR2xvc3NhcnkiIGxpbmtfdG89Im1haW4ueG1sI2dsb3NzYXJ5X2lkIj4KLSAgIDx0b3BpYyBsYWJlbD0iQWN0aXZpdHkiIGhyZWY9Imh0bWwvdG9waWNzL2dfYWN0aXZpdHkuaHRtbCIvPgotICAgPHRvcGljIGxhYmVsPSJBcnRpZmFjdCIgaHJlZj0iaHRtbC90b3BpY3MvZ19hcnRpZmFjdC5odG1sIi8+Ci0gICA8dG9waWMgbGFiZWw9IkNoZWNrbGlzdCIgaHJlZj0iaHRtbC90b3BpY3MvZ19jaGVja2xpc3QuaHRtbCIvPgotICAgPHRvcGljIGxhYmVsPSJDb25jZXB0IiBocmVmPSJodG1sL3RvcGljcy9nX2NvbmNlcHQuaHRtbCIvPgotICAgPHRvcGljIGxhYmVsPSJEZWVwIGNvcHkiIGhyZWY9Imh0bWwvdG9waWNzL2dfZGVlcF9jb3B5Lmh0bWwiLz4KLSAgIDx0b3BpYyBsYWJlbD0iRGVsaXZlcmFibGUiIGhyZWY9Imh0bWwvdG9waWNzL2dfZGVsaXZlcmFibGUuaHRtbCIvPgotICAgPHRvcGljIGxhYmVsPSJEZWxpdmVyeSBwcm9jZXNzIiBocmVmPSJodG1sL3RvcGljcy9nX2RlbGl2ZXJ5X3Byb2Nlc3MuaHRtbCIvPgotICAgPHRvcGljIGxhYmVsPSJEaXNjaXBsaW5lIiBocmVmPSJodG1sL3RvcGljcy9nX2Rpc2NpcGxpbmUuaHRtbCIvPgotICAgPHRvcGljIGxhYmVsPSJEb21haW4iIGhyZWY9Imh0bWwvdG9waWNzL2dfZG9tYWluLmh0bWwiLz4KLSAgIDx0b3BpYyBsYWJlbD0iRXN0aW1hdGluZyBjb25zaWRlcmF0aW9ucyIgaHJlZj0iaHRtbC90b3BpY3MvZ19lc3RpbWF0aW5nX2NvbnNpZGVyYXRpb25zLmh0bWwiLz4KLSAgIDx0b3BpYyBsYWJlbD0iRXN0aW1hdGluZyBndWlkZWxpbmUiIGhyZWY9Imh0bWwvdG9waWNzL2dfZXN0aW1hdGluZ19ndWlkZWxpbmUuaHRtbCIvPgotICAgPHRvcGljIGxhYmVsPSJFeGFtcGxlIiBocmVmPSJodG1sL3RvcGljcy9nX2V4YW1wbGUuaHRtbCIvPgotICAgPHRvcGljIGxhYmVsPSJHdWlkZWxpbmUiIGhyZWY9Imh0bWwvdG9waWNzL2dfZ3VpZGVsaW5lLmh0bWwiLz4KLSAgIDx0b3BpYyBsYWJlbD0iSXRlcmF0aW9uIiBocmVmPSJodG1sL3RvcGljcy9nX2l0ZXJhdGlvbi5odG1sIi8+Ci0gICA8dG9waWMgbGFiZWw9IkxpYnJhcnkgdmlldyIgaHJlZj0iaHRtbC90b3BpY3MvZ19saWJyYXJ5X3ZpZXcuaHRtbCIvPgotICAgPHRvcGljIGxhYmVsPSJNaWxlc3RvbmUiIGhyZWY9Imh0bWwvdG9waWNzL2dfbWlsZXN0b25lLmh0bWwiLz4KLSAgIDx0b3BpYyBsYWJlbD0iT3V0Y29tZSIgaHJlZj0iaHRtbC90b3BpY3MvZ19vdXRjb21lLmh0bWwiLz4KLSAgIDx0b3BpYyBsYWJlbD0iUGhhc2UiIGhyZWY9Imh0bWwvdG9waWNzL2dfcGhhc2UuaHRtbCIvPgotICAgPHRvcGljIGxhYmVsPSJQcmFjdGljZSIgaHJlZj0iaHRtbC90b3BpY3MvZ19wcmFjdGljZS5odG1sIi8+Ci0gICA8dG9waWMgbGFiZWw9IlByZXZpZXciIGhyZWY9Imh0bWwvdG9waWNzL2dfcHJldmlldy5odG1sIi8+Ci0gICA8dG9waWMgbGFiZWw9IlJlcG9ydCIgaHJlZj0iaHRtbC90b3BpY3MvZ19yZXBvcnQuaHRtbCIvPgotICAgPHRvcGljIGxhYmVsPSJSZXVzYWJsZSBhc3NldCIgaHJlZj0iaHRtbC90b3BpY3MvZ19yZXVzYWJsZV9hc3NldC5odG1sIi8+Ci0gICA8dG9waWMgbGFiZWw9IlJvYWRtYXAiIGhyZWY9Imh0bWwvdG9waWNzL2dfcm9hZG1hcC5odG1sIi8+Ci0gICA8dG9waWMgbGFiZWw9IlJvbGUiIGhyZWY9Imh0bWwvdG9waWNzL2dfcm9sZS5odG1sIi8+Ci0gICA8dG9waWMgbGFiZWw9IlJvbGUgc2V0IiBocmVmPSJodG1sL3RvcGljcy9nX3JvbGVzZXQuaHRtbCIvPgotICAgPHRvcGljIGxhYmVsPSJSb2xlIHNldCBncm91cGluZyIgaHJlZj0iaHRtbC90b3BpY3MvZ19yb2xlc2V0X2dyb3VwaW5nLmh0bWwiLz4KLSAgIDx0b3BpYyBsYWJlbD0iU3RlcCIgaHJlZj0iaHRtbC90b3BpY3MvZ19zdGVwLmh0bWwiLz4KLSAgIDx0b3BpYyBsYWJlbD0iU3VwcG9ydGluZyBtYXRlcmlhbCIgaHJlZj0iaHRtbC90b3BpY3MvZ19zdXBwb3J0aW5nX21hdGVyaWFsLmh0bWwiLz4KLSAgIDx0b3BpYyBsYWJlbD0iU3luY2hyb25pemF0aW9uIiBocmVmPSJodG1sL3RvcGljcy9nX3N5bmNocm9uaXphdGlvbi5odG1sIi8+Ci0gICA8dG9waWMgbGFiZWw9IlRhc2siIGhyZWY9Imh0bWwvdG9waWNzL2dfdGFzay5odG1sIi8+Ci0gICA8dG9waWMgbGFiZWw9IlRlbXBsYXRlIiBocmVmPSJodG1sL3RvcGljcy9nX3RlbXBsYXRlLmh0bWwiLz4KLSAgIDx0b3BpYyBsYWJlbD0iVGVybSBkZWZpbml0aW9uIiBocmVmPSJodG1sL3RvcGljcy9nX3Rlcm1fZGVmaW5pdGlvbi5odG1sIi8+Ci0gICA8dG9waWMgbGFiZWw9IlRvb2wgbWVudG9yIiBocmVmPSJodG1sL3RvcGljcy9nX3Rvb2xfbWVudG9yLmh0bWwiLz4KLSAgIDx0b3BpYyBsYWJlbD0iV2hpdGUgcGFwZXIiIGhyZWY9Imh0bWwvdG9waWNzL2dfd2hpdGVwYXBlci5odG1sIi8+Ci0gICA8dG9waWMgbGFiZWw9IldvcmsgcHJvZHVjdCIgaHJlZj0iaHRtbC90b3BpY3MvZ193b3JrX3Byb2R1Y3QuaHRtbCIvPgotICAgPHRvcGljIGxhYmVsPSJXb3JrIHByb2R1Y3QgZGVzY3JpcHRvciIgaHJlZj0iaHRtbC90b3BpY3MvZ193b3JrX3Byb2R1Y3RfZGVzY3JpcHRvci5odG1sIi8+Ci0gICA8dG9waWMgbGFiZWw9IldvcmsgcHJvZHVjdCBraW5kIiBocmVmPSJodG1sL3RvcGljcy9nX3dvcmtfcHJvZHVjdF9raW5kLmh0bWwiLz4KLTwvdG9jPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL0F1dGhvclBlcnNwLkpQRyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL0F1dGhvclBlcnNwLkpQRwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmE0ZTc5MC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9BdXRob3JQZXJzcC5KUEcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9hYm91dGVwZmNvbXBvc2VyLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9hYm91dGVwZmNvbXBvc2VyLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjYTU2MjMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvYWJvdXRlcGZjb21wb3Nlci5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTY0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgaHRtbAotICBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0ic2VjdXJpdHkiIGNvbnRlbnQ9InB1YmxpYyIgLz4KLTxtZXRhIG5hbWU9IlJvYm90cyIgY29udGVudD0iaW5kZXgsZm9sbG93IiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBuYW1lPSJEQy5UeXBlIiBjb250ZW50PSJjb25jZXB0IiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IkFib3V0IEVjbGlwc2UgUHJvY2VzcyBGcmFtZXdvcmsgQ29tcG9zZXIiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9Im1ldGhvZGF1dGhvcmluZ292ZXJ2aWV3Lmh0bWwjbWV0aG9kYXV0aG9yaW5nb3ZlcnZpZXciIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9InByb2Nlc3NhdXRob3JpbmdvdmVydmlldy5odG1sI3Byb2Nlc3NhdXRob3JpbmdvdmVydmlldyIgLz4KLTxtZXRhIG5hbWU9IkRDLkZvcm1hdCIgY29udGVudD0iWEhUTUwiIC8+Ci08bWV0YSBuYW1lPSJEQy5JZGVudGlmaWVyIiBjb250ZW50PSJhYm91dGVwZmNvbXBvc2VyIiAvPgotPG1ldGEgbmFtZT0iREMuTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIiAvPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuL2libWRpdGEuY3NzIiAvPgotPHRpdGxlPkFib3V0IEVjbGlwc2UgUHJvY2VzcyBGcmFtZXdvcmsgQ29tcG9zZXI8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9ImFib3V0ZXBmY29tcG9zZXIiPjxhIG5hbWU9ImFib3V0ZXBmY29tcG9zZXIiPjwhLS0gLS0+PC9hPgotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5BYm91dCBFY2xpcHNlIFByb2Nlc3MgRnJhbWV3b3JrIENvbXBvc2VyPC9oMT4KLTxkaXY+PHA+V2VsY29tZSB0byBFY2xpcHNlIFByb2Nlc3MgRnJhbWV3b3JrIENvbXBvc2VyIChFUEYgQ29tcG9zZXIpLiBFUEYgQ29tcG9zZXIgaXMgYSB0b29sIHBsYXRmb3JtIHRoYXQKLWVuYWJsZXMgcHJvY2VzcyBlbmdpbmVlcnMgYW5kIG1hbmFnZXJzIHRvIGltcGxlbWVudCwgZGVwbG95LCBhbmQgbWFpbnRhaW4KLXByb2Nlc3NlcyBmb3Igb3JnYW5pemF0aW9ucyBvciBpbmRpdmlkdWFsIHByb2plY3RzLiBUeXBpY2FsbHksIHR3byBrZXkgcHJvYmxlbXMKLW5lZWQgdG8gYmUgYWRkcmVzc2VkIHRvIHN1Y2Nlc3NmdWxseSBkZXBsb3kgbmV3IHByb2Nlc3Nlcy48L3A+Ci08cD5GaXJzdCwgZGV2ZWxvcG1lbnQgdGVhbXMgbmVlZCB0byBiZSBlZHVjYXRlZCBvbiB0aGUgbWV0aG9kcyBhcHBsaWNhYmxlCi10byB0aGUgcm9sZXMgdGhhdCB0aGV5IGFyZSByZXNwb25zaWJsZSBmb3IuIFNvZnR3YXJlIGRldmVsb3BlcnMgdHlwaWNhbGx5Ci1uZWVkIHRvIGxlYXJuIGhvdyB0byBkbyBhbmFseXNpcyBhbmQgZGVzaWduLCB0ZXN0ZXJzIG5lZWQgdG8gbGVhcm4gaG93IHRvCi10ZXN0IGltcGxlbWVudGF0aW9ucyBhZ2FpbnN0IHJlcXVpcmVtZW50cywgbWFuYWdlcnMgbmVlZCB0byBsZWFybiBob3cgdG8gbWFuYWdlCi10aGUgcHJvamVjdCBzY29wZSBhbmQgY2hhbmdlLCBhbmQgc28gb24uIFNvbWUgb3JnYW5pemF0aW9ucyBhc3N1bWUgdGhhdCBkZXZlbG9wZXJzCi1pbXBsaWNpdGx5IGtub3cgaG93IHRvIGRvIHN1Y2ggd29yayB3aXRob3V0IGRvY3VtZW50aW5nIHRoZWlyIG1ldGhvZHMsIGJ1dAotbWFueSBvcmdhbml6YXRpb25zIHdhbnQgdG8gZXN0YWJsaXNoIGNvbW1vbiBhbmQgcmVndWxhdGVkIHByYWN0aWNlcywgdG8gZHJpdmUKLXNwZWNpZmljIGltcHJvdmVtZW50IG9iamVjdGl2ZXMsIGFuZCB0byBtZWV0IGNvbXBsaWFuY2Ugc3RhbmRhcmRzLiA8L3A+Ci08cD5TZWNvbmQsIGRldmVsb3BtZW50IHRlYW1zIG5lZWQgdG8gdW5kZXJzdGFuZCBob3cgdG8gYXBwbHkgdGhlc2UgbWV0aG9kcwotdGhyb3VnaG91dCBhIGRldmVsb3BtZW50IGxpZmVjeWNsZS4gVGhhdCBpcywgdGhleSBuZWVkIHRvIGRlZmluZSBvciBzZWxlY3QKLWEgZGV2ZWxvcG1lbnQgcHJvY2Vzcy4gRm9yIGV4YW1wbGUsIHJlcXVpcmVtZW50cyBtYW5hZ2VtZW50IG1ldGhvZHMgaGF2ZSB0bwotYmUgYXBwbGllZCBkaWZmZXJlbnRseSBpbiBlYXJseSBwaGFzZXMgb2YgYSBwcm9qZWN0IHdoZXJlIHRoZSBmb2N1cyBpcyBvbgotZWxpY2l0YXRpb24gb2Ygc3Rha2Vob2xkZXIgbmVlZHMgYW5kIHJlcXVpcmVtZW50cyBhbmQgc2NvcGluZyBhIHZpc2lvbiwgdGhhbgotaW4gbGF0ZXIgcGhhc2VzIHdoZXJlIHRoZSBmb2N1cyBpcyBvbiBtYW5hZ2luZyByZXF1aXJlbWVudHMgdXBkYXRlcyBhbmQgY2hhbmdlcwotYW5kIHBlcmZvcm1pbmcgaW1wYWN0IGFuYWx5c2lzIG9mIHRoZXNlIHJlcXVpcmVtZW50cyBjaGFuZ2VzLiBUZWFtcyBhbHNvIG5lZWQKLWNsZWFyIHVuZGVyc3RhbmRpbmcgb2YgaG93IHRoZSBkaWZmZXJlbnQgdGFza3Mgb2YgdGhlIG1ldGhvZHMgcmVsYXRlIHRvIGVhY2gKLW90aGVyLCBmb3IgZXhhbXBsZSwgaG93IHRoZSBjaGFuZ2UgbWFuYWdlbWVudCBtZXRob2QgaW1wYWN0cyB0aGUgcmVxdWlyZW1lbnRzCi1tYW5hZ2VtZW50IG1ldGhvZCBhcyB3ZWxsIGFzIHJlZ3Jlc3Npb24gdGVzdGluZyBtZXRob2QgdGhyb3VnaG91dCB0aGUgbGlmZWN5Y2xlLgotRXZlbiBzZWxmLW9yZ2FuaXppbmcgdGVhbXMgbmVlZCB0byBkZWZpbmUgYSBwcm9jZXNzIHRoYXQgZ2l2ZXMgYXQgbWluaW11bQotc29tZSBndWlkYW5jZSBvbiBob3cgdGhlIGRldmVsb3BtZW50IHdpbGwgYmUgc2NvcGVkIHRocm91Z2hvdXQgdGhlIGxpZmVjeWNsZSwKLXdoZW4gbWlsZXN0b25lcyB3aWxsIGJlIGFjaGlldmVkIGFuZCB2ZXJpZmllZCwgYW5kIHNvIG9uLiAgPC9wPgotPGRpdiBjbGFzcz0icCI+VG8gdGhhdCBlbmQsIEVQRiBDb21wb3NlciBoYXMgdHdvIG1haW4gcHVycG9zZXM6PHVsPjxsaT5UbyBwcm92aWRlIGEga25vd2xlZGdlIGJhc2Ugb2YgaW50ZWxsZWN0dWFsIGNhcGl0YWwgd2hpY2ggeW91IGNhbiBicm93c2UsCi1tYW5hZ2UgYW5kIGRlcGxveS4gVGhpcyBjb250ZW50IGNhbiBpbmNsdWRlIGV4dGVybmFsbHkgZGV2ZWxvcGVkIGNvbnRlbnQsCi1hbmQsIG1vcmUgaW1wb3J0YW50bHksIGNhbiBpbmNsdWRlIHlvdXIgb3duIGNvbnRlbnQgaW5jbHVkaW5nIG9mIHdoaXRlcGFwZXJzLAotZ3VpZGVsaW5lcywgdGVtcGxhdGVzLCBwcmluY2lwbGVzLCBiZXN0IHByYWN0aWNlcywgaW50ZXJuYWwgcHJvY2VkdXJlcyBhbmQKLXJlZ3VsYXRpb25zLCB0cmFpbmluZyBtYXRlcmlhbCwgYW5kIGFueSBvdGhlciBnZW5lcmFsIGRlc2NyaXB0aW9ucyBvZiB5b3VyCi1tZXRob2RzLiBUaGlzIGtub3dsZWRnZSBiYXNlIGNhbiB1c2VkIGZvciByZWZlcmVuY2UgYW5kIGVkdWNhdGlvbi4gSXQgYWxzbwotZm9ybXMgdGhlIGJhc2lzIGZvciBkZXZlbG9waW5nIHByb2Nlc3NlcyAodGhlIHNlY29uZCBwdXJwb3NlKS4gRVBGIENvbXBvc2VyIGlzIGRlc2lnbmVkCi10byBiZSBhIGNvbnRlbnQgbWFuYWdlbWVudCBzeXN0ZW0gdGhhdCBwcm92aWRlcyBhIGNvbW1vbiBtYW5hZ2VtZW50IHN0cnVjdHVyZQotYW5kIGxvb2sgYW5kIGZlZWwgZm9yIGFsbCBvZiB5b3VyIGNvbnRlbnQsIHJhdGhlciB0aGFuIGJlaW5nIGEgZG9jdW1lbnQgbWFuYWdlbWVudAotc3lzdGVtIGluIHdoaWNoIHlvdSB3b3VsZCBzdG9yZSBhbmQgYWNjZXNzIGhhcmQgdG8gbWFpbnRhaW4gbGVnYWN5IGRvY3VtZW50cwotYWxsIGluIHRoZWlyIG93biBzaGFwZXMgYW5kIGZvcm1hdHMuIEFsbCBjb250ZW50IG1hbmFnZWQgaW4gRVBGIENvbXBvc2VyIGNhbiBiZSBwdWJsaXNoZWQKLXRvIGh0bWwgYW5kIGRlcGxveWVkIHRvIFdlYiBzZXJ2ZXJzIGZvciBkaXN0cmlidXRlZCB1c2FnZS4gPC9saT4KLTxsaT5UbyBwcm92aWRlIHByb2Nlc3MgZW5naW5lZXJpbmcgY2FwYWJpbGl0aWVzIGJ5IHN1cHBvcnRpbmcgcHJvY2VzcyBlbmdpbmVlcnMKLWFuZCBwcm9qZWN0IG1hbmFnZXJzIGluIHNlbGVjdGluZywgdGFpbG9yaW5nLCBhbmQgcmFwaWRseSBhc3NlbWJsaW5nIHByb2Nlc3NlcwotZm9yIHRoZWlyIGNvbmNyZXRlIGRldmVsb3BtZW50IHByb2plY3RzLiBFUEYgQ29tcG9zZXIgcHJvdmlkZXMgY2F0YWxvZ3Mgb2YgcHJlLWRlZmluZWQKLXByb2Nlc3NlcyBmb3IgdHlwaWNhbCBwcm9qZWN0IHNpdHVhdGlvbnMgdGhhdCBjYW4gYmUgYWRhcHRlZCB0byBpbmRpdmlkdWFsCi1uZWVkcy4gSXQgYWxzbyBwcm92aWRlcyBwcm9jZXNzIGJ1aWxkaW5nIGJsb2NrcywgY2FsbGVkIGNhcGFiaWxpdHkgcGF0dGVybnMsCi10aGF0IHJlcHJlc2VudCBiZXN0IGRldmVsb3BtZW50IHByYWN0aWNlcyBmb3Igc3BlY2lmaWMgZGlzY2lwbGluZXMsIHRlY2hub2xvZ2llcywKLW9yIG1hbmFnZW1lbnQgc3R5bGVzLiBUaGVzZSBidWlsZGluZyBibG9ja3MgZm9ybSBhIHRvb2xraXQgZm9yIHF1aWNrIGFzc2VtYmx5Ci1vZiBwcm9jZXNzZXMgYmFzZWQgb24gcHJvamVjdC1zcGVjaWZpYyBuZWVkcy4gRVBGIENvbXBvc2VyIGFsc28gYWxsb3dzIHlvdSB0byBzZXQgdXAKLXlvdXIgb3duIG9yZ2FuaXphdGlvbi1zcGVjaWZpYyBjYXBhYmlsaXR5IHBhdHRlcm4gbGlicmFyaWVzLiBGaW5hbGx5LCB0aGUKLXByb2Nlc3NlcyBjcmVhdGVkIHdpdGggRVBGIENvbXBvc2VyIGNhbiBiZSBwdWJsaXNoZWQgYW5kIGRlcGxveWVkIGFzIFdlYiBzaXRlcy4gPC9saT4KLTwvdWw+Ci08L2Rpdj4KLTxkaXYgY2xhc3M9InAiPjxzdHJvbmc+RWNsaXBzZSBQcm9jZXNzIEZyYW1ld29yayBDb21wb3NlciBLZXkgQ29uY2VwdHM8L3N0cm9uZz48dWw+PGxpPlByb3ZpZGVzIGNvbXBsZXRlbHkgcmVkZXNpZ25lZCB0b29scyBmb3IgYXV0aG9yaW5nLCBjb25maWd1cmluZywgdmlld2luZywKLWFuZCBwdWJsaXNoaW5nIGRldmVsb3BtZW50IHByb2Nlc3Nlcy4gPC9saT4KLTxsaT5Qcm92aWRlcyBqdXN0LWluLXRpbWUgZ2VuZXJhdGlvbiBvZiBwdWJsaWNhdGlvbiBwcmV2aWV3cyBpbiBkZWRpY2F0ZWQKLWJyb3dzaW5nIHBlcnNwZWN0aXZlIHRoYXQgYWxsb3dzIHJhcGlkIGNvbmZpZ3VyYXRpb24gc3dpdGNoaW5nLiA8L2xpPgotPGxpPk1hbmFnZXMgbWV0aG9kIGNvbnRlbnQgdXNpbmcgc2ltcGxlIGZvcm0tYmFzZWQgdXNlciBpbnRlcmZhY2VzLiBUaGVyZWZvcmUsCi1VTUwgbW9kZWxpbmcgc2tpbGxzIGFyZSBubyBsb25nZXIgcmVxdWlyZWQuIDwvbGk+Ci08bGk+UHJvdmlkZXMgaW50dWl0aXZlIHJpY2ggdGV4dCBlZGl0b3JzIGZvciBjcmVhdGluZyBpbGx1c3RyYXRpdmUgY29udGVudAotZGVzY3JpcHRpb25zLiBFZGl0b3JzIGFsbG93IHVzZSBvZiBzdHlsZXMsIGltYWdlcywgdGFibGVzLCBoeXBlcmxpbmtzLCBhbmQKLWRpcmVjdCBIVE1MIGVkaXRpbmcuPC9saT4KLTxsaT5BbGxvd3MgY3JlYXRpbmcgcHJvY2Vzc2VzIHdpdGggYnJlYWtkb3duIHN0cnVjdHVyZSBlZGl0b3JzIGFuZCB3b3JrZmxvdwotZGlhZ3JhbXMgdGhyb3VnaCB1c2Ugb2YgbXVsdGktcHJlc2VudGF0aW9uIHByb2Nlc3MgZWRpdG9ycy4gQnJlYWtkb3duIHN0cnVjdHVyZQotZWRpdG9yIHN1cHBvcnRzIGRpZmZlcmVudCBwcm9jZXNzIHZpZXdzOiB3b3JrLWJyZWFrZG93biB2aWV3LCB3b3JrIHByb2R1Y3QKLXVzYWdlIHZpZXcsIGFuZCB0ZWFtIGFsbG9jYXRpb24gdmlldy4gRVBGIENvbXBvc2VyIGF1dG9tYXRpY2FsbHkgc3luY2hyb25pemVzIGFsbCBwcmVzZW50YXRpb25zCi13aXRoIHByb2Nlc3MgY2hhbmdlcy4gPC9saT4KLTxsaT5Qcm92aWRlcyBzdXBwb3J0IGZvciBtYW55IGFsdGVybmF0aXZlIGxpZmVjeWNsZQotbW9kZWxzLiBGb3IgZXhhbXBsZSwgd2F0ZXJmYWxsLCBpbmNyZW1lbnRhbCwgb3IgaXRlcmF0aXZlIG1vZGVscyBjYW4gYmUgY3JlYXRlZAotd2l0aCB0aGUgc2FtZSBvdmVybGFwcGluZyBtZXRob2QgY29udGVudC4gPC9saT4KLTxsaT5JbXByb3ZlZCByZXVzZSBhbmQgZXh0ZW5zaWJpbGl0eSBjYXBhYmlsaXRpZXMuIFRoZSBwbHVnLWluIG1lY2hhbmlzbXMKLWZyb20gcGFzdCB2ZXJzaW9ucyBoYXZlIGJlZW4gZXh0ZW5kZWQgdG8gc3VwcG9ydCBleHRlbnNpb25zIGZvciBicmVha2Rvd24KLXN0cnVjdHVyZXMuPC9saT4KLTxsaT5TdXBwb3J0cyByZXVzYWJsZSBkeW5hbWljYWxseS1saW5rZWQgcHJvY2VzcyBwYXR0ZXJucyBvZiBiZXN0IHByYWN0aWNlcwotZm9yIHJhcGlkIHByb2Nlc3MgYXNzZW1ibHkgdmlhIGRyYWctYW5kLWRyb3AuIDwvbGk+Ci08L3VsPgotPC9kaXY+Ci08cD48c3Ryb25nPktleSBUZXJtaW5vbG9neSBhbmQgQ29uY2VwdHM8L3N0cm9uZz48L3A+Ci08cD5UbyBlZmZlY3RpdmVseSB3b3JrIHdpdGggRVBGIENvbXBvc2VyLCB5b3UgbmVlZCB0byB1bmRlcnN0YW5kIGEgZmV3Ci1jb25jZXB0cyB0aGF0IGFyZSB1c2VkIHRvIG9yZ2FuaXplIHRoZSBjb250ZW50LiBUaGUgcGFnZXMgTWV0aG9kIENvbnRlbnQgQXV0aG9yaW5nCi1PdmVydmlldyBhbmQgUHJvY2VzcyBBdXRob3JpbmcgT3ZlcnZpZXcgY29udGFpbiBtb3JlIGRldGFpbCBhbmQgY29uY3JldGUgZXhhbXBsZXMKLW9mIGhvdyB0byB3b3JrIGluIHRoZSB0b29sLiBUaGlzIHBhZ2UgcHJvdmlkZXMgeW91IHdpdGggYSBnZW5lcmFsIG92ZXJ2aWV3Ci1vZiB0aGVzZSBjb25jZXB0cy4gPC9wPgotPHA+VGhlIG1vc3QgZnVuZGFtZW50YWwgcHJpbmNpcGxlIGluIEVQRiBDb21wb3NlciBpcyB0aGUgc2VwYXJhdGlvbiBvZiByZXVzYWJsZSBjb3JlCi1tZXRob2QgY29udGVudCBmcm9tIGl0cyBhcHBsaWNhdGlvbiBpbiBwcm9jZXNzZXMuIFRoaXMgZGlyZWN0bHkgcmVsYXRlcyBiYWNrCi10byB0aGUgdHdvIHB1cnBvc2VzIG9mIEVQRiBDb21wb3NlciBkZXNjcmliZWQgaW4gdGhlIGZpcnN0IHNlY3Rpb24uIEFsbW9zdCBhbGwgb2YgRVBGIENvbXBvc2VyJ3MKLWNvbmNlcHRzIGFyZSBjYXRlZ29yaXplZCBhbG9uZyB0aGlzIHNlcGFyYXRpb24uIE1ldGhvZCBjb250ZW50IGRlc2NyaWJlcyB3aGF0Ci1pcyB0byBiZSBwcm9kdWNlZCwgdGhlIG5lY2Vzc2FyeSBza2lsbHMgcmVxdWlyZWQgYW5kIHRoZSBzdGVwLWJ5LXN0ZXAgZXhwbGFuYXRpb25zCi1kZXNjcmliaW5nIGhvdyBzcGVjaWZpYyBkZXZlbG9wbWVudCBnb2FscyBhcmUgYWNoaWV2ZWQuIFRoZXNlIG1ldGhvZCBjb250ZW50Ci1kZXNjcmlwdGlvbnMgYXJlIGluZGVwZW5kZW50IG9mIGEgZGV2ZWxvcG1lbnQgbGlmZWN5Y2xlLiBQcm9jZXNzZXMgZGVzY3JpYmUKLXRoZSBkZXZlbG9wbWVudCBsaWZlY3ljbGUuIFByb2Nlc3NlcyB0YWtlIHRoZSBtZXRob2QgY29udGVudCBlbGVtZW50cyBhbmQKLXJlbGF0ZSB0aGVtIGludG8gc2VtaS1vcmRlcmVkIHNlcXVlbmNlcyB0aGF0IGFyZSBjdXN0b21pemVkIHRvIHNwZWNpZmljIHR5cGVzCi1vZiBwcm9qZWN0cy4gPC9wPgotPHA+PGltZyBzcmM9InVtYV9odW1wLmdpZiIgYWx0PSIiIC8+PC9wPgotPHA+VGhlIGZpZ3VyZSBhYm92ZSBzaG93cyBob3cgdGhpcyBzZXBhcmF0aW9uIGlzIGRlcGljdGVkIGluIEJhc2ljIFVuaWZpZWQKLVByb2Nlc3MuIE1ldGhvZCBjb250ZW50LCBkZXNjcmliaW5nIGhvdyBkZXZlbG9wbWVudCB3b3JrIGlzIGJlaW5nIHBlcmZvcm1lZCwKLWlzIGNhdGVnb3JpemVkIGJ5IGRpc2NpcGxpbmVzIGFsb25nIHRoZSB5LWF4aXMgb2YgdGhlIGRpYWdyYW0uIFRoZSB3b3JrIGRlc2NyaWJlZAotaW4gYSBwcm9jZXNzIGlzIHNlZW4gYWxvbmcgdGhlIHgtYXhpcyByZXByZXNlbnRpbmcgdGhlIHRpbWVsaW5lLiBUaGlzIGlzIHRoZQotbGlmZWN5Y2xlIG9mIGEgZGV2ZWxvcG1lbnQgcHJvamVjdC4gSXQgZXhwcmVzc2VzIHdoZW4gd2hhdCB3b3JrIHdpbGwgYmUgcGVyZm9ybWVkLgotVGhlIGdyYXBoIGluIHRoZSBpbGx1c3RyYXRpb24gcmVwcmVzZW50cyBhbiBlc3RpbWF0ZWQgd29ya2xvYWQgZm9yIGVhY2ggZGlzY2lwbGluZS4KLUFzIHlvdSBzZWUsIGZvciBleGFtcGxlLCBvbmUgbmV2ZXIgc3RvcHMgd29ya2luZyBvbiByZXF1aXJlbWVudHMgaW4gT3BlblVQL0Jhc2ljLCBidXQKLXRoZXJlIGFyZSBjZXJ0YWlubHkgcGVhayB0aW1lcyBpbiB3aGljaCBtb3N0IG9mIHRoZSByZXF1aXJlbWVudHMgZWxpY2l0YXRpb24KLWFuZCBkZXNjcmlwdGlvbiB3b3JrIGlzIHBlcmZvcm1lZC4gVGhlcmUgYXJlIGFsc28gdGltZXMgYXQgd2hpY2ggYSBkb3dud2FyZAotdHJlbmQgbmVlZHMgdG8gYmUgb2JzZXJ2ZWQgd2hlcmUgZmV3ZXIgYW5kIGZld2VyIHJlcXVpcmVtZW50cyBjaGFuZ2VzIGhhdmUKLXRvIGJlIHByb2Nlc3NlZCB0byBicmluZyB0aGUgcHJvamVjdCB0byBhIGNsb3NlLiBUaGlzIGF2b2lkcyB3aGF0IGlzIHJlZmVycmVkCi10byBhcyBmZWF0dXJlIGNyZWVwIGluIHdoaWNoIHJlcXVpcmVtZW50cyB3b3JrIHJlbWFpbnMgY29uc3RhbnQgb3IgZXZlbiBpbmNyZWFzZXMuCi1IZW5jZSwgYSBsaWZlY3ljbGUgKHByb2Nlc3MpIGV4cHJlc3NlcyB0aGUgdmFyaWFuY2VzIG9mIHdvcmsgcGVyZm9ybWVkIGluCi10aGUgdmFyaW91cyBkaXNjaXBsaW5lcyAobWV0aG9kIGNvbnRlbnQpLiA8L3A+Ci08cD48aW1nIHNyYz0ibWV0aF92c19wcm9jLmdpZiIgYWx0PSIiIC8+PC9wPgotPHA+VGhlIHBpY3R1cmUgYWJvdmUgcHJvdmlkZXMgYSBzdW1tYXJ5IG9mIHRoZSBrZXkgZWxlbWVudHMgdXNlZCBpbiBFUEYgQ29tcG9zZXIgYW5kCi1ob3cgdGhleSByZWxhdGUgdG8gbWV0aG9kIGNvbnRlbnQgb3IgcHJvY2Vzcy4gQXMgeW91IHNlZSwgbWV0aG9kIGNvbnRlbnQgaXMKLXByaW1hcmlseSBleHByZXNzZWQgdXNpbmcgd29yayBwcm9kdWN0cywgcm9sZXMsIHRhc2tzLCBhbmQgZ3VpZGFuY2UuIEd1aWRhbmNlLAotc3VjaCBhcyBjaGVja2xpc3RzLCBleGFtcGxlcywgb3Igcm9hZG1hcHMsIGNhbiBhbHNvIGJlIGRlZmluZWQgdG8gcHJvdmlkZQotZXhlbXBsYXJ5IHdhbGt0aHJvdWdocyBvZiBhIHByb2Nlc3MuIE9uIHRoZSByaWdodC1oYW5kIHNpZGUgb2YgdGhlIGRpYWdyYW0sCi15b3Ugc2VlIHRoZSBlbGVtZW50cyB1c2VkIHRvIHJlcHJlc2VudCBwcm9jZXNzZXMgaW4gRVBGIENvbXBvc2VyLiBUaGUgbWFpbiBlbGVtZW50Ci1pcyB0aGUgYWN0aXZpdHkgdGhhdCBjYW4gYmUgbmVzdGVkIHRvIGRlZmluZSBicmVha2Rvd24gc3RydWN0dXJlcyBhcyB3ZWxsCi1hcyByZWxhdGVkIHRvIGVhY2ggb3RoZXIgdG8gZGVmaW5lIGEgZmxvdyBvZiB3b3JrLiBBY3Rpdml0aWVzIGFsc28gY29udGFpbgotZGVzY3JpcHRvcnMgdGhhdCByZWZlcmVuY2UgbWV0aG9kIGNvbnRlbnQuIEFjdGl2aXRpZXMgYXJlIHVzZWQgdG8gZGVmaW5lIHByb2Nlc3Nlcwotb2Ygd2hpY2ggRVBGIENvbXBvc2VyIHN1cHBvcnQgdHdvIG1haW4ga2luZHM6IGRlbGl2ZXJ5IHByb2Nlc3NlcyBhbmQgY2FwYWJpbGl0eSBwYXR0ZXJucy4KLURlbGl2ZXJ5IHByb2Nlc3NlcyByZXByZXNlbnQgYSBjb21wbGV0ZSBhbmQgaW50ZWdyYXRlZCBwcm9jZXNzIHRlbXBsYXRlIGZvcgotcGVyZm9ybWluZyBvbmUgc3BlY2lmaWMgdHlwZSBvZiBwcm9qZWN0LiBUaGV5IGRlc2NyaWJlIGEgY29tcGxldGUgZW5kLXRvLWVuZAotcHJvamVjdCBsaWZlY3ljbGUgYW5kIGFyZSB1c2VkIGFzIGEgcmVmZXJlbmNlIGZvciBydW5uaW5nIHByb2plY3RzIHdpdGggc2ltaWxhcgotY2hhcmFjdGVyaXN0aWNzLiBDYXBhYmlsaXR5IHBhdHRlcm5zIGFyZSBwcm9jZXNzZXMgdGhhdCBleHByZXNzIGFuZCBjb21tdW5pY2F0ZQotcHJvY2VzcyBrbm93bGVkZ2UgZm9yIGEga2V5IGFyZWEgb2YgaW50ZXJlc3Qgc3VjaCBhcyBhIGRpc2NpcGxpbmUgb3IgYSBiZXN0Ci1wcmFjdGljZS4gVGhleSBhcmUgYWxzbyB1c2VkIGFzIGJ1aWxkaW5nIGJsb2NrcyB0byBhc3NlbWJsZSBkZWxpdmVyeSBwcm9jZXNzZXMKLW9yIGxhcmdlciBjYXBhYmlsaXR5IHBhdHRlcm5zLiBUaGlzIGVuc3VyZXMgb3B0aW1hbCByZXVzZSBhbmQgYXBwbGljYXRpb24KLW9mIHRoZWlyIGtleSBiZXN0IHByYWN0aWNlcyBpbiBwcm9jZXNzIGF1dGhvcmluZyBhY3Rpdml0aWVzIGluIEVQRiBDb21wb3Nlci48L3A+Ci08L2Rpdj4KLTxkaXY+PGRpdiBjbGFzcz0icmVsY29uY2VwdHMiPjxzdHJvbmc+UmVsYXRlZCBjb25jZXB0czwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJtZXRob2RhdXRob3JpbmdvdmVydmlldy5odG1sI21ldGhvZGF1dGhvcmluZ292ZXJ2aWV3Ij5NZXRob2QgQ29udGVudCBBdXRob3JpbmcgT3ZlcnZpZXc8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9InByb2Nlc3NhdXRob3JpbmdvdmVydmlldy5odG1sI3Byb2Nlc3NhdXRob3JpbmdvdmVydmlldyI+UHJvY2VzcyBBdXRob3JpbmcgT3ZlcnZpZXc8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvYWN0aXZpdHkuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2FjdGl2aXR5Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4NTIxNDkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvYWN0aXZpdHkuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgaHRtbAotICBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0ic2VjdXJpdHkiIGNvbnRlbnQ9InB1YmxpYyIgLz4KLTxtZXRhIG5hbWU9IlJvYm90cyIgY29udGVudD0iaW5kZXgsZm9sbG93IiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBuYW1lPSJEQy5UeXBlIiBjb250ZW50PSJjb25jZXB0IiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IkFjdGl2aXR5IiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJkZXZlbG9wYXdvcmticmVha2Rvd25zdHJ1Y3R1cmUuaHRtbCNkZXZlbG9wYXdvcmticmVha2Rvd25zdHJ1Y3R1cmUiIC8+Ci08bWV0YSBuYW1lPSJEQy5Gb3JtYXQiIGNvbnRlbnQ9IlhIVE1MIiAvPgotPG1ldGEgbmFtZT0iREMuSWRlbnRpZmllciIgY29udGVudD0iYWN0aXZpdHkiIC8+Ci08bWV0YSBuYW1lPSJEQy5MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiIC8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4vaWJtZGl0YS5jc3MiIC8+Ci08dGl0bGU+QWN0aXZpdHk8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9ImFjdGl2aXR5Ij48YSBuYW1lPSJhY3Rpdml0eSI+PCEtLSAtLT48L2E+Ci0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPkFjdGl2aXR5PC9oMT4KLTxkaXY+PHA+QWN0aXZpdGllcyByZXByZXNlbnQgdGhlIGtleSBidWlsZGluZyBibG9ja3MgZm9yIHByb2Nlc3Nlcy4gQWN0aXZpdGllcwotcmVwcmVzZW50IGEgZ3JvdXBpbmcgb2YgYnJlYWtkb3duIGVsZW1lbnRzIHN1Y2ggYXMgb3RoZXIgYWN0aXZpdGllcywgdGFzawotZGVzY3JpcHRvcnMsIHJvbGUgZGVzY3JpcHRvcnMsIDxhIGhyZWY9Indvcmtwcm9kdWN0ZGVzY3JpcHRvcnMuaHRtbCN3b3JrcHJvZHVjdGRlc2NyaXB0b3JzIj53b3JrIHByb2R1Y3QgZGVzY3JpcHRvcnM8L2E+LCBhbmQgPGEgaHJlZj0ibWlsZXN0b25lLmh0bWwjbWlsZXN0b25lIj5taWxlc3RvbmVzPC9hPi4gSW4gYWRkaXRpb24gdG8gYnJlYWtkb3duIHN0cnVjdHVyZXMsIGFjdGl2aXRpZXMKLWNhbiBhbHNvIGJlIHByZXNlbnRlZCBpbiBhY3Rpdml0eSBkaWFncmFtcyB0aGF0IGdyYXBoaWNhbGx5IHNob3cgdGhlIGZsb3cKLW9mIHdvcmsgYnkgc2hvd2luZyB3aGljaCBhY3Rpdml0aWVzIHByZWNlZGUgb3RoZXIgYWN0aXZpdGllcy4gPGEgaHJlZj0icGhhc2UuaHRtbCNwaGFzZSI+UGhhc2U8L2E+IGFuZCA8YSBocmVmPSJpdGVyYXRpb24uaHRtbCNpdGVyYXRpb24iPml0ZXJhdGlvbjwvYT4gYXJlCi1zcGVjaWFsIHR5cGVzIG9mIGFjdGl2aXRpZXMgdGhhdCBkZWZpbmUgc3BlY2lmaWMgcHJvcGVydGllcy48L3A+Ci08L2Rpdj4KLTxkaXY+PGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJkZXZlbG9wYXdvcmticmVha2Rvd25zdHJ1Y3R1cmUuaHRtbCNkZXZlbG9wYXdvcmticmVha2Rvd25zdHJ1Y3R1cmUiPkRldmVsb3AgYSBXb3JrIEJyZWFrZG93biBTdHJ1Y3R1cmU8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvYWRkYXJlZmVyZW5jZW9yaHlwZXJsaW5rLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9hZGRhcmVmZXJlbmNlb3JoeXBlcmxpbmsuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWQxMjUwMS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9hZGRhcmVmZXJlbmNlb3JoeXBlcmxpbmsuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgaHRtbAotICBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0ic2VjdXJpdHkiIGNvbnRlbnQ9InB1YmxpYyIgLz4KLTxtZXRhIG5hbWU9IlJvYm90cyIgY29udGVudD0iaW5kZXgsZm9sbG93IiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBuYW1lPSJEQy5UeXBlIiBjb250ZW50PSJjb25jZXB0IiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IkFkZCBhIFJlZmVyZW5jZSBvciBIeXBlcmxpbmsiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9InJpY2h0ZXh0ZWRpdG9yLmh0bWwjcmljaHRleHRlZGl0b3IiIC8+Ci08bWV0YSBuYW1lPSJEQy5Gb3JtYXQiIGNvbnRlbnQ9IlhIVE1MIiAvPgotPG1ldGEgbmFtZT0iREMuSWRlbnRpZmllciIgY29udGVudD0iYWRkYXJlZmVyZW5jZW9yaHlwZXJsaW5rIiAvPgotPG1ldGEgbmFtZT0iREMuTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIiAvPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuL2libWRpdGEuY3NzIiAvPgotPHRpdGxlPkFkZCBhIFJlZmVyZW5jZSBvciBIeXBlcmxpbms8L3RpdGxlPgotPC9oZWFkPgotPGJvZHk+Ci0KLTxkaXYgY2xhc3M9Im5lc3RlZDAiIGlkPSJhZGRhcmVmZXJlbmNlb3JoeXBlcmxpbmsiPjxhIG5hbWU9ImFkZGFyZWZlcmVuY2Vvcmh5cGVybGluayI+PCEtLSAtLT48L2E+PGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+QWRkIGEgUmVmZXJlbmNlIG9yIEh5cGVybGluazwvaDE+Ci08ZGl2PjxwPllvdSBjYW4gYWRkIHR3byB0eXBlcyBvZiByZWZlcmVuY2VzIG9yIGh5cGVybGlua3MgdG8geW91ciBjb250ZW50IHRleHQ6Ci1yZWZlcmVuY2VzICB0byBvdGhlciBlbGVtZW50cyBpbiB0aGUgbWV0aG9kIGxpYnJhcnkgb3IgcmVmZXJlbmNlcyB0byBleHRlcm5hbAotdGV4dCB3aXRoIGEgVVJMIHRoYXQgcmVzaWRlcyBvdXRzaWRlIHRoZSBtZXRob2QgbGlicmFyeS48L3A+Ci08cD5UZXh0IGZpZWxkcyB0aGF0IHN1cHBvcnQgaHlwZXJsaW5rcyBoYXZlIGEgdHdpc3R5IHN5bWJvbCA8aW1nIHNyYz0idHdpc3R5IHN5bWJvbDEuSlBHIiBhbHQ9IiIgLz4gbmV4dCB0byB0aGUgdGV4dCBmaWVsZCdzIGxhYmVsLiBDbGljayB0aGUgc3ltYm9sIHRvIGV4cGFuZAotdGhlIGZpZWxkIGludG8gYSBmdWxsIHRleHQgZWRpdG9yLiA8L3A+Ci08cD5UbyBpbnNlcnQgYSBoeXBlcmxpbmsgdG8gYW5vdGhlciBlbGVtZW50IGluIHRoZSBtZXRob2QgbGlicmFyeSBpbnRvIGEgdGV4dAotZmllbGQsIGxvY2F0ZSB0aGUgZWxlbWVudCB5b3Ugd2FudCB0byBjcmVhdGUgYSBsaW5rIHRvIGluIHRoZSBsaWJyYXJ5IG9yIGNvbmZpZ3VyYXRpb24KLXZpZXcgYW5kIHRoZW4gZHJhZyBpdCBpbnRvIHRoZSBhcHByb3ByaWF0ZSB0ZXh0IGZpZWxkLCBUaGUgbGluayB0byB0aGUgZWxlbWVudAotaXMgYWRkZWQgYXMgYSBtZXRob2QgZWxlbWVudCB3aXRoIHR5cGUgcHJlZml4LCBtZWFuaW5nIHRoYXQgdGhlIG1ldGhvZCBlbGVtZW50Ci1uYW1lIGlzIHByZWZpeGVkIHdpdGggdGhlIG1ldGhvZCBlbGVtZW50IHR5cGUuIFlvdSBjYW4gYWxzbyBkcmFnIGEgbWV0aG9kCi1lbGVtZW50IGludG8gYW4gdW5leHBhbmRlZCB0ZXh0IGZpZWxkIHRoYXQgc3VwcG9ydHMgaHlwZXJsaW5rcyB3aXRoIHRoZSBzYW1lCi1yZXN1bHQuPC9wPgotPGRpdiBjbGFzcz0icCI+WW91IGNhbiB1c2UgdGhlIEFkZCBMaW5rIGZ1bmN0aW9uIGluIHRoZSByaWNoIHRleHQgZWRpdG9yIHRvIGFkZCBsaW5rcwotdGhhdCBhcmUgcmVmZXJlbmNlcyB0byBvdGhlciBtZXRob2QgZWxlbWVudHMgb3IgbGlua3MgdG8gZmlsZXMgb3IgV2ViIHBhZ2VzLgotVGhpcyBnaXZlcyB5b3UgZnVydGhlciBvcHRpb25zIGluIGhvdyB5b3VyIGxpbmtzIGFyZSBkaXNwbGF5ZWQuPG9sPjxsaT5JbiB0aGUgdGV4dCBlZGl0b3IsIHBvc2l0aW9uIHRoZSBjdXJzb3Igd2hlcmUgeW91IHdhbnQgdG8gaW5zZXJ0IHRoZSBsaW5rCi1hbmQgdGhlbiBjbGljayB0aGUgPHN0cm9uZz5BZGQgTGluazwvc3Ryb25nPiBidXR0b24gPGltZyBzcmM9ImFkZGxpbmtfY28uZ2lmIiBhbHQ9IiIgLz4gaW4gdGhlIHRvb2wgYmFyLiBUaGUgQWRkIExpbmsgZGlhbG9nIG9wZW5zLjwvbGk+Ci08bGk+Q2xpY2sgdGhlIDxzdHJvbmc+QnJvd3NlPC9zdHJvbmc+IGJ1dHRvbiB0byBsb2NhdGUgYW5kIHNlbGVjdCB0aGUgZWxlbWVudCB5b3Ugd2lzaAotdG8gY3JlYXRlIGEgbGluayB0by4gVGhlcmUgYXJlIHNldmVyYWwgb3B0aW9ucyBmb3IgY3JlYXRpbmcgbGlua3MgdG8gb3RoZXIKLWNvbnRlbnQgZWxlbWVudHMsIHdpdGggZWFjaCBvcHRpb24gb2ZmZXJpbmcgYSBkaWZmZXJlbnQgd2F5IGZvciBkaXNwbGF5aW5nCi10aGUgbGluaydzIG5hbWU6PHVsPjxsaT5NZXRob2QgZWxlbWVudDogdGhlIGxpbmsgZGlzcGxheXMgdGhlIGVsZW1lbnQgbmFtZS48L2xpPgotPGxpPk1ldGhvZCB3aXRoIHR5cGUgcHJlZml4OiB0aGUgbGluayBkaXNwbGF5cyB0aGUgZWxlbWVudCBuYW1lIGFuZCB0eXBlLjwvbGk+Ci08bGk+TWV0aG9kIGVsZW1lbnQgd2l0aCBjdXN0b20gdGV4dDogdGhlIGxpbmsgZGlzcGxheXMgdXNlciBkZWZpbmVkIHRleHQuCi1UbyBkZWZpbmUgdGhpcyB0ZXh0IG1hbmlwdWxhdGUgdGhlIHRleHQgaW4gYmV0d2VlbiB0aGUgJmx0O2EmZ3Q7Jmx0Oy9hJmx0OwotdGFncyBpbiB0aGUgVVJMIHRleHQgZmllbGQgb25lIHlvdSBoYXZlIHNlbGVjdGVkIGFuIGVsZW1lbnQgdXNpbmcgdGhlIDxzdHJvbmc+QnJvd3NlPC9zdHJvbmc+IGJ1dHRvbi48L2xpPgotPC91bD4KLTwvbGk+Ci08bGk+VG8gaW5zZXJ0IGEgaHlwZXJsaW5rIHRvIGFuIGV4dGVybmFsIFVSTCwgc2VsZWN0IFVSTCBmcm9tIHRoZSBUeXBlIGRyb3AKLWRvd24gbGlzdCwgdHlwZSB0aGUgVVJMIGRldGFpbHMgaW4gdGhlIFVSTCBmaWVsZCwgYW5kIHRoZW4gY2xpY2sgPHN0cm9uZz5PSzwvc3Ryb25nPi48L2xpPgotPGxpPlRvIGluc2VydCBhIGh5cGVybGluayB0byBhIGZpbGUsIGluIHRoZSBUeXBlIGRyb3AgZG93biBsaXN0LCBjbGljayA8c3Ryb25nPkZpbGU8L3N0cm9uZz4sCi1lbnRlciB0aGUgZmlsZSBuYW1lIG9yIGJyb3dzZSB0byBmaW5kIHRoZSBmaWxlLCBhbmQgdGhlbiBjbGljayA8c3Ryb25nPk9LPC9zdHJvbmc+LgotRWFjaCB0aW1lIHlvdSBhZGQgYSBsaW5rIHlvdSBjYW4gY2hvb3NlIHRvIGhhdmUgdGhlIHRhcmdldCBvcGVuIGluIHRoZSBzYW1lCi1icm93c2VyIHdpbmRvdyBvciBpbiBhIG5ldyB3aW5kb3cuPC9saT4KLTwvb2w+Ci08L2Rpdj4KLTwvZGl2PgotPGRpdj48ZGl2IGNsYXNzPSJyZWxjb25jZXB0cyI+PHN0cm9uZz5SZWxhdGVkIGNvbmNlcHRzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9InJpY2h0ZXh0ZWRpdG9yLmh0bWwjcmljaHRleHRlZGl0b3IiPlJpY2ggVGV4dCBFZGl0b3I8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PjwvZGl2PgotCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9hZGRpbWdfY28uZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvYWRkaW1nX2NvLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWNiZDcyMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9hZGRpbWdfY28uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvYWRkbGlua19jby5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9hZGRsaW5rX2NvLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDFhMzg2YS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9hZGRsaW5rX2NvLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2FkZG9yZGxpc3RfY28uZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvYWRkb3JkbGlzdF9jby5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3MWQ2NzcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvYWRkb3JkbGlzdF9jby5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9hZGR0YWJsZV9jby5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9hZGR0YWJsZV9jby5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1MzZkZDkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvYWRkdGFibGVfY28uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvYWRkdW5vcmRsaXN0X2NvLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2FkZHVub3JkbGlzdF9jby5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwNzQ5ZTcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvYWRkdW5vcmRsaXN0X2NvLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2FwcGx5YWNhcGFiaWxpdHlwYXR0ZXJuLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9hcHBseWFjYXBhYmlsaXR5cGF0dGVybi5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYzczNjhhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2FwcGx5YWNhcGFiaWxpdHlwYXR0ZXJuLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMjIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJzZWN1cml0eSIgY29udGVudD0icHVibGljIiAvPgotPG1ldGEgbmFtZT0iUm9ib3RzIiBjb250ZW50PSJpbmRleCxmb2xsb3ciIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIG5hbWU9IkRDLlR5cGUiIGNvbnRlbnQ9InRhc2siIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iQXBwbHkgYSBDYXBhYmlsaXR5IFBhdHRlcm4iIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9ImNhcGFiaWxpdHlwYXR0ZXJuLmh0bWwjY2FwYWJpbGl0eXBhdHRlcm4iIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9ImNyZWF0ZWFyZXVzYWJsZWNhcGFiaWxpdHlwYXR0ZXJuLmh0bWwjY3JlYXRlYXJldXNhYmxlY2FwYWJpbGl0eXBhdHRlcm4iIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9InJlcGxhY2UuaHRtbCNyZXBsYWNlcyIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0icHJvY2Vzcy5odG1sI3Byb2Nlc3MiIC8+Ci08bWV0YSBuYW1lPSJEQy5Gb3JtYXQiIGNvbnRlbnQ9IlhIVE1MIiAvPgotPG1ldGEgbmFtZT0iREMuSWRlbnRpZmllciIgY29udGVudD0iYXBwbHlhY2FwYWJpbGl0eXBhdHRlcm4iIC8+Ci08bWV0YSBuYW1lPSJEQy5MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiIC8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4vaWJtZGl0YS5jc3MiIC8+Ci08dGl0bGU+QXBwbHkgYSBDYXBhYmlsaXR5IFBhdHRlcm48L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9ImFwcGx5YWNhcGFiaWxpdHlwYXR0ZXJuIj48YSBuYW1lPSJhcHBseWFjYXBhYmlsaXR5cGF0dGVybiI+PCEtLSAtLT48L2E+Ci0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPkFwcGx5IGEgQ2FwYWJpbGl0eSBQYXR0ZXJuPC9oMT4KLTxkaXY+PGRpdiBjbGFzcz0icCI+V2hlbiBkZXZlbG9waW5nIGEgcHJvY2VzcywgaXQgaXMgbm90IG5lY2Vzc2FyeSB0byBkZXZlbG9wIHRoZSBwcm9jZXNzCi1mcm9tIHNjcmF0Y2gsIGFkZGluZyBkZXNjcmlwdG9ycyBvbmUgYnkgb25lLiBZb3UgY2FuIHJldXNlIGV4aXN0aW5nIGNhcGFiaWxpdHkKLXBhdHRlcm5zIG9yIGV2ZW4gY2FwYWJpbGl0eSBwYXR0ZXJuIHBhcnRzIHRvIGluZGl2aWR1YWxseSBjdXN0b21pemUgdGhlIHBhdHRlcm4ncwotY29udGVudCB0byB0aGUgcGFydGljdWxhciBzaXR1YXRpb24gZm9yIHdoaWNoIGl0IGlzIGFwcGxpZWQuIEEgY2FwYWJpbGl0eQotcGF0dGVybiBtdXN0IGJlIGFwcGxpZWQgdG8gb25lIHNwZWNpZmljIGFjdGl2aXR5IGluIGEgcHJvY2Vzcy4gRm9yIG1vcmUgaW5mb3JtYXRpb24KLXNlZSA8YSBocmVmPSJjYXBhYmlsaXR5cGF0dGVybi5odG1sI2NhcGFiaWxpdHlwYXR0ZXJuIj5DYXBhYmlsaXR5IFBhdHRlcm48L2E+LjwvZGl2PgotPGRpdiBjbGFzcz0ic2VjdGlvbiI+VGhlcmUgYXJlIHR3byB3YXlzIHRvIGFwcGx5IGEgQ2FwYWJpbGl0eSBQYXR0ZXJuOiBDb3B5IGFuZCBFeHRlbmQuIDxwPjxzdHJvbmc+Q29weQotYSBjYXBhYmlsaXR5IHBhdHRlcm46PC9zdHJvbmc+PC9wPgotPGRpdiBjbGFzcz0icCI+SWYgYSBjYXBhYmlsaXR5IHBhdHRlcm4gaXMgY29waWVkIGludG8gYSBwcm9jZXNzLAotbWV0aG9kIGNvbnRlbnQgZWxlbWVudHMgaW4gdGhlIGNhcGFiaWxpdHkgcGF0dGVybiBhcmUgZGlzY29ubmVjdGVkIGZyb20gdGhlCi1vcmlnaW5hbC4gVGhlIGNhcGFiaWxpdHkgcGF0dGVybiBlbGVtZW50cyBjYW4gYmUgYWx0ZXJlZCwgZGVsZXRlZCBvciBjaGFuZ2VkCi1hcyB5b3Ugd2FudCBpbiB0aGUgcHJvY2VzcyBlZGl0b3Igd2l0aG91dCBhZmZlY3RpbmcgdGhlIG9yaWdpbmFsIG1ldGhvZCBjb250ZW50Ci1lbGVtZW50cy4gTWV0aG9kIGVsZW1lbnRzIGluIGEgY29waWVkIGNhcGFiaWxpdHkgcGF0dGVybiBhcHBlYXIgaW4gcmVndWxhcgotYmxhY2sgZm9udC4gVG8gY29weSBhIGNhcGFiaWxpdHkgcGF0dGVybjo8b2w+PGxpPkluIHRoZSA8YSBocmVmPSJjb25maWd1cmF0aW9udmlldy5odG1sI2NvbmZpZ3VyYXRpb252aWV3Ij5Db25maWd1cmF0aW9uIFZpZXc8L2E+LAotc2VsZWN0IGEgY2FwYWJpbGl0eSBwYXR0ZXJuIG9yIGl0cyBwYXJ0cyB0aGF0IHlvdSB3YW50IHRvIGNvcHkgaW50byBhbiBhY3Rpdml0eQotaW4gYSBwcm9jZXNzIGFuZCBkcmFnIHRoZSBwYXR0ZXJuIG9yIHBhcnRzIGludG8gdGhlIGFjdGl2aXR5IHRvIHdoaWNoIHlvdQotd2FudCBpdCB0byBhcHBseS4gVG8gc2VsZWN0IG11bHRpcGxlIGFjdGl2aXRpZXMgaW4gYSBjYXBhYmlsaXR5IHBhdHRlcm4sIHByZXNzCi10aGUgQ1RSTCBvciBTSElGVCBrZXlzIHdoaWxlIHlvdSBzZWxlY3QuIDwvbGk+Ci08bGk+SW4gdGhlIHBvcC11cCBib3ggdGhhdCBhcHBlYXJzLCBjbGljayA8c3Ryb25nPkNvcHk8L3N0cm9uZz4uIFRoZSBjYXBhYmlsaXR5IHBhdHRlcm4KLW5hbWUgaXMgZGlzcGxheWVkIGluIGJsYWNrIGFuZCBpcyBub3cgYXZhaWxhYmxlIGZvciB5b3UgdG8gZWRpdC48L2xpPgotPC9vbD4KLTwvZGl2PgotPGRpdiBjbGFzcz0icCI+T3IsPG9sPjxsaT5JbiB0aGUgcHJvY2VzcyB2aWV3LCByaWdodCBjbGljayBhbiBhY3Rpdml0eSwgYW5kIHRoZW4gY2xpY2sgPHN0cm9uZz5BcHBseQotUGF0dGVybiAmZ3Q7IENvcHk8L3N0cm9uZz4uIFRoZSBTZWxlY3QgRGlhbG9nIEZvciBQcm9jZXNzZXMgd2luZG93IGFwcGVhcnMuPC9saT4KLTxsaT5EcmlsbCBkb3duIGludG8gdGhlIHByb2Nlc3MgdHJlZSB1bnRpbCB5b3UgbG9jYXRlIHRoZSBjYXBhYmlsaXR5IHBhdHRlcm4KLXlvdSB3YW50IHRvIGNvcHkuPC9saT4KLTxsaT5TZWxlY3QgdGhlIHBhdHRlcm4sIGFuZCB0aGVuIGNsaWNrIDxzdHJvbmc+T0s8L3N0cm9uZz4uIFRoZSBTZWxlY3QgRGlhbG9nIEZvciBQcm9jZXNzZXMKLXdpbmRvdyBjbG9zZXMgYW5kIHRoZSBjYXBhYmlsaXR5IHBhdHRlcm4gaXMgYXBwbGllZC48L2xpPgotPC9vbD4KLTwvZGl2PgotPHA+PHN0cm9uZz5FeHRlbmQgYSBjYXBhYmlsaXR5IHBhdHRlcm46PC9zdHJvbmc+PC9wPgotPGRpdiBjbGFzcz0icCI+SWYgYSBjYXBhYmlsaXR5IHBhdHRlcm4KLWlzIGV4dGVuZGVkIGludG8gYSBwcm9jZXNzLCBtZXRob2QgY29udGVudCBlbGVtZW50cyBpbiB0aGUgQ2FwYWJpbGl0eSBQYXR0ZXJuCi1yZXRhaW4gYSBjb25uZWN0aW9uIHRvIHRoZSBvcmlnaW5hbC4gRXh0ZW5kZWQgY2FwYWJpbGl0eSBwYXR0ZXJuIGVsZW1lbnRzCi1jYW5ub3QgYmUgZGVsZXRlZCBvciBtb2RpZmllZCBhbmQgYXBwZWFyIGFzIHJlYWQtb25seSBpbiBhIGdyZWVuLWl0YWxpYyBmb250LgotVG8gZXh0ZW5kIGEgY2FwYWJpbGl0eSBwYXR0ZXJuOiA8b2w+PGxpPkluIHRoZSA8YSBocmVmPSJjb25maWd1cmF0aW9udmlldy5odG1sI2NvbmZpZ3VyYXRpb252aWV3Ij5Db25maWd1cmF0aW9uIFZpZXc8L2E+LAotc2VsZWN0IGEgY2FwYWJpbGl0eSBwYXR0ZXJuIG9yIGl0cyBwYXJ0cyB0aGF0IHlvdSB3YW50IHRvIGV4dGVuZCBpbnRvIGFuIGFjdGl2aXR5Ci1pbiBhIHByb2Nlc3MgYW5kIGRyYWcgdGhlIHBhdHRlcm4gb3IgcGFydHMgaW50byB0aGUgYWN0aXZpdHkgdG8gd2hpY2ggeW91Ci13YW50IGl0IHRvIGFwcGx5LiBUbyBzZWxlY3QgbXVsdGlwbGUgYWN0aXZpdGllcyBpbiBhIGNhcGFiaWxpdHkgcGF0dGVybiwgcHJlc3MKLXRoZSBDVFJMIG9yIFNISUZUIGtleXMgd2hpbGUgeW91IHNlbGVjdC48L2xpPgotPGxpPkluIHRoZSBwb3AtdXAgYm94IHRoYXQgYXBwZWFycywgY2xpY2sgPHN0cm9uZz5FeHRlbmQ8L3N0cm9uZz4uIFRoZSBjYXBhYmlsaXR5IHBhdHRlcm4KLW5hbWUgaXMgZGlzcGxheWVkIGluIGdyZWVuLCB3aGljaCBpbmRpY2F0ZXMgaXQgaXMgcGFydCBvZiBhIHByb2Nlc3MgZGVmaW5lZAotZWxzZXdoZXJlLjwvbGk+Ci08L29sPgotPC9kaXY+Ci08ZGl2IGNsYXNzPSJwIj5PciwgPG9sPjxsaT5JbiB0aGUgcHJvY2VzcyB2aWV3LCByaWdodCBjbGljayBhbiBhY3Rpdml0eSBhbmQgdGhlbiBjbGljayA8c3Ryb25nPkFwcGx5Ci1QYXR0ZXJuICZndDsgRXh0ZW5kPC9zdHJvbmc+LiBUaGUgU2VsZWN0IERpYWxvZyBGb3IgUHJvY2Vzc2VzIHdpbmRvdyBhcHBlYXJzLjwvbGk+Ci08bGk+RHJpbGwgZG93biBpbnRvIHRoZSBwcm9jZXNzIHRyZWUgdW50aWwgeW91IGxvY2F0ZSB0aGUgY2FwYWJpbGl0eSBwYXR0ZXJuCi15b3Ugd2FudCB0byBleHRlbmQuPC9saT4KLTxsaT5TZWxlY3QgdGhlIHBhdHRlcm4sIGFuZCB0aGVuIGNsaWNrIDxzdHJvbmc+T0s8L3N0cm9uZz4uIFRoZSBTZWxlY3QgRGlhbG9nIEZvciBQcm9jZXNzZXMKLXdpbmRvdyBjbG9zZXMgYW5kIHRoZSBjYXBhYmlsaXR5IHBhdHRlcm4gaXMgYXBwbGllZC48L2xpPgotPC9vbD4KLTwvZGl2PgotPGRpdiBjbGFzcz0icCI+PGRpdiBjbGFzcz0ibm90ZSI+PHNwYW4gY2xhc3M9Im5vdGV0aXRsZSI+Tm90ZTo8L3NwYW4+IElmIHlvdSBkbyBub3Qgd2FudCBhIHNwZWNpZmljIGFjdGl2aXR5IG9yIHRhc2sgaW4gdGhlIGNhcGFiaWxpdHkKLXBhdHRlcm4gdG8gYmUgaW5jbHVkZWQgaW4geW91ciBwcm9jZXNzIHlvdSBjYW4gc3VwcHJlc3MgaXQuIFRoZSBhY3Rpdml0eSBvcgotdGFzayB3aWxsIG5vdCBhcHBlYXIgaW4gdGhlIHB1Ymxpc2hlZCBwcm9jZXNzIG9yIGJlIGV4cG9ydGVkIHRvIGEgcHJvamVjdAotcGxhbm5pbmcgdG9vbC4gVG8gc3VwcHJlc3MgYSBwcm9jZXNzIGVsZW1lbnQsIHJpZ2h0IGNsaWNrIHRoZSBlbGVtZW50IGFuZAotdGhlbiBzZWxlY3QgPHN0cm9uZz5TdXBwcmVzczwvc3Ryb25nPi4gVGhlIGVsZW1lbnQgYXBwZWFycyBncmF5ZWQgb3V0IGluIHRoZSBwcm9jZXNzCi12aWV3LjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLTxkaXYgY2xhc3M9InNlY3Rpb24iPjxkaXYgY2xhc3M9InAiPlRvIGFkZCBlbGVtZW50cyB0byBhbiBhY3Rpdml0eSBpbiBhbiBleHRlbmRlZCBjYXBhYmlsaXR5IHBhdHRlcm46PG9sPjxsaT5GaW5kIHRoZSBhY3Rpdml0eSdzIHBhcmVudCBlbGVtZW50LiBJZiB0aGlzIGVsZW1lbnQgaXMgYSBub3QgYSBsb2NhbCBlbGVtZW50Ci10aGF0IGFwcGVhcnMgaW4gZ3JlZW4gaXRhbGljIGZvbnQsIHRoZW4geW91IG5lZWQgY3JlYXRlIGEgY29udHJpYnV0aW9uIHRvCi10aGlzIHBhcmVudCBmaXJzdC4gIElmIHRoZSBwYXJlbnQncyBwYXJlbnQgaXMgbm90IGxvY2FsLCBhbHNvIGFwcGVhcmluZyBpbgotZ3JlZW4gaXRhbGljIGZvbnQsIHRoZW4geW91IG5lZWQgdG8gY3JlYXRlIGEgY29udHJpYnV0aW9uIHRvIHRoZSBwYXJlbnQgZmlyc3QsCi1hbmQgc28gb24uIDwvbGk+Ci08bGk+VG8gY3JlYXRlIGEgY29udHJpYnV0aW9uIHRvIGFuIGV4dGVuZGVkIGFjdGl2aXR5LCByaWdodCBjbGljayB0aGUgZXh0ZW5kZWQKLWFjdGl2aXR5IGFuZCB0aGVuIGNsaWNrIDxzdHJvbmc+Q29udHJpYnV0ZTwvc3Ryb25nPi4gVGhlIGFjdGl2aXR5IGJlY29tZXMgbG9jYWwgYW5kCi1hcHBlYXJzIGluIGEgc3RhbmRhcmQgYmxhY2sgZm9udC4gRG8gdGhpcyB3aXRoIGFsbCBwYXJlbnQgZWxlbWVudHMsIHRvcC1kb3duLAotdW50aWwgeW91IHJlYWNoIHRoZSBhY3Rpdml0eSB0byB3aGljaCB5b3Ugd2FudCB0byBhcHBseSB0aGUgZWxlbWVudC4gT25jZQoteW91IGNsaWNrIENvbnRyaWJ1dGUsIHRoZSBhY3Rpdml0eSBiZWNvbWVzIGxvY2FsIGFuZCBpcyBwcmVzZW50ZWQgaW4gc3RhbmRhcmQKLWJsYWNrIGZvbnQuPC9saT4KLTwvb2w+Ci1Gb3IgbW9yZSBpbmZvcm1hdGlvbiBzZWUgPGEgaHJlZj0iY29udHJpYnV0ZXMuaHRtbCNjb250cmlidXRlcyI+Q29udHJpYnV0ZXM8L2E+LjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLTxkaXY+PGRpdiBjbGFzcz0icmVsY29uY2VwdHMiPjxzdHJvbmc+UmVsYXRlZCBjb25jZXB0czwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJjYXBhYmlsaXR5cGF0dGVybi5odG1sI2NhcGFiaWxpdHlwYXR0ZXJuIj5DYXBhYmlsaXR5IFBhdHRlcm48L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9InJlcGxhY2UuaHRtbCNyZXBsYWNlcyI+UmVwbGFjZXM8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9InByb2Nlc3MuaHRtbCNwcm9jZXNzIj5Qcm9jZXNzPC9hPjwvZGl2PgotPC9kaXY+Ci08ZGl2IGNsYXNzPSJyZWx0YXNrcyI+PHN0cm9uZz5SZWxhdGVkIHRhc2tzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9ImNyZWF0ZWFyZXVzYWJsZWNhcGFiaWxpdHlwYXR0ZXJuLmh0bWwjY3JlYXRlYXJldXNhYmxlY2FwYWJpbGl0eXBhdHRlcm4iPkNyZWF0ZSBhIFJldXNhYmxlIENhcGFiaWxpdHkgUGF0dGVybjwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9hcnRpZmFjdC5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvYXJ0aWZhY3QuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2ZlNWZjNS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9hcnRpZmFjdC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJzZWN1cml0eSIgY29udGVudD0icHVibGljIiAvPgotPG1ldGEgbmFtZT0iUm9ib3RzIiBjb250ZW50PSJpbmRleCxmb2xsb3ciIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIG5hbWU9IkRDLlR5cGUiIGNvbnRlbnQ9ImNvbmNlcHQiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iQXJ0aWZhY3QiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9Indvcmtwcm9kdWN0Lmh0bWwjd29ya3Byb2R1Y3QiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9ImNyZWF0ZWF3b3JrcHJvZHVjdC5odG1sI2NyZWF0ZWF3b3JrcHJvZHVjdCIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iZGVsaXZlcmFibGUuaHRtbCNkZWxpdmVyYWJsZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0ib3V0Y29tZS5odG1sI291dGNvbWUiIC8+Ci08bWV0YSBuYW1lPSJEQy5Gb3JtYXQiIGNvbnRlbnQ9IlhIVE1MIiAvPgotPG1ldGEgbmFtZT0iREMuSWRlbnRpZmllciIgY29udGVudD0iYXJ0aWZhY3QiIC8+Ci08bWV0YSBuYW1lPSJEQy5MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiIC8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4vaWJtZGl0YS5jc3MiIC8+Ci08dGl0bGU+QXJ0aWZhY3Q8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9ImFydGlmYWN0Ij48YSBuYW1lPSJhcnRpZmFjdCI+PCEtLSAtLT48L2E+Ci0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPkFydGlmYWN0PC9oMT4KLTxkaXY+PHA+QW4gYXJ0aWZhY3QgaXMgYSB0YW5naWJsZSB3b3JrIHByb2R1Y3QgdGhhdCBpcyBjb25zdW1lZCwgcHJvZHVjZWQsIG9yIG1vZGlmaWVkCi1ieSB0YXNrcy4gQXJ0aWZhY3RzIG1heSBiZSBjb21wb3NlZCBvZiBvdGhlciBhcnRpZmFjdHMuIEZvciBleGFtcGxlLCBhIG1vZGVsCi1hcnRpZmFjdCBjYW4gYmUgY29tcG9zZWQgb2YgbW9kZWwgZWxlbWVudHMsIHdoaWNoIGFyZSBhbHNvIGFydGlmYWN0cy4gPC9wPgotPHA+Um9sZXMgdXNlIGFydGlmYWN0cyB0byBwZXJmb3JtIHRhc2tzIGFuZCB0byBwcm9kdWNlIG90aGVyIGFydGlmYWN0cy4gRWFjaAotYXJ0aWZhY3QgaXMgdGhlIHJlc3BvbnNpYmlsaXR5IG9mIGEgc2luZ2xlIHJvbGUsIG1ha2luZyByZXNwb25zaWJpbGl0eSBlYXN5Ci10byBpZGVudGlmeSBhbmQgdW5kZXJzdGFuZCwgYW5kIHByb21vdGluZyB0aGUgaWRlYSB0aGF0IGV2ZXJ5IHBpZWNlIG9mIGluZm9ybWF0aW9uCi1wcm9kdWNlZCBpbiBhIG1ldGhvZCByZXF1aXJlcyB0aGUgYXBwcm9wcmlhdGUgc2V0IG9mIHNraWxscy4gRXZlbiB0aG91Z2ggb25seQotb25lIHJvbGUgaXMgcmVzcG9uc2libGUgZm9yIGFuIGFydGlmYWN0LCBvdGhlciByb2xlcyBtYXkgdXNlIHRoZSBhcnRpZmFjdHMuPC9wPgotPC9kaXY+Ci08ZGl2PjxkaXYgY2xhc3M9InJlbGNvbmNlcHRzIj48c3Ryb25nPlJlbGF0ZWQgY29uY2VwdHM8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0id29ya3Byb2R1Y3QuaHRtbCN3b3JrcHJvZHVjdCI+V29yayBQcm9kdWN0PC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJkZWxpdmVyYWJsZS5odG1sI2RlbGl2ZXJhYmxlIj5EZWxpdmVyYWJsZTwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0ib3V0Y29tZS5odG1sI291dGNvbWUiPk91dGNvbWU8L2E+PC9kaXY+Ci08L2Rpdj4KLTxkaXYgY2xhc3M9InJlbHRhc2tzIj48c3Ryb25nPlJlbGF0ZWQgdGFza3M8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iY3JlYXRlYXdvcmtwcm9kdWN0Lmh0bWwjY3JlYXRlYXdvcmtwcm9kdWN0Ij5DcmVhdGUgYSBXb3JrIFByb2R1Y3Q8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvYXV0aG9yaW5ncGVyc3BlY3RpdmUuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2F1dGhvcmluZ3BlcnNwZWN0aXZlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjNjRhNjUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvYXV0aG9yaW5ncGVyc3BlY3RpdmUuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgaHRtbAotICBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0ic2VjdXJpdHkiIGNvbnRlbnQ9InB1YmxpYyIgLz4KLTxtZXRhIG5hbWU9IlJvYm90cyIgY29udGVudD0iaW5kZXgsZm9sbG93IiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBuYW1lPSJEQy5UeXBlIiBjb250ZW50PSJjb25jZXB0IiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IkF1dGhvcmluZyBQZXJzcGVjdGl2ZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iYnJvd3NpbmdwZXJzcGVjdGl2ZS5odG1sI2Jyb3dpbmdwZXJzcGVjdGl2ZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0idXNlcmludGVyZmFjZW92ZXJ2aWV3Lmh0bWwjdXNlcmludGVyZmFjZW92ZXJ2aWV3IiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJ1c2VyaW50ZXJmYWNlb3ZlcnZpZXcuaHRtbCIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iYnJvd3NpbmdwZXJzcGVjdGl2ZS5odG1sIiAvPgotPG1ldGEgbmFtZT0iREMuRm9ybWF0IiBjb250ZW50PSJYSFRNTCIgLz4KLTxtZXRhIG5hbWU9IkRDLklkZW50aWZpZXIiIGNvbnRlbnQ9ImF1dGhvcmluZ3BlcnNwZWN0aXZlIiAvPgotPG1ldGEgbmFtZT0iREMuTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIiAvPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuL2libWRpdGEuY3NzIiAvPgotPHRpdGxlPkF1dGhvcmluZyBQZXJzcGVjdGl2ZTwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0iYXV0aG9yaW5ncGVyc3BlY3RpdmUiPjxhIG5hbWU9ImF1dGhvcmluZ3BlcnNwZWN0aXZlIj48IS0tIC0tPjwvYT4KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+QXV0aG9yaW5nIFBlcnNwZWN0aXZlPC9oMT4KLTxkaXY+PHA+VGhlIEF1dGhvcmluZyBQZXJzcGVjdGl2ZSBwcm92aWRlcyB2aWV3cyBhbmQgZnVuY3Rpb25zIHRvIG5hdmlnYXRlIGFuZAotYXV0aG9yIG1ldGhvZCBjb250ZW50IGFuZCBwcm9jZXNzZXMuIFlvdSBtdXN0IGJlIGluIHRoZSBBdXRob3JpbmcgUGVyc3BlY3RpdmUKLXRvIGNyZWF0ZSBvciBtb2RpZnkgYW55IGVsZW1lbnQgdHlwZXMuPC9wPgotPHA+Q2xpY2sgdGhlIE9wZW4gUGVyc3BlY3RpdmUgYnV0dG9uIDxpbWcgc3JjPSJvcGVucGVyc3AuSlBHIiBhbHQ9IiIgLz4gYW5kIHNlbGVjdCBBdXRob3JpbmcgdG8gb3BlbiB0aGUgQXV0aG9yaW5nIFBlcnNwZWN0aXZlLiA8L3A+Ci08cD48aW1nIHNyYz0iQXV0aG9yUGVyc3AuSlBHIiBhbHQ9IiIgLz48L3A+Ci08cD5UaGUgQXV0aG9yaW5nIFBlcnNwZWN0aXZlIGNvbnRhaW5zIHR3byBWaWV3czogdGhlIDxhIGhyZWY9ImxpYnJhcnl2aWV3Lmh0bWwjbGlicmFyeXZpZXciPkxpYnJhcnkgVmlldzwvYT4gYW5kIHRoZSA8YSBocmVmPSJjb25maWd1cmF0aW9udmlldy5odG1sI2NvbmZpZ3VyYXRpb252aWV3Ij5Db25maWd1cmF0aW9uIFZpZXc8L2E+LiBEb3VibGUgY2xpY2sgYW55IGVsZW1lbnQgaW4gdGhlCi1MaWJyYXJ5IFZpZXcgb3IgQ29uZmlndXJhdGlvbiBWaWV3IHRvIG9wZW4gdGhlIEVkaXRvciB3aW5kb3cgb24gdGhlIHJpZ2h0LgotVGhlIEVkaXRvciB3aW5kb3cgY29udGFpbnMgc2V2ZXJhbCB0YWJzIHRocm91Z2ggd2hpY2ggeW91IGNhbiBlZGl0IGluZm9ybWF0aW9uCi1hYm91dCB0aGUgZWxlbWVudCB5b3UgaGF2ZSBzZWxlY3RlZC48L3A+Ci08L2Rpdj4KLTxkaXY+Ci08ZGl2IGNsYXNzPSJmYW1pbHlsaW5rcyI+Ci08ZGl2IGNsYXNzPSJwYXJlbnRsaW5rIj48c3Ryb25nPlBhcmVudCB0b3BpYzo8L3N0cm9uZz4gPGEgaHJlZj0idXNlcmludGVyZmFjZW92ZXJ2aWV3Lmh0bWwiIHRpdGxlPSJFY2xpcHNlIFByb2Nlc3MgRnJhbWV3b3JrIENvbXBvc2VyIGlzIGJ1aWx0IG9uIHRoZSBFY2xpcHNlIEludGVncmF0ZWQgRGV2ZWxvcG1lbnQgRW52aXJvbm1lbnQgKElERSkuIFRoZSBwYXJ0cyBvZiB0aGUgd29ya3NwYWNlIGFyZToiPlRvb2wgSW50ZXJmYWNlPC9hPjwvZGl2PgotPGRpdiBjbGFzcz0ibmV4dGxpbmsiPjxzdHJvbmc+TmV4dCB0b3BpYzo8L3N0cm9uZz4gPGEgaHJlZj0iYnJvd3NpbmdwZXJzcGVjdGl2ZS5odG1sIj5Ccm93c2luZyBQZXJzcGVjdGl2ZTwvYT48L2Rpdj4KLTwvZGl2PgotPGRpdiBjbGFzcz0icmVsY29uY2VwdHMiPjxzdHJvbmc+UmVsYXRlZCBjb25jZXB0czwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJicm93c2luZ3BlcnNwZWN0aXZlLmh0bWwjYnJvd2luZ3BlcnNwZWN0aXZlIj5Ccm93c2luZyBQZXJzcGVjdGl2ZTwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0idXNlcmludGVyZmFjZW92ZXJ2aWV3Lmh0bWwjdXNlcmludGVyZmFjZW92ZXJ2aWV3IiB0aXRsZT0iRWNsaXBzZSBQcm9jZXNzIEZyYW1ld29yayBDb21wb3NlciBpcyBidWlsdCBvbiB0aGUgRWNsaXBzZSBJbnRlZ3JhdGVkIERldmVsb3BtZW50IEVudmlyb25tZW50IChJREUpLiBUaGUgcGFydHMgb2YgdGhlIHdvcmtzcGFjZSBhcmU6Ij5Ub29sIEludGVyZmFjZTwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9ib2xkLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2JvbGQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMGM0Njg1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2JvbGQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvYnJvd3NlYW5kcHJldmlld21ldGhvZGNvbnRlbnQuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2Jyb3dzZWFuZHByZXZpZXdtZXRob2Rjb250ZW50Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzY2MwMTQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvYnJvd3NlYW5kcHJldmlld21ldGhvZGNvbnRlbnQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgaHRtbAotICBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0ic2VjdXJpdHkiIGNvbnRlbnQ9InB1YmxpYyIgLz4KLTxtZXRhIG5hbWU9IlJvYm90cyIgY29udGVudD0iaW5kZXgsZm9sbG93IiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBuYW1lPSJEQy5UeXBlIiBjb250ZW50PSJ0YXNrIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IkJyb3dzZSBhbmQgUHJldmlldyBNZXRob2QgQ29udGVudCIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0idXNlcmludGVyZmFjZW92ZXJ2aWV3Lmh0bWwiIC8+Ci08bWV0YSBuYW1lPSJEQy5Gb3JtYXQiIGNvbnRlbnQ9IlhIVE1MIiAvPgotPG1ldGEgbmFtZT0iREMuSWRlbnRpZmllciIgY29udGVudD0iYnJvd3NlYW5kcHJldmlld21ldGhvZGNvbnRlbnQiIC8+Ci08bWV0YSBuYW1lPSJEQy5MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiIC8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4vaWJtZGl0YS5jc3MiIC8+Ci08dGl0bGU+QnJvd3NlIGFuZCBQcmV2aWV3IE1ldGhvZCBDb250ZW50PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJicm93c2VhbmRwcmV2aWV3bWV0aG9kY29udGVudCI+PGEgbmFtZT0iYnJvd3NlYW5kcHJldmlld21ldGhvZGNvbnRlbnQiPjwhLS0gLS0+PC9hPgotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5Ccm93c2UgYW5kIFByZXZpZXcgTWV0aG9kIENvbnRlbnQ8L2gxPgotPGRpdj48ZGl2IGNsYXNzPSJwIj5Zb3UgY2FuIGJyb3dzZSBtZXRob2QgY29udGVudCBpbiBib3RoIHRoZSA8YSBocmVmPSJhdXRob3JpbmdwZXJzcGVjdGl2ZS5odG1sI2F1dGhvcmluZ3BlcnNwZWN0aXZlIj5BdXRob3JpbmcgUGVyc3BlY3RpdmU8L2E+IGFuZCA8YSBocmVmPSJicm93c2luZ3BlcnNwZWN0aXZlLmh0bWwjYnJvd2luZ3BlcnNwZWN0aXZlIj5Ccm93c2luZyBQZXJzcGVjdGl2ZTwvYT4uIFdoaWxlIGF1dGhvcmluZyBtZXRob2QgY29udGVudCwgeW91IGNhbiBzZWUgYSBwcmV2aWV3Ci1vZiB0aGUgcHVibGlzaGVkIHBhZ2UgZm9yIHRoZSBjb250ZW50IHlvdSBhcmUgZWRpdGluZyBieSBzZWxlY3RpbmcgdGhlIDxzdHJvbmc+UHJldmlldzwvc3Ryb25nPiB0YWIKLWF0IHRoZSBib3R0b20gb2YgdGhlIGNvbnRlbnQgZWRpdG9yLiBDbGljayBhbnkgbGluayBpbiB0aGUgZGlzcGxheWVkIHBhZ2UKLXRvIGdvIHRvIHRoYXQgcGFnZS4gVXNlIHRoZSBidXR0b25zIGluIHRoZSBlZGl0b3IgdG9vbGJhciB0byBwZXJmb3JtIGZhbWlsaWFyCi1icm93c2VyIGFjdGlvbnMgc3VjaCBhcyBiYWNrIG9yIHJlZnJlc2guIFdoaWxlIGJyb3dzaW5nIG1ldGhvZCBjb250ZW50IGluCi10aGUgYnJvd3NpbmcgcGVyc3BlY3RpdmUgeW91IGNhbiBzZWUgYSBwcmV2aWV3IG9mIGFueSBtZXRob2QgYW5kIHByb2Nlc3MgY29udGVudAotaW4gYSBtZXRob2QgY29uZmlndXJhdGlvbiBhcyBpdCBhcHBlYXJzIGluIGEgcHVibGlzaGVkIFdlYiBzaXRlLiA8L2Rpdj4KLTxkaXYgY2xhc3M9InNlY3Rpb24iPjxwPlRvIGJyb3dzZSBhbmQgcHJldmlldyA8YSBocmVmPSJtZXRob2Rjb250ZW50Lmh0bWwjY3JlYXRpbmdyZXVzYWJsZW1ldGhvZGNvbnRlbnRzIj5NZXRob2QgQ29udGVudDwvYT4gaW4gdGhlIDxhIGhyZWY9ImF1dGhvcmluZ3BlcnNwZWN0aXZlLmh0bWwjYXV0aG9yaW5ncGVyc3BlY3RpdmUiPkF1dGhvcmluZyBQZXJzcGVjdGl2ZTwvYT46PC9wPgotPC9kaXY+Ci08b2w+PGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5DbGljayB0aGUgT3BlbiBQZXJzcGVjdGl2ZSBidXR0b24gPGltZyBzcmM9Im9wZW5wZXJzcC5KUEciIGFsdD0iIiAvPiBhbmQgc2VsZWN0IDxzdHJvbmc+QXV0aG9yaW5nPC9zdHJvbmc+LiBUaGUgQXV0aG9yaW5nIHBlcnNwZWN0aXZlCi1vcGVucyB3aXRoIHRoZSA8YSBocmVmPSJsaWJyYXJ5dmlldy5odG1sI2xpYnJhcnl2aWV3Ij5MaWJyYXJ5IFZpZXc8L2E+IGFuZCA8YSBocmVmPSJjb25maWd1cmF0aW9udmlldy5odG1sI2NvbmZpZ3VyYXRpb252aWV3Ij5Db25maWd1cmF0aW9uIFZpZXc8L2E+IG9uCi10aGUgbGVmdCBhbmQgdGhlIGNvbnRlbnQgdmlldyBvbiB0aGUgcmlnaHQuIElmIGEgbWV0aG9kIGVsZW1lbnQgaXMgc2VsZWN0ZWQsCi10aGUgYXBwcm9wcmlhdGUgZWRpdG9yIGlzIG9wZW4gb24gdGhlIHJpZ2h0Ljwvc3Bhbj48L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5FeHBsb3JlIHRoZSBjb250ZW50cyBpbiB0aGUgYm90aCB0aGUgTGlicmFyeSBWaWV3IGFuZCBDb25maWd1cmF0aW9uCi1WaWV3IGJ5IGV4cGFuZGluZyB0aGUgZGlmZmVyZW50IGNvbnRlbnQgcGFja2FnZXMgYW5kIG1ldGhvZCBwbHVnLWlucyBkb3duCi10byB0aGVpciBtZXRob2QgZWxlbWVudHMuIERvdWJsZSBjbGljayBhbiBlbGVtZW50IHRvIG9wZW4gaXQgaW4gdGhlIGVkaXRvci48L3NwYW4+PC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+Q2xpY2sgdGhlIDxzdHJvbmc+UHJldmlldzwvc3Ryb25nPiB0YWIgYXQgdGhlIGJvdHRvbSBvZiB0aGUgY29udGVudCBlZGl0b3IKLXRvIHByZXZpZXcgdGhlIGNvbnRlbnQgb2YgYW55IHNlbGVjdGVkIGVsZW1lbnQuPC9zcGFuPiA8ZGl2IGNsYXNzPSJub3RlIj48c3BhbiBjbGFzcz0ibm90ZXRpdGxlIj5Ob3RlOjwvc3Bhbj4gVGhlIHByZXZpZXcKLXBhZ2UgaW4gdGhlIGNvbnRlbnQgZWRpdG9yIGRvZXMgbm90IHJlc29sdmUgY29udGVudCB2YXJpYWJpbGl0eSByZWxhdGlvbnNoaXBzLgotSWYgeW91IGFyZSBleHRlbmRpbmcsIGNvbnRyaWJ1dGluZyB0bywgb3IgcmVwbGFjaW5nIGEgYmFzZSBjb250ZW50IGl0ZW0sIHlvdQotY2FuIG9ubHkgc2VlIHRoZSByZXN1bHQgb2YgdGhpcyBpbiB0aGUgQ29uZmlndXJhdGlvbiBWaWV3IGluIHRoZSBCcm93c2luZwotUGVyc3BlY3RpdmUuIEZvciBtb3JlIGluZm9ybWF0aW9uIHNlZSA8YSBocmVmPSJ2YXJpYWJpbGl0eS5odG1sI3ZhcmlhYmlsaXR5Ij5WYXJpYWJpbGl0eTwvYT4uPC9kaXY+Ci08cD48L3A+Ci08L2xpPgotPC9vbD4KLTxkaXYgY2xhc3M9InNlY3Rpb24iPjxwPlRvIGJyb3dzZSBhbmQgcHJldmlldzxhIGhyZWY9Im1ldGhvZGNvbnRlbnQuaHRtbCNjcmVhdGluZ3JldXNhYmxlbWV0aG9kY29udGVudHMiPk1ldGhvZCBDb250ZW50PC9hPiBpbiB0aGUgPGEgaHJlZj0iYnJvd3NpbmdwZXJzcGVjdGl2ZS5odG1sI2Jyb3dpbmdwZXJzcGVjdGl2ZSI+QnJvd3NpbmcgUGVyc3BlY3RpdmU8L2E+OjwvcD4KLTxvbD48bGk+Q2xpY2sgdGhlIE9wZW4gUGVyc3BlY3RpdmUgYnV0dG9uIDxpbWcgc3JjPSJvcGVucGVyc3AuSlBHIiBhbHQ9IiIgLz4gYW5kIHNlbGVjdCA8c3Ryb25nPkJyb3dzaW5nPC9zdHJvbmc+LiBUaGUgPGEgaHJlZj0iYnJvd3NpbmdwZXJzcGVjdGl2ZS5odG1sI2Jyb3dpbmdwZXJzcGVjdGl2ZSI+QnJvd3NpbmcgUGVyc3BlY3RpdmU8L2E+IG9wZW5zIHdpdGggdGhlIDxhIGhyZWY9ImNvbmZpZ3VyYXRpb252aWV3Lmh0bWwjY29uZmlndXJhdGlvbnZpZXciPkNvbmZpZ3VyYXRpb24gVmlldzwvYT4gb24gdGhlIGxlZnQgYW5kIHRoZSBDb250ZW50IFZpZXcgb24gdGhlIHJpZ2h0LjxwPjwvcD4KLTwvbGk+Ci08bGk+U2VsZWN0IGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24gZnJvbSB0aGUgY29uZmlndXJhdGlvbiBkcm9wLWRvd24gbGlzdCBpbgotdGhlIHRvb2wgYmFyLiBUaGUgY29udGVudCBvZiB0aGUgbWV0aG9kIGNvbmZpZ3VyYXRpb24gYXBwZWFycyBpbiB0aGUgY29udGVudAotdmlldywgYXMgaXQgd2lsbCBhcHBlYXIgaW4gYSBwdWJsaXNoZWQgV2ViIHNpdGUuPHA+PC9wPgotPC9saT4KLTxsaT5FeHBsb3JlIGFuZCBwcmV2aWV3IHRoZSBjb250ZW50IGluIHRoZSBDb25maWd1cmF0aW9uIFZpZXcgYnkgZXhwYW5kaW5nCi10aGUgY2F0ZWdvcmllcyBhbmQgb3RoZXIgZm9sZGVycyBkb3duIHRvIG1ldGhvZCBlbGVtZW50cy4gQ2xpY2sgYSBtZXRob2QgZWxlbWVudAotdG8gb3BlbiBpdCBpbiB0aGUgY29udGVudCB2aWV3LjwvbGk+Ci08L29sPgotPC9kaXY+Ci08L2Rpdj4KLTxkaXY+PGRpdiBjbGFzcz0icmVsY29uY2VwdHMiPjxzdHJvbmc+UmVsYXRlZCBjb25jZXB0czwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJ1c2VyaW50ZXJmYWNlb3ZlcnZpZXcuaHRtbCIgdGl0bGU9IkVjbGlwc2UgUHJvY2VzcyBGcmFtZXdvcmsgQ29tcG9zZXIgaXMgYnVpbHQgb24gdGhlIEVjbGlwc2UgSW50ZWdyYXRlZCBEZXZlbG9wbWVudCBFbnZpcm9ubWVudCAoSURFKS4gVGhlIHBhcnRzIG9mIHRoZSB3b3Jrc3BhY2UgYXJlOiI+VG9vbCBJbnRlcmZhY2U8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvYnJvd3NlcGVyc3AuSlBHIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvYnJvd3NlcGVyc3AuSlBHCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZjY5MWZmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2Jyb3dzZXBlcnNwLkpQRworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2Jyb3dzaW5ncGVyc3BlY3RpdmUuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2Jyb3dzaW5ncGVyc3BlY3RpdmUuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTYxZmU0My4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9icm93c2luZ3BlcnNwZWN0aXZlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGh0bWwKLSAgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9InNlY3VyaXR5IiBjb250ZW50PSJwdWJsaWMiIC8+Ci08bWV0YSBuYW1lPSJSb2JvdHMiIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgbmFtZT0iREMuVHlwZSIgY29udGVudD0iY29uY2VwdCIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJCcm93c2luZyBQZXJzcGVjdGl2ZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iYXV0aG9yaW5ncGVyc3BlY3RpdmUuaHRtbCNhdXRob3JpbmdwZXJzcGVjdGl2ZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0idXNlcmludGVyZmFjZW92ZXJ2aWV3Lmh0bWwjdXNlcmludGVyZmFjZW92ZXJ2aWV3IiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJ1c2VyaW50ZXJmYWNlb3ZlcnZpZXcuaHRtbCIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iYXV0aG9yaW5ncGVyc3BlY3RpdmUuaHRtbCIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iY29uZmlndXJhdGlvbnZpZXcuaHRtbCIgLz4KLTxtZXRhIG5hbWU9IkRDLkZvcm1hdCIgY29udGVudD0iWEhUTUwiIC8+Ci08bWV0YSBuYW1lPSJEQy5JZGVudGlmaWVyIiBjb250ZW50PSJicm93aW5ncGVyc3BlY3RpdmUiIC8+Ci08bWV0YSBuYW1lPSJEQy5MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiIC8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4vaWJtZGl0YS5jc3MiIC8+Ci08dGl0bGU+QnJvd3NpbmcgUGVyc3BlY3RpdmU8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9ImJyb3dpbmdwZXJzcGVjdGl2ZSI+PGEgbmFtZT0iYnJvd2luZ3BlcnNwZWN0aXZlIj48IS0tIC0tPjwvYT4KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+QnJvd3NpbmcgUGVyc3BlY3RpdmU8L2gxPgotPGRpdj48cD5UaGUgQnJvd3NpbmcgUGVyc3BlY3RpdmUgYWxsb3dzIHlvdSB0byBwcmV2aWV3IGFuZCBuYXZpZ2F0ZSB0aHJvdWdoIGEgTWV0aG9kCi1Db25maWd1cmF0aW9uIHdpdGhvdXQgbWFraW5nIGFueSBjaGFuZ2VzLjwvcD4KLTxwPkNsaWNrIHRoZSBPcGVuIFBlcnNwZWN0aXZlIGJ1dHRvbiA8aW1nIHNyYz0ib3BlbnBlcnNwLkpQRyIgYWx0PSIiIC8+IGFuZCBzZWxlY3QgPHN0cm9uZz5Ccm93c2luZzwvc3Ryb25nPiB0byBvcGVuIHRoZSBCcm93c2luZyBQZXJzcGVjdGl2ZS48L3A+Ci08cD48aW1nIHNyYz0iYnJvd3NlcGVyc3AuSlBHIiBhbHQ9IiIgLz48L3A+Ci08cD5UaGUgQnJvd3NpbmcgcGVyc3BlY3RpdmUgY29udGFpbnMgdGhlIDxhIGhyZWY9ImNvbmZpZ3VyYXRpb252aWV3Lmh0bWwjY29uZmlndXJhdGlvbnZpZXciPkNvbmZpZ3VyYXRpb24gVmlldzwvYT4sIHdoaWNoIHNob3dzIHRoZSBjb250ZW50IGluIHRoZSBjdXJyZW50bHkKLXNlbGVjdGVkIGNvbmZpZ3VyYXRpb24uIENsaWNrIGFueSBlbGVtZW50IGluIHRoZSBDb25maWd1cmF0aW9uCi1WaWV3IHRvIHByZXZpZXcgdGhlIGVsZW1lbnQgaW4gdGhlIENvbnRlbnQgVmlldyBhcyBpdCB3aWxsIGFwcGVhciBpbiBhIHB1Ymxpc2hlZAotV2ViIHNpdGUuIFRoZSBDb250ZW50IFZpZXcgcHJvdmlkZXMgYnJvd3Nlci1saWtlIG5hdmlnYXRpb24gZmVhdHVyZXMuIENsaWNrCi1hbnkgbGluayBpbiB0aGUgZGlzcGxheWVkIHBhZ2UgdG8gZ28gdG8gdGhhdCBwYWdlLiBVc2UgdGhlIGJ1dHRvbnMgaW4gdGhlCi1Db250ZW50IFZpZXcgdG9vbGJhciB0byBwZXJmb3JtIGZhbWlsaWFyIGJyb3dzZXIgYWN0aW9ucyBzdWNoIGFzIGJhY2sgb3IgcmVmcmVzaC48L3A+Ci08L2Rpdj4KLTxkaXY+Ci08ZGl2IGNsYXNzPSJmYW1pbHlsaW5rcyI+Ci08ZGl2IGNsYXNzPSJwYXJlbnRsaW5rIj48c3Ryb25nPlBhcmVudCB0b3BpYzo8L3N0cm9uZz4gPGEgaHJlZj0idXNlcmludGVyZmFjZW92ZXJ2aWV3Lmh0bWwiIHRpdGxlPSJFY2xpcHNlIFByb2Nlc3MgRnJhbWV3b3JrIENvbXBvc2VyIGlzIGJ1aWx0IG9uIHRoZSBFY2xpcHNlIEludGVncmF0ZWQgRGV2ZWxvcG1lbnQgRW52aXJvbm1lbnQgKElERSkuIFRoZSBwYXJ0cyBvZiB0aGUgd29ya3NwYWNlIGFyZToiPlRvb2wgSW50ZXJmYWNlPC9hPjwvZGl2PgotPGRpdiBjbGFzcz0icHJldmlvdXNsaW5rIj48c3Ryb25nPlByZXZpb3VzIHRvcGljOjwvc3Ryb25nPiA8YSBocmVmPSJhdXRob3JpbmdwZXJzcGVjdGl2ZS5odG1sIj5BdXRob3JpbmcgUGVyc3BlY3RpdmU8L2E+PC9kaXY+Ci08ZGl2IGNsYXNzPSJuZXh0bGluayI+PHN0cm9uZz5OZXh0IHRvcGljOjwvc3Ryb25nPiA8YSBocmVmPSJjb25maWd1cmF0aW9udmlldy5odG1sIj5Db25maWd1cmF0aW9uIFZpZXc8L2E+PC9kaXY+Ci08L2Rpdj4KLTxkaXYgY2xhc3M9InJlbGNvbmNlcHRzIj48c3Ryb25nPlJlbGF0ZWQgY29uY2VwdHM8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iYXV0aG9yaW5ncGVyc3BlY3RpdmUuaHRtbCNhdXRob3JpbmdwZXJzcGVjdGl2ZSI+QXV0aG9yaW5nIFBlcnNwZWN0aXZlPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJ1c2VyaW50ZXJmYWNlb3ZlcnZpZXcuaHRtbCN1c2VyaW50ZXJmYWNlb3ZlcnZpZXciIHRpdGxlPSJFY2xpcHNlIFByb2Nlc3MgRnJhbWV3b3JrIENvbXBvc2VyIGlzIGJ1aWx0IG9uIHRoZSBFY2xpcHNlIEludGVncmF0ZWQgRGV2ZWxvcG1lbnQgRW52aXJvbm1lbnQgKElERSkuIFRoZSBwYXJ0cyBvZiB0aGUgd29ya3NwYWNlIGFyZToiPlRvb2wgSW50ZXJmYWNlPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2NhcGFiaWxpdHlwYXR0ZXJuLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9jYXBhYmlsaXR5cGF0dGVybi5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZmU1NmFkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2NhcGFiaWxpdHlwYXR0ZXJuLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGh0bWwKLSAgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9InNlY3VyaXR5IiBjb250ZW50PSJwdWJsaWMiIC8+Ci08bWV0YSBuYW1lPSJSb2JvdHMiIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgbmFtZT0iREMuVHlwZSIgY29udGVudD0iY29uY2VwdCIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJDYXBhYmlsaXR5IFBhdHRlcm4iIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9ImFwcGx5YWNhcGFiaWxpdHlwYXR0ZXJuLmh0bWwjYXBwbHlhY2FwYWJpbGl0eXBhdHRlcm4iIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9ImFjdGl2aXR5Lmh0bWwjYWN0aXZpdHkiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9ImRpc2NpcGxpbmUuaHRtbCNkaXNjaXBsaW5lIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJkZWxpdmVyeXByb2Nlc3MuaHRtbCNkZWxpdmVyeXByb2Nlc3MiIC8+Ci08bWV0YSBuYW1lPSJEQy5Gb3JtYXQiIGNvbnRlbnQ9IlhIVE1MIiAvPgotPG1ldGEgbmFtZT0iREMuSWRlbnRpZmllciIgY29udGVudD0iY2FwYWJpbGl0eXBhdHRlcm4iIC8+Ci08bWV0YSBuYW1lPSJEQy5MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiIC8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4vaWJtZGl0YS5jc3MiIC8+Ci08dGl0bGU+Q2FwYWJpbGl0eSBQYXR0ZXJuPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJjYXBhYmlsaXR5cGF0dGVybiI+PGEgbmFtZT0iY2FwYWJpbGl0eXBhdHRlcm4iPjwhLS0gLS0+PC9hPgotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5DYXBhYmlsaXR5IFBhdHRlcm48L2gxPgotPGRpdj48cD5BIENhcGFiaWxpdHkgcGF0dGVybiBpcyBhIHNwZWNpYWwgcHJvY2VzcyB0aGF0IGRlc2NyaWJlcyBhIHJldXNhYmxlIGNsdXN0ZXIKLW9mIGFjdGl2aXRpZXMgaW4gY29tbW9uIHByb2Nlc3MgYXJlYXMuIENhcGFiaWxpdHkgcGF0dGVybnMgZXhwcmVzcyBhbmQgY29tbXVuaWNhdGUKLXByb2Nlc3Mga25vd2xlZGdlIGZvciBhIGtleSBhcmVhIG9mIGludGVyZXN0IHN1Y2ggYXMgYSBkaXNjaXBsaW5lIGFuZCBjYW4KLWJlIGRpcmVjdGx5IHVzZWQgYnkgYSBwcm9jZXNzIHByYWN0aXRpb25lciB0byBndWlkZSBoaXMgd29yay4gQ2FwYWJpbGl0eSBwYXR0ZXJucwotYXJlIGFsc28gdXNlZCBhcyBidWlsZGluZyBibG9ja3MgdG8gYXNzZW1ibGUgRGVsaXZlcnkgcHJvY2Vzc2VzIG9yIGxhcmdlcgotY2FwYWJpbGl0eSBwYXR0ZXJucyBlbnN1cmluZyBvcHRpbWFsIHJldXNlIGFuZCBhcHBsaWNhdGlvbiBvZiB0aGUga2V5IHByYWN0aWNlcwotdGhleSBleHByZXNzLjwvcD4KLTxwPkV4YW1wbGVzIG9mIGEgY2FwYWJpbGl0eSBwYXR0ZXJuIGNvdWxkIGJlICJ1c2UgY2FzZS1iYXNlZCByZXF1aXJlbWVudHMKLW1hbmFnZW1lbnQiLCAidXNlIGNhc2UgYW5hbHlzaXMiLCBvciAidW5pdCB0ZXN0aW5nIi4gVHlwaWNhbGx5LCBidXQgbm90IG5lY2Vzc2FyaWx5LAotY2FwYWJpbGl0eSBwYXR0ZXJucyBoYXZlIHRoZSBzY29wZSBvZiBvbmUgZGlzY2lwbGluZSBwcm92aWRpbmcgYSBicmVha2Rvd24KLW9mIHJldXNhYmxlIGNvbXBsZXggYWN0aXZpdGllcywgcmVsYXRpb25zaGlwcyB0byB0aGUgcm9sZXMgd2hpY2ggcGVyZm9ybSB0YXNrcwotd2l0aGluIHRoZXNlIGFjdGl2aXRpZXMsIGFzIHdlbGwgYXMgdG8gdGhlIHdvcmsgcHJvZHVjdHMgdGhhdCBhcmUgdXNlZCBhbmQKLXByb2R1Y2VkLiBBIGNhcGFiaWxpdHkgcGF0dGVybiBkb2VzIG5vdCByZWxhdGUgdG8gYW55IHNwZWNpZmljCi1waGFzZSBvciBpdGVyYXRpb24gb2YgYSBkZXZlbG9wbWVudCBsaWZlY3ljbGUsIGFuZCBzaG91bGQgbm90IGltcGx5IGFueS4gSW4KLW90aGVyIHdvcmRzLCBhIHBhdHRlcm4gc2hvdWxkIGJlIGRlc2lnbmVkIGluIGEgd2F5IHRoYXQgaXQgaXMgYXBwbGljYWJsZSBhbnl3aGVyZQotaW4gYSBkZWxpdmVyeSBwcm9jZXNzLiB0aGVyZWJ5IGVuYWJsaW5nIGl0cyBhY3Rpdml0aWVzIHRvIGJlIGZsZXhpYmx5IGFzc2lnbmVkCi10byB3aGF0ZXZlciBwaGFzZXMgdGhlcmUgYXJlIGluIHRoZSBkZWxpdmVyeSBwcm9jZXNzIHRvIHdoaWNoIGl0IGlzIGJlaW5nCi1hcHBsaWVkLjwvcD4KLTwvZGl2PgotPGRpdj48ZGl2IGNsYXNzPSJyZWxjb25jZXB0cyI+PHN0cm9uZz5SZWxhdGVkIGNvbmNlcHRzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9ImFjdGl2aXR5Lmh0bWwjYWN0aXZpdHkiPkFjdGl2aXR5PC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJkaXNjaXBsaW5lLmh0bWwjZGlzY2lwbGluZSI+RGlzY2lwbGluZTwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iZGVsaXZlcnlwcm9jZXNzLmh0bWwjZGVsaXZlcnlwcm9jZXNzIj5EZWxpdmVyeSBQcm9jZXNzPC9hPjwvZGl2PgotPC9kaXY+Ci08ZGl2IGNsYXNzPSJyZWx0YXNrcyI+PHN0cm9uZz5SZWxhdGVkIHRhc2tzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9ImFwcGx5YWNhcGFiaWxpdHlwYXR0ZXJuLmh0bWwjYXBwbHlhY2FwYWJpbGl0eXBhdHRlcm4iPkFwcGx5IGEgQ2FwYWJpbGl0eSBQYXR0ZXJuPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2NoZWNrbGlzdC5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvY2hlY2tsaXN0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwNzhhZGUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvY2hlY2tsaXN0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGh0bWwKLSAgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9InNlY3VyaXR5IiBjb250ZW50PSJwdWJsaWMiIC8+Ci08bWV0YSBuYW1lPSJSb2JvdHMiIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgbmFtZT0iREMuVHlwZSIgY29udGVudD0iY29uY2VwdCIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJDaGVja2xpc3QiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9Imd1aWRhbmNlLmh0bWwjZ3VpZGFuY2UiIC8+Ci08bWV0YSBuYW1lPSJEQy5Gb3JtYXQiIGNvbnRlbnQ9IlhIVE1MIiAvPgotPG1ldGEgbmFtZT0iREMuSWRlbnRpZmllciIgY29udGVudD0iY2hlY2tsaXN0IiAvPgotPG1ldGEgbmFtZT0iREMuTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIiAvPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuL2libWRpdGEuY3NzIiAvPgotPHRpdGxlPkNoZWNrbGlzdDwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0iY2hlY2tsaXN0Ij48YSBuYW1lPSJjaGVja2xpc3QiPjwhLS0gLS0+PC9hPgotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5DaGVja2xpc3Q8L2gxPgotPGRpdj48cD5BIENoZWNrbGlzdCBpcyBhIHNwZWNpZmljIHR5cGUgb2YgZ3VpZGFuY2UgdGhhdCBpZGVudGlmaWVzIGEgc2VyaWVzIG9mCi1pdGVtcyB0aGF0IG5lZWQgdG8gYmUgY29tcGxldGVkIG9yIHZlcmlmaWVkLiBDaGVja2xpc3RzIGFyZSBvZnRlbiB1c2VkIGluCi1yZXZpZXdzIHN1Y2ggYXMgYSB3YWxrLXRocm91Z2hzIG9yIGluc3BlY3Rpb25zLjwvcD4KLTwvZGl2PgotPGRpdj48ZGl2IGNsYXNzPSJyZWxjb25jZXB0cyI+PHN0cm9uZz5SZWxhdGVkIGNvbmNlcHRzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Imd1aWRhbmNlLmh0bWwjZ3VpZGFuY2UiPkd1aWRhbmNlPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2NsZWFyY29udGVudC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9jbGVhcmNvbnRlbnQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYTM1ZjQ3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2NsZWFyY29udGVudC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9jb2xsYXBzZWQuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvY29sbGFwc2VkLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGU4Nzc1OS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9jb2xsYXBzZWQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvY29uY2VwdC5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvY29uY2VwdC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMTk4MmE5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2NvbmNlcHQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgaHRtbAotICBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0ic2VjdXJpdHkiIGNvbnRlbnQ9InB1YmxpYyIgLz4KLTxtZXRhIG5hbWU9IlJvYm90cyIgY29udGVudD0iaW5kZXgsZm9sbG93IiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBuYW1lPSJEQy5UeXBlIiBjb250ZW50PSJjb25jZXB0IiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IkNvbmNlcHQiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9Imd1aWRhbmNlLmh0bWwjZ3VpZGFuY2UiIC8+Ci08bWV0YSBuYW1lPSJEQy5Gb3JtYXQiIGNvbnRlbnQ9IlhIVE1MIiAvPgotPG1ldGEgbmFtZT0iREMuSWRlbnRpZmllciIgY29udGVudD0iY29uY2VwdCIgLz4KLTxtZXRhIG5hbWU9IkRDLkxhbmd1YWdlIiBjb250ZW50PSJlbi11cyIgLz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi9pYm1kaXRhLmNzcyIgLz4KLTx0aXRsZT5Db25jZXB0PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJjb25jZXB0Ij48YSBuYW1lPSJjb25jZXB0Ij48IS0tIC0tPjwvYT4KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+Q29uY2VwdDwvaDE+Ci08ZGl2PjxwPkEgQ29uY2VwdCBpcyBhIHNwZWNpZmljIHR5cGUgb2YgZ3VpZGFuY2UgdGhhdCBvdXRsaW5lcyBrZXkgaWRlYXMgYXNzb2NpYXRlZAotd2l0aCBiYXNpYyBwcmluY2lwbGVzIHVuZGVybHlpbmcgdGhlIHJlZmVyZW5jZWQgaXRlbS4gQ29uY2VwdHMgbm9ybWFsbHkgYWRkcmVzcwotbW9yZSBnZW5lcmFsIHRvcGljcyB0aGFuIGd1aWRlbGluZXMgYW5kIHNwYW4gYWNyb3NzIHNldmVyYWwgd29yayBwcm9kdWN0IGFuZC9vcgotdGFza3Mgb3IgYWN0aXZpdGllcy48L3A+Ci08L2Rpdj4KLTxkaXY+PGRpdiBjbGFzcz0icmVsY29uY2VwdHMiPjxzdHJvbmc+UmVsYXRlZCBjb25jZXB0czwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJndWlkYW5jZS5odG1sI2d1aWRhbmNlIj5HdWlkYW5jZTwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9jb25mLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2NvbmYuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZTVlNmI5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2NvbmYuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvY29uZmlndXJhdGlvbnNhbmRwdWJsaXNoaW5nb3ZlcnZpZXcuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2NvbmZpZ3VyYXRpb25zYW5kcHVibGlzaGluZ292ZXJ2aWV3Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmZTExZDcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvY29uZmlndXJhdGlvbnNhbmRwdWJsaXNoaW5nb3ZlcnZpZXcuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgaHRtbAotICBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0ic2VjdXJpdHkiIGNvbnRlbnQ9InB1YmxpYyIgLz4KLTxtZXRhIG5hbWU9IlJvYm90cyIgY29udGVudD0iaW5kZXgsZm9sbG93IiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBuYW1lPSJEQy5UeXBlIiBjb250ZW50PSJjb25jZXB0IiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IkNvbmZpZ3VyYXRpb25zIGFuZCBQdWJsaXNoaW5nIE92ZXJ2aWV3IiAvPgotPG1ldGEgbmFtZT0iYWJzdHJhY3QiIGNvbnRlbnQ9IlB1dCB5b3VyIHNob3J0IGRlc2NyaXB0aW9uIGhlcmU7IHVzZWQgZm9yIGZpcnN0IHBhcmFncmFwaCBhbmQgYWJzdHJhY3QuIiAvPgotPG1ldGEgbmFtZT0iZGVzY3JpcHRpb24iIGNvbnRlbnQ9IlB1dCB5b3VyIHNob3J0IGRlc2NyaXB0aW9uIGhlcmU7IHVzZWQgZm9yIGZpcnN0IHBhcmFncmFwaCBhbmQgYWJzdHJhY3QuIiAvPgotPG1ldGEgbmFtZT0iREMuRm9ybWF0IiBjb250ZW50PSJYSFRNTCIgLz4KLTxtZXRhIG5hbWU9IkRDLklkZW50aWZpZXIiIGNvbnRlbnQ9ImNvbmZpZ3VyYXRpb25zYW5kcHVibGlzaGluZ292ZXJ2aWV3IiAvPgotPG1ldGEgbmFtZT0iREMuTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIiAvPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuL2libWRpdGEuY3NzIiAvPgotPHRpdGxlPkNvbmZpZ3VyYXRpb25zIGFuZCBQdWJsaXNoaW5nIE92ZXJ2aWV3PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJjb25maWd1cmF0aW9uc2FuZHB1Ymxpc2hpbmdvdmVydmlldyI+Ci08aDM+TWV0aG9kIENvbmZpZ3VyYXRpb25zIE92ZXJ2aWV3PC9oMz4KLTxwPkVjbGlwc2UgUHJvY2VzcyBGcmFtZXdvcmsgQ29tcG9zZXIgc2hpcHMgd2l0aCBhIGxvdCBvZiBjb250ZW50IG91dCBvZiB0aGUgYm94LiBJdCBpbmNsdWRlcwotICB0aGUgT3BlblVQIGZyYW1ld29yayBhbmQgdmFyaW91cyBwbHVnLWlucyBleHRlbmRpbmcKLSAgT3BlblVQL0Jhc2ljIHdpdGggZG9tYWluLXNwZWNpZmljIGFkZGl0aW9ucy4gTm8gb3JnYW5pemF0aW9uIG9yIHByb2plY3QgcmVxdWlyZXMgYWxsIG9mIHRoaXMKLSAgZG9jdW1lbnRhdGlvbiBhbGwgYXQgb25jZSwgYnV0IHdvdWxkIHdvcmsgd2l0aCBhIHNlbGVjdGlvbiBvZiBzcGVjaWZpYyBzdWJzZXRzLjwvcD4KLTxwPiBFY2xpcHNlIFByb2Nlc3MgRnJhbWV3b3JrIENvbXBvc2VyIChFUEYgQ29tcG9zZXIpIG1hbmFnZXMgZm9yIHRoYXQgcHVycG9zZSBzby1jYWxsZWQgbWV0aG9kCi0gIGNvbmZpZ3VyYXRpb25zLCB3aGljaCBhbGxvdyB5b3UgdG8gc3BlY2lmeSB3b3JraW5nIHNldHMgb2YgY29udGVudCBhbmQgcHJvY2Vzc2VzCi0gIGZvciBhIHNwZWNpZmljIGNvbnRleHQsIHN1Y2ggYXMgYSBzcGVjaWZpYyB2YXJpYW50IG9mIHRoZSBPcGVuVVAgZnJhbWV3b3JrIHRoYXQKLSAgeW91IHdhbnQgdG8gcHVibGlzaCBhbmQgZGVwbG95IGZvciBhIGdpdmVuIHNvZnR3YXJlIHByb2plY3Qgb3IgYXMgYSBmb3VuZGF0aW9uCi0gIGZvciBhIGRldmVsb3BtZW50IG9yZ2FuaXphdGlvbi4gQWxsIGNvbnRlbnQgYW5kIHByb2Nlc3NlcyBpbiBFUEYgQ29tcG9zZXIgYXJlIG9yZ2FuaXplZAotICBpbiBtZXRob2QgcGx1Zy1pbnMsIHdoaWNoIGFyZSBvcmdhbml6ZWQgaW50byBtZXRob2QgcGFja2FnZXMuIEEgbWV0aG9kIGNvbmZpZ3VyYXRpb24KLSAgaXMgc2ltcGx5IGEgc2VsZWN0aW9uIG9mIHRoZSBtZXRob2QgcGx1Zy1pbnMgYW5kIHBhY2thZ2VzLjwvcD4KLTxwPjxpbWcgc3JjPSJjb25mLmdpZiIgd2lkdGg9IjY2NSI+PC9wPgotPHA+WW91IGNyZWF0ZSBhbmQgc3BlY2lmeSBhIGNvbmZpZ3VyYXRpb24gdXNpbmcgdGhlIGNvbmZpZ3VyYXRpb24gZWRpdG9yIGRlcGljdGVkCi0gIGluIHRoZSBmaWd1cmUgYWJvdmUuIFlvdSBjb3VsZCBzdGFydCBjcmVhdGluZyB5b3VyIG93biBtZXRob2QgY29uZmlndXJhdGlvbgotICBieSBjb3B5aW5nIG9uZSBvZiB0aGUgY29uZmlndXJhdGlvbnMgdGhhdCBzaGlwIHdpdGggRVBGIENvbXBvc2VyIGFuZCBtb2RpZnkgaXQgdG8gZml0Ci0gIHlvdXIgc3BlY2lmaWMgbmVlZHMuIFlvdSBjYW4gYWRkIG9yIHJlbW92ZSB3aG9sZSBtZXRob2QgcGx1Zy1pbnMgYXMgd2VsbCBhcwotICBtYWtlIHNlbGVjdGlvbiB3aXRoIGVhY2ggcGx1Zy1pbiBieSBjaGVja2luZyBvciB1bi1jaGVja2luZyBwYWNrYWdlcy4gPC9wPgotPHA+IFlvdSBjYW4gdXNlIHRoZSByZXN1bHRpbmcgY29uZmlndXJhdGlvbiBhcyB5b3VyIHdvcmtpbmcgc2V0IGZvciB5b3VyIEVQRiBDb21wb3NlcgotICB3b3JrLiBUaGUgYWN0dWFsIGNvbnRlbnQgb2YgdGhlIGNvbmZpZ3VyYXRpb24sIGkuZS4gdGhlIGluY2x1ZGVkIG1ldGhvZCBjb250ZW50Ci0gIGFuZCBwcm9jZXNzIGVsZW1lbnRzIGFyZSBhbHdheXMgYWNjZXNzaWJsZSBpbiB0aGUgQ29uZmlndXJhdGlvbiB2aWV3LiBVc2UgdGhlCi0gIGNvbWJvIGJveCBpbiB0aGUgdG9vbGJhciB0byBzZWxlY3QgdGhlIGN1cnJlbnRseSB1c2VkIG1ldGhvZCBjb25maWd1cmF0aW9uLjwvcD4KLTxoMz5QdWJsaXNoaW5nIE92ZXJ2aWV3PC9oMz4KLTxwPk1ldGhvZCBjb25maWd1cmF0aW9ucyBhcmUgdGhlIGJhc2lzIGZvciBwdWJsaXNoaW5nIG1ldGhvZCBjb250ZW50IGFuZCBwcm9jZXNzZXMuCi0gIEEgcHVibGlzaGVkIGNvbmZpZ3VyYXRpb24gaXMgYW4gaHRtbCBXZWIgc2l0ZSB0aGF0IHByZXNlbnRzIGFsbCB0aGUgbWV0aG9kCi0gIGNvbnRlbnQgYW5kIHByb2Nlc3NlcyBvZiB0aGUgbWV0aG9kIGNvbmZpZ3VyYXRpb24gaW4gYSBuYXZpZ2FibGUgYW5kIHNlYXJjaGFibGUKLSAgd2F5LiBJdCB1c2VzIHRoZSByZWxhdGlvbnNoaXBzIGVzdGFibGlzaGVkIGR1cmluZyBtZXRob2QgY29udGVudCBhbmQgcHJvY2VzcwotICBhdXRob3JpbmcgdG8gZ2VuZXJhdGUgaHlwZXJsaW5rcyBiZXR3ZWVuIGVsZW1lbnRzIGFzIHdlbGwgYXMgcHJvdmlkZXMgdHJlZQotICBicm93c2VycyBiYXNlZCBvbiB0aGUgY29uZmlndXJhdGlvbiB2aWV3IGFuZCB1c2VyLWRlZmluZWQgY2F0ZWdvcml6YXRpb25zIG9mCi0gIHRoZSBjb250ZW50LiBUaGUgZmlndXJlIGJlbG93IHNob3dzIGFuIGV4YW1wbGUgb2YgdGhlIHB1Ymxpc2hlZCAnQ2xhc3NpYyBSVVAnCi0gIG1ldGhvZCBjb25maWd1cmF0aW9uLjwvcD4KLTxwPjxpbWcgc3JjPSJwdWIuZ2lmIiB3aWR0aD0iNTUwIj48L3A+Ci08cD5Gb3IgcHVibGlzaGluZyBzaW1wbHkgY3JlYXRlIGFuZCBzZWxlY3QgYSBjb25maWd1cmF0aW9uLiBUaGUgcHVibGljYXRpb24gd2l6YXJkCi0gIHdpbGwgZG8gdGhlIHJlc3QgZm9yIHlvdSBhbmQgb25seSBwdWJsaXNoIGNvbnRlbnQgdGhhdCBpcyBwYXJ0IG9mIHRoZSBtZXRob2QKLSAgY29uZmlndXJhdGlvbi4gSXQgd2lsbCBhbHNvIGF1dG9tYXRpY2FsbHkgYWRvcHQgY29udGVudCB0byB0aGUgY29uZmlndXJhdGlvbgotICBzdWNoIGFzIHJlbW92aW5nCi0gIHJlZmVyZW5jZXMgb2YgbWV0aG9kIGNvbnRlbnQgZWxlbWVudHMgdG8gZWxlbWVudHMgb3V0c2lkZSBvZiB0aGUgY29uZmlndXJhdGlvbgotICBvciByZW1vdmluZyBhY3Rpdml0aWVzIGZyb20geW91ciBwcm9jZXNzZXMgdGhhdCBvbmx5IGNvbnRhaW4gd29yayBkZWZpbmVkIG91dHNpZGUKLSAgb2YgdGhlIGNvbmZpZ3VyYXRpb24gc2V0LiBIZW5jZSwgcHVibGlzaGluZyB3aWxsIG9ubHkgaW5jbHVkZSB0aGUgY29udGVudCB0aGF0Ci0gIHlvdSByZWFsbHkgbmVlZC4gWW91IGNhbiBhbHdheXMgcHJldmlldyBhIHB1Ymxpc2hlZCBjb25maWd1cmF0aW9uIHVzaW5nIEVQRiBDb21wb3NlcidzCi1icm93c2luZyBwZXJzcGVjdGl2ZS48L3A+Ci08cD4mbmJzcDs8L3A+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9jb25maWd1cmF0aW9udmlldy5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvY29uZmlndXJhdGlvbnZpZXcuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzI2MTkyZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9jb25maWd1cmF0aW9udmlldy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJzZWN1cml0eSIgY29udGVudD0icHVibGljIiAvPgotPG1ldGEgbmFtZT0iUm9ib3RzIiBjb250ZW50PSJpbmRleCxmb2xsb3ciIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIG5hbWU9IkRDLlR5cGUiIGNvbnRlbnQ9ImNvbmNlcHQiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iQ29uZmlndXJhdGlvbiBWaWV3IiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJicm93c2luZ3BlcnNwZWN0aXZlLmh0bWwjYnJvd2luZ3BlcnNwZWN0aXZlIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJsaWJyYXJ5dmlldy5odG1sI2xpYnJhcnl2aWV3IiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJ1c2VyaW50ZXJmYWNlb3ZlcnZpZXcuaHRtbCN1c2VyaW50ZXJmYWNlb3ZlcnZpZXciIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9InVzZXJpbnRlcmZhY2VvdmVydmlldy5odG1sIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJicm93c2luZ3BlcnNwZWN0aXZlLmh0bWwiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9ImxpYnJhcnl2aWV3Lmh0bWwiIC8+Ci08bWV0YSBuYW1lPSJEQy5Gb3JtYXQiIGNvbnRlbnQ9IlhIVE1MIiAvPgotPG1ldGEgbmFtZT0iREMuSWRlbnRpZmllciIgY29udGVudD0iY29uZmlndXJhdGlvbnZpZXciIC8+Ci08bWV0YSBuYW1lPSJEQy5MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiIC8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4vaWJtZGl0YS5jc3MiIC8+Ci08dGl0bGU+Q29uZmlndXJhdGlvbiBWaWV3PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJjb25maWd1cmF0aW9udmlldyI+PGEgbmFtZT0iY29uZmlndXJhdGlvbnZpZXciPjwhLS0gLS0+PC9hPgotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5Db25maWd1cmF0aW9uIFZpZXc8L2gxPgotPGRpdj48cD5UaGUgQ29uZmlndXJhdGlvbiB2aWV3IHNob3dzIHRoZSBjb250ZW50IGVsZW1lbnRzIGluIGEgbGlicmFyeSBmaWx0ZXJlZAotYnkgYSBjb25maWd1cmF0aW9uLiA8L3A+Ci08cD5BIGNvbmZpZ3VyYXRpb24gaXMgYSBzdWJzZXQgb2YgdGhlIDxhIGhyZWY9InN0YW5kYXJkbWV0aG9kbGlicmFyeW92ZXJ2aWV3Lmh0bWwjc3RhbmRhcmRtZXRob2RsaWJyYXJ5b3ZlcnZpZXciPm1ldGhvZCBsaWJyYXJ5PC9hPiBjb250ZW50LiBPbmNlIGEgY29uZmlndXJhdGlvbiBpcyBzZWxlY3RlZAotaW4gdGhlIENvbmZpZ3VyYXRpb24gc2VsZWN0aW9uIGJveCwgdGhlIENvbmZpZ3VyYXRpb24gdmlldyBpcyByZWZyZXNoZWQgd2l0aAotdGhlIGNvbnRlbnQgZnJvbSB0aGUgc2VsZWN0ZWQgY29uZmlndXJhdGlvbi4gVGhlIGNvbnRlbnQgaW4gdGhlIENvbmZpZ3VyYXRpb24KLXZpZXcgaXMgYWx3YXlzIHByZXNlbnRlZCBpbiB0aGUgc2FtZSB3YXkgaW4gc3RhbmRhcmQgY2F0ZWdvcmllcywgcHJvY2Vzc2VzLAotY3VzdG9tIGNhdGVnb3JpZXMsIGFuZCBndWlkYW5jZS4gVGhlIENvbmZpZ3VyYXRpb24gdmlldyBkb2VzIG5vdCBzaG93IGFueQotcGh5c2ljYWwgZm9sZGVycy4gRm9sZGVycyBhcmUgb25seSBzaG93biBpbiB0aGUgTGlicmFyeSB2aWV3LjwvcD4KLTxwPjwvcD4KLTwvZGl2PgotPGRpdj4KLTxkaXYgY2xhc3M9ImZhbWlseWxpbmtzIj4KLTxkaXYgY2xhc3M9InBhcmVudGxpbmsiPjxzdHJvbmc+UGFyZW50IHRvcGljOjwvc3Ryb25nPiA8YSBocmVmPSJ1c2VyaW50ZXJmYWNlb3ZlcnZpZXcuaHRtbCIgdGl0bGU9IkVjbGlwc2UgUHJvY2VzcyBGcmFtZXdvcmsgQ29tcG9zZXIgaXMgYnVpbHQgb24gdGhlIEVjbGlwc2UgSW50ZWdyYXRlZCBEZXZlbG9wbWVudCBFbnZpcm9ubWVudCAoSURFKS4gVGhlIHBhcnRzIG9mIHRoZSB3b3Jrc3BhY2UgYXJlOiI+VG9vbCBJbnRlcmZhY2U8L2E+PC9kaXY+Ci08ZGl2IGNsYXNzPSJwcmV2aW91c2xpbmsiPjxzdHJvbmc+UHJldmlvdXMgdG9waWM6PC9zdHJvbmc+IDxhIGhyZWY9ImJyb3dzaW5ncGVyc3BlY3RpdmUuaHRtbCI+QnJvd3NpbmcgUGVyc3BlY3RpdmU8L2E+PC9kaXY+Ci08ZGl2IGNsYXNzPSJuZXh0bGluayI+PHN0cm9uZz5OZXh0IHRvcGljOjwvc3Ryb25nPiA8YSBocmVmPSJsaWJyYXJ5dmlldy5odG1sIj5MaWJyYXJ5IFZpZXc8L2E+PC9kaXY+Ci08L2Rpdj4KLTxkaXYgY2xhc3M9InJlbGNvbmNlcHRzIj48c3Ryb25nPlJlbGF0ZWQgY29uY2VwdHM8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iYnJvd3NpbmdwZXJzcGVjdGl2ZS5odG1sI2Jyb3dpbmdwZXJzcGVjdGl2ZSI+QnJvd3NpbmcgUGVyc3BlY3RpdmU8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9ImxpYnJhcnl2aWV3Lmh0bWwjbGlicmFyeXZpZXciPkxpYnJhcnkgVmlldzwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0idXNlcmludGVyZmFjZW92ZXJ2aWV3Lmh0bWwjdXNlcmludGVyZmFjZW92ZXJ2aWV3IiB0aXRsZT0iRWNsaXBzZSBQcm9jZXNzIEZyYW1ld29yayBDb21wb3NlciBpcyBidWlsdCBvbiB0aGUgRWNsaXBzZSBJbnRlZ3JhdGVkIERldmVsb3BtZW50IEVudmlyb25tZW50IChJREUpLiBUaGUgcGFydHMgb2YgdGhlIHdvcmtzcGFjZSBhcmU6Ij5Ub29sIEludGVyZmFjZTwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9jb250cmlidXRlcy5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvY29udHJpYnV0ZXMuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWM0MWJiNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9jb250cmlidXRlcy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJzZWN1cml0eSIgY29udGVudD0icHVibGljIiAvPgotPG1ldGEgbmFtZT0iUm9ib3RzIiBjb250ZW50PSJpbmRleCxmb2xsb3ciIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIG5hbWU9IkRDLlR5cGUiIGNvbnRlbnQ9ImNvbmNlcHQiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iQ29udHJpYnV0ZXMiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9InZhcmlhYmlsaXR5Lmh0bWwjdmFyaWFiaWxpdHkiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9ImV4dGVuZHMuaHRtbCNleHRlbmRzIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJyZXBsYWNlLmh0bWwjcmVwbGFjZXMiIC8+Ci08bWV0YSBuYW1lPSJEQy5Gb3JtYXQiIGNvbnRlbnQ9IlhIVE1MIiAvPgotPG1ldGEgbmFtZT0iREMuSWRlbnRpZmllciIgY29udGVudD0iY29udHJpYnV0ZXMiIC8+Ci08bWV0YSBuYW1lPSJEQy5MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiIC8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4vaWJtZGl0YS5jc3MiIC8+Ci08dGl0bGU+Q29udHJpYnV0ZXM8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9ImNvbnRyaWJ1dGVzIj48YSBuYW1lPSJjb250cmlidXRlcyI+PCEtLSAtLT48L2E+Ci0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPkNvbnRyaWJ1dGVzPC9oMT4KLTxkaXY+PHA+QSBjb250cmlidXRpbmcgZWxlbWVudCBhZGRzIHRvIHRoZSBiYXNlIGVsZW1lbnQuIENvbnRyaWJ1dGVzIHByb3ZpZGVzIGEKLXdheSBmb3IgZWxlbWVudHMgdG8gY29udHJpYnV0ZSB0aGVpciBwcm9wZXJ0aWVzIGludG8gdGhlaXIgYmFzZSBlbGVtZW50IHdpdGhvdXQKLWRpcmVjdGx5IGNoYW5naW5nIGFueSBvZiBpdHMgZXhpc3RpbmcgcHJvcGVydGllcywgc3VjaCBhcyBpbiBhbiBhZGRpdGl2ZSBmYXNoaW9uLgotVGhlIGVmZmVjdCwgYWZ0ZXIgY29udHJpYnV0aW9uLCBpcyB0aGF0IHRoZSBiYXNlIGVsZW1lbnQgaXMgbG9naWNhbGx5IHJlcGxhY2VkCi13aXRoIGFuIGVsZW1lbnQgdGhhdCBjb21iaW5lcyB0aGUgYXR0cmlidXRlcyBhbmQgYXNzb2NpYXRpb25zIG9mIHRoZSBjb250cmlidXRpbmcKLWVsZW1lbnQgd2l0aCB0aGUgYmFzZSBlbGVtZW50LjwvcD4KLTxwPlVzZSB0aGUgQ29udGVudCBWYXJpYWJpbGl0eSBzZWN0aW9uIG9uIHRoZSBEZXNjcmlwdGlvbiB0YWIgdG8gbWFrZSBhbiBlbGVtZW50Ci1jb250cmlidXRlIHRvIGFub3RoZXIgZWxlbWVudC4gU2VsZWN0IDxzdHJvbmc+Q29udHJpYnV0ZXM8L3N0cm9uZz4gYXMgdGhlIFZhcmlhYmlsaXR5Ci10eXBlIGFuZCB0aGVuIHNlbGVjdCB0aGUgYmFzZSBlbGVtZW50IHRvIHdoaWNoIHRoaXMgZWxlbWVudCB3aWxsIGNvbnRyaWJ1dGUuCi1UaGUgYmFzZSBlbGVtZW50IG11c3QgYmUgdGhlIHNhbWUgdHlwZSBvZiBlbGVtZW50IGFzIHRoZSBjb250cmlidXRpbmcgZWxlbWVudC48L3A+Ci08cD5BbnkgaW5mb3JtYXRpb24geW91IGVudGVyIGluIHRoZSBjb250cmlidXRpbmcgZWxlbWVudCBpcyBhZGRlZCB0byB0aGUgYmFzZQotZWxlbWVudC4gVGV4dCBmaWVsZHMgaW4gdGhlIGNvbnRyaWJ1dGluZyBlbGVtZW50IGFyZSBhZGRlZCBhdCB0aGUgZW5kIG9mIHRoZQotcmVzcGVjdGl2ZSB0ZXh0IGZpZWxkcyBpbiB0aGUgYmFzZSBlbGVtZW50LjwvcD4KLTxwPkNvbnRyaWJ1dGlvbiBvbmx5IGFkZHMgYXR0cmlidXRlcyBhbmQgYXNzb2NpYXRpb25zIHRvIHRoZSBiYXNlLiBJdCBuZXZlcgotb3ZlcnJpZGVzIG9yIHJlcGxhY2VzIGFueSBpbmZvcm1hdGlvbiBmcm9tIHRoZSBiYXNlLiBJbiBvdGhlciB3b3JkcywgaWYgdGhlCi1iYXNlIGlzIGFsbG93ZWQgYW4gYXNzb2NpYXRpb24gdG8gZXhhY3RseSBvbmUgb3RoZXIgZWxlbWVudCBhbmQgaGFzIHRoaXMgb25lCi1hbHJlYWR5IGRlZmluZWQsIGl0IGlzIG5vdCBiZWluZyByZXBsYWNlZCBieSBhIGNvbnRyaWJ1dG9yJ3MgYXNzb2NpYXRpb24uPC9wPgotPGRpdiBjbGFzcz0icCI+PHN0cm9uZz5Db250cmlidXRpb24gcnVsZXM6PC9zdHJvbmc+PHVsPjxsaT5BdHRyaWJ1dGVzIGFyZSBhcHBlbmRlZCBleGNlcHQgZm9yIGlkZW50aWZ5aW5nL25hbWluZyBhdHRyaWJ1dGVzIGFuZCBub24tc3RyaW5nCi1hdHRyaWJ1dGVzIHN1Y2ggYXMgYm9vbGVhbiwgZGF0ZSwgZXRjLjwvbGk+Ci08bGk+T3V0Z29pbmcgdG8tb25lIGFzc29jaWF0aW9ucyBvZiB0aGUgY29udHJpYnV0b3IgYXJlIGlnbm9yZWQgaWYgdGhlIGJhc2UKLWFscmVhZHkgaGFzIHN1Y2ggYW4gYXNzb2NpYXRpb24gb3IgaWYgdGhlIGJhc2UgZWxlbWVudCBoYXMgbW9yZSB0aGFuIG9uZSBjb250cmlidXRpbmcKLWVsZW1lbnQgKGkuZS4gaXQgY2Fubm90IGJlIGRlY2lkZWQgd2hpY2ggY29udHJpYnV0aW9uIHNob3VsZCBiZSBjaG9zZSwgdGhlbgotbm9uZSB3aWxsIGJlIGNob3NlbikuPC9saT4KLTxsaT5PdXRnb2luZyB0by1tYW55IGFzc29jaWF0aW9ucyBhcmUgYWRkZWQgdG8gdGhlIGJhc2UgZWxlbWVudHMgb2YgYSBjb250cmlidXRpb24uPC9saT4KLTxsaT5JbmNvbWluZyBhc3NvY2lhdGlvbnMgdG8gdGhlIGNvbnRyaWJ1dGluZyBlbGVtZW50IHdpdGggYSB0by1vbmUgY29uc3RyYWludAotb24gdGhlIG90aGVyIGFzc29jaWF0aW9uIGVuZCBhcmUgaWdub3JlZCBpZiB0aGUgYmFzZSBhbHJlYWR5IGhhcyBzdWNoIGFuIGluY29taW5nCi1hc3NvY2lhdGlvbiBvciBpZiB0aGVyZSBpcyBtb3JlIHRoYW4gb25lIGNvbnRyaWJ1dGlvbiB0byBjb25zaWRlciBmb3IgdGhlCi1iYXNlIGVsZW1lbnQuPC9saT4KLTxsaT5PdGhlciBpbmNvbWluZyBhc3NvY2lhdGlvbnMgdG8gdGhlIGNvbnRyaWJ1dGluZyBlbGVtZW50IGFyZSBhZGRlZCB0byB0aGUKLWJhc2UgZWxlbWVudHMgb2YgYSBjb250cmlidXRpb24uPC9saT4KLTxsaT5BIGJhc2UgZWxlbWVudCBvZiBhIGNvbnRyaWJ1dGlvbiBjYW4gaGF2ZSBtb3JlIHRoYW4gb25lIGNvbnRyaWJ1dG9yPC9saT4KLTxsaT5Db250cmlidXRpb24gd29ya3MgdHJhbnNpdGl2ZWx5LCBpLmUuIGEgY29udHJpYnV0aW9uIGVsZW1lbnQgY29udHJpYnV0ZXMKLWl0cyBvd24gY29udHJpYnV0b3JzLjwvbGk+Ci08L3VsPgotU2VlIDxhIGhyZWY9InZhcmlhYmlsaXR5YXNzb2NpYXRpb25zLmh0bWwjdmFyaWFiaWxpdHlhc3NvY2lhdGlvbnMiPlZhcmlhYmlsaXR5IEFzc29jaWF0aW9uczwvYT4gdG8gZmluZCB0aGUgYXNzb2NpYXRpb25zIGZvciBlYWNoIGVsZW1lbnQKLXR5cGUuPC9kaXY+Ci08L2Rpdj4KLTxkaXY+PGRpdiBjbGFzcz0icmVsY29uY2VwdHMiPjxzdHJvbmc+UmVsYXRlZCBjb25jZXB0czwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJ2YXJpYWJpbGl0eS5odG1sI3ZhcmlhYmlsaXR5IiB0aXRsZT0iVmFyaWFiaWxpdHkgYWxsb3dzIGVsZW1lbnRzIGluIG9uZSBjb250ZW50IHBhY2thZ2UgdG8gaW5mbHVlbmNlIG9yIG1vZGlmeSBlbGVtZW50cyBpbiBvdGhlciBjb250ZW50IHBhY2thZ2VzIHdpdGhvdXQgYWN0dWFsbHkgZGlyZWN0bHkgbW9kaWZ5aW5nIHRoZSBvcmlnaW5hbCBjb250ZW50LiBWYXJpYWJpbGl0eSBlbmFibGVzIGNoYW5nZXMgdG8gdGhlIGNvbnRlbnQgd2hpbGUga2VlcGluZyB0aGUgY2hhbmdlcyBzZXBhcmF0ZSBhbmQgb3B0aW9uYWwuIj5WYXJpYWJpbGl0eTwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iZXh0ZW5kcy5odG1sI2V4dGVuZHMiPkV4dGVuZHM8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9InJlcGxhY2UuaHRtbCNyZXBsYWNlcyI+UmVwbGFjZXM8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvY29weS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9jb3B5LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmM2ZGZlMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9jb3B5LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2NyZWF0ZWFjb250ZW50cGFja2FnZS5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvY3JlYXRlYWNvbnRlbnRwYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmNThiOGUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvY3JlYXRlYWNvbnRlbnRwYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGh0bWwKLSAgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9InNlY3VyaXR5IiBjb250ZW50PSJwdWJsaWMiIC8+Ci08bWV0YSBuYW1lPSJSb2JvdHMiIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgbmFtZT0iREMuVHlwZSIgY29udGVudD0idGFzayIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJDcmVhdGUgYSBDb250ZW50IFBhY2thZ2UiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9Im1ldGhvZGNvbnRlbnRwYWNrYWdlLmh0bWwjbWV0aG9kY29udGVudHBhY2thZ2UiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9ImNyZWF0ZW1ldGhvZGNvbnRlbnQuaHRtbCNjcmVhdGVtZXRob2Rjb250ZW50IiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJjcmVhdGVhbWV0aG9kcGx1Z2luLmh0bWwjY3JlYXRlYW1ldGhvZHBsdWdpbiIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0ibWV0aG9kY29udGVudHBhY2thZ2UuaHRtbCIgLz4KLTxtZXRhIG5hbWU9IkRDLkZvcm1hdCIgY29udGVudD0iWEhUTUwiIC8+Ci08bWV0YSBuYW1lPSJEQy5JZGVudGlmaWVyIiBjb250ZW50PSJjcmVhdGVjb250ZW50cGFja2FnZSIgLz4KLTxtZXRhIG5hbWU9IkRDLkxhbmd1YWdlIiBjb250ZW50PSJlbi11cyIgLz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi9pYm1kaXRhLmNzcyIgLz4KLTx0aXRsZT5DcmVhdGUgYSBDb250ZW50IFBhY2thZ2U8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9ImNyZWF0ZWNvbnRlbnRwYWNrYWdlIj48YSBuYW1lPSJjcmVhdGVjb250ZW50cGFja2FnZSI+PCEtLSAtLT48L2E+Ci0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPkNyZWF0ZSBhIENvbnRlbnQgUGFja2FnZTwvaDE+Ci08ZGl2PjxkaXYgY2xhc3M9InAiPjxwPk1ldGhvZCBjb250ZW50IGlzIG9yZ2FuaXplZCBpbnRvIGNvbnRlbnQgcGFja2FnZXMgd2hpY2gsIGluIHR1cm4sCi1hcmUgY29udGFpbmVkIGluIG1ldGhvZCBwbHVnLWlucy48L3A+Ci1CZWZvcmUgY3JlYXRpbmcgYSBjb250ZW50IHBhY2thZ2UsIHlvdQotc2hvdWxkIGNyZWF0ZSBhIG1ldGhvZCBwbHVnLWluLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIDxhIGhyZWY9ImNyZWF0ZWFtZXRob2RwbHVnaW4uaHRtbCNjcmVhdGVhbWV0aG9kcGx1Z2luIj5DcmVhdGUgYSBNZXRob2QgUGx1Zy1pbjwvYT4uPC9kaXY+Ci08ZGl2IGNsYXNzPSJzZWN0aW9uIj5Zb3Ugc2hvdWxkIGFsd2F5cyBjcmVhdGUgYSBuZXcgPGEgaHJlZj0ibWV0aG9kY29udGVudHBhY2thZ2UuaHRtbCNtZXRob2Rjb250ZW50cGFja2FnZSI+TWV0aG9kIENvbnRlbnQgUGFja2FnZTwvYT4gYW5kIDxhIGhyZWY9Im1ldGhvZGNvbnRlbnQuaHRtbCNjcmVhdGluZ3JldXNhYmxlbWV0aG9kY29udGVudHMiPk1ldGhvZCBDb250ZW50PC9hPiBpbiBhIDxhIGhyZWY9Im1ldGhvZHBsdWdpbi5odG1sI21ldGhvZHBsdWdpbiI+TWV0aG9kIFBsdWctaW48L2E+IHRoYXQKLXlvdSBwcm9kdWNlLiBUaGlzIHNlcGFyYXRlcyB5b3VyIGNvbnRlbnQgZnJvbSBvcmlnaW5hbCBjb250ZW50IHNoaXBwZWQgd2l0aAotdGhlIHRvb2wgYW5kIGFsbG93cyB5b3UgdG8gdXBkYXRlIHlvdXIgb3duIGxpYnJhcnkgd2l0aCBuZXcgbGlicmFyeSByZWxlYXNlcwotd2l0aG91dCBhZmZlY3RpbmcgdGhlIGNvbnRlbnQgdGhhdCB5b3UgaGF2ZSBjcmVhdGVkIGluIHlvdXIgb3duIHBsdWctaW5zLiA8ZGl2IGNsYXNzPSJub3RlIj48c3BhbiBjbGFzcz0ibm90ZXRpdGxlIj5Ob3RlOjwvc3Bhbj4gWW91Ci1jYW5ub3QgY3JlYXRlIGEgbmV3IGNvbnRlbnQgcGFja2FnZSBvciBhbnkgb3RoZXIgZWxlbWVudCBpbiBhIGxvY2tlZCBwbHVnLWluLjwvZGl2PgotPHA+VG8KLWNyZWF0ZSBhIGNvbnRlbnQgcGFja2FnZTo8L3A+Ci08L2Rpdj4KLTxvbD48bGk+PHNwYW4+RmluZCB5b3VyIG1ldGhvZCBwbHVnLWluIGluIHRoZSA8YSBocmVmPSJsaWJyYXJ5dmlldy5odG1sI2xpYnJhcnl2aWV3Ij5MaWJyYXJ5IFZpZXc8L2E+Ljwvc3Bhbj48L2xpPgotPGxpPjxzcGFuPkRyaWxsIGludG8gdGhlIHBsdWctaW4gdG8gbG9jYXRlIHRoZSBwYWNrYWdlIGNhbGxlZCA8c3Ryb25nPkNvbnRlbnQKLVBhY2thZ2VzPC9zdHJvbmc+LiBUaGlzIHBhY2thZ2UgY29udGFpbnMgYWxsIHBhY2thZ2VzIHRoYXQgYXJlIGFsbG93ZWQgdG8gY29udGFpbgotbWV0aG9kIGVsZW1lbnRzLjwvc3Bhbj48L2xpPgotPGxpPjxzcGFuPlJpZ2h0IGNsaWNrIHRoZSBjb250ZW50IHBhY2thZ2UgYW5kIHRoZW4gc2VsZWN0IDxzdHJvbmc+TmV3ICZndDsgQ29udGVudAotUGFja2FnZTwvc3Ryb25nPi4gVGhlIGNvbnRlbnQgcGFja2FnZSBlZGl0b3IgYXBwZWFycy48L3NwYW4+PC9saT4KLTxsaT48c3Bhbj5VbmRlciBHZW5lcmFsIEluZm9ybWF0aW9uLCBnaXZlIHRoZSBuZXcgY29udGVudCBwYWNrYWdlIGEgdW5pcXVlCi1uYW1lIGFuZCBwcm92aWRlIGEgYnJpZWYgZGVzY3JpcHRpb24uPC9zcGFuPjwvbGk+Ci08bGk+PHNwYW4+U2F2ZSB0aGUgbmV3IGNvbnRlbnQgcGFja2FnZSBpbiBvbmUgb2YgdGhyZWUgd2F5czo8L3NwYW4+PG9sIHR5cGU9ImEiPjxsaT48c3Bhbj5DbGljayB0aGUgZGlzayBpY29uIGluIHRoZSB0b29sYmFyLjwvc3Bhbj48L2xpPgotPGxpPjxzcGFuPlNlbGVjdCA8c3Ryb25nPkZpbGUgJmd0OyBTYXZlPC9zdHJvbmc+Ljwvc3Bhbj48L2xpPgotPGxpPjxzcGFuPlNpbXBseSBjbG9zZSB0aGUgY29udGVudCBlZGl0b3IuPC9zcGFuPjwvbGk+Ci08L29sPgotPC9saT4KLTwvb2w+Ci08ZGl2IGNsYXNzPSJzZWN0aW9uIj48ZGl2IGNsYXNzPSJub3RlIj48c3BhbiBjbGFzcz0ibm90ZXRpdGxlIj5Ob3RlOjwvc3Bhbj4gVGhlIHRvb2wgYXV0b21hdGljYWxseSBjcmVhdGVzIG5vZGVzIGZvciA8YSBocmVmPSJ0YXNrLmh0bWwjdGFzayI+VGFzazwvYT4sIDxhIGhyZWY9InJvbGUuaHRtbCNyb2xlIj5Sb2xlPC9hPiwgPGEgaHJlZj0id29ya3Byb2R1Y3QuaHRtbCN3b3JrcHJvZHVjdCI+V29yayBQcm9kdWN0PC9hPiwgYW5kIDxhIGhyZWY9Imd1aWRhbmNlLmh0bWwjZ3VpZGFuY2UiPkd1aWRhbmNlPC9hPiB1bmRlciB0aGUgbmV3IGNvbnRlbnQgcGFja2FnZS48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci08ZGl2PgotPGRpdiBjbGFzcz0iZmFtaWx5bGlua3MiPgotPGRpdiBjbGFzcz0icGFyZW50bGluayI+PHN0cm9uZz5QYXJlbnQgdG9waWM6PC9zdHJvbmc+IDxhIGhyZWY9Im1ldGhvZGNvbnRlbnRwYWNrYWdlLmh0bWwiPk1ldGhvZCBDb250ZW50IFBhY2thZ2U8L2E+PC9kaXY+Ci08L2Rpdj4KLTxkaXYgY2xhc3M9InJlbGNvbmNlcHRzIj48c3Ryb25nPlJlbGF0ZWQgY29uY2VwdHM8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0ibWV0aG9kY29udGVudHBhY2thZ2UuaHRtbCNtZXRob2Rjb250ZW50cGFja2FnZSI+TWV0aG9kIENvbnRlbnQgUGFja2FnZTwvYT48L2Rpdj4KLTwvZGl2PgotPGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJjcmVhdGVtZXRob2Rjb250ZW50Lmh0bWwjY3JlYXRlbWV0aG9kY29udGVudCI+Q3JlYXRlIE1ldGhvZCBDb250ZW50PC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJjcmVhdGVhbWV0aG9kcGx1Z2luLmh0bWwjY3JlYXRlYW1ldGhvZHBsdWdpbiI+Q3JlYXRlIGEgTWV0aG9kIFBsdWctaW48L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvY3JlYXRlYWRlbGl2ZXJ5cHJvY2Vzcy5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvY3JlYXRlYWRlbGl2ZXJ5cHJvY2Vzcy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlY2RlZjJlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2NyZWF0ZWFkZWxpdmVyeXByb2Nlc3MuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDEwNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGh0bWwKLSAgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9InNlY3VyaXR5IiBjb250ZW50PSJwdWJsaWMiIC8+Ci08bWV0YSBuYW1lPSJSb2JvdHMiIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgbmFtZT0iREMuVHlwZSIgY29udGVudD0idGFzayIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJDcmVhdGUgYSBEZWxpdmVyeSBQcm9jZXNzIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJwcm9jZXNzLmh0bWwjcHJvY2VzcyIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iY2FwYWJpbGl0eXBhdHRlcm4uaHRtbCNjYXBhYmlsaXR5cGF0dGVybiIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iZGVsaXZlcnlwcm9jZXNzLmh0bWwiIC8+Ci08bWV0YSBuYW1lPSJEQy5Gb3JtYXQiIGNvbnRlbnQ9IlhIVE1MIiAvPgotPG1ldGEgbmFtZT0iREMuSWRlbnRpZmllciIgY29udGVudD0iY3JlYXRlYWRlbGl2ZXJ5cHJvY2VzcyIgLz4KLTxtZXRhIG5hbWU9IkRDLkxhbmd1YWdlIiBjb250ZW50PSJlbi11cyIgLz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi9pYm1kaXRhLmNzcyIgLz4KLTx0aXRsZT5DcmVhdGUgYSBEZWxpdmVyeSBQcm9jZXNzPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJjcmVhdGVhZGVsaXZlcnlwcm9jZXNzIj48YSBuYW1lPSJjcmVhdGVhZGVsaXZlcnlwcm9jZXNzIj48IS0tIC0tPjwvYT4KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+Q3JlYXRlIGEgRGVsaXZlcnkgUHJvY2VzczwvaDE+Ci08ZGl2PjxkaXYgY2xhc3M9InAiPjxwPkEgRGVsaXZlcnkgUHJvY2VzcyBkZXNjcmliZXMgYSBjb21wbGV0ZSBhbmQgaW50ZWdyYXRlZCBhcHByb2FjaAotZm9yIHBlcmZvcm1pbmcgYSBzcGVjaWZpYyB0eXBlIG9mIHByb2plY3QuIEEgRGVsaXZlcnkgUHJvY2VzcyBkZXNjcmliZXMgd2hhdAotaXMgcHJvZHVjZWQsIGhvdyBpdCBpcyBwcm9kdWNlZCBhbmQgdGhlIHJlcXVpcmVkIHN0YWZmaW5nIGZvciB0aGUgZW50aXJlIHByb2plY3QKLWxpZmVjeWNsZS48L3A+Ci1BIERlbGl2ZXJ5IFByb2Nlc3MgaXMgY3JlYXRlZCBmb3IgYSBwYXJ0aWN1bGFyIHR5cGUgb2YgcHJvamVjdAotdG8gcmVmbGVjdCB0aGUgc3BlY2lmaWMgcGxhbm5pbmcgYW5kIHByb2plY3QgbWFuYWdlbWVudCBuZWVkcy4gPHA+QmVmb3JlCi1jcmVhdGluZyBhIGRlbGl2ZXJ5IHByb2Nlc3M6PC9wPgotPHVsPjxsaT5TZWxlY3QgYSBtZXRob2QgcGx1Zy1pbiB0byBob2xkIHlvdXIgcHJvY2Vzcy4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSA8YSBocmVmPSJtZXRob2RwbHVnaW4uaHRtbCNtZXRob2RwbHVnaW4iPk1ldGhvZCBQbHVnLWluPC9hPi48L2xpPgotPGxpPkZpbmQgb3IgY3JlYXRlIGEgcHJvY2VzcyBwYWNrYWdlLjwvbGk+Ci08L3VsPgotPC9kaXY+Ci08ZGl2IGNsYXNzPSJzZWN0aW9uIj5UaGVyZSBhcmUgc2V2ZXJhbCB3YXlzIHRvIHBvcHVsYXRlIGEgcHJvY2VzcyB3aXRoIG1ldGhvZCBlbGVtZW50czo8dWw+PGxpPkJ5IGluY29ycG9yYXRpbmcgaW5kaXZpZHVhbCBtZXRob2QgZWxlbWVudHMgYnkgZHJhZ2dpbmcgdGhlIGVsZW1lbnRzIG9udG8KLWFuIGFjdGl2aXR5IGluIHRoZSBwcm9jZXNzLjwvbGk+Ci08bGk+QnkgaW5jbHVkaW5nIGFscmVhZHkgZGVmaW5lZCBjYXBhYmlsaXR5IHBhdHRlcm5zLjwvbGk+Ci08bGk+QnkgaW5jbHVkaW5nIHBhcnRzIG9mIGFscmVhZHkgZGVmaW5lZCBjYXBhYmlsaXR5IHBhdHRlcm5zLjwvbGk+Ci08bGk+QnkgY3JlYXRpbmcgZGVzY3JpcHRvcnMgZGlyZWN0bHkgaW4gdGhlIHByb2Nlc3MsIHdoaWNoIGFyZSBlaXRoZXIgdW5yZWxhdGVkCi10byBhbnkgbWV0aG9kIGNvbnRlbnQgb3IgcmVsYXRlZCB0byBtZXRob2QgY29udGVudCBhdCBhIGxhdGVyIHBvaW50IGluIHRpbWUuPC9saT4KLTwvdWw+Ci1UbyBjcmVhdGUgYSBEZWxpdmVyeSBQcm9jZXNzOjwvZGl2PgotPG9sPjxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+T25jZSB5b3UgaGF2ZSBzZWxlY3RlZCBvciBjcmVhdGVkIGEgcHJvY2VzcyBwYWNrYWdlLCByaWdodCBjbGljawotdGhlIHByb2Nlc3MgcGFja2FnZS48L3NwYW4+PC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+Q2xpY2sgPHN0cm9uZz5OZXcgJmd0OyBEZWxpdmVyeSBQcm9jZXNzPC9zdHJvbmc+LiBUaGUgTmV3IFByb2Nlc3MgQ29tcG9uZW50Ci1kaWFsb2cgYXBwZWFycy48L3NwYW4+PC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+VHlwZSBhIG5hbWUgZm9yIHRoZSBkZWxpdmVyeSBwcm9jZXNzIGludG8gdGhlIDxzdHJvbmc+TmFtZTwvc3Ryb25nPiBmaWVsZAotYW5kIHRoZW4gc2VsZWN0IGEgZGVmYXVsdCBjb25maWd1cmF0aW9uIGZyb20gdGhlIGRyb3AgZG93biBsaXN0LiBZb3VyIHByb2Nlc3MKLWNhbiBjb250YWluIGNvbnRlbnQgZnJvbSBtYW55IGRpZmZlcmVudCBtZXRob2QgcGx1Zy1pbnMuIGZvciB0aGlzIHJlYXNvbiB5b3UKLW5lZWQgdG8gZGVmaW5lIGEgY29uZmlndXJhdGlvbiB0aGF0IGRlZmluZXMgdGhlIHZpc2libGUgc2V0IG9mIGVsZW1lbnRzIGFuZAotcmVsYXRpb25zaGlwcyB3aGVuIHRoZSBwcm9jZXNzIGlzIGF1dGhvcmVkLiBUaGlzIHByb2Nlc3MgYXV0aG9yaW5nIGNvbmZpZ3VyYXRpb24KLWlzIHJlZmVycmVkIHRvIGFzIHRoZSBEZWZhdWx0IENvbmZpZ3VyYXRpb24gZm9yIHRoZSBwcm9jZXNzIGFuZCBzaG91bGQgZGVmaW5lCi10aGUgbGFyZ2VzdCByZWFzb25hYmxlIHNldCBvZiBtZXRob2QgcGx1Zy1pbnMsIGNvbnRlbnQgcGFja2FnZXMsIGFuZCBvdGhlcgotcHJvY2Vzc2VzIGZyb20gdGhlIG1ldGhvZCBsaWJyYXJ5IHRoYXQgd2lsbCBiZSByZWZlcnJlZCB0byBieSB0aGUgcHJvY2VzcwotYXQgc29tZSBwb2ludC48L3NwYW4+PC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+Q2xpY2sgPHN0cm9uZz5PSzwvc3Ryb25nPi4gVGhlIHByb2Nlc3MgaXMgY3JlYXRlZCBhbmQgdGhlIHByb2Nlc3MgZWRpdG9yCi1pcyBvcGVuZWQuPC9zcGFuPiA8ZGl2IGNsYXNzPSJub3RlIj48c3BhbiBjbGFzcz0ibm90ZXRpdGxlIj5Ob3RlOjwvc3Bhbj4gSWYgdGhlIFByb3BlcnRpZXMgd2luZG93IG9wZW5zIHRvIHRoZSByaWdodCBvZgotdGhlIHByb2Nlc3MgZWRpdG9yLCBjbGljayB0aGUgPHN0cm9uZz54PC9zdHJvbmc+IHRvIGNsb3NlIGl0LjwvZGl2PgotPC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+SW4gdGhlIHByb2Nlc3MgZWRpdG9yLCB1bmRlciB0aGUgRGVzY3JpcHRpb24gdGFiLCBkb2N1bWVudCB5b3VyCi1wcm9jZXNzIHVzaW5nIHRoZSBhdmFpbGFibGUgdGV4dCBmaWVsZHMuPC9zcGFuPiA8ZGl2IGNsYXNzPSJub3RlIj48c3BhbiBjbGFzcz0ibm90ZXRpdGxlIj5Ob3RlOjwvc3Bhbj4gWW91IGNhbiB1c2UgdGhlCi1SaWNoIFRleHQgRWRpdG9yIHRvIGVkaXQgb3IgZW50ZXIgdGhlIHRleHQgZm9yIGFueSBmaWVsZCB0aGF0IGhhcyBhIHR3aXN0eQotc3ltYm9sIDxpbWcgc3JjPSJjb2xsYXBzZWQuZ2lmIiBhbHQ9IiIgLz4uIFNpbXBseSBjbGljayB0aGUgc3ltYm9sCi10byBhY2Nlc3MgdGhlIFJpY2ggVGV4dCBFZGl0b3IuIENsaWNrIHRoZSBzeW1ib2wgYWdhaW4gdG8gY2xvc2UgdGhlIFJpY2ggVGV4dAotRWRpdG9yLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBzZWUgPGEgaHJlZj0icmljaHRleHRlZGl0b3IuaHRtbCNyaWNodGV4dGVkaXRvciI+UmljaCBUZXh0IEVkaXRvcjwvYT48L2Rpdj4KLTwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkRlY2lkZSBvbiB5b3VyIHByaW1hcnkgcHJvY2VzcyBhdXRob3Jpbmcgdmlldy4gWW91IGRldmVsb3AgYSBwcm9jZXNzCi11c2luZyB0aHJlZSBkaWZmZXJlbnQgdmlld3M6PC9zcGFuPjx1bD48bGk+PHN0cm9uZz5Xb3JrIEJyZWFrZG93biBTdHJ1Y3R1cmU8L3N0cm9uZz46IERlZmluZSBhIHdvcmsgYnJlYWtkb3duIHN0cnVjdHVyZQotaW4geW91ciBwcm9jZXNzLiBDcmVhdGUgaXRlcmF0aW9ucyBhbmQgYWN0aXZpdGllcyBmaXJzdCwgYW5kIHRoZW4gcG9wdWxhdGUKLXlvdXIgYWN0aXZpdGllcyBieSBhcHBseWluZyB0YXNrcyBmcm9tIHlvdXIgTWV0aG9kIENvbnRlbnQuIEZvciBtb3JlIGluZm9ybWF0aW9uCi1zZWUgPGEgaHJlZj0iZGV2ZWxvcGF3b3JrYnJlYWtkb3duc3RydWN0dXJlLmh0bWwiPkRldmVsb3AgYSBXb3JrIEJyZWFrZG93biBTdHJ1Y3R1cmU8L2E+LjwvbGk+Ci08bGk+PHN0cm9uZz5UZWFtIEFsbG9jYXRpb248L3N0cm9uZz46IERlZmluZSB3aGljaCB0ZWFtcyBhbmQgcm9sZXMgc2hhbGwgcGFydGljaXBhdGUKLWluIGFjdGl2aXRpZXMgYW5kIHRoZW4gZmluZCByZXNwb25zaWJsZSB3b3JrIHByb2R1Y3RzIGFuZCB0YXNrcyBmcm9tIHRoZXJlLgotRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSA8YSBocmVmPSJkZXZlbG9wYXRlYW1hbGxvY2F0aW9uc3RydWN0dXJlLmh0bWwjZGV2ZWxvcGF0ZWFtYWxsb2NhdGlvbnN0cnVjdHVyZSI+RGV2ZWxvcCBhIFRlYW0gQWxsb2NhdGlvbiBTdHJ1Y3R1cmU8L2E+LjwvbGk+Ci08bGk+PHN0cm9uZz5Xb3JrIFByb2R1Y3QgVXNhZ2U8L3N0cm9uZz46IERlZmluZSB3aGljaCB3b3JrIHByb2R1Y3RzIHNob3VsZCBiZSBjcmVhdGVkCi1pbiBhY3Rpdml0aWVzIGFuZCBmaW5kIHRhc2tzIGFuZCByb2xlcyBmcm9tIHRoZXJlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBzZWUgPGEgaHJlZj0iZGV2ZWxvcGF3b3JrcHJvZHVjdHVzYWdlc3RydWN0dXJlLmh0bWwjZGV2ZWxvcGF3b3JrcHJvZHVjdHVzYWdlc3RydWN0dXJlIj5EZXZlbG9wIGEgV29yayBQcm9kdWN0IFVzYWdlIFN0cnVjdHVyZTwvYT4uPC9saT4KLTwvdWw+Ci08L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj48YSBocmVmPSJhcHBseWFjYXBhYmlsaXR5cGF0dGVybi5odG1sI2FwcGx5YWNhcGFiaWxpdHlwYXR0ZXJuIj5BcHBseSBhIENhcGFiaWxpdHkgUGF0dGVybjwvYT4gb3IgY2FwYWJpbGl0eSBwYXR0ZXJuIHBhcnRzIHRvIHRoZSBkZWxpdmVyeSBwcm9jZXNzLjwvc3Bhbj48L2xpPgotPC9vbD4KLTwvZGl2PgotPGRpdj4KLTx1bCBjbGFzcz0idWxsaW5rcyI+Ci08bGkgY2xhc3M9InVsY2hpbGRsaW5rIj48c3Ryb25nPjxhIGhyZWY9ImRlbGl2ZXJ5cHJvY2Vzcy5odG1sIj5EZWxpdmVyeSBQcm9jZXNzPC9hPjwvc3Ryb25nPjxiciAvPgotPC9saT4KLTwvdWw+Ci08ZGl2IGNsYXNzPSJyZWxjb25jZXB0cyI+PHN0cm9uZz5SZWxhdGVkIGNvbmNlcHRzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9InByb2Nlc3MuaHRtbCNwcm9jZXNzIj5Qcm9jZXNzPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJjYXBhYmlsaXR5cGF0dGVybi5odG1sI2NhcGFiaWxpdHlwYXR0ZXJuIj5DYXBhYmlsaXR5IFBhdHRlcm48L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvY3JlYXRlYW1ldGhvZGNvbmZpZ3VyYXRpb24uaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2NyZWF0ZWFtZXRob2Rjb25maWd1cmF0aW9uLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyYmE0NjUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvY3JlYXRlYW1ldGhvZGNvbmZpZ3VyYXRpb24uaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDE0NCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGh0bWwKLSAgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9InNlY3VyaXR5IiBjb250ZW50PSJwdWJsaWMiIC8+Ci08bWV0YSBuYW1lPSJSb2JvdHMiIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgbmFtZT0iREMuVHlwZSIgY29udGVudD0idGFzayIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJDcmVhdGUgYSBNZXRob2QgQ29uZmlndXJhdGlvbiIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0ibWV0aG9kY29uZmlndXJhdGlvbnMuaHRtbCNtZXRob2Rjb25maWd1cmF0aW9ucyIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0ibWV0aG9kcGx1Z2luLmh0bWwiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9Im1ldGhvZGNvbnRlbnRwYWNrYWdlLmh0bWwjbWV0aG9kY29udGVudHBhY2thZ2UiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9ImNyZWF0ZWFtZXRob2RwbHVnaW4uaHRtbCIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0ibWV0aG9kY29uZmlndXJhdGlvbnMuaHRtbCIgLz4KLTxtZXRhIG5hbWU9IkRDLkZvcm1hdCIgY29udGVudD0iWEhUTUwiIC8+Ci08bWV0YSBuYW1lPSJEQy5JZGVudGlmaWVyIiBjb250ZW50PSJjcmVhdGVhbWV0aG9kY29uZmlndXJhdGlvbiIgLz4KLTxtZXRhIG5hbWU9IkRDLkxhbmd1YWdlIiBjb250ZW50PSJlbi11cyIgLz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi9pYm1kaXRhLmNzcyIgLz4KLTx0aXRsZT5DcmVhdGUgYSBNZXRob2QgQ29uZmlndXJhdGlvbjwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0iY3JlYXRlYW1ldGhvZGNvbmZpZ3VyYXRpb24iPjxhIG5hbWU9ImNyZWF0ZWFtZXRob2Rjb25maWd1cmF0aW9uIj48IS0tIC0tPjwvYT4KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+Q3JlYXRlIGEgTWV0aG9kIENvbmZpZ3VyYXRpb248L2gxPgotPGRpdj48ZGl2IGNsYXNzPSJwIj48cD5BIG1ldGhvZCBjb25maWd1cmF0aW9uIGFsbG93cyB5b3UgdG8gc2VsZWN0IGFuZCBkZXNlbGVjdCBmcm9tIHRoZQotY29udGVudCBwYWNrYWdlcyBhbmQgcHJvY2VzcyBhdmFpbGFibGUgaW4gdGhlIG1ldGhvZCBsaWJyYXJ5J3Mgc2V0IG9mIHBsdWctaW5zLgotVGhlIHNlbGVjdGlvbnMgeW91IG1ha2UgaGVscCB5b3UgbmFycm93IGRvd24gdGhlIGNvbnRlbnQgeW91IGFyZSByZWFsbHkgaW50ZXJlc3RlZAotaW4gd29ya2luZyB3aXRoLCBhcyB3ZWxsIGFzIGRldGVybWluZSB0aGUgY29udGVudCBvZiB0aGUgV2ViIHNpdGUgeW91IHVsdGltYXRlbHkKLXB1Ymxpc2ggdG8gZGVwbG95IHlvdXIgcHJvY2Vzcy4gQSBjb25maWd1cmF0aW9uIGlzIGdpdmVuIGEgbmFtZSBhbmQgdGhlbiBzYXZlZAotc28gaXQgY2FuIGJlIGNoYW5nZWQgYW5kIHRoZW4gcmUtcHVibGlzaGVkIGF0IGEgbGF0ZXIgZGF0ZS48L3A+Ci1CZWZvcmUgY3JlYXRpbmcKLWEgbWV0aG9kIGNvbmZpZ3VyYXRpb24sIGFzc2VzcyB5b3VyIG5lZWRzIGFuZCBnb2FscyBmb3IgdGhlIGNvbmZpZ3VyYXRpb24uPC9kaXY+Ci08ZGl2IGNsYXNzPSJzZWN0aW9uIj5UaGVyZSBhcmUgdHdvIHdheXMgdG8gY3JlYXRlIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb246PGEgbmFtZT0iY3JlYXRlYW1ldGhvZGNvbmZpZ3VyYXRpb25fX2NyZWF0ZSI+PCEtLSAtLT48L2E+PHVsIGlkPSJjcmVhdGVhbWV0aG9kY29uZmlndXJhdGlvbl9fY3JlYXRlIj48bGk+Q3JlYXRlIGEgbmV3IG1ldGhvZCBjb25maWd1cmF0aW9uIGZyb20gc2NyYXRjaC48L2xpPgotPGxpPkNyZWF0ZSBhIG1ldGhvZCBjb25maWd1cmF0aW9uIGJ5IGNvcHlpbmcgYW4gZXhpc3RpbmcgY29uZmlndXJhdGlvbi48L2xpPgotPC91bD4KLTxzdHJvbmc+VG8gY3JlYXRlIGEgbmV3IG1ldGhvZCBjb25maWd1cmF0aW9uIGZyb20gc2NyYXRjaDo8L3N0cm9uZz48L2Rpdj4KLTxvbD48bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPk1ha2Ugc3VyZSB5b3UgYXJlIHdvcmtpbmcgaW4gdGhlIDxhIGhyZWY9ImF1dGhvcmluZ3BlcnNwZWN0aXZlLmh0bWwjYXV0aG9yaW5ncGVyc3BlY3RpdmUiPkF1dGhvcmluZyBQZXJzcGVjdGl2ZTwvYT4uPC9zcGFuPjwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkluIHRoZSBMaWJyYXJ5IHZpZXcsIHJpZ2h0IGNsaWNrIHRoZSA8c3Ryb25nPkNvbmZpZ3VyYXRpb25zPC9zdHJvbmc+IGZvbGRlcgotYW5kIHRoZW4gc2VsZWN0IDxzdHJvbmc+TmV3ICZndDsgTWV0aG9kIENvbmZpZ3VyYXRpb248L3N0cm9uZz4uIFlvdXIgbmV3IGNvbmZpZ3VyYXRpb24KLWlzIGNyZWF0ZWQgYW5kIHRoZSBjb25maWd1cmF0aW9uIGVkaXRvciBpcyBvcGVuZWQuPC9zcGFuPjwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkluIHRoZSBjb25maWd1cmF0aW9uIGVkaXRvciB3aW5kb3csIHR5cGUgYSBuYW1lIGZvciB5b3VyIGNvbmZpZ3VyYXRpb24KLWluIHRoZSA8c3Ryb25nPk5hbWU8L3N0cm9uZz4gZmllbGQuIElmIHlvdSBjbGljayBhbnl3aGVyZSBpbiB0aGUgPGEgaHJlZj0ibGlicmFyeXZpZXcuaHRtbCNsaWJyYXJ5dmlldyI+TGlicmFyeSBWaWV3PC9hPiBvciA8YSBocmVmPSJjb25maWd1cmF0aW9udmlldy5odG1sIj5Db25maWd1cmF0aW9uIFZpZXc8L2E+LCB5b3UKLXdpbGwgYmUgYWJsZSB0byBzZWUgeW91ciBuZXcgY29uZmlndXJhdGlvbiBuYW1lIGluIHRoZSBDb25maWd1cmF0aW9ucyBmb2xkZXIKLWluIHRoZSBMaWJyYXJ5IHZpZXcgdHJlZS48L3NwYW4+PC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+VHlwZSBhIGRlc2NyaXB0aW9uIGZvciB5b3VyIGNvbmZpZ3VyYXRpb24gaW4gdGhlIERlc2NyaXB0aW9uIGZpZWxkLAotYW5kIHRoZW4gc2VsZWN0IDxzdHJvbmc+RmlsZSAmZ3Q7IFNhdmUgQWxsPC9zdHJvbmc+IHRvIHNhdmUgeW91ciBuZXcgbWV0aG9kIGNvbmZpZ3VyYXRpb24uPC9zcGFuPjwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkF0IHRoZSBib3R0b20gb2YgdGhlIGVkaXRvciB3aW5kb3csIGNsaWNrIHRoZSA8c3Ryb25nPlBsdWctaW4gYW5kIFBhY2thZ2UKLVNlbGVjdGlvbjwvc3Ryb25nPiB0YWIuIDwvc3Bhbj48L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5UaGUgbWV0aG9kIGNvbmZpZ3VyYXRpb24gc2VsZWN0aW9uIHNlY3Rpb24gZGlzcGxheXMgYSBsaXN0IG9mIGFsbAotbWV0aG9kIHBsdWctaW5zIHRoZWlyIGNvbnRlbnQgcGFja2FnZXMgYW5kIHByb2Nlc3Nlcy4gVXNlIHRoZSBjaGVjayBib3hlcwotdG8gYWRkIG9yIHJlbW92ZSBwbHVnLWlucywgcGFja2FnZXMsIGFuZCBwcm9jZXNzZXMgdG8gb3IgZnJvbSB5b3VyIGNvbmZpZ3VyYXRpb24uCi1FeHBhbmQgZWFjaCBwbHVnLWluIHRvIHNlbGVjdCBhbmQgZGVzZWxlY3QgaW5kaXZpZHVhbCBwYWNrYWdlcyBhbmQgcHJvY2Vzc2VzLjwvc3Bhbj4gPHA+QXMgeW91IG1ha2UgeW91ciBzZWxlY3Rpb25zLCB3YXJuaW5nIHNpZ25zIG1heSBhcHBlYXIgYWdhaW5zdAotc29tZSBvZiB0aGUgcGx1Zy1pbiBhbmQgcGFja2FnZSBuYW1lcywgYW5kIHRoZSBDb25maWd1cmF0aW9uIFdhcm5pbmcgTG9nIHZpZXcKLW1heSBiZSBkaXNwbGF5ZWQuIFRoZXNlIHdhcm5pbmdzIGFyZSBpbnRlbmRlZCB0byBoZWxwIGVuc3VyZSB0aGF0IHlvdSBjcmVhdGUKLWEgY29uZmlndXJhdGlvbiB0aGF0ICJtYWtlcyBzZW5zZSIuPC9wPgotPHA+SWYgeW91IHJlZmVyZW5jZSBhbiBlbGVtZW50IGluIGEKLXBhY2thZ2UgdGhhdCBpcyBmcm9tIGFub3RoZXIgcGFja2FnZSwgeW91IGNhbiBvbmx5IHNlZSB0aGUgZnVsbCBkZXRhaWxzIGZvcgotdGhhdCBlbGVtZW50IGluIGEgcHVibGlzaGVkIFdlYiBzaXRlIGlmIHRoZSBwYWNrYWdlIGNvbnRhaW5pbmcgdGhlIGVsZW1lbnQKLWlzIGluIHRoZSBjb25maWd1cmF0aW9uLiBJZiB0aGUgcGFja2FnZSBjb250YWluaW5nIHRoZSBlbGVtZW50IGlzIG5vdCBpbiB0aGUKLWNvbmZpZ3VyYXRpb24sIHRoZSAib2ZmZW5kaW5nIiBwYWNrYWdlIGlzIG1hcmtlZCB3aXRoIGEgd2FybmluZyBzaWduLiBZb3UKLW1heSBjaG9vc2Ugbm90IHRvIGluY2x1ZGUgdGhlIGZ1bGwgZGV0YWlscyBvZiBhIHJlZmVyZW5jZWQgZWxlbWVudC4gQ2xpY2sKLXRoZSA8c3Ryb25nPkFkZCBNaXNzaW5nIFJlZmVyZW5jZXM8L3N0cm9uZz4gYnV0dG9uIHRvIGF1dG9tYXRpY2FsbHkgYW5kIHJlY3Vyc2l2ZWx5Ci1hZGQgcGFja2FnZXMgY29udGFpbmluZyBhbnkgZWxlbWVudHMgdGhhdCBhcmUgcmVmZXJlbmNlZCBpbiBhbHJlYWR5IHNlbGVjdGVkCi1wYWNrYWdlcy4gU2luY2UgdGhpcyBpcyByZWN1cnNpdmUsIGEgbGFyZ2UgbnVtYmVyIG9mIHBhY2thZ2VzIG1heSBiZSBhZGRlZCwKLXBlcmhhcHMgbWFraW5nIHlvdXIgY29uZmlndXJhdGlvbiBsYXJnZXIgdGhhbiB5b3Ugd2FudCBpdCB0byBiZS48L3A+Ci08cD5JZgoteW91IGhhdmUgZWxlbWVudHMgaW4gYSBwYWNrYWdlIHRoYXQgY29udHJpYnV0ZSB0bywgZXh0ZW5kLCBvciByZXBsYWNlIGVsZW1lbnRzCi1pbiBhbm90aGVyIHBhY2thZ2UsIGl0IGlzIGFuIGVycm9yIGlmIHRoZSBiYXNlIHBhY2thZ2UgaXMgbm90IGluY2x1ZGVkIGluCi10aGUgY29uZmlndXJhdGlvbi4gRXJyb3JzIGFyZSBtYXJrZWQgd2l0aCBhIHJlZCBjcm9zcy4gSWYgeW91IGRyaWxsIGRvd24gaW50bwotYSBwbHVnLWluIG9yIHBhY2thZ2UgbWFya2VkIHdpdGggYSBjcm9zcyB5b3Ugd2lsbCBkaXNjb3ZlciB0aGUgIm9mZmVuZGluZyIKLXBhY2thZ2UgYW5kIHRoZW4geW91IGNhbiBmaW5kIHRoZSBwYWNrYWdlcyB5b3UgbmVlZCB0byBpbmNsdWRlIHRvIHJlc29sdmUKLXRoZSBlcnJvci4gQWx0ZXJuYXRpdmVseSB5b3UgY2FuIGNsaWNrIHRoZSA8c3Ryb25nPk1ha2UgY2xvc3VyZSBieSBmaXhpbmcgZXJyb3JzPC9zdHJvbmc+IGJ1dHRvbgotdG8gYXV0b21hdGljYWxseSBmaXggdGhlIGVycm9ycyBieSBhZGRpbmcgdGhlIG1pc3NpbmcgYmFzZSBwYWNrYWdlcy48L3A+Ci08cD5UaGUKLUNvbmZpZ3VyYXRpb24gV2FybmluZyBMb2cgbGlzdHMgYW5kIGV4cGxhaW5zIGFsbCBlcnJvcnMgYW5kIHdhcm5pbmdzIGluIHRoZQotY29uZmlndXJhdGlvbi48L3A+Ci08L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5TZWxlY3QgPHN0cm9uZz5GaWxlICZndDsgU2F2ZSBBbGw8L3N0cm9uZz48L3NwYW4+PC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+RGVmaW5lIHRoZSB2aWV3cyBmb3IgdGhlIG1ldGhvZCBjb25maWd1cmF0aW9uLiBBIHZpZXcgaXMgYSBuYXZpZ2F0aW9uCi10cmVlIGJyb3dzZXIgaW4gYSBwdWJsaXNoZWQgY29uZmlndXJhdGlvbi4gRXZlcnkgcHVibGlzaGVkIGNvbmZpZ3VyYXRpb24gY2FuCi1oYXZlIHNldmVyYWwgdmlld3MgdGhhdCBhcmUgZGlzcGxheWVkIGFzIHN0YWNrZWQgdHJlZSBicm93c2VyIHRhYnMuIFRoZSBzdHJ1Y3R1cmUKLW9mIHRoZSB2aWV3IGlzIGRlZmluZWQgYXMgYSBDdXN0b20gQ2F0ZWdvcnkuPC9zcGFuPjxvbCB0eXBlPSJhIj48bGk+PHNwYW4+SW4gdGhlIENvbmZpZ3VyYXRpb24gRWRpdG9yLCBjbGljayB0aGUgPHN0cm9uZz5WaWV3czwvc3Ryb25nPiB0YWIuPC9zcGFuPjwvbGk+Ci08bGk+PHNwYW4+Q2xpY2sgdGhlIDxzdHJvbmc+QWRkIFZpZXc8L3N0cm9uZz4gYnV0dG9uLiBUaGUgU2VsZWN0IENhdGVnb3JpZXMgZGlhbG9nCi1hcHBlYXJzLjwvc3Bhbj48L2xpPgotPGxpPjxzcGFuPklmIG5lZWRlZCwgY2xpY2sgdGhlICgrKSBzaWduIHRvIGV4cGFuZCB0aGUgQ3VzdG9tIENhdGVnb3JpZXMKLWZvbGRlciBhbmQgdGhlbiBzZWxlY3QgdGhlIGNhdGVnb3J5IHlvdSB3YW50IHRvIHVzZSBhcyB5b3VyIHZpZXcuIENsaWNrIHRoZQotKCspIHNpZ24gdG8gZXhwYW5kIHlvdXIgY2hvc2VuIGNhdGVnb3J5IGFuZCB2aWV3IGl0J3MgY29udGVudHMuIFByZXNzIGFuZAotaG9sZCB0aGUgQ1RSTCBrZXkgdG8gc2VsZWN0IG11bHRpcGxlIHZpZXdzLjwvc3Bhbj48L2xpPgotPGxpPjxzcGFuPkNsaWNrIDxzdHJvbmc+T0s8L3N0cm9uZz4uIFRoZSBkaWFsb2cgd2luZG93IGRpc2FwcGVhcnMgYW5kIHRoZSB2aWV3cwoteW91IHNlbGVjdGVkIGFyZSBhZGRlZCB0byB0aGUgQ29uZmlndXJhdGlvbi48L3NwYW4+PC9saT4KLTwvb2w+Ci08L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5TZWxlY3QgdGhlIHZpZXcgeW91IHdhbnQgdG8gZGlzcGxheSBhcyB5b3VyIGNvbmZpZ3VyYXRpb24ncyBzdGFydC11cAotdmlldyBhbmQgdGhlbiBjbGljayB0aGUgPHN0cm9uZz5NYWtlIERlZmF1bHQ8L3N0cm9uZz4gYnV0dG9uLiBUaGUgc3RhcnQtdXAgdmlldyBpcyB0aGUKLWZpcnN0IHZpZXcgc2hvd24gd2hlbiBhIHB1Ymxpc2hlZCBjb25maWd1cmF0aW9uIGlzIGRpc3BsYXllZCBmb3IgdGhlIGZpcnN0Ci10aW1lLjwvc3Bhbj48L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5DbGljayA8c3Ryb25nPkZpbGUgJmd0OyBTYXZlIGFsbDwvc3Ryb25nPiB0byBzYXZlIHlvdXIgY29uZmlndXJhdGlvbi48L3NwYW4+PC9saT4KLTwvb2w+Ci08ZGl2IGNsYXNzPSJzZWN0aW9uIj48c3Ryb25nPlRvIGNyZWF0ZSBhIG1ldGhvZCBjb25maWd1cmF0aW9uIGJ5IGNvcHlpbmcgYW4gZXhpc3RpbmcgY29uZmlndXJhdGlvbjwvc3Ryb25nPjo8b2w+PGxpPk1ha2Ugc3VyZSB5b3UgYXJlIHdvcmtpbmcgaW4gdGhlIDxhIGhyZWY9ImF1dGhvcmluZ3BlcnNwZWN0aXZlLmh0bWwjYXV0aG9yaW5ncGVyc3BlY3RpdmUiPkF1dGhvcmluZyBQZXJzcGVjdGl2ZTwvYT4uPHA+PC9wPgotPC9saT4KLTxsaT5JbiB0aGUgPGEgaHJlZj0ibGlicmFyeXZpZXcuaHRtbCNsaWJyYXJ5dmlldyI+TGlicmFyeSBWaWV3PC9hPiwKLWV4cGFuZCB0aGUgQ29uZmlndXJhdGlvbnMgZm9sZGVyLjxwPjwvcD4KLTwvbGk+Ci08bGk+IFJpZ2h0IGNsaWNrIHRoZSBtZXRob2QgY29uZmlndXJhdGlvbiB5b3Ugd2FudCB0byBjb3B5IGFuZCB0aGVuIGNsaWNrIDxzdHJvbmc+Q29weTwvc3Ryb25nPi48cD48L3A+Ci08L2xpPgotPGxpPlJpZ2h0IGNsaWNrIHRoZSA8c3Ryb25nPkNvbmZpZ3VyYXRpb25zPC9zdHJvbmc+IGZvbGRlciBhbmQgdGhlbiBjbGljayA8c3Ryb25nPlBhc3RlPC9zdHJvbmc+LgotVHlwZSBhIG5hbWUgZm9yIHRoZSBuZXcgY29uZmlndXJhdGlvbiBpbiB0aGUgcG9wLXVwIHdpbmRvdy4gVGhlIGNvcGllZCBtZXRob2QKLWNvbmZpZ3VyYXRpb24gaXMgcGFzdGVkIGludG8gdGhlIENvbmZpZ3VyYXRpb25zIGZvbGRlci48cD48L3A+Ci08L2xpPgotPGxpPkRvdWJsZSBjbGljayB0aGUgbmV3bHkgcGFzdGVkIG1ldGhvZCBjb25maWd1cmF0aW9uIHRvIG9wZW4gaXRzIGNvbmZpZ3VyYXRpb24KLWVkaXRvci48cD48L3A+Ci08L2xpPgotPGxpPkZvbGxvdyBzdGVwcyAzIHRocm91Z2ggMTAgaW4gPHN0cm9uZz5UbyBDcmVhdGUgYSBOZXcgTWV0aG9kIENvbmZpZ3VyYXRpb24gZnJvbQotU2NyYXRjaDwvc3Ryb25nPiBhYm92ZSB0byBjb250aW51ZS48L2xpPgotPC9vbD4KLTwvZGl2PgotPC9kaXY+Ci08ZGl2PgotPGRpdiBjbGFzcz0iZmFtaWx5bGlua3MiPgotPGRpdiBjbGFzcz0icGFyZW50bGluayI+PHN0cm9uZz5QYXJlbnQgdG9waWM6PC9zdHJvbmc+IDxhIGhyZWY9Im1ldGhvZGNvbmZpZ3VyYXRpb25zLmh0bWwiPk1ldGhvZCBDb25maWd1cmF0aW9uPC9hPjwvZGl2PgotPC9kaXY+Ci08ZGl2IGNsYXNzPSJyZWxjb25jZXB0cyI+PHN0cm9uZz5SZWxhdGVkIGNvbmNlcHRzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Im1ldGhvZGNvbmZpZ3VyYXRpb25zLmh0bWwjbWV0aG9kY29uZmlndXJhdGlvbnMiPk1ldGhvZCBDb25maWd1cmF0aW9uPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJtZXRob2RwbHVnaW4uaHRtbCI+TWV0aG9kIFBsdWctaW48L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Im1ldGhvZGNvbnRlbnRwYWNrYWdlLmh0bWwjbWV0aG9kY29udGVudHBhY2thZ2UiPk1ldGhvZCBDb250ZW50IFBhY2thZ2U8L2E+PC9kaXY+Ci08L2Rpdj4KLTxkaXYgY2xhc3M9InJlbHRhc2tzIj48c3Ryb25nPlJlbGF0ZWQgdGFza3M8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iY3JlYXRlYW1ldGhvZHBsdWdpbi5odG1sIj5DcmVhdGUgYSBNZXRob2QgUGx1Zy1pbjwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9jcmVhdGVhbWV0aG9kcGx1Z2luLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9jcmVhdGVhbWV0aG9kcGx1Z2luLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4ZDYyMzIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvY3JlYXRlYW1ldGhvZHBsdWdpbi5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJzZWN1cml0eSIgY29udGVudD0icHVibGljIiAvPgotPG1ldGEgbmFtZT0iUm9ib3RzIiBjb250ZW50PSJpbmRleCxmb2xsb3ciIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIG5hbWU9IkRDLlR5cGUiIGNvbnRlbnQ9InRhc2siIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iQ3JlYXRlIGEgTWV0aG9kIFBsdWctaW4iIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9Im1ldGhvZHBsdWdpbi5odG1sI21ldGhvZHBsdWdpbiIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0ibWV0aG9kY29udGVudHBhY2thZ2UuaHRtbCNtZXRob2Rjb250ZW50cGFja2FnZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iY3JlYXRlYWNvbnRlbnRwYWNrYWdlLmh0bWwjY3JlYXRlY29udGVudHBhY2thZ2UiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9Im1ldGhvZHBsdWdpbi5odG1sIiAvPgotPG1ldGEgbmFtZT0iREMuRm9ybWF0IiBjb250ZW50PSJYSFRNTCIgLz4KLTxtZXRhIG5hbWU9IkRDLklkZW50aWZpZXIiIGNvbnRlbnQ9ImNyZWF0ZWFtZXRob2RwbHVnaW4iIC8+Ci08bWV0YSBuYW1lPSJEQy5MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiIC8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4vaWJtZGl0YS5jc3MiIC8+Ci08dGl0bGU+Q3JlYXRlIGEgTWV0aG9kIFBsdWctaW48L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9ImNyZWF0ZWFtZXRob2RwbHVnaW4iPjxhIG5hbWU9ImNyZWF0ZWFtZXRob2RwbHVnaW4iPjwhLS0gLS0+PC9hPgotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5DcmVhdGUgYSBNZXRob2QgUGx1Zy1pbjwvaDE+Ci08ZGl2PjxkaXYgY2xhc3M9InAiPjxwPk1ldGhvZCBQbHVnLWlucyBhbGxvdyB0aGUgZXh0ZW5zaW9uIG9yIGN1c3RvbWl6YXRpb24gb2YgYmFzZSBsaWJyYXJ5Ci1jb250ZW50IHdpdGhvdXQgZGlyZWN0bHkgY2hhbmdpbmcgdGhhdCBiYXNlIGNvbnRlbnQgYnkgZGVmaW5pbmcgdGhlIGRpZmZlcmVuY2VzCi10byB0aGUgY29udGVudC4gWW91IHNob3VsZCBhbHdheXMgY3JlYXRlIG5ldyBjb250ZW50IGluIGEgbWV0aG9kIHBsdWctaW4gdGhhdAoteW91IHByb2R1Y2UgdG8gc2VwYXJhdGUgeW91ciBjb250ZW50IGZyb20gdGhlIG9yaWdpbmFsIE9wZW5VUC9CYXNpYyBjb250ZW50LiBUaGlzCi1hbHNvIGFsbG93cyB5b3UgdG8gdXBkYXRlIHlvdXIgb3duIGxpYnJhcnkgd2l0aCBuZXcgcmVsZWFzZXMgb2YgdGhlIE9wZW5VUC9CYXNpYyBNZXRob2QKLUxpYnJhcnkgd2l0aG91dCBhZmZlY3RpbmcgdGhlIGNvbnRlbnQgdGhhdCB5b3UgaGF2ZSBjcmVhdGVkIGluIHlvdXIgb3duIHBsdWctaW5zLjwvcD4KLTxkaXYgY2xhc3M9Im5vdGUiPjxzcGFuIGNsYXNzPSJub3RldGl0bGUiPk5vdGU6PC9zcGFuPiBQbHVnLWlucwotdGhhdCBhcmUgc2hpcHBlZCB3aXRoIEVjbGlwc2UgUHJvY2VzcyBGcmFtZXdvcmsgQ29tcG9zZXIgYXJlIGxvY2tlZCBhbmQgcmVhZC1vbmx5LgotVGhlc2UgcGx1Zy1pbnMgYXJlIGdyYXllZCBvdXQgaW4gdGhlIDxhIGhyZWY9ImxpYnJhcnl2aWV3Lmh0bWwjbGlicmFyeXZpZXciPkxpYnJhcnkgVmlldzwvYT4sIGluZGljYXRpbmcgdGhhdCB0aGV5IGFyZSBsb2NrZWQuPC9kaXY+Ci08L2Rpdj4KLTxkaXYgY2xhc3M9InNlY3Rpb24iPlRvIGNyZWF0ZSBhIG5ldyBNZXRob2QgUGx1Zy1pbjo8L2Rpdj4KLTxvbD48bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPk1ha2Ugc3VyZSB5b3UgYXJlIGluIHRoZSA8YSBocmVmPSJhdXRob3JpbmdwZXJzcGVjdGl2ZS5odG1sI2F1dGhvcmluZ3BlcnNwZWN0aXZlIj5BdXRob3JpbmcgUGVyc3BlY3RpdmU8L2E+Ljwvc3Bhbj48L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5Zb3UgY2FuIGJlZ2luIHRoZSBtZXRob2QgcGx1Zy1pbiBjcmVhdGlvbiBwcm9jZXNzIGluIG9uZSBvZiB0d28KLXdheXM6PC9zcGFuPjx1bD48bGk+Q2xpY2sgPHN0cm9uZz5GaWxlICZndDsgTmV3ICZndDsgTWV0aG9kIFBsdWctaW48L3N0cm9uZz4uIE9yLDwvbGk+Ci08bGk+SW4gdGhlIExpYnJhcnkgdmlldywgcmlnaHQgY2xpY2sgYW4gZXhpc3RpbmcgcGx1Zy1pbiBhbmQgc2VsZWN0IDxzdHJvbmc+TmV3Ci1NZXRob2QgUGx1Zy1pbjwvc3Ryb25nPi48L2xpPgotPC91bD4KLSBUaGUgTmV3IE1ldGhvZCBQbHVnLWluIHdpemFyZCBvcGVucy48L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5UeXBlIGEgbmFtZSBmb3IgeW91ciBuZXcgcGx1Zy1pbiBpbiB0aGUgPHN0cm9uZz5OYW1lPC9zdHJvbmc+IGZpZWxkIGFuZCB0aGVuCi1zZWxlY3QgYSBwbHVnaW4gaW4gdGhlIDxzdHJvbmc+UmVmZXJlbmNlZCBQbHVnLWluczwvc3Ryb25nPiBmaWVsZC4gVGhlIHBsdWctaW4geW91IGNyZWF0ZQotZXh0ZW5kcyB0aGUgcGx1Zy1pbiB5b3Ugc2VsZWN0IGZyb20gdGhlIGxpc3QgYW5kIGFsbG93cyB5b3UgdG8gdXNlIGNvbnRlbnQKLWZyb20gdGhlIHNlbGVjdGVkIHBsdWctaW4gYXMgeW91IGNyZWF0ZSB5b3VyIG93biBwbHVnLWluIGNvbnRlbnQuPC9zcGFuPjwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPlByb3ZpZGUgYSBicmllZiBkZXNjcmlwdGlvbiBvZiB0aGUgcGx1Zy1pbiBhbmQgbGlzdCBpdHMgYXV0aG9ycwotdG8gaGVscCB5b3UgYW5kIG90aGVycyBrZWVwIHRyYWNrIG9mIHRoZSBwbHVnLWlucyBpbiB0aGUgbGlicmFyeS4gWW91IGNhbgotcmV0dXJuIHRvIGVkaXQgdGhpcyBpbmZvcm1hdGlvbiBhdCBhbnkgdGltZS48L3NwYW4+PC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+Q2xpY2sgPHN0cm9uZz5GaW5pc2g8L3N0cm9uZz4uIFlvdXIgbmV3IHBsdWctaW4gbm93IGFwcGVhcnMgaW4gdGhlIDxhIGhyZWY9ImxpYnJhcnl2aWV3Lmh0bWwjbGlicmFyeXZpZXciPkxpYnJhcnkgVmlldzwvYT4gd2l0aCB0aGUgb3RoZXIKLU1ldGhvZCBQbHVnLWlucy48L3NwYW4+PC9saT4KLTwvb2w+Ci08L2Rpdj4KLTxkaXY+Ci08ZGl2IGNsYXNzPSJmYW1pbHlsaW5rcyI+Ci08ZGl2IGNsYXNzPSJwYXJlbnRsaW5rIj48c3Ryb25nPlBhcmVudCB0b3BpYzo8L3N0cm9uZz4gPGEgaHJlZj0ibWV0aG9kcGx1Z2luLmh0bWwiPk1ldGhvZCBQbHVnLWluPC9hPjwvZGl2PgotPC9kaXY+Ci08ZGl2IGNsYXNzPSJyZWxjb25jZXB0cyI+PHN0cm9uZz5SZWxhdGVkIGNvbmNlcHRzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Im1ldGhvZHBsdWdpbi5odG1sI21ldGhvZHBsdWdpbiI+TWV0aG9kIFBsdWctaW48L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Im1ldGhvZGNvbnRlbnRwYWNrYWdlLmh0bWwjbWV0aG9kY29udGVudHBhY2thZ2UiPk1ldGhvZCBDb250ZW50IFBhY2thZ2U8L2E+PC9kaXY+Ci08L2Rpdj4KLTxkaXYgY2xhc3M9InJlbHRhc2tzIj48c3Ryb25nPlJlbGF0ZWQgdGFza3M8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iY3JlYXRlYWNvbnRlbnRwYWNrYWdlLmh0bWwjY3JlYXRlY29udGVudHBhY2thZ2UiPkNyZWF0ZSBhIENvbnRlbnQgUGFja2FnZTwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9jcmVhdGVhbWV0aG9kdmlld3dpdGhjdXN0b21jYXRlZ29yaWVzLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9jcmVhdGVhbWV0aG9kdmlld3dpdGhjdXN0b21jYXRlZ29yaWVzLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwZWRhNWMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvY3JlYXRlYW1ldGhvZHZpZXd3aXRoY3VzdG9tY2F0ZWdvcmllcy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJzZWN1cml0eSIgY29udGVudD0icHVibGljIiAvPgotPG1ldGEgbmFtZT0iUm9ib3RzIiBjb250ZW50PSJpbmRleCxmb2xsb3ciIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIG5hbWU9IkRDLlR5cGUiIGNvbnRlbnQ9InRhc2siIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iQ3JlYXRlIGEgTWV0aG9kIFZpZXcgd2l0aCBDdXN0b20gQ2F0ZWdvcmllcyIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0ibWV0aG9kY29udGVudGNhdGVnb3JpZXMuaHRtbCNtZXRob2Rjb250ZW50Y2F0ZWdvcmllcyIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0icHVibGlzaGluZ292ZXJ2aWV3Lmh0bWwiIC8+Ci08bWV0YSBuYW1lPSJEQy5Gb3JtYXQiIGNvbnRlbnQ9IlhIVE1MIiAvPgotPG1ldGEgbmFtZT0iREMuSWRlbnRpZmllciIgY29udGVudD0iY3JlYXRlYW1ldGhvZHZpZXd3aXRoY3VzdG9tY2F0ZWdvcmllcyIgLz4KLTxtZXRhIG5hbWU9IkRDLkxhbmd1YWdlIiBjb250ZW50PSJlbi11cyIgLz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi9pYm1kaXRhLmNzcyIgLz4KLTx0aXRsZT5DcmVhdGUgYSBNZXRob2QgVmlldyB3aXRoIEN1c3RvbSBDYXRlZ29yaWVzPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJjcmVhdGVhbWV0aG9kdmlld3dpdGhjdXN0b21jYXRlZ29yaWVzIj48YSBuYW1lPSJjcmVhdGVhbWV0aG9kdmlld3dpdGhjdXN0b21jYXRlZ29yaWVzIj48IS0tIC0tPjwvYT4KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+Q3JlYXRlIGEgTWV0aG9kIFZpZXcgd2l0aCBDdXN0b20gQ2F0ZWdvcmllczwvaDE+Ci08ZGl2PjxkaXYgY2xhc3M9InNlY3Rpb24iPkN1c3RvbSBjYXRlZ29yaWVzIGFsbG93IHlvdSB0byBjYXRlZ29yaXplIGNvbnRlbnQgYWNjb3JkaW5nIHRvIGFueQotc2NoZW1lIHlvdSB3YW50LiBDdXN0b20gY2F0ZWdvcmllcyBjYW4gdGhlbiBiZSB1c2VkIHRvIGNvbXBvc2UgcHVibGlzaGFibGUKLXZpZXdzLCBwcm92aWRpbmcgYSBtZWFucyB0byBvcmdhbml6ZSBtZXRob2QgY29udGVudCBwcmlvciB0byBwdWJsaXNoaW5nLjxwPlRvCi1jcmVhdGUgYSBuZXcgY3VzdG9tIGNhdGVnb3J5OjwvcD4KLTwvZGl2PgotPG9sPjxsaT48c3Bhbj5Td2l0Y2ggdG8gdGhlIDxhIGhyZWY9ImF1dGhvcmluZ3BlcnNwZWN0aXZlLmh0bWwjYXV0aG9yaW5ncGVyc3BlY3RpdmUiPkF1dGhvcmluZyBQZXJzcGVjdGl2ZTwvYT4uPC9zcGFuPjwvbGk+Ci08bGk+PHNwYW4+T3BlbiB0aGUgPHN0cm9uZz5NZXRob2QgQ29udGVudDwvc3Ryb25nPiBmb2xkZXIgaW4gdGhlIG1ldGhvZCBwbHVnLWluIHdoZXJlCi15b3Ugd2FudCB0byBjcmVhdGUgdGhlIGN1c3RvbSBjYXRlZ29yeS48L3NwYW4+PC9saT4KLTxsaT48c3Bhbj5SaWdodCBjbGljayB0aGUgQ3VzdG9tIENhdGVnb3JpZXMgZm9sZGVyIGFuZCBzZWxlY3QgPHN0cm9uZz5OZXcgJmd0OyBDdXN0b20KLUNhdGVnb3J5PC9zdHJvbmc+LiBUaGUgZWRpdG9yIHdpbmRvdyBvcGVucy48L3NwYW4+PC9saT4KLTxsaT48c3Bhbj5Qcm92aWRlIGRlc2NyaXB0aXZlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjdXN0b20gY2F0ZWdvcnkgaW4gdGhlCi1maWVsZHMgYXZhaWxhYmxlIHVuZGVyIHRoZSA8c3Ryb25nPkRlc2NyaXB0aW9uPC9zdHJvbmc+IHRhYi48L3NwYW4+PC9saT4KLTxsaT48c3Bhbj5VbmRlciB0aGUgPHN0cm9uZz5Bc3NpZ248L3N0cm9uZz4gdGFiLCB5b3UgY2FuIHNlbGVjdCB0aGUgdGhpbmdzIHlvdSB3YW50Ci10byBpbmNsdWRlIGluIHRoZSBjdXN0b20gY2F0ZWdvcnkuIFNlbGVjdCBpbmRpdmlkdWFsIG1ldGhvZCBlbGVtZW50cywgcHJvY2Vzc2VzLAotc3RhbmRhcmQgY2F0ZWdvcmllcyBvciBjdXN0b20gY2F0ZWdvcmllcy4gVGhlIGN1c3RvbSBjYXRlZ29yeQotaXMgYWxzbyBhdmFpbGFibGUgdG8gYWRkIHRvIGluZGl2aWR1YWwgZWxlbWVudHMgb24gdGhlIDxzdHJvbmc+Q2F0ZWdvcmllczwvc3Ryb25nPiB0YWIKLWluIHRoZSBhcHByb3ByaWF0ZSBlZGl0b3IuPC9zcGFuPjwvbGk+Ci08bGk+PHNwYW4+T25jZSB5b3UgYXNzaWduIGNvbnRlbnQgdG8gdGhlIGN1c3RvbSBjYXRlZ29yeSwgeW91IGNhbiBtb2RpZnkKLXRoZSBzZXF1ZW5jZSBvZiB0aGUgaXRlbXMgaW4gdGhlIGNhdGVnb3J5LiBUaGlzIGFmZmVjdHMgdGhlIHNlcXVlbmNlIG9mIHRoZQotaXRlbXMgaW4gdGhlIDxhIGhyZWY9ImxpYnJhcnl2aWV3Lmh0bWwjbGlicmFyeXZpZXciPkxpYnJhcnkgVmlldzwvYT4gYW5kIDxhIGhyZWY9ImNvbmZpZ3VyYXRpb252aWV3Lmh0bWwjY29uZmlndXJhdGlvbnZpZXciPkNvbmZpZ3VyYXRpb24gVmlldzwvYT4sIGFzCi13ZWxsIGFzIGluIGEgcHVibGlzaGVkIFdlYiBzaXRlIGlmIHRoZSBjdXN0b20gY2F0ZWdvcnkgaXMgaW5jbHVkZWQgYXMgYSB2aWV3Ci1pbiBhIGNvbmZpZ3VyYXRpb24uPC9zcGFuPjwvbGk+Ci08bGk+PHNwYW4+VG8gc2F2ZSB5b3VyIG5ldyBjdXN0b20gY2F0ZWdvcnksIGNsaWNrIDxzdHJvbmc+RmlsZSAmZ3Q7IFNhdmU8L3N0cm9uZz4gb3IgY2xvc2UKLXRoZSBlZGl0b3IgYW5kIGNsaWNrIDxzdHJvbmc+WWVzPC9zdHJvbmc+IHdoZW4gcHJvbXB0ZWQgdG8gc2F2ZSB0aGUgY2hhbmdlcy48L3NwYW4+PC9saT4KLTwvb2w+Ci08ZGl2IGNsYXNzPSJzZWN0aW9uIj5Zb3UgY2FuIG5vdyB1c2UgdGhlIGN1c3RvbSBjYXRlZ29yeSBhcyBhIHZpZXcgaW4gYSBwdWJsaXNoZWQgY29uZmlndXJhdGlvbi48b2w+PGxpPlN3aXRjaCB0byB0aGUgPGEgaHJlZj0iYXV0aG9yaW5ncGVyc3BlY3RpdmUuaHRtbCNhdXRob3JpbmdwZXJzcGVjdGl2ZSI+QXV0aG9yaW5nIFBlcnNwZWN0aXZlPC9hPi48L2xpPgotPGxpPkluIHRoZSA8YSBocmVmPSJsaWJyYXJ5dmlldy5odG1sI2xpYnJhcnl2aWV3Ij5MaWJyYXJ5IFZpZXc8L2E+LAotZG91YmxlIGNsaWNrIHRoZSBjb25maWd1cmF0aW9uIHRvIHdoaWNoIHlvdSB3YW50IHRvIGFkZCBhIHZpZXcuIFRoZSBjb25maWd1cmF0aW9uCi1lZGl0b3Igb3BlbnMuPC9saT4KLTxsaT5DbGljayB0aGUgPHN0cm9uZz5WaWV3czwvc3Ryb25nPiB0YWIgYW5kIHRoZW4gY2xpY2sgdGhlIDxzdHJvbmc+QWRkIFZpZXc8L3N0cm9uZz4gYnV0dG9uLgotVGhlIFNlbGVjdCBDYXRlZ29yaWVzIGRpYWxvZyBhcHBlYXJzLiBUaGUgU2VsZWN0IENhdGVnb3JpZXMgZGlhbG9nIGRpc3BsYXlzCi1hbGwgdGhlIHN0YW5kYXJkIGFuZCBjdXN0b20gY2F0ZWdvcmllcyBpbiB0aGUgY29uZmlndXJhdGlvbi48L2xpPgotPGxpPlNlbGVjdCBvbmUgb3IgbW9yZSBjYXRlZ29yaWVzIHRvIGluY2x1ZGUgYXMgYSB2aWV3IGluIHlvdXIgY29uZmlndXJhdGlvbgotYW5kIHRoZW4gY2xpY2sgPHN0cm9uZz5PSzwvc3Ryb25nPi4gVGhlIHZpZXcgZGlzcGxheSBwcm92aWRlcyBhIHByZXZpZXcgb2YgaG93IHRoZSB2aWV3Ci13aWxsIGFwcGVhciBuIHRoZSBwdWJsaXNoZWQgdHJlZSBicm93c2VyLjwvbGk+Ci08bGk+U2VsZWN0IGEgdmlldyB0byBkaXNwbGF5IGFzIHRoZSBkZWZhdWx0IHN0YXJ0LXVwIHZpZXcgaW4gdGhlIHB1Ymxpc2hlZAotV2ViIHNpdGUsIGFuZCB0aGVuIGNsaWNrIHRoZSA8c3Ryb25nPk1ha2UgRGVmYXVsdDwvc3Ryb25nPiBidXR0b24uPC9saT4KLTxsaT5UbyBzYXZlIHRoZSBjb25maWd1cmF0aW9uLCBjbGljayA8c3Ryb25nPkZpbGUgJmd0OyBTYXZlPC9zdHJvbmc+IG9yIGNsb3NlIHRoZSBjb25maWd1cmF0aW9uCi1lZGl0b3IgYW5kIGNsaWNrIDxzdHJvbmc+WWVzPC9zdHJvbmc+IHdoZW4gcHJvbXB0ZWQgdG8gc2F2ZSB0aGUgY2hhbmdlcy48L2xpPgotPC9vbD4KLTwvZGl2PgotPC9kaXY+Ci08ZGl2PjxkaXYgY2xhc3M9InJlbGNvbmNlcHRzIj48c3Ryb25nPlJlbGF0ZWQgY29uY2VwdHM8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0ibWV0aG9kY29udGVudGNhdGVnb3JpZXMuaHRtbCNtZXRob2Rjb250ZW50Y2F0ZWdvcmllcyI+TWV0aG9kIENvbnRlbnQgQ2F0ZWdvcmllczwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0icHVibGlzaGluZ292ZXJ2aWV3Lmh0bWwiPlB1Ymxpc2hpbmcgT3ZlcnZpZXc8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvY3JlYXRlYXJldXNhYmxlY2FwYWJpbGl0eXBhdHRlcm4uaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2NyZWF0ZWFyZXVzYWJsZWNhcGFiaWxpdHlwYXR0ZXJuLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzOWQzNjQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvY3JlYXRlYXJldXNhYmxlY2FwYWJpbGl0eXBhdHRlcm4uaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDEwNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGh0bWwKLSAgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9InNlY3VyaXR5IiBjb250ZW50PSJwdWJsaWMiIC8+Ci08bWV0YSBuYW1lPSJSb2JvdHMiIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgbmFtZT0iREMuVHlwZSIgY29udGVudD0idGFzayIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJDcmVhdGUgYSBSZXVzYWJsZSBDYXBhYmlsaXR5IFBhdHRlcm4iIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9InByb2Nlc3MuaHRtbCNwcm9jZXNzIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJwcm9jZXNzYXV0aG9yaW5nb3ZlcnZpZXcuaHRtbCNwcm9jZXNzYXV0aG9yaW5nb3ZlcnZpZXciIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9ImNyZWF0ZWFkZWxpdmVyeXByb2Nlc3MuaHRtbCNjcmVhdGVhZGVsaXZlcnlwcm9jZXNzIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJjYXBhYmlsaXR5cGF0dGVybi5odG1sIiAvPgotPG1ldGEgbmFtZT0iREMuRm9ybWF0IiBjb250ZW50PSJYSFRNTCIgLz4KLTxtZXRhIG5hbWU9IkRDLklkZW50aWZpZXIiIGNvbnRlbnQ9ImNyZWF0ZWFyZXVzYWJsZWNhcGFiaWxpdHlwYXR0ZXJuIiAvPgotPG1ldGEgbmFtZT0iREMuTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIiAvPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuL2libWRpdGEuY3NzIiAvPgotPHRpdGxlPkNyZWF0ZSBhIFJldXNhYmxlIENhcGFiaWxpdHkgUGF0dGVybjwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0iY3JlYXRlYXJldXNhYmxlY2FwYWJpbGl0eXBhdHRlcm4iPjxhIG5hbWU9ImNyZWF0ZWFyZXVzYWJsZWNhcGFiaWxpdHlwYXR0ZXJuIj48IS0tIC0tPjwvYT4KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+Q3JlYXRlIGEgUmV1c2FibGUgQ2FwYWJpbGl0eSBQYXR0ZXJuPC9oMT4KLTxkaXY+PGRpdiBjbGFzcz0icCI+PHA+QSBDYXBhYmlsaXR5IHBhdHRlcm4gaXMgYSBzcGVjaWFsIHByb2Nlc3MgdGhhdCBkZXNjcmliZXMgYSByZXVzYWJsZQotY2x1c3RlciBvZiBhY3Rpdml0aWVzIGluIGEgZ2VuZXJhbCBwcm9jZXNzIGFyZWEgdGhhdCBwcm92aWRlcyBhIGNvbnNpc3RlbnQKLWRldmVsb3BtZW50IGFwcHJvYWNoIHRvIGNvbW1vbiBwcm9ibGVtcy4gQ2FwYWJpbGl0eSBwYXR0ZXJucyBjYW4gYmUgdXNlZCBhcwotYnVpbGRpbmcgYmxvY2tzIHRvIGFzc2VtYmxlIGRlbGl2ZXJ5IHByb2Nlc3NlcyBvciBsYXJnZXIgY2FwYWJpbGl0eSBwYXR0ZXJucy4gPC9wPgotQmVmb3JlCi1jcmVhdGluZyBhIGNhcGFiaWxpdHkgcGF0dGVybjo8dWw+PGxpPlNlbGVjdCBhIG1ldGhvZCBwbHVnLWluIHRvIGhvbGQgeW91ciBwcm9jZXNzLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIDxhIGhyZWY9Im1ldGhvZHBsdWdpbi5odG1sI21ldGhvZHBsdWdpbiI+TWV0aG9kIFBsdWctaW48L2E+LjwvbGk+Ci08bGk+RmluZCBvciBjcmVhdGUgYSBwcm9jZXNzIHBhY2thZ2UuPC9saT4KLTwvdWw+Ci08L2Rpdj4KLTxkaXYgY2xhc3M9InNlY3Rpb24iPkEgY2FwYWJpbGl0eSBwYXR0ZXJuIGRvZXMgbm90IHJlbGF0ZSB0byBhbnkgc3BlY2lmaWMgcGhhc2Ugb3IgaXRlcmF0aW9uCi1vZiBhIGRldmVsb3BtZW50IGxpZmVjeWNsZSwgYW5kIHNob3VsZCBub3QgaW1wbHkgYW55LiBJbiBvdGhlciB3b3JkcywgYSBjYXBhYmlsaXR5Ci1wYXR0ZXJuIHNob3VsZCBiZSBkZXNpZ25lZCBpbiBhIHdheSBzbyB0aGF0IGl0IGlzIGFwcGxpY2FibGUgYW55d2hlcmUgaW4gYQotZGVsaXZlcnkgcHJvY2Vzcy4gVGhpcyBlbmFibGVzIHRoZSBwYXR0ZXJuJ3MgYWN0aXZpdGllcyB0byBiZSBmbGV4aWJseSBhc3NpZ25lZAotdG8gd2hhdGV2ZXIgcGhhc2VzIHRoZXJlIGFyZSBpbiB0aGUgZGVsaXZlcnkgcHJvY2VzcyB0byB3aGljaCBpdCBpcyBiZWluZwotYXBwbGllZC4gRm9yIG1vcmUgaW5mb3JtYXRpb24gc2VlIDxhIGhyZWY9ImNhcGFiaWxpdHlwYXR0ZXJuLmh0bWwjY2FwYWJpbGl0eXBhdHRlcm4iPkNhcGFiaWxpdHkgUGF0dGVybjwvYT4uPGRpdiBjbGFzcz0icCI+WW91IGRvIG5vdCBuZWVkIHRvIGRldmVsb3AgeW91ciBwcm9jZXNzIGZyb20gc2NyYXRjaDsKLXlvdSBjYW4gcmV1c2UgZXhpc3RpbmcgY2FwYWJpbGl0eSBwYXR0ZXJucyBvciBldmVuIGNhcGFiaWxpdHkgcGF0dGVybiBwYXJ0cy4KLVRoZXJlIGFyZSBzZXZlcmFsIHdheXMgdG8gcG9wdWxhdGUgYSBwcm9jZXNzIHdpdGggbWV0aG9kIGVsZW1lbnRzOjx1bD48bGk+QnkgaW5jb3Jwb3JhdGluZyBpbmRpdmlkdWFsIG1ldGhvZCBlbGVtZW50cyBieSBkcmFnZ2luZyB0aGUgZWxlbWVudHMgb250bwotYW4gYWN0aXZpdHkgaW4gdGhlIHByb2Nlc3MuPC9saT4KLTxsaT5CeSBpbmNsdWRpbmcgYWxyZWFkeSBkZWZpbmVkIGNhcGFiaWxpdHkgcGF0dGVybnMuPC9saT4KLTxsaT5CeSBpbmNsdWRpbmcgcGFydHMgb2YgYWxyZWFkeSBkZWZpbmVkIGNhcGFiaWxpdHkgcGF0dGVybnMuPC9saT4KLTxsaT5CeSBjcmVhdGluZyBkZXNjcmlwdG9ycyBkaXJlY3RseSBpbiB0aGUgcHJvY2Vzcywgd2hpY2ggYXJlIGVpdGhlciB1bnJlbGF0ZWQKLXRvIGFueSBtZXRob2QgY29udGVudCBvciByZWxhdGVkIHRvIG1ldGhvZCBjb250ZW50IGF0IGEgbGF0ZXIgcG9pbnQgaW4gdGltZS48L2xpPgotPC91bD4KLTwvZGl2PgotPHA+IFRvIGNyZWF0ZSBhIGNhcGFiaWxpdHkgcGF0dGVybjo8L3A+Ci08L2Rpdj4KLTxvbD48bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPk9uY2UgeW91IGhhdmUgc2VsZWN0ZWQgb3IgY3JlYXRlZCBhIHByb2Nlc3MgcGFja2FnZSwgcmlnaHQgY2xpY2sKLXRoZSA8c3Ryb25nPlByb2Nlc3MgUGFja2FnZTwvc3Ryb25nPi48L3NwYW4+PC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+Q2xpY2sgPHN0cm9uZz5OZXcg4oCTJmd0OyBDYXBhYmlsaXR5IFBhdHRlcm48L3N0cm9uZz4uIFRoZSBOZXcgUHJvY2VzcyBDb21wb25lbnQKLWRpYWxvZyBib3ggYXBwZWFycy48L3NwYW4+PC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+VHlwZSBhIG5hbWUgZm9yIHRoZSBjYXBhYmlsaXR5IHBhdHRlcm4gaW50byB0aGUgPHN0cm9uZz5OYW1lPC9zdHJvbmc+IGZpZWxkCi1hbmQgdGhlbiBzZWxlY3QgYSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gZnJvbSB0aGUgZHJvcCBkb3duIGxpc3QuPC9zcGFuPjwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkNsaWNrIDxzdHJvbmc+T0s8L3N0cm9uZz4uIFRoZSBwcm9jZXNzIGlzIGNyZWF0ZWQgYW5kIHRoZSBwcm9jZXNzIGVkaXRvcgotaXMgb3BlbmVkLjwvc3Bhbj48L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5JbiB0aGUgcHJvY2VzcyBlZGl0b3IsIHVuZGVyIHRoZSBEZXNjcmlwdGlvbiB0YWIsIGRvY3VtZW50IHlvdXIKLXByb2Nlc3MgdXNpbmcgdGhlIGF2YWlsYWJsZSB0ZXh0IGZpZWxkcy48L3NwYW4+IDxkaXYgY2xhc3M9Im5vdGUiPjxzcGFuIGNsYXNzPSJub3RldGl0bGUiPk5vdGU6PC9zcGFuPiBZb3UgY2FuIHVzZSB0aGUKLVJpY2ggVGV4dCBFZGl0b3IgdG8gZWRpdCBvciBlbnRlciB0aGUgdGV4dCBmb3IgYW55IGZpZWxkIHRoYXQgaGFzIGEgdHdpc3R5Ci1zeW1ib2wgPGltZyBzcmM9InR3aXN0eSBzeW1ib2wxLkpQRyIgYWx0PSIiIC8+LiBTaW1wbHkgY2xpY2sKLXRoZSBzeW1ib2wgdG8gYWNjZXNzIHRoZSBSaWNoIFRleHQgRWRpdG9yLiBDbGljayB0aGUgc3ltYm9sIGFnYWluIHRvIGNsb3NlCi10aGUgUmljaCBUZXh0IEVkaXRvci4gRm9yIG1vcmUgaW5mb3JtYXRpb24gc2VlIDxhIGhyZWY9InJpY2h0ZXh0ZWRpdG9yLmh0bWwjcmljaHRleHRlZGl0b3IiPlJpY2ggVGV4dCBFZGl0b3I8L2E+PC9kaXY+Ci08L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5EZWNpZGUgb24geW91ciBwcmltYXJ5IHByb2Nlc3MgYXV0aG9yaW5nIHZpZXcuIFlvdSBkZXZlbG9wIGEgcHJvY2VzcwotdXNpbmcgdGhyZWUgZGlmZmVyZW50IHZpZXdzOiA8L3NwYW4+PHVsPjxsaT48c3Ryb25nPldvcmsgQnJlYWtkb3duIFN0cnVjdHVyZTwvc3Ryb25nPjogRGVmaW5lIGEgd29yayBicmVha2Rvd24gc3RydWN0dXJlCi1pbiB5b3VyIHByb2Nlc3MuIENyZWF0ZSBpdGVyYXRpb25zIGFuZCBhY3Rpdml0aWVzIGZpcnN0LCBhbmQgdGhlbiBwb3B1bGF0ZQoteW91ciBhY3Rpdml0aWVzIGJ5IGFwcGx5aW5nIHRhc2tzIGZyb20geW91ciBtZXRob2QgY29udGVudC4gRm9yIG1vcmUgaW5mb3JtYXRpb24KLXNlZSA8YSBocmVmPSJkZXZlbG9wYXdvcmticmVha2Rvd25zdHJ1Y3R1cmUuaHRtbCNkZXZlbG9wYXdvcmticmVha2Rvd25zdHJ1Y3R1cmUiPkRldmVsb3AgYSBXb3JrIEJyZWFrZG93biBTdHJ1Y3R1cmU8L2E+LjwvbGk+Ci08bGk+PHN0cm9uZz5UZWFtIEFsbG9jYXRpb248L3N0cm9uZz46IERlZmluZSB3aGljaCB0ZWFtcyBhbmQgcm9sZXMgc2hhbGwgcGFydGljaXBhdGUKLWluIGFjdGl2aXRpZXMgYW5kIHRoZW4gZmluZCByZXNwb25zaWJsZSB3b3JrIHByb2R1Y3RzIGFuZCB0YXNrcyBmcm9tIHRoZXJlLgotRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSA8YSBocmVmPSJkZXZlbG9wYXRlYW1hbGxvY2F0aW9uc3RydWN0dXJlLmh0bWwiPkRldmVsb3AgYSBUZWFtIEFsbG9jYXRpb24gU3RydWN0dXJlPC9hPi48L2xpPgotPGxpPjxzdHJvbmc+V29yayBQcm9kdWN0IFVzYWdlPC9zdHJvbmc+OiBEZWZpbmUgd2hpY2ggd29yayBwcm9kdWN0cyBzaG91bGQgYmUgY3JlYXRlZAotaW4gYWN0aXZpdGllcyBhbmQgZmluZCB0YXNrcyBhbmQgcm9sZXMgZnJvbSB0aGVyZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24gc2VlIDxhIGhyZWY9ImRldmVsb3Bhd29ya3Byb2R1Y3R1c2FnZXN0cnVjdHVyZS5odG1sI2RldmVsb3Bhd29ya3Byb2R1Y3R1c2FnZXN0cnVjdHVyZSI+RGV2ZWxvcCBhIFdvcmsgUHJvZHVjdCBVc2FnZSBTdHJ1Y3R1cmU8L2E+LjwvbGk+Ci08L3VsPgotIDxwPk9uY2UgeW91IGhhdmUgY3JlYXRlZCB5b3VyIGNhcGFiaWxpdHkgcGF0dGVybiwgeW91IG5lZWQgdG8gYXBwbHkKLWl0LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgcGxlYXNlIHNlZSA8YSBocmVmPSJhcHBseWFjYXBhYmlsaXR5cGF0dGVybi5odG1sI2FwcGx5YWNhcGFiaWxpdHlwYXR0ZXJuIj5BcHBseSBhIENhcGFiaWxpdHkgUGF0dGVybjwvYT4uPC9wPgotPC9saT4KLTwvb2w+Ci08L2Rpdj4KLTxkaXY+Ci08dWwgY2xhc3M9InVsbGlua3MiPgotPGxpIGNsYXNzPSJ1bGNoaWxkbGluayI+PHN0cm9uZz48YSBocmVmPSJjYXBhYmlsaXR5cGF0dGVybi5odG1sIj5DYXBhYmlsaXR5IFBhdHRlcm48L2E+PC9zdHJvbmc+PGJyIC8+Ci08L2xpPgotPC91bD4KLTxkaXYgY2xhc3M9InJlbGNvbmNlcHRzIj48c3Ryb25nPlJlbGF0ZWQgY29uY2VwdHM8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0icHJvY2Vzcy5odG1sI3Byb2Nlc3MiPlByb2Nlc3M8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9InByb2Nlc3NhdXRob3JpbmdvdmVydmlldy5odG1sI3Byb2Nlc3NhdXRob3JpbmdvdmVydmlldyI+UHJvY2VzcyBBdXRob3JpbmcgT3ZlcnZpZXc8L2E+PC9kaXY+Ci08L2Rpdj4KLTxkaXYgY2xhc3M9InJlbHRhc2tzIj48c3Ryb25nPlJlbGF0ZWQgdGFza3M8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iY3JlYXRlYWRlbGl2ZXJ5cHJvY2Vzcy5odG1sI2NyZWF0ZWFkZWxpdmVyeXByb2Nlc3MiPkNyZWF0ZSBhIERlbGl2ZXJ5IFByb2Nlc3M8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvY3JlYXRlYXJvbGUuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2NyZWF0ZWFyb2xlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlYTY5MDEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvY3JlYXRlYXJvbGUuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDEwNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGh0bWwKLSAgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9InNlY3VyaXR5IiBjb250ZW50PSJwdWJsaWMiIC8+Ci08bWV0YSBuYW1lPSJSb2JvdHMiIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgbmFtZT0iREMuVHlwZSIgY29udGVudD0idGFzayIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJDcmVhdGUgYSBSb2xlIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJtZXRob2Rjb250ZW50Lmh0bWwjY3JlYXRpbmdyZXVzYWJsZW1ldGhvZGNvbnRlbnRzIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJjcmVhdGVhdGFzay5odG1sI2NyZWF0ZWF0YXNrIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJjcmVhdGVhd29ya3Byb2R1Y3QuaHRtbCNjcmVhdGVhd29ya3Byb2R1Y3QiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9ImNyZWF0ZWd1aWRhbmNlLmh0bWwjY3JlYXRlZ3VpZGFuY2UiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9InZhcmlhYmlsaXR5Lmh0bWwjdmFyaWFiaWxpdHkiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9ImNyZWF0ZW1ldGhvZGNvbnRlbnQuaHRtbCIgLz4KLTxtZXRhIG5hbWU9IkRDLkZvcm1hdCIgY29udGVudD0iWEhUTUwiIC8+Ci08bWV0YSBuYW1lPSJEQy5JZGVudGlmaWVyIiBjb250ZW50PSJjcmVhdGVhcm9sZSIgLz4KLTxtZXRhIG5hbWU9IkRDLkxhbmd1YWdlIiBjb250ZW50PSJlbi11cyIgLz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi9pYm1kaXRhLmNzcyIgLz4KLTx0aXRsZT5DcmVhdGUgYSBSb2xlPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJjcmVhdGVhcm9sZSI+PGEgbmFtZT0iY3JlYXRlYXJvbGUiPjwhLS0gLS0+PC9hPgotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5DcmVhdGUgYSBSb2xlPC9oMT4KLTxkaXY+PGRpdiBjbGFzcz0icCI+PHA+QSA8c3BhbiBjbGFzcz0ia2V5d29yZCI+Um9sZTwvc3Bhbj4gZGVmaW5lcyBhIHNldCBvZiByZWxhdGVkIHNraWxscywgY29tcGV0ZW5jaWVzLAotYW5kIHJlc3BvbnNpYmlsaXRpZXMgb2YgYW4gaW5kaXZpZHVhbCBvciBpbmRpdmlkdWFscy48L3A+Ci1Zb3Ugc2hvdWxkIGFsd2F5cwotY3JlYXRlIG5ldyBtZXRob2QgY29udGVudCBpbiBhIDxhIGhyZWY9Im1ldGhvZHBsdWdpbi5odG1sI21ldGhvZHBsdWdpbiI+TWV0aG9kIFBsdWctaW48L2E+IHRoYXQgeW91IHByb2R1Y2UuPC9kaXY+Ci08ZGl2IGNsYXNzPSJzZWN0aW9uIj5UbyBjcmVhdGUgYSByb2xlOjwvZGl2PgotPG9sPjxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+RXhwYW5kIHRoZSBjb250ZW50IHBhY2thZ2UgaW4gd2hpY2ggeW91IHdhbnQgdG8gY3JlYXRlIHRoZSByb2xlLjwvc3Bhbj48L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5SaWdodCBjbGljayA8c3Ryb25nPlJvbGVzPC9zdHJvbmc+LCBhbmQgdGhlbiBzZWxlY3QgPHN0cm9uZz5OZXcgJmd0OyBSb2xlPC9zdHJvbmc+LiBUaGUKLXJvbGUgZWRpdG9yIGFwcGVhcnMgd2l0aCB0aGUgRGVzY3JpcHRpb24gdGFiIHNldCBhcyB0aGUgZGVmYXVsdC48L3NwYW4+PC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+SW4gdGhlIE5hbWUgZmllbGQsIHR5cGUgYSB1bmlxdWUgbmFtZSBmb3IgeW91ciByb2xlLiBUaGUgcm9sZSBuYW1lCi1pcyB0aGUgZmlsZSBuYW1lIHRoYXQgYXBwZWFycyBpbiB0aGUgTGlicmFyeSB2aWV3Ljwvc3Bhbj48L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5JbiB0aGUgUHJlc2VudGF0aW9uIG5hbWUgZmllbGQsIHR5cGUgYSBwcmVzZW50YXRpb24gbmFtZS4gVGhlIHByZXNlbnRhdGlvbgotbmFtZSBpcyB0aGUgbmFtZSB0aGF0IGFwcGVhcnMgaW4geW91ciBwdWJsaXNoZWQgY29udGVudCBhbmQgaW4gdGhlIDxhIGhyZWY9ImNvbmZpZ3VyYXRpb252aWV3Lmh0bWwjY29uZmlndXJhdGlvbnZpZXciPkNvbmZpZ3VyYXRpb24gVmlldzwvYT4uIFlvdSBjYW4gYWxzbyBtYWtlIHRoaXMgbmFtZSBhcHBlYXIgaW4gdGhlIDxhIGhyZWY9ImxpYnJhcnl2aWV3Lmh0bWwjbGlicmFyeXZpZXciPkxpYnJhcnkgVmlldzwvYT4gYnkgdG9nZ2xpbmcgdGhlIDxzdHJvbmc+U2hvdyBQcmVzZW50YXRpb24gTmFtZXM8L3N0cm9uZz4gYnV0dG9uCi1pbiB0aGUgTGlicmFyeSBWaWV3IHRvb2xiYXIuPC9zcGFuPjwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkluIHRoZSBCcmllZiBEZXNjcmlwdGlvbiBmaWVsZCwgdHlwZSBhIHNob3J0IGRlc2NyaXB0aW9uIG9mIHRoZQotbmV3IFJvbGUuIDwvc3Bhbj48L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5UeXBlIGEgbW9yZSBkZXRhaWxlZCBkZXNjcmlwdGlvbiBvZiB0aGUgbmV3IFJvbGUgaW4gdGhlIE1haW4gRGVzY3JpcHRpb24KLWZpZWxkLiBUaGUgbWFpbiBkZXNjcmlwdGlvbiBpcyBhIG1vcmUgZGV0YWlsZWQgdmVyc2lvbiBvZiB0aGUgZGVzY3JpcHRpb24KLXlvdSB0eXBlZCBpbnRvIHRoZSBCcmllZiBEZXNjcmlwdGlvbiBmaWVsZC4gVGhlcmUgYXJlIHRocmVlIHdheXMgeW91IGNhbiBjcmVhdGUKLXRleHQgZm9yIHRoZSBkZXNjcmlwdGlvbjo8L3NwYW4+IDx1bD48bGk+RGlyZWN0bHksIGJ5IHR5cGluZyBpdCBtYW51YWxseSBpbiB0aGUgZWRpdG9yLjwvbGk+Ci08bGk+Q29weSBmcm9tIGFub3RoZXIgc2ltaWxhciByb2xlIGFuZCB0aGVuIG1vZGlmeSBieSB1c2luZyB0aGUgZWRpdG9yLjwvbGk+Ci08bGk+Q29weSBmcm9tIGFuIEhUTUwgc291cmNlIHN1Y2ggYXMgYSBwdWJsaXNoZWQgT3BlblVQL0Jhc2ljIFdlYiBzaXRlLjwvbGk+Ci08L3VsPgotPGRpdiBjbGFzcz0ibm90ZSI+PHNwYW4gY2xhc3M9Im5vdGV0aXRsZSI+Tm90ZTo8L3NwYW4+IFlvdSBjYW4gdXNlIHRoZSBSaWNoIFRleHQgRWRpdG9yIHRvIGVkaXQgb3IgZW50ZXIgdGhlIHRleHQgZm9yCi1hbnkgZmllbGQgdGhhdCBoYXMgYSB0d2lzdHkgc3ltYm9sIDxpbWcgc3JjPSJjb2xsYXBzZWQuZ2lmIiBhbHQ9IiIgLz4uIFNpbXBseSBjbGljayB0aGUgc3ltYm9sIHRvIGFjY2VzcyB0aGUgUmljaCBUZXh0IEVkaXRvci4gQ2xpY2sgdGhlCi1zeW1ib2wgYWdhaW4gdG8gY2xvc2UgdGhlIFJpY2ggVGV4dCBFZGl0b3IuIEZvciBtb3JlIGluZm9ybWF0aW9uIHNlZSA8YSBocmVmPSJyaWNodGV4dGVkaXRvci5odG1sI3JpY2h0ZXh0ZWRpdG9yIj5SaWNoIFRleHQgRWRpdG9yPC9hPi48L2Rpdj4KLTwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPlVuZGVyIFZlcnNpb24gSW5mb3JtYXRpb24sIHByb3ZpZGUgYW55IHBlcnRpbmVudCB2ZXJzaW9uIGluZm9ybWF0aW9uCi1hYm91dCB0aGUgcm9sZS48L3NwYW4+PC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+Q2xpY2sgdGhlIDxzdHJvbmc+V29yayBQcm9kdWN0czwvc3Ryb25nPiB0YWIgYW5kIHRoZW4gY2xpY2sgdGhlIDxzdHJvbmc+QWRkPC9zdHJvbmc+IGJ1dHRvbgotdG8gdGhlIHJpZ2h0IG9mIHRoZSAiUm9sZSBpcyByZXNwb25zaWJsZSBmb3I6IiBmaWVsZC4gVGhlIFNlbGVjdCBEaWFsb2cgZm9yCi1Xb3JrIFByb2R1Y3RzIGRpYWxvZyBvcGVucy48L3NwYW4+PC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+U2VsZWN0IG9uZSBvciBtb3JlIHdvcmsgcHJvZHVjdHMgZnJvbSB0aGUgbGlzdC4gQSBkZXNjcmlwdGlvbiBvZgotdGhlIHdvcmsgcHJvZHVjdCB5b3Ugc2VsZWN0IGFwcGVhcnMgaW4gdGhlIEJyaWVmIERlc2NyaXB0aW9uIGZpZWxkIGF0IHRoZQotYm90dG9tIG9mIHRoZSBkaWFsb2cgYm94Ljwvc3Bhbj4gPGRpdiBjbGFzcz0ibm90ZSI+PHNwYW4gY2xhc3M9Im5vdGV0aXRsZSI+Tm90ZTo8L3NwYW4+IFRoZSBsaXN0IG9mIHdvcmsgcHJvZHVjdHMgaW4gdGhlCi0iV29yayBwcm9kdWN0cyB0aGF0IGFyZSBvdXRwdXQgb2YgdGFza3MgdGhhdCB0aGlzIHJvbGUgcGVyZm9ybXMiIGZpZWxkIGlzCi1jYWxjdWxhdGVkIGFuZCBjYW5ub3QgYmUgY2hhbmdlZCB3aXRoIHRoZSByb2xlIGVkaXRvci4gQSB3b3JrIHByb2R1Y3QgYXBwZWFycwotaGVyZSBpZiBpdCBpcyBhbiBvdXRwdXQgb2YgYSB0YXNrIHRoYXQgdGhlIHJvbGUgcGVyZm9ybXMuPC9kaXY+Ci08L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5DbGljayA8c3Ryb25nPk9LPC9zdHJvbmc+LiBUaGUgZGlhbG9nIGJveCBjbG9zZXMgYW5kIHRoZSAiUm9sZSBpcyByZXNwb25zaWJsZQotZm9yOiIgZmllbGQgaXMgcG9wdWxhdGVkLjwvc3Bhbj4gPGRpdiBjbGFzcz0ibm90ZSI+PHNwYW4gY2xhc3M9Im5vdGV0aXRsZSI+Tm90ZTo8L3NwYW4+IFNlbGVjdGVkIGVsZW1lbnRzIGluIGFuIEFkZC9SZW1vdmUKLXNlY3Rpb24gZGlzcGxheSBib3RoIHRoZSBlbGVtZW50IG5hbWUgKHBsdWctaW4gbmFtZSkgYW5kIHRoZSAicGF0aCIgKHBhY2thZ2UKLW5hbWUpIHRvIHRoYXQgZWxlbWVudC48L2Rpdj4KLTwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkNsaWNrIHRoZSA8c3Ryb25nPkd1aWRhbmNlPC9zdHJvbmc+IHRhYi4gVGhpcyBwYXJ0IG9mIHRoZSBlZGl0b3IgYWxsb3dzIHlvdQotdG8gYWRkIGFuZCByZW1vdmUgZ3VpZGFuY2UgZm9yIHRoZSByb2xlLiBUbyBhZGQgZ3VpZGFuY2UsIGNsaWNrIHRoZSA8c3Ryb25nPkFkZDwvc3Ryb25nPiBidXR0b24sCi1zZWxlY3QgdGhlIGd1aWRhbmNlIHlvdSB3YW50IHRvIGFkZCwgYW5kIHRoZW4gY2xpY2sgPHN0cm9uZz5PSzwvc3Ryb25nPi4gVG8gcmVtb3ZlIGd1aWRhbmNlLAotc2VsZWN0IGl0IGluIHRoZSBHdWlkYW5jZSBmaWVsZCBhbmQgdGhlbiBjbGljayA8c3Ryb25nPlJlbW92ZTwvc3Ryb25nPi4gV2hlbiB5b3Ugc2VsZWN0Ci1hIGd1aWRhbmNlIGVsZW1lbnQsIHRoZSBicmllZiBkZXNjcmlwdGlvbiBvZiB0aGUgZ3VpZGFuY2UgaXMgZGlzcGxheWVkLjwvc3Bhbj48L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5DbGljayB0aGUgPHN0cm9uZz5DYXRlZ29yaWVzPC9zdHJvbmc+IHRhYi4gQSByb2xlIGNhbiBiZSBpbmNsdWRlZCBpbiBvbmUKLW9yIG1vcmUgcm9sZXNldHMgYW5kIGFueSBudW1iZXIgb2YgY3VzdG9tIGNhdGVnb3JpZXMuIE9wZW4gdGhlIGFwcHJvcHJpYXRlCi1TZWxlY3QgZGlhbG9nIGJ5IGNsaWNraW5nIHRoZSA8c3Ryb25nPkFkZDwvc3Ryb25nPiBidXR0b24gbmV4dCB0byB0aGUgY2F0ZWdvcnkgbGlzdHMuCi1Zb3UgY2FuIHJlbW92ZSBhIHJvbGUgZnJvbSBhIGNhdGVnb3J5IGJ5IHNlbGVjdGluZyBpdCBhbmQgdGhlbiBjbGlja2luZyB0aGUgPHN0cm9uZz5SZW1vdmU8L3N0cm9uZz4gYnV0dG9uLjwvc3Bhbj48L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5DbGljayB0aGUgPHN0cm9uZz5QcmV2aWV3PC9zdHJvbmc+IHRhYiB0byB2aWV3IHRoZSBuZXdseSBjcmVhdGVkCi1yb2xlIGFuZCB0aGVuIHNhdmUgYnkgY2xvc2luZyB0aGUgdGFiLjwvc3Bhbj48L2xpPgotPC9vbD4KLTwvZGl2PgotPGRpdj4KLTxkaXYgY2xhc3M9ImZhbWlseWxpbmtzIj4KLTxkaXYgY2xhc3M9InBhcmVudGxpbmsiPjxzdHJvbmc+UGFyZW50IHRvcGljOjwvc3Ryb25nPiA8YSBocmVmPSJjcmVhdGVtZXRob2Rjb250ZW50Lmh0bWwiPkNyZWF0ZSBNZXRob2QgQ29udGVudDwvYT48L2Rpdj4KLTwvZGl2PgotCi08ZGl2IGNsYXNzPSJsaW5rbGlzdCI+Ci08ZGl2PjxhIGhyZWY9Im1ldGhvZGNvbnRlbnQuaHRtbCNjcmVhdGluZ3JldXNhYmxlbWV0aG9kY29udGVudHMiPk1ldGhvZCBDb250ZW50PC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJjcmVhdGVhdGFzay5odG1sI2NyZWF0ZWF0YXNrIj5DcmVhdGUgYSBUYXNrPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJjcmVhdGVhd29ya3Byb2R1Y3QuaHRtbCNjcmVhdGVhd29ya3Byb2R1Y3QiPkNyZWF0ZSBhIFdvcmsgUHJvZHVjdDwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iY3JlYXRlZ3VpZGFuY2UuaHRtbCNjcmVhdGVndWlkYW5jZSI+Q3JlYXRlIEd1aWRhbmNlPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJ2YXJpYWJpbGl0eS5odG1sI3ZhcmlhYmlsaXR5IiB0aXRsZT0iVmFyaWFiaWxpdHkgYWxsb3dzIGVsZW1lbnRzIGluIG9uZSBjb250ZW50IHBhY2thZ2UgdG8gaW5mbHVlbmNlIG9yIG1vZGlmeSBlbGVtZW50cyBpbiBvdGhlciBjb250ZW50IHBhY2thZ2VzIHdpdGhvdXQgYWN0dWFsbHkgZGlyZWN0bHkgbW9kaWZ5aW5nIHRoZSBvcmlnaW5hbCBjb250ZW50LiBWYXJpYWJpbGl0eSBlbmFibGVzIGNoYW5nZXMgdG8gdGhlIGNvbnRlbnQgd2hpbGUga2VlcGluZyB0aGUgY2hhbmdlcyBzZXBhcmF0ZSBhbmQgb3B0aW9uYWwuIj5WYXJpYWJpbGl0eTwvYT48L2Rpdj48L2Rpdj4KLTwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvY3JlYXRlYXRhc2suaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2NyZWF0ZWF0YXNrLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxMmUyMDQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvY3JlYXRlYXRhc2suaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDEzNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGh0bWwKLSAgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9InNlY3VyaXR5IiBjb250ZW50PSJwdWJsaWMiIC8+Ci08bWV0YSBuYW1lPSJSb2JvdHMiIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgbmFtZT0iREMuVHlwZSIgY29udGVudD0idGFzayIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJDcmVhdGUgYSBUYXNrIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJtZXRob2Rjb250ZW50Lmh0bWwjY3JlYXRpbmdyZXVzYWJsZW1ldGhvZGNvbnRlbnRzIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJjcmVhdGVhcm9sZS5odG1sI2NyZWF0ZWFyb2xlIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJjcmVhdGVhd29ya3Byb2R1Y3QuaHRtbCNjcmVhdGVhd29ya3Byb2R1Y3QiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9ImNyZWF0ZWd1aWRhbmNlLmh0bWwjY3JlYXRlZ3VpZGFuY2UiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9InZhcmlhYmlsaXR5Lmh0bWwjdmFyaWFiaWxpdHkiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9ImNyZWF0ZW1ldGhvZGNvbnRlbnQuaHRtbCIgLz4KLTxtZXRhIG5hbWU9IkRDLkZvcm1hdCIgY29udGVudD0iWEhUTUwiIC8+Ci08bWV0YSBuYW1lPSJEQy5JZGVudGlmaWVyIiBjb250ZW50PSJjcmVhdGVhdGFzayIgLz4KLTxtZXRhIG5hbWU9IkRDLkxhbmd1YWdlIiBjb250ZW50PSJlbi11cyIgLz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi9pYm1kaXRhLmNzcyIgLz4KLTx0aXRsZT5DcmVhdGUgYSBUYXNrPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJjcmVhdGVhdGFzayI+PGEgbmFtZT0iY3JlYXRlYXRhc2siPjwhLS0gLS0+PC9hPgotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5DcmVhdGUgYSBUYXNrPC9oMT4KLTxkaXY+PGRpdiBjbGFzcz0icCI+PHA+QSB0YXNrIGlzIGFuIGFzc2lnbmFibGUgdW5pdCBvZiB3b3JrLiBFdmVyeSB0YXNrIGlzIGFzc2lnbmVkIHRvCi1hIHNwZWNpZmljIHJvbGUuIFRoZSBncmFudWxhcml0eSBvZiBhIHRhc2sgaXMgZ2VuZXJhbGx5IGEgZmV3IGhvdXJzIHRvIGEgZmV3Ci1kYXlzIGFuZCB1c3VhbGx5IGFmZmVjdHMgb25lIG9yIG9ubHkgYSBzbWFsbCB1bWJlciBvZiB3b3JrIHByb2R1Y3RzLjwvcD4KLVlvdQotc2hvdWxkIGFsd2F5cyBjcmVhdGUgbmV3IG1ldGhvZCBjb250ZW50IGluIGEgPGEgaHJlZj0ibWV0aG9kcGx1Z2luLmh0bWwjbWV0aG9kcGx1Z2luIj5NZXRob2QgUGx1Zy1pbjwvYT4gdGhhdCB5b3UgcHJvZHVjZS4gPC9kaXY+Ci08ZGl2IGNsYXNzPSJzZWN0aW9uIj5UbyBjcmVhdGUgYSB0YXNrOjwvZGl2PgotPG9sPjxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+RXhwYW5kIHRoZSBjb250ZW50IHBhY2thZ2UgaW4gd2hpY2ggeW91IHdhbnQgdG8gY3JlYXRlIHRoZSB0YXNrLjwvc3Bhbj48L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5SaWdodCBjbGljayA8c3Ryb25nPlRhc2tzPC9zdHJvbmc+LCBhbmQgdGhlbiBzZWxlY3QgPHN0cm9uZz5OZXcgJmd0OyBUYXNrPC9zdHJvbmc+LiBUaGUKLXRhc2sgZWRpdG9yIGFwcGVhcnMgd2l0aCB0aGUgPHN0cm9uZz5EZXNjcmlwdGlvbjwvc3Ryb25nPiB0YWIgc2V0IGFzIHRoZSBkZWZhdWx0Ljwvc3Bhbj48L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5JbiB0aGUgTmFtZSBmaWVsZCwgdHlwZSBhIHVuaXF1ZSBuYW1lIGZvciB5b3VyIHRhc2suIHRoZSB0YXNrIG5hbWUKLWlzIHRoZSBmaWxlIG5hbWUgdGhhdCBhcHBlYXJzIGluIHRoZSA8YSBocmVmPSJsaWJyYXJ5dmlldy5odG1sI2xpYnJhcnl2aWV3Ij5MaWJyYXJ5IFZpZXc8L2E+Ljwvc3Bhbj48L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5JbiB0aGUgUHJlc2VudGF0aW9uIG5hbWUgZmllbGQsIHR5cGUgYSBwcmVzZW50YXRpb24gbmFtZS4gVGhlIHByZXNlbnRhdGlvbgotbmFtZSBpcyB0aGUgbmFtZSB0aGF0IGFwcGVhcnMgaW4geW91ciBwdWJsaXNoZWQgY29udGVudCBhbmQgaW4gdGhlIDxhIGhyZWY9ImNvbmZpZ3VyYXRpb252aWV3Lmh0bWwiPkNvbmZpZ3VyYXRpb24gVmlldzwvYT4uCi1Zb3UgY2FuIGFsc28gbWFrZSB0aGlzIG5hbWUgYXBwZWFyIGluIHRoZSBMaWJyYXJ5IHZpZXcgYnkgdG9nZ2xpbmcgdGhlIDxzdHJvbmc+U2hvdwotUHJlc2VudGF0aW9uIE5hbWVzPC9zdHJvbmc+IGJ1dHRvbiBpbiB0aGUgTGlicmFyeSB2aWV3IHRvb2xiYXIuPC9zcGFuPiA8L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5JbiB0aGUgQnJpZWYgRGVzY3JpcHRpb24gZmllbGQsIHR5cGUgYSBzaG9ydCBkZXNjcmlwdGlvbiBvZiB0aGUKLW5ldyB0YXNrLjwvc3Bhbj48L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5UeXBlIGEgbW9yZSBkZXRhaWxlZCBkZXNjcmlwdGlvbiBvZiB0aGUgbmV3IHRhc2sgaW4gdGhlIE1haW4gRGVzY3JpcHRpb24KLWZpZWxkLiBUaGUgbWFpbiBkZXNjcmlwdGlvbiBpcyBhIG1vcmUgZGV0YWlsZWQgdmVyc2lvbiBvZiB0aGUgZGVzY3JpcHRpb24KLXlvdSB0eXBlZCBpbnRvIHRoZSBCcmllZiBEZXNjcmlwdGlvbiBmaWVsZC4gVGhlcmUgYXJlIHRocmVlIHdheXMgeW91IGNhbiBjcmVhdGUKLXRleHQgZm9yIHRoZSBkZXNjcmlwdGlvbjo8L3NwYW4+IDx1bD48bGk+RGlyZWN0bHksIGJ5IHR5cGluZyBpdCBtYW51YWxseSBpbiB0aGUgZWRpdG9yLjwvbGk+Ci08bGk+Q29weSBmcm9tIGFub3RoZXIgc2ltaWxhciByb2xlIGFuZCB0aGVuIG1vZGlmeSBieSB1c2luZyB0aGUgZWRpdG9yLjwvbGk+Ci08bGk+Q29weSBmcm9tIGFuIEhUTUwgc291cmNlIHN1Y2ggYXMgYSBwdWJsaXNoZWQgT3BlblVQL0Jhc2ljIFdlYiBzaXRlLjwvbGk+Ci08L3VsPgotPGRpdiBjbGFzcz0ibm90ZSI+PHNwYW4gY2xhc3M9Im5vdGV0aXRsZSI+Tm90ZTo8L3NwYW4+IFlvdSBjYW4gdXNlIHRoZSBSaWNoIFRleHQgRWRpdG9yIHRvIGVkaXQgb3IgZW50ZXIgdGhlIHRleHQgZm9yCi1hbnkgZmllbGQgdGhhdCBoYXMgYSB0d2lzdHkgc3ltYm9sIDxpbWcgc3JjPSJjb2xsYXBzZWQuZ2lmIiBhbHQ9IiIgLz4uIFNpbXBseSBjbGljayB0aGUgc3ltYm9sIHRvIGFjY2VzcyB0aGUgUmljaCBUZXh0IEVkaXRvci4gQ2xpY2sgdGhlCi1zeW1ib2wgYWdhaW4gdG8gY2xvc2UgdGhlIFJpY2ggVGV4dCBFZGl0b3IuIEZvciBtb3JlIGluZm9ybWF0aW9uIHNlZSA8YSBocmVmPSJyaWNodGV4dGVkaXRvci5odG1sI3JpY2h0ZXh0ZWRpdG9yIj5SaWNoIFRleHQgRWRpdG9yPC9hPi48L2Rpdj4KLTwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkNvbXBsZXRlIHRoZSBvdGhlciB0YXNrIHNwZWNpZmljIGZpZWxkcyBpbiBEZXRhaWwgSW5mb3JtYXRpb24gYXMKLW5lZWRlZC4gU2VlIDxhIGhyZWY9InZhcmlhYmlsaXR5Lmh0bWwjdmFyaWFiaWxpdHkiPlZhcmlhYmlsaXR5PC9hPiBmb3IKLWluZm9ybWF0aW9uIG9uIGNyZWF0aW5nIHZhcmlhYmlsaXR5LiA8L3NwYW4+PC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+Q2xpY2sgdGhlIDxzdHJvbmc+U3RlcHM8L3N0cm9uZz4gdGFiLiBUaGUgU3RlcHMgRWRpdG9yIGFwcGVhcnMuPC9zcGFuPiA8ZGl2IGNsYXNzPSJwIj5BCi10YXNrIGNhbiBoYXZlIGEgc2VyaWVzIG9mIHN0ZXBzIHRoYXQgZGV0YWlsIGhvdyB0byBwZXJmb3JtIHRoYXQgdGFzay4gVGhlCi1TdGVwIEVkaXRvciBhbGxvd3MgeW91IHRvOjx1bD48bGk+Q3JlYXRlIGEgbmV3IHN0ZXA8dWw+PGxpPkNsaWNrIHRoZSA8c3Ryb25nPk5ldzwvc3Ryb25nPiBidXR0b24uPC9saT4KLTxsaT5HaXZlIHRoZSBUYXNrIGEgbmFtZSBpbiB0aGUgPHN0cm9uZz5OYW1lPC9zdHJvbmc+IGZpZWxkLjwvbGk+Ci08bGk+RGVzY3JpYmUgdGhlIFRhc2sgaW4gdGhlIDxzdHJvbmc+RGVzY3JpcHRpb248L3N0cm9uZz4gZmllbGQuPC9saT4KLTwvdWw+Ci08L2xpPgotPGxpPlJlbW92ZSBhIHN0ZXA8dWw+PGxpPlNlbGVjdCB0aGUgc3RlcCB0byByZW1vdmUgaW4gdGhlIDxzdHJvbmc+U3RlcHM8L3N0cm9uZz4gZmllbGQuPC9saT4KLTxsaT5DbGljayB0aGUgPHN0cm9uZz5EZWxldGU8L3N0cm9uZz4gYnV0dG9uLjwvbGk+Ci08L3VsPgotPC9saT4KLTxsaT5Nb3ZlIGEgc3RlcCB1cCB0aGUgbGlzdDx1bD48bGk+U2VsZWN0IHRoZSBzdGVwIHlvdSB3YW50IHRvIG1vdmUgdXAuPC9saT4KLTxsaT5DbGljayB0aGUgPHN0cm9uZz5Nb3ZlIFVwPC9zdHJvbmc+IGJ1dHRvbi48L2xpPgotPC91bD4KLTwvbGk+Ci08bGk+TW92ZSBhIHN0ZXAgZG93biB0aGUgbGlzdDx1bD48bGk+U2VsZWN0IHRoZSBzdGVwIHlvdSB3YW50IHRvIG1vdmUgZG93bi48L2xpPgotPGxpPkNsaWNrIHRoZSA8c3Ryb25nPk1vdmUgRG93bjwvc3Ryb25nPiBidXR0b248L2xpPgotPC91bD4KLTwvbGk+Ci08L3VsPgotPC9kaXY+Ci08L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5DbGljayB0aGUgPHN0cm9uZz5Sb2xlczwvc3Ryb25nPiB0YWIuIFRoaXMgcGFydCBvZiB0aGUgZWRpdG9yIGFsbG93cyB5b3UKLXRvIGRlZmluZSB0aGUgcm9sZXMgdGhhdCBwZXJmb3JtIHRoZSB0YXNrLiBZb3Ugc2hvdWxkIHNlbGVjdCBhIHJvbGUgYXMgdGhlCi1QZXJmb3JtaW5nIFJvbGUgZm9yIHRoaXMgdGFzay4gWW91IGNhbiBhbHNvIGFkZCBvbmUgb3IgbW9yZSByb2xlcyBhcyBBZGRpdGlvbmFsCi1QZXJmb3JtZXJzLiBUbyBhZGQgYSByb2xlLCBjbGljayB0aGUgPHN0cm9uZz5TZWxlY3Q8L3N0cm9uZz4gb3IgPHN0cm9uZz5BZGQ8L3N0cm9uZz4gYnV0dG9uIGFzCi1hcHByb3ByaWF0ZSwgc2VsZWN0IHRoZSByb2xlIHlvdSB3YW50IHRvIGFkZCwgYW5kIHRoZW4gY2xpY2sgPHN0cm9uZz5PSzwvc3Ryb25nPi4gVG8KLXJlbW92ZSBhIHJvbGUsIHNlbGVjdCBpdCBpbiB0aGUgR3VpZGFuY2UgYm94LCBhbmQgdGhlbiBjbGljayA8c3Ryb25nPkNsZWFyPC9zdHJvbmc+IG9yIDxzdHJvbmc+UmVtb3ZlPC9zdHJvbmc+IGFzCi1hcHByb3ByaWF0ZS4gV2hlbiB5b3Ugc2VsZWN0IGEgcm9sZSB0aGUgYnJpZWYgZGVzY3JpcHRpb24gb2YgdGhhdCByb2xlIGlzCi1kaXNwbGF5ZWQuPC9zcGFuPjwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkNsaWNrIHRoZSA8c3Ryb25nPldvcmsgUHJvZHVjdHM8L3N0cm9uZz4gdGFiLiBUaGlzIHBhcnQgb2YgdGhlIGVkaXRvciBhbGxvd3MKLXlvdSB0byBkZWZpbmUgdGhlIHdvcmsgcHJvZHVjdHMgdGhhdCBhcmUgaW5wdXRzIGFuZCBvdXRwdXRzIGZvciB0aGlzIHRhc2suCi1Zb3UgY2FuIHNlbGVjdCBhbnkgbnVtYmVyIG9mIHdvcmsgcHJvZHVjdHMgYXMgTWFuZGF0b3J5IElucHV0cywgT3B0aW9uYWwgSW5wdXRzLAotYW5kIE91dHB1dHMuIFRvIGFkZCBhIHdvcmsgcHJvZHVjdCwgY2xpY2sgdGhlIGFwcHJvcHJpYXRlIDxzdHJvbmc+QWRkPC9zdHJvbmc+IGJ1dHRvbiwKLXNlbGVjdCB0aGUgd29yayBwcm9kdWN0cyB5b3Ugd2FudCB0byBhZGQsIGFuZCB0aGVuIGNsaWNrIDxzdHJvbmc+T0s8L3N0cm9uZz4uIFRvIHJlbW92ZQotYSB3b3JrIHByb2R1Y3QsIHNlbGVjdCBpdCBpbiB0aGUgYXBwcm9wcmlhdGUgYm94IGFuZCB0aGVuIGNsaWNrIHRoZSBjb3JyZXNwb25kaW5nIDxzdHJvbmc+UmVtb3ZlPC9zdHJvbmc+IGJ1dHRvbi4KLVdoZW4geW91IHNlbGVjdCBhIHdvcmsgcHJvZHVjdCB0aGUgYnJpZWYgZGVzY3JpcHRpb24gb2YgdGhlIHdvcmsgcHJvZHVjdCBpcwotZGlzcGxheWVkLjwvc3Bhbj48L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5DbGljayB0aGUgPHN0cm9uZz5HdWlkYW5jZTwvc3Ryb25nPiB0YWIuIFRoaXMgcGFydCBvZiB0aGUgZWRpdG9yIGFsbG93cyB5b3UKLXRvIGFkZCBhbmQgcmVtb3ZlIGd1aWRhbmNlIGZvciB0aGUgdGFzay4gVG8gYWRkIGd1aWRhbmNlLCBjbGljayB0aGUgPHN0cm9uZz5BZGQ8L3N0cm9uZz4gYnV0dG9uLAotc2VsZWN0IHRoZSBndWlkYW5jZSB5b3Ugd2FudCB0byBhZGQsIGFuZCB0aGVuIGNsaWNrIDxzdHJvbmc+T0s8L3N0cm9uZz4uIFRvIHJlbW92ZSBndWlkYW5jZSwKLXNlbGVjdCBpdCBpbiB0aGUgR3VpZGFuY2UgYm94IGFuZCB0aGVuIGNsaWNrIDxzdHJvbmc+UmVtb3ZlPC9zdHJvbmc+LiBXaGVuIHlvdSBzZWxlY3QKLWEgZ3VpZGFuY2UgZWxlbWVudCB0aGUgYnJpZWYgZGVzY3JpcHRpb24gb2YgdGhlIGd1aWRhbmNlIGlzIGRpc3BsYXllZC48L3NwYW4+PC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+Q2xpY2sgdGhlIDxzdHJvbmc+Q2F0ZWdvcmllczwvc3Ryb25nPiB0YWIuIEEgdGFzayBjYW4gYmUgaW5jbHVkZWQgaW4gb25lCi1kaXNjaXBsaW5lIGFuZCBhbnkgbnVtYmVyIG9mIGN1c3RvbSBjYXRlZ29yaWVzLiBPcGVuIHRoZSBTZWxlY3QgZGlhbG9nIGJ5Ci1jbGlja2luZyB0aGUgYXBwcm9wcmlhdGUgPHN0cm9uZz5TZWxlY3Q8L3N0cm9uZz4gb3IgPHN0cm9uZz5BZGQ8L3N0cm9uZz4gYnV0dG9uIG5leHQgdG8gdGhlIGNhdGVnb3J5Ci1saXN0cy4gU2VsZWN0IGEgc2luZ2xlIGRpc2NpcGxpbmUgb3IgYW55IG51bWJlciBvZiBjdXN0b20gY2F0ZWdvcmllcywgYW5kCi10aGVuIGNsaWNrIDxzdHJvbmc+T0s8L3N0cm9uZz4uIFlvdSBjYW4gcmVtb3ZlIGEgdGFzayBmcm9tIGEgY2F0ZWdvcnkgYnkgc2VsZWN0aW5nIGl0Ci1hbmQgdGhlbiBjbGlja2luZyB0aGUgYXBwcm9wcmlhdGUgPHN0cm9uZz5SZW1vdmU8L3N0cm9uZz4gYnV0dG9uLjwvc3Bhbj48L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5DbGljayB0aGUgPHN0cm9uZz5QcmV2aWV3PC9zdHJvbmc+IHRhYiB0byB2aWV3IHRoZSBuZXdseSBjcmVhdGVkIHRhc2sgYXMKLWl0IHdpbGwgYXBwZWFyIGluIGEgcHVibGlzaGVkIFdlYiBwYWdlLCBhbmQgdGhlbiBzYXZlIGJ5IGNsb3NpbmcgdGhlIHRhYi48L3NwYW4+PC9saT4KLTwvb2w+Ci08L2Rpdj4KLTxkaXY+Ci08ZGl2IGNsYXNzPSJmYW1pbHlsaW5rcyI+Ci08ZGl2IGNsYXNzPSJwYXJlbnRsaW5rIj48c3Ryb25nPlBhcmVudCB0b3BpYzo8L3N0cm9uZz4gPGEgaHJlZj0iY3JlYXRlbWV0aG9kY29udGVudC5odG1sIj5DcmVhdGUgTWV0aG9kIENvbnRlbnQ8L2E+PC9kaXY+Ci08L2Rpdj4KLTxkaXYgY2xhc3M9InJlbGNvbmNlcHRzIj48c3Ryb25nPlJlbGF0ZWQgY29uY2VwdHM8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0ibWV0aG9kY29udGVudC5odG1sI2NyZWF0aW5ncmV1c2FibGVtZXRob2Rjb250ZW50cyI+TWV0aG9kIENvbnRlbnQ8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9InZhcmlhYmlsaXR5Lmh0bWwjdmFyaWFiaWxpdHkiIHRpdGxlPSJWYXJpYWJpbGl0eSBhbGxvd3MgZWxlbWVudHMgaW4gb25lIGNvbnRlbnQgcGFja2FnZSB0byBpbmZsdWVuY2Ugb3IgbW9kaWZ5IGVsZW1lbnRzIGluIG90aGVyIGNvbnRlbnQgcGFja2FnZXMgd2l0aG91dCBhY3R1YWxseSBkaXJlY3RseSBtb2RpZnlpbmcgdGhlIG9yaWdpbmFsIGNvbnRlbnQuIFZhcmlhYmlsaXR5IGVuYWJsZXMgY2hhbmdlcyB0byB0aGUgY29udGVudCB3aGlsZSBrZWVwaW5nIHRoZSBjaGFuZ2VzIHNlcGFyYXRlIGFuZCBvcHRpb25hbC4iPlZhcmlhYmlsaXR5PC9hPjwvZGl2PgotPC9kaXY+Ci08ZGl2IGNsYXNzPSJyZWx0YXNrcyI+PHN0cm9uZz5SZWxhdGVkIHRhc2tzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9ImNyZWF0ZWFyb2xlLmh0bWwjY3JlYXRlYXJvbGUiPkNyZWF0ZSBhIFJvbGU8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9ImNyZWF0ZWF3b3JrcHJvZHVjdC5odG1sI2NyZWF0ZWF3b3JrcHJvZHVjdCI+Q3JlYXRlIGEgV29yayBQcm9kdWN0PC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJjcmVhdGVndWlkYW5jZS5odG1sI2NyZWF0ZWd1aWRhbmNlIj5DcmVhdGUgR3VpZGFuY2U8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvY3JlYXRlYXdvcmtwcm9kdWN0Lmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9jcmVhdGVhd29ya3Byb2R1Y3QuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWY3NGY5MS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9jcmVhdGVhd29ya3Byb2R1Y3QuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDEyMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGh0bWwKLSAgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9InNlY3VyaXR5IiBjb250ZW50PSJwdWJsaWMiIC8+Ci08bWV0YSBuYW1lPSJSb2JvdHMiIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgbmFtZT0iREMuVHlwZSIgY29udGVudD0idGFzayIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJDcmVhdGUgYSBXb3JrIFByb2R1Y3QiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9ImNyZWF0ZW1ldGhvZGNvbnRlbnQuaHRtbCNjcmVhdGVtZXRob2Rjb250ZW50IiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJjcmVhdGVhcm9sZS5odG1sI2NyZWF0ZWFyb2xlIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJjcmVhdGVhdGFzay5odG1sIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJ2YXJpYWJpbGl0eS5odG1sI3ZhcmlhYmlsaXR5IiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJjcmVhdGVndWlkYW5jZS5odG1sI2NyZWF0ZWd1aWRhbmNlIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJjcmVhdGVtZXRob2Rjb250ZW50Lmh0bWwiIC8+Ci08bWV0YSBuYW1lPSJEQy5Gb3JtYXQiIGNvbnRlbnQ9IlhIVE1MIiAvPgotPG1ldGEgbmFtZT0iREMuSWRlbnRpZmllciIgY29udGVudD0iY3JlYXRlYXdvcmtwcm9kdWN0IiAvPgotPG1ldGEgbmFtZT0iREMuTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIiAvPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuL2libWRpdGEuY3NzIiAvPgotPHRpdGxlPkNyZWF0ZSBhIFdvcmsgUHJvZHVjdDwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0iY3JlYXRlYXdvcmtwcm9kdWN0Ij48YSBuYW1lPSJjcmVhdGVhd29ya3Byb2R1Y3QiPjwhLS0gLS0+PC9hPgotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5DcmVhdGUgYSBXb3JrIFByb2R1Y3Q8L2gxPgotPGRpdj48ZGl2IGNsYXNzPSJwIj48ZGl2IGNsYXNzPSJwIj5Xb3JrIHByb2R1Y3QgaXMgYSBnZW5lcmFsIHRlcm0gZm9yIHRhc2sgaW5wdXRzIGFuZCBvdXRwdXRzLiBUaGVyZQotYXJlIHRocmVlIHR5cGVzIG9mIHdvcmsgcHJvZHVjdDo8dWw+PGxpPjxhIGhyZWY9ImFydGlmYWN0Lmh0bWwjYXJ0aWZhY3QiPkFydGlmYWN0PC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0ib3V0Y29tZS5odG1sI291dGNvbWUiPk91dGNvbWU8L2E+PC9saT4KLTxsaT48YSBocmVmPSJkZWxpdmVyYWJsZS5odG1sI2RlbGl2ZXJhYmxlIj5EZWxpdmVyYWJsZTwvYT48L2xpPgotPC91bD4KLTwvZGl2PgotWW91IHNob3VsZCBhbHdheXMgY3JlYXRlIG5ldyBtZXRob2QgY29udGVudCBpbiBhIDxhIGhyZWY9Im1ldGhvZHBsdWdpbi5odG1sI21ldGhvZHBsdWdpbiI+TWV0aG9kIFBsdWctaW48L2E+IHRoYXQgeW91IHByb2R1Y2UuPC9kaXY+Ci08ZGl2IGNsYXNzPSJzZWN0aW9uIj5UbyBjcmVhdGUgYSB3b3JrIHByb2R1Y3Q6PC9kaXY+Ci08b2w+PGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5FeHBhbmQgdGhlIENvbnRlbnQgUGFja2FnZSBpbiB3aGljaCB5b3Ugd2FudCB0byBjcmVhdGUgdGhlIHdvcmsKLXByb2R1Y3QuPC9zcGFuPjwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPlJpZ2h0IGNsaWNrIDxzdHJvbmc+V29yayBQcm9kdWN0czwvc3Ryb25nPiwgYW5kIHRoZW4gc2VsZWN0IG9uZSBvZiB0aGUgZm9sbG93aW5nOjwvc3Bhbj4gPHVsPjxsaT48c3Ryb25nPk5ldyAmZ3Q7IEFydGlmYWN0PC9zdHJvbmc+PC9saT4KLTxsaT48c3Ryb25nPk5ldyAmZ3Q7IE91dGNvbWU8L3N0cm9uZz48L2xpPgotPGxpPjxzdHJvbmc+TmV3ICZndDsgRGVsaXZlcmFibGU8L3N0cm9uZz48L2xpPgotPC91bD4KLVRoZSBXb3JrIFByb2R1Y3QgZWRpdG9yIGZvciB0aGUgc3BlY2lmaWMgdHlwZSBvZiB3b3JrIHByb2R1Y3QgeW91IGFyZQotY3JlYXRpbmcgYXBwZWFycyB3aXRoIHRoZSBEZXNjcmlwdGlvbiB0YWIgc2V0IGFzIHRoZSBkZWZhdWx0LjwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkluIHRoZSBOYW1lIGZpZWxkLCB0eXBlIGEgdW5pcXVlIG5hbWUgZm9yIHlvdXIgd29yayBwcm9kdWN0LiBUaGUKLXdvcmsgcHJvZHVjdCBuYW1lIGlzIHRoZSBmaWxlIG5hbWUgdGhhdCBhcHBlYXJzIGluIHRoZSA8YSBocmVmPSJsaWJyYXJ5dmlldy5odG1sI2xpYnJhcnl2aWV3Ij5MaWJyYXJ5IFZpZXc8L2E+LiA8L3NwYW4+PC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+SW4gdGhlIFByZXNlbnRhdGlvbiBuYW1lIGZpZWxkLCB0eXBlIGEgcHJlc2VudGF0aW9uIG5hbWUuIHRoZSBwcmVzZW50YXRpb24KLW5hbWUgaXMgdGhlIG5hbWUgdGhhdCBhcHBlYXJzIGluIHlvdXIgcHVibGlzaGVkIGNvbnRlbnQgYW5kIGluIHRoZSA8YSBocmVmPSJjb25maWd1cmF0aW9udmlldy5odG1sI2NvbmZpZ3VyYXRpb252aWV3Ij5Db25maWd1cmF0aW9uIFZpZXc8L2E+LiBZb3UgY2FuIGFsc28gbWFrZSB0aGlzIG5hbWUgYXBwZWFyIGluIHRoZSBsaWJyYXJ5Ci12aWV3IGJ5IHRvZ2dsaW5nIHRoZSA8c3Ryb25nPlNob3cgUHJlc2VudGF0aW9uIE5hbWVzPC9zdHJvbmc+IGJ1dHRvbiBpbiB0aGUgbGlicmFyeQotdmlldyB0b29sYmFyLjwvc3Bhbj48L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5JbiB0aGUgQnJpZWYgRGVzY3JpcHRpb24gZmllbGQsIHR5cGUgYSBzaG9ydCBkZXNjcmlwdGlvbiBvZiB0aGUKLW5ldyB3b3JrIHByb2R1Y3QuPC9zcGFuPjwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPlR5cGUgYSBtb3JlIGRldGFpbGVkIGRlc2NyaXB0aW9uIG9mIHRoZSBuZXcgd29yayBwcm9kdWN0IGluIHRoZQotTWFpbiBEZXNjcmlwdGlvbiBmaWVsZC4gVGhlIG1haW4gZGVzY3JpcHRpb24gaXMgYSBtb3JlIGRldGFpbGVkIHZlcnNpb24gb2YKLXRoZSBkZXNjcmlwdGlvbiB5b3UgdHlwZWQgaW50byB0aGUgQnJpZWYgRGVzY3JpcHRpb24gZmllbGQuIFRoZXJlIGFyZSB0aHJlZQotd2F5cyB0byBjcmVhdGUgdGV4dCBmb3IgdGhlIGRlc2NyaXB0aW9uOjwvc3Bhbj4gPHVsPjxsaT5EaXJlY3RseSwgYnkgdHlwaW5nIGl0IG1hbnVhbGx5IGluIHRoZSBlZGl0b3IuPC9saT4KLTxsaT5Db3B5IGZyb20gYW5vdGhlciBzaW1pbGFyIHdvcmsgcHJvZHVjdCBhbmQgdGhlbiBtb2RpZnkgdXNpbmcgdGhlIGVkaXRvci48L2xpPgotPGxpPkNvcHkgZnJvbSBhbiBIVE1MIHNvdXJjZSwgc3VjaCBhcyBhIHB1Ymxpc2hlZCBPcGVuVVAvQmFzaWMgV2ViIHNpdGUuPC9saT4KLTwvdWw+Ci08ZGl2IGNsYXNzPSJub3RlIj48c3BhbiBjbGFzcz0ibm90ZXRpdGxlIj5Ob3RlOjwvc3Bhbj4gWW91IGNhbiB1c2UgdGhlIFJpY2ggVGV4dCBFZGl0b3IgdG8gZWRpdCBvciBlbnRlciB0aGUgdGV4dCBmb3IKLWFueSBmaWVsZCB0aGF0IGhhcyBhIHR3aXN0eSBzeW1ib2wgPGltZyBzcmM9ImNvbGxhcHNlZC5naWYiIGFsdD0iIiAvPi4gU2ltcGx5IGNsaWNrIHRoZSBzeW1ib2wgdG8gYWNjZXNzIHRoZSBSaWNoIFRleHQgRWRpdG9yLiBDbGljayB0aGUKLXN5bWJvbCBhZ2FpbiB0byBjbG9zZSB0aGUgUmljaCBUZXh0IEVkaXRvci4gRm9yIG1vcmUgaW5mb3JtYXRpb24gc2VlIDxhIGhyZWY9InJpY2h0ZXh0ZWRpdG9yLmh0bWwjcmljaHRleHRlZGl0b3IiPlJpY2ggVGV4dCBFZGl0b3I8L2E+LjwvZGl2PgotPC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+VW5kZXIgPHN0cm9uZz5Ob3RhdGlvbjwvc3Ryb25nPiwgcHJvdmlkZSBhbnkgbm90YXRpb25zIGFib3V0IHRoZSBXb3JrIFByb2R1Y3QuPC9zcGFuPiA8ZGl2IGNsYXNzPSJub3RlIj48c3BhbiBjbGFzcz0ibm90ZXRpdGxlIj5Ob3RlOjwvc3Bhbj4gQXJ0aWZhY3RzIGFuZCBEZWxpdmVyYWJsZXMgY29udGFpbiB0aGUgTm90YXRpb24gZmllbGRzLCB3aGlsZQotT3V0Y29tZXMgZG8gbm90LjwvZGl2PgotPC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+VW5kZXIgPHN0cm9uZz5JY29uPC9zdHJvbmc+IHlvdSBjYW4gc2VsZWN0IGEgbm9kZSBpY29uIHRvIGFwcGVhciB3aXRoIHRoZQotd29yayBwcm9kdWN0IGluIHRoZSBMaWJyYXJ5IGFuZCBDb25maWd1cmF0aW9uIHZpZXdzIGFuZCBpbiB0aGUgdHJlZSBicm93c2VyCi1pbiBhIHB1Ymxpc2hlZCBXZWIgc2l0ZS4gVGhlIG5vZGUgaWNvbiBzaG91bGQgYmUgMTYgeCAxNiBwaXhlbHMuIFlvdSBjYW4gYWxzbwotc2VsZWN0IGEgU2hhcGUgaWNvbiB0byBhcHBlYXIgYXQgdGhlIHRvcCBvZiB0aGUgcHVibGlzaGVkIFdlYiBwYWdlIGZvciB0aGUKLXdvcmsgcHJvZHVjdC4gdGhlIFNoYXBlIGljb24gc2hvdWxkIGJlIDMyIHggMzIgcGl4ZWxzLjwvc3Bhbj48L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5Db21wbGV0ZSB0aGUgb3RoZXIgd29yayBwcm9kdWN0IHNwZWNpZmljIGZpZWxkcyBhcyBuZWVkZWQuIFNlZSA8YSBocmVmPSJ2YXJpYWJpbGl0eS5odG1sI3ZhcmlhYmlsaXR5Ij5WYXJpYWJpbGl0eTwvYT4gZm9yIGluZm9ybWF0aW9uCi1vbiBhZGRpbmcgdmFyaWFiaWxpdHkgdG8geW91ciB3b3JrIHByb2R1Y3QuPC9zcGFuPjwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPlNlbGVjdCB0aGUgPHN0cm9uZz5HdWlkYW5jZTwvc3Ryb25nPiB0YWIuIFRoaXMgcGFydCBvZiB0aGUgZWRpdG9yIGFsbG93cwoteW91IHRvIGFkZCBhbmQgcmVtb3ZlIGd1aWRhbmNlIGZvciB0aGUgd29yayBwcm9kdWN0LiBUbyBhZGQgZ3VpZGFuY2UsIGNsaWNrCi10aGUgPHN0cm9uZz5BZGQ8L3N0cm9uZz4gYnV0dG9uLCBzZWxlY3QgdGhlIGd1aWRhbmNlIHlvdSB3YW50IHRvIGFkZCwgYW5kIHRoZW4gY2xpY2sgPHN0cm9uZz5PSzwvc3Ryb25nPi4KLVRvIHJlbW92ZSBndWlkYW5jZSwgc2VsZWN0IGl0IGluIHRoZSBHdWlkYW5jZSBmaWVsZCwgYW5kIHRoZW4gY2xpY2sgPHN0cm9uZz5SZW1vdmU8L3N0cm9uZz4uCi1XaGVuIHlvdSBzZWxlY3QgYSBndWlkYW5jZSBlbGVtZW50IHRoZSBicmllZiBkZXNjcmlwdGlvbiBvZiB0aGUgZ3VpZGFuY2UgaXMKLWRpc3BsYXllZC48L3NwYW4+PC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+U2VsZWN0IHRoZSA8c3Ryb25nPkNhdGVnb3JpZXM8L3N0cm9uZz4gdGFiLiBBIHdvcmsgcHJvZHVjdCBjYW4gYmUgaW5jbHVkZWQKLWluIG9uZSBkb21haW4sIGFueSBudW1iZXIgb2Ygd29yayBwcm9kdWN0IHR5cGVzLCBhbmQgYW55IG51bWJlciBvZiBjdXN0b20KLWNhdGVnb3JpZXMuIE9wZW4gdGhlIGFwcHJvcHJpYXRlIFNlbGVjdCBkaWFsb2cgYnkgY2xpY2tpbmcgdGhlIDxzdHJvbmc+U2VsZWN0PC9zdHJvbmc+IG9yIDxzdHJvbmc+QWRkPC9zdHJvbmc+IGJ1dHRvbgotbmV4dCB0byB0aGUgY2F0ZWdvcnkgbGlzdHMuIFNlbGVjdCBhIHNpbmdsZSBkb21haW4gb3IgYW55IG51bWJlciBvZiB3b3JrIHByb2R1Y3QKLWtpbmRzIG9yIGN1c3RvbSBjYXRlZ29yaWVzIGFuZCB0aGVuIGNsaWNrIDxzdHJvbmc+T0s8L3N0cm9uZz4uIFlvdSBjYW4gcmVtb3ZlIGEgd29yawotcHJvZHVjdCBmcm9tIGEgY2F0ZWdvcnkgYnkgc2VsZWN0aW5nIGl0IGFuZCB0aGVuIGNsaWNraW5nIHRoZSBhcHByb3ByaWF0ZSA8c3Ryb25nPlJlbW92ZTwvc3Ryb25nPiBidXR0b24uPC9zcGFuPjwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPklmIHRoZSB3b3JrIHByb2R1Y3QgaXMgYSBkZWxpdmVyYWJsZSwgeW91IGNhbiBkZWZpbmUgd2hhdCB0aGUgZGVsaXZlcmFibGUKLWNvbnNpc3RzIG9mIG9uIHRoZSBEZWxpdmVyYWJsZSBQYXJ0cyB0YWIuIENsaWNrIHRoZSA8c3Ryb25nPkRlbGl2ZXJhYmxlIFBhcnRzPC9zdHJvbmc+IHRhYi4KLVRoaXMgcGFydCBvZiB0aGUgZWRpdG9yIG9ubHkgYXBwZWFycyBmb3IgZGVsaXZlcmFibGVzIGFuZCBpdCBhbGxvd3MgeW91IHRvCi1hZGQgb3RoZXIgd29yayBwcm9kdWN0cyBhcyBwYXJ0IG9mIHRoZSBkZWxpdmVyYWJsZS4gVG8gYWRkIHdvcmsgcHJvZHVjdHMsCi1jbGljayB0aGUgPHN0cm9uZz5BZGQ8L3N0cm9uZz4gYnV0dG9uLCBzZWxlY3QgdGhlIHdvcmsgcHJvZHVjdHMgeW91IHdhbnQgdG8gYWRkLCBhbmQKLXRoZW4gY2xpY2sgPHN0cm9uZz5PSzwvc3Ryb25nPi4gVG8gcmVtb3ZlIGEgd29yayBwcm9kdWN0LCBzZWxlY3QgaXQgaW4gdGhlIHdvcmsgcHJvZHVjdHMKLWFzIGRlbGl2ZXJhYmxlIHBhcnRzOiBmaWVsZCwgYW5kIHRoZW4gY2xpY2sgPHN0cm9uZz5SZW1vdmU8L3N0cm9uZz4uIFdoZW4geW91IHNlbGVjdAotYSB3b3JrIHByb2R1Y3QgdGhlIGJyaWVmIGRlc2NyaXB0aW9uIG9mIHRoZSB3b3JrIHByb2R1Y3QgaXMgZGlzcGxheWVkLjwvc3Bhbj48L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5TZWxlY3QgdGhlIDxzdHJvbmc+UHJldmlldzwvc3Ryb25nPiB0YWIgdG8gdmlldyB0aGUgbmV3bHkgY3JlYXRlZCB3b3JrIHByb2R1Y3QsCi1hbmQgdGhlbiBzYXZlIGJ5IGNsb3NpbmcgdGhlIHRhYi48L3NwYW4+PC9saT4KLTwvb2w+Ci08L2Rpdj4KLTxkaXY+Ci08ZGl2IGNsYXNzPSJmYW1pbHlsaW5rcyI+Ci08ZGl2IGNsYXNzPSJwYXJlbnRsaW5rIj48c3Ryb25nPlBhcmVudCB0b3BpYzo8L3N0cm9uZz4gPGEgaHJlZj0iY3JlYXRlbWV0aG9kY29udGVudC5odG1sIj5DcmVhdGUgTWV0aG9kIENvbnRlbnQ8L2E+PC9kaXY+Ci08L2Rpdj4KLTxkaXYgY2xhc3M9InJlbGNvbmNlcHRzIj48c3Ryb25nPlJlbGF0ZWQgY29uY2VwdHM8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0idmFyaWFiaWxpdHkuaHRtbCN2YXJpYWJpbGl0eSIgdGl0bGU9IlZhcmlhYmlsaXR5IGFsbG93cyBlbGVtZW50cyBpbiBvbmUgY29udGVudCBwYWNrYWdlIHRvIGluZmx1ZW5jZSBvciBtb2RpZnkgZWxlbWVudHMgaW4gb3RoZXIgY29udGVudCBwYWNrYWdlcyB3aXRob3V0IGFjdHVhbGx5IGRpcmVjdGx5IG1vZGlmeWluZyB0aGUgb3JpZ2luYWwgY29udGVudC4gVmFyaWFiaWxpdHkgZW5hYmxlcyBjaGFuZ2VzIHRvIHRoZSBjb250ZW50IHdoaWxlIGtlZXBpbmcgdGhlIGNoYW5nZXMgc2VwYXJhdGUgYW5kIG9wdGlvbmFsLiI+VmFyaWFiaWxpdHk8L2E+PC9kaXY+Ci08L2Rpdj4KLTxkaXYgY2xhc3M9InJlbHRhc2tzIj48c3Ryb25nPlJlbGF0ZWQgdGFza3M8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iY3JlYXRlbWV0aG9kY29udGVudC5odG1sI2NyZWF0ZW1ldGhvZGNvbnRlbnQiPkNyZWF0ZSBNZXRob2QgQ29udGVudDwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iY3JlYXRlYXJvbGUuaHRtbCNjcmVhdGVhcm9sZSI+Q3JlYXRlIGEgUm9sZTwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iY3JlYXRlYXRhc2suaHRtbCI+Q3JlYXRlIGEgVGFzazwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iY3JlYXRlZ3VpZGFuY2UuaHRtbCNjcmVhdGVndWlkYW5jZSI+Q3JlYXRlIEd1aWRhbmNlPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2NyZWF0ZWd1aWRhbmNlLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9jcmVhdGVndWlkYW5jZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOWYzMzA4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2NyZWF0ZWd1aWRhbmNlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMDIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJzZWN1cml0eSIgY29udGVudD0icHVibGljIiAvPgotPG1ldGEgbmFtZT0iUm9ib3RzIiBjb250ZW50PSJpbmRleCxmb2xsb3ciIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIG5hbWU9IkRDLlR5cGUiIGNvbnRlbnQ9InRhc2siIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iQ3JlYXRlIEd1aWRhbmNlIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJjcmVhdGVtZXRob2Rjb250ZW50Lmh0bWwjY3JlYXRlbWV0aG9kY29udGVudCIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iY3JlYXRlYXJvbGUuaHRtbCIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iY3JlYXRlYXRhc2suaHRtbCIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iY3JlYXRlYXdvcmtwcm9kdWN0Lmh0bWwjY3JlYXRlYXdvcmtwcm9kdWN0IiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJjcmVhdGVtZXRob2Rjb250ZW50Lmh0bWwiIC8+Ci08bWV0YSBuYW1lPSJEQy5Gb3JtYXQiIGNvbnRlbnQ9IlhIVE1MIiAvPgotPG1ldGEgbmFtZT0iREMuSWRlbnRpZmllciIgY29udGVudD0iY3JlYXRlZ3VpZGFuY2UiIC8+Ci08bWV0YSBuYW1lPSJEQy5MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiIC8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4vaWJtZGl0YS5jc3MiIC8+Ci08dGl0bGU+Q3JlYXRlIEd1aWRhbmNlPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJjcmVhdGVndWlkYW5jZSI+PGEgbmFtZT0iY3JlYXRlZ3VpZGFuY2UiPjwhLS0gLS0+PC9hPgotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5DcmVhdGUgR3VpZGFuY2U8L2gxPgotPGRpdj48ZGl2IGNsYXNzPSJwIj48cD5HdWlkYW5jZSBpcyBhIGdlbmVyYWwgdGVybSBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWxhdGVkIHRvIDxhIGhyZWY9InJvbGUuaHRtbCNyb2xlIj5Sb2xlPC9hPiwgPGEgaHJlZj0idGFzay5odG1sI3Rhc2siPlRhc2s8L2E+LCBhbmQgPGEgaHJlZj0id29ya3Byb2R1Y3QuaHRtbCI+V29yayBQcm9kdWN0PC9hPi4gR3VpZGFuY2UKLXByb3ZpZGVzIGluZm9ybWF0aW9uIG9uIGhvdyB0byBwZXJmb3JtIHlvdXIgcm9sZSwgaG93IHRvIGNyZWF0ZSBhIHdvcmsgcHJvZHVjdCwKLWhvdyB0byBwZXJmb3JtIHlvdXIgdGFzaywgYW5kIHNvIG9uLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBzZWUgPGEgaHJlZj0iZ3VpZGFuY2UuaHRtbCNndWlkYW5jZSI+R3VpZGFuY2U8L2E+LjwvcD4KLTxwPllvdSBzaG91bGQgYWx3YXlzIGNyZWF0ZSBuZXcgPGEgaHJlZj0ibWV0aG9kY29udGVudC5odG1sI2NyZWF0aW5ncmV1c2FibGVtZXRob2Rjb250ZW50cyI+TWV0aG9kIENvbnRlbnQ8L2E+IGluIGEgPGEgaHJlZj0ibWV0aG9kcGx1Z2luLmh0bWwjbWV0aG9kcGx1Z2luIj5NZXRob2QgUGx1Zy1pbjwvYT4gdGhhdAoteW91IHByb2R1Y2UuPC9wPgotPC9kaXY+Ci08ZGl2IGNsYXNzPSJzZWN0aW9uIj48cD5UbyBjcmVhdGU8c3Ryb25nPkd1aWRhbmNlPC9zdHJvbmc+OjwvcD4KLTwvZGl2PgotPG9sPjxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+RXhwYW5kIHRoZSBDb250ZW50IFBhY2thZ2UgaW4gd2hpY2ggeW91IHdhbnQgdG8gY3JlYXRlIEd1aWRhbmNlCi11bnRpbCB5b3Ugc2VlIHRoZSBNZXRob2QgRWxlbWVudHMgKFJvbGVzLCBUYXNrcywgV29yayBQcm9kdWN0cywgR3VpZGFuY2UpLjwvc3Bhbj48L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5SaWdodCBjbGljayA8c3Ryb25nPkd1aWRhbmNlPC9zdHJvbmc+IGFuZCB0aGVuIGNsaWNrIDxzdHJvbmc+TmV3ICZndDsgImd1aWRhbmNlIHR5cGUiPC9zdHJvbmc+LgotVGhlIGd1aWRhbmNlIGVkaXRvciBmb3IgdGhhdCBwYXJ0aWN1bGFyIGd1aWRhbmNlIHR5cGUgb3BlbnMuIDwvc3Bhbj4gPGRpdiBjbGFzcz0icCI+VGhlCi1mb2xsb3dpbmcgZ3VpZGFuY2UgdHlwZXMgaGF2ZSB0aGUgc2FtZSBlZGl0b3Igd2hpY2ggaW5jbHVkZXMgYSBEZXNjcmlwdGlvbgotdGFiIGFuZCBhIFByZXZpZXcgdGFiOjx1bD48bGk+PGEgaHJlZj0iY29uY2VwdC5odG1sI2NvbmNlcHQiPkNvbmNlcHQ8L2E+PC9saT4KLTxsaT48YSBocmVmPSJleGFtcGxlLmh0bWwjZXhhbXBsZSI+RXhhbXBsZTwvYT48L2xpPgotPGxpPjxhIGhyZWY9Imd1aWRlbGluZS5odG1sI2d1aWRlbGluZSI+R3VpZGVsaW5lPC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0icmVwb3J0Lmh0bWwjcmVwb3J0Ij5SZXBvcnQ8L2E+PC9saT4KLTxsaT48YSBocmVmPSJyZXVzYWJsZWFzc2V0Lmh0bWwjcmV1c2FibGVhc3NldCI+UmV1c2FibGUgQXNzZXQ8L2E+PC9saT4KLTxsaT48YSBocmVmPSJyb2FkbWFwLmh0bWwjcm9hZG1hcCI+Um9hZG1hcDwvYT48L2xpPgotPGxpPjxhIGhyZWY9InN1cHBvcnRpbmdtYXRlcmlhbC5odG1sIj5TdXBwb3J0aW5nIE1hdGVyaWFsPC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0idGVybWRlZmluaXRpb24uaHRtbCN0ZXJtZGVmaW5pdGlvbiI+VGVybSBEZWZpbml0aW9uPC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0idG9vbG1lbnRvci5odG1sI3Rvb2xtZW50b3IiPlRvb2wgTWVudG9yPC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0id2hpdGVwYXBlci5odG1sI3doaXRlcGFwZXIiPldoaXRlcGFwZXI8L2E+PC9saT4KLTwvdWw+Ci08L2Rpdj4KLTwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPlVzZSB0aGUgZmllbGRzIGluIHRoZSBjb250ZW50IGVsZW1lbnQgZWRpdG9yIHRvIHNwZWNpZnkgdGhlIGd1aWRhbmNlCi1kZXRhaWxzLiBTdGFydCBieSBhc3NpZ25pbmcgYSB1bmlxdWUgbmFtZSB0byB0aGUgZ3VpZGFuY2UgZWxlbWVudCBhbG9uZyB3aXRoCi1hIHByZXNlbnRhdGlvbiBuYW1lIHRoYXQgaXMgdXNlZCBhcyB0aGUgZXh0ZXJuYWwgdmlzaWJsZSBuYW1lIHdoZW4gb3RoZXIgZWxlbWVudHMKLXJlZmVyIHRvIHRoaXMgZWxlbWVudCwgb3Igd2hlbiB0aGUgZWxlbWVudCBpcyBwdWJsaXNoZWQuIEV2ZXJ5IGd1aWRhbmNlIHR5cGUKLWhhcyBzcGVjaWZpYyBjb250ZW50IGZpZWxkcyBpbiB0aGUgY29udGVudCBlZGl0b3IgdGhhdCBhcmUgZGlzdHJpYnV0ZWQgb3ZlcgotdHdvIG9yIG1vcmUgc3RhY2tlZCB0YWJzLiBVc2UgdGhlIGNvbnRlbnQgZmllbGRzIHRvIGRlc2NyaWJlIHlvdXIgZ3VpZGFuY2UKLXR5cGUuPC9zcGFuPiA8ZGl2IGNsYXNzPSJub3RlIj48c3BhbiBjbGFzcz0ibm90ZXRpdGxlIj5Ob3RlOjwvc3Bhbj4gWW91IGNhbiB1c2UgdGhlIFJpY2ggVGV4dCBFZGl0b3IgdG8gZWRpdCBvciBlbnRlcgotdGhlIHRleHQgZm9yIGFueSBmaWVsZCB0aGF0IGhhcyBhIHR3aXN0eSBzeW1ib2wgPGltZyBzcmM9ImNvbGxhcHNlZC5naWYiIGFsdD0iIiAvPi4gU2ltcGx5IGNsaWNrIHRoZSBzeW1ib2wgdG8gYWNjZXNzIHRoZSBSaWNoIFRleHQgRWRpdG9yLgotQ2xpY2sgdGhlIHN5bWJvbCBhZ2FpbiB0byBjbG9zZSB0aGUgUmljaCBUZXh0IEVkaXRvci4gRm9yIG1vcmUgaW5mb3JtYXRpb24KLXNlZSA8YSBocmVmPSJyaWNodGV4dGVkaXRvci5odG1sI3JpY2h0ZXh0ZWRpdG9yIj5SaWNoIFRleHQgRWRpdG9yPC9hPi48L2Rpdj4KLTwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkluIHRoZSBJY29uIHNlY3Rpb24sIHNlbGVjdCBhIE5vZGUgaWNvbiB0byBhcHBlYXIgd2l0aCB0aGUgd29yawotcHJvZHVjdCBpbiB0aGUgPGEgaHJlZj0ibGlicmFyeXZpZXcuaHRtbCNsaWJyYXJ5dmlldyI+TGlicmFyeSBWaWV3PC9hPiBhbmQgPGEgaHJlZj0iY29uZmlndXJhdGlvbnZpZXcuaHRtbCNjb25maWd1cmF0aW9udmlldyI+Q29uZmlndXJhdGlvbiBWaWV3PC9hPiBhbmQKLWluIHRoZSB0cmVlIGJyb3dzZXIgaW4gYSBwdWJsaXNoZWQgV2ViIHNpdGUuIFRoZSBub2RlIGljb24gc2hvdWxkIGJlIDE2IHgKLTE2IHBpeGVscy4gWW91IGNhbiBhbHNvIHNlbGVjdCBhIFNoYXBlIGljb24gdG8gYXBwZWFyIGF0IHRoZSB0b3Agb2YgdGhlIHB1Ymxpc2hlZAotcGFnZSBmb3IgdGhlIHdvcmsgcHJvZHVjdC4gVGhlIHNoYXBlIGljb24gc2hvdWxkIGJlIDMyIHggMzIgcGl4ZWxzLjwvc3Bhbj48L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5TZWxlY3QgdGhlIDxzdHJvbmc+UHJldmlldzwvc3Ryb25nPiB0YWIgdG8gdmlldyB0aGUgbmV3bHkgY3JlYXRlZCB3b3JrIHByb2R1Y3QKLWFuZCB0aGVuIHNhdmUgYnkgY2xvc2luZyB0aGUgdGFiLjwvc3Bhbj48L2xpPgotPC9vbD4KLTxkaXYgY2xhc3M9InNlY3Rpb24iPkl0IGlzIHBvc3NpYmxlIHRvIGNoYW5nZSB0aGUgdHlwZXMgb2Ygc29tZSB0eXBlcyBvZiBndWlkYW5jZSB0byBhCi1saW1pdGVkIG51bWJlciBvZiBvdGhlciBndWlkYW5jZSB0eXBlcy4gVG8gY2hhbmdlIGEgZ3VpZGFuY2UgdHlwZSwgY2xpY2sgdGhlIDxzdHJvbmc+Q2hhbmdlCi1UeXBlPC9zdHJvbmc+IGJ1dHRvbiBhbmQgc2VsZWN0IGFuIGF2YWlsYWJsZSBuZXcgdHlwZS48cD5JZiB0aGUgdHlwZSBvZiBndWlkYW5jZQotaXMgYSA8YSBocmVmPSJwcmFjdGljZS5odG1sI3ByYWN0aWNlIj5QcmFjdGljZTwvYT4sIHlvdSBjYW4gYWRkCi1yZWZlcmVuY2VzIHRvIG90aGVyIGVsZW1lbnRzLiBJZiB0aGUgZ3VpZGFuY2UgaXMgYSA8YSBocmVmPSJ0ZW1wbGF0ZS5odG1sIj5UZW1wbGF0ZTwvYT4sCi15b3UgY2FuIGF0dGFjaCBhIGZpbGUgdG8gdGhlIGd1aWRhbmNlLjwvcD4KLTwvZGl2PgotPC9kaXY+Ci08ZGl2PgotPGRpdiBjbGFzcz0iZmFtaWx5bGlua3MiPgotPGRpdiBjbGFzcz0icGFyZW50bGluayI+PHN0cm9uZz5QYXJlbnQgdG9waWM6PC9zdHJvbmc+IDxhIGhyZWY9ImNyZWF0ZW1ldGhvZGNvbnRlbnQuaHRtbCI+Q3JlYXRlIE1ldGhvZCBDb250ZW50PC9hPjwvZGl2PgotPC9kaXY+Ci08ZGl2IGNsYXNzPSJyZWx0YXNrcyI+PHN0cm9uZz5SZWxhdGVkIHRhc2tzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9ImNyZWF0ZW1ldGhvZGNvbnRlbnQuaHRtbCNjcmVhdGVtZXRob2Rjb250ZW50Ij5DcmVhdGUgTWV0aG9kIENvbnRlbnQ8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9ImNyZWF0ZWFyb2xlLmh0bWwiPkNyZWF0ZSBhIFJvbGU8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9ImNyZWF0ZWF0YXNrLmh0bWwiPkNyZWF0ZSBhIFRhc2s8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9ImNyZWF0ZWF3b3JrcHJvZHVjdC5odG1sI2NyZWF0ZWF3b3JrcHJvZHVjdCI+Q3JlYXRlIGEgV29yayBQcm9kdWN0PC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2NyZWF0ZW1ldGhvZGNvbnRlbnQuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2NyZWF0ZW1ldGhvZGNvbnRlbnQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTFmMjZmZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9jcmVhdGVtZXRob2Rjb250ZW50Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw4OCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGh0bWwKLSAgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9InNlY3VyaXR5IiBjb250ZW50PSJwdWJsaWMiIC8+Ci08bWV0YSBuYW1lPSJSb2JvdHMiIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgbmFtZT0iREMuVHlwZSIgY29udGVudD0idGFzayIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJDcmVhdGUgTWV0aG9kIENvbnRlbnQiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9ImNyZWF0ZWFyb2xlLmh0bWwjY3JlYXRlYXJvbGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9ImNyZWF0ZWF0YXNrLmh0bWwjY3JlYXRlYXRhc2siIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9ImNyZWF0ZWF3b3JrcHJvZHVjdC5odG1sIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJjcmVhdGVndWlkYW5jZS5odG1sI2NyZWF0ZWd1aWRhbmNlIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJjcmVhdGVhcm9sZS5odG1sIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJjcmVhdGVhdGFzay5odG1sIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJjcmVhdGVhd29ya3Byb2R1Y3QuaHRtbCIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iY3JlYXRlZ3VpZGFuY2UuaHRtbCIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0idmFyaWFiaWxpdHkuaHRtbCIgLz4KLTxtZXRhIG5hbWU9IkRDLkZvcm1hdCIgY29udGVudD0iWEhUTUwiIC8+Ci08bWV0YSBuYW1lPSJEQy5JZGVudGlmaWVyIiBjb250ZW50PSJjcmVhdGVtZXRob2Rjb250ZW50IiAvPgotPG1ldGEgbmFtZT0iREMuTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIiAvPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuL2libWRpdGEuY3NzIiAvPgotPHRpdGxlPkNyZWF0ZSBNZXRob2QgQ29udGVudDwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0iY3JlYXRlbWV0aG9kY29udGVudCI+PGEgbmFtZT0iY3JlYXRlbWV0aG9kY29udGVudCI+PCEtLSAtLT48L2E+Ci0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPkNyZWF0ZSBNZXRob2QgQ29udGVudDwvaDE+Ci08ZGl2PjxkaXYgY2xhc3M9InAiPjxwPk1ldGhvZCBjb250ZW50IHByb3ZpZGVzIHN0ZXAtYnktc3RlcCBleHBsYW5hdGlvbnMsCi1kZXNjcmliaW5nIGhvdyBzcGVjaWZpYyBkZXZlbG9wbWVudCBnb2FscyBhcmUgYWNoaWV2ZWQgaW5kZXBlbmRlbnQgb2YgdGhlCi1wbGFjZW1lbnQgb2YgdGhlc2Ugc3RlcHMgd2l0aGluIGEgZGV2ZWxvcG1lbnQgbGlmZWN5Y2xlLiBQcm9jZXNzZXMgdGFrZSB0aGUKLW1ldGhvZCBlbGVtZW50cyBhbmQgcmVsYXRlIHRoZW0gaW50byBzZW1pLW9yZGVyZWQgc2VxdWVuY2VzIHRoYXQgYXJlIGN1c3RvbWl6ZWQKLXRvIHNwZWNpZmljIHR5cGVzIG9mIHByb2plY3RzLjwvcD4KLTxwPk1ldGhvZCBjb250ZW50IGVsZW1lbnRzIGFyZTo8L3A+Ci08dWw+PGxpPjxhIGhyZWY9InRhc2suaHRtbCN0YXNrIj5UYXNrPC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0icm9sZS5odG1sI3JvbGUiPlJvbGU8L2E+PC9saT4KLTxsaT48YSBocmVmPSJ3b3JrcHJvZHVjdC5odG1sI3dvcmtwcm9kdWN0Ij5Xb3JrIFByb2R1Y3Q8L2E+PC9saT4KLTxsaT48YSBocmVmPSJndWlkYW5jZS5odG1sIj5HdWlkYW5jZTwvYT48L2xpPgotPC91bD4KLUNsaWNrIGhlcmUgZm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgPGEgaHJlZj0ibWV0aG9kY29udGVudC5odG1sI2NyZWF0aW5ncmV1c2FibGVtZXRob2Rjb250ZW50cyI+TWV0aG9kIENvbnRlbnQ8L2E+LjwvZGl2PgotPGRpdiBjbGFzcz0ic2VjdGlvbiI+VG8gY3JlYXRlIG1ldGhvZCBjb250ZW50OjwvZGl2PgotPG9sPjxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+SW4gdGhlIDxhIGhyZWY9ImxpYnJhcnl2aWV3Lmh0bWwjbGlicmFyeXZpZXciPkxpYnJhcnkgVmlldzwvYT4sCi1leHBhbmQgdGhlIGNvbnRlbnQgcGFja2FnZSBpbiB3aGljaCB5b3Ugd2FudCB0byBjcmVhdGUgbmV3IG1ldGhvZCBjb250ZW50Ljwvc3Bhbj48L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5SaWdodCBjbGljayB0aGUgZm9sZGVyIGNvbnRhaW5pbmcgdGhlIHR5cGUgb2YgbWV0aG9kIGVsZW1lbnQgeW91Ci13YW50IHRvIGNyZWF0ZSwgY2xpY2sgPHN0cm9uZz5OZXc8L3N0cm9uZz4gYW5kIHRoZW4gc2VsZWN0IHRoZSBlbGVtZW50IHRoYXQgYXBwZWFycy4KLVRoZSBuZXcgZWxlbWVudCBpcyBjcmVhdGVkIGFuZCBpdHMgcmVzcGVjdGl2ZSBlZGl0b3Igb3BlbnMuPC9zcGFuPiA8ZGl2IGNsYXNzPSJub3RlIj48c3BhbiBjbGFzcz0ibm90ZXRpdGxlIj5Ob3RlOjwvc3Bhbj4gRm9yCi1Xb3JrIFByb2R1Y3RzLCBjaG9vc2UgYmV0d2VlbiBBcnRpZmFjdCwgT3V0Y29tZSwgb3IgRGVsaXZlcmFibGUuIEZvciBHdWlkYW5jZSwKLWNob29zZSBmcm9tIHRoZSBsaXN0IG9mIGd1aWRhbmNlIHR5cGVzLjwvZGl2PgotPC9saT4KLTwvb2w+Ci08L2Rpdj4KLTxkaXY+Ci08dWwgY2xhc3M9InVsbGlua3MiPgotPGxpIGNsYXNzPSJ1bGNoaWxkbGluayI+PHN0cm9uZz48YSBocmVmPSJjcmVhdGVhcm9sZS5odG1sIj5DcmVhdGUgYSBSb2xlPC9hPjwvc3Ryb25nPjxiciAvPgotPC9saT4KLTxsaSBjbGFzcz0idWxjaGlsZGxpbmsiPjxzdHJvbmc+PGEgaHJlZj0iY3JlYXRlYXRhc2suaHRtbCI+Q3JlYXRlIGEgVGFzazwvYT48L3N0cm9uZz48YnIgLz4KLTwvbGk+Ci08bGkgY2xhc3M9InVsY2hpbGRsaW5rIj48c3Ryb25nPjxhIGhyZWY9ImNyZWF0ZWF3b3JrcHJvZHVjdC5odG1sIj5DcmVhdGUgYSBXb3JrIFByb2R1Y3Q8L2E+PC9zdHJvbmc+PGJyIC8+Ci08L2xpPgotPGxpIGNsYXNzPSJ1bGNoaWxkbGluayI+PHN0cm9uZz48YSBocmVmPSJjcmVhdGVndWlkYW5jZS5odG1sIj5DcmVhdGUgR3VpZGFuY2U8L2E+PC9zdHJvbmc+PGJyIC8+Ci08L2xpPgotPGxpIGNsYXNzPSJ1bGNoaWxkbGluayI+PHN0cm9uZz48YSBocmVmPSJ2YXJpYWJpbGl0eS5odG1sIj5WYXJpYWJpbGl0eTwvYT48L3N0cm9uZz48YnIgLz4KLVZhcmlhYmlsaXR5IGFsbG93cyBlbGVtZW50cyBpbiBvbmUgY29udGVudCBwYWNrYWdlIHRvIGluZmx1ZW5jZQotb3IgbW9kaWZ5IGVsZW1lbnRzIGluIG90aGVyIGNvbnRlbnQgcGFja2FnZXMgd2l0aG91dCBhY3R1YWxseSBkaXJlY3RseSBtb2RpZnlpbmcKLXRoZSBvcmlnaW5hbCBjb250ZW50LiBWYXJpYWJpbGl0eSBlbmFibGVzIGNoYW5nZXMgdG8gdGhlIGNvbnRlbnQgd2hpbGUga2VlcGluZwotdGhlIGNoYW5nZXMgc2VwYXJhdGUgYW5kIG9wdGlvbmFsLjwvbGk+Ci08L3VsPgotCi08ZGl2IGNsYXNzPSJsaW5rbGlzdCI+Ci08ZGl2PjxhIGhyZWY9ImNyZWF0ZWFyb2xlLmh0bWwjY3JlYXRlYXJvbGUiPkNyZWF0ZSBhIFJvbGU8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9ImNyZWF0ZWF0YXNrLmh0bWwjY3JlYXRlYXRhc2siPkNyZWF0ZSBhIFRhc2s8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9ImNyZWF0ZWF3b3JrcHJvZHVjdC5odG1sIj5DcmVhdGUgYSBXb3JrIFByb2R1Y3Q8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9ImNyZWF0ZWd1aWRhbmNlLmh0bWwjY3JlYXRlZ3VpZGFuY2UiPkNyZWF0ZSBHdWlkYW5jZTwvYT48L2Rpdj48L2Rpdj4KLTwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvY3V0LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2N1dC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjZjExZDQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvY3V0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2RlbGl2ZXJhYmxlLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9kZWxpdmVyYWJsZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyM2IyNjZlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2RlbGl2ZXJhYmxlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGh0bWwKLSAgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9InNlY3VyaXR5IiBjb250ZW50PSJwdWJsaWMiIC8+Ci08bWV0YSBuYW1lPSJSb2JvdHMiIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgbmFtZT0iREMuVHlwZSIgY29udGVudD0iY29uY2VwdCIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJEZWxpdmVyYWJsZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0id29ya3Byb2R1Y3QuaHRtbCN3b3JrcHJvZHVjdCIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iY3JlYXRlYXdvcmtwcm9kdWN0Lmh0bWwjY3JlYXRlYXdvcmtwcm9kdWN0IiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJhcnRpZmFjdC5odG1sI2FydGlmYWN0IiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJvdXRjb21lLmh0bWwjb3V0Y29tZSIgLz4KLTxtZXRhIG5hbWU9IkRDLkZvcm1hdCIgY29udGVudD0iWEhUTUwiIC8+Ci08bWV0YSBuYW1lPSJEQy5JZGVudGlmaWVyIiBjb250ZW50PSJkZWxpdmVyYWJsZSIgLz4KLTxtZXRhIG5hbWU9IkRDLkxhbmd1YWdlIiBjb250ZW50PSJlbi11cyIgLz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi9pYm1kaXRhLmNzcyIgLz4KLTx0aXRsZT5EZWxpdmVyYWJsZTwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0iZGVsaXZlcmFibGUiPjxhIG5hbWU9ImRlbGl2ZXJhYmxlIj48IS0tIC0tPjwvYT4KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+RGVsaXZlcmFibGU8L2gxPgotPGRpdj48cD5BIGRlbGl2ZXJhYmxlIGlzIGEgY29sbGVjdGlvbiBvZiB3b3JrIHByb2R1Y3RzLCB1c3VhbGx5IGFydGlmYWN0cy4gQSBkZWxpdmVyYWJsZQotaXMgdXNlZCB0byBwcmUtZGVmaW5lIHR5cGljYWwgb3IgcmVjb21tZW5kZWQgY29udGVudCBpbiB0aGUgZm9ybSBvZiB3b3JrIHByb2R1Y3RzCi1wYWNrYWdlZCBmb3IgZGVsaXZlcnkuIERlbGl2ZXJhYmxlcyBhcmUgdXNlZCB0byByZXByZXNlbnQgYW4gb3V0cHV0IGZyb20gYQotcHJvY2VzcyB0aGF0IGhhcyB2YWx1ZSwgbWF0ZXJpYWwgb3Igb3RoZXJ3aXNlLCB0byBhIGNsaWVudCwgY3VzdG9tZXIsIG9yIG90aGVyCi1zdGFrZWhvbGRlci48L3A+Ci08L2Rpdj4KLTxkaXY+PGRpdiBjbGFzcz0icmVsY29uY2VwdHMiPjxzdHJvbmc+UmVsYXRlZCBjb25jZXB0czwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJ3b3JrcHJvZHVjdC5odG1sI3dvcmtwcm9kdWN0Ij5Xb3JrIFByb2R1Y3Q8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9ImFydGlmYWN0Lmh0bWwjYXJ0aWZhY3QiPkFydGlmYWN0PC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJvdXRjb21lLmh0bWwjb3V0Y29tZSI+T3V0Y29tZTwvYT48L2Rpdj4KLTwvZGl2PgotPGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJjcmVhdGVhd29ya3Byb2R1Y3QuaHRtbCNjcmVhdGVhd29ya3Byb2R1Y3QiPkNyZWF0ZSBhIFdvcmsgUHJvZHVjdDwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9kZWxpdmVyeXByb2Nlc3MuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2RlbGl2ZXJ5cHJvY2Vzcy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZDVlOWJhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2RlbGl2ZXJ5cHJvY2Vzcy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJzZWN1cml0eSIgY29udGVudD0icHVibGljIiAvPgotPG1ldGEgbmFtZT0iUm9ib3RzIiBjb250ZW50PSJpbmRleCxmb2xsb3ciIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIG5hbWU9IkRDLlR5cGUiIGNvbnRlbnQ9ImNvbmNlcHQiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iRGVsaXZlcnkgUHJvY2VzcyIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iY3JlYXRlYWRlbGl2ZXJ5cHJvY2Vzcy5odG1sI2NyZWF0ZWFkZWxpdmVyeXByb2Nlc3MiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9ImNyZWF0ZWFkZWxpdmVyeXByb2Nlc3MuaHRtbCIgLz4KLTxtZXRhIG5hbWU9IkRDLkZvcm1hdCIgY29udGVudD0iWEhUTUwiIC8+Ci08bWV0YSBuYW1lPSJEQy5JZGVudGlmaWVyIiBjb250ZW50PSJkZWxpdmVyeXByb2Nlc3MiIC8+Ci08bWV0YSBuYW1lPSJEQy5MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiIC8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4vaWJtZGl0YS5jc3MiIC8+Ci08dGl0bGU+RGVsaXZlcnkgUHJvY2VzczwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0iZGVsaXZlcnlwcm9jZXNzIj48YSBuYW1lPSJkZWxpdmVyeXByb2Nlc3MiPjwhLS0gLS0+PC9hPgotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5EZWxpdmVyeSBQcm9jZXNzPC9oMT4KLTxkaXY+PHA+QSBEZWxpdmVyeSBQcm9jZXNzIGlzIHRoZSBwcm9jZXNzIHRoYXQgY292ZXJzIGEgd2hvbGUgZGV2ZWxvcG1lbnQgbGlmZWN5Y2xlCi1mcm9tIGJlZ2lubmluZyB0byBlbmQuIEEgRGVsaXZlcnkgUHJvY2VzcyBjYW4gYmUgdXNlZCBhcyBhIHRlbXBsYXRlIGZvciBwbGFubmluZwotYW5kIHJ1bm5pbmcgYSBwcm9qZWN0LiBJdCBwcm92aWRlcyBhIGNvbXBsZXRlIGxpZmVjeWNsZSBtb2RlbCB3aXRoIHByZWRlZmluZWQKLXBoYXNlcywgaXRlcmF0aW9ucywgYW5kIGFjdGl2aXRpZXMuPC9wPgotPC9kaXY+Ci08ZGl2PgotPGRpdiBjbGFzcz0iZmFtaWx5bGlua3MiPgotPGRpdiBjbGFzcz0icGFyZW50bGluayI+PHN0cm9uZz5QYXJlbnQgdG9waWM6PC9zdHJvbmc+IDxhIGhyZWY9ImNyZWF0ZWFkZWxpdmVyeXByb2Nlc3MuaHRtbCI+Q3JlYXRlIGEgRGVsaXZlcnkgUHJvY2VzczwvYT48L2Rpdj4KLTwvZGl2PgotPGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJjcmVhdGVhZGVsaXZlcnlwcm9jZXNzLmh0bWwjY3JlYXRlYWRlbGl2ZXJ5cHJvY2VzcyI+Q3JlYXRlIGEgRGVsaXZlcnkgUHJvY2VzczwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9kZXZlbG9wYXRlYW1hbGxvY2F0aW9uc3RydWN0dXJlLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9kZXZlbG9wYXRlYW1hbGxvY2F0aW9uc3RydWN0dXJlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxMjNhOTMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvZGV2ZWxvcGF0ZWFtYWxsb2NhdGlvbnN0cnVjdHVyZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJzZWN1cml0eSIgY29udGVudD0icHVibGljIiAvPgotPG1ldGEgbmFtZT0iUm9ib3RzIiBjb250ZW50PSJpbmRleCxmb2xsb3ciIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIG5hbWU9IkRDLlR5cGUiIGNvbnRlbnQ9InRhc2siIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iRGV2ZWxvcCBhIFRlYW0gQWxsb2NhdGlvbiBTdHJ1Y3R1cmUiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9ImRldmVsb3Bhd29ya2JyZWFrZG93bnN0cnVjdHVyZS5odG1sI2RldmVsb3Bhd29ya2JyZWFrZG93bnN0cnVjdHVyZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iZGV2ZWxvcGF3b3JrcHJvZHVjdHVzYWdlc3RydWN0dXJlLmh0bWwjZGV2ZWxvcGF3b3JrcHJvZHVjdHVzYWdlc3RydWN0dXJlIiAvPgotPG1ldGEgbmFtZT0iREMuRm9ybWF0IiBjb250ZW50PSJYSFRNTCIgLz4KLTxtZXRhIG5hbWU9IkRDLklkZW50aWZpZXIiIGNvbnRlbnQ9ImRldmVsb3BhdGVhbWFsbG9jYXRpb25zdHJ1Y3R1cmUiIC8+Ci08bWV0YSBuYW1lPSJEQy5MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiIC8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4vaWJtZGl0YS5jc3MiIC8+Ci08dGl0bGU+RGV2ZWxvcCBhIFRlYW0gQWxsb2NhdGlvbiBTdHJ1Y3R1cmU8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9ImRldmVsb3BhdGVhbWFsbG9jYXRpb25zdHJ1Y3R1cmUiPjxhIG5hbWU9ImRldmVsb3BhdGVhbWFsbG9jYXRpb25zdHJ1Y3R1cmUiPjwhLS0gLS0+PC9hPgotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5EZXZlbG9wIGEgVGVhbSBBbGxvY2F0aW9uIFN0cnVjdHVyZTwvaDE+Ci08ZGl2PjxkaXYgY2xhc3M9InAiPkluIHRoZSBUZWFtIEFsbG9jYXRpb24gdmlldywgeW91IGNhbiBjcmVhdGUgYSBwcm9jZXNzIGJ5IGRlZmluaW5nCi13aGljaCByb2xlcyBwYXJ0aWNpcGF0ZSBpbiBhY3Rpdml0aWVzIGFuZCBmaW5kIHJlc3BvbnNpYmxlIHdvcmsgcHJvZHVjdHMgYW5kCi10YXNrcyBmcm9tIHRoZXJlLiBZb3UgY2FuIGFsc28gcmV2aWV3IHRoZSByb2xlcyBpbiBhIHByb2Nlc3MgdGhhdCBoYXMgYmVlbgotY3JlYXRlZCBieSBhZGRpbmcgdGFza3Mgb3Igd29yayBwcm9kdWN0cyB0byB0aGUgcHJvY2Vzcy4gQmVmb3JlIHlvdSBjcmVhdGUKLWEgdGVhbSBhbGxvY2F0aW9uIHN0cnVjdHVyZSwgZW5zdXJlIHRoZSBjb25maWd1cmF0aW9uIHNlbGVjdGVkIGluIHRoZSB0b29sCi1iYXIgaXMgdGhlIHNhbWUgYXMgdGhlIGNvbmZpZ3VyYXRpb24geW91IHNlbGVjdGVkIGFzIHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24KLWZvciB5b3VyIHByb2Nlc3MuPC9kaXY+Ci08ZGl2IGNsYXNzPSJzZWN0aW9uIj5UbyBkZXZlbG9wIGEgdGVhbSBhbGxvY2F0aW9uIHN0cnVjdHVyZTo8L2Rpdj4KLTxvbD48bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPlRvIGFjY2VzcyB0aGUgdGVhbSBhbGxvY2F0aW9uIGVkaXRvciwgc2VsZWN0IHRoZSA8c3Ryb25nPlRlYW0gQWxsb2NhdGlvbjwvc3Ryb25nPiB0YWIKLWluIHRoZSBwcm9jZXNzIGVkaXRvci48L3NwYW4+IDxkaXYgY2xhc3M9Im5vdGUiPjxzcGFuIGNsYXNzPSJub3RldGl0bGUiPk5vdGU6PC9zcGFuPiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgdG9waWMsIHRoZQotYnJlYWtkb3duIGVsZW1lbnQgZXhhbXBsZSB1c2VkIGlzIDxhIGhyZWY9ImFjdGl2aXR5Lmh0bWwjYWN0aXZpdHkiPkFjdGl2aXR5PC9hPi4KLU90aGVyIGJyZWFrZG93biBlbGVtZW50cyBpbmNsdWRlIChidXQgYXJlIG5vdCBsaW1pdGVkIHRvKSA8YSBocmVmPSJwaGFzZS5odG1sI3BoYXNlIj5QaGFzZTwvYT4gYW5kIDxhIGhyZWY9Iml0ZXJhdGlvbi5odG1sI2l0ZXJhdGlvbiI+SXRlcmF0aW9uPC9hPi4KLVRoZSBlbGVtZW50IHlvdSB1c2UgZGVwZW5kcyBvbiB0aGUgc2NvcGUgb2YgdGhlIHByb2Nlc3MgeW91IGNyZWF0ZS48L2Rpdj4KLTwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPlJpZ2h0IGNsaWNrIHRoZSBlbGVtZW50IChlaXRoZXIgYSA8YSBocmVmPSJjYXBhYmlsaXR5cGF0dGVybi5odG1sI2NhcGFiaWxpdHlwYXR0ZXJuIj5DYXBhYmlsaXR5IFBhdHRlcm48L2E+IG9yIDxhIGhyZWY9ImRlbGl2ZXJ5cHJvY2Vzcy5odG1sI2RlbGl2ZXJ5cHJvY2VzcyI+RGVsaXZlcnkgUHJvY2VzczwvYT4pIHRvIHdoaWNoIHlvdSB3YW50IHRvIGFkZCBzdHJ1Y3R1cmUsIGFuZCB0aGVuIGNsaWNrIDxzdHJvbmc+TmV3Ci1DaGlsZCAmZ3Q7IEFjdGl2aXR5PC9zdHJvbmc+IHRvIGNyZWF0ZSBhIG5ldyBhY3Rpdml0eS4gSWYgbmVlZGVkLCBjcmVhdGUgbW9yZSBhY3Rpdml0aWVzCi10byBzZXQgdXAgeW91ciBicmVha2Rvd24gc3RydWN0dXJlLiBBY3Rpdml0aWVzIChhcyB3ZWxsIGFzIHBoYXNlcyBhbmQgaXRlcmF0aW9ucykKLWNhbiBiZSBuZXN0ZWQgaW5zaWRlIGVhY2ggb3RoZXIgYWNjb3JkaW5nIHRvIGhvdyBlYWNoIHJlbGF0ZXMgaW4gdGhlIGhpZXJhcmNoeS4KLVlvdSBjYW4gYWRkIHJvbGVzIGRpcmVjdGx5IHRvIHlvdXIgYWN0aXZpdGllcy48L3NwYW4+PC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+SW4gdGhlIENvbmZpZ3VyYXRpb24gdmlldywgcmV2aWV3IHRoZSBsaXN0IG9mIHJvbGVzLiBJbiB0aGlzIHZpZXcsCi10YXNrcyBhcmUgc29ydGVkIGJ5IHJvbGUgc2V0cy48L3NwYW4+PC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+RHJpbGwgaW50byB0aGUgcm9sZSBzZXRzIGhpZXJhcmNoeSB0byBzZWUgd2hpY2ggcm9sZXMgYXJlIGF2YWlsYWJsZQotaW4gdGhpcyBjb25maWd1cmF0aW9uLjwvc3Bhbj48L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5TZWxlY3QgYSByb2xlIGFuZCBkcmFnIGl0IG9uIHRvcCBvZiB0aGUgYXBwcm9wcmlhdGUgYWN0aXZpdHkuIFRoZQotcm9sZSBpcyBhZGRlZCBhcyBhIHJvbGUgZGVzY3JpcHRvci4gSWYgdGhlIHJvbGUgaXMgcmVzcG9uc2libGUgZm9yIHdvcmsgcHJvZHVjdHMKLWluIHRoZSBjb25maWd1cmF0aW9uJ3MgbWV0aG9kIGNvbnRlbnQsIGEgd2l6YXJkIGFwcGVhcnMgcHJvbXB0aW5nIHlvdSB0byBhZGQKLXdvcmsgcHJvZHVjdHMuPC9zcGFuPjwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPlNlbGVjdCBvbmUgb3IgbW9yZSB3b3JrIHByb2R1Y3RzIGFuZCB0aGVuIGNsaWNrIDxzdHJvbmc+T0s8L3N0cm9uZz4uIEZvcgotZWFjaCBzZWxlY3RlZCB3b3JrIHByb2R1Y3QgdGhlIG5leHQgd2l6YXJkIHdpbmRvdyBwcm9tcHRzIHlvdSB0byBzZWxlY3QgdGFza3MKLXRoYXQgcHJvZHVjZSB0aGVzZSB3b3JrIHByb2R1Y3RzLiBBZ2Fpbiwgc2VsZWN0IG9uZSBvciBtb3JlIHRhc2tzIGFuZCB0aGVuCi1jbGljayA8c3Ryb25nPk9LPC9zdHJvbmc+IHRvIGFkZCB0aGVzZSBlbGVtZW50cyB0byB5b3VyIHByb2Nlc3MuPC9zcGFuPjwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPlJldmlldyB0aGUgcm9sZSBkZXNjcmlwdG9yJ3MgZGV0YWlscyBpbiBpdHMgcHJvcGVydGllcyB2aWV3LiBJZgotdGhlIHByb3BlcnRpZXMgdmlldyBpcyBub3QgZGlzcGxheWVkLCBpbiB0aGUgd29yayBicmVha2Rvd24gc3RydWN0dXJlIGVkaXRvciwKLXJpZ2h0IGNsaWNrIHRoZSByb2xlIGFuZCB0aGVuIHNlbGVjdCA8c3Ryb25nPlByb3BlcnRpZXM8L3N0cm9uZz4uIFVzZSB0aGUgdGFicyBvbiB0aGUKLXNpZGUgb2YgdGhlIHByb3BlcnRpZXMgdmlldyB0byByZXZpZXcgZGlmZmVyZW50IGFzcGVjdHMgb2YgdGhlIHJvbGUgZGVzY3JpcHRvci4KLUluIHRoZSBwcm9wZXJ0aWVzIHZpZXcsIHlvdSBjYW4gYWxzbyBwZXJmb3JtIGluZGl2aWR1YWwgbW9kaWZpY2F0aW9ucyBvZiB0aGUKLXJvbGUgZGVzY3JpcHRvciwgc3VjaCBhcyBjaGFuZ2UgdGhlIHByZXNlbnRhdGlvbiBuYW1lLCBhZGQgdGV4dHVhbCBkZXNjcmlwdGlvbnMsCi1jaGFuZ2Ugd29yayBwcm9kdWN0cyB0aGUgcm9sZSBpcyByZXNwb25zaWJsZSBmb3IsIGFuZCBtb3JlLiBXaGVuIGNoYW5naW5nCi10aGUgdGFzayBkZXNjcmlwdG9yJ3MgcmVsYXRpb25zaGlwcyB1bmRlciB0aGUgcm9sZXMgb3Igd29yayBwcm9kdWN0cyB0YWJzLAoteW91IGNhbiBhZGQgbmV3IGVsZW1lbnRzIGZyb20geW91ciBtZXRob2QgY29udGVudCBieSBjbGlja2luZyB0aGUgPHN0cm9uZz5BZGQuLi48L3N0cm9uZz4gYnV0dG9uLAotb3IgY29ubmVjdCB5b3VyIHRhc2sgZGVzY3JpcHRvciB3aXRoIHRhc2tzIGFscmVhZHkgcHJlc2VudCBpbiB0aGlzIGFjdGl2aXR5LgotRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSA8YSBocmVmPSJwcm9jZXNzZWxlbWVudHByb3BlcnRpZXN2aWV3Lmh0bWwjcHJvY2Vzc2VsZW1lbnRwcm9wZXJ0aWVzdmlldyI+UHJvY2VzcyBFbGVtZW50IFByb3BlcnRpZXMgVmlldzwvYT48L3NwYW4+PC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+Q29udGludWUgYWRkaW5nIHJvbGVzIHRvIHlvdXIgYWN0aXZpdGllcy48L3NwYW4+PC9saT4KLTwvb2w+Ci08ZGl2IGNsYXNzPSJzZWN0aW9uIj5Zb3UgY2FuIHByZXZpZXcgd2hhdCB5b3VyIHByb2Nlc3Mgd2lsbCBsb29rIGxpa2UgaW4gYSBwdWJsaXNoZWQgV2ViCi1zaXRlIGF0IGFueSB0aW1lIGJ5IHN3aXRjaGluZyB0byB0aGUgPGEgaHJlZj0iYnJvd3NpbmdwZXJzcGVjdGl2ZS5odG1sI2Jyb3dpbmdwZXJzcGVjdGl2ZSI+QnJvd3NpbmcgUGVyc3BlY3RpdmU8L2E+IGFuZCB0aGVuIHNlbGVjdGluZyB0aGUgcHJvY2Vzcywgb3IgYW4gYWN0aXZpdHkgaW4gdGhlCi1wcm9jZXNzLCBpbiB0aGUgPGEgaHJlZj0iY29uZmlndXJhdGlvbnZpZXcuaHRtbCI+Q29uZmlndXJhdGlvbiBWaWV3PC9hPi4gWW91IGNhbiB1c2UgdGhlCi1saW5rcyBvbiB0aGUgcGFnZSB0byBuYXZpZ2F0ZSB0aHJvdWdoIHRoZSBwcm9jZXNzLiBTd2l0Y2ggYmFjayB0byB0aGUgPGEgaHJlZj0iYXV0aG9yaW5ncGVyc3BlY3RpdmUuaHRtbCNhdXRob3JpbmdwZXJzcGVjdGl2ZSI+QXV0aG9yaW5nIFBlcnNwZWN0aXZlPC9hPiB0bwotY29udGludWUgZWRpdGluZyB5b3VyIHByb2Nlc3MuPC9kaXY+Ci08L2Rpdj4KLTxkaXY+PGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJkZXZlbG9wYXdvcmticmVha2Rvd25zdHJ1Y3R1cmUuaHRtbCNkZXZlbG9wYXdvcmticmVha2Rvd25zdHJ1Y3R1cmUiPkRldmVsb3AgYSBXb3JrIEJyZWFrZG93biBTdHJ1Y3R1cmU8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9ImRldmVsb3Bhd29ya3Byb2R1Y3R1c2FnZXN0cnVjdHVyZS5odG1sI2RldmVsb3Bhd29ya3Byb2R1Y3R1c2FnZXN0cnVjdHVyZSI+RGV2ZWxvcCBhIFdvcmsgUHJvZHVjdCBVc2FnZSBTdHJ1Y3R1cmU8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvZGV2ZWxvcGF3b3JrYnJlYWtkb3duc3RydWN0dXJlLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9kZXZlbG9wYXdvcmticmVha2Rvd25zdHJ1Y3R1cmUuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODc0N2ViMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9kZXZlbG9wYXdvcmticmVha2Rvd25zdHJ1Y3R1cmUuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDg5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgaHRtbAotICBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0ic2VjdXJpdHkiIGNvbnRlbnQ9InB1YmxpYyIgLz4KLTxtZXRhIG5hbWU9IlJvYm90cyIgY29udGVudD0iaW5kZXgsZm9sbG93IiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBuYW1lPSJEQy5UeXBlIiBjb250ZW50PSJ0YXNrIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IkRldmVsb3AgYSBXb3JrIEJyZWFrZG93biBTdHJ1Y3R1cmUiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9ImRldmVsb3BhdGVhbWFsbG9jYXRpb25zdHJ1Y3R1cmUuaHRtbCNkZXZlbG9wYXRlYW1hbGxvY2F0aW9uc3RydWN0dXJlIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJkZXZlbG9wYXdvcmtwcm9kdWN0dXNhZ2VzdHJ1Y3R1cmUuaHRtbCNkZXZlbG9wYXdvcmtwcm9kdWN0dXNhZ2VzdHJ1Y3R1cmUiIC8+Ci08bWV0YSBuYW1lPSJEQy5Gb3JtYXQiIGNvbnRlbnQ9IlhIVE1MIiAvPgotPG1ldGEgbmFtZT0iREMuSWRlbnRpZmllciIgY29udGVudD0iZGV2ZWxvcGF3b3JrYnJlYWtkb3duc3RydWN0dXJlIiAvPgotPG1ldGEgbmFtZT0iREMuTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIiAvPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuL2libWRpdGEuY3NzIiAvPgotPHRpdGxlPkRldmVsb3AgYSBXb3JrIEJyZWFrZG93biBTdHJ1Y3R1cmU8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9ImRldmVsb3Bhd29ya2JyZWFrZG93bnN0cnVjdHVyZSI+PGEgbmFtZT0iZGV2ZWxvcGF3b3JrYnJlYWtkb3duc3RydWN0dXJlIj48IS0tIC0tPjwvYT4KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+RGV2ZWxvcCBhIFdvcmsgQnJlYWtkb3duIFN0cnVjdHVyZTwvaDE+Ci08ZGl2PjxkaXYgY2xhc3M9InAiPkEgd29yayBicmVha2Rvd24gc3RydWN0dXJlIGlzIGEgaGllcmFyY2hpY2FsIGJyZWFrZG93biBvZiB3b3JrLCBzdWNoCi1hcyBhY3Rpdml0aWVzLCB0YXNrcywgYW5kIHN0ZXBzLCBkZWZpbmluZyBhIHByb2Nlc3MuIDxwPkJlZm9yZSBjcmVhdGluZyBhCi13b3JrIGJyZWFrZG93biBzdHJ1Y3R1cmUsIGJlIHN1cmUgdGhhdCB0aGUgY29uZmlndXJhdGlvbiBzZWxlY3RlZCBpbiB0aGUgdG9vbAotYmFyIGlzIHRoZSBzYW1lIGFzIHRoZSBjb25maWd1cmF0aW9uIHNlbGVjdGVkIGFzIHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24KLWZvciB5b3VyIHByb2Nlc3MuPC9wPgotPC9kaXY+Ci08ZGl2IGNsYXNzPSJzZWN0aW9uIj5UbyBkZXZlbG9wIGEgd29yayBicmVha2Rvd24gc3RydWN0dXJlOjwvZGl2PgotPG9sPjxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+VG8gYWNjZXNzIHRoZSB3b3JrIGJyZWFrZG93biBzdHJ1Y3R1cmUgZWRpdG9yLCBzZWxlY3QgdGhlIDxzdHJvbmc+V29yawotQnJlYWtkb3duIFN0cnVjdHVyZTwvc3Ryb25nPiB0YWIgaW4gYSBwcm9jZXNzIGVkaXRvci48L3NwYW4+IDxkaXYgY2xhc3M9Im5vdGUiPjxzcGFuIGNsYXNzPSJub3RldGl0bGUiPk5vdGU6PC9zcGFuPiBBIGJyZWFrZG93bgotc3RydWN0dXJlIGlzIGNyZWF0ZWQgd2l0aCBicmVha2Rvd24gZWxlbWVudHMuIEV4YW1wbGVzIG9mIGJyZWFrZG93biBlbGVtZW50cwotYXJlIDxhIGhyZWY9InBoYXNlLmh0bWwjcGhhc2UiPlBoYXNlPC9hPiwgPGEgaHJlZj0iaXRlcmF0aW9uLmh0bWwjaXRlcmF0aW9uIj5JdGVyYXRpb248L2E+LCA8YSBocmVmPSJhY3Rpdml0eS5odG1sI2FjdGl2aXR5Ij5BY3Rpdml0eTwvYT4sCi1vciB0YXNrIGRlc2NyaXB0b3IuIFR5cGljYWxseSwgYSBwcm9jZXNzIGlzIGNyZWF0ZWQgYnkgZGVmaW5pbmcKLWl0cyBwaGFzZXMgYW5kIGl0ZXJhdGlvbnMgd2l0aGluIG9yIGFjcm9zcyB0aGVzZSBwaGFzZXMuIFBoYXNlcyBhbmQgaXRlcmF0aW9ucwotYXJlIHRoZW4gZnVydGhlciBicm9rZW4gZG93biBpbnRvIGxldmVscyBvZiBhY3Rpdml0aWVzLiBGaW5hbGx5LCB5b3UgY2FuIHBvcHVsYXRlCi1hIHdvcmsgYnJlYWtkb3duIHN0cnVjdHVyZSdzIGFjdGl2aXR5IHdpdGggdGFzayBkZXNjcmlwdG9ycy48L2Rpdj4KLTwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPlJpZ2h0IGNsaWNrIHRoZSBlbGVtZW50IChlaXRoZXIgYSA8YSBocmVmPSJjYXBhYmlsaXR5cGF0dGVybi5odG1sI2NhcGFiaWxpdHlwYXR0ZXJuIj5DYXBhYmlsaXR5IFBhdHRlcm48L2E+IG9yIDxhIGhyZWY9ImRlbGl2ZXJ5cHJvY2Vzcy5odG1sI2RlbGl2ZXJ5cHJvY2VzcyI+RGVsaXZlcnkgUHJvY2VzczwvYT4pIHRvIHdoaWNoIHlvdSB3YW50IHRvIGFkZCBzdHJ1Y3R1cmUsIGFuZCB0aGVuIGNsaWNrIDxzdHJvbmc+TmV3Ci1DaGlsZCAmZ3Q7IEFjdGl2aXR5PC9zdHJvbmc+IHRvIGNyZWF0ZSB0aGUgbmV3IGFjdGl2aXR5LiBJZiBuZWVkZWQsIGNyZWF0ZSBtb3JlIGFjdGl2aXRpZXMKLXRvIHNldCB1cCB5b3VyIGJyZWFrZG93biBzdHJ1Y3R1cmUuIEFjdGl2aXRpZXMgKGFzIHdlbGwgYXMgcGhhc2VzIGFuZCBpdGVyYXRpb25zKQotY2FuIGJlIG5lc3RlZCBpbnNpZGUgZWFjaCBvdGhlciBhY2NvcmRpbmcgdG8gaG93IGVhY2ggcmVsYXRlcyBpbiB0aGUgaGllcmFyY2h5Ljwvc3Bhbj48L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5SaWdodCBjbGljayB0aGUgYWN0aXZpdHkgYW5kIHRoZW4gc2VsZWN0IDxzdHJvbmc+UHJvcGVydGllczwvc3Ryb25nPiB0byBvcGVuCi10aGUgUHJvcGVydGllcyB2aWV3LiBDb21wbGV0ZSB0aGUgaW5mb3JtYXRpb24gdW5kZXIgdGhlIERvY3VtZW50YXRpb24gdGFiCi1mb3IgdGhlIGFjdGl2aXR5LiBUaGlzIGluZm9ybWF0aW9uIGFwcGVhcnMgaW4gdGhlIHB1Ymxpc2hlZCBXZWIgcGFnZSBmb3IgdGhlCi1hY3Rpdml0eS48L3NwYW4+PC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+UmV2aWV3IHRoZSBsaXN0IG9mIHRhc2tzIGluIHRoZSBjb25maWd1cmF0aW9uIHZpZXcgdG8gc2VlIHdoaWNoCi10YXNrcyBhcmUgYXZhaWxhYmxlLjwvc3Bhbj48L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5TZWxlY3QgYSB0YXNrIHRvIGFkZCB0byB0aGUgYnJlYWtkb3duIHN0cnVjdHVyZSBhbmQgdGhlbiBkcmFnIGl0Ci1vbiB0b3Agb2YgdGhlIGFjdGl2aXR5IHRvIHdoaWNoIHlvdSB3YW50IGl0IHRvIGJlbG9uZy4gVGhlIHRhc2sgaXMgYWRkZWQgYXMKLWEgdGFzayBkZXNjcmlwdG9yIHRvIHRoYXQgYWN0aXZpdHkuPC9zcGFuPjwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPklmIHRoZSBwcm9wZXJ0aWVzIHZpZXcgZm9yIHRoZSBhY3Rpdml0eSBpcyBub3QgZGlzcGxheWVkLCBzZWxlY3QKLXRoZSB0YXNrIGluIHRoZSB3b3JrIGJyZWFrZG93biBzdHJ1Y3R1cmUgZWRpdG9yLCByaWdodCBjbGljaywgYW5kIHRoZW4gc2VsZWN0IDxzdHJvbmc+UHJvcGVydGllczwvc3Ryb25nPi4KLUNsaWNrIHRoZSA8c3Ryb25nPkRvY3VtZW50YXRpb248L3N0cm9uZz4gdGFiIGFuZCB0aGVuIGNvbXBsZXRlIHRoZSBpbmZvcm1hdGlvbiByZXF1aXJlZAotdW5kZXIgdGhpcyB0YWIuIFRoaXMgaW5mb3JtYXRpb24gYXBwZWFycyBpbiB0aGUgcHVibGlzaGVkIFdlYiBwYWdlIGZvciB0aGUKLWFjdGl2aXR5LiBVc2UgdGhlIHRhYnMgb24gdGhlIHNpZGUgb2YgdGhlIHByb3BlcnRpZXMgdmlldyB0byByZXZpZXcgZGlmZmVyZW50Ci1hc3BlY3RzIG9mIHRoZSB0YXNrIGRlc2NyaXB0b3IuIEluIHRoZSBwcm9wZXJ0aWVzIHZpZXcsIHlvdSBjYW4gcGVyZm9ybSBpbmRpdmlkdWFsCi1tb2RpZmljYXRpb25zIG9mIHRoZSB0YXNrIGRlc2NyaXB0b3IsIHN1Y2ggYXMgY2hhbmdlIHRoZSBwcmVzZW50YXRpb24gbmFtZSwKLWFkZCB0ZXh0dWFsIGRlc2NyaXB0aW9ucywgYW5kIGNoYW5nZSBwZXJmb3JtaW5nIHJvbGVzLCBhbW9uZyBvdGhlcnMuIFdoZW4KLWNoYW5naW5nIHRoZSB0YXNrIGRlc2NyaXB0b3IncyByZWxhdGlvbnNoaXBzIHVuZGVyIHRoZSByb2xlcyBvciB3b3JrIHByb2R1Y3RzCi10YWJzLCB5b3UgY2FuIGFkZCBuZXcgZWxlbWVudHMgZnJvbSB5b3VyIG1ldGhvZCBjb250ZW50IGJ5IGNsaWNraW5nIHRoZSA8c3Ryb25nPkFkZC4uLjwvc3Ryb25nPiBidXR0b24sCi1vciBjb25uZWN0IHlvdXIgdGFzayBkZXNjcmlwdG9yIHdpdGggdGFza3MgYWxyZWFkeSBwcmVzZW50IGluIHRoaXMgYWN0aXZpdHkuCi1Gb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIDxhIGhyZWY9InByb2Nlc3NlbGVtZW50cHJvcGVydGllc3ZpZXcuaHRtbCNwcm9jZXNzZWxlbWVudHByb3BlcnRpZXN2aWV3Ij5Qcm9jZXNzIEVsZW1lbnQgUHJvcGVydGllcyBWaWV3PC9hPi48L3NwYW4+PC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+Q29udGludWUgYWRkaW5nIHRhc2tzIHRvIHRoZSBhY3Rpdml0eSBvciBhY3Rpdml0aWVzLjwvc3Bhbj48L2xpPgotPC9vbD4KLTxkaXYgY2xhc3M9InNlY3Rpb24iPllvdSBjYW4gcHJldmlldyB3aGF0IHlvdXIgcHJvY2VzcyB3aWxsIGxvb2sgbGlrZSBpbiBhIHB1Ymxpc2hlZCBXZWIKLXNpdGUgYXQgYW55IHRpbWUgYnkgc3dpdGNoaW5nIHRvIHRoZSA8YSBocmVmPSJicm93c2luZ3BlcnNwZWN0aXZlLmh0bWwjYnJvd2luZ3BlcnNwZWN0aXZlIj5Ccm93c2luZyBQZXJzcGVjdGl2ZTwvYT4gYW5kIHRoZW4gc2VsZWN0aW5nIHRoZSBwcm9jZXNzLCBvciBhbiBhY3Rpdml0eSBpbiB0aGUKLXByb2Nlc3MsIGluIHRoZSA8YSBocmVmPSJjb25maWd1cmF0aW9udmlldy5odG1sIj5Db25maWd1cmF0aW9uIFZpZXc8L2E+LiBZb3UgY2FuIHVzZSB0aGUKLWxpbmtzIG9uIHRoZSBwYWdlIHRvIG5hdmlnYXRlIHRocm91Z2ggdGhlIHByb2Nlc3MuIFN3aXRjaCBiYWNrIHRvIHRoZSA8YSBocmVmPSJhdXRob3JpbmdwZXJzcGVjdGl2ZS5odG1sI2F1dGhvcmluZ3BlcnNwZWN0aXZlIj5BdXRob3JpbmcgUGVyc3BlY3RpdmU8L2E+IHRvCi1jb250aW51ZSBlZGl0aW5nIHlvdXIgcHJvY2Vzcy48L2Rpdj4KLTwvZGl2PgotPGRpdj48ZGl2IGNsYXNzPSJyZWx0YXNrcyI+PHN0cm9uZz5SZWxhdGVkIHRhc2tzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9ImRldmVsb3BhdGVhbWFsbG9jYXRpb25zdHJ1Y3R1cmUuaHRtbCNkZXZlbG9wYXRlYW1hbGxvY2F0aW9uc3RydWN0dXJlIj5EZXZlbG9wIGEgVGVhbSBBbGxvY2F0aW9uIFN0cnVjdHVyZTwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iZGV2ZWxvcGF3b3JrcHJvZHVjdHVzYWdlc3RydWN0dXJlLmh0bWwjZGV2ZWxvcGF3b3JrcHJvZHVjdHVzYWdlc3RydWN0dXJlIj5EZXZlbG9wIGEgV29yayBQcm9kdWN0IFVzYWdlIFN0cnVjdHVyZTwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9kZXZlbG9wYXdvcmtwcm9kdWN0dXNhZ2VzdHJ1Y3R1cmUuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2RldmVsb3Bhd29ya3Byb2R1Y3R1c2FnZXN0cnVjdHVyZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNDBhMDYzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2RldmVsb3Bhd29ya3Byb2R1Y3R1c2FnZXN0cnVjdHVyZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJzZWN1cml0eSIgY29udGVudD0icHVibGljIiAvPgotPG1ldGEgbmFtZT0iUm9ib3RzIiBjb250ZW50PSJpbmRleCxmb2xsb3ciIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIG5hbWU9IkRDLlR5cGUiIGNvbnRlbnQ9InRhc2siIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iRGV2ZWxvcCBhIFdvcmsgUHJvZHVjdCBVc2FnZSBTdHJ1Y3R1cmUiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9ImRldmVsb3Bhd29ya2JyZWFrZG93bnN0cnVjdHVyZS5odG1sI2RldmVsb3Bhd29ya2JyZWFrZG93bnN0cnVjdHVyZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iZGV2ZWxvcGF0ZWFtYWxsb2NhdGlvbnN0cnVjdHVyZS5odG1sI2RldmVsb3BhdGVhbWFsbG9jYXRpb25zdHJ1Y3R1cmUiIC8+Ci08bWV0YSBuYW1lPSJEQy5Gb3JtYXQiIGNvbnRlbnQ9IlhIVE1MIiAvPgotPG1ldGEgbmFtZT0iREMuSWRlbnRpZmllciIgY29udGVudD0iZGV2ZWxvcGF3b3JrcHJvZHVjdHVzYWdlc3RydWN0dXJlIiAvPgotPG1ldGEgbmFtZT0iREMuTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIiAvPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuL2libWRpdGEuY3NzIiAvPgotPHRpdGxlPkRldmVsb3AgYSBXb3JrIFByb2R1Y3QgVXNhZ2UgU3RydWN0dXJlPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJkZXZlbG9wYXdvcmtwcm9kdWN0dXNhZ2VzdHJ1Y3R1cmUiPjxhIG5hbWU9ImRldmVsb3Bhd29ya3Byb2R1Y3R1c2FnZXN0cnVjdHVyZSI+PCEtLSAtLT48L2E+Ci0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPkRldmVsb3AgYSBXb3JrIFByb2R1Y3QgVXNhZ2UgU3RydWN0dXJlPC9oMT4KLTxkaXY+PGRpdiBjbGFzcz0icCI+SW4gdGhlIFdvcmsgUHJvZHVjdCBVc2FnZSB2aWV3LCB5b3UgY2FuIGNyZWF0ZSBhIHByb2Nlc3MgYnkgZGVmaW5pbmcKLXdoaWNoIHdvcmsgcHJvZHVjdHMgd2lsbCBiZSBjcmVhdGVkIGFuZCB1c2VkIGluIHRoZSBwcm9jZXNzLCBhbmQgdGhlbiBmaW5kaW5nCi1yZXNwb25zaWJsZSByb2xlcyBhbmQgdGFza3MgZnJvbSB0aGVyZS4gWW91IGNhbiBhbHNvIHJldmlldyB0aGUgd29yayBwcm9kdWN0cwotaW4gYSBwcm9jZXNzIHRoYXQgaGFzIGJlZW4gY3JlYXRlZCBieSBhZGRpbmcgdGFza3Mgb3Igcm9sZXMgdG8gdGhlIHByb2Nlc3MuPHA+QmVmb3JlCi15b3UgY3JlYXRlIGEgd29yayBwcm9kdWN0IHVzYWdlIHN0cnVjdHVyZSwgZW5zdXJlIHRoZSBjb25maWd1cmF0aW9uIHNlbGVjdGVkCi1pbiB0aGUgdG9vbCBiYXIgaXMgdGhlIHNhbWUgYXMgdGhlIGNvbmZpZ3VyYXRpb24geW91IHNlbGVjdGVkIGFzIHRoZSBkZWZhdWx0Ci1jb25maWd1cmF0aW9uIGZvciB5b3VyIHByb2Nlc3MuPC9wPgotPC9kaXY+Ci08ZGl2IGNsYXNzPSJzZWN0aW9uIj5UbyBkZXZlbG9wIGEgd29yayBwcm9kdWN0IHVzYWdlIHN0cnVjdHVyZTo8L2Rpdj4KLTxvbD48bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPlRvIGFjY2VzcyB0aGUgd29yayBwcm9kdWN0IHVzYWdlIGVkaXRvciwgc2VsZWN0IHRoZSA8c3Ryb25nPldvcmsgUHJvZHVjdAotVXNhZ2U8L3N0cm9uZz4gdGFiIGluIHRoZSBwcm9jZXNzIGVkaXRvci48L3NwYW4+IDxkaXYgY2xhc3M9Im5vdGUiPjxzcGFuIGNsYXNzPSJub3RldGl0bGUiPk5vdGU6PC9zcGFuPiBGb3IgdGhlIHB1cnBvc2VzIG9mCi10aGlzIHRvcGljLCB0aGUgYnJlYWtkb3duIGVsZW1lbnQgZXhhbXBsZSB1c2VkIGlzIDxhIGhyZWY9ImFjdGl2aXR5Lmh0bWwjYWN0aXZpdHkiPkFjdGl2aXR5PC9hPi4gT3RoZXIgYnJlYWtkb3duIGVsZW1lbnRzIGluY2x1ZGUgKGJ1dCBhcmUgbm90IGxpbWl0ZWQKLXRvKSA8YSBocmVmPSJwaGFzZS5odG1sI3BoYXNlIj5QaGFzZTwvYT4gYW5kIDxhIGhyZWY9Iml0ZXJhdGlvbi5odG1sI2l0ZXJhdGlvbiI+SXRlcmF0aW9uPC9hPi4gVGhlIGVsZW1lbnQgeW91IHVzZSBkZXBlbmRzIG9uIHRoZSBzY29wZSBvZiB0aGUgcHJvY2VzcwoteW91IGNyZWF0ZS48L2Rpdj4KLTwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPlJpZ2h0IGNsaWNrIHRoZSBlbGVtZW50IChlaXRoZXIgYSA8YSBocmVmPSJjYXBhYmlsaXR5cGF0dGVybi5odG1sI2NhcGFiaWxpdHlwYXR0ZXJuIj5DYXBhYmlsaXR5IFBhdHRlcm48L2E+IG9yIDxhIGhyZWY9ImRlbGl2ZXJ5cHJvY2Vzcy5odG1sI2RlbGl2ZXJ5cHJvY2VzcyI+RGVsaXZlcnkgUHJvY2VzczwvYT4pIHRvIHdoaWNoIHlvdSB3YW50IHRvIGFkZCBzdHJ1Y3R1cmUsIGFuZCB0aGVuIGNsaWNrIDxzdHJvbmc+TmV3Ci1DaGlsZCAmZ3Q7IEFjdGl2aXR5PC9zdHJvbmc+IHRvIGNyZWF0ZSBhIG5ldyBhY3Rpdml0eS4gSWYgbmVlZGVkLCBjcmVhdGUgbW9yZSBhY3Rpdml0aWVzCi10byBzZXQgdXAgeW91ciBicmVha2Rvd24gc3RydWN0dXJlLiBBY3Rpdml0aWVzIChhcyB3ZWxsIGFzIHBoYXNlcyBhbmQgaXRlcmF0aW9ucykKLWNhbiBiZSBuZXN0ZWQgaW5zaWRlIGVhY2ggb3RoZXIgYWNjb3JkaW5nIHRvIGhvdyBlYWNoIHJlbGF0ZXMgaW4gdGhlIGhpZXJhcmNoeS48L3NwYW4+PC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+UmV2aWV3IHRoZSBsaXN0IG9mIHdvcmsgcHJvZHVjdHMgaW4gdGhlIDxhIGhyZWY9ImNvbmZpZ3VyYXRpb252aWV3Lmh0bWwjY29uZmlndXJhdGlvbnZpZXciPkNvbmZpZ3VyYXRpb24gVmlldzwvYT4uIEluIHRoaXMgdmlldywgd29yayBwcm9kdWN0cyBhcmUgc29ydGVkIGJ5IGRvbWFpbiBhcwotd2VsbCBhcyB3b3JrIHByb2R1Y3Qga2luZHMuIERyaWxsIGludG8gZWl0aGVyIG9mIHRoZXNlIGhpZXJhcmNoaWVzIHRvIHNlZQotd2hpY2ggd29yayBwcm9kdWN0cyBhcmUgYXZhaWxhYmxlIGluIHRoaXMgY29uZmlndXJhdGlvbi48L3NwYW4+PC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+U2VsZWN0IGEgd29yayBwcm9kdWN0IHRvIGFkZCB0byBhY3Rpdml0eSBhbmQgdGhlbiBkcmFnIGl0IG9uIHRvcAotb2YgdGhlIGFjdGl2aXR5IHdoaWNoIHlvdSB3YW50IGl0IHRvIGJlbG9uZy4gVGhlIHdvcmsgcHJvZHVjdCBpcyBhZGRlZCBhcwotYSB3b3JrIHByb2R1Y3QgZGVzY3JpcHRvciB0byB0aGF0IGFjdGl2aXR5LiBJZiB0aGUgd29yayBwcm9kdWN0IGlzIGFuIG91dHB1dAotdG8gb25lIG9yIG1vcmUgdGFza3MgaW4gdGhlIGNvbmZpZ3VyYXRpb24sIGEgd2l6YXJkIGFwcGVhcnMgcHJvbXB0aW5nIHlvdQotdG8gYWRkIHRoZSB0YXNrLiA8L3NwYW4+IDxkaXYgY2xhc3M9Im5vdGUiPjxzcGFuIGNsYXNzPSJub3RldGl0bGUiPk5vdGU6PC9zcGFuPiBJdCBpcyBub3QgcmVxdWlyZWQgdG8gYWRkIGEgdGFzay4gQSB2YWxpZAotcHJvY2VzcyBjYW4gY29udGFpbiBqdXN0IHJvbGVzIGFuZCB3b3JrIHByb2R1Y3RzLjwvZGl2PgotPC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+U3BlY2lmeSB0aGUgZW50cnkgYW5kIGV4aXQgc3RhdGVzIG9mIHRoZSB3b3JrIHByb2R1Y3QgZm9yIHRoZSBhY3Rpdml0eQotdG8gd2hpY2ggaXQgd2FzIGFkZGVkLjwvc3Bhbj48L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5SZXZpZXcgdGhlIG5ldyB3b3JrIHByb2R1Y3QgZGVzY3JpcHRvciBkZXRhaWxzIGluIHRoZSBwcm9wZXJ0aWVzCi12aWV3LiBJZiB0aGUgcHJvcGVydGllcyB2aWV3IGlzIG5vdCBkaXNwbGF5ZWQsIHJpZ2h0IGNsaWNrIHRoZSB3b3JrIHByb2R1Y3QKLWRlc2NyaXB0b3IgaW4gdGhlIHByb2Nlc3MgZWRpdG9yLCBhbmQgdGhlbiBzZWxlY3QgPHN0cm9uZz5Qcm9wZXJ0aWVzPC9zdHJvbmc+LiBVc2UgdGhlCi10YWJzIG9uIHRoZSBzaWRlIG9mIHRoZSBwcm9wZXJ0aWVzIHZpZXcgdG8gcmV2aWV3IGRpZmZlcmVudCBhc3BlY3RzIG9mIHRoZQotd29yayBwcm9kdWN0IGRlc2NyaXB0b3IuIEluIHRoZSBQcm9wZXJ0aWVzIHZpZXcsIHlvdSBjYW4gYWxzbyBwZXJmb3JtIGluZGl2aWR1YWwKLW1vZGlmaWNhdGlvbnMgb2YgdGhlIHJvbGUgZGVzY3JpcHRvciwgc3VjaCBhcyBjaGFuZ2UgdGhlIHByZXNlbnRhdGlvbiBuYW1lLAotYWRkIHRleHR1YWwgZGVzY3JpcHRpb25zLCBhZGQgZW50cnkgYW5kIGV4aXQgc3RhdGVzLCBhbmQgbW9yZS4gV2hlbiBjaGFuZ2luZwotdGhlIHJvbGUgZGVzY3JpcHRvcidzIHJlbGF0aW9uc2hpcHMgdW5kZXIgdGhlIFJvbGVzIG9yIFdvcmsgUHJvZHVjdHMgdGFicywKLXlvdSBjYW4gYWRkIG5ldyBlbGVtZW50cyBmcm9tIHlvdXIgbWV0aG9kIGNvbnRlbnQgYnkgY2xpY2tpbmcgdGhlIDxzdHJvbmc+QWRkLi4uPC9zdHJvbmc+IGJ1dHRvbiwKLW9yIGNvbm5lY3QgeW91ciByb2xlIGRlc2NyaXB0b3Igd2l0aCB0YXNrcyBhbHJlYWR5IHByZXNlbnQgaW4gdGhpcyBhY3Rpdml0eS4KLUZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgPGEgaHJlZj0icHJvY2Vzc2VsZW1lbnRwcm9wZXJ0aWVzdmlldy5odG1sI3Byb2Nlc3NlbGVtZW50cHJvcGVydGllc3ZpZXciPlByb2Nlc3MgRWxlbWVudCBQcm9wZXJ0aWVzIFZpZXc8L2E+Ljwvc3Bhbj48L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5Db250aW51ZSBhZGRpbmcgd29yayBwcm9kdWN0cyB0byB5b3VyIGFjdGl2aXRpZXMuIDwvc3Bhbj48L2xpPgotPC9vbD4KLTxkaXYgY2xhc3M9InNlY3Rpb24iPlNlZSBhbHNvOjwvZGl2PgotPC9kaXY+Ci08ZGl2PjxkaXYgY2xhc3M9InJlbHRhc2tzIj48c3Ryb25nPlJlbGF0ZWQgdGFza3M8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iZGV2ZWxvcGF3b3JrYnJlYWtkb3duc3RydWN0dXJlLmh0bWwjZGV2ZWxvcGF3b3JrYnJlYWtkb3duc3RydWN0dXJlIj5EZXZlbG9wIGEgV29yayBCcmVha2Rvd24gU3RydWN0dXJlPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJkZXZlbG9wYXRlYW1hbGxvY2F0aW9uc3RydWN0dXJlLmh0bWwjZGV2ZWxvcGF0ZWFtYWxsb2NhdGlvbnN0cnVjdHVyZSI+RGV2ZWxvcCBhIFRlYW0gQWxsb2NhdGlvbiBTdHJ1Y3R1cmU8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvZGlmZmVyZW5jZXNiZXR3ZWVuZXhpc3RpbmdhbmRtaWdyYXRlZGNvbnRlbnQuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2RpZmZlcmVuY2VzYmV0d2VlbmV4aXN0aW5nYW5kbWlncmF0ZWRjb250ZW50Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlMGIxYjEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvZGlmZmVyZW5jZXNiZXR3ZWVuZXhpc3RpbmdhbmRtaWdyYXRlZGNvbnRlbnQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDEwNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGh0bWwKLSAgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9InNlY3VyaXR5IiBjb250ZW50PSJwdWJsaWMiIC8+Ci08bWV0YSBuYW1lPSJSb2JvdHMiIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgbmFtZT0iREMuVHlwZSIgY29udGVudD0iY29uY2VwdCIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJEaWZmZXJlbmNlcyBCZXR3ZWVuIElCTSBSVVAgMjAwMyBhbmQgTWlncmF0ZWQgQ29udGVudCIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0ibWlncmF0aW9ub3ZlcnZpZXcuaHRtbCNtaWdyYXRpb25vdmVydmlldyIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0ibWlncmF0ZWFucnB3MjAwM3BsdWdpbi5odG1sI21pZ3JhdGVhbnJwdzIwMDNwbHVnaW4iIC8+Ci08bWV0YSBuYW1lPSJEQy5Gb3JtYXQiIGNvbnRlbnQ9IlhIVE1MIiAvPgotPG1ldGEgbmFtZT0iREMuSWRlbnRpZmllciIgY29udGVudD0iZGlmZmVyZW5jZXNiZXR3ZWVuZXhpc3RpbmdhbmRtaWdyYXRlZGNvbnRlbnQiIC8+Ci08bWV0YSBuYW1lPSJEQy5MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiIC8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4vaWJtZGl0YS5jc3MiIC8+Ci08dGl0bGU+RGlmZmVyZW5jZXMgQmV0d2VlbiBJQk0gUlVQIDIwMDMgYW5kIE1pZ3JhdGVkIENvbnRlbnQ8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9ImRpZmZlcmVuY2VzYmV0d2VlbmV4aXN0aW5nYW5kbWlncmF0ZWRjb250ZW50Ij48YSBuYW1lPSJkaWZmZXJlbmNlc2JldHdlZW5leGlzdGluZ2FuZG1pZ3JhdGVkY29udGVudCI+PCEtLSAtLT48L2E+Ci0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPkRpZmZlcmVuY2VzIEJldHdlZW4gSUJNIFJVUCAyMDAzIGFuZCBNaWdyYXRlZCBDb250ZW50PC9oMT4KLTxkaXY+PHA+RWNsaXBzZSBQcm9jZXNzIEZyYW1ld29yayBDb21wb3NlciBjb250ZW50IGlzIGJhc2VkIG9uIElCTSBVbmlmaWVkCi1NZXRob2QgQXJjaGl0ZWN0dXJlLjwvcD4KLTx1bD48bGk+PHN0cm9uZz5BY3Rpdml0aWVzIGhhdmUgYmVlbiByZW5hbWVkIHRvIHRhc2s8L3N0cm9uZz46IFRvIHByb3ZpZGUgYSB0aWdodGVyIGxpbmsKLXRvIHByb2Nlc3MgZW5hY3RtZW50IGFuZCBwcm9qZWN0IG1hbmFnZW1lbnQgd2UgcmVuYW1lZCB0aGUgbG93ZXN0IGFzc2lnbmFibGUKLXVuaXRzIG9mIHdvcmsgdG8gVGFzaywgYmVjYXVzZSB0aGlzIGlzIHRoZSB0ZXJtIG1vc3QgY29tbW9ubHkgdXNlZC48L2xpPgotPGxpPjxzdHJvbmc+V29ya2Zsb3cgZGV0YWlscyByZW5hbWVkIHRvIGFjdGl2aXR5PC9zdHJvbmc+OiBXb3JrZmxvd3MgYXJlIGNvbW1vbmx5IGV4cHJlc3NlZAotaW4gaGllcmFyY2hpZXMgb2YgYWN0aXZpdHkgZGlhZ3JhbXMgKGUuZy4gYWN0aXZpdHkgZGlhZ3JhbXMgZGVmaW5lZCBpbiB0aGUKLVVNTCAyLjApLiAgQWx0aG91Z2ggUlVQIG9ubHkgcHJvdmlkZWQgb25lIGxldmVsIG9mIHdvcmtmbG93IGJyZWFrZG93biwgVU1BCi1pcyBkZXNpZ25lZCB0byBwcm92aWRlIG11bHRpcGxlIGxldmVscyBvZiBzdWNoIGEgYnJlYWtkb3duLiBCZWNhdXNlIHRoZSB3b3JkCi1BY3Rpdml0eSB3YXMgbW9yZSBjb21tb25seSB1c2VkIHRvIGV4cHJlc3MgdGhlIGVsZW1lbnRzIG9mIGFjdGl2aXR5IGRpYWdyYW1zCi1hcyB3ZWxsIGFzIHRoZSBhY3Rpdml0eSBkaWFncmFtIGl0c2VsZiwgd2UgZGVjaWRlZCB0byByZXBsYWNlIHRoZSBuYW1lIFdvcmtmbG93Ci1EZXRhaWwgdXNlZCBpbiBSVVAgd2l0aCB0aGUgbmFtZSBBY3Rpdml0eS4gIFdlIHJlYWxpemUgdGhhdCB0aGUgc2hpZnQgaW4gdGhlCi11c2FnZSBvZiB0aGUgd29yZCBBY3Rpdml0eSBtaWdodCBjYXVzZSBjb25mdXNpb24gd2l0aCBleGlzdGluZyBSVVAgdXNlcnMuCi0gSG93ZXZlciwgb25lIGltcG9ydGFudCBnb2FsIG9mIHRoZSBVTUEgd29yayB3YXMgdG8gdXNlIHRlcm1zIGluIHRoZSB3YXkgdGhleQotYXJlIG1vc3QgY29tbW9ubHkgdXNlZCBpbiBzdGFuZGFyZHMgYW5kIGluZHVzdHJ5LiA8L2xpPgotPGxpPjxzdHJvbmc+VGFza3MgKGZvcm1lciBSVVAgQWN0aXZpdGllcykgY2FuIGJlIHBlcmZvcm1lZCBieSBtYW55IHJvbGVzPC9zdHJvbmc+OiAKLUluIFJVUCAyMDAzIGFuIGFjdGl2aXR5IHdhcyBtb2RlbGVkIGFzIGFuIG9wZXJhdGlvbiBvZiBhIHJvbGUuICBDdXN0b21lciBmZWVkYmFjaywKLWEgbG9vayBhdCBvdGhlciBwcm9jZXNzIG1vZGVsaW5nIGFwcHJvYWNoZXMsIGFzIHdlbGwgYXMgY2hhbmdlcyBpbnRyb2R1Y2VkCi1pbiBVTUwgMi4wIGluZGljYXRlZCB0aGF0IHRoaXMgd2FzIGEgdG9vIHJlc3RyaWN0aXZlIHdheSBvZiBtb2RlbGluZyBodW1hbgotYmVoYXZpb3IuICBUaGlzIGFwcHJvYWNoIGRpZCBub3QgYWxsb3cgZXhwcmVzc2luZyB0aGF0IHNvbWUgd29yayB3YXMgcGVyZm9ybWVkCi1hcyBhIGNvbGxhYm9yYXRpb24gb2YgZGlmZmVyZW50IHJvbGVzLiAgVU1BIGFkZHJlc3NlcyB0aGlzIGlzc3VlIGJ5IG1ha2luZwotVGFzayBhbiBpbmRlcGVuZGVudCBtb2RlbCBlbGVtZW50IHRvIHdoaWNoIHBlcmZvcm1pbmcgcm9sZXMgY2FuIGJlIGFzc2lnbmVkCi1hcyByZXNvdXJjZXMuICBVTUEgdGhlcmVmb3JlIG5vdyBhbGxvd3Mgc2V2ZXJhbCByb2xlcyB0byBiZSBhc3NpZ25lZCB0byBhCi10YXNrLiAgRm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHksIGl0IHN0aWxsIGFsbG93cyBhIHByaW1hcnkgcGVyZm9ybWluZyByb2xlCi10byBiZSBpZGVudGlmaWVkIChiZWluZyByZXNwb25zaWJsZSBmb3IgdGhlIHRhc2spIGFzIHdlbGwgYXMgc2V2ZXJhbCBhZGRpdGlvbmFsCi1wZXJmb3JtZXJzLjwvbGk+Ci08bGk+PHN0cm9uZz5SZWZpbmVtZW50IG9mIHRoZSBhcnRpZmFjdCBjb25jZXB0PC9zdHJvbmc+OiBSVVAgb25seSB1c2VkIHRoZSBjb25jZXB0IG9mCi1hcnRpZmFjdCB0byBkZWZpbmUgdGhpbmdzIHRoYXQgYXJlIHVzZWQgYW5kIHByb2R1Y2VkIGluIGEgZGV2ZWxvcG1lbnQgcHJvamVjdC4KLSBVTUEgZGVmaW5lcyBhbiBleHRlbmRlZCB0YXhvbm9teSBmb3IgdGhlc2UgY29uY2VwdHMuICBJdCBkZWZpbmVzIHRoZSBnZW5lcmFsCi1jb25jZXB0IG9mIHdvcmsgcHJvZHVjdCwgd2hpY2ggaGFzIHRocmVlIGRpZmZlcmVudCBzcGVjaWFsaXphdGlvbnMgKHNwZWNpZmljCi13b3JrIHByb2R1Y3QgdHlwZXMpOiBBcnRpZmFjdHMgKG1hbmFnZWQgd29yayBwcm9kdWN0cyksIERlbGl2ZXJhYmxlcyAocGFja2FnZWQKLXdvcmsgcHJvZHVjdHMgdGhhdCB3aWxsIGJlIGRlbGl2ZXJlZCB0byBhIHN0YWtlaG9sZGVyIGZvciByZXZpZXcpLCBhbmQgT3V0Y29tZQotKHVubWFuYWdlZCwgaW50YW5naWJsZSB3b3JrIHByb2R1Y3RzKS48L2xpPgotPGxpPjxzdHJvbmc+RGlmZmVyZW50IGNhdGVnb3JpemF0aW9ucyBmb3Igd29yayBwcm9kdWN0cyBhbmQgcm9sZXM8L3N0cm9uZz46IEluIFJVUCwKLWFydGlmYWN0cyBhbmQgcm9sZXMgd2VyZSBhbGwgY2F0ZWdvcml6ZWQgYnkgZGlzY2lwbGluZS4gSG93ZXZlciwgc29tZXRpbWVzCi1hcnRpZmFjdHMgd2VyZSB1c2VkIGFjcm9zcyBkaXNjaXBsaW5lcyBhbmQgYSBjYXRlZ29yaXphdGlvbiB0byBvbmx5IG9uZSBkaXNjaXBsaW5lCi1jYXVzZWQgY29uZnVzaW9uLiAgSW4gVU1BIGRpZmZlcmVudCBjYXRlZ29yaWVzIGhhdmUgYmVlbiBkZWZpbmVkIGZvciB3b3JrCi1kZWZpbml0aW9ucyAoZGlzY2lwbGluZSBmb3IgdGFza3MgYW5kIGFjdGl2aXRpZXMpLCB3b3JrIHByb2R1Y3RzIChkb21haW4gYW5kCi13b3JrIHByb2R1Y3Qga2luZCksIGFuZCByb2xlcyAocm9sZSBzZXRzKS48L2xpPgotPGxpPjxzdHJvbmc+UHJvY2VzcyBDb21wb25lbnRzIHJlbmFtZWQgdG8gTWV0aG9kIFBhY2thZ2U8L3N0cm9uZz46ICBUaGUgY29uY2VwdCBvZiBjb21wb25lbnQKLWlzIGNvbW1vbmx5IHVzZWQgaW4gbWFueSBzdGFuZGFyZHMgYW5kIHRlY2hub2xvZ2llcy4gIE1vc3QgYXBwbGljYXRpb25zIG9mCi1jb21wb25lbnQgbGluayBpdCB0byB0aGUgYWJzdHJhY3Rpb24gb2YgZW5jYXBzdWxhdGlvbiBkZWZpbmluZyBhIGNvbXBvbmVudAotYXMgYSBibGFjayBib3ggd2hpY2ggY2FuIGJlIHVzZWQgdmlhIHdlbGwtZGVmaW5lZCBpbnRlcmZhY2VzLiAgUlVQIGNvbXBvbmVudAotZGlkIG5vdCBmdWxmaWxsIHRoaXMgYmxhY2sgYm94IGNyaXRlcmlvbi4gIEFsc28gdGhlIFNQRU0gc3RhbmRhcmQgZGVmaW5lZAotcGFja2FnZXMgYXMgd2VsbCBhcyBjb21wb25lbnRzLiBUbyBiZSBjb21wbGlhbnQgdG8gU1BFTSBhbmQgdGhlIGluZHVzdHJ5IHVzYWdlCi1vZiB0aGUgd29yZCBjb21wb25lbnQsIHdlIHJlbmFtZWQgUHJvY2VzcyBDb21wb25lbnQgdG8gTWV0aG9kIFBhY2thZ2UgKCdtZXRob2QnCi1iZWNhdXNlIGl0IGNhbiBjb250YWluIG1ldGhvZCBlbGVtZW50cyBvciBwcm9jZXNzIGVsZW1lbnRzKTwvbGk+Ci08bGk+PHN0cm9uZz5TZXBhcmF0aW9uIG9mIG1ldGhvZCBjb250ZW50IGVsZW1lbnRzIGZyb20gcHJvY2VzcyBlbGVtZW50czwvc3Ryb25nPjogSW4KLVJVUCAyMDAzIHlvdSBjcmVhdGVkIGEgbmV3IHByb2Nlc3MgYnkgZGVmaW5pbmcgYSBuZXcgY29uZmlndXJhdGlvbiBhbmQgZG9jdW1lbnRpbmcKLW1hbnVhbGx5IGluIGEgZGV2ZWxvcG1lbnQgY2FzZSBhcnRpZmFjdCBjaGFuZ2VzIHRvIHN0YW5kYXJkIFJVUC4gIFVNQSBwcm92aWRlcwotZXh0ZW5kZWQgY29uY2VwdHMgaW4gYWRkaXRpb24gdG8gdGhlIGNvbmZpZ3VyYXRpb24gY29uY2VwdCBmb3IgdGFpbG9yaW5nIHByb2Nlc3Nlcy4KLSBJdCBhbGxvd3MgeW91IHRvIG1vZGVsIGNvbmNyZXRlbHkgZm9yIGEgcHJvY2VzcyB3aGF0IHdvcmsgZGVmaW5lZCBpbiB0aGUKLW1ldGhvZCBjb250ZW50IHlvdSB3YW50IHRvIGFjdHVhbGx5IGRvIGluIGVhY2ggcGhhc2UsIGJlY2F1c2UgeW91IGNhbiBlYXNpbHkKLWFkZCwgcmVtb3ZlLCBhbmQgcmVvcmRlciBlbGVtZW50cyBpbiB0aGUgcHJvY2VzcyBzdHJ1Y3R1cmUsIHJldXNpbmcgb3Igbm90Ci1yZXVzaW5nIHdoYXRldmVyIHlvdSB3YW50IGZyb20gdGhlIG1ldGhvZCBjb250ZW50LiBJdCBhY2hpZXZlcyB0aGVzZSBmZWF0dXJlcwotYnkgYSBtb3JlIGNsZWFyIHNlcGFyYXRpb24gb2YgbWV0aG9kIGNvbnRlbnQgKGUuZy4gdGFza3MgZGVmaW5lZCBmb3IgZGlzY2lwbGluZXMpCi1hbmQgdGhlIGFwcGxpY2F0aW9uIG9mIG1ldGhvZCBjb250ZW50IGluIHByb2Nlc3MgKGV4cHJlc3NlZCB3aXRoIGFjdGl2aXR5Ci1kaWFncmFtcyBhbmQvb3Igd29yayBicmVha2Rvd24gc3RydWN0dXJlcykgYXMgd2VsbCBhcyB0aGUgbW9kZWxpbmcgb2YgcHJvY2Vzc2VzCi0oaS5lLiBjcmVhdGluZyBuZXcgb3IgYWRhcHRlZCBhY3Rpdml0eSBkaWFncmFtcyBvciBuZXcgb3IgYWRhcHRlZCB3b3JrIGJyZWFrZG93bgotc3RydWN0dXJlcykuICBJdCBpbnRyb2R1Y2VzIGEgZmV3IG5ldyBjb25jZXB0cyBzdWNoIGFzIGRlc2NyaXB0b3IgdGhhdCBzdXBwb3J0Ci10aGlzIHNlcGFyYXRpb24gYW5kIGFjaGlldmUgbmV3IGNhcGFiaWxpdGllcyBmb3IgbWFpbnRhaW5pbmcgYW5kIHJldXNpbmcgbWFueQotZGlmZmVyZW50IGZhbWlsaWVzIG9mIGFsdGVybmF0aXZlIHByb2Nlc3NlcyBhbmQgcHJvY2VzcyBwYXJ0cyBhbGwgd2l0aGluIHRoZQotc2FtZSBjb25maWd1cmF0aW9uLjwvbGk+Ci08L3VsPgotPC9kaXY+Ci08ZGl2PjxkaXYgY2xhc3M9InJlbGNvbmNlcHRzIj48c3Ryb25nPlJlbGF0ZWQgY29uY2VwdHM8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0ibWlncmF0aW9ub3ZlcnZpZXcuaHRtbCNtaWdyYXRpb25vdmVydmlldyI+TWlncmF0aW9uIE92ZXJ2aWV3PC9hPjwvZGl2PgotPC9kaXY+Ci08ZGl2IGNsYXNzPSJyZWx0YXNrcyI+PHN0cm9uZz5SZWxhdGVkIHRhc2tzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Im1pZ3JhdGVhbnJwdzIwMDNwbHVnaW4uaHRtbCNtaWdyYXRlYW5ycHcyMDAzcGx1Z2luIj5NaWdyYXRlIGFuIElCTSBSVVAgMjAwMy4wNiBQbHVnaW48L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvZGlzY2lwbGluZS5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvZGlzY2lwbGluZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZjVhMjlkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2Rpc2NpcGxpbmUuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgaHRtbAotICBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0ic2VjdXJpdHkiIGNvbnRlbnQ9InB1YmxpYyIgLz4KLTxtZXRhIG5hbWU9IlJvYm90cyIgY29udGVudD0iaW5kZXgsZm9sbG93IiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBuYW1lPSJEQy5UeXBlIiBjb250ZW50PSJjb25jZXB0IiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IkRpc2NpcGxpbmUiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9Im1ldGhvZGNvbnRlbnRjYXRlZ29yaWVzLmh0bWwjbWV0aG9kY29udGVudGNhdGVnb3JpZXMiIC8+Ci08bWV0YSBuYW1lPSJEQy5Gb3JtYXQiIGNvbnRlbnQ9IlhIVE1MIiAvPgotPG1ldGEgbmFtZT0iREMuSWRlbnRpZmllciIgY29udGVudD0iZGlzY2lwbGluZSIgLz4KLTxtZXRhIG5hbWU9IkRDLkxhbmd1YWdlIiBjb250ZW50PSJlbi11cyIgLz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi9pYm1kaXRhLmNzcyIgLz4KLTx0aXRsZT5EaXNjaXBsaW5lPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJkaXNjaXBsaW5lIj48YSBuYW1lPSJkaXNjaXBsaW5lIj48IS0tIC0tPjwvYT4KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+RGlzY2lwbGluZTwvaDE+Ci08ZGl2PjxwPkEgZGlzY2lwbGluZSBpcyBhIGNvbGxlY3Rpb24gb2YgPGEgaHJlZj0idGFzay5odG1sI3Rhc2siPlRhc2tzPC9hPiB0aGF0Ci1hcmUgcmVsYXRlZCB0byBhIG1ham9yIGFyZWEgb2YgY29uY2VybiB3aXRoaW4gdGhlIG92ZXJhbGwgSVQgZW52aXJvbm1lbnQuCi1Gb3IgZXhhbXBsZSwgb24gYSBzb2Z0d2FyZSBkZXZlbG9wbWVudCBwcm9qZWN0LCBpdCBpcyBjb21tb24gdG8gcGVyZm9ybSBjZXJ0YWluCi1yZXF1aXJlbWVudHMgdGFza3MgaW4gY2xvc2UgY29vcmRpbmF0aW9uIHdpdGggYW5hbHlzaXMgYW5kIGRlc2lnbiB0YXNrcy4gU2VwYXJhdGluZwotdGhlc2UgdGFza3MgaW50byBzZXBhcmF0ZSBkaXNjaXBsaW5lcyBtYWtlcyB0aGUgdGFza3MgZWFzaWVyIHRvIGNvbXByZWhlbmQuCi1EaXNjaXBsaW5lcyBjYW4gYmUgb3JnYW5pemVkIHVzaW5nIERpc2NpcGxpbmUgR3JvdXBpbmdzLjwvcD4KLTwvZGl2PgotPGRpdj48ZGl2IGNsYXNzPSJyZWxjb25jZXB0cyI+PHN0cm9uZz5SZWxhdGVkIGNvbmNlcHRzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Im1ldGhvZGNvbnRlbnRjYXRlZ29yaWVzLmh0bWwjbWV0aG9kY29udGVudGNhdGVnb3JpZXMiPk1ldGhvZCBDb250ZW50IENhdGVnb3JpZXM8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvZG9tYWluLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9kb21haW4uaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2E0MjM1MS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9kb21haW4uaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgaHRtbAotICBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0ic2VjdXJpdHkiIGNvbnRlbnQ9InB1YmxpYyIgLz4KLTxtZXRhIG5hbWU9IlJvYm90cyIgY29udGVudD0iaW5kZXgsZm9sbG93IiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBuYW1lPSJEQy5UeXBlIiBjb250ZW50PSJjb25jZXB0IiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IkRvbWFpbiIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0ibWV0aG9kY29udGVudGNhdGVnb3JpZXMuaHRtbCNtZXRob2Rjb250ZW50Y2F0ZWdvcmllcyIgLz4KLTxtZXRhIG5hbWU9IkRDLkZvcm1hdCIgY29udGVudD0iWEhUTUwiIC8+Ci08bWV0YSBuYW1lPSJEQy5JZGVudGlmaWVyIiBjb250ZW50PSJkb21haW4iIC8+Ci08bWV0YSBuYW1lPSJEQy5MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiIC8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4vaWJtZGl0YS5jc3MiIC8+Ci08dGl0bGU+RG9tYWluPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJkb21haW4iPjxhIG5hbWU9ImRvbWFpbiI+PCEtLSAtLT48L2E+Ci0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPkRvbWFpbjwvaDE+Ci08ZGl2PjxwPkEgRG9tYWluIGlzIGEgcmVmaW5lYWJsZSwgbG9naWNhbCwgaGllcmFyY2h5IG9mIHJlbGF0ZWQgPGEgaHJlZj0id29ya3Byb2R1Y3QuaHRtbCN3b3JrcHJvZHVjdCI+V29yayBQcm9kdWN0czwvYT4gZ3JvdXBlZCB0b2dldGhlciBiYXNlZCBvbiB0aW1pbmcsIHJlc291cmNlcywKLW9yIHJlbGF0aW9uc2hpcC4gV2hpbGUgYSBEb21haW4gY2F0ZWdvcml6ZXMgbWFueSB3b3JrIHByb2R1Y3RzLCBhIHdvcmsgcHJvZHVjdAotYmVsb25ncyB0byBvbmx5IG9uZSBEb21haW4uIERvbWFpbnMgY2FuIGJlIGZ1cnRoZXIgZGl2aWRlZCBpbnRvIHN1Yi1kb21haW5zLiA8L3A+Ci08L2Rpdj4KLTxkaXY+PGRpdiBjbGFzcz0icmVsY29uY2VwdHMiPjxzdHJvbmc+UmVsYXRlZCBjb25jZXB0czwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJtZXRob2Rjb250ZW50Y2F0ZWdvcmllcy5odG1sI21ldGhvZGNvbnRlbnRjYXRlZ29yaWVzIj5NZXRob2QgQ29udGVudCBDYXRlZ29yaWVzPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2V4YW1wbGUuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2V4YW1wbGUuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWQxYTUxMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9leGFtcGxlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGh0bWwKLSAgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9InNlY3VyaXR5IiBjb250ZW50PSJwdWJsaWMiIC8+Ci08bWV0YSBuYW1lPSJSb2JvdHMiIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgbmFtZT0iREMuVHlwZSIgY29udGVudD0iY29uY2VwdCIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJFeGFtcGxlIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJndWlkYW5jZS5odG1sI2d1aWRhbmNlIiAvPgotPG1ldGEgbmFtZT0iREMuRm9ybWF0IiBjb250ZW50PSJYSFRNTCIgLz4KLTxtZXRhIG5hbWU9IkRDLklkZW50aWZpZXIiIGNvbnRlbnQ9ImV4YW1wbGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiIC8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4vaWJtZGl0YS5jc3MiIC8+Ci08dGl0bGU+RXhhbXBsZTwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0iZXhhbXBsZSI+PGEgbmFtZT0iZXhhbXBsZSI+PCEtLSAtLT48L2E+Ci0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPkV4YW1wbGU8L2gxPgotPGRpdj48cD5BbiBFeGFtcGxlIGlzIGEgc3BlY2lmaWMgdHlwZSBvZiBndWlkYW5jZSB0aGF0IHByb3ZpZGVzIGFuIGV4YW1wbGUgb2YgYQotY29tcGxldGVkIHdvcmsgcHJvZHVjdC4gPC9wPgotPC9kaXY+Ci08ZGl2PjxkaXYgY2xhc3M9InJlbGNvbmNlcHRzIj48c3Ryb25nPlJlbGF0ZWQgY29uY2VwdHM8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iZ3VpZGFuY2UuaHRtbCNndWlkYW5jZSI+R3VpZGFuY2U8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvZXh0ZW5kcy5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvZXh0ZW5kcy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZTFmYjQzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2V4dGVuZHMuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgaHRtbAotICBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0ic2VjdXJpdHkiIGNvbnRlbnQ9InB1YmxpYyIgLz4KLTxtZXRhIG5hbWU9IlJvYm90cyIgY29udGVudD0iaW5kZXgsZm9sbG93IiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBuYW1lPSJEQy5UeXBlIiBjb250ZW50PSJjb25jZXB0IiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IkV4dGVuZHMiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9InZhcmlhYmlsaXR5Lmh0bWwjdmFyaWFiaWxpdHkiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9InJlcGxhY2UuaHRtbCNyZXBsYWNlcyIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iY29udHJpYnV0ZXMuaHRtbCNjb250cmlidXRlcyIgLz4KLTxtZXRhIG5hbWU9IkRDLkZvcm1hdCIgY29udGVudD0iWEhUTUwiIC8+Ci08bWV0YSBuYW1lPSJEQy5JZGVudGlmaWVyIiBjb250ZW50PSJleHRlbmRzIiAvPgotPG1ldGEgbmFtZT0iREMuTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIiAvPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuL2libWRpdGEuY3NzIiAvPgotPHRpdGxlPkV4dGVuZHM8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9ImV4dGVuZHMiPjxhIG5hbWU9ImV4dGVuZHMiPjwhLS0gLS0+PC9hPgotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5FeHRlbmRzPC9oMT4KLTxkaXY+PHA+QW4gZXh0ZW5kaW5nIGVsZW1lbnQgaW5oZXJpdHMgY2hhcmFjdGVyaXN0aWNzIG9mIHRoZSBiYXNlIGVsZW1lbnQuIEV4dGVuc2lvbgotYWxsb3dzIE1ldGhvZCBQbHVnLWlucyB0byBlYXNpbHkgcmV1c2UgZWxlbWVudHMgZnJvbSBhIGJhc2UgcGx1Zy1pbiBieSBwcm92aWRpbmcKLWEga2luZCBvZiBpbmhlcml0YW5jZSBmb3IgdGhlIGV4dGVuZGluZyBlbGVtZW50LiBBdHRyaWJ1dGUgdmFsdWVzIGFuZCBhc3NvY2lhdGlvbgotaW5zdGFuY2VzIGFyZSBpbmhlcml0ZWQgZnJvbSB0aGUgImJhc2VkLW9uIiBlbGVtZW50IHRvIHRoZSBleHRlbmRpbmcgZWxlbWVudC4KLVRoZSByZXN1bHQgaXMgdGhhdCB0aGUgZXh0ZW5kaW5nIGVsZW1lbnQgaGFzIHRoZSBzYW1lIHByb3BlcnRpZXMgYXMgdGhlICJiYXNlZC1vbiIKLWVsZW1lbnQsIGJ1dCBtaWdodCBkZWZpbmUgaXRzIG93biBhZGRpdGlvbnMuIEV4dGVuZHMgaXMgbm90IHVzZWQgdG8gbW9kaWZ5Ci1jb250ZW50IG9mIHRoZSBiYXNlIHBsdWctaW4sIGJ1dCB0byBwcm92aWRlIHRoZSBhYmlsaXR5IGZvciB0aGUgZXh0ZW5kaW5nCi1wbHVnLWluIHRvIGRlZmluZSBpdHMgb3duIGNvbnRlbnQgd2hpY2ggaXMgYSB2YXJpYW50IG9mIGNvbnRlbnQgYWxyZWFkeSBkZWZpbmVkLgotRm9yIGV4YW1wbGUsIGEgc3BlY2lhbCB2ZXJzaW9uIG9mIGEgZ2VuZXJpYyBSZXZpZXcgUmVjb3JkIGZvciBhIHNwZWNpZmljIHR5cGUKLW9mIHJldmlldy4gVGhlIGVmZmVjdCBvZiB0aGlzIGlzIHRoYXQgdGhlIGJhc2UgZWxlbWVudCBhbmQgYW55IG51bWJlciBvZiBleHRlbmRpbmcKLWVsZW1lbnRzIGNhbiBiZSB1c2VkIHNpZGUgYnkgc2lkZSwgYnV0IHJlZmVyIHRvIGVhY2ggb3RoZXIgdGhyb3VnaCB0aGUgZXh0ZW5kcwotcmVsYXRpb25zaGlwLiBFeHRlbmRzIGFsc28gcHJvdmlkZXMgdGhlIGtleSBtZWNoYW5pc20gZm9yIGJpbmRpbmcgY2FwYWJpbGl0eQotcGF0dGVybnMgdG8gcHJvY2Vzc2VzOiBBIHBhdHRlcm4gaXMgYXBwbGllZCBieSBkZWZpbmluZyBhbiBleHRlbmRzIHJlbGF0aW9uc2hpcAotZnJvbSBhbiBhY3Rpdml0eSBvZiB0aGUgYXBwbHlpbmcgcHJvY2Vzc2VzIHRvIHRoZSBjYXBhYmlsaXR5IHBhdHRlcm4uIFRoZQotYWN0aXZpdHkgaW5oZXJpdHMgYXNzb2NpYXRpb24gaW5zdGFuY2VzIGZyb20gdGhlIHBhdHRlcm4gYW5kIHRoZSBwYXR0ZXJuIGFwcGVhcnMKLXRvIGJlIHBhcnQgb2YgdGhlIHJlc3VsdGluZyBwcm9jZXNzIGFmdGVyIGludGVycHJldGF0aW9uLjwvcD4KLTxwPlVzZSB0aGUgQ29udGVudCBWYXJpYWJpbGl0eSBzZWN0aW9uIG9uIHRoZSBEZXNjcmlwdGlvbiB0YWIgdG8gbWFrZSBhbiBlbGVtZW50Ci1leHRlbmQgYW5vdGhlciBlbGVtZW50LiBTZWxlY3QgPHN0cm9uZz5FeHRlbmRzPC9zdHJvbmc+IGFzIHRoZSBWYXJpYWJpbGl0eSBUeXBlLCBhbmQKLXRoZW4gc2VsZWN0IHRoZSBiYXNlIGVsZW1lbnQgd2hpY2ggdGhpcyBlbGVtZW50IGV4dGVuZHMuIFRoZSBiYXNlIGVsZW1lbnQKLW11c3QgYmUgdGhlIHNhbWUgdHlwZSBvZiBlbGVtZW50IGFzIHRoZSBleHRlbmRpbmcgZWxlbWVudC48L3A+Ci08cD5BbnkgaW5mb3JtYXRpb24geW91IGVudGVyIGluIHRoZSBleHRlbmRpbmcgZWxlbWVudCBpcyBhZGRlZCB0byB0aGUgYmFzZQotZWxlbWVudCBpbiBjcmVhdGluZyBhbiBhZGRpdGlvbmFsIGVsZW1lbnQuIFRleHQgZmllbGRzIGluIHRoZSBleHRlbmRpbmcgZWxlbWVudAotYXJlIGFkZGVkIGF0IHRoZSBlbmQgb2YgdGhlIHJlc3BlY3RpdmUgdGV4dCBmaWVsZHMgaW4gdGhlIGJhc2UgZWxlbWVudC48L3A+Ci08cD5FeHRlbmRzIG9ubHkgZGVmaW5lcyBpbmhlcml0YW5jZSBmb3IgdGhlIGV4dGVuZGluZyBlbGVtZW50LiBUaGUgYmFzZSByZW1haW5zCi11bnRvdWNoZWQuIElmIHRoZSBleHRlbmRpbmcgZWxlbWVudCBpcyBhbGxvd2VkIGFuIGFzc29jaWF0aW9uIHRvIG9ubHkgb25lCi1vdGhlciBlbGVtZW50IGFuZCBoYXMgc3VjaCBhbiBlbGVtZW50IGRlZmluZWQgaXRzZWxmLCBpbmhlcml0YW5jZSB3aWxsIG5vdAotb3ZlcnJpZGUgdGhpcyBhc3NvY2lhdGlvbi48L3A+Ci08ZGl2IGNsYXNzPSJwIj48c3Ryb25nPkV4dGVuZHMgcnVsZXM6PC9zdHJvbmc+PHVsPjxsaT5BdHRyaWJ1dGUgdmFsdWVzIG9mIHRoZSBiYXNlIGVsZW1lbnQgYXJlIGluaGVyaXRlZCB0byB0aGUgZXh0ZW5kaW5nIGVsZW1lbnQKLWlmIHRoZSBleHRlbmRpbmcgZWxlbWVudCBoYXMgbm90IGRlZmluZWQgaXRzIG93biB2YWx1ZXMuPC9saT4KLTxsaT5PdXRnb2luZyB0by1tYW55IGFzc29jaWF0aW9ucyBvZiB0aGUgYmFzZSBlbGVtZW50IGFyZSBpbmhlcml0ZWQgdG8gdGhlCi1leHRlbmRpbmcgZWxlbWVudC48L2xpPgotPGxpPk91dGdvaW5nIHRvLW9uZSBhc3NvY2lhdGlvbnMgYXJlIG9ubHkgaW5oZXJpdGVkIGlmIHRoZSBleHRlbmRpbmcgZWxlbWVudAotZG9lcyBub3QgZGVmaW5lIGl0cyBvd24gdG8tb25lIGFzc29jaWF0aW9uLjwvbGk+Ci08bGk+RXh0ZW5kcyB3b3JrcyB0cmFuc2l0aXZlbHksIGkuZS4gaWYgYW4gZXh0ZW5kaW5nIGVsZW1lbnQgaXMgZXh0ZW5kZWQgaXRzZWxmLAotdGhlIHNlY29uZCBleHRlbnNpb24gaW5oZXJpdHMgZnJvbSBpdHMgZGlyZWN0IGFuZCBpbmRpcmVjdCBiYXNlIGVsZW1lbnRzLjwvbGk+Ci08bGk+Q29udHJpYnV0aW9uIHByZWNlZGVzIEV4dGVuZHMsIGkuZS4gY29udHJpYnV0aW9uIGlzIGV2YWx1YXRlZCBmaXJzdCBhbmQKLXRoZW4gZXh0ZW5kaW5nIGVsZW1lbnRzIGluaGVyaXQgYWZ0ZXJ3YXJkcyBmcm9tIHRoZSBiYXNlIGVsZW1lbnQgKGluY2x1ZGluZwotYWxsIG9mIGl0cyBjb250cmlidXRpb24pLjwvbGk+Ci08bGk+UmVwbGFjZSBwcmVjZWRlcyBFeHRlbmRzLCBpLmUuIGlmIGEgYmFzZSBlbGVtZW50IGhhcyBhIHJlcGxhY2UgYW5kIGV4dGVuZHMKLXJlbGF0aW9uc2hpcCwgdGhlIGV4dGVuZGluZyBlbGVtZW50IGluaGVyaXRzIGZyb20gdGhlIHJlcGxhY2luZyBlbGVtZW50LjwvbGk+Ci08L3VsPgotU2VlIDxhIGhyZWY9InZhcmlhYmlsaXR5YXNzb2NpYXRpb25zLmh0bWwjdmFyaWFiaWxpdHlhc3NvY2lhdGlvbnMiPlZhcmlhYmlsaXR5IEFzc29jaWF0aW9uczwvYT4gZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIGFzc29jaWF0aW9ucyBmb3IgZWFjaCBlbGVtZW50Ci10eXBlLjwvZGl2PgotPC9kaXY+Ci08ZGl2PjxkaXYgY2xhc3M9InJlbGNvbmNlcHRzIj48c3Ryb25nPlJlbGF0ZWQgY29uY2VwdHM8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0idmFyaWFiaWxpdHkuaHRtbCN2YXJpYWJpbGl0eSIgdGl0bGU9IlZhcmlhYmlsaXR5IGFsbG93cyBlbGVtZW50cyBpbiBvbmUgY29udGVudCBwYWNrYWdlIHRvIGluZmx1ZW5jZSBvciBtb2RpZnkgZWxlbWVudHMgaW4gb3RoZXIgY29udGVudCBwYWNrYWdlcyB3aXRob3V0IGFjdHVhbGx5IGRpcmVjdGx5IG1vZGlmeWluZyB0aGUgb3JpZ2luYWwgY29udGVudC4gVmFyaWFiaWxpdHkgZW5hYmxlcyBjaGFuZ2VzIHRvIHRoZSBjb250ZW50IHdoaWxlIGtlZXBpbmcgdGhlIGNoYW5nZXMgc2VwYXJhdGUgYW5kIG9wdGlvbmFsLiI+VmFyaWFiaWxpdHk8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9InJlcGxhY2UuaHRtbCNyZXBsYWNlcyI+UmVwbGFjZXM8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9ImNvbnRyaWJ1dGVzLmh0bWwjY29udHJpYnV0ZXMiPkNvbnRyaWJ1dGVzPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2ZpbmRyZXBsYWNlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2ZpbmRyZXBsYWNlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzgzOTYzYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9maW5kcmVwbGFjZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9ndWlkYW5jZS5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvZ3VpZGFuY2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTc3MmE0Zi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9ndWlkYW5jZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTA0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgaHRtbAotICBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0ic2VjdXJpdHkiIGNvbnRlbnQ9InB1YmxpYyIgLz4KLTxtZXRhIG5hbWU9IlJvYm90cyIgY29udGVudD0iaW5kZXgsZm9sbG93IiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBuYW1lPSJEQy5UeXBlIiBjb250ZW50PSJjb25jZXB0IiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9Ikd1aWRhbmNlIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJjcmVhdGVndWlkYW5jZS5odG1sI2NyZWF0ZWd1aWRhbmNlIiAvPgotPG1ldGEgbmFtZT0iREMuRm9ybWF0IiBjb250ZW50PSJYSFRNTCIgLz4KLTxtZXRhIG5hbWU9IkRDLklkZW50aWZpZXIiIGNvbnRlbnQ9Imd1aWRhbmNlIiAvPgotPG1ldGEgbmFtZT0iREMuTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIiAvPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuL2libWRpdGEuY3NzIiAvPgotPHRpdGxlPkd1aWRhbmNlPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJndWlkYW5jZSI+PGEgbmFtZT0iZ3VpZGFuY2UiPjwhLS0gLS0+PC9hPgotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5HdWlkYW5jZTwvaDE+Ci08ZGl2PjxkaXYgY2xhc3M9InAiPkd1aWRhbmNlIGlzIGEgZ2VuZXJhbCB0ZXJtIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlbGF0ZWQgdG8gPGEgaHJlZj0icm9sZS5odG1sI3JvbGUiPnJvbGVzPC9hPiwgPGEgaHJlZj0idGFzay5odG1sI3Rhc2siPnRhc2tzPC9hPiwgYW5kIDxhIGhyZWY9Indvcmtwcm9kdWN0Lmh0bWwjd29ya3Byb2R1Y3QiPndvcmsgcHJvZHVjdHM8L2E+LiBFeGFtcGxlcyBvZiBndWlkYW5jZSBhcmU6PHVsPjxsaT48c3Ryb25nPjxzcGFuIGNsYXNzPSJrZXl3b3JkIj5HdWlkZWxpbmU8L3NwYW4+PC9zdHJvbmc+IC0gUHJvdmlkZXMgYWRkaXRpb25hbCBkZXRhaWwgb24gaG93Ci10byBwZXJmb3JtIGEgcGFydGljdWxhciB0YXNrIG9yIGdyb3VwaW5nIG9mIHRhc2tzLCBvciB0aGF0IHByb3ZpZGVzIGFkZGl0aW9uYWwKLWRldGFpbCwgcnVsZXMsIGFuZCByZWNvbW1lbmRhdGlvbnMgb24gd29yayBwcm9kdWN0cyBhbmQgdGhlaXIgcHJvcGVydGllcy4KLUFtb25nc3Qgb3RoZXJzLCBpdCBjYW4gaW5jbHVkZSBkZXRhaWxzIGFib3V0IGJlc3QgcHJhY3RpY2VzIGFuZCBkaWZmZXJlbnQKLWFwcHJvYWNoZXMgZm9yIGRvaW5nIHdvcmssIGhvdyB0byB1c2UgcGFydGljdWxhciB0eXBlcyBvZiB3b3JrIHByb2R1Y3RzLCBpbmZvcm1hdGlvbgotb24gZGlmZmVyZW50IHN1YnR5cGVzIGFuZCB2YXJpYW50cyBvZiB0aGUgd29yayBwcm9kdWN0IGFuZCBob3cgdGhleSBldm9sdmUKLXRocm91Z2hvdXQgYSBsaWZlY3ljbGUsIGRpc2N1c3Npb25zIG9uIHNraWxscyB0aGUgcGVyZm9ybWluZyByb2xlcyBzaG91bGQKLWFjcXVpcmUgb3IgaW1wcm92ZSB1cG9uLCBhbmQgbWVhc3VyZW1lbnRzIGZvciBwcm9ncmVzcyBhbmQgbWF0dXJpdHkuPHA+PC9wPgotPC9saT4KLTxsaT48c3Ryb25nPjxzcGFuIGNsYXNzPSJrZXl3b3JkIj5UZW1wbGF0ZTwvc3Bhbj48L3N0cm9uZz4gLSBBIHNwZWNpZmljIHR5cGUgb2YgZ3VpZGFuY2UgdGhhdAotcHJvdmlkZXMgZm9yIGEgd29yayBwcm9kdWN0IGEgcHJlZGVmaW5lZCB0YWJsZSBvZiBjb250ZW50cywgc2VjdGlvbnMsIHBhY2thZ2VzLAotYW5kL29yIGhlYWRpbmdzLCBhIHN0YW5kYXJkaXplZCBmb3JtYXQsIGFzIHdlbGwgYXMgZGVzY3JpcHRpb25zIGhvdyB0aGUgc2VjdGlvbnMKLWFuZCBwYWNrYWdlcyBhcmUgc3VwcG9zZWQgdG8gYmUgdXNlZCBhbmQgY29tcGxldGVkLiBUZW1wbGF0ZXMgY2Fubm90IG9ubHkKLWJlIHByb3ZpZGVkIGZvciBkb2N1bWVudHMsIGJ1dCBhbHNvIGZvciBjb25jZXB0dWFsIG1vZGVscyBvciBwaHlzaWNhbCBkYXRhCi1zdG9yZXMuPHA+PC9wPgotPC9saT4KLTxsaT48c3Ryb25nPjxzcGFuIGNsYXNzPSJrZXl3b3JkIj5DaGVja2xpc3Q8L3NwYW4+PC9zdHJvbmc+IC0gQSBzcGVjaWZpYyB0eXBlIG9mIGd1aWRhbmNlIHRoYXQKLWlkZW50aWZpZXMgYSBzZXJpZXMgb2YgaXRlbXMgdGhhdCBuZWVkIHRvIGJlIGNvbXBsZXRlZCBvciB2ZXJpZmllZC4gQ2hlY2tsaXN0cwotYXJlIG9mdGVuIHVzZWQgaW4gcmV2aWV3cyBzdWNoIGFzIHdhbGt0aHJvdWdocyBvciBpbnNwZWN0aW9ucy48cD48L3A+Ci08L2xpPgotPGxpPjxzdHJvbmc+PHNwYW4gY2xhc3M9ImtleXdvcmQiPlRvb2wgTWVudG9yPC9zcGFuPjwvc3Ryb25nPiAtIEEgc3BlY2lmaWMgdHlwZSBvZiBndWlkYW5jZSB0aGF0Ci1zaG93cyBob3cgdG8gdXNlIGEgc3BlY2lmaWMgdG9vbCB0byBhY2NvbXBsaXNoIHNvbWUgcGllY2Ugb2Ygd29yaywgZWl0aGVyCi1pbiB0aGUgY29udGV4dCBvZiwgb3IgaW5kZXBlbmRlbnQgZnJvbSwgYSB0YXNrIG9yIGFjdGl2aXR5LjxwPjwvcD4KLTwvbGk+Ci08bGk+PHN0cm9uZz48c3BhbiBjbGFzcz0ia2V5d29yZCI+U3VwcG9ydGluZyBNYXRlcmlhbDwvc3Bhbj48L3N0cm9uZz4gLSBVc2VkIGFzIGEgY2F0Y2ggYWxsIGZvcgotb3RoZXIgdHlwZXMgb2YgZ3VpZGFuY2Ugbm90IHNwZWNpZmljYWxseSBkZWZpbmVkIGVsc2V3aGVyZS4gSXQgY2FuIGJlIHJlbGF0ZWQKLXRvIGFsbCBraW5kcyBvZiBjb250ZW50IGVsZW1lbnRzLCBpbmNsdWRpbmcgb3RoZXIgZ3VpZGFuY2UgZWxlbWVudHMuPHA+PC9wPgotPC9saT4KLTxsaT48c3Ryb25nPjxzcGFuIGNsYXNzPSJrZXl3b3JkIj5SZXBvcnQ8L3NwYW4+PC9zdHJvbmc+IC0gQSBwcmVkZWZpbmVkIHRlbXBsYXRlIG9mIGEgcmVzdWx0IHRoYXQKLWlzIGdlbmVyYXRlZCBvbiB0aGUgYmFzaXMgb2Ygb3RoZXIgd29yayBwcm9kdWN0cyBhcyBhbiBvdXRwdXQgZnJvbSBzb21lIGZvcm0KLW9mIHRvb2wgYXV0b21hdGlvbi4gQW4gZXhhbXBsZSBmb3IgYSByZXBvcnQgd291bGQgYmUgYSB1c2UgY2FzZSBtb2RlbCBzdXJ2ZXksCi13aGljaCBpcyBnZW5lcmF0ZWQgYnkgZXh0cmFjdGluZyBkaWFncmFtIGluZm9ybWF0aW9uIGZyb20gYSBncmFwaGljYWwgbW9kZWwKLWFuZCB0ZXh0dWFsIGluZm9ybWF0aW9uIGZyb20gZG9jdW1lbnRzIGFuZCBjb21iaW5lcyB0aGVzZSB0d28gdHlwZXMgb2YgaW5mb3JtYXRpb24KLWludG8gYSByZXBvcnQuPHA+PC9wPgotPC9saT4KLTxsaT48c3Ryb25nPjxzcGFuIGNsYXNzPSJrZXl3b3JkIj5Db25jZXB0PC9zcGFuPjwvc3Ryb25nPiAtIEEgc3BlY2lmaWMgdHlwZSBvZiBndWlkYW5jZSB0aGF0IG91dGxpbmVzCi1rZXkgaWRlYXMgYXNzb2NpYXRlZCB3aXRoIGJhc2ljIHByaW5jaXBsZXMgdW5kZXJseWluZyB0aGUgcmVmZXJlbmNlZCBpdGVtLgotQ29uY2VwdHMgbm9ybWFsbHkgYWRkcmVzcyBtb3JlIGdlbmVyYWwgdG9waWNzIHRoYW4gZ3VpZGVsaW5lcyBhbmQgc3BhbiBhY3Jvc3MKLXNldmVyYWwgd29yayBwcm9kdWN0IGFuZC9vciB0YXNrcyBvciBhY3Rpdml0aWVzLjxwPjwvcD4KLTwvbGk+Ci08bGk+PHN0cm9uZz48c3BhbiBjbGFzcz0ia2V5d29yZCI+UHJhY3RpY2U8L3NwYW4+PC9zdHJvbmc+IC0gUmVwcmVzZW50cyBhIHByb3ZlbiB3YXkgb3Igc3RyYXRlZ3kKLW9mIGRvaW5nIHdvcmsgdG8gYWNoaWV2ZSBhIGdvYWwgdGhhdCBoYXMgYSBwb3NpdGl2ZSBpbXBhY3Qgb24gd29yayBwcm9kdWN0Ci1vciBwcm9jZXNzIHF1YWxpdHkuIFByYWN0aWNlcyBhcmUgZGVmaW5lZCBvcnRob2dvbmFsIHRvIG1ldGhvZHMgYW5kIHByb2Nlc3Nlcy4KLVRoZXkgY291bGQgc3VtbWFyaXplIGFzcGVjdHMgdGhhdCBpbXBhY3QgbWF5IGRpZmZlcmVudCBwYXJ0cyBvZiBhIG1ldGhvZCBvcgotc3BlY2lmaWMgcHJvY2Vzcy4gPHA+PC9wPgotPC9saT4KLTxsaT48c3Ryb25nPjxzcGFuIGNsYXNzPSJrZXl3b3JkIj5SZXVzYWJsZSBBc3NldDwvc3Bhbj48L3N0cm9uZz4gLSBQcm92aWRlcyBhIHNvbHV0aW9uIHRvIGEgcHJvYmxlbQotZm9yIGEgZ2l2ZW4gY29udGV4dC4gVGhlIGFzc2V0IG1heSBoYXZlIGEgdmFyaWFiaWxpdHkgcG9pbnQsIHdoaWNoIGlzIGEgbG9jYXRpb24KLWluIHRoZSBhc3NldCB0aGF0IG1heSBoYXZlIGEgdmFsdWUgcHJvdmlkZWQgb3IgY3VzdG9taXplZCBieSB0aGUgYXNzZXQgY29uc3VtZXIuCi1UaGUgYXNzZXQgaGFzIHJ1bGVzIGZvciB1c2FnZSB3aGljaCBhcmUgdGhlIGluc3RydWN0aW9ucyBkZXNjcmliaW5nIGhvdyB0aGUKLWFzc2V0IHNob3VsZCBiZSB1c2VkLjxwPjwvcD4KLTwvbGk+Ci08bGk+PHN0cm9uZz48c3BhbiBjbGFzcz0ia2V5d29yZCI+VGVybSBEZWZpbml0aW9uPC9zcGFuPjwvc3Ryb25nPiAtIERlZmluZXMgY29uY2VwdHMgYW5kIGlzIHVzZWQKLXRvIGJ1aWxkIHVwIHRoZSBHbG9zc2FyeS4gQSB0ZXJtIGRlZmluaXRpb24gaXMgbm90IGRpcmVjdGx5IHJlbGF0ZWQgdG8gY29udGVudAotZWxlbWVudHMsIGJ1dCBpdHMgcmVsYXRpb25zaGlwIGlzIGJlaW5nIGRlcml2ZWQgd2hlbiB0aGUgdGVybSBpcyB1c2VkIGluIHRoZQotY29udGVudCBlbGVtZW50cyBkZXNjcmlwdGlvbiB0ZXh0LjxwPjwvcD4KLTwvbGk+Ci08bGk+PHN0cm9uZz48c3BhbiBjbGFzcz0ia2V5d29yZCI+V2hpdGUgUGFwZXI8L3NwYW4+PC9zdHJvbmc+IC0gQSBzcGVjaWFsIGNvbmNlcHQgZ3VpZGFuY2UgdGhhdAotaGFzIGJlZW4gZXh0ZXJuYWwgcmV2aWV3ZWQgb3IgcHVibGlzaGVkIGFuZCBjYW4gYmUgcmVhZCBhbmQgdW5kZXJzdG9vZCBpbgotaXNvbGF0aW9uIG9mIG90aGVyIGNvbnRlbnQgZWxlbWVudHMgYW5kIGd1aWRhbmNlLjxwPjwvcD4KLTwvbGk+Ci08bGk+PHN0cm9uZz48c3BhbiBjbGFzcz0ia2V5d29yZCI+RXhhbXBsZTwvc3Bhbj48L3N0cm9uZz4gLSBBIHNwZWNpZmljIHR5cGUgb2YgZ3VpZGFuY2UgdGhhdCBwcm92aWRlcwotYW4gZXhhbXBsZSBvZiBhIGNvbXBsZXRlZCB3b3JrIHByb2R1Y3QuPC9saT4KLTwvdWw+Ci1TZWUgYWxzbzo8L2Rpdj4KLTwvZGl2PgotPGRpdj48ZGl2IGNsYXNzPSJyZWx0YXNrcyI+PHN0cm9uZz5SZWxhdGVkIHRhc2tzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9ImNyZWF0ZWd1aWRhbmNlLmh0bWwjY3JlYXRlZ3VpZGFuY2UiPkNyZWF0ZSBHdWlkYW5jZTwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9ndWlkZWxpbmUuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2d1aWRlbGluZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OWU3ODhmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2d1aWRlbGluZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJzZWN1cml0eSIgY29udGVudD0icHVibGljIiAvPgotPG1ldGEgbmFtZT0iUm9ib3RzIiBjb250ZW50PSJpbmRleCxmb2xsb3ciIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIG5hbWU9IkRDLlR5cGUiIGNvbnRlbnQ9ImNvbmNlcHQiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iR3VpZGVsaW5lIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJndWlkYW5jZS5odG1sI2d1aWRhbmNlIiAvPgotPG1ldGEgbmFtZT0iREMuRm9ybWF0IiBjb250ZW50PSJYSFRNTCIgLz4KLTxtZXRhIG5hbWU9IkRDLklkZW50aWZpZXIiIGNvbnRlbnQ9Imd1aWRlbGluZSIgLz4KLTxtZXRhIG5hbWU9IkRDLkxhbmd1YWdlIiBjb250ZW50PSJlbi11cyIgLz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi9pYm1kaXRhLmNzcyIgLz4KLTx0aXRsZT5HdWlkZWxpbmU8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9Imd1aWRlbGluZSI+PGEgbmFtZT0iZ3VpZGVsaW5lIj48IS0tIC0tPjwvYT4KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+R3VpZGVsaW5lPC9oMT4KLTxkaXY+PHA+QSBHdWlkZWxpbmUgaXMgYSBzcGVjaWZpYyB0eXBlIG9mIGd1aWRhbmNlIHRoYXQgcHJvdmlkZXMgYWRkaXRpb25hbCBkZXRhaWwKLW9uIGhvdyB0byBwZXJmb3JtIGEgcGFydGljdWxhciB0YXNrIG9yIGdyb3VwaW5nIG9mIHRhc2tzLCBvciB0aGF0IHByb3ZpZGVzCi1hZGRpdGlvbmFsIGRldGFpbCwgcnVsZXMsIGFuZCByZWNvbW1lbmRhdGlvbnMgb24gd29yayBwcm9kdWN0cyBhbmQgdGhlaXIgcHJvcGVydGllcy4KLUFtb25nc3Qgb3RoZXJzLCBpdCBjYW4gaW5jbHVkZSBkZXRhaWxzIGFib3V0IGJlc3QgcHJhY3RpY2VzIGFuZCBkaWZmZXJlbnQKLWFwcHJvYWNoZXMgZm9yIGRvaW5nIHdvcmssIGhvdyB0byB1c2UgcGFydGljdWxhciB0eXBlcyBvZiB3b3JrIHByb2R1Y3RzLCBpbmZvcm1hdGlvbgotb24gZGlmZmVyZW50IHN1YnR5cGVzIGFuZCB2YXJpYW50cyBvZiB0aGUgd29yayBwcm9kdWN0IGFuZCBob3cgdGhleSBldm9sdmUKLXRocm91Z2hvdXQgYSBsaWZlY3ljbGUsIGRpc2N1c3Npb25zIG9uIHNraWxscyB0aGUgcGVyZm9ybWluZyByb2xlcyBzaG91bGQKLWFjcXVpcmUgb3IgaW1wcm92ZSB1cG9uLCBtZWFzdXJlbWVudHMgZm9yIHByb2dyZXNzLCBhbmQgbWF0dXJpdHkuPC9wPgotPC9kaXY+Ci08ZGl2PjxkaXYgY2xhc3M9InJlbGNvbmNlcHRzIj48c3Ryb25nPlJlbGF0ZWQgY29uY2VwdHM8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iZ3VpZGFuY2UuaHRtbCNndWlkYW5jZSI+R3VpZGFuY2U8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvaWJtZGl0YS5jc3MgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9pYm1kaXRhLmNzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2RhMjZjNS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9pYm1kaXRhLmNzcworKysgL2Rldi9udWxsCkBAIC0xLDIzMSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICovCi0KLS51bnJlc29sdmVkIHsgYmFja2dyb3VuZC1jb2xvcjogc2t5Ymx1ZTsgfQotLm5vVGVtcGxhdGUgeyBiYWNrZ3JvdW5kLWNvbG9yOiB5ZWxsb3c7IH0KLQotLnNpZGViYXIge2JhY2tncm91bmQ6IHNpbHZlciB9Ci0udG9jIHtmb250LXNpemU6IHNtYWxsOyB9Ci0KLS5iYXNlIHsgYmFja2dyb3VuZC1jb2xvcjogI2ZmZmZmZjsgfQotLmJyZWFkY3J1bWIgeyBmb250LXNpemUgOiBzbWFsbGVyO30KLS5wcmVyZXEgeyBtYXJnaW4tbGVmdCA6IDIwcHg7fQotLmhpZXJhcmNoeSB7IGRpc3BsYXk6IGJsb2NrOyBib3JkZXItc3R5bGU6IHNvbGlkOyBwYWRkaW5nLWxlZnQgOiAzcHg7IGJvcmRlci13aWR0aCA6IDJweDsgcGFkZGluZy1yaWdodCA6IDNweDsgYm9yZGVyLWNvbG9yIDogU2lsdmVyO30KLQotLm5lc3RlZDAgeyBtYXJnaW4tdG9wIDogMWVtO30KLS5uZXN0ZWQxIHsgfQotLm5lc3RlZDIgeyB9Ci0KLS5wIHttYXJnaW4tdG9wOiAxZW19Ci0KLS50YWJsZWJvcmRlciB7IG1hcmdpbi10b3A6IDFlbTsgbWFyZ2luLWJvdHRvbTogMWVtIH0KLS50YWJsZW5vYm9yZGVyIHsgbWFyZ2luLXRvcDogMWVtOyBtYXJnaW4tYm90dG9tOiAxZW0gfQotY2FwdGlvbiB7IHRleHQtYWxpZ246IGxlZnQ7IGZvbnQtc3R5bGU6IGl0YWxpYyB9Ci0uc2ltcGxldGFibGVib3JkZXIgeyBtYXJnaW4tdG9wOiAxZW07IG1hcmdpbi1ib3R0b206IDFlbSB9Ci0uc2ltcGxldGFibGVub2JvcmRlciB7IG1hcmdpbi10b3A6IDFlbTsgbWFyZ2luLWJvdHRvbTogMWVtIH0KLS5jaG9pY2V0YWJsZWJvcmRlciB7IG1hcmdpbi10b3A6IDFlbTsgbWFyZ2luLWJvdHRvbTogMWVtIH0KLS5jaG9pY2V0YWJsZW5vYm9yZGVyIHsgbWFyZ2luLXRvcDogMWVtOyBtYXJnaW4tYm90dG9tOiAxZW0gfQotCi0uZmlnY2FwIHsgZm9udC1zdHlsZTogaXRhbGljIH0KLS5maWdkZXNjIHsgZm9udC1zdHlsZTogbm9ybWFsIH0KLQotLmZpZ25vbmUge21hcmdpbi10b3A6IDFlbX0KLS5maWdib3JkZXIgeyBib3JkZXItc3R5bGU6IHNvbGlkOyBwYWRkaW5nLWxlZnQgOiAzcHg7IGJvcmRlci13aWR0aCA6IDJweDsgcGFkZGluZy1yaWdodCA6IDNweDsgbWFyZ2luLXRvcDogMWVtOyBib3JkZXItY29sb3IgOiBTaWx2ZXI7fQotLmZpZ3NpZGVzIHsgYm9yZGVyLWxlZnQgOiAycHggc29saWQ7IHBhZGRpbmctbGVmdCA6IDNweDsgYm9yZGVyLXJpZ2h0IDogMnB4IHNvbGlkOyBwYWRkaW5nLXJpZ2h0IDogM3B4OyBtYXJnaW4tdG9wOiAxZW07IGJvcmRlci1jb2xvciA6IFNpbHZlcjt9Ci0uZmlndG9wIHsgYm9yZGVyLXRvcCA6IDJweCBzb2xpZDsgbWFyZ2luLXRvcDogMWVtOyBib3JkZXItY29sb3IgOiBTaWx2ZXI7fQotLmZpZ2JvdHRvbSB7IGJvcmRlci1ib3R0b20gOiAycHggc29saWQ7IGJvcmRlci1jb2xvciA6IFNpbHZlcjt9Ci0uZmlndG9wYm90IHsgYm9yZGVyLXRvcCA6IDJweCBzb2xpZDsgYm9yZGVyLWJvdHRvbSA6IDJweCBzb2xpZDsgbWFyZ2luLXRvcDogMWVtOyBib3JkZXItY29sb3IgOiBTaWx2ZXI7fQotCi0uc3lubm9uZSB7bWFyZ2luLXRvcDogMWVtfQotLnN5bmJvcmRlciB7IGJvcmRlci1zdHlsZTogc29saWQ7IHBhZGRpbmctbGVmdCA6IDNweDsgYm9yZGVyLXdpZHRoIDogMnB4OyBwYWRkaW5nLXJpZ2h0IDogM3B4OyBtYXJnaW4tdG9wOiAxZW07IGJvcmRlci1jb2xvciA6IFNpbHZlcjt9Ci0uc3luc2lkZXMgeyBib3JkZXItbGVmdCA6IDJweCBzb2xpZDsgcGFkZGluZy1sZWZ0IDogM3B4OyBib3JkZXItcmlnaHQgOiAycHggc29saWQ7IHBhZGRpbmctcmlnaHQgOiAzcHg7IG1hcmdpbi10b3A6IDFlbTsgYm9yZGVyLWNvbG9yIDogU2lsdmVyO30KLS5zeW50b3AgeyBib3JkZXItdG9wIDogMnB4IHNvbGlkOyBtYXJnaW4tdG9wOiAxZW07IGJvcmRlci1jb2xvciA6IFNpbHZlcjt9Ci0uc3luYm90dG9tIHsgYm9yZGVyLWJvdHRvbSA6IDJweCBzb2xpZDsgYm9yZGVyLWNvbG9yIDogU2lsdmVyO30KLS5zeW50b3Bib3QgeyBib3JkZXItdG9wIDogMnB4IHNvbGlkOyBib3JkZXItYm90dG9tIDogMnB4IHNvbGlkOyBtYXJnaW4tdG9wOiAxZW07IGJvcmRlci1jb2xvciA6IFNpbHZlcjt9Ci0KLS5za2lwIHsgbWFyZ2luLXRvcDogMWVtIH0KLS5za2lwc3BhY2UgeyBtYXJnaW4tdG9wOiAxZW07IG1hcmdpbi1ib3R0b206IDFlbSB9Ci0udWxsaW5rcyB7IGxpc3Qtc3R5bGUtdHlwZTogbm9uZSB9Ci0udWxjaGlsZGxpbmsgeyBtYXJnaW4tdG9wOiAxZW07IG1hcmdpbi1ib3R0b206IDFlbSB9Ci0ub2xjaGlsZGxpbmsgeyBtYXJnaW4tdG9wOiAxZW07IG1hcmdpbi1ib3R0b206IDFlbSB9Ci0ubGlua2xpc3QgeyBtYXJnaW4tYm90dG9tOiAxZW0gfQotLmxpbmtsaXN0d2l0aGNoaWxkIHsgbWFyZ2luLWxlZnQ6IDEuNWVtOyBtYXJnaW4tYm90dG9tOiAxZW0gIH0KLS5zdWJsaW5rbGlzdCB7IG1hcmdpbi1sZWZ0OiAxLjVlbTsgbWFyZ2luLWJvdHRvbTogMWVtICB9Ci0ucmVsY29uY2VwdHMgeyBtYXJnaW4tdG9wOiAxZW07IG1hcmdpbi1ib3R0b206IDFlbSB9Ci0ucmVsdGFza3MgeyBtYXJnaW4tdG9wOiAxZW07IG1hcmdpbi1ib3R0b206IDFlbSB9Ci0ucmVscmVmIHsgbWFyZ2luLXRvcDogMWVtOyBtYXJnaW4tYm90dG9tOiAxZW0gfQotLnJlbGluZm8geyBtYXJnaW4tdG9wOiAxZW07IG1hcmdpbi1ib3R0b206IDFlbSB9Ci1kaXYuYnJlYWRjcnVtYiB7bWFyZ2luLWJvdHRvbTogMWVtIH0KLQotLnRvcGljdGl0bGUxIHsgbWFyZ2luLXRvcDogMHBjOyBtYXJnaW4tYm90dG9tOiAuMWVtOyBmb250LXNpemU6IDEuMzRlbTsgfQotLnRvcGljdGl0bGUyIHsgbWFyZ2luLXRvcDogMXBjOyBtYXJnaW4tYm90dG9tOiAuNDVlbTsgZm9udC1zaXplOiAxLjE3ZW07IH0KLS50b3BpY3RpdGxlMyB7IG1hcmdpbi10b3A6IDFwYzsgbWFyZ2luLWJvdHRvbTogLjE3ZW07IGZvbnQtc2l6ZTogMS4xN2VtOyBmb250LXdlaWdodDogYm9sZDsgfQotLnRvcGljdGl0bGU0IHsgbWFyZ2luLXRvcDogLjgzZW07IGZvbnQtc2l6ZTogMS4xN2VtOyBmb250LXdlaWdodDogYm9sZDsgfQotLnRvcGljdGl0bGU1IHsgZm9udC1zaXplOiAxLjE3ZW07IGZvbnQtd2VpZ2h0OiBib2xkOyB9Ci0udG9waWN0aXRsZTYgeyBmb250LXNpemU6IDEuMTdlbTsgZm9udC1zdHlsZTogaXRhbGljOyB9Ci0uc2VjdGlvbnRpdGxlIHsgbWFyZ2luLXRvcDogMWVtOyBtYXJnaW4tYm90dG9tOiAwZW07IGNvbG9yOiBibGFjazsgZm9udC1zaXplOiAxLjE3ZW07IGZvbnQtd2VpZ2h0OiBib2xkO30KLS5zZWN0aW9uIHsgbWFyZ2luLXRvcDogMWVtOyBtYXJnaW4tYm90dG9tOiAxZW0gfQotLmV4YW1wbGUgeyBtYXJnaW4tdG9wOiAxZW07IG1hcmdpbi1ib3R0b206IDFlbSB9Ci0KLS5ub3RlIHsgbWFyZ2luLXRvcDogMWVtOyBtYXJnaW4tYm90dG9tIDogMWVtO30KLS5ub3RldGl0bGUgeyBmb250LXdlaWdodDogYm9sZCB9Ci0ubm90ZWxpc3R0aXRsZSB7IGZvbnQtd2VpZ2h0OiBib2xkIH0KLS50aXAgeyBtYXJnaW4tdG9wOiAxZW07IG1hcmdpbi1ib3R0b20gOiAxZW07fQotLnRpcHRpdGxlIHsgZm9udC13ZWlnaHQ6IGJvbGQgfQotLmZhc3RwYXRoIHsgbWFyZ2luLXRvcDogMWVtOyBtYXJnaW4tYm90dG9tIDogMWVtO30KLS5mYXN0cGF0aHRpdGxlIHsgZm9udC13ZWlnaHQ6IGJvbGQgfQotLmltcG9ydGFudCB7IG1hcmdpbi10b3A6IDFlbTsgbWFyZ2luLWJvdHRvbSA6IDFlbTt9Ci0uaW1wb3J0YW50dGl0bGUgeyBmb250LXdlaWdodDogYm9sZCB9Ci0ucmVtZW1iZXIgeyBtYXJnaW4tdG9wOiAxZW07IG1hcmdpbi1ib3R0b20gOiAxZW07fQotLnJlbWVtYmVydGl0bGUgeyBmb250LXdlaWdodDogYm9sZCB9Ci0ucmVzdHJpY3Rpb24geyBtYXJnaW4tdG9wOiAxZW07IG1hcmdpbi1ib3R0b20gOiAxZW07fQotLnJlc3RyaWN0aW9udGl0bGUgeyBmb250LXdlaWdodDogYm9sZCB9Ci0uYXR0ZW50aW9uIHsgbWFyZ2luLXRvcDogMWVtOyBtYXJnaW4tYm90dG9tIDogMWVtO30KLS5hdHRlbnRpb250aXRsZSB7IGZvbnQtd2VpZ2h0OiBib2xkIH0KLS5kYW5nZXJ0aXRsZSB7IG1hcmdpbi10b3A6IDFlbTsgZm9udC13ZWlnaHQ6IGJvbGQgfQotLmRhbmdlciB7IHBhZGRpbmc6IDVweCA1cHggNXB4IDVweDsgYm9yZGVyOiBzb2xpZDsgYm9yZGVyLXdpZHRoOiB0aGluOyBmb250LXdlaWdodDogYm9sZDsgbWFyZ2luLXRvcDogMnB4OyBtYXJnaW4tYm90dG9tIDogMWVtOyB9Ci0uY2F1dGlvbnRpdGxlIHsgbWFyZ2luLXRvcDogMWVtOyBmb250LXdlaWdodDogYm9sZCB9Ci0uY2F1dGlvbiB7IGZvbnQtd2VpZ2h0OiBib2xkOyBtYXJnaW4tYm90dG9tIDogMWVtOyB9Ci0KLXVsLnNpbXBsZSB7IGxpc3Qtc3R5bGUtdHlwZTogbm9uZSB9Ci0KLS5maXJzdGNvbCB7IGZvbnQtd2VpZ2h0IDogYm9sZDt9Ci0KLS5ib2xkIHsgZm9udC13ZWlnaHQ6IGJvbGQ7IH0KLS5ib2xkSXRhbGljIHsgZm9udC13ZWlnaHQ6IGJvbGQ7IGZvbnQtc3R5bGU6IGl0YWxpYzsgfQotLml0YWxpYyB7IGZvbnQtc3R5bGU6IGl0YWxpYzsgfQotLnVuZGVybGluZWQgeyB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsgfQotLnVpY29udHJvbCB7IGZvbnQtd2VpZ2h0OiBib2xkOyB9Ci0ucGFybW5hbWUgeyBmb250LXdlaWdodDogYm9sZDsgfQotLmRlZnBhcm1uYW1lIHsgZm9udC13ZWlnaHQ6IGJvbGQ7IHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOyB9Ci0ua3dkIHsgZm9udC13ZWlnaHQ6IGJvbGQ7IH0KLS5kZWZrd2QgeyBmb250LXdlaWdodDogYm9sZDsgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7IH0KLS52YXIgeyBmb250LXN0eWxlIDogaXRhbGljO30KLS5zaG9ydGN1dCB7IHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOyB9Ci0KLS5wdG9jSDEge2ZvbnQtc2l6ZTogeC1zbWFsbDsgfQotLnB0b2NIMiB7Zm9udC1zaXplOiB4LXNtYWxsOyB9Ci0KLS5zbWFsbENhcHMgeyB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOyBmb250LXNpemU6IHNtYWxsZXI7IH0KLS5zdGl0bGUgeyBmb250LXN0eWxlOiBpdGFsaWM7IHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOyB9Ci0ubnRlIHt9Ci0KLS5kbHRlcm0geyBmb250LXdlaWdodDogYm9sZDsgfQotLmRsdGVybWV4cGFuZCB7IGZvbnQtd2VpZ2h0OiBib2xkOyBtYXJnaW4tdG9wOiAxZW07IH0KLS5kZWZMaXN0SGVhZCB7IGZvbnQtd2VpZ2h0OiBib2xkOyB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsgfQotLnBhcm1MaXN0S3dkIHsgZm9udC13ZWlnaHQ6IGJvbGQ7IH0KLS5wYXJtTGlzdFZhciB7IGZvbnQtc3R5bGU6IGl0YWxpYzsgfQotLnBrIHsgZm9udC13ZWlnaHQ6IGJvbGQ7IHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOyB9Ci0KLSpbY29tcGFjdD0ieWVzIl0+bGkgeyBtYXJnaW4tdG9wOiAwZW07fQotKltjb21wYWN0PSJubyJdPmxpIHsgbWFyZ2luLXRvcDogLjUzZW07fQkKLS5saWV4cGFuZCB7IG1hcmdpbi10b3A6IDFlbTsgbWFyZ2luLWJvdHRvbTogMWVtIH0KLS5zbGlleHBhbmQgeyBtYXJnaW4tdG9wOiAxZW07IG1hcmdpbi1ib3R0b206IDFlbSB9Ci0uZGxleHBhbmQgeyBtYXJnaW4tdG9wOiAxZW07IG1hcmdpbi1ib3R0b206IDFlbSB9Ci0uZGRleHBhbmQgeyBtYXJnaW4tdG9wOiAxZW07IG1hcmdpbi1ib3R0b206IDFlbSB9Ci0uc3RlcGV4cGFuZCB7IG1hcmdpbi10b3A6IDFlbTsgbWFyZ2luLWJvdHRvbTogMWVtIH0KLS5zdWJzdGVwZXhwYW5kIHsgbWFyZ2luLXRvcDogMWVtOyBtYXJnaW4tYm90dG9tOiAxZW0gfQotCi1kaXYuaW1hZ2VsZWZ0IHsgdGV4dC1hbGlnbjogbGVmdCB9Ci1kaXYuaW1hZ2VjZW50ZXIgeyB0ZXh0LWFsaWduOiBjZW50ZXIgfQotZGl2LmltYWdlcmlnaHQgeyB0ZXh0LWFsaWduOiByaWdodCB9Ci1kaXYuaW1hZ2VqdXN0aWZ5IHsgdGV4dC1hbGlnbjoganVzdGlmeSB9Ci0KLXByZS5zY3JlZW4geyBwYWRkaW5nOiA1cHggNXB4IDVweCA1cHg7IGJvcmRlcjogb3V0c2V0OyBiYWNrZ3JvdW5kLWNvbG9yOiAjQ0NDQ0NDOyBtYXJnaW4tdG9wOiAycHg7IG1hcmdpbi1ib3R0b20gOiAycHg7IHdoaXRlLXNwYWNlOiBwcmV9Ci0KLUNJVEUgeyBmb250LXN0eWxlOiBpdGFsaWM7IH0KLUVNIHsgZm9udC1zdHlsZTogaXRhbGljOyB9Ci1TVFJPTkcgeyBmb250LXdlaWdodDogYm9sZDsgfQotVkFSIHsgZm9udC1zdHlsZTogaXRhbGljOyB9Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgIFN0eWxlcyBhZGRlZCB0byBzdXBwb3J0IC5ORVQgb3V0cHV0LiBOb3QgdXNlZCBieSBzdGFuZGFyZCBwcm9jZXNzaW5nLiAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLWJvZHkuZG90bmV0IC8qIFRoaXMgYm9keSB0YWcgcmVxdWlyZXMgdGhlIHVzZSBvZiBvbmUgb2YgdGhlIHNldHMgb2YgYmFubmVyIGFuZC9vciB0ZXh0IGRpdiBpZHMgKi8KLQl7Ci0JbWFyZ2luOiAwcHggMHB4IDBweCAwcHg7Ci0JcGFkZGluZzogMHB4IDBweCAwcHggMHB4OwotCWJhY2tncm91bmQ6ICNmZmZmZmY7IAotCWNvbG9yOiAjMDAwMDAwOwotCXdpZHRoOiAxMDAlOwotCX0KLQotZGl2Lm5zdGV4dCAvKiBDcmVhdGVzIHRoZSBzY3JvbGxpbmcgdGV4dCBhcmVhIGZvciBOb25zY3JvbGxpbmcgcmVnaW9uIHRvcGljICovCi0JewotCXBhZGRpbmc6IDVweCAxMHB4IDBweCAyMnB4OyAKLQl9Ci0KLWRpdi5uc2Jhbm5lciAvKiBDcmVhdGVzIE5vbnNjcm9sbGluZyBiYW5uZXIgcmVnaW9uICovCi0JewotCXBvc2l0aW9uOiByZWxhdGl2ZTsKLQlsZWZ0OiAwcHg7Ci0JcGFkZGluZzogMHB4IDBweCAwcHggMHB4OwotCWJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjOTk5OTk5OwotCX0KLQotZGl2LmJhbm5lcnJvdzEgLyogcHJvdmlkZXMgZnVsbC13aWR0aCBjb2xvciB0byB0b3Agcm93IGluIHJ1bm5pbmcgaGVhZCAqLwotCXsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjOTljY2ZmOwotCX0KLQotLyogICAgICAgU1RZTEVTIEZPUiBSVU5OSU5HIEhFQURTICAgICAgKi8KLQotdGFibGUuYmFubmVycGFydGhlYWQsIHRhYmxlLmJhbm5lcnRpdGxlIC8qIEdlbmVyYWwgdmFsdWVzIGZvciB0aGUgUnVubmluZyBIZWFkIHRhYmxlcyAqLwotCXsKLQlwb3NpdGlvbjogcmVsYXRpdmU7Ci0JbGVmdDogMHB4OwotCXRvcDogMHB4OwotCXBhZGRpbmc6IDBweCAwcHggMHB4IDBweDsKLQltYXJnaW46IDBweCAwcHggMHB4IDBweDsKLQl3aWR0aDogMTAwJTsKLQloZWlnaHQ6IDIxcHg7IAotCWJvcmRlci1jb2xsYXBzZTogY29sbGFwc2U7Ci0JYm9yZGVyLXN0eWxlOiBzb2xpZDsKLQlib3JkZXItd2lkdGg6IDBweDsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjOTljY2ZmOyAKLQlmb250LXNpemU6IDEwMCU7Ci0JfQotdGFibGUuYmFubmVycGFydGhlYWQgdGQgLyogR2VuZXJhbCBWYWx1ZXMgZm9yIGNlbGxzIGluIHRoZSB0b3Agcm93IG9mIHJ1bm5pbmcgaGVhZCAqLwotCXsKLQltYXJnaW46IDBweCAwcHggMHB4IDBweDsKLQlwYWRkaW5nOiAycHggMHB4IDBweCA0cHg7Ci0JdmVydGljYWwtYWxpZ246IG1pZGRsZTsKLQkvKmJvcmRlci13aWR0aDogMHB4IDBweCAxcHggMHB4OyAqLwotCWJvcmRlci13aWR0aDogMHB4Ci0JYm9yZGVyLXN0eWxlOiBzb2xpZDsKLQlib3JkZXItY29sb3I6ICM5OTk5OTk7Ci0JYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7IAotCWZvbnQtc3R5bGU6IGl0YWxpYzsKLQlmb250LXdlaWdodDogbm9ybWFsOwotCX0KLXRhYmxlLmJhbm5lcnBhcnRoZWFkIHRkLnByb2R1Y3QgLyogVmFsdWVzIGZvciB0b3AgcmlnaHQgY2VsbCBpbiBydW5uaW5nIGhlYWQgKi8KLQl7ICAgICAgICAgICAgICAgICAgICAgICAvKiBBbGxvd3MgZm9yIGEgc2Vjb25kIHRleHQgYmxvY2sgaW4gdGhlIHJ1bm5pbmcgaGVhZCAqLwotCXRleHQtYWxpZ246IHJpZ2h0OwotCXBhZGRpbmc6IDJweCA1cHggMHB4IDVweDsKLQl9Ci0KLWgxLmR0SDEgewotCW1hcmdpbi1sZWZ0OiAtMThweDsKLQl9Ci1kaXYudGl0bGVyb3cgLyogcHJvdmlkZXMgbm9uLXNjcm9sbCB0b3BpYyB0aXRsZSBhcmVhIChyZXF1aXJlcyBzY3JpcHQpICovCi0JewotCXdpZHRoOiAxMDAlOyAvKiBGb3JjZXMgdGFibGVzIHRvIGhhdmUgY29ycmVjdCByaWdodCBtYXJnaW4gKi8KLQlwYWRkaW5nOiAwcHggMTBweCAwcHggMjJweDsgCi0JYmFja2dyb3VuZC1jb2xvcjogIzk5Y2NmZjsgICAgICAgIAotCX0KLWRpdi50aXRsZXJvdyBoMQotCXsKLQltYXJnaW4tdG9wOiAwZW07Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci0JbWFyZ2luLWJvdHRvbTogLjJlbQotCX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2luZGVudC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9pbmRlbnQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMjFmYjc3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2luZGVudC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9pdGFsaWMuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvaXRhbGljLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGZlM2UwZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9pdGFsaWMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvaXRlcmF0aW9uLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9pdGVyYXRpb24uaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODU0YTM2Zi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9pdGVyYXRpb24uaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgaHRtbAotICBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0ic2VjdXJpdHkiIGNvbnRlbnQ9InB1YmxpYyIgLz4KLTxtZXRhIG5hbWU9IlJvYm90cyIgY29udGVudD0iaW5kZXgsZm9sbG93IiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBuYW1lPSJEQy5UeXBlIiBjb250ZW50PSJjb25jZXB0IiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9Ikl0ZXJhdGlvbiIgLz4KLTxtZXRhIG5hbWU9IkRDLkZvcm1hdCIgY29udGVudD0iWEhUTUwiIC8+Ci08bWV0YSBuYW1lPSJEQy5JZGVudGlmaWVyIiBjb250ZW50PSJpdGVyYXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiIC8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4vaWJtZGl0YS5jc3MiIC8+Ci08dGl0bGU+SXRlcmF0aW9uPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJpdGVyYXRpb24iPjxhIG5hbWU9Iml0ZXJhdGlvbiI+PCEtLSAtLT48L2E+Ci0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPkl0ZXJhdGlvbjwvaDE+Ci08ZGl2PjxwPkl0ZXJhdGlvbiBpcyBhIGdyb3VwIG9mIG5lc3RlZCBBY3Rpdml0aWVzIHRoYXQgYXJlIHJlcGVhdGVkIG1vcmUgdGhhbiBvbmNlLgotSXRlcmF0aW9uIHJlcHJlc2VudHMgYW4gaW1wb3J0YW50IHN0cnVjdHVyaW5nIGVsZW1lbnQgdG8gb3JnYW5pemUgd29yayBpbgotcmVwZXRpdGl2ZSBjeWNsZXMuPC9wPgotPC9kaXY+Ci08ZGl2PjwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvbGlicmFyeXZpZXcuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2xpYnJhcnl2aWV3Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmMjdlOTUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvbGlicmFyeXZpZXcuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgaHRtbAotICBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0ic2VjdXJpdHkiIGNvbnRlbnQ9InB1YmxpYyIgLz4KLTxtZXRhIG5hbWU9IlJvYm90cyIgY29udGVudD0iaW5kZXgsZm9sbG93IiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBuYW1lPSJEQy5UeXBlIiBjb250ZW50PSJjb25jZXB0IiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IkxpYnJhcnkgVmlldyIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0idXNlcmludGVyZmFjZW92ZXJ2aWV3Lmh0bWwjdXNlcmludGVyZmFjZW92ZXJ2aWV3IiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJjb25maWd1cmF0aW9udmlldy5odG1sI2NvbmZpZ3VyYXRpb252aWV3IiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJ1c2VyaW50ZXJmYWNlb3ZlcnZpZXcuaHRtbCIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iY29uZmlndXJhdGlvbnZpZXcuaHRtbCIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iYnJvd3NlYW5kcHJldmlld21ldGhvZGNvbnRlbnQuaHRtbCIgLz4KLTxtZXRhIG5hbWU9IkRDLkZvcm1hdCIgY29udGVudD0iWEhUTUwiIC8+Ci08bWV0YSBuYW1lPSJEQy5JZGVudGlmaWVyIiBjb250ZW50PSJsaWJyYXJ5dmlldyIgLz4KLTxtZXRhIG5hbWU9IkRDLkxhbmd1YWdlIiBjb250ZW50PSJlbi11cyIgLz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi9pYm1kaXRhLmNzcyIgLz4KLTx0aXRsZT5MaWJyYXJ5IFZpZXc8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9ImxpYnJhcnl2aWV3Ij48YSBuYW1lPSJsaWJyYXJ5dmlldyI+PCEtLSAtLT48L2E+Ci0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPkxpYnJhcnkgVmlldzwvaDE+Ci08ZGl2PjxwPlRoZSBMaWJyYXJ5IFZpZXcgZGlzcGxheXMgdGhlIE1ldGhvZCBQbHVnLWlucyBhbmQgQ29uZmlndXJhdGlvbnMgY29udGFpbmVkCi1pbiBhIDxhIGhyZWY9InN0YW5kYXJkbWV0aG9kbGlicmFyeW92ZXJ2aWV3Lmh0bWwiPk1ldGhvZCBMaWJyYXJ5PC9hPi48L3A+Ci08cD5UaGUgTGlicmFyeSBWaWV3IGlzIGF2YWlsYWJsZSBvbmx5IGluIHRoZSA8YSBocmVmPSJhdXRob3JpbmdwZXJzcGVjdGl2ZS5odG1sIj5BdXRob3JpbmcgUGVyc3BlY3RpdmU8L2E+IGFuZCwKLXdoZW4gb3BlbiwgZW5hYmxlcyB0aGUgY3JlYXRpb24sIG1vZGlmaWNhdGlvbiBhbmQgdmlld2luZyBvZiBhbGwgZWxlbWVudCB0eXBlcy48L3A+Ci08L2Rpdj4KLTxkaXY+Ci08ZGl2IGNsYXNzPSJmYW1pbHlsaW5rcyI+Ci08ZGl2IGNsYXNzPSJwYXJlbnRsaW5rIj48c3Ryb25nPlBhcmVudCB0b3BpYzo8L3N0cm9uZz4gPGEgaHJlZj0idXNlcmludGVyZmFjZW92ZXJ2aWV3Lmh0bWwiIHRpdGxlPSJFY2xpcHNlIFByb2Nlc3MgRnJhbWV3b3JrIENvbXBvc2VyIGlzIGJ1aWx0IG9uIHRoZSBFY2xpcHNlIEludGVncmF0ZWQgRGV2ZWxvcG1lbnQgRW52aXJvbm1lbnQgKElERSkuIFRoZSBwYXJ0cyBvZiB0aGUgd29ya3NwYWNlIGFyZToiPlRvb2wgSW50ZXJmYWNlPC9hPjwvZGl2PgotPGRpdiBjbGFzcz0icHJldmlvdXNsaW5rIj48c3Ryb25nPlByZXZpb3VzIHRvcGljOjwvc3Ryb25nPiA8YSBocmVmPSJjb25maWd1cmF0aW9udmlldy5odG1sIj5Db25maWd1cmF0aW9uIFZpZXc8L2E+PC9kaXY+Ci08ZGl2IGNsYXNzPSJuZXh0bGluayI+PHN0cm9uZz5OZXh0IHRvcGljOjwvc3Ryb25nPiA8YSBocmVmPSJicm93c2VhbmRwcmV2aWV3bWV0aG9kY29udGVudC5odG1sIj5Ccm93c2UgYW5kIFByZXZpZXcgTWV0aG9kIENvbnRlbnQ8L2E+PC9kaXY+Ci08L2Rpdj4KLTxkaXYgY2xhc3M9InJlbGNvbmNlcHRzIj48c3Ryb25nPlJlbGF0ZWQgY29uY2VwdHM8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0idXNlcmludGVyZmFjZW92ZXJ2aWV3Lmh0bWwjdXNlcmludGVyZmFjZW92ZXJ2aWV3IiB0aXRsZT0iRWNsaXBzZSBQcm9jZXNzIEZyYW1ld29yayBDb21wb3NlciBpcyBidWlsdCBvbiB0aGUgRWNsaXBzZSBJbnRlZ3JhdGVkIERldmVsb3BtZW50IEVudmlyb25tZW50IChJREUpLiBUaGUgcGFydHMgb2YgdGhlIHdvcmtzcGFjZSBhcmU6Ij5Ub29sIEludGVyZmFjZTwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iY29uZmlndXJhdGlvbnZpZXcuaHRtbCNjb25maWd1cmF0aW9udmlldyI+Q29uZmlndXJhdGlvbiBWaWV3PC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL21jLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL21jLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmUyY2VlMS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9tYy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9tZXRoX3ZzX3Byb2MuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvbWV0aF92c19wcm9jLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjE0NWFiMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9tZXRoX3ZzX3Byb2MuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvbWV0aG9kYXV0aG9yaW5nb3ZlcnZpZXcuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL21ldGhvZGF1dGhvcmluZ292ZXJ2aWV3Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5ZDU2N2QuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvbWV0aG9kYXV0aG9yaW5nb3ZlcnZpZXcuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDk1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgaHRtbAotICBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0ic2VjdXJpdHkiIGNvbnRlbnQ9InB1YmxpYyIgLz4KLTxtZXRhIG5hbWU9IlJvYm90cyIgY29udGVudD0iaW5kZXgsZm9sbG93IiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBuYW1lPSJEQy5UeXBlIiBjb250ZW50PSJjb25jZXB0IiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9Ik1ldGhvZCBDb250ZW50IEF1dGhvcmluZyBPdmVydmlldyIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0ibWV0aG9kY29udGVudC5odG1sI2NyZWF0aW5ncmV1c2FibGVtZXRob2Rjb250ZW50cyIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iY3JlYXRlbWV0aG9kY29udGVudC5odG1sIiAvPgotPG1ldGEgbmFtZT0iREMuRm9ybWF0IiBjb250ZW50PSJYSFRNTCIgLz4KLTxtZXRhIG5hbWU9IkRDLklkZW50aWZpZXIiIGNvbnRlbnQ9Im1ldGhvZGF1dGhvcmluZ292ZXJ2aWV3IiAvPgotPG1ldGEgbmFtZT0iREMuTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIiAvPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuL2libWRpdGEuY3NzIiAvPgotPHRpdGxlPk1ldGhvZCBDb250ZW50IEF1dGhvcmluZyBPdmVydmlldzwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0ibWV0aG9kYXV0aG9yaW5nb3ZlcnZpZXciPjxhIG5hbWU9Im1ldGhvZGF1dGhvcmluZ292ZXJ2aWV3Ij48IS0tIC0tPjwvYT4KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+TWV0aG9kIENvbnRlbnQgQXV0aG9yaW5nIE92ZXJ2aWV3PC9oMT4KLTxkaXY+PHA+TWV0aG9kIGNvbnRlbnQgaXMgZGVzY3JpYmVkIGJ5IGRlZmluaW5nIHRhc2tzIHRoYXQgaGF2ZSB3b3JrIHByb2R1Y3RzIGFzCi1pbnB1dHMgYW5kIG91dHB1dHMgYW5kIHRoYXQgYXJlIHBlcmZvcm1lZCBieSByb2xlcy4gVGhlIHJvbGVzIGFsc28gZGVmaW5lCi1yZXNwb25zaWJpbGl0eSByZWxhdGlvbnNoaXBzIHRvIHRoZSB3b3JrIHByb2R1Y3RzLjwvcD4KLTxwPjxpbWcgc3JjPSJtYy5naWYiIGFsdD0iIiAvPjwvcD4KLTxwPlRoZSBmaWd1cmUgYWJvdmUgZGVwaWN0cyB0eXBpY2FsIHNvdXJjZXMgZm9yIG1ldGhvZCBjb250ZW50LCBhcyB3ZWxsIGFzCi1ob3cgdGhlIG1ldGhvZCBjb250ZW50IGlzIHJlcHJlc2VudGVkLiBUbyBsZWFybiBhYm91dCBkZXZlbG9wbWVudCBtZXRob2RzLAotcGVvcGxlIHJlc2VhcmNoIGluIGxpYnJhcmllcyBvciByZWNlaXZlIHRyYWluaW5nLiBEZXZlbG9wbWVudCBtZXRob2RzIGFyZQotdHlwaWNhbGx5IGRlc2NyaWJlZCBpbiBwdWJsaWNhdGlvbnMgc3VjaCBhcyBib29rcywgYXJ0aWNsZXMsIHRyYWluaW5nIG1hdGVyaWFsLAotc3RhbmRhcmRzIGFuZCByZWd1bGF0aW9ucywgb3IgYW55IG90aGVyIGZvcm0gb2YgZG9jdW1lbnRhdGlvbi4gVGhlc2Ugc291cmNlcwotdXN1YWxseSBkb2N1bWVudCBtZXRob2RzIGJ5IHByb3ZpZGluZyBzdGVwLWJ5LXN0ZXAgZXhwbGFuYXRpb25zIGZvciBhIHBhcnRpY3VsYXIKLXdheSBvZiBhY2hpZXZpbmcgYSBzcGVjaWZpYyBkZXZlbG9wbWVudCBnb2FsIHVuZGVyIGdlbmVyYWwgY2lyY3Vtc3RhbmNlcy4KLVNvbWUgZXhhbXBsZXMgYXJlOiB0cmFuc2Zvcm1pbmcgYSByZXF1aXJlbWVudHMgZG9jdW1lbnQgaW50byBhbiBhbmFseXNpcyBtb2RlbDsKLWRlZmluaW5nIGFuIGFyY2hpdGVjdHVyYWwgbWVjaGFuaXNtIGJhc2VkIG9uIGZ1bmN0aW9uYWwgYW5kIG5vbi1mdW5jdGlvbmFsCi1yZXF1aXJlbWVudHM7IGNyZWF0aW5nIGEgcHJvamVjdCBwbGFuIGZvciBhIGRldmVsb3BtZW50IGl0ZXJhdGlvbjsgZGVmaW5pbmcKLWEgcXVhbGl0eSBhc3N1cmFuY2UgcGxhbiBmb3IgZnVuY3Rpb25hbCByZXF1aXJlbWVudHM7IHJlZGVzaWduaW5nIGEgYnVzaW5lc3MKLW9yZ2FuaXphdGlvbiBiYXNlZCBvbiBhIG5ldyBzdHJhdGVnaWMgZGlyZWN0aW9uLCBhbmQgc28gb24uIDwvcD4KLTxwPlRoaXMgdG9vbCB0YWtlcyBjb250ZW50IHN1Y2ggYXMgdGhlIGNvbnRlbnQgZGVzY3JpYmVkIGFib3ZlLCBhbmQgc3RydWN0dXJlcwotaXQgaW4gb25lIHNwZWNpZmljIHdheSB1c2luZyBhIHByZWRlZmluZWQgc2NoZW1hIG9mIGNvbmNlcHRzLiBUaGlzIHNjaGVtYQotc3VwcG9ydHMgdGhlIG9yZ2FuaXphdGlvbiBvZiBsYXJnZSBhbW91bnRzIG9mIGRlc2NyaXB0aW9ucyBmb3IgZGV2ZWxvcG1lbnQKLW1ldGhvZHMgYW5kIHByb2Nlc3Nlcy4gU3VjaCBtZXRob2QgY29udGVudCBhbmQgcHJvY2Vzc2VzIGRvIG5vdCBoYXZlIHRvIGJlCi1saW1pdGVkIHRvIHNvZnR3YXJlIGVuZ2luZWVyaW5nLCBidXQgY2FuIGFsc28gY292ZXIgb3RoZXIgZGVzaWduIGFuZCBlbmdpbmVlcmluZwotZGlzY2lwbGluZXMgc3VjaCBhcyBtZWNoYW5pY2FsIGVuZ2luZWVyaW5nLCBidXNpbmVzcyB0cmFuc2Zvcm1hdGlvbiwgc2FsZXMKLWN5Y2xlcywgYW5kIHNvIG9uLiA8L3A+Ci08cD5UaGUgc2NoZW1hIGZvciBtZXRob2QgY29udGVudCBpcyByZXByZXNlbnRlZCB0aGlzIHRvb2wgYXMgYSBjb25zdHJ1Y3Qgb2YKLXJvbGVzIGRlZmluaW5nIGRldmVsb3BtZW50IHNraWxscyBhbmQgcmVzcG9uc2liaWxpdGllcyBmb3Igd29yayBwcm9kdWN0cy4KLVRoZXNlIHdvcmsgcHJvZHVjdHMgYXJlIHByb2R1Y2VkIGJ5IHRhc2tzIHRoYXQgYXJlIHBlcmZvcm1lZCBieSB0aGUgcm9sZXMKLWFuZCBoYXZlIHRoZSB3b3JrIHByb2R1Y3RzIGFzIGlucHV0cyBhbmQgb3V0cHV0cy4gVGhlIHNjcmVlbiBjYXB0dXJlIGluIHRoZQotZmlndXJlIGFib3ZlIHNob3dzIGhvdyBzdWNoIG1ldGhvZCBjb250ZW50IGVsZW1lbnRzIGFyZSBvcmdhbml6ZWQgaW4gdHJlZQotYnJvd3NlcnMgb24gdGhlIGxlZnQuIFRoZXNlIHRyZWUgYnJvd3NlcnMsIHNpbWlsYXIgdG8gYSBsaWJyYXJ5LCBwcm92aWRlIGRpZmZlcmVudAotaW5kZXhlcyBvZiB0aGUgYXZhaWxhYmxlIGVsZW1lbnRzIGZvciByYXBpZCBhY2Nlc3MuIFRoZSBzY3JlZW4gY2FwdHVyZSBzaG93cwotb24gdGhlIHJpZ2h0IGFuIGV4YW1wbGUgb2YgYSB0YXNrIHByZXNlbnRhdGlvbi4gVGhpcyB0YXNrIHByZXNlbnRhdGlvbiBkZWZpbmVzCi10aGUgdGFzayBpbiB0ZXJtcyBvZiBzdGVwcyB0aGF0IG5lZWQgdG8gYmUgcGVyZm9ybWVkIHRvIGFjaGlldmUgdGhlIHRhc2sncwotcHVycG9zZS4gWW91IGNhbiBzZWUgdGhhdCB0aGUgdGFzayBoYXMgdmFyaW91cyByZWxhdGlvbnNoaXBzLCBzdWNoIGFzIHJlbGF0aW9uc2hpcHMKLXRvIHBlcmZvcm1pbmcgcm9sZXMgYXMgd2VsbCBhcyB3b3JrIHByb2R1Y3RzIHRoYXQgc2VydmUgYXMgaW5wdXRzIGFuZCBvdXRwdXRzCi10byB0aGUgdGFzay4gRmluZCBtb3JlIGRldGFpbHMgb24gdGFza3MsIHJvbGUsIGFuZCB3b3JrIHByb2R1Y3RzIGluIHRoZSBvbmxpbmUKLWhlbHAgaGVyZS4gSW4gYWRkaXRpb24gdG8gcm9sZXMsIHRhc2tzLCBhbmQgd29yayBwcm9kdWN0cywgdGhpcyB0b29sIHN1cHBvcnRzCi10aGUgYWRkaXRpb24gb2YgZ3VpZGFuY2UgZWxlbWVudHMuIEd1aWRhbmNlIGFyZSBzdXBwbGVtZW50YXJ5IGZyZWUtZm9ybSBkb2N1bWVudGF0aW9uCi1zdWNoIGFzIHdoaXRlIHBhcGVycywgY29uY2VwdCBkZXNjcmlwdGlvbnMsIGd1aWRlbGluZXMsIHRlbXBsYXRlcywgZXhhbXBsZXMsCi1hbmQgc28gb24uIDwvcD4KLTxwPlRoaXMgdG9vbCBwcm92aWRlcyB2YXJpb3VzIGZvcm0tYmFzZWQgZWRpdG9ycyB0byBjcmVhdGUgbmV3IG1ldGhvZCBjb250ZW50Ci1lbGVtZW50cy4gRG9jdW1lbnQgeW91ciB0YXNrLCByb2xlcywgd29yayBwcm9kdWN0cywgYW5kIGd1aWRhbmNlIGVsZW1lbnRzCi11c2luZyBpbnR1aXRpdmUgcmljaC10ZXh0IGVkaXRvcnMgdGhhdCBhbGxvdyB5b3UgdG8gY29weSBhbmQgcGFzdGUgdGV4dCBmcm9tCi1vdGhlciBzb3VyY2VzIHN1Y2ggYXMgd2ViIHBhZ2VzIG9yIGRvY3VtZW50cy4gVXNlIHNpbXBsZSBkaWFsb2dzIHRvIGVzdGFibGlzaAotcmVsYXRpb25zaGlwcyBiZXR3ZWVuIGNvbnRlbnQgZWxlbWVudHMuIEZvciBleGFtcGxlLCBtYWtlIGEgd29yayBwcm9kdWN0IHRoZQotaW5wdXQgdG8geW91ciB0YXNrIHNpbXBseSBieSBzZWxlY3RpbmcgaXQgaW4gYSBkaWFsb2cuPC9wPgotPHA+VXNpbmcgdGhpcyB0b29sLCB5b3UgY2FuIG9yZ2FuaXplIGNvbnRlbnQgaW4gcGh5c2ljYWwgY29udGVudCBwYWNrYWdlcwotdGhhdCBhbGxvdyB5b3UgdG8gbWFuYWdlIHlvdXIgY29udGVudCBpbiBjb25maWd1cmFibGUgdW5pdHMuIFlvdSBjYW4gYWxzbwotY2F0ZWdvcml6ZSB5b3VyIGNvbnRlbnQgYmFzZWQgb24gYSBzZXQgb2YgcHJlZGVmaW5lZCBjYXRlZ29yaWVzIChmb3IgZXhhbXBsZSwKLWNhdGVnb3JpemUgeW91ciB0YXNrcyBpbnRvIGRldmVsb3BtZW50IGRpc2NpcGxpbmVzLCBvciB5b3VyIHdvcmsgcHJvZHVjdHMKLWludG8gZG9tYWlucykgb3IgY3JlYXRlIHlvdXIgb3duIGNhdGVnb3JpemF0aW9uIHNjaGVtZXMgZm9yIHlvdXIgY29udGVudCB3aXRoCi15b3VyIG93biB1c2VyLWRlZmluZWQgY2F0ZWdvcmllcyB0aGF0IGFsbG93IHlvdSB0byBpbmRleCBjb250ZW50IGluIGFueSB3YXkKLXlvdSB3YW50LiA8L3A+Ci08L2Rpdj4KLTxkaXY+PGRpdiBjbGFzcz0icmVsY29uY2VwdHMiPjxzdHJvbmc+UmVsYXRlZCBjb25jZXB0czwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJtZXRob2Rjb250ZW50Lmh0bWwjY3JlYXRpbmdyZXVzYWJsZW1ldGhvZGNvbnRlbnRzIj5NZXRob2QgQ29udGVudDwvYT48L2Rpdj4KLTwvZGl2PgotPGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJjcmVhdGVtZXRob2Rjb250ZW50Lmh0bWwiPkNyZWF0ZSBNZXRob2QgQ29udGVudDwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9tZXRob2Rjb25maWd1cmF0aW9ucy5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvbWV0aG9kY29uZmlndXJhdGlvbnMuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjcwMGYyYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9tZXRob2Rjb25maWd1cmF0aW9ucy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJzZWN1cml0eSIgY29udGVudD0icHVibGljIiAvPgotPG1ldGEgbmFtZT0iUm9ib3RzIiBjb250ZW50PSJpbmRleCxmb2xsb3ciIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIG5hbWU9IkRDLlR5cGUiIGNvbnRlbnQ9ImNvbmNlcHQiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iTWV0aG9kIENvbmZpZ3VyYXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9ImNyZWF0ZWFtZXRob2Rjb25maWd1cmF0aW9uLmh0bWwjY3JlYXRlYW1ldGhvZGNvbmZpZ3VyYXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5Gb3JtYXQiIGNvbnRlbnQ9IlhIVE1MIiAvPgotPG1ldGEgbmFtZT0iREMuSWRlbnRpZmllciIgY29udGVudD0ibWV0aG9kY29uZmlndXJhdGlvbnMiIC8+Ci08bWV0YSBuYW1lPSJEQy5MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiIC8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4vaWJtZGl0YS5jc3MiIC8+Ci08dGl0bGU+TWV0aG9kIENvbmZpZ3VyYXRpb248L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9Im1ldGhvZGNvbmZpZ3VyYXRpb25zIj48YSBuYW1lPSJtZXRob2Rjb25maWd1cmF0aW9ucyI+PCEtLSAtLT48L2E+Ci0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPk1ldGhvZCBDb25maWd1cmF0aW9uPC9oMT4KLTxkaXY+PHA+TWV0aG9kIGNvbmZpZ3VyYXRpb25zIGFyZSB1c2VyLWRlZmluZWQgc3Vic2V0cyBvZiBlbGVtZW50cyBjb250YWluZWQgaW4KLXRoZSBNZXRob2QgTGlicmFyeS48L3A+Ci08cD5BIG1ldGhvZCBjb25maWd1cmF0aW9uIGRlZmluZXMgYSB3b3JraW5nIHNldCBvZiBwYWNrYWdlcyB3aXRoaW4gdGhlIG1ldGhvZAotbGlicmFyeSB0aGF0IGhlbHBzIHlvdSBsaW1pdCB5b3VyIHZpZXcgdG8gYSBzdWJzZXQgb2YgZWxlbWVudHMuIFRoZSBlbGVtZW50cwotdGhhdCBhcmUgcGFydCBvZiBhIHNlbGVjdGVkIGNvbmZpZ3VyYXRpb24gYXJlIGRpc3BsYXllZCBpbiB0aGUgPGEgaHJlZj0iY29uZmlndXJhdGlvbnZpZXcuaHRtbCNjb25maWd1cmF0aW9udmlldyI+Q29uZmlndXJhdGlvbiBWaWV3PC9hPi4gTWV0aG9kIGNvbmZpZ3VyYXRpb25zIGFyZSB1c2VkIGZvciBjcmVhdGluZyBwcm9jZXNzZXMKLWFuZCBmb3IgcHVibGljYXRpb24gYnkgZGVmaW5pbmcgd2hpY2ggZWxlbWVudHMgYXJlIHB1Ymxpc2hlZCBpbiBIVE1MIGFuZCB3aGljaAotYXJlIG5vdC48L3A+Ci08cD5BIG1ldGhvZCBjb25maWd1cmF0aW9uIGNvbnNpc3RzIG9mIHRocmVlIHNwZWNpZnlpbmcgcGFydHM6PC9wPgotPHVsPjxsaT5BIGRlc2NyaXB0aW9uIG9mIHRoZSBjb25maWd1cmF0aW9uLjwvbGk+Ci08bGk+QSBzZWxlY3Rpb24gZnJvbSB0aGUgc2V0IG9mIHBsdWctaW5zIGFuZCBwYWNrYWdlcy48L2xpPgotPGxpPkEgc2VsZWN0aW9uIG9mIHZpZXdzIHRvIGJlIHB1Ymxpc2hlZCBpbiB0aGUgV2ViIHNpdGUuPC9saT4KLTwvdWw+Ci08cD5JbiBhIG1ldGhvZCBjb25maWd1cmF0aW9uLCB5b3UgYXJlIGFibGUgdG8gc2VsZWN0IGFuZCBkZXNlbGVjdCBmcm9tIHRoZQotY29udGVudCBwYWNrYWdlcyBhbmQgcHJvY2VzcyBhdmFpbGFibGUgaW4gdGhlIG1ldGhvZCBsaWJyYXJ5J3MKLXNldCBvZiBwbHVnLWlucy4gVGhlIHNlbGVjdGlvbnMgeW91IG1ha2UgaGVscCBkZXRlcm1pbmUgdGhlIGNvbnRlbnQgb2YgeW91cgotcHVibGlzaGVkIFdlYiBzaXRlLiBBIGNvbmZpZ3VyYXRpb24gaXMgZ2l2ZW4gYSBuYW1lIGFuZCB0aGVuIHNhdmVkIHNvIGl0IGNhbgotYmUgY2hhbmdlZCBhbmQgdGhlbiByZS1wdWJsaXNoZWQgYXQgYSBsYXRlciBkYXRlLjwvcD4KLTwvZGl2PgotPGRpdj48ZGl2IGNsYXNzPSJyZWx0YXNrcyI+PHN0cm9uZz5SZWxhdGVkIHRhc2tzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9ImNyZWF0ZWFtZXRob2Rjb25maWd1cmF0aW9uLmh0bWwjY3JlYXRlYW1ldGhvZGNvbmZpZ3VyYXRpb24iPkNyZWF0ZSBhIE1ldGhvZCBDb25maWd1cmF0aW9uPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL21ldGhvZGNvbnRlbnQuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL21ldGhvZGNvbnRlbnQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDNjYmRkZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9tZXRob2Rjb250ZW50Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGh0bWwKLSAgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9InNlY3VyaXR5IiBjb250ZW50PSJwdWJsaWMiIC8+Ci08bWV0YSBuYW1lPSJSb2JvdHMiIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgbmFtZT0iREMuVHlwZSIgY29udGVudD0iY29uY2VwdCIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJNZXRob2QgQ29udGVudCIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0ibWV0aG9kY29udGVudGNhdGVnb3JpZXMuaHRtbCNtZXRob2Rjb250ZW50Y2F0ZWdvcmllcyIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iY3JlYXRlbWV0aG9kY29udGVudC5odG1sI2NyZWF0ZW1ldGhvZGNvbnRlbnQiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9ImNyZWF0ZWFtZXRob2RwbHVnaW4uaHRtbCNjcmVhdGVhbWV0aG9kcGx1Z2luIiAvPgotPG1ldGEgbmFtZT0iREMuRm9ybWF0IiBjb250ZW50PSJYSFRNTCIgLz4KLTxtZXRhIG5hbWU9IkRDLklkZW50aWZpZXIiIGNvbnRlbnQ9ImNyZWF0aW5ncmV1c2FibGVtZXRob2Rjb250ZW50cyIgLz4KLTxtZXRhIG5hbWU9IkRDLkxhbmd1YWdlIiBjb250ZW50PSJlbi11cyIgLz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi9pYm1kaXRhLmNzcyIgLz4KLTx0aXRsZT5NZXRob2QgQ29udGVudDwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0iY3JlYXRpbmdyZXVzYWJsZW1ldGhvZGNvbnRlbnRzIj48YSBuYW1lPSJjcmVhdGluZ3JldXNhYmxlbWV0aG9kY29udGVudHMiPjwhLS0gLS0+PC9hPgotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5NZXRob2QgQ29udGVudDwvaDE+Ci08ZGl2PjxwPk1ldGhvZCBjb250ZW50IHByb3ZpZGVzIHN0ZXAtYnktc3RlcCBleHBsYW5hdGlvbnMsIGRlc2NyaWJpbmcKLWhvdyBzcGVjaWZpYyBkZXZlbG9wbWVudCBnb2FscyBhcmUgYWNoaWV2ZWQsIGluZGVwZW5kZW50IG9mIHRoZSBwbGFjZW1lbnQKLW9mIHRoZXNlIHN0ZXBzIHdpdGhpbiBhIGRldmVsb3BtZW50IGxpZmVjeWNsZS4gUHJvY2Vzc2VzIHRha2UgdGhlc2UgbWV0aG9kCi1lbGVtZW50cyBhbmQgcmVsYXRlIHRoZW0gaW50byBzZW1pLW9yZGVyZWQgc2VxdWVuY2VzIHRoYXQgYXJlIGN1c3RvbWl6ZWQgdG8KLXNwZWNpZmljIHR5cGVzIG9mIHByb2plY3RzLjwvcD4KLTxwPk1ldGhvZCBjb250ZW50IGVsZW1lbnRzIGFyZTo8L3A+Ci08dWw+PGxpPjxhIGhyZWY9InRhc2suaHRtbCN0YXNrIj5UYXNrPC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0icm9sZS5odG1sI3JvbGUiPlJvbGU8L2E+PC9saT4KLTxsaT48YSBocmVmPSJ3b3JrcHJvZHVjdC5odG1sI3dvcmtwcm9kdWN0Ij5Xb3JrIFByb2R1Y3Q8L2E+PC9saT4KLTxsaT48YSBocmVmPSJndWlkYW5jZS5odG1sIj5HdWlkYW5jZTwvYT48L2xpPgotPC91bD4KLTxwPkEgUHJvY2VzcyBFbmdpbmVlciBhdXRob3JzIHRoZXNlIGVsZW1lbnRzLCBkZWZpbmVzIHRoZSByZWxhdGlvbnNoaXBzIGJldHdlZW4KLXRoZW0sIGFuZCB0aGVuIGNhdGVnb3JpemVzIHRoZW0uIE1ldGhvZCBjb250ZW50IHByb3ZpZGVzIHN0ZXAtYnktc3RlcCBleHBsYW5hdGlvbnMsCi1kZXNjcmliaW5nIGhvdyBzcGVjaWZpYyBkZXZlbG9wbWVudCBnb2FscyBhcmUgYWNoaWV2ZWQgaW5kZXBlbmRlbnQgb2YgdGhlCi1wbGFjZW1lbnQgb2YgdGhlc2Ugc3RlcHMgd2l0aGluIGEgZGV2ZWxvcG1lbnQgbGlmZWN5Y2xlLiBQcm9jZXNzZXMgdGFrZSB0aGVzZQotbWV0aG9kIGVsZW1lbnRzIGFuZCByZWxhdGUgdGhlbSBpbnRvIHNlbWktb3JkZXJlZCBzZXF1ZW5jZXMgdGhhdCBhcmUgY3VzdG9taXplZAotdG8gc3BlY2lmaWMgdHlwZXMgb2YgcHJvamVjdHMuPC9wPgotPHA+Rm9yIGV4YW1wbGUsIGEgc29mdHdhcmUgZGV2ZWxvcG1lbnQgcHJvamVjdCB0aGF0IGRldmVsb3BzIGFuIGFwcGxpY2F0aW9uCi1mcm9tIHNjcmF0Y2ggcGVyZm9ybXMgZGV2ZWxvcG1lbnQgdGFza3Mgc3VjaCBhcyAiRGV2ZWxvcCBWaXNpb24iIG9yICJVc2UgQ2FzZQotRGVzaWduIiBzaW1pbGFyIHRvIGEgcHJvamVjdCB0aGF0IGV4dGVuZHMgYW4gZXhpc3Rpbmcgc29mdHdhcmUgc3lzdGVtLiBIb3dldmVyLAotdGhlIHR3byBwcm9qZWN0cyB3aWxsIHBlcmZvcm0gdGhlIHRhc2tzIGF0IGRpZmZlcmVudCBwb2ludHMgaW4gdGltZSB3aXRoIGEKLWRpZmZlcmVudCBlbXBoYXNpcywgaS5lLiwgdGhleSBwZXJmb3JtIHRoZSBzdGVwcyBvZiB0aGVzZSB0YXNrcyBhdCBkaWZmZXJlbnQKLXBvaW50cyBvZiB0aW1lIGFuZCBwZXJoYXBzIGFwcGx5IGluZGl2aWR1YWwgdmFyaWF0aW9ucyBhbmQgYWRkaXRpb25zLiA8L3A+Ci08cD5NZXRob2QgY29udGVudCBlbGVtZW50cyBhcmUgY29udGFpbmVkIHdpdGhpbiBtZXRob2QgY29udGVudCBwYWNrYWdlcyB3aGljaCwKLWluIHR1cm4sIGFyZSBjb250YWluZWQgd2l0aGluIGEgTWV0aG9kIHBsdWctaW4uIEluIG9yZGVyIHRvIHNlcGFyYXRlIHlvdXIKLW93biBjb250ZW50IGZyb20gb3JpZ2luYWwgT3BlblVQIGNvbnRlbnQsIHlvdSBzaG91bGQgYWx3YXlzIGNyZWF0ZSBuZXcKLW1ldGhvZCBjb250ZW50IGluIGEgbWV0aG9kIHBsdWctaW4gdGhhdCB5b3UgcHJvZHVjZS4gQ3JlYXRpbmcgbWV0aG9kIGNvbnRlbnQKLWluIGEgbWV0aG9kIHBsdWctaW4gb2YgeW91ciBvd24gYWxzbyBhbGxvd3MgeW91IHRvIHVwZGF0ZSB5b3VyIG93biBsaWJyYXJ5Ci13aXRoIG5ldyByZWxlYXNlcyBvZiB0aGUgT3BlblVQIGxpYnJhcnkgd2l0aG91dCBhZmZlY3RpbmcgdGhlIGNvbnRlbnQKLXRoYXQgeW91IGhhdmUgY3JlYXRlZCBpbiB5b3VyIG93biBwbHVnLWlucy48L3A+Ci08cD5TZWUgYWxzbzo8L3A+Ci08L2Rpdj4KLTxkaXY+PGRpdiBjbGFzcz0icmVsY29uY2VwdHMiPjxzdHJvbmc+UmVsYXRlZCBjb25jZXB0czwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJtZXRob2Rjb250ZW50Y2F0ZWdvcmllcy5odG1sI21ldGhvZGNvbnRlbnRjYXRlZ29yaWVzIj5NZXRob2QgQ29udGVudCBDYXRlZ29yaWVzPC9hPjwvZGl2PgotPC9kaXY+Ci08ZGl2IGNsYXNzPSJyZWx0YXNrcyI+PHN0cm9uZz5SZWxhdGVkIHRhc2tzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9ImNyZWF0ZW1ldGhvZGNvbnRlbnQuaHRtbCNjcmVhdGVtZXRob2Rjb250ZW50Ij5DcmVhdGUgTWV0aG9kIENvbnRlbnQ8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9ImNyZWF0ZWFtZXRob2RwbHVnaW4uaHRtbCNjcmVhdGVhbWV0aG9kcGx1Z2luIj5DcmVhdGUgYSBNZXRob2QgUGx1Zy1pbjwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9tZXRob2Rjb250ZW50Y2F0ZWdvcmllcy5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvbWV0aG9kY29udGVudGNhdGVnb3JpZXMuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTNhNjQ5NC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9tZXRob2Rjb250ZW50Y2F0ZWdvcmllcy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJzZWN1cml0eSIgY29udGVudD0icHVibGljIiAvPgotPG1ldGEgbmFtZT0iUm9ib3RzIiBjb250ZW50PSJpbmRleCxmb2xsb3ciIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIG5hbWU9IkRDLlR5cGUiIGNvbnRlbnQ9ImNvbmNlcHQiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iTWV0aG9kIENvbnRlbnQgQ2F0ZWdvcmllcyIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0ibWV0aG9kY29udGVudC5odG1sI2NyZWF0aW5ncmV1c2FibGVtZXRob2Rjb250ZW50cyIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iY3JlYXRlbWV0aG9kY29udGVudC5odG1sI2NyZWF0ZW1ldGhvZGNvbnRlbnQiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9Im1ldGhvZGNvbnRlbnRwYWNrYWdlLmh0bWwjbWV0aG9kY29udGVudHBhY2thZ2UiIC8+Ci08bWV0YSBuYW1lPSJEQy5Gb3JtYXQiIGNvbnRlbnQ9IlhIVE1MIiAvPgotPG1ldGEgbmFtZT0iREMuSWRlbnRpZmllciIgY29udGVudD0ibWV0aG9kY29udGVudGNhdGVnb3JpZXMiIC8+Ci08bWV0YSBuYW1lPSJEQy5MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiIC8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4vaWJtZGl0YS5jc3MiIC8+Ci08dGl0bGU+TWV0aG9kIENvbnRlbnQgQ2F0ZWdvcmllczwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0ibWV0aG9kY29udGVudGNhdGVnb3JpZXMiPjxhIG5hbWU9Im1ldGhvZGNvbnRlbnRjYXRlZ29yaWVzIj48IS0tIC0tPjwvYT4KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+TWV0aG9kIENvbnRlbnQgQ2F0ZWdvcmllczwvaDE+Ci08ZGl2PjxwPk1ldGhvZCBDb250ZW50IGVsZW1lbnRzIGFyZSBvcmdhbml6ZWQgaW50byBsb2dpY2FsIGNhdGVnb3JpZXMuIFRoZSBjYXRlZ29yaWVzCi1jYW4gYXBwZWFyIGluIHlvdXIgZmluYWwsIHB1Ymxpc2hlZCBXZWIgc2l0ZSBhcyB2aWV3cy48L3A+Ci08cD5UaGVyZSBhcmUgdHdvIHR5cGVzIG9mIGNhdGVnb3J5OiBTdGFuZGFyZCBhbmQgQ3VzdG9tLjwvcD4KLTxwPjwvcD4KLTxkaXYgY2xhc3M9InNlY3Rpb24iPjxoNCBjbGFzcz0ic2VjdGlvbnRpdGxlIj5TdGFuZGFyZCBDYXRlZ29yaWVzPC9oND48cD5TdGFuZGFyZCBDYXRlZ29yaWVzIHByb3ZpZGUKLWEgbWVhbnMgdG8gY2F0ZWdvcml6ZSBjb3JlIG1ldGhvZCBjb250ZW50IGluIGxpbmUgd2l0aCB0aGUgYmVzdCBwcmFjdGljZXMKLWZvciBjcmVhdGluZyBzdHJ1Y3R1cmVkIG1ldGhvZHMuIFN0YW5kYXJkIENhdGVnb3JpZXMgYXJlIGxpbmtlZCB3aXRoIGEgc3BlY2lmaWMKLW1ldGhvZCBjb250ZW50IHR5cGUsIGUuZy4gRGlzY2lwbGluZXMgY29udGFpbiBvbmx5IHRhc2tzLiA8L3A+Ci08ZGl2IGNsYXNzPSJwIj5TdGFuZGFyZAotQ2F0ZWdvcnkgdHlwZXMgYXJlOjx1bD48bGk+PHN0cm9uZz5EaXNjaXBsaW5lczwvc3Ryb25nPiAtIEEgZGlzY2lwbGluZSBpcyBhIGNvbGxlY3Rpb24gb2YgPGEgaHJlZj0idGFzay5odG1sI3Rhc2siPlRhc2tzPC9hPiB0aGF0IGFyZSByZWxhdGVkIHRvIGEgbWFqb3IgYXJlYSBvZiBjb25jZXJuIHdpdGhpbgotdGhlIG92ZXJhbGwgSVQgZW52aXJvbm1lbnQuIEZvciBleGFtcGxlLCBvbiBhIHNvZnR3YXJlIGRldmVsb3BtZW50IHByb2plY3QsCi1pdCBpcyBjb21tb24gdG8gcGVyZm9ybSBjZXJ0YWluIHJlcXVpcmVtZW50cyB0YXNrcyBpbiBjbG9zZSBjb29yZGluYXRpb24gd2l0aAotYW5hbHlzaXMgYW5kIGRlc2lnbiB0YXNrcy4gU2VwYXJhdGluZyB0aGVzZSB0YXNrcyBpbnRvIHNlcGFyYXRlIGRpc2NpcGxpbmVzCi1tYWtlcyB0aGUgdGFza3MgZWFzaWVyIHRvIGNvbXByZWhlbmQuIERpc2NpcGxpbmVzIGNhbiBiZSBvcmdhbml6ZWQgdXNpbmcgRGlzY2lwbGluZQotR3JvdXBpbmdzLjwvbGk+Ci08bGk+PHN0cm9uZz5Eb21haW5zPC9zdHJvbmc+IC0gQSBEb21haW4gaXMgYSByZWZpbmVhYmxlLCBsb2dpY2FsLCBoaWVyYXJjaHkgb2YgcmVsYXRlZCA8YSBocmVmPSJ3b3JrcHJvZHVjdC5odG1sI3dvcmtwcm9kdWN0Ij5Xb3JrIFByb2R1Y3RzPC9hPiBncm91cGVkCi10b2dldGhlciBiYXNlZCBvbiB0aW1pbmcsIHJlc291cmNlcywgb3IgcmVsYXRpb25zaGlwLiBXaGlsZSBhIERvbWFpbiBjYXRlZ29yaXplcwotbWFueSB3b3JrIHByb2R1Y3RzLCBhIHdvcmsgcHJvZHVjdCBiZWxvbmdzIHRvIG9ubHkgb25lIERvbWFpbi4gRG9tYWlucyBjYW4KLWJlIGZ1cnRoZXIgZGl2aWRlZCBpbnRvIHN1Yi1kb21haW5zLiA8L2xpPgotPGxpPjxzdHJvbmc+V29yayBQcm9kdWN0IEtpbmRzPC9zdHJvbmc+IC0gV29yayBQcm9kdWN0IEtpbmQgaXMgYW5vdGhlciBjYXRlZ29yeSBmb3IKLWdyb3VwaW5nIDxhIGhyZWY9Indvcmtwcm9kdWN0Lmh0bWwjd29ya3Byb2R1Y3QiPldvcmsgUHJvZHVjdHM8L2E+LgotQSB3b3JrIHByb2R1Y3QgY2FuIGhhdmUgbWFueSB3b3JrIHByb2R1Y3Qga2luZHMuIEFzIGFuIGV4YW1wbGUsIHlvdSBtaWdodAotd2FudCB0byBoYXZlIGEgc2VyaWVzIG9mIHdvcmsgcHJvZHVjdCBraW5kcyB0aGF0IGNvcnJlc3BvbmQgdG8gdGhlIG92ZXJhbGwKLWludGVudCBvZiB3b3JrIHByb2R1Y3RzLCBzdWNoIGFzIHNwZWNpZmljYXRpb24sIHBsYW4sIG9yIG1vZGVsLjwvbGk+Ci08bGk+PHN0cm9uZz5Sb2xlIFNldHM8L3N0cm9uZz4gLSBBIFJvbGUgU2V0IGlzIHVzZWQgdG8gZ3JvdXAgPGEgaHJlZj0icm9sZS5odG1sI3JvbGUiPlJvbGVzPC9hPiB3aXRoIGNlcnRhaW4gY29tbW9uYWxpdGllcyB0b2dldGhlci4gRm9yIGV4YW1wbGUsCi1pbiBhIHNvZnR3YXJlIGRldmVsb3BtZW50IGVudmlyb25tZW50LCBhbiBBbmFseXN0IHJvbGUgc2V0IGNvdWxkIGJlIHVzZWQgdG8KLWdyb3VwIHRvZ2V0aGVyIHJvbGVzIHN1Y2ggYXMgQnVzaW5lc3MgUHJvY2VzcyBBbmFseXN0LCBTeXN0ZW0gQW5hbHlzdCBhbmQKLVJlcXVpcmVtZW50cyBTcGVjaWZpZXIuIEVhY2ggb2YgdGhlc2Ugcm9sZXMgd29yayB3aXRoIHNpbWlsYXIgdGVjaG5pcXVlcyBhbmQKLWhhdmUgb3ZlcmxhcHBpbmcgc2tpbGxzLCBidXQgbWF5IGJlIHJlc3BvbnNpYmxlIGZvciBwZXJmb3JtaW5nIGNlcnRhaW4gdGFza3MKLWFuZCBjcmVhdGluZyBjZXJ0YWluIHdvcmsgcHJvZHVjdHMuIFJvbGUgc2V0cyBjYW4gYmUgb3JnYW5pemVkIHVzaW5nIFJvbGUKLVNldCBHcm91cGluZ3MuPC9saT4KLTxsaT48c3Ryb25nPlRvb2xzPC9zdHJvbmc+IC0gVG9vbHMgaXMgYSBjb250YWluZXIgZm9yIDxhIGhyZWY9InRvb2xtZW50b3IuaHRtbCN0b29sbWVudG9yIj5Ub29sIE1lbnRvcnM8L2E+LiBUb29scyBjYW4gYWxzbyBwcm92aWRlIGdlbmVyYWwgZGVzY3JpcHRpb25zCi1vZiBhIHRvb2wgYW5kIGl0J3MgZ2VuZXJhbCBjYXBhYmlsaXRpZXMuPC9saT4KLTwvdWw+Ci08L2Rpdj4KLTwvZGl2PgotPGRpdiBjbGFzcz0ic2VjdGlvbiI+PGg0IGNsYXNzPSJzZWN0aW9udGl0bGUiPkN1c3RvbSBDYXRlZ29yaWVzPC9oND48cD5DdXN0b20gQ2F0ZWdvcmllcyBhcmUgaGlnaGx5IGN1c3RvbWl6YWJsZQotYW5kIGNhbiBjb250YWluIGFueSB0eXBlIG9mIGVsZW1lbnQuIEN1c3RvbSBDYXRlZ29yaWVzIGFsbG93IHlvdSB0byBjYXRlZ29yaXplCi1jb250ZW50IGFjY29yZGluZyB0byBhbnkgc2NoZW1lIHlvdSB3YW50IGFuZCBjYW4gdGhlbiBiZSB1c2VkIHRvIGNvbXBvc2UgcHVibGlzaGFibGUKLVZpZXdzLCBwcm92aWRpbmcgYSBtZWFucyB0byBvcmdhbml6ZSB0aGUgbWV0aG9kIGNvbnRlbnQgcHJpb3IgdG8gcHVibGlzaGluZy4KLUZvciBleGFtcGxlLCB5b3UgY291bGQgY3JlYXRlIGEgY3VzdG9tIGNhdGVnb3J5IHRoYXQgbG9naWNhbGx5IG9yZ2FuaXplcyBjb250ZW50Ci1yZWxldmFudCB0byB5b3VyIGRldmVsb3BtZW50IG9yZ2FuaXphdGlvbiBkZXBhcnRtZW50LCBzdWNoIGFzIGEgVGVzdGluZyBjYXRlZ29yeQotdGhhdCBncm91cHMgdG9nZXRoZXIgYWxsIHJvbGVzLCB3b3JrIHByb2R1Y3RzLCB0YXNrcywgYW5kIGd1aWRhbmNlIGVsZW1lbnRzCi1yZWxldmFudCB0byB0ZXN0aW5nLjwvcD4KLTwvZGl2PgotPC9kaXY+Ci08ZGl2PjxkaXYgY2xhc3M9InJlbGNvbmNlcHRzIj48c3Ryb25nPlJlbGF0ZWQgY29uY2VwdHM8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0ibWV0aG9kY29udGVudC5odG1sI2NyZWF0aW5ncmV1c2FibGVtZXRob2Rjb250ZW50cyI+TWV0aG9kIENvbnRlbnQ8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Im1ldGhvZGNvbnRlbnRwYWNrYWdlLmh0bWwjbWV0aG9kY29udGVudHBhY2thZ2UiPk1ldGhvZCBDb250ZW50IFBhY2thZ2U8L2E+PC9kaXY+Ci08L2Rpdj4KLTxkaXYgY2xhc3M9InJlbHRhc2tzIj48c3Ryb25nPlJlbGF0ZWQgdGFza3M8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iY3JlYXRlbWV0aG9kY29udGVudC5odG1sI2NyZWF0ZW1ldGhvZGNvbnRlbnQiPkNyZWF0ZSBNZXRob2QgQ29udGVudDwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9tZXRob2Rjb250ZW50cGFja2FnZS5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvbWV0aG9kY29udGVudHBhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmE4NWY5NS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9tZXRob2Rjb250ZW50cGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJzZWN1cml0eSIgY29udGVudD0icHVibGljIiAvPgotPG1ldGEgbmFtZT0iUm9ib3RzIiBjb250ZW50PSJpbmRleCxmb2xsb3ciIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIG5hbWU9IkRDLlR5cGUiIGNvbnRlbnQ9ImNvbmNlcHQiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iTWV0aG9kIENvbnRlbnQgUGFja2FnZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iY3JlYXRlYWNvbnRlbnRwYWNrYWdlLmh0bWwjY3JlYXRlY29udGVudHBhY2thZ2UiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9ImNyZWF0ZWFtZXRob2RwbHVnaW4uaHRtbCNjcmVhdGVhbWV0aG9kcGx1Z2luIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJjcmVhdGVtZXRob2Rjb250ZW50Lmh0bWwjY3JlYXRlbWV0aG9kY29udGVudCIgLz4KLTxtZXRhIG5hbWU9IkRDLkZvcm1hdCIgY29udGVudD0iWEhUTUwiIC8+Ci08bWV0YSBuYW1lPSJEQy5JZGVudGlmaWVyIiBjb250ZW50PSJtZXRob2Rjb250ZW50cGFja2FnZSIgLz4KLTxtZXRhIG5hbWU9IkRDLkxhbmd1YWdlIiBjb250ZW50PSJlbi11cyIgLz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi9pYm1kaXRhLmNzcyIgLz4KLTx0aXRsZT5NZXRob2QgQ29udGVudCBQYWNrYWdlPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJtZXRob2Rjb250ZW50cGFja2FnZSI+PGEgbmFtZT0ibWV0aG9kY29udGVudHBhY2thZ2UiPjwhLS0gLS0+PC9hPgotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5NZXRob2QgQ29udGVudCBQYWNrYWdlPC9oMT4KLTxkaXY+PHA+QSBNZXRob2QgcGFja2FnZSBpcyBhIGNvbnRhaW5lciBmb3IgbWV0aG9kIGVsZW1lbnRzLiBFbGVtZW50cyBhcmUgb3JnYW5pemVkCi1pbiBtZXRob2QgcGFja2FnZXMgdG8gc3RydWN0dXJlIGEgbGFyZ2Ugc2NhbGUgb2YgbWV0aG9kIGNvbnRlbnQgYW5kIHByb2Nlc3NlcwotYXMgd2VsbCBhcyB0byBkZWZpbmUgYSBtZWNoYW5pc20gZm9yIHJldXNlLiBNZXRob2QgZWxlbWVudHMgZnJvbSBvbmUgcGFja2FnZQotY2FuIHJldXNlIGVsZW1lbnRzIGZyb20gb3RoZXIgcGFja2FnZXMgYnkgZGVmaW5pbmcgYSBsaW5rIGJldHdlZW4gdGhlbS4gRm9yCi1leGFtcGxlLCBhIHdvcmsgcHJvZHVjdCBkZWZpbmVkIGluIG9uZSBwYWNrYWdlIGNhbiBiZSB1c2VkIGFzIGFuIGlucHV0IGZvcgotdGFza3MgZGVmaW5lZCBpbiBhbm90aGVyIHBhY2thZ2UsIGVuc3VyaW5nIHRoYXQgbm8gcmVkdW5kYW50IGRlZmluaXRpb25zIG9mCi10aGUgc2FtZSBlbGVtZW50cyBhcmUgcmVxdWlyZWQuIEFsc28sIG1haW50ZW5hbmNlIG9mIG1ldGhvZCBjb250ZW50IGlzIGdyZWF0bHkKLWltcHJvdmVkIGFzIGNoYW5nZXMgY2FuIGJlIHBlcmZvcm1lZCBpbiBvbmx5IG9uZSBwbGFjZS48L3A+Ci08cD48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0aW9uIj48aDQgY2xhc3M9InNlY3Rpb250aXRsZSI+U3RydWN0dXJlIG9mIGEgTWV0aG9kIFBhY2thZ2U8L2g0PjxwPkFsdGhvdWdoIGEgbWV0aG9kCi1wYWNrYWdlIGlzIGEgY29udGFpbmVyIGZvciBtZXRob2QgZWxlbWVudHMsIGl0cyBzdHJ1Y3R1cmUgaXMgYnJva2VuIGRvd24gaW50bwotc21hbGxlciBwYWNrYWdlcyB0byBiZXR0ZXIgb3JnYW5pemUgdGhlIGNvbnRlbnQsIHN1Y2ggYXMgY29udGVudCBwYWNrYWdlcywKLXN0YW5kYXJkIGNhdGVnb3JpZXMsIGFuZCBjdXN0b20gY2F0ZWdvcmllcy48L3A+Ci08L2Rpdj4KLTwvZGl2PgotPGRpdj48ZGl2IGNsYXNzPSJyZWx0YXNrcyI+PHN0cm9uZz5SZWxhdGVkIHRhc2tzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9ImNyZWF0ZWFjb250ZW50cGFja2FnZS5odG1sI2NyZWF0ZWNvbnRlbnRwYWNrYWdlIj5DcmVhdGUgYSBDb250ZW50IFBhY2thZ2U8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9ImNyZWF0ZWFtZXRob2RwbHVnaW4uaHRtbCNjcmVhdGVhbWV0aG9kcGx1Z2luIj5DcmVhdGUgYSBNZXRob2QgUGx1Zy1pbjwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iY3JlYXRlbWV0aG9kY29udGVudC5odG1sI2NyZWF0ZW1ldGhvZGNvbnRlbnQiPkNyZWF0ZSBNZXRob2QgQ29udGVudDwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9tZXRob2RwbHVnaW4uaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL21ldGhvZHBsdWdpbi5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlODM5MDRjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL21ldGhvZHBsdWdpbi5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJzZWN1cml0eSIgY29udGVudD0icHVibGljIiAvPgotPG1ldGEgbmFtZT0iUm9ib3RzIiBjb250ZW50PSJpbmRleCxmb2xsb3ciIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIG5hbWU9IkRDLlR5cGUiIGNvbnRlbnQ9ImNvbmNlcHQiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iTWV0aG9kIFBsdWctaW4iIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9ImNyZWF0ZWFtZXRob2RwbHVnaW4uaHRtbCNjcmVhdGVhbWV0aG9kcGx1Z2luIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJtZXRob2Rjb250ZW50cGFja2FnZS5odG1sI21ldGhvZGNvbnRlbnRwYWNrYWdlIiAvPgotPG1ldGEgbmFtZT0iREMuRm9ybWF0IiBjb250ZW50PSJYSFRNTCIgLz4KLTxtZXRhIG5hbWU9IkRDLklkZW50aWZpZXIiIGNvbnRlbnQ9Im1ldGhvZHBsdWdpbiIgLz4KLTxtZXRhIG5hbWU9IkRDLkxhbmd1YWdlIiBjb250ZW50PSJlbi11cyIgLz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi9pYm1kaXRhLmNzcyIgLz4KLTx0aXRsZT5NZXRob2QgUGx1Zy1pbjwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0ibWV0aG9kcGx1Z2luIj48YSBuYW1lPSJtZXRob2RwbHVnaW4iPjwhLS0gLS0+PC9hPgotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5NZXRob2QgUGx1Zy1pbjwvaDE+Ci08ZGl2PjxwPkFsbCBjb250ZW50IGlzIG9yZ2FuaXplZCBpbiBtZXRob2QgcGx1Zy1pbnMuIEEgbWV0aG9kIHBsdWctaW4gaXMgYSBjb250YWluZXIKLWZvciBtZXRob2QgcGFja2FnZXMgd2hpY2gsIGluIHR1cm4sIGNvbnRhaW4gdGhlIG1ldGhvZCBhbmQgcHJvY2VzcyBjb250ZW50LgotTWV0aG9kIHBsdWctaW5zIGFuZCBtZXRob2QgcGFja2FnZXMgYWxsb3cgeW91IHRvIG9yZ2FuaXplIHlvdXIgY29udGVudCBhdAotYSBsZXZlbCBvZiBncmFudWxhcml0eSB0aGF0IHN1aXRzIHlvdXIgbmVlZHMgZm9yIGF1dGhvcmluZyBhbmQgcmV1c2luZyB0aGUKLWNvbnRlbnQuIDwvcD4KLTxwPldoZW4geW91IGNyZWF0ZSBhIG1ldGhvZCBwbHVnLWluLCB5b3Ugd2lsbCB1c3VhbGx5IHdhbnQgdG8gcmV1c2UgY29udGVudAotaW4gb3RoZXIgcGx1Zy1pbnMuIFlvdSBtYXkgd2FudCB0byBtb2RpZnkgb3IgZXh0ZW5kIHRoZSBjb250ZW50IGluIHRoZXNlIG90aGVyCi1wbHVnLWlucyBvciBhZGQgeW91ciBvd24gY29udGVudC4gV2hlbiB5b3UgY3JlYXRlIGEgcGx1Zy1pbiB5b3UKLWNhbiByZWZlcmVuY2UgYW55IG51bWJlciBvZiBvdGhlciBwbHVnLWlucyB0aGF0IHdhbnQgdG8gdXNlIGluIHRoaXMgd2F5LiBBCi1tZXRob2QgcGx1Zy1pbiBjYW4gYWxzbyBiZSBzdGFuZC1hbG9uZSBhbmQgbm90IHJlZmVyZW5jZSBvdGhlciBwbHVnLWlucy48L3A+Ci08L2Rpdj4KLTxkaXY+PGRpdiBjbGFzcz0icmVsY29uY2VwdHMiPjxzdHJvbmc+UmVsYXRlZCBjb25jZXB0czwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJtZXRob2Rjb250ZW50cGFja2FnZS5odG1sI21ldGhvZGNvbnRlbnRwYWNrYWdlIj5NZXRob2QgQ29udGVudCBQYWNrYWdlPC9hPjwvZGl2PgotPC9kaXY+Ci08ZGl2IGNsYXNzPSJyZWx0YXNrcyI+PHN0cm9uZz5SZWxhdGVkIHRhc2tzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9ImNyZWF0ZWFtZXRob2RwbHVnaW4uaHRtbCNjcmVhdGVhbWV0aG9kcGx1Z2luIj5DcmVhdGUgYSBNZXRob2QgUGx1Zy1pbjwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9taWxlc3RvbmUuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL21pbGVzdG9uZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OWNjNzc0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL21pbGVzdG9uZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJzZWN1cml0eSIgY29udGVudD0icHVibGljIiAvPgotPG1ldGEgbmFtZT0iUm9ib3RzIiBjb250ZW50PSJpbmRleCxmb2xsb3ciIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIG5hbWU9IkRDLlR5cGUiIGNvbnRlbnQ9ImNvbmNlcHQiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iTWlsZXN0b25lIiAvPgotPG1ldGEgbmFtZT0iREMuRm9ybWF0IiBjb250ZW50PSJYSFRNTCIgLz4KLTxtZXRhIG5hbWU9IkRDLklkZW50aWZpZXIiIGNvbnRlbnQ9Im1pbGVzdG9uZSIgLz4KLTxtZXRhIG5hbWU9IkRDLkxhbmd1YWdlIiBjb250ZW50PSJlbi11cyIgLz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi9pYm1kaXRhLmNzcyIgLz4KLTx0aXRsZT5NaWxlc3RvbmU8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9Im1pbGVzdG9uZSI+PGEgbmFtZT0ibWlsZXN0b25lIj48IS0tIC0tPjwvYT4KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+TWlsZXN0b25lPC9oMT4KLTxkaXY+PHA+QSBNaWxlc3RvbmUgZGVzY3JpYmVzIGEgc2lnbmlmaWNhbnQgZXZlbnQgaW4gYSBwcm9qZWN0LCBzdWNoCi1hcyBhIG1ham9yIGRlY2lzaW9uLCBjb21wbGV0aW9uIG9mIGEgZGVsaXZlcmFibGUsIG9yIG1lZXRpbmcgb2YgYSBtYWpvciBkZXBlbmRlbmN5Ci1zdWNoIGFzIHRoZSBjb21wbGV0aW9uIG9mIGEgcHJvamVjdCBwaGFzZS48L3A+Ci08L2Rpdj4KLTxkaXY+PC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9vcGVucGVyc3AuSlBHIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvb3BlbnBlcnNwLkpQRwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmE0YTYwNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9vcGVucGVyc3AuSlBHCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvb3V0Y29tZS5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvb3V0Y29tZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZDNmYmU4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL291dGNvbWUuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgaHRtbAotICBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0ic2VjdXJpdHkiIGNvbnRlbnQ9InB1YmxpYyIgLz4KLTxtZXRhIG5hbWU9IlJvYm90cyIgY29udGVudD0iaW5kZXgsZm9sbG93IiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBuYW1lPSJEQy5UeXBlIiBjb250ZW50PSJjb25jZXB0IiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9Ik91dGNvbWUiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9Indvcmtwcm9kdWN0Lmh0bWwjd29ya3Byb2R1Y3QiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9ImNyZWF0ZWF3b3JrcHJvZHVjdC5odG1sIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJhcnRpZmFjdC5odG1sI2FydGlmYWN0IiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJkZWxpdmVyYWJsZS5odG1sI2RlbGl2ZXJhYmxlIiAvPgotPG1ldGEgbmFtZT0iREMuRm9ybWF0IiBjb250ZW50PSJYSFRNTCIgLz4KLTxtZXRhIG5hbWU9IkRDLklkZW50aWZpZXIiIGNvbnRlbnQ9Im91dGNvbWUiIC8+Ci08bWV0YSBuYW1lPSJEQy5MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiIC8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4vaWJtZGl0YS5jc3MiIC8+Ci08dGl0bGU+T3V0Y29tZTwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0ib3V0Y29tZSI+PGEgbmFtZT0ib3V0Y29tZSI+PCEtLSAtLT48L2E+Ci0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPk91dGNvbWU8L2gxPgotPGRpdj48cD5BbiBvdXRjb21lIGlzIGFuIGludGFuZ2libGUgd29yayBwcm9kdWN0IHRoYXQgbWF5IGJlIGEgcmVzdWx0IG9yIHN0YXRlLgotT3V0Y29tZXMgbWF5IGFsc28gYmUgdXNlZCB0byBkZXNjcmliZSB3b3JrIHByb2R1Y3RzIHRoYXQgYXJlIG5vdCBmb3JtYWxseQotZGVmaW5lZC4gPC9wPgotPC9kaXY+Ci08ZGl2PjxkaXYgY2xhc3M9InJlbGNvbmNlcHRzIj48c3Ryb25nPlJlbGF0ZWQgY29uY2VwdHM8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0id29ya3Byb2R1Y3QuaHRtbCN3b3JrcHJvZHVjdCI+V29yayBQcm9kdWN0PC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJhcnRpZmFjdC5odG1sI2FydGlmYWN0Ij5BcnRpZmFjdDwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iZGVsaXZlcmFibGUuaHRtbCNkZWxpdmVyYWJsZSI+RGVsaXZlcmFibGU8L2E+PC9kaXY+Ci08L2Rpdj4KLTxkaXYgY2xhc3M9InJlbHRhc2tzIj48c3Ryb25nPlJlbGF0ZWQgdGFza3M8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iY3JlYXRlYXdvcmtwcm9kdWN0Lmh0bWwiPkNyZWF0ZSBhIFdvcmsgUHJvZHVjdDwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9vdXRkZW50LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL291dGRlbnQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZDY0NjkxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL291dGRlbnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvcGFzdGUuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvcGFzdGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDdlNjkwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3Bhc3RlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3BlcnNwZWN0aXZlcy5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvcGVyc3BlY3RpdmVzLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4YzNlNWMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvcGVyc3BlY3RpdmVzLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGh0bWwKLSAgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9InNlY3VyaXR5IiBjb250ZW50PSJwdWJsaWMiIC8+Ci08bWV0YSBuYW1lPSJSb2JvdHMiIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgbmFtZT0iREMuVHlwZSIgY29udGVudD0iY29uY2VwdCIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJQZXJzcGVjdGl2ZXMiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9InVzZXJpbnRlcmZhY2VvdmVydmlldy5odG1sI3VzZXJpbnRlcmZhY2VvdmVydmlldyIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iYXV0aG9yaW5ncGVyc3BlY3RpdmUuaHRtbCNhdXRob3JpbmdwZXJzcGVjdGl2ZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iYnJvd3NpbmdwZXJzcGVjdGl2ZS5odG1sI2Jyb3dpbmdwZXJzcGVjdGl2ZSIgLz4KLTxtZXRhIG5hbWU9IkRDLkZvcm1hdCIgY29udGVudD0iWEhUTUwiIC8+Ci08bWV0YSBuYW1lPSJEQy5JZGVudGlmaWVyIiBjb250ZW50PSJwZXJzcGVjdGl2ZXMiIC8+Ci08bWV0YSBuYW1lPSJEQy5MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiIC8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4vaWJtZGl0YS5jc3MiIC8+Ci08dGl0bGU+UGVyc3BlY3RpdmVzPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJwZXJzcGVjdGl2ZXMiPjxhIG5hbWU9InBlcnNwZWN0aXZlcyI+PCEtLSAtLT48L2E+Ci0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPlBlcnNwZWN0aXZlczwvaDE+Ci08ZGl2PjxwPkEgUGVyc3BlY3RpdmUgZGVmaW5lcyBhIHNldCBvZiB2aWV3cyBhbmQgZnVuY3Rpb25zIGF2YWlsYWJsZSBmb3Igc3BlY2lmaWMKLXRhc2tzLiBFY2xpcHNlIFByb2Nlc3MgRnJhbWV3b3JrIENvbXBvc2VyIGNvbnRhaW5zIHR3byB3b3JraW5nIHBlcnNwZWN0aXZlczogYW4KLUF1dGhvcmluZyBQZXJzcGVjdGl2ZSBhbmQgYSBCcm93c2luZyBQZXJzcGVjdGl2ZS48L3A+Ci08cD5UaGUgPGEgaHJlZj0iYXV0aG9yaW5ncGVyc3BlY3RpdmUuaHRtbCNhdXRob3JpbmdwZXJzcGVjdGl2ZSI+QXV0aG9yaW5nCi1QZXJzcGVjdGl2ZTwvYT4gcHJvdmlkZXMgdmlld3MgYW5kIGZ1bmN0aW9ucyB0byBuYXZpZ2F0ZSBhbmQgYXV0aG9yIG1ldGhvZAotY29udGVudCBhbmQgcHJvY2Vzc2VzLCB3aGlsZSB0aGUgPGEgaHJlZj0iYnJvd3NpbmdwZXJzcGVjdGl2ZS5odG1sI2Jyb3dpbmdwZXJzcGVjdGl2ZSI+QnJvd3NpbmcgUGVyc3BlY3RpdmU8L2E+LCBhcyBpdHMgbmFtZSBpbXBsaWVzLCBhbGxvd3MgeW91Ci10byBwcmV2aWV3IGFuZCBuYXZpZ2F0ZSB0aHJvdWdoIGEgPGEgaHJlZj0ibWV0aG9kY29uZmlndXJhdGlvbnMuaHRtbCNtZXRob2Rjb25maWd1cmF0aW9ucyI+TWV0aG9kIENvbmZpZ3VyYXRpb248L2E+IHdpdGhvdXQgbWFraW5nIGFueSBjaGFuZ2VzLjwvcD4KLTxwPlRvIHNlbGVjdCBhIHBlcnNwZWN0aXZlLCBjbGljayB0aGUgT3BlbiBQZXJzcGVjdGl2ZSBidXR0b24gPGltZyBzcmM9Im9wZW5wZXJzcC5KUEciIGFsdD0iIiAvPi48L3A+Ci08L2Rpdj4KLTxkaXY+PGRpdiBjbGFzcz0icmVsY29uY2VwdHMiPjxzdHJvbmc+UmVsYXRlZCBjb25jZXB0czwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJ1c2VyaW50ZXJmYWNlb3ZlcnZpZXcuaHRtbCN1c2VyaW50ZXJmYWNlb3ZlcnZpZXciIHRpdGxlPSJFY2xpcHNlIFByb2Nlc3MgRnJhbWV3b3JrIENvbXBvc2VyIGlzIGJ1aWx0IG9uIHRoZSBFY2xpcHNlIEludGVncmF0ZWQgRGV2ZWxvcG1lbnQgRW52aXJvbm1lbnQgKElERSkuIFRoZSBwYXJ0cyBvZiB0aGUgd29ya3NwYWNlIGFyZToiPlRvb2wgSW50ZXJmYWNlPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJhdXRob3JpbmdwZXJzcGVjdGl2ZS5odG1sI2F1dGhvcmluZ3BlcnNwZWN0aXZlIj5BdXRob3JpbmcgUGVyc3BlY3RpdmU8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9ImJyb3dzaW5ncGVyc3BlY3RpdmUuaHRtbCNicm93aW5ncGVyc3BlY3RpdmUiPkJyb3dzaW5nIFBlcnNwZWN0aXZlPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3BoYXNlLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9waGFzZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMzJmZWE5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3BoYXNlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGh0bWwKLSAgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9InNlY3VyaXR5IiBjb250ZW50PSJwdWJsaWMiIC8+Ci08bWV0YSBuYW1lPSJSb2JvdHMiIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgbmFtZT0iREMuVHlwZSIgY29udGVudD0iY29uY2VwdCIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJQaGFzZSIgLz4KLTxtZXRhIG5hbWU9IkRDLkZvcm1hdCIgY29udGVudD0iWEhUTUwiIC8+Ci08bWV0YSBuYW1lPSJEQy5JZGVudGlmaWVyIiBjb250ZW50PSJwaGFzZSIgLz4KLTxtZXRhIG5hbWU9IkRDLkxhbmd1YWdlIiBjb250ZW50PSJlbi11cyIgLz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi9pYm1kaXRhLmNzcyIgLz4KLTx0aXRsZT5QaGFzZTwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0icGhhc2UiPjxhIG5hbWU9InBoYXNlIj48IS0tIC0tPjwvYT4KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+UGhhc2U8L2gxPgotPGRpdj48cD5BIFBoYXNlIGlzIGEgc3BlY2lhbCB0eXBlIG9mIGFjdGl2aXR5IHRoYXQgcmVwcmVzZW50cyBhIHNpZ25pZmljYW50Ci1wZXJpb2QgaW4gYSBwcm9qZWN0LCBlbmRpbmcgd2l0aCBhIG1ham9yIG1hbmFnZW1lbnQgY2hlY2twb2ludCwgbWlsZXN0b25lCi1vciBzZXQgb2YgZGVsaXZlcmFibGVzLjwvcD4KLTwvZGl2PgotPGRpdj48L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3ByYWN0aWNlLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9wcmFjdGljZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZTc0Y2EyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3ByYWN0aWNlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGh0bWwKLSAgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9InNlY3VyaXR5IiBjb250ZW50PSJwdWJsaWMiIC8+Ci08bWV0YSBuYW1lPSJSb2JvdHMiIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgbmFtZT0iREMuVHlwZSIgY29udGVudD0iY29uY2VwdCIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJQcmFjdGljZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iZ3VpZGFuY2UuaHRtbCNndWlkYW5jZSIgLz4KLTxtZXRhIG5hbWU9IkRDLkZvcm1hdCIgY29udGVudD0iWEhUTUwiIC8+Ci08bWV0YSBuYW1lPSJEQy5JZGVudGlmaWVyIiBjb250ZW50PSJwcmFjdGljZSIgLz4KLTxtZXRhIG5hbWU9IkRDLkxhbmd1YWdlIiBjb250ZW50PSJlbi11cyIgLz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi9pYm1kaXRhLmNzcyIgLz4KLTx0aXRsZT5QcmFjdGljZTwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0icHJhY3RpY2UiPjxhIG5hbWU9InByYWN0aWNlIj48IS0tIC0tPjwvYT4KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+UHJhY3RpY2U8L2gxPgotPGRpdj48cD5BIHByYWN0aWNlIHJlcHJlc2VudHMgYSBwcm92ZW4gd2F5IG9yIHN0cmF0ZWd5IG9mIGRvaW5nIHdvcmsgdG8gYWNoaWV2ZQotYSBnb2FsIHRoYXQgaGFzIGEgcG9zaXRpdmUgaW1wYWN0IG9uIHdvcmsgcHJvZHVjdCBvciBwcm9jZXNzIHF1YWxpdHkuIFByYWN0aWNlcwotYXJlIGRlZmluZWQgb3J0aG9nb25hbCB0byBtZXRob2RzIGFuZCBwcm9jZXNzZXMuIFRoZXkgY291bGQgc3VtbWFyaXplIGFzcGVjdHMKLXRoYXQgaW1wYWN0IG1hbnkgZGlmZmVyZW50IHBhcnRzIG9mIGEgbWV0aG9kIG9yIHNwZWNpZmljIHByb2Nlc3Nlcy4gRXhhbXBsZXMKLWZvciBwcmFjdGljZXMgd291bGQgYmUgbWFuYWdlIHJpc2tzLCBjb250aW51b3VzbHkgdmVyaWZ5IHF1YWxpdHksIGFyY2hpdGVjdHVyZQotY2VudHJpYywgYW5kIGNvbXBvbmVudCBiYXNlZCBkZXZlbG9wbWVudCwgdG8gbmFtZSBhIGZldy48L3A+Ci08L2Rpdj4KLTxkaXY+PGRpdiBjbGFzcz0icmVsY29uY2VwdHMiPjxzdHJvbmc+UmVsYXRlZCBjb25jZXB0czwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJndWlkYW5jZS5odG1sI2d1aWRhbmNlIj5HdWlkYW5jZTwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9wcmV2aWV3Lmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9wcmV2aWV3Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3YTRmOWIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvcHJldmlldy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJzZWN1cml0eSIgY29udGVudD0icHVibGljIiAvPgotPG1ldGEgbmFtZT0iUm9ib3RzIiBjb250ZW50PSJpbmRleCxmb2xsb3ciIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIG5hbWU9IkRDLlR5cGUiIGNvbnRlbnQ9ImNvbmNlcHQiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iUHJldmlldyIgLz4KLTxtZXRhIG5hbWU9IkRDLkZvcm1hdCIgY29udGVudD0iWEhUTUwiIC8+Ci08bWV0YSBuYW1lPSJEQy5JZGVudGlmaWVyIiBjb250ZW50PSJwcmV2aWV3IiAvPgotPG1ldGEgbmFtZT0iREMuTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIiAvPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuL2libWRpdGEuY3NzIiAvPgotPHRpdGxlPlByZXZpZXc8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InByZXZpZXciPjxhIG5hbWU9InByZXZpZXciPjwhLS0gLS0+PC9hPgotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5QcmV2aWV3PC9oMT4KLTxkaXY+PHA+UHJldmlldyBkaXNwbGF5cyB5b3VyIGNvbnRlbnQgaW4gYnJvd3NlciBmb3JtYXQgc2ltaWxhciB0bwotaG93IGl0IHdpbGwgYXBwZWFyIHRvIGFuIGVuZCB1c2VyIGJyb3dzaW5nIGEgcHVibGlzaGVkIFdlYiBzaXRlLjwvcD4KLTwvZGl2PgotPGRpdj48L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3Byb2NhdXRoLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3Byb2NhdXRoLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2JmOGU4OC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9wcm9jYXV0aC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9wcm9jZXNzLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9wcm9jZXNzLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyZmM4MmMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvcHJvY2Vzcy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJzZWN1cml0eSIgY29udGVudD0icHVibGljIiAvPgotPG1ldGEgbmFtZT0iUm9ib3RzIiBjb250ZW50PSJpbmRleCxmb2xsb3ciIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIG5hbWU9IkRDLlR5cGUiIGNvbnRlbnQ9ImNvbmNlcHQiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iUHJvY2VzcyIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0icHJvY2Vzc2F1dGhvcmluZ292ZXJ2aWV3Lmh0bWwjcHJvY2Vzc2F1dGhvcmluZ292ZXJ2aWV3IiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJjcmVhdGVhZGVsaXZlcnlwcm9jZXNzLmh0bWwjY3JlYXRlYWRlbGl2ZXJ5cHJvY2VzcyIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iY3JlYXRlYXJldXNhYmxlY2FwYWJpbGl0eXBhdHRlcm4uaHRtbCNjcmVhdGVhcmV1c2FibGVjYXBhYmlsaXR5cGF0dGVybiIgLz4KLTxtZXRhIG5hbWU9IkRDLkZvcm1hdCIgY29udGVudD0iWEhUTUwiIC8+Ci08bWV0YSBuYW1lPSJEQy5JZGVudGlmaWVyIiBjb250ZW50PSJwcm9jZXNzIiAvPgotPG1ldGEgbmFtZT0iREMuTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIiAvPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuL2libWRpdGEuY3NzIiAvPgotPHRpdGxlPlByb2Nlc3M8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InByb2Nlc3MiPjxhIG5hbWU9InByb2Nlc3MiPjwhLS0gLS0+PC9hPgotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5Qcm9jZXNzPC9oMT4KLTxkaXY+PGRpdiBjbGFzcz0ic2VjdGlvbiI+PHA+QSA8c3BhbiBjbGFzcz0ia2V5d29yZCI+cHJvY2Vzczwvc3Bhbj4gZGVzY3JpYmVzIGhvdyBhIHBhcnRpY3VsYXIgcGllY2UKLW9mIHdvcmsgc2hvdWxkIGJlIGRvbmUuIFRoZSB3b3JrIG1heSBoYXZlIGEgcmVsYXRpdmVseSBzbWFsbCBzY29wZSwgaW4gd2hpY2gKLWNhc2UgaXQgY2FuIGJlIGRlc2NyaWJlZCBhcyBhIGNhcGFiaWxpdHkgcGF0dGVybiwgb3IgbWF5IGFkZHJlc3MgYSBmdWxsIHByb2plY3QKLWxpZmVjeWNsZSwgaW4gd2hpY2ggY2FzZSBpdCBjYW4gYmUgZGVzY3JpYmVkIGFzIGEgZGVsaXZlcnkgcHJvY2Vzcy4gQSBwcm9jZXNzCi1jYW4gcmV1c2UgbWV0aG9kIGVsZW1lbnRzIGFuZCBjb21iaW5lcyB0aGVtIGludG8gYSBzdHJ1Y3R1cmUgYW5kIHNlcXVlbmNlCi1mb3IgY2Fycnlpbmcgb3V0IHdvcmsuPC9wPgotPHA+VGhlcmUgYXJlIHR3byBtYWluIHR5cGVzIG9mIHByb2Nlc3MsIGEgPGEgaHJlZj0iY2FwYWJpbGl0eXBhdHRlcm4uaHRtbCNjYXBhYmlsaXR5cGF0dGVybiI+Q2FwYWJpbGl0eSBQYXR0ZXJuPC9hPiBhbmQKLWEgPGEgaHJlZj0iZGVsaXZlcnlwcm9jZXNzLmh0bWwjZGVsaXZlcnlwcm9jZXNzIj5EZWxpdmVyeSBQcm9jZXNzPC9hPi4KLUEgY2FwYWJpbGl0eSBwYXR0ZXJuIGlzIGEgc3BlY2lhbCBwcm9jZXNzIHRoYXQgZGVzY3JpYmVzIGEgcmV1c2FibGUgY2x1c3Rlcgotb2YgYWN0aXZpdGllcyBpbiBjb21tb24gcHJvY2VzcyBhcmVhcywgd2hpbGUgYSBkZWxpdmVyeSBwcm9jZXNzIGRlc2NyaWJlcwotYSBjb21wbGV0ZSBhbmQgaW50ZWdyYXRlZCBhcHByb2FjaCBmb3IgcGVyZm9ybWluZyBhIHNwZWNpZmljIHR5cGUgb2YgcHJvamVjdC48L3A+Ci08cD5FYWNoCi10aW1lIGEgdGFzayBpcyBpbmNsdWRlZCBpbiBhIHByb2Nlc3MsIGEgcmVmZXJlbmNlIG9iamVjdCB0byB0aGF0IHRhc2sgaXMgY3JlYXRlZAotaW4gdGhlIGNvbnRleHQgb2YgdGhlIHByb2Nlc3MuIFRoaXMgaXMgY2FsbGVkIGEgdGFzayBkZXNjcmlwdG9yLiBUaGUgc2FtZQotdGFzayBjYW4gYmUgcmVmZXJlbmNlZCBhbnkgbnVtYmVyIG9mIHRpbWVzIGluIHRoZSBzYW1lIHByb2Nlc3MuIEluIG90aGVyIHdvcmRzLAotb25lIHRhc2sgY2FuIGhhdmUgbWFueSB0YXNrIGRlc2NyaXB0b3JzLiBBIHRhc2sgZGVzY3JpcHRvciBjYW4gYWxzbyBtb2RpZnkKLXRoZSBiYXNlIHRhc2sgd2l0aG91dCBhY3R1YWxseSBjaGFuZ2luZyB0aGUgdGFzay4gRm9yIGV4YW1wbGUsIHJvbGVzIGFuZCB3b3JrCi1wcm9kdWN0cyBjYW4gYmUgYWRkZWQgb3Igc3VwcHJlc3NlZCwgYW5kIHN0ZXBzIGNhbiBiZSBzdXBwcmVzc2VkIG9yIHJlLXNlcXVlbmNlZC48L3A+Ci08cD5Sb2xlcwotYW5kIHdvcmsgcHJvZHVjdHMgY2FuIGFsc28gYmUgaW5jbHVkZWQgaW4gcHJvY2Vzc2VzIGFzIHJvbGUgZGVzY3JpcHRvcnMgYW5kCi13b3JrIHByb2R1Y3QgZGVzY3JpcHRvcnMuIFJvbGVzIGFuZCB3b3JrIHByb2R1Y3RzIGNhbiBiZSBjdXN0b21pemVkIHRvIGZpdAotd2l0aCB0aGUgY29udGVudCBvZiB0aGUgcHJvY2VzcyBpbiB3aGljaCB0aGV5IGFyZSB1c2VkLjwvcD4KLTwvZGl2PgotPC9kaXY+Ci08ZGl2PjxkaXYgY2xhc3M9InJlbGNvbmNlcHRzIj48c3Ryb25nPlJlbGF0ZWQgY29uY2VwdHM8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0icHJvY2Vzc2F1dGhvcmluZ292ZXJ2aWV3Lmh0bWwjcHJvY2Vzc2F1dGhvcmluZ292ZXJ2aWV3Ij5Qcm9jZXNzIEF1dGhvcmluZyBPdmVydmlldzwvYT48L2Rpdj4KLTwvZGl2PgotPGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJjcmVhdGVhZGVsaXZlcnlwcm9jZXNzLmh0bWwjY3JlYXRlYWRlbGl2ZXJ5cHJvY2VzcyI+Q3JlYXRlIGEgRGVsaXZlcnkgUHJvY2VzczwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iY3JlYXRlYXJldXNhYmxlY2FwYWJpbGl0eXBhdHRlcm4uaHRtbCNjcmVhdGVhcmV1c2FibGVjYXBhYmlsaXR5cGF0dGVybiI+Q3JlYXRlIGEgUmV1c2FibGUgQ2FwYWJpbGl0eSBQYXR0ZXJuPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3Byb2Nlc3NhdXRob3JpbmdvdmVydmlldy5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvcHJvY2Vzc2F1dGhvcmluZ292ZXJ2aWV3Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1Y2NiNGIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvcHJvY2Vzc2F1dGhvcmluZ292ZXJ2aWV3Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJzZWN1cml0eSIgY29udGVudD0icHVibGljIiAvPgotPG1ldGEgbmFtZT0iUm9ib3RzIiBjb250ZW50PSJpbmRleCxmb2xsb3ciIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIG5hbWU9IkRDLlR5cGUiIGNvbnRlbnQ9ImNvbmNlcHQiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iUHJvY2VzcyBBdXRob3JpbmcgT3ZlcnZpZXciIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9InByb2Nlc3MuaHRtbCNwcm9jZXNzIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJjcmVhdGVhcmV1c2FibGVjYXBhYmlsaXR5cGF0dGVybi5odG1sI2NyZWF0ZWFyZXVzYWJsZWNhcGFiaWxpdHlwYXR0ZXJuIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJjcmVhdGVhZGVsaXZlcnlwcm9jZXNzLmh0bWwjY3JlYXRlYWRlbGl2ZXJ5cHJvY2VzcyIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0icHJvY2Vzcy5odG1sIiAvPgotPG1ldGEgbmFtZT0iREMuRm9ybWF0IiBjb250ZW50PSJYSFRNTCIgLz4KLTxtZXRhIG5hbWU9IkRDLklkZW50aWZpZXIiIGNvbnRlbnQ9InByb2Nlc3NhdXRob3JpbmdvdmVydmlldyIgLz4KLTxtZXRhIG5hbWU9IkRDLkxhbmd1YWdlIiBjb250ZW50PSJlbi11cyIgLz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi9pYm1kaXRhLmNzcyIgLz4KLTx0aXRsZT5Qcm9jZXNzIEF1dGhvcmluZyBPdmVydmlldzwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0icHJvY2Vzc2F1dGhvcmluZ292ZXJ2aWV3Ij48YSBuYW1lPSJwcm9jZXNzYXV0aG9yaW5nb3ZlcnZpZXciPjwhLS0gLS0+PC9hPgotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5Qcm9jZXNzIEF1dGhvcmluZyBPdmVydmlldzwvaDE+Ci08ZGl2PjxwPkEgZGV2ZWxvcG1lbnQgcHJvY2VzcyBkZWZpbmVzIHNlcXVlbmNlcyBvZiB0YXNrcyBwZXJmb3JtZWQgYnkgcm9sZXMgYW5kCi13b3JrIHByb2R1Y3RzIHByb2R1Y2VkIG92ZXIgdGltZS4gPC9wPgotPHA+PGltZyBzcmM9InByb2NhdXRoLmdpZiIgYWx0PSIiIC8+PC9wPgotPHA+UHJvY2Vzc2VzIGFyZSB0eXBpY2FsbHkgZXhwcmVzc2VkIGFzIHdvcmtmbG93cyBvciBicmVha2Rvd24KLXN0cnVjdHVyZXMuIERlZmluaW5nIGEgc3RyaWN0IHNlcXVlbmNlIGFzIGluIGEgd2F0ZXJmYWxsIG1vZGVsIGlzIGFzIG11Y2gKLWEgcHJvY2VzcyBhcyBkZWZpbmluZyBzZW1pLW9yZGVyZWQgc2VxdWVuY2VzIGluIGl0ZXJhdGlvbnMgb2YgcGFyYWxsZWwgd29yay4KLVRoZXkganVzdCByZXByZXNlbnQgZGlmZmVyZW50IGRldmVsb3BtZW50IGFwcHJvYWNoZXMuIEhlbmNlLCBmb3IgZGVmaW5pbmcKLWEgcHJvY2Vzcywgb25lIGNhbiB0YWtlIG1ldGhvZCBjb250ZW50IGFuZCBjb21iaW5lIGl0IGludG8gc3RydWN0dXJlcyB0aGF0Ci1zcGVjaWZ5IGhvdyB0aGUgd29yayBzaGFsbCBiZSBvcmdhbml6ZWQgb3ZlciB0aW1lLCB0byBtZWV0IHRoZSBuZWVkcyBvZiBhCi1wYXJ0aWN1bGFyIHR5cGUgb2YgZGV2ZWxvcG1lbnQgcHJvamVjdCAoc3VjaCBhcyBzb2Z0d2FyZSBmb3IgYSBvbmxpbmUgc3lzdGVtCi12ZXJzdXMgc29mdHdhcmUgYW5kIGhhcmR3YXJlIGZvciBhbiBlbWJlZGRlZCBzeXN0ZW0pLiBFUEYgQ29tcG9zZXIgc3VwcG9ydHMgcHJvY2Vzc2VzCi1iYXNlZCBvbiBkaWZmZXJlbnQgZGV2ZWxvcG1lbnQgYXBwcm9hY2hlcyBhY3Jvc3MgbWFueSBkaWZmZXJlbnQgbGlmZWN5Y2xlCi1tb2RlbHMsIGluY2x1ZGluZyB3YXRlcmZhbGwsIGluY3JlbWVudGFsLCBhbmQgaXRlcmF0aXZlIGxpZmVjeWNsZXMuIEVQRiBDb21wb3NlciBhbHNvCi1zdXBwb3J0cyBkaWZmZXJlbnQgcHJlc2VudGF0aW9ucyBmb3IgcHJvY2Vzcywgc3VjaCBhcyB3b3JrLWJyZWFrZG93biBzdHJ1Y3R1cmUKLW9yIHdvcmtmbG93IHByZXNlbnRhdGlvbnMuIFlvdSBjYW4gYWxzbyBkZWZpbmUgcHJvY2Vzc2VzIGluIEVQRiBDb21wb3NlciB0aGF0IHVzZSBhCi1taW5pbWFsIHNldCBvZiBtZXRob2QgY29udGVudCB0byBkZWZpbmUgcHJvY2Vzc2VzIGZvciBhZ2lsZSwgc2VsZi1vcmdhbml6aW5nCi10ZWFtcy48L3A+Ci08cD5UaGUgRVBGIENvbXBvc2VyIHNjcmVlbiBjYXB0dXJlIGFib3ZlIHNob3dzIGFuIGV4YW1wbGUgb2YgYSBwcm9jZXNzIHByZXNlbnRlZCBhcwotYSBicmVha2Rvd24gc3RydWN0dXJlIG9mIG5lc3RlZCBhY3Rpdml0aWVzIGFzIHdlbGwgYXMgYSB3b3JrZmxvdyBvciBhY3Rpdml0eQotZGlhZ3JhbSBmb3Igb25lIHBhcnRpY3VsYXIgYWN0aXZpdHksIHRoZSBpbmNlcHRpb24gcGhhc2UuIEl0IGFsc28gaW5kaWNhdGVzCi13aXRoIHRoZSB0d28gYmx1ZSBhcnJvd3MgdGhhdCB0aGUgcGFydGljdWxhciBtZXRob2QgY29udGVudCB0YXNrICJEZXRhaWwgYQotVXNlIENhc2UiIGhhcyBiZWVuIGFwcGxpZWQgaW4gdGhlIHByb2Nlc3MgdHdpY2U7IGZpcnN0bHkgaW4gdGhlIGluY2VwdGlvbgotcGhhc2UgdW5kZXIgdGhlIGFjdGl2aXR5ICJEZWZpbmUgdGhlIFN5c3RlbSwiIGFuZCBzZWNvbmRseSwgaW4gdGhlIGVsYWJvcmF0aW9uCi1waGFzZSBpbiB0aGUgYWN0aXZpdHkgIlJlZmluZSB0aGUgc3lzdGVtIGRlZmluaXRpb24iLiBZb3Ugc2VlIGJlbG93IGVhY2ggb2YKLXRoZXNlIHRhc2sgYXBwbGljYXRpb25zLCByZWZlcnJlZCB0byBhcyBhIHRhc2sgZGVzY3JpcHRvcnMgaW4gRVBGIENvbXBvc2VyLCBsaXN0cyBvZgotdGhlIHBlcmZvcm1pbmcgcm9sZXMgYXMgd2VsbCBhcyB0aGUgaW5wdXQgYW5kIG91dHB1dCB3b3JrIHByb2R1Y3RzLiBJZiB5b3UKLWxvb2sgY2xvc2VseSwgeW91IHNlZSB0aGF0IHRoZXNlIGxpc3RzIGFyZSBkaWZmZXJlbnQgZm9yIGVhY2ggb2YgdGhlc2UgdHdvCi10YXNrIGRlc2NyaXB0b3JzLCBleHByZXNzaW5nIGRpZmZlcmVuY2VzIGluIHBlcmZvcm1pbmcgdGhlICJEZXRhaWwgYSBVc2UgQ2FzZSIKLW1ldGhvZCB0aHJvdWdob3V0IHRoZSBsaWZlY3ljbGUuIFlvdSBzZWUgZGlmZmVyZW50IHJvbGVzIGludm9sdmVkIGFuZCBjaGFuZ2VzCi1pbiB0aGUgbGlzdCBvZiBpbnB1dHMgdG8gYmUgY29uc2lkZXJlZCBhbmQgb3V0cHV0cyB0byBiZSBwcm9kdWNlZCBvciB1cGRhdGVkLgotVGhlc2UgY2hhbmdlcyB3ZXJlIGRlZmluZWQgYnkgdGhlIGF1dGhvciB0aGF0IGNyZWF0ZWQgdGhpcyBwcm9jZXNzIHRvIGV4cHJlc3MKLXRoZSBleGFjdCBmb2N1cyBvZiB0aGUgdGFzayBwZXJmb3JtYW5jZSBmb3IgZWFjaCBvY2N1cnJlbmNlLiBJbiBhZGRpdGlvbiB0bwotdXBkYXRpbmcgdGhlIHJvbGVzLCBpbnB1dCBhbmQgb3V0cHV0IHdvcmsgcHJvZHVjdHMgZm9yIGEgdGFzayBkZXNjcmlwdG9yLAoteW91IGNhbiBhbHNvIHByb3ZpZGUgYWRkaXRpb25hbCB0ZXh0dWFsIGRlc2NyaXB0aW9ucyBhcyB3ZWxsIGFzIGRlZmluZSB0aGUKLWV4YWN0IHN0ZXBzIG9mIHRoZSB0YXNrIHRoYXQgc2hvdWxkIGFuZCBzaG91bGQgbm90IGJlIHBlcmZvcm1lZCBmb3IgdGhpcyBwYXJ0aWN1bGFyCi1vY2N1cnJlbmNlIG9mIHRoZSB0YXNrLiA8L3A+Ci08cD5FUEYgQ29tcG9zZXIgcHJvdmlkZXMgeW91IHdpdGggYSBwcm9jZXNzIGVkaXRvciB0aGF0IHN1cHBvcnRzIGRpZmZlcmVudCBicmVha2Rvd24KLXN0cnVjdHVyZSB2aWV3cyBhcyB3ZWxsIGFzIGdyYXBoaWNhbCBwcm9jZXNzIHByZXNlbnRhdGlvbnMuIEFzIGEgcHJvY2VzcyBhdXRob3IsCi15b3UgdHlwaWNhbGx5IHN0YXJ0IGJ5IGNyZWF0aW5nIGFuIGFjdGl2aXR5IGJyZWFrZG93biwgZGl2aWRpbmcgYW5kIGJyZWFraW5nCi15b3VyIHByb2Nlc3MgZG93biBpbnRvIHBoYXNlcywgaXRlcmF0aW9ucywgYW5kIGhpZ2gtbGV2ZWwgYWN0aXZpdGllcy4gSW5zdGVhZAotb2YgY3JlYXRpbmcgeW91ciBhY3Rpdml0aWVzIGluIHRoZSBicmVha2Rvd24gc3RydWN0dXJlIGVkaXRvciwgeW91IGNhbiBhbHRlcm5hdGl2ZWx5Ci13b3JrIGluIGEgZ3JhcGhpY2FsIGFjdGl2aXR5IGRpYWdyYW0gZWRpdG9yIHRoYXQgYWxsb3dzIHlvdSB0byBncmFwaGljYWxseQotY3JlYXRlIGEgd29ya2Zsb3cgZm9yIHlvdXIgYWN0aXZpdGllcy4gVG8gYXNzaWduIG1ldGhvZCBjb250ZW50IHRvIHlvdXIgcHJvY2VzcywKLXlvdSB0aGVuIGhhdmUgdGhlIGNob2ljZSBvZiB3b3JraW5nIGluIGRpZmZlcmVudCBwcm9jZXNzIHZpZXdzICh3b3JrIGJyZWFrZG93bgotc3RydWN0dXJlLCB3b3JrIHByb2R1Y3QgdXNhZ2UsIG9yIHRlYW0gYWxsb2NhdGlvbiB2aWV3KS4gRWFjaCB2aWV3IHN1cHBvcnRzCi1hIGRpZmZlcmVudCBhcHByb2FjaCBmb3IgY3JlYXRpbmcgYSBwcm9jZXNzLiBZb3UgY2FuIGRlZmluZSB0aGUgd29yayB0byBiZQotZG9uZSwgZGVmaW5lIHRoZSByZXN1bHRzIHRvIGJlIHByb2R1Y2VkLCBvciBkZWZpbmUgcmVzcG9uc2liaWxpdGllcyBmb3IgeW91cgotcm9sZXMuIElmIHJlcXVlc3RlZCwgdGhlIGVkaXRvciB1cGRhdGVzIHRoZSBvdGhlciBwcm9jZXNzIHZpZXdzIHNlbWktYXV0b21hdGljYWxseQotdXNpbmcgd2l6YXJkcyB0aGF0IHByb21wdCB5b3UgZm9yIGRlY2lzaW9ucyBvbiBzZWxlY3RpbmcgbWV0aG9kIGNvbnRlbnQgZWxlbWVudHMuIDwvcD4KLTwvZGl2PgotPGRpdj4KLTx1bCBjbGFzcz0idWxsaW5rcyI+Ci08bGkgY2xhc3M9InVsY2hpbGRsaW5rIj48c3Ryb25nPjxhIGhyZWY9InByb2Nlc3MuaHRtbCI+UHJvY2VzczwvYT48L3N0cm9uZz48YnIgLz4KLTwvbGk+Ci08L3VsPgotPGRpdiBjbGFzcz0icmVsY29uY2VwdHMiPjxzdHJvbmc+UmVsYXRlZCBjb25jZXB0czwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJwcm9jZXNzLmh0bWwjcHJvY2VzcyI+UHJvY2VzczwvYT48L2Rpdj4KLTwvZGl2PgotPGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJjcmVhdGVhcmV1c2FibGVjYXBhYmlsaXR5cGF0dGVybi5odG1sI2NyZWF0ZWFyZXVzYWJsZWNhcGFiaWxpdHlwYXR0ZXJuIj5DcmVhdGUgYSBSZXVzYWJsZSBDYXBhYmlsaXR5IFBhdHRlcm48L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9ImNyZWF0ZWFkZWxpdmVyeXByb2Nlc3MuaHRtbCNjcmVhdGVhZGVsaXZlcnlwcm9jZXNzIj5DcmVhdGUgYSBEZWxpdmVyeSBQcm9jZXNzPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3Byb2Nlc3NlbGVtZW50cHJvcGVydGllc3ZpZXcuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3Byb2Nlc3NlbGVtZW50cHJvcGVydGllc3ZpZXcuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjExNDJlYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9wcm9jZXNzZWxlbWVudHByb3BlcnRpZXN2aWV3Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMDEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJzZWN1cml0eSIgY29udGVudD0icHVibGljIiAvPgotPG1ldGEgbmFtZT0iUm9ib3RzIiBjb250ZW50PSJpbmRleCxmb2xsb3ciIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIG5hbWU9IkRDLlR5cGUiIGNvbnRlbnQ9ImNvbmNlcHQiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iUHJvY2VzcyBFbGVtZW50IFByb3BlcnRpZXMgVmlldyIgLz4KLTxtZXRhIG5hbWU9IkRDLkZvcm1hdCIgY29udGVudD0iWEhUTUwiIC8+Ci08bWV0YSBuYW1lPSJEQy5JZGVudGlmaWVyIiBjb250ZW50PSJwcm9jZXNzZWxlbWVudHByb3BlcnRpZXN2aWV3IiAvPgotPG1ldGEgbmFtZT0iREMuTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIiAvPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuL2libWRpdGEuY3NzIiAvPgotPHRpdGxlPlByb2Nlc3MgRWxlbWVudCBQcm9wZXJ0aWVzIFZpZXc8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InByb2Nlc3NlbGVtZW50cHJvcGVydGllc3ZpZXciPjxhIG5hbWU9InByb2Nlc3NlbGVtZW50cHJvcGVydGllc3ZpZXciPjwhLS0gLS0+PC9hPgotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5Qcm9jZXNzIEVsZW1lbnQgUHJvcGVydGllcyBWaWV3PC9oMT4KLTxkaXY+PHA+V2hlbiB5b3UgYXJlIGVkaXRpbmcgYSBwcm9jZXNzLCB0aGUgcHJvY2VzcyBlbGVtZW50IHByb3BlcnRpZXMgdmlldyBhbGxvd3MKLXlvdSB0byBlZGl0IGFsbCB0aGUgZGV0YWlscyBmb3IgYSBzaW5nbGUgZWxlbWVudCBpbiB0aGUgcHJvY2Vzcy4gSWYgeW91IGNsaWNrCi1pbiBhbnkgcm93IGluIGEgcHJvY2VzcyBkaXNwbGF5LCB5b3Ugd2lsbCBzZWUgdGhlIGZ1bGwgZGV0YWlscyBvZiB0aGUgcHJvY2VzcwotZWxlbWVudCBpbiB0aGUgcm93IGluIHRoZSBwcm9wZXJ0aWVzIHZpZXcuPC9wPgotPHA+SWYgdGhlIHByb3BlcnRpZXMgdmlldyBpcyBub3Qgb3BlbiwgcmlnaHQgY2xpY2sgYW55IHJvdyBpbiBhIHByb2Nlc3MgYW5kCi1zZWxlY3QgPHN0cm9uZz5TaG93IFByb3BlcnRpZXMgVmlldzwvc3Ryb25nPi48L3A+Ci08cD5UaGUgcHJvcGVydGllcyB2aWV3IGlzIHRoZSBlZGl0b3IgZm9yIGFjdGl2aXRpZXMsIHRhc2sgZGVzY3JpcHRvcnMsIHJvbGVzCi1kZXNjcmlwdG9ycywgYW5kIHdvcmsgcHJvZHVjdCBkZXNjcmlwdG9ycy4gVGhlIGluZm9ybWF0aW9uIGZvcgotYSBkZXNjcmlwdG9yIGlzIHNpbWlsYXIgdG8gdGhlIGNvcnJlc3BvbmRpbmcgbWV0aG9kIGVsZW1lbnQgZWRpdG9yLCBidXQgaXQKLWFsc28gaGFzIGluZm9ybWF0aW9uIHJlbGF0ZWQgdG8gdGhlIGVsZW1lbnQgaW4gdGhlIHByb2Nlc3MuIFRoZSBwcm9jZXNzIGluZm9ybWF0aW9uCi1pcyBhbHNvIGRpc3BsYXllZCBpbiB0aGUgY29ycmVzcG9uZGluZyByb3cgaW4gdGhlIHByb2Nlc3MgZGlzcGxheS48L3A+Ci08cD48c3Ryb25nPkdlbmVyYWwgSW5mb3JtYXRpb24gdGFiOjwvc3Ryb25nPjwvcD4KLTxwPlRoZSBOYW1lIGFuZCBQcmVzZW50YXRpb24gTmFtZSBkZWZhdWx0IHRvIHRoZSBjb3JyZXNwb25kaW5nIG5hbWVzIGluIHRoZQotYmFzZSBtZXRob2QgZWxlbWVudC4gVGhlc2UgbmFtZXMgY2FuIGJlIGNoYW5nZWQgaW4gYSBkZXNjcmlwdG9yLjwvcD4KLTxkaXYgY2xhc3M9InAiPlRoZSBmb2xsb3dpbmcgYXR0cmlidXRlcyBhcmUgdXNlZCB0byBzcGVjaWZ5IGNlcnRhaW4gYXNwZWN0cyBvZiB0aGUgZWxlbWVudAotaW4gdGhlIHByb2Nlc3MgYW5kIGNhbiBiZSBzZXQgZm9yIGFsbCB0eXBlcyBvZiBwcm9jZXNzIGVsZW1lbnRzOjx1bD48bGk+PHN0cm9uZz5PcHRpb25hbDwvc3Ryb25nPjogSWYgdGhpcyBpcyBjaGVja2VkICh0cnVlKSwgaXQgaW5kaWNhdGVzIHRoYXQgdGhlIGVsZW1lbnQKLWlzIGNvbnNpZGVyZWQgb3B0aW9uYWwgaW4gdGhlIHByb2Nlc3MuIFRoaXMgbWVhbnMgdGhhdCBpdCBpcyBzYWZlIHRvIHJlbW92ZQotdGhlIGVsZW1lbnQuIElmIHRoaXMgaXMgbm90IGNoZWNrZWQgKGZhbHNlKSwgdGhlIGVsZW1lbnQgaXMgY29uc2lkZXJlZCBtYW5kYXRvcnkKLWFuZCBzaG91bGQgbm90IGJlIHJlbW92ZWQgZnJvbSB0aGUgcHJvY2Vzcy48L2xpPgotPGxpPjxzdHJvbmc+TXVsdGlwbGUgT2NjdXJyZW5jZXM8L3N0cm9uZz46IElmIHRoaXMgaXMgY2hlY2tlZCAodHJ1ZSksIGl0IGluZGljYXRlcyB0aGF0Ci13aGVuIHRoZSBwcm9jZXNzIGlzIGluc3RhbnRpYXRlZCBhcyBhIHByb2plY3Qgb3Igb3RoZXIgcHJvY2VzcywgaXQgaXMgZXhwZWN0ZWQKLXRoYXQgdGhlcmUgd2lsbCBiZSBtdWx0aXBsZSBvY2N1cnJlbmNlcyBvZiB0aGlzIGVsZW1lbnQuIElmIHRoaXMgaXMgbm90IGNoZWNrZWQKLShmYWxzZSksIGl0IGluZGljYXRlcyB0aGF0IHRoZXJlIHNob3VsZCBvbmx5IGJlIGEgc2luZ2xlIG9jY3VycmVuY2Ugb2YgdGhpcwotZWxlbWVudCB3aGVuIHRoZSBwcm9jZXNzIGlzIGluc3RhbnRpYXRlZC48L2xpPgotPGxpPjxzdHJvbmc+UGxhbm5lZDwvc3Ryb25nPjogSWYgdGhpcyBpcyBjaGVja2VkICh0cnVlKSwgdGhlIGVsZW1lbnQgd2lsbCBiZSBpbmNsdWRlZAotaW4gYW4gZXhwb3J0IHRvIGEgcHJvamVjdCBtYW5hZ2VtZW50IHRvb2wuIElmIHRoaXMgaXMgbm90IGNoZWNrZWQgKGZhbHNlKSwKLWl0IHdpbGwgbm90IGJlIGluY2x1ZGVkIGluIGFuIGV4cG9ydC48L2xpPgotPGxpPjxzdHJvbmc+U3VwcHJlc3NlZDwvc3Ryb25nPjogSWYgdGhpcyBpcyBjaGVja2VkICh0cnVlKSwgdGhlIGVsZW1lbnQgd2lsbCBub3QgYXBwZWFyCi1pbiBhIHB1Ymxpc2hlZCBwcm9jZXNzLiBUaGlzIGlzIHVzdWFsbHkgdXNlZCB0byBtb2RpZnkgYSBjYXBhYmlsaXR5IHBhdHRlcm4KLWluY2x1ZGVkIGluIGEgcHJvY2Vzcy4gVGhpcyBpcyBub3QgY2hlY2tlZCAoZmFsc2UpIGFzIGRlZmF1bHQuPC9saT4KLTwvdWw+Ci08L2Rpdj4KLTxkaXYgY2xhc3M9InAiPlRoZSBmb2xsb3dpbmcgZWxlbWVudHMgY2FuIGJlIHNldCBmb3IgdGFzayBkZXNjcmlwdG9ycyBhbmQgYWN0aXZpdGllczo8dWw+PGxpPjxzdHJvbmc+RXZlbnQgRHJpdmVuPC9zdHJvbmc+OiBJZiB0aGlzIGlzIGNoZWNrZWQgKHRydWUpLCBpdCBpbmRpY2F0ZXMgdGhhdCB0aGUKLXRhc2sgb3IgYWN0aXZpdHkgd2lsbCBiZSBpbml0aWF0ZWQgd2hlbiBhIHBhcnRpY3VsYXIgZXZlbnQgb2NjdXJzLiBJZiB0aGlzCi1pcyBub3QgY2hlY2tlZCAoZmFsc2UpLCBpdCBpbmRpY2F0ZXMgdGhhdCB0aGUgdGFzayBvciBhY3Rpdml0eSB3aWxsIGJlIGluaXRpYXRlZAotYmFzZWQgb24gb3RoZXIgdGFza3MgaW4gdGhlIHByb2Nlc3MuPC9saT4KLTxsaT48c3Ryb25nPk9uZ29pbmc8L3N0cm9uZz46IElmIHRoaXMgaXMgY2hlY2tlZCAodHJ1ZSksIGl0IGluZGljYXRlcyB0aGF0IHRoZSB0YXNrCi1vciBhY3Rpdml0eSBpcyBjb250aW51b3VzLiBJZiB0aGlzIGlzIG5vdCBjaGVja2VkIChmYWxzZSksIGl0IGluZGljYXRlcyB0aGF0Ci10aGUgdGFzayBvciBhY3Rpdml0eSBoYXMgYSBjbGVhciBzdGFydCBhbmQgZmluaXNoIGluIHRoZSBwcm9jZXNzLjwvbGk+Ci08bGk+PHN0cm9uZz5SZXBlYXRhYmxlPC9zdHJvbmc+OiBJZiB0aGlzIGlzIGNoZWNrZWQgKHRydWUpLCBpdCBpbmRpY2F0ZXMgdGhhdCB0aGUgdGFzawotb3IgYWN0aXZpdHkgY2FuIGl0ZXJhdGUgd2hlbiB0aGUgcHJvY2VzcyBpcyBpbnN0YW50aWF0ZWQuIElmIHRoaXMgaXMgbm90IGNoZWNrZWQKLShmYWxzZSksIGl0IGluZGljYXRlcyB0aGF0IHRoZSB0YXNrIG9yIGFjdGl2aXR5IHdpbGwgb25seSBvY2N1ciBvbmNlIGluIHRoZQotcHJvY2Vzcy48L2xpPgotPC91bD4KLTwvZGl2PgotPHA+RGVwZW5kZW5jeSBGaWVsZDogWW91IGNhbiBhZGQgb25lIG9yIG1vcmUgZGVwZW5kZW5jaWVzIGZvciBhIHRhc2sgb3IgYWN0aXZpdHkuCi1DbGljayB0aGUgPHN0cm9uZz5BZGQuLi48L3N0cm9uZz4gYnV0dG9uIGFuZCBlbnRlciB0aGUgaW5kZXggbnVtYmVyIGZvciB0aGUgdGFzayBvcgotYWN0aXZpdHkgb24gd2hpY2ggdGhlIGN1cnJlbnQgZWxlbWVudCBpcyBkZXBlbmRlbnQuIFRoZSBkZXBlbmRlbmN5ICh0eXBlKQotZGVmYXVsdHMgdG8gRmluaXNoLXRvLVN0YXJ0LiBJZiB5b3Ugd2FudCB0byBzZXQgYW5vdGhlciBkZXBlbmRlbmN5IHR5cGUsIGNsaWNrCi10aGUgPHN0cm9uZz5FZGl0PC9zdHJvbmc+IGJ1dHRvbiBhbmQgc2VsZWN0IHRoZSByZXF1aXJlZCBkZXBlbmRlbmN5IHR5cGUgaW4gdGhlIGRlcGVuZGVuY3kKLWRyb3AgZG93biBib3guIFlvdSBjYW4gZW50ZXIgYSBkaWZmZXJlbnQgaW5kZXggbnVtYmVyIG9uIHRoZSBFZGl0IGRpYWxvZy4KLVlvdSBjYW4gYWxzbyByZW1vdmUgYSBkZXBlbmRlbmN5IGJ5IHNlbGVjdGluZyB0aGUgZGVwZW5kZW5jeSBhbmQgY2xpY2tpbmcKLXRoZSA8c3Ryb25nPlJlbW92ZTwvc3Ryb25nPiBidXR0b24uPC9wPgotPHA+VGhlIGJhc2UgbWV0aG9kIGVsZW1lbnQgZm9yIHRoZSBkZXNjcmlwdG9yIGlzIGRpc3BsYXllZCBvbiB0aGUgcGFnZS4gWW91Ci1jYW4gc2VsZWN0IGEgZGlmZmVyZW50IGVsZW1lbnQgYnkgY2xpY2tpbmcgdGhlIDxzdHJvbmc+TGluayBNZXRob2QgRWxlbWVudDwvc3Ryb25nPiBidXR0b24KLWFuZCBzZWxlY3RpbmcgdGhlIHJlcXVpcmVkIGVsZW1lbnQuPC9wPgotPHA+PHN0cm9uZz5Eb2N1bWVudGF0aW9uIHRhYjo8L3N0cm9uZz48L3A+Ci08cD5UaGUgZG9jdW1lbnRhdGlvbiB0YWIgY29udGFpbnMgZGVzY3JpcHRpdmUgYXR0cmlidXRlcyBmb3IgdGhlIGRlc2NyaXB0b3IKLW9yIGFjdGl2aXR5LjwvcD4KLTxwPjxzdHJvbmc+Um9sbC1VcCB0YWJzOjwvc3Ryb25nPjwvcD4KLTxwPlRoZSBwcm9wZXJ0aWVzIHZpZXcgZm9yIGFuIGFjdGl2aXR5IGluY2x1ZGVzIHJvbGwtdXAgdGFicyB0aGF0IHByb3ZpZGUKLWxpc3RzIG9mIHRhc2tzLCByb2xlcywgb3Igd29yayBwcm9kdWN0cyAicm9sbGVkIHVwIiwgb3Igc3VtbWFyaXplZCwgZm9yIHRoZQotYWN0aXZpdHkuPC9wPgotPHA+PHN0cm9uZz5Bc3NvY2lhdGlvbiB0YWJzOjwvc3Ryb25nPjwvcD4KLTxwPlRoZSByZW1haW5pbmcgdGFicyBhcmUgdXNlZCB0byBhZGQgb3IgcmVtb3ZlIGFzc29jaWF0aW9ucyBiZXR3ZWVuIHRoZSBhY3Rpdml0eQotb3IgZGVzY3JpcHRvciB0byBtZXRob2QgZWxlbWVudHMuPC9wPgotPC9kaXY+Ci08ZGl2PjwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvcHViLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3B1Yi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3MjU0NzQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvcHViLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3B1Ymxpc2hpbmdhbWV0aG9kY29uZmlndXJhdGlvbnRvYW1ldGhvZHdlYi5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvcHVibGlzaGluZ2FtZXRob2Rjb25maWd1cmF0aW9udG9hbWV0aG9kd2ViLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmMjlhNWEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvcHVibGlzaGluZ2FtZXRob2Rjb25maWd1cmF0aW9udG9hbWV0aG9kd2ViLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGh0bWwKLSAgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9InNlY3VyaXR5IiBjb250ZW50PSJwdWJsaWMiIC8+Ci08bWV0YSBuYW1lPSJSb2JvdHMiIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgbmFtZT0iREMuVHlwZSIgY29udGVudD0idGFzayIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJQdWJsaXNoaW5nIGEgTWV0aG9kIENvbmZpZ3VyYXRpb24gdG8gYSBNZXRob2QgV2ViIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJwdWJsaXNoaW5nb3ZlcnZpZXcuaHRtbCNwdWJsaXNoaW5nb3ZlcnZpZXciIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9ImV4cG9ydGFwcm9jZXNzb3JtZXRob2Rjb250ZW50dG9hcGxhbm5pbmd0b29sLmh0bWwiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9Im1ldGhvZGNvbmZpZ3VyYXRpb25zLmh0bWwjbWV0aG9kY29uZmlndXJhdGlvbnMiIC8+Ci08bWV0YSBuYW1lPSJEQy5Gb3JtYXQiIGNvbnRlbnQ9IlhIVE1MIiAvPgotPG1ldGEgbmFtZT0iREMuSWRlbnRpZmllciIgY29udGVudD0icHVibGlzaGluZ2FtZXRob2Rjb25maWd1cmF0aW9udG9hbWV0aG9kd2ViIiAvPgotPG1ldGEgbmFtZT0iREMuTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIiAvPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuL2libWRpdGEuY3NzIiAvPgotPHRpdGxlPlB1Ymxpc2hpbmcgYSBNZXRob2QgQ29uZmlndXJhdGlvbiB0byBhIE1ldGhvZCBXZWI8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InB1Ymxpc2hpbmdhbWV0aG9kY29uZmlndXJhdGlvbnRvYW1ldGhvZHdlYiI+PGEgbmFtZT0icHVibGlzaGluZ2FtZXRob2Rjb25maWd1cmF0aW9udG9hbWV0aG9kd2ViIj48IS0tIC0tPjwvYT4KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+UHVibGlzaGluZyBhIE1ldGhvZCBDb25maWd1cmF0aW9uIHRvIGEgTWV0aG9kIFdlYjwvaDE+Ci08ZGl2PjxkaXYgY2xhc3M9InAiPlVzaW5nIHRoZSBQdWJsaXNoIE1ldGhvZCBDb25maWd1cmF0aW9uIHdpemFyZCwgeW91IGNhbiBzZWxlY3QgZnJvbQotYSBzZXJpZXMgb2YgcHVibGljYXRpb24gb3B0aW9ucyB0byB0dXJuIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24gaW50byBhIHB1Ymxpc2hlZAotbWV0aG9kIFdlYi48L2Rpdj4KLTxkaXYgY2xhc3M9InNlY3Rpb24iPlRvIHB1Ymxpc2ggYSBtZXRob2QgY29uZmlndXJhdGlvbjo8L2Rpdj4KLTxvbD48bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkZyb20gdGhlIHRvb2xiYXIsIHNlbGVjdCA8c3Ryb25nPkNvbmZpZ3VyYXRpb24gJmd0OyBQdWJsaXNoPC9zdHJvbmc+LiBUaGUgUHVibGlzaAotTWV0aG9kIENvbmZpZ3VyYXRpb24gd2l6YXJkIGFwcGVhcnMuPC9zcGFuPjwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPk9uIHRoZSBTZWxlY3QgQ29uZmlndXJhdGlvbiBwYWdlLCBzZWxlY3QgdGhlIGNvbmZpZ3VyYXRpb24geW91Ci13YW50IHRvIHB1Ymxpc2ggZnJvbSB0aGUgbGlzdCBvZiBtZXRob2QgY29uZmlndXJhdGlvbnMgaW4gdGhlIGxpYnJhcnkgYW5kCi10aGVuIGNsaWNrIDxzdHJvbmc+TmV4dDwvc3Ryb25nPi48L3NwYW4+PC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+T24gdGhlIFNwZWNpZnkgUHVibGlzaGluZyBPcHRpb25zIHBhZ2U6PC9zcGFuPjx1bD48bGk+UHJvdmlkZSBhIGRlc3RpbmF0aW9uIGRpcmVjdG9yeSBmb3IgdGhlIHB1Ymxpc2hlZCBXZWIgc2l0ZSBpbiB0aGUKLVB1YmxpY2F0aW9uIHBhdGggZmllbGQuPC9saT4KLTxsaT5Qcm92aWRlIGEgdGl0bGUgZm9yIHRoZSBwdWJsaXNoZWQgbWV0aG9kIHdlYi48L2xpPgotPGxpPlNlbGVjdCBhIGJhbm5lciBpbWFnZSB0byB1c2UuPC9saT4KLTxsaT5TZWxlY3QgYSBmaWxlIHRvIHVzZSBmb3IgdGhlICJhYm91dCIgaW5mb3JtYXRpb24uPC9saT4KLTxsaT5Qcm92aWRlIGEgZmVlZGJhY2sgVVJMPC9saT4KLTxsaT5DaG9vc2UgdG8gaW5jbHVkZSBhIGdsb3NzYXJ5LCBpbmRleCwgc2VhcmNoIGNhcGFiaWxpdHkgYW5kL29yIHByb2Nlc3MKLXRyZWUgY3VzdG9taXphdGlvbi48L2xpPgotPGxpPkNob29zZSB0byBjaGVjayB0aGF0IGV4dGVybmFsIGh5cGVybGlua3MgYXJlIHZhbGlkLjwvbGk+Ci08bGk+Q2hvb3NlIHRvIHB1Ymxpc2ggYWN0aXZpdHkgZGlhZ3JhbXMgdGhhdCBoYXZlIG5vdCBiZWVuIGVkaXRlZCwgc3VjaAotYXMgYWN0aXZpdHkgZGlhZ3JhbXMgdGhhdCBoYXZlIGJlZW4gZ2VuZXJhdGVkIGJ5IHRoZSB0b29sLCBidXQgbm90IG1hbnVhbGx5Ci1lZGl0ZWQuPC9saT4KLTwvdWw+Ci0gPGRpdiBjbGFzcz0ibm90ZSI+PHNwYW4gY2xhc3M9Im5vdGV0aXRsZSI+Tm90ZTo8L3NwYW4+IENob29zaW5nIHRvIGluY2x1ZGUgZWl0aGVyIHRoZSBzZWFyY2ggY2FwYWJpbGl0eSBvciB0byBzdXBwb3J0Ci1jdXN0b21pemF0aW9uIG9mIHRoZSBwcm9jZXNzIHZpZXcgd2lsbCBpbmNsdWRlIHRoZSBicm93c2VyIGFwcGxldCBpbiB0aGUgcHVibGlzaGVkCi1XZWIgc2l0ZS4gSWYgeW91IGNob29zZSBub3QgdG8gcHVibGlzaCB3aXRoIHRoZSBsYXN0IHR3byBvcHRpb25zLCB0aGUgYnJvd3NlcgotYXBwbGV0IHdpbGwgbm90IGJlIGluY2x1ZGVkLjwvZGl2PgotPC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+Q2xpY2sgPHN0cm9uZz5GaW5pc2g8L3N0cm9uZz4uIFB1Ymxpc2hpbmcgaXMgaW5pdGlhdGVkLjwvc3Bhbj48L2xpPgotPC9vbD4KLTwvZGl2PgotPGRpdj48ZGl2IGNsYXNzPSJyZWxjb25jZXB0cyI+PHN0cm9uZz5SZWxhdGVkIGNvbmNlcHRzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9InB1Ymxpc2hpbmdvdmVydmlldy5odG1sI3B1Ymxpc2hpbmdvdmVydmlldyI+UHVibGlzaGluZyBPdmVydmlldzwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0ibWV0aG9kY29uZmlndXJhdGlvbnMuaHRtbCNtZXRob2Rjb25maWd1cmF0aW9ucyI+TWV0aG9kIENvbmZpZ3VyYXRpb248L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvcHVibGlzaGluZ292ZXJ2aWV3Lmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9wdWJsaXNoaW5nb3ZlcnZpZXcuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTM5ODBlMS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9wdWJsaXNoaW5nb3ZlcnZpZXcuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgaHRtbAotICBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0ic2VjdXJpdHkiIGNvbnRlbnQ9InB1YmxpYyIgLz4KLTxtZXRhIG5hbWU9IlJvYm90cyIgY29udGVudD0iaW5kZXgsZm9sbG93IiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBuYW1lPSJEQy5UeXBlIiBjb250ZW50PSJjb25jZXB0IiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IlB1Ymxpc2hpbmcgT3ZlcnZpZXciIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9ImNyZWF0ZWFtZXRob2R2aWV3d2l0aGN1c3RvbWNhdGVnb3JpZXMuaHRtbCNjcmVhdGVhbWV0aG9kdmlld3dpdGhjdXN0b21jYXRlZ29yaWVzIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJwdWJsaXNoaW5nYW1ldGhvZGNvbmZpZ3VyYXRpb250b2FtZXRob2R3ZWIuaHRtbCNwdWJsaXNoaW5nYW1ldGhvZGNvbmZpZ3VyYXRpb250b2FtZXRob2R3ZWIiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9ImV4cG9ydGFwcm9jZXNzb3JtZXRob2Rjb250ZW50dG9hcGxhbm5pbmd0b29sLmh0bWwjZXhwb3J0YXByb2Nlc3Nvcm1ldGhvZGNvbnRlbnR0b2FwbGFubmluZ3Rvb2wiIC8+Ci08bWV0YSBuYW1lPSJEQy5Gb3JtYXQiIGNvbnRlbnQ9IlhIVE1MIiAvPgotPG1ldGEgbmFtZT0iREMuSWRlbnRpZmllciIgY29udGVudD0icHVibGlzaGluZ292ZXJ2aWV3IiAvPgotPG1ldGEgbmFtZT0iREMuTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIiAvPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuL2libWRpdGEuY3NzIiAvPgotPHRpdGxlPlB1Ymxpc2hpbmcgT3ZlcnZpZXc8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InB1Ymxpc2hpbmdvdmVydmlldyI+PGEgbmFtZT0icHVibGlzaGluZ292ZXJ2aWV3Ij48IS0tIC0tPjwvYT4KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+UHVibGlzaGluZyBPdmVydmlldzwvaDE+Ci08ZGl2PjxwPlRoZSB1bHRpbWF0ZSBvdXRwdXQgb2YgRVBGIENvbXBvc2VyIGlzIGEgcHVibGlzaGVkIFdlYiBzaXRlIHdpdGggbWV0aG9kCi1ndWlkYW5jZSBhbmQgcHJvY2Vzc2VzIHRoYXQgY2FuIGJlIHVzZWQgYnkgYSBwcm9qZWN0IHRlYW0uIFRoZSBpbmZvcm1hdGlvbgotY29udGFpbmVkIGluIHRoZSBXZWIgc2l0ZSBwcm92aWRlcyBhIHByb2plY3QgdGVhbSB3aXRoIGEgY29uc2lzdGVudCBtZXRob2QKLWZvciB0aGUgZW50aXJlIHRlYW0gdG8gZm9sbG93IGFuZCBhIGNvbXBsZXRlIGRlc2NyaXB0aW9uIG9mIHRoZSBlbmQtdG8tZW5kCi13b3JrIGxpZmVjeWNsZS4gPC9wPgotPHA+SXQgaXMgZWFzeSB0byBjb25maWd1cmUgYSBwcm9jZXNzIGZvciBhIHBhcnRpY3VsYXIgdHlwZSBvciBzaXplIG9mIHByb2plY3QKLWFuZCB0byBwdWJsaXNoIHRoZSBndWlkYW5jZSB0byBhIFdlYiBzaXRlLiBBIE1ldGhvZCBDb25maWd1cmF0aW9uIGlzIGEgc2VsZWN0aW9uCi1vZiBDb250ZW50IFBhY2thZ2VzIGFjcm9zcyBkaWZmZXJlbnQgTWV0aG9kIFBsdWctaW5zIGNvbnRhaW5pbmcgdGhlIG1ldGhvZAotYW5kIHByb2Nlc3MgY29udGVudCB0aGF0IHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlIHB1Ymxpc2hlZCBXZWIgc2l0ZS4gQXQgcHVibGlzaGluZwotdGltZSwgdGhlIGNvbmZpZ3VyYXRpb24gaXMgY29tYmluZWQgd2l0aCBkaWZmZXJlbnQgTWV0aG9kIFZpZXdzIHdoaWNoIGRlZmluZQotdGhlIFdlYiBzaXRlJ3MgbmF2aWdhdGlvbiBzdHJ1Y3R1cmVzIGFuZCBjb250ZW50IG9yZ2FuaXphdGlvbi48L3A+Ci08cD5UaGUgQnJvd3NpbmcgUGVyc3BlY3RpdmUgcmVuZGVycyB0aGUgTWV0aG9kIENvbmZpZ3VyYXRpb24gY29udGVudCBpbiBIVE1MCi1mb3JtYXQgd2l0aGluIHRoZSB0b29sLCBwcm92aWRpbmcgYSBuYXZpZ2FibGUgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1ldGhvZAotb3IgcHJvY2VzcyBjb250ZW50IGFzc29jaWF0ZWQgd2l0aCB0aGUgY29uZmlndXJhdGlvbi48L3A+Ci08L2Rpdj4KLTxkaXY+PGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJjcmVhdGVhbWV0aG9kdmlld3dpdGhjdXN0b21jYXRlZ29yaWVzLmh0bWwjY3JlYXRlYW1ldGhvZHZpZXd3aXRoY3VzdG9tY2F0ZWdvcmllcyI+Q3JlYXRlIGEgTWV0aG9kIFZpZXcgd2l0aCBDdXN0b20gQ2F0ZWdvcmllczwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0icHVibGlzaGluZ2FtZXRob2Rjb25maWd1cmF0aW9udG9hbWV0aG9kd2ViLmh0bWwjcHVibGlzaGluZ2FtZXRob2Rjb25maWd1cmF0aW9udG9hbWV0aG9kd2ViIj5QdWJsaXNoaW5nIGEgTWV0aG9kIENvbmZpZ3VyYXRpb24gdG8gYSBNZXRob2QgV2ViPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3JlcGxhY2UuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3JlcGxhY2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2NlZTJmMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9yZXBsYWNlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGh0bWwKLSAgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9InNlY3VyaXR5IiBjb250ZW50PSJwdWJsaWMiIC8+Ci08bWV0YSBuYW1lPSJSb2JvdHMiIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgbmFtZT0iREMuVHlwZSIgY29udGVudD0iY29uY2VwdCIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJSZXBsYWNlcyIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0idmFyaWFiaWxpdHkuaHRtbCN2YXJpYWJpbGl0eSIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iZXh0ZW5kcy5odG1sI2V4dGVuZHMiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9ImNvbnRyaWJ1dGVzLmh0bWwjY29udHJpYnV0ZXMiIC8+Ci08bWV0YSBuYW1lPSJEQy5Gb3JtYXQiIGNvbnRlbnQ9IlhIVE1MIiAvPgotPG1ldGEgbmFtZT0iREMuSWRlbnRpZmllciIgY29udGVudD0icmVwbGFjZXMiIC8+Ci08bWV0YSBuYW1lPSJEQy5MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiIC8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4vaWJtZGl0YS5jc3MiIC8+Ci08dGl0bGU+UmVwbGFjZXM8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InJlcGxhY2VzIj48YSBuYW1lPSJyZXBsYWNlcyI+PCEtLSAtLT48L2E+Ci0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPlJlcGxhY2VzPC9oMT4KLTxkaXY+PHA+QSByZXBsYWNpbmcgZWxlbWVudCByZXBsYWNlcyBwYXJ0cyBvZiB0aGUgYmFzZSBlbGVtZW50LiBSZXBsYWNlcyBwcm92aWRlcwotYSB3YXkgZm9yIGFuIGVsZW1lbnQgdG8gcmVwbGFjZSBhIGJhc2UgZWxlbWVudCB3aXRob3V0IGRpcmVjdGx5IGNoYW5naW5nIGFueQotb2YgdGhlIGJhc2UgZWxlbWVudCdzIGV4aXN0aW5nIHByb3BlcnRpZXMuIFRoaXMgaXMsIGluIG1vc3QgY2FzZXMsIHVzZWQgZm9yCi1tZXRob2QgcGx1Zy1pbnMgdGhhdCBhaW0gdG8gcmVwbGFjZSBzcGVjaWZpYyBjb250ZW50IGVsZW1lbnRzIHN1Y2ggYXMgcm9sZXMsCi10YXNrcywgb3IgYWN0aXZpdGllcyB3aXRoIGVpdGhlciBhIGNvbXBsZXRlbHkgbmV3IHZhcmlhbnQgb3IgdG8gY2hhbmdlIHRoZQotZnVuZGFtZW50YWwgcmVsYXRpb25zaGlwcyBvZiB0aGVzZSBlbGVtZW50cy4gVGhlIGVmZmVjdCBvZiB0aGlzLCBpcyB0aGF0IHRoZQotYmFzZSBjb250ZW50IGVsZW1lbnQgaXMgbG9naWNhbGx5IHJlcGxhY2VkIHdpdGggdGhlIG5ldyByZXBsYWNpbmcgZWxlbWVudAotdG8gd2hpY2ggYWxsIGluY29taW5nIGFzc29jaWF0aW9ucyBzdGlsbCBwb2ludCBhcyBiZWZvcmUsIGJ1dCB3aGljaCBoYXMgcG90ZW50aWFsbHkKLW5ldyBhdHRyaWJ1dGUgdmFsdWVzIGFuZCBvdXRnb2luZyBhc3NvY2lhdGlvbiBwcm9wZXJ0aWVzLjwvcD4KLTxwPlVzZSB0aGUgQ29udGVudCBWYXJpYWJpbGl0eSBzZWN0aW9uIG9uIHRoZSBEZXNjcmlwdGlvbiB0YWIgdG8gbWFrZSBhbiBlbGVtZW50Ci1yZXBsYWNlIGFub3RoZXIgZWxlbWVudC4gU2VsZWN0IDxzdHJvbmc+UmVwbGFjZXM8L3N0cm9uZz4gYXMgdGhlIHZhcmlhYmlsaXR5IHR5cGUgYW5kCi1zZWxlY3QgdGhlIGJhc2UgZWxlbWVudCB0aGF0IHRoaXMgZWxlbWVudCB3aWxsIHJlcGxhY2UuIFRoZSBiYXNlIGVsZW1lbnQgbXVzdAotYmUgdGhlIHNhbWUgdHlwZSBvZiBlbGVtZW50IGFzIHRoZSByZXBsYWNpbmcgZWxlbWVudC48L3A+Ci08cD5XaGVuIHlvdSByZXBsYWNlIGFuIGVsZW1lbnQsIGFsbCB0aGUgZGVzY3JpcHRpb24gYXR0cmlidXRlcyBhcmUgcmVwbGFjZWQKLWJ5IHRoZSByZXBsYWNpbmcgZWxlbWVudC4gSWYgYSBkZXNjcmlwdGlvbiBhdHRyaWJ1dGUgaW4gdGhlIHJlcGxhY2luZyBlbGVtZW50Ci1pcyBibGFuaywgYnV0IHRoZSBiYXNlIGVsZW1lbnQgaGFzIGNvbnRlbnQsIHRoZSBhdHRyaWJ1dGUgd2lsbCBiZSBibGFuayBpbgotdGhlIHJlc3VsdGluZyBlbGVtZW50LjwvcD4KLTxwPlJlcGxhY2UgYWx3YXlzIHJlcGxhY2VzIGF0dHJpYnV0ZXMgYW5kIGFzc29jaWF0aW9ucyBvZiB0aGUgYmFzZSBlbGVtZW50Ci13aXRoIHRoZSByZXBsYWNpbmcgZWxlbWVudCdzIGF0dHJpYnV0ZXMgYW5kIGFzc29jaWF0aW9ucywgZXhjZXB0IGZvciBpbmNvbWluZwotYXNzb2NpYXRpb25zLCB3aGljaCBhcmUgb25seSBhZGRlZCB0byB0aGUgYmFzZSwgYnV0IGRvIG5vdCByZXBsYWNlIHRoZSBiYXNlJ3MKLWluY29taW5nIGFzc29jaWF0aW9ucy48L3A+Ci08ZGl2IGNsYXNzPSJwIj48c3Ryb25nPlJlcGxhY2VzIHJ1bGVzOjwvc3Ryb25nPjx1bD48bGk+QXR0cmlidXRlcyBvZiB0aGUgYmFzZSBlbGVtZW50IGFyZSByZXBsYWNlZCB3aXRoIGF0dHJpYnV0ZXMgb2YgdGhlIHJlcGxhY2luZwotZWxlbWVudCBpbmNsdWRpbmcgaWRlbnRpZmllciBvZiB0aGUgYmFzZSBlbGVtZW50LjwvbGk+Ci08bGk+T3V0Z29pbmcgdG8tb25lIGFuZCB0by1tYW55IGFzc29jaWF0aW9ucyBvZiB0aGUgcmVwbGFjaW5nIGVsZW1lbnQgcmVwbGFjZQotYW55IG91dGdvaW5nIGFzc29jaWF0aW9ucyBvZiB0aGUgYmFzZSBlbGVtZW50LiBJZiB0aGUgY29udHJpYnV0b3IgZG9lcyBub3QKLWhhdmUgYW55IG91dGdvaW5nIGFzc29jaWF0aW9ucywgdGhlbiBuZWl0aGVyIHdpbGwgdGhlIHJlc3VsdGluZyBlbGVtZW50LjwvbGk+Ci08bGk+SW5jb21pbmcgYXNzb2NpYXRpb25zIHdpdGggYSB0by1tYW55IGNvbnN0cmFpbnQgb24gdGhlIG90aGVyIGFzc29jaWF0aW9uCi1lbmQgdG8gdGhlIHJlcGxhY2VkIGVsZW1lbnQgYXJlIHByZXNlcnZlZCBhbmQgYXVnbWVudGVkIHdpdGggaW5jb21pbmcgYXNzb2NpYXRpb25zCi1vZiB0aGUgcmVwbGFjaW5nIGVsZW1lbnQuPC9saT4KLTxsaT5JbmNvbWluZyBhc3NvY2lhdGlvbnMgd2l0aCBhIHRvLW9uZSBjb25zdHJhaW50IG9uIHRoZSBvdGhlciBhc3NvY2lhdGlvbgotZW5kIHRvIHRoZSByZXBsYWNlZCBlbGVtZW50IGFyZSByZXBsYWNlZCB3aXRoIHRoZSByZXNwZWN0aXZlIGluY29taW5nIGFzc29jaWF0aW9uCi1vZiB0aGUgcmVwbGFjaW5nIGVsZW1lbnQuIElmIHRoZSByZXBsYWNpbmcgZWxlbWVudCBkb2VzIG5vdCBoYXZlIHN1Y2ggYW4gYXNzb2NpYXRpb24KLXRoZW4gdGhlIHJlc3VsdGluZyBlbGVtZW50IGtlZXBzIHRoZSBpbmNvbWluZyBhc3NvY2lhdGlvbiBvZiB0aGUgYmFzZSBlbGVtZW50LjwvbGk+Ci08bGk+QSBiYXNlIGVsZW1lbnQgb2YgYSByZXBsYWNlbWVudCBjYW4gaGF2ZSBvbmx5IG9uZSByZXBsYWNpbmcgZWxlbWVudCBwZXIKLWNvbmZpZ3VyYXRpb24uIElmIG1vcmUgdGhhbiBvbmUgcmVwbGFjaW5nIGVsZW1lbnQgaXMgcHJlc2VudCwgbm8gcmVwbGFjZW1lbnQKLXRha2VzIHBsYWNlLjwvbGk+Ci08bGk+UmVwbGFjZW1lbnQgd29ya3MgdHJhbnNpdGl2ZWx5LCBpLmUuIGlmIGEgcmVwbGFjaW5nIGVsZW1lbnQgaXMgcmVwbGFjZWQKLWl0c2VsZiwgdGhlIGZpbmFsIHJlcGxhY2VyIHByZXZhaWxzLjwvbGk+Ci08bGk+Q29udHJpYnV0aW9uIHByZWNlZGVzIFJlcGxhY2VtZW50LCBpLmUuIGNvbnRyaWJ1dGlvbiBpcyBldmFsdWF0ZWQgZmlyc3QKLWFuZCB0aGVuIHJlcGxhY2VtZW50IHBlcmZvcm1lZCBhZnRlcndhcmQuIFRoZSBldmFsdWF0aW9uIG9mIGNvbnRyaWJ1dGlvbiBhbmQKLXJlcGxhY2VtZW50IGlzIHBlcmZvcm1lZCB0b3AtZG93biBpbiB0aGUgc3BlY2lhbGl6YXRpb24gaGllcmFyY2h5LjwvbGk+Ci08L3VsPgotU2VlIDxhIGhyZWY9InZhcmlhYmlsaXR5YXNzb2NpYXRpb25zLmh0bWwjdmFyaWFiaWxpdHlhc3NvY2lhdGlvbnMiPlZhcmlhYmlsaXR5IEFzc29jaWF0aW9uczwvYT4gZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIGFzc29jaWF0aW9ucyBmb3IgZWFjaCBlbGVtZW50Ci10eXBlLjwvZGl2PgotPC9kaXY+Ci08ZGl2PjxkaXYgY2xhc3M9InJlbGNvbmNlcHRzIj48c3Ryb25nPlJlbGF0ZWQgY29uY2VwdHM8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0idmFyaWFiaWxpdHkuaHRtbCN2YXJpYWJpbGl0eSIgdGl0bGU9IlZhcmlhYmlsaXR5IGFsbG93cyBlbGVtZW50cyBpbiBvbmUgY29udGVudCBwYWNrYWdlIHRvIGluZmx1ZW5jZSBvciBtb2RpZnkgZWxlbWVudHMgaW4gb3RoZXIgY29udGVudCBwYWNrYWdlcyB3aXRob3V0IGFjdHVhbGx5IGRpcmVjdGx5IG1vZGlmeWluZyB0aGUgb3JpZ2luYWwgY29udGVudC4gVmFyaWFiaWxpdHkgZW5hYmxlcyBjaGFuZ2VzIHRvIHRoZSBjb250ZW50IHdoaWxlIGtlZXBpbmcgdGhlIGNoYW5nZXMgc2VwYXJhdGUgYW5kIG9wdGlvbmFsLiI+VmFyaWFiaWxpdHk8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9ImV4dGVuZHMuaHRtbCNleHRlbmRzIj5FeHRlbmRzPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJjb250cmlidXRlcy5odG1sI2NvbnRyaWJ1dGVzIj5Db250cmlidXRlczwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9yZXBvcnQuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3JlcG9ydC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMjUzYTJiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3JlcG9ydC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJzZWN1cml0eSIgY29udGVudD0icHVibGljIiAvPgotPG1ldGEgbmFtZT0iUm9ib3RzIiBjb250ZW50PSJpbmRleCxmb2xsb3ciIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIG5hbWU9IkRDLlR5cGUiIGNvbnRlbnQ9ImNvbmNlcHQiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iUmVwb3J0IiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJndWlkYW5jZS5odG1sI2d1aWRhbmNlIiAvPgotPG1ldGEgbmFtZT0iREMuRm9ybWF0IiBjb250ZW50PSJYSFRNTCIgLz4KLTxtZXRhIG5hbWU9IkRDLklkZW50aWZpZXIiIGNvbnRlbnQ9InJlcG9ydCIgLz4KLTxtZXRhIG5hbWU9IkRDLkxhbmd1YWdlIiBjb250ZW50PSJlbi11cyIgLz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi9pYm1kaXRhLmNzcyIgLz4KLTx0aXRsZT5SZXBvcnQ8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InJlcG9ydCI+PGEgbmFtZT0icmVwb3J0Ij48IS0tIC0tPjwvYT4KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+UmVwb3J0PC9oMT4KLTxkaXY+PHA+QSBSZXBvcnQgaXMgYSBwcmVkZWZpbmVkIHRlbXBsYXRlIG9mIGEgcmVzdWx0IHRoYXQgaXMgZ2VuZXJhdGVkIG9uIHRoZQotYmFzaXMgb2Ygb3RoZXIgd29yayBwcm9kdWN0cyBhcyBhbiBvdXRwdXQgZnJvbSBzb21lIGZvcm0gb2YgdG9vbCBhdXRvbWF0aW9uLgotRm9yIGV4YW1wbGUsIGEgcmVwb3J0IG1heSBjb21iaW5lIGEgZ3JhcGhpY2FsIG1vZGVsIGZyb20gYSBkZXNpZ24gdG9vbCB3aXRoCi10ZXh0dWFsIGluZm9ybWF0aW9uIGRvY3VtZW50cyBpbnRvIGEgcmVwb3J0LjwvcD4KLTwvZGl2PgotPGRpdj48ZGl2IGNsYXNzPSJyZWxjb25jZXB0cyI+PHN0cm9uZz5SZWxhdGVkIGNvbmNlcHRzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Imd1aWRhbmNlLmh0bWwjZ3VpZGFuY2UiPkd1aWRhbmNlPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3JldXNhYmxlYXNzZXQuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3JldXNhYmxlYXNzZXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWUwMTE0ZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9yZXVzYWJsZWFzc2V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGh0bWwKLSAgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9InNlY3VyaXR5IiBjb250ZW50PSJwdWJsaWMiIC8+Ci08bWV0YSBuYW1lPSJSb2JvdHMiIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgbmFtZT0iREMuVHlwZSIgY29udGVudD0iY29uY2VwdCIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJSZXVzYWJsZSBBc3NldCIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iZ3VpZGFuY2UuaHRtbCNndWlkYW5jZSIgLz4KLTxtZXRhIG5hbWU9IkRDLkZvcm1hdCIgY29udGVudD0iWEhUTUwiIC8+Ci08bWV0YSBuYW1lPSJEQy5JZGVudGlmaWVyIiBjb250ZW50PSJyZXVzYWJsZWFzc2V0IiAvPgotPG1ldGEgbmFtZT0iREMuTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIiAvPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuL2libWRpdGEuY3NzIiAvPgotPHRpdGxlPlJldXNhYmxlIEFzc2V0PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJyZXVzYWJsZWFzc2V0Ij48YSBuYW1lPSJyZXVzYWJsZWFzc2V0Ij48IS0tIC0tPjwvYT4KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+UmV1c2FibGUgQXNzZXQ8L2gxPgotPGRpdj48cD5BIHJldXNhYmxlIGFzc2V0IHByb3ZpZGVzIGEgc29sdXRpb24gdG8gYSBwcm9ibGVtIGZvciBhIGdpdmVuIGNvbnRleHQuCi1UaGUgYXNzZXQgaGFzIHJ1bGVzIGZvciB1c2FnZSB3aGljaCBhcmUgdGhlIGluc3RydWN0aW9ucyBkZXNjcmliaW5nIGhvdyB0aGUKLWFzc2V0IHNob3VsZCBiZSB1c2VkLjwvcD4KLTwvZGl2PgotPGRpdj48ZGl2IGNsYXNzPSJyZWxjb25jZXB0cyI+PHN0cm9uZz5SZWxhdGVkIGNvbmNlcHRzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Imd1aWRhbmNlLmh0bWwjZ3VpZGFuY2UiPkd1aWRhbmNlPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3JpY2h0ZXh0ZWRpdG9yLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9yaWNodGV4dGVkaXRvci5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNWMxYTQyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3JpY2h0ZXh0ZWRpdG9yLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGh0bWwKLSAgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9InNlY3VyaXR5IiBjb250ZW50PSJwdWJsaWMiIC8+Ci08bWV0YSBuYW1lPSJSb2JvdHMiIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgbmFtZT0iREMuVHlwZSIgY29udGVudD0iY29uY2VwdCIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJSaWNoIFRleHQgRWRpdG9yIiAvPgotPG1ldGEgbmFtZT0iREMuRm9ybWF0IiBjb250ZW50PSJYSFRNTCIgLz4KLTxtZXRhIG5hbWU9IkRDLklkZW50aWZpZXIiIGNvbnRlbnQ9InJpY2h0ZXh0ZWRpdG9yIiAvPgotPG1ldGEgbmFtZT0iREMuTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIiAvPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuL2libWRpdGEuY3NzIiAvPgotPHRpdGxlPlJpY2ggVGV4dCBFZGl0b3I8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InJpY2h0ZXh0ZWRpdG9yIj48YSBuYW1lPSJyaWNodGV4dGVkaXRvciI+PCEtLSAtLT48L2E+Ci0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPlJpY2ggVGV4dCBFZGl0b3I8L2gxPgotPGRpdj48cD5UaGUgUmljaCBUZXh0IEVkaXRvciBwcm92aWRlcyBzaW1wbGUgdGV4dCBmb3JtYXR0aW5nIGZ1bmN0aW9ucwotdGhhdCBhbGxvdyBhbiBhdXRob3IgdG8gY2hhbmdlIGhvdyBzZWN0aW9ucyBvZiB0ZXh0IGFwcGVhciBpbiBhIHB1Ymxpc2hlZAotV2ViIHNpdGUuIFRoZSBSaWNoIFRleHQgRWRpdG9yIGFsbG93cyBpbmRpdmlkdWFsIGNvbXBvbmVudHMgb2YgdGV4dCB0byBiZQotY2hhbmdlZCB3aXRoaW4gdGhlIGNvbnRleHQgb2YgdGhlIG92ZXJhbGwgc3R5bGUgc2hlZXQocykgdGhhdCBkZXRlcm1pbmUgdGhlCi1zdHlsZSBhbmQgZm9ybWF0IG9mIGEgcHVibGlzaGVkIFdlYiBzaXRlLjwvcD4KLTxkaXYgY2xhc3M9InAiPlRoZSBSaWNoIFRleHQgRWRpdG9yIGFsbG93cyB5b3UgdG86PHVsPjxsaT5Db3B5LCBjdXQgYW5kIHBhc3RlIHRleHQuIFNpbXBseSBoaWdobGlnaHQgdGhlIHRleHQgeW91IHdhbnQgdG8gY3V0IG9yCi1jb3B5IGFuZCB0aGVuIGNsaWNrIHRoZSBDdXQgPGltZyBzcmM9ImN1dC5naWYiIGFsdD0iIiAvPiBvciBDb3B5IDxpbWcgc3JjPSJjb3B5LmdpZiIgYWx0PSIiIC8+IGJ1dHRvbnMuIFRvIHBhc3RlIHRleHQsIHBsYWNlIHRoZSBjdXJzb3IKLXdoZXJlIHlvdSB3YW50IHRvIGluY2x1ZGUgdGhlIHRleHQgYW5kIHRoZW4gY2xpY2sgdGhlIFBhc3RlIGJ1dHRvbiA8aW1nIHNyYz0icGFzdGUuZ2lmIiBhbHQ9IiIgLz4uPC9saT4KLTxsaT5SZW1vdmUgYWxsIHRoZSBjb250ZW50cyBpbiB0aGUgdGV4dCBlZGl0b3Igd2luZG93IGF0IG9uY2UgYnkgY2xpY2tpbmcKLXRoZSBDbGVhciBDb250ZW50IGJ1dHRvbiA8aW1nIHNyYz0iY2xlYXJjb250ZW50LmdpZiIgYWx0PSIiIC8+LjwvbGk+Ci08bGk+Q2hhbmdlIHRoZSBhcHBlYXJhbmNlIG9mIHlvdXIgdGV4dCBieSBtYWtpbmcgaXQgYm9sZCwgaXRhbGljaXplZCwgb3IgdW5kZXJsaW5pbmcKLWl0LiBIaWdobGlnaHQgdGhlIHRleHQgeW91IHdhbnQgdG8gY2hhbmdlIGFuZCB0aGVuIGNsaWNrIHRoZSBCb2xkIDxpbWcgc3JjPSJib2xkLmdpZiIgYWx0PSIiIC8+LCBJdGFsaWNzIDxpbWcgc3JjPSJpdGFsaWMuZ2lmIiBhbHQ9IiIgLz4sCi1vciBVbmRlcmxpbmUgPGltZyBzcmM9InVuZGVybGluZS5naWYiIGFsdD0iIiAvPiBidXR0b24uPC9saT4KLTxsaT5DcmVhdGUgU3VwZXIgb3IgU3ViIHNjcmlwdCBieSBjbGlja2luZyB0aGUgU3VwZXJzY3JpcHQgPGltZyBzcmM9InN1cGVyc2NyaXB0LmdpZiIgYWx0PSIiIC8+IG9yIFN1YnNjcmlwdCA8aW1nIHNyYz0ic3Vic2NyaXB0LmdpZiIgYWx0PSIiIC8+IGJ1dHRvbnMuPC9saT4KLTxsaT5BZGQgbnVtYmVyZWQgb3IgYnVsbGV0ZWQgbGlzdHMgdXNpbmcgdGhlIG9yZGVyZWQgPGltZyBzcmM9ImFkZG9yZGxpc3RfY28uZ2lmIiBhbHQ9IiIgLz4gb3IgdW5vcmRlcmVkIGxpc3QgPGltZyBzcmM9ImFkZHVub3JkbGlzdF9jby5naWYiIGFsdD0iIiAvPiBidXR0b25zLjwvbGk+Ci08bGk+SW5kZW50IG9yIE91dGRlbnQgdGV4dCB1c2luZyB0aGUgSW5kZW50IDxpbWcgc3JjPSJpbmRlbnQuZ2lmIiBhbHQ9IiIgLz4gb3IgT3V0ZGVudCA8aW1nIHNyYz0ib3V0ZGVudC5naWYiIGFsdD0iIiAvPiBidXR0b25zLjwvbGk+Ci08bGk+RmluZCBhbmQgcmVwbGFjZSB0ZXh0LiBDbGljayB0aGUgRmluZC9SZXBsYWNlIGJ1dHRvbiA8aW1nIHNyYz0iZmluZHJlcGxhY2UuZ2lmIiBhbHQ9IiIgLz4uIFRoZSBGaW5kL1JlcGxhY2UgZGlhbG9nIGJveCBhcHBlYXJzLiBUeXBlIHRoZSB0ZXh0IHlvdQotd2FudCB0byBmaW5kIGluIHRoZSBGaW5kIGZpZWxkIGFuZCwgaWYgeW91IGFyZSByZXBsYWNpbmcgdGhhdCB0ZXh0LCB0eXBlIHRoZQotcmVwbGFjZW1lbnQgdGV4dCBpbiB0aGUgUmVwbGFjZSB3aXRoIGZpZWxkLiBZb3UgY2FuIHNlYXJjaCBmb3J3YXJkIG9yIGJhY2sKLWFuZCBzcGVjaWZ5IHdoZXRoZXIgeW91IHdhbnQgeW91ciBzZWFyY2ggdG8gYmUgY2FzZSBzZW5zaXRpdmUgb3Igc2VhcmNoIGZvcgotb25seSBwYXJ0cyBvZiB3b3Jkcy48L2xpPgotPGxpPkFkZCBvciBjcmVhdGUgaHlwZXJsaW5rcyB1c2luZyB0aGUgQWRkIGxpbmsgYnV0dG9uIDxpbWcgc3JjPSJhZGRsaW5rX2NvLmdpZiIgYWx0PSIiIC8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBzZWUgPGEgaHJlZj0iYWRkYXJlZmVyZW5jZW9yaHlwZXJsaW5rLmh0bWwjYWRkYXJlZmVyZW5jZW9yaHlwZXJsaW5rIj5BZGQgYSBSZWZlcmVuY2Ugb3IgSHlwZXJsaW5rPC9hPi48L2xpPgotPGxpPkFkZCBpbWFnZXMuIENsaWNrIHRoZSBBZGQgSW1hZ2UgYnV0dG9uIDxpbWcgc3JjPSJhZGRpbWdfY28uZ2lmIiBhbHQ9IiIgLz4uIFRoZSBBZGQgSW1hZ2UgZGlhbG9nIGJveCBhcHBlYXJzLiBCcm93c2UgZm9yIHRoZSBpbWFnZSB5b3UnZCBsaWtlCi10byBhZGQgYW5kIHRoZW4gY2xpY2sgPHN0cm9uZz5PSzwvc3Ryb25nPi48L2xpPgotPGxpPkFkZCB0YWJsZXMuIENsaWNrIHRoZSBBZGQgVGFibGUgYnV0dG9uIDxpbWcgc3JjPSJhZGR0YWJsZV9jby5naWYiIGFsdD0iIiAvPi4gVGhlIEFkZCBUYWJsZSBkaWFsb2cgYm94IGFwcGVhcnMuIFNwZWNpZnkgdGhlIHRhYmxlIHBhcmFtZXRlcnMKLWFuZCB0aGVuIGNsaWNrIDxzdHJvbmc+T0s8L3N0cm9uZz4uPC9saT4KLTwvdWw+Ci08L2Rpdj4KLTwvZGl2PgotPGRpdj48L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3JvYWRtYXAuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3JvYWRtYXAuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWE5OWJkOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9yb2FkbWFwLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGh0bWwKLSAgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9InNlY3VyaXR5IiBjb250ZW50PSJwdWJsaWMiIC8+Ci08bWV0YSBuYW1lPSJSb2JvdHMiIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgbmFtZT0iREMuVHlwZSIgY29udGVudD0iY29uY2VwdCIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJSb2FkbWFwIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJndWlkYW5jZS5odG1sI2d1aWRhbmNlIiAvPgotPG1ldGEgbmFtZT0iREMuRm9ybWF0IiBjb250ZW50PSJYSFRNTCIgLz4KLTxtZXRhIG5hbWU9IkRDLklkZW50aWZpZXIiIGNvbnRlbnQ9InJvYWRtYXAiIC8+Ci08bWV0YSBuYW1lPSJEQy5MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiIC8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4vaWJtZGl0YS5jc3MiIC8+Ci08dGl0bGU+Um9hZG1hcDwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0icm9hZG1hcCI+PGEgbmFtZT0icm9hZG1hcCI+PCEtLSAtLT48L2E+Ci0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPlJvYWRtYXA8L2gxPgotPGRpdj48cD5BIFJvYWRtYXAgaXMgYSBzcGVjaWZpYyB0eXBlIG9mIGd1aWRhbmNlIHRoYXQgZGVzY3JpYmVzIGhvdyBhIHByb2Nlc3MgaXMKLXR5cGljYWxseSBwZXJmb3JtZWQuIE9mdGVuIHByb2Nlc3MgY2FuIGJlIG11Y2ggZWFzaWVyIHVuZGVyc3Rvb2QgYnkgcHJvdmlkaW5nCi1hIHdhbGt0aHJvdWdoIHdpdGggYSBsaW5lYXIgdGhyZWFkIG9mIGEgdHlwaWNhbCBpbnN0YW50aWF0aW9uIG9mIHRoZSBwcm9jZXNzLgotSW4gYWRkaXRpb24gdG8gbWFraW5nIHRoZSBwcm9jZXNzIHByYWN0aXRpb25lciB1bmRlcnN0YW5kIGhvdyB3b3JrIGluIHRoZQotcHJvY2VzcyBpcyBiZWluZyBwZXJmb3JtZWQsIGEgcm9hZG1hcCBwcm92aWRlcyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGFib3V0Ci1ob3cgYWN0aXZpdGllcyBhbmQgdGFza3MgcmVsYXRlIHRvIGVhY2ggb3RoZXIgb3ZlciB0aW1lLiA8L3A+Ci08L2Rpdj4KLTxkaXY+PGRpdiBjbGFzcz0icmVsY29uY2VwdHMiPjxzdHJvbmc+UmVsYXRlZCBjb25jZXB0czwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJndWlkYW5jZS5odG1sI2d1aWRhbmNlIj5HdWlkYW5jZTwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9yb2xlLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9yb2xlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhYWJkOWYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvcm9sZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJzZWN1cml0eSIgY29udGVudD0icHVibGljIiAvPgotPG1ldGEgbmFtZT0iUm9ib3RzIiBjb250ZW50PSJpbmRleCxmb2xsb3ciIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIG5hbWU9IkRDLlR5cGUiIGNvbnRlbnQ9ImNvbmNlcHQiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iUm9sZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iY3JlYXRlYXJvbGUuaHRtbCNjcmVhdGVhcm9sZSIgLz4KLTxtZXRhIG5hbWU9IkRDLkZvcm1hdCIgY29udGVudD0iWEhUTUwiIC8+Ci08bWV0YSBuYW1lPSJEQy5JZGVudGlmaWVyIiBjb250ZW50PSJyb2xlIiAvPgotPG1ldGEgbmFtZT0iREMuTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIiAvPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuL2libWRpdGEuY3NzIiAvPgotPHRpdGxlPlJvbGU8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InJvbGUiPjxhIG5hbWU9InJvbGUiPjwhLS0gLS0+PC9hPgotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5Sb2xlPC9oMT4KLTxkaXY+PHA+QSBSb2xlIGRlZmluZXMgYSBzZXQgb2YgcmVsYXRlZCBza2lsbHMsIGNvbXBldGVuY2llcywgYW5kIHJlc3BvbnNpYmlsaXRpZXMKLW9mIGFuIGluZGl2aWR1YWwgb3IgaW5kaXZpZHVhbHMuPC9wPgotPC9kaXY+Ci08ZGl2PjxkaXYgY2xhc3M9InJlbHRhc2tzIj48c3Ryb25nPlJlbGF0ZWQgdGFza3M8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iY3JlYXRlYXJvbGUuaHRtbCNjcmVhdGVhcm9sZSI+Q3JlYXRlIGEgUm9sZTwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9yb2xlc2V0Lmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9yb2xlc2V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5YmJjMWMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvcm9sZXNldC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJzZWN1cml0eSIgY29udGVudD0icHVibGljIiAvPgotPG1ldGEgbmFtZT0iUm9ib3RzIiBjb250ZW50PSJpbmRleCxmb2xsb3ciIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIG5hbWU9IkRDLlR5cGUiIGNvbnRlbnQ9ImNvbmNlcHQiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iUm9sZSBTZXQiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9Im1ldGhvZGNvbnRlbnRjYXRlZ29yaWVzLmh0bWwjbWV0aG9kY29udGVudGNhdGVnb3JpZXMiIC8+Ci08bWV0YSBuYW1lPSJEQy5Gb3JtYXQiIGNvbnRlbnQ9IlhIVE1MIiAvPgotPG1ldGEgbmFtZT0iREMuSWRlbnRpZmllciIgY29udGVudD0icm9sZXNldCIgLz4KLTxtZXRhIG5hbWU9IkRDLkxhbmd1YWdlIiBjb250ZW50PSJlbi11cyIgLz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi9pYm1kaXRhLmNzcyIgLz4KLTx0aXRsZT5Sb2xlIFNldDwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0icm9sZXNldCI+PGEgbmFtZT0icm9sZXNldCI+PCEtLSAtLT48L2E+Ci0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPlJvbGUgU2V0PC9oMT4KLTxkaXY+PHA+QSBSb2xlIFNldCBpcyB1c2VkIHRvIGdyb3VwIDxhIGhyZWY9InJvbGUuaHRtbCNyb2xlIj5Sb2xlczwvYT4gd2l0aAotY2VydGFpbiBjb21tb25hbGl0aWVzIHRvZ2V0aGVyLiBGb3IgZXhhbXBsZSwgaW4gYSBzb2Z0d2FyZSBkZXZlbG9wbWVudCBlbnZpcm9ubWVudCwKLWFuIEFuYWx5c3Qgcm9sZSBzZXQgY291bGQgYmUgdXNlZCB0byBncm91cCB0b2dldGhlciByb2xlcyBzdWNoIGFzIEJ1c2luZXNzCi1Qcm9jZXNzIEFuYWx5c3QsIFN5c3RlbSBBbmFseXN0IGFuZCBSZXF1aXJlbWVudHMgU3BlY2lmaWVyLiBFYWNoIG9mIHRoZXNlCi1yb2xlcyB3b3JrIHdpdGggc2ltaWxhciB0ZWNobmlxdWVzIGFuZCBoYXZlIG92ZXJsYXBwaW5nIHNraWxscywgYnV0IG1heSBiZQotcmVzcG9uc2libGUgZm9yIHBlcmZvcm1pbmcgY2VydGFpbiB0YXNrcyBhbmQgY3JlYXRpbmcgY2VydGFpbiB3b3JrIHByb2R1Y3RzLgotUm9sZSBzZXRzIGNhbiBiZSBvcmdhbml6ZWQgdXNpbmcgUm9sZSBTZXQgR3JvdXBpbmdzLjwvcD4KLTwvZGl2PgotPGRpdj48ZGl2IGNsYXNzPSJyZWxjb25jZXB0cyI+PHN0cm9uZz5SZWxhdGVkIGNvbmNlcHRzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Im1ldGhvZGNvbnRlbnRjYXRlZ29yaWVzLmh0bWwjbWV0aG9kY29udGVudGNhdGVnb3JpZXMiPk1ldGhvZCBDb250ZW50IENhdGVnb3JpZXM8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvcm9sZXNldGdyb3VwaW5nLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9yb2xlc2V0Z3JvdXBpbmcuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmM3NWZiMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9yb2xlc2V0Z3JvdXBpbmcuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgaHRtbAotICBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0ic2VjdXJpdHkiIGNvbnRlbnQ9InB1YmxpYyIgLz4KLTxtZXRhIG5hbWU9IlJvYm90cyIgY29udGVudD0iaW5kZXgsZm9sbG93IiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBuYW1lPSJEQy5UeXBlIiBjb250ZW50PSJjb25jZXB0IiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IlJvbGUgU2V0IEdyb3VwaW5nIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJyb2xlc2V0Lmh0bWwjcm9sZXNldCIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0icm9sZS5odG1sIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJjcmVhdGVhcm9sZS5odG1sI2NyZWF0ZWFyb2xlIiAvPgotPG1ldGEgbmFtZT0iREMuRm9ybWF0IiBjb250ZW50PSJYSFRNTCIgLz4KLTxtZXRhIG5hbWU9IkRDLklkZW50aWZpZXIiIGNvbnRlbnQ9InJvbGVzZXRncm91cGluZyIgLz4KLTxtZXRhIG5hbWU9IkRDLkxhbmd1YWdlIiBjb250ZW50PSJlbi11cyIgLz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi9pYm1kaXRhLmNzcyIgLz4KLTx0aXRsZT5Sb2xlIFNldCBHcm91cGluZzwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0icm9sZXNldGdyb3VwaW5nIj48YSBuYW1lPSJyb2xlc2V0Z3JvdXBpbmciPjwhLS0gLS0+PC9hPgotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5Sb2xlIFNldCBHcm91cGluZzwvaDE+Ci08ZGl2PjxwPlJvbGUgc2V0cyBjYW4gYmUgY2F0ZWdvcml6ZWQgaW50byByb2xlIHNldCBncm91cGluZ3MuIEZvciBleGFtcGxlLCBkaWZmZXJlbnQKLW1ldGhvZCBtaWdodCBkZWZpbmUgc2ltaWxhciBSb2xlIFNldHMgd2hpY2gsIGhvd2V2ZXIsIG5lZWQgdG8gYmUgZGlzdGluZ3Vpc2hlZAotZnJvbSBlYWNoIG90aGVyIG9uIGEgZ2xvYmFsIHNjYWxlLiBUaHVzLCBSb2xlIFNldCBHcm91cGluZ3MgYWxsb3cgZGlzdGluZ3Vpc2hpbmcsCi1mb3IgZXhhbXBsZSwgU29mdHdhcmUgU2VydmljZXMgTWFuYWdlciBSb2xlIHNldHMgZnJvbSBTb2Z0d2FyZSBEZXZlbG9wbWVudAotT3JnYW5pemF0aW9uIE1hbmFnZXIgUm9sZSBTZXRzLjwvcD4KLTwvZGl2PgotPGRpdj48ZGl2IGNsYXNzPSJyZWxjb25jZXB0cyI+PHN0cm9uZz5SZWxhdGVkIGNvbmNlcHRzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9InJvbGVzZXQuaHRtbCNyb2xlc2V0Ij5Sb2xlIFNldDwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0icm9sZS5odG1sIj5Sb2xlPC9hPjwvZGl2PgotPC9kaXY+Ci08ZGl2IGNsYXNzPSJyZWx0YXNrcyI+PHN0cm9uZz5SZWxhdGVkIHRhc2tzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9ImNyZWF0ZWFyb2xlLmh0bWwjY3JlYXRlYXJvbGUiPkNyZWF0ZSBhIFJvbGU8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvc2VhcmNoZm9ybWV0aGNvbnQuSlBHIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvc2VhcmNoZm9ybWV0aGNvbnQuSlBHCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOWM1MGRmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3NlYXJjaGZvcm1ldGhjb250LkpQRworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3NlYXJjaGZvcm1ldGhvZGNvbnRlbnQuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3NlYXJjaGZvcm1ldGhvZGNvbnRlbnQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNThkMjU1NS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9zZWFyY2hmb3JtZXRob2Rjb250ZW50Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGh0bWwKLSAgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9InNlY3VyaXR5IiBjb250ZW50PSJwdWJsaWMiIC8+Ci08bWV0YSBuYW1lPSJSb2JvdHMiIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgbmFtZT0iREMuVHlwZSIgY29udGVudD0idGFzayIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJTZWFyY2ggZm9yIE1ldGhvZCBDb250ZW50IiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJtZXRob2Rjb250ZW50Lmh0bWwjY3JlYXRpbmdyZXVzYWJsZW1ldGhvZGNvbnRlbnRzIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJ1c2VyaW50ZXJmYWNlb3ZlcnZpZXcuaHRtbCIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iYnJvd3NlYW5kcHJldmlld21ldGhvZGNvbnRlbnQuaHRtbCIgLz4KLTxtZXRhIG5hbWU9IkRDLkZvcm1hdCIgY29udGVudD0iWEhUTUwiIC8+Ci08bWV0YSBuYW1lPSJEQy5JZGVudGlmaWVyIiBjb250ZW50PSJzZWFyY2hmb3JtZXRob2Rjb250ZW50IiAvPgotPG1ldGEgbmFtZT0iREMuTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIiAvPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuL2libWRpdGEuY3NzIiAvPgotPHRpdGxlPlNlYXJjaCBmb3IgTWV0aG9kIENvbnRlbnQ8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InNlYXJjaGZvcm1ldGhvZGNvbnRlbnQiPjxhIG5hbWU9InNlYXJjaGZvcm1ldGhvZGNvbnRlbnQiPjwhLS0gLS0+PC9hPgotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5TZWFyY2ggZm9yIE1ldGhvZCBDb250ZW50PC9oMT4KLTxkaXY+PGRpdiBjbGFzcz0ic2VjdGlvbiI+VG8gU2VhcmNoIGZvciBNZXRob2QgQ29udGVudDo8L2Rpdj4KLTxvbD48bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPlRoZXJlIGFyZSB0aHJlZSB3YXlzIHRvIGJlZ2luIHlvdXIgc2VhcmNoIGZvciBtZXRob2QgY29udGVudC48L3NwYW4+PHVsPjxsaT5TZWxlY3QgPHN0cm9uZz5TZWFyY2ggJmd0OyBTZWFyY2g8L3N0cm9uZz48L2xpPgotPGxpPjxzdHJvbmc+U2VhcmNoICZndDsgRmlsZTwvc3Ryb25nPjwvbGk+Ci08bGk+Q2xpY2sgdGhlIFNlYXJjaCBidXR0b24gPHNwYW4gY2xhc3M9InVpY29udHJvbCI+PGltZyBzcmM9InNlYXJjaGZvcm1ldGhjb250LkpQRyIgYWx0PSIiIC8+PC9zcGFuPiBpbiB0aGUgdG9vbCBiYXIuPC9saT4KLTwvdWw+Ci0gVGhlIFNlYXJjaCBkaWFsb2cgd2luZG93IG9wZW5zLjwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkNsaWNrIGVpdGhlciB0aGUgPHN0cm9uZz5GaWxlIFNlYXJjaDwvc3Ryb25nPiB0YWIgb3IgdGhlIDxzdHJvbmc+TWV0aG9kIFNlYXJjaDwvc3Ryb25nPiB0YWIKLWFuZCB0aGVuIHNldCB5b3VyIGNyaXRlcmlhLiBVc2luZyB0aGUgPHN0cm9uZz5GaWxlIFNlYXJjaDwvc3Ryb25nPiB0YWIsIHlvdSBjYW4gc2VhcmNoCi1mb3IgY29udGVudCBieSB0aGUgZmlsZSBuYW1lIG9mIHRoZSBjb250ZW50LiBVc2luZyB0aGUgPHN0cm9uZz5NZXRob2QgU2VhcmNoPC9zdHJvbmc+IHRhYiwKLXlvdSBjYW4gc2VhcmNoIHRoZSBtZXRob2QgY29udGVudCBpdHNlbGYuPC9zcGFuPjx1bD48bGk+PHN0cm9uZz5Vc2luZyBGaWxlIFNlYXJjaDwvc3Ryb25nPjogVHlwZSBhIHRleHQgc3RyaW5nIHRvIHNlYXJjaCBmb3Igd2l0aGluCi10aGUgZmlsZXMgKG9wdGlvbmFsKSwgb3IgdHlwZSBhIGZpbGUgbmFtZSBwYXR0ZXJuIHRvIHVzZSBmb3IgbWF0Y2hpbmcgZmlsZQotbmFtZXMuIFlvdSBtdXN0IHVzZSBhIHBhdHRlcm4uIFVzZSAqIGlmIHlvdSB3YW50IHRvIHNlYXJjaCBmb3IgdGhlIHRleHQgaW4KLWFsbCBmaWxlcy4gTGVhdmUgYWxsIG90aGVyIG9wdGlvbnMgYXMgZGVmYXVsdC48L2xpPgotPGxpPjxzdHJvbmc+VXNpbmcgTWV0aG9kIFNlYXJjaDwvc3Ryb25nPjogVHlwZSBhIHRleHQgc3RyaW5nIHRvIHNlYXJjaCBmb3Igd2l0aGluCi10aGUgZmlsZXMgKG9wdGlvbmFsKSwgb3IgdHlwZSBhIG5hbWUgcGF0dGVybiBmb3IgbWF0Y2hpbmcgZWxlbWVudCBuYW1lcyBhbmQKLXByZXNlbnRhdGlvbiBuYW1lcy4gWW91IG11c3QgdXNlIGEgcGF0dGVybi4gVXNlICogaWYgeW91IHdhbnQgdG8gc2VhcmNoIGZvcgotdGV4dCBpbiBhbGwgZmlsZXMuIEluIHRoZSBTY29wZSBzZWN0aW9uLCB5b3UgY2FuIHJlc3RyaWN0IHlvdXIgc2VhcmNoIHRvIGEKLXN1YnNldCBvZiBlbGVtZW50IHR5cGVzLjwvbGk+Ci08L3VsPgotPC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+Q2xpY2sgPHN0cm9uZz5TZWFyY2g8L3N0cm9uZz4uIFRoZSBTZWFyY2ggVmlldyBvcGVucyB3aXRoIHlvdXIgc2VhcmNoIHJlc3VsdHMuPC9zcGFuPjwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkluIHRoZSBTZWFyY2ggVmlldywgeW91IGNhbiBkcmlsbCBkb3duIGludG8gdGhlIHNlYXJjaCByZXN1bHRzCi1hbmQgZG91YmxlLWNsaWNrIGFuIGVsZW1lbnQgdG8gb3BlbiB0aGUgZWRpdG9yIGZvciB0aGUgc2VsZWN0ZWQgZWxlbWVudC4gSWYKLXlvdSBoYXZlIExpbmsgd2l0aCBFZGl0b3Igc2VsZWN0ZWQgaW4gdGhlIGxpYnJhcnkgdmlldywgdGhlIGxpYnJhcnkgdmlldyBkaXNwbGF5Ci1jaGFuZ2VzIHRvIHNob3cgeW91IHdoZXJlIHRoZSBzZWxlY3RlZCBlbGVtZW50IGlzIGluIHRoZSBsaWJyYXJ5Ljwvc3Bhbj48L2xpPgotPC9vbD4KLTwvZGl2PgotPGRpdj4KLTxkaXYgY2xhc3M9ImZhbWlseWxpbmtzIj4KLTxkaXYgY2xhc3M9InBhcmVudGxpbmsiPjxzdHJvbmc+UGFyZW50IHRvcGljOjwvc3Ryb25nPiA8YSBocmVmPSJ1c2VyaW50ZXJmYWNlb3ZlcnZpZXcuaHRtbCIgdGl0bGU9IkVjbGlwc2UgUHJvY2VzcyBGcmFtZXdvcmsgQ29tcG9zZXIgaXMgYnVpbHQgb24gdGhlIEVjbGlwc2UgSW50ZWdyYXRlZCBEZXZlbG9wbWVudCBFbnZpcm9ubWVudCAoSURFKS4gVGhlIHBhcnRzIG9mIHRoZSB3b3Jrc3BhY2UgYXJlOiI+VG9vbCBJbnRlcmZhY2U8L2E+PC9kaXY+Ci08ZGl2IGNsYXNzPSJwcmV2aW91c2xpbmsiPjxzdHJvbmc+UHJldmlvdXMgdG9waWM6PC9zdHJvbmc+IDxhIGhyZWY9ImJyb3dzZWFuZHByZXZpZXdtZXRob2Rjb250ZW50Lmh0bWwiPkJyb3dzZSBhbmQgUHJldmlldyBNZXRob2QgQ29udGVudDwvYT48L2Rpdj4KLTwvZGl2PgotPGRpdiBjbGFzcz0icmVsY29uY2VwdHMiPjxzdHJvbmc+UmVsYXRlZCBjb25jZXB0czwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJtZXRob2Rjb250ZW50Lmh0bWwjY3JlYXRpbmdyZXVzYWJsZW1ldGhvZGNvbnRlbnRzIj5NZXRob2QgQ29udGVudDwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9zdGFuZGFyZG1ldGhvZGxpYnJhcnlvdmVydmlldy5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvc3RhbmRhcmRtZXRob2RsaWJyYXJ5b3ZlcnZpZXcuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjliYWVhZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9zdGFuZGFyZG1ldGhvZGxpYnJhcnlvdmVydmlldy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJzZWN1cml0eSIgY29udGVudD0icHVibGljIiAvPgotPG1ldGEgbmFtZT0iUm9ib3RzIiBjb250ZW50PSJpbmRleCxmb2xsb3ciIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIG5hbWU9IkRDLlR5cGUiIGNvbnRlbnQ9ImNvbmNlcHQiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iU3RhbmRhcmQgTWV0aG9kIExpYnJhcnkgT3ZlcnZpZXciIC8+Ci08bWV0YSBuYW1lPSJhYnN0cmFjdCIgY29udGVudD0iQSBNZXRob2QgTGlicmFyeSBpcyBhIHBoeXNpY2FsIGNvbnRhaW5lciBmb3IgbWV0aG9kIHBsdWctaW5zIGFuZCBtZXRob2QgY29uZmlndXJhdGlvbiBkZWZpbml0aW9ucy4gQWxsIG1ldGhvZCBlbGVtZW50cyBhcmUgc3RvcmVkIGluIGEgbWV0aG9kIGxpYnJhcnkuIiAvPgotPG1ldGEgbmFtZT0iZGVzY3JpcHRpb24iIGNvbnRlbnQ9IkEgTWV0aG9kIExpYnJhcnkgaXMgYSBwaHlzaWNhbCBjb250YWluZXIgZm9yIG1ldGhvZCBwbHVnLWlucyBhbmQgbWV0aG9kIGNvbmZpZ3VyYXRpb24gZGVmaW5pdGlvbnMuIEFsbCBtZXRob2QgZWxlbWVudHMgYXJlIHN0b3JlZCBpbiBhIG1ldGhvZCBsaWJyYXJ5LiIgLz4KLTxtZXRhIG5hbWU9IkRDLkZvcm1hdCIgY29udGVudD0iWEhUTUwiIC8+Ci08bWV0YSBuYW1lPSJEQy5JZGVudGlmaWVyIiBjb250ZW50PSJzdGFuZGFyZG1ldGhvZGxpYnJhcnlvdmVydmlldyIgLz4KLTxtZXRhIG5hbWU9IkRDLkxhbmd1YWdlIiBjb250ZW50PSJlbi11cyIgLz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi9pYm1kaXRhLmNzcyIgLz4KLTx0aXRsZT5TdGFuZGFyZCBNZXRob2QgTGlicmFyeSBPdmVydmlldzwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0ic3RhbmRhcmRtZXRob2RsaWJyYXJ5b3ZlcnZpZXciPjxhIG5hbWU9InN0YW5kYXJkbWV0aG9kbGlicmFyeW92ZXJ2aWV3Ij48IS0tIC0tPjwvYT4KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+U3RhbmRhcmQgTWV0aG9kIExpYnJhcnkgT3ZlcnZpZXc8L2gxPgotPGRpdj48cD5BIE1ldGhvZCBMaWJyYXJ5IGlzIGEgcGh5c2ljYWwgY29udGFpbmVyIGZvciBtZXRob2QgcGx1Zy1pbnMgYW5kCi1tZXRob2QgY29uZmlndXJhdGlvbiBkZWZpbml0aW9ucy4gQWxsIG1ldGhvZCBlbGVtZW50cyBhcmUgc3RvcmVkIGluIGEgbWV0aG9kCi1saWJyYXJ5LjwvcD4KLTxwPk11Y2ggbGlrZSBhIGxpYnJhcnkgaGFzIGJvb2tzLCBhIG1ldGhvZCBsaWJyYXJ5IGhhcyBtZXRob2QgcGx1Zy1pbnMuIFdoZXJlCi1hIGxpYnJhcnkgYm9vayBpcyBtYWRlIHVwIG9mIHNlY3Rpb25zIG9yIGNoYXB0ZXJzIGFuZCBjb250ZW50IHdpdGhpbiB0aG9zZQotY2hhcHRlcnMsIDxhIGhyZWY9Im1ldGhvZHBsdWdpbi5odG1sI21ldGhvZHBsdWdpbiI+bWV0aG9kCi1wbHVnLWluczwvYT4gYXJlIG1hZGUgdXAgb2YgPGEgaHJlZj0ibWV0aG9kY29udGVudC5odG1sI2NyZWF0aW5ncmV1c2FibGVtZXRob2Rjb250ZW50cyI+bWV0aG9kIGNvbnRlbnQ8L2E+IGFuZCBwcm9jZXNzZXMuIE1ldGhvZCBjb250ZW50IGNvbnRhaW5zCi1jb250ZW50IHBhY2thZ2VzIGFuZCBib3RoIDxhIGhyZWY9Im1ldGhvZGNvbnRlbnRjYXRlZ29yaWVzLmh0bWwjbWV0aG9kY29udGVudGNhdGVnb3JpZXMiPnN0YW5kYXJkIGFuZCBjdXN0b20gY2F0ZWdvcmllczwvYT4sIHdoaWxlIHByb2Nlc3NlcyBzdHJ1Y3R1cmUKLXRoaXMgY29udGVudCBpbnRvIHByb2Nlc3MgZnJhZ21lbnRzIGNhbGxlZCA8YSBocmVmPSJjYXBhYmlsaXR5cGF0dGVybi5odG1sI2NhcGFiaWxpdHlwYXR0ZXJuIj5jYXBhYmlsaXR5IHBhdHRlcm5zPC9hPiBhbmQgZnVsbCBsaWZlY3ljbGUgcHJvY2Vzc2VzIGNhbGxlZCA8YSBocmVmPSJkZWxpdmVyeXByb2Nlc3MuaHRtbCI+ZGVsaXZlcnkgcHJvY2Vzc2VzPC9hPi48L3A+Ci08cD5BIG1ldGhvZCBsaWJyYXJ5IGFsc28gaGFzIG9uZSBvciBtb3JlIDxhIGhyZWY9Im1ldGhvZGNvbmZpZ3VyYXRpb25zLmh0bWwjbWV0aG9kY29uZmlndXJhdGlvbnMiPm1ldGhvZCBjb25maWd1cmF0aW9uczwvYT4gdGhhdCBmaWx0ZXIgdGhlIGxpYnJhcnkgYW5kIHByb3ZpZGUKLXNtYWxsZXIgd29ya2luZyBzZXRzIG9mIGxpYnJhcnkgY29udGVudCBmb3IgdGhlIGVuZCB1c2VyLjwvcD4KLTwvZGl2PgotPGRpdj48L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3N0ZXAuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3N0ZXAuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTFlZDBhYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9zdGVwLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGh0bWwKLSAgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9InNlY3VyaXR5IiBjb250ZW50PSJwdWJsaWMiIC8+Ci08bWV0YSBuYW1lPSJSb2JvdHMiIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgbmFtZT0iREMuVHlwZSIgY29udGVudD0iY29uY2VwdCIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJTdGVwIiAvPgotPG1ldGEgbmFtZT0iREMuRm9ybWF0IiBjb250ZW50PSJYSFRNTCIgLz4KLTxtZXRhIG5hbWU9IkRDLklkZW50aWZpZXIiIGNvbnRlbnQ9InN0ZXAiIC8+Ci08bWV0YSBuYW1lPSJEQy5MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiIC8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4vaWJtZGl0YS5jc3MiIC8+Ci08dGl0bGU+U3RlcDwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0ic3RlcCI+PGEgbmFtZT0ic3RlcCI+PCEtLSAtLT48L2E+Ci0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPlN0ZXA8L2gxPgotPGRpdj48cD5BIFN0ZXAgaXMgYSBwYXJ0IG9mIHRoZSBvdmVyYWxsIHdvcmsgZGVzY3JpYmVkIGZvciBhIHRhc2suIFRoZSBjb2xsZWN0aW9uCi1vZiBzdGVwcyBkZWZpbmVkIGZvciBhIHRhc2sgcmVwcmVzZW50cyBhbGwgdGhlIHdvcmsgdGhhdCBzaG91bGQgYmUgZG9uZSB0bwotYWNoaWV2ZSB0aGUgb3ZlcmFsbCBnb2FsIG9mIHRoZSB0YXNrLiBOb3QgYWxsIHN0ZXBzIGFyZSBuZWNlc3NhcmlseSBwZXJmb3JtZWQKLWVhY2ggdGltZSBhIHRhc2sgaXMgaW52b2tlZCBpbiBhIHByb2Nlc3MuPC9wPgotPC9kaXY+Ci08ZGl2PjwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvc3Vic2NyaXB0LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3N1YnNjcmlwdC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwMzNjODMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvc3Vic2NyaXB0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3N1cGVyc2NyaXB0LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3N1cGVyc2NyaXB0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTM2NzVjYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9zdXBlcnNjcmlwdC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9zdXBwb3J0aW5nbWF0ZXJpYWwuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3N1cHBvcnRpbmdtYXRlcmlhbC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMWM2ZDE1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3N1cHBvcnRpbmdtYXRlcmlhbC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJzZWN1cml0eSIgY29udGVudD0icHVibGljIiAvPgotPG1ldGEgbmFtZT0iUm9ib3RzIiBjb250ZW50PSJpbmRleCxmb2xsb3ciIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIG5hbWU9IkRDLlR5cGUiIGNvbnRlbnQ9ImNvbmNlcHQiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iU3VwcG9ydGluZyBNYXRlcmlhbCIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iZ3VpZGFuY2UuaHRtbCNndWlkYW5jZSIgLz4KLTxtZXRhIG5hbWU9IkRDLkZvcm1hdCIgY29udGVudD0iWEhUTUwiIC8+Ci08bWV0YSBuYW1lPSJEQy5JZGVudGlmaWVyIiBjb250ZW50PSJzdXBwb3J0aW5nbWF0ZXJpYWwiIC8+Ci08bWV0YSBuYW1lPSJEQy5MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiIC8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4vaWJtZGl0YS5jc3MiIC8+Ci08dGl0bGU+U3VwcG9ydGluZyBNYXRlcmlhbDwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0ic3VwcG9ydGluZ21hdGVyaWFsIj48YSBuYW1lPSJzdXBwb3J0aW5nbWF0ZXJpYWwiPjwhLS0gLS0+PC9hPgotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5TdXBwb3J0aW5nIE1hdGVyaWFsPC9oMT4KLTxkaXY+PHA+U3VwcG9ydGluZyBNYXRlcmlhbCBpcyBhIGNhdGNoLWFsbCBmb3Igb3RoZXIgdHlwZXMgb2YgZ3VpZGFuY2UKLW5vdCBzcGVjaWZpY2FsbHkgZGVmaW5lZCBlbHNld2hlcmUuIEl0IGNhbiBiZSByZWxhdGVkIHRvIGFsbCBraW5kcyBvZiBjb250ZW50Ci1lbGVtZW50cywgaW5jbHVkaW5nIG90aGVyIGd1aWRhbmNlIGVsZW1lbnRzLjwvcD4KLTwvZGl2PgotPGRpdj48ZGl2IGNsYXNzPSJyZWxjb25jZXB0cyI+PHN0cm9uZz5SZWxhdGVkIGNvbmNlcHRzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Imd1aWRhbmNlLmh0bWwjZ3VpZGFuY2UiPkd1aWRhbmNlPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3Rhc2suaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3Rhc2suaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWM1NTc3NS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90YXNrLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGh0bWwKLSAgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9InNlY3VyaXR5IiBjb250ZW50PSJwdWJsaWMiIC8+Ci08bWV0YSBuYW1lPSJSb2JvdHMiIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgbmFtZT0iREMuVHlwZSIgY29udGVudD0iY29uY2VwdCIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJUYXNrIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJjcmVhdGVhdGFzay5odG1sI2NyZWF0ZWF0YXNrIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJjcmVhdGVtZXRob2Rjb250ZW50Lmh0bWwiIC8+Ci08bWV0YSBuYW1lPSJEQy5Gb3JtYXQiIGNvbnRlbnQ9IlhIVE1MIiAvPgotPG1ldGEgbmFtZT0iREMuSWRlbnRpZmllciIgY29udGVudD0idGFzayIgLz4KLTxtZXRhIG5hbWU9IkRDLkxhbmd1YWdlIiBjb250ZW50PSJlbi11cyIgLz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi9pYm1kaXRhLmNzcyIgLz4KLTx0aXRsZT5UYXNrPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJ0YXNrIj48YSBuYW1lPSJ0YXNrIj48IS0tIC0tPjwvYT4KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+VGFzazwvaDE+Ci08ZGl2PjxwPkEgVGFzayBpcyBhbiBhc3NpZ25hYmxlIHVuaXQgb2Ygd29yay4gRXZlcnkgVGFzayBpcyBhc3NpZ25lZCB0byBhIHNwZWNpZmljCi1Sb2xlLiBUaGUgZ3JhbnVsYXJpdHkgb2YgYSBUYXNrIGlzIGdlbmVyYWxseSBhIGZldyBob3VycyB0byBhIGZldyBkYXlzIGFuZAotdXN1YWxseSBhZmZlY3RzIG9uZSBvciBvbmx5IGEgc21hbGwgdW1iZXIgb2YgV29yayBQcm9kdWN0cy48L3A+Ci08L2Rpdj4KLTxkaXY+PGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJjcmVhdGVhdGFzay5odG1sI2NyZWF0ZWF0YXNrIj5DcmVhdGUgYSBUYXNrPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJjcmVhdGVtZXRob2Rjb250ZW50Lmh0bWwiPkNyZWF0ZSBNZXRob2QgQ29udGVudDwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90ZW1wbGF0ZS5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdGVtcGxhdGUuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTU1NzExMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90ZW1wbGF0ZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJzZWN1cml0eSIgY29udGVudD0icHVibGljIiAvPgotPG1ldGEgbmFtZT0iUm9ib3RzIiBjb250ZW50PSJpbmRleCxmb2xsb3ciIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIG5hbWU9IkRDLlR5cGUiIGNvbnRlbnQ9ImNvbmNlcHQiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iVGVtcGxhdGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9Imd1aWRhbmNlLmh0bWwjZ3VpZGFuY2UiIC8+Ci08bWV0YSBuYW1lPSJEQy5Gb3JtYXQiIGNvbnRlbnQ9IlhIVE1MIiAvPgotPG1ldGEgbmFtZT0iREMuSWRlbnRpZmllciIgY29udGVudD0idGVtcGxhdGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiIC8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4vaWJtZGl0YS5jc3MiIC8+Ci08dGl0bGU+VGVtcGxhdGU8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InRlbXBsYXRlIj48YSBuYW1lPSJ0ZW1wbGF0ZSI+PCEtLSAtLT48L2E+Ci0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPlRlbXBsYXRlPC9oMT4KLTxkaXY+PHA+QSBUZW1wbGF0ZSBpcyBhIHNwZWNpZmljIHR5cGUgb2YgZ3VpZGFuY2UgdGhhdCBwcm92aWRlcyBhIHdvcmsgcHJvZHVjdAotd2l0aCBhIHByZWRlZmluZWQgdGFibGUgb2YgY29udGVudHMsIHNlY3Rpb25zLCBwYWNrYWdlcywgYW5kL29yIGhlYWRpbmdzLAotYSBzdGFuZGFyZGl6ZWQgZm9ybWF0LCBhcyB3ZWxsIGFzIGRlc2NyaXB0aW9ucyBvZiBob3cgdGhlIHNlY3Rpb25zCi1hbmQgcGFja2FnZXMgYXJlIHN1cHBvc2VkIHRvIGJlIHVzZWQgYW5kIGNvbXBsZXRlZC4gVGVtcGxhdGVzIGNhbiBiZSBwcm92aWRlZAotZm9yIGRvY3VtZW50cyBhcyB3ZWxsIGFzIGNvbmNlcHR1YWwgbW9kZWxzIG9yIHBoeXNpY2FsIGRhdGEgc3RvcmVzLjwvcD4KLTwvZGl2PgotPGRpdj48ZGl2IGNsYXNzPSJyZWxjb25jZXB0cyI+PHN0cm9uZz5SZWxhdGVkIGNvbmNlcHRzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Imd1aWRhbmNlLmh0bWwjZ3VpZGFuY2UiPkd1aWRhbmNlPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3Rlcm1kZWZpbml0aW9uLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90ZXJtZGVmaW5pdGlvbi5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZDVhMzU2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3Rlcm1kZWZpbml0aW9uLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGh0bWwKLSAgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9InNlY3VyaXR5IiBjb250ZW50PSJwdWJsaWMiIC8+Ci08bWV0YSBuYW1lPSJSb2JvdHMiIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgbmFtZT0iREMuVHlwZSIgY29udGVudD0iY29uY2VwdCIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJUZXJtIERlZmluaXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9Imd1aWRhbmNlLmh0bWwjZ3VpZGFuY2UiIC8+Ci08bWV0YSBuYW1lPSJEQy5Gb3JtYXQiIGNvbnRlbnQ9IlhIVE1MIiAvPgotPG1ldGEgbmFtZT0iREMuSWRlbnRpZmllciIgY29udGVudD0idGVybWRlZmluaXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiIC8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4vaWJtZGl0YS5jc3MiIC8+Ci08dGl0bGU+VGVybSBEZWZpbml0aW9uPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJ0ZXJtZGVmaW5pdGlvbiI+PGEgbmFtZT0idGVybWRlZmluaXRpb24iPjwhLS0gLS0+PC9hPgotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5UZXJtIERlZmluaXRpb248L2gxPgotPGRpdj48cD5UZXJtIGRlZmluaXRpb25zIGRlZmluZXMgYSBzcGVjaWZpYyB0ZXJtLCBjb25jZXB0LCBvciBvdGhlciBpZGVhIHJlbGV2YW50Ci10byBtZXRob2QgYW5kIHByb2Nlc3MgY29udGVudC4gQSB0ZXJtIGRlZmluaXRpb24gaXMgbm90IGRpcmVjdGx5IHJlbGF0ZWQgdG8KLWFueSBjb250ZW50IGVsZW1lbnRzLCBidXQgcmVsYXRpb25zaGlwcyBhcmUgZGVyaXZlZCB3aGVuIHRoZSB0ZXJtIGlzIHVzZWQKLWluIHRoZSBkZXNjcmlwdGlvbiB0ZXh0IGluIGEgY29udGVudCBlbGVtZW50LjwvcD4KLTwvZGl2PgotPGRpdj48ZGl2IGNsYXNzPSJyZWxjb25jZXB0cyI+PHN0cm9uZz5SZWxhdGVkIGNvbmNlcHRzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Imd1aWRhbmNlLmh0bWwjZ3VpZGFuY2UiPkd1aWRhbmNlPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3Rvb2xtZW50b3IuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3Rvb2xtZW50b3IuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjEzZWY0MC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90b29sbWVudG9yLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGh0bWwKLSAgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9InNlY3VyaXR5IiBjb250ZW50PSJwdWJsaWMiIC8+Ci08bWV0YSBuYW1lPSJSb2JvdHMiIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgbmFtZT0iREMuVHlwZSIgY29udGVudD0iY29uY2VwdCIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJUb29sIE1lbnRvciIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iZ3VpZGFuY2UuaHRtbCNndWlkYW5jZSIgLz4KLTxtZXRhIG5hbWU9IkRDLkZvcm1hdCIgY29udGVudD0iWEhUTUwiIC8+Ci08bWV0YSBuYW1lPSJEQy5JZGVudGlmaWVyIiBjb250ZW50PSJ0b29sbWVudG9yIiAvPgotPG1ldGEgbmFtZT0iREMuTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIiAvPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuL2libWRpdGEuY3NzIiAvPgotPHRpdGxlPlRvb2wgTWVudG9yPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJ0b29sbWVudG9yIj48YSBuYW1lPSJ0b29sbWVudG9yIj48IS0tIC0tPjwvYT4KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+VG9vbCBNZW50b3I8L2gxPgotPGRpdj48cD5BIFRvb2wgTWVudG9yIGlzIGEgc3BlY2lmaWMgdHlwZSBvZiBndWlkYW5jZSB0aGF0IHNob3dzIGhvdyB0byB1c2UgYSBzcGVjaWZpYwotdG9vbCB0byBhY2NvbXBsaXNoIGEgcGllY2Ugb2Ygd29yay48L3A+Ci08L2Rpdj4KLTxkaXY+PGRpdiBjbGFzcz0icmVsY29uY2VwdHMiPjxzdHJvbmc+UmVsYXRlZCBjb25jZXB0czwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJndWlkYW5jZS5odG1sI2d1aWRhbmNlIj5HdWlkYW5jZTwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90dXRvcmlhbHMvdHV0b3JpYWxfMV9leF8xLmh0bSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3R1dG9yaWFscy90dXRvcmlhbF8xX2V4XzEuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZjkzMGI4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3R1dG9yaWFscy90dXRvcmlhbF8xX2V4XzEuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIKLSJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci0KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+VW50aXRsZWQgRG9jdW1lbnQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxib2R5PgotPGgyPjxhPkV4ZXJjaXNlIDE6IEV4cGxvcmUgdGhlIFVzZXIgSW50ZXJmYWNlIDwvYT48L2gyPgotPHA+VGhlIHB1cnBvc2Ugb2YgdGhpcyBleGVyY2lzZSBpcyB0byBiZWNvbWUgZmFtaWxpYXIgd2l0aCB0aGUgbWFqb3IgcGFydHMgb2YgdGhlIEVjbGlwc2UgUHJvY2VzcyBGcmFtZXdvcmsgQ29tcG9zZXIgdXNlciBpbnRlcmZhY2UuIDwvcD4KLTxvbD4KLSAgPGxpPgotICAgIDxwPlN3aXRjaCBwZXJzcGVjdGl2ZS4gVGhlIGN1cnJlbnQgcGVyc3BlY3RpdmUgaXMgZGlzcGxheWVkIG5lYXIgdGhlIHRvcCByaWdodCBvZiB0aGUgc2NyZWVuLiBZb3Ugd2lsbCBzZWUgZWl0aGVyIEF1dGhvcmluZyBvciBCcm93c2luZy4gQ2xpY2sgb24gdGhlIDxzdHJvbmc+T3BlbiBQZXJzcGVjdGl2ZTwvc3Ryb25nPiBpY29uLCBhbmQgc2VsZWN0IHRoZSBvdGhlciBwZXJzcGVjdGl2ZS4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+RXhwbG9yZSB0aGUgPHN0cm9uZz5MaWJyYXJ5PC9zdHJvbmc+IDxzdHJvbmc+Vmlldzwvc3Ryb25nPi4gVGhlIGxpYnJhcnkgdmlldyBpcyBhdmFpbGFibGUgaW4gYXV0aG9yaW5nIHBlcnNwZWN0aXZlIJYgaXQgaXMgbm90IHNob3duIGluIHRoZSBicm93c2luZyBwZXJzcGVjdGl2ZS4gVGhlIExpYnJhcnkgVmlldyBzaG93cyB5b3UgYWxsIHRoZSBjb250ZW50IGluIHRoZSBjdXJyZW50IGxpYnJhcnkuIFRoZSBoaWdoZXN0IGxldmVsIGNvbnRlbnQgdW5pdCBpcyBhIHBsdWdpbi4gQ2xpY2sgb24gc29tZSA8c3Ryb25nPis8L3N0cm9uZz4gc2lnbnMgYW5kIGV4cGxvcmUgdGhlIGNvbnRlbnQuIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPkRyaWxsIGRvd24gaW50byBhIHBsdWdpbiBhcyBmb2xsb3dzOiA8c3Ryb25nPk1ldGhvZCBDb250ZW50ICZndDsgQ29udGVudCBQYWNrYWdlcyAmZ3Q7IFthbnldICZndDsgVGFza3M8L3N0cm9uZz4uIERvdWJsZSBjbGljayBvbiBhIHRhc2suIFRoZSBUYXNrIEVkaXRvciBpcyBkaXNwbGF5ZWQgb24gdGhlIHJpZ2h0IG9mIHRoZSBzY3JlZW4uIFRoZXJlIGFyZSBzZXBhcmF0ZSBlZGl0b3JzIGZvciB0aGUgZGlmZmVyZW50IHR5cGVzIG9mIGNvbnRlbnQgdGhhdCB5b3UgY2FuIGNyZWF0ZSBpbiBhIGxpYnJhcnkuIEVhY2ggZWRpdG9yIGhhcyBhIHNlcmllcyBvZiB0YWJzIGFuZCBhIG51bWJlciBvZiBmb3JtIGVsZW1lbnRzIG9uIGVhY2ggdGFiLiBZb3UgY2FuIGZpbmQgb3V0IG1vcmUgYWJvdXQgdGhlc2UgaW4gdGhlIDx1PkNyZWF0ZSBNZXRob2QgQ29udGVudCA8L3U+dHV0b3JpYWwuIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPkNsaWNrIHRoZSA8c3Ryb25nPlByZXZpZXcgPC9zdHJvbmc+IHRhYi4gQSBwcmV2aWV3IG9mIGFuIEhUTUwgcGFnZSBpcyBkaXNwbGF5ZWQuIFRoaXMgaXMgd2hhdCB0aGUgc2VsZWN0ZWQgZWxlbWVudCB3aWxsIGxvb2sgbGlrZSBpbiBhIHB1Ymxpc2hlZCB3ZWIgc2l0ZS4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+U3dpdGNoIHRvIHRoZSA8c3Ryb25nPmJyb3dzaW5nIHBlcnNwZWN0aXZlPC9zdHJvbmc+LiBUaGUgQ29uZmlndXJhdGlvbiBWaWV3IGlzIG5vdyBkaXNwbGF5ZWQuIFRoZSBjb25maWd1cmF0aW9uIHZpZXcgYWx3YXlzIGhhcyB0aGUgc2FtZSBzdHJ1Y3R1cmUgYnV0IHRoZSBjb250ZW50IGNoYW5nZXMgYmFzZWQgb24gd2hpY2ggY29uZmlndXJhdGlvbiBpcyBjdXJyZW50bHkgc2VsZWN0ZWQuIERyaWxsIGRvd24gaW50byB0aGUgRGlzY2lwbGluZXMgZm9sZGVyIHVudGlsIHlvdSBnZXQgdG8gdGFza3MgYW5kIGNsaWNrIG9uIGEgdGFzay4gVGhlIEhUTUwgcHJldmlldyBvZiB0aGUgc2VsZWN0ZWQgaXRlbSBpcyBzaG93biBvbiB0aGUgcmlnaHQgb2YgdGhlIHNjcmVlbi4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+U3dpdGNoIGNvbmZpZ3VyYXRpb25zLiBUaGUgY3VycmVudCBjb25maWd1cmF0aW9uIGlzIGRpc3BsYXllZCBpbiB0aGUgc2VsZWN0aW9uIGJveCBiZWxvdyB0aGUgbWFpbiBtZW51IGJhci4gU2VsZWN0IGEgY29uZmlndXJhdGlvbiBmcm9tIHRoZSBkcm9wIGRvd24gbGlzdC4gWW91IHdpbGwgc2VlIHRoZSBDb25maWd1cmF0aW9uIFZpZXcgcmVmcmVzaCB3aGVuIHlvdSBkbyB0aGlzLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT5Td2l0Y2ggdG8gdGhlIDxzdHJvbmc+YXV0aG9yaW5nPC9zdHJvbmc+IDxzdHJvbmc+cGVyc3BlY3RpdmU8L3N0cm9uZz4uIERyaWxsIGRvd24gaW50byBhIHBsdWdpbiBhcyBmb2xsb3dzOiA8c3Ryb25nPlByb2Nlc3NlcyAmZ3Q7IENhcGFiaWxpdHkgUGF0dGVybnMgJmd0OyBbYW55XSAmZ3Q7IENhcGFiaWxpdHkgUGF0dGVybnM8L3N0cm9uZz4uIE5vdGUgdGhhdCBub3QgYWxsIHBsdWdpbnMgaGF2ZSBjYXBhYmlsaXR5IHBhdHRlcm5zLiBEb3VibGUtY2xpY2sgb24gYSBjYXBhYmlsaXR5IHBhdHRlcm4uIFRoZSByaWdodCBzaWRlIG9mIHRoZSBzY3JlZW4gaXMgbm93IGZpbGxlZCB3aXRoIHRoZSBDYXBhYmlsaXR5IFBhdHRlcm4gZWRpdG9yIGFuZCB0aGUgUHJvcGVydGllcyBWaWV3LiBZb3UgY2FuIGZpbmQgb3V0IG1vcmUgYWJvdXQgdGhlc2UgaW4gdGhlIDx1Pldvcmtpbmcgd2l0aCBQcm9jZXNzZXM8L3U+IHR1dG9yaWFsLjwvbGk+Ci08L29sPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHV0b3JpYWxzL3R1dG9yaWFsXzFfZXhfMi5odG0gYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90dXRvcmlhbHMvdHV0b3JpYWxfMV9leF8yLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDA3YTkyMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90dXRvcmlhbHMvdHV0b3JpYWxfMV9leF8yLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iCi0iaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotCi08aHRtbD4KLTxoZWFkPgotPHRpdGxlPlVudGl0bGVkIERvY3VtZW50PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPC9oZWFkPgotCi08Ym9keT4KLTxoMj48YT5FeGVyY2lzZSAyOiBCcm93c2UgTWV0aG9kIENvbnRlbnQgdmlhIEJyb3dzaW5nIFBlcnNwZWN0aXZlIDwvYT48L2gyPgotPHA+VGhlIHB1cnBvc2Ugb2YgdGhpcyBleGVyY2lzZSBpcyB0byBiZWNvbWUgZmFtaWxpYXIgd2l0aCBicm93c2luZyBtZXRob2QgY29udGVudCBpbiBhIGxpYnJhcnkgdXNpbmcgdGhlIGJyb3dzaW5nIHBlcnNwZWN0aXZlLiA8L3A+Ci08b2w+Ci0gIDxsaT4KLSAgICA8cD5TZWxlY3QgPHN0cm9uZz5SVVAgZm9yIFNtYWxsIFByb2plY3RzIDwvc3Ryb25nPiBpbiB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uIGRyb3AtZG93biBsaXN0IGxvY2F0ZWQgdW5kZXJuZWF0aCB0aGUgbWFpbiBtZW51IGJhci4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+U2VsZWN0IDxzdHJvbmc+QnJvd3NpbmcgcGVyc3BlY3RpdmU8L3N0cm9uZz4uIFRoZSBDb25maWd1cmF0aW9uIFZpZXcgYXBwZWFycyBvbiB0aGUgbGVmdC4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+VG8gdmlldyBhIFRhc2ssIGNsaWNrIDxzdHJvbmc+RGlzY2lwbGluZXMgJmd0OyBSVVAgRGlzY2lwbGluZXMgJmd0OyBBbmFseXNpcyAmYW1wOyBEZXNpZ24gJmd0OyBEZXNpZ24gdGhlIFVzZXIgSW50ZXJmYWNlPC9zdHJvbmc+LiBBIHByZXZpZXcgb2YgdGhlIHB1Ymxpc2hlZCBXZWIgcGFnZSBmb3IgdGhlIHNlbGVjdGVkIGVsZW1lbnQgaXMgZGlzcGxheWVkLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD5DbGljayB0aGUgPHN0cm9uZz5QcmltYXJ5IFBlcmZvcm1lciA8L3N0cm9uZz5saW5rIGluIHRoZSByZWxhdGlvbnNoaXBzIHNlY3Rpb24uIFRoaXMgd2lsbCBzaG93IHRoZSBwcmV2aWV3IHBhZ2UgZm9yIHRoZSBVc2VyLUludGVyZmFjZSBEZXNpZ25lci4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+WW91IGNhbiBjbGljayBvbiBhbnkgbGlua3MgaW4gdGhlIHByZXZpZXcgYW5kIHVzZSB0aGUgYmFjayBpY29uIGluIHRoZSBwcmV2aWV3IHRvb2xiYXIgdG8gcmV0dXJuIHRvIHByZXZpb3VzIHBhZ2VzLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD5WaWV3IG90aGVyIGVsZW1lbnRzIGluIHRoZSBDb25maWd1cmF0aW9uIFZpZXcgdHJlZSCWIGUuZy4gdW5kZXIgRG9tYWlucywgUm9sZSBTZXRzLCBldGMuIDwvcD4KLSAgPC9saT4KLTwvb2w+Ci08aDE+Jm5ic3A7PC9oMT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3R1dG9yaWFscy90dXRvcmlhbF8xX2V4XzMuaHRtIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHV0b3JpYWxzL3R1dG9yaWFsXzFfZXhfMy5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlMTFhODEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHV0b3JpYWxzL3R1dG9yaWFsXzFfZXhfMy5odG0KKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIgotImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLQotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT5VbnRpdGxlZCBEb2N1bWVudDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTwvaGVhZD4KLQotPGJvZHk+Ci08aDI+PGE+RXhlcmNpc2UgMzogQnJvd3NlIFByb2Nlc3MgQ29udGVudCB2aWEgQnJvd3NpbmcgUGVyc3BlY3RpdmUgPC9hPjwvaDI+Ci08cD4gVGhlIHB1cnBvc2Ugb2YgdGhpcyBleGVyY2lzZSBpcyB0byBiZWNvbWUgZmFtaWxpYXIgd2l0aCBicm93c2luZyBwcm9jZXNzIGNvbnRlbnQgaW4gYSBsaWJyYXJ5IHVzaW5nIHRoZSBicm93c2luZyBwZXJzcGVjdGl2ZSA8L3A+Ci08b2w+Ci0gIDxsaT4KLSAgICA8cD5NYWtlIHN1cmUgeW91IGFyZSBpbiB0aGUgQnJvd3NpbmcgcGVyc3BlY3RpdmUuIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPlRvIHZpZXcgYSBDYXBhYmlsaXR5IFBhdHRlcm4sIGNsaWNrIDxzdHJvbmc+UHJvY2Vzc2VzICZndDsgQ2FwYWJpbGl0eSBQYXR0ZXJucyAmZ3Q7IENsYXNzaWMgUlVQICZndDsgRGlzY2lwbGluZSBXb3JrZmxvd3MgJmd0OyBBbmFseXNpcyBhbmQgRGVzaWduPC9zdHJvbmc+LiBBIHByZXZpZXcgb2YgdGhlIHB1Ymxpc2hlZCBXZWIgcGFnZSBmb3IgdGhlIHNlbGVjdGVkIENhcGFiaWxpdHkgUGF0dGVybiBpcyBkaXNwbGF5ZWQuIDwvcD4KLSAgPC9saT4KLSAgPGxpPkEgQ2FwYWJpbGl0eSBQYXR0ZXJuIGNvbnRhaW5zIGEgbGFyZ2UgYW1vdW50IG9mIGluZm9ybWF0aW9uIGFuZCBpcyBkaXNwbGF5ZWQgb3ZlciBmb3VyIHRhYnMgliBEZXNjcmlwdGlvbiwgV29yayBCcmVha2Rvd24gU3RydWN0dXJlLCBXb3JrIFByb2R1Y3QgVXNhZ2UgYW5kIFRlYW0gQWxsb2NhdGlvbi4gRXhwbG9yZSB0aGUgaW5mb3JtYXRpb24gb24gZWFjaCB0YWIuIAotICAgIDxwPk5vdGUgdGhhdCB3aGVuIHlvdSBjbGljayBvbiBhIHRhc2sgaW4gdGhlIFdvcmsgQnJlYWtkb3duIFN0cnVjdHVyZSB0YWIgeW91IHByZXZpZXcgYSCRVGFzayBEZXNjcmlwdG9yJy4gQSBUYXNrIERlc2NyaXB0b3IgaXMgYSB0YXNrIHdpdGhpbiBhIHByb2Nlc3MuIFRoZSB0YXNrIGRlc2NyaXB0b3IgcGFnZSBoYXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHRhc2sgYXMgaXQgaXMgdXNlZCBhdCBhIHNwZWNpZmljIHBvaW50IGluIGEgcHJvY2Vzcy4gVGhlIHRhc2sgZGVzY3JpcHRvciBoYXMgYSBsaW5rIHRvIHRoZSBUYXNrIG9uIHdoaWNoIGl0IGlzIGJhc2VkLiA8L3A+Ci0gICAgPHA+Q2xpY2tpbmcgb24gYSByb2xlIG9yIHdvcmsgcHJvZHVjdCBpbiBhIHRhc2sgZGVzY3JpcHRvciB0YWtlcyB5b3UgdG8gYSBSb2xlIERlc2NyaXB0b3Igb3IgYSBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvci4gVGhlc2UgcHJvdmlkZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcm9sZSBvciB3b3JrIHByb2R1Y3QgYXQgdGhlIHNhbWUgcG9pbnQgaW4gdGhlIHByb2Nlc3MgYW5kIGFsc28gcHJvdmlkZSBsaW5rcyBiYWNrIHRvIHRoZSBjb3JlIG1ldGhvZCBlbGVtZW50IG9uIHdoaWNoIHRoZXkgYXJlIGJhc2VkLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT5UbyB2aWV3IGEgRGVsaXZlcnkgUHJvY2VzcywgY2xpY2sgPHN0cm9uZz5Qcm9jZXNzZXMgJmd0OyBEZWxpdmVyeSBQcm9jZXNzZXMgJmd0OyBDbGFzc2ljIFJVUCBMaWZlY3ljbGU8L3N0cm9uZz4uIFRoZSBkaXNwbGF5IGZvciBhIERlbGl2ZXJ5IFByb2Nlc3MgaXMgc2ltaWxhciB0byBhIENhcGFiaWxpdHkgUGF0dGVybi4gPC9saT4KLTwvb2w+Ci08cD4mbmJzcDs8L3A+Ci08aDE+Jm5ic3A7PC9oMT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3R1dG9yaWFscy90dXRvcmlhbF8xX2V4XzQuaHRtIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHV0b3JpYWxzL3R1dG9yaWFsXzFfZXhfNC5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiNmY0NWIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHV0b3JpYWxzL3R1dG9yaWFsXzFfZXhfNC5odG0KKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIgotImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLQotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT5VbnRpdGxlZCBEb2N1bWVudDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTwvaGVhZD4KLQotPGJvZHk+Ci08aDI+PGE+RXhlcmNpc2UgNDogQnJvd3NlIE1ldGhvZCBDb250ZW50IHZpYSBBdXRob3JpbmcgUGVyc3BlY3RpdmUgPC9hPjwvaDI+Ci08cD4gVGhlIHB1cnBvc2Ugb2YgdGhpcyBleGVyY2lzZSBpcyB0byBiZWNvbWUgZmFtaWxpYXIgd2l0aCBicm93c2luZyBsaWJyYXJ5IGNvbnRlbnQgd2hpbGUgaW4gdGhlIGF1dGhvcmluZyBwZXJzcGVjdGl2ZS4gPC9wPgotPG9sPgotICA8bGk+Ci0gICAgPHA+U3dpdGNoIHRvIEF1dGhvcmluZyBwZXJzcGVjdGl2ZS4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+SW4gdGhlIExpYnJhcnkgVmlldywgbmF2aWdhdGUgdG8gPHN0cm9uZz5SVVAgJmd0OyBNZXRob2QgQ29udGVudCAmZ3Q7IENvbnRlbnQgUGFja2FnZXMgJmd0OyBEZXNpZ24gJmd0OyBHVUkgRGVzaWduICZndDsgUm9sZTwvc3Ryb25nPnMuIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPlNlbGVjdCBhIHJvbGUgKGRvdWJsZSBjbGljaykgYW5kIHVzZSB0aGUgcHJldmlldyB0YWIgYXQgdGhlIGJvdHRvbSBvZiB0aGUgcm9sZSB3aW5kb3cgdG8gdmlldyB0aGUgaHRtbCByZXByZXNlbnRhdGlvbiBvZiB0aGF0IHJvbGUgYW5kIGl0cyByZWxhdGlvbnNoaXBzIHRvIG90aGVyIG1ldGhvZCBlbGVtZW50cy4gVmlldyB0aGUgb3RoZXIgdGFicyB0byBzZWUgdGhlIGluZm9ybWF0aW9uIHByZXNlbnRlZCB3aGVuIGF1dGhvcmluZyB0aGUgbWV0aG9kIGNvbnRlbnQgYW5kIHJlbGF0aW9uc2hpcHMgZm9yIGEgcm9sZS4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+UmVwZWF0IHN0ZXAgMyB0byBwcmV2aWV3IGEgPHN0cm9uZz50YXNrPC9zdHJvbmc+ICwgPHN0cm9uZz53b3JrIHByb2R1Y3Q8L3N0cm9uZz4sIGFuZCA8c3Ryb25nPmd1aWRhbmNlIGVsZW1lbnQ8L3N0cm9uZz4uIDwvcD4KLSAgPC9saT4KLTwvb2w+Ci08cD4mbmJzcDs8L3A+Ci08aDE+Jm5ic3A7PC9oMT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3R1dG9yaWFscy90dXRvcmlhbF8xX2V4XzUuaHRtIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHV0b3JpYWxzL3R1dG9yaWFsXzFfZXhfNS5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxNDUxYzcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHV0b3JpYWxzL3R1dG9yaWFsXzFfZXhfNS5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIgotImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLQotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT5VbnRpdGxlZCBEb2N1bWVudDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+Ci08IS0tCi0uc3R5bGUxIHtmb250LWZhbWlseTogIkNvdXJpZXIgTmV3IiwgQ291cmllciwgbW9ub30KLS0tPgotPC9zdHlsZT4KLTwvaGVhZD4KLQotPGJvZHk+Ci08aDI+PGE+RXhlcmNpc2UgNTogU2VhcmNoIGZvciBNZXRob2QgQ29udGVudCA8L2E+PC9oMj4KLTxwPlRoZSBwdXJwb3NlIG9mIHRoaXMgZXhlcmNpc2UgaXMgdG8gYmVjb21lIGZhbWlsaWFyIHdpdGggdGhlIHNlYXJjaCBmdW5jdGlvbiBpbiBFY2xpcHNlIFByb2Nlc3MgRnJhbWV3b3JrIENvbXBvc2VyLiA8L3A+Ci08b2w+Ci0gIDxsaT4KLSAgICA8cD5Td2l0Y2ggdG8gPHN0cm9uZz5BdXRob3JpbmcgPC9zdHJvbmc+cGVyc3BlY3RpdmUuIDwvcD4KLSAgPC9saT4KLSAgPGxpPk9wZW4gdXAgdGhlIFNlYXJjaCBkaWFsb2cgYnkgOiA8L2xpPgotICA8YmxvY2txdW90ZT4KLSAgICA8cD4mIzE0OTsmbmJzcDsgQ2xpY2tpbmcgb24gdGhlIEZsYXNobGlnaHQgaWNvbiBpbiB0aGUgdG9vbGJhciA8L3A+Ci0gICAgPGJsb2NrcXVvdGU+Ci0gICAgICA8YmxvY2txdW90ZT4KLSAgICAgICAgPHA+PHN0cm9uZz5PciA8L3N0cm9uZz48L3A+Ci0gICAgICA8L2Jsb2NrcXVvdGU+Ci0gICAgPC9ibG9ja3F1b3RlPgotICAgIDxwPiYjMTQ5OyZuYnNwOyBTZWxlY3RpbmcgPHN0cm9uZz5TZWFyY2ggLyBTZWFyY2g8L3N0cm9uZz4gaW4gdGhlIG1haW4gbWVudS4gPC9wPgotICA8L2Jsb2NrcXVvdGU+Ci0gIDxsaT4KLSAgICA8cD5DbGljayBvbiB0aGUgPHN0cm9uZz5NZXRob2QgU2VhcmNoPC9zdHJvbmc+IHRhYi4gRW50ZXIgPHNwYW4gY2xhc3M9InN0eWxlMSI+RGF0YWJhc2U8L3NwYW4+IGluIHRoZSB0ZXh0IGJveCBhbmQgY2xpY2sgb24gPHN0cm9uZz5TZWFyY2g8L3N0cm9uZz4uIEl0IHdpbGwgdGFrZSBhIGZldyBzZWNvbmRzIHRvIGZpbmQgYWxsIHRoZSBoaXRzLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD5EcmlsbCBkb3duIGluIHRoZSBzZWFyY2ggcmVzdWx0cyBhbmQgZG91YmxlLWNsaWNrIG9uIGFuIGVsZW1lbnQuIFRoZSBlZGl0b3IgZm9yIHRoZSBzZWxlY3RlZCBpdGVtIGlzIG9wZW5lZC4gSWYgeW91IGhhdmUgPHN0cm9uZz5MaW5rIHdpdGggRWRpdG9yPC9zdHJvbmc+IHNlbGVjdGVkIGluIHRoZSBsaWJyYXJ5IHZpZXcsIHRoZSBsaWJyYXJ5IHZpZXcgZGlzcGxheSBjaGFuZ2VzIHRvIHNob3cgeW91IHdoZXJlIHRoZSBzZWxlY3RlZCBpdGVtIGlzIGluIHRoZSBsaWJyYXJ5LiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD5PcGVuIHRoZSBzZWFyY2ggZGlhbG9nIGFnYWluIGFuZCByZXBlYXQgdGhlIHNhbWUgc2VhcmNoIGJ1dCB0aGlzIHRpbWUgcmVkdWNlIHRoZSBzY29wZSB0byBqdXN0IGxvb2sgZm9yIHRhc2tzLiBVbmNoZWNrIGFsbCB0aGUgb3RoZXIgY29udGVudCB0eXBlcyBpbiB0aGUgc2NvcGUgcGFuZWwuIFRoZSBzZWFyY2ggc2hvdWxkIGJlIHF1aWNrZXIgYW5kIHJlc3VsdCBpbiBmZXdlciBoaXRzLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD5PcGVuIHRoZSBzZWFyY2ggZGlhbG9nIGFnYWluIGFuZCByZXBlYXQgdGhlIHNhbWUgc2VhcmNoIGJ1dCB0aGlzIHRpbWUgYWRkIDxzdHJvbmc+cnVwXyo8L3N0cm9uZz4gYXMgYSBmaWxlIG5hbWUgcGF0dGVybi4gTWFrZSBzdXJlIHRoZSBzY29wZSBpcyBzdGlsbCBzZXQgdG8gdGFza3MuIFRoZSBzZWFyY2ggc2hvdWxkIGJlIGV2ZW4gcXVpY2tlciBhbmQgcmVzdWx0IGluIGV2ZW4gZmV3ZXIgaGl0cy4gPC9wPgotICA8L2xpPgotICA8bGk+RXhwZXJpbWVudCB3aXRoIG90aGVyIE1ldGhvZCBTZWFyY2hlcy48L2xpPgotPC9vbD4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3R1dG9yaWFscy90dXRvcmlhbF8xX2ludHJvLmh0bSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3R1dG9yaWFscy90dXRvcmlhbF8xX2ludHJvLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjVhMmRlYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90dXRvcmlhbHMvdHV0b3JpYWxfMV9pbnRyby5odG0KKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIgotImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLQotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT5VbnRpdGxlZCBEb2N1bWVudDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTwvaGVhZD4KLQotPGJvZHk+Ci08aDE+PGE+VHV0b3JpYWw6IAotCi0KLSBOYXZpZ2F0ZSB0aGUgVXNlciBJbnRlcmZhY2UKLQotPC9hPjwvaDE+Ci08aDI+PGE+SW50cm9kdWN0aW9uIDwvYT48L2gyPgotPHA+VGhlIHB1cnBvc2Ugb2YgdGhpcyB0dXRvcmlhbCBpcyB0byBnZXQgZmFtaWxpYXIgd2l0aCB1c2VyIGludGVyZmFjZSBhbmQgdGhlIHdheSBtZXRob2QgYW5kIHByb2Nlc3MgY29udGVudCBpcyBzdG9yZWQgYW5kIHZpZXdlZC4gPC9wPgotPHA+QSBNZXRob2QgTGlicmFyeSBjb25zaXN0cyBvZiBhIHNlcmllcyBvZiA8c3Ryb25nPjxlbT5tZXRob2QgcGx1Zy1pbnMuIDwvZW0+PC9zdHJvbmc+V2l0aGluIGEgcGx1Z2luLCBjb250ZW50IGlzIHNlcGFyYXRlZCBpbnRvIDxzdHJvbmc+PGVtPk1ldGhvZCBDb250ZW50IDwvZW0+PC9zdHJvbmc+ICh0YXNrcywgcm9sZXMsIHdvcmsgcHJvZHVjdHMgYW5kIGd1aWRhbmNlKSBhbmQgPHN0cm9uZz48ZW0+UHJvY2Vzc2VzIDwvZW0+PC9zdHJvbmc+IChjYXBhYmlsaXR5IHBhdHRlcm5zIGFuZCBkZWxpdmVyeSBwcm9jZXNzZXMpLiBUaGlzIGlzIGhvdyB0aGUgTGlicmFyeSBWaWV3LCB3aGljaCBzaG93cyBhbGwgdGhlIGNvbnRlbnQgaW4gdGhlIGxpYnJhcnkgaXMgb3JnYW5pemVkLiA8L3A+Ci08cD5BIGNvbmZpZ3VyYXRpb24gaXMgYSBzdWJzZXQgb2YgdGhlIG1ldGhvZCBsaWJyYXJ5IGNvbnRlbnQuIFRoZSBDb25maWd1cmF0aW9uIFZpZXcgc2hvd3MgdGhlIGNvbnRlbnQgaW4gdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBjb25maWd1cmF0aW9uLiBPbmNlIGEgY29uZmlndXJhdGlvbiBpcyBzZWxlY3RlZCwgdGhlIGNvbmZpZ3VyYXRpb24gdmlldyBpcyByZWZyZXNoZWQgd2l0aCB0aGUgY29udGVudCBmcm9tIHRoZSBjb25maWd1cmF0aW9uLiBUaGUgY29udGVudCBpbiB0aGUgY29uZmlndXJhdGlvbiB2aWV3IGlzIGFsd2F5cyBsYWlkIG91dCB1c2luZyB0aGUgc2FtZSBzZXQgb2YgZm9sZGVycyByZWdhcmRsZXNzIG9mIHdoaWNoIGNvbmZpZ3VyYXRpb24gaXMgc2VsZWN0ZWQuIDwvcD4KLTxwPkVQRiBDb21wb3NlciBoYXMgdHdvIJFwZXJzcGVjdGl2ZXMnLiBUaGUgQXV0aG9yaW5nIFBlcnNwZWN0aXZlIHByb3ZpZGVzIGZ1bGwgYnJvd3NpbmcgYW5kIGF1dGhvcmluZyBjYXBhYmlsaXRpZXMuIFRoZSBCcm93c2luZyBQZXJzcGVjdGl2ZSBhbGxvd3MgYnJvd3NpbmcgY29udGVudCBpbiB0aGUgY3VycmVudGx5IHNlbGVjdGVkIGNvbmZpZ3VyYXRpb24uIDwvcD4KLTxwPkNvbnRlbnQgaXMgY3JlYXRlZCBhbmQgbWFpbnRhaW5lZCB1c2luZyBhIHNlcmllcyBvZiA8c3Ryb25nPjxlbT5lZGl0b3JzLiA8L2VtPjwvc3Ryb25nPjwvcD4KLTxoMj4mbmJzcDs8L2gyPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHV0b3JpYWxzL3R1dG9yaWFsXzJfZXhfMS5odG0gYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90dXRvcmlhbHMvdHV0b3JpYWxfMl9leF8xLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGQ0MWM4Mi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90dXRvcmlhbHMvdHV0b3JpYWxfMl9leF8xLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iCi0iaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotCi08aHRtbD4KLTxoZWFkPgotPHRpdGxlPlVudGl0bGVkIERvY3VtZW50PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KLTwhLS0KLS5zdHlsZTEge2ZvbnQtZmFtaWx5OiAiQ291cmllciBOZXciLCBDb3VyaWVyLCBtb25vfQotLS0+Ci08L3N0eWxlPgotPC9oZWFkPgotCi08Ym9keT4KLTxoMj48YT48L2E+PGE+RXhlcmNpc2UgMTogQ3JlYXRlIG9yIE1vZGlmeSBhIE1ldGhvZCBDb250ZW50IFBhY2thZ2UgPC9hPjwvaDI+Ci08cD5UaGUgcHVycG9zZSBvZiB0aGlzIHRhc2sgaXMgdG8gY3JlYXRlIGEgbmV3IDxzdHJvbmc+Q29udGVudCBQYWNrYWdlIDwvc3Ryb25nPiB3aXRoaW4gYSA8c3Ryb25nPk1ldGhvZCBQbHVnLWluPC9zdHJvbmc+LiA8L3A+Ci08cD5UbyBjcmVhdGUgYSBuZXcgTWV0aG9kIFBsdWctaW46IDwvcD4KLTxvbD4KLSAgPGxpPgotICAgIDxwPiBNYWtlIHN1cmUgeW91IGFyZSBpbiB0aGUgPHN0cm9uZz5BdXRob3JpbmcgPC9zdHJvbmc+IHBlcnNwZWN0aXZlLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT5DbGljayA8c3Ryb25nPkZpbGUgJmd0OyBOZXcgJmd0OyBNZXRob2QgUGx1Zy1pbjwvc3Ryb25nPi4gCi0gICAgPHA+T3IgPC9wPgotICAgIDxwPlJpZ2h0LWNsaWNrIGFuIGV4aXN0aW5nIFBsdWctaW4gYW5kIHNlbGVjdCA8c3Ryb25nPk5ldyBNZXRob2QgUGx1Zy1pbjwvc3Ryb25nPi4gPGJyPgotICBUaGUgTmV3IE1ldGhvZCBQbHVnLWluIHdpemFyZCBpcyBsYXVuY2hlZC4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+SW4gdGhlIE5ldyBNZXRob2QgUGx1Zy1pbiB3aXphcmQsIHByb3ZpZGUgYSBuYW1lIGZvciB0aGUgbmV3IHBsdWctaW4uIEluIHRoaXMgaW5zdGFuY2UsIHdlJ2xsIGNhbGwgaXQgTXkgUGx1Z2luLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD5TZWxlY3QgPHN0cm9uZz5SVVAgPC9zdHJvbmc+IGluIHRoZSBSZWZlcmVuY2VkIFBsdWctaW5zIHBhbmVsLCBhbmQgdGhlbiBjbGljayA8c3Ryb25nPkZpbmlzaDwvc3Ryb25nPi4gVGhpcyBtZWFucyB0aGF0IHlvdXIgcGx1Zy1pbiB3aWxsIGV4dGVuZCB0aGUgUlVQIHBsdWctaW4gYW5kIHlvdSB3aWxsIGJlIGFibGUgdG8gc2VsZWN0IGNvbnRlbnQgZnJvbSB0aGUgUlVQIHBsdWctaW4gYXMgeW91IGNyZWF0ZSB5b3VyIG93biBwbHVnLWluIGNvbnRlbnQuIDxicj4KLSAgICAgIDxzcGFuIGNsYXNzPSJzdHlsZTEiPk15IFBsdWdpbjwvc3Bhbj4gbm93IGFwcGVhcnMgaW4gdGhlIExpYnJhcnkgVmlldyBvbiB0aGUgbGVmdCBzaWRlIG9mIHlvdXIgc2NyZWVuLiBJdCBpcyBub3QgZ3JheWVkIG91dCBpbmRpY2F0aW5nIHRoYXQgaXQgaXMgbm90IGxvY2tlZCBhbmQgdGhhdCB5b3UgY2FuIGVkaXQgaXQuIDwvcD4KLSAgPC9saT4KLSAgPGxpPkRvdWJsZSBjbGljayBvbiA8c3BhbiBjbGFzcz0ic3R5bGUxIj5NeSBQbHVnaW48L3NwYW4+IHRvIG9wZW4gdGhlIFBsdWdpbiBlZGl0b3IuIEFib3V0IGhhbGZ3YXkgZG93biB0aGUgcGFnZSB5b3Ugd2lsbCBzZWUgdGhlIJFMb2NrIFBsdWdpbicgY2hlY2tib3guIFRoaXMgd2lsbCBiZSB1bmNoZWNrZWQgZm9yIHlvdXIgbmV3IHBsdWdpbi4gSWYgeW91IG9wZW4gdGhlIHBsdWdpbiBlZGl0b3IgZm9yIHRoZSBSVVAgcGx1Z2luIHRoaXMgZmllbGQgd2lsbCBiZSBjaGVja2VkLiA8L2xpPgotPC9vbD4KLTxwPlRvIGNyZWF0ZSBhIE1ldGhvZCBQYWNrYWdlOiA8L3A+Ci08b2wgc3RhcnQ9IjYiPgotICA8bGk+Ci0gICAgPHA+SW4gdGhlIExpYnJhcnkgVmlldywgY2xpY2sgPHN0cm9uZz5NeSBQbHVnaW4gJmd0OyBNZXRob2QgQ29udGVudCAmZ3Q7IENvbnRlbnQgUGFja2FnZXM8L3N0cm9uZz4uICA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD5SaWdodC1jbGljayA8c3Ryb25nPkNvbnRlbnQgUGFja2FnZXM8L3N0cm9uZz4uIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPiBIaWdobGlnaHQgPHN0cm9uZz5OZXc8L3N0cm9uZz4gYW5kIHRoZW4gY2xpY2sgPHN0cm9uZz5Db250ZW50IFBhY2thZ2U8L3N0cm9uZz4gdG8gY3JlYXRlIGEgbmV3IENvbnRlbnQgUGFja2FnZS4gPGJyPgotICAgICAgVGhlIENvbnRlbnQgUGFja2FnZSBlZGl0b3IgaXMgZGlzcGxheWVkIGFuZCB5b3UgY2FuIG5hbWUgdGhlIHBhY2thZ2UgYW5kIHByb3ZpZGUgYSBCcmllZiBEZXNjcmlwdGlvbi4gV2UnbGwgY2FsbCBpdCCTTXkgQ29udGVudCBQYWNrYWdllC4gPGJyPgotICAgICAgPHN0cm9uZz5Ob3RlOiA8L3N0cm9uZz4gWW91IGNhbm5vdCBjcmVhdGUgYSBuZXcgQ29udGVudCBQYWNrYWdlIG9yIGFueSBvdGhlciBlbGVtZW50IGluIGEgbG9ja2VkIHBsdWdpbi4gPC9wPgotICA8L2xpPgotICA8bGk+U2F2ZSB5b3VyIG5ldyBjb250ZW50LiA8L2xpPgotPC9vbD4KLTxwPjxzdHJvbmc+Tm90ZTogPC9zdHJvbmc+IFdoZW4geW91IGNyZWF0ZSBhIG5ldyBlbGVtZW50IG9yIG1vZGlmeSBhbiBleGlzdGluZyBlbGVtZW50LCBhIJEqJyBhcHBlYXJzIGluIHRoZSB0YWIgbmV4dCB0byB0aGUgbmFtZSBvZiB0aGUgZWxlbWVudCwgaW5kaWNhdGluZyB0aGF0IHRoZSBlbGVtZW50IG5lZWRzIHRvIGJlIHNhdmVkLiBBbiBlbGVtZW50IGNhbiBiZSBzYXZlZCBieSBjbG9zaW5nIHRoZSBlZGl0b3IsIGNsaWNraW5nIHRoZSBkaXNrIGljb24gaW4gdGhlIHRvb2xiYXIsIG9yIGNsaWNraW5nIDxzdHJvbmc+RmlsZSAmZ3Q7IFNhdmUgPC9zdHJvbmc+LiA8L3A+Ci08cD48c3Ryb25nPk5vdGU6IDwvc3Ryb25nPiBFUEYgQ29tcG9zZXIgYXV0b21hdGljYWxseSBjcmVhdGVzIG5vZGVzIGZvciB0YXNrcywgcm9sZXMsIHdvcmsgcHJvZHVjdHMgYW5kIGd1aWRhbmNlIHVuZGVyIHRoZSBuZXcgY29udGVudCBwYWNrYWdlLiA8L3A+Ci08aDE+Jm5ic3A7PC9oMT4KLTxoMj4mbmJzcDs8L2gyPgotPGgxPiZuYnNwOzwvaDE+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90dXRvcmlhbHMvdHV0b3JpYWxfMl9leF8yLmh0bSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3R1dG9yaWFscy90dXRvcmlhbF8yX2V4XzIuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOWY0NTU3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3R1dG9yaWFscy90dXRvcmlhbF8yX2V4XzIuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIKLSJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci0KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+VW50aXRsZWQgRG9jdW1lbnQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08c3R5bGUgdHlwZT0idGV4dC9jc3MiPgotPCEtLQotLnN0eWxlMSB7Zm9udC1mYW1pbHk6ICJDb3VyaWVyIE5ldyIsIENvdXJpZXIsIG1vbm99Ci0tLT4KLTwvc3R5bGU+Ci08L2hlYWQ+Ci0KLTxib2R5PgotPGgyPjxhPjwvYT48YT5FeGVyY2lzZSAyOiBDcmVhdGUgV29yayBQcm9kdWN0PC9hPnMgPC9oMj4KLTxwPlRoZSBwdXJwb3NlIG9mIHRoaXMgZXhlcmNpc2UgaXMgdG8gY3JlYXRlIG5ldyBtZXRob2QgY29udGVudC4gU3BlY2lmaWNhbGx5LCA8c3Ryb25nPldvcmsgUHJvZHVjdHMgPC9zdHJvbmc+b2YgdHlwZSA8c3Ryb25nPiBBcnRpZmFjdCA8L3N0cm9uZz4uIFlvdSBjYW4gY3JlYXRlIGFueSBjb250ZW50IGJ1dCBzb21lIGV4YW1wbGVzIGFyZSBwcm92aWRlZCBpZiB5b3Ugd2FudCB0byB1c2UgdGhlbS4gVGhlc2UgZXhhbXBsZXMgYXJlIHJlZmVycmVkIHRvIGluIG90aGVyIHR1dG9yaWFscy4gPC9wPgotPHA+TWV0aG9kIGFuZCBQcm9jZXNzIGVsZW1lbnRzIGhhdmUgdHdvIG5hbWVzIGluIEVQRiBDb21wb3NlcjogTmFtZSBhbmQgUHJlc2VudGF0aW9uIE5hbWUuIDwvcD4KLTxwPlRoZSBOYW1lIGZpZWxkIGlzIHVzZWQgYXMgdGhlIGZpbGUgbmFtZSBmb3IgdGhlIGl0ZW0uIEluIFJVUCwgd2UgYXJlIGNhcmVmdWwgaG93IHdlIG5hbWUgdGhlIGZpbGVzIGFuZCB1c2UgY29udmVudGlvbnMgc3VjaCBhcyBsb3dlciBjYXNlLCBubyBzcGFjZXMsIGFuZCBubyBzcGVjaWFsIGNoYXJhY3RlcnMuIFdlIGRvIHRoaXMgc28gdGhhdCB0aGUgbmFtZSBpcyBhIHZhbGlkIGZpbGUgbmFtZSBvbiBhbGwgb3BlcmF0aW5nIHN5c3RlbXMgYW5kIGZvciBpbnRlZ3JhdGlvbiB3aXRoIHNvdXJjZSBjb250cm9sIHNvZnR3YXJlIGluIHRoZSBmdXR1cmUuIFRoZSBOYW1lIGlzIHNob3duIGluIHRoZSBMaWJyYXJ5IFZpZXcuIDwvcD4KLTxwPlRoZSBQcmVzZW50YXRpb24gTmFtZSBpcyB0aGUgbmFtZSB0aGF0IGlzIHNob3duIG9uIHB1Ymxpc2hlZCBwYWdlcyBhbmQgaXQgaXMgYWxzbyBzaG93biBpbiB0aGUgQ29uZmlndXJhdGlvbiBWaWV3LiBUaGlzIG5hbWUgY2FuIGNvbnRhaW4gYW55IGNoYXJhY3RlcnMsIGJ1dCBieSBjb252ZW50aW9uIGluIFJVUCwgd2UgdXNlIHRoZSBzYW1lIHRleHQgYXMgdGhlIE5hbWUsIGp1c3QgcHJldHRpZXIuIDwvcD4KLTxwPkluIHRoZSBMaWJyYXJ5IHZpZXcgeW91IGNhbiBjaG9vc2UgdG8gZGlzcGxheSBOYW1lcyBvciBQcmVzZW50YXRpb24gTmFtZXMuIFlvdSBjYW4gc3dpdGNoIHRoZSBuYW1lIGRpc3BsYXkgdXNpbmcgdGhlIJFTaG93IFByZXNlbnRhdGlvbiBOYW1lcycgYnV0dG9uIGluIHRoZSBMaWJyYXJ5IHZpZXcgdG9vbGJhci4gPC9wPgotPHA+SW4gZ2VuZXJhbCwgeW91IGNyZWF0ZSBuZXcgZWxlbWVudHMgYnkgcmlnaHQtY2xpY2tpbmcgdGhlIGZvbGRlciB0aGF0IHdpbGwgY29udGFpbiB0aGUgbmV3IGVsZW1lbnQuIEZvciBleGFtcGxlLCB0byBjcmVhdGUgYSBuZXcgcm9sZSBpbiBhIGNvbnRlbnQgcGFja2FnZSwgcmlnaHQtY2xpY2sgdGhlIDxzdHJvbmc+Um9sZXMgPC9zdHJvbmc+IGZvbGRlciwgaGlnaGxpZ2h0IDxzdHJvbmc+TmV3IDwvc3Ryb25nPiBhbmQgdGhlbiBjbGljayA8c3Ryb25nPlJvbGU8L3N0cm9uZz4uIDwvcD4KLTxvbD4KLSAgPGxpPgotICAgIDxwPk1ha2Ugc3VyZSB5b3UgYXJlIGluIHRoZSA8c3Ryb25nPkF1dGhvcmluZyA8L3N0cm9uZz4gcGVyc3BlY3RpdmUuIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPiBXaXRoaW4gPHNwYW4gY2xhc3M9InN0eWxlMSI+TXkgQ29udGVudCBQYWNrYWdlPC9zcGFuPiByaWdodC1jbGljayBvbiB0aGUgPHN0cm9uZz5Xb3JrIFByb2R1Y3RzPC9zdHJvbmc+IGZvbGRlci4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+IEhpZ2hsaWdodCA8c3Ryb25nPk5ldzwvc3Ryb25nPiBhbmQgdGhlbiBjbGljayA8c3Ryb25nPkFydGlmYWN0PC9zdHJvbmc+LiBUaGUgYXJ0aWZhY3QgZWRpdG9yIGlzIGRpc3BsYXllZC4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+IEluIHRoZSBOYW1lIGZpZWxkLCB0eXBlIHRoZSBuZXcgQXJ0aWZhY3QgbmFtZS4gSW4gdGhpcyBpbnN0YW5jZSwgd2UnbGwgY2FsbCBpdCA8c3Ryb25nPm15X3J1cF9uYXZtYXA8L3N0cm9uZz4uIDwvcD4KLSAgPC9saT4KLSAgPGxpPiBJbiB0aGUgPHN0cm9uZz5QcmVzZW50YXRpb24gTmFtZTwvc3Ryb25nPiBmaWVsZCwgdHlwZTogPC9saT4KLSAgPGJsb2NrcXVvdGU+Ci0gICAgPHA+TXkgUlVQIE5hdmlnYXRpb24gTWFwPC9wPgotICA8L2Jsb2NrcXVvdGU+Ci0gIDxsaT5JbiB0aGUgPHN0cm9uZz5CcmllZiBEZXNjcmlwdGlvbjwvc3Ryb25nPiBmaWVsZCwgdHlwZToKLSAgICA8YmxvY2txdW90ZT4KLSAgICAgIDxwPlRoZSBOYXZpZ2F0aW9uIE1hcCBleHByZXNzZXMgdGhlIHN0cnVjdHVyZSBvZiB0aGUgdXNlci1pbnRlcmZhY2UgZWxlbWVudHMgaW4gdGhlIHN5c3RlbSwgYWxvbmcgd2l0aCB0aGVpciBwb3RlbnRpYWwgbmF2aWdhdGlvbiBwYXRod2F5cy48L3A+Ci0gICAgPC9ibG9ja3F1b3RlPgotICA8L2xpPgotICA8bGk+IEluIHRoZSA8c3Ryb25nPlB1cnBvc2U8L3N0cm9uZz4gZmllbGQgdHlwZTogCi0gICAgPGJsb2NrcXVvdGU+Ci0gICAgICA8cD5UaGVyZSBpcyBvbmUgTmF2aWdhdGlvbiBNYXAgcGVyIHN5c3RlbS4gVGhlIHB1cnBvc2Ugb2YgdGhlIE5hdmlnYXRpb24gTWFwIGlzIHRvIGV4cHJlc3MgdGhlIHByaW5jaXBhbCB1c2VyIGludGVyZmFjZSBwYXRocyB0aHJvdWdoIHRoZSBzeXN0ZW0uIFRoZXNlIGFyZSB0aGUgbWFpbiBwYXRod2F5cyB0aHJvdWdoIHRoZSBzY3JlZW5zIG9mIHRoZSBzeXN0ZW0gYW5kIG5vdCBuZWNlc3NhcmlseSBhbGwgb2YgdGhlIHBvc3NpYmxlIHBhdGhzLiBJdCBjYW4gYmUgdGhvdWdodCBvZiBhcyBhIHJvYWQgbWFwIG9mIHRoZSBzeXN0ZW0ncyB1c2VyIGludGVyZmFjZS4gVGhlIE5hdmlnYXRpb24gTWFwIG1ha2VzIGl0IGVhc3kgdG8gc2VlIGhvdyBtYW55ICZxdW90O2NsaWNrcyZxdW90OyBpdCB3aWxsIHRha2UgYSB1c2VyIHRvIGdldCB0byBhIHNwZWNpZmljIHNjcmVlbi4gPC9wPgotICAgIDwvYmxvY2txdW90ZT4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPkNsaWNrIHRoZSBwcmV2aWV3IHRhYiB0byB2aWV3IHRoZSBuZXcgQXJ0aWZhY3QuIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPiBTYXZlIHRoZSBBcnRpZmFjdC4gPC9wPgotICA8L2xpPgotICA8bGk+IFJlcGVhdCBzdGVwcyAyIHRocm91Z2ggOSB1c2luZyB0aGUgZm9sbG93aW5nIGluZm9ybWF0aW9uOiAKLSAgICA8YmxvY2txdW90ZT4KLSAgICAgIDxwPiYjMTQ5OyZuYnNwOyA8c3Ryb25nPkFydGlmYWN0IE5hbWU8L3N0cm9uZz46IG15X3J1cF91c2VyX2ludGVyZmFjZV9wcm90b3R5cGUgPC9wPgotICAgICAgPHA+JiMxNDk7Jm5ic3A7IDxzdHJvbmc+UHJlc2VudGF0aW9uIE5hbWU8L3N0cm9uZz46IE15IFJVUCBVSSBQcm90b3R5cGUgPC9wPgotICAgICAgPHA+JiMxNDk7Jm5ic3A7IDxzdHJvbmc+QnJpZWYgRGVzY3JpcHRpb248L3N0cm9uZz46IEEgdXNlci1pbnRlcmZhY2UgcHJvdG90eXBlIGlzIGFuIGV4YW1wbGUgb2YgdGhlIHVzZXIgaW50ZXJmYWNlIHRoYXQgaXMgYnVpbHQgaW4gb3JkZXIgdG8gZXhwbG9yZSBhbmQvb3IgdmFsaWRhdGUgdGhlIHVzZXItaW50ZXJmYWNlIGRlc2lnbi4gPC9wPgotICAgICAgPHA+JiMxNDk7Jm5ic3A7IDxzdHJvbmc+UHVycG9zZTogPC9zdHJvbmc+IFRoZSBmb2xsb3dpbmcgcm9sZXMgdXNlIHRoZSB1c2VyLWludGVyZmFjZSBwcm90b3R5cGU6IDwvcD4KLSAgICAgIDxibG9ja3F1b3RlPgotICAgICAgICA8cD4tIDxzdHJvbmc+dXNlci1pbnRlcmZhY2UgZGVzaWduZXJzPC9zdHJvbmc+ICwgdG8gZXhwbG9yZSBhbmQvb3IgdmFsaWRhdGUgdGhlIHVzZXItaW50ZXJmYWNlIGRlc2lnbiBiZWZvcmUgdG9vIG11Y2ggaXMgaW52ZXN0ZWQgaW4gaXQgPC9wPgotICAgICAgICA8cD4tIDxzdHJvbmc+cmVxdWlyZW1lbnRzIHNwZWNpZmllcnMgPC9zdHJvbmc+LCB0byB1bmRlcnN0YW5kIHRoZSB1c2VyIGludGVyZmFjZSBmb3IgYSBVc2UgQ2FzZSA8L3A+Ci0gICAgICAgIDxwPjxzdHJvbmc+LSBzeXN0ZW0gYW5hbHlzdHMgPC9zdHJvbmc+LCB0byB1bmRlcnN0YW5kIGhvdyB0aGUgdXNlciBpbnRlcmZhY2UgaW1wYWN0cyB0aGUgYW5hbHlzaXMgb2YgdGhlIHN5c3RlbSA8L3A+Ci0gICAgICAgIDxwPi0gPHN0cm9uZz5kZXNpZ25lcnMgPC9zdHJvbmc+LCB0byB1bmRlcnN0YW5kIGhvdyB0aGUgdXNlciBpbnRlcmZhY2UgaW1wYWN0cyBhbmQgd2hhdCBpdCByZXF1aXJlcyBmcm9tIHRoZSAmcXVvdDtpbnNpZGUmcXVvdDsgb2YgdGhlIHN5c3RlbSA8L3A+Ci0gICAgICAgIDxwPiAtIDxzdHJvbmc+bWFuYWdlcnMgPC9zdHJvbmc+LCB0byBwbGFuIGRldmVsb3BtZW50IGFuZCB0ZXN0aW5nIGFjdGl2aXRpZXMgPC9wPgotICAgICAgPC9ibG9ja3F1b3RlPgotICAgIDwvYmxvY2txdW90ZT4KLSAgPC9saT4KLTwvb2w+Ci08aDI+Jm5ic3A7PC9oMj4KLTxoMT4mbmJzcDs8L2gxPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHV0b3JpYWxzL3R1dG9yaWFsXzJfZXhfMy5odG0gYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90dXRvcmlhbHMvdHV0b3JpYWxfMl9leF8zLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzhkNmU4NC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90dXRvcmlhbHMvdHV0b3JpYWxfMl9leF8zLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iCi0iaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotCi08aHRtbD4KLTxoZWFkPgotPHRpdGxlPlVudGl0bGVkIERvY3VtZW50PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPC9oZWFkPgotCi08Ym9keT4KLTxoMj48YT48L2E+PGE+RXhlcmNpc2UgMzogQ3JlYXRlIFJvbGVzIDwvYT48L2gyPgotPHA+VG8gY3JlYXRlIGEgUm9sZSBpbiBNeSBDb250ZW50IFBhY2thZ2U6IDwvcD4KLTxvbD4KLSAgPGxpPgotICAgIDxwPiBNYWtlIHN1cmUgeW91IGFyZSBpbiB0aGUgPHN0cm9uZz5BdXRob3JpbmcgPC9zdHJvbmc+IHBlcnNwZWN0aXZlLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD5XaXRoaW4gTXkgQ29udGVudCBQYWNrYWdlIHJpZ2h0LWNsaWNrIG9uIHRoZSA8c3Ryb25nPlJvbGVzIDwvc3Ryb25nPiBmb2xkZXIuIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPkhpZ2hsaWdodCA8c3Ryb25nPk5ldyA8L3N0cm9uZz4gYW5kIHRoZW4gY2xpY2sgPHN0cm9uZz5Sb2xlPC9zdHJvbmc+LiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD5JbiB0aGUgPHN0cm9uZz5OYW1lIGZpZWxkIDwvc3Ryb25nPiB0eXBlOiBteV9ydXBfdXNlcl9pbnRlcmZhY2VfZGVzaWduZXIuIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPkluIHRoZSA8c3Ryb25nPlByZXNlbnRhdGlvbiBOYW1lPC9zdHJvbmc+IGZpZWxkIHR5cGU6IE15IFVJIERlc2lnbmVyLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT5JbiB0aGUgPHN0cm9uZz5CcmllZiBEZXNjcmlwdGlvbiA8L3N0cm9uZz4gZmllbGQgdHlwZTogPC9saT4KLSAgPGJsb2NrcXVvdGU+Ci0gICAgPHA+VGhlIHVzZXItaW50ZXJmYWNlIGRlc2lnbmVyIGNvb3JkaW5hdGVzIHRoZSBkZXNpZ24gb2YgdGhlIHVzZXIgaW50ZXJmYWNlLiBVc2VyLWludGVyZmFjZSBkZXNpZ25lcnMgYXJlIGFsc28gaW52b2x2ZWQgaW4gZ2F0aGVyaW5nIHVzYWJpbGl0eSByZXF1aXJlbWVudHMgYW5kIHByb3RvdHlwaW5nIGNhbmRpZGF0ZSB1c2VyLWludGVyZmFjZSBkZXNpZ25zIHRvIG1lZXQgdGhvc2UgcmVxdWlyZW1lbnRzLiA8L3A+Ci0gICAgPHA+PHN0cm9uZz5UaXAgPC9zdHJvbmc+IC0gdGhlcmUgYXJlIGRpZmZlcmVudCB3YXlzIHRoYXQgeW91IGNhbiBjcmVhdGUgdGhlIHRleHQgYWJvdmUgZm9yIHRoZSBuZXcgcm9sZTogPC9wPgotICAgIDxibG9ja3F1b3RlPgotICAgICAgPHA+JiMxNDk7Jm5ic3A7IERpcmVjdGx5LCBieSB0eXBpbmcgaXQgbWFudWFsbHkgaW4gdGhlIEVQRiBDb21wb3NlciBlZGl0b3IuIDwvcD4KLSAgICAgIDxwPiYjMTQ5OyZuYnNwOyBCeSBjb3B5aW5nIGZyb20gYW5vdGhlciBzaW1pbGFyIHJvbGUgYW5kIHRoZW4gbW9kaWZ5IHVzaW5nIHRoZSBlZGl0b3JzIChlLmcuIHJ1cF91c2VyX2ludGVyZmFjZV9kZXNpZ25lcikuIDwvcD4KLSAgICAmIzE0OTsmbmJzcDtCeSBjb3B5aW5nIGZyb20gYW4gaHRtbCBzb3VyY2Ugc3VjaCBhcyB0aGUgdHV0b3JpYWwgeW91IGFyZSByZWFkaW5nLiA8L2Jsb2NrcXVvdGU+Ci0gIDwvYmxvY2txdW90ZT4KLSAgPGxpPiAgICBUcnkgdGhlIDxzdHJvbmc+UmljaCBUZXh0IEVkaXRvciA8L3N0cm9uZz4gZm9yIGVkaXRpbmcgdGhlIDxzdHJvbmc+TWFpbiBEZXNjcmlwdGlvbi4gPC9zdHJvbmc+WW91IGNhbiBvcGVuIHRoZSBSaWNoIFRleHQgRWRpdG9yIGZvciBhbnkgaXRlbSB0aGF0IGhhcyBhIJF0d2lzdHknIDxpbWcgd2lkdGg9IjEzIiBoZWlnaHQ9IjEzIiBzcmM9InR1dG9yaWFsXzJfZXhfM19jbGlwX2ltYWdlMDAyLmdpZiI+c3ltYm9sIAotICAgIDxibG9ja3F1b3RlPgotICAgICAgPHA+JiMxNDk7Jm5ic3A7IFRoZSB1c2VyLWludGVyZmFjZSBkZXNpZ25lciByb2xlIGlzIG5vdCByZXNwb25zaWJsZSBmb3IgaW1wbGVtZW50aW5nIHRoZSB1c2VyIGludGVyZmFjZS4gSW5zdGVhZCwgdGhpcyByb2xlIGZvY3VzZXMgb24gdGhlIGRlc2lnbiBhbmQgdGhlICZxdW90O3Zpc3VhbCBzaGFwaW5nJnF1b3Q7IG9mIHRoZSB1c2VyIGludGVyZmFjZSwgYnk6IDwvcD4KLSAgICA8L2Jsb2NrcXVvdGU+Ci0gIDwvbGk+Ci0gIDxvbD4KLSAgICA8YmxvY2txdW90ZT4KLSAgICAgIDxwPiAtIENhcHR1cmluZyByZXF1aXJlbWVudHMgb24gdGhlIHVzZXIgaW50ZXJmYWNlLCBpbmNsdWRpbmcgdXNhYmlsaXR5IHJlcXVpcmVtZW50cy4gPC9wPgotICAgICAgPHA+LSBCdWlsZGluZyB1c2VyLWludGVyZmFjZSBwcm90b3R5cGVzLjwvcD4KLSAgICAgIDxwPi0gSW52b2x2aW5nIG90aGVyIHN0YWtlaG9sZGVycyBvZiB0aGUgdXNlciBpbnRlcmZhY2UsIHN1Y2ggYXMgZW5kLXVzZXJzLCBpbiB1c2FiaWxpdHkgcmV2aWV3cyBhbmQgdXNlIHRlc3Rpbmcgc2Vzc2lvbnMuIDwvcD4KLSAgICAgIDxwPi0gUmV2aWV3aW5nIGFuZCBwcm92aWRpbmcgdGhlIGFwcHJvcHJpYXRlIGZlZWRiYWNrIG9uIHRoZSBmaW5hbCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgdXNlciBpbnRlcmZhY2UsIGFzIGNyZWF0ZWQgYnkgb3RoZXIgZGV2ZWxvcGVyczsgdGhhdCBpcywgZGVzaWduZXJzIGFuZCBpbXBsZW1lbnRlcnMuIDwvcD4KLSAgICA8L2Jsb2NrcXVvdGU+Ci0gIDwvb2w+Ci0gIDxibG9ja3F1b3RlPgotICAgIDxwPjxzdHJvbmc+Tm90ZTwvc3Ryb25nPiCWIGlmIHlvdSBjb3B5IHRleHQgZnJvbSBhIE1pY3Jvc29mdCBXb3JkIGRvY3VtZW50IHlvdSB3aWxsIGdldCBhIGxvdCBvZiBmb3JtYXR0aW5nIGluZm9ybWF0aW9uIHRoYXQgaXMgbm90IG5lZWRlZCBpbiBFY2xpcHNlIFByb2Nlc3MgRnJhbWV3b3JrIENvbXBvc2VyLiBZb3UgY2FuIHNlZSB0aGlzIGlmIHlvdSBvcGVuIHRoZSBIVE1MIGVkaXRvciBpbiB0aGUgUmljaCBUZXh0IEVkaXRvci4gPC9wPgotICA8L2Jsb2NrcXVvdGU+Ci0gIDxsaT4KLSAgICA8cD5DbGljayB0aGUgPHN0cm9uZz5Xb3JrUHJvZHVjdHMgPC9zdHJvbmc+IHRhYjsgbWFrZSB0aGlzIG5ldyByb2xlIHJlc3BvbnNpYmxlIGZvciB0aGUgbXlfcnVwX25hdm1hcCBhbmQgbXlfcnVwX3VzZXJfaW50ZXJmYWNlX3Byb3RvdHlwZSBhcnRpZmFjdHMgdGhhdCB5b3UgcHJldmlvdXNseSBjcmVhdGVkLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD5DbGljayB0aGUgPHN0cm9uZz5BZGQgPC9zdHJvbmc+IGJ1dHRvbi4gVGhpcyBkaXNwbGF5cyBhIHNlbGVjdGlvbiBkaWFsb2cgd2hlcmUgeW91IGNhbiBzZWxlY3QgdGhlIFdvcmsgUHJvZHVjdHMgdG8gYWRkLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT5PbmNlIHlvdSBoYXZlIHNlbGVjdGVkIHRoZSBhcHByb3ByaWF0ZSBXb3JrIFByb2R1Y3RzLCBjbGljayA8c3Ryb25nPk9LPC9zdHJvbmc+LiBUaGUgd29yayBwcm9kdWN0cyB5b3Ugc2VsZWN0ZWQgYXBwZWFyIGluIHRoZSA8c3Ryb25nPlJlc3BvbnNpYmxlIGZvcjogPC9zdHJvbmc+IHBhbmVsLiAKLSAgICA8YmxvY2txdW90ZT4KLSAgICAgIDxwPk5vdGUgdGhhdCBzZWxlY3RlZCBlbGVtZW50cyBpbiBhbiBBZGQvUmVtb3ZlIHNlY3Rpb24gZGlzcGxheSBib3RoIHRoZSBlbGVtZW50IG5hbWUgYW5kIHRoZSCRcGF0aCcgdG8gdGhhdCBlbGVtZW50IJYgdGhlIFBsdWdpbiBuYW1lIGFuZCBwYWNrYWdlIG5hbWUuIDwvcD4KLSAgICA8L2Jsb2NrcXVvdGU+Ci0gIDwvbGk+Ci0gIDxsaT5DbGljayB0aGUgPHN0cm9uZz5QcmV2aWV3IDwvc3Ryb25nPiB0YWIgdG8gdmlldyB0aGUgbmV3bHkgY3JlYXRlZCByb2xlIGFuZCB0aGVuIHNhdmUgYnkgY2xvc2luZyB0aGUgZWRpdG9yLiA8L2xpPgotPC9vbD4KLTxoMj4mbmJzcDs8L2gyPgotPGgxPiZuYnNwOzwvaDE+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90dXRvcmlhbHMvdHV0b3JpYWxfMl9leF8zX2NsaXBfaW1hZ2UwMDIuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHV0b3JpYWxzL3R1dG9yaWFsXzJfZXhfM19jbGlwX2ltYWdlMDAyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmIyZmM4MS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90dXRvcmlhbHMvdHV0b3JpYWxfMl9leF8zX2NsaXBfaW1hZ2UwMDIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHV0b3JpYWxzL3R1dG9yaWFsXzJfZXhfNC5odG0gYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90dXRvcmlhbHMvdHV0b3JpYWxfMl9leF80Lmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTVmOTIxYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90dXRvcmlhbHMvdHV0b3JpYWxfMl9leF80Lmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iCi0iaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotCi08aHRtbD4KLTxoZWFkPgotPHRpdGxlPlVudGl0bGVkIERvY3VtZW50PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPC9oZWFkPgotCi08Ym9keT4KLTxoMj48YT48L2E+PGE+PC9hPjxhPkV4ZXJjaXNlIDQ6IENyZWF0ZSBUYXNrcyA8L2E+PC9oMj4KLTxwPlRoZSBwdXJwb3NlIG9mIHRoaXMgZXhlcmNpc2UgaXMgdG8gY3JlYXRlIGEgdGFzayBhbmQgdGhlbiByZWxhdGUgdGhhdCB0YXNrIHRvIHRoZSBvdGhlciBlbGVtZW50cyB5b3UgaGF2ZSBjcmVhdGVkLiA8L3A+Ci08cD5UbyBjcmVhdGUgYSBUYXNrIGluIE15IENvbnRlbnQgUGFja2FnZTogPC9wPgotPG9sPgotICA8bGk+Ci0gICAgPHA+TWFrZSBzdXJlIHlvdSBhcmUgaW4gdGhlIDxzdHJvbmc+QXV0aG9yaW5nIDwvc3Ryb25nPiBwZXJzcGVjdGl2ZS4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+IFdpdGhpbiBNeSBDb250ZW50IFBhY2thZ2UgcmlnaHQtY2xpY2sgb24gdGhlIDxzdHJvbmc+VGFza3MgPC9zdHJvbmc+IGZvbGRlci4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+IEhpZ2hsaWdodCA8c3Ryb25nPk5ldyA8L3N0cm9uZz4gYW5kIHRoZW4gY2xpY2sgPHN0cm9uZz5UYXNrPC9zdHJvbmc+LiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT5Vc2UgdGhlIGZvbGxvd2luZyBpbmZvcm1hdGlvbiB0byBjcmVhdGUgdGhlIHRhc2s6ICA8L2xpPgotICA8YmxvY2txdW90ZT4KLSAgICA8cD4mIzE0OTsmbmJzcDsgPHN0cm9uZz5UYXNrOiA8L3N0cm9uZz4gbXlfZGVzaWduX3VzZXJfaW50ZXJmYWNlIDwvcD4KLSAgICA8cD4mIzE0OTsmbmJzcDsgPHN0cm9uZz5QcmVzZW50YXRpb24gTmFtZSA8L3N0cm9uZz46IE15IERlc2lnbiBVc2VyIEludGVyZmFjZSA8L3A+Ci0gICAgPHA+JiMxNDk7Jm5ic3A7IDxzdHJvbmc+QnJpZWYgRGVzY3JpcHRpb246IDwvc3Ryb25nPiBUbyBwcm9kdWNlIGEgZGVzaWduIG9mIHRoZSB1c2VyIGludGVyZmFjZSB0aGF0IHN1cHBvcnRzIHRoZSByZWFzb25pbmcgYWJvdXQsIGFuZCB0aGUgZW5oYW5jZW1lbnQgb2YsIGl0cyB1c2FiaWxpdHkuIDwvcD4KLSAgICA8cD4mIzE0OTsmbmJzcDsgPHN0cm9uZz5TdGVwcyA8L3N0cm9uZz4oVXNlIHN0ZXBzIHRhYik6PC9wPgotICAgIDxibG9ja3F1b3RlPgotICAgICAgPHA+LSBEZXNjcmliZSB0aGUgY2hhcmFjdGVyaXN0aWNzIG9mIHJlbGF0ZWQgdXNlcnMgPC9wPgotICAgIC0gSWRlbnRpZnkgdGhlIHByaW1hcnkgdXNlciBpbnRlcmZhY2UgZWxlbWVudHMgPC9ibG9ja3F1b3RlPgotICAgIDxwPiYjMTQ5OyZuYnNwOyA8c3Ryb25nPlJvbGVzIChQcmltYXJ5IFBlcmZvcm1lcik6IDwvc3Ryb25nPm15X3J1cF91c2VyX2ludGVyZmFjZV9kZXNpZ25lciA8L3A+Ci0gICAgPHA+JiMxNDk7Jm5ic3A7IDxzdHJvbmc+V29yayBQcm9kdWN0cyAoTWFuZGF0b3J5IElucHV0KSA8L3N0cm9uZz4gcnVwX3NvZnR3YXJlX3JlcXVpcmVtZW50ICh1bmRlciByZXF1aXJlbWVudHMpIDxzdHJvbmc+PC9zdHJvbmc+PC9wPgotICAgIDxwPiYjMTQ5OyZuYnNwOyA8c3Ryb25nPldvcmsgUHJvZHVjdHMgPC9zdHJvbmc+IChPdXRwdXRzKTogbXlfcnVwX25hdm1hcCA8L3A+Ci0gICAgPHA+JiMxNDk7Jm5ic3A7IDxzdHJvbmc+R3VpZGFuY2U6IDwvc3Ryb25nPnJlcHJlc2VudGluZ19ncmFwaGljYWxfdXNlci1pbnRlcmZhY2VzICh1bmRlciBndWlfZGVzaWduKSA8c3Ryb25nPjwvc3Ryb25nPjwvcD4KLSAgJiMxNDk7Jm5ic3A7IDxzdHJvbmc+Q2F0ZWdvcmllczogPC9zdHJvbmc+cnVwX2FuYWx5c2lzX2Rlc2lnbl9kaXNjaXBsaW5lIDxzdHJvbmc+PC9zdHJvbmc+PC9ibG9ja3F1b3RlPgotICA8bGk+Ci0gICAgPHA+Q2xpY2sgdGhlIDxzdHJvbmc+UHJldmlldyA8L3N0cm9uZz4gdGFiIHRvIHZpZXcgdGhlIG5ld2x5IGNyZWF0ZWQgdGFzayBhbmQgc2F2ZSBieSBjbG9zaW5nIHRoZSBlZGl0b3IuIDwvcD4KLSAgPC9saT4KLSAgPGxpPiAgICBDcmVhdGUgYW5vdGhlciB0YXNrIHVzaW5nIHRoZSBmb2xsb3dpbmcgaW5mb3JtYXRpb246Ci0gICAgPGJsb2NrcXVvdGU+Ci0gICAgICA8cD4mIzE0OTsmbmJzcDsgPHN0cm9uZz5UYXNrOiA8L3N0cm9uZz4gbXlfcHJvdG90eXBlX3VzZXJfaW50ZXJmYWNlIDwvcD4KLSAgICAgIDxwPiYjMTQ5OyZuYnNwOyA8c3Ryb25nPlByZXNlbnRhdGlvbiBuYW1lIDwvc3Ryb25nPjogTXkgUHJvdG90eXBlIFVzZXIgSW50ZXJmYWNlIDwvcD4KLSAgICAgIDxwPiYjMTQ5OyZuYnNwOyA8c3Ryb25nPkJyaWVmIERlc2NyaXB0aW9uOiA8L3N0cm9uZz4gVG8gcHJvdG90eXBlIHRoZSBzeXN0ZW0ncyB1c2VyIGludGVyZmFjZSBpbiBhbiBhdHRlbXB0IHRvIHZhbGlkYXRlIHRoZSB1c2VyLWludGVyZmFjZSBkZXNpZ24gYWdhaW5zdCB0aGUgZnVuY3Rpb25hbCBhbmQgdXNhYmlsaXR5IHJlcXVpcmVtZW50cy4gPC9wPgotICAgICAgPHA+JiMxNDk7Jm5ic3A7IDxzdHJvbmc+U3RlcHM6IDwvc3Ryb25nPjwvcD4KLSAgICAgIDxibG9ja3F1b3RlPgotICAgICAgICA8cD4tJm5ic3A7IERlc2lnbiB0aGUgdXNlciBpbnRlcmZhY2UgcHJvdG90eXBlIDwvcD4KLSAgICAgICAgPHA+LSZuYnNwOyBJbXBsZW1lbnQgdGhlIHVzZXIgaW50ZXJmYWNlIHByb3RvdHlwZSA8L3A+Ci0gICAgICA8L2Jsb2NrcXVvdGU+Ci0gICAgICA8cD4mIzE0OTsmbmJzcDsgPHN0cm9uZz5Sb2xlcyAoUHJpbWFyeSBQZXJmb3JtZXIpOiA8L3N0cm9uZz5teV9ydXBfdXNlcl9pbnRlcmZhY2VfZGVzaWduZXIgPC9wPgotICAgICAgPHA+JiMxNDk7Jm5ic3A7IDxzdHJvbmc+V29yayBQcm9kdWN0cyAoTWFuZGF0b3J5IElucHV0KSA8L3N0cm9uZz4gbXlfcnVwX25hdm1hcCA8L3A+Ci0gICAgICA8cD4mIzE0OTsmbmJzcDsgPHN0cm9uZz5Xb3JrIFByb2R1Y3RzIChPdXRwdXRzKTogPC9zdHJvbmc+bXlfcnVwX3VzZXJfaW50ZXJmYWNlX3Byb3RvdHlwZSA8L3A+Ci0gICAgICA8cD4mIzE0OTsmbmJzcDsgPHN0cm9uZz5DYXRlZ29yaWVzOiA8L3N0cm9uZz5ydXBfYW5hbHlzaXNfZGVzaWduX2Rpc2NpcGxpbmUgPC9wPgotICAgIDwvYmxvY2txdW90ZT4KLSAgPC9saT4KLSAgPC9vbD4KLTxoMj4mbmJzcDs8L2gyPgotPGgxPiZuYnNwOzwvaDE+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90dXRvcmlhbHMvdHV0b3JpYWxfMl9leF81Lmh0bSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3R1dG9yaWFscy90dXRvcmlhbF8yX2V4XzUuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkY2FkZWFmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3R1dG9yaWFscy90dXRvcmlhbF8yX2V4XzUuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIKLSJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci0KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+VW50aXRsZWQgRG9jdW1lbnQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxib2R5PgotPGgyPjxhPjwvYT48YT48L2E+PGE+RXhlcmNpc2UgNTogV29ya2luZyB3aXRoIFN0ZXBzIDwvYT48L2gyPgotPHA+VGhlIHB1cnBvc2Ugb2YgdGhpcyBleGVyY2lzZSBpcyB0byB1bmRlcnN0YW5kIHRoZSBTdGVwIEVkaXRvciB0aGF0IGlzIHBhcnQgb2YgdGhlIFRhc2sgRWRpdG9yLiA8L3A+Ci08cD5XaGVuIHlvdSBjcmVhdGUgYSB0YXNrLCB5b3UgY2FuIGRlZmluZSBhIHNlcmllcyBvZiBzdGVwcyB0aGF0IGRldGFpbCBob3cgdG8gcGVyZm9ybSB0aGUgdGFzay4gVGhlIFN0ZXAgRWRpdG9yIGFsbG93cyB5b3UgdG8gYWRkIG5ldyBzdGVwcywgY2hhbmdlIHRoZSBzZXF1ZW5jZSBvZiBzdGVwcyBhbmQgdG8gZGVsZXRlIHN0ZXBzLiA8L3A+Ci08b2w+Ci0gIDxsaT4KLSAgICA8cD5PcGVuIHRoZSBteV9kZXNpZ25fdXNlcl9pbnRlcmZhY2UgdGFzayBvciBjcmVhdGUgYSBuZXcgdGFzay4gQ2xpY2sgb24gdGhlIDxzdHJvbmc+U3RlcHM8L3N0cm9uZz4gdGFiLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT5DcmVhdGUgYSBuZXcgc3RlcDogIDwvbGk+Ci0gIDxibG9ja3F1b3RlPgotICAgIDxwPiYjMTQ5OyBFbnRlciBhIG5hbWUgZm9yIHRoZSBzdGVwIGluIHRoZSCRU3RlcHMnIGJveC4gPC9wPgotICAgIDxwPiYjMTQ5OyBFbnRlciBhIDxzdHJvbmc+RGVzY3JpcHRpb24gPC9zdHJvbmc+IJYgeW91IGNhbiB1c2UgdGhlIFJpY2ggVGV4dCBFZGl0b3IgZm9yIHRoaXMuIDwvcD4KLSAgICA8cD4mIzE0OTsgQ2xpY2sgdGhlIDxzdHJvbmc+QWRkIDwvc3Ryb25nPiBidXR0b24uIDwvcD4KLSAgICA8cD4mIzE0OTsgU2VlIHRoZSByZXN1bHRzIG9uIHRoZSA8c3Ryb25nPlByZXZpZXcgPC9zdHJvbmc+IHRhYi4gPC9wPgotICA8L2Jsb2NrcXVvdGU+Ci0gIDxsaT4gICAgUmVtb3ZlIGEgc3RlcCA6IDwvbGk+Ci0gIDxibG9ja3F1b3RlPgotICAgIDxwPiYjMTQ5OyBSZXR1cm4gdG8gdGhlIDxzdHJvbmc+U3RlcHM8L3N0cm9uZz4gdGFiLiA8L3A+Ci0gICAgPHA+JiMxNDk7IENsaWNrIHRoZSBzdGVwIHRvIHJlbW92ZSBpbiB0aGUgU3RlcHMgcGFuZWwuIDwvcD4KLSAgICA8cD4mIzE0OTsgQ2xpY2sgdGhlIDxzdHJvbmc+RGVsZXRlIDwvc3Ryb25nPiBidXR0b24uIDwvcD4KLSAgICA8cD4mIzE0OTsgU2VlIHRoZSByZXN1bHRzIG9uIHRoZSA8c3Ryb25nPlByZXZpZXcgPC9zdHJvbmc+IHRhYi4gPC9wPgotICA8L2Jsb2NrcXVvdGU+Ci0gIDxsaT4gICAgTW92ZSBhIHN0ZXAgdXAgdGhlIGxpc3Q6IDwvbGk+Ci0gIDxibG9ja3F1b3RlPgotICAgIDxwPiYjMTQ5OyZuYnNwOyBSZXR1cm4gdG8gdGhlIDxzdHJvbmc+U3RlcHM8L3N0cm9uZz4gdGFiLiA8L3A+Ci0gICAgPHA+JiMxNDk7Jm5ic3A7IENsaWNrIHRoZSBzdGVwIHlvdSB3YW50IHRvIG1vdmUgdXAuPC9wPgotICAgIDxwPiYjMTQ5OyZuYnNwOyBDbGljayB0aGUgPHN0cm9uZz5VcCA8L3N0cm9uZz4gYnV0dG9uLjwvcD4KLSAgICA8cD4mIzE0OTsmbmJzcDsgU2VlIHRoZSByZXN1bHRzIG9uIHRoZSA8c3Ryb25nPlByZXZpZXcgPC9zdHJvbmc+IHRhYi4gPC9wPgotICA8L2Jsb2NrcXVvdGU+Ci0gIDxsaT5Nb3ZlIGEgc3RlcCBkb3duIHRoZSBsaXN0IDogIDwvbGk+Ci0gIDxibG9ja3F1b3RlPgotICAgIDxwPiYjMTQ5OyZuYnNwOyBSZXR1cm4gdG8gdGhlIDxzdHJvbmc+U3RlcHM8L3N0cm9uZz4gdGFiLiA8L3A+Ci0gICAgPHA+JiMxNDk7Jm5ic3A7IENsaWNrIHRoZSBzdGVwIHlvdSB3YW50IHRvIG1vdmUgZG93bi48L3A+Ci0gICAgPHA+JiMxNDk7Jm5ic3A7IENsaWNrIHRoZSA8c3Ryb25nPkRvd24gPC9zdHJvbmc+IGJ1dHRvbi48L3A+Ci0gICAgPHA+JiMxNDk7Jm5ic3A7IFNlZSB0aGUgcmVzdWx0cyBvbiB0aGUgPHN0cm9uZz5QcmV2aWV3IDwvc3Ryb25nPiB0YWIuIDwvcD4KLSAgPC9ibG9ja3F1b3RlPgotPC9vbD4KLTxoMj4mbmJzcDs8L2gyPgotPGgxPiZuYnNwOzwvaDE+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90dXRvcmlhbHMvdHV0b3JpYWxfMl9leF82Lmh0bSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3R1dG9yaWFscy90dXRvcmlhbF8yX2V4XzYuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OTEyZGY1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3R1dG9yaWFscy90dXRvcmlhbF8yX2V4XzYuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIKLSJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci0KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+VW50aXRsZWQgRG9jdW1lbnQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08c3R5bGUgdHlwZT0idGV4dC9jc3MiPgotPCEtLQotLnN0eWxlMSB7Zm9udC1mYW1pbHk6ICJDb3VyaWVyIE5ldyIsIENvdXJpZXIsIG1vbm99Ci0tLT4KLTwvc3R5bGU+Ci08L2hlYWQ+Ci0KLTxib2R5PgotPGgyPjxhPjwvYT48YT48L2E+PGE+RXhlcmNpc2UgNjogQ3JlYXRlIEd1aWRhbmNlIDwvYT48L2gyPgotPHA+VGhlIHB1cnBvc2Ugb2YgdGhpcyBleGVyY2lzZSBpcyB0byBjcmVhdGUgbWV0aG9kIDxzdHJvbmc+R3VpZGFuY2UgPC9zdHJvbmc+IGVsZW1lbnRzLiBUaGVyZSBpcyBhIHJhbmdlIG9mIGRpZmZlcmVudCB0eXBlcyBvZiBndWlkYW5jZSB0aGF0IGNhbiBiZSBjcmVhdGVkLiBGb3IgdGhpcyB0YXNrIHdlIHdpbGwgc2ltcGx5IGNyZWF0ZSBhIHJlcHJlc2VudGF0aXZlIGd1aWRhbmNlIGVsZW1lbnQsIGEgY2hlY2tsaXN0LiBPbmNlIHlvdSBoYXZlIGRvbmUgdGhpcywgdHJ5IGF1dGhvcmluZyBhZGRpdGlvbmFsIEd1aWRhbmNlIHR5cGVzLiA8L3A+Ci08cD5JbiBhIGNoZWNrbGlzdCwgQ2hlY2sgSXRlbXMgYXJlIGNyZWF0ZWQgaW4gdGhlIHNhbWUgd2F5IGFzIFN0ZXBzIGluIGEgdGFzayBhcmUgY3JlYXRlZCB1c2luZyB0aGUgPHN0cm9uZz5DaGVjayBJdGVtcyA8L3N0cm9uZz4gdGFiIGluIHRoZSA8c3Ryb25nPkNoZWNrbGlzdCBFZGl0b3I8L3N0cm9uZz4uIDwvcD4KLTxvbD4KLSAgPGxpPgotICAgIDxwPk1ha2Ugc3VyZSB5b3UgYXJlIGluIHRoZSA8c3Ryb25nPkF1dGhvcmluZyA8L3N0cm9uZz4gcGVyc3BlY3RpdmUuIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPldpdGhpbiA8c3BhbiBjbGFzcz0ic3R5bGUxIj5NeSBDb250ZW50IFBhY2thZ2U8L3NwYW4+IHJpZ2h0LWNsaWNrIG9uIHRoZSA8c3Ryb25nPkd1aWRhbmNlIDwvc3Ryb25nPiBmb2xkZXIuIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPkhpZ2hsaWdodCA8c3Ryb25nPk5ldyA8L3N0cm9uZz4gYW5kIHRoZW4gY2xpY2sgPHN0cm9uZz5DaGVja2xpc3Q8L3N0cm9uZz4uIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPk5hbWUgdGhlIGd1aWRhbmNlLCBteV9jcmVhdGVfcGh5c2ljYWxfYXBwZWFyYW5jZV9jaGVja2xpc3QsIGFuZCBwcm92aWRlIHRoZSBwcmVzZW50YXRpb24gbmFtZSwgTXkgQ3JlYXRlIFBoeXNpY2FsIEFwcGVhcmFuY2UgQ2hlY2tsaXN0LiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4gICAgQWRkIHRoZSBmb2xsb3dpbmcgY2hlY2sgaXRlbXM6IDwvbGk+Ci0gIDxibG9ja3F1b3RlPgotICAgIDxwPiYjMTQ5OyZuYnNwOyBDcmVhdGUgYnJhbmRpbmcgc3BlY2lmaWNhdGlvbnMgPC9wPgotICAgIDxwPiYjMTQ5OyZuYnNwOyBEZWZpbmUgcGh5c2ljYWwgc3BlY2lmaWNhdGlvbnMgPC9wPgotICA8L2Jsb2NrcXVvdGU+Ci0gIDxsaT5BZGQgdGhlIGNoZWNrbGlzdCB0byB0aGUgPHN0cm9uZz4gbXlfcHJvdG90eXBlX3VzZXJfaW50ZXJmYWNlIDwvc3Ryb25nPnRhc2sgYW5kIHRoZW4gbG9vayBmb3IgaXQgb24gdGhlIHByZXZpZXcgcGFnZS4gPC9saT4KLTwvb2w+Ci08aDI+Jm5ic3A7PC9oMj4KLTxoMT4mbmJzcDs8L2gxPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHV0b3JpYWxzL3R1dG9yaWFsXzJfZXhfNy5odG0gYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90dXRvcmlhbHMvdHV0b3JpYWxfMl9leF83Lmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDlkNDYwZi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90dXRvcmlhbHMvdHV0b3JpYWxfMl9leF83Lmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iCi0iaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotCi08aHRtbD4KLTxoZWFkPgotPHRpdGxlPlVudGl0bGVkIERvY3VtZW50PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KLTwhLS0KLS5zdHlsZTEge2ZvbnQtZmFtaWx5OiAiQ291cmllciBOZXciLCBDb3VyaWVyLCBtb25vfQotLS0+Ci08L3N0eWxlPgotPC9oZWFkPgotCi08Ym9keT4KLTxoMj48YT48L2E+PGE+PC9hPjxhPjwvYT48YT5FeGVyY2lzZSA3OiBNYW5hZ2UgR3VpZGFuY2UgPC9hPjwvaDI+Ci08cD5HdWlkYW5jZSBjYW4gYmUgYXR0YWNoZWQgdG8gYW55IENvcmUgTWV0aG9kIENvbnRlbnQgb3IgUHJvY2VzcyBFbGVtZW50LiBHdWlkYW5jZSBjYW4gZXZlbiBiZSBhdHRhY2hlZCB0byBhIEd1aWRhbmNlIGVsZW1lbnQuIDwvcD4KLTxwPlRoZSBnb2FsIG9mIHRoaXMgZXhlcmNpc2UgaXMgdG8gY2Fycnkgb3V0IHNvbWUgc2ltcGxlIGd1aWRhbmNlIG1hbmFnZW1lbnQgdGFza3MgKGkuZS4sIGFkZGluZyBhbmQgcmVtb3ZpbmcgZ3VpZGFuY2UuKTwvcD4KLTxvbD4KLSAgPGxpPgotICAgIDxwPk5hdmlnYXRlIHRvIHRoZSBhcnRpZmFjdCA8c3Ryb25nPm15X3J1cF9uYXZtYXAgPC9zdHJvbmc+IHRoYXQgeW91IGNyZWF0ZWQgaW4gZXhlcmNpc2UgMiBpbiB0aGlzIHR1dG9yaWFsLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4gICAgQWRkIHRoZSBDb25jZXB0IFBhcGVyIDxzdHJvbmc+cHJvY2Vzc192aWV3IDwvc3Ryb25nPiBmcm9tIHRoZSBSVVAgcGx1Zy1pbi4gPC9saT4KLSAgPGJsb2NrcXVvdGU+Ci0gICAgPHA+VGhlIGxpc3Qgb2YgaXRlbXMgaW4gdGhlIFNlbGVjdCBEaWFsb2cgaXMgcmVzdHJpY3RlZCB0byBqdXN0IHRob3NlIGl0ZW1zIHRoYXQgYXJlIGFsbG93ZWQgdG8gYmUgYWRkZWQuIFRoZSBsaXN0IGNhbiBiZSBsb25nIHRob3VnaC4gWW91IGNhbiBlbnRlciBhIHNlYXJjaCBzdHJpbmcsIHN1Y2ggYXMgkXBybycgaW4gdGhlIJFOYW1lIHBhdHRlcm5zJyBib3ggdG8gZmlsdGVyIHRoZSBpdGVtcyB0aGF0IGFyZSBkaXNwbGF5ZWQuIE5vdGUgdGhhdCB5b3UgY2FuIHVzZSB0aGUgQ29sbGFwc2UgQWxsIGFuZCBFeHBhbmQgQWxsIGJ1dHRvbnMgb24gdGhpcyBkaWFsb2cgdG8gY2hhbmdlIHRoZSB3YXkgdGhlIHRyZWUgaXMgZGlzcGxheWVkLiA8L3A+Ci0gIDwvYmxvY2txdW90ZT4KLSAgPGxpPgotICAgIDxwPkFkZCA8c3Ryb25nPm15X2NyZWF0ZV9waHlzaWNhbF9hcHBlYXJhbmNlX2NoZWNrbGlzdCA8L3N0cm9uZz4gQ2hlY2tsaXN0LiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD5DbGljayB0aGUgPHN0cm9uZz5QcmV2aWV3IDwvc3Ryb25nPiB0YWIgdG8gdmlldyB5b3VyIHdvcmsuIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPlJlbW92ZSB0aGUgQ29uY2VwdCBQYXBlciBwcm9jZXNzX3ZpZXcuIDwvcD4KLSAgPC9saT4KLSAgPGxpPkNsaWNrIHRoZSA8c3Ryb25nPlByZXZpZXcgPC9zdHJvbmc+IHRhYiB0byB2aWV3IHlvdXIgd29yay4gPC9saT4KLTwvb2w+Ci08aDI+Jm5ic3A7PC9oMj4KLTxoMT4mbmJzcDs8L2gxPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHV0b3JpYWxzL3R1dG9yaWFsXzJfZXhfOC5odG0gYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90dXRvcmlhbHMvdHV0b3JpYWxfMl9leF84Lmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2QyMzY5NC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90dXRvcmlhbHMvdHV0b3JpYWxfMl9leF84Lmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iCi0iaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotCi08aHRtbD4KLTxoZWFkPgotPHRpdGxlPlVudGl0bGVkIERvY3VtZW50PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KLTwhLS0KLS5zdHlsZTEge2ZvbnQtZmFtaWx5OiAiQ291cmllciBOZXciLCBDb3VyaWVyLCBtb25vfQotLS0+Ci08L3N0eWxlPgotPC9oZWFkPgotCi08Ym9keT4KLTxoMj48YT48L2E+PGE+PC9hPjxhPjwvYT48YT48L2E+PGE+PC9hPjxhPkV4ZXJjaXNlIDg6IENyZWF0ZSBOZXcgU3RhbmRhcmQgQ2F0ZWdvcnkgPC9hPjwvaDI+Ci08cD5UaGUgcHVycG9zZSBvZiB0aGlzIGV4ZXJjaXNlIGlzIHRvIHVuZGVyc3RhbmQgYW5kIHVzZSA8c3Ryb25nPlN0YW5kYXJkIENhdGVnb3JpZXMuIDwvc3Ryb25nPkluIHByYWN0aWNlLCB0aGlzIHdpbGwgbm90IGJlIGRvbmUgdmVyeSBvZnRlbiwgYXMgU3RhbmRhcmQgQ2F0ZWdvcmllcyB0ZW5kIHRvIGJlIHJlbGF0aXZlbHkgc3RhYmxlLiBBbHNvLCBpZiB5b3UgYXJlIGNyZWF0aW5nIGEgcGx1Zy1pbiB0aGF0IGV4dGVuZHMgUlVQLCB5b3Ugc2hvdWxkIGF0dGVtcHQgdG8gdXNlIHRoZSBSVVAgU3RhbmRhcmQgQ2F0ZWdvcmllcyBiZWZvcmUgY3JlYXRpbmcgbmV3IG9uZXMuIDwvcD4KLTxwPjxzdHJvbmc+U3RhbmRhcmQgQ2F0ZWdvcmllcyA8L3N0cm9uZz4gcHJvdmlkZSBhIG1lYW5zIHRvIGNhdGVnb3JpemUgY29yZSBtZXRob2QgY29udGVudCBpbiBsaW5lIHdpdGggYmVzdCBwcmFjdGljZXMgZm9yIGNyZWF0aW5nIHN0cnVjdHVyZWQgbWV0aG9kcy4gSW4gb3JkZXIgdG8gZW5jb3VyYWdlIGdvb2QgbWV0aG9kIHN0cnVjdHVyZSB3ZSBwcm92aWRlIHN0YW5kYXJkIGNhdGVnb3JpZXMgZm9yIGdyb3VwaW5nIDxzdHJvbmc+VGFza3MgPC9zdHJvbmc+aW50byA8c3Ryb25nPjxlbT5EaXNjaXBsaW5lcyA8L2VtPjwvc3Ryb25nPiwgPHN0cm9uZz5Xb3JrIFByb2R1Y3RzIDwvc3Ryb25nPiBpbnRvIDxzdHJvbmc+PGVtPkRvbWFpbnMgPC9lbT48L3N0cm9uZz4sIDxzdHJvbmc+Um9sZXMgPC9zdHJvbmc+IGludG8gPHN0cm9uZz48ZW0+Um9sZSBTZXRzIDwvZW0+PC9zdHJvbmc+LCBhbmQgPHN0cm9uZz5Ub29sLU1lbnRvcnMgPC9zdHJvbmc+IGludG8gPHN0cm9uZz48ZW0+VG9vbHMgPC9lbT48L3N0cm9uZz4uIFVubGlrZSA8c3Ryb25nPjxlbT5DdXN0b20gPC9lbT4gQ2F0ZWdvcmllcyA8L3N0cm9uZz4sIDxzdHJvbmc+U3RhbmRhcmQgQ2F0ZWdvcmllcyA8L3N0cm9uZz4gYnkgZGVmaW5pdGlvbiBhcmUgbGlua2VkIHdpdGggYSBzcGVjaWZpYyBtZXRob2QgY29udGVudCB0eXBlIJYgZS5nLiBSb2xlIFNldHMgd2l0aCBSb2xlcywgRGlzY2lwbGluZXMgd2l0aCBUYXNrcywgYW5kIERvbWFpbnMgd2l0aCBXb3JrIFByb2R1Y3RzLiA8L3A+Ci08b2w+Ci0gIDxsaT4KLSAgICA8cD5DbGljayA8c3Ryb25nPk15IFBsdWdpbiAmZ3Q7IE1ldGhvZCBDb250ZW50ICZndDsgU3RhbmRhcmQgQ2F0ZWdvcmllczwvc3Ryb25nPi4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+IENyZWF0ZSBhIG5ldyA8c3Ryb25nPlJvbGUgU2V0IDwvc3Ryb25nPm5hbWVkIDxzcGFuIGNsYXNzPSJzdHlsZTEiPm15X2Rlc2lnbjwvc3Bhbj4gd2l0aCBhIHByZXNlbnRhdGlvbiBuYW1lIG9mIDxzcGFuIGNsYXNzPSJzdHlsZTEiPk15IERlc2lnbjwvc3Bhbj4uIDwvcD4KLSAgPC9saT4KLSAgPGxpPiAgICBBZGQgdGhlIHJvbGUgPHNwYW4gY2xhc3M9InN0eWxlMSI+bXlfcnVwX3VzZXJfaW50ZXJmYWNlX2Rlc2lnbmVyPC9zcGFuPiB0byB0aGU8c3BhbiBjbGFzcz0ic3R5bGUxIj4gbXlfZGVzaWduPC9zcGFuPiA8c3Ryb25nPlJvbGUgU2V0PC9zdHJvbmc+LiA8L2xpPgotPC9vbD4KLTxibG9ja3F1b3RlPgotICA8cD5UaGVyZSBhcmUgdHdvIHdheXMgeW91IGNhbiBkbyB0aGlzOiA8L3A+Ci0gIDxibG9ja3F1b3RlPgotICAgIDxwPiYjMTQ5OyZuYnNwOyBJbiB0aGUgU3RhbmRhcmQgQ2F0ZWdvcnkgZWRpdG9yIGZvciA8c3BhbiBjbGFzcz0ic3R5bGUxIj5teV9kZXNpZ248L3NwYW4+LCBvcGVuIHRoZSA8c3Ryb25nPlJvbGVzPC9zdHJvbmc+IHRhYiwgYW5kIGFkZCB0aGUgcm9sZSB0byB0aGUgcm9sZXNldC4gPC9wPgotICAgIDxwPiYjMTQ5OyZuYnNwO0luIHRoZSBSb2xlIGVkaXRvciBmb3IgPHNwYW4gY2xhc3M9InN0eWxlMSI+bXlfcnVwX3VzZXJfaW50ZXJmYWNlX2Rlc2lnbmVyPC9zcGFuPiwgb3BlbiB0aGUgPHN0cm9uZz5DYXRlZ29yaWVzPC9zdHJvbmc+IHRhYiBhbmQgYWRkIHRoZSA8c3BhbiBjbGFzcz0ic3R5bGUxIj5teV9kZXNpZ248L3NwYW4+IGNhdGVnb3J5IGFzIGEgU2VsZWN0ZWQgUm9sZXNldC4gPC9wPgotICA8L2Jsb2NrcXVvdGU+Ci08L2Jsb2NrcXVvdGU+Ci08aDI+Jm5ic3A7PC9oMj4KLTxoMT4mbmJzcDs8L2gxPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHV0b3JpYWxzL3R1dG9yaWFsXzJfZXhfOS5odG0gYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90dXRvcmlhbHMvdHV0b3JpYWxfMl9leF85Lmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWU3ODkzMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90dXRvcmlhbHMvdHV0b3JpYWxfMl9leF85Lmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iCi0iaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotCi08aHRtbD4KLTxoZWFkPgotPHRpdGxlPlVudGl0bGVkIERvY3VtZW50PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPC9oZWFkPgotCi08Ym9keT4KLTxoMj48YT48L2E+PGE+PC9hPjxhPjwvYT48YT48L2E+PGE+PC9hPjxhPkV4ZXJjaXNlIDk6IDwvYT5BZGRpbmcgWW91ciBQbHVnLWluIHRvIHRoZSBDb25maWd1cmF0aW9uIFZpZXcgPC9oMj4KLTxwPlRoZSBwdXJwb3NlIG9mIHRoaXMgZXhlcmNpc2UgaXMgdG8gbGVhcm4gaG93IHRvIGluY2x1ZGUgeW91ciBwbHVnLWluIGluIGEgY29uZmlndXJhdGlvbi4gPC9wPgotPHA+QmVmb3JlIHlvdXIgbmV3IGVsZW1lbnRzIGNhbiBiZSBzZWVuIGluIHRoZSBDb25maWd1cmF0aW9uIFZpZXcsIHlvdSBuZWVkIHRvIGZpcnN0IGFkZCB5b3VyIG5ldyBwbHVnLWluIHRvIGEgY29uZmlndXJhdGlvbi4gV2UnbGwgYWRkIHRoZSBuZXcgcGx1Zy1pbiB0byB0aGUgQ29uZmlnIGZvciBSVVAgY29uZmlndXJhdGlvbiBhbmQgc2VlIHRoZSByZXN1bHRzIGluIHRoZSBDb25maWd1cmF0aW9uIFZpZXcuIDwvcD4KLTxvbD4KLSAgPGxpPgotICAgIDxwPlN3aXRjaCB0byB0aGUgPHN0cm9uZz5Ccm93c2luZyA8L3N0cm9uZz5wZXJzcGVjdGl2ZSBhbmQgaW4gdGhlIDxzdHJvbmc+Q29uZmlndXJhdGlvbiBWaWV3IDwvc3Ryb25nPnRyeSB0byBmaW5kIHlvdXIgbmV3IGNvbnRlbnQuIEZvciBleGFtcGxlIGxvb2sgZm9yIE15IERlc2lnbiBSb2xlc2V0LiBZb3Ugc2hvdWxkbid0IHNlZSBpdC4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+IFN3aXRjaCB0byB0aGUgPHN0cm9uZz5BdXRob3JpbmcgPC9zdHJvbmc+cGVyc3BlY3RpdmUgYW5kIHRoZW4gY2xpY2sgPHN0cm9uZz5Db25maWd1cmF0aW9ucyA8L3N0cm9uZz4gYXQgdGhlIGJvdHRvbSBvZiB0aGUgdHJlZSBkaXNwbGF5LiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD4gTWFrZSBhIGNvcHkgb2YgdGhlIDxzdHJvbmc+UlVQIGZvciBTbWFsbCBQcm9qZWN0cyA8L3N0cm9uZz4gY29uZmlndXJhdGlvbi4gUmlnaHQtY2xpY2sgb24gdGhlIDxzdHJvbmc+UlVQIGZvciBTbWFsbCBQcm9qZWN0cyA8L3N0cm9uZz4gY29uZmlndXJhdGlvbiBhbmQgc2VsZWN0IDxzdHJvbmc+Q29weSA8L3N0cm9uZz4uIFRoZW4gcmlnaHQtY2xpY2sgb24gdGhlIENvbmZpZ3VyYXRpb25zIGZvbGRlciBhbmQgY2xpY2sgPHN0cm9uZz5QYXN0ZSA8L3N0cm9uZz4uIE5hbWUgdGhlIG5ldyBjb25maWd1cmF0aW9uIDxzdHJvbmc+TXkgUlVQIGZvciBTbWFsbCBQcm9qZWN0cy4gPC9zdHJvbmc+PC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+IERvdWJsZS1jbGljayBvbiB0aGUgPHN0cm9uZz5NeSBSVVAgZm9yIFNtYWxsIFByb2plY3RzIDwvc3Ryb25nPiBjb25maWd1cmF0aW9uIHRvIG9wZW4gdGhlIENvbmZpZ3VyYXRpb24gRWRpdG9yLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD4gQ2xpY2sgb24gdGhlIDxzdHJvbmc+UGx1Zy1pbiBhbmQgUGFja2FnZSBTZWxlY3Rpb248L3N0cm9uZz4gdGFiLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD4gQWRkIDxzdHJvbmc+TXkgUGx1Z2luIDwvc3Ryb25nPiB0byB0aGUgY29uZmlndXJhdGlvbiBieSBjaGVja2luZyB0aGUgYm94IG5leHQgdG8gaXQgaW4gdGhlIENvbmZpZ3VyYXRpb24gQ29tcG9uZW50cyBmaWVsZC4gSWYgeW91IGV4cGFuZCA8c3Ryb25nPk15IFBsdWdpbiA8L3N0cm9uZz4geW91IHdpbGwgc2VlIHRoYXQgdGhlIGZ1bGwgY29udGVudHMgb2YgdGhlIHBsdWctaW4gaGF2ZSBiZWVuIHNlbGVjdGVkLiAKLSAgICAgIFlvdSBtYXkgc2VlIHNvbWUgZXJyb3JzIGluIHRoZSBMaWJyYXJ5IEVycm9yIExvZyB2aWV3LiBZb3UgY2FuIGNsaWNrIHRocm91Z2ggdGhlc2UgZXJyb3JzIG9yIGlnbm9yZSB0aGVtIGZvciBub3cuIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPiBDbG9zZSB0aGUgZWRpdG9yIGFuZCBzYXZlIHRoZSBjaGFuZ2VzLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD4gQ2hhbmdlIHRoZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24gdG8gPHN0cm9uZz5NeSBSVVAgZm9yIFNtYWxsIFByb2plY3RzIDwvc3Ryb25nPmluIHRoZSBjb25maWd1cmF0aW9uIHNlbGVjdGlvbiBib3ggaW4gdGhlIEVQRiBDb21wb3NlciB0b29sYmFyLCBqdXN0IGJlbG93IHRoZSBtYWluIG1lbnUgYmFyLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4gU3dpdGNoIHRvIHRoZSA8c3Ryb25nPkJyb3dzaW5nIDwvc3Ryb25nPiBwZXJzcGVjdGl2ZSBhbmQgbm93IGxvb2sgZm9yIHlvdXIgY29udGVudCBpbiB0aGUgPHN0cm9uZz5Db25maWd1cmF0aW9uIFZpZXc8L3N0cm9uZz4uIFlvdSBzaG91bGQgbm93IHNlZSA8c3Ryb25nPk15IERlc2lnbiBSb2xlc2V0IDwvc3Ryb25nPi4gWW91IHNob3VsZCBhbHNvIHNlZSB5b3VyIG5ldyBXb3JrIFByb2R1Y3RzIGluIHRoZSBVbmNhdGVnb3JpemVkIGZvbGRlciB1bmRlciBEb21haW5zLiA8L2xpPgotPC9vbD4KLTxibG9ja3F1b3RlPiZuYnNwOzwvYmxvY2txdW90ZT4KLTxoMj4mbmJzcDs8L2gyPgotPGgxPiZuYnNwOzwvaDE+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90dXRvcmlhbHMvdHV0b3JpYWxfMl9pbnRyby5odG0gYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90dXRvcmlhbHMvdHV0b3JpYWxfMl9pbnRyby5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzZWNhODguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHV0b3JpYWxzL3R1dG9yaWFsXzJfaW50cm8uaHRtCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIKLSJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci0KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+VW50aXRsZWQgRG9jdW1lbnQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxib2R5PgotPGgxPjxhPlR1dG9yaWFsOiBDcmVhdGUgTWV0aG9kIENvbnRlbnQgPC9hPjwvaDE+Ci08aDI+PGE+SW50cm9kdWN0aW9uIDwvYT48L2gyPgotPHA+RVBGIENvbXBvc2VyIHNlcGFyYXRlcyByZXVzYWJsZSA8c3Ryb25nPm1ldGhvZCBjb250ZW50IDwvc3Ryb25nPiBmcm9tIGl0cyBhcHBsaWNhdGlvbiBpbiA8c3Ryb25nPnByb2Nlc3NlcyA8L3N0cm9uZz4uIFRoZSBwcmltYXJ5IG1ldGhvZCBjb250ZW50IGVsZW1lbnRzIGFyZSA8c3Ryb25nPnRhc2tzIDwvc3Ryb25nPiwgPHN0cm9uZz5yb2xlcyA8L3N0cm9uZz4sIDxzdHJvbmc+d29yayBwcm9kdWN0cyA8L3N0cm9uZz4gYW5kIDxzdHJvbmc+Z3VpZGFuY2UgPC9zdHJvbmc+LiBBIFByb2Nlc3MgRW5naW5lZXIgdXNlcyBFUEYgQ29tcG9zZXIgdG8gYXV0aG9yIHRoZXNlIGVsZW1lbnRzLCBkZWZpbmUgdGhlIHJlbGF0aW9uc2hpcHMgYmV0d2VlbiB0aGVtLCBhbmQgdG8gY2F0ZWdvcml6ZSB0aGVtLiBNZXRob2QgY29udGVudCBwcm92aWRlcyBzdGVwLWJ5LXN0ZXAgZXhwbGFuYXRpb25zLCBkZXNjcmliaW5nIGhvdyBzcGVjaWZpYyBkZXZlbG9wbWVudCBnb2FscyBhcmUgYWNoaWV2ZWQgaW5kZXBlbmRlbnQgb2YgdGhlIHBsYWNlbWVudCBvZiB0aGVzZSBzdGVwcyB3aXRoaW4gYSBkZXZlbG9wbWVudCBsaWZlY3ljbGUuIFByb2Nlc3NlcyB0YWtlIHRoZXNlIG1ldGhvZCBlbGVtZW50cyBhbmQgcmVsYXRlIHRoZW0gaW50byBzZW1pLW9yZGVyZWQgc2VxdWVuY2VzIHRoYXQgYXJlIGN1c3RvbWl6ZWQgdG8gc3BlY2lmaWMgdHlwZXMgb2YgcHJvamVjdHMuIDwvcD4KLTxwPkVQRiBDb21wb3NlciBzdXBwb3J0cyB0aGUgY29uY2VwdCBvZiA8c3Ryb25nPk1ldGhvZCBQbHVnLWlucyA8L3N0cm9uZz4gdGhhdCBhbGxvd3MgdGhlIGV4dGVuc2lvbiBvciBjdXN0b21pemF0aW9uIG9mIGJhc2UgbGlicmFyeSBjb250ZW50IHdpdGhvdXQgZGlyZWN0bHkgY2hhbmdpbmcgdGhhdCBiYXNlIGNvbnRlbnQuIFdoZW4gd2Ugc2hpcCBhIGxpYnJhcnkgd2l0aCBFUEYgQ29tcG9zZXIgdGhlIGxpYnJhcnkgaXMgcHJvdGVjdGVkIGZyb20gZGlyZWN0IG1vZGlmaWNhdGlvbi4gVGhlIFJVUCBwbHVnaW5zIGFyZSBncmF5ZWQgb3V0IGluIHRoZSBMaWJyYXJ5IHZpZXcgaW5kaWNhdGluZyB0aGF0IHRoZXkgYXJlIGxvY2tlZC4gPC9wPgotPHA+PHN0cm9uZz5Zb3Ugc2hvdWxkIGFsd2F5cyBjcmVhdGUgbmV3IGNvbnRlbnQgaW4gYSBNZXRob2QgUGx1Zy1pbiB0aGF0IHlvdSBwcm9kdWNlLiA8L3N0cm9uZz5UaGlzIHNlcGFyYXRlcyB5b3VyIGNvbnRlbnQgZnJvbSB0aGUgb3JpZ2luYWwgT3BlblVQIGNvbnRlbnQgYW5kIGFsbG93cyB5b3UgdG8gdXBkYXRlIHlvdXIgb3duIGxpYnJhcnkgd2l0aCBuZXcgcmVsZWFzZXMgb2YgdGhlIE9wZW5VUCBsaWJyYXJ5IHdpdGhvdXQgYWZmZWN0aW5nIHRoZSBjb250ZW50IHRoYXQgeW91IGhhdmUgY3JlYXRlZCBpbiB5b3VyIG93biBwbHVnLWlucy4gPC9wPgotPHA+SW4gdGhpcyB0dXRvcmlhbCB5b3Ugd2lsbCB1c2Ugc2V2ZXJhbCCRZWRpdG9ycycuIEVhY2ggZWRpdG9yIG9wZW5zIGluIGl0cyBvd24gdGFiIGluIHRoZSBjb250ZW50IGRpc3BsYXkgc2VjdGlvbiBvZiB0aGUgc2NyZWVuLiBJdCBpcyBnb29kIHByYWN0aWNlIHRvIGNsb3NlIGFuIGVkaXRvciB3aGVuIHlvdSBoYXZlIGZpbmlzaGVkIHdpdGggaXQuIFRoaXMgZW5zdXJlcyB0aGF0IHlvdSBzYXZlIGFueSBjaGFuZ2VzIHlvdSBtYWtlLiA8L3A+Ci08cD5JZiB5b3UgZG8gaGF2ZSBzZXZlcmFsIGVkaXRvcnMgb3BlbiwgeW91IG1heSB3YW50IHRvIHR1cm4gb24gdGhlIJFMaW5rIHdpdGggRWRpdG9yJyBmZWF0dXJlIGJ5IGNsaWNraW5nIG9uIHRoZSBMaW5rIHdpdGggRWRpdG9yIGJ1dHRvbiBpbiB0aGUgTGlicmFyeSB2aWV3IHRvb2xiYXIuIElmIHRoaXMgaXMgc2VsZWN0ZWQsIHdoZW4geW91IHN3aXRjaCBiZXR3ZWVuIGVkaXRvcnMsIHRoZSBlbGVtZW50IGluIHRoZSBjdXJyZW50IGVkaXRvciBpcyBoaWdobGlnaHRlZCBpbiB0aGUgTGlicmFyeSB2aWV3LiA8L3A+Ci08cD5UaGUgZm9sbG93aW5nIGV4ZXJjaXNlcyB0YWtlIHlvdSB0aHJvdWdoIHRoZSBjcmVhdGlvbiBvZiCTY29yZSBtZXRob2QgY29udGVudJQuIDwvcD4KLTxoMj4mbmJzcDs8L2gyPgotPGgxPiZuYnNwOzwvaDE+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90dXRvcmlhbHMvdHV0b3JpYWxfM19leF8xLmh0bSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3R1dG9yaWFscy90dXRvcmlhbF8zX2V4XzEuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMjg5YjA5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3R1dG9yaWFscy90dXRvcmlhbF8zX2V4XzEuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIKLSJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci0KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+VW50aXRsZWQgRG9jdW1lbnQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08c3R5bGUgdHlwZT0idGV4dC9jc3MiPgotPCEtLQotLnN0eWxlMSB7Zm9udC1mYW1pbHk6ICJDb3VyaWVyIE5ldyIsIENvdXJpZXIsIG1vbm99Ci0tLT4KLTwvc3R5bGU+Ci08L2hlYWQ+Ci0KLTxib2R5PgotPGgyPjxhPkV4ZXJjaXNlIDE6IEFkZGluZyB0byBiYXNlIG1ldGhvZCBjb250ZW50IGFzc29jaWF0ZWQgd2l0aCBhIHJvbGUgdXNpbmcgQ29udHJpYnV0aW9uIDwvYT48L2gyPgotPHA+VGhlIHB1cnBvc2Ugb2YgdGhpcyBleGVyY2lzZSBpcyB0byBleHRlbmQgYSByb2xlIGluIFJVUCB1c2luZyCRY29udHJpYnV0aW9uJy4gPC9wPgotPG9sPgotICA8bGk+Ci0gICAgPHA+U3dpdGNoIHRvIHRoZSA8c3Ryb25nPkF1dGhvcmluZyA8L3N0cm9uZz4gcGVyc3BlY3RpdmUuIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPlRoaXMgZXhlcmNpc2UgYWRkcyBjb250ZW50IHRvIHRoZSBNeSBQbHVnaW4gcGx1Z2luLiBJZiB5b3UgaGF2ZSBub3QgY2FycmllZCBvdXQgdGhlIJFDcmVhdGUgQ29yZSBNZXRob2QgQ29udGVudCB0dXRvcmlhbCwgY3JlYXRlIGl0IG5vdy4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+Q3JlYXRlIGEgQ29udGVudCBQYWNrYWdlIGluIHRoZSBNeSBQbHVnaW4gcGx1Zy1pbiBjYWxsZWQgPHNwYW4gY2xhc3M9InN0eWxlMSI+Q29udHJpYnV0aW9uPC9zcGFuPiBUZXN0LiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD5JbiB0aGUgbmV3IENvbnRyaWJ1dGlvbiBUZXN0IGNvbnRlbnQgcGFja2FnZSwgY3JlYXRlIGEgbmV3IFJvbGU6IDxzcGFuIGNsYXNzPSJzdHlsZTEiPm15X2NvbnRyaWJ1dGluZ191aV9kZXNpZ25lcjwvc3Bhbj4uIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPlBhZ2UgZG93biB0aGUgRGVzY3JpcHRpb24gdGFiIHRvIHRoZSBDb250ZW50IFZhcmlhYmlsaXR5IHNlY3Rpb24gYW5kIHRoZW4sIGluIHRoZSA8c3Ryb25nPlZhcmlhYmlsaXR5IFR5cGUgPC9zdHJvbmc+LCBzZWxlY3QgPHN0cm9uZz5Db250cmlidXRlcyA8L3N0cm9uZz4gYW5kIGNob29zZSB0aGUgYmFzZSByb2xlOiA8c3Ryb25nPnJ1cF91c2VyX2ludGVyZmFjZV9kZXNpZ25lciA8L3N0cm9uZz4uIFlvdSB3aWxsIGZpbmQgdGhpcyBpbiA8c3Ryb25nPlJVUCAmZ3Q7IERlc2lnbiAmZ3Q7IEdVSSBEZXNpZ248L3N0cm9uZz4uIDwvcD4KLSAgPC9saT4KLSAgPGxpPiAgICBDb21wbGV0ZSB0aGUgZm9sbG93aW5nOiA8L2xpPgotICA8YmxvY2txdW90ZT4KLSAgICA8cD4mIzE0OTsmbmJzcDsgQWRkIEJyaWVmIERlc2NyaXB0aW9uOiBDb250cmlidXRpbmcgYnJpZWYgZGVzY3JpcHRpb24gdGV4dCA8L3A+Ci0gICAgPHA+JiMxNDk7Jm5ic3A7IEFkZCBNYWluIERlc2NyaXB0aW9uIDogQ29udHJpYnV0aW5nIG1haW4gZGVzY3JpcHRpb24gdGV4dCA8L3A+Ci0gICAgPHA+JiMxNDk7Jm5ic3A7IFNhdmUgKGJ5IGNsb3NpbmcgdGhlIHJvbGUgZWRpdG9yKS4gPC9wPgotICA8L2Jsb2NrcXVvdGU+Ci0gIDxsaT4KLSAgICA8cD5DcmVhdGUgYSBuZXcgQ29uZmlndXJhdGlvbiBieSBzZWxlY3RpbmcgdGhlIDxzdHJvbmc+Q29uZmlndXJhdGlvbnMgPC9zdHJvbmc+IGZvbGRlciBpbiB0aGUgTGlicmFyeSBWaWV3IHRyZWUuIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPlJpZ2h0IGNsaWNrIHRoZSBmb2xkZXIgdG8gY3JlYXRlIG5ldyBjb25maWd1cmF0aW9uIGFuZCB0aGVuIG5hbWUgdGhlIGNvbmZpZ3VyYXRpb24gPHNwYW4gY2xhc3M9InN0eWxlMSI+VmFyaWFiaWxpdHkgQ29uZmlndXJhdGlvbjwvc3Bhbj4uIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPiBTZWxlY3QgdGhlIFJVUCBiYXNlIGFuZCB5b3VyIHBsdWctaW4gKE15IFBsdWdpbikgYnkgbWFya2luZyB0aGUgY2hlY2tib3hlcy4gU2F2ZSB0aGUgY29uZmlndXJhdGlvbiAoY2xvc2UgdGhlIGNvbmZpZ3VyYXRpb24gdGFiKS4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+U2V0IJNjdXJyZW50IGNvbmZpZ3VyYXRpb26UIJYgbG9jYXRlZCB1bmRlciBtYWluIG1lbnUgYmFyIGFzIJNWYXJpYWJpbGl0eSBDb25maWd1cmEgdGlvbpQuIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPlN3aXRjaCB0byB0aGUgPHN0cm9uZz5Ccm93c2luZzwvc3Ryb25nPiBwZXJzcGVjdGl2ZSBhbmQgdGhlbiBvcGVuIHRoZSBVc2VyLUludGVyZmFjZSBEZXNpZ25lciByb2xlLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4gICAgWW91IHNob3VsZCBzZWUgdGhlIHRleHQgdGhhdCB5b3UgaW5jbHVkZWQgaW4gdGhlIENvbnRyaWJ1dGluZyByb2xlIGRpc3BsYXllZCBpbiB0aGUgVXNlci1JbnRlcmZhY2UgRGVzaWduZXIuIDwvbGk+Ci08L29sPgotPGJsb2NrcXVvdGU+Ci0gIDxwPjxzdHJvbmc+Tm90ZTogPC9zdHJvbmc+IFRoZSBDb25maWd1cmF0aW9uIFZpZXcgcmVzb2x2ZXMgdGhlIHZhcmlhYmlsaXR5IHJlbGF0aW9uc2hpcHMgYmV0d2VlbiByZWxhdGVkIHBsdWctaW5zIGluIGEgY29uZmlndXJhdGlvbiBhbmQgc2hvd3MgdGhlIHJlc3VsdHMgYXMgdGhleSB3aWxsIGJlIHB1Ymxpc2hlZCBpbiBhIHB1Ymxpc2hlZCB3ZWIgc2l0ZS4gPC9wPgotPC9ibG9ja3F1b3RlPgotPGgyPiZuYnNwOzwvaDI+Ci08aDE+Jm5ic3A7PC9oMT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3R1dG9yaWFscy90dXRvcmlhbF8zX2V4XzIuaHRtIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHV0b3JpYWxzL3R1dG9yaWFsXzNfZXhfMi5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzNzk3M2UuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHV0b3JpYWxzL3R1dG9yaWFsXzNfZXhfMi5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIgotImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLQotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT5VbnRpdGxlZCBEb2N1bWVudDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+Ci08IS0tCi0uc3R5bGUxIHtmb250LWZhbWlseTogIkNvdXJpZXIgTmV3IiwgQ291cmllciwgbW9ub30KLS0tPgotPC9zdHlsZT4KLTwvaGVhZD4KLQotPGJvZHk+Ci08aDI+PGE+RXhlcmNpc2UgMjogQWRkaW5nIHRvIGJhc2UgbWV0aG9kIGNvbnRlbnQgYXNzb2NpYXRlZCB3aXRoIGEgd29yayBwcm9kdWN0IHVzaW5nIDx1PkNvbnRyaWJ1dGlvbjwvdT4gPC9hPjwvaDI+Ci08cD5UaGUgcHVycG9zZSBvZiB0aGlzIGV4ZXJjaXNlIGlzIHRvIGV4dGVuZCBhIDxzdHJvbmc+V29yayBQcm9kdWN0IDwvc3Ryb25nPiAoPHN0cm9uZz5BcnRpZmFjdDwvc3Ryb25nPikgaW4gUlVQIHVzaW5nIJFjb250cmlidXRpb24nLiA8L3A+Ci08b2w+Ci0gIDxsaT4KLSAgICA8cD5Td2l0Y2ggdG8gdGhlIDxzdHJvbmc+QXV0aG9yaW5nIDwvc3Ryb25nPiBwZXJzcGVjdGl2ZS4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+IFdpdGhpbiB0aGUgQ29udHJpYnV0aW9uIFRlc3QgcGFja2FnZSBjcmVhdGUgYSBuZXcgYXJ0aWZhY3QgY2FsbGVkIDxzcGFuIGNsYXNzPSJzdHlsZTEiPm15X2NvbnRyaWJ1dGluZ19uYXZtYXA8L3NwYW4+LiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD4gQWRkIGEgPHN0cm9uZz5CcmllZiBEZXNjcmlwdGlvbiwgTWFpbiBEZXNjcmlwdGlvbjwvc3Ryb25nPiwgPHN0cm9uZz5QdXJwb3NlPC9zdHJvbmc+LCBldGMuLCA6IDxzcGFuIGNsYXNzPSJzdHlsZTEiPkNvbnRyaWJ1dGluZyBCcmllZiBEZXNjcmlwdGlvbiwgQ29udHJpYnV0aW5nIE1haW4gRGVzY3JpcHRpb24sIGFuZCBDb250cmlidXRpbmcgUHVycG9zZTwvc3Bhbj4uIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPiBJbiA8c3Ryb25nPlZhcmlhYmlsaXR5IFJlbGF0aW9uc2hpcCA8L3N0cm9uZz4gc2VsZWN0IDxzdHJvbmc+Q29udHJpYnV0ZXMgPC9zdHJvbmc+LCBhbmQgZm9yIDxzdHJvbmc+YmFzZSBhcnRpZmFjdCA8L3N0cm9uZz4gc2VsZWN0IDxzcGFuIGNsYXNzPSJzdHlsZTEiPnJ1cF9uYXZtYXA8L3NwYW4+LiBTYXZlIGJ5IGNsb3NpbmcgdGhlIFdvcmsgUHJvZHVjdCBlZGl0b3IuIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPiBTd2l0Y2ggdG8gdGhlIEJyb3dzaW5nIHBlcnNwZWN0aXZlIGFuZCB2aWV3IHRoZSBOYXZpZ2F0aW9uIE1hcCBhcnRpZmFjdCBpbiB0aGUgPHN0cm9uZz5BbmFseXNpcyBhbmQgRGVzaWduIERvbWFpbiA8L3N0cm9uZz4gZm9sZGVyIGluIDxzdHJvbmc+Q29uZmlndXJhdGlvbiBWaWV3LiA8L3N0cm9uZz48L3A+Ci0gIDwvbGk+Ci0gIDxsaT4gWW91IHNob3VsZCBzZWUgdGhlIHRleHQgdGhhdCB5b3UgaW5jbHVkZWQgaW4gdGhlIENvbnRyaWJ1dGluZyByb2xlIGRpc3BsYXllZCBpbiB0aGUgVXNlci1JbnRlcmZhY2UgRGVzaWduZXIuIDwvbGk+Ci08L29sPgotPGJsb2NrcXVvdGU+Jm5ic3A7PC9ibG9ja3F1b3RlPgotPGgyPiZuYnNwOzwvaDI+Ci08aDE+Jm5ic3A7PC9oMT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3R1dG9yaWFscy90dXRvcmlhbF8zX2V4XzMuaHRtIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHV0b3JpYWxzL3R1dG9yaWFsXzNfZXhfMy5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0NGQ5MGMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHV0b3JpYWxzL3R1dG9yaWFsXzNfZXhfMy5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIgotImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLQotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT5VbnRpdGxlZCBEb2N1bWVudDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+Ci08IS0tCi0uc3R5bGUxIHtmb250LWZhbWlseTogIkNvdXJpZXIgTmV3IiwgQ291cmllciwgbW9ub30KLS0tPgotPC9zdHlsZT4KLTwvaGVhZD4KLQotPGJvZHk+Ci08aDI+PGE+RXhlcmNpc2UgMzogQWRkaW5nIGJhc2UgbWV0aG9kIGNvbnRlbnQgYXNzb2NpYXRlZCB3aXRoIGEgdGFzayB1c2luZyA8dT5Db250cmlidXRpb248L3U+IDwvYT48L2gyPgotPHA+VGhlIHB1cnBvc2Ugb2YgdGhpcyBleGVyY2lzZSBpcyB0byBleHRlbmQgYSA8c3Ryb25nPlRhc2sgPC9zdHJvbmc+IGluIFJVUCB1c2luZyCRY29udHJpYnV0aW9uJy4gPC9wPgotPG9sPgotICA8bGk+Ci0gICAgPHA+U3dpdGNoIHRvIHRoZSA8c3Ryb25nPkF1dGhvcmluZyA8L3N0cm9uZz4gcGVyc3BlY3RpdmUuIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPldpdGhpbiB0aGUgPHNwYW4gY2xhc3M9InN0eWxlMSI+Q29udHJpYnV0aW9uIFRlc3QgPC9zcGFuPnBhY2thZ2UgY3JlYXRlIGEgbmV3IDxzdHJvbmc+VGFzazwvc3Ryb25nPjogPHNwYW4gY2xhc3M9InN0eWxlMSI+bXlfY29udHJpYnV0aW5nX2Rlc2lnbl91c2VyX2ludGVyZmFjZTwvc3Bhbj4uIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPiBBZGQgYSA8c3Ryb25nPkJyaWVmIERlc2NyaXB0aW9uLCBNYWluIGRlc2NyaXB0aW9uIDwvc3Ryb25nPiwgPHN0cm9uZz5QdXJwb3NlPC9zdHJvbmc+LCBldGMuLDogPHNwYW4gY2xhc3M9InN0eWxlMSI+Q29udHJpYnV0aW5nIEJyaWVmIERlc2NyaXB0aW9uIHRleHQsIENvbnRyaWJ1dGluZyBNYWluIERlc2NyaXB0aW9uIHRleHQsIGFuZCBDb250cmlidXRpbmcgUHVycG9zZSB0ZXh0LiA8L3NwYW4+PC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+IEFkZCB0d28gbmV3IHN0ZXBzOiA8c3BhbiBjbGFzcz0ic3R5bGUxIj5Db250cmlidXRpbmcgU3RlcCAxIDwvc3Bhbj5hbmQ8c3BhbiBjbGFzcz0ic3R5bGUxIj4gQ29udHJpYnV0aW5nIFN0ZXAgMjwvc3Bhbj4uIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPiBJbiA8c3Ryb25nPlZhcmlhYmlsaXR5IFJlbGF0aW9uc2hpcCA8L3N0cm9uZz4gc2VsZWN0IDxzdHJvbmc+Q29udHJpYnV0ZXM8L3N0cm9uZz4sIGFuZCBmb3IgYmFzZSA8c3Ryb25nPnRhc2sgPC9zdHJvbmc+IHNlbGVjdCwgPHNwYW4gY2xhc3M9InN0eWxlMSI+ZGVzaWduX3VzZXJfaW50ZXJmYWNlPC9zcGFuPi4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+IEdvIGJhY2sgdG8gdGhlIDxzdHJvbmc+U3RlcHMgPC9zdHJvbmc+IHRhYiBhbmQgY2xpY2sgdGhlIDxzdHJvbmc+T3JkZXIgPC9zdHJvbmc+IGJ1dHRvbi4gWW91IGNhbiBub3cgaW5zZXJ0IHlvdXIgbmV3IHN0ZXBzIGludG8gdGhlIG9yaWdpbmFsIHN0ZXBzLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD5TYXZlIHRoZSBuZXcgdGFzayBieSBjbG9zaW5nIHRoZSB0YXNrIGVkaXRvci4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+IFN3aXRjaCB0byB0aGUgQnJvd3NpbmcgcGVyc3BlY3RpdmUgYW5kIHZpZXcgdGhlIDxzcGFuIGNsYXNzPSJzdHlsZTEiPkRlc2lnbiB0aGUgVXNlciBJbnRlcmZhY2U8L3NwYW4+IHRhc2sgaW4gdGhlIDxzdHJvbmc+RGlzY2lwbGluZXMgPC9zdHJvbmc+IGZvbGRlciBpbiA8c3Ryb25nPkNvbmZpZ3VyYXRpb24gVmlldyA8L3N0cm9uZz4uIFlvdSB3aWxsIGZpbmQgaXQgdW5kZXIgdGhlIDxzcGFuIGNsYXNzPSJzdHlsZTEiPkFuYWx5c2lzXyZhbXA7IERlc2lnbjwvc3Bhbj4gZGlzY2lwbGluZS4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+IExvb2sgYXQgdGhlIGRlc2NyaXB0aW9ucyBhbmQgdGhlIHN0ZXBzIHRvIHNlZSBob3cgeW91ciBuZXcgbWF0ZXJpYWwgd2FzIGNvbnRyaWJ1dGVkLiBZb3Ugc2hvdWxkIHNlZSB0aGUgdGV4dCB0aGF0IHlvdSBpbmNsdWRlZCBpbiB0aGUgQ29udHJpYnV0aW5nIHJvbGUgZGlzcGxheWVkIGluIHRoZSBVc2VyIEludGVyZmFjZSB0YXNrLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4gWW91IGNhbiBhbHNvIHRyeSBzcGVjaWZ5aW5nIGFkZGl0aW9uYWwgPHN0cm9uZz5hcnRpZmFjdHMgPC9zdHJvbmc+LCA8c3Ryb25nPmd1aWRhbmNlIDwvc3Ryb25nPiwgPHN0cm9uZz5hZGRpdGlvbmFsIHBlcmZvcm1lciByb2xlczwvc3Ryb25nPiwgZXRjLiwgaW4gdGhlIGNvbnRyaWJ1dGluZyB0YXNrIChpbiBBdXRob3JpbmcgcGVyc3BlY3RpdmUpIGFuZCB0aGVuIHZpZXcgdGhlIHJlc3VsdCBpbiB0aGUgQ29uZmlndXJhdGlvbiBWaWV3IHRvIHNlZSB0aGUgYmVoYXZpb3IuIDwvbGk+Ci08L29sPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHV0b3JpYWxzL3R1dG9yaWFsXzNfZXhfNC5odG0gYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90dXRvcmlhbHMvdHV0b3JpYWxfM19leF80Lmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODQ1Y2U0My4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90dXRvcmlhbHMvdHV0b3JpYWxfM19leF80Lmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iCi0iaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotCi08aHRtbD4KLTxoZWFkPgotPHRpdGxlPlVudGl0bGVkIERvY3VtZW50PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KLTwhLS0KLS5zdHlsZTEge2ZvbnQtZmFtaWx5OiAiQ291cmllciBOZXciLCBDb3VyaWVyLCBtb25vfQotLS0+Ci08L3N0eWxlPgotPC9oZWFkPgotCi08Ym9keT4KLTxoMj48YT5FeGVyY2lzZSA0OiBFeHRlbmRpbmcgYmFzZSBtZXRob2QgY29udGVudCBhc3NvY2lhdGVkIHdpdGggYSByb2xlIHVzaW5nIDx1PkV4dGVuZHM8L3U+IDwvYT48L2gyPgotPHA+VGhlIHB1cnBvc2Ugb2YgdGhpcyBleGVyY2lzZSBpcyB0byBleHRlbmQgYmFzZSBtZXRob2QgY29udGVudCB2aWEgZXh0ZW5kcyB2YXJpYWJpbGl0eS4gRXh0ZW5kcyB2YXJpYWJpbGl0eSB3b3JrcyBkaWZmZXJlbnRseSB0aGFuIENvbnRyaWJ1dGVzIHZhcmlhYmlsaXR5IGluIHRoYXQgdGhlIG1ldGhvZCBjb250ZW50IGVsZW1lbnQgdGhhdCBleHRlbmRzIHRoZSBiYXNlIG1ldGhvZCBlbGVtZW50IGluaGVyaXRzIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBleHRlbmRlZCBiYXNlIGVsZW1lbnQuIDwvcD4KLTxvbD4KLSAgPGxpPgotICAgIDxwPiBTd2l0Y2ggdG8gdGhlIDxzdHJvbmc+QXV0aG9yaW5nIDwvc3Ryb25nPiBwZXJzcGVjdGl2ZS4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+IENyZWF0ZSBhIG5ldyA8c3Ryb25nPkNvbnRlbnQgUGFja2FnZSA8L3N0cm9uZz4gaW4gdGhlIE15IFBsdWdpbiBQbHVnLWluIGNhbGxlZCBFeHRlbmRzIFRlc3QuIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPiBDcmVhdGUgYSBuZXcgPHN0cm9uZz5Sb2xlIDwvc3Ryb25nPjogPHNwYW4gY2xhc3M9InN0eWxlMSI+bXlfZXh0ZW5kc191aV9kZXNpZ25lciw8L3NwYW4+IHdpdGggdGhlIHByZXNlbnRhdGlvbiBuYW1lLCA8c3BhbiBjbGFzcz0ic3R5bGUxIj5FeHRlbmRzIFJVUCBVSSBEZXNpZ25lcjwvc3Bhbj4uIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPiBJbiB0aGUgVmFyaWFiaWxpdHkgVHlwZSBzZWxlY3QgPHN0cm9uZz5FeHRlbmRzIDwvc3Ryb25nPiBhbmQgY2hvb3NlIHRoZSBiYXNlIHJvbGU6IDxzcGFuIGNsYXNzPSJzdHlsZTEiPnJ1cF91c2VyX2ludGVyZmFjZV9kZXNpZ25lcjwvc3Bhbj4uIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPiBBZGQgYSA8c3Ryb25nPkJyaWVmIERlc2NyaXB0aW9uPC9zdHJvbmc+OiBFeHRlbmRzIFJvbGUgQnJpZWYgRGVzY3JpcHRpb24uIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPiBBZGQgYSA8c3Ryb25nPk1haW4gRGVzY3JpcHRpb24gPC9zdHJvbmc+OiBFeHRlbmRzIFJvbGUgTWFpbiBEZXNjcmlwdGlvbi4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+IFNhdmUgdGhlIG5ldyByb2xlIGJ5IGNsb3NpbmcgdGhlIHJvbGUgZWRpdG9yLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4gVXBkYXRlIHRoZSBWYXJpYWJpbGl0eSBDb25maWd1cmF0aW9uIHRvIGluY2x1ZGUgdGhlIG5ldyBjb250ZW50IHBhY2thZ2UuIDwvbGk+Ci0gIDxibG9ja3F1b3RlPgotICAgIDxwPiAmIzE0OTsmbmJzcDtPcGVuIHRoZSA8c3BhbiBjbGFzcz0ic3R5bGUxIj5WYXJpYWJpbGl0eSBDb25maWd1cmF0aW9uPC9zcGFuPiBhbmQgZXhwYW5kIDxzdHJvbmc+TXkgUGx1Z2luICZndDsgTWV0aG9kIENvbnRlbnQgJmd0OyBDb250ZW50IFBhY2thZ2VzLiA8L3N0cm9uZz4gPC9wPgotICAgIDxwPiYjMTQ5OyBVbmNoZWNrIENvbnRyaWJ1dGlvbiBUZXN0LiA8L3A+Ci0gICAgPHA+JiMxNDk7IE1ha2Ugc3VyZSA8c3Ryb25nPkV4dGVuZHMgVGVzdCA8L3N0cm9uZz5pcyBjaGVja2VkLiBUaGlzIGlzIGRvbmUgc28gdGhlcmUgdGhhdCBhcmUgbm8gY29uZmxpY3RpbmcgZXh0ZW5zaW9ucyB0byB0aGUgc2FtZSBtZXRob2QgZWxlbWVudC4gPC9wPgotICAgIDxwPiYjMTQ5OyBDbG9zZSBhbmQgc2F2ZSB0aGUgY2hhbmdlcyB0byB0aGUgY29uZmlndXJhdGlvbi4gPC9wPgotICA8L2Jsb2NrcXVvdGU+Ci0gIDxsaT4KLSAgICA8cD4gU3dpdGNoIHRvIDxzdHJvbmc+QnJvd3NpbmcgPC9zdHJvbmc+IHBlcnNwZWN0aXZlLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4gSW4gdGhlIDxzdHJvbmc+Q29uZmlndXJhdGlvbiBWaWV3PC9zdHJvbmc+LCBzZWxlY3QgdGhlIDxzcGFuIGNsYXNzPSJzdHlsZTEiPkV4dGVuZHMgUlVQIFVJIERlc2lnbmVyIHJvbGU8L3NwYW4+IGluIHRoZSBVbmNhdGVnb3JpemVkIFJvbGVzIGZvbGRlciB1bmRlciB0aGUgkzxzdHJvbmc+Um9sZSBTZXRzPC9zdHJvbmc+lCBmb2xkZXIuIFlvdSB3aWxsIHNlZSBpbiB0aGUgaHRtbCBwYWdlIHRoYXQgY29udGVudCBlbnRlcmVkIGluIHRoZSBleHRlbmRpbmcgcm9sZSBoYXMgYmVlbiByZXBsYWNlZCwgd2hlcmVhcyBjb250ZW50IG5vdCBwcm92aWRlZCBoYXMgYmVlbiBpbmhlcml0ZWQgZnJvbSB0aGUgYmFzZSBhcnRpZmFjdC4gTm90ZSB0aGF0IHRoZSBleHRlbmRlZCByb2xlIDxzcGFuIGNsYXNzPSJzdHlsZTEiPlVzZXItSW50ZXJmYWNlIERlc2lnbmVyPC9zcGFuPiByZW1haW5zIHVuY2hhbmdlZC4gPC9saT4KLTwvb2w+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90dXRvcmlhbHMvdHV0b3JpYWxfM19leF81Lmh0bSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3R1dG9yaWFscy90dXRvcmlhbF8zX2V4XzUuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NGI4NTFmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3R1dG9yaWFscy90dXRvcmlhbF8zX2V4XzUuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIKLSJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci0KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+VW50aXRsZWQgRG9jdW1lbnQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08c3R5bGUgdHlwZT0idGV4dC9jc3MiPgotPCEtLQotLnN0eWxlMSB7Zm9udC1mYW1pbHk6ICJDb3VyaWVyIE5ldyIsIENvdXJpZXIsIG1vbm99Ci0tLT4KLTwvc3R5bGU+Ci08L2hlYWQ+Ci0KLTxib2R5PgotPGgyPjxhPkV4ZXJjaXNlIDU6IEV4dGVuZGluZyBiYXNlIG1ldGhvZCBjb250ZW50IGFzc29jaWF0ZWQgd2l0aCBhIFdvcmsgUHJvZHVjdCB1c2luZyA8dT5FeHRlbmRzPC91PiA8L2E+PC9oMj4KLTxwPlRoZSBwdXJwb3NlIG9mIHRoaXMgZXhlcmNpc2UgaXMgdG8gZXh0ZW5kIGEgYmFzZSBtZXRob2Qgd29yayBwcm9kdWN0IHVzaW5nIGV4dGVuZHMgdmFyaWFiaWxpdHkuIDwvcD4KLTxvbD4KLSAgPGxpPgotICAgIDxwPiBTd2l0Y2ggdG8gdGhlIDxzdHJvbmc+QXV0aG9yaW5nIDwvc3Ryb25nPiBwZXJzcGVjdGl2ZS4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+IENyZWF0ZSBhIG5ldyA8c3Ryb25nPldvcmsgUHJvZHVjdCA8L3N0cm9uZz4gaW4gdGhlIDxzcGFuIGNsYXNzPSJzdHlsZTEiPkV4dGVuZHMgVGVzdDwvc3Bhbj4gQ29udGVudCBQYWNrYWdlIGNhbGxlZCA8c3BhbiBjbGFzcz0ic3R5bGUxIj5teV9leHRlbmRzX3J1cF9uYXZtYXA8L3NwYW4+IHdpdGggdGhlIHByZXNlbnRhdGlvbiBuYW1lLCA8c3BhbiBjbGFzcz0ic3R5bGUxIj5FeHRlbmRzIFJVUCBOYXZtYXA8L3NwYW4+LiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD4gSW4gdGhlIDxzdHJvbmc+VmFyaWFiaWxpdHkgVHlwZSA8L3N0cm9uZz4gc2VsZWN0IDxzdHJvbmc+ZXh0ZW5kcyA8L3N0cm9uZz4gYW5kIGNob29zZSB0aGUgYmFzZSA8c3Ryb25nPldvcmsgUHJvZHVjdCA8L3N0cm9uZz48c3BhbiBjbGFzcz0ic3R5bGUxIj5ydXBfbmF2bWFwPC9zcGFuPi4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+IEFkZCBhIDxzdHJvbmc+QnJpZWYgRGVzY3JpcHRpb24gPC9zdHJvbmc+OiBFeHRlbmRzIE5hdm1hcCBCcmllZiBEZXNjcmlwdGlvbi4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+IFNhdmUgYW5kIHRoZW4gc3dpdGNoIHRvIHRoZSA8c3Ryb25nPkJyb3dzaW5nIDwvc3Ryb25nPiBwZXJzcGVjdGl2ZS4gPC9wPgotICA8L2xpPgotICA8bGk+SW4gdGhlIDxzdHJvbmc+Q29uZmlndXJhdGlvbiBWaWV3PC9zdHJvbmc+LCBzZWxlY3QgdGhlIDxzcGFuIGNsYXNzPSJzdHlsZTEiPkV4dGVuZHMgUlVQIE5hdm1hcDwvc3Bhbj4gd29yayBwcm9kdWN0IGluIHRoZSA8c3Ryb25nPlVuY2F0ZWdvcml6ZWQgRm9sZGVyIDwvc3Ryb25nPiB1bmRlciA8c3Ryb25nPkRvbWFpbnMgPC9zdHJvbmc+LiBZb3Ugd2lsbCBzZWUgaW4gdGhlIGh0bWwgcGFnZSB0aGF0IGNvbnRlbnQgZW50ZXJlZCBpbiB0aGUgZXh0ZW5kaW5nIGFydGlmYWN0IGhhcyBiZWVuIHJlcGxhY2VkLCB3aGVyZWFzIGNvbnRlbnQgbm90IHByb3ZpZGVkIGhhcyBiZWVuIGluaGVyaXRlZCBmcm9tIHRoZSBiYXNlIGFydGlmYWN0LiBOb3RlIHRoYXQgdGhlIGV4dGVuZGVkIGFydGlmYWN0IDxzcGFuIGNsYXNzPSJzdHlsZTEiPk5hdmlnYXRpb24gTWFwPC9zcGFuPiByZW1haW5zIHVuY2hhbmdlZC48L2xpPgotPC9vbD4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3R1dG9yaWFscy90dXRvcmlhbF8zX2V4XzYuaHRtIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHV0b3JpYWxzL3R1dG9yaWFsXzNfZXhfNi5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkYjRjNTEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHV0b3JpYWxzL3R1dG9yaWFsXzNfZXhfNi5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIgotImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLQotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT5VbnRpdGxlZCBEb2N1bWVudDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+Ci08IS0tCi0uc3R5bGUxIHtmb250LWZhbWlseTogIkNvdXJpZXIgTmV3IiwgQ291cmllciwgbW9ub30KLS0tPgotPC9zdHlsZT4KLTwvaGVhZD4KLQotPGJvZHk+Ci08aDI+PGE+RXhlcmNpc2UgNjogRXh0ZW5kaW5nIGJhc2UgbWV0aG9kIGNvbnRlbnQgYXNzb2NpYXRlZCB3aXRoIGEgVGFzayB1c2luZyA8dT5FeHRlbmRzPC91PiA8L2E+PC9oMj4KLTxwPlRoZSBwdXJwb3NlIG9mIHRoaXMgZXhlcmNpc2UgaXMgdG8gZXh0ZW5kIGEgYmFzZSBtZXRob2QgdGFzayB1c2luZyBleHRlbmRzIHZhcmlhYmlsaXR5LiA8L3A+Ci08b2w+Ci0gIDxsaT4KLSAgICA8cD4gQ3JlYXRlIGEgbmV3IDxzdHJvbmc+dGFzayA8L3N0cm9uZz4gaW4gdGhlIEV4dGVuZHMgVGVzdCBjb250ZW50IHBhY2thZ2UgY2FsbGVkIDxzcGFuIGNsYXNzPSJzdHlsZTEiPm15X2V4dGVuZHNfZGVzaWduX3VzZXJfaW50ZXJmYWNlPC9zcGFuPiwgd2l0aCBwcmVzZW50YXRpb24gbmFtZSwgPHNwYW4gY2xhc3M9InN0eWxlMSI+RXh0ZW5kcyBEZXNpZ24gVXNlciBJbnRlcmZhY2UuIDwvc3Bhbj48L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD4gSW4gdGhlIDxzdHJvbmc+VmFyaWFiaWxpdHkgVHlwZSwgPC9zdHJvbmc+IHNlbGVjdCA8c3Ryb25nPmV4dGVuZHMgPC9zdHJvbmc+IGFuZCBjaG9vc2UgdGhlIGJhc2UgdGFzayBkZXNpZ25fdXNlcl9pbnRlcmZhY2UuIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPiBBZGQgYSA8c3Ryb25nPkJyaWVmIERlc2NyaXB0aW9uIDwvc3Ryb25nPjogPHNwYW4gY2xhc3M9InN0eWxlMSI+RXh0ZW5kcyBUYXNrIEJyaWVmIERlc2NyaXB0aW9uPC9zcGFuPi4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+IEFkZCA8c3Ryb25nPlN0ZXBzIDwvc3Ryb25nPjogPHNwYW4gY2xhc3M9InN0eWxlMSI+RXh0ZW5kIFN0ZXAgMSwgRXh0ZW5kIFN0ZXAgMiA8L3NwYW4+PC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+IEFkZCB0aGUgPHN0cm9uZz5Sb2xlIDwvc3Ryb25nPiBjcmVhdGVkIGluIGV4ZXJjaXNlIDQ6IDxzcGFuIGNsYXNzPSJzdHlsZTEiPm15X2V4dGVuZHNfdWlfZGVzaWduZXI8L3NwYW4+LCBhcyBQcmltYXJ5IFBlcmZvcm1lci4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+IEFkZCB0aGUgV29yayBQcm9kdWN0IGNyZWF0ZWQgaW4gZXhlcmNpc2UgNTogPHNwYW4gY2xhc3M9InN0eWxlMSI+bXlfZXh0ZW5kc19ydXBfbmF2bWFwPC9zcGFuPiwgYXMgYW4gT3V0cHV0LiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD4gQWRkIDxzdHJvbmc+R3VpZGFuY2UgPC9zdHJvbmc+KGNob29zZSBhbnkgZ3VpZGFuY2UpIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPiBBZGQgdGhlIDxzdHJvbmc+dGFzayA8L3N0cm9uZz4gdG8gdGhlIGFwcHJvcHJpYXRlIFN0YW5kYXJkIENhdGVnb3J5OiA8c3BhbiBjbGFzcz0ic3R5bGUxIj5ydXBfYW5hbHlzaXNfZGVzaWduX2Rpc2NpcGxpbmU8L3NwYW4+LiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD4gU2F2ZSBhbmQgdGhlbiBzd2l0Y2ggdG8gdGhlIDxzdHJvbmc+QnJvd3NpbmcgPC9zdHJvbmc+IHBlcnNwZWN0aXZlLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT5JbiB0aGUgPHN0cm9uZz5Db25maWd1cmF0aW9uIFZpZXc8L3N0cm9uZz4sIHNlbGVjdCB0aGUgPHNwYW4gY2xhc3M9InN0eWxlMSI+RXh0ZW5kcyBEZXNpZ24gVXNlciBJbnRlcmZhY2U8L3NwYW4+IHRhc2sgdW5kZXIgdGhlIDxzdHJvbmc+RGlzY2lwbGluZXMgPC9zdHJvbmc+IGZvbGRlciBpbiB0aGUgPHNwYW4gY2xhc3M9InN0eWxlMSI+QW5hbHlzaXMgJmFtcDsgRGVzaWduPC9zcGFuPiBkaXNjaXBsaW5lLiBZb3Ugd2lsbCBzZWUgaW4gdGhlIGh0bWwgcGFnZSB0aGF0IG1ldGhvZCBjb250ZW50IGFuZCByZWxhdGlvbnNoaXBzIGhhdmUgYmVlbiBpbmhlcml0ZWQgZnJvbSB0aGUgYmFzZSB0YXNrIGFuZCBleHRlbmRlZCBieSB0aGUgcGx1Zy1pbiBleHRlbmRpbmcgY29udGVudCBhbmQgcmVsYXRpb25zaGlwcy4gTm90ZSB0aGF0IHRoZSBleHRlbmRlZCB0YXNrIHJlbWFpbnMgdW5jaGFuZ2VkLjwvbGk+Ci08L29sPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHV0b3JpYWxzL3R1dG9yaWFsXzNfZXhfNy5odG0gYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90dXRvcmlhbHMvdHV0b3JpYWxfM19leF83Lmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTExNWQ0Ni4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90dXRvcmlhbHMvdHV0b3JpYWxfM19leF83Lmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iCi0iaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotCi08aHRtbD4KLTxoZWFkPgotPHRpdGxlPlVudGl0bGVkIERvY3VtZW50PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KLTwhLS0KLS5zdHlsZTEge2ZvbnQtZmFtaWx5OiAiQ291cmllciBOZXciLCBDb3VyaWVyLCBtb25vfQotLS0+Ci08L3N0eWxlPgotPC9oZWFkPgotCi08Ym9keT4KLTxoMj48YT5FeGVyY2lzZSA3OiBFeHRlbmRpbmcgYmFzZSBtZXRob2QgY29udGVudCB1c2luZyA8dT5SZXBsYWNlPC91PiB2YXJpYWJpbGl0eSA8L2E+PC9oMj4KLTxwPlRoZSBwdXJwb3NlIG9mIHRoaXMgZXhlcmNpc2UgaXMgdG8gZXh0ZW5kIGJhc2UgbWV0aG9kIGNvbnRlbnQgdXNpbmcgcmVwbGFjZSB2YXJpYWJpbGl0eS4gPC9wPgotPG9sPgotICA8bGk+Ci0gICAgPHA+U3dpdGNoIHRvIHRoZSA8c3Ryb25nPkF1dGhvcmluZyA8L3N0cm9uZz4gcGVyc3BlY3RpdmUuIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPiBDcmVhdGUgYSBuZXcgPHN0cm9uZz5jb250ZW50IHBhY2thZ2UgPC9zdHJvbmc+IG5hbWVkLCA8c3BhbiBjbGFzcz0ic3R5bGUxIj5SZXBsYWNlIFRlc3Q8L3NwYW4+LCBpbiB0aGUgTXkgUGx1Z2luIHBsdWctaW4uIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPiBDcmVhdGUgYSBuZXcgPHN0cm9uZz5yb2xlIDwvc3Ryb25nPjogPHNwYW4gY2xhc3M9InN0eWxlMSI+bXlfcmVwbGFjZV91aV9kZXNpZ25lciByb2xlPC9zcGFuPiB3aXRoIHByZXNlbnRhdGlvbiBuYW1lLCA8c3BhbiBjbGFzcz0ic3R5bGUxIj5NeSBSZXBsYWNlIFVJIERlc2lnbmVyPC9zcGFuPi4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+IEluIHRoZSA8c3Ryb25nPlZhcmlhYmlsaXR5IFR5cGUgPC9zdHJvbmc+IHNlbGVjdCA8c3Ryb25nPnJlcGxhY2VzIDwvc3Ryb25nPiBhbmQgdGhlbiBjaG9vc2UgdGhlIDxzdHJvbmc+YmFzZSByb2xlIDwvc3Ryb25nPjogPHNwYW4gY2xhc3M9InN0eWxlMSI+cnVwX3VzZXJfaW50ZXJmYWNlX2Rlc2lnbmVyPC9zcGFuPi4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+IEFkZCBhIDxzdHJvbmc+QnJpZWYgRGVzY3JpcHRpb24gPC9zdHJvbmc+OiA8c3BhbiBjbGFzcz0ic3R5bGUxIj5SZXBsYWNlIEJyaWVmIERlc2NyaXB0aW9uLjwvc3Bhbj4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+IEFkZCBhIDxzdHJvbmc+TWFpbiBEZXNjcmlwdGlvbiA8L3N0cm9uZz46IDxzcGFuIGNsYXNzPSJzdHlsZTEiPlJlcGxhY2UgTWFpbiBEZXNjcmlwdGlvbjwvc3Bhbj4uIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPiBTYXZlIHRoZSByb2xlIGJ5IGNsb3NpbmcgdGhlIHJvbGUgZWRpdG9yLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4gICAgVXBkYXRlIHRoZSBWYXJpYWJpbGl0eSBUZXN0IENvbmZpZ3VyYXRpb246IDwvbGk+Ci0gIDxibG9ja3F1b3RlPgotICAgIDxwPiAmIzE0OTsmbmJzcDtPcGVuIHRoZSBWYXJpYWJpbGl0eSBDb25maWd1cmF0aW9uIGFuZCBleHBhbmQgPHN0cm9uZz5NeSBQbHVnaW4gJmd0OyBNZXRob2QgQ29udGVudCAmZ3Q7IENvbnRlbnQgUGFja2FnZXM8L3N0cm9uZz4uIDwvcD4KLSAgICA8cD4mIzE0OTsmbmJzcDtVbmNoZWNrIDxzdHJvbmc+RXh0ZW5kcyBUZXN0PC9zdHJvbmc+LiA8L3A+Ci0gICAgPHA+JiMxNDk7Jm5ic3A7Q2hlY2sgPHN0cm9uZz5SZXBsYWNlIFRlc3Q8L3N0cm9uZz4uIFRoaXMgaXMgZG9uZSBzbyB0aGVyZSBhcmUgbm8gY29uZmxpY3RpbmcgZXh0ZW5zaW9ucyBpbiB0aGUgc2FtZSBtZXRob2QgZWxlbWVudC4gPC9wPgotICA8L2Jsb2NrcXVvdGU+Ci0gIDxsaT4KLSAgICA8cD4gU3dpdGNoIHRvIHRoZSA8c3Ryb25nPkJyb3dzaW5nIDwvc3Ryb25nPiBwZXJzcGVjdGl2ZS4gPC9wPgotICA8L2xpPgotICA8bGk+SW4gdGhlIDxzdHJvbmc+Q29uZmlndXJhdGlvbiBWaWV3PC9zdHJvbmc+LCB5b3Ugd2lsbCBzZWUgdGhhdCB0aGVyZSBpcyBubyBsb25nZXIgYSAoUlVQKSA8c3BhbiBjbGFzcz0ic3R5bGUxIj5Vc2VyLUludGVyZmFjZSBEZXNpZ25lcjwvc3Bhbj4gcm9sZSBpbiB0aGUgPHN0cm9uZz5Sb2xlIFNldHMgPC9zdHJvbmc+IGZvbGRlci4gSXQgd2FzIHJlcGxhY2VkIGJ5IDxzcGFuIGNsYXNzPSJzdHlsZTEiPk15IFJlcGxhY2UgVUkgRGVzaWduZXI8L3NwYW4+IHJvbGUuIE1vcmVvdmVyLCBvdGhlciBjb250ZW50IGVsZW1lbnRzIGluIHRoZSBiYXNlIHBsdWctaW4gdGhhdCByZWZlcmVuY2VkIHRoZSAoUlVQKSA8c3BhbiBjbGFzcz0ic3R5bGUxIj5Vc2VyLUludGVyZmFjZSBEZXNpZ25lcjwvc3Bhbj4gcm9sZSBub3cgcmVmZXJlbmNlIHRoZSByZXBsYWNpbmcgcm9sZSBpbnN0ZWFkIChlLmcuLCBpZiB5b3Ugb3BlbiB0aGUgZGlzY2lwbGluZXMgZm9sZGVyIGFuZCB2aWV3IHRoZSB0YXNrIDxzcGFuIGNsYXNzPSJzdHlsZTEiPkRlc2lnbiBUaGUgVXNlciBJbnRlcmZhY2U8L3NwYW4+IHlvdSB3aWxsIHNlZSB0aGF0IHRoZSA8c3Ryb25nPlBlcmZvcm1pbmcgUm9sZSA8L3N0cm9uZz4gaXMgbm93IDxzcGFuIGNsYXNzPSJzdHlsZTEiPk15IFJlcGxhY2UgVUkgRGVzaWduZXI8L3NwYW4+LikgPHN0cm9uZz5SZXBsYWNlIDwvc3Ryb25nPiB3b3JrcyBpbiBhIHNpbWlsYXIgd2F5IGZvciA8c3Ryb25nPnRhc2tzPC9zdHJvbmc+LCA8c3Ryb25nPmFydGlmYWN0cyA8L3N0cm9uZz4sIDxzdHJvbmc+Z3VpZGFuY2UgPC9zdHJvbmc+IGFuZCA8c3Ryb25nPmNhdGVnb3JpZXMgPC9zdHJvbmc+IChmZWVsIGZyZWUgdG8gdHJ5IGl0IG91dCkuIDwvbGk+Ci08L29sPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHV0b3JpYWxzL3R1dG9yaWFsXzNfaW50cm8uaHRtIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHV0b3JpYWxzL3R1dG9yaWFsXzNfaW50cm8uaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMWE3OGNhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3R1dG9yaWFscy90dXRvcmlhbF8zX2ludHJvLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iCi0iaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotCi08aHRtbD4KLTxoZWFkPgotPHRpdGxlPlVudGl0bGVkIERvY3VtZW50PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPC9oZWFkPgotCi08Ym9keT4KLTxoMj48YT48L2E+PGE+PC9hPjxhPjwvYT48YT48L2E+PGE+PC9hPjwvaDI+Ci08aDE+PGE+PC9hPjxhPlR1dG9yaWFsOiBDcmVhdGUgUmV1c2FibGUgTWV0aG9kIENvbnRlbnQgPC9hPjwvaDE+Ci08cD5UaGUgcHVycG9zZSBvZiB0aGlzIHR1dG9yaWFsIGlzIHRvIHVuZGVyc3RhbmQgdGhlIHZhcmlldHkgb2Ygd2F5cyBpbiB3aGljaCB0aGUgY29udGVudCBpbiBhIGJhc2UgcGx1Zy1pbiBjYW4gYmUgZXh0ZW5kZWQgYW5kIG1vZGlmaWVkIGJ5IGNvbnRlbnQgaW4gb3RoZXIgcGx1Zy1pbnMuIDwvcD4KLTxwPlRoZSCRQ3JlYXRlIENvcmUgTWV0aG9kIENvbnRlbnQnIHR1dG9yaWFsIHNob3dzIGhvdyB0byBjcmVhdGUgbmV3IGNvbnRlbnQgaW4gYSBwbHVnLWluLiBJbiB0aGlzIHR1dG9yaWFsIHdlIHdpbGwgc2VlIGhvdyB0byBleHRlbmQgZXhpc3RpbmcgY29udGVudCBpbiBhIHBsdWctaW4uIDwvcD4KLTxwPjxzdHJvbmc+Tm90ZTogPC9zdHJvbmc+SW4gdGhlIGZvbGxvd2luZyBleGVyY2lzZXMgd2UgY3JlYXRlIHNlcGFyYXRlIENvbnRlbnQgUGFja2FnZXMgdG8gZGVtb25zdHJhdGUgZWFjaCBvZiB0aGUgd2F5cyB0aGF0IGEgbWV0aG9kIHBsdWctaW4gY2FuIG1vZGlmeSBjb250ZW50IGluIGFub3RoZXIgcGx1Zy1pbiAoaS5lLiBleHRlbmRzLCByZXBsYWNlcywgYW5kL29yIGNvbnRyaWJ1dGVzKS4gVGhpcyBpcyBmb3IgZWFzeSBpbGx1c3RyYXRpb24gb2YgdGhlIGVmZmVjdCBvZiBhcHBseWluZyBlYWNoIHR5cGUgb2YgbWV0aG9kIGVsZW1lbnQgdmFyaWFiaWxpdHkuIDwvcD4KLU1hbmFnaW5nIGNvbnRlbnQgdmlhIHRoZSBNZXRob2QgUGx1Zy1pbiBtZWNoYW5pc20gaXMgYSBrZXkgYW5kIHZlcnkgcG93ZXJmdWwgZmVhdHVyZSBvZiBFUEYgQ29tcG9zZXIuIFRoaXMgdHV0b3JpYWwgZXhwbG9yZXMgdGhlIGVmZmVjdHMgb2YgdGhlIGRpZmZlcmVudCB2YXJpYWJpbGl0eSB0eXBlcyBpbiB0aGUgZm9sbG93aW5nIGV4ZXJjaXNlcy4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3R1dG9yaWFscy90dXRvcmlhbF80X2V4XzEuaHRtIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHV0b3JpYWxzL3R1dG9yaWFsXzRfZXhfMS5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0NjMzM2MuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHV0b3JpYWxzL3R1dG9yaWFsXzRfZXhfMS5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIgotImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLQotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT5VbnRpdGxlZCBEb2N1bWVudDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTwvaGVhZD4KLQotPGJvZHk+Ci08aDI+PGE+RXhlcmNpc2UgMTogUHVibGlzaGluZyBhIHByZS1kZWZpbmVkIGNvbmZpZ3VyYXRpb24gPC9hPjwvaDI+Ci08cD5UaGUgcHVycG9zZSBvZiB0aGlzIGV4ZXJjaXNlIGlzIHRvIHB1Ymxpc2ggYSA8c3Ryb25nPkNvbmZpZ3VyYXRpb24gPC9zdHJvbmc+dGhhdCBpcyBpbmNsdWRlZCBpbiBFY2xpcHNlIFByb2Nlc3MgRnJhbWV3b3JrIENvbXBvc2VyLiA8L3A+Ci08b2w+Ci0gIDxsaT4KLSAgICA8cD4gU2VsZWN0IHRoZSA8c3Ryb25nPkF1dGhvcmluZyA8L3N0cm9uZz4gcGVyc3BlY3RpdmUuIDwvcD4KLSAgPC9saT4KLSAgPGxpPiAgICBJbiB0aGUgPHN0cm9uZz5MaWJyYXJ5IFZpZXc8L3N0cm9uZz4sIG9wZW4gdGhlIENvbmZpZ3VyYXRpb25zIGZvbGRlciBhbmQgc2VsZWN0IHRoZSBjb25maWd1cmF0aW9uOiBNeSBSVVAgZm9yIFNtYWxsIFByb2plY3RzLiBUaGlzIG9wZW5zIHRoZSBDb25maWd1cmF0aW9uIEVkaXRvci4gCi0gICAgPHA+VGhlIFBsdWcgaW4gYW5kIFBhY2thZ2UgU2VsZWN0aW9uIHRhYiBzaG93cyB0aGUgcGx1Zy1pbnMgYW5kIHBhY2thZ2VzIHdpdGhpbiBlYWNoIHBsdWctaW4gdGhhdCBhcmUgaW5jbHVkZWQgaW4gdGhlIENvbmZpZ3VyYXRpb24uIFRoZSBwbHVnLWlucyBhbmQgcGFja2FnZXMgaW4gdGhlIENvbmZpZ3VyYXRpb24gY2FuIGJlIGFkanVzdGVkIGJ5IHNlbGVjdGluZyBhbmQgZGVzZWxlY3RpbmcgdGhlbSBpbiB0aGUgdHJlZSBkaXNwbGF5LiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4gICAgUmV2aWV3IDxzdHJvbmc+Q29uZmlndXJhdGlvbiA8L3N0cm9uZz48c3Ryb25nPlZpZXdzIDwvc3Ryb25nPjogKGkuZS4gaG93IHRoZSBwdWJsaXNoZWQgc2l0ZSB3aWxsIGJlIGxhaWQgb3V0KS4gCi0gICAgPHA+U2VsZWN0IHRoZSA8c3Ryb25nPlZpZXdzIDwvc3Ryb25nPiB0YWIgaW4gdGhlIGNvbmZpZ3VyYXRpb24gZWRpdG9yLiBBIFZpZXcgaXMgYSBDdXN0b20gQ2F0ZWdvcnkgdGhhdCBpcyBkZXNpZ25lZCBmb3IgcHVibGljYXRpb24uIFJlcXVpcmVkIHBhY2thZ2VzIGFuZCBjb250ZW50IGVsZW1lbnRzIGFyZSBhc3NpZ25lZCB0byBhIEN1c3RvbSBDYXRlZ29yeS4gVGhlIEN1c3RvbSBDYXRlZ29yeSBjYW4gdGhlbiBiZSBhZGRlZCBhcyBhIFZpZXcgdG8gYSBDb25maWd1cmF0aW9uLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4gICAgU2VsZWN0IDxzdHJvbmc+RGVmYXVsdDwvc3Ryb25nPiBWaWV3LgotICAgIDxwPk9uZSBvZiB0aGUgdmlld3MgY2FuIGJlIHNlbGVjdGVkIGFzIHRoZSBEZWZhdWx0IFZpZXcgYnkgc2VsZWN0aW5nIHRoZSBWaWV3IGFuZCBjbGlja2luZyB0aGUgkU1ha2UgRGVmYXVsdCcgYnV0dG9uLiBXaGVuIHRoZSBjb25maWd1cmF0aW9uIGlzIHB1Ymxpc2hlZCwgdGhlIERlZmF1bHQgVmlldyB3aWxsIGJlIHNlbGVjdGVkIHdoZW4gdGhlIHB1Ymxpc2hlZCBjb25maWd1cmF0aW9uIGlzIG9wZW5lZCBpbiB0aGUgRVBGIENvbXBvc2VyIEJyb3dzZXIuIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPiBDbG9zZSB0aGUgY29uZmlndXJhdGlvbiBlZGl0b3IuIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPiBTZWxlY3QgPHN0cm9uZz5NeSBSVVAgZm9yIFNtYWxsIFByb2plY3RzPC9zdHJvbmc+IGluIHRoZSBjb25maWd1cmF0aW9uIHNlbGVjdGlvbiBib3ggaW4gdGhlIEVQRiBDb21wb3NlciB0b29sYmFyLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD4gU2VsZWN0IDxzdHJvbmc+Q29uZmlndXJhdGlvbiAmZ3Q7IFB1Ymxpc2ggPC9zdHJvbmc+IGZyb20gdGhlIG1haW4gbWVudSBiYXIuIDwvcD4KLSAgPC9saT4KLSAgPGxpPiAgICBTdGVwIHRocm91Z2ggUHVibGlzaCB3aXphcmQsIGFjY2VwdGluZyB0aGUgZGVmYXVsdHMsIGFuZCBwdWJsaXNoIHRoZSBjb25maWd1cmF0aW9uLiBJdCB3aWxsIHRha2UgYSBmZXcgbWludXRlcyB0byBnZW5lcmF0ZSB0aGUgd2ViIHNpdGUuIEFzc3VtaW5nIHRoYXQgeW91IGhhdmUgdGhlIHJpZ2h0IGphdmEgZW52aXJvbm1lbnQsIHRoZSBFUEYgQ29tcG9zZXIgQnJvd3NlciBhcHBsZXQgc2hvdWxkIGxhdW5jaCBhbGxvd2luZyB5b3UgdG8gdmlldyB0aGUgcmVzdWx0aW5nIHB1Ymxpc2hlZCB3ZWIgc2l0ZSAoYWNjZXB0IHRoZSBzZWN1cml0eSB3YXJuaW5ncyB3aGVuIHRoZSBhcHBsZXQgZmlyZXMgdXApLiA8L2xpPgotPC9vbD4KLTxibG9ja3F1b3RlPgotICA8cD48c3Ryb25nPk5vdGU6IDwvc3Ryb25nPiBUaGUgcHVibGlzaGVkIHdlYiBzaXRlIGhhcyBhIHJpY2hlciBvcmdhbml6YXRpb24gYW5kIGxheS1vdXQgYXMgZGVmaW5lZCBieSB0aGUgQ29uZmlndXJhdGlvbiBWaWV3LCBhcyBjb21wYXJlZCB0byB0aGUgbW9yZSBzaW1wbGUgdmlldyBvZiB0aGUgY29uZmlndXJhdGlvbiBjb250ZW50IGF2YWlsYWJsZSB3aXRoaW4gdGhlIEVQRiBDb21wb3NlciA8c3Ryb25nPkNvbmZpZ3VyYXRpb24gVmlldzwvc3Ryb25nPi4gPC9wPgotPC9ibG9ja3F1b3RlPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHV0b3JpYWxzL3R1dG9yaWFsXzRfZXhfMi5odG0gYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90dXRvcmlhbHMvdHV0b3JpYWxfNF9leF8yLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWNjOGUzNy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90dXRvcmlhbHMvdHV0b3JpYWxfNF9leF8yLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iCi0iaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotCi08aHRtbD4KLTxoZWFkPgotPHRpdGxlPlVudGl0bGVkIERvY3VtZW50PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KLTwhLS0KLS5zdHlsZTEge2ZvbnQtZmFtaWx5OiAiQ291cmllciBOZXciLCBDb3VyaWVyLCBtb25vfQotLS0+Ci08L3N0eWxlPgotPC9oZWFkPgotCi08Ym9keT4KLTxoMj48YT5FeGVyY2lzZSAyOiBDcmVhdGUgTmV3IEN1c3RvbSBDYXRlZ29yeSA8L2E+PC9oMj4KLTxwPlRoZSBwdXJwb3NlIG9mIHRoaXMgZXhlcmNpc2UgaXMgdG8gdW5kZXJzdGFuZCBhbmQgdXNlIDxzdHJvbmc+Q3VzdG9tIENhdGVnb3JpZXMgPC9zdHJvbmc+LiA8L3A+Ci08cD48c3Ryb25nPkN1c3RvbSBDYXRlZ29yaWVzIDwvc3Ryb25nPiBhbGxvdyB5b3UgdG8gY2F0ZWdvcml6ZSBjb250ZW50IGFjY29yZGluZyB0byBhbnkgc2NoZW1lIHlvdSB3YW50LiBDdXN0b20gQ2F0ZWdvcmllcyBjYW4gdGhlbiBiZSB1c2VkIHRvIGNvbXBvc2UgcHVibGlzaGFibGUgPHN0cm9uZz5WaWV3cyA8L3N0cm9uZz4gcHJvdmlkaW5nIGEgbWVhbnMgdG8gb3JnYW5pemUgbWV0aG9kIGNvbnRlbnQgcHJpb3IgdG8gcHVibGlzaGluZy4gPC9wPgotPG9sPgotICA8bGk+Ci0gICAgPHA+TWFrZSBzdXJlIHlvdSBhcmUgaW4gdGhlIDxzdHJvbmc+QXV0aG9yaW5nIDwvc3Ryb25nPiBwZXJzcGVjdGl2ZS4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+IE5hdmlnYXRlIHRvIDxzdHJvbmc+TXkgUGx1Zy1pbiAmZ3Q7IE1ldGhvZCBDb250ZW50ICZndDsgQ3VzdG9tIENhdGVnb3JpZXM8L3N0cm9uZz4uIElmIHlvdSBoYXZlIG5vdCBhbHJlYWR5IGNyZWF0ZWQgdGhpcyBwbHVnaW4sIGNyZWF0ZSBpdCBub3csIG9yIGdvIHRocm91Z2ggdGhlIDx1PkNyZWF0ZSBDb3JlIE1ldGhvZCBDb250ZW50PC91PiB0dXRvcmlhbC4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+IENyZWF0ZSBhIG5ldyBjdXN0b20gY2F0ZWdvcnkgbmFtZWQsIDxzcGFuIGNsYXNzPSJzdHlsZTEiPm15X2N1c3RvbV9jYXRlZ29yeTwvc3Bhbj4uIFJpZ2h0LWNsaWNrIG9uIHRoZSA8c3Ryb25nPkN1c3RvbSBDYXRlZ29yaWVzPC9zdHJvbmc+IGZvbGRlciwgaGlnaGxpZ2h0IDxzdHJvbmc+TmV3LCA8L3N0cm9uZz4gYW5kIHRoZW4gY2xpY2sgPHN0cm9uZz5DdXN0b20gQ2F0ZWdvcnkgPC9zdHJvbmc+LiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4gICAgT3BlbiB0aGUgPHN0cm9uZz5Bc3NpZ24gPC9zdHJvbmc+IHRhYi4gSWYgeW91IGhhdmUgcHJldmlvdXNseSBjcmVhdGVkIDxzcGFuIGNsYXNzPSJzdHlsZTEiPm15X2NvbnRlbnRfcGFja2FnPC9zcGFuPmUsIGFkZCB0aGUgPHN0cm9uZz5yb2xlcyA8L3N0cm9uZz4sIDxzdHJvbmc+YXJ0aWZhY3RzPC9zdHJvbmc+LCA8c3Ryb25nPnRhc2tzLCA8L3N0cm9uZz4gYW5kIDxzdHJvbmc+Z3VpZGFuY2UgPC9zdHJvbmc+IGZyb20gaXQgaW50byB0aGUgY3VzdG9tIGNhdGVnb3J5LiBJZiB5b3UgZG8gbm90IGhhdmUgdGhpcyBwYWNrYWdlLCBhZGQgY29udGVudCBmcm9tIGFub3RoZXIgYXJlYSBpbiB0aGUgbGlicmFyeS4gPC9saT4KLSAgPGJsb2NrcXVvdGU+Ci0gICAgPHA+PHN0cm9uZz5Ob3RlOiA8L3N0cm9uZz4gWW91IGNhbiBkbyBtdWx0aXBsZSBzZWxlY3QgdXNpbmcgc2hpZnQgb3IgY29udHJvbCBrZXkgLiA8L3A+Ci0gIDwvYmxvY2txdW90ZT4KLSAgPGxpPgotICAgIDxwPiBBZGQgdGhlIDxzcGFuIGNsYXNzPSJzdHlsZTEiPnJ1cF9hbmFseXNpc19kZXNpZ25fZGlzY2lwbGluZTwvc3Bhbj4uIFlvdSB3aWxsIGZpbmQgdGhpcyB1bmRlciA8c3Ryb25nPlJVUCAmZ3Q7IERpc2NpcGxpbmVzICZndDsgcnVwX2Rpc2NpcGxpbmVzLiA8L3N0cm9uZz48L3A+Ci0gIDwvbGk+Ci0gIDxsaT4gT3BlbiBvbmUgb2YgdGhlIGVsZW1lbnRzIHlvdSBhc3NpZ25lZCB0byB0aGUgbmV3IGN1c3RvbSBjYXRlZ29yeS4gT2JzZXJ2ZSBob3cgdGhlIGN1c3RvbSBjYXRlZ29yeSBpcyBub3cgcmVmbGVjdGVkIGluIHRoZSA8c3Ryb25nPkNhdGVnb3JpZXMgPC9zdHJvbmc+IHRhYi4gPC9saT4KLTwvb2w+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90dXRvcmlhbHMvdHV0b3JpYWxfNF9leF8zLmh0bSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3R1dG9yaWFscy90dXRvcmlhbF80X2V4XzMuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NGQxMzliLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3R1dG9yaWFscy90dXRvcmlhbF80X2V4XzMuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIKLSJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci0KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+VW50aXRsZWQgRG9jdW1lbnQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08c3R5bGUgdHlwZT0idGV4dC9jc3MiPgotPCEtLQotLnN0eWxlMSB7Zm9udC1mYW1pbHk6ICJDb3VyaWVyIE5ldyIsIENvdXJpZXIsIG1vbm99Ci0tLT4KLTwvc3R5bGU+Ci08L2hlYWQ+Ci0KLTxib2R5PgotPGgyPjxhPkV4ZXJjaXNlIDM6IENyZWF0ZSBhIGN1c3RvbWl6ZWQgY29uZmlndXJhdGlvbiA8L2E+PC9oMj4KLTxwPlRoZSBwdXJwb3NlIG9mIHRoaXMgZXhlcmNpc2UgaXMgdG8gY3JlYXRlIHlvdXIgb3duIGN1c3RvbWl6ZWQgY29uZmlndXJhdGlvbi4gPC9wPgotPG9sPgotICA8bGk+Ci0gICAgPHA+TWFrZSBzdXJlIHlvdSBhcmUgaW4gdGhlIDxzdHJvbmc+QXV0aG9yaW5nIDwvc3Ryb25nPiBwZXJzcGVjdGl2ZS4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+Q2xpY2sgPHN0cm9uZz5GaWxlICZndDsgTmV3ICZndDsgQ29uZmlndXJhdGlvbjwvc3Ryb25nPi4gT3IsIHlvdSBjYW4gcmlnaHQtY2xpY2sgb24gdGhlIDxzdHJvbmc+Q29uZmlndXJhdGlvbnM8L3N0cm9uZz4gZm9sZGVyIGluIHRoZSBMaWJyYXJ5IFZpZXcgYW5kIHNlbGVjdCA8c3Ryb25nPk5ldyBDb25maWd1cmF0aW9uLiA8L3N0cm9uZz5UaGUgQ29uZmlndXJhdGlvbiBFZGl0b3IgaXMgbGF1bmNoZWQuPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+IE5hbWUgdGhlIGNvbmZpZ3VyYXRpb24sIDxzcGFuIGNsYXNzPSJzdHlsZTEiPm15X2NvbmZpZ3VyYXRpb248L3NwYW4+LjwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPiBDbGljayBvbiB0aGUgPHN0cm9uZz5QbHVnLWluIGFuZCBQYWNrYWdlIFNlbGVjdGlvbiA8L3N0cm9uZz4gdGFiLiBJbiB0aGUgbGlzdCBvZiBQbHVnaW5zLCBjaGVjayBNeSBQbHVnaW4gdGhhdCB5b3UgY3JlYXRlZCBpbiB0aGUgPHU+Q3JlYXRlIENvcmUgTWV0aG9kIENvbnRlbnQ8L3U+IHR1dG9yaWFsLiBUaGlzIHBsdWdpbiBoYXMgUlVQIGFzIGEgYmFzZSBhbmQgcmVmZXJlbmNlcyBwYXJ0cyBvZiB0aGUgUlVQIGNvbnRlbnQsIGFuZCBhbHNvIGhhcyBlbGVtZW50cyB0aGF0IGV4dGVuZCwgY29udHJpYnV0ZSB0bywgYW5kIHJlcGxhY2UgYmFzZSBSVVAgY29udGVudC4gPGJyPgotICAgICAgSWYgeW91IGRvIG5vdCBoYXZlIHRoaXMgcGx1Z2luLCBjb25zaWRlciBjb21wbGV0aW5nIHRoZSA8dT5DcmVhdGUgQ29yZSBNZXRob2QgQ29udGVudDwvdT4gdHV0b3JpYWwgYmVmb3JlIGNvbnRpbnVpbmcgd2l0aCB0aGlzIHR1dG9yaWFsLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD4gVGhlIGRpc3BsYXkgd2lsbCBnaXZlIHlvdSBhIHNlcmllcyBvZiB3YXJuaW5ncyBhbmQgdGhlIExpYnJhcnkgRXJyb3IgTG9nIHZpZXcgd2lsbCBiZSBkaXNwbGF5ZWQuIDxicj4KLSAgICAgIEVjbGlwc2UgUHJvY2VzcyBGcmFtZXdvcmsgQ29tcG9zZXIgZ2l2ZXMgdGhlc2Ugd2FybmluZ3MgdG8gaGVscCBlbnN1cmUgdGhhdCB5b3UgY3JlYXRlIGEgY29uZmlndXJhdGlvbiB0aGF0IJFtYWtlcyBzZW5zZScuIElmIHlvdSByZWZlcmVuY2UgYW4gZWxlbWVudCwgeW91IHdpbGwgb25seSBiZSBhYmxlIHRvIHNlZSB0aGUgZnVsbCBkZXRhaWxzIGZvciB0aGF0IGVsZW1lbnQgaW4gYSBwdWJsaXNoZWQgd2ViIHNpdGUgaWYgdGhlIHBhY2thZ2UgY29udGFpbmluZyB0aGUgZWxlbWVudCBpcyBpbiB0aGUgY29uZmlndXJhdGlvbi4gSWYgdGhlIHBhY2thZ2UgY29udGFpbmluZyB0aGUgZWxlbWVudCBpcyBub3QgaW4gdGhlIGNvbmZpZ3VyYXRpb24sIHRoZSCRb2ZmZW5kaW5nJyBwYWNrYWdlIGlzIG1hcmtlZCBhcyBhIHdhcm5pbmcgliB5b3UgbWF5IGNob29zZSBub3QgdG8gaW5jbHVkZSB0aGUgZnVsbCBkZXRhaWxzIG9mIHRoZSByZWZlcmVuY2VkIGVsZW1lbnQuIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPiBDaGVjayB0aGUgPHN0cm9uZz5BZGQgTWlzc2luZyBSZWZlcmVuY2VzPC9zdHJvbmc+IGJ1dHRvbi4gVGhpcyB3aWxsIGF1dG9tYXRpY2FsbHkgYW5kIHJlY3Vyc2l2ZWx5IGFkZCBwYWNrYWdlcyBjb250YWluaW5nIGFueSBlbGVtZW50cyB0aGF0IGFyZSByZWZlcmVuY2VkIGluIGFscmVhZHkgc2VsZWN0ZWQgcGFja2FnZXMuIEV4cGxvcmUgd2hhdCBwYWNrYWdlcyBoYXZlIGJlZW4gYWRkZWQgdG8gdGhlIGNvbmZpZ3VyYXRpb24uIFlvdSB3aWxsIHByb2JhYmx5IG5vdyBzZWUgYWxsIG9mIFJVUCBzZWxlY3RlZC4gVGhpcyBpcyBiZWNhdXNlIG9mIHRoZSBpbnRlci1jb25uZWN0ZWQgbmF0dXJlIG9mIFJVUC4gVW5jaGVjayBSVVAgdG8gcmVzdG9yZSB0aGUgd2FybmluZ3MuIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPiBEcmlsbCBkb3duIGludG8gdGhlIGNvbnRlbnQgcGFja2FnZXMgaW4gdGhlIE15IFBsdWdpbiwgcGx1Z2luIHBhY2thZ2UgICBieSBjbGlja2luZyBvbiB0aGUgPHN0cm9uZz4rPC9zdHJvbmc+IHNpZ25zLiBVbmNoZWNrIHRoZTxzdHJvbmc+IEV4dGVuZHMgVGVzdCA8L3N0cm9uZz5hbmQgPHN0cm9uZz5SZXBsYWNlIFRlc3QgPC9zdHJvbmc+Y29udGVudCBwYWNrYWdlcy4gVW5jaGVja2luZyB0aGVzZSBhdm9pZHMgY29uZmxpY3RzIHRoYXQgbWF5IG9jY3VyIGJlY2F1c2UgdGhlIHNhbWUgYmFzZSBlbGVtZW50IGlzIGFmZmVjdGVkIGJ5IHRoZSBwbHVnaW5zLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD4gVGhlcmUgc2hvdWxkIGJlIGEgPHN0cm9uZz4rPC9zdHJvbmc+IGJ5IHRoZSA8c3Ryb25nPkNvbnRyaWJ1dGlvbiBUZXN0PC9zdHJvbmc+IHBhY2thZ2UuIENsaWNrIHRoZSA8c3Ryb25nPk1ha2UgQ2xvc3VyZSBieSBGaXhpbmcgRXJyb3JzPC9zdHJvbmc+IGJ1dHRvbi4gVGhpcyBhdXRvbWF0aWNhbGx5IG1ha2VzIHlvdXIgY29uZmlndXJhdGlvbiBjb21wbGV0ZSBiYXNlZCBvbiB3aGF0IGlzIGN1cnJlbnRseSBzZWxlY3RlZC4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+IERyaWxsIGRvd24gaW50byB0aGUgUlVQIHBsdWdpbiwgYW5kIHNlZSB3aGF0IHBhY2thZ2VzIGhhdmUgYmVlbiBzZWxlY3RlZC4gVGhlc2Ugd2lsbCBiZSB0aGUgcGFja2FnZXMgdGhhdCBjb250YWluIHRoZSBlbGVtZW50cyB1c2VkIGFzIGJhc2UgZWxlbWVudHMgaW4gdGhlIENvbmZpZ3VyYXRpb24gVGVzdCBjb250ZW50IHBhY2thZ2UuIDwvcD4KLSAgPC9saT4KLSAgPGxpPiAgICBDbGljayBvbiB0aGUgPHN0cm9uZz5WaWV3czwvc3Ryb25nPiB0YWIuIAotICAgIDxwPkFueSBjdXN0b20gY2F0ZWdvcnkgY2FuIGJlIGFkZGVkIGFzIGEgdmlldyB0byBhIGNvbmZpZ3VyYXRpb24uIFlvdSBjYW4gY3JlYXRlZCBhbnkgbnVtYmVyIG9mIGN1c3RvbSBjYXRlZ29yaWVzIGFuZCB0aGV5IGFyZSB2ZXJ5IGZsZXhpYmxlIGluIHRlcm1zIG9mIHRoZSBjb250ZW50IHRoYXQgeW91IGNhbiBhZGQgdG8gYSBjdXN0b20gY2F0ZWdvcnkgYW5kIGluIHRoZSBvcmRlciBpbiB3aGljaCB0aGUgY29udGVudCBhcHBlYXJzLiA8L3A+Ci0gICAgPHA+QWRkIHRoZSA8c3BhbiBjbGFzcz0ic3R5bGUxIj5teV9jdXN0b21fY2F0ZWdvcnk8L3NwYW4+IGN1c3RvbSBjYXRlZ29yeSBhcyBhIHZpZXcgaW4gdGhlIGNvbmZpZ3VyYXRpb24uIDwvcD4KLSAgICA8cD5FeHBlcmltZW50IHdpdGggYWRkaW5nIG90aGVyIGN1c3RvbSBjYXRlZ29yaWVzIGFzIHZpZXdzLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD4gTWFrZSA8c3BhbiBjbGFzcz0ic3R5bGUxIj5teV9jdXN0b21fY2F0ZWdvcnk8L3NwYW4+IHRoZSBkZWZhdWx0IHZpZXcgYnkgc2VsZWN0aW5nIHRoZSA8c3BhbiBjbGFzcz0ic3R5bGUxIj5teV9jdXN0b21fY2F0ZWdvcnk8L3NwYW4+IHRhYiBhbmQgY2xpY2tpbmcgdGhlIDxzdHJvbmc+TWFrZSBEZWZhdWx0PC9zdHJvbmc+IGJ1dHRvbi4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+IFNhdmUgdGhlIGNvbmZpZ3VyYXRpb24gYnkgY2xvc2luZyB0aGUgQ29uZmlndXJhdGlvbiBFZGl0b3IuIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPiBTZWxlY3QgPHNwYW4gY2xhc3M9InN0eWxlMSI+bXlfY29uZmlndXJhdGlvbjwvc3Bhbj4gaW4gdGhlIGNvbmZpZ3VyYXRpb24gc2VsZWN0aW9uIGJveCBhdCB0aGUgdG9wIG9mIHRoZSBzY3JlZW4uIFlvdSB3aWxsIHNlZSB0aGUgaXRlbXMgZGlzcGxheWVkIGluIHRoZSBDb25maWd1cmF0aW9uIFZpZXcgY2hhbmdlLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4gU3dpdGNoIHRvIHRoZSA8c3Ryb25nPkJyb3dzaW5nPC9zdHJvbmc+IHBlcnNwZWN0aXZlLiBFeHBsb3JlIHRoZSBjb250ZW50IGluIHRoZSBjb25maWd1cmF0aW9uIHZpZXcuIFlvdSBzaG91bGQgc2VlIHRoZSBjb250ZW50IHlvdSBjcmVhdGVkIGluIHlvdXIgcGx1Z2lucyBhbmQgc29tZSBSVVAgY29udGVudC4gPC9saT4KLTwvb2w+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90dXRvcmlhbHMvdHV0b3JpYWxfNF9leF80Lmh0bSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3R1dG9yaWFscy90dXRvcmlhbF80X2V4XzQuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZDhiZTFkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3R1dG9yaWFscy90dXRvcmlhbF80X2V4XzQuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIKLSJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci0KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+VW50aXRsZWQgRG9jdW1lbnQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxib2R5PgotPGgyPjxhPkV4ZXJjaXNlIDQ6IFB1Ymxpc2hpbmcgYSBjdXN0b20gY29uZmlndXJhdGlvbiA8L2E+PC9oMj4KLTxvbD4KLSAgPGxpPgotICAgIDxwPiBTZWxlY3QgPHN0cm9uZz5Db25maWd1cmF0aW9uICZndDsgUHVibGlzaCA8L3N0cm9uZz4gZnJvbSB0aGUgbWFpbiBtZW51IGJhci4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+IFNlbGVjdCBteS1jb25maWd1cmF0aW9uIGluIHRoZSBsaXN0IG9mIGNvbmZpZ3VyYXRpb25zLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4gU3RlcCB0aHJvdWdoIFB1Ymxpc2ggd2l6YXJkLCBhY2NlcHRpbmcgdGhlIGRlZmF1bHRzLCBhbmQgcHVibGlzaCB0aGUgY29uZmlndXJhdGlvbi4gSXQgd2lsbCB0YWtlIGEgZmV3IG1pbnV0ZXMgdG8gZ2VuZXJhdGUgdGhlIHdlYiBzaXRlLiBBc3N1bWluZyB0aGF0IHlvdSBoYXZlIHRoZSByaWdodCBqYXZhIGVudmlyb25tZW50LCB0aGUgRVBGIENvbXBvc2VyIEJyb3dzZXIgYXBwbGV0IHNob3VsZCBsYXVuY2ggYWxsb3dpbmcgeW91IHRvIHZpZXcgdGhlIHJlc3VsdGluZyBwdWJsaXNoZWQgd2ViIHNpdGUgKGFjY2VwdCB0aGUgc2VjdXJpdHkgd2FybmluZ3Mgd2hlbiB0aGUgYXBwbGV0IGZpcmVzIHVwKS4gPC9saT4KLTwvb2w+Ci08YmxvY2txdW90ZT4KLSAgPHA+PHN0cm9uZz5Ob3RlOiA8L3N0cm9uZz4gVGhlIHB1Ymxpc2hlZCB3ZWIgc2l0ZSBoYXMgYSByaWNoZXIgb3JnYW5pemF0aW9uIGFuZCBsYXktb3V0IGFzIGRlZmluZWQgYnkgdGhlIENvbmZpZ3VyYXRpb24gVmlldywgYXMgY29tcGFyZWQgdG8gdGhlIG1vcmUgc2ltcGxlIHZpZXcgb2YgdGhlIGNvbmZpZ3VyYXRpb24gY29udGVudCBhdmFpbGFibGUgd2l0aGluIHRoZSBFUEYgQ29tcG9zZXIgPHN0cm9uZz5Db25maWd1cmF0aW9uIFZpZXcgPC9zdHJvbmc+LiA8L3A+Ci08L2Jsb2NrcXVvdGU+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90dXRvcmlhbHMvdHV0b3JpYWxfNF9pbnRyby5odG0gYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90dXRvcmlhbHMvdHV0b3JpYWxfNF9pbnRyby5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyMWRiN2UuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHV0b3JpYWxzL3R1dG9yaWFsXzRfaW50cm8uaHRtCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIKLSJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci0KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+VW50aXRsZWQgRG9jdW1lbnQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxib2R5PgotPGgxPjxhPlR1dG9yaWFsOiBQdWJsaXNoaW5nIGFuZCBFeHBvcnRpbmcgPC9hPjwvaDE+Ci08cD5FUEYgQ29tcG9zZXIgaXMgZXNzZW50aWFsbHkgYSBjb250ZW50IG1hbmFnZW1lbnQgYXBwbGljYXRpb24uIFRoZSB1bHRpbWF0ZSBvdXRwdXQgb2YgRVBGIENvbXBvc2VyIGlzIGEgV2ViIHNpdGUgd2l0aCBwdWJsaXNoZWQgbWV0aG9kIGd1aWRhbmNlIGFuZCBwcm9jZXNzZXMgdGhhdCBjYW4gYmUgdmlld2VkIGJ5IGEgcHJvamVjdCB0ZWFtLiA8L3A+Ci08cD5FUEYgQ29tcG9zZXIgbWFrZXMgaXQgZWFzeSB0byBjb25maWd1cmUgYSBwcm9jZXNzIGZvciBhIHBhcnRpY3VsYXIgdHlwZSBvciBzaXplIG9mIHByb2plY3QgYW5kIHRvIHB1Ymxpc2ggdGhlIGd1aWRhbmNlIHRvIGEgV2ViIHNpdGUuIEEgTWV0aG9kIDxzdHJvbmc+Q29uZmlndXJhdGlvbiA8L3N0cm9uZz4gaXMgYSBzZWxlY3Rpb24gb2YgPHN0cm9uZz5Db250ZW50IFBhY2thZ2VzIDwvc3Ryb25nPiBhY3Jvc3MgZGlmZmVyZW50IDxzdHJvbmc+TWV0aG9kIFBsdWctaW5zIDwvc3Ryb25nPiBjb250YWluaW5nIHRoZSBtZXRob2QgYW5kIHByb2Nlc3MgY29udGVudCB0aGF0IHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlIHB1Ymxpc2hlZCB3ZWIgc2l0ZS4gQXQgcHVibGlzaGluZyB0aW1lLCB0aGUgY29uZmlndXJhdGlvbiBpcyBjb21iaW5lZCB3aXRoIGRpZmZlcmVudCBNZXRob2QgPHN0cm9uZz5WaWV3cyA8L3N0cm9uZz4gd2hpY2ggZGVmaW5lIHRoZSB3ZWJzaXRlJ3MgbmF2aWdhdGlvbiBzdHJ1Y3R1cmVzIGFuZCBjb250ZW50IG9yZ2FuaXphdGlvbi4gPC9wPgotPHA+VGhlIEVQRiBDb21wb3NlciA8c3Ryb25nPkJyb3dzaW5nIFBlcnNwZWN0aXZlIDwvc3Ryb25nPiByZW5kZXJzIHRoZSBNZXRob2QgPHN0cm9uZz5Db25maWd1cmF0aW9uIDwvc3Ryb25nPiBjb250ZW50IGluIGh0bWwgZm9ybWF0IHdpdGhpbiBFUEYgQ29tcG9zZXIsIHByb3ZpZGluZyBhIG5hdmlnYWJsZSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbWV0aG9kL3Byb2Nlc3MgY29udGVudCBhc3NvY2lhdGVkIHdpdGggdGhhdCBDb25maWd1cmF0aW9uLiA8L3A+Ci08cD5UaGlzIHR1dG9yaWFsIHVzZXMgY29udGVudCB0aGF0IGlzIGNyZWF0ZWQgaW4gdGhlIJFDcmVhdGUgQ29yZSBNZXRob2QgQ29udGVudCcgYW5kIJFFeHRlbmRpbmcgYmFzZSBtZXRob2QgY29udGVudCB1c2luZyBWYXJpYWJpbGl0eScgdHV0b3JpYWxzLiA8L3A+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90dXRvcmlhbHMvdHV0b3JpYWxfNV9leF8xLmh0bSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3R1dG9yaWFscy90dXRvcmlhbF81X2V4XzEuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYjJiODFlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3R1dG9yaWFscy90dXRvcmlhbF81X2V4XzEuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIKLSJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci0KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+VW50aXRsZWQgRG9jdW1lbnQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxib2R5PgotPGgyPjxhPkV4ZXJjaXNlIDE6IEJyb3dzZSBQcm9jZXNzIENvbnRlbnQgdXNpbmcgQnJvd3NpbmcgUGVyc3BlY3RpdmUgPC9hPjwvaDI+Ci08cD5UaGUgcHVycG9zZSBvZiB0aGlzIGV4ZXJjaXNlIGlzIHRvIGdldCBhIGJhc2ljIHVuZGVyc3RhbmRpbmcgb2YgcHJvY2Vzc2VzIGluIEVQRiBDb21wb3Nlci4gPC9wPgotPHA+KE5vdGUgdGhhdCB0aGlzIGlzIGEgcmVwZWF0IG9mIGV4ZXJjaXNlIDIgaW4gdGhlIDx1PkJyb3dzZSB0aGUgTGlicmFyeTwvdT4gdHV0b3JpYWwuKSA8L3A+Ci08b2w+Ci0gIDxsaT4KLSAgICA8cD5NYWtlIHN1cmUgeW91IGFyZSBpbiB0aGUgPHN0cm9uZz5Ccm93c2luZzwvc3Ryb25nPiBwZXJzcGVjdGl2ZS4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+IFNlbGVjdCB0aGUgPHN0cm9uZz5NeSBSVVAgZm9yIFNtYWxsIFByb2plY3RzPC9zdHJvbmc+IGNvbmZpZ3VyYXRpb24uIElmIHlvdSBoYXZlIG5vdCBjcmVhdGVkIHRoaXMgY29uZmlndXJhdGlvbiwgc2VsZWN0IHRoZSA8c3Ryb25nPlJVUCBmb3IgU21hbGwgUHJvamVjdHM8L3N0cm9uZz4gY29uZmlndXJhdGlvbi4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+IFRvIHZpZXcgYSBDYXBhYmlsaXR5IFBhdHRlcm4sIGNsaWNrIDxzdHJvbmc+UHJvY2Vzc2VzICZndDsgQ2FwYWJpbGl0eSBQYXR0ZXJucyAmZ3Q7IENsYXNzaWMgUlVQICZndDsgRGlzY2lwbGluZSBXb3JrZmxvd3MgJmd0OyBBbmFseXNpcyBhbmQgRGVzaWduPC9zdHJvbmc+LiBBIHByZXZpZXcgb2YgdGhlIHB1Ymxpc2hlZCBXZWIgcGFnZSBmb3IgdGhlIHNlbGVjdGVkIENhcGFiaWxpdHkgUGF0dGVybiBpcyBkaXNwbGF5ZWQuIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPiBBIENhcGFiaWxpdHkgUGF0dGVybiBjb250YWlucyBhIGxhcmdlIGFtb3VudCBvZiBpbmZvcm1hdGlvbiBhbmQgaXMgZGlzcGxheWVkIG92ZXIgZm91ciB0YWJzIJYgPHN0cm9uZz5EZXNjcmlwdGlvbiwgV29yayBCcmVha2Rvd24gU3RydWN0dXJlLCBXb3JrIFByb2R1Y3QgVXNhZ2UsIDwvc3Ryb25nPmFuZDxzdHJvbmc+IFRlYW0gQWxsb2NhdGlvbjwvc3Ryb25nPi4gRXhwbG9yZSB0aGUgaW5mb3JtYXRpb24gb24gZWFjaCB0YWIuIDwvcD4KLSAgPC9saT4KLSAgPGxpPlRvIHZpZXcgYSBEZWxpdmVyeSBQcm9jZXNzLCBjbGljayA8c3Ryb25nPlByb2Nlc3NlcyAmZ3Q7IERlbGl2ZXJ5IFByb2Nlc3NlcyAmZ3Q7IENsYXNzaWMgUlVQIExpZmVjeWNsZTwvc3Ryb25nPi4gVGhlIGRpc3BsYXkgZm9yIGEgRGVsaXZlcnkgUHJvY2VzcyBpcyBzaW1pbGFyIHRvIGEgQ2FwYWJpbGl0eSBQYXR0ZXJuLiA8L2xpPgotPC9vbD4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3R1dG9yaWFscy90dXRvcmlhbF81X2V4XzIuaHRtIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHV0b3JpYWxzL3R1dG9yaWFsXzVfZXhfMi5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxOGVmYTkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHV0b3JpYWxzL3R1dG9yaWFsXzVfZXhfMi5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIgotImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLQotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT5VbnRpdGxlZCBEb2N1bWVudDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTwvaGVhZD4KLQotPGJvZHk+Ci08aDI+PGE+PC9hPjxhPkV4ZXJjaXNlIDI6IEV4cGxvcmUgYSBQcm9jZXNzIHVzaW5nIEF1dGhvcmluZyBwZXJzcGVjdGl2ZSA8L2E+PC9oMj4KLTxwPlRoZSBwdXJwb3NlIG9mIHRoaXMgdHV0b3JpYWwgaXMgdG8gZXhwbG9yZSB0aGUgaW5mb3JtYXRpb24gYW5kIGVkaXRvcnMgZm9yIHByb2Nlc3Nlcy4gQSBDYXBhYmlsaXR5IFBhdHRlcm4gaXMgdXNlZCBhcyBhbiBleGFtcGxlIGJ1dCB0aGUgc2FtZSBhcHBsaWVzIHRvIERlbGl2ZXJ5IFByb2Nlc3Nlcy4gPC9wPgotPG9sPgotICA8bGk+Ci0gICAgPHA+U3dpdGNoIHRvIDxzdHJvbmc+QXV0aG9yaW5nIDwvc3Ryb25nPiBwZXJzcGVjdGl2ZS4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+SW4gdGhlIExpYnJhcnkgVmlldywgY2xpY2sgPHN0cm9uZz5SVVAgJmd0OyBQcm9jZXNzZXMgJmd0OyBDYXBhYmlsaXR5IFBhdHRlcm5zICZndDsgQ2xhc3NpYyBSVVAgJmd0OyBEaXNjaXBsaW5lIFdvcmtmbG93czwvc3Ryb25nPi4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+RG91YmxlIGNsaWNrIHRoZSA8c3Ryb25nPkFuYWx5c2lzIGFuZCBEZXNpZ24gQ2FwYWJpbGl0eSBQYXR0ZXJuPC9zdHJvbmc+IGFuZCBleGFtaW5lIHRoZSBDYXBhYmlsaXR5IFBhdHRlcm4uIDwvcD4KLSAgPC9saT4KLSAgPGxpPlRoZSA8c3Ryb25nPkRlc2NyaXB0aW9uPC9zdHJvbmc+IHRhYiBwcm92aWRlcyBhIG51bWJlciBvZiBzZWN0aW9ucyB0aGF0IGNhbiBiZSB1c2VkIHRvIGZ1bGx5IGRlc2NyaWJlIHRoZSBDYXBhYmlsaXR5IFBhdHRlcm4uIAotICAgIDxwPkEgQ2FwYWJpbGl0eSBQYXR0ZXJuIG9yIERlbGl2ZXJ5IFByb2Nlc3MgbXVzdCBiZSBhc3NvY2lhdGVkIHdpdGggYXQgbGVhc3Qgb25lIGNvbmZpZ3VyYXRpb24gYnV0IGNhbiBiZSBhc3NvY2lhdGVkIHdpdGggbWFueS4gVGhlIGNvbmZpZ3VyYXRpb24gc2V0cyB0aGUgc2NvcGUgZm9yIGNvcmUgbWV0aG9kIGNvbnRlbnQgYW5kIG90aGVyIHByb2Nlc3MgZWxlbWVudHMgdGhhdCBjYW4gYmUgaW5jbHVkZWQgaW4gYSBwcm9jZXNzLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4gICAgQ2xpY2sgdGhlIDxzdHJvbmc+V29yayBCcmVha2Rvd24gU3RydWN0dXJlPC9zdHJvbmc+IHRhYi4gCi0gICAgPHA+VGhpcyBzaG93cyB0aGUgQWN0aXZpdGllcyBpbiB0aGUgQ2FwYWJpbGl0eSBQYXR0ZXJuIGFuZCB0aGUgKGNvcmUgbWV0aG9kIGNvbnRlbnQpIHRhc2tzIHRoYXQgYXJlIGluY2x1ZGVkIGluIGVhY2ggQWN0aXZpdHkuIDwvcD4KLSAgICA8cD5XaGVuIGEgdGFzayBpcyBhZGRlZCB0byBhIHByb2Nlc3MsIHRoZSByb2xlcyBhbmQgd29yayBwcm9kdWN0cyB0aGF0IGFyZSBhc3NvY2lhdGVkIHdpdGggdGhlIHRhc2sgYXJlIGFsc28gcHVsbGVkIGludG8gdGhlIHByb2Nlc3MuIDwvcD4KLSAgICA8cD5FYWNoIHRhc2ssIHJvbGUsIGFuZCB3b3JrIHByb2R1Y3Qgc2hvd24gaW4gdGhlIGFjdGl2aXR5IGlzIGFjdHVhbGx5IGFuIGluc3RhbmNlIG9mIHRoZSBlbGVtZW50IGFzIGl0IGlzIHVzZWQgYXQgdGhlIHBhcnRpY3VsYXIgcG9pbnQgaW4gdGhlIHByb2Nlc3MuIFNvIHdoYXQgeW91IHNlZSBpbiB0aGUgcHJvY2VzcyBhcmUgYWN0dWFsbHkgVGFzayBEZXNjcmlwdG9ycywgUm9sZSBEZXNjcmlwdG9ycyBhbmQgV29yayBQcm9kdWN0IERlc2NyaXB0b3JzLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4gICAgQ2xpY2sgdGhlIDxzdHJvbmc+VGVhbSBBbGxvY2F0aW9uPC9zdHJvbmc+IHRhYi4gCi0gICAgPHA+VGhpcyBzaG93cyB0aGUgYWN0aXZpdGllcyBpbiB0aGUgY2FwYWJpbGl0eSBwYXR0ZXJuIGFuZCB0aGUgcm9sZXMgdGhhdCBhcmUgdGhlIHBlcmZvcm1lcnMgb2YgdGhlIHRhc2tzIGluIHRoZSBhY3Rpdml0aWVzLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4gICAgQ2xpY2sgdGhlIDxzdHJvbmc+V29yayBQcm9kdWN0IFVzYWdlPC9zdHJvbmc+IHRhYi4gCi0gICAgPHA+VGhpcyBzaG93cyB0aGUgYWN0aXZpdGllcyBpbiB0aGUgY2FwYWJpbGl0eSBwYXR0ZXJuIGFuZCB0aGUgd29yayBwcm9kdWN0cyB0aGF0IGFyZSBpbnB1dCBhbmQgb3V0cHV0cyBvZiB0aGUgdGFza3MgaW4gdGhlIGFjdGl2aXRpZXMuIDwvcD4KLSAgPC9saT4KLSAgPGxpPiAgICBDbGljayBvbiB0aGUgPHN0cm9uZz5Db25zb2xpZGF0ZWQgVmlldzwvc3Ryb25nPiB0YWIuIAotICAgIDxwPlRoaXMgc2hvd3MgdGhlIGZ1bGwgc2V0IG9mIGluZm9ybWF0aW9uIGZvciBlYWNoIGFjdGl2aXR5IGluIHRoZSBDYXBhYmlsaXR5IFBhdHRlcm4uIEl0IHNob3dzIHRoZSB0YXNrcywgd29yayBwcm9kdWN0cyBhbmQgcm9sZXMgd2l0aGluIGVhY2ggYWN0aXZpdHkuIDwvcD4KLSAgPC9saT4KLSAgPGxpPiAgICBSaWdodCBjbGljayBhbnkgPHN0cm9uZz50YXNrIDwvc3Ryb25nPiBpbiB0aGUgPHN0cm9uZz5Xb3JrIEJyZWFrZG93biBTdHJ1Y3R1cmUgdmlldywgPC9zdHJvbmc+IGFuZCBjbGljayBvbiA8c3Ryb25nPlNob3cgUHJvcGVydGllcyBWaWV3PC9zdHJvbmc+LiAKLSAgICA8cD5UaGlzIGRpc3BsYXlzIGEgbmV3IHZpZXcgdGhhdCBzaG93cyBhbGwgdGhlIGluZm9ybWF0aW9uIGFib3V0IHRoZSB0YXNrICh0YXNrIGRlc2NyaXB0b3IpIGFzIGl0IGlzIHVzZWQgaW4gdGhlIHByb2Nlc3MgYW5kIGFsbG93cyB5b3UgdG8gY3VzdG9taXplIHRoZSB0YXNrIGFzIGl0IGlzIHVzZWQgYXQgdGhpcyBwb2ludCBpbiB0aGUgcHJvY2Vzcy4gPC9wPgotICAgIDxwPlRoZSBQcm9wZXJ0aWVzIFZpZXcgaGFzIGEgbnVtYmVyIG9mIHRhYnMgdGhhdCBvcmdhbml6ZSB0aGUgdGFzayBkZXNjcmlwdG9yIGluZm9ybWF0aW9uLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD5DbGljayBvbiB0aGUgPHN0cm9uZz5Eb2N1bWVudGF0aW9uPC9zdHJvbmc+IHRhYi4gVGhpcyBhbGxvd3MgeW91IHRvIGVudGVyIGluZm9ybWF0aW9uIHRoYXQgaXMgc3BlY2lmaWMgdG8gdGhpcyBUYXNrIERlc2NyaXB0b3IuIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPkNsaWNrIG9uIHRoZSA8c3Ryb25nPlJvbGVzPC9zdHJvbmc+IHRhYi4gVGhpcyBhbGxvd3MgeW91IHRvIHJlcGxhY2UsIHJlbW92ZSBvciBhZGQgdG8gdGhlIHJvbGVzIHRoYXQgYXJlIGFzc29jaWF0ZWQgd2l0aCB0aGUgY29yZSBtZXRob2QgdGFzayBmb3IgdGhpcyBzcGVjaWZpYyBpbnN0YW5jZSBvZiB0aGUgdGFzayBpbiB0aGUgcHJvY2Vzcy4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+Q2xpY2sgb24gdGhlIDxzdHJvbmc+V29yayBQcm9kdWN0czwvc3Ryb25nPiB0YWIuIFRoaXMgYWxsb3dzIHlvdSB0byByZXBsYWNlLCByZW1vdmUgb3IgYWRkIHRvIHRoZSB3b3JrIHByb2R1Y3RzIHRoYXQgYXJlIGFzc29jaWF0ZWQgd2l0aCB0aGUgY29yZSBtZXRob2QgdGFzayBmb3IgdGhpcyBzcGVjaWZpYyBpbnN0YW5jZSBvZiB0aGUgdGFzayBpbiB0aGUgcHJvY2Vzcy4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+Q2xpY2sgb24gdGhlIDxzdHJvbmc+U3RlcHM8L3N0cm9uZz4gdGFiLiBUaGlzIGFsbG93cyB5b3UgdG8gYWRqdXN0IHRoZSB0YXNrIHN0ZXBzIGFzIHRoZXkgYXJlIGFwcGxpZWQgYXQgdGhpcyBwb2ludCBpbiB0aGUgcHJvY2Vzcy4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+V2hlbiBhIHJvbGUgaXMgc2VsZWN0ZWQgaW4gdGhlIFRlYW0gQWxsb2NhdGlvbiB2aWV3LCBvciBhIHdvcmsgcHJvZHVjdCBpcyBzZWxlY3RlZCBpbiB0aGUgV29yayBQcm9kdWN0IFVzYWdlIHZpZXcsIHRoZSBQcm9wZXJ0aWVzIFZpZXcgYWxsb3dzIHlvdSB0byBlZGl0IHRoZXNlIGVsZW1lbnRzIGluIHRoZSBjb250ZXh0IG9mIHRoZSBwcm9jZXNzLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT5DbGljayBvbiBhbiA8c3Ryb25nPkFjdGl2aXR5PC9zdHJvbmc+IGluIHRoZSBwcm9jZXNzLiA8YnI+Ci0gICAgVGhlIHByb3BlcnRpZXMgdmlldyBhbGxvd3MgeW91IHRvIHNlZSByb2xsLXVwcyBvZiB0aGUgdGFza3MsIHJvbGVzLCBhbmQgd29yayBwcm9kdWN0cyBpbiB0aGUgYWN0aXZpdHkuIFJvbGwtdXBzIGNhbiBhbHNvIGJlIGRpc3BsYXllZCBpbiB0aGUgbWFpbiBjb250ZW50IHdpbmRvdyBieSBzZWxlY3RpbmcgdGhlIDxzdHJvbmc+Um9sbC1VcDwvc3Ryb25nPiBvcHRpb24gaW4gdGhlIGNvbnRleHQgc2Vuc2l0aXZlIG1lbnUuIFRoZSBSb2xsLVVwIHZpZXcgY2FuIGJlIHR1cm5lZCBvZmYgYnkgc2VsZWN0aW5nLCA8c3Ryb25nPlJvbGwtRG93bjwvc3Ryb25nPi4gPC9saT4KLTwvb2w+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90dXRvcmlhbHMvdHV0b3JpYWxfNV9leF8zLmh0bSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3R1dG9yaWFscy90dXRvcmlhbF81X2V4XzMuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NDM1YWZlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3R1dG9yaWFscy90dXRvcmlhbF81X2V4XzMuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIKLSJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci0KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+VW50aXRsZWQgRG9jdW1lbnQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxib2R5PgotPGgyPjxhPjwvYT48YT5FeGVyY2lzZSAzOiBDcmVhdGUgYSBEZWxpdmVyeSBQcm9jZXNzIDwvYT48L2gyPgotPHA+VGhlIHB1cnBvc2Ugb2YgdGhpcyBleGVyY2lzZSBpcyB0byBsZWFybiBob3cgdG8gY3JlYXRlIGEgZGVsaXZlcnkgcHJvY2VzcyB1c2luZyBjb3JlIG1ldGhvZCBjb250ZW50IGRpcmVjdGx5LiA8L3A+Ci08cD5JbiA8c3Ryb25nPlByb2Nlc3MgQXV0aG9yaW5nIDwvc3Ryb25nPiB3ZSBkbyBub3QgZGlyZWN0bHkgaW5jbHVkZSB0aGUgZGVmaW5pdGlvbnMgb2YgdGhlIGNvcmUgbWV0aG9kIGVsZW1lbnRzIGluIHRoZSBXQlMgYnV0IHJhdGhlciBjcmVhdGUgbG9jYWwgcmVmZXJlbmNlcyB0ZXJtZWQgPHN0cm9uZz5kZXNjcmlwdG9ycyA8L3N0cm9uZz4gdGhhdCByZWZlciBiYWNrIHRvIHRoZSBlbGVtZW50cyBpbiB0aGUgbWV0aG9kIGxpYnJhcnkgYnV0IGFsc28gY29udGFpbiBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHRoYXQgaXMgb25seSByZWxldmFudCB0byB0aGUgbG9jYWwgcHJvY2Vzcy4gPC9wPgotPHA+RGVzY3JpcHRvcnMgYWxzbyBwcm92aWRlIGEgbWVjaGFuaXNtIHdoZXJlYnkgcmVsYXRpb25zaGlwcyBkZWZpbmVkIGluIGNvcmUgbWV0aG9kIGF1dGhvcmluZyAoZS5nLiByb2xlcyBhc3NvY2lhdGVkIHdpdGggYSB0YXNrLCBpbnB1dCBhbmQgb3V0cHV0LCB3b3JrIHByb2R1Y3RzLCBldGMuKSwgY2FuIGJlIGRlZmluZWQgb3IgY2hhbmdlZCBsb2NhbGx5IHdpdGhpbiB0aGUgcHJvY2Vzcy4gPC9wPgotPG9sPgotICA8bGk+ICAgIENyZWF0ZSBhIG5ldyBEZWxpdmVyeSBQcm9jZXNzIGluIHRoZSBNeSBQbHVnaW4sIHBsdWctaW4gY2FsbGVkLCBNeSBSVVAuIDwvbGk+Ci0gIDxibG9ja3F1b3RlPgotICAgIDxwPldoZW4geW91IGNyZWF0ZSBhIHByb2Nlc3MgeW91IGFyZSBhc2tlZCB0byBpZGVudGlmeSB0aGUgZGVmYXVsdCBDb25maWd1cmF0aW9uIHRvIGJlIHVzZWQgd2l0aCB0aGUgcHJvY2Vzcy4gU2VsZWN0IHRoZSBNeSBSVVAgZm9yIFNtYWxsIFByb2plY3RzIGNvbmZpZ3VyYXRpb24uIElmIHlvdSBuYXZlIG5vdCBjcmVhdGVkIHRoaXMgY29uZmlndXJhdGlvbiwgc2VsZWN0IFJVUCBmb3IgU21hbGwgUHJvamVjdHMuIDwvcD4KLSAgICA8cD5BIHByb2Nlc3MgaGFzIGEgaGllcmFyY2h5IG9mIGFjdGl2aXRpZXMgYW5kIGNhbiBpbmNsdWRlIHRoZSBzcGVjaWFsIHR5cGVzIG9mIGFjdGl2aXR5IJYgUGhhc2VzIGFuZCBJdGVyYXRpb25zLiBUaGVzZSBzdHJ1Y3R1cmVzIGNhbiBhbHNvIGJlIGNyZWF0ZWQgaW4gQ2FwYWJpbGl0eSBQYXR0ZXJucy4gRmlyc3Qgb2YgYWxsLCB3ZSdsbCBjcmVhdGUgc29tZSBhY3Rpdml0aWVzIGRpcmVjdGx5IGFuZCByZXVzZSBzb21lIGNhcGFiaWxpdHkgcGF0dGVybnMgbGF0ZXIuIDwvcD4KLSAgPC9ibG9ja3F1b3RlPgotICA8bGk+Ci0gICAgPHA+IFRvIGNyZWF0ZSB0aGUgSW5jZXB0aW9uIFBoYXNlLCBpbiB0aGUgV29yayBCcmVha2Rvd24gU3RydWN0dXJlIHZpZXcsIHJpZ2h0IGNsaWNrIHRoZSA8c3Ryb25nPk15IFJVUCA8L3N0cm9uZz5Qcm9jZXNzLCBhbmQgdGhlbiBzZWxlY3QsIDxzdHJvbmc+TmV3IENoaWxkICZndDsgUGhhc2UgPC9zdHJvbmc+LiBDYWxsIHRoZSBQaGFzZSwgPHN0cm9uZz5JbmNlcHRpb248L3N0cm9uZz4uIDwvcD4KLSAgPC9saT4KLSAgPGxpPiAgICAKLSAgICA8cD5UbyBjcmVhdGUgdGhlIFJlcXVpcmVtZW50cyBEaXNjaXBsaW5lIGluIEluY2VwdGlvbiwgaW4gdGhlIDxzdHJvbmc+V29yayBCcmVha2Rvd24gU3RydWN0dXJlIDwvc3Ryb25nPiB2aWV3LCByaWdodCBjbGljayA8c3Ryb25nPkluY2VwdGlvbiwgPC9zdHJvbmc+IGFuZCBzZWxlY3QgPHN0cm9uZz5OZXcgPC9zdHJvbmc+PHN0cm9uZz5DaGlsZCAmZ3Q7IEFjdGl2aXR5IDwvc3Ryb25nPi4gQ2FsbCB0aGlzIDxzdHJvbmc+UmVxdWlyZW1lbnRzPC9zdHJvbmc+LiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT5UbyBhZGQgVGFza3MgdG8gdGhlIFJlcXVpcmVtZW50cyBhY3Rpdml0eSwgaW4gdGhlIDxzdHJvbmc+Q29uZmlndXJhdGlvbiA8L3N0cm9uZz4gdmlldywgb3BlbiB0aGUgUmVxdWlyZW1lbnRzIERpc2NpcGxpbmUgYW5kIHRoZW4gZHJhZyBhbmQgZHJvcCB0aGUgZm9sbG93aW5nIHRhc2tzIG9udG8gdGhlIFJlcXVpcmVtZW50cyBBY3Rpdml0eSB5b3UgaGF2ZSBqdXN0IGNyZWF0ZWQ6ICA8L2xpPgotICA8YmxvY2txdW90ZT4KLSAgICA8cD4mIzE0OTsmbmJzcDsgRGV2ZWxvcCBWaXNpb24gPC9wPgotICAgIDxwPiYjMTQ5OyZuYnNwOyBEZXRhaWwgdGhlIFNvZnR3YXJlIFJlcXVpcmVtZW50cyA8L3A+Ci0gICAgPHA+JiMxNDk7Jm5ic3A7IEZpbmQgQWN0b3JzIGFuZCB1c2UgQ2FzZXMgPC9wPgotICAgIDxwPldoZW4geW91IGluY2x1ZGUgdGhlc2UgdGFza3MgaW4geW91ciBwcm9jZXNzLCB0aGUgYXNzb2NpYXRlZCByb2xlcyBhbmQgd29yayBwcm9kdWN0cyBhcmUgYWxzbyBpbmNsdWRlZCBpbiB0aGUgcHJvY2Vzcy4gPC9wPgotICA8L2Jsb2NrcXVvdGU+Ci0gIDxsaT4KLSAgICA8cD4gWW91IGNhbiByZXZpZXcgdGhlIGluZm9ybWF0aW9uIGZvciBlYWNoIG1ldGhvZCBlbGVtZW50IGluIHRoZSA8c3Ryb25nPlByb3BlcnRpZXMgPC9zdHJvbmc+IHZpZXcuIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPiBDdXN0b21pemUgdGhlIHN0ZXBzIGZyb20gdGhlIEZpbmQgQWN0b3JzIGFuZCBVc2UgQ2FzZXMgdGFzayBmb3IgdGhlIEluY2VwdGlvbiBwaGFzZS4gQ2xpY2sgb24gdGhlIDxzdHJvbmc+RmluZCBBY3RvcnMgYW5kIFVzZSBDYXNlczwvc3Ryb25nPiB0YXNrIGRlc2NyaXB0b3IsIGFuZCBvcGVuIHRoZSA8c3Ryb25nPlByb3BlcnRpZXM8L3N0cm9uZz4gdmlldy4gQ2xpY2sgb24gdGhlIDxzdHJvbmc+U3RlcHM8L3N0cm9uZz4gdGFiLiBSZW1vdmUgdGhlIGxhc3QgZm91ciBzdGVwcyBhbmQgY2xvc2UgdGhlIHByb3BlcnRpZXMgdmlldy4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+IFN3aXRjaCB0byB0aGUgPHN0cm9uZz5Ccm93c2luZzwvc3Ryb25nPiBwZXJzcGVjdGl2ZSBhbmQgc2VsZWN0IDxzdHJvbmc+UHJvY2Vzc2VzICZndDsgRGVsaXZlcnkgUHJvY2Vzc2VzICZndDsgTXkgUlVQPC9zdHJvbmc+LiBUaGUgV29yayBCcmVha2Rvd24gU3RydWN0dXJlIHRhYiBpcyBkaXNwbGF5ZWQuIENsaWNrIG9uIDxzdHJvbmc+RmluZCBBY3RvcnMgYW5kIFVzZSBDYXNlczwvc3Ryb25nPi4gT25seSB0aGUgZmlyc3QgdGhyZWUgc3RlcHMgZnJvbSB0aGUgY29yZSBtZXRob2QgdGFzayBhcmUgaW5jbHVkZWQuIDwvcD4KLSAgPC9saT4KLSAgPGxpPk1ha2Ugb3RoZXIgY2hhbmdlcyB0byB0aGUgdGFza3MgaW4gdGhlIGRlbGl2ZXJ5IHByb2Nlc3MgeW91IGhhdmUganVzdCBjcmVhdGVkIGFuZCBzZWUgaG93IHRoZXkgYXJlIHJlZmxlY3RlZCB3aGVuIHlvdSB2aWV3IHRoZSBwcm9jZXNzIGluIHRoZSBCcm93c2luZyBwZXJzcGVjdGl2ZS48L2xpPgotPC9vbD4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3R1dG9yaWFscy90dXRvcmlhbF81X2V4XzQuaHRtIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHV0b3JpYWxzL3R1dG9yaWFsXzVfZXhfNC5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyNjBkMmEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHV0b3JpYWxzL3R1dG9yaWFsXzVfZXhfNC5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIgotImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLQotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT5VbnRpdGxlZCBEb2N1bWVudDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTwvaGVhZD4KLQotPGJvZHk+Ci08aDI+PGE+RXhlcmNpc2UgNDogQ3JlYXRlIGEgbmV3IGRlbGl2ZXJ5IFByb2Nlc3MgdXNpbmcgY2FwYWJpbGl0eSBwYXR0ZXJucy4gPC9hPjwvaDI+Ci08cD5UaGUgcHVycG9zZSBvZiB0aGlzIGV4ZXJjaXNlIGlzIHRvIGxlYXJuIGhvdyB0byBjcmVhdGUgYSBkZWxpdmVyeSBwcm9jZXNzIHVzaW5nIDxzdHJvbmc+Q2FwYWJpbGl0eSBQYXR0ZXJucyA8L3N0cm9uZz4uIDwvcD4KLTxwPkEgQ2FwYWJpbGl0eSBQYXR0ZXJuIGlzIGEgcHJvY2VzcyCRZnJhZ21lbnQnLiBJdCByZXByZXNlbnRzIGEgcHJvY2VzcyB0aGF0IGNhbiBiZSByZXVzZWQgbWFueSB0aW1lcyBpbiB0aGUgc2FtZSBwcm9jZXNzIGFuZCAvIG9yIGluIGRpZmZlcmVudCBwcm9jZXNzZXMuIE9yZ2FuaXppbmcgY29yZSBtZXRob2QgY29udGVudCBpbnRvIGNhcGFiaWxpdHkgcGF0dGVybnMgYW5kIHRoZW4gdXNpbmcgdGhlIGNhcGFiaWxpdHkgcGF0dGVybnMgdG8gY29uc3RydWN0IGZ1bGwgbGlmZS1jeWNsZSBkZWxpdmVyeSBwcm9jZXNzZXMgaXMgYSBrZXkgZmVhdHVyZSBvZiBFY2xpcHNlIFByb2Nlc3MgRnJhbWV3b3JrIENvbXBvc2VyLiA8L3A+Ci08cD5BIGNhcGFiaWxpdHkgcGF0dGVybiBjYW4gYmUgaW5jbHVkZWQgaW4gYW5vdGhlciBwcm9jZXNzIChhbm90aGVyIGNhcGFiaWxpdHkgcGF0dGVybiBvciBhIGRlbGl2ZXJ5IHByb2Nlc3MpIGluIHR3byB3YXlzOiA8L3A+Ci08YmxvY2txdW90ZT4KLSAgPHA+JiMxNDk7Jm5ic3A7IENvcHkgliB0aGlzIGNyZWF0ZXMgYSBmdWxsIGNvcHkgb2YgdGhlIGNhcGFiaWxpdHkgcGF0dGVybiBpbiB0aGUgdGFyZ2V0IHByb2Nlc3MgYnV0IGRvZXMgbm90IHJldGFpbiBhbnkgbGlua3MgYmFjayB0byB0aGUgb3JpZ2luYWwgY2FwYWJpbGl0eSBwYXR0ZXJuLiBUaGUgY2FwYWJpbGl0eSBwYXR0ZXJuIGNhbiBiZSBjdXN0b21pemVkIGluIHRoZSBuZXcgcHJvY2Vzcy4gQW55IGNoYW5nZXMgdGhhdCBhcmUgc3Vic2VxdWVudGx5IG1hZGUgdG8gdGhlIGNhcGFiaWxpdHkgcGF0dGVybiBhcmUgbm90IHJlZmxlY3RlZCBpbiB0aGUgcHJvY2VzcyBpbnRvIHdoaWNoIGl0IHdhcyBjb3BpZWQuIDwvcD4KLSAgPHA+JiMxNDk7Jm5ic3A7IEV4dGVuZHMgliB0aGlzIGV4dGVuZHMgdGhlIGNhcGFiaWxpdHkgcGF0dGVybiBpbnRvIHRoZSBwcm9jZXNzLiBUaGUgcHJvY2VzcyByZXRhaW5zIGxpbmtzIHRvIHRoZSBjYXBhYmlsaXR5IHBhdHRlcm4gYW5kIGFueSBzdWJzZXF1ZW50IGNoYW5nZXMgdG8gdGhlIGNhcGFiaWxpdHkgcGF0dGVybiBhcmUgcmVmbGVjdGVkIGluIHRoZSBwcm9jZXNzIGludG8gd2hpY2ggaXQgaXMgZXh0ZW5kZWQuIFRoZSBjYXBhYmlsaXR5IHBhdHRlcm4gY2FuIGJlIGN1c3RvbWl6ZWQgYnkgc3VwcHJlc3NpbmcgdGFza3MsIHJvbGVzLCBhbmQgd29yayBwcm9kdWN0cy4gT3RoZXIgY2hhbmdlcyBjYW5ub3QgYmUgbWFkZS4gPC9wPgotPC9ibG9ja3F1b3RlPgotPHA+V2Ugd2lsbCBhZGQgc29tZSBDYXBhYmlsaXR5IFBhdHRlcm5zIHRvIHRoZSBEZWxpdmVyeSBQcm9jZXNzIHlvdSBjcmVhdGVkIGluIEV4ZXJjaXNlIDMuIDwvcD4KLTxwPlRvIGFkZCBhIENhcGFiaWxpdHkgUGF0dGVybiB1c2luZyBDb3B5OiA8L3A+Ci08b2w+Ci0gIDxsaT4KLSAgICA8cD4gU3dpdGNoIHRvIHRoZSBhdXRob3JpbmcgcGVyc3BlY3RpdmUgYW5kIG9wZW4gdGhlIE15IFJVUCBkZWxpdmVyeSBwcm9jZXNzIHlvdSBjcmVhdGVkIGluIEV4ZXJjaXNlIDMuIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPiBJbiB0aGUgQ29uZmlndXJhdGlvbnMgVmlldyBjbGljayA8c3Ryb25nPlByb2Nlc3NlcyAmZ3Q7IENhcGFiaWxpdHkgUGF0dGVybnMgJmd0OyBDbGFzc2ljIFJVUCAmZ3Q7IERpc2NpcGxpbmUgV29ya2Zsb3dzICZndDsgUHJvamVjdCBNYW5hZ2VtZW50LiA8L3N0cm9uZz48L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD4gRHJhZyBhbmQgZHJvcCB0aGUgPHN0cm9uZz5Qcm9qZWN0IE1hbmFnZW1lbnQgPC9zdHJvbmc+IENhcGFiaWxpdHkgUGF0dGVybiBvbnRvIHRoZSBJbmNlcHRpb24gcGhhc2UgaW4gTXkgUlVQIGRlbGl2ZXJ5IHByb2Nlc3MuIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPiBTZWxlY3QgPHN0cm9uZz5Db3B5IDwvc3Ryb25nPiBpbiB0aGUgcG9wLXVwIGJveC4gPC9wPgotICA8L2xpPgotICA8bGk+ICAgRXhwYW5kIG9uZSBvZiB0aGUgYWN0aXZpdGllcyBpbiB0aGUgUHJvamVjdCBNYW5hZ2VtZW50IGNhcGFiaWxpdHkgcGF0dGVybiB0byB0aGUgVGFzayBsZXZlbC4gTm90ZSB0aGF0IHRoZSB0YXNrIG5hbWUgaXMgZGlzcGxheWVkIGluIGJsYWNrLiBUaGlzIGluZGljYXRlcyB0aGF0IHRoZSB0YXNrIGlzIGF2YWlsYWJsZSBmb3IgeW91IHRvIGVkaXQuIEFueSBjaGFuZ2VzIGluIHRoZSBDYXBhYmlsaXR5IFBhdHRlcm4gd2lsbCBub3QgYmUgcmVmbGVjdGVkIGluIHlvdXIgcHJvY2Vzcy4gWW91IGNhbiBlZGl0IHRoZSB0YXNrIGluIHRoZSBQcm9wZXJ0aWVzIHZpZXcuIDwvbGk+Ci08L29sPgotPHA+VG8gYWRkIGEgQ2FwYWJpbGl0eSBQYXR0ZXJuIHVzaW5nIEV4dGVuZHM6ICA8L3A+Ci08b2wgc3RhcnQ9IjYiPgotICA8bGk+Ci0gICAgPHA+IENyZWF0ZSBhIG5ldyBQaGFzZSBpbiB0aGUgTXkgUlVQIGRlbGl2ZXJ5IHByb2Nlc3MuIFJpZ2h0LWNsaWNrIG9uIHRoZSBmaXJzdCByb3cgYW5kIHNlbGVjdCA8c3Ryb25nPk5ldyBDaGlsZCAmZ3Q7IFBoYXNlIDwvc3Ryb25nPi4gQ2FsbCB0aGUgcGhhc2UsIEVsYWJvcmF0aW9uLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD4gQ3JlYXRlIGEgbmV3IEl0ZXJhdGlvbiBpbiB0aGUgRWxhYm9yYXRpb24gcGhhc2UuIFJpZ2h0LWNsaWNrIG9uIHRoZSBFbGFib3JhdGlvbiBwaGFzZSBhbmQgc2VsZWN0IDxzdHJvbmc+TmV3IENoaWxkICZndDsgSXRlcmF0aW9uIDwvc3Ryb25nPi4gQ2FsbCB0aGUgaXRlcmF0aW9uLCBFbGFib3JhdGlvbiBJdGVyYXRpb24gMS4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+IEluIHRoZSBDb25maWd1cmF0aW9ucyBWaWV3LCBjbGljayA8c3Ryb25nPlByb2Nlc3NlcyAmZ3Q7IENhcGFiaWxpdHkgUGF0dGVybnMgJmd0OyBDbGFzc2ljIFJVUCAmZ3Q7IERpc2NpcGxpbmUgV29ya2Zsb3dzICZndDsgUHJvamVjdCBNYW5hZ2VtZW50LiA8L3N0cm9uZz48L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD4gRHJhZyBhbmQgZHJvcCB0aGUgPHN0cm9uZz5Qcm9qZWN0IE1hbmFnZW1lbnQgPC9zdHJvbmc+IENhcGFiaWxpdHkgUGF0dGVybiBvbnRvIHRoZSBFbGFib3JhdGlvbiBJdGVyYXRpb24gMSBpdGVyYXRpb24gaW4gTXkgUlVQIFByb2Nlc3MuIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPiBTZWxlY3QgPHN0cm9uZz5FeHRlbmQgPC9zdHJvbmc+IGluIHRoZSBwb3AtdXAgYm94LiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD4gRXhwYW5kIG9uZSBvZiB0aGUgYWN0aXZpdGllcyBpbiB0aGUgUHJvamVjdCBNYW5hZ2VtZW50IGNhcGFiaWxpdHkgcGF0dGVybiB5b3UgaGF2ZSBqdXN0IGFkZGVkIHRvIHRoZSBUYXNrIGxldmVsLiBOb3RlIHRoYXQgdGhlIHRhc2sgbmFtZSBpcyBkaXNwbGF5ZWQgaW4gZ3JlZW4gaXRhbGljcy4gVGhpcyBpbmRpY2F0ZXMgdGhhdCB0aGUgdGFzayBpcyBpbiBhIHBhcnQgb2YgYSBwcm9jZXNzIGRlZmluZWQgZWxzZXdoZXJlIJYgYSBDYXBhYmlsaXR5IFBhdHRlcm4uIEFueSBjaGFuZ2VzIHRvIHRoZSBDYXBhYmlsaXR5IFBhdHRlcm4gd2lsbCBiZSByZWZsZWN0ZWQgaW4geW91ciBwcm9jZXNzLiBBbHNvLCB0aGUgUHJvcGVydGllcyB2aWV3IHNob3dzIHRoZSB0YXNrIGRldGFpbHMsIGJ1dCB0aGV5IGNhbm5vdCBiZSBlZGl0ZWQuIDwvcD4KLSAgPC9saT4KLSAgPGxpPlJpZ2h0IGNsaWNrIG9uIGEgdGFzayBpbiB0aGUgZXh0ZW5kZWQgY2FwYWJpbGl0eSBwYXR0ZXJuIGFuZCBzZWxlY3QgPHN0cm9uZz5TdXBwcmVzcyA8L3N0cm9uZz4uIFRoZSB0YXNrIGlzIGdyYXllZCBvdXQuIFRoZSB0YXNrIHdpbGwgbm90IGFwcGVhciBpbiB0aGUgcHVibGlzaGVkIHZlcnNpb24gb2YgdGhlIGRlbGl2ZXJ5IHByb2Nlc3MsIG5vciB3aWxsIGl0IGJlIGluY2x1ZGVkIGluIGFuIGV4cG9ydCBvZiB0aGUgcHJvY2Vzcy48L2xpPgotPC9vbD4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3R1dG9yaWFscy90dXRvcmlhbF81X2V4XzUuaHRtIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHV0b3JpYWxzL3R1dG9yaWFsXzVfZXhfNS5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkYmY4MmYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHV0b3JpYWxzL3R1dG9yaWFsXzVfZXhfNS5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIgotImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLQotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT5VbnRpdGxlZCBEb2N1bWVudDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTwvaGVhZD4KLQotPGJvZHk+Ci08aDI+PGE+PC9hPjxhPkV4ZXJjaXNlIDU6IENyZWF0ZSBQcm9jZXNzIERpYWdyYW1zIDwvYT48L2gyPgotPHA+VGhlIHB1cnBvc2Ugb2YgdGhpcyBleGVyY2lzZSBpcyB0byBleHBsb3JlIHRoZSBkaWFncmFtIGZlYXR1cmVzIG9mIEVjbGlwc2UgUHJvY2VzcyBGcmFtZXdvcmsgQ29tcG9zZXIuIDwvcD4KLTxwPkVQRiBDb21wb3NlciBzdXBwb3J0cyB0aHJlZSB0eXBlcyBvZiBwcm9jZXNzIGRpYWdyYW0uIFRoZXNlIGFyZTogPC9wPgotPGJsb2NrcXVvdGU+Ci0gICAgICAgIDxwPiYjMTQ5OyZuYnNwOyA8c3Ryb25nPkFjdGl2aXR5IERpYWdyYW08L3N0cm9uZz4gPC9wPgotICAgICAgICA8YmxvY2txdW90ZT4KLSAgICAgICAgICA8cD4gICAgICAgICAgICBUaGlzIHNob3dzIHRoZSAoc3ViKSBhY3Rpdml0aWVzIGluIGEgaGlnaGVyIGxldmVsIGFjdGl2aXR5LiBJdCBzaG93cyB0aGUgc2VxdWVuY2UgcmVsYXRpb25zaGlwcyBiZXR3ZWVuIHRoZSBhY3Rpdml0aWVzLiA8L3A+Ci0gICAgICAgIDwvYmxvY2txdW90ZT4KLSAgPHA+JiMxNDk7Jm5ic3A7IDxzdHJvbmc+QWN0aXZpdHkgRGV0YWlsPC9zdHJvbmc+IJYgc2ltaWxhciB0byBSVVAgV29ya2Zsb3cgRGV0YWlsIDwvcD4KLSAgPGJsb2NrcXVvdGU+Ci0gICAgPHA+ICAgICAgVGhpcyBzaG93cyB0aGUgdGFza3MgaW4gYW4gYWN0aXZpdHkgd2l0aCB0aGVpciBwZXJmb3JtaW5nIHJvbGVzIGFuZCBpbnB1dCBhbmQgb3V0cHV0IHdvcmsgcHJvZHVjdHMuIDwvcD4KLSAgPC9ibG9ja3F1b3RlPgotICA8cD4mIzE0OTsmbmJzcDsgPHN0cm9uZz5Xb3JrIFByb2R1Y3QgRGVwZW5kZW5jeSBEaWFncmFtPC9zdHJvbmc+IDwvcD4KLSAgPGJsb2NrcXVvdGU+Ci0gICAgPHA+VGhpcyBkaWFncmFtIGNhbiBiZSB1c2VkIHRvIHNob3cgaG93IGEgd29yayBwcm9kdWN0IGlzIGRlcGVuZGVudCBvbiBvdGhlciB3b3JrIHByb2R1Y3RzLiA8L3A+Ci0gIDwvYmxvY2txdW90ZT4KLTwvYmxvY2txdW90ZT4KLTxwPlRoZXNlIGRpYWdyYW1zIGNhbiB0aGVuIGJlIGluY2x1ZGVkIGluIHRoZSBwdWJsaXNoZWQgd2ViIHNpdGUuIFRoZSBkaWFncmFtcyBhcmUgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgKHRvIGEgZGVncmVlKSBhbmQgaW5oZXJlbnRseSBzeW5jaHJvbml6ZWQgd2l0aCB0aGUgV0JTLiBDaGFuZ2VzIHRvIHRoZSBwcm9jZXNzIHN0cnVjdHVyZSB1c2luZyB0aGUgZGlhZ3JhbSBlZGl0b3IgYXJlIGF1dG9tYXRpY2FsbHkgcmVmbGVjdGVkIGluIHRoZSBXQlMsIGFuZCB2aWNlIHZlcnNhLiA8L3A+Ci08b2w+Ci0gIDxsaT4KLSAgICA8cD5Td2l0Y2ggdG8gPHN0cm9uZz5BdXRob3JpbmcgPC9zdHJvbmc+IHBlcnNwZWN0aXZlLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD5TZWxlY3QgdGhlIE15IFJVUCBkZWxpdmVyeSBwcm9jZXNzIHRoYXQgeW91IGhhdmUgYmVlbiB3b3JraW5nIG9uLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD5IaWdobGlnaHQgdGhlIGRlbGl2ZXJ5IHByb2Nlc3MgaW4gdGhlIFdCUyBhbmQgdGhlbiByaWdodC1jbGljay4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+Q2xpY2sgPHN0cm9uZz5EaWFncmFtcyAmZ3Q7IE9wZW4gQWN0aXZpdHkgRGlhZ3JhbTwvc3Ryb25nPi4gVGhlIGRpYWdyYW0gZWRpdG9yIHNob3VsZCBvcGVuLCBzaG93aW5nIHRoZSB0b3AgbGV2ZWwgYWN0aXZpdGllcyAtIHBoYXNlcy4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+RXhwYW5kIHRoZSA8c3Ryb25nPlBhbGV0dGUgPC9zdHJvbmc+IG9uIHRoZSByaWdodCBvZiB0aGUgZGlhZ3JhbSB2aWV3LiBBbGwgdGhlIGVsZW1lbnRzIHJlcXVpcmVkIHRvIGNyZWF0ZSBhbiA8c3Ryb25nPkFjdGl2aXR5IERpYWdyYW0gPC9zdHJvbmc+IGFyZSBhdmFpbGFibGUgb24gdGhlIHBhbGV0dGUuIEFkZCBhIG5ldyBwaGFzZSB0byB0aGUgZGlhZ3JhbSCWIGNhbGwgaXQsIENvbnN0cnVjdGlvbi4gQ3JlYXRlIGxpbmtzIGJldHdlZW4gdGhlIHBoYXNlcyB0byBzaG93IHRoZSBzZXF1ZW5jZSBvZiB0aGUgcGhhc2VzLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD5Td2l0Y2ggYmFjayB0byB0aGUgPHN0cm9uZz5Xb3JrIEJyZWFrZG93biBTdHJ1Y3R1cmUgPC9zdHJvbmc+dmlldyBhbmQgbm90aWNlIHRoZSBuZXcgcGhhc2UuIEFsc28gbm90aWNlIHRoYXQgdGhlIGxpbmtzIHlvdSBhZGRlZCBvbiB0aGUgZGlhZ3JhbSBhcmUgcmVmbGVjdGVkIGluIHRoZSBQcmVkZWNlc3NvcnMgY29sdW1uLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD5Eb3VibGUgY2xpY2sgdGhlIDxzdHJvbmc+SW5jZXB0aW9uIFBoYXNlPC9zdHJvbmc+IGluIHRoZSBkaWFncmFtIJYgaXQgd2lsbCBkcmlsbCBkb3duIHRvIHNob3cgdGhlIGNvbnRhaW5lZCBBY3Rpdml0aWVzICh0aGUgcnVsZSBpcyB0aGF0IHRoZSBlZGl0b3Igd2lsbCBkaXNwbGF5IHRoZSBwcm9jZXNzIGVsZW1lbnRzIGF0IHRoZSBsZXZlbCBiZWxvdyB0aGUgY3VycmVudCBzZWxlY3RlZCBlbGVtZW50KS4gU3VjY2Vzc2l2ZSBkcmlsbCBkb3duIHRocm91Z2ggdGhlIGxldmVscyBpcyBwb3NzaWJsZSBieSBjbGlja2luZyBvbiB0aGUgZGlhZ3JhbSBlbGVtZW50cy4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+Q2xvc2UgdGhlIGRpYWdyYW1zIHlvdSBoYXZlIG9wZW5lZC4gPC9wPgotICA8L2xpPgotICA8bGk+SW4gdGhlIFdvcmsgQnJlYWtkb3duIFN0cnVjdHVyZSwgcmlnaHQtY2xpY2sgb24gdGhlIFJlcXVpcmVtZW50cyBhY3Rpdml0eSBhbmQgc2VsZWN0LCA8c3Ryb25nPkRpYWdyYW1zICZndDsgT3BlbiBBY3Rpdml0eSBEZXRhaWwgRGlhZ3JhbS4gPC9zdHJvbmc+VGhlIEFjdGl2aXR5IERldGFpbCBEaWFncmFtIGlzIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkLiBJdCBzaG93czogIDwvbGk+Ci0gIDxibG9ja3F1b3RlPgotICAgIDxwPiYjMTQ5OyZuYnNwOyBUaGUgUm9sZXMgdGhhdCBwZXJmb3JtIHRhc2tzIGluIHRoZSBhY3Rpdml0eSA8L3A+Ci0gICAgPHA+JiMxNDk7Jm5ic3A7IFRoZSBUYXNrcyB0aGF0IHRoZSByb2xlcyBwZXJmb3JtIDwvcD4KLSAgICA8cD4mIzE0OTsmbmJzcDsgVGhlIGlucHV0IGFuZCBvdXRwdXQgd29yayBwcm9kdWN0cyBmb3IgZWFjaCB0YXNrIDwvcD4KLSAgICA8cD5Zb3UgY2FuIGNoYW5nZSB0aGUgbGF5b3V0IG9mIHRoZSBkaWFncmFtIGJ1dCB5b3UgY2Fubm90IGFkZCBvciByZW1vdmUgYW55IGVsZW1lbnRzIGZyb20gdGhlIGRpYWdyYW0uIDwvcD4KLSAgPC9ibG9ja3F1b3RlPgotICA8bGk+Ci0gICAgPHA+Q2xvc2UgdGhlIGRpYWdyYW1zIHlvdSBoYXZlIG9wZW5lZC4gPC9wPgotICA8L2xpPgotICA8bGk+ICAgIEluIHRoZSBXb3JrIEJyZWFrZG93biBTdHJ1Y3R1cmUsIHJpZ2h0LWNsaWNrIG9uIHRoZSBSZXF1aXJlbWVudHMgYWN0aXZpdHkgYW5kIHNlbGVjdCwgPHN0cm9uZz5EaWFncmFtcyAmZ3Q7IE9wZW4gV29yayBQcm9kdWN0IERlcGVuZGVuY3kgRGlhZ3JhbS4gPC9zdHJvbmc+VGhlIHdvcmsgcHJvZHVjdHMgdXNlZCBpbiB0aGUgYWN0aXZpdHkgYXJlIGF1dG9tYXRpY2FsbHkgYWRkZWQgdG8gdGhlIGRpYWdyYW0uICA8L2xpPgotPC9vbD4KLTxibG9ja3F1b3RlPgotICA8cD5BZGQgYSAoZGVwZW5kZW5jeSkgbGluayBiZXR3ZWVuIHR3byB3b3JrIHByb2R1Y3RzLiBUaGlzIGluZGljYXRlcyB0aGF0IHRoZSB3b3JrIHByb2R1Y3QgYXQgdGhlIGFycm93IGVuZCBvZiB0aGUgbGluayBpcyBkZXBlbmRlbnQgb24gdGhlIG90aGVyIHdvcmsgcHJvZHVjdCwgaS5lLiwgdGhlIG90aGVyIHdvcmsgcHJvZHVjdCBuZWVkcyB0byBiZSBjcmVhdGVkIGluIG9yZGVyIHRvIGNyZWF0ZSB0aGUgc2Vjb25kIHdvcmsgcHJvZHVjdC4KLSAgPC9wPgotICA8cD5BZGQgYSB3b3JrIHByb2R1Y3QgZGVzY3JpcHRvciB0byB0aGUgZGlhZ3JhbS4gPC9wPgotPC9ibG9ja3F1b3RlPgotPG9sIHN0YXJ0PSIxMiI+Ci0gIDxsaT4KLSAgICA8cD5Td2l0Y2ggYmFjayB0byB0aGUgZGVsaXZlcnkgcHJvY2VzcyBhbmQgb3BlbiB0aGUgPHN0cm9uZz5Xb3JrIFByb2R1Y3QgVXNhZ2U8L3N0cm9uZz4gdmlldy4gTm90aWNlIHRoZSBuZXcgd29yayBwcm9kdWN0IGluIHRoZSBSZXF1aXJlbWVudHMgYWN0aXZpdHkuIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPk9uY2UgeW91IGhhdmUgZWRpdGVkIGEgZGlhZ3JhbSwgeW91IGNhbiBjaG9vc2UgdG8gaW5jbHVkZSBpdCBvciBleGNsdWRlIGl0IHdoZW4gcHVibGlzaGluZyB0aGUgcHJvY2VzcyBpbiBhIGNvbmZpZ3VyYXRpb24uIEluIHRoZSBXb3JrIEJyZWFrZG93biBTdHJ1Y3R1cmUsIHJpZ2h0LWNsaWNrIG9uIHRoZSA8c3Ryb25nPlJlcXVpcmVtZW50czwvc3Ryb25nPiBhY3Rpdml0eSBhbmQgc2VsZWN0IDxzdHJvbmc+RGlhZ3JhbXMgJmd0OyBQdWJsaXNoaW5nIE9wdGlvbnMuIDwvc3Ryb25nPkNoZWNrIG9yIHVuY2hlY2sgdGhlIHR5cGVzIG9mIGRpYWdyYW0gbGlzdGVkLiBJZiBhIGRpYWdyYW0gdHlwZSBpcyBub3QgbGlzdGVkLCBpdCBtZWFucyB0aGF0IHlvdSBoYXZlIG5vdCBlZGl0ZWQgdGhhdCBkaWFncmFtIHR5cGUgZm9yIHRoZSBhY3Rpdml0eSB5ZXQuIDwvcD4KLSAgPC9saT4KLSAgPC9vbD4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3R1dG9yaWFscy90dXRvcmlhbF81X2ludHJvLmh0bSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3R1dG9yaWFscy90dXRvcmlhbF81X2ludHJvLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWVhMzUxMy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90dXRvcmlhbHMvdHV0b3JpYWxfNV9pbnRyby5odG0KKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIgotImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLQotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT5VbnRpdGxlZCBEb2N1bWVudDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTwvaGVhZD4KLQotPGJvZHk+Ci08aDE+PGE+PC9hPjxhPlR1dG9yaWFsOiBXb3JraW5nIHdpdGggUHJvY2Vzc2VzIDwvYT48L2gxPgotPHA+PHN0cm9uZz48ZW0+UHJvY2VzcyBBdXRob3JpbmcgPC9lbT48L3N0cm9uZz4gYWxsb3dzIGEgUHJvY2VzcyBFbmdpbmVlciB0byBpbmNvcnBvcmF0ZSA8c3Ryb25nPjxlbT5NZXRob2QgRWxlbWVudHMgPC9lbT48L3N0cm9uZz4gaW50byBwcm9jZXNzIHN0cnVjdHVyZXMuIEZvciBleGFtcGxlLCBhIFdvcmsgQnJlYWtkb3duIFN0cnVjdHVyZSBmb3JtYXQgZmFtaWxpYXIgdG8gUHJvamVjdCBNYW5hZ2Vycy4gVGhlIHByb2Nlc3NlcyBjYW4gYmUgaW5jbHVkZWQgaW4gYSBjb25maWd1cmF0aW9uIHRvIGJlIHB1Ymxpc2hlZCBhcyBwYXJ0IG9mIHRoZSBwdWJsaXNoZWQgd2ViIHNpdGUuIDwvcD4KLTxwPkluIDxzdHJvbmc+PGVtPk1ldGhvZCA8L2VtPiBBdXRob3JpbmcgPC9zdHJvbmc+IHRoZSBQcm9jZXNzIEVuZ2luZWVyIGRlZmluZXMgcm9sZXMsIHRhc2tzLCB3b3JrIHByb2R1Y3RzIGFuZCBndWlkYW5jZSBhbmQgZGVmaW5lcyB0aGUgcmVsYXRpb25zaGlwcyBiZXR3ZWVuIHRoZXNlIGVsZW1lbnRzLiA8L3A+Ci08cD5JbiA8c3Ryb25nPjxlbT5Qcm9jZXNzIDwvZW0+IEF1dGhvcmluZyA8L3N0cm9uZz4gdGhlIHByb2Nlc3MgZW5naW5lZXIgZGVmaW5lcyBhZGRpdGlvbmFsIGxpZmVjeWNsZSBlbGVtZW50cyBzdWNoIGFzIDxzdHJvbmc+QWN0aXZpdGllcyA8L3N0cm9uZz4gKHN1bW1hcnkgdGFza3MpLCA8c3Ryb25nPlBoYXNlcyA8L3N0cm9uZz4sIDxzdHJvbmc+SXRlcmF0aW9ucyA8L3N0cm9uZz4gYW5kIDxzdHJvbmc+TWlsZXN0b25lcyA8L3N0cm9uZz4sIHRoYXQgY2FuIHRoZW4gYmUgdXNlZCB0byBjb21wb3NlIHRoZSBjb3JlIGVsZW1lbnRzIGludG8gcHJvY2Vzc2VzLiBBIGNvbXBsZXRlIHByb2Nlc3MgY29ycmVzcG9uZGluZyB0byBhIHByb2plY3QgcGxhbiBvciBhIHBoYXNlIHdlIGNhbGwgYSA8c3Ryb25nPjxlbT5EZWxpdmVyeSBQcm9jZXNzIDwvZW0+PC9zdHJvbmc+PGVtPihjb3JyZXNwb25kaW5nIHRvIFNtYWxsIFJVUCwgZm9yIGV4YW1wbGUpIDwvZW0+LiBXZSBjYW4gYWxzbyBjcmVhdGUgc21hbGxlciBtb3JlIGdyYW51bGFyIHNlY3Rpb25zIG9mIHByb2Nlc3MsIHRlcm1lZCA8c3Ryb25nPjxlbT5DYXBhYmlsaXR5IFBhdHRlcm5zIDwvZW0+PC9zdHJvbmc+IHRoYXQgY2FuIGJlIHVzZWQgYXMgYnVpbGRpbmcgYmxvY2tzIHRvIG1vcmUgZWFzaWx5IGNvbXBvc2UgZGVsaXZlcnkgcHJvY2Vzc2VzLiA8L3A+Ci08cD5FYWNoIHRpbWUgYSB0YXNrIGlzIGluY2x1ZGVkIGluIGEgcHJvY2VzcywgYSBjb3B5IG9mIHRoYXQgdGFzayBpcyBjcmVhdGVkIGluIHRoZSBjb250ZXh0IG9mIHRoZSBwcm9jZXNzLiBXZSBjYWxsIHRoaXMgYSBUYXNrIERlc2NyaXB0b3IuIFRoZSBzYW1lIHRhc2sgY2FuIGJlIGluY2x1ZGVkIGFueSBudW1iZXIgb2YgdGltZXMgaW4gdGhlIHNhbWUgcHJvY2Vzcy4gVGhpcyBhbGxvd3MsIGZvciBleGFtcGxlLCB0aGUgc2FtZSBSVVAgdGFzayB0byBiZSBpbmNsdWRlZCBpbiBlYWNoIEl0ZXJhdGlvbiBpbiBlYWNoIFJVUCBQaGFzZS4gQSBUYXNrIERlc2NyaXB0b3IgY2FuIGFsc28gbW9kaWZ5IHRoZSBiYXNlIHRhc2sgd2l0aG91dCBhY3R1YWxseSBjaGFuZ2luZyB0aGUgdGFzay4gRm9yIGV4YW1wbGUsIHJvbGVzIGFuZCB3b3JrIHByb2R1Y3RzIGNhbiBiZSBhZGRlZCBvciBzdXBwcmVzc2VkLCBzdGVwcyBjYW4gYmUgc3VwcHJlc3NlZCBvciByZS1zZXF1ZW5jZWQuIDwvcD4KLTxwPm9sZXMgYW5kIFdvcmsgUHJvZHVjdHMgYXJlIGFsc28gaW5jbHVkZWQgaW4gcHJvY2Vzc2VzIGFzIFJvbGUgRGVzY3JpcHRvcnMgYW5kIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9ycy4gU28gcm9sZXMgYW5kIHdvcmsgcHJvZHVjdHMgY2FuIGFsc28gYmUgY3VzdG9taXplZCB0byBmaXQgd2l0aCB0aGUgY29udGV4dCBvZiB0aGUgcHJvY2VzcyBpbiB3aGljaCB0aGV5IGFyZSB1c2VkLjwvcD4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3R3aXN0eSBzeW1ib2wxLkpQRyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3R3aXN0eSBzeW1ib2wxLkpQRwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjNiMTFiMy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90d2lzdHkgc3ltYm9sMS5KUEcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC91bWFfaHVtcC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC91bWFfaHVtcC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2ZjQ1NDQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdW1hX2h1bXAuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdW5kZXJsaW5lLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3VuZGVybGluZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiNzY4YzkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdW5kZXJsaW5lLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3VzZXJpbnRlcmZhY2UuSlBHIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdXNlcmludGVyZmFjZS5KUEcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiMzY4YWEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdXNlcmludGVyZmFjZS5KUEcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC91c2VyaW50ZXJmYWNlb3ZlcnZpZXcuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3VzZXJpbnRlcmZhY2VvdmVydmlldy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YTI4Mzk1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3VzZXJpbnRlcmZhY2VvdmVydmlldy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJzZWN1cml0eSIgY29udGVudD0icHVibGljIiAvPgotPG1ldGEgbmFtZT0iUm9ib3RzIiBjb250ZW50PSJpbmRleCxmb2xsb3ciIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIG5hbWU9IkRDLlR5cGUiIGNvbnRlbnQ9ImNvbmNlcHQiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iVG9vbCBJbnRlcmZhY2UiIC8+Ci08bWV0YSBuYW1lPSJhYnN0cmFjdCIgY29udGVudD0iRWNsaXBzZSBQcm9jZXNzIEZyYW1ld29yayBDb21wb3NlciBpcyBidWlsdCBvbiB0aGUgRWNsaXBzZSBJbnRlZ3JhdGVkIERldmVsb3BtZW50IEVudmlyb25tZW50IChJREUpLiBUaGUgcGFydHMgb2YgdGhlIHdvcmtzcGFjZSBhcmU6IiAvPgotPG1ldGEgbmFtZT0iZGVzY3JpcHRpb24iIGNvbnRlbnQ9IkVjbGlwc2UgUHJvY2VzcyBGcmFtZXdvcmsgQ29tcG9zZXIgaXMgYnVpbHQgb24gdGhlIEVjbGlwc2UgSW50ZWdyYXRlZCBEZXZlbG9wbWVudCBFbnZpcm9ubWVudCAoSURFKS4gVGhlIHBhcnRzIG9mIHRoZSB3b3Jrc3BhY2UgYXJlOiIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iYXV0aG9yaW5ncGVyc3BlY3RpdmUuaHRtbCNhdXRob3JpbmdwZXJzcGVjdGl2ZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iYnJvd3NpbmdwZXJzcGVjdGl2ZS5odG1sI2Jyb3dpbmdwZXJzcGVjdGl2ZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iYXV0aG9yaW5ncGVyc3BlY3RpdmUuaHRtbCIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iYnJvd3NpbmdwZXJzcGVjdGl2ZS5odG1sIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJjb25maWd1cmF0aW9udmlldy5odG1sIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJsaWJyYXJ5dmlldy5odG1sIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJicm93c2VhbmRwcmV2aWV3bWV0aG9kY29udGVudC5odG1sIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJzZWFyY2hmb3JtZXRob2Rjb250ZW50Lmh0bWwiIC8+Ci08bWV0YSBuYW1lPSJEQy5Gb3JtYXQiIGNvbnRlbnQ9IlhIVE1MIiAvPgotPG1ldGEgbmFtZT0iREMuSWRlbnRpZmllciIgY29udGVudD0idXNlcmludGVyZmFjZW92ZXJ2aWV3IiAvPgotPG1ldGEgbmFtZT0iREMuTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIiAvPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuL2libWRpdGEuY3NzIiAvPgotPHRpdGxlPlRvb2wgSW50ZXJmYWNlPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJ1c2VyaW50ZXJmYWNlb3ZlcnZpZXciPjxhIG5hbWU9InVzZXJpbnRlcmZhY2VvdmVydmlldyI+PCEtLSAtLT48L2E+Ci0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPlRvb2wgSW50ZXJmYWNlPC9oMT4KLTxkaXY+PHA+RWNsaXBzZSBQcm9jZXNzIEZyYW1ld29yayBDb21wb3NlciBpcyBidWlsdCBvbiB0aGUgRWNsaXBzZSBJbnRlZ3JhdGVkCi1EZXZlbG9wbWVudCBFbnZpcm9ubWVudCAoSURFKS4gVGhlIHBhcnRzIG9mIHRoZSB3b3Jrc3BhY2UgYXJlOjwvcD4KLTxwPjxpbWcgc3JjPSJ1c2VyaW50ZXJmYWNlLkpQRyIgYWx0PSIiIC8+PC9wPgotPGRpdiBjbGFzcz0icCI+PHVsPjxsaT48c3Ryb25nPkNvbmZpZ3VyYXRpb24gZHJvcC1kb3duIHNlbGVjdGlvbiBib3g8L3N0cm9uZz4gLSBUaGUgY29uZmlndXJhdGlvbiBkcm9wLWRvd24KLXNlbGVjdGlvbiBib3ggYWxsb3dzIHlvdSB0byBzZWxlY3QgYSA8YSBocmVmPSJjb25maWd1cmF0aW9udmlldy5odG1sI2NvbmZpZ3VyYXRpb252aWV3Ij5jb25maWd1cmF0aW9uPC9hPiBpbiB3aGljaCB0byB3b3JrLiA8L2xpPgotPGxpPjxzdHJvbmc+T3BlbiBQZXJzcGVjdGl2ZSBidXR0b248L3N0cm9uZz4gLSBDbGljayB0aGUgT3BlbiBQZXJzcGVjdGl2ZSBidXR0b24KLXRvIHNlbGVjdCBhIDxhIGhyZWY9InBlcnNwZWN0aXZlcy5odG1sI3BlcnNwZWN0aXZlcyI+cGVyc3BlY3RpdmU8L2E+LgotVGhlcmUgYXJlIHR3byBwZXJzcGVjdGl2ZXMgdG8gc2VsZWN0IGZyb206IFRoZSA8YSBocmVmPSJicm93c2luZ3BlcnNwZWN0aXZlLmh0bWwjYnJvd2luZ3BlcnNwZWN0aXZlIj5Ccm93c2luZyBQZXJzcGVjdGl2ZTwvYT4gYW5kIHRoZSA8YSBocmVmPSJhdXRob3JpbmdwZXJzcGVjdGl2ZS5odG1sI2F1dGhvcmluZ3BlcnNwZWN0aXZlIj5BdXRob3JpbmcgUGVyc3BlY3RpdmU8L2E+LiA8L2xpPgotPGxpPjxzdHJvbmc+TGlicmFyeSBWaWV3PC9zdHJvbmc+IC0gVGhlIDxhIGhyZWY9ImxpYnJhcnl2aWV3Lmh0bWwjbGlicmFyeXZpZXciPkxpYnJhcnkKLVZpZXc8L2E+IGRpc3BsYXlzIHRoZSBNZXRob2QgUGx1Zy1pbnMgYW5kIENvbmZpZ3VyYXRpb25zIGNvbnRhaW5lZCBpbiBhCi1NZXRob2QgTGlicmFyeS48L2xpPgotPGxpPjxzdHJvbmc+Q29uZmlndXJhdGlvbiBWaWV3PC9zdHJvbmc+IC0gVGhlIDxhIGhyZWY9ImNvbmZpZ3VyYXRpb252aWV3Lmh0bWwjY29uZmlndXJhdGlvbnZpZXciPkNvbmZpZ3VyYXRpb24gVmlldzwvYT4gc2hvd3MgdGhlIGNvbnRlbnQgZWxlbWVudHMgaW4gYSBsaWJyYXJ5Ci1maWx0ZXJlZCBieSBhIGNvbmZpZ3VyYXRpb24uPC9saT4KLTxsaT48c3Ryb25nPkNvbnRlbnQgRWRpdG9ycyBhbmQgUHJldmlldzwvc3Ryb25nPiAtIFdoZW4geW91IGFyZSB3b3JraW5nIGluIHRoZSA8YSBocmVmPSJhdXRob3JpbmdwZXJzcGVjdGl2ZS5odG1sI2F1dGhvcmluZ3BlcnNwZWN0aXZlIj5BdXRob3JpbmcKLVBlcnNwZWN0aXZlPC9hPiwgdGhlIHdpbmRvdyBvbiB0aGUgcmlnaHQgc2lkZSBvZiB5b3VyIHNjcmVlbiBjb250YWlucyBjb250ZW50Ci1lZGl0b3JzLCB3aGljaCBhbGxvdyB5b3UgdG8gY3JlYXRlIG9yIG1vZGlmeSBlbGVtZW50IHR5cGVzLiBXaGVuIHRoZSA8YSBocmVmPSJicm93c2luZ3BlcnNwZWN0aXZlLmh0bWwjYnJvd2luZ3BlcnNwZWN0aXZlIj5Ccm93c2luZwotUGVyc3BlY3RpdmU8L2E+IGlzIG9wZW4sIHRoZSB3aW5kb3cgb24gdGhlIHJpZ2h0IGNvbnRhaW5zIGEgcHJldmlldyBvZgoteW91ciBjb250ZW50IGFzIGl0IHdpbGwgYXBwZWFyIGluIGEgcHVibGlzaGVkIFdlYiBzaXRlLjwvbGk+Ci08L3VsPgotPC9kaXY+Ci08L2Rpdj4KLTxkaXY+Ci08b2w+Ci08bGkgY2xhc3M9Im9sY2hpbGRsaW5rIj48YSBocmVmPSJhdXRob3JpbmdwZXJzcGVjdGl2ZS5odG1sIj5BdXRob3JpbmcgUGVyc3BlY3RpdmU8L2E+PGJyIC8+Ci08L2xpPgotPGxpIGNsYXNzPSJvbGNoaWxkbGluayI+PGEgaHJlZj0iYnJvd3NpbmdwZXJzcGVjdGl2ZS5odG1sIj5Ccm93c2luZyBQZXJzcGVjdGl2ZTwvYT48YnIgLz4KLTwvbGk+Ci08bGkgY2xhc3M9Im9sY2hpbGRsaW5rIj48YSBocmVmPSJjb25maWd1cmF0aW9udmlldy5odG1sIj5Db25maWd1cmF0aW9uIFZpZXc8L2E+PGJyIC8+Ci08L2xpPgotPGxpIGNsYXNzPSJvbGNoaWxkbGluayI+PGEgaHJlZj0ibGlicmFyeXZpZXcuaHRtbCI+TGlicmFyeSBWaWV3PC9hPjxiciAvPgotPC9saT4KLTxsaSBjbGFzcz0ib2xjaGlsZGxpbmsiPjxhIGhyZWY9ImJyb3dzZWFuZHByZXZpZXdtZXRob2Rjb250ZW50Lmh0bWwiPkJyb3dzZSBhbmQgUHJldmlldyBNZXRob2QgQ29udGVudDwvYT48YnIgLz4KLTwvbGk+Ci08bGkgY2xhc3M9Im9sY2hpbGRsaW5rIj48YSBocmVmPSJzZWFyY2hmb3JtZXRob2Rjb250ZW50Lmh0bWwiPlNlYXJjaCBmb3IgTWV0aG9kIENvbnRlbnQ8L2E+PGJyIC8+Ci08L2xpPgotPC9vbD4KLTxkaXYgY2xhc3M9InJlbGNvbmNlcHRzIj48c3Ryb25nPlJlbGF0ZWQgY29uY2VwdHM8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iYXV0aG9yaW5ncGVyc3BlY3RpdmUuaHRtbCNhdXRob3JpbmdwZXJzcGVjdGl2ZSI+QXV0aG9yaW5nIFBlcnNwZWN0aXZlPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJicm93c2luZ3BlcnNwZWN0aXZlLmh0bWwjYnJvd2luZ3BlcnNwZWN0aXZlIj5Ccm93c2luZyBQZXJzcGVjdGl2ZTwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC91c2Vycm9sZXNhbmRyb2xlc3BlY2lmaWN0YXNrcy5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdXNlcnJvbGVzYW5kcm9sZXNwZWNpZmljdGFza3MuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2RmMTY0My4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC91c2Vycm9sZXNhbmRyb2xlc3BlY2lmaWN0YXNrcy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJzZWN1cml0eSIgY29udGVudD0icHVibGljIiAvPgotPG1ldGEgbmFtZT0iUm9ib3RzIiBjb250ZW50PSJpbmRleCxmb2xsb3ciIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIG5hbWU9IkRDLlR5cGUiIGNvbnRlbnQ9InRvcGljIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IlVzZXIgUm9sZXMgYW5kIFJvbGUgU3BlY2lmaWMgVGFza3MiIC8+Ci08bWV0YSBuYW1lPSJEQy5Gb3JtYXQiIGNvbnRlbnQ9IlhIVE1MIiAvPgotPG1ldGEgbmFtZT0iREMuSWRlbnRpZmllciIgY29udGVudD0idXNlcnJvbGVzYW5kcm9sZXNwZWNpZmljdGFza3MiIC8+Ci08bWV0YSBuYW1lPSJEQy5MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiIC8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4vaWJtZGl0YS5jc3MiIC8+Ci08dGl0bGU+VXNlciBSb2xlcyBhbmQgUm9sZSBTcGVjaWZpYyBUYXNrczwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0idXNlcnJvbGVzYW5kcm9sZXNwZWNpZmljdGFza3MiPjxhIG5hbWU9InVzZXJyb2xlc2FuZHJvbGVzcGVjaWZpY3Rhc2tzIj48IS0tIC0tPjwvYT4KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+VXNlciBSb2xlcyBhbmQgUm9sZSBTcGVjaWZpYyBUYXNrczwvaDE+Ci08ZGl2PjxwPlRoZXJlIGFyZSBmb3VyIHByaW1hcnkgcm9sZXMgcGxheWVkIGJ5IHRoZSB1c2VycyBvZiB0aGlzIHRvb2w6PC9wPgotPHVsPjxsaT5NZXRob2QgQXV0aG9yPC9saT4KLTxsaT5Qcm9jZXNzIEF1dGhvcjwvbGk+Ci08bGk+UHJvY2VzcyBDb25maWd1cmF0b3I8L2xpPgotPGxpPlByYWN0aXRpb25lcjwvbGk+Ci08L3VsPgotPGRpdiBjbGFzcz0icCI+PHN0cm9uZz5NZXRob2QgQXV0aG9yPC9zdHJvbmc+IC0gVGhlIE1ldGhvZCBBdXRob3IgdXNlcyB0aGUgdG9vbCBvbiBhIHJlZ3VsYXIgYmFzaXMKLXRvIHByb3ZpZGUgc3RhbmRhcmQgcHJvY2Vzc2VzIGZvciB1c2UgaW4gYW4gb3JnYW5pemF0aW9uLiBUaGUgTWV0aG9kIEF1dGhvcgotdXNlcyB0aGUgZnVsbCBmdW5jdGlvbmFsaXR5IG9mIHRoZSB0b29sIHRvOjx1bD48bGk+Q3JlYXRlIHBsdWctaW5zLjwvbGk+Ci08bGk+Q3JlYXRlIG5ldyBtZXRob2QgZWxlbWVudHMuPC9saT4KLTxsaT5FeHRlbmQgZXhpc3RpbmcgbWV0aG9kIGVsZW1lbnRzLjwvbGk+Ci08bGk+Q3JlYXRlIHJldXNhYmxlIGNhcGFiaWxpdHkgcGF0dGVybnMgYnkgcmV1c2luZyBtZXRob2QgZWxlbWVudHMuPC9saT4KLTxsaT5DcmVhdGUgZGVsaXZlcnkgcHJvY2Vzc2VzIGJ5IHJldXNpbmcgY2FwYWJpbGl0eSBwYXR0ZXJucyBhbmQgbWV0aG9kIGVsZW1lbnRzLjwvbGk+Ci08bGk+Q3JlYXRlIGN1c3RvbSBjYXRlZ29yaWVzIGZvciB1c2UgYXMgdmlld3MgaW4gYSBjb25maWd1cmF0aW9uLjwvbGk+Ci08bGk+Q3JlYXRlIGFuZCBtb2RpZnkgY29uZmlndXJhdGlvbnMuPC9saT4KLTxsaT5QdWJsaXNoIGNvbmZpZ3VyYXRpb25zIG9yIHByb2Nlc3Nlcy48L2xpPgotPC91bD4KLTwvZGl2PgotPGRpdiBjbGFzcz0icCI+PHN0cm9uZz5Qcm9jZXNzIEF1dGhvcjwvc3Ryb25nPiAtIFRoZSBQcm9jZXNzIEF1dGhvcidzIGdvYWwgaXMgdG8gcHJvZHVjZSBhIGRlbGl2ZXJ5Ci1wcm9jZXNzIGZvciB0aGVpciBwcm9qZWN0KHMpIGJ5IHJldXNpbmcgbWV0aG9kIGVsZW1lbnRzLiBUaGUgUHJvY2VzcyBBdXRob3IKLXVzZXMgdGhlIHRvb2wgb2NjYXNpb25hbGx5LCBhcyBwcm9qZWN0IG5lZWRzIGRpY3RhdGUsIHR5cGljYWxseSBzdXBwb3J0aW5nCi1vbmUgb3IsIG1vcmUgbGlrZWx5LCBzZXZlcmFsIHByb2plY3RzIGJ5IHNwZWNpZnlpbmcgdGhlIHByb2Nlc3NlcyB0byBiZSBmb2xsb3dlZC4KLVRoZSBQcm9jZXNzIEF1dGhvciB1c2VzIHRoZSBwcm9jZXNzIGF1dGhvcmluZyBhbmQgY29uZmlndXJhdGlvbiBwdWJsaXNoaW5nCi1mdW5jdGlvbmFsaXR5IG9mIHRoaXMgdG9vbCB0bzo8dWw+PGxpPkNyZWF0ZSBwbHVnLWlucy48L2xpPgotPGxpPkNyZWF0ZSByZXVzYWJsZSBjYXBhYmlsaXR5IHBhdHRlcm5zIGJ5IHJldXNpbmcgbWV0aG9kIGVsZW1lbnRzLjwvbGk+Ci08bGk+Q3JlYXRlIGRlbGl2ZXJ5IHByb2Nlc3NlcyBieSByZXVzaW5nIGNhcGFiaWxpdHkgcGF0dGVybnMgYW5kIG1ldGhvZCBlbGVtZW50cy48L2xpPgotPGxpPkNyZWF0ZSBjdXN0b20gY2F0ZWdvcmllcyBmb3IgdXNlIGFzIHZpZXdzIGluIGEgY29uZmlndXJhdGlvbi4gPC9saT4KLTxsaT5DcmVhdGUgYW5kIG1vZGlmeSBjb25maWd1cmF0aW9ucy48L2xpPgotPGxpPlB1Ymxpc2ggY29uZmlndXJhdGlvbnMgb3IgcHJvY2Vzc2VzLjwvbGk+Ci08L3VsPgotPC9kaXY+Ci08ZGl2IGNsYXNzPSJwIj48c3Ryb25nPlByb2Nlc3MgQ29uZmlndXJhdG9yPC9zdHJvbmc+IC0gVGhlIFByb2Nlc3MgQ29uZmlndXJhdG9yJ3MgZ29hbCBpcyB0byBwcm9kdWNlCi1hIGRlbGl2ZXJ5IHByb2Nlc3MgZm9yIHRoZWlyIHByb2plY3QocykgYnkgcmFwaWRseSBsZXZlcmFnaW5nIHJlYWR5LW1hZGUgcGx1Zy1pbnMuCi1UaGUgUHJvY2VzcyBDb25maWd1cmF0b3IgdXNlcyB0aGlzIHRvb2wgb2NjYXNpb25hbCwgYXMgcHJvamVjdCBuZWVkcyBkaWN0YXRlLAotdHlwaWNhbGx5IHN1cHBvcnRpbmcgb25lIG9yIHNldmVyYWwgcHJvamVjdHMgYnkgc3BlY2lmeWluZyB0aGUgcHJvY2VzcyBmb3IKLXRoZSBwcm9qZWN0cy4gVGhlIFByb2Nlc3MgQ29uZmlndXJhdG9yIHVzZXMgdGhlIGNvbmZpZ3VyYXRpb24KLXB1Ymxpc2hpbmcgZnVuY3Rpb25hbGl0eSBpbiB0aGlzIHRvb2wgdG86PHVsPjxsaT5DcmVhdGUgYW5kIG1vZGlmeSBjb25maWd1cmF0aW9ucy48L2xpPgotPGxpPlB1Ymxpc2ggY29uZmlndXJhdGlvbnMgb3IgcHJvY2Vzc2VzLjwvbGk+Ci08L3VsPgotPC9kaXY+Ci08cD48c3Ryb25nPlByYWN0aXRpb25lcjwvc3Ryb25nPiAtIEEgUHJhY3RpdGlvbmVyJ3MgZ29hbCBpcyB0byBjb3JyZWN0bHkgdXNlIHRoZSBvcmdhbml6YXRpb24ncwotcHJvY2Vzc2VzIGFuZCBiZXN0IHByYWN0aWNlcyBlZmZlY3RpdmVseS4gQSBQcmFjdGl0aW9uZXIgdXNlcyBhIHB1Ymxpc2hlZAotY29uZmlndXJhdGlvbiBvbiBhIHJlZ3VsYXIgYmFzaXMgZHJpdmVuIGJ5IHRoZSB3b3JrIGJlaW5nIHBlcmZvcm1lZCB0byB2aWV3Ci1wcm9jZXNzZXMgYW5kIG1ldGhvZHMuPC9wPgotPC9kaXY+Ci08ZGl2PjwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdmFyaWFiaWxpdHkuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3ZhcmlhYmlsaXR5Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0YWE5YjcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdmFyaWFiaWxpdHkuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDExNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGh0bWwKLSAgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9InNlY3VyaXR5IiBjb250ZW50PSJwdWJsaWMiIC8+Ci08bWV0YSBuYW1lPSJSb2JvdHMiIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgbmFtZT0iREMuVHlwZSIgY29udGVudD0iY29uY2VwdCIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJWYXJpYWJpbGl0eSIgLz4KLTxtZXRhIG5hbWU9ImFic3RyYWN0IiBjb250ZW50PSJWYXJpYWJpbGl0eSBhbGxvd3MgZWxlbWVudHMgaW4gb25lIGNvbnRlbnQgcGFja2FnZSB0byBpbmZsdWVuY2Ugb3IgbW9kaWZ5IGVsZW1lbnRzIGluIG90aGVyIGNvbnRlbnQgcGFja2FnZXMgd2l0aG91dCBhY3R1YWxseSBkaXJlY3RseSBtb2RpZnlpbmcgdGhlIG9yaWdpbmFsIGNvbnRlbnQuIFZhcmlhYmlsaXR5IGVuYWJsZXMgY2hhbmdlcyB0byB0aGUgY29udGVudCB3aGlsZSBrZWVwaW5nIHRoZSBjaGFuZ2VzIHNlcGFyYXRlIGFuZCBvcHRpb25hbC4iIC8+Ci08bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iVmFyaWFiaWxpdHkgYWxsb3dzIGVsZW1lbnRzIGluIG9uZSBjb250ZW50IHBhY2thZ2UgdG8gaW5mbHVlbmNlIG9yIG1vZGlmeSBlbGVtZW50cyBpbiBvdGhlciBjb250ZW50IHBhY2thZ2VzIHdpdGhvdXQgYWN0dWFsbHkgZGlyZWN0bHkgbW9kaWZ5aW5nIHRoZSBvcmlnaW5hbCBjb250ZW50LiBWYXJpYWJpbGl0eSBlbmFibGVzIGNoYW5nZXMgdG8gdGhlIGNvbnRlbnQgd2hpbGUga2VlcGluZyB0aGUgY2hhbmdlcyBzZXBhcmF0ZSBhbmQgb3B0aW9uYWwuIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJ2YXJpYWJpbGl0eWFzc29jaWF0aW9ucy5odG1sI3ZhcmlhYmlsaXR5YXNzb2NpYXRpb25zIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJjb250cmlidXRlcy5odG1sIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJyZXBsYWNlLmh0bWwjcmVwbGFjZXMiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9ImV4dGVuZHMuaHRtbCNleHRlbmRzIiAvPgotPG1ldGEgbmFtZT0iREMuRm9ybWF0IiBjb250ZW50PSJYSFRNTCIgLz4KLTxtZXRhIG5hbWU9IkRDLklkZW50aWZpZXIiIGNvbnRlbnQ9InZhcmlhYmlsaXR5IiAvPgotPG1ldGEgbmFtZT0iREMuTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIiAvPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuL2libWRpdGEuY3NzIiAvPgotPHRpdGxlPlZhcmlhYmlsaXR5PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJ2YXJpYWJpbGl0eSI+PGEgbmFtZT0idmFyaWFiaWxpdHkiPjwhLS0gLS0+PC9hPgotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5WYXJpYWJpbGl0eTwvaDE+Ci08ZGl2PjxwPlZhcmlhYmlsaXR5IGFsbG93cyBlbGVtZW50cyBpbiBvbmUgY29udGVudCBwYWNrYWdlIHRvIGluZmx1ZW5jZQotb3IgbW9kaWZ5IGVsZW1lbnRzIGluIG90aGVyIGNvbnRlbnQgcGFja2FnZXMgd2l0aG91dCBhY3R1YWxseSBkaXJlY3RseSBtb2RpZnlpbmcKLXRoZSBvcmlnaW5hbCBjb250ZW50LiBWYXJpYWJpbGl0eSBlbmFibGVzIGNoYW5nZXMgdG8gdGhlIGNvbnRlbnQgd2hpbGUga2VlcGluZwotdGhlIGNoYW5nZXMgc2VwYXJhdGUgYW5kIG9wdGlvbmFsLjwvcD4KLTxwPlZhcmlhYmlsaXR5IGFsbG93cyB5b3UgdG8gZmFjdG9yIHlvdXIgbWV0aG9kIGNvbnRlbnQgYW5kIHByb2Nlc3NlcyBpbiBpbnRlcnJlbGF0ZWQKLXVuaXRzIGFuZCB0byBhcmNoaXRlY3QgbWV0aG9kIGNvbnRlbnQgYW5kIHByb2Nlc3NlcyBpbiBsYXllcnMgdGhhdCBleHRlbmQKLWVhY2ggb3RoZXIgd2l0aCBuZXcgY2FwYWJpbGl0aWVzLiBWYXJpYWJpbGl0eSBhbHNvIGFsbG93cyB5b3UgdG8gZXh0ZW5kIGFuZAotdGFpbG9yIG1ldGhvZCBjb250ZW50IGFuZCBwcm9jZXNzZXMgeW91IGRvIG5vdCBvd24gYW5kIGNhbm5vdCBkaXJlY3RseSBtb2RpZnksCi1hbmQgdG8gZWFzaWx5IHVwZ3JhZGUgdG8gbmV3ZXIgdmVyc2lvbnMgYnkgc2ltcGx5IHJlYXBwbHlpbmcgeW91ciBwZXJzb25hbAotY2hhbmdlcyB0byB0aGUgdXBncmFkZXMuPC9wPgotPHA+VGhlIHVzZSBvZiB2YXJpYWJpbGl0eSBhZmZlY3RzIHR3byBjaGFyYWN0ZXJpc3RpY3Mgb2YgYSBtZXRob2QgZWxlbWVudDoKLWl0cyBhdHRyaWJ1dGVzIGFuZCBpdHMgcmVsYXRpb25zaGlwcyB3aXRoIG90aGVyIGNvbnRlbnQgZWxlbWVudHMuIElmIGFuIGVsZW1lbnQKLWFsbG93cyB2YXJpYWJpbGl0eSwgdGhlIHNwZWNpZmljYXRpb24gaXMgc2hvd24gYXQgdGhlIGJvdHRvbSBvZiB0aGUgZWxlbWVudCdzCi1kZXNjcmlwdGlvbiB2aWV3LjwvcD4KLTxkaXYgY2xhc3M9InAiPkZvciB0aGUgcHVycG9zZXMgb2YgdmFyaWFiaWxpdHksIHRoZXJlIGFyZSB0aHJlZSBncm91cHMgb2YgaW5mb3JtYXRpb24KLWZvciBhbnkgZWxlbWVudCB0byBiZSBjb25zaWRlcmVkOjx1bD48bGk+PHN0cm9uZz5BdHRyaWJ1dGVzPC9zdHJvbmc+IC0gcGllY2VzIG9mIGRhdGEgYWJvdXQgYW4gZWxlbWVudCBzdWNoIGFzIE1haW4gRGVzY3JpcHRpb24uPC9saT4KLTxsaT48c3Ryb25nPkluY29taW5nIEFzc29jaWF0aW9uczwvc3Ryb25nPiAtIGFzc29jaWF0aW9ucyB0byBvdGhlciBlbGVtZW50cyB3aGVyZSB0aGUKLWFzc29jaWF0aW9uIHJlZmVyZW5jZSBpcyBoZWxkIGluIHRoZSBvdGhlciBlbGVtZW50LiBJbiBvdGhlciB3b3JkcywgdGhlIG90aGVyCi1lbGVtZW50IGhhcyByZWZlcmVuY2VzIHRvIHRoZSBzdWJqZWN0IGVsZW1lbnQuPC9saT4KLTxsaT48c3Ryb25nPk91dGdvaW5nIEFzc29jaWF0aW9uczwvc3Ryb25nPiAtIGFzc29jaWF0aW9ucyB0byBvdGhlciBlbGVtZW50cyB3aGVyZSB0aGUKLWFzc29jaWF0aW9uIHJlZmVyZW5jZSBpcyBoZWxkIGluIHRoZSBzdWJqZWN0IGVsZW1lbnQuIEluIG90aGVyIHdvcmRzLCB0aGUKLXN1YmplY3QgZWxlbWVudCBoYXMgcmVmZXJlbmNlcyB0byB0aGUgb3RoZXIgZWxlbWVudC48L2xpPgotPC91bD4KLUluIGFkZGl0aW9uLCBhc3NvY2lhdGlvbnMgY2FuIGJlIG9uZS10by1vbmUgb3Igb25lLXRvLW1hbnkuIFNlZSA8YSBocmVmPSJ2YXJpYWJpbGl0eWFzc29jaWF0aW9ucy5odG1sI3ZhcmlhYmlsaXR5YXNzb2NpYXRpb25zIj5WYXJpYWJpbGl0eSBBc3NvY2lhdGlvbnM8L2E+IGZvcgotYSBmdWxsIGxpc3Qgb2YgdGhlIGFzc29jaWF0aW9ucyBmb3IgZWFjaCB0eXBlIG9mIGVsZW1lbnQuPC9kaXY+Ci08ZGl2IGNsYXNzPSJzZWN0aW9uIj48aDQgY2xhc3M9InNlY3Rpb250aXRsZSI+VmFyaWFiaWxpdHkgVHlwZTwvaDQ+PGRpdiBjbGFzcz0icCI+VmFyaWFiaWxpdHkKLXR5cGUgZGVmaW5lcyB0aGUgbmF0dXJlIG9mIGhvdyBvbmUgZWxlbWVudCBhZmZlY3RzIGFub3RoZXIgZWxlbWVudCB1c2luZyB2YXJpYWJpbGl0eS4KLVRoZSB2YXJpYWJpbGl0eSB0eXBlcyBhcmU6PHVsPjxsaT48c3Ryb25nPk5vdCBBcHBsaWNhYmxlPC9zdHJvbmc+IC0gVGhlIGVsZW1lbnQgaXMgYSBiYXNlIGVsZW1lbnQgYW5kIGRvZXMgbm90IGFmZmVjdAotYW5vdGhlciBlbGVtZW50IHRocm91Z2ggdmFyaWFiaWxpdHkuIFRoaXMgaXMgdGhlIGRlZmF1bHQgdmFsdWUgb2YgYW4gZWxlbWVudCdzCi12YXJpYWJpbGl0eSB0eXBlLjwvbGk+Ci08L3VsPgotPHVsPjxsaT48c3Ryb25nPjxzcGFuIGNsYXNzPSJrZXl3b3JkIj5Db250cmlidXRlczwvc3Bhbj48L3N0cm9uZz4gLQotQSBjb250cmlidXRpbmcgZWxlbWVudCBhZGRzIHRvIHRoZSBiYXNlIGVsZW1lbnQuIENvbnRyaWJ1dGVzIHByb3ZpZGVzIGEgd2F5Ci1mb3IgZWxlbWVudHMgdG8gY29udHJpYnV0ZSB0aGVpciBwcm9wZXJ0aWVzIGludG8gdGhlaXIgYmFzZSBlbGVtZW50IHdpdGhvdXQKLWRpcmVjdGx5IGNoYW5naW5nIGFueSBvZiBpdHMgZXhpc3RpbmcgcHJvcGVydGllcywgc3VjaCBhcyBpbiBhbiBhZGRpdGl2ZSBmYXNoaW9uLgotVGhlIGVmZmVjdCwgYWZ0ZXIgY29udHJpYnV0aW9uLCBpcyB0aGF0IHRoZSBiYXNlIGVsZW1lbnQgaXMgbG9naWNhbGx5IHJlcGxhY2VkCi13aXRoIGFuIGVsZW1lbnQgdGhhdCBjb21iaW5lcyB0aGUgYXR0cmlidXRlcyBhbmQgYXNzb2NpYXRpb25zIG9mIHRoZSBjb250cmlidXRpbmcKLWVsZW1lbnQgd2l0aCB0aGUgYmFzZSBlbGVtZW50LjwvbGk+Ci08L3VsPgotPHVsPjxsaT48c3Ryb25nPjxzcGFuIGNsYXNzPSJrZXl3b3JkIj5SZXBsYWNlczwvc3Bhbj48L3N0cm9uZz4gLQotQSByZXBsYWNpbmcgZWxlbWVudCByZXBsYWNlcyBwYXJ0cyBvZiB0aGUgYmFzZSBlbGVtZW50LiBSZXBsYWNlcyBwcm92aWRlcwotYSB3YXkgZm9yIGFuIGVsZW1lbnQgdG8gcmVwbGFjZSBhIGJhc2UgZWxlbWVudCB3aXRob3V0IGRpcmVjdGx5IGNoYW5naW5nIGFueQotb2YgdGhlIGJhc2UgZWxlbWVudCdzIGV4aXN0aW5nIHByb3BlcnRpZXMuIFRoaXMgaXMsIGluIG1vc3QgY2FzZXMsIHVzZWQgZm9yCi1tZXRob2QgcGx1Zy1pbnMgdGhhdCBhaW0gdG8gcmVwbGFjZSBzcGVjaWZpYyBjb250ZW50IGVsZW1lbnRzIHN1Y2ggYXMgcm9sZXMsCi10YXNrcywgb3IgYWN0aXZpdGllcyB3aXRoIGVpdGhlciBhIGNvbXBsZXRlbHkgbmV3IHZhcmlhbnQgb3IgdG8gY2hhbmdlIHRoZQotZnVuZGFtZW50YWwgcmVsYXRpb25zaGlwcyBvZiB0aGVzZSBlbGVtZW50cy4gVGhlIGVmZmVjdCBvZiB0aGlzLCBpcyB0aGF0IHRoZQotYmFzZSBjb250ZW50IGVsZW1lbnQgaXMgbG9naWNhbGx5IHJlcGxhY2VkIHdpdGggdGhlIG5ldyByZXBsYWNpbmcgZWxlbWVudAotdG8gd2hpY2ggYWxsIGluY29taW5nIGFzc29jaWF0aW9ucyBzdGlsbCBwb2ludCBhcyBiZWZvcmUsIGJ1dCB3aGljaCBoYXMgcG90ZW50aWFsbHkKLW5ldyBhdHRyaWJ1dGUgdmFsdWVzIGFuZCBvdXRnb2luZyBhc3NvY2lhdGlvbiBwcm9wZXJ0aWVzLjwvbGk+Ci08L3VsPgotPHVsPjxsaT48c3Ryb25nPjxzcGFuIGNsYXNzPSJrZXl3b3JkIj5FeHRlbmRzPC9zcGFuPjwvc3Ryb25nPiAtCi1BbiBleHRlbmRpbmcgZWxlbWVudCBpbmhlcml0cyBjaGFyYWN0ZXJpc3RpY3Mgb2YgdGhlIGJhc2UgZWxlbWVudC4gRXh0ZW5zaW9uCi1hbGxvd3MgTWV0aG9kIFBsdWctaW5zIHRvIGVhc2lseSByZXVzZSBlbGVtZW50cyBmcm9tIGEgYmFzZSBwbHVnLWluIGJ5IHByb3ZpZGluZwotYSBraW5kIG9mIGluaGVyaXRhbmNlIGZvciB0aGUgZXh0ZW5kaW5nIGVsZW1lbnQuIEF0dHJpYnV0ZSB2YWx1ZXMgYW5kIGFzc29jaWF0aW9uCi1pbnN0YW5jZXMgYXJlIGluaGVyaXRlZCBmcm9tIHRoZSAiYmFzZWQtb24iIGVsZW1lbnQgdG8gdGhlIGV4dGVuZGluZyBlbGVtZW50LgotVGhlIHJlc3VsdCBpcyB0aGF0IHRoZSBleHRlbmRpbmcgZWxlbWVudCBoYXMgdGhlIHNhbWUgcHJvcGVydGllcyBhcyB0aGUgImJhc2VkLW9uIgotZWxlbWVudCwgYnV0IG1pZ2h0IGRlZmluZSBpdHMgb3duIGFkZGl0aW9ucy4gRXh0ZW5kcyBpcyBub3QgdXNlZCB0byBtb2RpZnkKLWNvbnRlbnQgb2YgdGhlIGJhc2UgcGx1Zy1pbiwgYnV0IHRvIHByb3ZpZGUgdGhlIGFiaWxpdHkgZm9yIHRoZSBleHRlbmRpbmcKLXBsdWctaW4gdG8gZGVmaW5lIGl0cyBvd24gY29udGVudCB3aGljaCBpcyBhIHZhcmlhbnQgb2YgY29udGVudCBhbHJlYWR5IGRlZmluZWQuCi1Gb3IgZXhhbXBsZSwgYSBzcGVjaWFsIHZlcnNpb24gb2YgYSBnZW5lcmljIFJldmlldyBSZWNvcmQgZm9yIGEgc3BlY2lmaWMgdHlwZQotb2YgcmV2aWV3LiBUaGUgZWZmZWN0IG9mIHRoaXMgaXMgdGhhdCB0aGUgYmFzZSBlbGVtZW50IGFuZCBhbnkgbnVtYmVyIG9mIGV4dGVuZGluZwotZWxlbWVudHMgY2FuIGJlIHVzZWQgc2lkZSBieSBzaWRlLCBidXQgcmVmZXIgdG8gZWFjaCBvdGhlciB0aHJvdWdoIHRoZSBleHRlbmRzCi1yZWxhdGlvbnNoaXAuIEV4dGVuZHMgYWxzbyBwcm92aWRlcyB0aGUga2V5IG1lY2hhbmlzbSBmb3IgYmluZGluZyBjYXBhYmlsaXR5Ci1wYXR0ZXJucyB0byBwcm9jZXNzZXM6IEEgcGF0dGVybiBpcyBhcHBsaWVkIGJ5IGRlZmluaW5nIGFuIGV4dGVuZHMgcmVsYXRpb25zaGlwCi1mcm9tIGFuIGFjdGl2aXR5IG9mIHRoZSBhcHBseWluZyBwcm9jZXNzZXMgdG8gdGhlIGNhcGFiaWxpdHkgcGF0dGVybi4gVGhlCi1hY3Rpdml0eSBpbmhlcml0cyBhc3NvY2lhdGlvbiBpbnN0YW5jZXMgZnJvbSB0aGUgcGF0dGVybiBhbmQgdGhlIHBhdHRlcm4gYXBwZWFycwotdG8gYmUgcGFydCBvZiB0aGUgcmVzdWx0aW5nIHByb2Nlc3MgYWZ0ZXIgaW50ZXJwcmV0YXRpb24uPC9saT4KLTwvdWw+Ci08L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci08ZGl2PjxkaXYgY2xhc3M9InJlbGNvbmNlcHRzIj48c3Ryb25nPlJlbGF0ZWQgY29uY2VwdHM8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0idmFyaWFiaWxpdHlhc3NvY2lhdGlvbnMuaHRtbCN2YXJpYWJpbGl0eWFzc29jaWF0aW9ucyI+VmFyaWFiaWxpdHkgQXNzb2NpYXRpb25zPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJjb250cmlidXRlcy5odG1sIj5Db250cmlidXRlczwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0icmVwbGFjZS5odG1sI3JlcGxhY2VzIj5SZXBsYWNlczwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iZXh0ZW5kcy5odG1sI2V4dGVuZHMiPkV4dGVuZHM8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdmFyaWFiaWxpdHlhc3NvY2lhdGlvbnMuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3ZhcmlhYmlsaXR5YXNzb2NpYXRpb25zLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5YTNkMmEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdmFyaWFiaWxpdHlhc3NvY2lhdGlvbnMuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDE5MiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGh0bWwKLSAgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9InNlY3VyaXR5IiBjb250ZW50PSJwdWJsaWMiIC8+Ci08bWV0YSBuYW1lPSJSb2JvdHMiIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgbmFtZT0iREMuVHlwZSIgY29udGVudD0iY29uY2VwdCIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJWYXJpYWJpbGl0eSBBc3NvY2lhdGlvbnMiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9InZhcmlhYmlsaXR5Lmh0bWwjdmFyaWFiaWxpdHkiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9InZhcmlhYmlsaXR5Lmh0bWwiIC8+Ci08bWV0YSBuYW1lPSJEQy5Gb3JtYXQiIGNvbnRlbnQ9IlhIVE1MIiAvPgotPG1ldGEgbmFtZT0iREMuSWRlbnRpZmllciIgY29udGVudD0idmFyaWFiaWxpdHlhc3NvY2lhdGlvbnMiIC8+Ci08bWV0YSBuYW1lPSJEQy5MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiIC8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4vaWJtZGl0YS5jc3MiIC8+Ci08dGl0bGU+VmFyaWFiaWxpdHkgQXNzb2NpYXRpb25zPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJ2YXJpYWJpbGl0eWFzc29jaWF0aW9ucyI+PGEgbmFtZT0idmFyaWFiaWxpdHlhc3NvY2lhdGlvbnMiPjwhLS0gLS0+PC9hPgotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5WYXJpYWJpbGl0eSBBc3NvY2lhdGlvbnM8L2gxPgotPGRpdj48ZGl2IGNsYXNzPSJwIj5UaGUgZm9sbG93aW5nIHRhYmxlIGxpc3RzIHRoZSBpbmNvbWluZyBhbmQgb3V0Z29pbmcgYXNzb2NpYXRpb25zIGZvciBlYWNoCi1lbGVtZW50IHR5cGUgZm9yIHdoaWNoIHZhcmlhYmlsaXR5IGNhbiBiZSB1c2VkLiBBc3NvY2lhdGlvbnMgYWxzbyBoYXZlIGEgY2FyZGluYWxpdHkKLW9mIHRvLW1hbnkgb3IgdG8tb25lLgotPGRpdiBjbGFzcz0idGFibGVub2JvcmRlciI+PHRhYmxlIGNlbGxwYWRkaW5nPSI0IiBjZWxsc3BhY2luZz0iMCIgc3VtbWFyeT0iIiBmcmFtZT0iYm9yZGVyIiBib3JkZXI9IjEiIHJ1bGVzPSJhbGwiPjx0aGVhZCBhbGlnbj0ibGVmdCI+PHRyIHZhbGlnbj0iYm90dG9tIj48dGggdmFsaWduPSJib3R0b20iIGlkPSJkMGUxNiI+RWxlbWVudCBUeXBlPC90aD4KLTx0aCB2YWxpZ249ImJvdHRvbSIgaWQ9ImQwZTE4Ij5Bc3NvY2lhdGVkIEVsZW1lbnQgVHlwZTwvdGg+Ci08dGggdmFsaWduPSJib3R0b20iIGlkPSJkMGUyMCI+QXNzb2NpYXRpb248L3RoPgotPC90cj4KLTwvdGhlYWQ+Ci08dGJvZHk+PHRyPjx0ZCByb3dzcGFuPSI4IiB2YWxpZ249InRvcCIgaGVhZGVycz0iZDBlMTYgIj5Xb3JrIFByb2R1Y3Q8L3RkPgotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJkMGUxOCAiPmNvbnRhaW5lZCBhcnRpZmFjdHM8L3RkPgotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJkMGUyMCAiPm91dC1tYW55PC90ZD4KLTwvdHI+Ci08dHI+PHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJkMGUxOCAiPmRlbGl2ZXJhYmxlIHBhcnRzPC90ZD4KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iZDBlMjAgIj5vdXQtbWFueTwvdGQ+Ci08L3RyPgotPHRyPjx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iZDBlMTggIj5ndWlkYW5jZTwvdGQ+Ci08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9ImQwZTIwICI+b3V0LW1hbnk8L3RkPgotPC90cj4KLTx0cj48dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9ImQwZTE4ICI+Y29udGFpbmVyIGFydGlmYWN0PC90ZD4KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iZDBlMjAgIj5pbi1vbmU8L3RkPgotPC90cj4KLTx0cj48dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9ImQwZTE4ICI+ZGVsaXZlcmFibGU8L3RkPgotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJkMGUyMCAiPmluLW9uZTwvdGQ+Ci08L3RyPgotPHRyPjx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iZDBlMTggIj5yZXNwb25zaWJsZSByb2xlPC90ZD4KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iZDBlMjAgIj5pbi1vbmU8L3RkPgotPC90cj4KLTx0cj48dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9ImQwZTE4ICI+aW5wdXQgYW5kIG91dHB1dCB0byB0YXNrczwvdGQ+Ci08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9ImQwZTIwICI+aW4tbWFueTwvdGQ+Ci08L3RyPgotPHRyPjx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iZDBlMTggIj5jYXRlZ29yaWVzPC90ZD4KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iZDBlMjAgIj5pbi1tYW55PC90ZD4KLTwvdHI+Ci08dHI+PHRkIHJvd3NwYW49IjQiIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJkMGUxNiAiPlJvbGU8L3RkPgotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJkMGUxOCAiPnJlc3BvbnNpYmxlIGZvciB3b3JrIHByb2R1Y3Q8L3RkPgotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJkMGUyMCAiPm91dC1tYW55PC90ZD4KLTwvdHI+Ci08dHI+PHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJkMGUxOCAiPmd1aWRhbmNlPC90ZD4KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iZDBlMjAgIj5vdXQtbWFueTwvdGQ+Ci08L3RyPgotPHRyPjx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iZDBlMTggIj5wZXJmb3JtZXIgaW4gdGFzazwvdGQ+Ci08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9ImQwZTIwICI+aW4tbWFueTwvdGQ+Ci08L3RyPgotPHRyPjx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iZDBlMTggIj5jYXRlZ29yaWVzPC90ZD4KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iZDBlMjAgIj5pbi1tYW55PC90ZD4KLTwvdHI+Ci08dHI+PHRkIHJvd3NwYW49IjciIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJkMGUxNiAiPlRhc2s8L3RkPgotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJkMGUxOCAiPnByaW1hcnkgcGVyZm9ybWVyIHJvbGU8L3RkPgotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJkMGUyMCAiPm91dC1vbmU8L3RkPgotPC90cj4KLTx0cj48dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9ImQwZTE4ICI+YWRkaXRpb25hbCBwZXJmb3JtZXIgcm9sZXM8L3RkPgotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJkMGUyMCAiPm91dC1tYW55PC90ZD4KLTwvdHI+Ci08dHI+PHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJkMGUxOCAiPmlucHV0IGFuZCBvdXRwdXQgd29yayBwcm9kdWN0czwvdGQ+Ci08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9ImQwZTIwICI+b3V0LW1hbnk8L3RkPgotPC90cj4KLTx0cj48dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9ImQwZTE4ICI+Z3VpZGFuY2U8L3RkPgotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJkMGUyMCAiPm91dC1tYW55PC90ZD4KLTwvdHI+Ci08dHI+PHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJkMGUxOCAiPnN0ZXBzPC90ZD4KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iZDBlMjAgIj5vdXQtbWFueTwvdGQ+Ci08L3RyPgotPHRyPjx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iZDBlMTggIj5jYXRlZ29yaWVzPC90ZD4KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iZDBlMjAgIj5pbi1tYW55PC90ZD4KLTwvdHI+Ci08dHI+PHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJkMGUxOCAiPmRpc2NpcGxpbmU8L3RkPgotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJkMGUyMCAiPmluLW9uZTwvdGQ+Ci08L3RyPgotPHRyPjx0ZCBjb2xzcGFuPSIzIiB2YWxpZ249InRvcCIgaGVhZGVycz0iZDBlMTYgZDBlMTggZDBlMjAgIj5DYXRlZ29yaWVzPC90ZD4KLTwvdHI+Ci08dHI+PHRkIHJvd3NwYW49IjIiIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJkMGUxNiAiPkN1c3RvbSBDYXRlZ29yeTwvdGQ+Ci08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9ImQwZTE4ICI+Y2F0ZWdvcml6ZWQgZWxlbWVudHM8L3RkPgotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJkMGUyMCAiPm91dC1tYW55PC90ZD4KLTwvdHI+Ci08dHI+PHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJkMGUxOCAiPm90aGVyIGN1c3RvbSBjYXRlZ29yaWVzPC90ZD4KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iZDBlMjAgIj5pbi1tYW55PC90ZD4KLTwvdHI+Ci08dHI+PHRkIHJvd3NwYW49IjQiIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJkMGUxNiAiPkRpc2NpcGxpbmU8L3RkPgotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJkMGUxOCAiPmNhdGVnb3JpemVkIHRhc2tzPC90ZD4KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iZDBlMjAgIj5vdXQtbWFueTwvdGQ+Ci08L3RyPgotPHRyPjx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iZDBlMTggIj5yZWZlcmVuY2VkIHdvcmtmbG93IGFjdGl2aXR5PC90ZD4KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iZDBlMjAgIj5vdXQtb25lPC90ZD4KLTwvdHI+Ci08dHI+PHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJkMGUxOCAiPmRpc2NpcGxpbmUgZ3JvdXBpbmc8L3RkPgotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJkMGUyMCAiPmluLW9uZTwvdGQ+Ci08L3RyPgotPHRyPjx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iZDBlMTggIj5jdXN0b20gY2F0ZWdvcmllczwvdGQ+Ci08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9ImQwZTIwICI+aW4tbWFueTwvdGQ+Ci08L3RyPgotPHRyPjx0ZCByb3dzcGFuPSIyIiB2YWxpZ249InRvcCIgaGVhZGVycz0iZDBlMTYgIj5EaXNjaXBsaW5lIEdyb3VwaW5nPC90ZD4KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iZDBlMTggIj5jYXRlZ29yaXplZCBkaXNjaXBsaW5lczwvdGQ+Ci08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9ImQwZTIwICI+b3V0LW1hbnk8L3RkPgotPC90cj4KLTx0cj48dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9ImQwZTE4ICI+Y3VzdG9tIGNhdGVnb3JpZXM8L3RkPgotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJkMGUyMCAiPmluLW1hbnk8L3RkPgotPC90cj4KLTx0cj48dGQgcm93c3Bhbj0iNCIgdmFsaWduPSJ0b3AiIGhlYWRlcnM9ImQwZTE2ICI+RG9tYWluPC90ZD4KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iZDBlMTggIj5jYXRlZ29yaXplZCB3b3JrIHByb2R1Y3RzPC90ZD4KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iZDBlMjAgIj5vdXQtbWFueTwvdGQ+Ci08L3RyPgotPHRyPjx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iZDBlMTggIj5zdWItZG9tYWluczwvdGQ+Ci08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9ImQwZTIwICI+b3V0LW1hbnk8L3RkPgotPC90cj4KLTx0cj48dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9ImQwZTE4ICI+c3VwZXItZG9tYWluczwvdGQ+Ci08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9ImQwZTIwICI+aW4tb25lPC90ZD4KLTwvdHI+Ci08dHI+PHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJkMGUxOCAiPmN1c3RvbSBjYXRlZ29yaWVzPC90ZD4KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iZDBlMjAgIj5pbi1tYW55PC90ZD4KLTwvdHI+Ci08dHI+PHRkIHJvd3NwYW49IjIiIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJkMGUxNiAiPldvcmsgUHJvZHVjdCBUeXBlPC90ZD4KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iZDBlMTggIj5jYXRlZ29yaXplZCB3b3JrIHByb2R1Y3RzPC90ZD4KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iZDBlMjAgIj5vdXQtbWFueTwvdGQ+Ci08L3RyPgotPHRyPjx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iZDBlMTggIj5jdXN0b20gY2F0ZWdvcmllczwvdGQ+Ci08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9ImQwZTIwICI+aW4tbWFueTwvdGQ+Ci08L3RyPgotPHRyPjx0ZCByb3dzcGFuPSIzIiB2YWxpZ249InRvcCIgaGVhZGVycz0iZDBlMTYgIj5Sb2xlIFNldDwvdGQ+Ci08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9ImQwZTE4ICI+Y2F0ZWdvcml6ZWQgcm9sZXM8L3RkPgotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJkMGUyMCAiPm91dC1tYW55PC90ZD4KLTwvdHI+Ci08dHI+PHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJkMGUxOCAiPnJvbGUgc2V0IGdyb3VwaW5nPC90ZD4KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iZDBlMjAgIj5pbi1vbmU8L3RkPgotPC90cj4KLTx0cj48dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9ImQwZTE4ICI+Y3VzdG9tIGNhdGVnb3JpZXM8L3RkPgotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJkMGUyMCAiPmluLW1hbnk8L3RkPgotPC90cj4KLTx0cj48dGQgcm93c3Bhbj0iMiIgdmFsaWduPSJ0b3AiIGhlYWRlcnM9ImQwZTE2ICI+Um9sZSBTZXQgR3JvdXBpbmc8L3RkPgotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJkMGUxOCAiPmNhdGVnb3JpemVkIHJvbGUgc2V0czwvdGQ+Ci08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9ImQwZTIwICI+b3V0LW1hbnk8L3RkPgotPC90cj4KLTx0cj48dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9ImQwZTE4ICI+Y3VzdG9tIGNhdGVnb3JpZXM8L3RkPgotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJkMGUyMCAiPmluLW1hbnk8L3RkPgotPC90cj4KLTx0cj48dGQgY29sc3Bhbj0iMyIgdmFsaWduPSJ0b3AiIGhlYWRlcnM9ImQwZTE2IGQwZTE4IGQwZTIwICI+R3VpZGFuY2U8L3RkPgotPC90cj4KLTx0cj48dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9ImQwZTE2ICI+UHJhY3RpY2U8L3RkPgotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJkMGUxOCAiPmNvbnRlbnQgZWxlbWVudDwvdGQ+Ci08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9ImQwZTIwICI+b3V0LW1hbnk8L3RkPgotPC90cj4KLTx0cj48dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9ImQwZTE2ICI+T3RoZXIgR3VpZGFuY2UgVHlwZXM8L3RkPgotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJkMGUxOCAiPnNlY3Rpb25zIHZpYSBjb250ZW50IGRlc2NyaXB0aW9uczwvdGQ+Ci08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9ImQwZTIwICI+b3V0LW1hbnk8L3RkPgotPC90cj4KLTwvdGJvZHk+Ci08L3RhYmxlPgotPC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotPGRpdj4KLTxkaXYgY2xhc3M9ImZhbWlseWxpbmtzIj4KLTxkaXYgY2xhc3M9InBhcmVudGxpbmsiPjxzdHJvbmc+UGFyZW50IHRvcGljOjwvc3Ryb25nPiA8YSBocmVmPSJ2YXJpYWJpbGl0eS5odG1sIiB0aXRsZT0iVmFyaWFiaWxpdHkgYWxsb3dzIGVsZW1lbnRzIGluIG9uZSBjb250ZW50IHBhY2thZ2UgdG8gaW5mbHVlbmNlIG9yIG1vZGlmeSBlbGVtZW50cyBpbiBvdGhlciBjb250ZW50IHBhY2thZ2VzIHdpdGhvdXQgYWN0dWFsbHkgZGlyZWN0bHkgbW9kaWZ5aW5nIHRoZSBvcmlnaW5hbCBjb250ZW50LiBWYXJpYWJpbGl0eSBlbmFibGVzIGNoYW5nZXMgdG8gdGhlIGNvbnRlbnQgd2hpbGUga2VlcGluZyB0aGUgY2hhbmdlcyBzZXBhcmF0ZSBhbmQgb3B0aW9uYWwuIj5WYXJpYWJpbGl0eTwvYT48L2Rpdj4KLTwvZGl2PgotPGRpdiBjbGFzcz0icmVsY29uY2VwdHMiPjxzdHJvbmc+UmVsYXRlZCBjb25jZXB0czwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJ2YXJpYWJpbGl0eS5odG1sI3ZhcmlhYmlsaXR5IiB0aXRsZT0iVmFyaWFiaWxpdHkgYWxsb3dzIGVsZW1lbnRzIGluIG9uZSBjb250ZW50IHBhY2thZ2UgdG8gaW5mbHVlbmNlIG9yIG1vZGlmeSBlbGVtZW50cyBpbiBvdGhlciBjb250ZW50IHBhY2thZ2VzIHdpdGhvdXQgYWN0dWFsbHkgZGlyZWN0bHkgbW9kaWZ5aW5nIHRoZSBvcmlnaW5hbCBjb250ZW50LiBWYXJpYWJpbGl0eSBlbmFibGVzIGNoYW5nZXMgdG8gdGhlIGNvbnRlbnQgd2hpbGUga2VlcGluZyB0aGUgY2hhbmdlcyBzZXBhcmF0ZSBhbmQgb3B0aW9uYWwuIj5WYXJpYWJpbGl0eTwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC93ZWxjb21lL2NvbmYuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvd2VsY29tZS9jb25mLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGU1ZTZiOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC93ZWxjb21lL2NvbmYuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvd2VsY29tZS9tYy5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC93ZWxjb21lL21jLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDQzNDJjMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC93ZWxjb21lL21jLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3dlbGNvbWUvbWNfdnNfcC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC93ZWxjb21lL21jX3ZzX3AuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZGYxYjA5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3dlbGNvbWUvbWNfdnNfcC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC93ZWxjb21lL21ldGhvZGF1dGhvcmluZy5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvd2VsY29tZS9tZXRob2RhdXRob3JpbmcuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODM4ZGQwNS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC93ZWxjb21lL21ldGhvZGF1dGhvcmluZy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotPGh0bWw+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLQotPGhlYWQ+Ci08dGl0bGU+TWV0aG9kIENvbnRlbnQgQXV0aG9yaW5nIE92ZXJ2aWV3PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5PgotPGgzPk1ldGhvZCBDb250ZW50IEF1dGhvcmluZyBPdmVydmlldzwvaDM+Ci08cD5NZXRob2QgY29udGVudCBkZXNjcmliZXMgcm9sZXMsIHRoZSB0YXNrcyB0aGF0IHRoZXkgcGVyZm9ybSwgdGhlIHdvcmsgcHJvZHVjdHMKLSAgdGhhdCBhcmUgdXNlZCBhbmQgcHJvZHVjZWQgYnkgdGhvc2UgdGFza3MsIGFuZCBzdXBwb3J0aW5nIGd1aWRhbmNlLjwvcD4KLTxwPjxpbWcgc3JjPSJtYy5naWYiPjwvcD4KLTxwPlRoZSBmaWd1cmUgYWJvdmUgZGVwaWN0cyB0eXBpY2FsIHNvdXJjZXMgZm9yIG1ldGhvZCBjb250ZW50LCBhcyB3ZWxsIGFzIGhvdwotICB0aGUgbWV0aG9kIGNvbnRlbnQgaXMgcmVwcmVzZW50ZWQgaW4gRVBGIENvbXBvc2VyLiBNYW55IGRldmVsb3BtZW50IG1ldGhvZHMgYXJlIGRlc2NyaWJlZAotICBpbiBwdWJsaWNhdGlvbnMgc3VjaCBhcyBib29rcywgYXJ0aWNsZXMsIHRyYWluaW5nIG1hdGVyaWFsLCBzdGFuZGFyZHMgYW5kIHJlZ3VsYXRpb25zLAotICBhbmQgb3RoZXIgZm9ybXMgb2YgZG9jdW1lbnRhdGlvbi4gVGhlc2Ugc291cmNlcyB1c3VhbGx5IGRvY3VtZW50IG1ldGhvZHMgYnkKLSAgcHJvdmlkaW5nIHN0ZXAtYnktc3RlcCBleHBsYW5hdGlvbnMgZm9yIGEgcGFydGljdWxhciB3YXkgb2YgYWNoaWV2aW5nIGEgc3BlY2lmaWMKLSAgZGV2ZWxvcG1lbnQgZ29hbCB1bmRlciBnZW5lcmFsIGNpcmN1bXN0YW5jZXMuIFNvbWUgZXhhbXBsZXMgYXJlOiB0cmFuc2Zvcm1pbmcKLSAgYSByZXF1aXJlbWVudHMgZG9jdW1lbnQgaW50byBhbiBhbmFseXNpcyBtb2RlbDsgZGVmaW5pbmcgYW4gYXJjaGl0ZWN0dXJhbCBtZWNoYW5pc20KLSAgYmFzZWQgb24gZnVuY3Rpb25hbCBhbmQgbm9uLWZ1bmN0aW9uYWwgcmVxdWlyZW1lbnRzOyBjcmVhdGluZyBhIHByb2plY3QgcGxhbgotICBmb3IgYSBkZXZlbG9wbWVudCBpdGVyYXRpb247IGRlZmluaW5nIGEgcXVhbGl0eSBhc3N1cmFuY2UgcGxhbiBmb3IgZnVuY3Rpb25hbAotICByZXF1aXJlbWVudHM7IHJlZGVzaWduaW5nIGEgYnVzaW5lc3Mgb3JnYW5pemF0aW9uIGJhc2VkIG9uIGEgbmV3IHN0cmF0ZWdpYyBkaXJlY3Rpb24sCi0gIGFuZCBzbyBvbi48L3A+Ci08cD5FUEYgQ29tcG9zZXIgdGFrZXMgY29udGVudCBzdWNoIGFzIHRoYXQgZGVzY3JpYmVkIGFib3ZlLCBhbmQgc3RydWN0dXJlcyBpdCBpbiBhIHNwZWNpZmljCi0gIHNjaGVtYSBvZiByb2xlcywgd29yayBwcm9kdWN0cywgdGFza3MsIGFuZCBndWlkYW5jZS4gVGhpcyBzY2hlbWEgc3VwcG9ydHMgdGhlCi0gIG9yZ2FuaXphdGlvbiBvZiBsYXJnZSBhbW91bnRzIG9mIGRlc2NyaXB0aW9ucyBmb3IgZGV2ZWxvcG1lbnQgbWV0aG9kcyBhbmQgcHJvY2Vzc2VzLgotICBTdWNoIG1ldGhvZCBjb250ZW50IGFuZCBwcm9jZXNzZXMgZG8gbm90IGhhdmUgdG8gYmUgbGltaXRlZCB0byBzb2Z0d2FyZSBlbmdpbmVlcmluZywKLSAgYnV0IGNhbiBhbHNvIGNvdmVyIG90aGVyIGRlc2lnbiBhbmQgZW5naW5lZXJpbmcgZGlzY2lwbGluZXMgc3VjaCBhcyBtZWNoYW5pY2FsCi0gIGVuZ2luZWVyaW5nLCBidXNpbmVzcyB0cmFuc2Zvcm1hdGlvbiwgc2FsZXMgY3ljbGVzLCBhbmQgc28gb24uPC9wPgotPHA+IFRoZSBFUEYgQ29tcG9zZXIgc2NyZWVuIGNhcHR1cmUgaW4gdGhlIGZpZ3VyZSBhYm92ZSBzaG93cyBob3cgc3VjaCBtZXRob2QgY29udGVudCBlbGVtZW50cwotICBhcmUgb3JnYW5pemVkIGluIHRyZWUgYnJvd3NlcnMgb24gdGhlIGxlZnQuIFRoZXNlIHRyZWUgYnJvd3NlcnMsIHNpbWlsYXIgdG8KLSAgYSBsaWJyYXJ5LCBwcm92aWRlIGRpZmZlcmVudCBpbmRleGVzIG9mIHRoZSBhdmFpbGFibGUgZWxlbWVudHMgZm9yIHJhcGlkIGFjY2Vzcy4KLSAgVGhlIHNjcmVlbiBjYXB0dXJlIHNob3dzIG9uIHRoZSByaWdodCBhbiBleGFtcGxlIG9mIGEgdGFzayBwcmVzZW50YXRpb24uIFRoaXMKLSAgdGFzayBwcmVzZW50YXRpb24gZGVmaW5lcyB0aGUgdGFzayBpbiB0ZXJtcyBvZiBzdGVwcyB0aGF0IG5lZWQgdG8gYmUgcGVyZm9ybWVkCi0gIHRvIGFjaGlldmUgdGhlIHRhc2sncyBwdXJwb3NlLiBZb3UgY2FuIHNlZSB0aGF0IHRoZSB0YXNrIGhhcyB2YXJpb3VzIHJlbGF0aW9uc2hpcHMsCi0gIHN1Y2ggYXMgcmVsYXRpb25zaGlwcyB0byBwZXJmb3JtaW5nIHJvbGVzIGFzIHdlbGwgYXMgd29yayBwcm9kdWN0cyB0aGF0IHNlcnZlCi0gIGFzIGlucHV0cyBhbmQgb3V0cHV0cyB0byB0aGUgdGFzay4gRmluZCBvdXQgbW9yZSBkZXRhaWxzIG9uIHRhc2tzLCByb2xlLCBhbmQKLSAgd29yayBwcm9kdWN0cyBpbiB0aGUgb25saW5lIGhlbHAgPGEgaHJlZj0iaHR0cDovL29yZy5lY2xpcHNlLnVpLmludHJvL3Nob3dIZWxwVG9waWM/aWQ9L29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL21ldGhvZGF1dGhvcmluZ292ZXJ2aWV3Lmh0bWwiPmhlcmU8L2E+LgotICBJbiBhZGRpdGlvbiB0byByb2xlcywgdGFza3MsIGFuZCB3b3JrIHByb2R1Y3RzLCBFUEYgQ29tcG9zZXIgc3VwcG9ydHMgdGhlIGFkZGl0aW9uIG9mCi0gIGd1aWRhbmNlIGVsZW1lbnRzLiBHdWlkYW5jZSBhcmUgc3VwcGxlbWVudGFyeSBmcmVlLWZvcm0gZG9jdW1lbnRhdGlvbiBzdWNoIGFzCi0gIHdoaXRlcGFwZXJzLCBjb25jZXB0IGRlc2NyaXB0aW9ucywgZ3VpZGVsaW5lcywgdGVtcGxhdGVzLCBleGFtcGxlcywgYW5kIHNvIG9uLjwvcD4KLTxwPkVQRiBDb21wb3NlciBwcm92aWRlcyB2YXJpb3VzIGZvcm0tYmFzZWQgZWRpdG9ycyB0byBjcmVhdGUgbmV3IG1ldGhvZCBjb250ZW50IGVsZW1lbnRzLgotICBEb2N1bWVudCB5b3VyIHRhc2ssIHJvbGVzLCB3b3JrIHByb2R1Y3RzLCBhbmQgZ3VpZGFuY2UgZWxlbWVudHMgdXNpbmcgaW50dWl0aXZlCi0gIHJpY2gtdGV4dCBlZGl0b3JzIHRoYXQgYWxsb3cgeW91IHRvIGNvcHkgYW5kIHBhc3RlIHRleHQgZnJvbSBvdGhlciBzb3VyY2VzIHN1Y2gKLSAgYXMgd2ViIHBhZ2VzIG9yIGRvY3VtZW50cy4gVXNlIHNpbXBsZSBkaWFsb2dzIHRvIGVzdGFibGlzaCByZWxhdGlvbnNoaXBzIGJldHdlZW4KLSAgY29udGVudCBlbGVtZW50cy48L3A+Ci08cD5FUEYgQ29tcG9zZXIgb3JnYW5pemVzIGNvbnRlbnQgaW4gcGh5c2ljYWwgY29udGVudCBwYWNrYWdlcyB0aGF0IGFsbG93IHlvdSB0byBtYW5hZ2UKLSAgeW91ciBjb250ZW50IGluIGNvbmZpZ3VyYWJsZSB1bml0cy4gRVBGIENvbXBvc2VyIGFsc28gYWxsb3dzIHlvdSB0byBjYXRlZ29yaXplIHlvdXIgY29udGVudAotICBiYXNlZCBvbiBhIHNldCBvZiBwcmVkZWZpbmVkIGNhdGVnb3JpZXMgKGZvciBleGFtcGxlLCBjYXRlZ29yaXplIHlvdXIgdGFza3MKLSAgaW50byBkZXZlbG9wbWVudCBkaXNjaXBsaW5lcywgb3IgeW91ciB3b3JrIHByb2R1Y3RzIGludG8gZG9tYWlucykgb3IgY3JlYXRlCi0gIHlvdXIgb3duIGNhdGVnb3JpemF0aW9uIHNjaGVtZXMgZm9yIHlvdXIgY29udGVudCB3aXRoIHlvdXIgb3duIHVzZXItZGVmaW5lZAotICBjYXRlZ29yaWVzIHRoYXQgYWxsb3cgeW91IHRvIGluZGV4IGNvbnRlbnQgaW4gYW55IHdheSB5b3Ugd2FudC48L3A+Ci08cD5Gb3IgbW9yZSBkZXRhaWxzIG9uIG1ldGhvZCBjb250ZW50IGF1dGhvcmluZyBzZWUgdGhlIG9ubGluZSBoZWxwOjwvcD4KLTxkaXYgYWxpZ249ImxlZnQiPgotPHVsPgotICA8bGk+PGEgaHJlZj0iaHR0cDovL29yZy5lY2xpcHNlLnVpLmludHJvL3Nob3dIZWxwVG9waWM/aWQ9L29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL21ldGhvZGF1dGhvcmluZ292ZXJ2aWV3Lmh0bWwiPk1ldGhvZAotICAgICAgQXV0aG9yaW5nIE92ZXJ2aWV3PC9hPjwvbGk+Ci08L3VsPgotPC9kaXY+Ci08cD4mbmJzcDs8L3A+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC93ZWxjb21lL292ZXJ2aWV3Lmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC93ZWxjb21lL292ZXJ2aWV3Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzZjkxNDguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvd2VsY29tZS9vdmVydmlldy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTY5ICswLDAgQEAKLTxodG1sPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci0KLTxoZWFkPgotPHRpdGxlPkVjbGlwc2UgUHJvY2VzcyBGcmFtZXdvcmsgQ29tcG9zZXIgT3ZlcnZpZXc8L3RpdGxlPgotPC9oZWFkPgotPGJvZHk+Ci08aDM+SW50cm9kdWN0aW9uIHRvIEVjbGlwc2UgUHJvY2VzcyBGcmFtZXdvcmsgQ29tcG9zZXIgKEVQRiBDb21wb3Nlcik8L2gzPgotPHA+V2VsY29tZSB0byBFY2xpcHNlIFByb2Nlc3MgRnJhbWV3b3JrIENvbXBvc2VyIChFUEYgQ29tcG9zZXIpLiBFUEYgQ29tcG9zZXIgaXMgYSB0b29sIHBsYXRmb3JtIHRoYXQgZW5hYmxlcwotICBwcm9jZXNzIGVuZ2luZWVycyBhbmQgbWFuYWdlcnMgdG8gaW1wbGVtZW50LCBkZXBsb3ksIGFuZCBtYWludGFpbiBwcm9jZXNzZXMKLSAgZm9yIG9yZ2FuaXphdGlvbnMgb3IgaW5kaXZpZHVhbCBwcm9qZWN0cy4gVHlwaWNhbGx5LCB0d28ga2V5IHByb2JsZW1zIG5lZWQgdG8KLSAgYmUgYWRkcmVzc2VkIHRvIHN1Y2Nlc3NmdWxseSBkZXBsb3kgbmV3IHByb2Nlc3Nlcy48L3A+Ci08cD4gRmlyc3QsIGRldmVsb3BtZW50IHRlYW1zIG5lZWQgdG8gYmUgZWR1Y2F0ZWQgb24gdGhlIG1ldGhvZHMgYXBwbGljYWJsZSB0bwotICB0aGUgcm9sZXMgdGhhdCB0aGV5IGFyZSByZXNwb25zaWJsZSBmb3IuIFNvZnR3YXJlIGRldmVsb3BlcnMgdHlwaWNhbGx5IG5lZWQKLSAgdG8KLSAgbGVhcm4KLSAgaG93Ci0gIHRvCi0gIGRvIGFuYWx5c2lzIGFuZCBkZXNpZ24sIHRlc3RlcnMgbmVlZCB0byBsZWFybiBob3cgdG8gdGVzdCBpbXBsZW1lbnRhdGlvbnMgYWdhaW5zdAotICAgcmVxdWlyZW1lbnRzLCBtYW5hZ2VycyBuZWVkIHRvIGxlYXJuIGhvdyB0byBtYW5hZ2UgdGhlIHByb2plY3Qgc2NvcGUgYW5kIGNoYW5nZSwKLQotICBhbmQgc28gb24uIFNvbWUgb3JnYW5pemF0aW9ucyBhc3N1bWUgdGhhdCBkZXZlbG9wZXJzIGltcGxpY2l0bHkga25vdyBob3cgdG8KLSAgIGRvIHN1Y2ggd29yayB3aXRob3V0IGRvY3VtZW50aW5nIHRoZWlyIG1ldGhvZHMsIGJ1dCBtYW55IG9yZ2FuaXphdGlvbnMgd2FudAotCi0gIHRvIGVzdGFibGlzaCBjb21tb24gYW5kIHJlZ3VsYXRlZCBwcmFjdGljZXMsIHRvIGRyaXZlIHNwZWNpZmljIGltcHJvdmVtZW50Ci0gIG9iamVjdGl2ZXMsICBhbmQgdG8gbWVldCBjb21wbGlhbmNlIHN0YW5kYXJkcy48L3A+Ci08cD4gU2Vjb25kLCBkZXZlbG9wbWVudCB0ZWFtcyBuZWVkIHRvIHVuZGVyc3RhbmQgaG93IHRvIGFwcGx5IHRoZXNlIG1ldGhvZHMgdGhyb3VnaG91dAotICBhIGRldmVsb3BtZW50IGxpZmVjeWNsZS4gVGhhdCBpcywgdGhleSBuZWVkIHRvIGRlZmluZSBvciBzZWxlY3QgYSBkZXZlbG9wbWVudAotICBwcm9jZXNzLiBGb3IKLQotICBleGFtcGxlLCByZXF1aXJlbWVudHMgbWFuYWdlbWVudCBtZXRob2RzIGhhdmUgdG8gYmUgYXBwbGllZCBkaWZmZXJlbnRseSBpbgotICBlYXJseSAgcGhhc2VzIG9mIGEgcHJvamVjdCB3aGVyZSB0aGUgZm9jdXMgaXMgb24gZWxpY2l0YXRpb24gb2Ygc3Rha2Vob2xkZXIKLSAgbmVlZHMgYW5kCi0gIHJlcXVpcmVtZW50cyBhbmQgc2NvcGluZyBhIHZpc2lvbiwgdGhhbiBpbiBsYXRlciBwaGFzZXMgd2hlcmUgdGhlIGZvY3VzIGlzCi0gIG9uICBtYW5hZ2luZyByZXF1aXJlbWVudHMgdXBkYXRlcyBhbmQgY2hhbmdlcyBhbmQgcGVyZm9ybWluZyBpbXBhY3QgYW5hbHlzaXMKLSAgb2YKLSAgdGhlc2UgcmVxdWlyZW1lbnRzIGNoYW5nZXMuIFRlYW1zIGFsc28gbmVlZCBjbGVhciB1bmRlcnN0YW5kaW5nIG9mIGhvdyB0aGUKLSAgZGlmZmVyZW50ICB0YXNrcyBvZiB0aGUgbWV0aG9kcyByZWxhdGUgdG8gZWFjaCBvdGhlciwgZm9yIGV4YW1wbGUsIGhvdyB0aGUKLSAgY2hhbmdlIG1hbmFnZW1lbnQKLSAgbWV0aG9kIGltcGFjdHMgdGhlIHJlcXVpcmVtZW50cyBtYW5hZ2VtZW50IG1ldGhvZCBhcyB3ZWxsIGFzIHJlZ3Jlc3Npb24gdGVzdGluZwotICAgbWV0aG9kIHRocm91Z2hvdXQgdGhlIGxpZmVjeWNsZS4gRXZlbiBzZWxmLW9yZ2FuaXppbmcgdGVhbXMgbmVlZCB0byBkZWZpbmUKLSAgYQotICBwcm9jZXNzIHRoYXQgZ2l2ZXMgYXQgbWluaW11bSBzb21lIGd1aWRhbmNlIG9uIGhvdyB0aGUgZGV2ZWxvcG1lbnQgd2lsbCBiZQotICBzY29wZWQgIHRocm91Z2hvdXQgdGhlIGxpZmVjeWNsZSwgd2hlbiBtaWxlc3RvbmVzIHdpbGwgYmUgYWNoaWV2ZWQgYW5kIHZlcmlmaWVkLAotICBhbmQKLSAgc28gb24uIDwvcD4KLTxwPlRvIHRoYXQgZW5kLCBFUEYgQ29tcG9zZXIgaGFzIHR3byBtYWluIHB1cnBvc2VzOiA8L3A+Ci08ZGl2IGFsaWduPSJsZWZ0Ij48dWw+Ci0gIDxsaT5UbyBwcm92aWRlIGEga25vd2xlZGdlIGJhc2Ugb2YgaW50ZWxsZWN0dWFsIGNhcGl0YWwgd2hpY2ggeW91IGNhbiBicm93c2UsCi0gICAgbWFuYWdlIGFuZCBkZXBsb3kuIFRoaXMgY29udGVudCBjYW4gaW5jbHVkZSBleHRlcm5hbGx5IGRldmVsb3BlZCBjb250ZW50LAotICAgIGFuZCwgbW9yZSBpbXBvcnRhbnRseSwgY2FuIGluY2x1ZGUgeW91ciBvd24gY29udGVudCBpbmNsdWRpbmcgb2Ygd2hpdGVwYXBlcnMsCi0gICAgZ3VpZGVsaW5lcywgdGVtcGxhdGVzLCBwcmluY2lwbGVzLCBiZXN0IHByYWN0aWNlcywgaW50ZXJuYWwgcHJvY2VkdXJlcyBhbmQKLSAgICByZWd1bGF0aW9ucywgdHJhaW5pbmcgbWF0ZXJpYWwsIGFuZCBhbnkgb3RoZXIgZ2VuZXJhbCBkZXNjcmlwdGlvbnMgb2YgeW91cgotICAgIG1ldGhvZHMuIFRoaXMga25vd2xlZGdlIGJhc2UgY2FuIHVzZWQgZm9yIHJlZmVyZW5jZSBhbmQgZWR1Y2F0aW9uLiBJdCBhbHNvCi0gICAgZm9ybXMgdGhlIGJhc2lzIGZvciBkZXZlbG9waW5nIHByb2Nlc3NlcyAodGhlIHNlY29uZCBwdXJwb3NlKS4gRVBGIENvbXBvc2VyIGlzIGRlc2lnbmVkCi0gICAgdG8gYmUgYSBjb250ZW50IG1hbmFnZW1lbnQgc3lzdGVtIHRoYXQgcHJvdmlkZXMgYSBjb21tb24gbWFuYWdlbWVudCBzdHJ1Y3R1cmUKLSAgICBhbmQgbG9vayBhbmQgZmVlbCBmb3IgYWxsIG9mIHlvdXIgY29udGVudCwgcmF0aGVyIHRoYW4gYmVpbmcgYSBkb2N1bWVudCBtYW5hZ2VtZW50Ci0gICAgc3lzdGVtIGluIHdoaWNoIHlvdSB3b3VsZCBzdG9yZSBhbmQgYWNjZXNzIGhhcmQgdG8gbWFpbnRhaW4gbGVnYWN5IGRvY3VtZW50cwotICAgIGFsbCBpbiB0aGVpciBvd24gc2hhcGVzIGFuZCBmb3JtYXRzLiBBbGwgY29udGVudCBtYW5hZ2VkIGluIEVQRiBDb21wb3NlciBjYW4gYmUgcHVibGlzaGVkCi0gICAgdG8gaHRtbCBhbmQgZGVwbG95ZWQgdG8gV2ViIHNlcnZlcnMgZm9yIGRpc3RyaWJ1dGVkIHVzYWdlLjxicj4KLSAgPC9saT4KLSAgPGxpPlRvIHByb3ZpZGUgcHJvY2VzcyBlbmdpbmVlcmluZyBjYXBhYmlsaXRpZXMgYnkgc3VwcG9ydGluZyBwcm9jZXNzIGVuZ2luZWVycwotICAgIGFuZCBwcm9qZWN0IG1hbmFnZXJzIGluIHNlbGVjdGluZywgdGFpbG9yaW5nLCBhbmQgcmFwaWRseSBhc3NlbWJsaW5nIHByb2Nlc3NlcwotICAgIGZvciB0aGVpciBjb25jcmV0ZSBkZXZlbG9wbWVudCBwcm9qZWN0cy4gRVBGIENvbXBvc2VyIHByb3ZpZGVzIGNhdGFsb2dzIG9mIHByZS1kZWZpbmVkCi0gICAgcHJvY2Vzc2VzIGZvciB0eXBpY2FsIHByb2plY3Qgc2l0dWF0aW9ucyB0aGF0IGNhbiBiZSBhZGFwdGVkIHRvIGluZGl2aWR1YWwKLSAgICBuZWVkcy4gSXQgYWxzbyBwcm92aWRlcyBwcm9jZXNzIGJ1aWxkaW5nIGJsb2NrcywgY2FsbGVkIGNhcGFiaWxpdHkgcGF0dGVybnMsCi0gICAgdGhhdCByZXByZXNlbnQgYmVzdCBkZXZlbG9wbWVudCBwcmFjdGljZXMgZm9yIHNwZWNpZmljIGRpc2NpcGxpbmVzLCB0ZWNobm9sb2dpZXMsCi0gICAgb3IgbWFuYWdlbWVudCBzdHlsZXMuIFRoZXNlIGJ1aWxkaW5nIGJsb2NrcyBmb3JtIGEgdG9vbGtpdCBmb3IgcXVpY2sgYXNzZW1ibHkKLSAgICBvZiBwcm9jZXNzZXMgYmFzZWQgb24gcHJvamVjdC1zcGVjaWZpYyBuZWVkcy4gRVBGIENvbXBvc2VyIGFsc28gYWxsb3dzIHlvdSB0byBzZXQgdXAKLSAgICB5b3VyIG93biBvcmdhbml6YXRpb24tc3BlY2lmaWMgY2FwYWJpbGl0eSBwYXR0ZXJuIGxpYnJhcmllcy4gRmluYWxseSwgdGhlCi0gICAgcHJvY2Vzc2VzIGNyZWF0ZWQgd2l0aCBFUEYgQ29tcG9zZXIgY2FuIGJlIHB1Ymxpc2hlZCBhbmQgZGVwbG95ZWQgYXMgV2ViIHNpdGVzLjwvbGk+Ci08L3VsPgotPC9kaXY+Ci08aDM+RWNsaXBzZSBQcm9jZXNzIEZyYW1ld29yayBDb21wb3NlcidzIEtleSBDYXBhYmlsaXRpZXM8L2gzPgotPHA+RWNsaXBzZSBQcm9jZXNzIEZyYW1ld29yayBDb21wb3NlciBwcm92aWRlcyB0aGUgZm9sbG93aW5nIG5ldyBrZXkgY2FwYWJpbGl0aWVzOjwvcD4KLSAgPGRpdiBhbGlnbj0ibGVmdCI+Ci08dWw+Ci0gIDxsaT4gUHJvdmlkZXMgY29tcGxldGVseSByZWRlc2lnbmVkIHRvb2xzIGZvciBhdXRob3JpbmcsIGNvbmZpZ3VyaW5nLCB2aWV3aW5nLAotICAgIGFuZCBwdWJsaXNoaW5nIGRldmVsb3BtZW50IHByb2Nlc3Nlcy48L2xpPgotICA8bGk+IFByb3ZpZGVzIGp1c3QtaW4tdGltZSBnZW5lcmF0aW9uIG9mIHB1YmxpY2F0aW9uIHByZXZpZXdzIGluIGRlZGljYXRlZCBicm93c2luZwotICAgIHBlcnNwZWN0aXZlIHRoYXQgYWxsb3dzIHJhcGlkIGNvbmZpZ3VyYXRpb24gc3dpdGNoaW5nLjwvbGk+Ci0gIDxsaT4gTWFuYWdlcyBtZXRob2QgY29udGVudCB1c2luZyBzaW1wbGUgZm9ybS1iYXNlZCB1c2VyIGludGVyZmFjZXMuIFRoZXJlZm9yZSwKLSAgICBVTUwgbW9kZWxpbmcgc2tpbGxzIGFyZSBubyBsb25nZXIgcmVxdWlyZWQuPC9saT4KLSAgPGxpPiBQcm92aWRlcyBpbnR1aXRpdmUgcmljaCB0ZXh0IGVkaXRvcnMgZm9yIGNyZWF0aW5nIGlsbHVzdHJhdGl2ZSBjb250ZW50Ci0gICAgZGVzY3JpcHRpb25zLiBFZGl0b3JzIGFsbG93IHVzZSBvZiBzdHlsZXMsIGltYWdlcywgdGFibGVzLCBoeXBlcmxpbmtzLCBhbmQKLSAgICBkaXJlY3QgaHRtbCBlZGl0aW5nLjwvbGk+Ci0gIDxsaT5BbGxvd3MgY3JlYXRpbmcgcHJvY2Vzc2VzIHdpdGggYnJlYWtkb3duIHN0cnVjdHVyZSBlZGl0b3JzIGFuZCB3b3JrZmxvdwotICAgIGRpYWdyYW1zIHRocm91Z2ggdXNlIG9mIG11bHRpLXByZXNlbnRhdGlvbiBwcm9jZXNzIGVkaXRvcnMuIEJyZWFrZG93biBzdHJ1Y3R1cmUKLSAgICBlZGl0b3Igc3VwcG9ydHMgZGlmZmVyZW50IHByb2Nlc3Mgdmlld3M6IHdvcmstYnJlYWtkb3duIHZpZXcsIHdvcmsgcHJvZHVjdAotICAgIHVzYWdlIHZpZXcsIGFuZCB0ZWFtIGFsbG9jYXRpb24gdmlldy4gRVBGIENvbXBvc2VyIGF1dG9tYXRpY2FsbHkgc3luY2hyb25pemVzIGFsbCBwcmVzZW50YXRpb25zCi0gICAgd2l0aCBwcm9jZXNzIGNoYW5nZXMuIDwvbGk+Ci0gIDxsaT5Qcm92aWRlcyBzdXBwb3J0IGZvciBtYW55IGFsdGVybmF0aXZlIGxpZmVjeWNsZQotICAgIG1vZGVscy4gRm9yIGV4YW1wbGUsIHdhdGVyZmFsbCwgaW5jcmVtZW50YWwsIG9yIGl0ZXJhdGl2ZSBtb2RlbHMgY2FuIGJlIGNyZWF0ZWQKLSAgICB3aXRoIHRoZSBzYW1lIG92ZXJsYXBwaW5nIG1ldGhvZCBjb250ZW50LjwvbGk+Ci0gIDxsaT5JbXByb3ZlZCByZXVzZSBhbmQgZXh0ZW5zaWJpbGl0eSBjYXBhYmlsaXRpZXMuIFRoZSBwbHVnLWluIG1lY2hhbmlzbXMgZnJvbQotICAgIHBhc3QgdmVyc2lvbnMgaGF2ZSBiZWVuIGV4dGVuZGVkIHRvIHN1cHBvcnQgZXh0ZW5zaW9ucyBmb3IgYnJlYWtkb3duIHN0cnVjdHVyZXMuPC9saT4KLSAgPGxpPlN1cHBvcnRzIHJldXNhYmxlIGR5bmFtaWNhbGx5LWxpbmtlZCBwcm9jZXNzIHBhdHRlcm5zIG9mIGJlc3QgcHJhY3RpY2VzCi0gICAgZm9yIHJhcGlkIHByb2Nlc3MgYXNzZW1ibHkgdmlhIGRyYWctYW5kLWRyb3AuPC9saT4KLTwvdWw+Ci08L2Rpdj4KLTxoMz5LZXkgVGVybWlub2xvZ3kgYW5kIENvbmNlcHRzPC9oMz4KLTxwPlRvIGVmZmVjdGl2ZWx5IHdvcmsgd2l0aCBFUEYgQ29tcG9zZXIsIHlvdSBuZWVkIHRvIHVuZGVyc3RhbmQgYSBmZXcgY29uY2VwdHMKLSAgdGhhdCBhcmUgdXNlZCB0byBvcmdhbml6ZSB0aGUgY29udGVudC4gVGhlIHBhZ2VzIDxhIGhyZWY9Imh0dHA6Ly9vcmcuZWNsaXBzZS51aS5pbnRyby9zaG93SGVscFRvcGljP2lkPS9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9tZXRob2RhdXRob3JpbmdvdmVydmlldy5odG1sIj5NZXRob2QKLSAgQ29udGVudCBBdXRob3JpbmcgT3ZlcnZpZXc8L2E+IGFuZCA8YSBocmVmPSJodHRwOi8vb3JnLmVjbGlwc2UudWkuaW50cm8vc2hvd0hlbHBUb3BpYz9pZD0vb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvcHJvY2Vzc2F1dGhvcmluZ292ZXJ2aWV3Lmh0bWwiPlByb2Nlc3MKLSAgQXV0aG9yaW5nIE92ZXJ2aWV3PC9hPiBjb250YWluIG1vcmUgZGV0YWlsIGFuZCBjb25jcmV0ZSBleGFtcGxlcyBvZiBob3cgdG8gd29yawotICBpbiB0aGUgdG9vbC4gVGhpcyBwYWdlIHByb3ZpZGVzIHlvdSB3aXRoIGEgZ2VuZXJhbCBvdmVydmlldyBvZiB0aGVzZSBjb25jZXB0cy48L3A+Ci08cD5UaGUgbW9zdCBmdW5kYW1lbnRhbCBwcmluY2lwbGUgaW4gRVBGIENvbXBvc2VyIGlzIHRoZSBzZXBhcmF0aW9uIG9mIHJldXNhYmxlIGNvcmUgbWV0aG9kCi0gIGNvbnRlbnQgZnJvbSBpdHMgYXBwbGljYXRpb24gaW4gcHJvY2Vzc2VzLiBUaGlzIGRpcmVjdGx5IHJlbGF0ZXMgYmFjayB0byB0aGUKLSAgdHdvIHB1cnBvc2VzIG9mIEVQRiBDb21wb3NlciBkZXNjcmliZWQgaW4gdGhlIGZpcnN0IHNlY3Rpb24uIEFsbW9zdCBhbGwgb2YgRVBGIENvbXBvc2VyJ3MgY29uY2VwdHMKLSAgYXJlIGNhdGVnb3JpemVkIGFsb25nIHRoaXMgc2VwYXJhdGlvbi4gTWV0aG9kIGNvbnRlbnQgZGVzY3JpYmVzIHdoYXQgaXMgdG8gYmUKLSAgcHJvZHVjZWQsIHRoZSBuZWNlc3Nhcnkgc2tpbGxzIHJlcXVpcmVkIGFuZCB0aGUgc3RlcC1ieS1zdGVwIGV4cGxhbmF0aW9ucyBkZXNjcmliaW5nCi0gIGhvdyBzcGVjaWZpYyBkZXZlbG9wbWVudCBnb2FscyBhcmUgYWNoaWV2ZWQuIFRoZXNlIG1ldGhvZCBjb250ZW50IGRlc2NyaXB0aW9ucwotICBhcmUgaW5kZXBlbmRlbnQgb2YgYSBkZXZlbG9wbWVudCBsaWZlY3ljbGUuIFByb2Nlc3NlcyBkZXNjcmliZSB0aGUgZGV2ZWxvcG1lbnQKLSAgbGlmZWN5Y2xlLiBQcm9jZXNzZXMgdGFrZSB0aGUgbWV0aG9kIGNvbnRlbnQgZWxlbWVudHMgYW5kIHJlbGF0ZSB0aGVtIGludG8gc2VtaS1vcmRlcmVkCi0gIHNlcXVlbmNlcyB0aGF0IGFyZSBjdXN0b21pemVkIHRvIHNwZWNpZmljIHR5cGVzIG9mIHByb2plY3RzLjwvcD4KLTxwPjxpbWcgc3JjPSJ1bWFfaHVtcC5naWYiPjwvcD4KLTxwPlRoZSBmaWd1cmUgYWJvdmUgc2hvd3MgaG93IHRoaXMgc2VwYXJhdGlvbiBpcyBkZXBpY3RlZCBpbiBCYXNpYyBVbmlmaWVkCi0gIFByb2Nlc3MuIE1ldGhvZCBjb250ZW50LCBkZXNjcmliaW5nIGhvdyBkZXZlbG9wbWVudCB3b3JrIGlzIGJlaW5nIHBlcmZvcm1lZCwKLSAgaXMgY2F0ZWdvcml6ZWQgYnkgZGlzY2lwbGluZXMgYWxvbmcgdGhlIHktYXhpcyBvZiB0aGUgZGlhZ3JhbS4gVGhlIHdvcmsgZGVzY3JpYmVkCi0gIGluIGEgcHJvY2VzcyBpcyBzZWVuIGFsb25nIHRoZSB4LWF4aXMgcmVwcmVzZW50aW5nIHRoZSB0aW1lbGluZS4gVGhpcyBpcyB0aGUKLSAgbGlmZWN5Y2xlIG9mIGEgZGV2ZWxvcG1lbnQgcHJvamVjdC4gSXQgZXhwcmVzc2VzIHdoZW4gd2hhdCB3b3JrIHdpbGwgYmUgcGVyZm9ybWVkLgotICBUaGUgZ3JhcGggaW4gdGhlIGlsbHVzdHJhdGlvbiByZXByZXNlbnRzIGFuIGVzdGltYXRlZCB3b3JrbG9hZCBmb3IgZWFjaCBkaXNjaXBsaW5lLgotICBBcyB5b3Ugc2VlLCBmb3IgZXhhbXBsZSwgb25lIG5ldmVyIHN0b3BzIHdvcmtpbmcgb24gcmVxdWlyZW1lbnRzIGluIFJVUCwgYnV0Ci0gIHRoZXJlIGFyZSBjZXJ0YWlubHkgcGVhayB0aW1lcyBpbiB3aGljaCBtb3N0IG9mIHRoZSByZXF1aXJlbWVudHMgZWxpY2l0YXRpb24KLSAgYW5kIGRlc2NyaXB0aW9uIHdvcmsgaXMgcGVyZm9ybWVkLiBUaGVyZSBhcmUgYWxzbyB0aW1lcyBhdCB3aGljaCBhIGRvd253YXJkCi0gIHRyZW5kIG5lZWRzIHRvIGJlIG9ic2VydmVkIHdoZXJlIGZld2VyIGFuZCBmZXdlciByZXF1aXJlbWVudHMgY2hhbmdlcyBoYXZlIHRvCi0gIGJlIHByb2Nlc3NlZCB0byBicmluZyB0aGUgcHJvamVjdCB0byBhIGNsb3NlLiBUaGlzIGF2b2lkcyB3aGF0IGlzIHJlZmVycmVkIHRvCi0gIGFzIGZlYXR1cmUgY3JlZXAgaW4gd2hpY2ggcmVxdWlyZW1lbnRzIHdvcmsgcmVtYWlucyBjb25zdGFudCBvciBldmVuIGluY3JlYXNlcy4KLSAgSGVuY2UsIGEgbGlmZWN5Y2xlIChwcm9jZXNzKSBleHByZXNzZXMgdGhlIHZhcmlhbmNlcyBvZiB3b3JrIHBlcmZvcm1lZCBpbiB0aGUKLSAgdmFyaW91cyBkaXNjaXBsaW5lcyAobWV0aG9kIGNvbnRlbnQpLjwvcD4KLTxwPjxpbWcgc3JjPSJtY192c19wLmdpZiI+PC9wPgotPHA+VGhlIHBpY3R1cmUgYWJvdmUgcHJvdmlkZXMgYSBzdW1tYXJ5IG9mIHRoZSBrZXkgZWxlbWVudHMgdXNlZCBpbiBFUEYgQ29tcG9zZXIgYW5kIGhvdwotICB0aGV5IHJlbGF0ZSB0byBtZXRob2QgY29udGVudCBvciBwcm9jZXNzLiBBcyB5b3Ugc2VlLCBtZXRob2QgY29udGVudCBpcyBwcmltYXJpbHkKLSAgZXhwcmVzc2VkIHVzaW5nIHdvcmsgcHJvZHVjdHMsIHJvbGVzLCB0YXNrcywgYW5kIGd1aWRhbmNlLiBHdWlkYW5jZSwgc3VjaCBhcwotICBjaGVja2xpc3RzLCBleGFtcGxlcywgb3Igcm9hZG1hcHMsIGNhbiBhbHNvIGJlIGRlZmluZWQgdG8gcHJvdmlkZSBleGVtcGxhcnkKLSAgd2Fsa3Rocm91Z2hzIG9mIGEgcHJvY2Vzcy4gT24gdGhlIHJpZ2h0LWhhbmQgc2lkZSBvZiB0aGUgZGlhZ3JhbSwgeW91IHNlZSB0aGUKLSAgZWxlbWVudHMgdXNlZCB0byByZXByZXNlbnQgcHJvY2Vzc2VzIGluIEVQRiBDb21wb3Nlci4gVGhlIG1haW4gZWxlbWVudCBpcyB0aGUgYWN0aXZpdHkKLSAgdGhhdCBjYW4gYmUgbmVzdGVkIHRvIGRlZmluZSBicmVha2Rvd24gc3RydWN0dXJlcyBhcyB3ZWxsIGFzIHJlbGF0ZWQgdG8gZWFjaAotICBvdGhlciB0byBkZWZpbmUgYSBmbG93IG9mIHdvcmsuIEFjdGl2aXRpZXMgYWxzbyBjb250YWluIGRlc2NyaXB0b3JzIHRoYXQgcmVmZXJlbmNlCi0gIG1ldGhvZCBjb250ZW50LiBBY3Rpdml0aWVzIGFyZSB1c2VkIHRvIGRlZmluZSBwcm9jZXNzZXMgb2Ygd2hpY2ggRVBGIENvbXBvc2VyIHN1cHBvcnQKLSAgdHdvIG1haW4ga2luZHM6IGRlbGl2ZXJ5IHByb2Nlc3NlcyBhbmQgY2FwYWJpbGl0eSBwYXR0ZXJucy4gRGVsaXZlcnkgcHJvY2Vzc2VzCi0gIHJlcHJlc2VudCBhIGNvbXBsZXRlIGFuZCBpbnRlZ3JhdGVkIHByb2Nlc3MgdGVtcGxhdGUgZm9yIHBlcmZvcm1pbmcgb25lIHNwZWNpZmljCi0gIHR5cGUgb2YgcHJvamVjdC4gVGhleSBkZXNjcmliZSBhIGNvbXBsZXRlIGVuZC10by1lbmQgcHJvamVjdCBsaWZlY3ljbGUgYW5kIGFyZQotICB1c2VkIGFzIGEgcmVmZXJlbmNlIGZvciBydW5uaW5nIHByb2plY3RzIHdpdGggc2ltaWxhciBjaGFyYWN0ZXJpc3RpY3MuIENhcGFiaWxpdHkKLSAgcGF0dGVybnMgYXJlIHByb2Nlc3NlcyB0aGF0IGV4cHJlc3MgYW5kIGNvbW11bmljYXRlIHByb2Nlc3Mga25vd2xlZGdlIGZvciBhCi0gIGtleSBhcmVhIG9mIGludGVyZXN0IHN1Y2ggYXMgYSBkaXNjaXBsaW5lIG9yIGEgYmVzdCBwcmFjdGljZS4gVGhleSBhcmUgYWxzbwotICB1c2VkIGFzIGJ1aWxkaW5nIGJsb2NrcyB0byBhc3NlbWJsZSBkZWxpdmVyeSBwcm9jZXNzZXMgb3IgbGFyZ2VyIGNhcGFiaWxpdHkKLSAgcGF0dGVybnMuIFRoaXMgZW5zdXJlcyBvcHRpbWFsIHJldXNlIGFuZCBhcHBsaWNhdGlvbiBvZiB0aGVpciBrZXkgYmVzdCBwcmFjdGljZXMKLSAgaW4gcHJvY2VzcyBhdXRob3JpbmcgYWN0aXZpdGllcyBpbiBFUEYgQ29tcG9zZXIuIDwvcD4KLQotPHA+Rm9yIG1vcmUgZGV0YWlscyBvbiBFY2xpcHNlIFByb2Nlc3MgRnJhbWV3b3JrIENvbXBvc2VyLCBzZWUgdGhlIG9ubGluZSBoZWxwOjwvcD4KLTxkaXYgYWxpZ249ImxlZnQiPgotPHVsPgotICA8bGk+PGEgaHJlZj0iaHR0cDovL29yZy5lY2xpcHNlLnVpLmludHJvL3Nob3dIZWxwVG9waWM/aWQ9L29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2Fib3V0ZXBmY29tcG9zZXIuaHRtbCI+T3ZlcnZpZXc8L2E+PC9saT4KLSAgPGxpPjxhIGhyZWY9Imh0dHA6Ly9vcmcuZWNsaXBzZS51aS5pbnRyby9zaG93SGVscFRvcGljP2lkPS9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9zdGFuZGFyZG1ldGhvZGxpYnJhcnlvdmVydmlldy5odG1sIj5HZXR0aW5nCi0gICAgICBTdGFydGVkPC9hPjwvbGk+Ci08L3VsPgotPC9kaXY+Ci08cD48L3A+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC93ZWxjb21lL3AuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvd2VsY29tZS9wLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2I4Njg4Ny4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC93ZWxjb21lL3AuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvd2VsY29tZS9wcm9jZXNzYXV0aG9yaW5nLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC93ZWxjb21lL3Byb2Nlc3NhdXRob3JpbmcuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDM4NDIyZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC93ZWxjb21lL3Byb2Nlc3NhdXRob3JpbmcuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLTxodG1sPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci0KLTxoZWFkPgotPHRpdGxlPlByb2Nlc3MgQXV0aG9yaW5nIE92ZXJ2aWV3PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5PgotPGgzPlByb2Nlc3MgQXV0aG9yaW5nIE92ZXJ2aWV3PC9oMz4KLTxwPkEgZGV2ZWxvcG1lbnQgcHJvY2VzcyBkZWZpbmVzIHNlcXVlbmNlcyBvZiB0YXNrcyBwZXJmb3JtZWQgYnkgcm9sZXMgYW5kIHdvcmsKLSAgcHJvZHVjdHMgcHJvZHVjZWQgb3ZlciB0aW1lLjwvcD4KLTxwPjxpbWcgc3JjPSJwLmdpZiI+PC9wPgotPHA+VGhlIGZpZ3VyZSBhYm92ZSBzaG93cyB0aGF0IHByb2Nlc3NlcyBhcmUgdHlwaWNhbGx5IGV4cHJlc3NlZCBhcyB3b3JrZmxvd3MKLSAgb3IgYnJlYWtkb3duIHN0cnVjdHVyZXMuIERlZmluaW5nIGEgc3RyaWN0IHNlcXVlbmNlIGFzIGluIGEgd2F0ZXJmYWxsIG1vZGVsCi0gIGlzIGFzIG11Y2ggYSBwcm9jZXNzIGFzIGRlZmluaW5nIHNlbWktb3JkZXJlZCBzZXF1ZW5jZXMgaW4gaXRlcmF0aW9ucyBvZiBwYXJhbGxlbAotICB3b3JrLiBUaGV5IGp1c3QgcmVwcmVzZW50IGRpZmZlcmVudCBkZXZlbG9wbWVudCBhcHByb2FjaGVzLiBIZW5jZSwgZm9yIGRlZmluaW5nCi0gIGEgcHJvY2Vzcywgb25lIGNhbiB0YWtlIG1ldGhvZCBjb250ZW50IGFuZCBjb21iaW5lIGl0IGludG8gc3RydWN0dXJlcyB0aGF0IHNwZWNpZnkKLSAgaG93IHRoZSB3b3JrIHNoYWxsIGJlIG9yZ2FuaXplZCBvdmVyIHRpbWUsIHRvIG1lZXQgdGhlIG5lZWRzIG9mIGEgcGFydGljdWxhcgotICB0eXBlIG9mIGRldmVsb3BtZW50IHByb2plY3QgKHN1Y2ggYXMgc29mdHdhcmUgZm9yIGEgb25saW5lIHN5c3RlbSB2ZXJzdXMgc29mdHdhcmUKLSAgYW5kIGhhcmR3YXJlIGZvciBhbiBlbWJlZGRlZCBzeXN0ZW0pLiBFUEYgQ29tcG9zZXIgc3VwcG9ydHMgcHJvY2Vzc2VzIGJhc2VkIG9uIGRpZmZlcmVudAotICBkZXZlbG9wbWVudCBhcHByb2FjaGVzIGFjcm9zcyBtYW55IGRpZmZlcmVudCBsaWZlY3ljbGUgbW9kZWxzLCBpbmNsdWRpbmcgd2F0ZXJmYWxsLAotICBpbmNyZW1lbnRhbCwgYW5kIGl0ZXJhdGl2ZSBsaWZlY3ljbGVzLiBFUEYgQ29tcG9zZXIgYWxzbyBzdXBwb3J0cyBkaWZmZXJlbnQgcHJlc2VudGF0aW9ucwotICBmb3IgcHJvY2Vzcywgc3VjaCBhcyB3b3JrLWJyZWFrZG93biBzdHJ1Y3R1cmUgb3Igd29ya2Zsb3cgcHJlc2VudGF0aW9ucy4gWW91Ci0gIGNhbiBhbHNvIGRlZmluZSBwcm9jZXNzZXMgaW4gRVBGIENvbXBvc2VyIHRoYXQgdXNlIGEgbWluaW1hbCBzZXQgb2YgbWV0aG9kIGNvbnRlbnQgdG8KLSAgZGVmaW5lIHByb2Nlc3NlcyBmb3IgYWdpbGUsIHNlbGYtb3JnYW5pemluZyB0ZWFtcy48L3A+Ci08cD4gVGhlIEVQRiBDb21wb3NlciBzY3JlZW4gY2FwdHVyZSBhYm92ZSBzaG93cyBhbiBleGFtcGxlIG9mIGEgcHJvY2VzcyBwcmVzZW50ZWQgYXMgYQotICBicmVha2Rvd24gc3RydWN0dXJlIG9mIG5lc3RlZCBhY3Rpdml0aWVzIGFzIHdlbGwgYXMgYSB3b3JrZmxvdyBvciBhY3Rpdml0eSBkaWFncmFtCi0gIGZvciBvbmUgcGFydGljdWxhciBhY3Rpdml0eSwgdGhlIGluY2VwdGlvbiBwaGFzZS4gSXQgYWxzbyBpbmRpY2F0ZXMgd2l0aCB0aGUKLSAgdHdvIGJsdWUgYXJyb3dzIHRoYXQgdGhlIHBhcnRpY3VsYXIgbWV0aG9kIGNvbnRlbnQgdGFzayAmcXVvdDtEZXRhaWwgYSBVc2UgQ2FzZSZxdW90OwotICBoYXMgYmVlbiBhcHBsaWVkIGluIHRoZSBwcm9jZXNzIHR3aWNlOyBmaXJzdGx5IGluIHRoZSBpbmNlcHRpb24gcGhhc2UgdW5kZXIKLSAgdGhlIGFjdGl2aXR5ICZxdW90O0RlZmluZSB0aGUgU3lzdGVtLCZxdW90OyBhbmQgc2Vjb25kbHksIGluIHRoZSBlbGFib3JhdGlvbgotICBwaGFzZSBpbiB0aGUgYWN0aXZpdHkgJnF1b3Q7UmVmaW5lIHRoZSBzeXN0ZW0gZGVmaW5pdGlvbiZxdW90Oy4gWW91IHNlZSBiZWxvdwotICBlYWNoIG9mIHRoZXNlIHRhc2sgYXBwbGljYXRpb25zLCByZWZlcnJlZCB0byBhcyBhIHRhc2sgZGVzY3JpcHRvcnMgaW4gRVBGIENvbXBvc2VyLCBsaXN0cwotICBvZiB0aGUgcGVyZm9ybWluZyByb2xlcyBhcyB3ZWxsIGFzIHRoZSBpbnB1dCBhbmQgb3V0cHV0IHdvcmsgcHJvZHVjdHMuIElmIHlvdQotICBsb29rIGNsb3NlbHksIHlvdSBzZWUgdGhhdCB0aGVzZSBsaXN0cyBhcmUgZGlmZmVyZW50IGZvciBlYWNoIG9mIHRoZXNlIHR3byB0YXNrCi0gIGRlc2NyaXB0b3JzLCBleHByZXNzaW5nIGRpZmZlcmVuY2VzIGluIHBlcmZvcm1pbmcgdGhlICZxdW90O0RldGFpbCBhIFVzZSBDYXNlJnF1b3Q7Ci0gIG1ldGhvZCB0aHJvdWdob3V0IHRoZSBsaWZlY3ljbGUuIFlvdSBzZWUgZGlmZmVyZW50IHJvbGVzIGludm9sdmVkIGFuZCBjaGFuZ2VzCi0gIGluIHRoZSBsaXN0IG9mIGlucHV0cyB0byBiZSBjb25zaWRlcmVkIGFuZCBvdXRwdXRzIHRvIGJlIHByb2R1Y2VkIG9yIHVwZGF0ZWQuCi0gIFRoZXNlIGNoYW5nZXMgd2VyZSBkZWZpbmVkIGJ5IHRoZSBhdXRob3IgdGhhdCBjcmVhdGVkIHRoaXMgcHJvY2VzcyB0byBleHByZXNzCi0gIHRoZSBleGFjdCBmb2N1cyBvZiB0aGUgdGFzayBwZXJmb3JtYW5jZSBmb3IgZWFjaCBvY2N1cnJlbmNlLiBJbiBhZGRpdGlvbiB0bwotICB1cGRhdGluZyB0aGUgcm9sZXMsIGlucHV0IGFuZCBvdXRwdXQgd29yayBwcm9kdWN0cyBmb3IgYSB0YXNrIGRlc2NyaXB0b3IsIHlvdQotICBjYW4gYWxzbyBwcm92aWRlIGFkZGl0aW9uYWwgdGV4dHVhbCBkZXNjcmlwdGlvbnMgYXMgd2VsbCBhcyBkZWZpbmUgdGhlIGV4YWN0Ci0gIHN0ZXBzIG9mIHRoZSB0YXNrIHRoYXQgc2hvdWxkIGFuZCBzaG91bGQgbm90IGJlIHBlcmZvcm1lZCBmb3IgdGhpcyBwYXJ0aWN1bGFyCi0gIG9jY3VycmVuY2Ugb2YgdGhlIHRhc2suPC9wPgotPHA+RVBGIENvbXBvc2VyIHByb3ZpZGVzIHlvdSB3aXRoIGEgcHJvY2VzcyBlZGl0b3IgdGhhdCBzdXBwb3J0cyBkaWZmZXJlbnQgYnJlYWtkb3duIHN0cnVjdHVyZQotICB2aWV3cyBhcyB3ZWxsIGFzIGdyYXBoaWNhbCBwcm9jZXNzIHByZXNlbnRhdGlvbnMuIEFzIGEgcHJvY2VzcyBhdXRob3IsIHlvdSB0eXBpY2FsbHkKLSAgc3RhcnQgYnkgY3JlYXRpbmcgYW4gYWN0aXZpdHkgYnJlYWtkb3duLCBkaXZpZGluZyBhbmQgYnJlYWtpbmcgeW91ciBwcm9jZXNzCi0gIGRvd24gaW50byBwaGFzZXMsIGl0ZXJhdGlvbnMsIGFuZCBoaWdoLWxldmVsIGFjdGl2aXRpZXMuIEluc3RlYWQgb2YgY3JlYXRpbmcKLSAgeW91ciBhY3Rpdml0aWVzIGluIHRoZSBicmVha2Rvd24gc3RydWN0dXJlIGVkaXRvciwgeW91IGNhbiBhbHRlcm5hdGl2ZWx5IHdvcmsKLSAgaW4gYSBncmFwaGljYWwgYWN0aXZpdHkgZGlhZ3JhbSBlZGl0b3IgdGhhdCBhbGxvd3MgeW91IHRvIGdyYXBoaWNhbGx5IGNyZWF0ZQotICBhIHdvcmtmbG93IGZvciB5b3VyIGFjdGl2aXRpZXMuIFRvIGFzc2lnbiBtZXRob2QgY29udGVudCB0byB5b3VyIHByb2Nlc3MsIHlvdQotICB0aGVuIGhhdmUgdGhlIGNob2ljZSBvZiB3b3JraW5nIGluIGRpZmZlcmVudCBwcm9jZXNzIHZpZXdzICh3b3JrIGJyZWFrZG93biBzdHJ1Y3R1cmUsCi0gIHdvcmsgcHJvZHVjdCB1c2FnZSwgb3IgdGVhbSBhbGxvY2F0aW9uIHZpZXcpLiBFYWNoIHZpZXcgc3VwcG9ydHMgYSBkaWZmZXJlbnQKLSAgYXBwcm9hY2ggZm9yIGNyZWF0aW5nIGEgcHJvY2Vzcy4gWW91IGNhbiBkZWZpbmUgdGhlIHdvcmsgdG8gYmUgZG9uZSwgZGVmaW5lCi0gIHRoZSByZXN1bHRzIHRvIGJlIHByb2R1Y2VkLCBvciBkZWZpbmUgcmVzcG9uc2liaWxpdGllcyBmb3IgeW91ciByb2xlcy4gSWYgcmVxdWVzdGVkLAotICB0aGUgZWRpdG9yIHVwZGF0ZXMgdGhlIG90aGVyIHByb2Nlc3Mgdmlld3Mgc2VtaS1hdXRvbWF0aWNhbGx5IHVzaW5nIHdpemFyZHMKLSAgdGhhdCBwcm9tcHQgeW91IGZvciBkZWNpc2lvbnMgb24gc2VsZWN0aW5nIG1ldGhvZCBjb250ZW50IGVsZW1lbnRzLjwvcD4KLTxwPkZvciBtb3JlIGRldGFpbHMgb24gcHJvY2VzcyBhdXRob3Jpbmcgc2VlIHRoZSBvbmxpbmUgaGVscDo8L3A+Ci08ZGl2IGFsaWduPSJsZWZ0Ij4KLTx1bD4KLSAgPGxpPjxhIGhyZWY9Imh0dHA6Ly9vcmcuZWNsaXBzZS51aS5pbnRyby9zaG93SGVscFRvcGljP2lkPS9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9wcm9jZXNzYXV0aG9yaW5nb3ZlcnZpZXcuaHRtbCI+UHJvY2VzcwotICBBdXRob3JpbmcgT3ZlcnZpZXc8L2E+PC9saT4KLTwvdWw+Ci08L2Rpdj4KLTxwPiZuYnNwOzwvcD4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3dlbGNvbWUvcHViLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3dlbGNvbWUvcHViLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDcyNTQ3NC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC93ZWxjb21lL3B1Yi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC93ZWxjb21lL3B1Ymxpc2hpbmcuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3dlbGNvbWUvcHVibGlzaGluZy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MGI4YzFjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3dlbGNvbWUvcHVibGlzaGluZy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotPGh0bWw+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLQotPGhlYWQ+Ci08dGl0bGU+Q29uZmlndXJhdGlvbiBhbmQgUHVibGlzaGluZzwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keT4KLTxoMz5NZXRob2QgQ29uZmlndXJhdGlvbnMgT3ZlcnZpZXc8L2gzPgotPHA+RWNsaXBzZSBQcm9jZXNzIEZyYW1ld29yayBDb21wb3NlciBzaGlwcyB3aXRoIGEgbG90IG9mIGNvbnRlbnQgb3V0IG9mIHRoZSBib3guIEl0IGluY2x1ZGVzCi0gIHRoZSBPcGVuIFVuaWZpZWQgUHJvY2VzcyAoT3BlblVQKSBmcmFtZXdvcmsgYW5kIHZhcmlvdXMgcGx1Zy1pbnMgZXh0ZW5kaW5nCi0gIE9wZW5VUC9CYXNpYyB3aXRoIGRvbWFpbi1zcGVjaWZpYyBhZGRpdGlvbnMuIE5vIG9yZ2FuaXphdGlvbiBvciBwcm9qZWN0IHJlcXVpcmVzIGFsbCBvZiB0aGlzCi0gIGRvY3VtZW50YXRpb24gYWxsIGF0IG9uY2UsIGJ1dCB3b3VsZCB3b3JrIHdpdGggYSBzZWxlY3Rpb24gb2Ygc3BlY2lmaWMgc3Vic2V0cy48L3A+Ci08cD4gRWNsaXBzZSBQcm9jZXNzIEZyYW1ld29yayBDb21wb3NlciAoRVBGIENvbXBvc2VyKSBtYW5hZ2VzIGZvciB0aGF0IHB1cnBvc2Ugc28tY2FsbGVkIG1ldGhvZAotICBjb25maWd1cmF0aW9ucywgd2hpY2ggYWxsb3cgeW91IHRvIHNwZWNpZnkgd29ya2luZyBzZXRzIG9mIGNvbnRlbnQgYW5kIHByb2Nlc3NlcwotICBmb3IgYSBzcGVjaWZpYyBjb250ZXh0LCBzdWNoIGFzIGEgc3BlY2lmaWMgdmFyaWFudCBvZiB0aGUgUlVQIGZyYW1ld29yayB0aGF0Ci0gIHlvdSB3YW50IHRvIHB1Ymxpc2ggYW5kIGRlcGxveSBmb3IgYSBnaXZlbiBzb2Z0d2FyZSBwcm9qZWN0IG9yIGFzIGEgZm91bmRhdGlvbgotICBmb3IgYSBkZXZlbG9wbWVudCBvcmdhbml6YXRpb24uIEFsbCBjb250ZW50IGFuZCBwcm9jZXNzZXMgaW4gRVBGIENvbXBvc2VyIGFyZSBvcmdhbml6ZWQKLSAgaW4gbWV0aG9kIHBsdWctaW5zLCB3aGljaCBhcmUgb3JnYW5pemVkIGludG8gbWV0aG9kIHBhY2thZ2VzLiBBIG1ldGhvZCBjb25maWd1cmF0aW9uCi0gIGlzIHNpbXBseSBhIHNlbGVjdGlvbiBvZiB0aGUgbWV0aG9kIHBsdWctaW5zIGFuZCBwYWNrYWdlcy48L3A+Ci08cD48aW1nIHNyYz0iY29uZi5naWYiPjwvcD4KLTxwPllvdSBjcmVhdGUgYW5kIHNwZWNpZnkgYSBjb25maWd1cmF0aW9uIHVzaW5nIHRoZSBjb25maWd1cmF0aW9uIGVkaXRvciBkZXBpY3RlZAotICBpbiB0aGUgZmlndXJlIGFib3ZlLiBZb3UgY291bGQgc3RhcnQgY3JlYXRpbmcgeW91ciBvd24gbWV0aG9kIGNvbmZpZ3VyYXRpb24KLSAgYnkgY29weWluZyBvbmUgb2YgdGhlIGNvbmZpZ3VyYXRpb25zIHRoYXQgc2hpcCB3aXRoIEVQRiBDb21wb3NlciBhbmQgbW9kaWZ5IGl0IHRvIGZpdAotICB5b3VyIHNwZWNpZmljIG5lZWRzLiBZb3UgY2FuIGFkZCBvciByZW1vdmUgd2hvbGUgbWV0aG9kIHBsdWctaW5zIGFzIHdlbGwgYXMKLSAgbWFrZSBzZWxlY3Rpb24gd2l0aCBlYWNoIHBsdWctaW4gYnkgY2hlY2tpbmcgb3IgdW4tY2hlY2tpbmcgcGFja2FnZXMuIDwvcD4KLTxwPiBZb3UgY2FuIHVzZSB0aGUgcmVzdWx0aW5nIGNvbmZpZ3VyYXRpb24gYXMgeW91ciB3b3JraW5nIHNldCBmb3IgeW91ciBFUEYgQ29tcG9zZXIKLSAgd29yay4gVGhlIGFjdHVhbCBjb250ZW50IG9mIHRoZSBjb25maWd1cmF0aW9uLCBpLmUuIHRoZSBpbmNsdWRlZCBtZXRob2QgY29udGVudAotICBhbmQgcHJvY2VzcyBlbGVtZW50cyBhcmUgYWx3YXlzIGFjY2Vzc2libGUgaW4gdGhlIENvbmZpZ3VyYXRpb24gdmlldy4gVXNlIHRoZQotICBjb21ibyBib3ggaW4gdGhlIHRvb2xiYXIgdG8gc2VsZWN0IHRoZSBjdXJyZW50bHkgdXNlZCBtZXRob2QgY29uZmlndXJhdGlvbi48L3A+Ci08aDM+UHVibGlzaGluZyBPdmVydmlldzwvaDM+Ci08cD5NZXRob2QgY29uZmlndXJhdGlvbnMgYXJlIHRoZSBiYXNpcyBmb3IgcHVibGlzaGluZyBtZXRob2QgY29udGVudCBhbmQgcHJvY2Vzc2VzLgotICBBIHB1Ymxpc2hlZCBjb25maWd1cmF0aW9uIGlzIGFuIGh0bWwgV2ViIHNpdGUgdGhhdCBwcmVzZW50cyBhbGwgdGhlIG1ldGhvZAotICBjb250ZW50IGFuZCBwcm9jZXNzZXMgb2YgdGhlIG1ldGhvZCBjb25maWd1cmF0aW9uIGluIGEgbmF2aWdhYmxlIGFuZCBzZWFyY2hhYmxlCi0gIHdheS4gSXQgdXNlcyB0aGUgcmVsYXRpb25zaGlwcyBlc3RhYmxpc2hlZCBkdXJpbmcgbWV0aG9kIGNvbnRlbnQgYW5kIHByb2Nlc3MKLSAgYXV0aG9yaW5nIHRvIGdlbmVyYXRlIGh5cGVybGlua3MgYmV0d2VlbiBlbGVtZW50cyBhcyB3ZWxsIGFzIHByb3ZpZGVzIHRyZWUKLSAgYnJvd3NlcnMgYmFzZWQgb24gdGhlIGNvbmZpZ3VyYXRpb24gdmlldyBhbmQgdXNlci1kZWZpbmVkIGNhdGVnb3JpemF0aW9ucyBvZgotICB0aGUgY29udGVudC4gVGhlIGZpZ3VyZSBiZWxvdyBzaG93cyBhbiBleGFtcGxlIG9mIHRoZSBwdWJsaXNoZWQgJ0NsYXNzaWMgUlVQJwotICBtZXRob2QgY29uZmlndXJhdGlvbi48L3A+Ci08cD48aW1nIHNyYz0icHViLmdpZiI+PC9wPgotPHA+Rm9yIHB1Ymxpc2hpbmcgc2ltcGx5IGNyZWF0ZSBhbmQgc2VsZWN0IGEgY29uZmlndXJhdGlvbi4gVGhlIHB1YmxpY2F0aW9uIHdpemFyZAotICB3aWxsIGRvIHRoZSByZXN0IGZvciB5b3UgYW5kIG9ubHkgcHVibGlzaCBjb250ZW50IHRoYXQgaXMgcGFydCBvZiB0aGUgbWV0aG9kCi0gIGNvbmZpZ3VyYXRpb24uIEl0IHdpbGwgYWxzbyBhdXRvbWF0aWNhbGx5IGFkb3B0IGNvbnRlbnQgdG8gdGhlIGNvbmZpZ3VyYXRpb24KLSAgc3VjaCBhcyByZW1vdmluZwotICByZWZlcmVuY2VzIG9mIG1ldGhvZCBjb250ZW50IGVsZW1lbnRzIHRvIGVsZW1lbnRzIG91dHNpZGUgb2YgdGhlIGNvbmZpZ3VyYXRpb24KLSAgb3IgcmVtb3ZpbmcgYWN0aXZpdGllcyBmcm9tIHlvdXIgcHJvY2Vzc2VzIHRoYXQgb25seSBjb250YWluIHdvcmsgZGVmaW5lZCBvdXRzaWRlCi0gIG9mIHRoZSBjb25maWd1cmF0aW9uIHNldC4gSGVuY2UsIHB1Ymxpc2hpbmcgd2lsbCBvbmx5IGluY2x1ZGUgdGhlIGNvbnRlbnQgdGhhdAotICB5b3UgcmVhbGx5IG5lZWQuIFlvdSBjYW4gYWx3YXlzIHByZXZpZXcgYSBwdWJsaXNoZWQgY29uZmlndXJhdGlvbiB1c2luZyBFUEYgQ29tcG9zZXIncwotYnJvd3NpbmcgcGVyc3BlY3RpdmUuPC9wPgotPHA+Jm5ic3A7PC9wPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvd2VsY29tZS91bWFfaHVtcC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC93ZWxjb21lL3VtYV9odW1wLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGU5OGYyOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC93ZWxjb21lL3VtYV9odW1wLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3doaXRlcGFwZXIuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3doaXRlcGFwZXIuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGVjZTMzYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC93aGl0ZXBhcGVyLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGh0bWwKLSAgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9InNlY3VyaXR5IiBjb250ZW50PSJwdWJsaWMiIC8+Ci08bWV0YSBuYW1lPSJSb2JvdHMiIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgbmFtZT0iREMuVHlwZSIgY29udGVudD0iY29uY2VwdCIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJXaGl0ZXBhcGVyIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJndWlkYW5jZS5odG1sI2d1aWRhbmNlIiAvPgotPG1ldGEgbmFtZT0iREMuRm9ybWF0IiBjb250ZW50PSJYSFRNTCIgLz4KLTxtZXRhIG5hbWU9IkRDLklkZW50aWZpZXIiIGNvbnRlbnQ9IndoaXRlcGFwZXIiIC8+Ci08bWV0YSBuYW1lPSJEQy5MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiIC8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4vaWJtZGl0YS5jc3MiIC8+Ci08dGl0bGU+V2hpdGVwYXBlcjwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0id2hpdGVwYXBlciI+PGEgbmFtZT0id2hpdGVwYXBlciI+PCEtLSAtLT48L2E+Ci0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPldoaXRlcGFwZXI8L2gxPgotPGRpdj48cD5BIFdoaXRlcGFwZXIgaXMgYSBzcGVjaWFsIHR5cGUgb2YgY29uY2VwdCBndWlkYW5jZSB0aGF0IGlzIGV4dGVybmFsbHkgcmV2aWV3ZWQKLW9yIHB1Ymxpc2hlZCBhbmQgY2FuIGJlIHJlYWQgYW5kIHVuZGVyc3Rvb2QgaW4gaXNvbGF0aW9uIG9mIG90aGVyIGNvbnRlbnQKLWVsZW1lbnRzIGFuZCBndWlkYW5jZS48L3A+Ci08L2Rpdj4KLTxkaXY+PGRpdiBjbGFzcz0icmVsY29uY2VwdHMiPjxzdHJvbmc+UmVsYXRlZCBjb25jZXB0czwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJndWlkYW5jZS5odG1sI2d1aWRhbmNlIj5HdWlkYW5jZTwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC93b3JrcHJvZHVjdC5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvd29ya3Byb2R1Y3QuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOThhMmMxMy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC93b3JrcHJvZHVjdC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJzZWN1cml0eSIgY29udGVudD0icHVibGljIiAvPgotPG1ldGEgbmFtZT0iUm9ib3RzIiBjb250ZW50PSJpbmRleCxmb2xsb3ciIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIG5hbWU9IkRDLlR5cGUiIGNvbnRlbnQ9ImNvbmNlcHQiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iV29yayBQcm9kdWN0IiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJjcmVhdGVhd29ya3Byb2R1Y3QuaHRtbCNjcmVhdGVhd29ya3Byb2R1Y3QiIC8+Ci08bWV0YSBuYW1lPSJEQy5Gb3JtYXQiIGNvbnRlbnQ9IlhIVE1MIiAvPgotPG1ldGEgbmFtZT0iREMuSWRlbnRpZmllciIgY29udGVudD0id29ya3Byb2R1Y3QiIC8+Ci08bWV0YSBuYW1lPSJEQy5MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiIC8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4vaWJtZGl0YS5jc3MiIC8+Ci08dGl0bGU+V29yayBQcm9kdWN0PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJ3b3JrcHJvZHVjdCI+PGEgbmFtZT0id29ya3Byb2R1Y3QiPjwhLS0gLS0+PC9hPgotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5Xb3JrIFByb2R1Y3Q8L2gxPgotPGRpdj48ZGl2IGNsYXNzPSJwIj5Xb3JrIHByb2R1Y3QgaXMgYSBnZW5lcmFsIHRlcm0gZm9yIHRhc2sgaW5wdXRzIGFuZCBvdXRwdXRzLAotZGVzY3JpcHRpb25zIG9mIGNvbnRlbnQgZWxlbWVudHMgdGhhdCBhcmUgdXNlZCB0byBkZWZpbmUgYW55dGhpbmcgdXNlZCwgcHJvZHVjZWQsCi1vciBtb2RpZmllZCBieSBhIHRhc2suIFRoZSB0aHJlZSB0eXBlcyBvZiB3b3JrIHByb2R1Y3QgYXJlOjx1bD48bGk+PGEgaHJlZj0iYXJ0aWZhY3QuaHRtbCNhcnRpZmFjdCI+QXJ0aWZhY3Q8L2E+PC9saT4KLTxsaT48YSBocmVmPSJvdXRjb21lLmh0bWwjb3V0Y29tZSI+T3V0Y29tZTwvYT48L2xpPgotPGxpPjxhIGhyZWY9ImRlbGl2ZXJhYmxlLmh0bWwjZGVsaXZlcmFibGUiPkRlbGl2ZXJhYmxlPC9hPjwvbGk+Ci08L3VsPgotPC9kaXY+Ci08L2Rpdj4KLTxkaXY+PGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJjcmVhdGVhd29ya3Byb2R1Y3QuaHRtbCNjcmVhdGVhd29ya3Byb2R1Y3QiPkNyZWF0ZSBhIFdvcmsgUHJvZHVjdDwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC93b3JrcHJvZHVjdGRlc2NyaXB0b3JzLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC93b3JrcHJvZHVjdGRlc2NyaXB0b3JzLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0ZmNhOTUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvd29ya3Byb2R1Y3RkZXNjcmlwdG9ycy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJzZWN1cml0eSIgY29udGVudD0icHVibGljIiAvPgotPG1ldGEgbmFtZT0iUm9ib3RzIiBjb250ZW50PSJpbmRleCxmb2xsb3ciIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIG5hbWU9IkRDLlR5cGUiIGNvbnRlbnQ9ImNvbmNlcHQiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iV29yayBQcm9kdWN0IERlc2NyaXB0b3JzIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJ3b3JrcHJvZHVjdC5odG1sI3dvcmtwcm9kdWN0IiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJjcmVhdGVhd29ya3Byb2R1Y3QuaHRtbCIgLz4KLTxtZXRhIG5hbWU9IkRDLkZvcm1hdCIgY29udGVudD0iWEhUTUwiIC8+Ci08bWV0YSBuYW1lPSJEQy5JZGVudGlmaWVyIiBjb250ZW50PSJ3b3JrcHJvZHVjdGRlc2NyaXB0b3JzIiAvPgotPG1ldGEgbmFtZT0iREMuTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIiAvPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuL2libWRpdGEuY3NzIiAvPgotPHRpdGxlPldvcmsgUHJvZHVjdCBEZXNjcmlwdG9yczwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0id29ya3Byb2R1Y3RkZXNjcmlwdG9ycyI+PGEgbmFtZT0id29ya3Byb2R1Y3RkZXNjcmlwdG9ycyI+PCEtLSAtLT48L2E+Ci0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPldvcmsgUHJvZHVjdCBEZXNjcmlwdG9yczwvaDE+Ci08ZGl2PjxwPkEgd29yayBwcm9kdWN0IGRlc2NyaXB0b3IgaXMgYSB3b3JrIHByb2R1Y3QgaW4gdGhlIGNvbnRleHQgb2Ygb25lIHNwZWNpZmljCi1hY3Rpdml0eS4gRXZlcnkgYnJlYWtkb3duIHN0cnVjdHVyZSBjYW4gZGVmaW5lIGRpZmZlcmVudCByZWxhdGlvbnNoaXBzIG9mCi13b3JrIHByb2R1Y3QgZGVzY3JpcHRvcnMgb2YgdGFzayBkZXNjcmlwdG9ycyBhbmQgcm9sZSBkZXNjcmlwdG9ycy4gT25lIHdvcmsKLXByb2R1Y3QgY2FuIGJlIHJlcHJlc2VudGVkIGJ5IG1hbnkgd29yayBwcm9kdWN0IGRlc2NyaXB0b3JzLCBlYWNoIHdpdGhpbiB0aGUKLWNvbnRleHQgb2YgYW4gYWN0aXZpdHkgd2l0aCBpdHMgb3duIHNldCBvZiByZWxhdGlvbnNoaXBzLjwvcD4KLTwvZGl2PgotPGRpdj48ZGl2IGNsYXNzPSJyZWxjb25jZXB0cyI+PHN0cm9uZz5SZWxhdGVkIGNvbmNlcHRzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Indvcmtwcm9kdWN0Lmh0bWwjd29ya3Byb2R1Y3QiPldvcmsgUHJvZHVjdDwvYT48L2Rpdj4KLTwvZGl2PgotPGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJjcmVhdGVhd29ya3Byb2R1Y3QuaHRtbCI+Q3JlYXRlIGEgV29yayBQcm9kdWN0PC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3dvcmtwcm9kdWN0a2luZC5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvd29ya3Byb2R1Y3RraW5kLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3ZGRiMjkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvd29ya3Byb2R1Y3RraW5kLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGh0bWwKLSAgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9InNlY3VyaXR5IiBjb250ZW50PSJwdWJsaWMiIC8+Ci08bWV0YSBuYW1lPSJSb2JvdHMiIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgbmFtZT0iREMuVHlwZSIgY29udGVudD0iY29uY2VwdCIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJXb3JrIFByb2R1Y3QgS2luZCIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0ibWV0aG9kY29udGVudGNhdGVnb3JpZXMuaHRtbCNtZXRob2Rjb250ZW50Y2F0ZWdvcmllcyIgLz4KLTxtZXRhIG5hbWU9IkRDLkZvcm1hdCIgY29udGVudD0iWEhUTUwiIC8+Ci08bWV0YSBuYW1lPSJEQy5JZGVudGlmaWVyIiBjb250ZW50PSJ3b3JrcHJvZHVjdGtpbmQiIC8+Ci08bWV0YSBuYW1lPSJEQy5MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiIC8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4vaWJtZGl0YS5jc3MiIC8+Ci08dGl0bGU+V29yayBQcm9kdWN0IEtpbmQ8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9Indvcmtwcm9kdWN0a2luZCI+PGEgbmFtZT0id29ya3Byb2R1Y3RraW5kIj48IS0tIC0tPjwvYT4KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+V29yayBQcm9kdWN0IEtpbmQ8L2gxPgotPGRpdj48cD5Xb3JrIFByb2R1Y3QgS2luZCBpcyBhbm90aGVyIGNhdGVnb3J5IGZvciBncm91cGluZyA8YSBocmVmPSJ3b3JrcHJvZHVjdC5odG1sI3dvcmtwcm9kdWN0Ij5Xb3JrIFByb2R1Y3RzPC9hPi4gQSB3b3JrIHByb2R1Y3QgY2FuIGhhdmUgbWFueSB3b3JrIHByb2R1Y3QKLWtpbmRzLiBBcyBhbiBleGFtcGxlLCB5b3UgbWlnaHQgd2FudCB0byBoYXZlIGEgc2VyaWVzIG9mIHdvcmsgcHJvZHVjdCBraW5kcwotdGhhdCBjb3JyZXNwb25kIHRvIHRoZSBvdmVyYWxsIGludGVudCBvZiB3b3JrIHByb2R1Y3RzLCBzdWNoIGFzIHNwZWNpZmljYXRpb24sCi1wbGFuLCBvciBtb2RlbC48L3A+Ci08L2Rpdj4KLTxkaXY+PGRpdiBjbGFzcz0icmVsY29uY2VwdHMiPjxzdHJvbmc+UmVsYXRlZCBjb25jZXB0czwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJtZXRob2Rjb250ZW50Y2F0ZWdvcmllcy5odG1sI21ldGhvZGNvbnRlbnRjYXRlZ29yaWVzIj5NZXRob2QgQ29udGVudCBDYXRlZ29yaWVzPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9tYWluLnhtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9tYWluLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2EzM2EyOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvbWFpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPD9OTFMgIFRZUEU9Im9yZy5lY2xpcHNlLmhlbHAudG9jIj8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLTx0b2MgbGFiZWw9IkVQRiBDb21wb3NlciIgPgotPHRvcGljIGxhYmVsPSJPdmVydmlldyI+Ci0JPGFuY2hvciBpZD0ib3ZlcnZpZXdfaWQiLz4KLTwvdG9waWM+Ci08dG9waWMgbGFiZWw9IkdldHRpbmcgc3RhcnRlZCI+Ci0JPGFuY2hvciBpZD0iZ2V0dGluZ19zdGFydGVkX2lkIi8+Ci08L3RvcGljPgotPHRvcGljIGxhYmVsPSJDcmVhdGluZyByZXVzYWJsZSBtZXRob2QgY29udGVudCI+Ci0JPGFuY2hvciBpZD0iY3JlYXRpbmdfbWV0aG9kX2NvbnRlbnRfaWQiLz4KLTwvdG9waWM+Ci08dG9waWMgbGFiZWw9IkNhdGVnb3JpemluZyByZXVzYWJsZSBtZXRob2QgY29udGVudCI+Ci0JPGFuY2hvciBpZD0iY2F0ZWdvcml6aW5nX21ldGhvZF9jb250ZW50X2lkIi8+Ci08L3RvcGljPgotPHRvcGljIGxhYmVsPSJDcmVhdGluZyBwcm9jZXNzZXMiPgotCTxhbmNob3IgaWQ9ImNyZWF0aW5nX3Byb2Nlc3Nlc19pZCIvPgotPC90b3BpYz4KLTx0b3BpYyBsYWJlbD0iUHVibGlzaGluZyBhbmQgZXhwb3J0aW5nIj4KLQk8YW5jaG9yIGlkPSJwdWJsaXNoaW5nX2V4cG9ydGluZ19pZCIvPgotPC90b3BpYz4KLTx0b3BpYyBsYWJlbD0iVXNpbmcgdmVyc2lvbiBjb250cm9sIHN5c3RlbSIgPgotCTxhbmNob3IgaWQ9InZlcnNpb25fY29udHJvbF9pZCIvPgotPC90b3BpYz4KLTx0b3BpYyBsYWJlbD0iQWNjZXNzaWJpbGl0eSIgPgotCTxhbmNob3IgaWQ9ImFjY2Vzc2liaWxpdHlfaWQiLz4KLTwvdG9waWM+Ci08dG9waWMgbGFiZWw9Ikdsb3NzYXJ5Ij4KLQk8YW5jaG9yIGlkPSJnbG9zc2FyeV9pZCIvPgotPC90b3BpYz4KLTx0b3BpYyBsYWJlbD0iVHV0b3JpYWxzIiA+Ci0JPGFuY2hvciBpZD0idHV0b3JpYWxzX2lkIi8+Ci08L3RvcGljPgotPC90b2M+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL292ZXJ2aWV3LnhtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9vdmVydmlldy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhOTRlODUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL292ZXJ2aWV3LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08P05MUyAgVFlQRT0ib3JnLmVjbGlwc2UuaGVscC50b2MiPz4KLTx0b2MgbGFiZWw9IkVQRiBDb21wb3NlciBvdmVydmlldyIgbGlua190bz0ibWFpbi54bWwjb3ZlcnZpZXdfaWQiPgotICAgPHRvcGljIGxhYmVsPSJFUEYgQ29tcG9zZXIgb3ZlcnZpZXciIGhyZWY9Imh0bWwvb3ZlcnZpZXcvYV9wcm9kdWN0X292ZXJ2aWV3Lmh0bWwiLz4KLSAgIDx0b3BpYyBsYWJlbD0iTWV0aG9kIGNvbnRlbnQgYXV0aG9yaW5nIG92ZXJ2aWV3IiBocmVmPSJodG1sL292ZXJ2aWV3L2FfbWV0aG9kX2NvbnRlbnRfYXV0aG9yaW5nX292ZXJ2aWV3Lmh0bWwiLz4KLSAgIDx0b3BpYyBsYWJlbD0iUHJvY2VzcyBhdXRob3Jpbmcgb3ZlcnZpZXciIGhyZWY9Imh0bWwvb3ZlcnZpZXcvYV9wcm9jZXNzX2F1dGhvcmluZ19vdmVydmlldy5odG1sIi8+Ci0gICA8dG9waWMgbGFiZWw9Ik1ldGhvZCBjb25maWd1cmF0aW9ucyBvdmVydmlldyIgaHJlZj0iaHRtbC9vdmVydmlldy9hX21ldGhvZF9jb25maWd1cmF0aW9uc19vdmVydmlldy5odG1sIi8+Ci0gICA8dG9waWMgbGFiZWw9IktleSBjb25jZXB0cyI+Ci0gICA8dG9waWMgbGFiZWw9Ik1ldGhvZCBsaWJyYXJ5IiBocmVmPSJodG1sL3RvcGljcy9jX21ldGhvZF9saWJyYXJ5Lmh0bWwiLz4KLSAgIDx0b3BpYyBsYWJlbD0iTWV0aG9kIGNvbnRlbnQiIGhyZWY9Imh0bWwvdG9waWNzL2NfbWV0aG9kX2NvbnRlbnQuaHRtbCIvPgotICAgPHRvcGljIGxhYmVsPSJNZXRob2QgY29udGVudCBwYWNrYWdlIiBocmVmPSJodG1sL3RvcGljcy9jX21ldGhvZF9jb250ZW50X3BhY2thZ2UuaHRtbCIvPgotICAgPHRvcGljIGxhYmVsPSJNZXRob2QgY29uZmlndXJhdGlvbnMiIGhyZWY9Imh0bWwvdG9waWNzL2NfbWV0aG9kX2NvbmZpZ3VyYXRpb25zLmh0bWwiLz4KLSAgIDx0b3BpYyBsYWJlbD0iTWV0aG9kIHBsdWctaW4iIGhyZWY9Imh0bWwvdG9waWNzL2NfbWV0aG9kX3BsdWdpbi5odG1sIi8+Ci0gICA8dG9waWMgbGFiZWw9Ikd1aWRhbmNlIiBocmVmPSJodG1sL3RvcGljcy9jX2d1aWRhbmNlLmh0bWwiLz4KLSAgIDx0b3BpYyBsYWJlbD0iUHJvY2VzcyIgaHJlZj0iaHRtbC90b3BpY3MvY19wcm9jZXNzLmh0bWwiLz4KLSAgIDx0b3BpYyBsYWJlbD0iTWV0aG9kIGNvbnRlbnQgdmFyaWFiaWxpdHkiIGhyZWY9Imh0bWwvdG9waWNzL2NfdmFyaWFiaWxpdHkuaHRtbCIvPgotICAgPHRvcGljIGxhYmVsPSJVc2VyIHJvbGVzIGFuZCByb2xlLXNwZWNpZmljIHRhc2tzIiBocmVmPSJodG1sL3RvcGljcy9jX3VzZXJfcm9sZXMuaHRtbCIvPgotPC90b3BpYz4KLTwvdG9jPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9wbHVnaW4ucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTQyYTViNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUgotCi0jIFBsdWctaW4KLXBsdWdpbk5hbWU9RVBGIERvY3VtZW50YXRpb24KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotCi0KLSMgQ2hlYXQgU2hlZXRzCi1tZXRob2RBdXRob3JpbmdDaGVhdFNoZWV0c05hbWU9TWV0aG9kIEF1dGhvcmluZyBDaGVhdCBTaGVldHMKLUNoZWF0c2hlZXRHZXRzdGFydGVkQ2F0ZWdvcnlUZXh0PUdldHRpbmcgU3RhcnRlZAotQ2hlYXRzaGVldFJldXNhYmxlQ29udGVudENhdGVnb3J5VGV4dD1DcmVhdGUgUmV1c2FibGUgTWV0aG9kIENvbnRlbnQKLUNoZWF0c2hlZXRXcml0ZUNvbnRlbnRDYXRlZ29yeVRleHQ9V3JpdGUgTWV0aG9kIENvbnRlbnQKLUNoZWF0c2hlZXRQcm9jZXNzZXNDYXRlZ29yeVRleHQ9V29yayB3aXRoIFByb2Nlc3NlcwotQ2hlYXRzaGVldE5hdmlnYXRlTWV0aG9kQ29udGVudD1OYXZpZ2F0ZSBNZXRob2QgQ29udGVudAotQ2hlYXRzaGVldENyZWF0ZU1ldGhvZENvbmZpZ3VyYXRpb249Q3JlYXRlIHlvdXIgb3duIE1ldGhvZCBDb25maWd1cmF0aW9uCi1DaGVhdHNoZWV0Q3JlYXRlTWV0aG9kUGx1Z2luPUNyZWF0ZSB5b3VyIG93biBNZXRob2QgUGx1Zy1pbgotQ2hlYXRzaGVldEFkZE1ldGhvZENvbnRlbnQ9QWRkIG5ldyBNZXRob2QgQ29udGVudCBzdWNoIGFzIFJvbGVzLCBUYXNrcywgV29yayBQcm9kdWN0cywgb3IgR3VpZGFuY2UKLUNoZWF0c2hlZXRUYWlsb3JNZXRob2RFbGVtZW50cz1UYWlsb3IgZXhpc3RpbmcgTWV0aG9kIEVsZW1lbnRzIChSb2xlcywgVGFza3MsIFdvcmsgUHJvZHVjdHMgb3IgR3VpZGFuY2UpIFVzaW5nIENvbnRyaWJ1dGlvbgotQ2hlYXRzaGVldFJlcGxhY2VNZWh0b2RFbGVtZW50cz1SZXBsYWNlIGV4aXN0aW5nIE1ldGhvZCBFbGVtZW50cyAoUm9sZXMsIFRhc2tzLCBXb3JrIFByb2R1Y3RzIG9yIEd1aWRhbmNlKQotQ2hlYXRzaGVldEFkZE1ldGhvZFJlZk9ySHlwZXJsaW5rPUFkZCBhIE1ldGhvZCBSZWZlcmVuY2Ugb3IgSHlwZXJsaW5rIChVUkwpCi1DaGVhdHNoZWV0QXBwbHlDYXBhYmlsaXR5UGF0dGVybj1BcHBseSBhIENhcGFiaWxpdHkgUGF0dGVybgotQ2hlYXRzaGVldENyZWF0ZVByb2Nlc3M9Q3JlYXRlIGEgUHJvY2VzcyAoQ2FwYWJpbGl0eSBQYXR0ZXJuIG9yIERlbGl2ZXJ5IFByb2Nlc3MpCi0KLQotCi0gICAgICAgICAgICAgICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvcGx1Z2luLnhtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYjQyNmJkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTQ5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLTxwbHVnaW4+Ci0KLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmhlbHAudG9jIj4KLSAgICAgIAk8dG9jCi0gICAgICAgICAgICBmaWxlPSJtYWluLnhtbCIKLSAgICAgICAgICAgIHByaW1hcnk9InRydWUiPgotICAgICAgCTwvdG9jPgotICAgICAgCTx0b2MKLQkJZmlsZT0iZ2V0dGluZ19zdGFydGVkLnhtbCI+Ci0gICAgICAJPC90b2M+Ci0gICAgICAJPHRvYwotCQlmaWxlPSJvdmVydmlldy54bWwiPgotICAgICAgCTwvdG9jPgotCi0gICAgICAJPHRvYwotCQlmaWxlPSJjcmVhdGluZ19tZXRob2RfY29udGVudC54bWwiPgotICAgICAgCTwvdG9jPgotCi0gICAgICAJPHRvYwotCQlmaWxlPSJjYXRlZ29yaXppbmdfbWV0aG9kX2NvbnRlbnQueG1sIj4KLSAgICAgIAk8L3RvYz4KLQotICAgICAgCTx0b2MKLQkJZmlsZT0iY3JlYXRpbmdfcHJvY2Vzc2VzLnhtbCI+Ci0gICAgICAJPC90b2M+Ci0KLSAgICAgIAk8dG9jCi0JCWZpbGU9InB1Ymxpc2hpbmdfZXhwb3J0aW5nLnhtbCI+Ci0gICAgICAJPC90b2M+Ci0KLQk8dG9jCi0JCWZpbGU9InZlcnNpb25fY29udHJvbC54bWwiPgotCTwvdG9jPgotCTx0b2MKLQkJZmlsZT0iYWNjZXNzaWJpbGl0eS54bWwiPgotCTwvdG9jPgotCTx0b2MKLQkJZmlsZT0iZ2xvc3NhcnkueG1sIj4KLQk8L3RvYz4KLQk8dG9jCi0JCWZpbGU9InR1dG9yaWFscy54bWwiPgotCTwvdG9jPgotICAgPC9leHRlbnNpb24+Ci0KLTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci08IS0tIEYxIGNvbnRleHQgZmlsZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmhlbHAuY29udGV4dHMiPiAKLQkJPGNvbnRleHRzIGZpbGU9IiRubCQvY29udGV4dHNfYXV0aG9yaW5nX3VpLnhtbCIgcGx1Z2luPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpIi8+IAotCTwvZXh0ZW5zaW9uPgotCi0gCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmhlbHAuY29udGV4dHMiPiAKLSAgICAgIDxjb250ZXh0cyBmaWxlPSIkbmwkL2NvbnRleHRzX1NlYXJjaC54bWwiIHBsdWdpbj0ib3JnLmVjbGlwc2Uuc2VhcmNoIi8+IAotICAgCTwvZXh0ZW5zaW9uPgotCQotCTxleHRlbnNpb24gCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkuY2hlYXRzaGVldHMuY2hlYXRTaGVldENvbnRlbnQiCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jLmNoZWF0c2hlZXRzIgotICAgICAgICAgbmFtZT0iJW1ldGhvZEF1dGhvcmluZ0NoZWF0U2hlZXRzTmFtZSI+Ci0gICAgICA8Y2F0ZWdvcnkKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MuY2hlYXRzaGVldHMuZ2V0c3RhcnRlZCIgCi0gICAgICAgICAgICBuYW1lPSIlQ2hlYXRzaGVldEdldHN0YXJ0ZWRDYXRlZ29yeVRleHQiLz4KLSAgICAgIDxjaGVhdHNoZWV0Ci0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jLmNoZWF0c2hlZXRzLm5hdmlnYXRlbWV0aG9kY29udGVudCIKLSAgICAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MuY2hlYXRzaGVldHMuZ2V0c3RhcnRlZCIKLSAgICAgICAgICAgIGNvbnRlbnRGaWxlPSIkbmwkL2NoZWF0c2hlZXRzL25hdmlnYXRlbWV0aG9kY29udGVudC54bWwiCi0gICAgICAgICAgICBuYW1lPSIlQ2hlYXRzaGVldE5hdmlnYXRlTWV0aG9kQ29udGVudCIvPgotICAgICAgPGNoZWF0c2hlZXQKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MuY2hlYXRzaGVldHMuY3JlYXRlbWV0aG9kY29uZmlndXJhdGlvbiIKLSAgICAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MuY2hlYXRzaGVldHMuZ2V0c3RhcnRlZCIKLSAgICAgICAgICAgIGNvbnRlbnRGaWxlPSIkbmwkL2NoZWF0c2hlZXRzL2NyZWF0ZW1ldGhvZGNvbmZpZ3VyYXRpb24ueG1sIgotICAgICAgICAgICAgbmFtZT0iJUNoZWF0c2hlZXRDcmVhdGVNZXRob2RDb25maWd1cmF0aW9uIi8+Ci0gICAgICA8Y2hlYXRzaGVldAotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy5jaGVhdHNoZWV0cy5jcmVhdGVtZXRob2RwbHVnaW4iCi0gICAgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jLmNoZWF0c2hlZXRzLmdldHN0YXJ0ZWQiCi0gICAgICAgICAgICBjb250ZW50RmlsZT0iJG5sJC9jaGVhdHNoZWV0cy9jcmVhdGVtZXRob2RwbHVnaW4ueG1sIgotICAgICAgICAgICAgbmFtZT0iJUNoZWF0c2hlZXRDcmVhdGVNZXRob2RQbHVnaW4iLz4KLSAgIDwvZXh0ZW5zaW9uPgotICAgCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkuY2hlYXRzaGVldHMuY2hlYXRTaGVldENvbnRlbnQiIAotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy5jaGVhdHNoZWV0cyIgCi0gICAgICAgICBuYW1lPSIlbWV0aG9kQXV0aG9yaW5nQ2hlYXRTaGVldHNOYW1lIj4KLSAgICAgIDxjYXRlZ29yeQotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy5jaGVhdHNoZWV0cy5yZXN1YWJsZS5jb250ZW50IgotICAgICAgICAgICAgbmFtZT0iJUNoZWF0c2hlZXRSZXVzYWJsZUNvbnRlbnRDYXRlZ29yeVRleHQiLz4KLSAgICAgIDxjaGVhdHNoZWV0Ci0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jLmNoZWF0c2hlZXRzLmFkZG5ld21ldGhvZGNvbnRlbnQiCi0gICAgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jLmNoZWF0c2hlZXRzLnJlc3VhYmxlLmNvbnRlbnQiCi0gICAgICAgICAgICBjb250ZW50RmlsZT0iJG5sJC9jaGVhdHNoZWV0cy9hZGRuZXdtZXRob2Rjb250ZW50LnhtbCIKLSAgICAgICAgICAgIG5hbWU9IiVDaGVhdHNoZWV0QWRkTWV0aG9kQ29udGVudCIvPgotICAgICAgPGNoZWF0c2hlZXQKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MuY2hlYXRzaGVldHMudGFpbG9yZXhpc3RpbmdtZXRob2RlbGVtZW50cyIKLSAgICAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MuY2hlYXRzaGVldHMucmVzdWFibGUuY29udGVudCIKLSAgICAgICAgICAgIGNvbnRlbnRGaWxlPSIkbmwkL2NoZWF0c2hlZXRzL3RhaWxvcmV4aXN0aW5nbWV0aG9kZWxlbWVudHMueG1sIgotICAgICAgICAgICAgbmFtZT0iJUNoZWF0c2hlZXRUYWlsb3JNZXRob2RFbGVtZW50cyIvPgotICAgICAgPGNoZWF0c2hlZXQKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MuY2hlYXRzaGVldHMucmVwbGFjZWV4aXN0aW5nbWV0aG9kZWxlbWVudHMiCi0gICAgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jLmNoZWF0c2hlZXRzLnJlc3VhYmxlLmNvbnRlbnQiCi0gICAgICAgICAgICBjb250ZW50RmlsZT0iJG5sJC9jaGVhdHNoZWV0cy9yZXBsYWNlZXhpc3RpbmdtZXRob2RlbGVtZW50cy54bWwiCi0gICAgICAgICAgICBuYW1lPSIlQ2hlYXRzaGVldFJlcGxhY2VNZWh0b2RFbGVtZW50cyIvPgotICAgPC9leHRlbnNpb24+Ci0gICAKLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5jaGVhdHNoZWV0cy5jaGVhdFNoZWV0Q29udGVudCIKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MuY2hlYXRzaGVldHMiCi0gICAgICAgICBuYW1lPSIlbWV0aG9kQXV0aG9yaW5nQ2hlYXRTaGVldHNOYW1lIj4KLSAgICAgIDxjYXRlZ29yeQotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy5jaGVhdHNoZWV0cy53cml0ZS5jb250ZW50IgotICAgICAgICAgICAgbmFtZT0iJUNoZWF0c2hlZXRXcml0ZUNvbnRlbnRDYXRlZ29yeVRleHQiLz4KLSAgICAgIDxjaGVhdHNoZWV0Ci0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jLmNoZWF0c2hlZXRzLmFkZG1ldGhvZHJlZl9vcl9oeXBlcmxpbmsiCi0gICAgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jLmNoZWF0c2hlZXRzLndyaXRlLmNvbnRlbnQiCi0gICAgICAgICAgICBjb250ZW50RmlsZT0iJG5sJC9jaGVhdHNoZWV0cy9hZGRtZXRob2RyZWZfb3JfaHlwZXJsaW5rLnhtbCIKLSAgICAgICAgICAgIG5hbWU9IiVDaGVhdHNoZWV0QWRkTWV0aG9kUmVmT3JIeXBlcmxpbmsiLz4KLSAgIDwvZXh0ZW5zaW9uPgotICAgCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkuY2hlYXRzaGVldHMuY2hlYXRTaGVldENvbnRlbnQiCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jLmNoZWF0c2hlZXRzIgotICAgICAgICAgbmFtZT0iJW1ldGhvZEF1dGhvcmluZ0NoZWF0U2hlZXRzTmFtZSI+Ci0gICAgICA8Y2F0ZWdvcnkKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MuY2hlYXRzaGVldHMucHJvY2Vzc2VzIgotICAgICAgICAgICAgbmFtZT0iJUNoZWF0c2hlZXRQcm9jZXNzZXNDYXRlZ29yeVRleHQiLz4KLSAgICAgIDxjaGVhdHNoZWV0Ci0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jLmNoZWF0c2hlZXRzLmFwcGx5Y2FwYWJpbGl0eXBhdHRlcm4iCi0gICAgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jLmNoZWF0c2hlZXRzLnByb2Nlc3NlcyIKLSAgICAgICAgICAgIGNvbnRlbnRGaWxlPSIkbmwkL2NoZWF0c2hlZXRzL2FwcGx5Y2FwYWJpbGl0eXBhdHRlcm4ueG1sIgotICAgICAgICAgICAgbmFtZT0iJUNoZWF0c2hlZXRBcHBseUNhcGFiaWxpdHlQYXR0ZXJuIi8+Ci0gICAgICA8Y2hlYXRzaGVldAotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy5jaGVhdHNoZWV0cy5jcmVhdGVhcHJvY2VzcyIKLSAgICAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MuY2hlYXRzaGVldHMucHJvY2Vzc2VzIgotICAgICAgICAgICAgY29udGVudEZpbGU9IiRubCQvY2hlYXRzaGVldHMvY3JlYXRlYXByb2Nlc3MueG1sIgotICAgICAgICAgICAgbmFtZT0iJUNoZWF0c2hlZXRDcmVhdGVQcm9jZXNzIi8+Ci0gICA8L2V4dGVuc2lvbj4KLQkKLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL3B1Ymxpc2hhbmRleHBvcnQueG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL3B1Ymxpc2hhbmRleHBvcnQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MTJlYzMwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9wdWJsaXNoYW5kZXhwb3J0LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08P05MUyAgVFlQRT0ib3JnLmVjbGlwc2UuaGVscC50b2MiPz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotPHRvYyBsYWJlbD0iUHVibGlzaGluZyBhbmQgZXhwb3J0aW5nIiBsaW5rX3RvPSJtYWluLnhtbCNwdWJsaXNoYW5kZXhwb3J0X2lkIj4KLSAgIDx0b3BpYyBsYWJlbD0iUHVibGlzaGluZyBvdmVydmlldyIgaHJlZj0iaHRtbC9oZWxwL3B1Ymxpc2hpbmdvdmVydmlldy5odG1sIi8+Ci0gICA8dG9waWMgbGFiZWw9IlB1Ymxpc2hpbmcgYSBtZXRob2QgY29uZmlndXJhdGlvbiB0byBhIG1ldGhvZCB3ZWIiIGhyZWY9Imh0bWwvaGVscC9wdWJsaXNoaW5nYW1ldGhvZGNvbmZpZ3VyYXRpb250b2FtZXRob2R3ZWIuaHRtbCIvPgotPC90b2M+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvcHVibGlzaGluZ19leHBvcnRpbmcueG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL3B1Ymxpc2hpbmdfZXhwb3J0aW5nLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDQ5ZTkyMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvcHVibGlzaGluZ19leHBvcnRpbmcueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTw/TkxTICBUWVBFPSJvcmcuZWNsaXBzZS5oZWxwLnRvYyI/PgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci0KLTx0b2MgbGFiZWw9IlB1Ymxpc2hpbmcgYW5kIGV4cG9ydGluZyBtZXRob2QgY29udGVudCIgbGlua190bz0ibWFpbi54bWwjcHVibGlzaGluZ19leHBvcnRpbmdfaWQiPiAgCi0JPHRvcGljIGxhYmVsPSJQdWJsaXNoaW5nIGEgY29uZmlndXJhdGlvbiBhcyBhIHdlYiBzaXRlIiBocmVmPSJodG1sL3RvcGljcy90X3B1Ymxpc2hpbmdfaHRtbC5odG1sIi8+Ci0JPHRvcGljIGxhYmVsPSJFeHBvcnRpbmcgdG8gTWljcm9zb2Z0IFByb2plY3QiIGhyZWY9Imh0bWwvdG9waWNzL3RfbXNwcm9qZWN0X2V4cG9ydC5odG1sIi8+Ci0JPHRvcGljIGxhYmVsPSJFeHBvcnRpbmcgYSBsaWJyYXJ5IGNvbmZpZ3VyYXRpb24iIGhyZWY9Imh0bWwvdG9waWNzL3RfY29uZmlndXJhdGlvbl9leHBvcnQuaHRtbCIvPgkKLQk8dG9waWMgbGFiZWw9IkltcG9ydGluZyBhIGxpYnJhcnkgY29uZmlndXJhdGlvbiIgaHJlZj0iaHRtbC90b3BpY3MvdF9jb25maWd1cmF0aW9uX2ltcG9ydC5odG1sIi8+Ci0JPHRvcGljIGxhYmVsPSJFeHBvcnRpbmcgYSBwbHVnLWluIiBocmVmPSJodG1sL3RvcGljcy90X3BsdWdpbl9leHBvcnQuaHRtbCIvPgkKLQk8dG9waWMgbGFiZWw9IkltcG9ydGluZyBhIHBsdWctaW4iIGhyZWY9Imh0bWwvdG9waWNzL3RfcGx1Z2luX2ltcG9ydC5odG1sIi8+Ci0JPHRvcGljIGxhYmVsPSJFeHBvcnRpbmcgWE1MIiBocmVmPSJodG1sL3RvcGljcy90X3htbF9leHBvcnQuaHRtbCIvPgotCTx0b3BpYyBsYWJlbD0iSW1wb3J0aW5nIFhNTCIgaHJlZj0iaHRtbC90b3BpY3MvdF94bWxfaW1wb3J0Lmh0bWwiLz4KLTwvdG9jPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL3JlZmVyZW5jZS54bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvcmVmZXJlbmNlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTdhNmJiYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvcmVmZXJlbmNlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08P05MUyAgVFlQRT0ib3JnLmVjbGlwc2UuaGVscC50b2MiPz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotPHRvYyBsYWJlbD0iUmVmZXJlbmNlIiBsaW5rX3RvPSJtYWluLnhtbCNyZWZlcmVuY2VfaWQiPgotICAgPHRvcGljIGxhYmVsPSJTdXBvcnQgZm9yIGNvZGUgbWFuYWdlbWVudCBzeXN0ZW1zIiBocmVmPSJodG1sL2hlbHAvY21fb3ZlcnZpZXcuaHRtbCI+Ci0gICA8dG9waWMgbGFiZWw9IlN1cHBvcnQgZm9yIENWUyIgaHJlZj0iaHRtbC9oZWxwL2NtX2N2cy5odG1sIi8+Ci0gICA8dG9waWMgbGFiZWw9IlN1cG9ydCBmb3IgUmF0aW9uYWwgQ2xlYXJDYXNlIiBocmVmPSJodG1sL2hlbHAvY21fcmF0aW9uYWxjYy5odG1sIi8+Ci0gICA8dG9waWMgbGFiZWw9IlN1cHBvcnQgZm9yIFJhdGlvbmFsIENDUkMiIGhyZWY9Imh0bWwvaGVscC9jbV9jY3JjLmh0bWwiLz4KLTwvdG9waWM+Ci0KLSAgIDx0b3BpYyBsYWJlbD0iQWNjZXNzaWJpbGl0eSIgaHJlZj0iaHRtbC9oZWxwL2FjX21haW4uaHRtbCI+Ci0gICA8dG9waWMgbGFiZWw9IktleWJvYXJkIG5hdmlnYXRpb24iIGhyZWY9Imh0bWwvaGVscC9hY19uYXZpZ2F0aW9uLmh0bWwiLz4KLSAgIDx0b3BpYyBsYWJlbD0iRm9udHMgYW5kIGNvbG9ycyIgaHJlZj0iaHRtbC9oZWxwL2FjX2ZvbnRzYW5kY29sb3JzLmh0bWwiLz4KLTwvdG9waWM+Ci0gICAKLTwvdG9jPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL3NyYy9vcmcvZWNsaXBzZS9lcGYvaGVscC9kb2MvRG9jUGx1Z2luLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2Mvc3JjL29yZy9lY2xpcHNlL2VwZi9oZWxwL2RvYy9Eb2NQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjNkYTkzZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2Mvc3JjL29yZy9lY2xpcHNlL2VwZi9oZWxwL2RvYy9Eb2NQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotCi0vKioKLSAqIFRoZSBtYWluIHBsdWdpbiBjbGFzcyB0byBiZSB1c2VkIGluIHRoZSBkZXNrdG9wLgotICovCi1wdWJsaWMgY2xhc3MgRG9jUGx1Z2luIGV4dGVuZHMgQWJzdHJhY3RVSVBsdWdpbiB7Ci0KLQkvLyBUaGUgc2hhcmVkIGluc3RhbmNlLgotCXByaXZhdGUgc3RhdGljIERvY1BsdWdpbiBwbHVnaW47Ci0KLQkvKioKLQkgKiBUaGUgY29uc3RydWN0b3IuCi0JICovCi0JcHVibGljIERvY1BsdWdpbigpIHsKLQkJc3VwZXIoKTsKLQkJcGx1Z2luID0gdGhpczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgdXBvbiBwbHVnLWluIGFjdGl2YXRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdGFydChjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiB0aGUgcGx1Zy1pbiBpcyBzdG9wcGVkCi0JICovCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdG9wKGNvbnRleHQpOwotCQlwbHVnaW4gPSBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNoYXJlZCBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIERvY1BsdWdpbiBnZXREZWZhdWx0KCkgewotCQlyZXR1cm4gcGx1Z2luOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHN0cmluZyBmcm9tIHRoZSBwbHVnaW4ncyByZXNvdXJjZSBidW5kbGUsCi0JICogb3IgJ2tleScgaWYgbm90IGZvdW5kLgotCSAqLwotLy8JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UmVzb3VyY2VTdHJpbmcoU3RyaW5nIGtleSkgewotLy8JCVJlc291cmNlQnVuZGxlIGJ1bmRsZSA9IERvY1BsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UmVzb3VyY2VCdW5kbGUoKTsKLS8vCQl0cnkgewotLy8JCQlyZXR1cm4gKGJ1bmRsZSAhPSBudWxsKSA/IGJ1bmRsZS5nZXRTdHJpbmcoa2V5KSA6IGtleTsKLS8vCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgewotLy8JCQlyZXR1cm4ga2V5OwotLy8JCX0KLS8vCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHBsdWdpbidzIHJlc291cmNlIGJ1bmRsZSwKLQkgKi8KLS8vCXB1YmxpYyBSZXNvdXJjZUJ1bmRsZSBnZXRSZXNvdXJjZUJ1bmRsZSgpIHsKLS8vCQl0cnkgewotLy8JCQlpZiAocmVzb3VyY2VCdW5kbGUgPT0gbnVsbCkKLS8vCQkJCXJlc291cmNlQnVuZGxlID0gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKCJvcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MuRG9jUGx1Z2luUmVzb3VyY2VzIik7Ci0vLwkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIHgpIHsKLS8vCQkJcmVzb3VyY2VCdW5kbGUgPSBudWxsOwotLy8JCX0KLS8vCQlyZXR1cm4gcmVzb3VyY2VCdW5kbGU7Ci0vLwl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFuIGltYWdlIGRlc2NyaXB0b3IgZm9yIHRoZSBpbWFnZSBmaWxlIGF0IHRoZSBnaXZlbgotCSAqIHBsdWctaW4gcmVsYXRpdmUgcGF0aC4KLQkgKgotCSAqIEBwYXJhbSBwYXRoIHRoZSBwYXRoCi0JICogQHJldHVybiB0aGUgaW1hZ2UgZGVzY3JpcHRvcgotCSAqLwotLy8JcHVibGljIHN0YXRpYyBJbWFnZURlc2NyaXB0b3IgZ2V0SW1hZ2VEZXNjcmlwdG9yKFN0cmluZyBwYXRoKSB7Ci0vLwkJcmV0dXJuIEFic3RyYWN0VUlQbHVnaW4uaW1hZ2VEZXNjcmlwdG9yRnJvbVBsdWdpbigib3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jIiwgcGF0aCk7Ci0vLwl9Ci0JCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2Mvc3JjL29yZy9lY2xpcHNlL2VwZi9oZWxwL2RvYy9wYWNrYWdlLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2Mvc3JjL29yZy9lY2xpcHNlL2VwZi9oZWxwL2RvYy9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiZGI4NmQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL3NyYy9vcmcvZWNsaXBzZS9lcGYvaGVscC9kb2MvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgdGhlIGFjdGl2YXRvciBmb3IgbWFuYWdpbmcgdGhlIERvY3VtZW50YXRpb24gcGx1Zy1pbidzIGxpZmUgY3ljbGUuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL3Rhc2tzLnhtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy90YXNrcy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkNDYxNjUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL3Rhc2tzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08P05MUyAgVFlQRT0ib3JnLmVjbGlwc2UuaGVscC50b2MiPz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotPHRvYyBsYWJlbD0iVGFza3MiIGxpbmtfdG89Im1haW4ueG1sI3Rhc2tzX2lkIj4gIAotCi0gIDwhLS0gQ3JlYXRpbmcgcmV1c2FibGUgbWV0aG9kIGNvbnRlbnQgLS0+Ci0gIDx0b3BpYyBsYWJlbD0iQ3JlYXRpbmcgcmV1c2FibGUgbWV0aG9kIGNvbnRlbnQiPgotICAgPHRvcGljIGxhYmVsPSJNZXRob2QgY29udGVudCBjYXRlZ29yaWVzIiBocmVmPSJodG1sL2hlbHAvY29udGVudF9jYXRlZ29yaWVzLmh0bWwiLz4KLSAgIDx0b3BpYyBsYWJlbD0iQ3JlYXRlIGEgbWV0aG9kIHZpZXcgd2l0aCBjdXN0b20gY2F0ZWdvcmllcyIgaHJlZj0iaHRtbC9oZWxwL2NyZWF0ZV9jdXN0b21fY2F0ZWdvcmllcy5odG1sIi8+IAotICAgPHRvcGljIGxhYmVsPSJDcmVhdGUgbWV0aG9kIGNvbnRlbnQiIGhyZWY9Imh0bWwvaGVscC9jcmVhdGVfbWV0aG9kX2NvbnRlbnQuaHRtbCI+Ci0gICAgICA8dG9waWMgbGFiZWw9IkNyZWF0ZSBhIHJvbGUiIGhyZWY9Imh0bWwvaGVscC9jcmVhdGVfcm9sZS5odG1sIi8+Ci0gICAgICA8dG9waWMgbGFiZWw9IkNyZWF0ZSBhIHRhc2siIGhyZWY9Imh0bWwvaGVscC9jcmVhdGVfdGFzay5odG1sIi8+Ci0gICAgICA8dG9waWMgbGFiZWw9IkNyZWF0ZSBhIHdvcmsgcHJvZHVjdCIgaHJlZj0iaHRtbC9oZWxwL2NyZWF0ZV93b3JrcHJvZHVjdC5odG1sIi8+Ci0gICAgICA8dG9waWMgbGFiZWw9IkNyZWF0ZSBndWlkYW5jZSIgaHJlZj0iaHRtbC9oZWxwL2NyZWF0ZV9ndWlkYW5jZS5odG1sIi8+Ci0gICAgICA8dG9waWMgbGFiZWw9Ik1ldGhvZCBDb250ZW50IFZhcmlhYmlsaXR5IiBocmVmPSJodG1sL2hlbHAvdmFyaWFiaWxpdHkuaHRtbCI+Ci0gICAgICAgICA8dG9waWMgbGFiZWw9IkNvbnRyaWJ1dGVzIiBocmVmPSJodG1sL2hlbHAvdmFyaWFiaWxpdHlfY29udHJpYnV0ZXMuaHRtbCIvPgotICAgICAgICAgPHRvcGljIGxhYmVsPSJFeHRlbmRzIiBocmVmPSJodG1sL2hlbHAvdmFyaWFiaWxpdHlfZXh0ZW5kcy5odG1sIi8+Ci0gICAgICAgICA8dG9waWMgbGFiZWw9IlJlcGxhY2VzIiBocmVmPSJodG1sL2hlbHAvdmFyaWFiaWxpdHlfcmVwbGFjZS5odG1sIi8+Ci0gICAgICAgICA8dG9waWMgbGFiZWw9IkFzc29jaWF0aW9ucyBpbXBhY3RlZCBieSB2YXJpYWJpbGl0eSIgaHJlZj0iaHRtbC9oZWxwL3ZhcmlhYmlsaXR5X2Fzc29jaWF0aW9ucy5odG1sIi8+Ci0gICAgICAgICA8dG9waWMgbGFiZWw9IkJyb3dzaW5nIHZhcmlhYmlsaXR5IGFzc29jaWF0aW9ucyIgaHJlZj0iaHRtbC9oZWxwL3ZhcmlhYmlsaXR5X2Jyb3dzaW5nLmh0bWwiLz4KLSAgICAgIDwvdG9waWM+Ci0gICA8L3RvcGljPgotICAgPHRvcGljIGxhYmVsPSJCcm93c2UgYW5kIHByZXZpZXcgbWV0aG9kIGNvbnRlbnQiIGhyZWY9Imh0bWwvaGVscC9icm93c2VfY29udGVudC5odG1sIi8+Ci0gICA8dG9waWMgbGFiZWw9IkNyZWF0aW5nIGluZGV4IGVudHJpZXMiIGhyZWY9Imh0bWwvaGVscC9pbmRleGluZy5odG1sIi8+Ci0gICA8dG9waWMgbGFiZWw9IkNyZWF0aW5nIGdsb3NzYXJ5IGVudHJpZXMiIGhyZWY9Imh0bWwvaGVscC9nbG9zc2FyeV9lbnRyaWVzLmh0bWwiLz4KLSAgIDx0b3BpYyBsYWJlbD0iQ2hhbmdpbmcgY29weXJpZ2h0IG5vdGljZXMiIGhyZWY9Imh0bWwvaGVscC9jaGFuZ2luZ19jb3B5cmlnaHQuaHRtbCIvPgotPC90b3BpYz4KLQotICA8IS0tIENhdGVnb3JpemluZyBtZXRob2QgY29udGVudCAtLT4KLSAgPHRvcGljIGxhYmVsPSJDYXRlZ29yaXppbmcgbWV0aG9kIGNvbnRlbnQiPgotICA8dG9waWMgbGFiZWw9Ik1ldGhvZCBjb250ZW50IGNhdGVnb3JpZXMiIGhyZWY9Imh0bWwvaGVscC9jb250ZW50X2NhdGVnb3JpZXMuaHRtbCIvPgotICA8dG9waWMgbGFiZWw9IkNyZWF0ZSBhIG1ldGhvZCB2aWV3IHdpdGggY3VzdG9tIGNhdGVnb3JpZXMiIGhyZWY9Imh0bWwvaGVscC9jcmVhdGVfY3VzdG9tX2NhdGVnb3JpZXMuaHRtbCIvPjwvdG9waWM+Ci0KLSAgPCEtLSBDcmVhdGluZyBwcm9jZXNzZXMgLS0+Ci0gIDx0b3BpYyBsYWJlbD0iQ3JlYXRpbmcgcHJvY2Vzc2VzIj4KLSAgPHRvcGljIGxhYmVsPSJDcmVhdGUgYSByZXVzYWJsZSBjYXBhYmlsaXR5IHBhdHRlcm4iIGhyZWY9Imh0bWwvaGVscC9jcmVhdGVfY2FwYWJpbGl0eV9wYXR0ZXJuLmh0bWwiLz4KLSAgPHRvcGljIGxhYmVsPSJDcmVhdGUgYSBkZWxpdmVyeSBwcm9jZXNzIiBocmVmPSJodG1sL2hlbHAvY3JlYXRlX2RlbGl2ZXJ5X3Byb2Nlc3MuaHRtbCI+Ci0gIDx0b3BpYyBsYWJlbD0iRGV2ZWxvcCBhIHdvcmsgYnJlYWtkb3duIHN0cnVjdHVyZSIgaHJlZj0iaHRtbC9oZWxwL2RldmVsb3Bfd2JzLmh0bWwiLz4KLSAgPHRvcGljIGxhYmVsPSJEZXZlbG9wIGEgdGVhbSBhbGxvY2F0aW9uIHN0cnVjdHVyZSIgaHJlZj0iaHRtbC9oZWxwL2RldmVsb3BfdGVhbV9zdHJ1Y3R1cmUuaHRtbCIvPgotICA8dG9waWMgbGFiZWw9IkRldmVsb3AgYSB3b3JrIHByb2R1Y3QgdXNhZ2Ugc3RydWN0dXJlIiBocmVmPSJodG1sL2hlbHAvZGV2ZWxvcF93b3JrcHJvZHVjdF9zdHJ1Y3R1cmUuaHRtbCIvPgotICA8dG9waWMgbGFiZWw9IkFwcGx5IGEgY2FwYWJpbGl0eSBwYXR0ZXJuIiBocmVmPSJodG1sL2hlbHAvYXBwbHlfY2FwYWJpbGl0eXBhdHRlcm4uaHRtbCIvPgotICA8dG9waWMgbGFiZWw9IlByb2Nlc3MgZWxlbWVudCBwcm9wZXJ0aWVzIFZpZXciIGhyZWY9Imh0bWwvaGVscC9wcm9wZXJ0aWVzX3ZpZXcuaHRtbCIvPgotICA8dG9waWMgbGFiZWw9IlVzaW5nIGRlZXAgY29weSIgaHJlZj0iaHRtbC9oZWxwL3VzaW5nX2RlZXBfY29weS5odG1sIi8+Ci0gIDx0b3BpYyBsYWJlbD0iVXNpbmcgYWN0aXZpdHkgdmFyaWFiaWxpdHkiIGhyZWY9Imh0bWwvaGVscC91c2luZ19hY3Rpdml0eV92YXJpYWJpbGl0eS5odG1sIi8+Ci0gIDx0b3BpYyBsYWJlbD0iV29ya2luZyB3aXRoIHByb2Nlc3MgZGlhZ3JhbXMiIGhyZWY9Imh0bWwvaGVscC9wcm9jZXNzX2RpYWdyYW1zLmh0bWwiPgotICA8dG9waWMgbGFiZWw9Ildvcmtpbmcgd2l0aCBhY3Rpdml0eSBkaWFncmFtcyIgaHJlZj0iaHRtbC9oZWxwL2FjdGl2aXR5X2RpYWdyYW1zLmh0bWwiLz4KLSAgPHRvcGljIGxhYmVsPSJXb3JraW5nIHdpdGggYWN0aXZpdHkgZGV0YWlsIGRpYWdyYW1zIiBocmVmPSJodG1sL2hlbHAvYWN0aXZpdHlfZGV0YWlsX2RpYWdyYW1zLmh0bWwiLz4KLQotICA8L3RvcGljPgotCi0gIDwhLS0gUHVibGlzaGluZyBNZXRob2QgQ29udGVudCAtLT4KLSAgPHRvcGljIGxhYmVsPSJQdWJsaXNoaW5nIGFuZCBleHBvcnRpbmcgbWV0aG9kIGNvbnRlbnQiPgotICAgPHRvcGljIGxhYmVsPSJQdWJsaXNoaW5nIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24gdG8gYSBtZXRob2Qgd2ViIiBocmVmPSJodG1sL2hlbHAvcHVibGlzaGluZy5odG1sIi8+Ci0gICA8dG9waWMgbGFiZWw9IkV4cG9ydGluZyB0byBNaWNyb3NvZnQgUHJvamVjdCIgaHJlZj0iaHRtbC9oZWxwL2V4cG9ydF90b19tc3Byb2plY3QuaHRtbCIvPgotICAgPHRvcGljIGxhYmVsPSJYTUwgSW1wb3J0L0V4cG9ydCIgaHJlZj0iaHRtbC9oZWxwL2V4cG9ydF90b194bWwuaHRtbCIvPgotIDwvdG9waWM+Ci0KLSAgPCEtLSBXb3JraW5nIHdpdGggVGV4dHVhbCBEZXNjcmlwdGlvbnMgLS0+Ci0gPHRvcGljIGxhYmVsPSJSaWNoIHRleHQgZWRpdG9yIiBocmVmPSJodG1sL2hlbHAvcmljaHRleHRlZGl0b3IuaHRtbCIvPgotICAgPHRvcGljIGxhYmVsPSJBZGQgYSByZWZlcmVuY2Ugb3IgaHlwZXJsaW5rIiBocmVmPSJodG1sL2hlbHAvYWRkX2h5cGVybGluay5odG1sIi8+Ci0gIDwvdG9waWM+Ci0gIDwvdG9waWM+Ci08L3RvYz4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy90b2MueG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL3RvYy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4NTk2YzguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL3RvYy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9OTFMgVFlQRT0ib3JnLmVjbGlwc2UuaGVscC50b2MiPz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotPHRvYyBsYWJlbD0iRWNsaXBzZSBQcm9jZXNzIEZyYW1ld29yayBDb21wb3NlciIgdG9waWM9Imh0bWwvdG9jLmh0bWwiPgotICAgPHRvcGljIGxhYmVsPSJHZXR0aW5nIFN0YXJ0ZWQiPgotICAgICAgPGFuY2hvciBpZD0iZ2V0dGluZ3N0YXJ0ZWQiLz4KLSAgIDwvdG9waWM+Ci0gICA8dG9waWMgbGFiZWw9IkNvbmNlcHRzIj4KLSAgICAgIDxhbmNob3IgaWQ9ImNvbmNlcHRzIi8+Ci0gICA8L3RvcGljPgotICAgPHRvcGljIGxhYmVsPSJUYXNrcyI+Ci0gICAgICA8YW5jaG9yIGlkPSJ0YXNrcyIvPgotICAgPC90b3BpYz4KLSAgIDx0b3BpYyBsYWJlbD0iUmVmZXJlbmNlIj4KLSAgICAgIDxhbmNob3IgaWQ9InJlZmVyZW5jZSIvPgotICAgPC90b3BpYz4KLSAgIDx0b3BpYyBsYWJlbD0iU2FtcGxlcyI+Ci0gICAgICA8YW5jaG9yIGlkPSJzYW1wbGVzIi8+Ci0gICA8L3RvcGljPgotPC90b2M+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvdG9jY29uY2VwdHMueG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL3RvY2NvbmNlcHRzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDYwOWUxMS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvdG9jY29uY2VwdHMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/TkxTIFRZUEU9Im9yZy5lY2xpcHNlLmhlbHAudG9jIj8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLTx0b2MgbGFiZWw9IkNvbmNlcHRzIiBsaW5rX3RvPSJ0b2MueG1sI2NvbmNlcHRzIj4gCi0JPHRvcGljIGxhYmVsPSJNYWluIFRvcGljIiAgaHJlZj0iaHRtbC9jb25jZXB0cy9tYWludG9waWMuaHRtbCI+IAotCQk8dG9waWMgbGFiZWw9IlN1YiBUb3BpYyIgaHJlZj0iaHRtbC9jb25jZXB0cy9zdWJ0b3BpYy5odG1sIiAvPiAKLQk8L3RvcGljPgotCTx0b3BpYyBsYWJlbD0iTWFpbiBUb3BpYyAyIj4KLQkJPHRvcGljIGxhYmVsPSJTdWIgVG9waWMgMiIgaHJlZj0iaHRtbC9jb25jZXB0cy9zdWJ0b3BpYzIuaHRtbCIgLz4gCi0JPC90b3BpYz4gCi08L3RvYz4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy90b2NnZXR0aW5nc3RhcnRlZC54bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvdG9jZ2V0dGluZ3N0YXJ0ZWQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZmFiMzE3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy90b2NnZXR0aW5nc3RhcnRlZC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9OTFMgVFlQRT0ib3JnLmVjbGlwc2UuaGVscC50b2MiPz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotPHRvYyBsYWJlbD0iR2V0dGluZyBTdGFydGVkIiBsaW5rX3RvPSJ0b2MueG1sI2dldHRpbmdzdGFydGVkIj4gCi0JPHRvcGljIGxhYmVsPSJNYWluIFRvcGljIiAgaHJlZj0iaHRtbC9nZXR0aW5nc3RhcnRlZC9tYWludG9waWMuaHRtbCI+IAotCQk8dG9waWMgbGFiZWw9IlN1YiBUb3BpYyIgaHJlZj0iaHRtbC9nZXR0aW5nc3RhcnRlZC9zdWJ0b3BpYy5odG1sIiAvPiAKLQk8L3RvcGljPgotCTx0b3BpYyBsYWJlbD0iTWFpbiBUb3BpYyAyIj4KLQkJPHRvcGljIGxhYmVsPSJTdWIgVG9waWMgMiIgaHJlZj0iaHRtbC9nZXR0aW5nc3RhcnRlZC9zdWJ0b3BpYzIuaHRtbCIgLz4KLQk8L3RvcGljPiAKLTwvdG9jPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL3RvY3JlZmVyZW5jZS54bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvdG9jcmVmZXJlbmNlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTU1YzVhMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvdG9jcmVmZXJlbmNlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P05MUyBUWVBFPSJvcmcuZWNsaXBzZS5oZWxwLnRvYyI/PgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08dG9jIGxhYmVsPSJSZWZlcmVuY2UiIGxpbmtfdG89InRvYy54bWwjcmVmZXJlbmNlIj4gCi0JPHRvcGljIGxhYmVsPSJNYWluIFRvcGljIiAgaHJlZj0iaHRtbC9yZWZlcmVuY2UvbWFpbnRvcGljLmh0bWwiPiAKLQkJPHRvcGljIGxhYmVsPSJTdWIgVG9waWMiIGhyZWY9Imh0bWwvcmVmZXJlbmNlL3N1YnRvcGljLmh0bWwiIC8+IAotCTwvdG9waWM+Ci0JPHRvcGljIGxhYmVsPSJNYWluIFRvcGljIDIiPgotCQk8dG9waWMgbGFiZWw9IlN1YiBUb3BpYyAyIiBocmVmPSJodG1sL3JlZmVyZW5jZS9zdWJ0b3BpYzIuaHRtbCIgLz4gCi0JPC90b3BpYz4gCi08L3RvYz4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy90b2NzYW1wbGVzLnhtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy90b2NzYW1wbGVzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODk3ZWZiNy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvdG9jc2FtcGxlcy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9OTFMgVFlQRT0ib3JnLmVjbGlwc2UuaGVscC50b2MiPz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotPHRvYyBsYWJlbD0iU2FtcGxlcyIgbGlua190bz0idG9jLnhtbCNzYW1wbGVzIj4gCi0JPHRvcGljIGxhYmVsPSJNYWluIFRvcGljIiAgaHJlZj0iaHRtbC9zYW1wbGVzL21haW50b3BpYy5odG1sIj4gCi0JCTx0b3BpYyBsYWJlbD0iU3ViIFRvcGljIiBocmVmPSJodG1sL3NhbXBsZXMvc3VidG9waWMuaHRtbCIgLz4gCi0JPC90b3BpYz4KLQk8dG9waWMgbGFiZWw9Ik1haW4gVG9waWMgMiI+Ci0JCTx0b3BpYyBsYWJlbD0iU3ViIFRvcGljIDIiIGhyZWY9Imh0bWwvc2FtcGxlcy9zdWJ0b3BpYzIuaHRtbCIgLz4gCi0JPC90b3BpYz4gCi08L3RvYz4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy90b2N0YXNrcy54bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvdG9jdGFza3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MjE0NTQ0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy90b2N0YXNrcy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9OTFMgVFlQRT0ib3JnLmVjbGlwc2UuaGVscC50b2MiPz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotPHRvYyBsYWJlbD0iVGFza3MiIGxpbmtfdG89InRvYy54bWwjdGFza3MiPiAKLQk8dG9waWMgbGFiZWw9Ik1haW4gVG9waWMiICBocmVmPSJodG1sL3Rhc2tzL21haW50b3BpYy5odG1sIj4gCi0JCTx0b3BpYyBsYWJlbD0iU3ViIFRvcGljIiBocmVmPSJodG1sL3Rhc2tzL3N1YnRvcGljLmh0bWwiIC8+IAotCTwvdG9waWM+Ci0JPHRvcGljIGxhYmVsPSJNYWluIFRvcGljIDIiPgotCQk8dG9waWMgbGFiZWw9IlN1YiBUb3BpYyAyIiBocmVmPSJodG1sL3Rhc2tzL3N1YnRvcGljMi5odG1sIiAvPiAKLQk8L3RvcGljPiAKLTwvdG9jPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL3R1dG9yaWFscy54bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvdHV0b3JpYWxzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGNhODY4ZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvdHV0b3JpYWxzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08P05MUyAgVFlQRT0ib3JnLmVjbGlwc2UuaGVscC50b2MiPz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotPHRvYyBsYWJlbD0iVHV0b3JpYWxzIiBsaW5rX3RvPSJtYWluLnhtbCN0dXRvcmlhbHNfaWQiPgotICAgPHRvcGljIGxhYmVsPSJFeHBsb3JlIHRoZSB1c2VyIGludGVyZmFjZSIgaHJlZj0iaHRtbC90dXRvcmlhbHMvdHV0MV9pbnRyby5odG0iPgotCTx0b3BpYyBsYWJlbD0iQ29uY2VwdHMiIGhyZWY9Imh0bWwvdHV0b3JpYWxzL3R1dDFfY29uY2VwdHMuaHRtIiAvPiAKLSAgIAk8dG9waWMgbGFiZWw9IkJhc2ljIG5hdmlnYXRpb24iIGhyZWY9Imh0bWwvdHV0b3JpYWxzL3R1dDFfZXgxLmh0bSIgLz4KLSAgIAk8dG9waWMgbGFiZWw9IkJyb3dzZSBtZXRob2QgY29udGVudCIgaHJlZj0iaHRtbC90dXRvcmlhbHMvdHV0MV9leDIuaHRtIiAvPgotICAgCTx0b3BpYyBsYWJlbD0iQnJvd3NlIHByb2Nlc3MgY29udGVudCIgaHJlZj0iaHRtbC90dXRvcmlhbHMvdHV0MV9leDMuaHRtIiAvPgotICAgCTx0b3BpYyBsYWJlbD0iQnJvd3NlIHdoaWxlIGF1dGhvcmluZyIgaHJlZj0iaHRtbC90dXRvcmlhbHMvdHV0MV9leDQuaHRtIiAvPgotICAgCTx0b3BpYyBsYWJlbD0iU2VhcmNoIiBocmVmPSJodG1sL3R1dG9yaWFscy90dXQxX2V4NS5odG0iIC8+Ci0gICA8L3RvcGljPgotICAgPHRvcGljIGxhYmVsPSJDcmVhdGUgbWV0aG9kIGNvbnRlbnQiIGhyZWY9Imh0bWwvdHV0b3JpYWxzL3R1dDJfaW50cm8uaHRtIj4KLQk8dG9waWMgbGFiZWw9IkNvbmNlcHRzIiBocmVmPSJodG1sL3R1dG9yaWFscy90dXQyX2NvbmNlcHRzLmh0bSIgLz4gCi0JPHRvcGljIGxhYmVsPSJDcmVhdGUgYSBjb250ZW50IHBhY2thZ2UiIGhyZWY9Imh0bWwvdHV0b3JpYWxzL3R1dDJfZXgxLmh0bSIgLz4KLQk8dG9waWMgbGFiZWw9IkNyZWF0ZSBhIHdvcmsgcHJvZHVjdCIgaHJlZj0iaHRtbC90dXRvcmlhbHMvdHV0Ml9leDIuaHRtIiAvPgotCTx0b3BpYyBsYWJlbD0iQ3JlYXRlIGEgcm9sZSIgaHJlZj0iaHRtbC90dXRvcmlhbHMvdHV0Ml9leDMuaHRtIiAvPgotCTx0b3BpYyBsYWJlbD0iQ3JlYXRlIGEgdGFzayIgaHJlZj0iaHRtbC90dXRvcmlhbHMvdHV0Ml9leDQuaHRtIiAvPgotCTx0b3BpYyBsYWJlbD0iV29yayB3aXRoIHN0ZXBzIiBocmVmPSJodG1sL3R1dG9yaWFscy90dXQyX2V4NS5odG0iIC8+Ci0gICAJPHRvcGljIGxhYmVsPSJDcmVhdGUgYSBndWlkYW5jZSIgaHJlZj0iaHRtbC90dXRvcmlhbHMvdHV0Ml9leDYuaHRtIiAvPgotICAgCTx0b3BpYyBsYWJlbD0iTWFuYWdlIGd1aWRhbmNlIiBocmVmPSJodG1sL3R1dG9yaWFscy90dXQyX2V4Ny5odG0iIC8+Ci0gICAJPHRvcGljIGxhYmVsPSJDcmVhdGUgYSBzdGFuZGFyZCBjYXRlZ29yeSIgaHJlZj0iaHRtbC90dXRvcmlhbHMvdHV0Ml9leDguaHRtIiAvPgotICAgCTx0b3BpYyBsYWJlbD0iQWRkIGEgcGx1Zy1pbiIgaHJlZj0iaHRtbC90dXRvcmlhbHMvdHV0Ml9leDkuaHRtIiAvPgotICAgPC90b3BpYz4KLSAgIDx0b3BpYyBsYWJlbD0iUmV1c2UgbWV0aG9kIGNvbnRlbnQiIGhyZWY9Imh0bWwvdHV0b3JpYWxzL3R1dDNfaW50cm8uaHRtIj4KLSAgIAk8dG9waWMgbGFiZWw9IkNvbmNlcHRzIiBocmVmPSJodG1sL3R1dG9yaWFscy90dXQzX2NvbmNlcHRzLmh0bSIgLz4gCi0gICAJPHRvcGljIGxhYmVsPSJDb250cmlidXRlIHRvIGEgcm9sZSIgaHJlZj0iaHRtbC90dXRvcmlhbHMvdHV0M19leDEuaHRtIiAvPgotICAgCTx0b3BpYyBsYWJlbD0iQ29udHJpYnV0ZSB0byBhIHdvcmsgcHJvZHVjdCIgaHJlZj0iaHRtbC90dXRvcmlhbHMvdHV0M19leDIuaHRtIiAvPgotICAgCTx0b3BpYyBsYWJlbD0iQ29udHJpYnV0ZSB0byBhIHRhc2siIGhyZWY9Imh0bWwvdHV0b3JpYWxzL3R1dDNfZXgzLmh0bSIgLz4KLSAgIAk8dG9waWMgbGFiZWw9IkV4dGVuZCBhIHJvbGUiIGhyZWY9Imh0bWwvdHV0b3JpYWxzL3R1dDNfZXg0Lmh0bSIgLz4KLSAgIAk8dG9waWMgbGFiZWw9IkV4dGVuZCBhIHdvcmsgcHJvZHVjdCIgaHJlZj0iaHRtbC90dXRvcmlhbHMvdHV0M19leDUuaHRtIiAvPgotICAgCTx0b3BpYyBsYWJlbD0iRXh0ZW5kIGEgdGFzayIgaHJlZj0iaHRtbC90dXRvcmlhbHMvdHV0M19leDYuaHRtIiAvPgotICAgCTx0b3BpYyBsYWJlbD0iUmVwbGFjZSBhIHJvbGUiIGhyZWY9Imh0bWwvdHV0b3JpYWxzL3R1dDNfZXg3Lmh0bSIgLz4KLSAgIDwvdG9waWM+Ci0gICA8dG9waWMgbGFiZWw9Ildvcmtpbmcgd2l0aCBwcm9jZXNzZXMiIGhyZWY9Imh0bWwvdHV0b3JpYWxzL3R1dDVfaW50cm8uaHRtIj4KLSAgICAgICAJPHRvcGljIGxhYmVsPSJDb25jZXB0cyIgaHJlZj0iaHRtbC90dXRvcmlhbHMvdHV0NV9jb25jZXB0cy5odG0iIC8+IAotICAgCTx0b3BpYyBsYWJlbD0iQnJvd3NlIHByb2Nlc3MgY29udGVudCIgaHJlZj0iaHRtbC90dXRvcmlhbHMvdHV0NV9leDEuaHRtIiAvPgotICAgCTx0b3BpYyBsYWJlbD0iRXhwbG9yZSBwcm9jZXNzIGNvbnRlbnQiIGhyZWY9Imh0bWwvdHV0b3JpYWxzL3R1dDVfZXgyLmh0bSIgLz4KLSAgIAk8dG9waWMgbGFiZWw9IkNyZWF0ZSBhIGRlbGl2ZXJ5IHByb2Nlc3MiIGhyZWY9Imh0bWwvdHV0b3JpYWxzL3R1dDVfZXgzLmh0bSIgLz4KLSAgIAk8dG9waWMgbGFiZWw9IlVzZSBjYXBhYmlsaXR5IHBhdHRlcm5zIiBocmVmPSJodG1sL3R1dG9yaWFscy90dXQ1X2V4NC5odG0iIC8+Ci0gICAJPHRvcGljIGxhYmVsPSJDcmVhdGUgYSBwcm9jZXNzIGRpYWdyYW0iIGhyZWY9Imh0bWwvdHV0b3JpYWxzL3R1dDVfZXg1Lmh0bSIgLz4KLSAgIDwvdG9waWM+Ci0gICA8dG9waWMgbGFiZWw9IlB1Ymxpc2hpbmcgbWV0aG9kIGNvbnRlbnQiIGhyZWY9Imh0bWwvdHV0b3JpYWxzL3R1dDRfaW50cm8uaHRtIj4KLSAgICAgICAJPHRvcGljIGxhYmVsPSJDb25jZXB0cyIgaHJlZj0iaHRtbC90dXRvcmlhbHMvdHV0NF9jb25jZXB0cy5odG0iIC8+IAotICAgCTx0b3BpYyBsYWJlbD0iUHVibGlzaCBhIGNvbmZpZ3VyYXRpb24iIGhyZWY9Imh0bWwvdHV0b3JpYWxzL3R1dDRfZXgxLmh0bSIgLz4KLSAgIAk8dG9waWMgbGFiZWw9IkNyZWF0ZSBhIGN1c3RvbSBjYXRlZ29yeSIgaHJlZj0iaHRtbC90dXRvcmlhbHMvdHV0NF9leDIuaHRtIiAvPgotICAgCTx0b3BpYyBsYWJlbD0iQ3JlYXRlIGEgY3VzdG9tIGNvbmZpZ3VyYXRpb24iIGhyZWY9Imh0bWwvdHV0b3JpYWxzL3R1dDRfZXgzLmh0bSIgLz4KLSAgIAk8dG9waWMgbGFiZWw9IlB1Ymxpc2ggYSBjdXN0b20gY29uZmlndXJhdGlvbiIgaHJlZj0iaHRtbC90dXRvcmlhbHMvdHV0NF9leDQuaHRtIiAvPgotICAgPC90b3BpYz4KLTwvdG9jPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL3ZlcnNpb25fY29udHJvbC54bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvdmVyc2lvbl9jb250cm9sLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWZjYzIyNy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvdmVyc2lvbl9jb250cm9sLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08P05MUyAgVFlQRT0ib3JnLmVjbGlwc2UuaGVscC50b2MiPz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotCi08dG9jIGxhYmVsPSJVc2luZyB2ZXJzaW9uIGNvbnRyb2wgc3lzdGVtcyIgbGlua190bz0ibWFpbi54bWwjdmVyc2lvbl9jb250cm9sX2lkIj4KLSAgIDx0b3BpYyBsYWJlbD0iVXNpbmcgUmF0aW9uYWwgQ2xlYXJDYXNlIiA+Ci0gICAJPHRvcGljIGxhYmVsPSJJbnRlZ3JhdGlvbiB3aXRoIFJhdGlvbmFsIENsZWFyQ2FzZSIgaHJlZj0iaHRtbC90b3BpY3MvY19jbGVhcmNhc2Vfb3ZlcnZpZXcuaHRtbCIvPgotIAk8dG9waWMgbGFiZWw9Ikluc3RhbGxpbmcgYW5kIGNvbmZpZ3VyaW5nIFJhdGlvbmFsIENsZWFyQ2FzZSIgaHJlZj0iaHRtbC90b3BpY3MvdF9jbGVhcmNhc2VfaW5zdGFsbC5odG1sIi8+Ci0JPHRvcGljIGxhYmVsPSJJbnN0YWxsaW5nIGFuZCBjb25maWd1cmluZyBSYXRpb25hbCBDQ1JDIiBocmVmPSJodG1sL3RvcGljcy90X2NsZWFyY2FzZV9jY3JjX2luc3RhbGwuaHRtbCIvPiAgIAotICAgIAk8dG9waWMgbGFiZWw9IkNyZWF0aW5nIGEgQ2xlYXJDYXNlIHZpZXciIGhyZWY9Imh0bWwvdG9waWNzL3RfY2xlYXJjYXNlX2NyZWF0ZV92aWV3Lmh0bWwiLz4KLSAgIAk8dG9waWMgbGFiZWw9IkNyZWF0aW5nIGEgdmlldyIgaHJlZj0iaHRtbC90b3BpY3MvdF9jbGVhcmNhc2VfbmV3X3ZpZXcuaHRtbCIvPgotIAk8dG9waWMgbGFiZWw9IlVzaW5nIENsZWFyQ2FzZSBkeW5hbWljIHZpZXdzIiBocmVmPSJodG1sL3RvcGljcy90X2NsZWFyY2FzZV9keW5hbWljX3ZpZXdzLmh0bWwiLz4KLSAgIAk8dG9waWMgbGFiZWw9IkFkZGluZyBhIG5ldyBsaWJyYXJ5IHRvIENsZWFyQ2FzZSIgaHJlZj0iaHRtbC90b3BpY3MvdF9jbGVhcmNhc2VfbmV3X2xpYnJhcnkuaHRtbCIvPgotCTx0b3BpYyBsYWJlbD0iQWRkaW5nIGFuIGV4aXN0aW5nIGxpYnJhcnkgdG8gQ2xlYXJDYXNlIiBocmVmPSJodG1sL3RvcGljcy90X2NsZWFyY2FzZV9leGlzdGluZ19saWJyYXJ5Lmh0bWwiLz4KLSAgIAk8dG9waWMgbGFiZWw9IkltcG9ydGluZyBhIGxpYnJhcnkgY29uZmlndXJhdGlvbiB3aXRoIENsZWFyQ2FzZSIgaHJlZj0iaHRtbC90b3BpY3MvdF9jbGVhcmNhc2VfaW1wb3J0X2NvbmZpZ3VyYXRpb24uaHRtbCIvPgotICAJPHRvcGljIGxhYmVsPSJBZGRpbmcgYSBwbHVnLWluIHRvIENsZWFyQ2FzZSIgaHJlZj0iaHRtbC90b3BpY3MvdF9jbGVhcmNhc2VfYWRkX3BsdWdpbi5odG1sIi8+Ci0gIAk8dG9waWMgbGFiZWw9IkNyZWF0aW5nIGEgbmV3IGNvbmZpZ3VyYXRpb24gd2l0aCBDbGVhckNhc2UiIGhyZWY9Imh0bWwvdG9waWNzL3RfY2xlYXJjYXNlX25ld19jb25maWd1cmF0aW9uLmh0bWwiLz4KLSAgIAk8dG9waWMgbGFiZWw9IkFkZGluZyBhIGNvbnRlbnQgcGFja2FnZSB0byBDbGVhckNhc2UiIGhyZWY9Imh0bWwvdG9waWNzL3RfY2xlYXJjYXNlX2NvbnRlbnRfcGFja2FnZS5odG1sIi8+IAotICAgCTx0b3BpYyBsYWJlbD0iQWRkaW5nIGEgbmV3IG1ldGhvZCBlbGVtZW50IHRvIENsZWFyQ2FzZSIgaHJlZj0iaHRtbC90b3BpY3MvdF9jbGVhcmNhc2VfYWRkX2VsZW1lbnQuaHRtbCIvPgotICAJPHRvcGljIGxhYmVsPSJFZGl0aW5nIG1ldGhvZCBlbGVtZW50cyB3aXRoIENsZWFyQ2FzZSIgaHJlZj0iaHRtbC90b3BpY3MvdF9jbGVhcmNhc2VfZWRpdF9lbGVtZW50Lmh0bWwiLz4KLSAgIAk8dG9waWMgbGFiZWw9IkRlbGV0aW5nIG1ldGhvZCBlbGVtZW50cyB3aXRoIENsZWFyQ2FzZSIgaHJlZj0iaHRtbC90b3BpY3MvdF9jbGVhcmNhc2VfZGVsZXRlX2VsZW1lbnQuaHRtbCIvPgotICAgCTx0b3BpYyBsYWJlbD0iTW92aW5nIG1ldGhvZCBlbGVtZW50cyB3aXRoIENsZWFyQ2FzZSIgaHJlZj0iaHRtbC90b3BpY3MvdF9jbGVhcmNhc2VfbW92ZV9lbGVtZW50Lmh0bWwiLz4KLSAgIAk8dG9waWMgbGFiZWw9IkNyZWF0aW5nIGEgY2FwYWJpbGl0eSBwYXR0ZXJuIHdpdGggQ2xlYXJDYXNlIiBocmVmPSJodG1sL3RvcGljcy90X2NsZWFyY2FzZV9jYXBhYmlsaXR5X3BhdHRlcm4uaHRtbCIvPgotIAk8dG9waWMgbGFiZWw9Ik11bHRpLVVzZXIgc2NlbmFyaW9zIHdpdGggQ2xlYXJDYXNlIiBocmVmPSJodG1sL3RvcGljcy9jX2NsZWFyY2FzZV9tdWx0aXVzZXIuaHRtbCIvPgotICAJPHRvcGljIGxhYmVsPSJEaXNhYmxpbmcgUmF0aW9uYWwgQ0NSQyIgaHJlZj0iaHRtbC90b3BpY3MvdF9jbGVhcmNhc2VfY2NyY19kaXNhYmxlLmh0bWwiLz4KLSAgIDwvdG9waWM+Ci0gICA8dG9waWMgbGFiZWw9IlVzaW5nIENWUyIgPgotICAgCTx0b3BpYyBsYWJlbD0iSW5zdGFsbGluZyBhbmQgY29uZmlndXJpbmcgQ1ZTIiBocmVmPSJodG1sL3RvcGljcy90X2N2c19pbnN0YWxsLmh0bWwiLz4KLSAgIAk8dG9waWMgbGFiZWw9IkNyZWF0aW5nIGEgbmV3IHZpZXcgd2l0aCBDVlMiIGhyZWY9Imh0bWwvdG9waWNzL3RfY3ZzX25ld192aWV3Lmh0bWwiLz4KLSAgIAk8dG9waWMgbGFiZWw9IkFkZGluZyBhIG5ldyBsaWJyYXJ5IHRvIENWUyIgaHJlZj0iaHRtbC90b3BpY3MvdF9jdnNfbmV3X2xpYnJhcnkuaHRtbCIvPgotICAgCTx0b3BpYyBsYWJlbD0iQWRkaW5nIGEgcGx1Zy1pbiB0byBDVlMiIGhyZWY9Imh0bWwvdG9waWNzL3RfY3ZzX2FkZF9wbHVnaW4uaHRtbCIvPgotICAgCTx0b3BpYyBsYWJlbD0iQWRkaW5nIGFuIGVsZW1lbnQgdG8gQ1ZTIiBocmVmPSJodG1sL3RvcGljcy90X2N2c19hZGRfZWxlbWVudC5odG1sIi8+Ci0gICAJPHRvcGljIGxhYmVsPSJEZWxldGluZyBhbiBlbGVtZW50IHVuZGVyIENWUyIgaHJlZj0iaHRtbC90b3BpY3MvdF9jdnNfZGVsZXRlX2VsZW1lbnQuaHRtbCIvPgotICAgCTx0b3BpYyBsYWJlbD0iRWRpdGluZyBhbiBlbGVtZW50IHVuZGVyIENWUyIgaHJlZj0iaHRtbC90b3BpY3MvdF9jdnNfZWRpdF9lbGVtZW50Lmh0bWwiLz4KLSAgIAk8dG9waWMgbGFiZWw9Ik1vdmluZyBhbiBlbGVtZW50IHVuZGVyIENWUyIgaHJlZj0iaHRtbC90b3BpY3MvdF9jdnNfbW92ZV9lbGVtZW50Lmh0bWwiLz4KLSAgIDwvdG9waWM+Ci0gICA8dG9waWMgbGFiZWw9IlZlcnNpb24gY29udHJvbCByZWZlcmVuY2UiID4KLSAgIAk8dG9waWMgbGFiZWw9IlZlcnNpb24gY29udHJvbCBmb3Igc3BlY2lmaWMgZmlsZXMiIGhyZWY9Imh0bWwvdG9waWNzL3JfY2xlYXJjYXNlX2ZpbGVzLmh0bWwiLz4KLSAgIAk8dG9waWMgbGFiZWw9IkNvbW1vbiBhY3Rpb25zIGltcGFjdCBvbiBzcGVjaWZpYyBmaWxlcyIgaHJlZj0iaHRtbC90b3BpY3Mvcl9jbGVhcmNhc2VfYWN0aW9ucy5odG1sIi8+Ci0gICA8L3RvcGljPgotPC90b2M+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2Mvd29ya3dpdGh0ZXh0ZGVzYy54bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2Mvd29ya3dpdGh0ZXh0ZGVzYy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyODc2ZmQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL3dvcmt3aXRodGV4dGRlc2MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTw/TkxTICBUWVBFPSJvcmcuZWNsaXBzZS5oZWxwLnRvYyI/PgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08dG9jIGxhYmVsPSJXb3JraW5nIHdpdGggVGV4dHVhbCBEZXNjcmlwdGlvbnMiIGxpbmtfdG89Im1haW4ueG1sI3dvcmt3aXRodGV4dGRlc2NfaWQiPgotICAgPHRvcGljIGxhYmVsPSJSaWNoIFRleHQgRWRpdG9yIiBocmVmPSJodG1sL2hlbHAvcmljaHRleHRlZGl0b3IuaHRtbCIvPgotICAgPHRvcGljIGxhYmVsPSJBZGQgYSBSZWZlcmVuY2Ugb3IgSHlwZXJsaW5rIiBocmVmPSJodG1sL2hlbHAvYWRkX2h5cGVybGluay5odG1sIi8+Ci08L3RvYz4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sLy5jbGFzc3BhdGggYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0LnhtbC8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTFjOGYyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0LnhtbC8ub3B0aW9ucyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sLy5vcHRpb25zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMzlkMWRlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sLy5vcHRpb25zCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi0jIFR1cm4gb24gZGVidWcgdHJhY2UgZm9yIHRoZSB4bWwgaW1wb3J0IHBsdWctaW4KLW9yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sL2RlYnVnPXRydWUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sLy5wcm9qZWN0IGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyNzU5OWEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5lcGYuaW1wb3J0LnhtbDwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0LnhtbC9NRVRBLUlORi9NQU5JRkVTVC5NRiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZDM2ZWQ2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sO3NpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuNS4wLnF1YWxpZmllcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy54bWwuSW1wb3J0WE1MUGx1Z2luCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUsCi0gb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwsCi0gb3JnLmVjbGlwc2UudWksCi0gb3JnLmVjbGlwc2UuZXBmLmltcG9ydCwKLSBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpCi1FY2xpcHNlLUxhenlTdGFydDogdHJ1ZQotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcueG1sLAotIG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcueG1sLnByZWZlcmVuY2VzLAotIG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcueG1sLnNlcnZpY2VzLAotIG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcueG1sLndpemFyZHMKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwvYnVpbGQucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4YmNjMmYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotc291cmNlLi4gPSBzcmMvCi1vdXRwdXQuLiA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IC4sXAotICAgICAgICAgICAgICAgLm9wdGlvbnMsXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgaWNvbnMvCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0LnhtbC9pY29ucy9ldG9vbDE2L2ltcF94bWwuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwvaWNvbnMvZXRvb2wxNi9pbXBfeG1sLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZThlZTc0ZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0LnhtbC9pY29ucy9ldG9vbDE2L2ltcF94bWwuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwvaWNvbnMvZnVsbC93aXpiYW4vaW1wX3htbF93aXpiYW4uZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwvaWNvbnMvZnVsbC93aXpiYW4vaW1wX3htbF93aXpiYW4uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNWQ4NDZjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sL2ljb25zL2Z1bGwvd2l6YmFuL2ltcF94bWxfd2l6YmFuLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sL3BsdWdpbi5wcm9wZXJ0aWVzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1NTQ3ZmIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSCi0KLSMgUGx1Zy1pbgotcGx1Z2luTmFtZT1FUEYgSW1wb3J0IFhNTCBQbHVnLWluCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKLQotIyBJbXBvcnQgWE1MIFdpemFyZAotaW1wb3J0WE1MV2l6YXJkTmFtZT1YTUwKLWltcG9ydFhNTFdpemFyZERlc2NyaXB0aW9uPUltcG9ydCBtZXRob2QgbGlicmFyeSBjb250ZW50IHN0b3JlZCBpbiBhIFhNTCBmaWxlLgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwvcGx1Z2luLnhtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0NDVlNDkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08cGx1Z2luPgotCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkuaW1wb3J0V2l6YXJkcyI+Ci0gICAgICA8d2l6YXJkCi0gICAgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2UuZXBmLnVpLmltcG9ydFdpemFyZHMuY2F0ZWdvcnkiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy54bWwud2l6YXJkcy5JbXBvcnRYTUxXaXphcmQiCi0gICAgICAgICAgICBpY29uPSJpY29ucy9ldG9vbDE2L2ltcF94bWwuZ2lmIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcueG1sLndpemFyZHMuSW1wb3J0WE1MV2l6YXJkIgotICAgICAgICAgICAgbmFtZT0iJWltcG9ydFhNTFdpemFyZE5hbWUiPgotICAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgJWltcG9ydFhNTFdpemFyZERlc2NyaXB0aW9uCi0gICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgPC93aXphcmQ+Ci0gICA8L2V4dGVuc2lvbj4KLQotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmVwZi51aS5pbXBvcnRXaXphcmRzIj4KLSAgICAgIDx3aXphcmQgaWQ9Im9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcueG1sLndpemFyZHMuSW1wb3J0WE1MV2l6YXJkIi8+Ci0gICA8L2V4dGVuc2lvbj4KLQotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0LnhtbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy94bWwvSW1wb3J0WE1MUGx1Z2luLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0LnhtbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy94bWwvSW1wb3J0WE1MUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhNDFiY2UuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcveG1sL0ltcG9ydFhNTFBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy54bWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpLkFic3RyYWN0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0KLS8qKgotICogVGhlIG1haW4gcGx1Z2luIGNsYXNzIHRvIGJlIHVzZWQgaW4gdGhlIGRlc2t0b3AuCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKgotICovCi1wdWJsaWMgY2xhc3MgSW1wb3J0WE1MUGx1Z2luIGV4dGVuZHMgQWJzdHJhY3RQbHVnaW4gewotCi0JLy9UaGUgc2hhcmVkIGluc3RhbmNlLgotCXByaXZhdGUgc3RhdGljIEltcG9ydFhNTFBsdWdpbiBwbHVnaW47Ci0JcHJpdmF0ZSBVbWFQYWNrYWdlIHVtYVBhY2thZ2U7Ci0JCi0JLyoqCi0JICogVGhlIGNvbnN0cnVjdG9yLgotCSAqLwotCXB1YmxpYyBJbXBvcnRYTUxQbHVnaW4oKSB7Ci0JCXBsdWdpbiA9IHRoaXM7Ci0JCQotCQkvL0FsbG93IFVtYVBhY2thZ2UgYmUgaW5pdGlhbGl6ZWQgYmVmb3JlIGFueSBpbXBvcnQgYWN0aW9uCi0JCXVtYVBhY2thZ2UgPSBVbWFQYWNrYWdlLmVJTlNUQU5DRTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgdXBvbiBwbHVnLWluIGFjdGl2YXRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdGFydChjb250ZXh0KTsKLQkJCi0JCS8vIHNldCB0aGlzIHRvIGFsbG93IHBhcnNlIGxhcmdlIHhtbCBmaWxlCi0JCVN5c3RlbS5zZXRQcm9wZXJ0eSgiZW50aXR5RXhwYW5zaW9uTGltaXQiLCAiMTAwMDAwMDAwIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuIHRoZSBwbHVnLWluIGlzIHN0b3BwZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0b3AoY29udGV4dCk7Ci0JCXBsdWdpbiA9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2hhcmVkIGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSW1wb3J0WE1MUGx1Z2luIGdldERlZmF1bHQoKSB7Ci0JCXJldHVybiBwbHVnaW47Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0LnhtbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy94bWwvSW1wb3J0WE1MUmVzb3VyY2VzLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0LnhtbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy94bWwvSW1wb3J0WE1MUmVzb3VyY2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwMzJjNmQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcveG1sL0ltcG9ydFhNTFJlc291cmNlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy54bWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi0vKioKLSAqIFRoZSBFeHBvcnQgWE1MIG1lc3NhZ2UgcmVzb3VyY2UgYnVuZGxlIGFjY2Vzc29yIGNsYXNzLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEltcG9ydFhNTFJlc291cmNlcyBleHRlbmRzIE5MUyB7Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgQlVORExFX05BTUUgPSBJbXBvcnRYTUxSZXNvdXJjZXMuY2xhc3MuZ2V0UGFja2FnZSgpCi0JCQkuZ2V0TmFtZSgpCi0JCQkrICIuUmVzb3VyY2VzIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBJbXBvcnRYTUxSZXNvdXJjZXMoKSB7Ci0JCS8vIERvIG5vdCBpbnN0YW50aWF0ZQotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGltcG9ydFhNTFdpemFyZF90aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlbGVjdFhNTEZpbGVQYWdlX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VsZWN0WE1MRmlsZVBhZ2VfZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGZpbGVMYWJlbF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgYnJvd3NlQnV0dG9uX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBvcHRpb25Hcm91cF90ZXh0OwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG9wdGlvbkdyb3VwMV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgb3ZlcndyaXRlUmFkaW9CdXR0b25fdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG1lcmdlUmFkaW9CdXR0b25fdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGltcG9ydGluZ1hNTF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmV2aWV3X2xvZ19maWxlczsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGltcG9ydFhNTEVycm9yX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGltcG9ydFhNTEVycm9yX3JlYXNvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGludmFsaWRYTUxGaWxlX2Vycm9yOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgaW1wb3J0WE1MU2VydmljZV9lbGVtZW50X25vdF9oYW5kbGVkOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgaW1wb3J0WE1MU2VydmljZV9lbGVtZW50X3dpdGhvdXRfaWQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBpbXBvcnRYTUxTZXJ2aWNlX2ltcG9ydF9mYWlsZWQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBpbXBvcnRYTUxTZXJ2aWNlX21pc3NpbmdfcGx1Z2luOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgaW1wb3J0WE1MU2VydmljZV9lcnJvcl9taXNzaW5nX3BsdWdpbnM7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBsaWJyYXJ5X2Vycm9yX25vX2VjbGFzczsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGxpYnJhcnlfbm9fcGFja2FnZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGxpYnJhcnlfZXJyb3JfY3JlYXRlX2VsZW1lbnQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBsaWJyYXJ5X29iamVjdF9zdHJpbmc7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBsaWJyYXJ5X2Vycm9yX3NldF9hdHRyaWJ1dGVfMjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGxpYnJhcnlfZXJyb3Jfc2V0X2F0dHJpYnV0ZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGxpYnJhcnlfZXJyb3Jfc2V0X2F0dHJpYnV0ZV8zOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbGlicmFyeV9lcnJvcl9zZXRfcmVmZXJlbmNlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbGlicmFyeV9lcnJvcl9zZXRfcmVmZXJlbmNlXzI7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB2ZXJzaW9uTWlzbWF0Y2hfb2xkRGF0YTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHZlcnNpb25NaXNtYXRjaF9vbGREYXRhX3Vua25vd247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB2ZXJzaW9uTWlzbWF0Y2hfb2xkVG9vbDsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyB2ZXJzaW9uTWlzbWF0Y2hfb2xkVG9vbF91bmtub3duOwotCi0Jc3RhdGljIHsKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgSW1wb3J0WE1MUmVzb3VyY2VzLmNsYXNzKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcveG1sL1Jlc291cmNlcy5wcm9wZXJ0aWVzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcveG1sL1Jlc291cmNlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MWY0ZTNkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sL3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3htbC9SZXNvdXJjZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSCi0jCi0jIE1lc3NhZ2UgSUQgUmFuZ2U6Ci0jCi0KLSMgSW1wb3J0IFhNTCBXaXphcmQKLWltcG9ydFhNTFdpemFyZF90aXRsZT1JbXBvcnQgWE1MCi0KLSMgU2VsZWN0IEltcG9ydCBYTUwgRmlsZSBXaXphcmQgUGFnZQotc2VsZWN0WE1MRmlsZVBhZ2VfdGl0bGU9U3BlY2lmeSBpbXBvcnQgZmlsZQotc2VsZWN0WE1MRmlsZVBhZ2VfZGVzYz1TcGVjaWZ5IHRoZSBYTUwgZmlsZSBjb250YWluaW5nIHRoZSBtZXRob2QgbGlicmFyeSBjb250ZW50IHRvIGltcG9ydCwgYW5kIHNlbGVjdCB0aGUgYXBwcm9wcmlhdGUgaW1wb3J0IG9wZXJhdGlvbiB0byBwZXJmb3JtLgotZmlsZUxhYmVsX3RleHQ9WE1MIEZpbGU6Ci1icm93c2VCdXR0b25fdGV4dD1Ccm93c2UuLi4KLW9wdGlvbkdyb3VwX3RleHQ9TWVyZ2Ugb3B0aW9uCi1vcHRpb25Hcm91cDFfdGV4dD1DaGVjayBiYXNlIHBsdWctaW4gb3B0aW9uCi1vdmVyd3JpdGVSYWRpb0J1dHRvbl90ZXh0PU92ZXJyaWRlIGV4aXN0aW5nIG1ldGhvZCBsaWJyYXJ5IGNvbnRlbnQgd2l0aCB0aGUgaW1wb3J0ZWQgY29udGVudAotbWVyZ2VSYWRpb0J1dHRvbl90ZXh0PU1lcmdlIGltcG9ydGVkIGNvbnRlbnQgaW50byB0aGUgZXhpc3RpbmcgbWV0aG9kIGxpYnJhcnkKLQotIyBQcm9ncmVzcyBNZXNzYWdlcwotaW1wb3J0aW5nWE1MX3RleHQ9SW1wb3J0aW5nIFhNTCBsaWJyYXJ5IGNvbnRlbnQgaW50byB0aGUgY3VycmVudCBtZXRob2QgbGlicmFyeS4uLgotCi0jIEltcG9ydCBYTUwgRXJyb3IgRGlhbG9nCi1yZXZpZXdfbG9nX2ZpbGVzPVRoZSBpbXBvcnQgb3BlcmF0aW9uIGhhcyBiZWVuIGNvbXBsZXRlZC4gUmV2aWV3IHRoZSBsb2cgZmlsZXMgaW4gdGhlIFxuJyd7MH0nJyBmb2xkZXIgZm9yIGFueSBlcnJvcnMuCi1pbXBvcnRYTUxFcnJvcl9tc2c9SVVQTTAwMDBFOiBUaGUgaW1wb3J0IG9wZXJhdGlvbiBjYW5ub3QgcHJvY2VlZC4KLWltcG9ydFhNTEVycm9yX3JlYXNvbj1JVVBNMDAwOUU6IFRoZSBjdXJyZW50IG1ldGhvZCBsaWJyYXJ5IGlzIHJlYWQtb25seS5cblxuTWFrZSBzdXJlIHRoYXQgJyd7MH0nJyBpcyB3cml0YWJsZSBvciBjcmVhdGUgYSBuZXcgbWV0aG9kIGxpYnJhcnkgYW5kIHRyeSBhZ2Fpbi4KLQotIyBFcnJvciBNZXNzYWdlcwotaW52YWxpZFhNTEZpbGVfZXJyb3I9VGhlIHNwZWNpZmllZCBYTUwgZmlsZSBpcyBub3QgdmFsaWQuCi12ZXJzaW9uTWlzbWF0Y2hfb2xkRGF0YT1JVVBNMDAxMEU6IFRoZSBzcGVjaWZpZWQgWE1MIGZpbGUgd2FzIGV4cG9ydGVkIGJ5IGEgcHJldmlvdXMgdmVyc2lvbiAoezB9KSBvZiB7MX0uIFRoZSBmaWxlcyBtdXN0IGJlIGV4cG9ydGVkIHVzaW5nIHRoZSBjdXJyZW50IHZlcnNpb24gb2YgezF9LgotdmVyc2lvbk1pc21hdGNoX29sZERhdGFfdW5rbm93bj1JVVBNMDAxMUU6IFRoZSBzcGVjaWZpZWQgWE1MIGZpbGUgd2FzIGV4cG9ydGVkIGJ5IGEgcHJldmlvdXMgdmVyc2lvbiBvZiB7MH0uIFRoZSBmaWxlcyBtdXN0IGJlIGV4cG9ydGVkIHVzaW5nIHRoZSBjdXJyZW50IHZlcnNpb24gb2YgezB9LgotdmVyc2lvbk1pc21hdGNoX29sZFRvb2w9SVVQTTAwMTJFOiBUaGUgc3BlY2lmaWVkIFhNTCBmaWxlIHdhcyBleHBvcnRlZCBieSBhIG5ld2VyIHZlcnNpb24gKHswfSkgb2YgezF9LiBZb3UgbXVzdCB1cGdyYWRlIHsxfSBpbiBvcmRlciB0byBpbXBvcnQgdGhlIGZpbGUuICAKLXZlcnNpb25NaXNtYXRjaF9vbGRUb29sX3Vua25vd249SVVQTTAwMTNFOiBUaGUgc3BlY2lmaWVkIFhNTCBmaWxlIGNhbm5vdCBiZSBvcGVuZWQuIFlvdSBtdXN0IHVwZ3JhZGUgezB9IGluIG9yZGVyIHRvIGltcG9ydCB0aGUgZmlsZS4gIAotCi1pbXBvcnRYTUxTZXJ2aWNlX2VsZW1lbnRfbm90X2hhbmRsZWQ9RWxlbWVudCBub3QgaGFuZGxlZDogezB9Ci1pbXBvcnRYTUxTZXJ2aWNlX2VsZW1lbnRfd2l0aG91dF9pZD1FbGVtZW50IHdpdGhvdXQgSUQ6IHswfQotaW1wb3J0WE1MU2VydmljZV9pbXBvcnRfZmFpbGVkPUltcG9ydCBmYWlsZWQ6IHswfQotaW1wb3J0WE1MU2VydmljZV9taXNzaW5nX3BsdWdpbj1NaXNzaW5nIHJlcXVpcmVkIHBsdWctaW4gezB9Ci1pbXBvcnRYTUxTZXJ2aWNlX2Vycm9yX21pc3NpbmdfcGx1Z2lucz1NaXNzaW5nIHJlcXVpcmVkIHBsdWctaW4ocykuIFBsZWFzZSBjaGVjayB0aGUgbG9nIGZpbGVzIGZvciBkZXRhaWxzCi0KLWxpYnJhcnlfZXJyb3Jfbm9fZWNsYXNzPUVycm9yIGNyZWF0aW5nIENvbnRlbnRDYXRlZ29yeTogVW5hYmxlIHRvIGdldCBFQ2xhc3MgZm9yIHswfQotbGlicmFyeV9ub19wYWNrYWdlPVVuYWJsZSB0byBmaW5kIG93bmluZyBwYWNrYWdlIGZvciBvYmplY3QgezB9Ci1saWJyYXJ5X2Vycm9yX2NyZWF0ZV9lbGVtZW50PUVycm9yIGNyZWF0aW5nIGVsZW1lbnQ6IHswfQotbGlicmFyeV9vYmplY3Rfc3RyaW5nPW9iamVjdCB7MH0sIGZlYXR1cmUgezF9Ci1saWJyYXJ5X2Vycm9yX3NldF9hdHRyaWJ1dGVfMj1FcnJvciBzZXR0aW5nIGF0dHJpYnV0ZTogSW52YWxpZCBhdHRyaWJ1dGUgZmVhdHVyZSB2YWx1ZSB7MH0KLWxpYnJhcnlfZXJyb3Jfc2V0X2F0dHJpYnV0ZT1FcnJvciBzZXR0aW5nIGF0dHJpYnV0ZSBmb3Igb2JqZWN0IHswfSwgZmVhdHVyZSB7MX0sIGFuZCB2YWx1ZSB7Mn0KLWxpYnJhcnlfZXJyb3Jfc2V0X2F0dHJpYnV0ZV8zPURvIG5vdCBrbm93IGhvdyB0byBzZXQgYXR0cmlidXRlIGZvciBvYmplY3QgezB9LCBmZWF0dXJlIHsxfSwgYW5kIHZhbHVlIHsyfQotbGlicmFyeV9lcnJvcl9zZXRfcmVmZXJlbmNlPUVycm9yIHNldHRpbmcgcmVmZXJlbmNlIGZvciBmZWF0dXJlIHswfTogbm8gZWxlbWVudCB3aXRoIGlkIHsxfQotbGlicmFyeV9lcnJvcl9zZXRfcmVmZXJlbmNlXzI9RXJyb3Igc2V0dGluZyByZWZlcmVuY2UgZm9yIG9iamVjdCB7MH0sIGZlYXR1cmUgezF9LCBhbmQgdmFsdWUgezJ9Ci0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sL3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3htbC9wYWNrYWdlLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0LnhtbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy94bWwvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MWE3MjM0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sL3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3htbC9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyB0aGUgYWN0aXZhdG9yIGZvciBtYW5hZ2luZyB0aGUgSW1wb3J0IFhNTCBwbHVnLWluJ3MgbGlmZSBjeWNsZS4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0LnhtbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy94bWwvcHJlZmVyZW5jZXMvSW1wb3J0WE1MUHJlZmVyZW5jZXMuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sL3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3htbC9wcmVmZXJlbmNlcy9JbXBvcnRYTUxQcmVmZXJlbmNlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OGFlMTU5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sL3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3htbC9wcmVmZXJlbmNlcy9JbXBvcnRYTUxQcmVmZXJlbmNlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcueG1sLnByZWZlcmVuY2VzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy54bWwuSW1wb3J0WE1MUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLQotLyoqCi0gKiBUaGUgRXhwb3J0IFhNTCBwcmVmZXJlbmNlcy4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBJbXBvcnRYTUxQcmVmZXJlbmNlcyB7Ci0KLQkvKioKLQkgKiBUaGUgaW1wb3J0IFhNTCBmaWxlIHByZWZlcmVuY2Uga2V5LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9GSUxFID0gInhtbEZpbGUiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgbWVyZ2Ugb3B0aW9uIHByZWZlcmVuY2Uga2V5LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FUkdFX09QVElPTiA9ICJtZXJnZU9wdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBsYXN0IGltcG9ydCBjaGVjayBwbHVnaW5zIG9wdGlvbiBwcmVmZXJlbmNlIGtleQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENIRUNLX0JBU0VfUExVR0lOU19PUFRJT04gPSAiY2hlY2tCYXNlUGx1Z2luc09wdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQotCXN0YXRpYyB7Ci0JCS8vIEluaXRpYWxpemUgdGhlIGRlZmF1bHQgcHJlZmVyZW5jZSB2YWx1ZXMuCi0JCUlQcmVmZXJlbmNlU3RvcmUgc3RvcmUgPSBJbXBvcnRYTUxQbHVnaW4uZ2V0RGVmYXVsdCgpCi0JCQkJLmdldFByZWZlcmVuY2VTdG9yZSgpOwotCQlzdG9yZS5zZXREZWZhdWx0KFhNTF9GSUxFLCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJc3RvcmUuc2V0RGVmYXVsdChNRVJHRV9PUFRJT04sIGZhbHNlKTsgCi0JCXN0b3JlLnNldERlZmF1bHQoQ0hFQ0tfQkFTRV9QTFVHSU5TX09QVElPTiwgdHJ1ZSk7IAkKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBpbXBvcnQgWE1MIGZpbGUgcHJlZmVyZW5jZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBpbXBvcnQgWE1MIGZpbGUgcHJlZmVyZW5jZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFhNTEZpbGUoKSB7Ci0JCXJldHVybiBJbXBvcnRYTUxQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpLmdldFN0cmluZygKLQkJCQlYTUxfRklMRSk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgaW1wb3J0IFhNTCBmaWxlIHByZWZlcmVuY2UuCi0JICogCi0JICogQHBhcmFtIHBhdGgKLQkgKiAgICAgICAgICAgIHRoZSBhYnNvbHV0ZSBwYXRoIHRvIGEgWE1MIGZpbGUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0WE1MRmlsZShTdHJpbmcgcGF0aCkgewotCQlJbXBvcnRYTUxQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpLnNldFZhbHVlKFhNTF9GSUxFLAotCQkJCXBhdGgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1lcmdlIG9wdGlvbiBmaWxlIHByZWZlcmVuY2UuCi0JICogCi0JICogQHJldHVybiB0aGUgbWVyZ2Ugb3B0aW9uIGZpbGUgcHJlZmVyZW5jZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBnZXRNZXJnZU9wdGlvbigpIHsKLQkJcmV0dXJuIEltcG9ydFhNTFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkuZ2V0Qm9vbGVhbigKLQkJCQlNRVJHRV9PUFRJT04pOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIG1lcmdlIG9wdGlvbiBmaWxlIHByZWZlcmVuY2UuCi0JICogCi0JICogQHBhcmFtIG1lcmdlT3B0aW9uCi0JICogICAgICAgICAgICB0aGUgdXNlciBzcGVjaWZpZWQgbWVyZ2Ugb3B0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldE1lcmdlT3B0aW9uKGJvb2xlYW4gbWVyZ2VPcHRpb24pIHsKLQkJSW1wb3J0WE1MUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKS5zZXRWYWx1ZSgKLQkJCQlNRVJHRV9PUFRJT04sIG1lcmdlT3B0aW9uKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY2hlY2tCYXNlUGx1Z2lucyBvcHRpb24gZmlsZSBwcmVmZXJlbmNlLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGNoZWNrQmFzZVBsdWdpbnMgb3B0aW9uIGZpbGUgcHJlZmVyZW5jZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBnZXRDaGVja0Jhc2VQbHVnaW5zT3B0aW9uKCkgewotCQlyZXR1cm4gSW1wb3J0WE1MUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKS5nZXRCb29sZWFuKAotCQkJCUNIRUNLX0JBU0VfUExVR0lOU19PUFRJT04pOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGNoZWNrQmFzZVBsdWdpbnMgb3B0aW9uIGZpbGUgcHJlZmVyZW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gYgotCSAqICAgICAgIHRoZSB1c2VyIHNwZWNpZmllZCBjaGVja0Jhc2VQbHVnaW5zIG9wdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRDaGVja0Jhc2VQbHVnaW5zT3B0aW9uKGJvb2xlYW4gYikgewotCQlJbXBvcnRYTUxQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpLnNldFZhbHVlKAotCQkJCUNIRUNLX0JBU0VfUExVR0lOU19PUFRJT04sIGIpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcveG1sL3ByZWZlcmVuY2VzL3BhY2thZ2UuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sL3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3htbC9wcmVmZXJlbmNlcy9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliMTY0ZmMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcveG1sL3ByZWZlcmVuY2VzL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIHByZWZlcmVuY2Ugc3VwcG9ydCBmb3IgdGhlIEltcG9ydCBYTUwgc2VydmljZS4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0LnhtbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy94bWwvc2VydmljZXMvSW1wb3J0UmVzb3VyY2VIYW5kbGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0LnhtbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy94bWwvc2VydmljZXMvSW1wb3J0UmVzb3VyY2VIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1MWRkNTcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcveG1sL3NlcnZpY2VzL0ltcG9ydFJlc291cmNlSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcueG1sLnNlcnZpY2VzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5GaWxlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlLnV0aWwuQmFzZVJlc291cmNlSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlLnV0aWwuVXJsSW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5JTGlicmFyeVJlc291cmNlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLlJlc291cmNlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLQotCi0vKioKLSAqIHJlc291cmNlIGhhbmRsZXIgZm9yIGNvbnRlbnQgaW4gdGhlIGltcG9ydGVkIGxpYnJhcnkKLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBJbXBvcnRSZXNvdXJjZUhhbmRsZXIgZXh0ZW5kcyBCYXNlUmVzb3VyY2VIYW5kbGVyIHsKLQotCQkKLQkvKioKLQkgKiBUaGUgY29uc3RydWN0b3IKLQkgKiBAcGFyYW0gc291cmNlTGliUm9vdAotCSAqIEBwYXJhbSB0YXJnZXRMaWJSb290Ci0JICovCi0JcHVibGljIEltcG9ydFJlc291cmNlSGFuZGxlcihGaWxlIHNvdXJjZUxpYlJvb3QsIEZpbGUgdGFyZ2V0TGliUm9vdCkgewotCQlzdXBlcihzb3VyY2VMaWJSb290LCB0YXJnZXRMaWJSb290KTsKLQl9Ci0JCi0JLyoqCi0JICogcmVzb2x2ZSB0aGUgdXJsLiBwdXQgdGhlIHJlc291cmNlcyBpbnRvIHRoZSBsb2NhdGlvbiBiYXNlZCBvbiB0aGUgbGlicmFyeSByZXNvdXJjZSBzdHJ1Y3R1cmUgZGVmaW5pdGlvbi4KLQkgKi8KLQlwdWJsaWMgVXJsSW5mbyByZXNvbHZlRmlsZVVybChPYmplY3Qgb3duZXIsIFN0cmluZyBzcmNVcmwpIHRocm93cyBFeGNlcHRpb24gewotCi0JCVVybEluZm8gaW5mbyA9IG5ldyBVcmxJbmZvKCk7Ci0KLQkJaW5mby5zb3VyY2VVcmwgPSBzcmNVcmw7Ci0JCWluZm8uc291cmNlRmlsZSA9IG5ldyBGaWxlKHNvdXJjZUxpYlJvb3QsIHNyY1VybCkuZ2V0Q2Fub25pY2FsRmlsZSgpOwotCQlpbmZvLnRhcmdldFVybCA9IHNyY1VybDsgCi0JCWluZm8udGFyZ2V0RmlsZSA9IG51bGw7Ci0KLQkJaWYgKGluZm8uc291cmNlRmlsZSA9PSBudWxsIHx8ICFpbmZvLnNvdXJjZUZpbGUuZXhpc3RzKCkgKSB7Ci0JCQlyZXR1cm4gaW5mbzsKLQkJfQotCQkKLQkJaWYgKCBvd25lciBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQgKSB7Ci0JCQkvLyBmaXggdGhlIHRhcmdldCB1cmwgYW5kIAotCQkJaW5mby50YXJnZXRVcmwgPSBmaXhVcmwoc3JjVXJsKTsKLQkJCQotCQkJLy9TdHJpbmcgZWxlbWVudFBhdGggPSBSZXNvdXJjZUhlbHBlci5nZXRFbGVtZW50UmVzb3VyY2VQYXRoKG93bmVyKTsKLQkJCVN0cmluZyBlbGVtZW50UGF0aCA9IFJlc291cmNlSGVscGVyLmdldEVsZW1lbnRQYXRoKCAoTWV0aG9kRWxlbWVudClvd25lcik7Ci0JCQlJTGlicmFyeVJlc291cmNlTWFuYWdlciBsaWJSZXNNZ3IgPSBSZXNvdXJjZUhlbHBlci5nZXRSZXNvdXJjZU1ncigoTWV0aG9kRWxlbWVudClvd25lcik7Ci0JCQlTdHJpbmcgc3JjUGx1Z2luUGF0aCA9IGxpYlJlc01nci5nZXRQaHlzaWNhbFBsdWdpblBhdGgoKE1ldGhvZEVsZW1lbnQpb3duZXIpOwotCQkJRmlsZSBzcmNSb290ID0gKG5ldyBGaWxlKHNyY1BsdWdpblBhdGgpKS5nZXRQYXJlbnRGaWxlKCk7Ci0JCQlpbmZvLnRhcmdldEZpbGUgPSBuZXcgRmlsZShuZXcgRmlsZShzcmNSb290LCBlbGVtZW50UGF0aCksIGluZm8udGFyZ2V0VXJsKTsJCi0JCX0gZWxzZSB7Ci0JCQlpbmZvLnRhcmdldFVybCA9IHNyY1VybDsgCi0JCQlpbmZvLnNvdXJjZUZpbGUgPSBuZXcgRmlsZShzb3VyY2VMaWJSb290LCBzcmNVcmwpOwotCQl9Ci0KLQkJcmV0dXJuIGluZm87Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZml4VXJsKFN0cmluZyB1cmwpIHsKLQkJdXJsID0gdXJsLnJlcGxhY2UoRmlsZS5zZXBhcmF0b3JDaGFyLCAnLycpOyAgCi0JCWludCBpbmR4ID0gdXJsLmxhc3RJbmRleE9mKFJlc291cmNlSGVscGVyLlJFU09VUkNFX0ZPTERFUiArICIvIik7ICAvLyROT04tTkxTLTEkCi0JCWlmICggaW5keCA+PTAgKSB7Ci0JCQlyZXR1cm4gdXJsLnN1YnN0cmluZyhpbmR4KTsKLQkJfQotCQkKLQkJLy8gcHV0IHRoZSByZXNvdXJjZSBpbnRvIHRoZSByZXNvdXJjZXMgZm9sZGVyCi0JCXJldHVybiBuZXcgRmlsZShSZXNvdXJjZUhlbHBlci5SRVNPVVJDRV9GT0xERVIsIHVybCkKLQkJCS50b1N0cmluZygpLnJlcGxhY2UoRmlsZS5zZXBhcmF0b3JDaGFyLCAnLycpOyAKLQl9Ci0JCi0JLyoqCi0JICogY29weWluZyB0aGUgcmVzb3VyY2UgZmlsZSBmcm9tIHRoZSBzb3VyY2UgbGlicmFyeSB0byB0aGUgdGFyZ2V0Ci0JICogCi0JICogQHBhcmFtIHNvdXJjZUZpbGUgdGhlIGZpbGUgcGF0aCByZWxhdGl2ZSB0byB0aGUgc291cmNlIHJvb3QKLQkgKi8KLQlwdWJsaWMgdm9pZCBjb3B5UmVzb3VyY2UoU3RyaW5nIHNvdXJjZUZpbGUsIEVPYmplY3Qgb2JqLCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbiB1bWFQbHVnaW4pIHsKLQkJSUxpYnJhcnlSZXNvdXJjZU1hbmFnZXIgbGliUmVzTWdyID0gUmVzb3VyY2VIZWxwZXIuZ2V0UmVzb3VyY2VNZ3IodW1hUGx1Z2luKTsKLQkJU3RyaW5nIHRndFBsdWdpblBhdGggPSBsaWJSZXNNZ3IuZ2V0UGh5c2ljYWxQbHVnaW5QYXRoKHVtYVBsdWdpbik7Ci0JCUZpbGUgdGd0UGx1Z2luUm9vdCA9IG5ldyBGaWxlKHRndFBsdWdpblBhdGgpOwotCQlGaWxlIHNyY1BsdWdpblJvb3QgPSBuZXcgRmlsZShzb3VyY2VMaWJSb290LCB1bWFQbHVnaW4uZ2V0TmFtZSgpKTsKLQkJCi0JCUZpbGUgc3JjID0gbmV3IEZpbGUoc3JjUGx1Z2luUm9vdCwgc291cmNlRmlsZSk7Ci0JCWlmICggc3JjLmV4aXN0cygpICkgewotCQkJRmlsZSB0Z3QgPSBuZXcgRmlsZSh0Z3RQbHVnaW5Sb290LCBzb3VyY2VGaWxlKTsKLQkJCUZpbGVVdGlsLmNvcHlGaWxlKHNyYywgdGd0KTsKLQkJfQotCX0KLQkKLS8vCS8qKgotLy8JICogdGhlIHJlc291cmNlIHBhdGggd2lsbCBiZSByZWxhdGl2ZSB0byB0aGUgbGliYXJ5IHJvb3QuIHVybHMgbmVlZHMgdG8gYmUgZml4ZWQKLS8vCSAqIAotLy8JICogQHBhcmFtIG93bmVyIHRoZSBvd25lciBvYmplY3QgaW4gdGhlIHRhcmdldCBsaWJyYXJ5Ci0vLwkgKiBAcGFyYW0gc3JjVXJsIHRoZSB1cmwgcmVmZXJlbmNlZCBpbiB0aGUgc291cmNlIGNvbnRlbnQKLS8vCSAqIEByZXR1cm4KLS8vCSAqLwotLy8JcHJpdmF0ZSBVcmxJbmZvIGxvYWRVcmxJbmZvV2l0aEZpeGVkUGF0aChPYmplY3Qgb3duZXIsIFN0cmluZyBzcmNVcmwpIHsKLS8vCQlVcmxJbmZvIGluZm8gPSBuZXcgVXJsSW5mbygpOwotLy8JCWluZm8uc291cmNlVXJsID0gc3JjVXJsOwotLy8JCWluZm8udGFyZ2V0VXJsID0gc3JjVXJsOwotLy8JCWluZm8uc291cmNlRmlsZSA9IG5ldyBGaWxlKHNvdXJjZUxpYlJvb3QsIHNyY1VybCk7Ci0vLwkJaW5mby50YXJnZXRGaWxlID0gbmV3IEZpbGUodGFyZ2V0TGliUm9vdCwgc3JjVXJsKTsKLS8vCi0vLwkJaWYgKCBvd25lciBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpICB7Ci0vLwkJCVN0cmluZyBiYWNrUGF0aCA9IFJlc291cmNlSGVscGVyLmdldEJhY2tQYXRoKCAoTWV0aG9kRWxlbWVudClvd25lcik7Ci0vLwkJCWluZm8udGFyZ2V0VXJsID0gYmFja1BhdGggKyBzcmNVcmw7Ci0vLwkJfQotLy8JCXJldHVybiBpbmZvOwkKLS8vCX0KLS8vCQotLy8JLyoqCi0vLwkgKiB0aGUgcmVzb3VyY2UgcGF0aCB3aWxsIGJlIHJlbGF0aXZlIHRvIHRoZSBvd25lciBlbGVtZW50LiAKLS8vCSAqIHVybHMgd2lsbCBub3QgYmUgY2hhbmdlZCBidXQgcmVzb3VyY2UgZmlsZXMgaXMgcmVsaWNhdGVkLgotLy8JICogQHBhcmFtIG93bmVyIG93bmVyIHRoZSBvd25lciBvYmplY3QgaW4gdGhlIHRhcmdldCBsaWJyYXJ5Ci0vLwkgKiBAcGFyYW0gc3JjVXJsCi0vLwkgKiBAcmV0dXJuCi0vLwkgKi8KLS8vCXByaXZhdGUgVXJsSW5mbyBsb2FkVXJsSW5mb1dpdGhSZWxhdGl2ZVBhdGgoT2JqZWN0IG93bmVyLCBTdHJpbmcgc3JjVXJsKSB7Ci0vLwkJVXJsSW5mbyBpbmZvID0gbmV3IFVybEluZm8oKTsKLS8vCQlpbmZvLnNvdXJjZVVybCA9IHNyY1VybDsKLS8vCQlpbmZvLnRhcmdldFVybCA9IGluZm8uc291cmNlVXJsOyAvLyBubyB1cmwgY2hhbmdlCi0vLwkJaW5mby5zb3VyY2VGaWxlID0gbmV3IEZpbGUoc291cmNlTGliUm9vdCwgc3JjVXJsKTsKLS8vCQkKLS8vCQlpZiAoIG93bmVyIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgIHsKLS8vCQkJLy9TdHJpbmcgZWxlbWVudFBhdGggPSBSZXNvdXJjZUhlbHBlci5nZXRFbGVtZW50UmVzb3VyY2VQYXRoKG93bmVyKTsKLS8vCQkJU3RyaW5nIGVsZW1lbnRQYXRoID0gUmVzb3VyY2VIZWxwZXIuZ2V0RWxlbWVudFJlc291cmNlUGF0aCgoTWV0aG9kRWxlbWVudClvd25lcik7Ci0vLwkJCWluZm8udGFyZ2V0RmlsZSA9IG5ldyBGaWxlKG5ldyBGaWxlKHRhcmdldExpYlJvb3QsIGVsZW1lbnRQYXRoKSwgc3JjVXJsKTsJCQkKLS8vCQl9Ci0vLwotLy8JCXJldHVybiBpbmZvOwotLy8JfQotCQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcveG1sL3NlcnZpY2VzL0ltcG9ydFhNTFNlcnZpY2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sL3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3htbC9zZXJ2aWNlcy9JbXBvcnRYTUxTZXJ2aWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2NTljMWEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcveG1sL3NlcnZpY2VzL0ltcG9ydFhNTFNlcnZpY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg3NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLnhtbC5zZXJ2aWNlczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5zZG8uRURhdGFPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5zZXJ2aWNlLnZlcnNpb25pbmcuVmVyc2lvblV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS51dGlsLk1zZ0JveDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpLnV0aWwuTXNnRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2UudXRpbC5Db250ZW50UHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2UudXRpbC5JUmVzb3VyY2VIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQuc2VydmljZXMuRGlhZ3JhbUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwuRXhwb3J0WE1MUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sLnNlcnZpY2VzLkZlYXR1cmVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sLnNlcnZpY2VzLlhNTExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy5JbXBvcnRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy5JbXBvcnRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy5zZXJ2aWNlcy5Db25maWd1cmF0aW9uSW1wb3J0U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLnNlcnZpY2VzLkZpbGVNb2RpZnlDaGVja2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcuc2VydmljZXMuTGlicmFyeUltcG9ydE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy53aXphcmRzLlBsdWdpbk1vZGlmeUluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy53aXphcmRzLlNlbGVjdEltcG9ydENvbmZpZ3VyYXRpb25Tb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy54bWwuSW1wb3J0WE1MUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcueG1sLkltcG9ydFhNTFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5zZXJ2aWNlcy5TYWZlVXBkYXRlQ29udHJvbGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLkxpYnJhcnlVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5NdWx0aUZpbGVSZXNvdXJjZVNldEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLm1pZ3JhdGlvbi5JTWlncmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLm1pZ3JhdGlvbi5NYXBwaW5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UucmVmcmVzaC5SZWZyZXNoSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy5JRmlsZUJhc2VkTGlicmFyeVBlcnNpc3RlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VydmljZXMuSUxpYnJhcnlQZXJzaXN0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNhcGFiaWxpdHlQYXR0ZXJuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnRDYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db250ZW50Q2F0ZWdvcnlQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlbGl2ZXJ5UHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EaXNjaXBsaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5HdWlkYW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZEVsZW1lbnRQcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RMaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc1BhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFza0Rlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrT3JkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya09yZGVyVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi0vKioKLSAqIFhtbCBpbXBvcnQgc2VydmljZSBjbGFzcyB0byBwcm9jZXNzIHRoZSBpbXBvcnRpbmcgdGFzawotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgSW1wb3J0WE1MU2VydmljZSB7Ci0KLQlwcml2YXRlIExpc3QgdW5sb2NrZWRQbHVnaW5zOyAKLQkKLQlwcml2YXRlIGJvb2xlYW4gZXJyb3IgPSBmYWxzZTsKLQkKLQlwcml2YXRlIE1hcCByZW5hbWVFbGVtZW50TWFwID0gbmV3IEhhc2hNYXAoKTsKLQkKLQlwcml2YXRlIGJvb2xlYW4gb3ZlcndyaXRlID0gZmFsc2U7Ci0JCi0JcHJpdmF0ZSBJU3RhdHVzIGZpbGVDaGVja2VkT3V0U3RhdHVzID0gbnVsbDsKLQkKLQlwcml2YXRlIFN0cmluZyB4bWxQYXRoOwotCi0JcHJpdmF0ZSBYTUxMaWJyYXJ5IHhtbExpYjsKLQotCXByaXZhdGUgVW1hTGlicmFyeSB1bWFMaWI7Ci0KLQlwcml2YXRlIEltcG9ydFhNTG9nZ2VyIGxvZ2dlciA9IG5ldyBJbXBvcnRYTUxvZ2dlcigpOwotCi0JcHJpdmF0ZSBMaXN0IGRpc2NhcmRlZEVsZW1lbnRzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JcHJpdmF0ZSBEaWFncmFtSGFuZGxlciBkaWFncmFtSGFuZGxlcjsKLQkKLQkvL3RkcyB3aXRoIHN0ZXBzCi0JcHJpdmF0ZSBNYXA8U3RyaW5nLCBUYXNrRGVzY3JpcHRvcj4gdGRNYXA7Ci0JCi0JLy8gbWFwIHhtbCBXb3JrT3JkZXIgdG8gdW1hIFdvcmtPcmRlcgotCU1hcCB3b3JrT3JkZXJNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQotCXByaXZhdGUgSU1pZ3JhdG9yIG1pZ3JhdG9yOwotCQotCXByaXZhdGUgYm9vbGVhbiBjaGVja0Jhc2VQbHVnaW5zID0gdHJ1ZTsKLQotCS8qKgotCSAqIFRoZSBjb25zdHJ1Y3RvcgotCSAqLwotCXB1YmxpYyBJbXBvcnRYTUxTZXJ2aWNlKCkgewotCi0JfQotCi0JLyoqCi0JICogTG9hZHMgdGhlIHhtbCBmaWxlLgotCSAqIEBwYXJhbSB4bWxQYXRoCi0JICogQHJldHVybiB0cnVlIGlmIHN1Y2NlZWRzLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGxvYWRYbWwoZmluYWwgU3RyaW5nIHhtbFBhdGgpIHsKLQkJU3RyaW5nIHZlcnNpb25FcnJvciA9IHZlcnNpb25DaGVjayh4bWxQYXRoLAlJbXBvcnRYTUxSZXNvdXJjZXMuaW1wb3J0WE1MV2l6YXJkX3RpdGxlKTsJCQotCQlpZiAodmVyc2lvbkVycm9yICE9IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQkJCQotCQl0aGlzLnhtbFBhdGggPSB4bWxQYXRoOwotCi0JCWxvZ2dlci5sb2dNZXNzYWdlKCJMb2FkaW5nIHhtbCBsaWJyYXJ5IC4uLiIpOyAvLyROT04tTkxTLTEkCi0JCQotCQlib29sZWFuIHJldCA9IGZhbHNlOwotCQl0cnkgewotCQkJdGhpcy54bWxMaWIgPSBuZXcgWE1MTGlicmFyeShudWxsLCBsb2dnZXIsIHhtbFBhdGgpOwotCQkJdGhpcy54bWxMaWIubG9hZCgpOwotCQkJcmV0ID0gY2hlY2tPbGRQbHVnaW5zKCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlsb2dnZXIubG9nRXJyb3IoTkxTLmJpbmQoCi0JCQkJCUV4cG9ydFhNTFJlc291cmNlcy54bWxMaWJyYXJ5X2Vycm9yX2xvYWRfeG1sLCB4bWxQYXRoKSwgZSk7Ci0JCQlmaW5hbCBTdHJpbmcgZXJyU3RyID0gZS50b1N0cmluZygpOwotCQkJU2FmZVVwZGF0ZUNvbnRyb2xsZXIuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewkKLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7CQotCQkJCQlJbXBvcnRYTUxQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpLmRpc3BsYXlFcnJvcigKLQkJCQkJCU5MUy5iaW5kKEV4cG9ydFhNTFJlc291cmNlcy54bWxMaWJyYXJ5X2Vycm9yX2xvYWRfeG1sLCB4bWxQYXRoKSwgZXJyU3RyKTsKLQkJCQl9Ci0JCQl9KTsKLQkJfQotCQkKLQkJcmV0dXJuIHJldDsKLQl9Ci0JCi0JcHJpdmF0ZSBib29sZWFuIGNoZWNrT2xkUGx1Z2lucygpIHsKLQkJCi0JCXVubG9ja2VkUGx1Z2lucyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJTGlzdCBmaWxlTmFtZVRvQ2hlY2sgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCU1hcCBtYXAgPSBuZXcgSGFzaE1hcCgpOwotCQlNYXAgZ3VpZE1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCUxpc3QgYmFzZVBsdWdpbnMgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCkKLQkJCQkJCQkJCQkJLmdldE1ldGhvZFBsdWdpbnMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBiYXNlUGx1Z2lucy5zaXplKCk7IGkrKykgewotCQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW4gcGx1Z2luID0gKG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luKSBiYXNlUGx1Z2lucy5nZXQoaSk7Ci0JCQltYXAucHV0KHBsdWdpbi5nZXROYW1lKCksIHBsdWdpbik7Ci0JCQlndWlkTWFwLnB1dChwbHVnaW4uZ2V0R3VpZCgpLCBwbHVnaW4pOwotCQl9Ci0JCQotCQlMaXN0IHBsdWdpbnMgPSAoKE1ldGhvZExpYnJhcnkpIHhtbExpYi5nZXRSb290KCkpLmdldE1ldGhvZFBsdWdpbigpOwotCQlMaXN0IGd1aWRzID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKGludCBpPTA7IGk8cGx1Z2lucy5zaXplKCk7IGkrKykgewotCQkJTWV0aG9kRWxlbWVudCBlbGVtID0gKE1ldGhvZEVsZW1lbnQpIHBsdWdpbnMuZ2V0KGkpOwotCQkJZ3VpZHMuYWRkKGVsZW0uZ2V0SWQoKSk7Ci0JCQkKLQkJCW9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luIGJhc2VQbHVnaW4gPSAKLQkJCQkob3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW4pIG1hcC5nZXQoZWxlbS5nZXROYW1lKCkpOwotCQkJYm9vbGVhbiB0b0FkZCA9IGZhbHNlOwotCQkJaWYgKGJhc2VQbHVnaW4gIT0gbnVsbCAmJiAhIGJhc2VQbHVnaW4uZ2V0R3VpZCgpLmVxdWFscyhlbGVtLmdldElkKCkpCi0JCQkJCSYmICEgYmFzZVBsdWdpbi5nZXRVc2VyQ2hhbmdlYWJsZSgpKSB7Ci0JCQkJdG9BZGQgPSB0cnVlOwotCQkJfSBlbHNlIHsKLQkJCQliYXNlUGx1Z2luID0gCi0JCQkJCShvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbikgZ3VpZE1hcC5nZXQoZWxlbS5nZXRJZCgpKTsKLQkJCQlpZiAoYmFzZVBsdWdpbiAhPSBudWxsIC8qJiYgISBiYXNlUGx1Z2luLmdldE5hbWUoKS5lcXVhbHMoZWxlbS5nZXROYW1lKCkpKi8KLQkJCQkJCSYmICEgYmFzZVBsdWdpbi5nZXRVc2VyQ2hhbmdlYWJsZSgpKSB7Ci0JCQkJCXRvQWRkID0gdHJ1ZTsKLQkJCQl9IAotCQkJfQotCQkJaWYgKHRvQWRkKSB7Ci0JCQkJdW5sb2NrZWRQbHVnaW5zLmFkZChiYXNlUGx1Z2luLmdldEd1aWQoKSk7Ci0JCQkJYmFzZVBsdWdpbi5zZXRVc2VyQ2hhbmdlYWJsZShuZXcgQm9vbGVhbih0cnVlKSk7Ci0JCQkJUmVzb3VyY2UgcmVzID0gYmFzZVBsdWdpbi5lUmVzb3VyY2UoKTsKLQkJCQlpZiAocmVzICE9IG51bGwgJiYgcmVzLmdldFVSSSgpICE9IG51bGwpIHsKLQkJCQkJU3RyaW5nIGZpbGVOYW1lID0gcmVzLmdldFVSSSgpLnRvRmlsZVN0cmluZygpOwotCQkJCQlmaWxlTmFtZVRvQ2hlY2suYWRkKGZpbGVOYW1lKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKGZpbGVOYW1lVG9DaGVjay5zaXplKCkgPiAwKSB7Ci0JCQlmaW5hbCBMaXN0IG1vZGlmaWVkRmlsZXMgPSBmaWxlTmFtZVRvQ2hlY2s7CQotCQkJU2FmZVVwZGF0ZUNvbnRyb2xsZXIuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJZmlsZUNoZWNrZWRPdXRTdGF0dXMgPSBGaWxlTW9kaWZ5Q2hlY2tlci5jaGVja01vZGlmeShtb2RpZmllZEZpbGVzKTsKLQkJCQl9Ci0JCQl9KTsKLQkJfQotCQkKLQkJaWYgKCEgdW5sb2NrZWRQbHVnaW5zLmlzRW1wdHkoKSAmJiAoZmlsZUNoZWNrZWRPdXRTdGF0dXMgIT0gbnVsbCkKLQkJCQkmJiAhZmlsZUNoZWNrZWRPdXRTdGF0dXMuaXNPSygpKSB7Ci0JCQkvLyBsb2cgZXJyb3IKLQkJCVNhZmVVcGRhdGVDb250cm9sbGVyLnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCVN0cmluZyB0aXRsZSA9IEltcG9ydFhNTFJlc291cmNlcy5pbXBvcnRYTUxXaXphcmRfdGl0bGU7IAotCQkJCQlTdHJpbmcgbXNnID0gSW1wb3J0WE1MUmVzb3VyY2VzLmltcG9ydFhNTFNlcnZpY2VfaW1wb3J0X2ZhaWxlZDsgCi0JCQkJCW5ldyBNc2dEaWFsb2coSW1wb3J0UGx1Z2luLmdldERlZmF1bHQoKSkKLQkJCQkJCS5kaXNwbGF5RXJyb3IodGl0bGUsIG1zZywgZmlsZUNoZWNrZWRPdXRTdGF0dXMpOwotCQkJCQl9Ci0JCQl9KTsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQkKLQkJZmluYWwgUGx1Z2luTW9kaWZ5SW5mbyBtb2RpZnlJbmZvID0gU2VsZWN0SW1wb3J0Q29uZmlndXJhdGlvblNvdXJjZQotCQkJCQkJCQkJCS5jaGVja01vZGlmeShndWlkcywgTXNnQm94LmdldERlZmF1bHRTaGVsbCgpLCBmYWxzZSk7CQkKLQotCQkvLyBhbGxvdyB1c2VyIHRvIHByb2NlZWQgd2l0aCBsb2NrZWQgcGx1Z2lucwotCQlpZiAoIG1vZGlmeUluZm8ubG9ja2VkUGx1Z2lucy5zaXplKCkgPiAwICkgewotCQkJZmluYWwgYm9vbGVhbiByZXRbXSA9IG5ldyBib29sZWFuWzFdOwotCQkJU2FmZVVwZGF0ZUNvbnRyb2xsZXIuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJU3RyaW5nIFdJWkFSRF9USVRMRSA9IEltcG9ydFhNTFJlc291cmNlcy5pbXBvcnRYTUxXaXphcmRfdGl0bGU7IAotCQkJCQlTdHJpbmcgbWVzc2FnZSA9IG1vZGlmeUluZm8uZ2V0TG9ja2VkTWVzc2FnZSgpLnRvU3RyaW5nKCkgKwotCQkJCQkJSW1wb3J0UmVzb3VyY2VzLkltcG9ydFBsdWdpbldpemFyZF9jb25maXJtX2NvbnRpbnVlOyAKLQkJCQkJcmV0WzBdID0gSW1wb3J0WE1MUGx1Z2luCi0JCQkJCQkJLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKS5kaXNwbGF5Q29uZmlybWF0aW9uKFdJWkFSRF9USVRMRSwgbWVzc2FnZSk7Ci0JCQkJfQotCQkJfSk7CQkKLQkJCXJldHVybiByZXRbMF07Ci0JCX0gCQkJCi0JCXJldHVybiB0cnVlOwotCX0KLQkKLQkvKioKLQkgKiBAcmV0dXJuIHRoZSBsb2cgZmlsZS4KLQkgKi8KLQlwdWJsaWMgRmlsZSBnZXRMb2dQYXRoKCkgewotCQlyZXR1cm4gbG9nZ2VyLmdldExvZ1BhdGgoKTsKLQl9Ci0KLQkvKioKLQkgKiBEaXNwb3NlCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQotCQlkaXNjYXJkZWRFbGVtZW50cy5jbGVhcigpOwotCQl3b3JrT3JkZXJNYXAuY2xlYXIoKTsKLQkJbG9nZ2VyLmRpc3Bvc2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBEb2VzIFhNTCBleHBvcnQuCi0JICogQHBhcmFtIG1vbml0b3IKLQkgKiBAdGhyb3dzIEV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIGRvSW1wb3J0KElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWJvb2xlYW4gcmVmcmVzaCA9IFJlZnJlc2hKb2IuZ2V0SW5zdGFuY2UoKS5pc0VuYWJsZWQoKTsKLQkJdHJ5IHsKLQkJCWlmIChyZWZyZXNoKSB7Ci0JCQkJLy8gZGlzYWJsZSByZXNvdXJjZSByZWZyZXNoaW5nIGR1cmluZyBpbXBvcnQKLQkJCQkvLwotCQkJCVJlZnJlc2hKb2IuZ2V0SW5zdGFuY2UoKS5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCX0KLQkJCQotCQkJaGFuZGxlVHlwZUNoYW5nZXMoKTsKLQkJCQotCQkJSVJlc291cmNlSGFuZGxlciBoYW5kbGVyID0gbmV3IEltcG9ydFJlc291cmNlSGFuZGxlcihuZXcgRmlsZSgKLQkJCQkJeG1sUGF0aCkuZ2V0UGFyZW50RmlsZSgpLCBuZXcgRmlsZShMaWJyYXJ5U2VydmljZQotCQkJCQkuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeUxvY2F0aW9uKCkpKTsKLQotCQkJQ29udGVudFByb2Nlc3NvciBjb250ZW50UHJvYyA9IG5ldyBDb250ZW50UHJvY2Vzc29yKGhhbmRsZXIsCi0JCQkJCXRoaXMubG9nZ2VyKTsKLQkJCQotCQkJZGlhZ3JhbUhhbmRsZXIgPSBuZXcgRGlhZ3JhbUhhbmRsZXIobmV3IEZpbGUoCi0JCQkJCXhtbFBhdGgpLmdldFBhcmVudEZpbGUoKSwgbmV3IEZpbGUoTGlicmFyeVNlcnZpY2UKLQkJCQkJCQkuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeUxvY2F0aW9uKCkpKSB7CQkJCQotCQkJCS8vWzBdOiBzb3VyY2VGaWxlCi0JCQkJLy9bMV06IHRhcmdldEZpbGUKLQkJCQlwcm90ZWN0ZWQgRmlsZVtdIGdldEZpbGVzKG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudCBlbGVtKSB7Ci0JCQkJCUZpbGVbXSBmaWxlcyA9IHN1cGVyLmdldEZpbGVzKGVsZW0sIGZhbHNlKTsKLQkJCQkJCQkJCQkKLQkJCQkJRURhdGFPYmplY3QgeG1sT2JqID0geG1sTGliLmdldEVsZW1lbnQoZWxlbS5nZXRHdWlkKCkpOwotCQkJCQlpZiAoeG1sT2JqIGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2VzcykgewotCQkJCQkJb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2VzcyBwcm9jID0gCi0JCQkJCQkJCShvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzKSB4bWxPYmo7Ci0JCQkJCQlTdHJpbmcgdXJpID0gcHJvYy5nZXREaWFncmFtVVJJKCk7Ci0JCQkJCQlpZiAodXJpICE9IG51bGwgJiYgdXJpLmxlbmd0aCgpID4gMCkgewotCQkJCQkJCUZpbGUgZmlsZSA9IG5ldyBGaWxlKGdldFNvdXJjZUxpYlJvb3QoKSwgdXJpKTsKLQkJCQkJCQkvL1N5c3RlbS5vdXQucHJpbnRsbigiTEQ6IGZpbGU6ICIgKyBmaWxlKTsKLQkJCQkJCQlpZiAoZmlsZS5leGlzdHMoKSkgewotCQkJCQkJCQlmaWxlc1swXSA9IGZpbGU7Ci0JCQkJCQkJCWZpbGVzWzFdID0gbmV3IEZpbGUoZ2V0VGFyZ2V0TGliUm9vdCgpLCB1cmkpOwotCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCS8vU3lzdGVtLm91dC5wcmludGxuKCJMRDogZmlsZXNbMF06ICIgKyBmaWxlc1swXSk7Ci0JCQkJCQkJfQotCQkJCQkJfQkJCQkJCi0JCQkJCX0KLQkJCQkJCi0JCQkJCXJldHVybiBmaWxlczsKLQkJCQl9Ci0JCQkJCi0JCQl9OwotCi0JCQl0aGlzLnhtbExpYi5maXhMaWJyYXJ5Rm9ySW1wb3J0KCk7Ci0KLQkJCS8vIG1ha2Ugc3VyZSBhbGwgdGhlIGRlcGVuZGVudCBwbHVnaW5zIGFyZSB0aGVyZQotCQkJTGlzdCByZWZlcmVuY2VkUGx1Z2lucyA9IHhtbExpYi5nZXRSZWZlcmVuY2VkUGx1Z2lucygpOwotCQkJaWYgKHJlZmVyZW5jZWRQbHVnaW5zLnNpemUoKSA+IDApIHsKLQkJCQlvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnkgbGlicmFyeSA9IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlCi0JCQkJCQkuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpOwotCQkJCWlmIChsaWJyYXJ5ICE9IG51bGwpIHsKLQkJCQkJTGlzdCBwbHVnaW5zID0gbGlicmFyeS5nZXRNZXRob2RQbHVnaW5zKCk7Ci0JCQkJCWZvciAoSXRlcmF0b3IgaXQgPSBwbHVnaW5zLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQkJCVN0cmluZyBpZCA9ICgob3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW4pIGl0Ci0JCQkJCQkJCS5uZXh0KCkpLmdldEd1aWQoKTsKLQkJCQkJCXJlZmVyZW5jZWRQbHVnaW5zLnJlbW92ZShpZCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmIChpc0NoZWNrQmFzZVBsdWdpbnMoKSAmJiByZWZlcmVuY2VkUGx1Z2lucy5zaXplKCkgPiAwKSB7Ci0JCQkJIE1hcDxTdHJpbmcsIFN0cmluZz4gbWFwID0geG1sTGliLmdldEd1aWRUb1BsdWdOYW1lTWFwKCk7Ci0JCQkJZm9yIChJdGVyYXRvciBpdCA9IHJlZmVyZW5jZWRQbHVnaW5zLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQkJU3RyaW5nIG5hbWVBbmRJZCA9ICIiOwkJLy8kTk9OLU5MUy0xJAotCQkJCQlTdHJpbmcgaWQgPSAoU3RyaW5nKSBpdC5uZXh0KCk7Ci0JCQkJCWlmIChtYXAgIT0gbnVsbCkgewotCQkJCQkJU3RyaW5nIG5hbWUgPSBtYXAuZ2V0KGlkKTsKLQkJCQkJCWlmIChuYW1lICE9IG51bGwpIHsKLQkJCQkJCQluYW1lQW5kSWQgKz0gbmFtZSArICIsICI7Ly8kTk9OLU5MUy0xJAotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCW5hbWVBbmRJZCArPSBpZDsKLQkJCQkJbG9nZ2VyLmxvZ0Vycm9yKE5MUy5iaW5kKEltcG9ydFhNTFJlc291cmNlcy5pbXBvcnRYTUxTZXJ2aWNlX21pc3NpbmdfcGx1Z2luLCBuYW1lQW5kSWQpLAotCQkJCQkJCW51bGwpOwkJCQotCQkJCX0KLQotCQkJCXRocm93IG5ldyBFeGNlcHRpb24oCi0JCQkJCQlJbXBvcnRYTUxSZXNvdXJjZXMuaW1wb3J0WE1MU2VydmljZV9lcnJvcl9taXNzaW5nX3BsdWdpbnMpOwotCQkJfQotCi0JCQl0aGlzLnVtYUxpYiA9IG5ldyBVbWFMaWJyYXJ5KHJlbmFtZUVsZW1lbnRNYXAsIGNvbnRlbnRQcm9jLCBsb2dnZXIsIG92ZXJ3cml0ZSk7Ci0KLQkJCUVEYXRhT2JqZWN0IHhtbFJvb3QgPSB0aGlzLnhtbExpYi5nZXRSb290KCk7Ci0JCQlFRGF0YU9iamVjdCB1bWFSb290ID0gdGhpcy51bWFMaWIuZ2V0Um9vdCgpOwotCQkJCi0JCQlsb2dnZXIubG9nTWVzc2FnZSgiY3JlYXRlIHRhcmdldCBsaWJyYXJ5IGVsZW1lbnRzIC4uLiIpOyAvLyROT04tTkxTLTEkCi0JCQljcmVhdEVEYXRhT2JqZWN0VHJlZSh4bWxSb290LCB1bWFSb290KTsKLQotCQkJbG9nZ2VyCi0JCQkJCS5sb2dNZXNzYWdlKCJjb3B5aW5nIGFsbCBmZWF0dXJlIHZhbHVlcyBmb3IgdGFyZ2V0IGxpYnJhcnkgZWxlbWVudHMgLi4uIik7IC8vJE5PTi1OTFMtMSQKLQkJCWl0ZXJhdEVEYXRhT2JqZWN0KChNZXRob2RFbGVtZW50KSB4bWxSb290KTsKLQotCQkJbG9nZ2VyLmxvZ01lc3NhZ2UoImZpeCB0aGUgdGFyZ2V0IGxpYnJhcnkgLi4uIik7IC8vJE5PTi1OTFMtMSQKLQkJCXVtYUxpYi5maXhMaWJyYXJ5KCk7Ci0JCQl1bWFMaWIuZml4VGFza0Rlc2NyaXB0b3JzKHRkTWFwKTsKLQotCQkJTGlicmFyeUltcG9ydE1hbmFnZXIuaGFuZGxlTmFtZVJlcGxhY2UocmVuYW1lRWxlbWVudE1hcCk7Ci0JCQkKLQkJCWRpYWdyYW1IYW5kbGVyLnBvc3RSZWdpc3RlckVsZW1lbnRzKCk7Ci0JCQkKLQkJCS8vIGRlbGV0ZSB0aGUgdW4tbmVlZGVkIGVsZW1lbnRzCi0JCQlsb2dnZXIubG9nTWVzc2FnZSgiZGVsZXRlIHVubmVlZGVkIGVsZW1lbnRzIC4uLiIpOyAvLyROT04tTkxTLTEkCi0JCQl1bWFMaWIuZGVsZXRlRWxlbWVudHMoKTsKLQkJCQotCQkJZmluYWwgTGlzdCBtb2RpZmllZEZpbGVzID0gRmlsZU1vZGlmeUNoZWNrZXIuZ2V0TW9kaWZpZWRGaWxlcyhMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLgotCQkJCQkJCQkJCWdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCkuZVJlc291cmNlKCkuZ2V0UmVzb3VyY2VTZXQoKSk7Ci0JCQltb2RpZmllZEZpbGVzLmFkZEFsbChkaWFncmFtSGFuZGxlci5nZXRNb2RpZmllZEZpbGVzKCkpOwotCQkJZmluYWwgSVN0YXR1cyBmaWxlQ2hlY2tlZE91dFN0YXR1cyA9IEZpbGVNb2RpZnlDaGVja2VyLnN5bmNFeGVjQ2hlY2tNb2RpZnkobW9kaWZpZWRGaWxlcyk7Ci0JCQkKLQkJCWlmIChmaWxlQ2hlY2tlZE91dFN0YXR1cy5pc09LKCkpIHsKLQkJCQotCQkJCWxvZ2dlci5sb2dNZXNzYWdlKCJzYXZpbmcgdGFyZ2V0IGxpYnJhcnkgLi4uIik7IC8vJE5PTi1OTFMtMSQKLQkKLQkJCQlMaXN0IGNvbmZpZ3MgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCkuZ2V0UHJlZGVmaW5lZENvbmZpZ3VyYXRpb25zKCk7Ci0JCQkJaW50IGNvbmZpZ1N6ID0gY29uZmlncyA9PSBudWxsID8gMCA6IGNvbmZpZ3Muc2l6ZSgpOwotCQkJCWZvciAoaW50IGk9MDsgaTxjb25maWdTejsgaSsrKSB7Ci0JCQkJCW9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSAKLQkJCQkJCShvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb24gKSBjb25maWdzLmdldChpKTsKLQkJCQkJTGlicmFyeVV0aWwudmFsaWRhdGVNZXRob2RDb25maWd1cmF0aW9uKG51bGwsIGNvbmZpZyk7Ci0JCQkJfQotCQkJCQotCQkJCWlmIChjb25maWdTeiAhPSAwKSB7Ci0JCQkJCW9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeSBjdXJyTGliID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpOwotCQkJCQlJTGlicmFyeVBlcnNpc3RlciBwZXJzaXN0ZXIgPSAoKE11bHRpRmlsZVJlc291cmNlU2V0SW1wbCkgY3VyckxpYi5lUmVzb3VyY2UoKS5nZXRSZXNvdXJjZVNldCgpKS5nZXRQZXJzaXN0ZXIoKTsKLQkJCQkJaWYgKHBlcnNpc3RlciBpbnN0YW5jZW9mIElGaWxlQmFzZWRMaWJyYXJ5UGVyc2lzdGVyKSB7Ci0JCQkJCQlJRmlsZUJhc2VkTGlicmFyeVBlcnNpc3RlciBpcCA9IChJRmlsZUJhc2VkTGlicmFyeVBlcnNpc3RlcikgcGVyc2lzdGVyOwotCQkJCQkJRmlsZSBjb25maWdGb2xkZXIgPSBpcC5nZXREZWZhdWx0TWV0aG9kQ29uZmlndXJhdGlvbkZvbGRlcihjdXJyTGliKTsKLQkJCQkJCWlmIChjb25maWdGb2xkZXIgIT0gbnVsbCkgewotCQkJCQkJCWlwLnNldERlZmF1bHRNZXRob2RDb25maWd1cmF0aW9uRm9sZGVyKGN1cnJMaWIsIGNvbmZpZ0ZvbGRlcik7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCXRocm93IG5ldyBFeGNlcHRpb24oCi0JCQkJCQkJCQlJbXBvcnRYTUxSZXNvdXJjZXMuaW1wb3J0WE1MU2VydmljZV9pbXBvcnRfZmFpbGVkKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQkKLQkJCQkvLyBkb24ndCByZWZyZXNoIHRoZSB3b3Jrc3BhY2UKLQkJCQlpZiAodW5sb2NrZWRQbHVnaW5zICE9IG51bGwgJiYgISB1bmxvY2tlZFBsdWdpbnMuaXNFbXB0eSgpKSB7Ci0JCQkJCUxpYnJhcnlJbXBvcnRNYW5hZ2VyLmxvY2tVbmxvY2tlZFBsdWdpbnModW5sb2NrZWRQbHVnaW5zKTsKLQkJCQl9Ci0JCQkJTGlicmFyeVV0aWwuc2F2ZUxpYnJhcnkoTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKQotCQkJCQkJLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCksIGZhbHNlLCBmYWxzZSk7Ci0JCQkJZGlhZ3JhbUhhbmRsZXIuZXhlY3V0ZSgpOwkJCQkKLQkKLQkJCQlsb2dnZXIubG9nTWVzc2FnZSgicmUtb3BlbiB0YXJnZXQgbGlicmFyeSAuLi4iKTsgLy8kTk9OLU5MUy0xJAotCQkJCUxpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkucmVvcGVuQ3VycmVudE1ldGhvZExpYnJhcnkoKTsKLQkJCQlpZiAobWlncmF0b3IgIT0gbnVsbCkgewotCQkJCQlvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnkgbGliID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpOwotCQkJCQltaWdyYXRvci5taWdyYXRlWG1sSW1wb3J0ZWRMaWIobGliLCBtb25pdG9yKTsJCQkJCQotCQkJCQlMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLnJlb3BlbkN1cnJlbnRNZXRob2RMaWJyYXJ5KCk7Ci0JCQkJfQotCQkJCQkKLQkJCQlsb2dnZXIubG9nTWVzc2FnZSgiaW1wb3J0IGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkgLi4uIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0gZWxzZSB7Ci0JCQkJU2FmZVVwZGF0ZUNvbnRyb2xsZXIuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQlTdHJpbmcgdGl0bGUgPSBJbXBvcnRYTUxSZXNvdXJjZXMuaW1wb3J0WE1MV2l6YXJkX3RpdGxlOyAKLQkJCQkJCVN0cmluZyBtc2cgPSBJbXBvcnRYTUxSZXNvdXJjZXMuaW1wb3J0WE1MU2VydmljZV9pbXBvcnRfZmFpbGVkOyAKLQkJCQkJCW5ldyBNc2dEaWFsb2coSW1wb3J0WE1MUGx1Z2luLmdldERlZmF1bHQoKSkKLQkJCQkJCQkuZGlzcGxheUVycm9yKHRpdGxlLCBtc2csIGZpbGVDaGVja2VkT3V0U3RhdHVzKTsKLQkJCQkJCX0KLQkJCQl9KTsKLQkJCX0JCi0JCQkJCQkKLQkJCS8vUmVzb3VyY2VVdGlsLnJlZnJlc2hSZXNvdXJjZXMoTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKQotCQkJLy8JCS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpLCBtb25pdG9yKTsKLQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJbG9nZ2VyLmxvZ0Vycm9yKE5MUy5iaW5kKEltcG9ydFhNTFJlc291cmNlcy5pbXBvcnRYTUxTZXJ2aWNlX2ltcG9ydF9mYWlsZWQsIGUuZ2V0TWVzc2FnZSgpKSwgZSk7Ci0KLQkJCXRocm93IGU7Ci0KLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChyZWZyZXNoKSB7Ci0JCQkJLy8gcmUtZW5hYmxlIHJlc291cmNlIHJlZnJlc2hpbmcKLQkJCQkvLwotCQkJCVJlZnJlc2hKb2IuZ2V0SW5zdGFuY2UoKS5zZXRFbmFibGVkKHRydWUpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0RURhdGFPYmplY3RUcmVlKEVEYXRhT2JqZWN0IHhtbE9iaiwgRURhdGFPYmplY3QgdW1hT2JqKSB7Ci0KLQkJZm9yIChJdGVyYXRvciBpdCA9IHhtbE9iai5lQ29udGVudHMoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlFRGF0YU9iamVjdCBjaGlsZCA9IChFRGF0YU9iamVjdCkgaXQubmV4dCgpOwotCQkJY3JlYXRlUm1jT2JqZWN0KGNoaWxkLCB1bWFPYmopOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVJtY09iamVjdChFRGF0YU9iamVjdCB4bWxFbGVtZW50LAotCQkJRURhdGFPYmplY3QgdGFyZ2V0Q29udGFpbmVyKSB7Ci0JCWlmICh4bWxFbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudFByb3BlcnR5KSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJLy8gZ2V0IHRoZSB0YXJnZXRDb250YWluZXIncyBjb250YWluaW5nIGZlYXR1cmUKLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSB4bWxFbGVtZW50LmVDb250YWlubWVudEZlYXR1cmUoKTsKLQkJY3JlYXRlUm1jT2JqZWN0KHhtbEVsZW1lbnQsIHRhcmdldENvbnRhaW5lciwgZmVhdHVyZS5nZXROYW1lKCkpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVSbWNPYmplY3QoRURhdGFPYmplY3QgeG1sRWxlbWVudCwKLQkJCUVEYXRhT2JqZWN0IHRhcmdldENvbnRhaW5lciwgU3RyaW5nIGNvbnRhaW5tZW50WG1sRmVhdHVyZSkgewotCi0JCXRyeSB7Ci0JCQlpZiAoeG1sRWxlbWVudCA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCi0JCQlFRGF0YU9iamVjdCB1bWFFbGVtZW50ID0gbnVsbDsKLQotCQkJLy8gZG9uJ3QgY3JlYXRlIGNvbnRlbnQgY2F0ZWdvcnkgcGFja2FnZSBzaW5jZSBpbiB1bWEsIGl0J3MKLQkJCS8vIHNlcGVyYXRlZCBiYXNlZCBvbiB0eXBlCi0JCQlpZiAoeG1sRWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikgewotCQkJCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSAoTWV0aG9kUGx1Z2luKSB4bWxFbGVtZW50OwotCQkJCXVtYUVsZW1lbnQgPSB1bWFMaWIuY3JlYXRlTWV0aG9kUGx1Z2luKHBsdWdpbi5nZXRJZCgpLCBwbHVnaW4KLQkJCQkJCS5nZXROYW1lKCkpOwotCQkJfSBlbHNlIGlmICh4bWxFbGVtZW50IGluc3RhbmNlb2YgQ29udGVudENhdGVnb3J5UGFja2FnZSkgewotCQkJCS8vIGRvbid0IGNyZWF0ZSwgZG8gbm90aGluZwotCQkJCS8vIG1hcmsgYXMgZGlzY2FyZGVkIHNvIHdlIGRvbid0IG5lZWQgdG8gY29weSBpdCdzIGF0dHJpYnV0ZXMKLQkJCQlzZXREaXNjYXJkZWQoKChDb250ZW50Q2F0ZWdvcnlQYWNrYWdlKSB4bWxFbGVtZW50KS5nZXRJZCgpKTsKLQotCQkJfSBlbHNlIGlmICgoeG1sRWxlbWVudCBpbnN0YW5jZW9mIENvbnRlbnRDYXRlZ29yeSkKLQkJCQkJJiYgISh4bWxFbGVtZW50LmVDb250YWluZXIoKSBpbnN0YW5jZW9mIERvbWFpbiAKLQkJCQkJCQl8fCB4bWxFbGVtZW50LmVDb250YWluZXIoKSBpbnN0YW5jZW9mIERpc2NpcGxpbmUpCi0JCQkJCXx8ICh4bWxFbGVtZW50LmVDb250YWluZXIoKSBpbnN0YW5jZW9mIENvbnRlbnRDYXRlZ29yeVBhY2thZ2UpKSB7Ci0JCQkJLy8gY3JlYXRlIHRoZSBjb250ZW50IGNhdGVnb3JpZXMgZm9yIHJvb3QgY29udGVudCBjYXRlZ29yaWVzLAotCQkJCS8vIG5vdCBmb3Igc3ViLWRvbWFpbiBhbmQgc3ViLWRpc2NpcGxpbmUKLQkJCQkvLyAxNTQxNDMgLSBpbXBvcnQgeG1sIGRpZCBub3QgcmVzZXJ2ZSB0aGUgc3ViLWRpc2NpcGxpbmUgc3RydWN0dXJlCi0JCQkJU3RyaW5nIHBsdWdpbklkID0gZ2V0UGx1Z2luKHhtbEVsZW1lbnQpLmdldElkKCk7Ci0JCQkJdW1hRWxlbWVudCA9IHVtYUxpYi5jcmVhdGVDb250ZW50Q2F0ZWdvcnkocGx1Z2luSWQsIHhtbEVsZW1lbnQKLQkJCQkJCS5lQ2xhc3MoKS5nZXROYW1lKCksIHhtbEVsZW1lbnQuZ2V0VHlwZSgpLmdldE5hbWUoKSwKLQkJCQkJCXhtbExpYi5nZXRFbGVtZW50SWQoeG1sRWxlbWVudCkpOwotCQkJfSBlbHNlIHsKLQotCQkJCS8vIGlmIHRoaXMgaXMgcm9vdCBsZXZlbCBwYWNrYWdlLCBmaW5kIHRoZSBjb3JyZXNwb25kaW5nCi0JCQkJLy8gY29udGFpbmVyIGZvciB0aGUgVU1BIG9iamVjdAotCQkJCWlmICh4bWxFbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kUGFja2FnZQotCQkJCQkJJiYgeG1sRWxlbWVudC5lQ29udGFpbmVyKCkgaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pIHsKLQkJCQkJaWYgKHhtbEVsZW1lbnQgaW5zdGFuY2VvZiBDb250ZW50UGFja2FnZSkgewotCQkJCQkJdGFyZ2V0Q29udGFpbmVyID0gdW1hTGliCi0JCQkJCQkJCS5nZXRDb250ZW50Um9vdFBhY2thZ2UodGFyZ2V0Q29udGFpbmVyKTsKLQkJCQkJfSBlbHNlIGlmICh4bWxFbGVtZW50IGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkgewotCQkJCQkJT2JqZWN0IHByb2MgPSAoKFByb2Nlc3NDb21wb25lbnQpIHhtbEVsZW1lbnQpCi0JCQkJCQkJCS5nZXRQcm9jZXNzKCk7Ci0JCQkJCQlpZiAocHJvYyBpbnN0YW5jZW9mIENhcGFiaWxpdHlQYXR0ZXJuKSB7Ci0JCQkJCQkJdGFyZ2V0Q29udGFpbmVyID0gdW1hTGliCi0JCQkJCQkJCQkuZ2V0Q2FwYWJpbGl0eVBhdHRlcm5Sb290UGFja2FnZSh0YXJnZXRDb250YWluZXIpOwotCQkJCQkJfSBlbHNlIGlmIChwcm9jIGluc3RhbmNlb2YgRGVsaXZlcnlQcm9jZXNzKSB7Ci0JCQkJCQkJdGFyZ2V0Q29udGFpbmVyID0gdW1hTGliCi0JCQkJCQkJCQkuZ2V0RGVsaXZlcnlQcm9jZXNzUm9vdFBhY2thZ2UodGFyZ2V0Q29udGFpbmVyKTsKLQkJCQkJCX0KLQkJCQkJfSBlbHNlIGlmICh4bWxFbGVtZW50IGluc3RhbmNlb2YgUHJvY2Vzc1BhY2thZ2UpIHsKLQkJCQkJCUxpc3QgcHJvY3MgPSB4bWxMaWIKLQkJCQkJCQkJLmdldEFsbFByb2Nlc3NlcygoTWV0aG9kUGFja2FnZSkgeG1sRWxlbWVudCk7Ci0JCQkJCQlpZiAocHJvY3MgIT0gbnVsbCAmJiBwcm9jcy5zaXplKCkgPiAwKSB7Ci0JCQkJCQkJT2JqZWN0IHByb2MgPSBwcm9jcy5nZXQoMCk7Ci0JCQkJCQkJaWYgKHByb2MgaW5zdGFuY2VvZiBDYXBhYmlsaXR5UGF0dGVybikgewotCQkJCQkJCQl0YXJnZXRDb250YWluZXIgPSB1bWFMaWIKLQkJCQkJCQkJCQkuZ2V0Q2FwYWJpbGl0eVBhdHRlcm5Sb290UGFja2FnZSh0YXJnZXRDb250YWluZXIpOwotCQkJCQkJCX0gZWxzZSBpZiAocHJvYyBpbnN0YW5jZW9mIERlbGl2ZXJ5UHJvY2VzcykgewotCQkJCQkJCQl0YXJnZXRDb250YWluZXIgPSB1bWFMaWIKLQkJCQkJCQkJCQkuZ2V0RGVsaXZlcnlQcm9jZXNzUm9vdFBhY2thZ2UodGFyZ2V0Q29udGFpbmVyKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJCi0JCQkJaWYgKHRhcmdldENvbnRhaW5lciBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0b3IgJiYKLQkJCQkJY29udGFpbm1lbnRYbWxGZWF0dXJlLmVxdWFscygic3RlcCIpKSB7CS8vJE5PTi1OTFMtMSQKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQkKLQkJCQkvLyBnZXQgdGhlIGNvbnRhaW5tZW50IGZlYXR1cmUgc28gd2UgY2FuIGNyZWF0ZSB0aGUgb2JqZWN0IG9mCi0JCQkJLy8gdGhlIHNhbWUgdHlwZQotCQkJCXVtYUVsZW1lbnQgPSB1bWFMaWIuY3JlYXRlRWxlbWVudCh0YXJnZXRDb250YWluZXIsCi0JCQkJCQljb250YWlubWVudFhtbEZlYXR1cmUsIHhtbEVsZW1lbnQuZUNsYXNzKCkuZ2V0TmFtZSgpLAotCQkJCQkJeG1sRWxlbWVudC5nZXRUeXBlKCkuZ2V0TmFtZSgpLCB4bWxMaWIKLQkJCQkJCQkJLmdldEVsZW1lbnRJZCh4bWxFbGVtZW50KSk7Ci0JCQkJCi0JCQkJaWYgKHhtbEVsZW1lbnQgaW5zdGFuY2VvZiBUYXNrRGVzY3JpcHRvcikgewotCQkJCQlUYXNrRGVzY3JpcHRvciB0ZCA9IChUYXNrRGVzY3JpcHRvcikgeG1sRWxlbWVudDsKLQkJCQkJaWYgKHRkLmdldFRhc2soKSAhPSBudWxsKSB7Ci0JCQkJCQlMaXN0IHN0ZXBzID0gdGQuZ2V0U3RlcCgpOwotCQkJCQkJaWYgKHN0ZXBzICE9IG51bGwgJiYgIXN0ZXBzLmlzRW1wdHkoKSkgewotCQkJCQkJCWlmICh0ZE1hcCA9PSBudWxsKSB7Ci0JCQkJCQkJCXRkTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBUYXNrRGVzY3JpcHRvcj4oKTsKLQkJCQkJCQl9Ci0JCQkJCQkJdGRNYXAucHV0KHRkLmdldElkKCksIHRkKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQotCQkJCS8vIHhtbCBXb3JrT3JkZXIgZG9lcyBub3QgaGF2ZSBhbiBpZCwgbmVlZCB0byBtYXAgdGhlIHVtYSBPYmplY3QKLQkJCQlpZiAoeG1sRWxlbWVudCBpbnN0YW5jZW9mIFdvcmtPcmRlcikgewotCQkJCQl3b3JrT3JkZXJNYXAucHV0KHhtbEVsZW1lbnQsIHVtYUVsZW1lbnQpOwotCQkJCX0KLQkJCX0KLQotCQkJLy8gcmVjdXJzaXZlLAotCQkJLy8gbm90ZSwgdW1hIGVsZW1lbnQgbWlnaHQgYmUgbnVsbCBzaW5jZSB3ZSBjYW4ndCBkZXRlcm1pbmUgdGhlCi0JCQkvLyBvd25lciBvZiB0aGUgZWxlbWVudCB5ZXQKLQkJCWNyZWF0RURhdGFPYmplY3RUcmVlKHhtbEVsZW1lbnQsIHVtYUVsZW1lbnQpOwotCi0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBsb2cgdGhlIGVycm9yIGFuZCBjb250aW51ZT8/PwotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0KLQotCXByaXZhdGUgTWV0aG9kUGx1Z2luIGdldFBsdWdpbihFT2JqZWN0IGVsZW1lbnQpIHsKLQkJd2hpbGUgKChlbGVtZW50ICE9IG51bGwpICYmICEoZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikpIHsKLQkJCWVsZW1lbnQgPSBlbGVtZW50LmVDb250YWluZXIoKTsKLQkJfQotCi0JCXJldHVybiAoTWV0aG9kUGx1Z2luKSBlbGVtZW50OwotCX0KLQotCXByaXZhdGUgRURhdGFPYmplY3QgZ2V0Um1jT2JqZWN0KE1ldGhvZEVsZW1lbnQgeG1sT2JqKSB7Ci0JCWlmICh4bWxPYmogaW5zdGFuY2VvZiBNZXRob2RMaWJyYXJ5KSB7Ci0JCQlyZXR1cm4gdW1hTGliLmdldFJvb3QoKTsKLQkJfSBlbHNlIHsKLQkJCVN0cmluZyBpZCA9IHhtbE9iai5nZXRJZCgpOwotCQkJcmV0dXJuIHRoaXMudW1hTGliLmdldEVsZW1lbnQoaWQpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGl0ZXJhdEVEYXRhT2JqZWN0KE1ldGhvZEVsZW1lbnQgc3JjT2JqKSB7Ci0JCWl0ZXJhdEVEYXRhT2JqZWN0XyhzcmNPYmopOwotCQlFRGF0YU9iamVjdCB0YXJnZXRPYmogPSBnZXRSbWNPYmplY3Qoc3JjT2JqKTsKLQkJaWYgKHRhcmdldE9iaiBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudCkgewotCQkJZGlhZ3JhbUhhbmRsZXIucmVnaXN0ZXJFbGVtZW50KChvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQpIHRhcmdldE9iaik7IAotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCBpdGVyYXRFRGF0YU9iamVjdF8oTWV0aG9kRWxlbWVudCBzcmNPYmopIHsKLQotCQlsb2dnZXIKLQkJCQkubG9nTWVzc2FnZSgiID09PSBwcm9jZXNzaW5nIGVsZW1lbnQgIiArIHNyY09iai5nZXRUeXBlKCkuZ2V0TmFtZSgpICsgIjogIiArIHNyY09iai5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCQlpZiAoaXNQcm9jZXNzZWQoc3JjT2JqLmdldElkKCkpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc2V0UHJvY2Vzc2VkKHNyY09iai5nZXRJZCgpKTsKLQotCQkvLyBpZiBvYmplY3QgaXMgbm90IGNyZWF0ZWQsIGl0J3MgeG1sIHdyYXBwZXIgcGFja2FnZQotCQlpZiAoc3JjT2JqIGluc3RhbmNlb2YgQ29udGVudENhdGVnb3J5UGFja2FnZSkgewotCi0JCQkvLyBpdGVyYXRlIHRoZSBjaGlsZCBwYWNrYWdlcwotCQkJZm9yIChJdGVyYXRvciBpdCA9ICgoQ29udGVudENhdGVnb3J5UGFja2FnZSkgc3JjT2JqKQotCQkJCQkuZ2V0Q29udGVudENhdGVnb3J5KCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCWl0ZXJhdEVEYXRhT2JqZWN0KChNZXRob2RFbGVtZW50KSBpdC5uZXh0KCkpOwotCQkJfQotCQkJcmV0dXJuOwotCQl9Ci0KLQkJRURhdGFPYmplY3QgdGFyZ2V0T2JqID0gZ2V0Um1jT2JqZWN0KHNyY09iaik7Ci0JCUVDbGFzcyBlQ2xhc3MgPSBzcmNPYmouZUNsYXNzKCk7Ci0KLQkJRUxpc3QgZmVhdHVyZXMgPSBlQ2xhc3MuZ2V0RUFsbFN0cnVjdHVyYWxGZWF0dXJlcygpOwotCQlib29sZWFuIGlzTmV3RWxlbWVudCA9IHVtYUxpYi5pc05ld0VsZW1lbnQoc3JjT2JqLmdldElkKCkpIHx8IHNyY09iaiBpbnN0YW5jZW9mIE1ldGhvZExpYnJhcnk7Ci0JCWJvb2xlYW4gaXNPbGRQbHVnaW4gPSAhaXNOZXdFbGVtZW50ICYmIChzcmNPYmogaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pOwotCQkKLQkJZm9yIChJdGVyYXRvciBpdCA9IGZlYXR1cmVzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgaXQubmV4dCgpOwotCQkJCQkJCi0JCQlpZiAoRmVhdHVyZU1hbmFnZXIuSU5TVEFOQ0UuaXNVbm5lZWRlZFhtbEZlYXR1cmUoZmVhdHVyZS5nZXROYW1lKCkpKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlpZiAoaXNPbGRQbHVnaW4gJiYgVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWV0aG9kUGx1Z2luX1VzZXJDaGFuZ2VhYmxlKCkgPT0gZmVhdHVyZSkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCi0JCQlPYmplY3QgdmFsdWUgPSBzcmNPYmouZUdldChmZWF0dXJlKTsKLQkJCWlmICh2YWx1ZSA9PSBudWxsKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0KLQkJCXRyeSB7Ci0JCQkJYm9vbGVhbiBpc01lcCA9IGZlYXR1cmUuZ2V0TmFtZSgpLmVxdWFscygibWV0aG9kRWxlbWVudFByb3BlcnR5Iik7IC8vJE5PTi1OTFMtMSQJCi0JCQkJaWYgKHZhbHVlIGluc3RhbmNlb2YgTGlzdCAmJiAhIGlzTWVwKSB7Ci0JCQkJCWZvciAoSXRlcmF0b3IgaXR2ID0gKChMaXN0KSB2YWx1ZSkuaXRlcmF0b3IoKTsgaXR2Ci0JCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCU9iamVjdCBzcmNfdmFsdWUgPSBpdHYubmV4dCgpOwotCi0JCQkJCQlpZiAoc3JjX3ZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0KLQkJCQkJCQkvLyBpdCdzIGFuIGlkIHJlZmVyZW5jZQotCQkJCQkJCXVtYUxpYi5zZXRSZWZlcmVuY2VWYWx1ZSh0YXJnZXRPYmosIGZlYXR1cmUKLQkJCQkJCQkJCS5nZXROYW1lKCksIChTdHJpbmcpIHNyY192YWx1ZSk7Ci0JCQkJCQl9IGVsc2UgaWYgKHNyY192YWx1ZSBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCQkJCQkvLyBzZXQgdGhlIHJlZmVyZW5jZQotCQkJCQkJCU1ldGhvZEVsZW1lbnQgZSA9IChNZXRob2RFbGVtZW50KSBzcmNfdmFsdWU7Ci0JCQkJCQkJU3RyaW5nIGd1aWQgPSBlLmdldElkKCk7Ci0KLQkJCQkJCQkvLyBkb24ndCBzZXQgdGhlIGNvbnRhaW5tZW50IGZlYXR1cmUgdmFsdWUgc2luY2UKLQkJCQkJCQkvLyBpdCdzIGFscmVhZHkgaGFuZGxlZAotCQkJCQkJCS8vIHdoZW4gY3JlYXRpbmcgdGhlIGxpYnJhcnkgc3RydWN0dXJlCi0JCQkJCQkJaWYgKCFpc0Rpc2NhcmRlZChndWlkKSAmJiBlLmVDb250YWluZXIoKSAhPSBzcmNPYmopIHsKLQkJCQkJCQkJdW1hTGliLnNldFJlZmVyZW5jZVZhbHVlKHRhcmdldE9iaiwgZmVhdHVyZQotCQkJCQkJCQkJCS5nZXROYW1lKCksIGd1aWQpOwotCQkJCQkJCX0KLQotCQkJCQkJCWl0ZXJhdEVEYXRhT2JqZWN0KChNZXRob2RFbGVtZW50KSBzcmNfdmFsdWUpOwotCQkJCQkJfSBlbHNlIGlmIChzcmNfdmFsdWUgaW5zdGFuY2VvZiBXb3JrT3JkZXIpIHsKLQkJCQkJCQkvLyBXb3JrT3JkZXIgaXMgbm90IG1ldGhvZCBlbGVtZW50IGFuZCBkb2VzIG5vdCBoYXZlCi0JCQkJCQkJLy8gYW4gaWQsIG5lZWQgc3BlY2lhbCBoYW5kbGluZwotCQkJCQkJCS8vIHNldCB0aGUgcHJlZGUKLQkJCQkJCQlXb3JrT3JkZXIgd3IgPSAoV29ya09yZGVyKSBzcmNfdmFsdWU7Ci0JCQkJCQkJT2JqZWN0IHVtYVdyID0gd29ya09yZGVyTWFwLmdldCh3cik7Ci0JCQkJCQkJdW1hTGliLnNldFdvcmtPcmRlcih1bWFXciwgd3IuZ2V0VmFsdWUoKSk7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCWxvZ2dlcgotCQkJCQkJCQkJLmxvZ01lc3NhZ2UoTkxTLmJpbmQoSW1wb3J0WE1MUmVzb3VyY2VzLmltcG9ydFhNTFNlcnZpY2VfZWxlbWVudF9ub3RfaGFuZGxlZCwgc3JjX3ZhbHVlKSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9IGVsc2UgaWYgKGZlYXR1cmUgaW5zdGFuY2VvZiBFUmVmZXJlbmNlICYmICEgaXNNZXApIHsKLQotCQkJCQkvLyBnZXQgdGhlIHhtbCBvYmplY3QgYW5kIGl0ZXJhdGUgYWdhaW4KLQkJCQkJT2JqZWN0IHNyY192YWx1ZSA9IHZhbHVlOwotCi0JCQkJCWlmIChzcmNfdmFsdWUgaW5zdGFuY2VvZiBXb3JrT3JkZXIpIHsKLQkJCQkJCWxvZ2dlci5sb2dNZXNzYWdlKCJ3b3Jrb3JkZXIgdmFsdWUiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9IGVsc2UgaWYgKHNyY192YWx1ZSBpbnN0YW5jZW9mIFN0cmluZwotCQkJCQkJCSYmICFpc0Rpc2NhcmRlZCgoU3RyaW5nKSBzcmNfdmFsdWUpKSB7Ci0JCQkJCQkvLyBpdCdzIGFuIGlkIHJlZmVyZW5jZQotCQkJCQkJdW1hTGliLnNldFJlZmVyZW5jZVZhbHVlKHRhcmdldE9iaiwgZmVhdHVyZS5nZXROYW1lKCksCi0JCQkJCQkJCShTdHJpbmcpIHNyY192YWx1ZSk7Ci0JCQkJCX0gZWxzZSBpZiAoc3JjX3ZhbHVlIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJCQkJLy8gc2V0IHRoZSByZWZlcmVuY2UKLQkJCQkJCVN0cmluZyBndWlkID0gKChNZXRob2RFbGVtZW50KSBzcmNfdmFsdWUpLmdldElkKCk7Ci0JCQkJCQlpZiAoZ3VpZCA9PSBudWxsKSB7Ci0JCQkJCQkJbG9nZ2VyCi0JCQkJCQkJCQkubG9nV2FybmluZyhOTFMuYmluZChJbXBvcnRYTUxSZXNvdXJjZXMuaW1wb3J0WE1MU2VydmljZV9lbGVtZW50X3dpdGhvdXRfaWQsICgoTWV0aG9kRWxlbWVudCkgc3JjX3ZhbHVlKQotCQkJCQkJCQkJLmdldE5hbWUoKSkpOwotCQkJCQkJfQotCQkJCQkJaWYgKCFpc0Rpc2NhcmRlZChndWlkKSkgewotCQkJCQkJCXVtYUxpYi5zZXRSZWZlcmVuY2VWYWx1ZSh0YXJnZXRPYmosIGZlYXR1cmUKLQkJCQkJCQkJCS5nZXROYW1lKCksIGd1aWQpOwotCQkJCQkJfQotCQkJCQkJaXRlcmF0RURhdGFPYmplY3QoKE1ldGhvZEVsZW1lbnQpIHNyY192YWx1ZSk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlsb2dnZXIKLQkJCQkJCQkJLmxvZ1dhcm5pbmcoTkxTLmJpbmQoSW1wb3J0WE1MUmVzb3VyY2VzLmltcG9ydFhNTFNlcnZpY2VfZWxlbWVudF9ub3RfaGFuZGxlZCwgc3JjX3ZhbHVlKSk7Ci0JCQkJCX0KLQotCQkJCX0gZWxzZSB7Ci0JCQkJCWlmICh0YXJnZXRPYmogaW5zdGFuY2VvZiBDb250ZW50Q2F0ZWdvcnlQYWNrYWdlKSB7Ci0JCQkJCQlsb2dnZXIubG9nTWVzc2FnZSgiaHJyZSIpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQotCQkJCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBXb3JrT3JkZXJUeXBlKSB7Ci0JCQkJCQl2YWx1ZSA9ICgoV29ya09yZGVyVHlwZSkgdmFsdWUpLmdldE5hbWUoKTsKLQkJCQkJfQotCQkJCQkKLQkJCQkJYm9vbGVhbiByZW5hbWUgPSBmYWxzZTsKLQkJCQkJaWYgKCFpc05ld0VsZW1lbnQgJiYgZmVhdHVyZSA9PSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXROYW1lZEVsZW1lbnRfTmFtZSgpKSB7Ci0JCQkJCQlTdHJpbmcgb2xkTmFtZSA9IChTdHJpbmcpdGFyZ2V0T2JqLmVHZXQob3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXROYW1lZEVsZW1lbnRfTmFtZSgpKTsKLQkJCQkJCVN0cmluZyBuZXdOYW1lID0gKFN0cmluZylzcmNPYmouZUdldChmZWF0dXJlKTsJCQkJCi0JCQkJCQlpZiAoIW5ld05hbWUuZXF1YWxzKG9sZE5hbWUpKSB7Ci0JCQkJCQkJTGlicmFyeUltcG9ydE1hbmFnZXIuZW5zdXJlVW5pcXVlTmFtZUZvckV4aXN0aW5nRWxlbWVudAotCQkJCQkJCQkoKG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudCkgdGFyZ2V0T2JqLCBvbGROYW1lLCBuZXdOYW1lLCByZW5hbWVFbGVtZW50TWFwKTsKLQkJCQkJCQlyZW5hbWUgPSB0cnVlOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWlmICghcmVuYW1lKSB7Ci0JCQkJCQl1bWFMaWIuc2V0QXRyaWJ1dGVGZWF0dXJlVmFsdWUodGFyZ2V0T2JqLAotCQkJCQkJCQlmZWF0dXJlLmdldE5hbWUoKSwgdmFsdWUpOwotCQkJCQl9Ci0JCQkJCWlmIChpc05ld0VsZW1lbnQgJiYgZmVhdHVyZSA9PSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXROYW1lZEVsZW1lbnRfTmFtZSgpKSB7Ci0JCQkJCQlvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQgZWxlbSA9IChvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQpIHRhcmdldE9iajsKLQkJCQkJCUVPYmplY3QgY2VvYmogPSBlbGVtLmVDb250YWluZXIoKTsJCQkJCQkKLQkJCQkJCWlmIChjZW9iaiBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudCAmJiAKLQkJCQkJCQkJISB1bWFMaWIuaXNOZXdFbGVtZW50KCgob3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50KSBjZW9iaikuZ2V0R3VpZCgpKSkgewotCQkJCQkJCUxpYnJhcnlJbXBvcnRNYW5hZ2VyLmVuc3VyZVVuaXF1ZU5hbWUoY2VvYmosIGVsZW0sIHJlbmFtZUVsZW1lbnRNYXApOwotCQkJCQkJfQotCQkJCQl9Ci0KLQkJCQl9Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCS8vIGxvZyB0aGUgZXJyb3IgYW5kIGNvbnRpbnVlPz8/Ci0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQotCQl9Ci0KLQl9Ci0KLQkvLyBnb2lkIG9mIHByb2Nlc3NlZCBlbGVtZW50Ci0JcHJpdmF0ZSBMaXN0IHByb2Nlc3NlZEVsZW1lbnRzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JcHJpdmF0ZSBib29sZWFuIGlzUHJvY2Vzc2VkKFN0cmluZyBndWlkKSB7Ci0JCXJldHVybiBwcm9jZXNzZWRFbGVtZW50cy5jb250YWlucyhndWlkKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0UHJvY2Vzc2VkKFN0cmluZyBndWlkKSB7Ci0JCWlmICghcHJvY2Vzc2VkRWxlbWVudHMuY29udGFpbnMoZ3VpZCkpIHsKLQkJCXByb2Nlc3NlZEVsZW1lbnRzLmFkZChndWlkKTsKLQkJfQotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc0Rpc2NhcmRlZChTdHJpbmcgaWQpIHsKLQkJcmV0dXJuIGRpc2NhcmRlZEVsZW1lbnRzLmNvbnRhaW5zKGlkKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0RGlzY2FyZGVkKFN0cmluZyBpZCkgewotCQlkaXNjYXJkZWRFbGVtZW50cy5hZGQoaWQpOwotCX0KLQkKLQkvKioKLQkgKiBTZXRzIG92ZXJ3cml0ZSBhdHRyaWJ1dGUuCi0JICogQHBhcmFtIGIKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRPdmVyd3JpdGUoYm9vbGVhbiBiKSB7Ci0JCW92ZXJ3cml0ZSA9IGI7Ci0JfQkKLQkKLQlwcml2YXRlIFN0cmluZyB2ZXJzaW9uQ2hlY2soZmluYWwgU3RyaW5nIHhtbFBhdGgsIGZpbmFsIFN0cmluZyB0aXRsZSkgewotCQlmaW5hbCBTdHJpbmdbXSByZXQgPSBuZXcgU3RyaW5nWzFdOwotCQlyZXRbMF0gPSBudWxsOwotCQlTYWZlVXBkYXRlQ29udHJvbGxlci5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7CQotCQkJcHVibGljIHZvaWQgcnVuKCkgewkJCQkKLQkJCQlWZXJzaW9uVXRpbC5WZXJzaW9uQ2hlY2tJbmZvIGluZm8gPSBWZXJzaW9uVXRpbC5jaGVja1hNTFZlcnNpb24obmV3IEZpbGUoeG1sUGF0aCkpOwotCQkJCWlmIChpbmZvID09IG51bGwpIHsKLQkJCQkJcmV0WzBdID0gTkxTLmJpbmQoSW1wb3J0WE1MUmVzb3VyY2VzLnZlcnNpb25NaXNtYXRjaF9vbGREYXRhX3Vua25vd24sIG5ldyBPYmplY3RbXSB7Ci0JCQkJCQkJUGxhdGZvcm0uZ2V0UHJvZHVjdCgpLmdldE5hbWUoKX0pOwkJCQkJCi0JCQkJfSBlbHNlIHsKLQkJCQkJaWYgKGluZm8ucmVzdWx0IDwgMCkgewotCQkJCQkJdHJ5IHsKLQkJCQkJCQltaWdyYXRvciA9IE1hcHBpbmdVdGlsLmdldE1pZ3JhdG9yQnlMaWJQYXRoKHhtbFBhdGgpOwotCQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQlyZXRbMF0gPSBlLnRvU3RyaW5nKCk7Ci0JCQkJCQl9Ci0JCQkJCQlpZiAobWlncmF0b3IgPT0gbnVsbCAmJiByZXRbMF0gPT0gbnVsbCkgewotCQkJCQkJCWlmIChpbmZvLnRvb2xJRC5lcXVhbHMoVmVyc2lvblV0aWwuZ2V0UHJpbWFyeVRvb2xJRCgpKSkgewotCQkJCQkJCQlyZXRbMF0gPSBOTFMuYmluZChJbXBvcnRYTUxSZXNvdXJjZXMudmVyc2lvbk1pc21hdGNoX29sZERhdGEsIG5ldyBPYmplY3RbXSB7Ci0JCQkJCQkJCQkJaW5mby50b29sVmVyc2lvbiwgUGxhdGZvcm0uZ2V0UHJvZHVjdCgpLmdldE5hbWUoKX0pOwotCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCXJldFswXSA9IE5MUy5iaW5kKEltcG9ydFhNTFJlc291cmNlcy52ZXJzaW9uTWlzbWF0Y2hfb2xkRGF0YV91bmtub3duLCBuZXcgT2JqZWN0W10gewotCQkJCQkJCQkJCVBsYXRmb3JtLmdldFByb2R1Y3QoKS5nZXROYW1lKCl9KTsJCQkJCQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfSBlbHNlIGlmIChpbmZvLnJlc3VsdCA+IDApIHsKLQkJCQkJCWlmIChpbmZvLnRvb2xJRC5lcXVhbHMoVmVyc2lvblV0aWwuZ2V0UHJpbWFyeVRvb2xJRCgpKSkgewotCQkJCQkJCXJldFswXSA9IE5MUy5iaW5kKEltcG9ydFhNTFJlc291cmNlcy52ZXJzaW9uTWlzbWF0Y2hfb2xkVG9vbCwgbmV3IE9iamVjdFtdIHsKLQkJCQkJCQkJaW5mby50b29sVmVyc2lvbiwgUGxhdGZvcm0uZ2V0UHJvZHVjdCgpLmdldE5hbWUoKX0pOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlyZXRbMF0gPSBOTFMuYmluZChJbXBvcnRYTUxSZXNvdXJjZXMudmVyc2lvbk1pc21hdGNoX29sZFRvb2xfdW5rbm93biwgbmV3IE9iamVjdFtdIHsKLQkJCQkJCQkJCVBsYXRmb3JtLmdldFByb2R1Y3QoKS5nZXROYW1lKCl9KTsKLQkJCQkJCX0KLQkJCQkJfSAKLQkJCQl9Ci0JCQkJaWYgKHJldFswXSAhPSBudWxsKSB7Ci0JCQkJCUltcG9ydFhNTFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkuZGlzcGxheUVycm9yKHRpdGxlLCByZXRbMF0pOwkJCQkJCi0JCQkJfQotCQkJfQotCQl9KTsJCQotCQlyZXR1cm4gcmV0WzBdOwotCX0KLQkKLQkgcHVibGljIHZvaWQgaGFuZGxlVHlwZUNoYW5nZXMoKSB7Ci0JCW9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeSBiYXNlTGliID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKQotCQkJCQkJCQkJCQkJLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCk7Ci0JCUhhc2hNYXAgYmFzZU1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCUNvbmZpZ3VyYXRpb25JbXBvcnRTZXJ2aWNlLmNvbGxlY3RQb3RlbnRpYWxUeXBlQ2hhbmdlZChiYXNlTGliLCBiYXNlTWFwKTsKLQkJCi0JCUhhc2hNYXAgZUNsYXNzT2JqTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJSGFzaE1hcCBpbXBvcnRNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0geG1sTGliLmdldFJvb3QoKS5lQWxsQ29udGVudHMoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IG9iaiA9IGl0Lm5leHQoKTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBHdWlkYW5jZSB8fAotCQkJCW9iaiBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJTWV0aG9kRWxlbWVudCB4bWxFbGVtZW50ID0gKE1ldGhvZEVsZW1lbnQpIG9iajsKLQkJCQlTdHJpbmcgZUNsYXNzTmFtZSA9IHhtbEVsZW1lbnQuZUNsYXNzKCkuZ2V0TmFtZSgpOwotCQkJCU9iamVjdCBlQ2xhc3NPYmogPSBlQ2xhc3NPYmpNYXAuZ2V0KGVDbGFzc05hbWUpOwotCQkJCWlmIChlQ2xhc3NPYmogPT0gbnVsbCkgewotCQkJCQlFQ2xhc3Mgb2JqRUNsYXNzID0gRmVhdHVyZU1hbmFnZXIuSU5TVEFOQ0UuZ2V0Um1jRUNsYXNzKGVDbGFzc05hbWUpOwotCQkJCQlpZiAob2JqRUNsYXNzICE9IG51bGwpIHsKLQkJCQkJCWVDbGFzc09iaiA9IFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZShvYmpFQ2xhc3MpOwotCQkJCQkJZUNsYXNzT2JqTWFwLnB1dChlQ2xhc3NOYW1lLCBlQ2xhc3NPYmopOwkKLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAoZUNsYXNzT2JqICE9IG51bGwpIHsKLQkJCQkJaW1wb3J0TWFwLnB1dCh4bWxFbGVtZW50LmdldElkKCksIGVDbGFzc09iaik7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQlDb25maWd1cmF0aW9uSW1wb3J0U2VydmljZS5oYW5kbGVUeXBlQ2hhbmdlcyhiYXNlTWFwLCBpbXBvcnRNYXApOwkKLQl9Ci0JIAotCXByaXZhdGUgYm9vbGVhbiBpc0NoZWNrQmFzZVBsdWdpbnMoKSB7Ci0JCXJldHVybiBjaGVja0Jhc2VQbHVnaW5zOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldENoZWNrQmFzZVBsdWdpbnMoYm9vbGVhbiBjaGVja0Jhc2VQbHVnaW5zKSB7Ci0JCXRoaXMuY2hlY2tCYXNlUGx1Z2lucyA9IGNoZWNrQmFzZVBsdWdpbnM7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcveG1sL3NlcnZpY2VzL0ltcG9ydFhNTG9nZ2VyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0LnhtbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy94bWwvc2VydmljZXMvSW1wb3J0WE1Mb2dnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTYyZDBmMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0LnhtbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy94bWwvc2VydmljZXMvSW1wb3J0WE1Mb2dnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcueG1sLnNlcnZpY2VzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS51dGlsLkZpbGVMb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2U7Ci0KLS8qKgotICogTG9nZ2VyIGNsYXNzIGZvciB4bWwgaW1wb3J0Ci0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBJbXBvcnRYTUxvZ2dlciBleHRlbmRzIEZpbGVMb2dnZXIgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9HU19GT0xERVIgPSAibG9ncy9pbXBvcnQveG1sIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlIGNvbnN0cnVjdG9yCi0JICovCi0JcHVibGljIEltcG9ydFhNTG9nZ2VyKCkgewotCQlzdXBlcihuZXcgRmlsZShMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5TG9jYXRpb24oKSwgTE9HU19GT0xERVIpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sL3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3htbC9zZXJ2aWNlcy9VbWFMaWJyYXJ5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0LnhtbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy94bWwvc2VydmljZXMvVW1hTGlicmFyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNWQyZDNmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sL3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3htbC9zZXJ2aWNlcy9VbWFMaWJyYXJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDkwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcueG1sLnNlcnZpY2VzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudGV4dC5QYXJzZVBvc2l0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkRhdGU7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVHJlZUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnNkby5FRGF0YU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5TdHJVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2UuaW1wb3J0aW5nLkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2UudXRpbC5Db250ZW50UHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2UudXRpbC5JTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sLnNlcnZpY2VzLkZlYXR1cmVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcueG1sLkltcG9ydFhNTFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLnhtbC5JbXBvcnRYTUxSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLk1vZGVsU3RydWN0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuTGlicmFyeVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLk11bHRpRmlsZVNhdmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy5JRmlsZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzLlNlcnZpY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ2FwYWJpbGl0eVBhdHRlcm47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50Q2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkN1c3RvbUNhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcnlQcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpYmFibGVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGlzY2lwbGluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpc2NpcGxpbmVHcm91cGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudFByb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0VsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlU2V0R3JvdXBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5TZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVG9vbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya0JyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrT3JkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrT3JkZXJUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3RUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5VbWFVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRhc2tEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLWltcG9ydCBjb20uaWJtLmljdS50ZXh0LlNpbXBsZURhdGVGb3JtYXQ7Ci0KLS8qKgotICogVW1hTGlicmFyeSByZXByZXNlbnRzIGEgbWV0aG9kIGxpYnJhcnkgYW5kIHByb3ZpZGUgbWV0aG9kcyB0byBjcmVhdGUgZWxlbWVudHMKLSAqIGFuZCBzZXQgYXR0cmlidXRlcyBhbmQgZmVhdHVyZSB2YWx1ZXMKLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFVtYUxpYnJhcnkgewotCi0JcHJpdmF0ZSBib29sZWFuIGRlYnVnID0gSW1wb3J0WE1MUGx1Z2luLmdldERlZmF1bHQoKS5pc0RlYnVnZ2luZygpOwotCi0JcHJpdmF0ZSBib29sZWFuIG92ZXJ3cml0ZSA9IGZhbHNlOwkKLQkKLQlwcml2YXRlIElMb2dnZXIgbG9nZ2VyOwotCi0JcHJpdmF0ZSBDb250ZW50UHJvY2Vzc29yIGNvbnRlbnRQcm9jID0gbnVsbDsKLQkKLQlwcml2YXRlIE1hcCBuZXdFbGVtZW50c01hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCi0JcHJpdmF0ZSBNYXAgcmVuYW1lRWxlbWVudE1hcDsKLQotCS8vIG1hcCBvZiBjcmVhdGVkIGVsZW1lbnRzLCBndWlkIC0gRURhdGFPYmplY3QKLQlNYXAgZWxlbWVudHNNYXAgPSBuZXcgSGFzaE1hcCgpOwotCi0JLy8ga2VlcCB0aGUgc291cmNlIGVsZW1lbnQgaWRzIHNvIHdlIGNhbiBkZXRlcm1pbmUgdGhlIGVsZW1lbnRzIHRoYXQgYXJlIG5vdCBpbiB0aGUgeG1sIHNvdXJjZSBsaWJyYXJ5Ci0JLy8gdGhpcyBpcyBuZWVkZWQgZm9yIGRlbGV0aW5nIHVuLW5lZWRlZCBlbGVtZW50cwotCS8vIDE1NDE0OSAtIGFsbG93IHBhY2thZ2UgbGV2ZWwgbWVyZ2luZyBmb3IgeG1sIGltcG9ydAotCUhhc2hTZXQgc291cmNlRWxlbWVudElEcyA9IG5ldyBIYXNoU2V0KCk7Ci0JCi0JLyoqCi0JICogVGhlIGNvbnN0cnVjdG9yLgotCSAqIEBwYXJhbSBjb250ZW50UHJvYwotCSAqIEBwYXJhbSBsb2dnZXIKLQkgKiBAcGFyYW0gb3ZlcndyaXRlCi0JICovCi0JcHVibGljIFVtYUxpYnJhcnkoTWFwIHJlbmFtZUVsZW1lbnRNYXAsIENvbnRlbnRQcm9jZXNzb3IgY29udGVudFByb2MsIElMb2dnZXIgbG9nZ2VyLCBib29sZWFuIG92ZXJ3cml0ZSkgewotCQl0aGlzLnJlbmFtZUVsZW1lbnRNYXAgPSByZW5hbWVFbGVtZW50TWFwOwotCQl0aGlzLmxvZ2dlciA9IGxvZ2dlcjsKLQkJdGhpcy5jb250ZW50UHJvYyA9IGNvbnRlbnRQcm9jOwotCQl0aGlzLm92ZXJ3cml0ZSA9IG92ZXJ3cml0ZTsKLQotCQlidWlsZEVsZW1lbnRzTWFwKCk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiB0aGUgY3VycmVudCBsaWJyYXJ5IGFzIHRoZSByb290IG9iamVjdC4KLQkgKi8KLQlwdWJsaWMgTWV0aG9kTGlicmFyeSBnZXRSb290KCkgewotCQlyZXR1cm4gb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKQotCQkJCS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpOwotCX0KLQotCXByaXZhdGUgdm9pZCBidWlsZEVsZW1lbnRzTWFwKCkgewotCQkvLyBidWlsZCB0aGUgZWxlbWVudHMgbWFwIGZvciBlYXN5IG9wZXJhdGlvbgotCi0JCWVsZW1lbnRzTWFwLmNsZWFyKCk7Ci0JCWVsZW1lbnRzTWFwLnB1dChnZXRSb290KCkuZ2V0R3VpZCgpLCBnZXRSb290KCkpOwotCQlUcmVlSXRlcmF0b3IgaXQgPSBnZXRSb290KCkuZUFsbENvbnRlbnRzKCk7Ci0JCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCU9iamVjdCBlID0gaXQubmV4dCgpOwotCQkJaWYgKGUgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQkJZWxlbWVudHNNYXAucHV0KCgoTWV0aG9kRWxlbWVudCkgZSkuZ2V0R3VpZCgpLCBlKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBjb250ZW50IGNhdGVyZ29yeS4KLQkgKiBAcGFyYW0gcGx1Z2luSWQKLQkgKiBAcGFyYW0geG1sRUNsYXNzTmFtZQotCSAqIEBwYXJhbSB4bWxFbGVtZW50VHlwZQotCSAqIEBwYXJhbSBpZAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgRURhdGFPYmplY3QgY3JlYXRlQ29udGVudENhdGVnb3J5KFN0cmluZyBwbHVnaW5JZCwKLQkJCVN0cmluZyB4bWxFQ2xhc3NOYW1lLCBTdHJpbmcgeG1sRWxlbWVudFR5cGUsIFN0cmluZyBpZCkgewotCi0JCXNldFNvdXJjZUlkKGlkKTsKLQkJCi0JCS8vIG1ha2Ugc3VyZSB0aGUgc2FtZSBvYmplY3QgY3JlYXRlZCBvbmx5IG9uY2UKLQkJRURhdGFPYmplY3Qgb2JqID0gZ2V0RWxlbWVudChpZCk7Ci0JCWlmIChvYmogIT0gbnVsbCkgewotCQkJcmV0dXJuIG9iajsKLQkJfQotCi0JCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSAoTWV0aG9kUGx1Z2luKSBnZXRFbGVtZW50KHBsdWdpbklkKTsKLQotCQlFQ2xhc3Mgb2JqQ2xhc3MgPSBGZWF0dXJlTWFuYWdlci5JTlNUQU5DRS5nZXRSbWNFQ2xhc3MoeG1sRUNsYXNzTmFtZSk7Ci0JCWlmIChvYmpDbGFzcyA9PSBudWxsKSB7Ci0JCQlsb2dnZXIubG9nV2FybmluZyhOTFMuYmluZChJbXBvcnRYTUxSZXNvdXJjZXMubGlicmFyeV9lcnJvcl9ub19lY2xhc3MsIHhtbEVDbGFzc05hbWUpKTsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJb2JqID0gKEVEYXRhT2JqZWN0KSBFY29yZVV0aWwuY3JlYXRlKG9iakNsYXNzKTsKLQkJc2V0RWxlbWVudChpZCwgb2JqKTsKLQotCQlDb250ZW50UGFja2FnZSByb290UGtnID0gKENvbnRlbnRQYWNrYWdlKSBnZXRSb290UGFja2FnZShwbHVnaW4sIG9iaik7Ci0JCXJvb3RQa2cuZ2V0Q29udGVudEVsZW1lbnRzKCkuYWRkKChDb250ZW50Q2F0ZWdvcnkpb2JqKTsKLQkJcmV0dXJuIG9iajsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSByb290IHBhY2thZ2UKLQkgKiBAcGFyYW0gcGx1Z2luCi0JICogQHBhcmFtIG9iagotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgTWV0aG9kUGFja2FnZSBnZXRSb290UGFja2FnZShNZXRob2RQbHVnaW4gcGx1Z2luLCBPYmplY3Qgb2JqKSB7Ci0KLQkJU3RyaW5nW10gcGF0aCA9IG51bGw7Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBDdXN0b21DYXRlZ29yeSkgewotCQkJcGF0aCA9IE1vZGVsU3RydWN0dXJlLkRFRkFVTFQuY3VzdG9tQ2F0ZWdvcnlQYXRoOwotCQl9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIERpc2NpcGxpbmUKLQkJCQl8fCBvYmogaW5zdGFuY2VvZiBEaXNjaXBsaW5lR3JvdXBpbmcpIHsKLQkJCXBhdGggPSBNb2RlbFN0cnVjdHVyZS5ERUZBVUxULmRpc2NpcGxpbmVEZWZpbml0aW9uUGF0aDsKLQkJfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBEb21haW4pIHsKLQkJCXBhdGggPSBNb2RlbFN0cnVjdHVyZS5ERUZBVUxULmRvbWFpblBhdGg7Ci0JCX0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgUm9sZVNldCB8fCBvYmogaW5zdGFuY2VvZiBSb2xlU2V0R3JvdXBpbmcpIHsKLQkJCXBhdGggPSBNb2RlbFN0cnVjdHVyZS5ERUZBVUxULnJvbGVTZXRQYXRoOwotCQl9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIFRvb2wpIHsKLQkJCXBhdGggPSBNb2RlbFN0cnVjdHVyZS5ERUZBVUxULnRvb2xQYXRoOwotCQl9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0VHlwZSkgewotCQkJcGF0aCA9IE1vZGVsU3RydWN0dXJlLkRFRkFVTFQud29ya1Byb2R1Y3RUeXBlUGF0aDsKLQkJfQotCi0JCWlmIChwYXRoICE9IG51bGwpIHsKLQkJCXJldHVybiBVbWFVdGlsLmZpbmRNZXRob2RQYWNrYWdlKHBsdWdpbiwgcGF0aCk7Ci0JCX0gZWxzZSB7Ci0JCQlsb2dnZXIubG9nV2FybmluZyhOTFMuYmluZChJbXBvcnRYTUxSZXNvdXJjZXMubGlicmFyeV9ub19wYWNrYWdlLCBvYmopKTsgCi0JCX0KLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbWV0aG9kIHBsdWdpbi4KLQkgKiBAcGFyYW0gaWQKLQkgKiBAcGFyYW0gbmFtZQotCSAqIEByZXR1cm4KLQkgKiBAdGhyb3dzIEV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBFRGF0YU9iamVjdCBjcmVhdGVNZXRob2RQbHVnaW4oU3RyaW5nIGlkLCBTdHJpbmcgbmFtZSkKLQkJCXRocm93cyBFeGNlcHRpb24gewotCQkKLQkJLy8gbWFrZSBzdXJlIHRoZSBzYW1lIG9iamVjdCBjcmVhdGVkIG9ubHkgb25jZQotCQlFRGF0YU9iamVjdCBvYmogPSBnZXRFbGVtZW50KGlkKTsKLQkJYm9vbGVhbiBpc09sZCA9IG9iaiAhPSBudWxsOwotCQlpZiAob2JqID09IG51bGwpIHsKLQkJCU1hcCBvcHRpb25zID0gbmV3IEhhc2hNYXAoKTsKLQkJCW9wdGlvbnMucHV0KCJyZW5hbWVFbGVtZW50TWFwIiwgcmVuYW1lRWxlbWVudE1hcCk7Ly8kTk9OLU5MUy0xJAotCQkJb2JqID0gTGlicmFyeVNlcnZpY2UuSU5TVEFOQ0UuY3JlYXRlUGx1Z2luKG5hbWUsIGlkLCBvcHRpb25zKTsKLQotCQkJc2V0RWxlbWVudChpZCwgb2JqKTsKLQkJfQotCi0JCS8vIG1ha2Ugc3VyZSB0aGUgc3lzdGVtIHBhY2thZ2VzIGFyZSBpbmNsdWRlZAotCQlzZXRTb3VyY2VJZChpZCk7Ci0JCUxpc3QgcGtncyA9IFRuZ1V0aWwuZ2V0QWxsU3lzdGVtUGFja2FnZXMoKE1ldGhvZFBsdWdpbilvYmopOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gcGtncy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7ICkgewotCQkJTWV0aG9kUGFja2FnZSBwa2cgPSAoTWV0aG9kUGFja2FnZSlpdC5uZXh0KCk7Ci0JCQlzZXRTb3VyY2VJZChwa2cuZ2V0R3VpZCgpKTsKLQkJCWlmICghaXNPbGQpIHsKLQkJCQluZXdFbGVtZW50c01hcC5wdXQocGtnLmdldEd1aWQoKSwgcGtnKTsKLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIG9iajsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIGNvbnRlbnQncyByb290IHBhY2thZ2UuCi0JICogQHBhcmFtIHBsdWdpbgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgRURhdGFPYmplY3QgZ2V0Q29udGVudFJvb3RQYWNrYWdlKEVEYXRhT2JqZWN0IHBsdWdpbikgewotCQlpZiAoIShwbHVnaW4gaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gVW1hVXRpbC5maW5kTWV0aG9kUGFja2FnZSgoTWV0aG9kUGx1Z2luKSBwbHVnaW4sCi0JCQkJTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC5jb3JlQ29udGVudFBhdGgpOwotCX0KLQotCS8qKgotCSAqIEdldHMgY2FwYWJpbGl0eSBwYXR0ZXJuJyByb290IHBhY2thZ2UuCi0JICogQHBhcmFtIHBsdWdpbgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgRURhdGFPYmplY3QgZ2V0Q2FwYWJpbGl0eVBhdHRlcm5Sb290UGFja2FnZShFRGF0YU9iamVjdCBwbHVnaW4pIHsKLQkJaWYgKCEocGx1Z2luIGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIFVtYVV0aWwuZmluZE1ldGhvZFBhY2thZ2UoKE1ldGhvZFBsdWdpbikgcGx1Z2luLAotCQkJCU1vZGVsU3RydWN0dXJlLkRFRkFVTFQuY2FwYWJpbGl0eVBhdHRlcm5QYXRoKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIGRlbGl2ZXJ5IHByb2Nlc3MnIHJvb3QgcGFja2FnZS4KLQkgKiBAcGFyYW0gcGx1Z2luCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBFRGF0YU9iamVjdCBnZXREZWxpdmVyeVByb2Nlc3NSb290UGFja2FnZShFRGF0YU9iamVjdCBwbHVnaW4pIHsKLQkJaWYgKCEocGx1Z2luIGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIFVtYVV0aWwuZmluZE1ldGhvZFBhY2thZ2UoKE1ldGhvZFBsdWdpbikgcGx1Z2luLAotCQkJCU1vZGVsU3RydWN0dXJlLkRFRkFVTFQuZGVsaXZlcnlQcm9jZXNzUGF0aCk7Ci0JfQotCi0vLwlwdWJsaWMgRURhdGFPYmplY3QgZ2V0UHJvY2Vzc0NvbnRyaWJ1dGlvblJvb3RQYWNrYWdlKEVEYXRhT2JqZWN0IHBsdWdpbikgewotLy8JCWlmICghKHBsdWdpbiBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikpIHsKLS8vCQkJcmV0dXJuIG51bGw7Ci0vLwkJfQotLy8JCXJldHVybiBVbWFVdGlsLmZpbmRNZXRob2RQYWNrYWdlKChNZXRob2RQbHVnaW4pIHBsdWdpbiwKLS8vCQkJCU1vZGVsU3RydWN0dXJlLkRFRkFVTFQucHJvY2Vzc0NvbnRyaWJ1dGlvblBhdGgpOwotLy8JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBlbGVtZW50LgotCSAqIEBwYXJhbSBjb250YWluZXIKLQkgKiBAcGFyYW0geG1sRmVhdHVyZU5hbWUKLQkgKiBAcGFyYW0geG1sRUNsYXNzTmFtZQotCSAqIEBwYXJhbSB4bWxFbGVtZW50VHlwZQotCSAqIEBwYXJhbSBpZAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgRURhdGFPYmplY3QgY3JlYXRlRWxlbWVudChFRGF0YU9iamVjdCBjb250YWluZXIsCi0JCQlTdHJpbmcgeG1sRmVhdHVyZU5hbWUsIFN0cmluZyB4bWxFQ2xhc3NOYW1lLCBTdHJpbmcgeG1sRWxlbWVudFR5cGUsCi0JCQlTdHJpbmcgaWQpIHsKLQotCQlzZXRTb3VyY2VJZChpZCk7Ci0KLQkJLy8gbWFrZSBzdXJlIHRoZSBzYW1lIG9iamVjdCBjcmVhdGVkIG9ubHkgb25jZQotCQlFRGF0YU9iamVjdCBvYmogPSBnZXRFbGVtZW50KGlkKTsKLQkJaWYgKG9iaiAhPSBudWxsKSB7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQlFT2JqZWN0IGVvYmogPSBvYmouZUNvbnRhaW5lcigpOwotCQkJCWlmIChlb2JqIGluc3RhbmNlb2YgUHJvY2Vzc1BhY2thZ2UpIHsKLQkJCQkJUHJvY2Vzc1BhY2thZ2UgcCA9IChQcm9jZXNzUGFja2FnZSkgZW9iajsKLQkJCQkJc2V0U291cmNlSWQocC5nZXRHdWlkKCkpOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBvYmo7Ci0JCX0KLQotCQkvLyBpZiAoIG9iaiBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbiApIHsKLQkJLy8gcmV0dXJuIGdldEVsZW1lbnQoaWQpOwotCQkvLyB9Ci0KLQkJLy8gLy8gdGhpcyBpcyBhbiBlYXNpZXIgd2F5LCB0ZXN0IGl0LAotCQkvLyAvLyBkb2VzIG5vdCB3b3JrIHNpbmNlIGZlYXR1cmUuZ2V0RVR5cGUoKSByZXR1cm5zIHRoZSBiYXNlIGVsZW1lbnQKLQkJLy8gdHlwZSwgbm90IHRoZSBleHRlbmRlZCBvbmUKLQkJLy8gLy8gZm9yIGV4YW1wbGUsIGl0IHJldHVybnMgTWV0aG9kUGFja2FnZSBpbnN0ZWFkIG9mIFByb2Nlc3NQYWNrYWdlIG9yCi0JCS8vIENvbnRlbnRQYWNrYWdlCi0JCS8vIC8vIHNvIHdlIG5lZWQgdG8gbWFrZSBvdXIgb3duIG1hcAotCQkvLyBFQ2xhc3NpZmllciBjID0gZmVhdHVyZS5nZXRFVHlwZSgpOwotCi0JCUVDbGFzcyBvYmpDbGFzcyA9IEZlYXR1cmVNYW5hZ2VyLklOU1RBTkNFLmdldFJtY0VDbGFzcyh4bWxFQ2xhc3NOYW1lKTsKLQkJaWYgKG9iakNsYXNzID09IG51bGwpIHsKLQkJCWxvZ2dlci5sb2dXYXJuaW5nKE5MUy5iaW5kKEltcG9ydFhNTFJlc291cmNlcy5saWJyYXJ5X2Vycm9yX25vX2VjbGFzcywgeG1sRUNsYXNzTmFtZSkpOyAKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJb2JqID0gKEVEYXRhT2JqZWN0KSBFY29yZVV0aWwuY3JlYXRlKG9iakNsYXNzKTsJCi0KLQkJaWYgKG9iaiBpbnN0YW5jZW9mIFdvcmtPcmRlcikgewotCQkJLy8gV29ya09yZGVyIGlzIG5vdCBhIG1ldGhvZCBlbGVtZW50IGluIHhtbCB1bWEsIG5lZWQgdG8gY3JlYXRlIGl0Ci0JCQkvLyB3aXRoIGEgZ3VpZAotCQkJLy9pZCA9IEVjb3JlVXRpbC5nZW5lcmF0ZVVVSUQoKTsKLQotCQkJLy8gYWxzbyBuZWVkIHRvIGFkZCB0aGUgZWxlbWVudCBpbnRvIHRoZSBjb250YWluZXIgb2YgdGhlIG93bmVyCi0JCQkoKFByb2Nlc3NQYWNrYWdlKSBjb250YWluZXIuZUNvbnRhaW5lcigpKS5nZXRQcm9jZXNzRWxlbWVudHMoKS5hZGQoCi0JCQkJCShXb3JrT3JkZXIpb2JqKTsKLQkJfQotCi0JCXNldEVsZW1lbnQoaWQsIG9iaik7Ci0KLQkJdHJ5IHsKLQkJCWlmIChjb250YWluZXIgaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pIHsKLQkJCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gKE1ldGhvZFBsdWdpbikgY29udGFpbmVyOwotCQkJCS8vIG5lZWQgc3BlY2lhbCBoYW5kbGluZyBmb3IgbmV3IHBsdWdpbgotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBDb250ZW50UGFja2FnZSkgewotCQkJCQkvLyBjb250ZW50IHBhY2thZ2UgYW5kIG93bmVyIGlzIFBsdWdpbiwgZ290byB0aGUgcm9vdAotCQkJCQkvLyBjb250ZW50IHBhY2thZ2UKLQkJCQkJTWV0aG9kUGFja2FnZSBwa2dfY29yZV9jb250ZW50ID0gVW1hVXRpbC5maW5kTWV0aG9kUGFja2FnZSgKLQkJCQkJCQlwbHVnaW4sIE1vZGVsU3RydWN0dXJlLkRFRkFVTFQuY29yZUNvbnRlbnRQYXRoKTsKLQkJCQkJcGtnX2NvcmVfY29udGVudC5nZXRDaGlsZFBhY2thZ2VzKCkuYWRkKChDb250ZW50UGFja2FnZSlvYmopOwotCQkJCX0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkgewotCQkJCQlNZXRob2RQYWNrYWdlIHBrZ19jcCA9IFVtYVV0aWwuZmluZE1ldGhvZFBhY2thZ2UocGx1Z2luLAotCQkJCQkJCU1vZGVsU3RydWN0dXJlLkRFRkFVTFQuY2FwYWJpbGl0eVBhdHRlcm5QYXRoKTsKLQkJCQkJcGtnX2NwLmdldENoaWxkUGFja2FnZXMoKS5hZGQoKFByb2Nlc3NDb21wb25lbnQpb2JqKTsKLQotCQkJCX0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgUHJvY2Vzc1BhY2thZ2UpIHsKLQkJCQkJLy8gdGhpcyBpcyBhIHJvb3QgcHJvY2VzcyBwYWNrYWdlCi0JCQkJCS8vIHB1dCBpbnRvIHRoZSByb290IGRlbGl2ZXJ5IHByb2Nlc3NlcyBwYWNrYWdlCi0JCQkJCU1ldGhvZFBhY2thZ2UgcGtnX2RwID0gVW1hVXRpbC5maW5kTWV0aG9kUGFja2FnZShwbHVnaW4sCi0JCQkJCQkJTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC5kZWxpdmVyeVByb2Nlc3NQYXRoKTsKLQkJCQkJcGtnX2RwLmdldENoaWxkUGFja2FnZXMoKS5hZGQoKFByb2Nlc3NQYWNrYWdlKW9iaik7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQotCQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gRmVhdHVyZU1hbmFnZXIuSU5TVEFOQ0UKLQkJCQkJCS5nZXRSbWNGZWF0dXJlKGNvbnRhaW5lci5lQ2xhc3MoKSwgeG1sRmVhdHVyZU5hbWUpOwotCQkJCWlmIChmZWF0dXJlID09IG51bGwpIHsKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCi0JCQkJaWYgKChjb250YWluZXIgaW5zdGFuY2VvZiBBY3Rpdml0eSkKLQkJCQkJCSYmIGZlYXR1cmUgPT0gVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJLmdldEFjdGl2aXR5X0JyZWFrZG93bkVsZW1lbnRzKCkKLQkJCQkJCSYmIG9iaiBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnQpIHsKLQotCQkJCQkvLyB0aGUgY29udGFpbmVyIG5lZWRzIHRvIGJlIGEgcHJvY2VzcyBwYWNrYWdlCi0JCQkJCUVPYmplY3QgcGtnID0gY29udGFpbmVyOwotCQkJCQl3aGlsZSAoKHBrZyAhPSBudWxsKSAmJiAhKHBrZyBpbnN0YW5jZW9mIFByb2Nlc3NQYWNrYWdlKSkgewotCQkJCQkJcGtnID0gcGtnLmVDb250YWluZXIoKTsKLQkJCQkJfQotCi0JCQkJCS8vIGlmIHRoZSBvYmplY3QgaXMgYW4gYWN0aXZpdHksIGNyZWF0ZSBhIHBhY2thZ2UgZm9yIGl0IGFuZAotCQkJCQkvLyBhbGwgaXQncyBicmVha2Rvd24gZWxlbWVudHMKLQkJCQkJaWYgKChvYmogaW5zdGFuY2VvZiBBY3Rpdml0eSkpIHsKLQkJCQkJCUxpc3QgY2hpbGRQa2dzID0gKChQcm9jZXNzUGFja2FnZSkgcGtnKQotCQkJCQkJCQkuZ2V0Q2hpbGRQYWNrYWdlcygpOwotCQkJCQkJUHJvY2Vzc1BhY2thZ2UgcHAgPSBudWxsOwotCQkJCQkJaWYgKHRydWUgfHwgY2hpbGRQa2dzLnNpemUoKSA9PSAwKSB7CS8vMTU4MzYzOiBhbHdheXMgY3JlYXRlIGEgcGFja2FnZSBmb3IgYWN0Ci0JCQkJCQkJcHAgPSBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQcm9jZXNzUGFja2FnZSgpOwotCQkJCQkJCXBwLnNldE5hbWUoKChNZXRob2RFbGVtZW50KSBjb250YWluZXIpLmdldE5hbWUoKSk7Ci0JCQkJCQkJc2V0RWxlbWVudChFY29yZVV0aWwuZ2VuZXJhdGVVVUlEKCksIHBwKTsKLQkJCQkJCQlzZXRTb3VyY2VJZChwcC5nZXRHdWlkKCkpOwotCQkJCQkJCWNoaWxkUGtncy5hZGQocHApOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlwcCA9IChQcm9jZXNzUGFja2FnZSkgY2hpbGRQa2dzLmdldCgwKTsKLQkJCQkJCX0KLQotCQkJCQkJcGtnID0gcHA7Ci0JCQkJCX0KLQotCQkJCQkoKFByb2Nlc3NQYWNrYWdlKSBwa2cpLmdldFByb2Nlc3NFbGVtZW50cygpLmFkZCgoUHJvY2Vzc0VsZW1lbnQpb2JqKTsKLQkJCQl9Ci0KLQkJCQkvLyBub3RlOiBhbGwgZWxlbWVudCByZWZlcmVuY2VzIGFyZSBzdHJpbmcgdHlwZSAoaWQpCi0JCQkJLy8gcGFja2FnZSByZWZlcmVuY2VzIGFyZSBvYmplY3QgcmVmZXJlbmNlcwotCQkJCWlmIChmZWF0dXJlLmlzTWFueSgpKSB7Ci0JCQkJCUxpc3QgdmFsdWVzID0gKExpc3QpIGNvbnRhaW5lci5lR2V0KGZlYXR1cmUpOwotCQkJCQl2YWx1ZXMuYWRkKG9iaik7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJY29udGFpbmVyLmVTZXQoZmVhdHVyZSwgb2JqKTsKLQkJCQl9Ci0JCQl9CQkJCQotCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCWxvZ2dlci5sb2dXYXJuaW5nKE5MUy5iaW5kKEltcG9ydFhNTFJlc291cmNlcy5saWJyYXJ5X2Vycm9yX2NyZWF0ZV9lbGVtZW50LCBlLmdldE1lc3NhZ2UoKSkpOwotCQkJLy8gZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCi0JCXJldHVybiBvYmo7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldEVsZW1lbnQoU3RyaW5nIGd1aWQsIEVEYXRhT2JqZWN0IG9iaikgewotCQkvLyBhZGRFbGVtZW50VG9Db250YWluZXIoY29udGFpbmVyLCBvYmopOwotCQkJCQotCQlpZiAoIWVsZW1lbnRzTWFwLmNvbnRhaW5zS2V5KGd1aWQpKSB7Ci0KLQkJCWlmIChvYmogaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQkJKChNZXRob2RFbGVtZW50KSBvYmopLnNldEd1aWQoZ3VpZCk7Ci0JCQl9Ci0KLQkJCWVsZW1lbnRzTWFwLnB1dChndWlkLCBvYmopOwotCQkJCQkKLQkJCXNldERpcnR5KG9iaik7Ci0JCQluZXdFbGVtZW50c01hcC5wdXQoZ3VpZCwgb2JqKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRTb3VyY2VJZChTdHJpbmcgaWQpIHsKLQkJLy8gMTU0MTQ5IC0gYWxsb3cgcGFja2FnZSBsZXZlbCBtZXJnaW5nIGZvciB4bWwgaW1wb3J0Ci0JCWlmICggIXNvdXJjZUVsZW1lbnRJRHMuY29udGFpbnMoaWQpICkgewotCQkJc291cmNlRWxlbWVudElEcy5hZGQoaWQpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCBzZXREaXJ0eShFT2JqZWN0IG9iaikgewotCQkvLyBtYXJrIHRoZSByZXNvdXJjZSBhcyBkaXJ0eQotCQlSZXNvdXJjZSByZXMgPSBvYmouZVJlc291cmNlKCk7Ci0JCWlmICggcmVzICE9IG51bGwgJiYgIXJlcy5pc01vZGlmaWVkKCkgKSB7Ci0JCQlyZXMuc2V0TW9kaWZpZWQodHJ1ZSk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogR2V0cyBlbGVtZW50IGdpdmVuIHRoZSBndWlkLgotCSAqIEBwYXJhbSBndWlkCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBFRGF0YU9iamVjdCBnZXRFbGVtZW50KFN0cmluZyBndWlkKSB7Ci0JCXJldHVybiAoRURhdGFPYmplY3QpIGVsZW1lbnRzTWFwLmdldChndWlkKTsKLQl9Ci0KLQlwcml2YXRlIERhdGUgY3JlYXRlRGF0ZShTdHJpbmcgZGF0ZVN0cikgewotCQlkYXRlU3RyID0gZGF0ZVN0ci5yZXBsYWNlKCdUJywgJyAnKTsKLQkJU2ltcGxlRGF0ZUZvcm1hdCBmID0gbmV3IFNpbXBsZURhdGVGb3JtYXQoInl5eXktTU0tZGQgaGg6bW06c3MiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gZi5wYXJzZShkYXRlU3RyLCBuZXcgUGFyc2VQb3NpdGlvbigwKSk7Ci0KLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBnZXRTdHJpbmcoT2JqZWN0IG9iaikgewotCQlTdHJpbmcgc3RyID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCXN0ciA9IExpYnJhcnlVdGlsLmdldFR5cGVOYW1lKChNZXRob2RFbGVtZW50KSBvYmopOwotCQl9IGVsc2UgaWYgKG9iaiAhPSBudWxsKSB7Ci0JCQlzdHIgPSBvYmoudG9TdHJpbmcoKTsKLQkJfQotCi0JCXJldHVybiBzdHI7Ci0JfQotCi0JLyoqCi0JICogU2V0cyBhdHRyaWJ1dGUgZmVhdHVyZSB2YWx1ZS4KLQkgKiBAcGFyYW0gb2JqCi0JICogQHBhcmFtIGZlYXR1cmVOYW1lCi0JICogQHBhcmFtIHZhbHVlCi0JICogQHRocm93cyBFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBdHJpYnV0ZUZlYXR1cmVWYWx1ZShFRGF0YU9iamVjdCBvYmosIFN0cmluZyBmZWF0dXJlTmFtZSwKLQkJCU9iamVjdCB2YWx1ZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWJvb2xlYW4gb2xkTm90aWZ5ID0gb2JqLmVEZWxpdmVyKCk7Ci0JCW9iai5lU2V0RGVsaXZlcihmYWxzZSk7Ci0JCXNldEF0cmlidXRlRmVhdHVyZVZhbHVlXyhvYmosIGZlYXR1cmVOYW1lLCB2YWx1ZSk7Ci0JCW9iai5lU2V0RGVsaXZlcihvbGROb3RpZnkpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgc2V0QXRyaWJ1dGVGZWF0dXJlVmFsdWVfKEVEYXRhT2JqZWN0IG9iaiwgU3RyaW5nIGZlYXR1cmVOYW1lLAotCQkJT2JqZWN0IHZhbHVlKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJaWYgKG9iaiA9PSBudWxsIHx8IGZlYXR1cmVOYW1lID09IG51bGwgfHwgdmFsdWUgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBMaXN0IHx8IHZhbHVlIGluc3RhbmNlb2YgRURhdGFPYmplY3QpIHsKLQkJCWlmIChmZWF0dXJlTmFtZS5lcXVhbHMoIm1ldGhvZEVsZW1lbnRQcm9wZXJ0eSIpKSB7CQkvLyROT04tTkxTLTEkCi0JCQkJc2V0TWVwRmVhdHVyZVZhbHVlKG9iaiwgZmVhdHVyZU5hbWUsIHZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQl0aHJvdyBuZXcgRXhjZXB0aW9uKE5MUy5iaW5kKEltcG9ydFhNTFJlc291cmNlcy5saWJyYXJ5X2Vycm9yX3NldF9hdHRyaWJ1dGVfMiwgdmFsdWUpKTsgCi0JCX0KLQotCQkvLyBmaW5kIHRoZSBmZWF0dXJlIGFuZCBzZXQgdGhlIHZhbHVlCi0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gRmVhdHVyZU1hbmFnZXIuSU5TVEFOQ0UuZ2V0Um1jRmVhdHVyZShvYmoKLQkJCQkuZUNsYXNzKCksIGZlYXR1cmVOYW1lKTsKLQkJaWYgKGZlYXR1cmUgPT0gbnVsbCkgewotCQkJT2JqZWN0W10gcGFyYXMgPSBuZXcgT2JqZWN0W10geyBnZXRTdHJpbmcob2JqKSwgZmVhdHVyZU5hbWUsIHZhbHVlIH07Ci0JCQlsb2dnZXIubG9nV2FybmluZyhOTFMuYmluZChJbXBvcnRYTUxSZXNvdXJjZXMubGlicmFyeV9lcnJvcl9zZXRfYXR0cmlidXRlLCBwYXJhcykgKyBvYmopOyAKLQkJCXJldHVybjsKLQkJfSAKLQkJCi0JCXNldERpcnR5KG9iaik7Ci0KLQkJLy8gMTU4Njg4IC0gTWlzc2luZyB0ZW1wbGF0ZSBmaWxlcyBpbiBleHBvcnRlZCB4bWwgbGlicmFyeQotCQkvLyBwcm9jZXNzIHRoZSBhdHRhY2htZW50IHVybAotCQlpZiAoIGZlYXR1cmUgPT0gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0R3VpZGFuY2VEZXNjcmlwdGlvbl9BdHRhY2htZW50cygpICkgewotCQkJaWYgKCB2YWx1ZSAhPSBudWxsICkgewotCQkJCXZhbHVlID0gY29udGVudFByb2MucmVzb2x2ZUF0dGFjaG1lbnRSZXNvdXJjZXMob2JqLCB2YWx1ZS50b1N0cmluZygpLnRyaW0oKSk7Ci0JCQl9Ci0JCQlvYmouZVNldChmZWF0dXJlLCB2YWx1ZSk7Ci0JCX0KLQkJCi0JCWVsc2UgaWYgKGZlYXR1cmUgaW5zdGFuY2VvZiBFUmVmZXJlbmNlICYmIHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0JCQkvLyBpZiB0aGUgdW1hIGZlYXR1cmUgaXMgYSByZWZlcmVuY2UgZmVhdHVyZQotCQkJLy8gYnV0IHRoZSB4bWwgZmVhdHVyZSBpcyBhbiBhdHRyaWJ1dGUKLQkJCS8vIHRoZSBhdHRyaWJ1dGUgdmFsdWUgbXVzdCBiZSBhIGd1aWQKLQkJCU9iamVjdCBlID0gZ2V0RWxlbWVudCgoU3RyaW5nKSB2YWx1ZSk7Ci0JCQlpZiAoZSAhPSBudWxsKSB7Ci0JCQkJaWYgKGZlYXR1cmUuaXNNYW55KCkpIHsKLQkJCQkJKChMaXN0KSBvYmouZUdldChmZWF0dXJlKSkuYWRkKGUpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCW9iai5lU2V0KGZlYXR1cmUsIGUpOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJT2JqZWN0W10gcGFyYXMgPSBuZXcgT2JqZWN0W10geyBnZXRTdHJpbmcob2JqKSwKLQkJCQkJCWZlYXR1cmUuZ2V0TmFtZSgpLCB2YWx1ZSB9OwotCQkJCVN0cmluZyBtc2cgPSBOTFMuYmluZChJbXBvcnRYTUxSZXNvdXJjZXMubGlicmFyeV9lcnJvcl9zZXRfYXR0cmlidXRlLCBwYXJhcyk7IAotCQkJCWxvZ2dlci5sb2dXYXJuaW5nKG1zZyk7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoZmVhdHVyZSBpbnN0YW5jZW9mIEVBdHRyaWJ1dGUpIHsKLQkJCXRyeSB7Ci0JCQkJaWYgKGZlYXR1cmUuZ2V0TmFtZSgpLmVxdWFscygidmFyaWFiaWxpdHlUeXBlIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQl2YWx1ZSA9IFZhcmlhYmlsaXR5VHlwZS5nZXQodmFsdWUudG9TdHJpbmcoKSk7Ci0JCQkJfSBlbHNlIGlmIChmZWF0dXJlLmdldE5hbWUoKS5lcXVhbHMoImxpbmtUeXBlIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQl2YWx1ZSA9IFdvcmtPcmRlclR5cGUuZ2V0KHZhbHVlLnRvU3RyaW5nKCkpOwotCQkJCX0gZWxzZSBpZiAoZmVhdHVyZSA9PSBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJLmdldE1ldGhvZFVuaXRfQ2hhbmdlRGF0ZSgpKSB7Ci0JCQkJCS8vIGNvbnZlcnQgamF2YS51dGlsLkRhdGUgdG8geG1sIERhdGUKLQkJCQkJdmFsdWUgPSBjcmVhdGVEYXRlKHZhbHVlLnRvU3RyaW5nKCkpOwotCQkJCX0gZWxzZSBpZiAoZmVhdHVyZS5nZXROYW1lKCkuZXF1YWxzKCJub2RlaWNvbiIpIC8vJE5PTi1OTFMtMSQKLQkJCQkJCXx8IGZlYXR1cmUuZ2V0TmFtZSgpLmVxdWFscygic2hhcGVpY29uIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQlNZXRob2RQbHVnaW4gdGd0UGx1Z2luID0gVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4oKE1ldGhvZEVsZW1lbnQpIG9iaik7Ci0JCQkJCWludCBpeCA9IHRndFBsdWdpbi5nZXROYW1lKCkubGVuZ3RoKCkgKyAxOwotCQkJCQkJCQkJCQotCQkJCQl2YWx1ZSA9IG5ldyBqYXZhLm5ldC5VUkkodmFsdWUudG9TdHJpbmcoKS5zdWJzdHJpbmcoaXgpKTsKLQotCQkJCQkvLyBuZWVkIHRvIGNvcHkgdGhlIHJlc291cmNlIGZpbGUgdG8gdGhlIHRhcmdldCBsaWJyYXJ5Ci0JCQkJCWNvbnRlbnRQcm9jLmNvcHlSZXNvdXJjZSgoKGphdmEubmV0LlVSSSkgdmFsdWUpLmdldFBhdGgoKSwgb2JqLCB0Z3RQbHVnaW4pOwotCQkJCX0gZWxzZSBpZiAoKGNvbnRlbnRQcm9jICE9IG51bGwpCi0JCQkJCQkmJiAob2JqIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkKLQkJCQkJCSYmICh2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykpIHsKLQkJCQkJdmFsdWUgPSBjb250ZW50UHJvYy5yZXNvbHZlUmVzb3VyY2VGaWxlcygKLQkJCQkJCQkoTWV0aG9kRWxlbWVudCkgb2JqLCAoU3RyaW5nKSB2YWx1ZSk7Ci0JCQkJfQotCQkJCW9iai5lU2V0KGZlYXR1cmUsIHZhbHVlKTsKLQkJCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkJCU9iamVjdFtdIHBhcmFzID0gbmV3IE9iamVjdFtdIHsgZ2V0U3RyaW5nKG9iaiksIGZlYXR1cmVOYW1lLAotCQkJCQkJdmFsdWUgfTsKLQkJCQlsb2dnZXIubG9nRXJyb3IoTkxTLmJpbmQoSW1wb3J0WE1MUmVzb3VyY2VzLmxpYnJhcnlfZXJyb3Jfc2V0X2F0dHJpYnV0ZSwgcGFyYXMpLCBlKTsgCi0JCQkJLy8gZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCU9iamVjdFtdIHBhcmFzID0gbmV3IE9iamVjdFtdIHsgZ2V0U3RyaW5nKG9iaiksIGZlYXR1cmVOYW1lLCB2YWx1ZSB9OwotCQkJbG9nZ2VyLmxvZ1dhcm5pbmcoTkxTLmJpbmQoSW1wb3J0WE1MUmVzb3VyY2VzLmxpYnJhcnlfZXJyb3Jfc2V0X2F0dHJpYnV0ZV8zLCBwYXJhcykpOyAKLQkJfQotCi0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldE1lcEZlYXR1cmVWYWx1ZShFRGF0YU9iamVjdCBvYmosIFN0cmluZyBmZWF0dXJlTmFtZSwgT2JqZWN0IHZhbHVlKSB7Ci0JCUxpc3Qgc3JjTGlzdCA9IChMaXN0KSB2YWx1ZTsKLQkJaW50IHN6ID0gc3JjTGlzdCA9PSBudWxsID8gMCA6IHNyY0xpc3Quc2l6ZSgpOwkJCi0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gRmVhdHVyZU1hbmFnZXIuSU5TVEFOQ0UuZ2V0Um1jRmVhdHVyZShvYmoKLQkJCQkuZUNsYXNzKCksIGZlYXR1cmVOYW1lKTsKLQkJTGlzdCB0Z3RMaXN0ID0gKExpc3QpIG9iai5lR2V0KGZlYXR1cmUpOwotCQlpbnQgdHN6ID0gdGd0TGlzdCA9PSBudWxsID8gMCA6IHRndExpc3Quc2l6ZSgpOwotCi0JCS8vU291cmNlIGxpc3QgaXMgZW1wdHkKLQkJaWYgKHN6ID09IDApIHsKLQkJCWlmICh0c3ogPT0gMCkgewotCQkJCXJldHVybjsKLQkJCX0KLQkJCXRndExpc3QucmVtb3ZlQWxsKHRndExpc3QpOwotCQkJc2V0RGlydHkob2JqKTsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJLy9Tb3J1Y2UgYW5kIHRhcmdldCBhcmUgcG90ZW50aWFsbHkgdGhlIHNhbWUKLQkJYm9vbGVhbiBzYW1lID0gZmFsc2U7Ci0JCWlmIChzeiA9PSB0c3opIHsKLQkJCXNhbWUgPSB0cnVlOwotCQkJZm9yIChpbnQgaT0wOyBpIDwgc3o7IGkrKykgewotCQkJCW9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZEVsZW1lbnRQcm9wZXJ0eSBzcmNNZXAgPSAKLQkJCQkJKG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZEVsZW1lbnRQcm9wZXJ0eSkgc3JjTGlzdC5nZXQoaSk7Ci0JCQkJTWV0aG9kRWxlbWVudFByb3BlcnR5IHRndE1lcCA9IAotCQkJCQkoTWV0aG9kRWxlbWVudFByb3BlcnR5KSB0Z3RMaXN0LmdldChpKTsKLQkJCQlpZiAoISBzcmNNZXAuZ2V0TmFtZSgpLmVxdWFscyh0Z3RNZXAuZ2V0TmFtZSgpKSkgewotCQkJCQlzYW1lID0gZmFsc2U7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQlpZiAoISBzcmNNZXAuZ2V0VmFsdWUoKS5lcXVhbHModGd0TWVwLmdldFZhbHVlKCkpKSB7Ci0JCQkJCXNhbWUgPSBmYWxzZTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmIChzYW1lKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCS8vU29ydWNlIGFuZCB0YXJnZXQgYXJlIG5vdCB0aGUgc2FtZQotCQl0Z3RMaXN0LnJlbW92ZUFsbCh0Z3RMaXN0KTsKLQkJZm9yIChpbnQgaT0wOyBpIDwgc3o7IGkrKykgewotCQkJT2JqZWN0IHNyY0l0ZW0gPSBzcmNMaXN0LmdldChpKTsKLQkJCWlmIChzcmNJdGVtIGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kRWxlbWVudFByb3BlcnR5KSB7Ci0JCQkJb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kRWxlbWVudFByb3BlcnR5IG1lcCA9IAotCQkJCQkJKG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZEVsZW1lbnRQcm9wZXJ0eSkgc3JjSXRlbTsKLQkJCQlFQ2xhc3Mgb2JqQ2xhc3MgPSBGZWF0dXJlTWFuYWdlci5JTlNUQU5DRQotCQkJCS5nZXRSbWNFQ2xhc3MoIk1ldGhvZEVsZW1lbnRQcm9wZXJ0eSIpOwkvLyROT04tTkxTLTEkCi0JCQkJTWV0aG9kRWxlbWVudFByb3BlcnR5IHhtbE1lcCA9IChNZXRob2RFbGVtZW50UHJvcGVydHkpIEVjb3JlVXRpbC5jcmVhdGUob2JqQ2xhc3MpOwotCQkJCXhtbE1lcC5zZXRWYWx1ZShtZXAuZ2V0VmFsdWUoKSk7Ci0JCQkJeG1sTWVwLnNldE5hbWUobWVwLmdldE5hbWUoKSk7Ci0JCQkJdGd0TGlzdC5hZGQoeG1sTWVwKTsKLQkJCX0KLQkJfQotCQlzZXREaXJ0eShvYmopOwotCQkvL29iai5lU2V0KGZlYXR1cmUsIHRndExpc3QpOwotCX0KLQotCS8qKgotCSAqIFNldHMgcmVmZXJlbmNlIHZhbHVlLgotCSAqIEBwYXJhbSBvYmoKLQkgKiBAcGFyYW0gZmVhdHVyZU5hbWUKLQkgKiBAcGFyYW0gaWQKLQkgKiBAdGhyb3dzIEV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlZmVyZW5jZVZhbHVlKEVEYXRhT2JqZWN0IG9iaiwgU3RyaW5nIGZlYXR1cmVOYW1lLCBTdHJpbmcgaWQpCi0JCQl0aHJvd3MgRXhjZXB0aW9uIHsKLQkJaWYgKG9iaiA9PSBudWxsIHx8IGZlYXR1cmVOYW1lID09IG51bGwgfHwgaWQgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlFT2JqZWN0IHZhbHVlID0gZ2V0RWxlbWVudChpZCk7Ci0JCWlmICh2YWx1ZSA9PSBudWxsKSB7Ci0JCQlsb2dnZXIubG9nV2FybmluZyhOTFMuYmluZChJbXBvcnRYTUxSZXNvdXJjZXMubGlicmFyeV9lcnJvcl9zZXRfcmVmZXJlbmNlLCBmZWF0dXJlTmFtZSwgaWQpKTsKLQotCQkJcmV0dXJuOwotCQl9Ci0KLQkJLy8gZmluZCB0aGUgZmVhdHVyZSBhbmQgc2V0IHRoZSB2YWx1ZQotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IEZlYXR1cmVNYW5hZ2VyLklOU1RBTkNFLmdldFJtY0ZlYXR1cmUob2JqCi0JCQkJLmVDbGFzcygpLCBmZWF0dXJlTmFtZSk7Ci0JCWlmIChmZWF0dXJlID09IG51bGwpIHsKLQkJCU9iamVjdFtdIHBhcmFzID0gbmV3IE9iamVjdFtdIHsgZ2V0U3RyaW5nKG9iaiksIGZlYXR1cmVOYW1lLCBpZCB9OwotCQkJbG9nZ2VyLmxvZ1dhcm5pbmcoTkxTLmJpbmQoSW1wb3J0WE1MUmVzb3VyY2VzLmxpYnJhcnlfZXJyb3Jfc2V0X3JlZmVyZW5jZV8yLCBwYXJhcykpOyAKLQkJCXJldHVybjsKLQkJfQotCi0JCS8vIGRvbid0IGl0ZXJhdGUgdGhlIGNvbnRhaW5tZW50IGZlYXR1cmUKLQkJaWYgKHZhbHVlLmVDb250YWluZXIoKSA9PSBvYmopIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCS8vIFN0cmluZyBzdHIgPSBmZWF0dXJlLmdldEVUeXBlKCkuZ2V0TmFtZSgpOwotCQlpZiAoZmVhdHVyZS5pc01hbnkoKSkgewotCQkJdHJ5IHsKLQkJCQlMaXN0IGl0ZW1zID0gKExpc3QpIG9iai5lR2V0KGZlYXR1cmUpOwotCQkJCWlmICghaXRlbXMuY29udGFpbnModmFsdWUpKSB7Ci0JCQkJCWl0ZW1zLmFkZCh2YWx1ZSk7Ci0JCQkJfQotCQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJT2JqZWN0W10gcGFyYXMgPSBuZXcgT2JqZWN0W10geyBnZXRTdHJpbmcob2JqKSwgZmVhdHVyZU5hbWUsIGlkIH07Ci0JCQkJbG9nZ2VyCi0JCQkJCQkubG9nRXJyb3IoCi0JCQkJCQkJCU5MUy5iaW5kKEltcG9ydFhNTFJlc291cmNlcy5saWJyYXJ5X2Vycm9yX3NldF9yZWZlcmVuY2VfMiwgcGFyYXMpLCBlKTsgCi0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlvYmouZVNldChmZWF0dXJlLCB2YWx1ZSk7Ci0JCX0KLQkJCi0JCXNldERpcnR5KG9iaik7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB3b3JrIG9yZGVyLgotCSAqIEBwYXJhbSB1bWFXb3JrT3JkZXIKLQkgKiBAcGFyYW0gcHJlZElkCi0JICovCi0JcHVibGljIHZvaWQgc2V0V29ya09yZGVyKE9iamVjdCB1bWFXb3JrT3JkZXIsIFN0cmluZyBwcmVkSWQpIHsKLQkJaWYgKHVtYVdvcmtPcmRlciBpbnN0YW5jZW9mIFdvcmtPcmRlcikgewotCQkJV29ya0JyZWFrZG93bkVsZW1lbnQgZSA9IChXb3JrQnJlYWtkb3duRWxlbWVudCkgZ2V0RWxlbWVudChwcmVkSWQpOwotCQkJKChXb3JrT3JkZXIpIHVtYVdvcmtPcmRlcikuc2V0UHJlZChlKTsKLQkJCQotCQkJc2V0RGlydHkoKEVPYmplY3QpdW1hV29ya09yZGVyKTsKLQotCQl9Ci0JfQotCi0JLyoqCi0JICogRml4ZXMgbGlicmFyeS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBmaXhMaWJyYXJ5KCkgewotCQlNZXRob2RMaWJyYXJ5IHJvb3RPYmplY3QgPSBnZXRSb290KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSAoKE1ldGhvZExpYnJhcnkpIHJvb3RPYmplY3QpLmdldE1ldGhvZFBsdWdpbnMoKQotCQkJCS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlmaXhQbHVnaW4oKE1ldGhvZFBsdWdpbikgaXQubmV4dCgpKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBmaXggdGFzayBkZXNjcmlwdG9ycyBmb3IgaW1wb3J0Ci0JICogCi0JICovCi0JcHVibGljIHZvaWQgZml4VGFza0Rlc2NyaXB0b3JzKE1hcDxTdHJpbmcsIFRhc2tEZXNjcmlwdG9yPiB0ZE1hcCkgewotCQlpZiAodGRNYXAgPT0gbnVsbCB8fCB0ZE1hcC5pc0VtcHR5KCkpIHsKLQkJCXJldHVybjsKLQkJfQkJCi0JCWZvciAoSXRlcmF0b3I8TWFwLkVudHJ5PFN0cmluZywgVGFza0Rlc2NyaXB0b3I+PiBpdCA9IHRkTWFwLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJTWFwLkVudHJ5PFN0cmluZywgVGFza0Rlc2NyaXB0b3I+IGVudHJ5ID0gaXQubmV4dCgpOwotCQkJU3RyaW5nIGd1aWQgPSBlbnRyeS5nZXRLZXkoKTsKLQkJCVRhc2tEZXNjcmlwdG9yIHRkID0gZW50cnkuZ2V0VmFsdWUoKTsKLQkJCW9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0b3IgdW1hVGQgPSAob3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRvcikgZWxlbWVudHNNYXAuZ2V0KGd1aWQpOwotCQkJYXNzZXJ0KHVtYVRkICE9IG51bGwpOwotCQkJaWYgKHVtYVRkID09IG51bGwpIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCUxpc3Qgc3RlcHMgPSB0ZC5nZXRTdGVwKCk7Ci0JCQlmb3IgKGludCBpPTA7IGk8c3RlcHMuc2l6ZSgpOyBpKyspIHsKLQkJCQlvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RFbGVtZW50IHN0ZXAgPSAob3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kRWxlbWVudCkgc3RlcHMuZ2V0KGkpOwotCQkJCVNlY3Rpb24gdW1hU3RlcCA9ICAoU2VjdGlvbikgZWxlbWVudHNNYXAuZ2V0KHN0ZXAuZ2V0SWQoKSk7Ci0JCQkJYXNzZXJ0KHVtYVN0ZXAgIT0gbnVsbCk7Ci0JCQkJaWYgKHVtYVN0ZXAgIT0gbnVsbCkgewotCQkJCQl1bWFUZC5nZXRTZWxlY3RlZFN0ZXBzKCkuYWRkKHVtYVN0ZXApOwotCQkJCX0KLQkJCX0JCQkKLQkJfQkJCi0JfQotCi0JcHJpdmF0ZSBNZXRob2RQYWNrYWdlIGNwUm9vdCA9IG51bGw7Ci0KLQlwcml2YXRlIE1ldGhvZFBhY2thZ2UgZHBSb290ID0gbnVsbDsKLQotLy8JcHJpdmF0ZSBNZXRob2RQYWNrYWdlIHBjUm9vdCA9IG51bGw7Ci0KLQlwcml2YXRlIHZvaWQgZml4UGx1Z2luKE1ldGhvZFBsdWdpbiBwbHVnaW4pIHsKLQotCQkvLyBmaXggdGhlIHJvb3QgY3VzdG9tIGNhdGVnb3JpZXMKLQkJZml4Q3VzdG9tQ2F0ZWdvcmllcyhwbHVnaW4pOwotCi0JCUxpc3QgY3BQa2dzID0gbmV3IEFycmF5TGlzdCgpOwotCQlMaXN0IGRwUGtncyA9IG5ldyBBcnJheUxpc3QoKTsKLS8vCQlMaXN0IHBjUGtncyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQljcFJvb3QgPSBVbWFVdGlsLmZpbmRNZXRob2RQYWNrYWdlKHBsdWdpbiwKLQkJCQlNb2RlbFN0cnVjdHVyZS5ERUZBVUxULmNhcGFiaWxpdHlQYXR0ZXJuUGF0aCk7Ci0JCWRwUm9vdCA9IFVtYVV0aWwuZmluZE1ldGhvZFBhY2thZ2UocGx1Z2luLAotCQkJCU1vZGVsU3RydWN0dXJlLkRFRkFVTFQuZGVsaXZlcnlQcm9jZXNzUGF0aCk7Ci0vLwkJcGNSb290ID0gVW1hVXRpbC5maW5kTWV0aG9kUGFja2FnZShwbHVnaW4sCi0vLwkJCQlNb2RlbFN0cnVjdHVyZS5ERUZBVUxULnByb2Nlc3NDb250cmlidXRpb25QYXRoKTsKLQkJZ2V0QWxsUGFja2FnZXMoY3BSb290LCBjcFBrZ3MpOwotCQlnZXRBbGxQYWNrYWdlcyhkcFJvb3QsIGRwUGtncyk7Ci0JCQotLy8JCWlmICggcGNQa2dzICE9IG51bGwgKSB7Ci0vLwkJCWdldEFsbFBhY2thZ2VzKHBjUm9vdCwgcGNQa2dzKTsKLS8vCQl9Ci0JCQkKLQkJTGlzdCBwcm9jcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChJdGVyYXRvciBpdCA9IHBsdWdpbi5lQWxsQ29udGVudHMoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJRU9iamVjdCBvID0gKEVPYmplY3QpaXQubmV4dCgpOwotCQkJYm9vbGVhbiBvbGROb3RpZnkgPSBvLmVEZWxpdmVyKCk7Ci0JCQl0cnkJewotCQkJCS8vIHR1cm4gb2ZmIG5vdGlmaWNhdGlvbnMgdG8gYXZvaWQgcG9zc2libGUgZGVhZGxvY2sgb3IgdGhyZWFkIGlzc3VlCi0JCQkJLy8gMTU0MTQyIC0gaW1wb3J0IHhtbCBjYXVzZWQgdGhyZWFkIGFjY2VzcyBlcnJvcgotCQkJCW8uZVNldERlbGl2ZXIoZmFsc2UpOwotCQkJCQotCQkJCWlmIChvIGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkgewotCQkJCQlwcm9jcy5hZGQobyk7Ci0JCQkJfSBlbHNlIGlmIChvIGluc3RhbmNlb2YgRGVzY3JpYmFibGVFbGVtZW50KSB7Ci0JCQkJCVN0cmluZyBwTmFtZSA9ICgoRGVzY3JpYmFibGVFbGVtZW50KSBvKS5nZXRQcmVzZW50YXRpb25OYW1lKCk7Ci0JCQkJCWlmIChwTmFtZSA9PSBudWxsIHx8IHBOYW1lLmxlbmd0aCgpID09IDApIHsKLQkJCQkJCSgoRGVzY3JpYmFibGVFbGVtZW50KSBvKQotCQkJCQkJCQkuc2V0UHJlc2VudGF0aW9uTmFtZSgoKERlc2NyaWJhYmxlRWxlbWVudCkgbykKLQkJCQkJCQkJCQkuZ2V0TmFtZSgpKTsKLQkJCQkJfQotCQkJCX0KLQkKLQkJCQkvLyBmaXggdGhlIG5hbWUgc3RyaW5nCi0JCQkJaWYgKG8gaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50ICYmICEobyBpbnN0YW5jZW9mIFNlY3Rpb24pKSB7Ci0JCQkJCVN0cmluZyBuYW1lID0gKChNZXRob2RFbGVtZW50KSBvKS5nZXROYW1lKCk7Ci0JCQkJCVN0cmluZyBuZXdfbmFtZSA9IFN0clV0aWwubWFrZVZhbGlkRmlsZU5hbWUobmFtZSk7Ci0JCQkJCWlmICggIW5ld19uYW1lLmVxdWFscyhuYW1lKSApIHsKLQkJCQkJCSgoTWV0aG9kRWxlbWVudCkgbykuc2V0TmFtZShuZXdfbmFtZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGZpbmFsbHkgewotCQkJCW8uZVNldERlbGl2ZXIob2xkTm90aWZ5KTsKLQkJCX0KLQkJfQotCi0JCWlmIChwcm9jcy5zaXplKCkgPiAwKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gcHJvY3MuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCVByb2Nlc3NDb21wb25lbnQgcGMgPSAoUHJvY2Vzc0NvbXBvbmVudCkgaXQubmV4dCgpOwotCQkJCU9iamVjdCBwcm9jID0gcGMuZ2V0UHJvY2VzcygpOwotCQkJCWlmIChwcm9jIGluc3RhbmNlb2YgRGVsaXZlcnlQcm9jZXNzKSB7Ci0JCQkJCWlmICghZHBQa2dzLmNvbnRhaW5zKHBjKSkgewotCQkJCQkJbW92ZVByb2Nlc3NDb21wb25lbnQocGMsIGRwUm9vdCk7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgaWYgKHByb2MgaW5zdGFuY2VvZiBDYXBhYmlsaXR5UGF0dGVybikgewotCQkJCQlpZiAoIWNwUGtncy5jb250YWlucyhwYykpIHsKLQkJCQkJCW1vdmVQcm9jZXNzQ29tcG9uZW50KHBjLCBjcFJvb3QpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGdldEFsbFBhY2thZ2VzKE1ldGhvZFBhY2thZ2UgcGtnLCBMaXN0IHBrZ3MpIHsKLQkJcGtncy5hZGQocGtnKTsKLQkJZm9yIChJdGVyYXRvciBpdCA9IHBrZy5nZXRDaGlsZFBhY2thZ2VzKCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJZ2V0QWxsUGFja2FnZXMoKE1ldGhvZFBhY2thZ2UpIGl0Lm5leHQoKSwgcGtncyk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBtb3ZlIHRoZSBwcm9jZXNzIHBhY2thZ2UgdG8gdGhlIHNwZWNpZmllZCBjb250YWluZXIsIGlmIHRoZSBwYWNrYWdlIGlzCi0JICogdGhlIG9ubHkgY2hpbGQgb2YgaXQncyBwYXJlbnQsIG1vdmUgaXQncyBwYXJlbnQKLQkgKiAKLQkgKiBAcGFyYW0gcGtnCi0JICogQHBhcmFtIGNvbnRhaW5lcgotCSAqLwotCXByaXZhdGUgdm9pZCBtb3ZlUHJvY2Vzc0NvbXBvbmVudChQcm9jZXNzUGFja2FnZSBwa2csCi0JCQlNZXRob2RQYWNrYWdlIGNvbnRhaW5lcikgewotCQkvLyBtYWtlIHN1cmUgQ2FwYWJpbGl0eSBwYXR0ZXJucyBhcmUgaW4gdGhlIENhcGFiaWxpdHkgcGFja2FnZXMKLQkJT2JqZWN0IG8gPSBwa2cuZUNvbnRhaW5lcigpOwotCQlpZiAoKG8gaW5zdGFuY2VvZiBQcm9jZXNzUGFja2FnZSkKLQkJCQkmJiAoKChQcm9jZXNzUGFja2FnZSkgbykuZ2V0Q2hpbGRQYWNrYWdlcygpLnNpemUoKSA9PSAxKQotCQkJCSYmIG8gIT0gY3BSb290ICYmIG8gIT0gZHBSb290ICkgewotCQkJbW92ZVByb2Nlc3NDb21wb25lbnQoKFByb2Nlc3NQYWNrYWdlKSBvLCBjb250YWluZXIpOwotCQl9IGVsc2UgewotCQkJY29udGFpbmVyLmdldENoaWxkUGFja2FnZXMoKS5hZGQocGtnKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIGZpbmQgdGhlIHJvb3QgY3VzdG9tIGNhZ2Vnb3J5IGFuZCBwdXQgdG8gdGhlIHJvb3QgcGFja2FnZQotCSAqIAotCSAqIEBwYXJhbSBwbHVnaW4KLQkgKiAgICAgICAgICAgIE1ldGhvZFBsdWdpbgotCSAqLwotCXByaXZhdGUgdm9pZCBmaXhDdXN0b21DYXRlZ29yaWVzKE1ldGhvZFBsdWdpbiBwbHVnaW4pIHsKLQkJQ29udGVudFBhY2thZ2UgcGtnID0gVW1hVXRpbC5maW5kQ29udGVudFBhY2thZ2UocGx1Z2luLAotCQkJCU1vZGVsU3RydWN0dXJlLkRFRkFVTFQuY3VzdG9tQ2F0ZWdvcnlQYXRoKTsKLQkJTGlzdCBpdGVtcyA9IG5ldyBBcnJheUxpc3QocGtnLmdldENvbnRlbnRFbGVtZW50cygpKTsKLQotCQlMaXN0IHJvb3RJdGVtcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJd2hpbGUgKGl0ZW1zLnNpemUoKSA+IDApIHsKLQkJCUN1c3RvbUNhdGVnb3J5IGNjID0gKEN1c3RvbUNhdGVnb3J5KSBpdGVtcy5yZW1vdmUoMCk7Ci0JCQlyb290SXRlbXMuYWRkKGNjKTsKLQkJCQotCQkJLy8gMTU4NjkxQ3VzdG9tIENhdGVnb3J5IGlzIGRpZmZlcmVudCBpbiBleHBvcnRlZCBsaWJyYXJ5Ci0JCQkvLyBuZWVkIHRvIHJlbW92ZSBzdWItY2F0ZWdvcmllcyByZWN1cnNpdmVseQotCQkJZml4Q3VzdG9tQ2F0ZWdvcmllcyhjYywgaXRlbXMsIHJvb3RJdGVtcyk7Ci0JCX0KLQotCQlUbmdVdGlsLmdldFJvb3RDdXN0b21DYXRlZ29yeShwbHVnaW4pLmdldENhdGVnb3JpemVkRWxlbWVudHMoKS5hZGRBbGwoCi0JCQkJcm9vdEl0ZW1zKTsKLQotCX0KLQkKLQkvKioKLQkgKiBmaW5kIHRoZSByb290IGN1c3RvbSBjYXRlZ29yaWVzIGJ5IHJlbW92aW5nIHRoZSBzdWItY2F0ZWdvcmllcyByZWN1cnNpdmVseQotCSAqIAotCSAqIEBwYXJhbSBjYwotCSAqIEBwYXJhbSBpdGVtcwotCSAqIEBwYXJhbSByb290SXRlbXMKLQkgKi8KLQlwcml2YXRlIHZvaWQgZml4Q3VzdG9tQ2F0ZWdvcmllcyhDdXN0b21DYXRlZ29yeSBjYywgTGlzdCBpdGVtcywgTGlzdCByb290SXRlbXMpIHsKLQkJZm9yIChJdGVyYXRvciBpdCA9IGNjLmdldFN1YkNhdGVnb3JpZXMoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgaXRlbSA9IGl0Lm5leHQoKTsKLQkJCWl0ZW1zLnJlbW92ZShpdGVtKTsKLQkJCXJvb3RJdGVtcy5yZW1vdmUoaXRlbSk7Ci0JCQlmaXhDdXN0b21DYXRlZ29yaWVzKChDdXN0b21DYXRlZ29yeSlpdGVtLCBpdGVtcywgcm9vdEl0ZW1zKTsKLQkJfQotCQkKLQkJLy8gYWxzbyBpdGVyYXRlIHRoZSBjb250YWluZWQgZWxlbWVudHMKLQkJZm9yIChJdGVyYXRvciBpdCA9IGNjLmdldENhdGVnb3JpemVkRWxlbWVudHMoKS5pdGVyYXRvcigpOyBpdAotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgaXRlbSA9IGl0Lm5leHQoKTsKLQkJCWlmIChpdGVtIGluc3RhbmNlb2YgQ3VzdG9tQ2F0ZWdvcnkpIHsKLQkJCQlpdGVtcy5yZW1vdmUoaXRlbSk7Ci0JCQkJcm9vdEl0ZW1zLnJlbW92ZShpdGVtKTsKLQkJCQlmaXhDdXN0b21DYXRlZ29yaWVzKChDdXN0b21DYXRlZ29yeSlpdGVtLCBpdGVtcywgcm9vdEl0ZW1zKTsKLQkJCX0KLQkJfQotCX0KLQkKLQkvKioKLQkgKiBkZWxldGUgdGhlIHVuLW5lZWRlZCBlbGVtZW50cyBhcmUgY2xlYXIgcmVzb3VyY2VzIAotCSAqLwotCXB1YmxpYyB2b2lkIGRlbGV0ZUVsZW1lbnRzKCkgewotCQkKLQkJSUZpbGVNYW5hZ2VyIGZpbGVNZ3IgPSBTZXJ2aWNlcy5nZXRGaWxlTWFuYWdlcigpOwotCi0JCUxpc3QgZGVsZXRlZEVsZW1lbnRzID0gbmV3IEFycmF5TGlzdCgpOwotCQkKLQkJZm9yIChJdGVyYXRvciBpdCA9IGVsZW1lbnRzTWFwLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOyApIHsKLQkJCU1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpaXQubmV4dCgpOwotCQkJU3RyaW5nIGlkID0gKFN0cmluZyllbnRyeS5nZXRLZXkoKTsKLQkJCU1ldGhvZEVsZW1lbnQgZSA9IChNZXRob2RFbGVtZW50KWVudHJ5LmdldFZhbHVlKCk7Ci0JCQlpZiAoIHNvdXJjZUVsZW1lbnRJRHMuY29udGFpbnMoaWQpICkgewotCQkJCWNvbnRpbnVlOwotCQkJfSBlbHNlIGlmIChvdmVyd3JpdGUpIHsKLQkJCQlib29sZWFuIHRvRGVsZXRlID0gIShlIGluc3RhbmNlb2YgTWV0aG9kTGlicmFyeSB8fCBlIGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luCi0JCQkJCQkJCQl8fCBlIGluc3RhbmNlb2YgTWV0aG9kQ29uZmlndXJhdGlvbik7Ci0JCQkJaWYgKHRvRGVsZXRlKSB7Ci0JCQkJCU1ldGhvZEVsZW1lbnQgcGx1Z2luID0gVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4oZSk7Ci0JCQkJCXRvRGVsZXRlID0gcGx1Z2luICE9IG51bGwgJiYgIWlzTmV3RWxlbWVudChwbHVnaW4uZ2V0R3VpZCgpKQotCQkJCQkmJiBzb3VyY2VFbGVtZW50SURzLmNvbnRhaW5zKHBsdWdpbi5nZXRHdWlkKCkpOwotCQkJCX0KLQkJCQlpZiAodG9EZWxldGUpIHsKLQkJCQkJZGVsZXRlZEVsZW1lbnRzLmFkZChlKTsKLQkJCQkJaGFuZGxlQWN0aXZpdHlSZW1vdmFsKGUpOwotCQkJCQkvL0Vjb3JlVXRpbC5yZW1vdmUoZSk7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCX0KLQkJCQotCQkJaWYgKCAoZSBpbnN0YW5jZW9mIEN1c3RvbUNhdGVnb3J5KSAmJiBUbmdVdGlsLmlzUm9vdEN1c3RvbUNhdGVnb3J5KCAoQ3VzdG9tQ2F0ZWdvcnkpZSApICkgewotCQkJCWNvbnRpbnVlOwotCQkJfQkJCQotCQkJCi0JCQkvLyBkZWxldGUgdGhlIGVsZW1lbnQgaWYgdGhlIGNvbnRhaW5nIHBhY2thZ2UgaXMgaW4gdGhlIHNvdXJjZSBsaWJyYXJ5Ci0JCQkvLyBkb24ndCBkZWxldGUgaWYgdGhlIHBhY2thZ2UgaXMgbm90IGluIHRoZSB4bWwgbGlicmFyeQotCQkJTWV0aG9kUGFja2FnZSBwa2cgPSBUbmdVdGlsLmdldE1ldGhvZFBhY2thZ2UoZSk7Ci0JCQkKLQkJCWlmICggcGtnICE9IG51bGwgKSB7IAotCQkJCVN0cmluZyBwaWQgPSBwa2cuZ2V0R3VpZCgpOwotCQkJCWlmICggc291cmNlRWxlbWVudElEcy5jb250YWlucyhwaWQpICkgewotCQkJCQlkZWxldGVkRWxlbWVudHMuYWRkKGUpOwotCQkJCQloYW5kbGVBY3Rpdml0eVJlbW92YWwoZSk7Ci0JCQkJCQotCQkJCQkvLyBkZWxldGUgdGhlIGVsZW1lbnQgZnJvbSB0aGUgbGlicmFyeQotCQkJCQkvL0Vjb3JlVXRpbC5yZW1vdmUoZSk7CQkJCQotCQkJCX0gZWxzZSBpZiAoZSBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJCQotCQkJCQlib29sZWFuIHRvQ2hlY2sgPSB0cnVlOwotCQkJCQlNZXRob2RQYWNrYWdlIHBjID0gcGtnOwkJCQkJCi0JCQkJCXdoaWxlKHBjICE9IG51bGwgJiYgISAocGMgaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50KSkgewotCQkJCQkJcGMgPSBUbmdVdGlsLmdldFBhcmVudE1ldGhvZFBhY2thZ2UocGMpOwotCQkJCQl9Ci0JCQkJCWlmIChwYyBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpIHsKLQkJCQkJCXRvQ2hlY2sgPSBzb3VyY2VFbGVtZW50SURzLmNvbnRhaW5zKHBjLmdldEd1aWQoKSk7Ci0JCQkJCX0KLQkJCQkJCi0JCQkJCWlmICh0b0NoZWNrKSB7Ci0JCQkJCQlwa2cgPSBUbmdVdGlsLmdldE1ldGhvZFBhY2thZ2UocGtnKTsKLQkJCQkJCXdoaWxlIChwa2cgIT0gbnVsbCkgewotCQkJCQkJCXBpZCA9IHBrZy5nZXRHdWlkKCk7Ci0JCQkJCQkJaWYgKHNvdXJjZUVsZW1lbnRJRHMuY29udGFpbnMocGlkKSkgewotCQkJCQkJCQlkZWxldGVkRWxlbWVudHMuYWRkKGUpOwotCQkJCQkJCQloYW5kbGVBY3Rpdml0eVJlbW92YWwoZSk7Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCX0KLQkJCQkJCQlwa2cgPSBUbmdVdGlsLmdldFBhcmVudE1ldGhvZFBhY2thZ2UocGtnKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQkJLy8gZGVsZXRlIHRoZSByZXNvdXJjZXMKLQkJZGVsZXRlUmVzb3J1Y2VzKGRlbGV0ZWRFbGVtZW50cyk7Ci0JfQotCi0JLy8JMTY0NTgxCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZUFjdGl2aXR5UmVtb3ZhbChNZXRob2RFbGVtZW50IGUpIHsKLQkJaWYgKCEoZSBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnQpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJQnJlYWtkb3duRWxlbWVudCBlYWN0ID0gKEJyZWFrZG93bkVsZW1lbnQpIGU7Ci0JCUFjdGl2aXR5IHNhY3QgPSBlYWN0LmdldFN1cGVyQWN0aXZpdGllcygpOwotCQlpZiAoc2FjdCAhPSBudWxsKSB7Ci0JCQlzYWN0LmdldEJyZWFrZG93bkVsZW1lbnRzKCkucmVtb3ZlKGVhY3QpOwotCQl9Ci0JfQotCQotCS8vIGNsZWFyIHJlc291cmNlcyBmb3IgZGVsZXRlZCBlbGVtZW50cwotCXByaXZhdGUgdm9pZCBkZWxldGVSZXNvcnVjZXMoTGlzdCBkZWxldGVkRWxlbWVudHMpIHsKLQkJaWYgKCBkZWxldGVkRWxlbWVudHMuc2l6ZSgpID09IDAgKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCUlGaWxlTWFuYWdlciBmaWxlTWdyID0gU2VydmljZXMuZ2V0RmlsZU1hbmFnZXIoKTsKLQotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gZGVsZXRlZEVsZW1lbnRzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTsgKSB7Ci0JCQlNZXRob2RFbGVtZW50IGUgPSAoTWV0aG9kRWxlbWVudClpdC5uZXh0KCk7Ci0JCQkKLQkJCUVPYmplY3Qgb2JqID0gbnVsbDsKLQkJCWlmICggZSBpbnN0YW5jZW9mIERlc2NyaWJhYmxlRWxlbWVudCApIHsKLQkJCQlvYmogPSAoKERlc2NyaWJhYmxlRWxlbWVudCllKS5nZXRQcmVzZW50YXRpb24oKTsKLQkJCX0gZWxzZSBpZiAoIGUgaW5zdGFuY2VvZiBDb250ZW50RGVzY3JpcHRpb24gfHwKLQkJCQkJb3ZlcndyaXRlICYmIGUgaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50KSB7Ci0JCQkJb2JqID0gZTsKLQkJCX0KLQkJCWlmICggb2JqICE9IG51bGwgKSB7Ci0JCQkJTWV0aG9kRWxlbWVudCBwbHVnaW4gPSBVbWFVdGlsLmdldE1ldGhvZFBsdWdpbihlKTsKLQkJCQlSZXNvdXJjZSBwbHVnaW5SZXMgPSBwbHVnaW4gPT0gbnVsbCA/IG51bGwgOiBwbHVnaW4uZVJlc291cmNlKCk7Ci0JCQkJCi0JCQkJUmVzb3VyY2UgcmVzID0gb2JqLmVSZXNvdXJjZSgpOwotCQkJCWlmICggcmVzICE9IG51bGwgJiYgcmVzICE9IHBsdWdpblJlcykgewkJLy9Qcm90ZWN0ZWQgZnJvbSBidWdzIGxpa2UgMTc3MDQyCi0JCQkJCVN0cmluZyBmaWxlID0gcmVzLmdldFVSSSgpLnRvRmlsZVN0cmluZygpOwotCQkJCQlpZiAoIGRlYnVnICkgewotCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJkZWxldGluZyByZXNvdXJjZTogIiArIGZpbGUpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQkJCi0JCQkJCWlmICggIWZpbGVNZ3IuZGVsZXRlKGZpbGUpICkgewotCQkJCQkJaWYgKCBkZWJ1ZyApIHsKLQkJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oInVuYWJsZSB0byBkZWxldGUgZmlsZTogIiArIGZpbGUpOyAvLyROT04tTkxTLTEkCi0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJCi0JCQkJCUVPYmplY3QgcmVzTWdyID0gTXVsdGlGaWxlU2F2ZVV0aWwuZ2V0UmVzb3VyY2VNYW5hZ2VyKHJlcyk7Ci0JCQkJCWlmIChyZXNNZ3IgIT0gbnVsbCkgewotCQkJCQkJRWNvcmVVdGlsLnJlbW92ZShyZXNNZ3IpOwotCQkJCQl9Ci0JCQkJCUVPYmplY3QgcmVzRGVzID0gTXVsdGlGaWxlU2F2ZVV0aWwuZ2V0UmVzb3VyY2VEZXNjcmlwdG9yKHJlcyk7Ci0JCQkJCWlmIChyZXNEZXMgIT0gbnVsbCkgewotCQkJCQkJRWNvcmVVdGlsLnJlbW92ZShyZXNEZXMpOwotCQkJCQl9Ci0JCQkJCWlmIChvdmVyd3JpdGUpIHsJCQkJCQkKLQkJCQkJCUZpbGUgZm9sZGVyID0gbmV3IEZpbGUoZmlsZSkuZ2V0UGFyZW50RmlsZSgpOwotCQkJCQkJRmlsZSBmaWxlc1tdID0gZm9sZGVyLmxpc3RGaWxlcygpOwotCQkJCQkJaWYgKGZpbGVzID09IG51bGwgfHwgZmlsZXMubGVuZ3RoID09IDAgKSB7Ci0JCQkJCQkJaWYgKCBkZWJ1ZyApIHsKLQkJCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJkZWxldGluZyBmb2xkZXIgcmVzb3VyY2U6ICIgKyBmb2xkZXIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJfQotCQkJCQkJCWlmICggIWZpbGVNZ3IuZGVsZXRlKGZvbGRlci5nZXRBYnNvbHV0ZVBhdGgoKSkgKSB7Ci0JCQkJCQkJCWlmICggZGVidWcgKSB7Ci0JCQkJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oInVuYWJsZSB0byBkZWxldGUgZm9sZGVyIGZpbGU6ICIgKyBmb2xkZXIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9CQkJCQkJCQkKLQkJCX0KLQkJCQotCQkJRWNvcmVVdGlsLnJlbW92ZShlKTsKLQkJfQotCX0KLQkJCQotCS8qKgotCSAqIEBwYXJhbSBndWlkCi0JICogQHJldHVybiB0cnVlIGlmIHRoZSBlbGVtZW50IGdpdmVuIGJ5IGd1aWQgaXMgbmV3LgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzTmV3RWxlbWVudChTdHJpbmcgZ3VpZCkgewotCQlyZXR1cm4gbmV3RWxlbWVudHNNYXAuY29udGFpbnNLZXkoZ3VpZCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sL3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3htbC9zZXJ2aWNlcy9wYWNrYWdlLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0LnhtbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy94bWwvc2VydmljZXMvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NzliMTY4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sL3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3htbC9zZXJ2aWNlcy9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyB0aGUgaW50ZXJmYWNlcyBhbmQgaW1wbGVtZW50YXRpb24gZm9yIHRoZSBJbXBvcnQgWE1MIHNlcnZpY2UuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcveG1sL3dpemFyZHMvSW1wb3J0WE1MV2l6YXJkLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0LnhtbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy94bWwvd2l6YXJkcy9JbXBvcnRYTUxXaXphcmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjE1YWE5MC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0LnhtbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy94bWwvd2l6YXJkcy9JbXBvcnRYTUxXaXphcmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyNSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLnhtbC53aXphcmRzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLndpemFyZHMuU2F2ZUFsbEVkaXRvcnNQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udWkudXRpbC5Nc2dCb3g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwuRXhwb3J0WE1MUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcueG1sLkltcG9ydFhNTFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLnhtbC5JbXBvcnRYTUxSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy54bWwucHJlZmVyZW5jZXMuSW1wb3J0WE1MUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy54bWwuc2VydmljZXMuSW1wb3J0WE1MU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5JTGlicmFyeU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuYWN0aW9ucy5MaWJyYXJ5TG9ja2luZ09wZXJhdGlvblJ1bm5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS53aXphcmRzLkxpYnJhcnlCYWNrdXBVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuUmVzb3VyY2VVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5NdWx0aUZpbGVTYXZlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UucmVmcmVzaC5SZWZyZXNoSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy5JRmlsZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzLlNlcnZpY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVXaXRoUHJvZ3Jlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUltcG9ydFdpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotCi0vKioKLSAqIFRoZSBJbXBvcnQgWE1MIHdpemFyZC4KLSAqIDxwPgotICogVGhpcyB3aXphcmQgaXMgdXNlZCB0byBpbXBvcnQgbWV0aG9kIGxpYnJhcnkgY29udGVudCBzdG9yZWQgaW4gYSBYTUwgZmlsZS4KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgSW1wb3J0WE1MV2l6YXJkIGV4dGVuZHMgV2l6YXJkIGltcGxlbWVudHMgSUltcG9ydFdpemFyZCB7Ci0KLQlJbXBvcnRYTUxTZXJ2aWNlIHNlcnZpY2UgPSBuZXcgSW1wb3J0WE1MU2VydmljZSgpOwotCi0JcHJpdmF0ZSBib29sZWFuIHN1Y2NlZWQgPSB0cnVlOwotCQotCXByaXZhdGUgU2VsZWN0WE1MRmlsZVBhZ2UgZmlsZVBhZ2UgPSBudWxsOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgSW1wb3J0WE1MV2l6YXJkKCkgewotCQlzdXBlcigpOwotCQlzZXRXaW5kb3dUaXRsZShJbXBvcnRYTUxSZXNvdXJjZXMuaW1wb3J0WE1MV2l6YXJkX3RpdGxlKTsKLQkJc2V0TmVlZHNQcm9ncmVzc01vbml0b3IodHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2l6YXJkI2luaXQoSVdvcmtiZW5jaCwKLQkgKiAgICAgIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaCB3b3JrYmVuY2gsIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZCNhZGRQYWdlcygpCi0JICovCi0JcHVibGljIHZvaWQgYWRkUGFnZXMoKSB7Ci0JCS8vIGNoZWNrIG91dCB0aGUgbGlicmFyeSBmaXJzdAotCQlJRmlsZU1hbmFnZXIgZmlsZU1nciA9IFNlcnZpY2VzLmdldEZpbGVNYW5hZ2VyKCk7Ci0JCWlmIChMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCkgIT0gbnVsbCkgewotCQkJZmlsZU1nci5jaGVja01vZGlmeShMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJCS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpLmVSZXNvdXJjZSgpLmdldFVSSSgpLnRvRmlsZVN0cmluZygpLAotCQkJCQlNc2dCb3guZ2V0RGVmYXVsdFNoZWxsKCkpOwotCQl9Ci0KLQkJSUxpYnJhcnlNYW5hZ2VyIG1hbmFnZXIgPSAoSUxpYnJhcnlNYW5hZ2VyKSBMaWJyYXJ5U2VydmljZQotCQkJCS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRMaWJyYXJ5TWFuYWdlcigpOwotCQlpZiAobWFuYWdlciAhPSBudWxsICYmIG1hbmFnZXIuaXNNZXRob2RMaWJyYXJ5UmVhZE9ubHkoKSkgewotCQkJRmlsZSBsaWJyYXJ5RmlsZSA9IG5ldyBGaWxlKExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLQkJCQkJLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5TG9jYXRpb24oKSwKLQkJCQkJTXVsdGlGaWxlU2F2ZVV0aWwuREVGQVVMVF9MSUJSQVJZX01PREVMX0ZJTEVOQU1FKTsKLQkJCUltcG9ydFhNTFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkuZGlzcGxheUVycm9yKAotCQkJCQlJbXBvcnRYTUxSZXNvdXJjZXMuaW1wb3J0WE1MV2l6YXJkX3RpdGxlLAotCQkJCQlJbXBvcnRYTUxSZXNvdXJjZXMuaW1wb3J0WE1MRXJyb3JfbXNnLAotCQkJCQlOTFMuYmluZChJbXBvcnRYTUxSZXNvdXJjZXMuaW1wb3J0WE1MRXJyb3JfcmVhc29uLAotCQkJCQkJCWxpYnJhcnlGaWxlLmdldEFic29sdXRlUGF0aCgpKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlTYXZlQWxsRWRpdG9yc1BhZ2UuYWRkUGFnZUlmTmVlZGVkKHRoaXMsIHRydWUsIG51bGwsIG51bGwsIEltcG9ydFhNTFBsdWdpbgotCQkJCS5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKAotCQkJCQkJImZ1bGwvd2l6YmFuL0ltcG9ydFhNTC5naWYiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCWZpbGVQYWdlID0gbmV3IFNlbGVjdFhNTEZpbGVQYWdlKCk7Ci0JCWFkZFBhZ2UoZmlsZVBhZ2UpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZCNjcmVhdGVQYWdlQ29udHJvbHMoQ29tcG9zaXRlKQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZVBhZ2VDb250cm9scyhDb21wb3NpdGUgcGFnZUNvbnRhaW5lcikgewotCQlzdXBlci5jcmVhdGVQYWdlQ29udHJvbHMocGFnZUNvbnRhaW5lcik7Ci0JCXBhZ2VDb250YWluZXIuZ2V0U2hlbGwoKS5zZXRJbWFnZSgKLQkJCQlFeHBvcnRYTUxQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFNoYXJlZEltYWdlKAotCQkJCQkJImZ1bGwvb2JqMTYvWE1MRmlsZS5naWYiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkI3BlcmZvcm1GaW5pc2goKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHBlcmZvcm1GaW5pc2goKSB7Ci0JCWJvb2xlYW4gcmVmcmVzaCA9IFJlZnJlc2hKb2IuZ2V0SW5zdGFuY2UoKS5pc0VuYWJsZWQoKTsKLQkJaWYgKHJlZnJlc2gpIHsKLQkJCS8vTmVlZGVkOiBiZWNhdXNlIExpYnJhcnlMb2NraW5nT3BlcmF0aW9uUnVubmVyIGFkZHMgZXZlbnRzIHRvIFJlZnJlc2hKb2IgYXQgdGhlCi0JCQkvL2VuZCBvZiAicnVuIiBjYWxsIQotCQkJUmVmcmVzaEpvYi5nZXRJbnN0YW5jZSgpLnNldEVuYWJsZWQoZmFsc2UpOwotCQl9CQkKLQkJZmluYWwgYm9vbGVhbiByZXRbXSA9IG5ldyBib29sZWFuWzFdOwkJCi0JCUxpYnJhcnlMb2NraW5nT3BlcmF0aW9uUnVubmVyIHJ1bm5lciA9IG5ldyBMaWJyYXJ5TG9ja2luZ09wZXJhdGlvblJ1bm5lcigpOwotCQlydW5uZXIucnVuKG5ldyBJUnVubmFibGVXaXRoUHJvZ3Jlc3MoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQkJCXJldFswXSA9IHBlcmZvcm1GaW5pc2hfKCk7Ci0JCQl9CQkJCi0JCX0pOwotCQlpZiAocmVmcmVzaCkgewotCQkJdHJ5IHsKLQkJCQlUaHJlYWQuc2xlZXAoMTAwMCk7IC8vIHRlbXAgc29sdXRpb24gZm9yIHBvdGVudGlhbCByYWNpbmcKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQl9Ci0JCQlSZWZyZXNoSm9iLmdldEluc3RhbmNlKCkuc2V0RW5hYmxlZCh0cnVlKTsKLQkJfQotCQkKLQkJCi0JCXJ1bm5lciA9IG5ldyBMaWJyYXJ5TG9ja2luZ09wZXJhdGlvblJ1bm5lcigpOwotCQlydW5uZXIucnVuKG5ldyBJUnVubmFibGVXaXRoUHJvZ3Jlc3MoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQkJCVN0cmluZyBtc2cgPSBOTFMuYmluZChJbXBvcnRYTUxSZXNvdXJjZXMucmV2aWV3X2xvZ19maWxlcywKLQkJCQkJCXNlcnZpY2UuZ2V0TG9nUGF0aCgpKTsKLQkJCQkJTXNnQm94LnByb21wdChtc2csIFNXVC5PSyk7Ci0JCQl9CQkJCi0JCX0pOwkJCi0JCQotCQlSZXNvdXJjZVV0aWwucmVmcmVzaFJlc291cmNlcyhMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCksIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQkKLQkJcmV0dXJuIHJldFswXTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZCNwZXJmb3JtRmluaXNoKCkKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gcGVyZm9ybUZpbmlzaF8oKSB7Ci0JCUxpYnJhcnlCYWNrdXBVdGlsLnByb21wdEJhY2t1cEN1cnJlbnRMaWJyYXJ5KG51bGwsIExpYnJhcnlTZXJ2aWNlCi0JCQkJLmdldEluc3RhbmNlKCkpOwotCi0JCUlSdW5uYWJsZVdpdGhQcm9ncmVzcyBvcCA9IG5ldyBJUnVubmFibGVXaXRoUHJvZ3Jlc3MoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQotCQkJCQl0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB7Ci0JCQkJdHJ5IHsKLQkJCQkJbW9uaXRvci5iZWdpblRhc2soSW1wb3J0WE1MUmVzb3VyY2VzLmltcG9ydGluZ1hNTF90ZXh0LAotCQkJCQkJCUlQcm9ncmVzc01vbml0b3IuVU5LTk9XTik7Ci0KLQkJCQkJU3RyaW5nIHhtbEZpbGUgPSBmaWxlUGFnZS5nZXRQYXRoKCk7Ci0JCQkJCWJvb2xlYW4gbWVyZ2VPcHRpb24gPSBmaWxlUGFnZS5nZXRNZXJnZU9wdGlvbigpOwotCQkJCQlib29sZWFuIGNoZWNrQmFzZVBsdWdpbnMgPSBmaWxlUGFnZS5nZXRDaGVja0Jhc2VQbHVnaW5zKCk7Ci0JCQkJCXNlcnZpY2Uuc2V0T3ZlcndyaXRlKCFtZXJnZU9wdGlvbik7Ci0JCQkJCXNlcnZpY2Uuc2V0Q2hlY2tCYXNlUGx1Z2lucyhjaGVja0Jhc2VQbHVnaW5zKTsKLQkJCQkJc3VjY2VlZCA9IHNlcnZpY2UubG9hZFhtbCh4bWxGaWxlKTsKLQkJCQkJaWYgKCEgc3VjY2VlZCkgewotCQkJCQkJcmV0dXJuOwotCQkJCQl9CQkJCQkKLQkJCQkJc2VydmljZS5kb0ltcG9ydChtb25pdG9yKTsKLQkJCQkJSW1wb3J0WE1MUHJlZmVyZW5jZXMuc2V0WE1MRmlsZSh4bWxGaWxlKTsKLQkJCQkJSW1wb3J0WE1MUHJlZmVyZW5jZXMuc2V0TWVyZ2VPcHRpb24obWVyZ2VPcHRpb24pOwotCQkJCQlJbXBvcnRYTUxQcmVmZXJlbmNlcy5zZXRDaGVja0Jhc2VQbHVnaW5zT3B0aW9uKGNoZWNrQmFzZVBsdWdpbnMpOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCXRocm93IG5ldyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uKGUpOwotCQkJCX0gZmluYWxseSB7Ci0JCQkJCW1vbml0b3IuZG9uZSgpOwotCQkJCX0KLQotCQkJfQotCQl9OwotCQl0cnkgewotCQkJZ2V0Q29udGFpbmVyKCkucnVuKHRydWUsIGZhbHNlLCBvcCk7Ci0JCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0JCQlUaHJvd2FibGUgcmVhbEV4Y2VwdGlvbiA9IGUuZ2V0VGFyZ2V0RXhjZXB0aW9uKCk7Ci0JCQlJbXBvcnRYTUxQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpLmRpc3BsYXlFcnJvcigKLQkJCQkJSW1wb3J0WE1MUmVzb3VyY2VzLmltcG9ydFhNTFdpemFyZF90aXRsZSwKLQkJCQkJcmVhbEV4Y2VwdGlvbi5nZXRNZXNzYWdlKCksIHJlYWxFeGNlcHRpb24pOwotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJaWYgKCFzdWNjZWVkKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJLy9TdHJpbmcgbXNnID0gTkxTLmJpbmQoSW1wb3J0WE1MUmVzb3VyY2VzLnJldmlld19sb2dfZmlsZXMsCi0JCS8vCXNlcnZpY2UuZ2V0TG9nUGF0aCgpKTsKLQkJLy9Nc2dCb3gucHJvbXB0KG1zZywgU1dULk9LKTsKLQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBEaXNwb3NlcyBvZiB0aGlzIHdpemFyZCBhbmQgZnJlZXMgYWxsIFNXVCByZXNvdXJjZXMuCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJc2VydmljZS5kaXNwb3NlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcveG1sL3dpemFyZHMvU2VsZWN0WE1MRmlsZVBhZ2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sL3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3htbC93aXphcmRzL1NlbGVjdFhNTEZpbGVQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4ZjU0OWEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcveG1sL3dpemFyZHMvU2VsZWN0WE1MRmlsZVBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyMyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLnhtbC53aXphcmRzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy5JbXBvcnRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy54bWwuSW1wb3J0WE1MUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcueG1sLkltcG9ydFhNTFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLnhtbC5wcmVmZXJlbmNlcy5JbXBvcnRYTUxQcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5MaWJyYXJ5VUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVpLndpemFyZHMuQmFzZVdpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkZpbGVEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLQotLyoqCi0gKiBBIHdpemFyZCBwYWdlIHRoYXQgcHJvbXB0cyB0aGUgdXNlciB0byBzZWxlY3QgYSBYTUwgZmlsZSB0byBpbXBvcnQuCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFNlbGVjdFhNTEZpbGVQYWdlIGV4dGVuZHMgQmFzZVdpemFyZFBhZ2UgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFHRV9OQU1FID0gU2VsZWN0WE1MRmlsZVBhZ2UuY2xhc3MuZ2V0TmFtZSgpOwotCi0JcHJpdmF0ZSBUZXh0IHBhdGhUZXh0OwotCi0JcHJpdmF0ZSBTdHJpbmcgcGF0aDsKLQotCXByaXZhdGUgYm9vbGVhbiBtZXJnZU9wdGlvbiA9IHRydWU7Ci0JCi0JcHJpdmF0ZSBib29sZWFuIGNoZWNrQmFzZVBsdWdpbnMgPSB0cnVlOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgU2VsZWN0WE1MRmlsZVBhZ2UoKSB7Ci0JCXN1cGVyKFBBR0VfTkFNRSk7Ci0JCXNldFRpdGxlKEltcG9ydFhNTFJlc291cmNlcy5zZWxlY3RYTUxGaWxlUGFnZV90aXRsZSk7Ci0JCXNldERlc2NyaXB0aW9uKEltcG9ydFhNTFJlc291cmNlcy5zZWxlY3RYTUxGaWxlUGFnZV9kZXNjKTsKLQkJc2V0SW1hZ2VEZXNjcmlwdG9yKEltcG9ydFhNTFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKAotCQkJCSJmdWxsL3dpemJhbi9pbXBfeG1sX3dpemJhbi5naWYiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ1BhZ2UjY3JlYXRlQ29udHJvbChDb21wb3NpdGUpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDMsIGZhbHNlKSk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQotCQlMYWJlbCBmaWxlTGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWZpbGVMYWJlbC5zZXRUZXh0KEltcG9ydFhNTFJlc291cmNlcy5maWxlTGFiZWxfdGV4dCk7IAotCi0JCXBhdGhUZXh0ID0gbmV3IFRleHQoY29tcG9zaXRlLCBTV1QuQk9SREVSKTsKLQkJcGF0aFRleHQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCXBhdGhUZXh0LnNldFRleHQoSW1wb3J0WE1MUHJlZmVyZW5jZXMuZ2V0WE1MRmlsZSgpKTsJCQotCQlwYXRoVGV4dC5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJCQlpZiAoaXNWYWxpZFBhdGgocGF0aFRleHQuZ2V0VGV4dCgpLnRyaW0oKSkpIHsKLQkJCQkJc2V0UGFnZUNvbXBsZXRlKHRydWUpOwotCQkJCQlzZXRFcnJvck1lc3NhZ2UobnVsbCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJc2V0UGFnZUNvbXBsZXRlKGZhbHNlKTsKLQkJCQkJc2V0RXJyb3JNZXNzYWdlKEltcG9ydFhNTFJlc291cmNlcy5pbnZhbGlkWE1MRmlsZV9lcnJvcik7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQotCQlCdXR0b24gYnJvd3NlQnV0dG9uID0gbmV3IEJ1dHRvbihjb21wb3NpdGUsIFNXVC5QVVNIKTsKLQkJYnJvd3NlQnV0dG9uLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkVORCkpOwotCQlicm93c2VCdXR0b24uc2V0VGV4dChJbXBvcnRYTUxSZXNvdXJjZXMuYnJvd3NlQnV0dG9uX3RleHQpOwotCQlicm93c2VCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJRmlsZURpYWxvZyBmZCA9IG5ldyBGaWxlRGlhbG9nKERpc3BsYXkuZ2V0Q3VycmVudCgpCi0JCQkJCQkuZ2V0QWN0aXZlU2hlbGwoKSwgU1dULk9QRU4pOwotCQkJCWZkLnNldEZpbHRlckV4dGVuc2lvbnMobmV3IFN0cmluZ1tdIHsgIioueG1sIiwgIiouKiIgfSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCVN0cmluZyBwYXRoID0gZmQub3BlbigpOwotCQkJCWJvb2xlYW4gb2sgPSBmYWxzZTsKLQkJCQlpZiAocGF0aCAhPSBudWxsKSB7Ci0JCQkJCXBhdGhUZXh0LnNldFRleHQocGF0aCk7Ci0JCQkJCW9rID0gaXNWYWxpZFBhdGgocGF0aCk7Ci0JCQkJfQotCQkJCXNldFBhZ2VDb21wbGV0ZShvayk7Ci0JCQl9Ci0JCX0pOwotCi0JCUdyb3VwIG9wdGlvbkdyb3VwID0gbmV3IEdyb3VwKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlvcHRpb25Hcm91cC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMSwgZmFsc2UpKTsKLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAzOwotCQlvcHRpb25Hcm91cC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJb3B0aW9uR3JvdXAuc2V0VGV4dChJbXBvcnRYTUxSZXNvdXJjZXMub3B0aW9uR3JvdXBfdGV4dCk7Ci0KLQkJbWVyZ2VPcHRpb24gPSBJbXBvcnRYTUxQcmVmZXJlbmNlcy5nZXRNZXJnZU9wdGlvbigpOwotCQkJCi0JCUJ1dHRvbiBvdmVyd3JpdGVSYWRpb0J1dHRvbiA9IGNyZWF0ZVJhZGlvQnV0dG9uKG9wdGlvbkdyb3VwLAotCQkJCUltcG9ydFhNTFJlc291cmNlcy5vdmVyd3JpdGVSYWRpb0J1dHRvbl90ZXh0LCAxLCAhbWVyZ2VPcHRpb24pOwotCQlvdmVyd3JpdGVSYWRpb0J1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQltZXJnZU9wdGlvbiA9IGZhbHNlOwotCQkJfQotCQl9KTsKLQkJCi0JCUJ1dHRvbiBtZXJnZVJhZGlvQnV0dG9uID0gY3JlYXRlUmFkaW9CdXR0b24ob3B0aW9uR3JvdXAsCi0JCQkJSW1wb3J0WE1MUmVzb3VyY2VzLm1lcmdlUmFkaW9CdXR0b25fdGV4dCwgMSwgbWVyZ2VPcHRpb24pOwotCQltZXJnZVJhZGlvQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCW1lcmdlT3B0aW9uID0gdHJ1ZTsKLQkJCX0KLQkJfSk7Ci0JCQotCQkKLQkJR3JvdXAgb3B0aW9uR3JvdXAxID0gbmV3IEdyb3VwKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlvcHRpb25Hcm91cDEuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDEsIGZhbHNlKSk7Ci0JCUdyaWREYXRhIGdyaWREYXRhMSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlncmlkRGF0YTEuaG9yaXpvbnRhbFNwYW4gPSAzOwotCQlvcHRpb25Hcm91cDEuc2V0TGF5b3V0RGF0YShncmlkRGF0YTEpOwotCQlvcHRpb25Hcm91cDEuc2V0VGV4dChJbXBvcnRYTUxSZXNvdXJjZXMub3B0aW9uR3JvdXAxX3RleHQpOwotCQljaGVja0Jhc2VQbHVnaW5zID0gSW1wb3J0WE1MUHJlZmVyZW5jZXMuZ2V0Q2hlY2tCYXNlUGx1Z2luc09wdGlvbigpOwotCQkJCi0JCUJ1dHRvbiBjaGVja0Jhc2VSYWRpb0J1dHRvbiA9IGNyZWF0ZVJhZGlvQnV0dG9uKG9wdGlvbkdyb3VwMSwKLQkJCQlJbXBvcnRSZXNvdXJjZXMuY2hlY2tCYXNlUmFkaW9CdXR0b25fdGV4dCwgMSwgY2hlY2tCYXNlUGx1Z2lucyk7CQotCQljaGVja0Jhc2VSYWRpb0J1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQljaGVja0Jhc2VQbHVnaW5zID0gdHJ1ZTsKLQkJCX0KLQkJfSk7Ci0JCQotCQlCdXR0b24gaWdub3JlUmVtb3ZlUmFkaW9CdXR0b24gPSBjcmVhdGVSYWRpb0J1dHRvbihvcHRpb25Hcm91cDEsCi0JCQkJSW1wb3J0UmVzb3VyY2VzLmlnbm9yZVJlbW92ZVJhZGlvQnV0dG9uX3RleHQsIDEsICFjaGVja0Jhc2VQbHVnaW5zKTsKLQkJaWdub3JlUmVtb3ZlUmFkaW9CdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJY2hlY2tCYXNlUGx1Z2lucyA9IGZhbHNlOwotCQkJfQotCQl9KTsKLQotCQlzZXRDb250cm9sKGNvbXBvc2l0ZSk7Ci0KLQkJc2V0UGFnZUNvbXBsZXRlKGlzVmFsaWRQYXRoKHBhdGhUZXh0LmdldFRleHQoKS50cmltKCkpKTsKLQl9Ci0KLQkvKioKLQkgKiBDaGVja3Mgd2hldGhlciB0aGUgdXNlciBzcGVjaWZpYyBwYXRoIGlzIHZhbGlkLgotCSAqIAotCSAqIEBwYXJhbSBwYXRoCi0JICogICAgICAgICAgICB0aGUgdXNlciBzcGVjaWZpYyBwYXRoCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgdXNlciBzcGVjaWZpZWQgcGF0aCBpcyB2YWxpZC4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNWYWxpZFBhdGgoU3RyaW5nIHBhdGgpIHsKLQkJRmlsZSBmaWxlID0gbmV3IEZpbGUocGF0aCk7Ci0JCWlmIChmaWxlLmV4aXN0cygpICYmIGZpbGUuaXNGaWxlKCkpIHsKLQkJCXRoaXMucGF0aCA9IHBhdGg7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgdXNlciBzcGVjaWZpZWQgWE1MIGZpbGUuCi0JICogCi0JICogQHJldHVybiBhbiBhYnNvbHV0ZSBwYXRoIHRvIHRoZSBYTUwgZmlsZQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UGF0aCgpIHsKLQkJcmV0dXJuIHBhdGg7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgdXNlciBzcGVjaWZpZWQgaW1wb3J0IG9wdGlvbi4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSB1c2VyIHNlbGVjdGVkIHRoZSBtZXJnZSBvcHRpb24sCi0JICogICAgICAgICA8Y29kZT5mYWxzZTwvY29kZT4gaWYgdGhlIHVzZXIgc2VsZWN0ZWQgdGhlIG92ZXJ3cml0ZSBvcHRpb24KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBnZXRNZXJnZU9wdGlvbigpIHsKLQkJcmV0dXJuIG1lcmdlT3B0aW9uOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2UjaXNQYWdlQ29tcGxldGUoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUGFnZUNvbXBsZXRlKCkgewotCQlpZiAoTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpID09IG51bGwpIHsKLQkJCXNldEVycm9yTWVzc2FnZShMaWJyYXJ5VUlSZXNvdXJjZXMubm9PcGVuTGlicmFyeVdhcm5pbmdfbXNnKTsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCXJldHVybiBzdXBlci5pc1BhZ2VDb21wbGV0ZSgpOwotCX0JCi0JCi0JLyoqCi0JICogR2V0cyB0aGUgdXNlciBzcGVjaWZpZWQgY2hlY2sgYmFzZSBwbHVnaW4gb3B0aW9uLgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHVzZXIgc2VsZWN0ZWQgdGhlIGNoZWNrIGJhc2UgcGx1Z2luIG9wdGlvbiwKLQkgKiAgICAgICAgIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiB0aGUgdXNlciBzZWxlY3RlZCB0aGUgaWdub3JlIGNoZWNrIGJhc2UgcGx1Z2luIG9wdGlvbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGdldENoZWNrQmFzZVBsdWdpbnMoKSB7Ci0JCXJldHVybiBjaGVja0Jhc2VQbHVnaW5zOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sL3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3htbC93aXphcmRzL3BhY2thZ2UuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sL3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3htbC93aXphcmRzL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjhlZTYyMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0LnhtbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy94bWwvd2l6YXJkcy9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyB3aXphcmRzIGZvciBpbXBvcnRpbmcgbWV0aG9kIGxpYnJhcnkgY29udGVudCBzdG9yZWQgaW4gWE1MLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvLmNsYXNzcGF0aCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDY1YWMwNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0Ly5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0Ly5vcHRpb25zIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC8ub3B0aW9ucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjNlY2Q5Ni4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0Ly5vcHRpb25zCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi0jIFR1cm4gb24gZGVidWcgdHJhY2UgZm9yIHRoZSBJbXBvcnQgcGx1Zy1pbgotb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9kZWJ1Zz10cnVlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0Ly5wcm9qZWN0IGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWY0NDE1MC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0Ly5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuZXBmLmltcG9ydDwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L01FVEEtSU5GL01BTklGRVNULk1GIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODdhMDJlOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmVwZi5pbXBvcnQ7IHNpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuNS4wLnF1YWxpZmllcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy5JbXBvcnRQbHVnaW4KLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotRWNsaXBzZS1MYXp5U3RhcnQ6IHRydWUKLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLAotIG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcuc2VydmljZXMsCi0gb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy53aXphcmRzCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmFwYWNoZS5hbnQsCi0gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLAotIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWksCi0gb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZSwKLSBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LAotIG9yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcywKLSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWksCi0gb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aQotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L2J1aWxkLnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjNzgwY2QuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1zb3VyY2UuLiA9IHNyYy8KLW91dHB1dC4uID0gYmluLwotYmluLmluY2x1ZGVzID0gLixcCi0gICAgICAgICAgICAgICAub3B0aW9ucyxcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgaWNvbnMvLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvaWNvbnMvQXV0aG9yaW5nLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvaWNvbnMvQXV0aG9yaW5nLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTMxYmFmMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L2ljb25zL0F1dGhvcmluZy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L2ljb25zL0ltcG9ydGluZy5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L2ljb25zL0ltcG9ydGluZy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5NjM5NGYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9pY29ucy9JbXBvcnRpbmcuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9pY29ucy9ldG9vbDE2L2ltcF9saWJfY29uZi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L2ljb25zL2V0b29sMTYvaW1wX2xpYl9jb25mLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGMzMmNlOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L2ljb25zL2V0b29sMTYvaW1wX2xpYl9jb25mLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvaWNvbnMvZXRvb2wxNi9pbXBfbWV0aF9wbHVnaW4uZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9pY29ucy9ldG9vbDE2L2ltcF9tZXRoX3BsdWdpbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5OTQ0M2YuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9pY29ucy9ldG9vbDE2L2ltcF9tZXRoX3BsdWdpbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L2ljb25zL2Z1bGwvd2l6YmFuL2ltcF9saWJfY29uZl93aXpiYW4uZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9pY29ucy9mdWxsL3dpemJhbi9pbXBfbGliX2NvbmZfd2l6YmFuLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODg5MWUyOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L2ljb25zL2Z1bGwvd2l6YmFuL2ltcF9saWJfY29uZl93aXpiYW4uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9pY29ucy9mdWxsL3dpemJhbi9pbXBfbWV0aF9wbHVnaW5fd2l6YmFuLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvaWNvbnMvZnVsbC93aXpiYW4vaW1wX21ldGhfcGx1Z2luX3dpemJhbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxYmQ2NmYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9pY29ucy9mdWxsL3dpemJhbi9pbXBfbWV0aF9wbHVnaW5fd2l6YmFuLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvcGx1Z2luLnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NTIxOTg0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUgotCi0jIFBsdWctaW4KLXBsdWdpbk5hbWU9RVBGIEltcG9ydAotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCi0KLSMgSW1wb3J0IFdpemFyZCBDYXRlZ29yeQotaW1wb3J0Q2F0ZWdvcnlOYW1lPU1ldGhvZAotCi0jIEltcG9ydCBMaWJyYXJ5IENvbmZpZ3VyYXRpb24gV2l6YXJkCi1pbXBvcnRMaWJyYXJ5Q29uZmlndXJhdGlvbldpemFyZE5hbWU9TGlicmFyeSBDb25maWd1cmF0aW9uCi1pbXBvcnRMaWJyYXJ5Q29uZmlndXJhdGlvbldpemFyZFRleHQ9SW1wb3J0IGEgbGlicmFyeSBjb25maWd1cmF0aW9uLgotCi0jIEltcG9ydCBNZXRob2QgUGx1Zy1pbnMgV2l6YXJkCi1pbXBvcnRNZXRob2RQbHVnaW5zV2l6YXJkTmFtZT1NZXRob2QgUGx1Zy1pbnMKLWltcG9ydE1ldGhvZFBsdWdpbnNXaXphcmRUZXh0PUltcG9ydCBvbmUgb3IgbW9yZSBtZXRob2QgcGx1Zy1pbnMuCi0KLQotCi0gICAgICAgICAgICAgICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L3BsdWdpbi54bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkMTYwNjIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTxwbHVnaW4+Ci0KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5pbXBvcnRXaXphcmRzIj4KLSAgICAgIDx3aXphcmQKLSAgICAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5lcGYudWkuaW1wb3J0V2l6YXJkcy5jYXRlZ29yeSIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLndpemFyZHMuSW1wb3J0Q29uZmlndXJhdGlvbldpemFyZCIKLSAgICAgICAgICAgIGljb249Ii9pY29ucy9ldG9vbDE2L2ltcF9saWJfY29uZi5naWYiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy53aXphcmRzLkltcG9ydENvbmZpZ3VyYXRpb25XaXphcmQiCi0gICAgICAgICAgICBuYW1lPSIlaW1wb3J0TGlicmFyeUNvbmZpZ3VyYXRpb25XaXphcmROYW1lIj4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj4gCi0gICAgICAgICAgICAgICAlaW1wb3J0TGlicmFyeUNvbmZpZ3VyYXRpb25XaXphcmRUZXh0Ci0gICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgPC93aXphcmQ+Ci0gICAgICA8d2l6YXJkCi0gICAgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2UuZXBmLnVpLmltcG9ydFdpemFyZHMuY2F0ZWdvcnkiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy53aXphcmRzLkltcG9ydFBsdWdpbldpemFyZCIKLSAgICAgICAgICAgIGljb249Ii9pY29ucy9ldG9vbDE2L2ltcF9tZXRoX3BsdWdpbi5naWYiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy53aXphcmRzLkltcG9ydFBsdWdpbldpemFyZCIKLSAgICAgICAgICAgIG5hbWU9IiVpbXBvcnRNZXRob2RQbHVnaW5zV2l6YXJkTmFtZSI+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAlaW1wb3J0TWV0aG9kUGx1Z2luc1dpemFyZFRleHQKLSAgICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICA8L3dpemFyZD4KLSAgIDwvZXh0ZW5zaW9uPgotCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuZXBmLnVpLmltcG9ydFdpemFyZHMiPgotICAgICAgPHdpemFyZCBpZD0ib3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy53aXphcmRzLkltcG9ydFBsdWdpbldpemFyZCIvPgotICAgPC9leHRlbnNpb24+Ci0KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5lcGYudWkuaW1wb3J0V2l6YXJkcyI+Ci0gICAgICA8d2l6YXJkIGlkPSJvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLndpemFyZHMuSW1wb3J0Q29uZmlndXJhdGlvbldpemFyZCIvPgotICAgPC9leHRlbnNpb24+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5zZXJ2aWNlLmNvbW1hbmRMaW5lUnVubmVycyI+Ci0gICAgICA8Y29tbWFuZExpbmVSdW5uZXIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLnNlcnZpY2VzLkNvbW1hbmRMaW5lUGx1Z2luSW1wb3J0ZXIiCi0gICAgICAgICAgICBydW5uZXJJZD0iY29tbWFuZExpbmVQbHVnaW5JbXBvcnRlciIvPgotICAgPC9leHRlbnNpb24+Ci0KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy9JbXBvcnRQbHVnaW4uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcvSW1wb3J0UGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5M2JiODUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy9JbXBvcnRQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpLkFic3RyYWN0UGx1Z2luOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotCi0KLS8qKgotICogVGhlIEltcG9ydCBwbHVnLWluIGNsYXNzLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEltcG9ydFBsdWdpbiBleHRlbmRzIEFic3RyYWN0UGx1Z2luIHsKLQotCS8vIFRoZSBzaGFyZWQgcGx1Zy1pbiBpbnN0YW5jZS4KLQlwcml2YXRlIHN0YXRpYyBJbXBvcnRQbHVnaW4gcGx1Z2luOwotCi0JLyoqCi0JICogRGVmYXVsdCBjb25zdHJ1Y3Rvci4KLQkgKi8KLQlwdWJsaWMgSW1wb3J0UGx1Z2luKCkgewotCQlzdXBlcigpOwotCQlwbHVnaW4gPSB0aGlzOwotCX0KLQotCS8qKgotCSAqIEBzZWUgQWJzdHJhY3RQbHVnaW4jc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0YXJ0KGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgQWJzdHJhY3RQbHVnaW4jc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RvcChjb250ZXh0KTsKLQkJcGx1Z2luID0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaGFyZWQgcGx1Zy1pbiBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEltcG9ydFBsdWdpbiBnZXREZWZhdWx0KCkgewotCQlyZXR1cm4gcGx1Z2luOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy9JbXBvcnRSZXNvdXJjZXMuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcvSW1wb3J0UmVzb3VyY2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3Yjc4ZGUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy9JbXBvcnRSZXNvdXJjZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLXB1YmxpYyBmaW5hbCBjbGFzcyBJbXBvcnRSZXNvdXJjZXMgZXh0ZW5kcyBOTFMgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gIm9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcuUmVzb3VyY2VzIjsvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIEltcG9ydFJlc291cmNlcygpIHsKLQkJLy8gRG8gbm90IGluc3RhbnRpYXRlCi0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29uZmlndXJhdGlvbkltcG9ydFNlcnZpY2VfTVNHMjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBpbXBvcnRDb25maWdXaXphcmRfdGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VsZWN0Q29uZmlnRGlyV2l6YXJkUGFnZV90aXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzZWxlY3RDb25maWdEaXJXaXphcmRQYWdlX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmV2aWV3Q2hhbmdlc1dpemFyZFBhZ2VfdGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmV2aWV3Q2hhbmdlc1dpemFyZFBhZ2VfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzZWxlY3RDb25maWdTcGVjc1dpemFyZFBhZ2VfdGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VsZWN0Q29uZmlnU3BlY3NXaXphcmRQYWdlX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgaW1wb3J0UGx1Z2luc1dpemFyZF90aXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzZWxlY3RQbHVnaW5zRGlyV2l6YXJkUGFnZV90aXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzZWxlY3RQbHVnaW5zRGlyV2l6YXJkUGFnZV90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlbGVjdFBsdWdpbnNXaXphcmRQYWdlX3RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlbGVjdFBsdWdpbnNXaXphcmRQYWdlX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgaW1wb3J0UGx1Z2luc1dpemFyZF9FUlJfSW1wb3J0X3BsdWdpbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb25maWd1cmF0aW9uSW1wb3J0U2VydmljZV9NU0cwOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbmZpZ3VyYXRpb25JbXBvcnRTZXJ2aWNlX01TRzE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29uZmlndXJhdGlvbkltcG9ydFNlcnZpY2VfTVNHMzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb25maWd1cmF0aW9uSW1wb3J0U2VydmljZV9oYW5kbGVUb29sVmVyc2lvbl9lcnJvcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJbXBvcnRDb25maWd1cmF0aW9uV2l6YXJkX01TRzE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRmlsZU1vZGlmeUNoZWNrZXJfQ2hlY2tvdXRfZmFpbGVkX21zZzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGaWxlTW9kaWZ5Q2hlY2tlcl9DaGVja291dF9mYWlsZWRfdGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSW1wb3J0Q29uZmlndXJhdGlvbldpemFyZF9FUlJfSW1wb3J0X2NvbmZpZ3VyYXRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSW1wb3J0Q29uZmlnUmVwb3J0UGFnZV90aXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJbXBvcnRQbHVnaW5XaXphcmRfcmVhZG9ubHk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSW1wb3J0UGx1Z2luV2l6YXJkX01TRzE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSW1wb3J0UGx1Z2luV2l6YXJkX2Vycm9yOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEltcG9ydFBsdWdpbldpemFyZF93YXJuX2V4aXN0aW5nX3BsdWdpbnM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSW1wb3J0UGx1Z2luV2l6YXJkX2NvbmZpcm1fY29udGludWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSW1wb3J0UGx1Z2luV2l6YXJkX3dhcm5fY2lyY3VsYXJfcGx1Z2luczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTZWxlY3RDb25maWdzVG9JbXBvcnRfbGFiZWwxOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEltcG9ydENvbmZpZ3VyYXRpb25XaXphcmRfZXJyb3I7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2VsZWN0SW1wb3J0Q29uZmlndXJhdGlvblNvdXJjZV9NU0cxOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNlbGVjdENvbmZpZ1NwZWNzVG9JbXBvcnRQYWdlX3RpdGxlMjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTZWxlY3RJbXBvcnRQbHVnaW5Tb3VyY2Vfbm90X3VzZWQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2VsZWN0SW1wb3J0UGx1Z2luU291cmNlX25vX3BhdGg7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2VsZWN0SW1wb3J0UGx1Z2luU291cmNlX25vX2RpcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTZWxlY3RQbHVnaW5zVG9JbXBvcnRfbGFiZWxfcGx1Z2luczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTZWxlY3RQbHVnaW5zVG9JbXBvcnRfbGFiZWxfYXV0aG9yOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNlbGVjdFBsdWdpbnNUb0ltcG9ydF9sYWJlbF92ZXJzaW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNlbGVjdFBsdWdpbnNUb0ltcG9ydF9sYWJlbF9kZXNjOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEltcG9ydENvbmZpZ3VyYXRpb25XaXphcmRfcmVhZG9ubHk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGx1Z2luSW1wb3J0aW5nU2VydmljZV9NU0cwOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBsdWdpbkltcG9ydGluZ1NlcnZpY2VfTVNHMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQbHVnaW5JbXBvcnRpbmdTZXJ2aWNlX01TRzM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGx1Z2luSW1wb3J0aW5nU2VydmljZV9NU0c1OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBsdWdpbkltcG9ydGluZ1NlcnZpY2VfTVNHNjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEaWZmUmVwb3J0Vmlld2VyX2NvbnRlbnQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGlmZlJlcG9ydFZpZXdlcl9pbl9pbXBvcnQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2VsZWN0UGx1Z2luc1RvSW1wb3J0X01TRzE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGlmZlJlcG9ydExhYmVsUHJvdmlkZXJfeWVzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNlbGVjdFBsdWdpbnNUb0ltcG9ydF9lcnJvcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEaWZmUmVwb3J0Vmlld2VyX2luX2xpYjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEaWZmUmVwb3J0Vmlld2VyX3N0YXR1czsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTZWxlY3RQbHVnaW5zVG9JbXBvcnRfbGlicmFyeVBsdWdpbkV4aXN0czsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTZWxlY3RQbHVnaW5zVG9JbXBvcnRfbGlicmFyeVBsdWdpbk5vdEV4aXN0czsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTZWxlY3RDb25maWdTcGVjc1RvSW1wb3J0UGFnZV9saWJyYXJ5Q29uZmlnU3BlY0V4aXN0czsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTZWxlY3RDb25maWdTcGVjc1RvSW1wb3J0UGFnZV9jb25maWdTcGVjTm9TZWxlY3Rpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2VsZWN0Q29uZmlnU3BlY3NUb0ltcG9ydFBhZ2VfY29uZmlnU3BlY0RhdGFMYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTZWxlY3RDb25maWdTcGVjc1RvSW1wb3J0UGFnZV9sYWJlbF9jb25maWdzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNlbGVjdEltcG9ydENvbmZpZ3VyYXRpb25Tb3VyY2Vfbm90X3VzZWQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2VsZWN0Q29uZmlnU3BlY3NUb0ltcG9ydFBhZ2VfbGFiZWxfZGVzYzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTZWxlY3RJbXBvcnRDb25maWd1cmF0aW9uU291cmNlX25vX3BhdGg7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2VsZWN0UGx1Z2luc1RvSW1wb3J0X3BsdWdpbk5vU2VsZWN0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNlbGVjdEltcG9ydENvbmZpZ3VyYXRpb25Tb3VyY2Vfbm9fZGlyOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNlbGVjdEltcG9ydENvbmZpZ3VyYXRpb25Tb3VyY2VfcGx1Z2luX3JlYWRvbmx5OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNlbGVjdEltcG9ydENvbmZpZ3VyYXRpb25Tb3VyY2VfcGx1Z2luX2xvY2tlZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTZWxlY3RJbXBvcnRDb25maWd1cmF0aW9uU291cmNlX2Vycm9yX25vdF91cGRhdGFibGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2VsZWN0UGx1Z2luc1RvSW1wb3J0X3BsdWdpbkRhdGFMYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEaWZmUmVwb3J0Vmlld2VyX3R5cGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2VsZWN0Q29uZmlnU3BlY3NUb0ltcG9ydFBhZ2VfbGlicmFyeUNvbmZpZ1NwZWNOb3RFeGlzdHM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgdmVyc2lvbk1pc21hdGNoX29sZERhdGE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgdmVyc2lvbk1pc21hdGNoX29sZERhdGFfdW5rbm93bjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyB2ZXJzaW9uTWlzbWF0Y2hfb2xkVG9vbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyB2ZXJzaW9uTWlzbWF0Y2hfb2xkVG9vbF91bmtub3duOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG9wdGlvbkdyb3VwX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2hlY2tCYXNlUmFkaW9CdXR0b25fdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBpZ25vcmVSZW1vdmVSYWRpb0J1dHRvbl90ZXh0OwotCQkKLQlzdGF0aWMgewotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBJbXBvcnRSZXNvdXJjZXMuY2xhc3MpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL1Jlc291cmNlcy5wcm9wZXJ0aWVzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy9SZXNvdXJjZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTkwOGNlOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL1Jlc291cmNlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsOTkgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLSMKLSMgTWVzc2FnZSBJRCBSYW5nZTogSVVQRTAyMDBFIC0gSVVQRTAyOTlFCi0jCi0KLSMgSW1wb3J0IExpYnJhcnkgQ29uZmlndXJhdGlvbiBXaXphcmQKLWltcG9ydENvbmZpZ1dpemFyZF90aXRsZT1JbXBvcnQgTGlicmFyeSBDb25maWd1cmF0aW9uCi1zZWxlY3RDb25maWdEaXJXaXphcmRQYWdlX3RpdGxlPVNwZWNpZnkgaW1wb3J0IGRpcmVjdG9yeQotc2VsZWN0Q29uZmlnRGlyV2l6YXJkUGFnZV90ZXh0PVNwZWNpZnkgdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZSBsaWJyYXJ5IGNvbmZpZ3VyYXRpb24gdG8gaW1wb3J0LgotcmV2aWV3Q2hhbmdlc1dpemFyZFBhZ2VfdGl0bGU9UmV2aWV3IGxpYnJhcnkgY2hhbmdlcwotcmV2aWV3Q2hhbmdlc1dpemFyZFBhZ2VfdGV4dD1SZXZpZXcgdGhlIGNoYW5nZXMgdGhhdCB3aWxsIGJlIG1hZGUgdG8gdGhlIGN1cnJlbnQgbWV0aG9kIGxpYnJhcnkuCi1zZWxlY3RDb25maWdTcGVjc1dpemFyZFBhZ2VfdGl0bGU9U2VsZWN0IGNvbmZpZ3VyYXRpb24gc3BlY2lmaWNhdGlvbnMKLXNlbGVjdENvbmZpZ1NwZWNzV2l6YXJkUGFnZV90ZXh0PVNlbGVjdCBvbmUgb3IgbW9yZSBjb25maWd1cmF0aW9uIHNwZWNpZmljYXRpb25zIHRvIGltcG9ydC4KLQotIyBJbXBvcnQgTWV0aG9kIFBsdWctaW5zIFdpemFyZAotaW1wb3J0UGx1Z2luc1dpemFyZF90aXRsZT1JbXBvcnQgTWV0aG9kIFBsdWctaW5zCi1zZWxlY3RQbHVnaW5zRGlyV2l6YXJkUGFnZV90aXRsZT1TcGVjaWZ5IGltcG9ydCBkaXJlY3RvcnkKLXNlbGVjdFBsdWdpbnNEaXJXaXphcmRQYWdlX3RleHQ9U3BlY2lmeSB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIG1ldGhvZCBwbHVnLWlucyB0byBpbXBvcnQuCi1zZWxlY3RQbHVnaW5zV2l6YXJkUGFnZV90aXRsZT1TZWxlY3QgbWV0aG9kIHBsdWctaW5zCi1zZWxlY3RQbHVnaW5zV2l6YXJkUGFnZV90ZXh0PVNlbGVjdCBvbmUgb3IgbW9yZSBtZXRob2QgcGx1Zy1pbnMgdG8gaW1wb3J0LiBJZiBhIHNlbGVjdGVkIHBsdWctaW4gYWxyZWFkeSBleGlzdHMgaW4gdGhlIGN1cnJlbnQgbWV0aG9kIGxpYnJhcnksIHZlcmlmeSB0aGUgdmVyc2lvbiBkaWZmZXJlbmNlcy4KLWltcG9ydFBsdWdpbnNXaXphcmRfRVJSX0ltcG9ydF9wbHVnaW49SW1wb3J0IHBsdWctaW4gZmFpbGVkCi0KLUNvbmZpZ3VyYXRpb25JbXBvcnRTZXJ2aWNlX01TRzA9VmFsaWRhdGluZyBzZWxlY3RlZCBsaWJyYXJ5IGNvbmZpZ3VyYXRpb24uLi4KLUNvbmZpZ3VyYXRpb25JbXBvcnRTZXJ2aWNlX01TRzE9VGhlIHNwZWNpZmllZCBkaXJlY3RvcnkgZG9lcyBub3QgY29udGFpbiBhIHZhbGlkIGNvbmZpZ3VyYXRpb24uCi1Db25maWd1cmF0aW9uSW1wb3J0U2VydmljZV9NU0czPUltcG9ydGluZyBtZXRob2QgY29uZmlndXJhdGlvbi4uLgotQ29uZmlndXJhdGlvbkltcG9ydFNlcnZpY2VfTVNHMj1DYW5ub3QgaW1wb3J0IHRoZSBjdXJyZW50bHkgb3BlbmVkIGxpYnJhcnkgaW50byBpdHNlbGYuCi1JbXBvcnRDb25maWd1cmF0aW9uV2l6YXJkX01TRzE9SW1wb3J0aW5nIG1ldGhvZCBjb25maWd1cmF0aW9uLi4uCi1JbXBvcnRDb25maWd1cmF0aW9uV2l6YXJkX0VSUl9JbXBvcnRfY29uZmlndXJhdGlvbj1JbXBvcnQgY29uZmlndXJhdGlvbiBmYWlsZWQKLQotRmlsZU1vZGlmeUNoZWNrZXJfQ2hlY2tvdXRfZmFpbGVkX3RpdGxlPUNoZWNrb3V0IGZhaWxlZAotRmlsZU1vZGlmeUNoZWNrZXJfQ2hlY2tvdXRfZmFpbGVkX21zZz1Tb21lIGZpbGVzIGFyZSBub3QgY2hlY2tlZCBvdXQsIGRvIHlvdSB3YW50IHRvIHRyeSBhZ2Fpbj8KLQotSW1wb3J0Q29uZmlnUmVwb3J0UGFnZV90aXRsZT1JbXBvcnRpbmcgQ29uZmlndXJhdGlvbiBSZXBvcnQKLUltcG9ydFBsdWdpbldpemFyZF9yZWFkb25seT1JVVBFMDIwMUU6IExpYnJhcnkgaXMgcmVhZC1vbmx5LgotSW1wb3J0UGx1Z2luV2l6YXJkX01TRzE9SW1wb3J0aW5nIG1ldGhvZCBwbHVnLWluLi4uCi1JbXBvcnRQbHVnaW5XaXphcmRfZXJyb3I9RXJyb3IKLUltcG9ydFBsdWdpbldpemFyZF93YXJuX2V4aXN0aW5nX3BsdWdpbnM9SVVQRTAyMDBFOiBUaGUgZm9sbG93aW5nIHNlbGVjdGVkIHBsdWctaW4ocykgYWxyZWFkeSBleGlzdCBhbmQgcmUtaW1wb3J0aW5nIHRoZSBzYW1lIHBsdWctaW4ocykgd2lsbCBvdmVyd3JpdGUgdGhlIGV4aXN0aW5nIG9uZShzKTpcblxuIHswfSBcblxuQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGNvbnRpbnVlPwotSW1wb3J0UGx1Z2luV2l6YXJkX2NvbmZpcm1fY29udGludWU9XG5cbkFyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBjb250aW51ZT8KLUltcG9ydFBsdWdpbldpemFyZF93YXJuX2NpcmN1bGFyX3BsdWdpbnM9Q2lyY3VsYXIgcmVmZXJlbmNlcyBkZXRlY3RlZCBhbW9uZyB0aGUgZm9sbG93aW5nIHBsdWctaW5zCi0KLVNlbGVjdENvbmZpZ3NUb0ltcG9ydF9sYWJlbDE9VGhlIGZvbGxvd2luZyBlbGVtZW50cyB3aWxsIGJlIGltcG9ydGVkOgotSW1wb3J0Q29uZmlndXJhdGlvbldpemFyZF9lcnJvcj1FcnJvcgotU2VsZWN0SW1wb3J0Q29uZmlndXJhdGlvblNvdXJjZV9NU0cxPUFuYWx5emluZwotU2VsZWN0Q29uZmlnU3BlY3NUb0ltcG9ydFBhZ2VfdGl0bGUyPVNlbGVjdCBjb25maWd1cmF0aW9uIHNwZWNpZmljYXRpb25zIHRvIGltcG9ydAotU2VsZWN0SW1wb3J0UGx1Z2luU291cmNlX25vdF91c2VkPW5vdF91c2VkCi1TZWxlY3RJbXBvcnRQbHVnaW5Tb3VyY2Vfbm9fcGF0aD1UaGUgc3BlY2lmaWVkIGRpcmVjdG9yeSBkb2VzIG5vdCBleGlzdC4KLVNlbGVjdEltcG9ydFBsdWdpblNvdXJjZV9ub19kaXI9Tm8gZGlyZWN0b3J5IHNwZWNpZmllZAotU2VsZWN0UGx1Z2luc1RvSW1wb3J0X2xhYmVsX3BsdWdpbnM9QXZhaWxhYmxlIHBsdWctaW5zIGluIHRoZSBpbXBvcnQgZGlyZWN0b3J5OgotU2VsZWN0UGx1Z2luc1RvSW1wb3J0X2xhYmVsX2F1dGhvcj1BdXRob3I6Ci1TZWxlY3RQbHVnaW5zVG9JbXBvcnRfbGFiZWxfdmVyc2lvbj1WZXJzaW9uOgotU2VsZWN0UGx1Z2luc1RvSW1wb3J0X2xhYmVsX2Rlc2M9QnJpZWYgZGVzY3JpcHRpb246Ci1JbXBvcnRDb25maWd1cmF0aW9uV2l6YXJkX3JlYWRvbmx5PUlVUEUwMjAxRTogTGlicmFyeSBpcyByZWFkLW9ubHkuCi1QbHVnaW5JbXBvcnRpbmdTZXJ2aWNlX01TRzA9VmFsaWRhdGluZyBzZWxlY3RlZCBwbHVnLWlucy4uLgotUGx1Z2luSW1wb3J0aW5nU2VydmljZV9NU0cxPVRoZSBzcGVjaWZpZWQgcGF0aCBkb2VzIG5vdCBjb250YWluIGEgdmFsaWQgbWV0aG9kIHBsdWctaW4uCi1QbHVnaW5JbXBvcnRpbmdTZXJ2aWNlX01TRzM9SW1wb3J0aW5nIG1ldGhvZCBwbHVnLWluLi4uCi1QbHVnaW5JbXBvcnRpbmdTZXJ2aWNlX01TRzU9VGhlIHNlbGVjdGVkIG1ldGhvZCBwbHVnLWluIGNhbm5vdCBiZSBpbXBvcnRlZC4gSXRzIGRlcGVuZGVudCBwbHVnLWluICcnezB9JycgY2Fubm90IGJlIGZvdW5kIGluIHRoZSBjdXJyZW50IG1ldGhvZCBsaWJyYXJ5LgotUGx1Z2luSW1wb3J0aW5nU2VydmljZV9NU0c2PVRoZSBzZWxlY3RlZCBtZXRob2QgcGx1Zy1pbiBjYW5ub3QgYmUgaW1wb3J0ZWQuIEEgZGVwZW5kZW50IHBsdWctaW4gY2Fubm90IGJlIGZvdW5kIGluIHRoZSBjdXJyZW50IG1ldGhvZCBsaWJyYXJ5LgotRGlmZlJlcG9ydFZpZXdlcl9jb250ZW50PUNvbnRlbnQKLURpZmZSZXBvcnRWaWV3ZXJfaW5faW1wb3J0PUluIEltcG9ydAotU2VsZWN0UGx1Z2luc1RvSW1wb3J0X01TRzE9QW5hbHl6aW5nIGZpbGVzLi4uCi1EaWZmUmVwb3J0TGFiZWxQcm92aWRlcl95ZXM9WWVzCi1TZWxlY3RQbHVnaW5zVG9JbXBvcnRfZXJyb3I9RXJyb3IKLURpZmZSZXBvcnRWaWV3ZXJfaW5fbGliPUluIExpYnJhcnkKLURpZmZSZXBvcnRWaWV3ZXJfc3RhdHVzPVN0YXR1cwotU2VsZWN0UGx1Z2luc1RvSW1wb3J0X2xpYnJhcnlQbHVnaW5FeGlzdHM9U2VsZWN0ZWQgcGx1Zy1pbiBmb3VuZCBpbiB0aGUgY3VycmVudCBsaWJyYXJ5Ci1TZWxlY3RQbHVnaW5zVG9JbXBvcnRfbGlicmFyeVBsdWdpbk5vdEV4aXN0cz1TZWxlY3RlZCBwbHVnLWluIG5vdCBmb3VuZCBpbiB0aGUgY3VycmVudCBsaWJyYXJ5Ci1TZWxlY3RDb25maWdTcGVjc1RvSW1wb3J0UGFnZV9saWJyYXJ5Q29uZmlnU3BlY0V4aXN0cz1Db25maWd1cmF0aW9uIGZvdW5kIGluIHRoZSBjdXJyZW50IGxpYnJhcnkKLVNlbGVjdENvbmZpZ1NwZWNzVG9JbXBvcnRQYWdlX2NvbmZpZ1NwZWNOb1NlbGVjdGlvbj1ObyBjb25maWd1cmF0aW9uIHNwZWNpZmljYXRpb24gc2VsZWN0ZWQuCi1TZWxlY3RDb25maWdTcGVjc1RvSW1wb3J0UGFnZV9jb25maWdTcGVjRGF0YUxhYmVsPVNlbGVjdGVkIGNvbmZpZ3VyYXRpb24gaW4gdGhlIGltcG9ydCBkaXJlY3RvcnkKLVNlbGVjdENvbmZpZ1NwZWNzVG9JbXBvcnRQYWdlX2xhYmVsX2NvbmZpZ3M9QXZhaWxhYmxlIGNvbmZpZ3VyYXRpb24gc3BlY2lmaWNhdGlvbnMgaW4gdGhlIGltcG9ydCBkaXJlY3Rvcnk6Ci1TZWxlY3RJbXBvcnRDb25maWd1cmF0aW9uU291cmNlX25vdF91c2VkPW5vdF91c2VkCi1TZWxlY3RDb25maWdTcGVjc1RvSW1wb3J0UGFnZV9sYWJlbF9kZXNjPUJyaWVmIGRlc2NyaXB0aW9uOgotU2VsZWN0SW1wb3J0Q29uZmlndXJhdGlvblNvdXJjZV9ub19wYXRoPVRoZSBzcGVjaWZpZWQgcGF0aCBkb2VzIG5vdCBleGlzdC4KLVNlbGVjdFBsdWdpbnNUb0ltcG9ydF9wbHVnaW5Ob1NlbGVjdGlvbj1ObyBwbHVnLWluIHNlbGVjdGVkLgotU2VsZWN0SW1wb3J0Q29uZmlndXJhdGlvblNvdXJjZV9ub19kaXI9Tm8gZGlyZWN0b3J5IHNwZWNpZmllZAotU2VsZWN0SW1wb3J0Q29uZmlndXJhdGlvblNvdXJjZV9wbHVnaW5fcmVhZG9ubHk9UGx1Zy1pbiB7MH0gaXMgcmVhZC1vbmx5XG4KLVNlbGVjdEltcG9ydENvbmZpZ3VyYXRpb25Tb3VyY2VfcGx1Z2luX2xvY2tlZD1JVVBFMDIwM0U6IFBsdWctaW4gezB9IGlzIGxvY2tlZFxuCi1TZWxlY3RJbXBvcnRDb25maWd1cmF0aW9uU291cmNlX2Vycm9yX25vdF91cGRhdGFibGU9U29tZSBvZiB0aGUgcGx1Zy1pbihzKSBpbiB0aGUgbGlicmFyeSBhcmUgZWl0aGVyIGxvY2tlZCBvciByZWFkLW9ubHkuXG4gUGxlYXNlIHVubG9jayB0aGUgcGx1Zy1pbnMgYW5kIG1ha2Ugc3VyZSB0aGUgZmlsZXMgYXJlIHVwZGF0YWJsZS4KLVNlbGVjdFBsdWdpbnNUb0ltcG9ydF9wbHVnaW5EYXRhTGFiZWw9U2VsZWN0ZWQgcGx1Zy1pbiBpbiB0aGUgaW1wb3J0IGRpcmVjdG9yeQotRGlmZlJlcG9ydFZpZXdlcl90eXBlPUNvbnRlbnQgVHlwZQotU2VsZWN0Q29uZmlnU3BlY3NUb0ltcG9ydFBhZ2VfbGlicmFyeUNvbmZpZ1NwZWNOb3RFeGlzdHM9U2VsZWN0ZWQgY29uZmlndXJhdGlvbiBub3QgZm91bmQgaW4gdGhlIGN1cnJlbnQgbGlicmFyeS4KLXZlcnNpb25NaXNtYXRjaF9vbGREYXRhPUlVUEUwMjA0RTogVGhlIHNwZWNpZmllZCBmaWxlcyB3ZXJlIGV4cG9ydGVkIGJ5IGEgcHJldmlvdXMgdmVyc2lvbiAoezB9KSBvZiB7MX0uIFRoZSBmaWxlcyBtdXN0IGJlIGV4cG9ydGVkIHVzaW5nIHRoZSBjdXJyZW50IHZlcnNpb24gb2YgezF9LgotdmVyc2lvbk1pc21hdGNoX29sZERhdGFfdW5rbm93bj1JVVBFMDIwNUU6IFRoZSBzcGVjaWZpZWQgZmlsZXMgd2VyZSBleHBvcnRlZCBieSBhIHByZXZpb3VzIHZlcnNpb24gb2YgezB9LiBUaGUgZmlsZXMgbXVzdCBiZSBleHBvcnRlZCB1c2luZyB0aGUgY3VycmVudCB2ZXJzaW9uIG9mIHswfS4KLXZlcnNpb25NaXNtYXRjaF9vbGRUb29sPUlVUEUwMjA2RTogVGhlIHNwZWNpZmllZCBmaWxlcyB3ZXJlIGV4cG9ydGVkIGJ5IGEgbmV3ZXIgdmVyc2lvbiAoezB9KSBvZiB7MX0uIFlvdSBtdXN0IHVwZ3JhZGUgezF9IGluIG9yZGVyIHRvIGltcG9ydCB0aGUgZmlsZXMuICAKLXZlcnNpb25NaXNtYXRjaF9vbGRUb29sX3Vua25vd249SVVQRTAyMDdFOiBUaGUgc3BlY2lmaWVkIGZpbGVzIGNhbm5vdCBiZSBvcGVuZWQuIFlvdSBtdXN0IHVwZ3JhZGUgezB9IGluIG9yZGVyIHRvIGltcG9ydCB0aGUgZmlsZXMuCi1Db25maWd1cmF0aW9uSW1wb3J0U2VydmljZV9oYW5kbGVUb29sVmVyc2lvbl9lcnJvcj1JVVBFMDIwOEU6IEZhaWxlZCB0byB1cGdyYWRlIHRoZSBwbHVnLWluKHMpLgotb3B0aW9uR3JvdXBfdGV4dD1JbXBvcnQgb3B0aW9uCi1jaGVja0Jhc2VSYWRpb0J1dHRvbl90ZXh0PUNoZWNrIGJhc2UgcGx1Zy1pbnMKLWlnbm9yZVJlbW92ZVJhZGlvQnV0dG9uX3RleHQ9SWdub3JlIGFuZCByZW1vdmUgdW5yZXNvbHZlZCByZWZlcmVuY2VzCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3BhY2thZ2UuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNmI5MDMwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgdGhlIGFjdGl2YXRvciBmb3IgbWFuYWdpbmcgdGhlIEltcG9ydCBwbHVnLWluJ3MgbGlmZSBjeWNsZS4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3NlcnZpY2VzL0NvbW1hbmRMaW5lUGx1Z2luSW1wb3J0ZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcvc2VydmljZXMvQ29tbWFuZExpbmVQbHVnaW5JbXBvcnRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NGJiYzgxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcvc2VydmljZXMvQ29tbWFuZExpbmVQbHVnaW5JbXBvcnRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcuc2VydmljZXM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24uc2VydmljZS51dGlscy5Db21tYW5kTGluZVJ1bm5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLlhNTFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy5zZXJ2aWNlcy5QbHVnaW5JbXBvcnREYXRhLlBsdWdpbkluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pLlhNSUxpYnJhcnlVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuUHJvZ3Jlc3NNb25pdG9yRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5Xb3Jrc3BhY2VNb2RpZnlPcGVyYXRpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotCi0vKioKLSAqIEltcGxlbWVudGF0aW9uIGZvciBpbXBvcnRpbmcgcGx1Z2luIGRyaXZlbiBieSBjb21tYW5kIGxpbmUKLSAqIAotICogQGF1dGhvciBXZWlwaW5nIEx1Ci0gKiBAc2luY2UgMS4yCi0gKi8KLXB1YmxpYyBjbGFzcyBDb21tYW5kTGluZVBsdWdpbkltcG9ydGVyIGV4dGVuZHMgQ29tbWFuZExpbmVSdW5uZXIgewotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIEltcG9ydFBsdWdpbnNUYWcgPSAiSW1wb3J0UGx1Z2lucyI7IAkvLyROT04tTkxTLTEkIgkKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgU2VsZWN0ZWRQbHVnaW5UYWcgPSAiU2VsZWN0ZWRQbHVnaW4iOyAvLyROT04tTkxTLTEkIgotCQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBCYXNlTGlicmFyeUZvbGRlclVyaUF0dD0gImJhc2VMaWJyYXJ5Rm9sZGVyVXJpIjsJCS8vJE5PTi1OTFMtMSQiCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIEltcG9ydExpYnJhcnlGb2xkZXJVcmlBdHQ9ICJpbXBvcnRMaWJyYXJ5Rm9sZGVyVXJpIjsJCS8vJE5PTi1OTFMtMSQiCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIE5hbWVBdHQ9ICJuYW1lIjsJCS8vJE5PTi1OTFMtMSQiCi0KLQlwcml2YXRlIFN0cmluZyBiYXNlTGliUGF0aDsKLQlwcml2YXRlIFN0cmluZyBpbXBvcnRMaWJQYXRoOwotCQotCXByaXZhdGUgU2V0PFN0cmluZz4gc2VsZWN0ZWRQbHVnaW5zOwotCQotCXB1YmxpYyBib29sZWFuIGV4ZWN1dGUoU3RyaW5nW10gYXJncykgewotCQlpZiAoISBzdXBlci5leGVjdXRlKGFyZ3MpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJdHJ5IHsKLQkJCWxvYWRJbnB1dEZpbGUoKTsKLQkJCVdvcmtzcGFjZU1vZGlmeU9wZXJhdGlvbiBvcGVyYXRpb24gPSBuZXcgV29ya3NwYWNlTW9kaWZ5T3BlcmF0aW9uKCkgewotCQkJCXB1YmxpYyB2b2lkIGV4ZWN1dGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQltb25pdG9yLnNldFRhc2tOYW1lKCJPcGVubmluZyBiYXNlIGxpYnJhcnkgYW5kIHByZXBhcmluZyBpbXBvcnQgLi4uIik7Ly8kTk9OLU5MUy0xJCIKLQkJCQkJCVhNSUxpYnJhcnlVdGlsLm9wZW5NZXRob2RMaWJyYXJ5KGJhc2VMaWJQYXRoKTsKLQotCQkJCQkJRmlsZSBpbXBvcnRMaWJGb2xkZXIgPSBuZXcgRmlsZShpbXBvcnRMaWJQYXRoKTsKLQotCQkJCQkJUGx1Z2luSW1wb3J0RGF0YSBkYXRhID0gbmV3IFBsdWdpbkltcG9ydERhdGEoKTsKLQkJCQkJCWRhdGEubGxEYXRhLnNldExpYk5hbWUoaW1wb3J0TGliRm9sZGVyLmdldE5hbWUoKSk7Ci0JCQkJCQlkYXRhLmxsRGF0YS5zZXRQYXJlbnRGb2xkZXIoaW1wb3J0TGliRm9sZGVyLmdldEFic29sdXRlUGF0aCgpKTsKLQkJCQkJCWZpbmFsIFBsdWdpbkltcG9ydGluZ1NlcnZpY2Ugc2VydmljZSA9IG5ldyBQbHVnaW5JbXBvcnRpbmdTZXJ2aWNlKGRhdGEpOwotCQkJCQkJc2VydmljZS52YWxpZGF0ZShudWxsKTsKLQkJCQkJCQotCQkJCQkJTGlzdCBpbXBvcnRQbHVnaW5zID0gZGF0YS5nZXRQbHVnaW5zKCk7Ci0JCQkJCQlmb3IgKGludCBpPTA7IGkgPCBpbXBvcnRQbHVnaW5zLnNpemUoKTsgaSsrKSB7Ci0JCQkJCQkJUGx1Z2luSW5mbyBpbmZvID0gKFBsdWdpbkluZm8pIGltcG9ydFBsdWdpbnMuZ2V0KGkpOwotCQkJCQkJCWluZm8uc2VsZWN0ZWQgPSBzZWxlY3RlZFBsdWdpbnMuaXNFbXB0eSgpIHx8IHNlbGVjdGVkUGx1Z2lucy5jb250YWlucyhpbmZvLm5hbWUpOwkJCQkJCQkKLQkJCQkJCX0KLQkJCQkJCQotCQkJCQkJc2VydmljZS5wZXJmb3JtSW1wb3J0KG1vbml0b3IpOwotCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQkJfSBmaW5hbGx5IHsKLQkJCQkJCW1vbml0b3IuZG9uZSgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfTsKLQkJCQotCQkJUHJvZ3Jlc3NNb25pdG9yRGlhbG9nIHBtRGlhbG9nID0gbmV3IFByb2dyZXNzTW9uaXRvckRpYWxvZyhEaXNwbGF5LmdldEN1cnJlbnQoKS5nZXRBY3RpdmVTaGVsbCgpKTsKLQkJCXBtRGlhbG9nLnJ1bih0cnVlLCBmYWxzZSwgb3BlcmF0aW9uKTsKLQkJCQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQkKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGxvYWRJbnB1dEZpbGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJRG9jdW1lbnQgZG9jdW1lbnQgPSBYTUxVdGlsLmxvYWRYbWwoZ2V0SW5wdXRGaWxlKCkpOwkKLQkJRWxlbWVudCByb290ID0gZG9jdW1lbnQuZ2V0RG9jdW1lbnRFbGVtZW50KCk7Ci0JCWlmICghIHJvb3QuZ2V0VGFnTmFtZSgpLmVxdWFscyhJbXBvcnRQbHVnaW5zVGFnKSkgewotCQkJU3RyaW5nIG1zZyA9ICJUaGUgcm9vdCBlbGVtZW50IG11c3QgYmU6ICAiICsgSW1wb3J0UGx1Z2luc1RhZzsgIC8vJE5PTi1OTFMtMSQKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKG1zZyk7Ci0JCX0KLQkJYmFzZUxpYlBhdGggPSByb290LmdldEF0dHJpYnV0ZShCYXNlTGlicmFyeUZvbGRlclVyaUF0dCk7Ci0JCWltcG9ydExpYlBhdGggPSByb290LmdldEF0dHJpYnV0ZShJbXBvcnRMaWJyYXJ5Rm9sZGVyVXJpQXR0KTsKLQkJc2VsZWN0ZWRQbHVnaW5zID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOwotCQkKLQkJTm9kZUxpc3Qgbm9kZXMgPSByb290LmdldENoaWxkTm9kZXMoKTsKLQkJaW50IHN6ID0gbm9kZXMgPT0gbnVsbCA/IDAgOiBub2Rlcy5nZXRMZW5ndGgoKTsKLQkJZm9yIChpbnQgaT0wOyBpPHN6OyBpKyspIHsKLQkJCU5vZGUgbm9kZSA9IG5vZGVzLml0ZW0oaSk7Ci0JCQlpZiAobm9kZSBpbnN0YW5jZW9mIEVsZW1lbnQpIHsKLQkJCQlFbGVtZW50IGVsZW1lbnQgPSAoRWxlbWVudCkgbm9kZTsKLQkJCQlpZiAoZWxlbWVudC5nZXRUYWdOYW1lKCkuZXF1YWxzKFNlbGVjdGVkUGx1Z2luVGFnKSkgewotCQkJCQlTdHJpbmcgbmFtZSAgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShOYW1lQXR0KTsJCQkJCQotCQkJCQlzZWxlY3RlZFBsdWdpbnMuYWRkKG5hbWUpOwotCQkJCX0KLQkJCX0KLQkJfQkJCi0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcvc2VydmljZXMvQ29uZmlnU3BlY3MuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcvc2VydmljZXMvQ29uZmlnU3BlY3MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjg5Njk3Mi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3NlcnZpY2VzL0NvbmZpZ1NwZWNzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLnNlcnZpY2VzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnNlcnZpY2VzLkNvbmZpZ3VyYXRpb25TcGVjOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLQotCi0vKioKLSAqIE1vZGVscyBhIGxpc3Qgb2YgbGlicmFyeSBjb25maWd1cmF0aW9uIHNwZWNpZmljYXRpb25zLgotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQ29uZmlnU3BlY3MgewotCi0JLy8gQSBsaXN0IG9mIGNvbmZpZ3VyYXRpb24gZW50cmllcy4KLQlwdWJsaWMgTGlzdCBjb25maWdzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgQ29uZmlnU3BlY3MoKSB7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBlbnRyeS4KLQkgKi8KLQlwdWJsaWMgRW50cnkgbmV3RW50cnkoKSB7Ci0JCUVudHJ5IGUgPSBuZXcgRW50cnkoKTsKLQkJY29uZmlncy5hZGQoZSk7Ci0KLQkJcmV0dXJuIGU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIGl0ZXJhdG9yIGZvciB0aGUgY29uZmlnIHNwZWNzLgotCSAqLwotCXB1YmxpYyBJdGVyYXRvciBpdGVyYXRvcigpIHsKLQkJcmV0dXJuIGNvbmZpZ3MuaXRlcmF0b3IoKTsKLQl9Ci0KLQlwdWJsaWMgY2xhc3MgRW50cnkgewotCi0JCXB1YmxpYyBDb25maWd1cmF0aW9uU3BlYyBjb25maWdTcGVjID0gbnVsbDsKLQotCQlwdWJsaWMgTWV0aG9kQ29uZmlndXJhdGlvbiBleGlzdGluZ0NvbmZpZyA9IG51bGw7Ci0KLQkJcHVibGljIGJvb2xlYW4gc2VsZWN0ZWQgPSB0cnVlOwotCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlpZiAoY29uZmlnU3BlYyAhPSBudWxsKQotCQkJCWlmIChjb25maWdTcGVjLm5hbWUgIT0gbnVsbCkKLQkJCQkJcmV0dXJuIGNvbmZpZ1NwZWMubmFtZTsKLQkJCXJldHVybiAidW5rbm93biBjb25maWd1cmF0aW9uIHNwZWNpZmljYXRpb24iOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy9zZXJ2aWNlcy9Db25maWdTcGVjc0ltcG9ydE1hbmFnZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcvc2VydmljZXMvQ29uZmlnU3BlY3NJbXBvcnRNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkMDY5YjMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy9zZXJ2aWNlcy9Db25maWdTcGVjc0ltcG9ydE1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLnNlcnZpY2VzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQuc2VydmljZXMuQ29uZmlndXJhdGlvblNwZWM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5zZXJ2aWNlcy5MaWJyYXJ5RG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy5JbXBvcnRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuSUxpYnJhcnlNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLkxpYnJhcnlVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5NdWx0aUZpbGVTYXZlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hRmFjdG9yeTsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0vKioKLSAqIE1hbmFnZXMgdGhlIGltcG9ydCBvZiBsaWJyYXJ5IGNvbmZpZ3VyYXRpb24gc3BlY2lmaWNhdGlvbnMuCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBDb25maWdTcGVjc0ltcG9ydE1hbmFnZXIgewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlDb25maWdTcGVjc0ltcG9ydE1hbmFnZXIoKSB7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY29uZmlnIHNwZWNzIGluIHRoZSBkb2N1bWVudC4KLQkgKi8KLQlwdWJsaWMgQ29uZmlnU3BlY3MgZ2V0Q29uZmlnU3BlY3MoZmluYWwgTGlicmFyeURvY3VtZW50IGRvY3VtZW50KSB7Ci0JCWZpbmFsIENvbmZpZ1NwZWNzIGNvbmZpZ1NwZWNzID0gbmV3IENvbmZpZ1NwZWNzKCk7Ci0KLQkJLy8gUmVtb3ZlIHRoZSB1bm5lZWRlZCBjb25maWd1cmF0aW9ucy4KLQkJRmlsZSBjb25maWdEaXIgPSBuZXcgRmlsZShkb2N1bWVudC5nZXRGaWxlKCkuZ2V0UGFyZW50KCksIE11bHRpRmlsZVNhdmVVdGlsLk1FVEhPRF9DT05GSUdVUkFUSU9OX0ZPTERFUl9OQU1FKTsJCQkKLQkJTGlicmFyeURvY3VtZW50LkNvbmZpZ0RvY1Zpc2l0b3IgdmlzaXRvciA9IG5ldyBMaWJyYXJ5RG9jdW1lbnQuQ29uZmlnRG9jVmlzaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIHZpc2l0KEZpbGUgZmlsZSwgRWxlbWVudCBub2RlKSB7Ci0JCQkJQ29uZmlnU3BlY3MuRW50cnkgZW50cnkgPSBjb25maWdTcGVjcy5uZXdFbnRyeSgpOwotCQkJCWVudHJ5LmNvbmZpZ1NwZWMgPSBkb2N1bWVudC5nZXRDb25maWd1cmF0aW9uU3BlYyhub2RlKTsKLQkJCQllbnRyeS5leGlzdGluZ0NvbmZpZyA9IGdldEV4aXN0aW5nQ29uZmlnKGVudHJ5LmNvbmZpZ1NwZWMuZ3VpZCk7Ci0JCQl9Ci0JCX07CQkJCi0JCUxpYnJhcnlEb2N1bWVudC52aXNpdENvbmZpZ0ZpbGVzKGNvbmZpZ0RpciwgdmlzaXRvcik7CQkJCi0JCXJldHVybiBjb25maWdTcGVjczsKLQl9Ci0KLQlwcml2YXRlIE1ldGhvZENvbmZpZ3VyYXRpb24gZ2V0RXhpc3RpbmdDb25maWcoU3RyaW5nIGd1aWQpIHsKLQkJTWV0aG9kQ29uZmlndXJhdGlvbltdIGNvbmZpZ3MgPSBMaWJyYXJ5U2VydmljZVV0aWwKLQkJCQkuZ2V0TWV0aG9kQ29uZmlndXJhdGlvbnMoTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKQotCQkJCQkJLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCkpOwotCQlpZiAoY29uZmlncyA9PSBudWxsIHx8IGNvbmZpZ3MubGVuZ3RoID09IDApIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb25maWdzLmxlbmd0aDsgaSsrKSB7Ci0JCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IGNvbmZpZ3NbaV07Ci0JCQlpZiAoY29uZmlnLmdldEd1aWQoKS5lcXVhbHMoZ3VpZCkpIHsKLQkJCQlyZXR1cm4gY29uZmlnOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogSW1wb3J0cyB0aGUgc2VsZWN0ZWQgbGlicmFyeSBjb25maWd1cmF0aW9uIHNwZWNpZmljYXRpb25zLgotCSAqIAotCSAqIEBwYXJhbSBzcGVjcwotCSAqICAgICAgICAgICAgQSBsaWJyYXJ5IGNvbmZpZ3VyYXRpb24gb2JqZWN0LgotCSAqLwotCXB1YmxpYyB2b2lkIGRvSW1wb3J0KENvbmZpZ1NwZWNzIHNwZWNzKSB7Ci0JCXRyeSB7Ci0JCQlNZXRob2RMaWJyYXJ5IGxpYiA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLQkJCQkJLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCk7Ci0KLQkJCUxpYnJhcnlVdGlsLmxvYWRBbGwobGliKTsKLQotCQkJZm9yIChJdGVyYXRvciBpdCA9IHNwZWNzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlDb25maWdTcGVjcy5FbnRyeSBlbnRyeSA9IChDb25maWdTcGVjcy5FbnRyeSkgaXQubmV4dCgpOwotCQkJCWlmIChlbnRyeS5zZWxlY3RlZCkgewotCQkJCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IGNyZWF0ZUNvbmZpZyhlbnRyeS5jb25maWdTcGVjKTsKLQotCQkJCQlpZiAoZW50cnkuZXhpc3RpbmdDb25maWcgIT0gbnVsbCkgewotCQkJCQkJLy8gTWVyZ2UgdGhlIG5ldyBwbHVnLWlucyBhbmQgcGFja2FnZXMgaW50byB0aGUgZXhpc3RpbmcKLQkJCQkJCS8vIG9uZSwKLQkJCQkJCS8vIGFueXRoaW5nIGluIHRoZSBjdXJyZW50IGNvbmZpZ3VhdGlvbiBzaG91bGQgYmUga2VwdC4KLQkJCQkJCS8vIEVjb3JlVXRpbC5yZXBsYWNlKGVudHJ5LmV4aXN0aW5nQ29uZmlnLCBjb25maWcpOwotCQkJCQkJTGlzdCBwbHVnaW5zID0gZW50cnkuZXhpc3RpbmdDb25maWcKLQkJCQkJCQkJLmdldE1ldGhvZFBsdWdpblNlbGVjdGlvbigpOwotCQkJCQkJTGlzdCBwa2dzID0gZW50cnkuZXhpc3RpbmdDb25maWcKLQkJCQkJCQkJLmdldE1ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKTsKLQkJCQkJCUxpc3Qgdmlld3MgPSBlbnRyeS5leGlzdGluZ0NvbmZpZy5nZXRQcm9jZXNzVmlld3MoKTsKLQotCQkJCQkJZm9yIChJdGVyYXRvciBpdHAgPSBjb25maWcuZ2V0TWV0aG9kUGx1Z2luU2VsZWN0aW9uKCkKLQkJCQkJCQkJLml0ZXJhdG9yKCk7IGl0cC5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJT2JqZWN0IGUgPSBpdHAubmV4dCgpOwotCQkJCQkJCWlmICghcGx1Z2lucy5jb250YWlucyhlKSkgewotCQkJCQkJCQlwbHVnaW5zLmFkZChlKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0KLQkJCQkJCWZvciAoSXRlcmF0b3IgaXRwID0gY29uZmlnLmdldE1ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKQotCQkJCQkJCQkuaXRlcmF0b3IoKTsgaXRwLmhhc05leHQoKTspIHsKLQkJCQkJCQlPYmplY3QgZSA9IGl0cC5uZXh0KCk7Ci0JCQkJCQkJaWYgKCFwa2dzLmNvbnRhaW5zKGUpKSB7Ci0JCQkJCQkJCXBrZ3MuYWRkKGUpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQotCQkJCQkJZm9yIChJdGVyYXRvciBpdHAgPSBjb25maWcuZ2V0UHJvY2Vzc1ZpZXdzKCkuaXRlcmF0b3IoKTsgaXRwCi0JCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJT2JqZWN0IGUgPSBpdHAubmV4dCgpOwotCQkJCQkJCWlmICghcGtncy5jb250YWlucyhlKSkgewotCQkJCQkJCQl2aWV3cy5hZGQoZSk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9IGVsc2UgewotCQkJCQkJLy8gQWRkIHRoZSBjb25maWd1cmF0aW9uLgotCQkJCQkJbGliLmdldFByZWRlZmluZWRDb25maWd1cmF0aW9ucygpLmFkZChjb25maWcpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQlMaWJyYXJ5VXRpbC5zYXZlTGlicmFyeShsaWIsIGZhbHNlLCBmYWxzZSk7Ci0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCUltcG9ydFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCX0KLQotCX0KLQotCXByaXZhdGUgTWV0aG9kQ29uZmlndXJhdGlvbiBjcmVhdGVDb25maWcoQ29uZmlndXJhdGlvblNwZWMgc3BlYykgewotCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IFVtYUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJLmNyZWF0ZU1ldGhvZENvbmZpZ3VyYXRpb24oKTsKLQotCQkvLyBTZXQgdGhlIGF0dHJpYnV0ZXMuCi0JCWNvbmZpZy5zZXROYW1lKHNwZWMubmFtZSk7Ci0JCWNvbmZpZy5zZXRCcmllZkRlc2NyaXB0aW9uKHNwZWMuYnJpZWZfZGVzYyk7Ci0JCWNvbmZpZy5zZXRHdWlkKHNwZWMuZ3VpZCk7Ci0KLQkJTGlzdCBwbHVnaW5zID0gY29uZmlnLmdldE1ldGhvZFBsdWdpblNlbGVjdGlvbigpOwotCQlMaXN0IHBrZ3MgPSBjb25maWcuZ2V0TWV0aG9kUGFja2FnZVNlbGVjdGlvbigpOwotCQlMaXN0IHZpZXdzID0gY29uZmlnLmdldFByb2Nlc3NWaWV3cygpOwotCi0JCUlMaWJyYXJ5TWFuYWdlciBtYW5hZ2VyID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKQotCQkJCS5nZXRDdXJyZW50TGlicmFyeU1hbmFnZXIoKTsKLQkJaWYgKG1hbmFnZXIgIT0gbnVsbCkgewotCQkJZm9yIChJdGVyYXRvciBpdCA9IHNwZWMucGx1Z2luSWRzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlTdHJpbmcgZ3VpZCA9IChTdHJpbmcpIGl0Lm5leHQoKTsKLQkJCQlPYmplY3QgZWxlbWVudCA9IG1hbmFnZXIuZ2V0TWV0aG9kRWxlbWVudChndWlkKTsKLQkJCQlpZiAoZWxlbWVudCAhPSBudWxsICYmICFwbHVnaW5zLmNvbnRhaW5zKGVsZW1lbnQpKSB7Ci0JCQkJCXBsdWdpbnMuYWRkKGVsZW1lbnQpOwotCQkJCX0KLQkJCX0KLQkJCQotCQkJZm9yIChJdGVyYXRvciBpdCA9IHNwZWMucGFja2FnZUlkcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJU3RyaW5nIGd1aWQgPSAoU3RyaW5nKSBpdC5uZXh0KCk7Ci0JCQkJT2JqZWN0IGVsZW1lbnQgPSBtYW5hZ2VyLmdldE1ldGhvZEVsZW1lbnQoZ3VpZCk7Ci0JCQkJaWYgKGVsZW1lbnQgIT0gbnVsbCAmJiAhcGtncy5jb250YWlucyhlbGVtZW50KSkgewotCQkJCQlwa2dzLmFkZChlbGVtZW50KTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBzcGVjLnZpZXdJZHMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCVN0cmluZyBndWlkID0gKFN0cmluZykgaXQubmV4dCgpOwotCQkJCU9iamVjdCBlbGVtZW50ID0gbWFuYWdlci5nZXRNZXRob2RFbGVtZW50KGd1aWQpOwotCQkJCWlmIChlbGVtZW50ICE9IG51bGwgJiYgIXZpZXdzLmNvbnRhaW5zKGVsZW1lbnQpKSB7Ci0JCQkJCXZpZXdzLmFkZChlbGVtZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gY29uZmlnOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy9zZXJ2aWNlcy9Db25maWd1cmF0aW9uSW1wb3J0RGF0YS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy9zZXJ2aWNlcy9Db25maWd1cmF0aW9uSW1wb3J0RGF0YS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNTRjZTYxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcvc2VydmljZXMvQ29uZmlndXJhdGlvbkltcG9ydERhdGEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcuc2VydmljZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcmVmZXJlbmNlcy5MaWJyYXJ5TG9jYXRpb25EYXRhOwotCi0KLS8qKgotICogRW5jYXBzdWxhdGVzIHRoZSBpbnB1dCBkYXRhIHJlcXVpcmVkIHRvIGltcG9ydCBhIGxpYnJhcnkgY29uZmlndXJhdGlvbi4KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIENvbmZpZ3VyYXRpb25JbXBvcnREYXRhIHsKLQotCXB1YmxpYyBMaWJyYXJ5TG9jYXRpb25EYXRhIGxsRGF0YSA9IG5ldyBMaWJyYXJ5TG9jYXRpb25EYXRhKCk7Ci0KLQlwcml2YXRlIEVycm9ySW5mbyBlcnJvciA9IG5ldyBFcnJvckluZm8oKTsKLQotCS8vIElmIHNwZWNzICE9IG51bGwsIGl0J3MgYSBjb25maWd1cmF0aW9uIHNwZWNpZmljYXRpb24gb25seS4KLQlwdWJsaWMgQ29uZmlnU3BlY3Mgc3BlY3MgPSBudWxsOwotCi0JcHVibGljIExpc3QgaW1wb3J0TGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQotCS8vIEluZGljYXRlIGlmIHlvdSB3YW50IHRvIHJlcGxhY2UgZXhpc3RpbmcgbWV0aG9kIHBhY2thZ2VzLgotCXB1YmxpYyBib29sZWFuIHJlcGxhY2VFeGlzdGluZyA9IHRydWU7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBDb25maWd1cmF0aW9uSW1wb3J0RGF0YSgpIHsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBlcnJvciBtZXNzYWdlIGlmIGFueS4KLQkgKi8KLQlwdWJsaWMgRXJyb3JJbmZvIGdldEVycm9ySW5mbygpIHsKLQkJcmV0dXJuIGVycm9yOwotCX0KLQotCXB1YmxpYyBjbGFzcyBFcnJvckluZm8gewotCi0JCXByaXZhdGUgU3RyaW5nQnVmZmVyIGVycm9yTWVzc2FnZSA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQotCQlwdWJsaWMgRXJyb3JJbmZvKCkgewotCQl9Ci0KLQkJcHVibGljIHZvaWQgYWRkRXJyb3IoU3RyaW5nIG1lc3NhZ2UpIHsKLQkJCWVycm9yTWVzc2FnZS5hcHBlbmQobWVzc2FnZSk7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldEVycm9yKCkgewotCQkJcmV0dXJuIGVycm9yTWVzc2FnZS50b1N0cmluZygpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgY2xlYXIoKSB7Ci0JCQllcnJvck1lc3NhZ2Uuc2V0TGVuZ3RoKDApOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3NlcnZpY2VzL0NvbmZpZ3VyYXRpb25JbXBvcnRTZXJ2aWNlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3NlcnZpY2VzL0NvbmZpZ3VyYXRpb25JbXBvcnRTZXJ2aWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkYjlhMjQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy9zZXJ2aWNlcy9Db25maWd1cmF0aW9uSW1wb3J0U2VydmljZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDc0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcuc2VydmljZXM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnNlcnZpY2UudmVyc2lvbmluZy5WZXJzaW9uVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpLnV0aWwuTXNnQm94OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuRmlsZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5zZXJ2aWNlcy5MaWJyYXJ5RG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5zZXJ2aWNlcy5QbHVnaW5FeHBvcnRTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcuSW1wb3J0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcuSW1wb3J0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnByb2plY3QuTWV0aG9kTGlicmFyeVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuc2VydmljZXMuU2FmZVVwZGF0ZUNvbnRyb2xsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkudXRpbC5Db252ZXJ0R3VpZGFuY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLnV0aWwuVHlwZUNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS53aXphcmRzLk9wZW5MaWJyYXJ5V2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuTGlicmFyeVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5SZXNvdXJjZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLm1pZ3JhdGlvbi5VcGdyYWRlQ2FsbGVySW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UucmVmcmVzaC5SZWZyZXNoSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HdWlkYW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLQotaW1wb3J0IGNvbS5pYm0uaWN1LnV0aWwuQ2FsZW5kYXI7Ci0KLQotLyoqCi0gKiBJbXBvcnRzIGEgbGlicmFyeSBjb25maWd1cmF0aW9uLgotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQ29uZmlndXJhdGlvbkltcG9ydFNlcnZpY2UgewotCi0JcHJpdmF0ZSBib29sZWFuIGxvY2FsRGVidWcgPSBmYWxzZTsKLQkKLQlwcml2YXRlIFVwZ3JhZGVDYWxsZXJJbmZvIHVwR3JhZGVJbmZvOwotCQotCXByaXZhdGUgQ29uZmlndXJhdGlvbkltcG9ydERhdGEgZGF0YTsKLQotCUxpYnJhcnlEb2N1bWVudCBpbXBvcnRpbmdMaWJEb2MgPSBudWxsOwotCi0JTGlicmFyeURpZmZNYW5hZ2VyIGRpZmZNZ3IgPSBudWxsOwotCi0JQ29uZmlnU3BlY3NJbXBvcnRNYW5hZ2VyIHNwZWNzTWdyID0gbnVsbDsKLQkKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBDb25maWd1cmF0aW9uSW1wb3J0U2VydmljZShDb25maWd1cmF0aW9uSW1wb3J0RGF0YSBkYXRhKSB7Ci0JCXRoaXMuZGF0YSA9IGRhdGE7Ci0JfQotCi0JLyoqCi0JICogQW5hbHl6ZXMgdGhlIGltcG9ydGVkIGxpYnJhcnkgd2l0aCByZXNwZWN0IHRvIHRoZSBiYXNlIGxpYnJhcnkuCi0JICovCi0JcHVibGljIHZvaWQgYW5hbHl6ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJdHJ5IHsKLQkJCWlmIChtb25pdG9yICE9IG51bGwpIHsKLQkJCQltb25pdG9yLnNldFRhc2tOYW1lKEltcG9ydFJlc291cmNlcy5Db25maWd1cmF0aW9uSW1wb3J0U2VydmljZV9NU0cwKTsKLQkJCX0KLQotCQkJZGF0YS5nZXRFcnJvckluZm8oKS5jbGVhcigpOwotCi0JCQkvLyBQcmVwYXJlIHRoZSBsaWJyYXJ5IGZpbGVzLgotCQkJU3RyaW5nIHBhdGggPSBkYXRhLmxsRGF0YS5nZXRQYXJlbnRGb2xkZXIoKTsKLQkJCWlmIChwYXRoLmluZGV4T2YoRmlsZS5zZXBhcmF0b3IgKyBMaWJyYXJ5RG9jdW1lbnQubGlicmFyeUZpbGUpIDwgMCkgewotCQkJCXBhdGggKz0gRmlsZS5zZXBhcmF0b3IgKyBMaWJyYXJ5RG9jdW1lbnQubGlicmFyeUZpbGU7Ci0JCQl9Ci0JCQlGaWxlIGltcG9ydGluZ0xpYlBhdGggPSBuZXcgRmlsZShwYXRoKTsKLQkJCQotCQkJYm9vbGVhbiBpc0xpYnJhcnlGaWxlID0gdHJ1ZTsKLQkJCWlmICghaW1wb3J0aW5nTGliUGF0aC5leGlzdHMoKSkgewotCQkJCWltcG9ydGluZ0xpYlBhdGggPSBuZXcgRmlsZShpbXBvcnRpbmdMaWJQYXRoLmdldFBhcmVudEZpbGUoKSwKLQkJCQkJCUxpYnJhcnlEb2N1bWVudC5leHBvcnRGaWxlKTsKLQkJCQlpc0xpYnJhcnlGaWxlID0gZmFsc2U7Ci0JCQl9Ci0KLQkJCWlmICghaW1wb3J0aW5nTGliUGF0aC5leGlzdHMoKSkgewotCQkJCWRhdGEKLQkJCQkJCS5nZXRFcnJvckluZm8oKQotCQkJCQkJLmFkZEVycm9yKAotCQkJCQkJCQlOTFMuYmluZChJbXBvcnRSZXNvdXJjZXMuQ29uZmlndXJhdGlvbkltcG9ydFNlcnZpY2VfTVNHMSwgaW1wb3J0aW5nTGliUGF0aC5nZXRQYXJlbnQoKSkpOyAKLQkJCQlyZXR1cm47Ci0JCQl9Ci0KLQkJCWJvb2xlYW4gaGFuZGxlVmVyc2lvbiA9IGlzTGlicmFyeUZpbGU7Ci0JCQlpZiAoaGFuZGxlVmVyc2lvbikgewotCQkJCXVwR3JhZGVJbmZvID0gbmV3IENvbmZpZ3VyYXRpb25JbXBvcnRTZXJ2aWNlLlVwZ3JhZGVJbmZvKFVwZ3JhZGVDYWxsZXJJbmZvLnVwZ3JhZGVJbXBvcnRDb25maWcsIGltcG9ydGluZ0xpYlBhdGgpOwotCQkJCWlmICghIGhhbmRsZVRvb2xWZXJzaW9uKGltcG9ydGluZ0xpYlBhdGgsIHVwR3JhZGVJbmZvKSkgewotCQkJCQlTdHJpbmcgZXJyTXNnID0gdXBHcmFkZUluZm8uZ2V0RXJyb3JNc2coKTsKLQkJCQkJaWYgKGVyck1zZyA9PSBudWxsIHx8IGVyck1zZy5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJCQllcnJNc2cgPSBJbXBvcnRSZXNvdXJjZXMuSW1wb3J0Q29uZmlndXJhdGlvbldpemFyZF9FUlJfSW1wb3J0X2NvbmZpZ3VyYXRpb247Ci0JCQkJCX0KLQkJCQkJZGF0YQotCQkJCQkuZ2V0RXJyb3JJbmZvKCkKLQkJCQkJLmFkZEVycm9yKAotCQkJCQkJCU5MUy5iaW5kKGVyck1zZywgaW1wb3J0aW5nTGliUGF0aC5nZXRQYXJlbnQoKSkpOyAKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlpZiAodXBHcmFkZUluZm8uZ2V0Q29waWVkTGliRmlsZSgpICE9IG51bGwpIHsKLQkJCQkJaW1wb3J0aW5nTGliUGF0aCA9IHVwR3JhZGVJbmZvLmdldENvcGllZExpYkZpbGUoKTsKLQkJCQl9Ci0JCQl9Ci0JCQkJCQkKLQkJCWltcG9ydGluZ0xpYkRvYyA9IG5ldyBMaWJyYXJ5RG9jdW1lbnQoaW1wb3J0aW5nTGliUGF0aCk7Ci0KLQkJCWJvb2xlYW4gaXNDb25maWdTcGVjcyA9IGltcG9ydGluZ0xpYkRvYy5pc0NvbmZpZ1NwZWNzT25seSgpOwotCi0JCQlpZiAoaXNDb25maWdTcGVjcykgewotCi0JCQkJc3BlY3NNZ3IgPSBuZXcgQ29uZmlnU3BlY3NJbXBvcnRNYW5hZ2VyKCk7Ci0KLQkJCQkvLyBTY2FuIHRoZSBsaWJyYXJ5IGZpbGUgZm9yIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24uCi0JCQkJZGF0YS5zcGVjcyA9IHNwZWNzTWdyLmdldENvbmZpZ1NwZWNzKGltcG9ydGluZ0xpYkRvYyk7Ci0KLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKCFpc0xpYnJhcnlGaWxlKSB7Ci0JCQkJCWRhdGEKLQkJCQkJLmdldEVycm9ySW5mbygpCi0JCQkJCS5hZGRFcnJvcigKLQkJCQkJCQlOTFMuYmluZChJbXBvcnRSZXNvdXJjZXMuQ29uZmlndXJhdGlvbkltcG9ydFNlcnZpY2VfTVNHMSwgaW1wb3J0aW5nTGliUGF0aC5nZXRQYXJlbnQoKSkpOyAKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlkYXRhLnNwZWNzID0gbnVsbDsKLQotCQkJCS8vIE9wZW4gdGhlIGxpYnJhcnkgYW5kIGNvbXBhcmUgdGhlIGRpZmZlcmVuY2UuCi0JCQkJCi0JCQkJLy8gbmVlZCB0byBvcGVuIGFuZCBjbG9zZSB0aGUgbGlicmFyeSB0byBoYXZlIHRoZSBwcm9qZWN0IHJlc291cmNlcyBpbml0aWFsaXplZCBwcm9wZXJseQotCQkJCVN0cmluZyBsaWJEaXIgPSBpbXBvcnRpbmdMaWJQYXRoLmdldFBhcmVudEZpbGUoKS5nZXRBYnNvbHV0ZVBhdGgoKTsKLQotCQkJCVN0cmluZyBwcm9qZWN0TmFtZSA9ICJDb25maWd1cmF0aW9uIEltcG9ydCBQcm9qZWN0ICgiIC8vJE5PTi1OTFMtMSQKLQkJCQkJCSsgSW50ZWdlci50b0hleFN0cmluZyhsaWJEaXIuaGFzaENvZGUoKSkgKyAiKSI7IC8vJE5PTi1OTFMtMSQKLQkJCQkKLQkJCQlNZXRob2RMaWJyYXJ5UHJvamVjdC5vcGVuUHJvamVjdChsaWJEaXIsIHByb2plY3ROYW1lLCBtb25pdG9yKTsKLQkJCQl0cnkgewotCQkJCQlNZXRob2RMaWJyYXJ5IGltcG9ydExpYnJhdHkgPSBMaWJyYXJ5VXRpbAotCQkJCQkJCS5sb2FkTGlicmFyeShpbXBvcnRpbmdMaWJQYXRoLmdldEFic29sdXRlUGF0aCgpKTsKLQkJCQkJTWV0aG9kTGlicmFyeSBiYXNlTGlicmFyeSA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLQkJCQkJCQkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKTsKLQkJCQkJCi0JCQkJCWhhbmRsZVR5cGVDaGFuZ2VzKGJhc2VMaWJyYXJ5LCBpbXBvcnRMaWJyYXR5KTsKLQkJCQkJCi0JCQkJCVN0cmluZyBiYXNlTGliRGlyID0gbnVsbDsKLQkJCQkJdHJ5IHsJLy9Ob3QgbmVjY2Vzc2FyeSwgYnV0IHByZXZlbnQgaW50cm9kdWNpbmcgYW55IHBvdGVudGlhbCByZWdyZXNzaW9uIGR1ZSB0byB0aGlzIGNoYW5nZQotCQkJCQkJRmlsZSBiRmlsZSA9IG5ldyBGaWxlKGJhc2VMaWJyYXJ5LmVSZXNvdXJjZSgpLmdldFVSSSgpLnRvRmlsZVN0cmluZygpKS5nZXRQYXJlbnRGaWxlKCk7OwotCQkJCQkJYmFzZUxpYkRpciA9IGJGaWxlLmdldEFic29sdXRlUGF0aCgpOwotCQkJCQl9IGNhdGNoIChUaHJvd2FibGUgZSkgewkJCQkJCQotCQkJCQl9Ci0JCQkJCWlmIChsaWJEaXIuZXF1YWxzSWdub3JlQ2FzZShiYXNlTGliRGlyKSkgewotCQkJCQkJZGF0YQotCQkJCQkJCQkuZ2V0RXJyb3JJbmZvKCkKLQkJCQkJCQkJLmFkZEVycm9yKAotCQkJCQkJCQkJCU5MUy5iaW5kKEltcG9ydFJlc291cmNlcy5Db25maWd1cmF0aW9uSW1wb3J0U2VydmljZV9NU0cyLCBpbXBvcnRpbmdMaWJQYXRoLmdldFBhcmVudCgpKSk7IAotCQkJCQkJcmV0dXJuOwotCQkJCQl9Ci0JCQkJCQotCQkJCQlmaXhJbXBvcnRMaWJyYXJ5U3lzdGVtUGFja2FnZUdVSURzKGJhc2VMaWJyYXJ5LCBpbXBvcnRMaWJyYXR5KTsKLQkJCQkJCi0JCQkJCWRpZmZNZ3IgPSBuZXcgTGlicmFyeURpZmZNYW5hZ2VyKGJhc2VMaWJyYXJ5LCBpbXBvcnRMaWJyYXR5KTsKLQkJCQkJZGlmZk1nci5idWlsZERpZmZUcmVlKCk7Ci0JCQkJCQotCQkJCQlpZiAobG9jYWxEZWJ1ZykgewotCQkJCQkJZGlmZk1nci5yb290RGlmZlRyZWUuZGVidWdEdW1wKCk7Ci0JCQkJCX0KLQkJCQkJCi0JCQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKLQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQl9Ci0JCQkJTWV0aG9kTGlicmFyeVByb2plY3QuY2xvc2VQcm9qZWN0KGxpYkRpciwgbW9uaXRvcik7Ci0JCQkJTWV0aG9kTGlicmFyeVByb2plY3QuZGVsZXRlUHJvamVjdChsaWJEaXIsIG1vbml0b3IpOwotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCWV4LnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBpbXBvcnQgZGF0YS4KLQkgKi8KLQlwdWJsaWMgQ29uZmlndXJhdGlvbkltcG9ydERhdGEgZ2V0SW1wb3J0RGF0YSgpIHsKLQkJcmV0dXJuIGRhdGE7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBzcGVjIG9ubHkgYXR0cmlidXRlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU3BlY3NPbmx5KCkgewotCQlyZXR1cm4gKGRhdGEuc3BlY3MgIT0gbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZGlmZiB0cmVlLgotCSAqLwotCXB1YmxpYyBFbGVtZW50RGlmZlRyZWUgZ2V0RGlmZlRyZWUoKSB7Ci0JCXJldHVybiBkaWZmTWdyLmdldERpZmZUcmVlKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgaW1wb3J0IGxpYnJhcnkuCi0JICovCi0JcHVibGljIE1ldGhvZExpYnJhcnkgZ2V0SW1wb3J0aW5nTGlicmFyeSgpIHsKLQkJcmV0dXJuIGRpZmZNZ3IuZ2V0SW1wb3J0aW5nTGlicmFyeSgpOwotCX0KLQotCS8qKgotCSAqIFBlcmZvcm1zIHRoZSBpbXBvcnQuCi0JICovCi0JcHVibGljIHZvaWQgcGVyZm9ybUltcG9ydChmaW5hbCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJCi0JCS8vIG5lZWQgdG8gZGlzYWJsZSB0aGUgd29ya3NwYWNlIHJlZnJlc2hpbmcKLQkJYm9vbGVhbiByZWZyZXNoID0gUmVmcmVzaEpvYi5nZXRJbnN0YW5jZSgpLmlzRW5hYmxlZCgpOwotCQlpZihyZWZyZXNoKSB7Ci0JCQkvLyBkaXNhYmxlIHJlc291cmNlIHJlZnJlc2hpbmcgZHVyaW5nIGltcG9ydAotCQkJLy8KLQkJCVJlZnJlc2hKb2IuZ2V0SW5zdGFuY2UoKS5zZXRFbmFibGVkKGZhbHNlKTsKLQkJfQotCQkKLQkJdHJ5IHsKLQkJCWlmIChtb25pdG9yICE9IG51bGwpIHsKLQkJCQltb25pdG9yLnNldFRhc2tOYW1lKEltcG9ydFJlc291cmNlcy5Db25maWd1cmF0aW9uSW1wb3J0U2VydmljZV9NU0czKTsKLQkJCX0KLQotCQkJaWYgKGlzU3BlY3NPbmx5KCkpIHsKLQkJCQlzcGVjc01nci5kb0ltcG9ydChkYXRhLnNwZWNzKTsKLQkJCX0gZWxzZSB7Ci0JCQkJTGlicmFyeUltcG9ydE1hbmFnZXIgaW1wb3J0aW5nTWdyID0gbmV3IExpYnJhcnlJbXBvcnRNYW5hZ2VyKGRpZmZNZ3IsIGRhdGEuaW1wb3J0TGlzdCk7CQkJCi0JCQkJaW1wb3J0aW5nTWdyLmRvTWVyZ2UoZGF0YS5yZXBsYWNlRXhpc3RpbmcsIG1vbml0b3IpOwotCQkJfQotCQkJCi0JCQkvLyByZWZyZXNoIGxpYnJhcnkgZmlsZXMgaW4gd29ya3NwYWNlCi0JCQkvLwotCQkJTWV0aG9kTGlicmFyeSBsaWIgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCk7Ci0JCQlSZXNvdXJjZVV0aWwucmVmcmVzaFJlc291cmNlcyhsaWIsIG1vbml0b3IpOwotCQkJCi0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlJbXBvcnRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQl9IGZpbmFsbHkgewotCQkJaWYocmVmcmVzaCkgewotCQkJCS8vIHJlLWVuYWJsZSByZXNvdXJjZSByZWZyZXNoaW5nIAotCQkJCS8vCi0JCQkJUmVmcmVzaEpvYi5nZXRJbnN0YW5jZSgpLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQl9Ci0JCQlpZiAodXBHcmFkZUluZm8gIT0gbnVsbCkgewotCQkJCXVwR3JhZGVJbmZvLnJlbW92ZUNvcGllZExpYnJhcnkoKTsKLQkJCQl1cEdyYWRlSW5mbyA9IG51bGw7Ci0JCQl9Ci0JCX0JCi0JCQotCQl0cnkgewotCQkJLy8gUmVvcGVuIHRoZSBsaWJyYXJ5LgotCQkJTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5yZW9wZW5DdXJyZW50TWV0aG9kTGlicmFyeSgpOwkJCi0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCUltcG9ydFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQ2hlY2tzIHRoZSB0b29sIHZlcnNpb24uCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdmVyc2lvbkNoZWNrKGZpbmFsIFN0cmluZyB4bWxQYXRoLCBmaW5hbCBTdHJpbmcgdGl0bGUpIHsKLQkJZmluYWwgU3RyaW5nW10gcmV0ID0gbmV3IFN0cmluZ1sxXTsKLQkJcmV0WzBdID0gbnVsbDsKLQkJU2FmZVVwZGF0ZUNvbnRyb2xsZXIuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewkKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsJCQkJCi0JCQkJVmVyc2lvblV0aWwuVmVyc2lvbkNoZWNrSW5mbyBpbmZvID0gVmVyc2lvblV0aWwuY2hlY2tMaWJyYXJ5VmVyc2lvbihuZXcgRmlsZSh4bWxQYXRoKSk7Ci0JCQkJaWYgKGluZm8gPT0gbnVsbCkgewotCQkJCQlyZXRbMF0gPSBOTFMuYmluZChJbXBvcnRSZXNvdXJjZXMudmVyc2lvbk1pc21hdGNoX29sZERhdGFfdW5rbm93biwgbmV3IE9iamVjdFtdIHsKLQkJCQkJCQlQbGF0Zm9ybS5nZXRQcm9kdWN0KCkuZ2V0TmFtZSgpfSk7CQkJCQkKLQkJCQl9IGVsc2UgewotCQkJCQlpZiAoaW5mby5yZXN1bHQgPCAwKSB7Ci0JCQkJCQlpZiAoaW5mby50b29sSUQuZXF1YWxzKFZlcnNpb25VdGlsLmdldFByaW1hcnlUb29sSUQoKSkpIHsKLQkJCQkJCQlyZXRbMF0gPSBOTFMuYmluZChJbXBvcnRSZXNvdXJjZXMudmVyc2lvbk1pc21hdGNoX29sZERhdGEsIG5ldyBPYmplY3RbXSB7Ci0JCQkJCQkJCQlpbmZvLnRvb2xWZXJzaW9uLCBQbGF0Zm9ybS5nZXRQcm9kdWN0KCkuZ2V0TmFtZSgpfSk7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCXJldFswXSA9IE5MUy5iaW5kKEltcG9ydFJlc291cmNlcy52ZXJzaW9uTWlzbWF0Y2hfb2xkRGF0YV91bmtub3duLCBuZXcgT2JqZWN0W10gewotCQkJCQkJCQkJUGxhdGZvcm0uZ2V0UHJvZHVjdCgpLmdldE5hbWUoKX0pOwkJCQkJCi0JCQkJCQl9Ci0JCQkJCX0gZWxzZSBpZiAoaW5mby5yZXN1bHQgPiAwKSB7Ci0JCQkJCQlpZiAoaW5mby50b29sSUQuZXF1YWxzKFZlcnNpb25VdGlsLmdldFByaW1hcnlUb29sSUQoKSkpIHsKLQkJCQkJCQlyZXRbMF0gPSBOTFMuYmluZChJbXBvcnRSZXNvdXJjZXMudmVyc2lvbk1pc21hdGNoX29sZFRvb2wsIG5ldyBPYmplY3RbXSB7Ci0JCQkJCQkJCQlpbmZvLnRvb2xWZXJzaW9uLCBQbGF0Zm9ybS5nZXRQcm9kdWN0KCkuZ2V0TmFtZSgpfSk7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCXJldFswXSA9IE5MUy5iaW5kKEltcG9ydFJlc291cmNlcy52ZXJzaW9uTWlzbWF0Y2hfb2xkVG9vbF91bmtub3duLCBuZXcgT2JqZWN0W10gewotCQkJCQkJCQkJUGxhdGZvcm0uZ2V0UHJvZHVjdCgpLmdldE5hbWUoKX0pOwotCQkJCQkJfQotCQkJCQl9IAotCQkJCX0KLQkJCQlpZiAocmV0WzBdICE9IG51bGwpIHsKLQkJCQkJSW1wb3J0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKS5kaXNwbGF5RXJyb3IodGl0bGUsIHJldFswXSk7CQkJCQkKLQkJCQl9Ci0JCQl9Ci0JCX0pOwkJCi0JCXJldHVybiByZXRbMF07Ci0JfQotCQotCS8qKgotCSAqIEZpeGVzIHRoZSBpbXBvcnRlZCBsaWJyYXJ5J3Mgc3lzdGVtIHBhY2thZ2UgZ3VpZHMgd2l0aCB0aG9zZSBiYXNlJ3MuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGZpeEltcG9ydExpYnJhcnlTeXN0ZW1QYWNrYWdlR1VJRHMoTWV0aG9kTGlicmFyeSBiYXNlTGlicmFyeSwgTWV0aG9kTGlicmFyeSBpbXBvcnRMaWJyYXR5KSB7Ci0JCUhhc2hNYXAgcGx1Z2luc01hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCUxpc3QgcGx1Z2lucyA9IGJhc2VMaWJyYXJ5LmdldE1ldGhvZFBsdWdpbnMoKTsKLQkJZm9yIChpbnQgaT0wOyBpIDwgcGx1Z2lucy5zaXplKCk7IGkrKykgewotCQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IChNZXRob2RQbHVnaW4pIHBsdWdpbnMuZ2V0KGkpOwotCQkJcGx1Z2luc01hcC5wdXQocGx1Z2luLmdldEd1aWQoKSwgcGx1Z2luKTsKLQkJfQotCQlpZiAocGx1Z2luc01hcC5pc0VtcHR5KCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJTGlzdCBpbXBvcnRQbHVnaW5zVG9GaXggPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUxpc3QgaW1wb3J0UGx1Z2lucyA9IGltcG9ydExpYnJhdHkuZ2V0TWV0aG9kUGx1Z2lucygpOwotCQlmb3IgKGludCBpPTA7IGkgPCBpbXBvcnRQbHVnaW5zLnNpemUoKTsgaSsrKSB7Ci0JCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gKE1ldGhvZFBsdWdpbikgaW1wb3J0UGx1Z2lucy5nZXQoaSk7Ci0JCQlpZiAocGx1Z2luc01hcC5jb250YWluc0tleShwbHVnaW4uZ2V0R3VpZCgpKSkgewotCQkJCWltcG9ydFBsdWdpbnNUb0ZpeC5hZGQocGx1Z2luKTsKLQkJCX0KLQkJfQotCQkKLQkJZm9yIChpbnQgaT0wOyBpIDwgaW1wb3J0UGx1Z2luc1RvRml4LnNpemUoKTsgaSsrKSB7Ci0JCQlNZXRob2RQbHVnaW4gaW1wb3J0UGx1Z2luID0gKE1ldGhvZFBsdWdpbikgaW1wb3J0UGx1Z2luc1RvRml4LmdldChpKTsKLQkJCU1ldGhvZFBsdWdpbiBiYXNlUGx1Z2luID0gKE1ldGhvZFBsdWdpbikgcGx1Z2luc01hcC5nZXQoaW1wb3J0UGx1Z2luLmdldEd1aWQoKSk7Ci0JCQlpZiAoYmFzZVBsdWdpbiA9PSBudWxsKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlMaXN0IGltcG9ydFBhY2thZ2VzID0gVG5nVXRpbC5nZXRBbGxTeXN0ZW1QYWNrYWdlcyhpbXBvcnRQbHVnaW4pOwotCQkJSGFzaE1hcCBpbXBvcnRQYWNrYWdlTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJCWZvciAoaW50IGo9MDsgaiA8IGltcG9ydFBhY2thZ2VzLnNpemUoKTsgaisrKSB7Ci0JCQkJTWV0aG9kRWxlbWVudCBpbXBvcnRQYWNrYWdlID0gKE1ldGhvZEVsZW1lbnQpIGltcG9ydFBhY2thZ2VzLmdldChqKTsKLQkJCQlpbXBvcnRQYWNrYWdlTWFwLnB1dChpbXBvcnRQYWNrYWdlLmdldE5hbWUoKSwgaW1wb3J0UGFja2FnZSk7Ci0JCQl9Ci0JCQkKLQkJCUxpc3QgYmFzZVBhY2thZ2VzID0gVG5nVXRpbC5nZXRBbGxTeXN0ZW1QYWNrYWdlcyhiYXNlUGx1Z2luKTsJCQkKLQkJCWZvciAoaW50IGo9MDsgaiA8IGJhc2VQYWNrYWdlcy5zaXplKCk7IGorKykgewotCQkJCU1ldGhvZEVsZW1lbnQgYmFzZVBhY2thZ2UgPSAoTWV0aG9kRWxlbWVudCkgYmFzZVBhY2thZ2VzLmdldChqKTsKLQkJCQlNZXRob2RFbGVtZW50IGltcG9ydFBhY2thZ2UgPSAoTWV0aG9kRWxlbWVudCkgaW1wb3J0UGFja2FnZU1hcC5nZXQoYmFzZVBhY2thZ2UuZ2V0TmFtZSgpKTsKLQkJCQlpZiAoaW1wb3J0UGFja2FnZSA9PSBudWxsKSB7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCQlTdHJpbmcgZ3VpZCA9IGJhc2VQYWNrYWdlLmdldEd1aWQoKTsKLQkJCQlpZiAoISBpbXBvcnRQYWNrYWdlLmdldEd1aWQoKS5lcXVhbHMoZ3VpZCkpIHsKLQkJCQkJaW1wb3J0UGFja2FnZS5zZXRHdWlkKGd1aWQpOwotCQkJCX0KLQkJCX0KLQkJfQkJCQotCX0KLQkKLQlwcml2YXRlIHZvaWQgaGFuZGxlVHlwZUNoYW5nZXMoTWV0aG9kTGlicmFyeSBiYXNlTGliLCBNZXRob2RMaWJyYXJ5IGltcG9ydExpYikgewotCQlIYXNoTWFwIGJhc2VNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQljb2xsZWN0UG90ZW50aWFsVHlwZUNoYW5nZWQoYmFzZUxpYiwgYmFzZU1hcCk7Ci0JCUhhc2hNYXAgaW1wb3J0TWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJY29sbGVjdFBvdGVudGlhbFR5cGVDaGFuZ2VkKGltcG9ydExpYiwgaW1wb3J0TWFwKTsKLQkJaGFuZGxlVHlwZUNoYW5nZXMoYmFzZU1hcCwgaW1wb3J0TWFwKTsKLQl9Ci0KLQkvKioKLQkgKiBIYW5kbGVzIE1ldGhvZEVsZW1lbnQgdHlwZSBjaGFuZ2VzLiBOb3RlOiBmb3IgTWV0aG9kRWxlbWVudCBvYmplY3RzIGluIGltcG9ydE1hcAotCSAqIG9ubHkgZUNsYXNzIHR5cGUgaXMgdXNlZCBpbiB0aGlzIG1ldGhvZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgaGFuZGxlVHlwZUNoYW5nZXMoSGFzaE1hcCBiYXNlTWFwLCBIYXNoTWFwIGltcG9ydE1hcCkgewotCQlBcnJheUxpc3QgdG9DaGFuZ2VMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gaW1wb3J0TWFwLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSkgaXQubmV4dCgpOwotCQkJT2JqZWN0IGd1aWQgPSBlbnRyeS5nZXRLZXkoKTsKLQkJCU1ldGhvZEVsZW1lbnQgYmFzZUVsZW0gPSAoTWV0aG9kRWxlbWVudCkgYmFzZU1hcC5nZXQoZ3VpZCk7Ci0JCQlpZiAoYmFzZUVsZW0gIT0gbnVsbCkgewotCQkJCU1ldGhvZEVsZW1lbnQgZWxlbSA9IChNZXRob2RFbGVtZW50KSBlbnRyeS5nZXRWYWx1ZSgpOwotCQkJCWlmICghIGVsZW0uZUNsYXNzKCkuZXF1YWxzKGJhc2VFbGVtLmVDbGFzcygpKSkgewotCQkJCQlNZXRob2RFbGVtZW50IGVsZW1QYWlyW10gPSBuZXcgTWV0aG9kRWxlbWVudFtdIHtiYXNlRWxlbSwgZWxlbX07Ci0JCQkJCXRvQ2hhbmdlTGlzdC5hZGQoZWxlbVBhaXIpOwotCQkJCX0KLQkJCX0JCQkKLQkJfQotCQlmb3IgKGludCBpPTA7IGk8dG9DaGFuZ2VMaXN0LnNpemUoKTsgaSsrKSB7Ci0JCQlNZXRob2RFbGVtZW50IGVsZW1QYWlyW10gPSAoTWV0aG9kRWxlbWVudFtdKSB0b0NoYW5nZUxpc3QuZ2V0KGkpOwotCQkJZmluYWwgTWV0aG9kRWxlbWVudCBiYXNlRWxlbSA9IGVsZW1QYWlyWzBdOwotCQkJZmluYWwgTWV0aG9kRWxlbWVudCBpbXBvcnRFbGVtID0gZWxlbVBhaXJbMV07Ci0JCQlpZiAoYmFzZUVsZW0gaW5zdGFuY2VvZiBHdWlkYW5jZSkgewotCQkJCURpc3BsYXkuZ2V0RGVmYXVsdCgpLnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJQ29udmVydEd1aWRhbmNlVHlwZS5jb252ZXJ0R3VpZGFuY2UoKEd1aWRhbmNlKSBiYXNlRWxlbSwgTXNnQm94LmdldERlZmF1bHRTaGVsbCgpLCBudWxsLCBpbXBvcnRFbGVtLmVDbGFzcygpKTsKLQkJCQkJfQotCQkJCX0pOwotCQkJfSBlbHNlIGlmIChiYXNlRWxlbSBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJVHlwZUNvbnZlcnRlci5jb252ZXJ0QWN0aXZpdHkoKEFjdGl2aXR5KSBiYXNlRWxlbSwgaW1wb3J0RWxlbS5lQ2xhc3MoKSk7IAotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQ29sbGVjdHMgZWxlbWVudHMgaW4gbGliIHRoYXQgbWF5IGhhdmUgdHlwZSBjaGFuZ2VzIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBjb2xsZWN0UG90ZW50aWFsVHlwZUNoYW5nZWQoTWV0aG9kTGlicmFyeSBsaWIsIEhhc2hNYXAgbWFwKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSBsaWIuZUFsbENvbnRlbnRzKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBvYmogPSBpdC5uZXh0KCk7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgR3VpZGFuY2UgfHwKLQkJCQlvYmogaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCU1ldGhvZEVsZW1lbnQgZWxlbSA9IChNZXRob2RFbGVtZW50KSBvYmo7Ci0JCQkJbWFwLnB1dChlbGVtLmdldEd1aWQoKSwgZWxlbSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGhhbmRsZVRvb2xWZXJzaW9uKEZpbGUgbGliRmlsZSwgZmluYWwgVXBncmFkZUNhbGxlckluZm8gaW5mbykgewotCQlmaW5hbCBTdHJpbmcgbGliRm9sZGVyUGF0aCA9IGxpYkZpbGUuZ2V0UGFyZW50RmlsZSgpLmdldEFic29sdXRlUGF0aCgpOwotCQlmaW5hbCBib29sZWFuIHJldFtdID0gbmV3IGJvb2xlYW5bMV07Ci0JCVNhZmVVcGRhdGVDb250cm9sbGVyLnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsJCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJcmV0WzBdID0gT3BlbkxpYnJhcnlXaXphcmQuaGFuZGxlVG9vbFZlcnNpb24obGliRm9sZGVyUGF0aCwgaW5mbyk7Ci0JCQl9Ci0JCX0pOwkJCQkJCQkJCi0JCXJldHVybiByZXRbMF07Ci0JfQkKLQotCXB1YmxpYyBzdGF0aWMgY2xhc3MgVXBncmFkZUluZm8gZXh0ZW5kcyBVcGdyYWRlQ2FsbGVySW5mbyB7Ci0JCQotCQlwdWJsaWMgVXBncmFkZUluZm8oaW50IGNhbGxlclR5cGUsIEZpbGUgbGliRmlsZSkgewotCQkJc3VwZXIoY2FsbGVyVHlwZSwgbGliRmlsZSk7Ci0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIGNvcHlMaWJyYXJ5KCkgewotCQkJU3RyaW5nIHVzZXJIb21lID0gU3lzdGVtLmdldFByb3BlcnR5KCJ1c2VyLmhvbWUiKTsgLy8kTk9OLU5MUy0xJAotCQkJU3RyaW5nIGRlc0xpYkZvbGRlclBhdGggPSB1c2VySG9tZSArIEZpbGUuc2VwYXJhdG9yCi0JCQkJCSsgIkVQRiIgKyBGaWxlLnNlcGFyYXRvciArICJFeHBvcnQiICsgRmlsZS5zZXBhcmF0b3IgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCSsgTG9uZy50b0hleFN0cmluZyhDYWxlbmRhci5nZXRJbnN0YW5jZSgpLmdldFRpbWVJbk1pbGxpcygpKSArIEZpbGUuc2VwYXJhdG9yOwkJCi0JCQlGaWxlIGRlc0xpYkZvbGRlciA9IG5ldyBGaWxlKGRlc0xpYkZvbGRlclBhdGgpOwotCQkJaWYgKCFkZXNMaWJGb2xkZXIuZXhpc3RzKCkpIHsKLQkJCQlkZXNMaWJGb2xkZXIubWtkaXJzKCk7Ci0JCQl9IGVsc2UgewotCQkJCUZpbGVVdGlsLmRlbGV0ZUFsbEZpbGVzKGRlc0xpYkZvbGRlci5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0JCQl9Ci0JCQkKLQkJCVBsdWdpbkV4cG9ydFNlcnZpY2UuY29weURpcihnZXRMaWJGaWxlKCkuZ2V0UGFyZW50RmlsZSgpLCBkZXNMaWJGb2xkZXIpOwotCQkJc2V0Q29waWVkTGliRmlsZShuZXcgRmlsZShkZXNMaWJGb2xkZXJQYXRoICsgZ2V0TGliRmlsZSgpLmdldE5hbWUoKSkpOwotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCByZW1vdmVDb3BpZWRMaWJyYXJ5KCkgewotCQkJaWYgKGdldENvcGllZExpYkZpbGUoKSA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJRmlsZVV0aWwuZGVsZXRlQWxsRmlsZXMoZ2V0Q29waWVkTGliRmlsZSgpLmdldFBhcmVudEZpbGUoKS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0JCQlnZXRDb3BpZWRMaWJGaWxlKCkuZ2V0UGFyZW50RmlsZSgpLmRlbGV0ZSgpOwotCQkJc2V0Q29waWVkTGliRmlsZShudWxsKTsKLQkJfQotCX07CQotCQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcvc2VydmljZXMvRGlyQ29weS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy9zZXJ2aWNlcy9EaXJDb3B5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1MWM0ODcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy9zZXJ2aWNlcy9EaXJDb3B5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy5zZXJ2aWNlczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLm5ldC5VUkk7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLkZpbGVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5NdWx0aUZpbGVTYXZlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VydmljZXMuSUZpbGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy5TZXJ2aWNlczsKLQotCi0vKioKLSAqIHV0aWxpdHkgY2xhc3MgdG8gY29weSBmaWxlcyBmcm9tIG9uZSBkaXIgdG8gYW5vdGhlciwgYW5kIGRlbGV0ZSB0aGUgdW4tbmVlZGVkIGZpbGVzIGZyb20gc291cmNlIGRpci4KLSAqCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRGlyQ29weSB7Ci0KLQkvL3ByaXZhdGUgSVN0YXR1cyBmaWxlQ2hlY2tlZE91dFN0YXR1cyA9IG51bGw7Ci0JCi0JRmlsZSBzcmNEaXI7Ci0JRmlsZSB0YXJnZXREaXI7Ci0JCi0JLy8gbmV3IGZpbGVzIHRvIGJlIGFkZGVkIHRvIHRoZSB0YXJnZXQKLQlMaXN0IG5ld0ZpbGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQotCS8vIGZpbGVzIGV4aXN0cyBpbiBib3RoIHNyYyBhbmQgdGFyZ2V0IGRpcgotCUxpc3Qgb2xkRmlsZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCi0JLy8gZmlsZXMgb25seSBpbiB0YXJnZXQgZGlyLCB0aGVzZSBmaWxlcyBhcmUgdHJlYXRlZCBhcyBkZWxldGVkIGluIHRoZSBzcmMgZm9sZGVyLgotCUxpc3QgZGVsZXRlZEZpbGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIERpckNvcHkoRmlsZSBzcmNEaXIsIEZpbGUgdGFyZ2V0RGlyKSB7Ci0JCXRoaXMuc3JjRGlyID0gc3JjRGlyOwotCQl0aGlzLnRhcmdldERpciA9IHRhcmdldERpcjsKLQkJCi0JCXByZXBhcmUoKTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIENQX0ZPRExFUiA9IE11bHRpRmlsZVNhdmVVdGlsLkNBUEFCSUxJVFlfUEFUVEVSTl9QQVRIICsgIi8iOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIERQX0ZPRExFUiA9IE11bHRpRmlsZVNhdmVVdGlsLkRFTElWRVJZX1BST0NFU1NfUEFUSCArICIvIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIGNoZWNrIG91dCB0aGUgZXhpc3RpbmcgZmlsZXMsIGRlbGV0ZSB0aGUgZmlsZXMgZnJvbSBjbSwgYW5kIGFkZCBuZXcgZmlsZXMsIGNvcHkgdGhlIGZpbGVzIG92ZXIKLQkgKgotCSAqLwotCXB1YmxpYyBJU3RhdHVzIGV4ZWN1dGUoKSB7Ci0JCQkKLQkJLy8gY2hlY2sgb3V0IGZpbGVzCi0JCUxpc3QgZmlsZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoIEl0ZXJhdG9yIGl0ID0gb2xkRmlsZXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOyApIHsKLQkJCVN0cmluZyBwYXRoID0gKFN0cmluZylpdC5uZXh0KCk7CQkJCQkJCi0JCQlpZiAobmVlZENvcHkobmV3IEZpbGUoc3JjRGlyLCBwYXRoKSwgbmV3IEZpbGUodGFyZ2V0RGlyLCBwYXRoKSkpIHsJLy8xNTQzMjEKLQkJCQlmaWxlcy5hZGQobmV3IEZpbGUodGFyZ2V0RGlyLCBwYXRoKS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0JCQl9Ci0JCX0KLQkJCi0JCUlTdGF0dXMgZmlsZUNoZWNrZWRPdXRTdGF0dXMgPSBGaWxlTW9kaWZ5Q2hlY2tlci5jaGVja01vZGlmeShmaWxlcyk7Ci0JCQotCQlpZiAoICFmaWxlQ2hlY2tlZE91dFN0YXR1cy5pc09LKCkgKSB7Ci0JCQlyZXR1cm4gZmlsZUNoZWNrZWRPdXRTdGF0dXM7Ci0JCX0KLQkJCQotCQkvLyBkZWxldGUgZmlsZXMKLQkJSUZpbGVNYW5hZ2VyIGZpbGVNZ3IgPSBTZXJ2aWNlcy5nZXRGaWxlTWFuYWdlcigpOwotCQlmb3IgKCBJdGVyYXRvciBpdCA9IGRlbGV0ZWRGaWxlcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7ICkgewotCQkJU3RyaW5nIHBhdGggPSAoU3RyaW5nKWl0Lm5leHQoKTsKLQkJCUZpbGUgZiA9IG5ldyBGaWxlKHRhcmdldERpciwgcGF0aCk7Ci0JCQlmaWxlTWdyLmRlbGV0ZShmLmdldEFic29sdXRlUGF0aCgpKTsKLQkJCQotCQkJLy8gZGVsZXRlIHRoZSBlbXB0eSBDUCBhbmQgRFAgZm9sZGVyCi0JCQlwYXRoID0gcGF0aC5yZXBsYWNlKEZpbGUuc2VwYXJhdG9yQ2hhciwgJy8nKTsgCi0JCQlpZiAoIHBhdGguc3RhcnRzV2l0aChDUF9GT0RMRVIpIHx8IHBhdGguc3RhcnRzV2l0aChEUF9GT0RMRVIpICkgewotCQkJCUZpbGUgZm9sZGVyID0gZi5nZXRQYXJlbnRGaWxlKCk7Ci0JCQkJU3RyaW5nW10gaXRlbXMgPSBmb2xkZXIubGlzdCgpOwotCQkJCWlmICggaXRlbXMgPT0gbnVsbCB8fCBpdGVtcy5sZW5ndGggPT0gMCApIHsKLQkJCQkJZmlsZU1nci5kZWxldGUoZm9sZGVyLmdldEFic29sdXRlUGF0aCgpKTsJCQkJCi0JCQkJfQotCQkJfQotCQl9CQotCQkKLQkJLy8gY29weSBvbGQgZmlsZXMKLQkJZm9yICggSXRlcmF0b3IgaXQgPSBvbGRGaWxlcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7ICkgewotCQkJU3RyaW5nIHBhdGggPSAoU3RyaW5nKWl0Lm5leHQoKTsKLQkJCUZpbGVVdGlsLmNvcHlGaWxlKG5ldyBGaWxlKHNyY0RpciwgcGF0aCksIG5ldyBGaWxlKHRhcmdldERpciwgcGF0aCkpOwotCQl9Ci0JCQotCQkvLyBjb3B5IG5ldyBmaWxlcwotCQlmb3IgKCBJdGVyYXRvciBpdCA9IG5ld0ZpbGVzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTsgKSB7Ci0JCQlTdHJpbmcgcGF0aCA9IChTdHJpbmcpaXQubmV4dCgpOwotCQkJRmlsZVV0aWwuY29weUZpbGUobmV3IEZpbGUoc3JjRGlyLCBwYXRoKSwgbmV3IEZpbGUodGFyZ2V0RGlyLCBwYXRoKSk7Ci0JCX0KLQkJCi0JCXJldHVybiBmaWxlQ2hlY2tlZE91dFN0YXR1czsKLQl9Ci0JCi0JCi0JcHJpdmF0ZSB2b2lkIHByZXBhcmUoKSB7Ci0JCUxpc3QgYWxsU3JjRmlsZXMgPSBnZXRBbGxGaWxlcyhzcmNEaXIpOwotCQlMaXN0IGFsbFRhcmdldEZpbGVzID0gZ2V0QWxsRmlsZXModGFyZ2V0RGlyKTsKLQotCQl3aGlsZSAoIGFsbFRhcmdldEZpbGVzLnNpemUoKSA+IDAgKSB7Ci0JCQlTdHJpbmcgcGF0aCA9IChTdHJpbmcpYWxsVGFyZ2V0RmlsZXMucmVtb3ZlKDApOwotCQkJaWYgKCBhbGxTcmNGaWxlcy5jb250YWlucyhwYXRoKSApIHsKLQkJCQlvbGRGaWxlcy5hZGQocGF0aCk7Ci0JCQkJYWxsU3JjRmlsZXMucmVtb3ZlKHBhdGgpOwotCQkJfSBlbHNlIHsKLQkJCQlkZWxldGVkRmlsZXMuYWRkKHBhdGgpOwotCQkJfQotCQl9Ci0JCQotCQkvLyB0aGUgcmVtYWluaW5nIGZpbGVzIGluIHRoZSB0YXJnZXQgbGlzdCBpcyB0aGUgbmV3IGZpbGVzCi0JCW5ld0ZpbGVzLmFkZEFsbChhbGxTcmNGaWxlcyk7Ci0JfQotCQotCS8qKgotCSAqIGdldCBhbGwgdGhlIGZpbGVzIHdpdGggcmVsYXRpdmUgcGF0aCB0byB0aGUgcm9vdAotCSAqIEBwYXJhbSBkaXIgdGhlIHJvb3QgZGlyCi0JICogQHJldHVybiBMaXN0IGFsbCBmaWxlcyBpbiB0aGUgZGlyLCB3aXRoIHJlbGF0aXZlIHBhdGggdG8gdGhlIHJvb3QKLQkgKi8KLQlwcml2YXRlIExpc3QgZ2V0QWxsRmlsZXMoRmlsZSBkaXIpIHsKLQkJTGlzdCBmaWxlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJRmlsZVV0aWwuZ2V0QWxsRmlsZXMoZGlyLCBmaWxlcywgdHJ1ZSk7Ci0KLQkJLy8gY29udmVydCB0byBsaXN0IG9mIHBhdGgsIG5vdCBGaWxlCi0JCVVSSSBiYXNlVXJsID0gZGlyLnRvVVJJKCk7Ci0JCQotCQlpbnQgaSA9IDA7Ci0JCXdoaWxlICggaSA8IGZpbGVzLnNpemUoKSApIHsKLQkJCUZpbGUgZiA9IChGaWxlKWZpbGVzLmdldChpKTsKLQkJCWlmICggY2FuSWdub3JlKGYuZ2V0QWJzb2x1dGVQYXRoKCkpIHx8IGNhbklnbm9yZShmKSkgewotCQkJCWZpbGVzLnJlbW92ZShpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJVVJJIHJlbCA9IGJhc2VVcmwucmVsYXRpdml6ZShmLnRvVVJJKCkpOwotCQkJCWZpbGVzLnNldChpLCByZWwuZ2V0UGF0aCgpKTsJCi0JCQkJaSsrOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGZpbGVzOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1ZTX0ZPTERFUiA9IEZpbGUuc2VwYXJhdG9yICsgIkNWUyIgKyBGaWxlLnNlcGFyYXRvcjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTVk5fRk9MREVSID0gRmlsZS5zZXBhcmF0b3IgKyAiLnN2biIgKyBGaWxlLnNlcGFyYXRvcjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBib29sZWFuIGNhbklnbm9yZShTdHJpbmcgcGF0aCkgewotCQlpZiAoIHBhdGguaW5kZXhPZihDVlNfRk9MREVSKSA+PTAgKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlpZiAoIHBhdGguaW5kZXhPZihTVk5fRk9MREVSKSA+PTAgKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQkKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBpZ25vcmVGaWxlcyA9IHsKLQkJCQkJCQkJCSIuY29weWFyZWEuZGF0IiwgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJIi5jb3B5YXJlYS5kYiIgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJfTsJCQkKLQlwcml2YXRlIGJvb2xlYW4gY2FuSWdub3JlKEZpbGUgZmlsZSkgewotCQlTdHJpbmcgbmFtZSA9IGZpbGUuZ2V0TmFtZSgpOwotCQlmb3IgKGludCBpPTA7IGk8aWdub3JlRmlsZXMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChuYW1lLmVxdWFscyhpZ25vcmVGaWxlc1tpXSkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCS8qKgotCSAqIENoZWNrcyB0byBzZWUgaWYgdGhlIGNvcHkgYWN0aW9uIGlzIG5lZWRlZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gbmVlZENvcHkoRmlsZSBzb3VyY2UsIEZpbGUgZGVzdCkgewotCQlib29sZWFuIHJldCA9IHRydWU7Ci0JCWlmIChkZXN0LmV4aXN0cygpKSB7Ci0JCQlyZXQgPSAoZGVzdC5sYXN0TW9kaWZpZWQoKSAhPSBzb3VyY2UubGFzdE1vZGlmaWVkKCkpCi0JCQkJCXx8IChkZXN0Lmxlbmd0aCgpICE9IHNvdXJjZS5sZW5ndGgoKSk7Ci0JCX0KLQkJcmV0dXJuIHJldDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy9zZXJ2aWNlcy9FbGVtZW50RGlmZlRyZWUuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcvc2VydmljZXMvRWxlbWVudERpZmZUcmVlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxYjgxOTAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy9zZXJ2aWNlcy9FbGVtZW50RGlmZlRyZWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLnNlcnZpY2VzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci0KLQotLyoqCi0gKiBEaXNwbGF5cyB0aGUgZWxlbWVudCBkaWZmZXJlbmNlcyBpbiBhIHRyZWUuCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBFbGVtZW50RGlmZlRyZWUgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRElGRl9TVEFURV9TQU1FID0gMDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERJRkZfU1RBVEVfTkVXID0gMTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERJRkZfU1RBVEVfQ0hBTkdFRCA9IDQ7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBESUZGX1NUQVRFX09MRF9PTkxZID0gNTsKLQotCXByaXZhdGUgTWV0aG9kRWxlbWVudCBlMTsKLQotCXByaXZhdGUgTWV0aG9kRWxlbWVudCBlMjsKLQotCS8vIFRoZSBwYXJlbnQgaW4gdGhlIGJhc2UgbGlicmFyeSBpZiBlMiBpcyBhIG5ldyBlbGVtZW50LgotCXByaXZhdGUgTWV0aG9kRWxlbWVudCBlMV9wYXJlbnQ7Ci0KLQlwcml2YXRlIEVsZW1lbnREaWZmVHJlZSBwYXJlbnQgPSBudWxsOwotCi0JLy8gRGVmaW5lIHRoZSBkaWZmIHN0YXRlIG9mIHRoZSBzZWNvbmQgZWxlbWVudCBjb21wYXJlZCB0byB0aGUgZmlyc3Qgb25lLgotCXByaXZhdGUgaW50IGRpZmZTdGF0ZSA9IERJRkZfU1RBVEVfU0FNRTsKLQotCXByaXZhdGUgTGlzdCBjaGlsZHJlbiA9IG5ldyBBcnJheUxpc3QoKTsKLQotCXByaXZhdGUgYm9vbGVhbiBoYXNEaXJ0eUNoaWxkID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBFbGVtZW50RGlmZlRyZWUoTWV0aG9kRWxlbWVudCBlMSwgTWV0aG9kRWxlbWVudCBlMikgewotCQl0aGlzKGUxLCBlMiwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgRWxlbWVudERpZmZUcmVlKE1ldGhvZEVsZW1lbnQgZTEsIE1ldGhvZEVsZW1lbnQgZTIsCi0JCQlNZXRob2RFbGVtZW50IGUxX3BhcmVudCkgewotCQl0aGlzLmUxX3BhcmVudCA9IGUxX3BhcmVudDsKLQkJdGhpcy5lMSA9IGUxOwotCQl0aGlzLmUyID0gZTI7Ci0KLQkJcmVzb2x2ZURpZmZTdGF0ZSgpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBiYXNlIG1ldGhvZCBlbGVtZW50LgotCSAqLwotCXB1YmxpYyBNZXRob2RFbGVtZW50IGdldEJhc2VFbGVtZW50KCkgewotCQlyZXR1cm4gZTE7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgYmFzZSBtZXRob2QgZWxlbWVudCdzIHBhcmVudC4KLQkgKi8KLQlwdWJsaWMgTWV0aG9kRWxlbWVudCBnZXRCYXNlUGFyZW50RWxlbWVudCgpIHsKLQkJcmV0dXJuIGUxX3BhcmVudDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBpbXBvcnQgbWV0aG9kIGVsZW1lbnQuCi0JICovCi0JcHVibGljIE1ldGhvZEVsZW1lbnQgZ2V0SW1wb3J0RWxlbWVudCgpIHsKLQkJcmV0dXJuIGUyOwotCX0KLQotCS8qKgotCSAqIENoZWNrcyB3aGV0aGVyIHRoZSBlbGVtZW50IGlzIG5ldyB0byB0aGUgbGlicmFyeS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc05ldygpIHsKLQkJcmV0dXJuIChlMSA9PSBudWxsKSAmJiAoZTIgIT0gbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogQ2hlY2tzIHdoZXRoZXIgdGhlIGVsZW1lbnQgZXhpc3RzIG9ubHkgaW4gdGhlIGxpYnJhcnkgYW5kIG5vdCBpbiB0aGUKLQkgKiBjb25maWd1cmF0aW9uIHRvIGJlIGltcG9ydGVkLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzT2xkT25seSgpIHsKLQkJcmV0dXJuIChlMSAhPSBudWxsKSAmJiAoZTIgPT0gbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIGJvdGggYmFzZSBhbmQgaW1wb3J0IGVsZW1lbnRzIGFyZSBub3QgbnVsbCwgCi0JICogb3RoZXJ3aXNlIHJldHVybnMgZmFsc2UuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNCb3RoKCkgewotCQlyZXR1cm4gKGUxICE9IG51bGwpICYmIChlMiAhPSBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIGEgY2hpbGQgbm9kZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRDaGlsZChFbGVtZW50RGlmZlRyZWUgY2hpbGQpIHsKLQkJY2hpbGRyZW4uYWRkKGNoaWxkKTsKLQkJY2hpbGQuc2V0UGFyZW50KHRoaXMpOwotCX0KLQotCS8qKgotCSAqIGhhc0RpcnR5Q2hpbGQgYXR0cmlidXRlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc0RpcnR5Q2hpbGQoKSB7Ci0JCXJldHVybiB0aGlzLmhhc0RpcnR5Q2hpbGQ7Ci0JfQotCi0JLyoqCi0JICogU2V0cyBoYXNEaXJ0eUNoaWxkIGF0dHJpYnV0ZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREaXJ0eUNoaWxkKGJvb2xlYW4gZmxhZykgewotCQloYXNEaXJ0eUNoaWxkID0gaGFzRGlydHlDaGlsZCB8fCBmbGFnOwotCQlpZiAoaGFzRGlydHlDaGlsZCAmJiBwYXJlbnQgIT0gbnVsbCkgewotCQkJcGFyZW50LnNldERpcnR5Q2hpbGQoaGFzRGlydHlDaGlsZCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0UGFyZW50KEVsZW1lbnREaWZmVHJlZSBwYXJlbnQpIHsKLQkJdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0JCWlmIChkaWZmU3RhdGUgIT0gRElGRl9TVEFURV9TQU1FICYmIHBhcmVudCAhPSBudWxsKSB7Ci0JCQlwYXJlbnQuc2V0RGlydHlDaGlsZCh0cnVlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHBhcmVudC4KLQkgKi8KLQlwdWJsaWMgRWxlbWVudERpZmZUcmVlIGdldFBhcmVudCgpIHsKLQkJcmV0dXJuIHRoaXMucGFyZW50OwotCX0KLQotCS8qKgotCSAqIGhhc0NoaWxkcmVuIGF0dHJpYnV0ZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbigpIHsKLQkJcmV0dXJuIChjaGlsZHJlbiAhPSBudWxsKSAmJiAoY2hpbGRyZW4uc2l6ZSgpID4gMCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY2hpbGQgbGlzdC4KLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRDaGlsZHJlbigpIHsKLQkJcmV0dXJuIGNoaWxkcmVuOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGRpZmYgc3RhdGUgb2YgdGhlIHNlY29uZCBlbGVtZW50IGNvbXBhcmluZyB0byB0aGUgZmlyc3Qgb25lLgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0RGlmZlN0YXRlKCkgewotCQlyZXR1cm4gZGlmZlN0YXRlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSBtZXNzYWdlIHN0cmluZy4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERpZmZNZXNzYWdlKCkgewotCQlyZXR1cm4gIlsiICsgZ2V0VmVyc2lvbihlMSkgKyAiXSA6IFsiICsgZ2V0VmVyc2lvbihlMikgKyAiXSI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JfQotCi0JcHJpdmF0ZSB2b2lkIHJlc29sdmVEaWZmU3RhdGUoKSB7Ci0JCS8vIGhvdyB0byBmaWRkIHR3byBlbGVtZW50cz8KLQkJLy8gMS4gYXR0cmlidXRlcwotCQkvLyAyLiB2ZXJzaW9uIG51bWJlcgotCQkvLyAzLiBjaGlsZHJlbgotCQkvLyA0LiByZWZlcmVuY2VzCi0JCS8vIDUuIC4uLgotCQlpZiAoZTEgPT0gbnVsbCkgewotCQkJZGlmZlN0YXRlID0gRElGRl9TVEFURV9ORVc7Ci0JCX0gZWxzZSBpZiAoZTIgPT0gbnVsbCkgewotCQkJZGlmZlN0YXRlID0gRElGRl9TVEFURV9PTERfT05MWTsKLQkJfSBlbHNlIHsKLQkJCWlmIChlMSBpbnN0YW5jZW9mIE1ldGhvZExpYnJhcnkpIHsKLQkJCQlkaWZmU3RhdGUgPSBESUZGX1NUQVRFX1NBTUU7Ci0JCQl9IGVsc2UgewotCQkJCWRpZmZTdGF0ZSA9IERJRkZfU1RBVEVfQ0hBTkdFRDsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldFZlcnNpb24oTWV0aG9kRWxlbWVudCBlbGVtZW50KSB7Ci0JCWlmIChlbGVtZW50ID09IG51bGwpIHsKLQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJcmV0dXJuIGdldFBhY2thZ2UoZWxlbWVudCkuZ2V0VmVyc2lvbigpOwotCX0KLQotCXByaXZhdGUgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RVbml0IGdldFBhY2thZ2UoTWV0aG9kRWxlbWVudCBlbGVtZW50KSB7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RVbml0KSB7Ci0JCQlyZXR1cm4gKG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kVW5pdCkgZWxlbWVudDsKLQkJfQotCi0JCXJldHVybiBnZXRQYWNrYWdlKChNZXRob2RFbGVtZW50KSBlbGVtZW50LmVDb250YWluZXIoKSk7Ci0JfQotCi0JLy8gVXRpbGl0eSBtZXRob2QgdG8gZ2V0IHRoZSBlbGVtZW50IGluZm9ybWF0aW9uLgotCS8qKgotCSAqIFJldHVybnMgdGhlIG5hbWUuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlpZiAoZTEgIT0gbnVsbCkgewotCQkJcmV0dXJuIGUxLmdldE5hbWUoKTsKLQkJfQotCQlpZiAoZTIgIT0gbnVsbCkgewotCQkJcmV0dXJuIGUyLmdldE5hbWUoKTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY29udGVudCB0eXBlLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q29udGVudFR5cGUoKSB7Ci0JCU1ldGhvZEVsZW1lbnQgZSA9IGUxOwotCQlpZiAoZSA9PSBudWxsKSB7Ci0JCQllID0gZTI7Ci0JCX0KLQotCQlpZiAoZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gZS5nZXRUeXBlKCkuZ2V0TmFtZSgpOwotCQl9Ci0KLQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JfQotCQotCXB1YmxpYyB2b2lkIGRlYnVnRHVtcCgpIHsKLQkJZGVidWdEdW1wKDAsICIiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQlwcml2YXRlIHZvaWQgZGVidWdEdW1wKGludCBsZXZlbCwgU3RyaW5nIGluZGVudCkgewotCQlTdHJpbmcgbGluZSA9IG51bGw7Ci0JCWlmIChlMSA9PSBudWxsKSB7Ci0JCQlsaW5lID0gIm51bGwiOyAvLyROT04tTkxTLTEkCi0JCX0gZWxzZSB7Ci0JCQlsaW5lID0gZTEuZ2V0R3VpZCgpICsgIiwgIiArIGUxLmdldE5hbWUoKSArICIsICIgKyBlMS5lQ2xhc3MoKS5nZXROYW1lKCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JCW91dExuKGxldmVsLCBpbmRlbnQsIGxpbmUpOwotCQkKLQkJaWYgKGUyID09IG51bGwpIHsKLQkJCWxpbmUgPSAibnVsbCI7IC8vJE5PTi1OTFMtMSQKLQkJfSBlbHNlIHsKLQkJCWxpbmUgPSBlMi5nZXRHdWlkKCkgKyAiLCAiICsgZTIuZ2V0TmFtZSgpICsgIiwgIiArIGUyLmVDbGFzcygpLmdldE5hbWUoKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQkJb3V0TG4obGV2ZWwsIGluZGVudCwgbGluZSk7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiIik7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCWZvciAoaW50IGk9MDsgaSA8IGNoaWxkcmVuLnNpemUoKTsgaSsrKSB7Ci0JCQlFbGVtZW50RGlmZlRyZWUgY2hpbGQgPSAoRWxlbWVudERpZmZUcmVlKSBjaGlsZHJlbi5nZXQoaSk7Ci0JCQljaGlsZC5kZWJ1Z0R1bXAobGV2ZWwgKyAxLCBpbmRlbnQgKyAiICAgIik7IC8vJE5PTi1OTFMtMSQKLQkJfQkJCi0JfQotCQotCXByaXZhdGUgdm9pZCBvdXRMbihpbnQgbGV2ZWwsIFN0cmluZyBpbmRlbnQsIFN0cmluZyBsaW5lKSB7Ci0JCVN0cmluZyBzdHIgPSBpbmRlbnQgKyBsZXZlbCArICI6ICIgKyBsaW5lOyAvLyROT04tTkxTLTEkCi0JCVN5c3RlbS5vdXQucHJpbnRsbihzdHIpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy9zZXJ2aWNlcy9GaWxlTW9kaWZ5Q2hlY2tlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy9zZXJ2aWNlcy9GaWxlTW9kaWZ5Q2hlY2tlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OTk4MjhhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcvc2VydmljZXMvRmlsZU1vZGlmeUNoZWNrZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLnNlcnZpY2VzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udWkudXRpbC5Nc2dCb3g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS51dGlsLk1zZ0RpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLkltcG9ydFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLkltcG9ydFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5zZXJ2aWNlcy5TYWZlVXBkYXRlQ29udHJvbGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VydmljZXMuSUZpbGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy5TZXJ2aWNlczsKLQotCi0vKioKLSAqIHV0aWxpdHkgY2xhc3MgdG8gY2hlY2sgZmlsZXMgZm9yIG1vZGlmaWNhdGlvbnMKLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBGaWxlTW9kaWZ5Q2hlY2tlciB7Ci0KLQkvKioKLQkgKiBDaGVja3MgbW9kaWZpY2F0aW9uIHN0YXR1cyBvZiB0aGUgZ2l2ZW4gbGlzdCBvZiBmaWxlcy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElTdGF0dXMgY2hlY2tNb2RpZnkoTGlzdCBtb2RpZmllZEZpbGVzKSB7Ci0JCQotCQl0cnkgewotCQkJU3RyaW5nW10gcGF0aHMgPSBuZXcgU3RyaW5nW21vZGlmaWVkRmlsZXMuc2l6ZSgpXTsKLQkJCW1vZGlmaWVkRmlsZXMudG9BcnJheShwYXRocyk7Ci0JCQkKLQkJCUlGaWxlTWFuYWdlciBmaWxlTWdyID0gU2VydmljZXMuZ2V0RmlsZU1hbmFnZXIoKTsKLQkJCUlTdGF0dXMgc3RhdHVzID0gZmlsZU1nci5jaGVja01vZGlmeShwYXRocywgTXNnQm94LmdldERlZmF1bHRTaGVsbCgpKTsKLQotCQkJLy8gbWFrZSBzdXJlIGFsbCB0aGUgZmlsZXMgYXJlIHVwZGF0YWJsZQkJCQotCQkJTGlzdCByZWFkb25seUZpbGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXRocy5sZW5ndGg7IGkrKyApIHsKLQkJCQlGaWxlIGYgPSBuZXcgRmlsZShwYXRoc1tpXSk7Ci0JCQkJaWYgKCBmLmV4aXN0cygpICYmICFmLmNhbldyaXRlKCkgKSB7Ci0JCQkJCXJlYWRvbmx5RmlsZXMuYWRkKHBhdGhzW2ldKTsKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCWlmICggcmVhZG9ubHlGaWxlcy5zaXplKCkgPiAwICkgewotCQkJCVN0cmluZyB0aXRsZSA9IEltcG9ydFJlc291cmNlcy5GaWxlTW9kaWZ5Q2hlY2tlcl9DaGVja291dF9mYWlsZWRfdGl0bGU7IAotCQkJCVN0cmluZyBtc2cgPSBJbXBvcnRSZXNvdXJjZXMuRmlsZU1vZGlmeUNoZWNrZXJfQ2hlY2tvdXRfZmFpbGVkX21zZzsgCi0JCQkJaWYgKCBuZXcgTXNnRGlhbG9nKEltcG9ydFBsdWdpbi5nZXREZWZhdWx0KCkpLmRpc3BsYXlQcm9tcHQodGl0bGUsIG1zZykgKSB7Ci0JCQkJCXJldHVybiBjaGVja01vZGlmeShyZWFkb25seUZpbGVzKTsKLQkJCQl9Ci0JCQl9CQkKLQkJCXJldHVybiBzdGF0dXM7Ci0JCQkKLQkJfSBjYXRjaCAoVGhyb3dhYmxlIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBJbXBvcnRQbHVnaW4uZ2V0RGVmYXVsdCgpCi0JCQkJCS5nZXRJZCgpLCAwLCBlLmdldE1lc3NhZ2UoKSA9PSBudWxsID8gIiIgOiBlLmdldE1lc3NhZ2UoKSwgbnVsbCk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBDaGVja3MgbW9kaWZpY2F0aW9uIHN0YXR1cyBvZiB0aGUgZ2l2ZW4gbGlzdCBvZiBmaWxlcy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElTdGF0dXMgc3luY0V4ZWNDaGVja01vZGlmeShmaW5hbCBMaXN0IG1vZGlmaWVkRmlsZXMpIHsKLQkJZmluYWwgSVN0YXR1c1tdIHJldCA9IG5ldyBJU3RhdHVzWzFdOwotCQlTYWZlVXBkYXRlQ29udHJvbGxlci5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJcmV0WzBdID0gRmlsZU1vZGlmeUNoZWNrZXIuY2hlY2tNb2RpZnkobW9kaWZpZWRGaWxlcyk7Ci0JCQl9Ci0JCX0pOwotCQlyZXR1cm4gcmV0WzBdOwotCX0KLQkKLQkvKioKLQkgKiBSZXRydW5zIHRoZSBtb2RpZmllZCBmaWxlIGxpc3Qgb2YgdGhlIGdpdmVuIHJlc291cmNlIHNldC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3QgZ2V0TW9kaWZpZWRGaWxlcyhSZXNvdXJjZVNldCByZXNvdXJjZVNldCkgewotCQlMaXN0IHJldCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChJdGVyYXRvciBpdCA9IHJlc291cmNlU2V0LmdldFJlc291cmNlcygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCVJlc291cmNlIHJlcyA9IChSZXNvdXJjZSkgaXQubmV4dCgpOwotCQkJaWYgKHJlcyAhPSBudWxsICYmIHJlcy5pc01vZGlmaWVkKCkpIHsKLQkJCQlyZXQuYWRkKHJlcy5nZXRVUkkoKS50b0ZpbGVTdHJpbmcoKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJldDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy9zZXJ2aWNlcy9MaWJyYXJ5RGlmZk1hbmFnZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcvc2VydmljZXMvTGlicmFyeURpZmZNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxZDE0YWUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy9zZXJ2aWNlcy9MaWJyYXJ5RGlmZk1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLnNlcnZpY2VzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLkltcG9ydFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpbWVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudFByb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qb2ludDsKLQotCi0vKioKLSAqIE1hbmFnZXMgdGhlIGRpZmZlcmVuY2VzIGJldHdlZW4gbWV0aG9kIGVsZW1lbnRzIGluIHRoZSBjdXJyZW50IGxpYnJhcnkgYW5kCi0gKiB0aG9zZSB0aGF0IHdpbGwgYmUgaW1wb3J0ZWQuCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBMaWJyYXJ5RGlmZk1hbmFnZXIgewotCi0JcHJpdmF0ZSBNZXRob2RMaWJyYXJ5IGJhc2VMaWJyYXJ5OwotCi0JcHJpdmF0ZSBNZXRob2RMaWJyYXJ5IGltcG9ydExpYnJhdHk7Ci0KLQkvLyBNYXAgb2YgdWlkIHRvIEVsZW1lbnREaWZmVHJlZSwgdGhlIHJvb3Qgb2YgdGhlIEVsZW1lbnREaWZmVHJlZSBpcyB0aGUKLQkvLyBsaWJyYXJ5LgotCXByaXZhdGUgTWFwIGRpZmZFbGVtZW50TWFwID0gbmV3IEhhc2hNYXAoKTsKLQotCS8vIE1hcCBvZiB1aWQgdG8gZWxlbWVudCBmb3IgaW1wb3J0IGxpYnJhcnkgY29uZmlndXJhdGlvbi4KLQlwcml2YXRlIE1hcCBpbXBvcnRFbGVtZW50TWFwID0gbmV3IEhhc2hNYXAoKTsKLQotCS8vIGlkIHRvIGVsZW1lbnQgbWFwIG9mIHRoZSBjdXJyZW50IGxpYnJhcnkuCi0JcHJpdmF0ZSBNYXAgY3VycmVudEVsZW1lbnRNYXAgPSBuZXcgSGFzaE1hcCgpOwotCi0JLy8gVGhlIGRpZmYgdHJlZS4KLQlFbGVtZW50RGlmZlRyZWUgcm9vdERpZmZUcmVlID0gbnVsbDsKLQotCXByaXZhdGUgYm9vbGVhbiBkZWJ1ZyA9IEltcG9ydFBsdWdpbi5nZXREZWZhdWx0KCkuaXNEZWJ1Z2dpbmcoKTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIExpYnJhcnlEaWZmTWFuYWdlcihNZXRob2RMaWJyYXJ5IGJhc2VMaWJyYXJ5LAotCQkJTWV0aG9kTGlicmFyeSBpbXBvcnRMaWJyYXR5KSB7Ci0JCXRoaXMuYmFzZUxpYnJhcnkgPSBiYXNlTGlicmFyeTsKLQkJdGhpcy5pbXBvcnRMaWJyYXR5ID0gaW1wb3J0TGlicmF0eTsKLQotCQlyb290RGlmZlRyZWUgPSBuZXcgRWxlbWVudERpZmZUcmVlKGJhc2VMaWJyYXJ5LCBpbXBvcnRMaWJyYXR5KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBpbXBvcnQgbGlicmFyeS4KLQkgKi8KLQlwdWJsaWMgTWV0aG9kTGlicmFyeSBnZXRJbXBvcnRpbmdMaWJyYXJ5KCkgewotCQlyZXR1cm4gdGhpcy5pbXBvcnRMaWJyYXR5OwotCX0KLQotCS8qKgotCSAqIEJ1aWxkcyB0aGUgZGlmZmVyZW5jZSB0cmVlLgotCSAqLwotCXB1YmxpYyBFbGVtZW50RGlmZlRyZWUgYnVpbGREaWZmVHJlZSgpIHsKLQkJLy8gQnVpbGQgdGhlIHVpZCB0byBlbGVtZW50IG1hcCBmb3IgdGhlIGltcG9ydCBsaWJyYXJ5LgotCQlidWlsZFVJRE1hcChpbXBvcnRMaWJyYXR5LmVDb250ZW50cygpLCBpbXBvcnRFbGVtZW50TWFwLCB0cnVlLCBmYWxzZSk7Ci0KLQkJYnVpbGRVSURNYXAoYmFzZUxpYnJhcnkuZUNvbnRlbnRzKCksIGN1cnJlbnRFbGVtZW50TWFwLCB0cnVlLCB0cnVlKTsKLQotCQkvLyBHZXQgYWxsIHRoZSBzeXN0ZW0gcGFja2FnZXMgaW4gZWFjaCBwbHVnLWluIHNvIHdlIGNhbiBmaWx0ZXIgb3V0Ci0JCS8vIHRob3NlIHBhY2thZ2VzIHdoZW4gY29tcGFyaW5nIHRoZSBsaWJyYXJpZXMuCi0KLQkJLy8gSXRlcmF0ZSB0aGUgZWxlbWVudCBpbiB0aGUgY3VycmVudCBsaWJyYXJ5LCBhbmQgYnVpbGQgYSBkaWZmIHRyZWUgYnkKLQkJLy8gY29tcGFyaW5nIHRvIHRoZSBpbXBvcnQgbGlicmFyeS4KLQkJTGlzdCBwbHVnaW5zID0gYmFzZUxpYnJhcnkuZ2V0TWV0aG9kUGx1Z2lucygpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gcGx1Z2lucy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gKE1ldGhvZFBsdWdpbikgaXQubmV4dCgpOwotCQkJTGlzdCBzeXN0ZW1QYWNrYWdlcyA9IFRuZ1V0aWwuZ2V0QWxsU3lzdGVtUGFja2FnZXMocGx1Z2luKTsKLQkJCQotCQkJLy8gY29udGVudCBjYXRlZ29yeSBwYWNrYWdlcyBzaG91bGQgYmUgaW5jbHVkZWQgaW50byB0aGUgZGlmZiB0cmVlIAotCQkJLy8gb3RoZXJ3aXNlIHRoZSBjYXRlZ29yeSBpbmZvcm1hdGlvbiB3aWxsIGJlIGxvc3QKLQkJCUxpc3QgY2F0ZWdvcnlMaXN0ID0gVG5nVXRpbC5nZXRDb250ZW50Q2F0ZWdvcnlQYWNrYWdlcyhwbHVnaW4pOwotCQkJZm9yICggSXRlcmF0b3IgaXRjID0gY2F0ZWdvcnlMaXN0Lml0ZXJhdG9yKCk7IGl0Yy5oYXNOZXh0KCk7ICkgewotCQkJCU9iamVjdCBvID0gaXRjLm5leHQoKTsKLQkJCQlpZiAoIHN5c3RlbVBhY2thZ2VzLmNvbnRhaW5zKG8pICkgewotCQkJCQlzeXN0ZW1QYWNrYWdlcy5yZW1vdmUobyk7Ci0JCQkJfQotCQkJfQotCQkJCi0JCQkvLyB0aGUgcm9vdCBjdXN0b21jYXRlZ290eSBwYWNrYWdlIG5lZWRzIHRvIGJlIGluY2x1ZGVkIGludG8gdGhlIGRpZmYgdHJlZQotCQkJaW50IGkgPSAwOwotCQkJd2hpbGUgKGkgPCBzeXN0ZW1QYWNrYWdlcy5zaXplKCkgKSB7Ci0JCQkJTWV0aG9kUGFja2FnZSBwa2cgPSAoTWV0aG9kUGFja2FnZSlzeXN0ZW1QYWNrYWdlcy5nZXQoaSk7Ci0JCQkJaWYgKCBUbmdVdGlsLmlzUm9vdEN1dG9tQ2F0ZWdvcnlQYWNrYWdlKHBrZykgKSB7Ci0JCQkJCXN5c3RlbVBhY2thZ2VzLnJlbW92ZShwa2cpOwotCQkJCQlicmVhazsKLQkJCQl9IGVsc2UgewotCQkJCQlpKys7Ci0JCQkJfQotCQkJfQotCQkJCi0JCQkvLyBCdWlsZCB0aGUgZGlmZiB0cmVlIGJ5IGl0ZXJhdGluZyB0aGUgY3VycmVudCBsaWJyYXJ5LgotCQkJaXRlcmF0ZUVsZW1lbnQocGx1Z2luLCByb290RGlmZlRyZWUsIHN5c3RlbVBhY2thZ2VzKTsKLQkJfQotCi0JCUxpc3QgY29uZmlncyA9IGJhc2VMaWJyYXJ5LmdldFByZWRlZmluZWRDb25maWd1cmF0aW9ucygpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gY29uZmlncy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IChNZXRob2RDb25maWd1cmF0aW9uKSBpdC5uZXh0KCk7Ci0KLQkJCS8vIEJ1aWxkIHRoZSBkaWZmIHRyZWUgYnkgaXRlcmF0aW5nIHRoZSBjdXJyZW50IGxpYnJhcnkuCi0JCQlpdGVyYXRlRWxlbWVudChjb25maWcsIHJvb3REaWZmVHJlZSwgbmV3IEFycmF5TGlzdCgpKTsKLQkJfQotCi0JCS8vIFByb2Nlc3MgdGhlIG5ldyBlbGVtZW50cyBpbiB0aGUgaW1wb3J0IGxpYnJhcnkgYW5kIGFkZCB0aGVtIHRvIHRoZQotCQkvLyBkaWZmIHRyZWUuCi0JCWhhbmRsZU5ld0VsZW1lbnRzKGltcG9ydExpYnJhdHkpOwotCi0JCXJldHVybiByb290RGlmZlRyZWU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZGlmZmVybmVjZSB0cmVlLgotCSAqLwotCXB1YmxpYyBFbGVtZW50RGlmZlRyZWUgZ2V0RGlmZlRyZWUoKSB7Ci0JCXJldHVybiByb290RGlmZlRyZWU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZGlmZmVybmVjZSBtYXAuCi0JICovCi0JcHVibGljIE1hcCBnZXREaWZmVHJlZU1hcCgpIHsKLQkJcmV0dXJuIGRpZmZFbGVtZW50TWFwOwotCX0KLQotCS8qKgotCSAqIEl0ZXJhdGVzIHRoZSBlbGVtZW50IGluIHRoZSBjdXJyZW50IGxpYnJhcnkgYW5kIGJ1aWxkIGEgZGlmZiB0cmVlIGJ5Ci0JICogY29tcGFyaW5nIHRvIHRoZSBpbXBvcnQgbGlicmFyeS4KLQkgKi8KLQlwcml2YXRlIHZvaWQgaXRlcmF0ZUVsZW1lbnQoTWV0aG9kRWxlbWVudCBlbGVtZW50LAotCQkJRWxlbWVudERpZmZUcmVlIGRpZmZUcmVlLCBMaXN0IHN5c3RlbVBhY2thZ2VzKSB7Ci0JCWlmICghc2VsZWN0YWJsZShlbGVtZW50KSkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJLy8gVXBkYXRlIHRoZSBkaWZmZWxlbWVudCBVSUQgbWFwLgotCQlpZiAoIXN5c3RlbVBhY2thZ2VzLmNvbnRhaW5zKGVsZW1lbnQpCi0JCQkJJiYgIShlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kTGlicmFyeSkpIHsKLQkJCVN0cmluZyB1aWQgPSBlbGVtZW50LmdldEd1aWQoKTsKLQkJCUVsZW1lbnREaWZmVHJlZSBkaWZmQ2hpbGQgPSBuZXcgRWxlbWVudERpZmZUcmVlKGVsZW1lbnQsCi0JCQkJCShNZXRob2RFbGVtZW50KSBpbXBvcnRFbGVtZW50TWFwLmdldCh1aWQpKTsKLQkJCWRpZmZFbGVtZW50TWFwLnB1dCh1aWQsIGRpZmZDaGlsZCk7Ci0JCQlkaWZmVHJlZS5hZGRDaGlsZChkaWZmQ2hpbGQpOwotCQkJZGlmZlRyZWUgPSBkaWZmQ2hpbGQ7Ci0JCX0KLQotCQkvLyBDaGVjayB3aXRoIHRoZSBpbXBvcnRpbmcgZWxlbWVudCBhbmQgY3JlYXRlIGFuIEVsZW1lbnREaWZmSW5mbyBvYmplY3QKLQkJRUxpc3QgY2hpbGRyZW4gPSBlbGVtZW50LmVDb250ZW50cygpOwotCQlpZiAoY2hpbGRyZW4gIT0gbnVsbCkgewotCQkJZm9yIChJdGVyYXRvciBpdCA9IGNoaWxkcmVuLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlPYmplY3QgZSA9IGl0Lm5leHQoKTsKLQkJCQlpZiAoZSBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCQkJTWV0aG9kRWxlbWVudCBjaGlsZCA9IChNZXRob2RFbGVtZW50KSBlOwotCQkJCQlpZiAoc2VsZWN0YWJsZShjaGlsZCkpIHsKLQkJCQkJCWl0ZXJhdGVFbGVtZW50KGNoaWxkLCBkaWZmVHJlZSwgc3lzdGVtUGFja2FnZXMpOwotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJaWYgKGRlYnVnICkgewotCQkJCQkJU3lzdGVtLm91dAotCQkJCQkJCQkucHJpbnRsbigiRXJyb3IhICIgKyBlICsgIiBpcyBub3QgYSBNZXRob2RFbGVtZW50IG9iamVjdCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIElmIHRoZXJlIGFyZSBuZXdseSBhZGRlZCBlbGVtZW50cyBpbiB0aGUgaW1wb3J0aW5nIGxpYnJhcnksIGFkZCB0aGUgbmV3Ci0JICogZWxlbWVudHMgaW50byB0aGUgcGFyZW50Ci0JICovCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZU5ld0VsZW1lbnRzKE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgewotCQlpZiAoIXNlbGVjdGFibGUoZWxlbWVudCkpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCWlmIChpc05ld0VsZW1lbnQoZWxlbWVudCkpIHsKLQkJCS8vIFRoaXMgaXMgYSBuZXcgZWxlbWVudCwgZmluZCB0aGUgcGFyZW50IGluIHRoZSBiYXNlIGxpYnJhcnkuCi0JCQlNZXRob2RFbGVtZW50IHBhcmVudCA9IChNZXRob2RFbGVtZW50KSBlbGVtZW50LmVDb250YWluZXIoKTsKLQkJCXdoaWxlIChpc05ld0VsZW1lbnQocGFyZW50KSkgewotCQkJCWVsZW1lbnQgPSBwYXJlbnQ7Ci0JCQkJcGFyZW50ID0gKE1ldGhvZEVsZW1lbnQpIHBhcmVudC5lQ29udGFpbmVyKCk7Ci0JCQl9Ci0KLQkJCS8vIEFsd2F5cyBtZXJnZSBsaWJyYXkgcGx1Z2lucyBldmVuIGl0J3MgZnJvbSBhIGRpZmZlcmVudCBsaWJyYXJ5LgotCQkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIE1ldGhvZExpYnJhcnkpIHsKLQkJCQlwYXJlbnQgPSBiYXNlTGlicmFyeTsKLQkJCX0KLQotCQkJLy8gTmVlZCB0byBmaW5kIHRoZSBwYXJlbnQgZWxlbWVudCBpbiB0aGUgY3VycmVudCBsaWJyYXJ5IHNvIHRoYXQgd2UKLQkJCS8vIGtub3cgd2hlcmUgdG8gYWRkIHRoZSBuZXcgZWxlbWVudC4KLQkJCU1ldGhvZEVsZW1lbnQgbGliX3BhcmVudCA9IChNZXRob2RFbGVtZW50KSBjdXJyZW50RWxlbWVudE1hcAotCQkJCQkuZ2V0KHBhcmVudC5nZXRHdWlkKCkpOwotCQkJaWYgKGxpYl9wYXJlbnQgPT0gbnVsbCkgewotCQkJCWxpYl9wYXJlbnQgPSBiYXNlTGlicmFyeTsKLQkJCX0KLQkJCUVsZW1lbnREaWZmVHJlZSBlbGVtZW50RGlmZlRyZWUgPSBuZXcgRWxlbWVudERpZmZUcmVlKG51bGwsCi0JCQkJCWVsZW1lbnQsIGxpYl9wYXJlbnQpOwotCi0JCQkvLyBGaW5kIHRoZSBwYXJlbnQgZGlmZiB0cmVlLgotCQkJRWxlbWVudERpZmZUcmVlIHBhcmVudERpZmZUcmVlID0gbnVsbDsKLQkJCXdoaWxlICgocGFyZW50RGlmZlRyZWUgPT0gbnVsbCkgJiYgKHBhcmVudCAhPSBudWxsKSkgewotCQkJCXBhcmVudERpZmZUcmVlID0gKEVsZW1lbnREaWZmVHJlZSkgZGlmZkVsZW1lbnRNYXAuZ2V0KHBhcmVudAotCQkJCQkJLmdldEd1aWQoKSk7Ci0JCQkJcGFyZW50ID0gKE1ldGhvZEVsZW1lbnQpIHBhcmVudC5lQ29udGFpbmVyKCk7Ci0JCQl9Ci0KLQkJCWlmIChwYXJlbnREaWZmVHJlZSA9PSBudWxsKSB7Ci0JCQkJcGFyZW50RGlmZlRyZWUgPSByb290RGlmZlRyZWU7Ci0JCQl9Ci0KLQkJCXBhcmVudERpZmZUcmVlLmFkZENoaWxkKGVsZW1lbnREaWZmVHJlZSk7Ci0JCX0gZWxzZSB7Ci0JCQkvLyBJdGVyYXRlIHRoZSBjaGlsZHJlbi4KLQkJCUxpc3QgY2hpbGRyZW4gPSBlbGVtZW50LmVDb250ZW50cygpOwotCQkJZm9yIChJdGVyYXRvciBpdGMgPSBjaGlsZHJlbi5pdGVyYXRvcigpOyBpdGMuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBvYmogPSBpdGMubmV4dCgpOwotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQkJCU1ldGhvZEVsZW1lbnQgZSA9IChNZXRob2RFbGVtZW50KSBvYmo7IAotCQkJCQloYW5kbGVOZXdFbGVtZW50cyhlKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJfQotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc05ld0VsZW1lbnQoTWV0aG9kRWxlbWVudCBlbGVtZW50KSB7Ci0JCWlmIChlbGVtZW50ID09IG51bGwgfHwgZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZExpYnJhcnkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gIWN1cnJlbnRFbGVtZW50TWFwLmNvbnRhaW5zS2V5KGVsZW1lbnQuZ2V0R3VpZCgpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYnVpbGRVSURNYXAoTGlzdCBlbGVtZW50cywgTWFwIGVsZW1lbnRVSURNYXAsIGJvb2xlYW4gcmVjdXJzaXZlLCBib29sZWFuIGZ1bGwpIHsKLQkJTWV0aG9kRWxlbWVudCBlbGVtZW50OwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gZWxlbWVudHMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGUgPSBpdC5uZXh0KCk7Ci0JCQlpZiAoZSBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCQllbGVtZW50ID0gKE1ldGhvZEVsZW1lbnQpIGU7Ci0JCQkJaWYgKHNlbGVjdGFibGUoZWxlbWVudCkgfHwgZnVsbCkgewotCQkJCQlTdHJpbmcgdWlkID0gZWxlbWVudC5nZXRHdWlkKCk7Ci0JCQkJCWVsZW1lbnRVSURNYXAucHV0KHVpZCwgZWxlbWVudCk7Ci0KLQkJCQkJaWYgKHJlY3Vyc2l2ZSkgewotCQkJCQkJYnVpbGRVSURNYXAoZWxlbWVudC5lQ29udGVudHMoKSwgZWxlbWVudFVJRE1hcCwKLQkJCQkJCQkJcmVjdXJzaXZlLCBmdWxsKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0gZWxzZSBpZiAoICEoZSBpbnN0YW5jZW9mIFBvaW50IHx8IGUgaW5zdGFuY2VvZiBEaW1lbnNpb24gfHwgZSBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnRQcm9wZXJ0eSkgKXsKLQkJCQlJbXBvcnRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKAotCQkJCQkJCSJJbXBvcnQgZXJyb3IuICIgKyBlICsgIiBpcyBub3QgYSBNZXRob2RFbGVtZW50IG9iamVjdCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCX0KLQkJfQotCi0JfQotCi0JLyoqCi0JICogQ2hlY2tzIGlmIHRoZSBtZXRob2QgZWxlbWVudCBpcyBzZWxlY3RhYmxlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIHNlbGVjdGFibGUoTWV0aG9kRWxlbWVudCBlbGVtZW50KSB7Ci0JCXJldHVybiAoZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZExpYnJhcnkKLQkJCQl8fCBlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luCi0JCQkJfHwgZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZFBhY2thZ2UKLQkJCQl8fCBlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kQ29uZmlndXJhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZXhpc3RpbmcgbWV0aG9kIGVsZW1lbnQgZ2l2ZW4gYnkgdGhlIGd1aWQuCi0JICovCi0JcHVibGljIE1ldGhvZEVsZW1lbnQgZ2V0RXhpc3RpbmdFbGVtZW50KFN0cmluZyBndWlkKSB7Ci0JCXJldHVybiAoTWV0aG9kRWxlbWVudCljdXJyZW50RWxlbWVudE1hcC5nZXQoZ3VpZCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3NlcnZpY2VzL0xpYnJhcnlJbXBvcnRNYW5hZ2VyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3NlcnZpY2VzL0xpYnJhcnlJbXBvcnRNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyOTYyYmQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy9zZXJ2aWNlcy9MaWJyYXJ5SW1wb3J0TWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc1MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLnNlcnZpY2VzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEubmV0LlVSSTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudmlld3MuTGlicmFyeVZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS51dGlsLk1zZ0RpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnNlcnZpY2VzLkRpYWdyYW1IYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcuSW1wb3J0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcuSW1wb3J0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LklMaWJyYXJ5UmVzb3VyY2VNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnNlcnZpY2VzLlNhZmVVcGRhdGVDb250cm9sbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuTGlicmFyeVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5SZXNvdXJjZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UuTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5NdWx0aUZpbGVYTUlIZWxwZXJJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy5JRmlsZUJhc2VkTGlicmFyeVBlcnNpc3RlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VydmljZXMuSUZpbGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy5JTGlicmFyeVBlcnNpc3RlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VydmljZXMuU2VydmljZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmliYWJsZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudFByb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLQotCi0vKioKLSAqIE1hbmFnZXMgdGhlIGltcG9ydGluZyBvZiBhIGxpYnJhcnkuCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBMaWJyYXJ5SW1wb3J0TWFuYWdlciB7Ci0KLQlwcml2YXRlIE1hcDxTdHJpbmcsIFN0cmluZz4gcmVuYW1lUGx1Z2luTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7Ci0JcHJpdmF0ZSBNYXAgcmVuYW1lRWxlbWVudE1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JcHJpdmF0ZSBNYXAgc2V0RWxlbWVudE1hcCA9IG51bGw7Ci0KLQlwcml2YXRlIExpYnJhcnlEaWZmTWFuYWdlciBkaWZmTWdyOwotCXByaXZhdGUgRWxlbWVudERpZmZUcmVlIHJvb3RUcmVlOwotCQotCXByaXZhdGUgYm9vbGVhbiBjb25maWdGb2xkZXJFcnJvciA9IGZhbHNlOwotCi0JLy9wcm90ZWN0ZWQgQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluIGVkaXRpbmdEb21haW4gPSBudWxsOwotCi0JLy9wcm90ZWN0ZWQgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIgYWZjcCA9IG51bGw7Ci0KLQlwcml2YXRlIE1ldGhvZExpYnJhcnkgYmFzZUxpYnJhcnkgPSBudWxsOwotCXByaXZhdGUgTWV0aG9kTGlicmFyeSBpbXBvcnRpbmdMaWJyYXJ5ID0gbnVsbDsKLQotCS8vIGd1aWQgb2YgcmVwbGFjZWQgZWxlbWVudCBpZCB0byB0aGUgZWxlbWVudCBpbiB0aGUgYmFzZSBsaWJyYXJ5Ci0JLy8gd2UgbmVlZCB0aGlzIHRvIHJlZGlyZWN0IHRoZSByZWZlcmVuY2Ugb2YgbmV3IGVsZW1lbnRzIGZyb20gdGhlIGltcG9ydGluZwotCS8vIGxpYnJhdHkgdG8gdGhlIGJhc2UgbGlicmFyeQotCXByaXZhdGUgTWFwIHJlcGxhY2VkRWxlbWVudE1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0KLQkvLyBrZWVwIHRoZSBuZXcgZWxlbWVudHMsIHdlIG5lZWQgdG8gaXRlcmF0ZSB0aGVpciBmZWF0dXJlIHZhbHVlIGFuZAotCS8vIHJlZGlyZWN0IHRoZSB2YWxldSBlbGVtZW50Ci0JLy8gZnJvbSB0aGUgaW1wb3J0aW5nIGxpYnJhcnkgdG8gdGhlIGJhc2UgbGlicmFyeQotCXByaXZhdGUgTGlzdCBuZXdFbGVtZW50cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCi0JLy8gZGVsZXRlZCBlbGVtZW50cywKLQlwcml2YXRlIExpc3QgZGVsZXRlZEVsZW1lbnRzID0gbmV3IEFycmF5TGlzdCgpOwotCQotCXByaXZhdGUgYm9vbGVhbiBkZWJ1ZyA9IEltcG9ydFBsdWdpbi5nZXREZWZhdWx0KCkuaXNEZWJ1Z2dpbmcoKTsKLQkKLQkvLyBsaXN0IG9mIHVzZXIgc2VsZWN0ZWQgaXRlbXMgdG8gYmUgaW1wb3J0ZWQKLQlMaXN0IGNoZWNrZWRMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQotCS8vIGZsYWcgdG8gaW5kaWNhdGUgdGhlIGZpbGUgY2hlb3V0IHN0YXR1cwotCUlTdGF0dXMgZmlsZUNoZWNrZWRPdXRTdGF0dXMgPSBudWxsOwotCQotCS8vIHJlc291cmNlIGZpbGUgcGF0aCBmb3IgbmV3IHJlc29ydWNlcwotCUxpc3QgbmV3UmVzb3VyY2VzID0gbmV3IEFycmF5TGlzdCgpOwotCQotCVJlc291cmNlU2Nhbm5lciByZXNTY2FubmVyOwotCQotCXByaXZhdGUgRGlhZ3JhbUhhbmRsZXIgZGlhZ3JhbUhhbmRsZXI7Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgTGlicmFyeUltcG9ydE1hbmFnZXIoTGlicmFyeURpZmZNYW5hZ2VyIGRpZmZNZ3IsCi0JCQlMaXN0IGNoZWNrZWRJdGVtcykgewotCQl0aGlzLmRpZmZNZ3IgPSBkaWZmTWdyOwotCQl0aGlzLnJvb3RUcmVlID0gZGlmZk1nci5nZXREaWZmVHJlZSgpOwotCQkKLQkJaWYgKCBjaGVja2VkSXRlbXMgIT0gbnVsbCApIHsKLQkJCS8vIGNoZWNrZWRMaXN0IGNvbnRhaW5zIGEgbGlzdCBvZiBFbGVtZW50RGlmZlRyZWUgb2JqZWN0cwotCQkJLy8gZ2V0IHRoZSBwYWNrYWdlcyBhcyB3ZWxsCi0JCQl0aGlzLmNoZWNrZWRMaXN0LmFkZEFsbChjaGVja2VkSXRlbXMpOwotCQkJZm9yIChJdGVyYXRvciBpdCA9IGNoZWNrZWRJdGVtcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7ICkgewotCQkJCUVsZW1lbnREaWZmVHJlZSBkaWZmVHJlZSA9IChFbGVtZW50RGlmZlRyZWUpIGl0Lm5leHQoKTsKLQkJCQlNZXRob2RFbGVtZW50IGUgPSBkaWZmVHJlZS5nZXRCYXNlRWxlbWVudCgpOwotCQkJCWlmICggZSAhPSBudWxsICkgewotCQkJCQljaGVja2VkTGlzdC5hZGQoZSk7Ci0JCQkJfQotCQkJCQkJCQkKLQkJCQlpZiAoIGUgaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50ICkgewotCQkJCQlMaWJyYXJ5VXRpbC5nZXRBbGxDaGlsZFBhY2thZ2VzKChNZXRob2RQYWNrYWdlKWUsIGNoZWNrZWRMaXN0KTsKLQkJCQl9Ci0JCQkJCi0JCQkJLy8gYWxzbyBpbmNsZHVlIHRoZSBoaWRkZW4gcm9vdCBjdXN0b20gcGFja2FnZSBpZiB0aGUgcGFja2FnZSBpcyB0aGUgQ3VzdG9tQ2F0ZWdvcmllcyBwYWNrYWdlCi0JCQkJLy8gMTUwODk1IC0gSW1wb3J0IENvbmZpZzogQ3VzdG9tQ2F0ZWdvcnkgZGlkIG5vdCBzeW5jIHVwIGJ5IGltcG9ydAotCQkJCWlmICggZSBpbnN0YW5jZW9mIE1ldGhvZFBhY2thZ2UgKSB7Ci0JCQkJCUxpc3QgY2hpbGRyZW4gPSAoKE1ldGhvZFBhY2thZ2UpZSkuZ2V0Q2hpbGRQYWNrYWdlcygpOwotCQkJCQlpZiAoIGNoaWxkcmVuLnNpemUoKSA9PSAxICkgewotCQkJCQkJTWV0aG9kUGFja2FnZSBwa2cgID0gKE1ldGhvZFBhY2thZ2UpY2hpbGRyZW4uZ2V0KDApOwotCQkJCQkJaWYgKCBUbmdVdGlsLmlzUm9vdEN1dG9tQ2F0ZWdvcnlQYWNrYWdlKHBrZykgKSB7Ci0JCQkJCQkJY2hlY2tlZExpc3QuYWRkKHBrZyk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJCi0JCQkJZSA9IGRpZmZUcmVlLmdldEltcG9ydEVsZW1lbnQoKTsKLQkJCQlpZiAoIGUgIT0gbnVsbCApIHsKLQkJCQkJY2hlY2tlZExpc3QuYWRkKGUpOwotCQkJCX0KLQkJCQkKLQkJCQlpZiAoIGUgaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50ICkgewotCQkJCQlMaWJyYXJ5VXRpbC5nZXRBbGxDaGlsZFBhY2thZ2VzKChNZXRob2RQYWNrYWdlKWUsIGNoZWNrZWRMaXN0KTsKLQkJCQl9Ci0KLQkJCQkKLQkJCQkvLyBmb3IgbmV3IGl0ZW0sIGFkZCBhbGwgdGhlIHN1YiBwYWNrYWdlcwotCQkJCWlmICggZGlmZlRyZWUuaXNOZXcoKSApIHsKLQkJCQkJaWYgKCBlIGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luICkgewotCQkJCQkJY2hlY2tlZExpc3QuYWRkQWxsKExpYnJhcnlVdGlsLmdldEFsbFBhY2thZ2VzKChNZXRob2RQbHVnaW4pZSkpOwotCQkJCQl9IGVsc2UgaWYgKCBlIGluc3RhbmNlb2YgTWV0aG9kUGFja2FnZSApIHsKLQkJCQkJCUxpYnJhcnlVdGlsLmdldEFsbENoaWxkUGFja2FnZXMoKE1ldGhvZFBhY2thZ2UpZSwgY2hlY2tlZExpc3QpOwotCQkJCQl9IAotCQkJCX0KLQkJCX0KLQkJCQotCQl9IGVsc2UgewotCQkJY2hlY2tlZExpc3QgPSBudWxsOwotCQl9Ci0JCQotCQkKLQkJaW5pdCgpOwotCi0JCS8vIEdldCB0aGUgY3VycmVudCBsaWJyYXJ5LgotCQliYXNlTGlicmFyeSA9IChNZXRob2RMaWJyYXJ5KSB0aGlzLnJvb3RUcmVlLmdldEJhc2VFbGVtZW50KCk7Ci0JCWltcG9ydGluZ0xpYnJhcnkgPSAoTWV0aG9kTGlicmFyeSkgdGhpcy5yb290VHJlZQotCQkJCS5nZXRJbXBvcnRFbGVtZW50KCk7Ci0KLQkJLy8gY3JlYXRlIHRoZSByZXNvdXJjZSBzY2FubmVyCi0JCXJlc1NjYW5uZXIgPSBuZXcgUmVzb3VyY2VTY2FubmVyKAotCQkJCUxpYnJhcnlVdGlsLmdldExpYnJhcnlSb290UGF0aChpbXBvcnRpbmdMaWJyYXJ5KSwgCi0JCQkJTGlicmFyeVV0aWwuZ2V0TGlicmFyeVJvb3RQYXRoKGJhc2VMaWJyYXJ5KSwgcmVuYW1lUGx1Z2luTWFwKTsKLQkJCQotCQlkaWFncmFtSGFuZGxlciA9IG5ldyBEaWFncmFtSGFuZGxlcigKLQkJCQlMaWJyYXJ5VXRpbC5nZXRMaWJyYXJ5Um9vdFBhdGgoaW1wb3J0aW5nTGlicmFyeSksIAotCQkJCUxpYnJhcnlVdGlsLmdldExpYnJhcnlSb290UGF0aChiYXNlTGlicmFyeSkpIHsJCQkJCi0JCQkvL1swXTogc291cmNlRmlsZQotCQkJLy9bMV06IHRhcmdldEZpbGUKLQkJCXByb3RlY3RlZCBGaWxlW10gZ2V0RmlsZXMob3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50IGVsZW0pIHsKLQkJCQlyZXR1cm4gc3VwZXIuZ2V0RmlsZXMoZWxlbSwgZmFsc2UpOwotCQkJfQotCQkJCi0JCX07Ci0JCQotCX0KLQkJCi0JcHJpdmF0ZSB2b2lkIGluaXQoKSB7Ci0vLwkJLy8gU2V0IHRoZSB0cmVlIGNvbnRlbnQuCi0vLwkJTGlzdCBmYWN0b3JpZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0vLwkJZmFjdG9yaWVzLmFkZChuZXcgUmVzb3VyY2VJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpKTsKLS8vCQlmYWN0b3JpZXMuYWRkKG5ldyBVbWFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpKTsKLS8vCQlmYWN0b3JpZXMuYWRkKG5ldyBSZWZsZWN0aXZlSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSk7Ci0vLwotLy8JCUNvbXBvc2VkQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkgPSBuZXcgQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgKLS8vCQkJCWZhY3Rvcmllcyk7Ci0vLwkJYWZjcCA9IG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcihhZGFwdGVyRmFjdG9yeSk7Ci0vLwotLy8JCUJhc2ljQ29tbWFuZFN0YWNrIGNvbW1hbmRTdGFjayA9IG5ldyBCYXNpY0NvbW1hbmRTdGFjaygpOwotLy8KLS8vCQkvLyBDcmVhdGUgdGhlIGVkaXRpbmcgZG9tYWluIHdpdGggYSBzcGVjaWFsIGNvbW1hbmQgc3RhY2suCi0vLwkJZWRpdGluZ0RvbWFpbiA9IG5ldyBBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW4oYWRhcHRlckZhY3RvcnksCi0vLwkJCQljb21tYW5kU3RhY2ssIG5ldyBIYXNoTWFwKCkpOwotLy8KLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNTZWxlY3RlZChFbGVtZW50RGlmZlRyZWUgZGlmZlRyZWUpIHsKLQkJaWYgKCBjaGVja2VkTGlzdCA9PSBudWxsIHx8IGNoZWNrZWRMaXN0LmNvbnRhaW5zKGRpZmZUcmVlKSApIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCQotCQlNZXRob2RFbGVtZW50IGUgPSBkaWZmVHJlZS5nZXRCYXNlRWxlbWVudCgpOwkJCi0JCWlmICggZSA9PSBudWxsICkgewotCQkJZSA9IGRpZmZUcmVlLmdldEltcG9ydEVsZW1lbnQoKTsKLQkJfQotCQkKLQkJcmV0dXJuIGlzU2VsZWN0ZWQoZSk7Ci0JfQotCQotCXByaXZhdGUgYm9vbGVhbiBpc1NlbGVjdGVkKE1ldGhvZEVsZW1lbnQgZSkgewotCQkKLQkJaWYgKCBjaGVja2VkTGlzdCA9PSBudWxsIHx8IAotCQkJCWUgaW5zdGFuY2VvZiBDb250ZW50RGVzY3JpcHRpb24gfHwgCi0JCQkJZS5lQ29udGFpbmVyKCkgaW5zdGFuY2VvZiBDb250ZW50RGVzY3JpcHRpb24gfHwgCi0JCQkJZSBpbnN0YW5jZW9mIE1ldGhvZExpYnJhcnkgKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQkKLQkJaWYgKCBjaGVja2VkTGlzdC5zaXplKCkgPT0gMCApIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQkKLQkJaWYgKCBlIGluc3RhbmNlb2YgTWV0aG9kQ29uZmlndXJhdGlvbiApIHsKLQkJCXJldHVybiBjaGVja2VkTGlzdC5jb250YWlucyhlKTsKLQkJfQotCQkKLQkJTWV0aG9kRWxlbWVudCBvID0gKE1ldGhvZEVsZW1lbnQpTGlicmFyeVV0aWwuZ2V0U2VsZWN0YWJsZShlKTsKLQkJaWYgKCBvID09IG51bGwgKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0gCi0JCQotCQlpZiAoIG8gaW5zdGFuY2VvZiBNZXRob2RMaWJyYXJ5ICkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJCi0JCXJldHVybiBjaGVja2VkTGlzdC5jb250YWlucyhvKTsKLQl9Ci0JCi0JLyoqCi0JICogRG9lcyBtZXJnZSBmcm9tIHRoZSBpbXBvcnQgbGlicmFyeSBpbnRvIHRoZSBiYXNlIGxpYnJhcnkuCi0JICovCi0JcHVibGljIHZvaWQgZG9NZXJnZShib29sZWFuIHJlcGxhY2VFeGlzdGluZywgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY29uZmlnRm9sZGVyRXJyb3IgPSBmYWxzZTsKLQkJCi0JCWlmICggZGVidWcgKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIk1lcmdpbmcgY29uZmlndXJhdGlvbiAuLi4iKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCQkKLQkJLy8gU2F2ZSB0aGUgbGlicmFyeSBwYXRoIGJlZm9yZSBkZXRhY2hpbmcgdGhlIHJlc291cmNlLgotCi0JCWlmICggZGVidWcgKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oImxvYWRpbmcgbGlicmFyeSAuLi4iKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCQotCQlMaXN0IHVubG9ja2VkUGx1Z2lucyA9IHVubG9ja1BsdWdpbnMoKTsKLQkJaWYgKCEgdW5sb2NrZWRQbHVnaW5zLmlzRW1wdHkoKSAmJiAoZmlsZUNoZWNrZWRPdXRTdGF0dXMgIT0gbnVsbCkKLQkJCQkmJiAhZmlsZUNoZWNrZWRPdXRTdGF0dXMuaXNPSygpKSB7Ci0JCQkvLyBsb2cgZXJyb3IKLQkJCWZpbGVDaGVja091dEVycm9yKCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlMaWJyYXJ5VXRpbC5sb2FkQWxsKGJhc2VMaWJyYXJ5KTsKLQkJTGlicmFyeVV0aWwubG9hZEFsbChpbXBvcnRpbmdMaWJyYXJ5KTsKLQotCQkvLyBEZXRhY2ggdGhlIG5ldyBsaWJyYXJ5IGZyb20gdGhlIGN1cnJlbnQgcmVzb3VyY2Ugc28gaXQgY2FuIGJlCi0JCS8vIGFkZGVkIHRvIGEgbmV3IExpYnJhcnkgUHJvY2Vzc29yIGluc3RhbmNlLgotCQlMaWJyYXJ5VXRpbC5kZXRhY2hGcm9tUmVzb3VyY2UoaW1wb3J0aW5nTGlicmFyeSk7Ci0KLQkJLy8gZm9yIHRlc3QKLQkJaW1wb3J0aW5nTGlicmFyeS5zZXROYW1lKCJJbXBvcnRpbmdMaWI6ICIgKyBpbXBvcnRpbmdMaWJyYXJ5LmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCWlmICggZGVidWcgKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIlByb2Nlc3MgY29uZmlndXJhdGlvbiBkaWZmIHRyZWUgLi4uIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCS8vIGJlZm9yZSBwcm9jZXNzaW5nLCBzYXZlIHRoZSBvcmlnaW5hbCByZXNvdXJjZXMgCi0JCS8vIHNvIHRoYXQgd2UgY2FuIGZpbmQgdGhlIG5ld2x5IGFkZGVkIHJlc291cmNlcwotCQlMaXN0IG9sZFJlc291cmNlcyA9IG5ldyBBcnJheUxpc3QoCi0JCQkJYmFzZUxpYnJhcnkuZVJlc291cmNlKCkuZ2V0UmVzb3VyY2VTZXQoKS5nZXRSZXNvdXJjZXMoKSk7Ci0JCQotCQkvLyBJdGVyYXRlIGVhY2ggZWxlbWVudCBhbmQgdGhlIG5lY2Vzc2FyeSBtZXJnZXMuCi0JCXByb2Nlc3NEaWZmVHJlZShyb290VHJlZSwgcmVwbGFjZUV4aXN0aW5nKTsKLQotCQloYW5kbGVTZXRFbGVtZW50cygpOwotCQkKLQkJaWYgKCBkZWJ1ZyApIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigicGVyZm9ybSBpbnRlZ3JpdHkgY2hlY2tpbmcgLi4uIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCS8vIHBlcmZvcm0gYW4gaW50ZWdyaXR5IGNoZWNrIG9mIHRoZSBsaWJyYXJ5Ci0JCS8vIGZpeCBhbnkgZGFuZmxpbmcgZWxlbWVudHMgZHVlIHRvIHBhY2thZ2UvZWxlbWVudCByZXBsYWNlbWVudAotCQlkb0ludGVncml0eUNoZWNrKCk7Ci0KLQkJLy8gbm93IHByb2Nlc3MgdGhlIG5ldyByZXNvdXJjZXMgYW5kIG1hcmsgdGhlbSBkaXJzdCBzbyB0aGF0IAotCQkvLyB0aGUgZGF0YSB3aWxsIGJlIHNhdmVkIGFnYWluLiAKLQkJLy8gVGhpcyBzdGVwIGlzIGNyaXRpY2FsIHNpbmNlIHRoZSBmaXJzdCByb3VuZCBvbmx5IGNyZWF0ZWQgdGhlIGRhdGEgc3RydWN0dXJlCi0JCS8vIHNvbWUgb2YgdGhlIGNyb3NzLXJlZmVyZW5jZWQgZWxlbWVudHMgbWlnaHQgYmUgbG9zdCBvbiB0aGUgZmlyc3Qgc2F2aW5nCi0JCS8vIGZvciBleGFtcGxlLCB3aGVuIGNyZWF0ZSBhIG1ldGhvZCBjb25maWd1cmF0aW9uIHdpdGggcmVmZXJlbmNlcyB0byBhIG5ldyBwbHVnaW4sCi0JCS8vIHdoaWNoIGFyZSBub3Qgc2F2ZWQgeWV0LCB0aG9zZSByZWZlcmVuY2VzIHdpbGwgYmUgbG9zdC4KLQkJLy8gMTQ1ODkxIC0gSW1wb3J0IENvbmZpZ3VyYXRpb246IGRlZmF1bHQgY29uZmlnIGlzIGxvc3MgYWZ0ZXIgaW1wb3J0Ci0JCWhhbmRsZU5ld1Jlc291cmNlcyhvbGRSZXNvdXJjZXMpOwotCQkKLQkJaGFuZGxlTmFtZVJlcGxhY2UocmVuYW1lRWxlbWVudE1hcCk7Ci0JCQotCQlkaWFncmFtSGFuZGxlci5wb3N0UmVnaXN0ZXJFbGVtZW50cygpOwotCQkKLQkJLy8gZ2V0IGFsbCB0aGUgbW9kaWZpZWQgcmVzb3VyY2VzIGFuZCByZXNvdXJjZSBmaWxlcwotCQkvLyBjaGVjayBDTSBmb3IgZmlsZSBjaGVjay1vdXQKLQkJaWYgKCBkZWJ1ZyApIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiY2hlY2sgb3V0IGZpbGVzIC4uLiIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJCi0JCS8vIGNsZWFyIHJlc291cmNlcyBmb3IgZGVsZXRlZCBlbGVtZW50cwotCQlkZWxldGVSZXNvcnVjZXMoKTsKLQkKLQkJY2hlY2tNb2RpZmllZEZpbGVzKCk7Ci0JCQkJCi0JCWlmICggZmlsZUNoZWNrZWRPdXRTdGF0dXMuaXNPSygpICkgewotCQkgCi0JCQlpZiAoIGRlYnVnICkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiY29weWluZyByZXNvdXJjZSBmaWxlcyAuLi4iKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJcmVzU2Nhbm5lci5leGVjdXRlKCk7Ci0JCQlkaWFncmFtSGFuZGxlci5leGVjdXRlKCk7Ci0KLQkJCWlmICggZGVidWcgKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJzYXZpbmcgbGlicmFyeSAuLi4iKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJCi0JCQlpZiAoISBjb25maWdGb2xkZXJFcnJvcikgewotCQkJCWlmICh1bmxvY2tlZFBsdWdpbnMuc2l6ZSgpID4gMCkgewotCQkJCQlsb2NrVW5sb2NrZWRQbHVnaW5zKHVubG9ja2VkUGx1Z2lucyk7Ci0JCQkJfQotCQkJCUxpYnJhcnlVdGlsLnNhdmVMaWJyYXJ5KGJhc2VMaWJyYXJ5LCBmYWxzZSwgZmFsc2UpOwotCQkJfQotCQl9IAotCQllbHNlIHsKLQkJCWZpbGVDaGVja091dEVycm9yKCk7Ci0JCX0JCi0vLyBpZiAoIGRlYnVnICkgewotLy8gU3lzdGVtLm91dC5wcmludGxuKCJjb3B5aW5nIHJlc291cmNlIGZpbGVzIC4uLiIpOyAvLyROT04tTkxTLTEkCi0vLyB9Ci0vLwotLy8gLy8gQ29weSB0aGUgcmVzb3VyY2UgZmlsZXMgaW4gdGhlIGN1cnJlbnQgbGlicmFyeSB0byB0aGUgbmV3IGxpYnJhcnkuCi0vLyAvLyBGb3Igc2ltcGxpY2l0eSBzYWtlLCBjb3B5IGFsbCByZXNvdXJjZSBmaWxlcyBpZiB0aGUgZmlsZXMgZG8gbm90Ci0vLyAvLyBleGlzdCBpbiB0aGUgdGFyZ2V0IGxpYnJhcnkgb3IgaWYgdGhlIGZpbGVzIGFyZSBuZXdlci4KLS8vIFN0cmluZyBpbmNsdWRlcyA9ICJyZXNvdXJjZXMvKiosICoqL3Jlc291cmNlcy8qKiI7IC8vJE5PTi1OTFMtMSQKLS8vCi0vLyBMYXlvdXRSZXNvdXJjZXMuY29weURpcihzcmNEaXIsIGRlc3REaXIsIGluY2x1ZGVzLCBudWxsKTsKLQotCQlpZiAoIGRlYnVnICkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJNZXJnaW5nIGNvbmZpZ3VyYXRpb24gZG9uZS4uLiIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCX0KLQkKLQlwcml2YXRlIHZvaWQgZmlsZUNoZWNrT3V0RXJyb3IoKSB7Ci0JCS8vIGxvZyBlcnJvcgotCQlTYWZlVXBkYXRlQ29udHJvbGxlci5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJU3RyaW5nIHRpdGxlID0gSW1wb3J0UmVzb3VyY2VzLmltcG9ydENvbmZpZ1dpemFyZF90aXRsZTsgCi0JCQkJU3RyaW5nIG1zZyA9IEltcG9ydFJlc291cmNlcy5JbXBvcnRDb25maWd1cmF0aW9uV2l6YXJkX0VSUl9JbXBvcnRfY29uZmlndXJhdGlvbjsgCi0JCQkJbmV3IE1zZ0RpYWxvZyhJbXBvcnRQbHVnaW4uZ2V0RGVmYXVsdCgpKQotCQkJCQkuZGlzcGxheUVycm9yKHRpdGxlLCBtc2csIGZpbGVDaGVja2VkT3V0U3RhdHVzKTsKLQkJCQl9Ci0JCX0pOwotCi0JCWlmICggZGVidWcgKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkNoZWNrb3V0IGZpbGVzIGZhaWxlZCAuLi4iKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCQkKLQlwcml2YXRlIHZvaWQgaGFuZGxlTmV3UmVzb3VyY2VzKExpc3Qgb2xkUmVzb3VyY2VzKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSBiYXNlTGlicmFyeS5lUmVzb3VyY2UoKS5nZXRSZXNvdXJjZVNldCgpCi0JCQkJLmdldFJlc291cmNlcygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTsgKSB7Ci0JCQlSZXNvdXJjZSByZXMgPSAoUmVzb3VyY2UpaXQubmV4dCgpOwotCQkJaWYgKCAhb2xkUmVzb3VyY2VzLmNvbnRhaW5zKHJlcykgKSB7Ci0JCQkJbG9nTmV3UmVzb3VyY2UocmVzKTsKLQkJCX0KLQkJfQkKLQl9Ci0JCi0JCi0JLyoqCi0JICogUHJvY2Vzc2VzIHRoZSBkaWZmIHRyZWUuIE9ubHkgbmVlZCB0byBkbyB0aGUgZmlyc3QgbGV2ZWwgc2luY2UgdGhlCi0JICogcmVwbGFjZSBvciBhZGQgaXMgZG9uZSBhdCB0aGUgbWV0aG9kIHBhY2thZ2UgbGV2ZWwuCi0JICovCi0JcHJpdmF0ZSB2b2lkIHByb2Nlc3NEaWZmVHJlZShFbGVtZW50RGlmZlRyZWUgZGlmZlRyZWUsCi0JCQlib29sZWFuIHJlcGxhY2VFeGlzdGluZykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWlmIChkaWZmVHJlZSA9PSBudWxsIHx8ICFpc1NlbGVjdGVkKGRpZmZUcmVlKSApIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCS8vIFRoZXJlIGlzIGEgY2hhbmdlLgotCQlpbnQgc3RhdGUgPSBkaWZmVHJlZS5nZXREaWZmU3RhdGUoKTsKLQkJTWV0aG9kRWxlbWVudCBiYXNlID0gZGlmZlRyZWUuZ2V0QmFzZUVsZW1lbnQoKTsKLQkJTWV0aG9kRWxlbWVudCBpbXAgPSBkaWZmVHJlZS5nZXRJbXBvcnRFbGVtZW50KCk7Ci0JCWlmIChyZXBsYWNlRXhpc3RpbmcgJiYgKHN0YXRlID09IEVsZW1lbnREaWZmVHJlZS5ESUZGX1NUQVRFX0NIQU5HRUQpICkgewotCi0JCQlpZiAoIChiYXNlIGluc3RhbmNlb2YgTWV0aG9kQ29uZmlndXJhdGlvbikpIHsKLQkJCQkvLyByZXBsYWNlIHRoZSBjb25maWd1cmF0aW9uIGJ5IGFkZGluZyB0aGUgbmV3IHBhY2thZ2VzIGludG8gdGhlCi0JCQkJLy8gY29uZmlndXJhdGlvbgotCQkJCWRvUmVwbGFjZUNvbmZpZ3VyYXRpb24oKE1ldGhvZENvbmZpZ3VyYXRpb24pIGJhc2UsIChNZXRob2RDb25maWd1cmF0aW9uKSBpbXApOwotCQkJfQotCQkJZWxzZSBpZiAoIChiYXNlIGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luKSkgewotCQkJCS8vIFJlcGxhY2UgdGhlIHBsdWdpbiB3aXRoIHRoZSBub24tcGFja2FnZSBmZWF0dXJlcy4KLQkJCQlkb1JlcGxhY2VQbHVnaW4oKE1ldGhvZFBsdWdpbikgYmFzZSwgKE1ldGhvZFBsdWdpbikgaW1wKTsKLQkJCX0KLQkJCWVsc2UgaWYgKCAoYmFzZSBpbnN0YW5jZW9mIE1ldGhvZFBhY2thZ2UpKSB7Ci0JCQkJLy8gUmVwbGFjZSB0aGUgcGFja2FnZS4KLQkJCQlkb1JlcGxhY2VQYWNrYWdlKChNZXRob2RQYWNrYWdlKSBiYXNlLCAoTWV0aG9kUGFja2FnZSkgaW1wKTsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQlpZiAoZGVidWcgKSB7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiV2hhdCBpcyB0aGlzOiAiICsgTGlicmFyeVV0aWwuZ2V0VHlwZU5hbWUoYmFzZSkpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfQotCQl9IGVsc2UgaWYgKHN0YXRlID09IEVsZW1lbnREaWZmVHJlZS5ESUZGX1NUQVRFX05FVykgewotCQkJLy8gQWRkIHRoZSBuZXcgcGFja2FnZSBmcm9tIGltcG9ydCBsaWJyYXJ5LgotCQkJZG9BZGQoZGlmZlRyZWUuZ2V0QmFzZVBhcmVudEVsZW1lbnQoKSwgZGlmZlRyZWUuZ2V0SW1wb3J0RWxlbWVudCgpKTsgCi0JCX0KLQotCQkvLyBQcm9jZXNzIHRoZSBjaGlsZHJlbiByZWN1cnNpdmVseSBpZiBpdCdzIG5vdCBhIG5ldyBvbmUuCi0JCWlmIChzdGF0ZSAhPSBFbGVtZW50RGlmZlRyZWUuRElGRl9TVEFURV9ORVcpIHsKLQkJCUxpc3QgY2hpbGRyZW4gPSBkaWZmVHJlZS5nZXRDaGlsZHJlbigpOwotCQkJaWYgKGNoaWxkcmVuICE9IG51bGwgJiYgY2hpbGRyZW4uc2l6ZSgpID4gMCkgewotCQkJCWZvciAoSXRlcmF0b3IgaXQgPSBjaGlsZHJlbi5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJCXByb2Nlc3NEaWZmVHJlZSgoRWxlbWVudERpZmZUcmVlKSBpdC5uZXh0KCksCi0JCQkJCQkJcmVwbGFjZUV4aXN0aW5nKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiB1cGRhdGUgdGhlIGNvbmZpZ3VyYXRpb24gYnkgcmVwbGFjaW5nIHRoZSBub24tcGFja2FnZSBmZWF0dXJlcywgYW5kCi0JICogYWRkaW5nIHRoZSBuZXcgcGFja2FnZXMgaW50byB0aGUgY29uZmlndXJhdGlvbgotCSAqIAotCSAqIEBwYXJhbSBvbGRPYmoKLQkgKiAgICAgICAgICAgIE1ldGhvZENvbmZpZ3VyYXRpb24KLQkgKiBAcGFyYW0gbmV3T2JqCi0JICogICAgICAgICAgICBNZXRob2RDb25maWd1cmF0aW9uCi0JICovCi0JcHJpdmF0ZSB2b2lkIGRvUmVwbGFjZUNvbmZpZ3VyYXRpb24oTWV0aG9kQ29uZmlndXJhdGlvbiBvbGRPYmosIE1ldGhvZENvbmZpZ3VyYXRpb24gbmV3T2JqKQotCXsKLQkJaWYgKCBpc1JlcGxhY2VkKG9sZE9iaikgKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc2V0UmVwbGFjZWQob2xkT2JqKTsKLQkJCi0JCUxpc3QgZmVhdHVyZXMgPSBMaWJyYXJ5VXRpbC5nZXRTdHJ1Y3R1cmFsRmVhdHVyZXMob2xkT2JqKTsKLS8vCQlMaXN0IHByb3BlcnRpZXMgPSBvbGRPYmouZ2V0SW5zdGFuY2VQcm9wZXJ0aWVzKCk7Ci0JCWlmIChmZWF0dXJlcyAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGZlYXR1cmVzLnNpemUoKTsgaSsrKSB7Ci0JCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSAoRVN0cnVjdHVyYWxGZWF0dXJlKSBmZWF0dXJlcy5nZXQoaSk7Ci0JCQkJLy8gZG9uJ3QgZGVsZXRlIG9sZCBmZWF0dXJlIHZhbHVlcwotCQkJCU9iamVjdCBuZXdWYWx1ZSA9IG5ld09iai5lR2V0KGZlYXR1cmUpOwotCQkJCXNldEZlYXR1cmVWYWx1ZShvbGRPYmosIGZlYXR1cmUsIG5ld1ZhbHVlLCBmYWxzZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLS8vIHByaXZhdGUgdm9pZCBtZXJnZUVsZW1lbnRMaXN0KExpc3Qgc291cmNlLCBMaXN0IHRhcmdldCkKLS8vIHsKLS8vIExpc3QgaWRzID0gbmV3IEFycmF5TGlzdCgpOwotLy8gZm9yICggSXRlcmF0b3IgaXQgPSB0YXJnZXQuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOyApCi0vLyB7Ci0vLyBNZXRob2RFbGVtZW50IGUgPSAoTWV0aG9kRWxlbWVudClpdC5uZXh0KCk7Ci0vLyBpZHMuYWRkKGUuZ2V0R3VpZCgpKTsKLS8vIH0KLS8vCi0vLyBmb3IgKCBJdGVyYXRvciBpdCA9IHNvdXJjZS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7ICkKLS8vIHsKLS8vIE1ldGhvZEVsZW1lbnQgZSA9IChNZXRob2RFbGVtZW50KWl0Lm5leHQoKTsKLS8vIGlmICggIWlkcy5jb250YWlucyhlLmdldEd1aWQoKSkgKQotLy8gewotLy8gdGFyZ2V0LmFkZChlKTsKLS8vIH0KLS8vIH0KLS8vIH0KLQotCS8qKgotCSAqIHJlcGxhY2UgdGhlIHBsdWdpbiBmZWF0dXJlcywgYnV0IG5vdCB0aGUgcGx1Z2luIG9iamVjdCBhbmQgaXQncyBwYWNrYWdlcwotCSAqIAotCSAqIEBwYXJhbSBvbGRPYmoKLQkgKiAgICAgICAgICAgIE1ldGhvZFBsdWdpbgotCSAqIEBwYXJhbSBuZXdPYmoKLQkgKiAgICAgICAgICAgIE1ldGhvZFBsdWdpbgotCSAqLwotCXByaXZhdGUgdm9pZCBkb1JlcGxhY2VQbHVnaW4oTWV0aG9kUGx1Z2luIG9sZE9iaiwgTWV0aG9kUGx1Z2luIG5ld09iaikgewotCQlpZiAoIGlzUmVwbGFjZWQob2xkT2JqKSApIHsKLQkJCXJldHVybjsKLQkJfQotCQlzZXRSZXBsYWNlZChvbGRPYmopOwotCQkKLQkJTGlzdCBmZWF0dXJlcyA9IExpYnJhcnlVdGlsLmdldFN0cnVjdHVyYWxGZWF0dXJlcyhvbGRPYmopOwotLy8JCUxpc3QgcHJvcGVydGllcyA9IG9sZE9iai5nZXRJbnN0YW5jZVByb3BlcnRpZXMoKTsKLQkJaWYgKGZlYXR1cmVzICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmVhdHVyZXMuc2l6ZSgpOyBpKyspIHsKLQkJCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IChFU3RydWN0dXJhbEZlYXR1cmUpIGZlYXR1cmVzLmdldChpKTsKLQkJCQlpZiAoIGZlYXR1cmUgIT0gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWV0aG9kUGx1Z2luX01ldGhvZFBhY2thZ2VzKCkgKQotCQkJCXsKLQkJCQkJT2JqZWN0IG5ld1ZhbHVlID0gbmV3T2JqLmVHZXQoZmVhdHVyZSk7Ci0JCQkJCXNldEZlYXR1cmVWYWx1ZShvbGRPYmosIGZlYXR1cmUsIG5ld1ZhbHVlLCB0cnVlKTsKLQkJCQl9Ci0JCQkJLyogTm8sIGRvbid0IGRvIHRoaXMsIGZpeCB0aGUgZGlmZiBtYW5hZ2VyIHRvIGluY2x1ZGUgdGhlIHJvb3QgcGFja2FnZSBpbnN0ZWFkCi0JCQkJICogMTUwODk1IC0gSW1wb3J0IENvbmZpZzogQ3VzdG9tQ2F0ZWdvcnkgZGlkIG5vdCBzeW5jIHVwIGJ5IGltcG9ydAotCQkJCWVsc2UgewotCQkJCQkvLyBjdXN0b20gY2F0ZWdvcmllcyBwYWNrYWdlIG5lZWRzIHNwZWNpYWwgaGFuZGluZwotCQkJCQkvLyB3ZSBuZWVkIHRvIHN0YXJ0IHdpdGggdGhlIHJvb3QgY3VzdG9tIGNhdGVnb3J5IG90aGVyd2lzZQotCQkJCQkvLyBhbGwgY2hpbGQgY2F0ZWdvcmllcyB3aWxsIGJlIGxvc3QKLQkJCQkJTWV0aG9kUGFja2FnZSBvbGRQa2cgPSBVbWFVdGlsLmZpbmRDb250ZW50UGFja2FnZShvbGRPYmosIE1vZGVsU3RydWN0dXJlLkRFRkFVTFRfQ1VTVE9NX0NBVEVHT1JZX1BBVEgpOwotLy8gQ29udGVudFBhY2thZ2UgbmV3UGtnID0gVW1hVXRpbC5maW5kQ29udGVudFBhY2thZ2UobmV3T2JqLAotLy8gTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC5ERUZBVUxUX0NVU1RPTV9DQVRFR09SWV9QQVRIKTsKLQkJCQkJc2V0UmVwbGFjZWQob2xkUGtnKTsKLQkJCQkJCi0JCQkJCS8vIGZpbmQgdGhlIHJvb3QgY3VzdG9tIGNhdGVnb3J5IGFuZCBzdGFydCBmcm9tIHRoZXJlCi0JCQkJCUN1c3RvbUNhdGVnb3J5IG9sZENDID0gVG5nVXRpbC5nZXRSb290Q3VzdG9tQ2F0ZWdvcnkob2xkT2JqKTsKLQkJCQkJQ3VzdG9tQ2F0ZWdvcnkgbmV3Q0MgPSBUbmdVdGlsLmdldFJvb3RDdXN0b21DYXRlZ29yeShuZXdPYmopOwotCQkJCQlvbGRQa2cgPSAoTWV0aG9kUGFja2FnZSlvbGRDQy5lQ29udGFpbmVyKCk7Ci0JCQkJCXNldFJlcGxhY2VkKG9sZFBrZyk7Ci0JCQkJCWRvUmVwbGFjZUVsZW1lbnQob2xkQ0MsIG5ld0NDKTsKLQkJCQl9Ci0JCQkJKi8KLQkJCX0KLQkJfQotCi0JfQotCi0KLQotCS8qKgotCSAqIFJlcGxhY2VzIHRoZSBhdHJyaWJ1dGVzIGFuZCBjb250YWluZWQgZWxlbWVudHMsIGJ1dCBub3QgdGhlIGNoaWxkCi0JICogcGFja2FnZXMKLQkgKi8KLQlwcml2YXRlIHZvaWQgZG9SZXBsYWNlUGFja2FnZShNZXRob2RQYWNrYWdlIG9sZE9iaiwgTWV0aG9kUGFja2FnZSBuZXdPYmopIHsKLQkJaWYgKCBpc1JlcGxhY2VkKG9sZE9iaikgKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc2V0UmVwbGFjZWQob2xkT2JqKTsKLQotCQlpZiAoIGRlYnVnICkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJSZXBsYWNpbmcgcGFja2FnZSAiICsgTGlicmFyeVV0aWwuZ2V0VHlwZU5hbWUob2xkT2JqKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlMaXN0IGZlYXR1cmVzID0gTGlicmFyeVV0aWwuZ2V0U3RydWN0dXJhbEZlYXR1cmVzKG9sZE9iaik7Ci0vLwkJTGlzdCBwcm9wZXJ0aWVzID0gb2xkT2JqLmdldEluc3RhbmNlUHJvcGVydGllcygpOwotCQkKLQkJYm9vbGVhbiBpc1Byb2Nlc3NQYWNrYWdlID0gb2xkT2JqIGluc3RhbmNlb2YgUHJvY2Vzc1BhY2thZ2U7Ci0JCQotCQlpZiAoZmVhdHVyZXMgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmZWF0dXJlcy5zaXplKCk7IGkrKykgewotCQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgZmVhdHVyZXMuZ2V0KGkpOwotCQkJCWlmICggZmVhdHVyZSA9PSBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRNZXRob2RQYWNrYWdlX0NoaWxkUGFja2FnZXMoKSAmJgotCQkJCQkgIWlzUHJvY2Vzc1BhY2thZ2UpCi0JCQkJewkJCQkJCi0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQotCQkJCU9iamVjdCBuZXdWYWx1ZSA9IG5ld09iai5lR2V0KGZlYXR1cmUpOwotCQkJCXNldEZlYXR1cmVWYWx1ZShvbGRPYmosIGZlYXR1cmUsIG5ld1ZhbHVlLCB0cnVlKTsKLQkJCX0KLQkJfQotCi0JfQotCi0vLyBwcml2YXRlIE1ldGhvZEVsZW1lbnQgb2JqT2xkID0gbnVsbDsKLS8vIHByaXZhdGUgTWV0aG9kRWxlbWVudCBvYmpOZXcgPSBudWxsOwotLy8gcHJpdmF0ZSB2b2lkIHRlc3RJdCgpIHsKLS8vIGlmICggb2JqT2xkICE9IG51bGwgKSB7Ci0vLyBTeXN0ZW0ub3V0LnByaW50bG4oIk9sZCBjb250YWluZXIgPSIgKyBvYmpPbGQuZUNvbnRhaW5lcigpKTsKLS8vIFN5c3RlbS5vdXQucHJpbnRsbigiTmV3IGNvbnRhaW5lciA9IiArIG9iak5ldy5lQ29udGFpbmVyKCkpOwotLy8gaWYgKCBvYmpPbGQuZUNvbnRhaW5lcigpID09IG51bGwgKSB7Ci0vLyBTeXN0ZW0ub3V0LnByaW50bG4oIm9sZCBpcyBnb25lISIpOwotLy8gfQotLy8gaWYgKCBvYmpOZXcuZUNvbnRhaW5lcigpID09IG51bGwgKSB7Ci0vLyBTeXN0ZW0ub3V0LnByaW50bG4oIm5ldyBpcyBnb25lISIpOwotLy8gfQotLy8gfQotLy8gfQotCQotCS8qKgotCSAqIHJlcGxhY2UgdGhlIGVsZW1lbnQgYnkgcmVwbGFjaW5nIHRoZSBmZWF0dXJlIHZhbHVlcywgYnV0IGRvbid0IHJlcGxhY2UKLQkgKiB0aGUgb2JqZWN0IGlmIGl0IGlzIG1hcmtlZCBhcyBub3QgcmVwbGFjZWFibGUuIHJlY3Vyc2l2ZSB0aGUgZmVhdHVyZQotCSAqIHZhbHVlIGFuZCByZXBsYWNlIGl0Ci0JICogCi0JICogQHBhcmFtIG9sZE9iagotCSAqICAgICAgICAgICAgTWV0aG9kUGx1Z2luCi0JICogQHBhcmFtIG5ld09iagotCSAqICAgICAgICAgICAgTWV0aG9kUGx1Z2luCi0JICovCi0JcHJpdmF0ZSB2b2lkIGRvUmVwbGFjZUVsZW1lbnQoTWV0aG9kRWxlbWVudCBvbGRPYmosIE1ldGhvZEVsZW1lbnQgbmV3T2JqKSB7Ci0JCQotCQkvLyBjaGVjayBpZiB0aGUgZWxlbWVudCBpcyBhbHJlYWR5IHJlcGxhY2VkIG9yIG5vdAotCQlpZiAoIGlzUmVwbGFjZWQob2xkT2JqKSApIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCWlmICggZGlmZk1nci5zZWxlY3RhYmxlKG9sZE9iaikgKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlpZiAoICFpc1NlbGVjdGVkKG9sZE9iaikgKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCS8vIGlmIGNvbnRlbnQgZGVzY3JpcHRpb24sIGNoZWNrIGlmIGl0J3MgY2hhbmdlZCBvciBub3QKLQkJaWYgKCAob2xkT2JqIGluc3RhbmNlb2YgQ29udGVudERlc2NyaXB0aW9uKSAmJiAobmV3T2JqIGluc3RhbmNlb2YgQ29udGVudERlc2NyaXB0aW9uKSApIHsKLQkJCWlmICggTGlicmFyeVV0aWwuaXNJZGVudGljYWwoKENvbnRlbnREZXNjcmlwdGlvbilvbGRPYmosIChDb250ZW50RGVzY3JpcHRpb24pbmV3T2JqKSApIHsKLQkJCQlpZiAoZGVidWcgKSB7Ci0JCQkJCVJlc291cmNlIHJlcyA9IG9sZE9iai5lUmVzb3VyY2UoKTsKLQkJCQkJaWYgKCByZXMgIT0gbnVsbCApIHsKLQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiSWRlbnRpY2FsIGVsZW1lbnQgbm90IHJlcGxhY2VkOiAiICsgcmVzLmdldFVSSSgpLnRvRmlsZVN0cmluZygpICk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCX0KLQkJCQkKLQkJCQkvLyBldmVuIHRob3VnaCB0aGUgY29udGVudCBpcyB0aGUgc2FtZSwgd2Ugc3RpbGwgbmVlZCB0byBjb3B5IHRoZSByZXNvdXJjZXMKLQkJCQlzY2FuUmVzb3VyY2VzKG9sZE9iaiwgdHJ1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJfSAKLQkJfQotCQkKLQkJLy8gc2V0IHJlcGFsY2VkIGZpcnN0IHRvIGF2b2lkIGNhbGxpbmcgaW50byB0aGUgc2FtZSBvYmplY3QgcmVjdXJzaXZlbHkKLQkJc2V0UmVwbGFjZWQob2xkT2JqKTsKLQkJCi0JCWlmICggZGVidWcgKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIlJlcGxhY2luZyBlbGVtZW50ICIgKyBMaWJyYXJ5VXRpbC5nZXRUeXBlTmFtZShvbGRPYmopKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCUxpc3QgZmVhdHVyZXMgPSBMaWJyYXJ5VXRpbC5nZXRTdHJ1Y3R1cmFsRmVhdHVyZXMob2xkT2JqKTsKLS8vCQlMaXN0IHByb3BlcnRpZXMgPSBvbGRPYmouZ2V0SW5zdGFuY2VQcm9wZXJ0aWVzKCk7Ci0JCWlmIChmZWF0dXJlcyAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGZlYXR1cmVzLnNpemUoKTsgaSsrKSB7Ci0JCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSAoRVN0cnVjdHVyYWxGZWF0dXJlKSBmZWF0dXJlcy5nZXQoaSk7Ci0KLQkJCQkvLyBwYWNrYWdlIHN0cnVjdHVyZSBpcyBoYW5kbGVkIGJ5IHRoZSBkaWZmIHRyZWUKLQkJCQkvLyBzbyB3ZSBkb24ndCBwcm9jZXNzIHRoZSByZWxhdGVkIGZlYXR1cmUKLQkJCQlpZiAoIGZlYXR1cmUgPT0gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWV0aG9kUGx1Z2luX01ldGhvZFBhY2thZ2VzKCkKLQkJCQkJCXx8IGZlYXR1cmUgPT0gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWV0aG9kUGFja2FnZV9DaGlsZFBhY2thZ2VzKCkgCi0JCQkJCQl8fCBmZWF0dXJlLmlzRGVyaXZlZCgpICkKLQkJCQl7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQotCQkJCU9iamVjdCBuZXdWYWx1ZSA9IG5ld09iai5lR2V0KGZlYXR1cmUpOwotCQkJCXNldEZlYXR1cmVWYWx1ZShvbGRPYmosIGZlYXR1cmUsIG5ld1ZhbHVlLCB0cnVlKTsKLQkJCX0KLQkJfQotCi0JfQotCi0JLyoqCi0JICogc2V0IHRoZSBuZXcgdmFsdWUgZnJvbSB0aGUgaW1wb3J0aW5nIGxpYnJhcnkgdG8gdGhlIG9sZCBvYmplY3QgaW4gdGhlCi0JICogYmFzZSBsaWJyYXJ5LiBpZiB0aGUgdmFsdWUgb3Igb25sZSBvZiB2YWx1ZXMgYXJlIG5vdCByZXBsYWNlYWJsZSwgc3VhY2gKLQkgKiBhcyBNZXRob2RMaWJyYXJ5LCBNZXRob2RQbHVnaW4sIE1ldGhvZFBhY2thZ2UsIGV0YywgdGhvc2UgdmFsdWVzIHNob3VsZAotCSAqIGJlIHN1YnN0aXR1ZWQgd2l0aCB0aGUgb25lIGluIHRoZSBvbGQgbGlicmFyeQotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogQHBhcmFtIGZlYXR1cmUKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKi8KLQkKLQotCXN0YXRpYyBNZXRob2RFbGVtZW50IG5ld0NvbnQgPSBudWxsOwotCXN0YXRpYyBNZXRob2RFbGVtZW50IG5ld0VsZW0gPSBudWxsOwotCXByaXZhdGUgdm9pZCBzZXRGZWF0dXJlVmFsdWUoTWV0aG9kRWxlbWVudCBlbGVtZW50LCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlLCBib29sZWFuIGRvRGVsZXRlKQotCXsJCQotCQlpZiAoIGNhbklnbm9yZShmZWF0dXJlKSApIHsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJYm9vbGVhbiBvbGROb3RpZnkgPSBlbGVtZW50LmVEZWxpdmVyKCk7Ci0JCXRyeQotCQl7Ci0JCQkvLyB0dXJuIG9mZiBub3RpZmljYXRpb25zIHRvIGF2b2lkIHBvc3NpYmxlIGRlYWRsb2NrIG9yIHRocmVhZCBpc3N1ZQotCQkJZWxlbWVudC5lU2V0RGVsaXZlcihmYWxzZSk7Ci0JCQkKLQkJCWlmICggY2FuUmVzZXQoZmVhdHVyZSkgKSB7Ci0JCQkJZWxlbWVudC5lU2V0KGZlYXR1cmUsIG5ld1ZhbHVlKTsKLQkJCX0KLQkJCWVsc2UgaWYgKCBmZWF0dXJlLmlzTWFueSgpICYmIG5ld1ZhbHVlIGluc3RhbmNlb2YgTGlzdCkKLQkJCXsKLQkJCQlMaXN0IG9sZFZhbHVlID0gKExpc3QpZWxlbWVudC5lR2V0KGZlYXR1cmUpOwotCQkJCWlmIChmZWF0dXJlLmdldE5hbWUoKS5lcXVhbHMoIm1ldGhvZEVsZW1lbnRQcm9wZXJ0eSIpKSB7CQkvLyROT04tTkxTLTEkCi0JCQkJCXNldE1lcEZlYXR1cmVWYWx1ZShlbGVtZW50LCBmZWF0dXJlLCBvbGRWYWx1ZSwgKExpc3QpIG5ld1ZhbHVlKTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlFbGVtZW50TGlzdERpZmYgZGlmZiA9IG5ldyBFbGVtZW50TGlzdERpZmYob2xkVmFsdWUsIChMaXN0KW5ld1ZhbHVlKTsKLQkJCQlpZiAoIGRvRGVsZXRlICYmIGRpZmYuZGVsZXRlZEl0ZW1zLnNpemUoKSA+IDAgKSB7Ci0JCQkJCW9sZFZhbHVlLnJlbW92ZUFsbChkaWZmLmRlbGV0ZWRJdGVtcyk7Ci0JCQkJCWxvZ1JlbW92ZWRFbGVtZW50cyhkaWZmLmRlbGV0ZWRJdGVtcyk7Ci0JCQkJCWlmICggZGVidWcgKSB7Ci0JCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIiAgRGVsZXRpbmcgZmVhdHVyZSB2YWx1ZSwgZmVhdHVyZTogIiArIGZlYXR1cmUuZ2V0TmFtZSgpICsgIiwgIGVsZW1lbnQ6ICIgIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJCQkrIExpYnJhcnlVdGlsLmdldFR5cGVOYW1lKGVsZW1lbnQpICsgIiwgdmFsdWVzOiAiICsgIGRpZmYuZGVsZXRlZEl0ZW1zKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJfQotCi0JCQkJaWYgKCBkaWZmLm5ld0l0ZW1zLnNpemUoKSA+IDAgKSB7CQkJCQkKLQkJCQkJLy8gc2F2ZSB0aGUgbmV3IGVsZW1lbnRzIGFuZCBmaXggdGhlIHJlZmVyZW5jZXMgbGF0ZXIKLQkJCQkJLy8gbm90ZTogdGhlIG5ld2x5IGFkZGVkIGZlYXR1cmUgdmFsdWVzIG1pZ2h0IG5vdCBiZSBSRUFMTFkKLQkJCQkJLy8gbmV3IGVsZW1lbnQgdG8gdGhlIGJhc2UgbGlicmFyeQotCQkJCQkvLyBpdCBtaWdodCBiZSBqdXN0IGEgbmV3bHkgYWRkZWQgcmVmZXJlbmNlLCBzbyBjaGVjayBhbmQKLQkJCQkJLy8gbWFrZSBzdXJlCi0JCQkJCS8vIGlmIGl0J3Mgb2xkIGVsZW1lbnQsIGRvIHJlcGxhY2UgYWdhaW4KLQkJCQkJZm9yICggSXRlcmF0b3IgaXRuID0gZGlmZi5uZXdJdGVtcy5pdGVyYXRvcigpOyBpdG4uaGFzTmV4dCgpOyApIHsKLQkJCQkJCU1ldGhvZEVsZW1lbnQgbmV3T2JqID0gKE1ldGhvZEVsZW1lbnQpaXRuLm5leHQoKTsKLQkJCQkJCQotCQkJCQkJLy8gb25seSBwcm9jZXNzIHRoZSBuZXcgb2JqZWN0IGlmIGl0J3Mgc2VsZWN0ZWQKLQkJCQkJCWlmICggaXNTZWxlY3RlZChuZXdPYmopICkgewotCQkJCQkJCU1ldGhvZEVsZW1lbnQgb2xkT2JqID0gZGlmZk1nci5nZXRFeGlzdGluZ0VsZW1lbnQobmV3T2JqLmdldEd1aWQoKSk7Ci0JCQkJCQkJaWYgKCBvbGRPYmogPT0gbnVsbCApIHsKLQkJCQkJCQkJb2xkVmFsdWUuYWRkKG5ld09iaik7Ci0JCQkJCQkJCS8vbG9nTmV3RWxlbWVudChuZXdPYmopOwotCQkJCQkJCQlsb2dOZXdFbGVtZW50VW5kZXJFeGlzdGluZ1BsdWdpbihuZXdPYmopOwotCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCW9sZFZhbHVlLmFkZChvbGRPYmopOwotCQkJCQkJCQlkb1JlcGxhY2VFbGVtZW50KG9sZE9iaiwgbmV3T2JqKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJCi0JCQkJCWlmICggZGVidWcgKSB7Ci0JCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIiAgQWRkaW5nIGZlYXR1cmUgdmFsdWUsIGZlYXR1cmU6ICIgKyBmZWF0dXJlLmdldE5hbWUoKSArICIsICBlbGVtZW50OiAiICAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCQkJKyBMaWJyYXJ5VXRpbC5nZXRUeXBlTmFtZShlbGVtZW50KSArICIsIHZhbHVlczogIiArICBkaWZmLm5ld0l0ZW1zKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJCQotCQkJCX0KLQotCQkJCWlmICggZGlmZi5vbGROZXdNYXAuc2l6ZSgpID4gMCApIHsKLQkJCQkJZm9yICggSXRlcmF0b3IgaXQgPSBkaWZmLm9sZE5ld01hcC5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTsgKSB7Ci0JCQkJCQlNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBpdC5uZXh0KCk7Ci0JCQkJCQlNZXRob2RFbGVtZW50IG9sZE9iaiA9IChNZXRob2RFbGVtZW50KWVudHJ5LmdldEtleSgpOwotCQkJCQkJCi0JCQkJCQkvLyBvbmx5IHByb2Nlc3MgdGhlIG5ldyBvYmplY3QgaWYgaXQncyBzZWxlY3RlZAotCQkJCQkJaWYgKCAhaXNTZWxlY3RlZChvbGRPYmopICkgewotCQkJCQkJCWNvbnRpbnVlOwotCQkJCQkJfQotCQkJCQkJCi0JCQkJCQlNZXRob2RFbGVtZW50IG5ld09iaiA9IChNZXRob2RFbGVtZW50KWVudHJ5LmdldFZhbHVlKCk7Ci0JCQkJCQlpZiAoIGNhblJlc2V0KG9sZE9iaikgKSB7Ci0JCQkJCQkJaWYgKCBkZWJ1ZyApIHsKLQkJCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCIgIFJlc2V0dGluZyBmZWF0dXJlIHZhbHVlLCBmZWF0dXJlOiAiICsgZmVhdHVyZS5nZXROYW1lKCkgKyAiLCAgZWxlbWVudDogIiAgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQkJCQkJKyBMaWJyYXJ5VXRpbC5nZXRUeXBlTmFtZShlbGVtZW50KSArICIsIHZhbHVlOiAiICsgIExpYnJhcnlVdGlsLmdldFR5cGVOYW1lKG9sZE9iaikpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJfQotCi0JCQkJCQkJRWNvcmVVdGlsLnJlcGxhY2UoZWxlbWVudCwgZmVhdHVyZSwgb2xkT2JqLCBuZXdPYmopOwotCQkJCQkJCWxvZ1Jlc2V0RWxlbWVudChuZXdPYmopOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlkb1JlcGxhY2VFbGVtZW50KG9sZE9iaiwgbmV3T2JqKTsgCi0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIGlmIChuZXdWYWx1ZSBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpCi0JCQl7Ci0JCQkJLy8gaWYgdGhlIG9sZCBhbmQgbmV3IGVsZW1lbnQgYXJlIHRoZSBzYW1lLAotCQkJCS8vIG9ubHkgcmVwbGFjZSB0aGUgZmVhdHVyZSB2YWx1ZQotCQkJCU1ldGhvZEVsZW1lbnQgbyA9IChNZXRob2RFbGVtZW50KWVsZW1lbnQuZUdldChmZWF0dXJlKTsKLQkJCQlNZXRob2RFbGVtZW50IG4gPSAoTWV0aG9kRWxlbWVudCluZXdWYWx1ZTsKLQkJCQkKLQkJCQkvLyBvbmx5IHByb2Nlc3MgdGhlIG5ldyBvYmplY3QgaWYgaXQncyBzZWxlY3RlZAotCQkJCWlmICggKG8gPT0gbnVsbCB8fCBpc1NlbGVjdGVkKG8pKSAmJiBpc1NlbGVjdGVkKG4pICkgewotCi0JCQkJCWlmICggZGVidWcgKSB7Ci0JCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIiAgUmVwbGFjaW5naW5nIGZlYXR1cmUgdmFsdWUsIGZlYXR1cmU6ICIgKyBmZWF0dXJlLmdldE5hbWUoKSArICIsICBlbGVtZW50OiAiICAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCQkJKyBMaWJyYXJ5VXRpbC5nZXRUeXBlTmFtZShlbGVtZW50KSArICIsIHZhbHVlOiAiICsgIExpYnJhcnlVdGlsLmdldFR5cGVOYW1lKG8pKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCi0JCQkJCWlmICggbmV3VmFsdWUgaW5zdGFuY2VvZiBDb250ZW50RGVzY3JpcHRpb24gKSB7Ci0JCQkJCQkvLyBhbHdheXMgcmVwbGFjZSBjb250ZW50IGRlc2NyaXB0aW9uIChub3QgcmVzZXQpIHRvCi0JCQkJCQkvLyByZXNlcnZlIHRoZSBleGlzdGluZyByZXNvdXJjZSAoeG1pIGZpbGUpCi0JCQkJCQkvLyBzaW5jZSB0aGUgY29udGVudERlc2NyaXB0aW9uIGlzIHVuaXF1ZSB0aGUgYSBtZXRob2QKLQkJCQkJCS8vIGVsZW1lbnQsIHNvIHdlIGRvbid0IG5lZWQgdG8gY29tcGFyZSB0aGUgZ3VpZAotCQkJCQkJCQkJCQkJCi0JCQkJCQkvLyBpZiBib3RoIG9iamVjdCBoYXMgbm8gY29udGFpbmVyLCB0aGVyZSBpcyBubyBzdWNoCi0JCQkJCQkvLyBkZXNjcmlwdGlvbiwgaWdub3JlIGl0Ci0JCQkJCQlpZiAoIG8uZUNvbnRhaW5lcigpICE9IG51bGwgfHwgbi5lQ29udGFpbmVyKCkgIT0gbnVsbCApIHsKLQkJCQkJCQlpZiAoIG8uZUNvbnRhaW5lcigpID09IG51bGwgKSB7Ci0JCQkJCQkJCWVsZW1lbnQuZVNldChmZWF0dXJlLCBvKTsKLQkJCQkJCQl9Ci0JCQkJCQkJZG9SZXBsYWNlRWxlbWVudChvLCBuKTsJCQkJCQkKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQkvLyBpZiB0aGUgZWxlbWVudCBjYW4gYmUgcmVwbGFjZWQsIHN1Y2ggYXMgZm9yCi0JCQkJCS8vIENvbnRlbnREZXNjcmlwdGlvbiBlbGVtZW50Ci0JCQkJCS8vIHNldCB0aGUgdmFsdWUgZGlyZWN0bHkKLQkJCQkJZWxzZSBpZiAoIGNhblJlc2V0KG4pICkgewotCQkJCQkJZWxlbWVudC5lU2V0KGZlYXR1cmUsIG5ld1ZhbHVlKTsKLQkJCQkJCS8vbG9nTmV3RWxlbWVudChuKTsKLQkJCQkJCWxvZ05ld0VsZW1lbnRVbmRlckV4aXN0aW5nUGx1Z2luKG4pOwotCQkJCQl9Ci0JCQkJCWVsc2UKLQkJCQkJewotCQkJCQkJaWYgKCBvICE9IG51bGwgJiYgbiAhPSBudWxsICYmIG8uZ2V0R3VpZCgpLmVxdWFscyhuLmdldEd1aWQoKSkgKSB7Ci0JCQkJCQkJIGRvUmVwbGFjZUVsZW1lbnQobywgbik7Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIHsJCQkJCQkJCQkJCQkJCi0JCQkJCQkJcmVnaXN0ZXJTZXRFbGVtZW50KGVsZW1lbnQsIGZlYXR1cmUsIG5ld1ZhbHVlKTsKLQkJCQkJCQkKLQkJCQkJCQllbGVtZW50LmVTZXQoZmVhdHVyZSwgbmV3VmFsdWUpOwotCQkJCQkJCS8vbG9nTmV3RWxlbWVudChuKTsKLQkJCQkJCQlsb2dOZXdFbGVtZW50VW5kZXJFeGlzdGluZ1BsdWdpbihuKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWVsc2UgaWYgKCBmZWF0dXJlID09IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE5hbWVkRWxlbWVudF9OYW1lKCkgKSB7Ci0JCQkJLy8gY2hlY2sgZGlmZmVyZW5jZSBuYW1lLCBpZiByZXBsYWNlLCBuZWVkIHRvIHJlbmFtZSByZXNvdXJjZXMgaWYgaWYgaGFzIGl0J3Mgb3duIHJlc291cmNlCi0JCQkJLy8gbGlrZSBjb250ZW50IGVsZW1lbnRzLCBwbHVnaW5zLCBjb25maWd1aXJhdGlvbnMsIGFuZCBwcm9jZXNzIGNvbXBvbmVudHMJCQkJCQotCQkJCWlmICghIChuZXdWYWx1ZSBpbnN0YW5jZW9mIFN0cmluZykpIHsKLQkJCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JCQkJfQotCQkJCVN0cmluZyBvbGROYW1lID0gKFN0cmluZyllbGVtZW50LmVHZXQoZmVhdHVyZSk7Ci0JCQkJaWYgKCFuZXdWYWx1ZS5lcXVhbHMob2xkTmFtZSkpIHsJCQkJCQotCQkJCQllbnN1cmVVbmlxdWVOYW1lRm9yRXhpc3RpbmdFbGVtZW50KGVsZW1lbnQsIG9sZE5hbWUsIChTdHJpbmcpIG5ld1ZhbHVlLCByZW5hbWVFbGVtZW50TWFwKTsJCQkJCQkJCQkJCi0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQllbGVtZW50LmVTZXQoZmVhdHVyZSwgbmV3VmFsdWUpOwotCQkJCQotCQkJCS8vIHNjYW4gYW5kIGNvcHkgdGhlIHJlc291cmNlcwotCQkJCXNjYW5SZXNvdXJjZXMoZWxlbWVudCwgZmVhdHVyZSwgbmV3VmFsdWUpOwotCQkJfQotCi0JCX0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJZXgucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQkJZmluYWxseQotCQl7Ci0JCQllbGVtZW50LmVTZXREZWxpdmVyKG9sZE5vdGlmeSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0TWVwRmVhdHVyZVZhbHVlKE1ldGhvZEVsZW1lbnQgZWxlbWVudCwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIExpc3Qgb2xkVmFsdWUsIExpc3QgbmV3VmFsdWUpIHsKLQkJaW50IHN6ID0gbmV3VmFsdWUuc2l6ZSgpOwotCQlpZiAob2xkVmFsdWUuc2l6ZSgpID09IHN6KSB7Ci0JCQlpZiAoc3ogPT0gMCkgewotCQkJCXJldHVybjsKLQkJCX0KLQkJCWJvb2xlYW4gc2FtZSA9IHRydWU7Ci0JCQlmb3IgKGludCBpPTA7IGkgPCBzejsgaSsrKSB7Ci0JCQkJTWV0aG9kRWxlbWVudFByb3BlcnR5IG9sZE1lcCA9IChNZXRob2RFbGVtZW50UHJvcGVydHkpIG9sZFZhbHVlLmdldChpKTsKLQkJCQlNZXRob2RFbGVtZW50UHJvcGVydHkgbmV3TWVwID0gKE1ldGhvZEVsZW1lbnRQcm9wZXJ0eSkgbmV3VmFsdWUuZ2V0KGkpOwotCQkJCWlmICghIG9sZE1lcC5nZXROYW1lKCkuZXF1YWxzKG5ld01lcC5nZXROYW1lKCkpIHx8Ci0JCQkJCSEgb2xkTWVwLmdldFZhbHVlKCkuZXF1YWxzKG5ld01lcC5nZXRWYWx1ZSgpKSkgewotCQkJCQlzYW1lID0gZmFsc2U7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJCWlmIChzYW1lKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQkJCQkJCi0JCX0KLQkJb2xkVmFsdWUucmVtb3ZlQWxsKG9sZFZhbHVlKTsKLQkJb2xkVmFsdWUuYWRkQWxsKG5ld1ZhbHVlKTsJCQotCX0KLQotCXByaXZhdGUgdm9pZCBzY2FuUmVzb3VyY2VzKE1ldGhvZEVsZW1lbnQgZWxlbWVudCwgYm9vbGVhbiByZWN1cnNpdmUpIHsKLQotCQlpZiAoIGVsZW1lbnQgPT0gbnVsbCApIHsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJTGlzdCBmZWF0dXJlcyA9IExpYnJhcnlVdGlsLmdldFN0cnVjdHVyYWxGZWF0dXJlcyhlbGVtZW50KTsKLS8vCQlMaXN0IHByb3BlcnRpZXMgPSBlbGVtZW50LmdldEluc3RhbmNlUHJvcGVydGllcygpOwotCQlpZiAoZmVhdHVyZXMgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmZWF0dXJlcy5zaXplKCk7IGkrKykgewotCQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgZmVhdHVyZXMuZ2V0KGkpOwotCQkJCWlmICggIShmZWF0dXJlIGluc3RhbmNlb2YgRUF0dHJpYnV0ZSkgKSB7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQotCQkJCU9iamVjdCB2YWx1ZSA9IGVsZW1lbnQuZUdldChmZWF0dXJlKTsKLQkJCQlzY2FuUmVzb3VyY2VzKGVsZW1lbnQsIGZlYXR1cmUsIHZhbHVlKTsKLQkJCX0KLQkJfQotCQkKLQkJaWYgKCAhcmVjdXJzaXZlICkgewotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gZWxlbWVudC5lQWxsQ29udGVudHMoKTsgaXQuaGFzTmV4dCgpOyApIHsKLQkJCUVPYmplY3Qgb2JqID0gKEVPYmplY3QpaXQubmV4dCgpOwotCQkJCi0JCQlpZiAob2JqIGluc3RhbmNlb2YgTWV0aG9kTGlicmFyeQotCQkJCQl8fCBvYmogaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4gCi0JCQkJCXx8IG9iaiBpbnN0YW5jZW9mIE1ldGhvZFBhY2thZ2UgCi0JCQkJCXx8IG9iaiBpbnN0YW5jZW9mIE1ldGhvZENvbmZpZ3VyYXRpb24pIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCQotCQkJaWYgKCBvYmogaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50ICkgewotCQkJCXNjYW5SZXNvdXJjZXMoKE1ldGhvZEVsZW1lbnQpb2JqLCBmYWxzZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHNjYW5SZXNvdXJjZXMoTWV0aG9kRWxlbWVudCBlbGVtZW50LCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCWRpYWdyYW1IYW5kbGVyLnJlZ2lzdGVyRWxlbWVudChlbGVtZW50KTsKLQkJCi0JCS8vIHNjYW4gdGhlIHJlc291cmNlcwotCQlpZiAoIGZlYXR1cmUgPT0gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0R3VpZGFuY2VEZXNjcmlwdGlvbl9BdHRhY2htZW50cygpICkgewotCQkJLy8gcHJvY2VzcyB0aGUgYXR0YWNobWVudHMKLQkJCVN0cmluZyB1cmxzID0gKFN0cmluZyluZXdWYWx1ZTsKLQkJCWlmICggKHVybHMgIT0gbnVsbCkgJiYgdXJscy5sZW5ndGgoKSAhPSAwICkgewotCQkJCVN0cmluZ1Rva2VuaXplciBzdCA9IG5ldyBTdHJpbmdUb2tlbml6ZXIodXJscywgInwiKTsgLy8gdGhpcyBpcyBoYXJkY29kZWQgc29tZWhvdyAvLyROT04tTkxTLTEkCi0JCQkJd2hpbGUgKHN0Lmhhc01vcmVUb2tlbnMoKSApIHsKLQkJCQkJU3RyaW5nIHVybCA9IHN0Lm5leHRUb2tlbigpOwotCQkJCQlyZXNTY2FubmVyLmNvcHlSZXNvdXJjZSAoZWxlbWVudCwgdXJsKTsKLQkJCQl9CQkJCQkJCi0JCQl9Ci0JCX0gZWxzZSBpZiAoIG5ld1ZhbHVlIGluc3RhbmNlb2YgU3RyaW5nICkgewotCQkJcmVzU2Nhbm5lci5zY2FuKGVsZW1lbnQsIG5ld1ZhbHVlLnRvU3RyaW5nKCkpOwotCQl9IGVsc2UgaWYgKG5ld1ZhbHVlIGluc3RhbmNlb2YgVVJJICkgewotCQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IFVtYVV0aWwuZ2V0TWV0aG9kUGx1Z2luKGVsZW1lbnQpOwotCQkJcmVzU2Nhbm5lci5jb3B5UmVzb3VyY2UgKCAoKFVSSSluZXdWYWx1ZSkuZ2V0UGF0aCgpLCBwbHVnaW4pOwotCQl9Ci0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGRvQWRkKEVPYmplY3Qgb3duZXIsIE1ldGhvZEVsZW1lbnQgbmV3T2JqKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJaWYgKCBkZWJ1ZyApIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiQWRkaW5nIGVsZW1lbnQgIiArIExpYnJhcnlVdGlsLmdldFR5cGVOYW1lKChNZXRob2RFbGVtZW50KW5ld09iaikpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQkvLyB0aGUgb3duZXIgY2FuIG9ubHkgYmUgbGlicmFyeSBhbmQgcGFja2FnZQotCQlpZiAob3duZXIgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQllbnN1cmVVbmlxdWVOYW1lKG93bmVyLCBuZXdPYmosIHJlbmFtZUVsZW1lbnRNYXApOwotCQkKLQkJYm9vbGVhbiBlcnJvciA9IGZhbHNlOwotCQkKLQkJaWYgKG93bmVyIGluc3RhbmNlb2YgTWV0aG9kTGlicmFyeSkgewkJCQotCQkJLy8gY2FuIGJlIGNvbmZpZ3VyYXRpb24gb3IgcGx1Z2luCi0JCQlpZiAobmV3T2JqIGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luKSB7Ci0JCQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IChNZXRob2RQbHVnaW4pbmV3T2JqOwkJCQkKLQkJCQkKLQkJCQljaGVja01vZGlmaWVkRmlsZXMoKTsJCQkJCi0JCQkJZXJyb3IgPSAhIGZpbGVDaGVja2VkT3V0U3RhdHVzLmlzT0soKTsJCQkJCi0JCQkJCQkJCQotCQkJCS8vIGRvbid0IGludGl0aWFsaXplIHRoZSBzdG9yYWdlIHNpbmNlIHRoaXMgd2lsbCByZWNyZWF0ZSB0aGUgZ2xvYmFsIHBhY2thZ2VzCi0JCQkJLy8gYW5kIHN1Y2ggY2F1c2luZyB0d28gc2V0IG9mIGdsb2JhbCBwYWNrYWdlcwotCQkJCS8vIDE0NTg1MCAtIEltcG9ydCBDb25maWd1cmF0aW9uOiBDUC9EUHMgZGlkIG5vdCBzaG93biBpbiBhdXRoZXJpbmcKLQkJCQkvLyBNb2RlbFN0b3JhZ2UuaW5pdGlhbGl6ZShwbHVnaW4pOwotCQkJCS8vIE5PLCBzaW5jZSB0aGUgZ2xvYmFsIHBhY2thZ2VzIGFyZSBhbHJlYWR5IGNyZWF0ZWQKLQkJCQlpZiAoIWVycm9yKSB7Ci0JCQkJCSgoTWV0aG9kTGlicmFyeSlvd25lcikuZ2V0TWV0aG9kUGx1Z2lucygpLmFkZChwbHVnaW4pOwotCQkJCQl0cnkgewotCQkJCQkJTXVsdGlGaWxlWE1JSGVscGVySW1wbC51bm1vZGlmaWVkR2V0VmFsdWUgPSB0cnVlOwotCQkJCQkJTGlicmFyeVV0aWwuc2F2ZUxpYnJhcnkoKE1ldGhvZExpYnJhcnkpb3duZXIsIGZhbHNlLCBmYWxzZSk7Ci0JCQkJCX0gZmluYWxseSB7Ci0JCQkJCQlNdWx0aUZpbGVYTUlIZWxwZXJJbXBsLnVubW9kaWZpZWRHZXRWYWx1ZSA9IGZhbHNlOwotCQkJCQl9Ci0JCQkJfQotCQkJCQkJCQkKLQkJCX0gZWxzZSBpZiAobmV3T2JqIGluc3RhbmNlb2YgTWV0aG9kQ29uZmlndXJhdGlvbiApIHsKLQkJCQljaGVja01vZGlmaWVkRmlsZXMoKTsJCQkJCi0JCQkJZXJyb3IgPSBjb25maWdGb2xkZXJFcnJvciB8fCAhIGZpbGVDaGVja2VkT3V0U3RhdHVzLmlzT0soKTsKLQkJCQlpZiAoIWVycm9yKSB7Ci0JCQkJCU1ldGhvZExpYnJhcnkgbGliID0gKE1ldGhvZExpYnJhcnkpb3duZXI7Ci0JCQkJCWxpYi5nZXRQcmVkZWZpbmVkQ29uZmlndXJhdGlvbnMoKS5hZGQoKE1ldGhvZENvbmZpZ3VyYXRpb24pbmV3T2JqKTsKLQkJCQkJSUxpYnJhcnlQZXJzaXN0ZXIgcGVyc2lzdGVyID0gKChNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwpIGxpYi5lUmVzb3VyY2UoKS5nZXRSZXNvdXJjZVNldCgpKS5nZXRQZXJzaXN0ZXIoKTsKLQkJCQkJaWYgKHBlcnNpc3RlciBpbnN0YW5jZW9mIElGaWxlQmFzZWRMaWJyYXJ5UGVyc2lzdGVyKSB7Ci0JCQkJCQlJRmlsZUJhc2VkTGlicmFyeVBlcnNpc3RlciBpcCA9IChJRmlsZUJhc2VkTGlicmFyeVBlcnNpc3RlcikgcGVyc2lzdGVyOwotCQkJCQkJRmlsZSBjb25maWdGb2xkZXIgPSBpcC5nZXREZWZhdWx0TWV0aG9kQ29uZmlndXJhdGlvbkZvbGRlcihsaWIpOwotCQkJCQkJaWYgKGNvbmZpZ0ZvbGRlciAhPSBudWxsKSB7Ci0JCQkJCQkJaXAuc2V0RGVmYXVsdE1ldGhvZENvbmZpZ3VyYXRpb25Gb2xkZXIobGliLCBjb25maWdGb2xkZXIpOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQllcnJvciA9IHRydWU7Ci0JCQkJCQkJY29uZmlnRm9sZGVyRXJyb3IgPSB0cnVlOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWlmICghIGVycm9yKSB7Ci0JCQkJCQl0cnkgewotCQkJCQkJCU11bHRpRmlsZVhNSUhlbHBlckltcGwudW5tb2RpZmllZEdldFZhbHVlID0gdHJ1ZTsKLQkJCQkJCQlMaWJyYXJ5VXRpbC5zYXZlTGlicmFyeSgoTWV0aG9kTGlicmFyeSlvd25lciwgZmFsc2UsIGZhbHNlKTsKLQkJCQkJCX0gZmluYWxseSB7Ci0JCQkJCQkJTXVsdGlGaWxlWE1JSGVscGVySW1wbC51bm1vZGlmaWVkR2V0VmFsdWUgPSBmYWxzZTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJZXJyb3IgPSB0cnVlOwkJCQotCQkJfQotCQl9IGVsc2UgaWYgKCAob3duZXIgaW5zdGFuY2VvZiBNZXRob2RQYWNrYWdlKSAKLQkJCQkmJiAob3duZXIuZUNvbnRhaW5lcigpICE9IG51bGwpIAotCQkJCSYmIChuZXdPYmogaW5zdGFuY2VvZiBNZXRob2RQYWNrYWdlKSApIHsKLQkJCSgoTWV0aG9kUGFja2FnZSlvd25lcikuZ2V0Q2hpbGRQYWNrYWdlcygpLmFkZCgoTWV0aG9kUGFja2FnZSluZXdPYmopOwotCQl9IGVsc2UgewotCQkJZXJyb3IgPSB0cnVlOwotCQl9Ci0JCQkKLQkJaWYgKCBlcnJvciApIHsKLQkJCVN0cmluZyBvd25lclN0ciA9IG93bmVyIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCA/IAotCQkJCQlMaWJyYXJ5VXRpbC5nZXRUeXBlTmFtZSgoTWV0aG9kRWxlbWVudClvd25lcikgOiBvd25lci50b1N0cmluZygpOwotCQkJCQkKLQkJCVN0cmluZyBtc2cgPSAiY2FuJ3QgYWRkICIgKyBMaWJyYXJ5VXRpbC5nZXRUeXBlTmFtZShuZXdPYmopIC8vJE5PTi1OTFMtMSQKLQkJCSsgIiB0byAiICsgb3duZXJTdHI7IC8vJE5PTi1OTFMtMSQKLQkJCQotCQkJSW1wb3J0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihtc2cpOyAKLQkJCWlmICggZGVidWcgKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKG1zZyk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlsb2dOZXdFbGVtZW50KG5ld09iaik7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gY2hlY2tNb2RpZmllZENvbmZpZ3MoTWV0aG9kUGx1Z2luIHBsdWdpbikgewotCQlMaXN0IGNvbmZpZ0xpc3QgPSBMaWJyYXJ5VXRpbC5nZXRBc3NvY2lhdGVkQ29uZmlndXJhdGlvbnMocGx1Z2luKTsKLQkJTGlzdCBiYXNlQ29uZmlncyA9IGJhc2VMaWJyYXJ5LmdldFByZWRlZmluZWRDb25maWd1cmF0aW9ucygpOwotCQlNYXAgYmFzZUNvbmZpZ01hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCWZvciAoaW50IGk9MDsgaTxiYXNlQ29uZmlncy5zaXplKCk7IGkrKykgewotCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSAoTWV0aG9kQ29uZmlndXJhdGlvbikgYmFzZUNvbmZpZ3MuZ2V0KGkpOwotCQkJYmFzZUNvbmZpZ01hcC5wdXQoY29uZmlnLmdldEd1aWQoKSwgY29uZmlnKTsKLQkJfQotCQlmaW5hbCBMaXN0IG1vZGlmaWVkRmlsZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoaW50IGk9MDsgaTxjb25maWdMaXN0LnNpemUoKTsgaSsrKSB7Ci0JCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IChNZXRob2RDb25maWd1cmF0aW9uKSBjb25maWdMaXN0LmdldChpKTsKLQkJCWNvbmZpZyA9IChNZXRob2RDb25maWd1cmF0aW9uKSBiYXNlQ29uZmlnTWFwLmdldChjb25maWcuZ2V0R3VpZCgpKTsKLQkJCWlmIChjb25maWcgIT0gbnVsbCkgewotCQkJCVJlc291cmNlIHJlcyA9IGNvbmZpZy5lUmVzb3VyY2UoKTsKLQkJCQlpZiAocmVzICE9IG51bGwpIHsKLQkJCQkJbW9kaWZpZWRGaWxlcy5hZGQocmVzLmdldFVSSSgpLnRvRmlsZVN0cmluZygpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJU2FmZVVwZGF0ZUNvbnRyb2xsZXIuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCWZpbGVDaGVja2VkT3V0U3RhdHVzID0gRmlsZU1vZGlmeUNoZWNrZXIuY2hlY2tNb2RpZnkobW9kaWZpZWRGaWxlcyk7Ci0JCQl9Ci0JCX0pOwotCQlmaWxlQ2hlY2tPdXRFcnJvcigpOwotCQkKLQkJcmV0dXJuIGZpbGVDaGVja2VkT3V0U3RhdHVzLmlzT0soKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZG9JbnRlZ3JpdHlDaGVjaygpCi0JewkJCi0JCS8vIG5vdyB0aGUgbmV3bHkgYWRkZWQgZWxlbWVudHMgbWF5IGhhdmUgZmVhdHVyZSB2YWx1ZSBlbGVtZW50IHRoYXQKLQkJLy8gc3RpbGwgcG9pbnRpbmcgdG8gdGhlIGltcG9ydGluZyBsaWJyYXJ5Ci0JCS8vIHdlIG5lZWQgdG8gcmVwbGFjZSB0aG9zZSB3aXRoIHRoZSBvbmUgaW4gdGhlIGJhc2UgbGlicmFyeQotCQl3aGlsZSAobmV3RWxlbWVudHMuc2l6ZSgpID4gMCkgewotCQkJTWV0aG9kRWxlbWVudCBuZXdPYmogPSAoTWV0aG9kRWxlbWVudCluZXdFbGVtZW50cy5yZW1vdmUoMCk7Ci0JCQl0cnkgewotCQkJCWlmICggbmV3T2JqIGluc3RhbmNlb2YgRGlhZ3JhbUVsZW1lbnQgKSB7Ci0JCQkJCWZpeERpYWdyYW0oKERpYWdyYW1FbGVtZW50KW5ld09iaik7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJZml4TmV3RWxlbWVudFJlZmVyZW5jZXMobmV3T2JqKTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCWlmIChkZWJ1ZykgewotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkV4Y2VwdGlvbiB3aGlsZSBmaXhpbmcgbmV3IGVsZW1lbnQgIiArIExpYnJhcnlVdGlsLmdldFR5cGVOYW1lKG5ld09iaikpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9Ci0JCX0KLQkJCi0JCS8vIHRoZSBjb25maWd1cmF0aW9ucyBuZWVkcyB0byBiZSBmaXhlZAotCQlMaXN0IGNvbmZpZ3MgPSBiYXNlTGlicmFyeS5nZXRQcmVkZWZpbmVkQ29uZmlndXJhdGlvbnMoKTsKLQkJZm9yICggSXRlcmF0b3IgaXQgPSBjb25maWdzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTsgKQotCQl7Ci0JCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IChNZXRob2RDb25maWd1cmF0aW9uKWl0Lm5leHQoKTsKLQkJCUxpYnJhcnlVdGlsLnZhbGlkYXRlTWV0aG9kQ29uZmlndXJhdGlvbihudWxsLCBjb25maWcpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBMaXN0IHByb2Nlc3NlZE5ld0VsZW1lbnRzID0gbmV3IEFycmF5TGlzdCgpOwotCQotCQotCQotCS8qKgotCSAqIGl0ZXJhdGUgYWxsIGZlYXR1cmVzLCBpZiB0aGUgZmVhdHVyZSB2YWx1ZSByZWZlcmVuY2VzIGFuIGVsZW1lbnQgd2hpY2ggaXMKLQkgKiBhbiBvbGQgZWxlbWVudCwgcmVwbGFjZSBpdCB3aXRoIHRoZSBvbGQgZWxlbWVudC4gaWYgdGhlIGVsZW1lbnQgaXMgbmV3LAotCSAqIGl0ZXJhdGUgaXQncyBjb250YWlubWVudCBlbGVtZW50cwotCSAqIAotCSAqIEBwYXJhbSBuZXdPYmoKLQkgKi8KLQlwcml2YXRlIHZvaWQgZml4TmV3RWxlbWVudFJlZmVyZW5jZXMoTWV0aG9kRWxlbWVudCBuZXdPYmopIHsKLQkJaWYgKCBwcm9jZXNzZWROZXdFbGVtZW50cy5jb250YWlucyhuZXdPYmopICkgewotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlwcm9jZXNzZWROZXdFbGVtZW50cy5hZGQobmV3T2JqKTsKLQkJCi0JCWlmICggZGVidWcgKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkZpeGluZyBlbGVtZW50ICIgKyBMaWJyYXJ5VXRpbC5nZXRUeXBlTmFtZShuZXdPYmopKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCQotCQlMaXN0IGZlYXR1cmVzID0gTGlicmFyeVV0aWwuZ2V0U3RydWN0dXJhbEZlYXR1cmVzKG5ld09iaik7Ci0vLwkJTGlzdCBwcm9wZXJ0aWVzID0gbmV3T2JqLmdldEluc3RhbmNlUHJvcGVydGllcygpOwotCQlpZiAoZmVhdHVyZXMgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmZWF0dXJlcy5zaXplKCk7IGkrKykgewotCQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgZmVhdHVyZXMuZ2V0KGkpOwotCQkJCU9iamVjdCB2YWx1ZSA9IG5ld09iai5lR2V0KGZlYXR1cmUpOwotCi0JCQkJaWYgKCB2YWx1ZSBpbnN0YW5jZW9mIExpc3QpIHsKLQkJCQkJCi0JCQkJCS8vIGZpeGluZyB0aGUgZmVhdHVyZSB2YWx1ZSBtYXkgY2F1c2UgdGhlIGxpc3QgdG8gY2hhbmdlCi0JCQkJCS8vIGl0ZXJhdGUgb24gYSBuZXcgY29weSB0byBhdm9pZAotCQkJCQkvLyBDb25jdXJyZW50TW9kaWZpY2F0aW9uRXhjZXB0aW9uCi0JCQkJCWZvciAoSXRlcmF0b3IgaXQ9IG5ldyBBcnJheUxpc3QoKChMaXN0KXZhbHVlKSkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOyApIHsKLQkJCQkJCU9iamVjdCBvID0gaXQubmV4dCgpOwotCQkJCQkJZml4TmV3RWxlbWVudEZlYXR1cmVWYWx1ZShuZXdPYmosIGZlYXR1cmUsIG8pOwotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJZml4TmV3RWxlbWVudEZlYXR1cmVWYWx1ZShuZXdPYmosIGZlYXR1cmUsIHZhbHVlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0JCi0JfQotCQotCQotCXByaXZhdGUgdm9pZCBmaXhEaWFncmFtKERpYWdyYW1FbGVtZW50IG5ld09iaikgewkJCi0KLQkJaWYgKCBwcm9jZXNzZWROZXdFbGVtZW50cy5jb250YWlucyhuZXdPYmopICkgewotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlwcm9jZXNzZWROZXdFbGVtZW50cy5hZGQobmV3T2JqKTsKLQkJCi0JCWlmICggZGVidWcgKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkZpeGluZyBkaWFncmFtIGVsZW1lbnQgIiArIExpYnJhcnlVdGlsLmdldFR5cGVOYW1lKG5ld09iaikpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJCi0JCUxpc3QgZmVhdHVyZXMgPSBMaWJyYXJ5VXRpbC5nZXRTdHJ1Y3R1cmFsRmVhdHVyZXMobmV3T2JqKTsKLS8vCQlMaXN0IHByb3BlcnRpZXMgPSBuZXdPYmouZ2V0SW5zdGFuY2VQcm9wZXJ0aWVzKCk7Ci0JCWlmIChmZWF0dXJlcyAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGZlYXR1cmVzLnNpemUoKTsgaSsrKSB7Ci0JCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSAoRVN0cnVjdHVyYWxGZWF0dXJlKSBmZWF0dXJlcy5nZXQoaSk7Ci0JCQkJT2JqZWN0IHZhbHVlID0gbmV3T2JqLmVHZXQoZmVhdHVyZSk7Ci0KLQkJCQlpZiAoIHZhbHVlIGluc3RhbmNlb2YgTGlzdCkgewotCQkJCQkKLQkJCQkJLy8gZml4aW5nIHRoZSBmZWF0dXJlIHZhbHVlIG1heSBjYXVzZSB0aGUgbGlzdCB0byBjaGFuZ2UKLQkJCQkJLy8gaXRlcmF0ZSBvbiBhIG5ldyBjb3B5IHRvIGF2b2lkCi0JCQkJCS8vIENvbmN1cnJlbnRNb2RpZmljYXRpb25FeGNlcHRpb24KLQkJCQkJZm9yIChJdGVyYXRvciBpdD0gbmV3IEFycmF5TGlzdCgoKExpc3QpdmFsdWUpKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7ICkgewotCQkJCQkJT2JqZWN0IG8gPSBpdC5uZXh0KCk7Ci0JCQkJCQlpZiAoIG8gaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50ICkgewotCQkJCQkJCWlmICggZmVhdHVyZSA9PSBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRVTUFTZW1hbnRpY01vZGVsQnJpZGdlX0VsZW1lbnQoKSApIHsKLQkJCQkJCQkJZml4TmV3RWxlbWVudEZlYXR1cmVWYWx1ZShuZXdPYmosIGZlYXR1cmUsIG8pOwotCQkJCQkJCX0gZWxzZSBpZiAoIChvIGluc3RhbmNlb2YgRGlhZ3JhbUVsZW1lbnQpICkgewotCQkJCQkJCQlmaXhEaWFncmFtKChEaWFncmFtRWxlbWVudClvKTsKLQkJCQkJCQl9IAotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfSBlbHNlIGlmICggdmFsdWUgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50ICkgewotCQkJCQlpZiAoIGZlYXR1cmUgPT0gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VU1BU2VtYW50aWNNb2RlbEJyaWRnZV9FbGVtZW50KCkgKSB7Ci0JCQkJCQlmaXhOZXdFbGVtZW50RmVhdHVyZVZhbHVlKG5ld09iaiwgZmVhdHVyZSwgdmFsdWUpOwotCQkJCQl9IGVsc2UgaWYgKCAodmFsdWUgaW5zdGFuY2VvZiBEaWFncmFtRWxlbWVudCkgKSB7Ci0JCQkJCQlmaXhEaWFncmFtKChEaWFncmFtRWxlbWVudCl2YWx1ZSk7Ci0JCQkJCX0gCi0JCQkJfQotCQkJfQotCQl9CQotCX0KLQkKLQkvKioKLQkgKiBjaGVjayBpZiB0aGUgdmFsdWUgaXMgYW4gb2xkIGVsZW1lbnQgaW4gdGhlIGJhc2UsIGlmIHllcywgcmVwbGFjZSBpdCB3aXRoCi0JICogdGhlIG9sZCBvbmUgaWYgaXQncyBuZXcsIGl0ZXJhdGUgaXQncyBmZWF0dXJlIHZhbHVlCi0JICogCi0JICogQHBhcmFtIGZlYXR1cmUKLQkgKiBAcGFyYW0gb2JqCi0JICovCi0JcHJpdmF0ZSB2b2lkIGZpeE5ld0VsZW1lbnRGZWF0dXJlVmFsdWUoTWV0aG9kRWxlbWVudCBlbGVtZW50LCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgT2JqZWN0IG9iaikgewotCQlpZiAoICEob2JqIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCWlmICggZGVidWcgKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oImZpeGluZyBlbGVtZW50IGZlYXR1cmUgdmFsdWUgIiArIExpYnJhcnlVdGlsLmdldFR5cGVOYW1lKGVsZW1lbnQpICsgIiwgZmVhdHVyZT0iICsgZmVhdHVyZS5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCi0JCWJvb2xlYW4gb2xkTm90aWZ5ID0gZWxlbWVudC5lRGVsaXZlcigpOwotCQl0cnkKLQkJewotCQkJZWxlbWVudC5lU2V0RGVsaXZlcihmYWxzZSk7Ci0JCQkKLQkJCU1ldGhvZEVsZW1lbnQgbmV3T2JqID0gKE1ldGhvZEVsZW1lbnQpb2JqOwotCQkJTWV0aG9kRWxlbWVudCBvbGRPYmogPSBnZXRSZXBsYWNlZChuZXdPYmouZ2V0R3VpZCgpKTsKLQkJCWlmICggb2xkT2JqID09IG51bGwgKSB7Ci0JCQkJLy8gZ2V0IGV4aXN0aW5nIGVsZW1lbnQsIGZvciBleGFtcGxlLCB0aGUgZ2xvYmFsIHBhY2thZ2VzIGluIHRoZQotCQkJCS8vIGNvbmZpZ3VyYXRpb24gZmVhdHVyZQotCQkJCW9sZE9iaiA9IGRpZmZNZ3IuZ2V0RXhpc3RpbmdFbGVtZW50KG5ld09iai5nZXRHdWlkKCkpOwotCQkJfQotCQkJCi0JCQlpZiAoIG9sZE9iaiA9PSBudWxsICkgewotCQkJCS8vIGl0J3MgYSBuZXcgb25lCi0JCQkJZml4TmV3RWxlbWVudFJlZmVyZW5jZXMobmV3T2JqKTsKLQkJCX0gZWxzZSB7Ci0JCQkJCi0JCQkJdHJ5IHsKLQkJCQkJLy8gcmVwbGFjZSB0aGUgbmV3T2JqIHdpdGggdGhlIG9sZE9iagotCQkJCQlFY29yZVV0aWwucmVwbGFjZShlbGVtZW50LCBmZWF0dXJlLCBuZXdPYmosIG9sZE9iaik7IAotCQkJCX0KLQkJCQljYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCS8vIGlmIHJlcGxhY2UgZmFpbGVkLCByZW1vdmUgdGhlIGZlYXR1cmUKLQkJCQkJRWNvcmVVdGlsLnJlbW92ZShlbGVtZW50LCBmZWF0dXJlLCBuZXdPYmopOyAKLQkJCQkJaWYgKGRlYnVnICkgewotCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJSZXBsYWNlaW5nIGZlYXR1cmUgdmFsdWUgZmFpbGVkIGZvciBlbGVtZW50IFsiICAvLyROT04tTkxTLTEkCi0JCQkJCQkJCSsgTGlicmFyeVV0aWwuZ2V0VHlwZU5hbWUoZWxlbWVudCkgKyAiXSwgZmVhdHVyZSBbIiAgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkrIGZlYXR1cmUuZ2V0TmFtZSgpICsgIl0sIHZhbHVlPSIgIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJKyBuZXdPYmogKyAiLiBUaGUgZmVhdHVyZSB2YWx1ZSBpcyByZW1vdmVkLiAiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCi0JCQkJCX0KLQkJCQl9Ci0JCQl9CQotCQl9Ci0JCWNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCWV4LnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JCWZpbmFsbHkKLQkJewotCQkJZWxlbWVudC5lU2V0RGVsaXZlcihvbGROb3RpZnkpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgYm9vbGVhbiBjYW5SZXNldChNZXRob2RFbGVtZW50IGUpIHsKLQkJYm9vbGVhbiByZXNldCA9IGZhbHNlOwotCQkKLQkJLy8gYW4gZWxlbWVudCBjYW4gYmUgcmVzZXQgaWYgeW91IGFyZSBzdXJlIHRoYXQgbm8gb3RoZXIgZWxlbWVudChzKQotCQkvLyByZWZlcmVuY2UgdG8gaXQKLQkJLy8gcmVzZXQgZWxlbWVudHMgbWF5IGhhdmUgcmVmZXJlbmNlcyB0byBvdGhlciBlbGVtZW50cyBpbiB0aGUgaW1wb3J0aW5nCi0JCS8vIGxpYnJhcnksIHRoYXQgbmVlZHMgdG8gYmUgZml4ZWQgbGF0ZXIKLQkJCi0JCS8vIGZvciBhbnl0aGluZyBjb250YWluZWQgYnkgQ29udGVudERlc2NyaXB0aW9uLCByZXNldCBpdAotCQlpZiAoIGUgPT0gbnVsbCAvKiB8fCBlLmVDb250YWluZXIoKSBpbnN0YW5jZW9mIENvbnRlbnREZXNjcmlwdGlvbiAqLwotCQkJCXx8IGUgaW5zdGFuY2VvZiBEaWFncmFtRWxlbWVudCkgewotCQkJcmVzZXQgPSB0cnVlOwotCQl9Ci0JCQkJCi0JCXJldHVybiByZXNldDsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gY2FuUmVzZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUpIHsKLQkJLy8gZm9yIGFueXRoaW5nIGNvbnRhaW5lZCBieSBDb250ZW50RGVzY3JpcHRpb24sIHJlc2V0IGl0Ci0JCS8vIG5vIGRvbid0IHJlc2V0IHRoZSBzZWN0aW9ucyBzaW5jZSBpdCB3aWxsIGNhdXNlIHRoZSBvbmUgaW4gdGhlCi0JCS8vIGltcG9ydGluZyBsaWJyYXJ5IHJlbW92ZWQKLQkJLy8gd2hpY2ggY2F1c2VkIHByb2JsZW0gZm9yIFRhc2tEZXNjcmlwdGlvbiB3aGVyZSB0aGUgc2FtZSBmZWF0dXJlCi0JCS8vIChTdGVwcykgY2FuJ3QgZmluZCB0aGUgc3RlcHMgZnJvbSB0aGUgaW1wb3J0aW5nIGxpYnJhcnkKLQkJLy8gd2hpY2ggdGhlbiB3aWxsIHRyZWF0IHRoZSBzdGVwcyBpbiB0aGUgYmFzZSBsaWJyYXJ5IGJlaW5nIGRldGV0ZWQKLS8vIGlmICggZmVhdHVyZSA9PSBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb250ZW50RGVzY3JpcHRpb25fU2VjdGlvbnMoKSkgewotLy8gcmV0dXJuIHRydWU7Ci0vLyB9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gY2FuSWdub3JlKEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKSB7Ci0JCS8vIGRvbid0IHJlc2V0IHRoZSBwbHVnaW4gbG9jayBzdGF0dXMKLQkJaWYgKCBmZWF0dXJlID09IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE1ldGhvZFBsdWdpbl9Vc2VyQ2hhbmdlYWJsZSgpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0JCS8vIDE0NjE0NCAtIEltcG9ydCBDb25maWd1cmF0aW9uOiBzb21lIHVuY2hhbmdlIGVsZW1lbnRzIGRpc2FwcGVhciBpbiBhdXRob3JpbmcgYWZ0ZXIgaW1wb3J0Ci0JCS8vIHRoaXMgaXMgY2F1c2VkIGJ5IGEgYnVnIGluIEFydGlmYWN0SW1wbCwgd2hlbiBzZXRDb250YWluZXJBcnRpZmFjdCB0byBudWxsLCAKLQkJLy8gIGl0IHNldCB0aGUgZUNvbnRhaW5lciB0byBudWxsLCBpZiB0aGUgZUNvbnRhaW5lciBpcyBhIGNvbnRlbnQgcGFja2FnZSwgCi0JCS8vIHRoZSBhcnRpZmFjdCBpcyByZW1vdmVkIGZyb20gdGhlIHBhY2thZ2UKLQkJLy8gIHRoaXMgYnVnIHdpbGwgYmUgZml4ZWQgaW4gTTQuIAotCQkvLyBmb3Igbm93LCBpZ25vcmUgdGhpcyBmZWF0dXJlIHNpbmNlIHRoaXMgaXMgYW4gb3Bwb3NpdGUgZmVhdHVyZSwgd2UgZG9uJ3QgbmVlZCB0byBoYW5kbGUgaXQJCi0JCWlmICggZmVhdHVyZSA9PSBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRBcnRpZmFjdF9Db250YWluZXJBcnRpZmFjdCgpICkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlwcml2YXRlIGJvb2xlYW4gaXNSZXBsYWNlZChNZXRob2RFbGVtZW50IG9sZE9iaikgewotCQlyZXR1cm4gcmVwbGFjZWRFbGVtZW50TWFwLmNvbnRhaW5zS2V5KG9sZE9iai5nZXRHdWlkKCkpOwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRSZXBsYWNlZChNZXRob2RFbGVtZW50IG9sZE9iaikgewotCQlTdHJpbmcgZ3VpZCA9IG9sZE9iai5nZXRHdWlkKCk7Ci0JCWlmICggIXJlcGxhY2VkRWxlbWVudE1hcC5jb250YWluc0tleShndWlkKSApIHsKLQkJCXJlcGxhY2VkRWxlbWVudE1hcC5wdXQoZ3VpZCwgb2xkT2JqKTsKLQkJCXNldE1vZGlmaWVkKG9sZE9iaik7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogZ2V0IHRoZSBvbGQgZWxlbWVudCBiZWVuIHJlcGxhY2VkCi0JICogCi0JICogQHBhcmFtIG9sZE9iagotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIE1ldGhvZEVsZW1lbnQgZ2V0UmVwbGFjZWQoU3RyaW5nIGd1aWQpIHsKLQkJcmV0dXJuIChNZXRob2RFbGVtZW50KXJlcGxhY2VkRWxlbWVudE1hcC5nZXQoZ3VpZCk7Ci0JfQotCQotCS8qKgotCSAqIHdoZW4gbmV3IGVsZW1lbnRzIGFyZSBhZGRlZCBpbnRvIHRoZSBsaWJyYXJ5LCB0aGUgYXNzb2NpYXRlZCByZXNvdXJjZQotCSAqIGZpbGVzIG11c3QgYmUgY29waWVkIG92ZXIgYXMgd2VsbAotCSAqIAotCSAqIEBwYXJhbSBuZXdPYmoKLQkgKiAgICAgICAgICAgIE1ldGhvZEVsZW1lbnQKLQkgKi8KLQlwcml2YXRlIHZvaWQgY29weU5ld0VsZW1lbnRSZXNvdXJjZXMoTWV0aG9kRWxlbWVudCBuZXdPYmopIHsKLQkJCi0vLwkJTGlzdCBwcm9wZXJ0aWVzID0gbmV3T2JqLmdldEluc3RhbmNlUHJvcGVydGllcygpOwotLy8JCWlmIChwcm9wZXJ0aWVzICE9IG51bGwpIHsKLS8vCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9wZXJ0aWVzLnNpemUoKTsgaSsrKSB7Ci0vLwkJCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IChFU3RydWN0dXJhbEZlYXR1cmUpIHByb3BlcnRpZXMuZ2V0KGkpOwotLy8JCQkJT2JqZWN0IHZhbHVlID0gbmV3T2JqLmVHZXQoZmVhdHVyZSk7Ci0vLwkJCQlpZiAoIHZhbHVlIGluc3RhbmNlb2YgVVJJICkgewotLy8JCQkJCXJlc1NjYW5uZXIuY29weVJlc291cmNlKCgoVVJJKXZhbHVlKS5nZXRQYXRoKCkpOwotLy8JCQkJfSBlbHNlIGlmICggdmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcgKSB7Ci0vLwkJCQkJcmVzU2Nhbm5lci5zY2FuKG5ld09iaiwgKFN0cmluZyl2YWx1ZSk7Ci0vLwkJCQl9Ci0vLwkJCX0KLS8vCQl9Ci0vLwkJCi0vLwkJZm9yICggSXRlcmF0b3IgaXQgPSBuZXdPYmouZUNvbnRlbnRzKCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOyApIHsKLS8vCQkJT2JqZWN0IG8gPSBpdC5uZXh0KCk7Ci0vLwkJCWlmICggbyBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQgKSB7Ci0vLwkJCQljb3B5TmV3RWxlbWVudFJlc291cmNlcygoTWV0aG9kRWxlbWVudClvKTsKLS8vCQkJfQotLy8JCX0KLQkJCi0JCXNjYW5SZXNvdXJjZXMobmV3T2JqLCB0cnVlKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGxvZ05ld0VsZW1lbnQoTWV0aG9kRWxlbWVudCBuZXdPYmopIHsKLQkJCi0JCS8vIG1ha2Ugc3VyZSB0aGUgZWxlbWVudCBpcyBub3QgaW4gdGhlIG9yaWdpbmFsIGxpYnJhcnkKLQkJLy8gc2luY2Ugd2UgaGF2ZSB0aGUgZ3VpZC1lbGVtZW50IG1hcCBidWlsZCB1cCBpbiB0aGUgZGlmZiBtYW5hZ2VyLAotCQkvLyBjaGVjayB0aGVyZQotCQlpZiAoICFuZXdFbGVtZW50cy5jb250YWlucyhuZXdPYmopICYmIGRpZmZNZ3IuZ2V0RXhpc3RpbmdFbGVtZW50KG5ld09iai5nZXRHdWlkKCkpID09IG51bGwpIHsKLQkJCW5ld0VsZW1lbnRzLmFkZChuZXdPYmopOwotCQkJY29weU5ld0VsZW1lbnRSZXNvdXJjZXMobmV3T2JqKTsKLQkJCXNldE1vZGlmaWVkKG5ld09iaik7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGxvZ1Jlc2V0RWxlbWVudChNZXRob2RFbGVtZW50IG5ld09iaikgewotCQlpZiAoICFuZXdFbGVtZW50cy5jb250YWlucyhuZXdPYmopICkgewotCQkJbmV3RWxlbWVudHMuYWRkKG5ld09iaik7Ci0JCQlzZXRNb2RpZmllZChuZXdPYmopOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGxvZ05ld1Jlc291cmNlKFJlc291cmNlIHJlcyApIHsKLQkJaWYgKCByZXMgIT0gbnVsbCApIHsKLQkJCQotCQkJLy8gbWFyayB0aGUgcmVzb3VyY2UgYXMgZGlydHkgc28gdGhhdCB3ZSBjYW4gc2F2ZSBpdCBhZ2FpbgotCQkJLy8gdGhlIGZpcnN0IHNhdmUgbWF5IGxvc2UgY3Jvc3MgcmVmZXJlbmNlcyAKLQkJCXJlcy5zZXRNb2RpZmllZCh0cnVlKTsKLQkJCVN0cmluZyBmaWxlID0gcmVzLmdldFVSSSgpLnRvRmlsZVN0cmluZygpOwotCQkJaWYgKCAhbmV3UmVzb3VyY2VzLmNvbnRhaW5zKGZpbGUpICkgewotCQkJCW5ld1Jlc291cmNlcy5hZGQoZmlsZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGxvZ1JlbW92ZWRFbGVtZW50cyhMaXN0IGl0ZW1zKSB7Ci0JCQotCQlpZiAoIGl0ZW1zID09IG51bGwgfHwgaXRlbXMuc2l6ZSgpID09IDAgKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCS8vIHJlbW92ZWQgZWxlbWVudHMgY2FuIGJlIHJlbW92ZWQgZnJvbSBhbnkgZmVhdHVyZQotCQkvLyBjaGVjayBpZiB0aGUgZWxlbWVudCdzIGNvbnRhaW5lciBpcyBudWxsCi0JCS8vIGlmIGlzLCB0aGVuIHRoZSBlbGVtZW50IGlzIGRlbGV0ZWQgYW5kIHRoZSByZXNvdXJjZSBzaG91bGQgYmUgZGVsZXRlZAotCQkvLyBhcyB3ZWxsCi0JCWZvciAoSXRlcmF0b3IgaXQgPSBpdGVtcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7ICkgewotCQkJTWV0aG9kRWxlbWVudCBlID0gKE1ldGhvZEVsZW1lbnQpaXQubmV4dCgpOwotCQkJaWYgKCAoZS5lQ29udGFpbmVyKCkgPT0gbnVsbCkgJiYgIWRlbGV0ZWRFbGVtZW50cy5jb250YWlucyhlKSApIHsJCQkKLQkJCQlkZWxldGVkRWxlbWVudHMuYWRkKGUpOwotCQkJfQkJCQotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCBzZXRNb2RpZmllZChFT2JqZWN0IG9iaikgewotCQlpZiAoIG9iaiAhPSBudWxsICkgewotCQkJUmVzb3VyY2UgcmVzID0gb2JqLmVSZXNvdXJjZSgpOwotCQkJaWYgKCByZXMgIT0gbnVsbCApIHsKLQkJCQlpZiAoICFyZXMuaXNNb2RpZmllZCgpICkgewotCQkJCQlyZXMuc2V0TW9kaWZpZWQodHJ1ZSk7CQkJCQotCQkJCX0KLS8vIH0gZWxzZSB7Ci0vLyBTeXN0ZW0ub3V0LnByaW50bG4oIk5vIHJlc291cmNlIGZvciAiICsgb2JqKTsKLQkJCQkKLQkJCQlpZiAoZGVidWcgJiYgcmVzLmlzTW9kaWZpZWQoKSApIHsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJNb2RpZmllZDogIiArIHJlcy5nZXRVUkkoKS50b0ZpbGVTdHJpbmcoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0KLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgTGlzdCBnZXRNb2RpZmllZFJlc291cmNlcyhNZXRob2RMaWJyYXJ5IGxpYikgewotCQkKLQkJLy8gYXZvaWQgdGhlIG5ld2x5IGFkZGVkIGVsZW1lbnQgcmVzb3VyY2VzCi0JCUxpc3QgbW9kaWZpZWRMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlSZXNvdXJjZSByZXMgPSBsaWIuZVJlc291cmNlKCk7Ci0JCWlmICggcmVzICE9IG51bGwgKSB7Ci0JCQlSZXNvdXJjZVNldCByZXNTZXQgPSByZXMuZ2V0UmVzb3VyY2VTZXQoKTsKLQkJCWZvciAoIEl0ZXJhdG9yIGl0ID0gcmVzU2V0LmdldFJlc291cmNlcygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTsgKSB7Ci0JCQkJcmVzID0gKFJlc291cmNlKSBpdC5uZXh0KCk7Ci0JCQkJaWYgKCByZXMgIT0gbnVsbCAmJiByZXMuaXNNb2RpZmllZCgpICkgewotCQkJCQlTdHJpbmcgZmlsZSA9IHJlcy5nZXRVUkkoKS50b0ZpbGVTdHJpbmcoKTsKLQkJCQkJaWYgKCBuZXdSZXNvdXJjZXMuY29udGFpbnMoZmlsZSkgKSB7Ci0JCQkJCQljb250aW51ZTsKLQkJCQkJfQotCQkJCQkKLQkJCQkJaWYgKCBkZWJ1ZyApIHsKLQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiUmVzb3VyY2UgbW9kaWZpZWQ6ICIgKyBmaWxlKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9CQkKLQkJCQkJbW9kaWZpZWRMaXN0LmFkZChmaWxlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG1vZGlmaWVkTGlzdDsKLQl9Ci0KLQkvLyBjbGVhciByZXNvdXJjZXMgZm9yIGRlbGV0ZWQgZWxlbWVudHMKLQlwcml2YXRlIHZvaWQgZGVsZXRlUmVzb3J1Y2VzKCkgewotCQlpZiAoIGRlbGV0ZWRFbGVtZW50cy5zaXplKCkgPT0gMCApIHsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJSUZpbGVNYW5hZ2VyIGZpbGVNZ3IgPSBTZXJ2aWNlcy5nZXRGaWxlTWFuYWdlcigpOwotCi0JCWZvciAoSXRlcmF0b3IgaXQgPSBkZWxldGVkRWxlbWVudHMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOyApIHsKLQkJCU1ldGhvZEVsZW1lbnQgZSA9IChNZXRob2RFbGVtZW50KWl0Lm5leHQoKTsKLQkJCQotCQkJRU9iamVjdCBvYmogPSBudWxsOwotCQkJaWYgKCBlIGluc3RhbmNlb2YgRGVzY3JpYmFibGVFbGVtZW50ICkgewotCQkJCW9iaiA9ICgoRGVzY3JpYmFibGVFbGVtZW50KWUpLmdldFByZXNlbnRhdGlvbigpOwotCQkJfSBlbHNlIGlmICggZSBpbnN0YW5jZW9mIENvbnRlbnREZXNjcmlwdGlvbiApIHsKLQkJCQlvYmogPSBlOwotCQkJfQotCQkJaWYgKCBvYmogIT0gbnVsbCApIHsKLQkJCQlSZXNvdXJjZSByZXMgPSBvYmouZVJlc291cmNlKCk7Ci0JCQkJaWYgKCByZXMgIT0gbnVsbCApIHsKLQkJCQkJU3RyaW5nIGZpbGUgPSByZXMuZ2V0VVJJKCkudG9GaWxlU3RyaW5nKCk7Ci0JCQkJCWlmICggZGVidWcgKSB7Ci0JCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oImRlbGV0aW5nIHJlc291cmNlOiAiICsgZmlsZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCQkKLQkJCQkJaWYgKCAhZmlsZU1nci5kZWxldGUoZmlsZSkgKSB7Ci0JCQkJCQlpZiAoIGRlYnVnICkgewotCQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigidW5hYmxlIHRvIGRlbGV0ZSBmaWxlOiAiICsgZmlsZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0JCQkJCQkJCQotCQkJfQotCQl9Ci0JfQotCi0JCi0JcHVibGljIGNsYXNzIEVsZW1lbnRMaXN0RGlmZiB7Ci0KLQkJTGlzdCBuZXdJdGVtcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJTGlzdCBkZWxldGVkSXRlbXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQotCQkvLyB1c2UgTGlua2VkSGFzaE1hcCB0byByZXNlcnZlIHRoZSBvcmRlciBvZiB0aGUgdmFsdWVzCi0JCU1hcCBvbGROZXdNYXAgPSBuZXcgTGlua2VkSGFzaE1hcCgpOwotCi0JCS8vIHdpdGggdGhlIG9sZCBhbmQgbmV3IGxpc3Qgb2YgTWV0aG9kRWxlbWVudHMsCi0JCS8vIGZpbmQgdGhlIGNvbW1vbiBvbmVzLCB0aGUgZGVsZXRlZCBvbmVzLCBhbmQgdGhlIG5ldyBvbmVzCi0JCXB1YmxpYyBFbGVtZW50TGlzdERpZmYoTGlzdCBvbGRMaXN0LCBMaXN0IG5ld0xpc3QpIHsKLQkJCS8vIE1hcCBvbGRMaXN0R3VpZE1hcCA9IGdldEd1aWRNYXAob2xkTGlzdCk7Ci0JCQlNYXAgbmV3TGlzdEd1aWRNYXAgPSBnZXRHdWlkTWFwKG5ld0xpc3QpOwotCi0JCQluZXdJdGVtcy5hZGRBbGwobmV3TGlzdCk7Ci0KLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBvbGRMaXN0Lml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTsgKSB7Ci0JCQkJTWV0aG9kRWxlbWVudCBvbGRPYmogPSAoTWV0aG9kRWxlbWVudClpdC5uZXh0KCk7Ci0JCQkJU3RyaW5nIGd1aWQgPSBvbGRPYmouZ2V0R3VpZCgpOwotCQkJCU9iamVjdCBuZXdPYmogPSBuZXdMaXN0R3VpZE1hcC5nZXQoZ3VpZCk7Ci0JCQkJaWYgKCBuZXdPYmogIT0gbnVsbCApIHsKLQkJCQkJb2xkTmV3TWFwLnB1dChvbGRPYmosIG5ld09iaik7Ci0JCQkJCW5ld0l0ZW1zLnJlbW92ZShuZXdPYmopOwotCQkJCX0KLQkJCQllbHNlCi0JCQkJewotCQkJCQkvLyBpdCdzIGJlZW4gZGVsZXRlZAotCQkJCQlkZWxldGVkSXRlbXMuYWRkKG9sZE9iaik7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcHJpdmF0ZSBNYXAgZ2V0R3VpZE1hcChMaXN0IGl0ZW1zKSB7Ci0JCQlNYXAgbSA9IG5ldyBIYXNoTWFwKCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0PSBpdGVtcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7ICkgewotCQkJCU1ldGhvZEVsZW1lbnQgZSA9IChNZXRob2RFbGVtZW50KWl0Lm5leHQoKTsKLQkJCQltLnB1dChlLmdldEd1aWQoKSwgZSk7Ci0JCQl9Ci0KLQkJCXJldHVybiBtOwotCQl9Ci0JfQkKLQkKLQkvKioKLQkgKiBIYW5kbGVzIG5hbWUgcmVwbGFjZW1lbnQuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGhhbmRsZU5hbWVSZXBsYWNlKE1hcCByZW5hbWVFbGVtZW50TWFwKSB7Ci0JCUl0ZXJhdG9yIGl0ID0gcmVuYW1lRWxlbWVudE1hcC5lbnRyeVNldCgpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCU1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIGl0Lm5leHQoKTsKLQkJCU9iamVjdFtdIHZhbCA9IChPYmplY3RbXSllbnRyeS5nZXRWYWx1ZSgpOwotCQkJCi0JCQlNZXRob2RFbGVtZW50IGVsZW1lbnQgPSAoTWV0aG9kRWxlbWVudCkgdmFsWzBdOwotCQkJU3RyaW5nIG5ld05hbWUgPSB2YWwubGVuZ3RoID09IDQgPyBlbGVtZW50LmdldEd1aWQoKSA6IChTdHJpbmcpIHZhbFsxXTsKLQkJCXJlbmFtZShlbGVtZW50LCBuZXdOYW1lKTsKLQkJCWlmICh2YWwubGVuZ3RoID09IDQpIHsKLQkJCQllbGVtZW50ID0gKE1ldGhvZEVsZW1lbnQpIHZhbFsyXTsKLQkJCQluZXdOYW1lID0gKFN0cmluZykgdmFsWzNdOwotCQkJCXJlbmFtZShlbGVtZW50LCBuZXdOYW1lKTsKLQkJCQkKLQkJCQllbGVtZW50ID0gKE1ldGhvZEVsZW1lbnQpIHZhbFswXTsKLQkJCQluZXdOYW1lID0gKFN0cmluZykgdmFsWzFdOwotCQkJCXJlbmFtZShlbGVtZW50LCBuZXdOYW1lKTsKLQkJCX0KLQkJfQotCQkKLQkJLy9NYWtlIHJlc291Y2VzIGRpcnR5IGFnYWluLCBhcyByZW5hbWUgcHJvY2VzcyB3b3VsZCBtYXJrIHJlc291Y2UgdW4tbW9kaWZpZWQKLQkJaXQgPSByZW5hbWVFbGVtZW50TWFwLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSkgaXQubmV4dCgpOwotCQkJT2JqZWN0W10gdmFsID0gKE9iamVjdFtdKWVudHJ5LmdldFZhbHVlKCk7CQkJCi0JCQlNZXRob2RFbGVtZW50IGVsZW1lbnQgPSAoTWV0aG9kRWxlbWVudCkgdmFsWzBdOwotCQkJZWxlbWVudC5lUmVzb3VyY2UoKS5zZXRNb2RpZmllZCh0cnVlKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyB2b2lkIHJlbmFtZShNZXRob2RFbGVtZW50IGVsZW1lbnQsIFN0cmluZyBuZXdOYW1lKSB7Ci0JCWlmIChuZXdOYW1lLmVxdWFscyhlbGVtZW50LmdldE5hbWUoKSkpIHsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIENvbnRlbnREZXNjcmlwdGlvbiB8fCBlbGVtZW50LmVSZXNvdXJjZSgpID09IG51bGwpIHsKLQkJCWVsZW1lbnQuc2V0TmFtZShuZXdOYW1lKTsKLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkgewotCQkJCVByb2Nlc3MgcHJvYyA9ICgoUHJvY2Vzc0NvbXBvbmVudCkgZWxlbWVudCkKLQkJCQkJCS5nZXRQcm9jZXNzKCk7Ci0JCQkJcHJvYy5zZXROYW1lKG5ld05hbWUpOwotCQkJfQotCQl9IGVsc2UgewotCQkJTGlicmFyeVZpZXcucnVuUmVuYW1lKGVsZW1lbnQsIG5ld05hbWUpOwotCQl9Ci0JfQotCQkKLQlwcml2YXRlIHZvaWQgcmVnaXN0ZXJTZXRFbGVtZW50KE1ldGhvZEVsZW1lbnQgZWxlbWVudCwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlTdHJpbmcgZ3VpZDAgPSAoKE1ldGhvZEVsZW1lbnQpbmV3VmFsdWUpLmdldEd1aWQoKTsKLQkJU3RyaW5nIGd1aWQxID0gZWxlbWVudC5nZXRHdWlkKCk7Ci0JCU9iamVjdFtdIHZhbCA9IG5ldyBPYmplY3RbM107Ci0JCXZhbFswXSA9IGZlYXR1cmU7Ci0JCXZhbFsxXSA9IG5ld1ZhbHVlOwotCQl2YWxbMl0gPSBlbGVtZW50OwotCQlpZiAoc2V0RWxlbWVudE1hcCA9PSBudWxsKSB7Ci0JCQlzZXRFbGVtZW50TWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJfQotCQlzZXRFbGVtZW50TWFwLnB1dChlbGVtZW50LmdldE5hbWUoKSArIGd1aWQwICsgZ3VpZDEsIHZhbCk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBoYW5kbGVTZXRFbGVtZW50cygpIHsKLQkJaWYgKHNldEVsZW1lbnRNYXAgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSBzZXRFbGVtZW50TWFwLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSkgaXQubmV4dCgpOwotCQkJT2JqZWN0W10gdmFsID0gKE9iamVjdFtdKWVudHJ5LmdldFZhbHVlKCk7Ci0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IChFU3RydWN0dXJhbEZlYXR1cmUpIHZhbFswXTsKLQkJCU1ldGhvZEVsZW1lbnQgbmV3VmFsdWUgPSAoTWV0aG9kRWxlbWVudCkgdmFsWzFdOwotCQkJTWV0aG9kRWxlbWVudCBlbGVtZW50ID0gKE1ldGhvZEVsZW1lbnQpIHZhbFsyXTsKLQkJCVN0cmluZyBndWlkID0gbmV3VmFsdWUuZ2V0R3VpZCgpOwotCQkJTWV0aG9kRWxlbWVudCBtZXJnZWRWYWx1ZSA9IChNZXRob2RFbGVtZW50KSByZXBsYWNlZEVsZW1lbnRNYXAuZ2V0KGd1aWQpOwotCQkJaWYgKG1lcmdlZFZhbHVlICE9IG51bGwgJiYgbWVyZ2VkVmFsdWUgIT0gbmV3VmFsdWUpIHsKLQkJCQllbGVtZW50LmVTZXQoZmVhdHVyZSwgbWVyZ2VkVmFsdWUpOwotCQkJfQkJCQotCQl9Ci0JfQotCi0JLyoqCi0JICogRW5zdXJlcyB1bmlxdWUgbmFtZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgZW5zdXJlVW5pcXVlTmFtZShFT2JqZWN0IG93bmVyLCBNZXRob2RFbGVtZW50IG5ld09iaiwgTWFwIHJlbmFtZUVsZW1lbnRNYXApIHsKLQkJaWYgKG93bmVyID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQlDbGFzcyBjbHMgPSBuZXdPYmouZ2V0Q2xhc3MoKTsKLQkJTWFwIG5hbWVNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQlmb3IgKGludCBpPTA7IGkgPCBvd25lci5lQ29udGVudHMoKS5zaXplKCk7IGkrKykgewotCQkJT2JqZWN0IG9sZE9iaiA9IG93bmVyLmVDb250ZW50cygpLmdldChpKTsKLQkJCWlmIChvbGRPYmouZ2V0Q2xhc3MoKSA9PSBjbHMgJiYgb2xkT2JqICE9IG5ld09iaikgewotCQkJCU1ldGhvZEVsZW1lbnQgb2xkRWxlbSA9IChNZXRob2RFbGVtZW50KSBvbGRPYmo7Ci0JCQkJbmFtZU1hcC5wdXQob2xkRWxlbS5nZXROYW1lKCksIG9sZEVsZW0pOwotCQkJfQotCQl9Ci0JCVN0cmluZyBuYW1lID0gbmV3T2JqLmdldE5hbWUoKTsKLQkJU3RyaW5nIHJlbmFtZWQgPSBuYW1lOwotCQl3aGlsZSAobmFtZU1hcC5jb250YWluc0tleShyZW5hbWVkKSkgewotCQkJcmVuYW1lZCArPSAiX3JlbmFtZWQiOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJaWYgKHJlbmFtZWQgIT0gbmFtZSkgewotCQkJbmV3T2JqLnNldE5hbWUocmVuYW1lZCk7Ci0JCQkKLQkJCU9iamVjdFtdIGVudHJ5VmFsID0gbmV3IE9iamVjdFs0XTsKLQkJCWVudHJ5VmFsWzBdID0gbmV3T2JqOwotCQkJZW50cnlWYWxbMV0gPSBuYW1lOwotCQkJZW50cnlWYWxbMl0gPSBuYW1lTWFwLmdldChuYW1lKTsKLQkJCWVudHJ5VmFsWzNdID0gcmVuYW1lZDsKLQkJCXJlbmFtZUVsZW1lbnRNYXAucHV0KG5ld09iai5nZXRHdWlkKCksIGVudHJ5VmFsKTsJCQkKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBFbnN1cmVzIHVuaXF1ZSBuYW1lIGZvciBleGlzdGluZyBlbGVtZW50LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBlbnN1cmVVbmlxdWVOYW1lRm9yRXhpc3RpbmdFbGVtZW50KE1ldGhvZEVsZW1lbnQgZWxlbWVudCwgU3RyaW5nIG9sZE5hbWUsIFN0cmluZyBuZXdOYW1lLCBNYXAgcmVuYW1lRWxlbWVudE1hcCkgewotCQlFT2JqZWN0IGVsZW1lbnRPd25lciA9IGVsZW1lbnQuZUNvbnRhaW5lcigpOwkJCQkJCi0JCWlmIChlbGVtZW50T3duZXIgIT0gbnVsbCkgewotCQkJZWxlbWVudC5zZXROYW1lKG5ld05hbWUpOwotCQkJZW5zdXJlVW5pcXVlTmFtZShlbGVtZW50T3duZXIsIGVsZW1lbnQsIHJlbmFtZUVsZW1lbnRNYXApOwotCQkJaWYgKCFlbGVtZW50LmdldE5hbWUoKS5lcXVhbHMobmV3TmFtZSkpIHsJLy9pZiBoYW5kbGVkIHRoZW4gcmV0dXJuCi0JCQkJcmV0dXJuOwotCQkJfQkJCQotCQkJZWxlbWVudC5zZXROYW1lKG9sZE5hbWUpOwotCQl9CQkJCi0JCU9iamVjdFtdIGVudHJ5VmFsID0gbmV3IE9iamVjdFsyXTsKLQkJZW50cnlWYWxbMF0gPSBlbGVtZW50OwotCQllbnRyeVZhbFsxXSA9IG5ld05hbWU7Ci0JCXJlbmFtZUVsZW1lbnRNYXAucHV0KGVsZW1lbnQuZ2V0R3VpZCgpLCBlbnRyeVZhbCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNoZWNrTW9kaWZpZWRGaWxlcygpIHsKLQkJZmluYWwgTGlzdCBtb2RpZmllZEZpbGVzID0gZ2V0TW9kaWZpZWRSZXNvdXJjZXMoYmFzZUxpYnJhcnkpOwotCQltb2RpZmllZEZpbGVzLmFkZEFsbChyZXNTY2FubmVyLmdldEZpbGVzVG9iZVJlcGxhY2VkKCkpOwotCQltb2RpZmllZEZpbGVzLmFkZEFsbChkaWFncmFtSGFuZGxlci5nZXRNb2RpZmllZEZpbGVzKCkpOwotCi0JCVNhZmVVcGRhdGVDb250cm9sbGVyLnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlmaWxlQ2hlY2tlZE91dFN0YXR1cyA9IEZpbGVNb2RpZnlDaGVja2VyLmNoZWNrTW9kaWZ5KG1vZGlmaWVkRmlsZXMpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcml2YXRlIExpc3QgdW5sb2NrUGx1Z2lucygpIHsKLQotCQlMaXN0IHBsdWdpbklkcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCi0JCU1hcDxTdHJpbmcsIE1ldGhvZFBsdWdpbj4gbWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBNZXRob2RQbHVnaW4+KCk7Ci0JCU1hcDxTdHJpbmcsIE1ldGhvZFBsdWdpbj4gZ3VpZE1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgTWV0aG9kUGx1Z2luPigpOwotCQlMaXN0PE1ldGhvZFBsdWdpbj4gYmFzZVBsdWdpbnMgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCkKLQkJCQkJCQkJCQkJLmdldE1ldGhvZFBsdWdpbnMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBiYXNlUGx1Z2lucy5zaXplKCk7IGkrKykgewotCQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IGJhc2VQbHVnaW5zLmdldChpKTsKLQkJCW1hcC5wdXQocGx1Z2luLmdldE5hbWUoKSwgcGx1Z2luKTsKLQkJCWd1aWRNYXAucHV0KHBsdWdpbi5nZXRHdWlkKCksIHBsdWdpbik7Ci0JCX0KLQkJCi0JCWlmIChtYXAuaXNFbXB0eSgpKSB7Ci0JCQlyZXR1cm4gcGx1Z2luSWRzOwotCQl9Ci0JCQotCQlMaXN0IGZpbGVOYW1lVG9DaGVjayA9IG5ldyBBcnJheUxpc3QoKTsKLQkJTGlzdDxNZXRob2RQbHVnaW4+IGltcG9ydFBsdWdpbnMgPSBpbXBvcnRpbmdMaWJyYXJ5LmdldE1ldGhvZFBsdWdpbnMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbXBvcnRQbHVnaW5zLnNpemUoKTsgaSsrKSB7Ci0JCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gaW1wb3J0UGx1Z2lucy5nZXQoaSk7Ci0JCQlTdHJpbmcgbmFtZSA9IHBsdWdpbi5nZXROYW1lKCk7Ci0JCQlTdHJpbmcgZ3VpZCA9IHBsdWdpbi5nZXRHdWlkKCk7Ci0JCQkKLQkJCU1ldGhvZFBsdWdpbiBiYXNlUGx1Z2luMCA9IGd1aWRNYXAuZ2V0KGd1aWQpOwotCQkJaWYgKGJhc2VQbHVnaW4wICE9IG51bGwpIHsKLQkJCQlTdHJpbmcgbmFtZTAgPSBiYXNlUGx1Z2luMC5nZXROYW1lKCk7Ci0JCQkJaWYgKCEgbmFtZTAuZXF1YWxzKG5hbWUpKSB7Ci0JCQkJCXJlbmFtZVBsdWdpbk1hcC5wdXQobmFtZTAsIG5hbWUpOwotCQkJCX0KLQkJCX0KLQkJCQotCQkJTWV0aG9kUGx1Z2luIGJhc2VQbHVnaW4gPSBtYXAuZ2V0KG5hbWUpOwotCQkJYm9vbGVhbiB0b0FkZCA9IGZhbHNlOwotCQkJaWYgKGJhc2VQbHVnaW4gIT0gbnVsbCAmJiAhIGJhc2VQbHVnaW4uZ2V0R3VpZCgpLmVxdWFscyhndWlkKQotCQkJCQkmJiAhIGJhc2VQbHVnaW4uZ2V0VXNlckNoYW5nZWFibGUoKSkgewotCQkJCXRvQWRkID0gdHJ1ZTsKLQkJCX0gZWxzZSB7Ci0JCQkJYmFzZVBsdWdpbiA9IGd1aWRNYXAuZ2V0KGd1aWQpOwotCQkJCWlmIChiYXNlUGx1Z2luICE9IG51bGwgLyomJiAhIGJhc2VQbHVnaW4uZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSovCi0JCQkJCQkmJiAhIGJhc2VQbHVnaW4uZ2V0VXNlckNoYW5nZWFibGUoKSkgewotCQkJCQl0b0FkZCA9IHRydWU7Ci0JCQkJfSAKLQkJCX0KLQkJCQotCQkJaWYgKHRvQWRkKXsJCQkJCi0JCQkJcGx1Z2luSWRzLmFkZChiYXNlUGx1Z2luLmdldEd1aWQoKSk7Ci0JCQkJYmFzZVBsdWdpbi5zZXRVc2VyQ2hhbmdlYWJsZShuZXcgQm9vbGVhbih0cnVlKSk7Ci0JCQkJUmVzb3VyY2UgcmVzID0gYmFzZVBsdWdpbi5lUmVzb3VyY2UoKTsKLQkJCQlpZiAocmVzICE9IG51bGwgJiYgcmVzLmdldFVSSSgpICE9IG51bGwpIHsKLQkJCQkJU3RyaW5nIGZpbGVOYW1lID0gcmVzLmdldFVSSSgpLnRvRmlsZVN0cmluZygpOwotCQkJCQlmaWxlTmFtZVRvQ2hlY2suYWRkKGZpbGVOYW1lKTsKLQkJCQl9Ci0JCQl9Ci0JCX0JCi0JCQotCQlpZiAoZmlsZU5hbWVUb0NoZWNrLnNpemUoKSA+IDApIHsKLQkJCWZpbmFsIExpc3QgbW9kaWZpZWRGaWxlcyA9IGZpbGVOYW1lVG9DaGVjazsJCi0JCQlTYWZlVXBkYXRlQ29udHJvbGxlci5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQlmaWxlQ2hlY2tlZE91dFN0YXR1cyA9IEZpbGVNb2RpZnlDaGVja2VyLmNoZWNrTW9kaWZ5KG1vZGlmaWVkRmlsZXMpOwotCQkJCX0KLQkJCX0pOwotCQl9Ci0JCQotCQlyZXR1cm4gcGx1Z2luSWRzOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSB1bmxvY2tlZFBsdWdpbnMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9ja1VubG9ja2VkUGx1Z2lucyhMaXN0IHVubG9ja2VkUGx1Z2lucykgewotCQlMaXN0IHBsdWdpbnMgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCkKLQkJCQkuZ2V0TWV0aG9kUGx1Z2lucygpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gcGx1Z2lucy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gKE1ldGhvZFBsdWdpbikgaXQubmV4dCgpOwotCQkJaWYgKHVubG9ja2VkUGx1Z2lucy5jb250YWlucyhwbHVnaW4uZ2V0R3VpZCgpKSkgewotCQkJCXBsdWdpbi5zZXRVc2VyQ2hhbmdlYWJsZShuZXcgQm9vbGVhbihmYWxzZSkpOwotCQkJfQotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCBsb2dOZXdFbGVtZW50VW5kZXJFeGlzdGluZ1BsdWdpbihNZXRob2RFbGVtZW50IG5ld09iaikgewotCQlJTGlicmFyeVJlc291cmNlTWFuYWdlciBsaWJSZXNNZ3IgPSBSZXNvdXJjZUhlbHBlci5nZXRSZXNvdXJjZU1ncihuZXdPYmopOwotCQlTdHJpbmcgcGx1Z2luUGF0aCA9IGxpYlJlc01nci5nZXRQaHlzaWNhbFBsdWdpblBhdGgobmV3T2JqKTsKLQkJaWYgKHBsdWdpblBhdGggIT0gbnVsbCkgewotCQkJbG9nTmV3RWxlbWVudChuZXdPYmopOwotCQl9Ci0JfQotCQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcvc2VydmljZXMvUGx1Z2luSW1wb3J0RGF0YS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy9zZXJ2aWNlcy9QbHVnaW5JbXBvcnREYXRhLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyNWQ0NzMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy9zZXJ2aWNlcy9QbHVnaW5JbXBvcnREYXRhLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy5zZXJ2aWNlczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByZWZlcmVuY2VzLkxpYnJhcnlMb2NhdGlvbkRhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotCi0KLS8qKgotICogRW5jYXBzdWxhdGVzIHRoZSBpbnB1dCBkYXRhIHJlcXVpcmVkIHRvIGltcG9ydCBhIG1ldGhvZCBwbHVnLWluLgotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUGx1Z2luSW1wb3J0RGF0YSB7Ci0KLQkvLyB0aGVzZSBhcmUgc2V0IGJ5IHRoZSB3aXphcmQKLQlwdWJsaWMgTGlicmFyeUxvY2F0aW9uRGF0YSBsbERhdGEgPSBuZXcgTGlicmFyeUxvY2F0aW9uRGF0YSgpOwotCi0JcHVibGljIGJvb2xlYW4gZGVsZXRlRXhpc3RpbmdQbHVnaW5zOwotCi0JLy8gdGhlc2UgYXJlIGZpbGxlZCBpbiBieSB0aGUgaW1wb3J0aW5nIHNlcnZpY2UKLQlwdWJsaWMgU3RyaW5nIGxpYnJhcnlWZXJzaW9uOwotCi0JcHJpdmF0ZSBMaXN0PFBsdWdpbkluZm8+IHBsdWdpbnMgPSBuZXcgQXJyYXlMaXN0PFBsdWdpbkluZm8+KCk7Ci0KLQlwcml2YXRlIExpc3QgY29uZmlncyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCXByaXZhdGUgRXJyb3JJbmZvIGVycm9yID0gbmV3IEVycm9ySW5mbygpOwotCi0JLy8gYXAgdGhlIGd1aWQgdG8gdXJsIGZvciBiYXNlIHBsdWdpbiwgdGhpcyBpcyB0aGUgb25seSBmb3JtYXRpb24gYXZhaWxhYmxlCi0JcHVibGljIE1hcCBiYXNlUGx1Z2luVXJsTWFwID0gbmV3IEhhc2hNYXAoKTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFBsdWdpbkltcG9ydERhdGEoKSB7Ci0JfQotCi0JLyoqCi0JICogQ2xlYXJzIHRoZSBjb250ZW50cy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBjbGVhcigpIHsKLQkJcGx1Z2lucy5jbGVhcigpOwotCQljb25maWdzLmNsZWFyKCk7Ci0JCWVycm9yLmVycm9yTWVzc2FnZS5zZXRMZW5ndGgoMCk7Ci0JfQotCi0JLyoqCi0JICogVmFsaWRhdGVzIHRoZSBwbHVnaW5zLgotCSAqLwotCXB1YmxpYyB2b2lkIHZhbGlkYXRlUGx1Z2lucygpIHsKLQkJUGx1Z2luSW5mbyBpbmZvOwotCQlpbnQgaSA9IDA7Ci0JCXdoaWxlIChpIDwgcGx1Z2lucy5zaXplKCkpIHsKLQkJCWluZm8gPSAoUGx1Z2luSW5mbykgcGx1Z2lucy5nZXQoaSk7Ci0JCQlpZiAoaW5mby51cmwgPT0gbnVsbCkgewotCQkJCXBsdWdpbnMucmVtb3ZlKGkpOwotCQkJfSBlbHNlIHsKLQkJCQlpKys7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgUGx1Z2luSW5mbyBvYmplY3QgZ2l2ZW4gdGhlIGd1aWQuCi0JICovCi0JcHVibGljIFBsdWdpbkluZm8gZ2V0UGx1Z2luSW5mbyhTdHJpbmcgZ3VpZCkgewotCQlQbHVnaW5JbmZvIGluZm87Ci0JCWZvciAoSXRlcmF0b3I8UGx1Z2luSW5mbz4gaXQgPSBwbHVnaW5zLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCWluZm8gPSAoUGx1Z2luSW5mbykgaXQubmV4dCgpOwotCQkJaWYgKGluZm8uZ3VpZC5lcXVhbHMoZ3VpZCkpIHsKLQkJCQlyZXR1cm4gaW5mbzsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZXMgYSBQbHVnaW5JbmZvIG9iamVjdCBnaXZlbiB0aGUgZ3VpZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVQbHVnaW5JbmZvKFN0cmluZyBndWlkKSB7Ci0JCVBsdWdpbkluZm8gaW5mbzsKLQkJZm9yIChJdGVyYXRvcjxQbHVnaW5JbmZvPiBpdCA9IHBsdWdpbnMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJaW5mbyA9IChQbHVnaW5JbmZvKSBpdC5uZXh0KCk7Ci0JCQlpZiAoaW5mby5ndWlkLmVxdWFscyhndWlkKSkgewotCQkJCXBsdWdpbnMucmVtb3ZlKGluZm8pOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgQ29uZmlndWFyYXRpb25JbmZvIG9iamVjdCBnaXZlbiB0aGUgZ3VpZC4KLQkgKi8KLQlwdWJsaWMgQ29uZmlndWFyYXRpb25JbmZvIGdldENvbmZpZ0luZm8oU3RyaW5nIGd1aWQpIHsKLQotCQlpZiAoIGd1aWQgPT0gbnVsbCApIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCVBsdWdpbkltcG9ydERhdGEuQ29uZmlndWFyYXRpb25JbmZvIGNpbmZvOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gZ2V0Q29uZmlncygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCWNpbmZvID0gKFBsdWdpbkltcG9ydERhdGEuQ29uZmlndWFyYXRpb25JbmZvKSBpdC5uZXh0KCk7Ci0JCQlpZiAoZ3VpZC5lcXVhbHMoY2luZm8uZ3VpZCkgKSB7Ci0JCQkJcmV0dXJuIGNpbmZvOwotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JCi0JLyoqCi0JICogcmV0dXJuIGEgbGlzdCBvZiBQbHVnaW5JbmZvIG9iamVjdAotCSAqIAotCSAqIEByZXR1cm4gTGlzdCBhIGxpc3Qgb2YgUGx1Z2luSW5mbyBvYmplY3RzCi0JICovCi0JcHVibGljIExpc3Q8UGx1Z2luSW5mbz4gZ2V0UGx1Z2lucygpIHsKLQkJcmV0dXJuIHBsdWdpbnM7Ci0JfQotCi0JLyoqCi0JICogcmV0dXJuIGEgbGlzdCBvZiBDb25maWdJbmZvIG9iamVjdHMKLQkgKiAKLQkgKiBAcmV0dXJuIExpc3QKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRDb25maWdzKCkgewotCQlyZXR1cm4gY29uZmlnczsKLQl9Ci0KLQkvKioKLQkgKiByZXR1cm4gdGhlIGVycm9yIG1lc3NhZ2UgaWYgYW55Ci0JICogCi0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgRXJyb3JJbmZvIGdldEVycm9ySW5mbygpIHsKLQkJcmV0dXJuIGVycm9yOwotCX0KLQotCXB1YmxpYyBjbGFzcyBQbHVnaW5JbmZvIHsKLQotCQkvLyBJZiBub3QgbnVsbCwgdGhpcyBpcyBhIHZhbGlkIHBsdWctaW4uCi0JCXB1YmxpYyBTdHJpbmcgdXJsID0gbnVsbDsKLQotCQlwdWJsaWMgU3RyaW5nIG5hbWU7Ci0KLQkJcHVibGljIFN0cmluZyBndWlkOwotCi0JCXB1YmxpYyBTdHJpbmcgdmVyc2lvbjsKLQotCQlwdWJsaWMgU3RyaW5nIGJyaWVmX2Rlc2M7Ci0KLQkJcHVibGljIFN0cmluZyBhdXRob3JzOwotCi0JCXB1YmxpYyBTdHJpbmcgY2hhbmdlRGF0ZTsKLQotCQlwdWJsaWMgTGlzdCB1c2VkUGx1Z2lucyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQkvLyBJZiBudWxsLCB0aGlzIHBsdWctaW4gZG9lcyBub3QgZXhpc3RzIGluIHRoZSBjdXJyZW50IGxpYnJhcnkuCi0JCXB1YmxpYyBNZXRob2RQbHVnaW4gZXhpc3RpbmdQbHVnaW4gPSBudWxsOwotCi0JCS8vIElmIHRydWUsIHJlcGxhY2UgdGhlIGN1cnJlbnQgcGx1Zy1pbiB3aXRoIHRoZSBvbmUgaW4gdGhlIGltcG9ydAotCQkvLyBsaWJyYXJ5LiBJZiBmYWxzZSwgZG9uJ3QgaW1wb3J0IHRoZSBwbHVnLWluLgotCQlwdWJsaWMgYm9vbGVhbiBzZWxlY3RlZCA9IGZhbHNlOwotCi0JCXB1YmxpYyBQbHVnaW5JbmZvKCkgewotCQl9Ci0KLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiBuYW1lOwotCQl9Ci0JfQotCi0JcHVibGljIGNsYXNzIENvbmZpZ3VhcmF0aW9uSW5mbyB7Ci0KLQkJcHVibGljIFN0cmluZyBuYW1lOwotCi0JCXB1YmxpYyBTdHJpbmcgZ3VpZDsKLQotCQlwdWJsaWMgU3RyaW5nIHZlcnNpb247Ci0KLQkJLy8gVGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbi4KLQkJcHVibGljIE1ldGhvZENvbmZpZ3VyYXRpb24gZXhpc3RpbmdDb25maWcgPSBudWxsOwotCi0JCXB1YmxpYyBib29sZWFuIHNlbGVjdGVkID0gdHJ1ZTsKLQotCQlwdWJsaWMgQ29uZmlndWFyYXRpb25JbmZvKCkgewotCQl9Ci0KLQl9Ci0KLQlwdWJsaWMgY2xhc3MgRXJyb3JJbmZvIHsKLQotCQlwcml2YXRlIFN0cmluZ0J1ZmZlciBlcnJvck1lc3NhZ2UgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0KLQkJcHVibGljIEVycm9ySW5mbygpIHsKLQotCQl9Ci0KLQkJcHVibGljIHZvaWQgYWRkRXJyb3IoU3RyaW5nIG1lc3NhZ2UpIHsKLQkJCWVycm9yTWVzc2FnZS5hcHBlbmQobWVzc2FnZSk7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldEVycm9yKCkgewotCQkJcmV0dXJuIGVycm9yTWVzc2FnZS50b1N0cmluZygpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgY2xlYXIoKSB7Ci0JCQllcnJvck1lc3NhZ2Uuc2V0TGVuZ3RoKDApOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3NlcnZpY2VzL1BsdWdpbkltcG9ydGluZ1NlcnZpY2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcvc2VydmljZXMvUGx1Z2luSW1wb3J0aW5nU2VydmljZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MjdjNDUxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcvc2VydmljZXMvUGx1Z2luSW1wb3J0aW5nU2VydmljZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMxOSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLnNlcnZpY2VzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZUZpbHRlcjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudGV4dC5Db2xsYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZEhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5Db3B5OwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLkZpbGVTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudmlld3MuTGlicmFyeVZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS51dGlsLk1zZ0RpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLkZpbGVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuWE1MVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnNlcnZpY2VzLkNvbmZpZ3VyYXRpb25FeHBvcnRTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQuc2VydmljZXMuTGlicmFyeURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcuSW1wb3J0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcuSW1wb3J0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcuc2VydmljZXMuUGx1Z2luSW1wb3J0RGF0YS5Db25maWd1YXJhdGlvbkluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy5zZXJ2aWNlcy5QbHVnaW5JbXBvcnREYXRhLlBsdWdpbkluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2VVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5NZXRob2RFbGVtZW50VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5zZXJ2aWNlcy5TYWZlVXBkYXRlQ29udHJvbGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLkxpYnJhcnlVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuUmVzb3VyY2VVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5NdWx0aUZpbGVSZXNvdXJjZVNldEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLk11bHRpRmlsZVNhdmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5NdWx0aUZpbGVYTUlSZXNvdXJjZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLk11bHRpRmlsZVhNSVNhdmVJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5taWdyYXRpb24uVXBncmFkZUNhbGxlckluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLnJlZnJlc2guUmVmcmVzaEpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UudXRpbC5QZXJzaXN0ZW5jZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlci5SZXNvdXJjZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzLklGaWxlQmFzZWRMaWJyYXJ5UGVyc2lzdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy5JTGlicmFyeVBlcnNpc3RlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci0KLS8qKgotICogSW1wb3J0cyBhIG1ldGhvZCBwbHVnLWluIGludG8gdGhlIGN1cnJlbnQgbGlicmFyeS4KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQGF1dGhvciBXZWlwaW5nIEx1Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBQbHVnaW5JbXBvcnRpbmdTZXJ2aWNlIHsKLQotCXByaXZhdGUgVXBncmFkZUNhbGxlckluZm8gdXBHcmFkZUluZm87Ci0JCi0JLy9UZW1wIGZsYWcgaW5kaWNhdGluZyB1c2Ugb2YgdGhlIG5ldyBtZXJnZSBzY2hlbWUKLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIG5ld01lcmdlU2NoZW1lID0gdHJ1ZTsgCi0JCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBsb2NhbERlYnVnID0gZmFsc2U7Ci0JCi0JcHJpdmF0ZSBQbHVnaW5JbXBvcnREYXRhIGRhdGE7Ci0JCi0JcHJpdmF0ZSBPYmplY3QgdmFsaWRhdGVIb29rRGF0YTsKLQotCUxpYnJhcnlEb2N1bWVudCBpbXBvcnRpbmdMaWJEb2M7Ci0JTGlicmFyeURvY3VtZW50IHRhcmdldExpYkRvYzsKLQotCS8vIEZsYWcgdG8gaW5kaWNhdGUgdGhlIGZpbGUgY2hlY2tvdXQgc3RhdHVzLgotCUlTdGF0dXMgZmlsZUNoZWNrZWRPdXRTdGF0dXMgPSBudWxsOwotCQotCXByaXZhdGUgYm9vbGVhbiBjaGVja0Jhc2VQbHVnaW5zID0gdHJ1ZTsKLQkKLQlwcml2YXRlIEZpbGUgZGVmYXVsdENvbmZpZ0ZvbGRlcjsKLQlwcml2YXRlIE1hcDxTdHJpbmcsIEZpbGU+IHRhcmdldEZpbGVNYXA7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBQbHVnaW5JbXBvcnRpbmdTZXJ2aWNlKFBsdWdpbkltcG9ydERhdGEgZGF0YSkgewotCQl0aGlzLmRhdGEgPSBkYXRhOwotCX0KLQotCS8qKgotCSAqIFZhbGlkYXRlcyB0aGUgcGx1Zy1pbiBhZ2FpbnN0IHRoZSBjdXJyZW50IGxpYnJhcnksIGNvbGxlY3RzIGFsbCB0aGUKLQkgKiBpbmZvcm1hdGlvbnMgaW5jbHVkaW5nIHBsdWctaW4gaW5mbywgY29uZmlndWF0aW9uIGluZm8gYW5kIGVycm9yIGluZm8uCi0JICogQ2FsbCB0aGlzIG1ldGhvZCwgdGhlbiBjYWxsIGdldEVycm9yKCksIGdldFBsdWdpbnMoKSwgZ2V0Q29uZmlncygpLgotCSAqLwotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQl0cnkgewotCQkJaWYgKG1vbml0b3IgIT0gbnVsbCkgewotCQkJCW1vbml0b3Iuc2V0VGFza05hbWUoSW1wb3J0UmVzb3VyY2VzLlBsdWdpbkltcG9ydGluZ1NlcnZpY2VfTVNHMCk7IAotCQkJfQotCi0JCQlpZiAodGhpcy5kYXRhID09IG51bGwpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0KLQkJCXRoaXMuZGF0YS5jbGVhcigpOwotCi0JCQkvLyBQcmVwYXJlIHRoZSBsaWIgZmlsZXMuCi0JCQlGaWxlIGltcG9ydGluZ0xpYlBhdGggPSBuZXcgRmlsZShkYXRhLmxsRGF0YS5nZXRQYXJlbnRGb2xkZXIoKQotCQkJCQkrIEZpbGUuc2VwYXJhdG9yICsgTGlicmFyeURvY3VtZW50LmV4cG9ydEZpbGUpOwotCQkJaWYgKCFpbXBvcnRpbmdMaWJQYXRoLmV4aXN0cygpKSB7Ci0JCQkJZGF0YQotCQkJCQkJLmdldEVycm9ySW5mbygpCi0JCQkJCQkuYWRkRXJyb3IoCi0JCQkJCQkJCU5MUy5iaW5kKEltcG9ydFJlc291cmNlcy5QbHVnaW5JbXBvcnRpbmdTZXJ2aWNlX01TRzEsIGltcG9ydGluZ0xpYlBhdGgudG9TdHJpbmcoKSkpOyAKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQkKLQkJCWJvb2xlYW4gaGFuZGxlVmVyc2lvbiA9IHRydWU7Ci0JCQlpZiAoaGFuZGxlVmVyc2lvbikgewotCQkJCXVwR3JhZGVJbmZvID0gbmV3IENvbmZpZ3VyYXRpb25JbXBvcnRTZXJ2aWNlLlVwZ3JhZGVJbmZvKFVwZ3JhZGVDYWxsZXJJbmZvLnVwZ3JhZGVJbXBvcnRQbHVnaW4sIGltcG9ydGluZ0xpYlBhdGgpOwotCQkJCWlmICghIENvbmZpZ3VyYXRpb25JbXBvcnRTZXJ2aWNlLmhhbmRsZVRvb2xWZXJzaW9uKGltcG9ydGluZ0xpYlBhdGgsIHVwR3JhZGVJbmZvKSkgewotCQkJCQlkYXRhCi0JCQkJCS5nZXRFcnJvckluZm8oKQotCQkJCQkuYWRkRXJyb3IoCi0JCQkJCQkJTkxTLmJpbmQoSW1wb3J0UmVzb3VyY2VzLmltcG9ydFBsdWdpbnNXaXphcmRfRVJSX0ltcG9ydF9wbHVnaW4sIGltcG9ydGluZ0xpYlBhdGgudG9TdHJpbmcoKSkpOyAKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlpZiAodXBHcmFkZUluZm8uZ2V0Q29waWVkTGliRmlsZSgpICE9IG51bGwpIHsKLQkJCQkJaW1wb3J0aW5nTGliUGF0aCA9IHVwR3JhZGVJbmZvLmdldENvcGllZExpYkZpbGUoKTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCVN0cmluZyB2ZXJzaW9uRXJyb3IgPSBDb25maWd1cmF0aW9uSW1wb3J0U2VydmljZS52ZXJzaW9uQ2hlY2soaW1wb3J0aW5nTGliUGF0aC5nZXRBYnNvbHV0ZVBhdGgoKSwgCi0JCQkJCQlJbXBvcnRSZXNvdXJjZXMuaW1wb3J0UGx1Z2luc1dpemFyZF90aXRsZSk7Ci0JCQkJaWYgKHZlcnNpb25FcnJvciAhPSBudWxsKSB7Ci0JCQkJCWRhdGEuZ2V0RXJyb3JJbmZvKCkuYWRkRXJyb3IodmVyc2lvbkVycm9yKTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCX0KLQkJCQotCQkJdmFsaWRhdGVIb29rKG1vbml0b3IsIGltcG9ydGluZ0xpYlBhdGgsIHZhbGlkYXRlSG9va0RhdGEpOwotCi0JCQlpbXBvcnRpbmdMaWJEb2MgPSBuZXcgTGlicmFyeURvY3VtZW50KGltcG9ydGluZ0xpYlBhdGgpOwotCQkJCi0JCQlGaWxlIGxpYkZpbGUgPSBuZXcgRmlsZShMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJCS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpLmVSZXNvdXJjZSgpLmdldFVSSSgpCi0JCQkJCS50b0ZpbGVTdHJpbmcoKSk7Ci0JCQl0YXJnZXRMaWJEb2MgPSBuZXcgTGlicmFyeURvY3VtZW50KGxpYkZpbGUpOwotCi0JCQlzY2FuTGlicmFyeUZpbGUoaW1wb3J0aW5nTGliRG9jKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQlleC5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCi0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVIb29rKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgRmlsZSBpbXBvcnRpbmdMaWJQYXRoLCBPYmplY3Qgb2JqZWN0KSB7Ci0JfQotCQotCS8qKgotCSAqIFBlcmZvcm1zIGltcG9ydC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBwZXJmb3JtSW1wb3J0KElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJLy8gbmVlZCB0byBkaXNhYmxlIHRoZSB3b3Jrc3BhY2UgcmVmcmVzaGluZwotCQlib29sZWFuIHJlZnJlc2ggPSBSZWZyZXNoSm9iLmdldEluc3RhbmNlKCkuaXNFbmFibGVkKCk7Ci0JCXRyeSB7Ci0JCQlpZiAocmVmcmVzaCkgewotCQkJCS8vIGRpc2FibGUgcmVzb3VyY2UgcmVmcmVzaGluZyBkdXJpbmcgaW1wb3J0Ci0JCQkJLy8KLQkJCQlSZWZyZXNoSm9iLmdldEluc3RhbmNlKCkuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQl9Ci0KLQkJCV9fZG9JbXBvcnQobW9uaXRvcik7Ci0KLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChyZWZyZXNoKSB7Ci0JCQkJLy8gcmUtZW5hYmxlIHJlc291cmNlIHJlZnJlc2hpbmcKLQkJCQkvLwotCQkJCVJlZnJlc2hKb2IuZ2V0SW5zdGFuY2UoKS5zZXRFbmFibGVkKHRydWUpOwotCQkJfQotCQkJaWYgKHVwR3JhZGVJbmZvICE9IG51bGwpIHsKLQkJCQl1cEdyYWRlSW5mby5yZW1vdmVDb3BpZWRMaWJyYXJ5KCk7Ci0JCQkJdXBHcmFkZUluZm8gPSBudWxsOwotCQkJfQotCQkJZGVmYXVsdENvbmZpZ0ZvbGRlciA9IG51bGw7Ci0JCQl0YXJnZXRGaWxlTWFwID0gbnVsbDsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBfX2RvSW1wb3J0KElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQl0cnkgewotCQkJaWYgKG1vbml0b3IgIT0gbnVsbCkgewotCQkJCW1vbml0b3Iuc2V0VGFza05hbWUoSW1wb3J0UmVzb3VyY2VzLlBsdWdpbkltcG9ydGluZ1NlcnZpY2VfTVNHMyk7IAotCQkJfQotCi0JCQlMaXN0IHVubG9ja2VkUGx1Z2lucyA9IHVubG9ja1BsdWdpbnMoKTsKLQkJCWlmICgoZmlsZUNoZWNrZWRPdXRTdGF0dXMgIT0gbnVsbCkKLQkJCQkJJiYgIWZpbGVDaGVja2VkT3V0U3RhdHVzLmlzT0soKSkgewotCQkJCS8vIGxvZyBlcnJvcgotCQkJCWRpc3BsYXlDaGVja091dEVycm9yKCk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCi0JCQkvLyBUbyBpbXBvcnQgdGhlIHBsdWctaW5zLCB3ZSBuZWVkIHRvIGRvIHRoZSBmb2xsb3dpbmc6Ci0JCQkvLyAxLiBEZWxldGUgdGhlIHBsdWctaW5zIGluIHRoZSBjdXJyZW50IGxpYnJhcnkgaWYgdXNlciBzcGVjaWZ5Ci0JCQkvLyByZW1vdmUKLQkJCS8vIDIuIENvcHkgdGhlIHNlbGVjdGVkIHBsdWdpbiBmaWxlcyB0byB0aGUgZGVzdGluYXRpb24KLQkJCS8vIDMuIFVwZGF0ZSB0aGUgbGlicmFyeS54bWkKLQkJCS8vIDQuIFJlbG9hZCB0aGUgbGlicmFyeQotCQkJCi0JCQlGaWxlIGxpYkZpbGUgPSB0YXJnZXRMaWJEb2MuZ2V0RmlsZSgpOwotCQkJZGVmYXVsdENvbmZpZ0ZvbGRlciA9IG51bGw7Ci0JCQl0YXJnZXRGaWxlTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBGaWxlPigpOwotCQkJCi0JCQlpZiAobmV3TWVyZ2VTY2hlbWUpIHsJCQkKLQkJCQlpZiAoISBtZXJnZSh0YXJnZXRMaWJEb2MpKSB7Ci0JCQkJCVNhZmVVcGRhdGVDb250cm9sbGVyLnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQlTdHJpbmcgdGl0bGUgPSBJbXBvcnRSZXNvdXJjZXMuaW1wb3J0UGx1Z2luc1dpemFyZF90aXRsZTsKLQkJCQkJCQlTdHJpbmcgbXNnID0gSW1wb3J0UmVzb3VyY2VzLmltcG9ydFBsdWdpbnNXaXphcmRfRVJSX0ltcG9ydF9wbHVnaW47IAotCQkJCQkJCW5ldyBNc2dEaWFsb2coSW1wb3J0UGx1Z2luLmdldERlZmF1bHQoKSkKLQkJCQkJCQkJCS5kaXNwbGF5RXJyb3IodGl0bGUsIG1zZyk7Ci0JCQkJCQl9Ci0JCQkJCX0pOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCWlmICh1bmxvY2tlZFBsdWdpbnMuc2l6ZSgpID4gMCkgewotCQkJCQlsb2NrVW5sb2NrZWRQbHVnaW5zKHVubG9ja2VkUGx1Z2lucyk7Ci0JCQkJCUxpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuc2F2ZUN1cnJlbnRNZXRob2RMaWJyYXJ5KCk7Ci0JCQkJCUxpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkucmVvcGVuQ3VycmVudE1ldGhvZExpYnJhcnkoKTsKLQkJCQl9Ci0JCQkJTWV0aG9kTGlicmFyeSBsaWIgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCk7Ci0JCQkJUmVzb3VyY2VVdGlsLnJlZnJlc2hSZXNvdXJjZXMobGliLCBtb25pdG9yKTsKLQkJCQlyZXR1cm47Ci0JCQl9CQkJCi0KLQkJCS8vIC8vIFJlbW92ZSBleGlzdGluZyBlbnRyaWVzLgotCQkJLy8gcmVtb3ZlRXhpc3RpbmdFbnRyaWVzKHRhcmdldExpYkRvYyk7Ci0KLQkJCS8vIEltcG9ydCBlbnRyaWVzIGFuZCBjb3B5IGZpbGVzLgotCQkJaWYgKGltcG9ydEVudHJpZXModGFyZ2V0TGliRG9jKSkgewotCQkJCS8vIFNhdmUgdGhlIHVwZGF0ZWQgbGlicmFyeSBmaWxlLgotCQkJCXRhcmdldExpYkRvYy5zYXZlKCk7Ci0KLQkJCQkvLyBSZXBsYWNlIHRoZSBndWlkIG9mIHRoZSBvbGQgTWV0aG9kTGlicmFyeSB3aXRoIHRoZSBuZXcgb25lLgotCQkJCWZpeExpYnJhcnlHdWlkKGxpYkZpbGUuZ2V0UGFyZW50RmlsZSgpLCBpbXBvcnRpbmdMaWJEb2MKLQkJCQkJCS5nZXRMaWJyYXJ5R3VpZCgpLCB0YXJnZXRMaWJEb2MuZ2V0TGlicmFyeUd1aWQoKSk7Ci0KLQkJCQkvLyBSZW9wZW4gdGhlIGxpYnJhcnkuCi0JCQkJTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5yZW9wZW5DdXJyZW50TWV0aG9kTGlicmFyeSgpOwotCi0JCQkJLy8gRmluYWxseSwgcmUtbG9jayB0aGUgdW5sb2NrZWQgcGx1Z2lucyBhbmQgc2F2ZSB0aGUgbGlicmFyeQotCQkJCS8vIGFnYWluLgotCQkJCWlmICh1bmxvY2tlZFBsdWdpbnMuc2l6ZSgpID4gMCkgewotCQkJCQlsb2NrVW5sb2NrZWRQbHVnaW5zKHVubG9ja2VkUGx1Z2lucyk7Ci0JCQkJCUxpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuc2F2ZUN1cnJlbnRNZXRob2RMaWJyYXJ5KCk7Ci0JCQkJfQotCQkJfQotCi0JCQkvLyBSZS1vcGVuIGxpYnJhcnkgYW5kIGZyZXNoIHRoZSB3b3Jrc3BhY2UuCi0JCQlMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLnJlb3BlbkN1cnJlbnRNZXRob2RMaWJyYXJ5KCk7Ci0KLQkJCS8vIHJlZnJlc2ggbGlicmFyeSBmaWxlcyBpbiB3b3Jrc3BhY2UKLQkJCS8vCi0JCQlNZXRob2RMaWJyYXJ5IGxpYiA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKTsKLQkJCVJlc291cmNlVXRpbC5yZWZyZXNoUmVzb3VyY2VzKGxpYiwgbW9uaXRvcik7Ci0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCUltcG9ydFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIExpc3QgdW5sb2NrUGx1Z2lucygpIHsKLQotCQlMaXN0IHBsdWdpbklkcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCi0JCU1hcDxTdHJpbmcsIE1ldGhvZFBsdWdpbj4gbWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBNZXRob2RQbHVnaW4+KCk7Ci0JCUxpc3Q8TWV0aG9kUGx1Z2luPiBiYXNlUGx1Z2lucyA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKQotCQkJCQkJCQkJCQkuZ2V0TWV0aG9kUGx1Z2lucygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGJhc2VQbHVnaW5zLnNpemUoKTsgaSsrKSB7Ci0JCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gYmFzZVBsdWdpbnMuZ2V0KGkpOwotCQkJbWFwLnB1dChwbHVnaW4uZ2V0TmFtZSgpLCBwbHVnaW4pOwotCQl9Ci0JCUxpc3Q8TWV0aG9kUGx1Z2luPiBwb3NzaWJsZUV4dHJhVW5sb2NrUGx1Z2lucyA9IG5ldyBBcnJheUxpc3Q8TWV0aG9kUGx1Z2luPigpOwotCi0JCVBsdWdpbkltcG9ydERhdGEuUGx1Z2luSW5mbyBpbmZvOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gZGF0YS5nZXRQbHVnaW5zKCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJaW5mbyA9IChQbHVnaW5JbXBvcnREYXRhLlBsdWdpbkluZm8pIGl0Lm5leHQoKTsKLQkJCWlmICgoaW5mby5leGlzdGluZ1BsdWdpbiAhPSBudWxsKSAmJiBpbmZvLnNlbGVjdGVkKSB7Ci0JCQkJaWYgKGluZm8uZXhpc3RpbmdQbHVnaW4uZ2V0VXNlckNoYW5nZWFibGUoKS5ib29sZWFuVmFsdWUoKSA9PSBmYWxzZSkgewotCQkJCQlpbmZvLmV4aXN0aW5nUGx1Z2luLnNldFVzZXJDaGFuZ2VhYmxlKG5ldyBCb29sZWFuKHRydWUpKTsKLQkJCQkJcGx1Z2luSWRzLmFkZChpbmZvLmV4aXN0aW5nUGx1Z2luLmdldEd1aWQoKSk7Ci0JCQkJfQotCQkJfQotCQkJaWYgKGluZm8uc2VsZWN0ZWQpIHsKLQkJCQlNZXRob2RQbHVnaW4gYmFzZVBsdWdpbiA9IG1hcC5nZXQoaW5mby5uYW1lKTsKLQkJCQlpZiAoYmFzZVBsdWdpbiAhPSBudWxsICYmICEgYmFzZVBsdWdpbi5nZXRHdWlkKCkuZXF1YWxzKGluZm8uZ3VpZCkKLQkJCQkJCSYmICEgYmFzZVBsdWdpbi5nZXRVc2VyQ2hhbmdlYWJsZSgpKSB7Ci0JCQkJCXBvc3NpYmxlRXh0cmFVbmxvY2tQbHVnaW5zLmFkZChiYXNlUGx1Z2luKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCWhhbmRsZUV4dHJhVW5sb2NrUGx1Z2lucyhwbHVnaW5JZHMsIHBvc3NpYmxlRXh0cmFVbmxvY2tQbHVnaW5zKTsKLQkJCi0JCXJldHVybiBwbHVnaW5JZHM7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZUV4dHJhVW5sb2NrUGx1Z2lucyhMaXN0IHBsdWdpbklkcywKLQkJCUxpc3Q8TWV0aG9kUGx1Z2luPiBwb3NzaWJsZUV4dHJhVW5sb2NrUGx1Z2lucykgewotCQlpZiAocG9zc2libGVFeHRyYVVubG9ja1BsdWdpbnMgPT0gbnVsbCB8fCBwb3NzaWJsZUV4dHJhVW5sb2NrUGx1Z2lucy5pc0VtcHR5KCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJTGlzdCBmaWxlTmFtZVRvQ2hlY2sgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcG9zc2libGVFeHRyYVVubG9ja1BsdWdpbnMuc2l6ZSgpOyBpKyspIHsKLQkJCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSBwb3NzaWJsZUV4dHJhVW5sb2NrUGx1Z2lucy5nZXQoaSk7Ci0JCQlTdHJpbmcgZ3VpZCA9IHBsdWdpbi5nZXRHdWlkKCk7Ci0JCQlpZiAoISBwbHVnaW5JZHMuY29udGFpbnMoZ3VpZCkpIHsKLQkJCQlwbHVnaW4uc2V0VXNlckNoYW5nZWFibGUobmV3IEJvb2xlYW4odHJ1ZSkpOwotCQkJCXBsdWdpbklkcy5hZGQoZ3VpZCk7Ci0JCQkJUmVzb3VyY2UgcmVzID0gcGx1Z2luLmVSZXNvdXJjZSgpOwotCQkJCWlmIChyZXMgIT0gbnVsbCAmJiByZXMuZ2V0VVJJKCkgIT0gbnVsbCkgewotCQkJCQlTdHJpbmcgZmlsZU5hbWUgPSByZXMuZ2V0VVJJKCkudG9GaWxlU3RyaW5nKCk7Ci0JCQkJCWZpbGVOYW1lVG9DaGVjay5hZGQoZmlsZU5hbWUpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWlmIChmaWxlTmFtZVRvQ2hlY2suc2l6ZSgpID4gMCkgewotCQkJZmluYWwgTGlzdCBtb2RpZmllZEZpbGVzID0gZmlsZU5hbWVUb0NoZWNrOwkKLQkJCVNhZmVVcGRhdGVDb250cm9sbGVyLnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCWZpbGVDaGVja2VkT3V0U3RhdHVzID0gRmlsZU1vZGlmeUNoZWNrZXIuY2hlY2tNb2RpZnkobW9kaWZpZWRGaWxlcyk7Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgbG9ja1VubG9ja2VkUGx1Z2lucyhMaXN0IHVubG9ja2VkUGx1Z2lucykgewotCQlMaXN0IHBsdWdpbnMgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCkKLQkJCQkuZ2V0TWV0aG9kUGx1Z2lucygpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gcGx1Z2lucy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gKE1ldGhvZFBsdWdpbikgaXQubmV4dCgpOwotCQkJaWYgKHVubG9ja2VkUGx1Z2lucy5jb250YWlucyhwbHVnaW4uZ2V0R3VpZCgpKSkgewotCQkJCXBsdWdpbi5zZXRVc2VyQ2hhbmdlYWJsZShuZXcgQm9vbGVhbihmYWxzZSkpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGltcG9ydEVudHJpZXMoTGlicmFyeURvY3VtZW50IHRhcmdldExpYkRvYykgewotCQkvLyAxLiBGaW5kIHRoZSBlbnRyaWVzIHRvIGJlIHJlbW92ZWQuCi0JCUxpc3QgaW1wb3J0TGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJTGlzdCBuZXdMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlQbHVnaW5JbXBvcnREYXRhLlBsdWdpbkluZm8gaW5mbzsKLQkJZm9yIChJdGVyYXRvciBpdCA9IGRhdGEuZ2V0UGx1Z2lucygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCWluZm8gPSAoUGx1Z2luSW1wb3J0RGF0YS5QbHVnaW5JbmZvKSBpdC5uZXh0KCk7Ci0JCQlpZiAoaW5mby5zZWxlY3RlZCkgewotCQkJCWlmIChpbmZvLmV4aXN0aW5nUGx1Z2luID09IG51bGwpIHsKLQkJCQkJbmV3TGlzdC5hZGQoaW5mby5ndWlkKTsKLQkJCQl9Ci0KLQkJCQlpbXBvcnRMaXN0LmFkZChpbmZvLmd1aWQpOwotCQkJfQotCQl9Ci0KLQkJUGx1Z2luSW1wb3J0RGF0YS5Db25maWd1YXJhdGlvbkluZm8gY2luZm87Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSBkYXRhLmdldENvbmZpZ3MoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQljaW5mbyA9IChQbHVnaW5JbXBvcnREYXRhLkNvbmZpZ3VhcmF0aW9uSW5mbykgaXQubmV4dCgpOwotCQkJaWYgKGNpbmZvLnNlbGVjdGVkKSB7Ci0JCQkJaWYgKGNpbmZvLmV4aXN0aW5nQ29uZmlnID09IG51bGwpIHsKLQkJCQkJbmV3TGlzdC5hZGQoY2luZm8uZ3VpZCk7Ci0JCQkJfQotCi0JCQkJaW1wb3J0TGlzdC5hZGQoY2luZm8uZ3VpZCk7Ci0KLQkJCX0KLQkJfQotCi0JCS8vIDIuIEl0ZXJhdGUgdGhlIGRvY3VlbW50IGFuZCBhZGQgdGhlIG5ldyBlbnRyaWVzLgotCQlpZiAoIW5ld01lcmdlU2NoZW1lKSB7Ci0JCQlpbXBvcnRMaWJFbnRyaWVzKHRhcmdldExpYkRvYywgbmV3TGlzdCk7Ci0JCX0gZWxzZSB7Ci0JCQlNZXRob2RMaWJyYXJ5IGxpYiA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKTsKLQkJCWVuc3VyZVVuaXF1ZU5hbWVzKGxpYi5nZXRNZXRob2RQbHVnaW5zKCkpOwotCQkJZW5zdXJlVW5pcXVlTmFtZXMobGliLmdldFByZWRlZmluZWRDb25maWd1cmF0aW9ucygpKTsKLQkJfQotCQlyZXR1cm4gY29weUZpbGVzKHRhcmdldExpYkRvYywgaW1wb3J0TGlzdCwgbmV3TGlzdCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGltcG9ydExpYkVudHJpZXMoTGlicmFyeURvY3VtZW50IHRhcmdldExpYkRvYywgTGlzdCBuZXdMaXN0KSB7Ci0KLQkJaWYgKG5ld0xpc3QgPT0gbnVsbCB8fCBuZXdMaXN0LnNpemUoKSA9PSAwKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQkvLyBBZGQgcGx1Zy1pbnMuCi0JCU5vZGVMaXN0IG5vZGVzID0gaW1wb3J0aW5nTGliRG9jLmdldFBsdWdpbnMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBub2Rlcy5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCQlFbGVtZW50IG5vZGUgPSAoRWxlbWVudCkgbm9kZXMuaXRlbShpKTsKLQkJCVN0cmluZyBndWlkID0gTGlicmFyeURvY3VtZW50LmdldEd1aWQobm9kZSk7Ci0JCQlpZiAobmV3TGlzdC5jb250YWlucyhndWlkKSkgewotCQkJCXRhcmdldExpYkRvYy5hZGRQbHVnaW4obm9kZSk7Ci0JCQl9Ci0JCX0KLQotCQkvLyBBZGQgY29uZmlndXJhdGlvbnMuCi0JCW5vZGVzID0gaW1wb3J0aW5nTGliRG9jLmdldENvbmZpZ3VyYXRpb25zKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbm9kZXMuZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJRWxlbWVudCBub2RlID0gKEVsZW1lbnQpIG5vZGVzLml0ZW0oaSk7Ci0JCQlTdHJpbmcgZ3VpZCA9IExpYnJhcnlEb2N1bWVudC5nZXRHdWlkKG5vZGUpOwotCQkJaWYgKG5ld0xpc3QuY29udGFpbnMoZ3VpZCkpIHsKLQkJCQl0YXJnZXRMaWJEb2MuYWRkQ29uZmlndXJhdGlvbihub2RlKTsKLQkJCX0KLQkJfQotCi0JCS8vIGFkZCByZXNvdXJjZSBlbnRyaWVzCi0JCW5vZGVzID0gaW1wb3J0aW5nTGliRG9jLmdldFJlc291cmNlRGVzY3JpcHRvcnMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBub2Rlcy5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCQlFbGVtZW50IG5vZGUgPSAoRWxlbWVudCkgbm9kZXMuaXRlbShpKTsKLQkJCVN0cmluZyBndWlkID0gbm9kZS5nZXRBdHRyaWJ1dGUoTGlicmFyeURvY3VtZW50LkFUVFJfaWQpOwotCQkJaWYgKG5ld0xpc3QuY29udGFpbnMoZ3VpZCkpIHsKLQkJCQl0YXJnZXRMaWJEb2MuYWRkUmVzb3VyY2Uobm9kZSk7Ci0JCQl9Ci0JCX0KLQotCQkvLyBBZGQgdGhlIHJlc291cmNlIHN1YiBtYW5hZ2Vycy4KLQkJbm9kZXMgPSBpbXBvcnRpbmdMaWJEb2MuZ2V0UmVzb3VyY2VTdWJNYW5hZ2VycygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG5vZGVzLmdldExlbmd0aCgpOyBpKyspIHsKLQkJCUVsZW1lbnQgbm9kZSA9IChFbGVtZW50KSBub2Rlcy5pdGVtKGkpOwotCQkJU3RyaW5nIGd1aWQgPSBMaWJyYXJ5RG9jdW1lbnQuZ2V0U3ViTWFuYWdlckJhc2VHdWlkKG5vZGUKLQkJCQkJLmdldEF0dHJpYnV0ZShMaWJyYXJ5RG9jdW1lbnQuQVRUUl9ocmVmKSk7Ci0JCQlpZiAobmV3TGlzdC5jb250YWlucyhndWlkKSkgewotCQkJCXRhcmdldExpYkRvYy5hZGRSZXNvdXJjZShub2RlKTsKLQkJCX0KLQkJfQotCi0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGNvcHlGaWxlcyhMaWJyYXJ5RG9jdW1lbnQgdGFyZ2V0TGliRG9jLCBMaXN0IGltcG9ydExpc3QsCi0JCQlMaXN0IG5ld0xpc3QpIHsKLQkJZmluYWwgTWV0aG9kTGlicmFyeSBsaWIgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCk7Ci0JCQotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gaW1wb3J0TGlzdC5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlTdHJpbmcgZ3VpZCA9IChTdHJpbmcpIGl0Lm5leHQoKTsKLQkJCVN0cmluZyBzcmNfdXJpID0gaW1wb3J0aW5nTGliRG9jLmdldFJlc291cmNlVXJpKGd1aWQpOwotCQkJU3RyaW5nIHRhcmdldF91cmk7Ci0JCQlpZiAoc3JjX3VyaSA9PSBudWxsIHx8IHNyY191cmkubGVuZ3RoKCkgPT0gMCkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCi0JCQl0YXJnZXRfdXJpID0gc3JjX3VyaTsKLQkJCS8qCi0JCQlpZiAobmV3TGlzdC5jb250YWlucyhndWlkKSkgewotCQkJCXRhcmdldF91cmkgPSBzcmNfdXJpOwotCQkJfSBlbHNlIHsKLQkJCQl0YXJnZXRfdXJpID0gdGFyZ2V0TGliRG9jLmdldFJlc291cmNlVXJpKGd1aWQpOyAvLyB0aGUgcmVzb3VyY2UKLQkJCQkvLyBtaWdodCBiZQotCQkJCS8vIHJlbmFtZWQKLQkJCX0KLQkJCSovCi0KLQkJCS8vIENoZWNrIHRoZSBwbHVnaW4ueG1pIGZpbGUuIElmIGl0IGV4aXN0cywgY29weSB0aGUgZm9sZGVyIHRvCi0JCQkvLyB0aGUgZGVzdGluYXRpb24gZGlyZWN0b3J5LgotCQkJZmluYWwgRmlsZSBzcmNfZmlsZSA9IGltcG9ydGluZ0xpYkRvYy5nZXRGaWxlRnJvbVVyaShzcmNfdXJpKTsKLQkJCWlmIChzcmNfZmlsZS5leGlzdHMoKSkgewotLyoJCQkJZmluYWwgRmlsZSB0YXJnZXRfZmlsZSA9IHRhcmdldExpYkRvYwotCQkJCQkJLmdldEZpbGVGcm9tVXJpKHRhcmdldF91cmkpOyovCi0JCQkJCi0JCQkJZmluYWwgRmlsZSB0YXJnZXRfZmlsZSA9IGdldFRhcmdldEZpbGUobGliLCBndWlkKTsKLQkJCQlpZiAodGFyZ2V0X2ZpbGUgPT0gbnVsbCkgewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJCXRhcmdldEZpbGVNYXAucHV0KGd1aWQsIHRhcmdldF9maWxlKTsKLQotCQkJCS8vIGlmIGl0J3MgYSBjb25maWd1cmF0aW9uLCBvbmx5IGNvcHkgdGhlIGZpbGUsCi0JCQkJLy8gaWYgaXQncyBhIHBsdWdpbiwgY29weSB0aGUgd2hvbGUgZGlyZWN0b3J5Ci0KLQkJCQlpZiAoZGF0YS5nZXRQbHVnaW5JbmZvKGd1aWQpICE9IG51bGwpIHsKLQkJCQkJaWYgKHRhcmdldF9maWxlLmV4aXN0cygpKSB7Ci0JCQkJCQlTYWZlVXBkYXRlQ29udHJvbGxlci5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCQlEaXJDb3B5IGNvcHkgPSBuZXcgRGlyQ29weShzcmNfZmlsZQotCQkJCQkJCQkJCS5nZXRQYXJlbnRGaWxlKCksIHRhcmdldF9maWxlCi0JCQkJCQkJCQkJLmdldFBhcmVudEZpbGUoKSk7Ci0JCQkJCQkJCWZpbGVDaGVja2VkT3V0U3RhdHVzID0gY29weS5leGVjdXRlKCk7Ci0JCQkJCQkJfQotCQkJCQkJfSk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQljb3B5RGlyKHNyY19maWxlLmdldFBhcmVudEZpbGUoKSwgdGFyZ2V0X2ZpbGUKLQkJCQkJCQkJLmdldFBhcmVudEZpbGUoKSk7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgaWYgKGRhdGEuZ2V0Q29uZmlnSW5mbyhndWlkKSAhPSBudWxsICYmIERpckNvcHkubmVlZENvcHkoc3JjX2ZpbGUsIHRhcmdldF9maWxlKSkgewotCQkJCQlmaW5hbCBMaXN0IGZpbGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQlpZiAodGFyZ2V0X2ZpbGUuZXhpc3RzKCkpIHsKLQkJCQkJCWZpbGVzLmFkZCh0YXJnZXRfZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0JCQkJCQlTYWZlVXBkYXRlQ29udHJvbGxlci5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCQlmaWxlQ2hlY2tlZE91dFN0YXR1cyA9IEZpbGVNb2RpZnlDaGVja2VyCi0JCQkJCQkJCQkJLmNoZWNrTW9kaWZ5KGZpbGVzKTsKLQkJCQkJCQl9Ci0JCQkJCQl9KTsKLQkJCQkJfQotCi0JCQkJCWlmIChmaWxlQ2hlY2tlZE91dFN0YXR1cyA9PSBudWxsCi0JCQkJCQkJfHwgZmlsZUNoZWNrZWRPdXRTdGF0dXMuaXNPSygpKSB7Ci0JCQkJCQlGaWxlVXRpbC5jb3B5RmlsZShzcmNfZmlsZSwgdGFyZ2V0X2ZpbGUpOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJaWYgKChmaWxlQ2hlY2tlZE91dFN0YXR1cyAhPSBudWxsKQotCQkJCQkJJiYgIWZpbGVDaGVja2VkT3V0U3RhdHVzLmlzT0soKSkgewotCQkJCQkvLyBsb2cgZXJyb3IKLQkJCQkJZGlzcGxheUNoZWNrT3V0RXJyb3IoKTsKLQotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGRpc3BsYXlDaGVja091dEVycm9yKCkgewotCQlTYWZlVXBkYXRlQ29udHJvbGxlci5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJU3RyaW5nIHRpdGxlID0gSW1wb3J0UmVzb3VyY2VzLmltcG9ydFBsdWdpbnNXaXphcmRfdGl0bGU7IAotCQkJCVN0cmluZyBtc2cgPSBJbXBvcnRSZXNvdXJjZXMuaW1wb3J0UGx1Z2luc1dpemFyZF9FUlJfSW1wb3J0X3BsdWdpbjsgCi0JCQkJbmV3IE1zZ0RpYWxvZyhJbXBvcnRQbHVnaW4uZ2V0RGVmYXVsdCgpKQotCQkJCQkJLmRpc3BsYXlFcnJvcih0aXRsZSwgbXNnLAotCQkJCQkJCQlmaWxlQ2hlY2tlZE91dFN0YXR1cyk7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCS8qKgotCSAqIENvcGllcyBkaXJlY3RvcmllcyBmcm9tICJmcm9tRGlyIiB0byAidG9EaXIiLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBjb3B5RGlyKEZpbGUgZnJvbURpciwgRmlsZSB0b0RpcikgewotCQlDb3B5IGNwID0gbmV3IENvcHkoKTsKLQkJY3Auc2V0T3ZlcndyaXRlKHRydWUpOwotCQlGaWxlU2V0IHNldCA9IG5ldyBGaWxlU2V0KCk7Ci0JCXNldC5zZXRFeGNsdWRlcyhDb25maWd1cmF0aW9uRXhwb3J0U2VydmljZS5leGNsdWRlcyk7Ci0JCXNldC5zZXREaXIoZnJvbURpcik7Ci0JCWNwLmFkZEZpbGVzZXQoc2V0KTsKLQkJY3Auc2V0VG9kaXIodG9EaXIpOwotCQljcC5zZXRQcm9qZWN0KG5ldyBQcm9qZWN0KCkpOwotCQljcC5leGVjdXRlKCk7Ci0KLQl9Ci0KLQkvLyAvKioKLQkvLyAqIHJlbW92ZSB0aGUgcGx1Z2luIGVudHJ5IGZyb20gdGhlIGxpYnJhcnkgZG9jdW1lbnQKLQkvLyAqCi0JLy8gKiBAcGFyYW0gZG9jdW1lbnQKLQkvLyAqIExpYnJhcnlEb2N1bWVudAotCS8vICogQHBhcmFtIGd1aWQKLQkvLyAqIFN0cmluZyBndWlkIG9mIHRoZSBwbHVnaW4KLQkvLyAqLwotCS8vIHByaXZhdGUgdm9pZCByZW1vdmVFeGlzdGluZ0VudHJpZXMoTGlicmFyeURvY3VtZW50IGRvY3VtZW50KSB7Ci0JLy8gLy8gMS4gRmluZCB0aGUgZW50cmllcyB0byBiZSByZW1vdmVkLgotCS8vIExpc3QgcmVtb3ZlTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkvLyBQbHVnaW5JbXBvcnREYXRhLlBsdWdpbkluZm8gaW5mbzsKLQkvLyBmb3IgKEl0ZXJhdG9yIGl0ID0gZGF0YS5nZXRQbHVnaW5zKCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCS8vIGluZm8gPSAoUGx1Z2luSW1wb3J0RGF0YS5QbHVnaW5JbmZvKSBpdC5uZXh0KCk7Ci0JLy8gaWYgKChpbmZvLmV4aXN0aW5nUGx1Z2luICE9IG51bGwpICYmIGluZm8uc2VsZWN0ZWQpIHsKLQkvLyByZW1vdmVMaXN0LmFkZChpbmZvLmd1aWQpOwotCS8vIH0KLQkvLyB9Ci0JLy8KLQkvLyBQbHVnaW5JbXBvcnREYXRhLkNvbmZpZ3VhcmF0aW9uSW5mbyBjaW5mbzsKLQkvLyBmb3IgKEl0ZXJhdG9yIGl0ID0gZGF0YS5nZXRDb25maWdzKCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCS8vIGNpbmZvID0gKFBsdWdpbkltcG9ydERhdGEuQ29uZmlndWFyYXRpb25JbmZvKSBpdC5uZXh0KCk7Ci0JLy8gaWYgKChjaW5mby5leGlzdGluZ0NvbmZpZyAhPSBudWxsKSAmJiBjaW5mby5zZWxlY3RlZCkgewotCS8vIHJlbW92ZUxpc3QuYWRkKGNpbmZvLmd1aWQpOwotCS8vIH0KLQkvLyB9Ci0JLy8KLQkvLyAvLyAyLiBJdGVyYXRlIHRoZSBkb2N1ZW1udCBhbmQgcmVtb3ZlIHRoZSBlbnRyaWVzLgotCS8vIGRvY3VtZW50LnJlbW92ZVBsdWdpbnMocmVtb3ZlTGlzdCk7Ci0JLy8gZG9jdW1lbnQucmVtb3ZlQ29uZmlndXJhdGlvbnMocmVtb3ZlTGlzdCk7Ci0JLy8gZG9jdW1lbnQucmVtb3ZlUmVzb3VyY2VFbnRyaWVzKHJlbW92ZUxpc3QpOwotCS8vIH0KLQotCSAvKiogCi0JICAqIFZhbGlkYXRlcyBzZWxlY3Rpb24uCi0JICovCi0JcHVibGljIFN0cmluZyB2YWxpZGF0ZVNlbGVjdGlvbigpIHsKLQkJaWYgKCEgaXNDaGVja0Jhc2VQbHVnaW5zKCkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCWRhdGEuZ2V0RXJyb3JJbmZvKCkuY2xlYXIoKTsKLQotCQkvLyBJdGVyYXRlIHRoZSBuZXcgcGx1Z2lucywgbWFrZSBzdXJlIHRoZSBiYXNlIGlzIGluY2x1ZGVkCi0JCS8vIGVpdGhlciBhcyBhbiBpbXBvcnRpbmcgcGx1Z2luLCBvciBpcyBpbiB0aGUgY3VycmVudCBsaWJyYXJ5Ci0JCS8vIGdldCB0aGUgbWV0aG9kIHBsdWdpbnMgaW4gdGhlIGN1cnJlbnQgbGlicmFyeS4KLQkJTWV0aG9kTGlicmFyeSBsaWJyYXJ5ID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKQotCQkJCS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpOwotCQlMaXN0IHBsdWdpbnMgPSAobGlicmFyeSA9PSBudWxsKSA/IG5ldyBBcnJheUxpc3QoKSA6IGxpYnJhcnkKLQkJCQkuZ2V0TWV0aG9kUGx1Z2lucygpOwotCQlNYXAgcGx1Z2luaWRzID0gbmV3IEhhc2hNYXAoKTsKLQkJZm9yIChJdGVyYXRvciBpdCA9IHBsdWdpbnMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IChNZXRob2RQbHVnaW4pIGl0Lm5leHQoKTsKLQkJCXBsdWdpbmlkcy5wdXQocGx1Z2luLmdldEd1aWQoKSwgcGx1Z2luKTsKLQkJfQotCi0JCS8vIFRoZSBiYXNlIHBsdWctaW5zIE1VU1QgYmUgZWl0aGVyIGEgc2VsZWN0ZWQgb25lIG9yIGFuIGV4aXN0aW5nIG9uZQotCQkvLyBvdGhlcndpc2UsIGNhbid0IGltcG9ydAotCQlTZXQgYmFzZVBsdWdpbnMgPSBuZXcgSGFzaFNldCgpOwotCi0JCVNldCBuZXdQbHVnaW5zID0gbmV3IEhhc2hTZXQoKTsKLQkJZm9yIChJdGVyYXRvciBpdCA9IGRhdGEuZ2V0UGx1Z2lucygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCVBsdWdpbkltcG9ydERhdGEuUGx1Z2luSW5mbyBpbmZvID0gKFBsdWdpbkltcG9ydERhdGEuUGx1Z2luSW5mbykgaXQKLQkJCQkJLm5leHQoKTsKLQkJCS8vaWYgKGluZm8uc2VsZWN0ZWQgJiYgKGluZm8uZXhpc3RpbmdQbHVnaW4gPT0gbnVsbCkpIHsKLQkJCWlmIChpbmZvLnNlbGVjdGVkKSB7Ci0JCQkJbmV3UGx1Z2lucy5hZGQoaW5mby5ndWlkKTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0YiA9IGluZm8udXNlZFBsdWdpbnMuaXRlcmF0b3IoKTsgaXRiLmhhc05leHQoKTspIHsKLQkJCQkJT2JqZWN0IGJhc2UgPSBpdGIubmV4dCgpOwotCQkJCQlpZiAoIWJhc2VQbHVnaW5zLmNvbnRhaW5zKGJhc2UpKSB7Ci0JCQkJCQliYXNlUGx1Z2lucy5hZGQoYmFzZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlpZiAobmV3UGx1Z2lucy5zaXplKCkgPiAwKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gYmFzZVBsdWdpbnMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCVN0cmluZyBndWlkID0gKFN0cmluZykgaXQubmV4dCgpOwotCQkJCVN0cmluZyB1cmkgPSAoU3RyaW5nKSBkYXRhLmJhc2VQbHVnaW5VcmxNYXAuZ2V0KGd1aWQpOwotCQkJCWlmICghbmV3UGx1Z2lucy5jb250YWlucyhndWlkKSAmJiAhcGx1Z2luaWRzLmNvbnRhaW5zS2V5KGd1aWQpKSB7Ci0JCQkJCVN0cmluZyBtZXNzYWdlOwotCQkJCQlpZiAodXJpICE9IG51bGwgJiYgdXJpLmxlbmd0aCgpID4gMCkgewotCQkJCQkJbWVzc2FnZSA9IE5MUy5iaW5kKEltcG9ydFJlc291cmNlcy5QbHVnaW5JbXBvcnRpbmdTZXJ2aWNlX01TRzUsIHVyaSk7IAotCQkJCQl9IGVsc2UgewotCQkJCQkJTWFwPFN0cmluZywgU3RyaW5nPiBndWlkVG9QbHVnTmFtZU1hcCA9IGltcG9ydGluZ0xpYkRvYy5nZXRHdWlkVG9QbHVnTmFtZU1hcCgpOwotCQkJCQkJU3RyaW5nIHBsdWdpbk5hbWUgPSBndWlkVG9QbHVnTmFtZU1hcCA9PSBudWxsID8gbnVsbCA6IGd1aWRUb1BsdWdOYW1lTWFwLmdldChndWlkKTsKLQkJCQkJCWlmIChwbHVnaW5OYW1lID09IG51bGwgfHwgcGx1Z2luTmFtZS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJCQkJbWVzc2FnZSA9IE5MUy5iaW5kKEltcG9ydFJlc291cmNlcy5QbHVnaW5JbXBvcnRpbmdTZXJ2aWNlX01TRzUsIGd1aWQpOyAJCQotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQltZXNzYWdlID0gTkxTLmJpbmQoSW1wb3J0UmVzb3VyY2VzLlBsdWdpbkltcG9ydGluZ1NlcnZpY2VfTVNHNSwgCi0JCQkJCQkJCQlwbHVnaW5OYW1lICsgIiwgIiArIGd1aWQpOyAJCS8vJE5PTi1OTFMtMSQKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlkYXRhLmdldEVycm9ySW5mbygpLmFkZEVycm9yKG1lc3NhZ2UpOwotCi0JCQkJCWlmICh1cmkgPT0gbnVsbCB8fCB1cmkubGVuZ3RoKCkgPT0gMCkgewotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gZGF0YS5nZXRFcnJvckluZm8oKS5nZXRFcnJvcigpOwotCX0KLQotCXByaXZhdGUgdm9pZCBzY2FuTGlicmFyeUZpbGUoTGlicmFyeURvY3VtZW50IGRvY3VtZW50KSB7Ci0JCXZpc2l0TGliVGFnKGRvY3VtZW50KTsKLQkJdmlzaXRSZXNvdXJjZVRhZyhkb2N1bWVudCk7Ci0JCWRhdGEudmFsaWRhdGVQbHVnaW5zKCk7Ci0KLQkJLy8gQ2hlY2sgYmFzZSBwbHVnLWluIGRlcGVuZGVuY2llcy4KLQkJZm9yIChJdGVyYXRvciBpdCA9IGRhdGEuZ2V0UGx1Z2lucygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCVBsdWdpbkltcG9ydERhdGEuUGx1Z2luSW5mbyBpbmZvID0gKFBsdWdpbkltcG9ydERhdGEuUGx1Z2luSW5mbykgaXQKLQkJCQkJLm5leHQoKTsKLQkJCWlmIChpbmZvLmV4aXN0aW5nUGx1Z2luID09IG51bGwpIHsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0YmFzZSA9IGluZm8udXNlZFBsdWdpbnMuaXRlcmF0b3IoKTsgaXRiYXNlCi0JCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQlTdHJpbmcgZ3VpZCA9IChTdHJpbmcpIGl0YmFzZS5uZXh0KCk7Ci0JCQkJCWlmICghZGF0YS5iYXNlUGx1Z2luVXJsTWFwLmNvbnRhaW5zS2V5KGd1aWQpKSB7Ci0JCQkJCQlkYXRhLmJhc2VQbHVnaW5VcmxNYXAucHV0KGd1aWQsICIiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQlpZiAoZGF0YS5nZXRQbHVnaW5zKCkuc2l6ZSgpID4gMSkgewotCQkJQ29tcGFyYXRvciBjb21wYXJhdG9yID0gbmV3IENvbXBhcmF0b3I8UGx1Z2luSW1wb3J0RGF0YS5QbHVnaW5JbmZvPigpIHsKLQotCQkJCXB1YmxpYyBpbnQgY29tcGFyZShQbHVnaW5JbXBvcnREYXRhLlBsdWdpbkluZm8gbzEsCi0JCQkJCQlQbHVnaW5JbXBvcnREYXRhLlBsdWdpbkluZm8gbzIpIHsKLQkJCQkJaWYgKG8xID09IG8yKSB7Ci0JCQkJCQlyZXR1cm4gMDsKLQkJCQkJfQotCQkJCQlDb2xsYXRvciBjb2xsYXRvciA9IENvbGxhdG9yLmdldEluc3RhbmNlKCk7Ci0KLQkJCQkJcmV0dXJuIGNvbGxhdG9yLmNvbXBhcmUobzEubmFtZSwgbzIubmFtZSk7Ci0KLQkJCQl9Ci0KLQkJCX07Ci0KLQkJCUNvbGxlY3Rpb25zLjxQbHVnaW5JbXBvcnREYXRhLlBsdWdpbkluZm8+IHNvcnQoZGF0YS5nZXRQbHVnaW5zKCksCi0JCQkJCWNvbXBhcmF0b3IpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZpc2l0TGliVGFnKExpYnJhcnlEb2N1bWVudCBkb2N1bWVudCkgewotCQkvLyBSZWxvYWQgdGhlIGVsZW1lbnQgbWFwcGluZy4KLQkJTm9kZUxpc3Qgbm9kZXMgPSBkb2N1bWVudC5nZXRQbHVnaW5zKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbm9kZXMuZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJRWxlbWVudCBub2RlID0gKEVsZW1lbnQpIG5vZGVzLml0ZW0oaSk7Ci0JCQlQbHVnaW5JbXBvcnREYXRhLlBsdWdpbkluZm8gcGkgPSBkYXRhLm5ldyBQbHVnaW5JbmZvKCk7Ci0JCQlwaS5ndWlkID0gTGlicmFyeURvY3VtZW50LmdldEd1aWQobm9kZSk7Ci0JCQlkYXRhLmdldFBsdWdpbnMoKS5hZGQocGkpOwotCi0JCQkvLyBDaGVjayB3aXRoIHRoZSBjdXJyZW50IGxpYnJhcnksIGdldCB0aGUgcmVsYXRlZCBpbmZvcm1hdGlvbi4KLQkJCWxvYWRFeGlzdGluZ1BsdWdpbkluZm8ocGkpOwotCQl9Ci0KLQkJLy8gUmVtb3ZlIHRoZSB1bm5lZWRlZCBjb25maWd1cmF0aW9ucy4KLQkJYnVpbGRDb25maWdJbmZvRnJvbUZpbGVzKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZpc2l0UmVzb3VyY2VUYWcoTGlicmFyeURvY3VtZW50IGRvY3VtZW50KSB7Ci0JCU5vZGVMaXN0IG5vZGVzID0gZG9jdW1lbnQuZ2V0UmVzb3VyY2VEZXNjcmlwdG9ycygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG5vZGVzLmdldExlbmd0aCgpOyBpKyspIHsKLQkJCUVsZW1lbnQgbm9kZSA9IChFbGVtZW50KSBub2Rlcy5pdGVtKGkpOwotCQkJU3RyaW5nIGd1aWQgPSBub2RlLmdldEF0dHJpYnV0ZShMaWJyYXJ5RG9jdW1lbnQuQVRUUl9pZCk7Ci0JCQlTdHJpbmcgdXJpID0gbm9kZS5nZXRBdHRyaWJ1dGUoTGlicmFyeURvY3VtZW50LkFUVFJfdXJpKTsKLQotCQkJLy8gTG9hZCB0aGUgcGx1Z2luLnhtaSBmaWxlIGZvciBkZXRhaWwgaW5mb3JtYXRpb24uCi0JCQlGaWxlIGZpbGUgPSBkb2N1bWVudC5nZXRGaWxlRnJvbVVyaSh1cmkpOwotCi0JCQlQbHVnaW5JbXBvcnREYXRhLlBsdWdpbkluZm8gcGkgPSBkYXRhLmdldFBsdWdpbkluZm8oZ3VpZCk7Ci0JCQlpZiAocGkgIT0gbnVsbCkgewotCQkJCWlmIChmaWxlLmV4aXN0cygpKSB7Ci0JCQkJCWxvYWRQbHVnaW5JbmZvKGZpbGUsIHBpKTsKLQkJCQl9IGVsc2UgewotCQkJCQkvLyBSZW1vdmUgdGhlIHBsdWctaW4gaW5mbyBlbnRyeSBzaW5jZSB0aGlhcyBpcyBub3QKLQkJCQkJLy8gYSB2YWxpZCBwbHVnLWluIHRvIGltcG9ydC4KLQkJCQkJZGF0YS5yZW1vdmVQbHVnaW5JbmZvKGd1aWQpOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJLy8gaWYgbm90IHBsdWdpbiwgbWlnaHQgYmUgYSBjb25maWd1cmF0aW9uCi0JCQkJUGx1Z2luSW1wb3J0RGF0YS5Db25maWd1YXJhdGlvbkluZm8gY2kgPSBkYXRhCi0JCQkJCQkuZ2V0Q29uZmlnSW5mbyhndWlkKTsKLQkJCQlpZiAoY2kgIT0gbnVsbCkgewotCQkJCQlpZiAoZmlsZS5leGlzdHMoKSkgewotCQkJCQkJbG9hZENvbmZpZ0luZm8oZmlsZSwgY2kpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgbG9hZENvbmZpZ0luZm8oRmlsZSBzb3VyY2UsCi0JCQlQbHVnaW5JbXBvcnREYXRhLkNvbmZpZ3VhcmF0aW9uSW5mbyBpbmZvKSB7Ci0JCXRyeSB7Ci0JCQlEb2N1bWVudCBkb2N1bWVudCA9IFhNTFV0aWwubG9hZFhtbChzb3VyY2UpOwotCQkJRWxlbWVudCByb290ID0gZG9jdW1lbnQuZ2V0RG9jdW1lbnRFbGVtZW50KCk7Ci0KLQkJCUVsZW1lbnQgY29uZmlnVGFnID0gbnVsbDsKLQkJCWlmIChyb290LmdldFRhZ05hbWUoKS5lcXVhbHMoCi0JCQkJCSJvcmcuZWNsaXBzZS5lcGYudW1hOk1ldGhvZENvbmZpZ3VyYXRpb24iKSkgLy8kTk9OLU5MUy0xJAotCQkJewotCQkJCWNvbmZpZ1RhZyA9IHJvb3Q7Ci0JCQl9IGVsc2UgewotCQkJCU5vZGVMaXN0IG5vZGVzID0gcm9vdAotCQkJCQkJLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvcmcuZWNsaXBzZS5lcGYudW1hOk1ldGhvZENvbmZpZ3VyYXRpb24iKTsgLy8kTk9OLU5MUy0xJAotCQkJCWlmIChub2Rlcy5nZXRMZW5ndGgoKSA+IDApIHsKLQkJCQkJY29uZmlnVGFnID0gKEVsZW1lbnQpIG5vZGVzLml0ZW0oMCk7Ci0JCQkJfQotCQkJfQotCi0JCQlpZiAoY29uZmlnVGFnICE9IG51bGwpIHsKLQkJCQlpbmZvLm5hbWUgPSBjb25maWdUYWcuZ2V0QXR0cmlidXRlKCJuYW1lIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCUltcG9ydFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBsb2FkUGx1Z2luSW5mbyhGaWxlIHNvdXJjZSwgUGx1Z2luSW1wb3J0RGF0YS5QbHVnaW5JbmZvIGluZm8pIHsKLQkJdHJ5IHsKLQkJCURvY3VtZW50IGRvY3VtZW50ID0gWE1MVXRpbC5sb2FkWG1sKHNvdXJjZSk7Ci0JCQlFbGVtZW50IHJvb3QgPSBkb2N1bWVudC5nZXREb2N1bWVudEVsZW1lbnQoKTsKLQotCQkJRWxlbWVudCBwbHVnaW5UYWcgPSBudWxsOwotCQkJaWYgKHJvb3QuZ2V0VGFnTmFtZSgpLmVxdWFscygib3JnLmVjbGlwc2UuZXBmLnVtYTpNZXRob2RQbHVnaW4iKSkgLy8kTk9OLU5MUy0xJAotCQkJewotCQkJCXBsdWdpblRhZyA9IHJvb3Q7Ci0JCQl9IGVsc2UgewotCQkJCU5vZGVMaXN0IG5vZGVzID0gcm9vdAotCQkJCQkJLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvcmcuZWNsaXBzZS5lcGYudW1hOk1ldGhvZFBsdWdpbiIpOyAvLyROT04tTkxTLTEkCi0JCQkJaWYgKG5vZGVzLmdldExlbmd0aCgpID4gMCkgewotCQkJCQlwbHVnaW5UYWcgPSAoRWxlbWVudCkgbm9kZXMuaXRlbSgwKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmIChwbHVnaW5UYWcgIT0gbnVsbCkgewotCQkJCWluZm8ubmFtZSA9IHBsdWdpblRhZy5nZXRBdHRyaWJ1dGUoIm5hbWUiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWluZm8udmVyc2lvbiA9IExpYnJhcnlEb2N1bWVudC5nZXRDaGlsZFZhbHVlKHBsdWdpblRhZywKLQkJCQkJCSJ2ZXJzaW9uIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlpbmZvLmJyaWVmX2Rlc2MgPSBMaWJyYXJ5RG9jdW1lbnQuZ2V0Q2hpbGRWYWx1ZShwbHVnaW5UYWcsCi0JCQkJCQkiYnJpZWZEZXNjcmlwdGlvbiIpOyAvLyROT04tTkxTLTEkCi0JCQkJaW5mby5hdXRob3JzID0gTGlicmFyeURvY3VtZW50LmdldENoaWxkVmFsdWUocGx1Z2luVGFnLAotCQkJCQkJImF1dGhvcnMiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWluZm8uY2hhbmdlRGF0ZSA9IExpYnJhcnlEb2N1bWVudC5nZXRDaGlsZFZhbHVlKHBsdWdpblRhZywKLQkJCQkJCSJjaGFuZ2VEYXRlIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlpbmZvLnVybCA9IHNvdXJjZS50b1N0cmluZygpOwotCi0JCQkJLy8gR2V0IHRoZSBiYXNlIHBsdWctaW5zLgotCQkJCU5vZGVMaXN0IG5vZGVzID0gcGx1Z2luVGFnLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJiYXNlcyIpOyAvLyROT04tTkxTLTEkCi0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBub2Rlcy5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCQkJCUVsZW1lbnQgbm9kZSA9IChFbGVtZW50KSBub2Rlcy5pdGVtKGkpOwotCQkJCQlTdHJpbmcgZ3VpZCA9IG5vZGUuZ2V0QXR0cmlidXRlKExpYnJhcnlEb2N1bWVudC5BVFRSX2hyZWYpOwotCi0JCQkJCWludCBpbmR4ID0gZ3VpZC5pbmRleE9mKCIjIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJaWYgKGluZHggPiAwKSB7Ci0JCQkJCQlndWlkID0gZ3VpZC5zdWJzdHJpbmcoaW5keCArIDEpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJaW5keCA9IGd1aWQuaW5kZXhPZigidW1hOi8vIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCWlmIChpbmR4ID49IDApIHsKLQkJCQkJCQlndWlkID0gZ3VpZC5zdWJzdHJpbmcoaW5keCArIDYpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWluZm8udXNlZFBsdWdpbnMuYWRkKGd1aWQpOwotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCUltcG9ydFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgbG9hZEV4aXN0aW5nUGx1Z2luSW5mbyhQbHVnaW5JbXBvcnREYXRhLlBsdWdpbkluZm8gaW5mbykgewotCQlNZXRob2RMaWJyYXJ5IGxpYnJhcnkgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCk7Ci0JCUxpc3QgcGx1Z2lucyA9IChsaWJyYXJ5ID09IG51bGwpID8gbmV3IEFycmF5TGlzdCgpIDogbGlicmFyeQotCQkJCS5nZXRNZXRob2RQbHVnaW5zKCk7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSBwbHVnaW5zLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSAoTWV0aG9kUGx1Z2luKSBpdC5uZXh0KCk7Ci0JCQlpZiAocGx1Z2luLmdldEd1aWQoKS5lcXVhbHMoaW5mby5ndWlkKSkgewotCQkJCWluZm8uZXhpc3RpbmdQbHVnaW4gPSBwbHVnaW47Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgbG9hZEV4aXN0aW5nQ29uZmlnSW5mbyhQbHVnaW5JbXBvcnREYXRhLkNvbmZpZ3VhcmF0aW9uSW5mbyBpbmZvKSB7Ci0JCU1ldGhvZENvbmZpZ3VyYXRpb25bXSBjb25maWdzID0gTGlicmFyeVNlcnZpY2VVdGlsCi0JCQkJLmdldE1ldGhvZENvbmZpZ3VyYXRpb25zKExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLQkJCQkJCS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpKTsKLQkJaWYgKGNvbmZpZ3MgPT0gbnVsbCB8fCBjb25maWdzLmxlbmd0aCA9PSAwKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbmZpZ3MubGVuZ3RoOyBpKyspIHsKLQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gY29uZmlnc1tpXTsKLQkJCWlmIChjb25maWcuZ2V0R3VpZCgpLmVxdWFscyhpbmZvLmd1aWQpKSB7Ci0JCQkJaW5mby5leGlzdGluZ0NvbmZpZyA9IGNvbmZpZzsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFJlcGxhY2VzIHRoZSBndWlkIG9mIHRoZSBvbGQgbWV0aG9kIGxpYnJhcnkgd2l0aCB0aGUgbmV3IG9uZS4KLQkgKiA8cD4KLQkgKiBTZWFyY2ggZm9yIHRoZSBmb2xsb3dpbmcgZmlsZXM6IGxpYnJhcnkueG1pLCBwbHVnaW4ueG1pLCBtb2RlbC54bWkuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGZpeExpYnJhcnlHdWlkKEZpbGUgcGF0aCwgU3RyaW5nIG9sZEd1aWQsIFN0cmluZyBuZXdHdWlkKSB7Ci0JCWlmICghcGF0aC5pc0RpcmVjdG9yeSgpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlGaWxlW10gZmlsZXMgPSBwYXRoLmxpc3RGaWxlcyhuZXcgRmlsZUZpbHRlcigpIHsKLQotCQkJcHVibGljIGJvb2xlYW4gYWNjZXB0KEZpbGUgZikgewotCi0JCQkJaWYgKGYuaXNEaXJlY3RvcnkoKSkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0KLQkJCQlTdHJpbmcgbmFtZSA9IGYuZ2V0TmFtZSgpOwotCQkJCXJldHVybiBuYW1lLmVxdWFscygibGlicmFyeS54bWkiKSB8fCBuYW1lLmVxdWFscygicGx1Z2luLnhtaSIpIHx8IG5hbWUuZXF1YWxzKCJtb2RlbC54bWkiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCX0KLQkJfSk7Ci0KLQkJaWYgKGZpbGVzID09IG51bGwgfHwgZmlsZXMubGVuZ3RoID09IDApIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChmaWxlc1tpXS5pc0RpcmVjdG9yeSgpKSB7Ci0JCQkJZml4TGlicmFyeUd1aWQoZmlsZXNbaV0sIG9sZEd1aWQsIG5ld0d1aWQpOwotCQkJfSBlbHNlIHsKLQkJCQkvLyBSZWFkIGluIHRoZSBmaWxlLCB1cGRhdGUgaXQgYW5kIHNhdmUgdGhlIGZpbGUuCi0JCQkJdHJ5IHsKLQkJCQkJU3RyaW5nIHNvdXJjZSA9IEZpbGVVdGlsLnJlYWRGaWxlKGZpbGVzW2ldLAotCQkJCQkJCUZpbGVVdGlsLkVOQ09ESU5HX1VURl84KS50b1N0cmluZygpOwotCQkJCQlpZiAoc291cmNlLmluZGV4T2Yob2xkR3VpZCkgPj0gMCkgewotCQkJCQkJLy8gVE9ETzogVGhpcyBpcyBhIHJlZ2V4cCByZXBhbGNlbWVudCwgaXMgaXQgc2FmZT8KLQkJCQkJCXNvdXJjZSA9IHNvdXJjZS5yZXBsYWNlQWxsKG9sZEd1aWQsIG5ld0d1aWQpOwotCi0JCQkJCQlGaWxlVXRpbC53cml0ZVVURjhGaWxlKGZpbGVzW2ldLmdldEFic29sdXRlUGF0aCgpLAotCQkJCQkJCQlzb3VyY2UpOwotCQkJCQl9Ci0KLQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCUltcG9ydFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCQotCXByaXZhdGUgYm9vbGVhbiBtZXJnZShMaWJyYXJ5RG9jdW1lbnQgdGFyZ2V0TGliRG9jKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJLy9Db3B5IGZpbGVzIG9ubHkgYXMgbmV3TWVyZ2VTY2hlbWUgPSB0cnVlCi0JCWlmICghIGltcG9ydEVudHJpZXModGFyZ2V0TGliRG9jKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCQotCQlNZXRob2RMaWJyYXJ5IGxpYiA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKTsKLQkJUmVzb3VyY2UgcmVzMCA9IGxpYi5lUmVzb3VyY2UoKTsKLQkJUmVzb3VyY2VNYW5hZ2VyIHJlc01ncjAgPSAoUmVzb3VyY2VNYW5hZ2VyKSBNdWx0aUZpbGVTYXZlVXRpbC5nZXRSZXNvdXJjZU1hbmFnZXIocmVzMCk7Ci0JCVJlc291cmNlU2V0IHJlc1NldCA9IHJlczAuZ2V0UmVzb3VyY2VTZXQoKTsKLQkJCi0JCW1lcmdlUGx1Z2lucyh0YXJnZXRMaWJEb2MsIGxpYiwgcmVzTWdyMCwgcmVzU2V0KTsJCQotCQltZXJnZUNvbmZpZ3ModGFyZ2V0TGliRG9jLCBsaWIsIHJlc01ncjAsIHJlc1NldCk7Ci0JCQotCQlsaWIuZVJlc291cmNlKCkuc2V0TW9kaWZpZWQodHJ1ZSk7Ci0JCQotCQlzYXZlKGxpYiwgbnVsbCk7CQkJCQotCQkKLQkJLy9maXhMaWJyYXJ5R3VpZCh0YXJnZXRMaWJEb2MuZ2V0RmlsZSgpLmdldFBhcmVudEZpbGUoKSwgaW1wb3J0aW5nTGliRG9jCi0JCS8vCQkuZ2V0TGlicmFyeUd1aWQoKSwgdGFyZ2V0TGliRG9jLmdldExpYnJhcnlHdWlkKCkpOwotCQkKLQkJTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5yZW9wZW5DdXJyZW50TWV0aG9kTGlicmFyeSgpOwotCQkKLQkJaWYgKCEgaXNDaGVja0Jhc2VQbHVnaW5zKCkpIHsKLQkJCWxpYiA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKTsKLQkJCUxpYnJhcnlVdGlsLmxvYWRBbGwobGliKTsKLQkJCUxpc3Q8TWV0aG9kUGx1Z2luPiBtaXNzaW5nQmFzZVBsdWdpbnMgPSBjb2xsZWN0TWlzc2luZ0Jhc2VQbHVnaW5zKGxpYik7Ci0JCQlMaXN0PE1ldGhvZENvbmZpZ3VyYXRpb24+IGNvbmZpZ3MgPSBsaWIuZ2V0UHJlZGVmaW5lZENvbmZpZ3VyYXRpb25zKCk7Ly8gY29sbGVjdEltcG9ydGVkQ29uZmlndXJhdGlvbnMobGliKTsJCQkKLQkJCWNoZWNrTW9kaWZ5KGNvbmZpZ3MpOwotCQkJaWYgKCEgbWlzc2luZ0Jhc2VQbHVnaW5zLmlzRW1wdHkoKSB8fCAhIGNvbmZpZ3MuaXNFbXB0eSgpKSB7CQkJCi0JCQkJbGliLmVSZXNvdXJjZSgpLnNldE1vZGlmaWVkKHRydWUpOwkJCQkKLQkJCQlTZXQ8UmVzb3VyY2U+IHJlc291cmVzVG9TYXZlID0gbmV3IExpbmtlZEhhc2hTZXQ8UmVzb3VyY2U+KCk7Ci0JCQkJY29sbGVjdFJlc291cmNlc3RvU2F2ZShyZXNvdXJlc1RvU2F2ZSwgbWlzc2luZ0Jhc2VQbHVnaW5zKTsKLQkJCQljb2xsZWN0UmVzb3VyY2VzdG9TYXZlKHJlc291cmVzVG9TYXZlLCBjb25maWdzKTsKLQkJCQlzYXZlKGxpYiwgcmVzb3VyZXNUb1NhdmUpOwkJCQkKLQkJCQlMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLnJlb3BlbkN1cnJlbnRNZXRob2RMaWJyYXJ5KCk7Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiB0cnVlOwotCX0KLQotCXByaXZhdGUgdm9pZCBjaGVja01vZGlmeShMaXN0PE1ldGhvZENvbmZpZ3VyYXRpb24+IGNvbmZpZ3MpIHsKLQkJaWYgKGNvbmZpZ3MgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWZpbmFsIExpc3QgY29uZmlnRmlsZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY29uZmlncy5zaXplKCk7IGkrKykgewotCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSBjb25maWdzLmdldChpKTsKLQkJCVJlc291cmNlIHJlcyA9IGNvbmZpZy5lUmVzb3VyY2UoKTsKLQkJCWlmIChyZXMgIT0gbnVsbCkgewotCQkJCVN0cmluZyBmaWxlID0gcmVzLmdldFVSSSgpLnRvRmlsZVN0cmluZygpOwotCQkJCWNvbmZpZ0ZpbGVzLmFkZChmaWxlKTsKLQkJCX0KLQkJfQotCQlTYWZlVXBkYXRlQ29udHJvbGxlci5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJZmlsZUNoZWNrZWRPdXRTdGF0dXMgPSBGaWxlTW9kaWZ5Q2hlY2tlci5jaGVja01vZGlmeShjb25maWdGaWxlcyk7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIExpc3Q8TWV0aG9kUGx1Z2luPiBjb2xsZWN0TWlzc2luZ0Jhc2VQbHVnaW5zKE1ldGhvZExpYnJhcnkgbGliKSB7Ci0JCUxpc3Q8TWV0aG9kUGx1Z2luPiByZXQgPSBuZXcgQXJyYXlMaXN0PE1ldGhvZFBsdWdpbj4oKTsKLQkJCi0JCU1hcCBtYXAgPSBNZXRob2RFbGVtZW50VXRpbC5idWlsZE1hcChsaWIuZ2V0TWV0aG9kUGx1Z2lucygpKTsKLQkJZm9yIChJdGVyYXRvciBpdCA9IGRhdGEuZ2V0UGx1Z2lucygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCVBsdWdpbkltcG9ydERhdGEuUGx1Z2luSW5mbyBpbmZvID0gKFBsdWdpbkltcG9ydERhdGEuUGx1Z2luSW5mbykgaXQubmV4dCgpOwotCQkJaWYgKGluZm8uc2VsZWN0ZWQgKSB7Ci0JCQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IChNZXRob2RQbHVnaW4pIG1hcC5nZXQoaW5mby5ndWlkKTsKLQkJCQlpZiAocGx1Z2luICE9IG51bGwpIHsKLQkJCQkJTGlzdDxNZXRob2RQbHVnaW4+IGJhc2VzID0gcGx1Z2luLmdldEJhc2VzKCk7Ci0JCQkJCWZvciAoaW50IGk9MDsgaSA8IGJhc2VzLnNpemUoKTsgaSsrKSB7Ci0JCQkJCQlNZXRob2RQbHVnaW4gYmFzZSA9IGJhc2VzLmdldChpKTsKLQkJCQkJCWlmICghIG1hcC5jb250YWluc0tleShiYXNlLmdldEd1aWQoKSkpIHsKLQkJCQkJCQlyZXQuYWRkKHBsdWdpbik7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiByZXQ7Ci0JfQkKLQkKLQlwcml2YXRlIHZvaWQgY29sbGVjdFJlc291cmNlc3RvU2F2ZShTZXQ8UmVzb3VyY2U+IHJlc291cmNlcywgTGlzdDw/IGV4dGVuZHMgTWV0aG9kRWxlbWVudD4gZWxlbWVudHMpIHsKLQkJaWYgKGVsZW1lbnRzID09IG51bGwgfHwgZWxlbWVudHMuaXNFbXB0eSgpKSB7Ci0JCQlyZXR1cm47Ci0JCX0JCQotCQlmb3IgKGludCBpPTA7IGkgPCBlbGVtZW50cy5zaXplKCk7IGkrKykgewotCQkJY29sbGVjdFJlc291cmNlc3RvU2F2ZShyZXNvdXJjZXMsIGVsZW1lbnRzLmdldChpKSk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNvbGxlY3RSZXNvdXJjZXN0b1NhdmUoU2V0PFJlc291cmNlPiByZXNvdXJjZXMsIE1ldGhvZEVsZW1lbnQgcGFyZW50KSB7Ci0JCWlmIChwYXJlbnQgaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pIHsJCQotCQkJZm9yIChJdGVyYXRvciBpdCA9IHBhcmVudC5lQWxsQ29udGVudHMoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCUVPYmplY3QgZWxlbWVudCA9IChFT2JqZWN0KSBpdC5uZXh0KCk7Ci0JCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBDb250ZW50RGVzY3JpcHRpb24pIHsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJCVJlc291cmNlIHJlcyA9IGVsZW1lbnQuZVJlc291cmNlKCk7Ci0JCQkJaWYgKHJlcyAhPSBudWxsKSB7Ci0JCQkJCXJlc291cmNlcy5hZGQocmVzKTsKLQkJCQkJcmVzLnNldE1vZGlmaWVkKHRydWUpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlSZXNvdXJjZSByZXMgPSBwYXJlbnQuZVJlc291cmNlKCk7Ci0JCXJlc291cmNlcy5hZGQocmVzKTsKLQkJcmVzLnNldE1vZGlmaWVkKHRydWUpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgc2F2ZShJTGlicmFyeVBlcnNpc3Rlci5GYWlsU2FmZU1ldGhvZExpYnJhcnlQZXJzaXN0ZXIgcGVyc2lzdGVyLCBTZXQ8UmVzb3VyY2U+IHJlc291cmVzVG9TYXZlKSAKLQkJdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWlmIChyZXNvdXJlc1RvU2F2ZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJZm9yIChJdGVyYXRvcjxSZXNvdXJjZT4gaXQgPSByZXNvdXJlc1RvU2F2ZS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlNdWx0aUZpbGVYTUlSZXNvdXJjZUltcGwgcmVzID0gKE11bHRpRmlsZVhNSVJlc291cmNlSW1wbCkgaXQubmV4dCgpOwotCQkJdHJ5IHsKLQkJCQlpZiAoISByZXMuaXNTeW5jaHJvbml6ZWQoKSkgewotCQkJCQlyZXMubG9hZChyZXMuZ2V0UmVzb3VyY2VTZXQoKS5nZXRMb2FkT3B0aW9ucygpKTsKLQkJCQl9Ci0JCQkJcGVyc2lzdGVyLnNhdmUocmVzKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKXsKLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJfQotCQl9Ci0JfQkKLQotCXByaXZhdGUgdm9pZCBzYXZlKE1ldGhvZExpYnJhcnkgbGliLCBTZXQ8UmVzb3VyY2U+IHJlc291cmVzVG9TYXZlKSB7Ci0JCS8vTGlicmFyeVV0aWwuc2F2ZUxpYnJhcnkobGliLCBmYWxzZSwgZmFsc2UpOwotCQkKLQkJLy9UaGlzIGlzIHRlbXAsIGFuZCBjYW4gYmUgcmV2b212ZWQgYWZ0ZXIgYSBmaXggaXMgZG9uZSBmb3IgcGFzc2luZyBwZXJzaXN0ZXIncyBvcHRpb24gdG8gc2F2ZQotCQlNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwgcmVzb3VyY2VTZXQgPSAoTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsKSBsaWIuZVJlc291cmNlKCkuZ2V0UmVzb3VyY2VTZXQoKTsKLQkJTWFwIGRlZmF1bHRTYXZlT3B0aW9ucyA9IHJlc291cmNlU2V0LmdldERlZmF1bHRTYXZlT3B0aW9ucygpOwotCQlPYmplY3Qgb2xkRGVmYXVsdE9wdGlvblZhbCA9IGRlZmF1bHRTYXZlT3B0aW9ucy5nZXQoTXVsdGlGaWxlWE1JU2F2ZUltcGwuRElTQ0FSRF9VTlJFU09MVkVEX1JFRkVSRU5DRVMpOwotCQkKLQkJSUxpYnJhcnlQZXJzaXN0ZXIuRmFpbFNhZmVNZXRob2RMaWJyYXJ5UGVyc2lzdGVyIHBlcnNpc3RlciA9IExpYnJhcnlTZXJ2aWNlVXRpbC5nZXRDdXJyZW50UGVyc2lzdGVyKCkuZ2V0RmFpbFNhZmVQZXJzaXN0ZXIoKTsKLQkJTWFwIHNhdmVPcHRpb25zID0gcGVyc2lzdGVyLmdldFNhdmVPcHRpb25zKCk7Ci0JCWlmICghIGlzQ2hlY2tCYXNlUGx1Z2lucygpICYmIHJlc291cmVzVG9TYXZlICE9IG51bGwpIHsKLQkJCXNhdmVPcHRpb25zLnB1dChNdWx0aUZpbGVYTUlTYXZlSW1wbC5ESVNDQVJEX1VOUkVTT0xWRURfUkVGRVJFTkNFUywgQm9vbGVhbi5UUlVFKTsKLQkJCWRlZmF1bHRTYXZlT3B0aW9ucy5wdXQoTXVsdGlGaWxlWE1JU2F2ZUltcGwuRElTQ0FSRF9VTlJFU09MVkVEX1JFRkVSRU5DRVMsIEJvb2xlYW4uVFJVRSk7Ci0JCX0KLQotCQl0cnkgewotCQkJc2F2ZShwZXJzaXN0ZXIsIHJlc291cmVzVG9TYXZlKTsKLQkJCXBlcnNpc3Rlci5zYXZlKGxpYi5lUmVzb3VyY2UoKSk7Ci0JCQlwZXJzaXN0ZXIuY29tbWl0KCk7Ci0JCQkKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCXBlcnNpc3Rlci5yb2xsYmFjaygpOwotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQotCQl9IGZpbmFsbHkgewotCQkJaWYgKCEgaXNDaGVja0Jhc2VQbHVnaW5zKCkgJiYgcmVzb3VyZXNUb1NhdmUgIT0gbnVsbCkgewkJCQkKLQkJCQlpZiAob2xkRGVmYXVsdE9wdGlvblZhbCA9PSBudWxsKSB7Ci0JCQkJCWRlZmF1bHRTYXZlT3B0aW9ucy5yZW1vdmUoTXVsdGlGaWxlWE1JU2F2ZUltcGwuRElTQ0FSRF9VTlJFU09MVkVEX1JFRkVSRU5DRVMpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWRlZmF1bHRTYXZlT3B0aW9ucy5wdXQoTXVsdGlGaWxlWE1JU2F2ZUltcGwuRElTQ0FSRF9VTlJFU09MVkVEX1JFRkVSRU5DRVMsIG9sZERlZmF1bHRPcHRpb25WYWwpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBtZXJnZVBsdWdpbnMoTGlicmFyeURvY3VtZW50IHRhcmdldExpYkRvYywgTWV0aG9kTGlicmFyeSBsaWIsIFJlc291cmNlTWFuYWdlciByZXNNZ3IwLCBSZXNvdXJjZVNldCByZXNTZXQpIHsKLQkJTGlzdCBleGlzdGluZ1BsdWdpbkd1aWRzID0gbnVsbDsKLQkJZm9yIChJdGVyYXRvciBpdCA9IGRhdGEuZ2V0UGx1Z2lucygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCVBsdWdpbkltcG9ydERhdGEuUGx1Z2luSW5mbyBpbmZvID0gKFBsdWdpbkltcG9ydERhdGEuUGx1Z2luSW5mbykgaXQubmV4dCgpOwotCQkJaWYgKGluZm8uc2VsZWN0ZWQgJiYgaW5mby5leGlzdGluZ1BsdWdpbiAhPSBudWxsKSB7Ci0JCQkJaWYgKGV4aXN0aW5nUGx1Z2luR3VpZHMgPT0gbnVsbCkgewotCQkJCQlleGlzdGluZ1BsdWdpbkd1aWRzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCX0KLQkJCQlleGlzdGluZ1BsdWdpbkd1aWRzLmFkZChpbmZvLmd1aWQpOwotCQkJfQotCQl9Ci0JCQotCQlNYXAgcGdUb1JnTWFwID0gaW1wb3J0aW5nTGliRG9jLmJ1aWxkUGx1Z2luR3VpZFRvUmVzTWdyR3VpZE1hcChleGlzdGluZ1BsdWdpbkd1aWRzKTsJCQkJCi0JCQotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gZGF0YS5nZXRQbHVnaW5zKCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJUGx1Z2luSW1wb3J0RGF0YS5QbHVnaW5JbmZvIGluZm8gPSAoUGx1Z2luSW1wb3J0RGF0YS5QbHVnaW5JbmZvKSBpdC5uZXh0KCk7Ci0JCQlpZiAoaW5mby5zZWxlY3RlZCAmJiBpbmZvLmV4aXN0aW5nUGx1Z2luID09IG51bGwpIHsKLQkJCQltZXJnZUVsZW1lbnQoaW5mby5ndWlkLCB0YXJnZXRMaWJEb2MsIGxpYiwgcmVzTWdyMCwgcmVzU2V0LCBsaWIuZ2V0TWV0aG9kUGx1Z2lucygpKTsKLQkJCX0gZWxzZSBpZiAoaW5mby5zZWxlY3RlZCAmJiBwZ1RvUmdNYXAgIT0gbnVsbCkgewkvLzE1MTc4NgotCQkJCVJlc291cmNlIHJlcyA9IGluZm8uZXhpc3RpbmdQbHVnaW4uZVJlc291cmNlKCk7Ci0JCQkJUmVzb3VyY2VNYW5hZ2VyIHJlc01nciA9IChSZXNvdXJjZU1hbmFnZXIpIE11bHRpRmlsZVNhdmVVdGlsLmdldFJlc291cmNlTWFuYWdlcihyZXMpOwotCQkJCVN0cmluZyBleGlzdGluZ0d1aWQgPSByZXNNZ3IuZ2V0R3VpZCgpOwotCQkJCVN0cmluZyBpbXBvcnRlZEd1aWQgPSAoU3RyaW5nKSBwZ1RvUmdNYXAuZ2V0KGluZm8uZ3VpZCk7Ci0JCQkJaWYgKGltcG9ydGVkR3VpZCAhPSBudWxsICYmICFpbXBvcnRlZEd1aWQuZXF1YWxzKGV4aXN0aW5nR3VpZCkpIHsKLQkJCQkJcmVzTWdyLnNldEd1aWQoaW1wb3J0ZWRHdWlkKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIG1lcmdlQ29uZmlncyhMaWJyYXJ5RG9jdW1lbnQgdGFyZ2V0TGliRG9jLCBNZXRob2RMaWJyYXJ5IGxpYiwgUmVzb3VyY2VNYW5hZ2VyIHJlc01ncjAsIFJlc291cmNlU2V0IHJlc1NldCkgewotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gZGF0YS5nZXRDb25maWdzKCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJUGx1Z2luSW1wb3J0RGF0YS5Db25maWd1YXJhdGlvbkluZm8gaW5mbyA9IChQbHVnaW5JbXBvcnREYXRhLkNvbmZpZ3VhcmF0aW9uSW5mbykgaXQubmV4dCgpOwotCQkJaWYgKGluZm8uc2VsZWN0ZWQgJiYgaW5mby5leGlzdGluZ0NvbmZpZyA9PSBudWxsKSB7Ci0JCQkJbWVyZ2VFbGVtZW50KGluZm8uZ3VpZCwgdGFyZ2V0TGliRG9jLCBsaWIsIHJlc01ncjAsIHJlc1NldCwgbGliLmdldFByZWRlZmluZWRDb25maWd1cmF0aW9ucygpKTsKLQkJCX0JCQkJCQotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCBtZXJnZUVsZW1lbnQoU3RyaW5nIGd1aWQsIExpYnJhcnlEb2N1bWVudCB0YXJnZXRMaWJEb2MsIAotCQkJTWV0aG9kTGlicmFyeSBsaWIsIFJlc291cmNlTWFuYWdlciByZXNNZ3IwLCBSZXNvdXJjZVNldCByZXNTZXQsIExpc3QgZWxlbWVudHMpewotCQlTdHJpbmcgc3JjX3VyaSA9IGltcG9ydGluZ0xpYkRvYy5nZXRSZXNvdXJjZVVyaShndWlkKTsKLQkJaWYgKHNyY191cmkgPT0gbnVsbCB8fCBzcmNfdXJpLmxlbmd0aCgpID09IDApIHsKLQkJCXJldHVybjsKLQkJfQotCQkvL0ZpbGUgdGFyZ2V0X2ZpbGUgPSB0YXJnZXRMaWJEb2MuZ2V0RmlsZUZyb21Vcmkoc3JjX3VyaSk7Ci0JCUZpbGUgdGFyZ2V0X2ZpbGUgPSB0YXJnZXRGaWxlTWFwLmdldChndWlkKTsKLQkJCi0JCVN0cmluZyBwYXRoID0gdGFyZ2V0X2ZpbGUuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0JCQotCQlVUkkgdXJpID0gVVJJLmNyZWF0ZUZpbGVVUkkocGF0aCk7Ci0JCVJlc291cmNlIHJlcyA9IHJlc1NldC5nZXRSZXNvdXJjZSh1cmksIHRydWUpOwotCQlNZXRob2RFbGVtZW50IGVsZW1lbnQgPSBQZXJzaXN0ZW5jZVV0aWwuZ2V0TWV0aG9kRWxlbWVudChyZXMpOwotCQllbGVtZW50cy5hZGQoZWxlbWVudCk7CQkKLQkJCi0JCU11bHRpRmlsZVNhdmVVdGlsLnJlZ2lzdGVyV2l0aFJlc291cmNlTWFuYWdlcihyZXNNZ3IwLCBlbGVtZW50LCB1cmkpOwotCQlSZXNvdXJjZU1hbmFnZXIgcmVzTWdyID0gKFJlc291cmNlTWFuYWdlcikgTXVsdGlGaWxlU2F2ZVV0aWwuZ2V0UmVzb3VyY2VNYW5hZ2VyKHJlcyk7Ci0JCWlmIChyZXNNZ3IgIT0gbnVsbCkgewotCQkJcmVzTWdyMC5nZXRTdWJNYW5hZ2VycygpLmFkZChyZXNNZ3IpOwotCQl9Ci0JfQkJCi0JCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkQ29uZmlnSW5mb0Zyb21GaWxlcygpIHsJCi0JCUZpbGUgY29waWVkTGliUGF0aCA9IHVwR3JhZGVJbmZvID09IG51bGwgPyBudWxsIDogdXBHcmFkZUluZm8uZ2V0Q29waWVkTGliRmlsZSgpOwotCQlGaWxlIGltcG9ydGluZ0xpYlBhdGggPSBjb3BpZWRMaWJQYXRoID09IG51bGwgPyBuZXcgRmlsZShkYXRhLmxsRGF0YS5nZXRQYXJlbnRGb2xkZXIoKQotCQkJCSsgRmlsZS5zZXBhcmF0b3IgKyBMaWJyYXJ5RG9jdW1lbnQuZXhwb3J0RmlsZSkgOiBjb3BpZWRMaWJQYXRoOwotCQlGaWxlIGNvbmZpZ0RpciA9IG5ldyBGaWxlKGltcG9ydGluZ0xpYlBhdGguZ2V0UGFyZW50KCksIE11bHRpRmlsZVNhdmVVdGlsLk1FVEhPRF9DT05GSUdVUkFUSU9OX0ZPTERFUl9OQU1FKTsKLQkJCi0JCUxpYnJhcnlEb2N1bWVudC5Db25maWdEb2NWaXNpdG9yIHZpc2l0b3IgPSBuZXcgTGlicmFyeURvY3VtZW50LkNvbmZpZ0RvY1Zpc2l0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCB2aXNpdChGaWxlIGZpbGUsIEVsZW1lbnQgbm9kZSkgewotCQkJCVBsdWdpbkltcG9ydERhdGEuQ29uZmlndWFyYXRpb25JbmZvIGNpID0gZGF0YS5uZXcgQ29uZmlndWFyYXRpb25JbmZvKCk7Ci0JCQkJY2kuZ3VpZCA9IG5vZGUuZ2V0QXR0cmlidXRlKExpYnJhcnlEb2N1bWVudC5BVFRSX2d1aWQpOwotCQkJCWNpLm5hbWUgPSBub2RlLmdldEF0dHJpYnV0ZSgibmFtZSIpOyAvLyROT04tTkxTLTEkCi0JCQkJU3RyaW5nIHVyaSA9IE11bHRpRmlsZVNhdmVVdGlsLk1FVEhPRF9DT05GSUdVUkFUSU9OX0ZPTERFUl9OQU1FICsgRmlsZS5zZXBhcmF0b3IgKyBmaWxlLmdldE5hbWUoKTsKLQkJCQlpbXBvcnRpbmdMaWJEb2MuYWRkVG9HdWlkVG9VcmlNYXAoY2kuZ3VpZCwgdXJpKTsKLQkJCQlkYXRhLmdldENvbmZpZ3MoKS5hZGQoY2kpOwotCQkJCS8vIENoZWNrIHdpdGggdGhlIGN1cnJlbnQgbGlicmFyeSwgZ2V0IHRoZSByZWxhdGVkIGluZm9ybWF0aW9uLgotCQkJCWxvYWRFeGlzdGluZ0NvbmZpZ0luZm8oY2kpOwotCQkJCWlmIChjaS5leGlzdGluZ0NvbmZpZyAhPSBudWxsKSB7Ci0JCQkJCVVSSSByZXNVcmkgPSBjaS5leGlzdGluZ0NvbmZpZy5lUmVzb3VyY2UoKS5nZXRVUkkoKTsKLQkJCQkJdXJpID0gTXVsdGlGaWxlU2F2ZVV0aWwuTUVUSE9EX0NPTkZJR1VSQVRJT05fRk9MREVSX05BTUUgKyBGaWxlLnNlcGFyYXRvciArIHJlc1VyaS5sYXN0U2VnbWVudCgpOwotCQkJCQl1cmkgPSB0YXJnZXRMaWJEb2MuZGVjb2RlVXJpKHVyaSk7Ci0JCQkJCXRhcmdldExpYkRvYy5hZGRUb0d1aWRUb1VyaU1hcChjaS5ndWlkLCB1cmkpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQkJCi0JCUxpYnJhcnlEb2N1bWVudC52aXNpdENvbmZpZ0ZpbGVzKGNvbmZpZ0RpciwgdmlzaXRvcik7CQkJCQotCX0KLQkKLQlwcml2YXRlIHZvaWQgZW5zdXJlVW5pcXVlTmFtZXMoTGlzdCBlbGVtZW50cykgewotCQlpZiAoZWxlbWVudHMuaXNFbXB0eSgpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJTWFwIG5hbWVNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQlmb3IgKGludCBpPTA7IGkgPCBlbGVtZW50cy5zaXplKCk7IGkrKykgewotCQkJTWV0aG9kRWxlbWVudCBlbGVtID0gKE1ldGhvZEVsZW1lbnQpIGVsZW1lbnRzLmdldChpKTsKLQkJCW5hbWVNYXAucHV0KGVsZW0uZ2V0TmFtZSgpLnRvVXBwZXJDYXNlKCksIGVsZW0pOwotCQl9Ci0JCQotCQlMaXN0IGltcG9ydGVkTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJTGlzdCBpbXBvcnRlZEV4aXN0TGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJaWYgKGVsZW1lbnRzLmdldCgwKSBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikgewotCQkJZm9yIChJdGVyYXRvciBpdCA9IGRhdGEuZ2V0UGx1Z2lucygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlQbHVnaW5JbXBvcnREYXRhLlBsdWdpbkluZm8gaW5mbyA9IChQbHVnaW5JbXBvcnREYXRhLlBsdWdpbkluZm8pIGl0Lm5leHQoKTsKLQkJCQlpZiAoaW5mby5zZWxlY3RlZCkgewotCQkJCQlpZiAoaW5mby5leGlzdGluZ1BsdWdpbiA9PSBudWxsIHx8IAotCQkJCQkJCSFpbmZvLmV4aXN0aW5nUGx1Z2luLmdldE5hbWUoKS5lcXVhbHMoaW5mby5uYW1lKSkgewotCQkJCQkJaW1wb3J0ZWRMaXN0LmFkZChpbmZvLm5hbWUpOwotCQkJCQkJaWYgKGluZm8uZXhpc3RpbmdQbHVnaW4gIT0gbnVsbCkgewotCQkJCQkJCWltcG9ydGVkRXhpc3RMaXN0LmFkZChpbmZvKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBkYXRhLmdldENvbmZpZ3MoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJUGx1Z2luSW1wb3J0RGF0YS5Db25maWd1YXJhdGlvbkluZm8gaW5mbyA9IChQbHVnaW5JbXBvcnREYXRhLkNvbmZpZ3VhcmF0aW9uSW5mbykgaXQubmV4dCgpOwotCQkJCWlmIChpbmZvLnNlbGVjdGVkKSB7Ci0JCQkJCWlmIChpbmZvLmV4aXN0aW5nQ29uZmlnID09IG51bGwgfHwgCi0JCQkJCQkJIWluZm8uZXhpc3RpbmdDb25maWcuZ2V0TmFtZSgpLmVxdWFscyhpbmZvLm5hbWUpKSB7Ci0JCQkJCQlpbXBvcnRlZExpc3QuYWRkKGluZm8ubmFtZSk7Ci0JCQkJCQlpZiAoaW5mby5leGlzdGluZ0NvbmZpZyAhPSBudWxsKSB7Ci0JCQkJCQkJaW1wb3J0ZWRFeGlzdExpc3QuYWRkKGluZm8pOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQkJCQkKLQkJCX0KLQkJfQotCQlmb3IgKGludCBpPTA7IGk8aW1wb3J0ZWRMaXN0LnNpemUoKTsgaSsrKSB7Ci0JCQlTdHJpbmcgbmFtZSA9IChTdHJpbmcpIGltcG9ydGVkTGlzdC5nZXQoaSk7Ci0JCQlTdHJpbmcgcmVuYW1lZCA9IG5hbWU7Ci0JCQl3aGlsZSAobmFtZU1hcC5jb250YWluc0tleShyZW5hbWVkLnRvVXBwZXJDYXNlKCkpKSB7Ci0JCQkJcmVuYW1lZCArPSAiX3JlbmFtZWQiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlpZiAocmVuYW1lZCAhPSBuYW1lKSB7Ci0JCQkJTWV0aG9kRWxlbWVudCBlbGVtID0gKE1ldGhvZEVsZW1lbnQpIG5hbWVNYXAuZ2V0KG5hbWUudG9VcHBlckNhc2UoKSk7Ci0JCQkJTGlicmFyeVZpZXcucnVuUmVuYW1lKGVsZW0sIHJlbmFtZWQpOwotCQkJfQkJCQotCQl9CQkJCQotCQlmb3IgKGludCBpPTA7IGk8aW1wb3J0ZWRFeGlzdExpc3Quc2l6ZSgpOyBpKyspIHsKLQkJCU9iamVjdCBpbmZvID0gaW1wb3J0ZWRFeGlzdExpc3QuZ2V0KGkpOwotCQkJTWV0aG9kRWxlbWVudCBlbGVtID0gaW5mbyBpbnN0YW5jZW9mIFBsdWdpbkltcG9ydERhdGEuUGx1Z2luSW5mbyA/IAotCQkJCQkoTWV0aG9kRWxlbWVudCkoKFBsdWdpbkltcG9ydERhdGEuUGx1Z2luSW5mbykgaW5mbykuZXhpc3RpbmdQbHVnaW4gOgotCQkJCQkoTWV0aG9kRWxlbWVudCkoKFBsdWdpbkltcG9ydERhdGEuQ29uZmlndWFyYXRpb25JbmZvKSBpbmZvKS5leGlzdGluZ0NvbmZpZzsKLQkJCVN0cmluZyBuZXdOYW1lID0gaW5mbyBpbnN0YW5jZW9mIFBsdWdpbkltcG9ydERhdGEuUGx1Z2luSW5mbyA/IAotCQkJCQkoU3RyaW5nKSgoUGx1Z2luSW1wb3J0RGF0YS5QbHVnaW5JbmZvKSBpbmZvKS5uYW1lIDoKLQkJCQkJKFN0cmluZykoKFBsdWdpbkltcG9ydERhdGEuQ29uZmlndWFyYXRpb25JbmZvKSBpbmZvKS5uYW1lOwkJCQkJCQkJCi0JCQlMaWJyYXJ5Vmlldy5ydW5SZW5hbWUoZWxlbSwgbmV3TmFtZSk7CQkKLQkJfQkKLQkJCi0JCQotCQkKLQl9Ci0JCi0JcHJpdmF0ZSBGaWxlIGdldFRhcmdldEZpbGUoZmluYWwgTWV0aG9kTGlicmFyeSBsaWIsIFN0cmluZyBndWlkKSB7Ci0JCUZpbGUgcGFyZW50ID0gbnVsbDsKLQkJZmluYWwgRmlsZVtdIHBmaWxlcyA9IG5ldyBGaWxlWzFdOyAKLQkJZmluYWwgSUZpbGVCYXNlZExpYnJhcnlQZXJzaXN0ZXIgcGVyc2lzdGVyID0gKElGaWxlQmFzZWRMaWJyYXJ5UGVyc2lzdGVyKSBMaWJyYXJ5U2VydmljZVV0aWwuZ2V0Q3VycmVudFBlcnNpc3RlcigpOwotCQlDb25maWd1YXJhdGlvbkluZm8gY2luZm8gPSBkYXRhLmdldENvbmZpZ0luZm8oZ3VpZCk7Ci0JCWlmIChjaW5mbyAhPSBudWxsKSB7Ci0JCQlGaWxlIGZpbGUgPSBnZXRSZXNvdXJjZUZpbGUoY2luZm8uZXhpc3RpbmdDb25maWcpOwotCQkJaWYgKGZpbGUgIT0gbnVsbCkgewotCQkJCXJldHVybiBmaWxlOwotCQkJfQotCQkJaWYgKGRlZmF1bHRDb25maWdGb2xkZXIgPT0gbnVsbCkgewotCQkJCVNhZmVVcGRhdGVDb250cm9sbGVyLnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJcGZpbGVzWzBdID0gcGVyc2lzdGVyLmdldERlZmF1bHRNZXRob2RDb25maWd1cmF0aW9uRm9sZGVyKGxpYik7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCQlwYXJlbnQgPSBwZmlsZXNbMF07Ci0JCQkJaWYgKHBhcmVudCA9PSBudWxsKSB7Ci0JCQkJCXJldHVybiBudWxsOwotCQkJCX0KLQkJCQlkZWZhdWx0Q29uZmlnRm9sZGVyID0gcGFyZW50OwotCQkJfSBlbHNlIHsKLQkJCQlwYXJlbnQgPSBkZWZhdWx0Q29uZmlnRm9sZGVyOwotCQkJfQotCQkJaWYgKGxvY2FsRGVidWcpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxEPiBkZWZhdWx0Q29uZmlnRm9sZGVyOiAiICsgcGFyZW50KTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9IGVsc2UgewotCQkJUGx1Z2luSW5mbyBwaW5mbyA9IGRhdGEuZ2V0UGx1Z2luSW5mbyhndWlkKTsKLQkJCWlmIChwaW5mbyAhPSBudWxsKSB7Ci0JCQkJRmlsZSBmaWxlID0gZ2V0UmVzb3VyY2VGaWxlKHBpbmZvLmV4aXN0aW5nUGx1Z2luKTsKLQkJCQlpZiAoZmlsZSAhPSBudWxsKSB7Ci0JCQkJCXJldHVybiBmaWxlOwotCQkJCX0KLQkJCQlwYXJlbnQgPSBwZXJzaXN0ZXIuY3JlYXRlTWV0aG9kUGx1Z2luRm9sZGVyKHBpbmZvLm5hbWUsIGxpYik7Ci0JCQl9IGVsc2UgewotCQkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCQkJfQotCQl9Ci0KLQkJU3RyaW5nIGZpbGVOYW1lID0gY2luZm8gPT0gbnVsbCA/IE11bHRpRmlsZVNhdmVVdGlsLkRFRkFVTFRfUExVR0lOX01PREVMX0ZJTEVOQU1FIDogCi0JCQkJCQkJCQljaW5mby5uYW1lICsgTXVsdGlGaWxlU2F2ZVV0aWwuREVGQVVMVF9GSUxFX0VYVEVOU0lPTjsJCi0JCXJldHVybiBuZXcgRmlsZShwYXJlbnQsIGZpbGVOYW1lKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0NoZWNrQmFzZVBsdWdpbnMoKSB7Ci0JCXJldHVybiBjaGVja0Jhc2VQbHVnaW5zOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldENoZWNrQmFzZVBsdWdpbnMoYm9vbGVhbiBjaGVja0Jhc2VQbHVnaW5zKSB7Ci0JCXRoaXMuY2hlY2tCYXNlUGx1Z2lucyA9IGNoZWNrQmFzZVBsdWdpbnM7Ci0JfQotCQotCXByaXZhdGUgRmlsZSBnZXRSZXNvdXJjZUZpbGUoTWV0aG9kRWxlbWVudCBlbGVtZW50KSB7Ci0JCWlmIChlbGVtZW50ID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCVJlc291cmNlIHJlcyA9IGVsZW1lbnQuZVJlc291cmNlKCk7Ci0JCVVSSSB1cmkgPSByZXMuZ2V0VVJJKCk7Ci0JCXJldHVybiBuZXcgRmlsZSh1cmkudG9GaWxlU3RyaW5nKCkpOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0VmFsaWRhdGVIb29rRGF0YSgpIHsKLQkJcmV0dXJuIHZhbGlkYXRlSG9va0RhdGE7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VmFsaWRhdGVIb29rRGF0YShPYmplY3QgdmFsaWRhdGVIb29rRGF0YSkgewotCQl0aGlzLnZhbGlkYXRlSG9va0RhdGEgPSB2YWxpZGF0ZUhvb2tEYXRhOwotCX0KLQkKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3NlcnZpY2VzL1Jlc291cmNlU2Nhbm5lci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy9zZXJ2aWNlcy9SZXNvdXJjZVNjYW5uZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGYzOWJiMS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3NlcnZpY2VzL1Jlc291cmNlU2Nhbm5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcuc2VydmljZXM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5yZWdleC5NYXRjaGVyOwotaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5GaWxlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLk5ldFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuSUxpYnJhcnlSZXNvdXJjZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5SZXNvdXJjZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci0KLQotLyoqCi0gKiB1dGlsaXR5IGNsYXNzIHRvIHNjYW4gYW5kIGNvcHkgcmVzb3VyY2VzIGZyb20gdGhlIHNvdXJjZSBsaWJyYXJ5IHRvIHRoZSB0YXJnZXQgbGlicmFyeQotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBSZXNvdXJjZVNjYW5uZXIgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBQYXR0ZXJuIHBfc3JjX3JlZiA9IFBhdHRlcm4uY29tcGlsZSgic3JjXFxzKj1cXHMqXCIoLio/KVwiIiwgUGF0dGVybi5DQVNFX0lOU0VOU0lUSVZFIHwgUGF0dGVybi5ET1RBTEwpOyAvLyROT04tTkxTLTEkCi0vLwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFBhdHRlcm4gcF9saW5rX3JlZiA9IFBhdHRlcm4uY29tcGlsZSgiPGFcXHMrPyhbXj5dKik+KC4qPyk8L2E+IiwgUGF0dGVybi5DQVNFX0lOU0VOU0lUSVZFIHwgUGF0dGVybi5ET1RBTEwpOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBQYXR0ZXJuIHBfaHJlZl9yZWYgPSBQYXR0ZXJuLmNvbXBpbGUoImhyZWZcXHMqPVxccypcIiguKj8pXCIiLCBQYXR0ZXJuLkNBU0VfSU5TRU5TSVRJVkUgfCBQYXR0ZXJuLkRPVEFMTCk7IC8vJE5PTi1OTFMtMSQKLQotCUZpbGUgc3JjTGliUm9vdDsKLQlGaWxlIHRhcmdldExpYlJvb3Q7Ci0JCi0JcHJpdmF0ZSBNYXAgbmV3RmlsZU1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JcHJpdmF0ZSBNYXAgZXhpc3RpbmdGaWxlTWFwID0gbmV3IEhhc2hNYXAoKTsKLQlNYXA8U3RyaW5nLCBTdHJpbmc+IHJlbmFtZVBsdWdpbk1hcDsKLQkKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwkKLQlwdWJsaWMgUmVzb3VyY2VTY2FubmVyKEZpbGUgc3JjTGliUm9vdCwgRmlsZSB0YXJnZXRMaWJSb290LCBNYXA8U3RyaW5nLCBTdHJpbmc+IHJlbmFtZVBsdWdpbk1hcCkgewotCQl0aGlzLnNyY0xpYlJvb3QgPSBzcmNMaWJSb290OwotCQl0aGlzLnRhcmdldExpYlJvb3QgPSB0YXJnZXRMaWJSb290OwotCQl0aGlzLnJlbmFtZVBsdWdpbk1hcCA9IHJlbmFtZVBsdWdpbk1hcDsKLQl9Ci0JCi0JLyoqCi0JICogc2NhbiB0aCBldGV4dCBhbmQgY29weSB0aGUgcmVzb3VyY2VzCi0JICogQHBhcmFtIG93bmVyIE1ldGhvZEVsZW1lbnQKLQkgKiBAcGFyYW0gc291cmNlIFN0cmluZwotCSAqLwotCXB1YmxpYyB2b2lkIHNjYW4oTWV0aG9kRWxlbWVudCBvd25lciwgU3RyaW5nIHNvdXJjZSkgewotCQkKLQkJdHJ5Ci0JCXsKLQkJCS8vIHByb2Nlc3MgaW1hZ2VzIGFuZCBvdGhlciBzcmMgcmVzb3VyY2VzCi0JCQlNYXRjaGVyIG0gPSBwX3NyY19yZWYubWF0Y2hlcihzb3VyY2UpOwotCQkJd2hpbGUgKCBtLmZpbmQoKSApCi0JCQl7Ci0JCQkJU3RyaW5nIHVybCA9IG0uZ3JvdXAoMSk7Ci0JCQkJcHJvY2Vzc1VybChvd25lciwgdXJsKTsKLQkJCX0KLQotCQkJLy8gcHJvY2VzcyBocmVmcwotCQkJbSA9IHBfaHJlZl9yZWYubWF0Y2hlcihzb3VyY2UpOwotCQkJCi0JCQl3aGlsZSAoIG0uZmluZCgpICkKLQkJCXsKLQkJCQlTdHJpbmcgdXJsID0gbS5ncm91cCgxKTsKLQkJCQlwcm9jZXNzVXJsKG93bmVyLCB1cmwpOwotCQkJfQkJCQotCQl9Ci0JCWNhdGNoIChFeGNlcHRpb24gZXgpCi0JCXsKLQkJCWV4LnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIHByb2Nlc3MgdGhlIHVybCBhbmQgY29weSB0aGUgcmVzb3VyY2UKLQkgKiBpZiB0aGUgb3duZXIgZWxlbWVudCBpcyBzcGVjaWZpZWQsIHRoZSB1cmwgaXMgcmVsYXRpdmUgdG8gdGhlIG93bmVyIGVsZW1lbnQsIAotCSAqb3RoZXJ3aXNlIGl0J3MgcmVsYXRpdmUgdG8gdGhlIGxpYnJhcnkKLQkgKgotCSAqIEBwYXJhbSBvd25lcgotCSAqIEBwYXJhbSB1cmwKLQkgKi8KLQlwcml2YXRlIHZvaWQgcHJvY2Vzc1VybChNZXRob2RFbGVtZW50IG93bmVyLCBTdHJpbmcgdXJsKSB7Ci0JCXByb2Nlc3NVcmwob3duZXIsIHVybCwgbnVsbCk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBwcm9jZXNzVXJsKE1ldGhvZEVsZW1lbnQgb3duZXIsIFN0cmluZyB1cmwsIE1ldGhvZFBsdWdpbiBwbHVnaW4pIHsKLQkJCi0JCWlmICggdXJsID09IG51bGwgKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCWludCBpbmRleCA9IHVybC5pbmRleE9mKCIjIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKCBpbmRleCA+PSAwICkKLQkJewotCQkJdXJsID0gdXJsLnN1YnN0cmluZygwLCBpbmRleCk7Ci0JCX0KLQkJCi0JCWluZGV4ID0gdXJsLmluZGV4T2YoIj8iKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAoIGluZGV4ID49IDAgKQotCQl7Ci0JCQl1cmwgPSB1cmwuc3Vic3RyaW5nKDAsIGluZGV4KTsKLQkJfQotCQkKLQkJaWYgKHVybC50cmltKCkubGVuZ3RoKCkgPT0gMCApIHsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJLy8gdGhlIHVybCBpcyByZWxhdGl2ZSB0byB0aGUgb3duZXIgZWxlbWVudAotCQkvLyBuZWVkIHRvIGNvbnZlcnQgdG8gdGhlIHBhdGggcmVsYXRpdmUgdG8gdGhlIGxpYnJhcnkgcm9vdAotCQlGaWxlIHNyY0ZpbGUgPSBudWxsOwotCQlGaWxlIHRhcmdldEZpbGUgPSBudWxsOwotCQl0cnkgewotCQkJaWYgKCBvd25lciAhPSBudWxsICkgewotCQkJCUlMaWJyYXJ5UmVzb3VyY2VNYW5hZ2VyIGxpYlJlc01nciA9IFJlc291cmNlSGVscGVyLmdldFJlc291cmNlTWdyKG93bmVyKTsKLQkJCQlTdHJpbmcgZWxlbWVudFBhdGggPSBSZXNvdXJjZUhlbHBlci5nZXRFbGVtZW50UGF0aChvd25lcik7Ci0JCQkJLy9zcmNGaWxlID0gbmV3IEZpbGUobmV3IEZpbGUoc3JjTGliUm9vdCwgZWxlbWVudFBhdGgpLCB1cmwpOwotCQkJCS8vaWYgKCFzcmNGaWxlLmlzRmlsZSgpIHx8ICFzcmNGaWxlLmV4aXN0cygpKSB7Ci0JCQkJCWVsZW1lbnRQYXRoID0gZ2V0RWxlbWVudFBhdGhXaXRoUmVuYW1lZFBsdWdpbihlbGVtZW50UGF0aCk7Ci0JCQkJCXNyY0ZpbGUgPSBuZXcgRmlsZShuZXcgRmlsZShzcmNMaWJSb290LCBlbGVtZW50UGF0aCksIHVybCk7Ci0JCQkJLy99Ci0JCQkJaWYgKCFzcmNGaWxlLmlzRmlsZSgpIHx8ICFzcmNGaWxlLmV4aXN0cygpKSB7Ci0JCQkJCXVybCA9IE5ldFV0aWwuZGVjb2RlVVJMKHVybCk7Ci0JCQkJCXNyY0ZpbGUgPSBuZXcgRmlsZShuZXcgRmlsZShzcmNMaWJSb290LCBlbGVtZW50UGF0aCksIHVybCk7Ci0JCQkJfQotCQkJCS8vdGFyZ2V0RmlsZSA9IG5ldyBGaWxlKG5ldyBGaWxlKHRhcmdldExpYlJvb3QsIGVsZW1lbnRQYXRoKSwgdXJsKTsKLQkJCQlTdHJpbmcgcGx1Z2luUGF0aCA9IGxpYlJlc01nci5nZXRQaHlzaWNhbFBsdWdpblBhdGgob3duZXIpOwotCQkJCUZpbGUgdGFyZ2V0Um9vdCA9IChuZXcgRmlsZShwbHVnaW5QYXRoKSkuZ2V0UGFyZW50RmlsZSgpOwotCQkJCXRhcmdldEZpbGUgPSBuZXcgRmlsZShuZXcgRmlsZSh0YXJnZXRSb290LCBlbGVtZW50UGF0aCksIHVybCk7Ci0JCQl9IGVsc2UgewotCQkJCWlmIChwbHVnaW4gPT0gbnVsbCkgewotCQkJCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQkJCQl9CQkJCi0JCQkJRmlsZSBzcmNQbHVnaW5Sb290ID0gbmV3IEZpbGUoc3JjTGliUm9vdCwgcGx1Z2luLmdldE5hbWUoKSk7Ci0JCQkJc3JjRmlsZSA9IG5ldyBGaWxlKHNyY1BsdWdpblJvb3QsIHVybCk7Ci0JCQkJaWYgKCFzcmNGaWxlLmlzRmlsZSgpIHx8ICFzcmNGaWxlLmV4aXN0cygpKSB7Ci0JCQkJCXVybCA9IE5ldFV0aWwuZGVjb2RlVVJMKHVybCk7Ci0JCQkJCXNyY0ZpbGUgPSBuZXcgRmlsZShzcmNQbHVnaW5Sb290LCB1cmwpOwotCQkJCX0KLQkJCQlJTGlicmFyeVJlc291cmNlTWFuYWdlciBsaWJSZXNNZ3IgPSBSZXNvdXJjZUhlbHBlci5nZXRSZXNvdXJjZU1ncihwbHVnaW4pOwkJCQkKLQkJCQlTdHJpbmcgc3JjUGx1Z2luUm9vdFBhdGggPSBsaWJSZXNNZ3IuZ2V0UGh5c2ljYWxQbHVnaW5QYXRoKHBsdWdpbik7CQotCQkJCXRhcmdldEZpbGUgPSBuZXcgRmlsZShzcmNQbHVnaW5Sb290UGF0aCwgdXJsKTsJCQkJCi0JCQl9Ci0JCQkKLQkJCWlmICggc3JjRmlsZS5pc0ZpbGUoKSAmJiBzcmNGaWxlLmV4aXN0cygpICkgewotCi0JCQkJc3JjRmlsZSA9IHNyY0ZpbGUuZ2V0Q2Fub25pY2FsRmlsZSgpOwotCQkJCXRhcmdldEZpbGUgPSB0YXJnZXRGaWxlLmdldENhbm9uaWNhbEZpbGUoKTsKLQkJCQkKLQkJCQlpZiAoIHRhcmdldEZpbGUuZXhpc3RzKCkgKSB7Ci0JCQkJCWlmICggIWV4aXN0aW5nRmlsZU1hcC5jb250YWluc0tleShzcmNGaWxlKSApIHsKLQkJCQkJCWlmICggc3JjRmlsZS5sZW5ndGgoKSAhPSB0YXJnZXRGaWxlLmxlbmd0aCgpIAotCQkJCQkJCQl8fCBzcmNGaWxlLmxhc3RNb2RpZmllZCgpICE9IHRhcmdldEZpbGUubGFzdE1vZGlmaWVkKCkgKQotCQkJCQkJewotCQkJCQkJCWV4aXN0aW5nRmlsZU1hcC5wdXQoc3JjRmlsZSwgdGFyZ2V0RmlsZSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQlpZiAoICFuZXdGaWxlTWFwLmNvbnRhaW5zS2V5KHNyY0ZpbGUpICkgewotCQkJCQkJbmV3RmlsZU1hcC5wdXQoc3JjRmlsZSwgdGFyZ2V0RmlsZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCS8vIExvZyB0aGUgZXJyb3IgYW5kIHByb2NlZWQuIFRPRE8KLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldEVsZW1lbnRQYXRoV2l0aFJlbmFtZWRQbHVnaW4oU3RyaW5nIGVsZW1lbnRQYXRoKSB7Ci0JCWlmIChyZW5hbWVQbHVnaW5NYXAgIT0gbnVsbCAmJiAhIHJlbmFtZVBsdWdpbk1hcC5pc0VtcHR5KCkpIHsKLQkJCWludCBpeCA9IGVsZW1lbnRQYXRoLmluZGV4T2YoIlxcIik7Ly8kTk9OLU5MUy0xJAotCQkJaWYgKGl4ID4gMCkgewotCQkJCVN0cmluZyBiYXNlUGx1Z2luTmFtZSA9ICBlbGVtZW50UGF0aC5zdWJzdHJpbmcoMCwgaXgpOwotCQkJCVN0cmluZyBpbXBvcnRQbHVnaW5OYW1lID0gcmVuYW1lUGx1Z2luTWFwLmdldChiYXNlUGx1Z2luTmFtZSk7Ci0JCQkJaWYgKGltcG9ydFBsdWdpbk5hbWUgIT0gbnVsbCkgewotCQkJCQlyZXR1cm4gaW1wb3J0UGx1Z2luTmFtZSArIGVsZW1lbnRQYXRoLnN1YnN0cmluZyhpeCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBlbGVtZW50UGF0aDsKLQl9Ci0JCi0JLyoqCi0JICogQ29waWVzIHJlc291cmNlLgotCSAqLwotCXB1YmxpYyB2b2lkIGNvcHlSZXNvdXJjZShTdHJpbmcgdXJsLCBNZXRob2RQbHVnaW4gcGx1Z2luKSB7Ci0JCXByb2Nlc3NVcmwobnVsbCwgdXJsLCBwbHVnaW4pOwotCX0KLQkKLQkvKioKLQkgKiBDb3BpZXMgcmVzb3VyY2UuCi0JICovCi0JcHVibGljIHZvaWQgY29weVJlc291cmNlKE1ldGhvZEVsZW1lbnQgb3duZXIsIFN0cmluZyB1cmwpIHsKLQkJcHJvY2Vzc1VybChvd25lciwgdXJsKTsKLQl9Ci0JCi0JLyoqCi0JICogcmV0dXJuIGEgbGlzdCBvZiBhbGwgdGhlIGZpbGVzIHRvIGJlIHJlcGxhY2VkCi0JICogQHJldHVybiBMaXN0IGEgbGlzdCBvZiBmaWxlIHBhdGggc3RyaW5nCi0JICovCi0JcHVibGljIExpc3QgZ2V0RmlsZXNUb2JlUmVwbGFjZWQoKSB7Ci0JCUxpc3QgZmlsZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWlmICggZXhpc3RpbmdGaWxlTWFwLnNpemUoKSA+IDAgKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gZXhpc3RpbmdGaWxlTWFwLnZhbHVlcygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTsgKSB7Ci0JCQkJRmlsZSBmID0gKEZpbGUpaXQubmV4dCgpOwotCQkJCWlmIChmICE9IG51bGwgKSB7Ci0JCQkJCVN0cmluZyBwYXRoID0gZi5nZXRBYnNvbHV0ZVBhdGgoKTsKLQkJCQkJaWYgKCAhZmlsZXMuY29udGFpbnMocGF0aCkgKSB7Ci0JCQkJCQlmaWxlcy5hZGQocGF0aCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiBmaWxlczsKLQl9Ci0JCi0JLyoqCi0JICogY29weSBhbGwgdGhlIGZpbGVzIHRvIHRoZSBkZXN0aW5hdGlvbgotCSAqCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJCi0JCWZvciAoSXRlcmF0b3IgaXQgPSBuZXdGaWxlTWFwLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOyApIHsKLQkJCU1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpaXQubmV4dCgpOwotCQkJRmlsZSBzcmNGaWxlID0gKEZpbGUpIGVudHJ5LmdldEtleSgpOwotCQkJRmlsZSB0YXJnZXRGaWxlID0gKEZpbGUpIGVudHJ5LmdldFZhbHVlKCk7Ci0JCQlGaWxlVXRpbC5jb3B5RmlsZShzcmNGaWxlLCB0YXJnZXRGaWxlKTsKLQkJfQkKLQkJCi0JCWZvciAoSXRlcmF0b3IgaXQgPSBleGlzdGluZ0ZpbGVNYXAuZW50cnlTZXQoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7ICkgewotCQkJTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSlpdC5uZXh0KCk7Ci0JCQlGaWxlIHNyY0ZpbGUgPSAoRmlsZSkgZW50cnkuZ2V0S2V5KCk7Ci0JCQlGaWxlIHRhcmdldEZpbGUgPSAoRmlsZSkgZW50cnkuZ2V0VmFsdWUoKTsKLQkJCUZpbGVVdGlsLmNvcHlGaWxlKHNyY0ZpbGUsIHRhcmdldEZpbGUpOwotCQl9CQotCX0KLQkKLQkKLQkKLQkKLQkKLQkKLQkKLQkKLQkKLQkKLQkKLQkKLQkKLQkKLQkKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcvc2VydmljZXMvcGFja2FnZS5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy9zZXJ2aWNlcy9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmYjExMTYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy9zZXJ2aWNlcy9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyB0aGUgaW50ZXJmYWNlcyBhbmQgaW1wbGVtZW50YXRpb24gZm9yIHRoZSBtZXRob2QgcGx1Zy1pbiBhbmQgY29uZmlndXJhdGlvbiBpbXBvcnQgc2VydmljZXMuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy93aXphcmRzL0RpZmZSZXBvcnRDb250ZW50UHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcvd2l6YXJkcy9EaWZmUmVwb3J0Q29udGVudFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjMmE3YmUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy93aXphcmRzL0RpZmZSZXBvcnRDb250ZW50UHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLndpemFyZHM7Ci0KLWltcG9ydCBqYXZhLnRleHQuQ29sbGF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy5zZXJ2aWNlcy5FbGVtZW50RGlmZlRyZWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRyZWVDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci0KLS8qKgotICogVGhlIGNvbnRlbnQgcHJvdmlkZXIgZm9yIHRoZSBkaWZmIHJlcG9ydC4KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIERpZmZSZXBvcnRDb250ZW50UHJvdmlkZXIgaW1wbGVtZW50cyBJVHJlZUNvbnRlbnRQcm92aWRlciB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBEaWZmUmVwb3J0Q29udGVudFByb3ZpZGVyKCkgewotCX0KLQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyI2dldEVsZW1lbnRzKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dEVsZW1lbnQpIHsKLQkJaWYgKGlucHV0RWxlbWVudCBpbnN0YW5jZW9mIEVsZW1lbnREaWZmVHJlZSkgewotCQkJCi0JCQlNZXRob2RFbGVtZW50IGUgPSAoKEVsZW1lbnREaWZmVHJlZSlpbnB1dEVsZW1lbnQpLmdldEJhc2VFbGVtZW50KCk7Ci0JCQkKLQkJCS8vIGRvbid0IHNob3cgc3ViLXBhY2thZ2VzIHVuZGVyIHByb2Nlc3MgY29tcG9uZW50LCBoaWRlIHRoZSBwcm9jZXNzIGRldGlhbAotCQkJaWYgKCAoZSBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpICkgewotCQkJCXJldHVybiBuZXcgT2JqZWN0W10ge307Ci0JCQl9Ci0KLQkJCUxpc3QgaXRlbXMgPSAoKEVsZW1lbnREaWZmVHJlZSkgaW5wdXRFbGVtZW50KS5nZXRDaGlsZHJlbigpOwotCQkJaWYgKGl0ZW1zICE9IG51bGwpIHsKLQkJCQlMaXN0IGRpcnR5SXRlbXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJZm9yIChJdGVyYXRvciBpdCA9IGl0ZW1zLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQkJRWxlbWVudERpZmZUcmVlIGl0ZW0gPSAoRWxlbWVudERpZmZUcmVlKSBpdC5uZXh0KCk7Ci0JCQkJCWlmIChpdGVtLmlzT2xkT25seSgpKSB7Ci0JCQkJCQljb250aW51ZTsKLQkJCQkJfQotCQkJCQkKLQkJCQkJLy8gMTUwODk1SW1wb3J0IENvbmZpZzogQ3VzdG9tQ2F0ZWdvcnkgZGlkIG5vdCBzeW5jIHVwIGJ5IGltcG9ydAotCQkJCQkvLyB0byBmaXggdGhpcyBwcm9ibGVtLCB3ZSBuZWVkIHRvIGluY2x1ZGUgdGhlIEhpZGRlbiByb290IGN1c3RvbUNhdGVnb3J5IHBhY2thZ2UgCi0JCQkJCS8vIGJ1dCBuZWVkIHRvIGhpZGUgaGVyZQotCQkJCQlNZXRob2RFbGVtZW50IGJhc2UgPSBpdGVtLmdldEJhc2VFbGVtZW50KCk7Ci0JCQkJCWlmICggKGJhc2UgaW5zdGFuY2VvZiBNZXRob2RQYWNrYWdlKSAKLQkJCQkJCQkmJiBUbmdVdGlsLmlzUm9vdEN1dG9tQ2F0ZWdvcnlQYWNrYWdlKChNZXRob2RQYWNrYWdlKWJhc2UpICkgewotCQkJCQkJY29udGludWU7Ci0JCQkJCX0KLQkJCQkJCi0JCQkJCWRpcnR5SXRlbXMuYWRkKGl0ZW0pOwotCQkJCX0KLQotCQkJCWlmIChlIGluc3RhbmNlb2YgTWV0aG9kTGlicmFyeSkgewotCQkJCQlDb21wYXJhdG9yIGNvbXBhcmF0b3IgPSBuZXcgQ29tcGFyYXRvcjxFbGVtZW50RGlmZlRyZWU+KCkgewotCQkJCQkJcHVibGljIGludCBjb21wYXJlKEVsZW1lbnREaWZmVHJlZSBvMSwgRWxlbWVudERpZmZUcmVlIG8yKSB7Ci0JCQkJCQkJaWYgKG8xID09IG8yKSB7Ci0JCQkJCQkJCXJldHVybiAwOwotCQkJCQkJCX0KLQkJCQkJCQlDb2xsYXRvciBjb2xsYXRvciA9IENvbGxhdG9yLmdldEluc3RhbmNlKCk7Ci0JCi0JCQkJCQkJcmV0dXJuIGNvbGxhdG9yLmNvbXBhcmUobzEuZ2V0TmFtZSgpLCBvMi5nZXROYW1lKCkpOwotCQkJCQkJfQotCQkJCQl9OwotCQkJCQlDb2xsZWN0aW9ucy48RWxlbWVudERpZmZUcmVlPiBzb3J0KGRpcnR5SXRlbXMsIGNvbXBhcmF0b3IpOwotCQkJCX0KLQkJCQkKLQkJCQlyZXR1cm4gZGlydHlJdGVtcy50b0FycmF5KCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG5ldyBPYmplY3RbXSB7fTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNvbnRlbnRQcm92aWRlciNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ29udGVudFByb3ZpZGVyI2lucHV0Q2hhbmdlZChvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlciwgamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpIHsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRyZWVDb250ZW50UHJvdmlkZXIjZ2V0Q2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0W10gZ2V0Q2hpbGRyZW4oT2JqZWN0IHBhcmVudEVsZW1lbnQpIHsKLQkJcmV0dXJuIGdldEVsZW1lbnRzKHBhcmVudEVsZW1lbnQpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVHJlZUNvbnRlbnRQcm92aWRlciNnZXRQYXJlbnQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3QgZWxlbWVudCkgewotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEVsZW1lbnREaWZmVHJlZSkgewotCQkJcmV0dXJuICgoRWxlbWVudERpZmZUcmVlKSBlbGVtZW50KS5nZXRQYXJlbnQoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRyZWVDb250ZW50UHJvdmlkZXIjaGFzQ2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbihPYmplY3QgZWxlbWVudCkgewotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEVsZW1lbnREaWZmVHJlZSkgewotCQkJcmV0dXJuICgoRWxlbWVudERpZmZUcmVlKSBlbGVtZW50KS5oYXNDaGlsZHJlbigpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcvd2l6YXJkcy9EaWZmUmVwb3J0TGFiZWxQcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy93aXphcmRzL0RpZmZSZXBvcnRMYWJlbFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwYzlmYzEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy93aXphcmRzL0RpZmZSZXBvcnRMYWJlbFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy53aXphcmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuRXh0ZW5kZWRJbWFnZVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcuSW1wb3J0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcuc2VydmljZXMuRWxlbWVudERpZmZUcmVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlckxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRhYmxlTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0KLQotLyoqCi0gKiBUaGUgbGFiZWwgcHJvdmlkZXIgZm9yIHRoZSBkaWZmIHJlcG9ydC4KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIERpZmZSZXBvcnRMYWJlbFByb3ZpZGVyIGltcGxlbWVudHMgSUxhYmVsUHJvdmlkZXIsCi0JCUlUYWJsZUxhYmVsUHJvdmlkZXIgewotCi0JCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgRGlmZlJlcG9ydExhYmVsUHJvdmlkZXIoKSB7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyI2dldEltYWdlKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIEltYWdlIGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIEltYWdlIGdldEltYWdlRnJvbU9iamVjdChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBFeHRlbmRlZEltYWdlUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZShvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVGFibGVMYWJlbFByb3ZpZGVyI2dldENvbHVtbkltYWdlKGphdmEubGFuZy5PYmplY3QsIGludCkKLQkgKi8KLQlwdWJsaWMgSW1hZ2UgZ2V0Q29sdW1uSW1hZ2UoT2JqZWN0IG9iamVjdCwgaW50IGNvbHVtbkluZGV4KSB7Ci0JCWlmIChjb2x1bW5JbmRleCA9PSAwKSB7Ci0JCQlyZXR1cm4gdGhpcy5nZXRJbWFnZShvYmplY3QpOwotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUYWJsZUxhYmVsUHJvdmlkZXIjZ2V0Q29sdW1uVGV4dChqYXZhLmxhbmcuT2JqZWN0LCBpbnQpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDb2x1bW5UZXh0KE9iamVjdCBvYmplY3QsIGludCBjb2x1bW5JbmRleCkgewotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgRWxlbWVudERpZmZUcmVlKSB7Ci0JCQlFbGVtZW50RGlmZlRyZWUgZGlmZlRyZWUgPSAoRWxlbWVudERpZmZUcmVlKSBvYmplY3Q7Ci0JCQlpZiAoY29sdW1uSW5kZXggPT0gMCkgewotCQkJCXJldHVybiBkaWZmVHJlZS5nZXROYW1lKCk7Ci0KLQkJCX0gZWxzZSBpZiAoY29sdW1uSW5kZXggPT0gMSkgewotCQkJCXJldHVybiBkaWZmVHJlZS5nZXRDb250ZW50VHlwZSgpOwotCQkJfSBlbHNlIGlmIChjb2x1bW5JbmRleCA9PSAyKSB7Ci0JCQkJcmV0dXJuIChkaWZmVHJlZS5nZXRJbXBvcnRFbGVtZW50KCkgPT0gbnVsbCkgPyAiIiA6IEltcG9ydFJlc291cmNlcy5EaWZmUmVwb3J0TGFiZWxQcm92aWRlcl95ZXM7IC8vJE5PTi1OTFMtMSQJCQkKLSAKLQkJCX0gZWxzZSBpZiAoY29sdW1uSW5kZXggPT0gMykgewotCQkJCXJldHVybiAoZGlmZlRyZWUuZ2V0QmFzZUVsZW1lbnQoKSA9PSBudWxsKSA/ICIiIDogSW1wb3J0UmVzb3VyY2VzLkRpZmZSZXBvcnRMYWJlbFByb3ZpZGVyX3llczsgLy8kTk9OLU5MUy0xJAkJCi0gCi0JCQl9IGVsc2UgaWYgKGNvbHVtbkluZGV4ID09IDQpIHsKLQkJCQlyZXR1cm4gZGlmZlRyZWUuZ2V0RGlmZk1lc3NhZ2UoKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlciNnZXRUZXh0KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q29sdW1uVGV4dChvYmplY3QsIDApOwotCX0KLQotCS8qKgotCSAqIFNpbmNlIHdlIHdvbid0IGV2ZXIgZ2VuZXJhdGUgdGhlc2Ugbm90aWZpY2F0aW9ucywgd2UgY2FuIGp1c3QgaWdub3JlCi0JICogdGhpcy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcihJTGFiZWxQcm92aWRlckxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JfQotCi0JLyoqCi0JICogU2luY2Ugd2Ugd29uJ3QgZXZlciBhZGQgbGlzdGVuZXJzLCB3ZSBjYW4ganVzdCBpZ25vcmUgdGhpcy4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVMaXN0ZW5lcihJTGFiZWxQcm92aWRlckxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JfQotCi0JLyoqCi0JICogQWx3YXlzIHJldHVybnMgdHJ1ZSBmb3Igbm93LgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzTGFiZWxQcm9wZXJ0eShPYmplY3Qgb2JqZWN0LCBTdHJpbmcgaWQpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklCYXNlTGFiZWxQcm92aWRlciNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcvd2l6YXJkcy9EaWZmUmVwb3J0Vmlld2VyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3dpemFyZHMvRGlmZlJlcG9ydFZpZXdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NGY2NDA4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcvd2l6YXJkcy9EaWZmUmVwb3J0Vmlld2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy53aXphcmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy5JbXBvcnRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy5zZXJ2aWNlcy5Db25maWd1cmF0aW9uSW1wb3J0RGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLkxpYnJhcnlVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNoZWNrU3RhdGVDaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DaGVja2JveFRyZWVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ2hlY2tTdGF0ZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRyZWVDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UcmVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRyZWVDb2x1bW47Ci0KLS8qKgotICogRGlzcGxheXMgdGhlIGJlZm9yZSBhbmQgYWZ0ZXIgbWV0aG9kIGxpYnJhcnkgZGlmZmVyZW5jZXMgZm9yIGFuIGltcG9ydAotICogb3BlcmF0aW9uLgotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBEaWZmUmVwb3J0Vmlld2VyIHsKLQotCXByb3RlY3RlZCBDb21wb3NpdGUgcGFyZW50OwotCi0JcHJvdGVjdGVkIENoZWNrYm94VHJlZVZpZXdlciB0cmVlVmlld2VyOwotCi0JQ29uZmlndXJhdGlvbkltcG9ydERhdGEgZGF0YTsKLQkKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCURpZmZSZXBvcnRWaWV3ZXIoQ29tcG9zaXRlIHBhcmVudCwgQ29uZmlndXJhdGlvbkltcG9ydERhdGEgZGF0YSkgewotCQl0aGlzLnBhcmVudCA9IHBhcmVudDsKLQkJdGhpcy5kYXRhID0gZGF0YTsKLQkJCi0JCXRyZWVWaWV3ZXIgPSBuZXcgQ2hlY2tib3hUcmVlVmlld2VyKHBhcmVudCk7Ci0JCXRyZWVWaWV3ZXIuZ2V0Q29udHJvbCgpCi0JCQkJLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCQl0cmVlVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgRGlmZlJlcG9ydENvbnRlbnRQcm92aWRlcigpKTsKLQkJdHJlZVZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKG5ldyBEaWZmUmVwb3J0TGFiZWxQcm92aWRlcigpKTsKLQkJY3JlYXRlVGFibGVDb2x1bW5zKCk7Ci0JCQotCQlhZGRMaXN0ZW5lcnMoKTsKLQkJCi0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgdGFibGUgY29sdW1ucy4KLQkgKi8KLQlwcml2YXRlIHZvaWQgY3JlYXRlVGFibGVDb2x1bW5zKCkgewotCQlUcmVlIHRyZWUgPSB0cmVlVmlld2VyLmdldFRyZWUoKTsKLQkJdHJlZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQkJdHJlZS5zZXRIZWFkZXJWaXNpYmxlKHRydWUpOwotCQl0cmVlLnNldExpbmVzVmlzaWJsZSh0cnVlKTsKLQotCQlUcmVlQ29sdW1uIGNvbHVtbiA9IG5ldyBUcmVlQ29sdW1uKHRyZWUsIFNXVC5OT05FLCAwKTsKLQkJY29sdW1uLnNldFRleHQoSW1wb3J0UmVzb3VyY2VzLkRpZmZSZXBvcnRWaWV3ZXJfY29udGVudCk7IAotCQljb2x1bW4uc2V0V2lkdGgoMjAwKTsKLQotCQljb2x1bW4gPSBuZXcgVHJlZUNvbHVtbih0cmVlLCBTV1QuTk9ORSwgMSk7Ci0JCWNvbHVtbi5zZXRUZXh0KEltcG9ydFJlc291cmNlcy5EaWZmUmVwb3J0Vmlld2VyX3R5cGUpOyAKLQkJY29sdW1uLnNldFdpZHRoKDE1MCk7Ci0KLQkJY29sdW1uID0gbmV3IFRyZWVDb2x1bW4odHJlZSwgU1dULk5PTkUsIDIpOwotCQljb2x1bW4uc2V0VGV4dChJbXBvcnRSZXNvdXJjZXMuRGlmZlJlcG9ydFZpZXdlcl9pbl9pbXBvcnQpOyAKLQkJY29sdW1uLnNldFdpZHRoKDc1KTsKLQotCQljb2x1bW4gPSBuZXcgVHJlZUNvbHVtbih0cmVlLCBTV1QuTk9ORSwgMyk7Ci0JCWNvbHVtbi5zZXRUZXh0KEltcG9ydFJlc291cmNlcy5EaWZmUmVwb3J0Vmlld2VyX2luX2xpYik7IAotCQljb2x1bW4uc2V0V2lkdGgoNzUpOwotCi0JCWNvbHVtbiA9IG5ldyBUcmVlQ29sdW1uKHRyZWUsIFNXVC5OT05FLCA0KTsKLQkJY29sdW1uLnNldFRleHQoSW1wb3J0UmVzb3VyY2VzLkRpZmZSZXBvcnRWaWV3ZXJfc3RhdHVzKTsgCi0JCWNvbHVtbi5zZXRXaWR0aCgxMDApOwotCX0KLQotCS8qKgotCSAqIERpc3BsYXlzIHRoZSByZXZpdy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzaG93UmVwb3J0KE9iamVjdCBpbnB1dCkgewotCQl0cmVlVmlld2VyLmdldFRyZWUoKS5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJdHJlZVZpZXdlci5zZXRJbnB1dChpbnB1dCk7Ci0JCXNldENoZWNrU3RhdGVzKCk7Ci0JCXRyZWVWaWV3ZXIuZXhwYW5kQWxsKCk7Ci0JCXRyZWVWaWV3ZXIuZ2V0VHJlZSgpLnNldFZpc2libGUodHJ1ZSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZExpc3RlbmVycygpIHsKLQkJLy8gYWRkIGEgY2hlY2sgc3RhdGUgY2hhbmdlIGxpc3RlbmVyCi0JCXRyZWVWaWV3ZXIuYWRkQ2hlY2tTdGF0ZUxpc3RlbmVyKG5ldyBJQ2hlY2tTdGF0ZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgY2hlY2tTdGF0ZUNoYW5nZWQoQ2hlY2tTdGF0ZUNoYW5nZWRFdmVudCBldmVudCkgewotCQkJCWJvb2xlYW4gY2hlY2tlZCA9IGV2ZW50LmdldENoZWNrZWQoKTsKLQkJCQl1cGRhdGVDaGVja1N0YXRlcyhldmVudC5nZXRFbGVtZW50KCksIGNoZWNrZWQpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZUNoZWNrU3RhdGVzKE9iamVjdCBlbGVtZW50LCBib29sZWFuIGNoZWNrZWQpIHsKLQotCQkvLyBPYmplY3QgZWxlbWVudCA9IGV2ZW50LmdldEVsZW1lbnQoKTsKLQotCQlpZiAoY2hlY2tlZCA9PSB0cnVlKSB7Ci0JCQlJVHJlZUNvbnRlbnRQcm92aWRlciBjcCA9IChJVHJlZUNvbnRlbnRQcm92aWRlcikgdHJlZVZpZXdlcgotCQkJCQkuZ2V0Q29udGVudFByb3ZpZGVyKCk7Ci0JCQljaGVja1BhcmVudChjcCwgZWxlbWVudCk7Ci0JCQkvLyB0cmVlVmlld2VyLnNldENoZWNrZWQoZWxlbWVudCwgdHJ1ZSk7Ci0JCX0KLQkJZWxzZQotCQkJdHJlZVZpZXdlci5zZXRDaGVja2VkKGVsZW1lbnQsIGZhbHNlKTsKLQkJCQotCQlzZWxlY3Rpb25DaGlsZHJlbihlbGVtZW50LCBjaGVja2VkKTsKLQotCQlzZXREYXRhKHRyZWVWaWV3ZXIuZ2V0Q2hlY2tlZEVsZW1lbnRzKCkpOwotCi0JfQotCi0JLyoqCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiBAcGFyYW0gY2hlY2tlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoaWxkcmVuKE9iamVjdCBlbGVtZW50LCBib29sZWFuIGNoZWNrZWQpIHsKLQkJSVRyZWVDb250ZW50UHJvdmlkZXIgY3AgPSAoSVRyZWVDb250ZW50UHJvdmlkZXIpIHRyZWVWaWV3ZXIKLQkJCQkuZ2V0Q29udGVudFByb3ZpZGVyKCk7Ci0JCU9iamVjdFtdIGNoaWxkcyA9IGNwLmdldENoaWxkcmVuKGVsZW1lbnQpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcy5sZW5ndGg7IGkrKykgewotCQkJdHJlZVZpZXdlci5zZXRDaGVja2VkKGNoaWxkc1tpXSwgY2hlY2tlZCk7Ci0JCQlzZWxlY3Rpb25DaGlsZHJlbihjaGlsZHNbaV0sIGNoZWNrZWQpOwotCQl9Ci0JfQotCi0KLQlwcml2YXRlIHZvaWQgY2hlY2tQYXJlbnQoSVRyZWVDb250ZW50UHJvdmlkZXIgY3AsIE9iamVjdCBlbGVtZW50KSB7Ci0JCWlmIChlbGVtZW50ID09IG51bGwgfHwgZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZExpYnJhcnkgLyoKLQkJCQkJCQkJCQkJCQkJCQkgKiB8fCBlbGVtZW50ID09Ci0JCQkJCQkJCQkJCQkJCQkJICogY3VycmVudFJvb3ROb2RlCi0JCQkJCQkJCQkJCQkJCQkJICovKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJT2JqZWN0IHBhcmVudCA9IExpYnJhcnlVdGlsLnVud3JhcChjcC5nZXRQYXJlbnQoZWxlbWVudCkpOwotCQlpZiAocGFyZW50ICE9IG51bGwpIHsKLQkJCXRyZWVWaWV3ZXIuc2V0Q2hlY2tlZChwYXJlbnQsIHRydWUpOwotCQkJLy8gY29uZmlnRmFjdG9yeS5nZXRDdXJyZW50Q29uZmlndXJhdGlvbigpLmFkZCgoRU9iamVjdClwYXJlbnQsCi0JCQkvLyBmYWxzZSk7Ci0JCQljaGVja1BhcmVudChjcCwgcGFyZW50KTsKLQkJfQotCi0JfQotCQotCXByaXZhdGUgdm9pZCBzZXRDaGVja1N0YXRlcygpIHsKLQkJdHJlZVZpZXdlci5nZXRUcmVlKCkuc2V0VmlzaWJsZShmYWxzZSk7Ci0JCXRyeSB7Ci0JCQlPYmplY3QgZWxlbWVudCA9IHRyZWVWaWV3ZXIuZ2V0SW5wdXQoKTsKLQkJCXNlbGVjdGlvbkNoaWxkcmVuKGVsZW1lbnQsIHRydWUpOwotCQl9IGZpbmFsbHkgewotCQkJdHJlZVZpZXdlci5nZXRUcmVlKCkuc2V0VmlzaWJsZSh0cnVlKTsKLQkJfQotCi0JCXNldERhdGEodHJlZVZpZXdlci5nZXRDaGVja2VkRWxlbWVudHMoKSk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBzZXREYXRhKE9iamVjdFtdIHNlbHMpIHsKLQkJaWYgKCBzZWxzID09IG51bGwgKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCWRhdGEuaW1wb3J0TGlzdC5jbGVhcigpOwotCQlmb3IgKCBpbnQgaSA9IDA7IGkgPCBzZWxzLmxlbmd0aDsgaSsrICkgewotCQkJZGF0YS5pbXBvcnRMaXN0LmFkZChzZWxzW2ldKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcvd2l6YXJkcy9JbXBvcnRDb25maWdSZXBvcnRQYWdlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3dpemFyZHMvSW1wb3J0Q29uZmlnUmVwb3J0UGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MmViM2MxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcvd2l6YXJkcy9JbXBvcnRDb25maWdSZXBvcnRQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLndpemFyZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLkltcG9ydFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLnNlcnZpY2VzLkNvbmZpZ3VyYXRpb25JbXBvcnRTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIEEgd2l6YXJkIHBhZ2UgdGhhdCBkaXNwbGF5cyB0aGUgcmVzdWx0IG9mIGFuIGltcG9ydCBvcGVyYXRpb24uCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBJbXBvcnRDb25maWdSZXBvcnRQYWdlIGV4dGVuZHMgV2l6YXJkUGFnZSB7Ci0KLQlDb25maWd1cmF0aW9uSW1wb3J0U2VydmljZSBpbXBvcnRpbmdTZXJ2aWNlOwotCi0JRGlmZlJlcG9ydFZpZXdlciB2aWV3ZXI7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBJbXBvcnRDb25maWdSZXBvcnRQYWdlKENvbmZpZ3VyYXRpb25JbXBvcnRTZXJ2aWNlIGltcG9ydGluZ1NlcnZpY2UpIHsKLQkJc3VwZXIoSW1wb3J0UmVzb3VyY2VzLkltcG9ydENvbmZpZ1JlcG9ydFBhZ2VfdGl0bGUpOwotCQl0aGlzLmltcG9ydGluZ1NlcnZpY2UgPSBpbXBvcnRpbmdTZXJ2aWNlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nUGFnZSNjcmVhdGVDb250cm9sKENvbXBvc2l0ZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGNvbnRhaW5lciA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJY29udGFpbmVyLnNldExheW91dChsYXlvdXQpOwotCQlwYXJlbnQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RICi0JCQkJfCBHcmlkRGF0YS5HUkFCX1ZFUlRJQ0FMKSk7Ci0JCWNvbnRhaW5lci5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgKLQkJCQl8IEdyaWREYXRhLkdSQUJfVkVSVElDQUwpKTsKLQotCQl2aWV3ZXIgPSBuZXcgRGlmZlJlcG9ydFZpZXdlcihjb250YWluZXIsIGltcG9ydGluZ1NlcnZpY2UKLQkJCQkuZ2V0SW1wb3J0RGF0YSgpKTsKLQotCQlzZXRDb250cm9sKGNvbnRhaW5lcik7Ci0KLQkJc2V0UGFnZUNvbXBsZXRlKGZhbHNlKTsKLQl9Ci0KLQkvKioKLQkgKiBTaG93IHJlc3VsdC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzaG93UmVzdWx0KCkgewotCQkvLyBBbmFseXplIHRoZSBpbXBvcnRpbmcgY29uZmlndXJhdGlvbiBhbmQgcmVwb3J0IHJlc3VsdC4KLQkJaW1wb3J0aW5nU2VydmljZS5hbmFseXplKG51bGwpOwotCi0JCXZpZXdlci5zaG93UmVwb3J0KGltcG9ydGluZ1NlcnZpY2UuZ2V0RGlmZlRyZWUoKSk7Ci0KLQkJc2V0UGFnZUNvbXBsZXRlKHRydWUpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy93aXphcmRzL0ltcG9ydENvbmZpZ3VyYXRpb25XaXphcmQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcvd2l6YXJkcy9JbXBvcnRDb25maWd1cmF0aW9uV2l6YXJkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwOWFhYTQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy93aXphcmRzL0ltcG9ydENvbmZpZ3VyYXRpb25XaXphcmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLndpemFyZHM7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS53aXphcmRzLlNhdmVBbGxFZGl0b3JzUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpLnV0aWwuTXNnQm94OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcuSW1wb3J0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcuSW1wb3J0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcuc2VydmljZXMuQ29uZmlndXJhdGlvbkltcG9ydERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy5zZXJ2aWNlcy5Db25maWd1cmF0aW9uSW1wb3J0U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5JTGlicmFyeU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuTGlicmFyeVVJSW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLndpemFyZHMuTGlicmFyeUJhY2t1cFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzLklGaWxlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VydmljZXMuU2VydmljZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLklSdW5uYWJsZVdpdGhQcm9ncmVzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklJbXBvcnRXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLQotLyoqCi0gKiBBIHdpemFyZCB0aGF0IGltcG9ydHMgZXhwb3J0ZWQgbGlicmFyeSBjb25maWd1cmF0aW9ucyBpbnRvIHRoZSBjdXJyZW50IG1ldGhvZAotICogbGlicmFyeS4KLSAqIAotICogQGF1dGhvciBKZWZmIEhhcmR5Ci0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEltcG9ydENvbmZpZ3VyYXRpb25XaXphcmQgZXh0ZW5kcyBXaXphcmQgaW1wbGVtZW50cyBJSW1wb3J0V2l6YXJkIHsKLQotCXB1YmxpYyBib29sZWFuIG9rVG9Db21wbGV0ZSA9IGZhbHNlOwotCi0JcHJvdGVjdGVkIFNlbGVjdEltcG9ydENvbmZpZ3VyYXRpb25Tb3VyY2UgcGFnZTE7Ci0KLQlwcm90ZWN0ZWQgU2VsZWN0Q29uZmlnc1RvSW1wb3J0IGNvbmZpZ1BhZ2U7Ci0KLQlwcm90ZWN0ZWQgU2VsZWN0Q29uZmlnU3BlY3NUb0ltcG9ydFBhZ2Ugc3BlY3NQYWdlOwotCi0JcHJvdGVjdGVkIENvbmZpZ3VyYXRpb25JbXBvcnREYXRhIGRhdGEgPSBuZXcgQ29uZmlndXJhdGlvbkltcG9ydERhdGEoKTsKLQotCXByb3RlY3RlZCBDb25maWd1cmF0aW9uSW1wb3J0U2VydmljZSBzZXJ2aWNlID0gbmV3IENvbmZpZ3VyYXRpb25JbXBvcnRTZXJ2aWNlKAotCQkJZGF0YSk7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBJbXBvcnRDb25maWd1cmF0aW9uV2l6YXJkKCkgewotCQlzZXRXaW5kb3dUaXRsZShJbXBvcnRSZXNvdXJjZXMuaW1wb3J0Q29uZmlnV2l6YXJkX3RpdGxlKTsKLQkJc2V0TmVlZHNQcm9ncmVzc01vbml0b3IodHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2l6YXJkI2luaXQoSVdvcmtiZW5jaCwKLQkgKiAgICAgIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaCB3b3JrYmVuY2gsIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZCNhZGRQYWdlcygpCi0JICovCi0JcHVibGljIHZvaWQgYWRkUGFnZXMoKSB7Ci0JCUlGaWxlTWFuYWdlciBmaWxlTWdyID0gU2VydmljZXMuZ2V0RmlsZU1hbmFnZXIoKTsKLQkJaWYgKExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKSAhPSBudWxsKSB7Ci0JCQlmaWxlTWdyLmNoZWNrTW9kaWZ5KExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLQkJCQkJLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCkuZVJlc291cmNlKCkuZ2V0VVJJKCkKLQkJCQkJLnRvRmlsZVN0cmluZygpLCBNc2dCb3guZ2V0RGVmYXVsdFNoZWxsKCkpOwotCQl9Ci0KLQkJSUxpYnJhcnlNYW5hZ2VyIG1hbmFnZXIgPSAoSUxpYnJhcnlNYW5hZ2VyKSBMaWJyYXJ5U2VydmljZQotCQkJCS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRMaWJyYXJ5TWFuYWdlcigpOwotCQlpZiAobWFuYWdlciAhPSBudWxsICYmIG1hbmFnZXIuaXNNZXRob2RMaWJyYXJ5UmVhZE9ubHkoKSkgewotCQkJSW1wb3J0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKS5kaXNwbGF5RXJyb3IoCi0JCQkJCUltcG9ydFJlc291cmNlcy5pbXBvcnRDb25maWdXaXphcmRfdGl0bGUsCi0JCQkJCUltcG9ydFJlc291cmNlcy5JbXBvcnRDb25maWd1cmF0aW9uV2l6YXJkX3JlYWRvbmx5KTsKLQkJCXJldHVybjsKLQkJfQotCi0JCVNhdmVBbGxFZGl0b3JzUGFnZS5hZGRQYWdlSWZOZWVkZWQodGhpcywgdHJ1ZSwgbnVsbCwgbnVsbCwgSW1wb3J0UGx1Z2luCi0JCQkJLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoCi0JCQkJCQkiZnVsbC93aXpiYW4vSW1wb3J0TGlicmFyeUNvbmZpZ3VyYXRpb24uZ2lmIikpOyAvLyROT04tTkxTLTEkCi0KLQkJcGFnZTEgPSBuZXcgU2VsZWN0SW1wb3J0Q29uZmlndXJhdGlvblNvdXJjZShkYXRhLCBzZXJ2aWNlKTsKLQkJYWRkUGFnZShwYWdlMSk7Ci0KLQkJY29uZmlnUGFnZSA9IG5ldyBTZWxlY3RDb25maWdzVG9JbXBvcnQoc2VydmljZSk7Ci0JCWFkZFBhZ2UoY29uZmlnUGFnZSk7Ci0KLQkJc3BlY3NQYWdlID0gbmV3IFNlbGVjdENvbmZpZ1NwZWNzVG9JbXBvcnRQYWdlKGRhdGEpOwotCQlhZGRQYWdlKHNwZWNzUGFnZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkI2NyZWF0ZVBhZ2VDb250cm9scyhDb21wb3NpdGUpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlUGFnZUNvbnRyb2xzKENvbXBvc2l0ZSBwYWdlQ29udGFpbmVyKSB7Ci0JCXN1cGVyLmNyZWF0ZVBhZ2VDb250cm9scyhwYWdlQ29udGFpbmVyKTsKLQkJcGFnZUNvbnRhaW5lci5nZXRTaGVsbCgpLnNldEltYWdlKAotCQkJCUxpYnJhcnlVSUltYWdlcy5JTUdfTUVUSE9EX0NPTkZJR1VSQVRPTik7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZCNjYW5GaW5pc2goKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGNhbkZpbmlzaCgpIHsKLQkJcmV0dXJuIG9rVG9Db21wbGV0ZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkI3BlcmZvcm1GaW5pc2goKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHBlcmZvcm1GaW5pc2goKSB7Ci0JCS8vIFByb21wdCB0aGUgdXNlciB0byBiYWNrIHVwIGxpYnJhcnkuCi0JCUxpYnJhcnlCYWNrdXBVdGlsLnByb21wdEJhY2t1cEN1cnJlbnRMaWJyYXJ5KG51bGwsIExpYnJhcnlTZXJ2aWNlCi0JCQkJLmdldEluc3RhbmNlKCkpOwotCQlJUnVubmFibGVXaXRoUHJvZ3Jlc3Mgb3AgPSBuZXcgSVJ1bm5hYmxlV2l0aFByb2dyZXNzKCkgewotCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLQkJCQkJdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gewotCQkJCXRyeSB7Ci0JCQkJCS8vIFN0YXJ0IHRoZSBpbXBvcnQuCi0JCQkJCW1vbml0b3IuYmVnaW5UYXNrKAotCQkJCQkJCUltcG9ydFJlc291cmNlcy5JbXBvcnRDb25maWd1cmF0aW9uV2l6YXJkX01TRzEsCi0JCQkJCQkJSVByb2dyZXNzTW9uaXRvci5VTktOT1dOKTsKLQkJCQkJc2VydmljZS5wZXJmb3JtSW1wb3J0KG1vbml0b3IpOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCXRocm93IG5ldyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uKGUpOwotCQkJCX0gZmluYWxseSB7Ci0JCQkJCW1vbml0b3IuZG9uZSgpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQotCQl0cnkgewotCQkJZ2V0Q29udGFpbmVyKCkucnVuKHRydWUsIGZhbHNlLCBvcCk7Ci0JCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0JCQlUaHJvd2FibGUgcmVhbEV4Y2VwdGlvbiA9IGUuZ2V0VGFyZ2V0RXhjZXB0aW9uKCk7Ci0JCQlJbXBvcnRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpLmRpc3BsYXlFcnJvcigKLQkJCQkJSW1wb3J0UmVzb3VyY2VzLkltcG9ydENvbmZpZ3VyYXRpb25XaXphcmRfZXJyb3IsCi0JCQkJCXJlYWxFeGNlcHRpb24uZ2V0TWVzc2FnZSgpKTsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCS8vIFNhdmUgdGhlIGltcG9ydCBwYXRoIHRvIHByZWZlcmVuY2Ugc3RvcmUuCi0JCUltcG9ydFVJUHJlZmVyZW5jZXMuYWRkSW1wb3J0Q29uZmlnRGlyKGRhdGEubGxEYXRhLmdldFBhcmVudEZvbGRlcigpKTsKLQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcvd2l6YXJkcy9JbXBvcnRQbHVnaW5XaXphcmQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcvd2l6YXJkcy9JbXBvcnRQbHVnaW5XaXphcmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGFkY2UzMS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3dpemFyZHMvSW1wb3J0UGx1Z2luV2l6YXJkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy53aXphcmRzOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLndpemFyZHMuU2F2ZUFsbEVkaXRvcnNQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udWkudXRpbC5Nc2dCb3g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy5JbXBvcnRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy5JbXBvcnRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy5zZXJ2aWNlcy5QbHVnaW5JbXBvcnREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcuc2VydmljZXMuUGx1Z2luSW1wb3J0aW5nU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5JTGlicmFyeU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLlBsdWdpbkRlcEluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLlBsdWdpbkRlcGVuZGVuY3lJbmZvTWdyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLkxpYnJhcnlVSUltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS53aXphcmRzLkxpYnJhcnlCYWNrdXBVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy5JRmlsZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzLlNlcnZpY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVXaXRoUHJvZ3Jlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklJbXBvcnRXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLQotLyoqCi0gKiBBIHdpemFyZCB0aGF0IGltcG9ydHMgYW4gZXhwb3J0ZWQgbWV0aG9kIHBsdWctaW5zIGludG8gdGhlIGN1cnJyZW50IG1ldGhvZAotICogbGlicmFyeS4KLSAqIAotICogQGF1dGhvciBKZWZmIEhhcmR5Ci0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEltcG9ydFBsdWdpbldpemFyZCBleHRlbmRzIFdpemFyZCBpbXBsZW1lbnRzIElJbXBvcnRXaXphcmQgewotCi0JcHJvdGVjdGVkIFNlbGVjdEltcG9ydFBsdWdpblNvdXJjZSBwYWdlMTsKLQotCXByb3RlY3RlZCBTZWxlY3RQbHVnaW5zVG9JbXBvcnQgcGFnZTI7Ci0KLQlwcm90ZWN0ZWQgUGx1Z2luSW1wb3J0RGF0YSBkYXRhID0gbmV3IFBsdWdpbkltcG9ydERhdGEoKTsKLQotCXByb3RlY3RlZCBQbHVnaW5JbXBvcnRpbmdTZXJ2aWNlIHNlcnZpY2UgPSBuZXcgUGx1Z2luSW1wb3J0aW5nU2VydmljZShkYXRhKTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIEltcG9ydFBsdWdpbldpemFyZCgpIHsKLQkJc2V0V2luZG93VGl0bGUoSW1wb3J0UmVzb3VyY2VzLmltcG9ydFBsdWdpbnNXaXphcmRfdGl0bGUpOwotCQlzZXROZWVkc1Byb2dyZXNzTW9uaXRvcih0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaXphcmQjaW5pdChJV29ya2JlbmNoLAotCSAqICAgICAgSVN0cnVjdHVyZWRTZWxlY3Rpb24pCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoIHdvcmtiZW5jaCwgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkI2FkZFBhZ2VzKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRQYWdlcygpIHsKLQkJLy8gY2hlY2sgb3V0IHRoZSBsaWJyYXJ5IGZpcnN0Ci0JCUlGaWxlTWFuYWdlciBmaWxlTWdyID0gU2VydmljZXMuZ2V0RmlsZU1hbmFnZXIoKTsKLQkJaWYgKExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKSAhPSBudWxsKSB7Ci0JCQlmaWxlTWdyLmNoZWNrTW9kaWZ5KExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLQkJCQkJLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCkuZVJlc291cmNlKCkuZ2V0VVJJKCkKLQkJCQkJLnRvRmlsZVN0cmluZygpLCBNc2dCb3guZ2V0RGVmYXVsdFNoZWxsKCkpOwotCQl9Ci0JCUlMaWJyYXJ5TWFuYWdlciBtYW5hZ2VyID0gKElMaWJyYXJ5TWFuYWdlcikgTGlicmFyeVNlcnZpY2UKLQkJCQkuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TGlicmFyeU1hbmFnZXIoKTsKLQkJaWYgKG1hbmFnZXIgIT0gbnVsbCAmJiBtYW5hZ2VyLmlzTWV0aG9kTGlicmFyeVJlYWRPbmx5KCkpIHsKLQkJCUltcG9ydFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkuZGlzcGxheUVycm9yKAotCQkJCQlJbXBvcnRSZXNvdXJjZXMuaW1wb3J0UGx1Z2luc1dpemFyZF90aXRsZSwKLQkJCQkJSW1wb3J0UmVzb3VyY2VzLkltcG9ydFBsdWdpbldpemFyZF9yZWFkb25seSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlTYXZlQWxsRWRpdG9yc1BhZ2UuYWRkUGFnZUlmTmVlZGVkKHRoaXMsIHRydWUsIG51bGwsIG51bGwsIEltcG9ydFBsdWdpbgotCQkJCS5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKAotCQkJCQkJImZ1bGwvd2l6YmFuL0ltcG9ydE1ldGhvZFBsdWdpbnMuZ2lmIikpOyAvLyROT04tTkxTLTEkCi0KLQkJcGFnZTEgPSBuZXcgU2VsZWN0SW1wb3J0UGx1Z2luU291cmNlKGRhdGEsIHNlcnZpY2UpOwotCQlhZGRQYWdlKHBhZ2UxKTsKLQotCQlwYWdlMiA9IG5ldyBTZWxlY3RQbHVnaW5zVG9JbXBvcnQoZGF0YSwgc2VydmljZSk7Ci0JCWFkZFBhZ2UocGFnZTIpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZCNjcmVhdGVQYWdlQ29udHJvbHMoQ29tcG9zaXRlKQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZVBhZ2VDb250cm9scyhDb21wb3NpdGUgcGFnZUNvbnRhaW5lcikgewotCQlzdXBlci5jcmVhdGVQYWdlQ29udHJvbHMocGFnZUNvbnRhaW5lcik7Ci0JCXBhZ2VDb250YWluZXIuZ2V0U2hlbGwoKS5zZXRJbWFnZShMaWJyYXJ5VUlJbWFnZXMuSU1HX01FVEhPRF9QTFVHSU4pOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmQjY2FuRmluaXNoKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjYW5GaW5pc2goKSB7Ci0JCWlmICh0aGlzLmdldENvbnRhaW5lcigpLmdldEN1cnJlbnRQYWdlKCkgIT0gcGFnZTIpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiBwYWdlMi5pc1BhZ2VDb21wbGV0ZSgpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmQjcGVyZm9ybUZpbmlzaCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gcGVyZm9ybUZpbmlzaCgpIHsKLQkJLy8gQ2hlY2sgaWYgdGhlIHNlbGVjdGVkIHBsdWctaW5zIGFyZSB1cGRhdGFibGUgb3Igbm90LgotCQlQbHVnaW5Nb2RpZnlJbmZvIG1vZGlmeUluZm8gPSBjaGVja01vZGlmeSgpOwotCi0JCS8vIGlmIG9ubHkgbG9ja2VkLCB3ZSBjYW4gYXV0by11bmxvY2sgYW5kIHJlbG9jayB0aGUgcGx1Z2lucwotCQkvLyBpZiB0aGUgcGx1aW4gaXMgcmVhZG9ubHksIHVzZXIgbmVlZCB0byBtYW51YWxseSBtYWtlIGl0IHVwZGF0YWJsZQotCQkvLyBjdXN0b21lcnMgbmVlZCB0byBtYW51YWxseSB1bmxvY2sgYW5kIGxvY2sgcGx1Z2lucwotCQkvLyBkdXJpbmcgY29udGVudCBsaWJyYXJ5IHVwZ3JhZGUKLQotCQlpZiAobW9kaWZ5SW5mby5yZWFkb25seVBsdWdpbnMuc2l6ZSgpID4gMCkgewotCQkJLy8gRGlzcGxheSBhbiBlcnJvciBtZXNzYWdlLgotCQkJU3RyaW5nIGVycm9yID0gbW9kaWZ5SW5mby5nZXRSZWFkb25seU1lc3NhZ2UoKS50b1N0cmluZygpOwotCQkJSW1wb3J0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKS5kaXNwbGF5RXJyb3IoCi0JCQkJCUltcG9ydFJlc291cmNlcy5JbXBvcnRDb25maWd1cmF0aW9uV2l6YXJkX2Vycm9yLCBlcnJvcik7Ci0KLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCVBsdWdpbkltcG9ydERhdGEuUGx1Z2luSW5mbyBpbmZvOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gZGF0YS5nZXRQbHVnaW5zKCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJaW5mbyA9IChQbHVnaW5JbXBvcnREYXRhLlBsdWdpbkluZm8pIGl0Lm5leHQoKTsKLQkJCWlmICgoaW5mby5leGlzdGluZ1BsdWdpbiAhPSBudWxsKSAmJiBpbmZvLnNlbGVjdGVkKSB7Ci0JCQkJaWYgKGJ1ZmZlci5sZW5ndGgoKSA+IDApIHsKLQkJCQkJYnVmZmVyLmFwcGVuZCgiXG4iKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCQlidWZmZXIuYXBwZW5kKCJcdCIpLmFwcGVuZChpbmZvLm5hbWUpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQotCQlpZiAoYnVmZmVyLmxlbmd0aCgpID4gMCkgewotCQkJYm9vbGVhbiB5ZXMgPSBJbXBvcnRQbHVnaW4KLQkJCQkJLmdldERlZmF1bHQoKQotCQkJCQkuZ2V0TXNnRGlhbG9nKCkKLQkJCQkJLmRpc3BsYXlDb25maXJtYXRpb24oCi0JCQkJCQkJSW1wb3J0UmVzb3VyY2VzLmltcG9ydFBsdWdpbnNXaXphcmRfdGl0bGUsCi0JCQkJCQkJTkxTCi0JCQkJCQkJCQkuYmluZCgKLQkJCQkJCQkJCQkJSW1wb3J0UmVzb3VyY2VzLkltcG9ydFBsdWdpbldpemFyZF93YXJuX2V4aXN0aW5nX3BsdWdpbnMsCi0JCQkJCQkJCQkJCWJ1ZmZlci50b1N0cmluZygpKSk7Ci0KLQkJCWlmICgheWVzKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0KLQkJLy8gYWxsb3cgdXNlciB0byBwcm9jZWVkIHdpdGggbG9ja2VkIHBsdWdpbnMKLQkJaWYgKG1vZGlmeUluZm8ubG9ja2VkUGx1Z2lucy5zaXplKCkgPiAwKSB7Ci0JCQlTdHJpbmcgbWVzc2FnZSA9IG1vZGlmeUluZm8uZ2V0TG9ja2VkTWVzc2FnZSgpLnRvU3RyaW5nKCkKLQkJCQkJKyBJbXBvcnRSZXNvdXJjZXMuSW1wb3J0UGx1Z2luV2l6YXJkX2NvbmZpcm1fY29udGludWU7Ci0JCQlib29sZWFuIHllcyA9IEltcG9ydFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkKLQkJCQkJLmRpc3BsYXlDb25maXJtYXRpb24oCi0JCQkJCQkJSW1wb3J0UmVzb3VyY2VzLmltcG9ydFBsdWdpbnNXaXphcmRfdGl0bGUsIG1lc3NhZ2UpOwotCQkJaWYgKCF5ZXMpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQotCQkvLyBQcm9tcHQgdXNlciB0byBiYWNrIHVwIGxpYnJhcnkuCi0JCUxpYnJhcnlCYWNrdXBVdGlsLnByb21wdEJhY2t1cEN1cnJlbnRMaWJyYXJ5KG51bGwsIExpYnJhcnlTZXJ2aWNlCi0JCQkJLmdldEluc3RhbmNlKCkpOwotCQlJUnVubmFibGVXaXRoUHJvZ3Jlc3Mgb3AgPSBuZXcgSVJ1bm5hYmxlV2l0aFByb2dyZXNzKCkgewotCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLQkJCQkJdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gewotCQkJCXRyeSB7Ci0JCQkJCW1vbml0b3IuYmVnaW5UYXNrKEltcG9ydFJlc291cmNlcy5JbXBvcnRQbHVnaW5XaXphcmRfTVNHMSwKLQkJCQkJCQlJUHJvZ3Jlc3NNb25pdG9yLlVOS05PV04pOwotCi0JCQkJCS8vIFN0YXJ0IHRoZSBpbXBvcnQuCi0JCQkJCXNlcnZpY2UucGVyZm9ybUltcG9ydChtb25pdG9yKTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQl0aHJvdyBuZXcgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbihlKTsKLQkJCQl9IGZpbmFsbHkgewotCQkJCQltb25pdG9yLmRvbmUoKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0KLQkJdHJ5IHsKLQkJCWdldENvbnRhaW5lcigpLnJ1bih0cnVlLCBmYWxzZSwgb3ApOwotCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotCQkJVGhyb3dhYmxlIHJlYWxFeGNlcHRpb24gPSBlLmdldFRhcmdldEV4Y2VwdGlvbigpOwotCQkJSW1wb3J0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKS5kaXNwbGF5RXJyb3IoCi0JCQkJCUltcG9ydFJlc291cmNlcy5JbXBvcnRQbHVnaW5XaXphcmRfZXJyb3IsIAotCQkJCQlyZWFsRXhjZXB0aW9uLmdldE1lc3NhZ2UoKSk7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQl0cnkgewotCQkJY2hlY2tQbHVnaW5DaXJjdWxhckRlcGVuZGVuY3koKTsKLQkJfSBjYXRjaCAoVGhyb3dhYmxlIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQotCQkvLyBTYXZlIHRoZSBpbXBvcnQgcGF0aCB0byBwcmVmZXJlbmNlIHN0b3JlLgotCQlJbXBvcnRVSVByZWZlcmVuY2VzLmFkZEltcG9ydFBsdWdpbkRpcihkYXRhLmxsRGF0YS5nZXRQYXJlbnRGb2xkZXIoKSk7Ci0KLQkJSW1wb3J0VUlQcmVmZXJlbmNlcy5zZXRDaGVja0Jhc2VQbHVnaW5zKHNlcnZpY2UuaXNDaGVja0Jhc2VQbHVnaW5zKCkpOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgUGx1Z2luTW9kaWZ5SW5mbyBvYmplY3QuCi0JICovCi0JcHVibGljIFBsdWdpbk1vZGlmeUluZm8gY2hlY2tNb2RpZnkoKSB7Ci0JCS8vIFN0cmluZ0J1ZmZlciBlcnJvciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJUGx1Z2luTW9kaWZ5SW5mbyBtb2RpZnlJbmZvID0gbmV3IFBsdWdpbk1vZGlmeUluZm8oKTsKLQotCQlQbHVnaW5JbXBvcnREYXRhLlBsdWdpbkluZm8gaW5mbzsKLQkJZm9yIChJdGVyYXRvciBpdCA9IGRhdGEuZ2V0UGx1Z2lucygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCWluZm8gPSAoUGx1Z2luSW1wb3J0RGF0YS5QbHVnaW5JbmZvKSBpdC5uZXh0KCk7Ci0JCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gaW5mby5leGlzdGluZ1BsdWdpbjsKLQkJCWlmICgocGx1Z2luICE9IG51bGwpICYmIGluZm8uc2VsZWN0ZWQpIHsKLQkJCQlpZiAocGx1Z2luLmdldFVzZXJDaGFuZ2VhYmxlKCkuYm9vbGVhblZhbHVlKCkgPT0gZmFsc2UpIHsKLQkJCQkJLy8gVGhlIHBsdWctaW4gaXMgbG9ja2VkCi0JCQkJCW1vZGlmeUluZm8ubG9ja2VkUGx1Z2lucy5hZGQocGx1Z2luKTsKLQkJCQl9IGVsc2UgewotCQkJCQkvLyBUaGUgcGx1Zy1pbiBleGlzdHMgaW4gdGhlIGN1cnJlbnQgbGlicmFyeSwgbWFrZSBzdXJlIHRoZQotCQkJCQkvLyBwbHVnLWluIGlzIHVwZGF0YWJsZS4KLQkJCQkJSVN0YXR1cyBzdGF0dXMgPSBUbmdVdGlsLmNoZWNrRWRpdChwbHVnaW4sIGdldFNoZWxsKCkpOwotCQkJCQlpZiAoIXN0YXR1cy5pc09LKCkpIHsKLQkJCQkJCW1vZGlmeUluZm8ucmVhZG9ubHlQbHVnaW5zLmFkZChwbHVnaW4pOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIG1vZGlmeUluZm87Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNoZWNrUGx1Z2luQ2lyY3VsYXJEZXBlbmRlbmN5KCkgewotCQlQbHVnaW5EZXBlbmRlbmN5SW5mb01nciBtZ3IgPSBuZXcgUGx1Z2luRGVwZW5kZW5jeUluZm9NZ3IoCi0JCQkJTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpKTsKLQkJUGx1Z2luRGVwZW5kZW5jeUluZm9NZ3IuQ2hlY2tSZXN1bHQgcmVzdWx0ID0gbWdyCi0JCQkJLmNoZWNrQ2lyY3VsYXJEZXBlbmRuZWN5KG51bGwsIGZhbHNlKTsKLQkJaWYgKHJlc3VsdC5jaXJjdWxhckxpc3QgIT0gbnVsbCAmJiAhcmVzdWx0LmNpcmN1bGFyTGlzdC5pc0VtcHR5KCkpIHsKLQkJCUxpc3QgY2lyUGx1Z2lucyA9IChMaXN0KSByZXN1bHQuY2lyY3VsYXJMaXN0LmdldCgwKTsKLQkJCVN0cmluZyBtc2cgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaXJQbHVnaW5zLnNpemUoKTsgaSsrKSB7Ci0JCQkJUGx1Z2luRGVwSW5mbyBwaW5mbyA9IChQbHVnaW5EZXBJbmZvKSBjaXJQbHVnaW5zLmdldChpKTsKLQkJCQlpZiAoaSAhPSAwKSB7Ci0JCQkJCW1zZyArPSAiLCAiOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJCW1zZyArPSBwaW5mby5nZXRQbHVnaW4oKS5nZXROYW1lKCk7Ci0JCQl9Ci0JCQlJbXBvcnRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpLmRpc3BsYXlXYXJuaW5nKAotCQkJCQlJbXBvcnRSZXNvdXJjZXMuSW1wb3J0UGx1Z2luV2l6YXJkX3dhcm5fY2lyY3VsYXJfcGx1Z2lucywKLQkJCQkJbXNnKTsKLQkJfQotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcvd2l6YXJkcy9JbXBvcnRVSVByZWZlcmVuY2VzLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3dpemFyZHMvSW1wb3J0VUlQcmVmZXJlbmNlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMDgyOTMwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcvd2l6YXJkcy9JbXBvcnRVSVByZWZlcmVuY2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy53aXphcmRzOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpLnV0aWwuUHJlZmVyZW5jZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5GaWxlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLkltcG9ydFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5wcmVmZXJlbmNlcy5MaWJyYXJ5VUlQcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci0KLS8qKgotICogTWFuYWdlcyB0aGUgSW1wb3J0IFVJIHByZWZlcmVuY2VzLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBhdXRob3IgQmluZ3h1ZSBYdQotICogQHNpbmNlIDEuMgotICovCi1wdWJsaWMgY2xhc3MgSW1wb3J0VUlQcmVmZXJlbmNlcyB7Ci0KLQkvLyBUaGUgaW1wb3J0IHBsdWctaW4gZGlyZWN0b3JpZXMgcHJlZmVyZW5jZSBrZXkuCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElNUE9SVF9QTFVHSU5fRElSUyA9ICJpbXBvcnRQbHVnaW5EaXJzIjsgLy8kTk9OLU5MUy0xJAotCi0JLy8gVGhlIGltcG9ydCBjb25maWd1cmF0aW9uIGRpcmVjdG9yaWVzIHByZWZlcmVuY2Uga2V5LgotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJTVBPUlRfQ09ORklHX0RJUlMgPSAiaW1wb3J0Q29uZmlnRGlycyI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIFRoZSBjaGVjayBiYXNlIHBsdWctaW5zIHByZWZlcmVuY2Uga2V5Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hFQ0tfQkFTRV9QTFVHSU5TID0gImNoZWNrQmFzZVBsdWdpbnMiOyAvLyROT04tTkxTLTEkCi0KLQkvLyBUaGUgZGVmYXVsdCBpbXBvcnQgcGx1Zy1pbiBkaXJlY3RvcnkgbmFtZS4KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9JTVBPUlRfUExVR0lOX0RJUl9OQU1FID0gIkV4cG9ydCIgKyBGaWxlVXRpbC5GSUxFX1NFUCArICJQbHVnaW5zIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCSAKLQotCS8vIFRoZSBkZWZhdWx0IGltcG9ydCBjb25maWd1cmF0aW9uIGRpcmVjdG9yeSBuYW1lLgotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0lNUE9SVF9DT05GSUdfRElSX05BTUUgPSAiRXhwb3J0IiArIEZpbGVVdGlsLkZJTEVfU0VQICsgIkNvbmZpZ3VyYXRpb25zIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCSAKLQotCS8vIFRoZSBkZWZhdWx0IGltcG9ydCBwbHVnLWluIGRpcmVjdG9yeS4KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZGVmYXVsdEltcG9ydFBsdWdpbkRpciA9IG51bGw7Ci0KLQkvLyBUaGUgZGVmYXVsdCBpbXBvcnQgY29uZmlndXJhdGlvbiBkaXJlY3RvcnkuCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGRlZmF1bHRJbXBvcnRDb25maWdEaXIgPSBudWxsOwotCi0JLy8gVGhlIHBsdWctaW4gc3BlY2lmaWMgcHJlZmVyZW5jZSBzdG9yZS4KLQlwcml2YXRlIHN0YXRpYyBJUHJlZmVyZW5jZVN0b3JlIHByZWZTdG9yZSA9IEltcG9ydFBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQotCXN0YXRpYyB7Ci0JCXByZWZTdG9yZS5zZXREZWZhdWx0KElNUE9SVF9QTFVHSU5fRElSUywgZ2V0RGVmYXVsdEltcG9ydFBsdWdpbkRpcigpKTsKLQkJcHJlZlN0b3JlLnNldERlZmF1bHQoSU1QT1JUX0NPTkZJR19ESVJTLCBnZXREZWZhdWx0SW1wb3J0Q29uZmlnRGlyKCkpOwotCQlwcmVmU3RvcmUuc2V0RGVmYXVsdChDSEVDS19CQVNFX1BMVUdJTlMsIHRydWUpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGRlZmF1bHQgaW1wb3J0IHBsdWctaW4gZGlyZWN0b3J5LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGRlZmF1bHQgaW1wb3J0IHBsdWctaW4gZGlyZWN0b3J5Ci0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RGVmYXVsdEltcG9ydFBsdWdpbkRpcigpIHsKLQkJaWYgKGRlZmF1bHRJbXBvcnRQbHVnaW5EaXIgPT0gbnVsbCkgewotCQkJZGVmYXVsdEltcG9ydFBsdWdpbkRpciA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgidXNlci5ob21lIik7IC8vJE5PTi1OTFMtMSQKLQkJCVN0cmluZyBhcHBOYW1lID0gTGlicmFyeVVJUHJlZmVyZW5jZXMuZ2V0QXBwbGljYXRpb25TaG9ydE5hbWUoKTsKLQkJCWlmIChhcHBOYW1lICE9IG51bGwgJiYgYXBwTmFtZS5sZW5ndGgoKSA+IDApIHsKLQkJCQlkZWZhdWx0SW1wb3J0UGx1Z2luRGlyID0gZGVmYXVsdEltcG9ydFBsdWdpbkRpcgotCQkJCQkJKyBGaWxlVXRpbC5GSUxFX1NFUCArIGFwcE5hbWUgKyBGaWxlVXRpbC5GSUxFX1NFUAotCQkJCQkJKyBERUZBVUxUX0lNUE9SVF9QTFVHSU5fRElSX05BTUU7Ci0JCQl9IGVsc2UgewotCQkJCWRlZmF1bHRJbXBvcnRQbHVnaW5EaXIgPSBkZWZhdWx0SW1wb3J0UGx1Z2luRGlyCi0JCQkJCQkrIEZpbGVVdGlsLkZJTEVfU0VQICsgREVGQVVMVF9JTVBPUlRfUExVR0lOX0RJUl9OQU1FOwotCQkJfQotCQl9Ci0JCXJldHVybiBkZWZhdWx0SW1wb3J0UGx1Z2luRGlyOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGltcG9ydCBwbHVnLWluIGRpcmVjdG9yaWVzIHByZWZlcmVuY2UgdmFsdWUuCi0JICogCi0JICogQHJldHVybiB0aGUgcHJlZmVyZW5jZSB2YWx1ZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nW10gZ2V0SW1wb3J0UGx1Z2luRGlycygpIHsKLQkJcmV0dXJuIFByZWZlcmVuY2VVdGlsLmdldFN0cmluZ1ZhbHVlcyhwcmVmU3RvcmUsIElNUE9SVF9QTFVHSU5fRElSUyk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgaW1wb3J0IHBsdWctaW4gZGlyZWN0b3JpZXMgcHJlZmVyZW5jZSB2YWx1ZS4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgY29sbGVjdGlvbiBvZiBpbXBvcnQgcGx1Zy1pbiBkaXJlY3RvcmllcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdDxTdHJpbmc+IGdldEltcG9ydFBsdWdpbkRpcnNMaXN0KCkgewotCQlyZXR1cm4gUHJlZmVyZW5jZVV0aWwuZ2V0TGlzdChwcmVmU3RvcmUsIElNUE9SVF9QTFVHSU5fRElSUyk7Ci0JfQotCi0JLyoqCi0JICogQWRkcyBhIGltcG9ydCBkaXJlY3RvcnkgdG8gdGhlIGltcG9ydCBwbHVnLWluIGRpcmVjdG9yaWVzIHByZWZlcmVuY2UuCi0JICogCi0JICogQHBhcmFtIGRpcgotCSAqICAgICAgICAgICAgYW4gaW1wb3J0IGRpcmVjdG9yeQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBhZGRJbXBvcnRQbHVnaW5EaXIoU3RyaW5nIGRpcikgewotCQlQcmVmZXJlbmNlVXRpbC5hZGRUb0xpc3QocHJlZlN0b3JlLCBJTVBPUlRfUExVR0lOX0RJUlMsIGRpcik7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgZGVmYXVsdCBpbXBvcnQgY29uZmlndXJhdGlvbiBkaXJlY3RvcnkuCi0JICogCi0JICogQHJldHVybiB0aGUgZGVmYXVsdCBpbXBvcnQgY29uZmlndXJhdGlvbiBkaXJlY3RvcnkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXREZWZhdWx0SW1wb3J0Q29uZmlnRGlyKCkgewotCQlpZiAoZGVmYXVsdEltcG9ydENvbmZpZ0RpciA9PSBudWxsKSB7Ci0JCQlkZWZhdWx0SW1wb3J0Q29uZmlnRGlyID0gU3lzdGVtLmdldFByb3BlcnR5KCJ1c2VyLmhvbWUiKTsgLy8kTk9OLU5MUy0xJAotCQkJU3RyaW5nIGFwcE5hbWUgPSBMaWJyYXJ5VUlQcmVmZXJlbmNlcy5nZXRBcHBsaWNhdGlvblNob3J0TmFtZSgpOwotCQkJaWYgKGFwcE5hbWUgIT0gbnVsbCAmJiBhcHBOYW1lLmxlbmd0aCgpID4gMCkgewotCQkJCWRlZmF1bHRJbXBvcnRDb25maWdEaXIgPSBkZWZhdWx0SW1wb3J0Q29uZmlnRGlyCi0JCQkJCQkrIEZpbGVVdGlsLkZJTEVfU0VQICsgYXBwTmFtZSArIEZpbGVVdGlsLkZJTEVfU0VQCi0JCQkJCQkrIERFRkFVTFRfSU1QT1JUX0NPTkZJR19ESVJfTkFNRTsKLQkJCX0gZWxzZSB7Ci0JCQkJZGVmYXVsdEltcG9ydENvbmZpZ0RpciA9IGRlZmF1bHRJbXBvcnRDb25maWdEaXIKLQkJCQkJCSsgRmlsZVV0aWwuRklMRV9TRVAgKyBERUZBVUxUX0lNUE9SVF9DT05GSUdfRElSX05BTUU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGRlZmF1bHRJbXBvcnRDb25maWdEaXI7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgaW1wb3J0IGNvbmZpZ3VyYXRpb24gZGlyZWN0b3JpZXMgcHJlZmVyZW5jZSB2YWx1ZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBwcmVmZXJlbmNlIHZhbHVlCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmdbXSBnZXRJbXBvcnRDb25maWdEaXJzKCkgewotCQlyZXR1cm4gUHJlZmVyZW5jZVV0aWwuZ2V0U3RyaW5nVmFsdWVzKHByZWZTdG9yZSwgSU1QT1JUX0NPTkZJR19ESVJTKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBpbXBvcnQgY29uZmlndXJhdGlvbiBkaXJlY3RvcmllcyBwcmVmZXJlbmNlIHZhbHVlLgotCSAqIAotCSAqIEByZXR1cm4gYSBjb2xsZWN0aW9uIG9mIGltcG9ydCBjb25maWd1cmF0aW9uIGRpcmVjdG9yaWVzCi0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0PFN0cmluZz4gZ2V0SW1wb3J0Q29uZmlnRGlyc0xpc3QoKSB7Ci0JCXJldHVybiBQcmVmZXJlbmNlVXRpbC5nZXRMaXN0KHByZWZTdG9yZSwgSU1QT1JUX0NPTkZJR19ESVJTKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIGEgaW1wb3J0IGRpcmVjdG9yeSB0byB0aGUgaW1wb3J0IGNvbmZpZ3VyYXRpb24gZGlyZWN0b3JpZXMKLQkgKiBwcmVmZXJlbmNlLgotCSAqIAotCSAqIEBwYXJhbSBkaXIKLQkgKiAgICAgICAgICAgIGFuIGltcG9ydCBkaXJlY3RvcnkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgYWRkSW1wb3J0Q29uZmlnRGlyKFN0cmluZyBkaXIpIHsKLQkJUHJlZmVyZW5jZVV0aWwuYWRkVG9MaXN0KHByZWZTdG9yZSwgSU1QT1JUX0NPTkZJR19ESVJTLCBkaXIpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGNoZWNrIGJhc2UgcGx1Zy1pbnMgcHJlZmVyZW5jZSB2YWx1ZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBwcmVmZXJlbmNlIHZhbHVlCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGdldENoZWNrQmFzZVBsdWdpbnMoKSB7Ci0JCXJldHVybiBwcmVmU3RvcmUuZ2V0Qm9vbGVhbihDSEVDS19CQVNFX1BMVUdJTlMpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIG5vdENoZWNrQmFzZVBsdWdpbnMgb3B0aW9uIGZpbGUgcHJlZmVyZW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiAgICAgICAgICAgIHRoZSBwcmVmZXJlbmNlIHZhbHVlCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldENoZWNrQmFzZVBsdWdpbnMoYm9vbGVhbiB2YWx1ZSkgewotCQlwcmVmU3RvcmUuc2V0VmFsdWUoQ0hFQ0tfQkFTRV9QTFVHSU5TLCB2YWx1ZSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3dpemFyZHMvUGx1Z2luTW9kaWZ5SW5mby5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy93aXphcmRzL1BsdWdpbk1vZGlmeUluZm8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOThmMjlhNS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3dpemFyZHMvUGx1Z2luTW9kaWZ5SW5mby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy53aXphcmRzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLkltcG9ydFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi0vKioKLSAqIEhlbHBlciBjbGFzcyB0byBjb25zdHJ1Y3QgYSBtZXNzYWdlIHRoYXQgbGlzdHMgYWxsIHRoZSBsb2NrZWQgb3IgcmVhZC1vbmx5Ci0gKiBtZXRob2QgcGx1Zy1pbnMgaW4gdGhlIGN1cnJlbnQgbWV0aG9kIGxpYnJhcnkuCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFBsdWdpbk1vZGlmeUluZm8gewotCi0JcHVibGljIExpc3Q8TWV0aG9kUGx1Z2luPiBsb2NrZWRQbHVnaW5zID0gbmV3IEFycmF5TGlzdDxNZXRob2RQbHVnaW4+KCk7Ci0KLQlwdWJsaWMgTGlzdDxNZXRob2RQbHVnaW4+IHJlYWRvbmx5UGx1Z2lucyA9IG5ldyBBcnJheUxpc3Q8TWV0aG9kUGx1Z2luPigpOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgUGx1Z2luTW9kaWZ5SW5mbygpIHsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIGEgbWVzc2FnZSB0aGF0IGxpc3RzIGFsbCB0aGUgbG9ja2VkIG1ldGhvZCBwbHVnLWlucy4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgPGNvZGU+U3RyaW5nQnVmZmVyPGNvZGU+IGNvbnRhaW5pbmcgdGhlIG1lc3NhZ2UKLQkgKi8KLQlwdWJsaWMgU3RyaW5nQnVmZmVyIGdldExvY2tlZE1lc3NhZ2UoKSB7Ci0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSBsb2NrZWRQbHVnaW5zLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSAoTWV0aG9kUGx1Z2luKSBpdC5uZXh0KCk7Ci0JCQlTdHJpbmcgbXNnID0gTkxTCi0JCQkJCS5iaW5kKAotCQkJCQkJCUltcG9ydFJlc291cmNlcy5TZWxlY3RJbXBvcnRDb25maWd1cmF0aW9uU291cmNlX3BsdWdpbl9sb2NrZWQsCi0JCQkJCQkJcGx1Z2luLmdldE5hbWUoKSk7Ci0JCQlidWZmZXIuYXBwZW5kKG1zZyk7Ci0JCX0KLQotCQlyZXR1cm4gYnVmZmVyOwotCX0KLQotCS8qKgotCSAqIEdldHMgYSBtZXNzYWdlIHRoYXQgbGlzdHMgYWxsIHRoZSByZWFkLW9ubHkgbWV0aG9kIHBsdWctaW5zLgotCSAqIAotCSAqIEByZXR1cm4gYSA8Y29kZT5TdHJpbmdCdWZmZXI8Y29kZT4gY29udGFpbmluZyB0aGUgbWVzc2FnZQotCSAqLwotCXB1YmxpYyBTdHJpbmdCdWZmZXIgZ2V0UmVhZG9ubHlNZXNzYWdlKCkgewotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gcmVhZG9ubHlQbHVnaW5zLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSAoTWV0aG9kUGx1Z2luKSBpdC5uZXh0KCk7Ci0JCQlTdHJpbmcgbXNnID0gTkxTCi0JCQkJCS5iaW5kKAotCQkJCQkJCUltcG9ydFJlc291cmNlcy5TZWxlY3RJbXBvcnRDb25maWd1cmF0aW9uU291cmNlX3BsdWdpbl9yZWFkb25seSwKLQkJCQkJCQlwbHVnaW4uZ2V0TmFtZSgpKTsKLQkJCWJ1ZmZlci5hcHBlbmQobXNnKTsKLQkJfQotCi0JCXJldHVybiBidWZmZXI7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3dpemFyZHMvU2VsZWN0Q29uZmlnU3BlY3NUb0ltcG9ydFBhZ2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcvd2l6YXJkcy9TZWxlY3RDb25maWdTcGVjc1RvSW1wb3J0UGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MTM4MmExLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcvd2l6YXJkcy9TZWxlY3RDb25maWdTcGVjc1RvSW1wb3J0UGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjk4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcud2l6YXJkczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy5JbXBvcnRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy5JbXBvcnRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy5zZXJ2aWNlcy5Db25maWdTcGVjczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLnNlcnZpY2VzLkNvbmZpZ3VyYXRpb25JbXBvcnREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLkxpYnJhcnlVSUltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudWkud2l6YXJkcy5CYXNlV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkFycmF5Q29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2hlY2tTdGF0ZUNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNoZWNrYm94VGFibGVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ2hlY2tTdGF0ZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotCi0vKioKLSAqIEEgd2l6YXJkIHBhZ2UgdGhhdCBwcm9tcHRzIHRoZSB1c2VyIHRvIHNlbGVjdCB0aGUgY29uZmlndXJhdGlvbgotICogc3BlY2lmaWNhaXRvbnMgdG8gaW1wb3J0LgotICogCi0gKiBAYXV0aG9yIEplZmYgSGFyZHkKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgU2VsZWN0Q29uZmlnU3BlY3NUb0ltcG9ydFBhZ2UgZXh0ZW5kcyBCYXNlV2l6YXJkUGFnZSBpbXBsZW1lbnRzCi0JCUlTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIsIElDaGVja1N0YXRlTGlzdGVuZXIgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFHRV9OQU1FID0gU2VsZWN0Q29uZmlnU3BlY3NUb0ltcG9ydFBhZ2UuY2xhc3MKLQkJCS5nZXROYW1lKCk7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgbGlicmFyeUNvbmZpZ1NwZWNFeGlzdHMgPSBJbXBvcnRSZXNvdXJjZXMuU2VsZWN0Q29uZmlnU3BlY3NUb0ltcG9ydFBhZ2VfbGlicmFyeUNvbmZpZ1NwZWNFeGlzdHM7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgbGlicmFyeUNvbmZpZ1NwZWNOb3RFeGlzdHMgPSBJbXBvcnRSZXNvdXJjZXMuU2VsZWN0Q29uZmlnU3BlY3NUb0ltcG9ydFBhZ2VfbGlicmFyeUNvbmZpZ1NwZWNOb3RFeGlzdHM7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29uZmlnU3BlY05vU2VsZWN0aW9uID0gSW1wb3J0UmVzb3VyY2VzLlNlbGVjdENvbmZpZ1NwZWNzVG9JbXBvcnRQYWdlX2NvbmZpZ1NwZWNOb1NlbGVjdGlvbjsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBjb25maWdTcGVjRGF0YUxhYmVsID0gSW1wb3J0UmVzb3VyY2VzLlNlbGVjdENvbmZpZ1NwZWNzVG9JbXBvcnRQYWdlX2NvbmZpZ1NwZWNEYXRhTGFiZWw7Ci0KLQlwcml2YXRlIENoZWNrYm94VGFibGVWaWV3ZXIgY3RybF9jaGtib3hUYWJsZVZpZXdlcjsKLQotCS8vIDIgY29udHJvbHMgZm9yIGRpc3BsYXlpbmcgY29uZmlnc3BlYyBpbmZvIGZvciBwbHVnaW5zIGluIGltcG9ydCBkaXJlY3RvcnkKLQlwcml2YXRlIFRleHQgY3RybF9icmllZkRlc2NJbXBvcnQ7Ci0KLQlwcml2YXRlIExhYmVsIGltcG9ydENvbmZpZ1NwZWNMYWJlbDsKLQotCS8vIDIgY29udHJvbHMgZm9yIGRpc3BsYXlpbmcgY29uZmlnc3BlYyBpbmZvIGZvciBwbHVnaW5zIGluIHRoZSBsaWJyYXJ5Ci0JcHJpdmF0ZSBUZXh0IGN0cmxfYnJpZWZEZXNjTGlicmFyeTsKLQotCXByaXZhdGUgTGFiZWwgbGlicmFyeUNvbmZpZ1NwZWNMYWJlbDsKLQotCXByaXZhdGUgQ29tcG9zaXRlIGNvbnRhaW5lcjsKLQotCXByaXZhdGUgQ29uZmlndXJhdGlvbkltcG9ydERhdGEgZGF0YTsKLQkKLQlwcml2YXRlIEJ1dHRvbiBzZWxlY3RBbGxCdXR0b247Ci0JCi0JcHJpdmF0ZSBCdXR0b24gZGVzZWxlY3RBbGxCdXR0b247Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBTZWxlY3RDb25maWdTcGVjc1RvSW1wb3J0UGFnZShDb25maWd1cmF0aW9uSW1wb3J0RGF0YSBkYXRhKSB7Ci0JCXN1cGVyKFBBR0VfTkFNRSk7Ci0JCXNldFRpdGxlKEltcG9ydFJlc291cmNlcy5zZWxlY3RDb25maWdTcGVjc1dpemFyZFBhZ2VfdGl0bGUpOwotCQlzZXREZXNjcmlwdGlvbihJbXBvcnRSZXNvdXJjZXMuc2VsZWN0Q29uZmlnU3BlY3NXaXphcmRQYWdlX3RleHQpOwotCQlzZXRJbWFnZURlc2NyaXB0b3IoSW1wb3J0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoCi0JCQkJImZ1bGwvd2l6YmFuL2ltcF9saWJfY29uZl93aXpiYW4uZ2lmIikpOyAvLyROT04tTkxTLTEkCi0JCXRoaXMuZGF0YSA9IGRhdGE7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dQYWdlI2NyZWF0ZUNvbnRyb2woQ29tcG9zaXRlKQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCQljb250YWluZXIgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQljb250YWluZXIuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDIsIHRydWUpKTsKLQotCQlDb21wb3NpdGUgdGFibGVDb250YWluZXIgPSBuZXcgQ29tcG9zaXRlKGNvbnRhaW5lciwgU1dULk5PTkUpOwotCQl0YWJsZUNvbnRhaW5lci5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJdGFibGVDb250YWluZXIuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCQotCQlDb21wb3NpdGUgY29udGFpbmVyMSA9IG5ldyBDb21wb3NpdGUodGFibGVDb250YWluZXIsIFNXVC5OT05FKTsKLQkJY29udGFpbmVyMS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMywgZmFsc2UpKTsKLQkJLy9jcmVhdGVMYWJlbChjb250YWluZXIxLAotCQkvLwkJSW1wb3J0UmVzb3VyY2VzLlNlbGVjdENvbmZpZ1NwZWNzVG9JbXBvcnRQYWdlX2xhYmVsX2NvbmZpZ3MsIDIpOwotCQljcmVhdGVMYWJlbChjb250YWluZXIxLAotCQkJCUltcG9ydFJlc291cmNlcy5TZWxlY3RDb25maWdTcGVjc1RvSW1wb3J0UGFnZV9sYWJlbF9jb25maWdzKTsKLQotCQlzZWxlY3RBbGxCdXR0b24gPSBjcmVhdGVCdXR0b24oCi0JCQkJY29udGFpbmVyMSwKLQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5BdXRob3JpbmdVSVBsdWdpbl9TYXZlQWxsRWRpdG9yc1BhZ2VfU2VsZWN0QWxsQnV0dG9uTGFiZWwpOwotCQlkZXNlbGVjdEFsbEJ1dHRvbiA9IGNyZWF0ZUJ1dHRvbigKLQkJCQljb250YWluZXIxLAotCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLkF1dGhvcmluZ1VJUGx1Z2luX1NhdmVBbGxFZGl0b3JzUGFnZV9EZXNlbGVjdEFsbEJ1dHRvbkxhYmVsKTsKLQotCQkKLQkJY3RybF9jaGtib3hUYWJsZVZpZXdlciA9IGNyZWF0ZUNoZWNrYm94VGFibGVWaWV3ZXIodGFibGVDb250YWluZXIsIDEpOwotCi0JCUlMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIgPSBuZXcgTGFiZWxQcm92aWRlcigpIHsKLQkJCXB1YmxpYyBJbWFnZSBnZXRJbWFnZShPYmplY3QgZWxlbWVudCkgewotCQkJCXJldHVybiBMaWJyYXJ5VUlJbWFnZXMuSU1HX01FVEhPRF9DT05GSUdVUkFUT047Ci0JCQl9Ci0KLQkJCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgewotCQkJCXJldHVybiBzdXBlci5nZXRUZXh0KGVsZW1lbnQpOwotCQkJfQotCQl9OwotCi0JCWN0cmxfY2hrYm94VGFibGVWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihsYWJlbFByb3ZpZGVyKTsKLQkJY3RybF9jaGtib3hUYWJsZVZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIobmV3IEFycmF5Q29udGVudFByb3ZpZGVyKCkpOwotCi0JCUNvbXBvc2l0ZSBpbXBvcnRDb250YWluZXIgPSBuZXcgQ29tcG9zaXRlKGNvbnRhaW5lciwgU1dULk5PTkUpOwotCQlpbXBvcnRDb250YWluZXIuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQlpbXBvcnRDb250YWluZXIuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLQkJY3JlYXRlSW1wb3J0Q29uZmlnU3BlY0luZm8oaW1wb3J0Q29udGFpbmVyKTsKLQotCQlDb21wb3NpdGUgbGlicmFyeUNvbnRhaW5lciA9IG5ldyBDb21wb3NpdGUoY29udGFpbmVyLCBTV1QuTk9ORSk7Ci0JCWxpYnJhcnlDb250YWluZXIuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQlsaWJyYXJ5Q29udGFpbmVyLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCi0JCWNyZWF0ZUxpYnJhcnlDb25maWdTcGVjSW5mbyhsaWJyYXJ5Q29udGFpbmVyKTsKLQotCQlhZGRMaXN0ZW5lcnMoKTsKLQotCQlzZXRDb250cm9sKGNvbnRhaW5lcik7Ci0JCXNldFBhZ2VDb21wbGV0ZShmYWxzZSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUltcG9ydENvbmZpZ1NwZWNJbmZvKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJaW1wb3J0Q29uZmlnU3BlY0xhYmVsID0gY3JlYXRlTGFiZWwoY29udGFpbmVyLCBjb25maWdTcGVjTm9TZWxlY3Rpb24sIDEpOwotCQljcmVhdGVMaW5lKGNvbnRhaW5lciwgMSk7Ci0KLQkJY3JlYXRlTGFiZWwoY29udGFpbmVyLAotCQkJCUltcG9ydFJlc291cmNlcy5TZWxlY3RDb25maWdTcGVjc1RvSW1wb3J0UGFnZV9sYWJlbF9kZXNjLCAxKTsKLQkJY3RybF9icmllZkRlc2NJbXBvcnQgPSBjcmVhdGVNdWx0aUxpbmVUZXh0KGNvbnRhaW5lciwgIiIsIDI3NSwgMTAwLCAxKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVMaWJyYXJ5Q29uZmlnU3BlY0luZm8oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQlsaWJyYXJ5Q29uZmlnU3BlY0xhYmVsID0gY3JlYXRlTGFiZWwoY29udGFpbmVyLCBjb25maWdTcGVjTm9TZWxlY3Rpb24sCi0JCQkJMSk7Ci0JCWNyZWF0ZUxpbmUoY29udGFpbmVyLCAxKTsKLQotCQljcmVhdGVMYWJlbChjb250YWluZXIsCi0JCQkJSW1wb3J0UmVzb3VyY2VzLlNlbGVjdENvbmZpZ1NwZWNzVG9JbXBvcnRQYWdlX2xhYmVsX2Rlc2MsIDEpOwotCQljdHJsX2JyaWVmRGVzY0xpYnJhcnkgPSBjcmVhdGVNdWx0aUxpbmVUZXh0KGNvbnRhaW5lciwgIiIsIDI3NSwgMTAwLCAxKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByaXZhdGUgdm9pZCBhZGRMaXN0ZW5lcnMoKSB7Ci0JCWN0cmxfY2hrYm94VGFibGVWaWV3ZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKHRoaXMpOwotCQljdHJsX2Noa2JveFRhYmxlVmlld2VyLmFkZENoZWNrU3RhdGVMaXN0ZW5lcih0aGlzKTsKLQkJCi0JCXNlbGVjdEFsbEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJY3RybF9jaGtib3hUYWJsZVZpZXdlci5zZXRBbGxDaGVja2VkKHRydWUpOwotCQkJCXNldFBhZ2VDb21wbGV0ZShpc1BhZ2VDb21wbGV0ZSgpKTsKLQkJCQlnZXRXaXphcmQoKS5nZXRDb250YWluZXIoKS51cGRhdGVCdXR0b25zKCk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJd2lkZ2V0U2VsZWN0ZWQoZSk7Ci0JCQl9Ci0KLQkJfSk7Ci0KLQkJZGVzZWxlY3RBbGxCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWN0cmxfY2hrYm94VGFibGVWaWV3ZXIuc2V0QWxsQ2hlY2tlZChmYWxzZSk7Ci0JCQkJc2V0UGFnZUNvbXBsZXRlKGlzUGFnZUNvbXBsZXRlKCkpOwotCQkJCWdldFdpemFyZCgpLmdldENvbnRhaW5lcigpLnVwZGF0ZUJ1dHRvbnMoKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQl3aWRnZXRTZWxlY3RlZChlKTsKLQkJCX0KLQotCQl9KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNoZWNrU3RhdGVMaXN0ZW5lciNjaGVja1N0YXRlQ2hhbmdlZChvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNoZWNrU3RhdGVDaGFuZ2VkRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgY2hlY2tTdGF0ZUNoYW5nZWQoQ2hlY2tTdGF0ZUNoYW5nZWRFdmVudCBldmVudCkgewotCQlzZXRQYWdlQ29tcGxldGUoaXNQYWdlQ29tcGxldGUoKSk7Ci0JCWdldFdpemFyZCgpLmdldENvbnRhaW5lcigpLnVwZGF0ZUJ1dHRvbnMoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciNzZWxlY3Rpb25DaGFuZ2VkKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKFN0cnVjdHVyZWRTZWxlY3Rpb24pIGV2ZW50Ci0JCQkJLmdldFNlbGVjdGlvbigpOwotCQlpZiAoIXNlbGVjdGlvbi5pc0VtcHR5KCkpIHsKLQkJCU9iamVjdFtdIGNvbmZpZ3MgPSBzZWxlY3Rpb24udG9BcnJheSgpOwotCQkJc2V0RGlzcGxheUF0dHJpYnV0ZXMoKENvbmZpZ1NwZWNzLkVudHJ5KSBjb25maWdzWzBdKTsKLQkJfSBlbHNlIHsKLQkJCWNsZWFyRGlzcGxheUF0dHJpYnV0ZXMoKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBzZXREaXNwbGF5QXR0cmlidXRlcyhDb25maWdTcGVjcy5FbnRyeSBzcGVjKSB7Ci0JCWN0cmxfYnJpZWZEZXNjSW1wb3J0Ci0JCQkJLnNldFRleHQoc3BlYy5jb25maWdTcGVjLmJyaWVmX2Rlc2MgPT0gbnVsbCA/ICIiIDogc3BlYy5jb25maWdTcGVjLmJyaWVmX2Rlc2MpOyAvLyROT04tTkxTLTEkCi0JCWltcG9ydENvbmZpZ1NwZWNMYWJlbC5zZXRUZXh0KGNvbmZpZ1NwZWNEYXRhTGFiZWwpOwotCi0JCWlmIChzcGVjLmV4aXN0aW5nQ29uZmlnICE9IG51bGwpIHsKLQkJCWN0cmxfYnJpZWZEZXNjTGlicmFyeS5zZXRUZXh0KHNwZWMuZXhpc3RpbmdDb25maWcKLQkJCQkJLmdldEJyaWVmRGVzY3JpcHRpb24oKSk7Ci0JCQlsaWJyYXJ5Q29uZmlnU3BlY0xhYmVsLnNldFRleHQobGlicmFyeUNvbmZpZ1NwZWNFeGlzdHMpOwotCQl9IGVsc2UgewotCQkJbGlicmFyeUNvbmZpZ1NwZWNMYWJlbC5zZXRUZXh0KGxpYnJhcnlDb25maWdTcGVjTm90RXhpc3RzKTsKLQkJCWN0cmxfYnJpZWZEZXNjTGlicmFyeS5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNsZWFyRGlzcGxheUF0dHJpYnV0ZXMoKSB7Ci0JCWN0cmxfYnJpZWZEZXNjSW1wb3J0LnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0JCWN0cmxfYnJpZWZEZXNjTGlicmFyeS5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotCQlsaWJyYXJ5Q29uZmlnU3BlY0xhYmVsLnNldFRleHQoY29uZmlnU3BlY05vU2VsZWN0aW9uKTsKLQkJaW1wb3J0Q29uZmlnU3BlY0xhYmVsLnNldFRleHQoY29uZmlnU3BlY05vU2VsZWN0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlI2lzQ29tcGxldGVkKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1BhZ2VDb21wbGV0ZSgpIHsKLQkJaWYgKGdldEVycm9yTWVzc2FnZSgpICE9IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJaWYgKGN0cmxfY2hrYm94VGFibGVWaWV3ZXIuZ2V0Q2hlY2tlZEVsZW1lbnRzKCkubGVuZ3RoID4gMCkgewotCQkJLy8gU2V0IGRhdGEuc3BlY3MuY29uZmlncyBsaXN0LCBmaXggdGhlIHNlbGVjdGVkIGZpZWxkIG9mIGVhY2gKLQkJCS8vIGVudHJ5LgotCQkJSXRlcmF0b3IgaXRlciA9IGRhdGEuc3BlY3MuY29uZmlncy5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQkJQ29uZmlnU3BlY3MuRW50cnkgZSA9IChDb25maWdTcGVjcy5FbnRyeSkgaXRlci5uZXh0KCk7Ci0JCQkJaWYgKGN0cmxfY2hrYm94VGFibGVWaWV3ZXIuZ2V0Q2hlY2tlZChlKSkKLQkJCQkJZS5zZWxlY3RlZCA9IHRydWU7Ci0JCQkJZWxzZQotCQkJCQllLnNlbGVjdGVkID0gZmFsc2U7Ci0JCQl9Ci0JCQkoKEltcG9ydENvbmZpZ3VyYXRpb25XaXphcmQpIGdldFdpemFyZCgpKS5va1RvQ29tcGxldGUgPSB0cnVlOwotCQl9IGVsc2UgewotCQkJKChJbXBvcnRDb25maWd1cmF0aW9uV2l6YXJkKSBnZXRXaXphcmQoKSkub2tUb0NvbXBsZXRlID0gZmFsc2U7Ci0JCX0KLQotCQkvLyBBbHdheXMgcmV0dXJuIGZhbHNlIHNvIHRoYXQgdGhlICJOZXh0IiBidXR0b24gaXMgbmV2ZXIgZW5hYmxlZC4KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2UjY2FuRmxpcFRvTmV4dFBhZ2UoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGNhbkZsaXBUb05leHRQYWdlKCkgewotCQlyZXR1cm4gaXNQYWdlQ29tcGxldGUoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51aS53aXphcmRzLkJhc2VXaXphcmRQYWdlI29uRW50ZXJQYWdlKE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBvbkVudGVyUGFnZShPYmplY3Qgb2JqKSB7Ci0JCWN0cmxfY2hrYm94VGFibGVWaWV3ZXIuc2V0SW5wdXQoZGF0YS5zcGVjcy5jb25maWdzKTsKLQkJaWYgKGRhdGEuc3BlY3MuY29uZmlncy5zaXplKCkgPiAwKSB7Ci0JCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWwgPSBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbigKLQkJCQkJZGF0YS5zcGVjcy5jb25maWdzLmdldCgwKSk7Ci0JCQljdHJsX2Noa2JveFRhYmxlVmlld2VyLnNldFNlbGVjdGlvbihzZWwpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3dpemFyZHMvU2VsZWN0Q29uZmlnc1RvSW1wb3J0LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3dpemFyZHMvU2VsZWN0Q29uZmlnc1RvSW1wb3J0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkNWVjOWIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy93aXphcmRzL1NlbGVjdENvbmZpZ3NUb0ltcG9ydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy53aXphcmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy5JbXBvcnRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy5JbXBvcnRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy5zZXJ2aWNlcy5Db25maWd1cmF0aW9uSW1wb3J0U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudWkud2l6YXJkcy5CYXNlV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBBIHdpemFyZCBwYWdlIHRoYXQgZGlzcGxheXMgdGhlIGxpYnJhcnkgY29uZmlndXJhdGlvbiBlbGVtZW50cyB0aGF0IHdpbGwgYmUKLSAqIGltcG9ydGVkLgotICogCi0gKiBAYXV0aG9yIEplZmYgSGFyZHkKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgU2VsZWN0Q29uZmlnc1RvSW1wb3J0IGV4dGVuZHMgQmFzZVdpemFyZFBhZ2UgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFHRV9OQU1FID0gU2VsZWN0Q29uZmlnc1RvSW1wb3J0LmNsYXNzCi0JCQkuZ2V0TmFtZSgpOwotCi0JcHJpdmF0ZSBDb25maWd1cmF0aW9uSW1wb3J0U2VydmljZSBzZXJ2aWNlOwotCi0JcHJpdmF0ZSBDb21wb3NpdGUgY29udGFpbmVyOwotCi0JcHJpdmF0ZSBEaWZmUmVwb3J0Vmlld2VyIGRpZmY7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBTZWxlY3RDb25maWdzVG9JbXBvcnQoQ29uZmlndXJhdGlvbkltcG9ydFNlcnZpY2Ugc2VydmljZSkgewotCQlzdXBlcihQQUdFX05BTUUpOwotCQlzZXRUaXRsZShJbXBvcnRSZXNvdXJjZXMucmV2aWV3Q2hhbmdlc1dpemFyZFBhZ2VfdGl0bGUpOwotCQlzZXREZXNjcmlwdGlvbihJbXBvcnRSZXNvdXJjZXMucmV2aWV3Q2hhbmdlc1dpemFyZFBhZ2VfdGV4dCk7Ci0JCXNldEltYWdlRGVzY3JpcHRvcihJbXBvcnRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcigKLQkJCQkiZnVsbC93aXpiYW4vaW1wX2xpYl9jb25mX3dpemJhbi5naWYiKSk7IC8vJE5PTi1OTFMtMSQJCQotCQl0aGlzLnNlcnZpY2UgPSBzZXJ2aWNlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nUGFnZSNjcmVhdGVDb250cm9sKENvbXBvc2l0ZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJY29udGFpbmVyID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJY29udGFpbmVyLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQljb250YWluZXIuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDEsIGZhbHNlKSk7Ci0KLQkJY3JlYXRlTGFiZWwoY29udGFpbmVyLCBJbXBvcnRSZXNvdXJjZXMuU2VsZWN0Q29uZmlnc1RvSW1wb3J0X2xhYmVsMSwgMSk7Ci0JCWRpZmYgPSBuZXcgRGlmZlJlcG9ydFZpZXdlcihjb250YWluZXIsIHNlcnZpY2UuZ2V0SW1wb3J0RGF0YSgpKTsKLQotCQlzZXRDb250cm9sKGNvbnRhaW5lcik7Ci0JCXNldFBhZ2VDb21wbGV0ZShmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkUGFnZSNpc0NvbXBsZXRlZCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNQYWdlQ29tcGxldGUoKSB7Ci0JCSgoSW1wb3J0Q29uZmlndXJhdGlvbldpemFyZCkgZ2V0V2l6YXJkKCkpLm9rVG9Db21wbGV0ZSA9IHRydWU7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51aS53aXphcmRzLkJhc2VXaXphcmRQYWdlI29uRW50ZXJQYWdlKE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBvbkVudGVyUGFnZShPYmplY3Qgb2JqKSB7Ci0JCWRpZmYuc2hvd1JlcG9ydChzZXJ2aWNlLmdldERpZmZUcmVlKCkpOwotCQkoKEltcG9ydENvbmZpZ3VyYXRpb25XaXphcmQpIGdldFdpemFyZCgpKS5va1RvQ29tcGxldGUgPSB0cnVlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy93aXphcmRzL1NlbGVjdEltcG9ydENvbmZpZ3VyYXRpb25Tb3VyY2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcvd2l6YXJkcy9TZWxlY3RJbXBvcnRDb25maWd1cmF0aW9uU291cmNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0MzFmNzEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy93aXphcmRzL1NlbGVjdEltcG9ydENvbmZpZ3VyYXRpb25Tb3VyY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLndpemFyZHM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQud2l6YXJkcy5EZXN0aW5hdGlvbkNvbW1vblBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy5JbXBvcnRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy5JbXBvcnRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy5zZXJ2aWNlcy5Db25maWd1cmF0aW9uSW1wb3J0RGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLnNlcnZpY2VzLkNvbmZpZ3VyYXRpb25JbXBvcnRTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLkxpYnJhcnlVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLkxpYnJhcnlVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51aS53aXphcmRzLkJhc2VXaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVXaXRoUHJvZ3Jlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotCi0vKioKLSAqIEEgd2l6YXJkIHBhZ2UgdGhhdCBwcm9tcHRzIHRoZSB1c2VyIHRvIHNlbGVjdCBhIGRpcmVjdG9yeSB0aGF0IGNvbnRhaW5zIHRoZQotICogY29uZmlndXJhdGlvbnMgdG8gaW1wb3J0LgotICogCi0gKiBAYXV0aG9yIEplZmYgSGFyZHkKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgU2VsZWN0SW1wb3J0Q29uZmlndXJhdGlvblNvdXJjZSBleHRlbmRzIERlc3RpbmF0aW9uQ29tbW9uUGFnZSB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQUdFX05BTUUgPSBTZWxlY3RJbXBvcnRDb25maWd1cmF0aW9uU291cmNlLmNsYXNzCi0JCQkuZ2V0TmFtZSgpOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RhdHVzIG9rU3RhdHVzID0gbmV3IFN0YXR1cyhJU3RhdHVzLk9LLAotCQkJSW1wb3J0UmVzb3VyY2VzLlNlbGVjdEltcG9ydENvbmZpZ3VyYXRpb25Tb3VyY2Vfbm90X3VzZWQsIDAsCi0JCQkiIiwgbnVsbCk7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgQ29uZmlndXJhdGlvbkltcG9ydERhdGEgZGF0YTsKLQotCXByaXZhdGUgQ29uZmlndXJhdGlvbkltcG9ydFNlcnZpY2Ugc2VydmljZTsKLQotCXByaXZhdGUgU3RhdHVzIHN0YXR1cyA9IG9rU3RhdHVzOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgU2VsZWN0SW1wb3J0Q29uZmlndXJhdGlvblNvdXJjZShDb25maWd1cmF0aW9uSW1wb3J0RGF0YSBkYXRhLAotCQkJQ29uZmlndXJhdGlvbkltcG9ydFNlcnZpY2Ugc2VydmljZSkgewotCQlzdXBlcihQQUdFX05BTUUsIGRhdGEubGxEYXRhKTsKLQkJc2V0VGl0bGUoSW1wb3J0UmVzb3VyY2VzLnNlbGVjdENvbmZpZ0RpcldpemFyZFBhZ2VfdGl0bGUpOwotCQlzZXREZXNjcmlwdGlvbihJbXBvcnRSZXNvdXJjZXMuc2VsZWN0Q29uZmlnRGlyV2l6YXJkUGFnZV90ZXh0KTsKLQkJc2V0SW1hZ2VEZXNjcmlwdG9yKEltcG9ydFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKAotCQkJCSJmdWxsL3dpemJhbi9pbXBfbGliX2NvbmZfd2l6YmFuLmdpZiIpKTsgLy8kTk9OLU5MUy0xJAkJCi0JCXRoaXMuc2VydmljZSA9IHNlcnZpY2U7Ci0JCXRoaXMuZGF0YSA9IGRhdGE7Ci0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZXMgdGhlIHdpemFyZCBwYWdlIGNvbnRyb2xzIHdpdGggZGF0YS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0Q29udHJvbHMoKSB7Ci0JCVN0cmluZ1tdIGV4cG9ydERpcnMgPSBJbXBvcnRVSVByZWZlcmVuY2VzLmdldEltcG9ydENvbmZpZ0RpcnMoKTsKLQkJaWYgKGV4cG9ydERpcnMgIT0gbnVsbCAmJiBleHBvcnREaXJzLmxlbmd0aCA+IDApIHsKLQkJCWV4cG9ydFBhdGhDb21iby5zZXRJdGVtcyhleHBvcnREaXJzKTsKLQkJCWV4cG9ydFBhdGhDb21iby5zZXRUZXh0KGV4cG9ydERpcnNbMF0pOwotCQl9Ci0JCXN1cGVyLmluaXRDb250cm9scygpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2UjaXNDb21wbGV0ZWQoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUGFnZUNvbXBsZXRlKCkgewotCQlpZiAoTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpID09IG51bGwpIHsKLQkJCXNldEVycm9yTWVzc2FnZShMaWJyYXJ5VUlSZXNvdXJjZXMubm9PcGVuTGlicmFyeVdhcm5pbmdfbXNnKTsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlib29sZWFuIHJldHVyblZhbHVlID0gZmFsc2U7Ci0JCXN0YXR1cyA9IG9rU3RhdHVzOwotCQlpZiAoZXhwb3J0UGF0aENvbWJvLmdldFRleHQoKS5sZW5ndGgoKSA+IDApIHsKLQkJCXNhdmVUb0RhdGFNb2RlbCgpOwotCQkJRmlsZSBsaWJEaXIgPSBuZXcgRmlsZShleHBvcnRQYXRoQ29tYm8uZ2V0VGV4dCgpKTsKLQkJCWlmICghbGliRGlyLmV4aXN0cygpKSB7Ci0JCQkJc3RhdHVzID0gbmV3IFN0YXR1cygKLQkJCQkJCUlTdGF0dXMuRVJST1IsCi0JCQkJCQlJbXBvcnRSZXNvdXJjZXMuU2VsZWN0SW1wb3J0Q29uZmlndXJhdGlvblNvdXJjZV9ub3RfdXNlZCwKLQkJCQkJCTAsCi0JCQkJCQlJbXBvcnRSZXNvdXJjZXMuU2VsZWN0SW1wb3J0Q29uZmlndXJhdGlvblNvdXJjZV9ub19wYXRoLAotCQkJCQkJbnVsbCk7Ci0JCQl9IGVsc2UgewotCQkJCXJldHVyblZhbHVlID0gdHJ1ZTsKLQkJCX0KLQkJfQotCQlhcHBseVRvU3RhdHVzTGluZSgpOwotCQlyZXR1cm4gcmV0dXJuVmFsdWU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkUGFnZSNnZXROZXh0UGFnZSgpCi0JICovCi0JcHVibGljIElXaXphcmRQYWdlIGdldE5leHRQYWdlKCkgewotCQlzYXZlVG9EYXRhTW9kZWwoKTsKLQkJSVJ1bm5hYmxlV2l0aFByb2dyZXNzIG9wZXJhdGlvbiA9IG5ldyBJUnVubmFibGVXaXRoUHJvZ3Jlc3MoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQotCQkJCQl0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQkJCW1vbml0b3IuYmVnaW5UYXNrKAotCQkJCQkJSW1wb3J0UmVzb3VyY2VzLlNlbGVjdEltcG9ydENvbmZpZ3VyYXRpb25Tb3VyY2VfTVNHMSwKLQkJCQkJCUlQcm9ncmVzc01vbml0b3IuVU5LTk9XTik7Ci0JCQkJc2VydmljZS5hbmFseXplKG1vbml0b3IpOwotCQkJCW1vbml0b3IuZG9uZSgpOwotCQkJfQotCQl9OwotCQl0cnkgewotCQkJLy8gVGhpcyBydW5zIHRoZSBvcHRpb25zLCBhbmQgc2hvd3MgcHJvZ3Jlc3MuCi0JCQlnZXRXaXphcmQoKS5nZXRDb250YWluZXIoKS5ydW4odHJ1ZSwgZmFsc2UsIG9wZXJhdGlvbik7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLQkJCS8vIFNvbWV0aGluZyB3ZW50IHdyb25nIHRoYXQgc2hvdWxkbid0LgotCQkJZXhjZXB0aW9uLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0KLQkJU3RyaW5nIGVycm9yID0gZGF0YS5nZXRFcnJvckluZm8oKS5nZXRFcnJvcigpOwotCQlpZiAoZXJyb3IgIT0gbnVsbCAmJiBlcnJvci5sZW5ndGgoKSA+IDApIHsKLQkJCXN0YXR1cyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwKLQkJCQkJSW1wb3J0UmVzb3VyY2VzLlNlbGVjdEltcG9ydENvbmZpZ3VyYXRpb25Tb3VyY2Vfbm90X3VzZWQsCi0JCQkJCTAsIGVycm9yLCBudWxsKTsKLQkJCWFwcGx5VG9TdGF0dXNMaW5lKCk7Ci0JCQlyZXR1cm4gdGhpczsKLQkJfQotCQlCYXNlV2l6YXJkUGFnZSBwYWdlID0gbnVsbDsKLQkJaWYgKGRhdGEuc3BlY3MgIT0gbnVsbCkKLQkJCXBhZ2UgPSAoKEltcG9ydENvbmZpZ3VyYXRpb25XaXphcmQpIGdldFdpemFyZCgpKS5zcGVjc1BhZ2U7Ci0JCWVsc2UgewotCQkJUGx1Z2luTW9kaWZ5SW5mbyBtb2RpZnlJbmZvID0gY2hlY2tNb2RpZnkoKTsKLQotCQkJLy8gaWYgb25seSBsb2NrZWQsIHdlIGNhbiBhdXRvLXVubG9jayBhbmQgcmVsb2NrIHRoZSBwbHVnaW5zCi0JCQkvLyBpZiB0aGUgcGx1aW4gaXMgcmVhZG9ubHksIHVzZXIgbmVlZCB0byBtYW51YWxseSBtYWtlIGl0IHVwZGF0YWJsZQotCQkJLy8gY3VzdG9tZXJzIG5lZWQgdG8gbWFudWFsbHkgdW5sb2NrIGFuZCBsb2NrIHBsdWdpbnMgZHVyaW5nIGNvbnRlbnQKLQkJCS8vIGxpYnJhcnkgdXBncmFkZQotCi0JCQlpZiAobW9kaWZ5SW5mby5yZWFkb25seVBsdWdpbnMuc2l6ZSgpID4gMCkgewotCi0JCQkJZXJyb3IgPSBtb2RpZnlJbmZvLmdldFJlYWRvbmx5TWVzc2FnZSgpLnRvU3RyaW5nKCk7Ci0KLQkJCQkvLyBzaG93IGVycm9yIG1lc3NhZ2UgYm94Ci0JCQkJSW1wb3J0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKS5kaXNwbGF5RXJyb3IoCi0JCQkJCQlJbXBvcnRSZXNvdXJjZXMuSW1wb3J0Q29uZmlndXJhdGlvbldpemFyZF9lcnJvciwgZXJyb3IpOwotCi0JCQkJc3RhdHVzID0gbmV3IFN0YXR1cygKLQkJCQkJCUlTdGF0dXMuRVJST1IsCi0JCQkJCQlJbXBvcnRSZXNvdXJjZXMuU2VsZWN0SW1wb3J0Q29uZmlndXJhdGlvblNvdXJjZV9ub3RfdXNlZCwKLQkJCQkJCTAsCi0JCQkJCQlJbXBvcnRSZXNvdXJjZXMuU2VsZWN0SW1wb3J0Q29uZmlndXJhdGlvblNvdXJjZV9lcnJvcl9ub3RfdXBkYXRhYmxlLAotCQkJCQkJbnVsbCk7Ci0JCQkJYXBwbHlUb1N0YXR1c0xpbmUoKTsKLQkJCQlyZXR1cm4gdGhpczsKLQkJCX0KLQotCQkJLy8gYWxsb3cgdXNlciB0byBwcm9jZWVkIHdpdGggbG9ja2VkIHBsdWdpbnMKLQkJCWlmIChtb2RpZnlJbmZvLmxvY2tlZFBsdWdpbnMuc2l6ZSgpID4gMCkgewotCQkJCVN0cmluZyBXSVpBUkRfVElUTEUgPSBJbXBvcnRSZXNvdXJjZXMuaW1wb3J0Q29uZmlnV2l6YXJkX3RpdGxlOwotCQkJCVN0cmluZyBtZXNzYWdlID0gbW9kaWZ5SW5mby5nZXRMb2NrZWRNZXNzYWdlKCkudG9TdHJpbmcoKQotCQkJCQkJKyBJbXBvcnRSZXNvdXJjZXMuSW1wb3J0UGx1Z2luV2l6YXJkX2NvbmZpcm1fY29udGludWU7Ci0JCQkJYm9vbGVhbiB5ZXMgPSBJbXBvcnRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpCi0JCQkJCQkuZGlzcGxheUNvbmZpcm1hdGlvbihXSVpBUkRfVElUTEUsIG1lc3NhZ2UpOwotCQkJCWlmICgheWVzKSB7Ci0JCQkJCXN0YXR1cyA9IG5ldyBTdGF0dXMoCi0JCQkJCQkJSVN0YXR1cy5FUlJPUiwKLQkJCQkJCQlJbXBvcnRSZXNvdXJjZXMuU2VsZWN0SW1wb3J0Q29uZmlndXJhdGlvblNvdXJjZV9ub3RfdXNlZCwKLQkJCQkJCQkwLAotCQkJCQkJCUltcG9ydFJlc291cmNlcy5TZWxlY3RJbXBvcnRDb25maWd1cmF0aW9uU291cmNlX2Vycm9yX25vdF91cGRhdGFibGUsCi0JCQkJCQkJbnVsbCk7Ci0JCQkJCWFwcGx5VG9TdGF0dXNMaW5lKCk7Ci0JCQkJCXJldHVybiB0aGlzOwotCQkJCX0KLQkJCX0KLQkJCXBhZ2UgPSAoKEltcG9ydENvbmZpZ3VyYXRpb25XaXphcmQpIGdldFdpemFyZCgpKS5jb25maWdQYWdlOwotCQl9Ci0JCXBhZ2Uub25FbnRlclBhZ2UobnVsbCk7Ci0JCXJldHVybiBwYWdlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSBQbHVnaW5Nb2RpZnlJbmZvIG9iamVjdC4KLQkgKi8KLQlwdWJsaWMgUGx1Z2luTW9kaWZ5SW5mbyBjaGVja01vZGlmeSgpIHsKLQkJcmV0dXJuIGNoZWNrTW9kaWZ5KExpYnJhcnlVdGlsLmdldE1ldGhvZFBsdWdpbkd1aWRzKHNlcnZpY2UKLQkJCQkuZ2V0SW1wb3J0aW5nTGlicmFyeSgpKSwgZ2V0U2hlbGwoKSwgdHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIFBsdWdpbk1vZGlmeUluZm8gb2JqZWN0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgUGx1Z2luTW9kaWZ5SW5mbyBjaGVja01vZGlmeShMaXN0IGd1aWRzLCBTaGVsbCBzaGVsbCwKLQkJCWJvb2xlYW4gY2hlY2tFZGl0KSB7Ci0JCVBsdWdpbk1vZGlmeUluZm8gbW9kaWZ5SW5mbyA9IG5ldyBQbHVnaW5Nb2RpZnlJbmZvKCk7Ci0JCS8vIFN0cmluZ0J1ZmZlciBlcnJvciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJLy8gTGlzdCBndWlkcyA9IExpYnJhcnlVdGlsLmdldE1ldGhvZFBsdWdpbkd1aWRzKHNlcnZpY2UKLQkJLy8gLmdldEltcG9ydGluZ0xpYnJhcnkoKSk7Ci0KLQkJTGlzdCBwbHVnaW5zID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpCi0JCQkJLmdldE1ldGhvZFBsdWdpbnMoKTsKLQkJZm9yIChJdGVyYXRvciBpdCA9IHBsdWdpbnMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IChNZXRob2RQbHVnaW4pIGl0Lm5leHQoKTsKLQkJCWlmIChndWlkcy5jb250YWlucyhwbHVnaW4uZ2V0R3VpZCgpKSkgewotCQkJCWlmIChwbHVnaW4uZ2V0VXNlckNoYW5nZWFibGUoKS5ib29sZWFuVmFsdWUoKSA9PSBmYWxzZSkgewotCQkJCQkvLyBwbHVnaW4gaXMgbG9ja2VkCi0JCQkJCW1vZGlmeUluZm8ubG9ja2VkUGx1Z2lucy5hZGQocGx1Z2luKTsKLQkJCQl9IGVsc2UgaWYgKGNoZWNrRWRpdCkgewotCQkJCQkvLyBwbHVnaW4gZXhpc3RzIGluIHRoZSBjdXJyZW50IGxpYnJhcnksIG1ha2Ugc3VyZSB0aGUKLQkJCQkJLy8gcGx1Z2luIGlzIHVwZGF0YWJsZQotCQkJCQkvLyBJU3RhdHVzIHN0YXR1cyA9IFRuZ1V0aWwuY2hlY2tFZGl0KHBsdWdpbiwgZ2V0U2hlbGwoKSk7Ci0JCQkJCUlTdGF0dXMgc3RhdHVzID0gVG5nVXRpbC5jaGVja0VkaXQocGx1Z2luLCBzaGVsbCk7Ci0JCQkJCWlmICghc3RhdHVzLmlzT0soKSkgewotCQkJCQkJbW9kaWZ5SW5mby5yZWFkb25seVBsdWdpbnMuYWRkKHBsdWdpbik7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gbW9kaWZ5SW5mbzsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlI2NhbkZsaXBUb05leHRQYWdlKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjYW5GbGlwVG9OZXh0UGFnZSgpIHsKLQkJcmV0dXJuIGlzUGFnZUNvbXBsZXRlKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFwcGx5VG9TdGF0dXNMaW5lKCkgewotCQlpZiAoc3RhdHVzICE9IG9rU3RhdHVzKQotCQkJc2V0RXJyb3JNZXNzYWdlKHN0YXR1cy5nZXRNZXNzYWdlKCkpOwotCQllbHNlIHsKLQkJCXNldEVycm9yTWVzc2FnZShudWxsKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy93aXphcmRzL1NlbGVjdEltcG9ydFBsdWdpblNvdXJjZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy93aXphcmRzL1NlbGVjdEltcG9ydFBsdWdpblNvdXJjZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyM2JhMzc0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcvd2l6YXJkcy9TZWxlY3RJbXBvcnRQbHVnaW5Tb3VyY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLndpemFyZHM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQud2l6YXJkcy5EZXN0aW5hdGlvbkNvbW1vblBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy5JbXBvcnRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy5JbXBvcnRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy5zZXJ2aWNlcy5QbHVnaW5JbXBvcnREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcuc2VydmljZXMuUGx1Z2luSW1wb3J0aW5nU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5MaWJyYXJ5VUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Hcm91cDsKLQotLyoqCi0gKiBBIHdpemFyZCBwYWdlIHRoYXQgcHJvbXB0cyB0aGUgdXNlciB0byBzZWxlY3QgYSBkaXJlY3RvcnkgdGhhdCBjb250YWlucyB0aGUKLSAqIG1ldGhvZCBwbHVnLWlucyB0byBpbXBvcnQuCi0gKiAKLSAqIEBhdXRob3IgSmVmZiBIYXJkeQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBTZWxlY3RJbXBvcnRQbHVnaW5Tb3VyY2UgZXh0ZW5kcyBEZXN0aW5hdGlvbkNvbW1vblBhZ2UgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFHRV9OQU1FID0gU2VsZWN0SW1wb3J0UGx1Z2luU291cmNlLmNsYXNzCi0JCQkuZ2V0TmFtZSgpOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RhdHVzIE9LX1NUQVRVUyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5PSywKLQkJCUltcG9ydFJlc291cmNlcy5TZWxlY3RJbXBvcnRQbHVnaW5Tb3VyY2Vfbm90X3VzZWQsIDAsICIiLCBudWxsKTsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBQbHVnaW5JbXBvcnREYXRhIGRhdGE7Ci0KLQlwcml2YXRlIFBsdWdpbkltcG9ydGluZ1NlcnZpY2Ugc2VydmljZTsKLQotCXByaXZhdGUgU3RhdHVzIHN0YXR1cyA9IE9LX1NUQVRVUzsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFNlbGVjdEltcG9ydFBsdWdpblNvdXJjZShQbHVnaW5JbXBvcnREYXRhIGRhdGEsCi0JCQlQbHVnaW5JbXBvcnRpbmdTZXJ2aWNlIHNlcnZpY2UpIHsKLQkJc3VwZXIoUEFHRV9OQU1FLCBkYXRhLmxsRGF0YSk7Ci0JCXNldFRpdGxlKEltcG9ydFJlc291cmNlcy5zZWxlY3RQbHVnaW5zRGlyV2l6YXJkUGFnZV90aXRsZSk7Ci0JCXNldERlc2NyaXB0aW9uKEltcG9ydFJlc291cmNlcy5zZWxlY3RQbHVnaW5zRGlyV2l6YXJkUGFnZV90ZXh0KTsKLQkJc2V0SW1hZ2VEZXNjcmlwdG9yKEltcG9ydFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKAotCQkJCSJmdWxsL3dpemJhbi9pbXBfbWV0aF9wbHVnaW5fd2l6YmFuLmdpZiIpKTsgLy8kTk9OLU5MUy0xJAotCQl0aGlzLnNlcnZpY2UgPSBzZXJ2aWNlOwotCQl0aGlzLmRhdGEgPSBkYXRhOwotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemVzIHRoZSB3aXphcmQgcGFnZSBjb250cm9scyB3aXRoIGRhdGEuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdENvbnRyb2xzKCkgewotCQlTdHJpbmdbXSBleHBvcnREaXJzID0gSW1wb3J0VUlQcmVmZXJlbmNlcy5nZXRJbXBvcnRQbHVnaW5EaXJzKCk7Ci0JCWlmIChleHBvcnREaXJzICE9IG51bGwgJiYgZXhwb3J0RGlycy5sZW5ndGggPiAwKSB7Ci0JCQlleHBvcnRQYXRoQ29tYm8uc2V0SXRlbXMoZXhwb3J0RGlycyk7Ci0JCQlleHBvcnRQYXRoQ29tYm8uc2V0VGV4dChleHBvcnREaXJzWzBdKTsKLQkJfQotCQlzdXBlci5pbml0Q29udHJvbHMoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlI2lzQ29tcGxldGVkKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1BhZ2VDb21wbGV0ZSgpIHsKLQkJaWYgKExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKSA9PSBudWxsKSB7Ci0JCQlzZXRFcnJvck1lc3NhZ2UoTGlicmFyeVVJUmVzb3VyY2VzLm5vT3BlbkxpYnJhcnlXYXJuaW5nX21zZyk7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJYm9vbGVhbiByZXR1cm5WYWx1ZSA9IGZhbHNlOwotCQlzdGF0dXMgPSBPS19TVEFUVVM7Ci0JCWlmIChleHBvcnRQYXRoQ29tYm8uZ2V0VGV4dCgpLmxlbmd0aCgpID4gMCkgewotCQkJc2F2ZVRvRGF0YU1vZGVsKCk7Ci0JCQlGaWxlIGxpYkRpciA9IG5ldyBGaWxlKGV4cG9ydFBhdGhDb21iby5nZXRUZXh0KCkpOwotCQkJaWYgKCFsaWJEaXIuZXhpc3RzKCkpIHsKLQkJCQlzdGF0dXMgPSBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsCi0JCQkJCQlJbXBvcnRSZXNvdXJjZXMuU2VsZWN0SW1wb3J0UGx1Z2luU291cmNlX25vdF91c2VkLCAwLAotCQkJCQkJSW1wb3J0UmVzb3VyY2VzLlNlbGVjdEltcG9ydFBsdWdpblNvdXJjZV9ub19wYXRoLCBudWxsKTsKLQkJCX0gZWxzZSB7Ci0JCQkJcmV0dXJuVmFsdWUgPSB0cnVlOwotCQkJfQotCQl9Ci0JCWFwcGx5VG9TdGF0dXNMaW5lKCk7Ci0JCXJldHVybiByZXR1cm5WYWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlI2dldE5leHRQYWdlKCkKLQkgKi8KLQlwdWJsaWMgSVdpemFyZFBhZ2UgZ2V0TmV4dFBhZ2UoKSB7Ci0JCXNhdmVUb0RhdGFNb2RlbCgpOwotCi0JCS8vIFZhbGlkYXRlIGZpcnN0IGJlZm9yZSBnb2luZyB0byB0aGUgbmV4dCBwYWdlLgotCQlzZXJ2aWNlLnZhbGlkYXRlKG51bGwpOwotCQlTdHJpbmcgZXJyb3IgPSBkYXRhLmdldEVycm9ySW5mbygpLmdldEVycm9yKCk7Ci0JCWlmIChlcnJvciAhPSBudWxsICYmIGVycm9yLmxlbmd0aCgpID4gMCkgewotCQkJc3VwZXIuc2V0RXJyb3JNZXNzYWdlKGVycm9yKTsKLQkJCXJldHVybiB0aGlzOwotCQl9IGVsc2UgewotCQkJU2VsZWN0UGx1Z2luc1RvSW1wb3J0IHBhZ2UgPSAoKEltcG9ydFBsdWdpbldpemFyZCkgZ2V0V2l6YXJkKCkpLnBhZ2UyOwotCQkJcGFnZS5vbkVudGVyUGFnZShudWxsKTsKLQkJCXJldHVybiBwYWdlOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkUGFnZSNjYW5GbGlwVG9OZXh0UGFnZSgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2FuRmxpcFRvTmV4dFBhZ2UoKSB7Ci0JCXJldHVybiBpc1BhZ2VDb21wbGV0ZSgpOwotCX0KLQotCXByaXZhdGUgdm9pZCBhcHBseVRvU3RhdHVzTGluZSgpIHsKLQkJaWYgKHN0YXR1cyAhPSBPS19TVEFUVVMpCi0JCQlzZXRFcnJvck1lc3NhZ2Uoc3RhdHVzLmdldE1lc3NhZ2UoKSk7Ci0JCWVsc2UgewotCQkJc2V0RXJyb3JNZXNzYWdlKG51bGwpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQWRkaXRpb25hbENvbnRyb2xzKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQkJR3JvdXAgb3B0aW9uR3JvdXAgPSBuZXcgR3JvdXAoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCW9wdGlvbkdyb3VwLnNldExheW91dChuZXcgR3JpZExheW91dCgxLCBmYWxzZSkpOwotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDM7Ci0JCW9wdGlvbkdyb3VwLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQlvcHRpb25Hcm91cC5zZXRUZXh0KEltcG9ydFJlc291cmNlcy5vcHRpb25Hcm91cF90ZXh0KTsKLQotCQlib29sZWFuIGNoZWNrQmFzZVBsdWdpbnMgPSBJbXBvcnRVSVByZWZlcmVuY2VzLmdldENoZWNrQmFzZVBsdWdpbnMoKTsKLQkJc2V0Q2hlY2tCYXNlUGx1Z2lucyhjaGVja0Jhc2VQbHVnaW5zKTsKLQotCQlCdXR0b24gY2hlY2tCYXNlUmFkaW9CdXR0b24gPSBjcmVhdGVSYWRpb0J1dHRvbihvcHRpb25Hcm91cCwKLQkJCQlJbXBvcnRSZXNvdXJjZXMuY2hlY2tCYXNlUmFkaW9CdXR0b25fdGV4dCwgMSwgY2hlY2tCYXNlUGx1Z2lucyk7Ci0JCWNoZWNrQmFzZVJhZGlvQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCXNldENoZWNrQmFzZVBsdWdpbnModHJ1ZSk7Ci0JCQl9Ci0JCX0pOwotCi0JCUJ1dHRvbiBpZ25vcmVSZW1vdmVSYWRpb0J1dHRvbiA9IGNyZWF0ZVJhZGlvQnV0dG9uKG9wdGlvbkdyb3VwLAotCQkJCUltcG9ydFJlc291cmNlcy5pZ25vcmVSZW1vdmVSYWRpb0J1dHRvbl90ZXh0LCAxLAotCQkJCSFjaGVja0Jhc2VQbHVnaW5zKTsKLQkJaWdub3JlUmVtb3ZlUmFkaW9CdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJc2V0Q2hlY2tCYXNlUGx1Z2lucyhmYWxzZSk7Ci0JCQl9Ci0JCX0pOwotCi0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldENoZWNrQmFzZVBsdWdpbnMoYm9vbGVhbiBjaGVja0Jhc2VQbHVnaW5zKSB7Ci0JCXNlcnZpY2Uuc2V0Q2hlY2tCYXNlUGx1Z2lucyhjaGVja0Jhc2VQbHVnaW5zKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcvd2l6YXJkcy9TZWxlY3RQbHVnaW5zVG9JbXBvcnQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcvd2l6YXJkcy9TZWxlY3RQbHVnaW5zVG9JbXBvcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDJhMjU4OC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3dpemFyZHMvU2VsZWN0UGx1Z2luc1RvSW1wb3J0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNzMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy53aXphcmRzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy5JbXBvcnRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy5JbXBvcnRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy5zZXJ2aWNlcy5QbHVnaW5JbXBvcnREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcuc2VydmljZXMuUGx1Z2luSW1wb3J0aW5nU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLnNlcnZpY2VzLlBsdWdpbkltcG9ydERhdGEuUGx1Z2luSW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5MaWJyYXJ5VUlJbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVpLndpemFyZHMuQmFzZVdpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5BcnJheUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNoZWNrU3RhdGVDaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DaGVja2JveFRhYmxlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNoZWNrU3RhdGVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci0KLS8qKgotICogQSB3aXphcmQgcGFnZSB0aGF0IHByb21wdHMgdGhlIHVzZXIgdG8gdGhlIG1ldGhvZCBwbHVnLWlucyB0byBpbXBvcnQuCi0gKiAKLSAqIEBhdXRob3IgSmVmZiBIYXJkeQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBTZWxlY3RQbHVnaW5zVG9JbXBvcnQgZXh0ZW5kcyBCYXNlV2l6YXJkUGFnZSBpbXBsZW1lbnRzCi0JCUlTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIsIElDaGVja1N0YXRlTGlzdGVuZXIsIExpc3RlbmVyIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBR0VfTkFNRSA9IFNlbGVjdFBsdWdpbnNUb0ltcG9ydC5jbGFzcwotCQkJLmdldE5hbWUoKTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBsaWJyYXJ5UGx1Z2luRXhpc3RzID0gSW1wb3J0UmVzb3VyY2VzLlNlbGVjdFBsdWdpbnNUb0ltcG9ydF9saWJyYXJ5UGx1Z2luRXhpc3RzOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIGxpYnJhcnlQbHVnaW5Ob3RFeGlzdHMgPSBJbXBvcnRSZXNvdXJjZXMuU2VsZWN0UGx1Z2luc1RvSW1wb3J0X2xpYnJhcnlQbHVnaW5Ob3RFeGlzdHM7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgcGx1Z2luTm9TZWxlY3Rpb24gPSBJbXBvcnRSZXNvdXJjZXMuU2VsZWN0UGx1Z2luc1RvSW1wb3J0X3BsdWdpbk5vU2VsZWN0aW9uOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIHBsdWdpbkRhdGFMYWJlbCA9IEltcG9ydFJlc291cmNlcy5TZWxlY3RQbHVnaW5zVG9JbXBvcnRfcGx1Z2luRGF0YUxhYmVsOwotCi0JcHJpdmF0ZSBDaGVja2JveFRhYmxlVmlld2VyIGN0cmxfY2hrYm94VGFibGVWaWV3ZXI7Ci0KLQlwcml2YXRlIFRleHQgY3RybF9hdXRob3JJbXBvcnQ7Ci0KLQlwcml2YXRlIFRleHQgY3RybF92ZXJzaW9uSW1wb3J0OwotCi0JcHJpdmF0ZSBUZXh0IGN0cmxfYnJpZWZEZXNjSW1wb3J0OwotCi0JcHJpdmF0ZSBMYWJlbCBpbXBvcnRQbHVnaW5MYWJlbDsKLQotCXByaXZhdGUgVGV4dCBjdHJsX2F1dGhvckxpYnJhcnk7Ci0KLQlwcml2YXRlIFRleHQgY3RybF92ZXJzaW9uTGlicmFyeTsKLQotCXByaXZhdGUgVGV4dCBjdHJsX2JyaWVmRGVzY0xpYnJhcnk7Ci0KLQlwcml2YXRlIExhYmVsIGxpYnJhcnlQbHVnaW5MYWJlbDsKLQotCXByaXZhdGUgQ29tcG9zaXRlIGNvbnRhaW5lcjsKLQotCXByaXZhdGUgaW50IGNoZWNrZWRDb3VudCA9IDA7Ci0KLQlwcml2YXRlIExpc3QgY2hlY2tlZFBsdWdpbkxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQlwcml2YXRlIFBsdWdpbkltcG9ydERhdGEgZGF0YTsKLQotCXByaXZhdGUgUGx1Z2luSW1wb3J0aW5nU2VydmljZSBzZXJ2aWNlOwotCQotCXByaXZhdGUgQnV0dG9uIHNlbGVjdEFsbEJ1dHRvbjsKLQkKLQlwcml2YXRlIEJ1dHRvbiBkZXNlbGVjdEFsbEJ1dHRvbjsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFNlbGVjdFBsdWdpbnNUb0ltcG9ydChQbHVnaW5JbXBvcnREYXRhIGRhdGEsCi0JCQlQbHVnaW5JbXBvcnRpbmdTZXJ2aWNlIHNlcnZpY2UpIHsKLQkJc3VwZXIoUEFHRV9OQU1FKTsKLQkJc2V0VGl0bGUoSW1wb3J0UmVzb3VyY2VzLnNlbGVjdFBsdWdpbnNXaXphcmRQYWdlX3RpdGxlKTsKLQkJc2V0RGVzY3JpcHRpb24oSW1wb3J0UmVzb3VyY2VzLnNlbGVjdFBsdWdpbnNXaXphcmRQYWdlX3RleHQpOwotCQlzZXRJbWFnZURlc2NyaXB0b3IoSW1wb3J0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoCi0JCQkJImZ1bGwvd2l6YmFuL2ltcF9tZXRoX3BsdWdpbl93aXpiYW4uZ2lmIikpOyAvLyROT04tTkxTLTEkCQkKLQkJdGhpcy5zZXJ2aWNlID0gc2VydmljZTsKLQkJdGhpcy5kYXRhID0gZGF0YTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ1BhZ2UjY3JlYXRlQ29udHJvbChDb21wb3NpdGUpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCWNvbnRhaW5lciA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCWNvbnRhaW5lci5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMiwgdHJ1ZSkpOwotCi0JCUNvbXBvc2l0ZSB0YWJsZUNvbnRhaW5lciA9IG5ldyBDb21wb3NpdGUoY29udGFpbmVyLCBTV1QuTk9ORSk7Ci0JCXRhYmxlQ29udGFpbmVyLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQl0YWJsZUNvbnRhaW5lci5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotCQlDb21wb3NpdGUgY29udGFpbmVyMSA9IG5ldyBDb21wb3NpdGUodGFibGVDb250YWluZXIsIFNXVC5OT05FKTsKLQkJY29udGFpbmVyMS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMywgZmFsc2UpKTsKLQkJY3JlYXRlTGFiZWwoY29udGFpbmVyMSwKLQkJCQlJbXBvcnRSZXNvdXJjZXMuU2VsZWN0UGx1Z2luc1RvSW1wb3J0X2xhYmVsX3BsdWdpbnMpOwotCi0JCXNlbGVjdEFsbEJ1dHRvbiA9IGNyZWF0ZUJ1dHRvbigKLQkJCQljb250YWluZXIxLAotCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLkF1dGhvcmluZ1VJUGx1Z2luX1NhdmVBbGxFZGl0b3JzUGFnZV9TZWxlY3RBbGxCdXR0b25MYWJlbCk7Ci0JCWRlc2VsZWN0QWxsQnV0dG9uID0gY3JlYXRlQnV0dG9uKAotCQkJCWNvbnRhaW5lcjEsCi0JCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuQXV0aG9yaW5nVUlQbHVnaW5fU2F2ZUFsbEVkaXRvcnNQYWdlX0Rlc2VsZWN0QWxsQnV0dG9uTGFiZWwpOwotCQkJCQotCQljdHJsX2Noa2JveFRhYmxlVmlld2VyID0gY3JlYXRlQ2hlY2tib3hUYWJsZVZpZXdlcih0YWJsZUNvbnRhaW5lciwgMik7Ci0KLQkJSUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlciA9IG5ldyBMYWJlbFByb3ZpZGVyKCkgewotCQkJcHVibGljIEltYWdlIGdldEltYWdlKE9iamVjdCBlbGVtZW50KSB7Ci0JCQkJcmV0dXJuIExpYnJhcnlVSUltYWdlcy5JTUdfTUVUSE9EX1BMVUdJTjsKLQkJCX0KLQotCQkJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7Ci0JCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pIHsKLQkJCQkJcmV0dXJuICgoTWV0aG9kUGx1Z2luKSBlbGVtZW50KS5nZXROYW1lKCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJcmV0dXJuIGVsZW1lbnQudG9TdHJpbmcoKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JCWN0cmxfY2hrYm94VGFibGVWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihsYWJlbFByb3ZpZGVyKTsKLQkJY3RybF9jaGtib3hUYWJsZVZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIobmV3IEFycmF5Q29udGVudFByb3ZpZGVyKCkpOwotCi0JCUNvbXBvc2l0ZSBpbXBvcnRDb250YWluZXIgPSBuZXcgQ29tcG9zaXRlKGNvbnRhaW5lciwgU1dULk5PTkUpOwotCQlpbXBvcnRDb250YWluZXIuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCi0JCWNyZWF0ZUltcG9ydFBsdWdpbkluZm8oaW1wb3J0Q29udGFpbmVyKTsKLQotCQlDb21wb3NpdGUgbGlicmFyeUNvbnRhaW5lciA9IG5ldyBDb21wb3NpdGUoY29udGFpbmVyLCBTV1QuTk9ORSk7Ci0JCWxpYnJhcnlDb250YWluZXIuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCi0JCWNyZWF0ZUxpYnJhcnlQbHVnaW5JbmZvKGxpYnJhcnlDb250YWluZXIpOwotCi0JCWFkZExpc3RlbmVycygpOwotCi0JCXNldENvbnRyb2woY29udGFpbmVyKTsKLQkJc2V0UGFnZUNvbXBsZXRlKGZhbHNlKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlSW1wb3J0UGx1Z2luSW5mbyhDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCWltcG9ydFBsdWdpbkxhYmVsID0gY3JlYXRlTGFiZWwoY29udGFpbmVyLCBwbHVnaW5Ob1NlbGVjdGlvbiwgMSk7Ci0JCWNyZWF0ZUxpbmUoY29udGFpbmVyLCAxKTsKLQotCQljcmVhdGVMYWJlbChjb250YWluZXIsCi0JCQkJSW1wb3J0UmVzb3VyY2VzLlNlbGVjdFBsdWdpbnNUb0ltcG9ydF9sYWJlbF9hdXRob3IsIDEpOwotCQljdHJsX2F1dGhvckltcG9ydCA9IGNyZWF0ZU11bHRpTGluZVRleHQoY29udGFpbmVyLCAiIiwgMjc1LCA0MCwgMSk7IC8vJE5PTi1OTFMtMSQKLQotCQljcmVhdGVMYWJlbChjb250YWluZXIsCi0JCQkJSW1wb3J0UmVzb3VyY2VzLlNlbGVjdFBsdWdpbnNUb0ltcG9ydF9sYWJlbF92ZXJzaW9uLCAxKTsKLQkJY3RybF92ZXJzaW9uSW1wb3J0ID0gY3JlYXRlVGV4dChjb250YWluZXIsICIiLCAyNzUsIDEpOyAvLyROT04tTkxTLTEkCi0KLQkJY3JlYXRlTGFiZWwoY29udGFpbmVyLAotCQkJCUltcG9ydFJlc291cmNlcy5TZWxlY3RQbHVnaW5zVG9JbXBvcnRfbGFiZWxfZGVzYywgMSk7Ci0JCWN0cmxfYnJpZWZEZXNjSW1wb3J0ID0gY3JlYXRlTXVsdGlMaW5lVGV4dChjb250YWluZXIsICIiLCAyNzUsIDEwMCwgMSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlTGlicmFyeVBsdWdpbkluZm8oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQlsaWJyYXJ5UGx1Z2luTGFiZWwgPSBjcmVhdGVMYWJlbChjb250YWluZXIsIHBsdWdpbk5vU2VsZWN0aW9uLCAxKTsKLQkJY3JlYXRlTGluZShjb250YWluZXIsIDEpOwotCi0JCWNyZWF0ZUxhYmVsKGNvbnRhaW5lciwKLQkJCQlJbXBvcnRSZXNvdXJjZXMuU2VsZWN0UGx1Z2luc1RvSW1wb3J0X2xhYmVsX2F1dGhvciwgMSk7Ci0JCWN0cmxfYXV0aG9yTGlicmFyeSA9IGNyZWF0ZU11bHRpTGluZVRleHQoY29udGFpbmVyLCAiIiwgMjc1LCA0MCwgMSk7IC8vJE5PTi1OTFMtMSQKLQotCQljcmVhdGVMYWJlbChjb250YWluZXIsCi0JCQkJSW1wb3J0UmVzb3VyY2VzLlNlbGVjdFBsdWdpbnNUb0ltcG9ydF9sYWJlbF92ZXJzaW9uLCAxKTsKLQkJY3RybF92ZXJzaW9uTGlicmFyeSA9IGNyZWF0ZVRleHQoY29udGFpbmVyLCAiIiwgMjc1LCAxKTsgLy8kTk9OLU5MUy0xJAotCi0JCWNyZWF0ZUxhYmVsKGNvbnRhaW5lciwKLQkJCQlJbXBvcnRSZXNvdXJjZXMuU2VsZWN0UGx1Z2luc1RvSW1wb3J0X2xhYmVsX2Rlc2MsIDEpOwotCQljdHJsX2JyaWVmRGVzY0xpYnJhcnkgPSBjcmVhdGVNdWx0aUxpbmVUZXh0KGNvbnRhaW5lciwgIiIsIDI3NSwgMTAwLCAxKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByaXZhdGUgdm9pZCBhZGRMaXN0ZW5lcnMoKSB7Ci0JCWN0cmxfY2hrYm94VGFibGVWaWV3ZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKHRoaXMpOwotCQljdHJsX2Noa2JveFRhYmxlVmlld2VyLmFkZENoZWNrU3RhdGVMaXN0ZW5lcih0aGlzKTsKLQkJCi0JCXNlbGVjdEFsbEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJY3RybF9jaGtib3hUYWJsZVZpZXdlci5zZXRBbGxDaGVja2VkKHRydWUpOwotCQkJCUltcG9ydFBsdWdpbldpemFyZCB3aXphcmQgPSAoSW1wb3J0UGx1Z2luV2l6YXJkKSBnZXRXaXphcmQoKTsKLQkJCQlpZiAoISB3aXphcmQuZGF0YS5nZXRQbHVnaW5zKCkuaXNFbXB0eSgpKSB7Ci0JCQkJCWNoZWNrZWRQbHVnaW5MaXN0LmNsZWFyKCk7Ci0JCQkJCWNoZWNrZWRQbHVnaW5MaXN0LmFkZEFsbCh3aXphcmQuZGF0YS5nZXRQbHVnaW5zKCkpOwotCQkJCQljaGVja2VkQ291bnQgPSBjaGVja2VkUGx1Z2luTGlzdC5zaXplKCk7Ci0JCQkJCXNldEFsbFNlbGVjdGVkKHdpemFyZC5kYXRhLCB0cnVlKTsKLQkJCQkJU3RyaW5nIG1lc3NhZ2UgPSBzZXJ2aWNlLnZhbGlkYXRlU2VsZWN0aW9uKCk7Ci0JCQkJCWlmIChtZXNzYWdlICE9IG51bGwgJiYgbWVzc2FnZS5sZW5ndGgoKSA+IDApIHsKLQkJCQkJCXNldEVycm9yTWVzc2FnZShtZXNzYWdlKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCXNldEVycm9yTWVzc2FnZShudWxsKTsKLQkJCQkJfQotCQkJCX0KLQkJCQkKLQkJCQlzZXRQYWdlQ29tcGxldGUoaXNQYWdlQ29tcGxldGUoKSk7Ci0JCQkJZ2V0V2l6YXJkKCkuZ2V0Q29udGFpbmVyKCkudXBkYXRlQnV0dG9ucygpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCXdpZGdldFNlbGVjdGVkKGUpOwotCQkJfQotCi0JCX0pOwotCi0JCWRlc2VsZWN0QWxsQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQljdHJsX2Noa2JveFRhYmxlVmlld2VyLnNldEFsbENoZWNrZWQoZmFsc2UpOwotCQkJCWNoZWNrZWRQbHVnaW5MaXN0LmNsZWFyKCk7Ci0JCQkJY2hlY2tlZENvdW50ID0gMDsKLQkJCQlJbXBvcnRQbHVnaW5XaXphcmQgd2l6YXJkID0gKEltcG9ydFBsdWdpbldpemFyZCkgZ2V0V2l6YXJkKCk7Ci0JCQkJc2V0QWxsU2VsZWN0ZWQod2l6YXJkLmRhdGEsIGZhbHNlKTsKLQkJCQkKLQkJCQlzZXRQYWdlQ29tcGxldGUoaXNQYWdlQ29tcGxldGUoKSk7Ci0JCQkJZ2V0V2l6YXJkKCkuZ2V0Q29udGFpbmVyKCkudXBkYXRlQnV0dG9ucygpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCXdpZGdldFNlbGVjdGVkKGUpOwotCQkJfQotCi0JCX0pOwotCQkKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHNldEFsbFNlbGVjdGVkKFBsdWdpbkltcG9ydERhdGEgZGF0YSwgYm9vbGVhbiBzZWxlY3RlZCkgewotCQlmb3IgKFBsdWdpbkltcG9ydERhdGEuUGx1Z2luSW5mbyBpbmZvOiBkYXRhLmdldFBsdWdpbnMoKSkgewotCQkJaW5mby5zZWxlY3RlZCA9IHNlbGVjdGVkOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDaGVja1N0YXRlTGlzdGVuZXIjY2hlY2tTdGF0ZUNoYW5nZWQob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DaGVja1N0YXRlQ2hhbmdlZEV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGNoZWNrU3RhdGVDaGFuZ2VkKENoZWNrU3RhdGVDaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJT2JqZWN0IG9iaiA9IGV2ZW50LmdldEVsZW1lbnQoKTsKLQotCQkvLyBTZXQgdGhlIGZsYWcgdG8gaW1wb3J0IHRoZSBzZWxlY3RlZCBwbHVnLWlucy4KLQkJaWYgKG9iaiBpbnN0YW5jZW9mIFBsdWdpbkltcG9ydERhdGEuUGx1Z2luSW5mbykgewotCQkJKChQbHVnaW5JbXBvcnREYXRhLlBsdWdpbkluZm8pIG9iaikuc2VsZWN0ZWQgPSBldmVudC5nZXRDaGVja2VkKCk7Ci0JCX0KLQkJU3RyaW5nIG1lc3NhZ2UgPSBzZXJ2aWNlLnZhbGlkYXRlU2VsZWN0aW9uKCk7Ci0JCWlmIChtZXNzYWdlICE9IG51bGwgJiYgbWVzc2FnZS5sZW5ndGgoKSA+IDApIHsKLQkJCXN1cGVyLnNldEVycm9yTWVzc2FnZShtZXNzYWdlKTsKLQkJfSBlbHNlIHsKLQkJCXN1cGVyLnNldEVycm9yTWVzc2FnZShudWxsKTsKLQkJfQotCi0JCWlmIChldmVudC5nZXRDaGVja2VkKCkpIHsKLQkJCWNoZWNrZWRDb3VudCsrOwotCQkJY2hlY2tlZFBsdWdpbkxpc3QuYWRkKG9iaik7Ci0JCX0gZWxzZSB7Ci0JCQljaGVja2VkQ291bnQtLTsKLQkJCWNoZWNrZWRQbHVnaW5MaXN0LnJlbW92ZShvYmopOwotCQl9Ci0KLQkJc2V0UGFnZUNvbXBsZXRlKGlzUGFnZUNvbXBsZXRlKCkpOwotCQlnZXRXaXphcmQoKS5nZXRDb250YWluZXIoKS51cGRhdGVCdXR0b25zKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIjc2VsZWN0aW9uQ2hhbmdlZChvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBldmVudAotCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQkJaWYgKCFzZWxlY3Rpb24uaXNFbXB0eSgpKSB7Ci0JCQlPYmplY3RbXSBwbHVnaW4gPSBzZWxlY3Rpb24udG9BcnJheSgpOwotCQkJc2V0RGlzcGxheUF0dHJpYnV0ZXMoKFBsdWdpbkluZm8pIHBsdWdpblswXSk7Ci0JCX0gZWxzZSB7Ci0JCQljbGVhckRpc3BsYXlBdHRyaWJ1dGVzKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyI2hhbmRsZUV2ZW50KG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCXNldFBhZ2VDb21wbGV0ZShpc1BhZ2VDb21wbGV0ZSgpKTsKLQkJZ2V0V2l6YXJkKCkuZ2V0Q29udGFpbmVyKCkudXBkYXRlQnV0dG9ucygpOwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXREaXNwbGF5QXR0cmlidXRlcyhQbHVnaW5JbmZvIHBsdWdpbikgewotCQljdHJsX2F1dGhvckltcG9ydC5zZXRUZXh0KHBsdWdpbi5hdXRob3JzID09IG51bGwgPyAiIiA6IHBsdWdpbi5hdXRob3JzKTsgLy8kTk9OLU5MUy0xJAotCQljdHJsX3ZlcnNpb25JbXBvcnQKLQkJCQkuc2V0VGV4dChwbHVnaW4udmVyc2lvbiA9PSBudWxsID8gIiIgOiBwbHVnaW4udmVyc2lvbik7IC8vJE5PTi1OTFMtMSQKLQkJY3RybF9icmllZkRlc2NJbXBvcnQKLQkJCQkuc2V0VGV4dChwbHVnaW4uYnJpZWZfZGVzYyA9PSBudWxsID8gIiIgOiBwbHVnaW4uYnJpZWZfZGVzYyk7IC8vJE5PTi1OTFMtMSQKLQkJaW1wb3J0UGx1Z2luTGFiZWwuc2V0VGV4dChwbHVnaW5EYXRhTGFiZWwpOwotCi0JCWlmIChwbHVnaW4uZXhpc3RpbmdQbHVnaW4gIT0gbnVsbCkgewotCQkJbGlicmFyeVBsdWdpbkxhYmVsLnNldFRleHQobGlicmFyeVBsdWdpbkV4aXN0cyk7Ci0JCQljdHJsX2F1dGhvckxpYnJhcnkuc2V0VGV4dChwbHVnaW4uZXhpc3RpbmdQbHVnaW4uZ2V0QXV0aG9ycygpKTsKLQkJCWN0cmxfdmVyc2lvbkxpYnJhcnkuc2V0VGV4dChwbHVnaW4uZXhpc3RpbmdQbHVnaW4uZ2V0VmVyc2lvbigpKTsKLQkJCWN0cmxfYnJpZWZEZXNjTGlicmFyeS5zZXRUZXh0KHBsdWdpbi5leGlzdGluZ1BsdWdpbgotCQkJCQkuZ2V0QnJpZWZEZXNjcmlwdGlvbigpKTsKLQkJfSBlbHNlIHsKLQkJCWxpYnJhcnlQbHVnaW5MYWJlbC5zZXRUZXh0KGxpYnJhcnlQbHVnaW5Ob3RFeGlzdHMpOwotCQkJY3RybF9hdXRob3JMaWJyYXJ5LnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0JCQljdHJsX3ZlcnNpb25MaWJyYXJ5LnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0JCQljdHJsX2JyaWVmRGVzY0xpYnJhcnkuc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBjbGVhckRpc3BsYXlBdHRyaWJ1dGVzKCkgewotCQlpbXBvcnRQbHVnaW5MYWJlbC5zZXRUZXh0KHBsdWdpbk5vU2VsZWN0aW9uKTsKLQkJY3RybF9hdXRob3JJbXBvcnQuc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLQkJY3RybF92ZXJzaW9uSW1wb3J0LnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0JCWN0cmxfYnJpZWZEZXNjSW1wb3J0LnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0KLQkJbGlicmFyeVBsdWdpbkxhYmVsLnNldFRleHQocGx1Z2luTm9TZWxlY3Rpb24pOwotCQljdHJsX2F1dGhvckxpYnJhcnkuc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLQkJY3RybF92ZXJzaW9uTGlicmFyeS5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotCQljdHJsX2JyaWVmRGVzY0xpYnJhcnkuc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlI2lzUGFnZUNvbXBsZXRlKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1BhZ2VDb21wbGV0ZSgpIHsKLQkJaWYgKGdldEVycm9yTWVzc2FnZSgpICE9IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiAoY2hlY2tlZENvdW50ID4gMCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudWkud2l6YXJkcy5CYXNlV2l6YXJkUGFnZSNvbkVudGVyUGFnZShPYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgb25FbnRlclBhZ2UoT2JqZWN0IG9iaikgewotCQlMaXN0IHBsdWdpbnMgPSBkYXRhLmdldFBsdWdpbnMoKTsKLQkJaWYgKHBsdWdpbnMgIT0gbnVsbCkgewotCQkJY3RybF9jaGtib3hUYWJsZVZpZXdlci5zZXRJbnB1dChwbHVnaW5zLnRvQXJyYXkoKSk7Ci0JCQlpZiAoIXBsdWdpbnMuaXNFbXB0eSgpKSB7Ci0JCQkJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihwbHVnaW5zCi0JCQkJCQkuZ2V0KDApKTsKLQkJCQljdHJsX2Noa2JveFRhYmxlVmlld2VyLnNldFNlbGVjdGlvbihzZWxlY3Rpb24pOwotCQkJfQotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3dpemFyZHMvcGFja2FnZS5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy93aXphcmRzL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2U2MTA3ZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3dpemFyZHMvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgd2l6YXJkcyBmb3IgaW1wb3J0aW5nIG1ldGhvZCBwbHVnLWlucyBhbmQgY29uZmlndXJhdGlvbnMuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51aS8uY2xhc3NwYXRoIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51aS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTFjOGYyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudWkvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudWkvLnByb2plY3QgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnVpLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmODM5ZDkyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudWkvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnVpPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnVpL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0M2I5MDkwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiBMaWJyYXJ5IEVkaXQgVUkgUGx1Zy1pbgotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51aTtzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjUuMC5xdWFsaWZpZXIKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudWkuTGlicmFyeUVkaXRVSVBsdWdpbgotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZSwKLSBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpLAotIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQsCi0gb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkKLUVjbGlwc2UtTGF6eVN0YXJ0OiB0cnVlCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51aQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51aS9idWlsZC5wcm9wZXJ0aWVzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51aS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOTg2M2UyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudWkvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotc291cmNlLi4gPSBzcmMvCi1vdXRwdXQuLiA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICAuLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudWkvcGx1Z2luLnhtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudWkvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGY2NDEzNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnVpL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMiI/PgotPHBsdWdpbj4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnVpSGVscGVyIj4KLSAgICAgIDx1aUhlbHBlcgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudWkuVUlIZWxwZXIiPgotICAgICAgPC91aUhlbHBlcj4KLSAgIDwvZXh0ZW5zaW9uPgotCi08L3BsdWdpbj4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdWkvTGlicmFyeUVkaXRVSVBsdWdpbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91aS9MaWJyYXJ5RWRpdFVJUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3MzdmMDQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91aS9MaWJyYXJ5RWRpdFVJUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpLkFic3RyYWN0UGx1Z2luOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotCi0vKioKLSAqIFRoZSBhY3RpdmF0b3IgY2xhc3MgY29udHJvbHMgdGhlIHBsdWctaW4gbGlmZSBjeWNsZQotICovCi1wdWJsaWMgY2xhc3MgTGlicmFyeUVkaXRVSVBsdWdpbiBleHRlbmRzIEFic3RyYWN0UGx1Z2luIHsKLQotCS8vIFRoZSBwbHVnLWluIElECi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudWkiOyAvLyROT04tTkxTLTEkCi0KLQkvLyBUaGUgc2hhcmVkIGluc3RhbmNlCi0JcHJpdmF0ZSBzdGF0aWMgTGlicmFyeUVkaXRVSVBsdWdpbiBwbHVnaW47Ci0JCi0JLyoqCi0JICogVGhlIGNvbnN0cnVjdG9yCi0JICovCi0JcHVibGljIExpYnJhcnlFZGl0VUlQbHVnaW4oKSB7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2lucyNzdGFydChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdGFydChjb250ZXh0KTsKLQkJcGx1Z2luID0gdGhpczsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbHVnaW4jc3RvcChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXBsdWdpbiA9IG51bGw7Ci0JCXN1cGVyLnN0b3AoY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2hhcmVkIGluc3RhbmNlCi0JICoKLQkgKiBAcmV0dXJuIHRoZSBzaGFyZWQgaW5zdGFuY2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpYnJhcnlFZGl0VUlQbHVnaW4gZ2V0RGVmYXVsdCgpIHsKLQkJcmV0dXJuIHBsdWdpbjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdWkvUHJvY2Vzc0xpc3RTZWxlY3Rpb25EaWFsb2cuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdWkvUHJvY2Vzc0xpc3RTZWxlY3Rpb25EaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjc5ZTBlZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3VpL1Byb2Nlc3NMaXN0U2VsZWN0aW9uRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbi4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5MaXN0U2VsZWN0aW9uRGlhbG9nOwotCi0vKioKLSAqIFRoaXMgamF2YSBmaWxlIGV4dGVuZHMgamZhY2UgTGlzdFNlbGVjdGlvbkRpYWxvZyBhbmQgcmVtb3ZlIGNhbmNlbCBidXR0b24KLSAqIGZyb20gZGlhbG9nCi0gKiAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4xCi0gKgotICovCi1wdWJsaWMgY2xhc3MgUHJvY2Vzc0xpc3RTZWxlY3Rpb25EaWFsb2cgZXh0ZW5kcyBMaXN0U2VsZWN0aW9uRGlhbG9nIHsKLQotCXB1YmxpYyBQcm9jZXNzTGlzdFNlbGVjdGlvbkRpYWxvZyhTaGVsbCBwYXJlbnRTaGVsbCwgT2JqZWN0IGlucHV0LAotICAgICAgICAgICAgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIgY29udGVudFByb3ZpZGVyLAotICAgICAgICAgICAgSUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlciwgU3RyaW5nIG1lc3NhZ2UpCi0JewotCQlzdXBlcihwYXJlbnRTaGVsbCwgaW5wdXQsIGNvbnRlbnRQcm92aWRlciwgbGFiZWxQcm92aWRlciwgbWVzc2FnZSk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUJ1dHRvbnNGb3JCdXR0b25CYXIoQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICBjcmVhdGVCdXR0b24ocGFyZW50LCBJRGlhbG9nQ29uc3RhbnRzLk9LX0lELCBJRGlhbG9nQ29uc3RhbnRzLk9LX0xBQkVMLAotICAgICAgICAgICAgICAgIHRydWUpOwotICAgICAgIAotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdWkvVGVhbVNlbGVjdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91aS9UZWFtU2VsZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczNDQ0YjkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91aS9UZWFtU2VsZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51aTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSVVzZXJJbnRlcmFjdGlvbkhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkFkYXB0ZXJGYWN0b3J5SXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkV4dGVuc2lvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGVhbVByb2ZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLQotCi0vKioKLSAqIFVJIERpYWxvZyBjbGFzcyB3aGljaCB3aWxsIGFzayB1c2VyIHRvIGFzc2lnbiBhIHJvbGUgdG8gdGVhbSBhdXRvbWF0aWNhbGx5LgotICogCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgVGVhbVNlbGVjdGlvbiB7Ci0KLQkvKioKLQkgKiBJdCBzaG93cyBkaWFsb2cgYm94IGFsbCB0ZWFtcy4gUmV0dXJucyB0ZWFtIHVzZXIgc2VsZWN0ZWQKLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFRlYW1Qcm9maWxlIGdldFNlbGVjdGVkVGVhbShMaXN0IHRlYW1MaXN0LCBSb2xlIHJvbGUsIFNoZWxsIHNoZWxsKSB7Ci0vLwkJSUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlciA9IG5ldyBBZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIoCi0vLwkJCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRS5nZXRPQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKSB7Ci0vLwkJCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqKSB7Ci0vLwkJCQlpZiAob2JqIGluc3RhbmNlb2YgVGVhbVByb2ZpbGUpIHsKLS8vCQkJCQlyZXR1cm4gKChUZWFtUHJvZmlsZSkgb2JqKS5nZXROYW1lKCk7Ci0vLwkJCQl9Ci0vLwkJCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLS8vCQkJfQotLy8JCX07Ci0vLwkJaWYoc2hlbGwgPT0gbnVsbCkgewotLy8JCQl0cnkgewotLy8JCQkJc2hlbGwgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldFNoZWxsKCk7IC8vTXNnQm94LmdldERlZmF1bHRTaGVsbCgpOwotLy8JCQl9Ci0vLwkJCWNhdGNoKEV4Y2VwdGlvbiBlKSB7Ci0vLwkJCQkKLS8vCQkJfQotLy8JCX0KLS8vCQlFbGVtZW50TGlzdFNlbGVjdGlvbkRpYWxvZyBkbGcgPSBuZXcgRWxlbWVudExpc3RTZWxlY3Rpb25EaWFsb2coc2hlbGwsIGxhYmVsUHJvdmlkZXIpOwotLy8KLS8vCQlkbGcuc2V0QmxvY2tPbk9wZW4odHJ1ZSk7Ci0vLwkJZGxnLnNldEVsZW1lbnRzKHRlYW1MaXN0LnRvQXJyYXkoKSk7Ci0vLwkJZGxnLnNldE11bHRpcGxlU2VsZWN0aW9uKGZhbHNlKTsKLS8vCQlkbGcKLS8vCQkJCS5zZXRNZXNzYWdlKE5MUy5iaW5kKExpYnJhcnlFZGl0UmVzb3VyY2VzLnNlbGVjdFRlYW1zRGlhbG9nX3RleHQsIChuZXcgT2JqZWN0W10geyByb2xlLmdldE5hbWUoKSB9KSkpOyAKLS8vCQlkbGcuc2V0VGl0bGUoTGlicmFyeUVkaXRSZXNvdXJjZXMuc2VsZWN0VGVhbXNEaWFsb2dfdGl0bGUpOyAvLyROT04tTkxTLTEkCi0vLwkJZGxnLnNldEZpbHRlcihudWxsKTsKLS8vCQlkbGcub3BlbigpOwotLy8JCU9iamVjdCBvYmogPSBkbGcuZ2V0Rmlyc3RSZXN1bHQoKTsKLS8vCQkvLyBkaXNwb3NlCi0vLwkJbGFiZWxQcm92aWRlci5kaXNwb3NlKCk7Ci0vLwkJcmV0dXJuIChUZWFtUHJvZmlsZSkgb2JqOwotCQkKLQkJZmluYWwgSVVzZXJJbnRlcmFjdGlvbkhhbmRsZXIgdWlIYW5kbGVyID0gRXh0ZW5zaW9uTWFuYWdlcgotCQkJCS5nZXREZWZhdWx0VXNlckludGVyYWN0aW9uSGFuZGxlcigpOwotCQlpZiAodWlIYW5kbGVyICE9IG51bGwpIHsKLQkJCWZpbmFsIElJdGVtTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyID0gbmV3IEFkYXB0ZXJGYWN0b3J5SXRlbUxhYmVsUHJvdmlkZXIoCi0JCQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFLmdldE9CU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpOwotCQkJZmluYWwgU3RyaW5nIHRpdGxlID0gTGlicmFyeUVkaXRSZXNvdXJjZXMuc2VsZWN0VGVhbXNEaWFsb2dfdGl0bGU7Ci0JCQlmaW5hbCBTdHJpbmcgbXNnID0gTkxTLmJpbmQoTGlicmFyeUVkaXRSZXNvdXJjZXMuc2VsZWN0VGVhbXNEaWFsb2dfdGV4dCwgKG5ldyBPYmplY3RbXSB7IHJvbGUuZ2V0TmFtZSgpIH0pKTsKLQkJCWZpbmFsIExpc3QgZmluYWxTZWxlY3RlZCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWZpbmFsIExpc3QgZmluYWxUZWFtcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWZpbmFsVGVhbXMuYWRkQWxsKHRlYW1MaXN0KTsKLQotCQkJVXNlckludGVyYWN0aW9uSGVscGVyLmdldFVJSGVscGVyKCkucnVuU2FmZWx5KG5ldyBSdW5uYWJsZSgpIHsKLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCUxpc3Qgc2VsZWN0ZWQgPSB1aUhhbmRsZXIuc2VsZWN0KGZpbmFsVGVhbXMsIGxhYmVsUHJvdmlkZXIsIGZhbHNlLAotCQkJCQkJCWZpbmFsVGVhbXMsIHRpdGxlLCBtc2cpOwotCi0JCQkJCWlmIChzZWxlY3RlZCAhPSBudWxsKQotCQkJCQkJZmluYWxTZWxlY3RlZC5hZGRBbGwoc2VsZWN0ZWQpOwotCQkJCX0KLQkJCX0sIHRydWUpOwotCi0JCQlpZiAoZmluYWxTZWxlY3RlZCA9PSBudWxsKSB7Ci0JCQkJdGhyb3cgbmV3IE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uKCk7Ci0JCQl9Ci0JCQlpZihmaW5hbFNlbGVjdGVkLmlzRW1wdHkoKSkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQkJcmV0dXJuIChUZWFtUHJvZmlsZSkgZmluYWxTZWxlY3RlZC5nZXQoMCk7Ci0JCX0KLQotCQkvLyBubyB1c2VyIGludGVyYWN0aW9uIGhhbmRsZXIgYXZhaWxhYmxlCi0JCS8vIHJldHVybiBudWxsCi0JCXJldHVybiBudWxsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91aS9VSUhlbHBlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91aS9VSUhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOTAyNmFlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdWkvVUlIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnVpOwotCi1pbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLlN0cmluZ1dyaXRlcjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLldvcmtzcGFjZUpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTXVsdGlTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5JU2NoZWR1bGluZ1J1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udWkudmlld2VyLklWaWV3ZXJQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuV3JhcHBlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udWkudXRpbC5Nc2dCb3g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkJTQWN0aXZpdHlJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkV4cG9zZWRBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuRXh0ZW5zaW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuSVJ1bm5hYmxlV2l0aFByb2dyZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Qcm9jZXNzVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZWFtUHJvZmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5NZXNzYWdlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuUHJvZ3Jlc3NNb25pdG9yRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5Nb2RhbENvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQnVzeUluZGljYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucHJvZ3Jlc3MuV29ya2JlbmNoSm9iOwotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS41Ci0gKgotICovCi1wdWJsaWMgY2xhc3MgVUlIZWxwZXIgaW1wbGVtZW50cyBJVUlIZWxwZXIgewotCS8qKgotCSAqIEdldCB0ZWFtcyBpbiBzY29wZQotCSAqIAotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqIEBwYXJhbSBlCi0JICogQHBhcmFtIHJvbGUKLQkgKiBAcGFyYW0gdGVhbUxpc3QKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGdldFRlYW1zSW5TY29wZShBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwKLQkJCUJyZWFrZG93bkVsZW1lbnQgZSwgUm9sZSByb2xlLCBMaXN0IHRlYW1MaXN0KSB7Ci0JCS8vIGdldCBjaGlsZHJlbiBmb3IgYWN0aXZpdHkKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyIGl0ZW1Qcm92aWRlciA9IChJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIpIGFkYXB0ZXJGYWN0b3J5Ci0JCQkJLmFkYXB0KGUsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCUNvbGxlY3Rpb24gY2hpbGRyZW4gPSBpdGVtUHJvdmlkZXIuZ2V0Q2hpbGRyZW4oZSk7Ci0JCWZvciAoSXRlcmF0b3IgaXRvciA9IGNoaWxkcmVuLml0ZXJhdG9yKCk7IGl0b3IuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IG9iaiA9IGl0b3IubmV4dCgpOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFRlYW1Qcm9maWxlKSB7Ci0JCQkJVGVhbVByb2ZpbGUgdGVhbSA9IChUZWFtUHJvZmlsZSkgb2JqOwotCQkJCUxpc3QgYWxsVGVhbXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJLy8gZ2V0IGFsbCBzdWIgdGVhbXMgYXMgd2VsbAotCQkJCVByb2Nlc3NVdGlsLmdldEFsbFN1YlRlYW1zKHRlYW0sIGFsbFRlYW1zKTsKLQotCQkJCWZvciAoSXRlcmF0b3IgdGVhbUl0b3IgPSBhbGxUZWFtcy5pdGVyYXRvcigpOyB0ZWFtSXRvcgotCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJT2JqZWN0IG8gPSB0ZWFtSXRvci5uZXh0KCk7Ci0JCQkJCWlmIChvIGluc3RhbmNlb2YgVGVhbVByb2ZpbGUpIHsKLQkJCQkJCS8vIGdldCByb2xlcyBmcm9tIHRlYW1zCi0JCQkJCQlMaXN0IHJvbGVzID0gUHJvY2Vzc1V0aWwuZ2V0Um9sZXMoKChUZWFtUHJvZmlsZSkgbykKLQkJCQkJCQkJLmdldFRlYW1Sb2xlcygpKTsKLQkJCQkJCWlmIChyb2xlcy5jb250YWlucyhyb2xlKSkgewotCQkJCQkJCXRlYW1MaXN0LmFkZChvKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCS8vIGdldCBwYXJlbnQKLQkJT2JqZWN0IGN1cnJlbnRQYXJlbnQgPSBpdGVtUHJvdmlkZXIuZ2V0UGFyZW50KGUpOwotCQlpZiAoY3VycmVudFBhcmVudCAhPSBudWxsKSB7Ci0JCQkvLyBnbyB1cAotCQkJZ2V0VGVhbXNJblNjb3BlKGFkYXB0ZXJGYWN0b3J5LCAoQnJlYWtkb3duRWxlbWVudCkgY3VycmVudFBhcmVudCwKLQkJCQkJcm9sZSwgdGVhbUxpc3QpOwotCQl9Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLklVSUhlbHBlciNnZXRUZWFtKG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHksIG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZSwgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgVGVhbVByb2ZpbGUgZ2V0VGVhbShBY3Rpdml0eSBhY3Rpdml0eSwgUm9sZSByb2xlLCBPYmplY3QgVUlDb250ZXh0KSB7Ci0JCUxpc3QgdGVhbUxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5ID0gVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkuZ2V0T0JTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKTsKLQkJLy8gZmluZCBvdXQgYWxsIHRlYW0gaW4gdmlzaWJsZSBzY29wZQotCQlnZXRUZWFtc0luU2NvcGUoYWRhcHRlckZhY3RvcnksIGFjdGl2aXR5LCByb2xlLCB0ZWFtTGlzdCk7Ci0JCWlmICh0ZWFtTGlzdC5zaXplKCkgPT0gMSkgewotCQkJcmV0dXJuIChUZWFtUHJvZmlsZSkgdGVhbUxpc3QuZ2V0KDApOwotCQl9Ci0JCWlmICh0ZWFtTGlzdC5zaXplKCkgPiAxKSB7Ci0JCQlyZXR1cm4gVGVhbVNlbGVjdGlvbi5nZXRTZWxlY3RlZFRlYW0odGVhbUxpc3QsIHJvbGUsCi0JCQkJCVVJQ29udGV4dCBpbnN0YW5jZW9mIFNoZWxsID8gKFNoZWxsKSBVSUNvbnRleHQgOiBudWxsKTsKLQkJfQotCQkvLyB0aGVyZSBhcmUgbm8gdGVhbXMgdG8gYXNzaWduCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5JVUlIZWxwZXIjcnVuSW5Nb2RhbENvbnRleHQob3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLklSdW5uYWJsZVdpdGhQcm9ncmVzcywgYm9vbGVhbiwgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IsIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIElTdGF0dXMgcnVuSW5Nb2RhbENvbnRleHQoZmluYWwgSVJ1bm5hYmxlV2l0aFByb2dyZXNzIG9wZXJhdGlvbiwKLQkJCWJvb2xlYW4gZm9yaywgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBPYmplY3QgdWlDb250ZXh0KSB7Ci0JCW9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVXaXRoUHJvZ3Jlc3Mgb3AgPSBuZXcgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLklSdW5uYWJsZVdpdGhQcm9ncmVzcygpIHsKLQotCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLQkJCQkJdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJCQlvcGVyYXRpb24ucnVuKG1vbml0b3IpOwotCQkJfQotCQkJCi0JCX07Ci0JCXRyeSB7Ci0JCQlNb2RhbENvbnRleHQucnVuKG9wLCB0cnVlLCBtb25pdG9yLCAoKFNoZWxsKXVpQ29udGV4dCkKLQkJCQkJLmdldERpc3BsYXkoKSk7Ci0JCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCUxpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmxvZyhlKTsKLQkJCVRocm93YWJsZSBleDsKLQkJCWlmIChlIGluc3RhbmNlb2YgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbikgewotCQkJCWV4ID0gKChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uKSBlKQotCQkJCQkJLmdldFRhcmdldEV4Y2VwdGlvbigpOwotCQkJfSBlbHNlIHsKLQkJCQlleCA9IGU7Ci0JCQl9Ci0JCQlTdHJpbmcgbXNnID0gVG5nVXRpbC50b1N0YWNrVHJhY2VTdHJpbmcoZXgpOwotCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwKLQkJCQkJTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0U3ltYm9saWNOYW1lKCksIDAsCi0JCQkJCW1zZywgZXgpOwotCQl9Ci0KLQl9Ci0KLQlwdWJsaWMgTGlzdCBzZWxlY3RUYXNrcyhMaXN0IHRhc2tMaXN0LCBXb3JrUHJvZHVjdCB3cCkgewotCQlJTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyID0gbmV3IEFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcigKLQkJCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkJLmdldE5hdmlnYXRvclZpZXdfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKSB7Ci0JCQlwdWJsaWMgU3RyaW5nIGdldENvbHVtblRleHQoT2JqZWN0IG9iaiwgaW50IGNvbHVtbikgewotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQkJCXJldHVybiBUbmdVdGlsLmdldFByZXNlbnRhdGlvbk5hbWUob2JqKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIHN1cGVyLmdldFRleHQob2JqKTsKLQkJCX0KLQkJfTsKLQotCQlJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciBjb250ZW50UHJvdmlkZXIgPSBuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoCi0JCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJCS5nZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSkgewotCQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gKChMaXN0KSBvYmplY3QpLnRvQXJyYXkoKTsKLQkJCX0KLQkJfTsKLQotCQl0cnkgewotCQkJUHJvY2Vzc0xpc3RTZWxlY3Rpb25EaWFsb2cgZGxnID0gbmV3IFByb2Nlc3NMaXN0U2VsZWN0aW9uRGlhbG9nKAotCQkJCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpCi0JCQkJCQkJLmdldFNoZWxsKCksCi0JCQkJCXRhc2tMaXN0LAotCQkJCQljb250ZW50UHJvdmlkZXIsCi0JCQkJCWxhYmVsUHJvdmlkZXIsCi0JCQkJCU5MUwotCQkJCQkJCS5iaW5kKAotCQkJCQkJCQkJTGlicmFyeUVkaXRSZXNvdXJjZXMudWlfVXNlckludGVyYWN0aW9uSGVscGVyX3dwbGlzdGRsZ19tc2csCi0JCQkJCQkJCQl3cC5nZXROYW1lKCkpKTsKLQotCQkJZGxnLnNldFRpdGxlKExpYnJhcnlFZGl0UmVzb3VyY2VzLnVpX1VzZXJJbnRlcmFjdGlvbkhlbHBlcl90YXNrcyk7Ci0JCQlkbGcuc2V0QmxvY2tPbk9wZW4odHJ1ZSk7Ci0JCQlkbGcub3BlbigpOwotCQkJT2JqZWN0W10gb2JqcyA9IGRsZy5nZXRSZXN1bHQoKTsKLQotCQkJTGlzdCBzZWxlY3RlZFRhc2tzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJaWYgKChvYmpzICE9IG51bGwpICYmIChvYmpzLmxlbmd0aCA+IDApKSB7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBvYmpzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCXNlbGVjdGVkVGFza3MuYWRkKG9ianNbaV0pOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBzZWxlY3RlZFRhc2tzOwotCQl9IGZpbmFsbHkgewotCQkJLy8gZGlzcG9zZQotCQkJbGFiZWxQcm92aWRlci5kaXNwb3NlKCk7Ci0JCQljb250ZW50UHJvdmlkZXIuZGlzcG9zZSgpOwotCQl9Ci0JfQotCi0JcHVibGljIExpc3Qgc2VsZWN0V29ya1Byb2R1Y3RzKExpc3Qgd3BMaXN0LCBSb2xlIHJvbGUpIHsKLQkJSUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlciA9IG5ldyBBZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIoCi0JCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJCS5nZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSkgewotCQkJcHVibGljIFN0cmluZyBnZXRDb2x1bW5UZXh0KE9iamVjdCBvYmosIGludCBjb2x1bW4pIHsKLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJCQlyZXR1cm4gVG5nVXRpbC5nZXRQcmVzZW50YXRpb25OYW1lKG9iaik7Ci0JCQkJfQotCQkJCXJldHVybiBzdXBlci5nZXRUZXh0KG9iaik7Ci0JCQl9Ci0JCX07Ci0KLQkJSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIgY29udGVudFByb3ZpZGVyID0gbmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKAotCQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpIHsKLQkJCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuICgoTGlzdCkgb2JqZWN0KS50b0FycmF5KCk7Ci0JCQl9Ci0JCX07Ci0KLQkJdHJ5IHsKLQkJCVByb2Nlc3NMaXN0U2VsZWN0aW9uRGlhbG9nIGRsZyA9IG5ldyBQcm9jZXNzTGlzdFNlbGVjdGlvbkRpYWxvZygKLQkJCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKQotCQkJCQkJCS5nZXRTaGVsbCgpLAotCQkJCQkvLyBNc2dCb3guZ2V0RGVmYXVsdFNoZWxsKCksCi0JCQkJCXdwTGlzdCwKLQkJCQkJY29udGVudFByb3ZpZGVyLAotCQkJCQlsYWJlbFByb3ZpZGVyLAotCQkJCQlOTFMKLQkJCQkJCQkuYmluZCgKLQkJCQkJCQkJCUxpYnJhcnlFZGl0UmVzb3VyY2VzLnVpX1VzZXJJbnRlcmFjdGlvbkhlbHBlcl9yb2xlbGlzdGRsZ19tc2csCi0JCQkJCQkJCQlyb2xlLmdldE5hbWUoKSkpOwotCi0JCQlkbGcKLQkJCQkJLnNldFRpdGxlKExpYnJhcnlFZGl0UmVzb3VyY2VzLnVpX1VzZXJJbnRlcmFjdGlvbkhlbHBlcl93b3JrcHJvZHVjdHMpOyAKLQkJCWRsZy5zZXRCbG9ja09uT3Blbih0cnVlKTsKLQkJCWRsZy5vcGVuKCk7Ci0JCQlPYmplY3RbXSBvYmpzID0gZGxnLmdldFJlc3VsdCgpOwotCi0JCQlMaXN0IHNlbGVjdGVkV3BzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJaWYgKChvYmpzICE9IG51bGwpICYmIChvYmpzLmxlbmd0aCA+IDApKSB7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBvYmpzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCXNlbGVjdGVkV3BzLmFkZChvYmpzW2ldKTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gc2VsZWN0ZWRXcHM7Ci0JCX0gZmluYWxseSB7Ci0JCQkvLyBkaXNwb3NlCi0JCQlsYWJlbFByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJCWNvbnRlbnRQcm92aWRlci5kaXNwb3NlKCk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUnVubmFibGVXaXRoUHJvZ3Jlc3MgaW1wbGVtZW50cyBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uSVJ1bm5hYmxlV2l0aFByb2dyZXNzIHsKLQkJcHJpdmF0ZSBJUnVubmFibGVXaXRoUHJvZ3Jlc3Mgb3BlcmF0aW9uOwotCi0JCXB1YmxpYyBSdW5uYWJsZVdpdGhQcm9ncmVzcyhJUnVubmFibGVXaXRoUHJvZ3Jlc3Mgb3ApIHsKLQkJCXRoaXMub3BlcmF0aW9uID0gb3A7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQotCQkJCXRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCQlvcGVyYXRpb24ucnVuKG1vbml0b3IpOwotCQl9Ci0JCQotCX0KLQotCXB1YmxpYyBJU3RhdHVzIHJ1bkFzSm9iKGZpbmFsIElSdW5uYWJsZVdpdGhQcm9ncmVzcyBydW5uYWJsZSwgU3RyaW5nIHRhc2tOYW1lLAotCQkJT2JqZWN0IHNoZWxsKSB7Ci0JCUpvYiBqb2IgPSBuZXcgV29ya3NwYWNlSm9iKHRhc2tOYW1lKSB7Ci0KLQkJCXB1YmxpYyBJU3RhdHVzIHJ1bkluV29ya3NwYWNlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLQkJCQkJdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkJCXRyeSB7Ci0JCQkJCS8vIG1vbml0b3IuYmVnaW5UYXNrKHRhc2tOYW1lLCBJUHJvZ3Jlc3NNb25pdG9yLlVOS05PV04pOwotCQkJCQlydW5uYWJsZS5ydW4obW9uaXRvcik7Ci0JCQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCQkJCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotCQkJCQlUaHJvd2FibGUgZXg7Ci0JCQkJCWlmIChlLmdldENhdXNlKCkgIT0gbnVsbCkgewotCQkJCQkJZXggPSBlLmdldENhdXNlKCk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlleCA9IGU7Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgTGlicmFyeUVkaXRQbHVnaW4KLQkJCQkJCQkuZ2V0UGx1Z2luKCkuZ2V0SWQoKSwgMCwgZXgudG9TdHJpbmcoKSwgZXgpOwotCQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgTGlicmFyeUVkaXRQbHVnaW4KLQkJCQkJCQkuZ2V0UGx1Z2luKCkuZ2V0SWQoKSwgMCwgZS50b1N0cmluZygpLCBlKTsKLQkJCQl9IGZpbmFsbHkgewotCQkJCQltb25pdG9yLmRvbmUoKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJfTsKLQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRQcm9ncmVzc1NlcnZpY2UoKS5zaG93SW5EaWFsb2coKFNoZWxsKSBzaGVsbCwgam9iKTsKLQkJam9iLnNjaGVkdWxlKCk7Ci0JCXJldHVybiBqb2IuZ2V0UmVzdWx0KCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gcnVuSW5VSShJUnVubmFibGVXaXRoUHJvZ3Jlc3MgcnVubmFibGUsCi0JCQlJU2NoZWR1bGluZ1J1bGUgcnVsZSwgT2JqZWN0IHNoZWxsKSB7Ci0JCWlmIChzaGVsbCA9PSBudWxsKSB7Ci0JCQlzaGVsbCA9IExpYnJhcnlFZGl0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRDb250ZXh0KCk7Ci0JCX0KLQkJSVJ1bm5hYmxlQ29udGV4dCBjb250ZXh0ID0gbmV3IFByb2dyZXNzTW9uaXRvckRpYWxvZygoU2hlbGwpIHNoZWxsKTsKLQkJdHJ5IHsKLQkJCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0UHJvZ3Jlc3NTZXJ2aWNlKCkucnVuSW5VSShjb250ZXh0LAotCQkJCQluZXcgUnVubmFibGVXaXRoUHJvZ3Jlc3MocnVubmFibGUpLCBydWxlKTsKLQkJCXJldHVybiB0cnVlOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJTGlicmFyeUVkaXRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJU3RyaW5nIHRpdGxlID0gTGlicmFyeUVkaXRSZXNvdXJjZXMuZXJyb3JEaWFsb2dfdGl0bGU7Ci0JCQlFeHRlbnNpb25NYW5hZ2VyLmdldERlZmF1bHRVc2VySW50ZXJhY3Rpb25IYW5kbGVyKCkuZ2V0TWVzc2VuZ2VyKCkKLQkJCQkuc2hvd0Vycm9yKHRpdGxlLCBlLnRvU3RyaW5nKCksIG51bGwsIGUpOwotLy8JCQlMaWJyYXJ5RWRpdFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkuZGlzcGxheUVycm9yKHRpdGxlLAotLy8JCQkJCWUudG9TdHJpbmcoKSwgZSk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBydW5XaXRoUHJvZ3Jlc3MoZmluYWwgSVJ1bm5hYmxlV2l0aFByb2dyZXNzIHJ1bm5hYmxlLAotCQkJZmluYWwgSVJ1bm5hYmxlQ29udGV4dCBydW5uYWJsZUNvbnRleHQsIGZpbmFsIGJvb2xlYW4gY2FuQ2FuY2VsLCBmaW5hbCBTdHJpbmcgbXNnKSB7Ci0JCWZpbmFsIE11bHRpU3RhdHVzIHN0YXR1cyA9IG5ldyBNdWx0aVN0YXR1cyhMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCS5nZXRTeW1ib2xpY05hbWUoKSwgSVN0YXR1cy5PSywKLQkJCQlMaWJyYXJ5RWRpdFJlc291cmNlcy5lcnJvcl9yZWFzb24sIG51bGwpOyAKLQotCQlmaW5hbCBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uSVJ1bm5hYmxlV2l0aFByb2dyZXNzIG9wZXJhdGlvbiA9IG5ldyBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uSVJ1bm5hYmxlV2l0aFByb2dyZXNzKCkgewotCi0JCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQotCQkJCQl0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQkJCW1vbml0b3IuYmVnaW5UYXNrKG1zZywgSVByb2dyZXNzTW9uaXRvci5VTktOT1dOKTsKLQkJCQltb25pdG9yLnN1YlRhc2soIiIpOyAvLyROT04tTkxTLTEkCi0JCQkJdHJ5IHsKLQkJCQkJcnVubmFibGUucnVuKG1vbml0b3IpOwotCQkJCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkJCQlTdHJpbmcgbXNnOwotCQkJCQlpZiAoZSBpbnN0YW5jZW9mIE1lc3NhZ2VFeGNlcHRpb24pIHsKLQkJCQkJCW1zZyA9IGUuZ2V0TWVzc2FnZSgpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJU3RyaW5nV3JpdGVyIHN0cldyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLQkJCQkJCWUucHJpbnRTdGFja1RyYWNlKG5ldyBQcmludFdyaXRlcihzdHJXcml0ZXIpKTsKLQkJCQkJCW1zZyA9IHN0cldyaXRlci50b1N0cmluZygpOwotCQkJCQl9Ci0JCQkJCXN0YXR1cy5hZGQobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLAotCQkJCQkJCUxpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldFN5bWJvbGljTmFtZSgpLCAwLAotCQkJCQkJCW1zZywgZSkpOwotCQkJCX0gZmluYWxseSB7Ci0JCQkJCW1vbml0b3IuZG9uZSgpOwotCQkJCX0KLQkJCX0KLQotCQl9OwotCi0JCXRyeSB7Ci0JCQlpZiAoRGlzcGxheS5nZXRDdXJyZW50KCkgPT0gbnVsbCkgewotCQkJCS8vIGN1cnJlbnQgdGhyZWFkIGlzIG5vdCBhIHVzZXItaW50ZXJmYWNlIHRocmVhZAotCQkJCS8vCi0JCQkJRGlzcGxheS5nZXREZWZhdWx0KCkuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCi0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJcnVubmFibGVDb250ZXh0LnJ1bih0cnVlLCBjYW5DYW5jZWwsIG9wZXJhdGlvbik7Ci0JCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJCUxpYnJhcnlFZGl0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCQkJCX0KLQkJCQkJfQotCi0JCQkJfSk7Ci0JCQl9IGVsc2UgewotCQkJCXJ1bm5hYmxlQ29udGV4dC5ydW4odHJ1ZSwgY2FuQ2FuY2VsLCBvcGVyYXRpb24pOwotCQkJfQotCi0JCQlpZiAoIXN0YXR1cy5pc09LKCkpIHsKLQkJCQlFeHRlbnNpb25NYW5hZ2VyLmdldERlZmF1bHRVc2VySW50ZXJhY3Rpb25IYW5kbGVyKCkKLQkJCQkJCS5nZXRNZXNzZW5nZXIoKS5zaG93RXJyb3IoCi0JCQkJCQkJCUxpYnJhcnlFZGl0UmVzb3VyY2VzLmVycm9yRGlhbG9nX3RpdGxlLAotCQkJCQkJCQlMaWJyYXJ5RWRpdFJlc291cmNlcy5lcnJvcl9tc2dXaXRoRGV0YWlscywKLQkJCQkJCQkJc3RhdHVzKTsKLQkJCX0gZWxzZSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLQkJCS8vIFNvbWV0aGluZyB3ZW50IHdyb25nIHRoYXQgc2hvdWxkbid0LgotCQkJLy8KLQkJCUxpYnJhcnlFZGl0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihleGNlcHRpb24pOwotCQl9Ci0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHJ1bldpdGhQcm9ncmVzcyhJUnVubmFibGVXaXRoUHJvZ3Jlc3MgcnVubmFibGUsCi0JCQlib29sZWFuIGNhbkNhbmNlbCwgU3RyaW5nIG1zZykgewotCQlyZXR1cm4gcnVuV2l0aFByb2dyZXNzKHJ1bm5hYmxlLCBnZXRSdW5uYWJsZUNvbnRleHQoKSwgZmFsc2UsIG1zZyk7Ci0JfQotCi0JcHVibGljIElSdW5uYWJsZUNvbnRleHQgZ2V0UnVubmFibGVDb250ZXh0KCkgewotCQlTaGVsbCBzaGVsbDsKLQkJT2JqZWN0IHVpQ3R4ID0gRXh0ZW5zaW9uTWFuYWdlci5nZXREZWZhdWx0VXNlckludGVyYWN0aW9uSGFuZGxlcigpLmdldFVJQ29udGV4dCgpOwotCQlpZiAodWlDdHggaW5zdGFuY2VvZiBTaGVsbCkgewotCQkJc2hlbGwgPSAoU2hlbGwpIHVpQ3R4OwotCQl9IGVsc2UgewotCQkJc2hlbGwgPSBNc2dCb3guZ2V0RGVmYXVsdFNoZWxsKCk7Ci0JCX0KLQkJcmV0dXJuIG5ldyBQcm9ncmVzc01vbml0b3JEaWFsb2coc2hlbGwpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFZpZXdlciBkb0dldFZpZXdlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwgUHJvY2VzcyBwcm9jKSB7Ci0JCWlmIChhZGFwdGVyRmFjdG9yeSBpbnN0YW5jZW9mIEV4cG9zZWRBZGFwdGVyRmFjdG9yeSkgewotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdCgKLQkJCQkJKChFeHBvc2VkQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCS5nZXRDaGFuZ2VMaXN0ZW5lcnMoKSkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IGxpc3RlbmVyID0gaXRlci5uZXh0KCk7Ci0JCQkJaWYgKGxpc3RlbmVyIGluc3RhbmNlb2YgSUNvbnRlbnRQcm92aWRlciAmJiBsaXN0ZW5lciBpbnN0YW5jZW9mIElWaWV3ZXJQcm92aWRlcikgewkJCQkJCi0JCQkJCVZpZXdlciB2aWV3ZXIgPSAoKElWaWV3ZXJQcm92aWRlcikgbGlzdGVuZXIpLmdldFZpZXdlcigpOwotCQkJCQlpZiAodmlld2VyLmdldElucHV0KCkgaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50Ci0JCQkJCQkJJiYgKChQcm9jZXNzQ29tcG9uZW50KSB2aWV3ZXIuZ2V0SW5wdXQoKSkKLQkJCQkJCQkJCS5nZXRQcm9jZXNzKCkgPT0gcHJvYykKLQkJCQkJCXJldHVybiB2aWV3ZXI7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHJlZnJlc2hOZWVkZWQoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksCi0JCQlCU0FjdGl2aXR5SXRlbVByb3ZpZGVyIGl0ZW1Qcm92aWRlcikgewotCQlQcm9jZXNzIHByb2Nlc3MgPSAoUHJvY2VzcykgaXRlbVByb3ZpZGVyLmdldFRvcEl0ZW0oKTsKLQkJaWYgKHByb2Nlc3MgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQotCQkvLyBjaGVjayBpZiB0aGUgZ2l2ZW4gcHJvY2VzcyBpcyBjdXJyZW50bHkgb3BlbmVkIGluIGVkaXRvcgotCQkvLwotCQlWaWV3ZXIgdmlld2VyID0gZG9HZXRWaWV3ZXIoYWRhcHRlckZhY3RvcnksIHByb2Nlc3MpOwotCQlpZiAodmlld2VyICE9IG51bGwgJiYgdmlld2VyLmdldENvbnRyb2woKSAhPSBudWxsCi0JCQkJJiYgIXZpZXdlci5nZXRDb250cm9sKCkuaXNEaXNwb3NlZCgpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0JCWZvciAoSXRlcmF0b3IgaXRlciA9IFRuZ1V0aWwuZ2V0Q29udHJpYnV0b3JzKHByb2Nlc3MpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gaXRlci5uZXh0KCk7Ci0JCQlCU0FjdGl2aXR5SXRlbVByb3ZpZGVyIGFkYXB0ZXIgPSAoQlNBY3Rpdml0eUl0ZW1Qcm92aWRlcikgYWRhcHRlckZhY3RvcnkKLQkJCQkJLmFkYXB0KGVsZW1lbnQsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCQlpZiAocmVmcmVzaE5lZWRlZChhZGFwdGVyRmFjdG9yeSwgYWRhcHRlcikpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBUbmdVdGlsLmdldEdlbmVyYWxpemVycyhwcm9jZXNzLAotCQkJCVZhcmlhYmlsaXR5VHlwZS5FWFRFTkRTKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZWxlbWVudCA9IGl0ZXIubmV4dCgpOwotCQkJQlNBY3Rpdml0eUl0ZW1Qcm92aWRlciBhZGFwdGVyID0gKEJTQWN0aXZpdHlJdGVtUHJvdmlkZXIpIGFkYXB0ZXJGYWN0b3J5Ci0JCQkJCS5hZGFwdChlbGVtZW50LCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkJaWYgKHJlZnJlc2hOZWVkZWQoYWRhcHRlckZhY3RvcnksIGFkYXB0ZXIpKQotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlZnJlc2hBbGxWaWV3ZXJzKGZpbmFsIEV4cG9zZWRBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlVc2VySW50ZXJhY3Rpb25IZWxwZXIuZ2V0VUlIZWxwZXIoKS5ydW5TYWZlbHkobmV3IFJ1bm5hYmxlKCkgewotCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdCgKLQkJCQkJCWFkYXB0ZXJGYWN0b3J5LmdldENoYW5nZUxpc3RlbmVycygpKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJT2JqZWN0IGxpc3RlbmVyID0gaXRlci5uZXh0KCk7Ci0JCQkJCWlmIChsaXN0ZW5lciBpbnN0YW5jZW9mIElDb250ZW50UHJvdmlkZXIgJiYgbGlzdGVuZXIgaW5zdGFuY2VvZiBJVmlld2VyUHJvdmlkZXIpIHsJCQkJCQotCQkJCQkJVmlld2VyIHZpZXdlciA9ICgoSVZpZXdlclByb3ZpZGVyKSBsaXN0ZW5lcikuZ2V0Vmlld2VyKCk7Ci0JCQkJCQlpZiAodmlld2VyICE9IG51bGwgJiYgdmlld2VyLmdldENvbnRyb2woKSAhPSBudWxsCi0JCQkJCQkJCSYmICF2aWV3ZXIuZ2V0Q29udHJvbCgpLmlzRGlzcG9zZWQoKQotCQkJCQkJCQkmJiB2aWV3ZXIuZ2V0SW5wdXQoKSBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpIHsKLQkJCQkJCQl2aWV3ZXIucmVmcmVzaCgpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJCi0JCX0sIHRydWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlZnJlc2hWaWV3ZXIoQWRhcHRlckZhY3RvcnkgZmFjdG9yeSwgUHJvY2VzcyBwcm9jKSB7Ci0JCWZpbmFsIFZpZXdlciB2aWV3ZXIgPSBkb0dldFZpZXdlcihmYWN0b3J5LCBwcm9jKTsKLQkJaWYgKHZpZXdlciAhPSBudWxsICYmIHZpZXdlci5nZXRDb250cm9sKCkgIT0gbnVsbAotCQkJCSYmICF2aWV3ZXIuZ2V0Q29udHJvbCgpLmlzRGlzcG9zZWQoKSkgewotCQkJVXNlckludGVyYWN0aW9uSGVscGVyLmdldFVJSGVscGVyKCkucnVuU2FmZWx5KG5ldyBSdW5uYWJsZSgpIHsKLQotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJdmlld2VyLnJlZnJlc2goKTsKLQkJCQl9Ci0JCQkJCi0JCQl9LCB0cnVlKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHJlZnJlc2hJRHNJblZpZXdlcihmaW5hbCBFeHBvc2VkQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJVXNlckludGVyYWN0aW9uSGVscGVyLmdldFVJSGVscGVyKCkucnVuU2FmZWx5KG5ldyBSdW5uYWJsZSgpIHsKLQotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoCi0JCQkJCQlhZGFwdGVyRmFjdG9yeS5nZXRDaGFuZ2VMaXN0ZW5lcnMoKSkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCU9iamVjdCBsaXN0ZW5lciA9IGl0ZXIubmV4dCgpOwotCQkJCQlpZiAobGlzdGVuZXIgaW5zdGFuY2VvZiBJQ29udGVudFByb3ZpZGVyICYmIGxpc3RlbmVyIGluc3RhbmNlb2YgSVZpZXdlclByb3ZpZGVyKSB7CQkJCQkKLQkJCQkJCVZpZXdlciB2aWV3ZXIgPSAoKElWaWV3ZXJQcm92aWRlcikgbGlzdGVuZXIpLmdldFZpZXdlcigpOwotCQkJCQkJaWYgKHZpZXdlciAhPSBudWxsICYmIHZpZXdlci5nZXRDb250cm9sKCkgIT0gbnVsbAotCQkJCQkJCQkmJiAhdmlld2VyLmdldENvbnRyb2woKS5pc0Rpc3Bvc2VkKCkKLQkJCQkJCQkJJiYgdmlld2VyLmdldElucHV0KCkgaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50KSB7Ci0JCQkJCQkJUHJvY2VzcyBwcm9jID0gKChQcm9jZXNzQ29tcG9uZW50KSB2aWV3ZXIuZ2V0SW5wdXQoKSkKLQkJCQkJCQkJCS5nZXRQcm9jZXNzKCk7Ci0JCQkJCQkJQlNBY3Rpdml0eUl0ZW1Qcm92aWRlciBpdGVtUHJvdmlkZXIgPSAoQlNBY3Rpdml0eUl0ZW1Qcm92aWRlcikgYWRhcHRlckZhY3RvcnkKLQkJCQkJCQkJCS5hZGFwdChwcm9jLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkJCQkJCWlmIChpdGVtUHJvdmlkZXIuaXNSZWZyZXNoQWxsSURzUmVxdWlyZWQoKSkgewotCQkJCQkJCQlQcm9jZXNzVXRpbC51cGRhdGVJRHMoYWRhcHRlckZhY3RvcnksIHByb2MpOwotCQkJCQkJCQl2aWV3ZXIucmVmcmVzaCgpOwotCQkJCQkJCQlpdGVtUHJvdmlkZXIuc2V0UmVmcmVzaEFsbElEc1JlcXVpcmVkKGZhbHNlKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJfSwgdHJ1ZSk7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRWaWV3ZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksIFByb2Nlc3MgcHJvYykgewotCQlyZXR1cm4gZG9HZXRWaWV3ZXIoYWRhcHRlckZhY3RvcnksIHByb2MpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJ1blNhZmVseShmaW5hbCBSdW5uYWJsZSBydW5uYWJsZSwgYm9vbGVhbiBzeW5jaHJvbm91cykgewotCQlEaXNwbGF5IGRpc3BsYXkgPSBudWxsOwotCQl0cnkgewotCQkJZGlzcGxheSA9IERpc3BsYXkuZ2V0Q3VycmVudCgpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLy8KLQkJfQotCQkKLQkJUnVubmFibGUgcnVubmVyID0gbmV3IFJ1bm5hYmxlKCkgewotCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJcnVubmFibGUucnVuKCk7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJTGlicmFyeUVkaXRVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkJfQotCQkJfQotCi0JCX07Ci0KLQkJaWYoZGlzcGxheSA9PSBudWxsKSB7Ci0JCQkvLyBjdXJyZW50IHRocmVhZCBpcyBub3QgYSB1c2VyLWludGVyZmFjZSB0aHJlYWQKLQkJCS8vCi0JCQl0cnkgewotCQkJCWRpc3BsYXkgPSBEaXNwbGF5LmdldERlZmF1bHQoKTsKLQkJCX0KLQkJCWNhdGNoKEV4Y2VwdGlvbiBlKSB7Ci0KLQkJCX0KLQkJCWlmKGRpc3BsYXkgIT0gbnVsbCkgewotCQkJCWlmKHN5bmNocm9ub3VzKSB7Ci0JCQkJCWRpc3BsYXkuc3luY0V4ZWMocnVubmVyKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWRpc3BsYXkuYXN5bmNFeGVjKHJ1bm5lcik7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJcnVubmVyLnJ1bigpOwotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJLy8gY3VycmVudCB0aHJlYWQgaXMgYSB1c2VyLWludGVyZmFjZSB0aHJlYWQKLQkJCS8vCi0JCQlpZihzeW5jaHJvbm91cykgewotCQkJCXJ1bm5lci5ydW4oKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWRpc3BsYXkuYXN5bmNFeGVjKHJ1bm5lcik7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBydW5XaXRoQnVzeUluZGljYXRvcihSdW5uYWJsZSBydW5uYWJsZSkgewotCQlCdXN5SW5kaWNhdG9yLnNob3dXaGlsZShEaXNwbGF5LmdldEN1cnJlbnQoKSwgcnVubmFibGUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJ1bkluVUkoZmluYWwgSVJ1bm5hYmxlV2l0aFByb2dyZXNzIHJ1bm5hYmxlLCBTdHJpbmcgdGFza05hbWUpIHsKLQkJU2hlbGwgc2hlbGwgPSAoU2hlbGwpIExpYnJhcnlFZGl0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRDb250ZXh0KCk7Ci0JCWlmIChzaGVsbCA9PSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCXJ1bm5hYmxlLnJ1bihuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJCQlyZXR1cm47Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCUxpYnJhcnlFZGl0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCQl0aHJvdyBuZXcgV3JhcHBlZEV4Y2VwdGlvbihlKTsKLQkJCX0KLQkJfQotCQlKb2Igam9iID0gbmV3IFdvcmtiZW5jaEpvYih0YXNrTmFtZSkgewotCi0JCQlwdWJsaWMgSVN0YXR1cyBydW5JblVJVGhyZWFkKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkJCW1vbml0b3IuYmVnaW5UYXNrKCIiLCBJUHJvZ3Jlc3NNb25pdG9yLlVOS05PV04pOyAvLyROT04tTkxTLTEkCi0JCQkJdHJ5IHsKLQkJCQkJcnVubmFibGUucnVuKG1vbml0b3IpOwotCQkJCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQkJCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKLQkJCQkJVGhyb3dhYmxlIGV4OwotCQkJCQlpZiAoZS5nZXRDYXVzZSgpICE9IG51bGwpIHsKLQkJCQkJCWV4ID0gZS5nZXRDYXVzZSgpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJZXggPSBlOwotCQkJCQl9Ci0JCQkJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIExpYnJhcnlFZGl0UGx1Z2luCi0JCQkJCQkJLmdldFBsdWdpbigpLmdldElkKCksIDAsIGV4LnRvU3RyaW5nKCksIGV4KTsKLQkJCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIExpYnJhcnlFZGl0UGx1Z2luCi0JCQkJCQkJLmdldFBsdWdpbigpLmdldElkKCksIDAsIGUudG9TdHJpbmcoKSwgZSk7Ci0JCQkJfSBmaW5hbGx5IHsKLQkJCQkJbW9uaXRvci5kb25lKCk7Ci0JCQkJfQotCQkJfQotCi0JCX07Ci0JCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0UHJvZ3Jlc3NTZXJ2aWNlKCkuc2hvd0luRGlhbG9nKHNoZWxsLCBqb2IpOwotCQlqb2Iuc2NoZWR1bGUoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvLmNsYXNzcGF0aCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDY1YWMwNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Ly5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Ly5vcHRpb25zIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC8ub3B0aW9ucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjRhYjExMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Ly5vcHRpb25zCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi0jIFR1cm4gb24gZGVidWcgdHJhY2UKLW9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvZGVidWc9dHJ1ZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC8ucHJvamVjdCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjNzBmYjUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQ8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9NRVRBLUlORi9NQU5JRkVTVC5NRiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlZWRjZWYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0OyBzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjUuMC5xdWFsaWZpZXIKLUJ1bmRsZS1DbGFzc1BhdGg6IC4KLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRQbHVnaW4KLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmVwZi5jb21tb247dmlzaWJpbGl0eTo9cmVleHBvcnQsCi0gb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0O3Zpc2liaWxpdHk6PXJlZXhwb3J0LAotIG9yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlczt2aXNpYmlsaXR5Oj1yZWV4cG9ydAotRWNsaXBzZS1MYXp5U3RhcnQ6IHRydWUKLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LAotIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY2F0ZWdvcnksCi0gb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLAotIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29uZmlndXJhdGlvbiwKLSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmVsZW1lbnQsCi0gb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pbnRlcm5hbCwKLSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLAotIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQubmF2aWdhdG9yLAotIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2VzcywKLSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZCwKLSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29uc29saWRhdGVkLAotIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5pbnRlcm5hbCwKLSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnVpLAotIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbCwKLSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwubW9kZWwsCi0gb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLm1vZGVsLmltcGwsCi0gb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLm1vZGVsLnV0aWwsCi0gb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLAotIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbi5pbnRlcm5hbAotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2J1aWxkLnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1OGIwODYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotc291cmNlLi4gPSBzcmMvCi1vdXRwdXQuLiA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IC4sXAotICAgICAgICAgICAgICAgLm9wdGlvbnMsXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIGljb25zLyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIHNjaGVtYS8KLQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9jaGVja2VkX2JveC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2NoZWNrZWRfYm94LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWNhY2I5Ni4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2NoZWNrZWRfYm94LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUFjdGl2aXR5X2JyZWFrZG93bkVsZW1lbnRzX0FjdGl2aXR5LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUFjdGl2aXR5X2JyZWFrZG93bkVsZW1lbnRzX0FjdGl2aXR5LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2YyMGRlYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVBY3Rpdml0eV9icmVha2Rvd25FbGVtZW50c19BY3Rpdml0eS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50RWxlbWVudF9jb25jZXB0c0FuZFBhcGVyc19Db25jZXB0LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRFbGVtZW50X2NvbmNlcHRzQW5kUGFwZXJzX0NvbmNlcHQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZGY4NGRhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRFbGVtZW50X2NvbmNlcHRzQW5kUGFwZXJzX0NvbmNlcHQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ3VzdG9tQ2F0ZWdvcnlfY2F0ZWdvcml6ZWRFbGVtZW50c19DdXN0b21DYXRlZ29yeS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDdXN0b21DYXRlZ29yeV9jYXRlZ29yaXplZEVsZW1lbnRzX0N1c3RvbUNhdGVnb3J5LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGY0Nzk4MC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDdXN0b21DYXRlZ29yeV9jYXRlZ29yaXplZEVsZW1lbnRzX0N1c3RvbUNhdGVnb3J5LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUN1c3RvbUNhdGVnb3J5X3N1YkNhdGVnb3JpZXNfQ3VzdG9tQ2F0ZWdvcnkuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ3VzdG9tQ2F0ZWdvcnlfc3ViQ2F0ZWdvcmllc19DdXN0b21DYXRlZ29yeS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmNDc5ODAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ3VzdG9tQ2F0ZWdvcnlfc3ViQ2F0ZWdvcmllc19DdXN0b21DYXRlZ29yeS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVEaXNjaXBsaW5lR3JvdXBpbmdfZGlzY2lwbGluZXNfRGlzY2lwbGluZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVEaXNjaXBsaW5lR3JvdXBpbmdfZGlzY2lwbGluZXNfRGlzY2lwbGluZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1YmQ0NzYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRGlzY2lwbGluZUdyb3VwaW5nX2Rpc2NpcGxpbmVzX0Rpc2NpcGxpbmUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJhY3RpY2Vfc3ViUHJhY3RpY2VfUHJhY3RpY2UuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJhY3RpY2Vfc3ViUHJhY3RpY2VfUHJhY3RpY2UuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NzIwOWNiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByYWN0aWNlX3N1YlByYWN0aWNlX1ByYWN0aWNlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVJvbGVTZXRHcm91cGluZ19yb2xlU2V0c19Sb2xlU2V0LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVJvbGVTZXRHcm91cGluZ19yb2xlU2V0c19Sb2xlU2V0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTA5OWZlYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVSb2xlU2V0R3JvdXBpbmdfcm9sZVNldHNfUm9sZVNldC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVXb3JrUHJvZHVjdF9lc3RpbWF0ZV9Fc3RpbWF0ZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVXb3JrUHJvZHVjdF9lc3RpbWF0ZV9Fc3RpbWF0ZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzNjQzZGEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlV29ya1Byb2R1Y3RfZXN0aW1hdGVfRXN0aW1hdGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L0FydGlmYWN0LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9BcnRpZmFjdC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwMWQyMTkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L0FydGlmYWN0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9DYXBhYmlsaXR5UGF0dGVybnMuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L0NhcGFiaWxpdHlQYXR0ZXJucy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3MTQ3NjUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L0NhcGFiaWxpdHlQYXR0ZXJucy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvQ2hlY2tsaXN0cy5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvQ2hlY2tsaXN0cy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4ZjZkOGIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L0NoZWNrbGlzdHMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L0NvbmNlcHRzLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Db25jZXB0cy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkZjg0ZGEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L0NvbmNlcHRzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Db25maWd1cmF0aW9ucy5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvQ29uZmlndXJhdGlvbnMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYTI0ZmRjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Db25maWd1cmF0aW9ucy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvQ29udGVudC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvQ29udGVudC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwYTMxMWUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L0NvbnRlbnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L0N1c3RvbUNhdGVnb3JpZXMuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L0N1c3RvbUNhdGVnb3JpZXMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2M2E1ZDdjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9DdXN0b21DYXRlZ29yaWVzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9EZWxpdmVyYWJsZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvRGVsaXZlcmFibGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYTEwNTYzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9EZWxpdmVyYWJsZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvRGVsaXZlcnlQcm9jZXNzZXMuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L0RlbGl2ZXJ5UHJvY2Vzc2VzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWYyNGE5YS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvRGVsaXZlcnlQcm9jZXNzZXMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L0Rpc2NpcGxpbmVzLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9EaXNjaXBsaW5lcy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1NTNjMWQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L0Rpc2NpcGxpbmVzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Eb21haW5zLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Eb21haW5zLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2YyODkyNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvRG9tYWlucy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZmM4NGU0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L0V4YW1wbGVzLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9FeGFtcGxlcy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiOTQ0ZmQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L0V4YW1wbGVzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Gb2xkZXIuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L0ZvbGRlci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2NDE5ZDguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L0ZvbGRlci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvR3VpZGFuY2VGb2xkZXIuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L0d1aWRhbmNlRm9sZGVyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2NiMTQxNy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvR3VpZGFuY2VGb2xkZXIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L01ldGhvZFBhY2thZ2VzLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9NZXRob2RQYWNrYWdlcy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjMzhjZTguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L01ldGhvZFBhY2thZ2VzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9PdXRjb21lLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9PdXRjb21lLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTcwMzUxOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvT3V0Y29tZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUGxhbm5pbmdUZW1wbGF0ZXMuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L1BsYW5uaW5nVGVtcGxhdGVzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmViNmVkMS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUGxhbm5pbmdUZW1wbGF0ZXMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L1ByYWN0aWNlcy5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUHJhY3RpY2VzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjcyMDljYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUHJhY3RpY2VzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Qcm9jZXNzLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Qcm9jZXNzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGVhYzU5Zi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUHJvY2Vzcy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUHJvY2Vzc0NvbnRyaWJ1dGlvbnMuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L1Byb2Nlc3NDb250cmlidXRpb25zLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDhkOGMyZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUHJvY2Vzc0NvbnRyaWJ1dGlvbnMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L1Byb2Nlc3NGYW1pbGllcy5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUHJvY2Vzc0ZhbWlsaWVzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGYxYmE2Yy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUHJvY2Vzc0ZhbWlsaWVzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Qcm9jZXNzZXMuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L1Byb2Nlc3Nlcy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4ZDhjMmQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L1Byb2Nlc3Nlcy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUmVwb3J0cy5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUmVwb3J0cy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1ZjNlMGMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L1JlcG9ydHMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L1JldXNhYmxlQXNzZXRzLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9SZXVzYWJsZUFzc2V0cy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1MmNmZmUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L1JldXNhYmxlQXNzZXRzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Sb2FkbWFwcy5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUm9hZG1hcHMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMTFiYzVkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Sb2FkbWFwcy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUm9sZXMuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L1JvbGVzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTRhM2Y2Ny4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUm9sZXMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L1N0YW5kYXJkQ2F0ZWdvcmllcy5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvU3RhbmRhcmRDYXRlZ29yaWVzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTY5ODM4Mi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvU3RhbmRhcmRDYXRlZ29yaWVzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9TdXBwb3J0aW5nTWF0ZXJpYWxzLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9TdXBwb3J0aW5nTWF0ZXJpYWxzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDVhMjFlYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvU3VwcG9ydGluZ01hdGVyaWFscy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvVGFza3MuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L1Rhc2tzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjM4YmQ4My4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvVGFza3MuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L1Rhc2tzX2Nmdi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvVGFza3NfY2Z2LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTU1M2MxZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvVGFza3NfY2Z2LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9UZWNobmlxdWVzLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9UZWNobmlxdWVzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzY4NjZkOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvVGVjaG5pcXVlcy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvVGVtcGxhdGVzLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9UZW1wbGF0ZXMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNzYzMjUxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9UZW1wbGF0ZXMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L1Rlcm1EZWZpbml0aW9ucy5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvVGVybURlZmluaXRpb25zLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTIxYmZlMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvVGVybURlZmluaXRpb25zLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Ub29sTWVudG9ycy5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvVG9vbE1lbnRvcnMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZjFiODVhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Ub29sTWVudG9ycy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvVG9vbHMuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L1Rvb2xzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTI0ZjhlMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvVG9vbHMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L1doaXRlcGFwZXJzLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9XaGl0ZXBhcGVycy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1YjQ4MDAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L1doaXRlcGFwZXJzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Xb3JrUHJvZHVjdEd1aWRlbGluZXMuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L1dvcmtQcm9kdWN0R3VpZGVsaW5lcy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1N2ZhNjUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L1dvcmtQcm9kdWN0R3VpZGVsaW5lcy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvV29ya1Byb2R1Y3RUeXBlcy5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvV29ya1Byb2R1Y3RUeXBlcy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmMjg5MjYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L1dvcmtQcm9kdWN0VHlwZXMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L1dvcmtQcm9kdWN0cy5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvV29ya1Byb2R1Y3RzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2YyODkyNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvV29ya1Byb2R1Y3RzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9lbXB0eV9wYWNrX29iai5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvZW1wdHlfcGFja19vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjODgyODRhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9lbXB0eV9wYWNrX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvcGFja2FnZV9vYmouZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L3BhY2thZ2Vfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTMxYzI4ZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvcGFja2FnZV9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L3Byb2Nmb2xkX29iai5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvcHJvY2ZvbGRfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDQ4ZTI3MS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvcHJvY2ZvbGRfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi90b29sc2V0LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi90b29sc2V0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTI0ZjhlMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvdG9vbHNldC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL3VuY2hlY2tlZF9ib3guZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy91bmNoZWNrZWRfYm94LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjZiOWY4YS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL3VuY2hlY2tlZF9ib3guZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9wbHVnaW4ucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwOWRmZjcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDkwICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSCi0KLSMgUGx1Zy1pbgotcGx1Z2luTmFtZT1FUEYgTGlicmFyeSBFZGl0Ci1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKLQotX1VJX0NvbnRlbnRfZ3JvdXA9TWV0aG9kIENvbnRlbnQKLQotX1VJX0Rpc2NpcGxpbmVzX2dyb3VwPURpc2NpcGxpbmVzCi1fVUlfRG9tYWluc19ncm91cD1Eb21haW5zCi1fVUlfV29ya1Byb2R1Y3RUeXBlc19ncm91cD1Xb3JrIFByb2R1Y3QgS2luZHMKLV9VSV9Sb2xlX1NldHNfZ3JvdXA9Um9sZSBTZXRzCi1fVUlfVG9vbHNfZ3JvdXA9VG9vbHMKLV9VSV9TdGFuZGFyZF9DYXRlZ29yaWVzX2dyb3VwPVN0YW5kYXJkIENhdGVnb3JpZXMKLV9VSV9DdXN0b21fQ2F0ZWdvcmllc19ncm91cD1DdXN0b20gQ2F0ZWdvcmllcwotX1VJX01ldGhvZENvbnRlbnRfZ3JvdXA9Q29udGVudCBQYWNrYWdlcwotCi1fVUlfUHJvY2Vzc2VzX2dyb3VwPVByb2Nlc3NlcwotX1VJX1BsYW5uaW5nVGVtcGxhdGVzX2dyb3VwPVBsYW5uaW5nIFRlbXBsYXRlcwotCi1fVUlfQ2FwYWJpbGl0eVBhdHRlcm5zX3RleHQ9Q2FwYWJpbGl0eSBQYXR0ZXJucwotX1VJX0RlbGl2ZXJ5UHJvY2Vzc2VzX3RleHQ9RGVsaXZlcnkgUHJvY2Vzc2VzCi1fVUlfUHJvY2Vzc0NvbnRyaWJ1dGlvbnNfdGV4dD1EaWZmZXJlbnRpYWwgUHJvY2Vzc2VzCi1fVUlfUGxhbm5pbmdUZW1wbGF0ZXNfdGV4dD1QbGFubmluZyBUZW1wbGF0ZXMKLQotX1VJX0NhcGFiaWxpdHlQYXR0ZXJuX3RleHQ9Q2FwYWJpbGl0eSBQYXR0ZXJuCi1fVUlfRGVsaXZlcnlQcm9jZXNzX3RleHQ9RGVsaXZlcnkgUHJvY2VzcwotX1VJX1Byb2Nlc3NDb250cmlidXRpb25fdGV4dD1EaWZmZXJlbnRpYWwgUHJvY2VzcwotCi1fVUlfQ29uZmlndXJhdGlvbnNfdGV4dD1Db25maWd1cmF0aW9ucwotCi1fVUlfUHJvY2Vzc0ZhbWlsaWVzX3RleHQ9UHJvY2VzcyBGYW1pbGllcwotCi1fVUlfVW5jYXRlZ29yaXplZF90ZXh0PVVuY2F0ZWdvcml6ZWQKLV9VSV9VbmNhdGVnb3JpemVkX1Rhc2tzX3RleHQ9VW5jYXRlZ29yaXplZCBUYXNrcwotX1VJX1VuY2F0ZWdvcml6ZWRfUm9sZXNfdGV4dD1VbmNhdGVnb3JpemVkIFJvbGVzCi0KLV9VSV9HdWlkYW5jZXNfZ3JvdXA9R3VpZGFuY2UKLV9VSV9HdWlkYW5jZXNfQ2hlY2tsaXN0cz1DaGVja2xpc3RzCi1fVUlfR3VpZGFuY2VzX0NvbmNlcHRzPUNvbmNlcHRzCi1fVUlfR3VpZGFuY2VzX0V4YW1wbGVzPUV4YW1wbGVzCi1fVUlfR3VpZGFuY2VzX0VzdGltYXRpb25Db25zaWRlcmF0aW9ucz1Fc3RpbWF0aW9uIENvbnNpZGVyYXRpb25zCi1fVUlfR3VpZGFuY2VzX1ByYWN0aWNlcz1QcmFjdGljZXMKLV9VSV9HdWlkYW5jZXNfUmVwb3J0cz1SZXBvcnRzCi1fVUlfR3VpZGFuY2VzX1JldXNhYmxlQXNzZXRzPVJldXNhYmxlIEFzc2V0cwotX1VJX0d1aWRhbmNlc19Sb2FkbWFwPVJvYWRtYXAKLV9VSV9HdWlkYW5jZXNfU3VwcG9ydGluZ01hdGVyaWFscz1TdXBwb3J0aW5nIE1hdGVyaWFscwotX1VJX0d1aWRhbmNlc19UZWNobmlxdWVzPVRlY2huaXF1ZXMKLV9VSV9HdWlkYW5jZXNfVGVtcGxhdGVzPVRlbXBsYXRlcwotX1VJX0d1aWRhbmNlc19UZXJtRGVmaW5pdGlvbnM9VGVybSBEZWZpbml0aW9ucwotX1VJX0d1aWRhbmNlc19Ub29sTWVudG9ycz1Ub29sIE1lbnRvcnMKLV9VSV9HdWlkYW5jZXNfV2hpdGVwYXBlcnM9V2hpdGVwYXBlcnMKLV9VSV9HdWlkYW5jZXNfV29ya1Byb2R1Y3RHdWlkZWxpbmVzPUd1aWRlbGluZXMKLV9VSV9LZXlfQ29uY2VwdHM9S2V5IENvbmNlcHRzCi0KLQotX1VJX1JvbGVzX2dyb3VwPVJvbGVzCi1fVUlfVGFza3NfZ3JvdXA9VGFza3MKLV9VSV9Xb3JrUHJvZHVjdHNfZ3JvdXA9V29yayBQcm9kdWN0cwotX1VJX0FjdGl2aXRpZXNfZ3JvdXA9QWN0aXZpdGllcwotCi0jIEJyZWFrZG93biBzdHJ1Y3R1cmUgY29sdW1uIGRpc3BsYXkgbmFtZXMKLUJTX0NvbHVtbl9uYW1lPU5hbWUKLUJTX0NvbHVtbl9wcmVmaXg9UHJlZml4Ci1CU19Db2x1bW5faWQ9SW5kZXgKLUJTX0NvbHVtbl9wcmVkZWNlc3NvcnM9UHJlZGVjZXNzb3JzCi1CU19Db2x1bW5faXNfcmVwZWF0YWJsZT1SZXBlYXRhYmxlCi1CU19Db2x1bW5faXNfb25nb2luZz1PbmdvaW5nCi1CU19Db2x1bW5faXNfZXZlbnRfZHJpdmVuPUV2ZW50LURyaXZlbgotQlNfQ29sdW1uX2VudHJ5X3N0YXRlPUVudHJ5IFN0YXRlCi1CU19Db2x1bW5fZXhpdF9zdGF0ZT1FeGl0IFN0YXRlCi1CU19Db2x1bW5fdGVhbXM9VGVhbQotQlNfQ29sdW1uX3R5cGU9VHlwZQotQlNfQ29sdW1uX21vZGVsX2luZm89TW9kZWwgSW5mbwotQlNfQ29sdW1uX3ByZXNlbnRhdGlvbl9uYW1lPVByZXNlbnRhdGlvbiBOYW1lCi1CU19Db2x1bW5fZGVsaXZlcmFibGU9RGVsaXZlcmFibGUKLUJTX0NvbHVtbl9pc19vcHRpb25hbD1PcHRpb25hbAotQlNfQ29sdW1uX2lzX3BsYW5uZWQ9UGxhbm5lZAotQlNfQ29sdW1uX2hhc19tdWx0aXBsZV9vY2N1cnJlbmNlcz1NdWx0aXBsZSBPY2N1cnJlbmNlcwotCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3BsdWdpbi54bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmYWU0MjIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTxwbHVnaW4+Ci0gICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJ0ZXh0UmVmZXJlbmNlUmVwbGFjZXIiIG5hbWU9IlRleHQgUmVmZXJlbmNlIFJlcGxhY2VyIiBzY2hlbWE9InNjaGVtYS90ZXh0UmVmZXJlbmNlUmVwbGFjZXIuZXhzZCIvPgotICAgPGV4dGVuc2lvbi1wb2ludCBpZD0iZGlhZ3JhbU1hbmFnZXIiIG5hbWU9IkRpYWdyYW0gTWFuYWdlciIgc2NoZW1hPSJzY2hlbWEvZGlhZ3JhbU1hbmFnZXIuZXhzZCIvPgotICAgPGV4dGVuc2lvbi1wb2ludCBpZD0iY29tbWFuZExpc3RlbmVycyIgbmFtZT0iQ29tbWFuZCBMaXN0ZW5lcnMiIHNjaGVtYT0ic2NoZW1hL2NvbW1hbmRMaXN0ZW5lcnMuZXhzZCIvPgotICAgPGV4dGVuc2lvbi1wb2ludCBpZD0ibGlicmFyeUluc3BlY3RvciIgbmFtZT0iTGlicmFyeSBJbnNwZWN0b3IiIHNjaGVtYT0ic2NoZW1hL2xpYnJhcnlJbnNwZWN0b3IuZXhzZCIvPgotICAgPGV4dGVuc2lvbi1wb2ludCBpZD0ibmVzdGVkQ29tbWFuZFByb3ZpZGVycyIgbmFtZT0iTmVzdGVkIENvbW1hbmQgUHJvdmlkZXJzIiBzY2hlbWE9InNjaGVtYS9uZXN0ZWRDb21tYW5kUHJvdmlkZXJzLmV4c2QiLz4KLSAgIDxleHRlbnNpb24tcG9pbnQgaWQ9Im9wcG9zaXRlRmVhdHVyZUxvYWRlcnMiIG5hbWU9Ik9wcG9zaXRlRmVhdHVyZSBMb2FkZXJzIiBzY2hlbWE9InNjaGVtYS9vcHBvc2l0ZUZlYXR1cmVMb2FkZXJzLmV4c2QiLz4KLSAgIDxleHRlbnNpb24tcG9pbnQgaWQ9InVzZXJJbnRlcmFjdGlvbkhhbmRsZXIiIG5hbWU9IlVzZXIgSW50ZXJhY3Rpb24gSGFuZGxlciIgc2NoZW1hPSJzY2hlbWEvdXNlckludGVyYWN0aW9uSGFuZGxlci5leHNkIi8+Ci0gICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJ2YWxpZGF0aW9uU3VwcG9ydCIgbmFtZT0iVmFsaWRhdGlvbiBTdXBwb3J0IiBzY2hlbWE9InNjaGVtYS92YWxpZGF0aW9uU3VwcG9ydC5leHNkIi8+Ci0gICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJ1aUhlbHBlciIgbmFtZT0iVUkgSGVscGVyIiBzY2hlbWE9InNjaGVtYS91aUhlbHBlci5leHNkIi8+Ci0gICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJhZGFwdGVyRmFjdG9yaWVzIiBuYW1lPSJBZGFwdGVyIEZhY3RvcmllcyIgc2NoZW1hPSJzY2hlbWEvYWRhcHRlckZhY3Rvcmllcy5leHNkIi8+Ci0KLSAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLmdlbmVyYXRlZF9wYWNrYWdlIj4KLSAgICA8cGFja2FnZSAKLSAgICAgICB1cmkgPSAiaHR0cDovLy9jb20vaWJtL3VtYS9lZGl0L3RuZy91dGlsL21vZGVsLmVjb3JlIiAKLSAgICAgICBjbGFzcyA9ICJvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwubW9kZWwuTW9kZWxQYWNrYWdlIiAvPgotICA8L2V4dGVuc2lvbj4KLQotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NjaGVtYS9hZGFwdGVyRmFjdG9yaWVzLmV4c2QgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NjaGVtYS9hZGFwdGVyRmFjdG9yaWVzLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjYmM4MjEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zY2hlbWEvYWRhcHRlckZhY3Rvcmllcy5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTEyICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQiPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQiIGlkPSJhZGFwdGVyRmFjdG9yaWVzIiBuYW1lPSJBZGFwdGVyIEZhY3RvcmllcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgZGVzY3JpcHRpb24gb2YgdGhpcyBleHRlbnNpb24gcG9pbnQuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJmYWN0b3J5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImZhY3RvcnkiPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIGtpbmQ9ImphdmEiIGJhc2VkT249IjpvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgdGhlIGZpcnN0IHJlbGVhc2UgaW4gd2hpY2ggdGhpcyBleHRlbnNpb24gcG9pbnQgYXBwZWFycy5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBleHRlbnNpb24gcG9pbnQgdXNhZ2UgZXhhbXBsZSBoZXJlLl0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgQVBJIGluZm9ybWF0aW9uIGhlcmUuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgaW5mb3JtYXRpb24gYWJvdXQgc3VwcGxpZWQgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBleHRlbnNpb24gcG9pbnQuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zY2hlbWEvY29tbWFuZExpc3RlbmVycy5leHNkIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zY2hlbWEvY29tbWFuZExpc3RlbmVycy5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YTNhNzA1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc2NoZW1hL2NvbW1hbmRMaXN0ZW5lcnMuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDEwNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Ij4KLTxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0IiBpZD0iY29tbWFuZExpc3RlbmVycyIgbmFtZT0iQ29tbWFuZCBMaXN0ZW5lcnMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImNvbW1hbmRMaXN0ZW5lciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJjb21tYW5kTGlzdGVuZXIiPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgSmF2YSBjbGFzcyB0aGF0IGltcGxlbWVudHMgYSBtaWdyYXRvci4gVGhpcyBjbGFzcyBtdXN0IGJlIGEgcHVibGljIGltcGxlbWVudGF0aW9uIG9mICZsdDtjb2RlJmd0O29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUNvbW1hbmRMaXN0ZW5lciZsdDsvY29kZSZndDsgd2l0aCBhIHB1YmxpYyAwLWFyZ3VtZW50IGNvbnN0cnVjdG9yLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUga2luZD0iamF2YSIgYmFzZWRPbj0ib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JQ29tbWFuZExpc3RlbmVyIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIDEuMAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgZXh0ZW5zaW9uIHBvaW50IHVzYWdlIGV4YW1wbGUgaGVyZS5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JQ29tbWFuZExpc3RlbmVyCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBpbmZvcm1hdGlvbiBhYm91dCBzdXBwbGllZCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGV4dGVuc2lvbiBwb2ludC5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuJmx0O2JyJmd0OwotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgJmx0O2EgCi1ocmVmPSZxdW90O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJnF1b3Q7Jmd0O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJmx0Oy9hJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc2NoZW1hL2RpYWdyYW1NYW5hZ2VyLmV4c2QgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NjaGVtYS9kaWFncmFtTWFuYWdlci5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMzc1N2E5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc2NoZW1hL2RpYWdyYW1NYW5hZ2VyLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMDIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdCI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdCIgaWQ9ImRpYWdyYW1NYW5hZ2VyIiBuYW1lPSJEaWFncmFtIE1hbmFnZXIiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIGRlc2NyaXB0aW9uIG9mIHRoaXMgZXh0ZW5zaW9uIHBvaW50Ll0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxjaG9pY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImRpYWdyYW1NYW5hZ2VyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgICAgICAgPC9jaG9pY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSB0cmFuc2xhdGFibGU9InRydWUiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0iZGlhZ3JhbU1hbmFnZXIiPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIHRoZSBmaXJzdCByZWxlYXNlIGluIHdoaWNoIHRoaXMgZXh0ZW5zaW9uIHBvaW50IGFwcGVhcnMuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgZXh0ZW5zaW9uIHBvaW50IHVzYWdlIGV4YW1wbGUgaGVyZS5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIEFQSSBpbmZvcm1hdGlvbiBoZXJlLl0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIGluZm9ybWF0aW9uIGFib3V0IHN1cHBsaWVkIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgZXh0ZW5zaW9uIHBvaW50Ll0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc2NoZW1hL2xpYnJhcnlJbnNwZWN0b3IuZXhzZCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc2NoZW1hL2xpYnJhcnlJbnNwZWN0b3IuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWQyMTFhZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NjaGVtYS9saWJyYXJ5SW5zcGVjdG9yLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdCI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdCIgaWQ9ImxpYnJhcnlJbnNwZWN0b3IiIG5hbWU9IkxpYnJhcnkgSW5zcGVjdG9yIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIEluc3BlY3QgY29udGVudHMgb2YgbGliYXJ5IGZvciBkZWJ1ZyBvciB0ZXN0aW5nIHB1cnBvc2UuIFRoZSBpbnRlbnRpb24gaXMgdG8gcHJvdmlkZSBhIGNvbnZlaWVudCBwbGFjZSB0byBob29rIGFueSBleHRlcm5hbCBkZWJ1ZyBvciB0ZXN0aW5nIGltcGxlbWVudGF0aW9uIHRoYXQgaXMgbm90IHBhcnQgb2YgRVBGLgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGNob2ljZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0ibGlicmFyeUluc3BlY3RvciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICAgICAgIDwvY2hvaWNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImxpYnJhcnlJbnNwZWN0b3IiPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgMS4wCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5JTGlicmFyeUluc3BlY3RvcgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4mbHQ7YnImZ3Q7Ci1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAmbHQ7YSAKLWhyZWY9JnF1b3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmcXVvdDsmZ3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmbHQ7L2EmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zY2hlbWEvbmVzdGVkQ29tbWFuZFByb3ZpZGVycy5leHNkIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zY2hlbWEvbmVzdGVkQ29tbWFuZFByb3ZpZGVycy5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOWQ5MzdiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc2NoZW1hL25lc3RlZENvbW1hbmRQcm92aWRlcnMuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDEwNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Ij4KLTxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0IiBpZD0ibmVzdGVkQ29tbWFuZFByb3ZpZGVycyIgbmFtZT0iTmVzdGVkIENvbW1hbmQgUHJvdmlkZXJzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFByb3ZpZGVycyBvZiBuZXN0ZWQgY29tbWFuZHMgdG8gZXhlY3V0ZSByaWdodCBhZnRlciB0aGUgZXhlY3V0aW9uIG9mIHRoZSBtYWluIGNvbW1hbmQuIFRoZSBleHRlbnNpb24gbXVzdCBpbXBsZW1lbnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklOZXN0ZWRDb21tYW5kUHJvdmlkZXIKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0ibmVzdGVkQ29tbWFuZFByb3ZpZGVyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9Im5lc3RlZENvbW1hbmRQcm92aWRlciI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUga2luZD0iamF2YSIgYmFzZWRPbj0ib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklOZXN0ZWRDb21tYW5kUHJvdmlkZXIiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIHRoZSBmaXJzdCByZWxlYXNlIGluIHdoaWNoIHRoaXMgZXh0ZW5zaW9uIHBvaW50IGFwcGVhcnMuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgZXh0ZW5zaW9uIHBvaW50IHVzYWdlIGV4YW1wbGUgaGVyZS5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIEFQSSBpbmZvcm1hdGlvbiBoZXJlLl0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIGluZm9ybWF0aW9uIGFib3V0IHN1cHBsaWVkIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgZXh0ZW5zaW9uIHBvaW50Ll0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc2NoZW1hL29wcG9zaXRlRmVhdHVyZUxvYWRlcnMuZXhzZCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc2NoZW1hL29wcG9zaXRlRmVhdHVyZUxvYWRlcnMuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDVjYTllYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NjaGVtYS9vcHBvc2l0ZUZlYXR1cmVMb2FkZXJzLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMDIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdCI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdCIgaWQ9Im9wcG9zaXRlRmVhdHVyZUxvYWRlcnMiIG5hbWU9Ik9wcG9zaXRlRmVhdHVyZSBMb2FkZXJzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBkZXNjcmlwdGlvbiBvZiB0aGlzIGV4dGVuc2lvbiBwb2ludC5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9Im9wcG9zaXRlRmVhdHVyZUxvYWRlciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJvcHBvc2l0ZUZlYXR1cmVMb2FkZXIiPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIHRoZSBmaXJzdCByZWxlYXNlIGluIHdoaWNoIHRoaXMgZXh0ZW5zaW9uIHBvaW50IGFwcGVhcnMuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgZXh0ZW5zaW9uIHBvaW50IHVzYWdlIGV4YW1wbGUgaGVyZS5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIEFQSSBpbmZvcm1hdGlvbiBoZXJlLl0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIGluZm9ybWF0aW9uIGFib3V0IHN1cHBsaWVkIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgZXh0ZW5zaW9uIHBvaW50Ll0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc2NoZW1hL3RleHRSZWZlcmVuY2VSZXBsYWNlci5leHNkIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zY2hlbWEvdGV4dFJlZmVyZW5jZVJlcGxhY2VyLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzMDlkM2YuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zY2hlbWEvdGV4dFJlZmVyZW5jZVJlcGxhY2VyLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdCI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdCIgaWQ9InRleHRSZWZlcmVuY2VSZXBsYWNlciIgbmFtZT0iVGV4dCBSZWZlcmVuY2UgUmVwbGFjZXIiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgUmVwbGFjZXMgdGV4dHVhbCByZWZlcmVuY2VzIHRvIHRoZSBvbGQgb2JqZWN0cyB3aXRoIHJlZmVyZW5jZXMgdG8gbmV3IG9iamVjdHMKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxjaG9pY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9InRleHRSZWZlcmVuY2VSZXBsYWNlciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICAgICAgIDwvY2hvaWNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9InRleHRSZWZlcmVuY2VSZXBsYWNlciI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSBKYXZhIGNsYXNzIHRoYXQgaW1wbGVtZW50cyBhIG1pZ3JhdG9yLiBUaGlzIGNsYXNzIG11c3QgYmUgYSBwdWJsaWMgaW1wbGVtZW50YXRpb24gb2YgJmx0O2NvZGUmZ3Q7b3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLklUZXh0UmVmZXJlbmNlUmVwbGFjZXImbHQ7L2NvZGUmZ3Q7IHdpdGggYSBwdWJsaWMgMC1hcmd1bWVudCBjb25zdHJ1Y3Rvci4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgMS4wCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5JVGV4dFJlZmVyZW5jZVJlcGxhY2VyCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiZsdDticiZndDsKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICZsdDthIAotaHJlZj0mcXVvdDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZxdW90OyZndDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZsdDsvYSZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotPC9zY2hlbWE+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NjaGVtYS91aUhlbHBlci5leHNkIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zY2hlbWEvdWlIZWxwZXIuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzRkZTgzMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NjaGVtYS91aUhlbHBlci5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTA3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQiPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQiIGlkPSJ1aUhlbHBlciIgbmFtZT0iVUkgSGVscGVyIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIEV4dGVuc2lvbiBwb2ludCB0byBwcm92aWRlIGltcGxlbWVudGF0aW9uIG9mIHNvbWUgVUktc3BlY2lmaWMgb3BlcmF0aW9ucy9mdW5jdGlvbnMKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxjaG9pY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9InVpSGVscGVyIi8+Ci0gICAgICAgICA8L2Nob2ljZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJ1aUhlbHBlciI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUga2luZD0iamF2YSIgYmFzZWRPbj0iOm9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudWkuSVVJSGVscGVyIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIDEuNQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnVpLklVSUhlbHBlcgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4mbHQ7YnImZ3Q7Ci1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAmbHQ7YSAKLWhyZWY9JnF1b3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmcXVvdDsmZ3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmbHQ7L2EmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zY2hlbWEvdXNlckludGVyYWN0aW9uSGFuZGxlci5leHNkIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zY2hlbWEvdXNlckludGVyYWN0aW9uSGFuZGxlci5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZTMxNjgxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc2NoZW1hL3VzZXJJbnRlcmFjdGlvbkhhbmRsZXIuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDEwMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Ij4KLTxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0IiBpZD0idXNlckludGVyYWN0aW9uSGFuZGxlciIgbmFtZT0iVXNlciBJbnRlcmFjdGlvbiBIYW5kbGVyIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIEV4dGVuc2lvbiBwb2ludCB0byBpbnRlcmFjdCB3aXRoIHVzZXIKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxjaG9pY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9InVzZXJJbnRlcmFjdGlvbkhhbmRsZXIiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgICAgICA8L2Nob2ljZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJ1c2VySW50ZXJhY3Rpb25IYW5kbGVyIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIGEgcHVibGljIGNsYXNzIHRoYXQgaW1wbGVtZW50cyBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSVVzZXJJbnRlcmFjdGlvbkhhbmRsZXIuIFRoaXMgY2xhc3MgbXVzdCBoYXZlIGEgcHVibGljIGRlZmF1bHQgbm9uLWFyZ3VtZW50IGNvbnN0cnVjdG9yLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAxLjEKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklVc2VySW50ZXJhY3Rpb25IYW5kbGVyCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zY2hlbWEvdmFsaWRhdGlvblN1cHBvcnQuZXhzZCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc2NoZW1hL3ZhbGlkYXRpb25TdXBwb3J0LmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzOWRkYTUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zY2hlbWEvdmFsaWRhdGlvblN1cHBvcnQuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDEyMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Ij4KLTxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0IiBpZD0idmFsaWRhdGlvblN1cHBvcnQiIG5hbWU9IlZhbGlkYXRpb24gU3VwcG9ydCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBTdXBwb3J0cyBjb250cmlidXRpb24vcmVwbGFjZW1lbnQgb2YgdmFsaWRhdG9ycwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJ2YWxpZGF0aW9uRmFjdG9yeSIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJ2YWxpZGF0aW9uRmFjdG9yeSI+Ci0gICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgPG1ldGEuZWxlbWVudCBsYWJlbEF0dHJpYnV0ZT0iY2xhc3MiLz4KLSAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgRnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgYSBjbGFzcyB0aGF0IGltcGxlbWVudHMgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLklWYWxpZGF0b3JGYWN0b3J5Ci0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJqYXZhIiBiYXNlZE9uPSJvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb24uSVZhbGlkYXRvckZhY3RvcnkiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJyZXBsYWNlIiB0eXBlPSJib29sZWFuIiB1c2U9ImRlZmF1bHQiIHZhbHVlPSJmYWxzZSI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhpcyBhdHRyaWJ1dGUgaWYgc2V0IHRvICZsdDtjb2RlJmd0O3RydWUmbHQ7L2NvZGUmZ3Q7IHdpbGwgcmVwbGFjZSBhbnkgb3RoZXIgZXhpc3RpbmcgdmFsaWRhdGlvbiBmYWN0b3J5IGluIHRoZSBzeXN0ZW0uIEl0IGlzICZsdDtjb2RlJmd0O2ZhbHNlJmx0Oy9jb2RlJmd0OyBieSBkZWZhdWx0LgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAxLjEKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIGV4dGVuc2lvbiBwb2ludCB1c2FnZSBleGFtcGxlIGhlcmUuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBBUEkgaW5mb3JtYXRpb24gaGVyZS5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBpbmZvcm1hdGlvbiBhYm91dCBzdXBwbGllZCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGV4dGVuc2lvbiBwb2ludC5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuJmx0O2JyJmd0OwotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZQotYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzCi10aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAmbHQ7YSAKLWhyZWY9JnF1b3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmcXVvdDsmZ3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmbHQ7L2EmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9GZWF0dXJlVmFsdWVXcmFwcGVySXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L0ZlYXR1cmVWYWx1ZVdyYXBwZXJJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWI2ZDA3YS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L0ZlYXR1cmVWYWx1ZVdyYXBwZXJJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkRlbGVnYXRpbmdXcmFwcGVySXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklXcmFwcGVySXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLQotLyoqCi0gKiBBIHN1YmNsYXNzIG9mIERlbGVnYXRpbmdXcmFwcGVySXRlbVByb3ZpZGVyIHRoYXQga2VlcHMgYSByZWZlcmVuY2UgdG8gdGhlCi0gKiBjb250YWluaW5nIGZlYXR1cmUgb2YgdGhlIHdyYXBwZWQgdmFsdWUgYW5kIGltcGxlbWVudHMgQ29tcGFyYWJsZSB0byBzdXBwb3J0Ci0gKiBzb3J0aW5nLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRmVhdHVyZVZhbHVlV3JhcHBlckl0ZW1Qcm92aWRlciBleHRlbmRzCi0JCURlbGVnYXRpbmdXcmFwcGVySXRlbVByb3ZpZGVyIGltcGxlbWVudHMgQ29tcGFyYWJsZSB7Ci0KLQlwdWJsaWMgRmVhdHVyZVZhbHVlV3JhcHBlckl0ZW1Qcm92aWRlcihFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwKLQkJCU9iamVjdCB2YWx1ZSwgT2JqZWN0IG93bmVyLCBBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcih2YWx1ZSwgb3duZXIsIGZlYXR1cmUsIENvbW1hbmRQYXJhbWV0ZXIuTk9fSU5ERVgsIGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQlwdWJsaWMgRVN0cnVjdHVyYWxGZWF0dXJlIGdldEZlYXR1cmUoKSB7Ci0JCXJldHVybiBmZWF0dXJlOwotCX0JCQotCi0JcHVibGljIExpc3QgZ2V0Tm90aWZ5Q2hhbmdlZExpc3RlbmVycygpIHsKLQkJaWYoY2hhbmdlTm90aWZpZXIgaW5zdGFuY2VvZiBDb2xsZWN0aW9uKSB7Ci0JCQlyZXR1cm4gbmV3IEFycmF5TGlzdCgoQ29sbGVjdGlvbikgY2hhbmdlTm90aWZpZXIpOwotCQl9Ci0JCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5EZWxlZ2F0aW5nV3JhcHBlckl0ZW1Qcm92aWRlciNjcmVhdGVXcmFwcGVyKGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5PYmplY3QsIG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5KQotCSAqLwotCXByb3RlY3RlZCBJV3JhcHBlckl0ZW1Qcm92aWRlciBjcmVhdGVXcmFwcGVyKE9iamVjdCB2YWx1ZSwgT2JqZWN0IG93bmVyLCBBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlyZXR1cm4gbmV3IEZlYXR1cmVWYWx1ZVdyYXBwZXJJdGVtUHJvdmlkZXIobnVsbCwgVG5nVXRpbC51bndyYXAodmFsdWUpLCBvd25lciwgYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIEZpbGxzIHRoZSBnaXZlbiB3cmFwcGVycyBieSBrZWVwaW5nIGV4aXN0aW5nLCByZW1vdmluZy9kaXNwb3NlIG9sZCwgYW5kCi0JICogYWRkaW5nIG5ldyBvbmVzLgotCSAqIAotCSAqIEBwYXJhbSB3cmFwcGVycwotCSAqIEBwYXJhbSBmZWF0dXJlCi0JICogQHBhcmFtIHZhbHVlcwotCSAqIEBwYXJhbSBvd25lcgotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBmaWxsKENvbGxlY3Rpb24gd3JhcHBlcnMsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLAotCQkJQ29sbGVjdGlvbiB2YWx1ZXMsIE9iamVjdCBvd25lciwgQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gd3JhcHBlcnMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlGZWF0dXJlVmFsdWVXcmFwcGVySXRlbVByb3ZpZGVyIHdyYXBwZXIgPSAoRmVhdHVyZVZhbHVlV3JhcHBlckl0ZW1Qcm92aWRlcikgaXRlcgotCQkJCQkubmV4dCgpOwotCQkJaWYgKCF2YWx1ZXMucmVtb3ZlKHdyYXBwZXIuZ2V0VmFsdWUoKSkpIHsKLQkJCQlpdGVyLnJlbW92ZSgpOwotCQkJCXdyYXBwZXIuZGlzcG9zZSgpOwotCQkJfQotCQl9Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHZhbHVlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCXdyYXBwZXJzLmFkZChuZXcgRmVhdHVyZVZhbHVlV3JhcHBlckl0ZW1Qcm92aWRlcihmZWF0dXJlLCBpdGVyCi0JCQkJCS5uZXh0KCksIG93bmVyLCBhZGFwdGVyRmFjdG9yeSkpOwotCQl9Ci0JfQotCi0JcHVibGljIGludCBjb21wYXJlVG8oT2JqZWN0IG8pIHsKLQkJT2JqZWN0IG90aGVyVmFsdWUgPSAoKElXcmFwcGVySXRlbVByb3ZpZGVyKSBvKS5nZXRWYWx1ZSgpOwotCQlpZiAoISh2YWx1ZSBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpCi0JCQkJfHwgIShvdGhlclZhbHVlIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkpCi0JCQlyZXR1cm4gMDsKLQkJcmV0dXJuICgoTWV0aG9kRWxlbWVudCkgdmFsdWUpLmdldE5hbWUoKS5jb21wYXJlVG8oCi0JCQkJKChNZXRob2RFbGVtZW50KSBvdGhlclZhbHVlKS5nZXROYW1lKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIGZpcmVOb3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJc3VwZXIuZmlyZU5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvSUFkYXB0ZXJGYWN0b3J5UHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvSUFkYXB0ZXJGYWN0b3J5UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmEzNTNmNy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L0lBZGFwdGVyRmFjdG9yeVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAgMS4xCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUFkYXB0ZXJGYWN0b3J5UHJvdmlkZXIgewotCS8qKgotCSAqIEdldHMgYWRhcHRlciBmYWN0b3J5IGZvciB3b3JrIGJyZWFrZG93biBzdHJ1Y3R1cmUuCi0JICogCi0JICogQHJldHVybgotCSAqLwotCUFkYXB0ZXJGYWN0b3J5IGdldFdCU0FkYXB0ZXJGYWN0b3J5KCk7Ci0KLQkvKioKLQkgKiBHZXRzIGFkYXB0ZXIgZmFjdG9yeSBmb3IgdGVhbSB1c2FnZQotCSAqIAotCSAqIEByZXR1cm4KLQkgKi8KLQlBZGFwdGVyRmFjdG9yeSBnZXRUQlNBZGFwdGVyRmFjdG9yeSgpOwotCi0JLyoqCi0JICogR2V0cyBhZGFwdGVyIGZhY3RvcnkgZm9yIHdvcmsgcHJvZHVjdCB1c2FnZQotCSAqIAotCSAqIEByZXR1cm4KLQkgKi8KLQlBZGFwdGVyRmFjdG9yeSBnZXRXUEJTQWRhcHRlckZhY3RvcnkoKTsKLQotCS8qKgotCSAqIEdldHMgYWRhcHRlciBmYWN0b3J5IGZvciBjb25zb2xpZGF0ZWQgdmlldyBvZiB0aGUgcHJvY2Vzcy4KLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JQWRhcHRlckZhY3RvcnkgZ2V0Q0JTQWRhcHRlckZhY3RvcnkoKTsKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvSUNhY2hlZENoaWxkcmVuSXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L0lDYWNoZWRDaGlsZHJlbkl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMWVlZWYzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvSUNhY2hlZENoaWxkcmVuSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0OwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLS8qKgotICogVGhpcyBpbnRlcmZhY2UgaXMgaW1wbGVtZW50ZWQgYnkgYnJlYWsgZG93biBlbGVtZW50IGl0ZW0gcHJvdmlkZXJzIHRoYXQgd2FudAotICogdG8gbWFudGFpbiBhIGxpc3QgY2FjaGVkIGNoaWxkcmVuLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElDYWNoZWRDaGlsZHJlbkl0ZW1Qcm92aWRlciB7Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBjYWNoZWQgY2hpbGRyZW4uCi0JICogCi0JICogQHJldHVybiBhIGNvbGxlY3Rpb24gb2YgY2FjaGVkIGNoaWxkcmVuLgotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuRnJvbUNhY2hlKCk7Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBjYWNoZWQgcm9sbHVwIGNoaWxkZW4uCi0JICogCi0JICogQHJldHVybiBhIGNvbGxlY3Rpb24gb2YgY2FjaGVkIHJvbGx1cCBjaGlsZHJlbi4KLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRSb2xsdXBDaGlsZHJlbkZyb21DYWNoZSgpOwotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L0lDb21tYW5kTGlzdGVuZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvSUNvbW1hbmRMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MjQ3YmI4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvSUNvbW1hbmRMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOwotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIGlzIHVzZWQgYnkgY29tbWFuZHMgdGhhdCB3YW50IHRvIG5vdGlmeSB0aGVpciBsaXN0ZW5lcnMgb2YKLSAqIGNlcnRhaW4gZXZlbnRzLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBza2Fubm9vcgotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElDb21tYW5kTGlzdGVuZXIgewotCS8qKgotCSAqIFJlY2VpdmVzIG5vdGlmaWNhdGlvbiBwcmlvciB0byB0aGUgZXhlY3V0aW9uIHRoZSBnaXZlbiBjb21tYW5kCi0JICogQHBhcmFtIGNvbW1hbmQKLQkgKi8KLQlwdWJsaWMgdm9pZCBwcmVFeGVjdXRlKENvbW1hbmQgY29tbWFuZCk7Ci0KLQkvKioKLQkgKiBSZWNlaXZlcyBub3RpZmljYXRpb24gdGhhdCBhIGNvbW1hbmQgaGFzIGJlZW4gZXhlY3V0ZWQuCi0JICogCi0JICogQHBhcmFtIGNvbW1hbmQKLQkgKiAgICAgICAgICAgIGEgY29tbWFuZAotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUV4ZWN1dGVkKENvbW1hbmQgY29tbWFuZCk7Ci0KLQkvKioKLQkgKiBSZWNlaXZlcyBub3RpZmljYXRpb24gcHJpb3IgdG8gdGhlIHVuZG8gb2YgdGhlIGdpdmVuIGNvbW1hbmQKLQkgKiAKLQkgKiBAcGFyYW0gY29tbWFuZAotCSAqICAgICAgICAgICAgYW4gdW5kbyBjb21tYW5kCi0JICovCi0JcHVibGljIHZvaWQgcHJlVW5kbyhDb21tYW5kIGNvbW1hbmQpOwotCi0JCi0JLyoqCi0JICogUmVjZWl2ZXMgbm90aWZpY2F0aW9uIGFmdGVyIHVuZG8KLQkgKi8KLQkKLQlwdWJsaWMgdm9pZCBwb3N0VW5kbyhDb21tYW5kIGNvbW1hbmQpOwotCS8qKgotCSAqIEdldHMgdGhlIGNvbW1hbmQgY2xhc3MuCi0JICogCi0JICogQHJldHVybiBhIGNvbW1hbmQgY2xhc3MuCi0JICovCi0JcHVibGljIENsYXNzIGdldENvbW1hbmRUeXBlKCk7Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvSUNvbmZpZ3VyYWJsZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9JQ29uZmlndXJhYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmOGI2ZGMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9JQ29uZmlndXJhYmxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0OwotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIGlzIHVzZWQgYnkgaXRlbSBwcm92aWRlcnMgdGhhdCBjYW4gYmUgY29uZmlndXJlZCB0byBkaXNwbGF5IGEKLSAqIGZpbHRlcmVkIGxpc3Qgb2YgY2hpbGRyZW4gYW5kIGhhdmUgdGhlaXIgZGVmYXVsdCBsYWJlbCBvdmVyd3JpdHRlbiBhdAotICogcnVudGltZS4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJQ29uZmlndXJhYmxlIHsKLQotCS8qKgotCSAqIFNldHMgdGhlIGZpbHRlciB0aGF0IGlzIHVzZWQgdG8gZmlsdGVyIHRoaXMgb2JqZWN0J3MgY2hpbGRyZW4uCi0JICogCi0JICogQHBhcmFtIGZpbHRlcgotCSAqICAgICAgICAgICAgYW4gPGNvZGU+SUZpbHRlcjwvY29kZT4gb2JqZWN0Ci0JICogQHNlZSBJRmlsdGVyCi0JICovCi0Jdm9pZCBzZXRGaWx0ZXIoSUZpbHRlciBmaWx0ZXIpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgbGFiZWwgZm9yIHRoaXMgb2JqZWN0LgotCSAqIAotCSAqIEBwYXJhbSBhCi0JICogICAgICAgICAgICBzdHJpbmcgbGFiZWwKLQkgKi8KLQl2b2lkIHNldExhYmVsKFN0cmluZyBsYWJlbCk7Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvSUNvbmZpZ3VyYXRpb25BcHBsaWNhdG9yLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L0lDb25maWd1cmF0aW9uQXBwbGljYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZGJlZjI5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvSUNvbmZpZ3VyYXRpb25BcHBsaWNhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpYmFibGVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS51dGlsLk9wcG9zaXRlRmVhdHVyZTsKLQotLyoqCi0gKiBUaGlzIGludGVyZmFjZSBpcyB1c2VkIGJ5IHRvIG9idGFpbiBhbmQgcmVzb2x2ZSBtZXRob2QgZWxlbWVudCBhdHRyaWJ1dGVzIGFuZAotICogcmVmZXJlbmNlcyBpbiBhIG1ldGhvZCBjb25maWd1cmF0aW9uLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJQ29uZmlndXJhdGlvbkFwcGxpY2F0b3IgewotCi0JLyoqCi0JICogR2V0cyB0aGUgYXR0cmlidXRlIHZhbHVlIG9mIGEgdmFyaWFiaWxpdHkgZWxlbWVudCBpbiBhIG1ldGhvZAotCSAqIGNvbmZpZ3VyYXRpb24uCi0JICogCi0JICogQHBhcmFtIHZlCi0JICogICAgICAgICAgICBhIHZhcmlhYmlsaXR5IGVsZW1lbnQKLQkgKiBAcGFyYW0gYXR0cgotCSAqICAgICAgICAgICAgYW4gYXR0cmlidXRlCi0JICogQHBhcmFtIGNvbmZpZwotCSAqICAgICAgICAgICAgYSBtZXRob2QgY29uZmlndXJhdGlvbgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSBhdHRyaWJ1dGUgZGVyaXZlZCBmcm9tIHRoZSBtZXRob2QgY29uZmlndXJhdGlvbgotCSAqICAgICAgICAgY2xvc3VyZQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0QXR0cmlidXRlKFZhcmlhYmlsaXR5RWxlbWVudCB2ZSwgRUF0dHJpYnV0ZSBhdHRyLAotCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcpOwotCi0JLyoqCi0JICogR2V0cyB0aGUgYXR0cmlidXRlIHZhbHVlIG9mIGEgY29udGVudCBkZXNjcmlwdGlvbiBpbiBhIG1ldGhvZAotCSAqIGNvbmZpZ3VyYXRpb24uCi0JICogCi0JICogQHBhcmFtIGRlc2MKLQkgKiAgICAgICAgICAgIGEgY29udGVudCBkZXNjcmlwdGlvbgotCSAqIEBwYXJhbSBvd25lcgotCSAqICAgICAgICAgICAgdGhlIG93bmVyIG9mIHRoZSBjb250ZW50IGRlc2NyaXB0aW9uCi0JICogQHBhcmFtIGF0dHIKLQkgKiAgICAgICAgICAgIGFuIGF0dHJpYnV0ZSBvZiB0aGUgY29udGVudCBkZXNjcmlwdGlvbgotCSAqIEBwYXJhbSBjb25maWcKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgcmVmZXJlbmNlIGRlcml2ZWQgZnJvbSB0aGUgbWV0aG9kIGNvbmZpZ3VyYXRpb24KLQkgKiAgICAgICAgIGNsb3N1cmUKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEF0dHJpYnV0ZShDb250ZW50RGVzY3JpcHRpb24gZGVzYywgRGVzY3JpYmFibGVFbGVtZW50IG93bmVyLAotCQkJRUF0dHJpYnV0ZSBhdHRyLCBNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyk7Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSByZWZlcmVuY2UgdmFsdWUgb2YgYSB2YXJpYWJpbGl0eSBlbGVtZW50IGluIGEgbWV0aG9kCi0JICogY29uZmlndXJhdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gdmUKLQkgKiAgICAgICAgICAgIGEgdmFyaWFiaWxpdHkgZWxlbWVudAotCSAqIEBwYXJhbSByZWYKLQkgKiAgICAgICAgICAgIGEgcmVmZXJlbmNlIHJlcHJlc2VudGF0aW9uCi0JICogQHBhcmFtIGNvbmZpZwotCSAqICAgICAgICAgICAgYSBtZXRob2QgY29uZmlndXJhdGlvbgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSByZWZlcmVuY2UgZGVyaXZlZCBmcm9tIHRoZSBtZXRob2QgY29uZmlndXJhdGlvbgotCSAqICAgICAgICAgY2xvc3VyZQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0UmVmZXJlbmNlKFZhcmlhYmlsaXR5RWxlbWVudCB2ZSwgRVJlZmVyZW5jZSByZWYsCi0JCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyk7Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSByZWZlcmVuY2UgdmFsdWUgb2YgYSBjb250ZW50IGRlc2NyaXB0aW9uIGluIGEgbWV0aG9kCi0JICogY29uZmlndXJhdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gZGVzYwotCSAqICAgICAgICAgICAgYSBjb250ZW50IGRlc2NyaXB0aW9uCi0JICogQHBhcmFtIG93bmVyCi0JICogICAgICAgICAgICB0aGUgb3duZXIgb2YgdGhlIGNvbnRlbnQgZGVzY3JpcHRpb24KLQkgKiBAcGFyYW0gcmVmCi0JICogICAgICAgICAgICBhIHJlZmVyZW5jZSByZXByZXNlbnRhdGlvbgotCSAqIEBwYXJhbSBjb25maWcKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgcmVmZXJlbmNlIGRlcml2ZWQgZnJvbSB0aGUgbWV0aG9kIGNvbmZpZ3VyYXRpb24KLQkgKiAgICAgICAgIGNsb3N1cmUKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFJlZmVyZW5jZShDb250ZW50RGVzY3JpcHRpb24gZGVzYywgRGVzY3JpYmFibGVFbGVtZW50IG93bmVyLAotCQkJRVJlZmVyZW5jZSByZWYsIE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnKTsKLQotCS8qKgotCSAqIEdldHMgdGhlIHJlZmVyZW5jZSB2YWx1ZSBvZiBhIG1ldGhvZCBlbGVtZW50IG9wcG9zaXRlIGZlYXR1cmUgaW4gYSBtZXRob2QKLQkgKiBjb25maWd1cmF0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogICAgICAgICAgICBhIG1ldGhvZCBlbGVtZW50Ci0JICogQHBhcmFtIGZlYXR1cmUKLQkgKiAgICAgICAgICAgIGFuIG9wcG9zaXRlIGZlYXR1cmUKLQkgKiBAcGFyYW0gY29uZmlnCi0JICogICAgICAgICAgICBhIG1ldGhvZCBjb25maWd1cmF0aW9uCi0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlIHJlZmVyZW5jZSBkZXJpdmVkIGZyb20gdGhlIG1ldGhvZCBjb25maWd1cmF0aW9uCi0JICogICAgICAgICBjbG9zdXJlCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRSZWZlcmVuY2UoTWV0aG9kRWxlbWVudCBlbGVtZW50LCBPcHBvc2l0ZUZlYXR1cmUgZmVhdHVyZSwKLQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnKTsKLQotCS8qKgotCSAqIFJlc29sdmVzIHRoZSBnaXZlbiBvYmplY3QgdXNpbmcgdGhlIGdpdmVuIG1ldGhvZCBjb25maWd1cmF0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBvYmplY3QKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGVsZW1lbnQKLQkgKiBAcGFyYW0gY29uZmlnCi0JICogICAgICAgICAgICBhIG1ldGhvZCBjb25maWd1cmF0aW9uCi0JICogQHJldHVybiB0aGUgcmVzb2x2ZWQgbWV0aG9kIGVsZW1lbnQgZGVyaXZlZCBmcm9tIHRoZSBtZXRob2QgY29uZmlndXJhdGlvbgotCSAqICAgICAgICAgY2xvc3VyZQotCSAqLwotCU9iamVjdCByZXNvbHZlKE9iamVjdCBvYmplY3QsIE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnKTsKLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9JQ29uZmlndXJhdG9yLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L0lDb25maWd1cmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjhkMzg1Zi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L0lDb25maWd1cmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0OwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50OwotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIGlzIHVzZWQgYnkgaXRlbSBwcm92aWRlcnMgYW5kIGNvbW1hbmRzIHRoYXQgd2FudCB0byBmaWx0ZXIKLSAqIGRvd24gcmVsYXRlZCBtZXRob2QgZWxlbWVudHMgaW4gYSBtZXRob2QgY29uZmlndXJhdGlvbi4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUNvbmZpZ3VyYXRvciBleHRlbmRzIElNZXRob2RDb25maWd1cmF0aW9uUHJvdmlkZXIsIElGaWx0ZXIsIEFkYXB0ZXIgewotCi0Jdm9pZCBzZXRNZXRob2RDb25maWd1cmF0aW9uKE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnKTsKLQotCS8qKgotCSAqIElmIHRoaXMgbWV0aG9kIHJldHVybiBhIG5vbi1OVUxMLCB0aGUgaXRlbSBwcm92aWRlciB3aWxsIHVzZSB0aGUgcmV0dXJuZWQKLQkgKiBjb2xsZWN0aW9uIGFzIGNoaWxkcmVuIGluIHBsYWNlIG9mIGl0cyBkZWZhdWx0IGNoaWxyZW4uCi0JICogCi0JICogQHBhcmFtIG9iagotCSAqIEBwYXJhbSBjaGlsZEZlYXR1cmUKLQkgKiBAcmV0dXJuCi0JICovCi0JQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqLCBFU3RydWN0dXJhbEZlYXR1cmUgY2hpbGRGZWF0dXJlKTsKLQotCS8qKgotCSAqIFJlc29sdmVzIHRoaXMgb2JqZWN0IGFjY29yZGluZyB0byB2YXJpYWJpbGl0eSBydWxlcy4KLQkgKiAKLQkgKiBAcGFyYW0gb2JqZWN0Ci0JICogQHJldHVybiByZXNvbHZlZCBvYmplY3QgdGhhdCBpcyBlaXRoZXIgdGhlIG9iamVjdCBpdHNlbGYsIG9yIGl0cyByZXBsYWNlcgotCSAqICAgICAgICAgZGVwZW5kaW5nIG9uIHRoZSB2YXJpYWJpbGl0eSBvZiB0aGlzIG9iamVjdCBpbiB0aGUgY29uZmlndXJhdGlvbi4KLQkgKi8KLQlPYmplY3QgcmVzb2x2ZShPYmplY3Qgb2JqZWN0KTsKLQotCS8qKgotCSAqIEdldHMgdmFyaWFiaWxpdHkgaW5mb3JtYXRpb24gZm9yIHRoZSBnaXZlbiBWYXJpYWJpbGl0eUVsZW1lbnQgY2FsY3VsYXRlZAotCSAqIGJhc2VkIG9uIHRoZSBjb25maWd1cmF0aW9uIG9mIHRoaXMgY29uZmlndXJhdG9yIGFuZCBhY2NvcmRpbmcgdG8gdGhlCi0JICogdmFyaWFiaWxpdHkgcnVsZXMuCi0JICogCi0JICogQHBhcmFtIHZlCi0JICogQHJldHVybgotCSAqIEBzZWUgVmFyaWFiaWxpdHlJbmZvCi0JICovCi0JVmFyaWFiaWxpdHlJbmZvIGdldFZhcmlhYmlsaXR5SW5mbyhWYXJpYWJpbGl0eUVsZW1lbnQgdmUpOwotCQotCS8qKgotCSAqIGdldCBmaWx0ZXIgZm9yIHVuY2F0ZWdvcml6ZWQgdGFza3MKLQkgKiAKLQkgKiBAcmV0dXJuIElGaWx0ZXIKLQkgKi8KLQlwdWJsaWMgSUZpbHRlciBnZXRVbmNhdGVnb3JpemVkVGFza0ZpbHRlcigpOwotCQotCS8qKgotCSAqIGdldCBmaWx0ZXIgZm9yIHdvcmtwcm9kdWN0cyB3aXRob3V0IGEgZG9tYWluCi0JICogCi0JICogQHJldHVybiBJRmlsdGVyCi0JICovCi0JcHVibGljIElGaWx0ZXIgZ2V0RG9tYWluVW5jYXRlZ29yaXplZFdvcmtQcm9kdWN0RmlsdGVyKCk7Ci0JCi0JLyoqCi0JICogZ2V0IGZpbHRlciBmb3Igd29ya3Byb2R1Y3RzIHdpdGhvdXQgYSBXUCBUeXBlCi0JICogCi0JICogQHJldHVybiBJRmlsdGVyCi0JICovCi0JcHVibGljIElGaWx0ZXIgZ2V0V3BUeXBlVW5jYXRlZ29yaXplZFdvcmtQcm9kdWN0RmlsdGVyKCk7Ci0JCi0JLyoqCi0JICogZ2V0IGZpbHRlciBmb3IgdW5jYXRlZ29yaXplZCByb2xlcwotCSAqIAotCSAqIEByZXR1cm4gSUZpbHRlcgotCSAqLwotCXB1YmxpYyBJRmlsdGVyIGdldFVuY2F0ZWdvcml6ZWRSb2xlRmlsdGVyKCk7Ci0KLQkvKioKLQkgKiBnZXQgZmlsdGVyIGZvciB1bmNhdGVnb3JpemVkIHRvb2wgbWVudG9ycwotCSAqIAotCSAqIEByZXR1cm4gSUZpbHRlcgotCSAqLwotCXB1YmxpYyBJRmlsdGVyIGdldFVuY2F0ZWdvcml6ZWRUb29sTWVudG9yRmlsdGVyKCk7Ci0JCi0JLyoqCi0JICogZ2V0IGZpbHRlciBmb3IgZGlzY2lwbGluZXMgYW5kIGRpc3BsaW5lIGdyb3VwaW5ncwotCSAqIAotCSAqIEByZXR1cm4gSUZpbHRlcgotCSAqLwotCXB1YmxpYyBJRmlsdGVyIGdldERpc2NpcGxpbmVzRmlsdGVyKCk7Ci0JCi0JLyoqCi0JICogZ2V0IGZpbHRlciBmb3Igcm9sZXNldHMgYW5kIHJvbGVzZXQgZ3JvdXBpbmdzCi0JICogCi0JICogQHJldHVybiBJRmlsdGVyCi0JICovCi0JcHVibGljIElGaWx0ZXIgZ2V0Um9sZVNldHNGaWx0ZXIoKTsKLQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L0lDb25maWd1cmF0b3JGYWN0b3J5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L0lDb25maWd1cmF0b3JGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViY2I5OGEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9JQ29uZmlndXJhdG9yRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLQotLyoqCi0gKiBUaGUgaW50ZXJmYWNlIGZvciBhIGNvbmZpZ3VyYXRpb24gZmlsdGVyIGZhY3RvcnkuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUNvbmZpZ3VyYXRvckZhY3RvcnkgewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIGNvbmZpZ3VyYXRpb24gZmlsdGVyLgotCSAqIAotCSAqIEBwYXJhbSBjb25maWcKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24KLQkgKiBAcmV0dXJuIGEgY29uZmlndXJhdGlvbiBmaWx0ZXIuCi0JICovCi0JSUNvbmZpZ3VyYXRvciBjcmVhdGVDb25maWd1cmF0b3IoTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcpOwotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L0lEZWZhdWx0TmFtZVNldHRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9JRGVmYXVsdE5hbWVTZXR0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWVmMGE3Yy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L0lEZWZhdWx0TmFtZVNldHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdDsKLQotLyoqCi0gKiBUaGlzIGludGVyZmFjZSBpcyB1c2VkIGJ5IGl0ZW0gcHJvdmlkZXJzIHRoYXQgd2FudCB0byBhc3NpZ24gYSBkZWZhdWx0IG5hbWUKLSAqIGZvciBlYWNoIG5ld2x5IGNyZWF0ZWQgbWV0aG9kIGVsZW1lbnQuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSURlZmF1bHROYW1lU2V0dGVyIHsKLQotCS8qKgotCSAqIFNldHMgdGhlIGRlZmF1bHQgbmFtZSBmb3IgdGhlIGdpdmVuIG1ldGhvZCBlbGVtZW50LgotCSAqIAotCSAqIEBwYXJhbSBvYmoKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGVsZW1lbnQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZWZhdWx0TmFtZShPYmplY3Qgb2JqKTsKLQotCS8qKgotCSAqIEdldHMgdGhlIElEIG9mIHRoZSBmZWF0dXJlIHRoYXQgY29udGFpbnMgbWV0aG9kIGVsZW1lbnRzIHdob3NlIGRlZmF1bHQKLQkgKiBuYW1lIHNldCB0aHJvdWdoIHRoaXMgaW50ZXJmYWNlLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIElEIG9mIGEgZmVhdHVyZQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0SW50ZXJlc3RlZEZlYXR1cmVJRCgpOwotCi0JLyoqCi0JICogR2V0cyB0aGUgb3duZXIgY2xhc3Mgb2YgdGhlIGZlYXR1cmUgdGhhdCBjb250YWlucyBtZXRob2QgZWxlbWVudHMgd2hvc2UKLQkgKiBkZWZhdWx0IG5hbWUgc2V0IHRocm91Z2ggdGhpcyBpbnRlcmZhY2UuCi0JICogCi0JICogQHJldHVybiB0aGUgb3duZXIgY2xhc3Mgb2YgYSBmZWF0dXJlCi0JICovCi0JcHVibGljIENsYXNzIGdldEludGVyZXN0ZWRGZWF0dXJlT3duZXJDbGFzcygpOwotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L0lGaWx0ZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvSUZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZjkyYTA4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvSUZpbHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdDsKLQotLyoqCi0gKiBBIGdlbmVyaWMgZmlsdGVyIHRoYXQgdXNlcyB0aGUgdmlzaXRvciBkZXNpZ24gcGF0dGVybi4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJRmlsdGVyIHsKLQotCS8qKgotCSAqIENoZWNrcyB3aGV0aGVyIGEgZ2l2ZW4gb2JqZWN0IGNhbiBiZSBhY2NlcHRlZCBieSB0aGlzIGZpbHRlci4KLQkgKiAKLQkgKiBAcGFyYW0gb2JqCi0JICogICAgICAgICAgICB0aGUgdmlzaXRpbmcgb2JqZWN0Ci0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgb2JqZWN0IGlzIGFjY2VwdGVkLCA8Y29kZT5mYWxzZTwvY29kZT4KLQkgKiAgICAgICAgIG90aGVyd2lzZQotCSAqLwotCWJvb2xlYW4gYWNjZXB0KE9iamVjdCBvYmopOwotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L0lHcm91cENvbnRhaW5lci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9JR3JvdXBDb250YWluZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDAyMDU0MC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L0lHcm91cENvbnRhaW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdDsKLQotLyoqCi0gKiBUaGlzIGludGVyZmFjZSBpcyB1c2VkIGJ5IGl0ZW0gcHJvdmlkZXJzIHRoYXQgd2FudCB0byBsZXQgY2xpZW50cyBhY2Nlc3MgaXRzCi0gKiB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UcmFuc2llbnRHcm91cEl0ZW1Qcm92aWRlciA8ZW0+Z3JvdXAgaXRlbSBwcm92aWRlcnM8L2VtPn0KLSAqIGJ5IG5hbWUuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUdyb3VwQ29udGFpbmVyIHsKLQotCS8qKgotCSAqIEdldHMgdGhlIGdyb3VwIGl0ZW0gcHJvdmlkZXIgd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KLQkgKiAKLQkgKiBAcGFyYW0gbmFtZQotCSAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIGdyb3VwIGl0ZW0gcHJvdmlkZXIKLQkgKiBAcmV0dXJuIGEgPGNvZGU+VHJhbnNpZW50R3JvdXBJdGVtUHJvdmlkZXI8Y29kZT4gb2JqZWN0Ci0JICovCi0JT2JqZWN0IGdldEdyb3VwSXRlbVByb3ZpZGVyKFN0cmluZyBuYW1lKTsKLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9JTGlicmFyeUl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9JTGlicmFyeUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZTJhNTNhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvSUxpYnJhcnlJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotLyoqCi0gKiBUaGlzIGludGVyZmFjZSBpcyB1c2VkIGJ5IGl0ZW0gcHJvdmlkZXJzIHRoYXQgd2FudCB0byBpbmNsdWRlIFVJIGZvbGRlcnMKLSAqIGFuZCBmZWF0dXJlIGRlcml2ZWQgY2hpbGRyZW4uIAotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElMaWJyYXJ5SXRlbVByb3ZpZGVyIHsKLQotCS8qKgotCSAqIFNldHMgdGhlIHBhcmVudCBvZiB0aGlzIGl0ZW0gcHJvdmlkZXIuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgYSBwYXJlbnQgb2JqZWN0LCB0eXBpY2FsbHkgYSBtZXRob2QgZWxlbWVudAotCSAqLwotCXZvaWQgc2V0UGFyZW50KE9iamVjdCBwYXJlbnQpOwotCi0JLyoqCi0JICogR2V0cyB0aGUgY2hpbGRyZW4gZmVhdHVyZXMuCi0JICogCi0JICogQHBhcmFtIG9iamVjdAotCSAqICAgICAgICAgICAgYSBtZXRob2QgZWxlbWVudAotCSAqIEByZXR1cm4gYSBjb2xsZWN0aW9uIG9mIGZlYXR1cmVzIGZvciByZXRyaWV2aW5nIHRoZSBjaGlsZCBlbGVtZW50cwotCSAqLwotCUNvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5GZWF0dXJlcyhPYmplY3Qgb2JqZWN0KTsKLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9JTWV0aG9kQ29uZmlndXJhdGlvblByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L0lNZXRob2RDb25maWd1cmF0aW9uUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGM5OGUwNy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L0lNZXRob2RDb25maWd1cmF0aW9uUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5lIDEuMgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElNZXRob2RDb25maWd1cmF0aW9uUHJvdmlkZXIgewotCU1ldGhvZENvbmZpZ3VyYXRpb24gZ2V0TWV0aG9kQ29uZmlndXJhdGlvbigpOwotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9JTmFtZWRGaWx0ZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvSU5hbWVkRmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyYzFhNWMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9JTmFtZWRGaWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQ7Ci0KLS8qKgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuNQotICoKLSAqLwotcHVibGljIGludGVyZmFjZSBJTmFtZWRGaWx0ZXIgZXh0ZW5kcyBJRmlsdGVyIHsKLQlTdHJpbmcgZ2V0TmFtZSgpOwotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9JUGx1Z2luVUlQYWNrYWdlQ29udGV4dENoYW5nZWRMaXN0ZW5lci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9JUGx1Z2luVUlQYWNrYWdlQ29udGV4dENoYW5nZWRMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOGEyODYyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvSVBsdWdpblVJUGFja2FnZUNvbnRleHRDaGFuZ2VkTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQ7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSVBsdWdpblVJUGFja2FnZUNvbnRleHRDaGFuZ2VkTGlzdGVuZXIgewotCi0JLyoqCi0JICogQ2FsbGVkIHdoZW4gUGx1Z2luIFBhY2thZ2UgcHJlc2VudGF0aW9uIGNoYW5nZWQuCi0JICogQHBhcmFtIGlzRmxhdCBpZiA8Y29kZT50cnVlPC9jb2RlPiwgbGF5b3V0IGlzIG5vdyBmbGF0IG1vZGUuIGlmIDxjb2RlPmZhbHNlPC9jb2RlPiwKLQkgKiBsYXlvdXQgaXMgaGllcmFyY2hpY2FsLgotCSAqLwotCXZvaWQgbGF5b3V0Q2hhbmdlZChib29sZWFuIGlzRmxhdCk7Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvSVJlZmVyZW5jZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvSVJlZmVyZW5jZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzJlOTQyYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L0lSZWZlcmVuY2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0OwotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIGlzIHVzZWQgYnkgYWRhcHRlciBmYWN0b3JpZXMgZm9yIGNsZWFuaW5nIHVwIHJlZmVyZW5jZXMgdG8KLSAqIHVudXNlZCBpdGVtIHByb3ZpZGVycy4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJUmVmZXJlbmNlciB7Ci0KLQkvKioKLQkgKiBSZW1vdmVzIHRoZSBnaXZlbiByZWZlcmVuY2UgdG8gYW4gaXRlbSBwcm92aWRlci4KLQkgKiAKLQkgKiBAcGFyYW0gcmVmCi0JICogICAgICAgICAgICBhIHJlZmVyZW5jZSB0byBhbiBpdGVtIHByb3ZpZGVyCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgcmVmZXJlbmNlIGlzIHN1Y2Nlc3NmdWxseSByZW1vdmVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gcmVtb3ZlKE9iamVjdCByZWYpOwotCi0JLyoqCi0JICogQ2xlYW5zIHVwIGFsbCB1bnVzZWQgcmVmZXJlbmNlcy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBjbGVhblVwKCk7Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvSVN0YXRlZnVsSXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L0lTdGF0ZWZ1bEl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MjMyY2UzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvSVN0YXRlZnVsSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSURpc3Bvc2FibGU7Ci0KLS8qKgotICogVGhpcyBpbnRlcmZhY2UgaXMgaW1wbGVtZW50ZWQgYnkgc3RhdGVmdWx0IGl0ZW0gcHJvdmlkZXJzIHRoYXQgbmVlZCB0byBiZQotICogZGlzcG9zZWQgYWZ0ZXIgdGhleSBhcmUgbm8gbG9uZ2VyIHVzZWQuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVN0YXRlZnVsSXRlbVByb3ZpZGVyIGV4dGVuZHMgSURpc3Bvc2FibGUgewotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L0lXcmFwcGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L0lXcmFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2ZDY1OTUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9JV3JhcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJV3JhcHBlciB7Ci0KLQlPYmplY3Qgd3JhcChFT2JqZWN0IG9iamVjdCwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIE9iamVjdCB2YWx1ZSwKLQkJCWludCBpbmRleCk7Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvSVdyYXBwZXJJdGVtUHJvdmlkZXJGYWN0b3J5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L0lXcmFwcGVySXRlbVByb3ZpZGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYzNmZjFkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvSVdyYXBwZXJJdGVtUHJvdmlkZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JV3JhcHBlckl0ZW1Qcm92aWRlcjsKLQotLyoqCi0gKiBGYWN0b3J5IHRvIGNyZWF0ZSB7QGxpbmsgSVdyYXBwZXJJdGVtUHJvdmlkZXJ9Ci0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlIC0gQXVnIDIsIDIwMDYKLSAqIEBzaW5jZSAgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVdyYXBwZXJJdGVtUHJvdmlkZXJGYWN0b3J5IHsKLQkvKioKLQkgKiBDcmVhdGVzIHdyYXBwZXIgb2YgZ2l2ZW4gdmFsdWUgZm9yIHRoZSBnaXZlbiBvd25lcgotCSAqIAotCSAqIEBwYXJhbSB2YWx1ZQotCSAqIEBwYXJhbSBvd25lcgotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqIEByZXR1cm4KLQkgKi8KLQlJV3JhcHBlckl0ZW1Qcm92aWRlciBjcmVhdGVXcmFwcGVyKE9iamVjdCB2YWx1ZSwKLQkJCU9iamVjdCBvd25lciwgQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpOwotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIHZhbHVlCi0JICogQHBhcmFtIG93bmVyCi0JICogQHBhcmFtIGZlYXR1cmUKLQkgKiBAcGFyYW0gaW5kZXggVGhlIGluZGV4IGF0IHdoaWNoIHRoZSB2YWx1ZSBpcyBsb2NhdGVkLiBJZiBmZWF0dXJlIGlzIG5vbi1udWxsLCB0aGlzIGluZGV4IGlzIHdpdGhpbiB0aGF0IGZlYXR1cmUuCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICogQHJldHVybgotCSAqLwotCUlXcmFwcGVySXRlbVByb3ZpZGVyIGNyZWF0ZVdyYXBwZXIoT2JqZWN0IHZhbHVlLAotCQkJT2JqZWN0IG93bmVyLCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgaW50IGluZGV4LAotCQkJQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpOwotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L0lXcmFwcGVySXRlbVByb3ZpZGVyRmFjdG9yeVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L0lXcmFwcGVySXRlbVByb3ZpZGVyRmFjdG9yeVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2M2RhNmUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9JV3JhcHBlckl0ZW1Qcm92aWRlckZhY3RvcnlQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdDsKLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZSAtIEF1ZyAyLCAyMDA2Ci0gKiBAc2luY2UgIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElXcmFwcGVySXRlbVByb3ZpZGVyRmFjdG9yeVByb3ZpZGVyIHsKLQlJV3JhcHBlckl0ZW1Qcm92aWRlckZhY3RvcnkgZ2V0V3JhcHBlckl0ZW1Qcm92aWRlckZhY3RvcnkoKTsKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvTGlicmFyeUVkaXRQbHVnaW4uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvTGlicmFyeUVkaXRQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGEzNzJhYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L0xpYnJhcnlFZGl0UGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJJOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLldyYXBwZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5BYnN0cmFjdEFjdGl2YXRvcjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotLyoqCi0gKiBUaGUgTGlicmFyeSBFZGl0IHBsdWctaW4gY2xhc3MuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIExpYnJhcnlFZGl0UGx1Z2luIGV4dGVuZHMgQWJzdHJhY3RBY3RpdmF0b3IgewotCi0JLy8gVGhlIHBsdWctaW4gSUQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgPSAib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdCI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvLyBUaGUgc2hhcmVkIHBsdWctaW4gaW5zdGFuY2UuCi0JcHJpdmF0ZSBzdGF0aWMgTGlicmFyeUVkaXRQbHVnaW4gcGx1Z2luOwotCi0JcHVibGljIHN0YXRpYyBMaWJyYXJ5RWRpdFBsdWdpbiBJTlNUQU5DRTsKLQotCS8vIFRoZSBzaGFyZWQgaW1hZ2UgaGFzaCBtYXAuCi0JcHJvdGVjdGVkIE1hcDxTdHJpbmcsIE9iamVjdD4gaW1hZ2VzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgTGlicmFyeUVkaXRQbHVnaW4oKSB7Ci0JCXN1cGVyKCk7Ci0JCXBsdWdpbiA9IHRoaXM7Ci0JCUlOU1RBTkNFID0gdGhpczsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuY29yZS5wbHVnaW4uQWJzdHJhY3RQbHVnaW4jc3RhcnQoQnVuZGxlQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdGFydChjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuY29yZS5wbHVnaW4uQWJzdHJhY3RQbHVnaW4jc3RhcnQoQnVuZGxlQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0b3AoY29udGV4dCk7Ci0JCXBsdWdpbiA9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2hhcmVkIHBsdWctaW4gaW5zdGFuY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBMaWJyYXJ5RWRpdFBsdWdpbiBnZXREZWZhdWx0KCkgewotCQlyZXR1cm4gcGx1Z2luOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNoYXJlZCBwbHVnLWluIGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlicmFyeUVkaXRQbHVnaW4gZ2V0UGx1Z2luKCkgewotCQlyZXR1cm4gcGx1Z2luOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHN5bWJvbGljIG5hbWUgb2YgdGhpcyBwbHVnLWluLgotCSAqIAotCSAqIEByZXR1cm4gVGhlIHN5bWJvbGljIG5hbWUgb2YgdGhpcyBwbHVnLWluLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U3ltYm9saWNOYW1lKCkgewotCQlyZXR1cm4gZ2V0SWQoKTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKFN0cmluZyBrZXkpIHsKLQkgICAgT2JqZWN0IHJlc3VsdCA9IGltYWdlcy5nZXQoa2V5KTsKLQkJaWYgKHJlc3VsdCA9PSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCXJlc3VsdCA9IGRvR2V0SW1hZ2Uoa2V5KTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLQkJCQl0aHJvdyBuZXcgV3JhcHBlZEV4Y2VwdGlvbihleGNlcHRpb24pOwotCQkJfQotCQkJaWYocmVzdWx0ICE9IG51bGwpIHsKLQkJCQlpbWFnZXMucHV0KGtleSwgcmVzdWx0KTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCQotCXByaXZhdGUgT2JqZWN0IGRvR2V0SW1hZ2UoU3RyaW5nIGtleSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkgICAgVVJMIHVybCA9IG5ldyBVUkwoaWNvblVSTCArIGtleSArICIuZ2lmIik7IC8vJE5PTi1OTFMtMSQKLQkgICAgSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0gPSB1cmwub3BlblN0cmVhbSgpOyAKLQkgICAgaW5wdXRTdHJlYW0uY2xvc2UoKTsKLQkgICAgcmV0dXJuIHVybDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaGFyZWQgaW1hZ2UgZ2l2ZW4gdGhlIFVSSS4KLQkgKiAKLQkgKiBAcGFyYW0gaW1hZ2VVUkkKLQkgKiAgICAgICAgICAgIFRoZSBpbWFnZSdzIFVSSS4KLQkgKiBAcmV0dXJuIFRoZSBpbWFnZS4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFNoYXJlZEltYWdlKFVSSSBpbWFnZVVSSSkgewotCQl0cnkgewotCQkJcmV0dXJuIGltYWdlVVJJLnRvVVJMKCk7Ci0JCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvTGlicmFyeUVkaXRSZXNvdXJjZXMuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvTGlicmFyeUVkaXRSZXNvdXJjZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjkzM2JjZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L0xpYnJhcnlFZGl0UmVzb3VyY2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MjYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLS8qKgotICogVGhlIExpYnJhcnkgRWRpdCBtZXNzYWdlIHJlc291cmNlIGJ1bmRsZSBhY2Nlc3NvciBjbGFzcy4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBMaWJyYXJ5RWRpdFJlc291cmNlcyBleHRlbmRzIE5MUyB7Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgQlVORExFX05BTUUgPSBMaWJyYXJ5RWRpdFJlc291cmNlcy5jbGFzcy5nZXRQYWNrYWdlKCkKLQkJCS5nZXROYW1lKCkKLQkJCSsgIi5SZXNvdXJjZXMiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhY3Rpdml0eV9kZWVwX2NvcHlfdmFyaWFiaWxpdHlfcHJvbXB0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgYWN0aXZpdHlfdmFyaWFiaWxpdHlfZXJyb3JfbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgYWN0aXZpdHlfdmFyaWFiaWxpdHlfZXJyb3JfbXNnMTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGFjdGl2aXR5X3ZhcmlhYmlsaXR5X2Vycm9yX21zZzI7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhZGRfdG9fZGVmYXVsdF9jb25maWdfZGxnX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2Fubm90X2NvcHlfb3JfZXh0ZW5kX2RlbGl2ZXJ5X3Byb2Nlc3M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb25maXJtRGVzY3JpcHRvcnNEZWxldGlvbl9tc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb25maXJtRGVzY3JpcHRvcnNEZWxldGlvbl90aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNhdmluZ1Jlc291cmNlc19tc2c7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdmFyaWFiaWxpdHlfZXJyb3JfbXNnOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNpcmN1bGFyX2RlcGVuZGVuY3lfZXJyb3JfbXNnOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHZhcmlhYmlsaXR5X2VsZW1lbnRfY2lyY3VsYXJfbG9vcF9lcnJvcl9tc2c7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgIHJlcGxhY2luZ19hbmNlc3Rvcl9lcnJvcl9tc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhY3Rpdml0eV92YXJpYWJpbGl0eV9lcnJvcl9tc2czOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgYXBwbHlfcGF0dGVybl9lcnJvcl9tc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhcHBseV9wYXR0ZXJuX2Vycm9yX21zZzE7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkdXBsaWNhdGVGZWF0dXJlVmFsdWU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzZWxlY3REZXNjcmlwdG9yc1RvRGVsZXRlX21zZzsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb3B5aW5nQWN0aXZpdGllc19tc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBsb2NhbFJlcGxhY2VtZW50QW5kRGVlcENvcHlfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRlZXBDb3B5X3Byb21wdE1zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRlZXBDb3B5X3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbW92ZURpYWxvZ190aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRlbGV0ZURpYWxvZ190aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVycm9yRGlhbG9nX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JEaWFsb2dfY2Fubm90UmVuYW1lOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGVsZXRlUmVmZXJlbmNlc0RpYWxvZ190aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRlbGV0ZVJlZmVyZW5jZXNEaWFsb2dfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlc29sdmVOYW1lQ29uZmxpY3REaWFsb2dfdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZXNvbHZlTmFtZUNvbmZsaWN0RGlhbG9nX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzZWxlY3REZWxpdmVyYWJsZXNEaWFsb2dfdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzZWxlY3REZWxpdmVyYWJsZXNEaWFsb2dfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG5ld1Byb2Nlc3NDb21wb25lbnREaWFsb2dfdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBuYW1lTGFiZWxfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRlZmF1bHRDb25maWdMYWJlbF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgYmFzZVByb2Nlc3NMYWJlbF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgYmFzZWRPblByb2Nlc3Nlc0xhYmVsX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzZWxlY3RBc3NvY2lhdGlvbkxhYmVsX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZW1vdmVBc3NvY2lhdGlvbkRpYWxvZ190ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VsZWN0VGVhbXNEaWFsb2dfdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzZWxlY3RUZWFtc0RpYWxvZ190ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdGFza1NlbGVjdGlvbkRpYWxvZ190aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRpdGxlTGFiZWxfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVtcHR5RWxlbWVudE5hbWVFcnJvcl9tc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlbXB0eUVsZW1lbnROYW1lRXJyb3Jfc2ltcGxlX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGR1cGxpY2F0ZUVsZW1lbnROYW1lRXJyb3JfbXNnOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGR1cGxpY2F0ZUVsZW1lbnROYW1lRXJyb3JfbXNnMjsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkdXBsaWNhdGVFbGVtZW50TmFtZUVycm9yX3NpbXBsZV9tc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBpbnZhbGlkRWxlbWVudE5hbWVFcnJvcjFfbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgaW52YWxpZEVsZW1lbnROYW1lRXJyb3IyX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGludmFsaWRFbGVtZW50TmFtZUVycm9yM19tc2c7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgaW52YWxpZEVsZW1lbnROYW1lRXJyb3I0X21zZzsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBpbnZhbGlkUGx1Z2luTmFtZUVycm9yX21zZzsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBmaWxlUGF0aE5hbWVUb29Mb25nX21zZzsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBub0NvbmZpZ0Vycm9yX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG5vRGVsaXZlcnlQcm9jZXNzRXJyb3JfbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbm9EZWZhdWx0Q29uZmlnRXJyb3JfbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbm9CYXNlUHJvY2Vzc0Vycm9yX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNyZWF0ZVByb2Nlc3NFcnJvcl9tc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjcmVhdGVFbGVtZW50RXJyb3JfbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGVsZXRlRWxlbWVudEVycm9yX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGR1cGxpY2F0ZUNvbnRlbnRGaWxlRXJyb3JfbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZHVwbGljYXRlQ29udGVudEZpbGVFcnJvcl9zaW1wbGVfbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdW5kb0NvbW1hbmRFcnJvcl9tc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBpbnZhbGlkUHJlZGVjZXNzb3JFcnJvcl9tc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB1cGRhdGVfb3V0b2ZzeW5jaF9tc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB1cGRhdGVfb3V0b2ZzeW5jaF90aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVzZXJJbnRlcmFjdGlvbkhlbHBlcl9lcnJSZWxhdGlvbnNoaXBFeGlzdHM7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJvcl9tc2dXaXRoRGV0YWlsczsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVycm9yX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFN1cHByZXNzaW9uX25hbWVEdXBsaWNhdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFN1cHByZXNzaW9uX3ByZXNlbnRhdGlvbk5hbWVEdXBsaWNhdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVycm9yX3JlYXNvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNhdmVQcm9jZXNzRXJyb3JfcmVhc29uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGVsZXRlUmVmZXJlbmNlc0Vycm9yX3JlYXNvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNhdmVGaWxlRXJyb3JfcmVhc29uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgaW52YWxpZFJlZmVyZW5jZXNFcnJvcl9yZWFzb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB1bnJlc29sdmVkT2JqZWN0RXJyb3JfcmVhc29uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgTWV0aG9kRWxlbWVudEFkZENvbW1hbmRfb3JpZ2luYWxOb3RGb3VuZFdhcm5pbmdfbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWN0aXZpdHlBZGRDb21tYW5kX29yaWdpbmFsTm90Rm91bmRXYXJuaW5nX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdGl2aXR5RHJvcENvbW1hbmRfZGVlcENvcHlfcHJvbXB0Q29uZmlndXJhdGlvbk1zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNyZWF0aW5nUHJvY2Vzc0NvbXBvbmVudFRhc2tfbmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHByb2Nlc3NpbmdSZWZlcmVuY2VzVGFza19uYW1lOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGVsZXRpbmdFbGVtZW50c1Rhc2tfbmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNoZWNraW5nUmVmZXJlbmNlc1Rhc2tfbmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlbW92aW5nUmVmZXJlbmNlc3Rhc2tfbmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNhdmluZ01vZGlmaWVkRmlsZXNUYXNrX25hbWU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjaGVja0FmZmVjdGVkUmVzb3VyY2VzVGFza19uYW1lOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbW92aW5nVGFza19uYW1lOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbW92aW5nRmlsZXNUYXNrX25hbWU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb3B5aW5nUmVzb3VyY2VzVGFza19uYW1lOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2F2aW5nRmlsZVRhc2tfbmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVsZW1lbnRfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNyZWF0ZUVsZW1lbnRfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNyZWF0ZVByb2Nlc3NfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbnRyaWJ1dGVzVG9fdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGxvY2FsQ29udHJpYnV0ZXNUb190ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXh0ZW5kc190ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVwbGFjZXNfdGV4dDsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBleHRlbmRzX3JlcGxhY2VzX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBsb2NhbFJlcGxhY2VzX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlbGVtZW50VHlwZV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGVsaXZlcmFibGVzX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb250cmlidXRlVG9BY3Rpdml0eV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWN0aXZpdHlEcm9wQ29tbWFuZF9sYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlcGxhY2VBY3Rpdml0eV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZmlsZV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGlyZWN0b3J5X3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB1bnJlc29sdmVkX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhc3Npc3RzX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB1bmtub3duX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb21tYW5kX2RvbmU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVdGlsX2xhYmVscGF0aF92YXJpYWJpbGl0eXdpdGhwbHVnaW5faW5mbzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFV0aWxfbGFiZWxwYXRoX3ZhcmlhYmlsaXR5X2luZm87Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB1aV9yZWZfZGVsZXRlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdWlfcmVmX2RlbGV0ZTI7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB1aV9yZWZlcmVuY2VzOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdWlfd29ya3Byb2R1Y3RfZGVzY3JpcHRvcl9kZXNjcmlwdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHVpX3dvcmtwcm9kdWN0ZGVzY3JpcHRvcl9vcHRpb25zOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdWlfd29ya3Byb2R1Y3RkZXNjcmlwdG9yX291dHB1dGxhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdWlfd29ya3Byb2R1Y3RkZXNjcmlwdG9yX2RlbGV0ZV90YXNrOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdWlfVXNlckludGVyYWN0aW9uSGVscGVyX2RlZmF1bHRjb25maWdjaGVjazsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHVpX1VzZXJJbnRlcmFjdGlvbkhlbHBlcl9nZW5lcmljRXJyX21lc3NhZ2VfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NBdXRvU3luY2hyb25pemVBY3Rpb25fbm9EZXNjcmlwdG9yVG9TeW5jaDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHV0aWxfY29uZmlndXJhYmxlY29tcG9zZWRhZGFwdGVyX3JlZmVyc2hpbmd2aWV3ZXI7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb25maXJtX3JlbW92ZV9yZWZlcmVuY2VzX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB1dGlsX2NvbmZpZ3VyYWJsZWNvbXBvc2VkYWRhcHRlcl91bmhhbmRsZWRfZXhjZXB0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdXRpbF9Qcm9jZXNzVXRpbF9lcnJfc2FtZV9icmVha2Rvd25fZWxlbWVudDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHVpX1VzZXJJbnRlcmFjdGlvbkhlbHBlcl93cGxpc3RkbGdfbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdWlfVXNlckludGVyYWN0aW9uSGVscGVyX3JvbGVsaXN0ZGxnX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHV0aWxfY29uZmlndXJhYmxlY29tcG9zZWRhZGFwdGVyX2ZhdGFsZXJyOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdWlfVXNlckludGVyYWN0aW9uSGVscGVyX3dvcmtwcm9kdWN0czsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHV0aWxfUHJvY2Vzc1V0aWxfZXJyX3NhbWVfc3ViX2VsZW1lbnQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB1dGlsX1Byb2Nlc3NVdGlsX2Vycl93cm9uZ19lbGVtZW50OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdXRpbF9Qcm9jZXNzVXRpbF9lcnJfY2hpbGRfZWxlbWVudDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHVpX1VzZXJJbnRlcmFjdGlvbkhlbHBlcl90YXNrczsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHVpX2Fzc29jaWF0aW9uX3Rhc2tfc2VsZWN0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdXRpbF9Qcm9jZXNzVXRpbF9jaGlsZGFkYXB0ZXI7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB1dGlsX1Byb2Nlc3NVdGlsX2Vycl9zZXRwYXJlbnQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB1dGlsX3RuZ3V0aWxfY2Fubm90X2VkaXRfcmVzb3VyY2U7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB1dGlsX1Byb2Nlc3NVdGlsX2NvbnRyaWJ1dGVzdG87Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB1dGlsX1Byb2Nlc3NVdGlsX2xvY2FsQ29udHJpYnV0ZXN0bzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHByb2Nlc3NfZXh0ZW5kczsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHByb2Nlc3NfcmVwbGFjZXM7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwcm9jZXNzX2xvY2FsUmVwbGFjZXM7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGaWx0ZXJDb25zdGFudHNfZGlzY2lwbGluZXNfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZpbHRlckNvbnN0YW50c19kaXNjaXBsaW5lZ3JvdXBpbmdzX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGaWx0ZXJDb25zdGFudHNfd2hpdGVwYXBlcnNfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZpbHRlckNvbnN0YW50c190b29sbWVudG9yc190ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRmlsdGVyQ29uc3RhbnRzX3Rvb2xzX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGaWx0ZXJDb25zdGFudHNfcm9sZXNfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZpbHRlckNvbnN0YW50c190YXNrc190ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRmlsdGVyQ29uc3RhbnRzX3JldXNhYmxlYXNzZXRzX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGaWx0ZXJDb25zdGFudHNfYWxsX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGaWx0ZXJDb25zdGFudHNfcHJvY2Vzc2VzX3RleHQ7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRmlsdGVyQ29uc3RhbnRzX2FjdGl2aXRpZXNfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZpbHRlckNvbnN0YW50c19wcmFjdGljZXNfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZpbHRlckNvbnN0YW50c190ZW1wbGF0ZXNfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZpbHRlckNvbnN0YW50c193b3JrcHJvZHVjdHNfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZpbHRlckNvbnN0YW50c19jaGVja2xpc3RzX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGaWx0ZXJDb25zdGFudHNfZ3VpZGVsaW5lc190ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRmlsdGVyQ29uc3RhbnRzX3JvbGVzZXRzX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGaWx0ZXJDb25zdGFudHNfZ3VpZGFuY2VfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZpbHRlckNvbnN0YW50c19jb25jZXB0c190ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRmlsdGVyQ29uc3RhbnRzX2V4YW1wbGVzX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGaWx0ZXJDb25zdGFudHNfY29udGVudHBhY2thZ2VzX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGaWx0ZXJDb25zdGFudHNfcm9sZWRlc2NyaXB0b3JzX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGaWx0ZXJDb25zdGFudHNfcm9sZXNldGdyb3B1aW5nc190ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRmlsdGVyQ29uc3RhbnRzX3Rhc2tkZXNjcmlwdG9yc190ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRmlsdGVyQ29uc3RhbnRzX2NvbnRlbnRlbGVtZW50c190ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc0F1dG9TeW5jaHJvbml6ZUFjdGlvbl9wcmVwYXJlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRmlsdGVyQ29uc3RhbnRzX3dvcmtwcm9kdWN0ZGVzY3JpcHRvcnNfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZpbHRlckNvbnN0YW50c19hbGxjb250ZW50ZWxlbWVudHNfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZpbHRlckNvbnN0YW50c19zdXBwb3J0aW5nbWF0ZXJpYWxzX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNZXRob2RFbGVtZW50QWRkQ29tbWFuZF9lcnJvclNhdmluZ0ZpbGVzOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRmlsdGVyQ29uc3RhbnRzX2N1c3RvbWNhdGVnb3JpZXNfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZpbHRlckNvbnN0YW50c193b3JrcHJvZHVjdHR5cGVzX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEZWxldGVNZXRob2RFbGVtZW50Q29tbWFuZF93YXJuaW5nTXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRmlsdGVyQ29uc3RhbnRzX21ldGhvZHBsdWdpbnNfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVzZXJJbnRlcmFjdGlvbkhlbHBlcl9sb2NrZWRQbHVnaW47Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGaWx0ZXJDb25zdGFudHNfZG9tYWluc190ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRmlsdGVyQ29uc3RhbnRzX3JvYWRtYXBfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZpbHRlckNvbnN0YW50c19yZXBvcnRzX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBdXRvU3luY2hyb25pemVDb21tYW5kX2xhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgTWFudWFsU3luY2hyb25pemVDb21tYW5kX2xhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQXV0b1N5bmNocm9uaXplQ29tbWFuZF9zdWNlc3NmdWw7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgU3luY2hyb25pemVDb21wbGV0ZURpYWxvZ19UaXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVzZXJJbnRlcmFjdGlvbkhlbHBlcl9Qcm9jZXNzUGFja2FnZV9OYW1lOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbmV3RWxlbWVudF90ZXh0OwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENyZWF0ZVByb2Nlc3NDb21wb25lbnRDb21tYW5kX01lc3NhZ2U7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTb3J0VHlwZV9MYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNvcnRUeXBlX01hbnVhbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNvcnRUeXBlX0FscGhhYmV0aWM7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgU29ydFR5cGVfUmV2ZXJzZUFscGhhYmV0aWM7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgU29ydFR5cGVfTWV0aG9kVHlwZTsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTcGVjaWZ5TmFtZVRleHQ7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgV29ya09yZGVyVHlwZUFiYnJldmlhdGlvbl9GSU5JU0hfVE9fU1RBUlQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgV29ya09yZGVyVHlwZUFiYnJldmlhdGlvbl9GSU5JU0hfVE9fRklOSVNIOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdvcmtPcmRlclR5cGVBYmJyZXZpYXRpb25fU1RBUlRfVE9fRklOSVNIOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdvcmtPcmRlclR5cGVBYmJyZXZpYXRpb25fU1RBUlRfVE9fU1RBUlQ7Ci0KLQlzdGF0aWMgewotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBMaWJyYXJ5RWRpdFJlc291cmNlcy5jbGFzcyk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvUGx1Z2luVUlQYWNrYWdlQ29udGV4dC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9QbHVnaW5VSVBhY2thZ2VDb250ZXh0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzYjY2OWYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9QbHVnaW5VSVBhY2thZ2VDb250ZXh0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogU3RvcmVzIChpbiBtZW1vcnkgb25seSkgdGhlIEZsYXQvSGllcmFyY2hpY2FsIHBsdWdpbi1wYWNrYWdlIGxheW91dAotICogQGF1dGhvciBKZWZmIEhhcmR5Ci0gKgotICovCi1wdWJsaWMgY2xhc3MgUGx1Z2luVUlQYWNrYWdlQ29udGV4dCB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBQbHVnaW5VSVBhY2thZ2VDb250ZXh0IElOU1RBTkNFID0gbmV3IFBsdWdpblVJUGFja2FnZUNvbnRleHQoKTsgCi0KLQlwcml2YXRlIGJvb2xlYW4gaXNGbGF0TGF5b3V0ID0gZmFsc2U7Ci0JCi0JcHJpdmF0ZSBMaXN0PElQbHVnaW5VSVBhY2thZ2VDb250ZXh0Q2hhbmdlZExpc3RlbmVyPiBsaXN0ZW5lcnM7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBISUVSQVJDSElDQUxfTEFZT1VUPSAiaGllcmFyY2hpY2FsIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZMQVRfTEFZT1VUPSAiZmxhdCI7IC8vJE5PTi1OTFMtMSQKLQotCQotCXB1YmxpYyBib29sZWFuIGlzRmxhdExheW91dCgpIHsKLQkJcmV0dXJuIGlzRmxhdExheW91dDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdG9nZ2xlTGF5b3V0KCkgewotCQlpc0ZsYXRMYXlvdXQgPSAhaXNGbGF0TGF5b3V0OwotCQlub3RpZnlMaXN0ZW5lcnMoKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRMYXlvdXRBc1N0cmluZygpIHsKLQkJaWYgKGlzRmxhdExheW91dCgpKSB7Ci0JCQlyZXR1cm4gRkxBVF9MQVlPVVQ7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gSElFUkFSQ0hJQ0FMX0xBWU9VVDsKLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRMYXlvdXRIaWVyYXJjaGljYWwoKSB7Ci0JCWlzRmxhdExheW91dCA9IGZhbHNlOwotCQlub3RpZnlMaXN0ZW5lcnMoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRMYXlvdXRGbGF0KCkgewotCQlpc0ZsYXRMYXlvdXQgPSB0cnVlOwotCQlub3RpZnlMaXN0ZW5lcnMoKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0TGF5b3V0RmxhdFdpdGhvdXROb3RpZnkoYm9vbGVhbiBmbGFnKSB7Ci0JCWlzRmxhdExheW91dCA9IGZsYWc7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKElQbHVnaW5VSVBhY2thZ2VDb250ZXh0Q2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWlmIChsaXN0ZW5lcnMgPT0gbnVsbCkgewotCQkJbGlzdGVuZXJzID0gbmV3IEFycmF5TGlzdDxJUGx1Z2luVUlQYWNrYWdlQ29udGV4dENoYW5nZWRMaXN0ZW5lcj4oKTsKLQkJfQotCQlpZiAoIWxpc3RlbmVycy5jb250YWlucyhsaXN0ZW5lcikpIHsKLQkJCWxpc3RlbmVycy5hZGQobGlzdGVuZXIpOwotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKElQbHVnaW5VSVBhY2thZ2VDb250ZXh0Q2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWlmIChsaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJaWYgKGxpc3RlbmVycy5jb250YWlucyhsaXN0ZW5lcikpIHsKLQkJCQlsaXN0ZW5lcnMucmVtb3ZlKGxpc3RlbmVyKTsKLQkJCX0KLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgbm90aWZ5TGlzdGVuZXJzKCkgewotCQlpZiAobGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCWZvciAoSXRlcmF0b3I8SVBsdWdpblVJUGFja2FnZUNvbnRleHRDaGFuZ2VkTGlzdGVuZXI+IGl0ZXIgPSBsaXN0ZW5lcnMuaXRlcmF0b3IoKTtpdGVyLmhhc05leHQoKTspIHsKLQkJCQlJUGx1Z2luVUlQYWNrYWdlQ29udGV4dENoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lciA9IGl0ZXIubmV4dCgpOwotCQkJCWxpc3RlbmVyLmxheW91dENoYW5nZWQoaXNGbGF0TGF5b3V0KTsKLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvUHJlc2VudGF0aW9uQ29udGV4dC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9QcmVzZW50YXRpb25Db250ZXh0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4ZjMyMmMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9QcmVzZW50YXRpb25Db250ZXh0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdDsKLQotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkNvbXBhcmF0b3JzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Db21wYXJhdG9ycy5UeXBlQ29tcGFyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkd1aWRhbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlIC0gTWFyIDcsIDIwMDYKLSAqIEBzaW5jZSAgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBQcmVzZW50YXRpb25Db250ZXh0IHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFByZXNlbnRhdGlvbkNvbnRleHQgSU5TVEFOQ0UgPSBuZXcgUHJlc2VudGF0aW9uQ29udGV4dCgpOyAKLQotCXByaXZhdGUgYm9vbGVhbiBzaG93UHJlc2VudGF0aW9uTmFtZXMgPSBmYWxzZTsKLQlwcml2YXRlIENvbXBhcmF0b3IgY29tcGFyYXRvciA9IENvbXBhcmF0b3JzLkRFRkFVTFRfQ09NUEFSQVRPUjsKLQlwcml2YXRlIENvbXBhcmF0b3IgcmV2ZXJzZUNvbXBhcmF0b3IgPSBDb21wYXJhdG9ycy5SRVZFUlNFX0RFRkFVTFRfQ09NUEFSQVRPUjsKLQlwcml2YXRlIENvbXBhcmF0b3IgbWV0aG9kRWxlbWVudFR5cGVDb21wYXJhdG9yID0gQ29tcGFyYXRvcnMuTUVUSE9EX1RZUEVfQ09NUEFSQVRPUjsKLQkKLQkKLQlwcml2YXRlIENvbXBhcmF0b3IgZ3VpZGFuY2VUeXBlQ29tcGFyYXRvciA9IG5ldyBUeXBlQ29tcGFyYXRvcigpIHsKLQkJLyogKG5vbi1KYXZhZG9jKQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Db21wYXJhdG9ycy5UeXBlQ29tcGFyYXRvciNnZXREZWZhdWx0Q29tcGFyYXRvcigpCi0JCSAqLwotCQlwcm90ZWN0ZWQgQ29tcGFyYXRvciBnZXREZWZhdWx0Q29tcGFyYXRvcigpIHsKLQkJCXJldHVybiBjb21wYXJhdG9yOwotCQl9Ci0KLQkJcHJvdGVjdGVkIGludCBnZXRPcmRlcklkKE9iamVjdCBvYmopIHsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBHdWlkYW5jZSkgewotCQkJCWludCBpZCA9ICgoR3VpZGFuY2UpIG9iaikuZUNsYXNzKCkuZ2V0Q2xhc3NpZmllcklEKCk7Ci0JCQkJaWYgKGlkID09IFVtYVBhY2thZ2UuVEVSTV9ERUZJTklUSU9OKSB7Ci0JCQkJCWlkID0gSW50ZWdlci5NQVhfVkFMVUU7Ci0JCQkJfQotCQkJCXJldHVybiBpZDsKLQkJCX0KLQkJCXJldHVybiAtMTsKLQkJfQotCX07Ci0KLQlwcml2YXRlIENvbXBhcmF0b3IgcHJvY2Vzc1BhY2thZ2VDb21wYXJhdG9yID0gbmV3IFR5cGVDb21wYXJhdG9yKCkgewotCQkvKiAobm9uLUphdmFkb2MpCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkNvbXBhcmF0b3JzLlR5cGVDb21wYXJhdG9yI2dldERlZmF1bHRDb21wYXJhdG9yKCkKLQkJICovCi0JCXByb3RlY3RlZCBDb21wYXJhdG9yIGdldERlZmF1bHRDb21wYXJhdG9yKCkgewotCQkJcmV0dXJuIGNvbXBhcmF0b3I7Ci0JCX0KLQkJCi0JCXByb3RlY3RlZCBpbnQgZ2V0T3JkZXJJZChPYmplY3Qgb2JqKSB7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkgewotCQkJCXJldHVybiBJbnRlZ2VyLk1BWF9WQUxVRTsKLQkJCX0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgUHJvY2Vzc1BhY2thZ2UpIHsKLQkJCQlyZXR1cm4gMDsKLQkJCX0KLQkJCXJldHVybiAtMTsKLQkJfQotCX07Ci0KLQotCQotCXByaXZhdGUgUHJlc2VudGF0aW9uQ29udGV4dCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1Nob3dQcmVzZW50YXRpb25OYW1lcygpIHsKLQkJcmV0dXJuIHNob3dQcmVzZW50YXRpb25OYW1lczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTaG93UHJlc2VudGF0aW9uTmFtZXMoYm9vbGVhbiBzaG93UHJlc2VudGF0aW9uTmFtZXMpIHsKLQkJdGhpcy5zaG93UHJlc2VudGF0aW9uTmFtZXMgPSBzaG93UHJlc2VudGF0aW9uTmFtZXM7Ci0JCWNvbXBhcmF0b3IgPSBzaG93UHJlc2VudGF0aW9uTmFtZXMgPyBDb21wYXJhdG9ycy5QUkVTRU5UQVRJT05fTkFNRV9DT01QQVJBVE9SIDogQ29tcGFyYXRvcnMuREVGQVVMVF9DT01QQVJBVE9SOwotCQlyZXZlcnNlQ29tcGFyYXRvciA9IHNob3dQcmVzZW50YXRpb25OYW1lcyA/IENvbXBhcmF0b3JzLlJFVkVSU0VfUFJFU0VOVEFUSU9OX05BTUVfQ09NUEFSQVRPUiA6IENvbXBhcmF0b3JzLlJFVkVSU0VfREVGQVVMVF9DT01QQVJBVE9SOwotCQltZXRob2RFbGVtZW50VHlwZUNvbXBhcmF0b3IgPSBzaG93UHJlc2VudGF0aW9uTmFtZXMgPyBDb21wYXJhdG9ycy5NRVRIT0RfVFlQRV9QUkVTX05BTUVfQ09NUEFSQVRPUiA6IENvbXBhcmF0b3JzLk1FVEhPRF9UWVBFX0NPTVBBUkFUT1I7Ci0JfQotCi0JcHVibGljIENvbXBhcmF0b3IgZ2V0Q29tcGFyYXRvcigpIHsKLQkJcmV0dXJuIGNvbXBhcmF0b3I7Ci0JfQotCi0JcHVibGljIENvbXBhcmF0b3IgZ2V0UmV2ZXJzZUNvbXBhcmF0b3IoKSB7Ci0JCXJldHVybiByZXZlcnNlQ29tcGFyYXRvcjsKLQl9Ci0KLQlwdWJsaWMgQ29tcGFyYXRvciBnZXRHdWlkYW5jZVR5cGVDb21wYXJhdG9yKCkgewotCQlyZXR1cm4gZ3VpZGFuY2VUeXBlQ29tcGFyYXRvcjsKLQl9Ci0KLQlwdWJsaWMgQ29tcGFyYXRvciBnZXRQcm9jZXNzUGFja2FnZUNvbXBhcmF0b3IoKSB7Ci0JCXJldHVybiBwcm9jZXNzUGFja2FnZUNvbXBhcmF0b3I7Ci0JfQotCQotCXB1YmxpYyBDb21wYXJhdG9yIGdldE1ldGhvZEVsZW1lbnRUeXBlQ29tcGFyYXRvcigpIHsKLQkJcmV0dXJuIG1ldGhvZEVsZW1lbnRUeXBlQ29tcGFyYXRvcjsKLQl9Ci0JCi0JcHVibGljIENvbXBhcmF0b3IgZ2V0UHJlc05hbWVDb21wYXJhdG9yKCkgewotCQlyZXR1cm4gQ29tcGFyYXRvcnMuUFJFU0VOVEFUSU9OX05BTUVfQ09NUEFSQVRPUjsKLQl9Ci0KLQlwdWJsaWMgQ29tcGFyYXRvciBnZXRQcmVzTmFtZVJldmVyc2VDb21wYXJhdG9yKCkgewotCQlyZXR1cm4gQ29tcGFyYXRvcnMuUkVWRVJTRV9QUkVTRU5UQVRJT05fTkFNRV9DT01QQVJBVE9SOwotCX0KLQkKLQlwdWJsaWMgQ29tcGFyYXRvciBnZXRQcmVzTmFtZU1ldGhvZEVsZW1lbnRUeXBlQ29tcGFyYXRvcigpIHsKLQkJcmV0dXJuIENvbXBhcmF0b3JzLk1FVEhPRF9UWVBFX1BSRVNfTkFNRV9DT01QQVJBVE9SOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9Qcm92aWRlcnMuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvUHJvdmlkZXJzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlMTEwZjQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9Qcm92aWRlcnMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24ucHJlZmVyZW5jZXMuSVByZWZlcmVuY2VTdG9yZVdyYXBwZXI7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLQotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBQcm92aWRlcnMgewotCi0JcHJpdmF0ZSBzdGF0aWMgSUNvbmZpZ3VyYXRvckZhY3RvcnkgY29uZmlndXJhdG9yRmFjdG9yeTsKLQotCXByaXZhdGUgc3RhdGljIElDb25maWd1cmF0aW9uQXBwbGljYXRvciBjb25maWd1cmF0aW9uQXBwbGljYXRvcjsKLQotCXByaXZhdGUgc3RhdGljIElQcmVmZXJlbmNlU3RvcmVXcmFwcGVyIHByZWZlcmVuY2VTdG9yZTsKLQotCXByaXZhdGUgc3RhdGljIElQcmVmZXJlbmNlU3RvcmVXcmFwcGVyIGF1dGhvcmluZ1BsdWdpblByZWZlcmVuY2VTdG9yZTsKLQotCXByaXZhdGUgc3RhdGljIE1hcCBjb21tYW5kVHlwZVRvTGlzdGVuZXJzTWFwID0gbmV3IEhhc2hNYXAoKTsKLQotCXByaXZhdGUgUHJvdmlkZXJzKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSUNvbmZpZ3VyYXRvckZhY3RvcnkgZ2V0Q29uZmlndXJhdG9yRmFjdG9yeSgpIHsKLQkJcmV0dXJuIGNvbmZpZ3VyYXRvckZhY3Rvcnk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldENvbmZpZ3VyYXRvckZhY3RvcnkoCi0JCQlJQ29uZmlndXJhdG9yRmFjdG9yeSBjb25maWd1cmF0b3JGYWN0b3J5KSB7Ci0JCVByb3ZpZGVycy5jb25maWd1cmF0b3JGYWN0b3J5ID0gY29uZmlndXJhdG9yRmFjdG9yeTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIElDb25maWd1cmF0aW9uQXBwbGljYXRvciBnZXRDb25maWd1cmF0aW9uQXBwbGljYXRvcigpIHsKLQkJcmV0dXJuIGNvbmZpZ3VyYXRpb25BcHBsaWNhdG9yOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRDb25maWd1cmF0aW9uQXBwbGljYXRvcigKLQkJCUlDb25maWd1cmF0aW9uQXBwbGljYXRvciBjb25maWd1cmF0aW9uQXBwbGljYXRvcikgewotCQlQcm92aWRlcnMuY29uZmlndXJhdGlvbkFwcGxpY2F0b3IgPSBjb25maWd1cmF0aW9uQXBwbGljYXRvcjsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIElQcmVmZXJlbmNlU3RvcmVXcmFwcGVyIGdldFByZWZlcmVuY2VTdG9yZSgpIHsKLQkJcmV0dXJuIHByZWZlcmVuY2VTdG9yZTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0UHJlZmVyZW5jZVN0b3JlKElQcmVmZXJlbmNlU3RvcmVXcmFwcGVyIHByZWZlcmVuY2VTdG9yZSkgewotCQlQcm92aWRlcnMucHJlZmVyZW5jZVN0b3JlID0gcHJlZmVyZW5jZVN0b3JlOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSVByZWZlcmVuY2VTdG9yZVdyYXBwZXIgZ2V0QXV0aG9yaW5nUGx1Z2luUHJlZmVyZW5jZVN0b3JlKCkgewotCQlyZXR1cm4gYXV0aG9yaW5nUGx1Z2luUHJlZmVyZW5jZVN0b3JlOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRBdXRob3JpbmdQbHVnaW5QcmVmZXJlbmNlU3RvcmUoSVByZWZlcmVuY2VTdG9yZVdyYXBwZXIgc3RvcmUpIHsKLQkJYXV0aG9yaW5nUGx1Z2luUHJlZmVyZW5jZVN0b3JlID0gc3RvcmU7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlZ2lzdGVyQ29tbWFuZExpc3RlbmVyKElDb21tYW5kTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJTGlzdCBsaXN0ZW5lcnMgPSAoTGlzdCkgY29tbWFuZFR5cGVUb0xpc3RlbmVyc01hcC5nZXQobGlzdGVuZXIKLQkJCQkuZ2V0Q29tbWFuZFR5cGUoKSk7Ci0JCWlmIChsaXN0ZW5lcnMgPT0gbnVsbCkgewotCQkJbGlzdGVuZXJzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJY29tbWFuZFR5cGVUb0xpc3RlbmVyc01hcC5wdXQobGlzdGVuZXIuZ2V0Q29tbWFuZFR5cGUoKSwgbGlzdGVuZXJzKTsKLQkJfSBlbHNlIGlmIChsaXN0ZW5lcnMuY29udGFpbnMobGlzdGVuZXIpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJbGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZUNvbW1hbmRMaXN0ZW5lcihJQ29tbWFuZExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCUxpc3QgbGlzdGVuZXJzID0gKExpc3QpIGNvbW1hbmRUeXBlVG9MaXN0ZW5lcnNNYXAuZ2V0KGxpc3RlbmVyCi0JCQkJLmdldENvbW1hbmRUeXBlKCkpOwotCQlpZiAobGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCWxpc3RlbmVycy5yZW1vdmUobGlzdGVuZXIpOwotCQkJaWYgKGxpc3RlbmVycy5pc0VtcHR5KCkpIHsKLQkJCQljb21tYW5kVHlwZVRvTGlzdGVuZXJzTWFwLnJlbW92ZShsaXN0ZW5lci5nZXRDb21tYW5kVHlwZSgpKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRDb21tYW5kTGlzdGVuZXJzKENsYXNzIGNvbW1hbmRUeXBlKSB7Ci0JCXJldHVybiAoTGlzdCkgY29tbWFuZFR5cGVUb0xpc3RlbmVyc01hcC5nZXQoY29tbWFuZFR5cGUpOwotCX0KLQotCXN0YXRpYyB7Ci0JCS8vIHJlZ2lzdGVyIGNvbW1hbmQgbGlzdGVuZXJzIHRoYXQgaGF2ZSBiZWVuIGNvbnRyaWJ1dGVkIHZpYSBleHRlbnNpb24gcG9pbnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kTGlzdGVuZXJzCi0JCS8vCi0JCXRyeSB7Ci0JCQlTdHJpbmcgbmFtZXNwYWNlID0gTGlicmFyeUVkaXRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldElkKCk7Ci0JCQlTdHJpbmcgZXh0ZW5zaW9uUG9pbnROYW1lID0gImNvbW1hbmRMaXN0ZW5lcnMiOyAvLyROT04tTkxTLTEkCi0JCQlJRXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpOwotCQkJSUV4dGVuc2lvblBvaW50IGV4dGVuc2lvblBvaW50ID0gZXh0ZW5zaW9uUmVnaXN0cnkuZ2V0RXh0ZW5zaW9uUG9pbnQobmFtZXNwYWNlLCBleHRlbnNpb25Qb2ludE5hbWUpOwotCQkJaWYgKGV4dGVuc2lvblBvaW50ICE9IG51bGwpIHsKLQkJCQlJRXh0ZW5zaW9uW10gZXh0ZW5zaW9ucyA9IGV4dGVuc2lvblBvaW50LmdldEV4dGVuc2lvbnMoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGV4dGVuc2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCQkJSUV4dGVuc2lvbiBleHRlbnNpb24gPSBleHRlbnNpb25zW2ldOwotCQkJCQlTdHJpbmcgcGx1Z2luSWQgPSBleHRlbnNpb24uZ2V0TmFtZXNwYWNlSWRlbnRpZmllcigpOwotCQkJCQlCdW5kbGUgYnVuZGxlID0gUGxhdGZvcm0uZ2V0QnVuZGxlKHBsdWdpbklkKTsKLQkJCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gY29uZmlnRWxlbWVudHMgPSBleHRlbnNpb24KLQkJCQkJLmdldENvbmZpZ3VyYXRpb25FbGVtZW50cygpOwotCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IGNvbmZpZ0VsZW1lbnRzLmxlbmd0aDsgaisrKSB7Ci0JCQkJCQlJQ29uZmlndXJhdGlvbkVsZW1lbnQgY29uZmlnRWxlbWVudCA9IGNvbmZpZ0VsZW1lbnRzW2pdOwotCQkJCQkJdHJ5IHsKLQkJCQkJCQlTdHJpbmcgY2xhc3NOYW1lID0gY29uZmlnRWxlbWVudC5nZXRBdHRyaWJ1dGUoImNsYXNzIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQlpZihjbGFzc05hbWUgIT0gbnVsbCkgewotCQkJCQkJCQlPYmplY3QgZXh0ID0gYnVuZGxlLmxvYWRDbGFzcyhjbGFzc05hbWUpLm5ld0luc3RhbmNlKCk7Ci0JCQkJCQkJCWlmKGV4dCBpbnN0YW5jZW9mIElDb21tYW5kTGlzdGVuZXIpIHsKLQkJCQkJCQkJCXJlZ2lzdGVyQ29tbWFuZExpc3RlbmVyKChJQ29tbWFuZExpc3RlbmVyKSBleHQpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQlMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5sb2coZSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJY2F0Y2goRXhjZXB0aW9uIGUpIHsKLQkJCUxpYnJhcnlFZGl0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJfQotCi0JfQotCQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9SZXNvdXJjZXMucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvUmVzb3VyY2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0MjQ1Y2MuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9SZXNvdXJjZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI1MiArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUgotCi0jIEdlbmVyaWMgRGlhbG9nIFRpdGxlcwotbW92ZURpYWxvZ190aXRsZT1Nb3ZlCi1kZWxldGVEaWFsb2dfdGl0bGU9RGVsZXRlIEVsZW1lbnQKLWVycm9yRGlhbG9nX3RpdGxlPUVycm9yCi1lcnJvckRpYWxvZ19jYW5ub3RSZW5hbWU9Q2Fubm90IHJlbmFtZSB7MH0gJyd7MX0nJyB0byAnJ3syfScnLiBSZXNvbHZlIHRoZSBpc3N1ZSBzaG93biBpbiBEZXRhaWxzIGFuZCBjbGljayBPSyB0byBjb250aW51ZSBvciBDYW5jZWwgdG8gYWJvcnQgdGhpcyBvcGVyYXRpb24uCi0KLSMgQ29uZmlybSBSZWZlcmVuY2VzIFJlbW92YWwgRGlhbG9nCi1kZWxldGVSZWZlcmVuY2VzRGlhbG9nX3RpdGxlPUNvbmZpcm0gUmVmZXJlbmNlcyBSZW1vdmFsCi1kZWxldGVSZWZlcmVuY2VzRGlhbG9nX3RleHQ9VGhlIGVsZW1lbnQocykgeW91IGFyZSBhYm91dCB0byBkZWxldGUgYXJlIHN0aWxsIGJlaW5nIHJlZmVyZW5jZWQgYnkgb3RoZXIgZWxlbWVudHMgaW4gdGhlIG1ldGhvZCBsaWJyYXJ5LiBEZWxldGluZyB0aGVzZSBlbGVtZW50cyB3aWxsIHJlbW92ZSByZWZlcmVuY2VzIHRvIHRoZW0sIHRoZXJlZm9yZSwgd2lsbCB1cGRhdGUgdGhlIHJlZmVycmluZyBlbGVtZW50cyBhcyB3ZWxsLiAgTWFrZSBzdXJlIHlvdSBoYXZlIHBlcm1pc3Npb24gdG8gdXBkYXRlIHRoZSByZWZlcnJpbmcgZWxlbWVudHMgYmVmb3JlIGNsaWNraW5nIE9LLiAgQ2xpY2sgRGV0YWlscyB0byByZXZpZXcgdGhlIGxpc3Qgb2YgZWxlbWVudHMgdGhhdCByZWZlcmVuY2UgdGhlIGVsZW1lbnQocykgdGhhdCB5b3UgYXJlIGFib3V0IHRvIGRlbGV0ZS4KLQotIyBSZXNvbHZlIE5hbWUgQ29uZmxpY3QgRGlhbG9nCi1yZXNvbHZlTmFtZUNvbmZsaWN0RGlhbG9nX3RpdGxlPVJlc29sdmUgRWxlbWVudCBOYW1lIENvbmZsaWN0Ci1yZXNvbHZlTmFtZUNvbmZsaWN0RGlhbG9nX3RleHQ9RW50ZXIgYSBuZXcgezB9IGZvciAnJ3sxfScnOgotCi0jIFNlbGVjdCBEZWxpdmVyYWJsZXMgRGlhbG9nCi1zZWxlY3REZWxpdmVyYWJsZXNEaWFsb2dfdGl0bGU9U2VsZWN0IERlbGl2ZXJhYmxlcwotc2VsZWN0RGVsaXZlcmFibGVzRGlhbG9nX3RleHQ9U2VsZWN0IGEgZGVsaXZlcmFibGUgd2hlcmUgeW91IHdhbnQgd29yayBwcm9kdWN0ICcnezB9JycgdG8gYmUgYXNzaWduZWQuCi0KLSMgTmV3IFByb2Nlc3MgQ29tcG9uZW50IERpYWxvZwotbmV3UHJvY2Vzc0NvbXBvbmVudERpYWxvZ190aXRsZT1OZXcgUHJvY2VzcyBDb21wb25lbnQKLW5hbWVMYWJlbF90ZXh0PU5hbWU6Ci1kZWZhdWx0Q29uZmlnTGFiZWxfdGV4dD1EZWZhdWx0IENvbmZpZ3VyYXRpb246Ci1iYXNlUHJvY2Vzc0xhYmVsX3RleHQ9QmFzZSBQcm9jZXNzOgotYmFzZWRPblByb2Nlc3Nlc0xhYmVsX3RleHQ9QmFzZWQgb24gUHJvY2Vzc2VzOgotU3BlY2lmeU5hbWVUZXh0PVNwZWNpZnkgYSB2YWxpZCBuYW1lLgotCi0jIFJvbGUgQXNzb2NpYXRpb24gRGlhbG9nCi1zZWxlY3RBc3NvY2lhdGlvbkxhYmVsX3RleHQ9U2VsZWN0IGFzc29jaWF0aW9uIGZvciB0aGUgdGFzayAnJ3swfScnCi0KLSMgUmVtb3ZlIEFzc29jaWF0aW9uIGRpYWxvZwotcmVtb3ZlQXNzb2NpYXRpb25EaWFsb2dfdGV4dD1SZW1vdmUgQXNzb2NpYXRpb24KLQotIyBTZWxlY3QgVGVhbXMgRGlhbG9nCi1zZWxlY3RUZWFtc0RpYWxvZ190aXRsZT1TZWxlY3QgVGVhbXMKLXNlbGVjdFRlYW1zRGlhbG9nX3RleHQ9U2VsZWN0IGEgdGVhbSB3aGVyZSB5b3Ugd2FudCBhIHJvbGUgJyd7MH0nJyB0byBiZSBhc3NpZ25lZC4KLQotIyBUYXNrIFNlbGVjdGlvbiBEaWFsb2cKLXRhc2tTZWxlY3Rpb25EaWFsb2dfdGl0bGU9VGFzayBTZWxlY3Rpb24KLXRpdGxlTGFiZWxfdGV4dD1TZWxlY3QgdGFza3MuLgotCi0jIEVycm9yIE1lc3NhZ2VzCi1lbXB0eUVsZW1lbnROYW1lRXJyb3JfbXNnPUlVUEwwMTAwRTogVGhlIHswfSBuYW1lIGlzIG1pc3NpbmcuXG5BbGwgbWV0aG9kIGFuZCBwcm9jZXNzIGVsZW1lbnRzIG11c3QgaGF2ZSBhIG5hbWUuXG5FbnRlciBhIHZhbGlkIG5hbWUgYW5kIHRyeSBhZ2Fpbi4KLWVtcHR5RWxlbWVudE5hbWVFcnJvcl9zaW1wbGVfbXNnPVRoZSBuYW1lIGNhbm5vdCBiZSBlbXB0eS4gUGxlYXNlIHNwZWNpZnkgYSB2YWxpZCBuYW1lLgotZHVwbGljYXRlRWxlbWVudE5hbWVFcnJvcl9tc2c9SVVQTDAxMDFFOiBUaGUgbmFtZSAnJ3swfScnIGFscmVhZHkgZXhpc3RzLlxuQSBtZXRob2QgZWxlbWVudCBtdXN0IGhhdmUgYSB1bmlxdWUgbmFtZS5cbkVudGVyIGEgZGlmZmVyZW50IG5hbWUgYW5kIHRyeSBhZ2Fpbi4KLWR1cGxpY2F0ZUVsZW1lbnROYW1lRXJyb3JfbXNnMj1FbnRlciBhIGRpZmZlcmVudCBuYW1lIGFuZCB0cnkgYWdhaW4uCi1kdXBsaWNhdGVFbGVtZW50TmFtZUVycm9yX3NpbXBsZV9tc2c9VGhlIG5hbWUgYWxyZWFkeSBleGlzdHMuIFBsZWFzZSBzcGVjaWZ5IGFub3RoZXIgbmFtZS4KLWludmFsaWRFbGVtZW50TmFtZUVycm9yMV9tc2c9SVVQTDAxMDJFOiBUaGUgbmFtZSAnJ3swfScnIGlzIGludmFsaWQuXG5BIG1ldGhvZCBlbGVtZW50IG5hbWUgY2Fubm90IHN0YXJ0IHdpdGggYSBzcGFjZS5cbkVudGVyIGEgdmFsaWQgbmFtZSBhbmQgdHJ5IGFnYWluLgotaW52YWxpZEVsZW1lbnROYW1lRXJyb3IyX21zZz1JVVBMMDEwM0U6IFRoZSBuYW1lICcnezB9JycgaXMgaW52YWxpZC5cbkEgbWV0aG9kIGVsZW1lbnQgbmFtZSBjYW5ub3QgZW5kIHdpdGggYSBwZXJpb2QuXG5FbnRlciBhIHZhbGlkIG5hbWUgYW5kIHRyeSBhZ2Fpbi4KLWludmFsaWRFbGVtZW50TmFtZUVycm9yM19tc2c9SVVQTDAxMDRFOiBUaGUgbmFtZSAnJ3swfScnIGlzIGludmFsaWQuXG5BIG1ldGhvZCBlbGVtZW50IG5hbWUgY2Fubm90IGNvbnRhaW4gdGhlc2UgY2hhcmFjdGVyczogXFwgLyA6ICogPyAiIDwgPiA7IHxcbkVudGVyIGEgdmFsaWQgbmFtZSBhbmQgdHJ5IGFnYWluLgotaW52YWxpZEVsZW1lbnROYW1lRXJyb3I0X21zZz1JVVBMMDEwNUU6IFRoZSBuYW1lICcnezB9JycgaXMgaW52YWxpZC5cbkEgbWV0aG9kIGVsZW1lbnQgbmFtZSBjYW5ub3QgY29udGFpbiB0aGUgY2hhcmFjdGVyOiAmXG5FbnRlciBhIHZhbGlkIG5hbWUgYW5kIHRyeSBhZ2Fpbi4KLWludmFsaWRQbHVnaW5OYW1lRXJyb3JfbXNnPUlVUEwwMTIxRTogVGhlIG5hbWUgJyd7MH0nJyBpcyBpbnZhbGlkLlxuQSBtZXRob2QgcGx1Zy1pbicncyBuYW1lIGNhbm5vdCBjb250YWluIHRoZXNlIGNoYXJhY3RlcnM6IFxcIC8gOiAqID8gIiA8ID4gOyB8ICMgJSAnJ1xuRW50ZXIgYSB2YWxpZCBuYW1lIGFuZCB0cnkgYWdhaW4uCi1maWxlUGF0aE5hbWVUb29Mb25nX21zZz1GaWxlIHBhdGggbmFtZSB0b28gbG9uZyAoZXhjZWVkaW5nICcnezB9JycpIAotbm9Db25maWdFcnJvcl9tc2c9VGhlIGN1cnJlbnQgbWV0aG9kIGxpYnJhcnkgZG9lcyBub3QgY29udGFpbiBhbnkgbWV0aG9kIGNvbmZpZ3VyYXRpb24uXG5BIG1ldGhvZCBjb25maWd1cmF0aW9uIGlzIG5lZWRlZCB0byBjcmVhdGUgYSBuZXcgcHJvY2Vzcy5cbkNyZWF0ZSBhIG1ldGhvZCBjb25maWd1cmF0aW9uIGFuZCB0cnkgYWdhaW4uCi1ub0RlbGl2ZXJ5UHJvY2Vzc0Vycm9yX21zZz1JVVBMMDEwNkU6IFRoZSBjdXJyZW50IG1ldGhvZCBsaWJyYXJ5IGRvZXMgbm90IGNvbnRhaW4gYW55IGRlbGl2ZXJ5IHByb2Nlc3Nlcy5cbkEgYmFzZSBkZWxpdmVyeSBwcm9jZXNzIGlzIG5lZWRlZCB0byBjcmVhdGUgYSBuZXcgcHJvY2VzcyBjb250cmlidXRpb24uXG5DcmVhdGUgYSBkZWxpdmVyeSBwcm9jZXNzIGFuZCB0cnkgYWdhaW4uCi1ub0RlZmF1bHRDb25maWdFcnJvcl9tc2c9SVVQTDAxMDdFOiBObyBtZXRob2QgY29uZmlndXJhdGlvbiBoYXMgYmVlbiBzZWxlY3RlZC5cbkEgZGVmYXVsdCBtZXRob2QgY29uZmlndXJhdGlvbiBtdXN0IGJlIGFzc2lnbmVkIHRvIHRoZSBuZXcgcHJvY2Vzcy5cblNlbGVjdCBhIG1ldGhvZCBjb25maWd1cmF0aW9uIGFuZCB0cnkgYWdhaW4uCi1ub0Jhc2VQcm9jZXNzRXJyb3JfbXNnPUlVUEwwMTA4RTogTm8gZGVsaXZlcnkgcHJvY2VzcyBoYXMgYmVlbiBzZWxlY3RlZC5cbkEgcHJvY2VzcyBjb250cmlidXRpb24gcmVxdWlyZXMgYSBiYXNlIGRlbGl2ZXJ5IHByb2Nlc3MuXG5TZWxlY3QgYSBkZWxpdmVyeSBwcm9jZXNzIGFuZCB0cnkgYWdhaW4uCi1jcmVhdGVQcm9jZXNzRXJyb3JfbXNnPUlVUEwwMTA5RTogVGhlIHByb2Nlc3MgY2Fubm90IGJlIGNyZWF0ZWQgc3VjY2Vzc2Z1bGx5LgotY3JlYXRlRWxlbWVudEVycm9yX21zZz1JVVBMMDExMEU6IFRoZSBlbGVtZW50IGNhbm5vdCBiZSBjcmVhdGVkIHN1Y2Nlc3NmdWxseS4KLWRlbGV0ZUVsZW1lbnRFcnJvcl9tc2c9SVVQTDAxMTFFOiBUaGUgZWxlbWVudCBjYW5ub3QgYmUgZGVsZXRlZCBzdWNjZXNzZnVsbHkuCi1kdXBsaWNhdGVDb250ZW50RmlsZUVycm9yX21zZz1JVVBMMDExMkU6IFRoZSBjb250ZW50IGZpbGUgZm9yIHRoZSBlbGVtZW50IGNhbm5vdCBiZSBjcmVhdGVkIG9yIHJlbmFtZWQgdG8gbWF0Y2ggdGhlIGVsZW1lbnQgbmFtZS5cblxuQSBmaWxlICcnezB9JycgYWxyZWFkeSBleGlzdHMuXG5cbkVudGVyIGEgZGlmZmVyZW50IG5hbWUgYW5kIHRyeSBhZ2Fpbi4KLWR1cGxpY2F0ZUNvbnRlbnRGaWxlRXJyb3Jfc2ltcGxlX21zZz1BIGNvbnRlbnQgZmlsZSB3aXRoIHRoZSBzYW1lIG5hbWUgZXhpdHMuIFBsZWFzZSBzcGVjaWZ5IGFub3RoZXIgbmFtZS4KLXVuZG9Db21tYW5kRXJyb3JfbXNnPUlVUEwwMTEzRTogVGhlIHVuZG8gY29tbWFuZCAnJ3swfScnIGNhbm5vdCBiZSBjb21wbGV0ZWQuXG5cbkFuIGVycm9yIGhhcyBvY2N1cnJlZDogezF9Ci1pbnZhbGlkUHJlZGVjZXNzb3JFcnJvcl9tc2c9SVVQTDAxMTRFOiBUaGUgc3BlY2lmaWVkIHByZWRlY2Vzc29yIGluZGV4IGlzIGludmFsaWQuXG5cbkEgcHJlZGVjZXNzb3IgaW5kZXggbXVzdCBiZSBhbiBpbnRlZ2VyIHZhbHVlIGZyb20gdGhlICdJbmRleCcgY29sdW1uLlxuXG5TcGVjaWZ5IGEgdmFsaWQgdmFsdWUgYW5kIHRyeSBhZ2Fpbi4KLVVzZXJJbnRlcmFjdGlvbkhlbHBlcl9lcnJSZWxhdGlvbnNoaXBFeGlzdHM9SVVQTDAxMDBXOiAnJ3swfScnIGlzIGFscmVhZHkgYXNzb2NpYXRlZCB0byAnJ3sxfScnLiAgT25seSBvbmUgYXNzb2NpYXRpb24gb2YgdGhpcyBraW5kIGlzIGFsbG93ZWQuICBUbyBhc3NpZ24gJyd7MH0nJyB0byAnJ3syfScnIHlvdSBuZWVkIHRvIGZpcnN0IHJlbW92ZSBpdCBmcm9tICcnezF9JycuCi1lcnJvcl9tc2dXaXRoRGV0YWlscz1JVVBMMDExNkU6IEFuIGVycm9yIGhhcyBvY2N1cnJlZC4gQ2xpY2sgRGV0YWlscyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLWVycm9yX21zZz1JVVBMMDExN0U6IEFuIGVycm9yIGhhcyBvY2N1cnJlZC4gU2VlIGVycm9yIGxvZyBmb3IgbW9yZSBkZXRhaWxzLgotU3VwcHJlc3Npb25fbmFtZUR1cGxpY2F0aW9uPUlVUEwwMTE4RTogTmFtZSBjb25mbGljdCB3aWxsIG9jY3VyIGFmdGVyIHRoaXMgb3BlcmF0aW9uLiBDaGVjayBlbGVtZW50J3MgbmFtZSBmb3IgZHVwbGljYXRpb24gYW5kIHRyeSBhZ2FpbgotU3VwcHJlc3Npb25fcHJlc2VudGF0aW9uTmFtZUR1cGxpY2F0aW9uPUlVUEwwMTE5RTogTmFtZSBjb25mbGljdCB3aWxsIG9jY3VyIGFmdGVyIHRoaXMgb3BlcmF0aW9uLiBDaGVjayBlbGVtZW50J3MgcHJlc2VudGF0aW9uIG5hbWUgZm9yIGR1cGxpY2F0aW9uIGFuZCB0cnkgYWdhaW4KLQotIyBFcnJvciBSZWFzb25zCi1lcnJvcl9yZWFzb249QW4gZXJyb3IgaGFzIG9jY3VycmVkLiBDbGljayBEZXRhaWxzIGZvciBtb3JlIGluZm9ybWF0aW9uLgotc2F2ZVByb2Nlc3NFcnJvcl9yZWFzb249QW4gZXJyb3IgaGFzIG9jY3VycmVkIHdoaWxlIHNhdmluZyB0aGUgcHJvY2VzcyAnJ3swfScnLiBDbGljayBEZXRhaWxzIGZvciBtb3JlIGluZm9ybWF0aW9uLgotZGVsZXRlUmVmZXJlbmNlc0Vycm9yX3JlYXNvbj1BbiBlcnJvciBoYXMgb2NjdXJyZWQgd2hpbGUgcmVtb3ZpbmcgcmVmZXJlbmNlcyBhc3NvY2lhdGVkIHdpdGggdGhpcyBlbGVtZW50LiBDbGljayBEZXRhaWxzIGZvciBtb3JlIGluZm9ybWF0aW9uLgotc2F2ZUZpbGVFcnJvcl9yZWFzb249QW4gZXJyb3IgaGFzIG9jY3VycmVkIHdoaWxlIHNhdmluZyB0aGUgZmlsZSAnJ3swfScnLiBDbGljayBEZXRhaWxzIGZvciBtb3JlIGluZm9ybWF0aW9uLgotaW52YWxpZFJlZmVyZW5jZXNFcnJvcl9yZWFzb249RGV0ZWN0ZWQgbWV0aG9kIGVsZW1lbnRzIHdpdGggaW52YWxpZCByZWZlcmVuY2VzIGFzIGEgcmVzdWx0IG9mIGNyb3NzIHBsdWctaW4gY29weS5cblRoZXNlIHJlZmVyZW5jZXMgd2lsbCBiZSByZW1vdmVkLiBEbyB5b3Ugd2FudCB0byBjb250aW51ZT8KLXVucmVzb2x2ZWRPYmplY3RFcnJvcl9yZWFzb249Q2Fubm90IG1vZGlmeSBhbiB1bnJlc29sdmVkIG9iamVjdDogezB9KFVSSSA9IHsxfSl7Mn0KLQotIyBXYXJuaW5nIG1lc3NhZ2VzCi1NZXRob2RFbGVtZW50QWRkQ29tbWFuZF9vcmlnaW5hbE5vdEZvdW5kV2FybmluZ19tc2c9SVVQTDAxMThXOiBDb3VsZCBub3QgZmluZCBvbmUgb3IgbW9yZSBzb3VyY2UgZWxlbWVudHMuIEFzc29jaWF0ZWQgZmlsZXMgaW4gdGhlIHJlc291cmNlcyBmb2xkZXIgd2lsbCBub3QgYmUgY29waWVkLgotQWN0aXZpdHlBZGRDb21tYW5kX29yaWdpbmFsTm90Rm91bmRXYXJuaW5nX21zZz1JVVBMMDExOVc6IENvdWxkIG5vdCBmaW5kIG9uZSBvciBtb3JlIHNvdXJjZSBlbGVtZW50cy4gQXNzb2NpYXRlZCBQcm9jZXNzIFBhY2thZ2VzIHdpbGwgbm90IGJlIGNvcGllZC4KLUFjdGl2aXR5RHJvcENvbW1hbmRfZGVlcENvcHlfcHJvbXB0Q29uZmlndXJhdGlvbk1zZz1EbyB5b3Ugd2FudCB0byBjb3B5IGFsbCBkZXNjcmlwdG9ycz9cblxuQ2xpY2tpbmcgb24gTm8gd2lsbCBjb3B5IG9ubHkgdGhlIGRlc2NyaXB0b3JzIHRoYXQgYXJlIHBhcnQgb2YgdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbi4KLWRlZXBDb3B5X3Byb21wdE1zZz1Zb3Ugd2lsbCBnZXQgYSBjb3B5IG9mIGFsbCBkeW5hbWljYWxseSBsaW5rZWQgZWxlbWVudHMgdGhhdCB5b3UgbmVlZCB0byBtYWludGFpbiBzZXBhcmF0ZWx5IGZyb20gbm93IG9uLiBEbyB5b3Ugd2FudCB0byBjb250aW51ZT8KLWRlZXBDb3B5X3RpdGxlPURlZXAgQ29weQotCi0jIFByb2dyZXNzIG1lc3NhZ2VzCi1jcmVhdGluZ1Byb2Nlc3NDb21wb25lbnRUYXNrX25hbWU9Q3JlYXRpbmcgcHJvY2VzcyBjb21wb25lbnQgJyd7MH0nJy4uLgotcHJvY2Vzc2luZ1JlZmVyZW5jZXNUYXNrX25hbWU9UHJvY2Vzc2luZyByZWZlcmVuY2VzLi4uCi1kZWxldGluZ0VsZW1lbnRzVGFza19uYW1lPURlbGV0aW5nIGVsZW1lbnRzIGFuZCBhc3NvY2lhdGVkIGZpbGVzLi4uCi1jaGVja2luZ1JlZmVyZW5jZXNUYXNrX25hbWU9Q2hlY2tpbmcgZm9yIHJlZmVyZW5jZXMuLi4KLXJlbW92aW5nUmVmZXJlbmNlc3Rhc2tfbmFtZT1SZW1vdmluZyByZWZlcmVuY2VzLi4uCi1zYXZpbmdNb2RpZmllZEZpbGVzVGFza19uYW1lPVNhdmluZyBtb2RpZmllZCBmaWxlKHMpLi4uCi1jaGVja0FmZmVjdGVkUmVzb3VyY2VzVGFza19uYW1lPUNoZWNraW5nIGFmZmVjdGVkIHJlc291cmNlcy4uLgotbW92aW5nVGFza19uYW1lPU1vdmluZy4uLgotbW92aW5nRmlsZXNUYXNrX25hbWU9TW92aW5nIGZpbGVzLi4uCi1jb3B5aW5nUmVzb3VyY2VzVGFza19uYW1lPUNvcHlpbmcgcmVzb3VyY2VzLi4uCi1jb3B5aW5nQWN0aXZpdGllc19tc2c9Q29weWluZyBhY3Rpdml0eSAnJ3swfScnCi1zYXZpbmdGaWxlVGFza19uYW1lPVNhdmluZyBmaWxlICcnezB9JycuLi4KLXNhdmluZ1Jlc291cmNlc19tc2c9U2F2aW5nIHJlc291cmNlcwotCi0jIFVJIFRleHQKLWVsZW1lbnRfdGV4dD1lbGVtZW50Ci1jcmVhdGVFbGVtZW50X3RleHQ9Q3JlYXRlIEVsZW1lbnQKLWNyZWF0ZVByb2Nlc3NfdGV4dD1DcmVhdGUgUHJvY2VzcwotY29udHJpYnV0ZXNUb190ZXh0PUNvbnRyaWJ1dGVzIHRvCi1sb2NhbENvbnRyaWJ1dGVzVG9fdGV4dD1Mb2NhbGx5IENvbnRyaWJ1dGVzIHRvCi1leHRlbmRzX3RleHQ9RXh0ZW5kcwotcmVwbGFjZXNfdGV4dD1SZXBsYWNlcwotZXh0ZW5kc19yZXBsYWNlc190ZXh0PUV4dGVuZHMgYW5kIFJlcGxhY2VzCi1sb2NhbFJlcGxhY2VzX3RleHQ9TG9jYWxseSBSZXBsYWNlcwotbG9jYWxSZXBsYWNlbWVudEFuZERlZXBDb3B5X3RleHQ9TG9jYWwgUmVwbGFjZW1lbnQgYW5kIERlZXAgQ29wJnkKLWVsZW1lbnRUeXBlX3RleHQ9ezB9OiB7MX0KLWRlbGl2ZXJhYmxlc190ZXh0PURlbGl2ZXJhYmxlcwotY29udHJpYnV0ZVRvQWN0aXZpdHlfdGV4dD1Db250cmlidXRlIFRvIEFjdGl2aXR5Ci1BY3Rpdml0eURyb3BDb21tYW5kX2xhYmVsPURyb3AgQWN0aXZpdHkKLXJlcGxhY2VBY3Rpdml0eV90ZXh0PVJlcGxhY2UgQWN0aXZpdHkKLWZpbGVfdGV4dD1maWxlCi1kaXJlY3RvcnlfdGV4dD1kaXJlY3RvcnkKLXVucmVzb2x2ZWRfdGV4dD0odW5yZXNvbHZlZCAnJ3swfScnKQotYXNzaXN0c190ZXh0PUFzc2lzdGluZyBQZXJmb3JtZXIKLXVua25vd25fdGV4dD1Vbmtub3duCi1jb21tYW5kX2RvbmU9RG9uZQotCi0jIFRoZSBmb2xsb3dpbmcgVUkgdGV4dCBzaG91bGQgYmUgcmV2aWV3ZWQuCi1VdGlsX2xhYmVscGF0aF92YXJpYWJpbGl0eXdpdGhwbHVnaW5faW5mbz17MH0gKHsxfSAnJ3syfScnIGluICcnezN9JycpCi1VdGlsX2xhYmVscGF0aF92YXJpYWJpbGl0eV9pbmZvPXswfSAoezF9ICcnezJ9JycpCi11aV9yZWZfZGVsZXRlPVRoZSBkZXNjcmlwdG9yICcnezB9JycgaGFzIHRoZSBmb2xsb3dpbmcgcmVmZXJlbmNlcyB3aGljaCBhcmUgbm90IHVzZWQgYW55d2hlcmUuXG5TZWxlY3QgdGhlIG9uZXMgd2hpY2ggeW91IHdvdWxkIGxpa2UgdG8gZGVsZXRlOgotdWlfcmVmX2RlbGV0ZTI9VGhlc2UgZm9sbG93aW5nIHJlZmVyZW5jZXMgYXJlIG5vdCBiZWluZyB1c2VkIGFueXdoZXJlLlxuU2VsZWN0IHRoZSBvbmVzIHdoaWNoIHlvdSB3b3VsZCBsaWtlIHRvIGRlbGV0ZToKLXVpX3JlZmVyZW5jZXM9UmVmZXJlbmNlcwotdWlfd29ya3Byb2R1Y3RfZGVzY3JpcHRvcl9kZXNjcmlwdGlvbj1Xb3JrIHByb2R1Y3QgZGVzY3JpcHRvciAnJ3swfScnIGlzIGFzc29jaWF0ZWQgKE91dHB1dCBGcm9tKSB3aXRoIHRhc2sgZGVzY3JpcHRvciAnJ3sxfScnCi11aV93b3JrcHJvZHVjdGRlc2NyaXB0b3Jfb3B0aW9ucz1PcHRpb25zCi11aV93b3JrcHJvZHVjdGRlc2NyaXB0b3Jfb3V0cHV0bGFiZWw9UmVtb3ZlIHdvcmsgcHJvZHVjdCBkZXNjcmlwdG9yIGFzIG91dHB1dCBvZiB0aGUgdGFzayBkZXNjcmlwdG9yCi11aV93b3JrcHJvZHVjdGRlc2NyaXB0b3JfZGVsZXRlX3Rhc2s9RGVsZXRlIHRhc2sgZGVzY3JpcHRvciBmcm9tIHRoZSBhY3Rpdml0eQotdWlfVXNlckludGVyYWN0aW9uSGVscGVyX2RlZmF1bHRjb25maWdjaGVjaz1UaGUgc2VsZWN0ZWQgZWxlbWVudCAnJ3swfScnIGlzIG5vdCBpbiB0aGUgZGVmYXVsdCBjb25maWd1cmF0aW9uIG9mIHlvdXIgcHJvY2Vzcy5cbkRvIHlvdSB3YW50IHRvIGFkZCBpdCBhbmQgaXRzIGRlcGVuZGVuY2llcyB0byB0aGUgZGVmYXVsdCBjb25maWd1cmF0aW9uPwotdWlfVXNlckludGVyYWN0aW9uSGVscGVyX2dlbmVyaWNFcnJfbWVzc2FnZV90ZXh0PUVycm9ycyBvY2N1cnJlZCBpbiB0aGUgb3BlcmF0aW9uLiBDbGljayBvbiBkZXRhaWxzIGZvciBtb3JlIGluZm9ybWF0aW9uCi1Qcm9jZXNzQXV0b1N5bmNocm9uaXplQWN0aW9uX25vRGVzY3JpcHRvclRvU3luY2g9Tm8gZGVzY3JpcHRvciB3aXRoIGxpbmtlZCBtZXRob2QgZWxlbWVudCBmb3VuZCB0byBzeW5jaHJvbml6ZQotdXRpbF9jb25maWd1cmFibGVjb21wb3NlZGFkYXB0ZXJfcmVmZXJzaGluZ3ZpZXdlcj1FcnJvciByZWZyZXNoaW5nIHZpZXdlcgotY29uZmlybV9yZW1vdmVfcmVmZXJlbmNlc190ZXh0PUVsZW1lbnQocykgbGlzdGVkIGluIERldGFpbHMgbWlnaHQgaGF2ZSBpbGxlZ2FsIHJlZmVyZW5jZXMgdG8gdGhpcyBndWlkYW5jZSBhZnRlciBjb252ZXJzaW9uLiBDbGljayBPSyB0byByZW1vdmUgdGhlbSBhbmQgY29udGludWUuCi1jb25maXJtRGVzY3JpcHRvcnNEZWxldGlvbl90aXRsZT1Db25maXJtIERlc2NyaXB0b3JzIERlbGV0aW9uCi1jb25maXJtRGVzY3JpcHRvcnNEZWxldGlvbl9tc2c9VGhlIGVsZW1lbnQocykgeW91IGFyZSBhYm91dCB0byBkZWxldGUgYXJlIHN0aWxsIGJlaW5nIHJlZmVyZW5jZWQgYnkgZGVzY3JpcHRvcnMgaW4gdGhlIG1ldGhvZCBsaWJyYXJ5LiAgQ2xpY2sgWWVzIGlmIHlvdSB3YW50IHRvIGRlbGV0ZSB0aGVzZSBkZXNjcmlwdG9ycyBhcyB3ZWxsLiAgTWFrZSBzdXJlIHlvdSBoYXZlIHBlcm1pc3Npb24gdG8gZGVsZXRlIHRoZSBkZXNjcmlwdG9ycyBiZWZvcmUgY2xpY2tpbmcgWWVzLiAgQ2xpY2sgRGV0YWlscyB0byByZXZpZXcgdGhlIGxpc3Qgb2YgZGVzY3JpcHRvcnMgdGhhdCByZWZlcmVuY2UgdGhlIGVsZW1lbnQocykgdGhhdCB5b3UgYXJlIGFib3V0IHRvIGRlbGV0ZS4KLXV0aWxfY29uZmlndXJhYmxlY29tcG9zZWRhZGFwdGVyX3VuaGFuZGxlZF9leGNlcHRpb249VW5oYW5kbGVkIGV4Y2VwdGlvbgotdXRpbF9Qcm9jZXNzVXRpbF9lcnJfc2FtZV9icmVha2Rvd25fZWxlbWVudD1DYW5ub3QgaGF2ZSB0aGUgc2FtZSBicmVha2Rvd24gZWxlbWVudCBhcyBwcmVkZWNlc3NvciBhbmQgc3VjY2Vzc29yCi11aV9Vc2VySW50ZXJhY3Rpb25IZWxwZXJfd3BsaXN0ZGxnX21zZz1UaGUgd29yayBwcm9kdWN0ICcnezB9JycgaXMgYW4gb3V0cHV0IHRvIHRoZSBmb2xsb3dpbmcgdGFza3MuXG5TZWxlY3QgdGhlIHRhc2tzIGZvciB3aGljaCB5b3Ugd291bGQgbGlrZSB0byBjcmVhdGUgdGhlIGNvcnJlc3BvbmRpbmcgZGVzY3JpcHRvcnMuCi11aV9Vc2VySW50ZXJhY3Rpb25IZWxwZXJfcm9sZWxpc3RkbGdfbXNnPVRoZSByb2xlICcnezB9JycgaGFzIHRoZSBmb2xsb3dpbmcgcmVzcG9uc2libGUgd29yayBwcm9kdWN0cy5cblNlbGVjdCB0aGUgd29yayBwcm9kdWN0cyBmb3Igd2hpY2ggeW91IHdvdWxkIGxpa2UgdG8gY3JlYXRlIHRoZSBjb3JyZXNwb25kaW5nIGRlc2NyaXB0b3JzLgotdXRpbF9jb25maWd1cmFibGVjb21wb3NlZGFkYXB0ZXJfZmF0YWxlcnI9RmF0YWwgZXJyb3IKLXVpX1VzZXJJbnRlcmFjdGlvbkhlbHBlcl93b3JrcHJvZHVjdHM9V29yayBQcm9kdWN0cwotdXRpbF9Qcm9jZXNzVXRpbF9lcnJfc2FtZV9zdWJfZWxlbWVudD1DYW5ub3QgbGluayBhIGJyZWFrZG93biBlbGVtZW50IHRvIG9uZSBvZiBpdHMgc3ViLWVsZW1lbnQuCi11dGlsX1Byb2Nlc3NVdGlsX2Vycl93cm9uZ19lbGVtZW50PUNhbm5vdCBsaW5rIHRvIGVsZW1lbnQgb3RoZXIgdGhhbiB3b3JrIGJyZWFrZG93biBlbGVtZW50LgotdXRpbF9Qcm9jZXNzVXRpbF9lcnJfY2hpbGRfZWxlbWVudD1DYW5ub3QgbGluayBhIGJyZWFrZG93biBlbGVtZW50IHRvIG9uZSBvZiBpdHMgY2hpbGRyZW4uCi11aV9Vc2VySW50ZXJhY3Rpb25IZWxwZXJfdGFza3M9VGFza3MKLXVpX2Fzc29jaWF0aW9uX3Rhc2tfc2VsZWN0aW9uPVRhc2sgU2VsZWN0aW9uLi4uCi11dGlsX1Byb2Nlc3NVdGlsX2NoaWxkYWRhcHRlcj1cIFwgY2hpbGQncyBhZGFwdGVyOgotCi11dGlsX1Byb2Nlc3NVdGlsX2Vycl9zZXRwYXJlbnQ9Q291bGQgbm90IHNldCBwYXJlbnQgZm9yIGNoaWxkCi11dGlsX3RuZ3V0aWxfY2Fubm90X2VkaXRfcmVzb3VyY2U9Q2Fubm90IGVkaXQgcmVzb3VyY2UuCi11dGlsX1Byb2Nlc3NVdGlsX2NvbnRyaWJ1dGVzdG89Y29udHJpYnV0ZXMgdG8gJyd7MH0nJwotdXRpbF9Qcm9jZXNzVXRpbF9sb2NhbENvbnRyaWJ1dGVzdG89bG9jYWxseSBjb250cmlidXRlcyB0byAnJ3swfScnCi1wcm9jZXNzX2V4dGVuZHM9ZXh0ZW5kcyAnJ3swfScnCi1wcm9jZXNzX3JlcGxhY2VzPXJlcGxhY2VzICcnezB9JycKLXByb2Nlc3NfbG9jYWxSZXBsYWNlcz1sb2NhbGx5IHJlcGxhY2VzICcnezB9JycKLSMgRmlsdGVyIGNvbnN0YW50cyBleHRlcm5hbGl6ZWQgc3RyaW5ncy4KLUZpbHRlckNvbnN0YW50c19kaXNjaXBsaW5lc190ZXh0PURpc2NpcGxpbmVzCi1GaWx0ZXJDb25zdGFudHNfZGlzY2lwbGluZWdyb3VwaW5nc190ZXh0PURpc2NpcGxpbmUgR3JvdXBpbmdzCi1GaWx0ZXJDb25zdGFudHNfd2hpdGVwYXBlcnNfdGV4dD1XaGl0ZXBhcGVycwotRmlsdGVyQ29uc3RhbnRzX3Rvb2xtZW50b3JzX3RleHQ9VG9vbCBNZW50b3JzCi1GaWx0ZXJDb25zdGFudHNfdG9vbHNfdGV4dD1Ub29scwotRmlsdGVyQ29uc3RhbnRzX3JvbGVzX3RleHQ9Um9sZXMKLUZpbHRlckNvbnN0YW50c190YXNrc190ZXh0PVRhc2tzCi1GaWx0ZXJDb25zdGFudHNfcmV1c2FibGVhc3NldHNfdGV4dD1SZXVzYWJsZSBBc3NldHMKLUZpbHRlckNvbnN0YW50c19hbGxfdGV4dD1Nb3N0IGNvbW1vbgotRmlsdGVyQ29uc3RhbnRzX3Byb2Nlc3Nlc190ZXh0PVByb2Nlc3NlcwotRmlsdGVyQ29uc3RhbnRzX2FjdGl2aXRpZXNfdGV4dD1BY3Rpdml0aWVzCi1GaWx0ZXJDb25zdGFudHNfcHJhY3RpY2VzX3RleHQ9UHJhY3RpY2VzCi1GaWx0ZXJDb25zdGFudHNfdGVtcGxhdGVzX3RleHQ9VGVtcGxhdGVzCi1GaWx0ZXJDb25zdGFudHNfd29ya3Byb2R1Y3RzX3RleHQ9V29yayBQcm9kdWN0cwotRmlsdGVyQ29uc3RhbnRzX2NoZWNrbGlzdHNfdGV4dD1DaGVja2xpc3RzCi1GaWx0ZXJDb25zdGFudHNfZ3VpZGVsaW5lc190ZXh0PUd1aWRlbGluZXMKLUZpbHRlckNvbnN0YW50c19yb2xlc2V0c190ZXh0PVJvbGUgU2V0cwotRmlsdGVyQ29uc3RhbnRzX2d1aWRhbmNlX3RleHQ9R3VpZGFuY2UKLUZpbHRlckNvbnN0YW50c19jb25jZXB0c190ZXh0PUNvbmNlcHRzCi1GaWx0ZXJDb25zdGFudHNfZXhhbXBsZXNfdGV4dD1FeGFtcGxlcwotRmlsdGVyQ29uc3RhbnRzX2NvbnRlbnRwYWNrYWdlc190ZXh0PUNvbnRlbnQgUGFja2FnZXMKLUZpbHRlckNvbnN0YW50c19yb2xlZGVzY3JpcHRvcnNfdGV4dD1Sb2xlIERlc2NyaXB0b3JzCi1GaWx0ZXJDb25zdGFudHNfcm9sZXNldGdyb3B1aW5nc190ZXh0PVJvbGUgU2V0IEdyb3VwaW5ncwotRmlsdGVyQ29uc3RhbnRzX3Rhc2tkZXNjcmlwdG9yc190ZXh0PVRhc2sgRGVzY3JpcHRvcnMKLUZpbHRlckNvbnN0YW50c19jb250ZW50ZWxlbWVudHNfdGV4dD1Db250ZW50IEVsZW1lbnRzCi1Qcm9jZXNzQXV0b1N5bmNocm9uaXplQWN0aW9uX3ByZXBhcmU9UHJlcGFyaW5nIHN5bmNocm9uaXphdGlvbi4uLgotRmlsdGVyQ29uc3RhbnRzX3dvcmtwcm9kdWN0ZGVzY3JpcHRvcnNfdGV4dD1Xb3JrIFByb2R1Y3QgRGVzY3JpcHRvcnMKLUZpbHRlckNvbnN0YW50c19hbGxjb250ZW50ZWxlbWVudHNfdGV4dD1BbGwgQ29udGVudCBFbGVtZW50cwotRmlsdGVyQ29uc3RhbnRzX3N1cHBvcnRpbmdtYXRlcmlhbHNfdGV4dD1TdXBwb3J0aW5nIE1hdGVyaWFscwotTWV0aG9kRWxlbWVudEFkZENvbW1hbmRfZXJyb3JTYXZpbmdGaWxlcz1FcnJvciBzYXZpbmcgZmlsZShzKQotRmlsdGVyQ29uc3RhbnRzX2N1c3RvbWNhdGVnb3JpZXNfdGV4dD1DdXN0b20gQ2F0ZWdvcmllcwotRmlsdGVyQ29uc3RhbnRzX3dvcmtwcm9kdWN0dHlwZXNfdGV4dD1Xb3JrIFByb2R1Y3QgS2luZHMKLURlbGV0ZU1ldGhvZEVsZW1lbnRDb21tYW5kX3dhcm5pbmdNc2c9RGVsZXRpb24gY29tcGxldGVkIHdpdGggd2FybmluZwotRmlsdGVyQ29uc3RhbnRzX21ldGhvZHBsdWdpbnNfdGV4dD1NZXRob2QgUGx1Zy1pbnMKLVVzZXJJbnRlcmFjdGlvbkhlbHBlcl9sb2NrZWRQbHVnaW49SVVQTDAxMjBFOiBUaGUgcGx1Zy1pbiAnJ3swfScnIGlzIGxvY2tlZC4KLUZpbHRlckNvbnN0YW50c19kb21haW5zX3RleHQ9RG9tYWlucwotRmlsdGVyQ29uc3RhbnRzX3JvYWRtYXBfdGV4dD1Sb2FkbWFwcwotRmlsdGVyQ29uc3RhbnRzX3JlcG9ydHNfdGV4dD1SZXBvcnRzCi1BdXRvU3luY2hyb25pemVDb21tYW5kX2xhYmVsPURlZmF1bHQgUyZ5bmNocm9uaXphdGlvbiBmcm9tIE1ldGhvZCBDb250ZW50Ci1NYW51YWxTeW5jaHJvbml6ZUNvbW1hbmRfbGFiZWw9Q3VzdG9tIFN5bmNocm9uaSZ6YXRpb24uLi4KLVN5bmNocm9uaXplQ29tcGxldGVEaWFsb2dfVGl0bGU9U3luY2hyb25pemF0aW9uIENvbXBsZXRlCi1BdXRvU3luY2hyb25pemVDb21tYW5kX3N1Y2Vzc2Z1bD1TeW5jaHJvbml6YXRpb24gaGFzIGJlZW4gY29tcGxldGVkIHN1Y2Nlc3NmdWxseS4KLXNlbGVjdERlc2NyaXB0b3JzVG9EZWxldGVfbXNnPVRoZSBmb2xsb3dpbmcgZGVzY3JpcHRvcnMgYXJlIG5vdCB1c2VkIGFueXdoZXJlIGFmdGVyIGRlbGV0aW9uIG9mIHRoZSBzZWxlY3RlZCBlbGVtZW50cy5cblNlbGVjdCBkZXNjcmlwdG9ycyB5b3Ugd2FudCB0byBkZWxldGUuCi0KLUNyZWF0ZVByb2Nlc3NDb21wb25lbnRDb21tYW5kX01lc3NhZ2U9U3BlY2lmeSBuYW1lIGFuZCBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gZm9yIHRoZSB7MH0gdG8gYmUgY3JlYXRlZC4KLSMgVXNlckludGVyYWN0aW9uSGVscGVyCi1Vc2VySW50ZXJhY3Rpb25IZWxwZXJfUHJvY2Vzc1BhY2thZ2VfTmFtZT1OYW1lOgotCi0jIE1ldGhvZENyZWF0ZUNoaWxkQ29tbWFuZAotbmV3RWxlbWVudF90ZXh0PU5ldyB7MH0KLXVwZGF0ZV9vdXRvZnN5bmNoX3RpdGxlPVVwZGF0ZSBjb25mbGljdAotdXBkYXRlX291dG9mc3luY2hfbXNnPVRoZSBmaWxlKHMpIGhhcyBiZWVuIGNoYW5nZWQgb24gdGhlIGZpbGUgc3lzdGVtLiBEbyB5b3Ugd2FudCB0byBvdmVyd3JpdGUgdGhlIGNoYW5nZXM/Ci1kdXBsaWNhdGVGZWF0dXJlVmFsdWU9Q2Fubm90IGhhdmUgMiBlbGVtZW50cyB1bmRlciAnJ3swfScnIHdpdGggdGhlIHNhbWUgdmFsdWUgZm9yICcnezF9JycKLWFwcGx5X3BhdHRlcm5fZXJyb3JfbXNnPUNhbm5vdCBhcHBseSBhY3Rpdml0eSAnJ3swfScnIHRvIHRoZSBwcm9jZXNzICcnezF9Jycgc2luY2UgaXQgd2lsbCByZXN1bHQgaW4gY2lyY3VsYXIgZGVwZW5kZW5jeS4KLWFwcGx5X3BhdHRlcm5fZXJyb3JfbXNnMT1DYW5ub3QgYXBwbHkgYWN0aXZpdHkgJyd7MH0nJyB0byB0aGUgcHJvY2VzcyAnJ3sxfScnIHNpbmNlICcnezB9JycgYWxyZWFkeSBoYXMgb25lIG9yIG1vcmUgY29udHJpYnV0ZWQvcmVwbGFjZWQgYWN0aXZpdGllcyBhcyBpdHMgY2hpbGRyZW4uCi1hY3Rpdml0eV92YXJpYWJpbGl0eV9lcnJvcl9tc2cxPUFjdGl2aXR5ICcnezB9JycgY2Fubm90IHNldCB2YXJpYWJpbGl0eSB3aXRoIG9uZSBvZiBpdHMgZGlyZWN0IHBhcmVudC4KLWFjdGl2aXR5X3ZhcmlhYmlsaXR5X2Vycm9yX21zZzI9QWN0aXZpdHkgJyd7MH0nJyBjYW5ub3Qgc2V0IHZhcmlhYmlsaXR5IHdpdGggJyd7MX0nJyBzaW5jZSBpdCB3aWxsIHJlc3VsdCBpbiBjaXJjdWxhciBkZXBlbmRlbmN5LgotYWN0aXZpdHlfdmFyaWFiaWxpdHlfZXJyb3JfbXNnMz1DYW5ub3QgcmVwbGFjZXMgYSB0b3AgcHJvY2VzcyB3aXRoIGFuIGFjdGl2aXR5LgotYWN0aXZpdHlfZGVlcF9jb3B5X3ZhcmlhYmlsaXR5X3Byb21wdD1UaGUgc291cmNlIGFjdGl2aXR5IG1pZ2h0IGhhdmUgZXh0ZXJuYWwgY29udHJpYnV0aW9ucyBvciByZXBsYWNlbWVudHMuXG5EbyB5b3Ugd2FudCB0byBjb3B5IHRoZW0gYXMgd2VsbD9cblxuQ2xpY2tpbmcgb24gTm8gd2lsbCBjb3B5IG9ubHkgdGhlIG9yaWdpbmFsIGFjdGl2aXR5LgotYWN0aXZpdHlfdmFyaWFiaWxpdHlfZXJyb3JfbXNnPUFjdGl2aXR5ICcnezB9JycgY2Fubm90IHNldCB2YXJpYWJpbGl0eSB3aXRoICcnezF9Jycgc2luY2UgJyd7MX0nJyBhbHJlYWR5IGhhcyBvbmUgb3IgbW9yZSBjb250cmlidXRlZC9yZXBsYWNlZCBhY3Rpdml0aWVzIGFzIGl0cyBjaGlsZHJlbi4KLXZhcmlhYmlsaXR5X2Vycm9yX21zZz1WYXJpYWJpbGl0eSBlbGVtZW50ICcnezB9JycgY2Fubm90IHNldCB2YXJpYWJpbGl0eSB3aXRoICcnezF9Jycgc2luY2UgaXQgd2lsbCByZXN1bHQgaW4gY2lyY3VsYXIgZGVwZW5kZW5jeS4KLWNpcmN1bGFyX2RlcGVuZGVuY3lfZXJyb3JfbXNnPUNhbm5vdCBwZXJmb3JtIHRoZSBvcGVyYXRpb24gc2luY2UgaXQgd2lsbCByZXN1bHQgaW4gY2lyY3VsYXIgZGVwZW5kZW5jeS4KLQotIyBWYWxpZGF0aW9uIG1lc3NhZ2VzCi12YXJpYWJpbGl0eV9lbGVtZW50X2NpcmN1bGFyX2xvb3BfZXJyb3JfbXNnPUNpcmN1bGFyIGRlcGVuZGVuY3kgbG9vcCBkZXRlY3RlZCAuLi4gCi1yZXBsYWNpbmdfYW5jZXN0b3JfZXJyb3JfbXNnPVJlcGxhY2luZyBhbiBhbmNlc3RvciBlcnJvciBpcyBkZXRlY3RlZC4KLWNhbm5vdF9jb3B5X29yX2V4dGVuZF9kZWxpdmVyeV9wcm9jZXNzPUNhbm5vdCBjb3B5IG9yIGV4dGVuZCBhIGRlbGl2ZXJ5IHByb2Nlc3Mgb3IgYW55IG9mIGl0cyBhY3Rpdml0aWVzLgotCi0jIFNvcnQgb3B0aW9ucwotU29ydFR5cGVfTGFiZWw9U29ydCBUeXBlOgotU29ydFR5cGVfTWFudWFsPU1hbnVhbAotU29ydFR5cGVfQWxwaGFiZXRpYz1BbHBoYWJldGljCi1Tb3J0VHlwZV9SZXZlcnNlQWxwaGFiZXRpYz1SZXZlcnNlIEFscGhhYmV0aWMKLVNvcnRUeXBlX01ldGhvZFR5cGU9RWxlbWVudCBUeXBlCi0KLVdvcmtPcmRlclR5cGVBYmJyZXZpYXRpb25fRklOSVNIX1RPX1NUQVJUPUZTCi1Xb3JrT3JkZXJUeXBlQWJicmV2aWF0aW9uX0ZJTklTSF9UT19GSU5JU0g9RkYKLVdvcmtPcmRlclR5cGVBYmJyZXZpYXRpb25fU1RBUlRfVE9fRklOSVNIPVNGCi1Xb3JrT3JkZXJUeXBlQWJicmV2aWF0aW9uX1NUQVJUX1RPX1NUQVJUPVNTCi1hZGRfdG9fZGVmYXVsdF9jb25maWdfZGxnX3RpdGxlPUFkZCB0byBkZWZhdWx0IGNvbmZpZ3VyYXRpb24KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvU3RydWN0dXJlZE1ldGhvZFBsdWdpbkl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9TdHJ1Y3R1cmVkTWV0aG9kUGx1Z2luSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhMmYwMDUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9TdHJ1Y3R1cmVkTWV0aG9kUGx1Z2luSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0OwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRGlzcG9zYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuTW9kZWxTdHJ1Y3R1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5NZXRob2RQbHVnaW5JdGVtUHJvdmlkZXI7Ci0KLS8qKgotICogVGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSBzdHJ1Y3R1cmVkIG1ldGhvZCBwbHVnLWluLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgU3RydWN0dXJlZE1ldGhvZFBsdWdpbkl0ZW1Qcm92aWRlciBleHRlbmRzCi0JCU1ldGhvZFBsdWdpbkl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzIElHcm91cENvbnRhaW5lciwKLQkJSVN0YXRlZnVsSXRlbVByb3ZpZGVyIHsKLQotCXByb3RlY3RlZCBNYXAgZ3JvdXBJdGVtUHJvdmlkZXJNYXA7Ci0KLQlwcml2YXRlIE1vZGVsU3RydWN0dXJlIG1vZGVsU3RydWN0OwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgU3RydWN0dXJlZE1ldGhvZFBsdWdpbkl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TW9kZWxTdHJ1Y3R1cmUoTW9kZWxTdHJ1Y3R1cmUgbW9kZWxTdHJ1Y3QpIHsKLQkJdGhpcy5tb2RlbFN0cnVjdCA9IG1vZGVsU3RydWN0OwotCX0KLQotCXB1YmxpYyBNb2RlbFN0cnVjdHVyZSBnZXRNb2RlbFN0cnVjdHVyZSgpIHsKLQkJcmV0dXJuIG1vZGVsU3RydWN0OwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0R3JvdXBJdGVtUHJvdmlkZXIoU3RyaW5nIG5hbWUpIHsKLQkJaWYgKGdyb3VwSXRlbVByb3ZpZGVyTWFwID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIGdyb3VwSXRlbVByb3ZpZGVyTWFwLmdldChuYW1lKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0VGV4dChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBUbmdVdGlsLmdldExhYmVsKG9iamVjdCwgZ2V0U3RyaW5nKCJfVUlfTWV0aG9kUGx1Z2luX3R5cGUiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJaWYgKGdyb3VwSXRlbVByb3ZpZGVyTWFwICE9IG51bGwpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGdyb3VwSXRlbVByb3ZpZGVyTWFwLnZhbHVlcygpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3QgYWRhcHRlciA9IGl0ZXIubmV4dCgpOwotCQkJCWlmIChhZGFwdGVyIGluc3RhbmNlb2YgSURpc3Bvc2FibGUpIHsKLQkJCQkJKChJRGlzcG9zYWJsZSkgYWRhcHRlcikuZGlzcG9zZSgpOwotCQkJCX0KLQkJCX0KLQkJCWdyb3VwSXRlbVByb3ZpZGVyTWFwLmNsZWFyKCk7Ci0JCQlncm91cEl0ZW1Qcm92aWRlck1hcCA9IG51bGw7Ci0JCX0KLQotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L1RuZ0FkYXB0ZXJGYWN0b3J5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L1RuZ0FkYXB0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyZWQwNjQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9UbmdBZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjM2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlZEFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaW50ZXJuYWwuVG5nQWRhcHRlckZhY3RvcnlJbXBsOwotCi0vKioKLSAqIFRoZSBmYWN0b3J5IGZvciBhbGwgdGhlIGFkYXB0ZXIgZmFjdG9yaWVzLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFRuZ0FkYXB0ZXJGYWN0b3J5IHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgVG5nQWRhcHRlckZhY3RvcnkgSU5TVEFOQ0UgPSBUbmdBZGFwdGVyRmFjdG9yeUltcGwuY3JlYXRlQWRhcHRlckZhY3RvcnlQcm92aWRlcigpOwotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgQWRhcHRlckZhY3RvcnlbXSBwcm9jZXNzQWRhcHRlckZhY3RvcmllcyA9IHsKLQkJSU5TVEFOQ0UuZ2V0V0JTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSwKLQkJSU5TVEFOQ0UuZ2V0T0JTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSwKLQkJSU5TVEFOQ0UuZ2V0UEJTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSwKLQkJSU5TVEFOQ0UuZ2V0UHJvY2Vzc0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKQotCX07Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBjb21wb3NlZCBhZGFwdGVyIGZhY3RvcnkgZm9yIHRoZSBMaWJyYXJ5IHZpZXcuCi0JICogCi0JICogQHJldHVybiB0aGUgY29tcG9zZWQgYWRhcHRlciBmYWN0b3J5IGZvciB0aGUgTGlicmFyeSB2aWV3Ci0JICovCi0JcHVibGljIENvbXBvc2VkQWRhcHRlckZhY3RvcnkgZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCk7Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBhZGFwdGVyIGZhY3RvcnkgZm9yIHRoZSBDb25maWd1cmF0aW9uIHZpZXcuCi0JICogCi0JICogQHBhcmFtIGZpbHRlcgotCSAqICAgICAgICAgICAgYSBtZXRob2QgZWxlbWVudCBmaWx0ZXIKLQkgKiBAcmV0dXJuIHRoZSBhZGFwdGVyIGZhY3RvcnkgZm9yIHRoZSBDb25maWd1cmF0aW9uIHZpZXcKLQkgKi8KLQlwdWJsaWMgQWRhcHRlckZhY3RvcnkgZ2V0Q29uZmlndXJhdGlvblZpZXdfQWRhcHRlckZhY3RvcnkoSUZpbHRlciBmaWx0ZXIpOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZhY3RvcnkgZm9yIHRoZSBXb3JrIEJyZWFrZG93biBTdHJ1Y3R1cmUuIENsaWVudCBpcwotCSAqIHJlc3BvbnNpYmxlIGZvciBkaXNwb3NpbmcgaXQgYWZ0ZXIgdXNlIGJ5IGNhbGxpbmcKLQkgKiB7QGxpbmtwbGFpbiBDb21wb3NlZEFkYXB0ZXJGYWN0b3J5I2Rpc3Bvc2UoKX0KLQkgKiAKLQkgKiBAcmV0dXJuIGFuIGFkYXB0ZXIgZmFjdG9yeSBmb3IgdGhlIFdvcmsgQnJlYWtkb3duIFN0cnVjdHVyZQotCSAqLwotCXB1YmxpYyBDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IGNyZWF0ZVdCU0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmYWN0b3J5IGZvciB0aGUgVGVhbSBCcmVha2Rvd24gU3RydWN0dXJlLiBDbGllbnQgaXMKLQkgKiByZXNwb25zaWJsZSBmb3IgZGlzcG9zaW5nIGl0IGFmdGVyIHVzZSBieSBjYWxsaW5nCi0JICoge0BsaW5rcGxhaW4gQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSNkaXNwb3NlKCl9Ci0JICogCi0JICogQHJldHVybiBhbiBhZGFwdGVyIGZhY3RvcnkgZm9yIHRoZSBUZWFtIEJyZWFrZG93biBTdHJ1Y3R1cmUKLQkgKi8KLQlwdWJsaWMgQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBjcmVhdGVUQlNDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KCk7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZmFjdG9yeSBmb3IgV29yayBQcm9kdWN0IEJyZWFrZG93biBTdHJ1Y3R1cmUuCi0JICogQ2xpZW50IGlzIHJlc3BvbnNpYmxlIGZvciBkaXNwb3NpbmcgaXQgYWZ0ZXIgdXNlIGJ5IGNhbGxpbmcKLQkgKiB7QGxpbmtwbGFpbiBDb21wb3NlZEFkYXB0ZXJGYWN0b3J5I2Rpc3Bvc2UoKX0KLQkgKiAKLQkgKiBAcmV0dXJuIGFuIGFkYXB0ZXIgZmFjdG9yeSBmb3IgdGhlIFdvcmsgUHJvZHVjdCBCcmVha2Rvd24gU3RydWN0dXJlCi0JICovCi0JcHVibGljIENvbXBvc2VkQWRhcHRlckZhY3RvcnkgY3JlYXRlV1BCU0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmYWN0b3J5IGZvciB0aGUgQ29uc29saWRhdGVkIEJyZWFrZG93biBTdHJ1Y3R1cmUuCi0JICogQ2xpZW50IGlzIHJlc3BvbnNpYmxlIGZvciBkaXNwb3NpbmcgaXQgYWZ0ZXIgdXNlIGJ5IGNhbGxpbmcKLQkgKiB7QGxpbmtwbGFpbiBDb21wb3NlZEFkYXB0ZXJGYWN0b3J5I2Rpc3Bvc2UoKX0KLQkgKiAKLQkgKiBAcmV0dXJuIGFuIGFkYXB0ZXIgZmFjdG9yeSBmb3IgdGhlIENvbnNvbGlkYXRlZCBCcmVha2Rvd24gU3RydWN0dXJlCi0JICovCi0JcHVibGljIENvbXBvc2VkQWRhcHRlckZhY3RvcnkgY3JlYXRlUHJvY2Vzc0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmYWN0b3J5IGZvciB0aGUgcHVibGlzaGVkIFdvcmsgQnJlYWtkb3duIFN0cnVjdHVyZS4KLQkgKiBDbGllbnQgaXMgcmVzcG9uc2libGUgZm9yIGRpc3Bvc2luZyBpdCBhZnRlciB1c2UgYnkgY2FsbGluZwotCSAqIHtAbGlua3BsYWluIENvbXBvc2VkQWRhcHRlckZhY3RvcnkjZGlzcG9zZSgpfQotCSAqIAotCSAqIEByZXR1cm4gYW4gYWRhcHRlciBmYWN0b3J5IGZvciB0aGUgcHVibGlzaGVkIFdvcmsgQnJlYWtkb3duIFN0cnVjdHVyZQotCSAqLwotCXB1YmxpYyBDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IGNyZWF0ZVB1Ymxpc2hpbmdXQlNBZGFwdGVyRmFjdG9yeSgpOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZhY3RvcnkgZm9yIHB1Ymxpc2hlZCBUZWFtIEJyZWFrZG93biBTdHJ1Y3R1cmUuCi0JICogQ2xpZW50IGlzIHJlc3BvbnNpYmxlIGZvciBkaXNwb3NpbmcgaXQgYWZ0ZXIgdXNlIGJ5IGNhbGxpbmcKLQkgKiB7QGxpbmtwbGFpbiBDb21wb3NlZEFkYXB0ZXJGYWN0b3J5I2Rpc3Bvc2UoKX0KLQkgKiAKLQkgKiBAcmV0dXJuIGFuIGFkYXB0ZXIgZmFjdG9yeSBmb3IgdGhlIHB1Ymxpc2hlZCBUZWFtIEJyZWFrZG93biBTdHJ1Y3R1cmUKLQkgKi8KLQlwdWJsaWMgQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBjcmVhdGVQdWJsaXNoaW5nVEJTQWRhcHRlckZhY3RvcnkoKTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmYWN0b3J5IGZvciBwdWJsaXNoZWQgV29yayBQcm9kdWN0IEJyZWFrZG93bgotCSAqIFN0cnVjdHVyZS4gQ2xpZW50IGlzIHJlc3BvbnNpYmxlIGZvciBkaXNwb3NpbmcgaXQgYWZ0ZXIgdXNlIGJ5IGNhbGxpbmcKLQkgKiB7QGxpbmtwbGFpbiBDb21wb3NlZEFkYXB0ZXJGYWN0b3J5I2Rpc3Bvc2UoKX0KLQkgKiAKLQkgKiBAcmV0dXJuIGFuIGFkYXB0ZXIgZmFjdG9yeSBmb3IgdGhlIHB1Ymxpc2hlZCBXb3JrIFByb2R1Y3QgQnJlYWtkb3duCi0JICogICAgICAgICBTdHJ1Y3R1cmUKLQkgKi8KLQlwdWJsaWMgQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBjcmVhdGVQdWJsaXNoaW5nV1BCU0FkYXB0ZXJGYWN0b3J5KCk7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZmFjdG9yeSBmb3IgdGhlIHB1Ymxpc2hlZCBDb25zb2xpZGF0ZWQgQnJlYWtkb3duCi0JICogU3RydWN0dXJlLiBDbGllbnQgaXMgcmVzcG9uc2libGUgZm9yIGRpc3Bvc2luZyBpdCBhZnRlciB1c2UgYnkgY2FsbGluZwotCSAqIHtAbGlua3BsYWluIENvbXBvc2VkQWRhcHRlckZhY3RvcnkjZGlzcG9zZSgpfQotCSAqIAotCSAqIEByZXR1cm4gYW4gYWRhcHRlciBmYWN0b3J5IGZvciB0aGUgcHVibGlzaGVkIENvbnNvbGlkYXRlZCBCcmVha2Rvd24KLQkgKiAgICAgICAgIFN0cnVjdHVyZQotCSAqLwotCXB1YmxpYyBDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IGNyZWF0ZVB1Ymxpc2hpbmdDQlNBZGFwdGVyRmFjdG9yeSgpOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZhY3RvcnkgZm9yIHRoZSBsaWJyYXJ5LgotCSAqIENsaWVudCBpcyByZXNwb25zaWJsZSBmb3IgZGlzcG9zaW5nIGl0IGFmdGVyIHVzZSBieSBjYWxsaW5nCi0JICoge0BsaW5rcGxhaW4gQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSNkaXNwb3NlKCl9Ci0JICogCi0JICogQHJldHVybiBhbiBhZGFwdGVyIGZhY3RvcnkgZm9yIHRoZSBsaWJyYXJ5Ci0JICovCi0JcHVibGljIENvbXBvc2VkQWRhcHRlckZhY3RvcnkgY3JlYXRlTGlicmFyeUNvbXBvc2VkQWRhcHRlckZhY3RvcnkoKTsKLQkKLQkvKioKLQkgKiBHZXRzIHRoZSBzaW5nbGV0b24gY29tcG9zZWQgYWRhcHRlciBmYWN0b3J5IGZvciB0aGUgV29yayBQcm9kdWN0Ci0JICogQnJlYWtkb3duIFN0cnVjdHVyZSBlZGl0b3IuCi0JICogCi0JICogQHJldHVybiB0aGUgYWRhcHRlciBmYWN0b3J5IGZvciB0aGUgV29yayBQcm9kdWN0IEJyZWFrZG93biBTdHJ1Y3R1cmUKLQkgKiAgICAgICAgIGVkaXRvcgotCSAqLwotCXB1YmxpYyBDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IGdldFdCU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCk7Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBzaW5nbGV0b24gY29tcG9zZWQgYWRhcHRlciBmYWN0b3J5IGZvciB0aGUgVGVhbSBCcmVha2Rvd24KLQkgKiBTdHJ1Y3R1cmUgZWRpdG9yLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGFkYXB0ZXIgZmFjdG9yeSBmb3IgdGhlIFRlYW0gQnJlYWtkb3duIFN0cnVjdHVyZSBlZGl0b3IKLQkgKi8KLQlwdWJsaWMgQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBnZXRPQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpOwotCi0JLyoqCi0JICogR2V0cyB0aGUgc2luZ2xldG9uIGNvbXBvc2VkIGFkYXB0ZXIgZmFjdG9yeSBmb3IgV29yayBQcm9kdWN0IEJyZWFrZG93bgotCSAqIFN0cnVjdHVyZSBlZGl0b3IuCi0JICogCi0JICogQHJldHVybiB0aGUgYWRhcHRlciBmYWN0b3J5IGZvciB0aGUgV29yayBQcm9kdWN0IEJyZWFrZG93biBTdHJ1Y3R1cmUKLQkgKiAgICAgICAgIGVkaXRvcgotCSAqLwotCXB1YmxpYyBDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IGdldFBCU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCk7Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBzaW5nbGV0b24gY29tcG9zZWQgYWRhcHRlciBmYWN0b3J5IGZvciB0aGUgQ29uc29saWRhdGVkCi0JICogQnJlYWtkb3duIFN0cnVjdHVyZSBlZGl0b3IuCi0JICogCi0JICogQHJldHVybiB0aGUgYWRhcHRlciBmYWN0b3J5IGZvciB0aGUgQ29uc29saWRhdGVkIEJyZWFrZG93biBTdHJ1Y3R1cmUKLQkgKiAgICAgICAgIGVkaXRvcgotCSAqLwotCXB1YmxpYyBDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IGdldFByb2Nlc3NDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KCk7Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBzaW5nbGV0b24gY29tcG9zZWQgYWRhcHRlciBmYWN0b3J5IGZvciB0aGUgQ29uZmlndXJhdGlvbiB2aWV3LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGFkYXB0ZXIgZmFjdG9yeSBmb3IgdGhlIENvbmZpZ3VyYXRpb24gdmlldwotCSAqLwotCXB1YmxpYyBDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IGdldENvbmZpZ3VyYXRpb25WaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKTsKLQotCS8qKgotCSAqIEdldHMgYWRhcHRlciBmYWN0b3J5IGZvciBJdGVtc0ZpbHRlciBwYWNrYWdlLiBFaXRoZXIKLQkgKiBnZXRGaWx0ZXJWaWV3X0FkYXB0ZXJGYWN0b3J5KElGaWx0ZXIgZmlsdGVyKSBvcgotCSAqIGdldEl0ZW1zRmlsdGVyX0FkYXB0ZXJGYWN0b3J5KElGaWx0ZXIgZmlsdGVyKSBzaG91bGQgYmUgdXNlZC4gQm90aCBjYW4gYmUKLQkgKiB1c2VkIGF0IHRoZSBzYW1lIHRpbWUgZGVwZW5kcyBvbiBwdXJwb3NlLgotCSAqLwotCXB1YmxpYyBBZGFwdGVyRmFjdG9yeSBnZXRJdGVtc0ZpbHRlcl9BZGFwdGVyRmFjdG9yeShJRmlsdGVyIGZpbHRlcik7Ci0KLQkvKioKLQkgKiBHZXRzIGFuIGFkYXB0ZXIgZmFjdG9yeSBmb3IgdGhlIFRlYW0gQnJlYWtkb3duIFN0cnVjdHVyZSBmaWx0ZXIuCi0JICogCi0JICogQHBhcmFtIGZpbHRlcgotCSAqICAgICAgICAgICAgYSBtZXRob2QgZWxlbWVudCBmaWx0ZXIKLQkgKiBAcmV0dXJuIGFuIGFkYXB0ZXIgZmFjdG9yeSBmb3IgdGhlIFRlYW0gQnJlYWtkb3duIFN0cnVjdHVyZSBmaWx0ZXIKLQkgKi8KLQlwdWJsaWMgQWRhcHRlckZhY3RvcnkgZ2V0T0JTRmlsdGVyX0FkYXB0ZXJGYWN0b3J5KElGaWx0ZXIgZmlsdGVyKTsKLQotCS8qKgotCSAqIEdldHMgYW4gYWRhcHRlciBmYWN0b3J5IGZvciB0aGUgV29yayBQcm9kdWN0IEJyZWFrZG93biBTdHJ1Y3R1cmUgZmlsdGVyLgotCSAqIAotCSAqIEBwYXJhbSBmaWx0ZXIKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGVsZW1lbnQgZmlsdGVyCi0JICogQHJldHVybiBhbiBhZGFwdGVyIGZhY3RvcnkgZm9yIHRoZSBXb3JrIFByb2R1Y3QgQnJlYWtkb3duIFN0cnVjdHVyZQotCSAqICAgICAgICAgZmlsdGVyCi0JICovCi0JcHVibGljIEFkYXB0ZXJGYWN0b3J5IGdldFBCU0ZpbHRlcl9BZGFwdGVyRmFjdG9yeShJRmlsdGVyIGZpbHRlcik7Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBzaW5nbGV0b24gY29tcG9zZWQgYWRhcHRlciBmYWN0b3J5IGZvciB0aGUgVGVhbSBCcmVha2Rvd24KLQkgKiBTdHJ1Y3R1cmUgZmlsdGVyLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGFkYXB0ZXIgZmFjdG9yeSBmb3IgdGhlIFRlYW0gQnJlYWtkb3duIFN0cnVjdHVyZSBmaWx0ZXIKLQkgKi8KLQlwdWJsaWMgQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBnZXRPQlNGaWx0ZXJfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpOwotCi0JLyoqCi0JICogR2V0cyB0aGUgc2luZ2xldG9uIGNvbXBvc2VkIGFkYXB0ZXIgZmFjdG9yeSBmb3IgdGhlIFdvcmsgUHJvZHVjdAotCSAqIEJyZWFrZG93biBTdHJ1Y3R1cmUgZmlsdGVyLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGFkYXB0ZXIgZmFjdG9yeSBmb3IgdGhlIFdvcmsgUHJvZHVjdCBCcmVha2Rvd24gU3RydWN0dXJlCi0JICogICAgICAgICBmaWx0ZXIKLQkgKi8KLQlwdWJsaWMgQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBnZXRQQlNGaWx0ZXJfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpOwotCi0JLyoqCi0JICogR2V0cyB0aGUgc2luZ2xldG9uIGNvbXBvc2VkIGFkYXB0ZXIgZmFjdG9yeSBmb3IgdGhlIGl0ZW0gZmlsdGVyLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGFkYXB0ZXIgZmFjdG9yeSBmb3IgdGhlIGl0ZW0gZmlsdGVyCi0JICovCi0JcHVibGljIENvbXBvc2VkQWRhcHRlckZhY3RvcnkgZ2V0SXRlbXNGaWx0ZXJfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpOwotCi0JLyoqCi0JICogUmVzZXRzIHRoZSBhZGFwdGVyIGZhY3Rvcmllcy4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZXNldCgpOwotCi0JLyoqCi0JICogUmVsZWFzZXMgdW51c2VkIG9iamVjdHMuCi0JICovCi0JcHVibGljIHZvaWQgY2xlYW5VcCgpOwotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L1RyYW5zaWVudEdyb3VwSXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L1RyYW5zaWVudEdyb3VwSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3YzNkY2QuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9UcmFuc2llbnRHcm91cEl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDE1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuVW5leGVjdXRhYmxlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLlJlbW92ZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5NZXRob2RFbGVtZW50QWRkQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmVsZW1lbnQuSUVsZW1lbnRJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5VbWFFZGl0UGx1Z2luOwotCi0vKioKLSAqIEl0ZW0gcHJvdmlkZXIgZm9yIFVJIHRyYW5zaWVudCBvYmplY3RzIHRoYXQgY2FuIGJlIHVzZWQgdG8gZ3JvdXAvb3JnYW5pemUKLSAqIG1vZGVsIG9iamVjdHMgaW4gYSB2aWV3LgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgVHJhbnNpZW50R3JvdXBJdGVtUHJvdmlkZXIgZXh0ZW5kcyBJdGVtUHJvdmlkZXJBZGFwdGVyIGltcGxlbWVudHMKLQkJSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UsCi0JCUlFbGVtZW50SXRlbVByb3ZpZGVyLCBJQ29uZmlndXJhYmxlLCBJRGVmYXVsdE5hbWVTZXR0ZXIsCi0JCUlMaWJyYXJ5SXRlbVByb3ZpZGVyIHsKLQotCXByb3RlY3RlZCBTdHJpbmcgbmFtZTsKLQotCXByb3RlY3RlZCBJRmlsdGVyIGNoaWxkRmlsdGVyOwotCi0JcHJvdGVjdGVkIE9iamVjdCBwYXJlbnQ7Ci0KLQkvKioKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgVHJhbnNpZW50R3JvdXBJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksCi0JCQlOb3RpZmllciBwYXJlbnQpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCQlwYXJlbnQuZUFkYXB0ZXJzKCkuYWRkKHRoaXMpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqLwotCXB1YmxpYyBUcmFuc2llbnRHcm91cEl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwKLQkJCU5vdGlmaWVyIHBhcmVudCwgU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCQlwYXJlbnQuZUFkYXB0ZXJzKCkuYWRkKHRoaXMpOwotCQl0aGlzLm5hbWUgPSBuYW1lOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGFjY2VwdEFzQ2hpbGQoT2JqZWN0IG9iaikgewotCQlpZiAoY2hpbGRGaWx0ZXIgIT0gbnVsbCkgewotCQkJcmV0dXJuIGNoaWxkRmlsdGVyLmFjY2VwdChvYmopOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRQYXJlbnQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChwYXJlbnQgIT0gbnVsbCkKLQkJCXJldHVybiBwYXJlbnQ7Ci0JCXJldHVybiB0YXJnZXQ7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldE5ld0NoaWxkRGVzY3JpcHRvcnMoamF2YS5sYW5nLk9iamVjdCwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluLCBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldE5ld0NoaWxkRGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCwKLQkJCUVkaXRpbmdEb21haW4gZWRpdGluZ0RvbWFpbiwgT2JqZWN0IHNpYmxpbmcpIHsKLQkJcmV0dXJuIHN1cGVyLmdldE5ld0NoaWxkRGVzY3JpcHRvcnModGFyZ2V0LCBlZGl0aW5nRG9tYWluLCBzaWJsaW5nKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0UmVzb3VyY2VMb2NhdG9yKCkKLQkgKi8KLQlwcm90ZWN0ZWQgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2NyZWF0ZUNyZWF0ZUNoaWxkQ29tbWFuZChvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbiwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0LAotCSAqICAgICAgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZSwgamF2YS5sYW5nLk9iamVjdCwgaW50LAotCSAqICAgICAgamF2YS51dGlsLkNvbGxlY3Rpb24pCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgY3JlYXRlQ3JlYXRlQ2hpbGRDb21tYW5kKEVkaXRpbmdEb21haW4gZG9tYWluLAotCQkJRU9iamVjdCBvd25lciwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIE9iamVjdCB2YWx1ZSwgaW50IGluZGV4LAotCQkJQ29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCUNvbW1hbmQgY21kID0gc3VwZXIuY3JlYXRlQ3JlYXRlQ2hpbGRDb21tYW5kKGRvbWFpbiwgKEVPYmplY3QpIHRhcmdldCwKLQkJCQlmZWF0dXJlLCB2YWx1ZSwgaW5kZXgsIGNvbGxlY3Rpb24pOwotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiI2NyZWF0ZUNyZWF0ZUNoaWxkQ29tbWFuZDoKLQkJLy8gY2FuIGV4ZWN1dGU6ICIgKyBjbWQuY2FuRXhlY3V0ZSgpKTsKLQkJcmV0dXJuIGNtZDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjY3JlYXRlQWRkQ29tbWFuZChvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbiwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0LAotCSAqICAgICAgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZSwgamF2YS51dGlsLkNvbGxlY3Rpb24sIGludCkKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBjcmVhdGVBZGRDb21tYW5kKEVkaXRpbmdEb21haW4gZG9tYWluLCBFT2JqZWN0IG93bmVyLAotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIENvbGxlY3Rpb24gY29sbGVjdGlvbiwgaW50IGluZGV4KSB7Ci0JCUNvbGxlY3Rpb24gc2VsZWN0aW9uID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjb2xsZWN0aW9uLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyLm5leHQoKTsKLQkJCWlmIChhY2NlcHRBc0NoaWxkKGVsZW1lbnQpKSB7Ci0JCQkJc2VsZWN0aW9uLmFkZChlbGVtZW50KTsKLQkJCX0KLQkJfQotCQlpZiAoc2VsZWN0aW9uLmlzRW1wdHkoKSkgewotCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCX0KLQkJcmV0dXJuIG5ldyBNZXRob2RFbGVtZW50QWRkQ29tbWFuZChzdXBlci5jcmVhdGVBZGRDb21tYW5kKGRvbWFpbiwKLQkJCQkoRU9iamVjdCkgdGFyZ2V0LCBmZWF0dXJlLCBzZWxlY3Rpb24sIGluZGV4KSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2NyZWF0ZVJlbW92ZUNvbW1hbmQob3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW4sCi0JICogICAgICBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmUsIGphdmEudXRpbC5Db2xsZWN0aW9uKQotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGNyZWF0ZVJlbW92ZUNvbW1hbmQoRWRpdGluZ0RvbWFpbiBkb21haW4sIEVPYmplY3Qgb3duZXIsCi0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgQ29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCUNvbW1hbmQgY21kID0gc3VwZXIuY3JlYXRlUmVtb3ZlQ29tbWFuZChkb21haW4sIChFT2JqZWN0KSB0YXJnZXQsCi0JCQkJZmVhdHVyZSwgY29sbGVjdGlvbik7Ci0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbihnZXRDbGFzcygpLmdldE5hbWUoKSArICIjY3JlYXRlUmVtb3ZlQ29tbWFuZDogY2FuCi0JCS8vIGV4ZWN1dGU6ICIgKyBjbWQuY2FuRXhlY3V0ZSgpKTsKLQkJcmV0dXJuIGNtZDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjY3JlYXRlTW92ZUNvbW1hbmQob3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW4sCi0JICogICAgICBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmUsIGphdmEubGFuZy5PYmplY3QsIGludCkKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBjcmVhdGVNb3ZlQ29tbWFuZChFZGl0aW5nRG9tYWluIGRvbWFpbiwgRU9iamVjdCBvd25lciwKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBPYmplY3QgdmFsdWUsIGludCBpbmRleCkgewotCQlDb21tYW5kIGNtZCA9IHN1cGVyLmNyZWF0ZU1vdmVDb21tYW5kKGRvbWFpbiwgKEVPYmplY3QpIHRhcmdldCwKLQkJCQlmZWF0dXJlLCB2YWx1ZSwgaW5kZXgpOwotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiI2NyZWF0ZU1vdmVDb21tYW5kOiBjYW4KLQkJLy8gZXhlY3V0ZTogIiArIGNtZC5jYW5FeGVjdXRlKCkpOwotCQlyZXR1cm4gY21kOwotCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2NyZWF0ZUNvbW1hbmQoamF2YS5sYW5nLk9iamVjdCwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluLCBqYXZhLmxhbmcuQ2xhc3MsCi0JICogICAgICBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXIpCi0JICovCi0JcHVibGljIENvbW1hbmQgY3JlYXRlQ29tbWFuZChPYmplY3Qgb2JqZWN0LCBFZGl0aW5nRG9tYWluIGRvbWFpbiwKLQkJCUNsYXNzIGNvbW1hbmRDbGFzcywgQ29tbWFuZFBhcmFtZXRlciBjb21tYW5kUGFyYW1ldGVyKSB7Ci0JCWlmIChjb21tYW5kQ2xhc3MgPT0gUmVtb3ZlQ29tbWFuZC5jbGFzcykgewotCQkJY29tbWFuZFBhcmFtZXRlci5zZXRPd25lcih0YXJnZXQpOwotCQl9Ci0JCUNvbW1hbmQgY21kID0gc3VwZXIuY3JlYXRlQ29tbWFuZChvYmplY3QsIGRvbWFpbiwgY29tbWFuZENsYXNzLAotCQkJCWNvbW1hbmRQYXJhbWV0ZXIpOwotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiI2NyZWF0ZUNvbW1hbmQ6ICIgKwotCQkvLyBjb21tYW5kQ2xhc3MgKyAiLCBjYW4gZXhlY3V0ZTogIiArIGNtZC5jYW5FeGVjdXRlKCkgKyAiLCBvd25lcjogIiArCi0JCS8vIGNvbW1hbmRQYXJhbWV0ZXIuZ2V0T3duZXIoKSArICIsIGNvbGxlY3Rpb246ICIgKwotCQkvLyBjb21tYW5kUGFyYW1ldGVyLmdldENvbGxlY3Rpb24oKSk7Ci0JCXJldHVybiBjbWQ7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldENoaWxkcmVuKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlDaGlsZHJlblN0b3JlIHN0b3JlID0gZ2V0Q2hpbGRyZW5TdG9yZSh0YXJnZXQpOwotCQlpZiAoc3RvcmUgIT0gbnVsbCkgewotCQkJcmV0dXJuIHN0b3JlLmdldENoaWxkcmVuKCk7Ci0JCX0KLQotCQlzdG9yZSA9IGNyZWF0ZUNoaWxkcmVuU3RvcmUodGFyZ2V0KTsKLQkJTGlzdCByZXN1bHQgPSBzdG9yZSAhPSBudWxsID8gbnVsbCA6IG5ldyBBcnJheUxpc3QoKTsKLQkJRU9iamVjdCBlT2JqZWN0ID0gKEVPYmplY3QpIHRhcmdldDsKLQotCQlpZiAodGFyZ2V0ID09IG51bGwpIHJldHVybiByZXN1bHQ7Ci0JCQotCQlmb3IgKEl0ZXJhdG9yIGkgPSBnZXRDaGlsZHJlbkZlYXR1cmVzKHRhcmdldCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IChFU3RydWN0dXJhbEZlYXR1cmUpIGkubmV4dCgpOwotCQkJaWYgKGZlYXR1cmUuaXNNYW55KCkpIHsKLQkJCQlMaXN0IGNoaWxkcmVuID0gKExpc3QpIGVPYmplY3QuZUdldChmZWF0dXJlKTsKLQkJCQlpbnQgaW5kZXggPSAwOwotCQkJCWZvciAoSXRlcmF0b3IgY2kgPSBjaGlsZHJlbi5pdGVyYXRvcigpOyBjaS5oYXNOZXh0KCk7IGluZGV4KyspIHsKLQkJCQkJT2JqZWN0IGNoaWxkID0gY2kubmV4dCgpOwotCQkJCQlpZiAoYWNjZXB0QXNDaGlsZChjaGlsZCkpIHsKLQkJCQkJCWNoaWxkID0gd3JhcChlT2JqZWN0LCBmZWF0dXJlLCBjaGlsZCwgaW5kZXgpOwotCQkJCQkJaWYgKHN0b3JlICE9IG51bGwpIHsKLQkJCQkJCQlzdG9yZS5nZXRMaXN0KGZlYXR1cmUpLmFkZChjaGlsZCk7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCXJlc3VsdC5hZGQoY2hpbGQpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlPYmplY3QgY2hpbGQgPSBlT2JqZWN0LmVHZXQoZmVhdHVyZSk7Ci0JCQkJaWYgKGFjY2VwdEFzQ2hpbGQoY2hpbGQpKSB7Ci0JCQkJCWNoaWxkID0gd3JhcChlT2JqZWN0LCBmZWF0dXJlLCBjaGlsZCwKLQkJCQkJCQlDb21tYW5kUGFyYW1ldGVyLk5PX0lOREVYKTsKLQkJCQkJaWYgKHN0b3JlICE9IG51bGwpIHsKLQkJCQkJCXN0b3JlLnNldFZhbHVlKGZlYXR1cmUsIGNoaWxkKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCXJlc3VsdC5hZGQoY2hpbGQpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCUxpc3QgY2hpbGRyZW4gPSBzdG9yZSAhPSBudWxsID8gc3RvcmUuZ2V0Q2hpbGRyZW4oKSA6IHJlc3VsdDsKLQkJQ29sbGVjdGlvbnMuc29ydChjaGlsZHJlbiwgUHJlc2VudGF0aW9uQ29udGV4dC5JTlNUQU5DRS5nZXRDb21wYXJhdG9yKCkpOwotCQkKLQkJcmV0dXJuIGNoaWxkcmVuOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNjcmVhdGVEcmFnQW5kRHJvcENvbW1hbmQob3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW4sCi0JICogICAgICBqYXZhLmxhbmcuT2JqZWN0LCBmbG9hdCwgaW50LCBpbnQsIGphdmEudXRpbC5Db2xsZWN0aW9uKQotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGNyZWF0ZURyYWdBbmREcm9wQ29tbWFuZChFZGl0aW5nRG9tYWluIGRvbWFpbiwKLQkJCU9iamVjdCBvd25lciwgZmxvYXQgbG9jYXRpb24sIGludCBvcGVyYXRpb25zLCBpbnQgb3BlcmF0aW9uLAotCQkJQ29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCWJvb2xlYW4gY2FuRXhlYyA9IHRydWU7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGNvbGxlY3Rpb24uaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlpZiAoIWFjY2VwdEFzQ2hpbGQoaXRlci5uZXh0KCkpKSB7Ci0JCQkJY2FuRXhlYyA9IGZhbHNlOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCUNvbW1hbmQgY21kOwotCQlpZiAoY2FuRXhlYykgewotCQkJY21kID0gc3VwZXIuY3JlYXRlRHJhZ0FuZERyb3BDb21tYW5kKGRvbWFpbiwgb3duZXIsIGxvY2F0aW9uLAotCQkJCQlvcGVyYXRpb25zLCBvcGVyYXRpb24sIGNvbGxlY3Rpb24pOwotCQl9IGVsc2UgewotCQkJY21kID0gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJfQotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiI2NyZWF0ZU1vdmVDb21tYW5kOiBjYW4KLQkJLy8gZXhlY3V0ZTogIiArIGNtZC5jYW5FeGVjdXRlKCkpOwotCQlyZXR1cm4gY21kOwotCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyI25vdGlmeUNoYW5nZWQob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG1zZykgewotCQlUbmdVdGlsLnNldERlZmF1bHROYW1lKHRoaXMsIG1zZyk7Ci0KLQkJLy8gaWYobXNnLmdldE5vdGlmaWVyKCkgPT0gdGFyZ2V0KSB7Ci0JCS8vIGlmKGZlYXR1cmVJZCA9PSBVbWFQYWNrYWdlLkNPTlRFTlRfUEFDS0FHRV9fQ09OVEVOVF9FTEVNRU5UUykgewotCQkvLyBib29sZWFuIG5vdGlmeSA9IGZhbHNlOwotCQkvLyBzd2l0Y2gobXNnLmdldEV2ZW50VHlwZSgpKSB7Ci0JCS8vIGNhc2UgTm90aWZpY2F0aW9uLkFERDoKLQkJLy8gY2FzZSBOb3RpZmljYXRpb24uTU9WRToKLQkJLy8gT2JqZWN0IG9iaiA9IG1zZy5nZXROZXdWYWx1ZSgpOwotCQkvLyBub3RpZnkgPSBhY2NlcHRBc0NoaWxkKG9iaik7Ci0JCS8vIGJyZWFrOwotCQkvLyBjYXNlIE5vdGlmaWNhdGlvbi5SRU1PVkU6Ci0JCS8vIG9iaiA9IG1zZy5nZXRPbGRWYWx1ZSgpOwotCQkvLyBub3RpZnkgPSBhY2NlcHRBc0NoaWxkKG9iaik7Ci0JCS8vIGJyZWFrOwotCQkvLyBjYXNlIE5vdGlmaWNhdGlvbi5BRERfTUFOWToKLQkJLy8gQ29sbGVjdGlvbiBjb2xsZWN0aW9uID0gKENvbGxlY3Rpb24pIG1zZy5nZXROZXdWYWx1ZSgpOwotCQkvLyBmb3JfY2hlY2s6Ci0JCS8vIGZvcihJdGVyYXRvciBpdGVyID0gY29sbGVjdGlvbi5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJLy8gaWYoYWNjZXB0QXNDaGlsZChpdGVyLm5leHQoKSkpIHsKLQkJLy8gbm90aWZ5ID0gdHJ1ZTsKLQkJLy8gYnJlYWsgZm9yX2NoZWNrOwotCQkvLyB9Ci0JCS8vIH0KLQkJLy8gYnJlYWs7Ci0JCS8vIGNhc2UgTm90aWZpY2F0aW9uLlJFTU9WRV9NQU5ZOgotCQkvLyBjb2xsZWN0aW9uID0gKENvbGxlY3Rpb24pIG1zZy5nZXRPbGRWYWx1ZSgpOwotCQkvLyBmb3JfY2hlY2s6Ci0JCS8vIGZvcihJdGVyYXRvciBpdGVyID0gY29sbGVjdGlvbi5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJLy8gaWYoYWNjZXB0QXNDaGlsZChpdGVyLm5leHQoKSkpIHsKLQkJLy8gbm90aWZ5ID0gdHJ1ZTsKLQkJLy8gYnJlYWsgZm9yX2NoZWNrOwotCQkvLyB9Ci0JCS8vIH0KLQkJLy8gYnJlYWs7Ci0JCS8vCi0JCS8vIH0KLQkJLy8gaWYobm90aWZ5KSB7Ci0JCS8vIGZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obXNnLCB0aGlzLCB0cnVlLCBmYWxzZSkpOwotCQkvLyB9Ci0JCS8vIH0KLQkJLy8gfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG1zZyk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhYmxlI3NldENvbmZpZ3VyYXRpb24ob3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZpbHRlcihJRmlsdGVyIGZpbHRlcikgewotCQl0aGlzLmNoaWxkRmlsdGVyID0gZmlsdGVyOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYWJsZSNzZXRMYWJlbChqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldExhYmVsKFN0cmluZyBsYWJlbCkgewotCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhYmxlI3NldFBhcmVudChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBhcmVudChPYmplY3QgcGFyZW50KSB7Ci0JCXRoaXMucGFyZW50ID0gcGFyZW50OwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvRm9sZGVyIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LklEZWZhdWx0TmFtZVNldHRlciNzZXREZWZhdWx0TmFtZShqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlZmF1bHROYW1lKE9iamVjdCBvYmopIHsKLQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuSURlZmF1bHROYW1lU2V0dGVyI2dldEludGVyZXN0ZWRGZWF0dXJlSUQoKQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0SW50ZXJlc3RlZEZlYXR1cmVJRCgpIHsKLQkJcmV0dXJuIC0xOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuSURlZmF1bHROYW1lU2V0dGVyI2dldEludGVyZXN0ZWRGZWF0dXJlQ2xhc3MoKQotCSAqLwotCXB1YmxpYyBDbGFzcyBnZXRJbnRlcmVzdGVkRmVhdHVyZU93bmVyQ2xhc3MoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRDaGlsZHJlbkZlYXR1cmVzKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5GZWF0dXJlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBzdXBlci5nZXRDaGlsZHJlbkZlYXR1cmVzKG9iamVjdCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L1ZhcmlhYmlsaXR5SW5mby5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9WYXJpYWJpbGl0eUluZm8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjAwZTc0MS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L1ZhcmlhYmlsaXR5SW5mby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudDsKLQotLyoqCi0gKiBBIGhlbHBlciBjbGFzcyBmb3Igc3RvcmluZyB2YXJpYWJpbGl0eSBpbmZvcm1hdGlvbi4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFZhcmlhYmlsaXR5SW5mbyB7Ci0KLQlwcml2YXRlIFZhcmlhYmlsaXR5RWxlbWVudCBvd25lcjsKLQotCXByaXZhdGUgTGlzdCBpbmhlcml0YW5jZUxpc3Q7Ci0KLQlwcml2YXRlIEFycmF5TGlzdCBjb250cmlidXRvcnM7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqIAotCSAqIEBwYXJhbSBvd25lcgotCSAqICAgICAgICAgICAgYSB2YXJpYWJpbGl0eSBlbGVtZW50Ci0JICovCi0JcHVibGljIFZhcmlhYmlsaXR5SW5mbyhWYXJpYWJpbGl0eUVsZW1lbnQgb3duZXIpIHsKLQkJdGhpcy5vd25lciA9IG93bmVyOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIG93bmVyIG9mIHRoaXMgVmFyaWFiaWxpdHlJbmZvIG9iamVjdC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBvd25lciBvZiB0aGlzIFZhcmlhYmlsaXR5SW5mbyBvYmplY3QuCi0JICovCi0JcHVibGljIGZpbmFsIFZhcmlhYmlsaXR5RWxlbWVudCBnZXRPd25lcigpIHsKLQkJcmV0dXJuIG93bmVyOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHJlYWxpemVkIGluaGVyaXRhbmNlIGxpc3QgaW4gdGhlIG9yZGVyIGZyb20gdGhlIHJlc29sdmVkIG9iamVjdAotCSAqIG9mIHRoZSBvd25lciB0byB0aGUgaXRzIHRvcCBiYXNlLgotCSAqIAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRJbmhlcml0YW5jZUxpc3QoKSB7Ci0JCWlmIChpbmhlcml0YW5jZUxpc3QgPT0gbnVsbCkgewotCQkJaW5oZXJpdGFuY2VMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQl9Ci0JCXJldHVybiBpbmhlcml0YW5jZUxpc3Q7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgbGlzdCBvZiBhbGwgY29udHJpYnV0b3IgdG8KLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIExpc3QgZ2V0Q29udHJpYnV0b3JzKCkgewotCQlpZiAoY29udHJpYnV0b3JzID09IG51bGwpIHsKLQkJCWNvbnRyaWJ1dG9ycyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJfQotCQlyZXR1cm4gY29udHJpYnV0b3JzOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9icmVha2Rvd25lbGVtZW50L0FjdGl2aXR5SXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2JyZWFrZG93bmVsZW1lbnQvQWN0aXZpdHlJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGVjN2E2Zi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2JyZWFrZG93bmVsZW1lbnQvQWN0aXZpdHlJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qKgotICogCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5icmVha2Rvd25lbGVtZW50OwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLQotLyoqCi0gKiBAYXV0aG9yIHNrYW5ub29yCi0gKgotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZpdHlJdGVtUHJvdmlkZXIgZXh0ZW5kcwotCQlvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLkFjdGl2aXR5SXRlbVByb3ZpZGVyIHsKLQotCXB1YmxpYyBBY3Rpdml0eUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY29uc3RydWN0b3Igc3R1YgotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIFRuZ1V0aWwuZ2V0TGFiZWwob2JqZWN0LCBnZXRTdHJpbmcoIl9VSV9BY3Rpdml0eV90eXBlIikpOyAvLyROT04tTkxTLTEkCi0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlPYmplY3QgaW1nID0gVG5nVXRpbC5nZXRJbWFnZShvYmplY3QpOwotCQlyZXR1cm4gaW1nICE9IG51bGwgPyBpbWcgOiBzdXBlci5nZXRJbWFnZShvYmplY3QpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvYnJlYWtkb3duZWxlbWVudC9NaWxlc3RvbmVJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvYnJlYWtkb3duZWxlbWVudC9NaWxlc3RvbmVJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGI4ZDc5ZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2JyZWFrZG93bmVsZW1lbnQvTWlsZXN0b25lSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKioKLSAqIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuYnJlYWtkb3duZWxlbWVudDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotCi0vKioKLSAqIEBhdXRob3Igc2thbm5vb3IKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBNaWxlc3RvbmVJdGVtUHJvdmlkZXIgZXh0ZW5kcwotCQlvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLk1pbGVzdG9uZUl0ZW1Qcm92aWRlciB7Ci0KLQkvKioKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgTWlsZXN0b25lSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjb25zdHJ1Y3RvciBzdHViCi0JfQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gVG5nVXRpbC5nZXRMYWJlbChvYmplY3QsIGdldFN0cmluZygiX1VJX01pbGVzdG9uZV90eXBlIikpOyAvLyROT04tTkxTLTEkCi0JfQotCUBPdmVycmlkZQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm47Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jYXRlZ29yeS9DdXN0b21DYXRlZ29yaWVzSXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NhdGVnb3J5L0N1c3RvbUNhdGVnb3JpZXNJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzM0Yjc1Zi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NhdGVnb3J5L0N1c3RvbUNhdGVnb3JpZXNJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNhdGVnb3J5OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkxpYnJhcnlFZGl0Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DdXN0b21DYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQXNzb2NpYXRpb25IZWxwZXI7Ci0KLS8qKgotICogVGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgdGhlICJDdXN0b20gQ2F0ZWdvcmllcyIgZm9sZGVyLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBDdXN0b21DYXRlZ29yaWVzSXRlbVByb3ZpZGVyIGV4dGVuZHMKLQkJVHJhbnNpZW50Q2F0ZWdvcnlQYWNrYWdlSXRlbVByb3ZpZGVyIHsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIEN1c3RvbUNhdGVnb3JpZXNJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksCi0JCQlDb250ZW50UGFja2FnZSB0YXJnZXQsIFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5LCB0YXJnZXQsIG5hbWUpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhqYXZhLnV0aWwuQ29sbGVjdGlvbiwKLQkgKiAgICAgIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLAotCQkJT2JqZWN0IG9iamVjdCkgewotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRDb250ZW50UGFja2FnZV9Db250ZW50RWxlbWVudHMoKSwgVW1hRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkuY3JlYXRlQ3VzdG9tQ2F0ZWdvcnkoKSkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRDaGlsZHJlbkZlYXR1cmVzKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5GZWF0dXJlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlbkZlYXR1cmVzID09IG51bGwpIHsKLQkJCWNoaWxkcmVuRmVhdHVyZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQljaGlsZHJlbkZlYXR1cmVzLmFkZChVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkuZ2V0Q29udGVudFBhY2thZ2VfQ29udGVudEVsZW1lbnRzKCkpOwotCQl9Ci0JCXJldHVybiBjaGlsZHJlbkZlYXR1cmVzOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuVHJhbnNpZW50R3JvdXBJdGVtUHJvdmlkZXIjYWNjZXB0QXNDaGlsZChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGFjY2VwdEFzQ2hpbGQoT2JqZWN0IG9iaikgewotCQlpZiAoIXN1cGVyLmFjY2VwdEFzQ2hpbGQob2JqKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIGFjY2VwdChvYmopOwotCi0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBDdXN0b21DYXRlZ29yeSkgewotCQkJTGlzdCBteUNhdGVnb3JpZXMgPSBBc3NvY2lhdGlvbkhlbHBlcgotCQkJCQkuZ2V0Q3VzdG9tQ2F0ZWdvcmllcygoQ3VzdG9tQ2F0ZWdvcnkpIG9iaik7Ci0JCQlpZiAobXlDYXRlZ29yaWVzLmlzRW1wdHkoKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCi0JCQlpZiAobXlDYXRlZ29yaWVzLnNpemUoKSA9PSAxKSB7Ci0JCQkJLy8gcm9vdCBjdXN0b20gY2F0ZWdvcnkgaXMgdW5kZSB0aGUgaGlkZGVuIHBhY2thZ2UgYW5kIHdpbGwgbm90Ci0JCQkJLy8gYmUgcHJvY2Vzc2VkLgotCQkJCS8vIG5lZWQgdG8gc2hvdyBzdWIgY2F0ZWdvcmllcyB1bmRlciBpdAotCQkJCUN1c3RvbUNhdGVnb3J5IGMgPSAoQ3VzdG9tQ2F0ZWdvcnkpIG15Q2F0ZWdvcmllcy5nZXQoMCk7Ci0JCQkJaWYgKFRuZ1V0aWwuaXNSb290Q3VzdG9tQ2F0ZWdvcnkoYykpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRJbWFnZShqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvQ3VzdG9tQ2F0ZWdvcmllcyIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5UcmFuc2llbnRHcm91cEl0ZW1Qcm92aWRlciNnZXRDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIHN1cGVyLmdldENoaWxkcmVuKG9iamVjdCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5UcmFuc2llbnRHcm91cEl0ZW1Qcm92aWRlciNzZXREZWZhdWx0TmFtZShqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlZmF1bHROYW1lKE9iamVjdCBvYmopIHsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIEN1c3RvbUNhdGVnb3J5KSB7Ci0JCQlUbmdVdGlsLnNldERlZmF1bHROYW1lKFRuZ1V0aWwuZXh0cmFjdCgoKENvbnRlbnRQYWNrYWdlKSB0YXJnZXQpCi0JCQkJCS5nZXRDb250ZW50RWxlbWVudHMoKSwgQ3VzdG9tQ2F0ZWdvcnkuY2xhc3MpLAotCQkJCQkoTWV0aG9kRWxlbWVudCkgb2JqLAotCQkJCQlMaWJyYXJ5RWRpdENvbnN0YW50cy5ORVdfQ1VTVE9NX0NBVEVHT1JZKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jYXRlZ29yeS9DdXN0b21DYXRlZ29yeUl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jYXRlZ29yeS9DdXN0b21DYXRlZ29yeUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ODA1YzNkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY2F0ZWdvcnkvQ3VzdG9tQ2F0ZWdvcnlJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNhdGVnb3J5OwotCi1pbXBvcnQgamF2YS5uZXQuVVJJOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLlVuZXhlY3V0YWJsZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuRU1GRWRpdFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkFkZENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ2hhbmdlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSU5vdGlmeUNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRGVmYXVsdE5hbWVTZXR0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JTGlicmFyeUl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuUHJlc2VudGF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuTWV0aG9kRWxlbWVudEFkZENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pbnRlcm5hbC5JTGlzdGVuZXJQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuQ2F0ZWdvcnlTb3J0SGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5MaWJyYXJ5RWRpdENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuTWV0aG9kRWxlbWVudFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLk1vZGVsU3RydWN0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DdXN0b21DYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaWJhYmxlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQXNzb2NpYXRpb25IZWxwZXI7Ci0KLS8qKgotICogVGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSBjdXN0b20gY2F0ZWdvcnkuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEN1c3RvbUNhdGVnb3J5SXRlbVByb3ZpZGVyIGV4dGVuZHMKLQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5DdXN0b21DYXRlZ29yeUl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzCi0JCUlEZWZhdWx0TmFtZVNldHRlciwgSUxpYnJhcnlJdGVtUHJvdmlkZXIsIElMaXN0ZW5lclByb3ZpZGVyIHsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIEN1c3RvbUNhdGVnb3J5SXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRQYXJlbnQoT2JqZWN0IHBhcmVudCkgewotCQkvLyB0aGlzLnBhcmVudCA9IHBhcmVudDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0UGFyZW50KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IG9iamVjdCkgewotCi0JCS8vIEN1c3RvbUNhdGVnb3J5IGNhdGVnb3J5ID0gKEN1c3RvbUNhdGVnb3J5KSBvYmplY3Q7Ci0JCS8vIGlmKGNhdGVnb3J5LmVDb250YWluZXIoKSBpbnN0YW5jZW9mIEN1c3RvbUNhdGVnb3J5KSB7Ci0JCS8vIHJldHVybiBzdXBlci5nZXRQYXJlbnQob2JqZWN0KTsKLQkJLy8gfQotCQkvLwkJCi0JCS8vIGlmKHBhcmVudCAhPSBudWxsKSB7Ci0JCS8vIHJldHVybiBwYXJlbnQ7Ci0JCS8vIH0KLQkJLy8JCQotCQkvLyBpZihvYmplY3QgaW5zdGFuY2VvZiBFT2JqZWN0KSB7Ci0JCS8vIE1ldGhvZFBsdWdpbiBwbHVnaW4gPSBVbWFVdGlsLmdldE1ldGhvZFBsdWdpbigoRU9iamVjdCkgb2JqZWN0KTsKLQkJLy8gLy9pZihwbHVnaW4gPT0gbnVsbCkgcmV0dXJuIG51bGw7Ci0JCS8vCQkJCi0JCS8vIGlmKHBsdWdpbiAhPSBudWxsKSB7Ci0JCS8vIFN0cmluZ1tdIHBhdGggPSB7Ci0JCS8vIExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX0NvbnRlbnRfZ3JvdXAiKQotCQkvLyAsTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfQ3VzdG9tX0NhdGVnb3JpZXNfZ3JvdXAiKQotCQkvLyB9OwotCQkvLyByZXR1cm4gVG5nVXRpbC5nZXRBZGFwdGVyKHBsdWdpbiwgcGF0aCk7Ci0JCS8vIH0KLQkJLy8JCQkKLQkJLy8gfQotCi0JCWlmIChUbmdVdGlsLmlzUm9vdEN1c3RvbUNhdGVnb3J5KChDdXN0b21DYXRlZ29yeSkgb2JqZWN0KSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldFBhcmVudChvYmplY3QpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhqYXZhLnV0aWwuQ29sbGVjdGlvbiwKLQkgKiAgICAgIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLAotCQkJT2JqZWN0IG9iamVjdCkgewotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRDdXN0b21DYXRlZ29yeV9DYXRlZ29yaXplZEVsZW1lbnRzKCksIFVtYUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJLmNyZWF0ZUN1c3RvbUNhdGVnb3J5KCkpKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0Q2hpbGRyZW5GZWF0dXJlcyhqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuRmVhdHVyZXMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoY2hpbGRyZW5GZWF0dXJlcyA9PSBudWxsKSB7Ci0JCQljaGlsZHJlbkZlYXR1cmVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJLy8gY2hpbGRyZW5GZWF0dXJlcy5hZGQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q3VzdG9tQ2F0ZWdvcnlfU3ViQ2F0ZWdvcmllcygpKTsKLQkJCWNoaWxkcmVuRmVhdHVyZXMuYWRkKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCS5nZXRDdXN0b21DYXRlZ29yeV9DYXRlZ29yaXplZEVsZW1lbnRzKCkpOwotCQkJLy8gY2hpbGRyZW5GZWF0dXJlcy5hZGQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q3VzdG9tQ2F0ZWdvcnlfUHJvY2Vzc0VsZW1lbnRzKCkpOwotCQl9Ci0JCXJldHVybiBjaGlsZHJlbkZlYXR1cmVzOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5DcmVhdGVDaGlsZENvbW1hbmQuSGVscGVyI2dldENyZWF0ZUNoaWxkSW1hZ2UoamF2YS5sYW5nLk9iamVjdCwKLQkgKiAgICAgIGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5PYmplY3QsIGphdmEudXRpbC5Db2xsZWN0aW9uKQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0Q3JlYXRlQ2hpbGRJbWFnZShPYmplY3Qgb3duZXIsIE9iamVjdCBmZWF0dXJlLAotCQkJT2JqZWN0IGNoaWxkLCBDb2xsZWN0aW9uIHNlbGVjdGlvbikgewotCQlpZiAoZmVhdHVyZSBpbnN0YW5jZW9mIEVSZWZlcmVuY2UgJiYgY2hpbGQgaW5zdGFuY2VvZiBFT2JqZWN0KSB7Ci0JCQlFUmVmZXJlbmNlIHJlZmVyZW5jZSA9IChFUmVmZXJlbmNlKSBmZWF0dXJlOwotCQkJRUNsYXNzIHBhcmVudENsYXNzID0gcmVmZXJlbmNlLmdldEVDb250YWluaW5nQ2xhc3MoKTsKLQkJCUVDbGFzcyBjaGlsZENsYXNzID0gKChFT2JqZWN0KSBjaGlsZCkuZUNsYXNzKCk7Ci0JCQlTdHJpbmcgbmFtZSA9ICJmdWxsL2N0b29sMTYvQ3JlYXRlIiArIHBhcmVudENsYXNzLmdldE5hbWUoKSArICJfIiArIHJlZmVyZW5jZS5nZXROYW1lKCkgKyAiXyIgKyBjaGlsZENsYXNzLmdldE5hbWUoKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCXRyeSB7Ci0JCQkJcmV0dXJuIExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldEltYWdlKG5hbWUpOwotCQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKLQkJCQlTeXN0ZW0uZXJyLnByaW50bG4oZS5nZXRNZXNzYWdlKCkpOwotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIEVNRkVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0SW1hZ2UoImZ1bGwvY3Rvb2wxNi9DcmVhdGVDaGlsZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBoYW5kbGVSZW1vdmVkKEN1c3RvbUNhdGVnb3J5IGNhdGVnb3J5KSB7Ci0JCWlmIChBc3NvY2lhdGlvbkhlbHBlci5nZXRDdXN0b21DYXRlZ29yaWVzKGNhdGVnb3J5KS5pc0VtcHR5KCkpIHsKLQkJCS8vIHJlbW92ZSBhbGwgc3ViY2F0ZWdvcmllcwotCQkJLy8KLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGNhdGVnb3J5LmdldENhdGVnb3JpemVkRWxlbWVudHMoKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyLm5leHQoKTsKLQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEN1c3RvbUNhdGVnb3J5KSB7Ci0JCQkJCWl0ZXIucmVtb3ZlKCk7Ci0JCQkJfQotCQkJfQotCi0JCQlFY29yZVV0aWwucmVtb3ZlKGNhdGVnb3J5KTsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlciNub3RpZnlDaGFuZ2VkKG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJc2V0RGVmYXVsdE5hbWUobm90aWZpY2F0aW9uKTsKLQotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCi0JCUNvbnRlbnRQYWNrYWdlIHBrZzsKLQkJLy8gYm9vbGVhbiByZWZyZXNoQ3VzdG9tQ2F0ZWdvcnlSb290ID0gZmFsc2U7Ci0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChDdXN0b21DYXRlZ29yeS5jbGFzcykpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19OQU1FOgotCQkJVG5nVXRpbC5yZWZyZXNoQ29udHJpYnV0b3JzKHRoaXMsIG5vdGlmaWNhdGlvbiwgZmFsc2UsIHRydWUpOwotCQkJLy9mb3IgZXBmIGRlZmVjdDoxNzQwNDMKLQkJCWlmKCFUbmdVdGlsLmlzUm9vdEN1c3RvbUNhdGVnb3J5KChDdXN0b21DYXRlZ29yeSlub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKSkpewotCQkJCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSBNZXRob2RFbGVtZW50VXRpbC5nZXRNZXRob2RNb2RlbChub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKSk7Ci0JCQkJaWYocGx1Z2luICE9bnVsbCl7Ci0JCQkJCUN1c3RvbUNhdGVnb3J5IHJvb3QgPSBUbmdVdGlsLmdldFJvb3RDdXN0b21DYXRlZ29yeShwbHVnaW4pOwotCQkJCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgcm9vdCwgdHJ1ZSwgZmFsc2UpKTsKLQkJCQl9Ci0JCQl9Ci0JCQlicmVhazsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWToKLQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKSwgdHJ1ZSwgZmFsc2UpKTsKLQkJCWJyZWFrOwotCQkvLyBjYXNlIFVtYVBhY2thZ2UuQ1VTVE9NX0NBVEVHT1JZX19TVUJfQ0FURUdPUklFUzoKLQkJY2FzZSBVbWFQYWNrYWdlLkNVU1RPTV9DQVRFR09SWV9fQ0FURUdPUklaRURfRUxFTUVOVFM6Ci0JCQlwa2cgPSAoQ29udGVudFBhY2thZ2UpICgoRU9iamVjdCkgbm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCkpCi0JCQkJCS5lQ29udGFpbmVyKCk7Ci0JCQlpZiAoKHBrZyAhPSBudWxsKQotCQkJCQkmJiAoTW9kZWxTdHJ1Y3R1cmUuSElEREVOX1BBQ0tBR0VfTkFNRQotCQkJCQkJCS5lcXVhbHMocGtnLmdldE5hbWUoKSkpKSB7Ci0JCQkJLy8gbm90aWZpZXIgaXMgdGhlIHJvb3QgY3VzdG9tIGNhdGVnb3J5Ci0JCQkJLy8KLQkJCQlwa2cgPSAoQ29udGVudFBhY2thZ2UpIHBrZy5lQ29udGFpbmVyKCk7Ci0JCQl9Ci0JCQlPYmplY3Qgb2JqOwotCQkJQ3VzdG9tQ2F0ZWdvcnkgY2F0ZWdvcnk7Ci0JCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRFdmVudFR5cGUoKSkgewotCQkJY2FzZSBOb3RpZmljYXRpb24uQUREOgotCQkJCW9iaiA9IG5vdGlmaWNhdGlvbi5nZXROZXdWYWx1ZSgpOwotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBDdXN0b21DYXRlZ29yeSkgewotCQkJCQljYXRlZ29yeSA9IChDdXN0b21DYXRlZ29yeSkgb2JqOwotCQkJCQlpZiAoY2F0ZWdvcnkuZUNvbnRhaW5lcigpID09IG51bGwpIHsKLQkJCQkJCXBrZy5nZXRDb250ZW50RWxlbWVudHMoKS5hZGQoY2F0ZWdvcnkpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJLy8gcmVmcmVzaEN1c3RvbUNhdGVnb3J5Um9vdCA9IHRydWU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIE5vdGlmaWNhdGlvbi5BRERfTUFOWToKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSAoKENvbGxlY3Rpb24pIG5vdGlmaWNhdGlvbi5nZXROZXdWYWx1ZSgpKQotCQkJCQkJLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQlvYmogPSBpdGVyLm5leHQoKTsKLQkJCQkJaWYgKG9iaiBpbnN0YW5jZW9mIEN1c3RvbUNhdGVnb3J5KSB7Ci0JCQkJCQljYXRlZ29yeSA9IChDdXN0b21DYXRlZ29yeSkgb2JqOwotCQkJCQkJaWYgKGNhdGVnb3J5LmVDb250YWluZXIoKSA9PSBudWxsKSB7Ci0JCQkJCQkJcGtnLmdldENvbnRlbnRFbGVtZW50cygpLmFkZChjYXRlZ29yeSk7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCS8vIHJlZnJlc2hDdXN0b21DYXRlZ29yeVJvb3QgPSB0cnVlOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJCQotCQkJCS8vIHJlbW92aW5nIHN1YmNhdGVnb3JpZXMgaXMgaGFuZGxlZCBieSB0aGUgcmVtb3ZlIGNvbW1hbmQKLQkJCQkvLwotLy8JCQljYXNlIE5vdGlmaWNhdGlvbi5SRU1PVkU6Ci0vLwkJCQlvYmogPSBub3RpZmljYXRpb24uZ2V0T2xkVmFsdWUoKTsKLS8vCQkJCWlmIChvYmogaW5zdGFuY2VvZiBDdXN0b21DYXRlZ29yeSkgewotLy8JCQkJCWhhbmRsZVJlbW92ZWQoKEN1c3RvbUNhdGVnb3J5KSBvYmopOwotLy8JCQkJfQotLy8JCQkJYnJlYWs7Ci0vLwkJCWNhc2UgTm90aWZpY2F0aW9uLlJFTU9WRV9NQU5ZOgotLy8JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gKChDb2xsZWN0aW9uKSBub3RpZmljYXRpb24uZ2V0T2xkVmFsdWUoKSkKLS8vCQkJCQkJLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotLy8JCQkJCW9iaiA9IGl0ZXIubmV4dCgpOwotLy8JCQkJCWlmIChvYmogaW5zdGFuY2VvZiBDdXN0b21DYXRlZ29yeSkgewotLy8JCQkJCQloYW5kbGVSZW1vdmVkKChDdXN0b21DYXRlZ29yeSkgb2JqKTsKLS8vCQkJCQl9Ci0vLwkJCQl9Ci0vLwkJCQlicmVhazsKLQkJCX0KLQkJCQotCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbgotCQkJCQkuZ2V0Tm90aWZpZXIoKSwgdHJ1ZSwgZmFsc2UpKTsKLQotCQkJLy8gLy8gcmVmcmVzaCB3cmFwcGVycwotCQkJLy8gLy8KLQkJCS8vIGlmKHdyYXBwZXJzICE9IG51bGwpIHsKLQkJCS8vIGZvciAoSXRlcmF0b3IgaXRlciA9IG5ldyBBcnJheUxpc3Qod3JhcHBlcnMpLml0ZXJhdG9yKCk7Ci0JCQkvLyBpdGVyLmhhc05leHQoKTspIHsKLQkJCS8vIGZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLAotCQkJLy8gaXRlci5uZXh0KCksIHRydWUsIGZhbHNlKSk7Ci0JCQkvLyB9Ci0JCQkvLyB9Ci0JCQkvLwkJCQotCQkJLy8gaWYocmVmcmVzaEN1c3RvbUNhdGVnb3J5Um9vdCkgewotCQkJLy8gLy8gc3ViIGNhdGVnb3J5IGhhcyBiZWVuIGFkZGVkIG9yIHJlbW92ZWQgZnJvbSB0aGUgY3VzdG9tCi0JCQkvLyBjYXRlZ29yeQotCQkJLy8gLy8gbmVlZCB0byByZWZyZXNoIHRoZSBmb2xkZXIgZm9yIGFsbCBjdXN0b20gY2F0ZWdvcmllcwotCQkJLy8gLy8KLQkJCS8vIE1ldGhvZFBsdWdpbiBwbHVnaW4gPSBVbWFVdGlsLmdldE1ldGhvZFBsdWdpbigoRU9iamVjdCkgdGFyZ2V0KTsKLQkJCS8vCQkJCQotCQkJLy8gaWYocGx1Z2luICE9IG51bGwpIHsKLQkJCS8vIFN0cmluZ1tdIHBhdGggPSB7Ci0JCQkvLyBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9Db250ZW50X2dyb3VwIikKLQkJCS8vICxMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9DdXN0b21fQ2F0ZWdvcmllc19ncm91cCIpCi0JCQkvLyB9OwotCQkJLy8gZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sCi0JCQkvLyBUbmdVdGlsLmdldEFkYXB0ZXIocGx1Z2luLCBwYXRoKSwgdHJ1ZSwgZmFsc2UpKTsKLQkJCS8vIH0KLQkJCS8vIH0KLQotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjaXNXcmFwcGluZ05lZWRlZChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzV3JhcHBpbmdOZWVkZWQoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgT2JqZWN0IGNyZWF0ZVdyYXBwZXIoRU9iamVjdCBvYmplY3QsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLAotCQkJT2JqZWN0IHZhbHVlLCBpbnQgaW5kZXgpIHsKLQkJaWYgKCFpc1dyYXBwaW5nTmVlZGVkKG9iamVjdCkpCi0JCQlyZXR1cm4gdmFsdWU7Ci0JCXJldHVybiBUbmdVdGlsLmNyZWF0ZVdyYXBwZXIoYWRhcHRlckZhY3RvcnksIG9iamVjdCwgZmVhdHVyZSwgdmFsdWUsCi0JCQkJaW5kZXgpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRUZXh0KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIFRuZ1V0aWwuZ2V0TGFiZWwoKFZhcmlhYmlsaXR5RWxlbWVudCkgb2JqZWN0LAotCQkJCWdldFN0cmluZygiX1VJX0N1c3RvbUNhdGVnb3J5X3R5cGUiKSwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjaGFzQ2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCUN1c3RvbUNhdGVnb3J5IGNhdGVnb3J5ID0gKEN1c3RvbUNhdGVnb3J5KSBvYmplY3Q7Ci0JCXJldHVybiAhY2F0ZWdvcnkuZ2V0Q2F0ZWdvcml6ZWRFbGVtZW50cygpLmlzRW1wdHkoKQotCQkvLyB8fCAhY2F0ZWdvcnkuZ2V0U3ViQ2F0ZWdvcmllcygpLmlzRW1wdHkoKQotCQk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RGVmYXVsdE5hbWUoTm90aWZpY2F0aW9uIG1zZykgewotCQlJRGVmYXVsdE5hbWVTZXR0ZXIgZGVmYXVsdE5hbWVTZXR0ZXIgPSB0aGlzOwotCQlpZiAoZGVmYXVsdE5hbWVTZXR0ZXIuZ2V0SW50ZXJlc3RlZEZlYXR1cmVPd25lckNsYXNzKCkgIT0gbnVsbCkgewotCQkJaW50IGZlYXR1cmVJZCA9IG1zZy5nZXRGZWF0dXJlSUQoZGVmYXVsdE5hbWVTZXR0ZXIKLQkJCQkJLmdldEludGVyZXN0ZWRGZWF0dXJlT3duZXJDbGFzcygpKTsKLQkJCWlmIChmZWF0dXJlSWQgPT0gZGVmYXVsdE5hbWVTZXR0ZXIuZ2V0SW50ZXJlc3RlZEZlYXR1cmVJRCgpKSB7Ci0JCQkJc3dpdGNoIChtc2cuZ2V0RXZlbnRUeXBlKCkpIHsKLQkJCQljYXNlIE5vdGlmaWNhdGlvbi5BREQ6Ci0JCQkJCXNldERlZmF1bHROYW1lKG1zZy5nZXROZXdWYWx1ZSgpLCBtc2cuZ2V0Tm90aWZpZXIoKSk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgTm90aWZpY2F0aW9uLkFERF9NQU5ZOgotCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSAoKENvbGxlY3Rpb24pIG1zZy5nZXROZXdWYWx1ZSgpKQotCQkJCQkJCS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJCXNldERlZmF1bHROYW1lKGl0ZXIubmV4dCgpLCBtc2cuZ2V0Tm90aWZpZXIoKSk7Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldERlZmF1bHROYW1lKE9iamVjdCBvYmosIE9iamVjdCBwYXJlbnQpIHsKLQkJU3RyaW5nIGJhc2VOYW1lID0gbnVsbDsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIEN1c3RvbUNhdGVnb3J5KSB7Ci0JCQlTdHJpbmcgY2NOYW1lID0gKChDdXN0b21DYXRlZ29yeSlvYmopLmdldE5hbWUoKTsKLQkJCWlmIChjY05hbWUgPT0gbnVsbCB8fCBjY05hbWUudHJpbSgpLmxlbmd0aCgpID09IDApIHsKLQkJCQliYXNlTmFtZSA9IExpYnJhcnlFZGl0Q29uc3RhbnRzLk5FV19DVVNUT01fQ0FURUdPUlk7Ci0JCQkJVG5nVXRpbC5zZXREZWZhdWx0TmFtZSgoQ3VzdG9tQ2F0ZWdvcnkpIHBhcmVudCwgKEN1c3RvbUNhdGVnb3J5KSBvYmosIGJhc2VOYW1lKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuSURlZmF1bHROYW1lU2V0dGVyI2dldEludGVyZXN0ZWRGZWF0dXJlSUQoKQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0SW50ZXJlc3RlZEZlYXR1cmVJRCgpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuQ1VTVE9NX0NBVEVHT1JZX19DQVRFR09SSVpFRF9FTEVNRU5UUzsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LklEZWZhdWx0TmFtZVNldHRlciNnZXRJbnRlcmVzdGVkRmVhdHVyZU93bmVyQ2xhc3MoKQotCSAqLwotCXB1YmxpYyBDbGFzcyBnZXRJbnRlcmVzdGVkRmVhdHVyZU93bmVyQ2xhc3MoKSB7Ci0JCXJldHVybiBDdXN0b21DYXRlZ29yeS5jbGFzczsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29tbWFuZCBjcmVhdGVBZGRDb21tYW5kKEVkaXRpbmdEb21haW4gZG9tYWluLCBFT2JqZWN0IG93bmVyLAotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIENvbGxlY3Rpb24gY29sbGVjdGlvbiwgaW50IGluZGV4KSB7Ci0JCUNvbGxlY3Rpb24gc2VsZWN0aW9uID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjb2xsZWN0aW9uLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyLm5leHQoKTsKLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgQ3VzdG9tQ2F0ZWdvcnkpIHsKLQkJCQkvLyBjaGVjayBjdXN0b20gY2F0ZWdvcnkgZm9yIGNpcmN1bGFyIGRlcGVuZGVuY3kKLQkJCQkvLwotCQkJCWlmICghKG93bmVyIGluc3RhbmNlb2YgRGVzY3JpYmFibGVFbGVtZW50ICYmIFRuZ1V0aWwKLQkJCQkJCS5pc0FuY2Vzc29yT2YoKEN1c3RvbUNhdGVnb3J5KSBlbGVtZW50LAotCQkJCQkJCQkoRGVzY3JpYmFibGVFbGVtZW50KSBvd25lcikpKSB7Ci0JCQkJCXNlbGVjdGlvbi5hZGQoZWxlbWVudCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmIChzZWxlY3Rpb24uaXNFbXB0eSgpKSB7Ci0JCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJfQotCi0JCXJldHVybiBuZXcgTWV0aG9kRWxlbWVudEFkZENvbW1hbmQoKEFkZENvbW1hbmQpIHN1cGVyLmNyZWF0ZUFkZENvbW1hbmQoCi0JCQkJZG9tYWluLCBvd25lciwgZmVhdHVyZSwgY29sbGVjdGlvbiwgaW5kZXgpKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjY3JlYXRlUmVtb3ZlQ29tbWFuZChvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbiwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0LAotCSAqICAgICAgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZSwgamF2YS51dGlsLkNvbGxlY3Rpb24pCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgY3JlYXRlUmVtb3ZlQ29tbWFuZChFZGl0aW5nRG9tYWluIGRvbWFpbiwgRU9iamVjdCBvd25lciwKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJcmV0dXJuIHN1cGVyLmNyZWF0ZVJlbW92ZUNvbW1hbmQoZG9tYWluLCBvd25lciwgZmVhdHVyZSwgY29sbGVjdGlvbik7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhYmxlI3NldExhYmVsKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGFiZWwoU3RyaW5nIGxhYmVsKSB7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChUbmdVdGlsLmlzUm9vdEN1c3RvbUNhdGVnb3J5KChDdXN0b21DYXRlZ29yeSkgb2JqZWN0KSkKLQkJCXJldHVybiBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvQ3VzdG9tQ2F0ZWdvcmllcyIpOyAvLyROT04tTkxTLTEkCi0JCWVsc2UgewotCQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIERlc2NyaWJhYmxlRWxlbWVudCkgewotCQkJCWlmICgoKERlc2NyaWJhYmxlRWxlbWVudCkgb2JqZWN0KS5nZXROb2RlaWNvbigpICE9IG51bGwpIHsKLQkJCQkJVVJJIGltZ1VyaSA9IFRuZ1V0aWwuZ2V0RnVsbFBhdGhvZk5vZGVvclNoYXBlSWNvblVSSSgKLQkJCQkJCQkoRGVzY3JpYmFibGVFbGVtZW50KSBvYmplY3QsCi0JCQkJCQkJKChEZXNjcmliYWJsZUVsZW1lbnQpIG9iamVjdCkuZ2V0Tm9kZWljb24oKSk7Ci0JCQkJCU9iamVjdCBpbWFnZSA9IExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCQkJLmdldFNoYXJlZEltYWdlKGltZ1VyaSk7Ci0JCQkJCWlmIChpbWFnZSAhPSBudWxsKQotCQkJCQkJcmV0dXJuIGltYWdlOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBzdXBlci5nZXRJbWFnZShvYmplY3QpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RGVmYXVsdE5hbWUoT2JqZWN0IG9iaikgewotCQkvLyBkbyBub3RoaW5nLCBhbHJlYWR5IGhhbmRsZWQgYnkgc2V0RGVmYXVsdE5hbWUoTm90aWZpY2F0aW9uKQotCX0KLQotCXB1YmxpYyBMaXN0PElOb3RpZnlDaGFuZ2VkTGlzdGVuZXI+IGdldE5vdGlmeUNoYW5nZWRMaXN0ZW5lcnMoKSB7Ci0JCWlmKGNoYW5nZU5vdGlmaWVyIGluc3RhbmNlb2YgQ2hhbmdlTm90aWZpZXIpIHsKLQkJCXJldHVybiBuZXcgQXJyYXlMaXN0PElOb3RpZnlDaGFuZ2VkTGlzdGVuZXI+KChDaGFuZ2VOb3RpZmllcikgY2hhbmdlTm90aWZpZXIpOwotCQl9Ci0JCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsKLQl9Ci0JCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQkKLQkJQ29sbGVjdGlvbiBjb2wgPSBzdXBlci5nZXRDaGlsZHJlbihvYmplY3QpOwotCQlpZihUbmdVdGlsLmlzUm9vdEN1c3RvbUNhdGVnb3J5KChDdXN0b21DYXRlZ29yeSlvYmplY3QpKXsKLQkJCUxpc3Qgc29ydExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlzb3J0TGlzdC5hZGRBbGwoY29sKTsKLQkJCUNvbGxlY3Rpb25zLnNvcnQoc29ydExpc3QsIFByZXNlbnRhdGlvbkNvbnRleHQuSU5TVEFOQ0UuZ2V0Q29tcGFyYXRvcigpKTsKLQkJCXJldHVybiBzb3J0TGlzdDsKLQkJfSBlbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQlMaXN0IHNvcnRMaXN0ID0gQ2F0ZWdvcnlTb3J0SGVscGVyLnNvcnRDYXRlZ29yeUVsZW1lbnRzKChNZXRob2RFbGVtZW50KW9iamVjdCwgY29sLnRvQXJyYXkoKSk7Ci0JCQlyZXR1cm4gc29ydExpc3Q7Ci0JCX0KLQkJcmV0dXJuIGNvbDsKLQl9Ci0JCi19Ci0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY2F0ZWdvcnkvRGlzY2lwbGluZUNhdGVnb3JpZXNJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY2F0ZWdvcnkvRGlzY2lwbGluZUNhdGVnb3JpZXNJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTIyM2Q4Yi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NhdGVnb3J5L0Rpc2NpcGxpbmVDYXRlZ29yaWVzSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jYXRlZ29yeTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkxpYnJhcnlFZGl0Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudENhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaXNjaXBsaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGlzY2lwbGluZUdyb3VwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5Bc3NvY2lhdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLQotLyoqCi0gKiBUaGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciB0aGUgIkRpc2NpcGxpbmVzIiBmb2xkZXIuCi0gKiA8cD4KLSAqIFRoaXMgY2xhc3Mgd2lsbCBiZSByZW5hbWVkIGFzIERpc2NpcGxpbmVzSXRlbVByb3ZpZGVyIGluIEVQRiBNNS4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRGlzY2lwbGluZUNhdGVnb3JpZXNJdGVtUHJvdmlkZXIgZXh0ZW5kcwotCQlUcmFuc2llbnRDYXRlZ29yeVBhY2thZ2VJdGVtUHJvdmlkZXIgewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgRGlzY2lwbGluZUNhdGVnb3JpZXNJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksCi0JCQlDb250ZW50UGFja2FnZSB0YXJnZXQsIFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5LCB0YXJnZXQsIG5hbWUpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuY2F0ZWdvcnkuVHJhbnNpZW50Q2F0ZWdvcnlQYWNrYWdlSXRlbVByb3ZpZGVyI2lzSW5oZXJpdGVkKG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudENhdGVnb3J5KQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzSW5oZXJpdGVkKENvbnRlbnRDYXRlZ29yeSBjYXRlZ29yeSkgewotCQlyZXR1cm4gKGNhdGVnb3J5IGluc3RhbmNlb2YgRGlzY2lwbGluZSB8fCBjYXRlZ29yeSBpbnN0YW5jZW9mIERpc2NpcGxpbmVHcm91cGluZykKLQkJCQkmJiBjYXRlZ29yeS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkgIT0gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoamF2YS51dGlsLkNvbGxlY3Rpb24sCi0JICogICAgICBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywKLQkJCU9iamVjdCBvYmplY3QpIHsKLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0Q29udGVudFBhY2thZ2VfQ29udGVudEVsZW1lbnRzKCksIFVtYUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJLmNyZWF0ZURpc2NpcGxpbmVHcm91cGluZygpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0Q29udGVudFBhY2thZ2VfQ29udGVudEVsZW1lbnRzKCksIFVtYUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJLmNyZWF0ZURpc2NpcGxpbmUoKSkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRDaGlsZHJlbkZlYXR1cmVzKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5GZWF0dXJlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlbkZlYXR1cmVzID09IG51bGwpIHsKLQkJCWNoaWxkcmVuRmVhdHVyZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQljaGlsZHJlbkZlYXR1cmVzLmFkZChVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkuZ2V0Q29udGVudFBhY2thZ2VfQ29udGVudEVsZW1lbnRzKCkpOwotCQl9Ci0JCXJldHVybiBjaGlsZHJlbkZlYXR1cmVzOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBhY2NlcHQoT2JqZWN0IG9iaikgewotCQlpZiAob2JqIGluc3RhbmNlb2YgRGlzY2lwbGluZUdyb3VwaW5nKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlpZiAob2JqIGluc3RhbmNlb2YgRGlzY2lwbGluZSkgewotCQkJTGlzdCBncm91cHMgPSBBc3NvY2lhdGlvbkhlbHBlci5nZXREaXNjaXBsaW5lR3JvdXBzKChEaXNjaXBsaW5lKSBvYmopOwotCQkJaWYgKGdyb3Vwcy5pc0VtcHR5KCkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0gZWxzZSB7Ci0JCQkJZm9yIChPYmplY3QgZ3JvdXAgOiBncm91cHMpIHsKLQkJCQkJaWYgKGdyb3VwIGluc3RhbmNlb2YgRGlzY2lwbGluZUdyb3VwaW5nKSB7Ci0JCQkJCQlpZiAoVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4oKERpc2NpcGxpbmVHcm91cGluZylncm91cCkgPT0gVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4oKERpc2NpcGxpbmUpb2JqKSkgewotCQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5UcmFuc2llbnRHcm91cEl0ZW1Qcm92aWRlciNhY2NlcHRBc0NoaWxkKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0QXNDaGlsZChPYmplY3Qgb2JqKSB7Ci0JCWlmICghc3VwZXIuYWNjZXB0QXNDaGlsZChvYmopKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gYWNjZXB0KG9iaik7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldEltYWdlKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9EaXNjaXBsaW5lcyIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5UcmFuc2llbnRHcm91cEl0ZW1Qcm92aWRlciNnZXRDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJQ29sbGVjdGlvbiBjaGlsZHJlbiA9IHN1cGVyLmdldENoaWxkcmVuKG9iamVjdCk7Ci0KLQkJZm9yIChJdGVyYXRvciBpdGVyID0gY2hpbGRyZW4uaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZWxlbWVudCA9IGl0ZXIubmV4dCgpOwotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBEaXNjaXBsaW5lKSB7Ci0JCQkJRGlzY2lwbGluZSBjaGlsZCA9IChEaXNjaXBsaW5lKSBlbGVtZW50OwotCQkJCURpc2NpcGxpbmVJdGVtUHJvdmlkZXIgaXRlbVByb3ZpZGVyID0gKERpc2NpcGxpbmVJdGVtUHJvdmlkZXIpIFRuZ1V0aWwKLQkJCQkJCS5nZXRCZXN0QWRhcHRlckZhY3RvcnkoYWRhcHRlckZhY3RvcnkpLmFkYXB0KGNoaWxkLAotCQkJCQkJCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkJCWl0ZW1Qcm92aWRlci5zZXRQYXJlbnQob2JqZWN0KTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBjaGlsZHJlbjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXREZWZhdWx0TmFtZShPYmplY3Qgb2JqKSB7Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBEaXNjaXBsaW5lKSB7Ci0JCQlUbmdVdGlsLnNldERlZmF1bHROYW1lKFRuZ1V0aWwuZXh0cmFjdCgoKENvbnRlbnRQYWNrYWdlKSB0YXJnZXQpCi0JCQkJCS5nZXRDb250ZW50RWxlbWVudHMoKSwgRGlzY2lwbGluZS5jbGFzcyksCi0JCQkJCShNZXRob2RFbGVtZW50KSBvYmosIExpYnJhcnlFZGl0Q29uc3RhbnRzLk5FV19ESVNDSVBMSU5FKTsKLQkJfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBEaXNjaXBsaW5lR3JvdXBpbmcpIHsKLQkJCVRuZ1V0aWwuc2V0RGVmYXVsdE5hbWUoVG5nVXRpbC5leHRyYWN0KCgoQ29udGVudFBhY2thZ2UpIHRhcmdldCkKLQkJCQkJLmdldENvbnRlbnRFbGVtZW50cygpLCBEaXNjaXBsaW5lR3JvdXBpbmcuY2xhc3MpLAotCQkJCQkoTWV0aG9kRWxlbWVudCkgb2JqLAotCQkJCQlMaWJyYXJ5RWRpdENvbnN0YW50cy5ORVdfRElTQ0lQTElORV9HUk9VUElORyk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY2F0ZWdvcnkvRGlzY2lwbGluZUNhdGVnb3J5SXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NhdGVnb3J5L0Rpc2NpcGxpbmVDYXRlZ29yeUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MjljNmIzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY2F0ZWdvcnkvRGlzY2lwbGluZUNhdGVnb3J5SXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNzEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jYXRlZ29yeTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5FTUZFZGl0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQWRkQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRGVmYXVsdE5hbWVTZXR0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JTGlicmFyeUl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuUHJlc2VudGF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuTWV0aG9kRWxlbWVudEFkZENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkxpYnJhcnlFZGl0Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaXNjaXBsaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGlzY2lwbGluZUdyb3VwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5VbWFVdGlsOwotCi0vKioKLSAqIFRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEgZGlzY2lwbGluZSBncm91cGluZy4KLSAqIDxwPgotICogVGhpcyBjbGFzcyB3aWxsIGJlIHJlbmFtZWQgYXMgRGlzY2lwbGluZUdyb3VwaW5nSXRlbVByb3ZpZGVyIGluIEVQRiBNNS4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRGlzY2lwbGluZUNhdGVnb3J5SXRlbVByb3ZpZGVyIGV4dGVuZHMKLQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5EaXNjaXBsaW5lR3JvdXBpbmdJdGVtUHJvdmlkZXIgaW1wbGVtZW50cwotCQlJRGVmYXVsdE5hbWVTZXR0ZXIsIElMaWJyYXJ5SXRlbVByb3ZpZGVyIHsKLQotCXByb3RlY3RlZCBPYmplY3QgcGFyZW50OwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgRGlzY2lwbGluZUNhdGVnb3J5SXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoamF2YS51dGlsLkNvbGxlY3Rpb24sCi0JICogICAgICBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywKLQkJCU9iamVjdCBvYmplY3QpIHsKLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0RGlzY2lwbGluZUdyb3VwaW5nX0Rpc2NpcGxpbmVzKCksIFVtYUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJLmNyZWF0ZURpc2NpcGxpbmUoKSkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRDaGlsZHJlbkZlYXR1cmVzKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5GZWF0dXJlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlbkZlYXR1cmVzID09IG51bGwpIHsKLQkJCWNoaWxkcmVuRmVhdHVyZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQljaGlsZHJlbkZlYXR1cmVzLmFkZChVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkuZ2V0RGlzY2lwbGluZUdyb3VwaW5nX0Rpc2NpcGxpbmVzKCkpOwotCQl9Ci0JCXJldHVybiBjaGlsZHJlbkZlYXR1cmVzOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRQYXJlbnQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChwYXJlbnQgIT0gbnVsbCkgewotCQkJcmV0dXJuIHBhcmVudDsKLQkJfQotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgRU9iamVjdCkgewotCQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IFVtYVV0aWwuZ2V0TWV0aG9kUGx1Z2luKChFT2JqZWN0KSBvYmplY3QpOwotCQkJaWYgKHBsdWdpbiAhPSBudWxsKSB7Ci0JCQkJU3RyaW5nW10gcGF0aCA9IHsKLQkJCQkJCUxpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCQkJCS5nZXRTdHJpbmcoIl9VSV9Db250ZW50X2dyb3VwIikgLy8kTk9OLU5MUy0xJAotCQkJCQkJLAotCQkJCQkJTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJCQkJLmdldFN0cmluZygiX1VJX1N0YW5kYXJkX0NhdGVnb3JpZXNfZ3JvdXAiKSAvLyROT04tTkxTLTEkCi0JCQkJCQksCi0JCQkJCQlMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkJCQkuZ2V0U3RyaW5nKCJfVUlfRGlzY2lwbGluZXNfZ3JvdXAiKSAvLyROT04tTkxTLTEkCi0JCQkJfTsKLQotCQkJCXJldHVybiBUbmdVdGlsLmdldEFkYXB0ZXIocGx1Z2luLCBwYXRoKTsKLQkJCX0KLQkJfQotCi0JCS8vIE1ldGhvZFBsdWdpbiBtb2RlbCA9IFVtYVV0aWwuZ2V0TWV0aG9kUGx1Z2luKChNZXRob2RFbGVtZW50KSBvYmplY3QpOwotCQkvLyBpZihtb2RlbCA9PSBudWxsKSByZXR1cm4gbnVsbDsKLQkJLy8gSUdyb3VwQ29udGFpbmVyIGdyb3VwQ29udGFpbmVyID0gKElHcm91cENvbnRhaW5lcikKLQkJLy8gVG5nVXRpbC5nZXRBZGFwdGVyKChFT2JqZWN0KW1vZGVsLCBJR3JvdXBDb250YWluZXIuY2xhc3MpOwotCQkvLyBpZihncm91cENvbnRhaW5lciAhPSBudWxsKSB7Ci0JCS8vIGdyb3VwQ29udGFpbmVyID0gKElHcm91cENvbnRhaW5lcikKLQkJLy8gZ3JvdXBDb250YWluZXIuZ2V0R3JvdXBJdGVtUHJvdmlkZXIoTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfQ29udGVudF9ncm91cCIpKTsKLQkJLy8gcmV0dXJuCi0JCS8vIGdyb3VwQ29udGFpbmVyLmdldEdyb3VwSXRlbVByb3ZpZGVyKExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX0Rpc2NpcGxpbmVzX2dyb3VwIikpOwotCQkvLyB9Ci0JCS8vIC8vIE1ldGhvZE1vZGVsSXRlbVByb3ZpZGVyIGl0ZW1Qcm92aWRlciA9IChNZXRob2RNb2RlbEl0ZW1Qcm92aWRlcikKLQkJLy8gVG5nVXRpbC5nZXRBZGFwdGVyKChFT2JqZWN0KW1vZGVsLCBNZXRob2RNb2RlbEl0ZW1Qcm92aWRlci5jbGFzcyk7Ci0JCS8vIC8vIGlmKGl0ZW1Qcm92aWRlciAhPSBudWxsKSB7Ci0JCS8vIC8vIHJldHVybiBpdGVtUHJvdmlkZXIuZ2V0RGlzY2lwbGluZUNhdGVnb3JpZXMoKTsKLQkJLy8gLy8gfQotCi0JCXJldHVybiBzdXBlci5nZXRQYXJlbnQob2JqZWN0KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0Q2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCUNvbGxlY3Rpb24gY2hpbGRyZW4gPSBzdXBlci5nZXRDaGlsZHJlbihvYmplY3QpOwotCQlpZiAoY2hpbGRyZW4gaW5zdGFuY2VvZiBMaXN0KQotCQkJQ29sbGVjdGlvbnMuc29ydCgoTGlzdCkgY2hpbGRyZW4sIFByZXNlbnRhdGlvbkNvbnRleHQuSU5TVEFOQ0UKLQkJCQkJLmdldENvbXBhcmF0b3IoKSk7Ci0JCXJldHVybiBjaGlsZHJlbjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ3JlYXRlQ2hpbGRDb21tYW5kLkhlbHBlciNnZXRDcmVhdGVDaGlsZEltYWdlKGphdmEubGFuZy5PYmplY3QsCi0JICogICAgICBqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLnV0aWwuQ29sbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldENyZWF0ZUNoaWxkSW1hZ2UoT2JqZWN0IG93bmVyLCBPYmplY3QgZmVhdHVyZSwKLQkJCU9iamVjdCBjaGlsZCwgQ29sbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJaWYgKGZlYXR1cmUgaW5zdGFuY2VvZiBFUmVmZXJlbmNlICYmIGNoaWxkIGluc3RhbmNlb2YgRU9iamVjdCkgewotCQkJRVJlZmVyZW5jZSByZWZlcmVuY2UgPSAoRVJlZmVyZW5jZSkgZmVhdHVyZTsKLQkJCUVDbGFzcyBwYXJlbnRDbGFzcyA9IHJlZmVyZW5jZS5nZXRFQ29udGFpbmluZ0NsYXNzKCk7Ci0JCQlFQ2xhc3MgY2hpbGRDbGFzcyA9ICgoRU9iamVjdCkgY2hpbGQpLmVDbGFzcygpOwotCQkJU3RyaW5nIG5hbWUgPSAiZnVsbC9jdG9vbDE2L0NyZWF0ZSIgKyBwYXJlbnRDbGFzcy5nZXROYW1lKCkgKyAiXyIgKyByZWZlcmVuY2UuZ2V0TmFtZSgpICsgIl8iICsgY2hpbGRDbGFzcy5nZXROYW1lKCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQl0cnkgewotCQkJCXJldHVybiBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRJbWFnZShuYW1lKTsKLQkJCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJU3lzdGVtLmVyci5wcmludGxuKGUuZ2V0TWVzc2FnZSgpKTsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBFTUZFZGl0UGx1Z2luLklOU1RBTkNFLmdldEltYWdlKCJmdWxsL2N0b29sMTYvQ3JlYXRlQ2hpbGQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRUZXh0KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJLy8gU3RyaW5nIGxhYmVsID0gVG5nVXRpbC5nZXRMYWJlbChvYmplY3QsCi0JCS8vIGdldFN0cmluZygiX1VJX0Rpc2NpcGxpbmVHcm91cGluZ190eXBlIikpOwotCQkvLyBDb250ZW50Q2F0ZWdvcnkgY2F0ZWdvcnkgPSAoQ29udGVudENhdGVnb3J5KSBvYmplY3Q7Ci0JCS8vIGlmKGNhdGVnb3J5LmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSAhPSBudWxsKSB7Ci0JCS8vIE1ldGhvZFBsdWdpbiBiYXNlUGx1Z2luID0KLQkJLy8gVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4oY2F0ZWdvcnkuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpKTsKLQkJLy8gaWYoYmFzZVBsdWdpbiAhPSBudWxsKSB7Ci0JCS8vIGxhYmVsID0gbGFiZWwgKyAiIChpbmhlcml0ZWQgZnJvbSAiICsgYmFzZVBsdWdpbi5nZXROYW1lKCkgKyAnKSc7Ci0JCS8vIH0KLQkJLy8gfQotCQkvLyByZXR1cm4gbGFiZWw7Ci0JCXJldHVybiBUbmdVdGlsLmdldExhYmVsKChWYXJpYWJpbGl0eUVsZW1lbnQpIG9iamVjdCwKLQkJCQlnZXRTdHJpbmcoIl9VSV9EaXNjaXBsaW5lR3JvdXBpbmdfdHlwZSIpLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5EaXNjaXBsaW5lR3JvdXBpbmdJdGVtUHJvdmlkZXIjbm90aWZ5Q2hhbmdlZChvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb24pCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCS8vIGNvbW1lbnRpbmcgYmVsb3csIHVzZWZ1bCBmb3Igc3RhdGVmdWwgaXRlbXByb3ZpZGVyLgotCQkvL1RuZ1V0aWwuc2V0RGVmYXVsdE5hbWUodGhpcywgbm90aWZpY2F0aW9uKTsKLQkJCi0JCS8vIEZvciBzdGF0ZWxlc3MgaXRlbXByb3ZpZGVyLCBuZWVkIHRoaXMuCi0JCXNldERlZmF1bHROYW1lKG5vdGlmaWNhdGlvbik7Ci0JCQotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCQlDb250ZW50UGFja2FnZSBwa2c7Ci0JCURpc2NpcGxpbmUgZGlzY2lwbGluZTsKLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKERpc2NpcGxpbmVHcm91cGluZy5jbGFzcykpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkRJU0NJUExJTkVfR1JPVVBJTkdfX0RJU0NJUExJTkVTOgotCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbgotCQkJCQkuZ2V0Tm90aWZpZXIoKSwgdHJ1ZSwgZmFsc2UpKTsKLQotCQkJYm9vbGVhbiByZWZyZXNoUGFyZW50ID0gZmFsc2U7Ci0JCQlwa2cgPSAoQ29udGVudFBhY2thZ2UpICgoRU9iamVjdCkgbm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCkpCi0JCQkJCS5lQ29udGFpbmVyKCk7Ci0JCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRFdmVudFR5cGUoKSkgewotCQkJY2FzZSBOb3RpZmljYXRpb24uQUREOgotCQkJCWRpc2NpcGxpbmUgPSAoRGlzY2lwbGluZSkgbm90aWZpY2F0aW9uLmdldE5ld1ZhbHVlKCk7Ci0JCQkJaWYgKGRpc2NpcGxpbmUuZUNvbnRhaW5lcigpID09IG51bGwpIHsKLQkJCQkJcGtnLmdldENvbnRlbnRFbGVtZW50cygpLmFkZChkaXNjaXBsaW5lKTsKLQkJCQl9IGVsc2UgaWYgKGRpc2NpcGxpbmUuZUNvbnRhaW5lcigpID09IHBrZykgewotCQkJCQlyZWZyZXNoUGFyZW50ID0gdHJ1ZTsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIE5vdGlmaWNhdGlvbi5BRERfTUFOWToKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSAoKENvbGxlY3Rpb24pIG5vdGlmaWNhdGlvbi5nZXROZXdWYWx1ZSgpKQotCQkJCQkJLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQlkaXNjaXBsaW5lID0gKERpc2NpcGxpbmUpIGl0ZXIubmV4dCgpOwotCQkJCQlpZiAoZGlzY2lwbGluZS5lQ29udGFpbmVyKCkgPT0gbnVsbCkgewotCQkJCQkJcGtnLmdldENvbnRlbnRFbGVtZW50cygpLmFkZChkaXNjaXBsaW5lKTsKLQkJCQkJfSBlbHNlIGlmIChkaXNjaXBsaW5lLmVDb250YWluZXIoKSA9PSBwa2cpIHsKLQkJCQkJCXJlZnJlc2hQYXJlbnQgPSB0cnVlOwotCQkJCQl9Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJY2FzZSBOb3RpZmljYXRpb24uUkVNT1ZFOgotCQkJY2FzZSBOb3RpZmljYXRpb24uUkVNT1ZFX01BTlk6Ci0JCQkJcmVmcmVzaFBhcmVudCA9IHRydWU7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlpZiAocmVmcmVzaFBhcmVudCkgewotCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLAotCQkJCQkJZ2V0UGFyZW50KHRhcmdldCksIHRydWUsIGZhbHNlKSk7Ci0JCQl9Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNXcmFwcGluZ05lZWRlZChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXByb3RlY3RlZCBPYmplY3QgY3JlYXRlV3JhcHBlcihFT2JqZWN0IG9iamVjdCwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsCi0JCQlPYmplY3QgdmFsdWUsIGludCBpbmRleCkgewotCQlpZiAoIWlzV3JhcHBpbmdOZWVkZWQob2JqZWN0KSkKLQkJCXJldHVybiB2YWx1ZTsKLQkJcmV0dXJuIFRuZ1V0aWwuY3JlYXRlV3JhcHBlcihhZGFwdGVyRmFjdG9yeSwgb2JqZWN0LCBmZWF0dXJlLCB2YWx1ZSwKLQkJCQlpbmRleCk7Ci0JfQotCi0JLy8gLyogKG5vbi1KYXZhZG9jKQotCS8vICogQHNlZQotCS8vIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0Q2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKLQkvLyAqLwotCS8vIHB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkvLyBDb2xsZWN0aW9uIGNoaWxkcmVuID0gc3VwZXIuZ2V0Q2hpbGRyZW4ob2JqZWN0KTsKLQkvLyBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjaGlsZHJlbi5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkvLyBEaXNjaXBsaW5lIGNoaWxkID0gKERpc2NpcGxpbmUpIGl0ZXIubmV4dCgpOwotCS8vIERpc2NpcGxpbmVJdGVtUHJvdmlkZXIgaXRlbVByb3ZpZGVyID0gKERpc2NpcGxpbmVJdGVtUHJvdmlkZXIpCi0JLy8gYWRhcHRlckZhY3RvcnkuYWRhcHQoY2hpbGQsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JLy8gaXRlbVByb3ZpZGVyLnNldFBhcmVudChvYmplY3QpOwotCS8vIH0KLQkvLyByZXR1cm4gY2hpbGRyZW47Ci0JLy8gfQotCi0JcHVibGljIHZvaWQgc2V0RGVmYXVsdE5hbWUoTm90aWZpY2F0aW9uIG1zZykgewotCQlJRGVmYXVsdE5hbWVTZXR0ZXIgZGVmYXVsdE5hbWVTZXR0ZXIgPSB0aGlzOwotCQlpZiAoZGVmYXVsdE5hbWVTZXR0ZXIuZ2V0SW50ZXJlc3RlZEZlYXR1cmVPd25lckNsYXNzKCkgIT0gbnVsbCkgewotCQkJaW50IGZlYXR1cmVJZCA9IG1zZy5nZXRGZWF0dXJlSUQoZGVmYXVsdE5hbWVTZXR0ZXIKLQkJCQkJLmdldEludGVyZXN0ZWRGZWF0dXJlT3duZXJDbGFzcygpKTsKLQkJCWlmIChmZWF0dXJlSWQgPT0gZGVmYXVsdE5hbWVTZXR0ZXIuZ2V0SW50ZXJlc3RlZEZlYXR1cmVJRCgpKSB7Ci0JCQkJc3dpdGNoIChtc2cuZ2V0RXZlbnRUeXBlKCkpIHsKLQkJCQljYXNlIE5vdGlmaWNhdGlvbi5BREQ6Ci0JCQkJCXNldERlZmF1bHROYW1lKG1zZy5nZXROZXdWYWx1ZSgpLCBtc2cuZ2V0Tm90aWZpZXIoKSk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgTm90aWZpY2F0aW9uLkFERF9NQU5ZOgotCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSAoKENvbGxlY3Rpb24pIG1zZy5nZXROZXdWYWx1ZSgpKQotCQkJCQkJCS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJCXNldERlZmF1bHROYW1lKGl0ZXIubmV4dCgpLCBtc2cuZ2V0Tm90aWZpZXIoKSk7Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldERlZmF1bHROYW1lKE9iamVjdCBvYmosIE9iamVjdCBwYXJlbnQpIHsKLQkJU3RyaW5nIGJhc2VOYW1lID0gbnVsbDsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIERpc2NpcGxpbmUpIHsKLQkJCWJhc2VOYW1lID0gTGlicmFyeUVkaXRDb25zdGFudHMuTkVXX0RJU0NJUExJTkU7Ci0JCX0KLQkJaWYgKGJhc2VOYW1lICE9IG51bGwpIHsKLQkJCS8vIE1ha2luZyBwbHVnaW4gbGV2ZWwgdW5pcXVlbmVzcyBvZiBkaXNjaXBsaW5lLCBvbiByZW1vdmluZyBkaXNjaXBsaW5lIHJlZmVyZW5jZSAKLQkJCS8vIGZyb20gZGlzY2lwbGluZSBncm91cGluZywgZGlzY2lwbGluZSBnb2VzIGJhY2sgdG8gdG9wbGV2ZWwgY2F1c2luZyBkdXBsaWNhdGUuIAotCQkJVG5nVXRpbC5zZXREZWZhdWx0TmFtZShUbmdVdGlsLmV4dHJhY3QoCi0JCQkJCSgoQ29udGVudFBhY2thZ2UpICgoKERpc2NpcGxpbmVHcm91cGluZykgcGFyZW50KQotCQkJCQkJCS5lQ29udGFpbmVyKCkpKS5nZXRDb250ZW50RWxlbWVudHMoKSwKLQkJCQkJRGlzY2lwbGluZS5jbGFzcyksIChNZXRob2RFbGVtZW50KSBvYmosCi0JCQkJCUxpYnJhcnlFZGl0Q29uc3RhbnRzLk5FV19ESVNDSVBMSU5FKTsKLQkJfQotCX0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LklEZWZhdWx0TmFtZVNldHRlciNzZXREZWZhdWx0TmFtZShqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlZmF1bHROYW1lKE9iamVjdCBvYmopIHsKLQkJU3RyaW5nIGJhc2VOYW1lID0gbnVsbDsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIERpc2NpcGxpbmUpIHsKLQkJCWJhc2VOYW1lID0gTGlicmFyeUVkaXRDb25zdGFudHMuTkVXX0RJU0NJUExJTkU7Ci0JCX0KLQkJaWYgKGJhc2VOYW1lICE9IG51bGwpIHsKLQkJCVRuZ1V0aWwuc2V0RGVmYXVsdE5hbWUoKChEaXNjaXBsaW5lR3JvdXBpbmcpIHRhcmdldCkKLQkJCQkJLmdldERpc2NpcGxpbmVzKCksIChNZXRob2RFbGVtZW50KSBvYmosIGJhc2VOYW1lKTsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuSURlZmF1bHROYW1lU2V0dGVyI2dldEludGVyZXN0ZWRGZWF0dXJlSUQoKQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0SW50ZXJlc3RlZEZlYXR1cmVJRCgpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuRElTQ0lQTElORV9HUk9VUElOR19fRElTQ0lQTElORVM7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5JRGVmYXVsdE5hbWVTZXR0ZXIjZ2V0SW50ZXJlc3RlZEZlYXR1cmVPd25lckNsYXNzKCkKLQkgKi8KLQlwdWJsaWMgQ2xhc3MgZ2V0SW50ZXJlc3RlZEZlYXR1cmVPd25lckNsYXNzKCkgewotCQlyZXR1cm4gRGlzY2lwbGluZUdyb3VwaW5nLmNsYXNzOwotCX0KLQotCXByb3RlY3RlZCBDb21tYW5kIGNyZWF0ZUFkZENvbW1hbmQoRWRpdGluZ0RvbWFpbiBkb21haW4sIEVPYmplY3Qgb3duZXIsCi0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgQ29sbGVjdGlvbiBjb2xsZWN0aW9uLCBpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIG5ldyBNZXRob2RFbGVtZW50QWRkQ29tbWFuZCgoQWRkQ29tbWFuZCkgc3VwZXIuY3JlYXRlQWRkQ29tbWFuZCgKLQkJCQlkb21haW4sIG93bmVyLCBmZWF0dXJlLCBjb2xsZWN0aW9uLCBpbmRleCkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuSU1ldGhvZEVsZW1lbnRJdGVtUHJvdmlkZXIjc2V0UGFyZW50KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgc2V0UGFyZW50KE9iamVjdCBwYXJlbnQpIHsKLQkJdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NhdGVnb3J5L0Rpc2NpcGxpbmVJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY2F0ZWdvcnkvRGlzY2lwbGluZUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNWQ2ZDZiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY2F0ZWdvcnkvRGlzY2lwbGluZUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjU3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY2F0ZWdvcnk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuVW5leGVjdXRhYmxlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkFkZENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSURlZmF1bHROYW1lU2V0dGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUxpYnJhcnlJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JU3RhdGVmdWxJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlByZXNlbnRhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLk1ldGhvZEVsZW1lbnRBZGRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaW50ZXJuYWwuSUxpc3RlbmVyUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkxpYnJhcnlFZGl0Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGlzY2lwbGluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLQotLyoqCi0gKiBUaGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIGRpc2NpcGxpbmUuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIERpc2NpcGxpbmVJdGVtUHJvdmlkZXIgZXh0ZW5kcwotCQlvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLkRpc2NpcGxpbmVJdGVtUHJvdmlkZXIgaW1wbGVtZW50cwotCQlJTGlicmFyeUl0ZW1Qcm92aWRlciwgSVN0YXRlZnVsSXRlbVByb3ZpZGVyLCBJRGVmYXVsdE5hbWVTZXR0ZXIsIElMaXN0ZW5lclByb3ZpZGVyIHsKLQotCXByaXZhdGUgT2JqZWN0IHBhcmVudDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIERpc2NpcGxpbmVJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFBhcmVudChPYmplY3QgcGFyZW50KSB7Ci0JCXRoaXMucGFyZW50ID0gcGFyZW50OwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRQYXJlbnQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3Qgb2JqZWN0KSB7Ci0vLwkJaWYgKHBhcmVudCAhPSBudWxsKQotLy8JCQlyZXR1cm4gcGFyZW50OwotLy8JCXJldHVybiBzdXBlci5nZXRQYXJlbnQob2JqZWN0KTsKLQkJRGlzY2lwbGluZSBkaXNjaXBsaW5lID0gKERpc2NpcGxpbmUpb2JqZWN0OwotCQlpZihkaXNjaXBsaW5lLmVDb250YWluZXIoKSBpbnN0YW5jZW9mIERpc2NpcGxpbmUpewotCQkJcGFyZW50ID0gIHN1cGVyLmdldFBhcmVudChkaXNjaXBsaW5lKTsKLQkJCXJldHVybiBwYXJlbnQ7Ci0JCX0KLQkJCi0JCU1ldGhvZFBsdWdpbiBtb2RlbCA9IFVtYVV0aWwuZ2V0TWV0aG9kUGx1Z2luKGRpc2NpcGxpbmUpOwotCQlpZiAobW9kZWwgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCVN0cmluZ1tdIHBhdGggPSB7Ci0JCQkJTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfQ29udGVudF9ncm91cCIpIC8vJE5PTi1OTFMtMSQKLQkJCQksCi0JCQkJTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJCS5nZXRTdHJpbmcoIl9VSV9TdGFuZGFyZF9DYXRlZ29yaWVzX2dyb3VwIikgLy8kTk9OLU5MUy0xJAotCQkJCSwgTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfRGlzY2lwbGluZXNfZ3JvdXAiKSAvLyROT04tTkxTLTEkCi0JCX07Ci0KLQkJcmV0dXJuIFRuZ1V0aWwuZ2V0QWRhcHRlcihtb2RlbCwgcGF0aCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2NvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKGphdmEudXRpbC5Db2xsZWN0aW9uLAotCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsCi0JCQlPYmplY3Qgb2JqZWN0KSB7Ci0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldERpc2NpcGxpbmVfU3ViZGlzY2lwbGluZSgpLCBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVEaXNjaXBsaW5lKCkpKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0Q2hpbGRyZW5GZWF0dXJlcyhqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuRmVhdHVyZXMoT2JqZWN0IG9iamVjdCkgewotCQkvL3JldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCQlpZihjaGlsZHJlbkZlYXR1cmVzID09IG51bGwpewotCQkJY2hpbGRyZW5GZWF0dXJlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWNoaWxkcmVuRmVhdHVyZXMuYWRkKFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldERpc2NpcGxpbmVfU3ViZGlzY2lwbGluZSgpKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW5GZWF0dXJlczsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXIjbm90aWZ5Q2hhbmdlZChvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb24pCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCVRuZ1V0aWwuc2V0RGVmYXVsdE5hbWUodGhpcywgbm90aWZpY2F0aW9uKTsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQkJVG5nVXRpbC5yZWZyZXNoUGFyZW50SWZOYW1lQ2hhbmdlZChub3RpZmljYXRpb24sIHRoaXMpOwotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoRGlzY2lwbGluZS5jbGFzcykpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkRJU0NJUExJTkVfX05BTUU6Ci0JCQlUbmdVdGlsLnJlZnJlc2hDb250cmlidXRvcnModGhpcywgbm90aWZpY2F0aW9uLCBmYWxzZSwgdHJ1ZSk7Ci0JCQlicmVhazsKLQkJY2FzZSBVbWFQYWNrYWdlLkRJU0NJUExJTkVfX1RBU0tTOgotCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbgotCQkJCQkuZ2V0Tm90aWZpZXIoKSwgdHJ1ZSwgZmFsc2UpKTsKLQkJCXJldHVybjsKLQotCQljYXNlIFVtYVBhY2thZ2UuRElTQ0lQTElORV9fUkVGRVJFTkNFX1dPUktGTE9XUzoKLQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24KLQkJCQkJLmdldE5vdGlmaWVyKCksIHRydWUsIGZhbHNlKSk7Ci0JCQkvLyByZWZyZXNoIHVuY2F0ZWdvcml6ZWQgdGFza3MgZm9sZGVyCi0JCQkvLyBUbmdVdGlsLnJlZnJlc2hBZGFwdGVyKExpYnJhcnlFZGl0Q29uc3RhbnRzLlVOQ0FURUdPUklaRURfVEFTS1NfUEFUSCwKLQkJCS8vIG5vdGlmaWNhdGlvbik7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5ESVNDSVBMSU5FX19TVUJESVNDSVBMSU5FOgotCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbgotCQkJCQkuZ2V0Tm90aWZpZXIoKSwgdHJ1ZSwgZmFsc2UpKTsKLQkJCXJldHVybjsJCQotCQljYXNlIFVtYVBhY2thZ2UuRElTQ0lQTElORV9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVDoKLQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24KLQkJCQkuZ2V0Tm90aWZpZXIoKSwgdHJ1ZSwgZmFsc2UpKTsKLQkJCXJldHVybjsKLQkJCQotCQl9Ci0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRUZXh0KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIFRuZ1V0aWwuZ2V0TGFiZWwoKFZhcmlhYmlsaXR5RWxlbWVudCkgb2JqZWN0LAotCQkJCWdldFN0cmluZygiX1VJX0Rpc2NpcGxpbmVfdHlwZSIpLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzV3JhcHBpbmdOZWVkZWQoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgT2JqZWN0IGNyZWF0ZVdyYXBwZXIoRU9iamVjdCBvYmplY3QsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLAotCQkJT2JqZWN0IHZhbHVlLCBpbnQgaW5kZXgpIHsKLQkJaWYgKCFpc1dyYXBwaW5nTmVlZGVkKG9iamVjdCkpCi0JCQlyZXR1cm4gdmFsdWU7Ci0JCXJldHVybiBUbmdVdGlsLmNyZWF0ZVdyYXBwZXIoYWRhcHRlckZhY3RvcnksIG9iamVjdCwgZmVhdHVyZSwgdmFsdWUsCi0JCQkJaW5kZXgpOwotCX0KLQkKLQlwdWJsaWMgTGlzdCBnZXROb3RpZnlDaGFuZ2VkTGlzdGVuZXJzKCkgewotCQlpZihjaGFuZ2VOb3RpZmllciBpbnN0YW5jZW9mIENvbGxlY3Rpb24pIHsKLQkJCXJldHVybiBuZXcgQXJyYXlMaXN0KChDb2xsZWN0aW9uKSBjaGFuZ2VOb3RpZmllcik7Ci0JCX0KLQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2hhc0NoaWxkcmVuKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQkvLyBDaGFuZ2UgQ2F0ZWdvcmllcyBkaXNwbGF5IGluIExpYnJhcnkgTmF2aWdhdG9yCi0JCS8vIChjb21tZW50ZWQgZm9yIHRoaXMgZGVmZWN0KQotCQkvLyByZXR1cm4gISgoRGlzY2lwbGluZSkgb2JqZWN0KS5nZXRUYXNrcygpLmlzRW1wdHkoKTsKLQkJLy9yZXR1cm4gZmFsc2U7Ci0JCXJldHVybiBzdXBlci5oYXNDaGlsZHJlbihvYmplY3QpOwotCX0KLQotCXByb3RlY3RlZCBDb21tYW5kIGNyZWF0ZUFkZENvbW1hbmQoRWRpdGluZ0RvbWFpbiBkb21haW4sIEVPYmplY3Qgb3duZXIsCi0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgQ29sbGVjdGlvbiBjb2xsZWN0aW9uLCBpbnQgaW5kZXgpIHsKLQkJLy8gcmV0dXJuIG5ldyBNZXRob2RFbGVtZW50QWRkQ29tbWFuZCgoQWRkQ29tbWFuZCkKLQkJLy8gc3VwZXIuY3JlYXRlQWRkQ29tbWFuZChkb21haW4sIG93bmVyLCBmZWF0dXJlLCBjb2xsZWN0aW9uLCBpbmRleCkpOwotCQkvL3JldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQlDb2xsZWN0aW9uIHNlbGVjdGlvbiA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gY29sbGVjdGlvbi5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIERpc2NpcGxpbmUpIHsKLQkJCQlzZWxlY3Rpb24uYWRkKGVsZW1lbnQpOwotCQkJfQotCQl9Ci0JCWlmIChzZWxlY3Rpb24uaXNFbXB0eSgpKSB7Ci0JCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJfQotCi0JCXJldHVybiBuZXcgTWV0aG9kRWxlbWVudEFkZENvbW1hbmQoKEFkZENvbW1hbmQpIHN1cGVyLmNyZWF0ZUFkZENvbW1hbmQoCi0JCQkJZG9tYWluLCBvd25lciwgZmVhdHVyZSwgY29sbGVjdGlvbiwgaW5kZXgpKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldEludGVyZXN0ZWRGZWF0dXJlSUQoKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIFVtYVBhY2thZ2UuRElTQ0lQTElORV9fU1VCRElTQ0lQTElORTsKLQl9Ci0KLQlwdWJsaWMgQ2xhc3MgZ2V0SW50ZXJlc3RlZEZlYXR1cmVPd25lckNsYXNzKCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBEaXNjaXBsaW5lLmNsYXNzOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldERlZmF1bHROYW1lKE9iamVjdCBvYmopIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlTdHJpbmcgYmFzZU5hbWUgPSBudWxsOwotCQlpZiAob2JqIGluc3RhbmNlb2YgRGlzY2lwbGluZSkgewotCQkJYmFzZU5hbWUgPSBMaWJyYXJ5RWRpdENvbnN0YW50cy5ORVdfRElTQ0lQTElORTsKLQkJfQotCQlpZiAoYmFzZU5hbWUgIT0gbnVsbCkgewotCQkJVG5nVXRpbC5zZXREZWZhdWx0TmFtZSgoKERpc2NpcGxpbmUpIHRhcmdldCkuZ2V0U3ViZGlzY2lwbGluZSgpLAotCQkJCQkoTWV0aG9kRWxlbWVudCkgb2JqLCBiYXNlTmFtZSk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCS8vcmV0dXJuIHN1cGVyLmdldENoaWxkcmVuKG9iamVjdCk7Ci0JCUNvbGxlY3Rpb24gY2hpbGRyZW4gPSBzdXBlci5nZXRDaGlsZHJlbihvYmplY3QpOwotCQlpZiAoY2hpbGRyZW4gaW5zdGFuY2VvZiBMaXN0KQotCQkJQ29sbGVjdGlvbnMuc29ydCgoTGlzdCkgY2hpbGRyZW4sIFByZXNlbnRhdGlvbkNvbnRleHQuSU5TVEFOQ0UuZ2V0Q29tcGFyYXRvcigpKTsKLQkJcmV0dXJuIGNoaWxkcmVuOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY2F0ZWdvcnkvRG9tYWluSXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NhdGVnb3J5L0RvbWFpbkl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlM2ZhODc3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY2F0ZWdvcnkvRG9tYWluSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jYXRlZ29yeTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5VbmV4ZWN1dGFibGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQWRkQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5EaXNwb3NhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkZlYXR1cmVWYWx1ZVdyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRGVmYXVsdE5hbWVTZXR0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JTGlicmFyeUl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuUHJlc2VudGF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuTWV0aG9kRWxlbWVudEFkZENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkxpYnJhcnlFZGl0Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5VbWFVdGlsOwotCi0vKioKLSAqIFRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEgZG9tYWluLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBEb21haW5JdGVtUHJvdmlkZXIgZXh0ZW5kcwotCQlvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLkRvbWFpbkl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzCi0JCUlEZWZhdWx0TmFtZVNldHRlciwgSUxpYnJhcnlJdGVtUHJvdmlkZXIgewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgRG9tYWluSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoamF2YS51dGlsLkNvbGxlY3Rpb24sCi0JICogICAgICBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywKLQkJCU9iamVjdCBvYmplY3QpIHsKLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0RG9tYWluX1N1YmRvbWFpbnMoKSwgVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRG9tYWluKCkpKTsKLQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRDaGlsZHJlbkZlYXR1cmVzKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5GZWF0dXJlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlbkZlYXR1cmVzID09IG51bGwpIHsKLQkJCWNoaWxkcmVuRmVhdHVyZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQljaGlsZHJlbkZlYXR1cmVzLmFkZChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXREb21haW5fU3ViZG9tYWlucygpKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW5GZWF0dXJlczsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0UGFyZW50KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IG9iamVjdCkgewotCQlEb21haW4gZG9tYWluID0gKERvbWFpbikgb2JqZWN0OwotCQlpZiAoZG9tYWluLmVDb250YWluZXIoKSBpbnN0YW5jZW9mIERvbWFpbikgewotCQkJcmV0dXJuIHN1cGVyLmdldFBhcmVudChvYmplY3QpOwotCQl9Ci0JCU1ldGhvZFBsdWdpbiBtb2RlbCA9IFVtYVV0aWwuZ2V0TWV0aG9kUGx1Z2luKGRvbWFpbik7Ci0JCWlmIChtb2RlbCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJU3RyaW5nW10gcGF0aCA9IHsKLQkJCQlMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9Db250ZW50X2dyb3VwIikgLy8kTk9OLU5MUy0xJAotCQkJCSwKLQkJCQlMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkJLmdldFN0cmluZygiX1VJX1N0YW5kYXJkX0NhdGVnb3JpZXNfZ3JvdXAiKSAvLyROT04tTkxTLTEkCi0JCQkJLCBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9Eb21haW5zX2dyb3VwIikgLy8kTk9OLU5MUy0xJAotCQl9OwotCi0JCXJldHVybiBUbmdVdGlsLmdldEFkYXB0ZXIobW9kZWwsIHBhdGgpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRUZXh0KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIFRuZ1V0aWwuZ2V0TGFiZWwoKFZhcmlhYmlsaXR5RWxlbWVudCkgb2JqZWN0LAotCQkJCWdldFN0cmluZygiX1VJX0RvbWFpbl90eXBlIiksIHRydWUpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCS8vVG5nVXRpbC5zZXREZWZhdWx0TmFtZSh0aGlzLCBub3RpZmljYXRpb24pOwotCQlzZXREZWZhdWx0TmFtZShub3RpZmljYXRpb24pOwotCi0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0KLQkJVG5nVXRpbC5yZWZyZXNoUGFyZW50SWZOYW1lQ2hhbmdlZChub3RpZmljYXRpb24sIHRoaXMpOwotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoRG9tYWluLmNsYXNzKSkgewotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfX05BTUU6Ci0JCQlUbmdVdGlsLnJlZnJlc2hDb250cmlidXRvcnModGhpcywgbm90aWZpY2F0aW9uLCBmYWxzZSwgdHJ1ZSk7Ci0JCQlicmVhazsKLQotCQljYXNlIFVtYVBhY2thZ2UuRE9NQUlOX19TVUJET01BSU5TOgotCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbgotCQkJCQkuZ2V0Tm90aWZpZXIoKSwgdHJ1ZSwgZmFsc2UpKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCUNvbGxlY3Rpb24gY2hpbGRyZW4gPSBzdXBlci5nZXRDaGlsZHJlbihvYmplY3QpOwotCQlpZiAoY2hpbGRyZW4gaW5zdGFuY2VvZiBMaXN0KQotCQkJQ29sbGVjdGlvbnMuc29ydCgoTGlzdCkgY2hpbGRyZW4sIFByZXNlbnRhdGlvbkNvbnRleHQuSU5TVEFOQ0UKLQkJCQkJLmdldENvbXBhcmF0b3IoKSk7Ci0JCXJldHVybiBjaGlsZHJlbjsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1dyYXBwaW5nTmVlZGVkKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHJvdGVjdGVkIE9iamVjdCBjcmVhdGVXcmFwcGVyKEVPYmplY3Qgb2JqZWN0LCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwKLQkJCU9iamVjdCB2YWx1ZSwgaW50IGluZGV4KSB7Ci0JCWlmICghaXNXcmFwcGluZ05lZWRlZChvYmplY3QpKQotCQkJcmV0dXJuIHZhbHVlOwotCQlyZXR1cm4gVG5nVXRpbC5jcmVhdGVXcmFwcGVyKGFkYXB0ZXJGYWN0b3J5LCBvYmplY3QsIGZlYXR1cmUsIHZhbHVlLAotCQkJCWluZGV4KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29sbGVjdGlvbiBjcmVhdGVXcmFwcGVycyhDb2xsZWN0aW9uIG9iamVjdHMpIHsKLQkJaWYgKHdyYXBwZXJzID09IG51bGwpIHsKLQkJCXdyYXBwZXJzID0gbmV3IERpc3Bvc2FibGUoKTsKLQkJfQotCQlGZWF0dXJlVmFsdWVXcmFwcGVySXRlbVByb3ZpZGVyLmZpbGwod3JhcHBlcnMsIG51bGwsIG9iamVjdHMsIHRoaXMsCi0JCQkJYWRhcHRlckZhY3RvcnkpOwotCQlBcnJheUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3Qod3JhcHBlcnMpOwotCQlyZXR1cm4gbGlzdDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXREZWZhdWx0TmFtZShOb3RpZmljYXRpb24gbXNnKSB7Ci0JCUlEZWZhdWx0TmFtZVNldHRlciBkZWZhdWx0TmFtZVNldHRlciA9IHRoaXM7Ci0JCWlmIChkZWZhdWx0TmFtZVNldHRlci5nZXRJbnRlcmVzdGVkRmVhdHVyZU93bmVyQ2xhc3MoKSAhPSBudWxsKSB7Ci0JCQlpbnQgZmVhdHVyZUlkID0gbXNnLmdldEZlYXR1cmVJRChkZWZhdWx0TmFtZVNldHRlcgotCQkJCQkuZ2V0SW50ZXJlc3RlZEZlYXR1cmVPd25lckNsYXNzKCkpOwotCQkJaWYgKGZlYXR1cmVJZCA9PSBkZWZhdWx0TmFtZVNldHRlci5nZXRJbnRlcmVzdGVkRmVhdHVyZUlEKCkpIHsKLQkJCQlzd2l0Y2ggKG1zZy5nZXRFdmVudFR5cGUoKSkgewotCQkJCWNhc2UgTm90aWZpY2F0aW9uLkFERDoKLQkJCQkJc2V0RGVmYXVsdE5hbWUobXNnLmdldE5ld1ZhbHVlKCksIG1zZy5nZXROb3RpZmllcigpKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBOb3RpZmljYXRpb24uQUREX01BTlk6Ci0JCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9ICgoQ29sbGVjdGlvbikgbXNnLmdldE5ld1ZhbHVlKCkpCi0JCQkJCQkJLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQkJc2V0RGVmYXVsdE5hbWUoaXRlci5uZXh0KCksIG1zZy5nZXROb3RpZmllcigpKTsKLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0RGVmYXVsdE5hbWUoT2JqZWN0IG9iaiwgT2JqZWN0IHBhcmVudCkgewotCQlTdHJpbmcgYmFzZU5hbWUgPSBudWxsOwotCQlpZiAob2JqIGluc3RhbmNlb2YgRG9tYWluKSB7Ci0JCQliYXNlTmFtZSA9IExpYnJhcnlFZGl0Q29uc3RhbnRzLk5FV19ET01BSU47Ci0JCX0KLQkJaWYgKGJhc2VOYW1lICE9IG51bGwpIHsKLQkJCVRuZ1V0aWwuc2V0RGVmYXVsdE5hbWUoKChEb21haW4pIHBhcmVudCkKLQkJCQkJLmdldFN1YmRvbWFpbnMoKSwgKE1ldGhvZEVsZW1lbnQpIG9iaiwgYmFzZU5hbWUpOwotCQl9Ci0JfQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuSURlZmF1bHROYW1lU2V0dGVyI3NldERlZmF1bHROYW1lKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGVmYXVsdE5hbWUoT2JqZWN0IG9iaikgewotCQlTdHJpbmcgYmFzZU5hbWUgPSBudWxsOwotCQlpZiAob2JqIGluc3RhbmNlb2YgRG9tYWluKSB7Ci0JCQliYXNlTmFtZSA9IExpYnJhcnlFZGl0Q29uc3RhbnRzLk5FV19ET01BSU47Ci0JCX0KLQkJaWYgKGJhc2VOYW1lICE9IG51bGwpIHsKLQkJCVRuZ1V0aWwuc2V0RGVmYXVsdE5hbWUoKChEb21haW4pIHRhcmdldCkuZ2V0U3ViZG9tYWlucygpLAotCQkJCQkoTWV0aG9kRWxlbWVudCkgb2JqLCBiYXNlTmFtZSk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LklEZWZhdWx0TmFtZVNldHRlciNnZXRJbnRlcmVzdGVkRmVhdHVyZUlEKCkKLQkgKi8KLQlwdWJsaWMgaW50IGdldEludGVyZXN0ZWRGZWF0dXJlSUQoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkRPTUFJTl9fU1VCRE9NQUlOUzsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LklEZWZhdWx0TmFtZVNldHRlciNnZXRJbnRlcmVzdGVkRmVhdHVyZU93bmVyQ2xhc3MoKQotCSAqLwotCXB1YmxpYyBDbGFzcyBnZXRJbnRlcmVzdGVkRmVhdHVyZU93bmVyQ2xhc3MoKSB7Ci0JCXJldHVybiBEb21haW4uY2xhc3M7Ci0JfQotCi0JcHJvdGVjdGVkIENvbW1hbmQgY3JlYXRlQWRkQ29tbWFuZChFZGl0aW5nRG9tYWluIGRvbWFpbiwgRU9iamVjdCBvd25lciwKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBDb2xsZWN0aW9uIGNvbGxlY3Rpb24sIGludCBpbmRleCkgewotCQlDb2xsZWN0aW9uIHNlbGVjdGlvbiA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gY29sbGVjdGlvbi5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIERvbWFpbikgewotCQkJCXNlbGVjdGlvbi5hZGQoZWxlbWVudCk7Ci0JCQl9Ci0JCX0KLQkJaWYgKHNlbGVjdGlvbi5pc0VtcHR5KCkpIHsKLQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQl9Ci0KLQkJcmV0dXJuIG5ldyBNZXRob2RFbGVtZW50QWRkQ29tbWFuZCgoQWRkQ29tbWFuZCkgc3VwZXIuY3JlYXRlQWRkQ29tbWFuZCgKLQkJCQlkb21haW4sIG93bmVyLCBmZWF0dXJlLCBjb2xsZWN0aW9uLCBpbmRleCkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuSU1ldGhvZEVsZW1lbnRJdGVtUHJvdmlkZXIjc2V0UGFyZW50KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgc2V0UGFyZW50KE9iamVjdCBwYXJlbnQpIHsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY2F0ZWdvcnkvRG9tYWluc0l0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jYXRlZ29yeS9Eb21haW5zSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzOTgzZDcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jYXRlZ29yeS9Eb21haW5zSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jYXRlZ29yeTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5MaWJyYXJ5RWRpdENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIFRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIHRoZSAiRG9tYWlucyIgZm9sZGVyLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBEb21haW5zSXRlbVByb3ZpZGVyIGV4dGVuZHMgVHJhbnNpZW50Q2F0ZWdvcnlQYWNrYWdlSXRlbVByb3ZpZGVyIHsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIERvbWFpbnNJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksCi0JCQlDb250ZW50UGFja2FnZSB0YXJnZXQsIFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5LCB0YXJnZXQsIG5hbWUpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhqYXZhLnV0aWwuQ29sbGVjdGlvbiwKLQkgKiAgICAgIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLAotCQkJT2JqZWN0IG9iamVjdCkgewotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRDb250ZW50UGFja2FnZV9Db250ZW50RWxlbWVudHMoKSwgVW1hRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkuY3JlYXRlRG9tYWluKCkpKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0Q2hpbGRyZW5GZWF0dXJlcyhqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuRmVhdHVyZXMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoY2hpbGRyZW5GZWF0dXJlcyA9PSBudWxsKSB7Ci0JCQljaGlsZHJlbkZlYXR1cmVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJY2hpbGRyZW5GZWF0dXJlcy5hZGQoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJLmdldENvbnRlbnRQYWNrYWdlX0NvbnRlbnRFbGVtZW50cygpKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW5GZWF0dXJlczsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LlRyYW5zaWVudEdyb3VwSXRlbVByb3ZpZGVyI2FjY2VwdEFzQ2hpbGQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHRBc0NoaWxkKE9iamVjdCBvYmopIHsKLQkJaWYgKCFzdXBlci5hY2NlcHRBc0NoaWxkKG9iaikpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiBvYmogaW5zdGFuY2VvZiBEb21haW47Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldENoaWxkcmVuKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gc3VwZXIuZ2V0Q2hpbGRyZW4ob2JqZWN0KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0SW1hZ2UoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldEltYWdlKCJmdWxsL29iajE2L0RvbWFpbnMiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRUZXh0KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX0RvbWFpbnNfZ3JvdXAiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuVHJhbnNpZW50R3JvdXBJdGVtUHJvdmlkZXIjc2V0RGVmYXVsdE5hbWUoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZWZhdWx0TmFtZShPYmplY3Qgb2JqKSB7Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBEb21haW4pIHsKLQkJCVRuZ1V0aWwuc2V0RGVmYXVsdE5hbWUoVG5nVXRpbC5leHRyYWN0KCgoQ29udGVudFBhY2thZ2UpIHRhcmdldCkKLQkJCQkJLmdldENvbnRlbnRFbGVtZW50cygpLCBEb21haW4uY2xhc3MpLCAoTWV0aG9kRWxlbWVudCkgb2JqLAotCQkJCQlMaWJyYXJ5RWRpdENvbnN0YW50cy5ORVdfRE9NQUlOKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jYXRlZ29yeS9Sb2xlU2V0Q2F0ZWdvcnlJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY2F0ZWdvcnkvUm9sZVNldENhdGVnb3J5SXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxZDdmMmMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jYXRlZ29yeS9Sb2xlU2V0Q2F0ZWdvcnlJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxMyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNhdGVnb3J5OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LkVNRkVkaXRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5BZGRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkRpc3Bvc2FibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuRmVhdHVyZVZhbHVlV3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklEZWZhdWx0TmFtZVNldHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklMaWJyYXJ5SXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSVN0YXRlZnVsSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5QcmVzZW50YXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5NZXRob2RFbGVtZW50QWRkQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuTGlicmFyeUVkaXRDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZVNldEdyb3VwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci0KLS8qKgotICogVGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSByb2xlIHNldCBncm91cGluZy4KLSAqIDxwPgotICogVGhpcyBjbGFzcyB3aWxsIGJlIHJlbmFtZWQgYXMgUm9sZVNldEdyb3VwaW5nSXRlbVByb3ZpZGVyIGluIEVQRiBNNS4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUm9sZVNldENhdGVnb3J5SXRlbVByb3ZpZGVyIGV4dGVuZHMKLQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5Sb2xlU2V0R3JvdXBpbmdJdGVtUHJvdmlkZXIgaW1wbGVtZW50cwotCQlJRGVmYXVsdE5hbWVTZXR0ZXIsIElMaWJyYXJ5SXRlbVByb3ZpZGVyLCBJU3RhdGVmdWxJdGVtUHJvdmlkZXIgewotCi0JcHJpdmF0ZSBEaXNwb3NhYmxlIGNoaWxkcmVuOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgUm9sZVNldENhdGVnb3J5SXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoamF2YS51dGlsLkNvbGxlY3Rpb24sCi0JICogICAgICBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywKLQkJCU9iamVjdCBvYmplY3QpIHsKLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0Um9sZVNldEdyb3VwaW5nX1JvbGVTZXRzKCksIFVtYUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJLmNyZWF0ZVJvbGVTZXQoKSkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRDaGlsZHJlbkZlYXR1cmVzKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5GZWF0dXJlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlbkZlYXR1cmVzID09IG51bGwpIHsKLQkJCWNoaWxkcmVuRmVhdHVyZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQljaGlsZHJlbkZlYXR1cmVzLmFkZChVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkuZ2V0Um9sZVNldEdyb3VwaW5nX1JvbGVTZXRzKCkpOwotCQl9Ci0JCXJldHVybiBjaGlsZHJlbkZlYXR1cmVzOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRQYXJlbnQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBFT2JqZWN0KSB7Ci0JCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4oKEVPYmplY3QpIG9iamVjdCk7Ci0JCQlpZiAocGx1Z2luICE9IG51bGwpIHsKLQkJCQlTdHJpbmdbXSBwYXRoID0gewotCQkJCQkJTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJCQkJLmdldFN0cmluZygiX1VJX0NvbnRlbnRfZ3JvdXAiKSAvLyROT04tTkxTLTEkCi0JCQkJCQksCi0JCQkJCQlMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkJCQkuZ2V0U3RyaW5nKCJfVUlfU3RhbmRhcmRfQ2F0ZWdvcmllc19ncm91cCIpIC8vJE5PTi1OTFMtMSQKLQkJCQkJCSwKLQkJCQkJCUxpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCQkJCS5nZXRTdHJpbmcoIl9VSV9Sb2xlX1NldHNfZ3JvdXAiKSAvLyROT04tTkxTLTEkCi0JCQkJfTsKLQotCQkJCXJldHVybiBUbmdVdGlsLmdldEFkYXB0ZXIocGx1Z2luLCBwYXRoKTsKLQkJCX0KLQkJfQotCi0JCS8vIE1ldGhvZE1vZGVsSXRlbVByb3ZpZGVyIGl0ZW1Qcm92aWRlciA9IChNZXRob2RNb2RlbEl0ZW1Qcm92aWRlcikKLQkJLy8gVG5nVXRpbC5nZXRBZGFwdGVyKChFT2JqZWN0KW1vZGVsLCBNZXRob2RNb2RlbEl0ZW1Qcm92aWRlci5jbGFzcyk7Ci0JCS8vIGlmKGl0ZW1Qcm92aWRlciAhPSBudWxsKSB7Ci0JCS8vIHJldHVybiBpdGVtUHJvdmlkZXIuZ2V0Um9sZVNldHMoKTsKLQkJLy8gfQotCQlyZXR1cm4gc3VwZXIuZ2V0UGFyZW50KG9iamVjdCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNyZWF0ZUNoaWxkQ29tbWFuZC5IZWxwZXIjZ2V0Q3JlYXRlQ2hpbGRJbWFnZShqYXZhLmxhbmcuT2JqZWN0LAotCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLk9iamVjdCwgamF2YS51dGlsLkNvbGxlY3Rpb24pCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRDcmVhdGVDaGlsZEltYWdlKE9iamVjdCBvd25lciwgT2JqZWN0IGZlYXR1cmUsCi0JCQlPYmplY3QgY2hpbGQsIENvbGxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCWlmIChmZWF0dXJlIGluc3RhbmNlb2YgRVJlZmVyZW5jZSAmJiBjaGlsZCBpbnN0YW5jZW9mIEVPYmplY3QpIHsKLQkJCUVSZWZlcmVuY2UgcmVmZXJlbmNlID0gKEVSZWZlcmVuY2UpIGZlYXR1cmU7Ci0JCQlFQ2xhc3MgcGFyZW50Q2xhc3MgPSByZWZlcmVuY2UuZ2V0RUNvbnRhaW5pbmdDbGFzcygpOwotCQkJRUNsYXNzIGNoaWxkQ2xhc3MgPSAoKEVPYmplY3QpIGNoaWxkKS5lQ2xhc3MoKTsKLQkJCVN0cmluZyBuYW1lID0gImZ1bGwvY3Rvb2wxNi9DcmVhdGUiICsgcGFyZW50Q2xhc3MuZ2V0TmFtZSgpICsgIl8iICsgcmVmZXJlbmNlLmdldE5hbWUoKSArICJfIiArIGNoaWxkQ2xhc3MuZ2V0TmFtZSgpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJdHJ5IHsKLQkJCQlyZXR1cm4gTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0SW1hZ2UobmFtZSk7Ci0JCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgewotCQkJCVN5c3RlbS5lcnIucHJpbnRsbihlLmdldE1lc3NhZ2UoKSk7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gRU1GRWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRJbWFnZSgiZnVsbC9jdG9vbDE2L0NyZWF0ZUNoaWxkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0VGV4dChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0KLQkJLy8gU3RyaW5nIGxhYmVsID0gVG5nVXRpbC5nZXRMYWJlbChvYmplY3QsCi0JCS8vIGdldFN0cmluZygiX1VJX1JvbGVTZXRHcm91cGluZ190eXBlIikpOwotCQkvLyBDb250ZW50Q2F0ZWdvcnkgY2F0ZWdvcnkgPSAoQ29udGVudENhdGVnb3J5KSBvYmplY3Q7Ci0JCS8vIGlmKGNhdGVnb3J5LmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSAhPSBudWxsKSB7Ci0JCS8vIE1ldGhvZFBsdWdpbiBiYXNlUGx1Z2luID0KLQkJLy8gVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4oY2F0ZWdvcnkuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpKTsKLQkJLy8gaWYoYmFzZVBsdWdpbiAhPSBudWxsKSB7Ci0JCS8vIGxhYmVsID0gbGFiZWwgKyAiIChpbmhlcml0ZWQgZnJvbSAiICsgYmFzZVBsdWdpbi5nZXROYW1lKCkgKyAnKSc7Ci0JCS8vIH0KLQkJLy8gfQotCQkvLyByZXR1cm4gbGFiZWw7Ci0JCXJldHVybiBUbmdVdGlsLmdldExhYmVsKChWYXJpYWJpbGl0eUVsZW1lbnQpIG9iamVjdCwKLQkJCQlnZXRTdHJpbmcoIl9VSV9Sb2xlU2V0R3JvdXBpbmdfdHlwZSIpLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotCi0JfQotCi0JLy8gcHJvdGVjdGVkIHZvaWQgdXBkYXRlQ2hpbGRyZW4oTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCS8vIEVPYmplY3Qgb2JqZWN0ID0gKEVPYmplY3Qpbm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCk7Ci0JLy8gQ2hpbGRyZW5TdG9yZSBjaGlsZHJlblN0b3JlID0gZ2V0Q2hpbGRyZW5TdG9yZShvYmplY3QpOwotCS8vCQkKLQkvLyBpZiAoY2hpbGRyZW5TdG9yZSAhPSBudWxsKQotCS8vIHsKLQkvLyBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9Ci0JLy8gKEVTdHJ1Y3R1cmFsRmVhdHVyZSlub3RpZmljYXRpb24uZ2V0RmVhdHVyZSgpOwotCS8vIEVMaXN0IGNoaWxkcmVuID0gY2hpbGRyZW5TdG9yZS5nZXRMaXN0KGZlYXR1cmUpOwotCS8vIGlmIChjaGlsZHJlbiAhPSBudWxsKQotCS8vIHsKLQkvLyBpbnQgaW5kZXggPSBub3RpZmljYXRpb24uZ2V0UG9zaXRpb24oKTsKLQkvLwkJCQkKLQkvLyBzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRFdmVudFR5cGUoKSkKLQkvLyB7Ci0JLy8gY2FzZSBOb3RpZmljYXRpb24uUkVNT1ZFOgotCS8vIHsKLQkvLyBFTGlzdCB2YWx1ZXMgPSAoRUxpc3Qpb2JqZWN0LmVHZXQoZmVhdHVyZSk7Ci0JLy8JCQkJCQkKLQkvLyBpZiAodmFsdWVzLnNpemUoKSA9PSAwKQotCS8vIHsKLQkvLyBkaXNwb3NlV3JhcHBlcnMoY2hpbGRyZW4pOwotCS8vIHJldHVybjsKLQkvLyB9Ci0JLy8gYnJlYWs7Ci0JLy8gfQotCS8vIH0KLQkvLyB9Ci0JLy8gfQotCS8vCQkKLQkvLyBzdXBlci51cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCS8vIH0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5Sb2xlU2V0R3JvdXBpbmdJdGVtUHJvdmlkZXIjbm90aWZ5Q2hhbmdlZChvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb24pCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCS8vVG5nVXRpbC5zZXREZWZhdWx0TmFtZSh0aGlzLCBub3RpZmljYXRpb24pOwotCQlzZXREZWZhdWx0TmFtZShub3RpZmljYXRpb24pOwotCQkKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQotCQlDb250ZW50UGFja2FnZSBwa2c7Ci0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChSb2xlU2V0R3JvdXBpbmcuY2xhc3MpKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ST0xFX1NFVF9HUk9VUElOR19fUk9MRV9TRVRTOgotCi0JCQlwa2cgPSAoQ29udGVudFBhY2thZ2UpICgoRU9iamVjdCkgbm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCkpCi0JCQkJCS5lQ29udGFpbmVyKCk7Ci0JCQlSb2xlU2V0IHJvbGVTZXQ7Ci0JCQlib29sZWFuIHJlZnJlc2hQYXJlbnQgPSBmYWxzZTsKLQkJCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEV2ZW50VHlwZSgpKSB7Ci0JCQljYXNlIE5vdGlmaWNhdGlvbi5BREQ6Ci0JCQkJcm9sZVNldCA9IChSb2xlU2V0KSBub3RpZmljYXRpb24uZ2V0TmV3VmFsdWUoKTsKLQkJCQlpZiAocm9sZVNldC5lQ29udGFpbmVyKCkgPT0gbnVsbCkgewotCQkJCQlwa2cuZ2V0Q29udGVudEVsZW1lbnRzKCkuYWRkKHJvbGVTZXQpOwotCQkJCX0gZWxzZSBpZiAocm9sZVNldC5lQ29udGFpbmVyKCkgPT0gcGtnKSB7Ci0JCQkJCXJlZnJlc2hQYXJlbnQgPSB0cnVlOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCWNhc2UgTm90aWZpY2F0aW9uLkFERF9NQU5ZOgotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9ICgoQ29sbGVjdGlvbikgbm90aWZpY2F0aW9uLmdldE5ld1ZhbHVlKCkpCi0JCQkJCQkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCXJvbGVTZXQgPSAoUm9sZVNldCkgaXRlci5uZXh0KCk7Ci0JCQkJCWlmIChyb2xlU2V0LmVDb250YWluZXIoKSA9PSBudWxsKSB7Ci0JCQkJCQlwa2cuZ2V0Q29udGVudEVsZW1lbnRzKCkuYWRkKHJvbGVTZXQpOwotCQkJCQl9IGVsc2UgaWYgKHJvbGVTZXQuZUNvbnRhaW5lcigpID09IHBrZykgewotCQkJCQkJcmVmcmVzaFBhcmVudCA9IHRydWU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIE5vdGlmaWNhdGlvbi5SRU1PVkU6Ci0JCQljYXNlIE5vdGlmaWNhdGlvbi5SRU1PVkVfTUFOWToKLQkJCQlyZWZyZXNoUGFyZW50ID0gdHJ1ZTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24KLQkJCQkJLmdldE5vdGlmaWVyKCksIHRydWUsIGZhbHNlKSk7Ci0JCQlpZiAocmVmcmVzaFBhcmVudCkgewotCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLAotCQkJCQkJZ2V0UGFyZW50KHRhcmdldCksIHRydWUsIGZhbHNlKSk7Ci0JCQl9Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldENoaWxkcmVuKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlDb2xsZWN0aW9uIGNoaWxkcmVuID0gc3VwZXIuZ2V0Q2hpbGRyZW4ob2JqZWN0KTsKLQkJLy8gZm9yIChJdGVyYXRvciBpdGVyID0gY2hpbGRyZW4uaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCS8vIFJvbGVTZXQgY2hpbGQgPSAoUm9sZVNldCkgaXRlci5uZXh0KCk7Ci0JCS8vIFJvbGVTZXRJdGVtUHJvdmlkZXIgaXRlbVByb3ZpZGVyID0gKFJvbGVTZXRJdGVtUHJvdmlkZXIpCi0JCS8vIGFkYXB0ZXJGYWN0b3J5LmFkYXB0KGNoaWxkLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkvLyBpdGVtUHJvdmlkZXIuc2V0UGFyZW50KG9iamVjdCk7Ci0JCS8vIH0KLQkJaWYgKGNoaWxkcmVuIGluc3RhbmNlb2YgTGlzdCkKLQkJCUNvbGxlY3Rpb25zLnNvcnQoKExpc3QpIGNoaWxkcmVuLCBQcmVzZW50YXRpb25Db250ZXh0LklOU1RBTkNFLmdldENvbXBhcmF0b3IoKSk7Ci0JCXJldHVybiBjaGlsZHJlbjsKLQotCQkvLyByZXR1cm4gY3JlYXRlV3JhcHBlcnMoY2hpbGRyZW4pOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzV3JhcHBpbmdOZWVkZWQoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgT2JqZWN0IGNyZWF0ZVdyYXBwZXIoRU9iamVjdCBvYmplY3QsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLAotCQkJT2JqZWN0IHZhbHVlLCBpbnQgaW5kZXgpIHsKLQkJaWYgKCFpc1dyYXBwaW5nTmVlZGVkKG9iamVjdCkpCi0JCQlyZXR1cm4gdmFsdWU7Ci0JCXJldHVybiBUbmdVdGlsLmNyZWF0ZVdyYXBwZXIoYWRhcHRlckZhY3RvcnksIG9iamVjdCwgZmVhdHVyZSwgdmFsdWUsCi0JCQkJaW5kZXgpOwotCX0KLQotCS8vIHByb3RlY3RlZCBPYmplY3QgY3JlYXRlV3JhcHBlcihPYmplY3Qgb2JqZWN0KSB7Ci0JLy8gT2JqZWN0IHdyYXBwZXIgPSBUbmdVdGlsLmNyZWF0ZVdyYXBwZXIoYWRhcHRlckZhY3RvcnksIChFT2JqZWN0KSB0YXJnZXQsCi0JLy8gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Um9sZVNldEdyb3VwaW5nX1JvbGVTZXRzKCksIG9iamVjdCwgLTEpOwotCS8vIGlmKHdyYXBwZXJzID09IG51bGwpIHsKLQkvLyB3cmFwcGVycyA9IG5ldyBEaXNwb3NhYmxlKCk7Ci0JLy8gfQotCS8vIHdyYXBwZXJzLmFkZCh3cmFwcGVyKTsKLQkvLyByZXR1cm4gd3JhcHBlcjsKLQkvLyB9Ci0KLQlwcm90ZWN0ZWQgQ29sbGVjdGlvbiBjcmVhdGVXcmFwcGVycyhDb2xsZWN0aW9uIG9iamVjdHMpIHsKLQkJaWYgKGNoaWxkcmVuID09IG51bGwpIHsKLQkJCWNoaWxkcmVuID0gbmV3IERpc3Bvc2FibGUoKTsKLQkJfQotCQlGZWF0dXJlVmFsdWVXcmFwcGVySXRlbVByb3ZpZGVyLmZpbGwoY2hpbGRyZW4sIG51bGwsIG9iamVjdHMsIHRhcmdldCwKLQkJCQlhZGFwdGVyRmFjdG9yeSk7Ci0JCUFycmF5TGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdChjaGlsZHJlbik7Ci0JCXJldHVybiBsaXN0OwotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWlmIChjaGlsZHJlbiAhPSBudWxsKSB7Ci0JCQljaGlsZHJlbi5kaXNwb3NlKCk7Ci0JCX0KLQotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldERlZmF1bHROYW1lKE5vdGlmaWNhdGlvbiBtc2cpIHsKLQkJSURlZmF1bHROYW1lU2V0dGVyIGRlZmF1bHROYW1lU2V0dGVyID0gdGhpczsKLQkJaWYgKGRlZmF1bHROYW1lU2V0dGVyLmdldEludGVyZXN0ZWRGZWF0dXJlT3duZXJDbGFzcygpICE9IG51bGwpIHsKLQkJCWludCBmZWF0dXJlSWQgPSBtc2cuZ2V0RmVhdHVyZUlEKGRlZmF1bHROYW1lU2V0dGVyCi0JCQkJCS5nZXRJbnRlcmVzdGVkRmVhdHVyZU93bmVyQ2xhc3MoKSk7Ci0JCQlpZiAoZmVhdHVyZUlkID09IGRlZmF1bHROYW1lU2V0dGVyLmdldEludGVyZXN0ZWRGZWF0dXJlSUQoKSkgewotCQkJCXN3aXRjaCAobXNnLmdldEV2ZW50VHlwZSgpKSB7Ci0JCQkJY2FzZSBOb3RpZmljYXRpb24uQUREOgotCQkJCQlzZXREZWZhdWx0TmFtZShtc2cuZ2V0TmV3VmFsdWUoKSwgbXNnLmdldE5vdGlmaWVyKCkpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIE5vdGlmaWNhdGlvbi5BRERfTUFOWToKLQkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gKChDb2xsZWN0aW9uKSBtc2cuZ2V0TmV3VmFsdWUoKSkKLQkJCQkJCQkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlzZXREZWZhdWx0TmFtZShpdGVyLm5leHQoKSwgbXNnLmdldE5vdGlmaWVyKCkpOwotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBzZXREZWZhdWx0TmFtZShPYmplY3Qgb2JqLCBPYmplY3QgcGFyZW50KSB7Ci0JCVN0cmluZyBiYXNlTmFtZSA9IG51bGw7Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBSb2xlU2V0KSB7Ci0JCQliYXNlTmFtZSA9IExpYnJhcnlFZGl0Q29uc3RhbnRzLk5FV19ST0xFX1NFVDsKLQkJfQotCQlpZiAoYmFzZU5hbWUgIT0gbnVsbCkgewotCQkJLy8gTWFraW5nIHBsdWdpbiBsZXZlbCB1bmlxdWVuZXNzIG9mIHJvbGVzZXQsIG9uIHJlbW92aW5nIHJvbGVzZXQgcmVmZXJlbmNlIAotCQkJLy8gZnJvbSByb2xlc2V0IGdyb3VwaW5nLCByb2xlc2V0IGdvZXMgYmFjayB0byB0b3BsZXZlbCBjYXVzaW5nIGR1cGxpY2F0ZS4gCi0JCQlUbmdVdGlsLnNldERlZmF1bHROYW1lKFRuZ1V0aWwuZXh0cmFjdCgKLQkJCQkJKChDb250ZW50UGFja2FnZSkgKCgoUm9sZVNldEdyb3VwaW5nKSBwYXJlbnQpCi0JCQkJCQkJLmVDb250YWluZXIoKSkpLmdldENvbnRlbnRFbGVtZW50cygpLAotCQkJCQkJCVJvbGVTZXQuY2xhc3MpLCAoTWV0aG9kRWxlbWVudCkgb2JqLAotCQkJCQlMaWJyYXJ5RWRpdENvbnN0YW50cy5ORVdfUk9MRV9TRVQpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5JRGVmYXVsdE5hbWVTZXR0ZXIjc2V0RGVmYXVsdE5hbWUoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZWZhdWx0TmFtZShPYmplY3Qgb2JqKSB7Ci0JCVN0cmluZyBiYXNlTmFtZSA9IG51bGw7Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBSb2xlU2V0KSB7Ci0JCQliYXNlTmFtZSA9IExpYnJhcnlFZGl0Q29uc3RhbnRzLk5FV19ST0xFX1NFVDsKLQkJfQotCQlpZiAoYmFzZU5hbWUgIT0gbnVsbCkgewotCQkJVG5nVXRpbC5zZXREZWZhdWx0TmFtZSgoKFJvbGVTZXRHcm91cGluZykgdGFyZ2V0KS5nZXRSb2xlU2V0cygpLAotCQkJCQkoTWV0aG9kRWxlbWVudCkgb2JqLCBiYXNlTmFtZSk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LklEZWZhdWx0TmFtZVNldHRlciNnZXRJbnRlcmVzdGVkRmVhdHVyZUlEKCkKLQkgKi8KLQlwdWJsaWMgaW50IGdldEludGVyZXN0ZWRGZWF0dXJlSUQoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLlJPTEVfU0VUX0dST1VQSU5HX19ST0xFX1NFVFM7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5JRGVmYXVsdE5hbWVTZXR0ZXIjZ2V0SW50ZXJlc3RlZEZlYXR1cmVPd25lckNsYXNzKCkKLQkgKi8KLQlwdWJsaWMgQ2xhc3MgZ2V0SW50ZXJlc3RlZEZlYXR1cmVPd25lckNsYXNzKCkgewotCQlyZXR1cm4gUm9sZVNldEdyb3VwaW5nLmNsYXNzOwotCX0KLQotCXByb3RlY3RlZCBDb21tYW5kIGNyZWF0ZUFkZENvbW1hbmQoRWRpdGluZ0RvbWFpbiBkb21haW4sIEVPYmplY3Qgb3duZXIsCi0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgQ29sbGVjdGlvbiBjb2xsZWN0aW9uLCBpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIG5ldyBNZXRob2RFbGVtZW50QWRkQ29tbWFuZCgoQWRkQ29tbWFuZCkgc3VwZXIuY3JlYXRlQWRkQ29tbWFuZCgKLQkJCQlkb21haW4sIG93bmVyLCBmZWF0dXJlLCBjb2xsZWN0aW9uLCBpbmRleCkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuSU1ldGhvZEVsZW1lbnRJdGVtUHJvdmlkZXIjc2V0UGFyZW50KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgc2V0UGFyZW50KE9iamVjdCBwYXJlbnQpIHsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY2F0ZWdvcnkvUm9sZVNldEl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jYXRlZ29yeS9Sb2xlU2V0SXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwNjhkNWYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jYXRlZ29yeS9Sb2xlU2V0SXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jYXRlZ29yeTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5VbmV4ZWN1dGFibGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklMaWJyYXJ5SXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSVN0YXRlZnVsSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pbnRlcm5hbC5JTGlzdGVuZXJQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5VbWFVdGlsOwotCi0vKioKLSAqIFRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEgcm9sZSBzZXQuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFJvbGVTZXRJdGVtUHJvdmlkZXIgZXh0ZW5kcwotCQlvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLlJvbGVTZXRJdGVtUHJvdmlkZXIgaW1wbGVtZW50cwotCQlJTGlicmFyeUl0ZW1Qcm92aWRlciwgSVN0YXRlZnVsSXRlbVByb3ZpZGVyLCBJTGlzdGVuZXJQcm92aWRlciB7Ci0KLQlwcml2YXRlIE9iamVjdCBwYXJlbnQ7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBSb2xlU2V0SXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuUm9sZVNldEl0ZW1Qcm92aWRlciNjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhqYXZhLnV0aWwuQ29sbGVjdGlvbiwKLQkgKiAgICAgIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLAotCQkJT2JqZWN0IG9iamVjdCkgewotCX0KLQotCXB1YmxpYyB2b2lkIHNldFBhcmVudChPYmplY3QgcGFyZW50KSB7Ci0JCXRoaXMucGFyZW50ID0gcGFyZW50OwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRQYXJlbnQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChwYXJlbnQgIT0gbnVsbCkgewotCQkJcmV0dXJuIHBhcmVudDsKLQkJfQotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgRU9iamVjdCkgewotCQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IFVtYVV0aWwuZ2V0TWV0aG9kUGx1Z2luKChFT2JqZWN0KSBvYmplY3QpOwotCQkJaWYgKHBsdWdpbiAhPSBudWxsKSB7Ci0JCQkJU3RyaW5nW10gcGF0aCA9IHsKLQkJCQkJCUxpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCQkJCS5nZXRTdHJpbmcoIl9VSV9Db250ZW50X2dyb3VwIikgLy8kTk9OLU5MUy0xJAotCQkJCQkJLAotCQkJCQkJTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJCQkJLmdldFN0cmluZygiX1VJX1N0YW5kYXJkX0NhdGVnb3JpZXNfZ3JvdXAiKSAvLyROT04tTkxTLTEkCi0JCQkJCQksCi0JCQkJCQlMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkJCQkuZ2V0U3RyaW5nKCJfVUlfUm9sZV9TZXRzX2dyb3VwIikgLy8kTk9OLU5MUy0xJAotCQkJCX07Ci0KLQkJCQlyZXR1cm4gVG5nVXRpbC5nZXRBZGFwdGVyKHBsdWdpbiwgcGF0aCk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gc3VwZXIuZ2V0UGFyZW50KG9iamVjdCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldENoaWxkcmVuRmVhdHVyZXMoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbkZlYXR1cmVzKE9iamVjdCBvYmplY3QpIHsKLQkJLy8gaWYoY2hpbGRyZW5GZWF0dXJlcyA9PSBudWxsKSB7Ci0JCS8vIGNoaWxkcmVuRmVhdHVyZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCS8vIGNoaWxkcmVuRmVhdHVyZXMuYWRkKFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFJvbGVTZXRfUm9sZXMoKSk7Ci0JCS8vIH0KLQkJLy8gcmV0dXJuIGNoaWxkcmVuRmVhdHVyZXM7Ci0KLQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyI25vdGlmeUNoYW5nZWQob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCQlUbmdVdGlsLnJlZnJlc2hQYXJlbnRJZk5hbWVDaGFuZ2VkKG5vdGlmaWNhdGlvbiwgdGhpcyk7Ci0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChSb2xlU2V0LmNsYXNzKSkgewotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfX05BTUU6Ci0JCQlUbmdVdGlsLnJlZnJlc2hDb250cmlidXRvcnModGhpcywgbm90aWZpY2F0aW9uLCBmYWxzZSwgdHJ1ZSk7Ci0JCQlicmVhazsKLQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfU0VUX19ST0xFUzoKLQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24KLQkJCQkJLmdldE5vdGlmaWVyKCksIHRydWUsIGZhbHNlKSk7Ci0KLQkJCS8vIHJlZnJlc2ggd3JhcHBlcnMKLQkJCS8vCi0JCQlpZiAod3JhcHBlcnMgIT0gbnVsbCkgewotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IG5ldyBBcnJheUxpc3Qod3JhcHBlcnMpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBpdGVyCi0JCQkJCQkJLm5leHQoKSwgdHJ1ZSwgZmFsc2UpKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCS8vIHJlZnJlc2ggdW5jYXRlZ29yaXplZCByb2xlcwotCQkJLy8KLQkJCS8vIFRuZ1V0aWwucmVmcmVzaEFkYXB0ZXIoTGlicmFyeUVkaXRDb25zdGFudHMuVU5DQVRFR09SSVpFRF9ST0xFU19QQVRILAotCQkJLy8gbm90aWZpY2F0aW9uKTsKLQotCQkJcmV0dXJuOwotCQl9Ci0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRUZXh0KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIFRuZ1V0aWwuZ2V0TGFiZWwoKFZhcmlhYmlsaXR5RWxlbWVudCkgb2JqZWN0LAotCQkJCWdldFN0cmluZygiX1VJX1JvbGVTZXRfdHlwZSIpLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzV3JhcHBpbmdOZWVkZWQoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgT2JqZWN0IGNyZWF0ZVdyYXBwZXIoRU9iamVjdCBvYmplY3QsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLAotCQkJT2JqZWN0IHZhbHVlLCBpbnQgaW5kZXgpIHsKLQkJaWYgKCFpc1dyYXBwaW5nTmVlZGVkKG9iamVjdCkpCi0JCQlyZXR1cm4gdmFsdWU7Ci0JCXJldHVybiBUbmdVdGlsLmNyZWF0ZVdyYXBwZXIoYWRhcHRlckZhY3RvcnksIG9iamVjdCwgZmVhdHVyZSwgdmFsdWUsCi0JCQkJaW5kZXgpOwotCX0KLQotCXB1YmxpYyBMaXN0IGdldE5vdGlmeUNoYW5nZWRMaXN0ZW5lcnMoKSB7Ci0JCWlmKGNoYW5nZU5vdGlmaWVyIGluc3RhbmNlb2YgQ29sbGVjdGlvbikgewotCQkJcmV0dXJuIG5ldyBBcnJheUxpc3QoKENvbGxlY3Rpb24pIGNoYW5nZU5vdGlmaWVyKTsKLQkJfQotCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQl9Ci0KLQkKLQkvLyBDaGFuZ2UgQ2F0ZWdvcmllcyBkaXNwbGF5IGluIExpYnJhcnkgTmF2aWdhdG9yCi0JLy8gQWRkIGJlbG93IG1ldGhvZCB0byBhdm9pZCBjaGlsZHJlbiBmb3IgdGhpcyBJdGVtUHJvdmlkZXIuICsKLQkvLyBzaWduIHRvby4KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjaGFzQ2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvLyAvKiAobm9uLUphdmFkb2MpCi0JLy8gKiBAc2VlCi0JLy8gb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0KQotCS8vICovCi0JLy8gcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCS8vIExpc3QgbmV3Q2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KCk7Ci0JLy8gUm9sZVNldCByb2xlU2V0ID0gKFJvbGVTZXQpIG9iamVjdDsKLQkvLyBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSByb2xlU2V0LmdldFJvbGVzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JLy8gUm9sZSByb2xlID0gKFJvbGUpIGl0ZXIubmV4dCgpOwotCS8vIC8vIGxvb2sgaWYgdGhlcmUgaXMgYW4gZXhpc3RpbmcgT2JqZWN0TGlua0l0ZW1Qcm92aWRlciBmb3IgdGhpcyB0YXNrIGluCi0JLy8gdGhlIGN1cnJlbnQgY2hpbGRyZW4gbGlzdCBmaXJzdAotCS8vIC8vCi0JLy8gT2JqZWN0TGlua0l0ZW1Qcm92aWRlciBjaGlsZCA9IGZpbmRFeGlzdGluZ09iamVjdExpbmtJdGVtUHJvdmlkZXIocm9sZSk7Ci0JLy8gaWYoY2hpbGQgPT0gbnVsbCkgewotCS8vIGNoaWxkID0gbmV3IE9iamVjdExpbmtJdGVtUHJvdmlkZXIoYWRhcHRlckZhY3RvcnksIG9iamVjdCwgcm9sZSk7Ci0JLy8gfQotCS8vIGVsc2UgewotCS8vIGNoaWxkcmVuLnJlbW92ZShjaGlsZCk7Ci0JLy8gfQotCS8vIG5ld0NoaWxkcmVuLmFkZChjaGlsZCk7Ci0JLy8gfQotCS8vIC8vIGRpc3Bvc2UgdGhlIG9sZCBjaGlsZHJlbgotCS8vIC8vCi0JLy8gaWYoY2hpbGRyZW4gIT0gbnVsbCkgewotCS8vIGZvciAoSXRlcmF0b3IgaXRlciA9IGNoaWxkcmVuLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCS8vIE9iamVjdExpbmtJdGVtUHJvdmlkZXIgY2hpbGQgPSAoT2JqZWN0TGlua0l0ZW1Qcm92aWRlcikgaXRlci5uZXh0KCk7Ci0JLy8gY2hpbGQuZGlzcG9zZSgpOwotCS8vIH0KLQkvLyB9Ci0JLy8gY2hpbGRyZW4gPSBuZXdDaGlsZHJlbjsKLQkvLyByZXR1cm4gY2hpbGRyZW47Ci0JLy8gfQotCi0JcHJvdGVjdGVkIENvbW1hbmQgY3JlYXRlQWRkQ29tbWFuZChFZGl0aW5nRG9tYWluIGRvbWFpbiwgRU9iamVjdCBvd25lciwKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBDb2xsZWN0aW9uIGNvbGxlY3Rpb24sIGludCBpbmRleCkgewotCQkvLyByZXR1cm4gbmV3IE1ldGhvZEVsZW1lbnRBZGRDb21tYW5kKChBZGRDb21tYW5kKQotCQkvLyBzdXBlci5jcmVhdGVBZGRDb21tYW5kKGRvbWFpbiwgb3duZXIsIGZlYXR1cmUsIGNvbGxlY3Rpb24sIGluZGV4KSk7Ci0JCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jYXRlZ29yeS9Sb2xlU2V0c0l0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jYXRlZ29yeS9Sb2xlU2V0c0l0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNDA4ZTA3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY2F0ZWdvcnkvUm9sZVNldHNJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNhdGVnb3J5OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkxpYnJhcnlFZGl0Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudENhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVTZXRHcm91cGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5Bc3NvY2lhdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLQotLyoqCi0gKiBUaGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciB0aGUgIlJvbGUgU2V0cyIgZm9sZGVyLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBSb2xlU2V0c0l0ZW1Qcm92aWRlciBleHRlbmRzIFRyYW5zaWVudENhdGVnb3J5UGFja2FnZUl0ZW1Qcm92aWRlciB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBSb2xlU2V0c0l0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwKLQkJCUNvbnRlbnRQYWNrYWdlIHRhcmdldCwgU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnksIHRhcmdldCwgbmFtZSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5jYXRlZ29yeS5UcmFuc2llbnRDYXRlZ29yeVBhY2thZ2VJdGVtUHJvdmlkZXIjaXNJbmhlcml0ZWQob3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50Q2F0ZWdvcnkpCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNJbmhlcml0ZWQoQ29udGVudENhdGVnb3J5IGNhdGVnb3J5KSB7Ci0JCXJldHVybiAoY2F0ZWdvcnkgaW5zdGFuY2VvZiBSb2xlU2V0R3JvdXBpbmcgfHwgY2F0ZWdvcnkgaW5zdGFuY2VvZiBSb2xlU2V0KQotCQkJCSYmIGNhdGVnb3J5LmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSAhPSBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhqYXZhLnV0aWwuQ29sbGVjdGlvbiwKLQkgKiAgICAgIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLAotCQkJT2JqZWN0IG9iamVjdCkgewotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRDb250ZW50UGFja2FnZV9Db250ZW50RWxlbWVudHMoKSwgVW1hRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkuY3JlYXRlUm9sZVNldEdyb3VwaW5nKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRDb250ZW50UGFja2FnZV9Db250ZW50RWxlbWVudHMoKSwgVW1hRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkuY3JlYXRlUm9sZVNldCgpKSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldENoaWxkcmVuRmVhdHVyZXMoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbkZlYXR1cmVzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGNoaWxkcmVuRmVhdHVyZXMgPT0gbnVsbCkgewotCQkJY2hpbGRyZW5GZWF0dXJlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWNoaWxkcmVuRmVhdHVyZXMuYWRkKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCS5nZXRDb250ZW50UGFja2FnZV9Db250ZW50RWxlbWVudHMoKSk7Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuRmVhdHVyZXM7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5UcmFuc2llbnRHcm91cEl0ZW1Qcm92aWRlciNhY2NlcHRBc0NoaWxkKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0QXNDaGlsZChPYmplY3Qgb2JqKSB7Ci0JCWlmICghc3VwZXIuYWNjZXB0QXNDaGlsZChvYmopKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gYWNjZXB0KG9iaik7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBSb2xlU2V0R3JvdXBpbmcpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBSb2xlU2V0KSB7Ci0JCQlMaXN0IGdyb3VwcyA9IEFzc29jaWF0aW9uSGVscGVyLmdldFJvbGVTZXRHcm91cHMoKFJvbGVTZXQpIG9iaik7Ci0JCQlpZiAoZ3JvdXBzLmlzRW1wdHkoKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfSBlbHNlIHsKLQkJCQlmb3IgKE9iamVjdCBncm91cCA6IGdyb3VwcykgewotCQkJCQlpZiAoZ3JvdXAgaW5zdGFuY2VvZiBSb2xlU2V0R3JvdXBpbmcpIHsKLQkJCQkJCWlmIChVbWFVdGlsLmdldE1ldGhvZFBsdWdpbigoUm9sZVNldEdyb3VwaW5nKWdyb3VwKSA9PSBVbWFVdGlsLmdldE1ldGhvZFBsdWdpbigoUm9sZVNldClvYmopKSB7Ci0JCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0SW1hZ2UoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldEltYWdlKCJmdWxsL29iajE2L1JvbGVzIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0VGV4dChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9Sb2xlX1NldHNfZ3JvdXAiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuVHJhbnNpZW50R3JvdXBJdGVtUHJvdmlkZXIjZ2V0Q2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiAgc3VwZXIuZ2V0Q2hpbGRyZW4ob2JqZWN0KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LlRyYW5zaWVudEdyb3VwSXRlbVByb3ZpZGVyI3NldERlZmF1bHROYW1lKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGVmYXVsdE5hbWUoT2JqZWN0IG9iaikgewotCQlpZiAob2JqIGluc3RhbmNlb2YgUm9sZVNldEdyb3VwaW5nKSB7Ci0JCQlUbmdVdGlsLnNldERlZmF1bHROYW1lKFRuZ1V0aWwuZXh0cmFjdCgoKENvbnRlbnRQYWNrYWdlKSB0YXJnZXQpCi0JCQkJCS5nZXRDb250ZW50RWxlbWVudHMoKSwgUm9sZVNldEdyb3VwaW5nLmNsYXNzKSwKLQkJCQkJKE1ldGhvZEVsZW1lbnQpIG9iaiwKLQkJCQkJTGlicmFyeUVkaXRDb25zdGFudHMuTkVXX1JPTEVfU0VUX0dST1VQSU5HKTsKLQkJfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBSb2xlU2V0KSB7Ci0JCQlUbmdVdGlsLnNldERlZmF1bHROYW1lKFRuZ1V0aWwuZXh0cmFjdCgoKENvbnRlbnRQYWNrYWdlKSB0YXJnZXQpCi0JCQkJCS5nZXRDb250ZW50RWxlbWVudHMoKSwgUm9sZVNldC5jbGFzcyksIChNZXRob2RFbGVtZW50KSBvYmosCi0JCQkJCUxpYnJhcnlFZGl0Q29uc3RhbnRzLk5FV19ST0xFX1NFVCk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY2F0ZWdvcnkvU3RhbmRhcmRDYXRlZ29yaWVzSXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NhdGVnb3J5L1N0YW5kYXJkQ2F0ZWdvcmllc0l0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZWZmNTMwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY2F0ZWdvcnkvU3RhbmRhcmRDYXRlZ29yaWVzSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jYXRlZ29yeTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JR3JvdXBDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JTGlicmFyeUl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVHJhbnNpZW50R3JvdXBJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLk1vZGVsU3RydWN0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLQotLyoqCi0gKiBUaGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciB0aGUgIlN0YW5kYXJkIENhdGVnb3JpZXMiIGZvbGRlci4KLSAqIAotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgU3RhbmRhcmRDYXRlZ29yaWVzSXRlbVByb3ZpZGVyIGV4dGVuZHMgVHJhbnNpZW50R3JvdXBJdGVtUHJvdmlkZXIKLQkJaW1wbGVtZW50cyBJR3JvdXBDb250YWluZXIgewotCi0JcHJpdmF0ZSBBcnJheUxpc3QgY2hpbGRyZW47Ci0KLQlwcml2YXRlIE1hcCBncm91cEl0ZW1Qcm92aWRlck1hcDsKLQotCXB1YmxpYyBTdGFuZGFyZENhdGVnb3JpZXNJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksCi0JCQlOb3RpZmllciBwYXJlbnQsIFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5LCBwYXJlbnQsIG5hbWUpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhqYXZhLnV0aWwuQ29sbGVjdGlvbiwKLQkgKiAgICAgIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLAotCQkJT2JqZWN0IG9iamVjdCkgewotCQkvLyBuZXdDaGlsZERlc2NyaXB0b3JzLmFkZAotCQkvLyAoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIKLQkJLy8gKFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE1ldGhvZFBhY2thZ2VfQ2hpbGRQYWNrYWdlcygpLAotCQkvLyBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVDb250ZW50UGFja2FnZSgpKSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldENoaWxkcmVuRmVhdHVyZXMoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbkZlYXR1cmVzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGNoaWxkcmVuRmVhdHVyZXMgPT0gbnVsbCkgewotCQkJY2hpbGRyZW5GZWF0dXJlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWNoaWxkcmVuRmVhdHVyZXMuYWRkKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCS5nZXRNZXRob2RQYWNrYWdlX0NoaWxkUGFja2FnZXMoKSk7Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuRmVhdHVyZXM7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0QXNDaGlsZChPYmplY3Qgb2JqKSB7Ci0JCXJldHVybiBvYmogaW5zdGFuY2VvZiBDb250ZW50UGFja2FnZTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJLmdldEltYWdlKCJmdWxsL29iajE2L1N0YW5kYXJkQ2F0ZWdvcmllcyIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyI25vdGlmeUNoYW5nZWQob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG1zZykgewotCQlpZiAobXNnLmdldE5vdGlmaWVyKCkgPT0gdGFyZ2V0KSB7Ci0JCQlpbnQgZmVhdHVyZUlkID0gbXNnLmdldEZlYXR1cmVJRChDb250ZW50UGFja2FnZS5jbGFzcyk7Ci0JCQlpZiAoZmVhdHVyZUlkID09IFVtYVBhY2thZ2UuQ09OVEVOVF9QQUNLQUdFX19DSElMRF9QQUNLQUdFUykgewotCQkJCWJvb2xlYW4gbm90aWZ5ID0gZmFsc2U7Ci0JCQkJc3dpdGNoIChtc2cuZ2V0RXZlbnRUeXBlKCkpIHsKLQkJCQljYXNlIE5vdGlmaWNhdGlvbi5BREQ6Ci0JCQkJY2FzZSBOb3RpZmljYXRpb24uTU9WRToKLQkJCQkJT2JqZWN0IG9iaiA9IG1zZy5nZXROZXdWYWx1ZSgpOwotCQkJCQlub3RpZnkgPSBhY2NlcHRBc0NoaWxkKG9iaik7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgTm90aWZpY2F0aW9uLlJFTU9WRToKLQkJCQkJb2JqID0gbXNnLmdldE9sZFZhbHVlKCk7Ci0JCQkJCW5vdGlmeSA9IGFjY2VwdEFzQ2hpbGQob2JqKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBOb3RpZmljYXRpb24uQUREX01BTlk6Ci0JCQkJCUNvbGxlY3Rpb24gY29sbGVjdGlvbiA9IChDb2xsZWN0aW9uKSBtc2cuZ2V0TmV3VmFsdWUoKTsKLQkJCQkJZm9yX2NoZWNrOiBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjb2xsZWN0aW9uLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJaWYgKGFjY2VwdEFzQ2hpbGQoaXRlci5uZXh0KCkpKSB7Ci0JCQkJCQkJbm90aWZ5ID0gdHJ1ZTsKLQkJCQkJCQlicmVhayBmb3JfY2hlY2s7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBOb3RpZmljYXRpb24uUkVNT1ZFX01BTlk6Ci0JCQkJCWNvbGxlY3Rpb24gPSAoQ29sbGVjdGlvbikgbXNnLmdldE9sZFZhbHVlKCk7Ci0JCQkJCWZvcl9jaGVjazogZm9yIChJdGVyYXRvciBpdGVyID0gY29sbGVjdGlvbi5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCWlmIChhY2NlcHRBc0NoaWxkKGl0ZXIubmV4dCgpKSkgewotCQkJCQkJCW5vdGlmeSA9IHRydWU7Ci0JCQkJCQkJYnJlYWsgZm9yX2NoZWNrOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCi0JCQkJfQotCQkJCWlmIChub3RpZnkpIHsKLQkJCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihtc2csIHRoaXMsIHRydWUsCi0JCQkJCQkJZmFsc2UpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChtc2cpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuVHJhbnNpZW50R3JvdXBJdGVtUHJvdmlkZXIjc2V0RGVmYXVsdE5hbWUoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZWZhdWx0TmFtZShPYmplY3Qgb2JqKSB7Ci0JCS8vIGlmKG9iaiBpbnN0YW5jZW9mIENvbnRlbnRQYWNrYWdlKSB7Ci0JCS8vIFRuZ1V0aWwuc2V0RGVmYXVsdE5hbWUoKChDb250ZW50UGFja2FnZSl0YXJnZXQpLmdldENoaWxkUGFja2FnZXMoKSwKLQkJLy8gKE1ldGhvZEVsZW1lbnQpIG9iaiwgIk5ldyBDb250ZW50IFBhY2thZ2UiKTsKLQkJLy8gfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuVHJhbnNpZW50R3JvdXBJdGVtUHJvdmlkZXIjZ2V0SW50ZXJlc3RlZEZlYXR1cmVJRCgpCi0JICovCi0JcHVibGljIGludCBnZXRJbnRlcmVzdGVkRmVhdHVyZUlEKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5DT05URU5UX1BBQ0tBR0VfX0NISUxEX1BBQ0tBR0VTOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuVHJhbnNpZW50R3JvdXBJdGVtUHJvdmlkZXIjZ2V0SW50ZXJlc3RlZEZlYXR1cmVPd25lckNsYXNzKCkKLQkgKi8KLQlwdWJsaWMgQ2xhc3MgZ2V0SW50ZXJlc3RlZEZlYXR1cmVPd25lckNsYXNzKCkgewotCQlyZXR1cm4gQ29udGVudFBhY2thZ2UuY2xhc3M7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5UcmFuc2llbnRHcm91cEl0ZW1Qcm92aWRlciNnZXRDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGNoaWxkcmVuID09IG51bGwpIHsKLQkJCWNoaWxkcmVuID0gbmV3IEFycmF5TGlzdCgpOwotCQkJZ3JvdXBJdGVtUHJvdmlkZXJNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQkJU3RyaW5nIG5hbWU7Ci0JCQlJTGlicmFyeUl0ZW1Qcm92aWRlciBjaGlsZDsKLQotCQkJLy8gY3JlYXRlIHRoZSBkaXNjaXBsaW5lcyBjYXRlZ29yaWVzIGZvbGRlcgotCQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IFVtYVV0aWwKLQkJCQkJLmdldE1ldGhvZFBsdWdpbigoRWxlbWVudCkgKChJdGVtUHJvdmlkZXJBZGFwdGVyKSBvYmplY3QpCi0JCQkJCQkJLmdldFRhcmdldCgpKTsKLQkJCUNvbnRlbnRQYWNrYWdlIGNvbnRlbnRQa2cgPSBVbWFVdGlsLmZpbmRDb250ZW50UGFja2FnZShwbHVnaW4sCi0JCQkJCU1vZGVsU3RydWN0dXJlLkRFRkFVTFQuZGlzY2lwbGluZURlZmluaXRpb25QYXRoKTsKLQkJCWlmIChjb250ZW50UGtnICE9IG51bGwpIHsKLQkJCQluYW1lID0gTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJCS5nZXRTdHJpbmcoIl9VSV9EaXNjaXBsaW5lc19ncm91cCIpOyAvLyROT04tTkxTLTEkCi0JCQkJY2hpbGQgPSBuZXcgRGlzY2lwbGluZUNhdGVnb3JpZXNJdGVtUHJvdmlkZXIoYWRhcHRlckZhY3RvcnksCi0JCQkJCQljb250ZW50UGtnLCBuYW1lKTsKLQkJCQljaGlsZC5zZXRQYXJlbnQodGhpcyk7Ci0JCQkJY2hpbGRyZW4uYWRkKGNoaWxkKTsKLQkJCQlncm91cEl0ZW1Qcm92aWRlck1hcC5wdXQobmFtZSwgY2hpbGQpOwotCi0JCQl9Ci0KLQkJCS8vIGNyZWF0ZSBkb21haW4gY2F0ZWdvcmllcyBmb2xkZXIKLQkJCWNvbnRlbnRQa2cgPSBVbWFVdGlsLmZpbmRDb250ZW50UGFja2FnZShwbHVnaW4sCi0JCQkJCU1vZGVsU3RydWN0dXJlLkRFRkFVTFQuZG9tYWluUGF0aCk7Ci0JCQlpZiAoY29udGVudFBrZyAhPSBudWxsKSB7Ci0JCQkJbmFtZSA9IExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCQkuZ2V0U3RyaW5nKCJfVUlfRG9tYWluc19ncm91cCIpOyAvLyROT04tTkxTLTEkCi0JCQkJY2hpbGQgPSBuZXcgRG9tYWluc0l0ZW1Qcm92aWRlcihhZGFwdGVyRmFjdG9yeSwgY29udGVudFBrZywKLQkJCQkJCW5hbWUpOwotCQkJCWNoaWxkLnNldFBhcmVudCh0aGlzKTsKLQkJCQljaGlsZHJlbi5hZGQoY2hpbGQpOwotCQkJCWdyb3VwSXRlbVByb3ZpZGVyTWFwLnB1dChuYW1lLCBjaGlsZCk7Ci0JCQl9Ci0KLQkJCS8vIGNyZWF0ZSB3b3JrIHByb2R1Y3QgdHlwZXMgZm9sZGVyCi0JCQljb250ZW50UGtnID0gVW1hVXRpbC5maW5kQ29udGVudFBhY2thZ2UocGx1Z2luLAotCQkJCQlNb2RlbFN0cnVjdHVyZS5ERUZBVUxULndvcmtQcm9kdWN0VHlwZVBhdGgpOwotCQkJaWYgKGNvbnRlbnRQa2cgIT0gbnVsbCkgewotCQkJCW5hbWUgPSBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkJLmdldFN0cmluZygiX1VJX1dvcmtQcm9kdWN0VHlwZXNfZ3JvdXAiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWNoaWxkID0gbmV3IFdvcmtQcm9kdWN0VHlwZXNJdGVtUHJvdmlkZXIoYWRhcHRlckZhY3RvcnksCi0JCQkJCQljb250ZW50UGtnLCBuYW1lKTsKLQkJCQljaGlsZC5zZXRQYXJlbnQodGhpcyk7Ci0JCQkJY2hpbGRyZW4uYWRkKGNoaWxkKTsKLQkJCQlncm91cEl0ZW1Qcm92aWRlck1hcC5wdXQobmFtZSwgY2hpbGQpOwotCQkJfQotCi0JCQkvLyBjcmVhdGUgcm9sZSBzZXQgZm9sZGVyCi0JCQljb250ZW50UGtnID0gVW1hVXRpbC5maW5kQ29udGVudFBhY2thZ2UocGx1Z2luLAotCQkJCQlNb2RlbFN0cnVjdHVyZS5ERUZBVUxULnJvbGVTZXRQYXRoKTsKLQkJCWlmIChjb250ZW50UGtnICE9IG51bGwpIHsKLQkJCQluYW1lID0gTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJCS5nZXRTdHJpbmcoIl9VSV9Sb2xlX1NldHNfZ3JvdXAiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWNoaWxkID0gbmV3IFJvbGVTZXRzSXRlbVByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5LCBjb250ZW50UGtnLAotCQkJCQkJbmFtZSk7Ci0JCQkJY2hpbGQuc2V0UGFyZW50KHRoaXMpOwotCQkJCWNoaWxkcmVuLmFkZChjaGlsZCk7Ci0JCQkJZ3JvdXBJdGVtUHJvdmlkZXJNYXAucHV0KG5hbWUsIGNoaWxkKTsKLQkJCX0KLQotCQkJLy8gY3JlYXRlIHRvb2wgZm9sZGVyCi0JCQljb250ZW50UGtnID0gVW1hVXRpbC5maW5kQ29udGVudFBhY2thZ2UocGx1Z2luLAotCQkJCQlNb2RlbFN0cnVjdHVyZS5ERUZBVUxULnRvb2xQYXRoKTsKLQkJCWlmIChjb250ZW50UGtnICE9IG51bGwpIHsKLQkJCQluYW1lID0gTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfVG9vbHNfZ3JvdXAiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWNoaWxkID0gbmV3IFRvb2xzSXRlbVByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5LCBjb250ZW50UGtnLCBuYW1lKTsKLQkJCQljaGlsZC5zZXRQYXJlbnQodGhpcyk7Ci0JCQkJY2hpbGRyZW4uYWRkKGNoaWxkKTsKLQkJCQlncm91cEl0ZW1Qcm92aWRlck1hcC5wdXQobmFtZSwgY2hpbGQpOwotCQkJfQotCQl9Ci0JCXJldHVybiBjaGlsZHJlbjsKLQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuSUdyb3VwQ29udGFpbmVyI2dldEdyb3VwSXRlbVByb3ZpZGVyKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRHcm91cEl0ZW1Qcm92aWRlcihTdHJpbmcgbmFtZSkgewotCQlyZXR1cm4gZ3JvdXBJdGVtUHJvdmlkZXJNYXAuZ2V0KG5hbWUpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jYXRlZ29yeS9Ub29sSXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NhdGVnb3J5L1Rvb2xJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjFlY2QyYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NhdGVnb3J5L1Rvb2xJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNhdGVnb3J5OwotCi1pbXBvcnQgamF2YS5uZXQuVVJJOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuVW5leGVjdXRhYmxlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklMaWJyYXJ5SXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSVN0YXRlZnVsSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BcnRpZmFjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpYmFibGVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGlzY2lwbGluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk91dGNvbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuVW1hRWRpdFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLQotLyoqCi0gKiBUaGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGEgdG9vbC4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgVG9vbEl0ZW1Qcm92aWRlciBleHRlbmRzIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuVG9vbEl0ZW1Qcm92aWRlcgotCQlpbXBsZW1lbnRzIElMaWJyYXJ5SXRlbVByb3ZpZGVyLCBJU3RhdGVmdWxJdGVtUHJvdmlkZXIgewotCi0JcHJpdmF0ZSBPYmplY3QgcGFyZW50OwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgVG9vbEl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UGFyZW50KE9iamVjdCBwYXJlbnQpIHsKLQkJdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldEltYWdlKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBEZXNjcmliYWJsZUVsZW1lbnQpIHsKLQkJCWlmICgoKERlc2NyaWJhYmxlRWxlbWVudCkgb2JqZWN0KS5nZXROb2RlaWNvbigpICE9IG51bGwpIHsKLQkJCQlVUkkgaW1nVXJpID0gVG5nVXRpbC5nZXRGdWxsUGF0aG9mTm9kZW9yU2hhcGVJY29uVVJJKAotCQkJCQkJKERlc2NyaWJhYmxlRWxlbWVudCkgb2JqZWN0LAotCQkJCQkJKChEZXNjcmliYWJsZUVsZW1lbnQpIG9iamVjdCkuZ2V0Tm9kZWljb24oKSk7Ci0JCQkJT2JqZWN0IGltYWdlID0gTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJCS5nZXRTaGFyZWRJbWFnZShpbWdVcmkpOwotCQkJCWlmIChpbWFnZSAhPSBudWxsKQotCQkJCQlyZXR1cm4gaW1hZ2U7Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiBzdXBlci5nZXRJbWFnZShvYmplY3QpOwotCQotCX0KLQkKLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0UGFyZW50KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IG9iamVjdCkgewotCQlpZiAocGFyZW50ICE9IG51bGwpIHsKLQkJCXJldHVybiBwYXJlbnQ7Ci0JCX0KLQotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgRU9iamVjdCkgewotCQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IFVtYVV0aWwuZ2V0TWV0aG9kUGx1Z2luKChFT2JqZWN0KSBvYmplY3QpOwotCQkJaWYgKHBsdWdpbiAhPSBudWxsKSB7Ci0JCQkJU3RyaW5nW10gcGF0aCA9IHsKLQkJCQkJCUxpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCQkJCS5nZXRTdHJpbmcoIl9VSV9Db250ZW50X2dyb3VwIikgLy8kTk9OLU5MUy0xJAotCQkJCQkJLAotCQkJCQkJTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJCQkJLmdldFN0cmluZygiX1VJX1N0YW5kYXJkX0NhdGVnb3JpZXNfZ3JvdXAiKSAvLyROT04tTkxTLTEkCi0JCQkJCQksCi0JCQkJCQlMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9Ub29sc19ncm91cCIpIC8vJE5PTi1OTFMtMSQKLQkJCQl9OwotCi0JCQkJcmV0dXJuIFRuZ1V0aWwuZ2V0QWRhcHRlcihwbHVnaW4sIHBhdGgpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHN1cGVyLmdldFBhcmVudChvYmplY3QpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhqYXZhLnV0aWwuQ29sbGVjdGlvbiwKLQkgKiAgICAgIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLAotCQkJT2JqZWN0IG9iamVjdCkgewotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRDaGlsZHJlbkZlYXR1cmVzKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5GZWF0dXJlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlbkZlYXR1cmVzID09IG51bGwpIHsKLQkJCWNoaWxkcmVuRmVhdHVyZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQljaGlsZHJlbkZlYXR1cmVzLmFkZChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUb29sX1Rvb2xNZW50b3JzKCkpOwotCQl9Ci0JCXJldHVybiBjaGlsZHJlbkZlYXR1cmVzOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlciNub3RpZnlDaGFuZ2VkKG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKERpc2NpcGxpbmUuY2xhc3MpKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9fTkFNRToKLQkJCVRuZ1V0aWwucmVmcmVzaENvbnRyaWJ1dG9ycyh0aGlzLCBub3RpZmljYXRpb24sIGZhbHNlLCB0cnVlKTsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRUZXh0KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIFRuZ1V0aWwuZ2V0TGFiZWwoKFZhcmlhYmlsaXR5RWxlbWVudCkgb2JqZWN0LAotCQkJCWdldFN0cmluZygiX1VJX1Rvb2xfdHlwZSIpLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzV3JhcHBpbmdOZWVkZWQoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgT2JqZWN0IGNyZWF0ZVdyYXBwZXIoRU9iamVjdCBvYmplY3QsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLAotCQkJT2JqZWN0IHZhbHVlLCBpbnQgaW5kZXgpIHsKLQkJaWYgKCFpc1dyYXBwaW5nTmVlZGVkKG9iamVjdCkpCi0JCQlyZXR1cm4gdmFsdWU7Ci0JCXJldHVybiBUbmdVdGlsLmNyZWF0ZVdyYXBwZXIoYWRhcHRlckZhY3RvcnksIG9iamVjdCwgZmVhdHVyZSwgdmFsdWUsCi0JCQkJaW5kZXgpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNoYXNDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByb3RlY3RlZCBDb21tYW5kIGNyZWF0ZUFkZENvbW1hbmQoRWRpdGluZ0RvbWFpbiBkb21haW4sIEVPYmplY3Qgb3duZXIsCi0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgQ29sbGVjdGlvbiBjb2xsZWN0aW9uLCBpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NhdGVnb3J5L1Rvb2xzSXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NhdGVnb3J5L1Rvb2xzSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyNjM0ODEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jYXRlZ29yeS9Ub29sc0l0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY2F0ZWdvcnk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuTGlicmFyeUVkaXRDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Ub29sOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogVGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgdGhlICJUb29scyIgZm9sZGVyLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBUb29sc0l0ZW1Qcm92aWRlciBleHRlbmRzIFRyYW5zaWVudENhdGVnb3J5UGFja2FnZUl0ZW1Qcm92aWRlciB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBUb29sc0l0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwKLQkJCUNvbnRlbnRQYWNrYWdlIHRhcmdldCwgU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnksIHRhcmdldCwgbmFtZSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2NvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKGphdmEudXRpbC5Db2xsZWN0aW9uLAotCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsCi0JCQlPYmplY3Qgb2JqZWN0KSB7Ci0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldENvbnRlbnRQYWNrYWdlX0NvbnRlbnRFbGVtZW50cygpLCBVbWFGYWN0b3J5LmVJTlNUQU5DRQotCQkJCS5jcmVhdGVUb29sKCkpKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0Q2hpbGRyZW5GZWF0dXJlcyhqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuRmVhdHVyZXMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoY2hpbGRyZW5GZWF0dXJlcyA9PSBudWxsKSB7Ci0JCQljaGlsZHJlbkZlYXR1cmVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJY2hpbGRyZW5GZWF0dXJlcy5hZGQoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJLmdldENvbnRlbnRQYWNrYWdlX0NvbnRlbnRFbGVtZW50cygpKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW5GZWF0dXJlczsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LlRyYW5zaWVudEdyb3VwSXRlbVByb3ZpZGVyI2FjY2VwdEFzQ2hpbGQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHRBc0NoaWxkKE9iamVjdCBvYmopIHsKLQkJaWYgKCFzdXBlci5hY2NlcHRBc0NoaWxkKG9iaikpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiBvYmogaW5zdGFuY2VvZiBUb29sOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRJbWFnZShqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvVG9vbHMiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuVHJhbnNpZW50R3JvdXBJdGVtUHJvdmlkZXIjZ2V0Q2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCUNvbGxlY3Rpb24gY2hpbGRyZW4gPSBzdXBlci5nZXRDaGlsZHJlbihvYmplY3QpOwotCQkvLyBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjaGlsZHJlbi5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJLy8gVG9vbCBjaGlsZCA9IChUb29sKSBpdGVyLm5leHQoKTsKLQkJLy8gVG9vbEl0ZW1Qcm92aWRlciBpdGVtUHJvdmlkZXIgPSAoVG9vbEl0ZW1Qcm92aWRlcikKLQkJLy8gVG5nVXRpbC5nZXRCZXN0QWRhcHRlckZhY3RvcnkoYWRhcHRlckZhY3RvcnkpLmFkYXB0KGNoaWxkLAotCQkvLyBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkvLyBpdGVtUHJvdmlkZXIuc2V0UGFyZW50KG9iamVjdCk7Ci0JCS8vIH0KLQotCQkvLyBDaGFuZ2UgQ2F0ZWdvcmllcyBkaXNwbGF5IGluIExpYnJhcnkgTmF2aWdhdG9yCi0JCS8vIChjb21tZW50ZWQgZm9yIHRoaXMgZGVmZWN0KQotCQkvLyBNZXRob2RQbHVnaW4gcGx1Z2luID0gVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4oKEVsZW1lbnQpCi0JCS8vICgoSXRlbVByb3ZpZGVyQWRhcHRlcilvYmplY3QpLmdldFRhcmdldCgpKTsKLQkJLy8gQ29udGVudFBhY2thZ2UgY29yZUNvbnRlbnRQa2cgPSBVbWFVdGlsLmZpbmRDb250ZW50UGFja2FnZShwbHVnaW4sCi0JCS8vIE1vZGVsU3RydWN0dXJlLkRFRkFVTFQuY29yZUNvbnRlbnRQYXRoKTsKLQkJLy8gVW5jYXRlZ29yaXplZFRvb2xNZW50b3JzSXRlbVByb3ZpZGVyIHVuY2F0ZWdvcml6ZWQgPSBuZXcKLQkJLy8gVW5jYXRlZ29yaXplZFRvb2xNZW50b3JzSXRlbVByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5LCBjb3JlQ29udGVudFBrZyk7Ci0JCS8vIGNoaWxkcmVuLmFkZCh1bmNhdGVnb3JpemVkKTsKLQkJLy8gaWYoZ3JvdXBJdGVtUHJvdmlkZXJNYXAgPT0gbnVsbCkgewotCQkvLyBncm91cEl0ZW1Qcm92aWRlck1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCS8vIH0KLQkJLy8gZ3JvdXBJdGVtUHJvdmlkZXJNYXAucHV0KHVuY2F0ZWdvcml6ZWQuZ2V0VGV4dChudWxsKSwgdW5jYXRlZ29yaXplZCk7Ci0JCXJldHVybiBjaGlsZHJlbjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LlRyYW5zaWVudEdyb3VwSXRlbVByb3ZpZGVyI3NldERlZmF1bHROYW1lKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGVmYXVsdE5hbWUoT2JqZWN0IG9iaikgewotCQlpZiAob2JqIGluc3RhbmNlb2YgVG9vbCkgewotCQkJVG5nVXRpbC5zZXREZWZhdWx0TmFtZShUbmdVdGlsLmV4dHJhY3QoKChDb250ZW50UGFja2FnZSkgdGFyZ2V0KQotCQkJCQkuZ2V0Q29udGVudEVsZW1lbnRzKCksIFRvb2wuY2xhc3MpLCAoTWV0aG9kRWxlbWVudCkgb2JqLAotCQkJCQlMaWJyYXJ5RWRpdENvbnN0YW50cy5ORVdfVE9PTCk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY2F0ZWdvcnkvVHJhbnNpZW50Q2F0ZWdvcnlQYWNrYWdlSXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NhdGVnb3J5L1RyYW5zaWVudENhdGVnb3J5UGFja2FnZUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNzcyODlmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY2F0ZWdvcnkvVHJhbnNpZW50Q2F0ZWdvcnlQYWNrYWdlSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jYXRlZ29yeTsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklHcm91cENvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRyYW5zaWVudEdyb3VwSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudENhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIFRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIHRoZSBjYXRlZ29yeSBmb2xkZXJzLgotICogPHA+Ci0gKiBUaGlzIGNsYXNzIHdpbGwgYmUgcmVuYW1lZCBhcyBDYXRlZ29yaWVzSXRlbVByb3ZpZGVyIGluIEVQRiBNNS4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgVHJhbnNpZW50Q2F0ZWdvcnlQYWNrYWdlSXRlbVByb3ZpZGVyIGV4dGVuZHMKLQkJVHJhbnNpZW50R3JvdXBJdGVtUHJvdmlkZXIgaW1wbGVtZW50cyBJR3JvdXBDb250YWluZXIgewotCi0JcHJvdGVjdGVkIE1hcCBncm91cEl0ZW1Qcm92aWRlck1hcDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFRyYW5zaWVudENhdGVnb3J5UGFja2FnZUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwKLQkJCU5vdGlmaWVyIHBhcmVudCwgU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnksIHBhcmVudCwgbmFtZSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5UcmFuc2llbnRHcm91cEl0ZW1Qcm92aWRlciNhY2NlcHRBc0NoaWxkKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0QXNDaGlsZChPYmplY3Qgb2JqKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuVHJhbnNpZW50R3JvdXBJdGVtUHJvdmlkZXIjZ2V0Q2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCUNvbGxlY3Rpb24gY2hpbGRyZW4gPSBzdXBlci5nZXRDaGlsZHJlbihvYmplY3QpOwotCQlPYmplY3QgdW5jYXRlZ29yaXplZCA9IGNyZWF0ZVVuY2F0ZWdvcml6ZWRJdGVtUHJvdmlkZXIoKTsKLQkJaWYgKHVuY2F0ZWdvcml6ZWQgIT0gbnVsbCkgewotCQkJY2hpbGRyZW4uYWRkKHVuY2F0ZWdvcml6ZWQpOwotCQl9Ci0JCXJldHVybiBjaGlsZHJlbjsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBjcmVhdGVVbmNhdGVnb3JpemVkSXRlbVByb3ZpZGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBtc2cpIHsKLQkJaWYgKG1zZy5nZXROb3RpZmllcigpID09IHRhcmdldCkgewotCQkJaW50IGZlYXR1cmVJZCA9IG1zZy5nZXRGZWF0dXJlSUQoQ29udGVudFBhY2thZ2UuY2xhc3MpOwotCQkJaWYgKGZlYXR1cmVJZCA9PSBVbWFQYWNrYWdlLkNPTlRFTlRfUEFDS0FHRV9fQ09OVEVOVF9FTEVNRU5UUykgewotCQkJCWJvb2xlYW4gbm90aWZ5ID0gZmFsc2U7Ci0JCQkJc3dpdGNoIChtc2cuZ2V0RXZlbnRUeXBlKCkpIHsKLQkJCQljYXNlIE5vdGlmaWNhdGlvbi5BREQ6Ci0JCQkJY2FzZSBOb3RpZmljYXRpb24uTU9WRToKLQkJCQkJT2JqZWN0IG9iaiA9IG1zZy5nZXROZXdWYWx1ZSgpOwotCQkJCQlub3RpZnkgPSBhY2NlcHRBc0NoaWxkKG9iaik7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgTm90aWZpY2F0aW9uLlJFTU9WRToKLQkJCQkJb2JqID0gbXNnLmdldE9sZFZhbHVlKCk7Ci0JCQkJCW5vdGlmeSA9IGFjY2VwdEFzQ2hpbGQob2JqKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBOb3RpZmljYXRpb24uQUREX01BTlk6Ci0JCQkJCUNvbGxlY3Rpb24gY29sbGVjdGlvbiA9IChDb2xsZWN0aW9uKSBtc2cuZ2V0TmV3VmFsdWUoKTsKLQkJCQkJZm9yX2NoZWNrOiBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjb2xsZWN0aW9uLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJaWYgKGFjY2VwdEFzQ2hpbGQoaXRlci5uZXh0KCkpKSB7Ci0JCQkJCQkJbm90aWZ5ID0gdHJ1ZTsKLQkJCQkJCQlicmVhayBmb3JfY2hlY2s7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBOb3RpZmljYXRpb24uUkVNT1ZFX01BTlk6Ci0JCQkJCWNvbGxlY3Rpb24gPSAoQ29sbGVjdGlvbikgbXNnLmdldE9sZFZhbHVlKCk7Ci0JCQkJCWZvcl9jaGVjazogZm9yIChJdGVyYXRvciBpdGVyID0gY29sbGVjdGlvbi5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCWlmIChhY2NlcHRBc0NoaWxkKGl0ZXIubmV4dCgpKSkgewotCQkJCQkJCW5vdGlmeSA9IHRydWU7Ci0JCQkJCQkJYnJlYWsgZm9yX2NoZWNrOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQlpZiAobm90aWZ5KSB7Ci0JCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obXNnLCB0aGlzLCB0cnVlLAotCQkJCQkJCWZhbHNlKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobXNnKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0luaGVyaXRlZChDb250ZW50Q2F0ZWdvcnkgY2F0ZWdvcnkpIHsKLQkJcmV0dXJuIGFjY2VwdEFzQ2hpbGQoY2F0ZWdvcnkpCi0JCQkJJiYgY2F0ZWdvcnkuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpICE9IG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5UcmFuc2llbnRHcm91cEl0ZW1Qcm92aWRlciNnZXRJbnRlcmVzdGVkRmVhdHVyZUlEKCkKLQkgKi8KLQlwdWJsaWMgaW50IGdldEludGVyZXN0ZWRGZWF0dXJlSUQoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkNPTlRFTlRfUEFDS0FHRV9fQ09OVEVOVF9FTEVNRU5UUzsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LlRyYW5zaWVudEdyb3VwSXRlbVByb3ZpZGVyI2dldEludGVyZXN0ZWRGZWF0dXJlQ2xhc3MoKQotCSAqLwotCXB1YmxpYyBDbGFzcyBnZXRJbnRlcmVzdGVkRmVhdHVyZU93bmVyQ2xhc3MoKSB7Ci0JCXJldHVybiBDb250ZW50UGFja2FnZS5jbGFzczsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LklHcm91cENvbnRhaW5lciNnZXRHcm91cEl0ZW1Qcm92aWRlcihqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0R3JvdXBJdGVtUHJvdmlkZXIoU3RyaW5nIG5hbWUpIHsKLQkJaWYgKGdyb3VwSXRlbVByb3ZpZGVyTWFwID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIGdyb3VwSXRlbVByb3ZpZGVyTWFwLmdldChuYW1lKTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NhdGVnb3J5L1dvcmtQcm9kdWN0VHlwZUl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jYXRlZ29yeS9Xb3JrUHJvZHVjdFR5cGVJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWNkZDljMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NhdGVnb3J5L1dvcmtQcm9kdWN0VHlwZUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY2F0ZWdvcnk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLlVuZXhlY3V0YWJsZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuRmVhdHVyZVZhbHVlV3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklMaWJyYXJ5SXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSVN0YXRlZnVsSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSVdyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFydGlmYWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGlzY2lwbGluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci0KLS8qKgotICogVGhlaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHdvcmsgcHJvZHVjdCBraW5kLgotICogPHA+Ci0gKiBUaGlzIGNsYXNzIHdpbGwgYmUgcmVuYW1lZCBhcyBXb3JrUHJvZHVjdEtpbmRJdGVtUHJvdmlkZXIgaW4gRVBGIE01LgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBXb3JrUHJvZHVjdFR5cGVJdGVtUHJvdmlkZXIgZXh0ZW5kcwotCQlvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLldvcmtQcm9kdWN0VHlwZUl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzCi0JCUlMaWJyYXJ5SXRlbVByb3ZpZGVyLCBJV3JhcHBlciwgSVN0YXRlZnVsSXRlbVByb3ZpZGVyIHsKLQotCXByaXZhdGUgT2JqZWN0IHBhcmVudDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFdvcmtQcm9kdWN0VHlwZUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UGFyZW50KE9iamVjdCBwYXJlbnQpIHsKLQkJdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldFBhcmVudChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKHBhcmVudCAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gcGFyZW50OwotCQl9Ci0KLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIEVPYmplY3QpIHsKLQkJCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSBVbWFVdGlsLmdldE1ldGhvZFBsdWdpbigoRU9iamVjdCkgb2JqZWN0KTsKLQkJCWlmIChwbHVnaW4gIT0gbnVsbCkgewotCQkJCVN0cmluZ1tdIHBhdGggPSB7Ci0JCQkJCQlMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkJCQkuZ2V0U3RyaW5nKCJfVUlfQ29udGVudF9ncm91cCIpIC8vJE5PTi1OTFMtMSQKLQkJCQkJCSwKLQkJCQkJCUxpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCQkJCS5nZXRTdHJpbmcoIl9VSV9TdGFuZGFyZF9DYXRlZ29yaWVzX2dyb3VwIikgLy8kTk9OLU5MUy0xJAotCQkJCQkJLAotCQkJCQkJTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJCQkJLmdldFN0cmluZygiX1VJX1dvcmtQcm9kdWN0VHlwZXNfZ3JvdXAiKSAvLyROT04tTkxTLTEkCi0JCQkJfTsKLQotCQkJCXJldHVybiBUbmdVdGlsLmdldEFkYXB0ZXIocGx1Z2luLCBwYXRoKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBzdXBlci5nZXRQYXJlbnQob2JqZWN0KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoamF2YS51dGlsLkNvbGxlY3Rpb24sCi0JICogICAgICBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywKLQkJCU9iamVjdCBvYmplY3QpIHsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0Q2hpbGRyZW5GZWF0dXJlcyhqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuRmVhdHVyZXMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoY2hpbGRyZW5GZWF0dXJlcyA9PSBudWxsKSB7Ci0JCQljaGlsZHJlbkZlYXR1cmVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJY2hpbGRyZW5GZWF0dXJlcy5hZGQoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJLmdldFdvcmtQcm9kdWN0VHlwZV9Xb3JrUHJvZHVjdHMoKSk7Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuRmVhdHVyZXM7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyI25vdGlmeUNoYW5nZWQob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoRGlzY2lwbGluZS5jbGFzcykpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19OQU1FOgotCQkJVG5nVXRpbC5yZWZyZXNoQ29udHJpYnV0b3JzKHRoaXMsIG5vdGlmaWNhdGlvbiwgZmFsc2UsIHRydWUpOwotCQkJYnJlYWs7Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfVFlQRV9fV09SS19QUk9EVUNUUzoKLQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24KLQkJCQkJLmdldE5vdGlmaWVyKCksIHRydWUsIGZhbHNlKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldFRleHQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gVG5nVXRpbC5nZXRMYWJlbCgoVmFyaWFiaWxpdHlFbGVtZW50KSBvYmplY3QsCi0JCQkJZ2V0U3RyaW5nKCJfVUlfV29ya1Byb2R1Y3RUeXBlX3R5cGUiKSwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1dyYXBwaW5nTmVlZGVkKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHJvdGVjdGVkIE9iamVjdCBjcmVhdGVXcmFwcGVyKEVPYmplY3Qgb2JqZWN0LCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwKLQkJCU9iamVjdCB2YWx1ZSwgaW50IGluZGV4KSB7Ci0JCWlmICghaXNXcmFwcGluZ05lZWRlZChvYmplY3QpKQotCQkJcmV0dXJuIHZhbHVlOwotCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBBcnRpZmFjdCkgewotCQkJcmV0dXJuIG5ldyBGZWF0dXJlVmFsdWVXcmFwcGVySXRlbVByb3ZpZGVyKGZlYXR1cmUsIHZhbHVlLCBvYmplY3QsCi0JCQkJCWFkYXB0ZXJGYWN0b3J5KSB7Ci0JCQkJcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJfTsKLQkJfQotCQlyZXR1cm4gVG5nVXRpbC5jcmVhdGVXcmFwcGVyKGFkYXB0ZXJGYWN0b3J5LCBvYmplY3QsIGZlYXR1cmUsIHZhbHVlLAotCQkJCWluZGV4KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjaGFzQ2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCS8vIENoYW5nZSBDYXRlZ29yaWVzIGRpc3BsYXkgaW4gTGlicmFyeSBOYXZpZ2F0b3IKLQkJLy8gcmV0dXJuICEoKFdvcmtQcm9kdWN0VHlwZSkgb2JqZWN0KS5nZXRXb3JrUHJvZHVjdHMoKS5pc0VtcHR5KCk7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29tbWFuZCBjcmVhdGVBZGRDb21tYW5kKEVkaXRpbmdEb21haW4gZG9tYWluLCBFT2JqZWN0IG93bmVyLAotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIENvbGxlY3Rpb24gY29sbGVjdGlvbiwgaW50IGluZGV4KSB7Ci0JCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciN3cmFwKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0LAotCSAqICAgICAgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZSwgamF2YS5sYW5nLk9iamVjdCwgaW50KQotCSAqLwotCXB1YmxpYyBPYmplY3Qgd3JhcChFT2JqZWN0IG9iamVjdCwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsCi0JCQlPYmplY3QgdmFsdWUsIGludCBpbmRleCkgewotCQlyZXR1cm4gc3VwZXIud3JhcChvYmplY3QsIGZlYXR1cmUsIHZhbHVlLCBpbmRleCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NhdGVnb3J5L1dvcmtQcm9kdWN0VHlwZXNJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY2F0ZWdvcnkvV29ya1Byb2R1Y3RUeXBlc0l0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYzBkZTI4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY2F0ZWdvcnkvV29ya1Byb2R1Y3RUeXBlc0l0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY2F0ZWdvcnk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuTGlicmFyeUVkaXRDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0VHlwZTsKLQotLyoqCi0gKiBUaGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciB0aGUgIldvcmsgUHJvZHVjdCBLaW5kcyIgZm9sZGVyLgotICogPHA+Ci0gKiBUaGlzIGNsYXNzIHdpbGwgYmUgcmVuYW1lZCBhcyBXb3JrUHJvZHVjdEtpbmRzSXRlbVByb3ZpZGVyIGluIEVQRiBNNS4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgV29ya1Byb2R1Y3RUeXBlc0l0ZW1Qcm92aWRlciBleHRlbmRzCi0JCVRyYW5zaWVudENhdGVnb3J5UGFja2FnZUl0ZW1Qcm92aWRlciB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBXb3JrUHJvZHVjdFR5cGVzSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LAotCQkJQ29udGVudFBhY2thZ2UgdGFyZ2V0LCBTdHJpbmcgbmFtZSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSwgdGFyZ2V0LCBuYW1lKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoamF2YS51dGlsLkNvbGxlY3Rpb24sCi0JICogICAgICBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywKLQkJCU9iamVjdCBvYmplY3QpIHsKLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0Q29udGVudFBhY2thZ2VfQ29udGVudEVsZW1lbnRzKCksIFVtYUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJLmNyZWF0ZVdvcmtQcm9kdWN0VHlwZSgpKSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldENoaWxkcmVuRmVhdHVyZXMoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbkZlYXR1cmVzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGNoaWxkcmVuRmVhdHVyZXMgPT0gbnVsbCkgewotCQkJY2hpbGRyZW5GZWF0dXJlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWNoaWxkcmVuRmVhdHVyZXMuYWRkKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCS5nZXRDb250ZW50UGFja2FnZV9Db250ZW50RWxlbWVudHMoKSk7Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuRmVhdHVyZXM7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5UcmFuc2llbnRHcm91cEl0ZW1Qcm92aWRlciNhY2NlcHRBc0NoaWxkKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0QXNDaGlsZChPYmplY3Qgb2JqKSB7Ci0JCWlmICghc3VwZXIuYWNjZXB0QXNDaGlsZChvYmopKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gb2JqIGluc3RhbmNlb2YgV29ya1Byb2R1Y3RUeXBlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRJbWFnZShqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvV29ya1Byb2R1Y3RzIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LlRyYW5zaWVudEdyb3VwSXRlbVByb3ZpZGVyI2dldENoaWxkcmVuKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlDb2xsZWN0aW9uIGNoaWxkcmVuID0gc3VwZXIuZ2V0Q2hpbGRyZW4ob2JqZWN0KTsKLQotCQkvLyBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjaGlsZHJlbi5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJLy8gV29ya1Byb2R1Y3RUeXBlIGNoaWxkID0gKFdvcmtQcm9kdWN0VHlwZSkgaXRlci5uZXh0KCk7Ci0JCS8vIFdvcmtQcm9kdWN0VHlwZUl0ZW1Qcm92aWRlciBpdGVtUHJvdmlkZXIgPQotCQkvLyAoV29ya1Byb2R1Y3RUeXBlSXRlbVByb3ZpZGVyKQotCQkvLyBUbmdVdGlsLmdldEJlc3RBZGFwdGVyRmFjdG9yeShhZGFwdGVyRmFjdG9yeSkuYWRhcHQoY2hpbGQsCi0JCS8vIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCS8vIGl0ZW1Qcm92aWRlci5zZXRQYXJlbnQob2JqZWN0KTsKLQkJLy8gfQotCi0JCS8vIENoYW5nZSBDYXRlZ29yaWVzIGRpc3BsYXkgaW4gTGlicmFyeSBOYXZpZ2F0b3IKLQkJLy8gKGNvbW1lbnRlZCBmb3IgdGhpcyBkZWZlY3QpCi0JCS8vIE1ldGhvZFBsdWdpbiBwbHVnaW4gPSBVbWFVdGlsLmdldE1ldGhvZFBsdWdpbigoRWxlbWVudCkKLQkJLy8gKChJdGVtUHJvdmlkZXJBZGFwdGVyKW9iamVjdCkuZ2V0VGFyZ2V0KCkpOwotCQkvLyBDb250ZW50UGFja2FnZSBjb3JlQ29udGVudFBrZyA9IFVtYVV0aWwuZmluZENvbnRlbnRQYWNrYWdlKHBsdWdpbiwKLQkJLy8gTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC5jb3JlQ29udGVudFBhdGgpOwotCQkvLyBXb3JrUHJvZHVjdFR5cGVVbmNhdGVnb3JpemVkV29ya1Byb2R1Y3RJdGVtUHJvdmlkZXIgdW5jYXRlZ29yaXplZCA9Ci0JCS8vIG5ldwotCQkvLyBXb3JrUHJvZHVjdFR5cGVVbmNhdGVnb3JpemVkV29ya1Byb2R1Y3RJdGVtUHJvdmlkZXIoYWRhcHRlckZhY3RvcnksCi0JCS8vIGNvcmVDb250ZW50UGtnKTsKLQkJLy8gY2hpbGRyZW4uYWRkKHVuY2F0ZWdvcml6ZWQpOwotCQkvLyBpZihncm91cEl0ZW1Qcm92aWRlck1hcCA9PSBudWxsKSB7Ci0JCS8vIGdyb3VwSXRlbVByb3ZpZGVyTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJLy8gfQotCQkvLyBncm91cEl0ZW1Qcm92aWRlck1hcC5wdXQodW5jYXRlZ29yaXplZC5nZXRUZXh0KG51bGwpLCB1bmNhdGVnb3JpemVkKTsKLQkJcmV0dXJuIGNoaWxkcmVuOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuVHJhbnNpZW50R3JvdXBJdGVtUHJvdmlkZXIjc2V0RGVmYXVsdE5hbWUoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZWZhdWx0TmFtZShPYmplY3Qgb2JqKSB7Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBXb3JrUHJvZHVjdFR5cGUpIHsKLQkJCVRuZ1V0aWwuc2V0RGVmYXVsdE5hbWUoVG5nVXRpbC5leHRyYWN0KCgoQ29udGVudFBhY2thZ2UpIHRhcmdldCkKLQkJCQkJLmdldENvbnRlbnRFbGVtZW50cygpLCBXb3JrUHJvZHVjdFR5cGUuY2xhc3MpLAotCQkJCQkoTWV0aG9kRWxlbWVudCkgb2JqLAotCQkJCQlMaWJyYXJ5RWRpdENvbnN0YW50cy5ORVdfV09SS19QUk9EVUNUX1RZUEUpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NhdGVnb3J5L3BhY2thZ2UuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY2F0ZWdvcnkvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMzc2YjJiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY2F0ZWdvcnkvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgZGlzcGxheSBhbmQgZWRpdGluZyBzdXBwb3J0IGZvciBzdGFuZGFyZCBhbmQgY3VzdG9tIGNhdGVnb3JpZXMuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb21tYW5kL0FjdGlvbk1hbmFnZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29tbWFuZC9BY3Rpb25NYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwYTM3OTQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb21tYW5kL0FjdGlvbk1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyNyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmRTdGFjazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkFkZENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5SZW1vdmVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuU2V0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci0KLS8qKgotICogTWFuYWdlcyB0aGUgZXhlY3V0aW9uIG9mIGVkaXRpbmcgY29tbWFuZHMgd2l0aCBmdWxsIHN1cHBvcnQgZm9yIGRpcnR5IGZsYWcsCi0gKiB1bmRvIGFuZCByZWRvLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQWN0aW9uTWFuYWdlciBpbXBsZW1lbnRzIElBY3Rpb25NYW5hZ2VyIHsKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgTWFwIFJFU09VUkNFX1RPX01PRElGSUVSU19NQVAgPSBuZXcgSGFzaE1hcCgpOwotCi0JcHJpdmF0ZSBFZGl0aW5nRG9tYWluIGVkaXRpbmdEb21haW47Ci0KLQlwcml2YXRlIEZ1bGx5UmV2ZXJ0aWJsZUNvbW1hbmRTdGFjayBjb21tYW5kU3RhY2s7Ci0KLQlwdWJsaWMgQWN0aW9uTWFuYWdlcigpIHsKLQkJY29tbWFuZFN0YWNrID0gY3JlYXRlQ29tbWFuZFN0YWNrKCk7Ci0JCWVkaXRpbmdEb21haW4gPSBuZXcgQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluKAotCQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJY29tbWFuZFN0YWNrKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgRnVsbHlSZXZlcnRpYmxlQ29tbWFuZFN0YWNrIGNyZWF0ZUNvbW1hbmRTdGFjaygpIHsKLQkJcmV0dXJuIG5ldyBGdWxseVJldmVydGlibGVDb21tYW5kU3RhY2sodGhpcyk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVnaXN0ZXJBc01vZGlmaWVyT2YoRU9iamVjdCBvYmplY3QpIHsKLQkJUmVzb3VyY2UgcmVzb3VyY2UgPSBvYmplY3QuZVJlc291cmNlKCk7Ci0JCWlmIChyZXNvdXJjZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlyZWdpc3RlckFzTW9kaWZpZXJPZihyZXNvdXJjZSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVnaXN0ZXJBc01vZGlmaWVyT2YoUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJc3luY2hyb25pemVkIChSRVNPVVJDRV9UT19NT0RJRklFUlNfTUFQKSB7Ci0JCQlTZXQgbW9kcyA9IChTZXQpIFJFU09VUkNFX1RPX01PRElGSUVSU19NQVAuZ2V0KHJlc291cmNlKTsKLQkJCWlmIChtb2RzID09IG51bGwpIHsKLQkJCQltb2RzID0gbmV3IEhhc2hTZXQoKTsKLQkJCQlSRVNPVVJDRV9UT19NT0RJRklFUlNfTUFQLnB1dChyZXNvdXJjZSwgbW9kcyk7Ci0JCQl9Ci0JCQltb2RzLmFkZCh0aGlzKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHVucmVnaXN0ZXJBc01vZGlmaWVyKCkgewotCQlzeW5jaHJvbml6ZWQgKFJFU09VUkNFX1RPX01PRElGSUVSU19NQVApIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGdldE1vZGlmaWVkUmVzb3VyY2VzKCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCVJlc291cmNlIHJlc291cmNlID0gKFJlc291cmNlKSBpdGVyLm5leHQoKTsKLQkJCQlTZXQgbW9kcyA9IChTZXQpIFJFU09VUkNFX1RPX01PRElGSUVSU19NQVAuZ2V0KHJlc291cmNlKTsKLQkJCQlpZiAobW9kcyAhPSBudWxsKSB7Ci0JCQkJCW1vZHMucmVtb3ZlKHRoaXMpOwotCQkJCQlpZiAobW9kcy5pc0VtcHR5KCkpIHsKLQkJCQkJCS8vIHNhdmUgdGhlIHJlc291cmNlIGJlZm9yZSBpdCByZW1vdmVkIGZyb20KLQkJCQkJCS8vIFJFU09VUkNFX1RPX01PRElGSUVSU19NQVAKLQkJCQkJCS8vIAotCQkJCQkJc2F2ZShyZXNvdXJjZSk7Ci0JCQkJCQlSRVNPVVJDRV9UT19NT0RJRklFUlNfTUFQLnJlbW92ZShyZXNvdXJjZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBkb0FjdGlvbihpbnQgYWN0aW9uVHlwZSwgRU9iamVjdCBvYmplY3QsCi0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgT2JqZWN0IHZhbHVlLCBpbnQgaW5kZXgpIHsKLQkJQ29tbWFuZCBjbWQgPSBudWxsOwotCQlPYmplY3Qgb2xkVmFsdWUgPSBudWxsOwotCQlzd2l0Y2ggKGFjdGlvblR5cGUpIHsKLQkJY2FzZSBBREQ6IHsKLQkJCWlmIChpbmRleCA+PSAwKSB7Ci0JCQkJY21kID0gbmV3IEFkZENvbW1hbmQoZWRpdGluZ0RvbWFpbiwgb2JqZWN0LCBmZWF0dXJlLCB2YWx1ZSwKLQkJCQkJCWluZGV4KTsKLQkJCX0gZWxzZSB7Ci0JCQkJY21kID0gbmV3IEFkZENvbW1hbmQoZWRpdGluZ0RvbWFpbiwgb2JqZWN0LCBmZWF0dXJlLCB2YWx1ZSk7Ci0JCQl9Ci0JCQlicmVhazsKLQkJfQotCQljYXNlIEFERF9NQU5ZOiB7Ci0JCQlpZiAoaW5kZXggPj0gMCkgewotCQkJCWNtZCA9IG5ldyBBZGRDb21tYW5kKGVkaXRpbmdEb21haW4sIG9iamVjdCwgZmVhdHVyZSwKLQkJCQkJCShDb2xsZWN0aW9uKSB2YWx1ZSwgaW5kZXgpOwotCQkJfSBlbHNlIHsKLQkJCQljbWQgPSBuZXcgQWRkQ29tbWFuZChlZGl0aW5nRG9tYWluLCBvYmplY3QsIGZlYXR1cmUsCi0JCQkJCQkoQ29sbGVjdGlvbikgdmFsdWUpOwotCQkJfQotCQkJYnJlYWs7Ci0JCX0KLQkJY2FzZSBSRU1PVkU6IHsKLQkJCWNtZCA9IG5ldyBSZW1vdmVDb21tYW5kKGVkaXRpbmdEb21haW4sIG9iamVjdCwgZmVhdHVyZSwgdmFsdWUpOwotCQkJYnJlYWs7Ci0JCX0KLQkJY2FzZSBSRU1PVkVfTUFOWTogewotCQkJY21kID0gbmV3IFJlbW92ZUNvbW1hbmQoZWRpdGluZ0RvbWFpbiwgb2JqZWN0LCBmZWF0dXJlLAotCQkJCQkoQ29sbGVjdGlvbikgdmFsdWUpOwotCQkJYnJlYWs7Ci0JCX0KLQkJY2FzZSBTRVQ6IHsKLQkJCW9sZFZhbHVlID0gb2JqZWN0LmVHZXQoZmVhdHVyZSk7Ci0JCQlpZiAoKG9sZFZhbHVlICE9IG51bGwgJiYgIW9sZFZhbHVlLmVxdWFscyh2YWx1ZSkpCi0JCQkJCXx8IChvbGRWYWx1ZSA9PSBudWxsICYmIHZhbHVlICE9IG51bGwpKSB7Ci0JCQkJY21kID0gbmV3IFNldENvbW1hbmQoZWRpdGluZ0RvbWFpbiwgb2JqZWN0LCBmZWF0dXJlLCB2YWx1ZSk7Ci0JCQl9Ci0JCQlicmVhazsKLQkJfQotCQl9Ci0JCWlmIChjbWQgIT0gbnVsbCkgewotCQkJcmV0dXJuIGNvbW1hbmRTdGFjay5kb0V4ZWN1dGUoY21kKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIHZvaWQgdW5kbygpIHsKLQkJY29tbWFuZFN0YWNrLnVuZG8oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZWRvKCkgewotCQljb21tYW5kU3RhY2sucmVkbygpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHVuZG9BbGwoKSB7Ci0JCWJvb2xlYW4gYiA9IGNvbW1hbmRTdGFjay51bmRvQWxsKCk7Ci0JCXVucmVnaXN0ZXJBc01vZGlmaWVyKCk7Ci0JCS8vIGZpcmVOb3RpZnlDaGFuZ2VkKG51bGwpOwotCQlyZXR1cm4gYjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzYXZlSXNEb25lKCkgewotCQljb21tYW5kU3RhY2suc2F2ZUlzRG9uZSgpOwotCQl1bnJlZ2lzdGVyQXNNb2RpZmllcigpOwotCQkvLyBmaXJlTm90aWZ5Q2hhbmdlZChudWxsKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1NhdmVOZWVkZWQoKSB7Ci0JCWJvb2xlYW4gcmV0ID0gY29tbWFuZFN0YWNrLmlzU2F2ZU5lZWRlZCgpOwotCQlpZiAoIXJldCkKLQkJCXJldHVybiBmYWxzZTsKLQkJaWYgKGdldE1vZGlmaWVkUmVzb3VyY2VzKCkuaXNFbXB0eSgpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gcmV0OwotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWNvbW1hbmRTdGFjay5mbHVzaCgpOwotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldE1vZGlmaWVkUmVzb3VyY2VzKCkgewotCQlzeW5jaHJvbml6ZWQgKFJFU09VUkNFX1RPX01PRElGSUVSU19NQVApIHsKLQkJCUNvbGxlY3Rpb24gbW9kaWZpZWRSZXNvdXJjZXMgPSBuZXcgSGFzaFNldCgpOwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gUkVTT1VSQ0VfVE9fTU9ESUZJRVJTX01BUC5lbnRyeVNldCgpCi0JCQkJCS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBpdGVyLm5leHQoKTsKLQkJCQlTZXQgbW9kcyA9IChTZXQpIGVudHJ5LmdldFZhbHVlKCk7Ci0JCQkJaWYgKG1vZHMuY29udGFpbnModGhpcykpIHsKLQkJCQkJbW9kaWZpZWRSZXNvdXJjZXMuYWRkKGVudHJ5LmdldEtleSgpKTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gbW9kaWZpZWRSZXNvdXJjZXM7Ci0JCX0KLQl9Ci0KLQkvLyBwdWJsaWMgdm9pZCBmaXJlTm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JLy8gY2hhbmdlTm90aWZpZXIuZmlyZU5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQkvLyB9Ci0JLy8KLQkvLyBwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcihJTm90aWZ5Q2hhbmdlZExpc3RlbmVyIG5vdGlmeUNoYW5nZWRMaXN0ZW5lcikgewotCS8vIGNoYW5nZU5vdGlmaWVyLmFkZChub3RpZnlDaGFuZ2VkTGlzdGVuZXIpOwotCS8vIH0KLQkvLwotCS8vIHB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKElOb3RpZnlDaGFuZ2VkTGlzdGVuZXIgbm90aWZ5Q2hhbmdlZExpc3RlbmVyKQotCS8vIHsKLQkvLyBjaGFuZ2VOb3RpZmllci5yZW1vdmUobm90aWZ5Q2hhbmdlZExpc3RlbmVyKTsKLQkvLyB9Ci0KLQkvKioKLQkgKiBEb2VzIG5vdGhpbmcgaGVyZSwgc3ViY2xhc3Mgc2hvdWxkIGltcGxlbWVudCB0byBwcm92aWRlIHNhdmluZyB0aGUKLQkgKiByZXNvdXJjZSBiZWZvcmUgaXQgZ290IHJlbW92ZWQgZnJvbSBSRVNPVVJDRV9UT19NT0RJRklFUlNfTUFQCi0JICogCi0JICogQHBhcmFtIHJlc291cmNlCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2F2ZShSZXNvdXJjZSByZXNvdXJjZSkgewotCX0KLQotCXB1YmxpYyBDb21tYW5kU3RhY2sgZ2V0Q29tbWFuZFN0YWNrKCkgewotCQlyZXR1cm4gY29tbWFuZFN0YWNrOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGV4ZWN1dGUoSVJlc291cmNlQXdhcmVDb21tYW5kIGNtZCkgewotCQlpZiAoY21kICE9IG51bGwpIHsKLQkJCXJldHVybiBjb21tYW5kU3RhY2suZG9FeGVjdXRlKGNtZCk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb21tYW5kL0FkZFRvQ2F0ZWdvcnlDb21tYW5kLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbW1hbmQvQWRkVG9DYXRlZ29yeUNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWFiNzViMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbW1hbmQvQWRkVG9DYXRlZ29yeUNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQWJzdHJhY3RDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudWkuVXNlckludGVyYWN0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5NaXNjOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudENhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DdXN0b21DYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUuaW1wbC5NdWx0aVJlc291cmNlRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLnV0aWwuT3Bwb3NpdGVGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5VbWFVdGlsOwotCi0vKioKLSAqIFRoaXMgY29tbWFuZCBpcyB1c2VkIHRvIGFzc2lnbiBhIG1ldGhvZCBlbGVtZW50IHRvIGEgY2F0ZWdvcnkuIElmIHRoZSBjYXRlZ29yeQotICogaXMgaW4gYSBiYXNlIG1ldGhvZCBwbHVnLWluIG9mIHRoZSBlbGVtZW50LCB0aGlzIGNvbW1hbmQgd2lsbCBhdXRvbWF0aWNhbGx5Ci0gKiBjcmVhdGUgYSBjb250cmlidXRvciB0byB0aGUgYmFzZSBjYXRlZ29yeSBhbmQgYXNzaWduIHRoZSBlbGVtZW50IHRvIHRoZQotICogY29udHJpYnV0aW5nIGNhdGVnb3J5LiBUaGlzIGlzIGF2b2lkcyBtb2RpZnlpbmcgdGhlIGJhc2UgbWV0aG9kIHBsdWctaW4uCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBBZGRUb0NhdGVnb3J5Q29tbWFuZCBleHRlbmRzIEFic3RyYWN0Q29tbWFuZCBpbXBsZW1lbnRzCi0JCUlSZXNvdXJjZUF3YXJlQ29tbWFuZCB7Ci0KLQlwcml2YXRlIENvbnRlbnRDYXRlZ29yeSBjYXRlZ29yeTsKLQotCXByaXZhdGUgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmU7Ci0KLQlwcml2YXRlIE1ldGhvZEVsZW1lbnQgZWxlbWVudDsKLQotCXByaXZhdGUgU3RyaW5nW10gY2F0ZWdvcnlQa2dQYXRoOwotCi0JcHJpdmF0ZSBib29sZWFuIGNoZWNrRm9yRXhpc3RpbmdDb250cmlidXRvcjsKLQotCXByaXZhdGUgQ29udGVudENhdGVnb3J5IHVzZWRDYXRlZ29yeSA9IG51bGw7Ci0KLQlwcml2YXRlIGJvb2xlYW4gY3JlYXRlTmV3Q29udHJpYnV0b3IgPSBmYWxzZTsKLQotCXByaXZhdGUgQ29udGVudFBhY2thZ2UgY2F0ZWdvcnlQa2c7Ci0KLQlwcml2YXRlIENvbGxlY3Rpb24gbW9kaWZpZWRSZXNvdXJjZXM7Ci0KLQlwcml2YXRlIE9iamVjdCBvbGRPcHBvc2l0ZUZlYXR1cmVWYWx1ZTsKLQkKLQlwcml2YXRlIExpc3QgdXNlZENhdGVnb3JpZXM7Ci0KLQlwdWJsaWMgQWRkVG9DYXRlZ29yeUNvbW1hbmQoQ29udGVudENhdGVnb3J5IGNhdGVnb3J5LAotCQkJTWV0aG9kRWxlbWVudCBlbGVtZW50LCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwKLQkJCVN0cmluZ1tdIGNhdGVnb3J5UGtnUGF0aCwgYm9vbGVhbiBjaGVja0ZvckV4aXN0aW5nQ29udHJpYnV0b3IsCi0JCQlMaXN0IHVzZWRDYXRlZ29yaWVzKSB7Ci0JCXRoaXMuY2F0ZWdvcnkgPSBjYXRlZ29yeTsKLQkJdGhpcy5mZWF0dXJlID0gZmVhdHVyZTsKLQkJdGhpcy5lbGVtZW50ID0gZWxlbWVudDsKLQkJdGhpcy5jYXRlZ29yeVBrZ1BhdGggPSBjYXRlZ29yeVBrZ1BhdGg7Ci0JCXRoaXMuY2hlY2tGb3JFeGlzdGluZ0NvbnRyaWJ1dG9yID0gY2hlY2tGb3JFeGlzdGluZ0NvbnRyaWJ1dG9yOwotCQl0aGlzLnVzZWRDYXRlZ29yaWVzID0gdXNlZENhdGVnb3JpZXM7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gcHJlcGFyZSgpIHsKLQkJLy8gY2hlY2sgaWYgdGhpcyBvcGVyYXRpb24gd2lsbCBtb2RpZnkgdGhlIGVsZW1lbnQgaW4gb3Bwb3NpdGUgZmVhdHVyZQotCQkvLyB2YWx1ZQotCQkvLwotCQlyZXR1cm4gVXNlckludGVyYWN0aW9uSGVscGVyLmNoZWNrTW9kaWZ5T3Bwb3NpdGUoY2F0ZWdvcnksIGZlYXR1cmUsCi0JCQkJZWxlbWVudCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQWJzdHJhY3RDb21tYW5kI2dldExhYmVsKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExhYmVsKCkgewotCQlyZXR1cm4gIkFkZCBUbyBDYXRlZ29yeSI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQkvLyBjcmVhdGUgY29udHJpYnV0b3IgZm9yIGNhdGVnb3J5IGlmIGl0IGlzIG5vdCBpbiB0aGUgc2FtZSBwbHVnaW4gd2l0aAotCQkvLyB0aGUgZWxlbWVudAotCQkvLwotCQlNZXRob2RQbHVnaW4gZWxlbWVudFBsdWdpbiA9IFVtYVV0aWwuZ2V0TWV0aG9kUGx1Z2luKGVsZW1lbnQpOwotCQlNZXRob2RQbHVnaW4gY2F0ZWdvcnlQbHVnaW4gPSBVbWFVdGlsLmdldE1ldGhvZFBsdWdpbihjYXRlZ29yeSk7Ci0JCWlmIChjYXRlZ29yeVBsdWdpbiAhPSBlbGVtZW50UGx1Z2luCi0JCQkJJiYgTWlzYy5pc0Jhc2VPZihjYXRlZ29yeVBsdWdpbiwgZWxlbWVudFBsdWdpbikpIHsKLQkJCWlmIChjYXRlZ29yeS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkgIT0gbnVsbCkgewotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCi0JCQkJCQkiQ291bGQgbm90IGFkZCBlbGVtZW50IHRvIGFuIGV4dGVuZGVkIGNhdGVnb3J5IHRoYXQgaXMgaW4gYSBkaWZmZXJlbnQgcGx1Zy1pbjogIiArIGNhdGVnb3J5KTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJaWYgKCFmZWF0dXJlLmlzTWFueSgpKSB7Ci0JCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JCQl9Ci0JCQljYXRlZ29yeVBrZyA9IFVtYVV0aWwuZmluZENvbnRlbnRQYWNrYWdlKGVsZW1lbnRQbHVnaW4sCi0JCQkJCWNhdGVnb3J5UGtnUGF0aCk7Ci0JCQlDb250ZW50Q2F0ZWdvcnkgY29udHJpYiA9IG51bGw7Ci0JCQlpZiAoY2hlY2tGb3JFeGlzdGluZ0NvbnRyaWJ1dG9yKSB7Ci0JCQkJLy8gbG9vayBmb3IgdGhlIGV4aXN0aW5nIGNvbnRyaWJ1dG9yIGZvciB0aGUgY2F0ZWdvcnkKLQkJCQkvLwotCQkJCWNvbnRyaWIgPSBUbmdVdGlsLmZpbmRDb250cmlidXRvcihjYXRlZ29yeVBrZywgY2F0ZWdvcnkpOwotCQkJfQotCi0JCQlpZiAoY29udHJpYiA9PSBudWxsKSB7Ci0JCQkJY3JlYXRlTmV3Q29udHJpYnV0b3IgPSB0cnVlOwotCQkJfSBlbHNlIHsKLQkJCQl1c2VkQ2F0ZWdvcnkgPSBjb250cmliOwotCQkJfQotCQl9IGVsc2UgewotCQkJdXNlZENhdGVnb3J5ID0gY2F0ZWdvcnk7Ci0JCX0KLQotCQltb2RpZmllZFJlc291cmNlcyA9IG5ldyBIYXNoU2V0KCk7Ci0KLQkJcmVkbygpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlZG8oKSB7Ci0JCWlmIChjcmVhdGVOZXdDb250cmlidXRvcikgewotCQkJQ29udGVudENhdGVnb3J5IGNvbnRyaWIgPSAoQ29udGVudENhdGVnb3J5KSBVbWFGYWN0b3J5LmVJTlNUQU5DRQotCQkJCQkuY3JlYXRlKGNhdGVnb3J5LmVDbGFzcygpKTsKLQkJCWNvbnRyaWIuc2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudChjYXRlZ29yeSk7Ci0JCQljb250cmliLnNldFZhcmlhYmlsaXR5VHlwZShWYXJpYWJpbGl0eVR5cGUuQ09OVFJJQlVURVMpOwotCQkJY2F0ZWdvcnlQa2cuZ2V0Q29udGVudEVsZW1lbnRzKCkuYWRkKGNvbnRyaWIpOwotCQkJdXNlZENhdGVnb3J5ID0gY29udHJpYjsKLQkJCWlmICh1c2VkQ2F0ZWdvcnkgaW5zdGFuY2VvZiBDdXN0b21DYXRlZ29yeSkgewotCQkJCUN1c3RvbUNhdGVnb3J5IHJvb3QgPSBUbmdVdGlsLmdldFJvb3RDdXN0b21DYXRlZ29yeShVbWFVdGlsCi0JCQkJCQkuZ2V0TWV0aG9kUGx1Z2luKHVzZWRDYXRlZ29yeSkpOwotCQkJCUxpc3QgbGlzdCA9IHJvb3QuZ2V0Q2F0ZWdvcml6ZWRFbGVtZW50cygpOwotCQkJCWxpc3QuYWRkKHVzZWRDYXRlZ29yeSk7Ci0JCQkJVG5nVXRpbC5zZXREZWZhdWx0TmFtZShyb290LCAoQ3VzdG9tQ2F0ZWdvcnkpdXNlZENhdGVnb3J5LCBjYXRlZ29yeS5nZXROYW1lKCkpOwotCQkJfSBlbHNlIHsKLQkJCQl1c2VkQ2F0ZWdvcnkuc2V0TmFtZShjYXRlZ29yeS5nZXROYW1lKCkpOwotCQkJfQotCQl9Ci0JCU9wcG9zaXRlRmVhdHVyZSBvcHBvc2l0ZUZlYXR1cmUgPSBPcHBvc2l0ZUZlYXR1cmUKLQkJCQkuZ2V0T3Bwb3NpdGVGZWF0dXJlKGZlYXR1cmUpOwotCQlNdWx0aVJlc291cmNlRU9iamVjdCBtckVPYmogPSAoTXVsdGlSZXNvdXJjZUVPYmplY3QpIGVsZW1lbnQ7Ci0JCW9sZE9wcG9zaXRlRmVhdHVyZVZhbHVlID0gbXJFT2JqLmdldE9wcG9zaXRlRmVhdHVyZU1hcCgpLmdldCgKLQkJCQlvcHBvc2l0ZUZlYXR1cmUpOwotCQlpZiAoZmVhdHVyZS5pc01hbnkoKSkgewotCQkJQ29sbGVjdGlvbiBjb2xsZWN0aW9uID0gKENvbGxlY3Rpb24pIHVzZWRDYXRlZ29yeS5lR2V0KGZlYXR1cmUpOwotCQkJaWYgKG9sZE9wcG9zaXRlRmVhdHVyZVZhbHVlICE9IG51bGwgJiYgIW9wcG9zaXRlRmVhdHVyZS5pc01hbnkoKSkgewotCQkJCWlmIChvbGRPcHBvc2l0ZUZlYXR1cmVWYWx1ZSAhPSB1c2VkQ2F0ZWdvcnkpIHsKLQkJCQkJRU9iamVjdCBvbGRPcHBWYWwgPSAoRU9iamVjdCkgb2xkT3Bwb3NpdGVGZWF0dXJlVmFsdWU7Ci0JCQkJCSgoQ29sbGVjdGlvbikgb2xkT3BwVmFsLmVHZXQoZmVhdHVyZSkpLnJlbW92ZShlbGVtZW50KTsKLQkJCQkJaWYgKG9sZE9wcFZhbC5lUmVzb3VyY2UoKSAhPSBudWxsKSB7Ci0JCQkJCQltb2RpZmllZFJlc291cmNlcy5hZGQob2xkT3BwVmFsLmVSZXNvdXJjZSgpKTsKLQkJCQkJfQotCi0JCQkJCWNvbGxlY3Rpb24uYWRkKGVsZW1lbnQpOwotCQkJCX0KLQkJCX0KLQkJCWlmICghY29sbGVjdGlvbi5jb250YWlucyhlbGVtZW50KSkgewotCQkJCWNvbGxlY3Rpb24uYWRkKGVsZW1lbnQpOwotCQkJfQotCQl9IGVsc2UgewotCQkJaWYgKG9sZE9wcG9zaXRlRmVhdHVyZVZhbHVlICE9IG51bGwgJiYgIW9wcG9zaXRlRmVhdHVyZS5pc01hbnkoKSkgewotCQkJCWlmIChvbGRPcHBvc2l0ZUZlYXR1cmVWYWx1ZSAhPSB1c2VkQ2F0ZWdvcnkpIHsKLQkJCQkJRU9iamVjdCBvbGRPcHBWYWwgPSAoRU9iamVjdCkgb2xkT3Bwb3NpdGVGZWF0dXJlVmFsdWU7Ci0JCQkJCW9sZE9wcFZhbC5lU2V0KGZlYXR1cmUsIG51bGwpOwotCQkJCQlpZiAob2xkT3BwVmFsLmVSZXNvdXJjZSgpICE9IG51bGwpIHsKLQkJCQkJCW1vZGlmaWVkUmVzb3VyY2VzLmFkZChvbGRPcHBWYWwuZVJlc291cmNlKCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJaWYgKHVzZWRDYXRlZ29yeSAhPSBvbGRPcHBvc2l0ZUZlYXR1cmVWYWx1ZSkgewotCQkJCXVzZWRDYXRlZ29yeS5lU2V0KGZlYXR1cmUsIGVsZW1lbnQpOwotCQkJfQotCQl9Ci0KLQkJaWYgKHVzZWRDYXRlZ29yeS5lUmVzb3VyY2UoKSAhPSBudWxsKSB7Ci0JCQltb2RpZmllZFJlc291cmNlcy5hZGQodXNlZENhdGVnb3J5LmVSZXNvdXJjZSgpKTsKLQkJfQotCQlpZiAodXNlZENhdGVnb3JpZXMuY29udGFpbnMoY2F0ZWdvcnkpKSB7Ci0JCQl1c2VkQ2F0ZWdvcmllcy5yZW1vdmUoY2F0ZWdvcnkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdW5kbygpIHsKLQkJT3Bwb3NpdGVGZWF0dXJlIG9wcG9zaXRlRmVhdHVyZSA9IE9wcG9zaXRlRmVhdHVyZQotCQkJCS5nZXRPcHBvc2l0ZUZlYXR1cmUoZmVhdHVyZSk7Ci0JCWlmIChmZWF0dXJlLmlzTWFueSgpKSB7Ci0JCQlDb2xsZWN0aW9uIGNvbGxlY3Rpb24gPSAoQ29sbGVjdGlvbikgdXNlZENhdGVnb3J5LmVHZXQoZmVhdHVyZSk7Ci0JCQljb2xsZWN0aW9uLnJlbW92ZShlbGVtZW50KTsKLQkJfSBlbHNlIHsKLQkJCXVzZWRDYXRlZ29yeS5lU2V0KGZlYXR1cmUsIG51bGwpOwotCQl9Ci0KLQkJLy8gcmVzdG9yZSBvbGQgdmFsdWUgb2YgdGhlIHNpbmdsZS12YWx1ZSBvcHBvc2l0ZSBmZWF0dXJlCi0JCS8vCi0JCWlmICghb3Bwb3NpdGVGZWF0dXJlLmlzTWFueSgpICYmIG9sZE9wcG9zaXRlRmVhdHVyZVZhbHVlICE9IG51bGwKLQkJCQkmJiBvbGRPcHBvc2l0ZUZlYXR1cmVWYWx1ZSAhPSB1c2VkQ2F0ZWdvcnkpIHsKLQkJCUVPYmplY3Qgb2xkT3BwVmFsID0gKEVPYmplY3QpIG9sZE9wcG9zaXRlRmVhdHVyZVZhbHVlOwotCQkJaWYgKGZlYXR1cmUuaXNNYW55KCkpIHsKLQkJCQkoKENvbGxlY3Rpb24pIG9sZE9wcFZhbC5lR2V0KGZlYXR1cmUpKS5hZGQoZWxlbWVudCk7Ci0JCQl9IGVsc2UgewotCQkJCW9sZE9wcFZhbC5lU2V0KGZlYXR1cmUsIGVsZW1lbnQpOwotCQkJfQotCQl9Ci0KLQkJaWYgKGNyZWF0ZU5ld0NvbnRyaWJ1dG9yKSB7Ci0JCQlpZiAoVG5nVXRpbC5pc0VtcHR5KHVzZWRDYXRlZ29yeSkpIHsKLQkJCQlNZXRob2RQbHVnaW4gdXNlZENhdGVnb3J5UGx1Z2luID0gVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4odXNlZENhdGVnb3J5KTsKLQkJCQlFY29yZVV0aWwucmVtb3ZlKHVzZWRDYXRlZ29yeSk7Ci0JCQkJaWYgKHVzZWRDYXRlZ29yeSBpbnN0YW5jZW9mIEN1c3RvbUNhdGVnb3J5KSB7Ci0JCQkJCVRuZ1V0aWwuZ2V0Um9vdEN1c3RvbUNhdGVnb3J5KHVzZWRDYXRlZ29yeVBsdWdpbikKLQkJCQkJCQkuZ2V0Q2F0ZWdvcml6ZWRFbGVtZW50cygpLnJlbW92ZSh1c2VkQ2F0ZWdvcnkpOwotCQkJCX0KLQkJCQl1c2VkQ2F0ZWdvcnkgPSBudWxsOwotCQkJfQotCQl9Ci0JCWlmICghdXNlZENhdGVnb3JpZXMuY29udGFpbnMoY2F0ZWdvcnkpKSB7Ci0JCQl1c2VkQ2F0ZWdvcmllcy5hZGQoY2F0ZWdvcnkpOwotCQl9Ci0KLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRBZmZlY3RlZE9iamVjdHMoKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KHVzZWRDYXRlZ29yeSk7Ci0JfQotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0TW9kaWZpZWRSZXNvdXJjZXMoKSB7Ci0JCQotCQkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTQ2NjYyCi0JCS8vIEJlbG93IGFkZGluZyBjYXRlZ29yeSdzIHJlc291cmNlIHRvIG1vZGlmaWVkUmVzb3VyY2VzIGlzIG5lZWRlZCwgCi0JCS8vIGJlY2F1c2UgYmVmb3JlIGV4ZWN1dGluZyBjb21tYW5kLCBuZWVkIHRvIHZlcmlmeSBpZiByZXNvdXJjZSBpcyBtdXRhYmxlIG9yIG5vdAotCQkvLyBnZXRNb2RpZmllZFJlc291cmNlcygpIGNhbGxlZCBiZWZvcmUgZXhlY3V0aW5nIGFjdHVhbCBleGVjdXRlKCkgaW4gZmV3IGNhc2VzLgotCQkvLyBVc2VmdWwgaW4gc3BlY2lhbCBjYXNlcyBsaWtlIGlmIHJlc291cmNlIGlzIGluIHZlcnNpb24gY29udHJvbC4KLQkJLy8KLQkJaWYoY2F0ZWdvcnkgIT0gbnVsbCAmJiBjYXRlZ29yeS5lUmVzb3VyY2UoKSAhPSBudWxsCi0JCQkJJiYgbW9kaWZpZWRSZXNvdXJjZXMgPT0gbnVsbCl7Ci0JCQltb2RpZmllZFJlc291cmNlcyA9IG5ldyBIYXNoU2V0KCk7Ci0JCQltb2RpZmllZFJlc291cmNlcy5hZGQoY2F0ZWdvcnkuZVJlc291cmNlKCkpOwotCQl9Ci0JCQotCQlpZiAobW9kaWZpZWRSZXNvdXJjZXMgPT0gbnVsbCkgewotCQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JCX0KLQkJcmV0dXJuIG1vZGlmaWVkUmVzb3VyY2VzOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb21tYW5kL0FkZFRvU2VjdGlvbkxpc3RDb21tYW5kLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbW1hbmQvQWRkVG9TZWN0aW9uTGlzdENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTA1ZTUyNS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbW1hbmQvQWRkVG9TZWN0aW9uTGlzdENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQWJzdHJhY3RDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5TZWN0aW9uTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuU2VjdGlvbjsKLQotLyoqCi0gKiBUaGlzIGNvbW1hbmQgaXMgdXNlZCB0byBhZGQgYSBuZXcgc2VjdGlvbiB0byB0aGUgc2VjdGlvbiBsaXN0LgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQWRkVG9TZWN0aW9uTGlzdENvbW1hbmQgZXh0ZW5kcyBBYnN0cmFjdENvbW1hbmQgaW1wbGVtZW50cwotCQlJUmVzb3VyY2VBd2FyZUNvbW1hbmQgewotCi0JcHJpdmF0ZSBDb250ZW50RWxlbWVudCBjb250ZW50RWxlbWVudDsKLQotCXByaXZhdGUgU2VjdGlvbkxpc3Qgc2VjdGlvbkxpc3Q7Ci0KLQlwcml2YXRlIFNlY3Rpb24gc2VjdGlvbjsKLQotCXByaXZhdGUgQ29sbGVjdGlvbiBtb2RpZmllZFJlc291cmNlczsKLQotCXByaXZhdGUgYm9vbGVhbiBhZGRlZDsKLQotCXB1YmxpYyBBZGRUb1NlY3Rpb25MaXN0Q29tbWFuZChDb250ZW50RWxlbWVudCBjb250ZW50RWxlbWVudCwKLQkJCVNlY3Rpb24gc2VjdGlvbiwgU2VjdGlvbkxpc3Qgc2VjdGlvbkxpc3QpIHsKLQkJdGhpcy5jb250ZW50RWxlbWVudCA9IGNvbnRlbnRFbGVtZW50OwotCQl0aGlzLnNlY3Rpb25MaXN0ID0gc2VjdGlvbkxpc3Q7Ci0JCXRoaXMuc2VjdGlvbiA9IHNlY3Rpb247Ci0KLQkJbW9kaWZpZWRSZXNvdXJjZXMgPSBuZXcgSGFzaFNldCgpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHByZXBhcmUoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuY29tbWFuZC5JUmVzb3VyY2VBd2FyZUNvbW1hbmQjZ2V0TW9kaWZpZWRSZXNvdXJjZXMoKQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldE1vZGlmaWVkUmVzb3VyY2VzKCkgewotCQlpZiAoY29udGVudEVsZW1lbnQuZ2V0UHJlc2VudGF0aW9uKCkuZVJlc291cmNlKCkgIT0gbnVsbCkgewotCQkJbW9kaWZpZWRSZXNvdXJjZXMuYWRkKGNvbnRlbnRFbGVtZW50LmdldFByZXNlbnRhdGlvbigpLmVSZXNvdXJjZSgpKTsKLQkJfWVsc2V7Ci0JCQkvLyBUaGlzIGNoZWNrIGlzIGRvbmUgdG8gYnlwYXNzIGFkZGl0aW9uIG9mIHNlY3Rpb24gdG8gbWV0aG9kIGVsZW1lbnQKLQkJCS8vIGZvciBmaXJzdCB0aW1lLCBpZiBwbHVnaW4ueG1pIGZpbGUgY2hlY2tlZC1vdXQgd2l0aCB2ZXJzaW9uIGNvbnRyb2wuIAotCQkJaWYoY29udGVudEVsZW1lbnQuZVJlc291cmNlKCkgIT0gbnVsbCl7Ci0JCQkJbW9kaWZpZWRSZXNvdXJjZXMuYWRkKGNvbnRlbnRFbGVtZW50LmVSZXNvdXJjZSgpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbW9kaWZpZWRSZXNvdXJjZXM7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZCNleGVjdXRlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCi0JCXJlZG8oKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kI3JlZG8oKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlZG8oKSB7Ci0KLQkJaWYgKGNvbnRlbnRFbGVtZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCXNlY3Rpb25MaXN0LmFkZChzZWN0aW9uKTsKLQkJYWRkZWQgPSB0cnVlOwotCQlzZWN0aW9uTGlzdC5hcHBseSgpOwotCi0JfQotCi0JcHVibGljIHZvaWQgdW5kbygpIHsKLQkJaWYgKGFkZGVkKSB7Ci0JCQlzZWN0aW9uTGlzdC5yZW1vdmUoc2VjdGlvbik7Ci0JCQlzZWN0aW9uTGlzdC5hcHBseSgpOwotCQkJYWRkZWQgPSBmYWxzZTsKLQkJfQotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldEFmZmVjdGVkT2JqZWN0cygpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QoY29udGVudEVsZW1lbnQpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb21tYW5kL0JhdGNoQ29tbWFuZC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb21tYW5kL0JhdGNoQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MWYxNjhmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29tbWFuZC9CYXRjaENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyNSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkFic3RyYWN0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotCi0vKioKLSAqIFRoaXMgY29tbWFuZCBpcyB1c2VkIHRvIGNoYW5nZSB0aGUgZmVhdHVyZXMgb2YgbXVsdGlwbGUgb2JqZWN0cyBpbgotICogYSBzaW5nbGUgYmF0Y2guCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQmF0Y2hDb21tYW5kIGV4dGVuZHMgQWJzdHJhY3RDb21tYW5kIHsKLQlwcml2YXRlIE1hcCBvYmplY3RUb09sZEZlYXR1cmVWYWx1ZXNNYXA7Ci0JcHJpdmF0ZSBNYXAgb2JqZWN0VG9OZXdGZWF0dXJlVmFsdWVzTWFwOwotCXByaXZhdGUgYm9vbGVhbiBjbGVhcjsKLQkKLQkvKioKLQkgKiBAcGFyYW0gY2xlYXIgaWYgdHJ1ZSB3aWxsIGNsZWFyIHRoZSBtYW55LXZhbHVlZCBmZWF0dXJlIGJlZm9yZSBhZGRpbmcgbmV3IHZhbHVlcyAKLQkgKi8KLQlwdWJsaWMgQmF0Y2hDb21tYW5kKGJvb2xlYW4gY2xlYXIpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5jbGVhciA9IGNsZWFyOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5BYnN0cmFjdENvbW1hbmQjY2FuRXhlY3V0ZSgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2FuRXhlY3V0ZSgpIHsKLQkJcmV0dXJuIG9iamVjdFRvTmV3RmVhdHVyZVZhbHVlc01hcCAhPSBudWxsICYmICFvYmplY3RUb05ld0ZlYXR1cmVWYWx1ZXNNYXAuaXNFbXB0eSgpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kI2V4ZWN1dGUoKQotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCWlmKG9iamVjdFRvTmV3RmVhdHVyZVZhbHVlc01hcCA9PSBudWxsIHx8IG9iamVjdFRvTmV3RmVhdHVyZVZhbHVlc01hcC5pc0VtcHR5KCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJaWYob2JqZWN0VG9PbGRGZWF0dXJlVmFsdWVzTWFwID09IG51bGwpIHsKLQkJCW9iamVjdFRvT2xkRmVhdHVyZVZhbHVlc01hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCX0KLQotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBvYmplY3RUb05ld0ZlYXR1cmVWYWx1ZXNNYXAuZW50cnlTZXQoKQotCQkJCS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIGl0ZXIubmV4dCgpOwotCQkJRU9iamVjdCBlT2JqID0gKEVPYmplY3QpIGVudHJ5LmdldEtleSgpOwotCQkJTWFwIGZlYXR1cmVNYXAgPSAoTWFwKSBlbnRyeS5nZXRWYWx1ZSgpOwotCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGZlYXR1cmVNYXAuZW50cnlTZXQoKS5pdGVyYXRvcigpOyBpdGVyYXRvcgotCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCWVudHJ5ID0gKE1hcC5FbnRyeSkgaXRlcmF0b3IubmV4dCgpOwotCQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgZW50cnkKLQkJCQkJCS5nZXRLZXkoKTsKLQkJCQlpZiAoZmVhdHVyZS5pc01hbnkoKSkgewotCQkJCQlpZihjbGVhcikgewotCQkJCQkJZU9iai5lU2V0KGZlYXR1cmUsIGVudHJ5LmdldFZhbHVlKCkpOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJKChMaXN0KSBlT2JqLmVHZXQoZmVhdHVyZSkpLmFkZEFsbCgoQ29sbGVjdGlvbikgZW50cnkuZ2V0VmFsdWUoKSk7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQlPYmplY3Qgb2xkVmFsdWUgPSBlT2JqLmVHZXQoZmVhdHVyZSk7Ci0JCQkJCWlmIChvbGRWYWx1ZSAhPSBlbnRyeS5nZXRWYWx1ZSgpKSB7Ci0JCQkJCQlzYXZlT2xkRmVhdHVyZVZhbHVlKGVPYmosIGZlYXR1cmUpOwotCQkJCQkJZU9iai5lU2V0KGZlYXR1cmUsIGVudHJ5LmdldFZhbHVlKCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQjcmVkbygpCi0JICovCi0JcHVibGljIHZvaWQgcmVkbygpIHsKLQkJZXhlY3V0ZSgpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQWJzdHJhY3RDb21tYW5kI3VuZG8oKQotCSAqLwotCXB1YmxpYyB2b2lkIHVuZG8oKSB7Ci0JCWlmIChvYmplY3RUb05ld0ZlYXR1cmVWYWx1ZXNNYXAgIT0gbnVsbCAmJiAhb2JqZWN0VG9OZXdGZWF0dXJlVmFsdWVzTWFwLmlzRW1wdHkoKSkgewotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gb2JqZWN0VG9OZXdGZWF0dXJlVmFsdWVzTWFwLmVudHJ5U2V0KCkKLQkJCQkJLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCU1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIGl0ZXIubmV4dCgpOwotCQkJCUVPYmplY3QgZU9iaiA9IChFT2JqZWN0KSBlbnRyeS5nZXRLZXkoKTsKLQkJCQlNYXAgZmVhdHVyZU1hcCA9IChNYXApIGVudHJ5LmdldFZhbHVlKCk7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGZlYXR1cmVNYXAuZW50cnlTZXQoKS5pdGVyYXRvcigpOyBpdGVyYXRvcgotCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJZW50cnkgPSAoTWFwLkVudHJ5KSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgZW50cnkKLQkJCQkJCQkuZ2V0S2V5KCk7Ci0JCQkJCWlmIChmZWF0dXJlLmlzTWFueSgpKSB7Ci0JCQkJCQkoKExpc3QpIGVPYmouZUdldChmZWF0dXJlKSkKLQkJCQkJCQkJLnJlbW92ZUFsbCgoQ29sbGVjdGlvbikgZW50cnkuZ2V0VmFsdWUoKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9CQkJCi0JCX0KLQotCQkvLyByZXN0b3JlIG9sZCB2YWx1ZQotCQkvLwotCQlpZiAob2JqZWN0VG9PbGRGZWF0dXJlVmFsdWVzTWFwICE9IG51bGwgJiYgIW9iamVjdFRvT2xkRmVhdHVyZVZhbHVlc01hcC5pc0VtcHR5KCkpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IG9iamVjdFRvT2xkRmVhdHVyZVZhbHVlc01hcC5lbnRyeVNldCgpCi0JCQkJCS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBpdGVyLm5leHQoKTsKLQkJCQlFT2JqZWN0IGVPYmogPSAoRU9iamVjdCkgZW50cnkuZ2V0S2V5KCk7Ci0JCQkJTWFwIGZlYXR1cmVNYXAgPSAoTWFwKSBlbnRyeS5nZXRWYWx1ZSgpOwotCQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBmZWF0dXJlTWFwLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IKLQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCWVudHJ5ID0gKE1hcC5FbnRyeSkgaXRlcmF0b3IubmV4dCgpOwotCQkJCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IChFU3RydWN0dXJhbEZlYXR1cmUpIGVudHJ5Ci0JCQkJCQkJLmdldEtleSgpOwotCQkJCQllT2JqLmVTZXQoZmVhdHVyZSwgZW50cnkuZ2V0VmFsdWUoKSk7Ci0JCQkJfQotCQkJfQotCQkJb2JqZWN0VG9PbGRGZWF0dXJlVmFsdWVzTWFwLmNsZWFyKCk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgYWRkRmVhdHVyZVZhbHVlKEVPYmplY3Qgb2JqLCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgT2JqZWN0IHZhbHVlKSB7Ci0JCWFkZEZlYXR1cmVWYWx1ZShnZXRPYmplY3RUb05ld0ZlYXR1cmVWYWx1ZXNNYXAoKSwgb2JqLCBmZWF0dXJlLCB2YWx1ZSk7Ci0JfQotCQotCS8qKgotCSAqIEFkZHMgdmFsdWVzIHRvIGEgJ21hbnknIGZlYXR1cmUuCi0JICogCi0JICogQHBhcmFtIG9iagotCSAqIEBwYXJhbSBmZWF0dXJlIHRoZSBmZWF0dXJlIHdpdGggbWFueSB2YWx1ZXMKLQkgKiBAcGFyYW0gdmFsdWVzCi0JICovCi0JcHVibGljIHZvaWQgYWRkRmVhdHVyZVZhbHVlcyhFT2JqZWN0IG9iaiwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIENvbGxlY3Rpb24gdmFsdWVzKSB7Ci0JCWFkZEZlYXR1cmVWYWx1ZXMoZ2V0T2JqZWN0VG9OZXdGZWF0dXJlVmFsdWVzTWFwKCksIG9iaiwgZmVhdHVyZSwgdmFsdWVzKTsKLQl9Ci0KLQlwdWJsaWMgTWFwIGdldE9iamVjdFRvTmV3RmVhdHVyZVZhbHVlc01hcCgpIHsKLQkJaWYob2JqZWN0VG9OZXdGZWF0dXJlVmFsdWVzTWFwID09IG51bGwpIHsKLQkJCW9iamVjdFRvTmV3RmVhdHVyZVZhbHVlc01hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCX0KLQkJcmV0dXJuIG9iamVjdFRvTmV3RmVhdHVyZVZhbHVlc01hcDsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2F2ZU9sZEZlYXR1cmVWYWx1ZShFT2JqZWN0IGVPYmosCi0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSkgewotCQlPYmplY3QgdmFsdWUgPSBlT2JqLmVHZXQoZmVhdHVyZSk7Ci0JCWlmKGZlYXR1cmUuaXNNYW55KCkpIHsKLQkJCXZhbHVlID0gbmV3IEFycmF5TGlzdCgoTGlzdCl2YWx1ZSk7Ci0JCX0KLQkJTWFwIGZlYXR1cmVNYXAgPSAoTWFwKSBvYmplY3RUb09sZEZlYXR1cmVWYWx1ZXNNYXAuZ2V0KGVPYmopOwotCQlpZiAoZmVhdHVyZU1hcCA9PSBudWxsKSB7Ci0JCQlmZWF0dXJlTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJCW9iamVjdFRvT2xkRmVhdHVyZVZhbHVlc01hcC5wdXQoZU9iaiwgZmVhdHVyZU1hcCk7Ci0JCX0KLQkJZmVhdHVyZU1hcC5wdXQoZmVhdHVyZSwgdmFsdWUpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5BYnN0cmFjdENvbW1hbmQjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJaWYob2JqZWN0VG9OZXdGZWF0dXJlVmFsdWVzTWFwICE9IG51bGwpIHsKLQkJCW9iamVjdFRvTmV3RmVhdHVyZVZhbHVlc01hcC5jbGVhcigpOwotCQkJb2JqZWN0VG9OZXdGZWF0dXJlVmFsdWVzTWFwID0gbnVsbDsKLQkJfQotCQkKLQkJaWYob2JqZWN0VG9PbGRGZWF0dXJlVmFsdWVzTWFwICE9IG51bGwpIHsKLQkJCW9iamVjdFRvT2xkRmVhdHVyZVZhbHVlc01hcC5jbGVhcigpOwotCQkJb2JqZWN0VG9PbGRGZWF0dXJlVmFsdWVzTWFwID0gbnVsbDsKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBhZGRGZWF0dXJlVmFsdWUoTWFwIGRlc2NyaXB0b3JUb05ld0ZlYXR1cmVWYWx1ZXNNYXAsCi0JCQlFT2JqZWN0IG9iamVjdCwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIE9iamVjdCB2YWx1ZSkgewotCQlNYXAgZmVhdHVyZU1hcCA9IChNYXApIGRlc2NyaXB0b3JUb05ld0ZlYXR1cmVWYWx1ZXNNYXAuZ2V0KG9iamVjdCk7Ci0JCWlmIChmZWF0dXJlTWFwID09IG51bGwpIHsKLQkJCWZlYXR1cmVNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQkJZGVzY3JpcHRvclRvTmV3RmVhdHVyZVZhbHVlc01hcC5wdXQob2JqZWN0LCBmZWF0dXJlTWFwKTsKLQkJfQotCQlpZiAoZmVhdHVyZS5pc01hbnkoKSkgewotCQkJTGlzdCBsaXN0ID0gKExpc3QpIGZlYXR1cmVNYXAuZ2V0KGZlYXR1cmUpOwotCQkJaWYgKGxpc3QgPT0gbnVsbCkgewotCQkJCWxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJZmVhdHVyZU1hcC5wdXQoZmVhdHVyZSwgbGlzdCk7Ci0JCQl9Ci0JCQlsaXN0LmFkZCh2YWx1ZSk7Ci0JCX0gZWxzZSB7Ci0JCQlmZWF0dXJlTWFwLnB1dChmZWF0dXJlLCB2YWx1ZSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgYWRkRmVhdHVyZVZhbHVlcyhNYXAgZGVzY3JpcHRvclRvTmV3RmVhdHVyZVZhbHVlc01hcCwKLQkJCUVPYmplY3Qgb2JqZWN0LCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgQ29sbGVjdGlvbiB2YWx1ZXMpIHsKLQkJTWFwIGZlYXR1cmVNYXAgPSAoTWFwKSBkZXNjcmlwdG9yVG9OZXdGZWF0dXJlVmFsdWVzTWFwLmdldChvYmplY3QpOwotCQlpZiAoZmVhdHVyZU1hcCA9PSBudWxsKSB7Ci0JCQlmZWF0dXJlTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJCWRlc2NyaXB0b3JUb05ld0ZlYXR1cmVWYWx1ZXNNYXAucHV0KG9iamVjdCwgZmVhdHVyZU1hcCk7Ci0JCX0KLQkJTGlzdCBsaXN0ID0gKExpc3QpIGZlYXR1cmVNYXAuZ2V0KGZlYXR1cmUpOwotCQlpZiAobGlzdCA9PSBudWxsKSB7Ci0JCQlsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJZmVhdHVyZU1hcC5wdXQoZmVhdHVyZSwgbGlzdCk7Ci0JCX0KLQkJbGlzdC5hZGRBbGwodmFsdWVzKTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbW1hbmQvQ29tbWFuZFN0YWNrQ2hhbmdlZEV2ZW50LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbW1hbmQvQ29tbWFuZFN0YWNrQ2hhbmdlZEV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlMjE3NzMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb21tYW5kL0NvbW1hbmRTdGFja0NoYW5nZWRFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kOwotCi1pbXBvcnQgamF2YS51dGlsLkV2ZW50T2JqZWN0OwotCi0vKioKLSAqIExpc3RlbnMgdG8gY2hhbmdlcyB0byBhIGNvbW1lbmQgc3RhY2suCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBDb21tYW5kU3RhY2tDaGFuZ2VkRXZlbnQgZXh0ZW5kcyBFdmVudE9iamVjdCB7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0FWRUQgPSAxOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVhFQ1VURUQgPSAyOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVU5ETyA9IDQ7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBVTkRPX0FMTCA9IDg7Ci0KLQlwcml2YXRlIGludCB0eXBlOwotCi0JcHVibGljIENvbW1hbmRTdGFja0NoYW5nZWRFdmVudChPYmplY3Qgc291cmNlLCBpbnQgdHlwZSkgewotCQlzdXBlcihzb3VyY2UpOwotCQl0aGlzLnR5cGUgPSB0eXBlOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIHR5cGU7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMzI1NjcyNzI5NDYwNDI5MjkxNkw7Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbW1hbmQvQ29tbWFuZFN0YXR1c0NoZWNrZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29tbWFuZC9Db21tYW5kU3RhdHVzQ2hlY2tlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YjRlZjYyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29tbWFuZC9Db21tYW5kU3RhdHVzQ2hlY2tlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci0KLS8qKgotICogQ2hlY2tzIHRoZSBzdGF0dXMgb2YgYW4gZXhlY3V0ZWQgY29tbWFuZC4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUgLSBPY3QgMjEsIDIwMDUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIENvbW1hbmRTdGF0dXNDaGVja2VyIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBoYXNSb2xsYmFja0Vycm9yKElTdGF0dXMgc3RhdHVzKSB7Ci0JCXJldHVybiBoYXNFcnJvcihzdGF0dXMsIFNhdmVTdGF0dXMuUk9MTEJBQ0tfRVJST1IpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBoYXNTYXZlRXJyb3IoSVN0YXR1cyBzdGF0dXMpIHsKLQkJcmV0dXJuIGhhc0Vycm9yKHN0YXR1cywgU2F2ZVN0YXR1cy5TQVZFX0VSUk9SKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gaGFzRXJyb3IoSVN0YXR1cyBzdGF0dXMsIGludCBlcnJDb2RlKSB7Ci0JCWlmIChzdGF0dXMgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlJU3RhdHVzW10gc3RhdHVzZXMgPSBzdGF0dXMuZ2V0Q2hpbGRyZW4oKTsKLQkJYm9vbGVhbiByZXQgPSBmYWxzZTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzdGF0dXNlcy5sZW5ndGg7IGkrKykgewotCQkJSVN0YXR1cyBjaGlsZFN0YXR1cyA9IHN0YXR1c2VzW2ldOwotCQkJaWYgKGNoaWxkU3RhdHVzIGluc3RhbmNlb2YgU2F2ZVN0YXR1cwotCQkJCQkmJiAoY2hpbGRTdGF0dXMuZ2V0Q29kZSgpICYgZXJyQ29kZSkgPT0gZXJyQ29kZSkgewotCQkJCXJldCA9IHRydWU7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJldDsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbW1hbmQvRGVsZXRlTWV0aG9kRWxlbWVudENvbW1hbmQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29tbWFuZC9EZWxldGVNZXRob2RFbGVtZW50Q29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ODAwZmI3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29tbWFuZC9EZWxldGVNZXRob2RFbGVtZW50Q29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM2MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQ7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkV2ZW50T2JqZWN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgamF2YS51dGlsLk1hcC5FbnRyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5NdWx0aVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kV3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tcG91bmRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLldyYXBwZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FQ29udGVudHNFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLlJlbW92ZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLlN0clV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JQ29tbWFuZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSVJlZmVyZW5jZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JU3RhdGVmdWxJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuUHJvdmlkZXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudWkuVXNlckludGVyYWN0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5FeHRlbnNpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5JUnVubmFibGVXaXRoUHJvZ3Jlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLk1lc3NlbmdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuUHJvY2Vzc1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzLklMaWJyYXJ5UGVyc2lzdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy5TZXJ2aWNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VydmljZXMuSUxpYnJhcnlQZXJzaXN0ZXIuRmFpbFNhZmVNZXRob2RMaWJyYXJ5UGVyc2lzdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DdXN0b21DYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLmltcGwuTXVsdGlSZXNvdXJjZUVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkFzc29jaWF0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5VbWFVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLS8qKgotICogVGhpcyBjb21tYW5kIGlzIHVzZWQgdG8gZGVsZXRlIGEgbWV0aG9kIGVsZW1lbnQgcGVybWFuZW50bHkuIFRoaXMgaW52b2x2ZXMKLSAqIGRlbGV0aW5nIHRoZSBzdG9yYWdlIGNvbnRlbnQgYW5kIHJlbW92aW5nIGFsbCByZWZlcmVuY2VzIHRvIHRoaXMgZWxlbWVudC4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIERlbGV0ZU1ldGhvZEVsZW1lbnRDb21tYW5kIGV4dGVuZHMgQ29tbWFuZFdyYXBwZXIgewotCi0JcHJvdGVjdGVkIENvbGxlY3Rpb24gZWxlbWVudHM7Ci0KLQlwcml2YXRlIGJvb2xlYW4gcmVmUmVtb3ZlZDsKLQotCXB1YmxpYyBib29sZWFuIGV4ZWN1dGVkID0gZmFsc2U7Ci0KLQlwcml2YXRlIENvbGxlY3Rpb24gY29tbWFuZExpc3RlbmVyczsKLQotCXByaXZhdGUgRmFpbFNhZmVNZXRob2RMaWJyYXJ5UGVyc2lzdGVyIHBlcnNpc3RlcjsKLQotCXByb3RlY3RlZCBBcnJheUxpc3QgZWxlbWVudHNUb0RlbGV0ZUNvbnRlbnQ7Ci0KLQlwcm90ZWN0ZWQgU2V0PFJlc291cmNlPiBtb2RpZmllZFJlc291cmNlczsKLQotCS8vIE1hcCBvZiBlbGVtZW50IHRvIE1hcCBvZiBpdHMgcmVmZXJlbmNlciB0byBmZWF0dXJlcyBsaXN0Ci0JLy8KLQlwcm90ZWN0ZWQgTWFwPEVPYmplY3QsIE1hcDxFT2JqZWN0LCBDb2xsZWN0aW9uPEVTdHJ1Y3R1cmFsRmVhdHVyZT4+PiBlbGVtZW50VG9SZW1vdmVkUmVmc01hcDsKLQotCXByaXZhdGUgQmF0Y2hDb21tYW5kIGJhdGNoQ29tbWFuZCA9IG5ldyBCYXRjaENvbW1hbmQodHJ1ZSk7Ci0KLQkvKioKLQkgKiBMaXN0IG9mIFJlZmVyZW5jZSBvYmplY3RzCi0JICogCi0JICogQHNlZSBSZWZlcmVuY2UKLQkgKi8KLQlwcm90ZWN0ZWQgQXJyYXlMaXN0IHJlbW92ZWRSZWZlcmVuY2VzOwotCi0JcHVibGljIGJvb2xlYW4gZmFpbGVkOwotCi0JcHJpdmF0ZSBib29sZWFuIGNvbmZpcm1SZW1vdmVSZWZlcmVuY2VzOwotCQotCXByaXZhdGUgQXJyYXlMaXN0PENvbW1hbmQ+IG5lc3RlZENvbW1hbmRzOwotCi0JcHJpdmF0ZSBIYXNoU2V0PERlc2NyaXB0b3I+IGRlc2NyaXB0b3JzOwotCi0JLyoqCi0JICogQHBhcmFtIGNvbW1hbmQKLQkgKiBAcGFyYW0gZWxlbWVudHMKLQkgKiAgICAgICAgICAgIE1ldGhvZEVsZW1lbnQgb2JqZWN0cyB0byBiZSBwZXJtYW5lbnRseSBkZWxldGVkLgotCSAqLwotCXB1YmxpYyBEZWxldGVNZXRob2RFbGVtZW50Q29tbWFuZChDb21tYW5kIGNvbW1hbmQsIENvbGxlY3Rpb24gZWxlbWVudHMpIHsKLQkJdGhpcyhjb21tYW5kLCBlbGVtZW50cywgdHJ1ZSk7Ci0JfQotCi0JcHVibGljIERlbGV0ZU1ldGhvZEVsZW1lbnRDb21tYW5kKENvbW1hbmQgY29tbWFuZCwgQ29sbGVjdGlvbiBlbGVtZW50cywKLQkJCWJvb2xlYW4gY29uZmlybVJlbW92ZVJlZnMpIHsKLQkJc3VwZXIoY29tbWFuZCk7Ci0JCXRoaXMuZWxlbWVudHMgPSBlbGVtZW50cyA9PSBudWxsID8gbnVsbCA6IG5ldyBBcnJheUxpc3QoZWxlbWVudHMpOwotCQljb21tYW5kTGlzdGVuZXJzID0gbmV3IEFycmF5TGlzdCgpOwotCQljb25maXJtUmVtb3ZlUmVmZXJlbmNlcyA9IGNvbmZpcm1SZW1vdmVSZWZzOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmRXcmFwcGVyI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWJhdGNoQ29tbWFuZC5kaXNwb3NlKCk7Ci0JCWlmIChjb21tYW5kTGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCWNvbW1hbmRMaXN0ZW5lcnMuY2xlYXIoKTsKLQkJfQotCQlpZiAoZWxlbWVudHMgIT0gbnVsbCkgewotCQkJZWxlbWVudHMuY2xlYXIoKTsKLQkJfQotCQlpZiAoZWxlbWVudHNUb0RlbGV0ZUNvbnRlbnQgIT0gbnVsbCkgewotCQkJZWxlbWVudHNUb0RlbGV0ZUNvbnRlbnQuY2xlYXIoKTsKLQkJfQotCQlpZiAoZWxlbWVudFRvUmVtb3ZlZFJlZnNNYXAgIT0gbnVsbCkgewotCQkJZWxlbWVudFRvUmVtb3ZlZFJlZnNNYXAuY2xlYXIoKTsKLQkJfQotCQlpZiAobW9kaWZpZWRSZXNvdXJjZXMgIT0gbnVsbCkgewotCQkJbW9kaWZpZWRSZXNvdXJjZXMuY2xlYXIoKTsKLQkJfQotCQlpZiAocmVtb3ZlZFJlZmVyZW5jZXMgIT0gbnVsbCkgewotCQkJcmVtb3ZlZFJlZmVyZW5jZXMuY2xlYXIoKTsKLQkJfQotCQkvLyBEaXNwb3NlIG5lc3RlZCBjb21tYW5kcy4KLQkJaWYobmVzdGVkQ29tbWFuZHMgIT0gbnVsbCl7Ci0JCQlpZighbmVzdGVkQ29tbWFuZHMuaXNFbXB0eSgpKXsKLQkJCQlmb3IgKENvbW1hbmQgY29tbWFuZCA6IG5lc3RlZENvbW1hbmRzKSB7Ci0JCQkJCWNvbW1hbmQuZGlzcG9zZSgpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlpZihkZXNjcmlwdG9ycyAhPSBudWxsKSB7Ci0JCQlkZXNjcmlwdG9ycy5jbGVhcigpOwotCQl9Ci0JCQotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc3VwZXJFeGVjdXRlKCkgewotCQlzdXBlci5leGVjdXRlKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIG5vdGlmeVByZUV4ZWN1dGUoKSB7Ci0JCUxpc3QgY29tbWFuZExpc3RlbmVycyA9IFByb3ZpZGVycwotCQkJCS5nZXRDb21tYW5kTGlzdGVuZXJzKERlbGV0ZU1ldGhvZEVsZW1lbnRDb21tYW5kLmNsYXNzKTsKLQkJaWYgKGNvbW1hbmRMaXN0ZW5lcnMgIT0gbnVsbCAmJiAhY29tbWFuZExpc3RlbmVycy5pc0VtcHR5KCkpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGNvbW1hbmRMaXN0ZW5lcnMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJSUNvbW1hbmRMaXN0ZW5lciBjbWRMaXN0ZW5lciA9IChJQ29tbWFuZExpc3RlbmVyKSBpdGVyLm5leHQoKTsKLQkJCQl0cnkgewotCQkJCQljbWRMaXN0ZW5lci5wcmVFeGVjdXRlKHRoaXMpOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCUxpYnJhcnlFZGl0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgbm90aWZ5UHJlVW5kbygpIHsKLQkJTGlzdCBjb21tYW5kTGlzdGVuZXJzID0gUHJvdmlkZXJzCi0JCQkJLmdldENvbW1hbmRMaXN0ZW5lcnMoRGVsZXRlTWV0aG9kRWxlbWVudENvbW1hbmQuY2xhc3MpOwotCQlpZiAoY29tbWFuZExpc3RlbmVycyAhPSBudWxsICYmICFjb21tYW5kTGlzdGVuZXJzLmlzRW1wdHkoKSkgewotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gY29tbWFuZExpc3RlbmVycy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlJQ29tbWFuZExpc3RlbmVyIGNtZExpc3RlbmVyID0gKElDb21tYW5kTGlzdGVuZXIpIGl0ZXIubmV4dCgpOwotCQkJCXRyeSB7Ci0JCQkJCWNtZExpc3RlbmVyLnByZVVuZG8odGhpcyk7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJTGlicmFyeUVkaXRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHByZXBhcmVFbGVtZW50cygpIHsKLQkJQXJyYXlMaXN0IG5ld0VsZW1lbnRzID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBlbGVtZW50cy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEN1c3RvbUNhdGVnb3J5KSB7Ci0JCQkJUmVtb3ZlQ29tbWFuZCBjbWQgPSBnZXRSZW1vdmVDb21tYW5kKGVsZW1lbnQpOwotCQkJCWlmIChjbWQuZ2V0RmVhdHVyZSgpIGluc3RhbmNlb2YgRVJlZmVyZW5jZQotCQkJCQkJJiYgKChFUmVmZXJlbmNlKSBjbWQuZ2V0RmVhdHVyZSgpKS5pc0NvbnRhaW5tZW50KCkKLQkJCQkJCSYmIGNtZC5nZXRPd25lckxpc3QoKS5jb250YWlucyhlbGVtZW50KSkgewotCQkJCQkvLyBjdXN0b20gY2F0ZWdvcnkgd2lsbCBiZSBkZWxldGVkIHBlcm1hbmVudGx5Ci0JCQkJCS8vIGZpbmQgYWxsIHN1YmNhdGVnb3J5IHRoYXQgYXJlIG5vdCByZWZlcmVuY2VkIGJ5IGFueSBvdGhlcgotCQkJCQkvLyBjdXN0b20gY2F0ZWdvcnkKLQkJCQkJLy8gaW4gdGhlIHNhbWUgcGx1Z2luIHRvIGRlbGV0ZSB0aGVtIGFzIHdlbGwKLQkJCQkJLy8KLQkJCQkJQ29sbGVjdGlvbiBjb2xsZWN0aW9uID0gVG5nVXRpbAotCQkJCQkJCS5nZXRFeGNsdXNpdmVTdWJDdXN0b21DYXRlZ29yaWVzKChDdXN0b21DYXRlZ29yeSkgZWxlbWVudCk7Ci0JCQkJCWlmICghY29sbGVjdGlvbi5pc0VtcHR5KCkpIHsKLQkJCQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBjb2xsZWN0aW9uLml0ZXJhdG9yKCk7IGl0ZXJhdG9yCi0JCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJT2JqZWN0IHN1YkNhdCA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJCQlpZiAoIWVsZW1lbnRzLmNvbnRhaW5zKHN1YkNhdCkKLQkJCQkJCQkJCSYmICFuZXdFbGVtZW50cy5jb250YWlucyhzdWJDYXQpKSB7Ci0vLwkJCQkJCQkJY21kLmdldENvbGxlY3Rpb24oKS5hZGQoc3ViQ2F0KTsKLQkJCQkJCQkJQ29sbGVjdGlvbiBjb2wgPSBjbWQuZ2V0Q29sbGVjdGlvbigpOwotCQkJCQkJCQljb2wuYWRkKHN1YkNhdCk7CQkJCQkJCQkKLQkJCQkJCQkJbmV3RWxlbWVudHMuYWRkKHN1YkNhdCk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWVsZW1lbnRzLmFkZEFsbChuZXdFbGVtZW50cyk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgUmVtb3ZlQ29tbWFuZCBmb3IgdGhlIGdpdmVuIGVsZW1lbnQKLQkgKiAKLQkgKiBAcGFyYW0gZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwcm90ZWN0ZWQgUmVtb3ZlQ29tbWFuZCBnZXRSZW1vdmVDb21tYW5kKE9iamVjdCBlKSB7Ci0JCWlmIChjb21tYW5kIGluc3RhbmNlb2YgUmVtb3ZlQ29tbWFuZCkgewotCQkJaWYgKCgoUmVtb3ZlQ29tbWFuZCkgY29tbWFuZCkuZ2V0Q29sbGVjdGlvbigpLmNvbnRhaW5zKGUpKSB7Ci0JCQkJcmV0dXJuIChSZW1vdmVDb21tYW5kKSBjb21tYW5kOwotCQkJfQotCQl9IGVsc2UgaWYgKGNvbW1hbmQgaW5zdGFuY2VvZiBDb21wb3VuZENvbW1hbmQpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9ICgoQ29tcG91bmRDb21tYW5kKSBjb21tYW5kKS5nZXRDb21tYW5kTGlzdCgpCi0JCQkJCS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3QgY21kID0gKE9iamVjdCkgaXRlci5uZXh0KCk7Ci0JCQkJaWYgKGNtZCBpbnN0YW5jZW9mIFJlbW92ZUNvbW1hbmQpIHsKLQkJCQkJUmVtb3ZlQ29tbWFuZCByZW1vdmVDb21tYW5kID0gKFJlbW92ZUNvbW1hbmQpIGNtZDsKLQkJCQkJaWYgKHJlbW92ZUNvbW1hbmQuZ2V0Q29sbGVjdGlvbigpLmNvbnRhaW5zKGUpKSB7Ci0JCQkJCQlyZXR1cm4gcmVtb3ZlQ29tbWFuZDsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQlwcmVwYXJlRWxlbWVudHMoKTsKLQotCQlub3RpZnlQcmVFeGVjdXRlKCk7Ci0KLQkJZWxlbWVudHNUb0RlbGV0ZUNvbnRlbnQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWRlc2NyaXB0b3JzID0gbmV3IEhhc2hTZXQ8RGVzY3JpcHRvcj4oKTsKLQotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBlbGVtZW50cy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gVG5nVXRpbC51bndyYXAoaXRlci5uZXh0KCkpOwotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQkJY29sbGVjdE9iamVjdHNUb0RlbGV0ZUNvbnRlbnQoZWxlbWVudHNUb0RlbGV0ZUNvbnRlbnQsCi0JCQkJCQkoTWV0aG9kRWxlbWVudCkgZWxlbWVudCk7Ci0JCQl9Ci0JCX0KLQotCQlJUnVubmFibGVXaXRoUHJvZ3Jlc3MgcnVubmFibGUgPSBuZXcgSVJ1bm5hYmxlV2l0aFByb2dyZXNzKCkgewotCi0JCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQotCQkJCQl0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQkJCXByZXBhcmVSZW1vdmluZ1JlZmVyZW5jZXMoKTsKLQkJCX0KLQotCQl9OwotCQlVc2VySW50ZXJhY3Rpb25IZWxwZXIucnVuV2l0aFByb2dyZXNzKHJ1bm5hYmxlLAotCQkJCUxpYnJhcnlFZGl0UmVzb3VyY2VzLnByb2Nlc3NpbmdSZWZlcmVuY2VzVGFza19uYW1lKTsgCi0KLQotCQlpZighY29uZmlybVJlbW92aW5nUmVmZXJlbmNlcygpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCW1vZGlmaWVkUmVzb3VyY2VzID0gbmV3IEhhc2hTZXQ8UmVzb3VyY2U+KCk7Ci0JCVNldCB1bm1vZGlmaWVkUmVzb3VyY2VzID0gbmV3IEhhc2hTZXQoKTsKLQotCQkvLyBnZXQgdGhlIG93bmVyIHJlc291cmNlcyBiZWZvcmUgdGhlIGVsZW1lbnRzIGdvdCByZW1vdmVkIGZyb20KLQkJLy8gY29udGFpbmVyIGluIHN1cGVyRXhlY3V0ZSgpCi0JCS8vCi0JCWNvbGxlY3RPd25lclJlc291cmNlcyhtb2RpZmllZFJlc291cmNlcywgdW5tb2RpZmllZFJlc291cmNlcyk7Ci0KLQkJc3VwZXJFeGVjdXRlKCk7Ci0JCQotCQlleGVjdXRlTmVzdGVkQ29tbWFuZHMoKTsKLQkJCi0JCS8vIENvbGxlY3QgdGhlIG5lc3RlZCBjb21tYW5kIG1vZGlmaWVkIHJlc291cmNlcyBmb3Igc2F2aW5nLiAKLQkJY29sbGVjdE5lc3RlZENvbW1hbmRSZXNvdXJjZXMobW9kaWZpZWRSZXNvdXJjZXMpOwotCi0JCS8vIGdldCByZXNvdXJjZXMgb2YgdGhlIG9iamVjdHMgdGhhdCBoYXZlIGJlZW4gYWZmZWN0ZWQgYnkgdGhpcyBjb21tYW5kCi0JCS8vIHVudGlsIG5vdwotCQkvLwotCQljb2xsZWN0UmVzb3VyY2VzKG1vZGlmaWVkUmVzb3VyY2VzLCBzdXBlci5nZXRBZmZlY3RlZE9iamVjdHMoKSk7Ci0KLQkJbW9kaWZpZWRSZXNvdXJjZXMucmVtb3ZlQWxsKHVubW9kaWZpZWRSZXNvdXJjZXMpOwotCi0JCWZpbmFsIEV4Y2VwdGlvbltdIGV4Y2VwdGlvbnMgPSBuZXcgRXhjZXB0aW9uWzFdOwotCQlVc2VySW50ZXJhY3Rpb25IZWxwZXIuZ2V0VUlIZWxwZXIoKS5ydW5XaXRoQnVzeUluZGljYXRvcihuZXcgUnVubmFibGUoKSB7Ci0KLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQl0cnkgewotCQkJCQlyZW1vdmVSZWZlcmVuY2VzKCk7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJZXhjZXB0aW9uc1swXSA9IGU7Ci0JCQkJfQotCQkJfQotCi0JCX0pOwotCi0JCWlmIChleGNlcHRpb25zWzBdICE9IG51bGwpIHsKLQkJCU1lc3Nlbmdlci5JTlNUQU5DRS5zaG93RXJyb3IoCi0JCQkJCUxpYnJhcnlFZGl0UmVzb3VyY2VzLmRlbGV0ZURpYWxvZ190aXRsZSwKLQkJCQkJTGlicmFyeUVkaXRSZXNvdXJjZXMuZGVsZXRlRWxlbWVudEVycm9yX21zZywKLQkJCQkJTGlicmFyeUVkaXRSZXNvdXJjZXMuZGVsZXRlUmVmZXJlbmNlc0Vycm9yX3JlYXNvbiwKLQkJCQkJZXhjZXB0aW9uc1swXSk7Ci0JCQkJCi0JCQl1bmRvKCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQltb2RpZmllZFJlc291cmNlcy5hZGRBbGwoZ2V0UmVmZXJlbmNpbmdSZXNvdXJjZXMoKSk7Ci0KLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZWxlbWVudHNUb0RlbGV0ZUNvbnRlbnQuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlFT2JqZWN0IGVsZW1lbnQgPSAoRU9iamVjdCkgaXRlci5uZXh0KCk7Ci0JCQlpZiAoZWxlbWVudC5lQ29udGFpbmVyKCkgIT0gbnVsbCkgewotCQkJCWl0ZXIucmVtb3ZlKCk7Ci0JCQl9Ci0JCX0KLQotCQllbGVtZW50c1RvRGVsZXRlQ29udGVudC5hZGRBbGwoZWxlbWVudHMpOwotCQkKLQkJSGFzaFNldDxSZXNvdXJjZT4gZGVsZXRlZFJlc291cmNlcyA9IG5ldyBIYXNoU2V0PFJlc291cmNlPigpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBlbGVtZW50c1RvRGVsZXRlQ29udGVudC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBvYmogPSBpdGVyLm5leHQoKTsKLQkJCWlmICghIChvYmogaW5zdGFuY2VvZiBFT2JqZWN0KSkgewotCQkJCW9iaiA9IFRuZ1V0aWwudW53cmFwKG9iaik7Ci0JCQl9Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgRU9iamVjdCkgewotCQkJCUVPYmplY3QgZSA9IChFT2JqZWN0KSBvYmo7Ci0JCQkJVW1hVXRpbC5nZXRSZXNvdXJjZXMoZSwgZGVsZXRlZFJlc291cmNlcyk7Ci0JCQl9Ci0JCX0KLQkJCi0JCS8vIGV4Y2x1ZGUgZGVsZXRlZCByZXNvdXJjZXMgZnJvbSB0aGUgc2V0IG9mIG1vZGlmaWVkIHJlc291cmNlcwotCQkvLwotCQltb2RpZmllZFJlc291cmNlcy5yZW1vdmVBbGwoZGVsZXRlZFJlc291cmNlcyk7Ci0JCQotCQkvLyBleGNsdWRlIGFueSByZXNvdXJjZSB0aGF0IGlzIGNvbnRhaW5lZCBieSB0aGUgZGVsZXRlZCByZXNvdXJjZXMKLQkJLy8KLQkJZm9yIChJdGVyYXRvciBpdGVyID0gbW9kaWZpZWRSZXNvdXJjZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlSZXNvdXJjZSByZXNvdXJjZSA9IChSZXNvdXJjZSkgaXRlci5uZXh0KCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gZGVsZXRlZFJlc291cmNlcy5pdGVyYXRvcigpOyBpdGVyYXRvcgotCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCVJlc291cmNlIGRlbGV0ZWRSZXNvdXJjZSA9IChSZXNvdXJjZSkgaXRlcmF0b3IubmV4dCgpOwotCQkJCWlmKGdldFBlcnNpc3RlcigpLmlzQ29udGFpbmVkQnkocmVzb3VyY2UsIGRlbGV0ZWRSZXNvdXJjZSkpIHsKLQkJCQkJaXRlci5yZW1vdmUoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0JCQotCQkKLQkJLy8gY2hlY2sgYWZmZWN0ZWQgcmVzb3VyY2VzIGZvciB1bm1vZGlmaWFibGUKLQkJLy8KLQkJSVN0YXR1cyBzdGF0dXMgPSBVc2VySW50ZXJhY3Rpb25IZWxwZXIuY2hlY2tNb2RpZnkobW9kaWZpZWRSZXNvdXJjZXMsCi0JCQkJTGlicmFyeUVkaXRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldENvbnRleHQoKSk7Ci0JCWlmICghc3RhdHVzLmlzT0soKSkgewotCQkJTWVzc2VuZ2VyLklOU1RBTkNFLnNob3dFcnJvcigKLQkJCQkJTGlicmFyeUVkaXRSZXNvdXJjZXMuZGVsZXRlRGlhbG9nX3RpdGxlLAotCQkJCQlMaWJyYXJ5RWRpdFJlc291cmNlcy5kZWxldGVFbGVtZW50RXJyb3JfbXNnLCBzdGF0dXMpOwotCi0JCQl1bmRvKCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCXJ1bm5hYmxlID0gbmV3IElSdW5uYWJsZVdpdGhQcm9ncmVzcygpIHsKLQotCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLQkJCQkJdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJCQltb25pdG9yLmJlZ2luVGFzaygiIiwgMyk7IC8vJE5PTi1OTFMtMSQKLQkJCQlnZXRQZXJzaXN0ZXIoKTsKLQotCQkJCS8vIHNhdmUgcmVzb3VyY2VzIHRoYXQgaGFkIGJlZW4gY2hhbmdlZCBhZnRlciByZWZlcmVuY2VzIHRvIHRoZQotCQkJCS8vIGRlbGV0ZWQgZWxlbWVudHMKLQkJCQkvLyBoYWQgYmVlbiByZW1vdmVkCi0JCQkJLy8KLQkJCQl0cnkgewotCQkJCQltb25pdG9yCi0JCQkJCQkJLnN1YlRhc2soTGlicmFyeUVkaXRSZXNvdXJjZXMuZGVsZXRpbmdFbGVtZW50c1Rhc2tfbmFtZSk7Ci0JCQkJCW1vbml0b3Iud29ya2VkKDEpOwotCQkJCQlkZWxldGVDb250ZW50KCk7Ci0KLQkJCQkJLy8gc2F2ZSBtb2RpZmllZCByZXNvdXJjZXMKLQkJCQkJLy8KLQkJCQkJbW9uaXRvci5zdWJUYXNrKExpYnJhcnlFZGl0UmVzb3VyY2VzLnNhdmluZ1Jlc291cmNlc19tc2cpOwotCQkJCQltb25pdG9yLndvcmtlZCgxKTsKLQkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gbW9kaWZpZWRSZXNvdXJjZXMuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlSZXNvdXJjZSByZXNvdXJjZSA9IChSZXNvdXJjZSkgaXRlci5uZXh0KCk7Ci0JCQkJCQlpZiAocmVzb3VyY2UuaXNMb2FkZWQoKSkgewotCQkJCQkJCXBlcnNpc3Rlci5zYXZlKHJlc291cmNlKTsKLQkJCQkJCX0KLQkJCQkJfQotCi0JCQkJCXBlcnNpc3Rlci5jb21taXQoKTsKLQotCQkJCQlleGVjdXRlZCA9IHRydWU7Ci0KLQkJCQkJcmVtb3ZlQWRhcHRlcnMoKTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQlMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5sb2coZSk7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlwZXJzaXN0ZXIucm9sbGJhY2soKTsKLQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCQlmYWlsZWQgPSB0cnVlOwotCQkJCQl9Ci0JCQkJCWlmIChlIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgewotCQkJCQkJdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pIGU7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQl0aHJvdyBuZXcgV3JhcHBlZEV4Y2VwdGlvbihlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQl9OwotCi0JCS8vIGlmICghVXNlckludGVyYWN0aW9uSGVscGVyLnJ1bldpdGhQcm9ncmVzcyhydW5uYWJsZSwKLQkJLy8gTGlicmFyeUVkaXRSZXNvdXJjZXMuZGVsZXRpbmdFbGVtZW50c1Rhc2tfbmFtZSkpIHsgLy8kTk9OLU5MUy0xJAotCQkvLyBpZiAoZmFpbGVkKSB7Ci0JCS8vIG5vdGlmeUZhaWx1cmUoKTsKLQkJLy8gfSBlbHNlIHsKLQkJLy8gdW5kbygpOwotCQkvLyB9Ci0JCS8vIHJldHVybjsKLQkJLy8gfQotCi0vLwkJVXNlckludGVyYWN0aW9uSGVscGVyLnJ1bkluVUkocnVubmFibGUsIChTaGVsbCkgbnVsbCk7Ci0JCQotCQlVc2VySW50ZXJhY3Rpb25IZWxwZXIucnVuV2l0aFByb2dyZXNzKHJ1bm5hYmxlLCBMaWJyYXJ5RWRpdFJlc291cmNlcy5kZWxldGluZ0VsZW1lbnRzVGFza19uYW1lKTsKLQotCQlpZiAoZXhlY3V0ZWQpIHsKLQkJCXRyeSB7Ci0JCQkJTGlzdCB3YXJuaW5ncyA9IHBlcnNpc3Rlci5nZXRXYXJuaW5ncygpOwotCQkJCWlmICghd2FybmluZ3MuaXNFbXB0eSgpKSB7Ci0JCQkJCVN0cmluZyB0aXRsZSA9IExpYnJhcnlFZGl0UmVzb3VyY2VzLmRlbGV0ZURpYWxvZ190aXRsZTsKLQkJCQkJU3RyaW5nIG1zZyA9IExpYnJhcnlFZGl0UmVzb3VyY2VzLkRlbGV0ZU1ldGhvZEVsZW1lbnRDb21tYW5kX3dhcm5pbmdNc2c7Ci0JCQkJCVN0cmluZ0J1ZmZlciByZWFzb24gPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHdhcm5pbmdzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQkJRXhjZXB0aW9uIGUgPSAoRXhjZXB0aW9uKSBpdGVyLm5leHQoKTsKLQkJCQkJCVN0cmluZyBzdHIgPSBlLmdldE1lc3NhZ2UoKTsKLQkJCQkJCWlmICghU3RyVXRpbC5pc0JsYW5rKHN0cikpIHsKLQkJCQkJCQlyZWFzb24uYXBwZW5kKHN0cikuYXBwZW5kKCdcbicpOwotCQkJCQkJfQotCQkJCQl9Ci0KLQkJCQkJTWVzc2VuZ2VyLklOU1RBTkNFLnNob3dXYXJuaW5nKHRpdGxlLCBtc2csIHJlYXNvbgotCQkJCQkJCS50b1N0cmluZygpKTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCUxpYnJhcnlFZGl0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCX0KLQkJCQotCQkJbm90aWZ5RXhlY3V0ZWQoKTsKLQkJfSBlbHNlIHsKLQkJCWlmIChmYWlsZWQpIHsKLQkJCQlub3RpZnlGYWlsdXJlKCk7Ci0JCQl9IGVsc2UgewotCQkJCXVuZG8oKTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBjb25maXJtUmVtb3ZpbmdSZWZlcmVuY2VzKCkgewotCQlpZiAoIWVsZW1lbnRUb1JlbW92ZWRSZWZzTWFwLmlzRW1wdHkoKSkgewotCQkJLy8gY29sbGVjdCBzZXQgb2YgcmVmZXJlbmNlcnMKLQkJCUhhc2hTZXQ8RU9iamVjdD4gcmVmZXJlbmNlcnMgPSBuZXcgSGFzaFNldDxFT2JqZWN0PigpOwotCQkJZm9yIChNYXA8RU9iamVjdCwgQ29sbGVjdGlvbjxFU3RydWN0dXJhbEZlYXR1cmU+PiByZWZlcmVuY2VyVG9GZWF0dXJlc01hcCA6IGVsZW1lbnRUb1JlbW92ZWRSZWZzTWFwLnZhbHVlcygpKSB7Ci0JCQkJLy8gY29sbGVjdCBvbmx5IHJlZmVyZW5jZXIgd2l0aCBhbiB1bmlkaXJlY3Rpb25hbCBvciBjb250YWlubWVudAotCQkJCS8vIHJlbGF0aW9uc2hpcAotCQkJCS8vCi0JCQkJZm9yIChNYXAuRW50cnk8RU9iamVjdCwgQ29sbGVjdGlvbjxFU3RydWN0dXJhbEZlYXR1cmU+PiBlbnRyeSA6IHJlZmVyZW5jZXJUb0ZlYXR1cmVzTWFwLmVudHJ5U2V0KCkpIHsKLQkJCQkJQ29sbGVjdGlvbjxFU3RydWN0dXJhbEZlYXR1cmU+IGZlYXR1cmVzID0gZW50cnkuZ2V0VmFsdWUoKTsKLQkJCQkJYm9vbGVhbiBjYW5Db2xsZWN0ID0gZmFsc2U7Ci0JCQkJCWJvb2xlYW4gaGFzRGVzY3JpcHRvciA9IGZhbHNlOwotCQkJCQljaGVja19yZWY6IGZvciAoRVN0cnVjdHVyYWxGZWF0dXJlIGYgOiBmZWF0dXJlcykgewotCQkJCQkJaWYgKCFjYW5Db2xsZWN0ICYmIGYgaW5zdGFuY2VvZiBFUmVmZXJlbmNlKSB7Ci0JCQkJCQkJRVJlZmVyZW5jZSByZWYgPSAoRVJlZmVyZW5jZSkgZjsKLQkJCQkJCQlpZiAocmVmLmlzQ29udGFpbm1lbnQoKQotCQkJCQkJCQkJfHwgcmVmLmdldEVPcHBvc2l0ZSgpID09IG51bGwpIHsKLQkJCQkJCQkJY2FuQ29sbGVjdCA9IHRydWU7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJaWYoIWhhc0Rlc2NyaXB0b3IgJiYgKGYgPT0gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza0Rlc2NyaXB0b3JfVGFzaygpCi0JCQkJCQkJCXx8IGYgPT0gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Um9sZURlc2NyaXB0b3JfUm9sZSgpCi0JCQkJCQkJCXx8IGYgPT0gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX1dvcmtQcm9kdWN0KCkpKSB7Ci0JCQkJCQkJaGFzRGVzY3JpcHRvciA9IHRydWU7Ci0JCQkJCQl9Ci0JCQkJCQlpZihjYW5Db2xsZWN0ICYmIGhhc0Rlc2NyaXB0b3IpIHsKLQkJCQkJCQlicmVhayBjaGVja19yZWY7CQkJCQkJCQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWlmIChjYW5Db2xsZWN0KSB7Ci0JCQkJCQlyZWZlcmVuY2Vycy5hZGQoZW50cnkuZ2V0S2V5KCkpOwotCQkJCQl9Ci0JCQkJCWlmKGhhc0Rlc2NyaXB0b3IgJiYgZW50cnkuZ2V0S2V5KCkgaW5zdGFuY2VvZiBEZXNjcmlwdG9yKSB7Ci0JCQkJCQlkZXNjcmlwdG9ycy5hZGQoKERlc2NyaXB0b3IpIGVudHJ5LmdldEtleSgpKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJLy8gY29uZmlybSB3aXRoIHVzZXIgYmVmb3JlIHJlbW92aW5nIGlsbGVnYWwgcmVmZXJlbmNlcwotCQkJLy8KLQkJCWlmIChjb25maXJtUmVtb3ZlUmVmZXJlbmNlcykgewkJCQkKLQkJCQlNdWx0aVN0YXR1cyBtdWx0aVN0YXR1cyA9IG5ldyBNdWx0aVN0YXR1cygKLQkJCQkJCUxpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldFN5bWJvbGljTmFtZSgpLCAwLAotCQkJCQkJIiIsIG51bGwpOyAvLyROT04tTkxTLTEkCi0JCQkJCi0JCQkJaWYoIWRlc2NyaXB0b3JzLmlzRW1wdHkoKSkgewotCQkJCQkvLyBhc2sgdXNlciB0byBkZWxldGUgdGhlIGRlc2NyaXB0b3JzIHRoYXQgYXJlIGFzc29jaWF0ZWQKLQkJCQkJLy8gd2l0aCB0aGUgY29udGVudCBlbGVtZW50IHRvIGJlIGRlbGV0ZWQKLQkJCQkJLy8KLQkJCQkJZm9yIChFT2JqZWN0IGUgOiBkZXNjcmlwdG9ycykgewotCQkJCQkJU3RyaW5nIG1zZyA9IE5MUy5iaW5kKAotCQkJCQkJCQlMaWJyYXJ5RWRpdFJlc291cmNlcy5lbGVtZW50VHlwZV90ZXh0LCBUbmdVdGlsLmdldFR5cGVUZXh0KGUpLCBUbmdVdGlsCi0JCQkJCQkJCQkJLmdldExhYmVsV2l0aFBhdGgoZSkpOwotCQkJCQkJSVN0YXR1cyBzdGF0dXMgPSBuZXcgU3RhdHVzKElTdGF0dXMuSU5GTywKLQkJCQkJCQkJTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0U3ltYm9saWNOYW1lKCksCi0JCQkJCQkJCTAsIG1zZywgbnVsbCk7Ci0JCQkJCQltdWx0aVN0YXR1cy5hZGQoc3RhdHVzKTsKLQkJCQkJfQotCQkJCQlJVXNlckludGVyYWN0aW9uSGFuZGxlciB1aUhhbmRsZXIgPSBFeHRlbnNpb25NYW5hZ2VyCi0JCQkJCQkJLmdldERlZmF1bHRVc2VySW50ZXJhY3Rpb25IYW5kbGVyKCk7Ci0JCQkJCWlmICh1aUhhbmRsZXIgIT0gbnVsbCkgewotCQkJCQkJc3dpdGNoICh1aUhhbmRsZXIKLQkJCQkJCQkJLnNlbGVjdE9uZSgKLQkJCQkJCQkJCQluZXcgaW50W10gewotCQkJCQkJCQkJCQkJSVVzZXJJbnRlcmFjdGlvbkhhbmRsZXIuQUNUSU9OX1lFUywKLQkJCQkJCQkJCQkJCUlVc2VySW50ZXJhY3Rpb25IYW5kbGVyLkFDVElPTl9OTywKLQkJCQkJCQkJCQkJCUlVc2VySW50ZXJhY3Rpb25IYW5kbGVyLkFDVElPTl9DQU5DRUwgfSwKLQkJCQkJCQkJCQlMaWJyYXJ5RWRpdFJlc291cmNlcy5jb25maXJtRGVzY3JpcHRvcnNEZWxldGlvbl90aXRsZSwKLQkJCQkJCQkJCQlMaWJyYXJ5RWRpdFJlc291cmNlcy5jb25maXJtRGVzY3JpcHRvcnNEZWxldGlvbl9tc2csCi0JCQkJCQkJCQkJbXVsdGlTdGF0dXMpKSB7Ci0JCQkJCQljYXNlIElVc2VySW50ZXJhY3Rpb25IYW5kbGVyLkFDVElPTl9DQU5DRUw6Ci0JCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQkJY2FzZSBJVXNlckludGVyYWN0aW9uSGFuZGxlci5BQ1RJT05fTk86Ci0JCQkJCQkJZGVzY3JpcHRvcnMuY2xlYXIoKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQkKLQkJCQlpZighZGVzY3JpcHRvcnMuaXNFbXB0eSgpKSB7Ci0JCQkJCS8vIHJlbW92ZSB0aGUgZGVzY3JpcHRvcnMgdGhhdCB1c2VyIHdhbnRlZCB0byBkZWxldGUgZnJvbSB0aGUgcmVmZXJlbmNlcnMKLQkJCQkJLy8KLQkJCQkJcmVmZXJlbmNlcnMucmVtb3ZlQWxsKGRlc2NyaXB0b3JzKTsKLQkJCQl9Ci0JCQkJbXVsdGlTdGF0dXMgPSBuZXcgTXVsdGlTdGF0dXMoCi0JCQkJCQlMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRTeW1ib2xpY05hbWUoKSwgMCwKLQkJCQkJCSIiLCBudWxsKTsgLy8kTk9OLU5MUy0xJAotCQkJCWZvciAoRU9iamVjdCBlIDogcmVmZXJlbmNlcnMpIHsKLQkJCQkJLy8gZG9uJ3Qgc2hvdyBwcmVkZWZpbmVkIGVsZW1lbnQKLQkJCQkJLy8KLQkJCQkJaWYgKCEoZSBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQgJiYgVG5nVXRpbC5pc1ByZWRlZmluZWQoKE1ldGhvZEVsZW1lbnQpIGUpKSkgewotCQkJCQkJU3RyaW5nIG1zZyA9IE5MUy5iaW5kKAotCQkJCQkJCQlMaWJyYXJ5RWRpdFJlc291cmNlcy5lbGVtZW50VHlwZV90ZXh0LCBUbmdVdGlsLmdldFR5cGVUZXh0KGUpLCBUbmdVdGlsCi0JCQkJCQkJCQkJLmdldExhYmVsV2l0aFBhdGgoZSkpOwotCQkJCQkJSVN0YXR1cyBzdGF0dXMgPSBuZXcgU3RhdHVzKElTdGF0dXMuSU5GTywKLQkJCQkJCQkJTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0U3ltYm9saWNOYW1lKCksCi0JCQkJCQkJCTAsIG1zZywgbnVsbCk7Ci0JCQkJCQltdWx0aVN0YXR1cy5hZGQoc3RhdHVzKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAobXVsdGlTdGF0dXMuZ2V0Q2hpbGRyZW4oKS5sZW5ndGggPiAwKSB7Ci0JCQkJCUlVc2VySW50ZXJhY3Rpb25IYW5kbGVyIHVpSGFuZGxlciA9IEV4dGVuc2lvbk1hbmFnZXIKLQkJCQkJCQkuZ2V0RGVmYXVsdFVzZXJJbnRlcmFjdGlvbkhhbmRsZXIoKTsKLQkJCQkJaWYgKHVpSGFuZGxlciAhPSBudWxsKSB7Ci0JCQkJCQlpZiAodWlIYW5kbGVyCi0JCQkJCQkJCS5zZWxlY3RPbmUoCi0JCQkJCQkJCQkJbmV3IGludFtdIHsKLQkJCQkJCQkJCQkJCUlVc2VySW50ZXJhY3Rpb25IYW5kbGVyLkFDVElPTl9PSywKLQkJCQkJCQkJCQkJCUlVc2VySW50ZXJhY3Rpb25IYW5kbGVyLkFDVElPTl9DQU5DRUwgfSwKLQkJCQkJCQkJCQlMaWJyYXJ5RWRpdFJlc291cmNlcy5kZWxldGVSZWZlcmVuY2VzRGlhbG9nX3RpdGxlLAotCQkJCQkJCQkJCUxpYnJhcnlFZGl0UmVzb3VyY2VzLmRlbGV0ZVJlZmVyZW5jZXNEaWFsb2dfdGV4dCwgbXVsdGlTdGF0dXMpID09IElVc2VySW50ZXJhY3Rpb25IYW5kbGVyLkFDVElPTl9DQU5DRUwpIHsKLQkJCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCS8vIGNoZWNrIGlmIHRoZSByZWZlcmVuY2VycyBjYW4gYmUgY2hhbmdlZAotCQkJLy8KLQkJCWZvciAoRU9iamVjdCBlIDogcmVmZXJlbmNlcnMpIHsKLQkJCQlJU3RhdHVzIHN0YXR1cyA9IFVzZXJJbnRlcmFjdGlvbkhlbHBlci5jaGVja01vZGlmeShlLCBMaWJyYXJ5RWRpdFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0Q29udGV4dCgpKTsKLQkJCQlpZiAoIXN0YXR1cy5pc09LKCkpIHsKLQkJCQkJTWVzc2VuZ2VyLklOU1RBTkNFCi0JCQkJCQkJLnNob3dFcnJvcigKLQkJCQkJCQkJCUxpYnJhcnlFZGl0UmVzb3VyY2VzLmRlbGV0ZURpYWxvZ190aXRsZSwKLQkJCQkJCQkJCUxpYnJhcnlFZGl0UmVzb3VyY2VzLmRlbGV0ZUVsZW1lbnRFcnJvcl9tc2csCi0JCQkJCQkJCQlzdGF0dXMpOwotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBEaXNwb3NlcyBhbGwgc3RhdGVmdWwgYWRhcHRlcnMsIHRoZW4gcmVtb3ZlcyBhbGwgYWRhcHRlcnMgdGhhdCBhcmUKLQkgKiBhdHRhY2hlZCB0byB0aGUgZ2l2ZW4gZWxlbWVudAotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgcmVtb3ZlQWRhcHRlcnMoRU9iamVjdCBlbGVtZW50KSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBuZXcgQXJyYXlMaXN0KGVsZW1lbnQuZUFkYXB0ZXJzKCkpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBhZGFwdGVyID0gaXRlcmF0b3IubmV4dCgpOwotCQkJaWYgKGFkYXB0ZXIgaW5zdGFuY2VvZiBJU3RhdGVmdWxJdGVtUHJvdmlkZXIpIHsKLQkJCQkoKElTdGF0ZWZ1bEl0ZW1Qcm92aWRlcikgYWRhcHRlcikuZGlzcG9zZSgpOwotCQkJCWlmIChhZGFwdGVyIGluc3RhbmNlb2YgSXRlbVByb3ZpZGVyQWRhcHRlcikgewotCQkJCQlBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSA9ICgoSXRlbVByb3ZpZGVyQWRhcHRlcikgYWRhcHRlcikKLQkJCQkJCQkuZ2V0QWRhcHRlckZhY3RvcnkoKTsKLQkJCQkJaWYgKGFkYXB0ZXJGYWN0b3J5IGluc3RhbmNlb2YgSVJlZmVyZW5jZXIpIHsKLQkJCQkJCSgoSVJlZmVyZW5jZXIpIGFkYXB0ZXJGYWN0b3J5KS5yZW1vdmUoYWRhcHRlcik7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZWxlbWVudC5lQWRhcHRlcnMoKS5jbGVhcigpOwotCX0KLQotCS8qKgotCSAqIERpc3Bvc2VzIGFsbCBzdGF0ZWZ1bCBhZGFwdGVycywgdGhlbiByZW1vdmVzIGFsbCBhZGFwdGVycyB0aGF0IGFyZQotCSAqIGF0dGFjaGVkIHRvIHRoZSBkZWxldGVkIGVsZW1lbnRzCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlQWRhcHRlcnMoKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGVsZW1lbnRzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IG9iaiA9IFRuZ1V0aWwudW53cmFwKGl0ZXIubmV4dCgpKTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBFT2JqZWN0KSB7Ci0JCQkJRU9iamVjdCBlbGVtZW50ID0gKEVPYmplY3QpIG9iajsKLQkJCQlpZiAoZWxlbWVudC5lQ29udGFpbmVyKCkgPT0gbnVsbCkgewotCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gZWxlbWVudC5lQWxsQ29udGVudHMoKTsgaXRlcmF0b3IKLQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJRU9iamVjdCBlID0gKEVPYmplY3QpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJCXJlbW92ZUFkYXB0ZXJzKGUpOwotCQkJCQl9Ci0JCQkJCXJlbW92ZUFkYXB0ZXJzKGVsZW1lbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgdm9pZCBub3RpZnlGYWlsdXJlKCkgewotCQlFdmVudE9iamVjdCBldmVudE9iamVjdCA9IG5ldyBFdmVudE9iamVjdCh0aGlzKTsKLQotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjb21tYW5kTGlzdGVuZXJzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJQ29tbWFuZExpc3RlbmVyIGxpc3RlbmVyID0gKENvbW1hbmRMaXN0ZW5lcikgaXRlci5uZXh0KCk7Ci0JCQlsaXN0ZW5lci5ub3RpZnlGYWlsdXJlKGV2ZW50T2JqZWN0KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEByZXR1cm4KLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgRmFpbFNhZmVNZXRob2RMaWJyYXJ5UGVyc2lzdGVyIGdldFBlcnNpc3RlcigpIHsKLQkJaWYgKHBlcnNpc3RlciA9PSBudWxsKSB7Ci0JCQlwZXJzaXN0ZXIgPSBTZXJ2aWNlcy5nZXREZWZhdWx0TGlicmFyeVBlcnNpc3RlcigpCi0JCQkJCS5nZXRGYWlsU2FmZVBlcnNpc3RlcigpOwotCQl9Ci0JCXJldHVybiBwZXJzaXN0ZXI7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIG5vdGlmeUV4ZWN1dGVkKCkgewotCQlFdmVudE9iamVjdCBldmVudE9iamVjdCA9IG5ldyBFdmVudE9iamVjdCh0aGlzKTsKLQotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB0aGlzLmNvbW1hbmRMaXN0ZW5lcnMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlDb21tYW5kTGlzdGVuZXIgbGlzdGVuZXIgPSAoQ29tbWFuZExpc3RlbmVyKSBpdGVyLm5leHQoKTsKLQkJCWxpc3RlbmVyLm5vdGlmeUV4ZWN1dGVkKGV2ZW50T2JqZWN0KTsKLQkJfQotCi0JCUxpc3QgY29tbWFuZExpc3RlbmVycyA9IFByb3ZpZGVycwotCQkJCS5nZXRDb21tYW5kTGlzdGVuZXJzKERlbGV0ZU1ldGhvZEVsZW1lbnRDb21tYW5kLmNsYXNzKTsKLQkJaWYgKGNvbW1hbmRMaXN0ZW5lcnMgIT0gbnVsbCAmJiAhY29tbWFuZExpc3RlbmVycy5pc0VtcHR5KCkpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGNvbW1hbmRMaXN0ZW5lcnMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJSUNvbW1hbmRMaXN0ZW5lciBjbWRMaXN0ZW5lciA9IChJQ29tbWFuZExpc3RlbmVyKSBpdGVyLm5leHQoKTsKLQkJCQl0cnkgewotCQkJCQljbWRMaXN0ZW5lci5ub3RpZnlFeGVjdXRlZCh0aGlzKTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQlMaWJyYXJ5RWRpdFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uIGdldFJlZmVyZW5jaW5nUmVzb3VyY2VzKCkgewotCQlIYXNoU2V0IHJlZmVycmVycyA9IG5ldyBIYXNoU2V0KCk7Ci0KLQkJLy8gZm9yIChJdGVyYXRvciBpdGVyID0gcmVtb3ZlZFJlZmVyZW5jZXNNYXAudmFsdWVzKCkuaXRlcmF0b3IoKTsKLQkJLy8gaXRlci5oYXNOZXh0KCk7KSB7Ci0JCS8vIE1hcCByZWZlcnJlclRvRmVhdHVyZXNNYXAgPSAoTWFwKSBpdGVyLm5leHQoKTsKLQkJLy8gcmVmZXJyZXJzLmFkZEFsbChyZWZlcnJlclRvRmVhdHVyZXNNYXAua2V5U2V0KCkpOwotCQkvLyB9Ci0KLQkJZm9yIChJdGVyYXRvciBpdGVyID0gcmVtb3ZlZFJlZmVyZW5jZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlSZWZlcmVuY2UgcmVmID0gKFJlZmVyZW5jZSkgaXRlci5uZXh0KCk7Ci0JCQlyZWZlcnJlcnMuYWRkKHJlZi5vd25lcik7Ci0JCX0KLQotCQlIYXNoU2V0IHJlc291cmNlcyA9IG5ldyBIYXNoU2V0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHJlZmVycmVycy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU1ldGhvZEVsZW1lbnQgZWxlbWVudCA9IChNZXRob2RFbGVtZW50KSBpdGVyLm5leHQoKTsKLQkJCWlmIChlbGVtZW50LmVSZXNvdXJjZSgpICE9IG51bGwpIHsKLQkJCQlyZXNvdXJjZXMuYWRkKGVsZW1lbnQuZVJlc291cmNlKCkpOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXNvdXJjZXM7Ci0JfQotCi0JLyoqCi0JICogQ29sbGVjdHMgb3duZXIgcmVzb3VyY2VzIG9mIHRoZSBlbGVtZW50cyB0byBiZSBkZWxldGVkIHRvIHNhdmUgbGF0ZXIuCi0JICogCi0JICogQHBhcmFtIHJlc291cmNlcwotCSAqLwotCXByaXZhdGUgdm9pZCBjb2xsZWN0T3duZXJSZXNvdXJjZXMoU2V0IHJlc291cmNlcywgU2V0IHVubW9kaWZpZWRSZXNvdXJjZXMpIHsKLQkJSUxpYnJhcnlQZXJzaXN0ZXIgcGVyc2lzdGVyID0gU2VydmljZXMuZ2V0RGVmYXVsdExpYnJhcnlQZXJzaXN0ZXIoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZWxlbWVudHMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZWxlbWVudCA9IFRuZ1V0aWwudW53cmFwKGl0ZXIubmV4dCgpKTsKLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJCUVPYmplY3QgY29udGFpbmVyID0gKChNZXRob2RFbGVtZW50KSBlbGVtZW50KS5lQ29udGFpbmVyKCk7Ci0JCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSBjb250YWluZXIuZVJlc291cmNlKCk7Ci0JCQkJaWYgKHJlc291cmNlICE9IG51bGwpIHsKLQkJCQkJaWYgKHBlcnNpc3Rlci5oYXNPd25SZXNvdXJjZVdpdGhvdXRSZWZlcnJlcihlbGVtZW50KSkgewotCQkJCQkJdW5tb2RpZmllZFJlc291cmNlcy5hZGQocmVzb3VyY2UpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJcmVzb3VyY2VzLmFkZChyZXNvdXJjZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBjb2xsZWN0UmVzb3VyY2VzKFNldCByZXNvdXJjZXMsIENvbGxlY3Rpb24gb2JqZWN0cykgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBvYmplY3RzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGVsZW1lbnQgPSBUbmdVdGlsLnVud3JhcChpdGVyLm5leHQoKSk7Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEVPYmplY3QpIHsKLQkJCQlFT2JqZWN0IGVPYmogPSAoTWV0aG9kRWxlbWVudCkgZWxlbWVudDsKLQkJCQlpZiAoZU9iai5lUmVzb3VyY2UoKSAhPSBudWxsKSB7Ci0JCQkJCXJlc291cmNlcy5hZGQoZU9iai5lUmVzb3VyY2UoKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgcmVkbygpIHsKLQotCQlzdXBlci5yZWRvKCk7Ci0JCXJlbW92ZVJlZmVyZW5jZXMoKTsKLQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGRlbGV0ZUNvbnRlbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJTGlzdDxNZXRob2RFbGVtZW50PiB0b0RlbGV0ZUxpc3QgPSBuZXcgQXJyYXlMaXN0PE1ldGhvZEVsZW1lbnQ+KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGVsZW1lbnRzVG9EZWxldGVDb250ZW50Lml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGVsZW1lbnQgPSBUbmdVdGlsLnVud3JhcChpdGVyLm5leHQoKSk7Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCQlNZXRob2RFbGVtZW50IGUgPSAoTWV0aG9kRWxlbWVudCkgZWxlbWVudDsKLQkJCQlpZiAoZS5lQ29udGFpbmVyKCkgPT0gbnVsbCkgewotCQkJCQl0b0RlbGV0ZUxpc3QuYWRkKGUpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlwZXJzaXN0ZXIuZGVsZXRlKHRvRGVsZXRlTGlzdCk7Ci0JfQotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0RWxlbWVudHNUb1JlbW92ZVJlZmVyZW5jZXMoKSB7Ci0JCUNvbGxlY3Rpb24gbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZWxlbWVudHMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZWxlbWVudCA9IFRuZ1V0aWwudW53cmFwKGl0ZXIubmV4dCgpKTsKLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgRU9iamVjdAotCQkJCQkmJiB3aWxsUmVtb3ZlRWxlbWVudEZyb21Db250YWluZXIoKEVPYmplY3QpIGVsZW1lbnQpKSB7Ci0JCQkJbGlzdC5hZGQoZWxlbWVudCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGxpc3Q7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gY2FuUmVtb3ZlUmVmZXJlbmNlcyhNZXRob2RFbGVtZW50IGUpIHsKLQkJLy8gaWYgZSBpcyBvbmUgb2YgdGhlIGRlbGV0ZWQgZWxlbWVudHMsIG1ha2Ugc3VyZSB0aGF0IGl0IGFjdHVhbGx5IGdvdAotCQkvLyBkZWxldGVkIGJ5IGNoZWNraW5nIGl0cyBjb250YWluZXIKLQkJLy8KLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZWxlbWVudHMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3Qgb2JqID0gVG5nVXRpbC51bndyYXAoaXRlci5uZXh0KCkpOwotCQkJaWYgKGUgPT0gb2JqKSB7Ci0JCQkJcmV0dXJuIGUuZUNvbnRhaW5lcigpID09IG51bGw7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogTG9hZHMgYWxsIG9wcG9zaXRlIGZlYXR1cmVzIG9mIHRoZSBlbGVtZW50cyB0byBiZSBkZWxldGVkCi0JICogCi0JICogQHJldHVybiBsaXN0IG9mIGVsZW1lbnRzIHdob3NlIG9wcG9zaXRlIGZlYXR1cmVzIGFyZSBsb2FkZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBsb2FkT3Bwb3NpdGVGZWF0dXJlcygpIHsKLQkJSGFzaFNldCBvcHBvc2l0ZUZlYXR1cmVzID0gbmV3IEhhc2hTZXQoKTsKLQkJSGFzaFNldCBkZWxldGVkR1VJRHMgPSBuZXcgSGFzaFNldCgpOwotCQlBcnJheUxpc3QgZWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZ2V0RWxlbWVudHNUb1JlbW92ZVJlZmVyZW5jZXMoKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBvYmogPSBpdGVyLm5leHQoKTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQkJTWV0aG9kRWxlbWVudCBlID0gKE1ldGhvZEVsZW1lbnQpIG9iajsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gZS5lQWxsQ29udGVudHMoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJCQlPYmplY3QgZWxlbWVudCA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQkJCQllbGVtZW50cy5hZGQoZWxlbWVudCk7Ci0JCQkJCQlNYXAgb3Bwb3NpdGVGZWF0dXJlTWFwID0gKChNdWx0aVJlc291cmNlRU9iamVjdCkgZWxlbWVudCkKLQkJCQkJCQkJLmdldE9wcG9zaXRlRmVhdHVyZU1hcCgpOwotCQkJCQkJaWYgKG9wcG9zaXRlRmVhdHVyZU1hcCAhPSBudWxsCi0JCQkJCQkJCSYmICFvcHBvc2l0ZUZlYXR1cmVNYXAuaXNFbXB0eSgpKSB7Ci0JCQkJCQkJb3Bwb3NpdGVGZWF0dXJlcwotCQkJCQkJCQkJLmFkZEFsbChvcHBvc2l0ZUZlYXR1cmVNYXAua2V5U2V0KCkpOwotCQkJCQkJCWRlbGV0ZWRHVUlEcy5hZGQoKChNZXRob2RFbGVtZW50KSBlbGVtZW50KQotCQkJCQkJCQkJLmdldEd1aWQoKSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxlbWVudHMuYWRkKGUpOwotCQkJCU1hcCBvcHBvc2l0ZUZlYXR1cmVNYXAgPSAoKE11bHRpUmVzb3VyY2VFT2JqZWN0KSBlKQotCQkJCQkJLmdldE9wcG9zaXRlRmVhdHVyZU1hcCgpOwotCQkJCWlmIChvcHBvc2l0ZUZlYXR1cmVNYXAgIT0gbnVsbCAmJiAhb3Bwb3NpdGVGZWF0dXJlTWFwLmlzRW1wdHkoKSkgewotCQkJCQlvcHBvc2l0ZUZlYXR1cmVzLmFkZEFsbChvcHBvc2l0ZUZlYXR1cmVNYXAua2V5U2V0KCkpOwotCQkJCQlkZWxldGVkR1VJRHMuYWRkKCgoTWV0aG9kRWxlbWVudCkgZSkuZ2V0R3VpZCgpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlsb2FkT3Bwb3NpdGVGZWF0dXJlcyhuZXcgQXJyYXlMaXN0KG9wcG9zaXRlRmVhdHVyZXMpLCBkZWxldGVkR1VJRHMpOwotCi0JCXJldHVybiBlbGVtZW50czsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNDb250YWluZWRCeURlbGV0ZWRFbGVtZW50KEVPYmplY3QgZSkgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBlbGVtZW50cy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBkZWxldGVkID0gVG5nVXRpbC51bndyYXAoaXRlci5uZXh0KCkpOwotCQkJaWYgKGRlbGV0ZWQgaW5zdGFuY2VvZiBFT2JqZWN0ICYmIFVtYVV0aWwuaXNDb250YWluZWRCeShlLCBkZWxldGVkKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBDb2xsZWN0cyBvYmplY3RzIHRoYXQgc2hvdWxkIGJlIHJlbW92ZWQgaWYgPGNvZGU+ZWxlbWVudFRvRGVsZXRlPC9jb2RlPgotCSAqIHdpbGwgYmUgcmVtb3ZlZCBmcm9tIDxjb2RlPnJlZmVyZW5jZXM8L2NvZGU+IG9mIDxjb2RlPnJlZmVyZW5jZXI8L2NvZGU+LgotCSAqIAotCSAqIEBwYXJhbSBvYmplY3RzVG9SZW1vdmUKLQkgKiAgICAgICAgICAgIG91dHB1dAotCSAqIEBwYXJhbSByZWZlcmVuY2VyCi0JICogICAgICAgICAgICBlbGVtZW50IHRoYXQgcmVmZXJlbmNlcyB0byBlbGVtZW50VG9EZWxldGUKLQkgKiBAcGFyYW0gcmVmZXJlbmNlcwotCSAqICAgICAgICAgICAgY29sbGVjdGlvbiBvZiB7QGxpbmsgRVJlZmVyZW5jZX0gdGhhdCBjb250YWlucyBlbGVtZW50VG9EZWxldGUKLQkgKiBAcmV0dXJuIHRydWUgaWYgb25lIG9mIHRoZSBjb2xsZWN0ZWQgb2JqZWN0cyBpcyB0aGUKLQkgKiAgICAgICAgIDxjb2RlPnJlZmVyZW5jZXI8L2NvZGU+IG9yIHRoZSBjb250YWluZXIgb2YKLQkgKiAgICAgICAgIDxjb2RlPnJlZmVyZW5jZXI8L2NvZGU+Ci0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gY29sbGVjdE9iamVjdHNUb1JlbW92ZShDb2xsZWN0aW9uIG9iamVjdHNUb1JlbW92ZSwKLQkJCUVPYmplY3QgZWxlbWVudFRvRGVsZXRlLCBFT2JqZWN0IHJlZmVyZW5jZXIsIENvbGxlY3Rpb24gcmVmZXJlbmNlcykgewotCQlib29sZWFuIHJldCA9IGZhbHNlOwotCQlMaXN0IGNvbW1hbmRMaXN0ZW5lcnMgPSBQcm92aWRlcnMKLQkJCQkuZ2V0Q29tbWFuZExpc3RlbmVycyhEZWxldGVNZXRob2RFbGVtZW50Q29tbWFuZC5jbGFzcyk7Ci0JCWlmIChjb21tYW5kTGlzdGVuZXJzICE9IG51bGwgJiYgIWNvbW1hbmRMaXN0ZW5lcnMuaXNFbXB0eSgpKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjb21tYW5kTGlzdGVuZXJzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBjbWRMaXN0ZW5lciA9IGl0ZXIubmV4dCgpOwotCQkJCWlmIChjbWRMaXN0ZW5lciBpbnN0YW5jZW9mIElEZWxldGVNZXRob2RFbGVtZW50Q29tbWFuZExpc3RlbmVyKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlib29sZWFuIGIgPSAoKElEZWxldGVNZXRob2RFbGVtZW50Q29tbWFuZExpc3RlbmVyKSBjbWRMaXN0ZW5lcikKLQkJCQkJCQkJLmNvbGxlY3RPYmplY3RzVG9SZW1vdmUob2JqZWN0c1RvUmVtb3ZlLAotCQkJCQkJCQkJCWVsZW1lbnRUb0RlbGV0ZSwgcmVmZXJlbmNlciwgcmVmZXJlbmNlcyk7Ci0JCQkJCQlpZiAoYikgewotCQkJCQkJCXJldCA9IHRydWU7Ci0JCQkJCQl9Ci0JCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlMaWJyYXJ5RWRpdFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gcmV0OwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHdpbGxSZW1vdmVFbGVtZW50RnJvbUNvbnRhaW5lcihFT2JqZWN0IGVsZW1lbnQpIHsKLQkJaWYgKHdpbGxSZW1vdmVFbGVtZW50RnJvbUNvbnRhaW5lcihjb21tYW5kLCBlbGVtZW50KSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0gZWxzZSBpZiAoY29tbWFuZCBpbnN0YW5jZW9mIENvbXBvdW5kQ29tbWFuZCkgewotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gKChDb21wb3VuZENvbW1hbmQpIGNvbW1hbmQpLmdldENvbW1hbmRMaXN0KCkKLQkJCQkJLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCUNvbW1hbmQgY21kID0gKENvbW1hbmQpIGl0ZXIubmV4dCgpOwotCQkJCWlmICh3aWxsUmVtb3ZlRWxlbWVudEZyb21Db250YWluZXIoY21kLCBlbGVtZW50KSkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gd2lsbFJlbW92ZUVsZW1lbnRGcm9tQ29udGFpbmVyKENvbW1hbmQgY21kLAotCQkJRU9iamVjdCBlbGVtZW50KSB7Ci0JCWlmIChjbWQgaW5zdGFuY2VvZiBSZW1vdmVDb21tYW5kKSB7Ci0JCQlSZW1vdmVDb21tYW5kIHJlbW92ZUNvbW1hbmQgPSAoKFJlbW92ZUNvbW1hbmQpIGNtZCk7Ci0JCQlyZXR1cm4gcmVtb3ZlQ29tbWFuZC5nZXRDb2xsZWN0aW9uKCkuY29udGFpbnMoZWxlbWVudCkKLQkJCQkJJiYgcmVtb3ZlQ29tbWFuZC5nZXRPd25lcigpID09IGVsZW1lbnQuZUNvbnRhaW5lcigpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwcmVwYXJlUmVtb3ZpbmdSZWZlcmVuY2VzKCkgewotCQlMaXN0IGVsZW1lbnRzID0gbG9hZE9wcG9zaXRlRmVhdHVyZXMoKTsKLQotCQllbGVtZW50VG9SZW1vdmVkUmVmc01hcCA9IG5ldyBIYXNoTWFwPEVPYmplY3QsIE1hcDxFT2JqZWN0LCBDb2xsZWN0aW9uPEVTdHJ1Y3R1cmFsRmVhdHVyZT4+PigpOwotCQlIYXNoU2V0IG9iamVjdHNUb1JlbW92ZSA9IG5ldyBIYXNoU2V0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGVsZW1lbnRzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJTWV0aG9kRWxlbWVudCBlbGVtZW50ID0gKE1ldGhvZEVsZW1lbnQpIGl0ZXIubmV4dCgpOwotCQkJTWFwPEVPYmplY3QsIENvbGxlY3Rpb248RVN0cnVjdHVyYWxGZWF0dXJlPj4gcmVmTWFwID0gQXNzb2NpYXRpb25IZWxwZXIuZ2V0UmVmZXJlbmNlTWFwKGVsZW1lbnQpOwotCQkJaWYgKCFyZWZNYXAuaXNFbXB0eSgpKSB7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IHJlZk1hcC5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yCi0JCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQlNYXAuRW50cnkgZW50cnkgPSAoRW50cnkpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJRU9iamVjdCByZWZlcmVuY2VyID0gKEVPYmplY3QpIGVudHJ5LmdldEtleSgpOwotCQkJCQlDb2xsZWN0aW9uIHJlZmVyZW5jZXMgPSAoQ29sbGVjdGlvbikgZW50cnkuZ2V0VmFsdWUoKTsKLQkJCQkJYm9vbGVhbiBiID0gY29sbGVjdE9iamVjdHNUb1JlbW92ZShvYmplY3RzVG9SZW1vdmUsCi0JCQkJCQkJZWxlbWVudCwgcmVmZXJlbmNlciwgcmVmZXJlbmNlcyk7Ci0JCQkJCWlmIChiIHx8IGVsZW1lbnRzLmNvbnRhaW5zKHJlZmVyZW5jZXIpCi0JCQkJCQkJfHwgaXNDb250YWluZWRCeURlbGV0ZWRFbGVtZW50KHJlZmVyZW5jZXIpKSB7Ci0JCQkJCQlpdGVyYXRvci5yZW1vdmUoKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAoIXJlZk1hcC5pc0VtcHR5KCkpCi0JCQkJCWVsZW1lbnRUb1JlbW92ZWRSZWZzTWFwLnB1dChlbGVtZW50LCByZWZNYXApOwotCQkJfQotCQl9Ci0KLQkJLy8gYWRkIGVudHJpZXMgZm9yIG9iamVjdHNUb1JlbW92ZSB0byBlbGVtZW50VG9SZW1vdmVkUmVmc01hcAotCQkvLwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBvYmplY3RzVG9SZW1vdmUuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlFT2JqZWN0IG9iaiA9IChFT2JqZWN0KSBpdGVyLm5leHQoKTsKLQkJCU1hcDxFT2JqZWN0LCBDb2xsZWN0aW9uPEVTdHJ1Y3R1cmFsRmVhdHVyZT4+IG1hcCA9IGVsZW1lbnRUb1JlbW92ZWRSZWZzTWFwLmdldChvYmopOwotCQkJaWYgKG1hcCA9PSBudWxsKSB7Ci0JCQkJbWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJCQllbGVtZW50VG9SZW1vdmVkUmVmc01hcC5wdXQob2JqLCBtYXApOwotCQkJfQotCQkJRU9iamVjdCBjb250YWluZXIgPSBvYmouZUNvbnRhaW5lcigpOwotCQkJRVJlZmVyZW5jZSBjb250YWlubWVudEZlYXR1cmUgPSBvYmouZUNvbnRhaW5tZW50RmVhdHVyZSgpOwotCQkJQ29sbGVjdGlvbiByZWZzID0gKENvbGxlY3Rpb24pIG1hcC5nZXQoY29udGFpbmVyKTsKLQkJCWlmIChyZWZzID09IG51bGwpIHsKLQkJCQlyZWZzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCXJlZnMuYWRkKGNvbnRhaW5tZW50RmVhdHVyZSk7Ci0JCQkJbWFwLnB1dChjb250YWluZXIsIHJlZnMpOwotCQkJfSBlbHNlIHsKLQkJCQlpZiAoIXJlZnMuY29udGFpbnMoY29udGFpbm1lbnRGZWF0dXJlKSkgewotCQkJCQlyZWZzLmFkZChjb250YWlubWVudEZlYXR1cmUpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCS8vIHJlbW92ZSBhbGwgYmktZGlyZWN0aW9uYWwgcmVsYXRpb25zaGlwcwotCQkvLwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBlbGVtZW50cy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEVPYmplY3QpIHsKLQkJCQlFT2JqZWN0IGVPYmplY3QgPSAoRU9iamVjdCkgZWxlbWVudDsKLQkJCQlNYXAgb2JqVG9SZWZzTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJCQlmb3IgKEVDb250ZW50c0VMaXN0LkZlYXR1cmVJdGVyYXRvciBmZWF0dXJlSXRlcmF0b3IgPSAoRUNvbnRlbnRzRUxpc3QuRmVhdHVyZUl0ZXJhdG9yKSBlT2JqZWN0Ci0JCQkJCQkuZUNyb3NzUmVmZXJlbmNlcygpLml0ZXJhdG9yKCk7IGZlYXR1cmVJdGVyYXRvcgotCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJRU9iamVjdCBlT2JqID0gKEVPYmplY3QpIGZlYXR1cmVJdGVyYXRvci5uZXh0KCk7Ci0JCQkJCUVSZWZlcmVuY2UgZVJlZmVyZW5jZSA9IChFUmVmZXJlbmNlKSBmZWF0dXJlSXRlcmF0b3IKLQkJCQkJCQkuZmVhdHVyZSgpOwotCQkJCQlpZiAoZVJlZmVyZW5jZS5nZXRFT3Bwb3NpdGUoKSAhPSBudWxsKSB7Ci0JCQkJCQlMaXN0IHJlZnMgPSAoTGlzdCkgb2JqVG9SZWZzTWFwLmdldChlT2JqKTsKLQkJCQkJCWlmIChyZWZzID09IG51bGwpIHsKLQkJCQkJCQlyZWZzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQkJCW9ialRvUmVmc01hcC5wdXQoZU9iaiwgcmVmcyk7Ci0JCQkJCQl9Ci0JCQkJCQlyZWZzLmFkZChlUmVmZXJlbmNlLmdldEVPcHBvc2l0ZSgpKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlNYXAgbWFwID0gKE1hcCkgZWxlbWVudFRvUmVtb3ZlZFJlZnNNYXAuZ2V0KGVPYmplY3QpOwotCQkJCWlmIChtYXAgPT0gbnVsbCkgewotCQkJCQllbGVtZW50VG9SZW1vdmVkUmVmc01hcC5wdXQoZU9iamVjdCwgb2JqVG9SZWZzTWFwKTsKLQkJCQl9IGVsc2UgewotCQkJCQkvLyBtZXJnZSBvYmpUb1JlZnNNYXAgdG8gbWFwCi0JCQkJCS8vCi0JCQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBvYmpUb1JlZnNNYXAuZW50cnlTZXQoKS5pdGVyYXRvcigpOyBpdGVyYXRvcgotCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCQlPYmplY3Qgb2JqID0gZW50cnkuZ2V0S2V5KCk7Ci0JCQkJCQlDb2xsZWN0aW9uIHJlZnMgPSAoQ29sbGVjdGlvbikgZW50cnkuZ2V0VmFsdWUoKTsKLQkJCQkJCUNvbGxlY3Rpb24gZXhpc3RpbmdSZWZzID0gKENvbGxlY3Rpb24pIG1hcC5nZXQob2JqKTsKLQkJCQkJCWlmIChleGlzdGluZ1JlZnMgIT0gbnVsbCkgewotCQkJCQkJCWZvciAoSXRlcmF0b3IgaXRvciA9IHJlZnMuaXRlcmF0b3IoKTsgaXRvcgotCQkJCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCQkJT2JqZWN0IHJlZiA9IChPYmplY3QpIGl0b3IubmV4dCgpOwotCQkJCQkJCQlpZiAoIWV4aXN0aW5nUmVmcy5jb250YWlucyhyZWYpKSB7Ci0JCQkJCQkJCQlleGlzdGluZ1JlZnMuYWRkKHJlZik7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCW1hcC5wdXQob2JqLCByZWZzKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JfQotCi0JLyoqCi0JICogQHBhcmFtIGNvbGxlY3RlZE9iamVjdHMKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqICAgICAgICAgICAgdGhlIGVsZW1lbnQgdGhhdCB3aWxsIGJlIGRlbGV0ZWQgYnkgdGhpcyBjb21tYW5kCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE9iamVjdHNUb0RlbGV0ZUNvbnRlbnQoQ29sbGVjdGlvbiBjb2xsZWN0ZWRPYmplY3RzLAotCQkJTWV0aG9kRWxlbWVudCBlbGVtZW50KSB7Ci0JCS8vIHRoaXMgc3BlY2lhbCBoYW5kbGluZyBpcyBubyBsb25nZXIgbmVlZGVkIHNpbmNlIGFmZmVjdGVkCi0JCS8vIHN1YmNhdGVnb3JpZXMgYXJlIGFkZGVkCi0JCS8vIHRvIHRoZSBsaXN0IG9mIGVsZW1lbnRzIHRvIGJlIGRlbGV0ZWQKLQkJLy8KLQkJLy8gaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBDdXN0b21DYXRlZ29yeSkgewotCQkvLyAvLyBoYXZlIHRvIGhhbmRsZSBDdXN0b21DYXRlZ29yeSBzcGVjaWFsbHkgc2luY2UgZGVsZXRpbmcgYQotCQkvLyAvLyBDdXN0b21DYXRlZ29yeSBtaWdodCB0cmlnZXIgZGVsZXRpbmcKLQkJLy8gLy8gaXRzIHN1YmNhdGVnb3JpZXMgZXZlbiB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gYSBDdXN0b21DYXRlZ29yeQotCQkvLyBhbmQKLQkJLy8gLy8gaXRzIHN1YmNhdGVnb3JpZXMgaXMKLQkJLy8gLy8gbm9uLWNvbnRhaW5tZW50IHJlZmVyZW5jZQotCQkvLyAvLwotCQkvLyBJdGVyYXRvciBpdGVyMSA9IG5ldyBBYnN0cmFjdFRyZWVJdGVyYXRvcihlbGVtZW50LCBmYWxzZSkgewotCQkvLwotCQkvLyBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtNjI4NTk2OTkyMzEzODc4MTQzN0w7Ci0JCS8vIHByb3RlY3RlZCBJdGVyYXRvciBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCS8vIEFycmF5TGlzdCBjaGlsZHJlbiA9IG5ldyBBcnJheUxpc3QoKTsKLQkJLy8gQ29sbGVjdGlvbiBjYXRFbGVtZW50cyA9ICgoQ3VzdG9tQ2F0ZWdvcnkpIG9iamVjdCkKLQkJLy8gLmdldENhdGVnb3JpemVkRWxlbWVudHMoKTsKLQkJLy8gZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGNhdEVsZW1lbnRzLml0ZXJhdG9yKCk7IGl0ZXJhdG9yCi0JCS8vIC5oYXNOZXh0KCk7KSB7Ci0JCS8vIE9iamVjdCBlID0gaXRlcmF0b3IubmV4dCgpOwotCQkvLyBpZiAoZSBpbnN0YW5jZW9mIEN1c3RvbUNhdGVnb3J5KSB7Ci0JCS8vIGNoaWxkcmVuLmFkZChlKTsKLQkJLy8gfQotCQkvLyB9Ci0JCS8vIHJldHVybiBjaGlsZHJlbi5pdGVyYXRvcigpOwotCQkvLyB9Ci0JCS8vCi0JCS8vIH07Ci0JCS8vIHdoaWxlIChpdGVyMS5oYXNOZXh0KCkpIHsKLQkJLy8gY29sbGVjdGVkT2JqZWN0cy5hZGQoaXRlcjEubmV4dCgpKTsKLQkJLy8gfQotCQkvLyB9Ci0KLQkJTGlzdCBjb21tYW5kTGlzdGVuZXJzID0gUHJvdmlkZXJzCi0JCQkJLmdldENvbW1hbmRMaXN0ZW5lcnMoRGVsZXRlTWV0aG9kRWxlbWVudENvbW1hbmQuY2xhc3MpOwotCQlpZiAoY29tbWFuZExpc3RlbmVycyAhPSBudWxsICYmICFjb21tYW5kTGlzdGVuZXJzLmlzRW1wdHkoKSkgewotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gY29tbWFuZExpc3RlbmVycy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3QgY21kTGlzdGVuZXIgPSBpdGVyLm5leHQoKTsKLQkJCQlpZiAoY21kTGlzdGVuZXIgaW5zdGFuY2VvZiBJRGVsZXRlTWV0aG9kRWxlbWVudENvbW1hbmRMaXN0ZW5lcikgewotCQkJCQl0cnkgewotCQkJCQkJKChJRGVsZXRlTWV0aG9kRWxlbWVudENvbW1hbmRMaXN0ZW5lcikgY21kTGlzdGVuZXIpCi0JCQkJCQkJCS5jb2xsZWN0T2JqZWN0c1RvRGVsZXRlQ29udGVudCgKLQkJCQkJCQkJCQljb2xsZWN0ZWRPYmplY3RzLCBlbGVtZW50KTsKLQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCUxpYnJhcnlFZGl0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlbW92ZVJlZmVyZW5jZXMoKSB7Ci0JCWlmIChyZWZSZW1vdmVkKQotCQkJcmV0dXJuOwotCi0JCWlmIChyZW1vdmVkUmVmZXJlbmNlcyA9PSBudWxsKSB7Ci0JCQlyZW1vdmVkUmVmZXJlbmNlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJfSBlbHNlIHsKLQkJCXJlbW92ZWRSZWZlcmVuY2VzLmNsZWFyKCk7Ci0JCX0KLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZWxlbWVudFRvUmVtb3ZlZFJlZnNNYXAuZW50cnlTZXQoKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCU1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIGl0ZXIubmV4dCgpOwotCQkJTWV0aG9kRWxlbWVudCByZWZlcmVuY2VkID0gKE1ldGhvZEVsZW1lbnQpIGVudHJ5LmdldEtleSgpOwotCQkJaWYgKGNhblJlbW92ZVJlZmVyZW5jZXMocmVmZXJlbmNlZCkpIHsKLQkJCQlNYXAgcmVtb3ZlZFJlZk1hcCA9IChNYXApIGVudHJ5LmdldFZhbHVlKCk7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IHJlbW92ZWRSZWZNYXAuZW50cnlTZXQoKS5pdGVyYXRvcigpOyBpdGVyYXRvcgotCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJTWFwLkVudHJ5IGVudCA9IChNYXAuRW50cnkpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJRU9iamVjdCByZWZlcmVuY2VyID0gKEVPYmplY3QpIGVudC5nZXRLZXkoKTsKLQkJCQkJQ29sbGVjdGlvbiBmZWF0dXJlcyA9IChDb2xsZWN0aW9uKSBlbnQuZ2V0VmFsdWUoKTsKLQkJCQkJZm9yIChJdGVyYXRvciBpdGVyMSA9IGZlYXR1cmVzLml0ZXJhdG9yKCk7IGl0ZXIxLmhhc05leHQoKTspIHsKLQkJCQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgaXRlcjEKLQkJCQkJCQkJLm5leHQoKTsKLQkJCQkJCWlmIChmZWF0dXJlLmlzTWFueSgpKSB7Ci0JCQkJCQkJTGlzdCBsaXN0ID0gKChMaXN0KSByZWZlcmVuY2VyLmVHZXQoZmVhdHVyZSkpOwotCi0JCQkJCQkJaW50IGluZGV4ID0gbGlzdC5pbmRleE9mKHJlZmVyZW5jZWQpOwotCQkJCQkJCS8vIGxpc3QucmVtb3ZlKGluZGV4KTsKLQkJCQkJCQlpZiAoaW5kZXggIT0gLTEpIHsKLQkJCQkJCQkJbGlzdC5yZW1vdmUoaW5kZXgpOwotCQkJCQkJCQlyZW1vdmVkUmVmZXJlbmNlcy5hZGQobmV3IFJlZmVyZW5jZShyZWZlcmVuY2VyLAotCQkJCQkJCQkJCWZlYXR1cmUsIHJlZmVyZW5jZWQsIGluZGV4KSk7Ci0JCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJaWYgKFRuZ1V0aWwuREVCVUcpIHsKLQkJCQkJCQkJCVN5c3RlbS5vdXQKLQkJCQkJCQkJCQkJLnByaW50bG4oIkRlbGV0ZU1ldGhvZEVsZW1lbnRDb21tYW5kLnJlbW92ZVJlZmVyZW5jZXMoKTogaW5kZXg9IiArIGluZGV4ICsgIiwgc2l6ZT0iICsgbGlzdC5zaXplKCkgKyAiLCByZWZlcmVuY2VyPSIgKyByZWZlcmVuY2VyICsgIiwgcmVmZXJlbmNlZD0iICsgcmVmZXJlbmNlZCArICIsIGZlYXR1cmU9IiArIGZlYXR1cmUpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkIC8vJE5PTi1OTFMtNSQKLQkJCQkJCQkJfQotCQkJCQkJCQkvLyB3b3JrLWFyb3VuZDogdHJ5IHRvIGZpbmQgdGhlIHByb3h5IGFuZCByZW1vdmUKLQkJCQkJCQkJLy8gaXQuCi0JCQkJCQkJCS8vIFRPRE86IGtpbmQgb2YgaGFjaywgbmVlZHMgcmV2aXNpdAotCQkJCQkJCQkvLwotCQkJCQkJCQlTdHJpbmcgZ3VpZCA9ICgoTWV0aG9kRWxlbWVudCkgcmVmZXJlbmNlZCkKLQkJCQkJCQkJCQkuZ2V0R3VpZCgpOwotCQkJCQkJCQlmaW5kX3Byb3h5OiBmb3IgKGludCBpID0gMDsgaSA8IGxpc3Quc2l6ZSgpOyBpKyspIHsKLQkJCQkJCQkJCUludGVybmFsRU9iamVjdCByZWYgPSAoSW50ZXJuYWxFT2JqZWN0KSBsaXN0Ci0JCQkJCQkJCQkJCS5nZXQoaSk7Ci0JCQkJCQkJCQlVUkkgdXJpID0gcmVmLmVQcm94eVVSSSgpOwotCQkJCQkJCQkJaWYgKHVyaSAhPSBudWxsCi0JCQkJCQkJCQkJCSYmIGd1aWQuZXF1YWxzKHVyaS5mcmFnbWVudCgpKSkgewotCQkJCQkJCQkJCWxpc3QucmVtb3ZlKGkpOwotCQkJCQkJCQkJCXJlbW92ZWRSZWZlcmVuY2VzLmFkZChuZXcgUmVmZXJlbmNlKAotCQkJCQkJCQkJCQkJcmVmZXJlbmNlciwgZmVhdHVyZSwKLQkJCQkJCQkJCQkJCXJlZmVyZW5jZWQsIGkpKTsKLQkJCQkJCQkJCQlicmVhayBmaW5kX3Byb3h5OwotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlyZWZlcmVuY2VyLmVTZXQoZmVhdHVyZSwgbnVsbCk7Ci0JCQkJCQkJcmVtb3ZlZFJlZmVyZW5jZXMuYWRkKG5ldyBSZWZlcmVuY2UocmVmZXJlbmNlciwKLQkJCQkJCQkJCWZlYXR1cmUsIHJlZmVyZW5jZWQsIC0xKSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlpZiAoVG5nVXRpbC5ERUJVRykgewotCQkJU3lzdGVtLm91dAotCQkJCQkucHJpbnRsbigicmVtb3ZlZFJlZmVyZW5jZXM6IHNpemU9IiArIHJlbW92ZWRSZWZlcmVuY2VzLnNpemUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCWJhdGNoQ29tbWFuZC5nZXRPYmplY3RUb05ld0ZlYXR1cmVWYWx1ZXNNYXAoKS5jbGVhcigpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSByZW1vdmVkUmVmZXJlbmNlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCVJlZmVyZW5jZSByZWYgPSAoUmVmZXJlbmNlKSBpdGVyLm5leHQoKTsKLQkJCWlmIChyZWYuZ2V0RmVhdHVyZSgpID09IFVtYVBhY2thZ2UuTGl0ZXJhbHMuVkFSSUFCSUxJVFlfRUxFTUVOVF9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVCkgewotCQkJCWJhdGNoQ29tbWFuZAotCQkJCQkJLmFkZEZlYXR1cmVWYWx1ZSgKLQkJCQkJCQkJcmVmLmdldE93bmVyKCksCi0JCQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuVkFSSUFCSUxJVFlfRUxFTUVOVF9fVkFSSUFCSUxJVFlfVFlQRSwKLQkJCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5WQVJJQUJJTElUWV9FTEVNRU5UX19WQVJJQUJJTElUWV9UWVBFCi0JCQkJCQkJCQkJLmdldERlZmF1bHRWYWx1ZSgpKTsKLQkJCQlpZiAocmVmLmdldE93bmVyKCkgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCQkvLyBGaWxsIGJsYW5rIHByZXNlbnRhdGlvbiBuYW1lIG9mIGV4dGVuZGVkL2xvY2FsbHkKLQkJCQkJLy8gY29udHJpYnV0aW5nIGFjdGl2aXR5IHdpdGggcHJlc2VudGF0aW9uIG5hbWUKLQkJCQkJLy8gZnJvbSBiYXNlIGFjdGl2aXR5IHdoZW4gYmFzZSBpcyBkZWxldGVkCi0JCQkJCS8vCi0JCQkJCUFjdGl2aXR5IGFjdCA9IChBY3Rpdml0eSkgcmVmLmdldE93bmVyKCk7Ci0JCQkJCVZhcmlhYmlsaXR5VHlwZSB2VHlwZSA9IGFjdC5nZXRWYXJpYWJpbGl0eVR5cGUoKTsKLQkJCQkJaWYgKCh2VHlwZSA9PSBWYXJpYWJpbGl0eVR5cGUuRVhURU5EUyB8fCB2VHlwZSA9PSBWYXJpYWJpbGl0eVR5cGUuTE9DQUxfQ09OVFJJQlVUSU9OKQotCQkJCQkJCSYmIFN0clV0aWwuaXNOdWxsKGFjdC5nZXRQcmVzZW50YXRpb25OYW1lKCkpKSB7Ci0JCQkJCQlBY3Rpdml0eSBiYXNlID0gKEFjdGl2aXR5KSByZWYuZ2V0VmFsdWUoKTsKLQkJCQkJCWJhdGNoQ29tbWFuZAotCQkJCQkJCQkuYWRkRmVhdHVyZVZhbHVlKAotCQkJCQkJCQkJCWFjdCwKLQkJCQkJCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLk1FVEhPRF9FTEVNRU5UX19QUkVTRU5UQVRJT05fTkFNRSwKLQkJCQkJCQkJCQlQcm9jZXNzVXRpbC5nZXRQcmVzZW50YXRpb25OYW1lKGJhc2UpKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAoYmF0Y2hDb21tYW5kLmNhbkV4ZWN1dGUoKSkgewotCQkJYmF0Y2hDb21tYW5kLmV4ZWN1dGUoKTsKLQkJfQotCi0JCXJlZlJlbW92ZWQgPSB0cnVlOwotCX0KLQotCS8qKgotCSAqIFN1YmNsYXNzIHNob3VsZCBvdmVycmlkZSB0aGlzIG1ldGhvZCB0byByZXNvbHZlIGFsbCB0YXJnZXQgZmVhdHVyZXMgc28KLQkgKiBvcHBvc2l0ZSBmZWF0dXJlcyBvZiB0aGUgZ2l2ZW4gTWV0aG9kRWxlbWVudCBhcmUgZnVsbHkgbG9hZGVkLgotCSAqIAotCSAqIEBwYXJhbSBkZWxldGVkR1VJRHMKLQkgKiAKLQkgKiBAcGFyYW0gZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGxvYWRPcHBvc2l0ZUZlYXR1cmVzKExpc3Qgb3Bwb3NpdGVGZWF0dXJlcywgU2V0IGRlbGV0ZWRHVUlEcykgewotCQkvLwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgdm9pZCByZXN0b3JlUmVmZXJlbmNlcyhMaXN0IHJlbW92ZWRSZWZlcmVuY2VzKSB7Ci0JCWZvciAoaW50IGkgPSByZW1vdmVkUmVmZXJlbmNlcy5zaXplKCkgLSAxOyBpID4gLTE7IGktLSkgewotCQkJUmVmZXJlbmNlIHJlZiA9IChSZWZlcmVuY2UpIHJlbW92ZWRSZWZlcmVuY2VzLmdldChpKTsKLQkJCWlmIChyZWYuZmVhdHVyZS5pc01hbnkoKSkgewotCQkJCUxpc3QgbGlzdCA9IChMaXN0KSByZWYub3duZXIuZUdldChyZWYuZmVhdHVyZSk7Ci0JCQkJaWYgKHJlZi5pbmRleCAhPSAtMSkgewotCQkJCQkvLyBUT0RPOiBuZWVkIHJldmlzaXRzCi0JCQkJCS8vCi0JCQkJCWlmICghbGlzdC5jb250YWlucyhyZWYudmFsdWUpKSB7Ci0JCQkJCQlpZiAocmVmLmluZGV4IDwgbGlzdC5zaXplKCkpIHsKLQkJCQkJCQlsaXN0LmFkZChyZWYuaW5kZXgsIHJlZi52YWx1ZSk7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCWlmIChUbmdVdGlsLkRFQlVHKSB7Ci0JCQkJCQkJCVN5c3RlbS5vdXQKLQkJCQkJCQkJCQkucHJpbnRsbigiRGVsZXRlTWV0aG9kRWxlbWVudENvbW1hbmQucmVtb3ZlUmVmZXJlbmNlcygpOiBpbmRleD0iICsgcmVmLmluZGV4ICsgIiwgc2l6ZT0iICsgbGlzdC5zaXplKCkgKyAiLCByZWZlcmVuY2VyPSIgKyByZWYub3duZXIgKyAiLCByZWZlcmVuY2VkPSIgKyByZWYudmFsdWUgKyAiLCBmZWF0dXJlPSIgKyByZWYuZmVhdHVyZSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQgLy8kTk9OLU5MUy01JAotCQkJCQkJCX0KLQkJCQkJCQlsaXN0LmFkZChyZWYudmFsdWUpOwotCQkJCQkJfQotCQkJCQl9IGVsc2UgewotCQkJCQkJaWYgKFRuZ1V0aWwuREVCVUcpIHsKLQkJCQkJCQlTeXN0ZW0ub3V0Ci0JCQkJCQkJCQkucHJpbnRsbigiRGVsZXRlTWV0aG9kRWxlbWVudENvbW1hbmQucmVtb3ZlUmVmZXJlbmNlcygpOiByZWZlcmVuY2UgYWxyZWFkeSBleGlzdHM6IHJlZmVyZW5jZXI9IiArIHJlZi5vd25lciArICIsIHJlZmVyZW5jZWQ9IiArIHJlZi52YWx1ZSArICIsIGZlYXR1cmU9IiArIHJlZi5mZWF0dXJlKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCX0KLQotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJbGlzdC5hZGQocmVmLnZhbHVlKTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCXJlZi5vd25lci5lU2V0KHJlZi5mZWF0dXJlLCByZWYudmFsdWUpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVzdG9yZVJlZmVyZW5jZXMoKSB7Ci0JCWlmICghcmVmUmVtb3ZlZCkKLQkJCXJldHVybjsKLQotCQliYXRjaENvbW1hbmQudW5kbygpOwotCQlyZXN0b3JlUmVmZXJlbmNlcyhyZW1vdmVkUmVmZXJlbmNlcyk7Ci0KLQkJcmVmUmVtb3ZlZCA9IGZhbHNlOwotCX0KLQotCXB1YmxpYyB2b2lkIHVuZG8oKSB7Ci0JCW5vdGlmeVByZVVuZG8oKTsKLQkJdHJ5IHsKLQkJCXN1cGVyLnVuZG8oKTsKLQkJCXJlc3RvcmVSZWZlcmVuY2VzKCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5sb2coZSk7Ci0JCQlub3RpZnlGYWlsdXJlKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRBZmZlY3RlZE9iamVjdHMoKSB7Ci0JCWlmIChleGVjdXRlZCkgewotCQkJcmV0dXJuIHN1cGVyLmdldEFmZmVjdGVkT2JqZWN0cygpOwotCQl9Ci0JCXJldHVybiBlbGVtZW50czsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRDb21tYW5kTGlzdGVuZXIoQ29tbWFuZExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWlmICghY29tbWFuZExpc3RlbmVycy5jb250YWlucyhsaXN0ZW5lcikpIHsKLQkJCWNvbW1hbmRMaXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZUNvbW1hbmRMaXN0ZW5lcihDb21tYW5kTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJY29tbWFuZExpc3RlbmVycy5yZW1vdmUobGlzdGVuZXIpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgaW50ZXJmYWNlIENvbW1hbmRMaXN0ZW5lciB7Ci0JCXZvaWQgbm90aWZ5RXhlY3V0ZWQoRXZlbnRPYmplY3QgZXZlbnRPYmplY3QpOwotCi0JCXZvaWQgbm90aWZ5RmFpbHVyZShFdmVudE9iamVjdCBldmVudE9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZXhlY3V0ZU5lc3RlZENvbW1hbmRzKCkgewotCQlMaXN0IG5lc3RlZENvbW1hbmRQcm92aWRlcnMgPSBFeHRlbnNpb25NYW5hZ2VyCi0JCQkJLmdldE5lc3RlZENvbW1hbmRQcm92aWRlcnMoKTsKLQkJaWYgKCFuZXN0ZWRDb21tYW5kUHJvdmlkZXJzLmlzRW1wdHkoKSkgewotCQkJaWYgKCFlbGVtZW50cy5pc0VtcHR5KCkpIHsKLQkJCQluZXN0ZWRDb21tYW5kcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBuZXN0ZWRDb21tYW5kUHJvdmlkZXJzLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCUlOZXN0ZWRDb21tYW5kUHJvdmlkZXIgY21kUHJvdmlkZXIgPSAoSU5lc3RlZENvbW1hbmRQcm92aWRlcikgaXRlcgotCQkJCQkJCS5uZXh0KCk7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlDb21tYW5kIGNtZCA9IGNtZFByb3ZpZGVyLnJlbW92ZVJlbGF0ZWRPYmplY3RzKGVsZW1lbnRzLAotCQkJCQkJCQl0aGlzKTsKLQkJCQkJCWlmIChjbWQgIT0gbnVsbCAmJiBjbWQuY2FuRXhlY3V0ZSgpKSB7Ci0JCQkJCQkJY21kLmV4ZWN1dGUoKTsKLQkJCQkJCQluZXN0ZWRDb21tYW5kcy5hZGQoY21kKTsKLQkJCQkJCX0KLQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCUxpYnJhcnlFZGl0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkKLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gbW9kaWZpZWRSZXNvdXJjZXMyCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNvbGxlY3ROZXN0ZWRDb21tYW5kUmVzb3VyY2VzKFNldDxSZXNvdXJjZT4gbW9kaWZpZWRSZXNvdXJjZXMpIHsKLQkJCi0JCWlmIChuZXN0ZWRDb21tYW5kcyAhPSBudWxsICYmICFuZXN0ZWRDb21tYW5kcy5pc0VtcHR5KCkpIHsKLQkJCWZvciAoaW50IGkgPSBuZXN0ZWRDb21tYW5kcy5zaXplKCkgLSAxOyBpID4gLTE7IGktLSkgewotCQkJCUNvbW1hbmQgY21kID0gKENvbW1hbmQpIG5lc3RlZENvbW1hbmRzLmdldChpKTsKLQkJCQl0cnkgewotCQkJCQlpZiAoY21kIGluc3RhbmNlb2YgSVJlc291cmNlQXdhcmVDb21tYW5kKSB7Ci0JCQkJCQlDb2xsZWN0aW9uIHJlc291cmNlcyA9ICgoSVJlc291cmNlQXdhcmVDb21tYW5kKSBjbWQpCi0JCQkJCQkJCS5nZXRNb2RpZmllZFJlc291cmNlcygpOwotCQkJCQkJaWYgKHJlc291cmNlcyAhPSBudWxsKSB7Ci0JCQkJCQkJbW9kaWZpZWRSZXNvdXJjZXMuYWRkQWxsKHJlc291cmNlcyk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQlMaWJyYXJ5RWRpdFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkJfSBmaW5hbGx5IHsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHVibGljIENvbGxlY3Rpb248RGVzY3JpcHRvcj4gZ2V0RGVzY3JpcHRvcnNUb0RlbGV0ZSgpIHsKLQkJcmV0dXJuIGRlc2NyaXB0b3JzOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc0V4ZWN1dGVkKCkgewotCQlyZXR1cm4gZXhlY3V0ZWQ7Ci0JfQotCQotCQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb21tYW5kL0Z1bGx5UmV2ZXJ0aWJsZUNvbW1hbmRTdGFjay5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb21tYW5kL0Z1bGx5UmV2ZXJ0aWJsZUNvbW1hbmRTdGFjay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYzNjZmExLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29tbWFuZC9GdWxseVJldmVydGlibGVDb21tYW5kU3RhY2suamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwNyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRXZlbnRPYmplY3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLkNvbW1vblBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQmFzaWNDb21tYW5kU3RhY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmRTdGFja0xpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5XcmFwcGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kLkJTRHJhZ0FuZERyb3BDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5tb2RlbC51dGlsLlN0cmluZ1Jlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLS8qKgotICogQSBjb21tYW5kIHN0YWNrIHRoYXQgdHJpZXMgaXRzIGJlc3QgdG8gZnVsbHkgcmV2ZXJ0IHRvIGl0cyBpbml0aWFsIHN0YXRlLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRnVsbHlSZXZlcnRpYmxlQ29tbWFuZFN0YWNrIGV4dGVuZHMgQmFzaWNDb21tYW5kU3RhY2sgewotCi0JcHVibGljIHN0YXRpYyBpbnRlcmZhY2UgSUVycm9yUmVwb3J0ZXIgewotCQl2b2lkIHNob3dFcnJvcihTdHJpbmcgbXNnKTsKLQl9Ci0KLQlwcml2YXRlIElFcnJvclJlcG9ydGVyIGVyclJlcG9ydGVyOwotCi0JcHJpdmF0ZSBBY3Rpb25NYW5hZ2VyIGFjdGlvbk1ncjsKLQotCXB1YmxpYyBGdWxseVJldmVydGlibGVDb21tYW5kU3RhY2soQWN0aW9uTWFuYWdlciBhY3Rpb25NZ3IpIHsKLQkJdGhpcy5hY3Rpb25NZ3IgPSBhY3Rpb25NZ3I7Ci0JfQotCi0JcHVibGljIEZ1bGx5UmV2ZXJ0aWJsZUNvbW1hbmRTdGFjayhBY3Rpb25NYW5hZ2VyIGFjdGlvbk1nciwKLQkJCUlFcnJvclJlcG9ydGVyIGVyclJlcG9ydGVyKSB7Ci0JCXRoaXMoYWN0aW9uTWdyKTsKLQkJdGhpcy5lcnJSZXBvcnRlciA9IGVyclJlcG9ydGVyOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEVycm9yUmVwb3J0ZXIoSUVycm9yUmVwb3J0ZXIgZXJyUmVwb3J0ZXIpIHsKLQkJdGhpcy5lcnJSZXBvcnRlciA9IGVyclJlcG9ydGVyOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgcmVnaXN0ZXJBc01vZGlmaWVyKENvbW1hbmQgY29tbWFuZCkgewotCQlTZXQ8UmVzb3VyY2U+IG1vZGlmaWVkUmVzb3VyY2VzID0gVG5nVXRpbC5nZXRNb2RpZmllZFJlc291cmNlcyhjb21tYW5kKTsKLQkJaWYoIW1vZGlmaWVkUmVzb3VyY2VzLmlzRW1wdHkoKSkgewotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gbW9kaWZpZWRSZXNvdXJjZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSAoUmVzb3VyY2UpIGl0ZXIubmV4dCgpOwotCQkJCWlmICghKHJlc291cmNlIGluc3RhbmNlb2YgU3RyaW5nUmVzb3VyY2UpKQotCQkJCQlhY3Rpb25NZ3IucmVnaXN0ZXJBc01vZGlmaWVyT2YocmVzb3VyY2UpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZG9FeGVjdXRlKENvbW1hbmQgY29tbWFuZCkgewotCQlpZiAoIWNvbW1hbmQuY2FuVW5kbygpKQotCQkJcmV0dXJuIGZhbHNlOyAvLyB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJDYW5ub3QKLQkJLy8gZXhlY3V0ZSBjb21tYW5kIHRoYXQgY2Fubm90IGRlIHVuZG9uZSIpOwotCQlzdXBlci5leGVjdXRlKGNvbW1hbmQpOwotCQkKLQkJLy8gc3BlY2lhbCBoYW5kbGluZyBmb3IgQWN0aXZpdHlEcm9wQ29tbWFuZAotCQkvLwotCQkvLyBUT0RPOiBhbGwgY29tbWFuZHMgbXVzdCByZXR1cm4gYSBjb3JyZWN0IHZhbHVlIGluIGdldEFmZmVjdGVkT2JqZWN0KCkKLQkJLy8gaWYgZ2V0QWZmZWN0ZWRPYmplY3QoKSByZXR1cm4gYW4gZW1wdHkgY29sbGVjdGlvbiwgdGhlIGFjdGlvbiBtYW5hZ2VyCi0JCS8vIHdpbGwgbm90IHJlZ2lzdGVyIGl0IGFzIGEgbW9kaWZpZXIgb2YgdGhlIHJlc291cmNlcyByZXR1cm5lZCBieSBnZXRNb2RpZmllZFJlc291cmNlcygpCi0JCS8vIGFuZCB0aGUgZWRpdG9yIG1pZ2h0IG5vdCBiZSBtYXJrZWQgZGlydHkgYXMgdGhlIHJlc3VsdC4KLQkJLy8KLQkJaWYoY29tbWFuZCBpbnN0YW5jZW9mIEJTRHJhZ0FuZERyb3BDb21tYW5kICYmIGNvbW1hbmQuZ2V0QWZmZWN0ZWRPYmplY3RzKCkuaXNFbXB0eSgpKSB7Ci0JCQlpZih0b3AgIT0gLTEpIHsKLQkJCQljb21tYW5kTGlzdC5yZW1vdmUodG9wLS0pOwotCQkJCWlmKHRvcCAhPSAtMSkgewotCQkJCQltb3N0UmVjZW50Q29tbWFuZCA9IChDb21tYW5kKSBjb21tYW5kTGlzdC5nZXQodG9wKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCW1vc3RSZWNlbnRDb21tYW5kID0gbnVsbDsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJCi0JCWJvb2xlYW4gcmV0ID0gZ2V0TW9zdFJlY2VudENvbW1hbmQoKSAhPSBudWxsOwotCQlpZiAocmV0ICYmIGFjdGlvbk1nciAhPSBudWxsKSB7CQkJCi0JCQlyZWdpc3RlckFzTW9kaWZpZXIoY29tbWFuZCk7Ci0JCX0KLQkJbm90aWZ5TGlzdGVuZXJzKG5ldyBDb21tYW5kU3RhY2tDaGFuZ2VkRXZlbnQodGhpcywKLQkJCQlDb21tYW5kU3RhY2tDaGFuZ2VkRXZlbnQuRVhFQ1VURUQpKTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBleGVjdXRlKENvbW1hbmQgY29tbWFuZCkgewotCQlkb0V4ZWN1dGUoY29tbWFuZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVkbygpIHsKLQkJc3VwZXIucmVkbygpOwotCQlub3RpZnlMaXN0ZW5lcnMobmV3IENvbW1hbmRTdGFja0NoYW5nZWRFdmVudCh0aGlzLAotCQkJCUNvbW1hbmRTdGFja0NoYW5nZWRFdmVudC5FWEVDVVRFRCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHVuZG8oKSB7Ci0JCWlmIChjYW5VbmRvKCkpIHsKLQkJCUNvbW1hbmQgY29tbWFuZCA9IChDb21tYW5kKSBjb21tYW5kTGlzdC5nZXQodG9wLS0pOwotCQkJdHJ5IHsKLQkJCQljb21tYW5kLnVuZG8oKTsKLQkJCQltb3N0UmVjZW50Q29tbWFuZCA9IGNvbW1hbmQ7Ci0JCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGV4Y2VwdGlvbikgewotCQkJCUNvbW1vblBsdWdpbi5JTlNUQU5DRQotCQkJCQkJLmxvZyhuZXcgV3JhcHBlZEV4Y2VwdGlvbigKLQkJCQkJCQkJQ29tbW9uUGx1Z2luLklOU1RBTkNFCi0JCQkJCQkJCQkJLmdldFN0cmluZygiX1VJX0lnbm9yZUV4Y2VwdGlvbl9leGNlcHRpb24iKSwgZXhjZXB0aW9uKS5maWxsSW5TdGFja1RyYWNlKCkpOyAvLyROT04tTkxTLTEkCi0KLQkJCQltb3N0UmVjZW50Q29tbWFuZCA9IG51bGw7Ci0JCQkJdG9wKys7Ci0KLQkJCQlpZiAoZXJyUmVwb3J0ZXIgIT0gbnVsbCkgewotCQkJCQlPYmplY3RbXSBvYmplY3QgPSBuZXcgT2JqZWN0WzFdOwotCQkJCQlvYmplY3RbMF0gPSBjb21tYW5kOwotCQkJCQlvYmplY3RbMV0gPSBleGNlcHRpb247Ci0JCQkJCWVyclJlcG9ydGVyLnNob3dFcnJvcihOTFMuYmluZChMaWJyYXJ5RWRpdFJlc291cmNlcy51bmRvQ29tbWFuZEVycm9yX21zZywgb2JqZWN0KSk7IAotCQkJCX0KLQkJCX0KLQkJCW5vdGlmeUxpc3RlbmVycyhuZXcgQ29tbWFuZFN0YWNrQ2hhbmdlZEV2ZW50KHRoaXMsCi0JCQkJCUNvbW1hbmRTdGFja0NoYW5nZWRFdmVudC5VTkRPKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiB1bmRvQWxsKCkgewotCQl0cnkgewotCQkJd2hpbGUgKGNhblVuZG8oKSkgewotCQkJCUNvbW1hbmQgY29tbWFuZCA9IChDb21tYW5kKSBjb21tYW5kTGlzdC5nZXQodG9wLS0pOwotCQkJCXRyeSB7Ci0JCQkJCWNvbW1hbmQudW5kbygpOwotCQkJCQltb3N0UmVjZW50Q29tbWFuZCA9IGNvbW1hbmQ7Ci0JCQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLQkJCQkJQ29tbW9uUGx1Z2luLklOU1RBTkNFCi0JCQkJCQkJLmxvZyhuZXcgV3JhcHBlZEV4Y2VwdGlvbigKLQkJCQkJCQkJCUNvbW1vblBsdWdpbi5JTlNUQU5DRQotCQkJCQkJCQkJCQkuZ2V0U3RyaW5nKCJfVUlfSWdub3JlRXhjZXB0aW9uX2V4Y2VwdGlvbiIpLCBleGNlcHRpb24pLmZpbGxJblN0YWNrVHJhY2UoKSk7IC8vJE5PTi1OTFMtMSQKLQotCQkJCQltb3N0UmVjZW50Q29tbWFuZCA9IG51bGw7Ci0JCQkJCXRvcCsrOwotCi0JCQkJCWlmIChlcnJSZXBvcnRlciAhPSBudWxsKSB7Ci0JCQkJCQkvLyBlcnJSZXBvcnRlci5zaG93RXJyb3IoIkNhbm5vdCB1bmRvIGNvbW1hbmQ6ICciICsKLQkJCQkJCS8vIGNvbW1hbmQgKyAiJywgZXhjZXB0aW9uOiAiICsgZXhjZXB0aW9uKTsKLQkJCQkJCU9iamVjdFtdIG9iamVjdCA9IG5ldyBPYmplY3RbMV07Ci0JCQkJCQlvYmplY3RbMF0gPSBjb21tYW5kOwotCQkJCQkJb2JqZWN0WzFdID0gZXhjZXB0aW9uOwotCQkJCQkJZXJyUmVwb3J0ZXIKLQkJCQkJCQkJLnNob3dFcnJvcihOTFMuYmluZChMaWJyYXJ5RWRpdFJlc291cmNlcy51bmRvQ29tbWFuZEVycm9yX21zZywgb2JqZWN0KSk7IAotCQkJCQl9Ci0KLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCX0KLQkJfSBmaW5hbGx5IHsKLQkJCW5vdGlmeUxpc3RlbmVycyhuZXcgQ29tbWFuZFN0YWNrQ2hhbmdlZEV2ZW50KHRoaXMsCi0JCQkJCUNvbW1hbmRTdGFja0NoYW5nZWRFdmVudC5VTkRPX0FMTCkpOwotCQl9Ci0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgbm90aWZ5TGlzdGVuZXJzKEV2ZW50T2JqZWN0IGV2ZW50KSB7Ci0JCWZvciAoSXRlcmF0b3IgaSA9IGxpc3RlbmVycy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLQkJCSgoQ29tbWFuZFN0YWNrTGlzdGVuZXIpIGkubmV4dCgpKS5jb21tYW5kU3RhY2tDaGFuZ2VkKGV2ZW50KTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIG5vdGlmeUxpc3RlbmVycygpIHsKLQkJLy8KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzYXZlSXNEb25lKCkgewotCQlzdXBlci5zYXZlSXNEb25lKCk7Ci0JCW5vdGlmeUxpc3RlbmVycyhuZXcgQ29tbWFuZFN0YWNrQ2hhbmdlZEV2ZW50KHRoaXMsCi0JCQkJQ29tbWFuZFN0YWNrQ2hhbmdlZEV2ZW50LlNBVkVEKSk7Ci0JCWNvbW1hbmRMaXN0LmNsZWFyKCk7Ci0JCXRvcCA9IC0xOwotCQlzYXZlSW5kZXggPSAtMTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5CYXNpY0NvbW1hbmRTdGFjayNpc1NhdmVOZWVkZWQoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2F2ZU5lZWRlZCgpIHsKLQkJcmV0dXJuIHN1cGVyLmlzU2F2ZU5lZWRlZCgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb21tYW5kL0lBY3Rpb25NYW5hZ2VyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbW1hbmQvSUFjdGlvbk1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTlmMDdmYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbW1hbmQvSUFjdGlvbk1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci0KLS8qKgotICogVGhpcyBpbnRlcmZhY2UgY2xhc3MgaXMgdXNlZCB0byBzdXBwb3J0IHVuZG8gb3BlcmF0aW9ucyBpbiB0aGUKLSAqIGZvcm0gZWRpdG9ycy4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJQWN0aW9uTWFuYWdlciB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTRVQgPSBOb3RpZmljYXRpb24uU0VUOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUREID0gTm90aWZpY2F0aW9uLkFERDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFTU9WRSA9IE5vdGlmaWNhdGlvbi5SRU1PVkU7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBRERfTUFOWSA9IE5vdGlmaWNhdGlvbi5BRERfTUFOWTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFTU9WRV9NQU5ZID0gTm90aWZpY2F0aW9uLlJFTU9WRV9NQU5ZOwotCi0JLyoqCi0JICogUGVyZm9ybXMgdGhlIGFjdGlvbiBhcyBkZXNjcmliZWQgaW4gcGFyYW1ldGVycwotCSAqIAotCSAqIEBwYXJhbSBhY3Rpb25UeXBlCi0JICogICAgICAgICAgICBvbmUgb2YgdGhlIGFib3ZlIGRlZmluZWQgYWN0aW9uIGNvbnN0YW50cwotCSAqIEBwYXJhbSBvYmplY3QKLQkgKiAgICAgICAgICAgIHRoZSBvYmplY3QgdG8gcGVyZm9ybSBhY3Rpb24gdXBvbgotCSAqIEBwYXJhbSBmZWF0dXJlCi0JICogICAgICAgICAgICB0aGUgZmVhdHVyZSB0byBiZSBtb2RpZmllZAotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgdGhlIGZlYXR1cmUgdmFsdWUKLQkgKiBAcGFyYW0gaW5kZXgKLQkgKiAgICAgICAgICAgIHNwZWNpZnkgLTEgaWYgbm8gaW5kZXgKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHN1Y2Nlc3NmdWxsLCA8Y29kZT5mYWxzZTwvY29kZT4KLQkgKiAgICAgICAgIG90aGVyd2lzZQotCSAqLwotCWJvb2xlYW4gZG9BY3Rpb24oaW50IGFjdGlvblR5cGUsIEVPYmplY3Qgb2JqZWN0LAotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIE9iamVjdCB2YWx1ZSwgaW50IGluZGV4KTsKLQotCS8qKgotCSAqIEV4ZWN1dGVzIHRoZSBnaXZlbiBjb21tYW5kCi0JICogCi0JICogQHBhcmFtIGNtZAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgc3VjY2Vzc2Z1bGwsIDxjb2RlPmZhbHNlPC9jb2RlPgotCSAqICAgICAgICAgb3RoZXJ3aXNlCi0JICovCi0JYm9vbGVhbiBleGVjdXRlKElSZXNvdXJjZUF3YXJlQ29tbWFuZCBjbWQpOwotCi0Jdm9pZCB1bmRvKCk7Ci0KLQl2b2lkIHJlZG8oKTsKLQotCWJvb2xlYW4gdW5kb0FsbCgpOwotCi0Jdm9pZCBzYXZlSXNEb25lKCk7Ci0KLQlib29sZWFuIGlzU2F2ZU5lZWRlZCgpOwotCi0JLyoqCi0JICogR2V0cyByZXNvdXJjZXMgZmlyc3QgbW9kaWZpZWQgYnkgdGhpcyBhY3Rpb24gbWFuYWdlcgotCSAqLwotCUNvbGxlY3Rpb24gZ2V0TW9kaWZpZWRSZXNvdXJjZXMoKTsKLQotCXZvaWQgZGlzcG9zZSgpOwotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb21tYW5kL0lEZWxldGVNZXRob2RFbGVtZW50Q29tbWFuZExpc3RlbmVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbW1hbmQvSURlbGV0ZU1ldGhvZEVsZW1lbnRDb21tYW5kTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWYwNzEyYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbW1hbmQvSURlbGV0ZU1ldGhvZEVsZW1lbnRDb21tYW5kTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JQ29tbWFuZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZSAtIEF1ZyAxNywgMjAwNgotICogQHNpbmNlICAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJRGVsZXRlTWV0aG9kRWxlbWVudENvbW1hbmRMaXN0ZW5lciBleHRlbmRzIElDb21tYW5kTGlzdGVuZXIgewotCS8qKgotCSAqIENvbGxlY3RzIG9iamVjdHMgd2hvc2UgY29udGVudCBtdXN0IGJlIGRlbGV0ZWQgaWYgdGhlIGdpdmVuIGVsZW1lbnQgaXMgZGVsZXRlZC4KLQkgKiAKLQkgKiBAcGFyYW0gY29sbGVjdGVkT2JqZWN0cwotCSAqIEBwYXJhbSBlbGVtZW50IHRoZSBlbGVtZW50IHRoYXQgd2lsbCBiZSBkZWxldGVkLgotCSAqLwotCXZvaWQgY29sbGVjdE9iamVjdHNUb0RlbGV0ZUNvbnRlbnQoQ29sbGVjdGlvbiBjb2xsZWN0ZWRPYmplY3RzLCBNZXRob2RFbGVtZW50IGVsZW1lbnQpOwkKLQotCS8qKgotCSAqIENvbGxlY3RzIG9iamVjdHMgdGhhdCBzaG91bGQgYmUgcmVtb3ZlZCBpZiA8Y29kZT5lbGVtZW50VG9EZWxldGU8L2NvZGU+IHdpbGwgYmUgcmVtb3ZlZCBmcm9tIAotCSAqIDxjb2RlPnJlZmVyZW5jZXM8L2NvZGU+IG9mIDxjb2RlPnJlZmVyZW5jZXI8L2NvZGU+LgotCSAqIAotCSAqIEBwYXJhbSBvYmplY3RzVG9SZW1vdmUgb3V0cHV0IAotCSAqIEBwYXJhbSByZWZlcmVuY2VyIGVsZW1lbnQgdGhhdCByZWZlcmVuY2VzIHRvIGVsZW1lbnRUb0RlbGV0ZQotCSAqIEBwYXJhbSByZWZlcmVuY2VzIGNvbGxlY3Rpb24gb2Yge0BsaW5rIEVSZWZlcmVuY2V9IHRoYXQgY29udGFpbnMgZWxlbWVudFRvRGVsZXRlCi0JICogQHJldHVybiB0cnVlIGlmIG9uZSBvZiB0aGUgY29sbGVjdGVkIG9iamVjdHMgaXMgdGhlIDxjb2RlPnJlZmVyZW5jZXI8L2NvZGU+IG9yIGNvbnRhaW5lciBvZiA8Y29kZT5yZWZlcmVuY2VyPC9jb2RlPgotCSAqLwotCWJvb2xlYW4gY29sbGVjdE9iamVjdHNUb1JlbW92ZShDb2xsZWN0aW9uIG9iamVjdHNUb1JlbW92ZSwgRU9iamVjdCBlbGVtZW50VG9EZWxldGUsIEVPYmplY3QgcmVmZXJlbmNlciwgQ29sbGVjdGlvbiByZWZlcmVuY2VzKTsKLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb21tYW5kL0lJbnRlcmFjdGl2ZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb21tYW5kL0lJbnRlcmFjdGl2ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxY2IxYzAyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29tbWFuZC9JSW50ZXJhY3RpdmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZDsKLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZSAtIE9jdCAzLCAyMDA2Ci0gKiBAc2luY2UgIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElJbnRlcmFjdGl2ZSB7Ci0Jdm9pZCBzZXRVc2VySW50ZXJhY3Rpb25IYW5kbGVyKElVc2VySW50ZXJhY3Rpb25IYW5kbGVyIGhhbmRsZXIpOwotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb21tYW5kL0lNb2RpZnlDb21tYW5kLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbW1hbmQvSU1vZGlmeUNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODZiNDQ5My4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbW1hbmQvSU1vZGlmeUNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElNb2RpZnlDb21tYW5kIHsKLQkKLQlDb2xsZWN0aW9uIGdldE1vZGlmaWVkT2JqZWN0cygpOwotCQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb21tYW5kL0lOZXN0ZWRDb21tYW5kUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29tbWFuZC9JTmVzdGVkQ29tbWFuZFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3ODk3ODguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb21tYW5kL0lOZXN0ZWRDb21tYW5kUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7Ci0KLS8qKgotICogUHJvdmlkZXMgbmVzdGVkIGNvbW1hbmRzIHRvIGV4ZWN1dGUgcmlnaHQgYWZ0ZXIgdGhlIGV4ZWN1dGlvbiBvZiB0aGUgbWFpbiBjb21tYW5kCi0gKiAgCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlICAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJTmVzdGVkQ29tbWFuZFByb3ZpZGVyIHsKLQlDb21tYW5kIGNyZWF0ZVJlbGF0ZWRPYmplY3RzKENvbGxlY3Rpb248Pz4gY3JlYXRlZEVsZW1lbnRzLCBDb21tYW5kIGNyZWF0ZUNvbW1hbmQpOwotCUNvbW1hbmQgcmVtb3ZlUmVsYXRlZE9iamVjdHMoQ29sbGVjdGlvbjw/PiBkZWxldGVkRWxlbWVudHMsIENvbW1hbmQgZGVsZXRlQ29tbWFuZCk7Ci0JQ29tbWFuZCBjcmVhdGVOZXN0ZWRDb21tYW5kKENvbW1hbmQgY29tbWFuZCk7Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbW1hbmQvSVJlc291cmNlQXdhcmVDb21tYW5kLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbW1hbmQvSVJlc291cmNlQXdhcmVDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwNTBkNjEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb21tYW5kL0lSZXNvdXJjZUF3YXJlQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci0KLS8qKgotICogVGhlIGludGVyZmFjZSBmb3IgYSByZXNvdXJjZSBhd2FyZSBjb21tYW5kLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElSZXNvdXJjZUF3YXJlQ29tbWFuZCBleHRlbmRzIENvbW1hbmQgewotCi0JQ29sbGVjdGlvbjxSZXNvdXJjZT4gZ2V0TW9kaWZpZWRSZXNvdXJjZXMoKTsKLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb21tYW5kL0lVc2VySW50ZXJhY3Rpb25IYW5kbGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbW1hbmQvSVVzZXJJbnRlcmFjdGlvbkhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTM5MTk1Zi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbW1hbmQvSVVzZXJJbnRlcmFjdGlvbkhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLQotLyoqCi0gKiBJbnRlcmZhY2UgdG8gaGFuZGxlIHVzZXIgaW50ZXJhY3Rpb25zIGR1cmluZyBjb21tYW5kIGV4ZWN1dGlvbgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZSAtIE9jdCAzLCAyMDA2Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVVzZXJJbnRlcmFjdGlvbkhhbmRsZXIgewotCS8qKgotCSAqIERlbGl2ZXJzIG1lc3NhZ2VzIHRvIHVzZXJzCi0JICogCi0JICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUgLSBPY3QgMjYsIDIwMDYKLQkgKiBAc2luY2UgMS4wCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnRlcmZhY2UgSU1lc3NlbmdlciB7Ci0JCS8qKgotCQkgKiBTaG93cyBpbmZvcm1hdGlvbiBtZXNzYWdlCi0JCSAqIAotCQkgKiBAcGFyYW0gdGl0bGUKLQkJICogQHBhcmFtIG1zZwotCQkgKi8KLQkJdm9pZCBzaG93SW5mbyhTdHJpbmcgdGl0bGUsIFN0cmluZyBtc2cpOwotCi0JCS8qKgotCQkgKiBTaG93cyB3YXJuaW5nIG1lc3NhZ2UKLQkJICogCi0JCSAqIEBwYXJhbSB0aXRsZQotCQkgKiBAcGFyYW0gbXNnCi0JCSAqLwotCQl2b2lkIHNob3dXYXJuaW5nKFN0cmluZyB0aXRsZSwgU3RyaW5nIG1zZyk7Ci0KLQkJLyoqCi0JCSAqIFNob3dzIHdhcm5pbmcgbWVzc2FnZSB3aXRoIHJlYXNvbgotCQkgKiAKLQkJICogQHBhcmFtIHRpdGxlCi0JCSAqIEBwYXJhbSBtc2cKLQkJICogQHBhcmFtIHN0cmluZwotCQkgKi8KLQkJdm9pZCBzaG93V2FybmluZyhTdHJpbmcgdGl0bGUsIFN0cmluZyBtc2csIFN0cmluZyByZWFzb24pOwotCi0JCS8qKgotCQkgKiBTaG93cyBlcnJvciBtZXNzYWdlCi0JCSAqIAotCQkgKiBAcGFyYW0gdGl0bGUKLQkJICogQHBhcmFtIG1zZwotCQkgKi8KLQkJdm9pZCBzaG93RXJyb3IoU3RyaW5nIHRpdGxlLCBTdHJpbmcgbXNnKTsKLQotCQkvKioKLQkJICogU2hvd3MgZXJyb3IgbWVzc2FnZSB3aXRoIHN0YXR1cwotCQkgKiAKLQkJICogQHBhcmFtIHRpdGxlCi0JCSAqIEBwYXJhbSBtc2cKLQkJICogQHBhcmFtIHN0YXR1cwotCQkgKi8KLQkJdm9pZCBzaG93RXJyb3IoU3RyaW5nIHRpdGxlLCBTdHJpbmcgbXNnLCBJU3RhdHVzIHN0YXR1cyk7Ci0KLQkJLyoqCi0JCSAqIFNob3dzIGVycm9yIG1lc3NhZ2Ugd2l0aCByZWFzb24gYW5kIGV4Y2VwdGlvbgotCQkgKiAKLQkJICogQHBhcmFtIHRpdGxlCi0JCSAqIEBwYXJhbSBtc2cKLQkJICogQHBhcmFtIHJlYXNvbgotCQkgKiBAcGFyYW0gZXhjZXB0aW9uCi0JCSAqLwotCQl2b2lkIHNob3dFcnJvcihTdHJpbmcgdGl0bGUsIFN0cmluZyBtc2csIFN0cmluZyByZWFzb24sCi0JCQkJRXhjZXB0aW9uIGV4Y2VwdGlvbik7Ci0KLQkJdm9pZCBzaG93RXJyb3IoU3RyaW5nIHRpdGxlLCBTdHJpbmcgbXNnLCBTdHJpbmcgcmVhc29uLCBTdHJpbmcgZGV0YWlscywKLQkJCQlFeGNlcHRpb24gZXhjZXB0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBBY3Rpb24gY29uc3RhbnQgZm9yIHVzZXIgYWNjZXB0YW5jZQotCSAqLwotCXN0YXRpYyBmaW5hbCBpbnQgQUNUSU9OX09LID0gMDsKLQotCS8qKgotCSAqIEFjdGlvbiBjb25zdGFudCBmb3IgdXNlciBjYW5jZWxsYXRpb24KLQkgKi8KLQlzdGF0aWMgZmluYWwgaW50IEFDVElPTl9DQU5DRUwgPSAxOwotCi0JLyoqCi0JICogQWN0aW9uIGNvbnN0YW50IGZvciByZXRyeQotCSAqLwotCXN0YXRpYyBmaW5hbCBpbnQgQUNUSU9OX1JFVFJZID0gMjsKLQotCS8qKgotCSAqIEFjdGlvbiBjb25zdGFudCBmb3IgYWJvcnQKLQkgKi8KLQlzdGF0aWMgZmluYWwgaW50IEFDVElPTl9BQk9SVCA9IDM7Ci0JCi0Jc3RhdGljIGZpbmFsIGludCBBQ1RJT05fWUVTID0gNDsKLQkKLQlzdGF0aWMgZmluYWwgaW50IEFDVElPTl9OTyA9IDU7Ci0KLQkvKioKLQkgKiBTZWxlY3RzIG9iamVjdHMgZnJvbSB0aGUgc3BlY2lmaWVkIGxpc3QgPGNvZGU+b2JqZWN0c1RvU2VsZWN0PC9jb2RlPi4KLQkgKiAKLQkgKiBAcGFyYW0gb2JqZWN0c1RvU2VsZWN0Ci0JICogICAgICAgICAgICBvYmplY3RzIGZvciB1c2VyIHRvIHNlbGVjdAotCSAqIEBwYXJhbSBsYWJlbFByb3ZpZGVyCi0JICogICAgICAgICAgICBsYWJlbCBwcm92aWRlciB1c2VkIHRvIGRpc3BsYXkgdGhlIGdpdmVuIG9iamVjdHMgdG8gdXNlcgotCSAqIEBwYXJhbSBtdWx0aXBsZQotCSAqICAgICAgICAgICAgaWYgPGNvZGU+dHJ1ZTwvY29kZT4gd2lsbCBhbGxvdyBtdWx0aXBsZSBzZWxlY3Rpb24sIHNpbmdsZQotCSAqICAgICAgICAgICAgc2VsZWN0aW9uIGlmIDxjb2RlPmZhbHNlPC9jb2RlPgotCSAqIEBwYXJhbSB0aXRsZQotCSAqICAgICAgICAgICAgdGhlIHRpdGxlIG9mIHRoaXMgc2VsZWN0aW9uIGFjdGlvbiB0byBkaXNwbGF5IHRvIHVzZXIKLQkgKiBAcGFyYW0gbXNnCi0JICogICAgICAgICAgICB0aGUgbWVzc2FnZSB0byBkaXNwbGF5IHRvIHVzZXIKLQkgKiBAcmV0dXJuIHRoZSBjb2xsZWN0aW9uIG9mIHNlbGVjdGVkIGVsZW1lbnRzLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZgotCSAqICAgICAgICAgdGhlIHNlbGVjdGlvbiB3YXMgY2FuY2VsZWQuCi0JICovCi0JTGlzdCBzZWxlY3QoTGlzdCBvYmplY3RzVG9TZWxlY3QsIElJdGVtTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyLAotCQkJYm9vbGVhbiBtdWx0aXBsZSwgTGlzdCBpbnRpdGlhbFNlbGVjdGlvbiwgU3RyaW5nIHRpdGxlLCBTdHJpbmcgbXNnKTsKLQotCS8qKgotCSAqIFNlbGVjdHMgb25seSBvbmUgYWN0aW9uIGZyb20gdGhlIGdpdmVuIGFycmF5IG9mIGFjdGlvbnMuIFRoZSBhY3Rpb25zIG11c3QKLQkgKiBiZSB0aGUgY29uc3RhbnRzIHtAbGluayAjQUNUSU9OX0FCT1JUfSwge0BsaW5rICNBQ1RJT05fQ0FOQ0VMfSwKLQkgKiB7QGxpbmsgI0FDVElPTl9PS30sIHtAbGluayAjQUNUSU9OX1JFVFJZfSwgQUNUSU9OX1hYWAotCSAqIAotCSAqIEBwYXJhbSBhY3Rpb25zCi0JICogQHBhcmFtIHRpdGxlCi0JICogQHBhcmFtIG1zZwotCSAqIEBwYXJhbSBzdGF0dXMKLQkgKiBAcmV0dXJuCi0JICovCi0JaW50IHNlbGVjdE9uZShpbnRbXSBhY3Rpb25zLCBTdHJpbmcgdGl0bGUsIFN0cmluZyBtc2csIElTdGF0dXMgc3RhdHVzKTsKLQotCS8qKgotCSAqIFJlcXVlc3RzIHVzZXIgaW5wdXRzLgotCSAqIAotCSAqIEBwYXJhbSB0aXRsZQotCSAqIEBwYXJhbSBtc2cKLQkgKiBAcGFyYW0gdXNlcklucHV0cwotCSAqICAgICAgICAgICAgbGlzdCBvZiB7QGxpbmsgVXNlcklucHV0IHVzZXIgaW5wdXRzfSB0aGF0IGhhdmUgaW5mb3JtYXRpb24KLQkgKiAgICAgICAgICAgIGFib3V0IGlucHV0IHJlcXVlc3RzIGFuZCByZWZlcmVuY2UgdG8gdGhlIGlucHV0LiBUaGUgaW5wdXQKLQkgKiAgICAgICAgICAgIHJlZmVyZW5jZSBzaG91bGQgYmUgc2V0IHRvIHRoZSBvYmplY3QgdGhhdCB1c2VyIHNwZWNpZmllZCBvcgotCSAqICAgICAgICAgICAgc2VsZWN0ZWQuCi0JICogQHJldHVybiBmYWxzZSBpZiB1c2VyIGNhbmNlbGxlZCB0aGlzIHJlcXVlc3QKLQkgKi8KLQlib29sZWFuIHJlcXVlc3RJbnB1dChTdHJpbmcgdGl0bGUsIFN0cmluZyBtc2csIExpc3Q8VXNlcklucHV0PiB1c2VySW5wdXRzKTsKLQotCS8qKgotCSAqIEdldHMgVUkgY29udGV4dAotCSAqIAotCSAqIEByZXR1cm4gdGhlIFVJIGNvbnRleHQKLQkgKi8KLQlPYmplY3QgZ2V0VUlDb250ZXh0KCk7Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBtZXNzZW5nZXIKLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JSU1lc3NlbmdlciBnZXRNZXNzZW5nZXIoKTsKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29tbWFuZC9NZXRob2RFbGVtZW50QWRkQ29tbWFuZC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb21tYW5kL01ldGhvZEVsZW1lbnRBZGRDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlY2E1MjEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb21tYW5kL01ldGhvZEVsZW1lbnRBZGRDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjk4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOwotaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwLkVudHJ5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk11bHRpU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5PcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kV3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQWJzdHJhY3RUcmVlSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FQ29udGVudHNFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuWE1MVHlwZVBhY2thZ2UuTGl0ZXJhbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5BZGRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuU3RyVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51aS5Vc2VySW50ZXJhY3Rpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkV4dGVuc2lvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLklSdW5uYWJsZVdpdGhQcm9ncmVzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuSVRleHRSZWZlcmVuY2VSZXBsYWNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuTWVzc2VuZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5NaXNjOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbi5BYnN0cmFjdFN0cmluZ1ZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb24uSVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb24uSVZhbGlkYXRvckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLk5hbWVDaGVja2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbi5pbnRlcm5hbC5Db250ZW50RWxlbWVudE5hbWVWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLmludGVybmFsLlVuaXF1ZW5lc3NWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLmludGVybmFsLlZhbGlkYXRvckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzLklGaWxlQmFzZWRMaWJyYXJ5UGVyc2lzdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy5JTGlicmFyeVBlcnNpc3RlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VydmljZXMuU2VydmljZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5OYW1lZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0VsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0LmRvbWFpbi5UcmFjZWFibGVBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkFzc29jaWF0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5Db250ZW50RGVzY3JpcHRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5NZXNzYWdlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5VbWFVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLS8qKgotICogVGhpcyBjb21tYW5kIGlzIHVzZWQgdG8gYWRkIGEgbWV0aG9kIGVsZW1lbnQgdG8gYSBjb250YWluaW5nIG1ldGhvZCBlbGVtZW50LgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIE1ldGhvZEVsZW1lbnRBZGRDb21tYW5kIGV4dGVuZHMgQ29tbWFuZFdyYXBwZXIgaW1wbGVtZW50cwotCQlJUmVzb3VyY2VBd2FyZUNvbW1hbmQgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgTWFwPEVDbGFzcywgQ29sbGVjdGlvbjxFU3RydWN0dXJhbEZlYXR1cmU+PiB0eXBlVG9FeGNsdWRlZEZlYXR1cmVzRnJvbUNoZWNrID0gbmV3IEhhc2hNYXA8RUNsYXNzLCBDb2xsZWN0aW9uPEVTdHJ1Y3R1cmFsRmVhdHVyZT4+KCk7Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIGV4Y2x1ZGVGcm9tQ2hlY2soRUNsYXNzIHR5cGUsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKSB7Ci0JCUNvbGxlY3Rpb248RVN0cnVjdHVyYWxGZWF0dXJlPiBmZWF0dXJlcyA9IHR5cGVUb0V4Y2x1ZGVkRmVhdHVyZXNGcm9tQ2hlY2suZ2V0KHR5cGUpOwotCQlpZihmZWF0dXJlcyA9PSBudWxsKSB7Ci0JCQlmZWF0dXJlcyA9IG5ldyBIYXNoU2V0PEVTdHJ1Y3R1cmFsRmVhdHVyZT4oKTsKLQkJfQotCQlmZWF0dXJlcy5hZGQoZmVhdHVyZSk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gY2FuVW5kbyA9IHRydWU7Ci0KLQlwcm90ZWN0ZWQgQWRkQ29tbWFuZCBhZGRDb21tYW5kOwotCi0JLy8gcHJvdGVjdGVkIE1hcCBlbGVtZW50VG9OZXdOYW1lTWFwOwotCXByb3RlY3RlZCBNYXAgZWxlbWVudFRvT2xkUGx1Z2luTWFwOwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gcmVtb3ZlWFJlZlJlcXVpcmVkOwotCi0JcHJvdGVjdGVkIE1ldGhvZFBsdWdpbiBvd25lclBsdWdpbjsKLQotCXByb3RlY3RlZCBBcnJheUxpc3QgYWRkTGlzdDsKLQotCXByb3RlY3RlZCBNdWx0aVN0YXR1cyBzdGF0dXMgPSBuZXcgTXVsdGlTdGF0dXMoTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCS5nZXRTeW1ib2xpY05hbWUoKSwgSVN0YXR1cy5PSywgIiIsIG51bGwpOyAvLyROT04tTkxTLTEkCi0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBydW5XaXRoUHJvZ3Jlc3M7Ci0KLQlwcm90ZWN0ZWQgQXJyYXlMaXN0PEVTdHJ1Y3R1cmFsRmVhdHVyZT4gZmVhdHVyZXNUb0NoZWNrOwotCi0JcHJpdmF0ZSBBcnJheUxpc3QgbmVzdGVkQ29tbWFuZHM7Ci0KLQlwcml2YXRlIEhhc2hTZXQgbW9kaWZpZWRSZXNvdXJjZXM7Ci0KLQlwdWJsaWMgTWV0aG9kRWxlbWVudEFkZENvbW1hbmQoQ29tbWFuZCBjb21tYW5kKSB7Ci0JCXRoaXMoY29tbWFuZCwgdHJ1ZSk7Ci0JfQotCi0JcHVibGljIE1ldGhvZEVsZW1lbnRBZGRDb21tYW5kKENvbW1hbmQgY29tbWFuZCwgYm9vbGVhbiBydW5XaXRoUHJvZ3Jlc3MpIHsKLQkJc3VwZXIoY29tbWFuZCk7Ci0JCWFkZENvbW1hbmQgPSAoQWRkQ29tbWFuZCkgVG5nVXRpbC51bndyYXAoY29tbWFuZCk7Ci0JCXNldFJ1bldpdGhQcm9ncmVzcyhydW5XaXRoUHJvZ3Jlc3MpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFJ1bldpdGhQcm9ncmVzcyhib29sZWFuIHJ1bldpdGhQcm9ncmVzcykgewotCQl0aGlzLnJ1bldpdGhQcm9ncmVzcyA9IHJ1bldpdGhQcm9ncmVzczsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjYW5VbmRvKCkgewotCQlyZXR1cm4gY2FuVW5kbzsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kV3JhcHBlciNnZXRSZXN1bHQoKQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldFJlc3VsdCgpIHsKLQkJaWYgKHN0YXR1cy5pc09LKCkpIHsKLQkJCXJldHVybiBzdXBlci5nZXRSZXN1bHQoKTsKLQkJfQotCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaGFuZGxlRXJyb3IoSVN0YXR1cyBlcnJvclN0YXR1cykgewotCQlNZXNzZW5nZXIuSU5TVEFOQ0Uuc2hvd0Vycm9yKGdldExhYmVsKCksIExpYnJhcnlFZGl0UmVzb3VyY2VzLmNyZWF0ZUVsZW1lbnRFcnJvcl9tc2csIGVycm9yU3RhdHVzKTsKLQkJc3RhdHVzLmFkZChlcnJvclN0YXR1cyk7Ci0JCXN0YXR1cy5hZGRBbGwoZXJyb3JTdGF0dXMpOwotCQlyZXR1cm47Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmRXcmFwcGVyI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7CQotCQkvLyBkaXNwb3NlIHRoZSBuZXN0ZWQgY29tbWFuZHMKLQkJaWYgKG5lc3RlZENvbW1hbmRzICE9IG51bGwgJiYgIW5lc3RlZENvbW1hbmRzLmlzRW1wdHkoKSkgewotCQkJZm9yIChpbnQgaSA9IG5lc3RlZENvbW1hbmRzLnNpemUoKSAtIDE7IGkgPiAtMTsgaS0tKSB7Ci0JCQkJQ29tbWFuZCBjbWQgPSAoQ29tbWFuZCkgbmVzdGVkQ29tbWFuZHMuZ2V0KGkpOwotCQkJCXRyeSB7Ci0JCQkJCWNtZC5kaXNwb3NlKCk7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KLQkKLQkKLQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQlPYmplY3Qgc2hlbGwgPSBMaWJyYXJ5RWRpdFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0Q29udGV4dCgpOwotCQkvLyBDaGVjayB3aGV0aGVyIHRoZSBvd25lciByZXNvdXJjZSBjYW4gYmUgbW9kaWZpZWQuCi0JCS8vCi0JCUNvbGxlY3Rpb24gcmVzb3VyY2VzVG9DaGFuZ2UgPSBnZXRNb2RpZmllZFJlc291cmNlcygpOwotCQlJU3RhdHVzIGV4ZWNTdGF0dXMgPSBVc2VySW50ZXJhY3Rpb25IZWxwZXIuY2hlY2tNb2RpZnkoCi0JCQkJcmVzb3VyY2VzVG9DaGFuZ2UsIHNoZWxsKTsKLQkJaWYgKCFleGVjU3RhdHVzLmlzT0soKSkgewotCQkJaGFuZGxlRXJyb3IoZXhlY1N0YXR1cyk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJZXhlY1N0YXR1cyA9IFVzZXJJbnRlcmFjdGlvbkhlbHBlci5jaGVja0NvbmZpZ3VyYXRpb25zVG9VcGRhdGUoCi0JCQkJYWRkQ29tbWFuZCwgc2hlbGwpOwotCQlpZiAoIWV4ZWNTdGF0dXMuaXNPSygpKSB7Ci0JCQloYW5kbGVFcnJvcihleGVjU3RhdHVzKTsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAod2lsbFNhdmVNb2RpZmllZFJlc291cmNlcygpCi0JCQkJJiYgIVVzZXJJbnRlcmFjdGlvbkhlbHBlci5jaGVja091dE9mU3luY2gocmVzb3VyY2VzVG9DaGFuZ2UpKSB7Ci0JCQlzdGF0dXMuYWRkKFN0YXR1cy5DQU5DRUxfU1RBVFVTKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCS8vIGlmKCFjaGVja0ZvbGRlcihzaGVsbCkpIHsKLQkJLy8gcmV0dXJuOwotCQkvLyB9Ci0KLQkJZG9BZGQoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kV3JhcHBlciN1bmRvKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bmRvKCkgewotCQl1bmRvTmVzdGVkQ29tbWFuZHMoKTsKLQkJc3VwZXIudW5kbygpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgdm9pZCB1bmRvTmVzdGVkQ29tbWFuZHMoKSB7Ci0JCWlmIChuZXN0ZWRDb21tYW5kcyAhPSBudWxsICYmICFuZXN0ZWRDb21tYW5kcy5pc0VtcHR5KCkpIHsKLQkJCWZvciAoaW50IGkgPSBuZXN0ZWRDb21tYW5kcy5zaXplKCkgLSAxOyBpID4gLTE7IGktLSkgewotCQkJCUNvbW1hbmQgY21kID0gKENvbW1hbmQpIG5lc3RlZENvbW1hbmRzLmdldChpKTsKLQkJCQl0cnkgewotCQkJCQlpZiAoY21kLmNhblVuZG8oKSkgewotCQkJCQkJY21kLnVuZG8oKTsKLQkJCQkJfQotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCUxpYnJhcnlFZGl0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCQl9IGZpbmFsbHkgewotCQkJCQl0cnkgewotCQkJCQkJY21kLmRpc3Bvc2UoKTsKLQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gY2hlY2tGb2xkZXIoT2JqZWN0IHNoZWxsKSB7Ci0JCS8vIGlmIGFueSBvZiB0aGUgZWxlbWVudHMgdG8gYmUgYWRkZWQgd2lsbCBiZSBzYXZlZCBpbiBpdHMgb3duIGZpbGUKLQkJLy8gY2hlY2sgaWYgdGhlIGZvbGRlciB0byBzYXZlIHRoZSBmaWxlIHRvIGNhbiBiZSBtb2RpZmllZAotCQkvLwotCQlJRmlsZUJhc2VkTGlicmFyeVBlcnNpc3RlciBwZXJzaXN0ZXIgPSAoSUZpbGVCYXNlZExpYnJhcnlQZXJzaXN0ZXIpIFNlcnZpY2VzLmdldExpYnJhcnlQZXJzaXN0ZXIoU2VydmljZXMuWE1JX1BFUlNJU1RFTkNFX1RZUEUpOwotCQlBcnJheUxpc3QgZm9sZGVyc1RvQ2hlY2sgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGFkZENvbW1hbmQuZ2V0Q29sbGVjdGlvbigpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGVsZW1lbnQgPSBUbmdVdGlsLnVud3JhcChpdGVyLm5leHQoKSk7Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQKLQkJCQkJJiYgcGVyc2lzdGVyLmhhc093blJlc291cmNlKGVsZW1lbnQpKSB7Ci0JCQkJU3RyaW5nIGZvbGRlciA9IHBlcnNpc3Rlci5nZXRGb2xkZXJSZWxhdGl2ZVBhdGgoCi0JCQkJCQkJCShNZXRob2RFbGVtZW50KSBlbGVtZW50KTsKLQkJCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4oYWRkQ29tbWFuZAotCQkJCQkJLmdldE93bmVyKCkpOwotCQkJCVN0cmluZyBiYXNlRm9sZGVyID0gbnVsbDsKLQkJCQlpZiAocGx1Z2luID09IG51bGwpIHsKLQkJCQkJTWV0aG9kTGlicmFyeSBsaWIgPSBVbWFVdGlsLmdldE1ldGhvZExpYnJhcnkoYWRkQ29tbWFuZAotCQkJCQkJCS5nZXRPd25lcigpKTsKLQkJCQkJYmFzZUZvbGRlciA9IG5ldyBGaWxlKGxpYi5lUmVzb3VyY2UoKS5nZXRVUkkoKQotCQkJCQkJCS50b0ZpbGVTdHJpbmcoKSkuZ2V0UGFyZW50KCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJYmFzZUZvbGRlciA9IG5ldyBGaWxlKHBsdWdpbi5lUmVzb3VyY2UoKS5nZXRVUkkoKQotCQkJCQkJCS50b0ZpbGVTdHJpbmcoKSkuZ2V0UGFyZW50KCk7Ci0JCQkJfQotCQkJCWZvbGRlcnNUb0NoZWNrLmFkZChiYXNlRm9sZGVyICsgRmlsZS5zZXBhcmF0b3IgKyBmb2xkZXIpOwotCQkJfQotCQl9Ci0JCWlmICghZm9sZGVyc1RvQ2hlY2suaXNFbXB0eSgpKSB7Ci0JCQlTdHJpbmdbXSBmb2xkZXJzID0gbmV3IFN0cmluZ1tmb2xkZXJzVG9DaGVjay5zaXplKCldOwotCQkJZm9sZGVyc1RvQ2hlY2sudG9BcnJheShmb2xkZXJzKTsKLQkJCUlTdGF0dXMgc3RhdHVzID0gU2VydmljZXMuZ2V0RmlsZU1hbmFnZXIoKQotCQkJCQkuY2hlY2tNb2RpZnkoZm9sZGVycywgc2hlbGwpOwotCQkJaWYgKCFzdGF0dXMuaXNPSygpKSB7Ci0JCQkJaGFuZGxlRXJyb3Ioc3RhdHVzKTsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgSVN0YXR1cyBnZXRTdGF0dXMoKSB7Ci0JCXJldHVybiBzdGF0dXM7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc01vdmUoKSB7Ci0JCUNvbW1hbmQgY21kID0gVG5nVXRpbC51bndyYXAoY29tbWFuZCk7Ci0JCWlmIChjbWQgaW5zdGFuY2VvZiBBZGRDb21tYW5kKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSAoKEFkZENvbW1hbmQpIGNtZCkuZ2V0Q29sbGVjdGlvbigpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQlFT2JqZWN0IGVsZW1lbnQgPSAoRU9iamVjdCkgaXRlci5uZXh0KCk7Ci0JCQkJaWYgKFVtYVV0aWwuZ2V0TWV0aG9kUGx1Z2luKGVsZW1lbnQpID09IG51bGwpIHsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIG93bmVyUGx1Z2luCi0JICogQHBhcmFtIGUKLQkgKiBAcmV0dXJuIExpc3Qgb2YgUmVmZXJlbmNlIG9iamVjdHMgdGhhdCBrZWVwcyB0aGUgaW5mbyBvZiBpbGxlZ2FsIG91dGdvaW5nCi0JICogICAgICAgICByZWZlcmVuY2VzCi0JICogQHNlZSBSZWZlcmVuY2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIENvbGxlY3Rpb248UmVmZXJlbmNlPiBnZXRJbGxlZ2FsT3V0Z29pbmdSZWZlcmVuY2VzKAotCQkJTWV0aG9kUGx1Z2luIG93bmVyUGx1Z2luLCBFT2JqZWN0IGUsIENvbGxlY3Rpb248UmVmZXJlbmNlPiBpbGxlZ2FsUmVmZXJlbmNlcykgewotCQlpZiAoaWxsZWdhbFJlZmVyZW5jZXMgPT0gbnVsbCkgewotCQkJaWxsZWdhbFJlZmVyZW5jZXMgPSBuZXcgQXJyYXlMaXN0PFJlZmVyZW5jZT4oKTsKLQkJfQotCQlmb3IgKEVDb250ZW50c0VMaXN0LkZlYXR1cmVJdGVyYXRvcjxFT2JqZWN0PiBmZWF0dXJlSXRlcmF0b3IgPSAoRUNvbnRlbnRzRUxpc3QuRmVhdHVyZUl0ZXJhdG9yPEVPYmplY3Q+KSBlCi0JCQkJLmVDcm9zc1JlZmVyZW5jZXMoKS5pdGVyYXRvcigpOyBmZWF0dXJlSXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJRU9iamVjdCBlT2JqZWN0ID0gKEVPYmplY3QpIGZlYXR1cmVJdGVyYXRvci5uZXh0KCk7Ci0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IGZlYXR1cmVJdGVyYXRvci5mZWF0dXJlKCk7Ci0JCQlpZiAoIWZlYXR1cmUuaXNEZXJpdmVkKCkpIHsKLQkJCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4oZU9iamVjdCk7Ci0JCQkJaWYgKHBsdWdpbiAhPSBudWxsICYmIHBsdWdpbiAhPSBvd25lclBsdWdpbgotCQkJCQkJJiYgIU1pc2MuaXNCYXNlT2YocGx1Z2luLCBvd25lclBsdWdpbikpIHsKLQkJCQkJLy8gaWxsZWdhbCByZWZlcmVuY2UgdG8gYmUgcmVtb3ZlZAotCQkJCQkvLwotCQkJCQlpbGxlZ2FsUmVmZXJlbmNlcwotCQkJCQkJCS5hZGQobmV3IFJlZmVyZW5jZShlLCBmZWF0dXJlLCBlT2JqZWN0LCAtMSkpOwotCQkJCQlpZiAoZmVhdHVyZSA9PSBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCS5nZXRWYXJpYWJpbGl0eUVsZW1lbnRfVmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpKSB7Ci0JCQkJCQlmZWF0dXJlID0gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VmFyaWFiaWxpdHlFbGVtZW50X1ZhcmlhYmlsaXR5VHlwZSgpOwotCQkJCQkJaWxsZWdhbFJlZmVyZW5jZXMKLQkJCQkJCQkuYWRkKG5ldyBSZWZlcmVuY2UoZSwgZmVhdHVyZSwgZS5lR2V0KGZlYXR1cmUpLCAtMSkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBpbGxlZ2FsUmVmZXJlbmNlczsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHJlbW92ZVJlZmVyZW5jZXMoQ29sbGVjdGlvbjxSZWZlcmVuY2U+IHJlZmVyZW5jZXMpIHsKLQkJZm9yIChSZWZlcmVuY2UgcmVmOiByZWZlcmVuY2VzKSB7Ci0JCQlpZiAocmVmLmZlYXR1cmUuaXNNYW55KCkpIHsKLQkJCQlMaXN0PD8+IGxpc3QgPSAoKExpc3Q8Pz4pIHJlZi5vd25lci5lR2V0KHJlZi5mZWF0dXJlKSk7Ci0JCQkJbGlzdC5yZW1vdmUocmVmLnZhbHVlKTsKLQkJCX0gZWxzZSB7Ci0JCQkJcmVmLm93bmVyLmVTZXQocmVmLmZlYXR1cmUsIG51bGwpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiBAcmV0dXJuIExpc3Qgb2YgUmVmZXJlbmNlIG9iamVjdHMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIENvbGxlY3Rpb248UmVmZXJlbmNlPiByZW1vdmVJbGxlZ2FsUmVmZXJlbmNlcyhNZXRob2RQbHVnaW4gb3duZXJQbHVnaW4sCi0JCQlFT2JqZWN0IGUpIHsKLQkJQ29sbGVjdGlvbjxSZWZlcmVuY2U+IHJlbW92ZVJlZnMgPSBnZXRJbGxlZ2FsT3V0Z29pbmdSZWZlcmVuY2VzKG93bmVyUGx1Z2luLCBlLAotCQkJCW51bGwpOwotCi0JCS8vIHJlbW92ZSBpbGxlZ2FsIHJlZmVyZW5jZXMKLQkJLy8KLQkJcmVtb3ZlUmVmZXJlbmNlcyhyZW1vdmVSZWZzKTsKLQotCQlyZXR1cm4gcmVtb3ZlUmVmczsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGhhc05leHQoSXRlcmF0b3IgaXRlcikgewotCQl0cnkgewotCQkJcmV0dXJuIGl0ZXIuaGFzTmV4dCgpOwotCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGV4KSB7Ci0JCQl0aHJvdyBleDsKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBoYXNJbGxlZ2FsUmVmZXJlbmNlKE1ldGhvZFBsdWdpbiBvd25lclBsdWdpbiwKLQkJCUVPYmplY3QgZSwgQ29sbGVjdGlvbiBtb3ZlTGlzdCkgewotCQlmb3IgKEVDb250ZW50c0VMaXN0LkZlYXR1cmVJdGVyYXRvciBmZWF0dXJlSXRlcmF0b3IgPSAoRUNvbnRlbnRzRUxpc3QuRmVhdHVyZUl0ZXJhdG9yKSBlCi0JCQkJLmVDcm9zc1JlZmVyZW5jZXMoKS5pdGVyYXRvcigpOyBoYXNOZXh0KGZlYXR1cmVJdGVyYXRvcik7KSB7Ci0JCQlFT2JqZWN0IGVPYmplY3QgPSAoRU9iamVjdCkgZmVhdHVyZUl0ZXJhdG9yLm5leHQoKTsKLQotCQkJLy8gY2hlY2sgaWYgdGhlIHgtcmVmIG9iamVjdCBpcyBpbiB0aGUgbW92ZSBsaXN0Ci0JCQkvLwotCQkJaWYgKCFtb3ZlTGlzdC5jb250YWlucyhlT2JqZWN0KSkgewotCQkJCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSBVbWFVdGlsLmdldE1ldGhvZFBsdWdpbihlT2JqZWN0KTsKLQkJCQlpZiAocGx1Z2luICE9IG51bGwgJiYgcGx1Z2luICE9IG93bmVyUGx1Z2luCi0JCQkJCQkmJiAhTWlzYy5pc0Jhc2VPZihwbHVnaW4sIG93bmVyUGx1Z2luKSkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIENoZWNrcyBpZiB0aGUgZ2l2ZW4gTWV0aG9kRWxlbWVudCBpcyByZWZlcmVuY2VkIGlsbGVnYWxseSBhZnRlciB0aGUgbW92ZS4KLQkgKiAKLQkgKiBAcGFyYW0gb3duZXJQbHVnaW4KLQkgKiBAcGFyYW0gZQotCSAqIEBwYXJhbSBtb3ZlTGlzdAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNSZWZlcmVuY2VkSWxsZWdhbGx5KE1ldGhvZFBsdWdpbiBvd25lclBsdWdpbiwKLQkJCU1ldGhvZEVsZW1lbnQgZSwgQ29sbGVjdGlvbiBtb3ZlTGlzdCkgewotCQlDb2xsZWN0aW9uIHJlZmVyZW5jZXMgPSBBc3NvY2lhdGlvbkhlbHBlci5nZXRSZWZlcmVuY2VzKGUpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSByZWZlcmVuY2VzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJTWV0aG9kRWxlbWVudCBlbGVtZW50ID0gKE1ldGhvZEVsZW1lbnQpIGl0ZXIubmV4dCgpOwotCi0JCQlpZiAoaXNFeGNsdWRlZEZyb21PdXRnb2luZ1JlZmVyZW5jZUNoZWNrKGVsZW1lbnQpKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0KLQkJCWlmICghbW92ZUxpc3QuY29udGFpbnMoZWxlbWVudCkpIHsKLQkJCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4oZWxlbWVudCk7Ci0JCQkJaWYgKHBsdWdpbiAhPSBudWxsICYmIHBsdWdpbiAhPSBvd25lclBsdWdpbgotCQkJCQkJJiYgIU1pc2MuaXNCYXNlT2Yob3duZXJQbHVnaW4sIHBsdWdpbikpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGNoZWNrTW9kaWZ5KEVPYmplY3QgZWxlbWVudCkgewotCQlJU3RhdHVzIHN0YXR1cyA9IFRuZ1V0aWwuY2hlY2tFZGl0KGVsZW1lbnQsIG51bGwpOwotCQlpZiAoIXN0YXR1cy5pc09LKCkpIHsKLQkJCXRocm93IG5ldyBNZXNzYWdlRXhjZXB0aW9uKFRuZ1V0aWwuZ2V0TWVzc2FnZShzdGF0dXMpKTsKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgQ29sbGVjdGlvbiByZW1vdmVJbGxlZ2FsUmVmZXJlbmNlc1RvKAotCQkJTWV0aG9kUGx1Z2luIG93bmVyUGx1Z2luLCBNZXRob2RFbGVtZW50IGUsIENvbGxlY3Rpb24gbW92ZUxpc3QpIHsKLQkJQXJyYXlMaXN0IGFmZmVjdGVkUmVmZXJlbmNlcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUNvbGxlY3Rpb24gcmVmZXJlbmNlcyA9IEFzc29jaWF0aW9uSGVscGVyLmdldFJlZmVyZW5jZXMoZSk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHJlZmVyZW5jZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlNZXRob2RFbGVtZW50IGVsZW1lbnQgPSAoTWV0aG9kRWxlbWVudCkgaXRlci5uZXh0KCk7Ci0JCQlpZiAoIW1vdmVMaXN0LmNvbnRhaW5zKGVsZW1lbnQpKSB7Ci0JCQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IFVtYVV0aWwuZ2V0TWV0aG9kUGx1Z2luKGVsZW1lbnQpOwotCQkJCWlmIChwbHVnaW4gIT0gbnVsbCAmJiBwbHVnaW4gIT0gb3duZXJQbHVnaW4KLQkJCQkJCSYmICFNaXNjLmlzQmFzZU9mKG93bmVyUGx1Z2luLCBwbHVnaW4pKSB7Ci0JCQkJCWNoZWNrTW9kaWZ5KGVsZW1lbnQpOwotCQkJCQlyZW1vdmVSZWZlcmVuY2VzKGVsZW1lbnQsIGUpOwotCQkJCQlhZmZlY3RlZFJlZmVyZW5jZXJzLmFkZChlbGVtZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGFmZmVjdGVkUmVmZXJlbmNlcnM7Ci0JfQotCi0JLyoqCi0JICogR2V0cyBhbGwgY3Jvc3MgcmVmZXJlbmNlcyBvZiA8Y29kZT5yZWZlcmVuY2VyPC9jb2RlPiB0bwotCSAqIDxjb2RlPnJlZmVyZW5jZWQ8L2NvZGU+Ci0JICogCi0JICogQHBhcmFtIHJlZmVyZW5jZXIKLQkgKiBAcGFyYW0gcmVmZXJlbmNlZAotCSAqIEBwYXJhbSB4UmVmZXJlbmNlcwotCSAqICAgICAgICAgICAgb3V0cHV0IGNvbGxlY3Rpb24gb2YgRVN0cnVjdHVyYWxGZWF0dXJlIG9iamVjdHMKLQkgKiBAcmV0dXJuIGNvbGxlY3Rpb24gb2YgRVN0cnVjdHVyYWxGZWF0dXJlIG9iamVjdHMKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBDb2xsZWN0aW9uIGdldFhSZWZlcmVuY2VzKEVPYmplY3QgcmVmZXJlbmNlciwKLQkJCUVPYmplY3QgcmVmZXJlbmNlZCwgQ29sbGVjdGlvbiB4UmVmZXJlbmNlcykgewotCQlpZiAoeFJlZmVyZW5jZXMgPT0gbnVsbCkgewotCQkJeFJlZmVyZW5jZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCX0KLQkJZm9yIChFQ29udGVudHNFTGlzdC5GZWF0dXJlSXRlcmF0b3IgZmVhdHVyZUl0ZXJhdG9yID0gKEVDb250ZW50c0VMaXN0LkZlYXR1cmVJdGVyYXRvcikgcmVmZXJlbmNlcgotCQkJCS5lQ3Jvc3NSZWZlcmVuY2VzKCkuaXRlcmF0b3IoKTsgZmVhdHVyZUl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCUVPYmplY3QgZU9iamVjdCA9IChFT2JqZWN0KSBmZWF0dXJlSXRlcmF0b3IubmV4dCgpOwotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBmZWF0dXJlSXRlcmF0b3IuZmVhdHVyZSgpOwotCQkJLy8gaWYoZmVhdHVyZS5pc01hbnkoKSkgewotCQkJLy8gaWYoKChMaXN0KXJlZmVyZW5jZXIuZUdldChmZWF0dXJlKSkuY29udGFpbnMocmVmZXJlbmNlZCkpIHsKLQkJCS8vIHhSZWZlcmVuY2VzLmFkZChmZWF0dXJlKTsKLQkJCS8vIH0KLQkJCS8vIH0KLQkJCS8vIGVsc2UKLQkJCWlmIChlT2JqZWN0ID09IHJlZmVyZW5jZWQpIHsKLQkJCQl4UmVmZXJlbmNlcy5hZGQoZmVhdHVyZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHhSZWZlcmVuY2VzOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSBhbGwgcmVmZXJlbmNlcyB0byA8Y29kZT5yZWZlcmVuY2VkPC9jb2RlPiBmcm9tCi0JICogPGNvZGU+cmVmZXJlbmNlcjwvY29kZT4KLQkgKiAKLQkgKiBAcGFyYW0gcmVmZXJlbmNlcgotCSAqIEBwYXJhbSByZWZlcmVuY2VkCi0JICogQHJldHVybiBDb2xsZWN0aW9uIG9mIHJlZmVyZW5jZXMgdG8gdGhlIDxjb2RlPnJlZmVyZW5jZWQ8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBDb2xsZWN0aW9uIHJlbW92ZVJlZmVyZW5jZXMoRU9iamVjdCByZWZlcmVuY2VyLAotCQkJRU9iamVjdCByZWZlcmVuY2VkKSB7Ci0JCUNvbGxlY3Rpb24gcmVtb3ZlUmVmcyA9IGdldFhSZWZlcmVuY2VzKHJlZmVyZW5jZXIsIHJlZmVyZW5jZWQsIG51bGwpOwotCi0JCS8vIHJlbW92ZSBpbGxlZ2FsIHJlZmVyZW5jZXMKLQkJLy8KLQkJZm9yIChJdGVyYXRvciBpdGVyID0gcmVtb3ZlUmVmcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmID0gKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgaXRlci5uZXh0KCk7Ci0JCQlpZiAoZi5pc01hbnkoKSkgewotCQkJCSgoQ29sbGVjdGlvbikgcmVmZXJlbmNlci5lR2V0KGYpKS5yZW1vdmUocmVmZXJlbmNlZCk7Ci0JCQl9IGVsc2UgewotCQkJCXJlZmVyZW5jZXIuZVNldChmLCBudWxsKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiByZW1vdmVSZWZzOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBoYXNJbGxlZ2FsUmVmZXJlbmNlSW5jbHVkaW5nQWxsQ2hpbGRyZW4oCi0JCQlNZXRob2RQbHVnaW4gb3duZXJQbHVnaW4sIE1ldGhvZEVsZW1lbnQgZSwgQ29sbGVjdGlvbiBtb3ZlTGlzdCkgewotCQlpZiAob3duZXJQbHVnaW4gPT0gVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4oZSkpIHsKLQkJCS8vIG1vdmUgd2l0aGluIHRoZSBzYW1lIHBsdWdpbiwgbm8gZnVydGhlciBjaGVjawotCQkJLy8KLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlpZiAoaGFzSWxsZWdhbFJlZmVyZW5jZShvd25lclBsdWdpbiwgZSwgbW92ZUxpc3QpKQotCQkJcmV0dXJuIHRydWU7Ci0JCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBlLmVBbGxDb250ZW50cygpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQlpZiAoaGFzSWxsZWdhbFJlZmVyZW5jZShvd25lclBsdWdpbiwgKEVPYmplY3QpIGl0ZXJhdG9yLm5leHQoKSwKLQkJCQkJbW92ZUxpc3QpKQotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzdXBlckV4ZWN1dGUoKSB7Ci0JCXN1cGVyLmV4ZWN1dGUoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29sbGVjdGlvbiBnZXRGZWF0dXJlc1RvQ2hlY2soKSB7Ci0JCWlmIChmZWF0dXJlc1RvQ2hlY2sgPT0gbnVsbCkgewotCQkJZmVhdHVyZXNUb0NoZWNrID0gbmV3IEFycmF5TGlzdDxFU3RydWN0dXJhbEZlYXR1cmU+KCk7Ci0JCQlmZWF0dXJlc1RvQ2hlY2suYWRkKFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE5hbWVkRWxlbWVudF9OYW1lKCkpOwotCQkJCi0JCX0KLQkJcmV0dXJuIGZlYXR1cmVzVG9DaGVjazsKLQl9Ci0KLQlwcm90ZWN0ZWQgSVZhbGlkYXRvciBjcmVhdGVWYWxpZGF0b3IoRU9iamVjdCBlLCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSkgewotCQlJVmFsaWRhdG9yIHZhbGlkYXRvciA9IG51bGw7Ci0KLQkJaWYoYWRkQ29tbWFuZC5nZXRGZWF0dXJlKCkgaW5zdGFuY2VvZiBFUmVmZXJlbmNlKXsKLQkJCXZhbGlkYXRvciA9IElWYWxpZGF0b3JGYWN0b3J5LklOU1RBTkNFLmNyZWF0ZVZhbGlkYXRvcihhZGRDb21tYW5kLmdldE93bmVyKCksIChFUmVmZXJlbmNlKSBhZGRDb21tYW5kLmdldEZlYXR1cmUoKSwgKEVDbGFzcyludWxsLCBlLCBmZWF0dXJlKTsKLQkJfQotCi0JCXJldHVybiB2YWxpZGF0b3I7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGUKLQkgKiBAcGFyYW0gb2JqZWN0c1RvQ2hlY2tOYW1lCi0JICovCi0JcHJpdmF0ZSB2b2lkIGdldE9mZlN0cmluZ1RvQ2hlY2tOYW1lKE9iamVjdCBlLCBDb2xsZWN0aW9uIG9iamVjdHNUb0NoZWNrTmFtZSkgewotCQkvLyBpZihhZGRDb21tYW5kLmdldE93bmVyKCkgaW5zdGFuY2VvZiBDb250ZW50UGFja2FnZSAmJgotCQkvLyBhZGRDb21tYW5kLmdldEZlYXR1cmUoKSA9PQotCQkvLyBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRNZXRob2RQYWNrYWdlX0NoaWxkUGFja2FnZXMoKQotCQkvLyAmJiBlIGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UpIHsKLQkJLy8gZm9yIChJdGVyYXRvciBpdGVyID0gKChDb250ZW50UGFja2FnZSllKS5lQWxsQ29udGVudHMoKTsKLQkJLy8gaXRlci5oYXNOZXh0KCk7KSB7Ci0JCS8vIE9iamVjdCBlbGVtZW50ID0gaXRlci5uZXh0KCk7Ci0JCS8vIGlmKGVsZW1lbnQgaW5zdGFuY2VvZiBDb250ZW50RWxlbWVudCkgewotCQkvLyBvYmplY3RzVG9DaGVja05hbWUuYWRkKGVsZW1lbnQpOwotCQkvLyB9Ci0JCS8vIH0KLQkJLy8gfQotCQkvLyBlbHNlCi0JCWlmIChhZGRDb21tYW5kLmdldE93bmVyKCkgaW5zdGFuY2VvZiBQcm9jZXNzUGFja2FnZQotCQkJCSYmIGFkZENvbW1hbmQuZ2V0RmVhdHVyZSgpID09IFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkuZ2V0TWV0aG9kUGFja2FnZV9DaGlsZFBhY2thZ2VzKCkKLQkJCQkmJiBlIGluc3RhbmNlb2YgUHJvY2Vzc1BhY2thZ2UKLQkJCQkmJiAhKGUgaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50KSkgewotCQkJZ2V0UHJvY2Vzc0NvbXBvbmVudHMoKFByb2Nlc3NQYWNrYWdlKSBlLCBvYmplY3RzVG9DaGVja05hbWUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGUKLQkgKiBAcGFyYW0gb2JqZWN0c1RvQ2hlY2tOYW1lCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBnZXRQcm9jZXNzQ29tcG9uZW50cyhQcm9jZXNzUGFja2FnZSBwa2csCi0JCQlDb2xsZWN0aW9uIG9iamVjdHNUb0NoZWNrTmFtZSkgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBwa2cuZ2V0Q2hpbGRQYWNrYWdlcygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGNoaWxkUGtnID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAoY2hpbGRQa2cgaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50KSB7Ci0JCQkJb2JqZWN0c1RvQ2hlY2tOYW1lLmFkZChjaGlsZFBrZyk7Ci0JCQl9IGVsc2UgaWYgKGNoaWxkUGtnIGluc3RhbmNlb2YgUHJvY2Vzc1BhY2thZ2UpIHsKLQkJCQlnZXRQcm9jZXNzQ29tcG9uZW50cygoUHJvY2Vzc1BhY2thZ2UpIGNoaWxkUGtnLAotCQkJCQkJb2JqZWN0c1RvQ2hlY2tOYW1lKTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBjaGVja1N0cmluZ1ZhbHVlKE5hbWVkRWxlbWVudCBlLAotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIENvbGxlY3Rpb24gb2JqZWN0c1RvQWRkKSB7Ci0JCUNvbGxlY3Rpb24gZXhjbHVkZWRGZWF0dXJlc1RvQ2hlY2sgPSB0eXBlVG9FeGNsdWRlZEZlYXR1cmVzRnJvbUNoZWNrLmdldChlLmVDbGFzcygpKTsgCi0JCWlmKGV4Y2x1ZGVkRmVhdHVyZXNUb0NoZWNrICE9IG51bGwgJiYgZXhjbHVkZWRGZWF0dXJlc1RvQ2hlY2suY29udGFpbnMoZmVhdHVyZSkpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCQotCQlJVmFsaWRhdG9yIHZhbGlkYXRvciA9IGNyZWF0ZVZhbGlkYXRvcihlLCBmZWF0dXJlKTsKLQkJaWYgKHZhbGlkYXRvciAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgbmV3TmFtZSA9IG51bGw7Ci0JCQl0cnkgewotCQkJCW5ld05hbWUgPSBjaGVja1N0cmluZ1ZhbHVlKGUsIGZlYXR1cmUsIHZhbGlkYXRvciwgb2JqZWN0c1RvQWRkKTsKLQkJCX0gY2F0Y2ggKE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uIGV4KSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJaWYgKG5ld05hbWUgIT0gbnVsbCkgewotCQkJCW5ld05hbWUgPSBuZXdOYW1lLnRyaW0oKTsKLQkJCQllLmVTZXQoZmVhdHVyZSwgbmV3TmFtZSk7Ci0JCQkJZmVhdHVyZUNoYW5nZWQoZSwgZmVhdHVyZSwgbmV3TmFtZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gY2hlY2tTdHJpbmdWYWx1ZShFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSkgewotCQlBcnJheUxpc3Qgb2JqZWN0c1RvQ2hlY2tOYW1lID0gbmV3IEFycmF5TGlzdCgpOwotCQlDb2xsZWN0aW9uIG9iamVjdHNUb0FkZCA9IGFkZENvbW1hbmQuZ2V0Q29sbGVjdGlvbigpOwotCi0JCS8vIGZlYXR1cmUgdmFsdWUgY2hlY2sKLQkJLy8KLQkJZm9yIChJdGVyYXRvciBpdGVyID0gb2JqZWN0c1RvQWRkLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJTmFtZWRFbGVtZW50IGUgPSAoTmFtZWRFbGVtZW50KSBpdGVyLm5leHQoKTsKLQkJCWlmICghY2hlY2tTdHJpbmdWYWx1ZShlLCBmZWF0dXJlLCBvYmplY3RzVG9BZGQpKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCi0JCQlnZXRPZmZTdHJpbmdUb0NoZWNrTmFtZShlLCBvYmplY3RzVG9DaGVja05hbWUpOwotCQl9Ci0KLQkJZm9yIChJdGVyYXRvciBpdGVyID0gb2JqZWN0c1RvQ2hlY2tOYW1lLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJTmFtZWRFbGVtZW50IGUgPSAoTmFtZWRFbGVtZW50KSBpdGVyLm5leHQoKTsKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmID0gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TmFtZWRFbGVtZW50X05hbWUoKTsKLQkJCWlmICghY2hlY2tTdHJpbmdWYWx1ZShlLCBmLCBvYmplY3RzVG9DaGVja05hbWUpKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogU3ViY2xhc3MgY2FuIG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIGRlYWwgd2l0aCBlbGVtZW50IGNoYW5nZSBkdXJpbmcgYWRkCi0JICogCi0JICogQHBhcmFtIGZlYXR1cmUKLQkgKiBAcGFyYW0gbmV3VmFsdWUKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmZWF0dXJlQ2hhbmdlZChFT2JqZWN0IG9iamVjdCwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsCi0JCQlPYmplY3QgbmV3VmFsdWUpIHsKLQotCX0KLQotCXByaXZhdGUgc3RhdGljIENvbGxlY3Rpb24gZ2V0RWxlbWVudHNUb0NoZWNrTmFtZShBZGRDb21tYW5kIGFkZENvbW1hbmQpIHsKLQkJQXJyYXlMaXN0IGVsZW1lbnRzID0gbmV3IEFycmF5TGlzdChhZGRDb21tYW5kLmdldENvbGxlY3Rpb24oKSk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGFkZENvbW1hbmQuZ2V0Q29sbGVjdGlvbigpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyLm5leHQoKTsKLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgUHJvY2Vzc1BhY2thZ2UpIHsKLQkJCQkvLyBuZWVkIHRvIGdldCBhbGwgcHJvY2VzcyBjb21wb25lbnRzIGluIHRoaXMgcGFja2FnZSB0byBjaGVjawotCQkJCS8vIG5hbWUKLQkJCQkvLwotCQkJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gbmV3IEFic3RyYWN0VHJlZUl0ZXJhdG9yKGVsZW1lbnQsIGZhbHNlKSB7Ci0KLQkJCQkJLyoqCi0JCQkJCSAqIENvbW1lbnQgZm9yIDxjb2RlPnNlcmlhbFZlcnNpb25VSUQ8L2NvZGU+Ci0JCQkJCSAqLwotCQkJCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCQkJCQlwcm90ZWN0ZWQgSXRlcmF0b3IgZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQkJCQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpIHsKLQkJCQkJCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVC5pdGVyYXRvcigpOwotCQkJCQkJfSBlbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBQcm9jZXNzUGFja2FnZSkgewotCQkJCQkJCXJldHVybiAoKFByb2Nlc3NQYWNrYWdlKSBvYmplY3QpLmdldENoaWxkUGFja2FnZXMoKQotCQkJCQkJCQkJLml0ZXJhdG9yKCk7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNULml0ZXJhdG9yKCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQotCQkJCX07Ci0JCQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCQlPYmplY3QgcGtnID0gaXRlcmF0b3IubmV4dCgpOwotCQkJCQlpZiAocGtnIGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkgewotCQkJCQkJZWxlbWVudHMuYWRkKHBrZyk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVsZW1lbnRzOwotCX0KLQotCS8qKgotCSAqIENoZWNrcyB0aGUgbmFtZSBvZiBhbGwgZWxlbWVudHMgdG8gYmUgYWRkZWQuCi0JICogCi0JICogQHBhcmFtIGFkZENvbW1hbmQKLQkgKiBAcmV0dXJuIGEgZWxlbWVudCB0byBuZXcgZmVhdHVyZSBuYW1lIG1hcCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB1c2VyCi0JICogICAgICAgICBjYW5jZWxlZCB0aGUgb3BlcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgTWFwIGNoZWNrTmFtZShBZGRDb21tYW5kIGFkZENvbW1hbmQpIHsKLQkJQ29sbGVjdGlvbiBlbGVtZW50c1RvQ2hlY2sgPSBnZXRFbGVtZW50c1RvQ2hlY2tOYW1lKGFkZENvbW1hbmQpOwotCQlIYXNoTWFwIGVsZW1lbnRUb05ld05hbWVNYXAgPSBuZXcgSGFzaE1hcCgpOwotCi0JCS8vIGZlYXR1cmUgdmFsdWUgY2hlY2sKLQkJLy8KLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZWxlbWVudHNUb0NoZWNrLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJTmFtZWRFbGVtZW50IGUgPSAoTmFtZWRFbGVtZW50KSBpdGVyLm5leHQoKTsKLQkJCUlWYWxpZGF0b3IgdmFsaWRhdG9yOwotCQkJaWYgKGUgaW5zdGFuY2VvZiBDb250ZW50RWxlbWVudCkgewotCQkJCXZhbGlkYXRvciA9IG5ldyBDb250ZW50RWxlbWVudE5hbWVWYWxpZGF0b3IoYWRkQ29tbWFuZAotCQkJCQkJLmdldE93bmVyKCksIGFkZENvbW1hbmQuZ2V0RmVhdHVyZSgpLAotCQkJCQkJKENvbnRlbnRFbGVtZW50KSBlLCBuZXcgVmFsaWRhdG9yRmFjdG9yeS5UeXBlRmlsdGVyKGUpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJdmFsaWRhdG9yID0gSVZhbGlkYXRvckZhY3RvcnkuSU5TVEFOQ0UuY3JlYXRlTmFtZVZhbGlkYXRvcigKLQkJCQkJCWFkZENvbW1hbmQuZ2V0T3duZXIoKSwgZSk7Ci0JCQl9Ci0KLQkJCVN0cmluZyBuZXdOYW1lID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJbmV3TmFtZSA9IGNoZWNrU3RyaW5nVmFsdWUoZSwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCS5nZXROYW1lZEVsZW1lbnRfTmFtZSgpLCB2YWxpZGF0b3IsIGVsZW1lbnRzVG9DaGVjayk7Ci0JCQl9IGNhdGNoIChPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbiBleCkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQkJaWYgKG5ld05hbWUgIT0gbnVsbCkgewotCQkJCS8vIG5ldyBuYW1lIHJlcXVpcmVkLCBjaGVjayBpZiB0aGUgZWxlbWVudCBjYW4gYmUgbW9kaWZpZWQKLQkJCQkvLwotCQkJCUlTdGF0dXMgc3RhdHVzID0gVXNlckludGVyYWN0aW9uSGVscGVyLmNoZWNrTW9kaWZ5KGUsIExpYnJhcnlFZGl0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRDb250ZXh0KCkpOwotCQkJCVN0cmluZyB0aXRsZSA9IExpYnJhcnlFZGl0UmVzb3VyY2VzLmVycm9yRGlhbG9nX3RpdGxlOyAKLQkJCQlTdHJpbmcgbXNnID0gTWVzc2FnZUZvcm1hdC5mb3JtYXQoCi0JCQkJCQlMaWJyYXJ5RWRpdFJlc291cmNlcy5lcnJvckRpYWxvZ19jYW5ub3RSZW5hbWUsCi0JCQkJCQluZXcgT2JqZWN0W10geyBUbmdVdGlsLmdldFR5cGVUZXh0KGUpLCBlLmdldE5hbWUoKSwKLQkJCQkJCQkJbmV3TmFtZSB9KTsKLQkJCQl3aGlsZSAoIXN0YXR1cy5pc09LKCkpIHsKLQkJCQkJSVVzZXJJbnRlcmFjdGlvbkhhbmRsZXIgdWlIYW5kbGVyID0gRXh0ZW5zaW9uTWFuYWdlci5nZXREZWZhdWx0VXNlckludGVyYWN0aW9uSGFuZGxlcigpOwotCQkJCQlpZiAodWlIYW5kbGVyICE9IG51bGwpIHsKLQkJCQkJCWlmICh1aUhhbmRsZXIuc2VsZWN0T25lKG5ldyBpbnRbXSB7Ci0JCQkJCQkJCUlVc2VySW50ZXJhY3Rpb25IYW5kbGVyLkFDVElPTl9PSywKLQkJCQkJCQkJSVVzZXJJbnRlcmFjdGlvbkhhbmRsZXIuQUNUSU9OX0NBTkNFTCB9LCB0aXRsZSwKLQkJCQkJCQkJbXNnLCBudWxsKSA9PSBJVXNlckludGVyYWN0aW9uSGFuZGxlci5BQ1RJT05fQ0FOQ0VMKSB7Ci0JCQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQkvLyBjYW5jZWwgdGhlIG9wZXJhdGlvbiBpZiB0aGVyZSBpcyBubyB1c2VyIGludGVyYWN0aW9uIGhhbmRsZXIKLQkJCQkJCS8vCi0JCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQkJfQotCQkJCX0KLQkJCQllbGVtZW50VG9OZXdOYW1lTWFwLnB1dChlLCBuZXdOYW1lKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBlbGVtZW50VG9OZXdOYW1lTWFwOwotCX0KLQotCS8qKgotCSAqIENoZWNrcyBmZWF0dXJlIHZhbHVlCi0JICogCi0JICogQHBhcmFtIGUKLQkgKiBAcGFyYW0gZmVhdHVyZQotCSAqIEBwYXJhbSB2YWxpZGF0b3IKLQkgKiBAcGFyYW0gb2JqZWN0c1RvQWRkCi0JICogQHJldHVybiBuZXcgZmVhdHVyZSB2YWx1ZSB0aGF0IHVzZXIgaGFzIGNob29zZW4gb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYKLQkgKiAgICAgICAgIHRoZSBmZWF0dXJlIHZhbHVlIGlzIHZhbGlkCi0JICogQHRocm93cyBPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNoZWNrU3RyaW5nVmFsdWUoTmFtZWRFbGVtZW50IGUsCi0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgSVZhbGlkYXRvciB2YWxpZGF0b3IsCi0JCQlDb2xsZWN0aW9uIG9iamVjdHNUb0FkZCkgdGhyb3dzIE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uIHsKLQkJLy8gVE9ETzogVGhlIHZhbGlkYXRvciBpcyBkaXNwbGF5IGFuIGVycm9yIG1lc3NhZ2UgdGhhdCBpcyB0b28gbG9uZyBmb3IKLQkJLy8gdGhlIGRpYWxvZy4KLQkJLy8gZmVhdHVyZSB2YWx1ZSBjaGVjawotCQlmaW5hbCBTdHJpbmdWYWxpZGF0b3Igc3RyVmFsaWRhdG9yID0gZ2V0U3RyaW5nVmFsaWRhdG9yKCk7Ci0JCXN0clZhbGlkYXRvci5zZXRFbGVtZW50cyhvYmplY3RzVG9BZGQpOwotCQlzdHJWYWxpZGF0b3Iuc2V0RmVhdHVyZShmZWF0dXJlKTsKLQkJc3RyVmFsaWRhdG9yLnNldFZhbGlkYXRvcih2YWxpZGF0b3IpOwotCi0JCVN0cmluZyBzdHIgPSAoU3RyaW5nKSBlLmVHZXQoZmVhdHVyZSk7Ci0JCWlmIChzdHIgIT0gbnVsbCAmJiBzdHIubGVuZ3RoKCkgPiAwKSB7Ci0JCQlTdHJpbmcgbXNnID0gc3RyVmFsaWRhdG9yLmlzVmFsaWQoc3RyKTsKLQkJCWlmIChtc2cgIT0gbnVsbCkgewotCQkJCVN0cmluZyBmZWF0dXJlVHh0ID0gVG5nVXRpbC5nZXRGZWF0dXJlVGV4dChmZWF0dXJlKTsKLQkJCQlTdHJpbmcgdGl0bGUgPSBMaWJyYXJ5RWRpdFJlc291cmNlcy5yZXNvbHZlTmFtZUNvbmZsaWN0RGlhbG9nX3RpdGxlOyAKLQkJCQlTdHJpbmcgZGxnTXNnID0gTkxTLmJpbmQoCi0JCQkJCQlMaWJyYXJ5RWRpdFJlc291cmNlcy5yZXNvbHZlTmFtZUNvbmZsaWN0RGlhbG9nX3RleHQsCi0JCQkJCQlTdHJVdGlsLnRvTG93ZXIoZmVhdHVyZVR4dCksIGUuZ2V0TmFtZSgpKTsKLQkJCQlTdHJpbmcgY3VycmVudFZhbHVlID0gKFN0cmluZykgZS5lR2V0KGZlYXR1cmUpOwotCi0JCQkJSVZhbGlkYXRvciBpbnB1dFZhbGlkYXRvciA9IG5ldyBBYnN0cmFjdFN0cmluZ1ZhbGlkYXRvcigpIHsKLQotCQkJCQlwdWJsaWMgU3RyaW5nIGlzVmFsaWQoU3RyaW5nIG5ld1RleHQpIHsKLQkJCQkJCWlmIChzdHJWYWxpZGF0b3IgIT0gbnVsbCkgewotCQkJCQkJCXJldHVybiBVc2VySW50ZXJhY3Rpb25IZWxwZXIKLQkJCQkJCQkJCS5nZXRTaW1wbGVFcnJvck1lc3NhZ2Uoc3RyVmFsaWRhdG9yCi0JCQkJCQkJCQkJCS5pc1ZhbGlkKG5ld1RleHQpKTsKLQkJCQkJCX0KLQkJCQkJCXJldHVybiBudWxsOwotCQkJCQl9Ci0KLQkJCQl9OwotCQkJCUlVc2VySW50ZXJhY3Rpb25IYW5kbGVyIHVpSGFuZGxlciA9IEV4dGVuc2lvbk1hbmFnZXIuZ2V0RGVmYXVsdFVzZXJJbnRlcmFjdGlvbkhhbmRsZXIoKTsKLQkJCQlpZih1aUhhbmRsZXIgIT0gbnVsbCkgewotCQkJCQlVc2VySW5wdXQgaW5wdXQgPSBuZXcgVXNlcklucHV0KCIiLCBVc2VySW5wdXQuVEVYVCwgZmFsc2UsIG51bGwsIG51bGwsIGlucHV0VmFsaWRhdG9yLCBudWxsKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlpbnB1dC5zZXRJbnB1dChjdXJyZW50VmFsdWUpOwotCQkJCQlMaXN0PFVzZXJJbnB1dD4gdXNlcklucHV0cyA9IENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QoaW5wdXQpOwotCQkJCQlpZih1aUhhbmRsZXIucmVxdWVzdElucHV0KHRpdGxlLCBkbGdNc2csIHVzZXJJbnB1dHMpKSB7Ci0JCQkJCQlyZXR1cm4gKFN0cmluZykgdXNlcklucHV0cy5nZXQoMCkuZ2V0SW5wdXQoKTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCXRocm93IG5ldyBPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbigpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZFdyYXBwZXIjZ2V0QWZmZWN0ZWRPYmplY3RzKCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRBZmZlY3RlZE9iamVjdHMoKSB7Ci0JCUNvbGxlY3Rpb24gYWZmZWN0ZWRPYmplY3RzID0gc3VwZXIuZ2V0QWZmZWN0ZWRPYmplY3RzKCk7Ci0JCWlmIChhZmZlY3RlZE9iamVjdHMgPT0gbnVsbCkgewotCQkJRU9iamVjdCBvd25lciA9IGFkZENvbW1hbmQuZ2V0T3duZXIoKTsKLQkJCWFmZmVjdGVkT2JqZWN0cyA9IG93bmVyID09IG51bGwgPyBDb2xsZWN0aW9ucy5FTVBUWV9TRVQKLQkJCQkJOiBDb2xsZWN0aW9ucy5zaW5nbGV0b24ob3duZXIpOwotCQl9Ci0JCXJldHVybiBhZmZlY3RlZE9iamVjdHM7Ci0JfQotCi0JcHJvdGVjdGVkIENvbGxlY3Rpb24gZ2V0RWxlbWVudHNUb0NoZWNrRm9ySWxsZWdhbFJlZmVyZW5jZXMoKSB7Ci0JCXJldHVybiBhZGRDb21tYW5kLmdldENvbGxlY3Rpb24oKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzRXhjbHVkZWRGcm9tT3V0Z29pbmdSZWZlcmVuY2VDaGVjayhPYmplY3QgZSkgewotCQkvLyBkb24ndCBjaGVjayBvbiBQcm9jZXNzUGFja2FnZSwgUHJvY2Vzc0VsZW1lbnQgZm9yIGlsbGVnYWwgcmVmZXJlbmNlcwotCQkvLyBiL2MgcHJvY2VzcyB2YWxpZGF0aW9uIGlzIGJhc2VkIG9uIGNvbmZpZ3VyYXRpb24sIG5vdCBwbHVnaW4KLQkJLy8gdmlzaWJpbGl0eQotCQkvLwotCQlyZXR1cm4gZSBpbnN0YW5jZW9mIFByb2Nlc3NQYWNrYWdlIHx8IGUgaW5zdGFuY2VvZiBQcm9jZXNzRWxlbWVudDsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGNoZWNrRm9ySWxsZWdhbFJlZmVyZW5jZXMoKSB7Ci0JCUNvbGxlY3Rpb24gZWxlbWVudHMgPSBnZXRFbGVtZW50c1RvQ2hlY2tGb3JJbGxlZ2FsUmVmZXJlbmNlcygpOwotCQlhZGRMaXN0ID0gbmV3IEFycmF5TGlzdChlbGVtZW50cyk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGVsZW1lbnRzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJRU9iamVjdCBlbGVtZW50ID0gKEVPYmplY3QpIGl0ZXIubmV4dCgpOwotCQkJLy8gU3RyaW5nIG5ld05hbWUgPSAoU3RyaW5nKSBlbGVtZW50VG9OZXdOYW1lTWFwLmdldChlbGVtZW50KTsKLQkJCS8vIGlmKG5ld05hbWUgIT0gbnVsbCkgewotCQkJLy8gZWxlbWVudC5zZXROYW1lKG5ld05hbWUpOwotCQkJLy8gfQotCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGVsZW1lbnQuZUFsbENvbnRlbnRzKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCQlhZGRMaXN0LmFkZChpdGVyYXRvci5uZXh0KCkpOwotCQkJfQotCQl9Ci0KLQkJLy8gY2hlY2sgaWYgdGhlcmUgaXMgYW55IGlsbGVnYWwgcmVmZXJlbmNlIGluIHRoZSBtb3ZlZCBvYmplY3RzCi0JCS8vCQkKLQkJb3duZXJQbHVnaW4gPSBVbWFVdGlsLmdldE1ldGhvZFBsdWdpbihhZGRDb21tYW5kLmdldE93bmVyKCkpOwotCQlyZW1vdmVYUmVmUmVxdWlyZWQgPSBmYWxzZTsKLQkJaWYgKG93bmVyUGx1Z2luICE9IG51bGwpIHsKLQkJCWZpbmRfeFBsdWdpblJlZjogZm9yIChJdGVyYXRvciBpdGVyID0gYWRkQ29tbWFuZC5nZXRDb2xsZWN0aW9uKCkKLQkJCQkJLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBlbGVtZW50ID0gaXRlci5uZXh0KCk7Ci0JCi0JCQkJaWYgKGlzRXhjbHVkZWRGcm9tT3V0Z29pbmdSZWZlcmVuY2VDaGVjayhlbGVtZW50KSkgewotCQkJCQljb250aW51ZSBmaW5kX3hQbHVnaW5SZWY7Ci0JCQkJfQotCQotCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJCQlpZiAoaGFzSWxsZWdhbFJlZmVyZW5jZUluY2x1ZGluZ0FsbENoaWxkcmVuKG93bmVyUGx1Z2luLAotCQkJCQkJCShNZXRob2RFbGVtZW50KSBlbGVtZW50LCBhZGRMaXN0KSkgewotCQkJCQkJcmVtb3ZlWFJlZlJlcXVpcmVkID0gdHJ1ZTsKLQkJCQkJCWJyZWFrIGZpbmRfeFBsdWdpblJlZjsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWlmIChyZW1vdmVYUmVmUmVxdWlyZWQpIHsKLQkJCXJldHVybiBMaWJyYXJ5RWRpdFJlc291cmNlcy5pbnZhbGlkUmVmZXJlbmNlc0Vycm9yX3JlYXNvbjsgCi0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0TW9kaWZpZWRSZXNvdXJjZXMoKSB7Ci0JCWlmIChtb2RpZmllZFJlc291cmNlcyA9PSBudWxsKSB7Ci0JCQltb2RpZmllZFJlc291cmNlcyA9IG5ldyBIYXNoU2V0KCk7Ci0JCX0KLQkJaWYgKGFkZEZlYXR1cmVJc0NvbnRhaW5tZW50KCkpIHsKLQkJCUlMaWJyYXJ5UGVyc2lzdGVyIHBlcnNpc3RlciA9IFNlcnZpY2VzLmdldERlZmF1bHRMaWJyYXJ5UGVyc2lzdGVyKCk7Ci0JCQlib29sZWFuIHNhdmVPd25lclJlc291cmNlID0gZmFsc2U7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBhZGRDb21tYW5kLmdldENvbGxlY3Rpb24oKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IGUgPSAoT2JqZWN0KSBpdGVyLm5leHQoKTsKLQkJCQlpZiAoIXBlcnNpc3Rlci5oYXNPd25SZXNvdXJjZVdpdGhvdXRSZWZlcnJlcihlKSkgewotCQkJCQlzYXZlT3duZXJSZXNvdXJjZSA9IHRydWU7Ci0JCQkJfQotCQkJfQotCQkJaWYgKHNhdmVPd25lclJlc291cmNlKSB7Ci0JCQkJbW9kaWZpZWRSZXNvdXJjZXMuYWRkKGFkZENvbW1hbmQuZ2V0T3duZXIoKS5lUmVzb3VyY2UoKSk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQltb2RpZmllZFJlc291cmNlcy5hZGQoYWRkQ29tbWFuZC5nZXRPd25lcigpLmVSZXNvdXJjZSgpKTsKLQkJfQotCi0JCWlmIChuZXN0ZWRDb21tYW5kcyAhPSBudWxsICYmICFuZXN0ZWRDb21tYW5kcy5pc0VtcHR5KCkpIHsKLQkJCWZvciAoaW50IGkgPSBuZXN0ZWRDb21tYW5kcy5zaXplKCkgLSAxOyBpID4gLTE7IGktLSkgewotCQkJCUNvbW1hbmQgY21kID0gKENvbW1hbmQpIG5lc3RlZENvbW1hbmRzLmdldChpKTsKLQkJCQl0cnkgewotCQkJCQlpZiAoY21kIGluc3RhbmNlb2YgSVJlc291cmNlQXdhcmVDb21tYW5kKSB7Ci0JCQkJCQlDb2xsZWN0aW9uIHJlc291cmNlcyA9ICgoSVJlc291cmNlQXdhcmVDb21tYW5kKSBjbWQpCi0JCQkJCQkJCS5nZXRNb2RpZmllZFJlc291cmNlcygpOwotCQkJCQkJaWYgKHJlc291cmNlcyAhPSBudWxsKSB7Ci0JCQkJCQkJbW9kaWZpZWRSZXNvdXJjZXMuYWRkQWxsKHJlc291cmNlcyk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQlMaWJyYXJ5RWRpdFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkJfSBmaW5hbGx5IHsKLQkJCQkJCi0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIG1vZGlmaWVkUmVzb3VyY2VzOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHdpbGxTYXZlTW9kaWZpZWRSZXNvdXJjZXMoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQkKLQlwcml2YXRlIElMaWJyYXJ5UGVyc2lzdGVyLkZhaWxTYWZlTWV0aG9kTGlicmFyeVBlcnNpc3RlciBnZXRQZXJzaXN0ZXIoKSB7Ci0JCXJldHVybiBTZXJ2aWNlcy5nZXREZWZhdWx0TGlicmFyeVBlcnNpc3RlcigpLmdldEZhaWxTYWZlUGVyc2lzdGVyKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2F2ZU1vZGlmaWVkUmVzb3VyY2VzKCkgewotCQlJTGlicmFyeVBlcnNpc3Rlci5GYWlsU2FmZU1ldGhvZExpYnJhcnlQZXJzaXN0ZXIgcGVyc2lzdGVyID0gZ2V0UGVyc2lzdGVyKCk7Ci0JCXRyeSB7Ci0KLQkJCS8vIHNhdmUgdGhlIG1vZGlmaWVkIHJlc291cmNlcwotCQkJLy8KLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGdldE1vZGlmaWVkUmVzb3VyY2VzKCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCVJlc291cmNlIHJlc291cmNlID0gKFJlc291cmNlKSBpdGVyLm5leHQoKTsKLQkJCQl0cnkgewotCQkJCQlwZXJzaXN0ZXIuc2F2ZShyZXNvdXJjZSk7Ci0JCQkJCWNhblVuZG8gPSBmYWxzZTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQlMaWJyYXJ5RWRpdFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkJCVN0cmluZyBtc2cgPSBOTFMuYmluZCgKLQkJCQkJCQlMaWJyYXJ5RWRpdFJlc291cmNlcy5zYXZlRmlsZUVycm9yX3JlYXNvbiwgCi0JCQkJCQkJcmVzb3VyY2UuZ2V0VVJJKCkuaXNGaWxlKCkgPyByZXNvdXJjZQotCQkJCQkJCQkJLmdldFVSSSgpLnRvRmlsZVN0cmluZygpIDogcmVzb3VyY2UudG9TdHJpbmcoKSk7Ci0JCQkJCXN0YXR1cy5hZGQobmV3IFNhdmVTdGF0dXMoSVN0YXR1cy5FUlJPUiwKLQkJCQkJCQlMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRTeW1ib2xpY05hbWUoKSwKLQkJCQkJCQlTYXZlU3RhdHVzLlNBVkVfRVJST1IsIG1zZywgZSkpOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJfQotCi0JCQlpZiAocmVzTWdyICE9IG51bGwpIHsKLQkJCQlDb2xsZWN0aW9uIGVsZW1lbnRzVG9Db3B5UmVmQ29udGVudHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gZ2V0QWZmZWN0ZWRPYmplY3RzKCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJZWxlbWVudHNUb0NvcHlSZWZDb250ZW50cy5hZGQoVG5nVXRpbC51bndyYXAoaXRlci5uZXh0KCkpKTsKLQkJCQl9Ci0KLQkJCQlDb2xsZWN0aW9uIG1vZGlmaWVkID0gcmVzTWdyLmNvcHlSZWZlcmVuY2VkQ29udGVudHMoCi0JCQkJCQllbGVtZW50c1RvQ29weVJlZkNvbnRlbnRzLCBlbGVtZW50VG9PbGRQbHVnaW5NYXApOwotCQkJCW1vZGlmaWVkCi0JCQkJCQkuYWRkQWxsKHJlcGxhY2VUZXh0UmVmZXJlbmNlcyhlbGVtZW50c1RvQ29weVJlZkNvbnRlbnRzKSk7Ci0JCQkJaWYgKG1vZGlmaWVkICE9IG51bGwgJiYgIW1vZGlmaWVkLmlzRW1wdHkoKSkgewotCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBtb2RpZmllZC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJCVJlc291cmNlIHJlc291cmNlID0gKFJlc291cmNlKSBpdGVyLm5leHQoKTsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJcGVyc2lzdGVyLnNhdmUocmVzb3VyY2UpOwotCQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQlMaWJyYXJ5RWRpdFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkKLQkJCQkJCQkJCS5sb2dFcnJvcihlKTsKLQkJCQkJCQlTdHJpbmcgbXNnID0gTkxTLmJpbmQoCi0JCQkJCQkJCQlMaWJyYXJ5RWRpdFJlc291cmNlcy5zYXZlRmlsZUVycm9yX3JlYXNvbiwKLQkJCQkJCQkJCXJlc291cmNlLmdldFVSSSgpLnRvRmlsZVN0cmluZygpKTsKLQkJCQkJCQlzdGF0dXMuYWRkKG5ldyBTYXZlU3RhdHVzKElTdGF0dXMuRVJST1IsCi0JCQkJCQkJCQlMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkJCQkJCQkuZ2V0U3ltYm9saWNOYW1lKCksCi0JCQkJCQkJCQlTYXZlU3RhdHVzLlNBVkVfRVJST1IsIG1zZywgZSkpOwotCQkJCQkJCXJldHVybjsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJcGVyc2lzdGVyLmNvbW1pdCgpOwotCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCVN0cmluZ1dyaXRlciBtc2cgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0JCQllLnByaW50U3RhY2tUcmFjZShuZXcgUHJpbnRXcml0ZXIobXNnKSk7Ci0JCQlJU3RhdHVzIG5ld1N0YXR1cyA9IG5ldyBTYXZlU3RhdHVzKElTdGF0dXMuRVJST1IsCi0JCQkJCUxpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldFN5bWJvbGljTmFtZSgpLAotCQkJCQlTYXZlU3RhdHVzLlNBVkVfRVJST1IsIG1zZy50b1N0cmluZygpLCBlKTsKLQkJCXN0YXR1cy5hZGQobmV3U3RhdHVzKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChzdGF0dXMuZ2V0U2V2ZXJpdHkoKSA9PSBJU3RhdHVzLkVSUk9SKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJcGVyc2lzdGVyLnJvbGxiYWNrKCk7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UubG9nKGUpOwotCQkJCQlTdHJpbmdXcml0ZXIgbXNnID0gbmV3IFN0cmluZ1dyaXRlcigpOwotCQkJCQllLnByaW50U3RhY2tUcmFjZShuZXcgUHJpbnRXcml0ZXIobXNnKSk7Ci0JCQkJCUlTdGF0dXMgbmV3U3RhdHVzID0gbmV3IFNhdmVTdGF0dXMoSVN0YXR1cy5FUlJPUiwKLQkJCQkJCQlMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRTeW1ib2xpY05hbWUoKSwKLQkJCQkJCQlTYXZlU3RhdHVzLlJPTExCQUNLX0VSUk9SLCBtc2cudG9TdHJpbmcoKSwgZSk7Ci0JCQkJCXN0YXR1cy5hZGQobmV3U3RhdHVzKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBJZiB0ZXh0dWFsIGRlc2NyaXB0aW9ucyBpbiB0aGUgY29waWVkIGVsZW1lbnRzIGNvbnRhaW4gcmVmZXJlbmNlcyAoVVJMcykKLQkgKiB0byBvdGhlciBlbGVtZW50cyB3aXRoaW4gdGhlIHNhbWUgY29waWVkIHByb2Nlc3MgdGhlbiByZXBsYWNlIHRoZXNlCi0JICogcmVmZXJlbmNlcyB3aXRoIHJlZmVyZW5jZXMgdGhhdCBwb2ludCB0byB0aGUgbmV3IGVsZW1lbnRzIGluIHRoZSBjb3BpZWQKLQkgKiBzdHJ1Y3R1cmVzLgotCSAqLwotCXByaXZhdGUgQ29sbGVjdGlvbiByZXBsYWNlVGV4dFJlZmVyZW5jZXMoCi0JCQlDb2xsZWN0aW9uIGVsZW1lbnRzVG9Db3B5UmVmQ29udGVudHMpIHsKLQkJQ29sbGVjdGlvbiBtb2RpZmllZFJlc291cmNlcyA9IG5ldyBIYXNoU2V0KCk7Ci0JCUlUZXh0UmVmZXJlbmNlUmVwbGFjZXIgdHh0UmVmUmVwbGFjZXIgPSBFeHRlbnNpb25NYW5hZ2VyCi0JCQkJLmdldFRleHRSZWZlcmVuY2VSZXBsYWNlcigpOwotCQlpZiAodHh0UmVmUmVwbGFjZXIgPT0gbnVsbCkKLQkJCXJldHVybiBtb2RpZmllZFJlc291cmNlczsKLQotCQkvLyBnZXQgbWFwCi0JCUVkaXRpbmdEb21haW4gZWQgPSBhZGRDb21tYW5kLmdldERvbWFpbigpOwotCQlpZiAoZWQgaW5zdGFuY2VvZiBUcmFjZWFibGVBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW4pIHsKLQkJCU1hcCBjb3B5VG9PcmlnaW5hbE1hcCA9ICgoVHJhY2VhYmxlQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluKSBlZCkKLQkJCQkJLmdldENvcHlUb09yaWdpbmFsTWFwKCk7Ci0JCQkvLyB0aGUgVGV4dFJlZmVyZW5jZVJlcGxhY2VyIGV4cGVjdHMgYSBtYXAgb2Ygb2xkLXRvLW5ldy4gd2UKLQkJCS8vIGhhdmUgYSBtYXAgb2YgbmV3LXRvLW9sZCwgc28gY29udmVydCBpdAotCQkJTWFwIG9sZFRvTmV3T2JqZWN0TWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGNvcHlUb09yaWdpbmFsTWFwLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCU1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIGl0ZXIubmV4dCgpOwotCQkJCU9iamVjdCBrZXkgPSBlbnRyeS5nZXRLZXkoKTsKLQkJCQlPYmplY3QgdmFsID0gZW50cnkuZ2V0VmFsdWUoKTsKLQkJCQlpZiAoa2V5ICE9IG51bGwgJiYgdmFsICE9IG51bGwpCi0JCQkJCW9sZFRvTmV3T2JqZWN0TWFwLnB1dCh2YWwsIGtleSk7Ci0JCQl9Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBlbGVtZW50c1RvQ29weVJlZkNvbnRlbnRzLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQlFT2JqZWN0IGVsZW1lbnQgPSAoRU9iamVjdCkgaXRlci5uZXh0KCk7Ci0JCQkJZm9yIChJdGVyYXRvciBjaGlsZEl0ZXIgPSBlbGVtZW50LmVBbGxDb250ZW50cygpOyBjaGlsZEl0ZXIKLQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCUVPYmplY3QgY2hpbGQgPSAoRU9iamVjdCkgY2hpbGRJdGVyLm5leHQoKTsKLQkJCQkJZm9yIChJdGVyYXRvciBhdHRyaWJ1dGVzID0gY2hpbGQuZUNsYXNzKCkKLQkJCQkJCQkuZ2V0RUFsbEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpOyBhdHRyaWJ1dGVzCi0JCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCUVBdHRyaWJ1dGUgYXR0cmlidXRlID0gKEVBdHRyaWJ1dGUpIGF0dHJpYnV0ZXMubmV4dCgpOwotCQkJCQkJaWYgKGF0dHJpYnV0ZS5pc0NoYW5nZWFibGUoKQotCQkJCQkJCQkmJiAhYXR0cmlidXRlLmlzRGVyaXZlZCgpCi0JCQkJCQkJCSYmIChhdHRyaWJ1dGUuaXNNYW55KCkgfHwgY2hpbGQKLQkJCQkJCQkJCQkuZUlzU2V0KGF0dHJpYnV0ZSkpCi0JCQkJCQkJCSYmIGF0dHJpYnV0ZS5nZXRFQXR0cmlidXRlVHlwZSgpCi0JCQkJCQkJCQkJLmdldEluc3RhbmNlQ2xhc3MoKSA9PSBMaXRlcmFscy5TVFJJTkcKLQkJCQkJCQkJCQkuZ2V0SW5zdGFuY2VDbGFzcygpKSB7Ci0JCQkJCQkJU3RyaW5nIHRleHQgPSAoU3RyaW5nKSBjaGlsZC5lR2V0KGF0dHJpYnV0ZSk7Ci0JCQkJCQkJaWYgKHRleHQgIT0gbnVsbCkgewotCQkJCQkJCQlTdHJpbmcgbmV3dGV4dCA9IHR4dFJlZlJlcGxhY2VyLnJlcGxhY2UodGV4dCwKLQkJCQkJCQkJCQljaGlsZCwgb2xkVG9OZXdPYmplY3RNYXApOwotCQkJCQkJCQlpZiAoIW5ld3RleHQuZXF1YWxzKHRleHQpKSB7Ci0JCQkJCQkJCQljaGlsZC5lU2V0KGF0dHJpYnV0ZSwgbmV3dGV4dCk7Ci0JCQkJCQkJCQltb2RpZmllZFJlc291cmNlcy5hZGQoY2hpbGQuZVJlc291cmNlKCkpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBtb2RpZmllZFJlc291cmNlczsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBkb0FkZCgpIHsKLQkJdHJ5IHsKLQkJCS8vIGNoZWNrIGZlYXR1cmUgdmFsdWVzCi0JCQkvLwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gZ2V0RmVhdHVyZXNUb0NoZWNrKCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgaXRlci5uZXh0KCk7Ci0JCQkJaWYgKCFjaGVja1N0cmluZ1ZhbHVlKGZlYXR1cmUpKSB7Ci0JCQkJCS8vIHVzZXIgY2FuY2VsZWQgdGhlIG9wZXJhaW9uCi0JCQkJCS8vCi0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQl9Ci0KLQkJCWJvb2xlYW4gc2hvd1dhcm5pbmcgPSBmYWxzZTsKLQkJCUVkaXRpbmdEb21haW4gZWQgPSBhZGRDb21tYW5kLmdldERvbWFpbigpOwotCQkJaWYgKGVkIGluc3RhbmNlb2YgVHJhY2VhYmxlQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluKSB7Ci0JCQkJTWFwIGNvcHlUb09yaWdpbmFsTWFwID0gKChUcmFjZWFibGVBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW4pIGVkKQotCQkJCQkJLmdldENvcHlUb09yaWdpbmFsTWFwKCk7Ci0KLQkJCQkvLyBjaGVjayBmaXJzdCBlbGVtZW50IG9mIGFkZENvbW1hbmQuZ2V0Q29sbGVjdGlvbigpCi0JCQkJLy8gaWYgaXQncyBhIGtleSBpbiB0aGUgQ29weVRvT3JpZ2luYWxNYXAsIHdlIGFyZSBwYXN0aW5nIGFuZAotCQkJCS8vIG1heSBuZWVkIHRvIHdhcm4gdGhlIHVzZXIKLQkJCQkvLyBpZiBpdCdzIG5vdCBhIGtleSBpbiB0aGUgQ29weVRvT3JpZ2luYWxNYXAsIHRoZW4gd2UgYXJlCi0JCQkJLy8gcHJvYmFibHkgYWRkaW5nIGEgbmV3IGVsZW1lbnQKLQkJCQlpZiAoYWRkQ29tbWFuZC5nZXRDb2xsZWN0aW9uKCkgIT0gbnVsbAotCQkJCQkJJiYgYWRkQ29tbWFuZC5nZXRDb2xsZWN0aW9uKCkuc2l6ZSgpID4gMAotCQkJCQkJJiYgY29weVRvT3JpZ2luYWxNYXAuY29udGFpbnNLZXkoYWRkQ29tbWFuZAotCQkJCQkJCQkuZ2V0Q29sbGVjdGlvbigpLnRvQXJyYXkoKVswXSkpIHsKLQkJCQkJZWxlbWVudFRvT2xkUGx1Z2luTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJCQkJSXRlcmF0b3IgaXRlciA9IGNvcHlUb09yaWdpbmFsTWFwLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsKLQkJCQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQkJCQlNYXAuRW50cnkgZW50cnkgPSAoRW50cnkpIGl0ZXIubmV4dCgpOwotCQkJCQkJaWYgKGVudHJ5LmdldFZhbHVlKCkgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50Ci0JCQkJCQkJCSYmICEoZW50cnkuZ2V0VmFsdWUoKSBpbnN0YW5jZW9mIE1ldGhvZENvbmZpZ3VyYXRpb24pKSB7Ci0JCQkJCQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IFVtYVV0aWwKLQkJCQkJCQkJCS5nZXRNZXRob2RQbHVnaW4oKE1ldGhvZEVsZW1lbnQpIGVudHJ5Ci0JCQkJCQkJCQkJCS5nZXRWYWx1ZSgpKTsKLQkJCQkJCQlpZiAocGx1Z2luICE9IG51bGwpIHsKLQkJCQkJCQkJZWxlbWVudFRvT2xkUGx1Z2luTWFwLnB1dChlbnRyeS5nZXRLZXkoKSwKLQkJCQkJCQkJCQlwbHVnaW4pOwotCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCS8vIHBsdWdpbiA9PSBudWxsLCBvcmlnaW5hbCBlbGVtZW50IHdhcyBwcm9iYWJseQotCQkJCQkJCQkvLyBkZWxldGVkCi0JCQkJCQkJCXNob3dXYXJuaW5nID0gdHJ1ZTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmIChzaG93V2FybmluZykgewotCQkJCQlNZXNzZW5nZXIuSU5TVEFOQ0UKLQkJCQkJCS5zaG93V2FybmluZygKLQkJCQkJCQkJZ2V0TGFiZWwoKSwKLQkJCQkJCQkJTGlicmFyeUVkaXRSZXNvdXJjZXMuTWV0aG9kRWxlbWVudEFkZENvbW1hbmRfb3JpZ2luYWxOb3RGb3VuZFdhcm5pbmdfbXNnKTsKLQkJCX0KLQotCQkJZmluYWwgU3RyaW5nQnVmZmVyIG1zZ0J1ZmYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQlJUnVubmFibGVXaXRoUHJvZ3Jlc3Mgb3BlcmF0aW9uID0gbmV3IElSdW5uYWJsZVdpdGhQcm9ncmVzcygpIHsKLQotCQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJCQkJU3RyaW5nIG1zZyA9IGNoZWNrRm9ySWxsZWdhbFJlZmVyZW5jZXMoKTsKLQkJCQkJaWYgKG1zZyAhPSBudWxsKSB7Ci0JCQkJCQltc2dCdWZmLmFwcGVuZChtc2cpOwotCQkJCQl9Ci0JCQkJfQotCi0JCQl9OwotCi0JCQlJUHJvZ3Jlc3NNb25pdG9yIGRlZmF1bHRNb25pdG9yID0gbnVsbDsKLQkJCWlmICghcnVuV2l0aFByb2dyZXNzKSB7Ci0JCQkJZGVmYXVsdE1vbml0b3IgPSBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpOwotCQkJfQotCi0JCQlpZiAocnVuV2l0aFByb2dyZXNzKSB7Ci0JCQkJVXNlckludGVyYWN0aW9uSGVscGVyLnJ1bldpdGhQcm9ncmVzcyhvcGVyYXRpb24sCi0JCQkJCQlMaWJyYXJ5RWRpdFJlc291cmNlcy5jaGVja2luZ1JlZmVyZW5jZXNUYXNrX25hbWUpOyAKLQkJCX0gZWxzZSB7Ci0JCQkJdHJ5IHsKLQkJCQkJb3BlcmF0aW9uLnJ1bihkZWZhdWx0TW9uaXRvcik7Ci0JCQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCUxpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmxvZyhlKTsKLQkJCQkJdGhyb3cgZTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQlMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5sb2coZSk7Ci0JCQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUudG9TdHJpbmcoKSk7Ci0JCQkJfQotCQkJfQotCQkJaWYgKG1zZ0J1ZmYubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJSVVzZXJJbnRlcmFjdGlvbkhhbmRsZXIgdWlIYW5kbGVyID0gRXh0ZW5zaW9uTWFuYWdlci5nZXREZWZhdWx0VXNlckludGVyYWN0aW9uSGFuZGxlcigpOwotCQkJCWlmKHVpSGFuZGxlciAgIT0gbnVsbCkgewotCQkJCQlpbnQgcmV0ID0gdWlIYW5kbGVyLnNlbGVjdE9uZShuZXcgaW50W10ge0lVc2VySW50ZXJhY3Rpb25IYW5kbGVyLkFDVElPTl9ZRVMsIElVc2VySW50ZXJhY3Rpb25IYW5kbGVyLkFDVElPTl9OTyB9LCAKLQkJCQkJCQlnZXRMYWJlbCgpLCBtc2dCdWZmLnRvU3RyaW5nKCksIG51bGwpOwotCQkJCQlpZihyZXQgPT0gSVVzZXJJbnRlcmFjdGlvbkhhbmRsZXIuQUNUSU9OX05PKSB7Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCXN0YXR1cyA9IG5ldyBNdWx0aVN0YXR1cygKLQkJCQkJTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0U3ltYm9saWNOYW1lKCksCi0JCQkJCUlTdGF0dXMuT0ssCi0JCQkJCUxpYnJhcnlFZGl0UmVzb3VyY2VzLk1ldGhvZEVsZW1lbnRBZGRDb21tYW5kX2Vycm9yU2F2aW5nRmlsZXMsCi0JCQkJCW51bGwpOyAKLQkJCW9wZXJhdGlvbiA9IG5ldyBJUnVubmFibGVXaXRoUHJvZ3Jlc3MoKSB7Ci0KLQkJCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCQkJCWlmIChyZW1vdmVYUmVmUmVxdWlyZWQpIHsKLQkJCQkJCW1vbml0b3Iuc3ViVGFzaygiIik7IC8vJE5PTi1OTFMtMSQKLQotCQkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gYWRkTGlzdC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJCQlFT2JqZWN0IGVsZW1lbnQgPSAoRU9iamVjdCkgaXRlci5uZXh0KCk7Ci0JCQkJCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQkJCQkJCXJlbW92ZUlsbGVnYWxSZWZlcmVuY2VzKG93bmVyUGx1Z2luLCBlbGVtZW50KTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQotCQkJCQkvLyBhZGQgdGhlIGVsZW1lbnRzCi0JCQkJCS8vCi0JCQkJCXN1cGVyRXhlY3V0ZSgpOwotCi0JCQkJCWV4ZWN1dGVOZXN0ZWRDb21tYW5kcygpOwotCi0JCQkJCWlmICh3aWxsU2F2ZU1vZGlmaWVkUmVzb3VyY2VzKCkpIHsKLQkJCQkJCUlTdGF0dXMgcmVzdWx0ID0gc2F2ZU5ld0VsZW1lbnRzV2l0aE93blJlc291cmNlKCk7Ci0JCQkJCQlpZiAocmVzdWx0LmlzT0soKSkgewotCQkJCQkJCW1vbml0b3IKLQkJCQkJCQkJCS5zdWJUYXNrKExpYnJhcnlFZGl0UmVzb3VyY2VzLnNhdmluZ01vZGlmaWVkRmlsZXNUYXNrX25hbWUpOyAKLQkJCQkJCQlzYXZlTW9kaWZpZWRSZXNvdXJjZXMoKTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJc3RhdHVzLmFkZChyZXN1bHQpOwotCQkJCQkJfQotCQkJCQl9Ci0KLQkJCQkJaWYgKCFzdGF0dXMuaXNPSygpKSB7Ci0JCQkJCQkvLyBGSVhNRTogdGhpcyBjYXVzZXMgZGVhZC1sb2NrIGF0Ci0JCQkJCQkvLyBMaWJyYXJ5UHJvY2Vzc29yLm5vdGlmeUxpc3RlbmVycygpLiBUaGUgbWV0aG9kCi0JCQkJCQkvLyBpcyBzeW5jaHJvbml6ZWQsIHRoaXMgbWlnaHQgYmUgdGhlIGNhdXNlIG9mIHRoZQotCQkJCQkJLy8gZGVhZC1sb2NrCi0JCQkJCQkvLwotCQkJCQkJdW5kbygpOwotCQkJCQkJCi0JCQkJCQlpZihDb21tYW5kU3RhdHVzQ2hlY2tlci5oYXNSb2xsYmFja0Vycm9yKHN0YXR1cykpIHsKLQkJCQkJCQlDb2xsZWN0aW9uPD8+IGNyZWF0ZWRFbGVtZW50cyA9IGNvbW1hbmQuZ2V0UmVzdWx0KCk7Ci0JCQkJCQkJSUxpYnJhcnlQZXJzaXN0ZXIgcGVyc2lzdGVyID0gU2VydmljZXMuZ2V0RGVmYXVsdExpYnJhcnlQZXJzaXN0ZXIoKTsKLQkJCQkJCQlmb3IgKE9iamVjdCBvYmplY3QgOiBjcmVhdGVkRWxlbWVudHMpIHsKLQkJCQkJCQkJaWYob2JqZWN0IGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJCQkJCQkJdHJ5IHsKLQkJCQkJCQkJCQlwZXJzaXN0ZXIuZGVsZXRlKChNZXRob2RFbGVtZW50KSBvYmplY3QpOwotCQkJCQkJCQkJfQotCQkJCQkJCQkJY2F0Y2goRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQkJCQlMaWJyYXJ5RWRpdFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQkJCQkJCQl9CQkJCQkJCQkKLQkJCQkJCX0JCQkJCQkKLQkJCQkJfQotCQkJCX0KLQotCQkJfTsKLQkJCWlmIChydW5XaXRoUHJvZ3Jlc3MpIHsKLQkJCQlVc2VySW50ZXJhY3Rpb25IZWxwZXIucnVuV2l0aFByb2dyZXNzKG9wZXJhdGlvbiwgIiIpOyAvLyROT04tTkxTLTEkCi0JCQl9IGVsc2UgewotCQkJCXRyeSB7Ci0JCQkJCW9wZXJhdGlvbi5ydW4oZGVmYXVsdE1vbml0b3IpOwotCQkJCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkJCQlMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5sb2coZSk7Ci0JCQkJCXRocm93IGU7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UubG9nKGUpOwotCQkJCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlLnRvU3RyaW5nKCkpOwotCQkJCX0KLQkJCX0KLQotCQkJaWYgKCFzdGF0dXMuaXNPSygpKSB7Ci0JCQkJTWVzc2VuZ2VyLklOU1RBTkNFLnNob3dFcnJvcihnZXRMYWJlbCgpLCBMaWJyYXJ5RWRpdFJlc291cmNlcy5lcnJvcl9tc2dXaXRoRGV0YWlscywgc3RhdHVzKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkJTWVzc2VuZ2VyLklOU1RBTkNFLnNob3dFcnJvcihnZXRMYWJlbCgpLCBMaWJyYXJ5RWRpdFJlc291cmNlcy5lcnJvcl9tc2csIG51bGwsIGUpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGFkZEZlYXR1cmVJc0NvbnRhaW5tZW50KCkgewotCQlyZXR1cm4gYWRkQ29tbWFuZC5nZXRGZWF0dXJlKCkgaW5zdGFuY2VvZiBFUmVmZXJlbmNlCi0JCQkJJiYgKChFUmVmZXJlbmNlKSBhZGRDb21tYW5kLmdldEZlYXR1cmUoKSkuaXNDb250YWlubWVudCgpOwotCX0KLQotCS8qKgotCSAqIFNhdmVzIGFkZGVkIGVsZW1lbnRzIHRoYXQgYXJlIG5ldyB0byB0aGUgbGlicmFyeSBhbmQgY2FuIGhhdmUgb3duCi0JICogcmVzb3VyY2UgdGhhdCBubyBvdGhlciByZXNvdXJjZSByZWZlcnMgdG8gKGxpa2UgTWV0aG9kQ29uZmlndXJhdGlvbikKLQkgKiAKLQkgKiBAdGhyb3dzIEV4Y2VwdGlvbgotCSAqLwotCXByb3RlY3RlZCBJU3RhdHVzIHNhdmVOZXdFbGVtZW50c1dpdGhPd25SZXNvdXJjZSgpIHsKLQkJaWYgKGFkZEZlYXR1cmVJc0NvbnRhaW5tZW50KCkpIHsKLQkJCUlMaWJyYXJ5UGVyc2lzdGVyIHBlcnNpc3RlciA9IFNlcnZpY2VzLmdldERlZmF1bHRMaWJyYXJ5UGVyc2lzdGVyKCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBhZGRMaXN0Lml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBlbGVtZW50ID0gaXRlci5uZXh0KCk7Ci0JCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQkJCU1ldGhvZEVsZW1lbnQgbWUgPSAoTWV0aG9kRWxlbWVudCkgZWxlbWVudDsKLQotCQkJCQlpZiAobWUgaW5zdGFuY2VvZiBDb250ZW50RWxlbWVudCB8fAotCQkJCQkJbWUgaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4gfHwgCi0JCQkJCQltZSBpbnN0YW5jZW9mIE1ldGhvZENvbmZpZ3VyYXRpb24pIHsJCQkJCQkKLQkJCQkJCUlTdGF0dXMgaXMgPSBjaGVja0ZpbGVQYXRoTGVuZ3RoQmVmb3JlU2F2ZShtZSk7Ci0JCQkJCQlpZiAoaXMgIT0gbnVsbCkgewotCQkJCQkJCXJldHVybiBpczsKLQkJCQkJCX0KLQkJCQkJfQotCi0JCQkJCWlmIChwZXJzaXN0ZXIuaGFzT3duUmVzb3VyY2VXaXRob3V0UmVmZXJyZXIobWUpKSB7Ci0JCQkJCQl0cnkgewotCQkJCQkJCXBlcnNpc3Rlci5zYXZlKG1lKTsKLQkJCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJTGlicmFyeUVkaXRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpCi0JCQkJCQkJCQkubG9nRXJyb3IoZSk7Ci0JCQkJCQkJU3RyaW5nIG1zZyA9IGUuZ2V0TWVzc2FnZSgpOwotCQkJCQkJCWlmIChTdHJVdGlsLmlzQmxhbmsobXNnKSkgewotCQkJCQkJCQltc2cgPSBlLnRvU3RyaW5nKCk7Ci0JCQkJCQkJfQotCQkJCQkJCXJldHVybiBuZXcgU2F2ZVN0YXR1cyhJU3RhdHVzLkVSUk9SLAotCQkJCQkJCQkJTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJCQkJCQkJLmdldFN5bWJvbGljTmFtZSgpLAotCQkJCQkJCQkJU2F2ZVN0YXR1cy5TQVZFX0VSUk9SLCBtc2csIGUpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JfQotCi0JcHJpdmF0ZSBJU3RhdHVzIGNoZWNrRmlsZVBhdGhMZW5ndGhCZWZvcmVTYXZlKE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgewotCQlNZXRob2RFbGVtZW50IHBhcmVudEVsZW1lbnRXaXRoUmVzb3VyY2UgPSBudWxsOwotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbiB8fCBlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kQ29uZmlndXJhdGlvbikgewotCQkJcGFyZW50RWxlbWVudFdpdGhSZXNvdXJjZSA9IFVtYVV0aWwuZ2V0TWV0aG9kTGlicmFyeShlbGVtZW50KTsKLQkJfSBlbHNlIHsKLQkJCXBhcmVudEVsZW1lbnRXaXRoUmVzb3VyY2UgPSBVbWFVdGlsLmdldE1ldGhvZFBsdWdpbihlbGVtZW50KTsKLQkJfQotCQlpZiAoISBOYW1lQ2hlY2tlci5jaGVja0ZpbGVQYXRoTGVuZ3RoKHBhcmVudEVsZW1lbnRXaXRoUmVzb3VyY2UsIGVsZW1lbnQsIGVsZW1lbnQuZ2V0TmFtZSgpLCAKLQkJCQlJVmFsaWRhdG9yLk1heEZpbGVQYXRoTmFtZUxlbmd0aCwgbnVsbCkpIHsKLQkJCVN0cmluZyBtc2cgPSBOTFMuYmluZChMaWJyYXJ5RWRpdFJlc291cmNlcy5maWxlUGF0aE5hbWVUb29Mb25nX21zZywgCi0JCQkJCW5ldyBPYmplY3RbXSB7IG5ldyBJbnRlZ2VyKElWYWxpZGF0b3IuTWF4RmlsZVBhdGhOYW1lTGVuZ3RoKSB9ICk7Ci0JCQlyZXR1cm4gbmV3IFNhdmVTdGF0dXMoSVN0YXR1cy5FUlJPUiwKLQkJCQkJTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJCQkuZ2V0U3ltYm9saWNOYW1lKCksCi0JCQkJCVNhdmVTdGF0dXMuU0FWRV9FUlJPUiwgbXNnLCBudWxsKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBleGVjdXRlTmVzdGVkQ29tbWFuZHMoKSB7Ci0JCUxpc3QgbmVzdGVkQ29tbWFuZFByb3ZpZGVycyA9IEV4dGVuc2lvbk1hbmFnZXIKLQkJCQkuZ2V0TmVzdGVkQ29tbWFuZFByb3ZpZGVycygpOwotCQlpZiAoIW5lc3RlZENvbW1hbmRQcm92aWRlcnMuaXNFbXB0eSgpKSB7Ci0JCQlpZiAoIWFkZExpc3QuaXNFbXB0eSgpKSB7Ci0JCQkJbmVzdGVkQ29tbWFuZHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gbmVzdGVkQ29tbWFuZFByb3ZpZGVycy5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQlJTmVzdGVkQ29tbWFuZFByb3ZpZGVyIGNtZFByb3ZpZGVyID0gKElOZXN0ZWRDb21tYW5kUHJvdmlkZXIpIGl0ZXIKLQkJCQkJCQkubmV4dCgpOwotCQkJCQl0cnkgewotCQkJCQkJQ29tbWFuZCBjbWQgPSBjbWRQcm92aWRlci5jcmVhdGVSZWxhdGVkT2JqZWN0cyhhZGRMaXN0LAotCQkJCQkJCQl0aGlzKTsKLQkJCQkJCWlmIChjbWQgIT0gbnVsbCAmJiBjbWQuY2FuRXhlY3V0ZSgpKSB7Ci0JCQkJCQkJY21kLmV4ZWN1dGUoKTsKLQkJCQkJCQluZXN0ZWRDb21tYW5kcy5hZGQoY21kKTsKLQkJCQkJCX0KLQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCUxpYnJhcnlFZGl0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQ29udGFpbm1lbnRJbmZvIHsKLQkJRU9iamVjdCBjb250YWluZXI7Ci0KLQkJaW50IGluZGV4OwotCi0JCUNvbnRhaW5tZW50SW5mbyhFT2JqZWN0IGNvbnRhaW5lciwgaW50IGluZGV4KSB7Ci0JCQl0aGlzLmNvbnRhaW5lciA9IGNvbnRhaW5lcjsKLQkJCXRoaXMuaW5kZXggPSBpbmRleDsKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIGNsYXNzIElsbGVnYWxSZWZlcmVuY2VSZW1vdmVyIHsKLQkJcHJpdmF0ZSBNZXRob2RQbHVnaW4gdGFyZ2V0UGx1Z2luOwotCi0JCXByaXZhdGUgQ29sbGVjdGlvbiBlbGVtZW50c1RvTW92ZTsKLQotCQkvKioKLQkJICogbGlzdCBvZiBSZWZlcmVuY2Ugb2JqZWN0cwotCQkgKiAKLQkJICogQHNlZSBSZWZlcmVuY2UKLQkJICovCi0JCXByaXZhdGUgTGlzdCBpbGxlZ2FsUmVmZXJlbmNlczsKLQotCQlwcml2YXRlIFNldCBhZmZlY3RlZFJlc291cmNlczsKLQotCQlwcml2YXRlIEFycmF5TGlzdCByZW1vdmVkUmVmZXJlbmNlczsKLQotCQlwcml2YXRlIGJvb2xlYW4gc2VhcmNoT3V0Z29pbmdSZWZzOwotCi0JCXByaXZhdGUgYm9vbGVhbiBzZWFyY2hJbmNvbWluZ1JlZnM7Ci0KLQkJcHVibGljIElsbGVnYWxSZWZlcmVuY2VSZW1vdmVyKE1ldGhvZFBsdWdpbiB0YXJnZXRQbHVnaW4sCi0JCQkJQ29sbGVjdGlvbiBlbGVtZW50c1RvTW92ZSwgYm9vbGVhbiBzZWFyY2hPdXRnb2luZ1JlZnMsCi0JCQkJYm9vbGVhbiBzZWFyY2hJbmNvbWluZ1JlZnMpIHsKLQkJCXRoaXMudGFyZ2V0UGx1Z2luID0gdGFyZ2V0UGx1Z2luOwotCQkJdGhpcy5lbGVtZW50c1RvTW92ZSA9IGVsZW1lbnRzVG9Nb3ZlOwotCQkJdGhpcy5zZWFyY2hPdXRnb2luZ1JlZnMgPSBzZWFyY2hPdXRnb2luZ1JlZnM7Ci0JCQl0aGlzLnNlYXJjaEluY29taW5nUmVmcyA9IHNlYXJjaEluY29taW5nUmVmczsKLQkJfQotCi0JCXB1YmxpYyBTZXQgZ2V0QWZmZWN0ZWRSZXNvdXJjZXMoKSB7Ci0JCQlpZiAoYWZmZWN0ZWRSZXNvdXJjZXMgPT0gbnVsbCkgewotCQkJCWlsbGVnYWxSZWZlcmVuY2VzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBlbGVtZW50c1RvTW92ZS5pdGVyYXRvcigpOyBpdGVyYXRvcgotCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJT2JqZWN0IG9iaiA9IGl0ZXJhdG9yLm5leHQoKTsKLQotCQkJCQlpZiAob2JqIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJCQkJTWV0aG9kRWxlbWVudCBlID0gKE1ldGhvZEVsZW1lbnQpIG9iajsKLQotCQkJCQkJLy8gZ2V0IG91dGdvaW5nIHJlZmVyZW5jZXMKLQkJCQkJCS8vCi0JCQkJCQlpZiAoc2VhcmNoT3V0Z29pbmdSZWZzCi0JCQkJCQkJCSYmICFpc0V4Y2x1ZGVkRnJvbU91dGdvaW5nUmVmZXJlbmNlQ2hlY2sob2JqKSkgewotCQkJCQkJCWdldElsbGVnYWxPdXRnb2luZ1JlZmVyZW5jZXModGFyZ2V0UGx1Z2luLCBlLAotCQkJCQkJCQkJaWxsZWdhbFJlZmVyZW5jZXMpOwotCQkJCQkJfQotCi0JCQkJCQkvLyBnZXQgaW5jb21pbmcgcmVmZXJlbmNlcwotCQkJCQkJLy8KLQkJCQkJCWlmIChzZWFyY2hJbmNvbWluZ1JlZnMpIHsKLQkJCQkJCQlDb2xsZWN0aW9uIHJlZmVyZW5jZXMgPSBBc3NvY2lhdGlvbkhlbHBlcgotCQkJCQkJCQkJLmdldFJlZmVyZW5jZXMoZSk7Ci0JCQkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gcmVmZXJlbmNlcy5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJCQlNZXRob2RFbGVtZW50IGVsZW1lbnQgPSAoTWV0aG9kRWxlbWVudCkgaXRlcgotCQkJCQkJCQkJCS5uZXh0KCk7Ci0JCQkJCQkJCWlmICghZWxlbWVudHNUb01vdmUuY29udGFpbnMoZWxlbWVudCkpIHsKLQkJCQkJCQkJCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSBVbWFVdGlsCi0JCQkJCQkJCQkJCS5nZXRNZXRob2RQbHVnaW4oZWxlbWVudCk7Ci0JCQkJCQkJCQlpZiAocGx1Z2luICE9IG51bGwKLQkJCQkJCQkJCQkJJiYgcGx1Z2luICE9IHRhcmdldFBsdWdpbgotCQkJCQkJCQkJCQkmJiAhTWlzYy5pc0Jhc2VPZih0YXJnZXRQbHVnaW4sCi0JCQkJCQkJCQkJCQkJcGx1Z2luKSkgewotCQkJCQkJCQkJCUNvbGxlY3Rpb24geFJlZnMgPSBnZXRYUmVmZXJlbmNlcygKLQkJCQkJCQkJCQkJCWVsZW1lbnQsIGUsIG51bGwpOwotCQkJCQkJCQkJCWZvciAoSXRlcmF0b3IgaXRlcjEgPSB4UmVmcy5pdGVyYXRvcigpOyBpdGVyMQotCQkJCQkJCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCQkJCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGYgPSAoRVN0cnVjdHVyYWxGZWF0dXJlKSBpdGVyMQotCQkJCQkJCQkJCQkJCS5uZXh0KCk7Ci0JCQkJCQkJCQkJCWlsbGVnYWxSZWZlcmVuY2VzCi0JCQkJCQkJCQkJCQkJLmFkZChuZXcgUmVmZXJlbmNlKGVsZW1lbnQsCi0JCQkJCQkJCQkJCQkJCQlmLCBlKSk7Ci0JCQkJCQkJCQkJfQotCi0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQlhZmZlY3RlZFJlc291cmNlcyA9IG5ldyBIYXNoU2V0KCk7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gaWxsZWdhbFJlZmVyZW5jZXMuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJUmVmZXJlbmNlIHJlZiA9IChSZWZlcmVuY2UpIGl0ZXIubmV4dCgpOwotCQkJCQlpZiAocmVmLm93bmVyLmVSZXNvdXJjZSgpICE9IG51bGwpIHsKLQkJCQkJCWFmZmVjdGVkUmVzb3VyY2VzLmFkZChyZWYub3duZXIuZVJlc291cmNlKCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIGFmZmVjdGVkUmVzb3VyY2VzOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgcmVtb3ZlSWxsZWdhbFJlZmVyZW5jZXMoKSB7Ci0JCQlyZW1vdmVkUmVmZXJlbmNlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGlsbGVnYWxSZWZlcmVuY2VzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCVJlZmVyZW5jZSByZWYgPSAoUmVmZXJlbmNlKSBpdGVyLm5leHQoKTsKLQkJCQlpZiAocmVmLmZlYXR1cmUuaXNNYW55KCkpIHsKLQkJCQkJTGlzdCBsaXN0ID0gKChMaXN0KSByZWYub3duZXIuZUdldChyZWYuZmVhdHVyZSkpOwotCQkJCQkvLyBUT0RPOiBuZWVkcyByZXZpc2l0Ci0JCQkJCS8vIFRoaXMgY29kZSB0aHJvd3MKLQkJCQkJLy8gb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkJhc2ljRUxpc3QkQmFzaWNJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uCi0JCQkJCS8vIHNvbWV0aW1lcwotCQkJCQkvLwotCQkJCQkvLyBpZihyZWYuaW5kZXggIT0gLTEpIHsKLQkJCQkJLy8gbGlzdC5yZW1vdmUocmVmLmluZGV4KTsKLQkJCQkJLy8gfQotCQkJCQkvLyBlbHNlIHsKLQkJCQkJLy8gbGlzdC5yZW1vdmUocmVmLnZhbHVlKTsKLQkJCQkJLy8gfQotCi0JCQkJCWxpc3QucmVtb3ZlKHJlZi52YWx1ZSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJaWYgKHJlZi5mZWF0dXJlID09IFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJLmdldFZhcmlhYmlsaXR5RWxlbWVudF9WYXJpYWJpbGl0eVR5cGUoKSkgewotCQkJCQkJLy9TaG91bGQgcXVlcnkgdGhlIGRlZmF1bHQgdmFsdWUgaWYgZXh0ZW5kZWQgZm9yIGFueSBhdHRyaWJ1dGUgZmVhdHVyZQotCQkJCQkJcmVmLm93bmVyLmVTZXQocmVmLmZlYXR1cmUsIFZhcmlhYmlsaXR5VHlwZS5OQSk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlyZWYub3duZXIuZVNldChyZWYuZmVhdHVyZSwgbnVsbCk7Ci0JCQkJCQlpZiAocmVmLmZlYXR1cmUgPT0gVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkuZ2V0VmFyaWFiaWxpdHlFbGVtZW50X1ZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSkgewotCQkJCQkJCXJlZi5vd25lci5lU2V0KFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkuZ2V0VmFyaWFiaWxpdHlFbGVtZW50X1ZhcmlhYmlsaXR5VHlwZSgpLCBWYXJpYWJpbGl0eVR5cGUuTkEpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCXJlbW92ZWRSZWZlcmVuY2VzLmFkZChyZWYpOwotCQkJfQotCi0JCX0KLQotCQlwdWJsaWMgdm9pZCByZXN0b3JlUmVtb3ZlZFJlZmVyZW5jZXMoKSB7Ci0JCQlpZiAocmVtb3ZlZFJlZmVyZW5jZXMgPT0gbnVsbCkgewotCQkJCXJldHVybjsKLQkJCX0KLQkJCWZvciAoaW50IGkgPSByZW1vdmVkUmVmZXJlbmNlcy5zaXplKCkgLSAxOyBpID4gLTE7IGktLSkgewotCQkJCVJlZmVyZW5jZSByZWYgPSAoUmVmZXJlbmNlKSByZW1vdmVkUmVmZXJlbmNlcy5nZXQoaSk7Ci0JCQkJaWYgKHJlZi5mZWF0dXJlLmlzTWFueSgpKSB7Ci0JCQkJCUxpc3QgbGlzdCA9ICgoTGlzdCkgcmVmLm93bmVyLmVHZXQocmVmLmZlYXR1cmUpKTsKLQkJCQkJaWYgKHJlZi5pbmRleCAhPSAtMSkgewotCQkJCQkJdHJ5IHsKLQkJCQkJCQkvLyBUT0RPOiBuZWVkIHJldmlzaXRzCi0JCQkJCQkJLy8KLQkJCQkJCQlpZiAoIWxpc3QuY29udGFpbnMocmVmLnZhbHVlKSkgewotCQkJCQkJCQlpZiAocmVmLmluZGV4IDwgbGlzdC5zaXplKCkpIHsKLQkJCQkJCQkJCWxpc3QuYWRkKHJlZi5pbmRleCwgcmVmLnZhbHVlKTsKLQkJCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJCWxpc3QuYWRkKHJlZi52YWx1ZSk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQl0aHJvdyBlOwotCQkJCQkJfQotCQkJCQl9IGVsc2UgewotCQkJCQkJbGlzdC5hZGQocmVmLnZhbHVlKTsKLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCXJlZi5vd25lci5lU2V0KHJlZi5mZWF0dXJlLCByZWYudmFsdWUpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgY2xhc3MgTW92ZU9wZXJhdGlvbiBleHRlbmRzIENvbW1hbmRXcmFwcGVyIHsKLQkJLyoqIENvbnN0YW50cyBmb3Igc3RhdGUgb2YgdGhlIG1vdmUgb3BlcmF0aW9uICovCi0JCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVEFURV9TVEFSVCA9IDA7Ci0KLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNUQVRFX1NBVkVEX0ZJTEVTID0gODA7Ci0KLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNUQVRFX01PVkVEX0ZJTEVTID0gNzA7Ci0KLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNUQVRFX0NPUElFRF9SRVNPVVJDRVMgPSA5MDsKLQotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfRU5EID0gMTAwOwotCi0JCS8vIHByaXZhdGUgQ29tbWFuZCBjb21tYW5kOwotCQlwcml2YXRlIEFkZENvbW1hbmQgYWRkQ29tbWFuZDsKLQotCQlwcml2YXRlIENvbGxlY3Rpb24gbW92ZUxpc3Q7Ci0KLQkJcHJpdmF0ZSBib29sZWFuIHJlbW92ZVhSZWZSZXF1aXJlZCA9IGZhbHNlOwotCi0JCXByaXZhdGUgYm9vbGVhbiBpc1JlZmVucmVjZWRJbGxlZ2FsbHkgPSBmYWxzZTsKLQotCQlwcml2YXRlIE1ldGhvZFBsdWdpbiBvd25lclBsdWdpbjsKLQotCQlwcml2YXRlIE1hcCBlbGVtZW50VG9PbGRQbHVnaW5NYXA7Ci0KLQkJcHJpdmF0ZSBNYXAgZWxlbWVudFRvTmV3TmFtZU1hcDsKLQotCQlwcml2YXRlIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcjsKLQotCQlwcml2YXRlIE9iamVjdCBzaGVsbDsKLQotCQlwcml2YXRlIEhhc2hTZXQgbW92ZWRSZXNvdXJjZXM7Ci0KLQkJcHJpdmF0ZSBNdWx0aVN0YXR1cyBzdGF0dXM7Ci0KLQkJLyoqCi0JCSAqIEN1cnJlbnQgc3RhdGUgb2YgdGhlIG1vdmUgb3BlcmF0aW9uLCBpdCBjYW4gYmUgb25lIG9mIHRoZSBzdGF0ZQotCQkgKiBjb25zdGFudHMKLQkJICovCi0JCXByaXZhdGUgaW50IHN0YXRlOwotCi0JCXByb3RlY3RlZCBTZXQgbW9kaWZpZWRSZXNvdXJjZXM7Ci0KLQkJcHJpdmF0ZSBJbGxlZ2FsUmVmZXJlbmNlUmVtb3ZlciBpbGxlZ2FsUmVmZXJlbmNlUmVtb3ZlcjsKLQotCQlwcml2YXRlIEhhc2hNYXAgZWxlbWVudFRvT2xkQ29udGFpbmVyTWFwOwotCi0JCXB1YmxpYyBNb3ZlT3BlcmF0aW9uKENvbW1hbmQgY29tbWFuZCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLAotCQkJCU9iamVjdCBzaGVsbCkgewotCQkJc3VwZXIoY29tbWFuZCk7Ci0JCQlhZGRDb21tYW5kID0gKEFkZENvbW1hbmQpIFRuZ1V0aWwudW53cmFwKGNvbW1hbmQpOwotCQkJdGhpcy5tb25pdG9yID0gbW9uaXRvcjsKLQkJCXRoaXMuc2hlbGwgPSBzaGVsbDsKLQkJfQotCQkKLQkJcHVibGljIE1hcCBnZXRFbGVtZW50VG9PbGRQbHVnaW5NYXAoKSB7Ci0JCQlyZXR1cm4gZWxlbWVudFRvT2xkUGx1Z2luTWFwOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgc3RhdHVzLgotCQkgKi8KLQkJcHVibGljIElTdGF0dXMgZ2V0U3RhdHVzKCkgewotCQkJcmV0dXJuIHN0YXR1czsKLQkJfQotCi0JCS8qKgotCQkgKiBDaGVja3MgaWYgcmVsb2FkaW5nIGxpYnJhcnkgaXMgbmVlZGVkIGluIGNhc2Ugb2YgbW92ZSBmYWlsdXJlCi0JCSAqIAotCQkgKiBAcmV0dXJuCi0JCSAqIEBzZWUgI2dldFN0YXR1cygpCi0JCSAqLwotCQlwdWJsaWMgYm9vbGVhbiByZWxvYWROZWVkZWQoKSB7Ci0JCQlyZXR1cm4gc3RhdHVzICE9IG51bGwKLQkJCQkJJiYgQ29tbWFuZFN0YXR1c0NoZWNrZXIuaGFzUm9sbGJhY2tFcnJvcihzdGF0dXMpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgdW5kbygpIHsKLQkJCS8vIHVuZG8gbmFtZSBjaGFuZ2UKLQkJCS8vCi0JCQlpZiAoZWxlbWVudFRvTmV3TmFtZU1hcCAhPSBudWxsKSB7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gZWxlbWVudFRvTmV3TmFtZU1hcC5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCU1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIGl0ZXIubmV4dCgpOwotCQkJCQlOYW1lZEVsZW1lbnQgZSA9IChOYW1lZEVsZW1lbnQpIGVudHJ5LmdldEtleSgpOwotCQkJCQllLnNldE5hbWUoKFN0cmluZykgZW50cnkuZ2V0VmFsdWUoKSk7Ci0JCQkJfQotCQkJfQotCi0JCQlpZiAoZWxlbWVudFRvT2xkQ29udGFpbmVyTWFwICE9IG51bGwpIHsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBlbGVtZW50VG9PbGRDb250YWluZXJNYXAuZW50cnlTZXQoKQotCQkJCQkJLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQlNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBpdGVyLm5leHQoKTsKLQkJCQkJRU9iamVjdCBlID0gKEVPYmplY3QpIGVudHJ5LmdldEtleSgpOwotCQkJCQlDb250YWlubWVudEluZm8gY29udGFpbm1lbnRJbmZvID0gKENvbnRhaW5tZW50SW5mbykgZW50cnkKLQkJCQkJCQkuZ2V0VmFsdWUoKTsKLQkJCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGYgPSBhZGRDb21tYW5kLmdldEZlYXR1cmUoKTsKLQkJCQkJaWYgKGYuaXNNYW55KCkpIHsKLQkJCQkJCSgoTGlzdCkgY29udGFpbm1lbnRJbmZvLmNvbnRhaW5lci5lR2V0KGYpKS5hZGQoCi0JCQkJCQkJCWNvbnRhaW5tZW50SW5mby5pbmRleCwgZSk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQljb250YWlubWVudEluZm8uY29udGFpbmVyLmVTZXQoZiwgZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmIChpbGxlZ2FsUmVmZXJlbmNlUmVtb3ZlciAhPSBudWxsKSB7Ci0JCQkJaWxsZWdhbFJlZmVyZW5jZVJlbW92ZXIucmVzdG9yZVJlbW92ZWRSZWZlcmVuY2VzKCk7Ci0JCQl9Ci0JCX0KLQkJCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQkJcnVuKCk7Ci0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCXN0YXRlID0gU1RBVEVfU1RBUlQ7Ci0KLQkJCXN0YXR1cyA9IG5ldyBNdWx0aVN0YXR1cyhMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkuZ2V0U3ltYm9saWNOYW1lKCksIElTdGF0dXMuT0ssCi0JCQkJCUxpYnJhcnlFZGl0UmVzb3VyY2VzLmVycm9yX3JlYXNvbiwgbnVsbCk7IAotCi0JCQlpZiAoY2hlY2tOYW1lKCkpIHsKLQkJCQkvLyBjaGVjayBpZiB0aGUgY29uZmlndXJhdGlvbnMgdGhhdCB3aWxsIGJlIHVwZGF0ZWQgYWZ0ZXIgdGhpcwotCQkJCS8vIGNvbW1hbmQgY2FuIGJlIG1vZGlmaWVkCi0JCQkJLy8KLQkJCQlJU3RhdHVzIGV4ZWNTdGF0dXMgPSBVc2VySW50ZXJhY3Rpb25IZWxwZXIKLQkJCQkJCS5jaGVja0NvbmZpZ3VyYXRpb25zVG9VcGRhdGUoYWRkQ29tbWFuZCwgc2hlbGwpOwotCQkJCWlmICghZXhlY1N0YXR1cy5pc09LKCkpIHsKLQkJCQkJTWVzc2VuZ2VyLklOU1RBTkNFLnNob3dFcnJvcihMaWJyYXJ5RWRpdFJlc291cmNlcy5tb3ZlRGlhbG9nX3RpdGxlLCBudWxsLCBleGVjU3RhdHVzKTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQotCQkJCWZpbmFsIFN0cmluZ0J1ZmZlciBtc2dCdWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQkJSVJ1bm5hYmxlV2l0aFByb2dyZXNzIHJ1bm5hYmxlID0gbmV3IElSdW5uYWJsZVdpdGhQcm9ncmVzcygpIHsKLQotCQkJCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQotCQkJCQkJCXRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLAotCQkJCQkJCUludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJCQkJCW1vbml0b3IKLQkJCQkJCQkJLnN1YlRhc2soTGlicmFyeUVkaXRSZXNvdXJjZXMuY2hlY2tpbmdSZWZlcmVuY2VzVGFza19uYW1lKTsgCi0JCQkJCQlTdHJpbmcgbXNnID0gY2hlY2tGb3JJbGxlZ2FsUmVmZXJlbmNlcygpOwotCQkJCQkJaWYgKG1zZyAhPSBudWxsKSB7Ci0JCQkJCQkJbXNnQnVmZmVyLmFwcGVuZChtc2cpOwotCQkJCQkJfQotCQkJCQl9Ci0KLQkJCQl9OwotCi0JCQkJSVN0YXR1cyBzdGF0ID0gVXNlckludGVyYWN0aW9uSGVscGVyLmdldFVJSGVscGVyKCkucnVuSW5Nb2RhbENvbnRleHQocnVubmFibGUsIHRydWUsIG1vbml0b3IsIHNoZWxsKTsKLQkJCQlpZighc3RhdC5pc09LKCkpIHsKLQkJCQkJc3RhdHVzLmFkZChzdGF0KTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQotCQkJCWlmIChtc2dCdWZmZXIubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJCUlVc2VySW50ZXJhY3Rpb25IYW5kbGVyIHVpSGFuZGxlciA9IEV4dGVuc2lvbk1hbmFnZXIuZ2V0RGVmYXVsdFVzZXJJbnRlcmFjdGlvbkhhbmRsZXIoKTsKLQkJCQkJaWYodWlIYW5kbGVyICAhPSBudWxsKSB7Ci0JCQkJCQlpbnQgcmV0ID0gdWlIYW5kbGVyLnNlbGVjdE9uZShuZXcgaW50W10ge0lVc2VySW50ZXJhY3Rpb25IYW5kbGVyLkFDVElPTl9ZRVMsIElVc2VySW50ZXJhY3Rpb25IYW5kbGVyLkFDVElPTl9OTyB9LCAKLQkJCQkJCQkJTGlicmFyeUVkaXRSZXNvdXJjZXMubW92ZURpYWxvZ190aXRsZSwgbXNnQnVmZmVyLnRvU3RyaW5nKCksIG51bGwpOwotCQkJCQkJaWYocmV0ID09IElVc2VySW50ZXJhY3Rpb25IYW5kbGVyLkFDVElPTl9OTykgewotCQkJCQkJCXJldHVybjsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQotCQkJCS8vIHNhdmUgcmVmZXJlbmNlIHRvIG9sZCByZXNvdXJjZSBvZiBhbGwgZWxlbWVudHMgaW4gdGhlCi0JCQkJLy8gbW92ZUxpc3QKLQkJCQkvLwotCQkJCWZpbmFsIE1hcCBlbGVtZW50VG9PbGRSZXNvdXJjZU1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gbW92ZUxpc3QuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCUVPYmplY3QgZWxlbWVudCA9IChFT2JqZWN0KSBpdGVyLm5leHQoKTsKLQkJCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQkJCQkvLyBzYXZlIHRoZSByZWZlcmVuY2UgdG8gb2xkIHJlc291cmNlCi0JCQkJCQkvLwotCQkJCQkJZWxlbWVudFRvT2xkUmVzb3VyY2VNYXAucHV0KGVsZW1lbnQsIGVsZW1lbnQKLQkJCQkJCQkJLmVSZXNvdXJjZSgpKTsKLQkJCQkJfQotCQkJCX0KLQotCQkJCWlmIChyZW1vdmVYUmVmUmVxdWlyZWQgfHwgaXNSZWZlbnJlY2VkSWxsZWdhbGx5KSB7Ci0JCQkJCS8vIGdldCBzZXQgb2YgcmVzb3VyY2VzIHRoYXQgd2lsbCBiZSBtb2RpZmllZCBkdXJpbmcgdGhpcwotCQkJCQkvLyBtb3ZlCi0JCQkJCS8vCi0JCQkJCWlsbGVnYWxSZWZlcmVuY2VSZW1vdmVyID0gbmV3IElsbGVnYWxSZWZlcmVuY2VSZW1vdmVyKAotCQkJCQkJCW93bmVyUGx1Z2luLCBtb3ZlTGlzdCwgcmVtb3ZlWFJlZlJlcXVpcmVkLAotCQkJCQkJCWlzUmVmZW5yZWNlZElsbGVnYWxseSk7Ci0JCQkJCXJ1bm5hYmxlID0gbmV3IElSdW5uYWJsZVdpdGhQcm9ncmVzcygpIHsKLQotCQkJCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLQkJCQkJCQkJdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sCi0JCQkJCQkJCUludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJCQkJCQltb25pdG9yCi0JCQkJCQkJCQkuc3ViVGFzayhMaWJyYXJ5RWRpdFJlc291cmNlcy5jaGVja0FmZmVjdGVkUmVzb3VyY2VzVGFza19uYW1lKTsgCi0JCQkJCQkJbW9kaWZpZWRSZXNvdXJjZXMgPSBpbGxlZ2FsUmVmZXJlbmNlUmVtb3ZlcgotCQkJCQkJCQkJLmdldEFmZmVjdGVkUmVzb3VyY2VzKCk7Ci0JCQkJCQl9Ci0KLQkJCQkJfTsKLQkJCQkJc3RhdCA9IFVzZXJJbnRlcmFjdGlvbkhlbHBlci5nZXRVSUhlbHBlcigpLnJ1bkluTW9kYWxDb250ZXh0KHJ1bm5hYmxlLCB0cnVlLCBtb25pdG9yLCBzaGVsbCk7Ci0JCQkJCWlmKCFzdGF0LmlzT0soKSkgewotCQkJCQkJc3RhdHVzLmFkZChzdGF0KTsKLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCi0JCQkJCS8vIGNoZWNrIGFmZmVjdGVkIHJlc291cmNlcyBmb3IgdW5tb2RpZmlhYmxlCi0JCQkJCWV4ZWNTdGF0dXMgPSBVc2VySW50ZXJhY3Rpb25IZWxwZXIuY2hlY2tNb2RpZnkoCi0JCQkJCQkJbW9kaWZpZWRSZXNvdXJjZXMsIHNoZWxsKTsKLQkJCQkJaWYgKCFleGVjU3RhdHVzLmlzT0soKSkgewotCQkJCQkJTWVzc2VuZ2VyLklOU1RBTkNFLnNob3dFcnJvcihMaWJyYXJ5RWRpdFJlc291cmNlcy5tb3ZlRGlhbG9nX3RpdGxlLCBudWxsLCBleGVjU3RhdHVzKTsKLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCi0JCQkJCXRyeSB7Ci0JCQkJCQltb25pdG9yCi0JCQkJCQkJCS5zdWJUYXNrKExpYnJhcnlFZGl0UmVzb3VyY2VzLnJlbW92aW5nUmVmZXJlbmNlc3Rhc2tfbmFtZSk7IAotCQkJCQkJaWxsZWdhbFJlZmVyZW5jZVJlbW92ZXIucmVtb3ZlSWxsZWdhbFJlZmVyZW5jZXMoKTsKLQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCXVuZG8oKTsKLQkJCQkJCVN0cmluZyBtc2cgPSBUbmdVdGlsLnRvU3RhY2tUcmFjZVN0cmluZyhlKTsKLQkJCQkJCXN0YXR1cy5hZGQobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLAotCQkJCQkJCQlMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRTeW1ib2xpY05hbWUoKSwKLQkJCQkJCQkJMCwgbXNnLCBlKSk7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQltb2RpZmllZFJlc291cmNlcyA9IG5ldyBIYXNoU2V0KCk7Ci0JCQkJCW1vbml0b3Iuc3ViVGFzaygiIik7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0KLQkJCQkvLyBzZXQgbmV3IG5hbWUgaWYgdGhlcmUgaXMgYW55Ci0JCQkJLy8KLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBlbGVtZW50VG9OZXdOYW1lTWFwLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSkgaXRlci5uZXh0KCk7Ci0JCQkJCU5hbWVkRWxlbWVudCBlbGVtZW50ID0gKE5hbWVkRWxlbWVudCkgZW50cnkuZ2V0S2V5KCk7Ci0JCQkJCWVsZW1lbnQuc2V0TmFtZSgoU3RyaW5nKSBlbnRyeS5nZXRWYWx1ZSgpKTsKLQkJCQkJbW9kaWZpZWRSZXNvdXJjZXMuYWRkKGVsZW1lbnQuZVJlc291cmNlKCkpOwotCQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZFVuaXQpIHsKLQkJCQkJCW1vdmVkUmVzb3VyY2VzLmFkZChlbGVtZW50LmVSZXNvdXJjZSgpKTsKLQkJCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgQ29udGVudEVsZW1lbnQpIHsKLQkJCQkJCQlDb250ZW50RWxlbWVudCBlID0gKENvbnRlbnRFbGVtZW50KSBlbGVtZW50OwotCQkJCQkJCWlmIChDb250ZW50RGVzY3JpcHRpb25GYWN0b3J5Lmhhc1ByZXNlbnRhdGlvbihlKSkgewotCQkJCQkJCQltb3ZlZFJlc291cmNlcy5hZGQoZS5nZXRQcmVzZW50YXRpb24oKSk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCi0JCQkJLy8gbW92ZSBlbGVtZW50cwotCQkJCS8vCi0JCQkJcnVubmFibGUgPSBuZXcgSVJ1bm5hYmxlV2l0aFByb2dyZXNzKCkgewotCi0JCQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCi0JCQkJCQkJdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sCi0JCQkJCQkJSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQkJCQkJbW9uaXRvcgotCQkJCQkJCQkuc2V0VGFza05hbWUoTGlicmFyeUVkaXRSZXNvdXJjZXMubW92aW5nVGFza19uYW1lKTsgCi0JCQkJCQlkb01vdmUobW9uaXRvciwgZWxlbWVudFRvT2xkUmVzb3VyY2VNYXAsCi0JCQkJCQkJCW1vZGlmaWVkUmVzb3VyY2VzKTsKLQkJCQkJfQotCi0JCQkJfTsKLQkJCQlzdGF0ID0gVXNlckludGVyYWN0aW9uSGVscGVyLmdldFVJSGVscGVyKCkucnVuSW5Nb2RhbENvbnRleHQocnVubmFibGUsIHRydWUsIG1vbml0b3IsIHNoZWxsKTsKLQkJCQlpZighc3RhdC5pc09LKCkpIHsKLQkJCQkJdW5kbygpOwotCQkJCQlzdGF0dXMuYWRkKHN0YXQpOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCi0KLQkJCQkvLyBjaGVjayBtb3ZlZCByZXNvdXJjZXMgdGhhdCBhcmUgbm90IGluIG1vZGlmaWFibGUgcmVzb3VyY2VzCi0JCQkJLy8gZm9yIHVubW9kaWZpYWJsZQotCQkJCS8vCi0JCQkJTGlzdCByZXNvdXJjZXMgPSBuZXcgQXJyYXlMaXN0KG1vdmVkUmVzb3VyY2VzKTsKLQkJCQlyZXNvdXJjZXMucmVtb3ZlQWxsKG1vZGlmaWVkUmVzb3VyY2VzKTsKLQkJCQlleGVjU3RhdHVzID0gVXNlckludGVyYWN0aW9uSGVscGVyCi0JCQkJCQkuY2hlY2tNb2RpZnkocmVzb3VyY2VzLCBzaGVsbCk7Ci0JCQkJaWYgKCFleGVjU3RhdHVzLmlzT0soKSkgewotCQkJCQlNZXNzZW5nZXIuSU5TVEFOQ0Uuc2hvd0Vycm9yKExpYnJhcnlFZGl0UmVzb3VyY2VzLm1vdmVEaWFsb2dfdGl0bGUsIG51bGwsIGV4ZWNTdGF0dXMpOwotCi0JCQkJCXVuZG8oKTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQotCQkJCS8vIHNhdmUgcmVzb3VyY2VzCi0JCQkJLy8KLQkJCQlydW5uYWJsZSA9IG5ldyBJUnVubmFibGVXaXRoUHJvZ3Jlc3MoKSB7Ci0KLQkJCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLQkJCQkJCQl0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwKLQkJCQkJCQlJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCQkJCQl0cnkgewotCQkJCQkJCUlTdGF0dXMgc2F2ZVN0YXR1cyA9IHNhdmUobW9uaXRvcik7Ci0JCQkJCQkJaWYgKCFzYXZlU3RhdHVzLmlzT0soKSkgewotCQkJCQkJCQlzdGF0dXMuYWRkKHNhdmVTdGF0dXMpOwotCQkJCQkJCX0KLQkJCQkJCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkJCQkJCUxpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmxvZyhlKTsKLQkJCQkJCQl0aHJvdyBlOwotCQkJCQkJfQotCQkJCQl9Ci0KLQkJCQl9OwotCQkJCXN0YXQgPSBVc2VySW50ZXJhY3Rpb25IZWxwZXIuZ2V0VUlIZWxwZXIoKS5ydW5Jbk1vZGFsQ29udGV4dChydW5uYWJsZSwgdHJ1ZSwgbW9uaXRvciwgc2hlbGwpOwotCQkJCWlmKCFzdGF0LmlzT0soKSkgewotCQkJCQlzdGF0dXMuYWRkKHN0YXQpOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCi0JCQkJLy8gcnVuIG5lc3RlZCBjb21tYW5kcwotCQkJCS8vCi0JCQkJTmVzdGVkQ29tbWFuZEV4Y2VjdXRvciBuZXN0ZWRDb21tYW5kRXhjZWN1dG9yID0gbmV3IE5lc3RlZENvbW1hbmRFeGNlY3V0b3IodGhpcyk7Ci0JCQkJdHJ5IHsKLQkJCQkJbmVzdGVkQ29tbWFuZEV4Y2VjdXRvci5leGVjdXRlTmVzdGVkQ29tbWFuZHMoKTsKLQkJCQl9Ci0JCQkJZmluYWxseSB7Ci0JCQkJCW5lc3RlZENvbW1hbmRFeGNlY3V0b3IuZGlzcG9zZSgpOwotCQkJCX0KLQkJCX0KLQotCQkJc3RhdGUgPSBTVEFURV9FTkQ7Ci0JCX0KLQotCQkvKioKLQkJICogaW50ZXJhY3RzIHdpdGggdXNlcgotCQkgKiAKLQkJICogQHJldHVybgotCQkgKi8KLQkJcHJpdmF0ZSBib29sZWFuIGNoZWNrTmFtZSgpIHsKLQkJCWVsZW1lbnRUb05ld05hbWVNYXAgPSBNZXRob2RFbGVtZW50QWRkQ29tbWFuZC5jaGVja05hbWUoYWRkQ29tbWFuZCk7Ci0JCQlyZXR1cm4gZWxlbWVudFRvTmV3TmFtZU1hcCAhPSBudWxsOwotCQl9Ci0KLQkJLyoqCi0JCSAqIExvbmcgcnVubmluZyBtZXRob2QKLQkJICogCi0JCSAqIEByZXR1cm4KLQkJICovCi0JCXByaXZhdGUgU3RyaW5nIGNoZWNrRm9ySWxsZWdhbFJlZmVyZW5jZXMoKSB7Ci0JCQllbGVtZW50VG9PbGRQbHVnaW5NYXAgPSBuZXcgSGFzaE1hcCgpOwotCi0JCQltb3ZlTGlzdCA9IG5ldyBBcnJheUxpc3QoYWRkQ29tbWFuZC5nZXRDb2xsZWN0aW9uKCkpOwotCQkJbW92ZWRSZXNvdXJjZXMgPSBuZXcgSGFzaFNldCgpOwotCi0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBhZGRDb21tYW5kLmdldENvbGxlY3Rpb24oKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJRU9iamVjdCBlbGVtZW50ID0gKEVPYmplY3QpIGl0ZXIubmV4dCgpOwotCi0JCQkJLy8gLy8gc2V0IG5ldyBuYW1lIGlmIHRoZXJlIGlzIGFueQotCQkJCS8vIC8vCi0JCQkJLy8gU3RyaW5nIG5ld05hbWUgPSAoU3RyaW5nKSBlbGVtZW50VG9OZXdOYW1lTWFwLmdldChlbGVtZW50KTsKLQkJCQkvLyBpZihuZXdOYW1lICE9IG51bGwpIHsKLQkJCQkvLyAoKE5hbWVkRWxlbWVudCllbGVtZW50KS5zZXROYW1lKG5ld05hbWUpOwotCQkJCS8vIGlmKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RVbml0KSB7Ci0JCQkJLy8gbW92ZWRSZXNvdXJjZXMuYWRkKGVsZW1lbnQuZVJlc291cmNlKCkpOwotCQkJCS8vIGlmKGVsZW1lbnQgaW5zdGFuY2VvZiBDb250ZW50RWxlbWVudCkgewotCQkJCS8vIENvbnRlbnRFbGVtZW50IGUgPSAoQ29udGVudEVsZW1lbnQpIGVsZW1lbnQ7Ci0JCQkJLy8gaWYoQ29udGVudERlc2NyaXB0aW9uRmFjdG9yeS5oYXNQcmVzZW50YXRpb24oZSkpIHsKLQkJCQkvLyBtb3ZlZFJlc291cmNlcy5hZGQoZS5nZXRQcmVzZW50YXRpb24oKSk7Ci0JCQkJLy8gfQotCQkJCS8vIH0KLQkJCQkvLyB9Ci0JCQkJLy8gfQotCi0JCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQkJCWVsZW1lbnRUb09sZFBsdWdpbk1hcC5wdXQoZWxlbWVudCwgVW1hVXRpbAotCQkJCQkJCS5nZXRNZXRob2RQbHVnaW4oZWxlbWVudCkpOwotCQkJCX0KLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gZWxlbWVudC5lQWxsQ29udGVudHMoKTsgaXRlcmF0b3IKLQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCW1vdmVMaXN0LmFkZChpdGVyYXRvci5uZXh0KCkpOwotCQkJCX0KLQkJCX0KLQotCQkJLy8gY2hlY2sgaWYgdGhlcmUgaXMgYW55IGlsbGVnYWwgcmVmZXJlbmNlIGluIHRoZSBtb3ZlZCBvYmplY3RzCi0JCQkvLwkJCQotCQkJb3duZXJQbHVnaW4gPSBVbWFVdGlsLmdldE1ldGhvZFBsdWdpbihhZGRDb21tYW5kLmdldE93bmVyKCkpOwotCQkJZmluZF94UGx1Z2luUmVmOiBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBhZGRDb21tYW5kLmdldENvbGxlY3Rpb24oKQotCQkJCQkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyLm5leHQoKTsKLQotCQkJCWlmIChpc0V4Y2x1ZGVkRnJvbU91dGdvaW5nUmVmZXJlbmNlQ2hlY2soZWxlbWVudCkpIHsKLQkJCQkJY29udGludWUgZmluZF94UGx1Z2luUmVmOwotCQkJCX0KLQotCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJCQlpZiAoaGFzSWxsZWdhbFJlZmVyZW5jZUluY2x1ZGluZ0FsbENoaWxkcmVuKG93bmVyUGx1Z2luLAotCQkJCQkJCShNZXRob2RFbGVtZW50KSBlbGVtZW50LCBtb3ZlTGlzdCkpIHsKLQkJCQkJCXJlbW92ZVhSZWZSZXF1aXJlZCA9IHRydWU7Ci0JCQkJCQlicmVhayBmaW5kX3hQbHVnaW5SZWY7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCWZpbmRfaWxsZWdhbFJlZmVyZW5jZXI6IGZvciAoSXRlcmF0b3IgaXRlciA9IG1vdmVMaXN0Lml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3QgZWxlbWVudCA9IGl0ZXIubmV4dCgpOwotCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJCQlpZiAoaXNSZWZlcmVuY2VkSWxsZWdhbGx5KG93bmVyUGx1Z2luLAotCQkJCQkJCShNZXRob2RFbGVtZW50KSBlbGVtZW50LCBtb3ZlTGlzdCkpIHsKLQkJCQkJCWlzUmVmZW5yZWNlZElsbGVnYWxseSA9IHRydWU7Ci0JCQkJCQlicmVhayBmaW5kX2lsbGVnYWxSZWZlcmVuY2VyOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJaWYgKHJlbW92ZVhSZWZSZXF1aXJlZCB8fCBpc1JlZmVucmVjZWRJbGxlZ2FsbHkpIHsKLQkJCQlyZXR1cm4gTGlicmFyeUVkaXRSZXNvdXJjZXMuaW52YWxpZFJlZmVyZW5jZXNFcnJvcl9yZWFzb247IAotCQkJfQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQkvKioKLQkJICogTG9uZyBydW5uaW5nIG1ldGhvZAotCQkgKiAKLQkJICogQHJldHVybgotCQkgKi8KLQkJcHJpdmF0ZSB2b2lkIGRvTW92ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsCi0JCQkJTWFwIGVsZW1lbnRUb09sZFJlc291cmNlTWFwLCBTZXQgbW9kaWZpZWRSZXNvdXJjZXMpIHsKLQkJCW1vbml0b3Iuc3ViVGFzaygiIik7IC8vJE5PTi1OTFMtMSQKLQotCQkJZWxlbWVudFRvT2xkQ29udGFpbmVyTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGFkZENvbW1hbmQuZ2V0Q29sbGVjdGlvbigpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQlFT2JqZWN0IGVsZW1lbnQgPSAoRU9iamVjdCkgaXRlci5uZXh0KCk7Ci0JCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQkJCUVPYmplY3QgY29udGFpbmVyID0gZWxlbWVudC5lQ29udGFpbmVyKCk7Ci0JCQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gZWxlbWVudC5lQ29udGFpbmluZ0ZlYXR1cmUoKTsKLQkJCQkJaW50IGluZGV4OwotCQkJCQlpZiAoZmVhdHVyZS5pc01hbnkoKSkgewotCQkJCQkJaW5kZXggPSAoKExpc3QpIGNvbnRhaW5lci5lR2V0KGZlYXR1cmUpKQotCQkJCQkJCQkuaW5kZXhPZihlbGVtZW50KTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCWluZGV4ID0gLTE7Ci0JCQkJCX0KLQkJCQkJZWxlbWVudFRvT2xkQ29udGFpbmVyTWFwLnB1dChlbGVtZW50LCBuZXcgQ29udGFpbm1lbnRJbmZvKAotCQkJCQkJCWNvbnRhaW5lciwgaW5kZXgpKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCS8vIG1vdmUgdGhlIGVsZW1lbnRzCi0JCQkvLwotCQkJYWRkQ29tbWFuZC5leGVjdXRlKCk7Ci0KLQkJCS8vIGNvbGxlY3QgcmVzb3VyY2VzIHRoYXQgaGFkIGJlZW4gbW9kaWZlZCBhcyByZXN1bHQgb2YgdGhpcyBtb3ZlCi0JCQkvLwotCQkJUmVzb3VyY2UgbmV3UmVzb3VyY2UgPSBhZGRDb21tYW5kLmdldE93bmVyKCkuZVJlc291cmNlKCk7Ci0JCQltb2RpZmllZFJlc291cmNlcy5hZGQobmV3UmVzb3VyY2UpOwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gYWRkQ29tbWFuZC5nZXRBZmZlY3RlZE9iamVjdHMoKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJRU9iamVjdCBlbGVtZW50ID0gKEVPYmplY3QpIFRuZ1V0aWwudW53cmFwKGl0ZXIubmV4dCgpKTsKLQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCQkJRU9iamVjdCBvbGRDb250YWluZXIgPSAoKENvbnRhaW5tZW50SW5mbykgZWxlbWVudFRvT2xkQ29udGFpbmVyTWFwCi0JCQkJCQkJLmdldChlbGVtZW50KSkuY29udGFpbmVyOwotCQkJCQlpZiAob2xkQ29udGFpbmVyLmVSZXNvdXJjZSgpICE9IG5ld1Jlc291cmNlCi0JCQkJCQkJJiYgIW9sZENvbnRhaW5lci5lUmVzb3VyY2UoKS5nZXRDb250ZW50cygpCi0JCQkJCQkJCQkuaXNFbXB0eSgpKSB7Ci0JCQkJCQltb2RpZmllZFJlc291cmNlcy5hZGQob2xkQ29udGFpbmVyLmVSZXNvdXJjZSgpKTsKLQkJCQkJCVJlc291cmNlIG9sZFJlc291cmNlID0gKFJlc291cmNlKSBlbGVtZW50VG9PbGRSZXNvdXJjZU1hcAotCQkJCQkJCQkuZ2V0KGVsZW1lbnQpOwotCQkJCQkJaWYgKG9sZENvbnRhaW5lci5lUmVzb3VyY2UoKSAhPSBvbGRSZXNvdXJjZSkgewotCQkJCQkJCW1vdmVkUmVzb3VyY2VzLmFkZChvbGRSZXNvdXJjZSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQotCQkJCQlPYmplY3QgcGx1Z2luID0gZWxlbWVudFRvT2xkUGx1Z2luTWFwLmdldChlbGVtZW50KTsKLQkJCQkJaWYgKG93bmVyUGx1Z2luICE9IHBsdWdpbikgewotCQkJCQkJLy8gaXQncyBhIGNyb3NzLXBsdWdpbiBtb3ZlLCBhZGQgdGhlIHJlc291cmNlcyBvZiB0aG9zZQotCQkJCQkJLy8gY2hpbGRyZW4gdGhhdCBoYXZlIGRpcmVjdCByZXNvdXJjZQotCQkJCQkJLy8gdG8gdGhlIG1vdmVSZXNvdXJjZXMgbGlzdAotCQkJCQkJLy8JCQkJCQkKLQkJCQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBlbGVtZW50LmVBbGxDb250ZW50cygpOyBpdGVyYXRvcgotCQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJCUVPYmplY3QgZSA9IChFT2JqZWN0KSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCQkJaWYgKFVtYVV0aWwuaGFzRGlyZWN0UmVzb3VyY2UoZSkpIHsKLQkJCQkJCQkJbW92ZWRSZXNvdXJjZXMuYWRkKGUuZVJlc291cmNlKCkpOwotCQkJCQkJCQllbGVtZW50VG9PbGRQbHVnaW5NYXAucHV0KGUsIHBsdWdpbik7Ci0JCQkJCQkJfQotCQkJCQkJfQotCi0JCQkJCQkvLyBpZihlbGVtZW50IGluc3RhbmNlb2YgRGVzY3JpYmFibGVFbGVtZW50ICYmCi0JCQkJCQkvLyBDb250ZW50RGVzY3JpcHRpb25GYWN0b3J5Lmhhc1ByZXNlbnRhdGlvbigoRGVzY3JpYmFibGVFbGVtZW50KQotCQkJCQkJLy8gZWxlbWVudCkpIHsKLQkJCQkJCS8vIG1vdmVkUmVzb3VyY2VzLmFkZCgoKERlc2NyaWJhYmxlRWxlbWVudCllbGVtZW50KS5nZXRQcmVzZW50YXRpb24oKS5lUmVzb3VyY2UoKSk7Ci0JCQkJCQkvLyBlbGVtZW50VG9PbGRQbHVnaW5NYXAucHV0KCgoRGVzY3JpYmFibGVFbGVtZW50KWVsZW1lbnQpLmdldFByZXNlbnRhdGlvbigpLAotCQkJCQkJLy8gcGx1Z2luKTsKLQkJCQkJCS8vIH0KLQkJCQkJCS8vIGZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBlbGVtZW50LmVBbGxDb250ZW50cygpOwotCQkJCQkJLy8gaXRlcmF0b3IKLQkJCQkJCS8vIC5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkvLyBPYmplY3QgZSA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJCS8vIGlmKGUgaW5zdGFuY2VvZiBEZXNjcmliYWJsZUVsZW1lbnQgJiYKLQkJCQkJCS8vIENvbnRlbnREZXNjcmlwdGlvbkZhY3RvcnkuaGFzUHJlc2VudGF0aW9uKChEZXNjcmliYWJsZUVsZW1lbnQpCi0JCQkJCQkvLyBlKSkgewotCQkJCQkJLy8gbW92ZWRSZXNvdXJjZXMuYWRkKCgoRGVzY3JpYmFibGVFbGVtZW50KWUpLmdldFByZXNlbnRhdGlvbigpLmVSZXNvdXJjZSgpKTsKLQkJCQkJCS8vIGVsZW1lbnRUb09sZFBsdWdpbk1hcC5wdXQoKChEZXNjcmliYWJsZUVsZW1lbnQpZSkuZ2V0UHJlc2VudGF0aW9uKCksCi0JCQkJCQkvLyBwbHVnaW4pOwotCQkJCQkJLy8gfQotCQkJCQkJLy8gfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcHJpdmF0ZSBJU3RhdHVzIHNhdmUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCQlNdWx0aVN0YXR1cyBzdGF0dXMgPSBuZXcgTXVsdGlTdGF0dXMoCi0JCQkJCUxpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldFN5bWJvbGljTmFtZSgpLAotCQkJCQlJU3RhdHVzLk9LLAotCQkJCQlMaWJyYXJ5RWRpdFJlc291cmNlcy5NZXRob2RFbGVtZW50QWRkQ29tbWFuZF9lcnJvclNhdmluZ0ZpbGVzLAotCQkJCQludWxsKTsgCi0KLQkJCW1vbml0b3Iuc3ViVGFzayhMaWJyYXJ5RWRpdFJlc291cmNlcy5zYXZpbmdNb2RpZmllZEZpbGVzVGFza19uYW1lKTsgCi0JCQlJTGlicmFyeVBlcnNpc3Rlci5GYWlsU2FmZU1ldGhvZExpYnJhcnlQZXJzaXN0ZXIgcGVyc2lzdGVyID0gU2VydmljZXMKLQkJCQkJLmdldERlZmF1bHRMaWJyYXJ5UGVyc2lzdGVyKCkuZ2V0RmFpbFNhZmVQZXJzaXN0ZXIoKTsKLQkJCXNhdmU6IGRvIHsKLQkJCQl0cnkgewotCi0JCQkJCWlmICghbW92ZWRSZXNvdXJjZXMuaXNFbXB0eSgpKSB7Ci0JCQkJCQltb25pdG9yCi0JCQkJCQkJCS5zdWJUYXNrKExpYnJhcnlFZGl0UmVzb3VyY2VzLm1vdmluZ0ZpbGVzVGFza19uYW1lKTsgCi0KLQkJCQkJCS8vIG1vdmUgdGhlIG1vdmVkIHJlc291cmNlcwotCQkJCQkJLy8KLQkJCQkJCXBlcnNpc3Rlci5hZGp1c3RMb2NhdGlvbihtb3ZlZFJlc291cmNlcyk7Ci0JCQkJCX0KLQkJCQkJc3RhdGUgPSBTVEFURV9NT1ZFRF9GSUxFUzsKLQotCQkJCQkvLyBzYXZlIHRoZSBtb2RpZmllZCByZXNvdXJjZXMKLQkJCQkJLy8KLQkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gbW9kaWZpZWRSZXNvdXJjZXMuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlSZXNvdXJjZSByZXNvdXJjZSA9IChSZXNvdXJjZSkgaXRlci5uZXh0KCk7Ci0JCQkJCQl0cnkgewotCQkJCQkJCS8vIG1vbml0b3Iuc3ViVGFzayhNZXNzYWdlRm9ybWF0LmZvcm1hdCgiU2F2aW5nCi0JCQkJCQkJLy8gJyd7MH0nJyIsIHBhdGhBcmdzKSk7Ci0JCQkJCQkJcGVyc2lzdGVyLnNhdmUocmVzb3VyY2UpOwotCi0JCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJCVN0cmluZyBtc2cgPSBOTFMuYmluZCgKLQkJCQkJCQkJCUxpYnJhcnlFZGl0UmVzb3VyY2VzLnNhdmVGaWxlRXJyb3JfcmVhc29uLAotCQkJCQkJCQkJcmVzb3VyY2UuZ2V0VVJJKCkuaXNGaWxlKCkgPyByZXNvdXJjZS5nZXRVUkkoKS50b0ZpbGVTdHJpbmcoKSA6IHJlc291cmNlLnRvU3RyaW5nKCkpOwotCQkJCQkJCXN0YXR1cy5hZGQobmV3IFNhdmVTdGF0dXMoSVN0YXR1cy5FUlJPUiwKLQkJCQkJCQkJCUxpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCQkJCQkJCS5nZXRTeW1ib2xpY05hbWUoKSwKLQkJCQkJCQkJCVNhdmVTdGF0dXMuU0FWRV9FUlJPUiwgbXNnLCBlKSk7Ci0JCQkJCQkJYnJlYWsgc2F2ZTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlwZXJzaXN0ZXIuY29tbWl0KCk7Ci0JCQkJCXN0YXRlID0gU1RBVEVfU0FWRURfRklMRVM7Ci0KLQkJCQkJaWYgKHJlc01nciAhPSBudWxsKSB7Ci0JCQkJCQltb25pdG9yCi0JCQkJCQkJCS5zdWJUYXNrKExpYnJhcnlFZGl0UmVzb3VyY2VzLmNvcHlpbmdSZXNvdXJjZXNUYXNrX25hbWUpOyAKLQotCQkJCQkJQ29sbGVjdGlvbiBlbGVtZW50c1RvQ29weVJlZkNvbnRlbnRzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gbW92ZWRSZXNvdXJjZXMuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJCVJlc291cmNlIHJlc291cmNlID0gKFJlc291cmNlKSBpdGVyLm5leHQoKTsKLQkJCQkJCQllbGVtZW50c1RvQ29weVJlZkNvbnRlbnRzLmFkZEFsbChyZXNvdXJjZQotCQkJCQkJCQkJLmdldENvbnRlbnRzKCkpOwotCQkJCQkJfQotCi0JCQkJCQllbGVtZW50c1RvQ29weVJlZkNvbnRlbnRzLmFkZEFsbChhZGRDb21tYW5kCi0JCQkJCQkJCS5nZXRBZmZlY3RlZE9iamVjdHMoKSk7Ci0KLQkJCQkJCUNvbGxlY3Rpb24gbW9kaWZpZWQgPSByZXNNZ3IuY29weVJlZmVyZW5jZWRDb250ZW50cygKLQkJCQkJCQkJZWxlbWVudHNUb0NvcHlSZWZDb250ZW50cywKLQkJCQkJCQkJZWxlbWVudFRvT2xkUGx1Z2luTWFwKTsKLQkJCQkJCWlmIChtb2RpZmllZCAhPSBudWxsICYmICFtb2RpZmllZC5pc0VtcHR5KCkpIHsKLQkJCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBtb2RpZmllZC5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJCQlSZXNvdXJjZSByZXNvdXJjZSA9IChSZXNvdXJjZSkgaXRlci5uZXh0KCk7Ci0JCQkJCQkJCU9iamVjdFtdIHBhdGhBcmdzID0geyByZXNvdXJjZS5nZXRVUkkoKS5pc0ZpbGUoKSA/IHJlc291cmNlLmdldFVSSSgpCi0JCQkJCQkJCQkJLnRvRmlsZVN0cmluZygpIDogcmVzb3VyY2UudG9TdHJpbmcoKX07Ci0JCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCQltb25pdG9yCi0JCQkJCQkJCQkJCS5zdWJUYXNrKE1lc3NhZ2VGb3JtYXQKLQkJCQkJCQkJCQkJCQkuZm9ybWF0KAotCQkJCQkJCQkJCQkJCQkJTGlicmFyeUVkaXRSZXNvdXJjZXMuc2F2aW5nRmlsZVRhc2tfbmFtZSwKLQkJCQkJCQkJCQkJCQkJCXBhdGhBcmdzKSk7IAotCQkJCQkJCQkJcGVyc2lzdGVyLnNhdmUocmVzb3VyY2UpOwotCQkJCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJCQkJU3RyaW5nIG1zZyA9IE1lc3NhZ2VGb3JtYXQKLQkJCQkJCQkJCQkJLmZvcm1hdCgKLQkJCQkJCQkJCQkJCQlMaWJyYXJ5RWRpdFJlc291cmNlcy5zYXZlRmlsZUVycm9yX3JlYXNvbiwKLQkJCQkJCQkJCQkJCQlwYXRoQXJncyk7IAotCQkJCQkJCQkJc3RhdHVzLmFkZChuZXcgU2F2ZVN0YXR1cyhJU3RhdHVzLkVSUk9SLAotCQkJCQkJCQkJCQlMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkJCQkJCQkJCS5nZXRTeW1ib2xpY05hbWUoKSwKLQkJCQkJCQkJCQkJU2F2ZVN0YXR1cy5TQVZFX0VSUk9SLCBtc2csIGUpKTsKLQkJCQkJCQkJCWJyZWFrIHNhdmU7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJcGVyc2lzdGVyLmNvbW1pdCgpOwotCQkJCQlzdGF0ZSA9IFNUQVRFX0NPUElFRF9SRVNPVVJDRVM7Ci0KLQkJCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCQkJU3RyaW5nV3JpdGVyIG1zZyA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLQkJCQkJZS5wcmludFN0YWNrVHJhY2UobmV3IFByaW50V3JpdGVyKG1zZykpOwotCQkJCQlJU3RhdHVzIG5ld1N0YXR1cyA9IG5ldyBTYXZlU3RhdHVzKElTdGF0dXMuRVJST1IsCi0JCQkJCQkJTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0U3ltYm9saWNOYW1lKCksCi0JCQkJCQkJU2F2ZVN0YXR1cy5TQVZFX0VSUk9SLCBtc2cudG9TdHJpbmcoKSwgZSk7Ci0JCQkJCXN0YXR1cy5hZGQobmV3U3RhdHVzKTsKLQkJCQl9IGZpbmFsbHkgewotCQkJCQlpZiAoc3RhdHVzLmdldFNldmVyaXR5KCkgPT0gSVN0YXR1cy5FUlJPUikgewotCQkJCQkJdHJ5IHsKLQkJCQkJCQlwZXJzaXN0ZXIucm9sbGJhY2soKTsKLQkJCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UubG9nKGUpOwotCQkJCQkJCVN0cmluZ1dyaXRlciBtc2cgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0JCQkJCQkJZS5wcmludFN0YWNrVHJhY2UobmV3IFByaW50V3JpdGVyKG1zZykpOwotCQkJCQkJCUlTdGF0dXMgbmV3U3RhdHVzID0gbmV3IFNhdmVTdGF0dXMoSVN0YXR1cy5FUlJPUiwKLQkJCQkJCQkJCUxpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCQkJCQkJCS5nZXRTeW1ib2xpY05hbWUoKSwKLQkJCQkJCQkJCVNhdmVTdGF0dXMuUk9MTEJBQ0tfRVJST1IsIG1zZy50b1N0cmluZygpLAotCQkJCQkJCQkJZSk7Ci0JCQkJCQkJc3RhdHVzLmFkZChuZXdTdGF0dXMpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfSB3aGlsZSAoZmFsc2UpOwotCi0JCQltb25pdG9yLnN1YlRhc2soTGlicmFyeUVkaXRSZXNvdXJjZXMuY29tbWFuZF9kb25lKTsgCi0JCQlyZXR1cm4gc3RhdHVzOwotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyBpbnRlcmZhY2UgUmVzb3VyY2VNYW5hZ2VyIHsKLQotCQkvKioKLQkJICogQ29waWVzIHRoZSBjb250ZW50IHJlc291cmNlcyB0aGF0IGFyZSByZWZlcmVuY2VkIGJ5IHRoZSBjb250ZW50IG9mCi0JCSAqIHRoZSBnaXZlbiBlbGVtZW50cyB0aGF0IGhhdmUgYmVlbiBtb3ZlZC9jb3BpZWQgdG8gbmV3IGxvY2F0aW9uLgotCQkgKiAKLQkJICogQHBhcmFtIGVsZW1lbnRzCi0JCSAqICAgICAgICAgICAgRWxlbWVudHMgdGhhdCBhcmUgbW92ZWQgb3IgY29waWVkLgotCQkgKiBAcmV0dXJuIGNvbGxlY3Rpb24gb2YgbW9kaWZpZWQgcmVzb3VyY2VzIGFzIHRoZSByZXN1bHQgb2YgdGhpcyBjYWxsLgotCQkgKi8KLQkJQ29sbGVjdGlvbjxSZXNvdXJjZT4gY29weVJlZmVyZW5jZWRDb250ZW50cyhDb2xsZWN0aW9uPE1ldGhvZEVsZW1lbnQ+IGVsZW1lbnRzLAotCQkJCU1hcDxNZXRob2RFbGVtZW50LCBNZXRob2RQbHVnaW4+IGVsZW1lbnRUb09sZFBsdWdpbk1hcCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBjbGFzcyBCYXNpY1Jlc291cmNlTWFuYWdlciBpbXBsZW1lbnRzIFJlc291cmNlTWFuYWdlciB7Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5jb21tYW5kLk1ldGhvZEVsZW1lbnRBZGRDb21tYW5kLlJlc291cmNlTWFuYWdlciNjb3B5UmVmZXJlbmNlZENvbnRlbnRzKGphdmEudXRpbC5Db2xsZWN0aW9uKQotCQkgKi8KLQkJcHVibGljIENvbGxlY3Rpb248UmVzb3VyY2U+IGNvcHlSZWZlcmVuY2VkQ29udGVudHMoQ29sbGVjdGlvbjxNZXRob2RFbGVtZW50PiBlbGVtZW50cywKLQkJCQlNYXA8TWV0aG9kRWxlbWVudCwgTWV0aG9kUGx1Z2luPiBlbGVtZW50VG9PbGRQbHVnaW5NYXApIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0UmVzb3VyY2VNYW5hZ2VyKFJlc291cmNlTWFuYWdlciByZXNNZ3IpIHsKLQkJTWV0aG9kRWxlbWVudEFkZENvbW1hbmQucmVzTWdyID0gcmVzTWdyOwotCX0KLQotCXByaXZhdGUgc3RhdGljIFN0cmluZ1ZhbGlkYXRvciBnZXRTdHJpbmdWYWxpZGF0b3IoKSB7Ci0JCWlmIChzdHJpbmdWYWxpZGF0b3IgPT0gbnVsbCkgewotCQkJc3RyaW5nVmFsaWRhdG9yID0gbmV3IFN0cmluZ1ZhbGlkYXRvcigpOwotCQl9Ci0JCXJldHVybiBzdHJpbmdWYWxpZGF0b3I7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgUmVzb3VyY2VNYW5hZ2VyIHJlc01nciA9IG51bGw7Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmdWYWxpZGF0b3Igc3RyaW5nVmFsaWRhdG9yID0gbnVsbDsKLQotCXByaXZhdGUgc3RhdGljIGNsYXNzIFN0cmluZ1ZhbGlkYXRvciBleHRlbmRzIEFic3RyYWN0U3RyaW5nVmFsaWRhdG9yIHsKLQotCQlwcml2YXRlIENvbGxlY3Rpb24gZWxlbWVudHM7Ci0KLQkJcHJpdmF0ZSBJVmFsaWRhdG9yIHZhbGlkYXRvcjsKLQotCQlwcml2YXRlIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlOwotCi0JCS8qKgotCQkgKiAKLQkJICovCi0JCXByaXZhdGUgU3RyaW5nVmFsaWRhdG9yKCkgewotCQl9Ci0KLQkJLyoqCi0JCSAqIEBwYXJhbSBlbGVtZW50cwotCQkgKiAgICAgICAgICAgIHRoZSBlbGVtZW50cyB0byBpbmNsdWRlIGluIHRoZSBjaGVjay4KLQkJICovCi0JCXB1YmxpYyBTdHJpbmdWYWxpZGF0b3IoQ29sbGVjdGlvbiBlbGVtZW50cywgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUpIHsKLQkJCXRoaXMuZWxlbWVudHMgPSBlbGVtZW50czsKLQkJCXRoaXMuZmVhdHVyZSA9IGZlYXR1cmU7Ci0JCX0KLQotCQkvKioKLQkJICogU2V0cyB0aGUgZWxlbWVudHMgdG8gaW5jbHVkZSBpbiB0aGUgY2hlY2suCi0JCSAqIAotCQkgKiBAcGFyYW0gZWxlbWVudHMKLQkJICogICAgICAgICAgICB0aGUgZWxlbWVudHMgdG8gaW5jbHVkZSBpbiB0aGUgY2hlY2suCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBzZXRFbGVtZW50cyhDb2xsZWN0aW9uIGVsZW1lbnRzKSB7Ci0JCQl0aGlzLmVsZW1lbnRzID0gZWxlbWVudHM7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBzZXRGZWF0dXJlKEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKSB7Ci0JCQl0aGlzLmZlYXR1cmUgPSBmZWF0dXJlOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgc2V0VmFsaWRhdG9yKElWYWxpZGF0b3IgdmFsaWRhdG9yKSB7Ci0JCQl0aGlzLnZhbGlkYXRvciA9IHZhbGlkYXRvcjsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JSW5wdXRWYWxpZGF0b3IjaXNWYWxpZChqYXZhLmxhbmcuU3RyaW5nKQotCQkgKi8KLQkJcHVibGljIFN0cmluZyBpc1ZhbGlkKFN0cmluZyBuZXdUZXh0KSB7Ci0JCQlpZiAodmFsaWRhdG9yIGluc3RhbmNlb2YgVW5pcXVlbmVzc1ZhbGlkYXRvcikgewotCQkJCUVPYmplY3Qgb2JqID0gKChVbmlxdWVuZXNzVmFsaWRhdG9yKSB2YWxpZGF0b3IpLmdldEVPYmplY3QoKTsKLQkJCQlpbnQgY2xhc3NJRCA9IG9iai5lQ2xhc3MoKS5nZXRDbGFzc2lmaWVySUQoKTsKLQkJCQluZXdUZXh0ID0gbmV3VGV4dC50cmltKCk7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gZWxlbWVudHMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCUVPYmplY3QgZSA9IChFT2JqZWN0KSBpdGVyLm5leHQoKTsKLQkJCQkJU3RyaW5nIHN0ciA9IChTdHJpbmcpIGUuZUdldChmZWF0dXJlKTsKLQkJCQkJaWYgKG9iaiAhPSBlICYmIGNsYXNzSUQgPT0gZS5lQ2xhc3MoKS5nZXRDbGFzc2lmaWVySUQoKQotCQkJCQkJCSYmIG5ld1RleHQuZXF1YWxzSWdub3JlQ2FzZShzdHIpKSB7Ci0JCQkJCQkvLyByZXR1cm4gSTE4blV0aWwuZm9ybWF0U3RyaW5nKFJFU09VUkNFX0JVTkRMRSwga2V5LAotCQkJCQkJLy8gZGF0YSk7Ci0JCQkJCQlyZXR1cm4gTkxTCi0JCQkJCQkJCS5iaW5kKAotCQkJCQkJCQkJCUxpYnJhcnlFZGl0UmVzb3VyY2VzLmR1cGxpY2F0ZUVsZW1lbnROYW1lRXJyb3JfbXNnLAotCQkJCQkJCQkJCW5ld1RleHQpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIHZhbGlkYXRvci5pc1ZhbGlkKG5ld1RleHQpOwotCQl9Ci0KLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbW1hbmQvTWV0aG9kRWxlbWVudENyZWF0ZUNoaWxkQ29tbWFuZC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb21tYW5kL01ldGhvZEVsZW1lbnRDcmVhdGVDaGlsZENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2VmZGNiZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbW1hbmQvTWV0aG9kRWxlbWVudENyZWF0ZUNoaWxkQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ3JlYXRlQ2hpbGRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkV4dGVuc2lvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLkFic3RyYWN0U3RyaW5nVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbi5JVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTmFtZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLS8qKgotICogVGhpcyBjb21tYW5kIGlzIHVzZWQgdG8gY3JlYXRlIGEgY2hpbGQgbWV0aG9kIGVsZW1lbnQgYW5kIGFkZCBpdCB0byB0aGUKLSAqIGNvbnRhaW5pbmcgbWV0aG9kIGVsZW1lbnQuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXRob2RFbGVtZW50Q3JlYXRlQ2hpbGRDb21tYW5kIGV4dGVuZHMgQ3JlYXRlQ2hpbGRDb21tYW5kIHsKLQotCXByaXZhdGUgYm9vbGVhbiBleGVjdXRlZCA9IGZhbHNlOwotCXByb3RlY3RlZCBJVmFsaWRhdG9yIHZhbGlkYXRvcjsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIE1ldGhvZEVsZW1lbnRDcmVhdGVDaGlsZENvbW1hbmQoRWRpdGluZ0RvbWFpbiBkb21haW4sIEVPYmplY3Qgb3duZXIsCi0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgT2JqZWN0IGNoaWxkLCBpbnQgaW5kZXgsCi0JCQlDb2xsZWN0aW9uIHNlbGVjdGlvbiwgSGVscGVyIGhlbHBlcikgewotCQlzdXBlcihkb21haW4sIG93bmVyLCBmZWF0dXJlLCBjaGlsZCwgaW5kZXgsIHNlbGVjdGlvbiwgaGVscGVyKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc3VwZXJFeGVjdXRlKCkgewotCQlzdXBlci5leGVjdXRlKCk7Ci0JfQotCQotCXByb3RlY3RlZCBJVmFsaWRhdG9yIGdldFZhbGlkYXRvcigpIHsKLQkJaWYodmFsaWRhdG9yID09IG51bGwpIHsKLQkJCXZhbGlkYXRvciA9IG5ldyBBYnN0cmFjdFN0cmluZ1ZhbGlkYXRvcigpIHsKLQkJCQlwdWJsaWMgU3RyaW5nIGlzVmFsaWQoU3RyaW5nIG5ld1RleHQpIHsKLQkJCQkJaWYgKG5ld1RleHQudHJpbSgpLmxlbmd0aCgpID09IDApIHsKLQkJCQkJCVN0cmluZyBlbGVtZW50VGV4dCA9IExpYnJhcnlFZGl0UmVzb3VyY2VzLmVsZW1lbnRfdGV4dDsgCi0JCQkJCQkvLwkJcmV0dXJuIEkxOG5VdGlsLmZvcm1hdFN0cmluZyhSRVNPVVJDRV9CVU5ETEUsIGtleSwgZGF0YSk7Ci0JCQkJCQlyZXR1cm4gTkxTLmJpbmQoTGlicmFyeUVkaXRSZXNvdXJjZXMuZW1wdHlFbGVtZW50TmFtZUVycm9yX21zZywgZWxlbWVudFRleHQpOyAKLQkJCQkJfQotCQkJCQlMaXN0IGNoaWxkcmVuID0gKExpc3QpIG93bmVyLmVHZXQoZmVhdHVyZSk7Ci0JCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGNoaWxkcmVuLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQkJTmFtZWRFbGVtZW50IGNoaWxkID0gKE5hbWVkRWxlbWVudCkgaXRlci5uZXh0KCk7Ci0JCQkJCQlpZiAoY2hpbGQuZ2V0TmFtZSgpLmVxdWFsc0lnbm9yZUNhc2UobmV3VGV4dCkpIHsKLQkJCQkJCQkvLwkJcmV0dXJuIEkxOG5VdGlsLmZvcm1hdFN0cmluZyhSRVNPVVJDRV9CVU5ETEUsIGtleSwgZGF0YSk7Ci0JCQkJCQkJcmV0dXJuIE5MUy5iaW5kKExpYnJhcnlFZGl0UmVzb3VyY2VzLmR1cGxpY2F0ZUVsZW1lbnROYW1lRXJyb3JfbXNnLCBuZXdUZXh0KTsgCi0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCQkJfTsKLQkJfQotCQlyZXR1cm4gdmFsaWRhdG9yOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmRXcmFwcGVyI2V4ZWN1dGUoKQotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCVN0cmluZyB0aXRsZSA9IE5MUy5iaW5kKExpYnJhcnlFZGl0UmVzb3VyY2VzLm5ld0VsZW1lbnRfdGV4dCwgaGVscGVyLmdldENyZWF0ZUNoaWxkVGV4dChvd25lciwgZmVhdHVyZSwgY2hpbGQsIHNlbGVjdGlvbikpOyAKLQkJSVZhbGlkYXRvciB2YWxpZGF0b3IgPSBnZXRWYWxpZGF0b3IoKTsKLS8vCQlmaW5hbCBTdHJpbmcgbmFtZSA9IFVzZXJJbnRlcmFjdGlvbkhlbHBlci5yZXF1ZXN0TmFtZShjaGlsZCwKLS8vCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE5hbWVkRWxlbWVudF9OYW1lKCksIHRpdGxlLCB2YWxpZGF0b3IpOwotCQlJVXNlckludGVyYWN0aW9uSGFuZGxlciB1aUhhbmRsZXIgPSBFeHRlbnNpb25NYW5hZ2VyLmdldERlZmF1bHRVc2VySW50ZXJhY3Rpb25IYW5kbGVyKCk7Ci0JCVVzZXJJbnB1dCB1c2VySW5wdXQgPSBuZXcgVXNlcklucHV0KExpYnJhcnlFZGl0UmVzb3VyY2VzLm5hbWVMYWJlbF90ZXh0LCBVc2VySW5wdXQuVEVYVCwgCi0JCQkJZmFsc2UsIG51bGwsIG51bGwsIHZhbGlkYXRvciwgdGhpcyk7CQkKLQkJaWYodWlIYW5kbGVyLnJlcXVlc3RJbnB1dCh0aXRsZSwgTGlicmFyeUVkaXRSZXNvdXJjZXMuU3BlY2lmeU5hbWVUZXh0LCBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KHVzZXJJbnB1dCkpKSB7IAotCQkJU3RyaW5nIG5hbWUgPSAoU3RyaW5nKSB1c2VySW5wdXQuZ2V0SW5wdXQoKTsKLQkJCWlmIChuYW1lICE9IG51bGwpIHsKLQkJCQkoKE5hbWVkRWxlbWVudCkgY2hpbGQpLnNldE5hbWUobmFtZSk7Ci0JCQkJc3VwZXJFeGVjdXRlKCk7Ci0JCQkJZXhlY3V0ZWQgPSB0cnVlOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNyZWF0ZUNoaWxkQ29tbWFuZCNnZXRBZmZlY3RlZE9iamVjdHMoKQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldEFmZmVjdGVkT2JqZWN0cygpIHsKLQkJaWYgKGV4ZWN1dGVkKSB7Ci0JCQlyZXR1cm4gc3VwZXIuZ2V0QWZmZWN0ZWRPYmplY3RzKCk7Ci0JCX0KLQkJcmV0dXJuIENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3Qob3duZXIpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5DcmVhdGVDaGlsZENvbW1hbmQjZ2V0UmVzdWx0KCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRSZXN1bHQoKSB7Ci0JCWlmIChleGVjdXRlZCkgewotCQkJcmV0dXJuIHN1cGVyLmdldFJlc3VsdCgpOwotCQl9Ci0JCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCX0KLQotCXB1YmxpYyBFT2JqZWN0IGdldE93bmVyKCkgewotCQlyZXR1cm4gb3duZXI7Ci0JfQotCQotCXB1YmxpYyBPYmplY3QgZ2V0Q2hpbGQoKSB7Ci0JCXJldHVybiBjaGlsZDsKLQl9Ci0JCi0JcHVibGljIEVTdHJ1Y3R1cmFsRmVhdHVyZSBnZXRGZWF0dXJlKCkgewotCQlyZXR1cm4gZmVhdHVyZTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbW1hbmQvTWV0aG9kRWxlbWVudFNldFByb3BlcnR5Q29tbWFuZC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb21tYW5kL01ldGhvZEVsZW1lbnRTZXRQcm9wZXJ0eUNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjdmNWFjZi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbW1hbmQvTWV0aG9kRWxlbWVudFNldFByb3BlcnR5Q29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQWJzdHJhY3RDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnVpLlVzZXJJbnRlcmFjdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuTWV0aG9kRWxlbWVudFByb3BlcnR5SGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5NZXRob2RFbGVtZW50UHJvcGVydHlNZ3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudFByb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotcHVibGljIGNsYXNzIE1ldGhvZEVsZW1lbnRTZXRQcm9wZXJ0eUNvbW1hbmQgZXh0ZW5kcyBBYnN0cmFjdENvbW1hbmQgaW1wbGVtZW50cwotCQlJUmVzb3VyY2VBd2FyZUNvbW1hbmQgewotCQotCXByb3RlY3RlZCBNZXRob2RFbGVtZW50IGVsZW1lbnQ7Ci0JcHJvdGVjdGVkIFN0cmluZyBrZXk7Ci0JcHJvdGVjdGVkIFN0cmluZyB2YWx1ZTsKLQlwcm90ZWN0ZWQgU3RyaW5nIG9sZFZhbHVlOwotCXByb3RlY3RlZCBDb2xsZWN0aW9uPFJlc291cmNlPiBtb2RpZmllZFJlc291cmNlczsKLQkKLQlwdWJsaWMgTWV0aG9kRWxlbWVudFNldFByb3BlcnR5Q29tbWFuZChNZXRob2RFbGVtZW50IGVsZW1lbnQsIFN0cmluZyBrZXksIFN0cmluZyB2YWx1ZSkgewotCQl0aGlzLmVsZW1lbnQgPSBlbGVtZW50OwotCQl0aGlzLmtleSA9IGtleTsKLQkJdGhpcy52YWx1ZSA9IHZhbHVlOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHByZXBhcmUoKSB7Ci0JCS8vIGNoZWNrIGlmIHRoaXMgb3BlcmF0aW9uIHdpbGwgbW9kaWZ5IHRoZSBlbGVtZW50IGluIG9wcG9zaXRlIGZlYXR1cmUKLQkJLy8gdmFsdWUKLQkJLy8KLQkJcmV0dXJuIFVzZXJJbnRlcmFjdGlvbkhlbHBlci5jaGVja01vZGlmeU9wcG9zaXRlKGVsZW1lbnQsIFVtYVBhY2thZ2UuTGl0ZXJhbHMuTUVUSE9EX0VMRU1FTlRfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZLAotCQkJCWVsZW1lbnQpOwotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uPFJlc291cmNlPiBnZXRNb2RpZmllZFJlc291cmNlcygpIHsKLQkJaWYgKGVsZW1lbnQgIT0gbnVsbCAmJiBlbGVtZW50LmVSZXNvdXJjZSgpICE9IG51bGwKLQkJCQkmJiBtb2RpZmllZFJlc291cmNlcyA9PSBudWxsKSB7Ci0JCQltb2RpZmllZFJlc291cmNlcyA9IG5ldyBIYXNoU2V0PFJlc291cmNlPigpOwotCQkJbW9kaWZpZWRSZXNvdXJjZXMuYWRkKGVsZW1lbnQuZVJlc291cmNlKCkpOwotCQl9Ci0JCQotCQlpZiAobW9kaWZpZWRSZXNvdXJjZXMgPT0gbnVsbCkgewotCQkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOwotCQl9Ci0JCXJldHVybiBtb2RpZmllZFJlc291cmNlczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQlyZWRvKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVkbygpIHsKLQkJTWV0aG9kRWxlbWVudFByb3BlcnR5IG9sZFByb3BlcnR5ID0gTWV0aG9kRWxlbWVudFByb3BlcnR5TWdyLmdldEluc3RhbmNlKCkuZ2V0UHJvcGVydHkoZWxlbWVudCwga2V5KTsKLQkJaWYgKG9sZFByb3BlcnR5ICE9IG51bGwpIHsKLQkJCW9sZFZhbHVlID0gb2xkUHJvcGVydHkuZ2V0VmFsdWUoKTsKLQkJfSBlbHNlIHsKLQkJCW9sZFZhbHVlID0gbnVsbDsKLQkJfQotCQlNZXRob2RFbGVtZW50UHJvcGVydHlNZ3IuZ2V0SW5zdGFuY2UoKS5zZXRQcm9wZXJ0eShlbGVtZW50LCBrZXksIHZhbHVlKTsKLQotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1bmRvKCkgewotCQlpZiAob2xkVmFsdWUgIT0gbnVsbCkgewotCQkJTWV0aG9kRWxlbWVudFByb3BlcnR5SGVscGVyLnNldFByb3BlcnR5KGVsZW1lbnQsIGtleSwgb2xkVmFsdWUpOwotCQl9IGVsc2UgewotCQkJTWV0aG9kRWxlbWVudFByb3BlcnR5SGVscGVyLnJlbW92ZVByb3BlcnR5KGVsZW1lbnQsIGtleSk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29tbWFuZC9Nb3ZlSW5Db25maWd1cmF0aW9uQ29tbWFuZC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb21tYW5kL01vdmVJbkNvbmZpZ3VyYXRpb25Db21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5YTg0NDIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb21tYW5kL01vdmVJbkNvbmZpZ3VyYXRpb25Db21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5BYnN0cmFjdENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotCi0vKioKLSAqIFRoaXMgY29tbWFuZCBpcyB1c2VkIHRvIG1vdmUgYSB2aWV3IGluIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24KLSAqIEBhdXRob3IgWGlhbmcgRG9uZyBIdQotICogQHNpbmNlIDEuMgotICogZml4IGZvciBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTczODI3Ci0gKi8KLXB1YmxpYyBjbGFzcyBNb3ZlSW5Db25maWd1cmF0aW9uQ29tbWFuZCBleHRlbmRzIEFic3RyYWN0Q29tbWFuZCBpbXBsZW1lbnRzCi0JCUlSZXNvdXJjZUF3YXJlQ29tbWFuZCB7Ci0JCi0JcHJpdmF0ZSBNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZzsKLQotCXByaXZhdGUgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmU7Ci0KLQlwcml2YXRlIExpc3QgZWxlbWVudHNMaXN0OwotCQotCXByaXZhdGUgQ29sbGVjdGlvbiBtb2RpZmllZFJlc291cmNlczsKLQotCXByaXZhdGUgc3RhdGljIGludCBVUCA9IDE7Ci0KLQlwcml2YXRlIHN0YXRpYyBpbnQgRG93biA9IDA7Ci0KLQlwcml2YXRlIGludCBkaXJlY3Rpb24gPSAtMTsKLQotCXByaXZhdGUgYm9vbGVhbiBtb3ZlZDsKLQkKLQlwdWJsaWMgTW92ZUluQ29uZmlndXJhdGlvbkNvbW1hbmQoTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcsIExpc3QgZWxlbWVudHNMaXN0LAotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIGludCBkaXJlY3Rpb24pIHsKLQkJdGhpcy5jb25maWcgPSBjb25maWc7Ci0JCXRoaXMuZmVhdHVyZSA9IGZlYXR1cmU7Ci0JCXRoaXMuZWxlbWVudHNMaXN0ID0gZWxlbWVudHNMaXN0OwotCQl0aGlzLmRpcmVjdGlvbiA9IGRpcmVjdGlvbjsKLQl9Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gcHJlcGFyZSgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0TW9kaWZpZWRSZXNvdXJjZXMoKSB7Ci0JCXJldHVybiBtb2RpZmllZFJlc291cmNlczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQltb2RpZmllZFJlc291cmNlcyA9IG5ldyBIYXNoU2V0KCk7Ci0JCXJlZG8oKTsKLQotCX0KLQotCXB1YmxpYyB2b2lkIHJlZG8oKSB7Ci0JCWlmIChjb25maWcgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJZm9yIChJdGVyYXRvciBpdCA9IGVsZW1lbnRzTGlzdC5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3Qgb2JqZWN0ID0gaXQubmV4dCgpOwotCQkJaWYgKGZlYXR1cmUuaXNNYW55KCkpIHsKLQkJCQlFTGlzdCBsaXN0ID0gKEVMaXN0KSBjb25maWcuZUdldChmZWF0dXJlKTsKLQkJCQlpbnQgaW5kZXggPSBsaXN0LmluZGV4T2Yob2JqZWN0KTsKLQkJCQlpZiAoZGlyZWN0aW9uID09IFVQKSB7Ci0JCQkJCWlmIChpbmRleCA+IDApCi0JCQkJCQlsaXN0Lm1vdmUoaW5kZXggLSAxLCBvYmplY3QpOwotCQkJCX0gZWxzZSBpZiAoZGlyZWN0aW9uID09IERvd24pIHsKLQkJCQkJaWYgKGluZGV4IDwgbGlzdC5zaXplKCkpCi0JCQkJCQlsaXN0Lm1vdmUoaW5kZXggKyBlbGVtZW50c0xpc3Quc2l6ZSgpLCBvYmplY3QpOwotCQkJCX0KLQkJCQltb3ZlZCA9IHRydWU7Ci0JCQl9IGVsc2UgewotCQkJCWNvbmZpZy5lU2V0KGZlYXR1cmUsIG51bGwpOwotCQkJfQotCQl9Ci0JCWlmIChjb25maWcuZVJlc291cmNlKCkgIT0gbnVsbCkgewotCQkJbW9kaWZpZWRSZXNvdXJjZXMuYWRkKGNvbmZpZy5lUmVzb3VyY2UoKSk7Ci0JCX0KLQotCX0KLQkKLQlwdWJsaWMgdm9pZCB1bmRvKCkgewotCQlpZiAobW92ZWQpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBlbGVtZW50c0xpc3QuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBvYmplY3QgPSBpdC5uZXh0KCk7Ci0JCQkJaWYgKGZlYXR1cmUuaXNNYW55KCkpIHsKLQkJCQkJRUxpc3QgbGlzdCA9IChFTGlzdCkgY29uZmlnLmVHZXQoZmVhdHVyZSk7Ci0JCQkJCWludCBpbmRleCA9IGxpc3QuaW5kZXhPZihvYmplY3QpOwotCQkJCQlpZiAoZGlyZWN0aW9uID09IFVQKSB7Ci0JCQkJCQlpZiAoaW5kZXggPCBsaXN0LnNpemUoKSkKLQkJCQkJCQlsaXN0Lm1vdmUoaW5kZXggKyBlbGVtZW50c0xpc3Quc2l6ZSgpLCBvYmplY3QpOwotCQkJCQl9IGVsc2UgaWYgKGRpcmVjdGlvbiA9PSBEb3duKSB7Ci0JCQkJCQlpZiAoaW5kZXggPiAwKQotCQkJCQkJCWxpc3QubW92ZShpbmRleCAtIDEsIG9iamVjdCk7Ci0JCQkJCX0KLQkJCQkJbW92ZWQgPSB0cnVlOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWNvbmZpZy5lU2V0KGZlYXR1cmUsIG9iamVjdCk7Ci0JCQkJfQotCQkJfQotCQkJbW92ZWQgPSBmYWxzZTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRBZmZlY3RlZE9iamVjdHMoKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KGNvbmZpZyk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbW1hbmQvTW92ZUluTGlzdENvbW1hbmQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29tbWFuZC9Nb3ZlSW5MaXN0Q29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNTg4YzEzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29tbWFuZC9Nb3ZlSW5MaXN0Q29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQWJzdHJhY3RDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Db250ZW50RWxlbWVudE9yZGVyTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci0KLS8qKgotICogVGhpcyBjb21tYW5kIGlzIHVzZWQgdG8gcmVvcmRlciBhIG1ldGhvZCBlbGVtZW50IHdpdGhpbiBhIGNhdGVnb3J5LgotICogCi0gKiAxLjU6ICBSZWZhY3RvcmVkIHRvIHdvcmsgZm9yIGFueSBNZXRob2RFbGVtZW50J3MgcmVmZXJlbmNlIGxpc3RzLgotICogCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIE1vdmVJbkxpc3RDb21tYW5kIGV4dGVuZHMgQWJzdHJhY3RDb21tYW5kIGltcGxlbWVudHMKLQkJSVJlc291cmNlQXdhcmVDb21tYW5kIHsKLQlmaW5hbCBwdWJsaWMgc3RhdGljIGludCBVUCA9IDE7Ci0JZmluYWwgcHVibGljIHN0YXRpYyBpbnQgRE9XTiA9IDA7Ci0JCi0JcHJpdmF0ZSBNZXRob2RFbGVtZW50IGVsZW1lbnQ7Ci0KLQlwcml2YXRlIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlOwotCi0JcHJpdmF0ZSBMaXN0PE9iamVjdD4gZWxlbWVudHNMaXN0OwotCQotCXByaXZhdGUgQ29udGVudEVsZW1lbnRPcmRlckxpc3QgZWxlbWVudE9yZGVyTGlzdDsKLQotCXByaXZhdGUgQ29sbGVjdGlvbjxSZXNvdXJjZT4gbW9kaWZpZWRSZXNvdXJjZXM7Ci0KLQlwcml2YXRlIGludCBkaXJlY3Rpb24gPSAtMTsKLQotCXByaXZhdGUgYm9vbGVhbiBtb3ZlZDsKLQotCXB1YmxpYyBNb3ZlSW5MaXN0Q29tbWFuZChNZXRob2RFbGVtZW50IGVsZW1lbnQsIExpc3Q8T2JqZWN0PiBlbGVtZW50c0xpc3QsCi0JCQlDb250ZW50RWxlbWVudE9yZGVyTGlzdCBvcmRlckxpc3QsCi0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwKLQkJCWludCBkaXJlY3Rpb24pIHsKLQkJdGhpcy5lbGVtZW50ID0gZWxlbWVudDsKLQkJdGhpcy5mZWF0dXJlID0gZmVhdHVyZTsKLQkJdGhpcy5lbGVtZW50c0xpc3QgPSBlbGVtZW50c0xpc3Q7CQkKLQkJdGhpcy5lbGVtZW50T3JkZXJMaXN0ID0gb3JkZXJMaXN0IDsKLQkJdGhpcy5kaXJlY3Rpb24gPSBkaXJlY3Rpb247Ci0JCW1vZGlmaWVkUmVzb3VyY2VzID0gbmV3IEhhc2hTZXQ8UmVzb3VyY2U+KCk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gcHJlcGFyZSgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGxhYmVsCi0JICovCi0JcHVibGljIE1vdmVJbkxpc3RDb21tYW5kKFN0cmluZyBsYWJlbCkgewotCQlzdXBlcihsYWJlbCk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGxhYmVsCi0JICogQHBhcmFtIGRlc2NyaXB0aW9uCi0JICovCi0JcHVibGljIE1vdmVJbkxpc3RDb21tYW5kKFN0cmluZyBsYWJlbCwgU3RyaW5nIGRlc2NyaXB0aW9uKSB7Ci0JCXN1cGVyKGxhYmVsLCBkZXNjcmlwdGlvbik7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5jb21tYW5kLklSZXNvdXJjZUF3YXJlQ29tbWFuZCNnZXRNb2RpZmllZFJlc291cmNlcygpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb248UmVzb3VyY2U+IGdldE1vZGlmaWVkUmVzb3VyY2VzKCkgewotCQltb2RpZmllZFJlc291cmNlcy5hZGQoZWxlbWVudC5lUmVzb3VyY2UoKSk7Ci0JCXJldHVybiBtb2RpZmllZFJlc291cmNlczsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kI2V4ZWN1dGUoKQotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCXJlZG8oKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kI3JlZG8oKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlZG8oKSB7Ci0JCWlmIChlbGVtZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWZvciAoSXRlcmF0b3I8T2JqZWN0PiBpdCA9IGVsZW1lbnRzTGlzdC5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3Qgb2JqZWN0ID0gaXQubmV4dCgpOwotCQkJaWYgKGZlYXR1cmUuaXNNYW55KCkpIHsKLQkJCQlpbnQgaW5kZXggPSBlbGVtZW50T3JkZXJMaXN0LmluZGV4T2Yob2JqZWN0KTsKLQkJCQlpZiAoZGlyZWN0aW9uID09IFVQKSB7Ci0JCQkJCWlmIChpbmRleCA+IDApCi0JCQkJCQllbGVtZW50T3JkZXJMaXN0Lm1vdmUoaW5kZXggLSAxLCBvYmplY3QpOwotCQkJCX0gZWxzZSBpZiAoZGlyZWN0aW9uID09IERPV04pIHsKLQkJCQkJaWYgKGluZGV4IDwgZWxlbWVudE9yZGVyTGlzdC5zaXplKCkpCi0JCQkJCQllbGVtZW50T3JkZXJMaXN0Lm1vdmUoaW5kZXggKyBlbGVtZW50c0xpc3Quc2l6ZSgpLCBvYmplY3QpOwotCQkJCX0KLQkJCQltb3ZlZCA9IHRydWU7Ci0JCQl9IGVsc2UgewotCQkJCWVsZW1lbnQuZVNldChmZWF0dXJlLCBudWxsKTsKLQkJCX0KLQkJfQotCQllbGVtZW50T3JkZXJMaXN0LmFwcGx5KCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdW5kbygpIHsKLQkJaWYgKG1vdmVkKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yPE9iamVjdD4gaXQgPSBlbGVtZW50c0xpc3QuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBvYmplY3QgPSBpdC5uZXh0KCk7Ci0JCQkJaWYgKGZlYXR1cmUuaXNNYW55KCkpIHsKLQkJCQkJaW50IGluZGV4ID0gZWxlbWVudE9yZGVyTGlzdC5pbmRleE9mKG9iamVjdCk7Ci0JCQkJCWlmIChkaXJlY3Rpb24gPT0gVVApIHsKLQkJCQkJaWYgKGluZGV4IDwgZWxlbWVudE9yZGVyTGlzdC5zaXplKCkpCi0JCQkJCQllbGVtZW50T3JkZXJMaXN0Lm1vdmUoaW5kZXggKyBlbGVtZW50c0xpc3Quc2l6ZSgpLCBvYmplY3QpOwotCQkJCQl9IGVsc2UgaWYgKGRpcmVjdGlvbiA9PSBET1dOKSB7Ci0JCQkJCQlpZiAoaW5kZXggPiAwKQotCQkJCQkJCWVsZW1lbnRPcmRlckxpc3QubW92ZShpbmRleCAtIDEsIG9iamVjdCk7Ci0JCQkJCX0KLQkJCQkJbW92ZWQgPSB0cnVlOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWVsZW1lbnQuZVNldChmZWF0dXJlLCBvYmplY3QpOwotCQkJCX0KLQkJCX0KLQkJCWVsZW1lbnRPcmRlckxpc3QuYXBwbHkoKTsKLQkJCW1vdmVkID0gZmFsc2U7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbjxNZXRob2RFbGVtZW50PiBnZXRBZmZlY3RlZE9iamVjdHMoKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KGVsZW1lbnQpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb21tYW5kL01vdmVJblNlY3Rpb25MaXN0Q29tbWFuZC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb21tYW5kL01vdmVJblNlY3Rpb25MaXN0Q29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOGY2YzUxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29tbWFuZC9Nb3ZlSW5TZWN0aW9uTGlzdENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkFic3RyYWN0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuTWlzYzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuU2VjdGlvbkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5TZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5VbWFVdGlsOwotCi0vKioKLSAqIFRoaXMgY29tbWFuZCBpcyB1c2VkIHRvIHJlb3JkZXIgYSBzZWN0aW9uIHdpdGhpbiBhIHNlY3Rpb24gbGlzdC4KLSAqIAotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBNb3ZlSW5TZWN0aW9uTGlzdENvbW1hbmQgZXh0ZW5kcyBBYnN0cmFjdENvbW1hbmQgaW1wbGVtZW50cwotCQlJUmVzb3VyY2VBd2FyZUNvbW1hbmQgewotCi0JcHJpdmF0ZSBDb250ZW50RWxlbWVudCBjb250ZW50RWxlbWVudDsKLQotCXByaXZhdGUgU2VjdGlvbkxpc3Qgc2VjdGlvbkxpc3Q7Ci0KLQlwcml2YXRlIExpc3Q8PyBleHRlbmRzIFNlY3Rpb24+IGVsZW1lbnRzTGlzdDsKLQotCXByaXZhdGUgQ29udGVudEVsZW1lbnQgdXNlZENvbnRlbnRFbGVtZW50ID0gbnVsbDsKLQotCXByaXZhdGUgQ29sbGVjdGlvbiBtb2RpZmllZFJlc291cmNlczsKLQotCXByaXZhdGUgc3RhdGljIGludCBVUCA9IDE7Ci0KLQlwcml2YXRlIHN0YXRpYyBpbnQgRG93biA9IDA7Ci0KLQlwcml2YXRlIGludCBkaXJlY3Rpb24gPSAtMTsKLQotCXByaXZhdGUgYm9vbGVhbiBtb3ZlZDsKLQotCS8qKgotCSAqIEBkZXByZWNhdGVkCi0JICovCi0JcHVibGljIE1vdmVJblNlY3Rpb25MaXN0Q29tbWFuZCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgTW92ZUluU2VjdGlvbkxpc3RDb21tYW5kKENvbnRlbnRFbGVtZW50IGNvbnRlbnRFbGVtZW50LAotCQkJTGlzdDw/IGV4dGVuZHMgU2VjdGlvbj4gZWxlbWVudHNMaXN0LCBTZWN0aW9uTGlzdCBzZWN0aW9uTGlzdCwgaW50IGRpcmVjdGlvbikgewotCQl0aGlzLmNvbnRlbnRFbGVtZW50ID0gY29udGVudEVsZW1lbnQ7Ci0JCXRoaXMuc2VjdGlvbkxpc3QgPSBzZWN0aW9uTGlzdDsKLQkJdGhpcy5lbGVtZW50c0xpc3QgPSBlbGVtZW50c0xpc3Q7Ci0JCXRoaXMuZGlyZWN0aW9uID0gZGlyZWN0aW9uOwotCi0JCW1vZGlmaWVkUmVzb3VyY2VzID0gbmV3IEhhc2hTZXQoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBwcmVwYXJlKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbGFiZWwKLQkgKi8KLQlwdWJsaWMgTW92ZUluU2VjdGlvbkxpc3RDb21tYW5kKFN0cmluZyBsYWJlbCkgewotCQlzdXBlcihsYWJlbCk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGxhYmVsCi0JICogQHBhcmFtIGRlc2NyaXB0aW9uCi0JICovCi0JcHVibGljIE1vdmVJblNlY3Rpb25MaXN0Q29tbWFuZChTdHJpbmcgbGFiZWwsIFN0cmluZyBkZXNjcmlwdGlvbikgewotCQlzdXBlcihsYWJlbCwgZGVzY3JpcHRpb24pOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuY29tbWFuZC5JUmVzb3VyY2VBd2FyZUNvbW1hbmQjZ2V0TW9kaWZpZWRSZXNvdXJjZXMoKQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldE1vZGlmaWVkUmVzb3VyY2VzKCkgewotCQltb2RpZmllZFJlc291cmNlcy5hZGQoY29udGVudEVsZW1lbnQuZVJlc291cmNlKCkpOwotCQlyZXR1cm4gbW9kaWZpZWRSZXNvdXJjZXM7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZCNleGVjdXRlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQlNZXRob2RQbHVnaW4gdGFza1BsdWdpbiA9IFVtYVV0aWwuZ2V0TWV0aG9kUGx1Z2luKGNvbnRlbnRFbGVtZW50KTsKLQkJTWV0aG9kUGx1Z2luIGVsZW1lbnRQbHVnaW4gPSBVbWFVdGlsCi0JCQkJLmdldE1ldGhvZFBsdWdpbigoTWV0aG9kRWxlbWVudCkgZWxlbWVudHNMaXN0LmdldCgwKSk7Ci0KLQkJaWYgKHRhc2tQbHVnaW4gIT0gZWxlbWVudFBsdWdpbgotCQkJCSYmIE1pc2MuaXNCYXNlT2YodGFza1BsdWdpbiwgZWxlbWVudFBsdWdpbikpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IFRuZ1V0aWwuZ2V0Q29udHJpYnV0b3JzKGNvbnRlbnRFbGVtZW50KTsgaXRlcgotCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCVZhcmlhYmlsaXR5RWxlbWVudCB2ZSA9IChWYXJpYWJpbGl0eUVsZW1lbnQpIGl0ZXIubmV4dCgpOwotCQkJCWlmICh2ZSBpbnN0YW5jZW9mIENvbnRlbnRFbGVtZW50Ci0JCQkJCQkmJiBVbWFVdGlsLmdldE1ldGhvZFBsdWdpbih2ZSkgPT0gZWxlbWVudFBsdWdpbikgewotCQkJCQl1c2VkQ29udGVudEVsZW1lbnQgPSAoQ29udGVudEVsZW1lbnQpIHZlOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKHVzZWRDb250ZW50RWxlbWVudCA9PSBudWxsKSB7Ci0JCQl1c2VkQ29udGVudEVsZW1lbnQgPSBjb250ZW50RWxlbWVudDsKLQkJfQotCi0JCXJlZG8oKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kI3JlZG8oKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlZG8oKSB7Ci0JCWlmICh1c2VkQ29udGVudEVsZW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaW50IHNpemUgPSBlbGVtZW50c0xpc3Quc2l6ZSgpOwotCQlmb3IgKFNlY3Rpb24gb2JqZWN0IDogZWxlbWVudHNMaXN0KSB7Ci0JCQlpbnQgaW5kZXggPSBzZWN0aW9uTGlzdC5pbmRleE9mKG9iamVjdCk7Ci0JCQlpZiAoZGlyZWN0aW9uID09IFVQKSB7Ci0JCQkJaWYgKGluZGV4ID4gMCkKLQkJCQkJc2VjdGlvbkxpc3QubW92ZShpbmRleCAtIDEsIG9iamVjdCk7Ci0JCQl9IGVsc2UgaWYgKGRpcmVjdGlvbiA9PSBEb3duKSB7Ci0JCQkJaWYgKGluZGV4IDwgc2VjdGlvbkxpc3Quc2l6ZSgpKQotCQkJCQlzZWN0aW9uTGlzdC5tb3ZlKGluZGV4ICsgc2l6ZSwgb2JqZWN0KTsKLQkJCX0KLQkJCW1vdmVkID0gdHJ1ZTsKLQkJfQotCQlzZWN0aW9uTGlzdC5hcHBseSgpOwotCi0JfQotCi0JcHVibGljIHZvaWQgdW5kbygpIHsKLQkJaWYgKG1vdmVkKSB7Ci0JCQlpbnQgc2l6ZSA9IGVsZW1lbnRzTGlzdC5zaXplKCk7Ci0JCQlmb3IgKFNlY3Rpb24gb2JqZWN0IDogZWxlbWVudHNMaXN0KSB7Ci0JCQkJaW50IGluZGV4ID0gc2VjdGlvbkxpc3QuaW5kZXhPZihvYmplY3QpOwotCQkJCWlmIChkaXJlY3Rpb24gPT0gVVApIHsKLQkJCQkJaWYgKGluZGV4IDwgc2VjdGlvbkxpc3Quc2l6ZSgpKQotCQkJCQkJc2VjdGlvbkxpc3QubW92ZShpbmRleCArIHNpemUsIG9iamVjdCk7Ci0JCQkJfSBlbHNlIGlmIChkaXJlY3Rpb24gPT0gRG93bikgewotCQkJCQlpZiAoaW5kZXggPiAwKQotCQkJCQkJc2VjdGlvbkxpc3QubW92ZShpbmRleCAtIDEsIG9iamVjdCk7Ci0JCQkJfQotCQkJCW1vdmVkID0gdHJ1ZTsKLQkJCX0KLQkJCXNlY3Rpb25MaXN0LmFwcGx5KCk7Ci0JCQltb3ZlZCA9IGZhbHNlOwotCQl9Ci0JfQotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0QWZmZWN0ZWRPYmplY3RzKCkgewotCQlyZXR1cm4gQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdCh1c2VkQ29udGVudEVsZW1lbnQpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb21tYW5kL05lc3RlZENvbW1hbmRFeGNlY3V0b3IuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29tbWFuZC9OZXN0ZWRDb21tYW5kRXhjZWN1dG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyYzY5MGMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb21tYW5kL05lc3RlZENvbW1hbmRFeGNlY3V0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5FeHRlbnNpb25NYW5hZ2VyOwotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4xCi0gKi8KLXB1YmxpYyBjbGFzcyBOZXN0ZWRDb21tYW5kRXhjZWN1dG9yIHsKLQlwcml2YXRlIENvbW1hbmQgY29tbWFuZDsKLQlwcml2YXRlIEFycmF5TGlzdDxDb21tYW5kPiBuZXN0ZWRDb21tYW5kczsKLQotCXB1YmxpYyBOZXN0ZWRDb21tYW5kRXhjZWN1dG9yKENvbW1hbmQgY29tbWFuZCkgewotCQl0aGlzLmNvbW1hbmQgPSBjb21tYW5kOwotCX0KLQkKLQlwdWJsaWMgTGlzdDxDb21tYW5kPiBnZXROZXN0ZWRDb21tYW5kcygpIHsKLQkJaWYobmVzdGVkQ29tbWFuZHMgPT0gbnVsbCkgewotCQkJbmVzdGVkQ29tbWFuZHMgPSBuZXcgQXJyYXlMaXN0PENvbW1hbmQ+KCk7Ci0JCX0KLQkJcmV0dXJuIG5lc3RlZENvbW1hbmRzOwotCX0KLQotCXB1YmxpYyB2b2lkIGV4ZWN1dGVOZXN0ZWRDb21tYW5kcygpIHsKLQkJTGlzdDxJTmVzdGVkQ29tbWFuZFByb3ZpZGVyPiBuZXN0ZWRDb21tYW5kUHJvdmlkZXJzID0gRXh0ZW5zaW9uTWFuYWdlci5nZXROZXN0ZWRDb21tYW5kUHJvdmlkZXJzKCk7Ci0JCWlmKCFuZXN0ZWRDb21tYW5kUHJvdmlkZXJzLmlzRW1wdHkoKSkgewotCQkJZm9yIChJTmVzdGVkQ29tbWFuZFByb3ZpZGVyIGNtZFByb3ZpZGVyIDogbmVzdGVkQ29tbWFuZFByb3ZpZGVycykgewotCQkJCXRyeSB7Ci0JCQkJCUNvbW1hbmQgY21kID0gY21kUHJvdmlkZXIuY3JlYXRlTmVzdGVkQ29tbWFuZChjb21tYW5kKTsKLQkJCQkJaWYoY21kICE9IG51bGwgJiYgY21kLmNhbkV4ZWN1dGUoKSkgewkJCQkJCQkKLQkJCQkJCWNtZC5leGVjdXRlKCk7Ci0JCQkJCQlnZXROZXN0ZWRDb21tYW5kcygpLmFkZChjbWQpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWNhdGNoKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCUxpYnJhcnlFZGl0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0JCi0JfQotCi0JcHVibGljIHZvaWQgdW5kb05lc3RlZENvbW1hbmRzKCkgewotCQlpZihuZXN0ZWRDb21tYW5kcyAhPSBudWxsICYmICFuZXN0ZWRDb21tYW5kcy5pc0VtcHR5KCkpIHsKLQkJCWZvcihpbnQgaSA9IG5lc3RlZENvbW1hbmRzLnNpemUoKSAtIDE7IGkgPiAtMTsgaS0tKSB7Ci0JCQkJQ29tbWFuZCBjbWQgPSAoQ29tbWFuZCkgbmVzdGVkQ29tbWFuZHMuZ2V0KGkpOwotCQkJCXRyeSB7Ci0JCQkJCWlmKGNtZC5jYW5VbmRvKCkpIHsKLQkJCQkJCWNtZC51bmRvKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJY2F0Y2goRXhjZXB0aW9uIGUpIHsKLQkJCQkJTGlicmFyeUVkaXRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCX0KLQkJCQlmaW5hbGx5IHsKLQkJCQkJdHJ5IHsgY21kLmRpc3Bvc2UoKTsgfSBjYXRjaChFeGNlcHRpb24gZSkge30KLQkJCQl9Ci0JCQl9Ci0JCQluZXN0ZWRDb21tYW5kcy5jbGVhcigpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJaWYobmVzdGVkQ29tbWFuZHMgIT0gbnVsbCAmJiAhbmVzdGVkQ29tbWFuZHMuaXNFbXB0eSgpKSB7Ci0JCQlmb3IoaW50IGkgPSBuZXN0ZWRDb21tYW5kcy5zaXplKCkgLSAxOyBpID4gLTE7IGktLSkgewotCQkJCUNvbW1hbmQgY21kID0gKENvbW1hbmQpIG5lc3RlZENvbW1hbmRzLmdldChpKTsKLQkJCQl0cnkgeyBjbWQuZGlzcG9zZSgpOyB9IGNhdGNoKEV4Y2VwdGlvbiBlKSB7fQotCQkJfQotCQkJbmVzdGVkQ29tbWFuZHMuY2xlYXIoKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgQ29sbGVjdGlvbjxSZXNvdXJjZT4gZ2V0TW9kaWZpZWRSZXNvdXJjZXMoKSB7Ci0JCUNvbGxlY3Rpb248UmVzb3VyY2U+IG1vZGlmaWVkUmVzb3VyY2VzID0gbmV3IEhhc2hTZXQ8UmVzb3VyY2U+KCk7Ci0JCWlmKG5lc3RlZENvbW1hbmRzICE9IG51bGwgJiYgIW5lc3RlZENvbW1hbmRzLmlzRW1wdHkoKSkgewotCQkJZm9yKGludCBpID0gbmVzdGVkQ29tbWFuZHMuc2l6ZSgpIC0gMTsgaSA+IC0xOyBpLS0pIHsKLQkJCQlDb21tYW5kIGNtZCA9IChDb21tYW5kKSBuZXN0ZWRDb21tYW5kcy5nZXQoaSk7Ci0JCQkJaWYoY21kIGluc3RhbmNlb2YgSVJlc291cmNlQXdhcmVDb21tYW5kKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlDb2xsZWN0aW9uIHJlc291cmNlcyA9ICgoSVJlc291cmNlQXdhcmVDb21tYW5kKWNtZCkuZ2V0TW9kaWZpZWRSZXNvdXJjZXMoKTsKLQkJCQkJCWlmKHJlc291cmNlcyAhPSBudWxsKSB7Ci0JCQkJCQkJbW9kaWZpZWRSZXNvdXJjZXMuYWRkQWxsKHJlc291cmNlcyk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJY2F0Y2goRXhjZXB0aW9uIGUpIHsKLQkJCQkJCUxpYnJhcnlFZGl0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbW9kaWZpZWRSZXNvdXJjZXMuaXNFbXB0eSgpID8gQ29sbGVjdGlvbnMuRU1QVFlfU0VUIDogbW9kaWZpZWRSZXNvdXJjZXM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb21tYW5kL1JlZmVyZW5jZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb21tYW5kL1JlZmVyZW5jZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNGY4ZDhjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29tbWFuZC9SZWZlcmVuY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUmVmZXJlbmNlIHsKLQkKLQlFT2JqZWN0IG93bmVyOwotCi0JRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmU7Ci0KLQlPYmplY3QgdmFsdWU7Ci0KLQlpbnQgaW5kZXggPSAtMTsKLQotCXB1YmxpYyBSZWZlcmVuY2UoRU9iamVjdCBvd25lciwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIE9iamVjdCB2YWx1ZSkgewotCQl0aGlzLm93bmVyID0gb3duZXI7Ci0JCXRoaXMuZmVhdHVyZSA9IGZlYXR1cmU7Ci0JCXRoaXMudmFsdWUgPSB2YWx1ZTsKLQkJaWYgKGZlYXR1cmUuaXNNYW55KCkpIHsKLQkJCUxpc3QgbGlzdCA9IChMaXN0KSBvd25lci5lR2V0KGZlYXR1cmUpOwotCQkJaW5kZXggPSBsaXN0LmluZGV4T2YodmFsdWUpOwotCQl9Ci0JfQotCi0JUmVmZXJlbmNlKEVPYmplY3Qgb3duZXIsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBPYmplY3QgdmFsdWUsIGludCBpbmRleCkgewotCQl0aGlzLm93bmVyID0gb3duZXI7Ci0JCXRoaXMuZmVhdHVyZSA9IGZlYXR1cmU7Ci0JCXRoaXMudmFsdWUgPSB2YWx1ZTsKLQkJdGhpcy5pbmRleCA9IGluZGV4OwotCX0KLQotCXB1YmxpYyBFU3RydWN0dXJhbEZlYXR1cmUgZ2V0RmVhdHVyZSgpIHsKLQkJcmV0dXJuIGZlYXR1cmU7Ci0JfQotCi0JcHVibGljIGludCBnZXRJbmRleCgpIHsKLQkJcmV0dXJuIGluZGV4OwotCX0KLQotCXB1YmxpYyBFT2JqZWN0IGdldE93bmVyKCkgewotCQlyZXR1cm4gb3duZXI7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRWYWx1ZSgpIHsKLQkJcmV0dXJuIHZhbHVlOwotCX0KLQkKLQkKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbW1hbmQvUmVtb3ZlRnJvbUNhdGVnb3J5Q29tbWFuZC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb21tYW5kL1JlbW92ZUZyb21DYXRlZ29yeUNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjJlMTBiZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbW1hbmQvUmVtb3ZlRnJvbUNhdGVnb3J5Q29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5BYnN0cmFjdENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLk1pc2M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50Q2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5VbWFVdGlsOwotCi0vKioKLSAqIFRoaXMgY29tbWFuZCBpcyB1c2VkIHRvIHJlbW92ZSBhIG1ldGhvZCBlbGVtZW50IGZyb20gYSBjYXRlZ29yeS4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFJlbW92ZUZyb21DYXRlZ29yeUNvbW1hbmQgZXh0ZW5kcyBBYnN0cmFjdENvbW1hbmQgaW1wbGVtZW50cwotCQlJUmVzb3VyY2VBd2FyZUNvbW1hbmQgewotCi0JcHJpdmF0ZSBDb250ZW50Q2F0ZWdvcnkgY2F0ZWdvcnk7Ci0KLQlwcml2YXRlIE1ldGhvZEVsZW1lbnQgZWxlbWVudDsKLQotCXByaXZhdGUgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmU7Ci0KLQlwcml2YXRlIFN0cmluZ1tdIGNvbnRlbnRQa2dQYXRoOwotCi0JcHJpdmF0ZSBDb250ZW50Q2F0ZWdvcnkgdXNlZENhdGVnb3J5OwotCi0JcHJpdmF0ZSBpbnQgcmVtb3ZlZEVsZW1lbnRJbmRleCA9IC0xOwotCi0JcHJpdmF0ZSBib29sZWFuIHJlbW92ZWQgPSBmYWxzZTsKLQotCXByaXZhdGUgTGlzdCB1c2VkQ2F0ZWdvcmllczsKLQotCXB1YmxpYyBSZW1vdmVGcm9tQ2F0ZWdvcnlDb21tYW5kKENvbnRlbnRDYXRlZ29yeSBjYXRlZ29yeSwKLQkJCU1ldGhvZEVsZW1lbnQgZWxlbWVudCwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsCi0JCQlTdHJpbmdbXSBjb250ZW50UGtnUGF0aCwgTGlzdCB1c2VkQ2F0ZWdvcmllcykgewotCQl0aGlzLmNhdGVnb3J5ID0gY2F0ZWdvcnk7Ci0JCXRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7Ci0JCXRoaXMuZmVhdHVyZSA9IGZlYXR1cmU7Ci0JCXRoaXMuY29udGVudFBrZ1BhdGggPSBjb250ZW50UGtnUGF0aDsKLQkJdGhpcy51c2VkQ2F0ZWdvcmllcyA9IHVzZWRDYXRlZ29yaWVzOwotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldE1vZGlmaWVkUmVzb3VyY2VzKCkgewotCQlpZiAodXNlZENhdGVnb3J5ICE9IG51bGwgJiYgdXNlZENhdGVnb3J5LmVSZXNvdXJjZSgpICE9IG51bGwpIHsKLQkJCXJldHVybiBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KHVzZWRDYXRlZ29yeS5lUmVzb3VyY2UoKSk7Ci0JCX0KLQotCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBwcmVwYXJlKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQlNZXRob2RQbHVnaW4gY2F0ZWdvcnlQbHVnaW4gPSBVbWFVdGlsLmdldE1ldGhvZFBsdWdpbihjYXRlZ29yeSk7Ci0JCU1ldGhvZFBsdWdpbiBlbGVtZW50UGx1Z2luID0gVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4oZWxlbWVudCk7Ci0KLQkJaWYgKGNhdGVnb3J5UGx1Z2luICE9IGVsZW1lbnRQbHVnaW4KLQkJCQkmJiBNaXNjLmlzQmFzZU9mKGNhdGVnb3J5UGx1Z2luLCBlbGVtZW50UGx1Z2luKSkgewotCQkJdXNlZENhdGVnb3J5ID0gVG5nVXRpbC5maW5kQ29udHJpYnV0b3IoVW1hVXRpbC5maW5kQ29udGVudFBhY2thZ2UoCi0JCQkJCWVsZW1lbnRQbHVnaW4sIGNvbnRlbnRQa2dQYXRoKSwgY2F0ZWdvcnkpOwotCQl9IGVsc2UgewotCQkJdXNlZENhdGVnb3J5ID0gY2F0ZWdvcnk7Ci0JCX0KLQotCQlyZWRvKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVkbygpIHsKLQkJaWYgKHVzZWRDYXRlZ29yeSA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCWlmIChmZWF0dXJlLmlzTWFueSgpKSB7Ci0JCQlDb2xsZWN0aW9uIGNvbGxlY3Rpb24gPSAoQ29sbGVjdGlvbikgdXNlZENhdGVnb3J5LmVHZXQoZmVhdHVyZSk7Ci0JCQlpZiAoY29sbGVjdGlvbiBpbnN0YW5jZW9mIEVMaXN0KSB7Ci0JCQkJcmVtb3ZlZEVsZW1lbnRJbmRleCA9ICgoRUxpc3QpIGNvbGxlY3Rpb24pLmluZGV4T2YoZWxlbWVudCk7Ci0JCQl9Ci0JCQlyZW1vdmVkID0gY29sbGVjdGlvbi5yZW1vdmUoZWxlbWVudCk7Ci0JCX0gZWxzZSB7Ci0JCQl1c2VkQ2F0ZWdvcnkuZVNldChmZWF0dXJlLCBudWxsKTsKLQkJCXJlbW92ZWQgPSB0cnVlOwotCQl9Ci0JCWlmIChyZW1vdmVkKSB7Ci0JCQlpZiAoIXVzZWRDYXRlZ29yaWVzLmNvbnRhaW5zKGNhdGVnb3J5KSkgewotCQkJCXVzZWRDYXRlZ29yaWVzLmFkZChjYXRlZ29yeSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5BYnN0cmFjdENvbW1hbmQjdW5kbygpCi0JICovCi0JcHVibGljIHZvaWQgdW5kbygpIHsKLQkJaWYgKHJlbW92ZWQpIHsKLQkJCWlmIChmZWF0dXJlLmlzTWFueSgpKSB7Ci0JCQkJQ29sbGVjdGlvbiBjb2xsZWN0aW9uID0gKENvbGxlY3Rpb24pIHVzZWRDYXRlZ29yeS5lR2V0KGZlYXR1cmUpOwotCQkJCWlmIChjb2xsZWN0aW9uIGluc3RhbmNlb2YgRUxpc3QgJiYgcmVtb3ZlZEVsZW1lbnRJbmRleCAhPSAtMSkgewotCQkJCQkoKEVMaXN0KSBjb2xsZWN0aW9uKS5hZGQocmVtb3ZlZEVsZW1lbnRJbmRleCwgZWxlbWVudCk7Ci0JCQkJfSBlbHNlCi0JCQkJCWNvbGxlY3Rpb24uYWRkKGVsZW1lbnQpOwotCQkJfSBlbHNlIHsKLQkJCQl1c2VkQ2F0ZWdvcnkuZVNldChmZWF0dXJlLCBlbGVtZW50KTsKLQkJCX0KLQkJCXJlbW92ZWQgPSBmYWxzZTsKLQkJfQotCQlpZiAodXNlZENhdGVnb3JpZXMuY29udGFpbnMoY2F0ZWdvcnkpKSB7Ci0JCQl1c2VkQ2F0ZWdvcmllcy5yZW1vdmUoY2F0ZWdvcnkpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQWJzdHJhY3RDb21tYW5kI2dldFJlc3VsdCgpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0UmVzdWx0KCkgewotCQlpZiAocmVtb3ZlZCkgewotCQkJcmV0dXJuIENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QoZWxlbWVudCk7Ci0JCX0KLQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbW1hbmQvUmVtb3ZlRnJvbVNlY3Rpb25MaXN0LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbW1hbmQvUmVtb3ZlRnJvbVNlY3Rpb25MaXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyNGFkZTAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb21tYW5kL1JlbW92ZUZyb21TZWN0aW9uTGlzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5BYnN0cmFjdENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlNlY3Rpb25MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5TZWN0aW9uOwotCi0vKioKLSAqIFRoaXMgY29tbWFuZCBpcyB1c2VkIHRvIHJlbW92ZSBhIHNlY3Rpb24gZnJvbSBhIHNlY3Rpb24gbGlzdC4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFJlbW92ZUZyb21TZWN0aW9uTGlzdCBleHRlbmRzIEFic3RyYWN0Q29tbWFuZCBpbXBsZW1lbnRzCi0JCUlSZXNvdXJjZUF3YXJlQ29tbWFuZCB7Ci0KLQlwcml2YXRlIENvbnRlbnRFbGVtZW50IGNvbnRlbnRFbGVtZW50OwotCi0JcHJpdmF0ZSBTZWN0aW9uTGlzdCBzZWN0aW9uTGlzdDsKLQotCXByaXZhdGUgU2VjdGlvbiBzZWN0aW9uOwotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uIG1vZGlmaWVkUmVzb3VyY2VzOwotCi0JcHJpdmF0ZSBib29sZWFuIHJlbW92ZWQ7Ci0KLQlwcml2YXRlIGludCByZW1vdmVkT2JqZWN0SW5kZXggPSAtMTsKLQotCXB1YmxpYyBSZW1vdmVGcm9tU2VjdGlvbkxpc3QoQ29udGVudEVsZW1lbnQgY29udGVudEVsZW1lbnQsCi0JCQlTZWN0aW9uIHNlY3Rpb24sIFNlY3Rpb25MaXN0IHNlY3Rpb25MaXN0KSB7Ci0JCXRoaXMuY29udGVudEVsZW1lbnQgPSBjb250ZW50RWxlbWVudDsKLQkJdGhpcy5zZWN0aW9uTGlzdCA9IHNlY3Rpb25MaXN0OwotCQl0aGlzLnNlY3Rpb24gPSBzZWN0aW9uOwotCi0JCW1vZGlmaWVkUmVzb3VyY2VzID0gbmV3IEhhc2hTZXQoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBwcmVwYXJlKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LmNvbW1hbmQuSVJlc291cmNlQXdhcmVDb21tYW5kI2dldE1vZGlmaWVkUmVzb3VyY2VzKCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRNb2RpZmllZFJlc291cmNlcygpIHsKLQkJaWYgKGNvbnRlbnRFbGVtZW50LmdldFByZXNlbnRhdGlvbigpLmVSZXNvdXJjZSgpICE9IG51bGwpIHsKLQkJCW1vZGlmaWVkUmVzb3VyY2VzLmFkZChjb250ZW50RWxlbWVudC5nZXRQcmVzZW50YXRpb24oKS5lUmVzb3VyY2UoKSk7Ci0JCX0KLQkJcmV0dXJuIG1vZGlmaWVkUmVzb3VyY2VzOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQjZXhlY3V0ZSgpCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQotCQlyZWRvKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZCNyZWRvKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWRvKCkgewotCQlpZiAoY29udGVudEVsZW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJcmVtb3ZlZE9iamVjdEluZGV4ID0gc2VjdGlvbkxpc3QuaW5kZXhPZihzZWN0aW9uKTsKLQkJc2VjdGlvbkxpc3QucmVtb3ZlKHNlY3Rpb24pOwotCQlyZW1vdmVkID0gdHJ1ZTsKLQkJc2VjdGlvbkxpc3QuYXBwbHkoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB1bmRvKCkgewotCQlpZiAocmVtb3ZlZCkgewotCQkJaWYgKHJlbW92ZWRPYmplY3RJbmRleCAhPSAtMSkgewotCQkJCXNlY3Rpb25MaXN0LmFkZChyZW1vdmVkT2JqZWN0SW5kZXgsIHNlY3Rpb24pOwotCQkJfSBlbHNlIHsKLQkJCQlzZWN0aW9uTGlzdC5hZGQoc2VjdGlvbik7Ci0JCQl9Ci0JCQlzZWN0aW9uTGlzdC5hcHBseSgpOwotCQkJcmVtb3ZlZCA9IGZhbHNlOwotCQl9Ci0JfQotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0QWZmZWN0ZWRPYmplY3RzKCkgewotCQlyZXR1cm4gQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChjb250ZW50RWxlbWVudCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbW1hbmQvUmVtb3ZlUmVmZXJlbmNlc0NvbW1hbmQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29tbWFuZC9SZW1vdmVSZWZlcmVuY2VzQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNzE4OTQwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29tbWFuZC9SZW1vdmVSZWZlcmVuY2VzQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkFic3RyYWN0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FQ29udGVudHNFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLQotLyoqCi0gKiBUaGlzIGNvbW1hbmQgaXMgdXNlZCB0byByZW1vdmUgbWV0aG9kIGVsZW1lbnQgcmVmZXJlbmNlcy4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFJlbW92ZVJlZmVyZW5jZXNDb21tYW5kIGV4dGVuZHMgQWJzdHJhY3RDb21tYW5kIGltcGxlbWVudHMKLQkJSVJlc291cmNlQXdhcmVDb21tYW5kIHsKLQotCXByaXZhdGUgTWV0aG9kUGx1Z2luIHBsdWdpbjsKLQotCXByaXZhdGUgTWV0aG9kUGx1Z2luIGJhc2U7Ci0KLQlwcml2YXRlIE1hcDxGZWF0dXJlVmFsdWVQYWlyLCBPYmplY3Q+IGZlYXR1cmVWYWx1ZVBhaXJUb09iamVjdE1hcDsKLQotCXByaXZhdGUgQ29sbGVjdGlvbjxSZXNvdXJjZT4gbW9kaWZpZWRSZXNvdXJjZXM7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RzIGEgY29tbWFuZCB0byByZW1vdmUgYWxsIHJlZmVyZW5jZXMgaW4gPGNvZGU+cGx1Z2luPC9jb2RlPgotCSAqIHRoYXQgYXJlIGVsZW1lbnRzIG9mIDxjb2RlPmJhc2U8L2NvZGU+Ci0JICogCi0JICogQHBhcmFtIHBsdWdpbgotCSAqIEBwYXJhbSBiYXNlCi0JICovCi0JcHVibGljIFJlbW92ZVJlZmVyZW5jZXNDb21tYW5kKE1ldGhvZFBsdWdpbiBwbHVnaW4sIE1ldGhvZFBsdWdpbiBiYXNlKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMucGx1Z2luID0gcGx1Z2luOwotCQl0aGlzLmJhc2UgPSBiYXNlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkFic3RyYWN0Q29tbWFuZCNwcmVwYXJlKCkKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBwcmVwYXJlKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LmNvbW1hbmQuSVJlc291cmNlQXdhcmVDb21tYW5kI2dldE1vZGlmaWVkUmVzb3VyY2VzKCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbjxSZXNvdXJjZT4gZ2V0TW9kaWZpZWRSZXNvdXJjZXMoKSB7Ci0JCXJldHVybiBtb2RpZmllZFJlc291cmNlczsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kI2V4ZWN1dGUoKQotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCWZlYXR1cmVWYWx1ZVBhaXJUb09iamVjdE1hcCA9IG5ldyBIYXNoTWFwPEZlYXR1cmVWYWx1ZVBhaXIsIE9iamVjdD4oKTsKLQkJbW9kaWZpZWRSZXNvdXJjZXMgPSBuZXcgSGFzaFNldDxSZXNvdXJjZT4oKTsKLQotCQlmb3IgKEVDb250ZW50c0VMaXN0LkZlYXR1cmVJdGVyYXRvciBmZWF0dXJlSXRlcmF0b3IgPSAoRUNvbnRlbnRzRUxpc3QuRmVhdHVyZUl0ZXJhdG9yKSBwbHVnaW4KLQkJCQkuZUNyb3NzUmVmZXJlbmNlcygpLml0ZXJhdG9yKCk7IGZlYXR1cmVJdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQlFT2JqZWN0IHJlZiA9IChFT2JqZWN0KSBmZWF0dXJlSXRlcmF0b3IubmV4dCgpOwotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGYgPSBmZWF0dXJlSXRlcmF0b3IuZmVhdHVyZSgpOwotCQkJaWYgKGYgIT0gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWV0aG9kUGx1Z2luX0Jhc2VzKCkKLQkJCQkJJiYgVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4ocmVmKSA9PSBiYXNlKSB7Ci0JCQkJZmVhdHVyZVZhbHVlUGFpclRvT2JqZWN0TWFwLnB1dChuZXcgRmVhdHVyZVZhbHVlUGFpcihmLCByZWYpLAotCQkJCQkJcGx1Z2luKTsKLQkJCX0KLQkJfQotCi0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHBsdWdpbi5lQWxsQ29udGVudHMoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlFT2JqZWN0IGVsZW1lbnQgPSAoRU9iamVjdCkgaXRlci5uZXh0KCk7Ci0KLQkJCS8vIGlnbm9yZSBQcm9jZXNzRWxlbWVudCBiL2MgaXQgY2FuIHJlZmVyZW5jZXMgYW55dGhpbmcKLQkJCS8vCi0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFByb2Nlc3NFbGVtZW50KSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0KLQkJCWZvciAoRUNvbnRlbnRzRUxpc3QuRmVhdHVyZUl0ZXJhdG9yIGZlYXR1cmVJdGVyYXRvciA9IChFQ29udGVudHNFTGlzdC5GZWF0dXJlSXRlcmF0b3IpIGVsZW1lbnQKLQkJCQkJLmVDcm9zc1JlZmVyZW5jZXMoKS5pdGVyYXRvcigpOyBmZWF0dXJlSXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJCUVPYmplY3QgcmVmID0gKEVPYmplY3QpIGZlYXR1cmVJdGVyYXRvci5uZXh0KCk7Ci0KLQkJCQlpZiAoVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4ocmVmKSA9PSBiYXNlKSB7Ci0JCQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmID0gZmVhdHVyZUl0ZXJhdG9yLmZlYXR1cmUoKTsKLQkJCQkJZmVhdHVyZVZhbHVlUGFpclRvT2JqZWN0TWFwLnB1dCgKLQkJCQkJCQluZXcgRmVhdHVyZVZhbHVlUGFpcihmLCByZWYpLCBlbGVtZW50KTsKLQkJCQkJaWYoZiA9PSBVbWFQYWNrYWdlLkxpdGVyYWxzLlZBUklBQklMSVRZX0VMRU1FTlRfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQpIHsKLQkJCQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gVW1hUGFja2FnZS5MaXRlcmFscy5WQVJJQUJJTElUWV9FTEVNRU5UX19WQVJJQUJJTElUWV9UWVBFOwotCQkJCQkJZmVhdHVyZVZhbHVlUGFpclRvT2JqZWN0TWFwLnB1dCgKLQkJCQkJCQkJbmV3IEZlYXR1cmVWYWx1ZVBhaXIoZmVhdHVyZSwgZWxlbWVudC5lR2V0KGZlYXR1cmUpKSwgZWxlbWVudCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZWRvKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZCNyZWRvKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWRvKCkgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBmZWF0dXJlVmFsdWVQYWlyVG9PYmplY3RNYXAuZW50cnlTZXQoKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCU1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIGl0ZXIubmV4dCgpOwotCQkJRmVhdHVyZVZhbHVlUGFpciBmdlBhaXIgPSAoRmVhdHVyZVZhbHVlUGFpcikgZW50cnkuZ2V0S2V5KCk7Ci0JCQlFT2JqZWN0IGVsZW1lbnQgPSAoRU9iamVjdCkgZW50cnkuZ2V0VmFsdWUoKTsKLQkJCWlmIChmdlBhaXIuZmVhdHVyZS5pc01hbnkoKSkgewotCQkJCSgoQ29sbGVjdGlvbikgZWxlbWVudC5lR2V0KGZ2UGFpci5mZWF0dXJlKSkKLQkJCQkJCS5yZW1vdmUoZnZQYWlyLnZhbHVlKTsKLQkJCX0gZWxzZSB7Ci0JCQkJZWxlbWVudC5lU2V0KGZ2UGFpci5mZWF0dXJlLCBudWxsKTsKLQkJCX0KLQkJCWlmIChlbGVtZW50LmVSZXNvdXJjZSgpICE9IG51bGwpIHsKLQkJCQltb2RpZmllZFJlc291cmNlcy5hZGQoZWxlbWVudC5lUmVzb3VyY2UoKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5BYnN0cmFjdENvbW1hbmQjdW5kbygpCi0JICovCi0JcHVibGljIHZvaWQgdW5kbygpIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZmVhdHVyZVZhbHVlUGFpclRvT2JqZWN0TWFwLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQlNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBpdGVyLm5leHQoKTsKLQkJCUZlYXR1cmVWYWx1ZVBhaXIgZnZQYWlyID0gKEZlYXR1cmVWYWx1ZVBhaXIpIGVudHJ5LmdldEtleSgpOwotCQkJRU9iamVjdCBlbGVtZW50ID0gKEVPYmplY3QpIGVudHJ5LmdldFZhbHVlKCk7Ci0JCQlpZiAoZnZQYWlyLmZlYXR1cmUuaXNNYW55KCkpIHsKLQkJCQkoKENvbGxlY3Rpb24pIGVsZW1lbnQuZUdldChmdlBhaXIuZmVhdHVyZSkpLmFkZChmdlBhaXIudmFsdWUpOwotCQkJfSBlbHNlIHsKLQkJCQllbGVtZW50LmVTZXQoZnZQYWlyLmZlYXR1cmUsIGZ2UGFpci52YWx1ZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJYmFzZSA9IHBsdWdpbiA9IG51bGw7Ci0JCWlmKGZlYXR1cmVWYWx1ZVBhaXJUb09iamVjdE1hcCAhPSBudWxsKSB7Ci0JCQlmZWF0dXJlVmFsdWVQYWlyVG9PYmplY3RNYXAuY2xlYXIoKTsKLQkJfQotCQlpZihtb2RpZmllZFJlc291cmNlcyAhPSBudWxsKSB7Ci0JCQltb2RpZmllZFJlc291cmNlcy5jbGVhcigpOwotCQl9Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBGZWF0dXJlVmFsdWVQYWlyIHsKLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmU7Ci0KLQkJT2JqZWN0IHZhbHVlOwotCi0JCUZlYXR1cmVWYWx1ZVBhaXIoRVN0cnVjdHVyYWxGZWF0dXJlIGYsIE9iamVjdCB2KSB7Ci0JCQlmZWF0dXJlID0gZjsKLQkJCXZhbHVlID0gdjsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29tbWFuZC9SZXNvdXJjZUF3YXJlQ29tcG91bmRDb21tYW5kLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbW1hbmQvUmVzb3VyY2VBd2FyZUNvbXBvdW5kQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNGRhM2VlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29tbWFuZC9SZXNvdXJjZUF3YXJlQ29tcG91bmRDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbXBvdW5kQ29tbWFuZDsKLQotLyoqCi0gKiBBIGNvbXBvdW5kIGNvbW1hbmQgdGhhdCBpcyByZXNvdXJjZSBhd2FyZS4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFJlc291cmNlQXdhcmVDb21wb3VuZENvbW1hbmQgZXh0ZW5kcyBDb21wb3VuZENvbW1hbmQgaW1wbGVtZW50cwotCQlJUmVzb3VyY2VBd2FyZUNvbW1hbmQgewotCi0JcHVibGljIFJlc291cmNlQXdhcmVDb21wb3VuZENvbW1hbmQoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGxhYmVsCi0JICovCi0JcHVibGljIFJlc291cmNlQXdhcmVDb21wb3VuZENvbW1hbmQoU3RyaW5nIGxhYmVsKSB7Ci0JCXN1cGVyKGxhYmVsKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbGFiZWwKLQkgKiBAcGFyYW0gZGVzY3JpcHRpb24KLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VBd2FyZUNvbXBvdW5kQ29tbWFuZChTdHJpbmcgbGFiZWwsIFN0cmluZyBkZXNjcmlwdGlvbikgewotCQlzdXBlcihsYWJlbCwgZGVzY3JpcHRpb24pOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBjb21tYW5kTGlzdAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUF3YXJlQ29tcG91bmRDb21tYW5kKExpc3QgY29tbWFuZExpc3QpIHsKLQkJc3VwZXIoY29tbWFuZExpc3QpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBsYWJlbAotCSAqIEBwYXJhbSBjb21tYW5kTGlzdAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUF3YXJlQ29tcG91bmRDb21tYW5kKFN0cmluZyBsYWJlbCwgTGlzdCBjb21tYW5kTGlzdCkgewotCQlzdXBlcihsYWJlbCwgY29tbWFuZExpc3QpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBsYWJlbAotCSAqIEBwYXJhbSBkZXNjcmlwdGlvbgotCSAqIEBwYXJhbSBjb21tYW5kTGlzdAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUF3YXJlQ29tcG91bmRDb21tYW5kKFN0cmluZyBsYWJlbCwgU3RyaW5nIGRlc2NyaXB0aW9uLAotCQkJTGlzdCBjb21tYW5kTGlzdCkgewotCQlzdXBlcihsYWJlbCwgZGVzY3JpcHRpb24sIGNvbW1hbmRMaXN0KTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gcmVzdWx0SW5kZXgKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VBd2FyZUNvbXBvdW5kQ29tbWFuZChpbnQgcmVzdWx0SW5kZXgpIHsKLQkJc3VwZXIocmVzdWx0SW5kZXgpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSByZXN1bHRJbmRleAotCSAqIEBwYXJhbSBsYWJlbAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUF3YXJlQ29tcG91bmRDb21tYW5kKGludCByZXN1bHRJbmRleCwgU3RyaW5nIGxhYmVsKSB7Ci0JCXN1cGVyKHJlc3VsdEluZGV4LCBsYWJlbCk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHJlc3VsdEluZGV4Ci0JICogQHBhcmFtIGxhYmVsCi0JICogQHBhcmFtIGRlc2NyaXB0aW9uCi0JICovCi0JcHVibGljIFJlc291cmNlQXdhcmVDb21wb3VuZENvbW1hbmQoaW50IHJlc3VsdEluZGV4LCBTdHJpbmcgbGFiZWwsCi0JCQlTdHJpbmcgZGVzY3JpcHRpb24pIHsKLQkJc3VwZXIocmVzdWx0SW5kZXgsIGxhYmVsLCBkZXNjcmlwdGlvbik7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHJlc3VsdEluZGV4Ci0JICogQHBhcmFtIGNvbW1hbmRMaXN0Ci0JICovCi0JcHVibGljIFJlc291cmNlQXdhcmVDb21wb3VuZENvbW1hbmQoaW50IHJlc3VsdEluZGV4LCBMaXN0IGNvbW1hbmRMaXN0KSB7Ci0JCXN1cGVyKHJlc3VsdEluZGV4LCBjb21tYW5kTGlzdCk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHJlc3VsdEluZGV4Ci0JICogQHBhcmFtIGxhYmVsCi0JICogQHBhcmFtIGNvbW1hbmRMaXN0Ci0JICovCi0JcHVibGljIFJlc291cmNlQXdhcmVDb21wb3VuZENvbW1hbmQoaW50IHJlc3VsdEluZGV4LCBTdHJpbmcgbGFiZWwsCi0JCQlMaXN0IGNvbW1hbmRMaXN0KSB7Ci0JCXN1cGVyKHJlc3VsdEluZGV4LCBsYWJlbCwgY29tbWFuZExpc3QpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSByZXN1bHRJbmRleAotCSAqIEBwYXJhbSBsYWJlbAotCSAqIEBwYXJhbSBkZXNjcmlwdGlvbgotCSAqIEBwYXJhbSBjb21tYW5kTGlzdAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUF3YXJlQ29tcG91bmRDb21tYW5kKGludCByZXN1bHRJbmRleCwgU3RyaW5nIGxhYmVsLAotCQkJU3RyaW5nIGRlc2NyaXB0aW9uLCBMaXN0IGNvbW1hbmRMaXN0KSB7Ci0JCXN1cGVyKHJlc3VsdEluZGV4LCBsYWJlbCwgZGVzY3JpcHRpb24sIGNvbW1hbmRMaXN0KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LmNvbW1hbmQuSVJlc291cmNlQXdhcmVDb21tYW5kI2dldE1vZGlmaWVkUmVzb3VyY2VzKCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRNb2RpZmllZFJlc291cmNlcygpIHsKLQkJQ29sbGVjdGlvbiBtb2RpZmllZFJlc291cmNlcyA9IG5ldyBIYXNoU2V0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGNvbW1hbmRMaXN0Lml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGNtZCA9IGl0ZXIubmV4dCgpOwotCQkJaWYgKGNtZCBpbnN0YW5jZW9mIElSZXNvdXJjZUF3YXJlQ29tbWFuZCkgewotCQkJCW1vZGlmaWVkUmVzb3VyY2VzLmFkZEFsbCgoKElSZXNvdXJjZUF3YXJlQ29tbWFuZCkgY21kKQotCQkJCQkJLmdldE1vZGlmaWVkUmVzb3VyY2VzKCkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBtb2RpZmllZFJlc291cmNlczsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29tbWFuZC9SZXNvdXJjZUF3YXJlRHJhZ0FuZERyb3BDb21tYW5kLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbW1hbmQvUmVzb3VyY2VBd2FyZURyYWdBbmREcm9wQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYTYwODE4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29tbWFuZC9SZXNvdXJjZUF3YXJlRHJhZ0FuZERyb3BDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkRyYWdBbmREcm9wQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmUgMS4yCi0gKi8KLXB1YmxpYyBjbGFzcyBSZXNvdXJjZUF3YXJlRHJhZ0FuZERyb3BDb21tYW5kIGV4dGVuZHMgRHJhZ0FuZERyb3BDb21tYW5kIAotaW1wbGVtZW50cyBJUmVzb3VyY2VBd2FyZUNvbW1hbmQKLXsKLQotCXByaXZhdGUgU2V0PFJlc291cmNlPiBtb2RpZmllZFJlc291cmNlczsKLQotCS8qKgotCSAqIEBwYXJhbSBkb21haW4KLQkgKiBAcGFyYW0gb3duZXIKLQkgKiBAcGFyYW0gbG9jYXRpb24KLQkgKiBAcGFyYW0gb3BlcmF0aW9ucwotCSAqIEBwYXJhbSBvcGVyYXRpb24KLQkgKiBAcGFyYW0gY29sbGVjdGlvbgotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUF3YXJlRHJhZ0FuZERyb3BDb21tYW5kKEVkaXRpbmdEb21haW4gZG9tYWluLCBPYmplY3Qgb3duZXIsCi0JCQlmbG9hdCBsb2NhdGlvbiwgaW50IG9wZXJhdGlvbnMsIGludCBvcGVyYXRpb24sIENvbGxlY3Rpb248Pz4gY29sbGVjdGlvbikgewotCQlzdXBlcihkb21haW4sIG93bmVyLCBsb2NhdGlvbiwgb3BlcmF0aW9ucywgb3BlcmF0aW9uLCBjb2xsZWN0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZG9tYWluCi0JICogQHBhcmFtIG93bmVyCi0JICogQHBhcmFtIGxvY2F0aW9uCi0JICogQHBhcmFtIG9wZXJhdGlvbnMKLQkgKiBAcGFyYW0gb3BlcmF0aW9uCi0JICogQHBhcmFtIGNvbGxlY3Rpb24KLQkgKiBAcGFyYW0gb3B0aW1pemUKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VBd2FyZURyYWdBbmREcm9wQ29tbWFuZChFZGl0aW5nRG9tYWluIGRvbWFpbiwgT2JqZWN0IG93bmVyLAotCQkJZmxvYXQgbG9jYXRpb24sIGludCBvcGVyYXRpb25zLCBpbnQgb3BlcmF0aW9uLAotCQkJQ29sbGVjdGlvbjw/PiBjb2xsZWN0aW9uLCBib29sZWFuIG9wdGltaXplKSB7Ci0JCXN1cGVyKGRvbWFpbiwgb3duZXIsIGxvY2F0aW9uLCBvcGVyYXRpb25zLCBvcGVyYXRpb24sIGNvbGxlY3Rpb24sCi0JCQkJb3B0aW1pemUpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuY29tbWFuZC5JUmVzb3VyY2VBd2FyZUNvbW1hbmQjZ2V0TW9kaWZpZWRSZXNvdXJjZXMoKQotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKSAKLQlwdWJsaWMgQ29sbGVjdGlvbjxSZXNvdXJjZT4gZ2V0TW9kaWZpZWRSZXNvdXJjZXMoKSB7Ci0JCWlmKG1vZGlmaWVkUmVzb3VyY2VzID09IG51bGwpIHsKLQkJCWlmKGRyb3BDb21tYW5kICE9IG51bGwpIHsKLQkJCQltb2RpZmllZFJlc291cmNlcyA9IFRuZ1V0aWwuZ2V0TW9kaWZpZWRSZXNvdXJjZXMoZHJvcENvbW1hbmQpOwotCQkJfQotCQkJaWYobW9kaWZpZWRSZXNvdXJjZXMgPT0gbnVsbCB8fCBtb2RpZmllZFJlc291cmNlcy5pc0VtcHR5KCkpIHsKLQkJCQltb2RpZmllZFJlc291cmNlcyA9IENvbGxlY3Rpb25zLkVNUFRZX1NFVDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbW9kaWZpZWRSZXNvdXJjZXM7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbW1hbmQvUmVzb3VyY2VBd2FyZVBhc3RlRnJvbUNsaXBib2FyZENvbW1hbmQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29tbWFuZC9SZXNvdXJjZUF3YXJlUGFzdGVGcm9tQ2xpcGJvYXJkQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzlkMzE1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29tbWFuZC9SZXNvdXJjZUF3YXJlUGFzdGVGcm9tQ2xpcGJvYXJkQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmRXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLlBhc3RlRnJvbUNsaXBib2FyZENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW47Ci0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUgLSBBdWcgMjIsIDIwMDYKLSAqIEBzaW5jZSAgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBSZXNvdXJjZUF3YXJlUGFzdGVGcm9tQ2xpcGJvYXJkQ29tbWFuZCBleHRlbmRzCi0JCVBhc3RlRnJvbUNsaXBib2FyZENvbW1hbmQgaW1wbGVtZW50cyBJUmVzb3VyY2VBd2FyZUNvbW1hbmQgewotCi0JLyoqCi0JICogQHBhcmFtIGRvbWFpbgotCSAqIEBwYXJhbSBvd25lcgotCSAqIEBwYXJhbSBmZWF0dXJlCi0JICogQHBhcmFtIGluZGV4Ci0JICogQHBhcmFtIG9wdGltaXplCi0JICovCi0JcHVibGljIFJlc291cmNlQXdhcmVQYXN0ZUZyb21DbGlwYm9hcmRDb21tYW5kKEVkaXRpbmdEb21haW4gZG9tYWluLCBPYmplY3Qgb3duZXIsIE9iamVjdCBmZWF0dXJlLCBpbnQgaW5kZXgsIGJvb2xlYW4gb3B0aW1pemUpIHsKLQkJc3VwZXIoZG9tYWluLCBvd25lciwgZmVhdHVyZSwgaW5kZXgsIG9wdGltaXplKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZG9tYWluCi0JICogQHBhcmFtIG93bmVyCi0JICogQHBhcmFtIGZlYXR1cmUKLQkgKiBAcGFyYW0gaW5kZXgKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VBd2FyZVBhc3RlRnJvbUNsaXBib2FyZENvbW1hbmQoRWRpdGluZ0RvbWFpbiBkb21haW4sIE9iamVjdCBvd25lciwgT2JqZWN0IGZlYXR1cmUsIGludCBpbmRleCkgewotCQlzdXBlcihkb21haW4sIG93bmVyLCBmZWF0dXJlLCBpbmRleCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklSZXNvdXJjZUF3YXJlQ29tbWFuZCNnZXRNb2RpZmllZFJlc291cmNlcygpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0TW9kaWZpZWRSZXNvdXJjZXMoKSB7Ci0JCUNvbGxlY3Rpb24gbW9kaWZpZWRSZXNvdXJjZXMgPSBuZXcgSGFzaFNldCgpOwotCQlpZihvd25lciBpbnN0YW5jZW9mIEVPYmplY3QpIHsKLQkJCVJlc291cmNlIHJlc291cmNlID0gKChFT2JqZWN0KW93bmVyKS5lUmVzb3VyY2UoKTsKLQkJCWlmKHJlc291cmNlICE9IG51bGwpIHsKLQkJCQltb2RpZmllZFJlc291cmNlcy5hZGQocmVzb3VyY2UpOwotCQkJfQotCQl9Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGNvbW1hbmQuZ2V0Q29tbWFuZExpc3QoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBjbWQgPSBpdGVyLm5leHQoKTsKLQkJCXdoaWxlKCEoY21kIGluc3RhbmNlb2YgSVJlc291cmNlQXdhcmVDb21tYW5kKSAmJiBjbWQgaW5zdGFuY2VvZiBDb21tYW5kV3JhcHBlcikgewotCQkJCWNtZCA9ICgoQ29tbWFuZFdyYXBwZXIpY21kKS5nZXRDb21tYW5kKCk7Ci0JCQl9Ci0JCQlpZiAoY21kIGluc3RhbmNlb2YgSVJlc291cmNlQXdhcmVDb21tYW5kKSB7Ci0JCQkJbW9kaWZpZWRSZXNvdXJjZXMuYWRkQWxsKCgoSVJlc291cmNlQXdhcmVDb21tYW5kKSBjbWQpCi0JCQkJCQkuZ2V0TW9kaWZpZWRSZXNvdXJjZXMoKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG1vZGlmaWVkUmVzb3VyY2VzOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb21tYW5kL1NhdmVTdGF0dXMuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29tbWFuZC9TYXZlU3RhdHVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3ZjUwOTUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb21tYW5kL1NhdmVTdGF0dXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci0KLS8qKgotICogVGhlIHN0YXR1cyBvZiBhIHNhdmUgb3BlcmF0aW9uLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgU2F2ZVN0YXR1cyBleHRlbmRzIFN0YXR1cyB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTQVZFX0VSUk9SID0gMTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJPTExCQUNLX0VSUk9SID0gMjsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICogCi0JICogQHBhcmFtIHNldmVyaXR5Ci0JICogQHBhcmFtIHBsdWdpbklkCi0JICogQHBhcmFtIGNvZGUKLQkgKiBAcGFyYW0gbWVzc2FnZQotCSAqIEBwYXJhbSBleGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgU2F2ZVN0YXR1cyhpbnQgc2V2ZXJpdHksIFN0cmluZyBwbHVnaW5JZCwgaW50IGNvZGUsIFN0cmluZyBtZXNzYWdlLAotCQkJVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlzdXBlcihzZXZlcml0eSwgcGx1Z2luSWQsIGNvZGUsIG1lc3NhZ2UsIGV4Y2VwdGlvbik7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbW1hbmQvU2V0T3Bwb3NpdGVGZWF0dXJlQ29tbWFuZC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb21tYW5kL1NldE9wcG9zaXRlRmVhdHVyZUNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzY0YzY4ZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbW1hbmQvU2V0T3Bwb3NpdGVGZWF0dXJlQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5BYnN0cmFjdENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51aS5Vc2VySW50ZXJhY3Rpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUuaW1wbC5NdWx0aVJlc291cmNlRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLnV0aWwuT3Bwb3NpdGVGZWF0dXJlOwotCi0vKioKLSAqIFRoaXMgY29tbWFuZCBpcyB1c2VkIHRvIHNldCBhbiBvcHBvc2l0ZSBmZWF0dXJlLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgU2V0T3Bwb3NpdGVGZWF0dXJlQ29tbWFuZCBleHRlbmRzIEFic3RyYWN0Q29tbWFuZCBpbXBsZW1lbnRzCi0JCUlSZXNvdXJjZUF3YXJlQ29tbWFuZCB7Ci0KLQlwcml2YXRlIE1ldGhvZEVsZW1lbnQgZWxlbWVudDsKLQotCXByaXZhdGUgT3Bwb3NpdGVGZWF0dXJlIG9wcG9zaXRlRmVhdHVyZTsKLQotCXByaXZhdGUgRU9iamVjdCB2YWx1ZTsKLQotCXByaXZhdGUgRU9iamVjdCBvbGRWYWx1ZTsKLQotCXByaXZhdGUgQ29sbGVjdGlvbiBtb2RpZmllZFJlc291cmNlczsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFNldE9wcG9zaXRlRmVhdHVyZUNvbW1hbmQoTWV0aG9kRWxlbWVudCBlLAotCQkJT3Bwb3NpdGVGZWF0dXJlIG9wcG9zaXRlRmVhdHVyZSwgRU9iamVjdCB2YWx1ZSkgewotCQl0aGlzLmVsZW1lbnQgPSBlOwotCQl0aGlzLm9wcG9zaXRlRmVhdHVyZSA9IG9wcG9zaXRlRmVhdHVyZTsKLQkJdGhpcy52YWx1ZSA9IHZhbHVlOwotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldE1vZGlmaWVkUmVzb3VyY2VzKCkgewotCQlpZiAobW9kaWZpZWRSZXNvdXJjZXMgPT0gbnVsbCkgewotCQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JCX0KLQkJcmV0dXJuIG1vZGlmaWVkUmVzb3VyY2VzOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkFic3RyYWN0Q29tbWFuZCNwcmVwYXJlKCkKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBwcmVwYXJlKCkgewotCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQlyZXR1cm4gVXNlckludGVyYWN0aW9uSGVscGVyLmNoZWNrTW9kaWZ5T3Bwb3NpdGUoCi0JCQkJCShNZXRob2RFbGVtZW50KSB2YWx1ZSwgb3Bwb3NpdGVGZWF0dXJlLmdldFRhcmdldEZlYXR1cmUoKSwKLQkJCQkJZWxlbWVudCk7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJb2xkVmFsdWUgPSAoRU9iamVjdCkgKChNdWx0aVJlc291cmNlRU9iamVjdCkgZWxlbWVudCkKLQkJCQkuZ2V0T3Bwb3NpdGVGZWF0dXJlVmFsdWUob3Bwb3NpdGVGZWF0dXJlKTsKLQkJbW9kaWZpZWRSZXNvdXJjZXMgPSBuZXcgSGFzaFNldCgpOwotCi0JCXJlZG8oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZWRvKCkgewotCQlpZiAob2xkVmFsdWUgIT0gbnVsbCAmJiB2YWx1ZSA9PSBudWxsKSB7Ci0JCQlpZiAob3Bwb3NpdGVGZWF0dXJlLmdldFRhcmdldEZlYXR1cmUoKS5pc01hbnkoKSkgewotCQkJCSgoQ29sbGVjdGlvbikgb2xkVmFsdWUuZUdldChvcHBvc2l0ZUZlYXR1cmUuZ2V0VGFyZ2V0RmVhdHVyZSgpKSkKLQkJCQkJCS5yZW1vdmUoZWxlbWVudCk7Ci0JCQl9IGVsc2UgewotCQkJCW9sZFZhbHVlLmVTZXQob3Bwb3NpdGVGZWF0dXJlLmdldFRhcmdldEZlYXR1cmUoKSwgbnVsbCk7Ci0JCQl9Ci0JCQlpZiAob2xkVmFsdWUuZVJlc291cmNlKCkgIT0gbnVsbCkgewotCQkJCW1vZGlmaWVkUmVzb3VyY2VzLmFkZChvbGRWYWx1ZS5lUmVzb3VyY2UoKSk7Ci0JCQl9Ci0JCX0KLQotCQlpZiAodmFsdWUgIT0gbnVsbCkgewotCQkJaWYgKG9wcG9zaXRlRmVhdHVyZS5nZXRUYXJnZXRGZWF0dXJlKCkuaXNNYW55KCkpIHsKLQkJCQkoKENvbGxlY3Rpb24pIHZhbHVlLmVHZXQob3Bwb3NpdGVGZWF0dXJlLmdldFRhcmdldEZlYXR1cmUoKSkpCi0JCQkJCQkuYWRkKGVsZW1lbnQpOwotCQkJfSBlbHNlIHsKLQkJCQl2YWx1ZS5lU2V0KG9wcG9zaXRlRmVhdHVyZS5nZXRUYXJnZXRGZWF0dXJlKCksIGVsZW1lbnQpOwotCQkJfQotCQkJaWYgKHZhbHVlLmVSZXNvdXJjZSgpICE9IG51bGwpIHsKLQkJCQltb2RpZmllZFJlc291cmNlcy5hZGQodmFsdWUuZVJlc291cmNlKCkpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQWJzdHJhY3RDb21tYW5kI3VuZG8oKQotCSAqLwotCXB1YmxpYyB2b2lkIHVuZG8oKSB7Ci0JCWlmICh2YWx1ZSAhPSBudWxsKSB7Ci0JCQlpZiAob3Bwb3NpdGVGZWF0dXJlLmdldFRhcmdldEZlYXR1cmUoKS5pc01hbnkoKSkgewotCQkJCSgoQ29sbGVjdGlvbikgdmFsdWUuZUdldChvcHBvc2l0ZUZlYXR1cmUuZ2V0VGFyZ2V0RmVhdHVyZSgpKSkKLQkJCQkJCS5yZW1vdmUoZWxlbWVudCk7Ci0JCQl9IGVsc2UgewotCQkJCXZhbHVlLmVTZXQob3Bwb3NpdGVGZWF0dXJlLmdldFRhcmdldEZlYXR1cmUoKSwgbnVsbCk7Ci0JCQl9Ci0JCX0KLQotCQlpZiAob2xkVmFsdWUgIT0gbnVsbCkgewotCQkJaWYgKG9wcG9zaXRlRmVhdHVyZS5nZXRUYXJnZXRGZWF0dXJlKCkuaXNNYW55KCkpIHsKLQkJCQkoKENvbGxlY3Rpb24pIG9sZFZhbHVlLmVHZXQob3Bwb3NpdGVGZWF0dXJlLmdldFRhcmdldEZlYXR1cmUoKSkpCi0JCQkJCQkuYWRkKGVsZW1lbnQpOwotCQkJfSBlbHNlIHsKLQkJCQlvbGRWYWx1ZS5lU2V0KG9wcG9zaXRlRmVhdHVyZS5nZXRUYXJnZXRGZWF0dXJlKCksIGVsZW1lbnQpOwotCQkJfQotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbW1hbmQvVXNlcklucHV0LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbW1hbmQvVXNlcklucHV0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkMmYzYmEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb21tYW5kL1VzZXJJbnB1dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbi5JVmFsaWRhdG9yOwotCi0vKioKLSAqIENsYXNzIHRoYXQga2VlcHMgdGhlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBpbnB1dCByZXF1ZXN0IGFuZCByZWZlcmVuY2UgdG8gdGhlCi0gKiBpbnB1dCB1c2VyIHNwZWNpZmllZCBvciBzZWxlY3RlZAotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgVXNlcklucHV0IHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBURVhUID0gMDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNFTEVDVElPTiA9IDE7Ci0KLQlwcml2YXRlIFN0cmluZyBsYWJlbDsKLQotCXByaXZhdGUgaW50IHR5cGU7Ci0KLQlwcml2YXRlIGJvb2xlYW4gbXVsdGlwbGU7Ci0KLQlwcml2YXRlIExpc3QgY2hvaWNlczsKLQotCXByaXZhdGUgT2JqZWN0IGlucHV0OwotCi0JcHJpdmF0ZSBJSXRlbUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlcjsKLQotCXByaXZhdGUgT2JqZWN0IGNvbnRleHQ7Ci0KLQlwcml2YXRlIElWYWxpZGF0b3IgdmFsaWRhdG9yOwotCi0JcHVibGljIFVzZXJJbnB1dChTdHJpbmcgbGFiZWwsIGludCB0eXBlLCBib29sZWFuIG11bHRpcGxlLCBMaXN0IGNob2ljZXMsCi0JCQlJSXRlbUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlciwgT2JqZWN0IGNvbnRleHQpIHsKLQkJdGhpcyhsYWJlbCwgdHlwZSwgbXVsdGlwbGUsIGNob2ljZXMsIGxhYmVsUHJvdmlkZXIsIG51bGwsIGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBsYWJlbAotCSAqIEBwYXJhbSB0eXBlCi0JICogQHBhcmFtIG11bHRpcGxlCi0JICogQHBhcmFtIGNob2ljZXMKLQkgKiBAcGFyYW0gbGFiZWxQcm92aWRlcgotCSAqICAgICAgICAgICAgdGhlIGxhYmVsIHByb3ZpZGVyIHRvIHJlcHJlc2VudCB0aGUgZWxlbWVudCBpbiB0aGUKLQkgKiAgICAgICAgICAgIDxjb2RlPmNob2ljZXM8L2NvZGU+IGxpc3Qgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYKLQkgKiAgICAgICAgICAgIDxjb2RlPmNob2ljZXM8L2NvZGU+IGxpc3QgaXMgPGNvZGU+bnVsbDwvY29kZT4KLQkgKiBAcGFyYW0gdmFsaWRhdG9yCi0JICogICAgICAgICAgICB0aGUgdmFsaWRhdG9yIHRvIHZhbGlkYXRlIHRoZSBpbnB1dAotCSAqIEBwYXJhbSBjb250ZXh0Ci0JICogICAgICAgICAgICB0aGUgY29udGV4dCBvZiB0aGUgdXNlciBpbnB1dCB0aGF0IGlzIGNvbW1hbmQtc3BlY2lmaWMgYW5kIGNhbgotCSAqICAgICAgICAgICAgY29udGFpbiBhZGRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdXNlciBpbnB1dC4KLQkgKi8KLQlwdWJsaWMgVXNlcklucHV0KFN0cmluZyBsYWJlbCwgaW50IHR5cGUsIGJvb2xlYW4gbXVsdGlwbGUsIExpc3QgY2hvaWNlcywKLQkJCUlJdGVtTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyLCBJVmFsaWRhdG9yIHZhbGlkYXRvciwgT2JqZWN0IGNvbnRleHQpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5sYWJlbCA9IGxhYmVsOwotCQl0aGlzLnR5cGUgPSB0eXBlOwotCQl0aGlzLm11bHRpcGxlID0gbXVsdGlwbGU7Ci0JCXRoaXMuY2hvaWNlcyA9IGNob2ljZXM7Ci0JCXRoaXMubGFiZWxQcm92aWRlciA9IGxhYmVsUHJvdmlkZXI7Ci0JCXRoaXMudmFsaWRhdG9yID0gdmFsaWRhdG9yOwotCQl0aGlzLmNvbnRleHQgPSBjb250ZXh0OwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0SW5wdXQoKSB7Ci0JCXJldHVybiBpbnB1dDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRJbnB1dChPYmplY3QgaW5wdXQpIHsKLQkJdGhpcy5pbnB1dCA9IGlucHV0OwotCX0KLQotCXB1YmxpYyBMaXN0IGdldENob2ljZXMoKSB7Ci0JCXJldHVybiBjaG9pY2VzOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TGFiZWwoKSB7Ci0JCXJldHVybiBsYWJlbDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc011bHRpcGxlKCkgewotCQlyZXR1cm4gbXVsdGlwbGU7Ci0JfQotCi0JcHVibGljIGludCBnZXRUeXBlKCkgewotCQlyZXR1cm4gdHlwZTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBsYWJlbCBwcm92aWRlcgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGxhYmVsIHByb3ZpZGVyCi0JICovCi0JcHVibGljIElJdGVtTGFiZWxQcm92aWRlciBnZXRMYWJlbFByb3ZpZGVyKCkgewotCQlyZXR1cm4gbGFiZWxQcm92aWRlcjsKLQl9Ci0JCi0JLyoqCi0JICogR2V0cyB0aGUgdmFsaWRhdG9yCi0JICogCi0JICogQHJldHVybiB0aGUgdmFsaWRhdG9yCi0JICovCi0JcHVibGljIElWYWxpZGF0b3IgZ2V0VmFsaWRhdG9yKCkgewotCQlyZXR1cm4gdmFsaWRhdG9yOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGNvbnRleHQgb2YgdGhpcyB1c2VyIGlucHV0Ci0JICogCi0JICogQHJldHVybiB0aGUgY29udGV4dAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0Q29udGV4dCgpIHsKLQkJcmV0dXJuIGNvbnRleHQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb21tYW5kL3BhY2thZ2UuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29tbWFuZC9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1ZDdjZTIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb21tYW5kL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIGNvbW1hbmRzIGZvciBlZGl0aW5nIG1ldGhvZCBsaWJyYXJ5IGVsZW1lbnRzLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29uZmlndXJhdGlvbi9BY3Rpdml0eUl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb25maWd1cmF0aW9uL0FjdGl2aXR5SXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwYjM1MzEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb25maWd1cmF0aW9uL0FjdGl2aXR5SXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb25maWd1cmF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuUHJvY2Vzc1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlN1cHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NaWxlc3RvbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudDsKLQotLyoqCi0gKiBUaGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhbiBhY3Rpdml0eSBpbiB0aGUgQ29uZmlndXJhdGlvbiB2aWV3LgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eUl0ZW1Qcm92aWRlciBleHRlbmRzCi0JCW9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5BY3Rpdml0eUl0ZW1Qcm92aWRlciB7Ci0KLQlwcml2YXRlIFByb2Nlc3MgcHJvY2VzczsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIEFjdGl2aXR5SXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQlwcml2YXRlIFByb2Nlc3MgZ2V0UHJvY2VzcygpIHsKLQkJaWYgKHByb2Nlc3MgPT0gbnVsbCkgewotCQkJT2JqZWN0IHRvcCA9IGdldFRvcEl0ZW0oKTsKLQkJCWlmICh0b3AgaW5zdGFuY2VvZiBQcm9jZXNzKSB7Ci0JCQkJcHJvY2VzcyA9IChQcm9jZXNzKSB0b3A7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHByb2Nlc3M7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuQWN0aXZpdHlJdGVtUHJvdmlkZXIjYWNjZXB0QXNDaGlsZChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGFjY2VwdEFzQ2hpbGQoT2JqZWN0IGNoaWxkKSB7Ci0JCXJldHVybiAgY2hpbGQgaW5zdGFuY2VvZiBNaWxlc3RvbmUgCi0JCQl8fCAoY2hpbGQgaW5zdGFuY2VvZiBBY3Rpdml0eQotCQkJCSYmICFUbmdVdGlsLmlzQ29udHJpYnV0b3JPclJlcGxhY2VyKChWYXJpYWJpbGl0eUVsZW1lbnQpIGNoaWxkKQotCQkJCSYmIFByb2Nlc3NVdGlsLmFjY2VwdCgoQWN0aXZpdHkpIGNoaWxkLCBnZXRGaWx0ZXIoKSwgZmFsc2UpKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CU0FjdGl2aXR5SXRlbVByb3ZpZGVyI2dldENoaWxkcmVuKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlDb2xsZWN0aW9uIGNoaWxkcmVuID0gc3VwZXIuZ2V0Q2hpbGRyZW4ob2JqZWN0KTsKLQotCQkvLyByZW1vdmUgYW55IHN1cHByZXNzZWQgY2hpbGQKLQkJLy8KLQkJUHJvY2VzcyBwcm9jID0gZ2V0UHJvY2VzcygpOwotCQlpZiAocHJvYyAhPSBudWxsKSB7Ci0JCQkvLyBnZXRQcm9jZXNzKCkgbWlnaHQgcmV0dXJuIG51bGwgaWYgZ2V0Q2hpbGRyZW4oT2JqZWN0KSBpcyBjYWxsZWQKLQkJCS8vIG9uIGJhc2UgYWN0aXZpdHkgdG8KLQkJCS8vIHJldHJpZXZlIGl0cyBjaGlsZHJlbgotCQkJLy8KLQkJCVN1cHByZXNzaW9uIHN1cHByZXNzaW9uID0gU3VwcHJlc3Npb24uZ2V0U3VwcHJlc3Npb24ocHJvYyk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjaGlsZHJlbi5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3QgY2hpbGQgPSAoT2JqZWN0KSBpdGVyLm5leHQoKTsKLQkJCQlpZiAoc3VwcHJlc3Npb24uaXNTdXBwcmVzc2VkKGNoaWxkKSkgewotCQkJCQlpdGVyLnJlbW92ZSgpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiBjaGlsZHJlbjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CU0FjdGl2aXR5SXRlbVByb3ZpZGVyI25vdGlmeUNoYW5nZWQob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQlpZiAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChBY3Rpdml0eS5jbGFzcykgPT0gVW1hUGFja2FnZS5BQ1RJVklUWV9fU1VQUFJFU1NFRCkgewotCQkJLy8gcmVmcmVzaCBwYXJlbnQgY29udGVudAotCQkJLy8KLQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLAotCQkJCQlnZXRQYXJlbnQobm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCkpLCB0cnVlLCBmYWxzZSkpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29uZmlndXJhdGlvbi9DYXRlZ29yaWVzSXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbmZpZ3VyYXRpb24vQ2F0ZWdvcmllc0l0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOTdmZDY4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29uZmlndXJhdGlvbi9DYXRlZ29yaWVzSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb25maWd1cmF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklMaWJyYXJ5SXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50Q2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci0KLS8qKgotICogVGhlIGJhc2UgaXRlbSBwcm92aWRlciBhZGFwdGVyIGNsYXNzIGZvciB0aGUgc3RhbmRhcmQgY2F0ZWdvcmllcyBpbgotICogYSBjb25maWd1cmF0aW9uLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBDYXRlZ29yaWVzSXRlbVByb3ZpZGVyIGV4dGVuZHMgSXRlbVByb3ZpZGVyQWRhcHRlciBpbXBsZW1lbnRzCi0JCUlFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlLAotCQlJQ29uZmlndXJhYmxlLCBJTGlicmFyeUl0ZW1Qcm92aWRlciB7Ci0KLQlwcm90ZWN0ZWQgTGlzdCBjaGlsZHJlbjsKLQotCXByaXZhdGUgU3RyaW5nIGxhYmVsOwotCi0JcHJpdmF0ZSBPYmplY3QgcGFyZW50OwotCi0JcHJvdGVjdGVkIFN0cmluZ1tdIGNhdGVnb3J5UGtnUGF0aDsKLQotCXByb3RlY3RlZCBJRmlsdGVyIGZpbHRlcjsKLQotCXByaXZhdGUgT2JqZWN0IGltYWdlOwotCi0JcHJvdGVjdGVkIElGaWx0ZXIgdW5jYXRlZ29yaXplZEZpbHRlcjsKLQotCXByb3RlY3RlZCBTdHJpbmcgdW5jYXRlZ29yaXplZExhYmVsOwotCi0JcHJvdGVjdGVkIElGaWx0ZXIgY2F0ZWdvcml6ZWRGaWx0ZXI7Ci0KLQlwcm90ZWN0ZWQgT2JqZWN0IHVuY2F0ZWdvcml6ZWRJbWFnZTsKLQotCXByb3RlY3RlZCBNZXRob2RDb25maWd1cmF0aW9uIG1ldGhvZENvbmZpZzsKLQotCXByaXZhdGUgVW5jYXRlZ29yaXplZEl0ZW1Qcm92aWRlciB1bmNhdGVnb3JpemVkSXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgQ2F0ZWdvcmllc0l0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwKLQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gbWV0aG9kQ29uZmlnLCBTdHJpbmcgbmFtZSwgT2JqZWN0IGltYWdlLAotCQkJU3RyaW5nW10gY2F0ZWdvcnlQa2dQYXRoKSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQkJLy8gbWV0aG9kQ29uZmlnLmVBZGFwdGVycygpLmFkZCh0aGlzKTsKLQkJdGhpcy5tZXRob2RDb25maWcgPSBtZXRob2RDb25maWc7Ci0JCWxhYmVsID0gbmFtZTsKLQkJdGhpcy5jYXRlZ29yeVBrZ1BhdGggPSBjYXRlZ29yeVBrZ1BhdGg7Ci0JCXRoaXMuaW1hZ2UgPSBpbWFnZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgVW5jYXRlZ29yaXplZEl0ZW1Qcm92aWRlciBjcmVhdGVVbmNhdGVnb3JpemVkSXRlbVByb3ZpZGVyKCkgewotCQlpZiAodW5jYXRlZ29yaXplZEl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQl1bmNhdGVnb3JpemVkSXRlbVByb3ZpZGVyID0gbmV3IFVuY2F0ZWdvcml6ZWRJdGVtUHJvdmlkZXIoCi0JCQkJCWFkYXB0ZXJGYWN0b3J5LCBtZXRob2RDb25maWcsIHVuY2F0ZWdvcml6ZWRGaWx0ZXIsCi0JCQkJCXVuY2F0ZWdvcml6ZWRMYWJlbCwgdW5jYXRlZ29yaXplZEltYWdlKTsKLQkJfQotCQlyZXR1cm4gdW5jYXRlZ29yaXplZEl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0Q2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlbiA9PSBudWxsKSB7Ci0JCQljaGlsZHJlbiA9IG5ldyBBcnJheUxpc3QoKTsKLQkJfSBlbHNlIHsKLQkJCWNoaWxkcmVuLmNsZWFyKCk7Ci0JCX0KLQkJLy8gTWV0aG9kQ29uZmlndXJhdGlvbiBtZXRob2RDb25maWcgPSAoTWV0aG9kQ29uZmlndXJhdGlvbikgdGFyZ2V0OwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBtZXRob2RDb25maWcuZ2V0TWV0aG9kUGx1Z2luU2VsZWN0aW9uKCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gKE1ldGhvZFBsdWdpbikgaXRlci5uZXh0KCk7Ci0JCQlDb250ZW50UGFja2FnZSBwa2cgPSBVbWFVdGlsLmZpbmRDb250ZW50UGFja2FnZShwbHVnaW4sCi0JCQkJCWNhdGVnb3J5UGtnUGF0aCk7Ci0JCQlpZiAocGtnICE9IG51bGwgLyoKLQkJCQkJCQkgKiAmJgotCQkJCQkJCSAqIG1ldGhvZENvbmZpZy5nZXRNZXRob2RQYWNrYWdlU2VsZWN0aW9uKCkuY29udGFpbnMocGtnKQotCQkJCQkJCSAqLykgewotCQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBwa2cuZ2V0Q29udGVudEVsZW1lbnRzKCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IKLQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCUNvbnRlbnRDYXRlZ29yeSBlbGVtZW50ID0gKENvbnRlbnRDYXRlZ29yeSkgaXRlcmF0b3IubmV4dCgpOwotCQkJCQlpZiAoY2F0ZWdvcml6ZWRGaWx0ZXIuYWNjZXB0KGVsZW1lbnQpCi0JCQkJCQkJJiYgKGZpbHRlciAhPSBudWxsID8gZmlsdGVyLmFjY2VwdChlbGVtZW50KSA6IHRydWUpKSB7Ci0JCQkJCQljaGlsZHJlbi5hZGQoZWxlbWVudCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQkvLyBzZXQgcGFyZW50Ci0JCS8vCi0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGNoaWxkcmVuLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGFkYXB0ZXIgPSAoVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UpCi0JCQkJCS5nZXRDb25maWd1cmF0aW9uVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkuYWRhcHQoCi0JCQkJCQkJaXRlci5uZXh0KCksIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCQkvLyBPYmplY3QgYWRhcHRlciA9Ci0JCQkvLyAoVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UpLmdldEl0ZW1zRmlsdGVyX0FkYXB0ZXJGYWN0b3J5KGZpbHRlcikuYWRhcHQoaXRlci5uZXh0KCksCi0JCQkvLyBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkJaWYgKGFkYXB0ZXIgaW5zdGFuY2VvZiBJTGlicmFyeUl0ZW1Qcm92aWRlcikgewotCQkJCSgoSUxpYnJhcnlJdGVtUHJvdmlkZXIpIGFkYXB0ZXIpLnNldFBhcmVudCh0aGlzKTsKLQkJCX0KLQkJCS8vIFRoaXMgaXMgbmVlZCBmb3JjaW5nIHRvIHNldCB0aGUgSUNvbmZpZ3VyYXRvciB0byBDaGlsZHJlbnMKLQkJCWlmIChhZGFwdGVyIGluc3RhbmNlb2YgSUNvbmZpZ3VyYWJsZSkgewotCQkJCSgoSUNvbmZpZ3VyYWJsZSkgYWRhcHRlcikuc2V0RmlsdGVyKGZpbHRlcik7Ci0JCQl9Ci0JCX0KLQotCQlpZiAodW5jYXRlZ29yaXplZEZpbHRlciAhPSBudWxsKSB7Ci0JCQljaGlsZHJlbi5hZGQoY3JlYXRlVW5jYXRlZ29yaXplZEl0ZW1Qcm92aWRlcigpKTsKLQkJfQotCi0JCXJldHVybiBjaGlsZHJlbjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0TmV3Q2hpbGREZXNjcmlwdG9ycyhqYXZhLmxhbmcuT2JqZWN0LAotCSAqICAgICAgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW4sIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0TmV3Q2hpbGREZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0LAotCQkJRWRpdGluZ0RvbWFpbiBlZGl0aW5nRG9tYWluLCBPYmplY3Qgc2libGluZykgewotCQkvLyByZXR1cm4gc3VwZXIuZ2V0TmV3Q2hpbGREZXNjcmlwdG9ycyh0YXJnZXQsIGVkaXRpbmdEb21haW4sIHNpYmxpbmcpOwotCQlyZXR1cm4gc3VwZXIuZ2V0TmV3Q2hpbGREZXNjcmlwdG9ycyhtZXRob2RDb25maWcsIGVkaXRpbmdEb21haW4sCi0JCQkJc2libGluZyk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldFBhcmVudChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKHBhcmVudCAhPSBudWxsKQotCQkJcmV0dXJuIHBhcmVudDsKLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIEVPYmplY3QpIHsKLQkJCXJldHVybiBzdXBlci5nZXRQYXJlbnQob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0SW1hZ2UoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIGltYWdlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRUZXh0KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGxhYmVsICE9IG51bGwpCi0JCQlyZXR1cm4gbGFiZWw7Ci0JCXJldHVybiBzdXBlci5nZXRUZXh0KG9iamVjdCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhYmxlI3NldEZpbHRlcihjb20uaWJtLmxpYnJhcnkuZWRpdC5JRmlsdGVyKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZpbHRlcihJRmlsdGVyIGZpbHRlcikgewotCQl0aGlzLmZpbHRlciA9IGZpbHRlcjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDYXRlZ29yaXplZEZpbHRlcihJRmlsdGVyIGZpbHRlcikgewotCQljYXRlZ29yaXplZEZpbHRlciA9IGZpbHRlcjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRVbmNhdGVnb3JpemVkRmlsdGVyKElGaWx0ZXIgZmlsdGVyKSB7Ci0JCXVuY2F0ZWdvcml6ZWRGaWx0ZXIgPSBmaWx0ZXI7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VW5jYXRlZ29yaXplZExhYmVsKFN0cmluZyBsYWJlbCkgewotCQl1bmNhdGVnb3JpemVkTGFiZWwgPSBsYWJlbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRVbmNhdGVnb3JpemVkSW1hZ2UoT2JqZWN0IGltZykgewotCQl1bmNhdGVnb3JpemVkSW1hZ2UgPSBpbWc7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhYmxlI3NldExhYmVsKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGFiZWwoU3RyaW5nIGxhYmVsKSB7Ci0JCXRoaXMubGFiZWwgPSBsYWJlbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LklDb25maWd1cmFibGUjc2V0UGFyZW50KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgc2V0UGFyZW50KE9iamVjdCBwYXJlbnQpIHsKLQkJdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldENoaWxkcmVuRmVhdHVyZXMoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbkZlYXR1cmVzKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIHN1cGVyLmdldENoaWxkcmVuRmVhdHVyZXMob2JqZWN0KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJaWYgKHVuY2F0ZWdvcml6ZWRJdGVtUHJvdmlkZXIgIT0gbnVsbCkgewotCQkJdW5jYXRlZ29yaXplZEl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7Ci0JCX0KLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29uZmlndXJhdGlvbi9DYXRlZ29yaXplZFByb2Nlc3Nlc0l0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb25maWd1cmF0aW9uL0NhdGVnb3JpemVkUHJvY2Vzc2VzSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiN2E2ZTAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb25maWd1cmF0aW9uL0NhdGVnb3JpemVkUHJvY2Vzc2VzSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb25maWd1cmF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklMaWJyYXJ5SXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Qcm9jZXNzVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5VbWFVdGlsOwotCi0vKioKLSAqIFRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIHRoZSAiQ2FwYWJpbGl0eSBQYXR0ZXJucyIgYW5kICJEZWxpdmVyeQotICogUHJvY2Vzc2VzIiBmb2xkZXJzIGluIHRoZSBDb25maWd1cmF0aW9uIHZpZXcuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIENhdGVnb3JpemVkUHJvY2Vzc2VzSXRlbVByb3ZpZGVyIGV4dGVuZHMgSXRlbVByb3ZpZGVyQWRhcHRlcgotCQlpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlLAotCQlJQ29uZmlndXJhYmxlLCBJTGlicmFyeUl0ZW1Qcm92aWRlciB7Ci0KLQlMaXN0IGNoaWxkcmVuOwotCi0JcHJpdmF0ZSBTdHJpbmcgbGFiZWw7Ci0KLQlwcml2YXRlIE9iamVjdCBwYXJlbnQ7Ci0KLQlwcml2YXRlIFN0cmluZ1tdIHBrZ1BhdGg7Ci0KLQlwcml2YXRlIElGaWx0ZXIgZmlsdGVyOwotCi0JcHJpdmF0ZSBPYmplY3QgaW1hZ2U7Ci0KLQlwcml2YXRlIE1ldGhvZENvbmZpZ3VyYXRpb24gbWV0aG9kQ29uZmlnOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgQ2F0ZWdvcml6ZWRQcm9jZXNzZXNJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksCi0JCQlNZXRob2RDb25maWd1cmF0aW9uIG1ldGhvZENvbmZpZywgU3RyaW5nIG5hbWUsIE9iamVjdCBpbWFnZSwKLQkJCVN0cmluZ1tdIHBrZ1BhdGgpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCQl0aGlzLm1ldGhvZENvbmZpZyA9IG1ldGhvZENvbmZpZzsKLQkJbGFiZWwgPSBuYW1lOwotCQl0aGlzLnBrZ1BhdGggPSBwa2dQYXRoOwotCQl0aGlzLmltYWdlID0gaW1hZ2U7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldENoaWxkcmVuKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlpZiAoY2hpbGRyZW4gPT0gbnVsbCkgewotCQkJY2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCX0gZWxzZSB7Ci0JCQljaGlsZHJlbi5jbGVhcigpOwotCQl9Ci0JCUFycmF5TGlzdCBwcm9jUGtncyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gbWV0aG9kQ29uZmlnLmdldE1ldGhvZFBsdWdpblNlbGVjdGlvbigpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkuaGFzTmV4dCgpOykgewotCQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IChNZXRob2RQbHVnaW4pIGl0ZXIubmV4dCgpOwotCQkJTWV0aG9kUGFja2FnZSBwa2cgPSBVbWFVdGlsLmZpbmRNZXRob2RQYWNrYWdlKHBsdWdpbiwgcGtnUGF0aCk7Ci0JCQlpZiAocGtnICE9IG51bGwKLQkJCQkJJiYgbWV0aG9kQ29uZmlnLmdldE1ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKS5jb250YWlucyhwa2cpKSB7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IHBrZy5nZXRDaGlsZFBhY2thZ2VzKCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IKLQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCU9iamVjdCBlbGVtZW50ID0gaXRlcmF0b3IubmV4dCgpOwotCQkJCQlQcm9jZXNzUGFja2FnZUl0ZW1Qcm92aWRlci5jb2xsZWN0Q2hpbGRyZW4oY2hpbGRyZW4sCi0JCQkJCQkJZWxlbWVudCwgZmlsdGVyKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlpZiAoIXByb2NQa2dzLmlzRW1wdHkoKSkgewotCQkJY2hpbGRyZW4uYWRkQWxsKDAsIHByb2NQa2dzKTsKLQotCQkJLy8gVE9ETzogc29ydCBhbHBoYWJldGljYWxseSwgcHJvY2VzcyBwYWNrYWdlcyBiZWZvcmUgcHJvY2Vzc2VzCi0JCX0KLQotCQkvLyBzZXQgcGFyZW50Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGNoaWxkcmVuLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGNoaWxkID0gaXRlci5uZXh0KCk7Ci0JCQlQcm9jZXNzVXRpbC5zZXRQYXJlbnQoY2hpbGQsIG9iamVjdCwgYWRhcHRlckZhY3RvcnkpOwotCQl9Ci0KLQkJcmV0dXJuIGNoaWxkcmVuOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXROZXdDaGlsZERlc2NyaXB0b3JzKGphdmEubGFuZy5PYmplY3QsCi0JICogICAgICBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbiwgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXROZXdDaGlsZERlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QsCi0JCQlFZGl0aW5nRG9tYWluIGVkaXRpbmdEb21haW4sIE9iamVjdCBzaWJsaW5nKSB7Ci0JCXJldHVybiBzdXBlci5nZXROZXdDaGlsZERlc2NyaXB0b3JzKG1ldGhvZENvbmZpZywgZWRpdGluZ0RvbWFpbiwKLQkJCQlzaWJsaW5nKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0UGFyZW50KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IG9iamVjdCkgewotCQlpZiAocGFyZW50ICE9IG51bGwpCi0JCQlyZXR1cm4gcGFyZW50OwotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgRU9iamVjdCkgewotCQkJcmV0dXJuIHN1cGVyLmdldFBhcmVudChvYmplY3QpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRJbWFnZShqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gaW1hZ2U7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldFRleHQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlpZiAobGFiZWwgIT0gbnVsbCkKLQkJCXJldHVybiBsYWJlbDsKLQkJcmV0dXJuIHN1cGVyLmdldFRleHQob2JqZWN0KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LklDb25maWd1cmFibGUjc2V0RmlsdGVyKGNvbS5pYm0ubGlicmFyeS5lZGl0LklGaWx0ZXIpCi0JICovCi0JcHVibGljIHZvaWQgc2V0RmlsdGVyKElGaWx0ZXIgZmlsdGVyKSB7Ci0JCXRoaXMuZmlsdGVyID0gZmlsdGVyOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYWJsZSNzZXRMYWJlbChqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldExhYmVsKFN0cmluZyBsYWJlbCkgewotCQl0aGlzLmxhYmVsID0gbGFiZWw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhYmxlI3NldFBhcmVudChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBhcmVudChPYmplY3QgcGFyZW50KSB7Ci0JCXRoaXMucGFyZW50ID0gcGFyZW50OwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRDaGlsZHJlbkZlYXR1cmVzKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5GZWF0dXJlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBzdXBlci5nZXRDaGlsZHJlbkZlYXR1cmVzKG9iamVjdCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbmZpZ3VyYXRpb24vQ3VzdG9tQ2F0ZWdvcmllc0l0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb25maWd1cmF0aW9uL0N1c3RvbUNhdGVnb3JpZXNJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTk2YWYyMy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbmZpZ3VyYXRpb24vQ3VzdG9tQ2F0ZWdvcmllc0l0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb25maWd1cmF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JTGlicmFyeUl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DdXN0b21DYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci0KLS8qKgotICogVGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgdGhlICJDdXN0b20gQ2F0ZWdvcmllcyIgZm9sZGVyIGluIHRoZQotICogQ29uZmlndXJhdGlvbiB2aWV3LgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBDdXN0b21DYXRlZ29yaWVzSXRlbVByb3ZpZGVyIGV4dGVuZHMgQ2F0ZWdvcmllc0l0ZW1Qcm92aWRlciB7Ci0KLQlwdWJsaWMgQ3VzdG9tQ2F0ZWdvcmllc0l0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwKLQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gbWV0aG9kQ29uZmlnLCBTdHJpbmcgbmFtZSwgT2JqZWN0IGltYWdlLAotCQkJU3RyaW5nW10gY2F0ZWdvcnlQa2dQYXRoKSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5LCBtZXRob2RDb25maWcsIG5hbWUsIGltYWdlLCBjYXRlZ29yeVBrZ1BhdGgpOwotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGNoaWxkcmVuID09IG51bGwpIHsKLQkJCWNoaWxkcmVuID0gbmV3IEFycmF5TGlzdCgpOwotCQl9IGVsc2UgewotCQkJY2hpbGRyZW4uY2xlYXIoKTsKLQkJfQotCQkvLyBNZXRob2RDb25maWd1cmF0aW9uIG1ldGhvZENvbmZpZyA9IChNZXRob2RDb25maWd1cmF0aW9uKSB0YXJnZXQ7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IG1ldGhvZENvbmZpZy5nZXRNZXRob2RQbHVnaW5TZWxlY3Rpb24oKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSAoTWV0aG9kUGx1Z2luKSBpdGVyLm5leHQoKTsKLQkJCUNvbnRlbnRQYWNrYWdlIHBrZyA9IFVtYVV0aWwuZmluZENvbnRlbnRQYWNrYWdlKHBsdWdpbiwKLQkJCQkJY2F0ZWdvcnlQa2dQYXRoKTsKLQkJCUN1c3RvbUNhdGVnb3J5IHJvb3QgPSBUbmdVdGlsLmdldFJvb3RDdXN0b21DYXRlZ29yeShwbHVnaW4pOwotCQkJaWYgKHJvb3QgIT0gbnVsbCAmJiBwa2cgIT0gbnVsbAotCQkJCQkmJiBtZXRob2RDb25maWcuZ2V0TWV0aG9kUGFja2FnZVNlbGVjdGlvbigpLmNvbnRhaW5zKHBrZykpIHsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gcm9vdC5nZXRDYXRlZ29yaXplZEVsZW1lbnRzKCkKLQkJCQkJCS5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJCU9iamVjdCBlbGVtZW50ID0gaXRlcmF0b3IubmV4dCgpOwotCQkJCQlpZiAoZmlsdGVyICE9IG51bGwgPyBmaWx0ZXIuYWNjZXB0KGVsZW1lbnQpIDogdHJ1ZSkgewotCQkJCQkJY2hpbGRyZW4uYWRkKGVsZW1lbnQpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJLy8gc2V0IHBhcmVudAotCQkvLwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjaGlsZHJlbi5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBhZGFwdGVyID0gKFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFKQotCQkJCQkuZ2V0Q29uZmlndXJhdGlvblZpZXdfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpLmFkYXB0KAotCQkJCQkJCWl0ZXIubmV4dCgpLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkJaWYgKGFkYXB0ZXIgaW5zdGFuY2VvZiBJTGlicmFyeUl0ZW1Qcm92aWRlcikgewotCQkJCSgoSUxpYnJhcnlJdGVtUHJvdmlkZXIpIGFkYXB0ZXIpLnNldFBhcmVudCh0aGlzKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBjaGlsZHJlbjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29uZmlndXJhdGlvbi9EaXNjaXBsaW5lR3JvdXBpbmdJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29uZmlndXJhdGlvbi9EaXNjaXBsaW5lR3JvdXBpbmdJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTE5N2QyNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbmZpZ3VyYXRpb24vRGlzY2lwbGluZUdyb3VwaW5nSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb25maWd1cmF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklDb25maWd1cmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUxpYnJhcnlJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNhdGVnb3J5LkRpc2NpcGxpbmVDYXRlZ29yeUl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuTW9kZWxTdHJ1Y3R1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaXNjaXBsaW5lR3JvdXBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiBUaGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIGRpc2NpcGxpbmUgZ3JvdXBpbmcgaW4gdGhlIENvbmZpZ3VyYXRpb24KLSAqIHZpZXcuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIERpc2NpcGxpbmVHcm91cGluZ0l0ZW1Qcm92aWRlciBleHRlbmRzCi0JCURpc2NpcGxpbmVDYXRlZ29yeUl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzIElDb25maWd1cmFibGUgewotCi0JcHJpdmF0ZSBJQ29uZmlndXJhdG9yIGNvbmZpZ3VyYXRvcjsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIERpc2NpcGxpbmVHcm91cGluZ0l0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5jYXRlZ29yeS5EaXNjaXBsaW5lQ2F0ZWdvcnlJdGVtUHJvdmlkZXIjZ2V0UGFyZW50KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gcGFyZW50OwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuY2F0ZWdvcnkuRGlzY2lwbGluZUNhdGVnb3J5SXRlbVByb3ZpZGVyI2dldENoaWxkcmVuKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlDb2xsZWN0aW9uIGNoaWxkcmVuOwotCi0JCS8vIFRPRE86IGNvbW1lbnRlZCBvdXQgdW50aWwgSmluaHVhIGZpeGVkIGJ1Z3MgaW4gQ29uZmlndXJhdGlvbkZpbHRlcgotCQlpZiAoY29uZmlndXJhdG9yICE9IG51bGwpIHsKLQkJCWNoaWxkcmVuID0gY29uZmlndXJhdG9yLmdldENoaWxkcmVuKG9iamVjdCwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJLmdldERpc2NpcGxpbmVHcm91cGluZ19EaXNjaXBsaW5lcygpKTsKLQkJCWlmIChjaGlsZHJlbiAhPSBudWxsKSB7Ci0JCQkJU3lzdGVtLm91dAotCQkJCQkJLnByaW50bG4oIkRpc2NpcGxpbmVHcm91cGluZ0l0ZW1Qcm92aWRlci5nZXRDaGlsZHJlbigpOiByZXR1cm5lZCBmcm9tIGNvbmZpZ3VyYXRvcjogIiArIGNoaWxkcmVuKTsgLy8kTk9OLU5MUy0xJAotCQkJCXJldHVybiBjaGlsZHJlbjsKLQkJCX0KLQkJfQotCi0JCWNoaWxkcmVuID0gc3VwZXIuZ2V0Q2hpbGRyZW4ob2JqZWN0KTsKLQkJRGlzY2lwbGluZUdyb3VwaW5nIGdyb3VwaW5nID0gKERpc2NpcGxpbmVHcm91cGluZykgb2JqZWN0OwotCQlNZXRob2RDb25maWd1cmF0aW9uIG1ldGhvZENvbmYgPSAoTWV0aG9kQ29uZmlndXJhdGlvbikgKChDYXRlZ29yaWVzSXRlbVByb3ZpZGVyKSBnZXRQYXJlbnQob2JqZWN0KSkKLQkJCQkuZ2V0VGFyZ2V0KCk7Ci0JCVRuZ1V0aWwuYWRkRXh0ZW5kZWRDaGlsZHJlbihncm91cGluZywgbWV0aG9kQ29uZiwgY2hpbGRyZW4sCi0JCQkJTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC5kaXNjaXBsaW5lRGVmaW5pdGlvblBhdGgpOwotCi0JCS8vIHNldCBwYXJlbnQKLQkJLy8KLQkJZm9yIChJdGVyYXRvciBpdGVyID0gY2hpbGRyZW4uaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgYWRhcHRlciA9IChUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRSkKLQkJCQkJLmdldENvbmZpZ3VyYXRpb25WaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKS5hZGFwdCgKLQkJCQkJCQlpdGVyLm5leHQoKSwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCWlmIChhZGFwdGVyIGluc3RhbmNlb2YgSUxpYnJhcnlJdGVtUHJvdmlkZXIpIHsKLQkJCQkoKElMaWJyYXJ5SXRlbVByb3ZpZGVyKSBhZGFwdGVyKS5zZXRQYXJlbnQodGhpcyk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gY2hpbGRyZW47Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhYmxlI3NldEZpbHRlcihjb20uaWJtLmxpYnJhcnkuZWRpdC5JRmlsdGVyKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZpbHRlcihJRmlsdGVyIGZpbHRlcikgewotCQlpZiAoZmlsdGVyIGluc3RhbmNlb2YgSUNvbmZpZ3VyYXRvcikgewotCQkJY29uZmlndXJhdG9yID0gKElDb25maWd1cmF0b3IpIGZpbHRlcjsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYWJsZSNzZXRMYWJlbChqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldExhYmVsKFN0cmluZyBsYWJlbCkgewotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb25maWd1cmF0aW9uL0Rpc2NpcGxpbmVJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29uZmlndXJhdGlvbi9EaXNjaXBsaW5lSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5ZjA5OGMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb25maWd1cmF0aW9uL0Rpc2NpcGxpbmVJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29uZmlndXJhdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogVGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSBkaXNjaXBsaW5lIGluIHRoZSBDb25maWd1cmF0aW9uIHZpZXcuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIERpc2NpcGxpbmVJdGVtUHJvdmlkZXIgZXh0ZW5kcwotCQlvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNhdGVnb3J5LkRpc2NpcGxpbmVJdGVtUHJvdmlkZXIgewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgRGlzY2lwbGluZUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5jYXRlZ29yeS5EaXNjaXBsaW5lSXRlbVByb3ZpZGVyI2dldENoaWxkcmVuRmVhdHVyZXMoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbkZlYXR1cmVzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGNoaWxkcmVuRmVhdHVyZXMgPT0gbnVsbCkgewotCQkJY2hpbGRyZW5GZWF0dXJlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWNoaWxkcmVuRmVhdHVyZXMuYWRkKFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldERpc2NpcGxpbmVfVGFza3MoKSk7Ci0JCQljaGlsZHJlbkZlYXR1cmVzLmFkZChVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkuZ2V0RGlzY2lwbGluZV9TdWJkaXNjaXBsaW5lKCkpOwotCQl9Ci0JCXJldHVybiBjaGlsZHJlbkZlYXR1cmVzOwotCi0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbmZpZ3VyYXRpb24vRG9tYWluSXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbmZpZ3VyYXRpb24vRG9tYWluSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2ZjI2YmIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb25maWd1cmF0aW9uL0RvbWFpbkl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb25maWd1cmF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiBUaGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIGRvbWFpbiBpbiB0aGUgQ29uZmlndXJhdGlvbiB2aWV3LgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBEb21haW5JdGVtUHJvdmlkZXIgZXh0ZW5kcwotCQlvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNhdGVnb3J5LkRvbWFpbkl0ZW1Qcm92aWRlciB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBEb21haW5JdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuRmVhdHVyZXMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoY2hpbGRyZW5GZWF0dXJlcyA9PSBudWxsKSB7Ci0JCQljaGlsZHJlbkZlYXR1cmVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJY2hpbGRyZW5GZWF0dXJlcy5hZGQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RG9tYWluX1N1YmRvbWFpbnMoKSk7Ci0JCQljaGlsZHJlbkZlYXR1cmVzLmFkZChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXREb21haW5fV29ya1Byb2R1Y3RzKCkpOwotCQl9Ci0JCXJldHVybiBjaGlsZHJlbkZlYXR1cmVzOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29uZmlndXJhdGlvbi9HdWlkYW5jZUdyb3VwaW5nSXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbmZpZ3VyYXRpb24vR3VpZGFuY2VHcm91cGluZ0l0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MjNlZDBhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29uZmlndXJhdGlvbi9HdWlkYW5jZUdyb3VwaW5nSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOTYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb25maWd1cmF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklHcm91cENvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuZWxlbWVudC5JRWxlbWVudEl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNoZWNrbGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbmNlcHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5FeGFtcGxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3VpZGVsaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByYWN0aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUmVwb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUmV1c2FibGVBc3NldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvYWRtYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5TdXBwb3J0aW5nTWF0ZXJpYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZW1wbGF0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRlcm1EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVG9vbE1lbnRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldoaXRlcGFwZXI7Ci0KLS8qKgotICogVGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgdGhlIGd1aWRhbmNlIGZvbGRlcnMuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEd1aWRhbmNlR3JvdXBpbmdJdGVtUHJvdmlkZXIgZXh0ZW5kcyBJdGVtUHJvdmlkZXJBZGFwdGVyIGltcGxlbWVudHMKLQkJSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UsCi0JCUlFbGVtZW50SXRlbVByb3ZpZGVyLCBJR3JvdXBDb250YWluZXIsIElDb25maWd1cmFibGUgewotCi0JcHJpdmF0ZSBNYXAgZ3JvdXBJdGVtUHJvdmlkZXJNYXA7Ci0KLQlwcm90ZWN0ZWQgQXJyYXlMaXN0IGNoaWxkcmVuOwotCi0JcHJpdmF0ZSBNZXRob2RDb25maWd1cmF0aW9uIG1ldGhvZENvbmZpZzsKLQotCXByaXZhdGUgSUZpbHRlciBmaWx0ZXI7Ci0KLQkvKioKLQkgKiBBIG1hcCBvZiBFQ2xhc3MgLyBJdGVtUHJvdmlkZXJBZGFwdGVyIGZvciBlYWNoIHR5cGUgb2YgZ3VpZGFuY2UKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBJRmlsdGVyIGNoZWNrTGlzdEZpbHRlciA9IG5ldyBJRmlsdGVyKCkgewotCQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoT2JqZWN0IG9iaikgewotCQkJcmV0dXJuIG9iaiBpbnN0YW5jZW9mIENoZWNrbGlzdDsKLQkJfQotCX07Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBJRmlsdGVyIGNvbmNlcHRGaWx0ZXIgPSBuZXcgSUZpbHRlcigpIHsKLQkJcHVibGljIGJvb2xlYW4gYWNjZXB0KE9iamVjdCBvYmopIHsKLQkJCXJldHVybiAoKG9iaiBpbnN0YW5jZW9mIENvbmNlcHQpICYmICghKG9iaiBpbnN0YW5jZW9mIFdoaXRlcGFwZXIpKSk7Ci0JCX0KLQl9OwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSUZpbHRlciBleGFtcGxlRmlsdGVyID0gbmV3IElGaWx0ZXIoKSB7Ci0JCXB1YmxpYyBib29sZWFuIGFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCQlyZXR1cm4gb2JqIGluc3RhbmNlb2YgRXhhbXBsZTsKLQkJfQotCX07Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBJRmlsdGVyIHByYWN0aWNlRmlsdGVyID0gbmV3IElGaWx0ZXIoKSB7Ci0JCXB1YmxpYyBib29sZWFuIGFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCQlyZXR1cm4gb2JqIGluc3RhbmNlb2YgUHJhY3RpY2U7Ci0JCX0KLQl9OwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSUZpbHRlciByZXBvcnRGaWx0ZXIgPSBuZXcgSUZpbHRlcigpIHsKLQkJcHVibGljIGJvb2xlYW4gYWNjZXB0KE9iamVjdCBvYmopIHsKLQkJCXJldHVybiBvYmogaW5zdGFuY2VvZiBSZXBvcnQ7Ci0JCX0KLQl9OwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSUZpbHRlciByZXVzYWJsZUFzc2V0RmlsdGVyID0gbmV3IElGaWx0ZXIoKSB7Ci0JCXB1YmxpYyBib29sZWFuIGFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCQlyZXR1cm4gb2JqIGluc3RhbmNlb2YgUmV1c2FibGVBc3NldDsKLQkJfQotCX07Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBJRmlsdGVyIHJvYWRtYXBGaWx0ZXIgPSBuZXcgSUZpbHRlcigpIHsKLQkJcHVibGljIGJvb2xlYW4gYWNjZXB0KE9iamVjdCBvYmopIHsKLQkJCXJldHVybiBvYmogaW5zdGFuY2VvZiBSb2FkbWFwOwotCQl9Ci0JfTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIElGaWx0ZXIgc3VwcG9ydGluZ01hdGVyaWFsRmlsdGVyID0gbmV3IElGaWx0ZXIoKSB7Ci0JCXB1YmxpYyBib29sZWFuIGFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCQlyZXR1cm4gb2JqIGluc3RhbmNlb2YgU3VwcG9ydGluZ01hdGVyaWFsOwotCQl9Ci0JfTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIElGaWx0ZXIgZ3VpZGVsaW5lRmlsdGVyID0gbmV3IElGaWx0ZXIoKSB7Ci0JCXB1YmxpYyBib29sZWFuIGFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCQlyZXR1cm4gb2JqIGluc3RhbmNlb2YgR3VpZGVsaW5lOwotCQl9Ci0JfTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIElGaWx0ZXIgdGVtcGxhdGVGaWx0ZXIgPSBuZXcgSUZpbHRlcigpIHsKLQkJcHVibGljIGJvb2xlYW4gYWNjZXB0KE9iamVjdCBvYmopIHsKLQkJCXJldHVybiBvYmogaW5zdGFuY2VvZiBUZW1wbGF0ZTsKLQkJfQotCX07Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBJRmlsdGVyIHRlcm1EZWZpbml0aW9uRmlsdGVyID0gbmV3IElGaWx0ZXIoKSB7Ci0JCXB1YmxpYyBib29sZWFuIGFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCQlyZXR1cm4gb2JqIGluc3RhbmNlb2YgVGVybURlZmluaXRpb247Ci0JCX0KLQl9OwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSUZpbHRlciB0b29sTWVudG9yRmlsdGVyID0gbmV3IElGaWx0ZXIoKSB7Ci0JCXB1YmxpYyBib29sZWFuIGFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCQlyZXR1cm4gb2JqIGluc3RhbmNlb2YgVG9vbE1lbnRvcjsKLQkJfQotCX07Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBJRmlsdGVyIHdoaXRlUGFwZXJGaWx0ZXIgPSBuZXcgSUZpbHRlcigpIHsKLQkJcHVibGljIGJvb2xlYW4gYWNjZXB0KE9iamVjdCBvYmopIHsKLQkJCXJldHVybiBvYmogaW5zdGFuY2VvZiBXaGl0ZXBhcGVyOwotCQl9Ci0JfTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIElGaWx0ZXIgZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zRmlsdGVyID0gbmV3IElGaWx0ZXIoKSB7Ci0JCXB1YmxpYyBib29sZWFuIGFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCQlyZXR1cm4gb2JqIGluc3RhbmNlb2YgRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zOwotCQl9Ci0JfTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIEd1aWRhbmNlR3JvdXBpbmdJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksCi0JCQlNZXRob2RDb25maWd1cmF0aW9uIG1ldGhvZENvbmZpZykgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JCXRoaXMubWV0aG9kQ29uZmlnID0gbWV0aG9kQ29uZmlnOwotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGNoaWxkcmVuID09IG51bGwpIHsKLQkJCWNoaWxkcmVuID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCQlncm91cEl0ZW1Qcm92aWRlck1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0KLQkJCS8vIGNoZWNrbGlzdAotCQkJT2JqZWN0IGltYWdlID0gTGlicmFyeUVkaXRQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0SW1hZ2UoCi0JCQkJCSJmdWxsL29iajE2L0NoZWNrbGlzdHMiKTsgLy8kTk9OLU5MUy0xJAotCQkJU3RyaW5nIG5hbWUgPSBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkuZ2V0U3RyaW5nKCJfVUlfR3VpZGFuY2VzX0NoZWNrbGlzdHMiKTsgLy8kTk9OLU5MUy0xJAotCQkJR3VpZGFuY2VJdGVtUHJvdmlkZXIgY2hpbGQgPSBuZXcgR3VpZGFuY2VJdGVtUHJvdmlkZXIoCi0JCQkJCWFkYXB0ZXJGYWN0b3J5LCBtZXRob2RDb25maWcsIG5hbWUsIGltYWdlKTsKLQkJCWNoaWxkLnNldEd1aWRhbmNlRmlsdGVyKGNoZWNrTGlzdEZpbHRlcik7Ci0JCQljaGlsZHJlbi5hZGQoY2hpbGQpOwotCQkJZ3JvdXBJdGVtUHJvdmlkZXJNYXAucHV0KG5hbWUsIGNoaWxkKTsKLQotCQkJLy8gY29uY2VwdAotCQkJaW1hZ2UgPSBMaWJyYXJ5RWRpdFBsdWdpbi5nZXRQbHVnaW4oKS5nZXRJbWFnZSgKLQkJCQkJImZ1bGwvb2JqMTYvQ29uY2VwdHMiKTsgLy8kTk9OLU5MUy0xJAotCQkJbmFtZSA9IExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCS5nZXRTdHJpbmcoIl9VSV9HdWlkYW5jZXNfQ29uY2VwdHMiKTsgLy8kTk9OLU5MUy0xJAotCQkJY2hpbGQgPSBuZXcgR3VpZGFuY2VJdGVtUHJvdmlkZXIoYWRhcHRlckZhY3RvcnksIG1ldGhvZENvbmZpZywKLQkJCQkJbmFtZSwgaW1hZ2UpOwotCQkJY2hpbGQuc2V0R3VpZGFuY2VGaWx0ZXIoY29uY2VwdEZpbHRlcik7Ci0JCQljaGlsZHJlbi5hZGQoY2hpbGQpOwotCQkJZ3JvdXBJdGVtUHJvdmlkZXJNYXAucHV0KG5hbWUsIGNoaWxkKTsKLQotCQkJLy8gZXN0aW1hdGlvbiBDb25zaWRlcmF0aW9ucwotCQkJaW1hZ2UgPSBMaWJyYXJ5RWRpdFBsdWdpbi5nZXRQbHVnaW4oKS5nZXRJbWFnZSgKLQkJCQkJImZ1bGwvb2JqMTYvRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIik7IC8vJE5PTi1OTFMtMSQKLQkJCW5hbWUgPSBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkuZ2V0U3RyaW5nKCJfVUlfR3VpZGFuY2VzX0VzdGltYXRpb25Db25zaWRlcmF0aW9ucyIpOyAvLyROT04tTkxTLTEkCi0JCQljaGlsZCA9IG5ldyBHdWlkYW5jZUl0ZW1Qcm92aWRlcihhZGFwdGVyRmFjdG9yeSwgbWV0aG9kQ29uZmlnLAotCQkJCQluYW1lLCBpbWFnZSk7Ci0JCQljaGlsZC5zZXRHdWlkYW5jZUZpbHRlcihlc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnNGaWx0ZXIpOwotCQkJY2hpbGRyZW4uYWRkKGNoaWxkKTsKLQkJCWdyb3VwSXRlbVByb3ZpZGVyTWFwLnB1dChuYW1lLCBjaGlsZCk7Ci0KLQkJCS8vIGV4YW1wbGUKLQkJCWltYWdlID0gTGlicmFyeUVkaXRQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0SW1hZ2UoCi0JCQkJCSJmdWxsL29iajE2L0V4YW1wbGVzIik7IC8vJE5PTi1OTFMtMSQKLQkJCW5hbWUgPSBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkuZ2V0U3RyaW5nKCJfVUlfR3VpZGFuY2VzX0V4YW1wbGVzIik7IC8vJE5PTi1OTFMtMSQKLQkJCWNoaWxkID0gbmV3IEd1aWRhbmNlSXRlbVByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5LCBtZXRob2RDb25maWcsCi0JCQkJCW5hbWUsIGltYWdlKTsKLQkJCWNoaWxkLnNldEd1aWRhbmNlRmlsdGVyKGV4YW1wbGVGaWx0ZXIpOwotCQkJY2hpbGRyZW4uYWRkKGNoaWxkKTsKLQkJCWdyb3VwSXRlbVByb3ZpZGVyTWFwLnB1dChuYW1lLCBjaGlsZCk7Ci0KLQkJCS8vIHByYWN0aWNlCi0JCQlpbWFnZSA9IExpYnJhcnlFZGl0UGx1Z2luLmdldFBsdWdpbigpLmdldEltYWdlKAotCQkJCQkiZnVsbC9vYmoxNi9QcmFjdGljZXMiKTsgLy8kTk9OLU5MUy0xJAotCQkJbmFtZSA9IExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCS5nZXRTdHJpbmcoIl9VSV9HdWlkYW5jZXNfUHJhY3RpY2VzIik7IC8vJE5PTi1OTFMtMSQKLQkJCWNoaWxkID0gbmV3IEd1aWRhbmNlSXRlbVByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5LCBtZXRob2RDb25maWcsCi0JCQkJCW5hbWUsIGltYWdlKTsKLQkJCWNoaWxkLnNldEd1aWRhbmNlRmlsdGVyKHByYWN0aWNlRmlsdGVyKTsKLQkJCWNoaWxkcmVuLmFkZChjaGlsZCk7Ci0JCQlncm91cEl0ZW1Qcm92aWRlck1hcC5wdXQobmFtZSwgY2hpbGQpOwotCi0JCQkvLyBSZXBvcnQKLQkJCWltYWdlID0gTGlicmFyeUVkaXRQbHVnaW4uZ2V0UGx1Z2luKCkKLQkJCQkJLmdldEltYWdlKCJmdWxsL29iajE2L1JlcG9ydHMiKTsgLy8kTk9OLU5MUy0xJAotCQkJbmFtZSA9IExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCS5nZXRTdHJpbmcoIl9VSV9HdWlkYW5jZXNfUmVwb3J0cyIpOyAvLyROT04tTkxTLTEkCi0JCQljaGlsZCA9IG5ldyBHdWlkYW5jZUl0ZW1Qcm92aWRlcihhZGFwdGVyRmFjdG9yeSwgbWV0aG9kQ29uZmlnLAotCQkJCQluYW1lLCBpbWFnZSk7Ci0JCQljaGlsZC5zZXRHdWlkYW5jZUZpbHRlcihyZXBvcnRGaWx0ZXIpOwotCQkJY2hpbGRyZW4uYWRkKGNoaWxkKTsKLQkJCWdyb3VwSXRlbVByb3ZpZGVyTWFwLnB1dChuYW1lLCBjaGlsZCk7Ci0KLQkJCS8vIFJldXNhYmxlIEFzc2V0Ci0JCQlpbWFnZSA9IExpYnJhcnlFZGl0UGx1Z2luLmdldFBsdWdpbigpLmdldEltYWdlKAotCQkJCQkiZnVsbC9vYmoxNi9SZXVzYWJsZUFzc2V0cyIpOyAvLyROT04tTkxTLTEkCi0JCQluYW1lID0gTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJLmdldFN0cmluZygiX1VJX0d1aWRhbmNlc19SZXVzYWJsZUFzc2V0cyIpOyAvLyROT04tTkxTLTEkCi0JCQljaGlsZCA9IG5ldyBHdWlkYW5jZUl0ZW1Qcm92aWRlcihhZGFwdGVyRmFjdG9yeSwgbWV0aG9kQ29uZmlnLAotCQkJCQluYW1lLCBpbWFnZSk7Ci0JCQljaGlsZC5zZXRHdWlkYW5jZUZpbHRlcihyZXVzYWJsZUFzc2V0RmlsdGVyKTsKLQkJCWNoaWxkcmVuLmFkZChjaGlsZCk7Ci0JCQlncm91cEl0ZW1Qcm92aWRlck1hcC5wdXQobmFtZSwgY2hpbGQpOwotCi0JCQkvLyBSZXVzYWJsZSBBc3NldAotCQkJaW1hZ2UgPSBMaWJyYXJ5RWRpdFBsdWdpbi5nZXRQbHVnaW4oKS5nZXRJbWFnZSgKLQkJCQkJImZ1bGwvb2JqMTYvUm9hZG1hcHMiKTsgLy8kTk9OLU5MUy0xJAotCQkJbmFtZSA9IExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCS5nZXRTdHJpbmcoIl9VSV9HdWlkYW5jZXNfUm9hZG1hcCIpOyAvLyROT04tTkxTLTEkCi0JCQljaGlsZCA9IG5ldyBHdWlkYW5jZUl0ZW1Qcm92aWRlcihhZGFwdGVyRmFjdG9yeSwgbWV0aG9kQ29uZmlnLAotCQkJCQluYW1lLCBpbWFnZSk7Ci0JCQljaGlsZC5zZXRHdWlkYW5jZUZpbHRlcihyb2FkbWFwRmlsdGVyKTsKLQkJCWNoaWxkcmVuLmFkZChjaGlsZCk7Ci0JCQlncm91cEl0ZW1Qcm92aWRlck1hcC5wdXQobmFtZSwgY2hpbGQpOwotCi0JCQkvLyBTdXBwb3J0aW5nIE1hdGVyaWFsCi0JCQlpbWFnZSA9IExpYnJhcnlFZGl0UGx1Z2luLmdldFBsdWdpbigpLmdldEltYWdlKAotCQkJCQkiZnVsbC9vYmoxNi9TdXBwb3J0aW5nTWF0ZXJpYWxzIik7IC8vJE5PTi1OTFMtMSQKLQkJCW5hbWUgPSBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkuZ2V0U3RyaW5nKCJfVUlfR3VpZGFuY2VzX1N1cHBvcnRpbmdNYXRlcmlhbHMiKTsgLy8kTk9OLU5MUy0xJAotCQkJY2hpbGQgPSBuZXcgR3VpZGFuY2VJdGVtUHJvdmlkZXIoYWRhcHRlckZhY3RvcnksIG1ldGhvZENvbmZpZywKLQkJCQkJbmFtZSwgaW1hZ2UpOwotCQkJY2hpbGQuc2V0R3VpZGFuY2VGaWx0ZXIoc3VwcG9ydGluZ01hdGVyaWFsRmlsdGVyKTsKLQkJCWNoaWxkcmVuLmFkZChjaGlsZCk7Ci0JCQlncm91cEl0ZW1Qcm92aWRlck1hcC5wdXQobmFtZSwgY2hpbGQpOwotCi0JCQkvLyAvLyBUZWNobmlxdWUKLQkJCS8vIGltYWdlID0KLQkJCS8vIExpYnJhcnlFZGl0UGx1Z2luLmdldFBsdWdpbigpLmdldEltYWdlKCJmdWxsL29iajE2L1RlY2huaXF1ZXMiKTsKLQkJCS8vIG5hbWUgPQotCQkJLy8gTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfR3VpZGFuY2VzX1RlY2huaXF1ZXMiKTsKLQkJCS8vIGNoaWxkID0gbmV3IEd1aWRhbmNlSXRlbVByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5LCBtZXRob2RDb25maWcsCi0JCQkvLyBuYW1lLCBpbWFnZSk7Ci0JCQkvLyBjaGlsZC5zZXRHdWlkYW5jZUZpbHRlcih0ZWNobmlxdWVGaWx0ZXIpOwotCQkJLy8gY2hpbGRyZW4uYWRkKGNoaWxkKTsKLQkJCS8vIGdyb3VwSXRlbVByb3ZpZGVyTWFwLnB1dChuYW1lLCBjaGlsZCk7Ci0KLQkJCS8vIFRlbXBsYXRlCi0JCQlpbWFnZSA9IExpYnJhcnlFZGl0UGx1Z2luLmdldFBsdWdpbigpLmdldEltYWdlKAotCQkJCQkiZnVsbC9vYmoxNi9UZW1wbGF0ZXMiKTsgLy8kTk9OLU5MUy0xJAotCQkJbmFtZSA9IExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCS5nZXRTdHJpbmcoIl9VSV9HdWlkYW5jZXNfVGVtcGxhdGVzIik7IC8vJE5PTi1OTFMtMSQKLQkJCWNoaWxkID0gbmV3IEd1aWRhbmNlSXRlbVByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5LCBtZXRob2RDb25maWcsCi0JCQkJCW5hbWUsIGltYWdlKTsKLQkJCWNoaWxkLnNldEd1aWRhbmNlRmlsdGVyKHRlbXBsYXRlRmlsdGVyKTsKLQkJCWNoaWxkcmVuLmFkZChjaGlsZCk7Ci0JCQlncm91cEl0ZW1Qcm92aWRlck1hcC5wdXQobmFtZSwgY2hpbGQpOwotCi0JCQkvLyBUZXJtIERlZmluaXRpb24KLQkJCWltYWdlID0gTGlicmFyeUVkaXRQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0SW1hZ2UoCi0JCQkJCSJmdWxsL29iajE2L1Rlcm1EZWZpbml0aW9ucyIpOyAvLyROT04tTkxTLTEkCi0JCQluYW1lID0gTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJLmdldFN0cmluZygiX1VJX0d1aWRhbmNlc19UZXJtRGVmaW5pdGlvbnMiKTsgLy8kTk9OLU5MUy0xJAotCQkJY2hpbGQgPSBuZXcgR3VpZGFuY2VJdGVtUHJvdmlkZXIoYWRhcHRlckZhY3RvcnksIG1ldGhvZENvbmZpZywKLQkJCQkJbmFtZSwgaW1hZ2UpOwotCQkJY2hpbGQuc2V0R3VpZGFuY2VGaWx0ZXIodGVybURlZmluaXRpb25GaWx0ZXIpOwotCQkJY2hpbGRyZW4uYWRkKGNoaWxkKTsKLQkJCWdyb3VwSXRlbVByb3ZpZGVyTWFwLnB1dChuYW1lLCBjaGlsZCk7Ci0KLQkJCS8vIFRvb2wgTWVudG9yCi0JCQlpbWFnZSA9IExpYnJhcnlFZGl0UGx1Z2luLmdldFBsdWdpbigpLmdldEltYWdlKAotCQkJCQkiZnVsbC9vYmoxNi9Ub29sTWVudG9ycyIpOyAvLyROT04tTkxTLTEkCi0JCQluYW1lID0gTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJLmdldFN0cmluZygiX1VJX0d1aWRhbmNlc19Ub29sTWVudG9ycyIpOyAvLyROT04tTkxTLTEkCi0JCQljaGlsZCA9IG5ldyBHdWlkYW5jZUl0ZW1Qcm92aWRlcihhZGFwdGVyRmFjdG9yeSwgbWV0aG9kQ29uZmlnLAotCQkJCQluYW1lLCBpbWFnZSk7Ci0JCQljaGlsZC5zZXRHdWlkYW5jZUZpbHRlcih0b29sTWVudG9yRmlsdGVyKTsKLQkJCWNoaWxkcmVuLmFkZChjaGlsZCk7Ci0JCQlncm91cEl0ZW1Qcm92aWRlck1hcC5wdXQobmFtZSwgY2hpbGQpOwotCi0JCQkvLyBXaGl0ZXBhcGVyCi0JCQlpbWFnZSA9IExpYnJhcnlFZGl0UGx1Z2luLmdldFBsdWdpbigpLmdldEltYWdlKAotCQkJCQkiZnVsbC9vYmoxNi9XaGl0ZXBhcGVycyIpOyAvLyROT04tTkxTLTEkCi0JCQluYW1lID0gTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJLmdldFN0cmluZygiX1VJX0d1aWRhbmNlc19XaGl0ZXBhcGVycyIpOyAvLyROT04tTkxTLTEkCi0JCQljaGlsZCA9IG5ldyBHdWlkYW5jZUl0ZW1Qcm92aWRlcihhZGFwdGVyRmFjdG9yeSwgbWV0aG9kQ29uZmlnLAotCQkJCQluYW1lLCBpbWFnZSk7Ci0JCQljaGlsZC5zZXRHdWlkYW5jZUZpbHRlcih3aGl0ZVBhcGVyRmlsdGVyKTsKLQkJCWNoaWxkcmVuLmFkZChjaGlsZCk7Ci0JCQlncm91cEl0ZW1Qcm92aWRlck1hcC5wdXQobmFtZSwgY2hpbGQpOwotCi0JCQkvLyBHdWlkZWxpbmVzCi0JCQlpbWFnZSA9IExpYnJhcnlFZGl0UGx1Z2luLmdldFBsdWdpbigpLmdldEltYWdlKAotCQkJCQkiZnVsbC9vYmoxNi9Xb3JrUHJvZHVjdEd1aWRlbGluZXMiKTsgLy8kTk9OLU5MUy0xJAotCQkJbmFtZSA9IExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCS5nZXRTdHJpbmcoIl9VSV9HdWlkYW5jZXNfV29ya1Byb2R1Y3RHdWlkZWxpbmVzIik7IC8vJE5PTi1OTFMtMSQKLQkJCWNoaWxkID0gbmV3IEd1aWRhbmNlSXRlbVByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5LCBtZXRob2RDb25maWcsCi0JCQkJCW5hbWUsIGltYWdlKTsKLQkJCWNoaWxkLnNldEd1aWRhbmNlRmlsdGVyKGd1aWRlbGluZUZpbHRlcik7Ci0JCQljaGlsZHJlbi5hZGQoY2hpbGQpOwotCQkJZ3JvdXBJdGVtUHJvdmlkZXJNYXAucHV0KG5hbWUsIGNoaWxkKTsKLQkJfQotCQkKLQkJaWYgKGZpbHRlciAhPSBudWxsKSB7Ci0JCQkvLyBTaG91bGQgZmlsdGVyIG9ubHkgY29weSBvbmx5LCBub3Qgb3JnaW5hbCBjYWNoZWQgY2hpbGRyZW4gbGlzdC4KLQkJCUxpc3QgY29weSA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWNvcHkuYWRkQWxsKGNoaWxkcmVuKTsKLQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBjb3B5Lml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCQlHdWlkYW5jZUl0ZW1Qcm92aWRlciBvYmogPSAoR3VpZGFuY2VJdGVtUHJvdmlkZXIpIGl0ZXJhdG9yCi0JCQkJCQkubmV4dCgpOwotCQkJCW9iai5zZXRGaWx0ZXIoZmlsdGVyKTsKLQkJCQlpZiAob2JqLmdldENoaWxkcmVuKG9iaikuaXNFbXB0eSgpKSB7Ci0JCQkJCWl0ZXJhdG9yLnJlbW92ZSgpOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBjb3B5OwotCQl9Ci0JCXJldHVybiBjaGlsZHJlbjsKLQkJCi0JfQotCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9HdWlkYW5jZUZvbGRlciIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX0d1aWRhbmNlc19ncm91cCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5JR3JvdXBDb250YWluZXIjZ2V0R3JvdXBJdGVtUHJvdmlkZXIoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEdyb3VwSXRlbVByb3ZpZGVyKFN0cmluZyBuYW1lKSB7Ci0JCXJldHVybiBncm91cEl0ZW1Qcm92aWRlck1hcC5nZXQobmFtZSk7Ci0JfQotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0TmV3Q2hpbGREZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0LAotCQkJRWRpdGluZ0RvbWFpbiBlZGl0aW5nRG9tYWluLCBPYmplY3Qgc2libGluZykgewotCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0UGFyZW50KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gbWV0aG9kQ29uZmlnOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEZpbHRlcihJRmlsdGVyIGZpbHRlcikgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXRoaXMuZmlsdGVyID0gZmlsdGVyOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldExhYmVsKFN0cmluZyBsYWJlbCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0KLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbmZpZ3VyYXRpb24vR3VpZGFuY2VJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29uZmlndXJhdGlvbi9HdWlkYW5jZUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOGM5OGY1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29uZmlndXJhdGlvbi9HdWlkYW5jZUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29uZmlndXJhdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JTGlicmFyeUl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotCi0vKioKLSAqIFRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEgZ3VpZGFuY2Ugc3BlY2lmaWMgZm9sZGVyLgotICogCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBHdWlkYW5jZUl0ZW1Qcm92aWRlciBleHRlbmRzIEl0ZW1Qcm92aWRlckFkYXB0ZXIgaW1wbGVtZW50cwotCQlJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSwKLQkJSUNvbmZpZ3VyYWJsZSwgSUxpYnJhcnlJdGVtUHJvdmlkZXIgewotCUxpc3QgY2hpbGRyZW47Ci0KLQlwcml2YXRlIFN0cmluZyBsYWJlbDsKLQotCXByaXZhdGUgT2JqZWN0IHBhcmVudDsKLQotCXByaXZhdGUgSUZpbHRlciBmaWx0ZXI7Ci0KLQlwcml2YXRlIE9iamVjdCBpbWFnZTsKLQotCXByaXZhdGUgSUZpbHRlciBndWlkYW5jZUZpbHRlcjsKLQotCXByaXZhdGUgTWV0aG9kQ29uZmlndXJhdGlvbiBtZXRob2RDb25maWc7Ci0KLQlwdWJsaWMgY2xhc3MgQ29tcGFyZUJ5TmFtZSBpbXBsZW1lbnRzIENvbXBhcmF0b3IgewotCi0JCXB1YmxpYyBpbnQgY29tcGFyZShPYmplY3Qgb2JqMSwgT2JqZWN0IG9iajIpIHsKLQkJCVN0cmluZyBuYW1lMSA9ICgoTWV0aG9kRWxlbWVudCkgb2JqMSkuZ2V0TmFtZSgpOwotCQkJU3RyaW5nIG5hbWUyID0gKChNZXRob2RFbGVtZW50KSBvYmoyKS5nZXROYW1lKCk7Ci0JCQlyZXR1cm4gbmFtZTEuY29tcGFyZVRvSWdub3JlQ2FzZShuYW1lMik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBHdWlkYW5jZUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwKLQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gbWV0aG9kQ29uZmlnLCBTdHJpbmcgbmFtZSwgT2JqZWN0IGltYWdlKSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQkJLy8gbWV0aG9kQ29uZmlnLmVBZGFwdGVycygpLmFkZCh0aGlzKTsKLQkJbGFiZWwgPSBuYW1lOwotCQl0aGlzLm1ldGhvZENvbmZpZyA9IG1ldGhvZENvbmZpZzsKLQkJdGhpcy5pbWFnZSA9IGltYWdlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJLy8gTWV0aG9kQ29uZmlndXJhdGlvbiBtZXRob2RDb25maWcgPSAoTWV0aG9kQ29uZmlndXJhdGlvbikgdGFyZ2V0OwotCi0JCUFycmF5TGlzdCBmaWx0ZXJMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlpZiAoZ3VpZGFuY2VGaWx0ZXIgIT0gbnVsbCkgewotCQkJZmlsdGVyTGlzdC5hZGQoZ3VpZGFuY2VGaWx0ZXIpOwotCQl9Ci0JCWlmIChmaWx0ZXIgIT0gbnVsbCkgewotCQkJZmlsdGVyTGlzdC5hZGQoZmlsdGVyKTsKLQkJfQotCQlNZXRob2RDb25maWd1cmF0aW9uRWxlbWVudExpc3QgZWxlbWVudExpc3QgPSBuZXcgTWV0aG9kQ29uZmlndXJhdGlvbkVsZW1lbnRMaXN0KAotCQkJCW1ldGhvZENvbmZpZywgZmlsdGVyTGlzdCk7Ci0JCUxpc3QgZWxlbWVudHMgPSBlbGVtZW50TGlzdC5nZXRMaXN0KCk7Ci0KLQkJLy8gc29ydCBieSBuYW1lCi0JCUNvbGxlY3Rpb25zLnNvcnQoZWxlbWVudHMsIG5ldyBDb21wYXJlQnlOYW1lKCkpOwotCQlyZXR1cm4gZWxlbWVudHM7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldE5ld0NoaWxkRGVzY3JpcHRvcnMoamF2YS5sYW5nLk9iamVjdCwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluLCBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldE5ld0NoaWxkRGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCwKLQkJCUVkaXRpbmdEb21haW4gZWRpdGluZ0RvbWFpbiwgT2JqZWN0IHNpYmxpbmcpIHsKLQkJcmV0dXJuIHN1cGVyLmdldE5ld0NoaWxkRGVzY3JpcHRvcnMobWV0aG9kQ29uZmlnLCBlZGl0aW5nRG9tYWluLAotCQkJCXNpYmxpbmcpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRQYXJlbnQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChwYXJlbnQgIT0gbnVsbCkKLQkJCXJldHVybiBwYXJlbnQ7Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBFT2JqZWN0KSB7Ci0JCQlyZXR1cm4gc3VwZXIuZ2V0UGFyZW50KG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldEltYWdlKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBpbWFnZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0VGV4dChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChsYWJlbCAhPSBudWxsKQotCQkJcmV0dXJuIGxhYmVsOwotCQlyZXR1cm4gc3VwZXIuZ2V0VGV4dChvYmplY3QpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYWJsZSNzZXRGaWx0ZXIoY29tLmlibS5saWJyYXJ5LmVkaXQuSUZpbHRlcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGaWx0ZXIoSUZpbHRlciBmaWx0ZXIpIHsKLQkJdGhpcy5maWx0ZXIgPSBmaWx0ZXI7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0R3VpZGFuY2VGaWx0ZXIoSUZpbHRlciBmaWx0ZXIpIHsKLQkJZ3VpZGFuY2VGaWx0ZXIgPSBmaWx0ZXI7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhYmxlI3NldExhYmVsKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGFiZWwoU3RyaW5nIGxhYmVsKSB7Ci0JCXRoaXMubGFiZWwgPSBsYWJlbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LklDb25maWd1cmFibGUjc2V0UGFyZW50KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgc2V0UGFyZW50KE9iamVjdCBwYXJlbnQpIHsKLQkJdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldENoaWxkcmVuRmVhdHVyZXMoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbkZlYXR1cmVzKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIHN1cGVyLmdldENoaWxkcmVuRmVhdHVyZXMob2JqZWN0KTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbmZpZ3VyYXRpb24vSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29uZmlndXJhdGlvbi9JdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZDg5ZWY2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29uZmlndXJhdGlvbi9JdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29uZmlndXJhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5icmVha2Rvd25lbGVtZW50Lk1pbGVzdG9uZUl0ZW1Qcm92aWRlcjsKLQotLyoqCi0gKiBUaGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZhY3RvcnkgZm9yIHRoZSBDb25maWd1cmF0aW9uIHZpZXcuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5IGV4dGVuZHMKLQkJb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5uYXZpZ2F0b3IuSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkgewotCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlTWV0aG9kQ29uZmlndXJhdGlvbkFkYXB0ZXIoKSB7Ci0JCUFkYXB0ZXIgYWRhcHRlciA9IG5ldyBNZXRob2RDb25maWd1cmF0aW9uSXRlbVByb3ZpZGVyKHRoaXMpOwotCQlyZXR1cm4gYWRhcHRlcjsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVQcm9jZXNzQ29tcG9uZW50QWRhcHRlcigpIHsKLQkJaWYgKHByb2Nlc3NDb21wb25lbnRJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJcHJvY2Vzc0NvbXBvbmVudEl0ZW1Qcm92aWRlciA9IG5ldyBQcm9jZXNzQ29tcG9uZW50SXRlbVByb3ZpZGVyKAotCQkJCQl0aGlzKTsKLQkJfQotCi0JCXJldHVybiBwcm9jZXNzQ29tcG9uZW50SXRlbVByb3ZpZGVyOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQubmF2aWdhdG9yLk1ldGhvZHBsdWdpbkl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5I2NyZWF0ZU1ldGhvZFBsdWdpbkFkYXB0ZXIoKQotCSAqLwotCS8qCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlTWV0aG9kUGx1Z2luQWRhcHRlcigpIHsKLQkJTWV0aG9kUGx1Z2luSXRlbVByb3ZpZGVyIGFkYXB0ZXIgPSBuZXcgTWV0aG9kUGx1Z2luSXRlbVByb3ZpZGVyKHRoaXMpOwotCQlhZGFwdGVyLnNldE1vZGVsU3RydWN0dXJlKE1vZGVsU3RydWN0dXJlLkRFRkFVTFQpOwotCQlyZXR1cm4gYWRhcHRlcjsKLQl9Ci0JKi8KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQubmF2aWdhdG9yLk1ldGhvZHBsdWdpbkl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5I2NyZWF0ZVByb2Nlc3NQYWNrYWdlQWRhcHRlcigpCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUHJvY2Vzc1BhY2thZ2VBZGFwdGVyKCkgewotCQlBZGFwdGVyIGFkYXB0ZXIgPSBuZXcgUHJvY2Vzc1BhY2thZ2VJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCXJldHVybiBhZGFwdGVyOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5VbWFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSNjcmVhdGVEZWxpdmVyeVByb2Nlc3NBZGFwdGVyKCkKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVEZWxpdmVyeVByb2Nlc3NBZGFwdGVyKCkgewotCQlyZXR1cm4gY3JlYXRlQWN0aXZpdHlBZGFwdGVyKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLlVtYUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5I2NyZWF0ZUNhcGFiaWxpdHlQYXR0ZXJuQWRhcHRlcigpCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQ2FwYWJpbGl0eVBhdHRlcm5BZGFwdGVyKCkgewotCQlyZXR1cm4gY3JlYXRlQWN0aXZpdHlBZGFwdGVyKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLlVtYUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5I2NyZWF0ZUFjdGl2aXR5QWRhcHRlcigpCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQWN0aXZpdHlBZGFwdGVyKCkgewotCQlBZGFwdGVyIGFkYXB0ZXIgPSBuZXcgQWN0aXZpdHlJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCXJldHVybiBhZGFwdGVyOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5VbWFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSNjcmVhdGVQaGFzZUFkYXB0ZXIoKQotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVBoYXNlQWRhcHRlcigpIHsKLQkJcmV0dXJuIGNyZWF0ZUFjdGl2aXR5QWRhcHRlcigpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkJyZWFrZG93bkFkYXB0ZXJGYWN0b3J5I2NyZWF0ZUl0ZXJhdGlvbkFkYXB0ZXIoKQotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUl0ZXJhdGlvbkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBjcmVhdGVBY3Rpdml0eUFkYXB0ZXIoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0Lm5hdmlnYXRvci5JdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSNjcmVhdGVEaXNjaXBsaW5lR3JvdXBpbmdBZGFwdGVyKCkKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVEaXNjaXBsaW5lR3JvdXBpbmdBZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IERpc2NpcGxpbmVHcm91cGluZ0l0ZW1Qcm92aWRlcih0aGlzKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0Lm5hdmlnYXRvci5JdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSNjcmVhdGVEaXNjaXBsaW5lQWRhcHRlcigpCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRGlzY2lwbGluZUFkYXB0ZXIoKSB7Ci0JCUFkYXB0ZXIgYWRhcHRlciA9IG5ldyBEaXNjaXBsaW5lSXRlbVByb3ZpZGVyKHRoaXMpOwotCQlyZXR1cm4gYWRhcHRlcjsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVEb21haW5BZGFwdGVyKCkgewotCQlpZiAoZG9tYWluSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCWRvbWFpbkl0ZW1Qcm92aWRlciA9IG5ldyBEb21haW5JdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gZG9tYWluSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQubmF2aWdhdG9yLkl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5I2NyZWF0ZVJvbGVTZXRBZGFwdGVyKCkKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVSb2xlU2V0QWRhcHRlcigpIHsKLQkJQWRhcHRlciBhZGFwdGVyID0gbmV3IFJvbGVTZXRJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCXJldHVybiBhZGFwdGVyOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVNaWxlc3RvbmVBZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IE1pbGVzdG9uZUl0ZW1Qcm92aWRlcih0aGlzKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUHJhY3RpY2VBZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IFByYWN0aWNlSXRlbVByb3ZpZGVyKHRoaXMpOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29uZmlndXJhdGlvbi9NZXRob2RDb25maWd1cmF0aW9uRWxlbWVudExpc3QuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29uZmlndXJhdGlvbi9NZXRob2RDb25maWd1cmF0aW9uRWxlbWVudExpc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjg5MzRlMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbmZpZ3VyYXRpb24vTWV0aG9kQ29uZmlndXJhdGlvbkVsZW1lbnRMaXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb25maWd1cmF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQWJzdHJhY3RUcmVlSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Nb2RlbFN0cnVjdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLQotLyoqCi0gKiBLZWVwcyB0cmFjayBvZiBhIGxpc3Qgb2YgbWV0aG9kIGVsZW1lbnRzIGluIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24uCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIE1ldGhvZENvbmZpZ3VyYXRpb25FbGVtZW50TGlzdCB7Ci0KLQlwcml2YXRlIE1ldGhvZENvbmZpZ3VyYXRpb24gbWV0aG9kQ29uZmlnOwotCi0JcHJpdmF0ZSBMaXN0IGZpbHRlckxpc3Q7Ci0KLQlwcm90ZWN0ZWQgY2xhc3MgRWxlbWVudEl0ZXJhdG9yIGV4dGVuZHMgQWJzdHJhY3RUcmVlSXRlcmF0b3IgewotCi0JCS8qKgotCQkgKiBDb21tZW50IGZvciA8Y29kZT5zZXJpYWxWZXJzaW9uVUlEPC9jb2RlPgotCQkgKi8KLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTIyOTE0Mzg5NzAxMjM5ODU5MDZMOwotCi0JCXByb3RlY3RlZCBFbGVtZW50SXRlcmF0b3IoQ29udGVudFBhY2thZ2UgY29udGVudFBrZykgewotCQkJc3VwZXIoY29udGVudFBrZywgZmFsc2UpOwotCQl9Ci0JCQotCQlwcm90ZWN0ZWQgTGlzdCBnZXRDaGlsZHJlbkxpc3QoT2JqZWN0IG9iamVjdCkgewotCQkJQXJyYXlMaXN0IGNoaWxkcmVuID0gbmV3IEFycmF5TGlzdCgpOwotCQkJaWYob2JqZWN0IGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UpIHsKLQkJCQlDb250ZW50UGFja2FnZSBwa2cgPSAoQ29udGVudFBhY2thZ2UpIG9iamVjdDsKLQkJCQlMaXN0IHBhY2thZ2VzID0gcGtnLmdldENoaWxkUGFja2FnZXMoKTsKLQkJCQlpbnQgc2l6ZSA9IHBhY2thZ2VzLnNpemUoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCQlPYmplY3Qgb2JqID0gcGFja2FnZXMuZ2V0KGkpOwotCQkJCQlpZiAob2JqIGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UKLQkJCQkJCQkmJiBtZXRob2RDb25maWcuZ2V0TWV0aG9kUGFja2FnZVNlbGVjdGlvbigpLmNvbnRhaW5zKG9iaikpIHsKLQkJCQkJCWNoaWxkcmVuLmFkZChvYmopOwotCQkJCQl9Ci0JCQkJfQotCQkJCWlmKGNoZWNrQWNjZXB0YW5jZSgpKSB7Ci0JCQkJCUxpc3QgZWxlbWVudHMgPSBwa2cuZ2V0Q29udGVudEVsZW1lbnRzKCk7Ci0JCQkJCXNpemUgPSBlbGVtZW50cy5zaXplKCk7Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJCQlPYmplY3Qgb2JqID0gZWxlbWVudHMuZ2V0KGkpOwotCQkJCQkJaWYgKGFjY2VwdChvYmopKSB7Ci0JCQkJCQkJY2hpbGRyZW4uYWRkKG9iaik7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWNoaWxkcmVuLmFkZEFsbChwa2cuZ2V0Q29udGVudEVsZW1lbnRzKCkpOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBjaGlsZHJlbjsKLQkJfQotCi0JCS8qIChub24tSmF2YWRvYykKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQWJzdHJhY3RUcmVlSXRlcmF0b3IjZ2V0Q2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKLQkJICovCi0JCXByb3RlY3RlZCBJdGVyYXRvciBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gZ2V0Q2hpbGRyZW5MaXN0KG9iamVjdCkuaXRlcmF0b3IoKTsKLQkJfQotCQkKLQl9OwotCQotCXB1YmxpYyBNZXRob2RDb25maWd1cmF0aW9uRWxlbWVudExpc3QoTWV0aG9kQ29uZmlndXJhdGlvbiBtZXRob2RDb25maWcsCi0JCQlMaXN0IGZpbHRlckxpc3QpIHsKLQkJdGhpcy5tZXRob2RDb25maWcgPSBtZXRob2RDb25maWc7Ci0JCXRoaXMuZmlsdGVyTGlzdCA9IGZpbHRlckxpc3Q7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gY2hlY2tBY2NlcHRhbmNlKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0KE9iamVjdCBvYmplY3QpIHsKLQkJaW50IHNpemUgPSBmaWx0ZXJMaXN0LnNpemUoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCUlGaWx0ZXIgZmlsdGVyID0gKElGaWx0ZXIpIGZpbHRlckxpc3QuZ2V0KGkpOwotCQkJaWYgKCFmaWx0ZXIuYWNjZXB0KG9iamVjdCkpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQkKLQlwcm90ZWN0ZWQgSXRlcmF0b3IgbmV3SXRlcmF0b3IoQ29udGVudFBhY2thZ2UgcGtnKSB7Ci0JCXJldHVybiBuZXcgRWxlbWVudEl0ZXJhdG9yKHBrZyk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGdldEFsbEVsZW1lbnRzKENvbnRlbnRQYWNrYWdlIHBrZywgTGlzdCBsaXN0KSB7Ci0JCWZvcihJdGVyYXRvciBpdGVyID0gbmV3SXRlcmF0b3IocGtnKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZSA9IGl0ZXIubmV4dCgpOwotCQkJaWYoIShlIGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UpKSB7Ci0JCQkJbGlzdC5hZGQoZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgTGlzdCBnZXRMaXN0KCkgewotCQlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IG1ldGhvZENvbmZpZy5nZXRNZXRob2RQbHVnaW5TZWxlY3Rpb24oKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSAoTWV0aG9kUGx1Z2luKSBpdGVyLm5leHQoKTsKLQkJCUNvbnRlbnRQYWNrYWdlIHBrZyA9IFVtYVV0aWwuZmluZENvbnRlbnRQYWNrYWdlKHBsdWdpbiwKLQkJCQkJTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC5jb3JlQ29udGVudFBhdGgpOwotCQkJaWYgKHBrZyAhPSBudWxsKSB7Ci0JCQkJZ2V0QWxsRWxlbWVudHMocGtnLCBsaXN0KTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBsaXN0OwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb25maWd1cmF0aW9uL01ldGhvZENvbmZpZ3VyYXRpb25JdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29uZmlndXJhdGlvbi9NZXRob2RDb25maWd1cmF0aW9uSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmMDU5MzEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb25maWd1cmF0aW9uL01ldGhvZENvbmZpZ3VyYXRpb25JdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbmZpZ3VyYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRGlzcG9zYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklDb25maWd1cmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklHcm91cENvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklTdGF0ZWZ1bEl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY2F0ZWdvcnkuRGlzY2lwbGluZUNhdGVnb3JpZXNJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jYXRlZ29yeS5Sb2xlU2V0c0l0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuTW9kZWxTdHJ1Y3R1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50Q2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Eb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Ub29sOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVG9vbE1lbnRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQXNzb2NpYXRpb25IZWxwZXI7Ci0KLS8qKgotICogVGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSBtZXRob2QgY29uZmlndXJhdGlvbiBpbiB0aGUgQ29uZmlndXJhdGlvbgotICogdmlldy4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXRob2RDb25maWd1cmF0aW9uSXRlbVByb3ZpZGVyIGV4dGVuZHMKLQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5NZXRob2RDb25maWd1cmF0aW9uSXRlbVByb3ZpZGVyIGltcGxlbWVudHMKLQkJSUdyb3VwQ29udGFpbmVyLCBJQ29uZmlndXJhYmxlLCBJU3RhdGVmdWxJdGVtUHJvdmlkZXIgewotCi0JcHJpdmF0ZSBNYXAgZ3JvdXBJdGVtUHJvdmlkZXJNYXA7Ci0KLQkvLyBjaGFuZ2VkIHRvIHByb3RlY3RlZCwgZXh0ZW5kZWQgY2xhc3MgY2FuIHBsYXkgd2l0aCBjaGlsZHJlbiB2YXJpYWJsZS4KLQlwcm90ZWN0ZWQgQXJyYXlMaXN0IGNoaWxkcmVuOwotCi0JcHJpdmF0ZSBJRmlsdGVyIGRpc2NpcGxpbmVzRmlsdGVyID0gbmV3IElGaWx0ZXIoKSB7Ci0KLQkJcHVibGljIGJvb2xlYW4gYWNjZXB0KE9iamVjdCBvYmopIHsKLQkJCUNvbnRlbnRDYXRlZ29yeSBlbGVtZW50ID0gKENvbnRlbnRDYXRlZ29yeSkgb2JqOwotCQkJLy8gQnJvd3Npbmc6IFdpdGggY2F0ZWdvcmllcywgcmVwbGFjZSBnZW5lcmFsaXphdGlvbgotCQkJLy8gY2F1c2VzIGJvdGggcmVwbGFjZW1lbnQgYW5kIGJhc2UgdG8gYmVjb21lIGludmlzaWJsZSB0byBicm93c2luZwotCQkJcmV0dXJuIERpc2NpcGxpbmVDYXRlZ29yaWVzSXRlbVByb3ZpZGVyLmFjY2VwdChlbGVtZW50KSAvKgotCQkJCQkJCQkJCQkJCQkJCQkgKiAmJgotCQkJCQkJCQkJCQkJCQkJCQkgKiBlbGVtZW50LmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSA9PQotCQkJCQkJCQkJCQkJCQkJCQkgKiBudWxsCi0JCQkJCQkJCQkJCQkJCQkJCSAqLzsKLQkJfQotCX07Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBJRmlsdGVyIGRvbWFpbkZpbHRlciA9IG5ldyBJRmlsdGVyKCkgewotCi0JCXB1YmxpYyBib29sZWFuIGFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCQkvLyBCcm93c2luZzogV2l0aCBjYXRlZ29yaWVzLCByZXBsYWNlIGdlbmVyYWxpemF0aW9uCi0JCQkvLyBjYXVzZXMgYm90aCByZXBsYWNlbWVudCBhbmQgYmFzZSB0byBiZWNvbWUgaW52aXNpYmxlIHRvIGJyb3dzaW5nCi0JCQlyZXR1cm4gb2JqIGluc3RhbmNlb2YgRG9tYWluIC8qCi0JCQkJCQkJCQkJCSAqICYmCi0JCQkJCQkJCQkJCSAqICgoRG9tYWluKW9iaikuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpID09Ci0JCQkJCQkJCQkJCSAqIG51bGwKLQkJCQkJCQkJCQkJICovOwotCQl9Ci0KLQl9OwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSUZpbHRlciB3b3JrUHJvZHVjdFR5cGVzRmlsdGVyID0gbmV3IElGaWx0ZXIoKSB7Ci0KLQkJcHVibGljIGJvb2xlYW4gYWNjZXB0KE9iamVjdCBvYmopIHsKLQkJCS8vIEJyb3dzaW5nOiBXaXRoIGNhdGVnb3JpZXMsIHJlcGxhY2UgZ2VuZXJhbGl6YXRpb24KLQkJCS8vIGNhdXNlcyBib3RoIHJlcGxhY2VtZW50IGFuZCBiYXNlIHRvIGJlY29tZSBpbnZpc2libGUgdG8gYnJvd3NpbmcKLQkJCXJldHVybiBvYmogaW5zdGFuY2VvZiBXb3JrUHJvZHVjdFR5cGUgLyoKLQkJCQkJCQkJCQkJCQkgKiAmJgotCQkJCQkJCQkJCQkJCSAqICgoV29ya1Byb2R1Y3RUeXBlKW9iaikuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpID09Ci0JCQkJCQkJCQkJCQkJICogbnVsbAotCQkJCQkJCQkJCQkJCSAqLzsKLQkJfQotCi0JfTsKLQotCXByaXZhdGUgSUZpbHRlciByb2xlU2V0c0ZpbHRlciA9IG5ldyBJRmlsdGVyKCkgewotCi0JCXB1YmxpYyBib29sZWFuIGFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCQkvLyBCcm93c2luZzogV2l0aCBjYXRlZ29yaWVzLCByZXBsYWNlIGdlbmVyYWxpemF0aW9uCi0JCQkvLyBjYXVzZXMgYm90aCByZXBsYWNlbWVudCBhbmQgYmFzZSB0byBiZWNvbWUgaW52aXNpYmxlIHRvIGJyb3dzaW5nCi0JCQlyZXR1cm4gUm9sZVNldHNJdGVtUHJvdmlkZXIuYWNjZXB0KG9iaikgLyoKLQkJCQkJCQkJCQkJCQkgKiAmJgotCQkJCQkJCQkJCQkJCSAqICgoVmFyaWFiaWxpdHlFbGVtZW50KW9iaikuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpID09Ci0JCQkJCQkJCQkJCQkJICogbnVsbAotCQkJCQkJCQkJCQkJCSAqLzsKLQkJfQotCX07Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBJRmlsdGVyIHRvb2xzRmlsdGVyID0gbmV3IElGaWx0ZXIoKSB7Ci0KLQkJcHVibGljIGJvb2xlYW4gYWNjZXB0KE9iamVjdCBvYmopIHsKLQkJCS8vIEJyb3dzaW5nOiBXaXRoIGNhdGVnb3JpZXMsIHJlcGxhY2UgZ2VuZXJhbGl6YXRpb24KLQkJCS8vIGNhdXNlcyBib3RoIHJlcGxhY2VtZW50IGFuZCBiYXNlIHRvIGJlY29tZSBpbnZpc2libGUgdG8gYnJvd3NpbmcKLQkJCXJldHVybiBvYmogaW5zdGFuY2VvZiBUb29sIC8qCi0JCQkJCQkJCQkJICogJiYKLQkJCQkJCQkJCQkgKiAoKFRvb2wpb2JqKS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkgPT0KLQkJCQkJCQkJCQkgKiBudWxsCi0JCQkJCQkJCQkJICovOwotCQl9Ci0KLQl9OwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSUZpbHRlciBjdXN0b21DYXRlZ29yaWVzRmlsdGVyID0gbmV3IElGaWx0ZXIoKSB7Ci0KLQkJcHVibGljIGJvb2xlYW4gYWNjZXB0KE9iamVjdCBvYmopIHsKLQkJCS8vIEJyb3dzaW5nOiBXaXRoIGNhdGVnb3JpZXMsIHJlcGxhY2UgZ2VuZXJhbGl6YXRpb24KLQkJCS8vIGNhdXNlcyBib3RoIHJlcGxhY2VtZW50IGFuZCBiYXNlIHRvIGJlY29tZSBpbnZpc2libGUgdG8gYnJvd3NpbmcKLQkJCXJldHVybiBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNhdGVnb3J5LkN1c3RvbUNhdGVnb3JpZXNJdGVtUHJvdmlkZXIKLQkJCQkJLmFjY2VwdChvYmopIC8qCi0JCQkJCQkJCQkgKiAmJgotCQkJCQkJCQkJICogKChWYXJpYWJpbGl0eUVsZW1lbnQpb2JqKS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkgPT0KLQkJCQkJCQkJCSAqIG51bGwKLQkJCQkJCQkJCSAqLzsKLQkJfQotCi0JfTsKLQkKLQkvLyB1cGNhdGVnb3JpemVkIGZpbHRlcnMgY2FuIGJlIHJlc2V0IGJhc2VkIG9uIGNvbmZpZ3VyYXRvci4KLQlwcml2YXRlIElGaWx0ZXIgdW5jYXRlZ29yaXplZFRhc2tGaWx0ZXIgPSBuZXcgSUZpbHRlcigpIHsKLQotCQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoT2JqZWN0IG9iaikgewotCQkJcmV0dXJuIG9iaiBpbnN0YW5jZW9mIFRhc2sKLQkJCQkJJiYgQXNzb2NpYXRpb25IZWxwZXIuZ2V0RGlzY2lwbGluZXMoKFRhc2spIG9iaikuaXNFbXB0eSgpOwotCQl9Ci0KLQl9OwotCi0JcHJpdmF0ZSBJRmlsdGVyIGRvbWFpblVuY2F0ZWdvcml6ZWRXb3JrUHJvZHVjdEZpbHRlciA9IG5ldyBJRmlsdGVyKCkgewotCi0JCXB1YmxpYyBib29sZWFuIGFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCQlyZXR1cm4gb2JqIGluc3RhbmNlb2YgV29ya1Byb2R1Y3QKLQkJCQkJJiYgIUFzc29jaWF0aW9uSGVscGVyLmdldERvbWFpbnMoKFdvcmtQcm9kdWN0KSBvYmopLmlzRW1wdHkoKTsKLQkJfQotCi0JfTsKLQotCXByaXZhdGUgSUZpbHRlciB3cFR5cGVVbmNhdGVnb3JpemVkV29ya1Byb2R1Y3RGaWx0ZXIgPSBuZXcgSUZpbHRlcigpIHsKLQotCQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoT2JqZWN0IG9iaikgewotCQkJcmV0dXJuIG9iaiBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0Ci0JCQkJCSYmIEFzc29jaWF0aW9uSGVscGVyLmdldFdvcmtQcm9kdWN0VHlwZXMoKFdvcmtQcm9kdWN0KSBvYmopCi0JCQkJCQkJLmlzRW1wdHkoKTsKLQkJfQotCi0JfTsKLQotCXByaXZhdGUgSUZpbHRlciB1bmNhdGVnb3JpemVkUm9sZUZpbHRlciA9IG5ldyBJRmlsdGVyKCkgewotCi0JCXB1YmxpYyBib29sZWFuIGFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCQlyZXR1cm4gb2JqIGluc3RhbmNlb2YgUm9sZQotCQkJCQkmJiBBc3NvY2lhdGlvbkhlbHBlci5nZXRSb2xlU2V0cygoUm9sZSkgb2JqKS5pc0VtcHR5KCk7Ci0JCX0KLQotCX07Ci0KLQlwcml2YXRlIElGaWx0ZXIgdW5jYXRlZ29yaXplZFRvb2xNZW50b3JGaWx0ZXIgPSBuZXcgSUZpbHRlcigpIHsKLQkJcHVibGljIGJvb2xlYW4gYWNjZXB0KE9iamVjdCBvYmopIHsKLQkJCXJldHVybiBvYmogaW5zdGFuY2VvZiBUb29sTWVudG9yCi0JCQkJCSYmIEFzc29jaWF0aW9uSGVscGVyLmdldFRvb2xzKChUb29sTWVudG9yKSBvYmopLmlzRW1wdHkoKTsKLQkJfQotCi0JfTsKLQotCXByaXZhdGUgSUNvbmZpZ3VyYXRvciBjb25maWd1cmF0b3I7Ci0KLQlwcml2YXRlIElGaWx0ZXIgZmlsdGVyOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgTWV0aG9kQ29uZmlndXJhdGlvbkl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWlmIChncm91cEl0ZW1Qcm92aWRlck1hcCAhPSBudWxsKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBncm91cEl0ZW1Qcm92aWRlck1hcC52YWx1ZXMoKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IGFkYXB0ZXIgPSBpdGVyLm5leHQoKTsKLQkJCQlpZiAoYWRhcHRlciBpbnN0YW5jZW9mIElEaXNwb3NhYmxlKSB7Ci0JCQkJCSgoSURpc3Bvc2FibGUpIGFkYXB0ZXIpLmRpc3Bvc2UoKTsKLQkJCQl9Ci0JCQl9Ci0JCQlncm91cEl0ZW1Qcm92aWRlck1hcC5jbGVhcigpOwotCQkJZ3JvdXBJdGVtUHJvdmlkZXJNYXAgPSBudWxsOwotCQl9Ci0KLQkJaWYgKGNoaWxkcmVuICE9IG51bGwpIHsKLQkJCWNoaWxkcmVuLmNsZWFyKCk7Ci0JCQljaGlsZHJlbiA9IG51bGw7Ci0JCX0KLQotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQkvLyBpZihvYmplY3QgaW5zdGFuY2VvZiBNZXRob2RDb25maWd1cmF0aW9uKSB7Ci0JCS8vIHJldHVybiBDb2xsZWN0aW9ucy5zaW5nbGV0b24obmV3Ci0JCS8vIE9iamVjdExpbmtJdGVtUHJvdmlkZXIoYWRhcHRlckZhY3RvcnksIG9iamVjdCwgKE5vdGlmaWVyKSBvYmplY3QpKTsKLQkJLy8gfQotCQkvLyBNZXRob2RDb25maWd1cmF0aW9uIGNvbmYgPSAoTWV0aG9kQ29uZmlndXJhdGlvbikKLQkJLy8gKChPYmplY3RMaW5rSXRlbVByb3ZpZGVyKSBvYmplY3QpLmdldExpbmtlZE9iamVjdCgpOwotCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmYgPSAoTWV0aG9kQ29uZmlndXJhdGlvbikgb2JqZWN0OwotCQlpZiAoY2hpbGRyZW4gPT0gbnVsbCkgewotCQkJY2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlncm91cEl0ZW1Qcm92aWRlck1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCQlTdHJpbmcgbmFtZTsKLQkJCU9iamVjdCB1bmNhdGVnb3JpemVkSW1hZ2U7Ci0JCQlDYXRlZ29yaWVzSXRlbVByb3ZpZGVyIGNoaWxkOwotCi0JCQluYW1lID0gTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJLmdldFN0cmluZygiX1VJX0Rpc2NpcGxpbmVzX2dyb3VwIik7IC8vJE5PTi1OTFMtMSQKLQkJCWNoaWxkID0gbmV3IENhdGVnb3JpZXNJdGVtUHJvdmlkZXIoCi0JCQkJCWFkYXB0ZXJGYWN0b3J5LAotCQkJCQljb25mLAotCQkJCQluYW1lLAotCQkJCQlMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9UYXNrc19jZnYiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlNb2RlbFN0cnVjdHVyZS5ERUZBVUxULmRpc2NpcGxpbmVEZWZpbml0aW9uUGF0aCk7Ci0JCQljaGlsZC5zZXRQYXJlbnQoY29uZik7Ci0JCQljaGlsZC5zZXRVbmNhdGVnb3JpemVkRmlsdGVyKHVuY2F0ZWdvcml6ZWRUYXNrRmlsdGVyKTsKLQkJCWNoaWxkLnNldENhdGVnb3JpemVkRmlsdGVyKGRpc2NpcGxpbmVzRmlsdGVyKTsKLQkJCWNoaWxkLnNldFVuY2F0ZWdvcml6ZWRMYWJlbChMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkuZ2V0U3RyaW5nKCJfVUlfVW5jYXRlZ29yaXplZF9UYXNrc190ZXh0IikpOyAvLyROT04tTkxTLTEkCi0JCQl1bmNhdGVnb3JpemVkSW1hZ2UgPSBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvVGFza3MiKTsgLy8kTk9OLU5MUy0xJAotCQkJY2hpbGQuc2V0VW5jYXRlZ29yaXplZEltYWdlKHVuY2F0ZWdvcml6ZWRJbWFnZSk7Ci0JCQljaGlsZHJlbi5hZGQoY2hpbGQpOwotCQkJZ3JvdXBJdGVtUHJvdmlkZXJNYXAucHV0KG5hbWUsIGNoaWxkKTsKLQotCQkJbmFtZSA9IExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX0RvbWFpbnNfZ3JvdXAiKTsgLy8kTk9OLU5MUy0xJAotCQkJY2hpbGQgPSBuZXcgQ2F0ZWdvcmllc0l0ZW1Qcm92aWRlcihhZGFwdGVyRmFjdG9yeSwgY29uZiwgbmFtZSwKLQkJCQkJTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvRG9tYWlucyIpLCAvLyROT04tTkxTLTEkCi0JCQkJCU1vZGVsU3RydWN0dXJlLkRFRkFVTFQuZG9tYWluUGF0aCk7Ci0JCQljaGlsZC5zZXRQYXJlbnQoY29uZik7Ci0JCQljaGlsZC5zZXRVbmNhdGVnb3JpemVkRmlsdGVyKGRvbWFpblVuY2F0ZWdvcml6ZWRXb3JrUHJvZHVjdEZpbHRlcik7Ci0JCQl1bmNhdGVnb3JpemVkSW1hZ2UgPSBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvV29ya1Byb2R1Y3RzIik7IC8vJE5PTi1OTFMtMSQKLQkJCWNoaWxkLnNldFVuY2F0ZWdvcml6ZWRJbWFnZSh1bmNhdGVnb3JpemVkSW1hZ2UpOwotCQkJY2hpbGQuc2V0Q2F0ZWdvcml6ZWRGaWx0ZXIoZG9tYWluRmlsdGVyKTsKLQkJCWNoaWxkcmVuLmFkZChjaGlsZCk7Ci0JCQlncm91cEl0ZW1Qcm92aWRlck1hcC5wdXQobmFtZSwgY2hpbGQpOwotCi0JCQluYW1lID0gTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJLmdldFN0cmluZygiX1VJX1dvcmtQcm9kdWN0VHlwZXNfZ3JvdXAiKTsgLy8kTk9OLU5MUy0xJAotCQkJY2hpbGQgPSBuZXcgV29ya1Byb2R1Y3RUeXBlc0l0ZW1Qcm92aWRlcihhZGFwdGVyRmFjdG9yeSwgY29uZiwKLQkJCQkJbmFtZSwgTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJCQkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvV29ya1Byb2R1Y3RzIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC53b3JrUHJvZHVjdFR5cGVQYXRoKTsKLQkJCWNoaWxkLnNldFBhcmVudChjb25mKTsKLQkJCWNoaWxkLnNldFVuY2F0ZWdvcml6ZWRGaWx0ZXIod3BUeXBlVW5jYXRlZ29yaXplZFdvcmtQcm9kdWN0RmlsdGVyKTsKLQkJCXVuY2F0ZWdvcml6ZWRJbWFnZSA9IExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9Xb3JrUHJvZHVjdHMiKTsgLy8kTk9OLU5MUy0xJAotCQkJY2hpbGQuc2V0VW5jYXRlZ29yaXplZEltYWdlKHVuY2F0ZWdvcml6ZWRJbWFnZSk7Ci0JCQljaGlsZC5zZXRDYXRlZ29yaXplZEZpbHRlcih3b3JrUHJvZHVjdFR5cGVzRmlsdGVyKTsKLQkJCWNoaWxkcmVuLmFkZChjaGlsZCk7Ci0JCQlncm91cEl0ZW1Qcm92aWRlck1hcC5wdXQobmFtZSwgY2hpbGQpOwotCi0JCQluYW1lID0gTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfUm9sZV9TZXRzX2dyb3VwIik7IC8vJE5PTi1OTFMtMSQKLQkJCWNoaWxkID0gbmV3IENhdGVnb3JpZXNJdGVtUHJvdmlkZXIoYWRhcHRlckZhY3RvcnksIGNvbmYsIG5hbWUsCi0JCQkJCUxpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldEltYWdlKCJmdWxsL29iajE2L1JvbGVzIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC5yb2xlU2V0UGF0aCk7Ci0JCQljaGlsZC5zZXRQYXJlbnQoY29uZik7Ci0JCQljaGlsZC5zZXRVbmNhdGVnb3JpemVkRmlsdGVyKHVuY2F0ZWdvcml6ZWRSb2xlRmlsdGVyKTsKLQkJCWNoaWxkLnNldENhdGVnb3JpemVkRmlsdGVyKHJvbGVTZXRzRmlsdGVyKTsKLQkJCWNoaWxkLnNldFVuY2F0ZWdvcml6ZWRMYWJlbChMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkuZ2V0U3RyaW5nKCJfVUlfVW5jYXRlZ29yaXplZF9Sb2xlc190ZXh0IikpOyAvLyROT04tTkxTLTEkCi0JCQl1bmNhdGVnb3JpemVkSW1hZ2UgPSBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvUm9sZXMiKTsgLy8kTk9OLU5MUy0xJAotCQkJY2hpbGQuc2V0VW5jYXRlZ29yaXplZEltYWdlKHVuY2F0ZWdvcml6ZWRJbWFnZSk7Ci0JCQljaGlsZHJlbi5hZGQoY2hpbGQpOwotCQkJZ3JvdXBJdGVtUHJvdmlkZXJNYXAucHV0KG5hbWUsIGNoaWxkKTsKLQotCQkJbmFtZSA9IExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX1Rvb2xzX2dyb3VwIik7IC8vJE5PTi1OTFMtMSQKLQkJCWNoaWxkID0gbmV3IENhdGVnb3JpZXNJdGVtUHJvdmlkZXIoYWRhcHRlckZhY3RvcnksIGNvbmYsIG5hbWUsCi0JCQkJCUxpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldEltYWdlKCJmdWxsL29iajE2L1Rvb2xzIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC50b29sUGF0aCk7Ci0JCQljaGlsZC5zZXRQYXJlbnQoY29uZik7Ci0JCQljaGlsZC5zZXRDYXRlZ29yaXplZEZpbHRlcih0b29sc0ZpbHRlcik7Ci0JCQljaGlsZC5zZXRVbmNhdGVnb3JpemVkRmlsdGVyKHVuY2F0ZWdvcml6ZWRUb29sTWVudG9yRmlsdGVyKTsKLQkJCXVuY2F0ZWdvcml6ZWRJbWFnZSA9IExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9Ub29scyIpOyAvLyROT04tTkxTLTEkCi0JCQljaGlsZC5zZXRVbmNhdGVnb3JpemVkSW1hZ2UodW5jYXRlZ29yaXplZEltYWdlKTsKLQkJCWNoaWxkcmVuLmFkZChjaGlsZCk7Ci0JCQlncm91cEl0ZW1Qcm92aWRlck1hcC5wdXQobmFtZSwgY2hpbGQpOwotCi0JCQluYW1lID0gTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfUHJvY2Vzc2VzX2dyb3VwIik7IC8vJE5PTi1OTFMtMSQKLQkJCU9iamVjdCBvdGhlckNoaWxkID0gbmV3IFByb2Nlc3Nlc0l0ZW1Qcm92aWRlcihhZGFwdGVyRmFjdG9yeSwgY29uZiwKLQkJCQkJTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVCk7Ci0JCQljaGlsZHJlbi5hZGQob3RoZXJDaGlsZCk7Ci0JCQlncm91cEl0ZW1Qcm92aWRlck1hcC5wdXQobmFtZSwgb3RoZXJDaGlsZCk7Ci0KLQkJCW5hbWUgPSBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkuZ2V0U3RyaW5nKCJfVUlfQ3VzdG9tX0NhdGVnb3JpZXNfZ3JvdXAiKTsgLy8kTk9OLU5MUy0xJAotCQkJY2hpbGQgPSBuZXcgQ2F0ZWdvcmllc0l0ZW1Qcm92aWRlcihhZGFwdGVyRmFjdG9yeSwgY29uZiwgbmFtZSwKLQkJCQkJTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJCQkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvTWV0aG9kUGFja2FnZXMiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlNb2RlbFN0cnVjdHVyZS5ERUZBVUxULmN1c3RvbUNhdGVnb3J5UGF0aCk7Ci0JCQljaGlsZC5zZXRQYXJlbnQoY29uZik7Ci0JCQljaGlsZC5zZXRDYXRlZ29yaXplZEZpbHRlcihjdXN0b21DYXRlZ29yaWVzRmlsdGVyKTsKLQkJCWNoaWxkcmVuLmFkZChjaGlsZCk7Ci0JCQlncm91cEl0ZW1Qcm92aWRlck1hcC5wdXQobmFtZSwgY2hpbGQpOwotCi0JCQluYW1lID0gTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfR3VpZGFuY2VzX2dyb3VwIik7IC8vJE5PTi1OTFMtMSQKLQkJCUd1aWRhbmNlR3JvdXBpbmdJdGVtUHJvdmlkZXIgY2hpbGQxID0gbmV3IEd1aWRhbmNlR3JvdXBpbmdJdGVtUHJvdmlkZXIoCi0JCQkJCWFkYXB0ZXJGYWN0b3J5LCBjb25mKTsKLQkJCWNoaWxkMS5zZXRGaWx0ZXIoZmlsdGVyKTsKLQkJCWNoaWxkcmVuLmFkZChjaGlsZDEpOwotCQkJZ3JvdXBJdGVtUHJvdmlkZXJNYXAucHV0KG5hbWUsIGNoaWxkMSk7Ci0JCX0KLQotCQlyZXR1cm4gY2hpbGRyZW47Ci0JfQotCi0JLy8gLyogKG5vbi1KYXZhZG9jKQotCS8vICogQHNlZQotCS8vIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0RWxlbWVudHMoamF2YS5sYW5nLk9iamVjdCkKLQkvLyAqLwotCS8vIHB1YmxpYyBDb2xsZWN0aW9uIGdldEVsZW1lbnRzKE9iamVjdCBvYmplY3QpIHsKLQkvLyByZXR1cm4gQ29sbGVjdGlvbnMuc2luZ2xldG9uKG9iamVjdCk7Ci0JLy8gfQotCS8vICAgIAotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNoYXNDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIHN1cGVyLmhhc0NoaWxkcmVuKG9iamVjdCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIFRuZ1V0aWwuZ2V0TGFiZWwob2JqZWN0LAotCQkJCWdldFN0cmluZygiX1VJX01ldGhvZENvbmZpZ3VyYXRpb25fdHlwZSIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuSUdyb3VwQ29udGFpbmVyI2dldEdyb3VwSXRlbVByb3ZpZGVyKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRHcm91cEl0ZW1Qcm92aWRlcihTdHJpbmcgbmFtZSkgewotCQlyZXR1cm4gZ3JvdXBJdGVtUHJvdmlkZXJNYXAuZ2V0KG5hbWUpOwotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldE5ld0NoaWxkRGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCwKLQkJCUVkaXRpbmdEb21haW4gZWRpdGluZ0RvbWFpbiwgT2JqZWN0IHNpYmxpbmcpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhYmxlI3NldEZpbHRlcihjb20uaWJtLmxpYnJhcnkuZWRpdC5JRmlsdGVyKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZpbHRlcihJRmlsdGVyIGZpbHRlcikgewotCQkKLQkJaWYgKCAoZmlsdGVyICE9IGNvbmZpZ3VyYXRvcikgJiYgKGZpbHRlciBpbnN0YW5jZW9mIElDb25maWd1cmF0b3IpICkgewotCQkJY29uZmlndXJhdG9yID0gKElDb25maWd1cmF0b3IpIGZpbHRlcjsKLQkJCWlmICggY29uZmlndXJhdG9yICE9IG51bGwgKSB7CQkJCi0JCQkJLy8gY3JlYXRlIHRoZSB1bmNhdGVnb3JpemVkIGZpbHRlcnMuIElmIElDb25maWd1cmF0b3IgaXMgc2V0LCBnZXQgdGhlIGZpbGRlcnMgZnJvbSB0aGVyZS4KLQkJCQkvLyBvdGhlcndpemUsIHVzZSB0aGUgZGVmYXVsdCBvbmUuCi0JCQkJLy8gVGhpcyBpcyBuZWVkZWQgdG8gYWxsb3cgZXh0cmEgdW5jYXRlZ29yaXplZCBlbGVtZW50cyBkdWUgdG8gcmVhbGl6YXRpb24gCi0JCQkJLy8gdG8gc2hvdyB1cCBpbiB0aGUgdW4tY2F0ZWdvcml6ZWQgZm9sZGVyLgotCQkJCS8vIEZvciBleGFtcGxlLCBpZiBhIGRpc2NpcGxlIGlzIHJlcGxhY2VkIGJ5IGFub3RoZXIsIHRoZSB0YXNrcyBpbiB0aGUgcmVwbGFjZWQgZGlzY2lwbGllCi0JCQkJLy8gc2hvdWxkIHNob3cgdXAgaW4gdGhlIHVuLWNhdGVnb3JpemVkIHRhc2tzIGZvbGRlcgotCQkJCS8vIDE1NjQzOCAtIFZhcmlhYmlsaXR5IG9mIGRpc2NpcGxpbmVzIGlzIG5vdCB3b3JraW5nIGNvcnJlY3RseQotCQkJCQotCQkJCXVuY2F0ZWdvcml6ZWRUYXNrRmlsdGVyID0gY29uZmlndXJhdG9yLmdldFVuY2F0ZWdvcml6ZWRUYXNrRmlsdGVyKCk7Ci0JCQkJZG9tYWluVW5jYXRlZ29yaXplZFdvcmtQcm9kdWN0RmlsdGVyID0gY29uZmlndXJhdG9yLmdldERvbWFpblVuY2F0ZWdvcml6ZWRXb3JrUHJvZHVjdEZpbHRlcigpOwotCQkJCXdwVHlwZVVuY2F0ZWdvcml6ZWRXb3JrUHJvZHVjdEZpbHRlciA9IGNvbmZpZ3VyYXRvci5nZXRXcFR5cGVVbmNhdGVnb3JpemVkV29ya1Byb2R1Y3RGaWx0ZXIoKTsKLQkJCQl1bmNhdGVnb3JpemVkUm9sZUZpbHRlciA9IGNvbmZpZ3VyYXRvci5nZXRVbmNhdGVnb3JpemVkUm9sZUZpbHRlcigpOwotCQkJCXVuY2F0ZWdvcml6ZWRUb29sTWVudG9yRmlsdGVyID0gY29uZmlndXJhdG9yLmdldFVuY2F0ZWdvcml6ZWRUb29sTWVudG9yRmlsdGVyKCk7Ci0JCQkJCi0JCQkJLy8gW0J1ZyAxNjI2MDNdIE5ldzogUmVwbGFjaW5nIGRpc2NpcGxpbmVzIGRvIGFwcGVhciBpbnNpZGUgdGhlaXIgcmVwbGFjZWQgZWxlbWVudHMgZGlzY2lwbGluZSBncm91cGluZ3MgYXMgd2VsbCBhcyBvdXRzaWRlIG9mIHRoZSBkaXNjaXBsaW5lIGdyb3VwaW5nCi0JCQkJLy8gbmVlZCB0byBjdXN0b21pemUgdGhlIGZpbHRlcnMgZm9yIGRpc2NpcGxpbmVzIGFuZCByb2xlc2V0cwotCQkJCWRpc2NpcGxpbmVzRmlsdGVyID0gY29uZmlndXJhdG9yLmdldERpc2NpcGxpbmVzRmlsdGVyKCk7Ci0JCQkJcm9sZVNldHNGaWx0ZXIgPSBjb25maWd1cmF0b3IuZ2V0Um9sZVNldHNGaWx0ZXIoKTsKLQkJCQkKLQkJCX0KLQkJfQotCQl0aGlzLmZpbHRlciA9IGZpbHRlcjsKLQkJCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhYmxlI3NldExhYmVsKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGFiZWwoU3RyaW5nIGxhYmVsKSB7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhYmxlI3NldFBhcmVudChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBhcmVudChPYmplY3QgcGFyZW50KSB7Ci0JfQotCi0JLy8gcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IG9iamVjdCkgewotCS8vIHJldHVybiBwbHVnaW47Ci0JLy8gfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLk1ldGhvZENvbmZpZ3VyYXRpb25JdGVtUHJvdmlkZXIjbm90aWZ5Q2hhbmdlZChvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb24pCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQotCQlpZiAoY29uZmlndXJhdG9yICE9IG51bGwpIHsKLQkJCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChNZXRob2RDb25maWd1cmF0aW9uLmNsYXNzKSkgewotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9DT05GSUdVUkFUSU9OX19NRVRIT0RfUExVR0lOX1NFTEVDVElPTjoKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfQ09ORklHVVJBVElPTl9fTUVUSE9EX1BBQ0tBR0VfU0VMRUNUSU9OOgotCQkJCWNvbmZpZ3VyYXRvci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29uZmlndXJhdGlvbi9QcmFjdGljZUl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb25maWd1cmF0aW9uL1ByYWN0aWNlSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4YjM5NzQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb25maWd1cmF0aW9uL1ByYWN0aWNlSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NTYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb25maWd1cmF0aW9uOwotCi1pbXBvcnQgamF2YS5uZXQuVVJJOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRIYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklDb25maWd1cmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUxpYnJhcnlJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuUHJlc2VudGF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuQ2F0ZWdvcnlTb3J0SGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DaGVja2xpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db25jZXB0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudENhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpYmFibGVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRXhhbXBsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkZ1bGZpbGxhYmxlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkd1aWRhbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByYWN0aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUmVwb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUmV1c2FibGVBc3NldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvYWRtYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuU3VwcG9ydGluZ01hdGVyaWFsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFzazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRlbXBsYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGVybURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Ub29sTWVudG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0OwotCi0vKioKLSAqIFRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEgcHJhY3RpY2UuCi0gKiAKLSAqIEBhdXRob3IgV2VpcGluZyBMdQotICogQHNpbmNlIDEuNQotICovCi1wdWJsaWMgY2xhc3MgUHJhY3RpY2VJdGVtUHJvdmlkZXIgZXh0ZW5kcwotCQlvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLlByYWN0aWNlSXRlbVByb3ZpZGVyIGltcGxlbWVudHMKLQkJSUNvbmZpZ3VyYWJsZSwgSUxpYnJhcnlJdGVtUHJvdmlkZXIgewotCi0JcHJpdmF0ZSBJRmlsdGVyIGZpbHRlcjsKLQotCXByaXZhdGUgT2JqZWN0IHBhcmVudDsKLQotCXByaXZhdGUgU3RyaW5nIGxhYmVsOwotCQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBST0FETUFQID0gInJvYWRtYXAiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIENBVEVHT1JJRVMgPSAiY2F0ZWdvcmllcyI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgVU5LTk9XTiA9ICJ1bmtub3duIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIFByYWN0aWNlSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldENoaWxkcmVuKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb248Pz4gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQl9Ci0JCi0JLyoqCi0JICogQHBhcmFtIGNoaWxkcmVuCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uPD8+IGdldE1vZGlmaWVkQ2hpbGRyZW4oT2JqZWN0IHBhcmVudE9iamVjdCwgQ29sbGVjdGlvbiBjaGlsZHJlbikgewotCQlMaXN0IHJldCA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQlHcm91cGluZ0hlbHBlciBncm91cGluZ0hlbHBlciA9IG5ldyBHcm91cGluZ0hlbHBlcih0aGlzKTsKLQkJZ3JvdXBpbmcocGFyZW50T2JqZWN0LCByZXQsIGNoaWxkcmVuLCBncm91cGluZ0hlbHBlcik7Ci0JCQotCQlyZXR1cm4gcmV0OwotCX0KLQkKLQlwcml2YXRlIHZvaWQgZ3JvdXBpbmcoT2JqZWN0IHBhcmVudE9iamVjdCwgTGlzdCByZXQsIENvbGxlY3Rpb24gY2hpbGRyZW4sIAotCQkJR3JvdXBpbmdIZWxwZXIgZ3JvdXBpbmdIZWxwZXIpIHsKLQkJTWFwPFN0cmluZywgTGlzdD4gbWFwID0gZ2V0U3ViR3JvdXBNYXAoY2hpbGRyZW4sIGdyb3VwaW5nSGVscGVyKTsKLQkJCi0JCWJvb2xlYW4gdG9Tb3J0ID0gdHJ1ZTsKLQkJaWYgKHBhcmVudE9iamVjdCBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCU1ldGhvZEVsZW1lbnQgZWxlbSA9IChNZXRob2RFbGVtZW50KSBwYXJlbnRPYmplY3Q7Ci0JCQlpZiAoZWxlbSAhPSBudWxsKSB7Ci0JCQkJdG9Tb3J0ID0gISBDYXRlZ29yeVNvcnRIZWxwZXIuaXNNYW51YWxDYXRlZ29yeVNvcnQoZWxlbSk7Ci0JCQl9Ci0JCX0KLQkJU3RyaW5nW10ga2V5cyA9IGdyb3VwaW5nSGVscGVyLmdldEtleXNJbk9yZGVyKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykgewotCQkJU3RyaW5nIGtleSA9IGtleXNbaV07Ci0JCQlMaXN0IHN1Ymdyb3VwQ2hpbGRyZW4gPSBtYXAuZ2V0KGtleSk7Ci0JCQlpZiAoc3ViZ3JvdXBDaGlsZHJlbiA9PSBudWxsIHx8IHN1Ymdyb3VwQ2hpbGRyZW4uaXNFbXB0eSgpKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlpZiAoZ3JvdXBpbmdIZWxwZXIudG9Hcm91cChrZXksIHN1Ymdyb3VwQ2hpbGRyZW4pKSB7Ci0JCQkJaWYgKHRvU29ydCkgewotCQkJCQlzb3J0KHN1Ymdyb3VwQ2hpbGRyZW4pOwotCQkJCX0KLQkJCQlzdWJncm91cENoaWxkcmVuID0gZ3JvdXBpbmdIZWxwZXIubmVzdGVkR3JvdXBpbmcocGFyZW50T2JqZWN0LCBrZXksIHN1Ymdyb3VwQ2hpbGRyZW4pOwotCQkJCVByYWN0aWNlU3ViZ3JvdXBJdGVtUHJvdmlkZXIgc3ViID0gbmV3IFByYWN0aWNlU3ViZ3JvdXBJdGVtUHJvdmlkZXIoCi0JCQkJCQlnZXRBZGFwdGVyRmFjdG9yeSgpLCBrZXksIGdldEltYWdlT2JqZWN0KGtleSksIHN1Ymdyb3VwQ2hpbGRyZW4sIHBhcmVudE9iamVjdCk7Ci0JCQkJcmV0LmFkZChzdWIpOwotCQkJfSBlbHNlIHsKLQkJCQlpZiAodG9Tb3J0KSB7Ci0JCQkJCXNvcnQoc3ViZ3JvdXBDaGlsZHJlbik7Ci0JCQkJfQotCQkJCXJldC5hZGRBbGwoc3ViZ3JvdXBDaGlsZHJlbik7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgc29ydChMaXN0IHN1Ymdyb3VwQ2hpbGRyZW4pIHsKLQkJaWYgKHN1Ymdyb3VwQ2hpbGRyZW4uc2l6ZSgpID4gMSkgewotCQkJQ29tcGFyYXRvciBjb21wYXJhdG9yID0gUHJlc2VudGF0aW9uQ29udGV4dC5JTlNUQU5DRS5nZXRQcmVzTmFtZUNvbXBhcmF0b3IoKTsKLQkJCUNvbGxlY3Rpb25zLjxGdWxmaWxsYWJsZUVsZW1lbnQ+c29ydChzdWJncm91cENoaWxkcmVuLCBjb21wYXJhdG9yKTsKLQkJfQotCX0JCi0JCi0JcHVibGljIHN0YXRpYyBNYXA8U3RyaW5nLCBMaXN0PiBnZXRTdWJHcm91cE1hcChDb2xsZWN0aW9uIGNoaWxkcmVuLCBHcm91cGluZ0hlbHBlciBncm91cGluZ0hlbHBlcikgewotCQkgTWFwPFN0cmluZywgTGlzdD4gbWFwID0gbmV3IExpbmtlZEhhc2hNYXA8U3RyaW5nLCBMaXN0PigpOyAKLQkJCi0JCWZvciAoT2JqZWN0IGNoaWxkOiBjaGlsZHJlbikgewotCQkJU3RyaW5nIGtleSA9IGdyb3VwaW5nSGVscGVyLmdldFN1Ykdyb3VwTmFtZShjaGlsZCk7Ci0JCQlhZGQobWFwLCBrZXksIGNoaWxkKTsKLQkJfQkJCQkKLQkJCi0JCXJldHVybiBtYXA7Ci0JfQotCQotCXByaXZhdGUgT2JqZWN0IGdldEltYWdlT2JqZWN0KFN0cmluZyBzdWJHcm91cE5hbWUpIHsKLQkJCi0JCVN0cmluZyBpbWFnZVN0ciA9ICJmdWxsL29iajE2L0ZvbGRlciI7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCWlmICh0cnVlKSB7CQkKLQkJCWlmIChzdWJHcm91cE5hbWUuZXF1YWxzKGdldFVJU3RyaW5nKCJfVUlfS2V5X0NvbmNlcHRzIikpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQlpbWFnZVN0ciA9ICJmdWxsL29iajE2L0NvbmNlcHRzIjsgLy8kTk9OLU5MUy0xJAotCQkJfSBlbHNlIGlmIChzdWJHcm91cE5hbWUuZXF1YWxzKGdldFVJU3RyaW5nKCJfVUlfV29ya1Byb2R1Y3RzX2dyb3VwIikpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQlpbWFnZVN0ciA9ICJmdWxsL29iajE2L1dvcmtQcm9kdWN0cyI7IC8vJE5PTi1OTFMtMSQKLQkJCX0gZWxzZSBpZiAoc3ViR3JvdXBOYW1lLmVxdWFscyhnZXRVSVN0cmluZygiX1VJX1Rhc2tzX2dyb3VwIikpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQlpbWFnZVN0ciA9ICJmdWxsL29iajE2L1Rhc2tzIjsgLy8kTk9OLU5MUy0xJAotCQkJfSBlbHNlIGlmIChzdWJHcm91cE5hbWUuZXF1YWxzKGdldFVJU3RyaW5nKCJfVUlfUm9sZXNfZ3JvdXAiKSkpIHsgLy8kTk9OLU5MUy0xJAotCQkJCWltYWdlU3RyID0gImZ1bGwvb2JqMTYvUm9sZXMiOyAvLyROT04tTkxTLTEkCi0JCQl9IGVsc2UgaWYgKHN1Ykdyb3VwTmFtZS5lcXVhbHMoZ2V0VUlTdHJpbmcoIl9VSV9BY3Rpdml0aWVzX2dyb3VwIikpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQlpbWFnZVN0ciA9ICJmdWxsL29iajE2L1Byb2Nlc3NlcyI7IC8vJE5PTi1OTFMtMSQKLQkJCX0gZWxzZSBpZiAoc3ViR3JvdXBOYW1lLmVxdWFscyhnZXRVSVN0cmluZygiX1VJX0d1aWRhbmNlc19ncm91cCIpKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJaW1hZ2VTdHIgPSAiZnVsbC9vYmoxNi9HdWlkYW5jZUZvbGRlciI7IC8vJE5PTi1OTFMtMSQKLQkJCQkKLQkJCQkvL0d1aWRhbmNlIHN1YiBncm91cHMKLQkJCX0gZWxzZSBpZiAoc3ViR3JvdXBOYW1lLmVxdWFscyhnZXRVSVN0cmluZygiX1VJX0d1aWRhbmNlc19DaGVja2xpc3RzIikpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQlpbWFnZVN0ciA9ICJmdWxsL29iajE2L0NoZWNrbGlzdHMiOyAvLyROT04tTkxTLTEkCi0JCQl9IGVsc2UgaWYgKHN1Ykdyb3VwTmFtZS5lcXVhbHMoZ2V0VUlTdHJpbmcoIl9VSV9HdWlkYW5jZXNfRXhhbXBsZXMiKSkpIHsgLy8kTk9OLU5MUy0xJAotCQkJCWltYWdlU3RyID0gImZ1bGwvb2JqMTYvRXhhbXBsZXMiOyAvLyROT04tTkxTLTEkCi0JCQl9IGVsc2UgaWYgKHN1Ykdyb3VwTmFtZS5lcXVhbHMoZ2V0VUlTdHJpbmcoIl9VSV9HdWlkYW5jZXNfUHJhY3RpY2VzIikpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQlpbWFnZVN0ciA9ICJmdWxsL29iajE2L1ByYWN0aWNlcyI7IC8vJE5PTi1OTFMtMSQKLQkJCX0gZWxzZSBpZiAoc3ViR3JvdXBOYW1lLmVxdWFscyhnZXRVSVN0cmluZygiX1VJX0d1aWRhbmNlc19SZXBvcnRzIikpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQlpbWFnZVN0ciA9ICJmdWxsL29iajE2L1JlcG9ydHMiOyAvLyROT04tTkxTLTEkCi0JCQl9IGVsc2UgaWYgKHN1Ykdyb3VwTmFtZS5lcXVhbHMoZ2V0VUlTdHJpbmcoIl9VSV9HdWlkYW5jZXNfUmV1c2FibGVBc3NldHMiKSkpIHsgLy8kTk9OLU5MUy0xJAotCQkJCWltYWdlU3RyID0gImZ1bGwvb2JqMTYvUmV1c2FibGVBc3NldHMiOyAvLyROT04tTkxTLTEkCi0JCQl9IGVsc2UgaWYgKHN1Ykdyb3VwTmFtZS5lcXVhbHMoZ2V0VUlTdHJpbmcoIl9VSV9HdWlkYW5jZXNfU3VwcG9ydGluZ01hdGVyaWFscyIpKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJaW1hZ2VTdHIgPSAiZnVsbC9vYmoxNi9TdXBwb3J0aW5nTWF0ZXJpYWxzIjsgLy8kTk9OLU5MUy0xJAotCQkJfSBlbHNlIGlmIChzdWJHcm91cE5hbWUuZXF1YWxzKGdldFVJU3RyaW5nKCJfVUlfR3VpZGFuY2VzX1RlbXBsYXRlcyIpKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJaW1hZ2VTdHIgPSAiZnVsbC9vYmoxNi9UZW1wbGF0ZXMiOyAvLyROT04tTkxTLTEkCi0JCQl9IGVsc2UgaWYgKHN1Ykdyb3VwTmFtZS5lcXVhbHMoZ2V0VUlTdHJpbmcoIl9VSV9HdWlkYW5jZXNfVG9vbE1lbnRvcnMiKSkpIHsgLy8kTk9OLU5MUy0xJAotCQkJCWltYWdlU3RyID0gImZ1bGwvb2JqMTYvVG9vbE1lbnRvcnMiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQkKLQkJcmV0dXJuIGltYWdlU3RyID09IG51bGwgPyBudWxsIDogTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0SW1hZ2UoaW1hZ2VTdHIpOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0VUlTdHJpbmcoU3RyaW5nIGtleSkgewotCQlyZXR1cm4gTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKGtleSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBhZGQoTWFwPFN0cmluZywgTGlzdD4gbWFwLCBTdHJpbmcga2V5LCBPYmplY3QgdmFsdWUpIHsKLQkJTGlzdCBsaXN0ID0gbWFwLmdldChrZXkpOwotCQlpZiAobGlzdCA9PSBudWxsKSB7Ci0JCQlsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJbWFwLnB1dChrZXksIGxpc3QpOwotCQl9Ci0JCWxpc3QuYWRkKHZhbHVlKTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXROZXdDaGlsZERlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QsCi0JCQlFZGl0aW5nRG9tYWluIGVkaXRpbmdEb21haW4sIE9iamVjdCBzaWJsaW5nKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5QcmFjdGljZUl0ZW1Qcm92aWRlciNnZXRDaGlsZHJlbkZlYXR1cmVzKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5GZWF0dXJlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlbkZlYXR1cmVzID09IG51bGwpIHsKLQkJCWNoaWxkcmVuRmVhdHVyZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQljaGlsZHJlbkZlYXR1cmVzCi0JCQkJCS5hZGQoVW1hUGFja2FnZS5MaXRlcmFscy5QUkFDVElDRV9fQ09OVEVOVF9SRUZFUkVOQ0VTKTsKLQkJCWNoaWxkcmVuRmVhdHVyZXMKLQkJCQkJLmFkZChVbWFQYWNrYWdlLkxpdGVyYWxzLlBSQUNUSUNFX19BQ1RJVklUWV9SRUZFUkVOQ0VTKTsKLQkJCWNoaWxkcmVuRmVhdHVyZXMuYWRkKFVtYVBhY2thZ2UuTGl0ZXJhbHMuUFJBQ1RJQ0VfX1NVQl9QUkFDVElDRVMpOwotCQl9Ci0JCXJldHVybiBjaGlsZHJlbkZlYXR1cmVzOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRQYXJlbnQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3Qgb2JqZWN0KSB7Ci0JCU9iamVjdCBwYXJlbnQgPSBUbmdVdGlsCi0JCQkJLmdldE5hdmlnYXRvclBhcmVudEl0ZW1Qcm92aWRlcigoR3VpZGFuY2UpIG9iamVjdCk7Ci0JCWlmIChwYXJlbnQgPT0gbnVsbCkgewotCQkJcmV0dXJuIHN1cGVyLmdldFBhcmVudChvYmplY3QpOwotCQl9Ci0JCXJldHVybiBwYXJlbnQ7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhYmxlI3NldEZpbHRlcihjb20uaWJtLmxpYnJhcnkuZWRpdC5JRmlsdGVyKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZpbHRlcihJRmlsdGVyIGZpbHRlcikgewotCQl0aGlzLmZpbHRlciA9IGZpbHRlcjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LklDb25maWd1cmFibGUjc2V0UGFyZW50KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgc2V0UGFyZW50KE9iamVjdCBwYXJlbnQpIHsKLQkJdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhYmxlI3NldExhYmVsKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGFiZWwoU3RyaW5nIGxhYmVsKSB7Ci0JCXRoaXMubGFiZWwgPSBsYWJlbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0VGV4dChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBUbmdVdGlsLmdldExhYmVsKG9iamVjdCwgZ2V0U3RyaW5nKCJfVUlfUHJhY3RpY2VfdHlwZSIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgRGVzY3JpYmFibGVFbGVtZW50KSB7Ci0JCQlpZiAoKChEZXNjcmliYWJsZUVsZW1lbnQpIG9iamVjdCkuZ2V0Tm9kZWljb24oKSAhPSBudWxsKSB7Ci0JCQkJVVJJIGltZ1VyaSA9IFRuZ1V0aWwuZ2V0RnVsbFBhdGhvZk5vZGVvclNoYXBlSWNvblVSSSgKLQkJCQkJCShEZXNjcmliYWJsZUVsZW1lbnQpIG9iamVjdCwKLQkJCQkJCSgoRGVzY3JpYmFibGVFbGVtZW50KSBvYmplY3QpLmdldE5vZGVpY29uKCkpOwotCQkJCU9iamVjdCBpbWFnZSA9IExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCQkuZ2V0U2hhcmVkSW1hZ2UoaW1nVXJpKTsKLQkJCQlpZiAoaW1hZ2UgIT0gbnVsbCkKLQkJCQkJcmV0dXJuIGltYWdlOwotCQkJfQotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRJbWFnZShvYmplY3QpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGNsYXNzIEdyb3VwaW5nSGVscGVyIHsKLQkJCi0JCXByaXZhdGUgT2JqZWN0IGdyb3VwZXI7Ci0JCQotCQlwdWJsaWMgR3JvdXBpbmdIZWxwZXIoT2JqZWN0IGdyb3VwZXIpIHsKLQkJCXRoaXMuZ3JvdXBlciA9IGdyb3VwZXI7Ci0JCX0KLQkJCi0JCXByb3RlY3RlZCBPYmplY3QgZ2V0R3JvdXBlcigpIHsKLQkJCXJldHVybiBncm91cGVyOwotCQl9CQkKLQkJCi0JCXByb3RlY3RlZCBTdHJpbmcgZ2V0U3ViR3JvdXBOYW1lKE9iamVjdCBvYmopIHsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBSb2FkbWFwKSB7Ci0JCQkJcmV0dXJuIFJPQURNQVA7Ci0JCQl9Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgQ29uY2VwdCkgewotCQkJCXJldHVybiBnZXRVSVN0cmluZygiX1VJX0tleV9Db25jZXB0cyIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgV29ya1Byb2R1Y3QpIHsKLQkJCQlyZXR1cm4gZ2V0VUlTdHJpbmcoIl9VSV9Xb3JrUHJvZHVjdHNfZ3JvdXAiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFRhc2spIHsKLQkJCQlyZXR1cm4gZ2V0VUlTdHJpbmcoIl9VSV9UYXNrc19ncm91cCIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgUm9sZSkgewotCQkJCXJldHVybiBnZXRVSVN0cmluZygiX1VJX1JvbGVzX2dyb3VwIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWlmIChvYmogaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCXJldHVybiBnZXRVSVN0cmluZygiX1VJX0FjdGl2aXRpZXNfZ3JvdXAiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIEd1aWRhbmNlKSB7CQkJCi0JCQkJcmV0dXJuIGdldFVJU3RyaW5nKCJfVUlfR3VpZGFuY2VzX2dyb3VwIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWlmIChvYmogaW5zdGFuY2VvZiBDb250ZW50Q2F0ZWdvcnkpIHsJCQkKLQkJCQlyZXR1cm4gQ0FURUdPUklFUzsKLQkJCX0KLQkJCQotCQkJcmV0dXJuIFVOS05PV047Ci0JCX0KLQkJCi0JCXB1YmxpYyBTdHJpbmdbXSBnZXRLZXlzSW5PcmRlcigpIHsKLQkJCVN0cmluZ1tdIGtleXMgPSB7Ci0JCQkJCVJPQURNQVAsCi0JCQkJCWdldFVJU3RyaW5nKCJfVUlfS2V5X0NvbmNlcHRzIiksCS8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0VUlTdHJpbmcoIl9VSV9Xb3JrUHJvZHVjdHNfZ3JvdXAiKSwJLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRVSVN0cmluZygiX1VJX1Rhc2tzX2dyb3VwIiksCQkJLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRVSVN0cmluZygiX1VJX0FjdGl2aXRpZXNfZ3JvdXAiKSwJLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRVSVN0cmluZygiX1VJX1JvbGVzX2dyb3VwIiksCQkJLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRVSVN0cmluZygiX1VJX0d1aWRhbmNlc19ncm91cCIpLAkJLy8kTk9OLU5MUy0xJAotCQkJCQlDQVRFR09SSUVTLAotCQkJCQlVTktOT1dOCi0JCQl9OwotCQkJCi0JCQlyZXR1cm4ga2V5czsKLQkJfQotCQkKLQkJcHVibGljIGJvb2xlYW4gdG9Hcm91cChTdHJpbmcga2V5LCBMaXN0IHN1Ymdyb3VwQ2hpbGRyZW4pIHsKLQkJCWlmIChrZXkuZXF1YWxzKFJPQURNQVApIHx8IAotCQkJCWtleS5lcXVhbHMoQ0FURUdPUklFUykgfHwKLQkJCQlrZXkuZXF1YWxzKFVOS05PV04pIHx8Ci0JCQkJc3ViZ3JvdXBDaGlsZHJlbi5zaXplKCkgPCAzKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJCi0JCXB1YmxpYyBMaXN0PD8+IG5lc3RlZEdyb3VwaW5nKE9iamVjdCBwYXJlbnRPYmplY3QsIFN0cmluZyBrZXksIExpc3Q8Pz4gc3ViZ3JvdXBDaGlsZHJlbikgewotCQkJaWYgKCEga2V5LmVxdWFscyhQcmFjdGljZUl0ZW1Qcm92aWRlci5nZXRVSVN0cmluZygiX1VJX0d1aWRhbmNlc19ncm91cCIpKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJcmV0dXJuIHN1Ymdyb3VwQ2hpbGRyZW47Ci0JCQl9Ci0JCQkKLQkJCUxpc3QgcmV0ID0gbmV3IEFycmF5TGlzdDxPYmplY3Q+KCk7Ci0JCQkKLQkJCUdyb3VwaW5nSGVscGVyIGdyb3VwaW5nSGVscGVyID0gbmV3IEd1aWRhbmNlR3JvdXBpbmdIZWxwZXIoZ3JvdXBlcik7Ci0JCQlncm91cGluZyhwYXJlbnRPYmplY3QsIHJldCwgc3ViZ3JvdXBDaGlsZHJlbiwgZ3JvdXBpbmdIZWxwZXIpOwotCQkJCi0JCQlyZXR1cm4gcmV0OwotCQl9Ci0JCQotCQlwcm90ZWN0ZWQgdm9pZCBncm91cGluZyhPYmplY3QgcGFyZW50T2JqZWN0LCBMaXN0IHJldCwKLQkJCQlDb2xsZWN0aW9uIGNoaWxkcmVuLCBHcm91cGluZ0hlbHBlciBncm91cGluZ0hlbHBlcikgewotCQkJaWYgKGdyb3VwZXIgaW5zdGFuY2VvZiBQcmFjdGljZUl0ZW1Qcm92aWRlcikgewotCQkJCSgoUHJhY3RpY2VJdGVtUHJvdmlkZXIpIGdyb3VwZXIpLmdyb3VwaW5nKHBhcmVudE9iamVjdCwgcmV0LAotCQkJCQkJY2hpbGRyZW4sIGdyb3VwaW5nSGVscGVyKTsKLQkJCX0KLQkJfQkJCi0JfQotCQotCXB1YmxpYyBzdGF0aWMgY2xhc3MgR3VpZGFuY2VHcm91cGluZ0hlbHBlciBleHRlbmRzIEdyb3VwaW5nSGVscGVyIHsKLQkJcHVibGljIEd1aWRhbmNlR3JvdXBpbmdIZWxwZXIoT2JqZWN0IGdyb3VwZXIpIHsKLQkJCXN1cGVyKGdyb3VwZXIpOwotCQl9Ci0JCQotCQlwcm90ZWN0ZWQgU3RyaW5nIGdldFN1Ykdyb3VwTmFtZShPYmplY3Qgb2JqKSB7Ci0JCQkKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBDaGVja2xpc3QpIHsKLQkJCQlyZXR1cm4gZ2V0VUlTdHJpbmcoIl9VSV9HdWlkYW5jZXNfQ2hlY2tsaXN0cyIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgRXhhbXBsZSkgewotCQkJCXJldHVybiBnZXRVSVN0cmluZygiX1VJX0d1aWRhbmNlc19FeGFtcGxlcyIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgUHJhY3RpY2UpIHsKLQkJCQlyZXR1cm4gZ2V0VUlTdHJpbmcoIl9VSV9HdWlkYW5jZXNfUHJhY3RpY2VzIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWlmIChvYmogaW5zdGFuY2VvZiBSZXBvcnQpIHsKLQkJCQlyZXR1cm4gZ2V0VUlTdHJpbmcoIl9VSV9HdWlkYW5jZXNfUmVwb3J0cyIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQkKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBSZXVzYWJsZUFzc2V0KSB7Ci0JCQkJcmV0dXJuIGdldFVJU3RyaW5nKCJfVUlfR3VpZGFuY2VzX1JldXNhYmxlQXNzZXRzIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWlmIChvYmogaW5zdGFuY2VvZiBTdXBwb3J0aW5nTWF0ZXJpYWwpIHsKLQkJCQlyZXR1cm4gZ2V0VUlTdHJpbmcoIl9VSV9HdWlkYW5jZXNfU3VwcG9ydGluZ01hdGVyaWFscyIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgVGVtcGxhdGUpIHsKLQkJCQlyZXR1cm4gZ2V0VUlTdHJpbmcoIl9VSV9HdWlkYW5jZXNfVGVtcGxhdGVzIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWlmIChvYmogaW5zdGFuY2VvZiBUZXJtRGVmaW5pdGlvbikgewotCQkJCXJldHVybiBnZXRVSVN0cmluZygiX1VJX0d1aWRhbmNlc19UZXJtRGVmaW5pdGlvbnMiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJCi0JCQlpZiAob2JqIGluc3RhbmNlb2YgVG9vbE1lbnRvcikgewotCQkJCXJldHVybiBnZXRVSVN0cmluZygiX1VJX0d1aWRhbmNlc19Ub29sTWVudG9ycyIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQkKLQkJCXJldHVybiBVTktOT1dOOwotCQkJCi0JCX0KLQkJCi0JCXB1YmxpYyBTdHJpbmdbXSBnZXRLZXlzSW5PcmRlcigpIHsKLQkJCVN0cmluZ1tdIGtleXMgPSB7Ci0JCQkJCWdldFVJU3RyaW5nKCJfVUlfR3VpZGFuY2VzX0NoZWNrbGlzdHMiKSwJLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRVSVN0cmluZygiX1VJX0d1aWRhbmNlc19FeGFtcGxlcyIpLAkvLyROT04tTkxTLTEkCi0JCQkJCWdldFVJU3RyaW5nKCJfVUlfR3VpZGFuY2VzX1ByYWN0aWNlcyIpLAkJCS8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0VUlTdHJpbmcoIl9VSV9HdWlkYW5jZXNfUmVwb3J0cyIpLAkvLyROT04tTkxTLTEkCi0JCQkJCWdldFVJU3RyaW5nKCJfVUlfR3VpZGFuY2VzX1JldXNhYmxlQXNzZXRzIiksCQkJLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRVSVN0cmluZygiX1VJX0d1aWRhbmNlc19TdXBwb3J0aW5nTWF0ZXJpYWxzIiksCQkvLyROT04tTkxTLTEkCi0JCQkJCWdldFVJU3RyaW5nKCJfVUlfR3VpZGFuY2VzX1RlbXBsYXRlcyIpLAkJLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRVSVN0cmluZygiX1VJX0d1aWRhbmNlc19Ub29sTWVudG9ycyIpLAkJLy8kTk9OLU5MUy0xJAotCQkJCQlVTktOT1dOCQkJCQotCQkJfTsKLQkJCQotCQkJcmV0dXJuIGtleXM7Ci0JCX0KLQkJCi0JCXB1YmxpYyBib29sZWFuIHRvR3JvdXAoU3RyaW5nIGtleSwgTGlzdCBzdWJncm91cENoaWxkcmVuKSB7Ci0JCQlpZiAoa2V5LmVxdWFscyhVTktOT1dOKSB8fCAKLQkJCQlzdWJncm91cENoaWxkcmVuLnNpemUoKSA8IDMpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQkKLQkJcHVibGljIExpc3Q8Pz4gbmVzdGVkR3JvdXBpbmcoT2JqZWN0IHBhcmVudE9iamVjdCwgU3RyaW5nIGtleSwgTGlzdDw/PiBzdWJncm91cENoaWxkcmVuKSB7Ci0JCQlyZXR1cm4gc3ViZ3JvdXBDaGlsZHJlbjsKLQkJfQotCi0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb25maWd1cmF0aW9uL1ByYWN0aWNlU3ViZ3JvdXBJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29uZmlndXJhdGlvbi9QcmFjdGljZVN1Ymdyb3VwSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzY2YxNGYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb25maWd1cmF0aW9uL1ByYWN0aWNlU3ViZ3JvdXBJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzOCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbmZpZ3VyYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5QcmFjdGljZTsKLQotLyoqCi0gKiBUaGUgYmFzZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgY2xhc3MgZm9yIHRoZSBzdGFuZGFyZCBjYXRlZ29yaWVzIGluCi0gKiBhIGNvbmZpZ3VyYXRpb24uCi0gKiAKLSAqIEBhdXRob3IgV2VpcGluZyBMdQotICogQHNpbmNlIDEuNQotICovCi1wdWJsaWMgY2xhc3MgUHJhY3RpY2VTdWJncm91cEl0ZW1Qcm92aWRlciBleHRlbmRzIEl0ZW1Qcm92aWRlckFkYXB0ZXIgaW1wbGVtZW50cwotCQlJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSUl0ZW1MYWJlbFByb3ZpZGVyLCBJQ29uZmlndXJhYmxlIHsKLQotCXByaXZhdGUgU3RyaW5nIGxhYmVsOwotCi0JcHJpdmF0ZSBPYmplY3QgcGFyZW50OwotCQotCXByaXZhdGUgTGlzdCBjaGlsZHJlbjsKLQotCXByb3RlY3RlZCBJRmlsdGVyIGZpbHRlcjsKLQotCXByaXZhdGUgT2JqZWN0IGltYWdlOwotCQotCXByaXZhdGUgUHJhY3RpY2UgcHJhY3RpY2U7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBQcmFjdGljZVN1Ymdyb3VwSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LAotCQkJU3RyaW5nIG5hbWUsIE9iamVjdCBpbWFnZSwgTGlzdCBjaGlsZHJlbiwgT2JqZWN0IHBhcmVudE9iamVjdCkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JCWxhYmVsID0gbmFtZTsKLQkJdGhpcy5pbWFnZSA9IGltYWdlOwotCQl0aGlzLmNoaWxkcmVuID0gY2hpbGRyZW47Ci0JCWlmIChwYXJlbnRPYmplY3QgaW5zdGFuY2VvZiBQcmFjdGljZSkgewotCQkJcHJhY3RpY2UgPSAoUHJhY3RpY2UpIHBhcmVudE9iamVjdDsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIGNoaWxkcmVuID09IG51bGwgPyBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUIDogY2hpbGRyZW47Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldFBhcmVudChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKHBhcmVudCAhPSBudWxsKQotCQkJcmV0dXJuIHBhcmVudDsKLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIEVPYmplY3QpIHsKLQkJCXJldHVybiBzdXBlci5nZXRQYXJlbnQob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0SW1hZ2UoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIGltYWdlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRUZXh0KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGxhYmVsICE9IG51bGwpCi0JCQlyZXR1cm4gbGFiZWw7Ci0JCXJldHVybiBzdXBlci5nZXRUZXh0KG9iamVjdCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhYmxlI3NldEZpbHRlcihjb20uaWJtLmxpYnJhcnkuZWRpdC5JRmlsdGVyKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZpbHRlcihJRmlsdGVyIGZpbHRlcikgewotCQl0aGlzLmZpbHRlciA9IGZpbHRlcjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LklDb25maWd1cmFibGUjc2V0TGFiZWwoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMYWJlbChTdHJpbmcgbGFiZWwpIHsKLQkJdGhpcy5sYWJlbCA9IGxhYmVsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYWJsZSNzZXRQYXJlbnQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQYXJlbnQoT2JqZWN0IHBhcmVudCkgewotCQl0aGlzLnBhcmVudCA9IHBhcmVudDsKLQl9Ci0KLQlwdWJsaWMgUHJhY3RpY2UgZ2V0UHJhY3RpY2UoKSB7Ci0JCXJldHVybiBwcmFjdGljZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29uZmlndXJhdGlvbi9Qcm9jZXNzQ29tcG9uZW50SXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbmZpZ3VyYXRpb24vUHJvY2Vzc0NvbXBvbmVudEl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2M2NjNjAyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29uZmlndXJhdGlvbi9Qcm9jZXNzQ29tcG9uZW50SXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbmZpZ3VyYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogVGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSBwcm9jZXNzIGNvbXBvbmVudCBpbiB0aGUgQ29uZmlndXJhdGlvbiB2aWV3LgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9jZXNzQ29tcG9uZW50SXRlbVByb3ZpZGVyIGV4dGVuZHMKLQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5Qcm9jZXNzQ29tcG9uZW50SXRlbVByb3ZpZGVyIHsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFByb2Nlc3NDb21wb25lbnRJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhqYXZhLnV0aWwuQ29sbGVjdGlvbiwKLQkgKiAgICAgIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLAotCQkJT2JqZWN0IG9iamVjdCkgewotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRDaGlsZHJlbkZlYXR1cmVzKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5GZWF0dXJlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlbkZlYXR1cmVzID09IG51bGwpIHsKLQkJCWNoaWxkcmVuRmVhdHVyZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQljaGlsZHJlbkZlYXR1cmVzLmFkZChVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkuZ2V0UHJvY2Vzc0NvbXBvbmVudF9Qcm9jZXNzKCkpOwotCQl9Ci0JCXJldHVybiBjaGlsZHJlbkZlYXR1cmVzOwotCX0KLQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoUHJvY2Vzc0NvbXBvbmVudC5jbGFzcykpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX19OQU1FOgotCQkJUHJvY2Vzc0NvbXBvbmVudCBwYyA9IChQcm9jZXNzQ29tcG9uZW50KSBub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKTsKLQkJCWlmIChwYy5nZXRQcm9jZXNzKCkgIT0gbnVsbCkgewotCQkJCWJvb2xlYW4gb2xkID0gcGMuZ2V0UHJvY2VzcygpLmVEZWxpdmVyKCk7Ci0JCQkJdHJ5IHsKLQkJCQkJcGMuZ2V0UHJvY2VzcygpLmVTZXREZWxpdmVyKGZhbHNlKTsKLQkJCQkJcGMuZ2V0UHJvY2VzcygpLnNldE5hbWUocGMuZ2V0TmFtZSgpKTsKLQkJCQl9IGZpbmFsbHkgewotCQkJCQlwYy5nZXRQcm9jZXNzKCkuZVNldERlbGl2ZXIob2xkKTsKLQkJCQl9Ci0JCQl9Ci0JCQlicmVhazsKLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldFRleHQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gVG5nVXRpbC5nZXRMYWJlbChvYmplY3QsIGdldFN0cmluZygiX1VJX1Byb2Nlc3NDb21wb25lbnRfdHlwZSIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb25maWd1cmF0aW9uL1Byb2Nlc3NQYWNrYWdlSXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbmZpZ3VyYXRpb24vUHJvY2Vzc1BhY2thZ2VJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjI0ODA3OS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbmZpZ3VyYXRpb24vUHJvY2Vzc1BhY2thZ2VJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbmZpZ3VyYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklDb25maWd1cmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Qcm9jZXNzVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc1BhY2thZ2U7Ci0KLS8qKgotICogVGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSBwcm9jZXNzIHBhY2thZ2UgaW4gdGhlIENvbmZpZ3VyYXRpb24gdmlldy4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUHJvY2Vzc1BhY2thZ2VJdGVtUHJvdmlkZXIgZXh0ZW5kcwotCQlvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lm5hdmlnYXRvci5Qcm9jZXNzUGFja2FnZUl0ZW1Qcm92aWRlcgotCQlpbXBsZW1lbnRzIElDb25maWd1cmFibGUgewotCi0JcHJpdmF0ZSBJRmlsdGVyIGZpbHRlcjsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFByb2Nlc3NQYWNrYWdlSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHRBc0NoaWxkKFByb2Nlc3MgcHJvY2VzcykgewotCQlyZXR1cm4gIVRuZ1V0aWwuaXNDb250cmlidXRvck9yUmVwbGFjZXIocHJvY2VzcykKLQkJCQkmJiAhcHJvY2Vzcy5nZXRTdXBwcmVzc2VkKCkuYm9vbGVhblZhbHVlKCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNvbGxlY3RDaGlsZHJlbihDb2xsZWN0aW9uIGNoaWxkcmVuLCBPYmplY3QgZWxlbWVudCwKLQkJCUlGaWx0ZXIgZmlsdGVyKSB7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkgewotCQkJUHJvY2VzcyBwcm9jZXNzID0gKChQcm9jZXNzQ29tcG9uZW50KSBlbGVtZW50KS5nZXRQcm9jZXNzKCk7Ci0JCQlpZiAocHJvY2VzcyAhPSBudWxsKSB7Ci0JCQkJaWYgKGZpbHRlciBpbnN0YW5jZW9mIElDb25maWd1cmF0b3IpIHsKLQkJCQkJT2JqZWN0IGNoaWxkID0gKChJQ29uZmlndXJhdG9yKSBmaWx0ZXIpLnJlc29sdmUocHJvY2Vzcyk7Ci0JCQkJCWlmICghY2hpbGRyZW4uY29udGFpbnMoY2hpbGQpICYmIGZpbHRlci5hY2NlcHQoY2hpbGQpKSB7Ci0JCQkJCQljaGlsZHJlbi5hZGQoY2hpbGQpOwotCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgaWYgKGZpbHRlciA9PSBudWxsIHx8IGZpbHRlci5hY2NlcHQocHJvY2VzcykpIHsKLQkJCQkJY2hpbGRyZW4uYWRkKHByb2Nlc3MpOwotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFByb2Nlc3NQYWNrYWdlKSB7Ci0JCQlpZiAoZmlsdGVyID09IG51bGwgfHwgZmlsdGVyLmFjY2VwdChlbGVtZW50KSkgewotCQkJCWNoaWxkcmVuLmFkZChlbGVtZW50KTsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGNvbGxlY3RDaGlsZHJlbihDb2xsZWN0aW9uIGNoaWxkcmVuLCBPYmplY3QgZWxlbWVudCkgewotCQlyZXR1cm4gY29sbGVjdENoaWxkcmVuKGNoaWxkcmVuLCBlbGVtZW50LCBmaWx0ZXIpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5Qcm9jZXNzUGFja2FnZUl0ZW1Qcm92aWRlciNnZXRDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJQXJyYXlMaXN0IGNoaWxkcmVuID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBzdXBlci5nZXRDaGlsZHJlbihvYmplY3QpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkuaGFzTmV4dCgpOykgewotCQkJY29sbGVjdENoaWxkcmVuKGNoaWxkcmVuLCBpdGVyLm5leHQoKSk7Ci0JCX0KLQotCQkvLyBzZXQgcGFyZW50IGZvciB0aGUgY29sbGVjdGVkIGNoaWxkcmVuCi0JCS8vCi0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGNoaWxkcmVuLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGNoaWxkID0gaXRlci5uZXh0KCk7Ci0JCQlQcm9jZXNzVXRpbC5zZXRQYXJlbnQoY2hpbGQsIG9iamVjdCwgYWRhcHRlckZhY3RvcnkpOwotCQl9Ci0KLQkJcmV0dXJuIGNoaWxkcmVuOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNoYXNDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJQXJyYXlMaXN0IGNoaWxkcmVuID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBzdXBlci5nZXRDaGlsZHJlbihvYmplY3QpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkuaGFzTmV4dCgpOykgewotCQkJaWYgKGNvbGxlY3RDaGlsZHJlbihjaGlsZHJlbiwgaXRlci5uZXh0KCkpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhYmxlI3NldEZpbHRlcihvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXIpCi0JICovCi0JcHVibGljIHZvaWQgc2V0RmlsdGVyKElGaWx0ZXIgZmlsdGVyKSB7Ci0JCXRoaXMuZmlsdGVyID0gZmlsdGVyOwotCQlpZiAoZmlsdGVyIGluc3RhbmNlb2YgSUNvbmZpZ3VyYXRvcikgewotCQkJKChJQ29uZmlndXJhdG9yKSBmaWx0ZXIpLmdldE1ldGhvZENvbmZpZ3VyYXRpb24oKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb25maWd1cmF0aW9uL1Byb2Nlc3Nlc0l0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb25maWd1cmF0aW9uL1Byb2Nlc3Nlc0l0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMzNjYTk3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29uZmlndXJhdGlvbi9Qcm9jZXNzZXNJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbmZpZ3VyYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUxpYnJhcnlJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lm5hdmlnYXRvci5BYnN0cmFjdFByb2Nlc3Nlc0l0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuTW9kZWxTdHJ1Y3R1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudDsKLQotLyoqCi0gKiBUaGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciB0aGUgIlByb2Nlc3NlcyIgZm9sZGVyIGluIHRoZSBDb25maWd1cmF0aW9uCi0gKiB2aWV3LgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9jZXNzZXNJdGVtUHJvdmlkZXIgZXh0ZW5kcyBBYnN0cmFjdFByb2Nlc3Nlc0l0ZW1Qcm92aWRlcgotCQlpbXBsZW1lbnRzIElMaWJyYXJ5SXRlbVByb3ZpZGVyIHsKLQlwcml2YXRlIE1ldGhvZENvbmZpZ3VyYXRpb24gbWV0aG9kQ29uZmlnOwotCi0JcHJpdmF0ZSBJRmlsdGVyIGZpbHRlcjsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFByb2Nlc3Nlc0l0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwKLQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gbWV0aG9kQ29uZmlnLCBNb2RlbFN0cnVjdHVyZSBtb2RlbFN0cnVjdCkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSwgbW9kZWxTdHJ1Y3QpOwotCQl0aGlzLm1ldGhvZENvbmZpZyA9IG1ldGhvZENvbmZpZzsKLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlbiA9PSBudWxsKSB7Ci0JCQljaGlsZHJlbiA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQkJaWYgKGdyb3VwSXRlbVByb3ZpZGVyTWFwID09IG51bGwpIHsKLQkJCQlncm91cEl0ZW1Qcm92aWRlck1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCQl9Ci0KLQkJCWZpbHRlciA9IG5ldyBJRmlsdGVyKCkgewotCi0JCQkJcHVibGljIGJvb2xlYW4gYWNjZXB0KE9iamVjdCBvYmopIHsKLQkJCQkJcmV0dXJuIG9iaiBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQ7Ci0JCQkJfQotCi0JCQl9OwotCi0JCQlPYmplY3QgaW1hZ2UgPSBMaWJyYXJ5RWRpdFBsdWdpbi5nZXRQbHVnaW4oKS5nZXRJbWFnZSgKLQkJCQkJImZ1bGwvb2JqMTYvQ2FwYWJpbGl0eVBhdHRlcm5zIik7IC8vJE5PTi1OTFMtMSQKLQkJCVN0cmluZyBuYW1lID0gTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJLmdldFN0cmluZygiX1VJX0NhcGFiaWxpdHlQYXR0ZXJuc190ZXh0Iik7IC8vJE5PTi1OTFMtMSQKLQkJCUNhdGVnb3JpemVkUHJvY2Vzc2VzSXRlbVByb3ZpZGVyIGNoaWxkID0gbmV3IENhdGVnb3JpemVkUHJvY2Vzc2VzSXRlbVByb3ZpZGVyKAotCQkJCQlhZGFwdGVyRmFjdG9yeSwgbWV0aG9kQ29uZmlnLCBuYW1lLCBpbWFnZSwKLQkJCQkJbW9kZWxTdHJ1Y3QuY2FwYWJpbGl0eVBhdHRlcm5QYXRoKTsKLQkJCWNoaWxkLnNldEZpbHRlcihmaWx0ZXIpOwotCQkJY2hpbGRyZW4uYWRkKGNoaWxkKTsKLQkJCWdyb3VwSXRlbVByb3ZpZGVyTWFwLnB1dChuYW1lLCBjaGlsZCk7Ci0KLQkJCWltYWdlID0gTGlicmFyeUVkaXRQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0SW1hZ2UoCi0JCQkJCSJmdWxsL29iajE2L0RlbGl2ZXJ5UHJvY2Vzc2VzIik7IC8vJE5PTi1OTFMtMSQKLQkJCW5hbWUgPSBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkuZ2V0U3RyaW5nKCJfVUlfRGVsaXZlcnlQcm9jZXNzZXNfdGV4dCIpOyAvLyROT04tTkxTLTEkCi0JCQljaGlsZCA9IG5ldyBDYXRlZ29yaXplZFByb2Nlc3Nlc0l0ZW1Qcm92aWRlcihhZGFwdGVyRmFjdG9yeSwKLQkJCQkJbWV0aG9kQ29uZmlnLCBuYW1lLCBpbWFnZSwgbW9kZWxTdHJ1Y3QuZGVsaXZlcnlQcm9jZXNzUGF0aCk7Ci0JCQljaGlsZC5zZXRGaWx0ZXIoZmlsdGVyKTsKLQkJCWNoaWxkcmVuLmFkZChjaGlsZCk7Ci0JCQlncm91cEl0ZW1Qcm92aWRlck1hcC5wdXQobmFtZSwgY2hpbGQpOwotCQl9Ci0KLQkJcmV0dXJuIGNoaWxkcmVuOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRQYXJlbnQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBtZXRob2RDb25maWc7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UGFyZW50KE9iamVjdCBwYXJlbnQpIHsKLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbkZlYXR1cmVzKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIHN1cGVyLmdldENoaWxkcmVuRmVhdHVyZXMob2JqZWN0KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29uZmlndXJhdGlvbi9Sb2xlU2V0SXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbmZpZ3VyYXRpb24vUm9sZVNldEl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjY2RiZDc0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29uZmlndXJhdGlvbi9Sb2xlU2V0SXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbmZpZ3VyYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIFRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEgcm9sZSBzZXQgaW4gdGhlIENvbmZpZ3VyYXRpb24gdmlldy4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUm9sZVNldEl0ZW1Qcm92aWRlciBleHRlbmRzCi0JCW9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY2F0ZWdvcnkuUm9sZVNldEl0ZW1Qcm92aWRlciB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBSb2xlU2V0SXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LmNhdGVnb3J5LlJvbGVTZXRJdGVtUHJvdmlkZXIjZ2V0Q2hpbGRyZW5GZWF0dXJlcyhqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuRmVhdHVyZXMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoY2hpbGRyZW5GZWF0dXJlcyA9PSBudWxsKSB7Ci0JCQljaGlsZHJlbkZlYXR1cmVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJY2hpbGRyZW5GZWF0dXJlcy5hZGQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Um9sZVNldF9Sb2xlcygpKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW5GZWF0dXJlczsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29uZmlndXJhdGlvbi9VbmNhdGVnb3JpemVkSXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbmZpZ3VyYXRpb24vVW5jYXRlZ29yaXplZEl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMDlmOWI0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29uZmlndXJhdGlvbi9VbmNhdGVnb3JpemVkSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb25maWd1cmF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLQotLyoqCi0gKiBUaGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciB0aGUgdW5jYXRlZ29yaXplZCBmb2xkZXJzIGFuZCBlbGVtZW50cyBpbiB0aGUKLSAqIENvbmZpZ3VyYXRpb24gdmlldy4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgVW5jYXRlZ29yaXplZEl0ZW1Qcm92aWRlciBleHRlbmRzIEl0ZW1Qcm92aWRlckFkYXB0ZXIgaW1wbGVtZW50cwotCQlJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSwKLQkJSUNvbmZpZ3VyYWJsZSB7Ci0KLQlwcm90ZWN0ZWQgTGlzdCBjaGlsZHJlbjsKLQotCXByb3RlY3RlZCBNZXRob2RDb25maWd1cmF0aW9uIG1ldGhvZENvbmZpZzsKLQotCXByaXZhdGUgSUZpbHRlciBmaWx0ZXI7Ci0KLQlwcml2YXRlIFN0cmluZyBsYWJlbDsKLQotCXByaXZhdGUgSUZpbHRlciB1bmNhdGVnb3JpemVkRmlsdGVyOwotCi0JcHJpdmF0ZSBPYmplY3QgaW1hZ2U7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBVbmNhdGVnb3JpemVkSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LAotCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBtZXRob2RDb25maWcsIElGaWx0ZXIgZmlsdGVyLCBTdHJpbmcgbGFiZWwsCi0JCQlPYmplY3QgaW1hZ2UpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCQl0aGlzLm1ldGhvZENvbmZpZyA9IG1ldGhvZENvbmZpZzsKLQkJdGhpcy51bmNhdGVnb3JpemVkRmlsdGVyID0gZmlsdGVyOwotCQl0aGlzLmxhYmVsID0gbGFiZWw7Ci0JCXRoaXMuaW1hZ2UgPSBpbWFnZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgTWV0aG9kQ29uZmlndXJhdGlvbkVsZW1lbnRMaXN0IGNyZWF0ZU1ldGhvZENvbmZpZ3VyYXRpb25FbGVtZW50TGlzdCgKLQkJCUxpc3QgZmlsdGVyTGlzdCkgewotCQlyZXR1cm4gbmV3IE1ldGhvZENvbmZpZ3VyYXRpb25FbGVtZW50TGlzdChtZXRob2RDb25maWcsIGZpbHRlckxpc3QpOwotCX0KLQotCXByb3RlY3RlZCBMaXN0IGNyZWF0ZUZpbHRlckxpc3QoKSB7Ci0JCUFycmF5TGlzdCBmaWx0ZXJMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlpZiAodW5jYXRlZ29yaXplZEZpbHRlciAhPSBudWxsKSB7Ci0JCQlmaWx0ZXJMaXN0LmFkZCh1bmNhdGVnb3JpemVkRmlsdGVyKTsKLQkJfQotCQlpZiAoZmlsdGVyICE9IG51bGwpIHsKLQkJCWZpbHRlckxpc3QuYWRkKGZpbHRlcik7Ci0JCX0KLQkJcmV0dXJuIGZpbHRlckxpc3Q7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldENoaWxkcmVuKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gY3JlYXRlTWV0aG9kQ29uZmlndXJhdGlvbkVsZW1lbnRMaXN0KGNyZWF0ZUZpbHRlckxpc3QoKSkKLQkJCQkuZ2V0TGlzdCgpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNoYXNDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJLy8gQWx3YXlzIHJldHVybiB0cnVlIHRvIGF2b2lkIGV4cGVuc2l2ZSBjYWxsIHRvIGdldENoaWxkcmVuKCkgdGhhdCB3YWxrCi0JCS8vIHRocnUgdGhlCi0JCS8vIHdob2xlIGxpYnJhcnkgdG8gZmluZCBhbGwgdGhlIHRhc2tzIHRoYXQgaXMgbm90IGFzc2lnbmVkIHRvIGFueQotCQkvLyBkaXNjaXBsaW5lLgotCQkvLwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0VGV4dChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChsYWJlbCAhPSBudWxsKQotCQkJcmV0dXJuIGxhYmVsOwotCQlyZXR1cm4gTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfVW5jYXRlZ29yaXplZF90ZXh0Iik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0TmV3Q2hpbGREZXNjcmlwdG9ycyhqYXZhLmxhbmcuT2JqZWN0LAotCSAqICAgICAgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW4sIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0TmV3Q2hpbGREZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0LAotCQkJRWRpdGluZ0RvbWFpbiBlZGl0aW5nRG9tYWluLCBPYmplY3Qgc2libGluZykgewotCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0UGFyZW50KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0SW1hZ2UoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGltYWdlICE9IG51bGwpCi0JCQlyZXR1cm4gaW1hZ2U7Ci0JCXJldHVybiBzdXBlci5nZXRJbWFnZShvYmplY3QpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYWJsZSNzZXRGaWx0ZXIoY29tLmlibS5saWJyYXJ5LmVkaXQuSUZpbHRlcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGaWx0ZXIoSUZpbHRlciBmaWx0ZXIpIHsKLQkJdGhpcy5maWx0ZXIgPSBmaWx0ZXI7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhYmxlI3NldExhYmVsKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGFiZWwoU3RyaW5nIGxhYmVsKSB7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhYmxlI3NldFBhcmVudChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBhcmVudChPYmplY3QgcGFyZW50KSB7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbmZpZ3VyYXRpb24vV29ya1Byb2R1Y3RUeXBlc0l0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb25maWd1cmF0aW9uL1dvcmtQcm9kdWN0VHlwZXNJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWNjMDI0MC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbmZpZ3VyYXRpb24vV29ya1Byb2R1Y3RUeXBlc0l0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29uZmlndXJhdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5EZWxlZ2F0aW5nV3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JV3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuV3JhcHBlck1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BcnRpZmFjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLQotLyoqCi0gKiBUaGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciB0aGUgIldvcmsgUHJvZHVjdCBLaW5kcyIgZm9sZGVyIGluIHRoZQotICogQ29uZmlndXJhdGlvbiB2aWV3LgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBXb3JrUHJvZHVjdFR5cGVzSXRlbVByb3ZpZGVyIGV4dGVuZHMgQ2F0ZWdvcmllc0l0ZW1Qcm92aWRlciB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBXb3JrUHJvZHVjdFR5cGVzSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LAotCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBtZXRob2RDb25maWcsIFN0cmluZyBuYW1lLCBPYmplY3QgaW1hZ2UsCi0JCQlTdHJpbmdbXSBjYXRlZ29yeVBrZ1BhdGgpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnksIG1ldGhvZENvbmZpZywgbmFtZSwgaW1hZ2UsIGNhdGVnb3J5UGtnUGF0aCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbmZpZ3VyYXRpb24uQ2F0ZWdvcmllc0l0ZW1Qcm92aWRlciNjcmVhdGVVbmNhdGVnb3JpemVkSXRlbVByb3ZpZGVyKCkKLQkgKi8KLQlwcm90ZWN0ZWQgVW5jYXRlZ29yaXplZEl0ZW1Qcm92aWRlciBjcmVhdGVVbmNhdGVnb3JpemVkSXRlbVByb3ZpZGVyKCkgewotCQlyZXR1cm4gbmV3IFVuY2F0ZWdvcml6ZWRJdGVtUHJvdmlkZXIoYWRhcHRlckZhY3RvcnksIG1ldGhvZENvbmZpZywKLQkJCQl0aGlzLnVuY2F0ZWdvcml6ZWRGaWx0ZXIsIHRoaXMudW5jYXRlZ29yaXplZExhYmVsLAotCQkJCXRoaXMudW5jYXRlZ29yaXplZEltYWdlKSB7Ci0JCQlmaW5hbCBjbGFzcyBFbGVtZW50TGlzdCBleHRlbmRzIE1ldGhvZENvbmZpZ3VyYXRpb25FbGVtZW50TGlzdCB7Ci0KLQkJCQkvKioKLQkJCQkgKiBAcGFyYW0gbWV0aG9kQ29uZmlnCi0JCQkJICogQHBhcmFtIGZpbHRlckxpc3QKLQkJCQkgKi8KLQkJCQlwdWJsaWMgRWxlbWVudExpc3QoTWV0aG9kQ29uZmlndXJhdGlvbiBtZXRob2RDb25maWcsCi0JCQkJCQlMaXN0IGZpbHRlckxpc3QpIHsKLQkJCQkJc3VwZXIobWV0aG9kQ29uZmlnLCBmaWx0ZXJMaXN0KTsKLQkJCQl9Ci0KLQkJCQkvKgotCQkJCSAqIChub24tSmF2YWRvYykKLQkJCQkgKiAKLQkJCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29uZmlndXJhdGlvbi5NZXRob2RDb25maWd1cmF0aW9uRWxlbWVudExpc3QjbmV3SXRlcmF0b3Iob3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50UGFja2FnZSkKLQkJCQkgKi8KLQkJCQlwcm90ZWN0ZWQgSXRlcmF0b3IgbmV3SXRlcmF0b3IoQ29udGVudFBhY2thZ2UgcGtnKSB7Ci0JCQkJCXJldHVybiBuZXcgRWxlbWVudEl0ZXJhdG9yKHBrZykgewotCQkJCQkJLyoqCi0JCQkJCQkgKiBDb21tZW50IGZvciA8Y29kZT5zZXJpYWxWZXJzaW9uVUlEPC9jb2RlPgotCQkJCQkJICovCi0JCQkJCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAyMzA3MTM2MzA3NjU3MzU5MjgyTDsKLQotCQkJCQkJLyoKLQkJCQkJCSAqIChub24tSmF2YWRvYykKLQkJCQkJCSAqIAotCQkJCQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbmZpZ3VyYXRpb24uTWV0aG9kQ29uZmlndXJhdGlvbkVsZW1lbnRMaXN0LkVsZW1lbnRJdGVyYXRvciNnZXRDaGlsZHJlbkxpc3QoamF2YS5sYW5nLk9iamVjdCkKLQkJCQkJCSAqLwotCQkJCQkJcHJvdGVjdGVkIExpc3QgZ2V0Q2hpbGRyZW5MaXN0KE9iamVjdCBvYmplY3QpIHsKLQkJCQkJCQlMaXN0IGNoaWxkcmVuID0gc3VwZXIuZ2V0Q2hpbGRyZW5MaXN0KG9iamVjdCk7Ci0JCQkJCQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIEFydGlmYWN0KSB7Ci0JCQkJCQkJCWNoaWxkcmVuLmFkZEFsbCgoKEFydGlmYWN0KSBvYmplY3QpCi0JCQkJCQkJCQkJLmdldENvbnRhaW5lZEFydGlmYWN0cygpKTsKLQkJCQkJCQl9Ci0JCQkJCQkJcmV0dXJuIGNoaWxkcmVuOwotCQkJCQkJfQotCQkJCQl9OwotCQkJCX0KLQotCQkJCS8qCi0JCQkJICogKG5vbi1KYXZhZG9jKQotCQkJCSAqIAotCQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb25maWd1cmF0aW9uLk1ldGhvZENvbmZpZ3VyYXRpb25FbGVtZW50TGlzdCNjaGVja0FjY2VwdGFuY2UoKQotCQkJCSAqLwotCQkJCXByb3RlY3RlZCBib29sZWFuIGNoZWNrQWNjZXB0YW5jZSgpIHsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQotCQkJCXB1YmxpYyBib29sZWFuIHN1cGVyQWNjZXB0KE9iamVjdCBvYmplY3QpIHsKLQkJCQkJcmV0dXJuIHN1cGVyLmFjY2VwdChvYmplY3QpOwotCQkJCX0KLQkJCX07Ci0KLQkJCS8vIGtlZXBzIHdyYXBwZXJzIG9mIGFydGlmYWN0cyB0aGF0IGlzIG5vdCBhc3NvY2lhdGVkIHdpdGggYW55IHdvcmsKLQkJCS8vIHByb2R1Y3QgdHlwZQotCQkJLy8KLQkJCXByaXZhdGUgV3JhcHBlck1hbmFnZXIgd3JhcHBlck1hbmFnZXIgPSBuZXcgV3JhcHBlck1hbmFnZXIoCi0JCQkJCWFkYXB0ZXJGYWN0b3J5KSB7Ci0JCQkJLyoKLQkJCQkgKiAobm9uLUphdmFkb2MpCi0JCQkJICogCi0JCQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuV3JhcHBlck1hbmFnZXIjY3JlYXRlV3JhcHBlcihqYXZhLmxhbmcuT2JqZWN0LAotCQkJCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCwKLQkJCQkgKiAgICAgIG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5KQotCQkJCSAqLwotCQkJCXByb3RlY3RlZCBJV3JhcHBlckl0ZW1Qcm92aWRlciBjcmVhdGVXcmFwcGVyKE9iamVjdCB2YWx1ZSwKLQkJCQkJCU9iamVjdCBvd25lciwgQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJCQkJcmV0dXJuIG5ldyBEZWxlZ2F0aW5nV3JhcHBlckl0ZW1Qcm92aWRlcih2YWx1ZSwgb3duZXIsCi0JCQkJCQkJbnVsbCwgQ29tbWFuZFBhcmFtZXRlci5OT19JTkRFWCwgYWRhcHRlckZhY3RvcnkpIHsKLQkJCQkJCS8qCi0JCQkJCQkgKiAobm9uLUphdmFkb2MpCi0JCQkJCQkgKiAKLQkJCQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuRGVsZWdhdGluZ1dyYXBwZXJJdGVtUHJvdmlkZXIjZ2V0Q2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKLQkJCQkJCSAqLwotCQkJCQkJcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQkJCQkJCS8vIFN1Yi1hcnRpZmFjdCBjYW4gaGF2ZSBhIGRpZmZlcmVudCBzZXQgb2Ygd29yawotCQkJCQkJCS8vIHByb2R1Y3QgdHlwZXMgdGhhbiB0aGUgY29udGFpbmluZyBhcnRpZmFjdC4KLQkJCQkJCQkvLyBEbyBub3Qgc2hvdyB0aGUgY29tcG9zaXRpb24gaGllcmFyY2hpZXMgaW4gdGhlCi0JCQkJCQkJLy8gV29yayBQcm9kdWN0IFR5cGUgdHJlZSBicm93c2VycyBpbiBMaWIuIE5hdi4KLQkJCQkJCQkvLyBhbmQgQ29uZmlnLiBFeHBsb3Jlci4gU2hvdyB0aGVtIGluIGZsYXQgbGlzdHMKLQkJCQkJCQkvLyBhY2NvcmRpbmcgdG8gdGhlaXIgY2F0ZWdvcml6YXRpb25zIGluc3RlYWQuCi0JCQkJCQkJLy8KLQkJCQkJCQkvLyBUaGlzIGlzIG5vdCB0cnVlIGZvciBEb21haW5zLCB3aGljaCBzaG91bGQgc2hvdwotCQkJCQkJCS8vIHRoZSBhcnRpZmFjdCBuZXN0aW5nIQotCQkJCQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCQkJCQkJfQotCi0JCQkJCQkvKgotCQkJCQkJICogKG5vbi1KYXZhZG9jKQotCQkJCQkJICogCi0JCQkJCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkRlbGVnYXRpbmdXcmFwcGVySXRlbVByb3ZpZGVyI2hhc0NoaWxkcmVuKGphdmEubGFuZy5PYmplY3QpCi0JCQkJCQkgKi8KLQkJCQkJCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCQl9Ci0JCQkJCX07Ci0JCQkJfQotCQkJfTsKLQotCQkJLyoKLQkJCSAqIChub24tSmF2YWRvYykKLQkJCSAqIAotCQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbmZpZ3VyYXRpb24uVW5jYXRlZ29yaXplZEl0ZW1Qcm92aWRlciNjcmVhdGVNZXRob2RDb25maWd1cmF0aW9uRWxlbWVudExpc3QoamF2YS51dGlsLkxpc3QpCi0JCQkgKi8KLQkJCXByb3RlY3RlZCBNZXRob2RDb25maWd1cmF0aW9uRWxlbWVudExpc3QgY3JlYXRlTWV0aG9kQ29uZmlndXJhdGlvbkVsZW1lbnRMaXN0KAotCQkJCQlMaXN0IGZpbHRlckxpc3QpIHsKLQkJCQlyZXR1cm4gbmV3IEVsZW1lbnRMaXN0KG1ldGhvZENvbmZpZywgZmlsdGVyTGlzdCk7Ci0JCQl9Ci0KLQkJCS8qCi0JCQkgKiAobm9uLUphdmFkb2MpCi0JCQkgKiAKLQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb25maWd1cmF0aW9uLlVuY2F0ZWdvcml6ZWRJdGVtUHJvdmlkZXIjZ2V0Q2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKLQkJCSAqLwotCQkJcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQkJCUVsZW1lbnRMaXN0IGVsZW1lbnRMaXN0ID0gKEVsZW1lbnRMaXN0KSBjcmVhdGVNZXRob2RDb25maWd1cmF0aW9uRWxlbWVudExpc3QoY3JlYXRlRmlsdGVyTGlzdCgpKTsKLQkJCQlDb2xsZWN0aW9uIGNoaWxkcmVuID0gZWxlbWVudExpc3QuZ2V0TGlzdCgpOwotCQkJCUFycmF5TGlzdCBhcnRpZmFjdHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gY2hpbGRyZW4uaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCU9iamVjdCBlbGVtZW50ID0gKE9iamVjdCkgaXRlci5uZXh0KCk7Ci0JCQkJCWlmIChlbGVtZW50TGlzdC5zdXBlckFjY2VwdChlbGVtZW50KSkgewotCQkJCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBBcnRpZmFjdCkgewotCQkJCQkJCWFydGlmYWN0cy5hZGQoZWxlbWVudCk7Ci0JCQkJCQkJaXRlci5yZW1vdmUoKTsKLQkJCQkJCX0KLQkJCQkJfSBlbHNlIHsKLQkJCQkJCWl0ZXIucmVtb3ZlKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJd3JhcHBlck1hbmFnZXIudXBkYXRlKGFydGlmYWN0cyk7Ci0JCQkJY2hpbGRyZW4uYWRkQWxsKHdyYXBwZXJNYW5hZ2VyLmdldFdyYXBwZXJzKCkpOwotCQkJCXJldHVybiBjaGlsZHJlbjsKLQkJCX0KLQotCQkJLyoKLQkJCSAqIChub24tSmF2YWRvYykKLQkJCSAqIAotCQkJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2Rpc3Bvc2UoKQotCQkJICovCi0JCQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkJCXdyYXBwZXJNYW5hZ2VyLmRpc3Bvc2UoKTsKLQkJCQlzdXBlci5kaXNwb3NlKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbmZpZ3VyYXRpb24vcGFja2FnZS5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb25maWd1cmF0aW9uL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDc3ZGZhZi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbmZpZ3VyYXRpb24vcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgZGlzcGxheSBhbmQgZWRpdGluZyBzdXBwb3J0IGZvciBtZXRob2QgY29uZmlndXJhdGlvbnMuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9lbGVtZW50L0FydGlmYWN0SXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2VsZW1lbnQvQXJ0aWZhY3RJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjYwNjUxNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2VsZW1lbnQvQXJ0aWZhY3RJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmVsZW1lbnQ7Ci0KLWltcG9ydCBqYXZhLm5ldC5VUkk7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkFkZENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklEZWZhdWx0TmFtZVNldHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JTGlicmFyeUl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5NZXRob2RFbGVtZW50QWRkQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuTGlicmFyeUVkaXRDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BcnRpZmFjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaWJhYmxlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpc2NpcGxpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci0KLS8qKgotICogVGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYW4gYXJ0aWZhY3QuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEFydGlmYWN0SXRlbVByb3ZpZGVyIGV4dGVuZHMKLQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5BcnRpZmFjdEl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzCi0JCUlEZWZhdWx0TmFtZVNldHRlciwgSUxpYnJhcnlJdGVtUHJvdmlkZXIsIElDb25maWd1cmFibGUgewotCi0JcHJpdmF0ZSBJRmlsdGVyIGZpbHRlcjsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIEFydGlmYWN0SXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3Qgb2JqZWN0KSB7Ci0JCUFydGlmYWN0IGFydGlmYWN0ID0gKEFydGlmYWN0KSBvYmplY3Q7Ci0JCWlmIChhcnRpZmFjdCAhPSBudWxsICYmIGFydGlmYWN0LmVDb250YWluZXIoKSBpbnN0YW5jZW9mIEFydGlmYWN0KSB7Ci0JCQlyZXR1cm4gc3VwZXIuZ2V0UGFyZW50KG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIFRuZ1V0aWwuZ2V0TmF2aWdhdG9yUGFyZW50SXRlbVByb3ZpZGVyKGFydGlmYWN0KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoamF2YS51dGlsLkNvbGxlY3Rpb24sCi0JICogICAgICBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywKLQkJCU9iamVjdCBvYmplY3QpIHsKLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0QXJ0aWZhY3RfQ29udGFpbmVkQXJ0aWZhY3RzKCksIFVtYUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJLmNyZWF0ZUFydGlmYWN0KCkpKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXIjbm90aWZ5Q2hhbmdlZChvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb24pCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0KLQkJLy9UbmdVdGlsLnNldERlZmF1bHROYW1lKHRoaXMsIG5vdGlmaWNhdGlvbik7Ci0JCXNldERlZmF1bHROYW1lKG5vdGlmaWNhdGlvbik7Ci0JCQotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCQkKLQkJVG5nVXRpbC5yZWZyZXNoUGFyZW50SWZOYW1lQ2hhbmdlZChub3RpZmljYXRpb24sIHRoaXMpOwotCQkKLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKERpc2NpcGxpbmUuY2xhc3MpKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9fTkFNRToKLQkJCVRuZ1V0aWwucmVmcmVzaENvbnRyaWJ1dG9ycyh0aGlzLCBub3RpZmljYXRpb24sIGZhbHNlLCB0cnVlKTsKLQkJCWJyZWFrOwotCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX1RZUEVfX1dPUktfUFJPRFVDVFM6Ci0JCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uCi0JCQkJCS5nZXROb3RpZmllcigpLCB0cnVlLCBmYWxzZSkpOwotCQkJVG5nVXRpbC5yZWZyZXNoV29ya1Byb2R1Y3RUeXBlVW5jYXRlZ29yaXplZChVbWFVdGlsCi0JCQkJCS5nZXRNZXRob2RQbHVnaW4oKEVPYmplY3QpIHRhcmdldCksIG5vdGlmaWNhdGlvbik7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5BUlRJRkFDVF9fQ09OVEFJTkVEX0FSVElGQUNUUzoKLQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24KLQkJCQkJLmdldE5vdGlmaWVyKCksIHRydWUsIGZhbHNlKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldENoaWxkcmVuRmVhdHVyZXMoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbkZlYXR1cmVzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGNoaWxkcmVuRmVhdHVyZXMgPT0gbnVsbCkgewotCQkJY2hpbGRyZW5GZWF0dXJlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWNoaWxkcmVuRmVhdHVyZXMuYWRkKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCS5nZXRBcnRpZmFjdF9Db250YWluZWRBcnRpZmFjdHMoKSk7Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuRmVhdHVyZXM7Ci0JfQotCQotCS8qKgotCSAqIE1ldGhvZCB0byBzZXREZWZhdWx0TmFtZS4gSURlZmF1bHROYW1lU2V0dGVyIGNhbm5vdCBiZSB1c2VkIAotCSAqIGluIGNhc2Ugb2YgU3RhdGVsZXNzIEl0ZW1Qcm92aWRlci4KLQkgKiBUaGlzIGlzIHdvcmstYXJvdW5kIGZvciBub3cuIElEZWZhdWx0TmFtZVNldHRlciB3aWxsIGJlIG1vZGlmaWVkIGxhdGVyLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlZmF1bHROYW1lKE5vdGlmaWNhdGlvbiBtc2cpIHsKLQkJSURlZmF1bHROYW1lU2V0dGVyIGRlZmF1bHROYW1lU2V0dGVyID0gdGhpczsKLQkJaWYgKGRlZmF1bHROYW1lU2V0dGVyLmdldEludGVyZXN0ZWRGZWF0dXJlT3duZXJDbGFzcygpICE9IG51bGwpIHsKLQkJCWludCBmZWF0dXJlSWQgPSBtc2cuZ2V0RmVhdHVyZUlEKGRlZmF1bHROYW1lU2V0dGVyCi0JCQkJCS5nZXRJbnRlcmVzdGVkRmVhdHVyZU93bmVyQ2xhc3MoKSk7Ci0JCQlpZiAoZmVhdHVyZUlkID09IGRlZmF1bHROYW1lU2V0dGVyLmdldEludGVyZXN0ZWRGZWF0dXJlSUQoKSkgewotCQkJCXN3aXRjaCAobXNnLmdldEV2ZW50VHlwZSgpKSB7Ci0JCQkJY2FzZSBOb3RpZmljYXRpb24uQUREOgotCQkJCQlzZXREZWZhdWx0TmFtZShtc2cuZ2V0TmV3VmFsdWUoKSwgbXNnLmdldE5vdGlmaWVyKCkpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIE5vdGlmaWNhdGlvbi5BRERfTUFOWToKLQkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gKChDb2xsZWN0aW9uKSBtc2cuZ2V0TmV3VmFsdWUoKSkKLQkJCQkJCQkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlzZXREZWZhdWx0TmFtZShpdGVyLm5leHQoKSwgbXNnLmdldE5vdGlmaWVyKCkpOwotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBzZXREZWZhdWx0TmFtZShPYmplY3Qgb2JqLCBPYmplY3QgcGFyZW50KSB7Ci0JCVN0cmluZyBiYXNlTmFtZSA9IG51bGw7Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBBcnRpZmFjdCkgewotCQkJYmFzZU5hbWUgPSBMaWJyYXJ5RWRpdENvbnN0YW50cy5ORVdfQVJUSUZBQ1Q7Ci0JCX0KLQkJaWYgKGJhc2VOYW1lICE9IG51bGwpIHsKLQkJCVRuZ1V0aWwuc2V0RGVmYXVsdE5hbWUoKChBcnRpZmFjdCkgcGFyZW50KQotCQkJCQkuZ2V0Q29udGFpbmVkQXJ0aWZhY3RzKCksIChNZXRob2RFbGVtZW50KSBvYmosIGJhc2VOYW1lKTsKLQkJfQotCX0KLQkKLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LklEZWZhdWx0TmFtZVNldHRlciNzZXREZWZhdWx0TmFtZShqYXZhLmxhbmcuT2JqZWN0KQotCSAqIG5vdCBpbiB1c2UgKGZvciBzdGF0ZWxlc3MgaXRlbXByb3ZpZGVyKSBzZWUgYWJvdmUgc2V0RGVmYXVsdE5hbWUoT2JqZWN0IG9iaiwgT2JqZWN0IHBhcmVudCkuCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGVmYXVsdE5hbWUoT2JqZWN0IG9iaikgewotCQlTdHJpbmcgYmFzZU5hbWUgPSBudWxsOwotCQlpZiAob2JqIGluc3RhbmNlb2YgQXJ0aWZhY3QpIHsKLQkJCWJhc2VOYW1lID0gTGlicmFyeUVkaXRDb25zdGFudHMuTkVXX0FSVElGQUNUOwotCQl9Ci0JCWlmIChiYXNlTmFtZSAhPSBudWxsKSB7Ci0JCQlUbmdVdGlsLnNldERlZmF1bHROYW1lKCgoQXJ0aWZhY3QpIHRhcmdldCkuZ2V0Q29udGFpbmVkQXJ0aWZhY3RzKCksCi0JCQkJCShNZXRob2RFbGVtZW50KSBvYmosIGJhc2VOYW1lKTsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuSURlZmF1bHROYW1lU2V0dGVyI2dldEludGVyZXN0ZWRGZWF0dXJlSUQoKQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0SW50ZXJlc3RlZEZlYXR1cmVJRCgpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuQVJUSUZBQ1RfX0NPTlRBSU5FRF9BUlRJRkFDVFM7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5JRGVmYXVsdE5hbWVTZXR0ZXIjZ2V0SW50ZXJlc3RlZEZlYXR1cmVPd25lckNsYXNzKCkKLQkgKi8KLQlwdWJsaWMgQ2xhc3MgZ2V0SW50ZXJlc3RlZEZlYXR1cmVPd25lckNsYXNzKCkgewotCQlyZXR1cm4gQXJ0aWZhY3QuY2xhc3M7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIFRuZ1V0aWwuZ2V0TGFiZWwob2JqZWN0LCBnZXRTdHJpbmcoIl9VSV9BcnRpZmFjdF90eXBlIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBEZXNjcmliYWJsZUVsZW1lbnQpIHsKLQkJCWlmICgoKERlc2NyaWJhYmxlRWxlbWVudCkgb2JqZWN0KS5nZXROb2RlaWNvbigpICE9IG51bGwpIHsKLQkJCQlVUkkgaW1nVXJpID0gVG5nVXRpbC5nZXRGdWxsUGF0aG9mTm9kZW9yU2hhcGVJY29uVVJJKAotCQkJCQkJKERlc2NyaWJhYmxlRWxlbWVudCkgb2JqZWN0LAotCQkJCQkJKChEZXNjcmliYWJsZUVsZW1lbnQpIG9iamVjdCkuZ2V0Tm9kZWljb24oKSk7Ci0JCQkJaWYgKGltZ1VyaSAhPSBudWxsKSB7Ci0JCQkJCU9iamVjdCBpbWFnZSA9IExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCQkJLmdldFNoYXJlZEltYWdlKGltZ1VyaSk7Ci0JCQkJCWlmIChpbWFnZSAhPSBudWxsKQotCQkJCQkJcmV0dXJuIGltYWdlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0SW1hZ2Uob2JqZWN0KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29tbWFuZCBjcmVhdGVBZGRDb21tYW5kKEVkaXRpbmdEb21haW4gZG9tYWluLCBFT2JqZWN0IG93bmVyLAotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIENvbGxlY3Rpb24gY29sbGVjdGlvbiwgaW50IGluZGV4KSB7Ci0JCXJldHVybiBuZXcgTWV0aG9kRWxlbWVudEFkZENvbW1hbmQoKEFkZENvbW1hbmQpIHN1cGVyLmNyZWF0ZUFkZENvbW1hbmQoCi0JCQkJZG9tYWluLCBvd25lciwgZmVhdHVyZSwgY29sbGVjdGlvbiwgaW5kZXgpKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LklNZXRob2RFbGVtZW50SXRlbVByb3ZpZGVyI3NldFBhcmVudChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBhcmVudChPYmplY3QgcGFyZW50KSB7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RmlsdGVyKElGaWx0ZXIgZmlsdGVyKSB7Ci0JCXRoaXMuZmlsdGVyID0gZmlsdGVyOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldExhYmVsKFN0cmluZyBsYWJlbCkgewotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJLy8gcmV0dXJuIHN1cGVyLmdldENoaWxkcmVuKG9iamVjdCk7Ci0JCUNvbGxlY3Rpb24gY29sID0gc3VwZXIuZ2V0Q2hpbGRyZW4ob2JqZWN0KTsKLQkJaWYgKGZpbHRlciAhPSBudWxsKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0b3IgPSBjb2wuaXRlcmF0b3IoKTsgaXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IGNoaWxkID0gaXRvci5uZXh0KCk7Ci0JCQkJaWYgKCFmaWx0ZXIuYWNjZXB0KGNoaWxkKSkgewotCQkJCQlpdG9yLnJlbW92ZSgpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gY29sOwotCX0KLQotCS8vIHByaXZhdGUgYm9vbGVhbiBpc1BhcmVudHNBY2NlcHRlZChPYmplY3QgY2hpbGQpIHsKLQkvLyBMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JLy8gZ2V0SGllcmFyY2h5TGlzdChsaXN0LCBjaGlsZCk7Ci0JLy8gZm9yIChJdGVyYXRvciBpdG9yID0gbGlzdC5pdGVyYXRvcigpOyBpdG9yLmhhc05leHQoKTspIHsKLQkvLyBPYmplY3Qgb2JqID0gaXRvci5uZXh0KCk7Ci0JLy8gaWYgKG9iaiBpbnN0YW5jZW9mIEFydGlmYWN0KSB7Ci0JLy8gaWYgKGZpbHRlci5hY2NlcHQob2JqKSkKLQkvLyByZXR1cm4gdHJ1ZTsKLQkvLyB9Ci0JLy8gfQotCS8vIHJldHVybiBmYWxzZTsKLQkvLyB9Ci0JLy8KLQkvLyBwcml2YXRlIGJvb2xlYW4gY2hlY2tDaGlsZHJlbnNBY2NlcHRlZChPYmplY3Qgb2JqZWN0KSB7Ci0JLy8gQXJ0aWZhY3QgcGFyZW50YXJ0aWZhY3QgPSAoKEFydGlmYWN0KSBvYmplY3QpLmdldENvbnRhaW5lckFydGlmYWN0KCk7Ci0JLy8gaWYgKHBhcmVudGFydGlmYWN0ICE9IG51bGwpIHsKLQkvLyBpZiAoZmlsdGVyICE9IG51bGwpIHsKLQkvLyBpZiAoZmlsdGVyLmFjY2VwdChwYXJlbnRhcnRpZmFjdCkpCi0JLy8gcmV0dXJuIHRydWU7Ci0JLy8gZWxzZSB7Ci0JLy8gcmV0dXJuIGNoZWNrQ2hpbGRyZW5zQWNjZXB0ZWQocGFyZW50YXJ0aWZhY3QpOwotCS8vIH0KLQkvLyB9Ci0JLy8gfQotCS8vIHJldHVybiBmYWxzZTsKLQkvLyB9Ci0JLy8KLQkvLyBwcml2YXRlIHZvaWQgZ2V0SGllcmFyY2h5TGlzdChMaXN0IGxpc3QsIE9iamVjdCBvYmplY3QpIHsKLQkvLyBBcnRpZmFjdCBwYXJlbnQgPSAoKEFydGlmYWN0KSBvYmplY3QpLmdldENvbnRhaW5lckFydGlmYWN0KCk7Ci0JLy8gaWYgKHBhcmVudCBpbnN0YW5jZW9mIEFydGlmYWN0KSB7Ci0JLy8gbGlzdC5hZGQocGFyZW50KTsKLQkvLyBnZXRIaWVyYXJjaHlMaXN0KGxpc3QsIHBhcmVudCk7Ci0JLy8gfQotCS8vIH0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9lbGVtZW50L0NvbnRlbnREZXNjcmlwdGlvbkl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9lbGVtZW50L0NvbnRlbnREZXNjcmlwdGlvbkl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMTAwYTg4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvZWxlbWVudC9Db250ZW50RGVzY3JpcHRpb25JdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmVsZW1lbnQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db3B5Q29tbWFuZC5IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQuY29tbWFuZC5NZXRob2RFbGVtZW50SW5pdGlhbGl6ZUNvcHlDb21tYW5kOwotCi0vKioKLSAqIFRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEgY29udGVudCBkZXNjcmlwdGlvbi4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQ29udGVudERlc2NyaXB0aW9uSXRlbVByb3ZpZGVyIGV4dGVuZHMKLQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5Db250ZW50RGVzY3JpcHRpb25JdGVtUHJvdmlkZXIgewotCi0JLyoqCi0JICogQSBtYXAgb2YgRUNsYXNzIC8gSXRlbVByb3ZpZGVyQWRhcHRlciBmb3IgZWFjaCB0eXBlIG9mIENvbnRlbnREZXNjcmlwdGlvbgotCSAqLwotCXByaXZhdGUgc3RhdGljIE1hcCBpdGVtUHJvdmlkZXJNYXAgPSBuZXcgSGFzaE1hcCgpOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8JCi0JcHVibGljIENvbnRlbnREZXNjcmlwdGlvbkl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWl0ZW1Qcm92aWRlck1hcC5jbGVhcigpOwotCi0JCXN1cGVyLmRpc3Bvc2UoKTsKLQl9Ci0KLQlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIEVPYmplY3QpIHsKLQkJCXJldHVybiBnZXRBZGFwdGVyKChFT2JqZWN0KSBvYmplY3QpLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRQcm9wZXJ0eURlc2NyaXB0b3IoamF2YS5sYW5nLk9iamVjdCwKLQkgKiAgICAgIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIElJdGVtUHJvcGVydHlEZXNjcmlwdG9yIGdldFByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0LAotCQkJT2JqZWN0IHByb3BlcnR5SWQpIHsKLQkJcmV0dXJuIGdldEFkYXB0ZXIoKEVPYmplY3QpIG9iamVjdCkuZ2V0UHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCwKLQkJCQlwcm9wZXJ0eUlkKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0RWRpdGFibGVWYWx1ZShqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0RWRpdGFibGVWYWx1ZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBnZXRBZGFwdGVyKChFT2JqZWN0KSBvYmplY3QpLmdldEVkaXRhYmxlVmFsdWUob2JqZWN0KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuR3VpZGFuY2VJdGVtUHJvdmlkZXIjZ2V0SW1hZ2UoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIEVPYmplY3QpIHsKLQkJCXJldHVybiBnZXRBZGFwdGVyKChFT2JqZWN0KSBvYmplY3QpLmdldEltYWdlKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldEltYWdlKG9iamVjdCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLkd1aWRhbmNlSXRlbVByb3ZpZGVyI2dldFRleHQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gVG5nVXRpbC5nZXRMYWJlbChvYmplY3QpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSXRlbVByb3ZpZGVyQWRhcHRlciBnZXRBZGFwdGVyKEVPYmplY3QgZU9iaikgewotCQlJdGVtUHJvdmlkZXJBZGFwdGVyIGFkYXB0ZXIgPSAoSXRlbVByb3ZpZGVyQWRhcHRlcikgaXRlbVByb3ZpZGVyTWFwCi0JCQkJLmdldChlT2JqLmVDbGFzcygpKTsKLQkJaWYgKGFkYXB0ZXIgPT0gbnVsbCkgewotCQkJYWRhcHRlciA9IChJdGVtUHJvdmlkZXJBZGFwdGVyKSBUbmdVdGlsLnVtYUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5Ci0JCQkJCS5jcmVhdGVBZGFwdGVyKGVPYmopOwotCQkJaXRlbVByb3ZpZGVyTWFwLnB1dChlT2JqLmVDbGFzcygpLCBhZGFwdGVyKTsKLQkJfQotCQlyZXR1cm4gYWRhcHRlcjsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29tbWFuZCBjcmVhdGVJbml0aWFsaXplQ29weUNvbW1hbmQoRWRpdGluZ0RvbWFpbiBkb21haW4sCi0JCQlFT2JqZWN0IG93bmVyLCBIZWxwZXIgaGVscGVyKSB7Ci0JCXJldHVybiBuZXcgTWV0aG9kRWxlbWVudEluaXRpYWxpemVDb3B5Q29tbWFuZChkb21haW4sIG93bmVyLCBoZWxwZXIpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9lbGVtZW50L0NvbnRlbnRQYWNrYWdlSXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2VsZW1lbnQvQ29udGVudFBhY2thZ2VJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGIzNGQ0Mi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2VsZW1lbnQvQ29udGVudFBhY2thZ2VJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmVsZW1lbnQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5BZGRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUxpYnJhcnlJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JU3RhdGVmdWxJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5QcmVzZW50YXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5NZXRob2RFbGVtZW50QWRkQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiBUaGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciB0aGUgIkNvbnRlbnQgUGFja2FnZXMiIGZvbGRlciBpbiB0aGUgTGlicmFyeQotICogdmlldy4KLSAqIDxwPgotICogVGhpcyBjbGFzcyB3aWxsIGJlIHJlbmFtZWQgYXMgQ29udGVudFBhY2thZ2VzSXRlbVByb3ZpZGVyIGluIEVQRiBNNS4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQ29udGVudFBhY2thZ2VJdGVtUHJvdmlkZXIgZXh0ZW5kcwotCQlvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLkNvbnRlbnRQYWNrYWdlSXRlbVByb3ZpZGVyIGltcGxlbWVudHMKLQkJSUVsZW1lbnRJdGVtUHJvdmlkZXIsIElMaWJyYXJ5SXRlbVByb3ZpZGVyLCBJU3RhdGVmdWxJdGVtUHJvdmlkZXIgewotCi0JcHJvdGVjdGVkIFJvbGVzSXRlbVByb3ZpZGVyIHJvbGVzOwotCi0JcHJvdGVjdGVkIFRhc2tzSXRlbVByb3ZpZGVyIHRhc2tzOwotCi0JcHJvdGVjdGVkIFdvcmtQcm9kdWN0c0l0ZW1Qcm92aWRlciB3b3JrUHJvZHVjdHM7Ci0KLQlwcm90ZWN0ZWQgR3VpZGFuY2VzSXRlbVByb3ZpZGVyIGd1aWRhbmNlczsKLQotCXByb3RlY3RlZCBTdHJpbmcgbGFiZWw7Ci0KLQlwcm90ZWN0ZWQgT2JqZWN0IHBhcmVudDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIENvbnRlbnRQYWNrYWdlSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIHJvbGVzLgotCSAqLwotCXB1YmxpYyBSb2xlc0l0ZW1Qcm92aWRlciBnZXRSb2xlcygpIHsKLQkJcmV0dXJuIHJvbGVzOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgdGFza3MuCi0JICovCi0JcHVibGljIFRhc2tzSXRlbVByb3ZpZGVyIGdldFRhc2tzKCkgewotCQlyZXR1cm4gdGFza3M7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSB3b3JrUHJvZHVjdHMuCi0JICovCi0JcHVibGljIFdvcmtQcm9kdWN0c0l0ZW1Qcm92aWRlciBnZXRXb3JrUHJvZHVjdHMoKSB7Ci0JCXJldHVybiB3b3JrUHJvZHVjdHM7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldENoaWxkcmVuRmVhdHVyZXMoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQkvLyBwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbkZlYXR1cmVzKE9iamVjdCBvYmplY3QpIHsKLQkvLyBpZiAoY2hpbGRyZW5GZWF0dXJlcyA9PSBudWxsKSB7Ci0JLy8gY2hpbGRyZW5GZWF0dXJlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkvLyBjaGlsZHJlbkZlYXR1cmVzLmFkZChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRNZXRob2RQYWNrYWdlX0NoaWxkUGFja2FnZXMoKSk7Ci0JLy8gfQotCS8vIHJldHVybiBjaGlsZHJlbkZlYXR1cmVzOwotCS8vIH0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0Q2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCUxpc3QgYWxsQ2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUNoaWxkcmVuU3RvcmUgc3RvcmUgPSBnZXRDaGlsZHJlblN0b3JlKG9iamVjdCk7Ci0JCUxpc3QgcmVzdWx0ID0gbnVsbDsKLQkJaWYgKHN0b3JlID09IG51bGwpIHsKLQkJCXN0b3JlID0gY3JlYXRlQ2hpbGRyZW5TdG9yZShvYmplY3QpOwotCQkJcmVzdWx0ID0gc3RvcmUgIT0gbnVsbCA/IG51bGwgOiBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlFT2JqZWN0IGVPYmplY3QgPSAoRU9iamVjdCkgb2JqZWN0OwotCi0JCQlmb3IgKEl0ZXJhdG9yIGkgPSBnZXRDaGlsZHJlbkZlYXR1cmVzKG9iamVjdCkuaXRlcmF0b3IoKTsgaQotCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgaS5uZXh0KCk7Ci0JCQkJaWYgKGZlYXR1cmUuaXNNYW55KCkpIHsKLQkJCQkJTGlzdCBjaGlsZHJlbiA9IChMaXN0KSBlT2JqZWN0LmVHZXQoZmVhdHVyZSk7Ci0JCQkJCUxpc3QgY29udGVudFBrZ3MgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCWludCBpbmRleCA9IDA7Ci0JCQkJCWZvciAoSXRlcmF0b3IgY2kgPSBjaGlsZHJlbi5pdGVyYXRvcigpOyBjaS5oYXNOZXh0KCk7IGluZGV4KyspIHsKLQkJCQkJCU9iamVjdCBjaGlsZCA9IGNpLm5leHQoKTsKLQkJCQkJCWlmIChjaGlsZCBpbnN0YW5jZW9mIENvbnRlbnRQYWNrYWdlKSB7Ci0JCQkJCQkJY2hpbGQgPSB3cmFwKGVPYmplY3QsIGZlYXR1cmUsIGNoaWxkLCBpbmRleCk7Ci0JCQkJCQkJLy8gaWYgKHN0b3JlICE9IG51bGwpCi0JCQkJCQkJLy8gewotCQkJCQkJCS8vIHN0b3JlLmdldExpc3QoZmVhdHVyZSkuYWRkKGNoaWxkKTsKLQkJCQkJCQkvLyB9Ci0JCQkJCQkJLy8gZWxzZQotCQkJCQkJCS8vIHsKLQkJCQkJCQkvLyByZXN1bHQuYWRkKGNoaWxkKTsKLQkJCQkJCQkvLyB9Ci0JCQkJCQkJY29udGVudFBrZ3MuYWRkKGNoaWxkKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQkKLQkJCQkJLy8gY2xlYXIgcGFyZW50IGZvciBjaGlsZHJlbgotCQkJCQkvLwotCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjaGlsZHJlbi5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJCU9iamVjdCBjaGlsZCA9IChPYmplY3QpIGl0ZXIubmV4dCgpOwotCQkJCQkJT2JqZWN0IGFkYXB0ZXIgPSBhZGFwdGVyRmFjdG9yeS5hZGFwdChjaGlsZCwKLQkJCQkJCQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCQkJCWlmIChhZGFwdGVyIGluc3RhbmNlb2YgSUxpYnJhcnlJdGVtUHJvdmlkZXIpIHsKLQkJCQkJCQkoKElMaWJyYXJ5SXRlbVByb3ZpZGVyKSBhZGFwdGVyKS5zZXRQYXJlbnQobnVsbCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQotCQkJCQkvLyBzb3J0aW5nIHRoZSBjb250ZW50IHBhY2thZ2VzCi0JCQkJCS8vCi0JCQkJCUNvbGxlY3Rpb25zLnNvcnQoY29udGVudFBrZ3MsIFByZXNlbnRhdGlvbkNvbnRleHQuSU5TVEFOQ0UKLQkJCQkJCQkuZ2V0Q29tcGFyYXRvcigpKTsKLQotCQkJCQlpZiAoc3RvcmUgIT0gbnVsbCkgewotCQkJCQkJc3RvcmUuZ2V0TGlzdChmZWF0dXJlKS5hZGRBbGwoY29udGVudFBrZ3MpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJcmVzdWx0LmFkZEFsbChjb250ZW50UGtncyk7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQlPYmplY3QgY2hpbGQgPSBlT2JqZWN0LmVHZXQoZmVhdHVyZSk7Ci0JCQkJCWlmIChjaGlsZCBpbnN0YW5jZW9mIENvbnRlbnRQYWNrYWdlKSB7Ci0JCQkJCQljaGlsZCA9IHdyYXAoZU9iamVjdCwgZmVhdHVyZSwgY2hpbGQsCi0JCQkJCQkJCUNvbW1hbmRQYXJhbWV0ZXIuTk9fSU5ERVgpOwotCQkJCQkJaWYgKHN0b3JlICE9IG51bGwpIHsKLQkJCQkJCQlzdG9yZS5zZXRWYWx1ZShmZWF0dXJlLCBjaGlsZCk7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCXJlc3VsdC5hZGQoY2hpbGQpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWFsbENoaWxkcmVuLmFkZEFsbChzdG9yZSAhPSBudWxsID8gc3RvcmUuZ2V0Q2hpbGRyZW4oKSA6IHJlc3VsdCk7Ci0JCUNvbnRlbnRQYWNrYWdlIGNvbnRlbnRQa2cgPSAoQ29udGVudFBhY2thZ2UpIG9iamVjdDsKLQotCQkvLyByZW1vdmUgb2xkIGFkYXB0ZXJzIChyb2xlcywgdGFza3MsIHdvcmtwcm9kdWN0cykgZnJvbSB0aGUgdGhlCi0JCS8vIGNvbnRlbnRQa2cKLQkJLy8KLQkJLy8gRU9iamVjdCBlT2JqID0gKEVPYmplY3QpIG9iamVjdDsKLQkJaWYgKHJvbGVzID09IG51bGwpIHsKLQkJCS8vIGVPYmouZUFkYXB0ZXJzKCkucmVtb3ZlKHJvbGVzKTsKLQkJCXJvbGVzID0gbmV3IFJvbGVzSXRlbVByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5LCBjb250ZW50UGtnKTsKLQkJfQotCQlpZiAodGFza3MgPT0gbnVsbCkgewotCQkJLy8gZU9iai5lQWRhcHRlcnMoKS5yZW1vdmUodGFza3MpOwotCQkJdGFza3MgPSBuZXcgVGFza3NJdGVtUHJvdmlkZXIoYWRhcHRlckZhY3RvcnksIGNvbnRlbnRQa2cpOwotCQl9Ci0JCWlmICh3b3JrUHJvZHVjdHMgPT0gbnVsbCkgewotCQkJLy8gZU9iai5lQWRhcHRlcnMoKS5yZW1vdmUod29ya1Byb2R1Y3RzKTsKLQkJCXdvcmtQcm9kdWN0cyA9IG5ldyBXb3JrUHJvZHVjdHNJdGVtUHJvdmlkZXIoYWRhcHRlckZhY3RvcnksCi0JCQkJCWNvbnRlbnRQa2cpOwotCQl9Ci0JCWlmIChndWlkYW5jZXMgPT0gbnVsbCkgewotCQkJLy8gZU9iai5lQWRhcHRlcnMoKS5yZW1vdmUoZ3VpZGFuY2VzKTsKLQkJCWd1aWRhbmNlcyA9IG5ldyBHdWlkYW5jZXNJdGVtUHJvdmlkZXIoYWRhcHRlckZhY3RvcnksIGNvbnRlbnRQa2cpOwotCQl9Ci0KLQkJYWxsQ2hpbGRyZW4uYWRkKHJvbGVzKTsKLQkJYWxsQ2hpbGRyZW4uYWRkKHRhc2tzKTsKLQkJYWxsQ2hpbGRyZW4uYWRkKHdvcmtQcm9kdWN0cyk7Ci0JCWFsbENoaWxkcmVuLmFkZChndWlkYW5jZXMpOwotCQlyZXR1cm4gYWxsQ2hpbGRyZW47Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2NvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKGphdmEudXRpbC5Db2xsZWN0aW9uLAotCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywKLQkJCU9iamVjdCBvYmplY3QpIHsKLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0TWV0aG9kUGFja2FnZV9DaGlsZFBhY2thZ2VzKCksIFVtYUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJLmNyZWF0ZUNvbnRlbnRQYWNrYWdlKCkpKTsKLQl9Ci0KLQkvLyAvKiAobm9uLUphdmFkb2MpCi0JLy8gKiBAc2VlCi0JLy8gb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNjcmVhdGVDb21tYW5kKGphdmEubGFuZy5PYmplY3QsCi0JLy8gb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW4sIGphdmEubGFuZy5DbGFzcywKLQkvLyBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXIpCi0JLy8gKi8KLQkvLyBwdWJsaWMgQ29tbWFuZCBjcmVhdGVDb21tYW5kKE9iamVjdCBvYmplY3QsIEVkaXRpbmdEb21haW4gZG9tYWluLAotCS8vIENsYXNzIGNvbW1hbmRDbGFzcywgQ29tbWFuZFBhcmFtZXRlciBjb21tYW5kUGFyYW1ldGVyKSB7Ci0JLy8gLy8gY29tbWFuZFBhcmFtZXRlci5zZXRPd25lcigoKEVPYmplY3Qpb2JqZWN0KS5lQ29udGFpbmVyKCkpOwotCS8vIENvbW1hbmQgY21kID0gc3VwZXIuY3JlYXRlQ29tbWFuZChvYmplY3QsIGRvbWFpbiwgY29tbWFuZENsYXNzLAotCS8vIGNvbW1hbmRQYXJhbWV0ZXIpOwotCS8vIFN5c3RlbS5vdXQucHJpbnRsbihnZXRDbGFzcygpLmdldE5hbWUoKSArICIjY3JlYXRlQ29tbWFuZDogIiArCi0JLy8gY29tbWFuZENsYXNzICsgIiwgY2FuIGV4ZWN1dGU6ICIgKyBjbWQuY2FuRXhlY3V0ZSgpICsgIiwgb3duZXI6ICIgKwotCS8vIGNvbW1hbmRQYXJhbWV0ZXIuZ2V0T3duZXIoKSArICIsIGNvbGxlY3Rpb246ICIgKwotCS8vIGNvbW1hbmRQYXJhbWV0ZXIuZ2V0Q29sbGVjdGlvbigpKTsKLQkvLyByZXR1cm4gY21kOwotCS8vIH0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRUZXh0KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIHR4dDsKLQkJaWYgKGxhYmVsICE9IG51bGwpIHsKLQkJCXR4dCA9IGxhYmVsOwotCQl9IGVsc2UgewotCQkJdHh0ID0gVG5nVXRpbAotCQkJCQkuZ2V0TGFiZWwob2JqZWN0LCBnZXRTdHJpbmcoIl9VSV9Db250ZW50UGFja2FnZV90eXBlIikpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJLy8gY2hlY2sgaWYgdGhlIG9iamVjdCBoYXMgaXRzIG93biByZXNvdXJjZSBhbmQgaXQgaXMgbW9kaWZpZWQgdG8gYWRkCi0JCS8vIHRoZSBkaXJ0eSBmbGFnCi0JCS8vCi0JCVJlc291cmNlIHJlcyA9ICgoRU9iamVjdCkgb2JqZWN0KS5lUmVzb3VyY2UoKTsKLQkJaWYgKHJlcyAhPSBudWxsICYmIHJlcy5nZXRDb250ZW50cygpLmdldCgwKSA9PSBvYmplY3QKLQkJCQkmJiByZXMuaXNNb2RpZmllZCgpKSB7Ci0JCQl0eHQgPSB0eHQgKyAiKiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gdHh0OwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXREZWZhdWx0TmFtZShPYmplY3Qgb2JqKSB7Ci0JCUNvbnRlbnRQYWNrYWdlIGNvbnRlbnRQYWNrYWdlID0gKENvbnRlbnRQYWNrYWdlKSB0YXJnZXQ7Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBDb250ZW50UGFja2FnZSkgewotCQkJVG5nVXRpbC5zZXREZWZhdWx0TmFtZShjb250ZW50UGFja2FnZS5nZXRDaGlsZFBhY2thZ2VzKCksCi0JCQkJCShNZXRob2RFbGVtZW50KSBvYmosICJjb250ZW50X3BhY2thZ2UiKTsgLy8kTk9OLU5MUy0xJAotCQl9IGVsc2UgewotCQkJVG5nVXRpbC5zZXREZWZhdWx0TmFtZShjb250ZW50UGFja2FnZS5nZXRDaGlsZFBhY2thZ2VzKCksCi0JCQkJCShNZXRob2RFbGVtZW50KSBvYmosICJtZXRob2RfcGFja2FnZSIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXIjbm90aWZ5Q2hhbmdlZChvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb24pCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbXNnKSB7Ci0JCVRuZ1V0aWwucmVmcmVzaFBhcmVudElmTmFtZUNoYW5nZWQobXNnLCB0aGlzKTsKLQotCQlzd2l0Y2ggKG1zZy5nZXRGZWF0dXJlSUQoQ29udGVudFBhY2thZ2UuY2xhc3MpKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX1BBQ0tBR0VfX0NPTlRFTlRfRUxFTUVOVFM6Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX1BBQ0tBR0VfX0NISUxEX1BBQ0tBR0VTOgotCQkJc3dpdGNoIChtc2cuZ2V0RXZlbnRUeXBlKCkpIHsKLQkJCWNhc2UgTm90aWZpY2F0aW9uLkFERDoKLQkJCQlzZXREZWZhdWx0TmFtZShtc2cuZ2V0TmV3VmFsdWUoKSk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIE5vdGlmaWNhdGlvbi5BRERfTUFOWToKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSAoKENvbGxlY3Rpb24pIG1zZy5nZXROZXdWYWx1ZSgpKQotCQkJCQkJLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQlzZXREZWZhdWx0TmFtZShpdGVyLm5leHQoKSk7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChtc2cpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgR3VpZGFuY2VzSXRlbVByb3ZpZGVyIGdldEd1aWRhbmNlcygpIHsKLQkJcmV0dXJuIGd1aWRhbmNlczsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LklDb25maWd1cmFibGUjc2V0RmlsdGVyKGNvbS5pYm0ubGlicmFyeS5lZGl0LklGaWx0ZXIpCi0JICovCi0JcHVibGljIHZvaWQgc2V0RmlsdGVyKElGaWx0ZXIgZmlsdGVyKSB7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhYmxlI3NldExhYmVsKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGFiZWwoU3RyaW5nIGxhYmVsKSB7Ci0JCXRoaXMubGFiZWwgPSBsYWJlbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LklDb25maWd1cmFibGUjc2V0UGFyZW50KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgc2V0UGFyZW50KE9iamVjdCBwYXJlbnQpIHsKLQkJdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldFBhcmVudChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKHBhcmVudCAhPSBudWxsKQotCQkJcmV0dXJuIHBhcmVudDsKLQkJcmV0dXJuIHN1cGVyLmdldFBhcmVudChvYmplY3QpOwotCX0KLQotCS8vIHB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCS8vIHJldHVybiBUbmdFZGl0UGx1Z2luLklOU1RBTkNFLmdldEltYWdlKCJmdWxsL29iajE2L01ldGhvZFBhY2thZ2VzIik7Ci0JLy8gfQotCi0JcHJvdGVjdGVkIENvbW1hbmQgY3JlYXRlQWRkQ29tbWFuZChFZGl0aW5nRG9tYWluIGRvbWFpbiwgRU9iamVjdCBvd25lciwKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBDb2xsZWN0aW9uIGNvbGxlY3Rpb24sIGludCBpbmRleCkgewotCQlBcnJheUxpc3Qgc2VsZWN0aW9uID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjb2xsZWN0aW9uLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyLm5leHQoKTsKLQotCQkJLy8gbWFrZSBzdXJlIHRoYXQgeW91IGNhbm5vdCBhZGQgTWV0aG9kUGFja2FnZSB0aGF0IGlzIG5vdCBhCi0JCQkvLyBDb250ZW50UGFja2FnZQotCQkJLy8KLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kUGFja2FnZQotCQkJCQkmJiAhKGVsZW1lbnQgaW5zdGFuY2VvZiBDb250ZW50UGFja2FnZSkpIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQotCQkJc2VsZWN0aW9uLmFkZChlbGVtZW50KTsKLQkJfQotCi0JCXJldHVybiBuZXcgTWV0aG9kRWxlbWVudEFkZENvbW1hbmQoKEFkZENvbW1hbmQpIHN1cGVyLmNyZWF0ZUFkZENvbW1hbmQoCi0JCQkJZG9tYWluLCBvd25lciwgZmVhdHVyZSwgc2VsZWN0aW9uLCBpbmRleCkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlpZiAoZ3VpZGFuY2VzICE9IG51bGwpIHsKLQkJCWd1aWRhbmNlcy5kaXNwb3NlKCk7Ci0JCQlndWlkYW5jZXMgPSBudWxsOwotCQl9Ci0JCWlmIChyb2xlcyAhPSBudWxsKSB7Ci0JCQlyb2xlcy5kaXNwb3NlKCk7Ci0JCQlyb2xlcyA9IG51bGw7Ci0JCX0KLQkJaWYgKHRhc2tzICE9IG51bGwpIHsKLQkJCXRhc2tzLmRpc3Bvc2UoKTsKLQkJCXRhc2tzID0gbnVsbDsKLQkJfQotCQlpZiAod29ya1Byb2R1Y3RzICE9IG51bGwpIHsKLQkJCXdvcmtQcm9kdWN0cy5kaXNwb3NlKCk7Ci0JCQl3b3JrUHJvZHVjdHMgPSBudWxsOwotCQl9Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvZWxlbWVudC9HdWlkYW5jZUl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9lbGVtZW50L0d1aWRhbmNlSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5YmRiNjYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9lbGVtZW50L0d1aWRhbmNlSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5lbGVtZW50OwotCi1pbXBvcnQgamF2YS5uZXQuVVJJOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQWRkQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLk1ldGhvZEVsZW1lbnRBZGRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpYmFibGVFbGVtZW50OwotCi0vKioKLSAqIFRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEgZ3VpZGFuY2UgaW4gdGhlIExpYnJhcnkgdmlldy4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgR3VpZGFuY2VJdGVtUHJvdmlkZXIgZXh0ZW5kcwotCQlvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLkd1aWRhbmNlSXRlbVByb3ZpZGVyIHsKLQotCS8qKgotCSAqIEEgbWFwIG9mIEVDbGFzcyAvIEl0ZW1Qcm92aWRlckFkYXB0ZXIgZm9yIGVhY2ggdHlwZSBvZiBndWlkYW5jZQotCSAqLwotCXByaXZhdGUgc3RhdGljIE1hcCBpdGVtUHJvdmlkZXJNYXAgPSBuZXcgSGFzaE1hcCgpOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgR3VpZGFuY2VJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlpdGVtUHJvdmlkZXJNYXAuY2xlYXIoKTsKLQotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLkd1aWRhbmNlSXRlbVByb3ZpZGVyI2NvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKGphdmEudXRpbC5Db2xsZWN0aW9uLAotCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsCi0JCQlPYmplY3Qgb2JqZWN0KSB7Ci0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuRGVzY3JpYmFibGVFbGVtZW50SXRlbVByb3ZpZGVyI2dldENoaWxkcmVuRmVhdHVyZXMoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbkZlYXR1cmVzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGNoaWxkcmVuRmVhdHVyZXMgPT0gbnVsbCkgewotCQkJY2hpbGRyZW5GZWF0dXJlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW5GZWF0dXJlczsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuR3VpZGFuY2VJdGVtUHJvdmlkZXIjZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgRU9iamVjdCkgewotCQkJcmV0dXJuIGdldEFkYXB0ZXIoKEVPYmplY3QpIG9iamVjdCkuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldFByb3BlcnR5RGVzY3JpcHRvcihqYXZhLmxhbmcuT2JqZWN0LAotCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IgZ2V0UHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QsCi0JCQlPYmplY3QgcHJvcGVydHlJZCkgewotCQlyZXR1cm4gZ2V0QWRhcHRlcigoRU9iamVjdCkgb2JqZWN0KS5nZXRQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0LAotCQkJCXByb3BlcnR5SWQpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRFZGl0YWJsZVZhbHVlKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRFZGl0YWJsZVZhbHVlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIGdldEFkYXB0ZXIoKEVPYmplY3QpIG9iamVjdCkuZ2V0RWRpdGFibGVWYWx1ZShvYmplY3QpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5HdWlkYW5jZUl0ZW1Qcm92aWRlciNnZXRJbWFnZShqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgRGVzY3JpYmFibGVFbGVtZW50KSB7Ci0JCQlpZiAoKChEZXNjcmliYWJsZUVsZW1lbnQpIG9iamVjdCkuZ2V0Tm9kZWljb24oKSAhPSBudWxsKSB7Ci0JCQkJVVJJIGltZ1VyaSA9IFRuZ1V0aWwuZ2V0RnVsbFBhdGhvZk5vZGVvclNoYXBlSWNvblVSSSgKLQkJCQkJCShEZXNjcmliYWJsZUVsZW1lbnQpIG9iamVjdCwKLQkJCQkJCSgoRGVzY3JpYmFibGVFbGVtZW50KSBvYmplY3QpLmdldE5vZGVpY29uKCkpOwotCQkJCU9iamVjdCBpbWFnZSA9IExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCQkuZ2V0U2hhcmVkSW1hZ2UoaW1nVXJpKTsKLQkJCQlpZiAoaW1hZ2UgIT0gbnVsbCkKLQkJCQkJcmV0dXJuIGltYWdlOwotCQkJfQotCQl9Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBFT2JqZWN0KSB7Ci0JCQlyZXR1cm4gZ2V0QWRhcHRlcigoRU9iamVjdCkgb2JqZWN0KS5nZXRJbWFnZShvYmplY3QpOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRJbWFnZShvYmplY3QpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSXRlbVByb3ZpZGVyQWRhcHRlciBnZXRBZGFwdGVyKEVPYmplY3QgZU9iaikgewotCQlJdGVtUHJvdmlkZXJBZGFwdGVyIGFkYXB0ZXIgPSAoSXRlbVByb3ZpZGVyQWRhcHRlcikgaXRlbVByb3ZpZGVyTWFwCi0JCQkJLmdldChlT2JqLmVDbGFzcygpKTsKLQkJaWYgKGFkYXB0ZXIgPT0gbnVsbCkgewotCQkJYWRhcHRlciA9IChJdGVtUHJvdmlkZXJBZGFwdGVyKSBUbmdVdGlsLnVtYUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5Ci0JCQkJCS5jcmVhdGVBZGFwdGVyKGVPYmopOwotCQkJaXRlbVByb3ZpZGVyTWFwLnB1dChlT2JqLmVDbGFzcygpLCBhZGFwdGVyKTsKLQkJfQotCQlyZXR1cm4gYWRhcHRlcjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuR3VpZGFuY2VJdGVtUHJvdmlkZXIjZ2V0VGV4dChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBUbmdVdGlsLmdldExhYmVsKG9iamVjdCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldFBhcmVudChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBvYmplY3QpIHsKLQkJRU9iamVjdCBlT2JqID0gKEVPYmplY3QpIHN1cGVyLmdldFBhcmVudChvYmplY3QpOwotCQlpZiAoZU9iaiA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCUNvbnRlbnRQYWNrYWdlSXRlbVByb3ZpZGVyIGl0ZW1Qcm92aWRlciA9IChDb250ZW50UGFja2FnZUl0ZW1Qcm92aWRlcikgVG5nVXRpbAotCQkJCS5nZXRBZGFwdGVyKGVPYmosIENvbnRlbnRQYWNrYWdlSXRlbVByb3ZpZGVyLmNsYXNzKTsKLQkJaWYgKGl0ZW1Qcm92aWRlciAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gaXRlbVByb3ZpZGVyLmdldEd1aWRhbmNlcygpOwotCQl9Ci0JCXJldHVybiBlT2JqOwotCX0KLQotCXByb3RlY3RlZCBDb21tYW5kIGNyZWF0ZUFkZENvbW1hbmQoRWRpdGluZ0RvbWFpbiBkb21haW4sIEVPYmplY3Qgb3duZXIsCi0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgQ29sbGVjdGlvbiBjb2xsZWN0aW9uLCBpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIG5ldyBNZXRob2RFbGVtZW50QWRkQ29tbWFuZCgoQWRkQ29tbWFuZCkgc3VwZXIuY3JlYXRlQWRkQ29tbWFuZCgKLQkJCQlkb21haW4sIG93bmVyLCBmZWF0dXJlLCBjb2xsZWN0aW9uLCBpbmRleCkpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuR3VpZGFuY2VJdGVtUHJvdmlkZXIjbm90aWZ5Q2hhbmdlZChvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb24pCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0KLQkJVG5nVXRpbC5yZWZyZXNoUGFyZW50SWZOYW1lQ2hhbmdlZChub3RpZmljYXRpb24sIHRoaXMpOwotCQkKLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvZWxlbWVudC9HdWlkYW5jZXNJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvZWxlbWVudC9HdWlkYW5jZXNJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGEwZDgzMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2VsZW1lbnQvR3VpZGFuY2VzSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMjYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5lbGVtZW50OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5QcmVzZW50YXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5MaWJyYXJ5RWRpdENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNoZWNrbGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbmNlcHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkVzdGltYXRpb25Db25zaWRlcmF0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkV4YW1wbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HdWlkYW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkd1aWRlbGluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5QcmFjdGljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJlcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJldXNhYmxlQXNzZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2FkbWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuU3VwcG9ydGluZ01hdGVyaWFsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGVtcGxhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZXJtRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRvb2xNZW50b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldoaXRlcGFwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci0KLS8qKgotICogVGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgdGhlICJHdWlkYW5jZSIgZm9sZGVyIGluIHRoZSBMaWJyYXJ5IHZpZXcuCi0gKiA8cD4KLSAqIFRoaXMgY2xhc3Mgd2lsbCBiZSByZW5hbWVkIGFzIEd1aWRhbmNlRm9sZGVySXRlbVByb3ZpZGVyIGluIEVQRiBNNS4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgR3VpZGFuY2VzSXRlbVByb3ZpZGVyIGV4dGVuZHMgVHJhbnNpZW50Q29udGVudFBhY2thZ2VJdGVtUHJvdmlkZXIgewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgR3VpZGFuY2VzSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LAotCQkJQ29udGVudFBhY2thZ2UgY29udGVudFBrZykgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSwgY29udGVudFBrZyk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5lbGVtZW50LlRyYW5zaWVudENvbnRlbnRQYWNrYWdlSXRlbVByb3ZpZGVyI2FjY2VwdEFzQ2hpbGQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHRBc0NoaWxkKE9iamVjdCBvYmopIHsKLQkJaWYgKCFzdXBlci5hY2NlcHRBc0NoaWxkKG9iaikpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiBvYmogaW5zdGFuY2VvZiBHdWlkYW5jZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0Q2hpbGRyZW5GZWF0dXJlcyhqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuRmVhdHVyZXMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoY2hpbGRyZW5GZWF0dXJlcyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRDaGlsZHJlbkZlYXR1cmVzKG9iamVjdCk7Ci0JCQljaGlsZHJlbkZlYXR1cmVzLmFkZChVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkuZ2V0Q29udGVudFBhY2thZ2VfQ29udGVudEVsZW1lbnRzKCkpOwotCQl9Ci0JCXJldHVybiBjaGlsZHJlbkZlYXR1cmVzOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRUZXh0KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX0d1aWRhbmNlc19ncm91cCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldEltYWdlKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9HdWlkYW5jZUZvbGRlciIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2NvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKGphdmEudXRpbC5Db2xsZWN0aW9uLAotCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsCi0JCQlPYmplY3Qgb2JqZWN0KSB7Ci0JCS8vIG5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkCi0JCS8vIChjcmVhdGVDaGlsZFBhcmFtZXRlcgotCQkvLyAoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29udGVudFBhY2thZ2VfQ29udGVudEVsZW1lbnRzKCksCi0JCS8vIFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUF0dGFjaG1lbnQoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldENvbnRlbnRQYWNrYWdlX0NvbnRlbnRFbGVtZW50cygpLCBVbWFGYWN0b3J5LmVJTlNUQU5DRQotCQkJCS5jcmVhdGVDaGVja2xpc3QoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldENvbnRlbnRQYWNrYWdlX0NvbnRlbnRFbGVtZW50cygpLCBVbWFGYWN0b3J5LmVJTlNUQU5DRQotCQkJCS5jcmVhdGVDb25jZXB0KCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRDb250ZW50UGFja2FnZV9Db250ZW50RWxlbWVudHMoKSwgVW1hRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkuY3JlYXRlRXhhbXBsZSgpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0Q29udGVudFBhY2thZ2VfQ29udGVudEVsZW1lbnRzKCksIFVtYUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJLmNyZWF0ZUd1aWRlbGluZSgpKSk7Ci0KLQkJLy8gbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJLy8gLmdldENvbnRlbnRQYWNrYWdlX0NvbnRlbnRFbGVtZW50cygpLCBVbWFGYWN0b3J5LmVJTlNUQU5DRQotCQkvLyAuY3JlYXRlRXN0aW1hdGUoKSkpOwotCQkvLwotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRDb250ZW50UGFja2FnZV9Db250ZW50RWxlbWVudHMoKSwgVW1hRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkuY3JlYXRlRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKCkpKTsKLQotCQkvLyBuZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkvLyAuZ2V0Q29udGVudFBhY2thZ2VfQ29udGVudEVsZW1lbnRzKCksIFVtYUZhY3RvcnkuZUlOU1RBTkNFCi0JCS8vIC5jcmVhdGVFc3RpbWF0aW5nTWV0cmljKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRDb250ZW50UGFja2FnZV9Db250ZW50RWxlbWVudHMoKSwgVW1hRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkuY3JlYXRlUHJhY3RpY2UoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldENvbnRlbnRQYWNrYWdlX0NvbnRlbnRFbGVtZW50cygpLCBVbWFGYWN0b3J5LmVJTlNUQU5DRQotCQkJCS5jcmVhdGVSZXBvcnQoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldENvbnRlbnRQYWNrYWdlX0NvbnRlbnRFbGVtZW50cygpLCBVbWFGYWN0b3J5LmVJTlNUQU5DRQotCQkJCS5jcmVhdGVSZXVzYWJsZUFzc2V0KCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRDb250ZW50UGFja2FnZV9Db250ZW50RWxlbWVudHMoKSwgVW1hRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkuY3JlYXRlUm9hZG1hcCgpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0Q29udGVudFBhY2thZ2VfQ29udGVudEVsZW1lbnRzKCksIFVtYUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJLmNyZWF0ZVN1cHBvcnRpbmdNYXRlcmlhbCgpKSk7Ci0KLQkJLy8gbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJLy8gLmdldENvbnRlbnRQYWNrYWdlX0NvbnRlbnRFbGVtZW50cygpLCBVbWFGYWN0b3J5LmVJTlNUQU5DRQotCQkvLyAuY3JlYXRlVGVjaG5pcXVlKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRDb250ZW50UGFja2FnZV9Db250ZW50RWxlbWVudHMoKSwgVW1hRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkuY3JlYXRlVGVtcGxhdGUoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldENvbnRlbnRQYWNrYWdlX0NvbnRlbnRFbGVtZW50cygpLCBVbWFGYWN0b3J5LmVJTlNUQU5DRQotCQkJCS5jcmVhdGVUZXJtRGVmaW5pdGlvbigpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0Q29udGVudFBhY2thZ2VfQ29udGVudEVsZW1lbnRzKCksIFVtYUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJLmNyZWF0ZVRvb2xNZW50b3IoKSkpOwotCi0JCS8vIG5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkCi0JCS8vIChjcmVhdGVDaGlsZFBhcmFtZXRlcgotCQkvLyAoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29udGVudFBhY2thZ2VfQ29udGVudEVsZW1lbnRzKCksCi0JCS8vIFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVRyYWluaW5nQ2xhc3MoKSkpOwotCQkvLwotCQkvLyBuZXdDaGlsZERlc2NyaXB0b3JzLmFkZAotCQkvLyAoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIKLQkJLy8gKFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbnRlbnRQYWNrYWdlX0NvbnRlbnRFbGVtZW50cygpLAotCQkvLyBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVUcmFpbmluZ01vZHVsZSgpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0Q29udGVudFBhY2thZ2VfQ29udGVudEVsZW1lbnRzKCksIFVtYUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJLmNyZWF0ZVdoaXRlcGFwZXIoKSkpOwotCi0JCS8vIG5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCS8vIC5nZXRDb250ZW50UGFja2FnZV9Db250ZW50RWxlbWVudHMoKSwgVW1hRmFjdG9yeS5lSU5TVEFOQ0UKLQkJLy8gLmNyZWF0ZVdvcmtQcm9kdWN0R3VpZGVsaW5lKCkpKTsKLQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRQYXJlbnQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQkvLyBwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3Qgb2JqZWN0KSB7Ci0JLy8gRU9iamVjdCBlT2JqID0gKEVPYmplY3QpIHN1cGVyLmdldFBhcmVudChvYmplY3QpOwotCS8vIGlmKGVPYmogPT0gbnVsbCkgcmV0dXJuIG51bGw7Ci0JLy8gQ29udGVudFBhY2thZ2VJdGVtUHJvdmlkZXIgaXRlbVByb3ZpZGVyID0gKENvbnRlbnRQYWNrYWdlSXRlbVByb3ZpZGVyKQotCS8vIFRuZ1V0aWwuZ2V0QWRhcHRlcihlT2JqLCBDb250ZW50UGFja2FnZUl0ZW1Qcm92aWRlci5jbGFzcyk7Ci0JLy8gaWYoaXRlbVByb3ZpZGVyICE9IG51bGwpIHsKLQkvLyByZXR1cm4gaXRlbVByb3ZpZGVyLmdldEd1aWRhbmNlcygpOwotCS8vIH0KLQkvLyByZXR1cm4gZU9iajsKLQkvLyB9Ci0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5UcmFuc2llbnRHcm91cEl0ZW1Qcm92aWRlciNzZXREZWZhdWx0TmFtZShqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlZmF1bHROYW1lKE9iamVjdCBvYmopIHsKLQkJU3RyaW5nIGJhc2VOYW1lID0gbnVsbDsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIENoZWNrbGlzdCkgewotCQkJYmFzZU5hbWUgPSBMaWJyYXJ5RWRpdENvbnN0YW50cy5ORVdfQ0hFQ0tMSVNUOwotCQl9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIFdoaXRlcGFwZXIpIHsKLQkJCWJhc2VOYW1lID0gTGlicmFyeUVkaXRDb25zdGFudHMuTkVXX1dISVRFUEFQRVI7Ci0JCX0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgQ29uY2VwdCkgewotCQkJYmFzZU5hbWUgPSBMaWJyYXJ5RWRpdENvbnN0YW50cy5ORVdfQ09OQ0VQVDsKLQkJfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMpIHsKLQkJCWJhc2VOYW1lID0gTGlicmFyeUVkaXRDb25zdGFudHMuTkVXX0VTVElNQVRJT05fQ09OU0lERVJBVElPTjsKLQkJfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBFeGFtcGxlKSB7Ci0JCQliYXNlTmFtZSA9IExpYnJhcnlFZGl0Q29uc3RhbnRzLk5FV19FWEFNUExFOwotCQl9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIFByYWN0aWNlKSB7Ci0JCQliYXNlTmFtZSA9IExpYnJhcnlFZGl0Q29uc3RhbnRzLk5FV19QUkFDVElDRTsKLQkJfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBSZXBvcnQpIHsKLQkJCWJhc2VOYW1lID0gTGlicmFyeUVkaXRDb25zdGFudHMuTkVXX1JFUE9SVDsKLQkJfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBSb2FkbWFwKSB7Ci0JCQliYXNlTmFtZSA9IExpYnJhcnlFZGl0Q29uc3RhbnRzLk5FV19ST0FETUFQOwotCQl9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIFJldXNhYmxlQXNzZXQpIHsKLQkJCWJhc2VOYW1lID0gTGlicmFyeUVkaXRDb25zdGFudHMuTkVXX1JFVVNBQkxFX0FTU0VUOwotCQl9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIFN1cHBvcnRpbmdNYXRlcmlhbCkgewotCQkJYmFzZU5hbWUgPSBMaWJyYXJ5RWRpdENvbnN0YW50cy5ORVdfU1VQUE9SVElOR19NQVRFUklBTDsKLQkJCS8vIH0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgVGVjaG5pcXVlKSB7Ci0JCQkvLyBiYXNlTmFtZSA9ICJuZXdfVGVjaG5pcXVlIjsKLQkJfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBUZW1wbGF0ZSkgewotCQkJYmFzZU5hbWUgPSBMaWJyYXJ5RWRpdENvbnN0YW50cy5ORVdfVEVNUExBVEU7Ci0JCX0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgVGVybURlZmluaXRpb24pIHsKLQkJCWJhc2VOYW1lID0gTGlicmFyeUVkaXRDb25zdGFudHMuTkVXX1RFUk1fREVGSU5JVElPTjsKLQkJfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBUb29sTWVudG9yKSB7Ci0JCQliYXNlTmFtZSA9IExpYnJhcnlFZGl0Q29uc3RhbnRzLk5FV19UT09MX01FTlRPUjsKLQkJfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBHdWlkZWxpbmUpIHsKLQkJCWJhc2VOYW1lID0gTGlicmFyeUVkaXRDb25zdGFudHMuTkVXX0dVSURFTElORTsKLQkJfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBHdWlkYW5jZSkgewotCQkJYmFzZU5hbWUgPSBMaWJyYXJ5RWRpdENvbnN0YW50cy5ORVdfR1VJREFOQ0U7Ci0JCX0KLQkJaWYgKGJhc2VOYW1lICE9IG51bGwpIHsKLQkJCVRuZ1V0aWwuc2V0RGVmYXVsdE5hbWUoKChDb250ZW50UGFja2FnZSkgdGFyZ2V0KQotCQkJCQkuZ2V0Q29udGVudEVsZW1lbnRzKCksIChNZXRob2RFbGVtZW50KSBvYmosIGJhc2VOYW1lKTsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuZWxlbWVudC5UcmFuc2llbnRDb250ZW50UGFja2FnZUl0ZW1Qcm92aWRlciNuZXdDaGlsZEFkZGVkKG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbikKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjaGlsZHJlbkNoYW5nZWQoTm90aWZpY2F0aW9uIG1zZykgewotCQlib29sZWFuIHJlZnJlc2ggPSBmYWxzZTsKLQkJc3dpdGNoIChtc2cuZ2V0RXZlbnRUeXBlKCkpIHsKLQkJY2FzZSBOb3RpZmljYXRpb24uQUREOgotCQkJaWYgKG1zZy5nZXROZXdWYWx1ZSgpIGluc3RhbmNlb2YgVG9vbE1lbnRvcikgewotCQkJCXJlZnJlc2ggPSB0cnVlOwotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgTm90aWZpY2F0aW9uLlJFTU9WRToKLQkJCWlmIChtc2cuZ2V0T2xkVmFsdWUoKSBpbnN0YW5jZW9mIFRvb2xNZW50b3IpIHsKLQkJCQlyZWZyZXNoID0gdHJ1ZTsKLQkJCX0KLQkJCWJyZWFrOwotCQljYXNlIE5vdGlmaWNhdGlvbi5BRERfTUFOWToKLQkJCWNoZWNrX2FkZDogZm9yIChJdGVyYXRvciBpdGVyID0gKChDb2xsZWN0aW9uKSBtc2cuZ2V0TmV3VmFsdWUoKSkKLQkJCQkJLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCWlmIChpdGVyLm5leHQoKSBpbnN0YW5jZW9mIFRvb2xNZW50b3IpIHsKLQkJCQkJcmVmcmVzaCA9IHRydWU7Ci0JCQkJCWJyZWFrIGNoZWNrX2FkZDsKLQkJCQl9Ci0JCQl9Ci0JCQlicmVhazsKLQkJY2FzZSBOb3RpZmljYXRpb24uUkVNT1ZFX01BTlk6Ci0JCQljaGVja19yZW1vdmU6IGZvciAoSXRlcmF0b3IgaXRlciA9ICgoQ29sbGVjdGlvbikgbXNnLmdldE9sZFZhbHVlKCkpCi0JCQkJCS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlpZiAoaXRlci5uZXh0KCkgaW5zdGFuY2VvZiBUb29sTWVudG9yKSB7Ci0JCQkJCXJlZnJlc2ggPSB0cnVlOwotCQkJCQlicmVhayBjaGVja19yZW1vdmU7Ci0JCQkJfQotCQkJfQotCQkJYnJlYWs7Ci0JCX0KLQkJaWYgKHJlZnJlc2gpCi0JCQlUbmdVdGlsLnJlZnJlc2hVbmNhdGVnb3JpemVkVG9vbE1lbnRvcnNJdGVtUHJvdmlkZXIoVW1hVXRpbAotCQkJCQkuZ2V0TWV0aG9kUGx1Z2luKChFT2JqZWN0KSB0YXJnZXQpLCBtc2cpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuVHJhbnNpZW50R3JvdXBJdGVtUHJvdmlkZXIjZ2V0Q2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCUxpc3QgY2hpbGRyZW4gPSBudWxsOwotCQlDb2xsZWN0aW9uIGNvbGxlY3Rpb24gPSBzdXBlci5nZXRDaGlsZHJlbihvYmplY3QpOwotCQlpZiAoY29sbGVjdGlvbiBpbnN0YW5jZW9mIExpc3QpIHsKLQkJCWNoaWxkcmVuID0gKExpc3QpIGNvbGxlY3Rpb247Ci0JCX0gZWxzZSB7Ci0JCQljaGlsZHJlbiA9IG5ldyBBcnJheUxpc3QoY29sbGVjdGlvbik7Ci0JCX0KLQkJQ29sbGVjdGlvbnMuc29ydChjaGlsZHJlbiwgUHJlc2VudGF0aW9uQ29udGV4dC5JTlNUQU5DRS5nZXRHdWlkYW5jZVR5cGVDb21wYXJhdG9yKCkpOwotCQlyZXR1cm4gY2hpbGRyZW47Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2VsZW1lbnQvSUVsZW1lbnRJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvZWxlbWVudC9JRWxlbWVudEl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyM2Y3NzcwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvZWxlbWVudC9JRWxlbWVudEl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5lbGVtZW50OwotCi0vKioKLSAqIFRoZSBiYXNlIGludGVyZmFjZSBmb3IgYSBtZXRob2QgZWxlbWVudCBpdGVtIHByb3ZpZGVyLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUVsZW1lbnRJdGVtUHJvdmlkZXIgewotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2VsZW1lbnQvUm9sZUl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9lbGVtZW50L1JvbGVJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmFlNmIwNS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2VsZW1lbnQvUm9sZUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5lbGVtZW50OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLQotLyoqCi0gKiBUaGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHJvbGUuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFJvbGVJdGVtUHJvdmlkZXIgZXh0ZW5kcyBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLlJvbGVJdGVtUHJvdmlkZXIgewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgUm9sZUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldFBhcmVudChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBvYmplY3QpIHsKLQkJRU9iamVjdCBjb250ZW50UGtnID0gKEVPYmplY3QpIHN1cGVyLmdldFBhcmVudChvYmplY3QpOwotCQlpZiAoY29udGVudFBrZyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCUNvbnRlbnRQYWNrYWdlSXRlbVByb3ZpZGVyIGl0ZW1Qcm92aWRlciA9IChDb250ZW50UGFja2FnZUl0ZW1Qcm92aWRlcikgVG5nVXRpbAotCQkJCS5nZXRBZGFwdGVyKGNvbnRlbnRQa2csIENvbnRlbnRQYWNrYWdlSXRlbVByb3ZpZGVyLmNsYXNzKTsKLQkJcmV0dXJuIGl0ZW1Qcm92aWRlciAhPSBudWxsID8gaXRlbVByb3ZpZGVyLmdldFJvbGVzKCkgOiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhqYXZhLnV0aWwuQ29sbGVjdGlvbiwKLQkgKiAgICAgIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLAotCQkJT2JqZWN0IG9iamVjdCkgewotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRDaGlsZHJlbkZlYXR1cmVzKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5GZWF0dXJlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlbkZlYXR1cmVzID09IG51bGwpIHsKLQkJCWNoaWxkcmVuRmVhdHVyZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuRmVhdHVyZXM7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldFRleHQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gVG5nVXRpbC5nZXRMYWJlbChvYmplY3QsIGdldFN0cmluZygiX1VJX1JvbGVfdHlwZSIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuUm9sZUl0ZW1Qcm92aWRlciNub3RpZnlDaGFuZ2VkKG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQotCQlUbmdVdGlsLnJlZnJlc2hQYXJlbnRJZk5hbWVDaGFuZ2VkKG5vdGlmaWNhdGlvbiwgdGhpcyk7Ci0JCQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9lbGVtZW50L1JvbGVzSXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2VsZW1lbnQvUm9sZXNJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzg5NjQ5ZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2VsZW1lbnQvUm9sZXNJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmVsZW1lbnQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuTGlicmFyeUVkaXRDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci0KLS8qKgotICogVGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgdGhlICJSb2xlcyIgZm9sZGVyIGluIHRoZSBMaWJyYXJ5IHZpZXcuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFJvbGVzSXRlbVByb3ZpZGVyIGV4dGVuZHMgVHJhbnNpZW50Q29udGVudFBhY2thZ2VJdGVtUHJvdmlkZXIgewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgUm9sZXNJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksCi0JCQlDb250ZW50UGFja2FnZSBjb250ZW50UGtnKSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5LCBjb250ZW50UGtnKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0Q2hpbGRyZW5GZWF0dXJlcyhqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXN5bmNocm9uaXplZCBwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbkZlYXR1cmVzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGNoaWxkcmVuRmVhdHVyZXMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0Q2hpbGRyZW5GZWF0dXJlcyhvYmplY3QpOwotCQkJY2hpbGRyZW5GZWF0dXJlcy5hZGQoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJLmdldENvbnRlbnRQYWNrYWdlX0NvbnRlbnRFbGVtZW50cygpKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW5GZWF0dXJlczsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0VGV4dChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9Sb2xlc19ncm91cCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldEltYWdlKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9Sb2xlcyIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2NvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKGphdmEudXRpbC5Db2xsZWN0aW9uLAotCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsCi0JCQlPYmplY3Qgb2JqZWN0KSB7Ci0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldENvbnRlbnRQYWNrYWdlX0NvbnRlbnRFbGVtZW50cygpLCBVbWFGYWN0b3J5LmVJTlNUQU5DRQotCQkJCS5jcmVhdGVSb2xlKCkpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHRBc0NoaWxkKE9iamVjdCBvYmopIHsKLQkJaWYgKCFzdXBlci5hY2NlcHRBc0NoaWxkKG9iaikpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiBvYmogaW5zdGFuY2VvZiBSb2xlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuVHJhbnNpZW50R3JvdXBJdGVtUHJvdmlkZXIjc2V0RGVmYXVsdE5hbWUoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZWZhdWx0TmFtZShPYmplY3Qgb2JqKSB7Ci0JCVN0cmluZyBiYXNlTmFtZSA9IG51bGw7Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBSb2xlKSB7Ci0JCQliYXNlTmFtZSA9IExpYnJhcnlFZGl0Q29uc3RhbnRzLk5FV19ST0xFOwotCQl9Ci0JCWlmIChiYXNlTmFtZSAhPSBudWxsKSB7Ci0JCQlUbmdVdGlsLnNldERlZmF1bHROYW1lKCgoQ29udGVudFBhY2thZ2UpIHRhcmdldCkKLQkJCQkJLmdldENvbnRlbnRFbGVtZW50cygpLCAoTWV0aG9kRWxlbWVudCkgb2JqLCBiYXNlTmFtZSk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LmVsZW1lbnQuVHJhbnNpZW50Q29udGVudFBhY2thZ2VJdGVtUHJvdmlkZXIjbmV3Q2hpbGRBZGRlZChvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb24pCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY2hpbGRyZW5DaGFuZ2VkKE5vdGlmaWNhdGlvbiBtc2cpIHsKLQkJVG5nVXRpbC5yZWZyZXNoVW5jYXRlZ29yaXplZFJvbGVzSXRlbVByb3ZpZGVyKFVtYVV0aWwKLQkJCQkuZ2V0TWV0aG9kUGx1Z2luKChFT2JqZWN0KSB0YXJnZXQpLCBtc2cpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuVHJhbnNpZW50R3JvdXBJdGVtUHJvdmlkZXIjZ2V0Q2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCUNvbGxlY3Rpb24gY2hpbGRyZW4gPSBzdXBlci5nZXRDaGlsZHJlbihvYmplY3QpOwotCQlyZXR1cm4gY2hpbGRyZW47Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5UcmFuc2llbnRHcm91cEl0ZW1Qcm92aWRlciNzZXRGaWx0ZXIoY29tLmlibS5saWJyYXJ5LmVkaXQuSUZpbHRlcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGaWx0ZXIoSUZpbHRlciBmaWx0ZXIpIHsKLQkJc3VwZXIuc2V0RmlsdGVyKGZpbHRlcik7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2VsZW1lbnQvU2VjdGlvbkl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9lbGVtZW50L1NlY3Rpb25JdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2UxNDg5MC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2VsZW1lbnQvU2VjdGlvbkl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5lbGVtZW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci0KLS8qKgotICogVGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSBzZWN0aW9uLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBTZWN0aW9uSXRlbVByb3ZpZGVyIGV4dGVuZHMKLQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5TZWN0aW9uSXRlbVByb3ZpZGVyIHsKLQotCXB1YmxpYyBTZWN0aW9uSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gVG5nVXRpbC5nZXRMYWJlbChvYmplY3QsIGdldFN0cmluZygiX1VJX1NlY3Rpb25fdHlwZSIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvZWxlbWVudC9UYXNrSXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2VsZW1lbnQvVGFza0l0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMDY4MWE5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvZWxlbWVudC9UYXNrSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5lbGVtZW50OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLQotLyoqCi0gKiBUaGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHRhc2suCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFRhc2tJdGVtUHJvdmlkZXIgZXh0ZW5kcyBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLlRhc2tJdGVtUHJvdmlkZXIgewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgVGFza0l0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldFBhcmVudChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBvYmplY3QpIHsKLQkJRU9iamVjdCBjb250ZW50UGtnID0gKEVPYmplY3QpIHN1cGVyLmdldFBhcmVudChvYmplY3QpOwotCQlpZiAoY29udGVudFBrZyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCUNvbnRlbnRQYWNrYWdlSXRlbVByb3ZpZGVyIGl0ZW1Qcm92aWRlciA9IChDb250ZW50UGFja2FnZUl0ZW1Qcm92aWRlcikgVG5nVXRpbAotCQkJCS5nZXRBZGFwdGVyKGNvbnRlbnRQa2csIENvbnRlbnRQYWNrYWdlSXRlbVByb3ZpZGVyLmNsYXNzKTsKLQkJcmV0dXJuIGl0ZW1Qcm92aWRlciAhPSBudWxsID8gaXRlbVByb3ZpZGVyLmdldFRhc2tzKCkgOiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhqYXZhLnV0aWwuQ29sbGVjdGlvbiwKLQkgKiAgICAgIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLAotCQkJT2JqZWN0IG9iamVjdCkgewotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRDaGlsZHJlbkZlYXR1cmVzKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5GZWF0dXJlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlbkZlYXR1cmVzID09IG51bGwpIHsKLQkJCWNoaWxkcmVuRmVhdHVyZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuRmVhdHVyZXM7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2NyZWF0ZUNvbW1hbmQoamF2YS5sYW5nLk9iamVjdCwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluLCBqYXZhLmxhbmcuQ2xhc3MsCi0JICogICAgICBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXIpCi0JICovCi0JLy8gcHVibGljIENvbW1hbmQgY3JlYXRlQ29tbWFuZChPYmplY3Qgb2JqZWN0LCBFZGl0aW5nRG9tYWluIGRvbWFpbiwKLQkvLyBDbGFzcyBjb21tYW5kQ2xhc3MsIENvbW1hbmRQYXJhbWV0ZXIgY29tbWFuZFBhcmFtZXRlcikgewotCS8vIC8vIGlmKGNvbW1hbmRDbGFzcyA9PSBSZW1vdmVDb21tYW5kLmNsYXNzKSB7Ci0JLy8gLy8gY29tbWFuZFBhcmFtZXRlci5zZXRPd25lcigoKEVPYmplY3Qpb2JqZWN0KS5lQ29udGFpbmVyKCkpOwotCS8vIC8vIH0KLQkvLyBDb21tYW5kIGNtZCA9IHN1cGVyLmNyZWF0ZUNvbW1hbmQob2JqZWN0LCBkb21haW4sIGNvbW1hbmRDbGFzcywKLQkvLyBjb21tYW5kUGFyYW1ldGVyKTsKLQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiI2NyZWF0ZUNvbW1hbmQ6ICIgKwotCS8vIGNvbW1hbmRDbGFzcyArICIsIGNhbiBleGVjdXRlOiAiICsgY21kLmNhbkV4ZWN1dGUoKSArICIsIG93bmVyOiAiICsKLQkvLyBjb21tYW5kUGFyYW1ldGVyLmdldE93bmVyKCkgKyAiLCBjb2xsZWN0aW9uOiAiICsKLQkvLyBjb21tYW5kUGFyYW1ldGVyLmdldENvbGxlY3Rpb24oKSk7Ci0JLy8gcmV0dXJuIGNtZDsKLQkvLyB9Ci0JCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldFRleHQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gVG5nVXRpbC5nZXRMYWJlbChvYmplY3QsIGdldFN0cmluZygiX1VJX1Rhc2tfdHlwZSIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5UYXNrSXRlbVByb3ZpZGVyI25vdGlmeUNoYW5nZWQob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCi0vLwkJc3dpdGNoKG5vdGlmaWNhdGlvbi5nZXRFdmVudFR5cGUoKSkgewotLy8JCWNhc2UgRXZlbnRUeXBlcy5NQUtFX1BST1hZOgotLy8JCQkvLyByZWZyZXNoIHBhcmVudAotLy8JCQkvLwotLy8JCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgZ2V0UGFyZW50KG5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpKSwgdHJ1ZSwgZmFsc2UpKTsKLS8vCQkJCi0vLwkJCS8vIHJlZnJlc2ggaXRzZWxmCi0vLwkJCS8vCi0vLwkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKSwgdHJ1ZSwgdHJ1ZSkpOwotLy8JCQkKLS8vCQkJcmV0dXJuOwotLy8JCX0KLQkJCi0JCVRuZ1V0aWwucmVmcmVzaFBhcmVudElmTmFtZUNoYW5nZWQobm90aWZpY2F0aW9uLCB0aGlzKTsKLQkJCi0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2VsZW1lbnQvVGFza3NJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvZWxlbWVudC9UYXNrc0l0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NTIxMDc4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvZWxlbWVudC9UYXNrc0l0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuZWxlbWVudDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkxpYnJhcnlFZGl0Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFzazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5VbWFVdGlsOwotCi0vKioKLSAqIFRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIHRoZSAiVGFza3MiIGZvbGRlciBpbiB0aGUgTGlicmFyeSB2aWV3LgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBUYXNrc0l0ZW1Qcm92aWRlciBleHRlbmRzIFRyYW5zaWVudENvbnRlbnRQYWNrYWdlSXRlbVByb3ZpZGVyIHsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFRhc2tzSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LAotCQkJQ29udGVudFBhY2thZ2UgY29udGVudFBrZykgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSwgY29udGVudFBrZyk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldENoaWxkcmVuRmVhdHVyZXMoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbkZlYXR1cmVzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGNoaWxkcmVuRmVhdHVyZXMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0Q2hpbGRyZW5GZWF0dXJlcyhvYmplY3QpOwotCQkJY2hpbGRyZW5GZWF0dXJlcy5hZGQoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJLmdldENvbnRlbnRQYWNrYWdlX0NvbnRlbnRFbGVtZW50cygpKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW5GZWF0dXJlczsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0VGV4dChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9UYXNrc19ncm91cCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldEltYWdlKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9UYXNrcyIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2NvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKGphdmEudXRpbC5Db2xsZWN0aW9uLAotCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsCi0JCQlPYmplY3Qgb2JqZWN0KSB7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0Q29udGVudFBhY2thZ2VfQ29udGVudEVsZW1lbnRzKCksIFVtYUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJLmNyZWF0ZVRhc2soKSkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS50bmcuZWxlbWVudC5UcmFuc2llbnRDb250ZW50UGFja2FnZUl0ZW1Qcm92aWRlciNhY2NlcHRBc0NoaWxkKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0QXNDaGlsZChPYmplY3Qgb2JqKSB7Ci0JCWlmICghc3VwZXIuYWNjZXB0QXNDaGlsZChvYmopKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gb2JqIGluc3RhbmNlb2YgVGFzazsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LlRyYW5zaWVudEdyb3VwSXRlbVByb3ZpZGVyI3NldERlZmF1bHROYW1lKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGVmYXVsdE5hbWUoT2JqZWN0IG9iaikgewotCQlTdHJpbmcgYmFzZU5hbWUgPSBudWxsOwotCQlpZiAob2JqIGluc3RhbmNlb2YgVGFzaykgewotCQkJYmFzZU5hbWUgPSBMaWJyYXJ5RWRpdENvbnN0YW50cy5ORVdfVEFTSzsKLQkJfQotCQlpZiAoYmFzZU5hbWUgIT0gbnVsbCkgewotCQkJVG5nVXRpbC5zZXREZWZhdWx0TmFtZSgoKENvbnRlbnRQYWNrYWdlKSB0YXJnZXQpCi0JCQkJCS5nZXRDb250ZW50RWxlbWVudHMoKSwgKE1ldGhvZEVsZW1lbnQpIG9iaiwgYmFzZU5hbWUpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5lbGVtZW50LlRyYW5zaWVudENvbnRlbnRQYWNrYWdlSXRlbVByb3ZpZGVyI25ld0NoaWxkQWRkZWQoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNoaWxkcmVuQ2hhbmdlZChOb3RpZmljYXRpb24gbXNnKSB7Ci0JCS8vIHJlZnJlc2ggdGhlIHVuY2F0ZWdvcml6ZWQgdGFza3MgZ3JvdXAKLQkJLy8KLQkJVG5nVXRpbC5yZWZyZXNoVW5jYXRlZ29yaXplZFRhc2tzSXRlbVByb3ZpZGVyKFVtYVV0aWwKLQkJCQkuZ2V0TWV0aG9kUGx1Z2luKChFT2JqZWN0KSB0YXJnZXQpLCBtc2cpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2VsZW1lbnQvVHJhbnNpZW50Q29udGVudFBhY2thZ2VJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvZWxlbWVudC9UcmFuc2llbnRDb250ZW50UGFja2FnZUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOWRkY2VhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvZWxlbWVudC9UcmFuc2llbnRDb250ZW50UGFja2FnZUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuZWxlbWVudDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UcmFuc2llbnRHcm91cEl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiBUaGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciB0aGUgIkNvbnRlbnQgUGFja2FnZXMiIHN1YiBmb2xkZXJzIGluIHRoZQotICogTGlicmFyeSB2aWV3LgotICogPHA+Ci0gKiBUaGlzIGNsYXNzIHdpbGwgYmUgcmVuYW1lZCBhcyBDb250ZW50UGFja2FnZUl0ZW1Qcm92aWRlciBpbiBFUEYgTTUuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFRyYW5zaWVudENvbnRlbnRQYWNrYWdlSXRlbVByb3ZpZGVyIGV4dGVuZHMKLQkJVHJhbnNpZW50R3JvdXBJdGVtUHJvdmlkZXIgewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgVHJhbnNpZW50Q29udGVudFBhY2thZ2VJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksCi0JCQlDb250ZW50UGFja2FnZSBjb250ZW50UGtnKSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5LCBjb250ZW50UGtnKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXIjbm90aWZ5Q2hhbmdlZChvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb24pCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbXNnKSB7Ci0JCWlmIChtc2cuZ2V0Tm90aWZpZXIoKSA9PSB0YXJnZXQpIHsKLQkJCWludCBmZWF0dXJlSWQgPSBtc2cuZ2V0RmVhdHVyZUlEKENvbnRlbnRQYWNrYWdlLmNsYXNzKTsKLQkJCWlmIChmZWF0dXJlSWQgPT0gVW1hUGFja2FnZS5DT05URU5UX1BBQ0tBR0VfX0NPTlRFTlRfRUxFTUVOVFMpIHsKLQkJCQlib29sZWFuIG5vdGlmeSA9IGZhbHNlOwotCQkJCXN3aXRjaCAobXNnLmdldEV2ZW50VHlwZSgpKSB7Ci0JCQkJY2FzZSBOb3RpZmljYXRpb24uQUREOgotCQkJCWNhc2UgTm90aWZpY2F0aW9uLk1PVkU6Ci0JCQkJCU9iamVjdCBvYmogPSBtc2cuZ2V0TmV3VmFsdWUoKTsKLQkJCQkJbm90aWZ5ID0gYWNjZXB0QXNDaGlsZChvYmopOwotCQkJCQlicmVhazsKLQkJCQljYXNlIE5vdGlmaWNhdGlvbi5SRU1PVkU6Ci0JCQkJCW9iaiA9IG1zZy5nZXRPbGRWYWx1ZSgpOwotCQkJCQlub3RpZnkgPSBhY2NlcHRBc0NoaWxkKG9iaik7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgTm90aWZpY2F0aW9uLkFERF9NQU5ZOgotCQkJCQlDb2xsZWN0aW9uIGNvbGxlY3Rpb24gPSAoQ29sbGVjdGlvbikgbXNnLmdldE5ld1ZhbHVlKCk7Ci0JCQkJCWZvcl9jaGVjazogZm9yIChJdGVyYXRvciBpdGVyID0gY29sbGVjdGlvbi5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCWlmIChhY2NlcHRBc0NoaWxkKGl0ZXIubmV4dCgpKSkgewotCQkJCQkJCW5vdGlmeSA9IHRydWU7Ci0JCQkJCQkJYnJlYWsgZm9yX2NoZWNrOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgTm90aWZpY2F0aW9uLlJFTU9WRV9NQU5ZOgotCQkJCQljb2xsZWN0aW9uID0gKENvbGxlY3Rpb24pIG1zZy5nZXRPbGRWYWx1ZSgpOwotCQkJCQlmb3JfY2hlY2s6IGZvciAoSXRlcmF0b3IgaXRlciA9IGNvbGxlY3Rpb24uaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlpZiAoYWNjZXB0QXNDaGlsZChpdGVyLm5leHQoKSkpIHsKLQkJCQkJCQlub3RpZnkgPSB0cnVlOwotCQkJCQkJCWJyZWFrIGZvcl9jaGVjazsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQljYXNlIE5vdGlmaWNhdGlvbi5TRVQ6Ci0JCQkJCWlmKG1zZy5nZXROZXdWYWx1ZSgpICE9IG1zZy5nZXRPbGRWYWx1ZSgpKSB7Ci0JCQkJCQlub3RpZnkgPSB0cnVlOwotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQkKLQkJCQlpZiAobm90aWZ5KSB7Ci0JCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obXNnLCB0aGlzLCB0cnVlLAotCQkJCQkJCWZhbHNlKSk7Ci0JCQkJCWNoaWxkcmVuQ2hhbmdlZChtc2cpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG1zZyk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY2hpbGRyZW5DaGFuZ2VkKE5vdGlmaWNhdGlvbiBtc2cpIHsKLQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuVHJhbnNpZW50R3JvdXBJdGVtUHJvdmlkZXIjZ2V0SW50ZXJlc3RlZEZlYXR1cmVDbGFzcygpCi0JICovCi0JcHVibGljIENsYXNzIGdldEludGVyZXN0ZWRGZWF0dXJlT3duZXJDbGFzcygpIHsKLQkJcmV0dXJuIENvbnRlbnRQYWNrYWdlLmNsYXNzOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuVHJhbnNpZW50R3JvdXBJdGVtUHJvdmlkZXIjZ2V0SW50ZXJlc3RlZEZlYXR1cmVJRCgpCi0JICovCi0JcHVibGljIGludCBnZXRJbnRlcmVzdGVkRmVhdHVyZUlEKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5DT05URU5UX1BBQ0tBR0VfX0NPTlRFTlRfRUxFTUVOVFM7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5UcmFuc2llbnRHcm91cEl0ZW1Qcm92aWRlciNhY2NlcHRBc0NoaWxkKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0QXNDaGlsZChPYmplY3Qgb2JqKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9lbGVtZW50L1dvcmtQcm9kdWN0SXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2VsZW1lbnQvV29ya1Byb2R1Y3RJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2EyZTgxZi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2VsZW1lbnQvV29ya1Byb2R1Y3RJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmVsZW1lbnQ7Ci0KLWltcG9ydCBqYXZhLm5ldC5VUkk7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BcnRpZmFjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpYmFibGVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuT3V0Y29tZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLlVtYUVkaXRQbHVnaW47Ci0KLS8qKgotICogVGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB3b3JrIHByb2R1Y3QuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFdvcmtQcm9kdWN0SXRlbVByb3ZpZGVyIGV4dGVuZHMKLQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5Xb3JrUHJvZHVjdEl0ZW1Qcm92aWRlciB7Ci0KLQlwcml2YXRlIEl0ZW1Qcm92aWRlckFkYXB0ZXIgZGVsZWdhdGVJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBXb3JrUHJvZHVjdEl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JcHVibGljIFdvcmtQcm9kdWN0SXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LAotCQkJSXRlbVByb3ZpZGVyQWRhcHRlciBkZWxlZ2F0ZUl0ZW1Qcm92aWRlcikgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JCXRoaXMuZGVsZWdhdGVJdGVtUHJvdmlkZXIgPSBkZWxlZ2F0ZUl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGRlbGVnYXRlSXRlbVByb3ZpZGVyICE9IG51bGwpIHsKLQkJCXJldHVybiBkZWxlZ2F0ZUl0ZW1Qcm92aWRlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0UGFyZW50KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IG9iamVjdCkgewotCQlFT2JqZWN0IGVPYmogPSAoRU9iamVjdCkgc3VwZXIuZ2V0UGFyZW50KG9iamVjdCk7Ci0JCWlmIChlT2JqID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJQ29udGVudFBhY2thZ2VJdGVtUHJvdmlkZXIgaXRlbVByb3ZpZGVyID0gKENvbnRlbnRQYWNrYWdlSXRlbVByb3ZpZGVyKSBUbmdVdGlsCi0JCQkJLmdldEFkYXB0ZXIoZU9iaiwgQ29udGVudFBhY2thZ2VJdGVtUHJvdmlkZXIuY2xhc3MpOwotCQlpZiAoaXRlbVByb3ZpZGVyICE9IG51bGwpIHsKLQkJCXJldHVybiBpdGVtUHJvdmlkZXIuZ2V0V29ya1Byb2R1Y3RzKCk7Ci0JCX0KLQkJcmV0dXJuIGVPYmo7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2NvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKGphdmEudXRpbC5Db2xsZWN0aW9uLAotCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsCi0JCQlPYmplY3Qgb2JqZWN0KSB7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldENoaWxkcmVuRmVhdHVyZXMoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbkZlYXR1cmVzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGNoaWxkcmVuRmVhdHVyZXMgPT0gbnVsbCkgewotCQkJY2hpbGRyZW5GZWF0dXJlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW5GZWF0dXJlczsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0VGV4dChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBBcnRpZmFjdCkgewotCQkJcmV0dXJuIFRuZ1V0aWwuZ2V0TGFiZWwob2JqZWN0LCBnZXRTdHJpbmcoIl9VSV9BcnRpZmFjdF90eXBlIikpOyAvLyROT04tTkxTLTEkCi0JCX0gZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgRGVsaXZlcmFibGUpIHsKLQkJCXJldHVybiBUbmdVdGlsLmdldExhYmVsKG9iamVjdCwgZ2V0U3RyaW5nKCJfVUlfRGVsaXZlcmFibGVfdHlwZSIpKTsgLy8kTk9OLU5MUy0xJAotCQl9IGVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIE91dGNvbWUpIHsKLQkJCXJldHVybiBUbmdVdGlsLmdldExhYmVsKG9iamVjdCwgZ2V0U3RyaW5nKCJfVUlfT3V0Y29tZV90eXBlIikpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlyZXR1cm4gVG5nVXRpbC5nZXRMYWJlbChvYmplY3QsIGdldFN0cmluZygiX1VJX1dvcmtQcm9kdWN0X3R5cGUiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0SW1hZ2UoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIERlc2NyaWJhYmxlRWxlbWVudCkgewotCQkJaWYgKCgoRGVzY3JpYmFibGVFbGVtZW50KSBvYmplY3QpLmdldE5vZGVpY29uKCkgIT0gbnVsbCkgewotCQkJCVVSSSBpbWdVcmkgPSBUbmdVdGlsLmdldEZ1bGxQYXRob2ZOb2Rlb3JTaGFwZUljb25VUkkoCi0JCQkJCQkoRGVzY3JpYmFibGVFbGVtZW50KSBvYmplY3QsCi0JCQkJCQkoKERlc2NyaWJhYmxlRWxlbWVudCkgb2JqZWN0KS5nZXROb2RlaWNvbigpKTsKLQkJCQlPYmplY3QgaW1hZ2UgPSBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkJLmdldFNoYXJlZEltYWdlKGltZ1VyaSk7Ci0JCQkJaWYgKGltYWdlICE9IG51bGwpCi0JCQkJCXJldHVybiBpbWFnZTsKLQkJCX0KLQkJfQotCQlpZiAoZGVsZWdhdGVJdGVtUHJvdmlkZXIgIT0gbnVsbCkgewotCQkJcmV0dXJuIGRlbGVnYXRlSXRlbVByb3ZpZGVyLmdldEltYWdlKG9iamVjdCk7Ci0JCX0KLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIEFydGlmYWN0KSB7Ci0JCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9BcnRpZmFjdCIpOyAvLyROT04tTkxTLTEkCi0JCX0gZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgRGVsaXZlcmFibGUpIHsKLQkJCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFLmdldEltYWdlKCJmdWxsL29iajE2L0RlbGl2ZXJhYmxlIik7IC8vJE5PTi1OTFMtMSQKLQkJfSBlbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBPdXRjb21lKSB7Ci0JCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9PdXRjb21lIik7IC8vJE5PTi1OTFMtMSQKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBzdXBlci5nZXRJbWFnZShvYmplY3QpOwotCQl9Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5Xb3JrUHJvZHVjdEl0ZW1Qcm92aWRlciNub3RpZnlDaGFuZ2VkKG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQotCQlUbmdVdGlsLnJlZnJlc2hQYXJlbnRJZk5hbWVDaGFuZ2VkKG5vdGlmaWNhdGlvbiwgdGhpcyk7Ci0JCQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9lbGVtZW50L1dvcmtQcm9kdWN0c0l0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9lbGVtZW50L1dvcmtQcm9kdWN0c0l0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNGE5MzQ3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvZWxlbWVudC9Xb3JrUHJvZHVjdHNJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmVsZW1lbnQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5MaWJyYXJ5RWRpdENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFydGlmYWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5PdXRjb21lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLQotLyoqCi0gKiBUaGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciB0aGUgIldvcmsgUHJvZHVjdHMiIGZvbGRlciBpbiB0aGUgTGlicmFyeSB2aWV3LgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBXb3JrUHJvZHVjdHNJdGVtUHJvdmlkZXIgZXh0ZW5kcwotCQlUcmFuc2llbnRDb250ZW50UGFja2FnZUl0ZW1Qcm92aWRlciB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBXb3JrUHJvZHVjdHNJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksCi0JCQlDb250ZW50UGFja2FnZSBjb250ZW50UGtnKSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5LCBjb250ZW50UGtnKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0Q2hpbGRyZW5GZWF0dXJlcyhqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuRmVhdHVyZXMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoY2hpbGRyZW5GZWF0dXJlcyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRDaGlsZHJlbkZlYXR1cmVzKG9iamVjdCk7Ci0JCQljaGlsZHJlbkZlYXR1cmVzLmFkZChVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkuZ2V0Q29udGVudFBhY2thZ2VfQ29udGVudEVsZW1lbnRzKCkpOwotCQl9Ci0JCXJldHVybiBjaGlsZHJlbkZlYXR1cmVzOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRUZXh0KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX1dvcmtQcm9kdWN0c19ncm91cCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldEltYWdlKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9Xb3JrUHJvZHVjdHMiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhqYXZhLnV0aWwuQ29sbGVjdGlvbiwKLQkgKiAgICAgIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLAotCQkJT2JqZWN0IG9iamVjdCkgewotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRDb250ZW50UGFja2FnZV9Db250ZW50RWxlbWVudHMoKSwgVW1hRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkuY3JlYXRlQXJ0aWZhY3QoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldENvbnRlbnRQYWNrYWdlX0NvbnRlbnRFbGVtZW50cygpLCBVbWFGYWN0b3J5LmVJTlNUQU5DRQotCQkJCS5jcmVhdGVEZWxpdmVyYWJsZSgpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0Q29udGVudFBhY2thZ2VfQ29udGVudEVsZW1lbnRzKCksIFVtYUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJLmNyZWF0ZU91dGNvbWUoKSkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS50bmcuZWxlbWVudC5UcmFuc2llbnRDb250ZW50UGFja2FnZUl0ZW1Qcm92aWRlciNhY2NlcHRBc0NoaWxkKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0QXNDaGlsZChPYmplY3Qgb2JqKSB7Ci0JCWlmICghc3VwZXIuYWNjZXB0QXNDaGlsZChvYmopKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gb2JqIGluc3RhbmNlb2YgV29ya1Byb2R1Y3Q7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5UcmFuc2llbnRHcm91cEl0ZW1Qcm92aWRlciNzZXREZWZhdWx0TmFtZShqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlZmF1bHROYW1lKE9iamVjdCBvYmopIHsKLQkJU3RyaW5nIGJhc2VOYW1lID0gbnVsbDsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIEFydGlmYWN0KSB7Ci0JCQliYXNlTmFtZSA9IExpYnJhcnlFZGl0Q29uc3RhbnRzLk5FV19BUlRJRkFDVDsKLQkJfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBEZWxpdmVyYWJsZSkgewotCQkJYmFzZU5hbWUgPSBMaWJyYXJ5RWRpdENvbnN0YW50cy5ORVdfREVMSVZFUkFCTEU7Ci0JCX0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgT3V0Y29tZSkgewotCQkJYmFzZU5hbWUgPSBMaWJyYXJ5RWRpdENvbnN0YW50cy5ORVdfT1VUQ09NRTsKLQkJfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBXb3JrUHJvZHVjdCkgewotCQkJYmFzZU5hbWUgPSBMaWJyYXJ5RWRpdENvbnN0YW50cy5ORVdfV09SS1BST0RVQ1Q7Ci0JCX0KLQkJaWYgKGJhc2VOYW1lICE9IG51bGwpIHsKLQkJCVRuZ1V0aWwuc2V0RGVmYXVsdE5hbWUoKChDb250ZW50UGFja2FnZSkgdGFyZ2V0KQotCQkJCQkuZ2V0Q29udGVudEVsZW1lbnRzKCksIChNZXRob2RFbGVtZW50KSBvYmosIGJhc2VOYW1lKTsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuZWxlbWVudC5UcmFuc2llbnRDb250ZW50UGFja2FnZUl0ZW1Qcm92aWRlciNuZXdDaGlsZEFkZGVkKG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbikKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjaGlsZHJlbkNoYW5nZWQoTm90aWZpY2F0aW9uIG1zZykgewotCQlUbmdVdGlsLnJlZnJlc2hVbmNhdGVnb3JpemVkV29ya1Byb2R1Y3RzSXRlbVByb3ZpZGVycyhVbWFVdGlsCi0JCQkJLmdldE1ldGhvZFBsdWdpbigoRU9iamVjdCkgdGFyZ2V0KSwgbXNnKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvZWxlbWVudC9wYWNrYWdlLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2VsZW1lbnQvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MmZiZjk5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvZWxlbWVudC9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyBkaXNwbGF5IGFuZCBlZGl0aW5nIHN1cHBvcnQgZm9yIGNvcmUgbWV0aG9kIGVsZW1lbnRzIGFuZCBndWlkYW5jZS4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2ludGVybmFsL0lMaXN0ZW5lclByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2ludGVybmFsL0lMaXN0ZW5lclByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlN2YzY2MuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pbnRlcm5hbC9JTGlzdGVuZXJQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSU5vdGlmeUNoYW5nZWRMaXN0ZW5lcjsKLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuNQotICoKLSAqLwotcHVibGljIGludGVyZmFjZSBJTGlzdGVuZXJQcm92aWRlciB7Ci0JTGlzdDxJTm90aWZ5Q2hhbmdlZExpc3RlbmVyPiBnZXROb3RpZnlDaGFuZ2VkTGlzdGVuZXJzKCk7Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2ludGVybmFsL1RuZ0FkYXB0ZXJGYWN0b3J5SW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pbnRlcm5hbC9UbmdBZGFwdGVyRmFjdG9yeUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTJiZGQ3ZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2ludGVybmFsL1RuZ0FkYXB0ZXJGYWN0b3J5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA1MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VkQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUNoYW5nZU5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklEaXNwb3NhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklOb3RpZnlDaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlJlZmxlY3RpdmVJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnByZWZlcmVuY2VzLklQcmVmZXJlbmNlU3RvcmVXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24ucHJlZmVyZW5jZXMuSVByb3BlcnR5Q2hhbmdlRXZlbnRXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24ucHJlZmVyZW5jZXMuSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuRXh0ZW5zaW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklDb25maWd1cmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUxpYnJhcnlJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlByb3ZpZGVyczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29uZmlndXJhdGlvbi5QcmFjdGljZUl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbmZpZ3VyYXRpb24uUHJhY3RpY2VTdWJncm91cEl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuT0JTSXRlbVByb3ZpZGVyQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLlBCU0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5XQlNJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuQ29tcGFyYXRvcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkNvbmZpZ3VyYWJsZUNvbXBvc2VkQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkV4cG9zZWRBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuTGlicmFyeUVkaXRDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlByb2Nlc3NVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5TdXBwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DdXN0b21DYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1pbGVzdG9uZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGVhbVByb2ZpbGU7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLQotLyoqCi0gKiBUaGUgZGVmYXVsdCBtZXRob2QgbGlicmFyeSBhZGFwdGVyIGZhY3RvcnkgaW1wbGVtZW50YXRpb24uCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBUbmdBZGFwdGVyRmFjdG9yeUltcGwgaW1wbGVtZW50cyBUbmdBZGFwdGVyRmFjdG9yeSB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBUbmdBZGFwdGVyRmFjdG9yeSBjcmVhdGVBZGFwdGVyRmFjdG9yeVByb3ZpZGVyKCkgewotCQlPYmplY3QgcHJvdmlkZXIgPSBFeHRlbnNpb25IZWxwZXIuY3JlYXRlKFRuZ0FkYXB0ZXJGYWN0b3J5LmNsYXNzLCBudWxsKTsKLQkJcmV0dXJuIHByb3ZpZGVyIGluc3RhbmNlb2YgVG5nQWRhcHRlckZhY3RvcnkgPyAoVG5nQWRhcHRlckZhY3RvcnkpIHByb3ZpZGVyIDogbmV3IFRuZ0FkYXB0ZXJGYWN0b3J5SW1wbCgpOwotLy8JCXJldHVybiBuZXcgVG5nQWRhcHRlckZhY3RvcnlJbXBsKCk7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBXQlNfQURBUFRFUl9GQUNUT1JZX0lEID0gIndicyI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTElCUkFSWV9BREFQVEVSX0ZBQ1RPUllfSUQgPSAibGlicmFyeSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09ORklHVVJBVElPTl9BREFQVEVSX0ZBQ1RPUllfSUQgPSAiY29uZmlndXJhdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgRXhwb3NlZEFkYXB0ZXJGYWN0b3J5IHdic0FkYXB0ZXJGYWN0b3J5ID0gbnVsbDsKLQotCXByaXZhdGUgRXhwb3NlZEFkYXB0ZXJGYWN0b3J5IG9ic0FkYXB0ZXJGYWN0b3J5ID0gbnVsbDsKLQotCXByaXZhdGUgRXhwb3NlZEFkYXB0ZXJGYWN0b3J5IHBic0FkYXB0ZXJGYWN0b3J5ID0gbnVsbDsKLQotCXByaXZhdGUgQWRhcHRlckZhY3RvcnlbXSB3YnNBZGFwdGVyRmFjdG9yaWVzID0gbnVsbDsKLQotCXByaXZhdGUgQWRhcHRlckZhY3RvcnlbXSBvYnNBZGFwdGVyRmFjdG9yaWVzID0gbnVsbDsKLQotCXByaXZhdGUgQWRhcHRlckZhY3RvcnlbXSBwYnNBZGFwdGVyRmFjdG9yaWVzID0gbnVsbDsKLQotCXByb3RlY3RlZCBBZGFwdGVyRmFjdG9yeVtdIHByb2NBZGFwdGVyRmFjdG9yaWVzID0gbnVsbDsKLQotCXByaXZhdGUgRXhwb3NlZEFkYXB0ZXJGYWN0b3J5IG5hdmlnYXRvckFkYXB0ZXJGYWN0b3J5OwotCi0JcHJvdGVjdGVkIEV4cG9zZWRBZGFwdGVyRmFjdG9yeSBjb25maWd1cmF0aW9uQWRhcHRlckZhY3Rvcnk7Ci0KLQlwcml2YXRlIEV4cG9zZWRBZGFwdGVyRmFjdG9yeSBjb25maWdQcm9jZXNzVmlld0FkYXB0ZXJGYWN0b3J5OwotCi0JcHJpdmF0ZSBFeHBvc2VkQWRhcHRlckZhY3RvcnkgaXRlbXNGaWx0ZXJBZGFwdGVyRmFjdG9yeTsKLQotCXByaXZhdGUgRXhwb3NlZEFkYXB0ZXJGYWN0b3J5IHBic0ZpbHRlckFkYXBhdGVyRmFjdG9yeTsKLQotCXByaXZhdGUgRXhwb3NlZEFkYXB0ZXJGYWN0b3J5IG9ic0ZpbHRlckFkYXBhdGVyRmFjdG9yeTsKLQotCXByb3RlY3RlZCBFeHBvc2VkQWRhcHRlckZhY3RvcnkgcHJvY0FkYXB0ZXJGYWN0b3J5OwotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIFRuZ0FkYXB0ZXJGYWN0b3J5SW1wbCgpIHsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEudG5nLlRuZ0FkYXB0ZXJGYWN0b3J5I2dldFdCU19BZGFwdGVyRmFjdG9yeSgpCi0JICovCi0JcHVibGljIENvbXBvc2VkQWRhcHRlckZhY3RvcnkgZ2V0V0JTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSB7Ci0JCWlmICh3YnNBZGFwdGVyRmFjdG9yeSA9PSBudWxsKSB7Ci0JCQlzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLQkJCQlpZiAod2JzQWRhcHRlckZhY3RvcnkgPT0gbnVsbCkgewotCQkJCQl3YnNBZGFwdGVyRmFjdG9yeSA9IG5ldyBFeHBvc2VkQWRhcHRlckZhY3RvcnkoCi0JCQkJCQkJZ2V0V0JTX0FkYXB0ZXJGYWN0b3JpZXMoKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiB3YnNBZGFwdGVyRmFjdG9yeTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEudG5nLlRuZ0FkYXB0ZXJGYWN0b3J5I2dldE9CU19BZGFwdGVyRmFjdG9yeSgpCi0JICovCi0JcHVibGljIENvbXBvc2VkQWRhcHRlckZhY3RvcnkgZ2V0T0JTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSB7Ci0JCWlmIChvYnNBZGFwdGVyRmFjdG9yeSA9PSBudWxsKSB7Ci0JCQlzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLQkJCQlpZiAob2JzQWRhcHRlckZhY3RvcnkgPT0gbnVsbCkgewotCQkJCQlvYnNBZGFwdGVyRmFjdG9yeSA9IG5ldyBFeHBvc2VkQWRhcHRlckZhY3RvcnkoCi0JCQkJCQkJZ2V0T0JTX0FkYXB0ZXJGYWN0b3JpZXMoKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBvYnNBZGFwdGVyRmFjdG9yeTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEudG5nLlRuZ0FkYXB0ZXJGYWN0b3J5I2dldFBCU19BZGFwdGVyRmFjdG9yeSgpCi0JICovCi0JcHVibGljIENvbXBvc2VkQWRhcHRlckZhY3RvcnkgZ2V0UEJTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSB7Ci0JCWlmIChwYnNBZGFwdGVyRmFjdG9yeSA9PSBudWxsKSB7Ci0JCQlzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLQkJCQlpZiAocGJzQWRhcHRlckZhY3RvcnkgPT0gbnVsbCkgewotCQkJCQlwYnNBZGFwdGVyRmFjdG9yeSA9IG5ldyBFeHBvc2VkQWRhcHRlckZhY3RvcnkoCi0JCQkJCQkJZ2V0UEJTX0FkYXB0ZXJGYWN0b3JpZXMoKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBwYnNBZGFwdGVyRmFjdG9yeTsKLQl9Ci0KLQlwcml2YXRlIEFkYXB0ZXJGYWN0b3J5W10gZ2V0V0JTX0FkYXB0ZXJGYWN0b3JpZXMoKSB7Ci0JCWlmICh3YnNBZGFwdGVyRmFjdG9yaWVzID09IG51bGwpIHsKLQkJCUFkYXB0ZXJGYWN0b3J5IGZhY3RvcnkgPSBjcmVhdGVBZGFwdGVyRmFjdG9yeUZyb21FeHRlbnNpb24oV0JTX0FEQVBURVJfRkFDVE9SWV9JRCk7Ci0JCQlpZihmYWN0b3J5ID09IG51bGwpIHsKLQkJCQlmYWN0b3J5ID0gbmV3IFdCU0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCk7Ci0JCQl9Ci0JCQl3YnNBZGFwdGVyRmFjdG9yaWVzID0gbmV3IEFkYXB0ZXJGYWN0b3J5W10gewotCQkJLy8gbmV3IFJlc291cmNlSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJZmFjdG9yeSwKLQkJCQkJLy8gbmV3IEJTUHJvY2Vzc3R5cGVzSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoZmFjdG9yeSksCi0JCQkJCW5ldyBSZWZsZWN0aXZlSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSB9OwotCQl9Ci0JCXJldHVybiB3YnNBZGFwdGVyRmFjdG9yaWVzOwotCX0KLQotCXByaXZhdGUgQWRhcHRlckZhY3RvcnlbXSBnZXRPQlNfQWRhcHRlckZhY3RvcmllcygpIHsKLQkJaWYgKG9ic0FkYXB0ZXJGYWN0b3JpZXMgPT0gbnVsbCkgewotCQkJT0JTSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkgZmFjdG9yeSA9IG5ldyBPQlNJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpOwotCQkJb2JzQWRhcHRlckZhY3RvcmllcyA9IG5ldyBBZGFwdGVyRmFjdG9yeVtdIHsKLQkJCS8vIG5ldyBSZXNvdXJjZUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCWZhY3RvcnksCi0JCQkJCS8vIG5ldyBCU1Byb2Nlc3N0eXBlc0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KGZhY3RvcnkpLAotCQkJCQluZXcgUmVmbGVjdGl2ZUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkgfTsKLQkJfQotCQlyZXR1cm4gb2JzQWRhcHRlckZhY3RvcmllczsKLQl9Ci0KLQlwcml2YXRlIEFkYXB0ZXJGYWN0b3J5W10gZ2V0UEJTX0FkYXB0ZXJGYWN0b3JpZXMoKSB7Ci0JCWlmIChwYnNBZGFwdGVyRmFjdG9yaWVzID09IG51bGwpIHsKLQkJCVBCU0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5IGZhY3RvcnkgPSBuZXcgUEJTSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKTsKLQkJCXBic0FkYXB0ZXJGYWN0b3JpZXMgPSBuZXcgQWRhcHRlckZhY3RvcnlbXSB7Ci0JCQkvLyBuZXcgUmVzb3VyY2VJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQlmYWN0b3J5LAotCQkJCQkvLyBuZXcgQlNQcm9jZXNzdHlwZXNJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeShmYWN0b3J5KSwKLQkJCQkJbmV3IFJlZmxlY3RpdmVJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpIH07Ci0JCX0KLQkJcmV0dXJuIHBic0FkYXB0ZXJGYWN0b3JpZXM7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeSNnZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKQotCSAqLwotCXB1YmxpYyBDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IGdldE5hdmlnYXRvclZpZXdfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpIHsKLQkJaWYgKG5hdmlnYXRvckFkYXB0ZXJGYWN0b3J5ID09IG51bGwpIHsKLQkJCXN5bmNocm9uaXplZCAodGhpcykgewotCQkJCWlmIChuYXZpZ2F0b3JBZGFwdGVyRmFjdG9yeSA9PSBudWxsKSB7Ci0JCQkJCUFkYXB0ZXJGYWN0b3J5IGZhY3RvcnkgPSBjcmVhdGVBZGFwdGVyRmFjdG9yeUZyb21FeHRlbnNpb24oTElCUkFSWV9BREFQVEVSX0ZBQ1RPUllfSUQpOwotCQkJCQlpZiAoZmFjdG9yeSA9PSBudWxsKSB7Ci0JCQkJCQlmYWN0b3J5ID0gbmV3IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQubmF2aWdhdG9yLkl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCk7Ci0JCQkJCX0KLQkJCQkJbmF2aWdhdG9yQWRhcHRlckZhY3RvcnkgPSBuZXcgRXhwb3NlZEFkYXB0ZXJGYWN0b3J5KAotCQkJCQkJCW5ldyBBZGFwdGVyRmFjdG9yeVtdIHsKLQkJCQkJCQkJCS8vIG5ldwotCQkJCQkJCQkJLy8gUmVzb3VyY2VJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJCQkJZmFjdG9yeSwKLQkJCQkJCQkJCW5ldyBSZWZsZWN0aXZlSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSB9KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG5hdmlnYXRvckFkYXB0ZXJGYWN0b3J5OwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3RvcnkjZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkKLQkgKi8KLQkvLyBwdWJsaWMgQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBnZXRGaWx0ZXJWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSB7Ci0JLy8gaWYoZmlsdGVyQWRhcHRlckZhY3RvcnkgPT0gbnVsbCkgewotCS8vIHN5bmNocm9uaXplZCh0aGlzKSB7Ci0JLy8gaWYoZmlsdGVyQWRhcHRlckZhY3RvcnkgPT0gbnVsbCkgewotCS8vIGZpbHRlckFkYXB0ZXJGYWN0b3J5ID0gbmV3IENvbXBvc2VkQWRhcHRlckZhY3RvcnkoCi0JLy8gbmV3IEFkYXB0ZXJGYWN0b3J5W10gewotCS8vIG5ldyBSZXNvdXJjZUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCksCi0JLy8gbmV3IGNvbS5pYm0ubGlicmFyeS5lZGl0LmZpbHRlci5JdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpLAotCS8vIG5ldyBSZWZsZWN0aXZlSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKQotCS8vIH0pOwotCS8vIH0KLQkvLyB9Ci0JLy8gfQotCS8vIHJldHVybiBmaWx0ZXJBZGFwdGVyRmFjdG9yeTsKLQkvLyB9Ci0JLy8gICAgCi0JcHVibGljIENvbXBvc2VkQWRhcHRlckZhY3RvcnkgZ2V0Q29uZmlndXJhdGlvblZpZXdfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpIHsKLQkJaWYgKGNvbmZpZ3VyYXRpb25BZGFwdGVyRmFjdG9yeSA9PSBudWxsKSB7Ci0JCQlzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLQkJCQlpZiAoY29uZmlndXJhdGlvbkFkYXB0ZXJGYWN0b3J5ID09IG51bGwpIHsKLQkJCQkJQWRhcHRlckZhY3RvcnkgZmFjdG9yeSA9IGNyZWF0ZUFkYXB0ZXJGYWN0b3J5RnJvbUV4dGVuc2lvbihDT05GSUdVUkFUSU9OX0FEQVBURVJfRkFDVE9SWV9JRCk7Ci0JCQkJCWlmKGZhY3RvcnkgPT0gbnVsbCkgewotCQkJCQkJZmFjdG9yeSA9IG5ldyBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbmZpZ3VyYXRpb24uSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKTsKLQkJCQkJfQotCQkJCQljb25maWd1cmF0aW9uQWRhcHRlckZhY3RvcnkgPSBuZXcgRXhwb3NlZEFkYXB0ZXJGYWN0b3J5KAotCQkJCQkJCW5ldyBBZGFwdGVyRmFjdG9yeVtdIHsKLQkJCQkJCQkJCS8vIG5ldyBSZXNvdXJjZUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQkJCQlmYWN0b3J5LAotCQkJCQkJCQkJbmV3IFJlZmxlY3RpdmVJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpIH0pOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gY29uZmlndXJhdGlvbkFkYXB0ZXJGYWN0b3J5OwotCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeSNnZXROYXZpZ2F0b3JWaWV3X0ZpbHRlckFkYXB0ZXJGYWN0b3J5KGNvbS5pYm0ubGlicmFyeS5lZGl0LklGaWx0ZXIpCi0JICovCi0JcHVibGljIEFkYXB0ZXJGYWN0b3J5IGdldENvbmZpZ3VyYXRpb25WaWV3X0FkYXB0ZXJGYWN0b3J5KElGaWx0ZXIgZmlsdGVyKSB7Ci0JCXJldHVybiBuZXcgRmlsdGVyQWRhcHRlckZhY3RvcnkoCi0JCQkJZ2V0Q29uZmlndXJhdGlvblZpZXdfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpLCBmaWx0ZXIpOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgY2xhc3MgRmlsdGVySXRlbVByb3ZpZGVyIGltcGxlbWVudHMgQWRhcHRlciwKLQkJCUlTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLAotCQkJSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgSGFzaFNldDxDbGFzczw/Pj4gQ0xBU1NFU19FWENMVURFRF9GUk9NX1NPUlRJTkcgPSBuZXcgSGFzaFNldDxDbGFzczw/Pj4oKTsKLQotCQlzdGF0aWMgewotCQkJQ0xBU1NFU19FWENMVURFRF9GUk9NX1NPUlRJTkcuYWRkKEFjdGl2aXR5LmNsYXNzKTsKLQkJCUNMQVNTRVNfRVhDTFVERURfRlJPTV9TT1JUSU5HLmFkZChDdXN0b21DYXRlZ29yeS5jbGFzcyk7Ci0JCQlDTEFTU0VTX0VYQ0xVREVEX0ZST01fU09SVElORy5hZGQoVGFza0Rlc2NyaXB0b3IuY2xhc3MpOwotCQkJQ0xBU1NFU19FWENMVURFRF9GUk9NX1NPUlRJTkcuYWRkKFRlYW1Qcm9maWxlLmNsYXNzKTsKLQkJCUNMQVNTRVNfRVhDTFVERURfRlJPTV9TT1JUSU5HLmFkZChQcmFjdGljZVN1Ymdyb3VwSXRlbVByb3ZpZGVyLmNsYXNzKTsKLQkJfQotCi0JCXByaXZhdGUgSXRlbVByb3ZpZGVyQWRhcHRlciBhZGFwdGVyOwotCi0JCXByaXZhdGUgSUZpbHRlciBmaWx0ZXI7Ci0KLQkJcHJpdmF0ZSBib29sZWFuIGlzQWRhcHRlckNvbmZpZ3VyYWJsZTsKLQotCQlwcm90ZWN0ZWQgRmlsdGVySXRlbVByb3ZpZGVyKEl0ZW1Qcm92aWRlckFkYXB0ZXIgYWRhcHRlciwgSUZpbHRlciBmaWx0ZXIpIHsKLQkJCXRoaXMuYWRhcHRlciA9IGFkYXB0ZXI7Ci0JCQl0aGlzLmZpbHRlciA9IGZpbHRlcjsKLQkJCWlmIChhZGFwdGVyIGluc3RhbmNlb2YgSUNvbmZpZ3VyYWJsZSkgewotCQkJCWlzQWRhcHRlckNvbmZpZ3VyYWJsZSA9IHRydWU7Ci0JCQkJKChJQ29uZmlndXJhYmxlKSBhZGFwdGVyKS5zZXRGaWx0ZXIoZmlsdGVyKTsKLQkJCX0KLQotCQl9Ci0JCQotCQlwdWJsaWMgSXRlbVByb3ZpZGVyQWRhcHRlciBnZXRBZGFwdGVyKCkgewotCQkJcmV0dXJuIGFkYXB0ZXI7Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXIjbm90aWZ5Q2hhbmdlZChvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb24pCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJCWFkYXB0ZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyI2dldFRhcmdldCgpCi0JCSAqLwotCQlwdWJsaWMgTm90aWZpZXIgZ2V0VGFyZ2V0KCkgewotCQkJcmV0dXJuIGFkYXB0ZXIuZ2V0VGFyZ2V0KCk7Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXIjc2V0VGFyZ2V0KG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyKQotCQkgKi8KLQkJcHVibGljIHZvaWQgc2V0VGFyZ2V0KE5vdGlmaWVyIG5ld1RhcmdldCkgewotCQkJYWRhcHRlci5zZXRUYXJnZXQobmV3VGFyZ2V0KTsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlciNpc0FkYXB0ZXJGb3JUeXBlKGphdmEubGFuZy5PYmplY3QpCi0JCSAqLwotCQlwdWJsaWMgYm9vbGVhbiBpc0FkYXB0ZXJGb3JUeXBlKE9iamVjdCB0eXBlKSB7Ci0JCQlyZXR1cm4gYWRhcHRlci5pc0FkYXB0ZXJGb3JUeXBlKHR5cGUpOwotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciNnZXRDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0KQotCQkgKi8KLQkJcHVibGljIENvbGxlY3Rpb248Pz4gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQkJTGlzdDxPYmplY3Q+IGNoaWxkcmVuID0gbnVsbDsKLQkJCWZha2VfbG9vcDogZG8gewotCQkJCQotCQkJCS8vIE9yZGVyIGlzIG5vdCBpbXBvcnRhbnQsIElmIGFkYXB0ZXIgaXMgSUxpYnJhcnlJdGVtUHJvdmlkZXIKLQkJCQkvLyBhbmQgcmVwbGFjZUNoaWxkcmVuIGlzIGZhbHNlIGFuZCBJQ29uZmlndXJhYmxlLCBpdCBzaG91bGQgIAotCQkJCS8vIGdvIHRvIGlzQWRhcHRlckNvbmZpZ3VyYWJsZSwgbm90IHRvIHJlZ3VsYXIgaXRlcmF0aW9uLgotCi0JCQkJaWYgKGZpbHRlciBpbnN0YW5jZW9mIElDb25maWd1cmF0b3IKLQkJCQkJCSYmIGFkYXB0ZXIgaW5zdGFuY2VvZiBJTGlicmFyeUl0ZW1Qcm92aWRlcikgewotCQkJCQlJQ29uZmlndXJhdG9yIGNvbmZpZ3VyYXRvciA9IChJQ29uZmlndXJhdG9yKSBmaWx0ZXI7Ci0JCQkJCWNoaWxkcmVuID0gbmV3IEFycmF5TGlzdDxPYmplY3Q+KCk7Ci0JCQkJCWJvb2xlYW4gcmVwbGFjZUNoaWxkcmVuID0gZmFsc2U7Ci0JCQkJCWZvciAoSXRlcmF0b3I8Pz4gaXRlciA9ICgoSUxpYnJhcnlJdGVtUHJvdmlkZXIpIGFkYXB0ZXIpCi0JCQkJCQkJLmdldENoaWxkcmVuRmVhdHVyZXMob2JqZWN0KS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgaXRlcgotCQkJCQkJCQkubmV4dCgpOwotCQkJCQkJQ29sbGVjdGlvbjw/PiBvdGhlckNoaWxkcmVuID0gY29uZmlndXJhdG9yLmdldENoaWxkcmVuKAotCQkJCQkJCQlvYmplY3QsIGZlYXR1cmUpOwotCQkJCQkJaWYgKG90aGVyQ2hpbGRyZW4gIT0gbnVsbCkgewotCQkJCQkJCXJlcGxhY2VDaGlsZHJlbiA9IHRydWU7Ci0JCQkJCQkJY2hpbGRyZW4uYWRkQWxsKG90aGVyQ2hpbGRyZW4pOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWlmIChyZXBsYWNlQ2hpbGRyZW4pIHsKLQkJCQkJCWJyZWFrIGZha2VfbG9vcDsKLQkJCQkJfQotCQkJCX0gCi0JCQkJaWYgKGlzQWRhcHRlckNvbmZpZ3VyYWJsZSkgewotCQkJCQlDb2xsZWN0aW9uPD8+IGNvbGxlY3Rpb24gPSBhZGFwdGVyLmdldENoaWxkcmVuKG9iamVjdCk7Ci0JCQkJCWNoaWxkcmVuID0gbmV3IEFycmF5TGlzdDxPYmplY3Q+KGNvbGxlY3Rpb24pOwotCQkJCQlicmVhayBmYWtlX2xvb3A7Ci0JCQkJfQotCQkJCQotCQkJCS8vIHJlZ3VsYXIgYWRhcHRlcgotCQkJCWNoaWxkcmVuID0gbmV3IEFycmF5TGlzdDxPYmplY3Q+KGFkYXB0ZXIuZ2V0Q2hpbGRyZW4ob2JqZWN0KSk7Ci0JCQkJZm9yIChJdGVyYXRvcjw/PiBpdGVyID0gY2hpbGRyZW4uaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCU9iamVjdCBlbGVtZW50ID0gKE9iamVjdCkgaXRlci5uZXh0KCk7Ci0JCQkJCWlmICghZmlsdGVyLmFjY2VwdChlbGVtZW50KSkgewotCQkJCQkJaXRlci5yZW1vdmUoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0gd2hpbGUgKGZhbHNlKTsKLQotCQkJaWYgKGFkYXB0ZXIgaW5zdGFuY2VvZiBQcmFjdGljZUl0ZW1Qcm92aWRlcikgewotCQkJCXJldHVybiAoKFByYWN0aWNlSXRlbVByb3ZpZGVyKSBhZGFwdGVyKS5nZXRNb2RpZmllZENoaWxkcmVuKG9iamVjdCwgY2hpbGRyZW4pOwotCQkJfQotCQkJCi0JCQkvLyBhbHBoYWJldGljYWxseSBzb3J0IHRoZSBjaGlsZHJlbgotCQkJLy8KLQkJCWlmICghVG5nVXRpbC5pc0luc3RhbmNlT2YoQ0xBU1NFU19FWENMVURFRF9GUk9NX1NPUlRJTkcsIFRuZ1V0aWwKLQkJCQkJLnVud3JhcChvYmplY3QpKSkgewotCQkJCUNvbGxlY3Rpb25zLnNvcnQoY2hpbGRyZW4sCi0JCQkJCQlDb21wYXJhdG9ycy5QUkVTRU5UQVRJT05fTkFNRV9DT01QQVJBVE9SKTsKLQkJCX0KLQotCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJGaWx0ZXJJdGVtUHJvdmlkZXIuZ2V0Q2hpbGRyZW4oKSByZXR1cm5lZCAiICsKLQkJCS8vIGNoaWxkcmVuKTsKLQkJCXJldHVybiBjaGlsZHJlbjsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIjZ2V0UGFyZW50KGphdmEubGFuZy5PYmplY3QpCi0JCSAqLwotCQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3Qgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gYWRhcHRlci5nZXRQYXJlbnQob2JqZWN0KTsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIjZ2V0TmV3Q2hpbGREZXNjcmlwdG9ycyhqYXZhLmxhbmcuT2JqZWN0LAotCQkgKiAgICAgIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluLCBqYXZhLmxhbmcuT2JqZWN0KQotCQkgKi8KLQkJcHVibGljIENvbGxlY3Rpb24gZ2V0TmV3Q2hpbGREZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0LAotCQkJCUVkaXRpbmdEb21haW4gZWRpdGluZ0RvbWFpbiwgT2JqZWN0IHNpYmxpbmcpIHsKLQkJCXJldHVybiBhZGFwdGVyLmdldE5ld0NoaWxkRGVzY3JpcHRvcnMob2JqZWN0LCBlZGl0aW5nRG9tYWluLAotCQkJCQlzaWJsaW5nKTsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIjY3JlYXRlQ29tbWFuZChqYXZhLmxhbmcuT2JqZWN0LAotCQkgKiAgICAgIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluLCBqYXZhLmxhbmcuQ2xhc3MsCi0JCSAqICAgICAgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyKQotCQkgKi8KLQkJcHVibGljIENvbW1hbmQgY3JlYXRlQ29tbWFuZChPYmplY3Qgb2JqZWN0LAotCQkJCUVkaXRpbmdEb21haW4gZWRpdGluZ0RvbWFpbiwgQ2xhc3MgY29tbWFuZENsYXNzLAotCQkJCUNvbW1hbmRQYXJhbWV0ZXIgY29tbWFuZFBhcmFtZXRlcikgewotCQkJcmV0dXJuIGFkYXB0ZXIuY3JlYXRlQ29tbWFuZChvYmplY3QsIGVkaXRpbmdEb21haW4sIGNvbW1hbmRDbGFzcywKLQkJCQkJY29tbWFuZFBhcmFtZXRlcik7Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciNnZXRFbGVtZW50cyhqYXZhLmxhbmcuT2JqZWN0KQotCQkgKi8KLQkJcHVibGljIENvbGxlY3Rpb24gZ2V0RWxlbWVudHMoT2JqZWN0IG9iamVjdCkgewotCQkJcmV0dXJuIGFkYXB0ZXIuZ2V0RWxlbWVudHMob2JqZWN0KTsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyI2hhc0NoaWxkcmVuKGphdmEubGFuZy5PYmplY3QpCi0JCSAqLwotCQlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCQlpZiAoZmlsdGVyIGluc3RhbmNlb2YgSUNvbmZpZ3VyYXRvcgotCQkJCQkmJiBhZGFwdGVyIGluc3RhbmNlb2YgSUxpYnJhcnlJdGVtUHJvdmlkZXIpIHsKLQkJCQkvLyBhbHdheXMgcmV0dXJuIHRydWUgdG8gaW1wcm92ZSBwZXJmb3JtYW5jZQotCQkJCS8vCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCQlpZihvYmplY3QgaW5zdGFuY2VvZiBDb250ZW50RWxlbWVudCl7Ci0JCQkJcmV0dXJuIGFkYXB0ZXIuaGFzQ2hpbGRyZW4ob2JqZWN0KTsKLQkJCX0KLQkJCWlmKFRuZ1V0aWwudW53cmFwKG9iamVjdCkgaW5zdGFuY2VvZiBNaWxlc3RvbmUpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyI2dldFRleHQoamF2YS5sYW5nLk9iamVjdCkKLQkJICovCi0JCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gYWRhcHRlci5nZXRUZXh0KG9iamVjdCk7Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlciNnZXRJbWFnZShqYXZhLmxhbmcuT2JqZWN0KQotCQkgKi8KLQkJcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gYWRhcHRlci5nZXRJbWFnZShvYmplY3QpOwotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlI2dldFByb3BlcnR5RGVzY3JpcHRvcnMoamF2YS5sYW5nLk9iamVjdCkKLQkJICovCi0JCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQkJcmV0dXJuIGFkYXB0ZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlI2dldFByb3BlcnR5RGVzY3JpcHRvcihqYXZhLmxhbmcuT2JqZWN0LAotCQkgKiAgICAgIGphdmEubGFuZy5PYmplY3QpCi0JCSAqLwotCQlwdWJsaWMgSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IgZ2V0UHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QsCi0JCQkJT2JqZWN0IHByb3BlcnR5SUQpIHsKLQkJCXJldHVybiBhZGFwdGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QsIHByb3BlcnR5SUQpOwotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlI2dldEVkaXRhYmxlVmFsdWUoamF2YS5sYW5nLk9iamVjdCkKLQkJICovCi0JCXB1YmxpYyBPYmplY3QgZ2V0RWRpdGFibGVWYWx1ZShPYmplY3Qgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gYWRhcHRlci5nZXRFZGl0YWJsZVZhbHVlKG9iamVjdCk7Ci0JCX0KLQotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgY2xhc3MgRmlsdGVyQWRhcHRlckZhY3RvcnkgaW1wbGVtZW50cyBBZGFwdGVyRmFjdG9yeSwKLQkJCUlDaGFuZ2VOb3RpZmllciwgSURpc3Bvc2FibGUgewotCi0JCXByaXZhdGUgQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeTsKLQotCQlwcml2YXRlIElGaWx0ZXIgZmlsdGVyOwotCi0JCS8qKgotCQkgKiAKLQkJICovCi0JCXB1YmxpYyBGaWx0ZXJBZGFwdGVyRmFjdG9yeShDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LAotCQkJCUlGaWx0ZXIgZmlsdGVyKSB7Ci0JCQl0aGlzLmFkYXB0ZXJGYWN0b3J5ID0gYWRhcHRlckZhY3Rvcnk7Ci0JCQlpZihhZGFwdGVyRmFjdG9yeSBpbnN0YW5jZW9mIENvbmZpZ3VyYWJsZUNvbXBvc2VkQWRhcHRlckZhY3RvcnkpIHsKLQkJCQkoKENvbmZpZ3VyYWJsZUNvbXBvc2VkQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLnNldEZpbHRlcihmaWx0ZXIpOwotCQkJfQotCQkJdGhpcy5maWx0ZXIgPSBmaWx0ZXI7Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5I2lzRmFjdG9yeUZvclR5cGUoamF2YS5sYW5nLk9iamVjdCkKLQkJICovCi0JCXB1YmxpYyBib29sZWFuIGlzRmFjdG9yeUZvclR5cGUoT2JqZWN0IHR5cGUpIHsKLQkJCXJldHVybiBhZGFwdGVyRmFjdG9yeS5pc0ZhY3RvcnlGb3JUeXBlKHR5cGUpOwotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeSNhZGFwdChqYXZhLmxhbmcuT2JqZWN0LAotCQkgKiAgICAgIGphdmEubGFuZy5PYmplY3QpCi0JCSAqLwotCQlwdWJsaWMgT2JqZWN0IGFkYXB0KE9iamVjdCBvYmplY3QsIE9iamVjdCB0eXBlKSB7Ci0JCQlPYmplY3QgYWRhcHRlciA9IGFkYXB0ZXJGYWN0b3J5LmFkYXB0KG9iamVjdCwgdHlwZSk7Ci0JCQlpZiAoYWRhcHRlciA9PSBudWxsIHx8IGFkYXB0ZXIgaW5zdGFuY2VvZiBGaWx0ZXJJdGVtUHJvdmlkZXIKLQkJCQkJfHwgIShhZGFwdGVyIGluc3RhbmNlb2YgSXRlbVByb3ZpZGVyQWRhcHRlcikpIHsKLQkJCQlyZXR1cm4gYWRhcHRlcjsKLQkJCX0KLQkJCXJldHVybiBuZXcgRmlsdGVySXRlbVByb3ZpZGVyKChJdGVtUHJvdmlkZXJBZGFwdGVyKSBhZGFwdGVyLCBmaWx0ZXIpOwotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeSNhZGFwdChvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllciwKLQkJICogICAgICBqYXZhLmxhbmcuT2JqZWN0KQotCQkgKi8KLQkJcHVibGljIEFkYXB0ZXIgYWRhcHQoTm90aWZpZXIgdGFyZ2V0LCBPYmplY3QgdHlwZSkgewotCQkJQWRhcHRlciBhZGFwdGVyID0gYWRhcHRlckZhY3RvcnkuYWRhcHQodGFyZ2V0LCB0eXBlKTsKLQkJCWlmIChhZGFwdGVyID09IG51bGwgfHwgYWRhcHRlciBpbnN0YW5jZW9mIEZpbHRlckl0ZW1Qcm92aWRlcgotCQkJCQl8fCAhKGFkYXB0ZXIgaW5zdGFuY2VvZiBJdGVtUHJvdmlkZXJBZGFwdGVyKSkgewotCQkJCXJldHVybiBhZGFwdGVyOwotCQkJfQotCQkJcmV0dXJuIG5ldyBGaWx0ZXJJdGVtUHJvdmlkZXIoKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIGFkYXB0ZXIsIGZpbHRlcik7Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5I2FkYXB0TmV3KG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyLAotCQkgKiAgICAgIGphdmEubGFuZy5PYmplY3QpCi0JCSAqLwotCQlwdWJsaWMgQWRhcHRlciBhZGFwdE5ldyhOb3RpZmllciB0YXJnZXQsIE9iamVjdCB0eXBlKSB7Ci0JCQlyZXR1cm4gYWRhcHRlckZhY3RvcnkuYWRhcHROZXcodGFyZ2V0LCB0eXBlKTsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3RvcnkjYWRhcHRBbGxOZXcob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXIpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBhZGFwdEFsbE5ldyhOb3RpZmllciBub3RpZmllcikgewotCQkJYWRhcHRlckZhY3RvcnkuYWRhcHRBbGxOZXcobm90aWZpZXIpOwotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JQ2hhbmdlTm90aWZpZXIjZmlyZU5vdGlmeUNoYW5nZWQob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uKQotCQkgKi8KLQkJcHVibGljIHZvaWQgZmlyZU5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQkJYWRhcHRlckZhY3RvcnkuZmlyZU5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUNoYW5nZU5vdGlmaWVyI2FkZExpc3RlbmVyKG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklOb3RpZnlDaGFuZ2VkTGlzdGVuZXIpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcihJTm90aWZ5Q2hhbmdlZExpc3RlbmVyIG5vdGlmeUNoYW5nZWRMaXN0ZW5lcikgewotCQkJYWRhcHRlckZhY3RvcnkuYWRkTGlzdGVuZXIobm90aWZ5Q2hhbmdlZExpc3RlbmVyKTsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUNoYW5nZU5vdGlmaWVyI3JlbW92ZUxpc3RlbmVyKG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklOb3RpZnlDaGFuZ2VkTGlzdGVuZXIpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCByZW1vdmVMaXN0ZW5lcihJTm90aWZ5Q2hhbmdlZExpc3RlbmVyIG5vdGlmeUNoYW5nZWRMaXN0ZW5lcikgewotCQkJYWRhcHRlckZhY3RvcnkucmVtb3ZlTGlzdGVuZXIobm90aWZ5Q2hhbmdlZExpc3RlbmVyKTsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSURpc3Bvc2FibGUjZGlzcG9zZSgpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkJZmlsdGVyID0gbnVsbDsKLQkJfQotCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeSNjcmVhdGVXQlNDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkKLQkgKi8KLQlwdWJsaWMgQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBjcmVhdGVXQlNDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkgewotCQlBZGFwdGVyRmFjdG9yeVtdIGFkYXB0ZXJGYWN0b3JpZXMgPSBuZXcgQWRhcHRlckZhY3RvcnlbXSB7Ci0JCS8vIG5ldyBSZXNvdXJjZUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJbmV3IFdCU0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJbmV3IFJlZmxlY3RpdmVJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpIH07Ci0JCXJldHVybiBuZXcgRXhwb3NlZEFkYXB0ZXJGYWN0b3J5KGFkYXB0ZXJGYWN0b3JpZXMpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5I2NyZWF0ZVB1Ymxpc2hpbmdXQlNBZGFwdGVyRmFjdG9yeSgpCi0JICovCi0JcHVibGljIENvbXBvc2VkQWRhcHRlckZhY3RvcnkgY3JlYXRlUHVibGlzaGluZ1dCU0FkYXB0ZXJGYWN0b3J5KCkgewotCQlyZXR1cm4gbmV3IEV4cG9zZWRBZGFwdGVyRmFjdG9yeSgKLQkJCQluZXcgQWRhcHRlckZhY3RvcnlbXSB7Ci0JCQkJCQluZXcgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLnB1Ymxpc2hpbmcuV0JTSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCW5ldyBSZWZsZWN0aXZlSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKQotCQkJCX0KLQkJKTsKLQl9Ci0JCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeSNjcmVhdGVUQlNDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkKLQkgKi8KLQlwdWJsaWMgQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBjcmVhdGVUQlNDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkgewotCQlBZGFwdGVyRmFjdG9yeVtdIGFkYXB0ZXJGYWN0b3JpZXMgPSBuZXcgQWRhcHRlckZhY3RvcnlbXSB7Ci0JCS8vIG5ldyBSZXNvdXJjZUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJbmV3IE9CU0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJbmV3IFJlZmxlY3RpdmVJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpIH07Ci0JCXJldHVybiBuZXcgRXhwb3NlZEFkYXB0ZXJGYWN0b3J5KGFkYXB0ZXJGYWN0b3JpZXMpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3RvcnkjY3JlYXRlUHVibGlzaGluZ1RCU0FkYXB0ZXJGYWN0b3J5KCkKLQkgKi8KLQlwdWJsaWMgQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBjcmVhdGVQdWJsaXNoaW5nVEJTQWRhcHRlckZhY3RvcnkoKSB7Ci0JCXJldHVybiBuZXcgRXhwb3NlZEFkYXB0ZXJGYWN0b3J5KAotCQkJCW5ldyBBZGFwdGVyRmFjdG9yeVtdIHsKLQkJCQkJCW5ldyBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MucHVibGlzaGluZy5UQlNJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJbmV3IFJlZmxlY3RpdmVJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpCi0JCQkJfQotCQkpOwotCX0KLQkKLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5I2NyZWF0ZVdQQlNDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkKLQkgKi8KLQlwdWJsaWMgQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBjcmVhdGVXUEJTQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpIHsKLQkJQWRhcHRlckZhY3RvcnlbXSBhZGFwdGVyRmFjdG9yaWVzID0gbmV3IEFkYXB0ZXJGYWN0b3J5W10gewotCQkvLyBuZXcgUmVzb3VyY2VJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpLAotCQkJCW5ldyBQQlNJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpLAotCQkJCW5ldyBSZWZsZWN0aXZlSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSB9OwotCQlyZXR1cm4gbmV3IEV4cG9zZWRBZGFwdGVyRmFjdG9yeShhZGFwdGVyRmFjdG9yaWVzKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5I2NyZWF0ZVByb2Nlc3NDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkKLQkgKi8KLQlwdWJsaWMgQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBjcmVhdGVQcm9jZXNzQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpIHsKLQkJb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbnNvbGlkYXRlZC5JdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSA9IG5ldyBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29uc29saWRhdGVkLkl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCk7Ci0JCUlQcmVmZXJlbmNlU3RvcmVXcmFwcGVyIHByZWZTdG9yZSA9IFByb3ZpZGVycy5nZXRBdXRob3JpbmdQbHVnaW5QcmVmZXJlbmNlU3RvcmUoKTsKLQkJaWYgKHByZWZTdG9yZSAhPSBudWxsKSB7Ci0JCQlhZGFwdGVyRmFjdG9yeS5zZXRDb2x1bW5JbmRleFRvTmFtZU1hcChQcm9jZXNzVXRpbAotCQkJCQkudG9Db2x1bW5JbmRleFRvTmFtZU1hcChwcmVmU3RvcmUKLQkJCQkJCQkuZ2V0U3RyaW5nKExpYnJhcnlFZGl0Q29uc3RhbnRzLlBSRUZfV0JTX0NPTFVNTlMpKSk7Ci0JCX0KLQkJQWRhcHRlckZhY3RvcnlbXSBhZGFwdGVyRmFjdG9yaWVzID0gbmV3IEFkYXB0ZXJGYWN0b3J5W10gewotCQkvLyBuZXcgUmVzb3VyY2VJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpLAotCQkJCWFkYXB0ZXJGYWN0b3J5LCBuZXcgUmVmbGVjdGl2ZUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkgfTsKLQotCQlyZXR1cm4gbmV3IEV4cG9zZWRBZGFwdGVyRmFjdG9yeShhZGFwdGVyRmFjdG9yaWVzKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5I2NyZWF0ZUxpYnJhcnlDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkKLQkgKi8KLQlwdWJsaWMgQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBjcmVhdGVMaWJyYXJ5Q29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpIHsKLQkJQWRhcHRlckZhY3RvcnkgZmFjdG9yeSA9IGNyZWF0ZUFkYXB0ZXJGYWN0b3J5RnJvbUV4dGVuc2lvbihMSUJSQVJZX0FEQVBURVJfRkFDVE9SWV9JRCk7Ci0JCWlmIChmYWN0b3J5ID09IG51bGwpIHsKLQkJCWZhY3RvcnkgPSBuZXcgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5uYXZpZ2F0b3IuSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKTsKLQkJfQotCQlyZXR1cm4gbmV3IEV4cG9zZWRBZGFwdGVyRmFjdG9yeSgKLQkJCQluZXcgQWRhcHRlckZhY3RvcnlbXSB7Ci0JCQkJCQkvLyBuZXcKLQkJCQkJCS8vIFJlc291cmNlSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWZhY3RvcnksCi0JCQkJCQluZXcgUmVmbGVjdGl2ZUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkgfSk7Ci0KLQl9Ci0JCi0JLy8gU2VjdGlvbiBmb3IgVE5HIEZpbHRlciBtb2RpZmljYXRpb24gcHJvY2Vzcy4KLQkvLyBmaWx0ZXIgbW9kaWZpY2F0aW9uIGNvZGUuIFNpbWlsYXIgdG8gZ2V0RmlsdGVyVmlld19BZGFwdGVyRmFjdG9yeShJRmlsdGVyCi0JLy8gZmlsdGVyKQotCXB1YmxpYyBBZGFwdGVyRmFjdG9yeSBnZXRJdGVtc0ZpbHRlcl9BZGFwdGVyRmFjdG9yeShJRmlsdGVyIGZpbHRlcikgewotCQlyZXR1cm4gbmV3IEZpbHRlckFkYXB0ZXJGYWN0b3J5KAotCQkJCWdldEl0ZW1zRmlsdGVyX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSwgZmlsdGVyKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5I2dldEl0ZW1zRmlsdGVyX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKQotCSAqLwotCXB1YmxpYyBDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IGdldEl0ZW1zRmlsdGVyX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSB7Ci0JCWlmIChpdGVtc0ZpbHRlckFkYXB0ZXJGYWN0b3J5ID09IG51bGwpIHsKLQkJCXN5bmNocm9uaXplZCAodGhpcykgewotCQkJCWlmIChpdGVtc0ZpbHRlckFkYXB0ZXJGYWN0b3J5ID09IG51bGwpIHsKLQkJCQkJaXRlbXNGaWx0ZXJBZGFwdGVyRmFjdG9yeSA9IG5ldyBFeHBvc2VkQWRhcHRlckZhY3RvcnkoCi0JCQkJCQkJbmV3IEFkYXB0ZXJGYWN0b3J5W10gewotCQkJCQkJCQkJLy8gbmV3IFJlc291cmNlSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCQkJCW5ldyBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQkJCQluZXcgUmVmbGVjdGl2ZUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkgfSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBpdGVtc0ZpbHRlckFkYXB0ZXJGYWN0b3J5OwotCX0KLQotCXB1YmxpYyBBZGFwdGVyRmFjdG9yeSBnZXRQQlNGaWx0ZXJfQWRhcHRlckZhY3RvcnkoSUZpbHRlciBmaWx0ZXIpIHsKLQkJcmV0dXJuIG5ldyBGaWx0ZXJBZGFwdGVyRmFjdG9yeShnZXRQQlNGaWx0ZXJfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpLAotCQkJCWZpbHRlcik7Ci0JfQotCi0JcHVibGljIENvbXBvc2VkQWRhcHRlckZhY3RvcnkgZ2V0UEJTRmlsdGVyX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSB7Ci0JCWlmIChwYnNGaWx0ZXJBZGFwYXRlckZhY3RvcnkgPT0gbnVsbCkgewotCQkJc3luY2hyb25pemVkICh0aGlzKSB7Ci0JCQkJaWYgKHBic0ZpbHRlckFkYXBhdGVyRmFjdG9yeSA9PSBudWxsKSB7Ci0JCQkJCXBic0ZpbHRlckFkYXBhdGVyRmFjdG9yeSA9IG5ldyBFeHBvc2VkQWRhcHRlckZhY3RvcnkoCi0JCQkJCQkJbmV3IEFkYXB0ZXJGYWN0b3J5W10gewotCQkJCQkJCQkJLy8gbmV3IFJlc291cmNlSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCQkJCW5ldyBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLlBCU0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQkJCQluZXcgUmVmbGVjdGl2ZUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkgfSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBwYnNGaWx0ZXJBZGFwYXRlckZhY3Rvcnk7Ci0JfQotCi0JcHVibGljIEFkYXB0ZXJGYWN0b3J5IGdldE9CU0ZpbHRlcl9BZGFwdGVyRmFjdG9yeShJRmlsdGVyIGZpbHRlcikgewotCQlyZXR1cm4gbmV3IEZpbHRlckFkYXB0ZXJGYWN0b3J5KGdldE9CU0ZpbHRlcl9Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJZmlsdGVyKTsKLQl9Ci0KLQlwdWJsaWMgQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBnZXRPQlNGaWx0ZXJfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpIHsKLQkJaWYgKG9ic0ZpbHRlckFkYXBhdGVyRmFjdG9yeSA9PSBudWxsKSB7Ci0JCQlzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLQkJCQlpZiAob2JzRmlsdGVyQWRhcGF0ZXJGYWN0b3J5ID09IG51bGwpIHsKLQkJCQkJb2JzRmlsdGVyQWRhcGF0ZXJGYWN0b3J5ID0gbmV3IEV4cG9zZWRBZGFwdGVyRmFjdG9yeSgKLQkJCQkJCQluZXcgQWRhcHRlckZhY3RvcnlbXSB7Ci0JCQkJCQkJCQkvLyBuZXcgUmVzb3VyY2VJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJCQkJbmV3IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuT0JTSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCQkJCW5ldyBSZWZsZWN0aXZlSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSB9KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG9ic0ZpbHRlckFkYXBhdGVyRmFjdG9yeTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5I2dldFByb2Nlc3NDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkKLQkgKi8KLQlwdWJsaWMgQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBnZXRQcm9jZXNzQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpIHsKLQkJaWYgKHByb2NBZGFwdGVyRmFjdG9yeSA9PSBudWxsKSB7Ci0JCQlzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLQkJCQlpZiAocHJvY0FkYXB0ZXJGYWN0b3J5ID09IG51bGwpIHsKLQkJCQkJb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbnNvbGlkYXRlZC5JdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSA9IG5ldyBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29uc29saWRhdGVkLkl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCk7Ci0JCQkJCWZpbmFsIElQcmVmZXJlbmNlU3RvcmVXcmFwcGVyIHByZWZTdG9yZSA9IFByb3ZpZGVycy5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQkJCQkJaWYgKHByZWZTdG9yZSAhPSBudWxsKSB7Ci0JCQkJCQlhZGFwdGVyRmFjdG9yeQotCQkJCQkJCQkuc2V0Q29sdW1uSW5kZXhUb05hbWVNYXAoUHJvY2Vzc1V0aWwKLQkJCQkJCQkJCQkudG9Db2x1bW5JbmRleFRvTmFtZU1hcChwcmVmU3RvcmUKLQkJCQkJCQkJCQkJCS5nZXRTdHJpbmcoTGlicmFyeUVkaXRDb25zdGFudHMuUFJFRl9XQlNfQ09MVU1OUykpKTsKLQkJCQkJCXByZWZTdG9yZS5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKGFkYXB0ZXJGYWN0b3J5KTsKLQkJCQkJCQotCQkJCQkJLy8gSW5pdGlhbGl6ZSAiYXV0byBpbmhlcml0IHN1cHByZXNzaW9uIHN0YXRlcyIgZmxhZyBmb3IgY2FsY3VsYXRpbmcgc3VwcHJlc3Npb24KLQkJCQkJCS8vIGFuZCBhZGQgbGlzdGVuZXIgdG8gaXRzIGNoYW5nZQotCQkJCQkJLy8KLQkJCQkJCVN1cHByZXNzaW9uLnNldEF1dG9Jbmhlcml0U3VwcHJlc3Npb25TdGF0ZXMocHJlZlN0b3JlLmdldEJvb2xlYW4oTGlicmFyeUVkaXRDb25zdGFudHMuUFJFRl9JTkhFUklUX1NVUFBSRVNTSU9OX1NUQVRFKSk7Ci0JCQkJCQlwcmVmU3RvcmUuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihuZXcgSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJXcmFwcGVyKCkgewotCi0JCQkJCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2UoSVByb3BlcnR5Q2hhbmdlRXZlbnRXcmFwcGVyIGV2ZW50KSB7Ci0JCQkJCQkJCWlmKExpYnJhcnlFZGl0Q29uc3RhbnRzLlBSRUZfSU5IRVJJVF9TVVBQUkVTU0lPTl9TVEFURS5lcXVhbHMoZXZlbnQuZ2V0UHJvcGVydHkoKSkpIHsKLQkJCQkJCQkJCVN1cHByZXNzaW9uLnNldEF1dG9Jbmhlcml0U3VwcHJlc3Npb25TdGF0ZXMocHJlZlN0b3JlLmdldEJvb2xlYW4oTGlicmFyeUVkaXRDb25zdGFudHMuUFJFRl9JTkhFUklUX1NVUFBSRVNTSU9OX1NUQVRFKSk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0KLQkJCQkJCX0pOwotCQkJCQl9CQkJCQkKLQkJCQkKLQkJCQkJcHJvY0FkYXB0ZXJGYWN0b3JpZXMgPSBuZXcgQWRhcHRlckZhY3RvcnlbXSB7Ci0JCQkJCQkJYWRhcHRlckZhY3RvcnksCi0JCQkJCQkJbmV3IFJlZmxlY3RpdmVJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpIH07Ci0KLQkJCQkJcHJvY0FkYXB0ZXJGYWN0b3J5ID0gbmV3IEV4cG9zZWRBZGFwdGVyRmFjdG9yeSgKLQkJCQkJCQlwcm9jQWRhcHRlckZhY3Rvcmllcyk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHByb2NBZGFwdGVyRmFjdG9yeTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5I3Jlc2V0KCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZXNldCgpIHsKLQkJaWYgKG5hdmlnYXRvckFkYXB0ZXJGYWN0b3J5ICE9IG51bGwpIHsKLQkJCW5hdmlnYXRvckFkYXB0ZXJGYWN0b3J5LmRpc3Bvc2UoKTsKLQkJfQotCi0JCWlmIChpdGVtc0ZpbHRlckFkYXB0ZXJGYWN0b3J5ICE9IG51bGwpIHsKLQkJCWl0ZW1zRmlsdGVyQWRhcHRlckZhY3RvcnkuZGlzcG9zZSgpOwotCQkJaXRlbXNGaWx0ZXJBZGFwdGVyRmFjdG9yeSA9IG51bGw7Ci0JCX0KLQkJCi0JCWlmIChvYnNGaWx0ZXJBZGFwYXRlckZhY3RvcnkgIT0gbnVsbCkgewotCQkJb2JzRmlsdGVyQWRhcGF0ZXJGYWN0b3J5LmRpc3Bvc2UoKTsKLQkJCW9ic0ZpbHRlckFkYXBhdGVyRmFjdG9yeSA9IG51bGw7Ci0JCX0KLQkJCi0JCWlmIChwYnNGaWx0ZXJBZGFwYXRlckZhY3RvcnkgIT0gbnVsbCkgewotCQkJcGJzRmlsdGVyQWRhcGF0ZXJGYWN0b3J5LmRpc3Bvc2UoKTsKLQkJCXBic0ZpbHRlckFkYXBhdGVyRmFjdG9yeSA9IG51bGw7Ci0JCX0KLQkJCi0JCQotCQlpZiAoY29uZmlnUHJvY2Vzc1ZpZXdBZGFwdGVyRmFjdG9yeSAhPSBudWxsKSB7Ci0JCQljb25maWdQcm9jZXNzVmlld0FkYXB0ZXJGYWN0b3J5LmRpc3Bvc2UoKTsKLQkJfQotCi0JCWlmIChjb25maWd1cmF0aW9uQWRhcHRlckZhY3RvcnkgIT0gbnVsbCkgewotCQkJY29uZmlndXJhdGlvbkFkYXB0ZXJGYWN0b3J5LmRpc3Bvc2UoKTsKLQkJfQotCi0JCWlmICh3YnNBZGFwdGVyRmFjdG9yeSAhPSBudWxsKSB7Ci0JCQl3YnNBZGFwdGVyRmFjdG9yeS5kaXNwb3NlKCk7Ci0JCQl3YnNBZGFwdGVyRmFjdG9yeSA9IG51bGw7Ci0JCX0KLQotCQlpZiAob2JzQWRhcHRlckZhY3RvcnkgIT0gbnVsbCkgewotCQkJb2JzQWRhcHRlckZhY3RvcnkuZGlzcG9zZSgpOwotCQkJb2JzQWRhcHRlckZhY3RvcnkgPSBudWxsOwotCQl9Ci0KLQkJaWYgKHBic0FkYXB0ZXJGYWN0b3J5ICE9IG51bGwpIHsKLQkJCXBic0FkYXB0ZXJGYWN0b3J5LmRpc3Bvc2UoKTsKLQkJCXBic0FkYXB0ZXJGYWN0b3J5ID0gbnVsbDsKLQkJfQotCi0JCWlmIChwcm9jQWRhcHRlckZhY3RvcnkgIT0gbnVsbCkgewotCQkJLy8gcmVtb3ZlIGFkYXB0ZXIgZmFjdG9yeSBhcyBwcm9wZXJ0eSBjaGFuZ2UgbGlzdGVuZXIgZnJvbQotCQkJLy8gcHJlZmVyZW5jZSBzdG9yZQotCQkJLy8KLQkJCUlQcmVmZXJlbmNlU3RvcmVXcmFwcGVyIHByZWZTdG9yZSA9IFByb3ZpZGVycy5nZXRBdXRob3JpbmdQbHVnaW5QcmVmZXJlbmNlU3RvcmUoKTsKLQkJCWlmIChwcmVmU3RvcmUgIT0gbnVsbCkgewotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcHJvY0FkYXB0ZXJGYWN0b3JpZXMubGVuZ3RoOyBpKyspIHsKLQkJCQkJT2JqZWN0IGFkYXB0ZXJGYWN0b3J5ID0gcHJvY0FkYXB0ZXJGYWN0b3JpZXNbaV07Ci0JCQkJCWlmIChhZGFwdGVyRmFjdG9yeSBpbnN0YW5jZW9mIElQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyV3JhcHBlcikgewotCQkJCQkJcHJlZlN0b3JlCi0JCQkJCQkJCS5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKChJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcldyYXBwZXIpIGFkYXB0ZXJGYWN0b3J5KTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCXByb2NBZGFwdGVyRmFjdG9yeS5kaXNwb3NlKCk7Ci0JCQlwcm9jQWRhcHRlckZhY3RvcnkgPSBudWxsOwotCQl9Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeSNjcmVhdGVQdWJsaXNoaW5nQ0JTQWRhcHRlckZhY3RvcnkoKQotCSAqLwotCXB1YmxpYyBDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IGNyZWF0ZVB1Ymxpc2hpbmdDQlNBZGFwdGVyRmFjdG9yeSgpIHsKLQkJcmV0dXJuIG5ldyBFeHBvc2VkQWRhcHRlckZhY3RvcnkoCi0JCQkJbmV3IEFkYXB0ZXJGYWN0b3J5W10gewotCQkJCQkJbmV3IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5wdWJsaXNoaW5nLkNCU0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQluZXcgUmVmbGVjdGl2ZUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkKLQkJCQl9Ci0JCSk7Ci0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5I2NyZWF0ZVB1Ymxpc2hpbmdXUEJTQWRhcHRlckZhY3RvcnkoKQotCSAqLwotCXB1YmxpYyBDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IGNyZWF0ZVB1Ymxpc2hpbmdXUEJTQWRhcHRlckZhY3RvcnkoKSB7Ci0JCXJldHVybiBuZXcgRXhwb3NlZEFkYXB0ZXJGYWN0b3J5KAotCQkJCW5ldyBBZGFwdGVyRmFjdG9yeVtdIHsKLQkJCQkJCW5ldyBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MucHVibGlzaGluZy5XUEJTSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCW5ldyBSZWZsZWN0aXZlSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKQotCQkJCX0KLQkJKTsKLQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3RvcnkjY2xlYW5VcCgpCi0JICovCi0JcHVibGljIHZvaWQgY2xlYW5VcCgpIHsKLQkJU3VwcHJlc3Npb24uY2xlYW5VcCgpOwotCi0JCWlmIChuYXZpZ2F0b3JBZGFwdGVyRmFjdG9yeSAhPSBudWxsKSB7Ci0JCQluYXZpZ2F0b3JBZGFwdGVyRmFjdG9yeS5jbGVhblVwKCk7Ci0JCX0KLQotCQlpZiAoaXRlbXNGaWx0ZXJBZGFwdGVyRmFjdG9yeSAhPSBudWxsKSB7Ci0JCQlpdGVtc0ZpbHRlckFkYXB0ZXJGYWN0b3J5LmNsZWFuVXAoKTsKLQkJfQotCQkKLQkJaWYgKG9ic0ZpbHRlckFkYXBhdGVyRmFjdG9yeSAhPSBudWxsKSB7Ci0JCQlvYnNGaWx0ZXJBZGFwYXRlckZhY3RvcnkuY2xlYW5VcCgpOwotCQl9Ci0JCQotCQlpZiAocGJzRmlsdGVyQWRhcGF0ZXJGYWN0b3J5ICE9IG51bGwpIHsKLQkJCXBic0ZpbHRlckFkYXBhdGVyRmFjdG9yeS5jbGVhblVwKCk7Ci0JCX0KLQkJCi0JCQotCQlpZiAoY29uZmlnUHJvY2Vzc1ZpZXdBZGFwdGVyRmFjdG9yeSAhPSBudWxsKSB7Ci0JCQljb25maWdQcm9jZXNzVmlld0FkYXB0ZXJGYWN0b3J5LmNsZWFuVXAoKTsKLQkJfQotCi0JCWlmIChjb25maWd1cmF0aW9uQWRhcHRlckZhY3RvcnkgIT0gbnVsbCkgewotCQkJY29uZmlndXJhdGlvbkFkYXB0ZXJGYWN0b3J5LmNsZWFuVXAoKTsKLQkJfQotCi0JCWlmICh3YnNBZGFwdGVyRmFjdG9yeSAhPSBudWxsKSB7Ci0JCQl3YnNBZGFwdGVyRmFjdG9yeS5jbGVhblVwKCk7Ci0JCX0KLQotCQlpZiAob2JzQWRhcHRlckZhY3RvcnkgIT0gbnVsbCkgewotCQkJb2JzQWRhcHRlckZhY3RvcnkuY2xlYW5VcCgpOwotCQl9Ci0KLQkJaWYgKHBic0FkYXB0ZXJGYWN0b3J5ICE9IG51bGwpIHsKLQkJCXBic0FkYXB0ZXJGYWN0b3J5LmNsZWFuVXAoKTsKLQkJfQotCi0JCWlmIChwcm9jQWRhcHRlckZhY3RvcnkgIT0gbnVsbCkgewotCQkJcHJvY0FkYXB0ZXJGYWN0b3J5LmNsZWFuVXAoKTsKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIEFkYXB0ZXJGYWN0b3J5IGNyZWF0ZUFkYXB0ZXJGYWN0b3J5RnJvbUV4dGVuc2lvbihTdHJpbmcgaWQpIHsKLQkJLy8gUHJvY2VzcyB0aGUgY29udHJpYnV0b3JzLgotCQkvLwotCQlJRXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpOwotCQlJRXh0ZW5zaW9uUG9pbnQgZXh0ZW5zaW9uUG9pbnQgPSBleHRlbnNpb25SZWdpc3RyeS5nZXRFeHRlbnNpb25Qb2ludChMaWJyYXJ5RWRpdFBsdWdpbi5QTFVHSU5fSUQsICJhZGFwdGVyRmFjdG9yaWVzIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKGV4dGVuc2lvblBvaW50ICE9IG51bGwpIHsKLQkJCUlFeHRlbnNpb25bXSBleHRlbnNpb25zID0gZXh0ZW5zaW9uUG9pbnQuZ2V0RXh0ZW5zaW9ucygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBleHRlbnNpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJSUV4dGVuc2lvbiBleHRlbnNpb24gPSBleHRlbnNpb25zW2ldOwotCQkJCVN0cmluZyBwbHVnaW5JZCA9IGV4dGVuc2lvbi5nZXROYW1lc3BhY2VJZGVudGlmaWVyKCk7Ci0JCQkJQnVuZGxlIGJ1bmRsZSA9IFBsYXRmb3JtLmdldEJ1bmRsZShwbHVnaW5JZCk7Ci0JCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gY29uZmlnRWxlbWVudHMgPSBleHRlbnNpb24KLQkJCQkJCS5nZXRDb25maWd1cmF0aW9uRWxlbWVudHMoKTsKLQkJCQlmb3IgKGludCBqID0gMDsgaiA8IGNvbmZpZ0VsZW1lbnRzLmxlbmd0aDsgaisrKSB7Ci0JCQkJCUlDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWdFbGVtZW50ID0gY29uZmlnRWxlbWVudHNbal07Ci0JCQkJCXRyeSB7Ci0JCQkJCQlTdHJpbmcgZmFjdG9yeUlkID0gY29uZmlnRWxlbWVudC5nZXRBdHRyaWJ1dGUoImlkIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCWlmKGlkLmVxdWFscyhmYWN0b3J5SWQpKSB7Ci0JCQkJCQkJU3RyaW5nIGNsYXNzTmFtZSA9IGNvbmZpZ0VsZW1lbnQuZ2V0QXR0cmlidXRlKCJjbGFzcyIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJaWYoY2xhc3NOYW1lICE9IG51bGwpIHsKLQkJCQkJCQkJT2JqZWN0IGZhY3RvcnkgPSBidW5kbGUubG9hZENsYXNzKGNsYXNzTmFtZSkubmV3SW5zdGFuY2UoKTsKLQkJCQkJCQkJaWYoZmFjdG9yeSBpbnN0YW5jZW9mIEFkYXB0ZXJGYWN0b3J5KSB7Ci0JCQkJCQkJCQlyZXR1cm4gKEFkYXB0ZXJGYWN0b3J5KSBmYWN0b3J5OwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UubG9nKGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pbnRlcm5hbC9wYWNrYWdlLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2ludGVybmFsL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODI0ZmU2OS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2ludGVybmFsL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIGRpc3BsYXkgYW5kIGVkaXRpbmcgc3VwcG9ydCBmb3IgbWV0aG9kIGxpYnJhcnkgZWxlbWVudHMuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9BY3Rpdml0eUl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9BY3Rpdml0eUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMjBhNGI0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaXRlbXNmaWx0ZXIvQWN0aXZpdHlJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qKgotICogCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlByb2Nlc3NVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWlsZXN0b25lOwotCi0vKioKLSAqIFRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGFuIGFjdGl2aXR5IGluIHRoZSBtZXRob2QgZWxlbWVudCBzZWxlY3Rpb24KLSAqIGRpYWxvZ3MuCi0gKiAKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZpdHlJdGVtUHJvdmlkZXIgZXh0ZW5kcwotCQlvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuQWN0aXZpdHlJdGVtUHJvdmlkZXIgewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgQWN0aXZpdHlJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBib29sZWFuIGFjY2VwdEFzQ2hpbGQoT2JqZWN0IGNoaWxkKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJaWYoY2hpbGQgaW5zdGFuY2VvZiBNaWxlc3RvbmUpcmV0dXJuIHRydWU7Ci0JCQotCQlyZXR1cm4gc3VwZXIuYWNjZXB0QXNDaGlsZChjaGlsZCk7Ci0JfQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlDb2xsZWN0aW9uIGNvbCA9IHN1cGVyLmdldENoaWxkcmVuKG9iamVjdCk7Ci0JCUZpbHRlclV0aWwKLQkJCQkuaXRlcmF0ZUNvbGxlY3Rpb24oY29sLCBQcm9jZXNzVXRpbC5nZXRGaWx0ZXIoYWRhcHRlckZhY3RvcnkpKTsKLQkJcmV0dXJuIGNvbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaXRlbXNmaWx0ZXIvQlNBY3Rpdml0eUl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9CU0FjdGl2aXR5SXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwNDYxZjEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9CU0FjdGl2aXR5SXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotCi0vKioKLSAqIFRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEgYnJlYWtkb3duIHN0cnVjdHVyZSBhY3Rpdml0eSBpbiB0aGUKLSAqIG1ldGhvZCBlbGVtZW50IHNlbGVjdGlvbiBkaWFsb2dzLgotICogCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEJTQWN0aXZpdHlJdGVtUHJvdmlkZXIgZXh0ZW5kcwotCQlvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuQlNBY3Rpdml0eUl0ZW1Qcm92aWRlciB7Ci0KLQlwcml2YXRlIElGaWx0ZXIgZmlsdGVyOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgQlNBY3Rpdml0eUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JcHJvdGVjdGVkIENvbGxlY3Rpb24gYWRkSW5oZXJpdGVkKE9iamVjdCBvYmplY3QsIExpc3QgbXlDaGlsZHJlbikgewotCQlDb2xsZWN0aW9uIGNvbCA9IHN1cGVyLmFkZEluaGVyaXRlZChvYmplY3QsIG15Q2hpbGRyZW4pOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjb2wuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgY2hpbGQgPSBpdGVyLm5leHQoKTsKLQkJCWlmIChmaWx0ZXIgIT0gbnVsbCkgewotCQkJCWlmICghZmlsdGVyLmFjY2VwdChjaGlsZCkpCi0JCQkJCWl0ZXIucmVtb3ZlKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGNvbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRGaWx0ZXIoSUZpbHRlciBmaWx0ZXIpIHsKLQkJc3VwZXIuc2V0RmlsdGVyKGZpbHRlcik7Ci0JCXRoaXMuZmlsdGVyID0gZmlsdGVyOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9DYXRlZ29yaXplZFByb2Nlc3Nlc0l0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9DYXRlZ29yaXplZFByb2Nlc3Nlc0l0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDE3NTFhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaXRlbXNmaWx0ZXIvQ2F0ZWdvcml6ZWRQcm9jZXNzZXNJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NQYWNrYWdlOwotCi0vKioKLSAqIFRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIHRoZSAiQ2FwYWJpbGl0eSBQYXR0ZXJucyIgYW5kICJEZWxpdmVyeQotICogUHJvY2Vzc2VzIiBmb2xkZXJzIGluIHRoZSBtZXRob2QgZWxlbWVudCBzZWxlY3Rpb24gZGlhbG9ncy4KLSAqIAotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBDYXRlZ29yaXplZFByb2Nlc3Nlc0l0ZW1Qcm92aWRlciBleHRlbmRzIEl0ZW1Qcm92aWRlckFkYXB0ZXIKLQkJaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSwKLQkJSUNvbmZpZ3VyYWJsZSB7Ci0JcHJpdmF0ZSBTdHJpbmcgbGFiZWw7Ci0KLQkvLyBwcml2YXRlIFN0cmluZ1tdIHBrZ1BhdGg7Ci0JcHJpdmF0ZSBJRmlsdGVyIGZpbHRlcjsKLQotCXByaXZhdGUgT2JqZWN0IGltYWdlOwotCi0JLy8gcHJpdmF0ZSBNZXRob2RQbHVnaW4gcGx1Z2luOwotCXByaXZhdGUgTWV0aG9kUGFja2FnZSBwa2c7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqIAotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqLwotCXB1YmxpYyBDYXRlZ29yaXplZFByb2Nlc3Nlc0l0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwKLQkJCU1ldGhvZFBhY2thZ2UgcGtnLCBTdHJpbmcgbmFtZSwgT2JqZWN0IGltYWdlKSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQkJbGFiZWwgPSBuYW1lOwotCQl0aGlzLmltYWdlID0gaW1hZ2U7Ci0JCXRoaXMucGtnID0gcGtnOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJQ29sbGVjdGlvbiBjaGlsZHJlbiA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IHBrZy5nZXRDaGlsZFBhY2thZ2VzKCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IKLQkJCQkuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlPYmplY3QgY2hpbGQgPSBlbGVtZW50OwotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50KSB7Ci0JCQkJY2hpbGQgPSAoKFByb2Nlc3NDb21wb25lbnQpIGVsZW1lbnQpLmdldFByb2Nlc3MoKTsKLQkJCX0KLQkJCWlmIChmaWx0ZXIuYWNjZXB0KGNoaWxkKSkgewotCQkJCWlmICghaXNFbXB0eVBhY2thZ2UoY2hpbGQpKSB7Ci0JCQkJCWNoaWxkcmVuLmFkZChjaGlsZCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBjaGlsZHJlbjsKLQl9Ci0KLQlwcml2YXRlIENvbGxlY3Rpb24gY2hpbGRQYWNrYWdlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCUNvbGxlY3Rpb24gY2hpbGRyZW4gPSAoKFByb2Nlc3NQYWNrYWdlKSBvYmplY3QpLmdldENoaWxkUGFja2FnZXMoKTsKLQkJTGlzdCBuZXdMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQluZXdMaXN0LmFkZEFsbChjaGlsZHJlbik7Ci0JCWlmIChmaWx0ZXIgIT0gbnVsbCkgewotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gbmV3TGlzdC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlpZiAoIWZpbHRlci5hY2NlcHQoaXRlci5uZXh0KCkpKSB7Ci0JCQkJCWl0ZXIucmVtb3ZlKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBuZXdMaXN0OwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBvYmplY3QKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzRW1wdHlQYWNrYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQgfHwgb2JqZWN0IGluc3RhbmNlb2YgUHJvY2VzcykKLQkJCXJldHVybiBmYWxzZTsKLQkJQ29sbGVjdGlvbiBjaGlsZHJlbiA9IHRoaXMuY2hpbGRQYWNrYWdlcyhvYmplY3QpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjaGlsZHJlbi5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCWlmICghaXNFbXB0eVBhY2thZ2UoaXRlci5uZXh0KCkpKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXROZXdDaGlsZERlc2NyaXB0b3JzKGphdmEubGFuZy5PYmplY3QsCi0JICogICAgICBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbiwgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXROZXdDaGlsZERlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QsCi0JCQlFZGl0aW5nRG9tYWluIGVkaXRpbmdEb21haW4sIE9iamVjdCBzaWJsaW5nKSB7Ci0JCXJldHVybiBzdXBlci5nZXROZXdDaGlsZERlc2NyaXB0b3JzKHRhcmdldCwgZWRpdGluZ0RvbWFpbiwgc2libGluZyk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldEltYWdlKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBpbWFnZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0VGV4dChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChsYWJlbCAhPSBudWxsKQotCQkJcmV0dXJuIGxhYmVsOwotCQlyZXR1cm4gc3VwZXIuZ2V0VGV4dChvYmplY3QpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhYmxlI3NldEZpbHRlcihjb20uaWJtLmxpYnJhcnkuZWRpdC5JRmlsdGVyKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZpbHRlcihJRmlsdGVyIGZpbHRlcikgewotCQl0aGlzLmZpbHRlciA9IGZpbHRlcjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYWJsZSNzZXRMYWJlbChqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldExhYmVsKFN0cmluZyBsYWJlbCkgewotCQl0aGlzLmxhYmVsID0gbGFiZWw7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UGFyZW50KE9iamVjdCBwYXJlbnQpIHsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaXRlbXNmaWx0ZXIvQ29udGVudENhdGVnb3JpZXNHcm91cEl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9Db250ZW50Q2F0ZWdvcmllc0dyb3VwSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiZWRjZDEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9Db250ZW50Q2F0ZWdvcmllc0dyb3VwSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklMaWJyYXJ5SXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY2F0ZWdvcnkuVHJhbnNpZW50Q2F0ZWdvcnlQYWNrYWdlSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGlzY2lwbGluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5Bc3NvY2lhdGlvbkhlbHBlcjsKLQotLyoqCi0gKiBUaGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciB0aGUgY29udGVudCBjYXRlZ29yeSBmb2xkZXJzIGluIHRoZSBtZXRob2QKLSAqIGVsZW1lbnQgc2VsZWN0aW9uIGRpYWxvZ3MuCi0gKiAKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQ29udGVudENhdGVnb3JpZXNHcm91cEl0ZW1Qcm92aWRlciBleHRlbmRzCi0JCVRyYW5zaWVudENhdGVnb3J5UGFja2FnZUl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzIElDb25maWd1cmFibGUgewotCi0JSUZpbHRlciBmaWx0ZXI7Ci0KLQlPYmplY3QgaW1hZ2U7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqIAotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiBAcGFyYW0gbmFtZQotCSAqLwotCXB1YmxpYyBDb250ZW50Q2F0ZWdvcmllc0dyb3VwSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LAotCQkJTm90aWZpZXIgcGFyZW50LCBTdHJpbmcgbmFtZSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSwgcGFyZW50LCBuYW1lKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0Q2hpbGRyZW5GZWF0dXJlcyhqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuRmVhdHVyZXMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoY2hpbGRyZW5GZWF0dXJlcyA9PSBudWxsKSB7Ci0JCQljaGlsZHJlbkZlYXR1cmVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJY2hpbGRyZW5GZWF0dXJlcy5hZGQoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJLmdldENvbnRlbnRQYWNrYWdlX0NvbnRlbnRFbGVtZW50cygpKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW5GZWF0dXJlczsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoT2JqZWN0IG9iaikgewotCQkvLyByZXR1cm4gKG9iaiBpbnN0YW5jZW9mIERpc2NpcGxpbmVHcm91cGluZykgfHwgKG9iaiBpbnN0YW5jZW9mCi0JCS8vIERpc2NpcGxpbmUgJiYKLQkJLy8gQXNzb2NpYXRpb25IZWxwZXIuZ2V0RGlzY2lwbGluZUdyb3VwcygoRGlzY2lwbGluZSlvYmopLmlzRW1wdHkoKSk7Ci0JCWlmICghdGhpcy5maWx0ZXIuYWNjZXB0KG9iaikpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBEaXNjaXBsaW5lCi0JCQkJJiYgIUFzc29jaWF0aW9uSGVscGVyLmdldERpc2NpcGxpbmVHcm91cHMoKERpc2NpcGxpbmUpIG9iaikKLQkJCQkJCS5pc0VtcHR5KCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBSb2xlU2V0Ci0JCQkJJiYgIUFzc29jaWF0aW9uSGVscGVyLmdldFJvbGVTZXRHcm91cHMoKFJvbGVTZXQpIG9iaikuaXNFbXB0eSgpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVHJhbnNpZW50R3JvdXBJdGVtUHJvdmlkZXIjYWNjZXB0QXNDaGlsZChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGFjY2VwdEFzQ2hpbGQoT2JqZWN0IG9iaikgewotCQlpZiAoIXN1cGVyLmFjY2VwdEFzQ2hpbGQob2JqKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIGFjY2VwdChvYmopOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UcmFuc2llbnRHcm91cEl0ZW1Qcm92aWRlciNnZXRDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJQ29sbGVjdGlvbiBjaGlsZHJlbiA9IHN1cGVyLmdldENoaWxkcmVuKG9iamVjdCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRvciA9IGNoaWxkcmVuLml0ZXJhdG9yKCk7IGl0b3IuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IG9iaiA9IGl0b3IubmV4dCgpOwotCQkJSXRlbVByb3ZpZGVyQWRhcHRlciBjb250ZW50QWRhcHRlciA9IChJdGVtUHJvdmlkZXJBZGFwdGVyKSBhZGFwdGVyRmFjdG9yeQotCQkJCQkuYWRhcHQob2JqLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkJaWYgKGNvbnRlbnRBZGFwdGVyIGluc3RhbmNlb2YgSUxpYnJhcnlJdGVtUHJvdmlkZXIpIHsKLQkJCQkoKElMaWJyYXJ5SXRlbVByb3ZpZGVyKSBjb250ZW50QWRhcHRlcikuc2V0UGFyZW50KG9iamVjdCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRJbWFnZShqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gaW1hZ2U7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RmlsdGVyKElGaWx0ZXIgZmlsdGVyKSB7Ci0JCXRoaXMuZmlsdGVyID0gZmlsdGVyOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJdGhpcy5pbWFnZSA9IG9iamVjdDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaXRlbXNmaWx0ZXIvQ29udGVudENhdGVnb3J5SXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL0NvbnRlbnRDYXRlZ29yeUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNjg5ZTRkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaXRlbXNmaWx0ZXIvQ29udGVudENhdGVnb3J5SXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklDb25maWd1cmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUxpYnJhcnlJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jYXRlZ29yeS5UcmFuc2llbnRDYXRlZ29yeVBhY2thZ2VJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIFRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEgY29udGVudCBjYXRlZ29yeSBpbiB0aGUgbWV0aG9kIGVsZW1lbnQKLSAqIHNlbGVjdGlvbiBkaWFsb2dzLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBDb250ZW50Q2F0ZWdvcnlJdGVtUHJvdmlkZXIgZXh0ZW5kcwotCQlUcmFuc2llbnRDYXRlZ29yeVBhY2thZ2VJdGVtUHJvdmlkZXIgaW1wbGVtZW50cyBJQ29uZmlndXJhYmxlIHsKLQotCUlGaWx0ZXIgZmlsdGVyOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogQHBhcmFtIG5hbWUKLQkgKi8KLQlwdWJsaWMgQ29udGVudENhdGVnb3J5SXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LAotCQkJTm90aWZpZXIgcGFyZW50LCBTdHJpbmcgbmFtZSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSwgcGFyZW50LCBuYW1lKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0Q2hpbGRyZW5GZWF0dXJlcyhqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuRmVhdHVyZXMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoY2hpbGRyZW5GZWF0dXJlcyA9PSBudWxsKSB7Ci0JCQljaGlsZHJlbkZlYXR1cmVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJLy8gY2hpbGRyZW5GZWF0dXJlcy5hZGQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RGlzY2lwbGluZUdyb3VwaW5nX0Rpc2NpcGxpbmVzKCkpOwotCQkJY2hpbGRyZW5GZWF0dXJlcy5hZGQoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJLmdldENvbnRlbnRQYWNrYWdlX0NvbnRlbnRFbGVtZW50cygpKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW5GZWF0dXJlczsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHRBc0NoaWxkKE9iamVjdCBvYmopIHsKLQkJcmV0dXJuIGZpbHRlci5hY2NlcHQob2JqKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRGaWx0ZXIoSUZpbHRlciBmaWx0ZXIpIHsKLQkJdGhpcy5maWx0ZXIgPSBmaWx0ZXI7Ci0JfQotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlDb2xsZWN0aW9uIGNoaWxkcmVuID0gc3VwZXIuZ2V0Q2hpbGRyZW4ob2JqZWN0KTsKLQkJZm9yIChJdGVyYXRvciBpdG9yID0gY2hpbGRyZW4uaXRlcmF0b3IoKTsgaXRvci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3Qgb2JqID0gaXRvci5uZXh0KCk7Ci0JCQlJdGVtUHJvdmlkZXJBZGFwdGVyIGNvbnRlbnRBZGFwdGVyID0gKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIGFkYXB0ZXJGYWN0b3J5Ci0JCQkJCS5hZGFwdChvYmosIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCQlpZiAoY29udGVudEFkYXB0ZXIgaW5zdGFuY2VvZiBJTGlicmFyeUl0ZW1Qcm92aWRlcikgewotCQkJCSgoSUxpYnJhcnlJdGVtUHJvdmlkZXIpIGNvbnRlbnRBZGFwdGVyKS5zZXRQYXJlbnQob2JqZWN0KTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gY2hpbGRyZW47Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9Db250ZW50RWxlbWVudHNJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaXRlbXNmaWx0ZXIvQ29udGVudEVsZW1lbnRzSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzN2UwOTEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9Db250ZW50RWxlbWVudHNJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklDb25maWd1cmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVHJhbnNpZW50R3JvdXBJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIFRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIHRoZSBjb250ZW50IGVsZW1lbnQgZm9sZGVycyBpbiB0aGUgbWV0aG9kCi0gKiBlbGVtZW50IHNlbGVjdGlvbiBkaWFsb2dzLgotICogCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIENvbnRlbnRFbGVtZW50c0l0ZW1Qcm92aWRlciBleHRlbmRzIFRyYW5zaWVudEdyb3VwSXRlbVByb3ZpZGVyCi0JCWltcGxlbWVudHMgSUNvbmZpZ3VyYWJsZSB7Ci0KLQlJRmlsdGVyIGZpbHRlcjsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICogCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICogQHBhcmFtIHBhcmVudAotCSAqLwotCXB1YmxpYyBDb250ZW50RWxlbWVudHNJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksCi0JCQlOb3RpZmllciBwYXJlbnQpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnksIHBhcmVudCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogQHBhcmFtIG5hbWUKLQkgKi8KLQlwdWJsaWMgQ29udGVudEVsZW1lbnRzSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LAotCQkJTm90aWZpZXIgcGFyZW50LCBTdHJpbmcgbmFtZSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSwgcGFyZW50LCBuYW1lKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0Q2hpbGRyZW5GZWF0dXJlcyhqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuRmVhdHVyZXMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoY2hpbGRyZW5GZWF0dXJlcyA9PSBudWxsKSB7Ci0JCQljaGlsZHJlbkZlYXR1cmVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJY2hpbGRyZW5GZWF0dXJlcy5hZGQoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJLmdldE1ldGhvZFBhY2thZ2VfQ2hpbGRQYWNrYWdlcygpKTsKLQkJCWNoaWxkcmVuRmVhdHVyZXMuYWRkKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCS5nZXRDb250ZW50UGFja2FnZV9Db250ZW50RWxlbWVudHMoKSk7Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuRmVhdHVyZXM7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldENoaWxkcmVuKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlDb2xsZWN0aW9uIGNoaWxkcmVuQ29sID0gc3VwZXIuZ2V0Q2hpbGRyZW4ob2JqZWN0KTsKLQkJZm9yIChJdGVyYXRvciBpdGVyMSA9IGNoaWxkcmVuQ29sLml0ZXJhdG9yKCk7IGl0ZXIxLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBjaGlsZCA9IGl0ZXIxLm5leHQoKTsKLQkJCWlmIChjaGlsZCBpbnN0YW5jZW9mIElDb25maWd1cmFibGUpCi0JCQkJKChJQ29uZmlndXJhYmxlKSBjaGlsZCkuc2V0RmlsdGVyKGZpbHRlcik7Ci0JCQlpZiAoIWZpbHRlci5hY2NlcHQoY2hpbGQpKQotCQkJCWl0ZXIxLnJlbW92ZSgpOwotCQl9Ci0JCXJldHVybiBjaGlsZHJlbkNvbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYWJsZSNzZXRGaWx0ZXIoY29tLmlibS5saWJyYXJ5LmVkaXQuSUZpbHRlcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGaWx0ZXIoSUZpbHRlciBmaWx0ZXIpIHsKLQkJdGhpcy5maWx0ZXIgPSBmaWx0ZXI7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRyYW5zaWVudEdyb3VwSXRlbVByb3ZpZGVyI2FjY2VwdEFzQ2hpbGQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHRBc0NoaWxkKE9iamVjdCBvYmopIHsKLQkJaWYgKCFzdXBlci5hY2NlcHRBc0NoaWxkKG9iaikpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9Db250ZW50UGFja2FnZUl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9Db250ZW50UGFja2FnZUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMDE3ZTYwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaXRlbXNmaWx0ZXIvQ29udGVudFBhY2thZ2VJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRQYWNrYWdlOwotCi0vKioKLSAqIFRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEgY29udGVudCBwYWNrYWdlIGluIHRoZSBtZXRob2QgZWxlbWVudAotICogc2VsZWN0aW9uIGRpYWxvZ3MuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIENvbnRlbnRQYWNrYWdlSXRlbVByb3ZpZGVyIGV4dGVuZHMKLQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5Db250ZW50UGFja2FnZUl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzCi0JCUlDb25maWd1cmFibGUgewotCi0JcHJpdmF0ZSBJRmlsdGVyIGZpbHRlcjsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIENvbnRlbnRQYWNrYWdlSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0Q2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCUNvbGxlY3Rpb24gY2hpbGRyZW4gPSBnZXRDaGlsZHJlbkluY2x1ZGluZ0VtcHR5T25lcyhvYmplY3QpOwotCi0JCS8vIHJlbW92ZSB0aGUgZW1wdHkgcGFja2FnZXMgZnJvbSB0aGUgY2hpbGRyZW4gbGlzdAotCQkvLwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjaGlsZHJlbi5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCWlmIChpc0VtcHR5UGFja2FnZShpdGVyLm5leHQoKSkpIHsKLQkJCQlpdGVyLnJlbW92ZSgpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGNoaWxkcmVuOwotCX0KLQotCXByaXZhdGUgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbkluY2x1ZGluZ0VtcHR5T25lcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCUNvbGxlY3Rpb24gY2hpbGRyZW4gPSBzdXBlci5nZXRDaGlsZHJlbihvYmplY3QpOwotCQlpZiAoZmlsdGVyICE9IG51bGwpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGNoaWxkcmVuLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCWlmICghZmlsdGVyLmFjY2VwdChpdGVyLm5leHQoKSkpIHsKLQkJCQkJaXRlci5yZW1vdmUoKTsKLQkJCQl9Ci0KLQkJCX0KLQkJfQotCQlyZXR1cm4gY2hpbGRyZW47Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIG9iamVjdAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNFbXB0eVBhY2thZ2UoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoIShvYmplY3QgaW5zdGFuY2VvZiBDb250ZW50UGFja2FnZSkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCUNvbGxlY3Rpb24gY2hpbGRyZW4gPSB0aGlzLmdldENoaWxkcmVuSW5jbHVkaW5nRW1wdHlPbmVzKG9iamVjdCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGNoaWxkcmVuLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJaWYgKCFpc0VtcHR5UGFja2FnZShpdGVyLm5leHQoKSkpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklDb25maWd1cmFibGUjc2V0RmlsdGVyKGNvbS5pYm0ubGlicmFyeS5lZGl0LklGaWx0ZXIpCi0JICovCi0JcHVibGljIHZvaWQgc2V0RmlsdGVyKElGaWx0ZXIgZmlsdGVyKSB7Ci0JCXRoaXMuZmlsdGVyID0gZmlsdGVyOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhYmxlI3NldExhYmVsKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGFiZWwoU3RyaW5nIGxhYmVsKSB7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklDb25maWd1cmFibGUjc2V0UGFyZW50KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgc2V0UGFyZW50KE9iamVjdCBwYXJlbnQpIHsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaXRlbXNmaWx0ZXIvQ3VzdG9tQ2F0ZWdvcnlJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaXRlbXNmaWx0ZXIvQ3VzdG9tQ2F0ZWdvcnlJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjNjOTI2ZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL0N1c3RvbUNhdGVnb3J5SXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5GZWF0dXJlVmFsdWVXcmFwcGVySXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci0KLS8qKgotICogVGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSBjdXN0b20gY2F0ZWdvcnkgaW4gdGhlIG1ldGhvZCBlbGVtZW50Ci0gKiBzZWxlY3Rpb24gZGlhbG9ncy4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQ3VzdG9tQ2F0ZWdvcnlJdGVtUHJvdmlkZXIgZXh0ZW5kcwotCQlvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNhdGVnb3J5LkN1c3RvbUNhdGVnb3J5SXRlbVByb3ZpZGVyIGltcGxlbWVudHMKLQkJSUNvbmZpZ3VyYWJsZSB7Ci0KLQlJRmlsdGVyIGZpbHRlcjsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIEN1c3RvbUNhdGVnb3J5SXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYWJsZSNzZXRGaWx0ZXIoY29tLmlibS5saWJyYXJ5LmVkaXQuSUZpbHRlcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGaWx0ZXIoSUZpbHRlciBmaWx0ZXIpIHsKLQkJdGhpcy5maWx0ZXIgPSBmaWx0ZXI7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklDb25maWd1cmFibGUjc2V0TGFiZWwoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMYWJlbChTdHJpbmcgbGFiZWwpIHsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYWJsZSNzZXRQYXJlbnQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQYXJlbnQoT2JqZWN0IHBhcmVudCkgewotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJLy8gU2V0IHRoZSBjaGlsZHJlblN0b3JlTWFwIHRvIG51bGwsIHRvIGdldCB0aGUgdXBkYXRlZCBjdXN0b21jYXRlZ29yaWVzCi0JCWNoaWxkcmVuU3RvcmVNYXAgPSBudWxsOwotCQlDb2xsZWN0aW9uIGNoaWxkcmVuID0gc3VwZXIuZ2V0Q2hpbGRyZW4ob2JqZWN0KTsKLQkJaWYgKHRoaXMuZmlsdGVyICE9IG51bGwpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGNoaWxkcmVuLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCUZlYXR1cmVWYWx1ZVdyYXBwZXJJdGVtUHJvdmlkZXIgb2JqID0gKEZlYXR1cmVWYWx1ZVdyYXBwZXJJdGVtUHJvdmlkZXIpIGl0ZXIKLQkJCQkJCS5uZXh0KCk7Ci0JCQkJaWYgKCF0aGlzLmZpbHRlci5hY2NlcHQob2JqLmdldFZhbHVlKCkpKSB7Ci0JCQkJCWl0ZXIucmVtb3ZlKCk7Ci0JCQkJfQotCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9EaXNjaXBsaW5lR3JvdXBpbmdJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaXRlbXNmaWx0ZXIvRGlzY2lwbGluZUdyb3VwaW5nSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2ZjU4MzEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9EaXNjaXBsaW5lR3JvdXBpbmdJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JTGlicmFyeUl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklTdGF0ZWZ1bEl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbmZpZ3VyYXRpb24uQ2F0ZWdvcmllc0l0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuTW9kZWxTdHJ1Y3R1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaXNjaXBsaW5lR3JvdXBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiBUaGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIGRpc2NpcGxpbmUgZ3JvdXBpbmcgaW4gdGhlIG1ldGhvZCBlbGVtZW50Ci0gKiBzZWxlY3Rpb24gZGlhbG9ncy4KLSAqIAotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBEaXNjaXBsaW5lR3JvdXBpbmdJdGVtUHJvdmlkZXIgZXh0ZW5kcwotCQlvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLkRpc2NpcGxpbmVHcm91cGluZ0l0ZW1Qcm92aWRlciBpbXBsZW1lbnRzCi0JCUlDb25maWd1cmFibGUsIElMaWJyYXJ5SXRlbVByb3ZpZGVyLCBJU3RhdGVmdWxJdGVtUHJvdmlkZXIgewotCi0JcHJpdmF0ZSBJRmlsdGVyIGZpbHRlcjsKLQotCXByaXZhdGUgSUNvbmZpZ3VyYXRvciBjb25maWd1cmF0b3I7Ci0KLQlwcml2YXRlIE9iamVjdCBwYXJlbnQ7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqIAotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqLwotCXB1YmxpYyBEaXNjaXBsaW5lR3JvdXBpbmdJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRDaGlsZHJlbkZlYXR1cmVzKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5GZWF0dXJlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlbkZlYXR1cmVzID09IG51bGwpIHsKLQkJCWNoaWxkcmVuRmVhdHVyZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQljaGlsZHJlbkZlYXR1cmVzLmFkZChVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkuZ2V0RGlzY2lwbGluZUdyb3VwaW5nX0Rpc2NpcGxpbmVzKCkpOwotCQkJLy8gY2hpbGRyZW5GZWF0dXJlcy5hZGQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RGlzY2lwbGluZSgpKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW5GZWF0dXJlczsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0Q2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCUNvbGxlY3Rpb24gY2hpbGRyZW47Ci0JCU9iamVjdCBwYXJlbnQgPSBnZXRQYXJlbnQob2JqZWN0KTsKLQkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIENhdGVnb3JpZXNJdGVtUHJvdmlkZXIpIHsKLQotCQkJLy8gVE9ETzogY29tbWVudGVkIG91dCB1bnRpbCBKaW5odWEgZml4ZWQgYnVncyBpbgotCQkJLy8gQ29uZmlndXJhdGlvbkZpbHRlcgotCQkJaWYgKGNvbmZpZ3VyYXRvciAhPSBudWxsKSB7Ci0JCQkJY2hpbGRyZW4gPSBjb25maWd1cmF0b3IuZ2V0Q2hpbGRyZW4ob2JqZWN0LAotCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJLmdldERpc2NpcGxpbmVHcm91cGluZ19EaXNjaXBsaW5lcygpKTsKLQkJCQlpZiAoY2hpbGRyZW4gIT0gbnVsbCkgewotCQkJCQlTeXN0ZW0ub3V0Ci0JCQkJCQkJLnByaW50bG4oIkRpc2NpcGxpbmVHcm91cGluZ0l0ZW1Qcm92aWRlci5nZXRDaGlsZHJlbigpOiByZXR1cm5lZCBmcm9tIGNvbmZpZ3VyYXRvcjogIiArIGNoaWxkcmVuKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlyZXR1cm4gY2hpbGRyZW47Ci0JCQkJfQotCQkJfQotCi0JCQljaGlsZHJlbiA9IHN1cGVyLmdldENoaWxkcmVuKG9iamVjdCk7Ci0JCQlEaXNjaXBsaW5lR3JvdXBpbmcgZ3JvdXBpbmcgPSAoRGlzY2lwbGluZUdyb3VwaW5nKSBvYmplY3Q7Ci0JCQlNZXRob2RDb25maWd1cmF0aW9uIG1ldGhvZENvbmYgPSAoTWV0aG9kQ29uZmlndXJhdGlvbikgKChDYXRlZ29yaWVzSXRlbVByb3ZpZGVyKSBnZXRQYXJlbnQob2JqZWN0KSkKLQkJCQkJLmdldFRhcmdldCgpOwotCQkJVG5nVXRpbC5hZGRFeHRlbmRlZENoaWxkcmVuKGdyb3VwaW5nLCBtZXRob2RDb25mLCBjaGlsZHJlbiwKLQkJCQkJTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC5kaXNjaXBsaW5lRGVmaW5pdGlvblBhdGgpOwotCi0JCQkvLyBzZXQgcGFyZW50Ci0JCQkvLwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gY2hpbGRyZW4uaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IGFkYXB0ZXIgPSBhZGFwdGVyRmFjdG9yeS5hZGFwdChpdGVyLm5leHQoKSwKLQkJCQkJCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCQkJaWYgKGFkYXB0ZXIgaW5zdGFuY2VvZiBJTGlicmFyeUl0ZW1Qcm92aWRlcikgewotCQkJCQkoKElMaWJyYXJ5SXRlbVByb3ZpZGVyKSBhZGFwdGVyKS5zZXRQYXJlbnQodGhpcyk7Ci0JCQkJfQotCQkJfQotCi0JCQlyZXR1cm4gY2hpbGRyZW47Ci0JCX0gZWxzZSB7Ci0JCQlDb2xsZWN0aW9uIGNoaWxkcmVuQ29sID0gc3VwZXIuZ2V0Q2hpbGRyZW4ob2JqZWN0KTsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGNoaWxkcmVuQ29sLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBjaGlsZCA9IGl0ZXIubmV4dCgpOwotCQkJCWlmIChmaWx0ZXIgIT0gbnVsbCkKLQkJCQkJaWYgKCFmaWx0ZXIuYWNjZXB0KGNoaWxkKSkKLQkJCQkJCWl0ZXIucmVtb3ZlKCk7Ci0JCQl9Ci0JCQlyZXR1cm4gY2hpbGRyZW5Db2w7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYWJsZSNzZXRGaWx0ZXIoY29tLmlibS5saWJyYXJ5LmVkaXQuSUZpbHRlcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGaWx0ZXIoSUZpbHRlciBmaWx0ZXIpIHsKLQkJdGhpcy5maWx0ZXIgPSBmaWx0ZXI7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGxpYnJhcnkuZWRpdC5JQ29uZmlndXJhYmxlI3NldExhYmVsKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGFiZWwoU3RyaW5nIGxhYmVsKSB7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGxpYnJhcnkuZWRpdC5JQ29uZmlndXJhYmxlI3NldFBhcmVudChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBhcmVudChPYmplY3QgcGFyZW50KSB7Ci0JCXRoaXMucGFyZW50ID0gcGFyZW50OwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKHBhcmVudCAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gcGFyZW50OwotCQl9Ci0JCS8vIGlmKG9iamVjdCBpbnN0YW5jZW9mIEVPYmplY3QpIHsKLQkJLy8gTWV0aG9kUGx1Z2luIHBsdWdpbiA9IFVtYVV0aWwuZ2V0TWV0aG9kUGx1Z2luKChFT2JqZWN0KSBvYmplY3QpOwotCQkvLyBpZihwbHVnaW4gIT0gbnVsbCkgewotCQkvLyBTdHJpbmdbXSBwYXRoID0gewotCQkvLyBUbmdFZGl0UGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX0NvbnRlbnRfZ3JvdXAiKSAvLyROT04tTkxTLTEkCi0JCS8vICxUbmdFZGl0UGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX1N0YW5kYXJkX0NhdGVnb3JpZXNfZ3JvdXAiKQotCQkvLyAvLyROT04tTkxTLTEkCi0JCS8vICxUbmdFZGl0UGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX0Rpc2NpcGxpbmVzX2dyb3VwIikKLQkJLy8gLy8kTk9OLU5MUy0xJAotCQkvLyB9OwotCQkvLyBPYmplY3QgYWRhcHRlciA9Ci0JCS8vIFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFLmdldEl0ZW1zRmlsdGVyX0FkYXB0ZXJGYWN0b3J5KGZpbHRlcikuYWRhcHQocGx1Z2luLAotCQkvLyBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkvLyAvLyBJR3JvdXBDb250YWluZXIgZ3JvdXBzID0gKElHcm91cENvbnRhaW5lcikKLQkJLy8gVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UuZ2V0SXRlbXNGaWx0ZXJfQWRhcHRlckZhY3RvcnkoZmlsdGVyKS5hZGFwdChwbHVnaW4sCi0JCS8vIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCS8vIC8vIGludCBpOwotCQkvLyAvLyBmb3IoaSA9IDA7IGkgPCBwYXRoLmxlbmd0aCAtIDE7IGkrKykgewotCQkvLyAvLyBncm91cHMgPSAoSUdyb3VwQ29udGFpbmVyKSBncm91cHMuZ2V0R3JvdXBJdGVtUHJvdmlkZXIocGF0aFtpXSk7Ci0JCS8vIC8vIGlmKGdyb3VwcyA9PSBudWxsKSByZXR1cm4gbnVsbDsKLQkJLy8gLy8gfQotCQkvLyAvLyByZXR1cm4gKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIGdyb3Vwcy5nZXRHcm91cEl0ZW1Qcm92aWRlcihwYXRoW2ldKTsKLQkJLy8gcmV0dXJuIFRuZ1V0aWwuZ2V0QWRhcHRlcihwbHVnaW4sIHBhdGgpOwotCQkvLyAvL3JldHVybiBhZGFwdGVyOwotCQkvLyB9Ci0JCS8vIH0KLQotCQlyZXR1cm4gc3VwZXIuZ2V0UGFyZW50KG9iamVjdCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL0Rpc2NpcGxpbmVJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaXRlbXNmaWx0ZXIvRGlzY2lwbGluZUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NmIyOWQ0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaXRlbXNmaWx0ZXIvRGlzY2lwbGluZUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29uZmlndXJhdGlvbi5DYXRlZ29yaWVzSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGlzY2lwbGluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLQotLyoqCi0gKiBUaGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIGRpc2NpcGxpbmUgaW4gdGhlIG1ldGhvZCBlbGVtZW50Ci0gKiBzZWxlY3Rpb24gZGlhbG9ncy4KLSAqIAotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBEaXNjaXBsaW5lSXRlbVByb3ZpZGVyIGV4dGVuZHMKLQkJb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb25maWd1cmF0aW9uLkRpc2NpcGxpbmVJdGVtUHJvdmlkZXIgaW1wbGVtZW50cwotCQlJQ29uZmlndXJhYmxlIHsKLQotCXByaXZhdGUgSUZpbHRlciBmaWx0ZXI7Ci0JT2JqZWN0IHBhcmVudDsKLQotCXB1YmxpYyBEaXNjaXBsaW5lSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0JCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlDb2xsZWN0aW9uIGNvbDsKLQkJT2JqZWN0IHBhcmVudCA9IGdldFBhcmVudChvYmplY3QpOwotCQkKLQkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIENhdGVnb3JpZXNJdGVtUHJvdmlkZXIpIHsKLQkJCWNvbCA9IHN1cGVyLmdldENoaWxkcmVuKG9iamVjdCk7Ci0JCQkKLQkJfSBlbHNlIHsKLQkJCUl0ZW1Qcm92aWRlckFkYXB0ZXIgYWRhcHRlciA9IChJdGVtUHJvdmlkZXJBZGFwdGVyKSAoVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UpCi0JCQkJCS5nZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKS5hZGFwdChvYmplY3QsCi0JCQkJCQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCWNvbCA9IGFkYXB0ZXIuZ2V0Q2hpbGRyZW4ob2JqZWN0KTsKLQkJfQotCQlpZiAoZmlsdGVyICE9IG51bGwpIHsKLQkJCUZpbHRlclV0aWwuaXRlcmF0ZUNvbGxlY3Rpb24oY29sLCBmaWx0ZXIpOwotCQl9Ci0KLQkJcmV0dXJuIGNvbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRGaWx0ZXIoSUZpbHRlciBmaWx0ZXIpIHsKLQkJdGhpcy5maWx0ZXIgPSBmaWx0ZXI7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklDb25maWd1cmFibGUjc2V0TGFiZWwoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMYWJlbChTdHJpbmcgbGFiZWwpIHsKLQl9Ci0JCi0JcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IG9iamVjdCkgewotCQlEaXNjaXBsaW5lIGRpc2NpcGxpbmUgPSAoRGlzY2lwbGluZSkgb2JqZWN0OwotCQlpZiAoZGlzY2lwbGluZS5lQ29udGFpbmVyKCkgaW5zdGFuY2VvZiBEaXNjaXBsaW5lKSB7Ci0JCQlyZXR1cm4gc3VwZXIuZ2V0UGFyZW50KG9iamVjdCk7Ci0JCX0KLQkJTWV0aG9kUGx1Z2luIG1vZGVsID0gVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4oZGlzY2lwbGluZSk7Ci0JCWlmIChtb2RlbCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiBwYXJlbnQ7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UGFyZW50KE9iamVjdCBwYXJlbnQpIHsKLQkJc3VwZXIuc2V0UGFyZW50KHBhcmVudCk7Ci0JCXRoaXMucGFyZW50ID0gcGFyZW50OwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9Eb21haW5JdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaXRlbXNmaWx0ZXIvRG9tYWluSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyYmY4ZDUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9Eb21haW5JdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbmZpZ3VyYXRpb24uQ2F0ZWdvcmllc0l0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLQotLyoqCi0gKiBUaGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIGRvbWFpbiBpbiB0aGUgbWV0aG9kIGVsZW1lbnQKLSAqIHNlbGVjdGlvbiBkaWFsb2dzLgotICogCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIERvbWFpbkl0ZW1Qcm92aWRlciBleHRlbmRzCi0JCW9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29uZmlndXJhdGlvbi5Eb21haW5JdGVtUHJvdmlkZXIgaW1wbGVtZW50cwotCQlJQ29uZmlndXJhYmxlIHsKLQlPYmplY3QgcGFyZW50OwotCXByaXZhdGUgSUZpbHRlciBmaWx0ZXI7Ci0KLQkvKioKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgRG9tYWluSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3Qgb2JqZWN0KSB7Ci0JCURvbWFpbiBkb21haW4gPSAoRG9tYWluKSBvYmplY3Q7Ci0JCWlmIChkb21haW4uZUNvbnRhaW5lcigpIGluc3RhbmNlb2YgRG9tYWluKSB7Ci0JCQlyZXR1cm4gc3VwZXIuZ2V0UGFyZW50KG9iamVjdCk7Ci0JCX0KLQkJTWV0aG9kUGx1Z2luIG1vZGVsID0gVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4oZG9tYWluKTsKLQkJaWYgKG1vZGVsID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIHBhcmVudDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRQYXJlbnQoT2JqZWN0IHBhcmVudCkgewotCQlzdXBlci5zZXRQYXJlbnQocGFyZW50KTsKLQkJdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RmlsdGVyKElGaWx0ZXIgZmlsdGVyKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJdGhpcy5maWx0ZXIgPSBmaWx0ZXI7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TGFiZWwoU3RyaW5nIGxhYmVsKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJCi0JfQotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlDb2xsZWN0aW9uIGNvbDsKLQkJT2JqZWN0IHBhcmVudCA9IGdldFBhcmVudChvYmplY3QpOwotCQkKLQkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIENhdGVnb3JpZXNJdGVtUHJvdmlkZXIpIHsKLQkJCWNvbCA9IHN1cGVyLmdldENoaWxkcmVuKG9iamVjdCk7Ci0JCQkKLQkJfSBlbHNlIHsKLQkJCUl0ZW1Qcm92aWRlckFkYXB0ZXIgYWRhcHRlciA9IChJdGVtUHJvdmlkZXJBZGFwdGVyKSAoVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UpCi0JCQkJCS5nZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKS5hZGFwdChvYmplY3QsCi0JCQkJCQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCWNvbCA9IGFkYXB0ZXIuZ2V0Q2hpbGRyZW4ob2JqZWN0KTsKLQkJfQotCQkvLyBJZiBmaWx0ZXIgbm90IG51bGwgaXRlcmF0ZSBjb2xsZWN0aW9uLgotCQlpZiAoZmlsdGVyICE9IG51bGwpIHsKLQkJCUZpbHRlclV0aWwuaXRlcmF0ZUNvbGxlY3Rpb24oY29sLCBmaWx0ZXIpOwotCQl9Ci0KLQkJcmV0dXJuIGNvbDsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL0ZpbHRlckNvbnN0YW50cy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9GaWx0ZXJDb25zdGFudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDk5YjFmMS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL0ZpbHRlckNvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UmVzb3VyY2VzOwotCi0vKioKLSAqIERlZmluZXMgdGhlIGdsb2JhbCBjb25zdGFudHMgdXNlZCBpbiB0aGUgbWV0aG9kIGVsZW1lbnQgc2VsZWN0aW9uIGRpYWxvZ3MuCi0gKiAKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRmlsdGVyQ29uc3RhbnRzIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENVU1RPTV9DQVRFR09SSUVTID0gTGlicmFyeUVkaXRSZXNvdXJjZXMuRmlsdGVyQ29uc3RhbnRzX2N1c3RvbWNhdGVnb3JpZXNfdGV4dDsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNRVRIT19QTFVHSU5TID0gTGlicmFyeUVkaXRSZXNvdXJjZXMuRmlsdGVyQ29uc3RhbnRzX21ldGhvZHBsdWdpbnNfdGV4dDsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05URU5UX1BBQ0tBR0VTID0gTGlicmFyeUVkaXRSZXNvdXJjZXMuRmlsdGVyQ29uc3RhbnRzX2NvbnRlbnRwYWNrYWdlc190ZXh0OyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJPTEVTRVRTID0gTGlicmFyeUVkaXRSZXNvdXJjZXMuRmlsdGVyQ29uc3RhbnRzX3JvbGVzZXRzX3RleHQ7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElTQ0lQTElORVMgPSBMaWJyYXJ5RWRpdFJlc291cmNlcy5GaWx0ZXJDb25zdGFudHNfZGlzY2lwbGluZXNfdGV4dDsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXT1JLUFJPRFVDVFRZUEVTID0gTGlicmFyeUVkaXRSZXNvdXJjZXMuRmlsdGVyQ29uc3RhbnRzX3dvcmtwcm9kdWN0dHlwZXNfdGV4dDsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBET01BSU5TID0gTGlicmFyeUVkaXRSZXNvdXJjZXMuRmlsdGVyQ29uc3RhbnRzX2RvbWFpbnNfdGV4dDsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUT09MUyA9IExpYnJhcnlFZGl0UmVzb3VyY2VzLkZpbHRlckNvbnN0YW50c190b29sc190ZXh0OyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFMTF9FTEVNRU5UUyA9IExpYnJhcnlFZGl0UmVzb3VyY2VzLkZpbHRlckNvbnN0YW50c19hbGxfdGV4dDsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBST0xFUyA9IExpYnJhcnlFZGl0UmVzb3VyY2VzLkZpbHRlckNvbnN0YW50c19yb2xlc190ZXh0OyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBU0tTID0gTGlicmFyeUVkaXRSZXNvdXJjZXMuRmlsdGVyQ29uc3RhbnRzX3Rhc2tzX3RleHQ7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV09SS1BST0RVQ1RTID0gTGlicmFyeUVkaXRSZXNvdXJjZXMuRmlsdGVyQ29uc3RhbnRzX3dvcmtwcm9kdWN0c190ZXh0OyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEdVSURBTkNFID0gTGlicmFyeUVkaXRSZXNvdXJjZXMuRmlsdGVyQ29uc3RhbnRzX2d1aWRhbmNlX3RleHQ7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPQ0VTU0VTID0gTGlicmFyeUVkaXRSZXNvdXJjZXMuRmlsdGVyQ29uc3RhbnRzX3Byb2Nlc3Nlc190ZXh0OyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElWSVRJRVMgPSBMaWJyYXJ5RWRpdFJlc291cmNlcy5GaWx0ZXJDb25zdGFudHNfYWN0aXZpdGllc190ZXh0OyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdPUktfUFJPRFVDVF9ERVNDUklQVE9SUyA9IExpYnJhcnlFZGl0UmVzb3VyY2VzLkZpbHRlckNvbnN0YW50c193b3JrcHJvZHVjdGRlc2NyaXB0b3JzX3RleHQ7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUk9MRV9ERVNDUklQVE9SUyA9IExpYnJhcnlFZGl0UmVzb3VyY2VzLkZpbHRlckNvbnN0YW50c19yb2xlZGVzY3JpcHRvcnNfdGV4dDsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQVNLX0RFU0NSSVBUT1JTID0gTGlicmFyeUVkaXRSZXNvdXJjZXMuRmlsdGVyQ29uc3RhbnRzX3Rhc2tkZXNjcmlwdG9yc190ZXh0OyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9OTFlfQ09OVEVOVF9FTEVNRU5UUyA9IExpYnJhcnlFZGl0UmVzb3VyY2VzLkZpbHRlckNvbnN0YW50c19jb250ZW50ZWxlbWVudHNfdGV4dDsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05GSUdfQ09OVEVOVF9FTEVNRU5UID0gTGlicmFyeUVkaXRSZXNvdXJjZXMuRmlsdGVyQ29uc3RhbnRzX2FsbGNvbnRlbnRlbGVtZW50c190ZXh0OyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJPQURNQVAgPSBMaWJyYXJ5RWRpdFJlc291cmNlcy5GaWx0ZXJDb25zdGFudHNfcm9hZG1hcF90ZXh0OyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENIRUNLTElTVFMgPSBMaWJyYXJ5RWRpdFJlc291cmNlcy5GaWx0ZXJDb25zdGFudHNfY2hlY2tsaXN0c190ZXh0OyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTkNFUFRTID0gTGlicmFyeUVkaXRSZXNvdXJjZXMuRmlsdGVyQ29uc3RhbnRzX2NvbmNlcHRzX3RleHQ7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJBQ1RJQ0VTID0gTGlicmFyeUVkaXRSZXNvdXJjZXMuRmlsdGVyQ29uc3RhbnRzX3ByYWN0aWNlc190ZXh0OyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFUE9SVFMgPSBMaWJyYXJ5RWRpdFJlc291cmNlcy5GaWx0ZXJDb25zdGFudHNfcmVwb3J0c190ZXh0OyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFVVNBQkxFX0FTU0VUUyA9IExpYnJhcnlFZGl0UmVzb3VyY2VzLkZpbHRlckNvbnN0YW50c19yZXVzYWJsZWFzc2V0c190ZXh0OyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdISVRFX1BBUEVSUyA9IExpYnJhcnlFZGl0UmVzb3VyY2VzLkZpbHRlckNvbnN0YW50c193aGl0ZXBhcGVyc190ZXh0OyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFTVBMQVRFUyA9IExpYnJhcnlFZGl0UmVzb3VyY2VzLkZpbHRlckNvbnN0YW50c190ZW1wbGF0ZXNfdGV4dDsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHVUlERUxJTkVTID0gTGlicmFyeUVkaXRSZXNvdXJjZXMuRmlsdGVyQ29uc3RhbnRzX2d1aWRlbGluZXNfdGV4dDsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVVBQT1JUSU5HX01BVEVSSUFMUyA9IExpYnJhcnlFZGl0UmVzb3VyY2VzLkZpbHRlckNvbnN0YW50c19zdXBwb3J0aW5nbWF0ZXJpYWxzX3RleHQ7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVE9PTF9NRU5UT1JTID0gTGlicmFyeUVkaXRSZXNvdXJjZXMuRmlsdGVyQ29uc3RhbnRzX3Rvb2xtZW50b3JzX3RleHQ7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhBTVBMRVMgPSBMaWJyYXJ5RWRpdFJlc291cmNlcy5GaWx0ZXJDb25zdGFudHNfZXhhbXBsZXNfdGV4dDsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBST0xFX1NFVF9HUk9VUElOR1MgPSBMaWJyYXJ5RWRpdFJlc291cmNlcy5GaWx0ZXJDb25zdGFudHNfcm9sZXNldGdyb3B1aW5nc190ZXh0OyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERJU0NJUExJTkVfR1JPVVBJTkdTID0gTGlicmFyeUVkaXRSZXNvdXJjZXMuRmlsdGVyQ29uc3RhbnRzX2Rpc2NpcGxpbmVncm91cGluZ3NfdGV4dDsgCi0KLQkvLyBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZwotCi0JLy8gcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gR1VJREFOQ0VfVFlQRVMgPSBuZXcgU3RyaW5nW117Ci0JLy8gQ0hFQ0tMSVNUUywgQ09OQ0VQVFMsIEVYQU1QTEVTLCBQUkFDVElDRVMsIFJFUE9SVFMsIFJFVVNBQkxFX0FTU0VUUywKLQkvLyBTVVBQT1JUSU5HX01BVEVSSUFMUywgVEVNUExBVEVTLCBUT09MX01FTlRPUlMsIFdISVRFX1BBUEVSUywKLQkvLyBHVUlERUxJTkVTLFJPQURNQVB9OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBDT05URU5UX0VMRU1FTlRTID0gbmV3IFN0cmluZ1tdIHsgUk9MRVMsCi0JCQlUQVNLUywgV09SS1BST0RVQ1RTLCBHVUlEQU5DRSwgU1VQUE9SVElOR19NQVRFUklBTFMsCi0JCQlPTkxZX0NPTlRFTlRfRUxFTUVOVFMsIFRPT0xfTUVOVE9SUyB9OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBDT05URU5UX0NBVEVHT1JJRVMgPSBuZXcgU3RyaW5nW10geyBST0xFU0VUUywKLQkJCVdPUktQUk9EVUNUVFlQRVMsIERJU0NJUExJTkVTLCBUT09MUywgRE9NQUlOUyB9OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBCUkVBS0RPV05fRUxFTUVOVFMgPSBuZXcgU3RyaW5nW10gewotCQkJV09SS19QUk9EVUNUX0RFU0NSSVBUT1JTLCBUQVNLX0RFU0NSSVBUT1JTLCBST0xFX0RFU0NSSVBUT1JTIH07Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIExpc3QgY29udGVudEVsZW1lbnRTdHJzID0gQXJyYXlzCi0JCQkuYXNMaXN0KENPTlRFTlRfRUxFTUVOVFMpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBMaXN0IGNhdGVnb3J5U3RycyA9IEFycmF5cy5hc0xpc3QoQ09OVEVOVF9DQVRFR09SSUVTKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgTGlzdCBicmVha2Rvd25FbGVtZW50cyA9IEFycmF5cwotCQkJLmFzTGlzdChCUkVBS0RPV05fRUxFTUVOVFMpOwotCi0JcHVibGljIHN0YXRpYyBIYXNoTWFwIGhhc2hNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIHNwYWNlID0gIi0iOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFU1RJTUFURV9DT05TSURFUkFUSU9OUyA9IExpYnJhcnlFZGl0UGx1Z2luCi0JCQkuZ2V0UGx1Z2luKCkuZ2V0U3RyaW5nKCJfVUlfR3VpZGFuY2VzX0VzdGltYXRpb25Db25zaWRlcmF0aW9ucyIpOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVJNX0RFRklOSVRJT05TID0gTGlicmFyeUVkaXRQbHVnaW4uZ2V0UGx1Z2luKCkKLQkJCS5nZXRTdHJpbmcoIl9VSV9HdWlkYW5jZXNfVGVybURlZmluaXRpb25zIik7IC8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBTllfU1RSSU5HID0gIioiOyAgIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBTllfQ0hBUkFDVEVSID0gIj8iOyAgLy8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9GaWx0ZXJIZWxwZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaXRlbXNmaWx0ZXIvRmlsdGVySGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyOWFjOWYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9GaWx0ZXJIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLnJlZ2V4Lk1hdGNoZXI7Ci1pbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlByZXNlbnRhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLk1ldGhvZEVsZW1lbnRVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Nb2RlbFN0cnVjdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQXJ0aWZhY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ3VzdG9tQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmliYWJsZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaXNjaXBsaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGlzY2lwbGluZUdyb3VwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc1BhY2thZ2U7Ci0KLS8qKgotICogQSBoZWxwZXIgY2xhc3MgZm9yIG1hbmFnaW5nIGVsZW1lbnQgZmlsdGVyaW5nIGluIHRoZSBtZXRob2QgZWxlbWVudCBzZWxlY3Rpb24KLSAqIGRpYWxvZ3MuCi0gKiAKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRmlsdGVySGVscGVyIHsKLQotCXByaXZhdGUgU3RyaW5nIHBhdHRlcm47Ci0KLQlwcml2YXRlIFN0cmluZyB0eXBlOwotCi0JcHJpdmF0ZSBQYXR0ZXJuIHJlZ2V4OwotCi0JcHJpdmF0ZSBTdHJpbmcgdGFiU3RyOwotCi0JcHJpdmF0ZSBPYmplY3QgY29udGVudEVsZW1lbnQ7Ci0KLQlwcml2YXRlIExpc3QgZXhpc3RpbmdFbGVtZW50cyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCXByaXZhdGUgYm9vbGVhbiBzaG93UHJlc2VudGF0aW9uTmFtZSA9IGZhbHNlOwotCQotCS8vIFRoaXMgaXMgc2VwYXJhdGUgaGFuZGxpbmcgZm9yIENvbnRlbnRDb250ZWdvcnkgCi0JcHJpdmF0ZSBTdHJpbmcgY29udGVudENhdGVnb3J5VGFiU3RyOwotCi0JcHVibGljIEZpbHRlckhlbHBlcihPYmplY3QgY29udGVudEVsZW1lbnQsIFN0cmluZyB0YWJTdHIsIFN0cmluZyBwYXR0ZXJuLAotCi0JU3RyaW5nIGZpbHRlclR5cGVTdHIsIExpc3QgYWxyZWFkeVNlbGVjdGVkTGlzdCkgewotCi0JCXRoaXMuY29udGVudEVsZW1lbnQgPSBjb250ZW50RWxlbWVudDsKLQotCQl0aGlzLnRhYlN0ciA9IHRhYlN0cjsKLQotCQl0aGlzLnR5cGUgPSBmaWx0ZXJUeXBlU3RyOwotCi0JCXRoaXMuZXhpc3RpbmdFbGVtZW50cyA9IGFscmVhZHlTZWxlY3RlZExpc3Q7Ci0KLQkJdGhpcy5wYXR0ZXJuID0gcGF0dGVybjsKLQotCQlzaG93UHJlc2VudGF0aW9uTmFtZSA9IFByZXNlbnRhdGlvbkNvbnRleHQuSU5TVEFOQ0UKLQkJLmlzU2hvd1ByZXNlbnRhdGlvbk5hbWVzKCk7Ci0KLQotCX0KLQkvKgotCSAqIG1ldGhvZCB0byBzZXQgY29udGVudENhdGVnb3J5VGFiU3RyLCB0aGlzIAotCSAqIHNwZWNpYWwgaGFuZGxlIGZvciBjb250ZW50IGNhdGVnb3J5LCB0YWJTdHIgaW1wbGVtZW50YXRpb24gCi0JICogZG9ub3Qgd29yayBmb3IgdGhpcy4gCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29udGVudENhdGVnb3J5VGFiU3RyKFN0cmluZyBjb250ZW50Q2F0ZWdvcnlUYWJTdHIpewotCQl0aGlzLmNvbnRlbnRDYXRlZ29yeVRhYlN0ciA9IGNvbnRlbnRDYXRlZ29yeVRhYlN0cjsKLQl9Ci0JLyoKLQkgKiBtZXRob2QgdG8gc2V0IGNvbnRlbnRDYXRlZ29yeVRhYlN0ciwgdGhpcyAKLQkgKiBzcGVjaWFsIGhhbmRsZSBmb3IgY29udGVudCBjYXRlZ29yeSwgdGFiU3RyIGltcGxlbWVudGF0aW9uIAotCSAqIGRvbm90IHdvcmsgZm9yIHRoaXMuIAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q29udGVudENhdGVnb3J5VGFiU3RyKCl7Ci0JCXJldHVybiB0aGlzLmNvbnRlbnRDYXRlZ29yeVRhYlN0cjsKLQl9Ci0KLQlwdWJsaWMgTGlzdCBnZXRBbHJlYWR5U2VsZWN0ZWRMaXN0KCkgewotCi0JCXJldHVybiBleGlzdGluZ0VsZW1lbnRzOwotCi0JfQotCi0JcHVibGljIHZvaWQgc2V0QWxyZWFkeVNlbGVjdGVkTGlzdChMaXN0IGFscmVhZHlTZWxlY3RlZExpc3QpIHsKLQotCQl0aGlzLmV4aXN0aW5nRWxlbWVudHMgPSBhbHJlYWR5U2VsZWN0ZWRMaXN0OwotCi0JfQotCi0JcHVibGljIGJvb2xlYW4gbWF0Y2hQYXR0ZXJuKE9iamVjdCBvYmopIHsKLQkJcmV0dXJuIG1hdGNoKG9iaik7Ci0JfQotCi0JLyoKLQkgKiBDb252ZW5pZW50IG1ldGhvZCB0byBjaGVjayBhbnkgQ2F0ZWdvcml6ZWRFbGVtZW50cyAodHJlZSB0cmF2ZXJzYWwpIG9mCi0JICogQ3VzdG9tQ2F0ZWdvcnkgaGFzIGFueSBtYXRjaCB3aXRoIG1hdGNoZXIuIEBwYXJhbSBDdXN0b21DYXRlZ29yeQotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBoYXNNYXRjaGVkQ2hpbGRDdXN0b21DYXRlZ29yeShDdXN0b21DYXRlZ29yeSB0b3BDYXRlZ29yeSkgewotCQlMaXN0IGxpc3QgPSB0b3BDYXRlZ29yeS5nZXRDYXRlZ29yaXplZEVsZW1lbnRzKCk7Ci0KLQkJZm9yIChJdGVyYXRvciBpdGVyID0gbGlzdC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBvYmplY3QgPSBpdGVyLm5leHQoKTsKLQkJCWlmIChvYmplY3QgaW5zdGFuY2VvZiBDdXN0b21DYXRlZ29yeSkgewotCQkJCUN1c3RvbUNhdGVnb3J5IGNhdGVnb3J5ID0gKEN1c3RvbUNhdGVnb3J5KSBvYmplY3Q7Ci0JCQkJaWYgKG1hdGNoZXIoY2F0ZWdvcnkpKSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0gZWxzZSBpZiAoaGFzTWF0Y2hlZENoaWxkQ3VzdG9tQ2F0ZWdvcnkoY2F0ZWdvcnkpKSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoKLQkgKiBDb252ZW5pZW50IG1ldGhvZCB0byBjaGVjayBhbnkgc3ViQXJ0aWZhY3RzICh0cmVlIHRyYXZlcnNhbCkgb2YgQXJ0aWZhY3QKLQkgKiBoYXMgYW55IG1hdGNoIHdpdGggbWF0Y2hlci4gQHBhcmFtIEN1c3RvbUNhdGVnb3J5Ci0JICovCi0JcHJpdmF0ZSBib29sZWFuIGhhc01hdGNoZWRBcnRpZmFjdChBcnRpZmFjdCBhcnRpZmFjdCkgewotCi0JCUxpc3QgbGlzdCA9IGFydGlmYWN0LmdldENvbnRhaW5lZEFydGlmYWN0cygpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBsaXN0Lml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IG9iamVjdCA9IGl0ZXIubmV4dCgpOwotCQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIEFydGlmYWN0KSB7Ci0JCQkJQXJ0aWZhY3Qgc3ViYXJ0aWZhY3QgPSAoQXJ0aWZhY3QpIG9iamVjdDsKLQkJCQlpZiAobWF0Y2hlcihzdWJhcnRpZmFjdCkpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfSBlbHNlIGlmIChoYXNNYXRjaGVkQXJ0aWZhY3Qoc3ViYXJ0aWZhY3QpKSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCS8qCi0JICogQ29udmVuaWVudCBtZXRob2QgdG8gY2hlY2sgYW55IHN1YkFydGlmYWN0cyAodHJlZSB0cmF2ZXJzYWwpIG9mIEFydGlmYWN0Ci0JICogaGFzIGFueSBtYXRjaCB3aXRoICBhbHJlYWR5ZXhpc3RpbmcgZWxlbWVudHMuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGhhc01hdGNoZWRBcnRpZmFjdChBcnRpZmFjdCBhcnRpZmFjdCwgTGlzdCBleGlzdGluZ0xpc3QpIHsKLQotCQlMaXN0IGxpc3QgPSBhcnRpZmFjdC5nZXRDb250YWluZWRBcnRpZmFjdHMoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gbGlzdC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBvYmplY3QgPSBpdGVyLm5leHQoKTsKLQkJCWlmIChvYmplY3QgaW5zdGFuY2VvZiBBcnRpZmFjdCkgewotCQkJCUFydGlmYWN0IHN1YmFydGlmYWN0ID0gKEFydGlmYWN0KSBvYmplY3Q7Ci0JCQkJaWYoIWV4aXN0aW5nTGlzdC5jb250YWlucyhzdWJhcnRpZmFjdCkpewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIENvbnZlbmllbnQgbWV0aG9kIHRvIGNoZWNrIGFueSBDaGlsZFBhY2thZ2VzICh0cmVlIHRyYXZlcnNhbCkgb2YgQ29udGVudAotCSAqIFBhY2thZ2UgaGFzIGFueSBtYXRjaCB3aXRoIG1hdGNoZXIuCi0JICogCi0JICogQHBhcmFtIEN1c3RvbUNhdGVnb3J5Ci0JICovCi0JcHJpdmF0ZSBib29sZWFuIGhhc01hdGNoZWRDaGlsZChDb250ZW50UGFja2FnZSBwa2cpIHsKLQotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBwa2cuZ2V0Q2hpbGRQYWNrYWdlcygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGNoaWxkUGtnID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAoY2hpbGRQa2cgaW5zdGFuY2VvZiBDb250ZW50UGFja2FnZSkgewotCQkJCUNvbnRlbnRQYWNrYWdlIGNvbnRlbnRQa2cgPSAoQ29udGVudFBhY2thZ2UpIGNoaWxkUGtnOwotCQkJCWlmIChtYXRjaGVyKGNvbnRlbnRQa2cpKSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0gZWxzZSBpZiAoaGFzTWF0Y2hlZENoaWxkKGNvbnRlbnRQa2cpKSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0KLQl9Ci0KLQkvKioKLQkgKiBDb252ZW5pZW50IG1ldGhvZCB0byBjaGVjayBhbnkgc3ViRG9tYWluICh0cmVlIHRyYXZlcnNhbCkgb2YgRG9tYWluIGhhcwotCSAqIGFueSBtYXRjaCB3aXRoIG1hdGNoZXIgPGxpbms+bWF0Y2hlcihPYmplY3Qgb2JqKTwvbGluaz4KLQkgKiAKLQkgKiBAcGFyYW0gQ3VzdG9tQ2F0ZWdvcnkKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaGFzTWF0Y2hlZFN1YkRvbWFpbnMoRG9tYWluIGRvbWFpbikgewotCQlMaXN0IGxpc3QgPSBkb21haW4uZ2V0U3ViZG9tYWlucygpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gbGlzdC5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3Qgc3ViZG9tYWluID0gaXRlcmF0b3IubmV4dCgpOwotCQkJaWYgKG1hdGNoZXIoc3ViZG9tYWluKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfSBlbHNlIGlmIChoYXNNYXRjaGVkU3ViRG9tYWlucygoRG9tYWluKSBzdWJkb21haW4pKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaGFzTWF0Y2hlZFN1YkRpc2NpcGxpbmUoRGlzY2lwbGluZSBkaXNjaXBsaW5lKXsKLQkJTGlzdCBsaXN0ID0gZGlzY2lwbGluZS5nZXRTdWJkaXNjaXBsaW5lKCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBsaXN0Lml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBzdWJkaXNjaXBsaW5lID0gaXRlcmF0b3IubmV4dCgpOwotCQkJaWYgKG1hdGNoZXIoc3ViZGlzY2lwbGluZSkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0gZWxzZSBpZiAoaGFzTWF0Y2hlZFN1YkRpc2NpcGxpbmUoKERpc2NpcGxpbmUpIHN1YmRpc2NpcGxpbmUpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaGFzTWF0Y2hlZERpc2NpcGxpbmVzKERpc2NpcGxpbmVHcm91cGluZyBncm91cGluZyl7Ci0JCUxpc3QgbGlzdCA9IGdyb3VwaW5nLmdldERpc2NpcGxpbmVzKCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBsaXN0Lml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBzdWJkaXNjaXBsaW5lID0gaXRlcmF0b3IubmV4dCgpOwotCQkJaWYgKG1hdGNoZXIoc3ViZGlzY2lwbGluZSkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0gZWxzZSBpZiAoaGFzTWF0Y2hlZFN1YkRpc2NpcGxpbmUoKERpc2NpcGxpbmUpIHN1YmRpc2NpcGxpbmUpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQkvKioKLQkgKiBDb252ZW5pZW50IG1ldGhvZCB0byBjaGVjayBhbnkgYWN0aXZpdHkgKHRyZWUgdHJhdmVyc2FsKSBvZiBhY3Rpdml0eSBoYXMKLQkgKiBhbnkgbWF0Y2ggd2l0aCBtYXRjaGVyIDxsaW5rPm1hdGNoZXIoT2JqZWN0IG9iaik8L2xpbms+Ci0JICogCi0JICogQHBhcmFtIEN1c3RvbUNhdGVnb3J5Ci0JICovCi0JcHJpdmF0ZSBib29sZWFuIGhhc01hdGNoZWRBY3Rpdml0aWVzKEFjdGl2aXR5IGFjdGl2aXR5KSB7Ci0JCUxpc3QgbGlzdCA9IGFjdGl2aXR5LmdldEJyZWFrZG93bkVsZW1lbnRzKCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBsaXN0Lml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gaXRlcmF0b3IubmV4dCgpOwotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCWlmIChtYXRjaGVyKGVsZW1lbnQpKSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0gZWxzZSBpZiAoaGFzTWF0Y2hlZEFjdGl2aXRpZXMoKEFjdGl2aXR5KSBlbGVtZW50KSkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIENvbnZlbmllbnQgbWV0aG9kIHRvIGNoZWNrIGFueSBhY3Rpdml0eSAodHJlZSB0cmF2ZXJzYWwpIG9mIFByb2Nlc3NQYWNrYWdlIGhhcwotCSAqIGFueSBtYXRjaCB3aXRoIG1hdGNoZXIgPGxpbms+bWF0Y2hlcihPYmplY3Qgb2JqKTwvbGluaz4KLQkgKiAKLQkgKiBAcGFyYW0gQ3VzdG9tQ2F0ZWdvcnkKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaGFzTWF0Y2hlZEFjdGl2aXRpZXMoUHJvY2Vzc1BhY2thZ2UgcHJvY1BhY2thZ2UpIHsKLQkJTGlzdCBsaXN0ID0gcHJvY1BhY2thZ2UuZ2V0UHJvY2Vzc0VsZW1lbnRzKCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBsaXN0Lml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gaXRlcmF0b3IubmV4dCgpOwotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCWlmIChtYXRjaGVyKGVsZW1lbnQpKSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0gZWxzZSBpZiAoaGFzTWF0Y2hlZEFjdGl2aXRpZXMoKEFjdGl2aXR5KSBlbGVtZW50KSkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJLy8gY2hlY2sgY2hpbGQgcGFja2FnZXMKLQkJbGlzdCA9IHByb2NQYWNrYWdlLmdldENoaWxkUGFja2FnZXMoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGxpc3QuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFByb2Nlc3NQYWNrYWdlKSB7Ci0JCQkJaWYgKGhhc01hdGNoZWRBY3Rpdml0aWVzKChQcm9jZXNzUGFja2FnZSkgZWxlbWVudCkpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RmlsdGVyVHlwZVN0cigpIHsKLQotCQkvLyBUcmltICItIihoeXBoZW4pIGZyb20gdGhlIHN0cmluZ3MgKHR5cGVzKS4gIE9ubHkgaW4gY2FzZSBtZXRob2RwbHVnaW4KLQkJLy8gZG9uJ3QgdHJpbSAiLSIgYmVjYXVzZSBtZXRob2RwbHVnLWluIGNvbnRhaW4gIi0iIChoeXBoZW4pYW5kIHVzZWZ1bC4KLQkJd2hpbGUgKHR5cGUgIT0gbnVsbCAmJiB0eXBlLmluZGV4T2YoRmlsdGVyQ29uc3RhbnRzLnNwYWNlKSA+IC0xCi0JCQkJJiYgIXR5cGUuZXF1YWxzKEZpbHRlckNvbnN0YW50cy5NRVRIT19QTFVHSU5TKSkgewotCQkJdHlwZSA9IHR5cGUuc3Vic3RyaW5nKHR5cGUuaW5kZXhPZihGaWx0ZXJDb25zdGFudHMuc3BhY2UpICsgMSwgdHlwZQotCQkJCQkubGVuZ3RoKCkpOwotCQl9Ci0JCXJldHVybiB0eXBlOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0UGF0dGVybigpIHsKLQotCQlyZXR1cm4gcGF0dGVybjsKLQotCX0KLQotCXB1YmxpYyBQYXR0ZXJuIGdldFJlZ2V4UGF0dGVybigpIHsKLQotCQlyZXR1cm4gcmVnZXg7Ci0KLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFRhYlN0cigpIHsKLQotCQlyZXR1cm4gdGFiU3RyOwotCi0JfQotCi0JLyoKLQkgKiAKLQkgKiBNZXRob2QgY2hlY2tzIHdoZXRoZXIgYXJiaXRyYXJ5IG9iamVjdCBwYXNzZWQgaXMKLQkgKiAKLQkgKiBlcXVhbCB0byBjdXJyZW50IGNvbnRlbnQgZWxlbWVudCdzIHZhcmlhYmlsaXR5IG9yIG5vdC4KLQkgKiAKLQkgKiBJZiB2YXJpYWJpbGl0eSBvZiBDb250ZW50RWxlbWVudCBtYXRjaGVzIGFyYml0cmFyeSBvYmplY3QsCi0JICogCi0JICogcmV0dXJucyB0cnVlLgotCSAqIAotCSAqIEByZXR1biBib29sZWFuLgotCSAqIAotCSAqLwotCi0JcHVibGljIGJvb2xlYW4gY2hlY2tWYXJpYWJpbGl0eShPYmplY3Qgb2JqKSB7Ci0JCWlmIChjb250ZW50RWxlbWVudCBpbnN0YW5jZW9mIENvbnRlbnRFbGVtZW50KSB7Ci0KLQkJCU9iamVjdCB2YXJpYWJpbGl0eU9iamVjdCA9ICgoQ29udGVudEVsZW1lbnQpIGNvbnRlbnRFbGVtZW50KQotCQkJCQkuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpOwotCQkJaWYgKHZhcmlhYmlsaXR5T2JqZWN0ICE9IG51bGwpIHsKLQkJCQlpZiAob2JqLmVxdWFscyh2YXJpYWJpbGl0eU9iamVjdCkpCi0JCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldENvbnRlbnRFbGVtZW50KCkgewotCi0JCXJldHVybiBjb250ZW50RWxlbWVudDsKLQotCX0KLQotCXB1YmxpYyB2b2lkIHNldENvbnRlbnRFbGVtZW50KE9iamVjdCBjb250ZW50RWxlbWVudCkgewotCi0JCXRoaXMuY29udGVudEVsZW1lbnQgPSBjb250ZW50RWxlbWVudDsKLQotCX0KLQotCXB1YmxpYyB2b2lkIHNldEZpbHRlclR5cGVTdHIoU3RyaW5nIGZpbHRlclR5cGVTdHIpIHsKLQotCQl0aGlzLnR5cGUgPSBmaWx0ZXJUeXBlU3RyOwotCi0JfQotCi0JcHVibGljIHZvaWQgc2V0UGF0dGVybihTdHJpbmcgcGF0dGVybikgewotCi0JCXRoaXMucGF0dGVybiA9IHBhdHRlcm47Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRSZWdleFBhdHRlcm4oUGF0dGVybiByZWdleFBhdHRlcm4pIHsKLQotCQl0aGlzLnJlZ2V4ID0gcmVnZXhQYXR0ZXJuOwotCi0JfQotCi0JcHVibGljIHZvaWQgc2V0VGFiU3RyKFN0cmluZyB0YWJTdHIpIHsKLQotCQl0aGlzLnRhYlN0ciA9IHRhYlN0cjsKLQotCX0KLQotCXB1YmxpYyBTdHJpbmdbXSBnZXRQYXRoQmFzZWRPblRhYlN0cmluZyhTdHJpbmcgdGFiU3RyKSB7Ci0KLQkJaWYgKEZpbHRlckNvbnN0YW50cy5jb250ZW50RWxlbWVudFN0cnMuY29udGFpbnModGFiU3RyKSkgewotCQkJcmV0dXJuIE1vZGVsU3RydWN0dXJlLkRFRkFVTFQuY29yZUNvbnRlbnRQYXRoOwotCQl9IGVsc2UgaWYgKHRhYlN0ci5lcXVhbHMoRmlsdGVyQ29uc3RhbnRzLlJPTEVTRVRTKQotCQkJCXx8IHRhYlN0ci5lcXVhbHMoRmlsdGVyQ29uc3RhbnRzLlJPTEVfU0VUX0dST1VQSU5HUykpIHsKLQkJCXJldHVybiBNb2RlbFN0cnVjdHVyZS5ERUZBVUxULnJvbGVTZXRQYXRoOwotCQl9IGVsc2UgaWYgKHRhYlN0ci5lcXVhbHMoRmlsdGVyQ29uc3RhbnRzLkRJU0NJUExJTkVTKQotCQkJCXx8IHRhYlN0ci5lcXVhbHMoRmlsdGVyQ29uc3RhbnRzLkRJU0NJUExJTkVfR1JPVVBJTkdTKSkgewotCQkJcmV0dXJuIE1vZGVsU3RydWN0dXJlLkRFRkFVTFQuZGlzY2lwbGluZURlZmluaXRpb25QYXRoOwotCQl9IGVsc2UgaWYgKHRhYlN0ci5lcXVhbHMoRmlsdGVyQ29uc3RhbnRzLlRPT0xTKSkgewotCQkJcmV0dXJuIE1vZGVsU3RydWN0dXJlLkRFRkFVTFQudG9vbFBhdGg7Ci0JCX0gZWxzZSBpZiAodGFiU3RyLmVxdWFscyhGaWx0ZXJDb25zdGFudHMuV09SS1BST0RVQ1RUWVBFUykpIHsKLQkJCXJldHVybiBNb2RlbFN0cnVjdHVyZS5ERUZBVUxULndvcmtQcm9kdWN0VHlwZVBhdGg7Ci0JCX0gZWxzZSBpZiAodGFiU3RyLmVxdWFscyhGaWx0ZXJDb25zdGFudHMuRE9NQUlOUykpIHsKLQkJCXJldHVybiBNb2RlbFN0cnVjdHVyZS5ERUZBVUxULmRvbWFpblBhdGg7Ci0JCX0gZWxzZSBpZiAodGFiU3RyLmVxdWFscyhGaWx0ZXJDb25zdGFudHMuQ1VTVE9NX0NBVEVHT1JJRVMpKSB7Ci0JCQlyZXR1cm4gTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC5jdXN0b21DYXRlZ29yeVBhdGg7Ci0JCX0gZWxzZQotCQkJcmV0dXJuIE1vZGVsU3RydWN0dXJlLkRFRkFVTFQuY29yZUNvbnRlbnRQYXRoOwotCi0JfQotCi0JLyoqCi0JICogCi0JICogVGhpcyBpcyBjb252ZW5pZW50IG1ldGhvZCB0byBjaGVjayBhbGwgdGhlIGNvbmRpdGlvbiwgbGlrZSBtYXRjaFBhdHRlcm4sCi0JICogaWYgb2JqZWN0IGV4aXN0cyBpbiBhbHJlYWR5IHNlbGVjdGVkIGxpc3QsIGNoZWNrIHZhcmlhYmlsaXR5IG1hdGNoLCBhbmQKLQkgKiBpcyBvYmplY3QgaXRzZWxmIGRvbm90IGRpc3BsYXkuCi0JICogCi0JICogQHBhcmFtIG9iamVjdAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCi0JcHVibGljIGJvb2xlYW4gY2hlY2tPYmplY3RBY2NlcHRlZChPYmplY3Qgb2JqKSB7Ci0KLQkJaWYgKCFtYXRjaChvYmopKQotCQkJcmV0dXJuIGZhbHNlOwotCQkvLyBDaGVjayBpZiBhbHJlYWR5IGV4aXN0aW5nIChhc3NvY2lhdGVkIGVsZW1lbnRzKSBkb24ndCBkaXNwbGF5LgotCQlpZiAoZ2V0QWxyZWFkeVNlbGVjdGVkTGlzdCgpICE9IG51bGwKLQkJCQkmJiBnZXRBbHJlYWR5U2VsZWN0ZWRMaXN0KCkuY29udGFpbnMob2JqKSl7Ci0JCQkvLyBzcGVjaWFsIGNhc2UgaGFuZGxpbmcgZm9yIEFydGlmYWN0IGFuZCBzdWItYXJ0aWZhY3QuCi0JCQlpZihvYmogaW5zdGFuY2VvZiBBcnRpZmFjdCl7Ci0JCQkJaWYoIWhhc01hdGNoZWRBcnRpZmFjdCgoQXJ0aWZhY3Qpb2JqLGdldEFscmVhZHlTZWxlY3RlZExpc3QoKSkpCi0JCQkJCXJldHVybiBmYWxzZTsKLQkJCX1lbHNlewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCi0JCWlmIChjaGVja1ZhcmlhYmlsaXR5KG9iaikpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJLy8gaWYgb2JqZWN0IGl0c2VsZiBkb24ndCBkaXNwbGF5Ci0JCS8vIERvIGVxdWFsIGNoZWNrIG9ubHkgb24gZWxlbWVudHMgb3RoZXJ0aGFuIG1ldGhvZCBwbHVnaW4sIEluIGNhc2Ugb2YKLQkJLy8gQ29weXJpZ2h0KHN1cHBvcnRpbmcgbWF0ZXJpYWwpIGFzc29jaWF0aW5nIHRvIG1ldGhvZHBsdWdpbiwgaWYKLQkJLy8gbWV0aG9kcGx1Z2luIChjb250ZW50RWxlbXRuKSBlcXVhbHMKLQkJLy8gb2JqLCB0aGVuIHJlc3VsdHMgZmFsc2UuUGx1Z2luIHdpbGwgbG9zdCBmcm9tIHRyZWUgaW4gdGhlIGZpbHRlci4gSW4KLQkJLy8gdHVybiBzdXBwb3J0aW5nIG1hdGVyaWFsIGZvciB0aGF0IHBhcnRpY3VsYXIgcGx1Z2luIHdpbGwgbm90IGJlCi0JCS8vIGRpc3BsYXllZC4KLQkJaWYgKCEob2JqIGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luKSkgewotCQkJaWYgKGNvbnRlbnRFbGVtZW50ICE9IG51bGwgJiYgb2JqLmVxdWFscyhjb250ZW50RWxlbWVudCkpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCi0JfQotCi0JLyoqCi0JICogCi0JICogQ29udmVuaWVudCBtZXRob2QgZm9yIGNoZWNraW5nIE1ldGhvZFBsdWdpbiBhY2NlcHRlZCBvciBub3QuIE1ldGhvZCBuZWVkcwotCSAqIHRvIGludm9rZWQgb25seSBmb3IgTWV0aG9kUGx1Z2luIG9iamVjdC4KLQkgKiAKLQkgKiBAcGFyYW0gb2JqZWN0Ci0JICogQHJldHVybiBib29sZWFuCi0JICovCi0KLQlwdWJsaWMgYm9vbGVhbiBhY2NlcHRNZXRob2RQbHVnaW4oT2JqZWN0IG9iaikgewotCQlpZiAoY29udGVudEVsZW1lbnQgIT0gbnVsbCkgewotCQkJaWYgKE1ldGhvZEVsZW1lbnRVdGlsLmdldEFsbE1vZGVscyhjb250ZW50RWxlbWVudCkuY29udGFpbnMob2JqKSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCWVsc2UKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENvbnZlbmllbnQgbWV0aG9kIGZvciBjaGVja2luZyBDb250ZW50IFBhY2thZ2UgYWNjZXB0ZWQgb3Igbm90LiBNZXRob2QKLQkgKiBuZWVkcyB0byBpbnZva2VkIG9ubHkgZm9yIENvbnRlbnQgUGFja2FnZSBvYmplY3QuCi0JICogCi0JICogQHBhcmFtIG9iamVjdAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGFjY2VwdENvbnRlbnRQYWNrYWdlKE9iamVjdCBvYmopIHsKLQotCQlpZiAoKChDb250ZW50UGFja2FnZSkgb2JqKS5nZXRDaGlsZFBhY2thZ2VzKCkuaXNFbXB0eSgpCi0JCQkJJiYgKChDb250ZW50UGFja2FnZSkgb2JqKS5nZXRDb250ZW50RWxlbWVudHMoKS5pc0VtcHR5KCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWVsc2UKLQkJCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzT2JqZWN0SW5TZWxlY3RlZEl0ZW1zKE9iamVjdCBvYmopIHsKLQotCQlpZiAoZ2V0QWxyZWFkeVNlbGVjdGVkTGlzdCgpICE9IG51bGwKLQkJCQkmJiBnZXRBbHJlYWR5U2VsZWN0ZWRMaXN0KCkuY29udGFpbnMob2JqKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJZWxzZQotCQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNDb250cmlidXRvcihDb250ZW50RWxlbWVudCBlbGVtZW50KSB7Ci0JCS8vIEp1c3QgcmV0dXJuaW5nIHRydWUsIGJlY2F1c2UgY29udHJpYnV0aW9uIGNoZWNrZWQgaW4gb3RoZXIgcGxhY2UuCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBtYXRjaFBhdHRlcm5CYXNlZE9uVHlwZShPYmplY3Qgb2JqKSB7Ci0JCXJldHVybiBtYXRjaChvYmopOwotCX0KLQotCXB1YmxpYyBib29sZWFuIG1hdGNoUGF0dGVybk9uUHJlc2VudGF0aW9uTmFtZShPYmplY3Qgb2JqKSB7Ci0JCXJldHVybiBtYXRjaChvYmopOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzU2hvd1ByZXNlbnRhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBzaG93UHJlc2VudGF0aW9uTmFtZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTaG93UHJlc2VudGF0aW9uTmFtZShib29sZWFuIHNob3dQcmVzZW50YXRpb25OYW1lKSB7Ci0JCXRoaXMuc2hvd1ByZXNlbnRhdGlvbk5hbWUgPSBzaG93UHJlc2VudGF0aW9uTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBHZW5lcmljIG1ldGhvZCB0byBjaGVjayBtYXRjaCBvZiBhbiBvYmplY3QgYmFzZWQgb24gcmVndWxhciBleHByZXNzaW9uCi0JICogYWxzbyBiYXNlZCBvbiB0eXBlIHRoYXQgc2VsZWN0ZWQgaW4gdGhlIGRpYWxvZy4KLQkgKi8KLQotCXByaXZhdGUgYm9vbGVhbiBtYXRjaChPYmplY3Qgb2JqKSB7Ci0KLQkJLy8gRG8gbm90IGRvIFBhdHRlcm4gbWF0Y2ggaWYgdHlwZSBvciBwYXR0ZXJuIHN0cmluZyBpcyBudWxsLgotCQlpZiAodHlwZSA9PSBudWxsIHx8IHBhdHRlcm4gPT0gbnVsbCB8fCBwYXR0ZXJuLmVxdWFsc0lnbm9yZUNhc2UoIiIpKSAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gdHJ1ZTsKLQotCQkvLyBDaGVjayBpZiB0eXBlIGlzIG9mIENvbnRlbnQgUGFja2FnZQotCQlpZiAodHlwZS5lcXVhbHMoRmlsdGVyQ29uc3RhbnRzLkNPTlRFTlRfUEFDS0FHRVMpKSB7Ci0KLQkJCWlmIChvYmogaW5zdGFuY2VvZiBDb250ZW50UGFja2FnZSkgewotCi0JCQkJaWYgKG1hdGNoZXIob2JqKSB8fCBoYXNNYXRjaGVkQ2hpbGQoKENvbnRlbnRQYWNrYWdlKSBvYmopKSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0KLQkJCX0gZWxzZSB7Ci0KLQkJCQkvLyBlbHNlIGZvciBhbGwgY29udGVudCBlbGVtZW50cywgaWYgdGhlaXIgY29udGVudCBwYWtjYWdlCi0JCQkJLy8gbWF0Y2hlcyAsIHJldHVybiB0cnVlLgotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBDb250ZW50RWxlbWVudCkgewotCQkJCQlPYmplY3QgY29udGFpbmVyID0gKChDb250ZW50RWxlbWVudCkgb2JqKS5nZXRDb250YWluZXIoKTsKLQkJCQkJaWYgKGNvbnRhaW5lciBpbnN0YW5jZW9mIENvbnRlbnRQYWNrYWdlKSB7Ci0JCQkJCQlpZiAoIW1hdGNoZXIoY29udGFpbmVyKSkKLQkJCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0KLQkJfSBlbHNlIGlmICh0eXBlLmVxdWFscyhGaWx0ZXJDb25zdGFudHMuTUVUSE9fUExVR0lOUykpIHsKLQkJCS8vIENoZWNrIGlmIHR5cGUgaXMgb2YgTWV0aG9kIFBsdWdpbnMKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pIHsKLQkJCQkvLyBpZiBpcyBhIE1ldGhvZFBsdWdpbiwgcmV0dXJuIHRydWUgaWYgbWF0Y2hlcyB0aGUgcGF0dGVybgotCQkJCXJldHVybiBtYXRjaGVyKG9iaik7Ci0KLQkJCX0gZWxzZSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0KLQkJfSBlbHNlIGlmICh0eXBlLmVxdWFscyhGaWx0ZXJDb25zdGFudHMuQUNUSVZJVElFUykpIHsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCWlmIChtYXRjaGVyKG9iaikpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJcmV0dXJuIGhhc01hdGNoZWRBY3Rpdml0aWVzKChBY3Rpdml0eSlvYmopOwotCQkJCX0KLQkJCX0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgUHJvY2Vzc1BhY2thZ2UpIHsKLQkJCQlyZXR1cm4gaGFzTWF0Y2hlZEFjdGl2aXRpZXMoKFByb2Nlc3NQYWNrYWdlKW9iaik7Ci0JCQl9IGVsc2UgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9IGVsc2UgaWYgKHR5cGUgIT0gbnVsbCkgewotCi0JCQlpZiAob2JqIGluc3RhbmNlb2YgQ29udGVudEVsZW1lbnQKLQkJCQkJfHwgb2JqIGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudAotCQkJCQl8fCBvYmogaW5zdGFuY2VvZiBQcm9jZXNzKSB7Ci0KLQkJCQlpZiAodHlwZS5pbmRleE9mKEZpbHRlckNvbnN0YW50cy5zcGFjZSkgPiAtMSkgewotCQkJCQl0eXBlID0gdHlwZS5zdWJzdHJpbmcodHlwZS5pbmRleE9mKEZpbHRlckNvbnN0YW50cy5zcGFjZSksIHR5cGUubGVuZ3RoKCkpOwotCQkJCX0KLQotCQkJCUNsYXNzIGNscyA9IEZpbHRlckluaXRpYWxpemVyLmdldEluc3RhbmNlKCkuZ2V0Q2xhc3NGb3JUeXBlKAotCQkJCQkJdHlwZSk7Ci0JCQkJaWYgKGNscyAhPSBudWxsICYmICFjbHMuaXNJbnN0YW5jZShvYmopKSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQotCQkJCWlmIChtYXRjaGVyKG9iaikpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfSBlbHNlIHsKLQotCQkJCQlpZiAob2JqIGluc3RhbmNlb2YgQ3VzdG9tQ2F0ZWdvcnkpCi0JCQkJCQlyZXR1cm4gaGFzTWF0Y2hlZENoaWxkQ3VzdG9tQ2F0ZWdvcnkoKEN1c3RvbUNhdGVnb3J5KSBvYmopOwotCi0JCQkJCWlmIChvYmogaW5zdGFuY2VvZiBBcnRpZmFjdCkgewotCQkJCQkJcmV0dXJuIGhhc01hdGNoZWRBcnRpZmFjdCgoQXJ0aWZhY3QpIG9iaik7Ci0JCQkJCX0KLQkJCQkJaWYgKG9iaiBpbnN0YW5jZW9mIERvbWFpbikgewotCQkJCQkJcmV0dXJuIGhhc01hdGNoZWRTdWJEb21haW5zKChEb21haW4pIG9iaik7Ci0JCQkJCX0KLQkJCQkJaWYgKG9iaiBpbnN0YW5jZW9mIERpc2NpcGxpbmUpewotCQkJCQkJcmV0dXJuIGhhc01hdGNoZWRTdWJEaXNjaXBsaW5lKChEaXNjaXBsaW5lKW9iaik7Ci0JCQkJCX0KLQkJCQkJaWYgKG9iaiBpbnN0YW5jZW9mIERpc2NpcGxpbmVHcm91cGluZyl7Ci0JCQkJCQlyZXR1cm4gaGFzTWF0Y2hlZERpc2NpcGxpbmVzKChEaXNjaXBsaW5lR3JvdXBpbmcpb2JqKTsKLQkJCQkJfQotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJfSBlbHNlIHsgLy8gZWxzZSBmb3IgYWxsIG90aGVyIHR5cGVzIG9mIGVsZW1lbnRzCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0KLQkJfSBlbHNlCi0JCQkvLyB0aGUgQWxsIGNhc2UKLQkJCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIENvbnZlbmllbnQgbWV0aG9kIHdoaWNoIGRvZXMgYWN0dWFsIG1hdGNoaW5nIG9mIGdpdmVuIG9iamVjdCB3aXRoIHJlZ3VsYXIKLQkgKiBleHByZXNzaW9uLiBDaGVja3MgdG8gZG8gcHJlc2VudGF0aW9ubmFtZSBvciBuYW1lLgotCSAqLwotCXB1YmxpYyBib29sZWFuIG1hdGNoZXIoT2JqZWN0IG9iaikgewotCQlpZihyZWdleCAhPSBudWxsKXsKLQkJCU1hdGNoZXIgbSA9IHJlZ2V4Lm1hdGNoZXIoKChNZXRob2RFbGVtZW50KSBvYmopLmdldE5hbWUoKSk7Ci0JCQlpZiAoc2hvd1ByZXNlbnRhdGlvbk5hbWUpIHsKLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgRGVzY3JpYmFibGVFbGVtZW50Ci0JCQkJCQkmJiAoKERlc2NyaWJhYmxlRWxlbWVudCkgb2JqKS5nZXRQcmVzZW50YXRpb25OYW1lKCkgIT0gbnVsbCkKLQkJCQkJbSA9IHJlZ2V4Lm1hdGNoZXIoKChEZXNjcmliYWJsZUVsZW1lbnQpIG9iaikKLQkJCQkJCQkuZ2V0UHJlc2VudGF0aW9uTmFtZSgpKTsKLQkJCX0KLQkJCXJldHVybiBtLm1hdGNoZXMoKTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL0ZpbHRlckluaXRpYWxpemVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL0ZpbHRlckluaXRpYWxpemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkNmVlMTQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9GaWx0ZXJJbml0aWFsaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNoZWNrbGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbmNlcHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaXNjaXBsaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGlzY2lwbGluZUdyb3VwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRXhhbXBsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkd1aWRlbGluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByYWN0aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUmVwb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUmV1c2FibGVBc3NldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvYWRtYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVTZXRHcm91cGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlN1cHBvcnRpbmdNYXRlcmlhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZW1wbGF0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRlcm1EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVG9vbE1lbnRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldoaXRlcGFwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0VHlwZTsKLQotLyoqCi0gKiBBIGhlbHBlciBjbGFzcyBmb3Igc2V0dGluZyB1cCB0aGUgbmVjZXNzYXJ5IG1hcHMgdXNlZCBmb3IgZWxlbWVudCBmaWx0ZXJpbmcKLSAqIGluIHRoZSBtZXRob2QgZWxlbWVudCBzZWxlY3Rpb24gZGlhbG9ncy4KLSAqIAotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBGaWx0ZXJJbml0aWFsaXplciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBGaWx0ZXJJbml0aWFsaXplciBpbml0aWFsaXplcjsKLQotCXByaXZhdGUgc3RhdGljIE1hcCBtYXA7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBGaWx0ZXJJbml0aWFsaXplcigpIHsKLQkJc3VwZXIoKTsKLQkJbG9hZFR5cGVDbGFzcygpOwotCX0KLQotCS8qCi0JICogU2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgRmlsdGVySW5pdGlhbGl6ZXIgZ2V0SW5zdGFuY2UoKSB7Ci0JCWlmIChpbml0aWFsaXplciA9PSBudWxsKSB7Ci0JCQlzeW5jaHJvbml6ZWQgKEZpbHRlckluaXRpYWxpemVyLmNsYXNzKSB7Ci0JCQkJaWYgKGluaXRpYWxpemVyID09IG51bGwpIHsKLQkJCQkJaW5pdGlhbGl6ZXIgPSBuZXcgRmlsdGVySW5pdGlhbGl6ZXIoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGluaXRpYWxpemVyOwotCX0KLQotCS8qCi0JICogTG9hZCB0aGUgRmlsdGVyIFR5cGVzIGFuZCByZXNwZWN0aXZlIGNsYXNzZXMuIFRoaXMgbmVlZCBpbiBjYXNlIG9mIGkxMThuIC0KLQkgKiBDb25zdGFudHMgdmFsdWVzIGFyZSBkaWZmZXJlbnQuCi0JICogCi0JICovCi0JcHJpdmF0ZSB2b2lkIGxvYWRUeXBlQ2xhc3MoKSB7Ci0JCW1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCW1hcC5wdXQoRmlsdGVyQ29uc3RhbnRzLldPUktQUk9EVUNUVFlQRVMsIFdvcmtQcm9kdWN0VHlwZS5jbGFzcyk7Ci0JCW1hcC5wdXQoRmlsdGVyQ29uc3RhbnRzLkRPTUFJTlMsIERvbWFpbi5jbGFzcyk7Ci0JCW1hcC5wdXQoRmlsdGVyQ29uc3RhbnRzLldPUktQUk9EVUNUUywgV29ya1Byb2R1Y3QuY2xhc3MpOwotCQltYXAucHV0KEZpbHRlckNvbnN0YW50cy5XT1JLUFJPRFVDVFRZUEVTLCBXb3JrUHJvZHVjdFR5cGUuY2xhc3MpOwotCQltYXAucHV0KEZpbHRlckNvbnN0YW50cy5ET01BSU5TLCBEb21haW4uY2xhc3MpOwotCQltYXAucHV0KEZpbHRlckNvbnN0YW50cy5XT1JLUFJPRFVDVFMsIFdvcmtQcm9kdWN0LmNsYXNzKTsKLQkJbWFwLnB1dChGaWx0ZXJDb25zdGFudHMuRElTQ0lQTElORV9HUk9VUElOR1MsIERpc2NpcGxpbmVHcm91cGluZy5jbGFzcyk7Ci0JCW1hcC5wdXQoRmlsdGVyQ29uc3RhbnRzLkRJU0NJUExJTkVTLCBEaXNjaXBsaW5lLmNsYXNzKTsKLQkJbWFwLnB1dChGaWx0ZXJDb25zdGFudHMuVEFTS1MsIFRhc2suY2xhc3MpOwotCQltYXAucHV0KEZpbHRlckNvbnN0YW50cy5ST0xFX1NFVF9HUk9VUElOR1MsIFJvbGVTZXRHcm91cGluZy5jbGFzcyk7Ci0JCW1hcC5wdXQoRmlsdGVyQ29uc3RhbnRzLlJPTEVTRVRTLCBSb2xlU2V0LmNsYXNzKTsKLQkJbWFwLnB1dChGaWx0ZXJDb25zdGFudHMuUk9MRVMsIFJvbGUuY2xhc3MpOwotCQltYXAucHV0KEZpbHRlckNvbnN0YW50cy5DSEVDS0xJU1RTLCBDaGVja2xpc3QuY2xhc3MpOwotCQltYXAucHV0KEZpbHRlckNvbnN0YW50cy5DT05DRVBUUywgQ29uY2VwdC5jbGFzcyk7Ci0JCW1hcC5wdXQoRmlsdGVyQ29uc3RhbnRzLkVTVElNQVRFX0NPTlNJREVSQVRJT05TLAotCQkJCUVzdGltYXRpb25Db25zaWRlcmF0aW9ucy5jbGFzcyk7Ci0JCW1hcC5wdXQoRmlsdGVyQ29uc3RhbnRzLkVYQU1QTEVTLCBFeGFtcGxlLmNsYXNzKTsKLQkJbWFwLnB1dChGaWx0ZXJDb25zdGFudHMuR1VJREVMSU5FUywgR3VpZGVsaW5lLmNsYXNzKTsKLQkJbWFwLnB1dChGaWx0ZXJDb25zdGFudHMuUFJBQ1RJQ0VTLCBQcmFjdGljZS5jbGFzcyk7Ci0JCW1hcC5wdXQoRmlsdGVyQ29uc3RhbnRzLlJFUE9SVFMsIFJlcG9ydC5jbGFzcyk7Ci0JCW1hcC5wdXQoRmlsdGVyQ29uc3RhbnRzLlJFVVNBQkxFX0FTU0VUUywgUmV1c2FibGVBc3NldC5jbGFzcyk7Ci0JCW1hcC5wdXQoRmlsdGVyQ29uc3RhbnRzLlJPQURNQVAsIFJvYWRtYXAuY2xhc3MpOwotCQltYXAucHV0KEZpbHRlckNvbnN0YW50cy5TVVBQT1JUSU5HX01BVEVSSUFMUywgU3VwcG9ydGluZ01hdGVyaWFsLmNsYXNzKTsKLQkJbWFwLnB1dChGaWx0ZXJDb25zdGFudHMuVEVNUExBVEVTLCBUZW1wbGF0ZS5jbGFzcyk7Ci0JCW1hcC5wdXQoRmlsdGVyQ29uc3RhbnRzLlRFUk1fREVGSU5JVElPTlMsIFRlcm1EZWZpbml0aW9uLmNsYXNzKTsKLQkJbWFwLnB1dChGaWx0ZXJDb25zdGFudHMuVE9PTF9NRU5UT1JTLCBUb29sTWVudG9yLmNsYXNzKTsKLQkJbWFwLnB1dChGaWx0ZXJDb25zdGFudHMuV0hJVEVfUEFQRVJTLCBXaGl0ZXBhcGVyLmNsYXNzKTsKLQkJLy8gbWFwLnB1dChGaWx0ZXJDb25zdGFudHMuR1VJREFOQ0UsIEd1aWRhbmNlLmNsYXNzKTsKLQl9Ci0KLQkvKgotCSAqIFJldHVybnMgdGhlIENsYXNzIGZvciBhIHR5cGUgZnJvbSB0aGUgbWFwLgotCSAqLwotCXB1YmxpYyBDbGFzcyBnZXRDbGFzc0ZvclR5cGUoU3RyaW5nIHR5cGUpIHsKLQkJT2JqZWN0IG9iaiA9IG1hcC5nZXQodHlwZSk7Ci0JCXJldHVybiAoQ2xhc3MpIG9iajsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL0ZpbHRlclV0aWwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaXRlbXNmaWx0ZXIvRmlsdGVyVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDc2MGM1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaXRlbXNmaWx0ZXIvRmlsdGVyVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vKioKLSAqIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5XcmFwcGVySXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5BY3Rpdml0eVdyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQ7Ci0KLS8qKgotICogQSB1dGlsaXR5IGNsYXNzIGZvciBtYW5hZ2luZyBlbGVtZW50IGZpbHRlcmluZyBpbiB0aGUgbWV0aG9kIGVsZW1lbnQgc2VsZWN0aW9uCi0gKiBkaWFsb2dzLgotICogCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEZpbHRlclV0aWwgewotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBpdGVyYXRlQ29sbGVjdGlvbihDb2xsZWN0aW9uIGNoaWxkcmVuLCBJRmlsdGVyIGZpbHRlcikgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gY2hpbGRyZW4uaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGNoaWxkID0gaXRlcmF0b3IubmV4dCgpOwotCQkJaWYgKCFmaWx0ZXIuYWNjZXB0KGNoaWxkKSkKLQkJCQlpdGVyYXRvci5yZW1vdmUoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIE1ldGhvZCBmb3IgY29sbGVjdGluZyB0aGUgcGFyZW50cyBjaGFpbiAodXB3YXJkKSBvZiBhbiBicmVha2Rvd25lbGVtZW50LgotCSAqIAotCSAqIEBwYXJhbSBBZGFwdGVyRmFjdG9yeQotCSAqIEBwYXJhbSBCcmVha2Rvd25FbGVtZW50Ci0JICogQHBhcmFtIExpc3QKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgZ2V0UGFyZW50c0luU2NvcGUoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksCi0JCQlCcmVha2Rvd25FbGVtZW50IGVsZW1lbnQsIGphdmEudXRpbC5MaXN0IGFjdGl2aXR5TGlzdCkgewotCQlJdGVtUHJvdmlkZXJBZGFwdGVyIGFkYXB0ZXIgPSAoSXRlbVByb3ZpZGVyQWRhcHRlcikgYWRhcHRlckZhY3RvcnkKLQkJCQkuYWRhcHQoZWxlbWVudCwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJT2JqZWN0IHBhcmVudCA9IGFkYXB0ZXIuZ2V0UGFyZW50KGVsZW1lbnQpOwotCQlpZiAocGFyZW50IGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCWFjdGl2aXR5TGlzdC5hZGQocGFyZW50KTsKLQkJCWdldFBhcmVudHNJblNjb3BlKGFkYXB0ZXJGYWN0b3J5LCAoQnJlYWtkb3duRWxlbWVudCkgcGFyZW50LAotCQkJCQlhY3Rpdml0eUxpc3QpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogR2V0IGFsbCBjaGlsZHJlbiBvZiB0aGUgYWN0aXZpdHkgcmVjdXJzaXZlbHkgZG93bndhcmRzLgotCSAqIAotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiBAcGFyYW0gYWN0aXZpdHlMaXN0Ci0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGdldENoaWxkQWN0aXZpdGllc0luU2NvcGUoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksCi0JCQlBY3Rpdml0eSBwYXJlbnQsIExpc3QgYWN0aXZpdHlMaXN0KSB7Ci0JCUl0ZW1Qcm92aWRlckFkYXB0ZXIgYWRhcHRlciA9IChJdGVtUHJvdmlkZXJBZGFwdGVyKSBhZGFwdGVyRmFjdG9yeQotCQkJCS5hZGFwdChwYXJlbnQsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0KLQkJT2JqZWN0IG8gPSBhZGFwdGVyLmdldENoaWxkcmVuKHBhcmVudCk7Ci0JCWlmIChvIGluc3RhbmNlb2YgTGlzdCkgewotCQkJTGlzdCBjaGlsZHJlbiA9IChMaXN0KSBvOwotCQkJZm9yIChJdGVyYXRvciBpdG9yID0gY2hpbGRyZW4uaXRlcmF0b3IoKTsgaXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IG9iaiA9IGl0b3IubmV4dCgpOwotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCQlhY3Rpdml0eUxpc3QuYWRkKG9iaik7Ci0JCQkJCWdldENoaWxkQWN0aXZpdGllc0luU2NvcGUoYWRhcHRlckZhY3RvcnksIChBY3Rpdml0eSkgb2JqLAotCQkJCQkJCWFjdGl2aXR5TGlzdCk7Ci0JCQkJfQotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBBY3Rpdml0eVdyYXBwZXJJdGVtUHJvdmlkZXIpIHsKLQkJCQkJT2JqZWN0IG8xID0gKChXcmFwcGVySXRlbVByb3ZpZGVyKSBvYmopLmdldFZhbHVlKCk7Ci0JCQkJCWFjdGl2aXR5TGlzdC5hZGQobzEpOwotCQkJCQlnZXRDaGlsZEFjdGl2aXRpZXNJblNjb3BlKGFkYXB0ZXJGYWN0b3J5LCAoQWN0aXZpdHkpIG8xLAotCQkJCQkJCWFjdGl2aXR5TGlzdCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQ29udmVuaWVudCBtZXRob2QgZm9yIHJldHJpdmluZyBhbGwgdGhlIGNvbnRyaWJ1dG9ycyBvZgotCSAqIHZhcmlhYmlsaXR5ZWxlbWVudCBpbiBhIGxpc3QuCi0JICogCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGdldENvbnRyaWJ1dG9ycyhMaXN0IGxpc3QsIExpc3QgZ2VuZXJhbGl6ZXJzKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBsaXN0Lml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlID0gaXRlcmF0b3IubmV4dCgpOwotCQkJaWYgKGUgaW5zdGFuY2VvZiBWYXJpYWJpbGl0eUVsZW1lbnQpIHsKLQkJCQlJdGVyYXRvciBpdGVyID0gVG5nVXRpbC5nZXRDb250cmlidXRvcnMoKFZhcmlhYmlsaXR5RWxlbWVudCkgZSk7Ci0JCQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQkJCWdlbmVyYWxpemVycy5hZGQoaXRlci5uZXh0KCkpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIENvbnZlbmllbnQgbWV0aG9kIGZvciByZXRyaXZpbmcgYWxsIHRoZSBjb250cmlidXRvcnMgb2YKLQkgKiB2YXJpYWJpbGl0eWVsZW1lbnQgaW4gYSBsaXN0LgotCSAqIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBnZXRHZW5lcmFsaXplcnMoTGlzdCBsaXN0LCBMaXN0IGdlbmVyYWxpemVycykgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gbGlzdC5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZSA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmIChlIGluc3RhbmNlb2YgVmFyaWFiaWxpdHlFbGVtZW50KSB7Ci0JCQkJSXRlcmF0b3IgaXRlciA9IFRuZ1V0aWwuZ2V0R2VuZXJhbGl6ZXJzKChWYXJpYWJpbGl0eUVsZW1lbnQpIGUpOwotCQkJCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJCQlnZW5lcmFsaXplcnMuYWRkKGl0ZXIubmV4dCgpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDb252ZW5pZW50IG1ldGhvZCBmb3IgcmV0cml2aW5nIGFsbCB0aGUgdmFyaWFiaWxpdHkgYmFzZXMgb2YKLQkgKiB2YXJpYWJpbGl0eWVsZW1lbnQgaW4gYSBsaXN0LgotCSAqIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBnZXRWYXJpYWJpbGl0eUJhc2UoTGlzdCBsaXN0LCBMaXN0IHZhcmlhYmlsaXR5YmFzZXMpIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGxpc3QuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IG9iaiA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBWYXJpYWJpbGl0eUVsZW1lbnQpIHsKLQkJCQlWYXJpYWJpbGl0eUVsZW1lbnQgZSA9IChWYXJpYWJpbGl0eUVsZW1lbnQpIG9iajsKLQkJCQlmb3IgKDsgZS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkgIT0gbnVsbDsgdmFyaWFiaWxpdHliYXNlcwotCQkJCQkJLmFkZChlID0gKFZhcmlhYmlsaXR5RWxlbWVudCkgZQotCQkJCQkJCQkuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpKSkKLQkJCQkJOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogR2V0IHBhcmVudCBhY3Rpdml0eSBmb3IgYnJlYWtkb3duZWxlbWVudAotCSAqIAotCSAqIEBwYXJhbSBickVsZW1lbnQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBPYmplY3QgZ2V0UGFyZW50QWN0aXZpdHkoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksCi0JCQlCcmVha2Rvd25FbGVtZW50IGJyRWxlbWVudCkgewotCQlpZiAoYnJFbGVtZW50ICE9IG51bGwpIHsKLQkJCUl0ZW1Qcm92aWRlckFkYXB0ZXIgYWRhcHRlciA9IChJdGVtUHJvdmlkZXJBZGFwdGVyKSBhZGFwdGVyRmFjdG9yeQotCQkJCQkuYWRhcHQoYnJFbGVtZW50LCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkJT2JqZWN0IHBhcmVudCA9IGFkYXB0ZXIuZ2V0UGFyZW50KGJyRWxlbWVudCk7Ci0JCQl3aGlsZSAoIShwYXJlbnQgaW5zdGFuY2VvZiBBY3Rpdml0eSkgJiYgcGFyZW50ICE9IG51bGwpIHsKLQkJCQlickVsZW1lbnQgPSAoQnJlYWtkb3duRWxlbWVudCkgcGFyZW50OwotCQkJCWFkYXB0ZXIgPSAoSXRlbVByb3ZpZGVyQWRhcHRlcikgYWRhcHRlckZhY3RvcnkuYWRhcHQoYnJFbGVtZW50LAotCQkJCQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCQlwYXJlbnQgPSBhZGFwdGVyLmdldFBhcmVudChickVsZW1lbnQpOwotCQkJfQotCi0JCQlyZXR1cm4gcGFyZW50OwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBnZXRTdWJUcmVlKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXIsIEFjdGl2aXR5IGFjdGl2aXR5LAotCQkJTGlzdCB0cmVlTGlzdCkgewotCQlGaWx0ZXJVdGlsLmdldFBhcmVudHNJblNjb3BlKFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJLmdldFdCU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCksIGFjdGl2aXR5LCB0cmVlTGlzdCk7Ci0JCUZpbHRlclV0aWwuZ2V0Q2hpbGRBY3Rpdml0aWVzSW5TY29wZShUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCS5nZXRXQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpLCBhY3Rpdml0eSwgdHJlZUxpc3QpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBnZXRTdWJUcmVlKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXIsIExpc3QgbGlzdCwKLQkJCUxpc3QgdHJlZUxpc3QpIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGxpc3QuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IG9iaiA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCWdldFN1YlRyZWUoYWRhcHRlciwgKEFjdGl2aXR5KSBvYmosIHRyZWVMaXN0KTsKLQkJCX0KLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9HdWlkYW5jZUdyb3VwaW5nSXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL0d1aWRhbmNlR3JvdXBpbmdJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTMxZDgyNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL0d1aWRhbmNlR3JvdXBpbmdJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklDb25maWd1cmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLQotLyoqCi0gKiBUaGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciB0aGUgZ3VpZGFuY2UgZm9sZGVycyBpbiB0aGUgbWV0aG9kIGVsZW1lbnQKLSAqIHNlbGVjdGlvbiBkaWFsb2dzLgotICogCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEd1aWRhbmNlR3JvdXBpbmdJdGVtUHJvdmlkZXIgZXh0ZW5kcwotCQlvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbmZpZ3VyYXRpb24uR3VpZGFuY2VHcm91cGluZ0l0ZW1Qcm92aWRlcgotCQlpbXBsZW1lbnRzIElDb25maWd1cmFibGUgewotCi0JcHJpdmF0ZSBJRmlsdGVyIGZpbHRlcjsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICogCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICogQHBhcmFtIG1ldGhvZENvbmZpZwotCSAqLwotCXB1YmxpYyBHdWlkYW5jZUdyb3VwaW5nSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LAotCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBtZXRob2RDb25maWcpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnksIG1ldGhvZENvbmZpZyk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklDb25maWd1cmFibGUjc2V0RmlsdGVyKGNvbS5pYm0ubGlicmFyeS5lZGl0LklGaWx0ZXIpCi0JICovCi0JcHVibGljIHZvaWQgc2V0RmlsdGVyKElGaWx0ZXIgZmlsdGVyKSB7Ci0JCXRoaXMuZmlsdGVyID0gZmlsdGVyOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhYmxlI3NldExhYmVsKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGFiZWwoU3RyaW5nIGxhYmVsKSB7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklDb25maWd1cmFibGUjc2V0UGFyZW50KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgc2V0UGFyZW50KE9iamVjdCBwYXJlbnQpIHsKLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCUNvbGxlY3Rpb24gY29sID0gc3VwZXIuZ2V0Q2hpbGRyZW4ob2JqZWN0KTsKLQkJZm9yIChJdGVyYXRvciBpdG9yID0gY29sLml0ZXJhdG9yKCk7IGl0b3IuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IG9iaiA9IGl0b3IubmV4dCgpOwotCQkJaWYgKCFmaWx0ZXIuYWNjZXB0KG9iaikpCi0JCQkJaXRvci5yZW1vdmUoKTsKLQkJfQotCQlyZXR1cm4gY29sOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9JQWxsRmlsdGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL0lBbGxGaWx0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzhlNmU1Ny4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL0lBbGxGaWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXI7Ci0KLS8qKgotICogQSBmaWx0ZXIgdGhhdCBkaXNwbGF5cyBhbGwgbWV0aG9kIGVsZW1lbnRzIGluIHRoZSBtZXRob2QgZWxlbWVudCBzZWxlY3Rpb24KLSAqIGRpYWxvZ3MuCi0gKiAKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElBbGxGaWx0ZXIgZXh0ZW5kcyBJRmlsdGVyIHsKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaXRlbXNmaWx0ZXIvSUNhdGVnb3J5RmlsdGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL0lDYXRlZ29yeUZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZTVkMjIwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaXRlbXNmaWx0ZXIvSUNhdGVnb3J5RmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyOwotCi0vKioKLSAqIEEgZmlsdGVyIHRoYXQgZGlzcGxheXMgb25seSBjYXRlZ29yeSBlbGVtZW50cyBpbiB0aGUgbWV0aG9kIGVsZW1lbnQgc2VsZWN0aW9uCi0gKiBkaWFsb2dzLgotICogCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJQ2F0ZWdvcnlGaWx0ZXIgZXh0ZW5kcyBJRmlsdGVyIHsKLQotCVN0cmluZ1tdIGdldENhdGVnb3J5UGFja2FnZVBhdGgoKTsKLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9JQ29udGVudEZpbHRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9JQ29udGVudEZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOWFkZWMyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaXRlbXNmaWx0ZXIvSUNvbnRlbnRGaWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXI7Ci0KLS8qKgotICogQSBmaWx0ZXIgdGhhdCBkaXNwbGF5cyBvbmx5IGNvbnRlbnQgZWxlbWVudHMgaW4gdGhlIG1ldGhvZCBlbGVtZW50IHNlbGVjdGlvbgotICogZGlhbG9ncy4KLSAqIAotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUNvbnRlbnRGaWx0ZXIgZXh0ZW5kcyBJRmlsdGVyIHsKLQotCVN0cmluZ1tdIGdldENvbnRlbnRQYWNrYWdlUGF0aCgpOwotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL0lDdXN0b21GaWx0ZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaXRlbXNmaWx0ZXIvSUN1c3RvbUZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYjU3MTEyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaXRlbXNmaWx0ZXIvSUN1c3RvbUZpbHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlcjsKLQotLyoqCi0gKiBBIGZpbHRlciB0aGF0IGRpc3BsYXlzIG9ubHkgY3VzdG9tIGNhdGVnb3JpZXMgaW4gdGhlIG1ldGhvZCBlbGVtZW50IHNlbGVjdGlvbgotICogZGlhbG9ncy4KLSAqIAotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUN1c3RvbUZpbHRlciBleHRlbmRzIElGaWx0ZXIgewotCi0JU3RyaW5nW10gZ2V0Q29udGVudFBhY2thZ2VQYXRoKCk7Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaXRlbXNmaWx0ZXIvSUZpbHRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9JRmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhOGQ2OWMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9JRmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyOwotCi0vKioKLSAqIEEgZ2VuZXJpYyBmaWx0ZXIgZm9yIGZpbHRlcmluZyBvdXQgbWV0aG9kIGVsZW1lbnRzIGluIHRoZSBtZXRob2QgZWxlbWVudAotICogc2VsZWN0aW9uIGRpYWxvZ3MuCi0gKiAKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJRmlsdGVyIGV4dGVuZHMgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyIHsKLQotCS8qCi0JICogZ2V0T2JqZWN0KCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldE9iamVjdCgpOwotCi0JLyoKLQkgKiBzZXRIZWxwZXIoKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEhlbHBlcihGaWx0ZXJIZWxwZXIgaGVscGVyKTsKLQotCS8qKgotCSAqIEFkZGVkIGZvciBmdXRoZXIgZmlsdGVyaW5nLiBGb3IgZXhhbXBsZSwgd2UgbWF5IHNldCBhIGZpbGVyIHRvIHByZXZlbnQKLQkgKiBnZW5lcmFsaXplcnMgYXMgYmFzZSBlbGVtZW50IHRvIGF2b2lkIGNpcmN1bGFyIGRlcGVuZGVuY3kKLQkgKiAKLQkgKiBAcGFyYW0gYWRkaXRpb25hbEZpbHRlcnMKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBZGRpdGlvbmFsRmlsdGVycygKLQkJCW9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcltdIGFkZGl0aW9uYWxGaWx0ZXJzKTsKLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9JUHJvY2Vzc0ZpbHRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9JUHJvY2Vzc0ZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYWM2ZDMzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaXRlbXNmaWx0ZXIvSVByb2Nlc3NGaWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXI7Ci0KLS8qKgotICogQSBmaWx0ZXIgdGhhdCBkaXNwbGF5cyBvbmx5IHByb2Nlc3MgZWxlbWVudHMgaW4gdGhlIG1ldGhvZCBlbGVtZW50IHNlbGVjdGlvbgotICogZGlhbG9ncy4KLSAqIAotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVByb2Nlc3NGaWx0ZXIgZXh0ZW5kcyBJRmlsdGVyIHsKLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9JdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9JdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MWIyMWM5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaXRlbXNmaWx0ZXIvSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLQotLyoqCi0gKiBUaGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZhY3RvcnkgZm9yIHRoZSBtZXRob2QgZWxlbWVudCBzZWxlY3Rpb24gZGlhbG9ncy4KLSAqIAotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSBleHRlbmRzCi0JCW9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQubmF2aWdhdG9yLkl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5IHsKLQotCXB1YmxpYyBJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuVW1hSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkjY3JlYXRlQ3VzdG9tQ2F0ZWdvcnlBZGFwdGVyKCkKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVDdXN0b21DYXRlZ29yeUFkYXB0ZXIoKSB7Ci0JCWlmIChjdXN0b21DYXRlZ29yeUl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQljdXN0b21DYXRlZ29yeUl0ZW1Qcm92aWRlciA9IG5ldyBDdXN0b21DYXRlZ29yeUl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiBjdXN0b21DYXRlZ29yeUl0ZW1Qcm92aWRlcjsKLQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5VbWFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSNjcmVhdGVNZXRob2RMaWJyYXJ5QWRhcHRlcigpCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlTWV0aG9kTGlicmFyeUFkYXB0ZXIoKSB7Ci0JCWlmIChtZXRob2RMaWJyYXJ5SXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCW1ldGhvZExpYnJhcnlJdGVtUHJvdmlkZXIgPSBuZXcgTWV0aG9kTGlicmFyeUl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCQlyZXR1cm4gbWV0aG9kTGlicmFyeUl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVNZXRob2RQbHVnaW5BZGFwdGVyKCkgewotCQlpZiAobWV0aG9kUGx1Z2luSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCW1ldGhvZFBsdWdpbkl0ZW1Qcm92aWRlciA9IG5ldyBNZXRob2RQbHVnaW5JdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQkJcmV0dXJuIG1ldGhvZFBsdWdpbkl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVDb250ZW50UGFja2FnZUFkYXB0ZXIoKSB7Ci0JCWlmIChjb250ZW50UGFja2FnZUl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQljb250ZW50UGFja2FnZUl0ZW1Qcm92aWRlciA9IG5ldyBDb250ZW50UGFja2FnZUl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCQlyZXR1cm4gY29udGVudFBhY2thZ2VJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQ29udGVudGNhdGVnb3JpZXNBZGFwdGVyRmFjdG9yeSNjcmVhdGVEaXNjaXBsaW5lR3JvdXBpbmdBZGFwdGVyKCkKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVEaXNjaXBsaW5lR3JvdXBpbmdBZGFwdGVyKCkgewotCQkvLyBpZihkaXNjaXBsaW5lR3JvdXBpbmdJdGVtUHJvdmlkZXIgPT0gbnVsbCl7Ci0JCS8vIGRpc2NpcGxpbmVHcm91cGluZ0l0ZW1Qcm92aWRlciA9IG5ldwotCQkvLyBEaXNjaXBsaW5lR3JvdXBpbmdJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCS8vIH0KLQkJLy8gcmV0dXJuIGRpc2NpcGxpbmVHcm91cGluZ0l0ZW1Qcm92aWRlcjsKLQkJcmV0dXJuIG5ldyBEaXNjaXBsaW5lR3JvdXBpbmdJdGVtUHJvdmlkZXIodGhpcyk7Ci0JfQotCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUm9sZVNldEdyb3VwaW5nQWRhcHRlcigpIHsKLQkJLy8gaWYocm9sZVNldEdyb3VwaW5nSXRlbVByb3ZpZGVyID09IG51bGwpewotCQkvLyByb2xlU2V0R3JvdXBpbmdJdGVtUHJvdmlkZXIgPSBuZXcgUm9sZVNldEdyb3VwaW5nSXRlbVByb3ZpZGVyKHRoaXMpOwotCQkvLyB9Ci0JCS8vIHJldHVybiByb2xlU2V0R3JvdXBpbmdJdGVtUHJvdmlkZXI7Ci0JCXJldHVybiBuZXcgUm9sZVNldEdyb3VwaW5nSXRlbVByb3ZpZGVyKHRoaXMpOwotCX0KLQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVJvbGVTZXRBZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IFJvbGVTZXRJdGVtUHJvdmlkZXIodGhpcyk7Ci0JfQotCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlTWV0aG9kQ29uZmlndXJhdGlvbkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgTWV0aG9kQ29uZmlndXJhdGlvbkl0ZW1Qcm92aWRlcih0aGlzKTsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVEZWxpdmVyeVByb2Nlc3NBZGFwdGVyKCkgewotLy8JCWlmIChkZWxpdmVyeVByb2Nlc3NJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotLy8JCQlkZWxpdmVyeVByb2Nlc3NJdGVtUHJvdmlkZXIgPSBuZXcgRGVsaXZlcnlQcm9jZXNzSXRlbVByb3ZpZGVyKHRoaXMpOwotLy8JCX0KLS8vCi0vLwkJcmV0dXJuIGRlbGl2ZXJ5UHJvY2Vzc0l0ZW1Qcm92aWRlcjsKLQkJCi0JCXJldHVybiBjcmVhdGVBY3Rpdml0eUFkYXB0ZXIoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuVW1hSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkjY3JlYXRlQ2FwYWJpbGl0eVBhdHRlcm5BZGFwdGVyKCkKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVDYXBhYmlsaXR5UGF0dGVybkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBjcmVhdGVBY3Rpdml0eUFkYXB0ZXIoKTsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVBY3Rpdml0eUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgQWN0aXZpdHlJdGVtUHJvdmlkZXIodGhpcyk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLlVtYUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5I2NyZWF0ZVBoYXNlQWRhcHRlcigpCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUGhhc2VBZGFwdGVyKCkgewotCQlyZXR1cm4gY3JlYXRlQWN0aXZpdHlBZGFwdGVyKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQnJlYWtkb3duQWRhcHRlckZhY3RvcnkjY3JlYXRlSXRlcmF0aW9uQWRhcHRlcigpCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlSXRlcmF0aW9uQWRhcHRlcigpIHsKLQkJcmV0dXJuIGNyZWF0ZUFjdGl2aXR5QWRhcHRlcigpOwotCX0KLQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZURvbWFpbkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgRG9tYWluSXRlbVByb3ZpZGVyKHRoaXMpOwotCX0KLQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZURpc2NpcGxpbmVBZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IERpc2NpcGxpbmVJdGVtUHJvdmlkZXIodGhpcyk7Ci0JfQotCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUHJvY2Vzc1BhY2thZ2VBZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IFByb2Nlc3NQYWNrYWdlSXRlbVByb3ZpZGVyKHRoaXMpOwotCX0KLQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVByb2Nlc3NDb21wb25lbnRBZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IFByb2Nlc3NDb21wb25lbnRJdGVtUHJvdmlkZXIodGhpcyk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL01ldGhvZENvbmZpZ3VyYXRpb25JdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaXRlbXNmaWx0ZXIvTWV0aG9kQ29uZmlndXJhdGlvbkl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMzM0OGMyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaXRlbXNmaWx0ZXIvTWV0aG9kQ29uZmlndXJhdGlvbkl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLQotLyoqCi0gKiBUaGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIG1ldGhvZCBjb25maWd1cmF0aW9uIGluIHRoZSBtZXRob2QgZWxlbWVudAotICogc2VsZWN0aW9uIGRpYWxvZ3MuCi0gKiAKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIE1ldGhvZENvbmZpZ3VyYXRpb25JdGVtUHJvdmlkZXIgZXh0ZW5kcwotCQlvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbmZpZ3VyYXRpb24uTWV0aG9kQ29uZmlndXJhdGlvbkl0ZW1Qcm92aWRlciB7Ci0KLQlwcml2YXRlIElGaWx0ZXIgZmlsdGVyOwotCi0JcHVibGljIE1ldGhvZENvbmZpZ3VyYXRpb25JdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEZpbHRlcihJRmlsdGVyIGZpbHRlcikgewotCQlzdXBlci5zZXRGaWx0ZXIoZmlsdGVyKTsKLQkJaWYgKGZpbHRlciBpbnN0YW5jZW9mIElDb25maWd1cmF0b3IpIHsKLQkJCXRoaXMuZmlsdGVyID0gZmlsdGVyOwotCQl9Ci0JfQotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQljaGlsZHJlbiA9IG51bGw7Ci0JCUNvbGxlY3Rpb24gY29sID0gc3VwZXIuZ2V0Q2hpbGRyZW4ob2JqZWN0KTsKLQotCQlpZiAoZmlsdGVyICE9IG51bGwpIHsKLQkJCUZpbHRlclV0aWwuaXRlcmF0ZUNvbGxlY3Rpb24oY29sLCBmaWx0ZXIpOwotCQl9Ci0JCXJldHVybiBjb2w7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL01ldGhvZExpYnJhcnlJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaXRlbXNmaWx0ZXIvTWV0aG9kTGlicmFyeUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOWQ1MjkyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaXRlbXNmaWx0ZXIvTWV0aG9kTGlicmFyeUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JV3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkZlYXR1cmVWYWx1ZVdyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiBUaGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIG1ldGhvZCBsaWJyYXJ5IGluIHRoZSBtZXRob2QgZWxlbWVudAotICogc2VsZWN0aW9uIGRpYWxvZ3MuCi0gKiAKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTWV0aG9kTGlicmFyeUl0ZW1Qcm92aWRlciBleHRlbmRzCi0JCW9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuTWV0aG9kTGlicmFyeUl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzIElDb25maWd1cmFibGUgewotCi0JQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3Rvcnk7Ci0KLQlDb250ZW50RWxlbWVudCBjb250ZW50RWxlbWVudDsKLQotCXByaXZhdGUgSUZpbHRlciBmaWx0ZXI7Ci0KLQkvLyBwcml2YXRlIGJvb2xlYW4gaXNBZGFwdGVyQ29uZmlndXJhYmxlOwotCS8vIHByaXZhdGUgQXJyYXlMaXN0IGNoaWxkcmVuOwotCS8vIHByaXZhdGUgTWV0aG9kUGx1Z2luIHBsdWdpbjsKLQkvLyBwcml2YXRlIE1vZGVsU3RydWN0dXJlIG1vZGVsU3RydWN0OwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgTWV0aG9kTGlicmFyeUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JCXRoaXMuYWRhcHRlckZhY3RvcnkgPSBhZGFwdGVyRmFjdG9yeTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgTWV0aG9kTGlicmFyeUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwKLQkJCU9iamVjdCBjb250ZW50RWxlbWVudCkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JCXRoaXMuYWRhcHRlckZhY3RvcnkgPSBhZGFwdGVyRmFjdG9yeTsKLQkJdGhpcy5jb250ZW50RWxlbWVudCA9IChDb250ZW50RWxlbWVudCkgY29udGVudEVsZW1lbnQ7Ci0JfQotCi0JcHVibGljIE1ldGhvZExpYnJhcnlJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksCi0JCQlJRmlsdGVyIGZpbHRlcikgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JCXRoaXMuYWRhcHRlckZhY3RvcnkgPSBhZGFwdGVyRmFjdG9yeTsKLQkJdGhpcy5maWx0ZXIgPSBmaWx0ZXI7Ci0JCWlmIChhZGFwdGVyRmFjdG9yeSBpbnN0YW5jZW9mIElDb25maWd1cmFibGUpIHsKLQkJCS8vIGlzQWRhcHRlckNvbmZpZ3VyYWJsZSA9IHRydWU7Ci0JCQkoKElDb25maWd1cmFibGUpIGFkYXB0ZXJGYWN0b3J5KS5zZXRGaWx0ZXIoZmlsdGVyKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFRoaXMgc3BlY2lmaWVzIGhvdyB0byBpbXBsZW1lbnQge0BsaW5rICNnZXRDaGlsZHJlbn0gYW5kIGlzIHVzZWQgdG8KLQkgKiBkZWR1Y2UgYW4gYXBwcm9wcmlhdGUgZmVhdHVyZSBmb3IgYW4KLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5BZGRDb21tYW5kfSwKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5SZW1vdmVDb21tYW5kfSBvcgotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLk1vdmVDb21tYW5kfSBpbgotCSAqIHtAbGluayAjY3JlYXRlQ29tbWFuZH0uIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbkZlYXR1cmVzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGNoaWxkcmVuRmVhdHVyZXMgPT0gbnVsbCkgewotCQkJLy8gc3VwZXIuZ2V0Q2hpbGRyZW5GZWF0dXJlcyhvYmplY3QpOwotCQkJY2hpbGRyZW5GZWF0dXJlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWNoaWxkcmVuRmVhdHVyZXMuYWRkKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCS5nZXRNZXRob2RMaWJyYXJ5X01ldGhvZFBsdWdpbnMoKSk7Ci0JCQljaGlsZHJlbkZlYXR1cmVzLmFkZChVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkuZ2V0TWV0aG9kTGlicmFyeV9QcmVkZWZpbmVkQ29uZmlndXJhdGlvbnMoKSk7Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuRmVhdHVyZXM7Ci0JfQotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlDb2xsZWN0aW9uIGNoaWxkcmVuID0gc3VwZXIuZ2V0Q2hpbGRyZW4ob2JqZWN0KTsKLQkJZm9yIChJdGVyYXRvciBpdGVyMSA9IGNoaWxkcmVuLml0ZXJhdG9yKCk7IGl0ZXIxLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBjaGlsZCA9IGl0ZXIxLm5leHQoKTsKLQkJCWlmIChmaWx0ZXIuYWNjZXB0KGNoaWxkKSAmJiBjaGlsZCBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikgewotCQkJCU1ldGhvZFBsdWdpbkl0ZW1Qcm92aWRlciBwID0gbmV3IE1ldGhvZFBsdWdpbkl0ZW1Qcm92aWRlcigKLQkJCQkJCWFkYXB0ZXJGYWN0b3J5KTsKLQkJCQlwLnNldEZpbHRlcihmaWx0ZXIpOwotCQkJCUNvbGxlY3Rpb24gY2hpbGRzID0gcC5nZXRDaGlsZHJlbihjaGlsZCk7Ci0JCQkJZm9yIChJdGVyYXRvciBjaGlsZEl0ZXIgPSBjaGlsZHMuaXRlcmF0b3IoKTsgY2hpbGRJdGVyCi0JCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQlPYmplY3QgY2hpbGRPYmogPSBjaGlsZEl0ZXIubmV4dCgpOwotCQkJCQlpZiAoY2hpbGRPYmogaW5zdGFuY2VvZiBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIpIHsKLQkJCQkJCWlmICghY2hlY2tDaGlsZHJlbnMoY2hpbGRPYmopKQotCQkJCQkJCWNoaWxkSXRlci5yZW1vdmUoKTsKLQotCQkJCQl9IGVsc2UgewotCQkJCQkJaWYgKCFmaWx0ZXIuYWNjZXB0KGNoaWxkT2JqKSkgewotCQkJCQkJCWNoaWxkSXRlci5yZW1vdmUoKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAoY2hpbGRzLmlzRW1wdHkoKSkKLQkJCQkJaXRlcjEucmVtb3ZlKCk7Ci0JCQl9IGVsc2UgewotCQkJCWlmICghZmlsdGVyLmFjY2VwdChjaGlsZCkpCi0JCQkJCWl0ZXIxLnJlbW92ZSgpOwotCQkJfQotCQl9Ci0JCXJldHVybiBjaGlsZHJlbjsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gY2hlY2tDaGlsZHJlbnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgRmVhdHVyZVZhbHVlV3JhcHBlckl0ZW1Qcm92aWRlcikgewotCQkJb2JqZWN0ID0gKChJV3JhcHBlckl0ZW1Qcm92aWRlcikgb2JqZWN0KS5nZXRWYWx1ZSgpOwotCQkJaWYgKCFmaWx0ZXIuYWNjZXB0KG9iamVjdCkpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlDb2xsZWN0aW9uIGNoaWxkT2JqQ2hpbGRzID0gKChJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIpIG9iamVjdCkKLQkJCQkJLmdldENoaWxkcmVuKG9iamVjdCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGNoaWxkT2JqSXRlciA9IGNoaWxkT2JqQ2hpbGRzLml0ZXJhdG9yKCk7IGNoaWxkT2JqSXRlcgotCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBjaGlsZE9iakNoaWxkID0gY2hpbGRPYmpJdGVyLm5leHQoKTsKLQkJCQlpZiAoY2hpbGRPYmpDaGlsZCBpbnN0YW5jZW9mIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlcikgewotCQkJCQlyZXR1cm4gY2hlY2tDaGlsZHJlbnMoY2hpbGRPYmpDaGlsZCk7Ci0JCQkJfQotCQkJCWlmICghZmlsdGVyLmFjY2VwdChjaGlsZE9iakNoaWxkKSkgewotCQkJCQljaGlsZE9iakl0ZXIucmVtb3ZlKCk7Ci0JCQkJfQotCQkJfQotCQkJaWYgKGNoaWxkT2JqQ2hpbGRzLmlzRW1wdHkoKSkKLQkJCQkvLyBjaGlsZEl0ZXIucmVtb3ZlKCk7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhYmxlI3NldEZpbHRlcihjb20uaWJtLmxpYnJhcnkuZWRpdC5JRmlsdGVyKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZpbHRlcihJRmlsdGVyIGZpbHRlcikgewotCQl0aGlzLmZpbHRlciA9IGZpbHRlcjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYWJsZSNzZXRMYWJlbChqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldExhYmVsKFN0cmluZyBsYWJlbCkgewotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhYmxlI3NldFBhcmVudChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBhcmVudChPYmplY3QgcGFyZW50KSB7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL01ldGhvZFBsdWdpbkl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9NZXRob2RQbHVnaW5JdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjg1Mjg0Ny4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL01ldGhvZFBsdWdpbkl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuTW9kZWxTdHJ1Y3R1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkN1c3RvbUNhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5VbWFVdGlsOwotCi0vKioKLSAqIFRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEgbWV0aG9kIHBsdWctaW4gaW4gdGhlIG1ldGhvZCBlbGVtZW50Ci0gKiBzZWxlY3Rpb24gZGlhbG9ncy4KLSAqIAotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXRob2RQbHVnaW5JdGVtUHJvdmlkZXIgZXh0ZW5kcwotCQlvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLk1ldGhvZFBsdWdpbkl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzCi0JCUlDb25maWd1cmFibGUgewotCXByaXZhdGUgSUZpbHRlciBmaWx0ZXI7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBNZXRob2RQbHVnaW5JdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJTGlzdCBjb2wgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJaWYgKGZpbHRlciBpbnN0YW5jZW9mIElDYXRlZ29yeUZpbHRlcikgewotCQkJY29sLmFkZEFsbChnZXRDYXRlZ29yeUl0ZW1Qcm92aWRlcihvYmplY3QpLmdldENoaWxkcmVuKG9iamVjdCkpOwotCQkJcmV0dXJuIGNvbDsKLQkJfSBlbHNlIGlmIChmaWx0ZXIgaW5zdGFuY2VvZiBJQ29udGVudEZpbHRlcikgewotCQkJcmV0dXJuIGdldENvbnRlbnQob2JqZWN0KTsKLQkJfSBlbHNlIGlmIChmaWx0ZXIgaW5zdGFuY2VvZiBJQWxsRmlsdGVyKSB7Ci0JCQlyZXR1cm4gZ2V0QWxsQ29udGVudEVsZW1lbnRzKG9iamVjdCk7Ci0JCX0gZWxzZSBpZiAoZmlsdGVyIGluc3RhbmNlb2YgSUN1c3RvbUZpbHRlcikgewotCQkJcmV0dXJuIGdldEN1c3RvbUNhdGVnb3JpZXMob2JqZWN0KTsKLQkJfSBlbHNlCi0JCQlyZXR1cm4gc3VwZXIuZ2V0Q2hpbGRyZW4ob2JqZWN0KTsKLQkJLy8gVE9ETzogZmlsdGVyCi0JfQotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uIGdldEN1c3RvbUNhdGVnb3JpZXMoT2JqZWN0IG9iamVjdCkgewotCQlDdXN0b21DYXRlZ29yeSByb290Q3VzdG9tQ2F0ZWdvcnkgPSBUbmdVdGlsCi0JCQkJLmdldFJvb3RDdXN0b21DYXRlZ29yeSgoTWV0aG9kUGx1Z2luKSBvYmplY3QpOwotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIgYWRhcHRlciA9IChJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIpIGFkYXB0ZXJGYWN0b3J5Ci0JCQkJLmFkYXB0KHJvb3RDdXN0b21DYXRlZ29yeSwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJKChJQ29uZmlndXJhYmxlKSBhZGFwdGVyKS5zZXRGaWx0ZXIoZmlsdGVyKTsKLQkJcmV0dXJuIGFkYXB0ZXIuZ2V0Q2hpbGRyZW4ocm9vdEN1c3RvbUNhdGVnb3J5KTsKLQl9Ci0KLQlwcml2YXRlIEl0ZW1Qcm92aWRlckFkYXB0ZXIgZ2V0Q2F0ZWdvcnlJdGVtUHJvdmlkZXIoT2JqZWN0IG9iamVjdCkgewotCQlDb250ZW50UGFja2FnZSBwa2cgPSBVbWFVdGlsLmZpbmRDb250ZW50UGFja2FnZSgoTWV0aG9kUGx1Z2luKSBvYmplY3QsCi0JCQkJKChJQ2F0ZWdvcnlGaWx0ZXIpIGZpbHRlcikuZ2V0Q2F0ZWdvcnlQYWNrYWdlUGF0aCgpKTsKLQkJQ29udGVudENhdGVnb3J5SXRlbVByb3ZpZGVyIGNvbnRlbnRDYXRlZ29yeUl0ZW1Qcm92aWRlciA9IG5ldyBDb250ZW50Q2F0ZWdvcnlJdGVtUHJvdmlkZXIoCi0JCQkJYWRhcHRlckZhY3RvcnksIHBrZywgIiIpOyAvLyROT04tTkxTLTEkCi0JCWNvbnRlbnRDYXRlZ29yeUl0ZW1Qcm92aWRlci5zZXRGaWx0ZXIoZmlsdGVyKTsKLQkJY29udGVudENhdGVnb3J5SXRlbVByb3ZpZGVyLnNldFBhcmVudChvYmplY3QpOwotCQlyZXR1cm4gY29udGVudENhdGVnb3J5SXRlbVByb3ZpZGVyOwotCX0KLQotCXByaXZhdGUgQ29sbGVjdGlvbiBnZXRDb250ZW50KE9iamVjdCBvYmplY3QpIHsKLQkJQ29udGVudFBhY2thZ2UgcGtnID0gVW1hVXRpbC5maW5kQ29udGVudFBhY2thZ2UoKE1ldGhvZFBsdWdpbikgb2JqZWN0LAotCQkJCSgoSUNvbnRlbnRGaWx0ZXIpIGZpbHRlcikuZ2V0Q29udGVudFBhY2thZ2VQYXRoKCkpOwotCQlJdGVtUHJvdmlkZXJBZGFwdGVyIGFkYXB0ZXIgPSAoSXRlbVByb3ZpZGVyQWRhcHRlcikgYWRhcHRlckZhY3RvcnkKLQkJCQkuYWRhcHQocGtnLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkoKElDb25maWd1cmFibGUpIGFkYXB0ZXIpLnNldEZpbHRlcihmaWx0ZXIpOwotCQlyZXR1cm4gYWRhcHRlci5nZXRDaGlsZHJlbihwa2cpOwotCX0KLQotCS8vIHByaXZhdGUgSXRlbVByb3ZpZGVyQWRhcHRlciBnZXRDb250ZW50RWxlbWVudHNJdGVtUHJvdmlkZXIoT2JqZWN0IG9iamVjdCkKLQkvLyB7Ci0JLy8gQ29udGVudFBhY2thZ2UgcGtnID0gVW1hVXRpbC5maW5kQ29udGVudFBhY2thZ2UoKE1ldGhvZFBsdWdpbilvYmplY3QsCi0JLy8gTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC5jb3JlQ29udGVudFBhdGgpOwotCS8vIENvbnRlbnRFbGVtZW50c0l0ZW1Qcm92aWRlciBjb250ZW50RWxlbWVudHNJdGVtUHJvdmlkZXIgPSBuZXcKLQkvLyBDb250ZW50RWxlbWVudHNJdGVtUHJvdmlkZXIoYWRhcHRlckZhY3RvcnksIHBrZyk7Ci0JLy8gY29udGVudEVsZW1lbnRzSXRlbVByb3ZpZGVyLnNldEZpbHRlcihmaWx0ZXIpOwotCS8vIHJldHVybiBjb250ZW50RWxlbWVudHNJdGVtUHJvdmlkZXI7Ci0JLy8gfQotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uIGdldEFsbENvbnRlbnRFbGVtZW50cyhPYmplY3Qgb2JqZWN0KSB7Ci0JCUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQlTdHJpbmdbXSBjb3JlQ29udGVudFBhdGggPSBNb2RlbFN0cnVjdHVyZS5ERUZBVUxULmNvcmVDb250ZW50UGF0aDsKLQkJQ29udGVudFBhY2thZ2UgY29yZVBrZyA9IFVtYVV0aWwuZmluZENvbnRlbnRQYWNrYWdlKAotCQkJCShNZXRob2RQbHVnaW4pIG9iamVjdCwgY29yZUNvbnRlbnRQYXRoKTsKLQkJSXRlbVByb3ZpZGVyQWRhcHRlciBjb250ZW50QWRhcHRlciA9IChJdGVtUHJvdmlkZXJBZGFwdGVyKSBhZGFwdGVyRmFjdG9yeQotCQkJCS5hZGFwdChjb3JlUGtnLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkoKElDb25maWd1cmFibGUpIGNvbnRlbnRBZGFwdGVyKS5zZXRGaWx0ZXIoZmlsdGVyKTsKLQkJbGlzdC5hZGRBbGwoY29udGVudEFkYXB0ZXIuZ2V0Q2hpbGRyZW4oY29yZVBrZykpOwotCi0JCVN0cmluZ1tdW10gY2F0ZWdvcnlQYXRocyA9IG5ldyBTdHJpbmdbXVtdIHsKLQkJCQlNb2RlbFN0cnVjdHVyZS5ERUZBVUxULmRvbWFpblBhdGgsCi0JCQkJTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC5kaXNjaXBsaW5lRGVmaW5pdGlvblBhdGgsCi0JCQkJTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC5yb2xlU2V0UGF0aCwKLQkJCQlNb2RlbFN0cnVjdHVyZS5ERUZBVUxULndvcmtQcm9kdWN0VHlwZVBhdGgsCi0JCQkJTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC50b29sUGF0aCB9OwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2F0ZWdvcnlQYXRocy5sZW5ndGg7IGkrKykgewotCQkJU3RyaW5nW10gcGF0aCA9IGNhdGVnb3J5UGF0aHNbaV07Ci0JCQlDb250ZW50UGFja2FnZSBwa2cgPSBVbWFVdGlsLmZpbmRDb250ZW50UGFja2FnZSgKLQkJCQkJKE1ldGhvZFBsdWdpbikgb2JqZWN0LCBwYXRoKTsKLQkJCUNvbnRlbnRDYXRlZ29yaWVzR3JvdXBJdGVtUHJvdmlkZXIgY29udGVudENhdGVnb3JpZXNHcm91cEl0ZW1Qcm92aWRlciA9IG5ldyBDb250ZW50Q2F0ZWdvcmllc0dyb3VwSXRlbVByb3ZpZGVyKAotCQkJCQlhZGFwdGVyRmFjdG9yeSwgcGtnLCBnZXROYW1lKHBhdGgpKTsKLQkJCWNvbnRlbnRDYXRlZ29yaWVzR3JvdXBJdGVtUHJvdmlkZXIuc2V0RmlsdGVyKGZpbHRlcik7Ci0JCQljb250ZW50Q2F0ZWdvcmllc0dyb3VwSXRlbVByb3ZpZGVyLnNldEltYWdlKGdldEltYWdlKHBhdGgpKTsKLQkJCWNvbnRlbnRDYXRlZ29yaWVzR3JvdXBJdGVtUHJvdmlkZXIuc2V0UGFyZW50KG9iamVjdCk7Ci0JCQlsaXN0LmFkZChjb250ZW50Q2F0ZWdvcmllc0dyb3VwSXRlbVByb3ZpZGVyKTsKLQkJfQotCi0JCUN1c3RvbUNhdGVnb3J5IHJvb3RDdXN0b21DYXRlZ29yeSA9IFRuZ1V0aWwKLQkJCQkuZ2V0Um9vdEN1c3RvbUNhdGVnb3J5KChNZXRob2RQbHVnaW4pIG9iamVjdCk7Ci0JCWlmIChyb290Q3VzdG9tQ2F0ZWdvcnkgIT0gbnVsbCkgewotCQkJbGlzdC5hZGQocm9vdEN1c3RvbUNhdGVnb3J5KTsKLQkJfQotCi0JCS8vIFN0cmluZyBuYW1lID0KLQkJLy8gTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfUHJvY2Vzc2VzX2dyb3VwIik7Ci0JCS8vIC8vJE5PTi1OTFMtMSQKLQkJUHJvY2Vzc2VzSXRlbVByb3ZpZGVyIHByb2Nlc3NJdGVtUHJvdmlkZXIgPSBuZXcgUHJvY2Vzc2VzSXRlbVByb3ZpZGVyKAotCQkJCWFkYXB0ZXJGYWN0b3J5LCAoTWV0aG9kUGx1Z2luKSBvYmplY3QpOwotCQlwcm9jZXNzSXRlbVByb3ZpZGVyLnNldEZpbHRlcihmaWx0ZXIpOwotCQlwcm9jZXNzSXRlbVByb3ZpZGVyLnNldFBhcmVudChvYmplY3QpOwotCQlsaXN0LmFkZChwcm9jZXNzSXRlbVByb3ZpZGVyKTsKLQotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIxID0gbGlzdC5pdGVyYXRvcigpOyBpdGVyMS5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgY2hpbGQgPSBpdGVyMS5uZXh0KCk7Ci0JCQlpZiAoIWZpbHRlci5hY2NlcHQoY2hpbGQpKQotCQkJCWl0ZXIxLnJlbW92ZSgpOwotCQl9Ci0JCXJldHVybiBsaXN0OwotCX0KLQotCS8vIHByaXZhdGUgQ29sbGVjdGlvbiBnZXRQcm9jZXNzZXMoT2JqZWN0IG9iamVjdCkgewotCS8vIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkvLyAvLyBTdHJpbmcgbmFtZSA9Ci0JLy8gLy8gTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfUHJvY2Vzc2VzX2dyb3VwIik7Ci0JLy8gLy8gLy8kTk9OLU5MUy0xJAotCS8vIFByb2Nlc3Nlc0l0ZW1Qcm92aWRlciBwcm9jZXNzSXRlbVByb3ZpZGVyID0gbmV3IFByb2Nlc3Nlc0l0ZW1Qcm92aWRlcigKLQkvLyBhZGFwdGVyRmFjdG9yeSwgKE1ldGhvZFBsdWdpbikgb2JqZWN0KTsKLQkvLyBwcm9jZXNzSXRlbVByb3ZpZGVyLnNldEZpbHRlcihmaWx0ZXIpOwotCS8vIGxpc3QuYWRkKHByb2Nlc3NJdGVtUHJvdmlkZXIpOwotCS8vIHJldHVybiBsaXN0OwotCS8vIH0KLQotCXB1YmxpYyB2b2lkIHNldEZpbHRlcihJRmlsdGVyIGZpbHRlcikgewotCQl0aGlzLmZpbHRlciA9IGZpbHRlcjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRMYWJlbChTdHJpbmcgbGFiZWwpIHsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRQYXJlbnQoT2JqZWN0IHBhcmVudCkgewotCX0KLQotCXByaXZhdGUgT2JqZWN0IGdldEltYWdlKFN0cmluZ1tdIHBhdGgpIHsKLQkJaWYgKHBhdGggPT0gTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC5kaXNjaXBsaW5lRGVmaW5pdGlvblBhdGgpIHsKLQkJCXJldHVybiBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvRGlzY2lwbGluZXMiKTsgLy8kTk9OLU5MUy0xJAotCQl9IGVsc2UgaWYgKHBhdGggPT0gTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC5kb21haW5QYXRoKSB7Ci0JCQlyZXR1cm4gTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvRG9tYWlucyIpOyAvLyROT04tTkxTLTEkCi0JCX0gZWxzZSBpZiAocGF0aCA9PSBNb2RlbFN0cnVjdHVyZS5ERUZBVUxULndvcmtQcm9kdWN0VHlwZVBhdGgpIHsKLQkJCXJldHVybiBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvV29ya1Byb2R1Y3RUeXBlcyIpOyAvLyROT04tTkxTLTEkCi0JCX0gZWxzZSBpZiAocGF0aCA9PSBNb2RlbFN0cnVjdHVyZS5ERUZBVUxULnJvbGVTZXRQYXRoKSB7Ci0JCQlyZXR1cm4gTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvUm9sZXMiKTsgLy8kTk9OLU5MUy0xJAotCQl9IGVsc2UgaWYgKHBhdGggPT0gTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC50b29sUGF0aCkgewotCQkJcmV0dXJuIExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldEltYWdlKCJmdWxsL29iajE2L1Rvb2xzIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldE5hbWUoU3RyaW5nW10gcGF0aCkgewotCQlpZiAocGF0aCA9PSBNb2RlbFN0cnVjdHVyZS5ERUZBVUxULmRpc2NpcGxpbmVEZWZpbml0aW9uUGF0aCkgewotCQkJcmV0dXJuIExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCS5nZXRTdHJpbmcoIl9VSV9EaXNjaXBsaW5lc19ncm91cCIpOyAvLyROT04tTkxTLTEkCi0JCX0gZWxzZSBpZiAocGF0aCA9PSBNb2RlbFN0cnVjdHVyZS5ERUZBVUxULmRvbWFpblBhdGgpIHsKLQkJCXJldHVybiBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9Eb21haW5zX2dyb3VwIik7IC8vJE5PTi1OTFMtMSQKLQotCQl9IGVsc2UgaWYgKHBhdGggPT0gTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC53b3JrUHJvZHVjdFR5cGVQYXRoKSB7Ci0JCQlyZXR1cm4gTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJLmdldFN0cmluZygiX1VJX1dvcmtQcm9kdWN0VHlwZXNfZ3JvdXAiKTsgLy8kTk9OLU5MUy0xJAotCQl9IGVsc2UgaWYgKHBhdGggPT0gTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC5yb2xlU2V0UGF0aCkgewotCQkJcmV0dXJuIExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX1JvbGVfU2V0c19ncm91cCIpOyAvLyROT04tTkxTLTEkCi0JCX0gZWxzZSBpZiAocGF0aCA9PSBNb2RlbFN0cnVjdHVyZS5ERUZBVUxULnRvb2xQYXRoKSB7Ci0JCQlyZXR1cm4gTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfVG9vbHNfZ3JvdXAiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9PQlNBY3Rpdml0eUl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9PQlNBY3Rpdml0eUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Y2ZlYzNkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaXRlbXNmaWx0ZXIvT0JTQWN0aXZpdHlJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpcHRvcjsKLQotLyoqCi0gKiBUaGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhY3Rpdml0aWVzIGluIHRoZSBUZWFtIEFsbG9jYXRpb24gcGFnZSBvZiBhCi0gKiBQcm9jZXNzIGVkaXRvci4KLSAqIAotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBPQlNBY3Rpdml0eUl0ZW1Qcm92aWRlciBleHRlbmRzIEJTQWN0aXZpdHlJdGVtUHJvdmlkZXIgewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgT0JTQWN0aXZpdHlJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CU0FjdGl2aXR5SXRlbVByb3ZpZGVyI2dldE9iamVjdChvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaXB0b3IpCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBnZXRPYmplY3QoRGVzY3JpcHRvciBkZXNjcmlwdG9yKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5JQlNJdGVtUHJvdmlkZXIjZ2V0RUNsYXNzZXMoKQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldEVDbGFzc2VzKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaXRlbXNmaWx0ZXIvT0JTSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaXRlbXNmaWx0ZXIvT0JTSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDcyNDA0Ny4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL09CU0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotCi0vKioKLSAqIFRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGJyZWFrIGRvd24gZWxlbWVudHMgaW4gdGhlIFRlYW0gQWxsb2NhdGlvbiBwYWdlCi0gKiBvZiBhIFByb2Nlc3MgZWRpdG9yLgotICogCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIE9CU0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5IGV4dGVuZHMKLQkJb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLk9CU0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5IHsKLQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUFjdGl2aXR5QWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBPQlNBY3Rpdml0eUl0ZW1Qcm92aWRlcih0aGlzKTsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVDYXBhYmlsaXR5UGF0dGVybkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgT0JTUHJvY2Vzc0l0ZW1Qcm92aWRlcih0aGlzLCAoSXRlbVByb3ZpZGVyQWRhcHRlcikgc3VwZXIKLQkJCQkuY3JlYXRlQ2FwYWJpbGl0eVBhdHRlcm5BZGFwdGVyKCkpOwotCX0KLQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZURlbGl2ZXJ5UHJvY2Vzc0FkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgT0JTUHJvY2Vzc0l0ZW1Qcm92aWRlcih0aGlzLCAoSXRlbVByb3ZpZGVyQWRhcHRlcikgc3VwZXIKLQkJCQkuY3JlYXRlRGVsaXZlcnlQcm9jZXNzQWRhcHRlcigpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaXRlbXNmaWx0ZXIvT0JTUHJvY2Vzc0l0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9PQlNQcm9jZXNzSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3MDY5YzcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9PQlNQcm9jZXNzSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci0KLS8qKgotICogVGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgcHJvY2Vzc2VzIGluIHRoZSBUZWFtIEFsbG9jYXRpb24gcGFnZQotICogb2YgYSBQcm9jZXNzIGVkaXRvci4KLSAqIAotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBPQlNQcm9jZXNzSXRlbVByb3ZpZGVyIGV4dGVuZHMgT0JTQWN0aXZpdHlJdGVtUHJvdmlkZXIgewotCi0JcHJpdmF0ZSBJdGVtUHJvdmlkZXJBZGFwdGVyIGRlbGVnYXRlSXRlbVByb3ZpZGVyOwotCi0JcHJpdmF0ZSBJRmlsdGVyIGZpbHRlcjsKLQotCXB1YmxpYyBPQlNQcm9jZXNzSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LAotCQkJSXRlbVByb3ZpZGVyQWRhcHRlciBkZWxlZ2F0ZUl0ZW1Qcm92aWRlcikgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JCXRoaXMuZGVsZWdhdGVJdGVtUHJvdmlkZXIgPSBkZWxlZ2F0ZUl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuQWN0aXZpdHlJdGVtUHJvdmlkZXIjZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPSBkZWxlZ2F0ZUl0ZW1Qcm92aWRlcgotCQkJCQkuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCUNvbGxlY3Rpb24gY29sID0gc3VwZXIuZ2V0Q2hpbGRyZW4ob2JqZWN0KTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gY29sLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGNoaWxkID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAoZmlsdGVyICE9IG51bGwpIHsKLQkJCQlpZiAoIWZpbHRlci5hY2NlcHQoY2hpbGQpKQotCQkJCQlpdGVyLnJlbW92ZSgpOwotCQkJfQotCQl9Ci0JCXJldHVybiBjb2w7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RmlsdGVyKElGaWx0ZXIgZmlsdGVyKSB7Ci0JCXN1cGVyLnNldEZpbHRlcihmaWx0ZXIpOwotCQl0aGlzLmZpbHRlciA9IGZpbHRlcjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaXRlbXNmaWx0ZXIvUEJTQWN0aXZpdHlJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaXRlbXNmaWx0ZXIvUEJTQWN0aXZpdHlJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGI2NDYyYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL1BCU0FjdGl2aXR5SXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlByb2Nlc3NVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpcHRvcjsKLQotLyoqCi0gKiBUaGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhY3Rpdml0aWVzIGluIHRoZSBXb3JrIEJyZWFrZG93biBTdHJ1Y3R1cmUKLSAqIHBhZ2Ugb2YgYSBQcm9jZXNzIGVkaXRvci4KLSAqIAotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBQQlNBY3Rpdml0eUl0ZW1Qcm92aWRlciBleHRlbmRzIEJTQWN0aXZpdHlJdGVtUHJvdmlkZXIgewotCi0JcHJpdmF0ZSBJRmlsdGVyIGZpbHRlcjsKLQotCS8vIElGaWx0ZXIgZml0bGVyOwotCXB1YmxpYyBQQlNBY3Rpdml0eUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5zZXRGaWx0ZXIoZmlsdGVyKTsKLQkJQ29sbGVjdGlvbiBjb2wgPSBzdXBlci5nZXRDaGlsZHJlbihvYmplY3QpOwotCQkvLyBUaGlzIGNhbGwgdG8gUEJTQWN0aWl2aXR5SXRlbVByb3ZpZGVyKHByb2Nlc3MgcGFja2FnZSkgaXMgZG9uZQotCQkvLyAtIGluIG9yZGVyIHJlbW92ZSBkdXBsaWNhdGUgc3ViYXJ0aWZhY3QuCi0JCWNvbCA9IFByb2Nlc3NVdGlsLnJlbW92ZVN1YmFydGlmYWN0c0Zyb21DaGlsZHJlbihjb2wsIGZhbHNlKTsKLQkJcmV0dXJuIGNvbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRGaWx0ZXIoSUZpbHRlciBmaWx0ZXIpIHsKLQkJdGhpcy5maWx0ZXIgPSBmaWx0ZXI7Ci0JfQotCi0JcHJvdGVjdGVkIE9iamVjdCBnZXRPYmplY3QoRGVzY3JpcHRvciBkZXNjcmlwdG9yKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldEVDbGFzc2VzKCkgewotCQlyZXR1cm4gUHJvY2Vzc1V0aWwuZ2V0UEJTRWNsYXNzZXMoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaXRlbXNmaWx0ZXIvUEJTSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaXRlbXNmaWx0ZXIvUEJTSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjhhMTkxZi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL1BCU0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotCi0vKioKLSAqIFRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGJyZWFrIGRvd24gZWxlbWVudHMgaW4gdGhlIFdvcmsgUHJvZHVjdCBVc2FnZQotICogcGFnZSBvZiBhIFByb2Nlc3MgZWRpdG9yLgotICogCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFBCU0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5IGV4dGVuZHMKLQkJb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLlBCU0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5IHsKLQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUFjdGl2aXR5QWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBQQlNBY3Rpdml0eUl0ZW1Qcm92aWRlcih0aGlzKTsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVDYXBhYmlsaXR5UGF0dGVybkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgUEJTUHJvY2Vzc0l0ZW1Qcm92aWRlcih0aGlzLCAoSXRlbVByb3ZpZGVyQWRhcHRlcikgc3VwZXIKLQkJCQkuY3JlYXRlQ2FwYWJpbGl0eVBhdHRlcm5BZGFwdGVyKCkpOwotCX0KLQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZURlbGl2ZXJ5UHJvY2Vzc0FkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgUEJTUHJvY2Vzc0l0ZW1Qcm92aWRlcih0aGlzLCAoSXRlbVByb3ZpZGVyQWRhcHRlcikgc3VwZXIKLQkJCQkuY3JlYXRlRGVsaXZlcnlQcm9jZXNzQWRhcHRlcigpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaXRlbXNmaWx0ZXIvUEJTUHJvY2Vzc0l0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9QQlNQcm9jZXNzSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjYmNjMGEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9QQlNQcm9jZXNzSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklDb25maWd1cmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotCi0vKioKLSAqIFRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIHByb2Nlc3NlcyBpbiB0aGUgV29yayBQcm9kdWN0IFVzYWdlIHBhZ2UKLSAqIG9mIGEgUHJvY2VzcyBlZGl0b3IuCi0gKiAKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUEJTUHJvY2Vzc0l0ZW1Qcm92aWRlciBleHRlbmRzIFBCU0FjdGl2aXR5SXRlbVByb3ZpZGVyIGltcGxlbWVudHMKLQkJSUNvbmZpZ3VyYWJsZSB7Ci0KLQlwcml2YXRlIEl0ZW1Qcm92aWRlckFkYXB0ZXIgZGVsZWdhdGVJdGVtUHJvdmlkZXI7Ci0KLQlwcml2YXRlIElGaWx0ZXIgZmlsdGVyOwotCi0JcHVibGljIFBCU1Byb2Nlc3NJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksCi0JCQlJdGVtUHJvdmlkZXJBZGFwdGVyIGRlbGVnYXRlSXRlbVByb3ZpZGVyKSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQkJdGhpcy5kZWxlZ2F0ZUl0ZW1Qcm92aWRlciA9IGRlbGVnYXRlSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5BY3Rpdml0eUl0ZW1Qcm92aWRlciNnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9IGRlbGVnYXRlSXRlbVByb3ZpZGVyCi0JCQkJCS5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJQ29sbGVjdGlvbiBjb2wgPSBzdXBlci5nZXRDaGlsZHJlbihvYmplY3QpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjb2wuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgY2hpbGQgPSBpdGVyLm5leHQoKTsKLQkJCWlmIChmaWx0ZXIgIT0gbnVsbCkgewotCQkJCWlmICghZmlsdGVyLmFjY2VwdChjaGlsZCkpCi0JCQkJCWl0ZXIucmVtb3ZlKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGNvbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRGaWx0ZXIoSUZpbHRlciBmaWx0ZXIpIHsKLQkJc3VwZXIuc2V0RmlsdGVyKGZpbHRlcik7Ci0JCXRoaXMuZmlsdGVyID0gZmlsdGVyOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaXRlbXNmaWx0ZXIvUHJvY2Vzc0NvbXBvbmVudEl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9Qcm9jZXNzQ29tcG9uZW50SXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyOGM5NmUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9Qcm9jZXNzQ29tcG9uZW50SXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklTdGF0ZWZ1bEl0ZW1Qcm92aWRlcjsKLQotLyoqCi0gKiBUaGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHByb2Nlc3MgY29tcG9uZW50IGluIHRoZSBtZXRob2QgZWxlbWVudAotICogc2VsZWN0aW9uIGRpYWxvZ3MuCi0gKiAKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUHJvY2Vzc0NvbXBvbmVudEl0ZW1Qcm92aWRlciBleHRlbmRzCi0JCW9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5Qcm9jZXNzQ29tcG9uZW50SXRlbVByb3ZpZGVyIGltcGxlbWVudHMKLQkJSUNvbmZpZ3VyYWJsZSwgSVN0YXRlZnVsSXRlbVByb3ZpZGVyIHsKLQotCXByaXZhdGUgSUZpbHRlciBmaWx0ZXI7Ci0KLQlwdWJsaWMgUHJvY2Vzc0NvbXBvbmVudEl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RmlsdGVyKElGaWx0ZXIgZmlsdGVyKSB7Ci0JCXRoaXMuZmlsdGVyID0gZmlsdGVyOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldExhYmVsKFN0cmluZyBsYWJlbCkgewotCX0KLQotCXB1YmxpYyB2b2lkIHNldFBhcmVudChPYmplY3QgcGFyZW50KSB7Ci0JfQotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlDb2xsZWN0aW9uIGNoaWxkcmVuID0gc3VwZXIuZ2V0Q2hpbGRyZW4ob2JqZWN0KTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gY2hpbGRyZW4uaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgY2hpbGQgPSBpdGVyLm5leHQoKTsKLQkJCWlmICghZmlsdGVyLmFjY2VwdChjaGlsZCkpCi0JCQkJaXRlci5yZW1vdmUoKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW47Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL1Byb2Nlc3NQYWNrYWdlSXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL1Byb2Nlc3NQYWNrYWdlSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlYjJiMDguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9Qcm9jZXNzUGFja2FnZUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc1BhY2thZ2U7Ci0KLS8qKgotICogVGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSBwcm9jZXNzIHBhY2thZ2UgaW4gdGhlIG1ldGhvZCBlbGVtZW50Ci0gKiBzZWxlY3Rpb24gZGlhbG9ncy4KLSAqIAotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9jZXNzUGFja2FnZUl0ZW1Qcm92aWRlciBleHRlbmRzCi0JCW9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQubmF2aWdhdG9yLlByb2Nlc3NQYWNrYWdlSXRlbVByb3ZpZGVyIGltcGxlbWVudHMKLQkJSUNvbmZpZ3VyYWJsZSB7Ci0KLQlwcml2YXRlIElGaWx0ZXIgZmlsdGVyOwotCi0JLy9wcml2YXRlIE9iamVjdCBwYXJlbnQ7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqIAotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqLwotCXB1YmxpYyBQcm9jZXNzUGFja2FnZUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldENoaWxkcmVuKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlDb2xsZWN0aW9uIGNoaWxkcmVuID0gZ2V0Q2hpbGRyZW5JbmNsdWRpbmdFbXB0eU9iamVjdHMob2JqZWN0KTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gY2hpbGRyZW4uaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlpZiAoaXNFbXB0eVBhY2thZ2UoaXRlci5uZXh0KCkpKSB7Ci0JCQkJaXRlci5yZW1vdmUoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gY2hpbGRyZW47Ci0JfQotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uIGdldENoaWxkcmVuSW5jbHVkaW5nRW1wdHlPYmplY3RzKE9iamVjdCBvYmplY3QpIHsKLQkJQXJyYXlMaXN0IGNvbCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJQ29sbGVjdGlvbiBjaGlsZHJlbiA9IHN1cGVyLmdldENoaWxkcmVuKG9iamVjdCk7Ci0JCWlmIChmaWx0ZXIgIT0gbnVsbCkgewotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gY2hpbGRyZW4uaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyLm5leHQoKTsKLQkJCQlPYmplY3QgY2hpbGQgPSBlbGVtZW50OwotCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkgewotCQkJCQljaGlsZCA9ICgoUHJvY2Vzc0NvbXBvbmVudCkgZWxlbWVudCkuZ2V0UHJvY2VzcygpOwotCQkJCX0KLQkJCQlpZiAoIWZpbHRlci5hY2NlcHQoY2hpbGQpKSB7Ci0JCQkJCWl0ZXIucmVtb3ZlKCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJY29sLmFkZChjaGlsZCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBjb2w7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIG9iamVjdAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNFbXB0eVBhY2thZ2UoT2JqZWN0IG9iamVjdCkgewotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudAotCQkJCXx8ICEob2JqZWN0IGluc3RhbmNlb2YgUHJvY2Vzc1BhY2thZ2UpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlDb2xsZWN0aW9uIGNoaWxkcmVuID0gdGhpcy5nZXRDaGlsZHJlbkluY2x1ZGluZ0VtcHR5T2JqZWN0cyhvYmplY3QpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjaGlsZHJlbi5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCWlmICghaXNFbXB0eVBhY2thZ2UoaXRlci5uZXh0KCkpKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8vIHByaXZhdGUgYm9vbGVhbiBhbnlQcm9jZXNzQ29tcG9uZW50KE9iamVjdCBwYXJlbnRQcm9jZXNQYWNrYWdlKSB7Ci0JLy8gTGlzdCBsaXN0ID0gKChQcm9jZXNzUGFja2FnZSkgcGFyZW50UHJvY2VzUGFja2FnZSkuZ2V0UHJvY2Vzc0VsZW1lbnRzKCk7Ci0JLy8gZm9yIChJdGVyYXRvciBpdG9yID0gbGlzdC5pdGVyYXRvcigpOyBpdG9yLmhhc05leHQoKTspIHsKLQkvLyBPYmplY3Qgb2JqID0gaXRvci5uZXh0KCk7Ci0JLy8gaWYgKG9iaiBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpIHsKLQkvLyBpZiAoZmlsdGVyLmFjY2VwdChvYmopKQotCS8vIHJldHVybiB0cnVlOwotCS8vIH0KLQkvLyB9Ci0JLy8gcmV0dXJuIGZhbHNlOwotCS8vIH0KLQotCXB1YmxpYyB2b2lkIHNldEZpbHRlcihJRmlsdGVyIGZpbHRlcikgewotCQl0aGlzLmZpbHRlciA9IGZpbHRlcjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRMYWJlbChTdHJpbmcgbGFiZWwpIHsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRQYXJlbnQoT2JqZWN0IHBhcmVudCkgewotCQkvL3RoaXMucGFyZW50ID0gcGFyZW50OwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9Qcm9jZXNzZXNJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaXRlbXNmaWx0ZXIvUHJvY2Vzc2VzSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3MzI0ZDUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9Qcm9jZXNzZXNJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklDb25maWd1cmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUdyb3VwQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5lbGVtZW50LklFbGVtZW50SXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Nb2RlbFN0cnVjdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuVW1hRWRpdFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLQotLyoqCi0gKiBUaGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciB0aGUgIlByb2Nlc3NlcyIgZm9sZGVyIGluIHRoZSBtZXRob2QgZWxlbWVudAotICogc2VsZWN0aW9uIGRpYWxvZ3MuCi0gKiAKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUHJvY2Vzc2VzSXRlbVByb3ZpZGVyIGV4dGVuZHMgSXRlbVByb3ZpZGVyQWRhcHRlciBpbXBsZW1lbnRzCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsCi0JCUlJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSwKLQkJSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLCBJRWxlbWVudEl0ZW1Qcm92aWRlciwgSUdyb3VwQ29udGFpbmVyLAotCQlJQ29uZmlndXJhYmxlIHsKLQotCXByaXZhdGUgTWFwIGdyb3VwSXRlbVByb3ZpZGVyTWFwOwotCi0JcHJvdGVjdGVkIEFycmF5TGlzdCBjaGlsZHJlbjsKLQotCXByb3RlY3RlZCBNZXRob2RQbHVnaW4gcGx1Z2luOwotCi0JcHJpdmF0ZSBJRmlsdGVyIGZpbHRlcjsKLQotCS8qKgotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqLwotCXB1YmxpYyBQcm9jZXNzZXNJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqIEBwYXJhbSBNZXRob2RQbHVnaW4KLQkgKiBAcGFyYW0gTW9kZWxTdHJ1Y3R1cmUKLQkgKiAKLQkgKiBQbHVnaW4gaXMgcmVxdWlyZWQgdG8gcGFzcywgdXNlZCBpbiBmaW5kaW5nIE1ldGhvZFBhY2thZ2UgZm9yIHBhcnRpY3VsYXIKLQkgKiBNb2RlbFN0cnVjdHVyZSwgTW9kZWxTdHJ1Y3R1cmUgaXMgb3B0aW9uYWwuCi0JICovCi0JcHVibGljIFByb2Nlc3Nlc0l0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwKLQkJCU1ldGhvZFBsdWdpbiBwbHVnaW4pIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCQl0aGlzLnBsdWdpbiA9IHBsdWdpbjsKLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlbiA9PSBudWxsKSB7Ci0JCQljaGlsZHJlbiA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWdyb3VwSXRlbVByb3ZpZGVyTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJCVN0cmluZ1tdIG5hbWVzID0gbmV3IFN0cmluZ1tdIHsKLQkJCQkJTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJCQkuZ2V0U3RyaW5nKCJfVUlfQ2FwYWJpbGl0eVBhdHRlcm5zX3RleHQiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkJCS5nZXRTdHJpbmcoIl9VSV9EZWxpdmVyeVByb2Nlc3Nlc190ZXh0IiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJCQkuZ2V0U3RyaW5nKCJfVUlfUHJvY2Vzc0NvbnRyaWJ1dGlvbnNfdGV4dCIpIH07IC8vJE5PTi1OTFMtMSQKLQkJCVN0cmluZ1tdW10gcHJvY2Vzc1BhdGhzID0gbmV3IFN0cmluZ1tdW10gewotCQkJCQlNb2RlbFN0cnVjdHVyZS5ERUZBVUxULmNhcGFiaWxpdHlQYXR0ZXJuUGF0aCwKLQkJCQkJTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC5kZWxpdmVyeVByb2Nlc3NQYXRoLAotCQkJCQlNb2RlbFN0cnVjdHVyZS5ERUZBVUxULnByb2Nlc3NDb250cmlidXRpb25QYXRoIH07Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHByb2Nlc3NQYXRocy5sZW5ndGg7IGkrKykgewotCQkJCVByb2Nlc3NQYWNrYWdlIHBrZzEgPSAoUHJvY2Vzc1BhY2thZ2UpIFVtYVV0aWwKLQkJCQkJCS5maW5kTWV0aG9kUGFja2FnZShwbHVnaW4sIHByb2Nlc3NQYXRoc1tpXSk7Ci0JCQkJaWYgKHBrZzEgIT0gbnVsbCkgewotCQkJCQlPYmplY3QgaW1hZ2UgPSBVbWFFZGl0UGx1Z2luLmdldFBsdWdpbigpLmdldEltYWdlKAotCQkJCQkJCSJmdWxsL29iajE2L1Byb2Nlc3NDb21wb25lbnQiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlDYXRlZ29yaXplZFByb2Nlc3Nlc0l0ZW1Qcm92aWRlciBpdGVtUHJvdmlkZXIgPSBuZXcgQ2F0ZWdvcml6ZWRQcm9jZXNzZXNJdGVtUHJvdmlkZXIoCi0JCQkJCQkJYWRhcHRlckZhY3RvcnksIHBrZzEsIG5hbWVzW2ldLCBpbWFnZSk7Ci0JCQkJCWl0ZW1Qcm92aWRlci5zZXRGaWx0ZXIoZmlsdGVyKTsKLQkJCQkJY2hpbGRyZW4uYWRkKGl0ZW1Qcm92aWRlcik7Ci0JCQkJfQotCQkJfQotCi0JCX0KLQotCQlyZXR1cm4gY2hpbGRyZW47Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9Qcm9jZXNzZXMiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9Qcm9jZXNzZXNfZ3JvdXAiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JR3JvdXBDb250YWluZXIjZ2V0R3JvdXBJdGVtUHJvdmlkZXIoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEdyb3VwSXRlbVByb3ZpZGVyKFN0cmluZyBuYW1lKSB7Ci0JCXJldHVybiBncm91cEl0ZW1Qcm92aWRlck1hcC5nZXQobmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RmlsdGVyKElGaWx0ZXIgZmlsdGVyKSB7Ci0JCXRoaXMuZmlsdGVyID0gZmlsdGVyOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldExhYmVsKFN0cmluZyBsYWJlbCkgewotCX0KLQotCXB1YmxpYyB2b2lkIHNldFBhcmVudChPYmplY3QgcGFyZW50KSB7Ci0JfQotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0TmV3Q2hpbGREZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0LAotCQkJRWRpdGluZ0RvbWFpbiBlZGl0aW5nRG9tYWluLCBPYmplY3Qgc2libGluZykgewotCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaXRlbXNmaWx0ZXIvUm9sZVNldEdyb3VwaW5nSXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL1JvbGVTZXRHcm91cGluZ0l0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOTM5YzBjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaXRlbXNmaWx0ZXIvUm9sZVNldEdyb3VwaW5nSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JTGlicmFyeUl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklTdGF0ZWZ1bEl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbmZpZ3VyYXRpb24uQ2F0ZWdvcmllc0l0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuTW9kZWxTdHJ1Y3R1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZVNldEdyb3VwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiBUaGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciB0aGUgIlJvbGUgU2V0cyIgZm9sZGVycyBpbiB0aGUgbWV0aG9kIGVsZW1lbnQKLSAqIHNlbGVjdGlvbiBkaWFsb2dzLgotICogCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFJvbGVTZXRHcm91cGluZ0l0ZW1Qcm92aWRlciBleHRlbmRzCi0JCW9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuUm9sZVNldEdyb3VwaW5nSXRlbVByb3ZpZGVyIGltcGxlbWVudHMKLQkJSUNvbmZpZ3VyYWJsZSwgSUxpYnJhcnlJdGVtUHJvdmlkZXIsIElTdGF0ZWZ1bEl0ZW1Qcm92aWRlciB7Ci0KLQlwcml2YXRlIElGaWx0ZXIgZmlsdGVyOwotCi0JcHJpdmF0ZSBJQ29uZmlndXJhdG9yIGNvbmZpZ3VyYXRvcjsKLQotCXByaXZhdGUgT2JqZWN0IHBhcmVudDsKLQotCS8qKgotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqLwotCXB1YmxpYyBSb2xlU2V0R3JvdXBpbmdJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRDaGlsZHJlbkZlYXR1cmVzKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5GZWF0dXJlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlbkZlYXR1cmVzID09IG51bGwpIHsKLQkJCWNoaWxkcmVuRmVhdHVyZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQljaGlsZHJlbkZlYXR1cmVzLmFkZChVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkuZ2V0Um9sZVNldEdyb3VwaW5nX1JvbGVTZXRzKCkpOwotCQl9Ci0JCXJldHVybiBjaGlsZHJlbkZlYXR1cmVzOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJQ29sbGVjdGlvbiBjaGlsZHJlbjsKLQkJT2JqZWN0IHBhcmVudCA9IGdldFBhcmVudChvYmplY3QpOwotCQlpZiAocGFyZW50IGluc3RhbmNlb2YgQ2F0ZWdvcmllc0l0ZW1Qcm92aWRlcikgewotCi0JCQkvLyBUT0RPOiBjb21tZW50ZWQgb3V0IHVudGlsIEppbmh1YSBmaXhlZCBidWdzIGluCi0JCQkvLyBDb25maWd1cmF0aW9uRmlsdGVyCi0JCQlpZiAoY29uZmlndXJhdG9yICE9IG51bGwpIHsKLQkJCQljaGlsZHJlbiA9IGNvbmZpZ3VyYXRvci5nZXRDaGlsZHJlbihvYmplY3QsCi0JCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRSb2xlU2V0R3JvdXBpbmdfUm9sZVNldHMoKSk7Ci0JCQkJaWYgKGNoaWxkcmVuICE9IG51bGwpIHsKLQkJCQkJU3lzdGVtLm91dAotCQkJCQkJCS5wcmludGxuKCJSb2xlU2V0R3JvdXBpbmdJdGVtUHJvdmlkZXIuZ2V0Q2hpbGRyZW4oKTogcmV0dXJuZWQgZnJvbSBjb25maWd1cmF0b3I6ICIgKyBjaGlsZHJlbik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJcmV0dXJuIGNoaWxkcmVuOwotCQkJCX0KLQkJCX0KLQotCQkJY2hpbGRyZW4gPSBzdXBlci5nZXRDaGlsZHJlbihvYmplY3QpOwotCQkJUm9sZVNldEdyb3VwaW5nIGdyb3VwaW5nID0gKFJvbGVTZXRHcm91cGluZykgb2JqZWN0OwotCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBtZXRob2RDb25mID0gKE1ldGhvZENvbmZpZ3VyYXRpb24pICgoQ2F0ZWdvcmllc0l0ZW1Qcm92aWRlcikgZ2V0UGFyZW50KG9iamVjdCkpCi0JCQkJCS5nZXRUYXJnZXQoKTsKLQkJCVRuZ1V0aWwuYWRkRXh0ZW5kZWRDaGlsZHJlbihncm91cGluZywgbWV0aG9kQ29uZiwgY2hpbGRyZW4sCi0JCQkJCU1vZGVsU3RydWN0dXJlLkRFRkFVTFQucm9sZVNldFBhdGgpOwotCi0JCQkvLyBzZXQgcGFyZW50Ci0JCQkvLwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gY2hpbGRyZW4uaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IGFkYXB0ZXIgPSBhZGFwdGVyRmFjdG9yeS5hZGFwdChpdGVyLm5leHQoKSwKLQkJCQkJCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCQkJaWYgKGFkYXB0ZXIgaW5zdGFuY2VvZiBJTGlicmFyeUl0ZW1Qcm92aWRlcikgewotCQkJCQkoKElMaWJyYXJ5SXRlbVByb3ZpZGVyKSBhZGFwdGVyKS5zZXRQYXJlbnQodGhpcyk7Ci0JCQkJfQotCQkJfQotCi0JCQlyZXR1cm4gY2hpbGRyZW47Ci0JCX0gZWxzZSB7Ci0JCQlDb2xsZWN0aW9uIGNoaWxkcmVuQ29sID0gc3VwZXIuZ2V0Q2hpbGRyZW4ob2JqZWN0KTsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGNoaWxkcmVuQ29sLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBjaGlsZCA9IGl0ZXIubmV4dCgpOwotCQkJCUl0ZW1Qcm92aWRlckFkYXB0ZXIgY29udGVudEFkYXB0ZXIgPSAoSXRlbVByb3ZpZGVyQWRhcHRlcikgYWRhcHRlckZhY3RvcnkKLQkJCQkJCS5hZGFwdChjaGlsZCwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCQlpZiAoY29udGVudEFkYXB0ZXIgaW5zdGFuY2VvZiBJTGlicmFyeUl0ZW1Qcm92aWRlcikgewotCQkJCQkoKElMaWJyYXJ5SXRlbVByb3ZpZGVyKSBjb250ZW50QWRhcHRlcikuc2V0UGFyZW50KG9iamVjdCk7Ci0JCQkJfQotCQkJCWlmIChmaWx0ZXIgIT0gbnVsbCkKLQkJCQkJaWYgKCFmaWx0ZXIuYWNjZXB0KGNoaWxkKSkKLQkJCQkJCWl0ZXIucmVtb3ZlKCk7Ci0JCQl9Ci0JCQlyZXR1cm4gY2hpbGRyZW5Db2w7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LklDb25maWd1cmFibGUjc2V0RmlsdGVyKGNvbS5pYm0ubGlicmFyeS5lZGl0LklGaWx0ZXIpCi0JICovCi0JcHVibGljIHZvaWQgc2V0RmlsdGVyKElGaWx0ZXIgZmlsdGVyKSB7Ci0JCXRoaXMuZmlsdGVyID0gZmlsdGVyOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYWJsZSNzZXRMYWJlbChqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldExhYmVsKFN0cmluZyBsYWJlbCkgewotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYWJsZSNzZXRQYXJlbnQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQYXJlbnQoT2JqZWN0IHBhcmVudCkgewotCQl0aGlzLnBhcmVudCA9IHBhcmVudDsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChwYXJlbnQgIT0gbnVsbCkgewotCQkJcmV0dXJuIHBhcmVudDsKLQkJfQotCQkvLyBpZihvYmplY3QgaW5zdGFuY2VvZiBFT2JqZWN0KSB7Ci0JCS8vIE1ldGhvZFBsdWdpbiBwbHVnaW4gPSBVbWFVdGlsLmdldE1ldGhvZFBsdWdpbigoRU9iamVjdCkgb2JqZWN0KTsKLQkJLy8gaWYocGx1Z2luICE9IG51bGwpIHsKLQkJLy8gU3RyaW5nW10gcGF0aCA9IHsKLQkJLy8gVG5nRWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9Db250ZW50X2dyb3VwIikgLy8kTk9OLU5MUy0xJAotCQkvLyAsVG5nRWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9TdGFuZGFyZF9DYXRlZ29yaWVzX2dyb3VwIikKLQkJLy8gLy8kTk9OLU5MUy0xJAotCQkvLyAsVG5nRWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9Sb2xlX1NldHNfZ3JvdXAiKQotCQkvLyAvLyROT04tTkxTLTEkCi0JCS8vIH07Ci0JCS8vIE9iamVjdCBhZGFwdGVyID0KLQkJLy8gVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UuZ2V0SXRlbXNGaWx0ZXJfQWRhcHRlckZhY3RvcnkoZmlsdGVyKS5hZGFwdChwbHVnaW4sCi0JCS8vIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCS8vIC8vIElHcm91cENvbnRhaW5lciBncm91cHMgPSAoSUdyb3VwQ29udGFpbmVyKQotCQkvLyBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRS5nZXRJdGVtc0ZpbHRlcl9BZGFwdGVyRmFjdG9yeShmaWx0ZXIpLmFkYXB0KHBsdWdpbiwKLQkJLy8gSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJLy8gLy8gaW50IGk7Ci0JCS8vIC8vIGZvcihpID0gMDsgaSA8IHBhdGgubGVuZ3RoIC0gMTsgaSsrKSB7Ci0JCS8vIC8vIGdyb3VwcyA9IChJR3JvdXBDb250YWluZXIpIGdyb3Vwcy5nZXRHcm91cEl0ZW1Qcm92aWRlcihwYXRoW2ldKTsKLQkJLy8gLy8gaWYoZ3JvdXBzID09IG51bGwpIHJldHVybiBudWxsOwotCQkvLyAvLyB9Ci0JCS8vIC8vIHJldHVybiAoSXRlbVByb3ZpZGVyQWRhcHRlcikgZ3JvdXBzLmdldEdyb3VwSXRlbVByb3ZpZGVyKHBhdGhbaV0pOwotCQkvLyByZXR1cm4gVG5nVXRpbC5nZXRBZGFwdGVyKHBsdWdpbiwgcGF0aCk7Ci0JCS8vIC8vcmV0dXJuIGFkYXB0ZXI7Ci0JCS8vIH0KLQkJLy8gfQotCi0JCXJldHVybiBzdXBlci5nZXRQYXJlbnQob2JqZWN0KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaXRlbXNmaWx0ZXIvUm9sZVNldEl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9Sb2xlU2V0SXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiMWUzOGQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9Sb2xlU2V0SXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklMaWJyYXJ5SXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29uZmlndXJhdGlvbi5DYXRlZ29yaWVzSXRlbVByb3ZpZGVyOwotCi0vKioKLSAqIFRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEgcm9sZSBzZXQgaW4gdGhlIG1ldGhvZCBlbGVtZW50Ci0gKiBzZWxlY3Rpb24gZGlhbG9ncy4KLSAqIAotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBSb2xlU2V0SXRlbVByb3ZpZGVyIGV4dGVuZHMKLQkJb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb25maWd1cmF0aW9uLlJvbGVTZXRJdGVtUHJvdmlkZXIgaW1wbGVtZW50cwotCQlJQ29uZmlndXJhYmxlLCBJTGlicmFyeUl0ZW1Qcm92aWRlciB7Ci0KLQlwcml2YXRlIElGaWx0ZXIgZmlsdGVyOwotCi0JcHJpdmF0ZSBPYmplY3QgcGFyZW50OwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgUm9sZVNldEl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlDb2xsZWN0aW9uIGNvbCA9IENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JCU9iamVjdCBwYXJlbnQgPSBnZXRQYXJlbnQoZ2V0UGFyZW50KG9iamVjdCkpOwotCQlpZiAocGFyZW50IGluc3RhbmNlb2YgQ2F0ZWdvcmllc0l0ZW1Qcm92aWRlcikgewotCQkJY29sID0gc3VwZXIuZ2V0Q2hpbGRyZW4ob2JqZWN0KTsKLQkJCWlmIChmaWx0ZXIgIT0gbnVsbCkgewotCQkJCUZpbHRlclV0aWwuaXRlcmF0ZUNvbGxlY3Rpb24oY29sLCBmaWx0ZXIpOwotCQkJfQotCQl9IGVsc2UgewotCQkJLy8gY29sID0gc3VwZXIuZ2V0Q2hpbGRyZW4ob2JqZWN0KTsKLQkJCWlmIChmaWx0ZXIgaW5zdGFuY2VvZiBJQWxsRmlsdGVyCi0JCQkJCXx8IGZpbHRlciBpbnN0YW5jZW9mIElDYXRlZ29yeUZpbHRlcikgewotCQkJCXJldHVybiBjb2w7Ci0JCQl9Ci0JCQkvLyBJdGVtUHJvdmlkZXJBZGFwdGVyIGFkYXB0ZXIgPQotCQkJLy8gKEl0ZW1Qcm92aWRlckFkYXB0ZXIpKFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFKS5nZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKQotCQkJLy8gLmFkYXB0KG9iamVjdCwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCS8vIGNvbCA9IGFkYXB0ZXIuZ2V0Q2hpbGRyZW4ob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gY29sOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEZpbHRlcihJRmlsdGVyIGZpbHRlcikgewotCQl0aGlzLmZpbHRlciA9IGZpbHRlcjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRMYWJlbChTdHJpbmcgbGFiZWwpIHsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRQYXJlbnQoT2JqZWN0IHBhcmVudCkgewotCQl0aGlzLnBhcmVudCA9IHBhcmVudDsKLQkJc3VwZXIuc2V0UGFyZW50KHBhcmVudCk7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gcGFyZW50OwotCQkvLyByZXR1cm4gc3VwZXIuZ2V0UGFyZW50KG9iamVjdCk7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9WYXJpYWJpbGl0eUJhc2VFbGVtZW50RmlsdGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL1ZhcmlhYmlsaXR5QmFzZUVsZW1lbnRGaWx0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGI3MjI5MC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL1ZhcmlhYmlsaXR5QmFzZUVsZW1lbnRGaWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwOCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQXJ0aWZhY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DdXN0b21DYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByYWN0aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5Bc3NvY2lhdGlvbkhlbHBlcjsKLQotLyoqCi0gKiBUaGlzIGlzIGEgZmlsdGVyIGZvciB2YXJpYWJpbGl0eSBiYXNlIGVsZW1lbnQgc2VsZWN0aW9uLiBUaGUgZmlsdGVyIHdpbGwKLSAqIGNoZWNrIGlmIG9iamVjdCBjYW4gYmUgYWNjZXB0ZWQgYXMgdGhlIGJhc2UgZWxlbWVudCBvZiB0aGUgZmlsdGVyIG93bmVyLgotICogCi0gKiBGaWx0ZXIgcnVsZXM6Ci0gKiAKLSAqIDEuIFRoZSBlbGVtZW50IGl0c2VsZiBhbmQgaXQncyBnZW5lcmFsaXplcnMgKGNvbnRyaWJ1dG9yLCByZXBsYWNlciwgb3IKLSAqIGV4dGVuZGVyKSBzaG91bGQgYmUgZmlsdGVyZWQgb3V0Ci0gKiAyLiBBbnkgZWxlbWVudHMgaW4gdGhlIGNvbnRhaW5tZW50IGNoYWluIG9mIHRoZSBhYm92ZSwgc2hvdWxkIGJlIGZpbHRlcmVkCi0gKiBvdXQKLSAqIDMuIGlmIGFueSBvZiB0aGUgYmFzZSBlbGVtZW50cyBjYW4ndCBiZSBzZWxlY3RlZCwgdGhlbiB0aGlzIGVsZW1lbnQgY2FuJ3QKLSAqIGJlIHNlbGVjdGVkLgotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgVmFyaWFiaWxpdHlCYXNlRWxlbWVudEZpbHRlciBpbXBsZW1lbnRzCi0JCW9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlciB7Ci0KLQlwcml2YXRlIFZhcmlhYmlsaXR5RWxlbWVudCBlbGVtZW50OwotCi0JcHJpdmF0ZSBMaXN0IGJhZGd1eXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQlwdWJsaWMgVmFyaWFiaWxpdHlCYXNlRWxlbWVudEZpbHRlcihWYXJpYWJpbGl0eUVsZW1lbnQgZWxlbWVudCkgewotCQl0aGlzLmVsZW1lbnQgPSBlbGVtZW50OwotCi0JCS8vIGZpcnN0IG9mIGFsbCwgeW91IGNhbid0IHZhcnkgeW91cnNlbGYKLQkJYmFkZ3V5cy5hZGQoZWxlbWVudCk7Ci0KLQkJLy8gZ2V0IGFsbCBteSBnZW5lcmFsaXplcnMKLQkJSXRlcmF0b3IgaXQgPSBUbmdVdGlsLmdldEdlbmVyYWxpemVycyhlbGVtZW50KTsKLQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJVmFyaWFiaWxpdHlFbGVtZW50IHZlID0gKFZhcmlhYmlsaXR5RWxlbWVudCkgaXQubmV4dCgpOwotCQkJYmFkZ3V5cy5hZGQodmUpOwotCi0JCQkvLyB0aGUgY29udGFpbm1lbnQgY2hhaW4gb24gbXkgZ2VuZXJhbGl6ZXJzIGNhbid0IGJlIG15IGJhc2UKLQkJCWhhbmRsZUNvbnRhaW5tZW50Q2hhaW4odmUpOwotCQl9Ci0KLQkJLy8gZWxlbWVudCdzIGluIG15IGNoYWluIGNhbid0IGJlIG15IGJhc2UKLQkJaGFuZGxlQ29udGFpbm1lbnRDaGFpbihlbGVtZW50KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaGFuZGxlQ29udGFpbm1lbnRDaGFpbihWYXJpYWJpbGl0eUVsZW1lbnQgZSkgewotCQlpZiAoIWhhc0NvbnRhaW5tZW50RmVhdHVyZSgpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlpZiAoZSBpbnN0YW5jZW9mIEN1c3RvbUNhdGVnb3J5KSB7Ci0JCQlMaXN0IHJvb3RzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJbG9hZFJvb3RDdXN0b21DYXRlZ29yaWVzKChDdXN0b21DYXRlZ29yeSkgZSwgcm9vdHMpOwotCQkJYmFkZ3V5cy5hZGRBbGwocm9vdHMpOwotCQl9IGVsc2UgaWYgKGUgaW5zdGFuY2VvZiBEZWxpdmVyYWJsZSkgewotCQkJTGlzdCByb290cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWRlbGl2ZXJhYmxlUGFydHMoKERlbGl2ZXJhYmxlKSBlLCByb290cyk7Ci0JCQliYWRndXlzLmFkZEFsbChyb290cyk7Ci0JCX0gZWxzZSB7Ci0JCQkvLyBpZiB0aGUgZWxlbWVudCBoYXMgY29udGFpbm1lbnQgZmVhdHVyZSwKLQkJCS8vIHlvdSBjYW4ndCBzZWxlY3QgdGhlIGVsZW1lbnQgaW4gdGhlIGNvbnRhaW5tZW50IGNoYWluCi0JCQlFT2JqZWN0IHJvb3QgPSBnZXRDaGFpblJvb3QoZSk7Ci0JCQlpZiAoIWJhZGd1eXMuY29udGFpbnMocm9vdCkpIHsKLQkJCQliYWRndXlzLmFkZChyb290KTsKLQkJCX0KLQotCQkJLyoKLQkJCSAqIGhvbGQgb2ZmIGZvciBub3cgLy8gYWxzbyBvbmx5IG9uZSBlbGVtZW50IGluIGEgY2hhaW4gY2FuIGJlCi0JCQkgKiBzZWxlY3RlZCBhcyBiYXNlIC8vIHNvIGdldCBhbGwgdGhlIGJhc2UgZWxlbWVudHMgaW4gdGhlIGVsZW1lbnQKLQkJCSAqIGNoYWluLCBhbmQgYmxvY2sgdGhlIGVsZW1lbnQgY2hhaW4gb2YgdGhlIGJhc2UgZWxlbWVudHMKLQkJCSAqIGZpbHRlclVzZWRCYXNlQ2hhaW4oKFZhcmlhYmlsaXR5RWxlbWVudClyb290KTsgZm9yIChJdGVyYXRvciBpdCA9Ci0JCQkgKiByb290LmVBbGxDb250ZW50cygpOyBpdC5oYXNOZXh0KCk7ICkgeyBPYmplY3QgbyA9IGl0Lm5leHQoKTsgaWYgKAotCQkJICogby5nZXRDbGFzcygpLmlzSW5zdGFuY2UoZWxlbWVudCkgKSB7Ci0JCQkgKiBmaWx0ZXJVc2VkQmFzZUNoYWluKChWYXJpYWJpbGl0eUVsZW1lbnQpbyk7IH0gfQotCQkJICovCi0JCX0KLQotCX0KLQotCXByaXZhdGUgdm9pZCBkZWxpdmVyYWJsZVBhcnRzKERlbGl2ZXJhYmxlIGUsIExpc3Qgcm9vdHMpIHsKLQkJTGlzdCBsaXN0ID0gKChEZWxpdmVyYWJsZSkgZSkuZ2V0RGVsaXZlcmVkV29ya1Byb2R1Y3RzKCk7Ci0JCWlmIChsaXN0ICE9IG51bGwgJiYgbGlzdC5zaXplKCkgPiAwKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gbGlzdC5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IG9iaiA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgRGVsaXZlcmFibGUpIHsKLQkJCQkJcm9vdHMuYWRkKG9iaik7Ci0JCQkJCWRlbGl2ZXJhYmxlUGFydHMoKERlbGl2ZXJhYmxlKSBvYmosIHJvb3RzKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgbG9hZFJvb3RDdXN0b21DYXRlZ29yaWVzKEN1c3RvbUNhdGVnb3J5IGUsIExpc3Qgcm9vdHMpIHsKLQkJTGlzdCBjcyA9IEFzc29jaWF0aW9uSGVscGVyLmdldEN1c3RvbUNhdGVnb3JpZXMoZSk7Ci0JCWlmIChjcyAhPSBudWxsICYmIGNzLnNpemUoKSA+IDApIHsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBjcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJQ3VzdG9tQ2F0ZWdvcnkgY2MgPSAoQ3VzdG9tQ2F0ZWdvcnkpIGl0Lm5leHQoKTsKLQkJCQlpZiAoIVRuZ1V0aWwuaXNSb290Q3VzdG9tQ2F0ZWdvcnkoY2MpKSB7Ci0JCQkJCWxvYWRSb290Q3VzdG9tQ2F0ZWdvcmllcyhjYywgcm9vdHMpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWlmICghcm9vdHMuY29udGFpbnMoZSkpIHsKLQkJCQkJCXJvb3RzLmFkZChlKTsKLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoIXJvb3RzLmNvbnRhaW5zKGUpKSB7Ci0JCQlyb290cy5hZGQoZSk7Ci0JCX0KLQl9Ci0KLQkvLyBwcml2YXRlIHZvaWQgZmlsdGVyVXNlZEJhc2VDaGFpbihWYXJpYWJpbGl0eUVsZW1lbnQgZSkgewotCS8vIFZhcmlhYmlsaXR5RWxlbWVudCBiYXNlID0gZS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCk7Ci0JLy8gaWYgKGJhc2UgIT0gbnVsbCkgewotCS8vIC8vIGlmIHRoZSBlbGVtZW50IGNoYWluIGlzIHNlbGVjdGVkIGFzIGJhc2UgaW4gdGhlIGN1cnJlbnQgY2hhaW4sCi0JLy8gLy8gbm8gZWxlbWVudCBpbiB0aGF0IGNoYWluIGNhbiBiZSBmdXRoZXIgc2VsZWN0ZWQKLQkvLyBPYmplY3Qgcm9vdCA9IGdldENoYWluUm9vdChiYXNlKTsKLQkvLyBpZiAoIWJhZGd1eXMuY29udGFpbnMocm9vdCkpIHsKLQkvLyBiYWRndXlzLmFkZChyb290KTsKLQkvLyB9Ci0JLy8gfQotCS8vIH0KLQotCXByaXZhdGUgYm9vbGVhbiBoYXNDb250YWlubWVudEZlYXR1cmUoKSB7Ci0JCXJldHVybiBlbGVtZW50IGluc3RhbmNlb2YgRG9tYWluIHx8IGVsZW1lbnQgaW5zdGFuY2VvZiBDdXN0b21DYXRlZ29yeQotCQkJCXx8IGVsZW1lbnQgaW5zdGFuY2VvZiBBcnRpZmFjdCB8fCBlbGVtZW50IGluc3RhbmNlb2YgUHJhY3RpY2UKLQkJCQl8fCBlbGVtZW50IGluc3RhbmNlb2YgRGVsaXZlcmFibGU7Ci0JfQotCi0JcHJpdmF0ZSBFT2JqZWN0IGdldENoYWluUm9vdChNZXRob2RFbGVtZW50IGUpIHsKLQkJRU9iamVjdCByb290ID0gZTsKLQkJT2JqZWN0IHR5cGUgPSBlbGVtZW50LmdldFR5cGUoKTsKLQkJRU9iamVjdCBwYXJlbnQgPSBlOwotCQl3aGlsZSAoKHBhcmVudCA9IHBhcmVudC5lQ29udGFpbmVyKCkpICE9IG51bGwKLQkJCQkmJiAoKE1ldGhvZEVsZW1lbnQpIHBhcmVudCkuZ2V0VHlwZSgpID09IHR5cGUpIHsKLQkJCXJvb3QgPSBwYXJlbnQ7Ci0JCX0KLQotCQlyZXR1cm4gcm9vdDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoT2JqZWN0IG9iaikgewotCi0JCS8vIGFsd2F5cyBhY2NlcHQgcGFja2FnZXMKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIE1ldGhvZExpYnJhcnkgfHwgb2JqIGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luCi0JCQkJfHwgb2JqIGluc3RhbmNlb2YgTWV0aG9kUGFja2FnZQotCQkJCXx8IG9iaiBpbnN0YW5jZW9mIE1ldGhvZENvbmZpZ3VyYXRpb24pIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0KLQkJLy8gbXVzdCBiZSB2YXJpYWJpbGl0eSBlbGVtZW50IGFuZCBjYW4ndCBiZSBpdHNlbGYKLQkJaWYgKG9iaiA9PSBlbGVtZW50IHx8ICEob2JqIGluc3RhbmNlb2YgVmFyaWFiaWxpdHlFbGVtZW50KSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJLy8gbXVzdCBiZSB0aGUgc2FtZSB0eXBlCi0JCVZhcmlhYmlsaXR5RWxlbWVudCB2ZSA9IChWYXJpYWJpbGl0eUVsZW1lbnQpIG9iajsKLQkJaWYgKHZlLmdldFR5cGUoKSAhPSBlbGVtZW50LmdldFR5cGUoKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJLy8gY2FuJ3QgYmUgbXkgYW55IG9mIG15IGdlbmVyYWxpemVycwotCQlpZiAoYmFkZ3V5cy5jb250YWlucyhvYmopKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQkvLyBpZiB0aGlzIGVsZW1lbnQncyBiYXNlIGNoYWluIGlzIGEgYmFkZ3V5LCBjYW4ndCBhY2NlcHQsIG90aGVyd2lzZSwgYQotCQkvLyBjaXJjdWxhciBsb2NrCi0JCXdoaWxlICgodmUgPSB2ZS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkpICE9IG51bGwpIHsKLQkJCWlmIChiYWRndXlzLmNvbnRhaW5zKHZlKSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCQkvLyBhbnl0aGluZyBlbHNlID8KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL3BhY2thZ2UuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaXRlbXNmaWx0ZXIvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MzMwNGMzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaXRlbXNmaWx0ZXIvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgaXRlbSBwcm92aWRlcnMgZm9yIGRpc3BsYXlpbmcgYW5kIGZpbHRlcmluZyBtZXRob2QgbGlicmFyeSBlbGVtZW50cy4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L25hdmlnYXRvci9BYnN0cmFjdFByb2Nlc3Nlc0l0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9uYXZpZ2F0b3IvQWJzdHJhY3RQcm9jZXNzZXNJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2I5MzBiZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L25hdmlnYXRvci9BYnN0cmFjdFByb2Nlc3Nlc0l0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQubmF2aWdhdG9yOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnByZWZlcmVuY2VzLklQcmVmZXJlbmNlU3RvcmVXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24ucHJlZmVyZW5jZXMuSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUdyb3VwQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5Qcm92aWRlcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5lbGVtZW50LklFbGVtZW50SXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Nb2RlbFN0cnVjdHVyZTsKLQotLyoqCi0gKiBUaGUgYWJzdHJhY3QgYmFzZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgY2xhc3MgZm9yIHRoZSAiUHJvY2Vzc2VzIiBmb2xkZXIgaW4KLSAqIHRoZSBMaWJyYXJ5IHZpZXcuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0UHJvY2Vzc2VzSXRlbVByb3ZpZGVyIGV4dGVuZHMgSXRlbVByb3ZpZGVyQWRhcHRlcgotCQlpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlLAotCQlJRWxlbWVudEl0ZW1Qcm92aWRlciwgSUdyb3VwQ29udGFpbmVyIHsKLQlwcm90ZWN0ZWQgTWFwIGdyb3VwSXRlbVByb3ZpZGVyTWFwOwotCi0JcHJvdGVjdGVkIE1vZGVsU3RydWN0dXJlIG1vZGVsU3RydWN0OwotCi0JcHJvdGVjdGVkIEFycmF5TGlzdCBjaGlsZHJlbjsKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBwcm9jZXNzQ29udHJpYnV0aW9uRW5hYmxlZCA9IGZhbHNlOwotCi0JcHJpdmF0ZSBJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcldyYXBwZXIgcHJlZlN0b3JlTGlzdGVuZXI7Ci0KLQkvKioKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgQWJzdHJhY3RQcm9jZXNzZXNJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksCi0JCQlNb2RlbFN0cnVjdHVyZSBtb2RlbFN0cnVjdCkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JCXRoaXMubW9kZWxTdHJ1Y3QgPSBtb2RlbFN0cnVjdDsKLQotCQkvLyBmaW5hbCBJUHJlZmVyZW5jZVN0b3JlIHByZWZTdG9yZSA9IFByb3ZpZGVycy5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQkJLy8gaWYgKHByZWZTdG9yZSAhPSBudWxsKSB7Ci0JCS8vIHByb2Nlc3NDb250cmlidXRpb25FbmFibGVkID0gcHJlZlN0b3JlCi0JCS8vIC5nZXRCb29sZWFuKExpYnJhcnlFZGl0Q29uc3RhbnRzLlBSRUZfRU5BQkxFX1BST0NFU1NfQ09OVFJJQlVUSU9OKTsKLQkJLy8gcHJlZlN0b3JlTGlzdGVuZXIgPSBuZXcgSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCS8vCi0JCS8vIHB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJLy8gaWYgKGV2ZW50LmdldFByb3BlcnR5KCkgPT0KLQkJLy8gTGlicmFyeUVkaXRDb25zdGFudHMuUFJFRl9FTkFCTEVfUFJPQ0VTU19DT05UUklCVVRJT04pIHsKLQkJLy8gYm9vbGVhbiBuZXdWYWx1ZSA9IHByZWZTdG9yZS5nZXRCb29sZWFuKGV2ZW50Ci0JCS8vIC5nZXRQcm9wZXJ0eSgpKTsKLQkJLy8gaWYgKHByb2Nlc3NDb250cmlidXRpb25FbmFibGVkICE9IG5ld1ZhbHVlKSB7Ci0JCS8vIHByb2Nlc3NDb250cmlidXRpb25FbmFibGVkID0gbmV3VmFsdWU7Ci0JCS8vIGZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24oCi0JCS8vIG5ldyBOb3RpZmljYXRpb25JbXBsKC0xLCAtMSwgLTEpLAotCQkvLyBBYnN0cmFjdFByb2Nlc3Nlc0l0ZW1Qcm92aWRlci50aGlzLCB0cnVlLAotCQkvLyBmYWxzZSkpOwotCQkvLyB9Ci0JCS8vIH0KLQkJLy8gfQotCQkvLwotCQkvLyB9OwotCQkvLyBwcmVmU3RvcmUuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihwcmVmU3RvcmVMaXN0ZW5lcik7Ci0JCS8vIH0KLQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlJUHJlZmVyZW5jZVN0b3JlV3JhcHBlciBwcmVmU3RvcmUgPSBQcm92aWRlcnMuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JCWlmIChwcmVmU3RvcmUgIT0gbnVsbCAmJiBwcmVmU3RvcmVMaXN0ZW5lciAhPSBudWxsKSB7Ci0JCQlwcmVmU3RvcmUucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihwcmVmU3RvcmVMaXN0ZW5lcik7Ci0JCX0KLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuSUdyb3VwQ29udGFpbmVyI2dldEdyb3VwSXRlbVByb3ZpZGVyKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRHcm91cEl0ZW1Qcm92aWRlcihTdHJpbmcgbmFtZSkgewotCQlyZXR1cm4gZ3JvdXBJdGVtUHJvdmlkZXJNYXAuZ2V0KG5hbWUpOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvUHJvY2Vzc2VzIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfUHJvY2Vzc2VzX2dyb3VwIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXROZXdDaGlsZERlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QsCi0JCQlFZGl0aW5nRG9tYWluIGVkaXRpbmdEb21haW4sIE9iamVjdCBzaWJsaW5nKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvbmF2aWdhdG9yL0NhcGFiaWxpdHlQYXR0ZXJuSXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L25hdmlnYXRvci9DYXBhYmlsaXR5UGF0dGVybkl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMDVmYzZlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvbmF2aWdhdG9yL0NhcGFiaWxpdHlQYXR0ZXJuSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lm5hdmlnYXRvcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotCi0vKioKLSAqIFRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEgY2FwYWJpbGl0eSBwYXR0ZXJuIGluIHRoZSBMaWJyYXJ5IHZpZXcuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIENhcGFiaWxpdHlQYXR0ZXJuSXRlbVByb3ZpZGVyIGV4dGVuZHMKLQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5DYXBhYmlsaXR5UGF0dGVybkl0ZW1Qcm92aWRlciB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBDYXBhYmlsaXR5UGF0dGVybkl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLAotCQkJT2JqZWN0IG9iamVjdCkgewotCi0JfQotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5GZWF0dXJlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBUbmdVdGlsCi0JCQkJLmdldExhYmVsKG9iamVjdCwgZ2V0U3RyaW5nKCJfVUlfQ2FwYWJpbGl0eVBhdHRlcm5fdHlwZSIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9uYXZpZ2F0b3IvQ29uZmlndXJhdGlvbnNJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvbmF2aWdhdG9yL0NvbmZpZ3VyYXRpb25zSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkY2JjNzUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9uYXZpZ2F0b3IvQ29uZmlndXJhdGlvbnNJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzOCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lm5hdmlnYXRvcjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UcmFuc2llbnRHcm91cEl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuTWV0aG9kRWxlbWVudENyZWF0ZUNoaWxkQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuTGlicmFyeUVkaXRDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLklWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLklWYWxpZGF0b3JGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0ZhbWlseTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIFRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIHRoZSAiQ29uZmlndXJhdGlvbnMiIGZvbGRlciBpbiB0aGUgTGlicmFyeQotICogdmlldy4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQ29uZmlndXJhdGlvbnNJdGVtUHJvdmlkZXIgZXh0ZW5kcyBUcmFuc2llbnRHcm91cEl0ZW1Qcm92aWRlciB7Ci0KLQkvLyBwcml2YXRlIE1ldGhvZExpYnJhcnkgbWV0aG9kTGlicmFyeTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIENvbmZpZ3VyYXRpb25zSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LAotCQkJTWV0aG9kTGlicmFyeSBsaWIsIFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5LCBsaWIsIG5hbWUpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhqYXZhLnV0aWwuQ29sbGVjdGlvbiwKLQkgKiAgICAgIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLAotCQkJT2JqZWN0IG9iamVjdCkgewotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRNZXRob2RMaWJyYXJ5X1ByZWRlZmluZWRDb25maWd1cmF0aW9ucygpLAotCQkJCVVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZU1ldGhvZENvbmZpZ3VyYXRpb24oKSkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRDaGlsZHJlbkZlYXR1cmVzKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5GZWF0dXJlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlbkZlYXR1cmVzID09IG51bGwpIHsKLQkJCWNoaWxkcmVuRmVhdHVyZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQljaGlsZHJlbkZlYXR1cmVzLmFkZChVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkuZ2V0TWV0aG9kTGlicmFyeV9QcmVkZWZpbmVkQ29uZmlndXJhdGlvbnMoKSk7Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuRmVhdHVyZXM7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0QXNDaGlsZChPYmplY3Qgb2JqKSB7Ci0JCXJldHVybiAhKG9iaiBpbnN0YW5jZW9mIFByb2Nlc3NGYW1pbHkpOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvQ29uZmlndXJhdGlvbnMiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuVHJhbnNpZW50R3JvdXBJdGVtUHJvdmlkZXIjZ2V0SW50ZXJlc3RlZEZlYXR1cmVJRCgpCi0JICovCi0JcHVibGljIGludCBnZXRJbnRlcmVzdGVkRmVhdHVyZUlEKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5NRVRIT0RfTElCUkFSWV9fUFJFREVGSU5FRF9DT05GSUdVUkFUSU9OUzsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LlRyYW5zaWVudEdyb3VwSXRlbVByb3ZpZGVyI3NldERlZmF1bHROYW1lKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGVmYXVsdE5hbWUoT2JqZWN0IG9iaikgewotCQlpZiAob2JqIGluc3RhbmNlb2YgTWV0aG9kQ29uZmlndXJhdGlvbikgewotCQkJVG5nVXRpbC5zZXREZWZhdWx0TmFtZSgoKE1ldGhvZExpYnJhcnkpIHRhcmdldCkKLQkJCQkJLmdldFByZWRlZmluZWRDb25maWd1cmF0aW9ucygpLCAoTWV0aG9kRWxlbWVudCkgb2JqLAotCQkJCQlMaWJyYXJ5RWRpdENvbnN0YW50cy5ORVdfQ09ORklHVVJBVElPTik7IAotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5UcmFuc2llbnRHcm91cEl0ZW1Qcm92aWRlciNnZXRJbnRlcmVzdGVkRmVhdHVyZUNsYXNzKCkKLQkgKi8KLQlwdWJsaWMgQ2xhc3MgZ2V0SW50ZXJlc3RlZEZlYXR1cmVPd25lckNsYXNzKCkgewotCQlyZXR1cm4gTWV0aG9kTGlicmFyeS5jbGFzczsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRyYW5zaWVudEdyb3VwSXRlbVByb3ZpZGVyI2NyZWF0ZUNyZWF0ZUNoaWxkQ29tbWFuZChvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbiwgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QsIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmUsIGphdmEubGFuZy5PYmplY3QsIGludCwgamF2YS51dGlsLkNvbGxlY3Rpb24pCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgY3JlYXRlQ3JlYXRlQ2hpbGRDb21tYW5kKEVkaXRpbmdEb21haW4gZG9tYWluLCBFT2JqZWN0IG93bmVyLCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgT2JqZWN0IHZhbHVlLCBpbnQgaW5kZXgsIENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlyZXR1cm4gbmV3IE1ldGhvZEVsZW1lbnRDcmVhdGVDaGlsZENvbW1hbmQoZG9tYWluLCAoRU9iamVjdCkgdGFyZ2V0LAotCQkJCWZlYXR1cmUsIHZhbHVlLCBpbmRleCwgY29sbGVjdGlvbiwgdGhpcykgewotCQkJLyogKG5vbi1KYXZhZG9jKQotCQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuTWV0aG9kRWxlbWVudENyZWF0ZUNoaWxkQ29tbWFuZCNnZXRWYWxpZGF0b3IoKQotCQkJICovCi0JCQlwcm90ZWN0ZWQgSVZhbGlkYXRvciBnZXRWYWxpZGF0b3IoKSB7Ci0JCQkJaWYoY2hpbGQgaW5zdGFuY2VvZiBNZXRob2RDb25maWd1cmF0aW9uKSB7Ci0JCQkJCXJldHVybiBJVmFsaWRhdG9yRmFjdG9yeS5JTlNUQU5DRS5jcmVhdGVOYW1lVmFsaWRhdG9yKG93bmVyLCAoTWV0aG9kQ29uZmlndXJhdGlvbiljaGlsZCk7Ci0JCQkJfQotCQkJCXJldHVybiBzdXBlci5nZXRWYWxpZGF0b3IoKTsKLQkJCX0KLQkJfTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L25hdmlnYXRvci9Db250ZW50SXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L25hdmlnYXRvci9Db250ZW50SXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1Y2MxMWUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9uYXZpZ2F0b3IvQ29udGVudEl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjY5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQubmF2aWdhdG9yOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRGlzcG9zYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JR3JvdXBDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JTGlicmFyeUl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY2F0ZWdvcnkuU3RhbmRhcmRDYXRlZ29yaWVzSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuZWxlbWVudC5JRWxlbWVudEl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuTW9kZWxTdHJ1Y3R1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkN1c3RvbUNhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5VbWFVdGlsOwotCi0vKioKLSAqIFRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIHRoZSAiTWV0aG9kIENvbnRlbnQiIGZvbGRlciBpbiB0aGUgTGlicmFyeQotICogdmlldy4KLSAqIDxwPgotICogVGhpcyBjbGFzcyB3aWxsIGJlIHJlbmFtZWQgYXMgIk1ldGhvZENvbnRlbnRJdGVtUHJvdmlkZXIiIGluIEVQRiBNNS4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQ29udGVudEl0ZW1Qcm92aWRlciBleHRlbmRzIEl0ZW1Qcm92aWRlckFkYXB0ZXIgaW1wbGVtZW50cwotCQlJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSwKLQkJSUVsZW1lbnRJdGVtUHJvdmlkZXIsIElHcm91cENvbnRhaW5lciB7Ci0KLQlwcm90ZWN0ZWQgTWV0aG9kUGx1Z2luIHBsdWdpbjsKLQotCXByb3RlY3RlZCBNb2RlbFN0cnVjdHVyZSBtb2RlbFN0cnVjdDsKLQotCXByb3RlY3RlZCBNYXAgZ3JvdXBJdGVtUHJvdmlkZXJNYXA7Ci0KLQlwcm90ZWN0ZWQgQXJyYXlMaXN0IGNoaWxkcmVuOwotCi0JcHJvdGVjdGVkIENvbnRlbnRQYWNrYWdlIGNvcmVDb250ZW50UGtnOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgQ29udGVudEl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwKLQkJCU1ldGhvZFBsdWdpbiBwbHVnaW4sIE1vZGVsU3RydWN0dXJlIG1vZGVsU3RydWN0KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQkJdGhpcy5wbHVnaW4gPSBwbHVnaW47Ci0JCXRoaXMubW9kZWxTdHJ1Y3QgPSBtb2RlbFN0cnVjdDsKLQl9Ci0JCi0JcHVibGljIENvbnRlbnRQYWNrYWdlIGdldENvcmVDb250ZW50UGFja2FnZSgpIHsKLQkJcmV0dXJuIGNvcmVDb250ZW50UGtnOwotCX0KLQkKLQlwdWJsaWMgTm90aWZpZXIgZ2V0VGFyZ2V0KCkgewotCQlyZXR1cm4gY29yZUNvbnRlbnRQa2c7Ci0JfQotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlpZiAoY2hpbGRyZW4gPT0gbnVsbCkgewotCQkJY2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlncm91cEl0ZW1Qcm92aWRlck1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCQlTdHJpbmcgbmFtZTsKLQkJCUlMaWJyYXJ5SXRlbVByb3ZpZGVyIGNoaWxkOwotCi0JCQkvLyBmaW5kIGNvcmUgY29udGVudCBwYWNrYWdlCi0JCQlDb250ZW50UGFja2FnZSBjb250ZW50UGtnID0gVW1hVXRpbC5maW5kQ29udGVudFBhY2thZ2UocGx1Z2luLAotCQkJCQltb2RlbFN0cnVjdC5jb3JlQ29udGVudFBhdGgpOwotCQkJY29yZUNvbnRlbnRQa2cgPSBjb250ZW50UGtnOwotCQkJaWYgKGNvbnRlbnRQa2cgIT0gbnVsbCkgewotCQkJCW5hbWUgPSBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkJLmdldFN0cmluZygiX1VJX01ldGhvZENvbnRlbnRfZ3JvdXAiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWNoaWxkID0gbmV3IE1ldGhvZFBhY2thZ2VzSXRlbVByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5LAotCQkJCQkJY29udGVudFBrZywgbmFtZSk7Ci0JCQkJY2hpbGQuc2V0UGFyZW50KHRoaXMpOwotCQkJCWNoaWxkcmVuLmFkZChjaGlsZCk7Ci0JCQkJZ3JvdXBJdGVtUHJvdmlkZXJNYXAucHV0KG5hbWUsIGNoaWxkKTsKLQotCQkJCS8vIGNvbnRlbnRQa2cgPSBVbWFVdGlsLmZpbmRDb250ZW50UGFja2FnZShwbHVnaW4sCi0JCQkJLy8gbW9kZWxTdHJ1Y3QuZGlzY2lwbGluZURlZmluaXRpb25QYXRoKTsKLQkJCQkvLyBpZihjb250ZW50UGtnICE9IG51bGwpIHsKLQkJCQkvLyBuYW1lID0KLQkJCQkvLyBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9EaXNjaXBsaW5lc19ncm91cCIpOwotCQkJCS8vIGNoaWxkID0gbmV3IERpc2NpcGxpbmVDYXRlZ29yaWVzSXRlbVByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5LAotCQkJCS8vIGNvbnRlbnRQa2csIG5hbWUpOwotCQkJCS8vIGNoaWxkLnNldFBhcmVudCh0aGlzKTsKLQkJCQkvLyBjaGlsZHJlbi5hZGQoY2hpbGQpOwotCQkJCS8vIGdyb3VwSXRlbVByb3ZpZGVyTWFwLnB1dChuYW1lLCBjaGlsZCk7Ci0JCQkJLy8gfQotCQkJCS8vCSAgICAgICAgCi0JCQkJLy8gY29udGVudFBrZyA9IFVtYVV0aWwuZmluZENvbnRlbnRQYWNrYWdlKHBsdWdpbiwKLQkJCQkvLyBtb2RlbFN0cnVjdC5kb21haW5QYXRoKTsKLQkJCQkvLyBpZihjb250ZW50UGtnICE9IG51bGwpIHsKLQkJCQkvLyBuYW1lID0KLQkJCQkvLyBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9Eb21haW5zX2dyb3VwIik7Ci0JCQkJLy8gY2hpbGQgPSBuZXcgRG9tYWluc0l0ZW1Qcm92aWRlcihhZGFwdGVyRmFjdG9yeSwgY29udGVudFBrZywKLQkJCQkvLyBuYW1lKTsKLQkJCQkvLyBjaGlsZC5zZXRQYXJlbnQodGhpcyk7Ci0JCQkJLy8gY2hpbGRyZW4uYWRkKGNoaWxkKTsKLQkJCQkvLyBncm91cEl0ZW1Qcm92aWRlck1hcC5wdXQobmFtZSwgY2hpbGQpOwotCQkJCS8vIH0KLQkJCQkvLwkKLQkJCQkvLyBjb250ZW50UGtnID0gVW1hVXRpbC5maW5kQ29udGVudFBhY2thZ2UocGx1Z2luLAotCQkJCS8vIG1vZGVsU3RydWN0LndvcmtQcm9kdWN0VHlwZVBhdGgpOwotCQkJCS8vIGlmKGNvbnRlbnRQa2cgIT0gbnVsbCkgewotCQkJCS8vIG5hbWUgPQotCQkJCS8vIExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX1dvcmtQcm9kdWN0VHlwZXNfZ3JvdXAiKTsKLQkJCQkvLyBjaGlsZCA9IG5ldyBXb3JrUHJvZHVjdFR5cGVzSXRlbVByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5LAotCQkJCS8vIGNvbnRlbnRQa2csIG5hbWUpOwotCQkJCS8vIGNoaWxkLnNldFBhcmVudCh0aGlzKTsKLQkJCQkvLyBjaGlsZHJlbi5hZGQoY2hpbGQpOwotCQkJCS8vIGdyb3VwSXRlbVByb3ZpZGVyTWFwLnB1dChuYW1lLCBjaGlsZCk7Ci0JCQkJLy8gfQotCQkJCS8vCSAgICAgICAgCi0JCQkJLy8gY29udGVudFBrZyA9IFVtYVV0aWwuZmluZENvbnRlbnRQYWNrYWdlKHBsdWdpbiwKLQkJCQkvLyBtb2RlbFN0cnVjdC5yb2xlU2V0UGF0aCk7Ci0JCQkJLy8gaWYoY29udGVudFBrZyAhPSBudWxsKSB7Ci0JCQkJLy8gbmFtZSA9Ci0JCQkJLy8gTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfUm9sZV9TZXRzX2dyb3VwIik7Ci0JCQkJLy8gY2hpbGQgPSBuZXcgUm9sZVNldHNJdGVtUHJvdmlkZXIoYWRhcHRlckZhY3RvcnksIGNvbnRlbnRQa2csCi0JCQkJLy8gbmFtZSk7Ci0JCQkJLy8gY2hpbGQuc2V0UGFyZW50KHRoaXMpOwotCQkJCS8vIGNoaWxkcmVuLmFkZChjaGlsZCk7Ci0JCQkJLy8gZ3JvdXBJdGVtUHJvdmlkZXJNYXAucHV0KG5hbWUsIGNoaWxkKTsKLQkJCQkvLyB9Ci0JCQkJLy8JICAgICAgICAKLQkJCQkvLyBjb250ZW50UGtnID0gVW1hVXRpbC5maW5kQ29udGVudFBhY2thZ2UocGx1Z2luLAotCQkJCS8vIG1vZGVsU3RydWN0LnRvb2xQYXRoKTsKLQkJCQkvLyBpZihjb250ZW50UGtnICE9IG51bGwpIHsKLQkJCQkvLyBuYW1lID0KLQkJCQkvLyBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9Ub29sc19ncm91cCIpOwotCQkJCS8vIGNoaWxkID0gbmV3IFRvb2xzSXRlbVByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5LCBjb250ZW50UGtnLAotCQkJCS8vIG5hbWUpOwotCQkJCS8vIGNoaWxkLnNldFBhcmVudCh0aGlzKTsKLQkJCQkvLyBjaGlsZHJlbi5hZGQoY2hpbGQpOwotCQkJCS8vIGdyb3VwSXRlbVByb3ZpZGVyTWFwLnB1dChuYW1lLCBjaGlsZCk7Ci0JCQkJLy8gfQotCi0JCQkJLy8gY3JlYXRlIHRoZSBzdGFuZGFyZCBjYXRlZ29yaWVzIGZvbGRlcgotCQkJCWNvbnRlbnRQa2cgPSBVbWFVdGlsLmZpbmRDb250ZW50UGFja2FnZShwbHVnaW4sCi0JCQkJCQltb2RlbFN0cnVjdC5zdGFuZGFyZENhdGVnb3J5UGF0aCk7Ci0JCQkJaWYgKGNvbnRlbnRQa2cgIT0gbnVsbCkgewotCQkJCQluYW1lID0gTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJCQkuZ2V0U3RyaW5nKCJfVUlfU3RhbmRhcmRfQ2F0ZWdvcmllc19ncm91cCIpOyAvLyROT04tTkxTLTEkCi0JCQkJCWNoaWxkID0gbmV3IFN0YW5kYXJkQ2F0ZWdvcmllc0l0ZW1Qcm92aWRlcihhZGFwdGVyRmFjdG9yeSwKLQkJCQkJCQljb250ZW50UGtnLCBuYW1lKTsKLQkJCQkJY2hpbGQuc2V0UGFyZW50KHRoaXMpOwotCQkJCQljaGlsZHJlbi5hZGQoY2hpbGQpOwotCQkJCQlncm91cEl0ZW1Qcm92aWRlck1hcC5wdXQobmFtZSwgY2hpbGQpOwotCQkJCX0KLQotCQkJCS8vIGNyZWF0ZSB0aGUgY3VzdG9tZSBjYXRlZ29yaWVzIGZvbGRlcgotCQkJCS8vIGNvbnRlbnRQa2cgPSBVbWFVdGlsLmZpbmRDb250ZW50UGFja2FnZShwbHVnaW4sCi0JCQkJLy8gbW9kZWxTdHJ1Y3QuY3VzdG9tQ2F0ZWdvcnlQYXRoKTsKLQkJCQkvLyBpZihjb250ZW50UGtnICE9IG51bGwpIHsKLQkJCQkvLyBuYW1lID0KLQkJCQkvLyBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9DdXN0b21fQ2F0ZWdvcmllc19ncm91cCIpOwotCQkJCS8vIGNoaWxkID0gbmV3IEN1c3RvbUNhdGVnb3JpZXNJdGVtUHJvdmlkZXIoYWRhcHRlckZhY3RvcnksCi0JCQkJLy8gY29udGVudFBrZywgbmFtZSk7Ci0JCQkJLy8gY2hpbGQuc2V0UGFyZW50KHRoaXMpOwotCQkJCS8vIGNoaWxkcmVuLmFkZChjaGlsZCk7Ci0JCQkJLy8gZ3JvdXBJdGVtUHJvdmlkZXJNYXAucHV0KG5hbWUsIGNoaWxkKTsKLQkJCQkvLyB9Ci0KLQkJCQlDdXN0b21DYXRlZ29yeSByb290Q3VzdG9tQ2F0ZWdvcnkgPSBUbmdVdGlsCi0JCQkJCQkuZ2V0Um9vdEN1c3RvbUNhdGVnb3J5KHBsdWdpbik7Ci0JCQkJaWYgKHJvb3RDdXN0b21DYXRlZ29yeSAhPSBudWxsKSB7Ci0JCQkJCWJvb2xlYW4gbm90aWZ5ID0gcm9vdEN1c3RvbUNhdGVnb3J5LmVEZWxpdmVyKCk7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlyb290Q3VzdG9tQ2F0ZWdvcnkuZVNldERlbGl2ZXIoZmFsc2UpOwotCQkJCQkJcm9vdEN1c3RvbUNhdGVnb3J5LnNldE5hbWUoTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJCQkJLmdldFN0cmluZygiX1VJX0N1c3RvbV9DYXRlZ29yaWVzX2dyb3VwIikpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0gZmluYWxseSB7Ci0JCQkJCQlyb290Q3VzdG9tQ2F0ZWdvcnkuZVNldERlbGl2ZXIobm90aWZ5KTsKLQkJCQkJfQotCQkJCQljaGlsZHJlbi5hZGQocm9vdEN1c3RvbUNhdGVnb3J5KTsKLQkJCQl9Ci0KLQkJCQkvLyBJQ29uZmlndXJhYmxlIGFkYXB0ZXIgPSAoSUNvbmZpZ3VyYWJsZSkKLQkJCQkvLyBUbmdVdGlsLmdldEJlc3RBZGFwdGVyRmFjdG9yeShhZGFwdGVyRmFjdG9yeSkuYWRhcHQoY29udGVudFBrZywKLQkJCQkvLyBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkJCS8vIGFkYXB0ZXIuc2V0TGFiZWwoTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfTWV0aG9kQ29udGVudF9ncm91cCIpKTsKLQkJCQkvLyBjaGlsZHJlbi5hZGQoY29udGVudFBrZyk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gY2hpbGRyZW47Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9Db250ZW50Iik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfQ29udGVudF9ncm91cCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5JR3JvdXBDb250YWluZXIjZ2V0R3JvdXBJdGVtUHJvdmlkZXIoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEdyb3VwSXRlbVByb3ZpZGVyKFN0cmluZyBuYW1lKSB7Ci0JCXJldHVybiBncm91cEl0ZW1Qcm92aWRlck1hcCAhPSBudWxsID8gZ3JvdXBJdGVtUHJvdmlkZXJNYXAuZ2V0KG5hbWUpCi0JCQkJOiBudWxsOwotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldE5ld0NoaWxkRGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCwKLQkJCUVkaXRpbmdEb21haW4gZWRpdGluZ0RvbWFpbiwgT2JqZWN0IHNpYmxpbmcpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gcGx1Z2luOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlpZiAoZ3JvdXBJdGVtUHJvdmlkZXJNYXAgIT0gbnVsbCkgewotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gZ3JvdXBJdGVtUHJvdmlkZXJNYXAudmFsdWVzKCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBhZGFwdGVyID0gaXRlci5uZXh0KCk7Ci0JCQkJaWYgKGFkYXB0ZXIgaW5zdGFuY2VvZiBJRGlzcG9zYWJsZSkgewotCQkJCQkoKElEaXNwb3NhYmxlKSBhZGFwdGVyKS5kaXNwb3NlKCk7Ci0JCQkJfQotCQkJfQotCQkJZ3JvdXBJdGVtUHJvdmlkZXJNYXAuY2xlYXIoKTsKLQkJCWdyb3VwSXRlbVByb3ZpZGVyTWFwID0gbnVsbDsKLQkJfQotCQlpZihjaGlsZHJlbiAhPSBudWxsKSB7Ci0JCQljaGlsZHJlbi5jbGVhcigpOwotCQl9Ci0JCXBsdWdpbiA9IG51bGw7Ci0JCWNvcmVDb250ZW50UGtnID0gbnVsbDsKLQkJCi0JCXN1cGVyLmRpc3Bvc2UoKTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L25hdmlnYXRvci9EZWxpdmVyeVByb2Nlc3NJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvbmF2aWdhdG9yL0RlbGl2ZXJ5UHJvY2Vzc0l0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZjFmYTc2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvbmF2aWdhdG9yL0RlbGl2ZXJ5UHJvY2Vzc0l0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5uYXZpZ2F0b3I7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLQotLyoqCi0gKiBUaGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIGRlbGl2ZXJ5IHByb2Nlc3MgaW4gdGhlIExpYnJhcnkgdmlldy4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRGVsaXZlcnlQcm9jZXNzSXRlbVByb3ZpZGVyIGV4dGVuZHMKLQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5EZWxpdmVyeVByb2Nlc3NJdGVtUHJvdmlkZXIgewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgRGVsaXZlcnlQcm9jZXNzSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsCi0JCQlPYmplY3Qgb2JqZWN0KSB7Ci0KLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbkZlYXR1cmVzKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIFRuZ1V0aWwuZ2V0TGFiZWwob2JqZWN0LCBnZXRTdHJpbmcoIl9VSV9EZWxpdmVyeVByb2Nlc3NfdHlwZSIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9uYXZpZ2F0b3IvSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvbmF2aWdhdG9yL0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyMzhlZWEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9uYXZpZ2F0b3IvSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lm5hdmlnYXRvcjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklEaXNwb3NhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JUmVmZXJlbmNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklTdGF0ZWZ1bEl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmJyZWFrZG93bmVsZW1lbnQuQWN0aXZpdHlJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5icmVha2Rvd25lbGVtZW50Lk1pbGVzdG9uZUl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNhdGVnb3J5LkN1c3RvbUNhdGVnb3J5SXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY2F0ZWdvcnkuRGlzY2lwbGluZUNhdGVnb3J5SXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY2F0ZWdvcnkuRGlzY2lwbGluZUl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNhdGVnb3J5LkRvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNhdGVnb3J5LlJvbGVTZXRDYXRlZ29yeUl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNhdGVnb3J5LlJvbGVTZXRJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jYXRlZ29yeS5Ub29sSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY2F0ZWdvcnkuV29ya1Byb2R1Y3RUeXBlSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuZWxlbWVudC5BcnRpZmFjdEl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmVsZW1lbnQuQ29udGVudERlc2NyaXB0aW9uSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuZWxlbWVudC5Db250ZW50UGFja2FnZUl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmVsZW1lbnQuR3VpZGFuY2VJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5lbGVtZW50LlJvbGVJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5lbGVtZW50LlNlY3Rpb25JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5lbGVtZW50LlRhc2tJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5lbGVtZW50LldvcmtQcm9kdWN0SXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Nb2RlbFN0cnVjdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLlVtYUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5OwotCi0vKioKLSAqIFRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZmFjdG9yeSBmb3IgdGhlIExpYnJhcnkgdmlldy4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkgZXh0ZW5kcyBVbWFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeQotCQlpbXBsZW1lbnRzIElSZWZlcmVuY2VyIHsKLQotCXByb3RlY3RlZCBXb3JrUHJvZHVjdEl0ZW1Qcm92aWRlciB3b3JrUHJvZHVjdEl0ZW1Qcm92aWRlcjsKLQotCXByb3RlY3RlZCBBcnRpZmFjdEl0ZW1Qcm92aWRlciBteUFydGlmYWN0SXRlbVByb3ZpZGVyOwotCi0JcHJvdGVjdGVkIEd1aWRhbmNlSXRlbVByb3ZpZGVyIGd1aWRhbmNlSXRlbVByb3ZpZGVyOwotCi0JcHJvdGVjdGVkIFdvcmtQcm9kdWN0SXRlbVByb3ZpZGVyIG15T3V0Y29tZUl0ZW1Qcm92aWRlcjsKLQotCXByb3RlY3RlZCBXb3JrUHJvZHVjdEl0ZW1Qcm92aWRlciBteURlbGl2ZXJhYmxlSXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogUmVmZXJlbmNlcyB0byBzdGF0ZWZ1bCBhZGFwdGVycyBjcmVhdGVkIGJ5IHRoaXMgYWRhcHRlciBmYWN0b3J5Ci0JICovCi0JcHJvdGVjdGVkIFNldCBkaXNwb3NhYmxlQWRhcHRlcnMgPSBuZXcgSGFzaFNldCgpOwotCi0JLy8gcHJvdGVjdGVkIENvbGxlY3Rpb24gYWRhcHRlcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuVW1hSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkjYWRhcHQob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXIsCi0JICogICAgICBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGFkYXB0KE5vdGlmaWVyIG5vdGlmaWVyLCBPYmplY3QgdHlwZSkgewotCQlBZGFwdGVyIGFkYXB0ZXIgPSBzdXBlci5hZGFwdChub3RpZmllciwgdHlwZSk7Ci0JCWlmIChhZGFwdGVyIGluc3RhbmNlb2YgSVN0YXRlZnVsSXRlbVByb3ZpZGVyCi0JCQkJJiYgbm90aWZpZXIgaW5zdGFuY2VvZiBFT2JqZWN0Ci0JCQkJJiYgKChFT2JqZWN0KSBub3RpZmllcikuZUNvbnRhaW5lcigpICE9IG51bGwpIHsKLQkJCWRpc3Bvc2FibGVBZGFwdGVycy5hZGQoYWRhcHRlcik7Ci0JCX0KLQkJcmV0dXJuIGFkYXB0ZXI7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQ29yZWNvbnRlbnRBZGFwdGVyRmFjdG9yeSNjcmVhdGVSb2xlQWRhcHRlcigpCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUm9sZUFkYXB0ZXIoKSB7Ci0JCWlmIChyb2xlSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCXJvbGVJdGVtUHJvdmlkZXIgPSBuZXcgUm9sZUl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCQlyZXR1cm4gcm9sZUl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5Db3JlY29udGVudEFkYXB0ZXJGYWN0b3J5I2NyZWF0ZVRhc2tBZGFwdGVyKCkKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVUYXNrQWRhcHRlcigpIHsKLQkJaWYgKHRhc2tJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJdGFza0l0ZW1Qcm92aWRlciA9IG5ldyBUYXNrSXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIHRhc2tJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuV29ya3Byb2R1Y3RzQWRhcHRlckZhY3RvcnkjY3JlYXRlQXJ0aWZhY3RBZGFwdGVyKCkKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVBcnRpZmFjdEFkYXB0ZXIoKSB7Ci0JCWlmIChteUFydGlmYWN0SXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCW15QXJ0aWZhY3RJdGVtUHJvdmlkZXIgPSBuZXcgQXJ0aWZhY3RJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gbXlBcnRpZmFjdEl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVXb3JrUHJvZHVjdEFkYXB0ZXIoKSB7Ci0JCWlmICh3b3JrUHJvZHVjdEl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQl3b3JrUHJvZHVjdEl0ZW1Qcm92aWRlciA9IG5ldyBXb3JrUHJvZHVjdEl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCQlyZXR1cm4gd29ya1Byb2R1Y3RJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuV29ya3Byb2R1Y3RzQWRhcHRlckZhY3RvcnkjY3JlYXRlRGVsaXZlcmFibGVBZGFwdGVyKCkKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVEZWxpdmVyYWJsZUFkYXB0ZXIoKSB7Ci0JCWlmIChteURlbGl2ZXJhYmxlSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCW15RGVsaXZlcmFibGVJdGVtUHJvdmlkZXIgPSBuZXcgV29ya1Byb2R1Y3RJdGVtUHJvdmlkZXIodGhpcywKLQkJCQkJKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIHN1cGVyLmNyZWF0ZURlbGl2ZXJhYmxlQWRhcHRlcigpKTsKLQkJfQotCi0JCXJldHVybiBteURlbGl2ZXJhYmxlSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLldvcmtwcm9kdWN0c0FkYXB0ZXJGYWN0b3J5I2NyZWF0ZU91dGNvbWVBZGFwdGVyKCkKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVPdXRjb21lQWRhcHRlcigpIHsKLQkJaWYgKG15T3V0Y29tZUl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlteU91dGNvbWVJdGVtUHJvdmlkZXIgPSBuZXcgV29ya1Byb2R1Y3RJdGVtUHJvdmlkZXIodGhpcywKLQkJCQkJKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIHN1cGVyLmNyZWF0ZU91dGNvbWVBZGFwdGVyKCkpOwotCQl9Ci0KLQkJcmV0dXJuIG15T3V0Y29tZUl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuVW1hSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkjY3JlYXRlTWV0aG9kQ29uZmlndXJhdGlvbkFkYXB0ZXIoKQotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZU1ldGhvZENvbmZpZ3VyYXRpb25BZGFwdGVyKCkgewotCQlpZiAobWV0aG9kQ29uZmlndXJhdGlvbkl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQltZXRob2RDb25maWd1cmF0aW9uSXRlbVByb3ZpZGVyID0gbmV3IE1ldGhvZENvbmZpZ3VyYXRpb25JdGVtUHJvdmlkZXIoCi0JCQkJCXRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIG1ldGhvZENvbmZpZ3VyYXRpb25JdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLlVtYUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5I2NyZWF0ZU1ldGhvZExpYnJhcnlBZGFwdGVyKCkKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVNZXRob2RMaWJyYXJ5QWRhcHRlcigpIHsKLQkJQWRhcHRlciBhZGFwdGVyID0gbmV3IE1ldGhvZExpYnJhcnlJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCS8vIGFkYXB0ZXJzLmFkZChhZGFwdGVyKTsKLQkJcmV0dXJuIGFkYXB0ZXI7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLlVtYUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5I2NyZWF0ZVByb2Nlc3NGYW1pbHlBZGFwdGVyKCkKLQkgKi8KLQkvKgotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVByb2Nlc3NGYW1pbHlBZGFwdGVyKCkgewotCQlpZiAocHJvY2Vzc0ZhbWlseUl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlwcm9jZXNzRmFtaWx5SXRlbVByb3ZpZGVyID0gbmV3IFByb2Nlc3NGYW1pbHlJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gcHJvY2Vzc0ZhbWlseUl0ZW1Qcm92aWRlcjsKLQl9Ci0JKi8KLQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUNvbnRlbnRQYWNrYWdlQWRhcHRlcigpIHsKLQkJQWRhcHRlciBhZGFwdGVyID0gbmV3IENvbnRlbnRQYWNrYWdlSXRlbVByb3ZpZGVyKHRoaXMpOwotCQkvLyBhZGFwdGVycy5hZGQoYWRhcHRlcik7Ci0JCXJldHVybiBhZGFwdGVyOwotCX0KLQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZU1ldGhvZFBsdWdpbkFkYXB0ZXIoKSB7Ci0JCU1ldGhvZFBsdWdpbkl0ZW1Qcm92aWRlciBhZGFwdGVyID0gbmV3IE1ldGhvZFBsdWdpbkl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJYWRhcHRlci5zZXRNb2RlbFN0cnVjdHVyZShNb2RlbFN0cnVjdHVyZS5ERUZBVUxUKTsKLQkJLy8gYWRhcHRlcnMuYWRkKGFkYXB0ZXIpOwotCQlyZXR1cm4gYWRhcHRlcjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5NZXRob2Rtb2RlbHNBZGFwdGVyRmFjdG9yeSNjcmVhdGVQcm9jZXNzQ29tcG9uZW50QWRhcHRlcigpCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUHJvY2Vzc0NvbXBvbmVudEFkYXB0ZXIoKSB7Ci0JCWlmIChwcm9jZXNzQ29tcG9uZW50SXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCXByb2Nlc3NDb21wb25lbnRJdGVtUHJvdmlkZXIgPSBuZXcgUHJvY2Vzc0NvbXBvbmVudEl0ZW1Qcm92aWRlcigKLQkJCQkJdGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gcHJvY2Vzc0NvbXBvbmVudEl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5NZXRob2Rtb2RlbHNBZGFwdGVyRmFjdG9yeSNjcmVhdGVQcm9jZXNzUGFja2FnZUFkYXB0ZXIoKQotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVByb2Nlc3NQYWNrYWdlQWRhcHRlcigpIHsKLQkJQWRhcHRlciBhZGFwdGVyID0gbmV3IFByb2Nlc3NQYWNrYWdlSXRlbVByb3ZpZGVyKHRoaXMpOwotCQkvLyBhZGFwdGVycy5hZGQoYWRhcHRlcik7Ci0JCXJldHVybiBhZGFwdGVyOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkNvbnRlbnRjYXRlZ29yaWVzQWRhcHRlckZhY3RvcnkjY3JlYXRlRGlzY2lwbGluZUdyb3VwaW5nQWRhcHRlcigpCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRGlzY2lwbGluZUdyb3VwaW5nQWRhcHRlcigpIHsKLQkJaWYgKGRpc2NpcGxpbmVHcm91cGluZ0l0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlkaXNjaXBsaW5lR3JvdXBpbmdJdGVtUHJvdmlkZXIgPSBuZXcgRGlzY2lwbGluZUNhdGVnb3J5SXRlbVByb3ZpZGVyKAotCQkJCQl0aGlzKTsKLQkJfQotCQlyZXR1cm4gZGlzY2lwbGluZUdyb3VwaW5nSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkNvbnRlbnRjYXRlZ29yaWVzQWRhcHRlckZhY3RvcnkjY3JlYXRlRG9tYWluQWRhcHRlcigpCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRG9tYWluQWRhcHRlcigpIHsKLQkJaWYgKGRvbWFpbkl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlkb21haW5JdGVtUHJvdmlkZXIgPSBuZXcgRG9tYWluSXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIGRvbWFpbkl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVSb2xlU2V0R3JvdXBpbmdBZGFwdGVyKCkgewotCQlBZGFwdGVyIGFkYXB0ZXIgPSBuZXcgUm9sZVNldENhdGVnb3J5SXRlbVByb3ZpZGVyKHRoaXMpOwotCQkvLyBhZGFwdGVycy5hZGQoYWRhcHRlcik7Ci0JCXJldHVybiBhZGFwdGVyOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkNvbnRlbnRjYXRlZ29yaWVzQWRhcHRlckZhY3RvcnkjY3JlYXRlRGlzY2lwbGluZUFkYXB0ZXIoKQotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZURpc2NpcGxpbmVBZGFwdGVyKCkgewotCQkvLyBpZiAoZGlzY2lwbGluZUl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCS8vIGRpc2NpcGxpbmVJdGVtUHJvdmlkZXIgPSBuZXcgRGlzY2lwbGluZUl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJLy8gfQotCQkvLwotCQkvLyByZXR1cm4gZGlzY2lwbGluZUl0ZW1Qcm92aWRlcjsKLQotCQlBZGFwdGVyIGFkYXB0ZXIgPSBuZXcgRGlzY2lwbGluZUl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJLy8gYWRhcHRlcnMuYWRkKGFkYXB0ZXIpOwotCQlyZXR1cm4gYWRhcHRlcjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5Db250ZW50Y2F0ZWdvcmllc0FkYXB0ZXJGYWN0b3J5I2NyZWF0ZVJvbGVTZXRBZGFwdGVyKCkKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVSb2xlU2V0QWRhcHRlcigpIHsKLQkJLy8gaWYgKHJvbGVTZXRJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkvLyByb2xlU2V0SXRlbVByb3ZpZGVyID0gbmV3IFJvbGVTZXRJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCS8vIH0KLQkJLy8KLQkJLy8gcmV0dXJuIHJvbGVTZXRJdGVtUHJvdmlkZXI7Ci0KLQkJQWRhcHRlciBhZGFwdGVyID0gbmV3IFJvbGVTZXRJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCS8vIGFkYXB0ZXJzLmFkZChhZGFwdGVyKTsKLQkJcmV0dXJuIGFkYXB0ZXI7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLkNvbnRlbnRjYXRlZ29yaWVzSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkjY3JlYXRlVG9vbEFkYXB0ZXIoKQotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVRvb2xBZGFwdGVyKCkgewotCQlBZGFwdGVyIGFkYXB0ZXIgPSBuZXcgVG9vbEl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJLy8gYWRhcHRlcnMuYWRkKGFkYXB0ZXIpOwotCQlyZXR1cm4gYWRhcHRlcjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuQ29udGVudGNhdGVnb3JpZXNJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSNjcmVhdGVXb3JrUHJvZHVjdFR5cGVBZGFwdGVyKCkKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVXb3JrUHJvZHVjdFR5cGVBZGFwdGVyKCkgewotCQlBZGFwdGVyIGFkYXB0ZXIgPSBuZXcgV29ya1Byb2R1Y3RUeXBlSXRlbVByb3ZpZGVyKHRoaXMpOwotCQkvLyBhZGFwdGVycy5hZGQoYWRhcHRlcik7Ci0JCXJldHVybiBhZGFwdGVyOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYUFkYXB0ZXJGYWN0b3J5I2NyZWF0ZUd1aWRhbmNlQWRhcHRlcigpCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlR3VpZGFuY2VBZGFwdGVyKCkgewotCQlpZiAoZ3VpZGFuY2VJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJZ3VpZGFuY2VJdGVtUHJvdmlkZXIgPSBuZXcgR3VpZGFuY2VJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQkJcmV0dXJuIGd1aWRhbmNlSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5VbWFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSNjcmVhdGVDaGVja2xpc3RBZGFwdGVyKCkKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVDaGVja2xpc3RBZGFwdGVyKCkgewotCQlyZXR1cm4gY3JlYXRlR3VpZGFuY2VBZGFwdGVyKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLlVtYUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5I2NyZWF0ZUNvbmNlcHRBZGFwdGVyKCkKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVDb25jZXB0QWRhcHRlcigpIHsKLQkJcmV0dXJuIGNyZWF0ZUd1aWRhbmNlQWRhcHRlcigpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5VbWFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSNjcmVhdGVFc3RpbWF0ZUFkYXB0ZXIoKQotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUVzdGltYXRlQWRhcHRlcigpIHsKLQkJcmV0dXJuIGNyZWF0ZUd1aWRhbmNlQWRhcHRlcigpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5VbWFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSNjcmVhdGVFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMKLQkgKiAgICAgIEFkYXB0ZXIoKQotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUVzdGltYXRpb25Db25zaWRlcmF0aW9uc0FkYXB0ZXIoKSB7Ci0JCXJldHVybiBjcmVhdGVHdWlkYW5jZUFkYXB0ZXIoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuVW1hSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkjY3JlYXRlRXN0aW1hdGluZ01ldHJpY0FkYXB0ZXIoKQotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUVzdGltYXRpbmdNZXRyaWNBZGFwdGVyKCkgewotCQlyZXR1cm4gY3JlYXRlR3VpZGFuY2VBZGFwdGVyKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLlVtYUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5I2NyZWF0ZUV4YW1wbGVBZGFwdGVyKCkKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVFeGFtcGxlQWRhcHRlcigpIHsKLQkJcmV0dXJuIGNyZWF0ZUd1aWRhbmNlQWRhcHRlcigpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5VbWFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSNjcmVhdGVQcmFjdGljZUFkYXB0ZXIoKQotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVByYWN0aWNlQWRhcHRlcigpIHsKLQkJaWYgKHByYWN0aWNlSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCXByYWN0aWNlSXRlbVByb3ZpZGVyID0gbmV3IFByYWN0aWNlSXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0JCXJldHVybiBwcmFjdGljZUl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuVW1hSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkjY3JlYXRlUmVwb3J0QWRhcHRlcigpCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUmVwb3J0QWRhcHRlcigpIHsKLQkJcmV0dXJuIGNyZWF0ZUd1aWRhbmNlQWRhcHRlcigpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5VbWFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSNjcmVhdGVSb2FkbWFwQWRhcHRlcigpCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUm9hZG1hcEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBjcmVhdGVHdWlkYW5jZUFkYXB0ZXIoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuVW1hSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkjY3JlYXRlUmV1c2FibGVBc3NldEFkYXB0ZXIoKQotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVJldXNhYmxlQXNzZXRBZGFwdGVyKCkgewotCQlyZXR1cm4gY3JlYXRlR3VpZGFuY2VBZGFwdGVyKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLlVtYUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5I2NyZWF0ZVN1cHBvcnRpbmdNYXRlcmlhbEFkYXB0ZXIoKQotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVN1cHBvcnRpbmdNYXRlcmlhbEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBjcmVhdGVHdWlkYW5jZUFkYXB0ZXIoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuVW1hSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkjY3JlYXRlVGVjaG5pcXVlQWRhcHRlcigpCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlVGVjaG5pcXVlQWRhcHRlcigpIHsKLQkJcmV0dXJuIGNyZWF0ZUd1aWRhbmNlQWRhcHRlcigpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5VbWFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSNjcmVhdGVUZW1wbGF0ZUFkYXB0ZXIoKQotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVRlbXBsYXRlQWRhcHRlcigpIHsKLQkJcmV0dXJuIGNyZWF0ZUd1aWRhbmNlQWRhcHRlcigpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5VbWFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSNjcmVhdGVUZXJtRGVmaW5pdGlvbkFkYXB0ZXIoKQotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVRlcm1EZWZpbml0aW9uQWRhcHRlcigpIHsKLQkJcmV0dXJuIGNyZWF0ZUd1aWRhbmNlQWRhcHRlcigpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5VbWFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSNjcmVhdGVUb29sTWVudG9yQWRhcHRlcigpCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlVG9vbE1lbnRvckFkYXB0ZXIoKSB7Ci0JCXJldHVybiBjcmVhdGVHdWlkYW5jZUFkYXB0ZXIoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuVW1hSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkjY3JlYXRlV29ya1Byb2R1Y3RHdWlkZWxpbmVBZGFwdGVyKCkKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVXb3JrUHJvZHVjdEd1aWRlbGluZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBjcmVhdGVHdWlkYW5jZUFkYXB0ZXIoKTsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVTZWN0aW9uQWRhcHRlcigpIHsKLQkJaWYgKHNlY3Rpb25JdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJc2VjdGlvbkl0ZW1Qcm92aWRlciA9IG5ldyBTZWN0aW9uSXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIHNlY3Rpb25JdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLlVtYUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5I2NyZWF0ZUN1c3RvbUNhdGVnb3J5QWRhcHRlcigpCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQ3VzdG9tQ2F0ZWdvcnlBZGFwdGVyKCkgewotCQlpZiAoY3VzdG9tQ2F0ZWdvcnlJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJY3VzdG9tQ2F0ZWdvcnlJdGVtUHJvdmlkZXIgPSBuZXcgQ3VzdG9tQ2F0ZWdvcnlJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gY3VzdG9tQ2F0ZWdvcnlJdGVtUHJvdmlkZXI7Ci0JfQotCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlV2hpdGVwYXBlckFkYXB0ZXIoKSB7Ci0JCS8vIGlmICh3aGl0ZXBhcGVySXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJLy8gd2hpdGVwYXBlckl0ZW1Qcm92aWRlciA9IG5ldyBXaGl0ZXBhcGVySXRlbVByb3ZpZGVyKHRoaXMpOwotCQkvLyB9Ci0JCS8vCi0JCS8vIHJldHVybiB3aGl0ZXBhcGVySXRlbVByb3ZpZGVyOwotCi0JCXJldHVybiBjcmVhdGVHdWlkYW5jZUFkYXB0ZXIoKTsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVDYXBhYmlsaXR5UGF0dGVybkFkYXB0ZXIoKSB7Ci0JCWlmIChjYXBhYmlsaXR5UGF0dGVybkl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQljYXBhYmlsaXR5UGF0dGVybkl0ZW1Qcm92aWRlciA9IG5ldyBDYXBhYmlsaXR5UGF0dGVybkl0ZW1Qcm92aWRlcigKLQkJCQkJdGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gY2FwYWJpbGl0eVBhdHRlcm5JdGVtUHJvdmlkZXI7Ci0JfQotCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRGVsaXZlcnlQcm9jZXNzQWRhcHRlcigpIHsKLQkJaWYgKGRlbGl2ZXJ5UHJvY2Vzc0l0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlkZWxpdmVyeVByb2Nlc3NJdGVtUHJvdmlkZXIgPSBuZXcgRGVsaXZlcnlQcm9jZXNzSXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIGRlbGl2ZXJ5UHJvY2Vzc0l0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuVW1hSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkjY3JlYXRlR3VpZGVsaW5lQWRhcHRlcigpCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlR3VpZGVsaW5lQWRhcHRlcigpIHsKLQkJcmV0dXJuIGNyZWF0ZUd1aWRhbmNlQWRhcHRlcigpOwotCX0KLQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUNvbnRlbnREZXNjcmlwdGlvbkFkYXB0ZXIoKSB7Ci0JCWlmIChjb250ZW50RGVzY3JpcHRpb25JdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJY29udGVudERlc2NyaXB0aW9uSXRlbVByb3ZpZGVyID0gbmV3IENvbnRlbnREZXNjcmlwdGlvbkl0ZW1Qcm92aWRlcigKLQkJCQkJdGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gY29udGVudERlc2NyaXB0aW9uSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5VbWFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSNjcmVhdGVBY3Rpdml0eURlc2NyaXB0aW9uQWRhcHRlcigpCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQWN0aXZpdHlEZXNjcmlwdGlvbkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBjcmVhdGVDb250ZW50RGVzY3JpcHRpb25BZGFwdGVyKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLlVtYUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5I2NyZWF0ZUFydGlmYWN0RGVzY3JpcHRpb25BZGFwdGVyKCkKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVBcnRpZmFjdERlc2NyaXB0aW9uQWRhcHRlcigpIHsKLQkJcmV0dXJuIGNyZWF0ZUNvbnRlbnREZXNjcmlwdGlvbkFkYXB0ZXIoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuVW1hSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkjY3JlYXRlQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uQWRhcHRlcigpCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uQWRhcHRlcigpIHsKLQkJcmV0dXJuIGNyZWF0ZUNvbnRlbnREZXNjcmlwdGlvbkFkYXB0ZXIoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuVW1hSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkjY3JlYXRlRGVsaXZlcmFibGVEZXNjcmlwdGlvbkFkYXB0ZXIoKQotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZURlbGl2ZXJhYmxlRGVzY3JpcHRpb25BZGFwdGVyKCkgewotCQlyZXR1cm4gY3JlYXRlQ29udGVudERlc2NyaXB0aW9uQWRhcHRlcigpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5VbWFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSNjcmVhdGVEZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbkFkYXB0ZXIoKQotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZURlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uQWRhcHRlcigpIHsKLQkJcmV0dXJuIGNyZWF0ZUNvbnRlbnREZXNjcmlwdGlvbkFkYXB0ZXIoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuVW1hSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkjY3JlYXRlRGVzY3JpcHRvckRlc2NyaXB0aW9uQWRhcHRlcigpCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRGVzY3JpcHRvckRlc2NyaXB0aW9uQWRhcHRlcigpIHsKLQkJcmV0dXJuIGNyZWF0ZUNvbnRlbnREZXNjcmlwdGlvbkFkYXB0ZXIoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuVW1hSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkjY3JlYXRlR3VpZGFuY2VEZXNjcmlwdGlvbkFkYXB0ZXIoKQotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUd1aWRhbmNlRGVzY3JpcHRpb25BZGFwdGVyKCkgewotCQlyZXR1cm4gY3JlYXRlQ29udGVudERlc2NyaXB0aW9uQWRhcHRlcigpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5VbWFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSNjcmVhdGVQcmFjdGljZURlc2NyaXB0aW9uQWRhcHRlcigpCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUHJhY3RpY2VEZXNjcmlwdGlvbkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBjcmVhdGVDb250ZW50RGVzY3JpcHRpb25BZGFwdGVyKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLlVtYUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5I2NyZWF0ZVByb2Nlc3NEZXNjcmlwdGlvbkFkYXB0ZXIoKQotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVByb2Nlc3NEZXNjcmlwdGlvbkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBjcmVhdGVDb250ZW50RGVzY3JpcHRpb25BZGFwdGVyKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLlVtYUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5I2NyZWF0ZVJvbGVEZXNjcmlwdGlvbkFkYXB0ZXIoKQotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVJvbGVEZXNjcmlwdGlvbkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBjcmVhdGVDb250ZW50RGVzY3JpcHRpb25BZGFwdGVyKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLlVtYUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5I2NyZWF0ZVRhc2tEZXNjcmlwdGlvbkFkYXB0ZXIoKQotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVRhc2tEZXNjcmlwdGlvbkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBjcmVhdGVDb250ZW50RGVzY3JpcHRpb25BZGFwdGVyKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLlVtYUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5I2NyZWF0ZVdvcmtQcm9kdWN0RGVzY3JpcHRpb25BZGFwdGVyKCkKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVXb3JrUHJvZHVjdERlc2NyaXB0aW9uQWRhcHRlcigpIHsKLQkJcmV0dXJuIGNyZWF0ZUNvbnRlbnREZXNjcmlwdGlvbkFkYXB0ZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NaWxlc3RvbmV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZU1pbGVzdG9uZUFkYXB0ZXIoKSB7Ci0JCWlmIChtaWxlc3RvbmVJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJbWlsZXN0b25lSXRlbVByb3ZpZGVyID0gbmV3IE1pbGVzdG9uZUl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCQlyZXR1cm4gbWlsZXN0b25lSXRlbVByb3ZpZGVyOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVBY3Rpdml0eUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgQWN0aXZpdHlJdGVtUHJvdmlkZXIodGhpcyk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVBoYXNlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBBY3Rpdml0eUl0ZW1Qcm92aWRlcih0aGlzKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlSXRlcmF0aW9uQWRhcHRlcigpIHsKLQkJcmV0dXJuIGNyZWF0ZUFjdGl2aXR5QWRhcHRlcigpOwotCX0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuVW1hSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJaWYgKGd1aWRhbmNlSXRlbVByb3ZpZGVyICE9IG51bGwpIHsKLQkJCWd1aWRhbmNlSXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJCWd1aWRhbmNlSXRlbVByb3ZpZGVyID0gbnVsbDsKLQkJfQotCQlpZiAobXlBcnRpZmFjdEl0ZW1Qcm92aWRlciAhPSBudWxsKSB7Ci0JCQlteUFydGlmYWN0SXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJCW15QXJ0aWZhY3RJdGVtUHJvdmlkZXIgPSBudWxsOwotCQl9Ci0JCWlmIChteURlbGl2ZXJhYmxlSXRlbVByb3ZpZGVyICE9IG51bGwpIHsKLQkJCW15RGVsaXZlcmFibGVJdGVtUHJvdmlkZXIuZGlzcG9zZSgpOwotCQkJbXlEZWxpdmVyYWJsZUl0ZW1Qcm92aWRlciA9IG51bGw7Ci0JCX0KLQkJaWYgKG15T3V0Y29tZUl0ZW1Qcm92aWRlciAhPSBudWxsKSB7Ci0JCQlteU91dGNvbWVJdGVtUHJvdmlkZXIuZGlzcG9zZSgpOwotCQkJbXlPdXRjb21lSXRlbVByb3ZpZGVyID0gbnVsbDsKLQkJfQotCQlpZiAod29ya1Byb2R1Y3RJdGVtUHJvdmlkZXIgIT0gbnVsbCkgewotCQkJd29ya1Byb2R1Y3RJdGVtUHJvdmlkZXIuZGlzcG9zZSgpOwotCQkJd29ya1Byb2R1Y3RJdGVtUHJvdmlkZXIgPSBudWxsOwotCQl9Ci0KLQkJLy8gZm9yIChJdGVyYXRvciBpdGVyID0gbmV3IEFycmF5TGlzdChhZGFwdGVycykuaXRlcmF0b3IoKTsKLQkJLy8gaXRlci5oYXNOZXh0KCk7KSB7Ci0JCS8vIE9iamVjdCBhZGFwdGVyID0gaXRlci5uZXh0KCk7Ci0JCS8vIGlmKGFkYXB0ZXIgaW5zdGFuY2VvZiBJRGlzcG9zYWJsZSkgewotCQkvLyAoKElEaXNwb3NhYmxlKWFkYXB0ZXIpLmRpc3Bvc2UoKTsKLQkJLy8gfQotCQkvLyB9Ci0JCS8vIGFkYXB0ZXJzLmNsZWFyKCk7Ci0KLQkJaWYgKCFkaXNwb3NhYmxlQWRhcHRlcnMuaXNFbXB0eSgpKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBkaXNwb3NhYmxlQWRhcHRlcnMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJSURpc3Bvc2FibGUgYWRhcHRlciA9IChJRGlzcG9zYWJsZSkgaXRlci5uZXh0KCk7Ci0JCQkJYWRhcHRlci5kaXNwb3NlKCk7Ci0JCQl9Ci0JCQlkaXNwb3NhYmxlQWRhcHRlcnMuY2xlYXIoKTsKLQkJfQotCi0JCXN1cGVyLmRpc3Bvc2UoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LklSZWZlcmVuY2VyI3JlbW92ZShqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBib29sZWFuIHJlbW92ZShPYmplY3QgcmVmKSB7Ci0JCXJldHVybiBkaXNwb3NhYmxlQWRhcHRlcnMucmVtb3ZlKHJlZik7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklSZWZlcmVuY2VyI2NsZWFuVXAoKQotCSAqLwotCXB1YmxpYyB2b2lkIGNsZWFuVXAoKSB7Ci0JCUFycmF5TGlzdCBhZGFwdGVyc1RvUmVtb3ZlID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBuZXcgQXJyYXlMaXN0KGRpc3Bvc2FibGVBZGFwdGVycykuaXRlcmF0b3IoKTsgaXRlcgotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQlBZGFwdGVyIGFkYXB0ZXIgPSAoQWRhcHRlcikgaXRlci5uZXh0KCk7Ci0JCQlpZiAoYWRhcHRlciBpbnN0YW5jZW9mIElTdGF0ZWZ1bEl0ZW1Qcm92aWRlcgotCQkJCQkmJiBhZGFwdGVyLmdldFRhcmdldCgpID09IG51bGwpIHsKLQkJCQlhZGFwdGVyc1RvUmVtb3ZlLmFkZChhZGFwdGVyKTsKLQkJCX0KLQkJfQotCQlpZiAoVG5nVXRpbC5ERUJVRykgewotCQkJU3lzdGVtLm91dAotCQkJCQkucHJpbnRsbigiSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuY2xlYW5VcCgpOiBudW1iZXIgb2YgYWRhcHRlcnMgdG8gcmVtb3ZlOiAiIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkrIGFkYXB0ZXJzVG9SZW1vdmUuc2l6ZSgpKTsKLQkJfQotCQlkaXNwb3NhYmxlQWRhcHRlcnMucmVtb3ZlQWxsKGFkYXB0ZXJzVG9SZW1vdmUpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9uYXZpZ2F0b3IvTWV0aG9kQ29uZmlndXJhdGlvbkl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9uYXZpZ2F0b3IvTWV0aG9kQ29uZmlndXJhdGlvbkl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NWU3OTAzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvbmF2aWdhdG9yL01ldGhvZENvbmZpZ3VyYXRpb25JdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lm5hdmlnYXRvcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLQotLyoqCi0gKiBUaGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIG1ldGhvZCBjb25maWd1cmF0aW9uIGluIHRoZSBMaWJyYXJ5IHZpZXcuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIE1ldGhvZENvbmZpZ3VyYXRpb25JdGVtUHJvdmlkZXIgZXh0ZW5kcwotCQlvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLk1ldGhvZENvbmZpZ3VyYXRpb25JdGVtUHJvdmlkZXIgewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgTWV0aG9kQ29uZmlndXJhdGlvbkl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldFBhcmVudChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBvYmplY3QpIHsKLQkJT2JqZWN0IHBhcmVudCA9IHN1cGVyLmdldFBhcmVudChvYmplY3QpOwotCQlpZiAocGFyZW50IGluc3RhbmNlb2YgRU9iamVjdCkgewotCQkJRU9iamVjdCBsaWIgPSAoRU9iamVjdCkgcGFyZW50OwotCQkJaWYgKGxpYiA9PSBudWxsKQotCQkJCXJldHVybiBudWxsOwotCQkJTWV0aG9kTGlicmFyeUl0ZW1Qcm92aWRlciBpdGVtUHJvdmlkZXIgPSAoTWV0aG9kTGlicmFyeUl0ZW1Qcm92aWRlcikgVG5nVXRpbAotCQkJCQkuZ2V0QWRhcHRlcihsaWIsIE1ldGhvZExpYnJhcnlJdGVtUHJvdmlkZXIuY2xhc3MpOwotCQkJcmV0dXJuIGl0ZW1Qcm92aWRlciAhPSBudWxsID8gaXRlbVByb3ZpZGVyLmdldENvbmZpZ3VyYXRpb25zKCkKLQkJCQkJOiBudWxsOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhqYXZhLnV0aWwuQ29sbGVjdGlvbiwKLQkgKiAgICAgIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLAotCQkJT2JqZWN0IG9iamVjdCkgewotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRUZXh0KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIFRuZ1V0aWwuZ2V0TGFiZWwob2JqZWN0LAotCQkJCWdldFN0cmluZygiX1VJX01ldGhvZENvbmZpZ3VyYXRpb25fdHlwZSIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLk1ldGhvZENvbmZpZ3VyYXRpb25JdGVtUHJvdmlkZXIjZ2V0SW1hZ2UoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKCJmdWxsL29iajE2L01ldGhvZENvbmZpZ3VyYXRpb24iKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5NZXRob2RDb25maWd1cmF0aW9uSXRlbVByb3ZpZGVyI25vdGlmeUNoYW5nZWQob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCi0JCVRuZ1V0aWwucmVmcmVzaFBhcmVudElmTmFtZUNoYW5nZWQobm90aWZpY2F0aW9uLCB0aGlzKTsKLQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5GZWF0dXJlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvbmF2aWdhdG9yL01ldGhvZExpYnJhcnlJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvbmF2aWdhdG9yL01ldGhvZExpYnJhcnlJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDdmMzRjYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L25hdmlnYXRvci9NZXRob2RMaWJyYXJ5SXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5uYXZpZ2F0b3I7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklMaWJyYXJ5SXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlBsdWdpblVJUGFja2FnZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLk1ldGhvZEVsZW1lbnRBZGRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Db21wYXJhdG9yczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLk1ldGhvZFBsdWdpbkl0ZW1Qcm92aWRlcjsKLQotLyoqCi0gKiBUaGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIG1ldGhvZCBsaWJyYXJ5LgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXRob2RMaWJyYXJ5SXRlbVByb3ZpZGVyIGV4dGVuZHMKLQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5NZXRob2RMaWJyYXJ5SXRlbVByb3ZpZGVyIHsKLQotCXByaXZhdGUgQ29uZmlndXJhdGlvbnNJdGVtUHJvdmlkZXIgY29uZmlndXJhdGlvbnM7Ci0JCi0JcHJvdGVjdGVkIFBsdWdpblVJUGFja2FnZUJ1aWxkZXIgcGx1Z2luUGtnQnVpbGRlcjsKLQkKLQkvL3ByaXZhdGUgUHJvY2Vzc0ZhbWlsaWVzSXRlbVByb3ZpZGVyIHByb2NGYW1pbGllczsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIE1ldGhvZExpYnJhcnlJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCQlwbHVnaW5Qa2dCdWlsZGVyID0gbmV3IFBsdWdpblVJUGFja2FnZUJ1aWxkZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRDaGlsZHJlbkZlYXR1cmVzKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb248PyBleHRlbmRzIEVTdHJ1Y3R1cmFsRmVhdHVyZT4gZ2V0Q2hpbGRyZW5GZWF0dXJlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlbkZlYXR1cmVzID09IG51bGwpIHsKLQkJCWNoaWxkcmVuRmVhdHVyZXMgPSBuZXcgQXJyYXlMaXN0PEVTdHJ1Y3R1cmFsRmVhdHVyZT4oKTsKLQkJCWNoaWxkcmVuRmVhdHVyZXMuYWRkKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCS5nZXRNZXRob2RMaWJyYXJ5X01ldGhvZFBsdWdpbnMoKSk7Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuRmVhdHVyZXM7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2NvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKGphdmEudXRpbC5Db2xsZWN0aW9uLAotCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywKLQkJCU9iamVjdCBvYmplY3QpIHsKLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0TWV0aG9kTGlicmFyeV9NZXRob2RQbHVnaW5zKCksIFVtYUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJLmNyZWF0ZU1ldGhvZFBsdWdpbigpKSk7Ci0JfQotCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpIAotCXB1YmxpYyBDb2xsZWN0aW9uPD8+IGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJTGlzdDxPYmplY3Q+IGNoaWxkcmVuOwotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgTWV0aG9kTGlicmFyeSAmJiAhUGx1Z2luVUlQYWNrYWdlQ29udGV4dC5JTlNUQU5DRS5pc0ZsYXRMYXlvdXQoKSkgewotCQkJY2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0PE9iamVjdD4oKTsKLQkJCUxpc3Q8TWV0aG9kUGx1Z2luPiBwbHVnaW5zID0gZ2V0TWV0aG9kUGx1Z2lucygoTWV0aG9kTGlicmFyeSlvYmplY3QpOwotCQkJYWRkQ2hpbGRyZW4oY2hpbGRyZW4sIHBsdWdpbnMsIG9iamVjdCk7Ci0JCQlDb2xsZWN0aW9ucy5zb3J0KGNoaWxkcmVuLCBDb21wYXJhdG9ycy5QTFVHSU5QQUNLQUdFX0NPTVBBUkFUT1IpOwotCQl9IGVsc2UgeyAKLQkJCUNvbGxlY3Rpb248Pz4gY29sbGVjdGlvbiA9IHN1cGVyLmdldENoaWxkcmVuKG9iamVjdCk7Ci0JCQlpZiAoY29sbGVjdGlvbiBpbnN0YW5jZW9mIExpc3QpIHsKLQkJCQljaGlsZHJlbiA9IChMaXN0KSBjb2xsZWN0aW9uOwotCQkJfSBlbHNlIHsKLQkJCQljaGlsZHJlbiA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0Pihjb2xsZWN0aW9uKTsKLQkJCX0KLQkJCS8vIHNldCBwYXJlbnRzCi0JCQlmb3IgKEl0ZXJhdG9yPD8+IGl0ZXIgPSBjaGlsZHJlbi5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3QgYWRhcHRlciA9IGFkYXB0ZXJGYWN0b3J5LmFkYXB0KGl0ZXIubmV4dCgpLAotCQkJCQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCQlpZiAoYWRhcHRlciBpbnN0YW5jZW9mIElMaWJyYXJ5SXRlbVByb3ZpZGVyKSB7Ci0JCQkJCSgoSUxpYnJhcnlJdGVtUHJvdmlkZXIpIGFkYXB0ZXIpLnNldFBhcmVudCh0aGlzKTsKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCUNvbGxlY3Rpb25zLnNvcnQoY2hpbGRyZW4sIENvbXBhcmF0b3JzLlBMVUdJTlBBQ0tBR0VfQ09NUEFSQVRPUik7Ci0JCX0KLQkJaWYgKGNvbmZpZ3VyYXRpb25zID09IG51bGwpIHsKLQkJCWNvbmZpZ3VyYXRpb25zID0gbmV3IENvbmZpZ3VyYXRpb25zSXRlbVByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5LAotCQkJCQkoTWV0aG9kTGlicmFyeSkgb2JqZWN0LCBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkJCS5nZXRTdHJpbmcoIl9VSV9Db25maWd1cmF0aW9uc190ZXh0IikpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJY2hpbGRyZW4uYWRkKGNvbmZpZ3VyYXRpb25zKTsKLQotCQkvLyBSZW1vdmUgJ1Byb2Nlc3MgRmFtaWxpZXMnIHVudGlsIGl0IGlzIGZ1bGx5IGltcGxlbWVudGVkCi0JCS8vCi0JCS8vIGlmKHByb2NGYW1pbGllcyA9PSBudWxsKSB7Ci0JCS8vIHByb2NGYW1pbGllcyA9IG5ldyBQcm9jZXNzRmFtaWxpZXNJdGVtUHJvdmlkZXIoYWRhcHRlckZhY3RvcnksCi0JCS8vIChNZXRob2RMaWJyYXJ5KSBvYmplY3QsCi0JCS8vIExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX1Byb2Nlc3NGYW1pbGllc190ZXh0IikpOwotCQkvLyB9Ci0JCS8vIGNoaWxkcmVuLmFkZChwcm9jRmFtaWxpZXMpOwotCQkKLQotCQlyZXR1cm4gY2hpbGRyZW47Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGFkZENoaWxkcmVuKENvbGxlY3Rpb248T2JqZWN0PiBjaGlsZHJlbiwgQ29sbGVjdGlvbjxNZXRob2RQbHVnaW4+IHBsdWdpbnMsCi0JCQlPYmplY3QgcGFyZW50KSB7Ci0JCXBsdWdpblBrZ0J1aWxkZXIuYWRkQ2hpbGRyZW4oY2hpbGRyZW4sIHBsdWdpbnMsIHBhcmVudCk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgTGlzdDxNZXRob2RQbHVnaW4+IGdldE1ldGhvZFBsdWdpbnMoTWV0aG9kTGlicmFyeSBsaWJyYXJ5KSB7Ci0JCUxpc3Q8TWV0aG9kUGx1Z2luPiBpdGVtcyA9IG5ldyBBcnJheUxpc3Q8TWV0aG9kUGx1Z2luPigpOwotCQlFTGlzdDxFT2JqZWN0PiBlbGVtZW50cyA9IGxpYnJhcnkuZUNvbnRlbnRzKCk7Ci0JCWlmIChlbGVtZW50cyAhPSBudWxsKSB7Ci0JCQlmb3IgKEVPYmplY3QgZWxlbWVudCA6IGVsZW1lbnRzKSB7Ci0JCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pIHsKLQkJCQkJaXRlbXMuYWRkKChNZXRob2RQbHVnaW4pZWxlbWVudCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBpdGVtczsKLQl9Ci0KLQotCXB1YmxpYyBPYmplY3QgZ2V0Q29uZmlndXJhdGlvbnMoKSB7Ci0JCXJldHVybiBjb25maWd1cmF0aW9uczsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldFByb2Nlc3NGYW1pbGllcygpIHsKLQkJLy9yZXR1cm4gcHJvY0ZhbWlsaWVzOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNjcmVhdGVBZGRDb21tYW5kKG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluLCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCwgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZSwgamF2YS51dGlsLkNvbGxlY3Rpb24sIGludCkKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBjcmVhdGVBZGRDb21tYW5kKEVkaXRpbmdEb21haW4gZG9tYWluLCBFT2JqZWN0IG93bmVyLCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgQ29sbGVjdGlvbjw/PiBjb2xsZWN0aW9uLCBpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIG5ldyBNZXRob2RFbGVtZW50QWRkQ29tbWFuZChzdXBlci5jcmVhdGVBZGRDb21tYW5kKGRvbWFpbiwgb3duZXIsIGZlYXR1cmUsIGNvbGxlY3Rpb24sIGluZGV4KSk7Ci0JfQotCQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlpZiAoY29uZmlndXJhdGlvbnMgIT0gbnVsbCkgewotCQkJY29uZmlndXJhdGlvbnMuZGlzcG9zZSgpOwotCQkJY29uZmlndXJhdGlvbnMgPSBudWxsOwotCQl9Ci0JCQotCQlpZiAocGx1Z2luUGtnQnVpbGRlciAhPSBudWxsKSB7Ci0JCQlwbHVnaW5Qa2dCdWlsZGVyLmRpc3Bvc2UoKTsKLQkJfQotCQkKLQkJLyoKLQkJaWYgKHByb2NGYW1pbGllcyAhPSBudWxsKSB7Ci0JCQlwcm9jRmFtaWxpZXMuZGlzcG9zZSgpOwotCQkJcHJvY0ZhbWlsaWVzID0gbnVsbDsKLQkJfQotCQkqLwotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotCQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBwbHVnaW4KLQkgKiBAcmV0dXJuIHRoZSBJdGVtUHJvdmlkZXJBZGFwdGVyIGZvciB0aGUgcGx1Z2luIC0gZWl0aGVyIGEgTWV0aG9kUGx1Z2luSXRlbVByb3ZpZGVyIG9yIGEgUGx1Z2luVUlQYWNrYWdlc0l0ZW1Qcm92aWRlci4gbnVsbCBpZiBub25lIGZvdW5kCi0JICovCi0JcHVibGljIEl0ZW1Qcm92aWRlckFkYXB0ZXIgZ2V0UGx1Z2luSXRlbVByb3ZpZGVyKE1ldGhvZFBsdWdpbiBwbHVnaW4pIHsKLQkJU3RyaW5nIHBsdWdpbk5hbWUgPSBwbHVnaW4uZ2V0TmFtZSgpOwotCQlpbnQgZG90SWR4ID0gcGx1Z2luTmFtZQotCQkJCS5pbmRleE9mKFBsdWdpblVJUGFja2FnZXNJdGVtUHJvdmlkZXIuUExVR0lOX1BBQ0tBR0VfU0VQQVJBVE9SKTsKLQkJaWYgKGRvdElkeCAhPSAtMSkgewotCQkJU3RyaW5nIHBhY2thZ2VQcm92aWRlck5hbWUgPSBwbHVnaW5OYW1lLnN1YnN0cmluZygwLCBkb3RJZHgpOwotCQkJUGx1Z2luVUlQYWNrYWdlc0l0ZW1Qcm92aWRlciBwcm92aWRlciA9IHBsdWdpblBrZ0J1aWxkZXIKLQkJCQkJLmdldFBsdWdpblVJUGFja2FnZXNJdGVtUHJvdmlkZXIocGFja2FnZVByb3ZpZGVyTmFtZSk7Ci0JCQlpZiAocHJvdmlkZXIgIT0gbnVsbCkgewotCQkJCXJldHVybiBwcm92aWRlcjsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXJldHVybiAoTWV0aG9kUGx1Z2luSXRlbVByb3ZpZGVyKSBUbmdVdGlsLmdldEFkYXB0ZXIocGx1Z2luLAotCQkJCQlNZXRob2RQbHVnaW5JdGVtUHJvdmlkZXIuY2xhc3MpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvbmF2aWdhdG9yL01ldGhvZFBhY2thZ2VzSXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L25hdmlnYXRvci9NZXRob2RQYWNrYWdlc0l0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYzM2NDY0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvbmF2aWdhdG9yL01ldGhvZFBhY2thZ2VzSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5uYXZpZ2F0b3I7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklMaWJyYXJ5SXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UcmFuc2llbnRHcm91cEl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuQ29tcGFyYXRvcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkxpYnJhcnlFZGl0Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogVGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgdGhlICJDb250ZW50IFBhY2thZ2VzIiBmb2xkZXIgaW4gdGhlIExpYnJhcnkKLSAqIHZpZXcuCi0gKiA8cD4KLSAqIFRoaXMgY2xhc3Mgd2lsbCBiZSByZW5hbWVkIGFzICJDb250ZW50UGFja2FnZXNJdGVtUHJvdmlkZXIiIGluIEVQRiBNNS4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTWV0aG9kUGFja2FnZXNJdGVtUHJvdmlkZXIgZXh0ZW5kcyBUcmFuc2llbnRHcm91cEl0ZW1Qcm92aWRlciB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBNZXRob2RQYWNrYWdlc0l0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwKLQkJCU5vdGlmaWVyIHBhcmVudCwgU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnksIHBhcmVudCwgbmFtZSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2NvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKGphdmEudXRpbC5Db2xsZWN0aW9uLAotCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsCi0JCQlPYmplY3Qgb2JqZWN0KSB7Ci0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldE1ldGhvZFBhY2thZ2VfQ2hpbGRQYWNrYWdlcygpLCBVbWFGYWN0b3J5LmVJTlNUQU5DRQotCQkJCS5jcmVhdGVDb250ZW50UGFja2FnZSgpKSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldENoaWxkcmVuRmVhdHVyZXMoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbkZlYXR1cmVzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGNoaWxkcmVuRmVhdHVyZXMgPT0gbnVsbCkgewotCQkJY2hpbGRyZW5GZWF0dXJlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWNoaWxkcmVuRmVhdHVyZXMuYWRkKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCS5nZXRNZXRob2RQYWNrYWdlX0NoaWxkUGFja2FnZXMoKSk7Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuRmVhdHVyZXM7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0QXNDaGlsZChPYmplY3Qgb2JqKSB7Ci0JCXJldHVybiBvYmogaW5zdGFuY2VvZiBDb250ZW50UGFja2FnZTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldEltYWdlKCJmdWxsL29iajE2L01ldGhvZFBhY2thZ2VzIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXIjbm90aWZ5Q2hhbmdlZChvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb24pCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbXNnKSB7Ci0JCWlmIChtc2cuZ2V0Tm90aWZpZXIoKSA9PSB0YXJnZXQpIHsKLQkJCWludCBmZWF0dXJlSWQgPSBtc2cuZ2V0RmVhdHVyZUlEKENvbnRlbnRQYWNrYWdlLmNsYXNzKTsKLQkJCWlmIChmZWF0dXJlSWQgPT0gVW1hUGFja2FnZS5DT05URU5UX1BBQ0tBR0VfX0NISUxEX1BBQ0tBR0VTKSB7Ci0JCQkJYm9vbGVhbiBub3RpZnkgPSBmYWxzZTsKLQkJCQlzd2l0Y2ggKG1zZy5nZXRFdmVudFR5cGUoKSkgewotCQkJCWNhc2UgTm90aWZpY2F0aW9uLkFERDoKLQkJCQljYXNlIE5vdGlmaWNhdGlvbi5NT1ZFOgotCQkJCQlPYmplY3Qgb2JqID0gbXNnLmdldE5ld1ZhbHVlKCk7Ci0JCQkJCW5vdGlmeSA9IGFjY2VwdEFzQ2hpbGQob2JqKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBOb3RpZmljYXRpb24uUkVNT1ZFOgotCQkJCQlvYmogPSBtc2cuZ2V0T2xkVmFsdWUoKTsKLQkJCQkJbm90aWZ5ID0gYWNjZXB0QXNDaGlsZChvYmopOwotCQkJCQlicmVhazsKLQkJCQljYXNlIE5vdGlmaWNhdGlvbi5BRERfTUFOWToKLQkJCQkJQ29sbGVjdGlvbiBjb2xsZWN0aW9uID0gKENvbGxlY3Rpb24pIG1zZy5nZXROZXdWYWx1ZSgpOwotCQkJCQlmb3JfY2hlY2s6IGZvciAoSXRlcmF0b3IgaXRlciA9IGNvbGxlY3Rpb24uaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlpZiAoYWNjZXB0QXNDaGlsZChpdGVyLm5leHQoKSkpIHsKLQkJCQkJCQlub3RpZnkgPSB0cnVlOwotCQkJCQkJCWJyZWFrIGZvcl9jaGVjazsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQljYXNlIE5vdGlmaWNhdGlvbi5SRU1PVkVfTUFOWToKLQkJCQkJY29sbGVjdGlvbiA9IChDb2xsZWN0aW9uKSBtc2cuZ2V0T2xkVmFsdWUoKTsKLQkJCQkJZm9yX2NoZWNrOiBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjb2xsZWN0aW9uLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJaWYgKGFjY2VwdEFzQ2hpbGQoaXRlci5uZXh0KCkpKSB7Ci0JCQkJCQkJbm90aWZ5ID0gdHJ1ZTsKLQkJCQkJCQlicmVhayBmb3JfY2hlY2s7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0KLQkJCQl9Ci0JCQkJaWYgKG5vdGlmeSkgewotCQkJCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG1zZywgdGhpcywgdHJ1ZSwKLQkJCQkJCQlmYWxzZSkpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG1zZyk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5UcmFuc2llbnRHcm91cEl0ZW1Qcm92aWRlciNzZXREZWZhdWx0TmFtZShqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlZmF1bHROYW1lKE9iamVjdCBvYmopIHsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIENvbnRlbnRQYWNrYWdlKSB7Ci0JCQlUbmdVdGlsLnNldERlZmF1bHROYW1lKAotCQkJCQkoKENvbnRlbnRQYWNrYWdlKSB0YXJnZXQpLmdldENoaWxkUGFja2FnZXMoKSwKLQkJCQkJKE1ldGhvZEVsZW1lbnQpIG9iaiwKLQkJCQkJTGlicmFyeUVkaXRDb25zdGFudHMuTkVXX0NPTlRFTlRfUEFDS0FHRSk7IAotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5UcmFuc2llbnRHcm91cEl0ZW1Qcm92aWRlciNnZXRJbnRlcmVzdGVkRmVhdHVyZUlEKCkKLQkgKi8KLQlwdWJsaWMgaW50IGdldEludGVyZXN0ZWRGZWF0dXJlSUQoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkNPTlRFTlRfUEFDS0FHRV9fQ0hJTERfUEFDS0FHRVM7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5UcmFuc2llbnRHcm91cEl0ZW1Qcm92aWRlciNnZXRJbnRlcmVzdGVkRmVhdHVyZU93bmVyQ2xhc3MoKQotCSAqLwotCXB1YmxpYyBDbGFzcyBnZXRJbnRlcmVzdGVkRmVhdHVyZU93bmVyQ2xhc3MoKSB7Ci0JCXJldHVybiBDb250ZW50UGFja2FnZS5jbGFzczsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LlRyYW5zaWVudEdyb3VwSXRlbVByb3ZpZGVyI2dldENoaWxkcmVuKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlMaXN0IGNoaWxkcmVuID0gKExpc3QpIHN1cGVyLmdldENoaWxkcmVuKG9iamVjdCk7Ci0KLQkJLy8gc29ydGluZyB0aGUgY29udGVudCBwYWNrYWdlcwotCQkvLwotCQlDb2xsZWN0aW9ucy5zb3J0KGNoaWxkcmVuLCBDb21wYXJhdG9ycy5ERUZBVUxUX0NPTVBBUkFUT1IpOwotCi0JCS8vIHNldCBwYXJlbnQgZm9yIGNoaWxkcmVuCi0JCS8vCi0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGNoaWxkcmVuLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGNoaWxkID0gKE9iamVjdCkgaXRlci5uZXh0KCk7Ci0JCQlPYmplY3QgYWRhcHRlciA9IGFkYXB0ZXJGYWN0b3J5LmFkYXB0KGNoaWxkLAotCQkJCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkJaWYgKGFkYXB0ZXIgaW5zdGFuY2VvZiBJTGlicmFyeUl0ZW1Qcm92aWRlcikgewotCQkJCSgoSUxpYnJhcnlJdGVtUHJvdmlkZXIpIGFkYXB0ZXIpLnNldFBhcmVudChvYmplY3QpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGNoaWxkcmVuOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9uYXZpZ2F0b3IvTWV0aG9kUGx1Z2luSXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L25hdmlnYXRvci9NZXRob2RQbHVnaW5JdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDVjNjcyNy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L25hdmlnYXRvci9NZXRob2RQbHVnaW5JdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lm5hdmlnYXRvcjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklMaWJyYXJ5SXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSVN0YXRlZnVsSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5QbHVnaW5VSVBhY2thZ2VDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuU3RydWN0dXJlZE1ldGhvZFBsdWdpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5VbWFFZGl0UGx1Z2luOwotCi0vKioKLSAqIFRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEgbWV0aG9kIHBsdWctaW4gaW4gdGhlIExpYnJhcnkKLSAqIHZpZXcuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIE1ldGhvZFBsdWdpbkl0ZW1Qcm92aWRlciBleHRlbmRzIFN0cnVjdHVyZWRNZXRob2RQbHVnaW5JdGVtUHJvdmlkZXIKLQkJaW1wbGVtZW50cyBJU3RhdGVmdWxJdGVtUHJvdmlkZXIsIElMaWJyYXJ5SXRlbVByb3ZpZGVyIHsKLQotCXByb3RlY3RlZCBDb2xsZWN0aW9uIGNoaWxkcmVuOwotCi0JcHJvdGVjdGVkIE9iamVjdCBwYXJlbnQ7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBNZXRob2RQbHVnaW5JdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5NZXRob2RQbHVnaW5JdGVtUHJvdmlkZXIjY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoamF2YS51dGlsLkNvbGxlY3Rpb24sCi0JICogICAgICBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywKLQkJCU9iamVjdCBvYmplY3QpIHsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRQYXJlbnQoT2JqZWN0IHBhcmVudCkgewotCQl0aGlzLnBhcmVudCA9IHBhcmVudDsKLQl9Ci0JCi0JLyoqCi0JICogCi0JICogQHJldHVybiB0aGUgcGFyZW50IG9mIHRoaXMgSXRlbVByb3ZpZGVyCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRQYXJlbnQoKSB7Ci0JCXJldHVybiBwYXJlbnQ7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLk1ldGhvZFBsdWdpbkl0ZW1Qcm92aWRlciNnZXRDaGlsZHJlbkZlYXR1cmVzKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5GZWF0dXJlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGNoaWxkcmVuID09IG51bGwpIHsKLQkJCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSAoTWV0aG9kUGx1Z2luKSBvYmplY3Q7Ci0KLQkJCWNoaWxkcmVuID0gbmV3IEFycmF5TGlzdCgpOwotCQkJZ3JvdXBJdGVtUHJvdmlkZXJNYXAgPSBuZXcgSGFzaE1hcCgpOwotCi0JCQlTdHJpbmcgbmFtZSA9IExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCS5nZXRTdHJpbmcoIl9VSV9Db250ZW50X2dyb3VwIik7IC8vJE5PTi1OTFMtMSQKLQkJCU9iamVjdCBjaGlsZCA9IG5ldyBDb250ZW50SXRlbVByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5LCBwbHVnaW4sCi0JCQkJCWdldE1vZGVsU3RydWN0dXJlKCkpOwotCQkJY2hpbGRyZW4uYWRkKGNoaWxkKTsKLQkJCWdyb3VwSXRlbVByb3ZpZGVyTWFwLnB1dChuYW1lLCBjaGlsZCk7Ci0KLQkJCW5hbWUgPSBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9Qcm9jZXNzZXNfZ3JvdXAiKTsgLy8kTk9OLU5MUy0xJAotCQkJY2hpbGQgPSBuZXcgUHJvY2Vzc2VzSXRlbVByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5LCBwbHVnaW4sCi0JCQkJCWdldE1vZGVsU3RydWN0dXJlKCkpOwotCQkJY2hpbGRyZW4uYWRkKGNoaWxkKTsKLQkJCWdyb3VwSXRlbVByb3ZpZGVyTWFwLnB1dChuYW1lLCBjaGlsZCk7Ci0JCX0KLQotCQlyZXR1cm4gY2hpbGRyZW47Ci0JfQotCQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlpZiAoY2hpbGRyZW4gIT0gbnVsbCkgewotCQkJY2hpbGRyZW4uY2xlYXIoKTsKLQkJCWNoaWxkcmVuID0gbnVsbDsKLQkJfQotCi0JCXN1cGVyLmRpc3Bvc2UoKTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuICgoKE1ldGhvZFBsdWdpbikgb2JqZWN0KS5nZXRVc2VyQ2hhbmdlYWJsZSgpLmJvb2xlYW5WYWx1ZSgpKSA/IFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvTWV0aG9kUGx1Z2luIikgOiAvLyROT04tTkxTLTEkCi0JCQkJVW1hRWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9NZXRob2RQbHVnaW5fZ3JleSIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLk1ldGhvZFBsdWdpbkl0ZW1Qcm92aWRlciNub3RpZnlDaGFuZ2VkKG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoTWV0aG9kUGx1Z2luLmNsYXNzKSkgewotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1BMVUdJTl9fQ09QWVJJR0hUX1NUQVRFTUVOVDoKLQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24KLQkJCQkJLmdldE5vdGlmaWVyKCksIHRydWUsIGZhbHNlKSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfUExVR0lOX19OQU1FOgotCQkJVG5nVXRpbC5yZWZyZXNoUGFyZW50SWZOYW1lQ2hhbmdlZChub3RpZmljYXRpb24sIHRoaXMpOwotCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbgotCQkJCQkuZ2V0Tm90aWZpZXIoKSwgdHJ1ZSwgdHJ1ZSkpOwotCQkJVG5nVXRpbC5yZWZyZXNoUGx1Z2luRXh0ZW5kZXJzKHRoaXMsIG5vdGlmaWNhdGlvbiwgdHJ1ZSwgdHJ1ZSk7Ci0JCQlicmVhazsKLQkJfQotCi0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIG5hbWUgPSBzdXBlci5nZXRUZXh0KG9iamVjdCk7Ci0JCQotCQlpZiAoKGdldFBhcmVudCgpIGluc3RhbmNlb2YgUGx1Z2luVUlQYWNrYWdlc0l0ZW1Qcm92aWRlcikgJiYgIVBsdWdpblVJUGFja2FnZUNvbnRleHQuSU5TVEFOQ0UuaXNGbGF0TGF5b3V0KCkpIHsKLQkJCVN0cmluZyBkZWx0YU5hbWUgPSBQbHVnaW5VSVBhY2thZ2VzSXRlbVByb3ZpZGVyLmdldE5hbWVEZWx0YSgoUGx1Z2luVUlQYWNrYWdlc0l0ZW1Qcm92aWRlcilnZXRQYXJlbnQoKSwgb2JqZWN0KTsKLQkJCXJldHVybiBkZWx0YU5hbWU7Ci0JCX0KLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRGdWxsTmFtZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBzdXBlci5nZXRUZXh0KG9iamVjdCk7Ci0JfQotCi0JCi0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L25hdmlnYXRvci9QbHVnaW5VSVBhY2thZ2VCdWlsZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L25hdmlnYXRvci9QbHVnaW5VSVBhY2thZ2VCdWlsZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4ODg1MjQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9uYXZpZ2F0b3IvUGx1Z2luVUlQYWNrYWdlQnVpbGRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQubmF2aWdhdG9yOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklMaWJyYXJ5SXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Db21wYXJhdG9yczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuUGx1Z2luVUlQYWNrYWdlc01hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLQotLyoqCi0gKiBAc2luY2UgMS41Ci0gKi8KLXB1YmxpYyBjbGFzcyBQbHVnaW5VSVBhY2thZ2VCdWlsZGVyIHsKLQlwcml2YXRlIEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5OwotCXByaXZhdGUgTWFwPFN0cmluZywgUGx1Z2luVUlQYWNrYWdlc0l0ZW1Qcm92aWRlcj4gcGx1Z2luUGFja2FnZXNJdGVtUHJvdmlkZXJzTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBQbHVnaW5VSVBhY2thZ2VzSXRlbVByb3ZpZGVyPigpOwotCi0JcHVibGljIFBsdWdpblVJUGFja2FnZUJ1aWxkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJdGhpcy5hZGFwdGVyRmFjdG9yeSA9IGFkYXB0ZXJGYWN0b3J5OwotCX0KLQkKLQlwdWJsaWMgUGx1Z2luVUlQYWNrYWdlc0l0ZW1Qcm92aWRlciBnZXRQbHVnaW5VSVBhY2thZ2VzSXRlbVByb3ZpZGVyKFN0cmluZyBwbHVnaW5Qa2dOYW1lKSB7Ci0JCXJldHVybiBwbHVnaW5QYWNrYWdlc0l0ZW1Qcm92aWRlcnNNYXAuZ2V0KHBsdWdpblBrZ05hbWUpOwotCX0KLQkKLQlwdWJsaWMgQ29sbGVjdGlvbjxPYmplY3Q+IGdldENoaWxkcmVuKENvbGxlY3Rpb248TWV0aG9kUGx1Z2luPiBwbHVnaW5zKSB7Ci0JCUFycmF5TGlzdDxPYmplY3Q+IGNoaWxkcmVuID0gbmV3IEFycmF5TGlzdDxPYmplY3Q+KCk7Ci0JCWFkZENoaWxkcmVuKGNoaWxkcmVuLCBwbHVnaW5zLCBudWxsKTsKLQkJQ29sbGVjdGlvbnMuc29ydChjaGlsZHJlbiwgQ29tcGFyYXRvcnMuUExVR0lOUEFDS0FHRV9DT01QQVJBVE9SKTsKLQkJcmV0dXJuIGNoaWxkcmVuOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgcmV0YWluUGx1Z2luUGFja2FnZXNJdGVtUHJvdmlkZXJzKENvbGxlY3Rpb248U3RyaW5nPiBuYW1lcykgewotCQlmb3IgKEl0ZXJhdG9yPFN0cmluZz4gaXRlciA9IHBsdWdpblBhY2thZ2VzSXRlbVByb3ZpZGVyc01hcC5rZXlTZXQoKS5pdGVyYXRvcigpO2l0ZXIuaGFzTmV4dCgpOykgewotCQkJU3RyaW5nIGtleU5hbWUgPSBpdGVyLm5leHQoKTsKLQkJCWlmICghbmFtZXMuY29udGFpbnMoa2V5TmFtZSkpIHsKLQkJCQlQbHVnaW5VSVBhY2thZ2VzSXRlbVByb3ZpZGVyIHByb3ZpZGVyID0gcGx1Z2luUGFja2FnZXNJdGVtUHJvdmlkZXJzTWFwLmdldChrZXlOYW1lKTsKLQkJCQlpZiAocHJvdmlkZXIgIT0gbnVsbCkgewotCQkJCQlwcm92aWRlci5kaXNwb3NlKCk7Ci0JCQkJfQotCQkJCWl0ZXIucmVtb3ZlKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRDaGlsZHJlbihDb2xsZWN0aW9uPE9iamVjdD4gY2hpbGRyZW4sIENvbGxlY3Rpb248TWV0aG9kUGx1Z2luPiBwbHVnaW5zLCBPYmplY3QgcGFyZW50KSB7Ci0JCVBsdWdpblVJUGFja2FnZXNNYXAgbWFwID0gbmV3IFBsdWdpblVJUGFja2FnZXNNYXAoKTsKLQkJZm9yIChJdGVyYXRvcjxNZXRob2RQbHVnaW4+IGl0ZXIgPSBwbHVnaW5zLml0ZXJhdG9yKCk7aXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gaXRlci5uZXh0KCk7Ci0JCQlTdHJpbmcgcGx1Z2luTmFtZSA9IHBsdWdpbi5nZXROYW1lKCk7Ci0JCQlpbnQgZG90SWR4ID0gcGx1Z2luTmFtZS5pbmRleE9mKFBsdWdpblVJUGFja2FnZXNJdGVtUHJvdmlkZXIuUExVR0lOX1BBQ0tBR0VfU0VQQVJBVE9SKTsKLQkJCWlmIChkb3RJZHggIT0gLTEpIHsKLQkJCQltYXAuYWRkKHBsdWdpbk5hbWUuc3Vic3RyaW5nKDAsIGRvdElkeCksIHBsdWdpbik7Ci0JCQl9IGVsc2UgewotCQkJCWNoaWxkcmVuLmFkZChwbHVnaW4pOwotCQkJCU9iamVjdCBhZGFwdGVyID0gYWRhcHRlckZhY3RvcnkuYWRhcHQocGx1Z2luLAotCQkJCQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCQlpZiAoYWRhcHRlciBpbnN0YW5jZW9mIElMaWJyYXJ5SXRlbVByb3ZpZGVyKSB7Ci0JCQkJCSgoSUxpYnJhcnlJdGVtUHJvdmlkZXIpIGFkYXB0ZXIpLnNldFBhcmVudChwYXJlbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlDb2xsZWN0aW9uPFN0cmluZz4gZXhpc3RpbmdOYW1lcyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKLQkJZm9yIChJdGVyYXRvcjxNYXAuRW50cnk8U3RyaW5nLCBTZXQ8TWV0aG9kUGx1Z2luPj4+IGl0ZXIgPSBtYXAuZW50cnlTZXQoKS5pdGVyYXRvcigpO2l0ZXIuaGFzTmV4dCgpOykgewotCQkJTWFwLkVudHJ5PFN0cmluZywgU2V0PE1ldGhvZFBsdWdpbj4+IGVudHJ5ID0gaXRlci5uZXh0KCk7Ci0JCQlTdHJpbmcgbmFtZSA9IGVudHJ5LmdldEtleSgpOwotCQkJU2V0PE1ldGhvZFBsdWdpbj4gcGx1Z1NldCA9IGVudHJ5LmdldFZhbHVlKCk7Ci0JCQlQbHVnaW5VSVBhY2thZ2VzSXRlbVByb3ZpZGVyIHByb3ZpZGVyID0gcGx1Z2luUGFja2FnZXNJdGVtUHJvdmlkZXJzTWFwLmdldChuYW1lKTsKLQkJCWlmIChwcm92aWRlciA9PSBudWxsKSB7Ci0JCQkJcHJvdmlkZXIgPSBuZXcgUGx1Z2luVUlQYWNrYWdlc0l0ZW1Qcm92aWRlcihhZGFwdGVyRmFjdG9yeSwgbmFtZSwgcGx1Z1NldCk7Ci0JCQkJcGx1Z2luUGFja2FnZXNJdGVtUHJvdmlkZXJzTWFwLnB1dChuYW1lLCBwcm92aWRlcik7Ci0JCQl9IGVsc2UgewotCQkJCXByb3ZpZGVyLnNldFBsdWdpbnMocGx1Z1NldCk7Ci0JCQl9Ci0JCQlleGlzdGluZ05hbWVzLmFkZChuYW1lKTsKLQkJCXByb3ZpZGVyLnNldFBhcmVudChwYXJlbnQpOwotCQkJY2hpbGRyZW4uYWRkKHByb3ZpZGVyKTsKLQkJfQotCQlyZXRhaW5QbHVnaW5QYWNrYWdlc0l0ZW1Qcm92aWRlcnMoZXhpc3RpbmdOYW1lcyk7Ci0JfQotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJaWYgKHBsdWdpblBhY2thZ2VzSXRlbVByb3ZpZGVyc01hcCAhPSBudWxsKSB7Ci0JCQlwbHVnaW5QYWNrYWdlc0l0ZW1Qcm92aWRlcnNNYXAuY2xlYXIoKTsKLQkJCXBsdWdpblBhY2thZ2VzSXRlbVByb3ZpZGVyc01hcCA9IG51bGw7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L25hdmlnYXRvci9QbHVnaW5VSVBhY2thZ2VzSXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L25hdmlnYXRvci9QbHVnaW5VSVBhY2thZ2VzSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiZGNmMWQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9uYXZpZ2F0b3IvUGx1Z2luVUlQYWNrYWdlc0l0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQubmF2aWdhdG9yOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUxpYnJhcnlJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JU3RhdGVmdWxJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Db21wYXJhdG9yczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuUGx1Z2luVUlQYWNrYWdlc01hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuTWV0aG9kUGx1Z2luSXRlbVByb3ZpZGVyOwotCi0vKioKLSAqIEl0ZW0gUHJvdmlkZXIgQWRhcHRlciB0aGF0IHJlcHJlc2VudHMgYSBwbHVnaW4tcGFja2FnZS4gIFRoaXMgaXMgYSBVSSBmb2xkZXIgb25seQotICogQGF1dGhvciBKZWZmIEhhcmR5Ci0gKgotICovCi1wdWJsaWMgY2xhc3MgUGx1Z2luVUlQYWNrYWdlc0l0ZW1Qcm92aWRlciBleHRlbmRzIEl0ZW1Qcm92aWRlckFkYXB0ZXIgaW1wbGVtZW50cyBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCi0JSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElMaWJyYXJ5SXRlbVByb3ZpZGVyLCBJU3RhdGVmdWxJdGVtUHJvdmlkZXIgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX1BBQ0tBR0VfU0VQQVJBVE9SID0gIi4iOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIE9iamVjdCBwYXJlbnQ7Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLQkKLQlwcml2YXRlIENvbGxlY3Rpb248TWV0aG9kUGx1Z2luPiBwbHVnaW5zOwotCi0JcHJpdmF0ZSBNYXA8U3RyaW5nLCBQbHVnaW5VSVBhY2thZ2VzSXRlbVByb3ZpZGVyPiBwbHVnaW5QYWNrYWdlc0l0ZW1Qcm92aWRlcnNNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFBsdWdpblVJUGFja2FnZXNJdGVtUHJvdmlkZXI+KCk7Ci0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFBsdWdpblVJUGFja2FnZXNJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksIFN0cmluZyBwYWNrYWdlTmFtZSwgQ29sbGVjdGlvbjxNZXRob2RQbHVnaW4+IHBsdWdpbnMpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCQl0aGlzLm5hbWUgPSBwYWNrYWdlTmFtZTsKLQkJdGhpcy5wbHVnaW5zID0gcGx1Z2luczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRQYXJlbnQoT2JqZWN0IHBhcmVudCkgewotCQl0aGlzLnBhcmVudCA9IHBhcmVudDsKLQl9Ci0JCi0JLyoqCi0JICogCi0JICogQHJldHVybiB0aGUgcGFyZW50IG9mIHRoaXMgSXRlbVByb3ZpZGVyCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRQYXJlbnQoKSB7Ci0JCXJldHVybiBwYXJlbnQ7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBDb2xsZWN0aW9uPD8gZXh0ZW5kcyBFU3RydWN0dXJhbEZlYXR1cmU+IGdldENoaWxkcmVuRmVhdHVyZXMoT2JqZWN0IG9iamVjdCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBzdXBlci5nZXRDaGlsZHJlbkZlYXR1cmVzKG9iamVjdCk7Ci0JfQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRUZXh0KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG5hbWU7IAotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRJbWFnZShqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvcGFja2FnZV9vYmoiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE5hbWVEZWx0YShQbHVnaW5VSVBhY2thZ2VzSXRlbVByb3ZpZGVyIHRvcE9iamVjdCwgT2JqZWN0IGJvdHRvbU9iamVjdCkgewotCQkKLQkJU3RyaW5nIHRvcE5hbWU9IHRvcE9iamVjdC5nZXRGdWxsTmFtZSgpOwotCQlTdHJpbmcgYm90dG9tTmFtZSA9IG51bGw7Ci0JCWlmIChib3R0b21PYmplY3QgaW5zdGFuY2VvZiBQbHVnaW5VSVBhY2thZ2VzSXRlbVByb3ZpZGVyKSB7Ci0JCQlib3R0b21OYW1lID0gKChQbHVnaW5VSVBhY2thZ2VzSXRlbVByb3ZpZGVyKWJvdHRvbU9iamVjdCkuZ2V0RnVsbE5hbWUoKTsKLQkJCQotCQl9IGVsc2UgaWYgKGJvdHRvbU9iamVjdCBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikgewotCQkJYm90dG9tTmFtZSA9ICgoTWV0aG9kUGx1Z2luKWJvdHRvbU9iamVjdCkuZ2V0TmFtZSgpOwotCQl9Ci0JCQotCQlpZihib3R0b21OYW1lID09IG51bGwgfHwgdG9wTmFtZS5lcXVhbHMoYm90dG9tTmFtZSkpCi0JCQlyZXR1cm4gdG9wTmFtZTsKLQkJdHJ5IHsKLQkJCVN0cmluZyBkZWx0YW5hbWU9IGJvdHRvbU5hbWUuc3Vic3RyaW5nKHRvcE5hbWUubGVuZ3RoKCkrMSk7Ci0JCQlyZXR1cm4gZGVsdGFuYW1lOwotCQl9IGNhdGNoIChTdHJpbmdJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBib3R0b21OYW1lOwotCQl9Ci0JfQotCi0JCi0JcHVibGljIENvbGxlY3Rpb248T2JqZWN0PiBnZXRDaGlsZHJlbihPYmplY3QgcGFyZW50RWxlbWVudCkgewotCQlyZXR1cm4gYWRkQ2hpbGRyZW4ocGx1Z2lucyk7Ci0JfQotCQotCXByaXZhdGUgQ29sbGVjdGlvbjxPYmplY3Q+IGFkZENoaWxkcmVuKENvbGxlY3Rpb248TWV0aG9kUGx1Z2luPiBwbHVnaW5zKSB7Ci0JCUxpc3QgY2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCVBsdWdpblVJUGFja2FnZXNNYXAgbWFwID0gbmV3IFBsdWdpblVJUGFja2FnZXNNYXAoKTsKLQkJZm9yIChJdGVyYXRvcjxNZXRob2RQbHVnaW4+IGl0ZXIgPSBwbHVnaW5zLml0ZXJhdG9yKCk7aXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gaXRlci5uZXh0KCk7Ci0JCQlTdHJpbmcgZGVsdGFOYW1lID0gZ2V0TmFtZURlbHRhKHRoaXMsIHBsdWdpbik7Ci0JCQlpbnQgZG90SWR4ID0gZGVsdGFOYW1lLmluZGV4T2YoUExVR0lOX1BBQ0tBR0VfU0VQQVJBVE9SKTsKLQkJCWlmIChkb3RJZHggIT0gLTEpIHsKLQkJCQltYXAuYWRkKGRlbHRhTmFtZS5zdWJzdHJpbmcoMCwgZG90SWR4KSwgcGx1Z2luKTsKLQkJCX0gZWxzZSB7Ci0JCQkJY2hpbGRyZW4uYWRkKHBsdWdpbik7Ci0JCQkJT2JqZWN0IGFkYXB0ZXIgPSBhZGFwdGVyRmFjdG9yeS5hZGFwdChwbHVnaW4sCi0JCQkJCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkJCWlmIChhZGFwdGVyIGluc3RhbmNlb2YgSUxpYnJhcnlJdGVtUHJvdmlkZXIpIHsKLQkJCQkJKChJTGlicmFyeUl0ZW1Qcm92aWRlcikgYWRhcHRlcikuc2V0UGFyZW50KHRoaXMpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlDb2xsZWN0aW9uPFN0cmluZz4gZXhpc3RpbmdOYW1lcyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKLQkJZm9yIChJdGVyYXRvcjxNYXAuRW50cnk8U3RyaW5nLCBTZXQ8TWV0aG9kUGx1Z2luPj4+IGl0ZXIgPSBtYXAuZW50cnlTZXQoKS5pdGVyYXRvcigpO2l0ZXIuaGFzTmV4dCgpOykgewotCQkJTWFwLkVudHJ5PFN0cmluZywgU2V0PE1ldGhvZFBsdWdpbj4+IGVudHJ5ID0gaXRlci5uZXh0KCk7Ci0JCQlTdHJpbmcgbmFtZSA9IGVudHJ5LmdldEtleSgpOwotCQkJU2V0PE1ldGhvZFBsdWdpbj4gcGx1Z1NldCA9IGVudHJ5LmdldFZhbHVlKCk7Ci0JCQlQbHVnaW5VSVBhY2thZ2VzSXRlbVByb3ZpZGVyIHByb3ZpZGVyID0gcGx1Z2luUGFja2FnZXNJdGVtUHJvdmlkZXJzTWFwLmdldChnZXRGdWxsTmFtZSgpICsgUExVR0lOX1BBQ0tBR0VfU0VQQVJBVE9SICsgbmFtZSk7Ci0JCQlpZiAocHJvdmlkZXIgPT0gbnVsbCkgewotCQkJCXByb3ZpZGVyID0gbmV3IFBsdWdpblVJUGFja2FnZXNJdGVtUHJvdmlkZXIoYWRhcHRlckZhY3RvcnksIG5hbWUsIHBsdWdTZXQpOwotCQkJCXBsdWdpblBhY2thZ2VzSXRlbVByb3ZpZGVyc01hcC5wdXQoZ2V0RnVsbE5hbWUoKSArIFBMVUdJTl9QQUNLQUdFX1NFUEFSQVRPUiArIG5hbWUsIHByb3ZpZGVyKTsKLQkJCX0gZWxzZSB7Ci0JCQkJcHJvdmlkZXIuc2V0UGx1Z2lucyhwbHVnU2V0KTsKLQkJCX0KLQkJCWV4aXN0aW5nTmFtZXMuYWRkKGdldEZ1bGxOYW1lKCkgKyBQTFVHSU5fUEFDS0FHRV9TRVBBUkFUT1IgKyBuYW1lKTsKLQkJCXByb3ZpZGVyLnNldFBhcmVudCh0aGlzKTsKLQkJCWNoaWxkcmVuLmFkZChwcm92aWRlcik7Ci0JCX0KLQkJcmV0YWluUGx1Z2luUGFja2FnZXNJdGVtUHJvdmlkZXJzKGV4aXN0aW5nTmFtZXMpOwotCQlDb2xsZWN0aW9ucy5zb3J0KGNoaWxkcmVuLCBDb21wYXJhdG9ycy5QTFVHSU5QQUNLQUdFX0NPTVBBUkFUT1IpOwotCQlyZXR1cm4gY2hpbGRyZW47Ci0JfQotCQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gZnVsbCBuYW1lIG9mIHRoaXMgcGFja2FnZQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RnVsbE5hbWUoKSB7Ci0JCVN0cmluZyBmdWxsTmFtZSA9IGdldE5hbWUoKTsKLQkJT2JqZWN0IHBhcmVudCA9IGdldFBhcmVudCgpOwotCQl3aGlsZSAocGFyZW50IGluc3RhbmNlb2YgUGx1Z2luVUlQYWNrYWdlc0l0ZW1Qcm92aWRlcikgewotCQkJZnVsbE5hbWUgPSAoKFBsdWdpblVJUGFja2FnZXNJdGVtUHJvdmlkZXIpcGFyZW50KS5nZXROYW1lKCkgKyBQTFVHSU5fUEFDS0FHRV9TRVBBUkFUT1IgKyBmdWxsTmFtZTsKLQkJCXBhcmVudCA9ICgoUGx1Z2luVUlQYWNrYWdlc0l0ZW1Qcm92aWRlcilwYXJlbnQpLmdldFBhcmVudCgpOwotCQl9Ci0JCXJldHVybiBmdWxsTmFtZTsKLQkJCi0JfQotCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gbmFtZTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IG9iamVjdCkgewotCQlpZiAocGFyZW50ICE9IG51bGwpCi0JCQlyZXR1cm4gcGFyZW50OwotCQlyZXR1cm4gdGFyZ2V0OwotCX0KLQkKLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoTWV0aG9kUGx1Z2luLmNsYXNzKSkgewotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1BMVUdJTl9fTkFNRToKLQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24KLQkJCQkJLmdldE5vdGlmaWVyKCksIHRydWUsIHRydWUpKTsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCS8vIHJlbW92ZSB0aGlzIGZyb20gdGhlIHBsdWdpbnMnIGFkYXB0ZXIgbGlzdAotCQlpZiAocGx1Z2luUGFja2FnZXNJdGVtUHJvdmlkZXJzTWFwICE9IG51bGwpIHsKLQkJCXBsdWdpblBhY2thZ2VzSXRlbVByb3ZpZGVyc01hcC5jbGVhcigpOwotCQkJcGx1Z2luUGFja2FnZXNJdGVtUHJvdmlkZXJzTWFwID0gbnVsbDsKLQkJfQotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCByZXRhaW5QbHVnaW5QYWNrYWdlc0l0ZW1Qcm92aWRlcnMoQ29sbGVjdGlvbjxTdHJpbmc+IG5hbWVzKSB7Ci0JCWZvciAoSXRlcmF0b3I8U3RyaW5nPiBpdGVyID0gcGx1Z2luUGFja2FnZXNJdGVtUHJvdmlkZXJzTWFwLmtleVNldCgpLml0ZXJhdG9yKCk7aXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlTdHJpbmcga2V5TmFtZSA9IGl0ZXIubmV4dCgpOwotCQkJaWYgKCFuYW1lcy5jb250YWlucyhrZXlOYW1lKSkgewotCQkJCVBsdWdpblVJUGFja2FnZXNJdGVtUHJvdmlkZXIgcHJvdmlkZXIgPSBwbHVnaW5QYWNrYWdlc0l0ZW1Qcm92aWRlcnNNYXAuZ2V0KGtleU5hbWUpOwotCQkJCWlmIChwcm92aWRlciAhPSBudWxsKSB7Ci0JCQkJCXByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJCQl9Ci0JCQkJaXRlci5yZW1vdmUoKTsKLQkJCX0KLQkJfQotCX0KLQkKLQlwdWJsaWMgQ29sbGVjdGlvbjxNZXRob2RQbHVnaW4+IGdldFBsdWdpbnMoKSB7Ci0JCXJldHVybiBwbHVnaW5zOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFBsdWdpbnMoQ29sbGVjdGlvbjxNZXRob2RQbHVnaW4+IHBsdWdpbnMpIHsKLQkJdGhpcy5wbHVnaW5zID0gcGx1Z2luczsKLQl9Ci0JCi0JLyoqCi0JICogCi0JICogQHBhcmFtIHBsdWdpbgotCSAqIEByZXR1cm4gdGhlIEl0ZW1Qcm92aWRlckFkYXB0ZXIgZm9yIHRoZSBwbHVnaW4gLSBlaXRoZXIgYSBNZXRob2RQbHVnaW5JdGVtUHJvdmlkZXIgb3IgYSBQbHVnaW5VSVBhY2thZ2VzSXRlbVByb3ZpZGVyLiBudWxsIGlmIG5vbmUgZm91bmQKLQkgKi8KLQlwdWJsaWMgSXRlbVByb3ZpZGVyQWRhcHRlciBnZXRQbHVnaW5JdGVtUHJvdmlkZXIoTWV0aG9kUGx1Z2luIHBsdWdpbikgewotCQlTdHJpbmcgZGVsdGFOYW1lID0gZ2V0TmFtZURlbHRhKHRoaXMsIHBsdWdpbik7Ci0JCWludCBkb3RJZHggPSBkZWx0YU5hbWUuaW5kZXhPZihQbHVnaW5VSVBhY2thZ2VzSXRlbVByb3ZpZGVyLlBMVUdJTl9QQUNLQUdFX1NFUEFSQVRPUik7Ci0JCWlmIChkb3RJZHggIT0gLTEpIHsKLQkJCVN0cmluZyBwYWNrYWdlUHJvdmlkZXJOYW1lID0gZGVsdGFOYW1lLnN1YnN0cmluZygwLCBkb3RJZHgpOwotCQkJaWYgKHBsdWdpblBhY2thZ2VzSXRlbVByb3ZpZGVyc01hcCAhPSBudWxsKSB7Ci0JCQkJUGx1Z2luVUlQYWNrYWdlc0l0ZW1Qcm92aWRlciBwcm92aWRlciA9IHBsdWdpblBhY2thZ2VzSXRlbVByb3ZpZGVyc01hcC5nZXQoZ2V0RnVsbE5hbWUoKSArIFBMVUdJTl9QQUNLQUdFX1NFUEFSQVRPUiArIHBhY2thZ2VQcm92aWRlck5hbWUpOwotCQkJCWlmIChwcm92aWRlciAhPSBudWxsKSB7Ci0JCQkJCXJldHVybiBwcm92aWRlcjsKLQkJCQl9Ci0JCQl9CQkJCi0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gKE1ldGhvZFBsdWdpbkl0ZW1Qcm92aWRlcikgVG5nVXRpbAotCQkJCS5nZXRBZGFwdGVyKHBsdWdpbiwgTWV0aG9kUGx1Z2luSXRlbVByb3ZpZGVyLmNsYXNzKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogCi0JICogQHBhcmFtIGl0ZW1OYW1lIG5hbWUgb2YgaXRlbSB0byBmaW5kCi0JICogQHBhcmFtIGxpYiBNZXRob2RMaWJyYXJ5Ci0JICogQHJldHVybiB0aGUgTWV0aG9kUGx1Z2luIG9yIFBsdWdpblVJUGFja2FnZXNJdGVtUHJvdmlkZXIgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUsIG9yIG51bGwgaWYgbm90IGZvdW5kCi0JICovCi0JcHVibGljIHN0YXRpYyBPYmplY3QgZmluZFBsdWdpbkl0ZW1Qcm92aWRlcihTdHJpbmcgaXRlbU5hbWUsIE1ldGhvZExpYnJhcnkgbGliKSB7Ci0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciBhZGFwdGVyID0gKElUcmVlSXRlbUNvbnRlbnRQcm92aWRlcilUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCS5nZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKS5hZGFwdChsaWIsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCWlmIChhZGFwdGVyIGluc3RhbmNlb2YgTWV0aG9kTGlicmFyeUl0ZW1Qcm92aWRlcikgewotCQkJTWV0aG9kTGlicmFyeUl0ZW1Qcm92aWRlciBsaWJyYXJ5QWRhcHRlciA9IChNZXRob2RMaWJyYXJ5SXRlbVByb3ZpZGVyKWFkYXB0ZXI7Ci0JCQlMaXN0PE1ldGhvZFBsdWdpbj4gcGx1Z2luTGlzdCA9IGxpYi5nZXRNZXRob2RQbHVnaW5zKCk7Ci0JCQlmb3IgKE1ldGhvZFBsdWdpbiBwbHVnaW4gOiBwbHVnaW5MaXN0KSB7Ci0JCQkJaWYgKGl0ZW1OYW1lLmVxdWFscyhwbHVnaW4uZ2V0TmFtZSgpKSkgewotCQkJCQlyZXR1cm4gcGx1Z2luOwotCQkJCX0KLQkJCQlDb2xsZWN0aW9uPD8+IGNoaWxkcmVuID0gbGlicmFyeUFkYXB0ZXIuZ2V0Q2hpbGRyZW4obGliKTsKLQkJCQlJdGVtUHJvdmlkZXJBZGFwdGVyIHBsdWdpblRyZWVBZGFwdGVyID0gbGlicmFyeUFkYXB0ZXIuZ2V0UGx1Z2luSXRlbVByb3ZpZGVyKHBsdWdpbik7Ci0JCQkJd2hpbGUgKHBsdWdpblRyZWVBZGFwdGVyIGluc3RhbmNlb2YgUGx1Z2luVUlQYWNrYWdlc0l0ZW1Qcm92aWRlcikgewotCQkJCQlpZiAoaXRlbU5hbWUuZXF1YWxzKCgoUGx1Z2luVUlQYWNrYWdlc0l0ZW1Qcm92aWRlcilwbHVnaW5UcmVlQWRhcHRlcikuZ2V0RnVsbE5hbWUoKSkpIHsKLQkJCQkJCXJldHVybiBwbHVnaW5UcmVlQWRhcHRlcjsKLQkJCQkJfQotCQkJCQljaGlsZHJlbiA9IHBsdWdpblRyZWVBZGFwdGVyLmdldENoaWxkcmVuKHBsdWdpblRyZWVBZGFwdGVyKTsKLQkJCQkJcGx1Z2luVHJlZUFkYXB0ZXIgPSAoKFBsdWdpblVJUGFja2FnZXNJdGVtUHJvdmlkZXIpcGx1Z2luVHJlZUFkYXB0ZXIpLmdldFBsdWdpbkl0ZW1Qcm92aWRlcihwbHVnaW4pOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L25hdmlnYXRvci9QcmFjdGljZUl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9uYXZpZ2F0b3IvUHJhY3RpY2VJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWFmNTg3NC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L25hdmlnYXRvci9QcmFjdGljZUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQubmF2aWdhdG9yOwotCi1pbXBvcnQgamF2YS5uZXQuVVJJOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkFkZENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRGVmYXVsdE5hbWVTZXR0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuTWV0aG9kRWxlbWVudEFkZENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkxpYnJhcnlFZGl0Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpYmFibGVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3VpZGFuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJhY3RpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiBUaGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHByYWN0aWNlLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBQcmFjdGljZUl0ZW1Qcm92aWRlciBleHRlbmRzCi0JCW9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuUHJhY3RpY2VJdGVtUHJvdmlkZXIgaW1wbGVtZW50cyBJRGVmYXVsdE5hbWVTZXR0ZXIgewotCi0JcHVibGljIFByYWN0aWNlSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuUHJhY3RpY2VJdGVtUHJvdmlkZXIjY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoamF2YS51dGlsLkNvbGxlY3Rpb24sCi0JICogICAgICBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywKLQkJCU9iamVjdCBvYmplY3QpIHsKLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0UHJhY3RpY2VfU3ViUHJhY3RpY2VzKCksIFVtYUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJLmNyZWF0ZVByYWN0aWNlKCkpKTsKLQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5QcmFjdGljZUl0ZW1Qcm92aWRlciNnZXRDaGlsZHJlbkZlYXR1cmVzKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5GZWF0dXJlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlbkZlYXR1cmVzID09IG51bGwpIHsKLQkJCWNoaWxkcmVuRmVhdHVyZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQljaGlsZHJlbkZlYXR1cmVzLmFkZChVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkuZ2V0UHJhY3RpY2VfU3ViUHJhY3RpY2VzKCkpOwotCQl9Ci0JCXJldHVybiBjaGlsZHJlbkZlYXR1cmVzOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRQYXJlbnQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3Qgb2JqZWN0KSB7Ci0JCU9iamVjdCBwYXJlbnQgPSBUbmdVdGlsCi0JCQkJLmdldE5hdmlnYXRvclBhcmVudEl0ZW1Qcm92aWRlcigoR3VpZGFuY2UpIG9iamVjdCk7Ci0JCWlmIChwYXJlbnQgPT0gbnVsbCkgewotCQkJcmV0dXJuIHN1cGVyLmdldFBhcmVudChvYmplY3QpOwotCQl9Ci0JCXJldHVybiBwYXJlbnQ7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldFRleHQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gVG5nVXRpbC5nZXRMYWJlbChvYmplY3QsIGdldFN0cmluZygiX1VJX1ByYWN0aWNlX3R5cGUiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIERlc2NyaWJhYmxlRWxlbWVudCkgewotCQkJaWYgKCgoRGVzY3JpYmFibGVFbGVtZW50KSBvYmplY3QpLmdldE5vZGVpY29uKCkgIT0gbnVsbCkgewotCQkJCVVSSSBpbWdVcmkgPSBUbmdVdGlsLmdldEZ1bGxQYXRob2ZOb2Rlb3JTaGFwZUljb25VUkkoCi0JCQkJCQkoRGVzY3JpYmFibGVFbGVtZW50KSBvYmplY3QsCi0JCQkJCQkoKERlc2NyaWJhYmxlRWxlbWVudCkgb2JqZWN0KS5nZXROb2RlaWNvbigpKTsKLQkJCQlPYmplY3QgaW1hZ2UgPSBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkJLmdldFNoYXJlZEltYWdlKGltZ1VyaSk7Ci0JCQkJaWYgKGltYWdlICE9IG51bGwpCi0JCQkJCXJldHVybiBpbWFnZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0SW1hZ2Uob2JqZWN0KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXIjbm90aWZ5Q2hhbmdlZChvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb24pCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbXNnKSB7Ci0JCVRuZ1V0aWwuc2V0RGVmYXVsdE5hbWUodGhpcywgbXNnKTsKLQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG1zZyk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RGVmYXVsdE5hbWUoT2JqZWN0IG9iaikgewotCQlQcmFjdGljZSBwcmFjdGljZSA9IChQcmFjdGljZSkgZ2V0UGFyZW50KG9iaik7Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBQcmFjdGljZSkgewotCQkJVG5nVXRpbC5zZXREZWZhdWx0TmFtZShwcmFjdGljZS5nZXRTdWJQcmFjdGljZXMoKSwKLQkJCQkJKE1ldGhvZEVsZW1lbnQpIG9iaiwgTGlicmFyeUVkaXRDb25zdGFudHMuTkVXX1BSQUNUSUNFKTsgCi0JCX0KLQl9Ci0KLQlwdWJsaWMgaW50IGdldEludGVyZXN0ZWRGZWF0dXJlSUQoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLlBSQUNUSUNFX19TVUJfUFJBQ1RJQ0VTOwotCX0KLQotCXB1YmxpYyBDbGFzcyBnZXRJbnRlcmVzdGVkRmVhdHVyZU93bmVyQ2xhc3MoKSB7Ci0JCXJldHVybiBQcmFjdGljZS5jbGFzczsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29tbWFuZCBjcmVhdGVBZGRDb21tYW5kKEVkaXRpbmdEb21haW4gZG9tYWluLCBFT2JqZWN0IG93bmVyLAotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIENvbGxlY3Rpb24gY29sbGVjdGlvbiwgaW50IGluZGV4KSB7Ci0JCXJldHVybiBuZXcgTWV0aG9kRWxlbWVudEFkZENvbW1hbmQoKEFkZENvbW1hbmQpIHN1cGVyLmNyZWF0ZUFkZENvbW1hbmQoCi0JCQkJZG9tYWluLCBvd25lciwgZmVhdHVyZSwgY29sbGVjdGlvbiwgaW5kZXgpKTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L25hdmlnYXRvci9Qcm9jZXNzQ29tcG9uZW50SXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L25hdmlnYXRvci9Qcm9jZXNzQ29tcG9uZW50SXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkMGYxZDMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9uYXZpZ2F0b3IvUHJvY2Vzc0NvbXBvbmVudEl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQubmF2aWdhdG9yOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ2FwYWJpbGl0eVBhdHRlcm47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyeVByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5VbWFFZGl0UGx1Z2luOwotCi0vKioKLSAqIFRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEgcHJvY2VzcyBjb21wb25lbnQgaW4gdGhlIExpYnJhcnkgdmlldy4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUHJvY2Vzc0NvbXBvbmVudEl0ZW1Qcm92aWRlciBleHRlbmRzCi0JCW9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuUHJvY2Vzc0NvbXBvbmVudEl0ZW1Qcm92aWRlciB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBQcm9jZXNzQ29tcG9uZW50SXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoamF2YS51dGlsLkNvbGxlY3Rpb24sCi0JICogICAgICBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywKLQkJCU9iamVjdCBvYmplY3QpIHsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0Q2hpbGRyZW5GZWF0dXJlcyhqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuRmVhdHVyZXMoT2JqZWN0IG9iamVjdCkgewotCQkvLyBpZihjaGlsZHJlbkZlYXR1cmVzID09IG51bGwpIHsKLQkJLy8gY2hpbGRyZW5GZWF0dXJlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJLy8gY2hpbGRyZW5GZWF0dXJlcy5hZGQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UHJvY2Vzc0NvbXBvbmVudF9Qcm9jZXNzKCkpOwotCQkvLyAvLwotCQkvLyBjaGlsZHJlbkZlYXR1cmVzLmFkZChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRQcm9jZXNzUGFja2FnZV9CcmVha2Rvd25FbGVtZW50cygpKTsKLQkJLy8gLy8KLQkJLy8gY2hpbGRyZW5GZWF0dXJlcy5hZGQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UHJvY2Vzc1BhY2thZ2VfV0JTKCkpOwotCQkvLyAvLwotCQkvLyBjaGlsZHJlbkZlYXR1cmVzLmFkZChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRQcm9jZXNzUGFja2FnZV9PQlMoKSk7Ci0JCS8vIC8vCi0JCS8vIGNoaWxkcmVuRmVhdHVyZXMuYWRkKFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFByb2Nlc3NQYWNrYWdlX1BCUygpKTsKLQkJLy8gfQotCQkvLyByZXR1cm4gY2hpbGRyZW5GZWF0dXJlczsKLQotCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0SW1hZ2UoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJUHJvY2VzcyBwcm9jID0gKChQcm9jZXNzQ29tcG9uZW50KSBvYmplY3QpLmdldFByb2Nlc3MoKTsKLQkJaWYgKHByb2MgaW5zdGFuY2VvZiBDYXBhYmlsaXR5UGF0dGVybikgewotCQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJLmdldEltYWdlKCJmdWxsL29iajE2L0NhcGFiaWxpdHlQYXR0ZXJuIik7IC8vJE5PTi1OTFMtMSQKLQkJfSBlbHNlIGlmIChwcm9jIGluc3RhbmNlb2YgRGVsaXZlcnlQcm9jZXNzKSB7Ci0JCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvRGVsaXZlcnlQcm9jZXNzIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCXJldHVybiBzdXBlci5nZXRJbWFnZShvYmplY3QpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRUZXh0KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIFRuZ1V0aWwuZ2V0TGFiZWwob2JqZWN0LCBnZXRTdHJpbmcoIl9VSV9Qcm9jZXNzQ29tcG9uZW50X3R5cGUiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoUHJvY2Vzc0NvbXBvbmVudC5jbGFzcykpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX19OQU1FOgotCQkJUHJvY2Vzc0NvbXBvbmVudCBwYyA9IChQcm9jZXNzQ29tcG9uZW50KSBub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKTsKLQkJCWlmIChwYy5nZXRQcm9jZXNzKCkgIT0gbnVsbCkgewotCQkJCWJvb2xlYW4gb2xkID0gcGMuZ2V0UHJvY2VzcygpLmVEZWxpdmVyKCk7Ci0JCQkJdHJ5IHsKLQkJCQkJcGMuZ2V0UHJvY2VzcygpLmVTZXREZWxpdmVyKGZhbHNlKTsKLQkJCQkJcGMuZ2V0UHJvY2VzcygpLnNldE5hbWUocGMuZ2V0TmFtZSgpKTsKLQkJCQl9IGZpbmFsbHkgewotCQkJCQlwYy5nZXRQcm9jZXNzKCkuZVNldERlbGl2ZXIob2xkKTsKLQkJCQl9Ci0JCQl9Ci0JCQlicmVhazsKLQkJfQotCi0JCVRuZ1V0aWwucmVmcmVzaFBhcmVudElmTmFtZUNoYW5nZWQobm90aWZpY2F0aW9uLCB0aGlzKTsKLQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L25hdmlnYXRvci9Qcm9jZXNzRmFtaWxpZXNJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvbmF2aWdhdG9yL1Byb2Nlc3NGYW1pbGllc0l0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YmY4MDU4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvbmF2aWdhdG9yL1Byb2Nlc3NGYW1pbGllc0l0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQubmF2aWdhdG9yOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UcmFuc2llbnRHcm91cEl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuTGlicmFyeUVkaXRDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzRmFtaWx5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogVGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgdGhlICJQcm9jZXNzIEZhbWlsaWVzIiBmb2xkZXIgaW4gdGhlIExpYnJhcnkKLSAqIHZpZXcuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqIEBkZXByZWNhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9jZXNzRmFtaWxpZXNJdGVtUHJvdmlkZXIgZXh0ZW5kcyBUcmFuc2llbnRHcm91cEl0ZW1Qcm92aWRlciB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBQcm9jZXNzRmFtaWxpZXNJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksCi0JCQlNZXRob2RMaWJyYXJ5IHBhcmVudCwgU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnksIHBhcmVudCwgbmFtZSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2NvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKGphdmEudXRpbC5Db2xsZWN0aW9uLAotCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsCi0JCQlPYmplY3Qgb2JqZWN0KSB7Ci0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldE1ldGhvZExpYnJhcnlfUHJlZGVmaW5lZENvbmZpZ3VyYXRpb25zKCksCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUHJvY2Vzc0ZhbWlseSgpKSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldENoaWxkcmVuRmVhdHVyZXMoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbkZlYXR1cmVzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGNoaWxkcmVuRmVhdHVyZXMgPT0gbnVsbCkgewotCQkJY2hpbGRyZW5GZWF0dXJlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWNoaWxkcmVuRmVhdHVyZXMuYWRkKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCS5nZXRNZXRob2RMaWJyYXJ5X1ByZWRlZmluZWRDb25maWd1cmF0aW9ucygpKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW5GZWF0dXJlczsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHRBc0NoaWxkKE9iamVjdCBvYmopIHsKLQkJcmV0dXJuIG9iaiBpbnN0YW5jZW9mIFByb2Nlc3NGYW1pbHk7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9Qcm9jZXNzRmFtaWxpZXMiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuVHJhbnNpZW50R3JvdXBJdGVtUHJvdmlkZXIjZ2V0SW50ZXJlc3RlZEZlYXR1cmVJRCgpCi0JICovCi0JcHVibGljIGludCBnZXRJbnRlcmVzdGVkRmVhdHVyZUlEKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5NRVRIT0RfTElCUkFSWV9fUFJFREVGSU5FRF9DT05GSUdVUkFUSU9OUzsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LlRyYW5zaWVudEdyb3VwSXRlbVByb3ZpZGVyI3NldERlZmF1bHROYW1lKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGVmYXVsdE5hbWUoT2JqZWN0IG9iaikgewotCQlpZiAob2JqIGluc3RhbmNlb2YgUHJvY2Vzc0ZhbWlseSkKLQkJCVRuZ1V0aWwuc2V0RGVmYXVsdE5hbWUoKChNZXRob2RMaWJyYXJ5KSB0YXJnZXQpCi0JCQkJCS5nZXRQcmVkZWZpbmVkQ29uZmlndXJhdGlvbnMoKSwgKE1ldGhvZEVsZW1lbnQpIG9iaiwKLQkJCQkJTGlicmFyeUVkaXRDb25zdGFudHMuTkVXX1BST0NFU1NfRkFNSUxZKTsgCi0JCWVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIE1ldGhvZENvbmZpZ3VyYXRpb24pIHsKLQkJCVRuZ1V0aWwuc2V0RGVmYXVsdE5hbWUoKChNZXRob2RMaWJyYXJ5KSB0YXJnZXQpCi0JCQkJCS5nZXRQcmVkZWZpbmVkQ29uZmlndXJhdGlvbnMoKSwgKE1ldGhvZEVsZW1lbnQpIG9iaiwKLQkJCQkJTGlicmFyeUVkaXRDb25zdGFudHMuTkVXX0NPTkZJR1VSQVRJT04pOyAKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuVHJhbnNpZW50R3JvdXBJdGVtUHJvdmlkZXIjZ2V0SW50ZXJlc3RlZEZlYXR1cmVDbGFzcygpCi0JICovCi0JcHVibGljIENsYXNzIGdldEludGVyZXN0ZWRGZWF0dXJlT3duZXJDbGFzcygpIHsKLQkJcmV0dXJuIE1ldGhvZExpYnJhcnkuY2xhc3M7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L25hdmlnYXRvci9Qcm9jZXNzRmFtaWx5SXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L25hdmlnYXRvci9Qcm9jZXNzRmFtaWx5SXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiOTNiYzEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9uYXZpZ2F0b3IvUHJvY2Vzc0ZhbWlseUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5uYXZpZ2F0b3I7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotCi0vKioKLSAqIFRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIHRoZSBwcm9jZXNzIGZhbWlseSBpbiB0aGUgTGlicmFyeSB2aWV3LgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKiBAZGVwcmVjYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUHJvY2Vzc0ZhbWlseUl0ZW1Qcm92aWRlciBleHRlbmRzCi0JCW9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuUHJvY2Vzc0ZhbWlseUl0ZW1Qcm92aWRlciB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBQcm9jZXNzRmFtaWx5SXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0UGFyZW50KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IG9iamVjdCkgewotCQlFT2JqZWN0IGxpYiA9IChFT2JqZWN0KSBzdXBlci5nZXRQYXJlbnQob2JqZWN0KTsKLQkJaWYgKGxpYiA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCU1ldGhvZExpYnJhcnlJdGVtUHJvdmlkZXIgaXRlbVByb3ZpZGVyID0gKE1ldGhvZExpYnJhcnlJdGVtUHJvdmlkZXIpIFRuZ1V0aWwKLQkJCQkuZ2V0QWRhcHRlcihsaWIsIE1ldGhvZExpYnJhcnlJdGVtUHJvdmlkZXIuY2xhc3MpOwotCQlyZXR1cm4gaXRlbVByb3ZpZGVyICE9IG51bGwgPyBpdGVtUHJvdmlkZXIuZ2V0UHJvY2Vzc0ZhbWlsaWVzKCkgOiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhqYXZhLnV0aWwuQ29sbGVjdGlvbiwKLQkgKiAgICAgIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLAotCQkJT2JqZWN0IG9iamVjdCkgewotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRUZXh0KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIFRuZ1V0aWwuZ2V0TGFiZWwob2JqZWN0LCBnZXRTdHJpbmcoIl9VSV9Qcm9jZXNzRmFtaWx5X3R5cGUiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvbmF2aWdhdG9yL1Byb2Nlc3NQYWNrYWdlSXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L25hdmlnYXRvci9Qcm9jZXNzUGFja2FnZUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMDYwYzM3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvbmF2aWdhdG9yL1Byb2Nlc3NQYWNrYWdlSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5uYXZpZ2F0b3I7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuVW5leGVjdXRhYmxlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQWRkQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JU3RhdGVmdWxJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlByZXNlbnRhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLk1ldGhvZEVsZW1lbnRBZGRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5NZXRob2RFbGVtZW50Q3JlYXRlQ2hpbGRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5JUHJvY2Vzc0l0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZC5DcmVhdGVQcm9jZXNzQ29tcG9uZW50Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuUHJvY2Vzc1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5VbWFFZGl0UGx1Z2luOwotCi0vKioKLSAqIFRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEgcHJvY2VzcyBwYWNrYWdlIGluIHRoZSBMaWJyYXJ5IHZpZXcuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFByb2Nlc3NQYWNrYWdlSXRlbVByb3ZpZGVyIGV4dGVuZHMKLQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5Qcm9jZXNzUGFja2FnZUl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzCi0JCUlQcm9jZXNzSXRlbVByb3ZpZGVyLCBJU3RhdGVmdWxJdGVtUHJvdmlkZXIgewotCi0JcHJvdGVjdGVkIEVDbGFzcyBwcm9jZXNzVHlwZTsKLQotCXByaXZhdGUgU3RyaW5nIGxhYmVsOwotCi0JcHJpdmF0ZSBPYmplY3QgcGFyZW50OwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgUHJvY2Vzc1BhY2thZ2VJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCXB1YmxpYyBFQ2xhc3MgZ2V0UHJvY2Vzc1R5cGUoKSB7Ci0JCXJldHVybiBwcm9jZXNzVHlwZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoamF2YS51dGlsLkNvbGxlY3Rpb24sCi0JICogICAgICBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywKLQkJCU9iamVjdCBvYmplY3QpIHsKLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0TWV0aG9kUGFja2FnZV9DaGlsZFBhY2thZ2VzKCksIFVtYUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJLmNyZWF0ZVByb2Nlc3NQYWNrYWdlKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRNZXRob2RQYWNrYWdlX0NoaWxkUGFja2FnZXMoKSwgVW1hRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkuY3JlYXRlUHJvY2Vzc0NvbXBvbmVudCgpKSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldENoaWxkcmVuRmVhdHVyZXMoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbkZlYXR1cmVzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGNoaWxkcmVuRmVhdHVyZXMgPT0gbnVsbCkgewotCQkJY2hpbGRyZW5GZWF0dXJlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWNoaWxkcmVuRmVhdHVyZXMuYWRkKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCS5nZXRNZXRob2RQYWNrYWdlX0NoaWxkUGFja2FnZXMoKSk7Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuRmVhdHVyZXM7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldENoaWxkcmVuKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlDb2xsZWN0aW9uIGNoaWxkcmVuID0gc3VwZXIuZ2V0Q2hpbGRyZW4ob2JqZWN0KTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gY2hpbGRyZW4uaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgY2hpbGQgPSBpdGVyLm5leHQoKTsKLQkJCWlmICghKGNoaWxkIGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkKLQkJCQkJJiYgKGNoaWxkIGluc3RhbmNlb2YgUHJvY2Vzc1BhY2thZ2UpKSB7Ci0JCQkJUHJvY2Vzc1BhY2thZ2VJdGVtUHJvdmlkZXIgaXRlbVByb3ZpZGVyID0gKFByb2Nlc3NQYWNrYWdlSXRlbVByb3ZpZGVyKSBnZXRSb290QWRhcHRlckZhY3RvcnkoKQotCQkJCQkJLmFkYXB0KGNoaWxkLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkJCWlmIChwcm9jZXNzVHlwZSAhPSBudWxsKQotCQkJCQlpdGVtUHJvdmlkZXIuc2V0UHJvY2Vzc1R5cGUocHJvY2Vzc1R5cGUpOwotCQkJfQotCQl9Ci0KLQkJQ29sbGVjdGlvbnMuc29ydCgoTGlzdCkgY2hpbGRyZW4sIFByZXNlbnRhdGlvbkNvbnRleHQuSU5TVEFOQ0UKLQkJCQkuZ2V0UHJvY2Vzc1BhY2thZ2VDb21wYXJhdG9yKCkpOwotCi0JCXJldHVybiBjaGlsZHJlbjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0VGV4dChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChsYWJlbCAhPSBudWxsKQotCQkJcmV0dXJuIGxhYmVsOwotCQlyZXR1cm4gVG5nVXRpbC5nZXRMYWJlbChvYmplY3QpOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlFQ2xhc3MgcHJvY1R5cGUgPSBnZXRQcm9jZXNzVHlwZSgpOwotCQlpZiAocHJvY1R5cGUgIT0gbnVsbCkgewotCQkJT2JqZWN0IHBhcmVudCA9IGdldFBhcmVudChvYmplY3QpOwotCQkJaWYgKHBhcmVudCAhPSBudWxsCi0JCQkJCSYmIHBhcmVudCBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQubmF2aWdhdG9yLlByb2Nlc3Nlc0l0ZW1Qcm92aWRlcikgewotCQkJCWlmIChwcm9jVHlwZQotCQkJCQkJLmVxdWFscyhVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRDYXBhYmlsaXR5UGF0dGVybigpKSkKLQkJCQkJcmV0dXJuIExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCQkJLmdldEltYWdlKCJmdWxsL29iajE2L0NhcGFiaWxpdHlQYXR0ZXJucyIpOyAvLyROT04tTkxTLTEkCi0JCQkJZWxzZSBpZiAocHJvY1R5cGUuZXF1YWxzKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkuZ2V0RGVsaXZlcnlQcm9jZXNzKCkpKQotCQkJCQlyZXR1cm4gTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJCQkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvRGVsaXZlcnlQcm9jZXNzZXMiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFLmdldEltYWdlKCJmdWxsL29iajE2L1Byb2Nlc3NQYWNrYWdlIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRMYWJlbChTdHJpbmcgbGFiZWwpIHsKLQkJdGhpcy5sYWJlbCA9IGxhYmVsOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFByb2Nlc3NUeXBlKEVDbGFzcyBwcm9jZXNzVHlwZSkgewotCQl0aGlzLnByb2Nlc3NUeXBlID0gcHJvY2Vzc1R5cGU7Ci0JfQotCi0JcHJvdGVjdGVkIENvbW1hbmQgY3JlYXRlQ3JlYXRlQ2hpbGRDb21tYW5kKEVkaXRpbmdEb21haW4gZG9tYWluLAotCQkJRU9iamVjdCBvd25lciwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIE9iamVjdCB2YWx1ZSwgaW50IGluZGV4LAotCQkJQ29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiUHJvY2Vzc1BhY2thZ2VJdGVtUHJvdmlkZXIuY3JlYXRlQ3JlYXRlQ2hpbGRDb21tYW5kKCkiKTsKLQkJaWYgKHZhbHVlIGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkgewotCQkJcmV0dXJuIG5ldyBDcmVhdGVQcm9jZXNzQ29tcG9uZW50Q29tbWFuZChkb21haW4sIG93bmVyLCBmZWF0dXJlLAotCQkJCQl2YWx1ZSwgaW5kZXgsIGNvbGxlY3Rpb24sIHRoaXMpOwotCQl9Ci0JCS8vIHJldHVybiBzdXBlci5jcmVhdGVDcmVhdGVDaGlsZENvbW1hbmQoZG9tYWluLCBvd25lciwgZmVhdHVyZSwgdmFsdWUsCi0JCS8vIGluZGV4LCBjb2xsZWN0aW9uKTsKLQkJcmV0dXJuIG5ldyBNZXRob2RFbGVtZW50Q3JlYXRlQ2hpbGRDb21tYW5kKGRvbWFpbiwgb3duZXIsIGZlYXR1cmUsCi0JCQkJdmFsdWUsIGluZGV4LCBjb2xsZWN0aW9uLCB0aGlzKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldENyZWF0ZUNoaWxkVGV4dChPYmplY3Qgb3duZXIsIE9iamVjdCBmZWF0dXJlLAotCQkJT2JqZWN0IGNoaWxkLCBDb2xsZWN0aW9uIHNlbGVjdGlvbikgewotCQlpZiAoY2hpbGQgaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50KSB7Ci0JCQlFQ2xhc3MgcHJvY2Vzc1R5cGUgPSBnZXRQcm9jZXNzVHlwZSgpOwotCQkJaWYgKHByb2Nlc3NUeXBlICE9IG51bGwpIHsKLQkJCQlpZiAocHJvY2Vzc1R5cGUuZXF1YWxzKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkuZ2V0Q2FwYWJpbGl0eVBhdHRlcm4oKSkpIHsKLQkJCQkJcmV0dXJuIExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCQkJLmdldFN0cmluZygiX1VJX0NhcGFiaWxpdHlQYXR0ZXJuX3RleHQiKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0gZWxzZSBpZiAocHJvY2Vzc1R5cGUuZXF1YWxzKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkuZ2V0RGVsaXZlcnlQcm9jZXNzKCkpKSB7Ci0JCQkJCXJldHVybiBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkJCS5nZXRTdHJpbmcoIl9VSV9EZWxpdmVyeVByb2Nlc3NfdGV4dCIpOyAvLyROT04tTkxTLTEkCi0JCQkJfSBlbHNlIGlmIChwcm9jZXNzVHlwZSA9PSBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJLmdldFByb2Nlc3NQbGFubmluZ1RlbXBsYXRlKCkpIHsKLQkJCQkJcmV0dXJuIGdldFN0cmluZygiX1VJX1Byb2Nlc3NQbGFubmluZ1RlbXBsYXRlX3R5cGUiKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiBzdXBlci5nZXRDcmVhdGVDaGlsZFRleHQob3duZXIsIGZlYXR1cmUsIGNoaWxkLCBzZWxlY3Rpb24pOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0Q3JlYXRlQ2hpbGRJbWFnZShPYmplY3Qgb3duZXIsIE9iamVjdCBmZWF0dXJlLAotCQkJT2JqZWN0IGNoaWxkLCBDb2xsZWN0aW9uIHNlbGVjdGlvbikgewotCQlpZiAoY2hpbGQgaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50KSB7Ci0JCQlFQ2xhc3MgcHJvY2Vzc1R5cGUgPSBnZXRQcm9jZXNzVHlwZSgpOwotCQkJaWYgKHByb2Nlc3NUeXBlICE9IG51bGwpIHsKLQkJCQlpZiAocHJvY2Vzc1R5cGUuZXF1YWxzKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkuZ2V0Q2FwYWJpbGl0eVBhdHRlcm4oKSkpIHsKLQkJCQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJCQkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvQ2FwYWJpbGl0eVBhdHRlcm4iKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0gZWxzZSBpZiAocHJvY2Vzc1R5cGUuZXF1YWxzKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkuZ2V0RGVsaXZlcnlQcm9jZXNzKCkpKSB7Ci0JCQkJCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCQkJLmdldEltYWdlKCJmdWxsL29iajE2L0RlbGl2ZXJ5UHJvY2VzcyIpOyAvLyROT04tTkxTLTEkCi0JCQkJfSBlbHNlIGlmIChwcm9jZXNzVHlwZSA9PSBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJLmdldFByb2Nlc3NQbGFubmluZ1RlbXBsYXRlKCkpIHsKLQkJCQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJCQkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUiKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiBzdXBlci5nZXRDcmVhdGVDaGlsZEltYWdlKG93bmVyLCBmZWF0dXJlLCBjaGlsZCwgc2VsZWN0aW9uKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjY3JlYXRlQWRkQ29tbWFuZChvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbiwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0LAotCSAqICAgICAgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZSwgamF2YS51dGlsLkNvbGxlY3Rpb24sIGludCkKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBjcmVhdGVBZGRDb21tYW5kKEVkaXRpbmdEb21haW4gZG9tYWluLCBFT2JqZWN0IG93bmVyLAotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIENvbGxlY3Rpb24gY29sbGVjdGlvbiwgaW50IGluZGV4KSB7Ci0JCUNvbGxlY3Rpb24gc2VsZWN0aW9uID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjb2xsZWN0aW9uLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyLm5leHQoKTsKLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgUHJvY2Vzc1BhY2thZ2UpIHsKLQkJCQkvLyBjaGVjayB0byBleGNsdWRlIGFueSBwYXN0ZWQtaW4gcGFja2FnZSB0aGF0IGNvbnRhaW5zCi0JCQkJLy8gcHJvY2VzcyBvZiBkaWZmZXJlbnQgdHlwZSB0aGFuIHRoYXQgb2YgdGhpcyBwYWNrYWdlCi0JCQkJLy8KLQkJCQlpZiAoIVByb2Nlc3NVdGlsLmhhc1Byb2Nlc3NOb3RPZlR5cGUoKFByb2Nlc3NQYWNrYWdlKSBlbGVtZW50LAotCQkJCQkJcHJvY2Vzc1R5cGUpKSB7Ci0JCQkJCXNlbGVjdGlvbi5hZGQoZWxlbWVudCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmIChzZWxlY3Rpb24uaXNFbXB0eSgpKSB7Ci0JCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJfQotCi0JCS8vIHJldHVybiBzdXBlci5jcmVhdGVBZGRDb21tYW5kKGRvbWFpbiwgb3duZXIsIGZlYXR1cmUsIGNvbGxlY3Rpb24sCi0JCS8vIGluZGV4KTsKLQkJcmV0dXJuIG5ldyBNZXRob2RFbGVtZW50QWRkQ29tbWFuZCgoQWRkQ29tbWFuZCkgc3VwZXIuY3JlYXRlQWRkQ29tbWFuZCgKLQkJCQlkb21haW4sIG93bmVyLCBmZWF0dXJlLCBzZWxlY3Rpb24sIGluZGV4KSkgewotCQkJcHJvdGVjdGVkIHZvaWQgZmVhdHVyZUNoYW5nZWQoRU9iamVjdCBvYmplY3QsCi0JCQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudAotCQkJCQkJJiYgZmVhdHVyZSA9PSBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkuZ2V0TmFtZWRFbGVtZW50X05hbWUoKSkgewotCQkJCQlQcm9jZXNzIHByb2MgPSAoKFByb2Nlc3NDb21wb25lbnQpIG9iamVjdCkuZ2V0UHJvY2VzcygpOwotCQkJCQlpZiAocHJvYyAhPSBudWxsKSB7Ci0JCQkJCQlwcm9jLnNldE5hbWUoKFN0cmluZykgbmV3VmFsdWUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9OwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFBhcmVudChPYmplY3QgcGFyZW50KSB7Ci0JCXRoaXMucGFyZW50ID0gcGFyZW50OwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRQYXJlbnQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChwYXJlbnQgIT0gbnVsbCkKLQkJCXJldHVybiBwYXJlbnQ7Ci0JCXJldHVybiBzdXBlci5nZXRQYXJlbnQob2JqZWN0KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuUHJvY2Vzc1BhY2thZ2VJdGVtUHJvdmlkZXIjbm90aWZ5Q2hhbmdlZChvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb24pCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0KLQkJVG5nVXRpbC5yZWZyZXNoUGFyZW50SWZOYW1lQ2hhbmdlZChub3RpZmljYXRpb24sIHRoaXMpOwotCi0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L25hdmlnYXRvci9Qcm9jZXNzZXNJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvbmF2aWdhdG9yL1Byb2Nlc3Nlc0l0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZWFkODE3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvbmF2aWdhdG9yL1Byb2Nlc3Nlc0l0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQubmF2aWdhdG9yOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Nb2RlbFN0cnVjdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLQotLyoqCi0gKiBUaGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciB0aGUgIlByb2Nlc3NlcyIgZm9sZGVyIGluIHRoZSBMaWJyYXJ5IHZpZXcuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFByb2Nlc3Nlc0l0ZW1Qcm92aWRlciBleHRlbmRzIEFic3RyYWN0UHJvY2Vzc2VzSXRlbVByb3ZpZGVyIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9DRVNTX0NPTlRSSUJVVElPTlNfTEFCRUwgPSBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJLmdldFN0cmluZygiX1VJX1Byb2Nlc3NDb250cmlidXRpb25zX3RleHQiKTsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBNZXRob2RQbHVnaW4gcGx1Z2luOwotCi0JcHJpdmF0ZSBQcm9jZXNzUGFja2FnZSBwcm9jZXNzQ29udHJpYnV0aW9uc1BhY2thZ2U7Ci0JcHJpdmF0ZSBQcm9jZXNzUGFja2FnZSBjYXBhYmlsaXR5UGF0dGVyblBhY2thZ2U7Ci0JcHJpdmF0ZSBQcm9jZXNzUGFja2FnZSBkZWxpdmVyeVByb2Nlc3NQYWNrYWdlOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgUHJvY2Vzc2VzSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LAotCQkJTWV0aG9kUGx1Z2luIHBsdWdpbiwgTW9kZWxTdHJ1Y3R1cmUgbW9kZWxTdHJ1Y3QpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnksIG1vZGVsU3RydWN0KTsKLQkJdGhpcy5wbHVnaW4gPSBwbHVnaW47Ci0JfQotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlpZiAoY2hpbGRyZW4gPT0gbnVsbCkgewotCQkJY2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NQYWNrYWdlIHBrZyA9IChvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NQYWNrYWdlKSBVbWFVdGlsCi0JCQkJCS5maW5kTWV0aG9kUGFja2FnZShwbHVnaW4sCi0JCQkJCQkJbW9kZWxTdHJ1Y3QuY2FwYWJpbGl0eVBhdHRlcm5QYXRoKTsKLQkJCWNhcGFiaWxpdHlQYXR0ZXJuUGFja2FnZSA9IHBrZzsKLQkJCWlmIChwa2cgIT0gbnVsbCkgewotCQkJCVByb2Nlc3NQYWNrYWdlSXRlbVByb3ZpZGVyIGFkYXB0ZXIgPSAoUHJvY2Vzc1BhY2thZ2VJdGVtUHJvdmlkZXIpIFRuZ1V0aWwKLQkJCQkJCS5nZXRCZXN0QWRhcHRlckZhY3RvcnkoYWRhcHRlckZhY3RvcnkpLmFkYXB0KHBrZywKLQkJCQkJCQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCQlhZGFwdGVyLnNldFByb2Nlc3NUeXBlKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkuZ2V0Q2FwYWJpbGl0eVBhdHRlcm4oKSk7Ci0JCQkJYWRhcHRlci5zZXRMYWJlbChMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkJLmdldFN0cmluZygiX1VJX0NhcGFiaWxpdHlQYXR0ZXJuc190ZXh0IikpOyAvLyROT04tTkxTLTEkCi0JCQkJYWRhcHRlci5zZXRQYXJlbnQodGhpcyk7Ci0JCQkJY2hpbGRyZW4uYWRkKHBrZyk7Ci0JCQl9Ci0JCQlwa2cgPSAob3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzUGFja2FnZSkgVW1hVXRpbAotCQkJCQkuZmluZE1ldGhvZFBhY2thZ2UocGx1Z2luLCBtb2RlbFN0cnVjdC5kZWxpdmVyeVByb2Nlc3NQYXRoKTsKLQkJCWRlbGl2ZXJ5UHJvY2Vzc1BhY2thZ2UgPSBkZWxpdmVyeVByb2Nlc3NQYWNrYWdlOwotCQkJaWYgKHBrZyAhPSBudWxsKSB7Ci0JCQkJUHJvY2Vzc1BhY2thZ2VJdGVtUHJvdmlkZXIgYWRhcHRlciA9IChQcm9jZXNzUGFja2FnZUl0ZW1Qcm92aWRlcikgVG5nVXRpbAotCQkJCQkJLmdldEJlc3RBZGFwdGVyRmFjdG9yeShhZGFwdGVyRmFjdG9yeSkuYWRhcHQocGtnLAotCQkJCQkJCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkJCWFkYXB0ZXIuc2V0UHJvY2Vzc1R5cGUoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCS5nZXREZWxpdmVyeVByb2Nlc3MoKSk7Ci0JCQkJYWRhcHRlci5zZXRMYWJlbChMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkJLmdldFN0cmluZygiX1VJX0RlbGl2ZXJ5UHJvY2Vzc2VzX3RleHQiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQlhZGFwdGVyLnNldFBhcmVudCh0aGlzKTsKLQkJCQljaGlsZHJlbi5hZGQocGtnKTsKLQkJCX0KLQotCQkJaWYgKHByb2Nlc3NDb250cmlidXRpb25FbmFibGVkKSB7Ci0JCQkJY2hpbGRyZW4uYWRkKGdldFByb2Nlc3NDb250cmlidXRpb25zUGFja2FnZSgpKTsKLQkJCX0KLQotCQkJLy8gZ3JvdXBJdGVtUHJvdmlkZXJNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQkJLy8gU3RyaW5nIG5hbWUgPQotCQkJLy8gTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfUGxhbm5pbmdUZW1wbGF0ZXNfZ3JvdXAiKTsKLQkJCS8vIE9iamVjdCBjaGlsZCA9IG5ldyBUcmFuc2llbnRHcm91cEl0ZW1Qcm92aWRlcihhZGFwdGVyRmFjdG9yeSwKLQkJCS8vIHBsdWdpbiwgbmFtZSk7Ci0JCQkvLyBjaGlsZHJlbi5hZGQoY2hpbGQpOwotCQkJLy8gZ3JvdXBJdGVtUHJvdmlkZXJNYXAucHV0KG5hbWUsIGNoaWxkKTsKLQotCQkJLy8gY29tbWVudCBvdXQgdGhlIHBsYW5uaW5nIHRlbXBsYXRlcyBmb3IgVE5HIHJlbGVhc2Ugb25lIGF0Ci0JCQkvLyAyMDA1LTA1LTA5Ci0JCQkvLyBwa2cgPSAob3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzUGFja2FnZSkKLQkJCS8vIFVtYVV0aWwuZmluZE1ldGhvZFBhY2thZ2UocGx1Z2luLAotCQkJLy8gbW9kZWxTdHJ1Y3QucHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGVQYXRoKTsKLQkJCS8vIGlmKHBrZyA9PSBudWxsKSB7Ci0JCQkvLyBwa2cgPQotCQkJLy8gTW9kZWxTdHJ1Y3R1cmUuY3JlYXRlUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGVQYWNrYWdlKHBsdWdpbik7Ci0JCQkvLyB9Ci0JCQkvLyBhZGFwdGVyID0gKFByb2Nlc3NQYWNrYWdlSXRlbVByb3ZpZGVyKQotCQkJLy8gVG5nVXRpbC5nZXRCZXN0QWRhcHRlckZhY3RvcnkoYWRhcHRlckZhY3RvcnkpLmFkYXB0KHBrZywKLQkJCS8vIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCQkvLyBhZGFwdGVyLnNldFByb2Nlc3NUeXBlKFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFByb2Nlc3NQbGFubmluZ1RlbXBsYXRlKCkpOwotCQkJLy8gYWRhcHRlci5zZXRMYWJlbChMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9QbGFubmluZ1RlbXBsYXRlc190ZXh0IikpOwotCQkJLy8gY2hpbGRyZW4uYWRkKHBrZyk7Ci0KLQkJfSBlbHNlIHsKLQkJCWlmIChwcm9jZXNzQ29udHJpYnV0aW9uRW5hYmxlZCkgewotCQkJCVByb2Nlc3NQYWNrYWdlIHBrZyA9IGdldFByb2Nlc3NDb250cmlidXRpb25zUGFja2FnZSgpOwotCQkJCWlmICghY2hpbGRyZW4uY29udGFpbnMocGtnKSkgewotCQkJCQljaGlsZHJlbi5hZGQocGtnKTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCVByb2Nlc3NQYWNrYWdlIHBrZyA9IGdldFByb2Nlc3NDb250cmlidXRpb25zUGFja2FnZSgpOwotCQkJCWNoaWxkcmVuLnJlbW92ZShwa2cpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGNoaWxkcmVuOwotCX0KLQotCXByaXZhdGUgUHJvY2Vzc1BhY2thZ2UgZ2V0UHJvY2Vzc0NvbnRyaWJ1dGlvbnNQYWNrYWdlKCkgewotCQlpZiAocHJvY2Vzc0NvbnRyaWJ1dGlvbnNQYWNrYWdlID09IG51bGwpIHsKLQkJCXByb2Nlc3NDb250cmlidXRpb25zUGFja2FnZSA9IChvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NQYWNrYWdlKSBVbWFVdGlsCi0JCQkJCS5maW5kTWV0aG9kUGFja2FnZShwbHVnaW4sCi0JCQkJCQkJbW9kZWxTdHJ1Y3QucHJvY2Vzc0NvbnRyaWJ1dGlvblBhdGgpOwotCQkJaWYgKHByb2Nlc3NDb250cmlidXRpb25zUGFja2FnZSA9PSBudWxsKSB7Ci0JCQkJcHJvY2Vzc0NvbnRyaWJ1dGlvbnNQYWNrYWdlID0gTW9kZWxTdHJ1Y3R1cmUKLQkJCQkJCS5jcmVhdGVQcm9jZXNzQ29udHJpYnV0aW9uUGFja2FnZShwbHVnaW4pOwotCQkJfQotCQkJUHJvY2Vzc1BhY2thZ2VJdGVtUHJvdmlkZXIgYWRhcHRlciA9IChQcm9jZXNzUGFja2FnZUl0ZW1Qcm92aWRlcikgZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCkKLQkJCQkJLmFkYXB0KHByb2Nlc3NDb250cmlidXRpb25zUGFja2FnZSwKLQkJCQkJCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkJYWRhcHRlci5zZXRMYWJlbChQUk9DRVNTX0NPTlRSSUJVVElPTlNfTEFCRUwpOwotCQkJYWRhcHRlci5zZXRQYXJlbnQodGhpcyk7Ci0JCX0KLQkJcmV0dXJuIHByb2Nlc3NDb250cmlidXRpb25zUGFja2FnZTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBwbHVnaW47Ci0JfQotCi0JcHVibGljIFByb2Nlc3NQYWNrYWdlIGdldENhcGFiaWxpdHlQYXR0ZXJuUGFja2FnZSgpIHsKLQkJcmV0dXJuIGNhcGFiaWxpdHlQYXR0ZXJuUGFja2FnZTsKLQl9Ci0JCi0JcHVibGljIFByb2Nlc3NQYWNrYWdlIGdldERlbGl2ZXJ5UHJvY2Vzc1BhY2thZ2UoKSB7Ci0JCXJldHVybiBkZWxpdmVyeVByb2Nlc3NQYWNrYWdlOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvbmF2aWdhdG9yL3BhY2thZ2UuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvbmF2aWdhdG9yL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjRhZTM1OS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L25hdmlnYXRvci9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyBpdGVtIHByb3ZpZGVycyBmb3IgZGlzcGxheWluZyBhbmQgZWRpdGluZyBtZXRob2QgbGlicmFyeSBlbGVtZW50cyBpbiB0aGUgTGlicmFyeSB2aWV3LgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcGFja2FnZS5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyNDY4YmIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyB0aGUgaW50ZXJmYWNlcyBmb3IgZGlzcGxheWluZyBhbmQgZWRpdGluZyBtZXRob2QgbGlicmFyeSBlbGVtZW50cy4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvQWN0aXZpdHlJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9BY3Rpdml0eUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MjdlNDE0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9BY3Rpdml0eUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpcHRvcjsKLQotLyoqCi0gKiBJdGVtIHByb3ZpZGVyIGZvciBhY3Rpdml0eSB1c2VkIGJ5IGNvbmZpZ3VyYXRpb24gdmlldyBhbmQgZmlsdGVyIGRpYWxvZy4gVGhpcyBpdGVtIHByb3ZpZGVyIHJldHVybgotICogY2hpbGRyZW4gbGlzdCB0aGF0IGNvbnRhaW4gb25seSBpdHMgb3duIGFjdGl2aXRpZXMgYWZ0ZXIgcmVhbGl6YXRpb24gYWdhaW5zdCBzZWxlY3RlZCBjb25maWd1cmF0aW9uLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZSAtIEp1biAzMCwgMjAwNgotICogQHNpbmNlICAxLjAKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXR5SXRlbVByb3ZpZGVyIGV4dGVuZHMgQlNBY3Rpdml0eUl0ZW1Qcm92aWRlciB7Ci0KLQkvKioKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgQWN0aXZpdHlJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CU0FjdGl2aXR5SXRlbVByb3ZpZGVyI2dldE9iamVjdChvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaXB0b3IpCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBnZXRPYmplY3QoRGVzY3JpcHRvciBkZXNjcmlwdG9yKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5JQlNJdGVtUHJvdmlkZXIjZ2V0RUNsYXNzZXMoKQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldEVDbGFzc2VzKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuQlNBY3Rpdml0eUl0ZW1Qcm92aWRlciNhY2NlcHRBc0NoaWxkKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0QXNDaGlsZChPYmplY3QgY2hpbGQpIHsKLQkJcmV0dXJuIGNoaWxkIGluc3RhbmNlb2YgQWN0aXZpdHk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CU0FjdGl2aXR5SXRlbVByb3ZpZGVyI2lzUm9sbGVkVXAoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUm9sbGVkVXAoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkJTQWN0aXZpdHlJdGVtUHJvdmlkZXIjYmFzaWNTZXRSb2xsZWRVcChib29sZWFuKQotCSAqLwotCXB1YmxpYyB2b2lkIGJhc2ljU2V0Um9sbGVkVXAoYm9vbGVhbiBiKSB7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CU0FjdGl2aXR5SXRlbVByb3ZpZGVyI3NldFJvbGxlZFVwKGJvb2xlYW4pCi0JICovCi0JcHVibGljIHZvaWQgc2V0Um9sbGVkVXAoYm9vbGVhbiBiKSB7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL0FjdGl2aXR5V3JhcHBlckl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL0FjdGl2aXR5V3JhcHBlckl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4M2ZkMTlhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9BY3Rpdml0eVdyYXBwZXJJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3M7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZpdHlXcmFwcGVySXRlbVByb3ZpZGVyIGV4dGVuZHMKLQkJQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIgewotCi0JLyoqCi0JICogQHBhcmFtIHZhbHVlCi0JICogQHBhcmFtIG93bmVyCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICovCi0JcHVibGljIEFjdGl2aXR5V3JhcHBlckl0ZW1Qcm92aWRlcihBY3Rpdml0eSB2YWx1ZSwgT2JqZWN0IG93bmVyLAotCQkJQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIodmFsdWUsIG93bmVyLCBhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGFjdGl2aXR5Ci0JICogQHBhcmFtIG93bmVyCi0JICogQHBhcmFtIGZlYXR1cmUKLQkgKiBAcGFyYW0gaW5kZXgKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgQWN0aXZpdHlXcmFwcGVySXRlbVByb3ZpZGVyKEFjdGl2aXR5IGFjdGl2aXR5LCBPYmplY3Qgb3duZXIsCi0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgaW50IGluZGV4LCBBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhY3Rpdml0eSwgb3duZXIsIGZlYXR1cmUsIGluZGV4LCBhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkRlc2NyaWJhYmxlRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIjbm90aWZ5Q2hhbmdlZChvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb24pCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCWlmIChnZXRSZWZyZXNoRWxlbWVudChub3RpZmljYXRpb24pID09IGdldERlbGVnYXRlVmFsdWUoKSkgewotCQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKEFjdGl2aXR5LmNsYXNzKSkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlZBUklBQklMSVRZX0VMRU1FTlRfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQ6Ci0JCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX0JSRUFLRE9XTl9FTEVNRU5UUzoKLQkJCQlQcm9jZXNzIHByb2MgPSAoUHJvY2VzcykgZ2V0VG9wSXRlbSgpOwotCQkJCWlmIChwcm9jICE9IG51bGwpIHsKLQkJCQkJQlNBY3Rpdml0eUl0ZW1Qcm92aWRlciBpdGVtUHJvdmlkZXIgPSAoQlNBY3Rpdml0eUl0ZW1Qcm92aWRlcikgYWRhcHRlckZhY3RvcnkKLQkJCQkJCQkuYWRhcHQocHJvYywgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCQkJaWYgKGl0ZW1Qcm92aWRlciBpbnN0YW5jZW9mIFdCU0FjdGl2aXR5SXRlbVByb3ZpZGVyKSB7Ci0JCQkJCQlpdGVtUHJvdmlkZXIuc2V0UmVmcmVzaEFsbElEc1JlcXVpcmVkKHRydWUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkRlbGVnYXRpbmdXcmFwcGVySXRlbVByb3ZpZGVyI2dldENoaWxkcmVuKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlJQlNJdGVtUHJvdmlkZXIgaXRlbVByb3ZpZGVyID0gbnVsbDsKLQkJYm9vbGVhbiBvbGRSb2xsZWRVcCA9IGZhbHNlOwotCQl0cnkgewotCQkJaWYgKGRlbGVnYXRlSXRlbVByb3ZpZGVyIGluc3RhbmNlb2YgSUJTSXRlbVByb3ZpZGVyKSB7Ci0JCQkJaXRlbVByb3ZpZGVyID0gKElCU0l0ZW1Qcm92aWRlcikgZGVsZWdhdGVJdGVtUHJvdmlkZXI7Ci0JCQkJb2xkUm9sbGVkVXAgPSBpdGVtUHJvdmlkZXIuaXNSb2xsZWRVcCgpOwotCQkJCWlmKGlzUm9sbGVkVXAoKSAhPSBvbGRSb2xsZWRVcCkgewotCQkJCQlpZihpdGVtUHJvdmlkZXIgaW5zdGFuY2VvZiBCU0FjdGl2aXR5SXRlbVByb3ZpZGVyKSB7Ci0JCQkJCQkoKEJTQWN0aXZpdHlJdGVtUHJvdmlkZXIpaXRlbVByb3ZpZGVyKS5iYXNpY1NldFJvbGxlZFVwKGlzUm9sbGVkVXAoKSk7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQlpdGVtUHJvdmlkZXIuc2V0Um9sbGVkVXAoaXNSb2xsZWRVcCgpKTsKLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJaXRlbVByb3ZpZGVyID0gbnVsbDsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gc3VwZXIuZ2V0Q2hpbGRyZW4ob2JqZWN0KTsKLQkJfQotCQlmaW5hbGx5IHsKLQkJCWlmKGl0ZW1Qcm92aWRlciAhPSBudWxsKSB7Ci0JCQkJLy8gcmVzdG9yZSByb2xsZWQtdXAgZmxhZwotCQkJCS8vCi0JCQkJaWYoaXRlbVByb3ZpZGVyIGluc3RhbmNlb2YgQlNBY3Rpdml0eUl0ZW1Qcm92aWRlcikgewotCQkJCQkoKEJTQWN0aXZpdHlJdGVtUHJvdmlkZXIpaXRlbVByb3ZpZGVyKS5iYXNpY1NldFJvbGxlZFVwKG9sZFJvbGxlZFVwKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWl0ZW1Qcm92aWRlci5zZXRSb2xsZWRVcChvbGRSb2xsZWRVcCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCQotCXB1YmxpYyBPYmplY3QgZ2V0RGVsZWdhdGluZ0l0ZW1Qcm92aWRlcigpewotCQlyZXR1cm4gZGVsZWdhdGVJdGVtUHJvdmlkZXI7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIHN1cGVyLmdldFRleHQob2JqZWN0KTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvQlNBY3Rpdml0eUl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL0JTQWN0aXZpdHlJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGEzNGE3Ni4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvQlNBY3Rpdml0eUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU0MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3M7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQWJzdHJhY3RUcmVlSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5BZGRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuTW92ZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuRGlzcG9zYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVGFibGVJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVdyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUNhY2hlZENoaWxkcmVuSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklDb25maWd1cmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSVdyYXBwZXJJdGVtUHJvdmlkZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSVdyYXBwZXJJdGVtUHJvdmlkZXJGYWN0b3J5UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5Qcm92aWRlcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5WYXJpYWJpbGl0eUluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklBY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JUmVzb3VyY2VBd2FyZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQuQWN0aXZpdHlBZGRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudWkuVXNlckludGVyYWN0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5HcmFwaGljYWxEYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5QcmVkZWNlc3Nvckxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlByb2Nlc3NVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkl0ZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0VsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRlYW1Qcm9maWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtPcmRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLkFjdGl2aXR5SXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5Bc3NvY2lhdGlvbkhlbHBlcjsKLQotCi0vKioKLSAqIEFic3RyYWN0IGJhc2UgY2xhc3MgZm9yIGFjdGl2aXR5J3MgaXRlbSBwcm92aWRlcnMgdXNlZCBieSB0aGUgUHJvY2VzcyBFZGl0b3IuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBCU0FjdGl2aXR5SXRlbVByb3ZpZGVyIGV4dGVuZHMgQWN0aXZpdHlJdGVtUHJvdmlkZXIKLQkJaW1wbGVtZW50cyBJUHJvY2Vzc0l0ZW1Qcm92aWRlciwgSUJTSXRlbVByb3ZpZGVyLAotCQlJVGFibGVJdGVtTGFiZWxQcm92aWRlciwgSUNvbmZpZ3VyYWJsZSwgSUNhY2hlZENoaWxkcmVuSXRlbVByb3ZpZGVyIHsKLQotCXByaXZhdGUgT2JqZWN0IHBhcmVudDsKLQotCXByaXZhdGUgaW50IGlkOwotCi0JcHJvdGVjdGVkIE9iamVjdCB0b3BJdGVtID0gbnVsbDsKLQotCXByaXZhdGUgYm9vbGVhbiByb2xsZWRVcDsKLQotCXByaXZhdGUgR3JhcGhpY2FsRGF0YSBncmFwaGljYWxEYXRhOwotCi0JcHJpdmF0ZSBQcmVkZWNlc3Nvckxpc3QgcHJlZGVjZXNzb3JzOwotCi0JcHJpdmF0ZSBCb29sZWFuIGV4cGFuZGVkOwotCi0JcHJvdGVjdGVkIEFkYXB0ZXIgYmFzZUxpc3RlbmVyOwotCi0JcHJpdmF0ZSBJRmlsdGVyIGNoaWxkRmlsdGVyID0gbmV3IElGaWx0ZXIoKSB7Ci0KLQkJcHVibGljIGJvb2xlYW4gYWNjZXB0KE9iamVjdCBvYmopIHsKLQkJCXJldHVybiBhY2NlcHRBc0NoaWxkKG9iaik7Ci0JCX0KLQotCX07Ci0KLQlwcml2YXRlIGJvb2xlYW4gcmVmcmVzaEFsbElEc1JlcXVpcmVkOwotCi0JcHJpdmF0ZSBJRmlsdGVyIGZpbHRlcjsKLQotCXByb3RlY3RlZCBMaXN0IGNhY2hlZENoaWxkcmVuOwotCi0JcHJvdGVjdGVkIExpc3QgY2FjaGVkUm9sbHVwQ2hpbGRyZW47Ci0KLQlwcml2YXRlIElDb25maWd1cmF0b3IgY29uZmlndXJhdG9yOwotCi0JcHJpdmF0ZSBEaXNwb3NhYmxlIGNvbnRyaWJ1dGVkV3JhcHBlcnM7Ci0KLQlwcml2YXRlIFZhcmlhYmlsaXR5SW5mbyB2YXJpYWJpbGl0eUluZm87Ci0JCi0JcHJpdmF0ZSBib29sZWFuIGVuYWJsZVZhcmlhYmlsaXR5SW5mbyA9IHRydWU7Ci0KLQlwcml2YXRlIERpc3Bvc2FibGUgcm9sbGVkVXBXcmFwcGVyczsKLQotCS8qKgotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqLwotCXB1YmxpYyBCU0FjdGl2aXR5SXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJaWYoYmFzZUxpc3RlbmVyICE9IG51bGwpIHsKLQkJCUVPYmplY3QgY3VycmVudEJhc2UgPSAoRU9iamVjdCkgYmFzZUxpc3RlbmVyLmdldFRhcmdldCgpOwotCQkJaWYoY3VycmVudEJhc2UgIT0gbnVsbCkgewotCQkJCWN1cnJlbnRCYXNlLmVBZGFwdGVycygpLnJlbW92ZShiYXNlTGlzdGVuZXIpOwotCQkJfQotCQkJaWYgKGdldFRhcmdldCgpIGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQlBY3Rpdml0eSBhY3QgPSAoQWN0aXZpdHkpIGdldFRhcmdldCgpOwotCQkJCVZhcmlhYmlsaXR5RWxlbWVudCBiYXNlID0gYWN0LmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsKLQkJCQlpZiAoYmFzZSAhPSBudWxsKSB7Ci0JCQkJCWJhc2UuZUFkYXB0ZXJzKCkucmVtb3ZlKGJhc2VMaXN0ZW5lcik7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJaWYgKHByZWRlY2Vzc29ycyAhPSBudWxsKSB7Ci0JCQlwcmVkZWNlc3NvcnMuZGlzcG9zZSgpOwotCQl9Ci0KLQkJaWYoY2FjaGVkQ2hpbGRyZW4gIT0gbnVsbCkgewotCQkJY2FjaGVkQ2hpbGRyZW4uY2xlYXIoKTsKLQkJCWNhY2hlZENoaWxkcmVuID0gbnVsbDsKLQkJfQotCQkKLQkJaWYoY2FjaGVkUm9sbHVwQ2hpbGRyZW4gIT0gbnVsbCkgewotCQkJY2FjaGVkUm9sbHVwQ2hpbGRyZW4uY2xlYXIoKTsKLQkJCWNhY2hlZFJvbGx1cENoaWxkcmVuID0gbnVsbDsKLQkJfQotCQkKLQkJaWYoY29udHJpYnV0ZWRXcmFwcGVycyAhPSBudWxsKSB7Ci0JCQljb250cmlidXRlZFdyYXBwZXJzLmRpc3Bvc2UoKTsKLQkJCWNvbnRyaWJ1dGVkV3JhcHBlcnMgPSBudWxsOwotCQl9Ci0JCQotCQlpZihyb2xsZWRVcFdyYXBwZXJzICE9IG51bGwpIHsKLQkJCXJvbGxlZFVwV3JhcHBlcnMuZGlzcG9zZSgpOwotCQkJcm9sbGVkVXBXcmFwcGVycyA9IG51bGw7Ci0JCX0KLQkJCi0JCXN1cGVyLmRpc3Bvc2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBDaGVja3MgaWYgdGhlIGdpdmVuIG9iamVjdCBjYW4gYmUgYWNjZXB0ZWQgYXMgYSBjaGlsZC4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHRBc0NoaWxkKE9iamVjdCBjaGlsZCkgewotCQlpZiAoZmlsdGVyICE9IG51bGwpIHsKLQkJCXJldHVybiBmaWx0ZXIuYWNjZXB0KGNoaWxkKTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBDaGVja3MgaWYgdGhlIGdpdmVuIG9iamVjdCBjYW4gYmUgYWNjZXB0ZWQgYXMgYSByb2xsZWQtdXAgY2hpbGQuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0QXNSb2xsZWRVcENoaWxkKE9iamVjdCBjaGlsZCkgewotCQljaGlsZCA9IFRuZ1V0aWwudW53cmFwKGNoaWxkKTsKLQkJaWYgKGZpbHRlciAhPSBudWxsICYmICEoY2hpbGQgaW5zdGFuY2VvZiBBY3Rpdml0eSkKLQkJCQkmJiAhKGNoaWxkIGluc3RhbmNlb2YgVGVhbVByb2ZpbGUpKSB7Ci0JCQlyZXR1cm4gZmlsdGVyLmFjY2VwdChjaGlsZCk7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gZGVzY3JpcHRvciAoZS5nOiBhCi0JICogVGFza0Rlc2NyaXB0b3IgaXMgYXNzb2NpYXRlZCB3aXRoIGEgVGFzaykuCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IE9iamVjdCBnZXRPYmplY3QoRGVzY3JpcHRvciBkZXNjcmlwdG9yKTsKLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldE5ld0NoaWxkRGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCwgRWRpdGluZ0RvbWFpbiBlZGl0aW5nRG9tYWluLCBPYmplY3Qgc2libGluZykgewotCQkvLyBkaXNhbGxvdyBjcmVhdGluZyBuZXcgY2hpbGQgaWYgdGhpcyBpdGVtIHByb3ZpZGVyIGlzIHJvbGxlZCB1cAotCQkvLwotCQlpZihpc1JvbGxlZFVwKCkpIHsKLQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCQl9Ci0JCQotCQlyZXR1cm4gc3VwZXIuZ2V0TmV3Q2hpbGREZXNjcmlwdG9ycyhvYmplY3QsIGVkaXRpbmdEb21haW4sIHNpYmxpbmcpOwotCX0KLQkKLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoamF2YS51dGlsLkNvbGxlY3Rpb24sCi0JICogICAgICBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywKLQkJCU9iamVjdCBvYmplY3QpIHsKLQkJLy8gaWYoaXNUb3BBY3Rpdml0eShvYmplY3QpKSB7Ci0JCS8vIG5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkCi0JCS8vIChjcmVhdGVDaGlsZFBhcmFtZXRlcgotCQkvLyAoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QWN0aXZpdHlfQnJlYWtkb3duRWxlbWVudHMoKSwKLQkJLy8gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUGhhc2UoKSkpOwotCQkvLyBuZXdDaGlsZERlc2NyaXB0b3JzLmFkZAotCQkvLyAoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIKLQkJLy8gKFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEFjdGl2aXR5X0JyZWFrZG93bkVsZW1lbnRzKCksCi0JCS8vIFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUl0ZXJhdGlvbigpKSk7Ci0JCS8vIH0KLQkJLy8gZWxzZSBpZihvYmplY3QgaW5zdGFuY2VvZiBQaGFzZSkgewotCQkvLyBuZXdDaGlsZERlc2NyaXB0b3JzLmFkZAotCQkvLyAoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIKLQkJLy8gKFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEFjdGl2aXR5X0JyZWFrZG93bkVsZW1lbnRzKCksCi0JCS8vIFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUl0ZXJhdGlvbigpKSk7Ci0JCS8vIH0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuSUJTSXRlbVByb3ZpZGVyI2lzRXhwYW5kZWQoKQotCSAqLwotCXB1YmxpYyBCb29sZWFuIGlzRXhwYW5kZWQoKSB7Ci0JCXJldHVybiBleHBhbmRlZDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuSUJTSXRlbVByb3ZpZGVyI3NldEV4cGFuZGVkKGJvb2xlYW4pCi0JICovCi0JcHVibGljIHZvaWQgc2V0RXhwYW5kZWQoQm9vbGVhbiBiKSB7Ci0JCWV4cGFuZGVkID0gYjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEudG5nLnByb2Nlc3MuSUJTSXRlbVByb3ZpZGVyI2dldElkKCkKLQkgKi8KLQlwdWJsaWMgaW50IGdldElkKCkgewotCQlyZXR1cm4gaWQ7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnRuZy5wcm9jZXNzLklCU0l0ZW1Qcm92aWRlciNnZXRUb3BJdGVtKCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFRvcEl0ZW0oKSB7Ci0JCWlmICh0b3BJdGVtID09IG51bGwpIHsKLQkJCWlmKFByb2Nlc3NVdGlsLmlzVG9wUHJvY2Vzcyh0YXJnZXQpKSB7Ci0JCQkJcmV0dXJuIHRhcmdldDsKLQkJCX0KLQkJCU9iamVjdCBwYXJlbnQgPSBnZXRQYXJlbnQodGFyZ2V0KTsKLQkJCWlmKHBhcmVudCAhPSBudWxsKSB7Ci0JCQkJT2JqZWN0IGlwID0gZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCkuYWRhcHQocGFyZW50LCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkJCWlmKGlwIGluc3RhbmNlb2YgSUJTSXRlbVByb3ZpZGVyKSB7Ci0JCQkJCUlCU0l0ZW1Qcm92aWRlciBhZGFwdGVyID0gKElCU0l0ZW1Qcm92aWRlcikgaXA7Ci0JCQkJCWlmIChhZGFwdGVyICE9IG51bGwpIHsKLQkJCQkJCU9iamVjdCB0b3AgPSBhZGFwdGVyLmdldFRvcEl0ZW0oKTsKLQkJCQkJCWlmICh0b3AgPT0gbnVsbCAmJiBwYXJlbnQgaW5zdGFuY2VvZiBQcm9jZXNzCi0JCQkJCQkJCSYmICgoUHJvY2VzcykgcGFyZW50KS5nZXRTdXBlckFjdGl2aXRpZXMoKSA9PSBudWxsKSB7Ci0JCQkJCQkJdG9wID0gcGFyZW50OwotCQkJCQkJCWFkYXB0ZXIuc2V0VG9wSXRlbSh0b3ApOwotCQkJCQkJfQotCQkJCQkJcmV0dXJuIHRvcDsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gdG9wSXRlbTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEudG5nLnByb2Nlc3MuSUJTSXRlbVByb3ZpZGVyI3NldElkKGludCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJZChpbnQgaWQpIHsKLQkJdGhpcy5pZCA9IGlkOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNUb3BBY3Rpdml0eShPYmplY3Qgb2JqZWN0KSB7Ci0JCUVPYmplY3QgZU9iaiA9IChFT2JqZWN0KSBvYmplY3Q7Ci0JCU9iamVjdCBwYXJlbnQgPSBlT2JqLmVDb250YWluZXIoKTsKLQkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpIHsKLQkJCVByb2Nlc3NDb21wb25lbnQgcGMgPSAoUHJvY2Vzc0NvbXBvbmVudCkgcGFyZW50OwotCQkJcmV0dXJuIG9iamVjdCA9PSBwYy5nZXRQcm9jZXNzKCk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBvYmplY3QKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBib29sZWFuIGhhc0NoaWxkRGVzY3JpcHRvcihBY3Rpdml0eSBhY3QpIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gYWN0LmdldEJyZWFrZG93bkVsZW1lbnRzKCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZWxlbWVudCA9IGl0ZXIubmV4dCgpOwotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBEZXNjcmlwdG9yKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRDaGlsZHJlbkZlYXR1cmVzKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5GZWF0dXJlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlbkZlYXR1cmVzID09IG51bGwpIHsKLQkJCWNoaWxkcmVuRmVhdHVyZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQljaGlsZHJlbkZlYXR1cmVzLmFkZChVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkuZ2V0QWN0aXZpdHlfQnJlYWtkb3duRWxlbWVudHMoKSk7Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuRmVhdHVyZXM7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0UGFyZW50Rm9yKE9iamVjdCBjaGlsZCwgT2JqZWN0IHBhcmVudCkgewotCQlQcm9jZXNzVXRpbC5zZXRQYXJlbnQoY2hpbGQsIHBhcmVudCwgZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCkpOwotCX0KLQotLy8JcHJpdmF0ZSBDb2xsZWN0aW9uIGdldERpcmVjdENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLS8vCQlMaXN0IG15Q2hpbGRyZW47Ci0vLwkJQ2hpbGRyZW5TdG9yZSBzdG9yZSA9IGdldENoaWxkcmVuU3RvcmUob2JqZWN0KTsKLS8vCQlpZiAoc3RvcmUgIT0gbnVsbCkgewotLy8JCQlteUNoaWxkcmVuID0gc3RvcmUuZ2V0Q2hpbGRyZW4oKTsKLS8vCQl9IGVsc2UgewotLy8JCQkvLyBzdG9yZSA9IGNyZWF0ZUNoaWxkcmVuU3RvcmUob2JqZWN0KTsKLS8vCQkJTGlzdCByZXN1bHQgPSBzdG9yZSAhPSBudWxsID8gbnVsbCA6IG5ldyBBcnJheUxpc3QoKTsKLS8vCQkJRU9iamVjdCBlT2JqZWN0ID0gKEVPYmplY3QpIG9iamVjdDsKLS8vCi0vLwkJCWZvciAoSXRlcmF0b3IgaSA9IGdldENoaWxkcmVuRmVhdHVyZXMob2JqZWN0KS5pdGVyYXRvcigpOyBpCi0vLwkJCQkJLmhhc05leHQoKTspIHsKLS8vCQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgaS5uZXh0KCk7Ci0vLwkJCQlpZiAoZmVhdHVyZS5pc01hbnkoKSkgewkJCQkJCi0vLwkJCQkJTGlzdCBjaGlsZHJlbiA9IChMaXN0KSBlT2JqZWN0LmVHZXQoZmVhdHVyZSk7Ci0vLwkJCQkJCi0vLy8vCQkJCQkvL0NoYW5nZSBmb3IgQWN0aXZpdHkgVmFyaWFiaWxpdHkuIFRvIGRvIHJlYWxpemF0aW9uIGZvcgotLy8vLwkJCQkJLy9Ccm93c2luZyBhbmQgUHVibGlzaGluZy4KLS8vLy8JCQkJCUxpc3QgY2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KCk7Ci0vLy8vCQkJCQlpZihmaWx0ZXIgIT0gbnVsbCAmJiBmaWx0ZXIgaW5zdGFuY2VvZiBJQ29uZmlndXJhdG9yKXsKLS8vLy8JCQkJCQljaGlsZHJlbi5hZGRBbGwoKChJQ29uZmlndXJhdG9yKWZpbHRlcikuZ2V0Q2hpbGRyZW4ob2JqZWN0LCBmZWF0dXJlKSk7Ci0vLy8vCQkJCQl9Ci0vLy8vCQkJCQllbHNlewotLy8vLwkJCQkJCWNoaWxkcmVuID0gKExpc3QpIGVPYmplY3QuZUdldChmZWF0dXJlKTsKLS8vLy8JCQkJCX0KLS8vCQkJCQkKLS8vCQkJCQlpbnQgaW5kZXggPSAwOwotLy8JCQkJCWZvciAoSXRlcmF0b3IgY2kgPSBjaGlsZHJlbi5pdGVyYXRvcigpOyBjaS5oYXNOZXh0KCk7IGluZGV4KyspIHsKLS8vCQkJCQkJT2JqZWN0IGNoaWxkID0gY2kubmV4dCgpOwotLy8JCQkJCQlpZiAoYWNjZXB0QXNDaGlsZChjaGlsZCkpIHsKLS8vCQkJCQkJCWNoaWxkID0gd3JhcChlT2JqZWN0LCBmZWF0dXJlLCBjaGlsZCwgaW5kZXgpOwotLy8JCQkJCQkJc2V0UGFyZW50Rm9yKGNoaWxkLCBvYmplY3QpOwotLy8JCQkJCQkJLy8gSUJTSXRlbVByb3ZpZGVyIGFkYXB0ZXIgPSAoSUJTSXRlbVByb3ZpZGVyKQotLy8JCQkJCQkJLy8gZ2V0QmVzdEFkYXB0ZXJGYWN0b3J5KCkuYWRhcHQoY2hpbGQsCi0vLwkJCQkJCQkvLyBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotLy8JCQkJCQkJLy8gYWRhcHRlci5zZXRSb2xsZWRVcChmYWxzZSk7Ci0vLwkJCQkJCQlpZiAoc3RvcmUgIT0gbnVsbCkgewotLy8JCQkJCQkJCXN0b3JlLmdldExpc3QoZmVhdHVyZSkuYWRkKGNoaWxkKTsKLS8vCQkJCQkJCX0gZWxzZSB7Ci0vLwkJCQkJCQkJcmVzdWx0LmFkZChjaGlsZCk7Ci0vLwkJCQkJCQl9Ci0vLwkJCQkJCX0KLS8vCQkJCQl9Ci0vLwkJCQl9IGVsc2UgewotLy8JCQkJCU9iamVjdCBjaGlsZCA9IGVPYmplY3QuZUdldChmZWF0dXJlKTsKLS8vCQkJCQlpZiAoYWNjZXB0QXNDaGlsZChjaGlsZCkpIHsKLS8vCQkJCQkJY2hpbGQgPSB3cmFwKGVPYmplY3QsIGZlYXR1cmUsIGNoaWxkLAotLy8JCQkJCQkJCUNvbW1hbmRQYXJhbWV0ZXIuTk9fSU5ERVgpOwotLy8JCQkJCQlzZXRQYXJlbnRGb3IoY2hpbGQsIG9iamVjdCk7Ci0vLwkJCQkJCS8vIElCU0l0ZW1Qcm92aWRlciBhZGFwdGVyID0gKElCU0l0ZW1Qcm92aWRlcikKLS8vCQkJCQkJLy8gZ2V0QmVzdEFkYXB0ZXJGYWN0b3J5KCkuYWRhcHQoY2hpbGQsCi0vLwkJCQkJCS8vIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0vLwkJCQkJCS8vIGFkYXB0ZXIuc2V0Um9sbGVkVXAoZmFsc2UpOwotLy8KLS8vCQkJCQkJaWYgKHN0b3JlICE9IG51bGwpIHsKLS8vCQkJCQkJCXN0b3JlLnNldFZhbHVlKGZlYXR1cmUsIGNoaWxkKTsKLS8vCQkJCQkJfSBlbHNlIHsKLS8vCQkJCQkJCXJlc3VsdC5hZGQoY2hpbGQpOwotLy8JCQkJCQl9Ci0vLwkJCQkJfQotLy8JCQkJfQotLy8JCQl9Ci0vLwkJCW15Q2hpbGRyZW4gPSBzdG9yZSAhPSBudWxsID8gc3RvcmUuZ2V0Q2hpbGRyZW4oKSA6IHJlc3VsdDsKLS8vCQl9Ci0vLwkJQ29sbGVjdGlvbiBjaGlsZHJlbiA9IGFkZEluaGVyaXRlZChvYmplY3QsIG15Q2hpbGRyZW4pOwotLy8JCXJldHVybiBjaGlsZHJlbjsKLS8vCX0KLQkKLQlwcml2YXRlIENvbGxlY3Rpb24gZ2V0SW1tZWRpYXRlQ2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlDb2xsZWN0aW9uIGNoaWxkcmVuID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBzdXBlci5nZXRDaGlsZHJlbihvYmplY3QpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGNoaWxkID0gKE9iamVjdCkgaXRlci5uZXh0KCk7Ci0JCQlpZihhY2NlcHRBc0NoaWxkKGNoaWxkKSkgewotCQkJCWlmKGNvbmZpZ3VyYXRvciAhPSBudWxsKSB7Ci0JCQkJCWNoaWxkID0gY29uZmlndXJhdG9yLnJlc29sdmUoY2hpbGQpOwotCQkJCX0KLQkJCQlpZihjaGlsZCAhPSBudWxsICYmICFjaGlsZHJlbi5jb250YWlucyhjaGlsZCkpIHsKLQkJCQkJc2V0UGFyZW50Rm9yKGNoaWxkLCBvYmplY3QpOwotCQkJCQljaGlsZHJlbi5hZGQoY2hpbGQpOwotCQkJCX0KLQkJCX0KLQkJfQotCQljaGlsZHJlbiA9IGFkZEluaGVyaXRlZChvYmplY3QsIChMaXN0KSBjaGlsZHJlbik7Ci0JCXJldHVybiBjaGlsZHJlbjsKLQl9Ci0JCi0JcHJpdmF0ZSBDb2xsZWN0aW9uIGdldFJvbGxlZFVwQ2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlpZiAocm9sbGVkVXBXcmFwcGVycyAhPSBudWxsKSB7Ci0JCQlyb2xsZWRVcFdyYXBwZXJzLmRpc3Bvc2UoKTsKLQkJfQotCi0JCUxpc3QgY2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUFic3RyYWN0VHJlZUl0ZXJhdG9yIGl0ZXIgPSBuZXcgQWJzdHJhY3RUcmVlSXRlcmF0b3Iob2JqZWN0LCBmYWxzZSkgewotCi0JCQkvKioKLQkJCSAqIENvbW1lbnQgZm9yIDxjb2RlPnNlcmlhbFZlcnNpb25VSUQ8L2NvZGU+Ci0JCQkgKi8KLQkJCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC0zMTU5NTM3NjI5NjE5NzM3MzY4TDsKLQotCQkJcHJvdGVjdGVkIEl0ZXJhdG9yIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQkJQlNBY3Rpdml0eUl0ZW1Qcm92aWRlciBhZGFwdGVyID0gKEJTQWN0aXZpdHlJdGVtUHJvdmlkZXIpIGFkYXB0ZXJGYWN0b3J5LmFkYXB0KG9iamVjdCwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCQkJSXRlcmF0b3IgaXRlcmF0b3I7Ci0JCQkJCWJvb2xlYW4gYiA9IGFkYXB0ZXIuaXNSb2xsZWRVcCgpOwotCQkJCQl0cnkgewotCQkJCQkJYWRhcHRlci5iYXNpY1NldFJvbGxlZFVwKGZhbHNlKTsKLQkJCQkJCWl0ZXJhdG9yID0gYWRhcHRlci5nZXRDaGlsZHJlbihvYmplY3QpLml0ZXJhdG9yKCk7Ci0JCQkJCX0KLQkJCQkJZmluYWxseSB7Ci0JCQkJCQlhZGFwdGVyLmJhc2ljU2V0Um9sbGVkVXAoYik7Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIGl0ZXJhdG9yOwotCQkJCX0gZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIKLQkJCQkJCSYmICEob2JqZWN0IGluc3RhbmNlb2YgVGVhbVByb2ZpbGVXcmFwcGVySXRlbVByb3ZpZGVyKSkgewotCQkJCQlyZXR1cm4gKChCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgb2JqZWN0KQotCQkJCQkJCS5nZXRDaGlsZHJlbihvYmplY3QpLml0ZXJhdG9yKCk7Ci0JCQkJfQotCQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNULml0ZXJhdG9yKCk7Ci0JCQl9Ci0KLQkJfTsKLQkJLy8gbWFrZSBzdXJlIHRoYXQgb25seSBvbmUgZGVzY3JpcHRvciBmb3IgZWFjaCBjb250ZW50IGVsZW1lbnQgaW4gdGhlIHJvbGwtdXAgbGlzdAotCQkvLwotCQlMaXN0IGRlc2NyaXB0b3JzID0gbmV3IEFycmF5TGlzdCgpOwotCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCU9iamVjdCBjaGlsZCA9IGl0ZXIubmV4dCgpOwotCQkJaWYgKGFjY2VwdEFzUm9sbGVkVXBDaGlsZChjaGlsZCkpIHsKLQkJCQlPYmplY3QgZSA9IFRuZ1V0aWwudW53cmFwKGNoaWxkKTsKLQkJCQlpZihlIGluc3RhbmNlb2YgRGVzY3JpcHRvcikgewotCQkJCQlPYmplY3QgZGVzYyA9IGZpbmREZXNjcmlwdG9yKGRlc2NyaXB0b3JzLCBlKTsKLQkJCQkJaWYoZGVzYyA9PSBudWxsKSB7Ci0JCQkJCQlpZihpc1dyYXBwaW5nUm9sbHVwTmVlZGVkKGNoaWxkKSkgewotCQkJCQkJCWNoaWxkID0gY3JlYXRlUm9sbHVwV3JhcHBlcihjaGlsZCwgb2JqZWN0LCBhZGFwdGVyRmFjdG9yeSk7Ci0JCQkJCQl9Ci0JCQkJCQljaGlsZHJlbi5hZGQoY2hpbGQpOwotCQkJCQkJZGVzY3JpcHRvcnMuYWRkKGNoaWxkKTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCWlmKGlzV3JhcHBpbmdSb2xsdXBOZWVkZWQoY2hpbGQpKSB7Ci0JCQkJCQkJQ29tcG9zZWRCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlciBjb21wb3NlZFdyYXBwZXIgPSBQcm9jZXNzVXRpbC5nZXRDb21wb3NlZFdyYXBwZXIoZGVzYyk7Ci0JCQkJCQkJaWYoY29tcG9zZWRXcmFwcGVyICE9IG51bGwpIHsKLQkJCQkJCQkJY29tcG9zZWRXcmFwcGVyLmFkZEVsZW1lbnQoY2hpbGQpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJY2hpbGRyZW4uYWRkKGNoaWxkKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZGVzY3JpcHRvcnMuY2xlYXIoKTsKLQkJZGVzY3JpcHRvcnMgPSBudWxsOwotCQlyZXR1cm4gY2hpbGRyZW47Ci0JfQotCQotCS8qKgotCSAqIENoZWNrcyBpZiB3cmFwcGluZyBvZiB0aGUgc3BlY2lmaWVkIHJvbGx1cCBlbGVtZW50IGlzIG5lZWRlZC4gSWYgaXQncwotCSAqIG5lZWRlZCwgdGhlIGNhbGxlciB3aWxsIHVzZQotCSAqIHtAbGluayAjY3JlYXRlUm9sbHVwV3JhcHBlcihPYmplY3QsIE9iamVjdCwgQWRhcHRlckZhY3RvcnkpfSB0byBjcmVhdGUKLQkgKiB3cmFwcGVyIGZvciB0aGUgcm9sbHVwIGVsZW1lbnQuCi0JICogCi0JICogQHBhcmFtIG9iamVjdAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1dyYXBwaW5nUm9sbHVwTmVlZGVkKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlwcm90ZWN0ZWQgQ29tcG9zZWRCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlciBjcmVhdGVDb21wb3NlZFdyYXBwZXIoT2JqZWN0IG9iamVjdCwgT2JqZWN0IG93bmVyLCBBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlyZXR1cm4gbmV3IENvbXBvc2VkQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIob2JqZWN0LCBvd25lciwgYWRhcHRlckZhY3RvcnkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgT2JqZWN0IGNyZWF0ZVJvbGx1cFdyYXBwZXIoT2JqZWN0IG9iamVjdCwgT2JqZWN0IG93bmVyLCBBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewkJCi0JCUNvbXBvc2VkQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIgd3JhcHBlciA9IGNyZWF0ZUNvbXBvc2VkV3JhcHBlcihvYmplY3QsIG93bmVyLCBhZGFwdGVyRmFjdG9yeSk7Ci0JCXdyYXBwZXIucmVhZE9ubHkgPSB0cnVlOwotCQl3cmFwcGVyLmlzUm9sbHVwQ2hpbGQgPSB0cnVlOwotCQkKLQkJaWYocm9sbGVkVXBXcmFwcGVycyA9PSBudWxsKSB7Ci0JCQlyb2xsZWRVcFdyYXBwZXJzID0gbmV3IERpc3Bvc2FibGUoKTsKLQkJfQotCQlyb2xsZWRVcFdyYXBwZXJzLmFkZCh3cmFwcGVyKTsKLQotCQlyZXR1cm4gd3JhcHBlcjsgCQkKLQl9CQkKLQkKLQlwcml2YXRlIENvbGxlY3Rpb24gZG9HZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmKGlzUm9sbGVkVXAoKSkgewotCQkJcmV0dXJuIGdldFJvbGxlZFVwQ2hpbGRyZW4ob2JqZWN0KTsKLQkJfQotCQllbHNlIHsKLQkJCXJldHVybiBnZXRJbW1lZGlhdGVDaGlsZHJlbihvYmplY3QpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldENoaWxkcmVuKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlBY3Rpdml0eSBhY3Rpdml0eSA9IChBY3Rpdml0eSkgb2JqZWN0OwotCQlpZihjb25maWd1cmF0b3IgIT0gbnVsbCkgewotCQkJCi0JCQkvL1RPRE86IHJlbW92ZSB0aGUgZW5hYmxlVmFyaWFiaWxpdHlJbmZvRmxhZyBhbmQgIAotCQkJLy8gY3JlYXRlIGFuIGludGVyZmFjZSBvciBkbyBkaWZmZXJlbnRseQotCQkJaWYoZW5hYmxlVmFyaWFiaWxpdHlJbmZvKQotCQkJCXZhcmlhYmlsaXR5SW5mbyA9IGNvbmZpZ3VyYXRvci5nZXRWYXJpYWJpbGl0eUluZm8oYWN0aXZpdHkpOwotCQkJZWxzZSAKLQkJCQl2YXJpYWJpbGl0eUluZm8gPSBudWxsOwotCQl9Ci0JCWVsc2UgewotCQkJdmFyaWFiaWxpdHlJbmZvID0gbnVsbDsKLQkJfQotCQlpZih2YXJpYWJpbGl0eUluZm8gIT0gbnVsbCkgewotCQkJT2JqZWN0IHJlc29sdmVkID0gdmFyaWFiaWxpdHlJbmZvLmdldEluaGVyaXRhbmNlTGlzdCgpLmdldCgwKTsKLQkJCUJTQWN0aXZpdHlJdGVtUHJvdmlkZXIgaXAgPSAoQlNBY3Rpdml0eUl0ZW1Qcm92aWRlcikgYWRhcHRlckZhY3RvcnkuYWRhcHQocmVzb2x2ZWQsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7CQkJCi0JCQlDb2xsZWN0aW9uIGNoaWxkcmVuOwotCQkJYm9vbGVhbiBiID0gaXAuaXNSb2xsZWRVcCgpOwotCQkJdHJ5IHsKLQkJCQlpcC5iYXNpY1NldFJvbGxlZFVwKGlzUm9sbGVkVXAoKSk7Ci0JCQkJY2hpbGRyZW4gPSBpcC5kb0dldENoaWxkcmVuKHJlc29sdmVkKTsKLQkJCX0KLQkJCWZpbmFsbHkgewotCQkJCWlwLmJhc2ljU2V0Um9sbGVkVXAoYik7Ci0JCQl9Ci0JCQlpZighdmFyaWFiaWxpdHlJbmZvLmdldENvbnRyaWJ1dG9ycygpLmlzRW1wdHkoKSkgewotCQkJCUFycmF5TGlzdCBjb250cmlidXRlZENoaWxkcmVuID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHZhcmlhYmlsaXR5SW5mby5nZXRDb250cmlidXRvcnMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJT2JqZWN0IGUgPSBpdGVyLm5leHQoKTsKLQkJCQkJT2JqZWN0IGFkYXB0ZXIgPSBhZGFwdGVyRmFjdG9yeS5hZGFwdChlLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkJCQlpZihhZGFwdGVyIGluc3RhbmNlb2YgQlNBY3Rpdml0eUl0ZW1Qcm92aWRlcikgewotCQkJCQkJaXAgPSAoKEJTQWN0aXZpdHlJdGVtUHJvdmlkZXIpYWRhcHRlcik7Ci0JCQkJCQliID0gaXAuaXNSb2xsZWRVcCgpOwotCQkJCQkJdHJ5IHsKLQkJCQkJCQlpcC5iYXNpY1NldFJvbGxlZFVwKGlzUm9sbGVkVXAoKSk7Ci0JCQkJCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGlwLmdldEltbWVkaWF0ZUNoaWxkcmVuKGUpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yCi0JCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCQkJZSA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJCQkJZSA9IFByb3ZpZGVycy5nZXRDb25maWd1cmF0aW9uQXBwbGljYXRvcigpLnJlc29sdmUoZSwgY29uZmlndXJhdG9yLmdldE1ldGhvZENvbmZpZ3VyYXRpb24oKSk7Ci0JCQkJCQkJCWlmKGUgIT0gbnVsbCAmJiAhVG5nVXRpbC5jb250YWlucyhjaGlsZHJlbiwgZSkpIHsKLQkJCQkJCQkJCWNvbnRyaWJ1dGVkQ2hpbGRyZW4uYWRkKGUpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJZmluYWxseSB7Ci0JCQkJCQkJaXAuYmFzaWNTZXRSb2xsZWRVcChiKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQlpZighY29udHJpYnV0ZWRDaGlsZHJlbi5pc0VtcHR5KCkpIHsKLQkJCQkJY2hpbGRyZW4uYWRkQWxsKHdyYXBDb250cmlidXRlZChhY3Rpdml0eSwgY29udHJpYnV0ZWRDaGlsZHJlbikpOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBjaGlsZHJlbjsKLQkJfQotCQlyZXR1cm4gZG9HZXRDaGlsZHJlbihvYmplY3QpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVDYWNoZWRDaGlsZHJlbihDb2xsZWN0aW9uIGNoaWxkcmVuKSB7Ci0vLwkJaWYoaXNSb2xsZWRVcCgpKSB7Ci0vLwkJCWlmKGNhY2hlZFJvbGx1cENoaWxkcmVuID09IG51bGwpIHsKLS8vCQkJCWNhY2hlZFJvbGx1cENoaWxkcmVuID0gbmV3IEFycmF5TGlzdChjaGlsZHJlbik7Ci0vLwkJCX0KLS8vCQkJZWxzZSB7Ci0vLwkJCQljYWNoZWRSb2xsdXBDaGlsZHJlbi5jbGVhcigpOwotLy8JCQkJY2FjaGVkUm9sbHVwQ2hpbGRyZW4uYWRkQWxsKGNoaWxkcmVuKTsKLS8vCQkJfQotLy8JCX0KLS8vCQllbHNlIHsKLS8vCQkJaWYoY2FjaGVkQ2hpbGRyZW4gPT0gbnVsbCkgewotLy8JCQkJY2FjaGVkQ2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KGNoaWxkcmVuKTsKLS8vCQkJfQotLy8JCQllbHNlIHsKLS8vCQkJCWNhY2hlZENoaWxkcmVuLmNsZWFyKCk7Ci0vLwkJCQljYWNoZWRDaGlsZHJlbi5hZGRBbGwoY2hpbGRyZW4pOwotLy8JCQl9Ci0vLwkJfQotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklDYWNoZWRDaGlsZHJlbkl0ZW1Qcm92aWRlciNnZXRDaGlsZHJlbkZyb21DYWNoZSgpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5Gcm9tQ2FjaGUoKSB7Ci0JCWlmKGNhY2hlZENoaWxkcmVuID09IG51bGwpIHsKLQkJCWdldENoaWxkcmVuKHRhcmdldCk7Ci0JCX0KLQkJcmV0dXJuIGNhY2hlZENoaWxkcmVuOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklDYWNoZWRDaGlsZHJlbkl0ZW1Qcm92aWRlciNnZXRSb2xsdXBDaGlsZHJlbkZyb21DYWNoZSgpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Um9sbHVwQ2hpbGRyZW5Gcm9tQ2FjaGUoKSB7Ci0JCWlmKGNhY2hlZFJvbGx1cENoaWxkcmVuID09IG51bGwpIHsKLQkJCWJvb2xlYW4gb2xkUm9sbGVkVXAgPSByb2xsZWRVcDsKLQkJCXRyeSB7Ci0JCQkJcm9sbGVkVXAgPSB0cnVlOwotCQkJCWdldENoaWxkcmVuKHRhcmdldCk7Ci0JCQl9Ci0JCQlmaW5hbGx5IHsKLQkJCQlyb2xsZWRVcCA9IG9sZFJvbGxlZFVwOwotCQkJfQkJCQotCQl9Ci0JCXJldHVybiBjYWNoZWRSb2xsdXBDaGlsZHJlbjsKLQl9Ci0JCi0JcHJpdmF0ZSBCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlciBmaW5kV3JhcHBlcihPYmplY3Qgb3duZXIsIE9iamVjdCB2YWx1ZSkgewotCQkvLyBmaW5kIGlmIGEgd3JhcHBlciBhbHJlYWR5IGV4aXN0IGZvciB0aGUgZ2l2ZW4gdmFsdWUgYW5kIG93bmVyCi0JCS8vCi0JCU9iamVjdCBhZGFwdGVyID0gYWRhcHRlckZhY3RvcnkuYWRhcHQodmFsdWUsCi0JCQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIgd3JhcHBlciA9IG51bGw7Ci0JCWlmIChhZGFwdGVyIGluc3RhbmNlb2YgSUJTSXRlbVByb3ZpZGVyKSB7Ci0JCQlMaXN0IGxpc3RlbmVycyA9ICgoSUJTSXRlbVByb3ZpZGVyKSBhZGFwdGVyKS5nZXRMaXN0ZW5lcnMoKTsKLQkJCWlmIChsaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJCWZpbmRfd3JhcHBlcl9sb29wOiBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBsaXN0ZW5lcnMuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJT2JqZWN0IGVsZW1lbnQgPSAoT2JqZWN0KSBpdGVyLm5leHQoKTsKLQkJCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgewotCQkJCQkJd3JhcHBlciA9IChCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgZWxlbWVudDsKLQkJCQkJCWlmICh3cmFwcGVyLmdldFZhbHVlKCkgPT0gdmFsdWUKLQkJCQkJCQkJJiYgd3JhcHBlci5nZXRQYXJlbnQodmFsdWUpID09IG93bmVyKSB7Ci0JCQkJCQkJYnJlYWsgZmluZF93cmFwcGVyX2xvb3A7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCXdyYXBwZXIgPSBudWxsOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiB3cmFwcGVyOwotCX0KLQotCXByaXZhdGUgTGlzdCB3cmFwSW5oZXJpdGVkKEFjdGl2aXR5IG93bmVyLCBDb2xsZWN0aW9uIGJyZWFrZG93bkVsZW1lbnRzKSB7Ci0JCWlmICh3cmFwcGVycyA9PSBudWxsKSB7Ci0JCQl3cmFwcGVycyA9IG5ldyBEaXNwb3NhYmxlKCk7Ci0JCX0JCi0JCXJldHVybiB3cmFwKG93bmVyLCBicmVha2Rvd25FbGVtZW50cywgdHJ1ZSwgZmFsc2UsIHdyYXBwZXJzKTsKLQl9Ci0JCi0JcHJpdmF0ZSBMaXN0IHdyYXBDb250cmlidXRlZChBY3Rpdml0eSBvd25lciwgQ29sbGVjdGlvbiBicmVha2Rvd25FbGVtZW50cykgewotCQlpZihjb250cmlidXRlZFdyYXBwZXJzID09IG51bGwpIHsKLQkJCWNvbnRyaWJ1dGVkV3JhcHBlcnMgPSBuZXcgRGlzcG9zYWJsZSgpOwotCQl9Ci0JCXJldHVybiB3cmFwKG93bmVyLCBicmVha2Rvd25FbGVtZW50cywgZmFsc2UsIHRydWUsIGNvbnRyaWJ1dGVkV3JhcHBlcnMpOwotCX0KLQkKLQlwcml2YXRlIElXcmFwcGVySXRlbVByb3ZpZGVyRmFjdG9yeSBnZXRXcmFwcGVySXRlbVByb3ZpZGVyRmFjdG9yeSgpIHsKLQkJSVdyYXBwZXJJdGVtUHJvdmlkZXJGYWN0b3J5IGZhY3RvcnkgPSBudWxsOwotCQlpZihhZGFwdGVyRmFjdG9yeSBpbnN0YW5jZW9mIElXcmFwcGVySXRlbVByb3ZpZGVyRmFjdG9yeVByb3ZpZGVyKSB7Ci0JCQlmYWN0b3J5ID0gKChJV3JhcHBlckl0ZW1Qcm92aWRlckZhY3RvcnlQcm92aWRlcilhZGFwdGVyRmFjdG9yeSkuZ2V0V3JhcHBlckl0ZW1Qcm92aWRlckZhY3RvcnkoKTsKLQkJfQotCQlpZihmYWN0b3J5ID09IG51bGwpIHsKLQkJCWZhY3RvcnkgPSBJQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXJGYWN0b3J5LklOU1RBTkNFOwotCQl9Ci0JCXJldHVybiBmYWN0b3J5OwotCX0KLQkKLQlwcml2YXRlIExpc3Qgd3JhcChBY3Rpdml0eSBvd25lciwgQ29sbGVjdGlvbiBicmVha2Rvd25FbGVtZW50cywgYm9vbGVhbiBpbmhlcml0ZWQsIGJvb2xlYW4gY29udHJpYnV0ZWQsIERpc3Bvc2FibGUgd3JhcHBlcnMpIHsKLQkJQXJyYXlMaXN0IHdyYXBwZXJMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlJV3JhcHBlckl0ZW1Qcm92aWRlckZhY3Rvcnkgd3JhcHBlckZhY3RvcnkgPSBnZXRXcmFwcGVySXRlbVByb3ZpZGVyRmFjdG9yeSgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBicmVha2Rvd25FbGVtZW50cy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBvYmplY3QgPSBpdGVyLm5leHQoKTsKLQkJCU9iamVjdCB1bldyYXBwZWQgPSBUbmdVdGlsLnVud3JhcChvYmplY3QpOwotCQkJaWYgKHVuV3JhcHBlZCBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnQpIHsKLQkJCQlCcmVha2Rvd25FbGVtZW50IGUgPSAoQnJlYWtkb3duRWxlbWVudCkgdW5XcmFwcGVkOwotCQkJCWlmICghVG5nVXRpbC5pc0Jhc2Uob3duZXIuZ2V0QnJlYWtkb3duRWxlbWVudHMoKSwgZSkpIHsKLQkJCQkJT2JqZWN0IGNoaWxkID0gZ2V0V3JhcHBlcihvd25lciwgZSwgd3JhcHBlcnMpOwotCQkJCQlpZihjaGlsZCA9PSBudWxsKSB7Ci0JCQkJCQljaGlsZCA9IHdyYXBwZXJGYWN0b3J5LmNyZWF0ZVdyYXBwZXIoZSwgb3duZXIsIGFkYXB0ZXJGYWN0b3J5KTsKLQkJCQkJCWlmKGNoaWxkIGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIHsKLQkJCQkJCQlCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlciBiZVdyYXBwZXIgPSAoQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIGNoaWxkOwotCQkJCQkJCWlmKGluaGVyaXRlZCkgewotCQkJCQkJCQliZVdyYXBwZXIuaXNJbmhlcml0ZWQgPSB0cnVlOwotCQkJCQkJCX0KLQkJCQkJCQllbHNlIGlmKGNvbnRyaWJ1dGVkKSB7Ci0JCQkJCQkJCWJlV3JhcHBlci5jb250cmlidXRlZCA9IHRydWU7Ci0JCQkJCQkJCWlmKG9iamVjdCBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyCi0JCQkJCQkJCQkJJiYgKChCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcilvYmplY3QpLmlzSW5oZXJpdGVkKCkpIHsKLQkJCQkJCQkJCWJlV3JhcHBlci5pc0luaGVyaXRlZCA9IHRydWU7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQl3cmFwcGVycy5yZW1vdmUoY2hpbGQpOwotCQkJCQl9Ci0JCQkJCXdyYXBwZXJMaXN0LmFkZChjaGlsZCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXdyYXBwZXJzLmRpc3Bvc2UoKTsKLQkJd3JhcHBlcnMuYWRkQWxsKHdyYXBwZXJMaXN0KTsKLQkJcmV0dXJuIHdyYXBwZXJMaXN0OwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBPYmplY3QgZ2V0V3JhcHBlcihBY3Rpdml0eSBvd25lciwgQnJlYWtkb3duRWxlbWVudCBlLCBDb2xsZWN0aW9uIHdyYXBwZXJzKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHdyYXBwZXJzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJSVdyYXBwZXJJdGVtUHJvdmlkZXIgd3JhcHBlciA9IChJV3JhcHBlckl0ZW1Qcm92aWRlcikgaXRlci5uZXh0KCk7Ci0JCQlpZih3cmFwcGVyLmdldE93bmVyKCkgPT0gb3duZXIgJiYgd3JhcHBlci5nZXRWYWx1ZSgpID09IGUpIHsKLQkJCQlyZXR1cm4gd3JhcHBlcjsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHJvdGVjdGVkIEFkYXB0ZXIgY3JlYXRlQmFzZUxpc3RlbmVyKCkgewotCQlpZiAoYmFzZUxpc3RlbmVyID09IG51bGwpIHsKLQkJCWJhc2VMaXN0ZW5lciA9IG5ldyBBZGFwdGVySW1wbCgpIHsKLQkJCQkvKgotCQkJCSAqIChub24tSmF2YWRvYykKLQkJCQkgKiAKLQkJCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuQWN0aXZpdHlJdGVtUHJvdmlkZXIjbm90aWZ5Q2hhbmdlZChvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb24pCi0JCQkJICovCi0JCQkJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChmaW5hbCBOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCQkJCUFjdGl2aXR5IGFjdCA9IChBY3Rpdml0eSkgQlNBY3Rpdml0eUl0ZW1Qcm92aWRlci50aGlzCi0JCQkJCQkJLmdldFRhcmdldCgpOwotCQkJCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoQWN0aXZpdHkuY2xhc3MpKSB7Ci0JCQkJCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9fUFJFU0VOVEFUSU9OX05BTUU6Ci0JCQkJCQlpZiAoUHJvY2Vzc1V0aWwuaXNFeHRlbmRpbmdPckxvY2FsbHlDb250cmlidXRpbmcoYWN0KSkgewotCQkJCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24oCi0JCQkJCQkJCQlub3RpZmljYXRpb24sIGFjdCwgZmFsc2UsIHRydWUpKTsKLQkJCQkJCX0KLQkJCQkJCWJyZWFrOwotCi0JCQkJCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9fTkFNRToKLQkJCQkJCWlmIChhY3QuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpICE9IG51bGwpIHsKLQkJCQkJCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKAotCQkJCQkJCQkJbm90aWZpY2F0aW9uLCBhY3QsIGZhbHNlLCB0cnVlKSk7Ci0JCQkJCQl9Ci0JCQkJCQlicmVhazsKLQotCQkJCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX1NVUFBSRVNTRUQ6Ci0JCQkJCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwKLQkJCQkJCQkJYWN0LCB0cnVlLCBmYWxzZSkpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVDoKLQkJCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLAotCQkJCQkJCQlhY3QsIHRydWUsIHRydWUpKTsKLQkJCQkJCXJlZnJlc2hBZmZlY3RlZFZpZXdlcnMoKTsKLQkJCQkJCWJyZWFrOwotCi0JCQkJCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9fQlJFQUtET1dOX0VMRU1FTlRTOiB7Ci0JCQkJCQlpZihoYW5kbGVSZXBsYWNlQnJlYWtkb3duRWxlbWVudChub3RpZmljYXRpb24pKSB7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQl9Ci0JCQkJCQlMaXN0IGxpc3QgPSBnZXRBZmZlY3RlZENoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0JCQkJCQlpZiAoIWxpc3QuaXNFbXB0eSgpKSB7Ci0JCQkJCQkJYm9vbGVhbiB1cGRhdGVMYWJlbCA9IHJlZnJlc2hDaGlsZHJlbkRhdGEoCi0JCQkJCQkJCQlub3RpZmljYXRpb24sIGxpc3QpOwotCi0JCQkJCQkJLy8gZm9yd2FyZCBub3RpZmljYXRpb24KLQkJCQkJCQkvLwotCQkJCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24oCi0JCQkJCQkJCQlub3RpZmljYXRpb24sIGFjdCwgdHJ1ZSwgdXBkYXRlTGFiZWwpKTsKLQotCQkJCQkJCS8vIFByb2Nlc3NVdGlsLnJlZnJlc2hWaWV3ZXIoZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQkJLy8gKFByb2Nlc3MpIGdldFRvcEl0ZW0oKSk7Ci0JCQkJCQkJcmVmcmVzaEFmZmVjdGVkVmlld2VycygpOwotCQkJCQkJfQotCi0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfTsKLQkJfQotCi0JCXJldHVybiBiYXNlTGlzdGVuZXI7Ci0JfQotCi0JcHJvdGVjdGVkIEFjdGl2aXR5IGxpc3RlblRvQmFzZUFjdGl2aXR5KCkgewotCQlBY3Rpdml0eSBhY3QgPSAoQWN0aXZpdHkpIHRhcmdldDsKLQkJaWYgKCFQcm9jZXNzVXRpbC5pc0V4dGVuZGluZ09yTG9jYWxseUNvbnRyaWJ1dGluZyhhY3QpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlBY3Rpdml0eSBiYXNlQWN0OwotCQlpZih2YXJpYWJpbGl0eUluZm8gIT0gbnVsbCkgewotCQkJaWYodmFyaWFiaWxpdHlJbmZvLmdldEluaGVyaXRhbmNlTGlzdCgpLnNpemUoKSA+IDEpIHsKLQkJCQliYXNlQWN0ID0gKEFjdGl2aXR5KSB2YXJpYWJpbGl0eUluZm8uZ2V0SW5oZXJpdGFuY2VMaXN0KCkuZ2V0KDEpOwotCQkJfQkJCQotCQkJZWxzZSB7Ci0JCQkJYmFzZUFjdCA9IChBY3Rpdml0eSkgY29uZmlndXJhdG9yLnJlc29sdmUoYWN0LmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQliYXNlQWN0ID0gKEFjdGl2aXR5KSBhY3QuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpOwotCQl9Ci0JCWlmIChiYXNlQWN0ID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCQotCQljcmVhdGVCYXNlTGlzdGVuZXIoKTsKLQkJCi0JCS8vIHJlbW92ZSBiYXNlTGlzdGVuZXIgZnJvbSBvbGQgYmFzZSwgaWYgdGhlcmUgaXMgYW55Ci0JCS8vCi0JCUVPYmplY3Qgb2xkQmFzZSA9IChFT2JqZWN0KSBiYXNlTGlzdGVuZXIuZ2V0VGFyZ2V0KCk7Ci0JCWlmKG9sZEJhc2UgIT0gbnVsbCkgewotCQkJb2xkQmFzZS5lQWRhcHRlcnMoKS5yZW1vdmUoYmFzZUxpc3RlbmVyKTsKLQkJfQotCQkKLQkJaWYgKCFiYXNlQWN0LmVBZGFwdGVycygpLmNvbnRhaW5zKGJhc2VMaXN0ZW5lcikpIHsKLQkJCWJhc2VBY3QuZUFkYXB0ZXJzKCkuYWRkKGJhc2VMaXN0ZW5lcik7Ci0JCX0KLQotCQlPYmplY3QgaXAgPSBhZGFwdGVyRmFjdG9yeS5hZGFwdChiYXNlQWN0LCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQlpZihpcCBpbnN0YW5jZW9mIEJTQWN0aXZpdHlJdGVtUHJvdmlkZXIpIHsKLQkJCUJTQWN0aXZpdHlJdGVtUHJvdmlkZXIgYWRhcHRlciA9IChCU0FjdGl2aXR5SXRlbVByb3ZpZGVyKSBpcDsKLQkJCWFkYXB0ZXIubGlzdGVuVG9CYXNlQWN0aXZpdHkoKTsKLQkJfQotCQllbHNlIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigpOwotCQl9Ci0JCXJldHVybiBiYXNlQWN0OwotCX0KLQotCXByb3RlY3RlZCBDb2xsZWN0aW9uIGFkZEluaGVyaXRlZChPYmplY3Qgb2JqZWN0LCBMaXN0IG15Q2hpbGRyZW4pIHsKLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQlBY3Rpdml0eSBhY3QgPSAoQWN0aXZpdHkpIG9iamVjdDsKLQkJCUFjdGl2aXR5IGJhc2VBY3QgPSBsaXN0ZW5Ub0Jhc2VBY3Rpdml0eSgpOwotCQkJaWYgKGJhc2VBY3QgIT0gbnVsbCkgewotCQkJCVZhcmlhYmlsaXR5VHlwZSBleHRlbmRUeXBlID0gYWN0LmdldFZhcmlhYmlsaXR5VHlwZSgpOwotCQkJCWlmIChleHRlbmRUeXBlID09IFZhcmlhYmlsaXR5VHlwZS5MT0NBTF9SRVBMQUNFTUVOVCkgewotCQkJCQlyZXR1cm4gbXlDaGlsZHJlbjsKLQkJCQl9IGVsc2UgaWYgKGV4dGVuZFR5cGUgPT0gVmFyaWFiaWxpdHlUeXBlLkxPQ0FMX0NPTlRSSUJVVElPTgotCQkJCQkJfHwgZXh0ZW5kVHlwZSA9PSBWYXJpYWJpbGl0eVR5cGUuRVhURU5EUykgewotCQkJCQlCU0FjdGl2aXR5SXRlbVByb3ZpZGVyIGFkYXB0ZXIgPSAoQlNBY3Rpdml0eUl0ZW1Qcm92aWRlcikgZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCkKLQkJCQkJCS5hZGFwdChiYXNlQWN0LCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkJCQlMaXN0IGFsbENoaWxkcmVuOwkJCQkJCi0JCQkJCWJvb2xlYW4gb2xkUm9sbGVkVXAgPSBhZGFwdGVyLmlzUm9sbGVkVXAoKTsKLQkJCQkJdHJ5IHsKLQkJCQkJCWlmKG9sZFJvbGxlZFVwKSB7Ci0JCQkJCQkJYWRhcHRlci5iYXNpY1NldFJvbGxlZFVwKGZhbHNlKTsKLQkJCQkJCX0KLQkJCQkJCWFsbENoaWxkcmVuID0gd3JhcEluaGVyaXRlZChhY3QsIGFkYXB0ZXIuZ2V0Q2hpbGRyZW4oYmFzZUFjdCkpOwotCQkJCQl9Ci0JCQkJCWZpbmFsbHkgewotCQkJCQkJaWYob2xkUm9sbGVkVXApIHsKLQkJCQkJCQlhZGFwdGVyLmJhc2ljU2V0Um9sbGVkVXAodHJ1ZSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLS8vCQkJCQkvLyBnbyB0aHJ1IG93biBjaGlsZHJlbiBsaXN0IGFuZCBpbnNlcnQgaXQgdG8gdGhlIGNvbWJpbmVkCi0vLwkJCQkJLy8gY2hpbGQgbGlzdCBhdCB0aGUgcmlnaHQgcGxhY2UuCi0vLwkJCQkJLy8KLS8vCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBteUNoaWxkcmVuLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotLy8JCQkJCQlCcmVha2Rvd25FbGVtZW50IGVsZW1lbnQgPSAoQnJlYWtkb3duRWxlbWVudCkgaXRlcgotLy8JCQkJCQkJCS5uZXh0KCk7Ci0vLwkJCQkJCVRuZ1V0aWwuYWRkVG8oYWxsQ2hpbGRyZW4sIGVsZW1lbnQsIG9iamVjdCwgVG5nVXRpbAotLy8JCQkJCQkJCS5nZXRCZXN0QWRhcHRlckZhY3RvcnkoYWRhcHRlckZhY3RvcnkpKTsKLS8vCQkJCQl9Ci0JCQkJCWlmKGFsbENoaWxkcmVuLmlzRW1wdHkoKSkgewotCQkJCQkJcmV0dXJuIG15Q2hpbGRyZW47Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQlUbmdVdGlsLmFkZEFsbFRvKGFsbENoaWxkcmVuLCBteUNoaWxkcmVuKTsKLQkJCQkJCXJldHVybiBhbGxDaGlsZHJlbjsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbXlDaGlsZHJlbjsKLQl9Ci0KLQkvKioKLQkgKiBDaGVja3MgaWYgdGhlcmUgaXMgbm8gZGVzY3JpcHRvciBpbiA8Y29kZT5jaGlsZHJlbjwvY29kZT4gcmVmZXJyaW5nIHRvCi0JICogdGhlIHNhbWUgb2JqZWN0IGFzIHRoZSBzcGVjaWZpZWQgZGVzY3JpcHRvciA8Y29kZT5jaGlsZDwvY29kZT4gZG9lcy4KLQkgKiAKLQkgKiBAcGFyYW0gY2hpbGRyZW4KLQkgKiBAcGFyYW0gY2hpbGQKLQkgKiBAcmV0dXJuIHRydWUgaWYgbm8gZGVzY3JpcHRvciBpcyBmb3VuZCBpbiB0aGUgY2hpbGRyZW4gbGlzdCB0aGF0IHJlZmVycwotCSAqICAgICAgICAgdG8gdGhlIHNhbWUgb2JqZWN0IGFzIHRoZSBzcGVjaWZpZWQgY2hpbGQgZG9lcywgZmFsc2Ugb3RoZXJ3aXNlLgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzTmV3RGVzY3JpcHRvcihMaXN0IGNoaWxkcmVuLCBPYmplY3QgY2hpbGQpIHsKLQkJcmV0dXJuIGZpbmREZXNjcmlwdG9yKGNoaWxkcmVuLCBjaGlsZCkgPT0gbnVsbDsKLQl9Ci0JCi0JcHJvdGVjdGVkIE9iamVjdCBmaW5kRGVzY3JpcHRvcihMaXN0IGNoaWxkcmVuLCBPYmplY3QgY2hpbGQpIHsKLQkJT2JqZWN0IG9iaiA9IGdldE9iamVjdCgoRGVzY3JpcHRvcikgVG5nVXRpbC51bndyYXAoY2hpbGQpKTsKLQkJaWYgKG9iaiA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWZvciAoaW50IGkgPSBjaGlsZHJlbi5zaXplKCkgLSAxOyBpID4gLTE7IGktLSkgewotCQkJT2JqZWN0IG8gPSBjaGlsZHJlbi5nZXQoaSk7Ci0JCQlpZiAob2JqID09IGdldE9iamVjdCgoRGVzY3JpcHRvcikgVG5nVXRpbC51bndyYXAobykpKQotCQkJCXJldHVybiBvOwotCQl9Ci0JCXJldHVybiBudWxsOwotCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNyZWF0ZUNoaWxkQ29tbWFuZC5IZWxwZXIjZ2V0Q3JlYXRlQ2hpbGRJbWFnZShqYXZhLmxhbmcuT2JqZWN0LAotCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLk9iamVjdCwgamF2YS51dGlsLkNvbGxlY3Rpb24pCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRDcmVhdGVDaGlsZEltYWdlKE9iamVjdCBvd25lciwgT2JqZWN0IGZlYXR1cmUsCi0JCQlPYmplY3QgY2hpbGQsIENvbGxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCS8vIHJldHVybgotCQkvLyBUbmdFZGl0UGx1Z2luLklOU1RBTkNFLmdldEltYWdlKCJmdWxsL2N0b29sMTYvQ3JlYXRlQWN0aXZpdHlfYnJlYWtkb3duRWxlbWVudHNfQWN0aXZpdHkiKTsKLQkJcmV0dXJuIGdldEltYWdlKGNoaWxkKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjY3JlYXRlUmVtb3ZlQ29tbWFuZChvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbiwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0LAotCSAqICAgICAgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZSwgamF2YS51dGlsLkNvbGxlY3Rpb24pCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgY3JlYXRlUmVtb3ZlQ29tbWFuZChFZGl0aW5nRG9tYWluIGRvbWFpbiwgRU9iamVjdCBvd25lciwKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJcmV0dXJuIHN1cGVyLmNyZWF0ZVJlbW92ZUNvbW1hbmQoZG9tYWluLCBvd25lciwgZmVhdHVyZSwgY29sbGVjdGlvbik7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnRuZy5wcm9jZXNzLklCU0l0ZW1Qcm92aWRlciNnZXRJdGVtUHJvdmlkZXIob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpCi0JICovCi0JcHVibGljIElCU0l0ZW1Qcm92aWRlciBnZXRJdGVtUHJvdmlkZXIoRU9iamVjdCBlT2JqKSB7Ci0JCXJldHVybiAoSUJTSXRlbVByb3ZpZGVyKSBUbmdVdGlsCi0JCQkJLmdldEFkYXB0ZXIoZU9iaiwgSUJTSXRlbVByb3ZpZGVyLmNsYXNzKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRQYXJlbnQoT2JqZWN0IG9iamVjdCkgewotCQlwYXJlbnQgPSBvYmplY3Q7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldFBhcmVudChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBvYmplY3QpIHsKLQkJaWYocGFyZW50ID09IG51bGwpIHsKLQkJCWlmKHRhcmdldCBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJcmV0dXJuICgoQWN0aXZpdHkpdGFyZ2V0KS5nZXRTdXBlckFjdGl2aXRpZXMoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcGFyZW50OwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGxpc3Qgb2YgY2hpbGRyZW4gdGhhdCBoYWQgYmVlbiBhZmZlY3RlZCBhZnRlciBhIGFuIEFERCwgUkVNT1ZFLAotCSAqIG9yIE1PVkUgb3BlcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBMaXN0IGdldEFmZmVjdGVkQ2hpbGRyZW4oTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQlyZXR1cm4gUHJvY2Vzc1V0aWwuZ2V0QWZmZWN0ZWRFbGVtZW50cyhub3RpZmljYXRpb24sIGNoaWxkRmlsdGVyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiByZWZyZXNoQ2hpbGRyZW5EYXRhKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24sCi0JCQlMaXN0IGFmZmVjdGVkQ2hpbGRyZW4pIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGRvUmVmcmVzaENoaWxkcmVuKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24sCi0JCQlMaXN0IGFmZmVjdGVkQ2hpbGRyZW4pIHsKLQkJcmVmcmVzaENoaWxkcmVuRGF0YShub3RpZmljYXRpb24sIGFmZmVjdGVkQ2hpbGRyZW4pOwotCi0JCVByb2Nlc3MgdG9wQWN0ID0gKFByb2Nlc3MpIGdldFRvcEl0ZW0oKTsKLQkJQWRhcHRlckZhY3Rvcnkgcm9vdEFkYXB0ZXJGYWN0b3J5ID0gZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCk7Ci0JCVByb2Nlc3NVdGlsLnJlZnJlc2hWaWV3ZXIocm9vdEFkYXB0ZXJGYWN0b3J5LCB0b3BBY3QpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hDaGlsZHJlbihmaW5hbCBOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uLAotCQkJZmluYWwgTGlzdCBuZXdPck9sZENoaWxkcmVuKSB7Ci0JCWlmICghbmV3T3JPbGRDaGlsZHJlbi5pc0VtcHR5KCkpIHsKLQkJCVJ1bm5hYmxlIHJ1bm5hYmxlID0gbmV3IFJ1bm5hYmxlKCkgewotCi0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQlkb1JlZnJlc2hDaGlsZHJlbihub3RpZmljYXRpb24sIG5ld09yT2xkQ2hpbGRyZW4pOwotCQkJCX0KLQotCQkJfTsKLQkJCVVzZXJJbnRlcmFjdGlvbkhlbHBlci5nZXRVSUhlbHBlcigpLnJ1blNhZmVseShydW5uYWJsZSwgZmFsc2UpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaEFmZmVjdGVkVmlld2VycygpIHsKLQkJUnVubmFibGUgcnVubmFibGUgPSBuZXcgUnVubmFibGUoKSB7Ci0KLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlkb1JlZnJlc2hBZmZlY3RlZFZpZXdlcnMoKTsKLQkJCX0KLQotCQl9OwotCQlVc2VySW50ZXJhY3Rpb25IZWxwZXIuZ2V0VUlIZWxwZXIoKS5ydW5TYWZlbHkocnVubmFibGUsIGZhbHNlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBkb1JlZnJlc2hBZmZlY3RlZFZpZXdlcnMoKSB7Ci0KLQl9Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gaGFuZGxlUHJlZGVjZXNzb3JMaXN0Q2hhbmdlKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJcmV0dXJuIFRuZ1V0aWwuaGFuZGxlUHJlZGVjZXNzb3JMaXN0Q2hhbmdlKHRoaXMsIG5vdGlmaWNhdGlvbik7Ci0JfQotCQotCXByb3RlY3RlZCBib29sZWFuIGhhbmRsZVJlcGxhY2VCcmVha2Rvd25FbGVtZW50KE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJaWYobm90aWZpY2F0aW9uLmdldEV2ZW50VHlwZSgpID09IE5vdGlmaWNhdGlvbi5TRVQgJiYgbm90aWZpY2F0aW9uLmdldE5ld1ZhbHVlKCkgIT0gbm90aWZpY2F0aW9uLmdldE9sZFZhbHVlKCkpIHsKLQkJCWlmKG5vdGlmaWNhdGlvbi5nZXROZXdWYWx1ZSgpIGluc3RhbmNlb2YgV29ya0JyZWFrZG93bkVsZW1lbnQpIHsKLQkJCQlXb3JrQnJlYWtkb3duRWxlbWVudCBlID0gKFdvcmtCcmVha2Rvd25FbGVtZW50KSBub3RpZmljYXRpb24uZ2V0TmV3VmFsdWUoKTsKLQkJCQlpZighQXNzb2NpYXRpb25IZWxwZXIuZ2V0TGlua1RvU3VjY2Vzc29yKGUpLmlzRW1wdHkoKSkgewotCQkJCQlQcm9jZXNzVXRpbC5yZWZyZXNoUHJlZGVjY2Vzc29yTGlzdHMoYWRhcHRlckZhY3RvcnksIChQcm9jZXNzKSBnZXRUb3BJdGVtKCkpOwotCQkJCX0KLQkJCX0KLQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLAotCQkJCQlnZXRUYXJnZXQoKSwgdHJ1ZSwgZmFsc2UpKTsKLQkJCXJlZnJlc2hBZmZlY3RlZFZpZXdlcnMoKTsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyI25vdGlmeUNoYW5nZWQob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCi0JCWlmIChoYW5kbGVQcmVkZWNlc3Nvckxpc3RDaGFuZ2Uobm90aWZpY2F0aW9uKSkKLQkJCXJldHVybjsKLQotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoQWN0aXZpdHkuY2xhc3MpKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9fQlJFQUtET1dOX0VMRU1FTlRTOgotCQkJaWYoaGFuZGxlUmVwbGFjZUJyZWFrZG93bkVsZW1lbnQobm90aWZpY2F0aW9uKSkgewotCQkJCXJldHVybjsKLQkJCX0KLQkJCUxpc3QgbmV3T3JPbGRDaGlsZHJlbiA9IGdldEFmZmVjdGVkQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQkJCWlmICghbmV3T3JPbGRDaGlsZHJlbi5pc0VtcHR5KCkpIHsKLQkJCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRFdmVudFR5cGUoKSkgewotCQkJCWNhc2UgTm90aWZpY2F0aW9uLkFERDoKLQkJCQljYXNlIE5vdGlmaWNhdGlvbi5BRERfTUFOWToKLQkJCQkJY3JlYXRlT3JNb3ZlUGFja2FnZUZvcihuZXdPck9sZENoaWxkcmVuKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCi0JCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sCi0JCQkJCQlub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKSwgdHJ1ZSwgZmFsc2UpKTsKLQotCQkJCS8vIHJlZnJlc2hDaGlsZHJlbihub3RpZmljYXRpb24sIG5ld09yT2xkQ2hpbGRyZW4pOwotCi0JCQkJcmVmcmVzaEFmZmVjdGVkVmlld2VycygpOwotCQkJfQotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX1NVUFBSRVNTRUQ6Ci0JCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uCi0JCQkJCS5nZXROb3RpZmllcigpLCB0cnVlLCB0cnVlKSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9fVkFSSUFCSUxJVFlfVFlQRToKLQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UOgotCi0JCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uCi0JCQkJCS5nZXROb3RpZmllcigpLCB0cnVlLCB0cnVlKSk7Ci0KLQkJCS8vIFByb2Nlc3NVdGlsLnJlZnJlc2hWaWV3ZXIoZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIChQcm9jZXNzKQotCQkJLy8gZ2V0VG9wSXRlbSgpKTsKLQotCQkJcmVmcmVzaEFmZmVjdGVkVmlld2VycygpOwotCi0JCQlyZXR1cm47Ci0JCX0KLQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIG5ld09yT2xkQ2hpbGRyZW4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVPck1vdmVQYWNrYWdlRm9yKExpc3Q8Pz4gbmV3Q2hpbGRyZW4pIHsKLQkJUHJvY2Vzc1BhY2thZ2UgcGtnID0gKFByb2Nlc3NQYWNrYWdlKSAoKEVPYmplY3QpIHRhcmdldCkuZUNvbnRhaW5lcigpOwotCQlpZihwa2cgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWZvciAoT2JqZWN0IGVsZW1lbnQgOiBuZXdDaGlsZHJlbikgewotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCUFjdGl2aXR5IGFjdCA9IChBY3Rpdml0eSkgZWxlbWVudDsKLQkJCQlpZiAoYWN0LmVDb250YWluZXIoKSA9PSBudWxsKSB7Ci0JCQkJCS8vIGNyZWF0ZSBuZXcgUHJvY2Vzc1BhY2thZ2UgZm9yIHRoZSBhY3Rpdml0eQotCQkJCQkvLwotCQkJCQlQcm9jZXNzUGFja2FnZSBuZXdQa2cgPSBVbWFGYWN0b3J5LmVJTlNUQU5DRQotCQkJCQkJCS5jcmVhdGVQcm9jZXNzUGFja2FnZSgpOwotCQkJCQluZXdQa2cuc2V0TmFtZShhY3QuZ2V0TmFtZSgpKTsKLQkJCQkJcGtnLmdldENoaWxkUGFja2FnZXMoKS5hZGQobmV3UGtnKTsKLQkJCQkJbmV3UGtnLmdldFByb2Nlc3NFbGVtZW50cygpLmFkZChhY3QpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCS8vIENoZWNrIGlmIHRoZSBhY3Rpdml0eSdzIFByb2Nlc3NQYWNrYWdlIGlzIGF0IHRoZSByaWdodAotCQkJCQkvLyBwbGFjZS4KLQkJCQkJLy8gSWYgbm90LCBtb3ZlIGl0IHRvIHRoZSByaWdodCBQcm9jZXNzQ29tcG9uZW50LgotCQkJCQkvLwotCQkJCQlQcm9jZXNzUGFja2FnZSBvbGRQa2cgPSAoUHJvY2Vzc1BhY2thZ2UpIGFjdC5lQ29udGFpbmVyKCk7Ci0JCQkJCWlmIChvbGRQa2cuZUNvbnRhaW5lcigpICE9IHBrZykgewotCQkJCQkJcGtnLmdldENoaWxkUGFja2FnZXMoKS5hZGQob2xkUGtnKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0gZWxzZSBpZihlbGVtZW50IGluc3RhbmNlb2YgUHJvY2Vzc0VsZW1lbnQpIHsKLQkJCQlwa2cuZ2V0UHJvY2Vzc0VsZW1lbnRzKCkuYWRkKChQcm9jZXNzRWxlbWVudCkgZWxlbWVudCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGdldEFsbEJyZWFrZG93bkVsZW1lbnRzKFNldCBzZXQsIEJyZWFrZG93bkVsZW1lbnQgZSkgewotCQlib29sZWFuIHJldCA9IHNldC5hZGQoZSk7Ci0JCWlmIChyZXQgJiYgKGUgaW5zdGFuY2VvZiBBY3Rpdml0eSkpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9ICgoQWN0aXZpdHkpIGUpLmdldEJyZWFrZG93bkVsZW1lbnRzKCkKLQkJCQkJLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCUJyZWFrZG93bkVsZW1lbnQgZWxlbWVudCA9IChCcmVha2Rvd25FbGVtZW50KSBpdGVyLm5leHQoKTsKLQkJCQlnZXRBbGxCcmVha2Rvd25FbGVtZW50cyhzZXQsIGVsZW1lbnQpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVmcmVzaCB0aGUgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgcHJlZGVjZXNzb3IgSURzIGluIHRoZSB2aWV3ZXIKLQkgKiAKLQkgKiBAcGFyYW0gYWZmZWN0ZWRCcmVha2Rvd25FbGVtZW50cwotCSAqLwotCXByaXZhdGUgdm9pZCByZWZyZXNoUHJlZGVjZXNzb3JzKE5vdGlmaWNhdGlvbiBtc2csCi0JCQlMaXN0IGFmZmVjdGVkQnJlYWtkb3duRWxlbWVudHMpIHsKLQotCQlTZXQgcmVmcmVzaExpc3QgPSBuZXcgSGFzaFNldCgpOwotCQlTZXQgYWxsQnJlYWtkb3duRWxlbWVudHMgPSBuZXcgSGFzaFNldCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBhZmZlY3RlZEJyZWFrZG93bkVsZW1lbnRzLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkuaGFzTmV4dCgpOykgewotCQkJQnJlYWtkb3duRWxlbWVudCBlID0gKEJyZWFrZG93bkVsZW1lbnQpIGl0ZXIubmV4dCgpOwotCQkJaWYgKG1zZy5nZXRFdmVudFR5cGUoKSA9PSBOb3RpZmljYXRpb24uUkVNT1ZFCi0JCQkJCXx8IG1zZy5nZXRFdmVudFR5cGUoKSA9PSBOb3RpZmljYXRpb24uUkVNT1ZFX01BTlkpIHsKLQkJCQlzZXRQYXJlbnRGb3IoZSwgbnVsbCk7Ci0JCQl9Ci0JCQlnZXRBbGxCcmVha2Rvd25FbGVtZW50cyhhbGxCcmVha2Rvd25FbGVtZW50cywgZSk7Ci0JCX0KLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJCU0FjdGl2aXR5SXRlbVByb3ZpZGVyLnJlZnJlc2hQcmVkZWNlc3NvcnMoKToKLQkJLy8gYWxsQnJlYWtkb3duRWxlbWVudHM9IithbGxCcmVha2Rvd25FbGVtZW50cyk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBhbGxCcmVha2Rvd25FbGVtZW50cy5pdGVyYXRvcigpOyBpdGVyYXRvcgotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQlCcmVha2Rvd25FbGVtZW50IGVsZW1lbnQgPSAoQnJlYWtkb3duRWxlbWVudCkgaXRlcmF0b3IubmV4dCgpOwotCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvcjEgPSBBc3NvY2lhdGlvbkhlbHBlci5nZXRMaW5rVG9TdWNjZXNzb3IoCi0JCQkJCWVsZW1lbnQpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yMS5oYXNOZXh0KCk7KSB7Ci0JCQkJV29ya09yZGVyIHdvcmtPcmRlciA9IChXb3JrT3JkZXIpIGl0ZXJhdG9yMS5uZXh0KCk7Ci0JCQkJQnJlYWtkb3duRWxlbWVudCBzdWNjID0gQXNzb2NpYXRpb25IZWxwZXIKLQkJCQkJCS5nZXRTdWNjZXNzb3Iod29ya09yZGVyKTsKLQkJCQlpZiAoIWFsbEJyZWFrZG93bkVsZW1lbnRzLmNvbnRhaW5zKHN1Y2MpKSB7Ci0JCQkJCXJlZnJlc2hMaXN0LmFkZChzdWNjKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkJTQWN0aXZpdHlJdGVtUHJvdmlkZXIucmVmcmVzaFByZWRlY2Vzc29ycygpOgotCQkvLyByZWZyZXNoTGlzdD0iICsgcmVmcmVzaExpc3QpOwotCi0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHJlZnJlc2hMaXN0Lml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGNoaWxkID0gaXRlci5uZXh0KCk7Ci0JCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG1zZywgY2hpbGQsIGZhbHNlLCB0cnVlKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gYWN0aXZpdHkKLQkgKi8KLQlwcml2YXRlIHZvaWQgY3JlYXRlUGFja2FnZUZvcihBY3Rpdml0eSBhY3Rpdml0eSwgRU9iamVjdCBwYXJlbnRBY3Rpdml0eSkgewotCQlQcm9jZXNzUGFja2FnZSBwYXJlbnQgPSAoUHJvY2Vzc1BhY2thZ2UpIHBhcmVudEFjdGl2aXR5LmVDb250YWluZXIoKTsKLQkJUHJvY2Vzc1BhY2thZ2UgbmV3UGtnID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUHJvY2Vzc1BhY2thZ2UoKTsKLQkJbmV3UGtnLnNldE5hbWUoYWN0aXZpdHkuZ2V0TmFtZSgpKTsKLQkJcGFyZW50LmdldENoaWxkUGFja2FnZXMoKS5hZGQobmV3UGtnKTsKLQkJQXJyYXlMaXN0IGJyZWFrZG93bkVsZW1lbnRzID0gbmV3IEFycmF5TGlzdCgpOwotCQlicmVha2Rvd25FbGVtZW50cy5hZGQoYWN0aXZpdHkpOwotCQlicmVha2Rvd25FbGVtZW50cy5hZGRBbGwoYWN0aXZpdHkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKSk7Ci0JCW5ld1BrZy5nZXRQcm9jZXNzRWxlbWVudHMoKS5hZGRBbGwoYnJlYWtkb3duRWxlbWVudHMpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0Q29sdW1uTmFtZShpbnQgY29sdW1uSW5kZXgpIHsKLQkJQWRhcHRlckZhY3Rvcnkgcm9vdEFkYXB0ZXJGYWN0b3J5ID0gZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCk7Ci0JCWlmIChyb290QWRhcHRlckZhY3RvcnkgaW5zdGFuY2VvZiBJQ29sdW1uQXdhcmUpIHsKLQkJCU1hcCBjb2x1bW5JbmRleFRvTmFtZU1hcCA9ICgoSUNvbHVtbkF3YXJlKSByb290QWRhcHRlckZhY3RvcnkpCi0JCQkJCS5nZXRDb2x1bW5JbmRleFRvTmFtZU1hcCgpOwotCQkJaWYgKGNvbHVtbkluZGV4VG9OYW1lTWFwICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gKFN0cmluZykgY29sdW1uSW5kZXhUb05hbWVNYXAuZ2V0KG5ldyBJbnRlZ2VyKAotCQkJCQkJY29sdW1uSW5kZXgpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUYWJsZUl0ZW1MYWJlbFByb3ZpZGVyI2dldENvbHVtbkltYWdlKGphdmEubGFuZy5PYmplY3QsCi0JICogICAgICBpbnQpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRDb2x1bW5JbWFnZShPYmplY3Qgb2JqZWN0LCBpbnQgY29sdW1uSW5kZXgpIHsKLQkJU3RyaW5nIGNvbE5hbWUgPSBnZXRDb2x1bW5OYW1lKGNvbHVtbkluZGV4KTsKLQkJcmV0dXJuIFRuZ1V0aWwuZ2V0Q29sdW1uSW1hZ2Uob2JqZWN0LCBjb2xOYW1lKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUYWJsZUl0ZW1MYWJlbFByb3ZpZGVyI2dldENvbHVtblRleHQoamF2YS5sYW5nLk9iamVjdCwKLQkgKiAgICAgIGludCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENvbHVtblRleHQoT2JqZWN0IG9iamVjdCwgaW50IGNvbHVtbkluZGV4KSB7Ci0JCVN0cmluZyBjb2xOYW1lID0gZ2V0Q29sdW1uTmFtZShjb2x1bW5JbmRleCk7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGUob2JqZWN0LCBjb2xOYW1lKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0VGV4dChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBUbmdVdGlsLmdldExhYmVsKG9iamVjdCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnRuZy5wcm9jZXNzLklCU0l0ZW1Qcm92aWRlciNzZXRUb3BJdGVtKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgc2V0VG9wSXRlbShPYmplY3QgdG9wKSB7Ci0JCXRvcEl0ZW0gPSB0b3A7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLklCU0l0ZW1Qcm92aWRlciNpc1JvbGxlZFVwKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1JvbGxlZFVwKCkgewotCQlyZXR1cm4gcm9sbGVkVXA7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLklCU0l0ZW1Qcm92aWRlciNzZXRSb2xsZWRVcChib29sZWFuKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJvbGxlZFVwKGJvb2xlYW4gYikgewotCQlyb2xsZWRVcCA9IGI7Ci0JCWlmICghcm9sbGVkVXApIHsKLQkJCS8vIHVzZXIgcm9sbCBkb3duIHRoaXMgYWN0aXZpdHksIHNldCByb2xsZWRVcCBmbGFnIG9mIGFsbCBpdHMKLQkJCS8vIG9mZnN0cmluZyB0byBmYWxzZQotCQkJLy8KLQkJCUl0ZXJhdG9yIGl0ZXIgPSBuZXcgQWJzdHJhY3RUcmVlSXRlcmF0b3IodGFyZ2V0LCBmYWxzZSkgewotCi0JCQkJLyoqCi0JCQkJICogQ29tbWVudCBmb3IgPGNvZGU+c2VyaWFsVmVyc2lvblVJRDwvY29kZT4KLQkJCQkgKi8KLQkJCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtNzg0MDY4NzI2NDc1MzY0MDI1MEw7Ci0KLQkJCQlwcm90ZWN0ZWQgSXRlcmF0b3IgZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQkJCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIgYWRhcHRlciA9IChJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIpIGFkYXB0ZXJGYWN0b3J5Ci0JCQkJCQkJLmFkYXB0KG9iamVjdCwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCQkJcmV0dXJuIGFkYXB0ZXIuZ2V0Q2hpbGRyZW4ob2JqZWN0KS5pdGVyYXRvcigpOwotCQkJCX0KLQotCQkJfTsKLQkJCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJCU9iamVjdCBjaGlsZCA9IChPYmplY3QpIGl0ZXIubmV4dCgpOwotCQkJCU9iamVjdCBhZGFwdGVyID0gYWRhcHRlckZhY3RvcnkuYWRhcHQoY2hpbGQsCi0JCQkJCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkJCWlmIChhZGFwdGVyIGluc3RhbmNlb2YgSUJTSXRlbVByb3ZpZGVyKSB7Ci0JCQkJCSgoSUJTSXRlbVByb3ZpZGVyKSBhZGFwdGVyKS5zZXRSb2xsZWRVcChmYWxzZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIEdyYXBoaWNhbERhdGEgZ2V0R3JhcGhpY2FsRGF0YSgpIHsKLQkJcmV0dXJuIGdyYXBoaWNhbERhdGE7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0R3JhcGhpY2FsRGF0YShHcmFwaGljYWxEYXRhIGRhdGEpIHsKLQkJZ3JhcGhpY2FsRGF0YSA9IGRhdGE7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLklCU0l0ZW1Qcm92aWRlciNnZXRBdHRyaWJ1dGUoamF2YS5sYW5nLk9iamVjdCwKLQkgKiAgICAgIGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRBdHRyaWJ1dGUoT2JqZWN0IG9iamVjdCwgU3RyaW5nIHByb3BlcnR5KSB7Ci0JCXJldHVybiBQcm9jZXNzVXRpbC5nZXRBdHRyaWJ1dGUob2JqZWN0LCBwcm9wZXJ0eSwgdGhpcyk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLklCU0l0ZW1Qcm92aWRlciNzZXRBdHRyaWJ1dGUoamF2YS5sYW5nLk9iamVjdCwKLQkgKiAgICAgIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgc2V0QXR0cmlidXRlKE9iamVjdCBvYmplY3QsIFN0cmluZyBwcm9wLCBTdHJpbmcgdHh0KSB7Ci0JCUFjdGl2aXR5IGUgPSAoQWN0aXZpdHkpIG9iamVjdDsKLQkJUHJvY2Vzc1V0aWwuc2V0QXR0cmlidXRlKGUsIHByb3AsIHR4dCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2NyZWF0ZUNyZWF0ZUNoaWxkQ29tbWFuZChvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbiwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0LAotCSAqICAgICAgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZSwgamF2YS5sYW5nLk9iamVjdCwgaW50LAotCSAqICAgICAgamF2YS51dGlsLkNvbGxlY3Rpb24pCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgY3JlYXRlQ3JlYXRlQ2hpbGRDb21tYW5kKEVkaXRpbmdEb21haW4gZG9tYWluLAotCQkJRU9iamVjdCBvd25lciwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIE9iamVjdCB2YWx1ZSwgaW50IGluZGV4LAotCQkJQ29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCWlmICh2YWx1ZSBpbnN0YW5jZW9mIEl0ZXJhdGlvbikgewotCQkJKChJdGVyYXRpb24pIHZhbHVlKS5zZXRJc1JlcGVhdGFibGUoQm9vbGVhbi5UUlVFKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuY3JlYXRlQ3JlYXRlQ2hpbGRDb21tYW5kKGRvbWFpbiwgb3duZXIsIGZlYXR1cmUsIHZhbHVlLAotCQkJCWluZGV4LCBjb2xsZWN0aW9uKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuSUJTSXRlbVByb3ZpZGVyI2dldExpc3RlbmVycygpCi0JICovCi0JcHVibGljIExpc3QgZ2V0TGlzdGVuZXJzKCkgewotCQlpZiAoY2hhbmdlTm90aWZpZXIgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdCgoTGlzdCkgY2hhbmdlTm90aWZpZXIpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5JQlNJdGVtUHJvdmlkZXIjZ2V0UHJlZGVjZXNzb3JzKCkKLQkgKi8KLQlwdWJsaWMgUHJlZGVjZXNzb3JMaXN0IGdldFByZWRlY2Vzc29ycygpIHsKLQkJaWYgKHByZWRlY2Vzc29ycyA9PSBudWxsKSB7Ci0JCQlwcmVkZWNlc3NvcnMgPSBuZXcgUHJlZGVjZXNzb3JMaXN0KFRuZ1V0aWwKLQkJCQkJLmdldEJlc3RBZGFwdGVyRmFjdG9yeShhZGFwdGVyRmFjdG9yeSksIHRhcmdldCk7Ci0JCX0KLQkJcmV0dXJuIHByZWRlY2Vzc29yczsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0ZpcnN0RWxlbWVudChPYmplY3Qgb2JqKSB7Ci0JCXJldHVybiBQcm9jZXNzVXRpbC5pc0ZpcnN0RWxlbWVudChnZXRSb290QWRhcHRlckZhY3RvcnkoKSwgdGhpcywgb2JqKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0xhc3RFbGVtZW50KE9iamVjdCBvYmopIHsKLQkJcmV0dXJuIFByb2Nlc3NVdGlsLmlzTGFzdEVsZW1lbnQoZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIHRoaXMsIG9iaik7Ci0JfQotCi0JcHVibGljIHZvaWQgbW92ZVVwKE9iamVjdCBvYmosIElBY3Rpb25NYW5hZ2VyIGFjdGlvbk1ncikgewotCQlPYmplY3QgcGFyZW50ID0gdGhpcy5nZXRQYXJlbnQob2JqKTsKLQkJaWYgKChwYXJlbnQgIT0gbnVsbCkgJiYgKHBhcmVudCBpbnN0YW5jZW9mIEFjdGl2aXR5KSkgewotCQkJVG5nVXRpbC5tb3ZlVXAoKEFjdGl2aXR5KSBwYXJlbnQsIG9iaiwgZ2V0RUNsYXNzZXMoKSwgYWN0aW9uTWdyKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIG1vdmVEb3duKE9iamVjdCBvYmosIElBY3Rpb25NYW5hZ2VyIGFjdGlvbk1ncikgewotCQlPYmplY3QgcGFyZW50ID0gdGhpcy5nZXRQYXJlbnQob2JqKTsKLQkJaWYgKChwYXJlbnQgIT0gbnVsbCkgJiYgKHBhcmVudCBpbnN0YW5jZW9mIEFjdGl2aXR5KSkgewotCQkJVG5nVXRpbC5tb3ZlRG93bigoQWN0aXZpdHkpIHBhcmVudCwgb2JqLCBnZXRFQ2xhc3NlcygpLCBhY3Rpb25NZ3IpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIENvbW1hbmQgY3JlYXRlQWRkQ29tbWFuZChFZGl0aW5nRG9tYWluIGRvbWFpbiwgRU9iamVjdCBvd25lciwKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBDb2xsZWN0aW9uIGNvbGxlY3Rpb24sIGludCBpbmRleCkgewotCQlyZXR1cm4gbmV3IEFjdGl2aXR5QWRkQ29tbWFuZCgoQWRkQ29tbWFuZCkgc3VwZXIuY3JlYXRlQWRkQ29tbWFuZCgKLQkJCQlkb21haW4sIG93bmVyLCBmZWF0dXJlLCBjb2xsZWN0aW9uLCBpbmRleCkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5BY3Rpdml0eUl0ZW1Qcm92aWRlciNnZXRJbWFnZShqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlPYmplY3QgaW1nID0gVG5nVXRpbC5nZXRJbWFnZShvYmplY3QpOwotCQlyZXR1cm4gaW1nICE9IG51bGwgPyBpbWcgOiBzdXBlci5nZXRJbWFnZShvYmplY3QpOwotCX0KLQotCXB1YmxpYyBJRmlsdGVyIGdldENoaWxkRmlsdGVyKCkgewotCQlyZXR1cm4gY2hpbGRGaWx0ZXI7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UmVmcmVzaEFsbElEc1JlcXVpcmVkKGJvb2xlYW4gYikgewotCQlyZWZyZXNoQWxsSURzUmVxdWlyZWQgPSBiOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzUmVmcmVzaEFsbElEc1JlcXVpcmVkKCkgewotCQlyZXR1cm4gcmVmcmVzaEFsbElEc1JlcXVpcmVkOwotCX0KLQotCXB1YmxpYyBJRmlsdGVyIGdldEZpbHRlcigpIHsKLQkJcmV0dXJuIHRoaXMuZmlsdGVyOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYWJsZSNzZXRGaWx0ZXIoY29tLmlibS5saWJyYXJ5LmVkaXQuSUZpbHRlcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGaWx0ZXIoSUZpbHRlciBmaWx0ZXIpIHsKLQkJdGhpcy5maWx0ZXIgPSBmaWx0ZXI7Ci0JCWlmKGZpbHRlciBpbnN0YW5jZW9mIElDb25maWd1cmF0b3IpIHsKLQkJCWNvbmZpZ3VyYXRvciA9IChJQ29uZmlndXJhdG9yKWZpbHRlcjsKLQkJfQotCQllbHNlIHsKLQkJCWNvbmZpZ3VyYXRvciA9IG51bGw7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LklDb25maWd1cmFibGUjc2V0TGFiZWwoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMYWJlbChTdHJpbmcgbGFiZWwpIHsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuSUJTSXRlbVByb3ZpZGVyI2NyZWF0ZURyb3BDb21tYW5kKGphdmEubGFuZy5PYmplY3QsCi0JICogICAgICBqYXZhLnV0aWwuTGlzdCkKLQkgKi8KLQlwdWJsaWMgSVJlc291cmNlQXdhcmVDb21tYW5kIGNyZWF0ZURyb3BDb21tYW5kKE9iamVjdCBvd25lciwKLQkJCUxpc3QgZHJvcEVsZW1lbnRzKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBiYXNpY1NldFJvbGxlZFVwKGJvb2xlYW4gYikgewotCQlyb2xsZWRVcCA9IGI7Ci0JfQotCQotCS8qKgotCSAqIEByZXR1cm4gdGhlIGVuYWJsZVZhcmlhYmlsaXR5SW5mbwotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRW5hYmxlVmFyaWFiaWxpdHlJbmZvKCkgewotCQlyZXR1cm4gZW5hYmxlVmFyaWFiaWxpdHlJbmZvOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBlbmFibGVWYXJpYWJpbGl0eUluZm8gdGhlIGVuYWJsZVZhcmlhYmlsaXR5SW5mbyB0byBzZXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFbmFibGVWYXJpYWJpbGl0eUluZm8oYm9vbGVhbiBlbmFibGVWYXJpYWJpbGl0eUluZm8pIHsKLQkJdGhpcy5lbmFibGVWYXJpYWJpbGl0eUluZm8gPSBlbmFibGVWYXJpYWJpbGl0eUluZm87Ci0JfQotCQotCXByaXZhdGUgY2xhc3MgTW92ZUNvbW1hbmRFeCBleHRlbmRzIE1vdmVDb21tYW5kIGltcGxlbWVudHMgSVJlc291cmNlQXdhcmVDb21tYW5kIHsKLQotCQlwcml2YXRlIFNldDxSZXNvdXJjZT4gbW9kaWZpZWRSZXNvdXJjZXM7Ci0KLQkJcHVibGljIE1vdmVDb21tYW5kRXgoRWRpdGluZ0RvbWFpbiBkb21haW4sIEVPYmplY3Qgb3duZXIsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBPYmplY3QgdmFsdWUsIGludCBpbmRleCkgewotCQkJc3VwZXIoZG9tYWluLCBvd25lciwgZmVhdHVyZSwgdmFsdWUsIGluZGV4KTsKLQkJfQkJCQkKLQkJCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgdm9pZCBkb0V4ZWN1dGUoKSB7Ci0JCQkvLyB0cmFuc2xhdGUgdmlldyBpbmRleCB0byBpbmRleCBpbiBicmVha2Rvd24gZWxlbWVudHMgbGlzdAotCQkJLy8KLQkJCUxpc3QgY2hpbGRyZW4gPSAoTGlzdCkgZ2V0Q2hpbGRyZW4oZ2V0VGFyZ2V0KCkpOwotCQkJT2JqZWN0IGNoaWxkID0gY2hpbGRyZW4uZ2V0KGluZGV4KTsKLQkJCWluZGV4ID0gb3duZXJMaXN0LmluZGV4T2YoY2hpbGQpOwotCQkJaWYoaW5kZXggIT0gLTEpIHsKLQkJCQlzdXBlci5kb0V4ZWN1dGUoKTsKLQkJCX0KLQkJCQotCQkJLy9UT0RPOiBtb3ZlIGluIGJldHdlZW4gZ3JlZW4gZWxlbWVudHMKLQkJfQotCi0JCXB1YmxpYyBDb2xsZWN0aW9uIGdldE1vZGlmaWVkUmVzb3VyY2VzKCkgewotCQkJaWYobW9kaWZpZWRSZXNvdXJjZXMgPT0gbnVsbCkgewotCQkJCVJlc291cmNlIHJlc291cmNlID0gb3duZXIuZVJlc291cmNlKCk7Ci0JCQkJaWYocmVzb3VyY2UgIT0gbnVsbCkgewotCQkJCQltb2RpZmllZFJlc291cmNlcyA9IENvbGxlY3Rpb25zLnNpbmdsZXRvbihyZXNvdXJjZSk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQltb2RpZmllZFJlc291cmNlcyA9IENvbGxlY3Rpb25zLkVNUFRZX1NFVDsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gbW9kaWZpZWRSZXNvdXJjZXM7Ci0JCX0KLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIENvbW1hbmQgY3JlYXRlTW92ZUNvbW1hbmQoRWRpdGluZ0RvbWFpbiBkb21haW4sIEVPYmplY3Qgb3duZXIsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBPYmplY3QgdmFsdWUsIGludCBpbmRleCkgewotCQlyZXR1cm4gbmV3IE1vdmVDb21tYW5kRXgoZG9tYWluLCBvd25lciwgZmVhdHVyZSwgdmFsdWUsIGluZGV4KTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL0JyZWFrZG93bkVsZW1lbnRJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9CcmVha2Rvd25FbGVtZW50SXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2ODYwZjguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL0JyZWFrZG93bkVsZW1lbnRJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3M7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVGFibGVJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JQ2FjaGVkQ2hpbGRyZW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklBY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JUmVzb3VyY2VBd2FyZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLlJlc291cmNlQXdhcmVEcmFnQW5kRHJvcENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQuR2VuZXJpY0Ryb3BDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5QcmVkZWNlc3Nvckxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlByb2Nlc3NVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtCcmVha2Rvd25FbGVtZW50OwotCi0KLS8qKgotICogQmFzZSBpdGVtIHByb3ZpZGVyIGZvciBhbGwgYnJlYWtkb3duIGVsZW1lbnRzCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBCcmVha2Rvd25FbGVtZW50SXRlbVByb3ZpZGVyIGV4dGVuZHMKLQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5CcmVha2Rvd25FbGVtZW50SXRlbVByb3ZpZGVyIGltcGxlbWVudHMKLQkJSVByb2Nlc3NJdGVtUHJvdmlkZXIsIElCU0l0ZW1Qcm92aWRlciwgSVRhYmxlSXRlbUxhYmVsUHJvdmlkZXIsIElDYWNoZWRDaGlsZHJlbkl0ZW1Qcm92aWRlciB7Ci0KLQlwcml2YXRlIE9iamVjdCBwYXJlbnQ7Ci0KLQlwcml2YXRlIGludCBpZDsKLQotCXByaXZhdGUgT2JqZWN0IHRvcEl0ZW07Ci0KLQlwcml2YXRlIGJvb2xlYW4gcm9sbGVkVXA7Ci0KLQlwcml2YXRlIEJvb2xlYW4gZXhwYW5kZWQ7Ci0KLQlwcml2YXRlIFByZWRlY2Vzc29yTGlzdCBwcmVkZWNlc3NvcnM7Ci0KLQlwcm90ZWN0ZWQgSXRlbVByb3ZpZGVyQWRhcHRlciBkZWxlZ2F0ZUl0ZW1Qcm92aWRlcjsKLQkKLQlwcm90ZWN0ZWQgTGlzdCBjYWNoZWRDaGlsZHJlbjsKLQotCS8qKgotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqLwotCXB1YmxpYyBCcmVha2Rvd25FbGVtZW50SXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LAotCQkJSXRlbVByb3ZpZGVyQWRhcHRlciBkZWxlZ2F0ZUl0ZW1Qcm92aWRlcikgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JCXRoaXMuZGVsZWdhdGVJdGVtUHJvdmlkZXIgPSBkZWxlZ2F0ZUl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJaWYgKHByZWRlY2Vzc29ycyAhPSBudWxsKSB7Ci0JCQlwcmVkZWNlc3NvcnMuZGlzcG9zZSgpOwotCQl9Ci0JCWlmKGNhY2hlZENoaWxkcmVuICE9IG51bGwpIHsKLQkJCWNhY2hlZENoaWxkcmVuLmNsZWFyKCk7Ci0JCQljYWNoZWRDaGlsZHJlbiA9IG51bGw7Ci0JCX0KLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KLQotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoZGVsZWdhdGVJdGVtUHJvdmlkZXIgIT0gbnVsbCkgewotCQkJcmV0dXJuIGRlbGVnYXRlSXRlbVByb3ZpZGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5CcmVha2Rvd25FbGVtZW50SXRlbVByb3ZpZGVyI2NvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKGphdmEudXRpbC5Db2xsZWN0aW9uLAotCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsCi0JCQlPYmplY3Qgb2JqZWN0KSB7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldENoaWxkcmVuRmVhdHVyZXMoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbkZlYXR1cmVzKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLklCU0l0ZW1Qcm92aWRlciNpc0V4cGFuZGVkKCkKLQkgKi8KLQlwdWJsaWMgQm9vbGVhbiBpc0V4cGFuZGVkKCkgewotCQlyZXR1cm4gZXhwYW5kZWQ7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLklCU0l0ZW1Qcm92aWRlciNzZXRFeHBhbmRlZChib29sZWFuKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEV4cGFuZGVkKEJvb2xlYW4gYikgewotCQlleHBhbmRlZCA9IGI7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnRuZy5wcm9jZXNzLklCU0l0ZW1Qcm92aWRlciNzZXRQYXJlbnQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQYXJlbnQoT2JqZWN0IG9iaikgewotCQlwYXJlbnQgPSBvYmo7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldFBhcmVudChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKHBhcmVudCAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gcGFyZW50OwotCQl9Ci0JCWlmKG9iamVjdCBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnQpIHsKLQkJCXJldHVybiAoKEJyZWFrZG93bkVsZW1lbnQpb2JqZWN0KS5nZXRTdXBlckFjdGl2aXRpZXMoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEudG5nLnByb2Nlc3MuSUJTSXRlbVByb3ZpZGVyI2dldElkKCkKLQkgKi8KLQlwdWJsaWMgaW50IGdldElkKCkgewotCQlyZXR1cm4gaWQ7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnRuZy5wcm9jZXNzLklCU0l0ZW1Qcm92aWRlciNzZXRJZChpbnQpCi0JICovCi0JcHVibGljIHZvaWQgc2V0SWQoaW50IGlkKSB7Ci0JCXRoaXMuaWQgPSBpZDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEudG5nLnByb2Nlc3MuSUJTSXRlbVByb3ZpZGVyI2dldFRvcEl0ZW0oKQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0VG9wSXRlbSgpIHsKLQkJT2JqZWN0IHBhcmVudCA9IGdldFBhcmVudCh0YXJnZXQpOwotCQlpZiAodG9wSXRlbSA9PSBudWxsICYmIHBhcmVudCAhPSBudWxsKSB7Ci0JCQlJQlNJdGVtUHJvdmlkZXIgYWRhcHRlciA9IChJQlNJdGVtUHJvdmlkZXIpIGdldFJvb3RBZGFwdGVyRmFjdG9yeSgpCi0JCQkJCS5hZGFwdChwYXJlbnQsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCQlpZiAoYWRhcHRlciAhPSBudWxsKSB7Ci0JCQkJT2JqZWN0IHRvcCA9IGFkYXB0ZXIuZ2V0VG9wSXRlbSgpOwotCQkJCWlmICh0b3AgPT0gbnVsbCAmJiBwYXJlbnQgaW5zdGFuY2VvZiBQcm9jZXNzCi0JCQkJCQkmJiAoKFByb2Nlc3MpIHBhcmVudCkuZ2V0U3VwZXJBY3Rpdml0aWVzKCkgPT0gbnVsbCkgewotCQkJCQl0b3AgPSBwYXJlbnQ7Ci0JCQkJCWFkYXB0ZXIuc2V0VG9wSXRlbSh0b3ApOwotCQkJCX0KLQkJCQlyZXR1cm4gdG9wOwotCQkJfQotCQl9Ci0JCXJldHVybiB0b3BJdGVtOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0Q29sdW1uTmFtZShpbnQgY29sdW1uSW5kZXgpIHsKLQkJQWRhcHRlckZhY3Rvcnkgcm9vdEFkYXB0ZXJGYWN0b3J5ID0gZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCk7Ci0JCWlmIChyb290QWRhcHRlckZhY3RvcnkgaW5zdGFuY2VvZiBJQ29sdW1uQXdhcmUpIHsKLQkJCU1hcCBjb2x1bW5JbmRleFRvTmFtZU1hcCA9ICgoSUNvbHVtbkF3YXJlKSByb290QWRhcHRlckZhY3RvcnkpCi0JCQkJCS5nZXRDb2x1bW5JbmRleFRvTmFtZU1hcCgpOwotCQkJaWYgKGNvbHVtbkluZGV4VG9OYW1lTWFwICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gKFN0cmluZykgY29sdW1uSW5kZXhUb05hbWVNYXAuZ2V0KG5ldyBJbnRlZ2VyKAotCQkJCQkJY29sdW1uSW5kZXgpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUYWJsZUl0ZW1MYWJlbFByb3ZpZGVyI2dldENvbHVtbkltYWdlKGphdmEubGFuZy5PYmplY3QsCi0JICogICAgICBpbnQpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRDb2x1bW5JbWFnZShPYmplY3Qgb2JqZWN0LCBpbnQgY29sdW1uSW5kZXgpIHsKLQkJLy8gU3RyaW5nIGNvbE5hbWUgPSAoU3RyaW5nKSBjb2x1bW5JbmRleFRvTmFtZU1hcC5nZXQobmV3Ci0JCS8vIEludGVnZXIoY29sdW1uSW5kZXgpKTsKLQkJU3RyaW5nIGNvbE5hbWUgPSBnZXRDb2x1bW5OYW1lKGNvbHVtbkluZGV4KTsKLQkJcmV0dXJuIFRuZ1V0aWwuZ2V0Q29sdW1uSW1hZ2Uob2JqZWN0LCBjb2xOYW1lKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUYWJsZUl0ZW1MYWJlbFByb3ZpZGVyI2dldENvbHVtblRleHQoamF2YS5sYW5nLk9iamVjdCwKLQkgKiAgICAgIGludCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENvbHVtblRleHQoT2JqZWN0IG9iamVjdCwgaW50IGNvbHVtbkluZGV4KSB7Ci0JCS8vIFN0cmluZyBjb2xOYW1lID0gKFN0cmluZykgY29sdW1uSW5kZXhUb05hbWVNYXAuZ2V0KG5ldwotCQkvLyBJbnRlZ2VyKGNvbHVtbkluZGV4KSk7Ci0JCVN0cmluZyBjb2xOYW1lID0gZ2V0Q29sdW1uTmFtZShjb2x1bW5JbmRleCk7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGUob2JqZWN0LCBjb2xOYW1lKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0VGV4dChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBUbmdVdGlsLmdldExhYmVsKG9iamVjdCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnRuZy5wcm9jZXNzLklCU0l0ZW1Qcm92aWRlciNzZXRUb3BJdGVtKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgc2V0VG9wSXRlbShPYmplY3QgdG9wKSB7Ci0JCXRvcEl0ZW0gPSB0b3A7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLklCU0l0ZW1Qcm92aWRlciNpc1JvbGxlZFVwKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1JvbGxlZFVwKCkgewotCQlyZXR1cm4gcm9sbGVkVXA7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLklCU0l0ZW1Qcm92aWRlciNzZXRSb2xsZWRVcChib29sZWFuKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJvbGxlZFVwKGJvb2xlYW4gYikgewotCQlyb2xsZWRVcCA9IGI7Ci0JfQotCi0JLy8gLyogKG5vbi1KYXZhZG9jKQotCS8vICogQHNlZQotCS8vIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuSUJTSXRlbVByb3ZpZGVyI3NldENvbHVtbkluZGV4VG9OYW1lTWFwKGphdmEudXRpbC5NYXApCi0JLy8gKi8KLQkvLyBwdWJsaWMgdm9pZCBzZXRDb2x1bW5JbmRleFRvTmFtZU1hcChNYXAgbWFwKSB7Ci0JLy8gaWYgKG1hcCAhPSBudWxsKQotCS8vIHsKLQkvLyBjb2x1bW5JbmRleFRvTmFtZU1hcCA9IG1hcDsKLQkvLyB9Ci0JLy8gfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLklCU0l0ZW1Qcm92aWRlciNnZXRBdHRyaWJ1dGUoamF2YS5sYW5nLk9iamVjdCwKLQkgKiAgICAgIGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRBdHRyaWJ1dGUoT2JqZWN0IG9iamVjdCwgU3RyaW5nIHByb3BlcnR5KSB7Ci0JCXJldHVybiBQcm9jZXNzVXRpbC5nZXRBdHRyaWJ1dGUob2JqZWN0LCBwcm9wZXJ0eSwgdGhpcyk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLklCU0l0ZW1Qcm92aWRlciNzZXRBdHRyaWJ1dGUoamF2YS5sYW5nLk9iamVjdCwKLQkgKiAgICAgIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgc2V0QXR0cmlidXRlKE9iamVjdCBvYmplY3QsIFN0cmluZyBwcm9wLCBTdHJpbmcgdHh0KSB7Ci0JCVdvcmtCcmVha2Rvd25FbGVtZW50IGUgPSAoV29ya0JyZWFrZG93bkVsZW1lbnQpIG9iamVjdDsKLQkJaWYgKHByb3AgPT0gSUJTSXRlbVByb3ZpZGVyLkNPTF9OQU1FKSB7Ci0JCQllLnNldE5hbWUodHh0KTsKLQkJfSBlbHNlIGlmIChwcm9wID09IElCU0l0ZW1Qcm92aWRlci5DT0xfUFJFREVDRVNTT1JTKSB7Ci0JCX0gZWxzZSBpZiAocHJvcCA9PSBJQlNJdGVtUHJvdmlkZXIuQ09MX0lTX0VWRU5UX0RSSVZFTikgewotCQkJZS5zZXRJc0V2ZW50RHJpdmVuKEJvb2xlYW4udmFsdWVPZih0eHQpKTsKLQkJfSBlbHNlIGlmIChwcm9wID09IElCU0l0ZW1Qcm92aWRlci5DT0xfSVNfT05HT0lORykgewotCQkJZS5zZXRJc09uZ29pbmcoQm9vbGVhbi52YWx1ZU9mKHR4dCkpOwotCQl9IGVsc2UgaWYgKHByb3AgPT0gSUJTSXRlbVByb3ZpZGVyLkNPTF9JU19SRVBFQVRBQkxFKSB7Ci0JCQllLnNldElzUmVwZWF0YWJsZShCb29sZWFuLnZhbHVlT2YodHh0KSk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuSUJTSXRlbVByb3ZpZGVyI2dldExpc3RlbmVycygpCi0JICovCi0JcHVibGljIExpc3QgZ2V0TGlzdGVuZXJzKCkgewotCQlpZiAoY2hhbmdlTm90aWZpZXIgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdCgoTGlzdCkgY2hhbmdlTm90aWZpZXIpOwotCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLklCU0l0ZW1Qcm92aWRlciNnZXRQcmVkZWNlc3NvcnMoKQotCSAqLwotCXB1YmxpYyBQcmVkZWNlc3Nvckxpc3QgZ2V0UHJlZGVjZXNzb3JzKCkgewotCQlpZiAocHJlZGVjZXNzb3JzID09IG51bGwpIHsKLQkJCXByZWRlY2Vzc29ycyA9IG5ldyBQcmVkZWNlc3Nvckxpc3QoVG5nVXRpbAotCQkJCQkuZ2V0QmVzdEFkYXB0ZXJGYWN0b3J5KGFkYXB0ZXJGYWN0b3J5KSwgdGFyZ2V0KTsKLQkJfQotCQlyZXR1cm4gcHJlZGVjZXNzb3JzOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzRmlyc3RFbGVtZW50KE9iamVjdCBvYmopIHsKLQkJcmV0dXJuIFByb2Nlc3NVdGlsLmlzRmlyc3RFbGVtZW50KGdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCB0aGlzLCBvYmopOwotCi0JCS8vIE9iamVjdCBwYXJlbnQgPSB0aGlzLmdldFBhcmVudChvYmopOwotCQkvLyBpZiAoKHBhcmVudCAhPSBudWxsKSAmJiAocGFyZW50IGluc3RhbmNlb2YgQWN0aXZpdHkpKQotCQkvLyB7Ci0JCS8vIEFjdGl2aXR5IGFjdGl2aXR5ID0gKEFjdGl2aXR5KSB0aGlzLmdldFBhcmVudChvYmopOwotCQkvLyBMaXN0IGVsZW1lbnRzID0gZ2V0RmlsdGVyZWRCcmVha2Rvd25FbGVtZW50cyhhY3Rpdml0eSwgb2JqKTsKLQkJLy8JCQkKLQkJLy8gLy8gaWYgaXQncyBmaXJzdCBlbGVtZW50LCByZXR1cm4gdHJ1ZQotCQkvLyBpZiAoZWxlbWVudHMuZ2V0KDApLmVxdWFscyhvYmopKQotCQkvLyB7Ci0JCS8vIHJldHVybiB0cnVlOwotCQkvLyB9Ci0JCS8vIGVsc2UgcmV0dXJuIGZhbHNlOwotCQkvLyB9Ci0JCS8vCQkKLQkJLy8gcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNMYXN0RWxlbWVudChPYmplY3Qgb2JqKSB7Ci0JCXJldHVybiBQcm9jZXNzVXRpbC5pc0xhc3RFbGVtZW50KGdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCB0aGlzLCBvYmopOwotCi0JCS8vIE9iamVjdCBwYXJlbnQgPSB0aGlzLmdldFBhcmVudChvYmopOwotCQkvLyBpZiAoKHBhcmVudCAhPSBudWxsKSAmJiAocGFyZW50IGluc3RhbmNlb2YgQWN0aXZpdHkpKQotCQkvLyB7Ci0JCS8vIEFjdGl2aXR5IGFjdGl2aXR5ID0gKEFjdGl2aXR5KSB0aGlzLmdldFBhcmVudChvYmopOwotCQkvLyBMaXN0IGVsZW1lbnRzID0gZ2V0RmlsdGVyZWRCcmVha2Rvd25FbGVtZW50cyhhY3Rpdml0eSwgb2JqKTsKLQkJLy8JCQkKLQkJLy8gLy8gaWYgaXQncyBsYXN0IGVsZW1lbnQsIHJldHVybiB0cnVlCi0JCS8vIGlmIChlbGVtZW50cy5nZXQoZWxlbWVudHMuc2l6ZSgpIC0gMSkuZXF1YWxzKG9iaikpCi0JCS8vIHsKLQkJLy8gcmV0dXJuIHRydWU7Ci0JCS8vIH0KLQkJLy8gZWxzZSByZXR1cm4gZmFsc2U7Ci0JCS8vIH0KLQkJLy8JCQotCQkvLyByZXR1cm4gdHJ1ZTsKLQotCX0KLQotCXB1YmxpYyB2b2lkIG1vdmVVcChPYmplY3Qgb2JqLCBJQWN0aW9uTWFuYWdlciBhY3Rpb25NZ3IpIHsKLQkJT2JqZWN0IHBhcmVudCA9IHRoaXMuZ2V0UGFyZW50KG9iaik7Ci0JCWlmICgocGFyZW50ICE9IG51bGwpICYmIChwYXJlbnQgaW5zdGFuY2VvZiBBY3Rpdml0eSkpIHsKLQkJCVRuZ1V0aWwubW92ZVVwKChBY3Rpdml0eSkgcGFyZW50LCBvYmosIGdldEVDbGFzc2VzKCksIGFjdGlvbk1ncik7Ci0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIG1vdmVEb3duKE9iamVjdCBvYmosIElBY3Rpb25NYW5hZ2VyIGFjdGlvbk1ncikgewotCQlPYmplY3QgcGFyZW50ID0gdGhpcy5nZXRQYXJlbnQob2JqKTsKLQkJaWYgKChwYXJlbnQgIT0gbnVsbCkgJiYgKHBhcmVudCBpbnN0YW5jZW9mIEFjdGl2aXR5KSkgewotCQkJVG5nVXRpbC5tb3ZlRG93bigoQWN0aXZpdHkpIHBhcmVudCwgb2JqLCBnZXRFQ2xhc3NlcygpLCBhY3Rpb25NZ3IpOwotCQl9Ci0JfQotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0RUNsYXNzZXMoKSB7Ci0JCS8vIGltcGxlbWVudGVkIGJ5IHN1YmNsYXNzZXMKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLkRlc2NyaXB0b3JJdGVtUHJvdmlkZXIjZ2V0SW1hZ2UoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGRlbGVnYXRlSXRlbVByb3ZpZGVyICE9IG51bGwpIHsKLQkJCXJldHVybiBkZWxlZ2F0ZUl0ZW1Qcm92aWRlci5nZXRJbWFnZShvYmplY3QpOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRJbWFnZShvYmplY3QpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5EZXNjcmlwdG9ySXRlbVByb3ZpZGVyI25vdGlmeUNoYW5nZWQob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQlpZiAoVG5nVXRpbC5oYW5kbGVQcmVkZWNlc3Nvckxpc3RDaGFuZ2UodGhpcywgbm90aWZpY2F0aW9uKSkKLQkJCXJldHVybjsKLQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaENoaWxkcmVuKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24sCi0JCQlDb2xsZWN0aW9uIG5ld09yT2xkQ2hpbGRyZW4pIHsKLQkJaWYgKCFuZXdPck9sZENoaWxkcmVuLmlzRW1wdHkoKSkgewotCQkJLy8gLy8gcmVjYWxjdWxhdGUgdGhlIElEcyBvZiBicmVha2Rvd24gZWxlbWVudHMgYW5kIHJlZnJlc2ggdGhlbQotCQkJLy8gLy8KLQkJCS8vIEFjdGl2aXR5IHRvcEFjdCA9IChBY3Rpdml0eSkgZ2V0VG9wSXRlbSgpOwotCQkJLy8gQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkgPSBnZXRSb290QWRhcHRlckZhY3RvcnkoKTsKLQkJCS8vIFByb2Nlc3NVdGlsLnVwZGF0ZUlEcyhhZGFwdGVyRmFjdG9yeSwgbmV3Ci0JCQkvLyBBZGFwdGVyRmFjdG9yeVRyZWVJdGVyYXRvcihhZGFwdGVyRmFjdG9yeSwgdG9wQWN0KSwgdG9wQWN0KTsKLQotCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbgotCQkJCQkuZ2V0Tm90aWZpZXIoKSwgdHJ1ZSwgZmFsc2UpKTsKLQkJCXJldHVybjsKLQkJfQotCX0KLQotCXB1YmxpYyBHZW5lcmljRHJvcENvbW1hbmQuRWxlbWVudEFkYXB0ZXIgY3JlYXRlRHJvcEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5JQlNJdGVtUHJvdmlkZXIjY3JlYXRlRHJvcENvbW1hbmQoamF2YS5sYW5nLk9iamVjdCwKLQkgKiAgICAgIGphdmEudXRpbC5MaXN0KQotCSAqLwotCXB1YmxpYyBJUmVzb3VyY2VBd2FyZUNvbW1hbmQgY3JlYXRlRHJvcENvbW1hbmQoT2JqZWN0IG93bmVyLAotCQkJTGlzdCBkcm9wRWxlbWVudHMpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JQ2FjaGVkQ2hpbGRyZW5JdGVtUHJvdmlkZXIjZ2V0Q2hpbGRyZW5Gcm9tQ2FjaGUoKQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuRnJvbUNhY2hlKCkgewotCQlpZihjYWNoZWRDaGlsZHJlbiA9PSBudWxsKSB7Ci0JCQlnZXRDaGlsZHJlbih0YXJnZXQpOwotCQl9Ci0JCXJldHVybiBjYWNoZWRDaGlsZHJlbjsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JQ2FjaGVkQ2hpbGRyZW5JdGVtUHJvdmlkZXIjZ2V0Um9sbHVwQ2hpbGRyZW5Gcm9tQ2FjaGUoKQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldFJvbGx1cENoaWxkcmVuRnJvbUNhY2hlKCkgewotCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQ29tbWFuZCBjcmVhdGVEcmFnQW5kRHJvcENvbW1hbmQoRWRpdGluZ0RvbWFpbiBkb21haW4sIE9iamVjdCBvd25lciwgZmxvYXQgbG9jYXRpb24sIGludCBvcGVyYXRpb25zLCBpbnQgb3BlcmF0aW9uLCBDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJcmV0dXJuIG5ldyBSZXNvdXJjZUF3YXJlRHJhZ0FuZERyb3BDb21tYW5kKGRvbWFpbiwgb3duZXIsIGxvY2F0aW9uLCBvcGVyYXRpb25zLAotCQkJCW9wZXJhdGlvbiwgY29sbGVjdGlvbik7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9CcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ODRhYjY4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9CcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2VzczsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkRlbGVnYXRpbmdXcmFwcGVySXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUYWJsZUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklXcmFwcGVySXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JQWN0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuUHJlZGVjZXNzb3JMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Qcm9jZXNzVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrQnJlYWtkb3duRWxlbWVudDsKLQotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlciBleHRlbmRzCi0JCURlc2NyaWJhYmxlRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIgewotCi0JcHJpdmF0ZSBib29sZWFuIGlzUm9sbGVkVXA7Ci0KLQlwcml2YXRlIFByZWRlY2Vzc29yTGlzdCBwcmVkZWNlc3NvcnM7Ci0KLQlwcml2YXRlIEJvb2xlYW4gZXhwYW5kZWQ7Ci0JCi0JcHJvdGVjdGVkIEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKE9iamVjdCB2YWx1ZSwKLQkJCU9iamVjdCBvd25lciwgQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIodmFsdWUsIG93bmVyLCBudWxsLCBDb21tYW5kUGFyYW1ldGVyLk5PX0lOREVYLCBhZGFwdGVyRmFjdG9yeSk7Ci0JCWlmKHZhbHVlIGluc3RhbmNlb2YgRGVzY3JpYmFibGVFbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgewotCQkJRGVzY3JpYmFibGVFbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlciB3cmFwcGVyID0gKERlc2NyaWJhYmxlRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIHZhbHVlOwotCQkJaWYgKHZhbHVlIGluc3RhbmNlb2YgRGVsZWdhdGluZ1dyYXBwZXJJdGVtUHJvdmlkZXIpIHsKLQkJCQlmZWF0dXJlID0gKChEZWxlZ2F0aW5nV3JhcHBlckl0ZW1Qcm92aWRlcikgdmFsdWUpLmdldEZlYXR1cmUoKTsKLQkJCX0KLQkJCXNldFJlYWRPbmx5KHdyYXBwZXIuaXNSZWFkT25seSgpKTsKLQkJCXNldFJvbGxlZFVwKHdyYXBwZXIuaXNSb2xsdXBDaGlsZCgpKTsKLQkJCWlzSW5oZXJpdGVkID0gd3JhcHBlci5pc0luaGVyaXRlZDsKLQkJCWNvbnRyaWJ1dGVkID0gd3JhcHBlci5jb250cmlidXRlZDsKLQkJfQkJCi0JfQotCi0JLyoqCi0JICogQHBhcmFtIHZhbHVlCi0JICogQHBhcmFtIG93bmVyCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICovCi0JcHVibGljIEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKEJyZWFrZG93bkVsZW1lbnQgdmFsdWUsCi0JCQlPYmplY3Qgb3duZXIsIEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKHZhbHVlLCBvd25lciwgYWRhcHRlckZhY3RvcnkpOwotCX0KLQkKLQkvKioKLQkgKiBAcGFyYW0gYWN0aXZpdHkKLQkgKiBAcGFyYW0gb3duZXIKLQkgKiBAcGFyYW0gZmVhdHVyZQotCSAqIEBwYXJhbSBpbmRleAotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqLwotCXB1YmxpYyBCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcihCcmVha2Rvd25FbGVtZW50IHZhbHVlLAotCQkJT2JqZWN0IG93bmVyLCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgaW50IGluZGV4LAotCQkJQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIodmFsdWUsIG93bmVyLCBmZWF0dXJlLCBpbmRleCwgYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5JQlNJdGVtUHJvdmlkZXIjaXNFeHBhbmRlZCgpCi0JICovCi0JcHVibGljIEJvb2xlYW4gaXNFeHBhbmRlZCgpIHsKLQkJcmV0dXJuIGV4cGFuZGVkOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5JQlNJdGVtUHJvdmlkZXIjc2V0RXhwYW5kZWQoYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFeHBhbmRlZChCb29sZWFuIGIpIHsKLQkJZXhwYW5kZWQgPSBiOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5JQlNJdGVtUHJvdmlkZXIjaXNSb2xsZWRVcCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNSb2xsZWRVcCgpIHsKLQkJcmV0dXJuIGlzUm9sbGVkVXA7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLklCU0l0ZW1Qcm92aWRlciNzZXRSb2xsZWRVcChib29sZWFuKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJvbGxlZFVwKGJvb2xlYW4gYikgewotCQlpc1JvbGxlZFVwID0gYjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuSUJTSXRlbVByb3ZpZGVyI2dldEF0dHJpYnV0ZShqYXZhLmxhbmcuT2JqZWN0LAotCSAqICAgICAgamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJpYnV0ZShPYmplY3Qgb2JqZWN0LCBTdHJpbmcgcHJvcGVydHkpIHsKLQkJcmV0dXJuIFByb2Nlc3NVdGlsLmdldEF0dHJpYnV0ZShvYmplY3QsIHByb3BlcnR5LCB0aGlzKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuSUJTSXRlbVByb3ZpZGVyI3NldEF0dHJpYnV0ZShqYXZhLmxhbmcuT2JqZWN0LAotCSAqICAgICAgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBdHRyaWJ1dGUoT2JqZWN0IG9iamVjdCwgU3RyaW5nIHByb3BlcnR5LCBTdHJpbmcgdGV4dFZhbHVlKSB7Ci0JCVByb2Nlc3NVdGlsLnNldEF0dHJpYnV0ZSgoV29ya0JyZWFrZG93bkVsZW1lbnQpIFRuZ1V0aWwudW53cmFwKG9iamVjdCksCi0JCQkJcHJvcGVydHksIHRleHRWYWx1ZSk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkRlc2NyaWJhYmxlRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIjZG9DcmVhdGVXcmFwcGVyKGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5PYmplY3QsIG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5KQotCSAqLwotCXByb3RlY3RlZCBJV3JhcHBlckl0ZW1Qcm92aWRlciBkb0NyZWF0ZVdyYXBwZXIoT2JqZWN0IHZhbHVlLCBPYmplY3Qgb3duZXIsIEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXJldHVybiBJQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJLmNyZWF0ZVdyYXBwZXIodmFsdWUsIG93bmVyLCBhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVGFibGVJdGVtTGFiZWxQcm92aWRlciNnZXRDb2x1bW5JbWFnZShqYXZhLmxhbmcuT2JqZWN0LAotCSAqICAgICAgaW50KQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0Q29sdW1uSW1hZ2UoT2JqZWN0IG9iamVjdCwgaW50IGNvbHVtbkluZGV4KSB7Ci0JCWlmIChkZWxlZ2F0ZUl0ZW1Qcm92aWRlciBpbnN0YW5jZW9mIElUYWJsZUl0ZW1MYWJlbFByb3ZpZGVyKSB7Ci0JCQlyZXR1cm4gKChJVGFibGVJdGVtTGFiZWxQcm92aWRlcikgZGVsZWdhdGVJdGVtUHJvdmlkZXIpCi0JCQkJCS5nZXRDb2x1bW5JbWFnZShvYmplY3QsIGNvbHVtbkluZGV4KTsKLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5JQlNJdGVtUHJvdmlkZXIjZ2V0UHJlZGVjZXNzb3JzKCkKLQkgKi8KLQlwdWJsaWMgUHJlZGVjZXNzb3JMaXN0IGdldFByZWRlY2Vzc29ycygpIHsKLQkJaWYgKHByZWRlY2Vzc29ycyA9PSBudWxsKSB7Ci0JCQlPYmplY3Qgb2JqID0gVG5nVXRpbC51bndyYXAodGhpcyk7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgV29ya0JyZWFrZG93bkVsZW1lbnQpIHsKLQkJCQlwcmVkZWNlc3NvcnMgPSBuZXcgUHJlZGVjZXNzb3JMaXN0KFRuZ1V0aWwKLQkJCQkJCS5nZXRCZXN0QWRhcHRlckZhY3RvcnkoYWRhcHRlckZhY3RvcnkpLCB0aGlzKTsKLQkJCX0gZWxzZSB7Ci0JCQkJcHJlZGVjZXNzb3JzID0gUHJlZGVjZXNzb3JMaXN0LkVNUFRZX0xJU1Q7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHByZWRlY2Vzc29yczsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkRlbGVnYXRpbmdXcmFwcGVySXRlbVByb3ZpZGVyI2NyZWF0ZUNvbW1hbmQoamF2YS5sYW5nLk9iamVjdCwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluLCBqYXZhLmxhbmcuQ2xhc3MsCi0JICogICAgICBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXIpCi0JICovCi0JcHVibGljIENvbW1hbmQgY3JlYXRlQ29tbWFuZChPYmplY3Qgb2JqZWN0LCBFZGl0aW5nRG9tYWluIGRvbWFpbiwKLQkJCUNsYXNzIGNvbW1hbmRDbGFzcywgQ29tbWFuZFBhcmFtZXRlciBjb21tYW5kUGFyYW1ldGVyKSB7Ci0JCS8vIFN5c3RlbS5vdXQKLQkJLy8gLnByaW50bG4oIkJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyLmNyZWF0ZUNvbW1hbmQoKToiKTsKLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCIgb2JqZWN0OiAiICsgb2JqZWN0KTsKLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCIgY29tbWFuZENsYXNzOiAiICsgY29tbWFuZENsYXNzKTsKLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCIgY29tbWFuZFBhcmFtZXRlcjogIiArIGNvbW1hbmRQYXJhbWV0ZXIpOwotCQlyZXR1cm4gc3VwZXIuY3JlYXRlQ29tbWFuZChvYmplY3QsIGRvbWFpbiwgY29tbWFuZENsYXNzLAotCQkJCWNvbW1hbmRQYXJhbWV0ZXIpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuRGVsZWdhdGluZ1dyYXBwZXJJdGVtUHJvdmlkZXIjZ2V0TmV3Q2hpbGREZXNjcmlwdG9ycyhqYXZhLmxhbmcuT2JqZWN0LAotCSAqICAgICAgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW4sIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0TmV3Q2hpbGREZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0LAotCQkJRWRpdGluZ0RvbWFpbiBlZGl0aW5nRG9tYWluLCBPYmplY3Qgc2libGluZykgewotCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlckZhY3RvcnkgZ2V0QWRhcHRlckZhY3RvcnkoKSB7Ci0JCXJldHVybiBhZGFwdGVyRmFjdG9yeTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0ZpcnN0RWxlbWVudChPYmplY3Qgb2JqKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzTGFzdEVsZW1lbnQoT2JqZWN0IG9iaikgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgTGlzdCBnZXRGaWx0ZXJlZEJyZWFrZG93bkVsZW1lbnRzKE9iamVjdCBhY3Rpdml0eSwgT2JqZWN0IG9iaikgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBtb3ZlVXAoT2JqZWN0IG9iaiwgSUFjdGlvbk1hbmFnZXIgYWN0aW9uTWdyKSB7Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBtb3ZlRG93bihPYmplY3Qgb2JqLCBJQWN0aW9uTWFuYWdlciBhY3Rpb25NZ3IpIHsKLQotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldEVDbGFzc2VzKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkRlbGVnYXRpbmdXcmFwcGVySXRlbVByb3ZpZGVyI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWlmIChwcmVkZWNlc3NvcnMgIT0gbnVsbCkgewotCQkJcHJlZGVjZXNzb3JzLmRpc3Bvc2UoKTsKLQkJfQotCi0JCXN1cGVyLmRpc3Bvc2UoKTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvQ29tcG9zZWRCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL0NvbXBvc2VkQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjAzOTZjYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvQ29tcG9zZWRCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2VzczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVuaXF1ZUVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLlN0clV0aWw7Ci0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqCi0gKiBAc2luY2UgMS4yCi0gKi8KLXB1YmxpYyBjbGFzcyBDb21wb3NlZEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyIGV4dGVuZHMKLQkJQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIgewotCXByaXZhdGUgTGlzdCB2YWx1ZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCi0JLyoqCi0JICogQHBhcmFtIHZhbHVlCi0JICogQHBhcmFtIG93bmVyCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICovCi0JcHVibGljIENvbXBvc2VkQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIoT2JqZWN0IHZhbHVlLAotCQkJT2JqZWN0IG93bmVyLCBBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcih2YWx1ZSwgb3duZXIsIGFkYXB0ZXJGYWN0b3J5KTsKLQkJYWRkRWxlbWVudCh2YWx1ZSk7Ci0JfQotCQotCXB1YmxpYyBMaXN0IGdldFZhbHVlcygpIHsKLQkJcmV0dXJuIHZhbHVlczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRFbGVtZW50KE9iamVjdCBlKSB7Ci0JCWdldFZhbHVlcygpLmFkZChlKTsKLQl9Ci0JCi0JLyoqCi0JICogRGVjaWRlcyBpZiB0aGUgdmFsdWVzIG9mIHRoZSBnaXZlbiBwcm9wZXJ0eSBvZiBhbGwgZWxlbWVudHMgaW4gdGhpcyBjb21wb3NlZCB3cmFwcGVyIGNhbiBiZSBtZXJnZWQuCi0JICogQHBhcmFtIHByb3BlcnR5Ci0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGNhbk1lcmdlKFN0cmluZyBwcm9wZXJ0eSkgewotCQlyZXR1cm4gcHJvcGVydHkgPT0gSUJTSXRlbVByb3ZpZGVyLkNPTF9NT0RFTF9JTkZPOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJpYnV0ZShPYmplY3Qgb2JqZWN0LCBTdHJpbmcgcHJvcGVydHkpIHsKLQkJaWYoIXZhbHVlcy5pc0VtcHR5KCkpIHsKLQkJCWlmKGNhbk1lcmdlKHByb3BlcnR5KSkgewotCQkJCVVuaXF1ZUVMaXN0IG1vZGVsSW5mb3MgPSBuZXcgVW5pcXVlRUxpc3QoKTsJCQkJCi0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gdmFsdWVzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQlPYmplY3QgbyA9IGl0ZXIubmV4dCgpOwotCQkJCQlTdHJpbmcgaW5mbzsKLQkJCQkJaWYobyBpbnN0YW5jZW9mIElCU0l0ZW1Qcm92aWRlcikgewotCQkJCQkJaW5mbyA9ICgoSUJTSXRlbVByb3ZpZGVyKW8pLmdldEF0dHJpYnV0ZShvLCBwcm9wZXJ0eSk7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQlJQlNJdGVtUHJvdmlkZXIgaXAgPSAoSUJTSXRlbVByb3ZpZGVyKSBhZGFwdGVyRmFjdG9yeS5hZGFwdChvLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkJCQkJaW5mbyA9IGlwLmdldEF0dHJpYnV0ZShvLCBwcm9wZXJ0eSk7Ci0JCQkJCX0KLQkJCQkJaWYoIVN0clV0aWwuaXNCbGFuayhpbmZvKSkgewotCQkJCQkJbW9kZWxJbmZvcy5hZGQoaW5mbyk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYoIW1vZGVsSW5mb3MuaXNFbXB0eSgpKSB7Ci0JCQkJCVN0cmluZ0J1ZmZlciBtb2RlbEluZm8gPSBuZXcgU3RyaW5nQnVmZmVyKChTdHJpbmcpbW9kZWxJbmZvcy5nZXQoMCkpOwotCQkJCQlpbnQgbWF4ID0gbW9kZWxJbmZvcy5zaXplKCk7Ci0JCQkJCWZvciAoaW50IGkgPSAxOyBpIDwgbWF4OyBpKyspIHsKLQkJCQkJCW1vZGVsSW5mby5hcHBlbmQoJywnKS5hcHBlbmQobW9kZWxJbmZvcy5nZXQoaSkpOwotCQkJCQl9Ci0JCQkJCXJldHVybiBtb2RlbEluZm8udG9TdHJpbmcoKTsKLQkJCQl9Ci0JCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldEF0dHJpYnV0ZShvYmplY3QsIHByb3BlcnR5KTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gaXNJbmhlcml0ZWQoKSB7Ci0JCWZvcihpbnQgaSA9IHZhbHVlcy5zaXplKCkgLSAxOyBpID4gLTE7IGktLSkgewotCQkJT2JqZWN0IG8gPSB2YWx1ZXMuZ2V0KGkpOwotCQkJaWYoIShvIGluc3RhbmNlb2YgRGVzY3JpYmFibGVFbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgCi0JCQkJCXx8ICEoKERlc2NyaWJhYmxlRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpbykuaXNJbmhlcml0ZWQoKSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvQ29tcG9zZWRXUERlc2NyaXB0b3JXcmFwcGVySXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvQ29tcG9zZWRXUERlc2NyaXB0b3JXcmFwcGVySXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiYTU5MWYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL0NvbXBvc2VkV1BEZXNjcmlwdG9yV3JhcHBlckl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2VzczsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VbmlxdWVFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JQ2hhbmdlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLlN0clV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlByb2Nlc3NVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvcjsKLQotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlIC0gRmViIDIzLCAyMDA2Ci0gKiBAc2luY2UgIDcuMC4xCi0gKi8KLXB1YmxpYyBjbGFzcyBDb21wb3NlZFdQRGVzY3JpcHRvcldyYXBwZXJJdGVtUHJvdmlkZXIgZXh0ZW5kcwotCQlXb3JrUHJvZHVjdERlc2NyaXB0b3JXcmFwcGVySXRlbVByb3ZpZGVyIHsKLQotCXByaXZhdGUgTGlzdCBub3RpZmllcnM7Ci0KLQkvKioKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiBAcGFyYW0gb3duZXIKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgQ29tcG9zZWRXUERlc2NyaXB0b3JXcmFwcGVySXRlbVByb3ZpZGVyKE9iamVjdCB2YWx1ZSwKLQkJCU9iamVjdCBvd25lciwgQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIodmFsdWUsIG93bmVyLCBhZGFwdGVyRmFjdG9yeSk7Ci0JCWlmKHZhbHVlIGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIHsKLQkJCUJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyIHdyYXBwZXIgPSAoKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKXZhbHVlKTsKLQkJCXJlYWRPbmx5ID0gd3JhcHBlci5pc1JlYWRPbmx5KCk7Ci0JCQlpc0luaGVyaXRlZCA9IHdyYXBwZXIuaXNJbmhlcml0ZWQ7Ci0JCX0KLQkJaXNSb2xsdXBDaGlsZCA9IHRydWU7Ci0JfQotCi0JLyoqCi0JICogQWRkcyB3b3JrIHByb2R1Y3QgZGVzY3JpcHRvciB0byB0aGUgbm90aWZpZXIgbGlzdCBvZiB0aGlzIHdyYXBwZXIuIFRoZSBnaXZlbiB3b3JrIHByb2R1Y3QgZGVzY3JpcHRvcgotCSAqIG11c3QgYmUgbGlua2VkIHRvIHRoZSBzYW1lIHdvcmsgcHJvZHVjdCBhcyB0aGUgZGVsZWdhdGUgdmFsdWUgaXMgCi0JICogCi0JICogQHBhcmFtIG9iamVjdCB0aGUgd29yayBwcm9kdWN0IGRlc2NyaXB0b3Igb3IgaXRzIHdyYXBwZXIKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRXb3JrUHJvZHVjdERlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlXb3JrUHJvZHVjdERlc2NyaXB0b3Igd3BkID0gKFdvcmtQcm9kdWN0RGVzY3JpcHRvcilUbmdVdGlsLnVud3JhcChvYmplY3QpOwotCQlXb3JrUHJvZHVjdERlc2NyaXB0b3IgZGVsZWdhdGVXcGQgPSAoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBUbmdVdGlsLnVud3JhcChnZXREZWxlZ2F0ZVZhbHVlKCkpOwotCQlpZihkZWxlZ2F0ZVdwZCA9PSB3cGQpIHsKLQkJCXJldHVybjsKLQkJfQotCQlPYmplY3Qgd3AgPSBQcm9jZXNzVXRpbC5nZXRBc3NvY2lhdGVkRWxlbWVudChkZWxlZ2F0ZVdwZCk7Ci0JCWlmKHdwID09IG51bGwgfHwgd3AgPT0gd3BkLmdldFdvcmtQcm9kdWN0KCkpIHsKLQkJCU9iamVjdCBpdGVtUHJvdmlkZXIgPSBnZXRSb290QWRhcHRlckZhY3RvcnkoKS5hZGFwdCh3cGQsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCQlpZiAoaXRlbVByb3ZpZGVyIGluc3RhbmNlb2YgSUNoYW5nZU5vdGlmaWVyKQotCQkJewotCQkJCSgoSUNoYW5nZU5vdGlmaWVyKWl0ZW1Qcm92aWRlcikuYWRkTGlzdGVuZXIodGhpcyk7Ci0JCQkJaWYobm90aWZpZXJzID09IG51bGwpIHsKLQkJCQkJbm90aWZpZXJzID0gbmV3IFVuaXF1ZUVMaXN0KCk7Ci0JCQkJfQotCQkJCW5vdGlmaWVycy5hZGQoaXRlbVByb3ZpZGVyKTsKLQkJCX0KLQkJfQkKLQkJCi0JCWlmKGlzSW5oZXJpdGVkICYmIG9iamVjdCBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyICYmCi0JCQkJISgoQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpb2JqZWN0KS5pc0luaGVyaXRlZCkgewotCQkJdGhpcy5pc0luaGVyaXRlZCA9IGZhbHNlOwotCQl9Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlciNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlpZihub3RpZmllcnMgIT0gbnVsbCkgewotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gbm90aWZpZXJzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCUlDaGFuZ2VOb3RpZmllciBub3RpZmllciA9IChJQ2hhbmdlTm90aWZpZXIpIGl0ZXIubmV4dCgpOwotCQkJCW5vdGlmaWVyLnJlbW92ZUxpc3RlbmVyKHRoaXMpOwotCQkJfQotCQkJbm90aWZpZXJzLmNsZWFyKCk7Ci0JCX0KLQkJCi0JCXN1cGVyLmRpc3Bvc2UoKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5EZWxlZ2F0aW5nV3JhcHBlckl0ZW1Qcm92aWRlciNub3RpZnlDaGFuZ2VkKG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJaWYobm90aWZpZXJzICE9IG51bGwgJiYgbm90aWZpZXJzLmNvbnRhaW5zKG5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpKSkgewotCQkJc3dpdGNoKG5vdGlmaWNhdGlvbi5nZXRFdmVudFR5cGUoKSkgewotCQkJY2FzZSBOb3RpZmljYXRpb24uUkVNT1ZJTkdfQURBUFRFUjoKLQkJCQlpZihub3RpZmljYXRpb24uZ2V0T2xkVmFsdWUoKSA9PSB0aGlzKSB7Ci0JCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCB0aGlzLCBmYWxzZSwgdHJ1ZSkpOwkJCQkKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCWNhc2UgTm90aWZpY2F0aW9uLlNFVDoKLQkJCQlzd2l0Y2gobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChXb3JrUHJvZHVjdERlc2NyaXB0b3IuY2xhc3MpKSB7Ci0JCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX19BQ1RJVklUWV9FTlRSWV9TVEFURToKLQkJCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0FDVElWSVRZX0VYSVRfU1RBVEU6Ci0JCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKHdyYXBOb3RpZmljYXRpb24obm90aWZpY2F0aW9uKSk7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIjZ2V0QXR0cmlidXRlKGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRBdHRyaWJ1dGUoT2JqZWN0IG9iamVjdCwgU3RyaW5nIHByb3BlcnR5KSB7Ci0JCWlmKHByb3BlcnR5ID09IElCU0l0ZW1Qcm92aWRlci5DT0xfTU9ERUxfSU5GTyAmJiBnZXRWYWx1ZSgpIGluc3RhbmNlb2YgQ29tcG9zZWRCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgewotCQkJU3RyaW5nIGluZm8gPSAoKENvbXBvc2VkQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpZ2V0VmFsdWUoKSkuZ2V0QXR0cmlidXRlKG9iamVjdCwgcHJvcGVydHkpOwotCQkJaWYoIVN0clV0aWwuaXNCbGFuayhpbmZvKSkgewotCQkJCVN0cmluZ1Rva2VuaXplciB0b2tlbnMgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGluZm8sICIsIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlIYXNoU2V0IGluZm9TZXQgPSBuZXcgSGFzaFNldCgpOwotCQkJCVN0cmluZ0J1ZmZlciBpbmZvcyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCQl3aGlsZSh0b2tlbnMuaGFzTW9yZVRva2VucygpKSB7Ci0JCQkJCVN0cmluZyB0b2tlbiA9IHRva2Vucy5uZXh0VG9rZW4oKTsKLQkJCQkJaWYoaW5mb1NldC5hZGQodG9rZW4pKSB7Ci0JCQkJCQlpbmZvcy5hcHBlbmQodG9rZW4pLmFwcGVuZCgnLCcpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWluZm9zLmRlbGV0ZUNoYXJBdChpbmZvcy5sZW5ndGgoKSAtIDEpOwotCQkJCWluZm8gPSBpbmZvcy50b1N0cmluZygpOwotCQkJfQotCQkJcmV0dXJuIGluZm87Ci0JCX0KLQkJaWYobm90aWZpZXJzICE9IG51bGwgJiYgIW5vdGlmaWVycy5pc0VtcHR5KCkKLQkJCQkmJiAocHJvcGVydHkgPT0gSUJTSXRlbVByb3ZpZGVyLkNPTF9FTlRSWV9TVEFURSB8fCBwcm9wZXJ0eSA9PSBJQlNJdGVtUHJvdmlkZXIuQ09MX0VYSVRfU1RBVEUpKSB7Ci0JCQlTdHJpbmdCdWZmZXIgc3RyYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJU3RyaW5nIHN0ciA9IHN1cGVyLmdldEF0dHJpYnV0ZShvYmplY3QsIHByb3BlcnR5KTsKLQkJCWlmKCFTdHJVdGlsLmlzQmxhbmsoc3RyKSkgewotCQkJCXN0cmJ1Zi5hcHBlbmQoc3RyKTsKLQkJCX0KLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IG5vdGlmaWVycy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlXb3JrUHJvZHVjdERlc2NyaXB0b3JJdGVtUHJvdmlkZXIgaXRlbVByb3ZpZGVyID0gKFdvcmtQcm9kdWN0RGVzY3JpcHRvckl0ZW1Qcm92aWRlcikgaXRlci5uZXh0KCk7Ci0JCQkJc3RyID0gaXRlbVByb3ZpZGVyLmdldEF0dHJpYnV0ZShpdGVtUHJvdmlkZXIuZ2V0VGFyZ2V0KCksIHByb3BlcnR5KTsKLQkJCQlpZighU3RyVXRpbC5pc0JsYW5rKHN0cikpIHsKLQkJCQkJaWYoc3RyYnVmLmxlbmd0aCgpID4gMCkgewotCQkJCQkJc3RyYnVmLmFwcGVuZCgnLCcpOwotCQkJCQl9Ci0JCQkJCXN0cmJ1Zi5hcHBlbmQoc3RyKTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gc3RyYnVmLnRvU3RyaW5nKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldEF0dHJpYnV0ZShvYmplY3QsIHByb3BlcnR5KTsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvQ29tcG9zaXRlUm9sZUl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL0NvbXBvc2l0ZVJvbGVJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGJhZmE5MS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvQ29tcG9zaXRlUm9sZUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2VzczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZC5HZW5lcmljRHJvcENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQuT0JTRHJhZ0FuZERyb3BDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kLkdlbmVyaWNEcm9wQ29tbWFuZC5FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbXBvc2l0ZVJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmliYWJsZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBDb21wb3NpdGVSb2xlSXRlbVByb3ZpZGVyIGV4dGVuZHMgUm9sZURlc2NyaXB0b3JJdGVtUHJvdmlkZXIgewotCi0JcHJpdmF0ZSBFbGVtZW50QWRhcHRlciBkcm9wQWRhcHRlcjsKLQotCS8qKgotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqIEBwYXJhbSBkZWxlZ2F0ZUl0ZW1Qcm92aWRlcgotCSAqLwotCXB1YmxpYyBDb21wb3NpdGVSb2xlSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LAotCQkJSXRlbVByb3ZpZGVyQWRhcHRlciBkZWxlZ2F0ZUl0ZW1Qcm92aWRlcikgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSwgZGVsZWdhdGVJdGVtUHJvdmlkZXIpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CcmVha2Rvd25FbGVtZW50SXRlbVByb3ZpZGVyI2dldENoaWxkcmVuRmVhdHVyZXMoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbkZlYXR1cmVzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGNoaWxkcmVuRmVhdHVyZXMgPT0gbnVsbCkgewotCQkJY2hpbGRyZW5GZWF0dXJlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWNoaWxkcmVuRmVhdHVyZXMuYWRkKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCS5nZXRDb21wb3NpdGVSb2xlX0FnZ3JlZ2F0ZWRSb2xlcygpKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW5GZWF0dXJlczsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuRGVzY3JpcHRvckl0ZW1Qcm92aWRlciNub3RpZnlDaGFuZ2VkKG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoQ29tcG9zaXRlUm9sZS5jbGFzcykpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkNPTVBPU0lURV9ST0xFX19BR0dSRUdBVEVEX1JPTEVTOgotCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbgotCQkJCQkuZ2V0Tm90aWZpZXIoKSwgdHJ1ZSwgZmFsc2UpKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjaXNXcmFwcGluZ05lZWRlZChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzV3JhcHBpbmdOZWVkZWQoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjY3JlYXRlV3JhcHBlcihvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmUsIGphdmEubGFuZy5PYmplY3QsIGludCkKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGNyZWF0ZVdyYXBwZXIoRU9iamVjdCBvYmplY3QsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLAotCQkJT2JqZWN0IHZhbHVlLCBpbnQgaW5kZXgpIHsKLQkJRGVzY3JpYmFibGVFbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlciB3cmFwcGVyID0gbmV3IERlc2NyaWJhYmxlRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIoCi0JCQkJKERlc2NyaWJhYmxlRWxlbWVudCkgdmFsdWUsIG9iamVjdCwgZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCkpOwotCQkvLyB3cmFwcGVyLnNldENvbHVtbkluZGV4VG9OYW1lTWFwKGNvbHVtbkluZGV4VG9OYW1lTWFwKTsKLQkJcmV0dXJuIHdyYXBwZXI7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldENoaWxkcmVuKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JLy8gcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCS8vIENvbXBvc2l0ZVJvbGUgY29tcG9zaXRlUm9sZSA9IChDb21wb3NpdGVSb2xlKSBvYmplY3Q7Ci0JLy8gQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkgPSBnZXRSb290QWRhcHRlckZhY3RvcnkoKTsKLQkvLyBDb2xsZWN0aW9uIGNoaWxkcmVuID0gbmV3IEFycmF5TGlzdCgpOwotCS8vIGZvciAoSXRlcmF0b3IgaXRlciA9IGNvbXBvc2l0ZVJvbGUuZ2V0QWdncmVnYXRlZFJvbGVzKCkuaXRlcmF0b3IoKTsKLQkvLyBpdGVyLmhhc05leHQoKTspIHsKLQkvLyBjaGlsZHJlbi5hZGQobmV3Ci0JLy8gRGVzY3JpYmFibGVFbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcigoRGVzY3JpYmFibGVFbGVtZW50KSBpdGVyLm5leHQoKSwKLQkvLyB0aGlzLCBhZGFwdGVyRmFjdG9yeSkpOwotCS8vIH0KLQkvLyByZXR1cm4gY2hpbGRyZW47Ci0JLy8gfQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNjcmVhdGVEcmFnQW5kRHJvcENvbW1hbmQob3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW4sCi0JICogICAgICBqYXZhLmxhbmcuT2JqZWN0LCBmbG9hdCwgaW50LCBpbnQsIGphdmEudXRpbC5Db2xsZWN0aW9uKQotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGNyZWF0ZURyYWdBbmREcm9wQ29tbWFuZChFZGl0aW5nRG9tYWluIGRvbWFpbiwKLQkJCU9iamVjdCBvd25lciwgZmxvYXQgbG9jYXRpb24sIGludCBvcGVyYXRpb25zLCBpbnQgb3BlcmF0aW9uLAotCQkJQ29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXJldHVybiBuZXcgT0JTRHJhZ0FuZERyb3BDb21tYW5kKGRvbWFpbiwgb3duZXIsIGxvY2F0aW9uLCBvcGVyYXRpb25zLAotCQkJCW9wZXJhdGlvbiwgY29sbGVjdGlvbik7Ci0JfQotCi0JcHVibGljIEdlbmVyaWNEcm9wQ29tbWFuZC5FbGVtZW50QWRhcHRlciBjcmVhdGVEcm9wQWRhcHRlcigpIHsKLQkJaWYgKGRyb3BBZGFwdGVyID09IG51bGwpIHsKLQkJCWRyb3BBZGFwdGVyID0gbmV3IEdlbmVyaWNEcm9wQ29tbWFuZC5FbGVtZW50QWRhcHRlcigpIHsKLQotCQkJCXB1YmxpYyBPYmplY3QgYWRhcHQoT2JqZWN0IGRyb3BFbGVtZW50KSB7Ci0JCQkJCWlmIChkcm9wRWxlbWVudCBpbnN0YW5jZW9mIFJvbGUKLQkJCQkJCQkmJiAhKChDb21wb3NpdGVSb2xlKSBnZXRUYXJnZXQoKSkKLQkJCQkJCQkJCS5nZXRBZ2dyZWdhdGVkUm9sZXMoKS5jb250YWlucyhkcm9wRWxlbWVudCkpIHsKLQkJCQkJCXJldHVybiBkcm9wRWxlbWVudDsKLQkJCQkJfQotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0KLQkJCX07Ci0JCX0KLQkJcmV0dXJuIGRyb3BBZGFwdGVyOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL0NvbXBvc2l0ZVJvbGVXcmFwcGVySXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvQ29tcG9zaXRlUm9sZVdyYXBwZXJJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzUwNjJiZi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvQ29tcG9zaXRlUm9sZVdyYXBwZXJJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2VzczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db21wb3NpdGVSb2xlOwotCi0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIENvbXBvc2l0ZVJvbGVXcmFwcGVySXRlbVByb3ZpZGVyIGV4dGVuZHMKLQkJUm9sZURlc2NyaXB0b3JXcmFwcGVySXRlbVByb3ZpZGVyIHsKLQotCS8qKgotCSAqIEBwYXJhbSByb2xlCi0JICogQHBhcmFtIG93bmVyCi0JICogQHBhcmFtIGZlYXR1cmUKLQkgKiBAcGFyYW0gaW5kZXgKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgQ29tcG9zaXRlUm9sZVdyYXBwZXJJdGVtUHJvdmlkZXIoQ29tcG9zaXRlUm9sZSByb2xlLCBPYmplY3Qgb3duZXIsCi0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgaW50IGluZGV4LCBBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihyb2xlLCBvd25lciwgZmVhdHVyZSwgaW5kZXgsIGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9EZWxpdmVyYWJsZURlc2NyaXB0b3JXcmFwcGVySXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvRGVsaXZlcmFibGVEZXNjcmlwdG9yV3JhcHBlckl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMjJiMTJhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9EZWxpdmVyYWJsZURlc2NyaXB0b3JXcmFwcGVySXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yOwotCi0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBEZWxpdmVyYWJsZURlc2NyaXB0b3JXcmFwcGVySXRlbVByb3ZpZGVyIGV4dGVuZHMKLQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yV3JhcHBlckl0ZW1Qcm92aWRlciB7Ci0KLQkvKioKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiBAcGFyYW0gb3duZXIKLQkgKiBAcGFyYW0gaW5kZXgKLQkgKiBAcGFyYW0gZmVhdHVyZQotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqLwotCXB1YmxpYyBEZWxpdmVyYWJsZURlc2NyaXB0b3JXcmFwcGVySXRlbVByb3ZpZGVyKAotCQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yIHZhbHVlLCBPYmplY3Qgb3duZXIsCi0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgaW50IGluZGV4LCBBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcih2YWx1ZSwgb3duZXIsIGZlYXR1cmUsIGluZGV4LCBhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvRGVzY3JpYmFibGVFbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL0Rlc2NyaWJhYmxlRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzAzMzgzOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvRGVzY3JpYmFibGVFbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2VzczsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuRGVsZWdhdGluZ1dyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUYWJsZUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JV3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLlN0clV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklBY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JUmVzb3VyY2VBd2FyZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlByZWRlY2Vzc29yTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaWJhYmxlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M7Ci0KLQotLyoqCi0gKiBXcmFwcGVyIGl0ZW0gcHJvdmlkZXIgZm9yIERlc2NyaWJsZUVsZW1lbnQKLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIERlc2NyaWJhYmxlRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIgZXh0ZW5kcwotCQlEZWxlZ2F0aW5nV3JhcHBlckl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzIElCU0l0ZW1Qcm92aWRlciwKLQkJSVRhYmxlSXRlbUxhYmVsUHJvdmlkZXIgewotCi0JcHJpdmF0ZSBpbnQgaWQ7Ci0KLQlwcml2YXRlIE9iamVjdCB0b3BJdGVtOwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gcmVhZE9ubHkgPSB0cnVlOwotCQotCXByb3RlY3RlZCBib29sZWFuIGlzSW5oZXJpdGVkID0gZmFsc2U7Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gY29udHJpYnV0ZWQgPSBmYWxzZTsKLQkKLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1JvbGx1cENoaWxkID0gZmFsc2U7Ci0JCi0JLyoqCi0JICogQHBhcmFtIHZhbHVlCi0JICogQHBhcmFtIG93bmVyCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICovCi0JcHVibGljIERlc2NyaWJhYmxlRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIoRGVzY3JpYmFibGVFbGVtZW50IHZhbHVlLAotCQkJT2JqZWN0IG93bmVyLCBBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQl0aGlzKHZhbHVlLCBvd25lciwgbnVsbCwgQ29tbWFuZFBhcmFtZXRlci5OT19JTkRFWCwgYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSB2YWx1ZQotCSAqIEBwYXJhbSBvd25lcgotCSAqIEBwYXJhbSBmZWF0dXJlCi0JICogQHBhcmFtIGluZGV4Ci0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICovCi0JcHVibGljIERlc2NyaWJhYmxlRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIoRGVzY3JpYmFibGVFbGVtZW50IHZhbHVlLAotCQkJT2JqZWN0IG93bmVyLCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgaW50IGluZGV4LAotCQkJQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIodmFsdWUsIG93bmVyLCBmZWF0dXJlLCBpbmRleCwgYWRhcHRlckZhY3RvcnkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgRGVzY3JpYmFibGVFbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcihPYmplY3QgdmFsdWUsCi0JCQlPYmplY3Qgb3duZXIsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBpbnQgaW5kZXgsCi0JCQlBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcih2YWx1ZSwgb3duZXIsIGZlYXR1cmUsIGluZGV4LCBhZGFwdGVyRmFjdG9yeSk7Ci0JfQkKLQotCS8qKgotCSAqIENoZWNrcyBpZiB0aGlzIHdyYXBwZXIgaXMgcmVhZC1vbmx5Ci0JICovCi0JcHVibGljIGJvb2xlYW4gaXNSZWFkT25seSgpIHsKLQkJcmV0dXJuIHJlYWRPbmx5OwotCX0KLQkKLQkvKioKLQkgKiBAcGFyYW0gcmVhZE9ubHkKLQkgKiAgICAgICAgICAgIFRoZSByZWFkT25seSB0byBzZXQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmVhZE9ubHkoYm9vbGVhbiByZWFkT25seSkgewotCQl0aGlzLnJlYWRPbmx5ID0gcmVhZE9ubHk7Ci0JfQkKLQotCS8qKgotCSAqIEByZXR1cm4gdGhlIGNvbnRyaWJ1dGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNDb250cmlidXRlZCgpIHsKLQkJcmV0dXJuIGNvbnRyaWJ1dGVkOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzSW5oZXJpdGVkKCkgewotCQlyZXR1cm4gaXNJbmhlcml0ZWQ7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGlzUm9sbHVwQ2hpbGQoKSB7Ci0JCXJldHVybiBpc1JvbGx1cENoaWxkOwotCX0KLQkKLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuSUJTSXRlbVByb3ZpZGVyI2dldElkKCkKLQkgKi8KLQlwdWJsaWMgaW50IGdldElkKCkgewotCQlyZXR1cm4gaWQ7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLklCU0l0ZW1Qcm92aWRlciNzZXRJZChpbnQpCi0JICovCi0JcHVibGljIHZvaWQgc2V0SWQoaW50IGlkKSB7Ci0JCXRoaXMuaWQgPSBpZDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuSUJTSXRlbVByb3ZpZGVyI3NldFBhcmVudChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBhcmVudChPYmplY3Qgb2JqKSB7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLklCU0l0ZW1Qcm92aWRlciNnZXRUb3BJdGVtKCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFRvcEl0ZW0oKSB7Ci0JCU9iamVjdCBwYXJlbnQgPSBnZXRQYXJlbnQobnVsbCk7Ci0JCWlmICh0b3BJdGVtID09IG51bGwgJiYgcGFyZW50ICE9IG51bGwpIHsKLQkJCUlCU0l0ZW1Qcm92aWRlciBhZGFwdGVyID0gKElCU0l0ZW1Qcm92aWRlcikgZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCkKLQkJCQkJLmFkYXB0KHBhcmVudCwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCWlmIChhZGFwdGVyICE9IG51bGwpIHsKLQkJCQlPYmplY3QgdG9wID0gYWRhcHRlci5nZXRUb3BJdGVtKCk7Ci0JCQkJaWYgKHRvcCA9PSBudWxsICYmIHBhcmVudCBpbnN0YW5jZW9mIFByb2Nlc3MKLQkJCQkJCSYmICgoUHJvY2VzcykgcGFyZW50KS5nZXRTdXBlckFjdGl2aXRpZXMoKSA9PSBudWxsKSB7Ci0JCQkJCXRvcCA9IHBhcmVudDsKLQkJCQkJYWRhcHRlci5zZXRUb3BJdGVtKHRvcCk7Ci0JCQkJfQotCQkJCXJldHVybiB0b3A7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRvcEl0ZW07Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLklCU0l0ZW1Qcm92aWRlciNzZXRUb3BJdGVtKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgc2V0VG9wSXRlbShPYmplY3QgdG9wKSB7Ci0JCXRvcEl0ZW0gPSB0b3A7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLklCU0l0ZW1Qcm92aWRlciNpc1JvbGxlZFVwKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1JvbGxlZFVwKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLklCU0l0ZW1Qcm92aWRlciNzZXRSb2xsZWRVcChib29sZWFuKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJvbGxlZFVwKGJvb2xlYW4gYikgewotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5JQlNJdGVtUHJvdmlkZXIjaXNGaXJzdEVsZW1lbnQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0ZpcnN0RWxlbWVudChPYmplY3Qgb2JqKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuSUJTSXRlbVByb3ZpZGVyI2lzTGFzdEVsZW1lbnQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0xhc3RFbGVtZW50KE9iamVjdCBvYmopIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5JQlNJdGVtUHJvdmlkZXIjZ2V0RmlsdGVyZWRCcmVha2Rvd25FbGVtZW50cyhqYXZhLmxhbmcuT2JqZWN0LAotCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRGaWx0ZXJlZEJyZWFrZG93bkVsZW1lbnRzKE9iamVjdCBhY3Rpdml0eU9iaiwgT2JqZWN0IG9iaikgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuSUJTSXRlbVByb3ZpZGVyI21vdmVVcChqYXZhLmxhbmcuT2JqZWN0LAotCSAqICAgICAgY29tLmlibS5saWJyYXJ5LmVkaXQuY29tbWFuZC5JQWN0aW9uTWFuYWdlcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBtb3ZlVXAoT2JqZWN0IG9iaiwgSUFjdGlvbk1hbmFnZXIgYWN0aW9uTWdyKSB7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLklCU0l0ZW1Qcm92aWRlciNtb3ZlRG93bihqYXZhLmxhbmcuT2JqZWN0LAotCSAqICAgICAgY29tLmlibS5saWJyYXJ5LmVkaXQuY29tbWFuZC5JQWN0aW9uTWFuYWdlcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBtb3ZlRG93bihPYmplY3Qgb2JqLCBJQWN0aW9uTWFuYWdlciBhY3Rpb25NZ3IpIHsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuSUJTSXRlbVByb3ZpZGVyI2dldEVDbGFzc2VzKCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRFQ2xhc3NlcygpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLklCU0l0ZW1Qcm92aWRlciNnZXRBdHRyaWJ1dGUoamF2YS5sYW5nLk9iamVjdCwKLQkgKiAgICAgIGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRBdHRyaWJ1dGUoT2JqZWN0IG9iamVjdCwgU3RyaW5nIHByb3BlcnR5KSB7Ci0JCURlc2NyaWJhYmxlRWxlbWVudCBlID0gKERlc2NyaWJhYmxlRWxlbWVudCkgVG5nVXRpbC51bndyYXAob2JqZWN0KTsKLQkJaWYgKHByb3BlcnR5ID09IElCU0l0ZW1Qcm92aWRlci5DT0xfTkFNRSkgewotCQkJcmV0dXJuIGUuZ2V0TmFtZSgpOwotCQl9IGVsc2UgaWYgKHByb3BlcnR5ID09IElCU0l0ZW1Qcm92aWRlci5DT0xfSUQpIHsKLQkJCXJldHVybiBTdHJpbmcudmFsdWVPZihpZCk7Ci0JCX0gZWxzZSBpZiAocHJvcGVydHkgPT0gSUJTSXRlbVByb3ZpZGVyLkNPTF9QUkVTRU5UQVRJT05fTkFNRSkgewotCQkJU3RyaW5nIG5hbWUgPSBlLmdldFByZXNlbnRhdGlvbk5hbWUoKTsKLQkJCWlmIChTdHJVdGlsLmlzQmxhbmsobmFtZSkpIHsKLQkJCQluYW1lID0gZS5nZXROYW1lKCk7Ci0JCQl9Ci0JCQlyZXR1cm4gbmFtZTsKLQkJfQotCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuSUJTSXRlbVByb3ZpZGVyI3NldEF0dHJpYnV0ZShqYXZhLmxhbmcuT2JqZWN0LAotCSAqICAgICAgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBdHRyaWJ1dGUoT2JqZWN0IG9iamVjdCwgU3RyaW5nIHByb3BlcnR5LCBTdHJpbmcgdGV4dFZhbHVlKSB7Ci0KLQl9Ci0KLQkvLyAvKiAobm9uLUphdmFkb2MpCi0JLy8gKiBAc2VlCi0JLy8gY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5JQ29sdW1uQXdhcmUjc2V0Q29sdW1uSW5kZXhUb05hbWVNYXAoamF2YS51dGlsLk1hcCkKLQkvLyAqLwotCS8vIHB1YmxpYyB2b2lkIHNldENvbHVtbkluZGV4VG9OYW1lTWFwKE1hcCBtYXApIHsKLQkvLyBpZiAobWFwICE9IG51bGwpCi0JLy8gewotCS8vIGNvbHVtbkluZGV4VG9OYW1lTWFwID0gbWFwOwotCS8vIGNvbHVtbkluZGV4VG9OYW1lTWFwQ2hhbmdlZCA9IHRydWU7Ci0JLy8gfQotCS8vIH0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5JQlNJdGVtUHJvdmlkZXIjZ2V0UHJlZGVjZXNzb3JzKCkKLQkgKi8KLQlwdWJsaWMgUHJlZGVjZXNzb3JMaXN0IGdldFByZWRlY2Vzc29ycygpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLklCU0l0ZW1Qcm92aWRlciNpc0V4cGFuZGVkKCkKLQkgKi8KLQlwdWJsaWMgQm9vbGVhbiBpc0V4cGFuZGVkKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuSUJTSXRlbVByb3ZpZGVyI3NldEV4cGFuZGVkKGphdmEubGFuZy5Cb29sZWFuKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEV4cGFuZGVkKEJvb2xlYW4gYikgewotCX0KLQkKLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkRlbGVnYXRpbmdXcmFwcGVySXRlbVByb3ZpZGVyI2NyZWF0ZVdyYXBwZXIoamF2YS5sYW5nLk9iamVjdCwKLQkgKiAgICAgIGphdmEubGFuZy5PYmplY3QsIG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5KQotCSAqLwotCXByb3RlY3RlZCBJV3JhcHBlckl0ZW1Qcm92aWRlciBjcmVhdGVXcmFwcGVyKE9iamVjdCB2YWx1ZSwgT2JqZWN0IG93bmVyLAotCQkJQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJSVdyYXBwZXJJdGVtUHJvdmlkZXIgd2lwID0gZG9DcmVhdGVXcmFwcGVyKHZhbHVlLCBvd25lciwgYWRhcHRlckZhY3RvcnkpOwotCQlpZih3aXAgaW5zdGFuY2VvZiBEZXNjcmliYWJsZUVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSB7Ci0JCQlEZXNjcmliYWJsZUVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyIHdyYXBwZXIgPSAoRGVzY3JpYmFibGVFbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgd2lwOwotCQkJaWYgKHZhbHVlIGluc3RhbmNlb2YgRGVsZWdhdGluZ1dyYXBwZXJJdGVtUHJvdmlkZXIpIHsKLQkJCQl3cmFwcGVyLmZlYXR1cmUgPSAoKERlbGVnYXRpbmdXcmFwcGVySXRlbVByb3ZpZGVyKSB2YWx1ZSkKLQkJCQkuZ2V0RmVhdHVyZSgpOwotCQkJfQotCQkJd3JhcHBlci5zZXRSZWFkT25seShyZWFkT25seSk7Ci0JCQl3cmFwcGVyLmlzUm9sbHVwQ2hpbGQgPSBpc1JvbGx1cENoaWxkOwotCQkJd3JhcHBlci5pc0luaGVyaXRlZCA9IGlzSW5oZXJpdGVkOwotCQkJd3JhcHBlci5jb250cmlidXRlZCA9IGlzQ29udHJpYnV0ZWQoKTsKLQkJfQkJCi0JCXJldHVybiB3aXA7Ci0JfQotCQotCXByb3RlY3RlZCBJV3JhcHBlckl0ZW1Qcm92aWRlciBkb0NyZWF0ZVdyYXBwZXIoT2JqZWN0IHZhbHVlLCBPYmplY3Qgb3duZXIsCi0JCQlBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlPYmplY3QgZSA9IFRuZ1V0aWwudW53cmFwKHZhbHVlKTsKLQkJaWYgKGUgaW5zdGFuY2VvZiBEZXNjcmliYWJsZUVsZW1lbnQpIHsKLQkJCURlc2NyaWJhYmxlRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIgd3JhcHBlciA9IG5ldyBEZXNjcmliYWJsZUVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKAotCQkJCQkoRGVzY3JpYmFibGVFbGVtZW50KSBlLCBvd25lciwgYWRhcHRlckZhY3RvcnkpOwotCQkJcmV0dXJuIHdyYXBwZXI7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmNyZWF0ZVdyYXBwZXIodmFsdWUsIG93bmVyLCBhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVGFibGVJdGVtTGFiZWxQcm92aWRlciNnZXRDb2x1bW5JbWFnZShqYXZhLmxhbmcuT2JqZWN0LAotCSAqICAgICAgaW50KQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0Q29sdW1uSW1hZ2UoT2JqZWN0IG9iamVjdCwgaW50IGNvbHVtbkluZGV4KSB7Ci0JCWlmIChkZWxlZ2F0ZUl0ZW1Qcm92aWRlciBpbnN0YW5jZW9mIElUYWJsZUl0ZW1MYWJlbFByb3ZpZGVyKSB7Ci0JCQlyZXR1cm4gKChJVGFibGVJdGVtTGFiZWxQcm92aWRlcikgZGVsZWdhdGVJdGVtUHJvdmlkZXIpCi0JCQkJCS5nZXRDb2x1bW5JbWFnZShvYmplY3QsIGNvbHVtbkluZGV4KTsKLQkJfQotCQlpZiAoY29sdW1uSW5kZXggPT0gMAotCQkJCSYmIGRlbGVnYXRlSXRlbVByb3ZpZGVyIGluc3RhbmNlb2YgSUl0ZW1MYWJlbFByb3ZpZGVyKSB7Ci0JCQlyZXR1cm4gKChJSXRlbUxhYmVsUHJvdmlkZXIpIGRlbGVnYXRlSXRlbVByb3ZpZGVyKS5nZXRJbWFnZShvYmplY3QpOwotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRDb2x1bW5OYW1lKGludCBjb2x1bW5JbmRleCkgewotCQlBZGFwdGVyRmFjdG9yeSByb290QWRhcHRlckZhY3RvcnkgPSBnZXRSb290QWRhcHRlckZhY3RvcnkoKTsKLQkJaWYgKHJvb3RBZGFwdGVyRmFjdG9yeSBpbnN0YW5jZW9mIElDb2x1bW5Bd2FyZSkgewotCQkJTWFwIGNvbHVtbkluZGV4VG9OYW1lTWFwID0gKChJQ29sdW1uQXdhcmUpIHJvb3RBZGFwdGVyRmFjdG9yeSkKLQkJCQkJLmdldENvbHVtbkluZGV4VG9OYW1lTWFwKCk7Ci0JCQlpZiAoY29sdW1uSW5kZXhUb05hbWVNYXAgIT0gbnVsbCkgewotCQkJCXJldHVybiAoU3RyaW5nKSBjb2x1bW5JbmRleFRvTmFtZU1hcC5nZXQobmV3IEludGVnZXIoCi0JCQkJCQljb2x1bW5JbmRleCkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRhYmxlSXRlbUxhYmVsUHJvdmlkZXIjZ2V0Q29sdW1uVGV4dChqYXZhLmxhbmcuT2JqZWN0LAotCSAqICAgICAgaW50KQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uVGV4dChPYmplY3Qgb2JqZWN0LCBpbnQgY29sdW1uSW5kZXgpIHsKLQkJLy8gU3RyaW5nIGNvbE5hbWUgPSAoU3RyaW5nKSBjb2x1bW5JbmRleFRvTmFtZU1hcC5nZXQobmV3Ci0JCS8vIEludGVnZXIoY29sdW1uSW5kZXgpKTsKLQkJU3RyaW5nIGNvbE5hbWUgPSBnZXRDb2x1bW5OYW1lKGNvbHVtbkluZGV4KTsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZShvYmplY3QsIGNvbE5hbWUpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5JQlNJdGVtUHJvdmlkZXIjZ2V0TGlzdGVuZXJzKCkKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRMaXN0ZW5lcnMoKSB7Ci0JCWlmIChjaGFuZ2VOb3RpZmllciA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KChMaXN0KSBjaGFuZ2VOb3RpZmllcik7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5JTWV0aG9kRWxlbWVudEl0ZW1Qcm92aWRlciNnZXRDaGlsZHJlbkZlYXR1cmVzKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5GZWF0dXJlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5JQlNJdGVtUHJvdmlkZXIjY3JlYXRlRHJvcENvbW1hbmQoamF2YS5sYW5nLk9iamVjdCwKLQkgKiAgICAgIGphdmEudXRpbC5MaXN0KQotCSAqLwotCXB1YmxpYyBJUmVzb3VyY2VBd2FyZUNvbW1hbmQgY3JlYXRlRHJvcENvbW1hbmQoT2JqZWN0IG93bmVyLAotCQkJTGlzdCBkcm9wRWxlbWVudHMpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJT2JqZWN0IG8gPSBUbmdVdGlsLnVud3JhcCh0aGlzKTsKLQkJcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCkgKyAiICh3cmFwcGVkIG9iamVjdDogIiArIG8gKyAiKSI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9EZXNjcmlwdG9ySXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvRGVzY3JpcHRvckl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NDI3ZjBlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9EZXNjcmlwdG9ySXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzOwotCi1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuUHJvY2Vzc1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaWJhYmxlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3I7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRGVzY3JpcHRvckl0ZW1Qcm92aWRlciBleHRlbmRzIEJyZWFrZG93bkVsZW1lbnRJdGVtUHJvdmlkZXIgewotCi0JLyoqCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICogQHBhcmFtIGRlbGVnYXRlSXRlbVByb3ZpZGVyCi0JICovCi0JcHVibGljIERlc2NyaXB0b3JJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksCi0JCQlJdGVtUHJvdmlkZXJBZGFwdGVyIGRlbGVnYXRlSXRlbVByb3ZpZGVyKSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5LCBkZWxlZ2F0ZUl0ZW1Qcm92aWRlcik7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkJyZWFrZG93bkVsZW1lbnRJdGVtUHJvdmlkZXIjZ2V0QXR0cmlidXRlKGphdmEubGFuZy5PYmplY3QsCi0JICogICAgICBqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0cmlidXRlKE9iamVjdCBvYmplY3QsIFN0cmluZyBwcm9wZXJ0eSkgewotCQlpZiAocHJvcGVydHkgPT0gSUJTSXRlbVByb3ZpZGVyLkNPTF9NT0RFTF9JTkZPKSB7Ci0JCQlTdHJpbmdCdWZmZXIgbW9kZWxJbmZvID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJT2JqZWN0IGUgPSBQcm9jZXNzVXRpbC5nZXRBc3NvY2lhdGVkRWxlbWVudCgoRGVzY3JpcHRvcikgb2JqZWN0KTsKLQkJCWlmIChlIGluc3RhbmNlb2YgVmFyaWFiaWxpdHlFbGVtZW50KSB7Ci0JCQkJVmFyaWFiaWxpdHlFbGVtZW50IHZlID0gKFZhcmlhYmlsaXR5RWxlbWVudCkgZTsKLQkJCQlPYmplY3QgYmFzZSA9IHZlLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsKLQkJCQlpZiAoYmFzZSAhPSBudWxsKSB7Ci0JCQkJCS8vIGxvb2sgZm9yIGV4aXN0aW5nIGRlc2NyaXB0b3IgdGhhdCBpcyBhc3NvY2lhdGVkIHdpdGggdGhlCi0JCQkJCS8vIGJhc2UgaW4gdGhlIGFjdGl2aXR5Ci0JCQkJCS8vCi0JCQkJCU9iamVjdCBwYXJlbnQgPSBudWxsOwotCQkJCQlmb3IgKHBhcmVudCA9IGdldFBhcmVudChvYmplY3QpOyBwYXJlbnQgIT0gbnVsbAotCQkJCQkJCSYmICEocGFyZW50IGluc3RhbmNlb2YgQWN0aXZpdHkpOykgewotCQkJCQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyIGFkYXB0ZXIgPSAoSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyKSBnZXRSb290QWRhcHRlckZhY3RvcnkoKQotCQkJCQkJCQkuYWRhcHQocGFyZW50LCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkJCQkJcGFyZW50ID0gYWRhcHRlci5nZXRQYXJlbnQocGFyZW50KTsKLQkJCQkJfQotCQkJCQlpZiAocGFyZW50ICE9IG51bGwpIHsKLQkJCQkJCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciBhZGFwdGVyID0gKElUcmVlSXRlbUNvbnRlbnRQcm92aWRlcikgZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCkKLQkJCQkJCQkJLmFkYXB0KHBhcmVudCwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCQkJCU9iamVjdCBkZXNjID0gbnVsbDsKLQkJCQkJCWZpbmRfZGVzY3JpcHRvcl9sb29wOiBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBhZGFwdGVyCi0JCQkJCQkJCS5nZXRDaGlsZHJlbihwYXJlbnQpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQkJCU9iamVjdCBjaGlsZCA9IFRuZ1V0aWwudW53cmFwKGl0ZXIubmV4dCgpKTsKLQkJCQkJCQlpZiAoY2hpbGQgaW5zdGFuY2VvZiBEZXNjcmlwdG9yCi0JCQkJCQkJCQkmJiBQcm9jZXNzVXRpbAotCQkJCQkJCQkJCQkuZ2V0QXNzb2NpYXRlZEVsZW1lbnQoKERlc2NyaXB0b3IpIGNoaWxkKSA9PSBiYXNlKSB7Ci0JCQkJCQkJCWRlc2MgPSBjaGlsZDsKLQkJCQkJCQkJYnJlYWsgZmluZF9kZXNjcmlwdG9yX2xvb3A7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJaWYgKGRlc2MgIT0gbnVsbCkgewotCQkJCQkJCVN0cmluZyBzdHIgPSBudWxsOwotCQkJCQkJCWlmICh2ZS5nZXRWYXJpYWJpbGl0eVR5cGUoKSA9PSBWYXJpYWJpbGl0eVR5cGUuRVhURU5EUykgewotCQkJCQkJCQlzdHIgPSBMaWJyYXJ5RWRpdFJlc291cmNlcy5wcm9jZXNzX2V4dGVuZHM7IAotCQkJCQkJCX0gZWxzZSBpZiAodmUuZ2V0VmFyaWFiaWxpdHlUeXBlKCkgPT0gVmFyaWFiaWxpdHlUeXBlLlJFUExBQ0VTKSB7Ci0JCQkJCQkJCXN0ciA9IExpYnJhcnlFZGl0UmVzb3VyY2VzLnByb2Nlc3NfcmVwbGFjZXM7IAotCQkJCQkJCX0KLQkJCQkJCQlTdHJpbmcgbmFtZSA9ICgoRGVzY3JpYmFibGVFbGVtZW50KSBkZXNjKQotCQkJCQkJCQkJLmdldFByZXNlbnRhdGlvbk5hbWUoKTsKLQkJCQkJCQlpZiAoc3RyICE9IG51bGwpCi0JCQkJCQkJCW1vZGVsSW5mby5hcHBlbmQoTWVzc2FnZUZvcm1hdC5mb3JtYXQoc3RyLAotCQkJCQkJCQkJCW5ldyBPYmplY3RbXSB7IG5hbWUgfSkpOwotCQkJCQkJCWVsc2UKLQkJCQkJCQkJbW9kZWxJbmZvLmFwcGVuZCgiIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQotCQkJCWlmIChvYmplY3QgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3IpIHsKLS8vCQkJCQlQcm9jZXNzVXRpbC5nZXRNb2RlbEluZm9Gb3JXb3JrUHJvZHVjdERlc2NyaXB0b3IobW9kZWxJbmZvLAotLy8JCQkJCQkJKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgb2JqZWN0KTsKLQkJCQkJUHJvY2Vzc1V0aWwuZ2V0V1BETW9kZWxJbmZvKG1vZGVsSW5mbywgb2JqZWN0LCB0aGlzKTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gbW9kZWxJbmZvLnRvU3RyaW5nKCk7IAotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRBdHRyaWJ1dGUob2JqZWN0LCBwcm9wZXJ0eSk7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL0lCU0l0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL0lCU0l0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZDZhMWYwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9JQlNJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3M7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSVN0YXRlZnVsSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JQWN0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSVJlc291cmNlQXdhcmVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5QcmVkZWNlc3Nvckxpc3Q7Ci0KLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBiYXNlIGludGVyZmFjZSBvZiBhbGwgaXRlbSBwcm92aWRlcnMgZm9yIGJyZWFrZG93biBlbGVtZW50IHVzZWQKLSAqIGJ5IHRoZSBQcm9jZXNzIEVkaXRvci4gSXQgZGVmaW5lcyB0aGUgY29uc3RhbnRzIGZvciBjb2x1bW4gbmFtZXMgYW5kIG1ldGhvZHMKLSAqIHRvIHN1cHBvcnQgcm93IGluZGV4LCByb2xsLXVwIHZpZXcsIGdldHRpbmcvc2V0dGluZyBicmVha2Rvd24gZWxlbWVudCdzCi0gKiBhdHRyaWJ1dGVzLCBwcmVkZWNlc3NvciBsaXN0Li4uCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUJTSXRlbVByb3ZpZGVyIGV4dGVuZHMgLy9JTGlicmFyeUl0ZW1Qcm92aWRlciwKLQkJSVN0YXRlZnVsSXRlbVByb3ZpZGVyIHsKLQotCS8qKiBDb2x1bW4gSUQgY29uc3RhbnRzICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09MX05BTUUgPSAibmFtZSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTF9QUkVGSVggPSAicHJlZml4IjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09MX0lEID0gImlkIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09MX1BSRURFQ0VTU09SUyA9ICJwcmVkZWNlc3NvcnMiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT0xfSVNfUkVQRUFUQUJMRSA9ICJpc19yZXBlYXRhYmxlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09MX0lTX09OR09JTkcgPSAiaXNfb25nb2luZyI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTF9JU19FVkVOVF9EUklWRU4gPSAiaXNfZXZlbnRfZHJpdmVuIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09MX0VOVFJZX1NUQVRFID0gImVudHJ5X3N0YXRlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09MX0VYSVRfU1RBVEUgPSAiZXhpdF9zdGF0ZSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTF9URUFNUyA9ICJ0ZWFtcyI7IC8vJE5PTi1OTFMtMSQgIAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09MX1RZUEUgPSAidHlwZSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTF9NT0RFTF9JTkZPID0gIm1vZGVsX2luZm8iOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT0xfUFJFU0VOVEFUSU9OX05BTUUgPSAicHJlc2VudGF0aW9uX25hbWUiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT0xfREVMSVZFUkFCTEUgPSAiZGVsaXZlcmFibGUiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT0xfSVNfT1BUSU9OQUwgPSAiaXNfb3B0aW9uYWwiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT0xfSVNfUExBTk5FRCA9ICJpc19wbGFubmVkIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09MX0hBU19NVUxUSVBMRV9PQ0NVUlJFTkNFUyA9ICJoYXNfbXVsdGlwbGVfb2NjdXJyZW5jZXMiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZ1tdIENPTFVNTlMgPSB7IENPTF9OQU1FLCBDT0xfUFJFRklYLCBDT0xfSUQsCi0JCQlDT0xfUFJFREVDRVNTT1JTLCBDT0xfSVNfUkVQRUFUQUJMRSwgQ09MX0lTX09OR09JTkcsCi0JCQlDT0xfSVNfRVZFTlRfRFJJVkVOLCBDT0xfRU5UUllfU1RBVEUsIENPTF9FWElUX1NUQVRFLCBDT0xfVEVBTVMsCi0JCQlDT0xfVFlQRSwgQ09MX01PREVMX0lORk8sIENPTF9QUkVTRU5UQVRJT05fTkFNRSwgQ09MX0RFTElWRVJBQkxFIH07Ci0JCi0JaW50IGdldElkKCk7Ci0KLQl2b2lkIHNldElkKGludCBpZCk7Ci0KLQkvLyBJQlNJdGVtUHJvdmlkZXIgZ2V0SXRlbVByb3ZpZGVyKEVPYmplY3QgZU9iaik7Ci0KLQl2b2lkIHNldFBhcmVudChPYmplY3Qgb2JqKTsKLQotCU9iamVjdCBnZXRUb3BJdGVtKCk7Ci0KLQl2b2lkIHNldFRvcEl0ZW0oT2JqZWN0IHRvcCk7Ci0KLQlib29sZWFuIGlzUm9sbGVkVXAoKTsKLQotCXZvaWQgc2V0Um9sbGVkVXAoYm9vbGVhbiBiKTsKLQotCWJvb2xlYW4gaXNGaXJzdEVsZW1lbnQoT2JqZWN0IG9iaik7Ci0KLQlib29sZWFuIGlzTGFzdEVsZW1lbnQoT2JqZWN0IG9iaik7Ci0KLQkvLyBMaXN0IGdldEZpbHRlcmVkQnJlYWtkb3duRWxlbWVudHMoT2JqZWN0IGFjdGl2aXR5T2JqLCBPYmplY3Qgb2JqKTsKLQotCXZvaWQgbW92ZVVwKE9iamVjdCBvYmosIElBY3Rpb25NYW5hZ2VyIGFjdGlvbk1ncik7Ci0KLQl2b2lkIG1vdmVEb3duKE9iamVjdCBvYmosIElBY3Rpb25NYW5hZ2VyIGFjdGlvbk1ncik7Ci0KLQlDb2xsZWN0aW9uIGdldEVDbGFzc2VzKCk7Ci0KLQkvLyBHcmFwaGljYWxEYXRhIGdldEdyYXBoaWNhbERhdGEoKTsKLQotCS8vIHZvaWQgc2V0R3JhcGhpY2FsRGF0YShHcmFwaGljYWxEYXRhIGRhdGEpOwotCi0JLyoqCi0JICogR2V0cyB0aGUgYXR0cmlidXRlIG9mIHRoZSBnaXZlbiBvYmplY3QgYXMgYSBzdHJpbmcuCi0JICogCi0JICogQHBhcmFtIG9iamVjdAotCSAqIEBwYXJhbSBwcm9wZXJ0eQotCSAqICAgICAgICAgICAgb25lIG9mIHRoZSBjb2x1bW4gSUQgY29uc3RhbnRzIENPTF9YWFgKLQkgKiBAcmV0dXJuIFN0cmluZyB2YWx1ZSBvZiB0aGUgYXR0cmlidXRlCi0JICovCi0JU3RyaW5nIGdldEF0dHJpYnV0ZShPYmplY3Qgb2JqZWN0LCBTdHJpbmcgcHJvcGVydHkpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgYXR0cmlidXRlIG9mIHRoZSBnaXZlbiBvYmplY3QKLQkgKiAKLQkgKiBAcGFyYW0gb2JqZWN0Ci0JICogQHBhcmFtIHByb3BlcnR5Ci0JICogICAgICAgICAgICBvbmUgb2YgdGhlIGNvbHVtbiBJRCBjb25zdGFudHMgQ09MX1hYWAotCSAqIEBwYXJhbSB0ZXh0VmFsdWUKLQkgKi8KLQl2b2lkIHNldEF0dHJpYnV0ZShPYmplY3Qgb2JqZWN0LCBTdHJpbmcgcHJvcGVydHksIFN0cmluZyB0ZXh0VmFsdWUpOwotCi0JTGlzdCBnZXRMaXN0ZW5lcnMoKTsKLQotCVByZWRlY2Vzc29yTGlzdCBnZXRQcmVkZWNlc3NvcnMoKTsKLQotCUJvb2xlYW4gaXNFeHBhbmRlZCgpOwotCi0Jdm9pZCBzZXRFeHBhbmRlZChCb29sZWFuIGIpOwotCi0JSVJlc291cmNlQXdhcmVDb21tYW5kIGNyZWF0ZURyb3BDb21tYW5kKE9iamVjdCBvd25lciwgTGlzdCBkcm9wRWxlbWVudHMpOwotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvSUJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyRmFjdG9yeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL0lCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjYxNjJkOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvSUJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JV3JhcHBlckl0ZW1Qcm92aWRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmludGVybmFsLkJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyRmFjdG9yeTsKLQotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyRmFjdG9yeSBleHRlbmRzIElXcmFwcGVySXRlbVByb3ZpZGVyRmFjdG9yeSB7Ci0JcHVibGljIHN0YXRpYyBJQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXJGYWN0b3J5IElOU1RBTkNFID0gbmV3IEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyRmFjdG9yeSgpOwotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL0lDb2x1bW5Bd2FyZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL0lDb2x1bW5Bd2FyZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYjM4MjBiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9JQ29sdW1uQXdhcmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2VzczsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKgotICogSW50ZXJmYWNlIHVzZWQgdG8gcGFzcyB0aGUgY29sdW1uIGluZGV4IC8gbmFtZSBtYXAgZnJvbSB0aGUgdXNlciBpbnRlcmZhY2UgdG8KLSAqIHRoZSBhZGFwdGVyIHRoYXQgaW1wbGVtZW50cyBpdCBzbyB0aGUgYWRhcHRlciBjYW4gcHJvdmlkZSB0aGUgY29ycmVjdCBkYXRhCi0gKiBmb3IgdGhlIGNvbHVtbnMgZXZlbiB0aGVpciBpbmRleCBoYXZlIGNoYW5nZWQuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUNvbHVtbkF3YXJlIHsKLQotCU1hcCBnZXRDb2x1bW5JbmRleFRvTmFtZU1hcCgpOwotCi0Jdm9pZCBzZXRDb2x1bW5JbmRleFRvTmFtZU1hcChNYXAgbWFwKTsKLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL0lQcm9jZXNzSXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvSVByb2Nlc3NJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTRjODQ2OC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvSVByb2Nlc3NJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2VzczsKLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElQcm9jZXNzSXRlbVByb3ZpZGVyIHsKLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDAwNTI1MS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3M7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRGlzcG9zYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVGFibGVJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSVN0YXRlZnVsSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuVW1hSXRlbVByb3ZpZGVyQWRhcHRlckZhY3Rvcnk7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkgZXh0ZW5kcyBVbWFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeQotCQlpbXBsZW1lbnRzIElDb2x1bW5Bd2FyZSB7Ci0KLQlwcml2YXRlIE1hcCBjb2x1bW5JbmRleFRvTmFtZU1hcDsKLQotCS8qKgotCSAqIFJlZmVyZW5jZXMgdG8gc3RhdGVmdWwgYWRhcHRlcnMgY3JlYXRlZCBieSB0aGlzIGFkYXB0ZXIgZmFjdG9yeQotCSAqLwotCXByaXZhdGUgU2V0IGRpc3Bvc2FibGVBZGFwdGVycyA9IG5ldyBIYXNoU2V0KCk7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSB7Ci0JCXN1cGVyKCk7Ci0JCXN1cHBvcnRlZFR5cGVzLmFkZChJVGFibGVJdGVtTGFiZWxQcm92aWRlci5jbGFzcyk7Ci0JCS8vIGNyZWF0ZWRBZGFwdGVycyA9IG5ldyBIYXNoU2V0KCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQnJlYWtkb3duQWRhcHRlckZhY3RvcnkjY3JlYXRlQWN0aXZpdHlBZGFwdGVyKCkKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVBY3Rpdml0eUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgQWN0aXZpdHlJdGVtUHJvdmlkZXIodGhpcyk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQnJlYWtkb3duQWRhcHRlckZhY3RvcnkjY3JlYXRlSXRlcmF0aW9uQWRhcHRlcigpCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlSXRlcmF0aW9uQWRhcHRlcigpIHsKLQkJcmV0dXJuIGNyZWF0ZUFjdGl2aXR5QWRhcHRlcigpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkJyZWFrZG93bkFkYXB0ZXJGYWN0b3J5I2NyZWF0ZVBoYXNlQWRhcHRlcigpCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUGhhc2VBZGFwdGVyKCkgewotCQlyZXR1cm4gY3JlYXRlQWN0aXZpdHlBZGFwdGVyKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQnJlYWtkb3duQWRhcHRlckZhY3RvcnkjY3JlYXRlQnJlYWtkb3duRWxlbWVudEFkYXB0ZXIoKQotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUJyZWFrZG93bkVsZW1lbnRBZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IEJyZWFrZG93bkVsZW1lbnRJdGVtUHJvdmlkZXIodGhpcywKLQkJCQkoSXRlbVByb3ZpZGVyQWRhcHRlcikgc3VwZXIuY3JlYXRlQnJlYWtkb3duRWxlbWVudEFkYXB0ZXIoKSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuRGVzY3JpcHRvcnNBZGFwdGVyRmFjdG9yeSNjcmVhdGVEZXNjcmlwdG9yQWRhcHRlcigpCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRGVzY3JpcHRvckFkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgRGVzY3JpcHRvckl0ZW1Qcm92aWRlcih0aGlzLCAoSXRlbVByb3ZpZGVyQWRhcHRlcikgVG5nVXRpbC51bWFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeQotCQkJCS5jcmVhdGVEZXNjcmlwdG9yQWRhcHRlcigpKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5EZXNjcmlwdG9yc0FkYXB0ZXJGYWN0b3J5I2NyZWF0ZVJvbGVEZXNjcmlwdG9yQWRhcHRlcigpCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUm9sZURlc2NyaXB0b3JBZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IFJvbGVEZXNjcmlwdG9ySXRlbVByb3ZpZGVyKHRoaXMsIChJdGVtUHJvdmlkZXJBZGFwdGVyKSBUbmdVdGlsLnVtYUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5Ci0JCQkJLmNyZWF0ZVJvbGVEZXNjcmlwdG9yQWRhcHRlcigpKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5EZXNjcmlwdG9yc0FkYXB0ZXJGYWN0b3J5I2NyZWF0ZVRhc2tEZXNjcmlwdG9yQWRhcHRlcigpCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlVGFza0Rlc2NyaXB0b3JBZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IFRhc2tEZXNjcmlwdG9ySXRlbVByb3ZpZGVyKHRoaXMsIChJdGVtUHJvdmlkZXJBZGFwdGVyKSBUbmdVdGlsLnVtYUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5Ci0JCQkJLmNyZWF0ZVRhc2tEZXNjcmlwdG9yQWRhcHRlcigpKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5EZXNjcmlwdG9yc0FkYXB0ZXJGYWN0b3J5I2NyZWF0ZVdvcmtQcm9kdWN0RGVzY3JpcHRvckFkYXB0ZXIoKQotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVdvcmtQcm9kdWN0RGVzY3JpcHRvckFkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgV29ya1Byb2R1Y3REZXNjcmlwdG9ySXRlbVByb3ZpZGVyKHRoaXMsCi0JCQkJKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIFRuZ1V0aWwudW1hSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkKLQkJCQkJCS5jcmVhdGVXb3JrUHJvZHVjdERlc2NyaXB0b3JBZGFwdGVyKCkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5JQ29sdW1uQXdhcmUjc2V0Q29sdW1uSW5kZXhUb05hbWVNYXAoamF2YS51dGlsLk1hcCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb2x1bW5JbmRleFRvTmFtZU1hcChNYXAgbWFwKSB7Ci0JCWlmIChtYXAgIT0gbnVsbCkgewotCQkJY29sdW1uSW5kZXhUb05hbWVNYXAgPSBtYXA7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGFkYXB0KE9iamVjdCBvYmplY3QsIE9iamVjdCB0eXBlKSB7Ci0JCU9iamVjdCBhZGFwdGVyID0gc3VwZXIuYWRhcHQob2JqZWN0LCB0eXBlKTsKLQkJaWYgKGFkYXB0ZXIgaW5zdGFuY2VvZiBJQ29sdW1uQXdhcmUpIHsKLQkJCSgoSUNvbHVtbkF3YXJlKSBhZGFwdGVyKQotCQkJCQkuc2V0Q29sdW1uSW5kZXhUb05hbWVNYXAoY29sdW1uSW5kZXhUb05hbWVNYXApOwotCQl9Ci0JCXJldHVybiBhZGFwdGVyOwotCX0KLQotCXB1YmxpYyBBZGFwdGVyIGFkYXB0KE5vdGlmaWVyIG5vdGlmaWVyLCBPYmplY3QgdHlwZSkgewotCQlBZGFwdGVyIGFkYXB0ZXIgPSBzdXBlci5hZGFwdChub3RpZmllciwgdHlwZSk7Ci0JCWlmIChhZGFwdGVyIGluc3RhbmNlb2YgSUNvbHVtbkF3YXJlKSB7Ci0JCQkoKElDb2x1bW5Bd2FyZSkgYWRhcHRlcikKLQkJCQkJLnNldENvbHVtbkluZGV4VG9OYW1lTWFwKGNvbHVtbkluZGV4VG9OYW1lTWFwKTsKLQkJfQotCQlpZiAoYWRhcHRlciBpbnN0YW5jZW9mIElTdGF0ZWZ1bEl0ZW1Qcm92aWRlcgotCQkJCSYmIG5vdGlmaWVyIGluc3RhbmNlb2YgRU9iamVjdAotCQkJCSYmICgoRU9iamVjdCkgbm90aWZpZXIpLmVDb250YWluZXIoKSAhPSBudWxsKSB7Ci0JCQlkaXNwb3NhYmxlQWRhcHRlcnMuYWRkKGFkYXB0ZXIpOwotCQl9Ci0JCXJldHVybiBhZGFwdGVyOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlByb2Nlc3N0eXBlc0FkYXB0ZXJGYWN0b3J5I2NyZWF0ZVByb2Nlc3NBZGFwdGVyKCkKLQkgKi8KLQkvLyBwdWJsaWMgQWRhcHRlciBjcmVhdGVQcm9jZXNzQWRhcHRlcigpIHsKLQkvLyByZXR1cm4gbmV3IFByb2Nlc3NJdGVtUHJvdmlkZXIodGhpcyk7Ci0JLy8gfQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5Qcm9jZXNzdHlwZXNJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSNjcmVhdGVEZWxpdmVyeVByb2Nlc3NBZGFwdGVyKCkKLQkgKi8KLQkvLyBwdWJsaWMgQWRhcHRlciBjcmVhdGVEZWxpdmVyeVByb2Nlc3NBZGFwdGVyKCkgewotCS8vIHJldHVybiBjcmVhdGVQcm9jZXNzQWRhcHRlcigpOwotCS8vIH0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuUHJvY2Vzc3R5cGVzSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkjY3JlYXRlQ2FwYWJpbGl0eVBhdHRlcm5BZGFwdGVyKCkKLQkgKi8KLQkvLyBwdWJsaWMgQWRhcHRlciBjcmVhdGVDYXBhYmlsaXR5UGF0dGVybkFkYXB0ZXIoKSB7Ci0JLy8gcmV0dXJuIGNyZWF0ZVByb2Nlc3NBZGFwdGVyKCk7Ci0JLy8gfQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVByb2Nlc3NDb21wb25lbnRBZGFwdGVyKCkgewotCQlpZiAocHJvY2Vzc0NvbXBvbmVudEl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlwcm9jZXNzQ29tcG9uZW50SXRlbVByb3ZpZGVyID0gbmV3IFByb2Nlc3NDb21wb25lbnRJdGVtUHJvdmlkZXIoCi0JCQkJCXRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIHByb2Nlc3NDb21wb25lbnRJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLlVtYUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5I2NyZWF0ZVByb2Nlc3NQYWNrYWdlQWRhcHRlcigpCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUHJvY2Vzc1BhY2thZ2VBZGFwdGVyKCkgewotCQlpZiAocHJvY2Vzc1BhY2thZ2VJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJcHJvY2Vzc1BhY2thZ2VJdGVtUHJvdmlkZXIgPSBuZXcgUHJvY2Vzc1BhY2thZ2VJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gcHJvY2Vzc1BhY2thZ2VJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLlVtYUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5I2NyZWF0ZUNvbXBvc2l0ZVJvbGVBZGFwdGVyKCkKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVDb21wb3NpdGVSb2xlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBDb21wb3NpdGVSb2xlSXRlbVByb3ZpZGVyKHRoaXMsIChJdGVtUHJvdmlkZXJBZGFwdGVyKSBUbmdVdGlsLnVtYUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5Ci0JCQkJLmNyZWF0ZUNvbXBvc2l0ZVJvbGVBZGFwdGVyKCkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5VbWFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSNjcmVhdGVSb2xlQWRhcHRlcigpCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUm9sZUFkYXB0ZXIoKSB7Ci0JCWlmIChyb2xlSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCXJvbGVJdGVtUHJvdmlkZXIgPSBuZXcgUm9sZUl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCQlyZXR1cm4gcm9sZUl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVXb3JrT3JkZXJBZGFwdGVyKCkgewotCQlpZiAod29ya09yZGVySXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCXdvcmtPcmRlckl0ZW1Qcm92aWRlciA9IG5ldyBXb3JrT3JkZXJJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQkJcmV0dXJuIHdvcmtPcmRlckl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuSUNvbHVtbkF3YXJlI2dldENvbHVtbkluZGV4VG9OYW1lTWFwKCkKLQkgKi8KLQlwdWJsaWMgTWFwIGdldENvbHVtbkluZGV4VG9OYW1lTWFwKCkgewotCQlyZXR1cm4gY29sdW1uSW5kZXhUb05hbWVNYXA7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLlVtYUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5I2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWlmICghZGlzcG9zYWJsZUFkYXB0ZXJzLmlzRW1wdHkoKSkgewotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gZGlzcG9zYWJsZUFkYXB0ZXJzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCUlEaXNwb3NhYmxlIGFkYXB0ZXIgPSAoSURpc3Bvc2FibGUpIGl0ZXIubmV4dCgpOwotCQkJCWFkYXB0ZXIuZGlzcG9zZSgpOwotCQkJfQotCQkJZGlzcG9zYWJsZUFkYXB0ZXJzLmNsZWFyKCk7Ci0JCX0KLQotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvTWlsZXN0b25lV3JhcHBlckl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL01pbGVzdG9uZVdyYXBwZXJJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTdjZTFmZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvTWlsZXN0b25lV3JhcHBlckl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1pbGVzdG9uZTsKLQotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBNaWxlc3RvbmVXcmFwcGVySXRlbVByb3ZpZGVyIGV4dGVuZHMKLQkJQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIgewotCi0JLyoqCi0JICogQHBhcmFtIHZhbHVlCi0JICogQHBhcmFtIG93bmVyCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICovCi0JcHVibGljIE1pbGVzdG9uZVdyYXBwZXJJdGVtUHJvdmlkZXIoTWlsZXN0b25lIHZhbHVlLCBPYmplY3Qgb3duZXIsCi0JCQlBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcih2YWx1ZSwgb3duZXIsIGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbWlsZXN0b25lCi0JICogQHBhcmFtIG93bmVyCi0JICogQHBhcmFtIGZlYXR1cmUKLQkgKiBAcGFyYW0gaW5kZXgKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgTWlsZXN0b25lV3JhcHBlckl0ZW1Qcm92aWRlcihNaWxlc3RvbmUgbWlsZXN0b25lLCBPYmplY3Qgb3duZXIsCi0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgaW50IGluZGV4LCBBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihtaWxlc3RvbmUsIG93bmVyLCBmZWF0dXJlLCBpbmRleCwgYWRhcHRlckZhY3RvcnkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL09CU0FjdGl2aXR5SXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvT0JTQWN0aXZpdHlJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjgzZTQ5Yy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvT0JTQWN0aXZpdHlJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3M7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVW5pcXVlRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuRGlzcG9zYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVdyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSVJlc291cmNlQXdhcmVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kLk9CU0RyYWdBbmREcm9wQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZC5PQlNEcm9wQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuQ29tcGFyYXRvcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlByb2Nlc3NVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWlsZXN0b25lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGVhbVByb2ZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQXNzb2NpYXRpb25IZWxwZXI7Ci0KLQotLyoqCi0gKiBJdGVtIHByb3ZpZGVyIGZvciBUZWFtIEFsbG9jYXRpb24gYWN0aXZpdHkKLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4wCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIE9CU0FjdGl2aXR5SXRlbVByb3ZpZGVyIGV4dGVuZHMgQlNBY3Rpdml0eUl0ZW1Qcm92aWRlciB7Ci0KLQlwcml2YXRlIERpc3Bvc2FibGUgcm9sbGVkVXBXcmFwcGVyczsKLQotCS8qKgotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqLwotCXB1YmxpYyBPQlNBY3Rpdml0eUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkJTQWN0aXZpdHlJdGVtUHJvdmlkZXIjY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoamF2YS51dGlsLkNvbGxlY3Rpb24sCi0JICogICAgICBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywKLQkJCU9iamVjdCBvYmplY3QpIHsKLQkJLy8gQWN0aXZpdHkgYWN0ID0gKEFjdGl2aXR5KSBvYmplY3Q7Ci0JCS8vIGlmKGhhc0NoaWxkRGVzY3JpcHRvcihhY3QpKSB7Ci0JCS8vIG5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkCi0JCS8vIChjcmVhdGVDaGlsZFBhcmFtZXRlcgotCQkvLyAoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QWN0aXZpdHlfQnJlYWtkb3duRWxlbWVudHMoKSwKLQkJLy8gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUm9sZURlc2NyaXB0b3IoKSkpOwotCQkvLyAgICAJCQotCQkvLyBuZXdDaGlsZERlc2NyaXB0b3JzLmFkZAotCQkvLyAoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIKLQkJLy8gKFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEFjdGl2aXR5X0JyZWFrZG93bkVsZW1lbnRzKCksCi0JCS8vIFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVRlYW1Qcm9maWxlKCkpKTsKLQkJLy8KLQkJLy8gfQotCQkvLyBlbHNlIHsKLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0QWN0aXZpdHlfQnJlYWtkb3duRWxlbWVudHMoKSwgVW1hRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkuY3JlYXRlUGhhc2UoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldEFjdGl2aXR5X0JyZWFrZG93bkVsZW1lbnRzKCksIFVtYUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJLmNyZWF0ZUl0ZXJhdGlvbigpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0QWN0aXZpdHlfQnJlYWtkb3duRWxlbWVudHMoKSwgVW1hRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkuY3JlYXRlQWN0aXZpdHkoKSkpOwotCi0JCS8vIGlmKGFjdC5nZXRCcmVha2Rvd25FbGVtZW50cygpLmlzRW1wdHkoKSkgewotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRBY3Rpdml0eV9CcmVha2Rvd25FbGVtZW50cygpLCBVbWFGYWN0b3J5LmVJTlNUQU5DRQotCQkJCS5jcmVhdGVSb2xlRGVzY3JpcHRvcigpKSk7Ci0KLQkJLy8gQ09NUE9TSVRFIFJPTEUgRkVBVFVSRSBJUyBOT1QgQVZBSUxBQkxFIEZPUiBGSVJTVCBSRUxFQVNFLgotCQkvLyBuZXdDaGlsZERlc2NyaXB0b3JzLmFkZAotCQkvLyAoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIKLQkJLy8gKFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEFjdGl2aXR5X0JyZWFrZG93bkVsZW1lbnRzKCksCi0JCS8vIFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUNvbXBvc2l0ZVJvbGUoKSkpOwotCQkvLwkJCQkKLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0QWN0aXZpdHlfQnJlYWtkb3duRWxlbWVudHMoKSwgVW1hRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkuY3JlYXRlVGVhbVByb2ZpbGUoKSkpOwotCi0JCS8vIH0KLQkJLy8gfQotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldEFjdGl2aXR5X0JyZWFrZG93bkVsZW1lbnRzKCksIFVtYUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJLmNyZWF0ZU1pbGVzdG9uZSgpKSk7Ci0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEudG5nLnByb2Nlc3MuQlNBY3Rpdml0eUl0ZW1Qcm92aWRlciNhY2NlcHRBc0NoaWxkKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0QXNDaGlsZChPYmplY3QgY2hpbGQpIHsKLQkJY2hpbGQgPSBUbmdVdGlsLnVud3JhcChjaGlsZCk7Ci0KLQkJaWYgKGNoaWxkIGluc3RhbmNlb2YgQWN0aXZpdHkgfHwgY2hpbGQgaW5zdGFuY2VvZiBSb2xlRGVzY3JpcHRvcgotCQkJCXx8IGNoaWxkIGluc3RhbmNlb2YgVGVhbVByb2ZpbGUgfHwgY2hpbGQgaW5zdGFuY2VvZiBNaWxlc3RvbmUpIHsKLQkJCXJldHVybiBzdXBlci5hY2NlcHRBc0NoaWxkKGNoaWxkKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkJTQWN0aXZpdHlJdGVtUHJvdmlkZXIjZ2V0T2JqZWN0KG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpcHRvcikKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGdldE9iamVjdChEZXNjcmlwdG9yIGRlc2NyaXB0b3IpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiAoKFJvbGVEZXNjcmlwdG9yKSBkZXNjcmlwdG9yKS5nZXRSb2xlKCk7Ci0JCX0KLQkJY2F0Y2goQ2xhc3NDYXN0RXhjZXB0aW9uIGUpIHsKLQkJCUxpYnJhcnlFZGl0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCXRocm93IGU7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuQlNBY3Rpdml0eUl0ZW1Qcm92aWRlciNjcmVhdGVEcm9wQ29tbWFuZChqYXZhLmxhbmcuT2JqZWN0LAotCSAqICAgICAgamF2YS51dGlsLkxpc3QpCi0JICovCi0JcHVibGljIElSZXNvdXJjZUF3YXJlQ29tbWFuZCBjcmVhdGVEcm9wQ29tbWFuZChPYmplY3Qgb3duZXIsCi0JCQlMaXN0IGRyb3BFbGVtZW50cykgewotCQlyZXR1cm4gbmV3IE9CU0Ryb3BDb21tYW5kKChBY3Rpdml0eSkgb3duZXIsIGRyb3BFbGVtZW50cyk7Ci0JfQotCi0JcHJvdGVjdGVkIENvbW1hbmQgY3JlYXRlRHJhZ0FuZERyb3BDb21tYW5kKEVkaXRpbmdEb21haW4gZG9tYWluLAotCQkJT2JqZWN0IG93bmVyLCBmbG9hdCBsb2NhdGlvbiwgaW50IG9wZXJhdGlvbnMsIGludCBvcGVyYXRpb24sCi0JCQlDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJLy8gU3lzdGVtLm91dAotCQkvLyAucHJpbnRsbigiRU5URVI6Ci0JCS8vIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuV0JTQWN0aXZpdHlJdGVtUHJvdmlkZXIjY3JlYXRlRHJhZ0FuZERyb3BDb21tYW5kKGRvbWFpbiwKLQkJLy8gb3duZXIsIGxvY2F0aW9uLCBvcGVyYXRpb25zLCBvcGVyYXRpb24sIGNvbGxlY3Rpb24pIik7Ci0JCUNvbW1hbmQgY21kID0gbmV3IE9CU0RyYWdBbmREcm9wQ29tbWFuZChkb21haW4sIG93bmVyLCBsb2NhdGlvbiwKLQkJCQlvcGVyYXRpb25zLCBvcGVyYXRpb24sIGNvbGxlY3Rpb24pOwotCi0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiIGNhbiBleGVjdXRlOiAiICsgY21kLmNhbkV4ZWN1dGUoKSk7Ci0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiIG93bmVyOiAiICsgb3duZXIpOwotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIiBjb2xsZWN0aW9uOiAiICsgY29sbGVjdGlvbik7Ci0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiIGxvY2F0aW9uOiAiICsgbG9jYXRpb24pOwotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIiBvcGVyYXRpb25zOiAiICsgb3BlcmF0aW9ucyk7Ci0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiIG9wZXJhdGlvbjogIiArIG9wZXJhdGlvbik7Ci0JCS8vICAgICAgICAKLQkJLy8gU3lzdGVtLm91dAotCQkvLyAucHJpbnRsbigiRVhJVDoKLQkJLy8gY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5XQlNBY3Rpdml0eUl0ZW1Qcm92aWRlciNjcmVhdGVEcmFnQW5kRHJvcENvbW1hbmQoZG9tYWluLAotCQkvLyBvd25lciwgbG9jYXRpb24sIG9wZXJhdGlvbnMsIG9wZXJhdGlvbiwgY29sbGVjdGlvbikiKTsKLQkJcmV0dXJuIGNtZDsKLQl9Ci0KLQkvLyAvKiAobm9uLUphdmFkb2MpCi0JLy8gKiBAc2VlCi0JLy8gY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CU0FjdGl2aXR5SXRlbVByb3ZpZGVyI3JlZnJlc2hDaGlsZHJlbihvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb24sCi0JLy8gamF2YS51dGlsLkxpc3QpCi0JLy8gKi8KLQkvLyBwcm90ZWN0ZWQgdm9pZCByZWZyZXNoQ2hpbGRyZW4oTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbiwgTGlzdAotCS8vIG5ld09yT2xkQ2hpbGRyZW4pIHsKLQkvLyBpZighbmV3T3JPbGRDaGlsZHJlbi5pc0VtcHR5KCkpIHsKLQkvLyBQcm9jZXNzIHRvcEFjdCA9IChQcm9jZXNzKSBnZXRUb3BJdGVtKCk7Ci0JLy8gQWRhcHRlckZhY3Rvcnkgcm9vdEFkYXB0ZXJGYWN0b3J5ID0gZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCk7Ci0JLy8JCQkJCQkKLQkvLyBQcm9jZXNzVXRpbC5yZWZyZXNoVmlld2VyKHJvb3RBZGFwdGVyRmFjdG9yeSwgdG9wQWN0KTsKLQkvLwkJCQotCS8vIHJldHVybjsKLQkvLwotCS8vIH0KLQkvLyB9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkJTQWN0aXZpdHlJdGVtUHJvdmlkZXIjaXNOZXdEZXNjcmlwdG9yKGphdmEudXRpbC5MaXN0LCBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzTmV3RGVzY3JpcHRvcihMaXN0IGNoaWxkcmVuLCBPYmplY3QgY2hpbGQpIHsKLQkJT2JqZWN0IG9iaiA9IFRuZ1V0aWwudW53cmFwKGNoaWxkKTsKLQkJLy8gY29sbGVjdCBhbGwgcm9sZSBkZXNjcmlwdG9ycyBvciB0aGVpciB3cmFwcGVycyBmaXJzdCBmb3IgbWF0Y2hpbmcgd2l0aCB0ZWFtIHByb2ZpbGVzCi0JCS8vIGFuZCBlbGltaW5hdGUgdGhlIGR1cGxpY2F0ZXMgbGF0ZXIgaW4gZ2V0Q2hpbGRyZW4oKQotCQkvLwotCQlpZihvYmogaW5zdGFuY2VvZiBSb2xlRGVzY3JpcHRvcikgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmlzTmV3RGVzY3JpcHRvcihjaGlsZHJlbiwgb2JqKTsKLQl9CQkKLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CU0FjdGl2aXR5SXRlbVByb3ZpZGVyI2dldENoaWxkcmVuKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlpZiAocm9sbGVkVXBXcmFwcGVycyAhPSBudWxsKSB7Ci0JCQlyb2xsZWRVcFdyYXBwZXJzLmRpc3Bvc2UoKTsKLQkJfQotCi0JCWlmIChpc1JvbGxlZFVwKCkpIHsKLQkJCUxpc3QgdGVhbVByb2ZpbGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJTGlzdCByb2xlRGVzY3JpcHRvcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlIYXNoU2V0IHJvbGVUZWFtUGFpcnMgPSBuZXcgSGFzaFNldCgpOwotCQkJSGFzaFNldCByb2xlRGVzY3JpcHRvcnNXaXRob3V0TGlua2VkRWxlbWVudHMgPSBuZXcgSGFzaFNldCgpOwotCQkJQ29sbGVjdGlvbiBjaGlsZHJlbiA9IHN1cGVyLmdldENoaWxkcmVuKG9iamVjdCk7Ci0JCQkKLQkJCS8vIGNvbGxlY3QgYWxsIHRlYW0gcHJvZmlsZXMgdW5kZXIgdGhpcyBhY3Rpdml0eQotCQkJLy8KLQkJCUhhc2hTZXQgdmFsaWRUZWFtUHJvZmlsZXMgPSBuZXcgSGFzaFNldCgpOwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gY2hpbGRyZW4uaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IG8gPSBpdGVyLm5leHQoKTsKLQkJCQlPYmplY3QgZSA9IFRuZ1V0aWwudW53cmFwKG8pOwotCQkJCWlmIChlIGluc3RhbmNlb2YgVGVhbVByb2ZpbGUpIHsKLQkJCQkJaWYodmFsaWRUZWFtUHJvZmlsZXMuYWRkKGUpKSB7Ci0JCQkJCQl0ZWFtUHJvZmlsZXMuYWRkKG8pOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJCi0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjaGlsZHJlbi5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3QgY2hpbGQgPSBpdGVyLm5leHQoKTsKLQkJCQlPYmplY3QgZSA9IFRuZ1V0aWwudW53cmFwKGNoaWxkKTsKLQkJCQlpZiAoZSBpbnN0YW5jZW9mIFJvbGVEZXNjcmlwdG9yKSB7Ci0JCQkJCVJvbGVEZXNjcmlwdG9yIGRlc2MgPSAoUm9sZURlc2NyaXB0b3IpIGU7Ci0JCQkJCUxpc3QgbGlzdDsKLQkJCQkJTGlzdCBkZXNjcmlwdG9ycyA9IG51bGw7Ci0JCQkJCUNvbXBvc2VkQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIgY29tcG9zZWRXcmFwcGVyID0gbnVsbDsJCQkJCQotCQkJCQlpZihjaGlsZCBpbnN0YW5jZW9mIFJvbGVEZXNjcmlwdG9yV3JhcHBlckl0ZW1Qcm92aWRlcikgewotCQkJCQkJT2JqZWN0IHZhbHVlID0gKChSb2xlRGVzY3JpcHRvcldyYXBwZXJJdGVtUHJvdmlkZXIpY2hpbGQpLmdldFZhbHVlKCk7Ci0JCQkJCQlpZih2YWx1ZSBpbnN0YW5jZW9mIENvbXBvc2VkQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIHsKLQkJCQkJCQljb21wb3NlZFdyYXBwZXIgPSAoQ29tcG9zZWRCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgdmFsdWU7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJaWYoY29tcG9zZWRXcmFwcGVyICE9IG51bGwpIHsKLQkJCQkJCWxpc3QgPSBuZXcgVW5pcXVlRUxpc3QoKTsKLQkJCQkJCWRlc2NyaXB0b3JzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGNvbXBvc2VkV3JhcHBlci5nZXRWYWx1ZXMoKS5pdGVyYXRvcigpOyBpdGVyYXRvcgotCQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJCU9iamVjdCBvID0gaXRlcmF0b3IubmV4dCgpOwotCQkJCQkJCU9iamVjdCBlbGVtZW50ID0gVG5nVXRpbC51bndyYXAobyk7Ci0JCQkJCQkJaWYoZWxlbWVudCBpbnN0YW5jZW9mIFJvbGVEZXNjcmlwdG9yKSB7Ci0JCQkJCQkJCUxpc3QgdGVhbXMgPSBBc3NvY2lhdGlvbkhlbHBlci5nZXRUZWFtUHJvZmlsZXMoKFJvbGVEZXNjcmlwdG9yKSBlbGVtZW50KTsKLQkJCQkJCQkJZm9yIChJdGVyYXRvciBpdG9yID0gdGVhbXMuaXRlcmF0b3IoKTsgaXRvcgotCQkJCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJCQlPYmplY3QgdGVhbSA9IGl0b3IubmV4dCgpOwotCQkJCQkJCQkJaWYobGlzdC5hZGQodGVhbSkpIHsKLQkJCQkJCQkJCQlkZXNjcmlwdG9ycy5hZGQobyk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCQkKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCWxpc3QgPSBBc3NvY2lhdGlvbkhlbHBlci5nZXRUZWFtUHJvZmlsZXMoZGVzYyk7Ci0JCQkJCX0KLQkJCQkJaW50IHNpemUgPSBsaXN0LnNpemUoKTsgCi0JCQkJCWlmKHNpemUgPiAxKSB7Ci0JCQkJCQlpZiAocm9sbGVkVXBXcmFwcGVycyA9PSBudWxsKSB7Ci0JCQkJCQkJcm9sbGVkVXBXcmFwcGVycyA9IG5ldyBEaXNwb3NhYmxlKCk7Ci0JCQkJCQl9Ci0JCQkJCQkKLQkJCQkJCWJvb2xlYW4gcmVhZE9ubHkgPSBmYWxzZTsKLQkJCQkJCWlmIChjaGlsZCBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSB7Ci0JCQkJCQkJcmVhZE9ubHkgPSAoKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSBjaGlsZCkKLQkJCQkJCQkuaXNSZWFkT25seSgpOwotCQkJCQkJfQotCQkJCQkJCi0JCQkJCQkvLyBzaG93IG9uZSBkZXNjcmlwdG9yIHBlciB0ZWFtCi0JCQkJCQkvLwotCQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQkJCQlUZWFtUm9sZURlc2NyaXB0b3JJdGVtUHJvdmlkZXIgaXRlbVByb3ZpZGVyID0gbmV3IFRlYW1Sb2xlRGVzY3JpcHRvckl0ZW1Qcm92aWRlcigKLQkJCQkJCQkJCWRlc2NyaXB0b3JzLmdldChpKSwgb2JqZWN0LCBhZGFwdGVyRmFjdG9yeSk7Ci0JCQkJCQkJaXRlbVByb3ZpZGVyLnJlYWRPbmx5ID0gcmVhZE9ubHk7Ci0JCQkJCQkJVGVhbVByb2ZpbGUgdGVhbSA9IChUZWFtUHJvZmlsZSkgbGlzdC5nZXQoaSk7Ci0JCQkJCQkJCi0vLwkJCQkJCQkvLyBhZGQgdGVhbSB0byB0aGUgdGVhbSBsaXN0IG9ubHkgaWYgdGhlIHRlYW0gaXMgdW5kZXIgdGhpcyBhY3Rpdml0eQotLy8JCQkJCQkJLy8KLS8vCQkJCQkJCWlmKHZhbGlkVGVhbVByb2ZpbGVzLmNvbnRhaW5zKHRlYW0pKSB7Ci0vLwkJCQkJCQkJYWRkVGVhbVByb2ZpbGVzKG9iamVjdCwgdGVhbVByb2ZpbGVzLCB0ZWFtKTsKLS8vCQkJCQkJCX0KLQkJCQkJCQkKLQkJCQkJCQlpdGVtUHJvdmlkZXIudGVhbSA9IHRlYW07Ci0JCQkJCQkJcm9sbGVkVXBXcmFwcGVycy5hZGQoaXRlbVByb3ZpZGVyKTsKLQkJCQkJCQlyb2xlRGVzY3JpcHRvcnMuYWRkKGl0ZW1Qcm92aWRlcik7Ci0JCQkJCQkJcm9sZVRlYW1QYWlycy5hZGQobmV3IFJvbGVUZWFtUGFpcigoUm9sZSkgZ2V0T2JqZWN0KGRlc2MpLCB0ZWFtKSk7Ci0JCQkJCQl9CQkJCQkJCi0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQlSb2xlIHJvbGUgPSAoUm9sZSkgZ2V0T2JqZWN0KGRlc2MpOwotCQkJCQkJVGVhbVByb2ZpbGUgdGVhbSA9IChUZWFtUHJvZmlsZSkgKHNpemUgPT0gMSA/IGxpc3QuZ2V0KDApIDogbnVsbCk7Ci0JCQkJCQlpZihyb2xlID09IG51bGwpIHsKLQkJCQkJCQlpZighcm9sZURlc2NyaXB0b3JzV2l0aG91dExpbmtlZEVsZW1lbnRzLmNvbnRhaW5zKGUpKSB7Ci0JCQkJCQkJCXJvbGVEZXNjcmlwdG9ycy5hZGQoY2hpbGQpOwotCQkJCQkJCQkKLS8vCQkJCQkJCQkvLyBhZGQgdGVhbSB0byB0aGUgdGVhbSBsaXN0IG9ubHkgaWYgdGhlIHRlYW0gaXMgdW5kZXIgdGhpcyBhY3Rpdml0eQotLy8JCQkJCQkJCS8vCi0vLwkJCQkJCQkJaWYodGVhbSAhPSBudWxsICYmIHZhbGlkVGVhbVByb2ZpbGVzLmNvbnRhaW5zKHRlYW0pKSB7Ci0vLwkJCQkJCQkJCWFkZFRlYW1Qcm9maWxlcyhvYmplY3QsIHRlYW1Qcm9maWxlcywgdGVhbSk7Ci0vLwkJCQkJCQkJfQotCQkJCQkJCQkKLQkJCQkJCQkJcm9sZURlc2NyaXB0b3JzV2l0aG91dExpbmtlZEVsZW1lbnRzLmFkZChlKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIHsKLQkJCQkJCQlSb2xlVGVhbVBhaXIgcm9sZVRlYW1QYWlyID0gbmV3IFJvbGVUZWFtUGFpcihyb2xlLCB0ZWFtKTsKLQkJCQkJCQlpZighcm9sZVRlYW1QYWlycy5jb250YWlucyhyb2xlVGVhbVBhaXIpKSB7Ci0JCQkJCQkJCXJvbGVEZXNjcmlwdG9ycy5hZGQoY2hpbGQpOwotCQkJCQkJCQkKLS8vCQkJCQkJCQkvLyBhZGQgdGVhbSB0byB0aGUgdGVhbSBsaXN0IG9ubHkgaWYgdGhlIHRlYW0gaXMgdW5kZXIgdGhpcyBhY3Rpdml0eQotLy8JCQkJCQkJCS8vCi0vLwkJCQkJCQkJaWYodGVhbSAhPSBudWxsICYmIHZhbGlkVGVhbVByb2ZpbGVzLmNvbnRhaW5zKHRlYW0pKSB7Ci0vLwkJCQkJCQkJCWFkZFRlYW1Qcm9maWxlcyhvYmplY3QsIHRlYW1Qcm9maWxlcywgdGVhbSk7Ci0vLwkJCQkJCQkJfQotCQkJCQkJCQkKLQkJCQkJCQkJcm9sZVRlYW1QYWlycy5hZGQocm9sZVRlYW1QYWlyKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlyb2xlVGVhbVBhaXJzLmNsZWFyKCk7Ci0JCQlyb2xlVGVhbVBhaXJzID0gbnVsbDsKLQkJCUNvbGxlY3Rpb25zLnNvcnQodGVhbVByb2ZpbGVzLCBDb21wYXJhdG9ycy5QUkVTRU5UQVRJT05fTkFNRV9DT01QQVJBVE9SKTsKLQkJCUNvbGxlY3Rpb25zLnNvcnQocm9sZURlc2NyaXB0b3JzLCBDb21wYXJhdG9ycy5QUkVTRU5UQVRJT05fTkFNRV9DT01QQVJBVE9SKTsKLQkJCWNoaWxkcmVuID0gbmV3IEFycmF5TGlzdCh0ZWFtUHJvZmlsZXMpOwotCQkJY2hpbGRyZW4uYWRkQWxsKHJvbGVEZXNjcmlwdG9ycyk7Ci0JCQkKLQkJCXVwZGF0ZUNhY2hlZENoaWxkcmVuKGNoaWxkcmVuKTsKLQkJCQotCQkJcmV0dXJuIGNoaWxkcmVuOwotCQl9Ci0JCUNvbGxlY3Rpb24gY2hpbGRyZW4gPSBzdXBlci5nZXRDaGlsZHJlbihvYmplY3QpOwotCQl1cGRhdGVDYWNoZWRDaGlsZHJlbihjaGlsZHJlbik7Ci0JCXJldHVybiBjaGlsZHJlbjsKLQl9Ci0JCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0RUNsYXNzZXMoKSB7Ci0JCXJldHVybiBQcm9jZXNzVXRpbC5nZXRPQlNFY2xhc3NlcygpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgYWRkVGVhbVByb2ZpbGVzKE9iamVjdCBvd25lciwgQ29sbGVjdGlvbiB0ZWFtUHJvZmlsZXMsIFRlYW1Qcm9maWxlIHRlYW1Qcm9maWxlKSB7Ci0JCWlmICghVG5nVXRpbC5jaGVja0V4aXN0KHRlYW1Qcm9maWxlcywgdGVhbVByb2ZpbGUpKSB7Ci0JCQlUZWFtUHJvZmlsZVdyYXBwZXJJdGVtUHJvdmlkZXIgd3JhcHBlciA9IG5ldyBUZWFtUHJvZmlsZVdyYXBwZXJJdGVtUHJvdmlkZXIoCi0JCQkJCXRlYW1Qcm9maWxlLCBvd25lciwgYWRhcHRlckZhY3RvcnkpIHsKLQkJCQkvKiAobm9uLUphdmFkb2MpCi0JCQkJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5EZWxlZ2F0aW5nV3JhcHBlckl0ZW1Qcm92aWRlciNnZXRDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0KQotCQkJCSAqLwotCQkJCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJCQkJQ29sbGVjdGlvbiBjaGlsZHJlbiA9IHN1cGVyLmdldENoaWxkcmVuKG9iamVjdCk7Ci0JCQkJCQotLy8JCQkJCS8vIGRvbid0IHNob3cgcm9sZSBkZXNjcmlwdG9ycwotLy8JCQkJCS8vCi0vLwkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gY2hpbGRyZW4uaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0vLwkJCQkJCU9iamVjdCBjaGlsZCA9IFRuZ1V0aWwudW53cmFwKGl0ZXIubmV4dCgpKTsKLS8vCQkJCQkJaWYoY2hpbGQgaW5zdGFuY2VvZiBSb2xlRGVzY3JpcHRvcikgewotLy8JCQkJCQkJaXRlci5yZW1vdmUoKTsKLS8vCQkJCQkJfQotLy8JCQkJCX0JCi0JCQkJCQotCQkJCQlyZXR1cm4gY2hpbGRyZW47Ci0JCQkJfQotCQkJCQotCQkJfTsKLQkJCUlCU0l0ZW1Qcm92aWRlciBhZGFwdGVyID0gKElCU0l0ZW1Qcm92aWRlcikgYWRhcHRlckZhY3RvcnkKLQkJCQkJLmFkYXB0KHRlYW1Qcm9maWxlLAotCQkJCQkJCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCQl3cmFwcGVyLnJlYWRPbmx5ID0gKGdldFRvcEl0ZW0oKSAhPSBhZGFwdGVyLmdldFRvcEl0ZW0oKSk7Ci0JCQl0ZWFtUHJvZmlsZXMuYWRkKHdyYXBwZXIpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgVGVhbVJvbGVEZXNjcmlwdG9ySXRlbVByb3ZpZGVyIGV4dGVuZHMKLQkJCVJvbGVEZXNjcmlwdG9yV3JhcHBlckl0ZW1Qcm92aWRlciB7Ci0JCQotCQkKLQkJcHVibGljIFRlYW1Sb2xlRGVzY3JpcHRvckl0ZW1Qcm92aWRlcihPYmplY3QgdmFsdWUsIE9iamVjdCBvd25lciwgQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJCXN1cGVyKHZhbHVlLCBvd25lciwgYWRhcHRlckZhY3RvcnkpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBwYXJhbSB2YWx1ZQotCQkgKiBAcGFyYW0gb3duZXIKLQkJICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JCSAqLwotCQlwdWJsaWMgVGVhbVJvbGVEZXNjcmlwdG9ySXRlbVByb3ZpZGVyKFJvbGVEZXNjcmlwdG9yIHZhbHVlLAotCQkJCU9iamVjdCBvd25lciwgQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJCXN1cGVyKHZhbHVlLCBvd25lciwgYWRhcHRlckZhY3RvcnkpOwotCQkJcmVhZE9ubHkgPSBmYWxzZTsKLQkJfQotCi0JCXByaXZhdGUgVGVhbVByb2ZpbGUgdGVhbTsKLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuUm9sZURlc2NyaXB0b3JJdGVtUHJvdmlkZXIjZ2V0QXR0cmlidXRlKGphdmEubGFuZy5PYmplY3QsCi0JCSAqICAgICAgamF2YS5sYW5nLlN0cmluZykKLQkJICovCi0JCXB1YmxpYyBTdHJpbmcgZ2V0QXR0cmlidXRlKE9iamVjdCBvYmplY3QsIFN0cmluZyBwcm9wZXJ0eSkgewotCQkJaWYgKHByb3BlcnR5ID09IElCU0l0ZW1Qcm92aWRlci5DT0xfVEVBTVMgJiYgdGVhbSAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIFRuZ1V0aWwuZ2V0UHJlc2VudGF0aW9uTmFtZSh0ZWFtKTsKLQkJCX0KLQkJCXJldHVybiBzdXBlci5nZXRBdHRyaWJ1dGUob2JqZWN0LCBwcm9wZXJ0eSk7Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIjY3JlYXRlV3JhcHBlcihqYXZhLmxhbmcuT2JqZWN0LAotCQkgKiAgICAgIGphdmEubGFuZy5PYmplY3QsIG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5KQotCQkgKi8KLQkJcHJvdGVjdGVkIElXcmFwcGVySXRlbVByb3ZpZGVyIGNyZWF0ZVdyYXBwZXIoT2JqZWN0IHZhbHVlLAotCQkJCU9iamVjdCBvd25lciwgQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJCUJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyIHdyYXBwZXIgPSAoQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIHN1cGVyCi0JCQkJCS5jcmVhdGVXcmFwcGVyKHZhbHVlLCBvd25lciwgYWRhcHRlckZhY3RvcnkpOwotCQkJd3JhcHBlci5yZWFkT25seSA9IHJlYWRPbmx5OwotCQkJcmV0dXJuIHdyYXBwZXI7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBSb2xlVGVhbVBhaXIgewotCQlwcml2YXRlIFJvbGUgcm9sZTsKLQkJcHJpdmF0ZSBUZWFtUHJvZmlsZSB0ZWFtOwotCi0JCVJvbGVUZWFtUGFpcihSb2xlIHJvbGUsIFRlYW1Qcm9maWxlIHRlYW0pIHsKLQkJCXRoaXMucm9sZSA9IHJvbGU7Ci0JCQl0aGlzLnRlYW0gPSB0ZWFtOwotCQl9Ci0JCQotCQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotCQkJaWYob2JqID09IHRoaXMpIHJldHVybiB0cnVlOwotCQkJaWYob2JqIGluc3RhbmNlb2YgUm9sZVRlYW1QYWlyKSB7Ci0JCQkJUm9sZVRlYW1QYWlyIG90aGVyID0gKFJvbGVUZWFtUGFpcikgb2JqOwotCQkJCXJldHVybiByb2xlID09IG90aGVyLnJvbGUgJiYgKHRlYW0gPT0gb3RoZXIudGVhbSB8fCAodGVhbSA9PSBudWxsICYmIG90aGVyLnRlYW0gPT0gbnVsbCkpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0JCQotCQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCQkJU3RyaW5nIHN0ciA9IHJvbGUuZ2V0R3VpZCgpOwotCQkJaWYodGVhbSAhPSBudWxsKSB7Ci0JCQkJc3RyID0gc3RyICsgdGVhbS5nZXRHdWlkKCk7Ci0JCQl9Ci0JCQlyZXR1cm4gc3RyLmhhc2hDb2RlKCk7CQkJCi0JCX0KLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNXcmFwcGluZ1JvbGx1cE5lZWRlZChPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmKFRuZ1V0aWwudW53cmFwKG9iamVjdCkgaW5zdGFuY2VvZiBSb2xlRGVzY3JpcHRvcikgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmlzV3JhcHBpbmdSb2xsdXBOZWVkZWQob2JqZWN0KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgT2JqZWN0IGNyZWF0ZVJvbGx1cFdyYXBwZXIoT2JqZWN0IG9iamVjdCwgT2JqZWN0IG93bmVyLCBBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlPYmplY3Qgd3JhcHBlciA9IHN1cGVyLmNyZWF0ZVJvbGx1cFdyYXBwZXIob2JqZWN0LCBvd25lciwgYWRhcHRlckZhY3RvcnkpOwotCQlyZXR1cm4gbmV3IFJvbGVEZXNjcmlwdG9yV3JhcHBlckl0ZW1Qcm92aWRlcih3cmFwcGVyLCBvd25lciwgYWRhcHRlckZhY3RvcnkpOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9PQlNJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL09CU0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5NDAwZDUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL09CU0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIE9CU0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5IGV4dGVuZHMgSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkgewotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQnJlYWtkb3duQWRhcHRlckZhY3RvcnkjY3JlYXRlQWN0aXZpdHlBZGFwdGVyKCkKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVBY3Rpdml0eUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgT0JTQWN0aXZpdHlJdGVtUHJvdmlkZXIodGhpcyk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQnJlYWtkb3duQWRhcHRlckZhY3RvcnkjY3JlYXRlSXRlcmF0aW9uQWRhcHRlcigpCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlSXRlcmF0aW9uQWRhcHRlcigpIHsKLQkJcmV0dXJuIGNyZWF0ZUFjdGl2aXR5QWRhcHRlcigpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkJyZWFrZG93bkFkYXB0ZXJGYWN0b3J5I2NyZWF0ZVBoYXNlQWRhcHRlcigpCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUGhhc2VBZGFwdGVyKCkgewotCQlyZXR1cm4gY3JlYXRlQWN0aXZpdHlBZGFwdGVyKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQnJlYWtkb3duQWRhcHRlckZhY3RvcnkjY3JlYXRlVGVhbVByb2ZpbGVBZGFwdGVyKCkKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVUZWFtUHJvZmlsZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgVGVhbVByb2ZpbGVJdGVtUHJvdmlkZXIodGhpcywgKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIFRuZ1V0aWwudW1hSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuY3JlYXRlVGVhbVByb2ZpbGVBZGFwdGVyKCkpOwotCX0KLQotCS8vIC8qIChub24tSmF2YWRvYykKLQkvLyAqIEBzZWUKLQkvLyBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQnJlYWtkb3duQWRhcHRlckZhY3RvcnkjY3JlYXRlVGVhbVByb2ZpbGVBZGFwdGVyKCkKLQkvLyAqLwotCS8vIHB1YmxpYyBBZGFwdGVyIGNyZWF0ZUNvbXBvc2l0ZVJvbGVBZGFwdGVyKCkgewotCS8vIHJldHVybiBuZXcgT0JTQ29tcG9zaXRlUm9sZUl0ZW1Qcm92aWRlcih0aGlzKTsKLQkvLyB9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5CcmVha2Rvd25BZGFwdGVyRmFjdG9yeSNjcmVhdGVQaGFzZUFkYXB0ZXIoKQotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZU1pbGVzdG9uZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgT0JTTWlsZXN0b25lSXRlbVByb3ZpZGVyKHRoaXMsIChJdGVtUHJvdmlkZXJBZGFwdGVyKSBUbmdVdGlsLnVtYUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5Ci0JCQkJLmNyZWF0ZU1pbGVzdG9uZUFkYXB0ZXIoKSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5I2NyZWF0ZVByb2Nlc3NBZGFwdGVyKCkKLQkgKi8KLQkvLyBwdWJsaWMgQWRhcHRlciBjcmVhdGVQcm9jZXNzQWRhcHRlcigpIHsKLQkvLyByZXR1cm4gY3JlYXRlQWN0aXZpdHlBZGFwdGVyKCk7Ci0JLy8gfQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUNhcGFiaWxpdHlQYXR0ZXJuQWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBPQlNQcm9jZXNzSXRlbVByb3ZpZGVyKHRoaXMsIChJdGVtUHJvdmlkZXJBZGFwdGVyKSBUbmdVdGlsLnVtYUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LmNyZWF0ZUNhcGFiaWxpdHlQYXR0ZXJuQWRhcHRlcigpKTsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVEZWxpdmVyeVByb2Nlc3NBZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IE9CU1Byb2Nlc3NJdGVtUHJvdmlkZXIodGhpcywgKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIFRuZ1V0aWwudW1hSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuY3JlYXRlRGVsaXZlcnlQcm9jZXNzQWRhcHRlcigpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9PQlNNaWxlc3RvbmVJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9PQlNNaWxlc3RvbmVJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODFhYTFmZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvT0JTTWlsZXN0b25lSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3M7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlByb2Nlc3NVdGlsOwotCi0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIE9CU01pbGVzdG9uZUl0ZW1Qcm92aWRlciBleHRlbmRzIEJyZWFrZG93bkVsZW1lbnRJdGVtUHJvdmlkZXIgewotCi0JLy8gcHJpdmF0ZSBDb2xsZWN0aW9uIGVDbGFzc2VzID0gbmV3IEhhc2hTZXQoKTsKLQkvKioKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgT0JTTWlsZXN0b25lSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LAotCQkJSXRlbVByb3ZpZGVyQWRhcHRlciBkZWxlZ2F0ZUl0ZW1Qcm92aWRlcikgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSwgZGVsZWdhdGVJdGVtUHJvdmlkZXIpOwotCX0KLQotCS8vIC8qIChub24tSmF2YWRvYykKLQkvLyAqIEBzZWUKLQkvLyBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLldCU0FjdGl2aXR5SXRlbVByb3ZpZGVyI2dldENoaWxkcmVuKGphdmEubGFuZy5PYmplY3QpCi0JLy8gKi8KLQkvLyBwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JLy8gcmV0dXJuIFRuZ1V0aWwuZ2V0QWxsQ2hpbGRyZW4oKFByb2Nlc3NDb250cmlidXRpb24pIG9iamVjdCwKLQkvLyBzdXBlci5nZXRDaGlsZHJlbihvYmplY3QpLAotCS8vIFRuZ1V0aWwuZ2V0QmVzdEFkYXB0ZXJGYWN0b3J5KGFkYXB0ZXJGYWN0b3J5KSk7Ci0JLy8gfQotCS8vICAgIAotCS8vIC8qIChub24tSmF2YWRvYykKLQkvLyAqIEBzZWUKLQkvLyBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldEVsZW1lbnRzKGphdmEubGFuZy5PYmplY3QpCi0JLy8gKi8KLQkvLyBwdWJsaWMgQ29sbGVjdGlvbiBnZXRFbGVtZW50cyhPYmplY3Qgb2JqZWN0KSB7Ci0JLy8gQ29sbGVjdGlvbiBlbGVtZW50cyA9IHN1cGVyLmdldEVsZW1lbnRzKG9iamVjdCk7Ci0JLy8gcmV0dXJuIGVsZW1lbnRzOwotCS8vIH0KLQotCS8vIHB1YmxpYyBMaXN0IGdldEZpbHRlcmVkQnJlYWtkb3duRWxlbWVudHMoT2JqZWN0IGFjdGl2aXR5LCBPYmplY3Qgb2JqKQotCS8vIHsKLQkvLyBMaXN0IGVsZW1lbnRzID0gbmV3IEFycmF5TGlzdCgpOwotCS8vIExpc3QgYnJlYWtkb3duRWxlbWVudHMgPSAoKEFjdGl2aXR5KWFjdGl2aXR5KS5nZXRCcmVha2Rvd25FbGVtZW50cygpOwotCS8vIGZvciAoSXRlcmF0b3IgaXQgPSBicmVha2Rvd25FbGVtZW50cy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KQotCS8vIHsKLQkvLyBPYmplY3QgZWxlbWVudE9iaiA9IGl0Lm5leHQoKTsKLQkvLyBpZiAoKGVsZW1lbnRPYmogaW5zdGFuY2VvZiBSb2xlRGVzY3JpcHRvcikgfHwgKGVsZW1lbnRPYmogaW5zdGFuY2VvZgotCS8vIFRlYW1Qcm9maWxlKSB8fCAoZWxlbWVudE9iaiBpbnN0YW5jZW9mIENvbXBvc2l0ZVJvbGUpIHx8IChlbGVtZW50T2JqCi0JLy8gaW5zdGFuY2VvZiBNaWxlc3RvbmUpIHx8IChlbGVtZW50T2JqIGluc3RhbmNlb2YgQWN0aXZpdHkpKQotCS8vIHsKLQkvLyBlbGVtZW50cy5hZGQoZWxlbWVudE9iaik7Ci0JLy8gfQotCS8vIH0KLQkvLyByZXR1cm4gZWxlbWVudHM7Ci0JLy8gfQotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0RUNsYXNzZXMoKSB7Ci0JCXJldHVybiBQcm9jZXNzVXRpbC5nZXRPQlNFY2xhc3NlcygpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL09CU1Byb2Nlc3NJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9PQlNQcm9jZXNzSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczMzFlNTMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL09CU1Byb2Nlc3NJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2VzczsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgT0JTUHJvY2Vzc0l0ZW1Qcm92aWRlciBleHRlbmRzIE9CU0FjdGl2aXR5SXRlbVByb3ZpZGVyIHsKLQotCXByaXZhdGUgSXRlbVByb3ZpZGVyQWRhcHRlciBkZWxlZ2F0ZUl0ZW1Qcm92aWRlcjsKLQotCXB1YmxpYyBPQlNQcm9jZXNzSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LAotCQkJSXRlbVByb3ZpZGVyQWRhcHRlciBkZWxlZ2F0ZUl0ZW1Qcm92aWRlcikgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JCXRoaXMuZGVsZWdhdGVJdGVtUHJvdmlkZXIgPSBkZWxlZ2F0ZUl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuQWN0aXZpdHlJdGVtUHJvdmlkZXIjZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPSBkZWxlZ2F0ZUl0ZW1Qcm92aWRlcgotCQkJCQkuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9QQlNBY3Rpdml0eUl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL1BCU0FjdGl2aXR5SXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiMTVmYTEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL1BCU0FjdGl2aXR5SXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNzggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5BZGFwdGVyRmFjdG9yeVRyZWVJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5EaXNwb3NhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklXcmFwcGVySXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUNhY2hlZENoaWxkcmVuSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JUmVzb3VyY2VBd2FyZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQuUEJTRHJhZ0FuZERyb3BDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kLlBCU0Ryb3BDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Db21wYXJhdG9yczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuUHJvY2Vzc1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFydGlmYWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1pbGVzdG9uZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5Bc3NvY2lhdGlvbkhlbHBlcjsKLQotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBQQlNBY3Rpdml0eUl0ZW1Qcm92aWRlciBleHRlbmRzIEJTQWN0aXZpdHlJdGVtUHJvdmlkZXIgCi1pbXBsZW1lbnRzIElDYWNoZWRDaGlsZHJlbkl0ZW1Qcm92aWRlcgotewotCi0JcHJpdmF0ZSBEaXNwb3NhYmxlIHJvbGxlZFVwV3JhcHBlcnM7Ci0KLQkvKioKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgUEJTQWN0aXZpdHlJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CU0FjdGl2aXR5SXRlbVByb3ZpZGVyI2NvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKGphdmEudXRpbC5Db2xsZWN0aW9uLAotCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsCi0JCQlPYmplY3Qgb2JqZWN0KSB7Ci0JCS8vIEFjdGl2aXR5IGFjdCA9IChBY3Rpdml0eSkgb2JqZWN0OwotCQkvLyBpZihoYXNDaGlsZERlc2NyaXB0b3IoYWN0KSkgewotCQkvLyBuZXdDaGlsZERlc2NyaXB0b3JzLmFkZAotCQkvLyAoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIKLQkJLy8gKFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEFjdGl2aXR5X0JyZWFrZG93bkVsZW1lbnRzKCksCi0JCS8vIFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVdvcmtQcm9kdWN0RGVzY3JpcHRvcigpKSk7Ci0JCS8vIH0KLQkJLy8gZWxzZSB7Ci0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldEFjdGl2aXR5X0JyZWFrZG93bkVsZW1lbnRzKCksIFVtYUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJLmNyZWF0ZVBoYXNlKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRBY3Rpdml0eV9CcmVha2Rvd25FbGVtZW50cygpLCBVbWFGYWN0b3J5LmVJTlNUQU5DRQotCQkJCS5jcmVhdGVJdGVyYXRpb24oKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldEFjdGl2aXR5X0JyZWFrZG93bkVsZW1lbnRzKCksIFVtYUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJLmNyZWF0ZUFjdGl2aXR5KCkpKTsKLQotCQkvLyBpZihhY3QuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5pc0VtcHR5KCkpIHsKLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0QWN0aXZpdHlfQnJlYWtkb3duRWxlbWVudHMoKSwgVW1hRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkuY3JlYXRlV29ya1Byb2R1Y3REZXNjcmlwdG9yKCkpKTsKLQkJLy8gfQotCi0JCS8vIH0KLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRBY3Rpdml0eV9CcmVha2Rvd25FbGVtZW50cygpLCBVbWFGYWN0b3J5LmVJTlNUQU5DRQotCQkJCS5jcmVhdGVNaWxlc3RvbmUoKSkpOwotCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnRuZy5wcm9jZXNzLkJTQWN0aXZpdHlJdGVtUHJvdmlkZXIjYWNjZXB0QXNDaGlsZChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGFjY2VwdEFzQ2hpbGQoT2JqZWN0IGNoaWxkKSB7Ci0JCWNoaWxkID0gVG5nVXRpbC51bndyYXAoY2hpbGQpOwotCi0JCWlmIChjaGlsZCBpbnN0YW5jZW9mIEFjdGl2aXR5Ci0JCQkJfHwgY2hpbGQgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3IKLQkJCQl8fCBjaGlsZCBpbnN0YW5jZW9mIE1pbGVzdG9uZSkgewotCQkJcmV0dXJuIHN1cGVyLmFjY2VwdEFzQ2hpbGQoY2hpbGQpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldENoaWxkcmVuKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlpZiAocm9sbGVkVXBXcmFwcGVycyAhPSBudWxsKSB7Ci0JCQlyb2xsZWRVcFdyYXBwZXJzLmRpc3Bvc2UoKTsKLQkJfQotCi0JCWlmIChpc1JvbGxlZFVwKCkpIHsKLQkJCU1hcCB3b3JrUHJvZHVjdFRvV3JhcHBlcnNNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQkJQ29sbGVjdGlvbiBjaGlsZHJlbiA9IHN1cGVyLmdldENoaWxkcmVuKG9iamVjdCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjaGlsZHJlbi5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3QgY2hpbGQgPSBpdGVyLm5leHQoKTsKLQkJCQlPYmplY3QgZSA9IFRuZ1V0aWwudW53cmFwKGNoaWxkKTsKLQkJCQlpZiAoZSBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgewotCQkJCQlXb3JrUHJvZHVjdERlc2NyaXB0b3IgZGVzYyA9IChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIGU7Ci0JCQkJCUxpc3QgbGlzdCA9IEFzc29jaWF0aW9uSGVscGVyLmdldERlbGl2ZXJhYmxlRGVzY3JpcHRvcnMoZGVzYyk7Ci0JCQkJCU9iamVjdCB3cmFwcGVyS2V5ID0gZGVzYy5nZXRXb3JrUHJvZHVjdCgpID09IG51bGwgPyAoT2JqZWN0KWRlc2MgOiBkZXNjLmdldFdvcmtQcm9kdWN0KCk7Ci0JCQkJCUxpc3Qgd3JhcHBlcnMgPSAoTGlzdCkgd29ya1Byb2R1Y3RUb1dyYXBwZXJzTWFwLmdldCh3cmFwcGVyS2V5KTsKLQkJCQkJaWYgKGxpc3Quc2l6ZSgpIDwgMSkgewotCQkJCQkJLy8gY2hlY2sgaWYgdGhlIGRlc2NyaXB0b3IgYWxyZWFkeSBleGlzdHMgaW4gdGhlCi0JCQkJCQkvLyByb2xsdXAgbGlzdAotCQkJCQkJLy8KLQkJCQkJCWlmKHdyYXBwZXJzID09IG51bGwpIHsKLQkJCQkJCQl3cmFwcGVycyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJCQl3b3JrUHJvZHVjdFRvV3JhcHBlcnNNYXAucHV0KHdyYXBwZXJLZXksIHdyYXBwZXJzKTsKLQkJCQkJCQl3cmFwcGVycy5hZGQobmV3IENvbXBvc2VkV1BEZXNjcmlwdG9yV3JhcHBlckl0ZW1Qcm92aWRlcihjaGlsZCwgb2JqZWN0LCBhZGFwdGVyRmFjdG9yeSkpOwotCQkJCQkJfQotCQkJCQkJZWxzZSB7Ci0JCQkJCQkJZm9yIChpbnQgaSA9IHdyYXBwZXJzLnNpemUoKSAtIDE7IGkgPiAtMTsgaS0tKSB7Ci0JCQkJCQkJCSgoQ29tcG9zZWRXUERlc2NyaXB0b3JXcmFwcGVySXRlbVByb3ZpZGVyKXdyYXBwZXJzLmdldChpKSkuYWRkV29ya1Byb2R1Y3REZXNjcmlwdG9yKGNoaWxkKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQkJYm9vbGVhbiBjaGVja0V4aXN0ID0gdHJ1ZTsJCQkJCQkJCi0JCQkJCQkJaWYod3JhcHBlcnMgPT0gbnVsbCkgewotCQkJCQkJCQl3cmFwcGVycyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJCQkJd29ya1Byb2R1Y3RUb1dyYXBwZXJzTWFwLnB1dCh3cmFwcGVyS2V5LCB3cmFwcGVycyk7Ci0JCQkJCQkJCWNoZWNrRXhpc3QgPSBmYWxzZTsKLQkJCQkJCQl9Ci0JCQkJCQkJaWYoY2hlY2tFeGlzdCkgewotCQkJCQkJCQkvLyByZW1vdmUgYW55IHdyYXBwZXIgdGhhdCBpcyBub3Qgb2YgdHlwZSBEZWxpdmVyYWJsZVdvcmtQcm9kdWN0RGVzY3JpcHRvckl0ZW1Qcm92aWRlciBmcm9tIHRoZSB3cmFwcGVyIGxpc3QKLQkJCQkJCQkJLy8KLQkJCQkJCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IHdyYXBwZXJzLml0ZXJhdG9yKCk7IGl0ZXJhdG9yCi0JCQkJCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCQkJCU9iamVjdCB3cmFwcGVyID0gKE9iamVjdCkgaXRlcmF0b3IubmV4dCgpOwotCQkJCQkJCQkJaWYoISh3cmFwcGVyIGluc3RhbmNlb2YgRGVsaXZlcmFibGVXb3JrUHJvZHVjdERlc2NyaXB0b3JJdGVtUHJvdmlkZXIpKSB7Ci0JCQkJCQkJCQkJaXRlci5yZW1vdmUoKTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCQkJCQkJCQkKLQkJCQkJCQkJY2hlY2tFeGlzdCA9IHdyYXBwZXJzLnNpemUoKSA+IDA7Ci0JCQkJCQkJfQotCQkJCQkJCQotCQkJCQkJCS8vIHNob3cgb25lIGRlc2NyaXB0b3IgcGVyIGRlbGl2ZXJhYmxlCi0JCQkJCQkJLy8KLQkJCQkJCQlhZGRfZGVzY3JpcHRvcnM6Ci0JCQkJCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGxpc3QuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJCQkJCQlPYmplY3QgZGVsaXZlcmFibGVEZXNjcmlwdG9yID0gaXRlcmF0b3IubmV4dCgpOwotCQkJCQkJCQlpZihjaGVja0V4aXN0KSB7Ci0JCQkJCQkJCQlmb3IgKGludCBpID0gd3JhcHBlcnMuc2l6ZSgpIC0gMTsgaSA+IC0xOyBpLS0pIHsKLQkJCQkJCQkJCQlEZWxpdmVyYWJsZVdvcmtQcm9kdWN0RGVzY3JpcHRvckl0ZW1Qcm92aWRlciB3cmFwcGVyID0gKERlbGl2ZXJhYmxlV29ya1Byb2R1Y3REZXNjcmlwdG9ySXRlbVByb3ZpZGVyKSB3cmFwcGVycy5nZXQoaSk7Ci0JCQkJCQkJCQkJaWYod3JhcHBlci5kZWxpdmVyYWJsZURlc2NyaXB0b3IgPT0gZGVsaXZlcmFibGVEZXNjcmlwdG9yKSB7Ci0JCQkJCQkJCQkJCXdyYXBwZXIuYWRkV29ya1Byb2R1Y3REZXNjcmlwdG9yKGNoaWxkKTsKLQkJCQkJCQkJCQkJY29udGludWUgYWRkX2Rlc2NyaXB0b3JzOwotCQkJCQkJCQkJCX0KLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCi0JCQkJCQkJCURlbGl2ZXJhYmxlV29ya1Byb2R1Y3REZXNjcmlwdG9ySXRlbVByb3ZpZGVyIGl0ZW1Qcm92aWRlciA9IG5ldyBEZWxpdmVyYWJsZVdvcmtQcm9kdWN0RGVzY3JpcHRvckl0ZW1Qcm92aWRlcigKLQkJCQkJCQkJCQlkZXNjLCBvYmplY3QsIGFkYXB0ZXJGYWN0b3J5KTsKLQkJCQkJCQkJaXRlbVByb3ZpZGVyLmRlbGl2ZXJhYmxlRGVzY3JpcHRvciA9IGRlbGl2ZXJhYmxlRGVzY3JpcHRvcjsKLQkJCQkJCQkJd3JhcHBlcnMuYWRkKGl0ZW1Qcm92aWRlcik7Ci0JCQkJCQkJfQotCi0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlMaXN0IHJvbGxlZFVwQ2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB3b3JrUHJvZHVjdFRvV3JhcHBlcnNNYXAudmFsdWVzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJcm9sbGVkVXBDaGlsZHJlbi5hZGRBbGwoKENvbGxlY3Rpb24pIGl0ZXIubmV4dCgpKTsKLQkJCQkKLQkJCX0KLQkJCUxpc3QgcmVzdWx0ID0gcmVtb3ZlU3ViYXJ0aWZhY3RzRnJvbUNoaWxkcmVuKHJvbGxlZFVwQ2hpbGRyZW4sIHRydWUpOwotCQkJaWYocm9sbGVkVXBXcmFwcGVycyA9PSBudWxsKSB7Ci0JCQkJcm9sbGVkVXBXcmFwcGVycyA9IG5ldyBEaXNwb3NhYmxlKCk7Ci0JCQl9Ci0JCQlyb2xsZWRVcFdyYXBwZXJzLmFkZEFsbChyZXN1bHQpOwotCQkJCi0JCQkvLyBkaXNwb3NlIHdyYXBwZXJzIG9mIHN1YmFydGlmYWN0Ci0JCQkvLwotCQkJZm9yKGludCBpID0gcm9sbGVkVXBDaGlsZHJlbi5zaXplKCkgLSAxOyBpID4gLTE7IGktLSkgewotCQkJCUlXcmFwcGVySXRlbVByb3ZpZGVyIHdyYXBwZXIgPSAoSVdyYXBwZXJJdGVtUHJvdmlkZXIpIHJvbGxlZFVwQ2hpbGRyZW4uZ2V0KGkpOwotCQkJCWlmKCFyb2xsZWRVcFdyYXBwZXJzLmNvbnRhaW5zKHdyYXBwZXIpKSB7Ci0JCQkJCXdyYXBwZXIuZGlzcG9zZSgpOwotCQkJCX0KLQkJCX0KLQkJCQotCQkJQ29sbGVjdGlvbnMuc29ydChyZXN1bHQsIENvbXBhcmF0b3JzLlBSRVNFTlRBVElPTl9OQU1FX0NPTVBBUkFUT1IpOwotCQkJCi0JCQl1cGRhdGVDYWNoZWRDaGlsZHJlbihyZXN1bHQpOwotCQkJCi0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0KLQkJQ29sbGVjdGlvbiBjaGlsZHJlbiA9IHJlbW92ZVN1YmFydGlmYWN0c0Zyb21DaGlsZHJlbihzdXBlci5nZXRDaGlsZHJlbihvYmplY3QpLCBmYWxzZSk7Ci0JCQotCQl1cGRhdGVDYWNoZWRDaGlsZHJlbihjaGlsZHJlbik7Ci0JCQotCQlyZXR1cm4gY2hpbGRyZW47Ci0JfQkKLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuQnJlYWtkb3duRWxlbWVudEl0ZW1Qcm92aWRlciNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlpZihyb2xsZWRVcFdyYXBwZXJzICE9IG51bGwpIHsKLQkJCXJvbGxlZFVwV3JhcHBlcnMuZGlzcG9zZSgpOwotCQl9Ci0JCQotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CU0FjdGl2aXR5SXRlbVByb3ZpZGVyI2lzTmV3RGVzY3JpcHRvcihqYXZhLnV0aWwuTGlzdCwgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc05ld0Rlc2NyaXB0b3IoTGlzdCBjaGlsZHJlbiwgT2JqZWN0IGNoaWxkKSB7Ci0JCS8vIHJldHVybiB0cnVlIHRvIGxldCBvdmVycmlkZW4gZ2V0Q2hpbGRyZW4oKSB0byBoYW5kbGUgdGhlIHVuaXF1ZW5lc3Mgb2YgdGhlIHJvbGx1cCBsaXN0Ci0JCS8vCi0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CU0FjdGl2aXR5SXRlbVByb3ZpZGVyI2NyZWF0ZU9yTW92ZVBhY2thZ2VGb3IoamF2YS51dGlsLkxpc3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlT3JNb3ZlUGFja2FnZUZvcihMaXN0IG5ld0NoaWxkcmVuKSB7Ci0JCXN1cGVyLmNyZWF0ZU9yTW92ZVBhY2thZ2VGb3IobmV3Q2hpbGRyZW4pOwotCi0JCWZvciAoSXRlcmF0b3IgaXRlciA9IG5ld0NoaWxkcmVuLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGUgPSBpdGVyLm5leHQoKTsKLQkJCWlmIChlIGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yKSB7Ci0JCQkJLy8gYWRkIGRlbGl2ZXJhYmxlIHBhcnRzIHRvIHRoZSBhY3Rpdml0eSdzIHBhY2thZ2UKLQkJCQlXb3JrUHJvZHVjdERlc2NyaXB0b3Igd3BkID0gKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgZTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gd3BkLmdldERlbGl2ZXJhYmxlUGFydHMoKS5pdGVyYXRvcigpOyBpdGVyYXRvcgotCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yIHBhcnQgPSAoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBpdGVyYXRvcgotCQkJCQkJCS5uZXh0KCk7Ci0JCQkJCVByb2Nlc3NVdGlsLmFkZFRvQ29udGFpbmVyKHBhcnQsIHRoaXMsIGZhbHNlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuQlNBY3Rpdml0eUl0ZW1Qcm92aWRlciNnZXRPYmplY3Qob3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmlwdG9yKQotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZ2V0T2JqZWN0KERlc2NyaXB0b3IgZGVzY3JpcHRvcikgewotCQlyZXR1cm4gKChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIGRlc2NyaXB0b3IpLmdldFdvcmtQcm9kdWN0KCk7Ci0JfQotCi0JcHJvdGVjdGVkIENvbW1hbmQgY3JlYXRlRHJhZ0FuZERyb3BDb21tYW5kKEVkaXRpbmdEb21haW4gZG9tYWluLAotCQkJT2JqZWN0IG93bmVyLCBmbG9hdCBsb2NhdGlvbiwgaW50IG9wZXJhdGlvbnMsIGludCBvcGVyYXRpb24sCi0JCQlDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJcmV0dXJuIG5ldyBQQlNEcmFnQW5kRHJvcENvbW1hbmQoZG9tYWluLCBvd25lciwgbG9jYXRpb24sIG9wZXJhdGlvbnMsCi0JCQkJb3BlcmF0aW9uLCBjb2xsZWN0aW9uKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuQlNBY3Rpdml0eUl0ZW1Qcm92aWRlciNjcmVhdGVEcm9wQ29tbWFuZChqYXZhLmxhbmcuT2JqZWN0LAotCSAqICAgICAgamF2YS51dGlsLkxpc3QpCi0JICovCi0JcHVibGljIElSZXNvdXJjZUF3YXJlQ29tbWFuZCBjcmVhdGVEcm9wQ29tbWFuZChPYmplY3Qgb3duZXIsCi0JCQlMaXN0IGRyb3BFbGVtZW50cykgewotCQlyZXR1cm4gbmV3IFBCU0Ryb3BDb21tYW5kKChBY3Rpdml0eSkgb3duZXIsIGRyb3BFbGVtZW50cyk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkJTQWN0aXZpdHlJdGVtUHJvdmlkZXIjYWNjZXB0QXNSb2xsZWRVcENoaWxkKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0QXNSb2xsZWRVcENoaWxkKE9iamVjdCBjaGlsZCkgewotCQlPYmplY3Qgb2JqID0gVG5nVXRpbC51bndyYXAoY2hpbGQpOwotCi0JCWlmIChvYmogaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3IgJiYgKChXb3JrUHJvZHVjdERlc2NyaXB0b3Ipb2JqKS5nZXRTdXBlckFjdGl2aXRpZXMoKSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gc3VwZXIuYWNjZXB0QXNSb2xsZWRVcENoaWxkKG9iaik7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldEVDbGFzc2VzKCkgewotCQlyZXR1cm4gUHJvY2Vzc1V0aWwuZ2V0UEJTRWNsYXNzZXMoKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBEZWxpdmVyYWJsZVdvcmtQcm9kdWN0RGVzY3JpcHRvckl0ZW1Qcm92aWRlciBleHRlbmRzCi0JCQlDb21wb3NlZFdQRGVzY3JpcHRvcldyYXBwZXJJdGVtUHJvdmlkZXIgewotCi0JCXByaXZhdGUgT2JqZWN0IGRlbGl2ZXJhYmxlRGVzY3JpcHRvcjsKLQotCQkvKioKLQkJICogQHBhcmFtIHZhbHVlCi0JCSAqIEBwYXJhbSBvd25lcgotCQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkJICovCi0JCXB1YmxpYyBEZWxpdmVyYWJsZVdvcmtQcm9kdWN0RGVzY3JpcHRvckl0ZW1Qcm92aWRlcigKLQkJCQlXb3JrUHJvZHVjdERlc2NyaXB0b3IgdmFsdWUsIE9iamVjdCBvd25lciwKLQkJCQlBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQkJc3VwZXIodmFsdWUsIG93bmVyLCBhZGFwdGVyRmFjdG9yeSk7Ci0JCQlyZWFkT25seSA9IGZhbHNlOwotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyI2dldEF0dHJpYnV0ZShqYXZhLmxhbmcuT2JqZWN0LAotCQkgKiAgICAgIGphdmEubGFuZy5TdHJpbmcpCi0JCSAqLwotCQlwdWJsaWMgU3RyaW5nIGdldEF0dHJpYnV0ZShPYmplY3Qgb2JqZWN0LCBTdHJpbmcgcHJvcGVydHkpIHsKLQkJCWlmIChwcm9wZXJ0eSA9PSBJQlNJdGVtUHJvdmlkZXIuQ09MX0RFTElWRVJBQkxFKSB7Ci0JCQkJcmV0dXJuIFRuZ1V0aWwuZ2V0UHJlc2VudGF0aW9uTmFtZShkZWxpdmVyYWJsZURlc2NyaXB0b3IpOwotCQkJfQotCQkJcmV0dXJuIHN1cGVyLmdldEF0dHJpYnV0ZShvYmplY3QsIHByb3BlcnR5KTsKLQkJfQotCi0JfQotCi0JcHJvdGVjdGVkIExpc3QgcmVtb3ZlU3ViYXJ0aWZhY3RzRnJvbUNoaWxkcmVuKENvbGxlY3Rpb24gY2hpbGRyZW4sIGJvb2xlYW4gdW53cmFwKSB7Ci0JCUxpc3Q8Pz4gbGlzdCA9IFByb2Nlc3NVdGlsLnJlbW92ZVN1YmFydGlmYWN0c0Zyb21DaGlsZHJlbihjaGlsZHJlbiwgdW53cmFwKTsKLQkJaWYobGlzdC5zaXplKCkgIT0gIGNoaWxkcmVuLnNpemUoKSkgewotCQkJLy8gcGFyZW50IG9mIGRlc2NyaXB0b3JzIG9mIHN1YmFydGlmYWN0cyBoYXMgYmVlbiBzZXQgdG8gdGhpcyBhY3Rpdml0eQotCQkJLy8gaXRlcmF0ZSB0aGUgc3VidHJlZSBvZiB0aGUgYXJ0aWZhY3QgZGVzY3JpcHRvcnMgaW4gY2hpZHJlbiBsaXN0IHRvIGNvcnJlY3QgdGhpcwotCQkJLy8KLQkJCWZvciAoSXRlcmF0b3I8Pz4gaXRlcmF0b3IgPSBjaGlsZHJlbi5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IGNoaWxkID0gKE9iamVjdCkgaXRlcmF0b3IubmV4dCgpOwotCQkJCWlmKGNoaWxkIGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yICYmICgoV29ya1Byb2R1Y3REZXNjcmlwdG9yKWNoaWxkKS5nZXRXb3JrUHJvZHVjdCgpIGluc3RhbmNlb2YgQXJ0aWZhY3QpIHsKLQkJCQkJZm9yKEFkYXB0ZXJGYWN0b3J5VHJlZUl0ZXJhdG9yPD8+IGl0ZXIgPSBuZXcgQWRhcHRlckZhY3RvcnlUcmVlSXRlcmF0b3I8T2JqZWN0PihhZGFwdGVyRmFjdG9yeSwgY2hpbGQpOwotCQkJCQkJaXRlci5oYXNOZXh0KCk7IGl0ZXIubmV4dCgpKTsJCQkJCQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbGlzdDsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1dyYXBwaW5nUm9sbHVwTmVlZGVkKE9iamVjdCBvYmplY3QpIHsKLQkJaWYoVG5nVXRpbC51bndyYXAob2JqZWN0KSBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmlzV3JhcHBpbmdSb2xsdXBOZWVkZWQob2JqZWN0KTsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvUEJTSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9QQlNJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYWJmZDFlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9QQlNJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBQQlNJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSBleHRlbmRzIEl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5IHsKLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkJyZWFrZG93bkFkYXB0ZXJGYWN0b3J5I2NyZWF0ZUFjdGl2aXR5QWRhcHRlcigpCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQWN0aXZpdHlBZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IFBCU0FjdGl2aXR5SXRlbVByb3ZpZGVyKHRoaXMpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkJyZWFrZG93bkFkYXB0ZXJGYWN0b3J5I2NyZWF0ZVBoYXNlQWRhcHRlcigpCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlTWlsZXN0b25lQWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBQQlNNaWxlc3RvbmVJdGVtUHJvdmlkZXIodGhpcywgKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIFRuZ1V0aWwudW1hSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkKLQkJCQkuY3JlYXRlTWlsZXN0b25lQWRhcHRlcigpKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5CcmVha2Rvd25BZGFwdGVyRmFjdG9yeSNjcmVhdGVJdGVyYXRpb25BZGFwdGVyKCkKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVJdGVyYXRpb25BZGFwdGVyKCkgewotCQlyZXR1cm4gY3JlYXRlQWN0aXZpdHlBZGFwdGVyKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQnJlYWtkb3duQWRhcHRlckZhY3RvcnkjY3JlYXRlUGhhc2VBZGFwdGVyKCkKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVQaGFzZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBjcmVhdGVBY3Rpdml0eUFkYXB0ZXIoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkjY3JlYXRlUHJvY2Vzc0FkYXB0ZXIoKQotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVByb2Nlc3NBZGFwdGVyKCkgewotCQlyZXR1cm4gY3JlYXRlQWN0aXZpdHlBZGFwdGVyKCk7Ci0JfQotCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQ2FwYWJpbGl0eVBhdHRlcm5BZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IFBCU1Byb2Nlc3NJdGVtUHJvdmlkZXIodGhpcywgKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIFRuZ1V0aWwudW1hSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkKLQkJCQkuY3JlYXRlQ2FwYWJpbGl0eVBhdHRlcm5BZGFwdGVyKCkpOwotCX0KLQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZURlbGl2ZXJ5UHJvY2Vzc0FkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgUEJTUHJvY2Vzc0l0ZW1Qcm92aWRlcih0aGlzLCAoSXRlbVByb3ZpZGVyQWRhcHRlcikgVG5nVXRpbC51bWFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeQotCQkJCS5jcmVhdGVEZWxpdmVyeVByb2Nlc3NBZGFwdGVyKCkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL1BCU01pbGVzdG9uZUl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL1BCU01pbGVzdG9uZUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YzE4ODgxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9QQlNNaWxlc3RvbmVJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2VzczsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuUHJvY2Vzc1V0aWw7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUEJTTWlsZXN0b25lSXRlbVByb3ZpZGVyIGV4dGVuZHMgQnJlYWtkb3duRWxlbWVudEl0ZW1Qcm92aWRlciB7Ci0KLQkvLyBwcml2YXRlIENvbGxlY3Rpb24gZUNsYXNzZXMgPSBuZXcgSGFzaFNldCgpOwotCi0JLyoqCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICovCi0JcHVibGljIFBCU01pbGVzdG9uZUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwKLQkJCUl0ZW1Qcm92aWRlckFkYXB0ZXIgZGVsZWdhdGVJdGVtUHJvdmlkZXIpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnksIGRlbGVnYXRlSXRlbVByb3ZpZGVyKTsKLQl9Ci0KLQkvLyAvKiAobm9uLUphdmFkb2MpCi0JLy8gKiBAc2VlCi0JLy8gY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5XQlNBY3Rpdml0eUl0ZW1Qcm92aWRlciNnZXRDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0KQotCS8vICovCi0JLy8gcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCS8vIHJldHVybiBUbmdVdGlsLmdldEFsbENoaWxkcmVuKChQcm9jZXNzQ29udHJpYnV0aW9uKSBvYmplY3QsCi0JLy8gc3VwZXIuZ2V0Q2hpbGRyZW4ob2JqZWN0KSwKLQkvLyBUbmdVdGlsLmdldEJlc3RBZGFwdGVyRmFjdG9yeShhZGFwdGVyRmFjdG9yeSkpOwotCS8vIH0KLQkvLyAgICAKLQkvLyAvKiAobm9uLUphdmFkb2MpCi0JLy8gKiBAc2VlCi0JLy8gb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRFbGVtZW50cyhqYXZhLmxhbmcuT2JqZWN0KQotCS8vICovCi0JLy8gcHVibGljIENvbGxlY3Rpb24gZ2V0RWxlbWVudHMoT2JqZWN0IG9iamVjdCkgewotCS8vIENvbGxlY3Rpb24gZWxlbWVudHMgPSBzdXBlci5nZXRFbGVtZW50cyhvYmplY3QpOwotCS8vIHJldHVybiBlbGVtZW50czsKLQkvLyB9Ci0KLQkvLyBwdWJsaWMgTGlzdCBnZXRGaWx0ZXJlZEJyZWFrZG93bkVsZW1lbnRzKE9iamVjdCBhY3Rpdml0eSwgT2JqZWN0IG9iaikKLQkvLyB7Ci0JLy8gTGlzdCBlbGVtZW50cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkvLyBMaXN0IGJyZWFrZG93bkVsZW1lbnRzID0gKChBY3Rpdml0eSlhY3Rpdml0eSkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKTsKLQkvLyBmb3IgKEl0ZXJhdG9yIGl0ID0gYnJlYWtkb3duRWxlbWVudHMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykKLQkvLyB7Ci0JLy8gT2JqZWN0IGVsZW1lbnRPYmogPSBpdC5uZXh0KCk7Ci0JLy8gaWYgKChlbGVtZW50T2JqIGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yKSB8fCAoZWxlbWVudE9iagotCS8vIGluc3RhbmNlb2YgTWlsZXN0b25lKSB8fCAoZWxlbWVudE9iaiBpbnN0YW5jZW9mIEFjdGl2aXR5KSkKLQkvLyB7Ci0JLy8gZWxlbWVudHMuYWRkKGVsZW1lbnRPYmopOwotCS8vIH0KLQkvLyB9Ci0JLy8gcmV0dXJuIGVsZW1lbnRzOwotCS8vIH0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldEVDbGFzc2VzKCkgewotCQlyZXR1cm4gUHJvY2Vzc1V0aWwuZ2V0UEJTRWNsYXNzZXMoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9QQlNQcm9jZXNzSXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvUEJTUHJvY2Vzc0l0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Y2YxYjBlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9QQlNQcm9jZXNzSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3M7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci0KLXB1YmxpYyBjbGFzcyBQQlNQcm9jZXNzSXRlbVByb3ZpZGVyIGV4dGVuZHMgUEJTQWN0aXZpdHlJdGVtUHJvdmlkZXIgewotCi0JcHJpdmF0ZSBJdGVtUHJvdmlkZXJBZGFwdGVyIGRlbGVnYXRlSXRlbVByb3ZpZGVyOwotCi0JcHVibGljIFBCU1Byb2Nlc3NJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksCi0JCQlJdGVtUHJvdmlkZXJBZGFwdGVyIGRlbGVnYXRlSXRlbVByb3ZpZGVyKSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQkJdGhpcy5kZWxlZ2F0ZUl0ZW1Qcm92aWRlciA9IGRlbGVnYXRlSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5BY3Rpdml0eUl0ZW1Qcm92aWRlciNnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9IGRlbGVnYXRlSXRlbVByb3ZpZGVyCi0JCQkJCS5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL1Byb2Nlc3NDb21wb25lbnRJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9Qcm9jZXNzQ29tcG9uZW50SXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3ZGYxOWYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL1Byb2Nlc3NDb21wb25lbnRJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3M7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUHJvY2Vzc0NvbXBvbmVudEl0ZW1Qcm92aWRlciBleHRlbmRzCi0JCW9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuUHJvY2Vzc0NvbXBvbmVudEl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzCi0JCUlQcm9jZXNzSXRlbVByb3ZpZGVyIHsKLQotCS8vIHByaXZhdGUgc3RhdGljIGNsYXNzIFByb2Nlc3NMaXN0ZW5lciBleHRlbmRzIEFkYXB0ZXJJbXBsIHsKLQkvLyBwcml2YXRlIEl0ZW1Qcm92aWRlckFkYXB0ZXIgaXRlbVByb3ZpZGVyOwotCS8vIHByaXZhdGUgT2JqZWN0IHJlZnJlc2hPYmo7Ci0JLy8KLQkvLyAvKioKLQkvLyAqCi0JLy8gKi8KLQkvLyBwdWJsaWMgUHJvY2Vzc0xpc3RlbmVyKEl0ZW1Qcm92aWRlckFkYXB0ZXIgaXRlbVByb3ZpZGVyLCBPYmplY3QKLQkvLyByZWZyZXNoT2JqKSB7Ci0JLy8gdGhpcy5pdGVtUHJvdmlkZXIgPSBpdGVtUHJvdmlkZXI7Ci0JLy8gdGhpcy5yZWZyZXNoT2JqID0gcmVmcmVzaE9iajsKLQkvLyB9Ci0JLy8gICAgICAgIAotCS8vIC8qIChub24tSmF2YWRvYykKLQkvLyAqIEBzZWUKLQkvLyBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsI25vdGlmeUNoYW5nZWQob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uKQotCS8vICovCi0JLy8gcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbXNnKSB7Ci0JLy8gc3dpdGNoKG1zZy5nZXRGZWF0dXJlSUQoUHJvY2Vzcy5jbGFzcykpIHsKLQkvLyBjYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19fQlJFQUtET1dOX0VMRU1FTlRTOgotCS8vIGl0ZW1Qcm92aWRlci5maXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG1zZywgcmVmcmVzaE9iaiwKLQkvLyB0cnVlLCBmYWxzZSkpOwotCS8vIHJldHVybjsKLQkvLyB9Ci0JLy8gfQotCS8vIH07Ci0KLQkvKioKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgUHJvY2Vzc0NvbXBvbmVudEl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2NvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKGphdmEudXRpbC5Db2xsZWN0aW9uLAotCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsCi0JCQlPYmplY3Qgb2JqZWN0KSB7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldENoaWxkcmVuRmVhdHVyZXMoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbkZlYXR1cmVzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGNoaWxkcmVuRmVhdHVyZXMgPT0gbnVsbCkgewotCQkJY2hpbGRyZW5GZWF0dXJlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWNoaWxkcmVuRmVhdHVyZXMuYWRkKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCS5nZXRQcm9jZXNzQ29tcG9uZW50X1Byb2Nlc3MoKSk7Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuRmVhdHVyZXM7Ci0JfQotCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChQcm9jZXNzQ29tcG9uZW50LmNsYXNzKSkgewotCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfX05BTUU6Ci0JCQlQcm9jZXNzQ29tcG9uZW50IHBjID0gKFByb2Nlc3NDb21wb25lbnQpIG5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpOwotCQkJaWYgKHBjLmdldFByb2Nlc3MoKSAhPSBudWxsKSB7Ci0JCQkJYm9vbGVhbiBvbGQgPSBwYy5nZXRQcm9jZXNzKCkuZURlbGl2ZXIoKTsKLQkJCQl0cnkgewotCQkJCQlwYy5nZXRQcm9jZXNzKCkuZVNldERlbGl2ZXIoZmFsc2UpOwotCQkJCQlwYy5nZXRQcm9jZXNzKCkuc2V0TmFtZShwYy5nZXROYW1lKCkpOwotCQkJCX0gZmluYWxseSB7Ci0JCQkJCXBjLmdldFByb2Nlc3MoKS5lU2V0RGVsaXZlcihvbGQpOwotCQkJCX0KLQkJCX0KLQkJCWJyZWFrOwotCQkJCi0JCS8vIGF2b2lkIHJlZnJlc2hpbmcgdmlld2VycyB3aGVuIG5ldyBwcm9jZXNzIGVsZW1lbnQgb3IgZGlhZ3JhbSBpcyBhZGRlZCB0byB0aGUgcHJvY2VzcyBjb21wb25lbnQKLQkJLy8KLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX19QUk9DRVNTX0VMRU1FTlRTOgotCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfX0RJQUdSQU1TOgotCQkJcmV0dXJuOwotCQkJCi0JCX0JCQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLy8gcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCS8vIExpc3QgY2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KCk7Ci0JLy8gUHJvY2VzcyBwcm9jID0gKChQcm9jZXNzQ29tcG9uZW50KW9iamVjdCkuZ2V0UHJvY2VzcygpOwotCS8vIGlmKHByb2MgIT0gbnVsbCkgewotCS8vIGlmKFRuZ1V0aWwuZ2V0QWRhcHRlcihwcm9jLCBQcm9jZXNzTGlzdGVuZXIuY2xhc3MpID09IG51bGwpIHsKLQkvLyBwcm9jLmVBZGFwdGVycygpLmFkZChuZXcgUHJvY2Vzc0xpc3RlbmVyKHRoaXMsIG9iamVjdCkpOwotCS8vIH0KLQkvLyBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBwcm9jLmdldEJyZWFrZG93bkVsZW1lbnRzKCkuaXRlcmF0b3IoKTsKLQkvLyBpdGVyLmhhc05leHQoKTspIHsKLQkvLyBPYmplY3QgZWxlbWVudCA9IGl0ZXIubmV4dCgpOwotCS8vIGlmKGVsZW1lbnQgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCS8vIGNoaWxkcmVuLmFkZChlbGVtZW50KTsKLQkvLyB9Ci0JLy8gfQotCS8vIH0KLQkvLyByZXR1cm4gY2hpbGRyZW47Ci0JLy8gfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldEltYWdlKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JLy8gcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JLy8gcmV0dXJuIHN1cGVyLmdldEltYWdlKG9iamVjdCk7Ci0JLy8gfQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRUZXh0KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIFRuZ1V0aWwuZ2V0TGFiZWwob2JqZWN0LCBnZXRTdHJpbmcoIl9VSV9Qcm9jZXNzQ29tcG9uZW50X3R5cGUiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZGlzcG9zZSgpCi0JICovCi0JLy8gcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkvLyAvLyByZW1vdmUgYWxsIHByb2Nlc3MgbGlzdGVuZXJzIGZyb20gYWxsIHRhcmdldHMKLQkvLyAvLwotCS8vIGlmICh0YXJnZXQgIT0gbnVsbCkKLQkvLyB7Ci0JLy8gdGFyZ2V0LmVBZGFwdGVycygpLnJlbW92ZSh0aGlzKTsKLQkvLyBpZiAodGFyZ2V0cyAhPSBudWxsKQotCS8vIHsKLQkvLyBmb3IgKEl0ZXJhdG9yIGkgPSB0YXJnZXRzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0JLy8gewotCS8vIE5vdGlmaWVyIG90aGVyVGFyZ2V0ID0gKE5vdGlmaWVyKWkubmV4dCgpOwotCS8vIG90aGVyVGFyZ2V0LmVBZGFwdGVycygpLnJlbW92ZSh0aGlzKTsKLQkvLyB9Ci0JLy8gfQotCS8vIH0KLQkvLwotCS8vIHN1cGVyLmRpc3Bvc2UoKTsKLQkvLyB9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9Qcm9jZXNzUGFja2FnZUl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL1Byb2Nlc3NQYWNrYWdlSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1NGVlODUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL1Byb2Nlc3NQYWNrYWdlSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLQotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlIC0gU2VwIDMwLCAyMDA1Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9jZXNzUGFja2FnZUl0ZW1Qcm92aWRlciBleHRlbmRzCi0JCW9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuUHJvY2Vzc1BhY2thZ2VJdGVtUHJvdmlkZXIgewotCi0JLyoqCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICovCi0JcHVibGljIFByb2Nlc3NQYWNrYWdlSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvUm9sZURlc2NyaXB0b3JJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9Sb2xlRGVzY3JpcHRvckl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNTY2YWEwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9Sb2xlRGVzY3JpcHRvckl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Qcm9jZXNzVXRpbDsKLQotCi1wdWJsaWMgY2xhc3MgUm9sZURlc2NyaXB0b3JJdGVtUHJvdmlkZXIgZXh0ZW5kcyBEZXNjcmlwdG9ySXRlbVByb3ZpZGVyIHsKLQotCS8qKgotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqLwotCXB1YmxpYyBSb2xlRGVzY3JpcHRvckl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwKLQkJCUl0ZW1Qcm92aWRlckFkYXB0ZXIgZGVsZWdhdGVJdGVtUHJvdmlkZXIpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnksIGRlbGVnYXRlSXRlbVByb3ZpZGVyKTsKLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRFQ2xhc3NlcygpIHsKLQkJcmV0dXJuIFByb2Nlc3NVdGlsLmdldE9CU0VjbGFzc2VzKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvUm9sZURlc2NyaXB0b3JXcmFwcGVySXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvUm9sZURlc2NyaXB0b3JXcmFwcGVySXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyOTgzODguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL1JvbGVEZXNjcmlwdG9yV3JhcHBlckl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdG9yOwotCi0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFJvbGVEZXNjcmlwdG9yV3JhcHBlckl0ZW1Qcm92aWRlciBleHRlbmRzCi0JCUJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyIHsKLQkKLQlwcm90ZWN0ZWQgUm9sZURlc2NyaXB0b3JXcmFwcGVySXRlbVByb3ZpZGVyKE9iamVjdCB2YWx1ZSwgT2JqZWN0IG93bmVyLCBBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcih2YWx1ZSwgb3duZXIsIGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiBAcGFyYW0gb3duZXIKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgUm9sZURlc2NyaXB0b3JXcmFwcGVySXRlbVByb3ZpZGVyKFJvbGVEZXNjcmlwdG9yIHZhbHVlLAotCQkJT2JqZWN0IG93bmVyLCBBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcih2YWx1ZSwgb3duZXIsIGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiBAcGFyYW0gb3duZXIKLQkgKiBAcGFyYW0gaW5kZXgKLQkgKiBAcGFyYW0gZmVhdHVyZQotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqLwotCXB1YmxpYyBSb2xlRGVzY3JpcHRvcldyYXBwZXJJdGVtUHJvdmlkZXIoUm9sZURlc2NyaXB0b3IgdmFsdWUsCi0JCQlPYmplY3Qgb3duZXIsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBpbnQgaW5kZXgsCi0JCQlBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcih2YWx1ZSwgb3duZXIsIGZlYXR1cmUsIGluZGV4LCBhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gaXNJbmhlcml0ZWQoKSB7Ci0JCWlmKGdldFZhbHVlKCkgaW5zdGFuY2VvZiBDb21wb3NlZEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSB7Ci0JCQlyZXR1cm4gKChDb21wb3NlZEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKWdldFZhbHVlKCkpLmlzSW5oZXJpdGVkKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmlzSW5oZXJpdGVkKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL1JvbGVJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9Sb2xlSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwYjIxYjguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL1JvbGVJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2VzczsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotCi0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFJvbGVJdGVtUHJvdmlkZXIgZXh0ZW5kcyBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLlJvbGVJdGVtUHJvdmlkZXIgewotCi0JLyoqCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICovCi0JcHVibGljIFJvbGVJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5EZXNjcmliYWJsZUVsZW1lbnRJdGVtUHJvdmlkZXIjZ2V0Q2hpbGRyZW5GZWF0dXJlcyhqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuRmVhdHVyZXMoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9UYXNrRGVzY3JpcHRvckl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL1Rhc2tEZXNjcmlwdG9ySXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4ZWFiMTYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL1Rhc2tEZXNjcmlwdG9ySXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3M7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuUHJvY2Vzc1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya0JyZWFrZG93bkVsZW1lbnQ7Ci0KLQotcHVibGljIGNsYXNzIFRhc2tEZXNjcmlwdG9ySXRlbVByb3ZpZGVyIGV4dGVuZHMgRGVzY3JpcHRvckl0ZW1Qcm92aWRlciB7Ci0KLQkvKioKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgVGFza0Rlc2NyaXB0b3JJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksCi0JCQlJdGVtUHJvdmlkZXJBZGFwdGVyIGRlbGVnYXRlSXRlbVByb3ZpZGVyKSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5LCBkZWxlZ2F0ZUl0ZW1Qcm92aWRlcik7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkJyZWFrZG93bkVsZW1lbnRJdGVtUHJvdmlkZXIjbm90aWZ5Q2hhbmdlZChvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb24pCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0KLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKFdvcmtCcmVha2Rvd25FbGVtZW50LmNsYXNzKSkgewotCQljYXNlIFVtYVBhY2thZ2UuV09SS19CUkVBS0RPV05fRUxFTUVOVF9fSVNfUkVQRUFUQUJMRToKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfQlJFQUtET1dOX0VMRU1FTlRfX0lTX09OR09JTkc6Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19JU19FVkVOVF9EUklWRU46Ci0JCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uCi0JCQkJCS5nZXROb3RpZmllcigpLCBmYWxzZSwgdHJ1ZSkpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldEVDbGFzc2VzKCkgewotCQlyZXR1cm4gUHJvY2Vzc1V0aWwuZ2V0V0JTRWNsYXNzZXMoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9UYXNrRGVzY3JpcHRvcldyYXBwZXJJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9UYXNrRGVzY3JpcHRvcldyYXBwZXJJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODA4NGZkMS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvVGFza0Rlc2NyaXB0b3JXcmFwcGVySXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0b3I7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgVGFza0Rlc2NyaXB0b3JXcmFwcGVySXRlbVByb3ZpZGVyIGV4dGVuZHMKLQkJQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIgewkKLQotCXByb3RlY3RlZCBUYXNrRGVzY3JpcHRvcldyYXBwZXJJdGVtUHJvdmlkZXIoT2JqZWN0IHZhbHVlLCBPYmplY3Qgb3duZXIsIEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKHZhbHVlLCBvd25lciwgYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSB2YWx1ZQotCSAqIEBwYXJhbSBvd25lcgotCSAqIEBwYXJhbSBpbmRleAotCSAqIEBwYXJhbSBmZWF0dXJlCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICovCi0JcHVibGljIFRhc2tEZXNjcmlwdG9yV3JhcHBlckl0ZW1Qcm92aWRlcihUYXNrRGVzY3JpcHRvciB2YWx1ZSwKLQkJCU9iamVjdCBvd25lciwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIGludCBpbmRleCwKLQkJCUFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKHZhbHVlLCBvd25lciwgZmVhdHVyZSwgaW5kZXgsIGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJpYnV0ZShPYmplY3Qgb2JqZWN0LCBTdHJpbmcgcHJvcGVydHkpIHsKLQkJaWYoZ2V0VmFsdWUoKSBpbnN0YW5jZW9mIENvbXBvc2VkQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIHsKLQkJCXJldHVybiAoKENvbXBvc2VkQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpZ2V0VmFsdWUoKSkuZ2V0QXR0cmlidXRlKG9iamVjdCwgcHJvcGVydHkpOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRBdHRyaWJ1dGUob2JqZWN0LCBwcm9wZXJ0eSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGlzSW5oZXJpdGVkKCkgewotCQlpZihnZXRWYWx1ZSgpIGluc3RhbmNlb2YgQ29tcG9zZWRCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgewotCQkJcmV0dXJuICgoQ29tcG9zZWRCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcilnZXRWYWx1ZSgpKS5pc0luaGVyaXRlZCgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5pc0luaGVyaXRlZCgpOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9UZWFtUHJvZmlsZUl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL1RlYW1Qcm9maWxlSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyYjY0ZTcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL1RlYW1Qcm9maWxlSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNTQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklBY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JUmVzb3VyY2VBd2FyZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQuR2VuZXJpY0Ryb3BDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kLk9CU0RyYWdBbmREcm9wQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuUHJvY2Vzc1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZWFtUHJvZmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFRlYW1Qcm9maWxlSXRlbVByb3ZpZGVyIGV4dGVuZHMgQnJlYWtkb3duRWxlbWVudEl0ZW1Qcm92aWRlciB7Ci0KLQkvLyBwcml2YXRlIENvbGxlY3Rpb24gZUNsYXNzZXM7Ci0JLy8gcHJpdmF0ZSBDb2xsZWN0aW9uIHRlYW1Sb2xlV3JhcHBlcnM7Ci0JcHJpdmF0ZSBHZW5lcmljRHJvcENvbW1hbmQuRWxlbWVudEFkYXB0ZXIgZHJvcEFkYXB0ZXI7Ci0KLQkvKioKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgVGVhbVByb2ZpbGVJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksCi0JCQlJdGVtUHJvdmlkZXJBZGFwdGVyIGRlbGVnYXRlSXRlbVByb3ZpZGVyKSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5LCBkZWxlZ2F0ZUl0ZW1Qcm92aWRlcik7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkJyZWFrZG93bkVsZW1lbnRJdGVtUHJvdmlkZXIjY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoamF2YS51dGlsLkNvbGxlY3Rpb24sCi0JICogICAgICBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywKLQkJCU9iamVjdCBvYmplY3QpIHsKLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0VGVhbVByb2ZpbGVfU3ViVGVhbSgpLCBVbWFGYWN0b3J5LmVJTlNUQU5DRQotCQkJCS5jcmVhdGVUZWFtUHJvZmlsZSgpKSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkJyZWFrZG93bkVsZW1lbnRJdGVtUHJvdmlkZXIjZ2V0Q2hpbGRyZW5GZWF0dXJlcyhqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuRmVhdHVyZXMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoY2hpbGRyZW5GZWF0dXJlcyA9PSBudWxsKSB7Ci0JCQljaGlsZHJlbkZlYXR1cmVzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCQljaGlsZHJlbkZlYXR1cmVzLmFkZChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUZWFtUHJvZmlsZV9TdWJUZWFtKCkpOwotCQl9Ci0KLQkJcmV0dXJuIGNoaWxkcmVuRmVhdHVyZXM7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkJTQWN0aXZpdHlJdGVtUHJvdmlkZXIjY3JlYXRlRHJvcENvbW1hbmQoamF2YS5sYW5nLk9iamVjdCwKLQkgKiAgICAgIGphdmEudXRpbC5MaXN0KQotCSAqLwotCXB1YmxpYyBJUmVzb3VyY2VBd2FyZUNvbW1hbmQgY3JlYXRlRHJvcENvbW1hbmQoT2JqZWN0IG93bmVyLAotCQkJTGlzdCBkcm9wRWxlbWVudHMpIHsKLQkJcmV0dXJuIG5ldyBHZW5lcmljRHJvcENvbW1hbmQoKFRlYW1Qcm9maWxlKSBvd25lciwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0VGVhbVByb2ZpbGVfVGVhbVJvbGVzKCksIGRyb3BFbGVtZW50cywKLQkJCQlnZXREcm9wQWRhcHRlcihvd25lcikpOwotCX0KLQotCXByaXZhdGUgR2VuZXJpY0Ryb3BDb21tYW5kLkVsZW1lbnRBZGFwdGVyIGdldERyb3BBZGFwdGVyKE9iamVjdCBvd25lcikgewotCQlCcmVha2Rvd25FbGVtZW50SXRlbVByb3ZpZGVyIGFkYXB0ZXIgPSAoQnJlYWtkb3duRWxlbWVudEl0ZW1Qcm92aWRlcikgYWRhcHRlckZhY3RvcnkKLQkJCQkuYWRhcHQob3duZXIsIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLmNsYXNzKTsKLQkJcmV0dXJuIGFkYXB0ZXIuY3JlYXRlRHJvcEFkYXB0ZXIoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuV0JTQWN0aXZpdHlJdGVtUHJvdmlkZXIjZ2V0Q2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCUNvbGxlY3Rpb24gY2hpbGRyZW4gPSBzdXBlci5nZXRDaGlsZHJlbihvYmplY3QpOwotCi0JCS8vIGFkZCB0ZWFtIHJvbGVzCi0JCS8vCi0JCUlGaWx0ZXIgZmlsdGVyID0gUHJvY2Vzc1V0aWwuZ2V0RmlsdGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQkJYm9vbGVhbiBudWxsRmlsdGVyID0gZmlsdGVyID09IG51bGw7Ci0JCVRlYW1Qcm9maWxlIHRlYW1Qcm9maWxlID0gKFRlYW1Qcm9maWxlKSBvYmplY3Q7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHRlYW1Qcm9maWxlLmdldFRlYW1Sb2xlcygpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkuaGFzTmV4dCgpOykgewotCQkJUm9sZURlc2NyaXB0b3IgZGVzYyA9IChSb2xlRGVzY3JpcHRvcikgaXRlci5uZXh0KCk7Ci0JCQlpZiAoZGVzYy5nZXRTdXBlckFjdGl2aXRpZXMoKSA9PSBudWxsICYmIChudWxsRmlsdGVyIHx8IGZpbHRlci5hY2NlcHQoZGVzYykpKSB7Ci0JCQkJY2hpbGRyZW4uYWRkKGRlc2MpOwotCQkJfQotCQl9Ci0KLQkJLy8gc2V0IHBhcmVudCBmb3IgdGhlIGNoaWxkcmVuJ3MgaXRlbSBwcm92aWRlcnMKLQkJLy8KLQkJZm9yIChJdGVyYXRvciBpdGVyID0gY2hpbGRyZW4uaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlQcm9jZXNzVXRpbC5zZXRQYXJlbnQoaXRlci5uZXh0KCksIG9iamVjdCwgZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCkpOwotCQl9Ci0KLQkJcmV0dXJuIGNoaWxkcmVuOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNkaXNwb3NlKCkKLQkgKi8KLQkvLyBwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCS8vIGZvciAoSXRlcmF0b3IgaXRlciA9IHRlYW1Sb2xlV3JhcHBlcnMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JLy8gSVdyYXBwZXJJdGVtUHJvdmlkZXIgd3JhcHBlciA9IChJV3JhcHBlckl0ZW1Qcm92aWRlcikgaXRlci5uZXh0KCk7Ci0JLy8gd3JhcHBlci5kaXNwb3NlKCk7Ci0JLy8gfQotCS8vIHRlYW1Sb2xlV3JhcHBlcnMuY2xlYXIoKTsKLQkvLwkJCi0JLy8gc3VwZXIuZGlzcG9zZSgpOwotCS8vIH0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuQnJlYWtkb3duRWxlbWVudEl0ZW1Qcm92aWRlciNub3RpZnlDaGFuZ2VkKG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoVGVhbVByb2ZpbGUuY2xhc3MpKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5URUFNX1BST0ZJTEVfX1NVQl9URUFNOgotCQkJaW50IGV2ZW50VHlwZSA9IG5vdGlmaWNhdGlvbi5nZXRFdmVudFR5cGUoKTsKLQkJCWlmIChldmVudFR5cGUgPT0gTm90aWZpY2F0aW9uLkFERAotCQkJCQl8fCBldmVudFR5cGUgPT0gTm90aWZpY2F0aW9uLkFERF9NQU5ZKSB7Ci0JCQkJTGlzdCBzdWJUZWFtcyA9IFByb2Nlc3NVdGlsLmdldEFmZmVjdGVkRWxlbWVudHMobm90aWZpY2F0aW9uLAotCQkJCQkJbnVsbCk7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gc3ViVGVhbXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCVRlYW1Qcm9maWxlIHN1YlRlYW0gPSAoVGVhbVByb2ZpbGUpIGl0ZXIubmV4dCgpOwotCQkJCQlQcm9jZXNzVXRpbC5hZGRUb0NvbnRhaW5lcihzdWJUZWFtLCB0aGlzKTsKLQkJCQl9Ci0JCQl9Ci0JCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uCi0JCQkJCS5nZXROb3RpZmllcigpLCB0cnVlLCBmYWxzZSkpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuVEVBTV9QUk9GSUxFX19URUFNX1JPTEVTOgotCQkJTGlzdCBlbGVtZW50cyA9IFByb2Nlc3NVdGlsLmdldEFmZmVjdGVkRWxlbWVudHMobm90aWZpY2F0aW9uLCBudWxsKTsKLQkJCWV2ZW50VHlwZSA9IG5vdGlmaWNhdGlvbi5nZXRFdmVudFR5cGUoKTsKLQkJCWJvb2xlYW4gcmVmcmVzaFRlYW0gPSBmYWxzZTsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGVsZW1lbnRzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCUJyZWFrZG93bkVsZW1lbnQgZSA9IChCcmVha2Rvd25FbGVtZW50KSBpdGVyLm5leHQoKTsKLQkJCQlpZiAoZXZlbnRUeXBlID09IE5vdGlmaWNhdGlvbi5BREQKLQkJCQkJCXx8IGV2ZW50VHlwZSA9PSBOb3RpZmljYXRpb24uQUREX01BTlkpIHsKLQkJCQkJUHJvY2Vzc1V0aWwuYWRkVG9Db250YWluZXIoZSwgdGhpcywgZmFsc2UpOwotCQkJCX0KLQkJCQlpZiAoZS5nZXRTdXBlckFjdGl2aXRpZXMoKSA9PSBudWxsKSB7Ci0JCQkJCXJlZnJlc2hUZWFtID0gdHJ1ZTsJCQkJCQotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIGUsCi0JCQkJCQlmYWxzZSwgdHJ1ZSkpOwotCQkJCX0KLQkJCX0KLQotCQkJaWYgKHJlZnJlc2hUZWFtKSB7Ci0JCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sCi0JCQkJCQlub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKSwgdHJ1ZSwgZmFsc2UpKTsKLQkJCX0KLQotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuVEVBTV9QUk9GSUxFX19QUkVTRU5UQVRJT05fTkFNRToKLQkJCVRlYW1Qcm9maWxlIHRlYW1Qcm9maWxlID0gKFRlYW1Qcm9maWxlKSBub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKTsKLQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCB0ZWFtUHJvZmlsZSwKLQkJCQkJZmFsc2UsIHRydWUpKTsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHRlYW1Qcm9maWxlLmdldFRlYW1Sb2xlcygpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQlSb2xlRGVzY3JpcHRvciByb2xlRGVzY3JpcHRvciA9IChSb2xlRGVzY3JpcHRvcikgaXRlci5uZXh0KCk7Ci0JCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sCi0JCQkJCQlyb2xlRGVzY3JpcHRvciwgZmFsc2UsIHRydWUpKTsKLQkJCX0KLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX19TVVBQUkVTU0VEOgotCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbgotCQkJCQkuZ2V0Tm90aWZpZXIoKSwgdHJ1ZSwgdHJ1ZSkpOwotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0RUNsYXNzZXMoKSB7Ci0JCXJldHVybiBQcm9jZXNzVXRpbC5nZXRPQlNFY2xhc3NlcygpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNjcmVhdGVEcmFnQW5kRHJvcENvbW1hbmQob3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW4sCi0JICogICAgICBqYXZhLmxhbmcuT2JqZWN0LCBmbG9hdCwgaW50LCBpbnQsIGphdmEudXRpbC5Db2xsZWN0aW9uKQotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGNyZWF0ZURyYWdBbmREcm9wQ29tbWFuZChFZGl0aW5nRG9tYWluIGRvbWFpbiwKLQkJCU9iamVjdCBvd25lciwgZmxvYXQgbG9jYXRpb24sIGludCBvcGVyYXRpb25zLCBpbnQgb3BlcmF0aW9uLAotCQkJQ29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXJldHVybiBuZXcgT0JTRHJhZ0FuZERyb3BDb21tYW5kKGRvbWFpbiwgb3duZXIsIGxvY2F0aW9uLCBvcGVyYXRpb25zLAotCQkJCW9wZXJhdGlvbiwgY29sbGVjdGlvbikKLQkJLy8gewotCQkvLyBwdWJsaWMgQ29sbGVjdGlvbiBnZXRBZmZlY3RlZE9iamVjdHMoKSB7Ci0JCS8vIENvbGxlY3Rpb24gd3JhcHBlcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCS8vIGZvciAoSXRlcmF0b3IgaXRlciA9IHN1cGVyLmdldEFmZmVjdGVkT2JqZWN0cygpLml0ZXJhdG9yKCk7Ci0JCS8vIGl0ZXIuaGFzTmV4dCgpOykgewotCQkvLyBSb2xlRGVzY3JpcHRvciBkZXNjID0gKFJvbGVEZXNjcmlwdG9yKSBpdGVyLm5leHQoKTsKLQkJLy8gd3JhcHBlcnMuYWRkKFRuZ1V0aWwuZ2V0V3JhcHBlcih0ZWFtUm9sZVdyYXBwZXJzLCBkZXNjLmdldFJvbGUoKSkpOwotCQkvLyB9Ci0JCS8vIHJldHVybiB3cmFwcGVyczsKLQkJLy8gfQotCQkvLyB9Ci0JCTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gZGVzY3JpcHRvckV4aXN0cyhPYmplY3Qgcm9sZSkgewotCQlUZWFtUHJvZmlsZSB0ZWFtUHJvZmlsZSA9IChUZWFtUHJvZmlsZSkgZ2V0VGFyZ2V0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHRlYW1Qcm9maWxlLmdldFRlYW1Sb2xlcygpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkuaGFzTmV4dCgpOykgewotCQkJUm9sZURlc2NyaXB0b3IgZGVzYyA9IChSb2xlRGVzY3JpcHRvcikgaXRlci5uZXh0KCk7Ci0JCQlpZiAoZGVzYy5nZXRSb2xlKCkgPT0gcm9sZSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIEdlbmVyaWNEcm9wQ29tbWFuZC5FbGVtZW50QWRhcHRlciBjcmVhdGVEcm9wQWRhcHRlcigpIHsKLQkJaWYgKGRyb3BBZGFwdGVyID09IG51bGwpIHsKLQkJCWRyb3BBZGFwdGVyID0gbmV3IEdlbmVyaWNEcm9wQ29tbWFuZC5FbGVtZW50QWRhcHRlcigpIHsKLQotCQkJCXB1YmxpYyBPYmplY3QgYWRhcHQoT2JqZWN0IGRyb3BFbGVtZW50KSB7Ci0JCQkJCWlmIChkcm9wRWxlbWVudCBpbnN0YW5jZW9mIFJvbGUKLQkJCQkJCQkmJiAhZGVzY3JpcHRvckV4aXN0cyhkcm9wRWxlbWVudCkKLQkJCQkJLy8gJiYgVG5nVXRpbC5nZXRXcmFwcGVyKHRlYW1Sb2xlV3JhcHBlcnMsIGRyb3BFbGVtZW50KSA9PQotCQkJCQkvLyBudWxsCi0JCQkJCSkgewotCQkJCQkJcmV0dXJuIFByb2Nlc3NVdGlsCi0JCQkJCQkJCS5jcmVhdGVSb2xlRGVzY3JpcHRvcigoUm9sZSkgZHJvcEVsZW1lbnQpOwotCQkJCQl9Ci0JCQkJCXJldHVybiBudWxsOwotCQkJCX0KLQotCQkJfTsKLQkJfQotCQlyZXR1cm4gZHJvcEFkYXB0ZXI7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkJyZWFrZG93bkVsZW1lbnRJdGVtUHJvdmlkZXIjZ2V0QXR0cmlidXRlKGphdmEubGFuZy5PYmplY3QsCi0JICogICAgICBqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0cmlidXRlKE9iamVjdCBvYmplY3QsIFN0cmluZyBwcm9wZXJ0eSkgewotCQlpZiAocHJvcGVydHkgPT0gSUJTSXRlbVByb3ZpZGVyLkNPTF9URUFNUykgewotCQkJcmV0dXJuIFRuZ1V0aWwuZ2V0UHJlc2VudGF0aW9uTmFtZSgoKFRlYW1Qcm9maWxlKSBvYmplY3QpCi0JCQkJCS5nZXRTdXBlclRlYW0oKSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldEF0dHJpYnV0ZShvYmplY3QsIHByb3BlcnR5KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBtb3ZlVXAoT2JqZWN0IG9iaiwgSUFjdGlvbk1hbmFnZXIgYWN0aW9uTWdyKSB7Ci0JCU9iamVjdCBwYXJlbnQgPSB0aGlzLmdldFBhcmVudChvYmopOwotCQlpZiAoKHBhcmVudCAhPSBudWxsKSAmJiAocGFyZW50IGluc3RhbmNlb2YgQWN0aXZpdHkpKSB7Ci0JCQlUbmdVdGlsLm1vdmVVcCgoQWN0aXZpdHkpIHBhcmVudCwgb2JqLCBnZXRFQ2xhc3NlcygpLCBhY3Rpb25NZ3IpOwotCQl9Ci0JCWlmICgocGFyZW50ICE9IG51bGwpICYmIChwYXJlbnQgaW5zdGFuY2VvZiBUZWFtUHJvZmlsZSkpIHsKLQkJCVRlYW1Qcm9maWxlIHRlYW0gPSAoKFRlYW1Qcm9maWxlKSBwYXJlbnQpOwotCQkJTGlzdCBsaXN0ID0gdGVhbS5nZXRTdWJUZWFtKCk7Ci0JCQlpbnQgbG9jYXRpb24gPSAwOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0LnNpemUoKTsgaSsrKSB7Ci0JCQkJaWYgKG9iai5lcXVhbHMobGlzdC5nZXQoaSkpKSB7Ci0JCQkJCWxvY2F0aW9uID0gaTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCi0JCQkoKEVMaXN0KSB0ZWFtLmdldFN1YlRlYW0oKSkubW92ZShsb2NhdGlvbiwgbG9jYXRpb24gLSAxKTsKLQotCQkJQWN0aXZpdHkgYWN0aXZpdHkgPSB0aGlzLmdldEFjdGl2aXR5KG9iaik7Ci0JCQlUbmdVdGlsLm1vdmVVcChhY3Rpdml0eSwgb2JqLCBnZXRFQ2xhc3NlcygpLCBhY3Rpb25NZ3IpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgbW92ZURvd24oT2JqZWN0IG9iaiwgSUFjdGlvbk1hbmFnZXIgYWN0aW9uTWdyKSB7Ci0JCU9iamVjdCBwYXJlbnQgPSB0aGlzLmdldFBhcmVudChvYmopOwotCQlpZiAoKHBhcmVudCAhPSBudWxsKSAmJiAocGFyZW50IGluc3RhbmNlb2YgQWN0aXZpdHkpKSB7Ci0JCQlUbmdVdGlsLm1vdmVEb3duKChBY3Rpdml0eSkgcGFyZW50LCBvYmosIGdldEVDbGFzc2VzKCksIGFjdGlvbk1ncik7Ci0JCX0KLQkJaWYgKChwYXJlbnQgIT0gbnVsbCkgJiYgKHBhcmVudCBpbnN0YW5jZW9mIFRlYW1Qcm9maWxlKSkgewotCQkJVGVhbVByb2ZpbGUgdGVhbSA9IChUZWFtUHJvZmlsZSkgcGFyZW50OwotCQkJTGlzdCBsaXN0ID0gdGVhbS5nZXRTdWJUZWFtKCk7Ci0JCQlpbnQgbG9jYXRpb24gPSAwOwotCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IGxpc3Quc2l6ZSgpOyBpKyspIHsKLQkJCQlpZiAob2JqLmVxdWFscyhsaXN0LmdldChpKSkpIHsKLQkJCQkJbG9jYXRpb24gPSBpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0KLQkJCSgoRUxpc3QpIHRlYW0uZ2V0U3ViVGVhbSgpKS5tb3ZlKGxvY2F0aW9uLCBsb2NhdGlvbiArIDEpOwotCi0JCQlBY3Rpdml0eSBhY3Rpdml0eSA9IHRoaXMuZ2V0QWN0aXZpdHkob2JqKTsKLQkJCVRuZ1V0aWwubW92ZURvd24oYWN0aXZpdHksIG9iaiwgZ2V0RUNsYXNzZXMoKSwgYWN0aW9uTWdyKTsKLQkJfQotCX0KLQotCXB1YmxpYyBBY3Rpdml0eSBnZXRBY3Rpdml0eShPYmplY3Qgb2JqZWN0KSB7Ci0JCWZvciAoT2JqZWN0IHBhcmVudCA9IGdldFBhcmVudChvYmplY3QpOyBwYXJlbnQgIT0gbnVsbDspIHsKLQkJCWlmIChwYXJlbnQgaW5zdGFuY2VvZiBBY3Rpdml0eSkKLQkJCQlyZXR1cm4gKEFjdGl2aXR5KSBwYXJlbnQ7Ci0JCQlBZGFwdGVyRmFjdG9yeSBhRmFjdG9yeSA9IFRuZ1V0aWwKLQkJCQkJLmdldEJlc3RBZGFwdGVyRmFjdG9yeShhZGFwdGVyRmFjdG9yeSk7Ci0JCQlJdGVtUHJvdmlkZXJBZGFwdGVyIGFkYXB0ZXIgPSAoSXRlbVByb3ZpZGVyQWRhcHRlcikgYUZhY3RvcnkuYWRhcHQoCi0JCQkJCXBhcmVudCwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCXBhcmVudCA9IGFkYXB0ZXIuZ2V0UGFyZW50KHBhcmVudCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL1RlYW1Qcm9maWxlV3JhcHBlckl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL1RlYW1Qcm9maWxlV3JhcHBlckl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZDdiN2JkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9UZWFtUHJvZmlsZVdyYXBwZXJJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2VzczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZWFtUHJvZmlsZTsKLQotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBUZWFtUHJvZmlsZVdyYXBwZXJJdGVtUHJvdmlkZXIgZXh0ZW5kcwotCQlCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlciB7Ci0KLQkvKioKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiBAcGFyYW0gb3duZXIKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgVGVhbVByb2ZpbGVXcmFwcGVySXRlbVByb3ZpZGVyKFRlYW1Qcm9maWxlIHZhbHVlLCBPYmplY3Qgb3duZXIsCi0JCQlBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcih2YWx1ZSwgb3duZXIsIGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiBAcGFyYW0gb3duZXIKLQkgKiBAcGFyYW0gaW5kZXgKLQkgKiBAcGFyYW0gZmVhdHVyZQotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqLwotCXB1YmxpYyBUZWFtUHJvZmlsZVdyYXBwZXJJdGVtUHJvdmlkZXIoVGVhbVByb2ZpbGUgdmFsdWUsIE9iamVjdCBvd25lciwKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBpbnQgaW5kZXgsIEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKHZhbHVlLCBvd25lciwgZmVhdHVyZSwgaW5kZXgsIGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIjZ2V0QXR0cmlidXRlKGphdmEubGFuZy5PYmplY3QsCi0JICogICAgICBqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0cmlidXRlKE9iamVjdCBvYmplY3QsIFN0cmluZyBwcm9wZXJ0eSkgewotCQlpZiAocHJvcGVydHkgPT0gSUJTSXRlbVByb3ZpZGVyLkNPTF9URUFNUykgewotCQkJcmV0dXJuIFRuZ1V0aWwuZ2V0UHJlc2VudGF0aW9uTmFtZSgoKFRlYW1Qcm9maWxlKSBUbmdVdGlsCi0JCQkJCS51bndyYXAob2JqZWN0KSkuZ2V0U3VwZXJUZWFtKCkpOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRBdHRyaWJ1dGUob2JqZWN0LCBwcm9wZXJ0eSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvV0JTQWN0aXZpdHlJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9XQlNBY3Rpdml0eUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5N2Q1M2EzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9XQlNBY3Rpdml0eUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2VzczsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSVJlc291cmNlQXdhcmVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kLldCU0RyYWdBbmREcm9wQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZC5XQlNEcm9wQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuRXhwb3NlZEFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Qcm9jZXNzVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1pbGVzdG9uZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFdCU0FjdGl2aXR5SXRlbVByb3ZpZGVyIGV4dGVuZHMgQlNBY3Rpdml0eUl0ZW1Qcm92aWRlciB7Ci0KLQkvKioKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgV0JTQWN0aXZpdHlJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CU0FjdGl2aXR5SXRlbVByb3ZpZGVyI2NvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKGphdmEudXRpbC5Db2xsZWN0aW9uLAotCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsCi0JCQlPYmplY3Qgb2JqZWN0KSB7Ci0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldEFjdGl2aXR5X0JyZWFrZG93bkVsZW1lbnRzKCksIFVtYUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJLmNyZWF0ZVBoYXNlKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRBY3Rpdml0eV9CcmVha2Rvd25FbGVtZW50cygpLCBVbWFGYWN0b3J5LmVJTlNUQU5DRQotCQkJCS5jcmVhdGVJdGVyYXRpb24oKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldEFjdGl2aXR5X0JyZWFrZG93bkVsZW1lbnRzKCksIFVtYUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJLmNyZWF0ZUFjdGl2aXR5KCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRBY3Rpdml0eV9CcmVha2Rvd25FbGVtZW50cygpLCBVbWFGYWN0b3J5LmVJTlNUQU5DRQotCQkJCS5jcmVhdGVUYXNrRGVzY3JpcHRvcigpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0QWN0aXZpdHlfQnJlYWtkb3duRWxlbWVudHMoKSwgVW1hRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkuY3JlYXRlTWlsZXN0b25lKCkpKTsKLQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS50bmcucHJvY2Vzcy5CU0FjdGl2aXR5SXRlbVByb3ZpZGVyI2FjY2VwdEFzQ2hpbGQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHRBc0NoaWxkKE9iamVjdCBjaGlsZCkgewotCQljaGlsZCA9IFRuZ1V0aWwudW53cmFwKGNoaWxkKTsKLQkJaWYoY2hpbGQgaW5zdGFuY2VvZiBBY3Rpdml0eSB8fCBjaGlsZCBpbnN0YW5jZW9mIFRhc2tEZXNjcmlwdG9yCi0JCQkJfHwgY2hpbGQgaW5zdGFuY2VvZiBNaWxlc3RvbmUpIHsKLQkJCXJldHVybiBzdXBlci5hY2NlcHRBc0NoaWxkKGNoaWxkKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkJTQWN0aXZpdHlJdGVtUHJvdmlkZXIjZ2V0T2JqZWN0KG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpcHRvcikKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGdldE9iamVjdChEZXNjcmlwdG9yIGRlc2NyaXB0b3IpIHsKLQkJcmV0dXJuICgoVGFza0Rlc2NyaXB0b3IpIGRlc2NyaXB0b3IpLmdldFRhc2soKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29tbWFuZCBjcmVhdGVEcmFnQW5kRHJvcENvbW1hbmQoRWRpdGluZ0RvbWFpbiBkb21haW4sCi0JCQlPYmplY3Qgb3duZXIsIGZsb2F0IGxvY2F0aW9uLCBpbnQgb3BlcmF0aW9ucywgaW50IG9wZXJhdGlvbiwKLQkJCUNvbGxlY3Rpb248Pz4gY29sbGVjdGlvbikgewotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkVOVEVSOgotCQkvLyBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLldCU0FjdGl2aXR5SXRlbVByb3ZpZGVyI2NyZWF0ZURyYWdBbmREcm9wQ29tbWFuZChkb21haW4sCi0JCS8vIG93bmVyLCBsb2NhdGlvbiwgb3BlcmF0aW9ucywgb3BlcmF0aW9uLCBjb2xsZWN0aW9uKSIpOwotCQlDb21tYW5kIGNtZCA9IG5ldyBXQlNEcmFnQW5kRHJvcENvbW1hbmQoZG9tYWluLCBvd25lciwgbG9jYXRpb24sCi0JCQkJb3BlcmF0aW9ucywgb3BlcmF0aW9uLCBjb2xsZWN0aW9uKTsKLQotLy8JCSBTeXN0ZW0ub3V0LnByaW50bG4oIiBjYW4gZXhlY3V0ZTogIiArIGNtZC5jYW5FeGVjdXRlKCkpOwotLy8JCSBTeXN0ZW0ub3V0LnByaW50bG4oIiBvd25lcjogIiArIG93bmVyKTsKLS8vCQkgU3lzdGVtLm91dC5wcmludGxuKCIgY29sbGVjdGlvbjogIiArIGNvbGxlY3Rpb24pOwotLy8JCSBTeXN0ZW0ub3V0LnByaW50bG4oIiBsb2NhdGlvbjogIiArIGxvY2F0aW9uKTsKLS8vCQkgU3lzdGVtLm91dC5wcmludGxuKCIgb3BlcmF0aW9uczogIiArIG9wZXJhdGlvbnMpOwotLy8JCSBTeXN0ZW0ub3V0LnByaW50bG4oIiBvcGVyYXRpb246ICIgKyBvcGVyYXRpb24pOwotCQkvLyAgICAgICAgCi0JCS8vIFN5c3RlbS5vdXQKLQkJLy8gLnByaW50bG4oIkVYSVQ6Ci0JCS8vIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuV0JTQWN0aXZpdHlJdGVtUHJvdmlkZXIjY3JlYXRlRHJhZ0FuZERyb3BDb21tYW5kKGRvbWFpbiwKLQkJLy8gb3duZXIsIGxvY2F0aW9uLCBvcGVyYXRpb25zLCBvcGVyYXRpb24sIGNvbGxlY3Rpb24pIik7Ci0JCXJldHVybiBjbWQ7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkJTQWN0aXZpdHlJdGVtUHJvdmlkZXIjY3JlYXRlRHJvcENvbW1hbmQoamF2YS5sYW5nLk9iamVjdCwKLQkgKiAgICAgIGphdmEudXRpbC5MaXN0KQotCSAqLwotCXB1YmxpYyBJUmVzb3VyY2VBd2FyZUNvbW1hbmQgY3JlYXRlRHJvcENvbW1hbmQoT2JqZWN0IG93bmVyLAotCQkJTGlzdCBkcm9wRWxlbWVudHMpIHsKLQkJcmV0dXJuIG5ldyBXQlNEcm9wQ29tbWFuZCgoQWN0aXZpdHkpIG93bmVyLCBkcm9wRWxlbWVudHMpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CU0FjdGl2aXR5SXRlbVByb3ZpZGVyI2FjY2VwdEFzUm9sbGVkVXBDaGlsZChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGFjY2VwdEFzUm9sbGVkVXBDaGlsZChPYmplY3QgY2hpbGQpIHsKLQkJT2JqZWN0IG9iaiA9IFRuZ1V0aWwudW53cmFwKGNoaWxkKTsKLQkJaWYob2JqIGluc3RhbmNlb2YgVGFza0Rlc2NyaXB0b3IpIHsKLQkJCXJldHVybiBzdXBlci5hY2NlcHRBc1JvbGxlZFVwQ2hpbGQob2JqKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLy8gLyogKG5vbi1KYXZhZG9jKQotCS8vICogQHNlZQotCS8vIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuQlNBY3Rpdml0eUl0ZW1Qcm92aWRlciNnZXRDb2x1bW5JbWFnZShqYXZhLmxhbmcuT2JqZWN0LAotCS8vIGludCkKLQkvLyAqLwotCS8vIHB1YmxpYyBPYmplY3QgZ2V0Q29sdW1uSW1hZ2UoT2JqZWN0IG9iamVjdCwgaW50IGNvbHVtbkluZGV4KSB7Ci0JLy8gQnJlYWtkb3duRWxlbWVudCBlID0gKEJyZWFrZG93bkVsZW1lbnQpb2JqZWN0OwotCS8vIFN0cmluZyBwcm9wZXJ0eSA9IChTdHJpbmcpIGNvbHVtbkluZGV4VG9OYW1lTWFwLmdldChuZXcKLQkvLyBJbnRlZ2VyKGNvbHVtbkluZGV4KSk7Ci0JLy8gQm9vbGVhbiBiID0gbnVsbDsKLQkvLyBpZihwcm9wZXJ0eSA9PSBJQlNJdGVtUHJvdmlkZXIuQ09MX0lTX0VWRU5UX0RSSVZFTikgewotCS8vIGIgPSBlLmdldElzRXZlbnREcml2ZW4oKTsKLQkvLyB9Ci0JLy8gZWxzZSBpZihwcm9wZXJ0eSA9PSBJQlNJdGVtUHJvdmlkZXIuQ09MX0lTX09OR09JTkcpIHsKLQkvLyBiID0gZS5nZXRJc09uZ29pbmcoKTsKLQkvLyB9Ci0JLy8gZWxzZSBpZihwcm9wZXJ0eSA9PSBJQlNJdGVtUHJvdmlkZXIuQ09MX0lTX1JFUEVBVEFCTEUpIHsKLQkvLyBiID0gZS5nZXRJc1JlcGVhdGFibGUoKTsKLQkvLyB9Ci0JLy8gaWYoYiAhPSBudWxsKSB7Ci0JLy8gaWYoYi5ib29sZWFuVmFsdWUoKSkgewotCS8vIHJldHVybiBUbmdFZGl0UGx1Z2luLklOU1RBTkNFLmdldEltYWdlKCJjaGVja2VkX2JveCIpOwotCS8vIH0KLQkvLyBlbHNlIHsKLQkvLyByZXR1cm4gVG5nRWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRJbWFnZSgidW5jaGVja2VkX2JveCIpOwotCS8vIH0KLQkvLyB9Ci0JLy8gcmV0dXJuIHN1cGVyLmdldENvbHVtbkltYWdlKG9iamVjdCwgY29sdW1uSW5kZXgpOwotCS8vIH0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldEVDbGFzc2VzKCkgewotCQlyZXR1cm4gUHJvY2Vzc1V0aWwuZ2V0V0JTRWNsYXNzZXMoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuQlNBY3Rpdml0eUl0ZW1Qcm92aWRlciNyZWZyZXNoQ2hpbGRyZW5EYXRhKG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbiwKLQkgKiAgICAgIGphdmEudXRpbC5MaXN0KQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHJlZnJlc2hDaGlsZHJlbkRhdGEoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbiwKLQkJCUxpc3QgYWZmZWN0ZWRDaGlsZHJlbikgewotCQkvLyByZWNhbGN1bGF0ZSB0aGUgSURzIG9mIGJyZWFrZG93biBlbGVtZW50cyBhbmQgcmVmcmVzaCB0aGVtCi0JCS8vCi0JCVByb2Nlc3MgdG9wQWN0ID0gKFByb2Nlc3MpIGdldFRvcEl0ZW0oKTsKLQkJQWRhcHRlckZhY3Rvcnkgcm9vdEFkYXB0ZXJGYWN0b3J5ID0gZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCk7Ci0KLQkJUHJvY2Vzc1V0aWwudXBkYXRlSURzKHJvb3RBZGFwdGVyRmFjdG9yeSwgdG9wQWN0KTsKLQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuQlNBY3Rpdml0eUl0ZW1Qcm92aWRlciNkb1JlZnJlc2hBZmZlY3RlZFZpZXdlcnMoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRvUmVmcmVzaEFmZmVjdGVkVmlld2VycygpIHsKLQkJT2JqZWN0IHByb2MgPSBnZXRUb3BJdGVtKCk7Ci0JCU9iamVjdCBpdGVtUHJvdmlkZXIgPSBhZGFwdGVyRmFjdG9yeS5hZGFwdChwcm9jLAotCQkJCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCWlmIChpdGVtUHJvdmlkZXIgaW5zdGFuY2VvZiBCU0FjdGl2aXR5SXRlbVByb3ZpZGVyKSB7Ci0JCQkoKEJTQWN0aXZpdHlJdGVtUHJvdmlkZXIpIGl0ZW1Qcm92aWRlcikKLQkJCQkJLnNldFJlZnJlc2hBbGxJRHNSZXF1aXJlZCh0cnVlKTsKLQkJfQotCi0JCVByb2Nlc3NVdGlsCi0JCQkJLnJlZnJlc2hJRHNJblZpZXdlcnMoKEV4cG9zZWRBZGFwdGVyRmFjdG9yeSkgZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCkpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CU0FjdGl2aXR5SXRlbVByb3ZpZGVyI2dldENoaWxkcmVuKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlDb2xsZWN0aW9uIGNoaWxkcmVuID0gc3VwZXIuZ2V0Q2hpbGRyZW4ob2JqZWN0KTsKLQkJdXBkYXRlQ2FjaGVkQ2hpbGRyZW4oY2hpbGRyZW4pOwotCQlyZXR1cm4gY2hpbGRyZW47Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBib29sZWFuIGlzV3JhcHBpbmdSb2xsdXBOZWVkZWQoT2JqZWN0IG9iamVjdCkgewotCQlpZihUbmdVdGlsLnVud3JhcChvYmplY3QpIGluc3RhbmNlb2YgVGFza0Rlc2NyaXB0b3IpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBzdXBlci5pc1dyYXBwaW5nUm9sbHVwTmVlZGVkKG9iamVjdCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIE9iamVjdCBjcmVhdGVSb2xsdXBXcmFwcGVyKE9iamVjdCBvYmplY3QsIE9iamVjdCBvd25lciwgQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJT2JqZWN0IHdyYXBwZXIgPSBzdXBlci5jcmVhdGVSb2xsdXBXcmFwcGVyKG9iamVjdCwgb3duZXIsIGFkYXB0ZXJGYWN0b3J5KTsKLQkJcmV0dXJuIG5ldyBUYXNrRGVzY3JpcHRvcldyYXBwZXJJdGVtUHJvdmlkZXIod3JhcHBlciwgb3duZXIsIGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIENvbXBvc2VkQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIgY3JlYXRlQ29tcG9zZWRXcmFwcGVyKE9iamVjdCBvYmplY3QsIE9iamVjdCBvd25lciwgQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJcmV0dXJuIG5ldyBDb21wb3NlZEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKG9iamVjdCwgb3duZXIsIGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBib29sZWFuIGNhbk1lcmdlKFN0cmluZyBwcm9wZXJ0eSkgewotCQkJCXJldHVybiBwcm9wZXJ0eSA9PSBJQlNJdGVtUHJvdmlkZXIuQ09MX0lEIHx8IHByb3BlcnR5ID09IElCU0l0ZW1Qcm92aWRlci5DT0xfUFJFREVDRVNTT1JTCi0JCQkJCXx8IHByb3BlcnR5ID09IElCU0l0ZW1Qcm92aWRlci5DT0xfTU9ERUxfSU5GTzsKLQkJCX0KLQkJfTsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvV0JTSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9XQlNJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNzczODI0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9XQlNJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2VzczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRhYmxlSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnByZWZlcmVuY2VzLklQcm9wZXJ0eUNoYW5nZUV2ZW50V3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnByZWZlcmVuY2VzLklQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyV3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuTGlicmFyeUVkaXRDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlByb2Nlc3NVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotCi0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFdCU0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5IGV4dGVuZHMgSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkKLQkJaW1wbGVtZW50cyBJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcldyYXBwZXIgewotCi0JcHVibGljIFdCU0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkgewotCQlzdXBlcigpOwotCQlzdXBwb3J0ZWRUeXBlcy5hZGQoSVRhYmxlSXRlbUxhYmVsUHJvdmlkZXIuY2xhc3MpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkJyZWFrZG93bkFkYXB0ZXJGYWN0b3J5I2NyZWF0ZUFjdGl2aXR5QWRhcHRlcigpCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQWN0aXZpdHlBZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IFdCU0FjdGl2aXR5SXRlbVByb3ZpZGVyKHRoaXMpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkJyZWFrZG93bkFkYXB0ZXJGYWN0b3J5I2NyZWF0ZUl0ZXJhdGlvbkFkYXB0ZXIoKQotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUl0ZXJhdGlvbkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBjcmVhdGVBY3Rpdml0eUFkYXB0ZXIoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5CcmVha2Rvd25BZGFwdGVyRmFjdG9yeSNjcmVhdGVQaGFzZUFkYXB0ZXIoKQotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVBoYXNlQWRhcHRlcigpIHsKLQkJcmV0dXJuIGNyZWF0ZUFjdGl2aXR5QWRhcHRlcigpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkJyZWFrZG93bkFkYXB0ZXJGYWN0b3J5I2NyZWF0ZVBoYXNlQWRhcHRlcigpCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlTWlsZXN0b25lQWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBXQlNNaWxlc3RvbmVJdGVtUHJvdmlkZXIodGhpcywgKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIFRuZ1V0aWwudW1hSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkKLQkJCQkuY3JlYXRlTWlsZXN0b25lQWRhcHRlcigpKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkjY3JlYXRlUHJvY2Vzc0FkYXB0ZXIoKQotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVByb2Nlc3NBZGFwdGVyKCkgewotCQlyZXR1cm4gY3JlYXRlQWN0aXZpdHlBZGFwdGVyKCk7Ci0JfQotCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQ2FwYWJpbGl0eVBhdHRlcm5BZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IFdCU1Byb2Nlc3NJdGVtUHJvdmlkZXIodGhpcywgKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIFRuZ1V0aWwudW1hSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkKLQkJCQkuY3JlYXRlQ2FwYWJpbGl0eVBhdHRlcm5BZGFwdGVyKCkpOwotCX0KLQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZURlbGl2ZXJ5UHJvY2Vzc0FkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgV0JTUHJvY2Vzc0l0ZW1Qcm92aWRlcih0aGlzLCAoSXRlbVByb3ZpZGVyQWRhcHRlcikgVG5nVXRpbC51bWFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeQotCQkJCS5jcmVhdGVEZWxpdmVyeVByb2Nlc3NBZGFwdGVyKCkpOwotCX0KLQkKLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5jb21tb24ucHJlZmVyZW5jZXMuSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJXcmFwcGVyI3Byb3BlcnR5Q2hhbmdlKG9yZy5lY2xpcHNlLmVwZi5jb21tb24ucHJlZmVyZW5jZXMuSVByb3BlcnR5Q2hhbmdlRXZlbnRXcmFwcGVyKQotCSAqLwotCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlKElQcm9wZXJ0eUNoYW5nZUV2ZW50V3JhcHBlciBldmVudCkgewotCQlpZiAoZXZlbnQuZ2V0UHJvcGVydHkoKS5lcXVhbHMoTGlicmFyeUVkaXRDb25zdGFudHMuUFJFRl9XQlNfQ09MVU1OUykpIHsKLQkJCXNldENvbHVtbkluZGV4VG9OYW1lTWFwKFByb2Nlc3NVdGlsCi0JCQkJCS50b0NvbHVtbkluZGV4VG9OYW1lTWFwKChTdHJpbmcpIGV2ZW50LmdldE5ld1ZhbHVlKCkpKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL1dCU01pbGVzdG9uZUl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL1dCU01pbGVzdG9uZUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OWYwOWFhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9XQlNNaWxlc3RvbmVJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3M7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuUHJvY2Vzc1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya0JyZWFrZG93bkVsZW1lbnQ7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFdCU01pbGVzdG9uZUl0ZW1Qcm92aWRlciBleHRlbmRzIEJyZWFrZG93bkVsZW1lbnRJdGVtUHJvdmlkZXIgewotCi0JLy8gcHJpdmF0ZSBDb2xsZWN0aW9uIGVDbGFzc2VzID0gbmV3IEhhc2hTZXQoKTsKLQkvKioKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgV0JTTWlsZXN0b25lSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LAotCQkJSXRlbVByb3ZpZGVyQWRhcHRlciBkZWxlZ2F0ZUl0ZW1Qcm92aWRlcikgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSwgZGVsZWdhdGVJdGVtUHJvdmlkZXIpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CcmVha2Rvd25FbGVtZW50SXRlbVByb3ZpZGVyI25vdGlmeUNoYW5nZWQob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCi0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChXb3JrQnJlYWtkb3duRWxlbWVudC5jbGFzcykpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfQlJFQUtET1dOX0VMRU1FTlRfX0lTX1JFUEVBVEFCTEU6Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19JU19PTkdPSU5HOgotCQljYXNlIFVtYVBhY2thZ2UuV09SS19CUkVBS0RPV05fRUxFTUVOVF9fSVNfRVZFTlRfRFJJVkVOOgotCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbgotCQkJCQkuZ2V0Tm90aWZpZXIoKSwgZmFsc2UsIHRydWUpKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkKLQkvLyAvKiAobm9uLUphdmFkb2MpCi0JLy8gKiBAc2VlCi0JLy8gY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5XQlNBY3Rpdml0eUl0ZW1Qcm92aWRlciNnZXRDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0KQotCS8vICovCi0JLy8gcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCS8vIHJldHVybiBUbmdVdGlsLmdldEFsbENoaWxkcmVuKChQcm9jZXNzQ29udHJpYnV0aW9uKSBvYmplY3QsCi0JLy8gc3VwZXIuZ2V0Q2hpbGRyZW4ob2JqZWN0KSwKLQkvLyBUbmdVdGlsLmdldEJlc3RBZGFwdGVyRmFjdG9yeShhZGFwdGVyRmFjdG9yeSkpOwotCS8vIH0KLQkvLyAgICAKLQkvLyAvKiAobm9uLUphdmFkb2MpCi0JLy8gKiBAc2VlCi0JLy8gb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRFbGVtZW50cyhqYXZhLmxhbmcuT2JqZWN0KQotCS8vICovCi0JLy8gcHVibGljIENvbGxlY3Rpb24gZ2V0RWxlbWVudHMoT2JqZWN0IG9iamVjdCkgewotCS8vIENvbGxlY3Rpb24gZWxlbWVudHMgPSBzdXBlci5nZXRFbGVtZW50cyhvYmplY3QpOwotCS8vIHJldHVybiBlbGVtZW50czsKLQkvLyB9Ci0KLQkvLyBwdWJsaWMgTGlzdCBnZXRGaWx0ZXJlZEJyZWFrZG93bkVsZW1lbnRzKE9iamVjdCBhY3Rpdml0eSwgT2JqZWN0IG9iaikKLQkvLyB7Ci0JLy8gTGlzdCBlbGVtZW50cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkvLyBMaXN0IGJyZWFrZG93bkVsZW1lbnRzID0gKChBY3Rpdml0eSlhY3Rpdml0eSkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKTsKLQkvLyBmb3IgKEl0ZXJhdG9yIGl0ID0gYnJlYWtkb3duRWxlbWVudHMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykKLQkvLyB7Ci0JLy8gT2JqZWN0IGVsZW1lbnRPYmogPSBpdC5uZXh0KCk7Ci0JLy8gaWYgKChlbGVtZW50T2JqIGluc3RhbmNlb2YgVGFza0Rlc2NyaXB0b3IpIHx8IChlbGVtZW50T2JqIGluc3RhbmNlb2YKLQkvLyBNaWxlc3RvbmUpIHx8IChlbGVtZW50T2JqIGluc3RhbmNlb2YgQWN0aXZpdHkpKQotCS8vIHsKLQkvLyBlbGVtZW50cy5hZGQoZWxlbWVudE9iaik7Ci0JLy8gfQotCS8vIH0KLQkvLyByZXR1cm4gZWxlbWVudHM7Ci0JLy8gfQotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0RUNsYXNzZXMoKSB7Ci0JCXJldHVybiBQcm9jZXNzVXRpbC5nZXRXQlNFY2xhc3NlcygpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL1dCU1Byb2Nlc3NJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9XQlNQcm9jZXNzSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyZjU3ZGIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL1dCU1Byb2Nlc3NJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2VzczsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgV0JTUHJvY2Vzc0l0ZW1Qcm92aWRlciBleHRlbmRzIFdCU0FjdGl2aXR5SXRlbVByb3ZpZGVyIHsKLQotCXByaXZhdGUgSXRlbVByb3ZpZGVyQWRhcHRlciBkZWxlZ2F0ZUl0ZW1Qcm92aWRlcjsKLQotCXB1YmxpYyBXQlNQcm9jZXNzSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LAotCQkJSXRlbVByb3ZpZGVyQWRhcHRlciBkZWxlZ2F0ZUl0ZW1Qcm92aWRlcikgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JCXRoaXMuZGVsZWdhdGVJdGVtUHJvdmlkZXIgPSBkZWxlZ2F0ZUl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuQWN0aXZpdHlJdGVtUHJvdmlkZXIjZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPSBkZWxlZ2F0ZUl0ZW1Qcm92aWRlcgotCQkJCQkuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9Xb3JrT3JkZXJJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9Xb3JrT3JkZXJJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWQzOTI3Ni4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvV29ya09yZGVySXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3M7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgV29ya09yZGVySXRlbVByb3ZpZGVyIGV4dGVuZHMKLQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5Xb3JrT3JkZXJJdGVtUHJvdmlkZXIgewotCi0JLyoqCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICovCi0JcHVibGljIFdvcmtPcmRlckl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLy8gLyogKG5vbi1KYXZhZG9jKQotCS8vICogQHNlZQotCS8vIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjY3JlYXRlSW5pdGlhbGl6ZUNvcHlDb21tYW5kKG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluLAotCS8vIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0LAotCS8vIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29weUNvbW1hbmQuSGVscGVyKQotCS8vICovCi0JLy8gcHJvdGVjdGVkIENvbW1hbmQgY3JlYXRlSW5pdGlhbGl6ZUNvcHlDb21tYW5kKEVkaXRpbmdEb21haW4gZG9tYWluLAotCS8vIEVPYmplY3Qgb3duZXIsIEhlbHBlciBoZWxwZXIpIHsKLQkvLyByZXR1cm4gbmV3IE1ldGhvZEVsZW1lbnRJbml0aWFsaXplQ29weUNvbW1hbmQoZG9tYWluLCBvd25lciwgaGVscGVyKTsKLQkvLyB9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuRGVzY3JpYmFibGVFbGVtZW50SXRlbVByb3ZpZGVyI2dldENoaWxkcmVuRmVhdHVyZXMoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbkZlYXR1cmVzKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvV29ya1Byb2R1Y3REZXNjcmlwdG9ySXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvV29ya1Byb2R1Y3REZXNjcmlwdG9ySXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkOTMxOTUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL1dvcmtQcm9kdWN0RGVzY3JpcHRvckl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDM0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2VzczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuUmVtb3ZlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvcHlDb21tYW5kLkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JQ2FjaGVkQ2hpbGRyZW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklBY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kLldvcmtQcm9kdWN0RGVzY3JpcHRvckNyZWF0ZUNvcHlDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Db21wYXJhdG9yczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuUHJvY2Vzc1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFydGlmYWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5VbWFVdGlsOwotCi0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFdvcmtQcm9kdWN0RGVzY3JpcHRvckl0ZW1Qcm92aWRlciBleHRlbmRzIERlc2NyaXB0b3JJdGVtUHJvdmlkZXIKLWltcGxlbWVudHMgSUNhY2hlZENoaWxkcmVuSXRlbVByb3ZpZGVyCi17Ci0JcHJvdGVjdGVkIENvbGxlY3Rpb24gY2FjaGVkQ2hpbGRyZW47Ci0JCi0JLyoqCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICovCi0JcHVibGljIFdvcmtQcm9kdWN0RGVzY3JpcHRvckl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwKLQkJCUl0ZW1Qcm92aWRlckFkYXB0ZXIgZGVsZWdhdGVJdGVtUHJvdmlkZXIpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnksIGRlbGVnYXRlSXRlbVByb3ZpZGVyKTsKLQl9Ci0KLQlwdWJsaWMgQWN0aXZpdHkgZ2V0QWN0aXZpdHkoT2JqZWN0IG9iamVjdCkgewotCQlmb3IgKE9iamVjdCBwYXJlbnQgPSBnZXRQYXJlbnQob2JqZWN0KTsgcGFyZW50ICE9IG51bGw7KSB7Ci0JCQlpZiAocGFyZW50IGluc3RhbmNlb2YgQWN0aXZpdHkpCi0JCQkJcmV0dXJuIChBY3Rpdml0eSkgcGFyZW50OwotCQkJQWRhcHRlckZhY3RvcnkgYUZhY3RvcnkgPSBnZXRSb290QWRhcHRlckZhY3RvcnkoKTsKLQkJCUl0ZW1Qcm92aWRlckFkYXB0ZXIgYWRhcHRlciA9IChJdGVtUHJvdmlkZXJBZGFwdGVyKSBhRmFjdG9yeS5hZGFwdCgKLQkJCQkJcGFyZW50LCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkJcGFyZW50ID0gYWRhcHRlci5nZXRQYXJlbnQocGFyZW50KTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIE9iamVjdCBnZXREZXNjcmlwdG9yKEFjdGl2aXR5IGFjdGl2aXR5LCBBcnRpZmFjdCBhcnRpZmFjdCkgewotCQlpZiAoYWN0aXZpdHkgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlMaXN0IGxpc3QgPSBhY3Rpdml0eS5nZXRCcmVha2Rvd25FbGVtZW50cygpOwotCQlpbnQgc2l6ZSA9IGxpc3Quc2l6ZSgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJT2JqZWN0IG9iaiA9IGxpc3QuZ2V0KGkpOwotCQkJaWYgKChvYmogaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3IpCi0JCQkJCSYmIChhcnRpZmFjdCA9PSAoKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgb2JqKQotCQkJCQkJCS5nZXRXb3JrUHJvZHVjdCgpKSkgewotCQkJCXJldHVybiBvYmo7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRDaGlsZHJlbkZlYXR1cmVzKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5GZWF0dXJlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCS8vIGlmIChjaGlsZHJlbkZlYXR1cmVzID09IG51bGwpCi0JCS8vIHsKLQkJLy8gY2hpbGRyZW5GZWF0dXJlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJLy8gY2hpbGRyZW5GZWF0dXJlcy5hZGQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX0RlbGl2ZXJhYmxlUGFydHMoKSk7Ci0JCS8vIH0KLQkJLy8gcmV0dXJuIGNoaWxkcmVuRmVhdHVyZXM7Ci0KLQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JfQotCQotCXByaXZhdGUgdm9pZCB1cGRhdGVDYWNoZWRDaGlsZHJlbihDb2xsZWN0aW9uIGNoaWxkcmVuKSB7Ci0vLwkJaWYoY2FjaGVkQ2hpbGRyZW4gPT0gbnVsbCkgewotLy8JCQljYWNoZWRDaGlsZHJlbiA9IG5ldyBBcnJheUxpc3QoY2hpbGRyZW4pOwotLy8JCX0KLS8vCQllbHNlIHsKLS8vCQkJY2FjaGVkQ2hpbGRyZW4uY2xlYXIoKTsKLS8vCQkJY2FjaGVkQ2hpbGRyZW4uYWRkQWxsKGNoaWxkcmVuKTsKLS8vCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGFkZENvbnRhaW5lZEFydGlmYWN0RGVzY3JpcHRvcnMoV29ya1Byb2R1Y3REZXNjcmlwdG9yIHdwRGVzYywgQ29sbGVjdGlvbiBjaGlsZHJlbikgewotCQlBY3Rpdml0eSBhY3Rpdml0eSA9IFVtYVV0aWwuZ2V0UGFyZW50QWN0aXZpdHkod3BEZXNjKTsKLQkJaWYoYWN0aXZpdHkgIT0gbnVsbCkgewotCQkJQXJ0aWZhY3QgYXJ0aWZhY3QgPSAoQXJ0aWZhY3QpIHdwRGVzYy5nZXRXb3JrUHJvZHVjdCgpOwotCQkJTGlzdCBsaXN0ID0gYXJ0aWZhY3QuZ2V0Q29udGFpbmVkQXJ0aWZhY3RzKCk7Ci0JCQlpbnQgc2l6ZSA9IGxpc3Quc2l6ZSgpOwotCQkJaWYoc2l6ZSA+IDApIHsKLQkJCQlBcnJheUxpc3QgYXJ0aWZhY3REZXNjcmlwdG9ycyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCQlPYmplY3QgZGVzY3JpcHRvciA9IGdldERlc2NyaXB0b3IoYWN0aXZpdHksIChBcnRpZmFjdCkgbGlzdAotCQkJCQkJCS5nZXQoaSkpOwotCQkJCQlpZiAoZGVzY3JpcHRvciAhPSBudWxsKSB7Ci0JCQkJCQlhcnRpZmFjdERlc2NyaXB0b3JzLmFkZChkZXNjcmlwdG9yKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlpZighYXJ0aWZhY3REZXNjcmlwdG9ycy5pc0VtcHR5KCkpIHsKLQkJCQkJQ29sbGVjdGlvbnMuc29ydChhcnRpZmFjdERlc2NyaXB0b3JzLCBDb21wYXJhdG9ycy5QUkVTRU5UQVRJT05fTkFNRV9DT01QQVJBVE9SKTsKLQkJCQkJY2hpbGRyZW4uYWRkQWxsKGFydGlmYWN0RGVzY3JpcHRvcnMpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yIHdwRGVzYyA9IChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIG9iamVjdDsKLQkJCi0JCS8vIGRvbid0IHNob3cgdGhlIGNoaWxkcmVuIG9mIHRoZSBub24tZGVsaXZlcmFibGUgd29yayBwcm9kdWN0IGRlc2NyaXB0b3IKLQkJLy8gdGhhdCBpcyBkZWxpdmVyYWJsZSBwYXJ0IG9mIGEgZGVsaXZlcmFibGUgd29yayBwcm9kdWN0IGRlc2NyaXB0b3IKLQkJLy8KLQkJaWYoISh3cERlc2MuZ2V0V29ya1Byb2R1Y3QoKSBpbnN0YW5jZW9mIERlbGl2ZXJhYmxlKSkgewotCQkJT2JqZWN0IHBhcmVudCA9IFRuZ1V0aWwudW53cmFwKGdldFBhcmVudChvYmplY3QpKTsKLQkJCWlmKHBhcmVudCBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0RGVzY3JpcHRvcgotCQkJCQkmJiAoKFdvcmtQcm9kdWN0RGVzY3JpcHRvcilwYXJlbnQpLmdldFdvcmtQcm9kdWN0KCkgaW5zdGFuY2VvZiBEZWxpdmVyYWJsZSkgewkJCQkKLQkJCQl1cGRhdGVDYWNoZWRDaGlsZHJlbihDb2xsZWN0aW9ucy5FTVBUWV9MSVNUKTsKLQkJCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQkJCX0KLQkJfQotCQkKLQkJQ29sbGVjdGlvbiBjaGlsZHJlbiA9IHN1cGVyLmdldENoaWxkcmVuKG9iamVjdCk7Ci0KLQkJLy8gYWRkIGRlbGl2ZXJhYmxlIHBhcnRzCi0JCS8vCi0JCWlmKCF3cERlc2MuZ2V0RGVsaXZlcmFibGVQYXJ0cygpLmlzRW1wdHkoKSkgewotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gd3BEZXNjLmdldERlbGl2ZXJhYmxlUGFydHMoKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkuaGFzTmV4dCgpOykgewotCQkJCVdvcmtQcm9kdWN0RGVzY3JpcHRvciBkZXNjID0gKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgaXRlci5uZXh0KCk7Ci0JCQkJaWYgKGRlc2MuZ2V0U3VwZXJBY3Rpdml0aWVzKCkgPT0gbnVsbCkgewotCQkJCQljaGlsZHJlbi5hZGQoZGVzYyk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQkvLyBnZXQgZGVzY3JpcHRvcnMgb2YgY29udGFpbmVkIGFydGlmYWN0cwotCQkvLwkJCi0JCWlmICh3cERlc2MuZ2V0V29ya1Byb2R1Y3QoKSBpbnN0YW5jZW9mIEFydGlmYWN0KSB7Ci0JCQlhZGRDb250YWluZWRBcnRpZmFjdERlc2NyaXB0b3JzKHdwRGVzYywgY2hpbGRyZW4pOwotCQl9Ci0KLQkJLy8gc2V0IHBhcmVudAotCQkvLwotCQlBZGFwdGVyRmFjdG9yeSBhRmFjdG9yeSA9IGdldFJvb3RBZGFwdGVyRmFjdG9yeSgpOwotCi0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGNoaWxkcmVuLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJSUJTSXRlbVByb3ZpZGVyIGFkYXB0ZXIgPSAoSUJTSXRlbVByb3ZpZGVyKSBhRmFjdG9yeS5hZGFwdChpdGVyCi0JCQkJCS5uZXh0KCksIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCQlhZGFwdGVyLnNldFBhcmVudChvYmplY3QpOwotCQl9Ci0JCQotCQl1cGRhdGVDYWNoZWRDaGlsZHJlbihjaGlsZHJlbik7Ci0JCQotCQlyZXR1cm4gY2hpbGRyZW47Ci0JfQotCQotCS8qKgotCSAqIEdldHMgY2hpbGRyZW4gZnJvbSBjYWNoZSwgZmlsbCB0aGUgY2hpbGRyZW4gY2FjaGUgaWYgaXQgaXMgbm90IGluaXRpYWxpemVkIHlldAotCSAqIAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbkZyb21DYWNoZSgpIHsKLQkJaWYoY2FjaGVkQ2hpbGRyZW4gPT0gbnVsbCkgewotCQkJZ2V0Q2hpbGRyZW4odGFyZ2V0KTsKLQkJfQotCQlyZXR1cm4gY2FjaGVkQ2hpbGRyZW47Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUNhY2hlZENoaWxkcmVuSXRlbVByb3ZpZGVyI2dldFJvbGx1cENoaWxkcmVuRnJvbUNhY2hlKCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRSb2xsdXBDaGlsZHJlbkZyb21DYWNoZSgpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CcmVha2Rvd25FbGVtZW50SXRlbVByb3ZpZGVyI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWlmKGNhY2hlZENoaWxkcmVuICE9IG51bGwpIHsKLQkJCWNhY2hlZENoaWxkcmVuLmNsZWFyKCk7Ci0JCQljYWNoZWRDaGlsZHJlbiA9IG51bGw7Ci0JCX0KLQkJCi0JCXN1cGVyLmRpc3Bvc2UoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKFdvcmtQcm9kdWN0RGVzY3JpcHRvci5jbGFzcykpIHsKLS8vCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX01BTkRBVE9SWV9JTlBVVF9UTzoKLS8vCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX09QVElPTkFMX0lOUFVUX1RPOgotLy8JCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fRVhURVJOQUxfSU5QVVRfVE86Ci0vLwkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX19PVVRQVVRfRlJPTToKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX19BQ1RJVklUWV9FTlRSWV9TVEFURToKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX19BQ1RJVklUWV9FWElUX1NUQVRFOgotCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbgotCQkJCQkuZ2V0Tm90aWZpZXIoKSwgZmFsc2UsIHRydWUpKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX19ERUxJVkVSQUJMRV9QQVJUUzoKLQkJCUxpc3QgZWxlbWVudHMgPSBQcm9jZXNzVXRpbC5nZXRBZmZlY3RlZEVsZW1lbnRzKG5vdGlmaWNhdGlvbiwgbnVsbCk7Ci0JCQlpbnQgZXZlbnRUeXBlID0gbm90aWZpY2F0aW9uLmdldEV2ZW50VHlwZSgpOwotCQkJYm9vbGVhbiByZWZyZXNoID0gZmFsc2U7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBlbGVtZW50cy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlCcmVha2Rvd25FbGVtZW50IGUgPSAoQnJlYWtkb3duRWxlbWVudCkgaXRlci5uZXh0KCk7Ci0JCQkJaWYgKGV2ZW50VHlwZSA9PSBOb3RpZmljYXRpb24uQURECi0JCQkJCQl8fCBldmVudFR5cGUgPT0gTm90aWZpY2F0aW9uLkFERF9NQU5ZKSB7Ci0JCQkJCVByb2Nlc3NVdGlsLmFkZFRvQ29udGFpbmVyKGUsIHRoaXMsIGZhbHNlKTsKLQkJCQl9Ci0JCQkJaWYgKGUuZ2V0U3VwZXJBY3Rpdml0aWVzKCkgIT0gbnVsbCkgewotCQkJCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgZSwKLQkJCQkJCQlmYWxzZSwgdHJ1ZSkpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXJlZnJlc2ggPSB0cnVlOwotCQkJCX0KLQkJCX0KLQotCQkJaWYgKHJlZnJlc2gpIHsKLQkJCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwKLQkJCQkJCW5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpLCB0cnVlLCBmYWxzZSkpOwotCQkJfQotCi0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5ERVNDUklCQUJMRV9FTEVNRU5UX19QUkVTRU5UQVRJT05fTkFNRToKLQkJCVdvcmtQcm9kdWN0RGVzY3JpcHRvciB3cGQgPSAoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBub3RpZmljYXRpb24KLQkJCQkJLmdldE5vdGlmaWVyKCk7Ci0JCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgd3BkLCBmYWxzZSwKLQkJCQkJdHJ1ZSkpOwotCQkJaWYgKHdwZC5nZXRXb3JrUHJvZHVjdCgpIGluc3RhbmNlb2YgRGVsaXZlcmFibGUpIHsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB3cGQuZ2V0RGVsaXZlcmFibGVQYXJ0cygpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCU9iamVjdCBkZXNjcmlwdG9yID0gaXRlci5uZXh0KCk7Ci0JCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLAotCQkJCQkJCWRlc2NyaXB0b3IsIGZhbHNlLCB0cnVlKSk7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX1NVUFBSRVNTRUQ6Ci0JCQlPYmplY3Qgbm90aWZpZXIgPSBub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKTsKLQkJCVdvcmtQcm9kdWN0IHdwOwotCQkJYm9vbGVhbiBjb250ZW50UmVmcmVzaCA9IG5vdGlmaWVyIGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yCi0JCQkJJiYgKCh3cCA9ICgoV29ya1Byb2R1Y3REZXNjcmlwdG9yKW5vdGlmaWVyKS5nZXRXb3JrUHJvZHVjdCgpKSBpbnN0YW5jZW9mIEFydGlmYWN0Ci0JCQkJCQl8fCB3cCBpbnN0YW5jZW9mIERlbGl2ZXJhYmxlKTsKLQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24KLQkJCQkJLmdldE5vdGlmaWVyKCksIGNvbnRlbnRSZWZyZXNoLCB0cnVlKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLklCU0l0ZW1Qcm92aWRlciNzZXRBdHRyaWJ1dGUoamF2YS5sYW5nLk9iamVjdCwKLQkgKiAgICAgIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgc2V0QXR0cmlidXRlKE9iamVjdCBvYmplY3QsIFN0cmluZyBwcm9wLCBTdHJpbmcgdHh0KSB7Ci0JCVdvcmtQcm9kdWN0RGVzY3JpcHRvciB3cGQgPSAoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBvYmplY3Q7Ci0KLQkJaWYgKHByb3AgPT0gSUJTSXRlbVByb3ZpZGVyLkNPTF9FTlRSWV9TVEFURSkgewotCQkJd3BkLnNldEFjdGl2aXR5RW50cnlTdGF0ZSh0eHQpOwotCQl9IGVsc2UgaWYgKHByb3AgPT0gSUJTSXRlbVByb3ZpZGVyLkNPTF9FWElUX1NUQVRFKSB7Ci0JCQl3cGQuc2V0QWN0aXZpdHlFeGl0U3RhdGUodHh0KTsKLQkJfSBlbHNlIHsKLQkJCXN1cGVyLnNldEF0dHJpYnV0ZShvYmplY3QsIHByb3AsIHR4dCk7Ci0JCX0KLQl9Ci0KLQkvLyBwcml2YXRlIGJvb2xlYW4gaXNUb3BMZXZlbEFydGlmYWN0SW5BY3Rpdml0eShBY3Rpdml0eSBhY3Rpdml0eSwgT2JqZWN0Ci0JLy8gb2JqKQotCS8vIHsKLQkvLyBBZGFwdGVyRmFjdG9yeSBhRmFjdG9yeSA9IFRuZ1V0aWwuZ2V0QmVzdEFkYXB0ZXJGYWN0b3J5KGFkYXB0ZXJGYWN0b3J5KTsKLQkvLyAgICAgICAgCi0JLy8gQlNBY3Rpdml0eUl0ZW1Qcm92aWRlciBhZGFwdGVyID0gKEJTQWN0aXZpdHlJdGVtUHJvdmlkZXIpCi0JLy8gYUZhY3RvcnkuYWRhcHQoYWN0aXZpdHksIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JLy8gQ29sbGVjdGlvbiBjaGlsZHJlbiA9IGFkYXB0ZXIuZ2V0Q2hpbGRyZW4oYWN0aXZpdHkpOwotCS8vIGlmIChjaGlsZHJlbi5jb250YWlucyhvYmopKQotCS8vIHsKLQkvLyAvL1N5c3RlbS5vdXQucHJpbnRsbigiY2hpbGQgLSAiICsgb2JqKTsKLQkvLyByZXR1cm4gdHJ1ZTsKLQkvLyB9Ci0JLy8gcmV0dXJuIGZhbHNlOwotCS8vIH0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldEVDbGFzc2VzKCkgewotCQlyZXR1cm4gUHJvY2Vzc1V0aWwuZ2V0UEJTRWNsYXNzZXMoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBtb3ZlVXAoT2JqZWN0IG9iaiwgSUFjdGlvbk1hbmFnZXIgYWN0aW9uTWdyKSB7Ci0JCU9iamVjdCBwYXJlbnQgPSB0aGlzLmdldFBhcmVudChvYmopOwotCQlpZiAoKHBhcmVudCAhPSBudWxsKSAmJiAocGFyZW50IGluc3RhbmNlb2YgQWN0aXZpdHkpKSB7Ci0JCQlUbmdVdGlsLm1vdmVVcCgoQWN0aXZpdHkpIHBhcmVudCwgb2JqLCBnZXRFQ2xhc3NlcygpLCBhY3Rpb25NZ3IpOwotCQl9Ci0JCWlmICgocGFyZW50ICE9IG51bGwpICYmIChwYXJlbnQgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3IpKSB7Ci0JCQlXb3JrUHJvZHVjdCB3cCA9ICgoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBwYXJlbnQpLmdldFdvcmtQcm9kdWN0KCk7Ci0JCQlpZiAod3AgaW5zdGFuY2VvZiBBcnRpZmFjdCkgewotCQkJCUFydGlmYWN0IGFydGlmYWN0ID0gKEFydGlmYWN0KSB3cDsKLQkJCQlMaXN0IGxpc3QgPSBhcnRpZmFjdC5nZXRDb250YWluZWRBcnRpZmFjdHMoKTsKLQkJCQlXb3JrUHJvZHVjdCBvYmpXUCA9ICgoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBvYmopCi0JCQkJCQkuZ2V0V29ya1Byb2R1Y3QoKTsKLQotCQkJCWludCBsb2NhdGlvbiA9IDA7Ci0JCQkJLy8gTGlzdCBuZXdMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdC5zaXplKCk7IGkrKykgewotCQkJCQlpZiAob2JqV1AuZXF1YWxzKGxpc3QuZ2V0KGkpKSkgewotCQkJCQkJbG9jYXRpb24gPSBpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQkoKEVMaXN0KSBhcnRpZmFjdC5nZXRDb250YWluZWRBcnRpZmFjdHMoKSkubW92ZShsb2NhdGlvbiwKLQkJCQkJCWxvY2F0aW9uIC0gMSk7Ci0JCQl9Ci0KLQkJCUFjdGl2aXR5IGFjdGl2aXR5ID0gdGhpcy5nZXRBY3Rpdml0eShvYmopOwotCQkJVG5nVXRpbC5tb3ZlVXAoYWN0aXZpdHksIG9iaiwgZ2V0RUNsYXNzZXMoKSwgYWN0aW9uTWdyKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIG1vdmVEb3duKE9iamVjdCBvYmosIElBY3Rpb25NYW5hZ2VyIGFjdGlvbk1ncikgewotCQlPYmplY3QgcGFyZW50ID0gdGhpcy5nZXRQYXJlbnQob2JqKTsKLQkJaWYgKChwYXJlbnQgIT0gbnVsbCkgJiYgKHBhcmVudCBpbnN0YW5jZW9mIEFjdGl2aXR5KSkgewotCQkJVG5nVXRpbC5tb3ZlRG93bigoQWN0aXZpdHkpIHBhcmVudCwgb2JqLCBnZXRFQ2xhc3NlcygpLCBhY3Rpb25NZ3IpOwotCQl9Ci0JCWlmICgocGFyZW50ICE9IG51bGwpICYmIChwYXJlbnQgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3IpKSB7Ci0JCQlXb3JrUHJvZHVjdCB3cCA9ICgoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBwYXJlbnQpLmdldFdvcmtQcm9kdWN0KCk7Ci0JCQlpZiAod3AgaW5zdGFuY2VvZiBBcnRpZmFjdCkgewotCQkJCUFydGlmYWN0IGFydGlmYWN0ID0gKEFydGlmYWN0KSB3cDsKLQkJCQlMaXN0IGxpc3QgPSBhcnRpZmFjdC5nZXRDb250YWluZWRBcnRpZmFjdHMoKTsKLQkJCQlXb3JrUHJvZHVjdCBvYmpXUCA9ICgoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBvYmopCi0JCQkJCQkuZ2V0V29ya1Byb2R1Y3QoKTsKLQotCQkJCWludCBsb2NhdGlvbiA9IDA7Ci0JCQkJLy8gTGlzdCBuZXdMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdC5zaXplKCk7IGkrKykgewotCQkJCQlpZiAob2JqV1AuZXF1YWxzKGxpc3QuZ2V0KGkpKSkgewotCQkJCQkJbG9jYXRpb24gPSBpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQkoKEVMaXN0KSBhcnRpZmFjdC5nZXRDb250YWluZWRBcnRpZmFjdHMoKSkubW92ZShsb2NhdGlvbiwKLQkJCQkJCWxvY2F0aW9uICsgMSk7Ci0JCQl9Ci0KLQkJCUFjdGl2aXR5IGFjdGl2aXR5ID0gdGhpcy5nZXRBY3Rpdml0eShvYmopOwotCQkJVG5nVXRpbC5tb3ZlRG93bihhY3Rpdml0eSwgb2JqLCBnZXRFQ2xhc3NlcygpLCBhY3Rpb25NZ3IpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkJyZWFrZG93bkVsZW1lbnRJdGVtUHJvdmlkZXIjY3JlYXRlQ3JlYXRlQ29weUNvbW1hbmQob3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW4sCi0JICogICAgICBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29weUNvbW1hbmQuSGVscGVyKQotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGNyZWF0ZUNyZWF0ZUNvcHlDb21tYW5kKEVkaXRpbmdEb21haW4gZG9tYWluLAotCQkJRU9iamVjdCBvd25lciwgSGVscGVyIGhlbHBlcikgewotCQlyZXR1cm4gbmV3IFdvcmtQcm9kdWN0RGVzY3JpcHRvckNyZWF0ZUNvcHlDb21tYW5kKGRvbWFpbiwgb3duZXIsIGhlbHBlcik7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNmYWN0b3JSZW1vdmVDb21tYW5kKG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluLCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXIpCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZmFjdG9yUmVtb3ZlQ29tbWFuZChFZGl0aW5nRG9tYWluIGRvbWFpbiwgQ29tbWFuZFBhcmFtZXRlciBjb21tYW5kUGFyYW1ldGVyKSB7Ci0JCWlmKCEoY29tbWFuZFBhcmFtZXRlci5nZXRPd25lcigpIGluc3RhbmNlb2YgQWN0aXZpdHkpKSB7Ci0JCQlBY3Rpdml0eSBhY3QgPSBnZXRBY3Rpdml0eSh0YXJnZXQpOwotCQkJaWYoYWN0ICE9IG51bGwpIHsKLQkJCQlJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciBhZGFwdGVyID0gKElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyKSBhZGFwdGVyRmFjdG9yeS5hZGFwdChhY3QsIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLmNsYXNzKTsKLQkJCQljb21tYW5kUGFyYW1ldGVyLnNldE93bmVyKGFjdCk7Ci0JCQkJcmV0dXJuIGFkYXB0ZXIuY3JlYXRlQ29tbWFuZChhY3QsIGRvbWFpbiwgUmVtb3ZlQ29tbWFuZC5jbGFzcywgY29tbWFuZFBhcmFtZXRlcik7CQkJCQotCQkJfQotCQl9Ci0JCXJldHVybiBzdXBlci5mYWN0b3JSZW1vdmVDb21tYW5kKGRvbWFpbiwgY29tbWFuZFBhcmFtZXRlcik7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0cmlidXRlKE9iamVjdCBvYmplY3QsIFN0cmluZyBwcm9wZXJ0eSkgewotCQkvLyBFUEYgYnVnIzogMTQ0ODIwIFNvbWUgbmVzdGVkIHdvcmsgcHJvZHVjdCBkZXNjcmlwdG9ycyBzaG93IHdyb25nIG1vZGVsIGluZm8gaW4gd29yayBwcm9kdWN0IHVzYWdlIHZpZXcKLQkJLy8gZm9yIGRlZmVjdCwgb3ZlcnJpZGUgdGhlIG1ldGhvZCwgcHJldmlvdXNseSBEZXNjcmlwdG9ySXRlbVByb3ZpZGUuZ2V0QXR0cmlidXRlIHVzZSB0byBoYXZlIHRoaXMgY29kZSwgbW92ZWQgdG8gaGVyZS4gCi0JCWlmIChwcm9wZXJ0eSA9PSBJQlNJdGVtUHJvdmlkZXIuQ09MX01PREVMX0lORk8pIHsKLQkJCVN0cmluZ0J1ZmZlciBtb2RlbEluZm8gPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgewotLy8JCQkJCVByb2Nlc3NVdGlsLmdldE1vZGVsSW5mb0ZvcldvcmtQcm9kdWN0RGVzY3JpcHRvcihtb2RlbEluZm8sCi0vLwkJCQkJCQkoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBvYmplY3QpOwotCQkJCQlQcm9jZXNzVXRpbC5nZXRXUERNb2RlbEluZm8obW9kZWxJbmZvLCBvYmplY3QsIHRoaXMpOwotCQkJCX0KLS8vCQkJfQotCQkJcmV0dXJuIG1vZGVsSW5mby50b1N0cmluZygpOyAKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0QXR0cmlidXRlKG9iamVjdCwgcHJvcGVydHkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL1dvcmtQcm9kdWN0RGVzY3JpcHRvcldyYXBwZXJJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9Xb3JrUHJvZHVjdERlc2NyaXB0b3JXcmFwcGVySXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxMTAzZGQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL1dvcmtQcm9kdWN0RGVzY3JpcHRvcldyYXBwZXJJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2VzczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3I7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgV29ya1Byb2R1Y3REZXNjcmlwdG9yV3JhcHBlckl0ZW1Qcm92aWRlciBleHRlbmRzCi0JCUJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyIHsKLQkKLQlwcm90ZWN0ZWQgV29ya1Byb2R1Y3REZXNjcmlwdG9yV3JhcHBlckl0ZW1Qcm92aWRlcihPYmplY3QgdmFsdWUsIE9iamVjdCBvd25lciwgQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIodmFsdWUsIG93bmVyLCBhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHZhbHVlCi0JICogQHBhcmFtIG93bmVyCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICovCi0JcHVibGljIFdvcmtQcm9kdWN0RGVzY3JpcHRvcldyYXBwZXJJdGVtUHJvdmlkZXIoV29ya1Byb2R1Y3REZXNjcmlwdG9yIHZhbHVlLAotCQkJT2JqZWN0IG93bmVyLCBBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcih2YWx1ZSwgb3duZXIsIGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiBAcGFyYW0gb3duZXIKLQkgKiBAcGFyYW0gaW5kZXgKLQkgKiBAcGFyYW0gZmVhdHVyZQotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqLwotCXB1YmxpYyBXb3JrUHJvZHVjdERlc2NyaXB0b3JXcmFwcGVySXRlbVByb3ZpZGVyKAotCQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yIHZhbHVlLCBPYmplY3Qgb3duZXIsCi0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgaW50IGluZGV4LCBBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcih2YWx1ZSwgb3duZXIsIGZlYXR1cmUsIGluZGV4LCBhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9BY3Rpdml0eUFkZENvbW1hbmQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL0FjdGl2aXR5QWRkQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZDU3NWE4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL0FjdGl2aXR5QWRkQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjc1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29weUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuTWVzc2VuZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc1BhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC5kb21haW4uVHJhY2VhYmxlQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluOwotCi0vKioKLSAqIEFkZENvbW1hbmQgZm9yIGFjdGl2aXR5Ci0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlIC0gU2VwIDE2LCAyMDA1Ci0gKiBAc2luY2UgMS4wCi0gKiBAc2VlIAotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZpdHlBZGRDb21tYW5kIGV4dGVuZHMgUHJvY2Vzc0VsZW1lbnRBZGRDb21tYW5kIHsKLQlwcml2YXRlIExpc3QgcHJvY1BhY2thZ2VzOwotCi0JLyoqCi0JICogQHBhcmFtIGNvbW1hbmQKLQkgKi8KLQlwdWJsaWMgQWN0aXZpdHlBZGRDb21tYW5kKENvbW1hbmQgY29tbWFuZCkgewotCQlzdXBlcihjb21tYW5kKTsKLQl9Ci0KLQlwcml2YXRlIE1hcCBnZXRDb3B5VG9PcmlnaW5hbE1hcCgpIHsKLQkJRWRpdGluZ0RvbWFpbiBlZCA9IGFkZENvbW1hbmQuZ2V0RG9tYWluKCk7Ci0JCWlmIChlZCBpbnN0YW5jZW9mIFRyYWNlYWJsZUFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbikgewotCQkJcmV0dXJuICgoVHJhY2VhYmxlQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluKSBlZCkKLQkJCQkJLmdldENvcHlUb09yaWdpbmFsTWFwKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNvcHlQcm9jZXNzUGFja2FnZXMoKSB7Ci0JCWlmIChwcm9jUGFja2FnZXMgPT0gbnVsbCkgewotCQkJaWYgKGhhc0NvcHlUb09yaWdpbmFsTWFwKCkpIHsKLQkJCQlib29sZWFuIHNob3dXYXJuaW5nID0gZmFsc2U7Ci0JCQkJcHJvY1BhY2thZ2VzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCUFycmF5TGlzdDxBY3Rpdml0eT4gY29waWVkQWN0aXZpdGllcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQkJCS8vIGNoZWNrIGZpcnN0IGVsZW1lbnQgb2YgYWRkQ29tbWFuZC5nZXRDb2xsZWN0aW9uKCkKLQkJCQkvLyBpZiBpdCdzIGEga2V5IGluIHRoZSBDb3B5VG9PcmlnaW5hbE1hcCwgd2UgYXJlIHBhc3RpbmcgYW5kCi0JCQkJLy8gbWF5IG5lZWQgdG8gd2FybiB0aGUgdXNlcgotCQkJCS8vIGlmIGl0J3Mgbm90IGEga2V5IGluIHRoZSBDb3B5VG9PcmlnaW5hbE1hcCwgdGhlbiB3ZSBhcmUKLQkJCQkvLyBwcm9iYWJseSBhZGRpbmcgYSBuZXcgZWxlbWVudAkJCQkKLQkJCQlpZiAoYWRkQ29tbWFuZC5nZXRDb2xsZWN0aW9uKCkgIT0gbnVsbAotCQkJCQkJJiYgYWRkQ29tbWFuZC5nZXRDb2xsZWN0aW9uKCkuc2l6ZSgpID4gMAotCQkJCQkJJiYgZ2V0T3JpZ2luYWwoYWRkQ29tbWFuZC5nZXRDb2xsZWN0aW9uKCkudG9BcnJheSgpWzBdKSAhPSBudWxsKSB7Ci0JCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGFkZENvbW1hbmQuZ2V0Q29sbGVjdGlvbigpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyLm5leHQoKTsKLQkJCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQkJCQlBY3Rpdml0eSBvcmlnID0gKEFjdGl2aXR5KSBnZXRPcmlnaW5hbChlbGVtZW50KTsKLQkJCQkJCQlpZiAob3JpZyAhPSBudWxsKSB7Ci0JCQkJCQkJCWlmIChvcmlnLmVDb250YWluZXIoKSAhPSBudWxsKSB7Ci0JCQkJCQkJCQlwcm9jUGFja2FnZXMuYWRkKG9yaWcuZUNvbnRhaW5lcigpKTsKLQkJCQkJCQkJCWNvcGllZEFjdGl2aXRpZXMuYWRkKChBY3Rpdml0eSkgZWxlbWVudCk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQlzaG93V2FybmluZyA9IHRydWU7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCi0JCQkJaWYgKHNob3dXYXJuaW5nKSB7Ci0JCQkJCU1lc3Nlbmdlci5JTlNUQU5DRQotCQkJCQkJCS5zaG93V2FybmluZygKLQkJCQkJCQkJCWdldExhYmVsKCksCi0JCQkJCQkJCQlMaWJyYXJ5RWRpdFJlc291cmNlcy5BY3Rpdml0eUFkZENvbW1hbmRfb3JpZ2luYWxOb3RGb3VuZFdhcm5pbmdfbXNnKTsKLQkJCQl9Ci0KLQkJCQlpZiAoIXByb2NQYWNrYWdlcy5pc0VtcHR5KCkpIHsKLQkJCQkJLy8gY29weSB0aGUgUHJvY2Vzc1BhY2thZ2Ugb2YgdGhlIG9yaWdpbmFsIEFjdGl2aXR5IHRvIGFkZAotCQkJCQkvLyBpdCB0byB0aGUgUHJvY2Vzc1BhY2thZ2UKLQkJCQkJLy8gb2YgdGhlIHRhcmdldCBBY3Rpdml0eS4KLQkJCQkJLy8KLQkJCQkJLy8gQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluIGVkaXRpbmdEb21haW4gPSBuZXcKLQkJCQkJLy8gQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluKFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFLmdldFByb2Nlc3NDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkKLQkJCQkJLy8gLCBuZXcgQmFzaWNDb21tYW5kU3RhY2soKSk7Ci0JCQkJCUNvbW1hbmQgY29tbWFuZCA9IENvcHlDb21tYW5kLmNyZWF0ZSgKLQkJCQkJCQlhZGRDb21tYW5kLmdldERvbWFpbigpLCBwcm9jUGFja2FnZXMpOwotCQkJCQl0cnkgewotCQkJCQkJY29tbWFuZC5leGVjdXRlKCk7Ci0KLQkJCQkJCS8vIFJlZnJlc2ggdGhlIEFkZENvbW1hbmQuY29sbGVjdGlvbiB3aXRoIG5ldyBhY3Rpdml0eSBjb3BpZXMuCi0JCQkJCQkvLwotCQkJCQkJQ29sbGVjdGlvbiBjb2xsZWN0aW9uID0gbmV3IEFycmF5TGlzdChhZGRDb21tYW5kLmdldENvbGxlY3Rpb24oKSk7Ci0JCQkJCQlDb2xsZWN0aW9uIGVsZW1lbnRzID0gYWRkQ29tbWFuZC5nZXRDb2xsZWN0aW9uKCk7CQkJCQkJCi0JCQkJCQllbGVtZW50cy5jbGVhcigpOwkKLQkJCQkJCUNvbGxlY3Rpb24gY29sID0gY29tbWFuZC5nZXRSZXN1bHQoKTsKLQkJCQkJCUFycmF5TGlzdDxQcm9jZXNzUGFja2FnZT4gcHJvY1BrZ0NvcGllcyA9IG5ldyBBcnJheUxpc3Q8UHJvY2Vzc1BhY2thZ2U+KGNvbCk7Ci0vLwkJCQkJCUFycmF5TGlzdDxQcm9jZXNzUGFja2FnZT4gcHJvY1BrZ0NvcGllcyA9IG5ldyBBcnJheUxpc3Q8UHJvY2Vzc1BhY2thZ2U+KGNvbW1hbmQuZ2V0UmVzdWx0KCkpOwotCQkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gY29sbGVjdGlvbi5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJT2JqZWN0IGVsZW1lbnQgPSAoT2JqZWN0KSBpdGVyLm5leHQoKTsKLQkJCQkJCQlpbnQgaW5kZXggPSBjb3BpZWRBY3Rpdml0aWVzLmluZGV4T2YoZWxlbWVudCk7Ci0JCQkJCQkJaWYoaW5kZXggIT0gLTEpIHsKLQkJCQkJCQkJUHJvY2Vzc1BhY2thZ2UgY29weSA9IHByb2NQa2dDb3BpZXMuZ2V0KGluZGV4KTsKLQkJCQkJCQkJZWxlbWVudCA9IGdldEFjdGl2aXR5Q29weShjb3B5KTsKLQkJCQkJCQl9Ci0JCQkJCQkJaWYoZWxlbWVudCAhPSBudWxsKSB7Ci0JCQkJCQkJCWVsZW1lbnRzLmFkZChlbGVtZW50KTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQkKLQkJCQkJfSBmaW5hbGx5IHsKLQkJCQkJCWlmIChjb21tYW5kICE9IG51bGwpIHsKLQkJCQkJCQljb21tYW5kLmRpc3Bvc2UoKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgQWN0aXZpdHkgZ2V0QWN0aXZpdHlDb3B5KFByb2Nlc3NQYWNrYWdlIGNvcHkpIHsKLQkJaWYgKGNvcHkgaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50KSB7Ci0JCQlBY3Rpdml0eSBhY3RDb3B5ID0gKChQcm9jZXNzQ29tcG9uZW50KSBjb3B5KQotCQkJCQkuZ2V0UHJvY2VzcygpOwotCQkJLy8gY29weSBkYXRhIGZyb20gUHJvY2Vzc0NvbXBvbmVudCB0byBhIG5ldwotCQkJLy8gUHJvY2Vzc1BhY2thZ2UKLQkJCVByb2Nlc3NQYWNrYWdlIHBrZ0NvcHkgPSBVbWFGYWN0b3J5LmVJTlNUQU5DRQotCQkJCQkuY3JlYXRlUHJvY2Vzc1BhY2thZ2UoKTsKLQkJCXBrZ0NvcHkuc2V0TmFtZShhY3RDb3B5LmdldE5hbWUoKSk7Ci0JCQlwa2dDb3B5LmdldFByb2Nlc3NFbGVtZW50cygpLmFkZChhY3RDb3B5KTsKLQkJCXBrZ0NvcHkuZ2V0UHJvY2Vzc0VsZW1lbnRzKCkuYWRkQWxsKAotCQkJCQljb3B5LmdldFByb2Nlc3NFbGVtZW50cygpKTsKLQkJCXBrZ0NvcHkuZ2V0RGlhZ3JhbXMoKQotCQkJCQkuYWRkQWxsKGNvcHkuZ2V0RGlhZ3JhbXMoKSk7Ci0JCQlwa2dDb3B5LmdldENoaWxkUGFja2FnZXMoKS5hZGRBbGwoCi0JCQkJCWNvcHkuZ2V0Q2hpbGRQYWNrYWdlcygpKTsKLQotCQkJcmV0dXJuIGFjdENvcHk7Ci0JCX0gZWxzZSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gY29weS5nZXRQcm9jZXNzRWxlbWVudHMoKS5pdGVyYXRvcigpOyBpdGVyYXRvcgotCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBlbGVtZW50ID0gaXRlcmF0b3IubmV4dCgpOwotCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQkJcmV0dXJuIChBY3Rpdml0eSkgZWxlbWVudDsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5jb21tYW5kLk1ldGhvZEVsZW1lbnRBZGRDb21tYW5kI2V4ZWN1dGUoKQotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCXByZXBhcmVBZGRMaXN0KCk7Ci0JCWNvcHlQcm9jZXNzUGFja2FnZXMoKTsKLQkJc3VwZXIuZXhlY3V0ZSgpOwotCX0KLQotCS8qKgotCSAqIENoZWNrcyBpZiBlIGlzIGEgY2hpbGQsIGRpcmVjdCBvciBvZiBhY3QKLQkgKiAKLQkgKiBAcGFyYW0gYWN0Ci0JICogQHBhcmFtIGUKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0NoaWxkT2YoT2JqZWN0IHBhcmVudCwgT2JqZWN0IGUpIHsKLQkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQlBY3Rpdml0eSBhY3QgPSAoQWN0aXZpdHkpIHBhcmVudDsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGFjdC5nZXRCcmVha2Rvd25FbGVtZW50cygpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3QgY2hpbGQgPSBpdGVyLm5leHQoKTsKLQkJCQlpZiAoZSA9PSBjaGlsZCkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQkJaWYgKGlzQ2hpbGRPZihjaGlsZCwgZSkpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCS8vIGVsc2UgaWYocGFyZW50IGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yKSB7Ci0JCS8vIFdvcmtQcm9kdWN0IHdwID0gKChXb3JrUHJvZHVjdERlc2NyaXB0b3IpcGFyZW50KS5nZXRXb3JrUHJvZHVjdCgpOwotCQkvLyBpZih3cCBpbnN0YW5jZW9mIEFydGlmYWN0KSB7Ci0JCS8vIGlmKGUgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3IpIHsKLQkJLy8gaWYoVW1hVXRpbC5pc0NvbnRhaW5lZEJ5KCgoV29ya1Byb2R1Y3REZXNjcmlwdG9yKWUpLmdldFdvcmtQcm9kdWN0KCksCi0JCS8vIHdwKSkgewotCQkvLyByZXR1cm4gdHJ1ZTsKLQkJLy8gfQotCQkvLyB9Ci0JCS8vIH0KLQkJLy8gfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0NoaWxkT2YoQ29sbGVjdGlvbiBlbGVtZW50cywgT2JqZWN0IGUpIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZWxlbWVudHMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlpZiAoaXNDaGlsZE9mKGl0ZXIubmV4dCgpLCBlKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JcHJpdmF0ZSBib29sZWFuIGhhc0NvcHlUb09yaWdpbmFsTWFwKCkgewotCQlFZGl0aW5nRG9tYWluIGVkID0gYWRkQ29tbWFuZC5nZXREb21haW4oKTsKLQkJaWYgKGVkIGluc3RhbmNlb2YgVHJhY2VhYmxlQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluKSB7Ci0JCQlUcmFjZWFibGVBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW4gZWRpdGluZ0RvbWFpbiA9ICgoVHJhY2VhYmxlQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluKSBlZCk7Ci0JCQlyZXR1cm4gKGVkaXRpbmdEb21haW4uZ2V0Q29weVRvT3JpZ2luYWxNYXAoKSAhPSBudWxsICYmCi0JCQkJCSFlZGl0aW5nRG9tYWluLmdldENvcHlUb09yaWdpbmFsTWFwKCkuaXNFbXB0eSgpKQotCQkJCXx8IChlZGl0aW5nRG9tYWluLmdldENsaXBib2FyZFRvT3JpZ2luYWxNYXAoKSAhPSBudWxsICYmCi0JCQkJCQkhZWRpdGluZ0RvbWFpbi5nZXRDbGlwYm9hcmRUb09yaWdpbmFsTWFwKCkuaXNFbXB0eSgpKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCXByaXZhdGUgT2JqZWN0IGdldE9yaWdpbmFsKE9iamVjdCBjb3B5KSB7Ci0JCVRyYWNlYWJsZUFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbiBlZCA9IChUcmFjZWFibGVBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW4pIGFkZENvbW1hbmQuZ2V0RG9tYWluKCk7Ci0JCU9iamVjdCBvcmlnaW5hbCA9IGVkLmdldENvcHlUb09yaWdpbmFsTWFwKCkuZ2V0KGNvcHkpOwotCQlpZihvcmlnaW5hbCA9PSBudWxsICYmIGVkLmdldENsaXBib2FyZFRvT3JpZ2luYWxNYXAoKSAhPSBudWxsKSB7Ci0JCQlvcmlnaW5hbCA9IGVkLmdldENsaXBib2FyZFRvT3JpZ2luYWxNYXAoKS5nZXQoY29weSk7Ci0JCX0KLQkJcmV0dXJuIG9yaWdpbmFsOwotCX0KLQotCXByaXZhdGUgdm9pZCBwcmVwYXJlQWRkTGlzdCgpIHsKLQkJLy8gY2xlYW51cCBlbGVtZW50IGxpc3QgYmVmb3JlIGFkZGluZyBpdCB0byB0aGUgYWN0aXZpdHkgdG8gYXZvaWQgYWRkaW5nCi0JCS8vIGVsZW1lbnRzIG11bHRpcGxlIHRpbWVzCi0JCS8vCQkKLQkJaWYgKGhhc0NvcHlUb09yaWdpbmFsTWFwKCkpIHsKLQkJCUFycmF5TGlzdCBvcmlnaW5hbHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlNYXAgb3JpZ2luYWxUb0NvcHlNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gYWRkQ29tbWFuZC5nZXRDb2xsZWN0aW9uKCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBlbGVtZW50ID0gaXRlci5uZXh0KCk7Ci0JCQkJT2JqZWN0IG9yaWdpbmFsID0gZ2V0T3JpZ2luYWwoZWxlbWVudCk7Ci0JCQkJaWYgKG9yaWdpbmFsICE9IG51bGwpIHsKLQkJCQkJb3JpZ2luYWxzLmFkZChvcmlnaW5hbCk7Ci0JCQkJCW9yaWdpbmFsVG9Db3B5TWFwLnB1dChvcmlnaW5hbCwgZWxlbWVudCk7Ci0JCQkJfQotCQkJfQotCi0JCQlBcnJheUxpc3QgcmVtb3ZlTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCS8vIEFycmF5TGlzdCBhZGRMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gb3JpZ2luYWxzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBlbGVtZW50ID0gaXRlci5uZXh0KCk7Ci0JCQkJaWYgKGlzQ2hpbGRPZihvcmlnaW5hbHMsIGVsZW1lbnQpKSB7Ci0JCQkJCXJlbW92ZUxpc3QuYWRkKG9yaWdpbmFsVG9Db3B5TWFwLmdldChlbGVtZW50KSk7Ci0JCQkJfQotCQkJfQotCQkJYWRkQ29tbWFuZC5nZXRDb2xsZWN0aW9uKCkucmVtb3ZlQWxsKHJlbW92ZUxpc3QpOwotCQl9Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvQWN0aXZpdHlEZWVwQ29weUNvbW1hbmQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL0FjdGl2aXR5RGVlcENvcHlDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4MTQ3NGYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvQWN0aXZpdHlEZWVwQ29weUNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkxNyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkFzc2VydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQmFzaWNDb21tYW5kU3RhY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbXBvdW5kQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlhNTFR5cGVQYWNrYWdlLkxpdGVyYWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvcHlDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ3JlYXRlQ29weUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Jbml0aWFsaXplQ29weUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuUHJvdmlkZXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5WYXJpYWJpbGl0eUluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Db25maWd1cmF0aW9uU2V0dGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Db25zdHJhaW50TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuRGVwdGhMZXZlbEFkYXB0ZXJGYWN0b3J5VHJlZUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5FeHRlbnNpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5JRGlhZ3JhbU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLklUZXh0UmVmZXJlbmNlUmVwbGFjZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlByb2Nlc3NVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5TdXBwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnN0cmFpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc1BhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC5jb21tYW5kLk1ldGhvZEVsZW1lbnRJbml0aWFsaXplQ29weUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotLyoqCi0gKiBQaHlzaWNhbGx5IGNvcGllcyBhbiBhY3Rpdml0eSB3aXRoIGFsbCBvZiBpdHMgZGlyZWN0IG9yIGluaGVyaXRlZCBzdHJ1Y3R1cmFsIGZlYXR1cmVzIGFuZCByZWZlcmVuY2VzLgotICogICAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlIC0gSnVuIDIxLCAyMDA2Ci0gKiBAc2luY2UgIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZpdHlEZWVwQ29weUNvbW1hbmQgZXh0ZW5kcyBDb3B5Q29tbWFuZCB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQWRhcHRlckZhY3RvcnlbXSBhZGFwdGVyRmFjdG9yaWVzID0gewotCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRS5nZXRXQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpLAotCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRS5nZXRPQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpLAotCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRS5nZXRQQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpCi0JfTsKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnRbXSBkaWFncmFtVHlwZXMgPSB7Ci0JCUlEaWFncmFtTWFuYWdlci5BQ1RJVklUWV9ERVRBSUxfRElBR1JBTSwKLQkJSURpYWdyYW1NYW5hZ2VyLkFDVElWSVRZX0RJQUdSQU0sCi0JCUlEaWFncmFtTWFuYWdlci5XT1JLX1BST0RVQ1RfREVQRU5ERU5DWV9ESUFHUkFNCi0JfTsKLQkKLQlwdWJsaWMgc3RhdGljIEFkYXB0ZXJGYWN0b3J5W10gZ2V0QWRhcHRlckZhY3RvcmllcygpIHsKLQkJcmV0dXJuIGFkYXB0ZXJGYWN0b3JpZXM7Ci0JfQotCQotCXByaXZhdGUgY2xhc3MgRWRpdGluZ0RvbWFpbiBleHRlbmRzIEFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbiB7Ci0KLQkJLyoqCi0JCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCQkgKiBAcGFyYW0gY29tbWFuZFN0YWNrCi0JCSAqLwotCQlwdWJsaWMgRWRpdGluZ0RvbWFpbigpIHsKLQkJCXN1cGVyKFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFLmdldFdCU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCksIG5ldyBCYXNpY0NvbW1hbmRTdGFjaygpKTsKLQkJfQotCQkKLQkJLyogKG5vbi1KYXZhZG9jKQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5BZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW4jY3JlYXRlQ29tbWFuZChqYXZhLmxhbmcuQ2xhc3MsIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcikKLQkJICovCi0JCXB1YmxpYyBDb21tYW5kIGNyZWF0ZUNvbW1hbmQoQ2xhc3MgY29tbWFuZENsYXNzLCBDb21tYW5kUGFyYW1ldGVyIGNvbW1hbmRQYXJhbWV0ZXIpIHsKLQkJCWlmKGNvbW1hbmRDbGFzcyA9PSBDcmVhdGVDb3B5Q29tbWFuZC5jbGFzcykgewotCQkJCXJldHVybiBuZXcgQ3JlYXRlRGVlcENvcHlDb21tYW5kKHRoaXMsIGNvbW1hbmRQYXJhbWV0ZXIuZ2V0RU93bmVyKCksIChIZWxwZXIpIGNvbW1hbmRQYXJhbWV0ZXIuZ2V0VmFsdWUoKSk7Ci0JCQl9Ci0JCQlpZihjb21tYW5kQ2xhc3MgPT0gSW5pdGlhbGl6ZUNvcHlDb21tYW5kLmNsYXNzKSB7Ci0JCQkJcmV0dXJuIG5ldyBJbml0aWFsaXplRGVlcENvcHlDb21tYW5kKHRoaXMsIGNvbW1hbmRQYXJhbWV0ZXIuZ2V0RU93bmVyKCksIChIZWxwZXIpIGNvbW1hbmRQYXJhbWV0ZXIuZ2V0VmFsdWUoKSk7Ci0JCQl9Ci0JCQlyZXR1cm4gc3VwZXIuY3JlYXRlQ29tbWFuZChjb21tYW5kQ2xhc3MsIGNvbW1hbmRQYXJhbWV0ZXIpOwotCQl9Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGFkZENyZWF0ZUNvcHlDb21tYW5kcyhDb21wb3VuZENvbW1hbmQgY29tcG91bmRDb21tYW5kLAotCQkJRU9iamVjdCBvYmplY3QpIHsKLQotCQkvLyBPcGVyYXRpb24gdG8gaGFuZGxlIGNvcHkgcmVwbGFjZXJzIG9mIHRoZSBjaGlsZCBhY3Rpdml0aWVzCi0JCS8vIAotCQlpZiAoY29weUV4dGVybmFsVmFyaWF0aW9ucyAmJiBvYmplY3QgaW5zdGFuY2VvZiBQcm9jZXNzUGFja2FnZSAmJiBvYmplY3QgIT0gdGhpcy5hY3Rpdml0eS5lQ29udGFpbmVyKCkpIHsJCQkKLQkJCVByb2Nlc3NQYWNrYWdlIHBrZyA9IChQcm9jZXNzUGFja2FnZSlvYmplY3Q7Ci0JCQlib29sZWFuIGlzUmVwbGFjZWQgPSBmYWxzZTsKLQkJCUFjdGl2aXR5IHJlcGxhY2VyID0gbnVsbDsKLQkJCUFjdGl2aXR5IG9yaWduYWxBY3Rpdml0eSA9IG51bGw7Ci0JCQlmb3IoT2JqZWN0IHByb2Nlc0VsZW1lbnQgOiBwa2cuZ2V0UHJvY2Vzc0VsZW1lbnRzKCkpewotCQkJCWlmIChwcm9jZXNFbGVtZW50IGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQkJQWN0aXZpdHkgY2hpbGRBY3QgPSAoQWN0aXZpdHkpIHByb2Nlc0VsZW1lbnQ7Ci0JCQkJCWlmKGNoaWxkQWN0LmdldFN1cGVyQWN0aXZpdGllcygpID09IHRoaXMuYWN0aXZpdHkpIHsKLQkJCQkJCXJlcGxhY2VyID0gZ2V0UmVwbGFjZXIoIChBY3Rpdml0eSlwcm9jZXNFbGVtZW50ICk7Ci0JCQkJCQlpZiAocmVwbGFjZXIgIT0gbnVsbCApIHsKLQkJCQkJCQlpc1JlcGxhY2VkID0gdHJ1ZTsKLQkJCQkJCQlvcmlnbmFsQWN0aXZpdHkgPSAoQWN0aXZpdHkpcHJvY2VzRWxlbWVudDsKLQkJCQkJCX0KLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJaWYgKGlzUmVwbGFjZWQpIHsJCQkJCi0JCQkJLy8gcmVzZXQgdGhlIGRlZmVycmVkSW5pdGlhbGl6YXRpb25Db3VudCBzbwotCQkJCS8vIEluaXRpYWxpemVDb3B5Q29tbWFuZCBjYW4gYmUgY3JlYXRlZCBmb3IgdGhlIGZvbGxvd2luZwotCQkJCS8vIEFjdGl2aXR5RGVlcENvcHlDb21tYW5kLiBTZWUKLQkJCQkvLyBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvcHlDb21tYW5kLnByZXBhcmUoKSBmb3IgbW9yZQotCQkJCS8vIGRldGFpbHMuCi0JCQkJLy8KLQkJCQljb3B5SGVscGVyLmRlY3JlbWVudERlZmVycmVkSW5pdGlhbGl6YXRpb25Db3VudCgpOwotCQkJCUFjdGl2aXR5RGVlcENvcHlDb21tYW5kIGNtZCA9IG5ldyBBY3Rpdml0eURlZXBDb3B5Q29tbWFuZChyZXBsYWNlciwgKENvcHlIZWxwZXIpY29weUhlbHBlciwgY29uZmlnLCAKLQkJCQkJCXRhcmdldFByb2Nlc3MsIG1vbml0b3IsIGZhbHNlLGFjdGl2aXR5RGVlcENvcHlDb25maWd1cmF0b3IpOwotCQkJCWNtZC5ndWlkTGlzdCA9IG5ldyBMaW5rZWRMaXN0PFN0cmluZz4oQWN0aXZpdHlEZWVwQ29weUNvbW1hbmQudGhpcy5ndWlkTGlzdCk7Ci0JCQkJY21kLmd1aWRMaXN0LmFkZEFsbChQcm9jZXNzVXRpbC5nZXRHdWlkTGlzdChBY3Rpdml0eURlZXBDb3B5Q29tbWFuZC50aGlzLmFjdGl2aXR5LCBvcmlnbmFsQWN0aXZpdHkpKTsKLQkJCQl0cnkgewotCQkJCQljbWQuZXhlY3V0ZSgpOwotCQkJCQlQcm9jZXNzUGFja2FnZSBwa2dDb3B5ID0gY21kLnBrZ0NvcHk7CQkJCQkKLQkJCQkJLy9iYXNpYyBwdXQ6IG9yaWdpbmFsIHByYyBwa2cgdG8gY29waWVkIHBrZyBiYXNlZCBvbiByZXBsYWNlZCBwYWNrYWdlLgotCQkJCQkoKENvcHlIZWxwZXIpY29weUhlbHBlcikuYmFzaWNQdXQob2JqZWN0LCBwa2dDb3B5KTsJCQkKLQkJCQkJLy9iYXNpYyBwdXQgb3JpZ2luYWwgYWN0aXZpdHkgdG8gdGhlIGNvcHkgb2YgcmVwbGFjZXIgYWN0aXZpdHkuCi0JCQkJCSgoQ29weUhlbHBlciljb3B5SGVscGVyKS5iYXNpY1B1dChvcmlnbmFsQWN0aXZpdHksIGNvcHlIZWxwZXIuZ2V0KHJlcGxhY2VyKSk7Ci0JCQkJfWZpbmFsbHl7Ci0JCQkJCWNtZC5kaXNwb3NlKCk7Ci0JCQkJfQkKLQkJCQkvLyByZXN0b3JlIHRoZSBkZWZlcnJlZEluaXRpYWxpemF0aW9uQ291bnQgc28KLQkJCQkvLyBJbml0aWFsaXplQ29weUNvbW1hbmQgY2FuIGJlIGNyZWF0ZWQgZm9yIHRoaXMKLQkJCQkvLyBBY3Rpdml0eURlZXBDb3B5Q29tbWFuZAotCQkJCWNvcHlIZWxwZXIuaW5jcmVtZW50RGVmZXJyZWRJbml0aWFsaXphdGlvbkNvdW50KCk7CQkJCQotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQkKLQkJc3VwZXIuYWRkQ3JlYXRlQ29weUNvbW1hbmRzKGNvbXBvdW5kQ29tbWFuZCwgb2JqZWN0KTsKLQkKLQl9Ci0JCi0JLyoqCi0JICogQ2hlY2tzIGZvciB0aGUgcmVwbGFjZXIgb2YgYWN0aXZpdHkgaW4gdGhlIGNvcHkgYmFzZWQgY29uZmlndXJhdGlvbi4KLQkgKiAgCi0JICogQHBhcmFtIGFjdGl2aXR5IHRhcmdldCBhY3Rpdml0eQotCSAqIEByZXR1cm4gcmVwbGNhY2VyIG9yIG51bGwgaWYgaXQgZG9lc24ndCBoYXZlIG9uZQotCSAqLwotCXByb3RlY3RlZCBBY3Rpdml0eSBnZXRSZXBsYWNlcihBY3Rpdml0eSBhY3Rpdml0eSl7CQkKLQkJQ29uZmlndXJhdGlvblNldHRlciBjb25maWdTZXR0ZXIgPSBuZXcgQ29uZmlndXJhdGlvblNldHRlcihnZXRBZGFwdGVyRmFjdG9yeSgpKTsKLQkJdHJ5IHsKLQkJCWlmIChhY3Rpdml0eURlZXBDb3B5Q29uZmlndXJhdG9yICE9IG51bGwgKSB7Ci0JCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjdXJyZW50Q29uZmlnID0gY29uZmlnU2V0dGVyLmdldE9sZENvbmZpZ3VyYXRpb24oKTsgCi0JCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb3B5Q29uZmlnID0gY29uZmlnID09IG51bGwgPyAoY3VycmVudENvbmZpZyAhPSBudWxsID8gY3VycmVudENvbmZpZwotCQkJCQkJOiB0YXJnZXRQcm9jZXNzLmdldERlZmF1bHRDb250ZXh0KCkpCi0JCQkJCQk6IGNvbmZpZzsKLQkJCQlhY3Rpdml0eURlZXBDb3B5Q29uZmlndXJhdG9yLnNldE1ldGhvZENvbmZpZ3VyYXRpb24oY29weUNvbmZpZyk7CQkJCQotCi0JCQkJVmFyaWFiaWxpdHlJbmZvIHZhcmlhYmlsaXR5SW5mbyA9IGFjdGl2aXR5RGVlcENvcHlDb25maWd1cmF0b3IuZ2V0VmFyaWFiaWxpdHlJbmZvKGFjdGl2aXR5KTsKLQotCQkJCWlmICh2YXJpYWJpbGl0eUluZm8gIT0gbnVsbCAmJiAhIHZhcmlhYmlsaXR5SW5mby5nZXRJbmhlcml0YW5jZUxpc3QoKS5pc0VtcHR5KCkgKSB7Ci0JCQkJCUFjdGl2aXR5IHJlcGxhY2VyID0gKEFjdGl2aXR5KXZhcmlhYmlsaXR5SW5mby5nZXRJbmhlcml0YW5jZUxpc3QoKS5nZXQoMCk7Ci0JCQkJCXJldHVybiAgcmVwbGFjZXIgPT0gYWN0aXZpdHkgPyBudWxsIDogcmVwbGFjZXI7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIG51bGw7Ci0JCX0gZmluYWxseXsKLQkJCWlmIChjb25maWdTZXR0ZXIgIT0gbnVsbCApIHsKLQkJCQljb25maWdTZXR0ZXIucmVzdG9yZSgpOwotCQkJfQotCQl9Ci0JfQotCQotCS8qKgotCSAqIENoZWNrcyBmb3IgdGhlIGNvbnRyaWJ1dG9ycyBvZiBhY3Rpdml0eSBpbiB0aGUgY29weSBiYXNlZCBjb25maWd1cmF0aW9uLgotCSAqIEBwYXJhbSBhY3Rpdml0eQotCSAqIEByZXR1cm4gYSBsaXN0IGluY2x1ZGluZyBjb250cmlidXRvcnMgb3IgZW1wdHkgbGlzdAotCSAqLwotCXByb3RlY3RlZCBMaXN0IGdldENvbnRyaWJ1dG9ycyhBY3Rpdml0eSBhY3Rpdml0eSl7Ci0JCUNvbmZpZ3VyYXRpb25TZXR0ZXIgY29uZmlnU2V0dGVyID0gbmV3IENvbmZpZ3VyYXRpb25TZXR0ZXIoZ2V0QWRhcHRlckZhY3RvcnkoKSk7Ci0JCXRyeSB7Ci0JCQlpZiAoYWN0aXZpdHlEZWVwQ29weUNvbmZpZ3VyYXRvciAhPSBudWxsICkgewotCQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY3VycmVudENvbmZpZyA9IGNvbmZpZ1NldHRlci5nZXRPbGRDb25maWd1cmF0aW9uKCk7IAotCQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY29weUNvbmZpZyA9IGNvbmZpZyA9PSBudWxsID8gKGN1cnJlbnRDb25maWcgIT0gbnVsbCA/IGN1cnJlbnRDb25maWcKLQkJCQkJCTogdGFyZ2V0UHJvY2Vzcy5nZXREZWZhdWx0Q29udGV4dCgpKQotCQkJCQkJOiBjb25maWc7Ci0JCQkJYWN0aXZpdHlEZWVwQ29weUNvbmZpZ3VyYXRvci5zZXRNZXRob2RDb25maWd1cmF0aW9uKGNvcHlDb25maWcpOwkJCQkKLQotCQkJCVZhcmlhYmlsaXR5SW5mbyB2YXJpYWJpbGl0eUluZm8gPSBhY3Rpdml0eURlZXBDb3B5Q29uZmlndXJhdG9yLmdldFZhcmlhYmlsaXR5SW5mbyhhY3Rpdml0eSk7Ci0KLQkJCQlpZiAodmFyaWFiaWxpdHlJbmZvICE9IG51bGwgKSB7Ci0JCQkJCXJldHVybiB2YXJpYWJpbGl0eUluZm8uZ2V0Q29udHJpYnV0b3JzKCk7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JCX0gZmluYWxseXsKLQkJCWlmIChjb25maWdTZXR0ZXIgIT0gbnVsbCApIHsKLQkJCQljb25maWdTZXR0ZXIucmVzdG9yZSgpOwotCQkJfQotCQl9Ci0JfQotCXByaXZhdGUgY2xhc3MgQ3JlYXRlRGVlcENvcHlDb21tYW5kIGV4dGVuZHMgQ3JlYXRlQ29weUNvbW1hbmQgewotCi0JCS8qKgotCQkgKiBAcGFyYW0gZG9tYWluCi0JCSAqIEBwYXJhbSBvd25lcgotCQkgKiBAcGFyYW0gY29weUhlbHBlcgotCQkgKi8KLQkJcHVibGljIENyZWF0ZURlZXBDb3B5Q29tbWFuZChFZGl0aW5nRG9tYWluIGRvbWFpbiwgRU9iamVjdCBvd25lciwgSGVscGVyIGNvcHlIZWxwZXIpIHsKLQkJCXN1cGVyKGRvbWFpbiwgb3duZXIsIGNvcHlIZWxwZXIpOwotCQl9Ci0JCQotCQkvKiAobm9uLUphdmFkb2MpCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5DcmVhdGVDb3B5Q29tbWFuZCNkb0dldENoaWxkcmVuVG9Db3B5KCkKLQkJICovCi0JCXB1YmxpYyBDb2xsZWN0aW9uPD8+IGRvR2V0Q2hpbGRyZW5Ub0NvcHkoKSB7Ci0JCQlDb25maWd1cmF0aW9uU2V0dGVyIGNvbmZpZ1NldHRlciA9IG5ldyBDb25maWd1cmF0aW9uU2V0dGVyKGdldEFkYXB0ZXJGYWN0b3J5KCkpOwotCQkJdHJ5IHsKLQkJCQljb25maWdTZXR0ZXIuc2V0KGNvbmZpZyk7Ci0JCQkJSUNvbmZpZ3VyYXRvciBjb25maWd1cmF0b3IgPSBjb25maWdTZXR0ZXIuZ2V0Q29uZmlndXJhdG9yKCk7Ci0JCQkJCi0JCQkJLy8gQ3JlYXRlIGNvbW1hbmRzIHRvIGNyZWF0ZSBjb3BpZXMgb2YgdGhlIGNoaWxkcmVuLgotCQkJCS8vCi0JCQkJTGlzdDxPYmplY3Q+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PigpOwotCQkJCWZvciAoSXRlcmF0b3I8RU9iamVjdD4gaSA9IG93bmVyLmVDb250ZW50cygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0JCQkJewotCQkJCQlPYmplY3QgbyA9IGkubmV4dCgpOwotCQkJCQlpZihvIGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQkJCS8vIG1ha2Ugc3VyZSB0aGF0IEFjdGl2aXR5IHdpbGwgYmUgY29waWVkIGZpcnN0Ci0JCQkJCQkvLyBzbyByZWZlcmVuY2VzIHRvIGl0cyBpbmhlcml0ZWQgZWxlbWVudHMgY2FuIGJlIHJlc29sdmVkCi0JCQkJCQkvLyBwcm9wZXJseQotCQkJCQkJLy8KLQkJCQkJCWlmKGNvbmZpZ3VyYXRvciA9PSBudWxsIHx8IGNvbmZpZ3VyYXRvci5hY2NlcHQobykpIHsKLQkJCQkJCQlyZXN1bHQuYWRkKDAsIG8pOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJcmVzdWx0LmFkZChvKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJZmluYWxseSB7Ci0JCQkJY29uZmlnU2V0dGVyLnJlc3RvcmUoKTsKLQkJCX0KLQkJfQotCQkKLQl9Ci0JCi0JcHJpdmF0ZSBjbGFzcyBJbml0aWFsaXplRGVlcENvcHlDb21tYW5kIGV4dGVuZHMgTWV0aG9kRWxlbWVudEluaXRpYWxpemVDb3B5Q29tbWFuZCB7Ci0JCS8qKgotCQkgKiBMaXN0IG9mIEdVSURzIG9mIGFjdGl2aXR5IHN0YXJ0aW5nIGZyb20gdGhlIHRvcCBwcm9jZXNzIHRvIAotCQkgKi8KLQkJcHJpdmF0ZSBMaXN0PFN0cmluZz4gZ3VpZExpc3Q7Ci0JCQotCQkvKioKLQkJICogQHBhcmFtIGRvbWFpbgotCQkgKiBAcGFyYW0gb3duZXIKLQkJICogQHBhcmFtIGNvcHlIZWxwZXIKLQkJICovCi0JCXB1YmxpYyBJbml0aWFsaXplRGVlcENvcHlDb21tYW5kKEVkaXRpbmdEb21haW4gZG9tYWluLCBFT2JqZWN0IG93bmVyLCBIZWxwZXIgY29weUhlbHBlcikgewotCQkJc3VwZXIoZG9tYWluLCBvd25lciwgY29weUhlbHBlcik7Ci0JCQljb3B5ID0gKEVPYmplY3QpIGNvcHlIZWxwZXIuZ2V0KG93bmVyKTsKLQkJfQotCQkKLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQuY29tbWFuZC5NZXRob2RFbGVtZW50SW5pdGlhbGl6ZUNvcHlDb21tYW5kI2NvcHlSZWZlcmVuY2VzKCkKLQkJICovCi0JCXByb3RlY3RlZCB2b2lkIGNvcHlSZWZlcmVuY2VzKCkgewotCQkJQWN0aXZpdHkgYmFzZSA9IG51bGw7Ci0JCQlBY3Rpdml0eSBiYXNlQ29weSA9IG51bGw7Ci0JCQlDb2xsZWN0aW9uPE9iamVjdD4gY2hpbGRCYXNlQ29waWVzID0gbmV3IEhhc2hTZXQ8T2JqZWN0PigpOwotCQkJQ29uZmlndXJhdGlvblNldHRlciBjb25maWdTZXR0ZXIgPSBudWxsOwotCQkJSUNvbmZpZ3VyYXRvciBjb25maWd1cmF0b3IgPSBudWxsOwotCQkJYm9vbGVhbiBiYXNlQWNjZXB0ZWQgPSBmYWxzZTsKLQkJCXRyeSB7Ci0JCQkJaWYob3duZXIgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCQlBY3Rpdml0eSBhY3Rpdml0eSA9IChBY3Rpdml0eSkgb3duZXI7Ci0JCQkJCWlmKFByb2Nlc3NVdGlsLmlzRXh0ZW5kaW5nT3JMb2NhbGx5Q29udHJpYnV0aW5nKGFjdGl2aXR5KSkgewotCQkJCQkJY29uZmlnU2V0dGVyID0gbmV3IENvbmZpZ3VyYXRpb25TZXR0ZXIoZ2V0QWRhcHRlckZhY3RvcnkoKSk7Ci0JCQkJCQljb25maWdTZXR0ZXIuc2V0KGNvbmZpZyk7Ci0JCQkJCQljb25maWd1cmF0b3IgPSBjb25maWdTZXR0ZXIuZ2V0Q29uZmlndXJhdG9yKCk7Ci0JCQkJCQkvLyBjb3B5IGluaGVyaXRlZCBlbGVtZW50cyBieSBkZWVwLWNvcHlpbmcgYmFzZSBhY3Rpdml0eQotCQkJCQkJLy8KLQkJCQkJCS8vIGRlZXAgY29weSBvZiBiYXNlIGFjdGl2aXR5IGF0IHRoaXMgcG9pbnQgaXMgZXNzZW50aWFsIHNvIHJlZmVyZW5jZXMgdG8gcHJlZGVjZXNzb3JzCi0JCQkJCQkvLyB3aWxsIGJlIGNvcGllZCBjb3JyZWN0bHkKLQkJCQkJCS8vCi0JCQkJCQliYXNlID0gKEFjdGl2aXR5KSBhY3Rpdml0eS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCk7Ci0JCQkJCQliYXNlQWNjZXB0ZWQgPSBjb25maWd1cmF0b3IgPT0gbnVsbCB8fCBjb25maWd1cmF0b3IuYWNjZXB0KGJhc2UpOwotCQkJCQkJaWYoYmFzZUFjY2VwdGVkKSB7CQkJCQkJCQotCQkJCQkJCUNvcHlIZWxwZXIgaGVscGVyID0gKENvcHlIZWxwZXIpY29weUhlbHBlcjsKLQkJCQkJCQlBY3Rpdml0eSBvbGRCYXNlQ29weSA9IChBY3Rpdml0eSkgaGVscGVyLmdldChiYXNlKTsKLQkJCQkJCQkvLyB0aGlzIHdpbGwgcmVkaXJlY3QgYW55IHJlZmVyZW5jZSB0byBjb3B5IG9mIGJhc2UgaW4gZGlhZ3JhbSB0byB0aGUgY29weSBvZiB0aGUgYWN0aXZpdHkKLQkJCQkJCQkvLwotCQkJCQkJCWhlbHBlci5wdXRWYXJpYWJpbGl0eUVsZW1lbnQoYmFzZSwgYWN0aXZpdHkpOwotCQkJCQkJCUFycmF5TGlzdCBjaGlsZEJhc2VzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGFjdGl2aXR5LmdldEJyZWFrZG93bkVsZW1lbnRzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJCU9iamVjdCBlID0gaXRlci5uZXh0KCk7Ci0JCQkJCQkJCWlmKGUgaW5zdGFuY2VvZiBWYXJpYWJpbGl0eUVsZW1lbnQpIHsKLQkJCQkJCQkJCVZhcmlhYmlsaXR5RWxlbWVudCB2ZSA9IChWYXJpYWJpbGl0eUVsZW1lbnQpIGU7Ci0JCQkJCQkJCQlWYXJpYWJpbGl0eUVsZW1lbnQgYmFzZUVsZW1lbnQgPSB2ZS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCk7Ci0JCQkJCQkJCQlpZihiYXNlRWxlbWVudCAhPSBudWxsICYmCi0JCQkJCQkJCQkJCSh2ZS5nZXRWYXJpYWJpbGl0eVR5cGUoKSA9PSBWYXJpYWJpbGl0eVR5cGUuTE9DQUxfQ09OVFJJQlVUSU9OIHx8IHZlLmdldFZhcmlhYmlsaXR5VHlwZSgpID09IFZhcmlhYmlsaXR5VHlwZS5MT0NBTF9SRVBMQUNFTUVOVCkpCi0JCQkJCQkJCQl7Ci0JCQkJCQkJCQkJaGVscGVyLnB1dFZhcmlhYmlsaXR5RWxlbWVudChiYXNlRWxlbWVudCwgdmUpOwotCQkJCQkJCQkJCWNoaWxkQmFzZXMuYWRkKGJhc2VFbGVtZW50KTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCQkJCQkJCX0KLQotCQkJCQkJCUFjdGl2aXR5RGVlcENvcHlDb21tYW5kIGNtZCA9IG5ldyBBY3Rpdml0eURlZXBDb3B5Q29tbWFuZChiYXNlLCBoZWxwZXIsIGNvbmZpZywgdGFyZ2V0UHJvY2VzcywgbW9uaXRvciwgZmFsc2UsYWN0aXZpdHlEZWVwQ29weUNvbmZpZ3VyYXRvcik7Ci0JCQkJCQkJY21kLmNvcHlFeHRlcm5hbFZhcmlhdGlvbnMgPSBjb3B5RXh0ZXJuYWxWYXJpYXRpb25zOwotCQkJCQkJCWNtZC5ndWlkTGlzdCA9IG5ldyBMaW5rZWRMaXN0PFN0cmluZz4oQWN0aXZpdHlEZWVwQ29weUNvbW1hbmQudGhpcy5ndWlkTGlzdCk7Ci0JCQkJCQkJY21kLmd1aWRMaXN0LmFkZEFsbChQcm9jZXNzVXRpbC5nZXRHdWlkTGlzdChBY3Rpdml0eURlZXBDb3B5Q29tbWFuZC50aGlzLmFjdGl2aXR5LCBhY3Rpdml0eSkpOwotCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCWNtZC5leGVjdXRlKCk7Ci0KLQkJCQkJCQkJYmFzZUNvcHkgPSAoQWN0aXZpdHkpIGhlbHBlci5nZXQoYmFzZSk7Ci0JCQkJCQkJCWlmKGFjdGl2aXR5LmdldFZhcmlhYmlsaXR5VHlwZSgpID09IFZhcmlhYmlsaXR5VHlwZS5FWFRFTkRTKSB7Ci0JCQkJCQkJCQkvLyBrZWVwIGFjdGl2aXR5IG9ubHkgYXMgYmFja3VwIGNvcHkgb2YgYmFzZQotCQkJCQkJCQkJLy8KLQkJCQkJCQkJCWhlbHBlci5yZW1vdmVWYXJpYWJpbGl0eUVsZW1lbnQoYmFzZSk7Ci0JCQkJCQkJCQloZWxwZXIucHV0QmFja3VwQ29weShiYXNlLCBhY3Rpdml0eSk7Ci0KLQkJCQkJCQkJCS8vIHB1dCBiYWNrIG9sZEJhc2VDb3B5Ci0JCQkJCQkJCQlpZihvbGRCYXNlQ29weSAhPSBudWxsKSB7Ci0JCQkJCQkJCQkJaGVscGVyLmJhc2ljUHV0KGJhc2UsIG9sZEJhc2VDb3B5KTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCi0JCQkJCQkJCS8vIHJlbW92ZSB0aGUgY29waWVzIG9mIGFsbCBiYXNlIHNpbmNlIGJhc2UgY29waWVzIGFyZSBub3QgYWRkZWQgdG8gdGhlIHByb2Nlc3MKLQkJCQkJCQkJLy8KLQkJCQkJCQkJaGVscGVyLnJlbW92ZShiYXNlKTsKLQkJCQkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gY2hpbGRCYXNlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJCQkJCUVPYmplY3QgY2hpbGRCYXNlQ29weSA9IChFT2JqZWN0KSBoZWxwZXIucmVtb3ZlKGl0ZXIubmV4dCgpKTsKLQkJCQkJCQkJCWlmKGNoaWxkQmFzZUNvcHkgIT0gbnVsbCkgewotCQkJCQkJCQkJCWNoaWxkQmFzZUNvcGllcy5hZGQoY2hpbGRCYXNlQ29weSk7Ci0JCQkJCQkJCQkJRWNvcmVVdGlsLnJlbW92ZShjaGlsZEJhc2VDb3B5LmVDb250YWluZXIoKSk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQotCQkJCQkJCQlBY3Rpdml0eSBhY3Rpdml0eUNvcHkgPSAoQWN0aXZpdHkpIGNvcHk7Ci0KLQkJCQkJCQkJLy8gcmVtb3ZlIHRoZSBjb3BpZXMgb2YgYmFzZSBkaWFncmFtIGlmIHRoZSBhY3Rpdml0eSBhbHJlYWR5IGhhdmUgZGlhZ3JhbSBvZiB0aGUgc2FtZSB0eXBlCi0JCQkJCQkJCS8vCi0JCQkJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZGlhZ3JhbVR5cGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQkJCQlpbnQgdHlwZSA9IGRpYWdyYW1UeXBlc1tpXTsKLQkJCQkJCQkJCWlmKGRpYWdyYW1NZ3IuZ2V0RGlhZ3JhbShhY3Rpdml0eSwgdHlwZSkgIT0gbnVsbCkgewotCQkJCQkJCQkJCURpYWdyYW0gZGlhZ3JhbSA9IGRpYWdyYW1NZ3IuZ2V0RGlhZ3JhbShhY3Rpdml0eUNvcHksIHR5cGUpOwotCQkJCQkJCQkJCWlmKGRpYWdyYW0gIT0gbnVsbCkgewotCQkJCQkJCQkJCQlFY29yZVV0aWwucmVtb3ZlKGRpYWdyYW0pOwotCQkJCQkJCQkJCX0KLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCi0JCQkJCQkJCS8vIG1vdmUgY29udGVudCBvZiBiYXNlIHBhY2thZ2Ugb3ZlciB0byB0aGUgYWN0aXZpdHkncyBwYWNrYWdlCi0JCQkJCQkJCS8vCi0JCQkJCQkJCW1vdmVDb250ZW50KGNtZC5wa2dDb3B5LCBhY3Rpdml0eUNvcHkpOwkKLQotCQkJCQkJCQkvLyByZWNvcmQgdGhlIGNvcHkgb2YgdGhlIHdyYXBwZXJzCi0JCQkJCQkJCS8vCi0JCQkJCQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBiYXNlQ29weS5nZXRCcmVha2Rvd25FbGVtZW50cygpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yCi0JCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJCQlCcmVha2Rvd25FbGVtZW50IGUgPSAoQnJlYWtkb3duRWxlbWVudCkgaXRlcmF0b3IubmV4dCgpOwotCQkJCQkJCQkJaWYoIWNoaWxkQmFzZUNvcGllcy5jb250YWlucyhlKSkgewotCQkJCQkJCQkJCUJyZWFrZG93bkVsZW1lbnQgb3JpZ2luYWwgPSAoQnJlYWtkb3duRWxlbWVudCkgaGVscGVyLmdldE9yaWdpbmFsKGUpOwotCQkJCQkJCQkJCUxpc3Q8U3RyaW5nPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KGNtZC5ndWlkTGlzdCk7Ci0JCQkJCQkJCQkJbGlzdC5hZGQob3JpZ2luYWwuZ2V0R3VpZCgpKTsKLQkJCQkJCQkJCQloZWxwZXIucHV0V3JhcHBlckNvcHkoUHJvY2Vzc1V0aWwudG9HdWlkUGF0aChsaXN0KSwgZSk7CQkJCQkJCQkKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCQlmaW5hbGx5IHsKLQkJCQkJCQkJY21kLmRpc3Bvc2UoKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQlzdXBlci5jb3B5UmVmZXJlbmNlcygpOwotCi0JCQkJaWYoYmFzZSAhPSBudWxsKSB7Ci0JCQkJCUFjdGl2aXR5IGFjdGl2aXR5ID0gKEFjdGl2aXR5KSBvd25lcjsKLQkJCQkJQWN0aXZpdHkgYWN0aXZpdHlDb3B5ID0gKChBY3Rpdml0eSkgY29weSk7CQkJCQkKLQkJCQkJCi0JCQkJCWlmKGJhc2VBY2NlcHRlZCkgewotCQkJCQkJLy8gY29weSBpbmhlcml0ZWQgYnJlYWtkb3duIGVsZW1lbnRzIGZyb20gdGhlIGJhc2UgYWN0aXZpdHkgaW4gdGhlIHJpZ2h0IG9yZGVyCi0JCQkJCQkvLwotCQkJCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjdXJyZW50Q29uZmlnID0gY29uZmlnU2V0dGVyLmdldE9sZENvbmZpZ3VyYXRpb24oKTsKLQotCQkJCQkJLy8gQWRkIGJyZWFrZG93biBlbGVtZW50cyBmcm9tIGJhc2UgY29weSB0byB0aGUgYWN0aXZpdHkgY29weS4gCi0JCQkJCQkvLyBEb24ndCBhZGQgY29weSBvZiBiYXNlIGVsZW1lbnQgb2YgdGhlIGV4aXN0aW5nIGNoaWxkcmVuCi0JCQkJCQkvLwotCQkJCQkJTGlzdDxCcmVha2Rvd25FbGVtZW50PiBicmVha2Rvd25FbGVtZW50cyA9IG5ldyBBcnJheUxpc3Q8QnJlYWtkb3duRWxlbWVudD4oKTsKLQkJCQkJCWZvciAoSXRlcmF0b3I8QnJlYWtkb3duRWxlbWVudD4gaXRlciA9IGJhc2VDb3B5LmdldEJyZWFrZG93bkVsZW1lbnRzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJQnJlYWtkb3duRWxlbWVudCBlID0gaXRlci5uZXh0KCk7Ci0JCQkJCQkJaWYoIWNoaWxkQmFzZUNvcGllcy5jb250YWlucyhlKSAmJiAoY29uZmlndXJhdG9yID09IG51bGwgfHwgY29uZmlndXJhdG9yLmFjY2VwdChlKSkpIHsKLQkJCQkJCQkJYnJlYWtkb3duRWxlbWVudHMuYWRkKGUpOwotCQkJCQkJCX0JCQkJCQkKLQkJCQkJCX0KLQkJCQkJCWFjdGl2aXR5Q29weS5nZXRCcmVha2Rvd25FbGVtZW50cygpLmFkZEFsbCgwLCBicmVha2Rvd25FbGVtZW50cyk7Ci0JCQkJCQliYXNlQ29weS5zZXRTdXBlckFjdGl2aXRpZXMobnVsbCk7Ci0JCQkJCQlFY29yZVV0aWwucmVtb3ZlKGJhc2VDb3B5KTsKLQotCi0JCQkJCQkvLyBjb3B5IG90aGVyIHN0cmluZyBhdHRyaWJ1dGVzIGFzIHdlbGwgYWZ0ZXIgcmVhbGl6ZSB0aGVtCi0JCQkJCQkvLwotCQkJCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb3B5Q29uZmlnID0gY29uZmlnID09IG51bGwgPyAoY3VycmVudENvbmZpZyAhPSBudWxsID8gY3VycmVudENvbmZpZwotCQkJCQkJCQk6IHRhcmdldFByb2Nlc3MuZ2V0RGVmYXVsdENvbnRleHQoKSkKLQkJCQkJCQkJOiBjb25maWc7Ci0JCQkJCQlmb3IgKEVBdHRyaWJ1dGUgYXR0cmlidXRlIDogZ2V0QXR0cmlidXRlc1RvQ29weSgpKSB7Ci0JCQkJCQkJaWYgKGF0dHJpYnV0ZS5pc0NoYW5nZWFibGUoKSAmJiAhYXR0cmlidXRlLmlzRGVyaXZlZCgpKSB7Ci0JCQkJCQkJCU9iamVjdCB2YWx1ZSA9IFByb3ZpZGVycy5nZXRDb25maWd1cmF0aW9uQXBwbGljYXRvcigpLmdldEF0dHJpYnV0ZShhY3Rpdml0eSwgYXR0cmlidXRlLCBjb3B5Q29uZmlnKTsKLQkJCQkJCQkJYWN0aXZpdHlDb3B5LmVTZXQoYXR0cmlidXRlLCB2YWx1ZSk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJQ29udGVudERlc2NyaXB0aW9uIGNvbnRlbnQgPSBhY3Rpdml0eS5nZXRQcmVzZW50YXRpb24oKTsKLQkJCQkJCWZvciAoRUF0dHJpYnV0ZSBhdHRyaWJ1dGUgOiBjb250ZW50LmVDbGFzcygpLmdldEVBbGxBdHRyaWJ1dGVzKCkpIHsKLQkJCQkJCQlpZiAoYXR0cmlidXRlLmlzQ2hhbmdlYWJsZSgpICYmICFhdHRyaWJ1dGUuaXNEZXJpdmVkKCkKLQkJCQkJCQkJCSYmIGF0dHJpYnV0ZS5nZXRFQXR0cmlidXRlVHlwZSgpLmdldEluc3RhbmNlQ2xhc3MoKSA9PSBMaXRlcmFscy5TVFJJTkcuZ2V0SW5zdGFuY2VDbGFzcygpKQotCQkJCQkJCXsKLQkJCQkJCQkJT2JqZWN0IHZhbHVlID0gUHJvdmlkZXJzLmdldENvbmZpZ3VyYXRpb25BcHBsaWNhdG9yKCkuZ2V0QXR0cmlidXRlKGNvbnRlbnQsIGFjdGl2aXR5LCBhdHRyaWJ1dGUsIGNvcHlDb25maWcpOwotCQkJCQkJCQlhY3Rpdml0eUNvcHkuZ2V0UHJlc2VudGF0aW9uKCkuZVNldChhdHRyaWJ1dGUsIHZhbHVlKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQotCQkJCQkvLyBjb3B5IHByZXNlbnRhdGlvbiBuYW1lCi0JCQkJCS8vCi0JCQkJCWFjdGl2aXR5Q29weS5zZXRQcmVzZW50YXRpb25OYW1lKFByb2Nlc3NVdGlsLmdldFByZXNlbnRhdGlvbk5hbWUoYWN0aXZpdHkpKTsJCQkJCQotCQkJCX0KLQkJCQkKLQkJCQkvLyBjb3B5IGNvbnRyaWJ1dG9ycwkJCQkKLQkJCQlpZiAoY29weUV4dGVybmFsVmFyaWF0aW9ucyAmJiBvd25lciBpbnN0YW5jZW9mIEFjdGl2aXR5ICYmIChjb3B5Q29udHJpYnV0b3JzIHx8IG93bmVyICE9IEFjdGl2aXR5RGVlcENvcHlDb21tYW5kLnRoaXMuYWN0aXZpdHkpKSB7Ci0JCQkJCUFjdGl2aXR5IGFjdGl2aXR5ID0gKEFjdGl2aXR5KW93bmVyOwkJCQkJCi0JCQkJCUxpc3QgY29udHJpYnV0b3JzID0gZ2V0Q29udHJpYnV0b3JzKGFjdGl2aXR5KTsKLQkJCQkJaWYgKCFjb250cmlidXRvcnMuaXNFbXB0eSgpKSB7Ci0JCQkJCQlkb0NvcHlDb250cmlidXRvcnMoY29udHJpYnV0b3JzLGFjdGl2aXR5KTsKLQkJCQkJfQotCQkJCX0KLQkJCQkKLQkJCQkvLyBjbGVhciB0aGUgdmFyaWFiaWxpdHkgZGF0YQotCQkJCS8vCi0JCQkJaWYgKGNvcHkgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCQlBY3Rpdml0eSBhY3Rpdml0eUNvcHkgPSAoKEFjdGl2aXR5KSBjb3B5KTsKLQkJCQkJYWN0aXZpdHlDb3B5LnNldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQobnVsbCk7Ci0JCQkJCWFjdGl2aXR5Q29weS5zZXRWYXJpYWJpbGl0eVR5cGUobnVsbCk7Ci0JCQkJfQotCQkJfQotCQkJZmluYWxseSB7Ci0JCQkJaWYoY29uZmlnU2V0dGVyICE9IG51bGwpIHsKLQkJCQkJY29uZmlnU2V0dGVyLnJlc3RvcmUoKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmKGNvcHkgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCUFjdGl2aXR5IGFjdGl2aXR5Q29weSA9ICgoQWN0aXZpdHkpIGNvcHkpOwkJCQkJCi0KLQkJCQkvLyBjbGVhciBzdXBwcmVzc2lvbiBkYXRhCi0JCQkJLy8KLQkJCQlDb25zdHJhaW50IHJ1bGUgPSBDb25zdHJhaW50TWFuYWdlci5nZXRDb25zdHJhaW50KGFjdGl2aXR5Q29weSwgQ29uc3RyYWludE1hbmFnZXIuUFJPQ0VTU19TVVBQUkVTU0lPTiwgZmFsc2UpOwotCQkJCWlmKHJ1bGUgIT0gbnVsbCkgewotCQkJCQlFY29yZVV0aWwucmVtb3ZlKHJ1bGUpOwotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQkJCi0JCS8qKgotCQkgKiBDb3B5IGNvbnRyaWJ1dG9ycwotCQkgKiBAcGFyYW0gY29udHJpYnV0b3JzCi0JCSAqLwotCQlwcm90ZWN0ZWQgdm9pZCBkb0NvcHlDb250cmlidXRvcnMoTGlzdCBjb250cmlidXRvcnMsIEFjdGl2aXR5IG93bmVyICkgewotCQkJQ29uZmlndXJhdGlvblNldHRlciBjb25maWdTZXR0ZXIgPSBuZXcgQ29uZmlndXJhdGlvblNldHRlcihnZXRBZGFwdGVyRmFjdG9yeSgpKTsKLQkJCXRyeSB7Ci0JCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjdXJyZW50Q29uZmlnID0gY29uZmlnU2V0dGVyLmdldE9sZENvbmZpZ3VyYXRpb24oKTsKLQkJCQlNZXRob2RDb25maWd1cmF0aW9uIGNvcHlDb25maWcgPSBjb25maWcgPT0gbnVsbCA/IChjdXJyZW50Q29uZmlnICE9IG51bGwgPyBjdXJyZW50Q29uZmlnCi0JCQkJCQk6IHRhcmdldFByb2Nlc3MuZ2V0RGVmYXVsdENvbnRleHQoKSkKLQkJCQkJCTogY29uZmlnOwotCQkJCWNvbmZpZ1NldHRlci5zZXQoY29weUNvbmZpZyk7Ci0JCQkJSUNvbmZpZ3VyYXRvciBjb25maWd1cmF0b3IgPSBjb25maWdTZXR0ZXIuZ2V0Q29uZmlndXJhdG9yKCk7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGNvbnRyaWJ1dG9ycy5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJCUFjdGl2aXR5IGNvbnRyaWJ1dGVkQWN0aXZpdHkgPSAoQWN0aXZpdHkpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJQ29weUhlbHBlciBoZWxwZXIgPSAoQ29weUhlbHBlciljb3B5SGVscGVyOwotCQkJCQlBY3Rpdml0eSBjb250cmlidXRvckNvcHkgPSAoQWN0aXZpdHkpIGhlbHBlci5nZXQoY29udHJpYnV0ZWRBY3Rpdml0eSk7Ci0JCQkJCUFjdGl2aXR5RGVlcENvcHlDb21tYW5kIGNtZCA9IG5ldyBBY3Rpdml0eURlZXBDb3B5Q29tbWFuZChjb250cmlidXRlZEFjdGl2aXR5LCBoZWxwZXIsIAotCQkJCQkJCWNvbmZpZywgdGFyZ2V0UHJvY2VzcywgbW9uaXRvciwgZmFsc2UsYWN0aXZpdHlEZWVwQ29weUNvbmZpZ3VyYXRvcik7Ci0JCQkJCWNtZC5jb3B5Q29udHJpYnV0b3JzID0gZmFsc2U7IC8vIGRvbid0IGNvcHkgY29udHJpYnV0b3IncyBjb250cmlidXRvcnMgc2luY2UgdGhleSBhbHJlYWR5IGFyZSBpbmNsdWRlZCBpbiB0aGUgZ2l2ZW4gY29udHJpYnV0b3JzIGxpc3QKLQkJCQkJY21kLmd1aWRMaXN0ID0gbmV3IExpbmtlZExpc3Q8U3RyaW5nPihBY3Rpdml0eURlZXBDb3B5Q29tbWFuZC50aGlzLmd1aWRMaXN0KTsKLQkJCQkJY21kLmd1aWRMaXN0LmFkZEFsbChQcm9jZXNzVXRpbC5nZXRHdWlkTGlzdChBY3Rpdml0eURlZXBDb3B5Q29tbWFuZC50aGlzLmFjdGl2aXR5LCBvd25lcikpOwotCQkJCQl0cnkgewotCQkJCQkJY21kLmV4ZWN1dGUoKTsKLQotCQkJCQkJY29udHJpYnV0b3JDb3B5ID0gKEFjdGl2aXR5KSBoZWxwZXIuZ2V0KGNvbnRyaWJ1dGVkQWN0aXZpdHkpOwotCi0JCQkJCQlBY3Rpdml0eSBhY3Rpdml0eUNvcHkgPSAoQWN0aXZpdHkpIGNvcHk7Ci0KLQkJCQkJCS8vIHJlbW92ZSB0aGUgY29waWVzIG9mIGJhc2UgZGlhZ3JhbSBpZiB0aGUgYWN0aXZpdHkgYWxyZWFkeSBoYXZlIGRpYWdyYW0gb2YgdGhlIHNhbWUgdHlwZQotCQkJCQkJLy8KLQkJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZGlhZ3JhbVR5cGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQkJaW50IHR5cGUgPSBkaWFncmFtVHlwZXNbaV07Ci0JCQkJCQkJaWYoZGlhZ3JhbU1nci5nZXREaWFncmFtKGFjdGl2aXR5LCB0eXBlKSAhPSBudWxsKSB7Ci0JCQkJCQkJCURpYWdyYW0gZGlhZ3JhbSA9IGRpYWdyYW1NZ3IuZ2V0RGlhZ3JhbShhY3Rpdml0eUNvcHksIHR5cGUpOwotCQkJCQkJCQlpZihkaWFncmFtICE9IG51bGwpIHsKLQkJCQkJCQkJCUVjb3JlVXRpbC5yZW1vdmUoZGlhZ3JhbSk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0KLQkJCQkJCS8vIG1vdmUgY29udGVudCBvZiBiYXNlIHBhY2thZ2Ugb3ZlciB0byB0aGUgYWN0aXZpdHkncyBwYWNrYWdlCi0JCQkJCQkvLwotCQkJCQkJbW92ZUNvbnRlbnQoY21kLnBrZ0NvcHksIGFjdGl2aXR5Q29weSk7CQotCi0JCQkJCQlMaXN0PEJyZWFrZG93bkVsZW1lbnQ+IGJyZWFrZG93bkVsZW1lbnRzID0gbmV3IEFycmF5TGlzdDxCcmVha2Rvd25FbGVtZW50PigpOwotCQkJCQkJZm9yIChJdGVyYXRvcjxCcmVha2Rvd25FbGVtZW50PiBpdGVyID0gY29udHJpYnV0b3JDb3B5LmdldEJyZWFrZG93bkVsZW1lbnRzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJQnJlYWtkb3duRWxlbWVudCBlID0gaXRlci5uZXh0KCk7Ci0JCQkJCQkJaWYoY29uZmlndXJhdG9yID09IG51bGwgfHwgY29uZmlndXJhdG9yLmFjY2VwdChlKSl7Ci0JCQkJCQkJCWJyZWFrZG93bkVsZW1lbnRzLmFkZChlKTsKLQkJCQkJCQl9CQkJCQkJCi0JCQkJCQl9Ci0JCQkJCQlhY3Rpdml0eUNvcHkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5hZGRBbGwoYnJlYWtkb3duRWxlbWVudHMpOwotCQkJCQkJY29udHJpYnV0b3JDb3B5LnNldFN1cGVyQWN0aXZpdGllcyhudWxsKTsKLQkJCQkJCUVjb3JlVXRpbC5yZW1vdmUoY29udHJpYnV0b3JDb3B5KTsKLQotCQkJCQl9Ci0JCQkJCWZpbmFsbHkgewotCQkJCQkJY21kLmRpc3Bvc2UoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX1maW5hbGx5ewotCQkJCWlmIChjb25maWdTZXR0ZXIgIT0gbnVsbCApIHsKLQkJCQkJY29uZmlnU2V0dGVyLnJlc3RvcmUoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgUHJvY2Vzc1BhY2thZ2UgcGtnQ29weTsKLQlwcm90ZWN0ZWQgTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWc7Ci0JcHJvdGVjdGVkIElEaWFncmFtTWFuYWdlciBkaWFncmFtTWdyOwotCi0JcHJvdGVjdGVkIFByb2Nlc3MgdGFyZ2V0UHJvY2VzczsKLQotCXByb3RlY3RlZCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3I7Ci0KLQlwcm90ZWN0ZWQgQWN0aXZpdHkgYWN0aXZpdHk7Ci0KLQlwcml2YXRlIExpbmtlZExpc3Q8U3RyaW5nPiBndWlkTGlzdDsKLQotCXByaXZhdGUgQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIgd3JhcHBlcjsKLQkKLQkvL3VzZWQgdG8gcmV0cmlldmUgcmVwbGFjZXJzIGFuZCBjb250cmlidXRvcnMKLQlwcml2YXRlIElDb25maWd1cmF0b3IgYWN0aXZpdHlEZWVwQ29weUNvbmZpZ3VyYXRvcjsKLQkKLQlwcml2YXRlIGJvb2xlYW4gY29weUV4dGVybmFsVmFyaWF0aW9ucyA9IHRydWU7Ci0JCi0JcHJpdmF0ZSBib29sZWFuIGNvcHlDb250cmlidXRvcnMgPSB0cnVlOwotCQotCXByaXZhdGUgQWN0aXZpdHlEZWVwQ29weUNvbW1hbmQoQWN0aXZpdHkgYWN0aXZpdHksIENvcHlIZWxwZXIgY29weUhlbHBlciwKLQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnLCBQcm9jZXNzIHRhcmdldFByb2Nlc3MsCi0JCQlJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIGJvb2xlYW4gaW5pdEd1aWRMaXN0LElDb25maWd1cmF0b3IgYWN0aXZpdHlEZWVwQ29weUNvbmZpZ3VyYXRvcikgewotCQlzdXBlcihudWxsLCBhY3Rpdml0eS5lQ29udGFpbmVyKCksIGNvcHlIZWxwZXIpOwotCQlBc3NlcnQuaXNUcnVlKGFjdGl2aXR5LmVDb250YWluZXIoKSBpbnN0YW5jZW9mIFByb2Nlc3NQYWNrYWdlLCAiQWN0aXZpdHkncyBjb250YWluZXIgbXVzdCBiZSBhIFByb2Nlc3NQYWNrYWdlIik7IC8vJE5PTi1OTFMtMSQKLQkJdGhpcy5hY3Rpdml0eSA9IGFjdGl2aXR5OwotCQlkb21haW4gPSBuZXcgRWRpdGluZ0RvbWFpbigpOwotCQl0aGlzLmNvbmZpZyA9IGNvbmZpZzsKLQkJdGhpcy50YXJnZXRQcm9jZXNzID0gdGFyZ2V0UHJvY2VzczsKLQkJZGlhZ3JhbU1nciA9IEV4dGVuc2lvbk1hbmFnZXIuZ2V0RGlhZ3JhbU1hbmFnZXIoKTsKLQkJQXNzZXJ0LmlzTm90TnVsbChkaWFncmFtTWdyLCAiQ291bGQgbm90IGxvYWQgZGlhZ3JhbSBtYW5hZ2VyIik7IC8vJE5PTi1OTFMtMSQKLQkJdGhpcy5tb25pdG9yID0gbW9uaXRvcjsKLQkJaWYoaW5pdEd1aWRMaXN0KSB7Ci0JCQlndWlkTGlzdCA9IFByb2Nlc3NVdGlsLmdldEd1aWRMaXN0KG51bGwsIHRoaXMuYWN0aXZpdHkpOwotCQl9Ci0JCXRoaXMuYWN0aXZpdHlEZWVwQ29weUNvbmZpZ3VyYXRvciA9IGFjdGl2aXR5RGVlcENvcHlDb25maWd1cmF0b3I7Ci0JfQotCQotCXB1YmxpYyBBY3Rpdml0eURlZXBDb3B5Q29tbWFuZChBY3Rpdml0eSBhY3Rpdml0eSwgQ29weUhlbHBlciBjb3B5SGVscGVyLAotCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcsIFByb2Nlc3MgdGFyZ2V0UHJvY2VzcywKLQkJCUlQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUNvbmZpZ3VyYXRvciBhY3Rpdml0eURlZXBDb3B5Q29uZmlndXJhdG9yKSB7Ci0JCXRoaXMoYWN0aXZpdHksIGNvcHlIZWxwZXIsIGNvbmZpZywgdGFyZ2V0UHJvY2VzcywgbW9uaXRvciwgdHJ1ZSxhY3Rpdml0eURlZXBDb3B5Q29uZmlndXJhdG9yKTsJCQotCX0KLQkKLQlwdWJsaWMgQWN0aXZpdHlEZWVwQ29weUNvbW1hbmQoT2JqZWN0IGFjdGl2aXR5T3JXcmFwcGVyLCBDb3B5SGVscGVyIGNvcHlIZWxwZXIsIE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnLAotCQkJUHJvY2VzcyB0YXJnZXRQcm9jZXNzLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElDb25maWd1cmF0b3IgYWN0aXZpdHlEZWVwQ29weUNvbmZpZ3VyYXRvcikgewotCQl0aGlzKChBY3Rpdml0eSlUbmdVdGlsLnVud3JhcChhY3Rpdml0eU9yV3JhcHBlciksIGNvcHlIZWxwZXIsIGNvbmZpZywgdGFyZ2V0UHJvY2VzcywgbW9uaXRvciwgCi0JCQkJYWN0aXZpdHlPcldyYXBwZXIgaW5zdGFuY2VvZiBBY3Rpdml0eSxhY3Rpdml0eURlZXBDb3B5Q29uZmlndXJhdG9yKTsKLQkJaWYoYWN0aXZpdHlPcldyYXBwZXIgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgewotCQkJd3JhcHBlciA9IChCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgYWN0aXZpdHlPcldyYXBwZXI7Ci0JCQlndWlkTGlzdCA9IFByb2Nlc3NVdGlsLmdldEd1aWRMaXN0KHdyYXBwZXIpOwotCQl9Ci0JfQkKLQkKLQlwdWJsaWMgdm9pZCBzZXRDb3B5RXh0ZXJuYWxWYXJpYXRpb25zKGJvb2xlYW4gY29weUV4dGVybmFsVmFyaWF0aW9ucykgewotCQl0aGlzLmNvcHlFeHRlcm5hbFZhcmlhdGlvbnMgPSBjb3B5RXh0ZXJuYWxWYXJpYXRpb25zOwotCX0KLQkKLQlwdWJsaWMgQWRhcHRlckZhY3RvcnkgZ2V0QWRhcHRlckZhY3RvcnkoKSB7Ci0JCXJldHVybiAoKEFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbilkb21haW4pLmdldEFkYXB0ZXJGYWN0b3J5KCk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29weUNvbW1hbmQjZXhlY3V0ZSgpCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJbW9uaXRvci5zdWJUYXNrKE5MUy5iaW5kKExpYnJhcnlFZGl0UmVzb3VyY2VzLmNvcHlpbmdBY3Rpdml0aWVzX21zZywgUHJvY2Vzc1V0aWwuZ2V0UHJlc2VudGF0aW9uTmFtZShhY3Rpdml0eSkpKTsKLQkJc3VwZXIuZXhlY3V0ZSgpOwotCQlDb2xsZWN0aW9uPD8+IHJlc3VsdCA9IHN1cGVyLmdldFJlc3VsdCgpOwotCQlpZighcmVzdWx0LmlzRW1wdHkoKSkgewotCQkJcGtnQ29weSA9IChQcm9jZXNzUGFja2FnZSkgcmVzdWx0Lml0ZXJhdG9yKCkubmV4dCgpOwotCQkJZml4UHJvY2Vzc0NvbXBvbmVudCgpOwotCQkJcmVwbGFjZVRleHRSZWZlcmVuY2VzKCk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogZml4IHRoZSBwcm9jZXNzIGNvbXBvbmVudCB0byBtYWtlIGl0IGEgcHJvY2VzcyBwYWNrYWdlLgotCSAqIFRoaXMgbWV0aG9kIG1pZ2h0IGJlIG92ZXJyaWRlbiBieSBzdWJjbGFzcyB0byBhY2hpdmUgZGlmZmVyZW5jZSByZXN1bHQuCi0JICogRm9yIGV4YW1wbGUsIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZpeFByb2Nlc3NDb21wb25lbnQoKSB7Ci0JCWlmKHBrZ0NvcHkgaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50KSB7Ci0JCQkvLyByZXBsYWNlIHRoZSBQcm9jZXNzQ29tcG9uZW50IHdpdGggYSBlcXVpdmFsZW50IFByb2Nlc3NQYWNrYWdlCi0JCQkvLwotCQkJUHJvY2Vzc1BhY2thZ2UgcGtnID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUHJvY2Vzc1BhY2thZ2UoKTsKLQkJCUNvbGxlY3Rpb24gZmVhdHVyZXMgPSBuZXcgQXJyYXlMaXN0KHBrZ0NvcHkuZUNsYXNzKCkuZ2V0RUFsbFN0cnVjdHVyYWxGZWF0dXJlcygpKTsKLQkJCWZlYXR1cmVzLnJldGFpbkFsbChwa2cuZUNsYXNzKCkuZ2V0RUFsbFN0cnVjdHVyYWxGZWF0dXJlcygpKTsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGZlYXR1cmVzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgaXRlci5uZXh0KCk7Ci0JCQkJT2JqZWN0IHZhbHVlID0gcGtnQ29weS5lR2V0KGZlYXR1cmUpOwotCQkJCXBrZy5lU2V0KGZlYXR1cmUsIHZhbHVlKTsKLQkJCX0KLQkJCVByb2Nlc3MgcHJvYyA9ICgoUHJvY2Vzc0NvbXBvbmVudClwa2dDb3B5KS5nZXRQcm9jZXNzKCk7Ci0JCQlpZihwcm9jICE9IG51bGwpIHsKLQkJCQlwa2cuZ2V0UHJvY2Vzc0VsZW1lbnRzKCkuYWRkKDAsIHByb2MpOwotCQkJfQotCQkJcGtnQ29weSA9IHBrZzsKLQkJfQkJCi0JfQotCQotCS8qKgotCSAqIElmIHRleHR1YWwgZGVzY3JpcHRpb25zIGluIHRoZSBjb3BpZWQgZWxlbWVudHMgY29udGFpbiByZWZlcmVuY2VzIChVUkxzKSB0byBvdGhlciBlbGVtZW50cyAKLQkgKiB3aXRoaW4gdGhlIHNhbWUgY29waWVkIHByb2Nlc3MgdGhlbiByZXBsYWNlIHRoZXNlIHJlZmVyZW5jZXMgd2l0aCByZWZlcmVuY2VzIHRoYXQgcG9pbnQgdG8gCi0JICogdGhlIG5ldyBlbGVtZW50cyBpbiB0aGUgY29waWVkIHN0cnVjdHVyZXMuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVwbGFjZVRleHRSZWZlcmVuY2VzKCkgewotCQlJVGV4dFJlZmVyZW5jZVJlcGxhY2VyIHR4dFJlZlJlcGxhY2VyID0gRXh0ZW5zaW9uTWFuYWdlci5nZXRUZXh0UmVmZXJlbmNlUmVwbGFjZXIoKTsKLQkJaWYodHh0UmVmUmVwbGFjZXIgPT0gbnVsbCkgcmV0dXJuOwotCi0JCU1hcCBvbGRUb05ld09iamVjdE1hcCA9ICgoQ29weUhlbHBlcikgY29weUhlbHBlcikuZ2V0T2JqZWN0VG9Db3B5TWFwKCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHBrZ0NvcHkuZUFsbENvbnRlbnRzKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJRU9iamVjdCBlbGVtZW50ID0gKEVPYmplY3QpIGl0ZXIubmV4dCgpOwotCQkJZm9yIChJdGVyYXRvciBhdHRyaWJ1dGVzID0gZWxlbWVudC5lQ2xhc3MoKS5nZXRFQWxsQXR0cmlidXRlcygpLml0ZXJhdG9yKCk7IGF0dHJpYnV0ZXMuaGFzTmV4dCgpOyApCi0JCQl7Ci0JCQkJRUF0dHJpYnV0ZSBhdHRyaWJ1dGUgPSAoRUF0dHJpYnV0ZSkgYXR0cmlidXRlcy5uZXh0KCk7Ci0JCQkJaWYgKGF0dHJpYnV0ZS5pc0NoYW5nZWFibGUoKSAmJiAhYXR0cmlidXRlLmlzRGVyaXZlZCgpICYmIChhdHRyaWJ1dGUuaXNNYW55KCkgfHwgZWxlbWVudC5lSXNTZXQoYXR0cmlidXRlKSkKLQkJCQkJCSYmIGF0dHJpYnV0ZS5nZXRFQXR0cmlidXRlVHlwZSgpLmdldEluc3RhbmNlQ2xhc3MoKSA9PSBMaXRlcmFscy5TVFJJTkcuZ2V0SW5zdGFuY2VDbGFzcygpKQotCQkJCXsKLQkJCQkJU3RyaW5nIHRleHQgPSAoU3RyaW5nKSBlbGVtZW50LmVHZXQoYXR0cmlidXRlKTsKLQkJCQkJaWYodGV4dCAhPSBudWxsKSB7Ci0JCQkJCQl0ZXh0ID0gdHh0UmVmUmVwbGFjZXIucmVwbGFjZSh0ZXh0LCB0YXJnZXRQcm9jZXNzLCBvbGRUb05ld09iamVjdE1hcCk7Ci0JCQkJCQllbGVtZW50LmVTZXQoYXR0cmlidXRlLCB0ZXh0KTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tcG91bmRDb21tYW5kI2dldFJlc3VsdCgpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb248Pz4gZ2V0UmVzdWx0KCkgewotCQlpZihwa2dDb3B5ICE9IG51bGwpIHsKLQkJCUFjdGl2aXR5IGFjdCA9IFByb2Nlc3NVdGlsLmZpbmRBY3Rpdml0eShwa2dDb3B5KTsKLQkJCWlmKGFjdCAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QoYWN0KTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQl9Ci0JCi0JLyoqCi0JICogTW92ZXMgY29udGVudCBvZiBzb3VyY2Ugb2JqZWN0IDxjb2RlPnNyYzwvY29kZT4gb3ZlciB0byB0aGUgdGFyZ2V0IG9iamVjIDxjb2RlPnRhcmdldDwvY29kZT4KLQkgKiBAcGFyYW0gc3JjCi0JICogQHBhcmFtIHRhcmdldAotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgbW92ZUNvbnRlbnQoUHJvY2Vzc1BhY2thZ2Ugc3JjLCBBY3Rpdml0eSBhY3QpIHsKLQkJUHJvY2Vzc1BhY2thZ2UgdGFyZ2V0ID0gKFByb2Nlc3NQYWNrYWdlKSBhY3QuZUNvbnRhaW5lcigpOwotCQkvLyBtb3ZlIGNvbnRlbnQgb2YgYmFzZSBwYWNrYWdlIG92ZXIgdG8gdGhlIGFjdGl2aXR5J3MgcGFja2FnZQkJCQkJCi0JCWZvciAoSXRlcmF0b3IgaXRlciA9IG5ldyBBcnJheUxpc3Qoc3JjLmVDb250ZW50cygpKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCUVPYmplY3QgZSA9IChFT2JqZWN0KSBpdGVyLm5leHQoKTsKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmID0gZS5lQ29udGFpbmluZ0ZlYXR1cmUoKTsJCQkJCQkKLQkJCWlmKGYuaXNNYW55KCkpIHsKLQkJCQkoKExpc3QpdGFyZ2V0LmVHZXQoZikpLmFkZChlKTsKLQkJCX0KLQkJfQotCQlpZihzcmMgaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50KSB7Ci0JCQlQcm9jZXNzIGJhc2VDb3B5ID0gKChQcm9jZXNzQ29tcG9uZW50KXNyYykuZ2V0UHJvY2VzcygpOwotCQkJdGFyZ2V0LmdldFByb2Nlc3NFbGVtZW50cygpLmFkZChiYXNlQ29weSk7Ci0JCX0KLQotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBCcmVha2Rvd25FbGVtZW50IGdldFRvcEVsZW1lbnQoQnJlYWtkb3duRWxlbWVudCBlKSB7Ci0JCWlmKGUgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJQnJlYWtkb3duRWxlbWVudCB0b3AgPSBlOwotCQlmb3IoQnJlYWtkb3duRWxlbWVudCBvID0gZS5nZXRTdXBlckFjdGl2aXRpZXMoKTsgbyAhPSBudWxsOyBvID0gby5nZXRTdXBlckFjdGl2aXRpZXMoKSkgewotCQkJdG9wID0gbzsKLQkJfQotCQlyZXR1cm4gdG9wOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBjb3B5U3VwcHJlc3Npb25TdGF0ZXMoKSB7Ci0JCUNvbGxlY3Rpb248Pz4gcmVzdWx0ID0gZ2V0UmVzdWx0KCk7Ci0JCWlmKHJlc3VsdC5pc0VtcHR5KCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQlTdHJpbmcgd3JhcHBlclBhdGggPSB3cmFwcGVyICE9IG51bGwgPyBQcm9jZXNzVXRpbC50b0d1aWRQYXRoKGd1aWRMaXN0KSA6IG51bGw7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYWRhcHRlckZhY3Rvcmllcy5sZW5ndGg7IGkrKykgewotCQkJQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkgPSBhZGFwdGVyRmFjdG9yaWVzW2ldOwotCQkJYm9vbGVhbiBpc1dCUyA9IGFkYXB0ZXJGYWN0b3J5ID09IFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFLmdldFdCU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCk7Ci0JCQlJRmlsdGVyIGZpbHRlciA9IFByb2Nlc3NVdGlsLmdldEZpbHRlcihhZGFwdGVyRmFjdG9yeSk7Ci0JCQlJQ29uZmlndXJhdG9yIGNvbmZpZ3VyYXRvciA9IG51bGw7Ci0JCQlNZXRob2RDb25maWd1cmF0aW9uIGN1cnJlbnRDb25maWcgPSBudWxsOwotCQkJaWYoZmlsdGVyIGluc3RhbmNlb2YgSUNvbmZpZ3VyYXRvcikgewotCQkJCWNvbmZpZ3VyYXRvciA9IChJQ29uZmlndXJhdG9yKSBmaWx0ZXI7Ci0JCQkJY3VycmVudENvbmZpZyA9IGNvbmZpZ3VyYXRvci5nZXRNZXRob2RDb25maWd1cmF0aW9uKCk7Ci0JCQkJY29uZmlndXJhdG9yLnNldE1ldGhvZENvbmZpZ3VyYXRpb24oY29uZmlnKTsKLQkJCX0KLQkJCXRyeSB7Ci0JCQkJQWN0aXZpdHkgYWN0ID0gUHJvY2Vzc1V0aWwuZmluZEFjdGl2aXR5KChQcm9jZXNzUGFja2FnZSkgb3duZXIpOwotCQkJCVByb2Nlc3NVdGlsLmluaXRpYWxpemVJdGVtUHJvdmlkZXJQYXRoKGFjdCwgYWRhcHRlckZhY3RvcnkpOwotCQkJCVByb2Nlc3MgcHJvYyA9IFRuZ1V0aWwuZ2V0T3duaW5nUHJvY2VzcyhhY3QpOwotCQkJCVN1cHByZXNzaW9uIHN1cHByZXNzaW9uID0gU3VwcHJlc3Npb24uZ2V0U3VwcHJlc3Npb24ocHJvYyk7Ci0JCQkJRGVwdGhMZXZlbEFkYXB0ZXJGYWN0b3J5VHJlZUl0ZXJhdG9yPD8+IGl0ZXIgPSBuZXcgRGVwdGhMZXZlbEFkYXB0ZXJGYWN0b3J5VHJlZUl0ZXJhdG9yPE9iamVjdD4oYWRhcHRlckZhY3RvcnksIHByb2MpOwotCQkJCWludCBkZXB0aExldmVsID0gLTE7Ci0JCQkJZmluZF9kZWVwX2NvcGllZF9hY3Rpdml0eToKLQkJCQkJd2hpbGUoaXRlci5oYXNOZXh0KCkpIHsKLQkJCQkJCU9iamVjdCBjaGlsZCA9IGl0ZXIubmV4dCgpOwotCi0JCQkJCQkvLyBzZXQgZGVwdGggbGV2ZWwgaWYgdGhlIGN1cnJlbnQgY2hpbGQgaXMgdGhlIGRlZXAtY29waWVkIGFjdGl2aXR5Ci0JCQkJCQkvLwotCQkJCQkJaWYod3JhcHBlciA9PSBudWxsKSB7Ci0JCQkJCQkJaWYoY2hpbGQgPT0gYWN0aXZpdHkpIHsKLQkJCQkJCQkJZGVwdGhMZXZlbCA9IGl0ZXIuZ2V0RGVwdGhMZXZlbCgpOwotCQkJCQkJCQlicmVhayBmaW5kX2RlZXBfY29waWVkX2FjdGl2aXR5OwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCWVsc2UgewotCQkJCQkJCWlmKGNoaWxkIGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIHsKLQkJCQkJCQkJU3RyaW5nIHBhdGggPSBTdXBwcmVzc2lvbi5nZXRQYXRoV2l0aG91dFZpZXdUeXBlKChCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgY2hpbGQpLnRvU3RyaW5nKCk7Ci0JCQkJCQkJCWlmKHdyYXBwZXJQYXRoLmVxdWFscyhwYXRoKSkgewotCQkJCQkJCQkJZGVwdGhMZXZlbCA9IGl0ZXIuZ2V0RGVwdGhMZXZlbCgpOwotCQkJCQkJCQkJYnJlYWsgZmluZF9kZWVwX2NvcGllZF9hY3Rpdml0eTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0JCQkJCQotCQkJCQl9Ci0JCQkJCi0JCQkJLy8gY29weSBzdXBwcmVzc2lvbiBzdGF0ZSBvZiBhbGwgc3VwcHJlc3NlZCBlbGVtZW50cyB1bmRlciBkZWVwLWNvcGllZCBhY3Rpdml0eQotCQkJCS8vCi0JCQkJQ29weUhlbHBlciBoZWxwZXIgPSAoQ29weUhlbHBlciljb3B5SGVscGVyOwotCQkJCU1hcDw/LCA/PiBvcmlnaW5hbFRvQ29weU1hcCA9IGhlbHBlci5nZXRPYmplY3RUb0NvcHlNYXAoKTsKLQkJCQlNYXA8T2JqZWN0LCBPYmplY3Q+IGVsZW1lbnRPcldyYXBwZXJUb0NvcHlNYXAgPSBudWxsOwotCQkJCWlmKGlzV0JTKSB7Ci0JCQkJCWVsZW1lbnRPcldyYXBwZXJUb0NvcHlNYXAgPSBuZXcgSGFzaE1hcDxPYmplY3QsIE9iamVjdD4oKTsKLQkJCQkJQWN0aXZpdHkgZGVlcENvcHkgPSAoQWN0aXZpdHkpIHJlc3VsdC5pdGVyYXRvcigpLm5leHQoKTsKLQkJCQkJZWxlbWVudE9yV3JhcHBlclRvQ29weU1hcC5wdXQod3JhcHBlciAhPSBudWxsID8gd3JhcHBlciA6IGFjdGl2aXR5LCBkZWVwQ29weSk7Ci0JCQkJfQotCQkJCXdoaWxlKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQkJCU9iamVjdCBjaGlsZCA9IGl0ZXIubmV4dCgpOwotCQkJCQlpZihpdGVyLmdldERlcHRoTGV2ZWwoKSA+IGRlcHRoTGV2ZWwpIHsKLQkJCQkJCU9iamVjdCBlID0gVG5nVXRpbC51bndyYXAoY2hpbGQpOwotCQkJCQkJaWYoZSBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnQpIHsKLQkJCQkJCQlpZighaXNXQlMgJiYgZSBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJCQkJCS8vIHNraXAgY29weWluZyBzdXBwcmVzc2lvbiBzdGF0ZSBhbmQgb3JkZXJpbmcKLQkJCQkJCQkJLy8gYnJlYWtkb3duIGVsZW1lbnRzIGZvciBhY3Rpdml0eSBpbiBvdGhlciB2aWV3Ci0JCQkJCQkJCS8vIHRoYW4gV0JTCi0JCQkJCQkJCS8vCi0JCQkJCQkJCWNvbnRpbnVlOwotCQkJCQkJCX0KLS8vCQkJCQkJCUJyZWFrZG93bkVsZW1lbnQgb3JpZ2luYWwgPSAoQnJlYWtkb3duRWxlbWVudCkgZTsKLS8vCQkJCQkJCUJyZWFrZG93bkVsZW1lbnQgY29weSA9IChCcmVha2Rvd25FbGVtZW50KSBvcmlnaW5hbFRvQ29weU1hcC5nZXQob3JpZ2luYWwpOwotLy8JCQkJCQkJCi0vLwkJCQkJCQlpZihUbmdVdGlsLkRFQlVHKSB7Ci0vLwkJCQkJCQkJU3RyaW5nIGNvcHlOYW1lID0gKGNvcHkgIT0gbnVsbCA/IGNvcHkuZ2V0TmFtZSgpIDogbnVsbCk7Ci0vLwkJCQkJCQkJQnJlYWtkb3duRWxlbWVudCB0b3AgPSBnZXRUb3BFbGVtZW50KGNvcHkpOwotLy8JCQkJCQkJCWlmKGNvcHkgPT0gbnVsbCB8fCAhb3JpZ2luYWwuZ2V0TmFtZSgpLmVxdWFscyhjb3B5TmFtZSkgfHwgdG9wICE9IGRlZXBDb3B5KSB7Ci0vLwkJCQkJCQkJCVN5c3RlbS5lcnIucHJpbnRsbigib3JpZ2luYWw6ICciICsgb3JpZ2luYWwuZ2V0TmFtZSgpICsgIicsIGNvcHk6ICciICsgY29weU5hbWUgKyAiJywgY29weSdzIHRvcCBhY3Rpdml0eTogIiArIHRvcCk7Ci0vLwkJCQkJCQkJfQotLy8JCQkJCQkJfQotCQkJCQkJCUJyZWFrZG93bkVsZW1lbnQgY29weSA9IG51bGw7Ci0JCQkJCQkJYm9vbGVhbiBpc1N1cHByZXNzZWQgPSBzdXBwcmVzc2lvbi5pc1N1cHByZXNzZWQoY2hpbGQpOwotCQkJCQkJCQotCQkJCQkJCS8vIGZpbmQgY29weSB0byBzdXBwcmVzcyBvciwgaWYgZWxlbWVudCBpcyBhbiBhY3Rpdml0eSwgdG8gcmVvcmRlciBpdHMgYnJlYWtkb3duIGVsZW1lbnRzCi0JCQkJCQkJLy8KLQkJCQkJCQlpZihpc1N1cHByZXNzZWQgfHwgaXNXQlMpIHsKLQkJCQkJCQkJaWYoY2hpbGQgPT0gZSkgewkKLQkJCQkJCQkJCWNvcHkgPSAoQnJlYWtkb3duRWxlbWVudCkgb3JpZ2luYWxUb0NvcHlNYXAuZ2V0KGUpOwotCQkJCQkJCQl9Ci0JCQkJCQkJCWVsc2UgaWYoY2hpbGQgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgewotCQkJCQkJCQkJQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIgY2hpbGRXcmFwcGVyID0gKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSBjaGlsZDsKLQkJCQkJCQkJCWlmKGNoaWxkV3JhcHBlci5pc0luaGVyaXRlZCgpKSB7Ci0JCQkJCQkJCQkJU3RyaW5nIGd1aWRQYXRoID0gU3VwcHJlc3Npb24uZ2V0UGF0aFdpdGhvdXRWaWV3VHlwZShjaGlsZFdyYXBwZXIpLnRvU3RyaW5nKCk7Ci0JCQkJCQkJCQkJY29weSA9IGhlbHBlci5nZXRXcmFwcGVyQ29weShndWlkUGF0aCk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQkJCQkJCQkJaWYoY29weSAhPSBudWxsKSB7Ci0JCQkJCQkJCQlpZihpc1N1cHByZXNzZWQpIHsKLQkJCQkJCQkJCQljb3B5LnNldFN1cHByZXNzZWQoQm9vbGVhbi5UUlVFKTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJCWlmKGlzV0JTKSB7Ci0JCQkJCQkJCQkJZWxlbWVudE9yV3JhcHBlclRvQ29weU1hcC5wdXQoY2hpbGQsIGNvcHkpOwotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJLy8gcmVvcmRlciBicmVha2Rvd24gZWxlbWVudHMgb2YgYWN0aXZpdGllcwotCQkJCS8vCi0JCQkJaWYoaXNXQlMpIHsKLQkJCQkJZm9yIChNYXAuRW50cnk8T2JqZWN0LCBPYmplY3Q+IGVudHJ5IDogZWxlbWVudE9yV3JhcHBlclRvQ29weU1hcC5lbnRyeVNldCgpKSB7Ci0JCQkJCQlPYmplY3QgbyA9IGVudHJ5LmdldEtleSgpOwotCQkJCQkJT2JqZWN0IGNvcHkgPSBlbnRyeS5nZXRWYWx1ZSgpOwotCQkJCQkJaWYoY29weSBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJCQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyIGlwID0gKElUcmVlSXRlbUNvbnRlbnRQcm92aWRlcikgYWRhcHRlckZhY3RvcnkuYWRhcHQobywgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCQkJCQlDb2xsZWN0aW9uPD8+IGNoaWxkcmVuID0gaXAuZ2V0Q2hpbGRyZW4obyk7Ci0JCQkJCQkJRUxpc3Q8Pz4gbGlzdCA9ICAoRUxpc3Q8Pz4pICgoQWN0aXZpdHkpIGNvcHkpLmdldEJyZWFrZG93bkVsZW1lbnRzKCk7Ci0JCQkJCQkJTGlzdDw/PiBjaGlsZHJlbkxpc3QgPSBjaGlsZHJlbiBpbnN0YW5jZW9mIExpc3Q8Pz4gPyAoTGlzdDw/PikgY2hpbGRyZW4gOiBuZXcgQXJyYXlMaXN0PE9iamVjdD4oY2hpbGRyZW4pOwotCQkJCQkJCWludCBzaXplID0gY2hpbGRyZW5MaXN0LnNpemUoKTsKLQkJCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IHNpemU7IGorKykgewotCQkJCQkJCQlPYmplY3QgY2hpbGQgPSBjaGlsZHJlbkxpc3QuZ2V0KGopOwotCQkJCQkJCQlPYmplY3QgY2hpbGRDb3B5ID0gZWxlbWVudE9yV3JhcHBlclRvQ29weU1hcC5nZXQoY2hpbGQpOwotCQkJCQkJCQlpZihjaGlsZENvcHkgIT0gbnVsbCkgewotCQkJCQkJCQkJaWYoaiA8IHNpemUgLSAxKSB7Ci0JCQkJCQkJCQkJT2JqZWN0IG5leHRDaGlsZCA9IGNoaWxkcmVuTGlzdC5nZXQoaiArIDEpOwotCQkJCQkJCQkJCU9iamVjdCBuZXh0Q2hpbGRDb3B5ID0gZWxlbWVudE9yV3JhcHBlclRvQ29weU1hcC5nZXQobmV4dENoaWxkKTsJCi0JCQkJCQkJCQkJaWYobmV4dENoaWxkQ29weSAhPSBudWxsKSB7Ci0JCQkJCQkJCQkJCWludCBzdWNjSWQgPSBsaXN0LmluZGV4T2YobmV4dENoaWxkQ29weSk7Ci0JCQkJCQkJCQkJCWlmKHN1Y2NJZCAhPSAtMSkgewotCQkJCQkJCQkJCQkJaW50IGlkID0gbGlzdC5pbmRleE9mKGNoaWxkQ29weSk7Ci0JCQkJCQkJCQkJCQlpZihpZCAhPSBzdWNjSWQgLSAxKSB7Ci0JCQkJCQkJCQkJCQkJaWYoaWQgPCBzdWNjSWQpIHsKLQkJCQkJCQkJCQkJCQkJbGlzdC5tb3ZlKHN1Y2NJZCAtIDEsIGlkKTsKLQkJCQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQkJCQkJZWxzZSB7Ci0JCQkJCQkJCQkJCQkJCWxpc3QubW92ZShpZCwgc3VjY0lkKTsKLQkJCQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQkJCX0JCQkJCQkJCQkJCi0JCQkJCQkJCQkJfQotCQkJCQkJCQkJCWVsc2UgaWYoVG5nVXRpbC5ERUJVRykgewotCQkJCQkJCQkJCQlTeXN0ZW0uZXJyLnByaW50bG4oIkVsZW1lbnQgZG9lcyBub3QgaGF2ZSBjb3B5OiAiICsgbmV4dENoaWxkKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJCX0KLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCQkJCQkJCQllbHNlIGlmKFRuZ1V0aWwuREVCVUcpIHsKLQkJCQkJCQkJCVN5c3RlbS5lcnIucHJpbnRsbigiRWxlbWVudCBkb2VzIG5vdCBoYXZlIGNvcHk6ICIgKyBjaGlsZCk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWZpbmFsbHkgewotCQkJCWlmKGNvbmZpZ3VyYXRvciAhPSBudWxsKSB7Ci0JCQkJCWNvbmZpZ3VyYXRvci5zZXRNZXRob2RDb25maWd1cmF0aW9uKGN1cnJlbnRDb25maWcpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkKLQlwdWJsaWMgQ29weUhlbHBlciBnZXRDb3B5SGVscGVyKCkgewotCQlyZXR1cm4gKENvcHlIZWxwZXIpIGNvcHlIZWxwZXI7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL0FjdGl2aXR5RHJvcENvbW1hbmQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL0FjdGl2aXR5RHJvcENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjljM2QyZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9BY3Rpdml0eURyb3BDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NDcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQ7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5PcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5BYnN0cmFjdFRyZWVJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudWkuSUFjdGlvblR5cGVQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnVpLlVzZXJJbnRlcmFjdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuQWN0aXZpdHlIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5JUnVubmFibGVXaXRoUHJvZ3Jlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlByb2Nlc3NVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5TdXBwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb24uRGVwZW5kZW5jeUNoZWNrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DYXBhYmlsaXR5UGF0dGVybjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJ5UHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaWJhYmxlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc1BhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZWFtUHJvZmlsZTsKLQotCi0vKioKLSAqIERyb3AgY29tbWFuZCBmb3IgYWN0aXZpdHkgdGhhdCBzdXBwb3J0cyBleHRlbmQsIGNvcHksIGFuZCBkZWVwIGNvcHkuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eURyb3BDb21tYW5kIGV4dGVuZHMgQlNEcm9wQ29tbWFuZCB7Ci0KLQlwcml2YXRlIE9iamVjdCB2aWV3ZXI7Ci0KLQlwcml2YXRlIExpc3Q8Q2FwYWJpbGl0eVBhdHRlcm4+IG9sZFBhdHRlcm5zOwotCi0JcHJpdmF0ZSBMaXN0PENhcGFiaWxpdHlQYXR0ZXJuPiBwYXR0ZXJuczsKLQotCXByb3RlY3RlZCBQcm9jZXNzIHRhcmdldFByb2Nlc3M7Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNEZWxpdmVyeVByb2Nlc3M7Ci0KLQlwcml2YXRlIGludCB0eXBlOwotCQotCXByaXZhdGUgQ29sbGVjdGlvbjxBY3Rpdml0eT4gYXBwbGllZEFjdGl2aXRpZXM7Ci0KLQlwcm90ZWN0ZWQgQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3Rvcnk7Ci0KLQlwcm90ZWN0ZWQgQWN0aXZpdHlIYW5kbGVyIGFjdGl2aXR5SGFuZGxlcjsKLQotCXByb3RlY3RlZCBib29sZWFuIHByZUV4ZWN1dGVkOwotCi0JcHJvdGVjdGVkIEhhc2hTZXQ8Pz4gYWRkZWRPYmplY3RzOwotCQotCXByb3RlY3RlZCBJQ29uZmlndXJhdG9yIGFjdGl2aXR5RGVlcENvcHlDb25maWd1cmF0b3I7Ci0KLQlwdWJsaWMgQWN0aXZpdHlEcm9wQ29tbWFuZChBY3Rpdml0eSB0YXJnZXQsIExpc3QgYWN0aXZpdGllcywgT2JqZWN0IHZpZXdlciwgQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIodGFyZ2V0LCBhY3Rpdml0aWVzKTsKLQkJc2V0TGFiZWwoTGlicmFyeUVkaXRSZXNvdXJjZXMuQWN0aXZpdHlEcm9wQ29tbWFuZF9sYWJlbCk7IAotCQl0aGlzLnZpZXdlciA9IHZpZXdlcjsKLQkJdGhpcy5hZGFwdGVyRmFjdG9yeSA9IGFkYXB0ZXJGYWN0b3J5OwotCQl0YXJnZXRQcm9jZXNzID0gVG5nVXRpbC5nZXRPd25pbmdQcm9jZXNzKHRhcmdldCk7Ci0JCQotCQlpc0RlbGl2ZXJ5UHJvY2VzcyA9IHRhcmdldFByb2Nlc3MgaW5zdGFuY2VvZiBEZWxpdmVyeVByb2Nlc3M7Ci0JCWlmIChpc0RlbGl2ZXJ5UHJvY2VzcykgewotCQkJb2xkUGF0dGVybnMgPSBuZXcgQXJyYXlMaXN0KCgoRGVsaXZlcnlQcm9jZXNzKSB0YXJnZXRQcm9jZXNzKQotCQkJCQkuZ2V0SW5jbHVkZXNQYXR0ZXJucygpKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgQWN0aXZpdHlEcm9wQ29tbWFuZChBY3Rpdml0eSB0YXJnZXQsIExpc3QgYWN0aXZpdGllcywgT2JqZWN0IHZpZXdlciwgCi0JCQlBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSxJQ29uZmlndXJhdG9yIGRlZXBDb3B5Q29uZmlndXJhdG9yKXsKLQkJdGhpcyh0YXJnZXQsIGFjdGl2aXRpZXMsIHZpZXdlciwgYWRhcHRlckZhY3RvcnkpOwotCQl0aGlzLmFjdGl2aXR5RGVlcENvcHlDb25maWd1cmF0b3IgPSBkZWVwQ29weUNvbmZpZ3VyYXRvcjsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgcHJlcGFyZURyb3BFbGVtZW50cygpIHsKLQkJLy8gcmVtb3ZlIGFueSBkcm9wIGVsZW1lbnQgdGhhdCBpcyBzdXBwcmVzcwotCQkvLwotCQlmb3IgKEl0ZXJhdG9yPD8+IGl0ZXIgPSBkcm9wRWxlbWVudHMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZWxlbWVudCA9IChPYmplY3QpIGl0ZXIubmV4dCgpOwotCQkJUHJvY2VzcyBwcm9jID0gVG5nVXRpbC5nZXRPd25pbmdQcm9jZXNzKGVsZW1lbnQpOwotCQkJaWYocHJvYyAhPSBudWxsKSB7Ci0JCQkJU3VwcHJlc3Npb24gc3VwcCA9IFN1cHByZXNzaW9uLmdldFN1cHByZXNzaW9uKHByb2MpOwotCQkJCWlmKHN1cHAuaXNTdXBwcmVzc2VkKGVsZW1lbnQpKSB7Ci0JCQkJCWl0ZXIucmVtb3ZlKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJc3VwZXIucHJlcGFyZURyb3BFbGVtZW50cygpOwkJCi0JfQotCQotCXB1YmxpYyB2b2lkIHNldFR5cGUoaW50IHR5cGUpIHsKLQkJdGhpcy50eXBlID0gdHlwZTsKLQkJaWYodHlwZSA9PSBJQWN0aW9uVHlwZVByb3ZpZGVyLkRFRVBfQ09QWSkgewotCQkJcnVuQXNKb2IgPSB0cnVlOwotCQl9Ci0JfQotCQotCXB1YmxpYyBJU3RhdHVzIGNoZWNrQ29weSgpIHsKLQkJZm9yIChPYmplY3QgZSA6IGRyb3BFbGVtZW50cykgewotCQkJaWYoZSBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJSVN0YXR1cyBzdGF0dXMgPSBjaGVja0NpcmN1bGFyKChBY3Rpdml0eSkgZSk7Ci0JCQkJaWYoIXN0YXR1cy5pc09LKCkpIHsKLQkJCQkJcmV0dXJuIHN0YXR1czsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JfQotCQotCXB1YmxpYyBJU3RhdHVzIGNoZWNrRXh0ZW5kKCkgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBkcm9wRWxlbWVudHMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0vLwkJCUJyZWFrZG93bkVsZW1lbnQgZWxlbWVudCA9IChCcmVha2Rvd25FbGVtZW50KSBpdGVyLm5leHQoKTsKLS8vCQkJCi0vLwkJCWlmICgoUHJvY2Vzc1V0aWwuaGFzQ29udHJpYnV0b3JPclJlcGxhY2VyKChBY3Rpdml0eSkgZWxlbWVudCkpKXsKLS8vCQkJCWNhbkV4dGVuZCA9IGZhbHNlOwotLy8JCQkJYnJlYWs7Ci0vLwkJCX0KLS8vCQkJCi0vLwkJCVByb2Nlc3MgcHJvYyA9IFRuZ1V0aWwuZ2V0T3duaW5nUHJvY2VzcyhlbGVtZW50KTsKLS8vCQkJaWYgKHRhcmdldFByb2Nlc3MuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpID09IHByb2MpIHsKLS8vCQkJCWNhbkV4dGVuZCA9IGZhbHNlOwotLy8JCQkJYnJlYWs7Ci0vLwkJCX0KLS8vCQkJCi0vLwkJCWlmIChwcm9jIGluc3RhbmNlb2YgQ2FwYWJpbGl0eVBhdHRlcm4gJiYgcHJvYyAhPSB0YXJnZXRQcm9jZXNzKSB7Ci0vLwkJCQljYW5FeHRlbmQgPSB0cnVlOwotLy8JCQkJYnJlYWs7Ci0vLwkJCX0KLQkJCQotCQkJQWN0aXZpdHkgYWN0ID0gKEFjdGl2aXR5KSBpdGVyLm5leHQoKTsKLQkJCVByb2Nlc3Mgc3JjUHJvYyA9IFRuZ1V0aWwuZ2V0T3duaW5nUHJvY2VzcyhhY3QpOwotCQkJaWYoc3JjUHJvYyBpbnN0YW5jZW9mIERlbGl2ZXJ5UHJvY2VzcyAmJiBzcmNQcm9jICE9IHRhcmdldFByb2Nlc3MpIHsKLQkJCQkvLyBjYW5ub3QgZXh0ZW5kIGEgZGlmZmVyZW50IGRlbGl2ZXJ5IHByb2Nlc3Mgb3IgYW55IG9mIGl0cyBhY3Rpdml0aWVzCi0JCQkJLy8KLQkJCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBMaWJyYXJ5RWRpdFBsdWdpbi5QTFVHSU5fSUQsIDAsCi0JCQkJCQlMaWJyYXJ5RWRpdFJlc291cmNlcy5jYW5ub3RfY29weV9vcl9leHRlbmRfZGVsaXZlcnlfcHJvY2VzcywKLQkJCQkJCW51bGwpOwotCQkJfQotCQkJSVN0YXR1cyBzdGF0dXMgPSBjaGVja0NpcmN1bGFyKGFjdCk7Ci0JCQlpZighc3RhdHVzLmlzT0soKSkgewotCQkJCXJldHVybiBzdGF0dXM7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JfQotCQotCXByaXZhdGUgSVN0YXR1cyBjaGVja0NpcmN1bGFyKEFjdGl2aXR5IGFjdCkgewotCQlib29sZWFuIHJlc3VsdDsKLQkJaWYgKERlcGVuZGVuY3lDaGVja2VyLm5ld0NoZWNrQWN0KSB7Ci0JCQlyZXN1bHQgPSBEZXBlbmRlbmN5Q2hlY2tlci5jaGVja0NpcmN1bGFyRm9yTW92aW5nVmFyaWFiaWxpdHlFbGVtZW50Ci0JCQkJCQkJKGFjdGl2aXR5LCBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KGFjdCksIHRydWUpOwotCQl9IGVsc2UgewotCQkJcmVzdWx0ID0gRGVwZW5kZW5jeUNoZWNrZXIuY2hlY2tDaXJjdWxhckRlcGVuZGVuY3koYWN0LCBhY3Rpdml0eSkuaXNPSygpOwotCQl9Ci0JCWlmKCFyZXN1bHQpIHsKLQkJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIExpYnJhcnlFZGl0UGx1Z2luLlBMVUdJTl9JRCwgMCwKLQkJCQkJTGlicmFyeUVkaXRSZXNvdXJjZXMuY2lyY3VsYXJfZGVwZW5kZW5jeV9lcnJvcl9tc2csCi0JCQkJCW51bGwpOwotCQl9Ci0JCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kLkJTRHJvcENvbW1hbmQjZXhlY3V0ZSgpCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJSUFjdGlvblR5cGVQcm92aWRlciBhY3Rpb25UeXBlUHJvdmlkZXIgPSAoSUFjdGlvblR5cGVQcm92aWRlcikgdmlld2VyOwotCQlpZiAoIHZpZXdlciAhPSBudWxsKSB7Ci0JCQl2aWV3ZXIgPSBudWxsOwotCQkJYm9vbGVhbiBjYW5Db3B5ID0gY2hlY2tDb3B5KCkuaXNPSygpOwotCQkJYm9vbGVhbiBjYW5FeHRlbmQgPSBjaGVja0V4dGVuZCgpLmlzT0soKTsKLQkJCWludFtdIGNob2ljZXMgPSBuZXcgaW50WzEgKyAoY2FuQ29weSA/IDEgOiAwKSArIChjYW5FeHRlbmQgPyAxIDogMCldOwotCQkJaW50IGkgPSAwOwotCQkJaWYoY2FuQ29weSkgewotCQkJCWNob2ljZXNbaSsrXSA9IElBY3Rpb25UeXBlUHJvdmlkZXIuQ09QWTsKLQkJCX0KLQkJCWlmKGNhbkV4dGVuZCkgewotCQkJCWNob2ljZXNbaSsrXSA9IElBY3Rpb25UeXBlUHJvdmlkZXIuRVhURU5EOwotCQkJfQotCQkJY2hvaWNlc1tpXSA9IElBY3Rpb25UeXBlUHJvdmlkZXIuREVFUF9DT1BZOwotCQkJCi0JCQkvLyBkZWxlZ2F0ZSB0aGUgZXhlY3V0aW9uIG9mIHRoaXMgY29tbWFuZAotCQkJLy8KLQkJCWFjdGlvblR5cGVQcm92aWRlci5leGVjdXRlKHRoaXMsIGNob2ljZXMpOwotCi0JCQlyZXR1cm47Ci0JCX0KLQotCQlhY3Rpdml0eUhhbmRsZXIgPSBuZXcgQWN0aXZpdHlIYW5kbGVyKCk7Ci0JCXRyeSB7Ci0JCQlpZiAodHlwZSA9PSBJQWN0aW9uVHlwZVByb3ZpZGVyLkRFRVBfQ09QWSkgewotCQkJCWRvRGVlcENvcHkoKTsKLQkJCX0gZWxzZSB7Ci0JCQkJc3VwZXIuZXhlY3V0ZSgpOwotCQkJfQotCQl9IGZpbmFsbHkgewotCQkJYWN0aXZpdHlIYW5kbGVyLmRpc3Bvc2UoKTsKLQkJfQotCQkKLQkJaWYoVG5nVXRpbC5ERUJVRykgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJBY3Rpdml0eURyb3BDb21tYW5kLmV4ZWN1dGUoKTogZG9uZSIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkb0RlZXBDb3B5KCkgewotCQlpZighVXNlckludGVyYWN0aW9uSGVscGVyLmNvbmZpcm1EZWVwQ29weShkcm9wRWxlbWVudHMpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJTWV0aG9kQ29uZmlndXJhdGlvbiBkZWVwQ29weUNvbmZpZyA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlkZWVwQ29weUNvbmZpZyA9IFVzZXJJbnRlcmFjdGlvbkhlbHBlci5jaG9vc2VEZWVwQ29weUNvbmZpZ3VyYXRpb24odGFyZ2V0UHJvY2VzcywgYWRhcHRlckZhY3RvcnkpOwotCQl9Ci0JCWNhdGNoKE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uIGUpIHsKLQkJCWdldE1vZGlmaWVkUmVzb3VyY2VzKCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJYm9vbGVhbiBjb3B5RXh0ZXJuYWxWYXJpYXRpb25zOwotCQl0cnkgewotCQkJY29weUV4dGVybmFsVmFyaWF0aW9ucyA9IFVzZXJJbnRlcmFjdGlvbkhlbHBlci5jb3B5RXh0ZXJuYWxWYXJpYXRpb25zQWxsb3dlZCh0YXJnZXRQcm9jZXNzLCBhZGFwdGVyRmFjdG9yeSk7Ci0JCX0KLQkJY2F0Y2goT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24gZSkgewotCQkJZ2V0TW9kaWZpZWRSZXNvdXJjZXMoKS5jbGVhcigpOwotCQkJcmV0dXJuOwkJCQotCQl9Ci0JCWFjdGl2aXR5SGFuZGxlci5zZXRDb3B5RXh0ZXJuYWxWYXJpYXRpb25zKGNvcHlFeHRlcm5hbFZhcmlhdGlvbnMpOwotCQlhY3Rpdml0eUhhbmRsZXIuc2V0RGVlcENvcHlDb25maWcoZGVlcENvcHlDb25maWcpOwotCQlhY3Rpdml0eUhhbmRsZXIuc2V0VGFyZ2V0UHJvY2Vzcyh0YXJnZXRQcm9jZXNzKTsKLQkJCi0JCS8vIFNldCBhIGNvbmZpZ3VyYXRvciB0byByZXNvbHZlIGFuZCBkZWVwIGNvcHkgY29udHJpYnV0b3JzIGFuZCByZXBsYWNlcnMKLQkJYWN0aXZpdHlIYW5kbGVyLnNldEFjdGl2aXR5RGVlcENvcHlDb25maWd1cmF0b3IoYWN0aXZpdHlEZWVwQ29weUNvbmZpZ3VyYXRvcik7Ci0JCQotCQlJUnVubmFibGVXaXRoUHJvZ3Jlc3MgcnVubmFibGUgPSBuZXcgSVJ1bm5hYmxlV2l0aFByb2dyZXNzKCkgewotCi0JCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQkJCWFjdGl2aXR5SGFuZGxlci5zZXRNb25pdG9yKG1vbml0b3IpOwotCQkJCXByZUV4ZWN1dGVkID0gcHJlRXhlY3V0ZSgpOwotCQkJfQotCQkJCi0JCX07Ci0JCVVzZXJJbnRlcmFjdGlvbkhlbHBlci5ydW5XaXRoUHJvZ3Jlc3MocnVubmFibGUsIGdldExhYmVsKCkpOwkJCQotCQlpZiAocHJlRXhlY3V0ZWQpIHsKLQkJCXJlZG8oKTsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kLkJTRHJvcENvbW1hbmQjcHJlRXhlY3V0ZSgpCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gcHJlRXhlY3V0ZSgpIHsKLQkJaWYgKCFzdXBlci5wcmVFeGVjdXRlKCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJLy8gcHJvY2VzcyB0aGUgc2VsZWN0ZWQgYWN0aXZpdGllcyBhbmQgZGVlcC1jb3B5IHRoZSB2YWxpZCBvbmVzCi0JCS8vCi0JCWlmIChpc0RlbGl2ZXJ5UHJvY2VzcykgewotCQkJcGF0dGVybnMgPSBuZXcgQXJyYXlMaXN0PENhcGFiaWxpdHlQYXR0ZXJuPigpOwotCQl9Ci0JCQotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBkcm9wRWxlbWVudHMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZWxlbWVudCA9IChPYmplY3QpIGl0ZXIubmV4dCgpOwotCQkJaWYgKChlbGVtZW50IGluc3RhbmNlb2YgQWN0aXZpdHkpCi0JCQkvLyAmJiBlbGVtZW50ICE9IHRhcmdldAotCQkJKSB7Ci0JCQkJQWN0aXZpdHkgYWN0ID0gKEFjdGl2aXR5KSBlbGVtZW50OwotCQkJCQotLy8JCQkJaWYodHlwZSA9PSBJQWN0aW9uVHlwZVByb3ZpZGVyLkRFRVBfQ09QWSkgewotLy8JCQkJCWFjdGl2aXR5SGFuZGxlci5kZWVwQ29weShhY3QpOwotLy8JCQkJfQotLy8JCQkJZWxzZSB7Ci0vLwkJCQkJUHJvY2VzcyBwcm9jID0gVG5nVXRpbC5nZXRPd25pbmdQcm9jZXNzKGFjdCk7Ci0vLwkJCQkJaWYgKHByb2MgaW5zdGFuY2VvZiBDYXBhYmlsaXR5UGF0dGVybiAmJiBwcm9jICE9IHRhcmdldFByb2Nlc3MpIHsKLS8vCQkJCQkJaWYgKHR5cGUgPT0gSUFjdGlvblR5cGVQcm92aWRlci5FWFRFTkQpIHsKLS8vCQkJCQkJCWFjdGl2aXR5SGFuZGxlci5leHRlbmQoYWN0KTsKLS8vCQkJCQkJCWlmIChwYXR0ZXJucyAhPSBudWxsKQotLy8JCQkJCQkJCXBhdHRlcm5zLmFkZChwcm9jKTsKLS8vCQkJCQkJfSBlbHNlIHsKLS8vCQkJCQkJCWFjdGl2aXR5SGFuZGxlci5jb3B5KGFjdCk7Ci0vLwkJCQkJCX0KLS8vCQkJCQl9IGVsc2UgewotLy8JCQkJCQlhY3Rpdml0eUhhbmRsZXIuY29weShhY3QpOwotLy8JCQkJCX0KLS8vCQkJCX0KLQkJCQkKLQkJCQlzd2l0Y2godHlwZSkgewotCQkJCWNhc2UgSUFjdGlvblR5cGVQcm92aWRlci5ERUVQX0NPUFk6Ci0JCQkJCWFjdGl2aXR5SGFuZGxlci5kZWVwQ29weShlbGVtZW50KTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBJQWN0aW9uVHlwZVByb3ZpZGVyLkVYVEVORDoKLQkJCQkJYWN0aXZpdHlIYW5kbGVyLmV4dGVuZChhY3QpOwotCQkJCQlpZiAocGF0dGVybnMgIT0gbnVsbCkgewotCQkJCQkJUHJvY2VzcyBwcm9jID0gVG5nVXRpbC5nZXRPd25pbmdQcm9jZXNzKGFjdCk7Ci0JCQkJCQlpZihwcm9jIGluc3RhbmNlb2YgQ2FwYWJpbGl0eVBhdHRlcm4pIHsKLQkJCQkJCQlwYXR0ZXJucy5hZGQoKENhcGFiaWxpdHlQYXR0ZXJuKSBwcm9jKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQljYXNlIElBY3Rpb25UeXBlUHJvdmlkZXIuQ09QWToKLQkJCQkJYWN0aXZpdHlIYW5kbGVyLmNvcHkoYWN0KTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJYXBwbGllZEFjdGl2aXRpZXMgPSBuZXcgQXJyYXlMaXN0PEFjdGl2aXR5PihhY3Rpdml0eUhhbmRsZXIuZ2V0QWN0aXZpdGllcygpKTsKLQotCQlyZXR1cm4gIWFwcGxpZWRBY3Rpdml0aWVzLmlzRW1wdHkoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZC5CU0Ryb3BDb21tYW5kI2RvRXhlY3V0ZSgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZG9FeGVjdXRlKCkgewotCQlJdGVyYXRvcjxBY3Rpdml0eT4gaXRvciA9IGFwcGxpZWRBY3Rpdml0aWVzLml0ZXJhdG9yKCk7Ci0KLQkJUHJvY2Vzc1BhY2thZ2UgcGtnID0gKFByb2Nlc3NQYWNrYWdlKSBhY3Rpdml0eS5lQ29udGFpbmVyKCk7Ci0JCXdoaWxlIChpdG9yLmhhc05leHQoKSkgewotCQkJQWN0aXZpdHkgYWN0ID0gKEFjdGl2aXR5KSBpdG9yLm5leHQoKTsKLQotCQkJaWYgKGFjdC5lQ29udGFpbmVyKCkgIT0gbnVsbAotCQkJCQkmJiBhY3QuZUNvbnRhaW5lcigpLmVDb250YWluZXIoKSAhPSBwa2cpIHsKLQkJCQlwa2cuZ2V0Q2hpbGRQYWNrYWdlcygpLmFkZCgoTWV0aG9kUGFja2FnZSkgYWN0LmVDb250YWluZXIoKSk7Ci0JCQl9Ci0KLQkJCWlmIChwYXR0ZXJucyAhPSBudWxsICYmICFwYXR0ZXJucy5pc0VtcHR5KCkpIHsKLQkJCQlEZWxpdmVyeVByb2Nlc3MgcHJvYyA9IChEZWxpdmVyeVByb2Nlc3MpIHRhcmdldFByb2Nlc3M7Ci0JCQkJZm9yIChDYXBhYmlsaXR5UGF0dGVybiBwYXR0ZXJuIDogcGF0dGVybnMpIHsKLQkJCQkJaWYgKCFwcm9jLmdldEluY2x1ZGVzUGF0dGVybnMoKS5jb250YWlucyhwYXR0ZXJuKSkgewotCQkJCQkJcHJvYy5nZXRJbmNsdWRlc1BhdHRlcm5zKCkuYWRkKHBhdHRlcm4pOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWxvbmcgdGltZSA9IDA7Ci0JCWlmKFRuZ1V0aWwuREVCVUcpIHsKLQkJCXRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJfQotCQlhY3Rpdml0eS5nZXRCcmVha2Rvd25FbGVtZW50cygpLmFkZEFsbChhcHBsaWVkQWN0aXZpdGllcyk7Ci0JCWlmKFRuZ1V0aWwuREVCVUcpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiQWN0aXZpdHlEcm9wQ29tbWFuZC5kb0V4ZWN1dGUoKTogbmV3IGFjdGl2aXRpZXMgYWRkZWQuICIgKyAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSB0aW1lKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlpZighYWN0aXZpdHlIYW5kbGVyLmdldERlZXBDb3BpZXMoKS5pc0VtcHR5KCkpIHsKLQkJCWlmKFRuZ1V0aWwuREVCVUcpIHsKLQkJCQl0aW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCQl9Ci0JCQlwb3N0RGVlcENvcHkoKTsKLQkJCWlmKFRuZ1V0aWwuREVCVUcpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkFjdGl2aXR5RHJvcENvbW1hbmQuZG9FeGVjdXRlKCk6IHBvc3REZWVwQ29weSgpLiAiICsgKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gdGltZSkpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQotCQkvLyBIYWNrIHRvIHJlZnJlc2ggcHJvdmlkZXJzIGZvcmNlZnVsbHkgYmVmb3JlIGNhbGxpbmcgZml4RHVwbGljYXRlTmFtZXMKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyIGFkYXB0ZXIgPSAoSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyKSBhZGFwdGVyRmFjdG9yeS5hZGFwdChhY3Rpdml0eSwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJYWRhcHRlci5nZXRDaGlsZHJlbihhY3Rpdml0eSk7Ci0JCQotCQkvLyBmaXggZHVwbGljYXRlIG5hbWVzIG9mIG5ld2x5IGFkZGVkIGVsZW1lbnRzCi0JCWZpeER1cGxpY2F0ZU5hbWVzKCk7Ci0JCQotCQlnZXRNb2RpZmllZFJlc291cmNlcygpLmFkZChhY3Rpdml0eS5lUmVzb3VyY2UoKSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSB2b2lkIHBvc3REZWVwQ29weSgpIHsKLQkJUnVubmFibGUgcnVubmFibGUgPSBuZXcgUnVubmFibGUoKSB7Ci0KLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkvLyBhZGQgdG8gZGVmYXVsdCBjb25maWd1cmF0YXRpb24gb2YgdGhlIHRhcmdldCBwcm9jZXNzIGFueSBtaXNzaW5nIGNvbnRlbnQKLQkJCQkvLwotCQkJCWlmKGFkZGVkT2JqZWN0cyA9PSBudWxsKSB7Ci0JCQkJCWFkZGVkT2JqZWN0cyA9IG5ldyBIYXNoU2V0KCk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlhZGRlZE9iamVjdHMuY2xlYXIoKTsKLQkJCQl9Ci0JCQkJYm9vbGVhbiBkZWZhdWx0Q29uZmlnQ2hhbmdlZCA9IGZhbHNlOwotLy8JCQkJLy8gZGlzYWJsZSBub3RpZmljYXRpb24gb24gY2hhbmdlIHRvIGRlZmF1bHQgY29uZmlndXJhdGlvbiBvZiB0YXJnZXQgcHJvY2VzcyB0byBhdm9pZCBleGNlc3NpdmUgVUkgcmVmcmVzaGVzCi0vLwkJCQkvLwotLy8JCQkJYm9vbGVhbiBvbGROb3RpZnkgPSB0YXJnZXRQcm9jZXNzLmdldERlZmF1bHRDb250ZXh0KCkuZURlbGl2ZXIoKTsKLS8vCQkJCXRhcmdldFByb2Nlc3MuZ2V0RGVmYXVsdENvbnRleHQoKS5lU2V0RGVsaXZlcihmYWxzZSk7Ci0vLwkJCQl0cnkgewotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGFjdGl2aXR5SGFuZGxlci5nZXREZWVwQ29waWVzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gbmV3IEFic3RyYWN0VHJlZUl0ZXJhdG9yKGl0ZXIubmV4dCgpKSB7Ci0KLQkJCQkJCS8qKgotCQkJCQkJICogQ29tbWVudCBmb3IgPGNvZGU+c2VyaWFsVmVyc2lvblVJRDwvY29kZT4KLQkJCQkJCSAqLwotCQkJCQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkJCQkJCXByb3RlY3RlZCBJdGVyYXRvciBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJCQkJaWYob2JqZWN0IGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQkJCQkJcmV0dXJuICgoQWN0aXZpdHkpb2JqZWN0KS5nZXRCcmVha2Rvd25FbGVtZW50cygpLml0ZXJhdG9yKCk7Ci0JCQkJCQkJfQotCQkJCQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNULml0ZXJhdG9yKCk7Ci0JCQkJCQl9Ci0KLQkJCQkJfTsJCQkJCQotCQkJCQl3aGlsZShpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQkJCU9iamVjdCBlID0gaXRlcmF0b3IubmV4dCgpOwotCQkJCQkJaWYoZSBpbnN0YW5jZW9mIERlc2NyaXB0b3IpIHsKLQkJCQkJCQlNZXRob2RFbGVtZW50IG1lID0gUHJvY2Vzc1V0aWwuZ2V0QXNzb2NpYXRlZEVsZW1lbnQoKERlc2NyaXB0b3IpIGUpOwotCQkJCQkJCWludCBzaXplID0gYWRkZWRPYmplY3RzLnNpemUoKTsKLQkJCQkJCQlQcm9jZXNzVXRpbC5hZGRUb0RlZmF1bHRDb25maWd1cmF0aW9uKHRhcmdldFByb2Nlc3MsIG1lLCBhZGRlZE9iamVjdHMpOwotCQkJCQkJCWlmKCFkZWZhdWx0Q29uZmlnQ2hhbmdlZCAmJiAoc2l6ZSAhPSBhZGRlZE9iamVjdHMuc2l6ZSgpKSkgewotCQkJCQkJCQlnZXRNb2RpZmllZFJlc291cmNlcygpLmFkZCh0YXJnZXRQcm9jZXNzLmdldERlZmF1bHRDb250ZXh0KCkuZVJlc291cmNlKCkpOwotCQkJCQkJCQlkZWZhdWx0Q29uZmlnQ2hhbmdlZCA9IHRydWU7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotLy8JCQkJfQotLy8JCQkJZmluYWxseSB7Ci0vLwkJCQkJdGFyZ2V0UHJvY2Vzcy5nZXREZWZhdWx0Q29udGV4dCgpLmVTZXREZWxpdmVyKG9sZE5vdGlmeSk7Ci0vLwkJCQl9Ci0JCQl9Ci0JCQkKLQkJfTsKLQkJCi0JCVVzZXJJbnRlcmFjdGlvbkhlbHBlci5ydW5XaXRoUHJvZ3Jlc3MocnVubmFibGUsIGdldExhYmVsKCkpOwotCQkKLQkJLy8gc3luY2hyb25pemUgdGhlIGRlZXAgY29waWVzIHdpdGggZGVmYXVsdCBjb25maWd1cmF0aW9uIG9mIHRoZSB0YXJnZXQgcHJvY2VzcwkJCQkKLQkJLy8KLQkJZmluYWwgU3luY2hyb25pemVDb21tYW5kIHN5bmNoQ21kID0gbmV3IFN5bmNocm9uaXplQ29tbWFuZChhY3Rpdml0eUhhbmRsZXIuZ2V0RGVlcENvcGllcygpLCB0YXJnZXRQcm9jZXNzLmdldERlZmF1bHRDb250ZXh0KCksIG51bGwsIGZhbHNlKTsKLQkJdHJ5IHsKLQkJCXJ1bm5hYmxlID0gbmV3IFJ1bm5hYmxlKCkgewotCi0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQlzeW5jaENtZC5pbml0aWxpemUoKTsKLQkJCQl9Ci0JCQkJCi0JCQl9OwotCQkJVXNlckludGVyYWN0aW9uSGVscGVyLnJ1bldpdGhQcm9ncmVzcyhydW5uYWJsZSwgTGlicmFyeUVkaXRSZXNvdXJjZXMuUHJvY2Vzc0F1dG9TeW5jaHJvbml6ZUFjdGlvbl9wcmVwYXJlKTsKLQkJCWlmKHN5bmNoQ21kLmlzSW50aWFsaXplZCgpKSB7Ci0JCQkJc3luY2hDbWQuZXhlY3V0ZSgpOwotCQkJfQotCQl9Ci0JCWZpbmFsbHkgewotCQkJc3luY2hDbWQuZGlzcG9zZSgpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCBTdXBwcmVzc2lvbiBnZXRTdXBwcmVzc2lvbigpIHsKLQkJcmV0dXJuIFN1cHByZXNzaW9uLmdldFN1cHByZXNzaW9uKHRhcmdldFByb2Nlc3MpOwotCX0KLQotCS8qKgotCSAqIEZpeGVzIGR1cGxpY2F0ZSBuYW1lcyBvZiBuZXdseSBhZGRlZCBlbGVtZW50cwotCSAqLwotCXByaXZhdGUgdm9pZCBmaXhEdXBsaWNhdGVOYW1lcygpIHsKLQkJU3VwcHJlc3Npb24gc3VwcHJlc3Npb24gPSBnZXRTdXBwcmVzc2lvbigpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBhcHBsaWVkQWN0aXZpdGllcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCUFjdGl2aXR5IGFjdCA9IChBY3Rpdml0eSkgaXRlci5uZXh0KCk7Ci0JCQlmaXhEdXBsaWNhdGVOYW1lcyhhY3QsIHN1cHByZXNzaW9uKTsKLQkJCWZpeFRlYW1Qcm9maWxlRHVwbGljYXRlTmFtZXMoYWN0LCBzdXBwcmVzc2lvbik7Ci0JCX0JCQkKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGZpeER1cGxpY2F0ZU5hbWVzKEJyZWFrZG93bkVsZW1lbnQgZSwgU3VwcHJlc3Npb24gc3VwcHJlc3Npb24pIHsKLQkJZml4RHVwbGljYXRlTmFtZXMoZSwgc3VwcHJlc3Npb24sIGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBmaXhEdXBsaWNhdGVOYW1lcyhCcmVha2Rvd25FbGVtZW50IGUsIFN1cHByZXNzaW9uIHN1cHByZXNzaW9uLCBBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlTdHJpbmcgYmFzZU5hbWUgPSBlLmdldE5hbWUoKTsKLQkJaWYgKFByb2Nlc3NVdGlsLmNoZWNrQnJlYWtkb3duRWxlbWVudE5hbWUoYWRhcHRlckZhY3RvcnksIGUsIGJhc2VOYW1lLCBzdXBwcmVzc2lvbikgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDE7IHRydWU7IGkrKykgewotCQkJCVN0cmluZyBuYW1lID0gYmFzZU5hbWUgKyAnXycgKyBpOwotCQkJCWlmIChQcm9jZXNzVXRpbC5jaGVja0JyZWFrZG93bkVsZW1lbnROYW1lKGFkYXB0ZXJGYWN0b3J5LCBlLCBuYW1lLCBzdXBwcmVzc2lvbikgPT0gbnVsbCkgewotCQkJCQllLnNldE5hbWUobmFtZSk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCQliYXNlTmFtZSA9IFByb2Nlc3NVdGlsLmdldFByZXNlbnRhdGlvbk5hbWUoZSk7Ci0JCWlmIChQcm9jZXNzVXRpbC5jaGVja0JyZWFrZG93bkVsZW1lbnRQcmVzZW50YXRpb25OYW1lKGFkYXB0ZXJGYWN0b3J5LCBlLCBiYXNlTmFtZSwgc3VwcHJlc3Npb24pICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAxOyB0cnVlOyBpKyspIHsKLQkJCQlTdHJpbmcgbmFtZSA9IGJhc2VOYW1lICsgJ18nICsgaTsKLQkJCQlpZiAoUHJvY2Vzc1V0aWwuY2hlY2tCcmVha2Rvd25FbGVtZW50UHJlc2VudGF0aW9uTmFtZShhZGFwdGVyRmFjdG9yeSwgZSwgbmFtZSwgc3VwcHJlc3Npb24pID09IG51bGwpIHsKLQkJCQkJZS5zZXRQcmVzZW50YXRpb25OYW1lKG5hbWUpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9CQkKLQkKLQlwcml2YXRlIHZvaWQgZml4VGVhbVByb2ZpbGVEdXBsaWNhdGVOYW1lcyhBY3Rpdml0eSBhY3QsIFN1cHByZXNzaW9uIHN1cHByZXNzaW9uKSB7Ci0JCWZvciAoaW50IGkgPSBhY3QuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5zaXplKCkgLSAxOyBpID4gLTE7IGktLSkgewotCQkJT2JqZWN0IGVsZW1lbnQgPSBhY3QuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5nZXQoaSk7Ci0JCQlpZihlbGVtZW50IGluc3RhbmNlb2YgVGVhbVByb2ZpbGUpIHsKLQkJCQlmaXhEdXBsaWNhdGVOYW1lcygoQnJlYWtkb3duRWxlbWVudCkgZWxlbWVudCwgc3VwcHJlc3Npb24sIFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFLmdldE9CU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpOwotCQkJfQotCQkJZWxzZSBpZihlbGVtZW50IGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQlmaXhUZWFtUHJvZmlsZUR1cGxpY2F0ZU5hbWVzKChBY3Rpdml0eSkgZWxlbWVudCwgc3VwcHJlc3Npb24pOwotCQkJfQotCQl9Ci0JfQotCQkKLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kLkJTRHJvcENvbW1hbmQjZG9VbmRvKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkb1VuZG8oKSB7Ci0JCWFjdGl2aXR5LmdldEJyZWFrZG93bkVsZW1lbnRzKCkucmVtb3ZlQWxsKGFwcGxpZWRBY3Rpdml0aWVzKTsKLQkJaWYgKGlzRGVsaXZlcnlQcm9jZXNzKSB7Ci0JCQlEZWxpdmVyeVByb2Nlc3MgcHJvYyA9IChEZWxpdmVyeVByb2Nlc3MpIHRhcmdldFByb2Nlc3M7Ci0JCQlwcm9jLmdldEluY2x1ZGVzUGF0dGVybnMoKS5jbGVhcigpOwotCQkJcHJvYy5nZXRJbmNsdWRlc1BhdHRlcm5zKCkuYWRkQWxsKG9sZFBhdHRlcm5zKTsKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXROYW1lKExpc3Qgc2libGluZ3MsIEFjdGl2aXR5IGUpIHsKLQkJU3RyaW5nIGJhc2VOYW1lID0gZS5nZXROYW1lKCk7Ci0JCWlmICghaXNOYW1lVGFrZW4oc2libGluZ3MsIGUsIGJhc2VOYW1lKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWZvciAoaW50IGkgPSAxOyB0cnVlOyBpKyspIHsKLQkJCVN0cmluZyBuYW1lID0gYmFzZU5hbWUgKyAnXycgKyBpOwotCQkJaWYgKCFpc05hbWVUYWtlbihzaWJsaW5ncywgZSwgbmFtZSkpIHsKLQkJCQllLnNldE5hbWUobmFtZSk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldERlZmF1bHRQcmVzZW50YXRpb25OYW1lKExpc3Qgc2libGluZ3MsIEFjdGl2aXR5IGUpIHsKLQkJLy8gaWYoZS5nZXRQcmVzZW50YXRpb25OYW1lKCkgIT0gbnVsbCAmJgotCQkvLyBlLmdldFByZXNlbnRhdGlvbk5hbWUoKS50cmltKCkubGVuZ3RoKCkgPiAwKSByZXR1cm47Ci0KLQkJU3RyaW5nIGJhc2VQcmVzZW50YXRpb25OYW1lID0gUHJvY2Vzc1V0aWwuZ2V0UHJlc2VudGF0aW9uTmFtZShlKTsKLQkJaWYgKCFpc1ByZXNlbnRhdGlvbk5hbWVUYWtlbihzaWJsaW5ncywgZSwgYmFzZVByZXNlbnRhdGlvbk5hbWUpKSB7Ci0JCQkvLyBlLnNldFByZXNlbnRhdGlvbk5hbWUoYmFzZVByZXNlbnRhdGlvbk5hbWUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCWZvciAoaW50IGkgPSAxOyB0cnVlOyBpKyspIHsKLQkJCVN0cmluZyBuYW1lID0gYmFzZVByZXNlbnRhdGlvbk5hbWUgKyAnXycgKyBpOwotCQkJaWYgKCFpc1ByZXNlbnRhdGlvbk5hbWVUYWtlbihzaWJsaW5ncywgZSwgbmFtZSkpIHsKLQkJCQllLnNldFByZXNlbnRhdGlvbk5hbWUobmFtZSk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc05hbWVUYWtlbihMaXN0IHNpYmxpbmdzLCBEZXNjcmliYWJsZUVsZW1lbnQgZSwKLQkJCVN0cmluZyBuYW1lKSB7Ci0JCWZvciAoaW50IGkgPSBzaWJsaW5ncy5zaXplKCkgLSAxOyBpID4gLTE7IGktLSkgewotCQkJQnJlYWtkb3duRWxlbWVudCBzaWJsaW5nID0gKEJyZWFrZG93bkVsZW1lbnQpIHNpYmxpbmdzLmdldChpKTsKLQkJCS8vIGlmKHNpYmxpbmcgIT0gZSAmJiBuYW1lLmVxdWFscyhzaWJsaW5nLmdldFByZXNlbnRhdGlvbk5hbWUoKSkpIHsKLQkJCWlmIChzaWJsaW5nICE9IGUgJiYgbmFtZS5lcXVhbHMoc2libGluZy5nZXROYW1lKCkpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNQcmVzZW50YXRpb25OYW1lVGFrZW4oTGlzdCBzaWJsaW5ncywKLQkJCURlc2NyaWJhYmxlRWxlbWVudCBlLCBTdHJpbmcgbmFtZSkgewotCQlmb3IgKGludCBpID0gc2libGluZ3Muc2l6ZSgpIC0gMTsgaSA+IC0xOyBpLS0pIHsKLQkJCUJyZWFrZG93bkVsZW1lbnQgc2libGluZyA9IChCcmVha2Rvd25FbGVtZW50KSBzaWJsaW5ncy5nZXQoaSk7Ci0JCQkvLyBpZihzaWJsaW5nICE9IGUgJiYgbmFtZS5lcXVhbHMoc2libGluZy5nZXRQcmVzZW50YXRpb25OYW1lKCkpKSB7Ci0JCQlpZiAoc2libGluZyAhPSBlCi0JCQkJCSYmIG5hbWUuZXF1YWxzKFByb2Nlc3NVdGlsLmdldFByZXNlbnRhdGlvbk5hbWUoc2libGluZykpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5BYnN0cmFjdENvbW1hbmQjZ2V0QWZmZWN0ZWRPYmplY3RzKCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbjw/PiBnZXRBZmZlY3RlZE9iamVjdHMoKSB7Ci0JCWlmKGV4ZWN1dGVkKSB7Ci0JCQlyZXR1cm4gYXBwbGllZEFjdGl2aXRpZXM7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQkJfQotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQWJzdHJhY3RDb21tYW5kI2dldFJlc3VsdCgpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb248Pz4gZ2V0UmVzdWx0KCkgewotCQlyZXR1cm4gZ2V0QWZmZWN0ZWRPYmplY3RzKCk7Ci0JfQotCi0JcHVibGljIEFjdGl2aXR5SGFuZGxlciBnZXRBY3Rpdml0eUhhbmRsZXIoKSB7Ci0JCXJldHVybiBhY3Rpdml0eUhhbmRsZXI7Ci0JfQotCXB1YmxpYyBBY3Rpdml0eSBnZXRBY3Rpdml0eSgpewotCQlyZXR1cm4gYWN0aXZpdHk7Ci0JfQotCXB1YmxpYyBpbnQgZ2V0VHlwZSgpewotCQlyZXR1cm4gdHlwZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRBY3Rpdml0eURlZXBDb3B5Q29uZmlndXJhdG9yKAotCQkJSUNvbmZpZ3VyYXRvciBhY3Rpdml0eURlZXBDb3B5Q29uZmlndXJhdG9yKSB7Ci0JCXRoaXMuYWN0aXZpdHlEZWVwQ29weUNvbmZpZ3VyYXRvciA9IGFjdGl2aXR5RGVlcENvcHlDb25maWd1cmF0b3I7Ci0JfQotCQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvQWN0aXZpdHlWYXJpYWJpbGl0eUNvbW1hbmQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL0FjdGl2aXR5VmFyaWFiaWxpdHlDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1NDVmYjcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvQWN0aXZpdHlWYXJpYWJpbGl0eUNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbi4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklDb25maWd1cmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5VHlwZTsKLQotLyoqCi0gKiBDb21tYW5kIHRvIHNldCB2YXJpYWJpbGl0eSBvbiB0aGUgYWN0aXZpdHkKLSAqIAotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXR5VmFyaWFiaWxpdHlDb21tYW5kIGV4dGVuZHMgQWRkTWV0aG9kRWxlbWVudENvbW1hbmQgewotCi0JcHJpdmF0ZSBBY3Rpdml0eSBhY3Rpdml0eTsKLQotCXByaXZhdGUgVmFyaWFiaWxpdHlFbGVtZW50IHZlOwotCi0JcHJpdmF0ZSBWYXJpYWJpbGl0eVR5cGUgdHlwZTsKLQotCXByaXZhdGUgTGlzdCBlbGVtZW50czsKLQotCXByaXZhdGUgSUNvbmZpZ3VyYXRvciBjb25maWd1cmF0b3I7Ci0KLQlwcml2YXRlIENvbGxlY3Rpb24gbW9kaWZpZWRSZXNvdXJjZXM7Ci0KLQlwdWJsaWMgQWN0aXZpdHlWYXJpYWJpbGl0eUNvbW1hbmQoQWN0aXZpdHkgYWN0aXZpdHksIFZhcmlhYmlsaXR5RWxlbWVudCB2ZSwKLQkJCVZhcmlhYmlsaXR5VHlwZSB0eXBlLCBJQ29uZmlndXJhdG9yIGNvbmZpZ3VyYXRvcikgewotCi0JCXN1cGVyKFRuZ1V0aWwuZ2V0T3duaW5nUHJvY2VzcyhhY3Rpdml0eSkpOwotCi0JCXRoaXMuYWN0aXZpdHkgPSBhY3Rpdml0eTsKLQkJdGhpcy52ZSA9IHZlOwotCQl0aGlzLnR5cGUgPSB0eXBlOwotCQl0aGlzLmNvbmZpZ3VyYXRvciA9IGNvbmZpZ3VyYXRvcjsKLQotCQllbGVtZW50cyA9IEFycmF5cy5hc0xpc3QobmV3IE9iamVjdFtdIHsgdmUgfSk7Ci0KLQkJdGhpcy5tb2RpZmllZFJlc291cmNlcyA9IG5ldyBIYXNoU2V0KCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZCNleGVjdXRlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCi0JCS8vIGFkZCB0byBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gaWYgbm90IHRoZXJlIGFscmVhZHkKLQkJaWYgKCFzdXBlci5hZGRUb0RlZmF1bHRDb25maWd1cmF0aW9uKGVsZW1lbnRzLCBjb25maWd1cmF0b3IpKQotCQkJcmV0dXJuOwotCi0JCXJlZG8oKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kI3JlZG8oKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlZG8oKSB7Ci0KLQkJYWN0aXZpdHkuc2V0VmFyaWFiaWxpdHlUeXBlKHR5cGUpOwotCQlhY3Rpdml0eS5zZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KHZlKTsKLQotCQkKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kI3VuZG8oKQotCSAqLwotCXB1YmxpYyB2b2lkIHVuZG8oKSB7Ci0JCWlmICghZWxlbWVudHMuaXNFbXB0eSgpKSB7Ci0JCQkvLyBiYXNpY2FsbHkgcmVtb3ZlIGZyb20gY29uZmlndXJhdGlvbiBpZiBhbnl0aGluZyB3YXMgYWRkZWQKLQkJCXN1cGVyLnVuZG8oKTsKLQkJCWFjdGl2aXR5LnNldFZhcmlhYmlsaXR5VHlwZShWYXJpYWJpbGl0eVR5cGUuTkEpOwotCQkJYWN0aXZpdHkuc2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudChudWxsKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHByZXBhcmUoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldE1vZGlmaWVkUmVzb3VyY2VzKCkgewotCQlpZiAoYWN0aXZpdHkuZVJlc291cmNlKCkgIT0gbnVsbCkgewotCQkJbW9kaWZpZWRSZXNvdXJjZXMuYWRkKGFjdGl2aXR5LmVSZXNvdXJjZSgpKTsKLQkJfQotCQlyZXR1cm4gbW9kaWZpZWRSZXNvdXJjZXM7Ci0JfQotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0QWZmZWN0ZWRPYmplY3RzKCkgewotCQlyZXR1cm4gc3VwZXIuZ2V0QWZmZWN0ZWRPYmplY3RzKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvQWRkR3VpZGFuY2VUb0FjdGl2aXR5Q29tbWFuZC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvQWRkR3VpZGFuY2VUb0FjdGl2aXR5Q29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNWI1YTdlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL0FkZEd1aWRhbmNlVG9BY3Rpdml0eUNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbi4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ2hlY2tsaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29uY2VwdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkV4YW1wbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HdWlkYW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkd1aWRlbGluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJldXNhYmxlQXNzZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2FkbWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuU3VwcG9ydGluZ01hdGVyaWFsOwotCi0KLS8qKgotICogQ29tbWFuZCB0byBhZGQgZ3VpZGFuY2UgdG8gYWN0aXZpdHkKLSAqICAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBBZGRHdWlkYW5jZVRvQWN0aXZpdHlDb21tYW5kIGV4dGVuZHMgQWRkTWV0aG9kRWxlbWVudENvbW1hbmQgewotCi0JcHJpdmF0ZSBMaXN0IGd1aWRhbmNlczsKLQotCXByaXZhdGUgQWN0aXZpdHkgYWN0aXZpdHk7Ci0KLQlwcml2YXRlIENvbGxlY3Rpb24gbW9kaWZpZWRSZXNvdXJjZXM7Ci0KLQlwdWJsaWMgQWRkR3VpZGFuY2VUb0FjdGl2aXR5Q29tbWFuZChBY3Rpdml0eSBhY3Rpdml0eSwgTGlzdCBndWlkYW5jZXMpIHsKLQotCQlzdXBlcihUbmdVdGlsLmdldE93bmluZ1Byb2Nlc3MoYWN0aXZpdHkpKTsKLQotCQl0aGlzLmd1aWRhbmNlcyA9IGd1aWRhbmNlczsKLQkJdGhpcy5hY3Rpdml0eSA9IGFjdGl2aXR5OwotCi0JCXRoaXMubW9kaWZpZWRSZXNvdXJjZXMgPSBuZXcgSGFzaFNldCgpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQjZXhlY3V0ZSgpCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQotCQkvLyBhZGQgdG8gZGVmYXVsdCBjb25maWd1cmF0aW9uIGlmIG5vdCB0aGVyZSBhbHJlYWR5Ci0JCWlmICghc3VwZXIuYWRkVG9EZWZhdWx0Q29uZmlndXJhdGlvbihndWlkYW5jZXMpKQotCQkJcmV0dXJuOwotCi0JCXJlZG8oKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kI3JlZG8oKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlZG8oKSB7Ci0KLQkJaWYgKCFndWlkYW5jZXMuaXNFbXB0eSgpKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gZ3VpZGFuY2VzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlPYmplY3Qgb2JqID0gaXQubmV4dCgpOwotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBHdWlkYW5jZSkgewotCQkJCQlHdWlkYW5jZSBpdGVtID0gKEd1aWRhbmNlKSBvYmo7Ci0KLQkJCQkJLy8gZ3VpZGFuY2VzIGZvciBjb250ZW50IGVsZW1lbnQKLQkJCQkJaWYgKGl0ZW0gaW5zdGFuY2VvZiBDaGVja2xpc3QpIHsKLQkJCQkJCWFjdGl2aXR5LmdldENoZWNrbGlzdHMoKS5hZGQoKENoZWNrbGlzdCkgaXRlbSk7Ci0JCQkJCX0gZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIENvbmNlcHQpIHsKLQkJCQkJCWFjdGl2aXR5LmdldENvbmNlcHRzKCkuYWRkKChDb25jZXB0KSBpdGVtKTsKLQkJCQkJfSBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgRXhhbXBsZSkgewotCQkJCQkJYWN0aXZpdHkuZ2V0RXhhbXBsZXMoKS5hZGQoKEV4YW1wbGUpIGl0ZW0pOwotCQkJCQl9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBTdXBwb3J0aW5nTWF0ZXJpYWwpIHsKLQkJCQkJCWFjdGl2aXR5LmdldFN1cHBvcnRpbmdNYXRlcmlhbHMoKS5hZGQoKFN1cHBvcnRpbmdNYXRlcmlhbCkgaXRlbSk7Ci0JCQkJCX0gZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIEd1aWRlbGluZSkgewotCQkJCQkJYWN0aXZpdHkuZ2V0R3VpZGVsaW5lcygpLmFkZCgoR3VpZGVsaW5lKSBpdGVtKTsKLQkJCQkJfSBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgUmV1c2FibGVBc3NldCkgewotCQkJCQkJYWN0aXZpdHkuZ2V0UmV1c2FibGVBc3NldHMoKS5hZGQoKFJldXNhYmxlQXNzZXQpIGl0ZW0pOwotCQkJCQl9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBSb2FkbWFwKSB7Ci0JCQkJCQlhY3Rpdml0eS5nZXRSb2FkbWFwcygpLmFkZCgoUm9hZG1hcCkgaXRlbSk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlMaWJyYXJ5RWRpdFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkKLQkJCQkJCQkJLmxvZ0Vycm9yKCJDYW50IHNldCBndWlkYW5jZSAiICsgaXRlbS5nZXRUeXBlKCkuZ2V0TmFtZSgpICsgIjoiICsgaXRlbS5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQjdW5kbygpCi0JICovCi0JcHVibGljIHZvaWQgdW5kbygpIHsKLQkJaWYgKCFndWlkYW5jZXMuaXNFbXB0eSgpKSB7Ci0JCQkvLyBiYXNpY2FsbHkgcmVtb3ZlIGZyb20gY29uZmlndXJhdGlvbiBpZiBhbnl0aGluZyB3YXMgYWRkZWQKLQkJCXN1cGVyLnVuZG8oKTsKLQotCQkJZm9yIChJdGVyYXRvciBpdCA9IGd1aWRhbmNlcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IG9iaiA9IGl0Lm5leHQoKTsKLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgR3VpZGFuY2UpIHsKLQkJCQkJR3VpZGFuY2UgaXRlbSA9IChHdWlkYW5jZSkgb2JqOwotCi0JCQkJCS8vIGd1aWRhbmNlcyBmb3IgY29udGVudCBlbGVtZW50Ci0JCQkJCWlmIChpdGVtIGluc3RhbmNlb2YgQ2hlY2tsaXN0KSB7Ci0JCQkJCQlhY3Rpdml0eS5nZXRDaGVja2xpc3RzKCkucmVtb3ZlKGl0ZW0pOwotCQkJCQl9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBDb25jZXB0KSB7Ci0JCQkJCQlhY3Rpdml0eS5nZXRDb25jZXB0cygpLnJlbW92ZShpdGVtKTsKLQkJCQkJfSBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgRXhhbXBsZSkgewotCQkJCQkJYWN0aXZpdHkuZ2V0RXhhbXBsZXMoKS5yZW1vdmUoaXRlbSk7Ci0JCQkJCX0gZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIFN1cHBvcnRpbmdNYXRlcmlhbCkgewotCQkJCQkJYWN0aXZpdHkuZ2V0U3VwcG9ydGluZ01hdGVyaWFscygpLnJlbW92ZShpdGVtKTsKLQkJCQkJfSBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgR3VpZGVsaW5lKSB7Ci0JCQkJCQlhY3Rpdml0eS5nZXRHdWlkZWxpbmVzKCkucmVtb3ZlKGl0ZW0pOwotCQkJCQl9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBSZXVzYWJsZUFzc2V0KSB7Ci0JCQkJCQlhY3Rpdml0eS5nZXRSZXVzYWJsZUFzc2V0cygpLnJlbW92ZShpdGVtKTsKLQkJCQkJfSBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgUm9hZG1hcCkgewotCQkJCQkJYWN0aXZpdHkuZ2V0Um9hZG1hcHMoKS5yZW1vdmUoaXRlbSk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlMaWJyYXJ5RWRpdFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkKLQkJCQkJCQkJLmxvZ0Vycm9yKCJDYW50IHNldCBndWlkYW5jZSAiICsgaXRlbS5nZXRUeXBlKCkuZ2V0TmFtZSgpICsgIjoiICsgaXRlbS5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHByZXBhcmUoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldE1vZGlmaWVkUmVzb3VyY2VzKCkgewotCQlpZiAoIWd1aWRhbmNlcy5pc0VtcHR5KCkgKSB7Ci0JCQlpZiAoYWN0aXZpdHkuZVJlc291cmNlKCkgIT0gbnVsbCkgewotCQkJCW1vZGlmaWVkUmVzb3VyY2VzLmFkZChhY3Rpdml0eS5lUmVzb3VyY2UoKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG1vZGlmaWVkUmVzb3VyY2VzOwotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldEFmZmVjdGVkT2JqZWN0cygpIHsKLQkJaWYgKGFjdGl2aXR5ICE9IG51bGwpIHsKLQkJCXJldHVybiBBcnJheXMuYXNMaXN0KG5ldyBPYmplY3RbXSB7IGFjdGl2aXR5IH0pOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRBZmZlY3RlZE9iamVjdHMoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9BZGRHdWlkYW5jZVRvQnJlYWtkb3duRWxlbWVudENvbW1hbmQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL0FkZEd1aWRhbmNlVG9CcmVha2Rvd25FbGVtZW50Q29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZGYxMjU2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL0FkZEd1aWRhbmNlVG9CcmVha2Rvd25FbGVtZW50Q29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ2hlY2tsaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29uY2VwdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkV4YW1wbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HdWlkYW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkd1aWRlbGluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJldXNhYmxlQXNzZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2FkbWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuU3VwcG9ydGluZ01hdGVyaWFsOwotCi0vKioKLSAqIENvbW1hbmQgdG8gYWRkIGd1aWRhbmNlIHRvIGJyZWFrZG93biBlbGVtZW50L2FjdGl2aXR5Ci0gKiAgCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuNQotICovCi1wdWJsaWMgY2xhc3MgQWRkR3VpZGFuY2VUb0JyZWFrZG93bkVsZW1lbnRDb21tYW5kIGV4dGVuZHMgQWRkTWV0aG9kRWxlbWVudENvbW1hbmQgewotCi0JcHJpdmF0ZSBMaXN0PEd1aWRhbmNlPiBndWlkYW5jZXM7Ci0KLQlwcml2YXRlIEJyZWFrZG93bkVsZW1lbnQgYnJFbGVtZW50OwotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uIG1vZGlmaWVkUmVzb3VyY2VzOwotCi0JcHVibGljIEFkZEd1aWRhbmNlVG9CcmVha2Rvd25FbGVtZW50Q29tbWFuZChCcmVha2Rvd25FbGVtZW50IGJyRWxlbWVudCwgTGlzdDxHdWlkYW5jZT4gZ3VpZGFuY2VzKSB7Ci0KLQkJc3VwZXIoVG5nVXRpbC5nZXRPd25pbmdQcm9jZXNzKGJyRWxlbWVudCkpOwotCi0JCXRoaXMuZ3VpZGFuY2VzID0gZ3VpZGFuY2VzOwotCQl0aGlzLmJyRWxlbWVudCA9IGJyRWxlbWVudDsKLQotCQl0aGlzLm1vZGlmaWVkUmVzb3VyY2VzID0gbmV3IEhhc2hTZXQoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kI2V4ZWN1dGUoKQotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0KLQkJLy8gYWRkIHRvIGRlZmF1bHQgY29uZmlndXJhdGlvbiBpZiBub3QgdGhlcmUgYWxyZWFkeQotCQlpZiAoIXN1cGVyLmFkZFRvRGVmYXVsdENvbmZpZ3VyYXRpb24oZ3VpZGFuY2VzKSkKLQkJCXJldHVybjsKLQotCQlyZWRvKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZCNyZWRvKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWRvKCkgewotCi0JCWlmICghZ3VpZGFuY2VzLmlzRW1wdHkoKSkgewotCQkJZm9yIChJdGVyYXRvciBpdCA9IGd1aWRhbmNlcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IG9iaiA9IGl0Lm5leHQoKTsKLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgR3VpZGFuY2UpIHsKLQkJCQkJR3VpZGFuY2UgaXRlbSA9IChHdWlkYW5jZSkgb2JqOwotCi0JCQkJCS8vIGd1aWRhbmNlcyBmb3IgY29udGVudCBlbGVtZW50Ci0JCQkJCWlmIChpdGVtIGluc3RhbmNlb2YgQ2hlY2tsaXN0KSB7Ci0JCQkJCQlickVsZW1lbnQuZ2V0Q2hlY2tsaXN0cygpLmFkZCgoQ2hlY2tsaXN0KSBpdGVtKTsKLQkJCQkJfSBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgQ29uY2VwdCkgewotCQkJCQkJYnJFbGVtZW50LmdldENvbmNlcHRzKCkuYWRkKChDb25jZXB0KSBpdGVtKTsKLQkJCQkJfSBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgRXhhbXBsZSkgewotCQkJCQkJYnJFbGVtZW50LmdldEV4YW1wbGVzKCkuYWRkKChFeGFtcGxlKSBpdGVtKTsKLQkJCQkJfSBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgU3VwcG9ydGluZ01hdGVyaWFsKSB7Ci0JCQkJCQlickVsZW1lbnQuZ2V0U3VwcG9ydGluZ01hdGVyaWFscygpLmFkZCgoU3VwcG9ydGluZ01hdGVyaWFsKSBpdGVtKTsKLQkJCQkJfSBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgR3VpZGVsaW5lKSB7Ci0JCQkJCQlickVsZW1lbnQuZ2V0R3VpZGVsaW5lcygpLmFkZCgoR3VpZGVsaW5lKSBpdGVtKTsKLQkJCQkJfSBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgUmV1c2FibGVBc3NldCkgewotCQkJCQkJYnJFbGVtZW50LmdldFJldXNhYmxlQXNzZXRzKCkuYWRkKChSZXVzYWJsZUFzc2V0KSBpdGVtKTsKLQkJCQkJfSBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgUm9hZG1hcCkgewotCQkJCQkJaWYgKGJyRWxlbWVudCBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJCQkJKChBY3Rpdml0eSkgYnJFbGVtZW50KS5nZXRSb2FkbWFwcygpLmFkZCgoUm9hZG1hcCkgaXRlbSk7Ci0JCQkJCQl9Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlMaWJyYXJ5RWRpdFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkKLQkJCQkJCQkJLmxvZ0Vycm9yKCJDYW50IHNldCBndWlkYW5jZSAiICsgaXRlbS5nZXRUeXBlKCkuZ2V0TmFtZSgpICsgIjoiICsgaXRlbS5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQjdW5kbygpCi0JICovCi0JcHVibGljIHZvaWQgdW5kbygpIHsKLQkJaWYgKCFndWlkYW5jZXMuaXNFbXB0eSgpKSB7Ci0JCQkvLyBiYXNpY2FsbHkgcmVtb3ZlIGZyb20gY29uZmlndXJhdGlvbiBpZiBhbnl0aGluZyB3YXMgYWRkZWQKLQkJCXN1cGVyLnVuZG8oKTsKLQotCQkJZm9yIChJdGVyYXRvciBpdCA9IGd1aWRhbmNlcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IG9iaiA9IGl0Lm5leHQoKTsKLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgR3VpZGFuY2UpIHsKLQkJCQkJR3VpZGFuY2UgaXRlbSA9IChHdWlkYW5jZSkgb2JqOwotCi0JCQkJCS8vIGd1aWRhbmNlcyBmb3IgY29udGVudCBlbGVtZW50Ci0JCQkJCWlmIChpdGVtIGluc3RhbmNlb2YgQ2hlY2tsaXN0KSB7Ci0JCQkJCQlickVsZW1lbnQuZ2V0Q2hlY2tsaXN0cygpLnJlbW92ZShpdGVtKTsKLQkJCQkJfSBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgQ29uY2VwdCkgewotCQkJCQkJYnJFbGVtZW50LmdldENvbmNlcHRzKCkucmVtb3ZlKGl0ZW0pOwotCQkJCQl9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBFeGFtcGxlKSB7Ci0JCQkJCQlickVsZW1lbnQuZ2V0RXhhbXBsZXMoKS5yZW1vdmUoaXRlbSk7Ci0JCQkJCX0gZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIFN1cHBvcnRpbmdNYXRlcmlhbCkgewotCQkJCQkJYnJFbGVtZW50LmdldFN1cHBvcnRpbmdNYXRlcmlhbHMoKS5yZW1vdmUoaXRlbSk7Ci0JCQkJCX0gZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIEd1aWRlbGluZSkgewotCQkJCQkJYnJFbGVtZW50LmdldEd1aWRlbGluZXMoKS5yZW1vdmUoaXRlbSk7Ci0JCQkJCX0gZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIFJldXNhYmxlQXNzZXQpIHsKLQkJCQkJCWJyRWxlbWVudC5nZXRSZXVzYWJsZUFzc2V0cygpLnJlbW92ZShpdGVtKTsKLQkJCQkJfSBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgUm9hZG1hcCkgewotCQkJCQkJaWYgKGJyRWxlbWVudCBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJCQkJKChBY3Rpdml0eSkgYnJFbGVtZW50KS5nZXRSb2FkbWFwcygpLnJlbW92ZSgoUm9hZG1hcCkgaXRlbSk7Ci0JCQkJCQl9Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlMaWJyYXJ5RWRpdFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkKLQkJCQkJCQkJLmxvZ0Vycm9yKCJDYW50IHNldCBndWlkYW5jZSAiICsgaXRlbS5nZXRUeXBlKCkuZ2V0TmFtZSgpICsgIjoiICsgaXRlbS5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHByZXBhcmUoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldE1vZGlmaWVkUmVzb3VyY2VzKCkgewotCQlpZiAoIWd1aWRhbmNlcy5pc0VtcHR5KCkgKSB7Ci0JCQlpZiAoYnJFbGVtZW50LmVSZXNvdXJjZSgpICE9IG51bGwpIHsKLQkJCQltb2RpZmllZFJlc291cmNlcy5hZGQoYnJFbGVtZW50LmVSZXNvdXJjZSgpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbW9kaWZpZWRSZXNvdXJjZXM7Ci0JfQotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0QWZmZWN0ZWRPYmplY3RzKCkgewotCQlpZiAoYnJFbGVtZW50ICE9IG51bGwpIHsKLQkJCXJldHVybiBBcnJheXMuYXNMaXN0KG5ldyBPYmplY3RbXSB7IGJyRWxlbWVudCB9KTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0QWZmZWN0ZWRPYmplY3RzKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvQWRkTWV0aG9kRWxlbWVudENvbW1hbmQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL0FkZE1ldGhvZEVsZW1lbnRDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiYzZhY2UuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvQWRkTWV0aG9kRWxlbWVudENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5BYnN0cmFjdENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JUmVzb3VyY2VBd2FyZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51aS5Vc2VySW50ZXJhY3Rpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlByb2Nlc3NVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzOwotCi0KLS8qKgotICogQmFzZSBDb21tYW5kIGZvciBhZGQgbWV0aG9kIGVsZW1lbnRzIHRvIGRlc2NyaXB0b3IuIAotICogCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQWRkTWV0aG9kRWxlbWVudENvbW1hbmQgZXh0ZW5kcyBBYnN0cmFjdENvbW1hbmQgaW1wbGVtZW50cwotCQlJUmVzb3VyY2VBd2FyZUNvbW1hbmQgewotCi0JcHJvdGVjdGVkIExpc3QgZWxlbWVudHNUb0FkZFRvRGVmYXVsdENvbmZpZzsKLQotCXByaXZhdGUgSGFzaFNldCBhZGRlZE9iamVjdHM7Ci0KLQlwcml2YXRlIFByb2Nlc3MgcHJvY2VzczsKLQotCXB1YmxpYyBBZGRNZXRob2RFbGVtZW50Q29tbWFuZChQcm9jZXNzIHByb2Nlc3MpIHsKLQkJc3VwZXIoKTsKLQotCQl0aGlzLnByb2Nlc3MgPSBwcm9jZXNzOwotCX0KLQotCS8qKgotCSAqIENoZWNrcyBhbmQgYWRkcyBlbGVtZW50cyB0byB0aGUgZGVmYXVsdCBjb25maWd1cmF0aW9uCi0JICogCi0JICogQHJldHVybiBmYWxzZSBpZiB1c2VyIGNhbmNlbGVkIHRoZSBvcGVyYXRpb24KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBhZGRUb0RlZmF1bHRDb25maWd1cmF0aW9uKExpc3QgZWxlbWVudHMpCi0JewotCQlyZXR1cm4gYWRkVG9EZWZhdWx0Q29uZmlndXJhdGlvbihlbGVtZW50cywgbnVsbCk7Ci0JfQotCQotCQotCS8qKgotCSAqIENoZWNrcyBhbmQgYWRkcyBlbGVtZW50cyB0byB0aGUgZGVmYXVsdCBjb25maWd1cmF0aW9uCi0JICogCi0JICogQHJldHVybiBmYWxzZSBpZiB1c2VyIGNhbmNlbGVkIHRoZSBvcGVyYXRpb24KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBhZGRUb0RlZmF1bHRDb25maWd1cmF0aW9uKExpc3QgZWxlbWVudHMsIElDb25maWd1cmF0b3IgY29uZmlndXJhdG9yKSB7Ci0JCWlmIChlbGVtZW50c1RvQWRkVG9EZWZhdWx0Q29uZmlnID09IG51bGwpIHsKLQkJCWVsZW1lbnRzVG9BZGRUb0RlZmF1bHRDb25maWcgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBlbGVtZW50cy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3QgZWxlbWVudCA9IGl0ZXIubmV4dCgpOwotCQkJCQotCQkJCXN3aXRjaCAoVXNlckludGVyYWN0aW9uSGVscGVyLmNoZWNrQWdhaW5zdERlZmF1bHRDb25maWd1cmF0aW9uKAotCQkJCQkJcHJvY2VzcywgZWxlbWVudCwgY29uZmlndXJhdG9yKSkgewotCQkJCWNhc2UgMDoKLQkJCQkJaXRlci5yZW1vdmUoKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAyOgotCQkJCQllbGVtZW50c1RvQWRkVG9EZWZhdWx0Q29uZmlnLmFkZChlbGVtZW50KTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAtMToKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCX0KLQkJCWlmICghZWxlbWVudHNUb0FkZFRvRGVmYXVsdENvbmZpZy5pc0VtcHR5KCkpIHsKLQkJCQlhZGRlZE9iamVjdHMgPSBuZXcgSGFzaFNldCgpOwotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGVsZW1lbnRzVG9BZGRUb0RlZmF1bHRDb25maWcuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJRU9iamVjdCBlbGVtZW50ID0gKEVPYmplY3QpIGl0ZXIubmV4dCgpOwotCQkJCQlQcm9jZXNzVXRpbC5hZGRUb0RlZmF1bHRDb25maWd1cmF0aW9uKHByb2Nlc3MsIGVsZW1lbnQsCi0JCQkJCQkJYWRkZWRPYmplY3RzKTsKLQkJCQl9Ci0JCQkJaWYgKCFhZGRlZE9iamVjdHMuaXNFbXB0eSgpKSB7Ci0JCQkJCWdldE1vZGlmaWVkUmVzb3VyY2VzKCkuYWRkKAotCQkJCQkJCXByb2Nlc3MuZ2V0RGVmYXVsdENvbnRleHQoKS5lUmVzb3VyY2UoKSk7Ci0JCQkJfQotCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQotCX0KLQotCXB1YmxpYyB2b2lkIHJlZG8oKSB7Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB1bmRvKCkgewotCQlpZiAoYWRkZWRPYmplY3RzICE9IG51bGwgJiYgIWFkZGVkT2JqZWN0cy5pc0VtcHR5KCkpIHsKLQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gZGVmYXVsdENvbmZpZyA9IHByb2Nlc3MuZ2V0RGVmYXVsdENvbnRleHQoKTsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGFkZGVkT2JqZWN0cy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3QgZWxlbWVudCA9IGl0ZXIubmV4dCgpOwotCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luKSB7Ci0JCQkJCWRlZmF1bHRDb25maWcuZ2V0TWV0aG9kUGx1Z2luU2VsZWN0aW9uKCkucmVtb3ZlKGVsZW1lbnQpOwotCQkJCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZFBhY2thZ2UpIHsKLQkJCQkJZGVmYXVsdENvbmZpZy5nZXRNZXRob2RQYWNrYWdlU2VsZWN0aW9uKCkucmVtb3ZlKGVsZW1lbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldE1vZGlmaWVkUmVzb3VyY2VzKCkgewotCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9BZGRSb2xlVG9UZWFtQ29tbWFuZC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvQWRkUm9sZVRvVGVhbUNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmU0ZDZiNS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9BZGRSb2xlVG9UZWFtQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Qcm9jZXNzVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGVhbVByb2ZpbGU7Ci0KLQotLyoqCi0gKiBDb21tYW5kIHRvIGFkZCByb2xlIHRvIHRlYW0gcHJvZmlsZQotICogIAotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEFkZFJvbGVUb1RlYW1Db21tYW5kIGV4dGVuZHMgQWRkTWV0aG9kRWxlbWVudENvbW1hbmQgewotCi0JcHJpdmF0ZSBMaXN0IHJvbGVzOwotCi0JcHJpdmF0ZSBMaXN0IHJvbGVEZXNjTGlzdDsKLQotCXByaXZhdGUgQWN0aXZpdHkgYWN0aXZpdHk7Ci0KLQlwcml2YXRlIFRlYW1Qcm9maWxlIHRlYW07Ci0KLQlwcml2YXRlIENvbGxlY3Rpb24gbW9kaWZpZWRSZXNvdXJjZXM7Ci0KLQlwcml2YXRlIExpc3QgZXhpc3RpbmdSb2xlRGVzY0xpc3Q7Ci0KLQlwdWJsaWMgQWRkUm9sZVRvVGVhbUNvbW1hbmQoVGVhbVByb2ZpbGUgdGVhbSwgTGlzdCByb2xlcykgewotCi0JCXN1cGVyKFRuZ1V0aWwuZ2V0T3duaW5nUHJvY2Vzcyh0ZWFtKSk7Ci0KLQkJdGhpcy5yb2xlcyA9IHJvbGVzOwotCQl0aGlzLnRlYW0gPSB0ZWFtOwotCi0JCXRoaXMuYWN0aXZpdHkgPSAoQWN0aXZpdHkpIFByb2Nlc3NVdGlsLmdldFBhcmVudEFjdGl2aXR5T2ZUZWFtKHRlYW0pOwotCi0JCXRoaXMubW9kaWZpZWRSZXNvdXJjZXMgPSBuZXcgSGFzaFNldCgpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQjZXhlY3V0ZSgpCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQotCQkvLyBhZGQgdG8gZGVmYXVsdCBjb25maWd1cmF0aW9uIGlmIG5vdCB0aGVyZSBhbHJlYWR5Ci0JCWlmICghc3VwZXIuYWRkVG9EZWZhdWx0Q29uZmlndXJhdGlvbihyb2xlcykpCi0JCQlyZXR1cm47Ci0KLQkJcm9sZURlc2NMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0b3IgPSByb2xlcy5pdGVyYXRvcigpOyBpdG9yLmhhc05leHQoKTspIHsKLQkJCVJvbGVEZXNjcmlwdG9yIHJvbGVEZXNjID0gUHJvY2Vzc1V0aWwKLQkJCQkJLmNyZWF0ZVJvbGVEZXNjcmlwdG9yKChSb2xlKSBpdG9yLm5leHQoKSk7Ci0JCQlyb2xlRGVzY0xpc3QuYWRkKHJvbGVEZXNjKTsKLQkJfQotCi0JCS8vIGF1dG9tYXRpYyBhc3NpZ25tZW50Ci0JCWV4aXN0aW5nUm9sZURlc2NMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlQcm9jZXNzVXRpbC5nZXRSb2xlRGVzY3JpcHRvcihUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCS5nZXRPQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpLCBhY3Rpdml0eSwKLQkJCQlleGlzdGluZ1JvbGVEZXNjTGlzdCwgcm9sZXMpOwotCi0JCXJlZG8oKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kI3JlZG8oKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlZG8oKSB7Ci0KLQkJaWYgKCFyb2xlRGVzY0xpc3QuaXNFbXB0eSgpKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0b3IgPSByb2xlRGVzY0xpc3QuaXRlcmF0b3IoKTsgaXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJdGVhbS5nZXRUZWFtUm9sZXMoKS5hZGQoKFJvbGVEZXNjcmlwdG9yKSBpdG9yLm5leHQoKSk7Ci0JCQl9Ci0JCX0KLQotCQlpZiAoIWV4aXN0aW5nUm9sZURlc2NMaXN0LmlzRW1wdHkoKSkgewotCQkJZm9yIChJdGVyYXRvciBpdG9yID0gZXhpc3RpbmdSb2xlRGVzY0xpc3QuaXRlcmF0b3IoKTsgaXRvcgotCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCXRlYW0uZ2V0VGVhbVJvbGVzKCkuYWRkKChSb2xlRGVzY3JpcHRvcikgaXRvci5uZXh0KCkpOwotCQkJfQotCQl9Ci0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kI3VuZG8oKQotCSAqLwotCXB1YmxpYyB2b2lkIHVuZG8oKSB7Ci0JCWlmICghcm9sZURlc2NMaXN0LmlzRW1wdHkoKSkgewotCQkJLy8gYmFzaWNhbGx5IHJlbW92ZSBmcm9tIGNvbmZpZ3VyYXRpb24gaWYgYW55dGhpbmcgd2FzIGFkZGVkCi0JCQlzdXBlci51bmRvKCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0b3IgPSByb2xlRGVzY0xpc3QuaXRlcmF0b3IoKTsgaXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJdGVhbS5nZXRUZWFtUm9sZXMoKS5yZW1vdmUoKFJvbGVEZXNjcmlwdG9yKSBpdG9yLm5leHQoKSk7Ci0JCQl9Ci0JCX0KLQkJaWYgKCFleGlzdGluZ1JvbGVEZXNjTGlzdC5pc0VtcHR5KCkpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRvciA9IGV4aXN0aW5nUm9sZURlc2NMaXN0Lml0ZXJhdG9yKCk7IGl0b3IKLQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQl0ZWFtLmdldFRlYW1Sb2xlcygpLnJlbW92ZSgoUm9sZURlc2NyaXB0b3IpIGl0b3IubmV4dCgpKTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHByZXBhcmUoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldE1vZGlmaWVkUmVzb3VyY2VzKCkgewotCi0JCWlmIChyb2xlcyAhPSBudWxsICYmICFyb2xlcy5pc0VtcHR5KCkpIHsKLQkJCWlmIChhY3Rpdml0eS5lUmVzb3VyY2UoKSAhPSBudWxsKSB7Ci0JCQkJbW9kaWZpZWRSZXNvdXJjZXMuYWRkKGFjdGl2aXR5LmVSZXNvdXJjZSgpKTsKLQkJCX0KLQkJCWlmICh0ZWFtLmVSZXNvdXJjZSgpICE9IG51bGwpIHsKLQkJCQltb2RpZmllZFJlc291cmNlcy5hZGQodGVhbS5lUmVzb3VyY2UoKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG1vZGlmaWVkUmVzb3VyY2VzOwotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldEFmZmVjdGVkT2JqZWN0cygpIHsKLQkJaWYgKHJvbGVEZXNjTGlzdCAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gcm9sZURlc2NMaXN0OwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRBZmZlY3RlZE9iamVjdHMoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9Bc3NpZ25QcmltYXJ5UGVyZm9ybWVyVG9UYXNrRGVzY3JpcHRvci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvQXNzaWduUHJpbWFyeVBlcmZvcm1lclRvVGFza0Rlc2NyaXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODVhOWZlMy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9Bc3NpZ25QcmltYXJ5UGVyZm9ybWVyVG9UYXNrRGVzY3JpcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51aS5Vc2VySW50ZXJhY3Rpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlByb2Nlc3NVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZWFtUHJvZmlsZTsKLQotCi0vKioKLSAqIAotICogQ29tbWFuZCB0byBhc3NpZ24gcHJpbWFyeSBwZXJmb3JtZXIgdG8gdGFzayBkZXNjcmlwdG9yCi0gKiAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBBc3NpZ25QcmltYXJ5UGVyZm9ybWVyVG9UYXNrRGVzY3JpcHRvciBleHRlbmRzCi0JCUFkZE1ldGhvZEVsZW1lbnRDb21tYW5kIHsKLQlwcml2YXRlIFJvbGVEZXNjcmlwdG9yIG5ld1JvbGVEZXNjID0gbnVsbDsKLQotCXByaXZhdGUgUm9sZURlc2NyaXB0b3Igb2xkUm9sZURlc2MgPSBudWxsOwotCi0JcHJpdmF0ZSBSb2xlIHJvbGU7Ci0KLQlwcml2YXRlIExpc3Qgcm9sZXM7Ci0KLQlwcml2YXRlIEFjdGl2aXR5IGFjdGl2aXR5OwotCi0JcHJpdmF0ZSBUYXNrRGVzY3JpcHRvciB0YXNrRGVzYzsKLQotCXByaXZhdGUgQ29sbGVjdGlvbiBtb2RpZmllZFJlc291cmNlczsKLQotCS8vIHByaXZhdGUgYm9vbGVhbiBkZXNjRXhpc3RzID0gZmFsc2U7Ci0KLQlwcml2YXRlIFRlYW1Qcm9maWxlIHRlYW07Ci0KLQlwcml2YXRlIE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnOwotCi0JcHJpdmF0ZSBib29sZWFuIGlzTmV3Um9sZURlc2NyaXB0b3IgPSBmYWxzZTsKLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBBc3NpZ25QcmltYXJ5UGVyZm9ybWVyVG9UYXNrRGVzY3JpcHRvcihUYXNrRGVzY3JpcHRvciB0YXNrRGVzYywKLQkJCVJvbGUgcm9sZSwgTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLQkJc3VwZXIoVG5nVXRpbC5nZXRPd25pbmdQcm9jZXNzKHRhc2tEZXNjKSk7Ci0KLQkJdGhpcy5yb2xlID0gcm9sZTsKLQkJdGhpcy50YXNrRGVzYyA9IHRhc2tEZXNjOwotCQl0aGlzLmNvbmZpZyA9IGNvbmZpZzsKLQotCQlyb2xlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJcm9sZXMuYWRkKHJvbGUpOwotCi0JCUFkYXB0ZXJGYWN0b3J5IGFGYWN0b3J5ID0gVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkuZ2V0V0JTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKTsKLQkJSXRlbVByb3ZpZGVyQWRhcHRlciBhZGFwdGVyID0gKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIGFGYWN0b3J5LmFkYXB0KAotCQkJCXRhc2tEZXNjLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQlPYmplY3QgcGFyZW50ID0gYWRhcHRlci5nZXRQYXJlbnQodGFza0Rlc2MpOwotCQlpZiAocGFyZW50IGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCXRoaXMuYWN0aXZpdHkgPSAoQWN0aXZpdHkpIHBhcmVudDsKLQkJfQotCi0JCXRoaXMubW9kaWZpZWRSZXNvdXJjZXMgPSBuZXcgSGFzaFNldCgpOyAKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kI2V4ZWN1dGUoKQotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCS8vIGFkZCB0byBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gaWYgbm90IHRoZXJlIGFscmVhZHkKLQkJaWYgKCFzdXBlci5hZGRUb0RlZmF1bHRDb25maWd1cmF0aW9uKHJvbGVzKSkKLQkJCXJldHVybjsKLQotCQlpZiAoIXJvbGVzLmlzRW1wdHkoKSkgewotCQkJaXNOZXdSb2xlRGVzY3JpcHRvciA9IGZhbHNlOwotCQkJLy8gY2hlY2sgZm9yIGxvY2FsIGRlc2NyaXB0b3IKLQkJCW5ld1JvbGVEZXNjID0gKFJvbGVEZXNjcmlwdG9yKSBQcm9jZXNzQ29tbWFuZFV0aWwuZ2V0RGVzY3JpcHRvcigKLQkJCQkJcm9sZSwgYWN0aXZpdHksIGNvbmZpZyk7Ci0JCQlpZiAobmV3Um9sZURlc2MgPT0gbnVsbCkgewotCQkJCS8vIGNoZWNrIGZvciBpbmhlcml0ZWQgZGVzY3JpcHRvcgotCQkJCW5ld1JvbGVEZXNjID0gKFJvbGVEZXNjcmlwdG9yKSBQcm9jZXNzQ29tbWFuZFV0aWwKLQkJCQkJCS5nZXRJbmhlcml0ZWREZXNjcmlwdG9yKHJvbGUsIGFjdGl2aXR5LCBjb25maWcpOwotCQkJCWlmIChuZXdSb2xlRGVzYyA9PSBudWxsKSB7Ci0KLQkJCQkJbmV3Um9sZURlc2MgPSBQcm9jZXNzVXRpbC5jcmVhdGVSb2xlRGVzY3JpcHRvcihyb2xlKTsKLQkJCQkJaXNOZXdSb2xlRGVzY3JpcHRvciA9IHRydWU7Ci0JCQkJfQotCQkJfQotCi0JCQkvLyBnZXQgdGVhbQotCQkJdGVhbSA9IFVzZXJJbnRlcmFjdGlvbkhlbHBlci5nZXRUZWFtKGFjdGl2aXR5LCByb2xlKTsKLQotCQkJcmVkbygpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZCNyZWRvKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWRvKCkgewotCi0JCXRhc2tEZXNjLmdldFBlcmZvcm1lZFByaW1hcmlseUJ5KCkuYWRkKG5ld1JvbGVEZXNjKTsKLQotCQlpZiAoaXNOZXdSb2xlRGVzY3JpcHRvcikgewotCQkJYWN0aXZpdHkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5hZGQobmV3Um9sZURlc2MpOwotCQl9Ci0KLQkJaWYgKHRlYW0gIT0gbnVsbCkgewotCQkJdGVhbS5nZXRUZWFtUm9sZXMoKS5hZGQobmV3Um9sZURlc2MpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdW5kbygpIHsKLQotCQlpZiAoIXJvbGVzLmlzRW1wdHkoKSkgewotCQkJLy8gcmVtb3ZlIGZyb20gY29uZmlndXJhdGlvbiBpZiBhZGRlZAotCQkJc3VwZXIudW5kbygpOwotCi0JCQl0YXNrRGVzYy5nZXRQZXJmb3JtZWRQcmltYXJpbHlCeSgpLnJlbW92ZShuZXdSb2xlRGVzYyk7Ci0KLQkJCWlmIChpc05ld1JvbGVEZXNjcmlwdG9yKSB7Ci0JCQkJYWN0aXZpdHkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5yZW1vdmUobmV3Um9sZURlc2MpOwotCQkJfQotCQkJaWYgKHRlYW0gIT0gbnVsbCkgewotCQkJCXRlYW0uZ2V0VGVhbVJvbGVzKCkucmVtb3ZlKG5ld1JvbGVEZXNjKTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHByZXBhcmUoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldE1vZGlmaWVkUmVzb3VyY2VzKCkgewotCi0JCWlmIChyb2xlICE9IG51bGwpIHsKLQkJCWlmIChhY3Rpdml0eS5lUmVzb3VyY2UoKSAhPSBudWxsKSB7Ci0JCQkJbW9kaWZpZWRSZXNvdXJjZXMuYWRkKGFjdGl2aXR5LmVSZXNvdXJjZSgpKTsKLQkJCX0KLQkJCWlmICh0YXNrRGVzYy5lUmVzb3VyY2UoKSAhPSBudWxsKSB7Ci0JCQkJbW9kaWZpZWRSZXNvdXJjZXMuYWRkKHRhc2tEZXNjLmVSZXNvdXJjZSgpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbW9kaWZpZWRSZXNvdXJjZXM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvQXNzaWduUm9sZVRvVGFza0Rlc2NyaXB0b3IuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL0Fzc2lnblJvbGVUb1Rhc2tEZXNjcmlwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxYmExYjQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvQXNzaWduUm9sZVRvVGFza0Rlc2NyaXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxOCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudWkuVXNlckludGVyYWN0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Qcm9jZXNzVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGVhbVByb2ZpbGU7Ci0KLQotLyoqCi0gKiBDb21tYW5kIGZvciBhc3NpZ24gcm9sZXMgdG8gdGFzayBkZXNjcmlwdG9yLiBJdCB3aWxsIGFzc2lnbiBwcmltYXJ5LCBhZGRpdGlvbmFsCi0gKiBwZXJmb3JtZXJzIGFuZCBhc3Npc3RlZCBieSB0byBhIHRhc2sgZGVzY3JpcHRvcgotICogCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQXNzaWduUm9sZVRvVGFza0Rlc2NyaXB0b3IgZXh0ZW5kcyBBZGRNZXRob2RFbGVtZW50Q29tbWFuZCB7Ci0KLQlwcml2YXRlIExpc3Qgcm9sZXM7Ci0KLQlwcml2YXRlIEFjdGl2aXR5IGFjdGl2aXR5OwotCi0JcHJpdmF0ZSBUYXNrRGVzY3JpcHRvciB0YXNrRGVzYzsKLQotCXByaXZhdGUgQ29sbGVjdGlvbiBtb2RpZmllZFJlc291cmNlczsKLQotCXByaXZhdGUgaW50IGFjdGlvbjsKLQotCUxpc3QgZXhpc3RpbmdSb2xlRGVzY0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQlMaXN0IG5ld1JvbGVEZXNjTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQotCXByaXZhdGUgSGFzaE1hcCBtYXAgPSBuZXcgSGFzaE1hcCgpOwotCi0JcHJpdmF0ZSBNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZzsKLQotCXByaXZhdGUgYm9vbGVhbiBpc05ld1JvbGVEZXNjcmlwdG9yID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBBc3NpZ24gcm9sZSB0byB0YXNrIGRlc2NyaXB0b3IgVXNlZCBmb3IgYm90aCBhZGRpdGlvbmFsbHkgcGVyZm9ybWVkIGJ5Ci0JICogYW5kIGFzc2lzdGVkIGJ5Ci0JICovCi0JcHVibGljIEFzc2lnblJvbGVUb1Rhc2tEZXNjcmlwdG9yKFRhc2tEZXNjcmlwdG9yIHRhc2tEZXNjLCBMaXN0IHJvbGVzLAotCQkJaW50IGFjdGlvbiwgTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLQotCQlzdXBlcihUbmdVdGlsLmdldE93bmluZ1Byb2Nlc3ModGFza0Rlc2MpKTsKLQotCQl0aGlzLnJvbGVzID0gcm9sZXM7Ci0JCXRoaXMudGFza0Rlc2MgPSB0YXNrRGVzYzsKLQkJdGhpcy5hY3Rpb24gPSBhY3Rpb247Ci0JCXRoaXMuY29uZmlnID0gY29uZmlnOwotCi0JCUFkYXB0ZXJGYWN0b3J5IGFGYWN0b3J5ID0gVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkuZ2V0V0JTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKTsKLQkJSXRlbVByb3ZpZGVyQWRhcHRlciBhZGFwdGVyID0gKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIGFGYWN0b3J5LmFkYXB0KAotCQkJCXRhc2tEZXNjLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQlPYmplY3QgcGFyZW50ID0gYWRhcHRlci5nZXRQYXJlbnQodGFza0Rlc2MpOwotCQlpZiAocGFyZW50IGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCXRoaXMuYWN0aXZpdHkgPSAoQWN0aXZpdHkpIHBhcmVudDsKLQkJfQotCi0JCXRoaXMubW9kaWZpZWRSZXNvdXJjZXMgPSBuZXcgSGFzaFNldCgpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQjZXhlY3V0ZSgpCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJCi0JCS8vIGFkZCB0byBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gaWYgbm90IHRoZXJlIGFscmVhZHkKLQkJaWYgKCFzdXBlci5hZGRUb0RlZmF1bHRDb25maWd1cmF0aW9uKHJvbGVzKSkKLQkJCXJldHVybjsKLQotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gcm9sZXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJLy8gYm9vbGVhbiBkZXNjRXhpc3RzID0gZmFsc2U7Ci0JCQlSb2xlIHJvbGUgPSAoUm9sZSkgaXQubmV4dCgpOwotCi0JCQlSb2xlRGVzY3JpcHRvciByb2xlRGVzYyA9IG51bGw7Ci0JCQlpc05ld1JvbGVEZXNjcmlwdG9yID0gZmFsc2U7Ci0JCQkvLyBjaGVjayBmb3IgbG9jYWwgZGVzY3JpcHRvcgotCQkJcm9sZURlc2MgPSAoUm9sZURlc2NyaXB0b3IpIFByb2Nlc3NDb21tYW5kVXRpbC5nZXREZXNjcmlwdG9yKHJvbGUsCi0JCQkJCWFjdGl2aXR5LCBjb25maWcpOwotCQkJaWYgKHJvbGVEZXNjID09IG51bGwpIHsKLQkJCQkvLyBjaGVjayBmb3IgaW5oZXJpdGVkIGRlc2NyaXB0b3IKLQkJCQlyb2xlRGVzYyA9IChSb2xlRGVzY3JpcHRvcikgUHJvY2Vzc0NvbW1hbmRVdGlsCi0JCQkJCQkuZ2V0SW5oZXJpdGVkRGVzY3JpcHRvcihyb2xlLCBhY3Rpdml0eSwgY29uZmlnKTsKLQkJCQlpZiAocm9sZURlc2MgPT0gbnVsbCkgewotCQkJCQlyb2xlRGVzYyA9IFByb2Nlc3NVdGlsLmNyZWF0ZVJvbGVEZXNjcmlwdG9yKHJvbGUpOwotCQkJCQlpc05ld1JvbGVEZXNjcmlwdG9yID0gdHJ1ZTsKLQotCQkJCX0KLQkJCX0KLQkJCWlmIChpc05ld1JvbGVEZXNjcmlwdG9yKQotCQkJCW5ld1JvbGVEZXNjTGlzdC5hZGQocm9sZURlc2MpOwotCQkJZWxzZQotCQkJCWV4aXN0aW5nUm9sZURlc2NMaXN0LmFkZChyb2xlRGVzYyk7Ci0KLQkJCS8vIGdldCB0ZWFtCi0JCQlUZWFtUHJvZmlsZSB0ZWFtID0gVXNlckludGVyYWN0aW9uSGVscGVyLmdldFRlYW0oYWN0aXZpdHksIHJvbGUpOwotCQkJaWYgKHRlYW0gIT0gbnVsbCkgewotCQkJCW1hcC5wdXQocm9sZURlc2MsIHRlYW0pOwotCQkJfQotCQl9Ci0KLQkJcmVkbygpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQjcmVkbygpCi0JICovCi0JcHVibGljIHZvaWQgcmVkbygpIHsKLQotCQlpZiAoYWN0aW9uID09IElBY3Rpb25UeXBlQ29uc3RhbnRzLkFERF9QUklNQVJZX1BFUkZPUk1FUikgewotCQkJdGFza0Rlc2MuZ2V0UGVyZm9ybWVkUHJpbWFyaWx5QnkoKS5hZGRBbGwoZXhpc3RpbmdSb2xlRGVzY0xpc3QpOwotCQkJdGFza0Rlc2MuZ2V0UGVyZm9ybWVkUHJpbWFyaWx5QnkoKS5hZGRBbGwobmV3Um9sZURlc2NMaXN0KTsKLQkJfSBlbHNlIGlmIChhY3Rpb24gPT0gSUFjdGlvblR5cGVDb25zdGFudHMuQUREX0FERElUSU9OQUxfUEVSRk9STUVSKSB7Ci0JCQl0YXNrRGVzYy5nZXRBZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSgpLmFkZEFsbChleGlzdGluZ1JvbGVEZXNjTGlzdCk7Ci0JCQl0YXNrRGVzYy5nZXRBZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSgpLmFkZEFsbChuZXdSb2xlRGVzY0xpc3QpOwotCQl9IGVsc2UgaWYgKGFjdGlvbiA9PSBJQWN0aW9uVHlwZUNvbnN0YW50cy5BRERfQVNTSVNURURfQlkpIHsKLQkJCXRhc2tEZXNjLmdldEFzc2lzdGVkQnkoKS5hZGRBbGwoZXhpc3RpbmdSb2xlRGVzY0xpc3QpOwotCQkJdGFza0Rlc2MuZ2V0QXNzaXN0ZWRCeSgpLmFkZEFsbChuZXdSb2xlRGVzY0xpc3QpOwotCQl9Ci0KLQkJYWN0aXZpdHkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5hZGRBbGwobmV3Um9sZURlc2NMaXN0KTsKLQotCQlpZiAobWFwICE9IG51bGwpIHsKLQkJCVNldCBrZXlzZXQgPSBtYXAua2V5U2V0KCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0b3IgPSBrZXlzZXQuaXRlcmF0b3IoKTsgaXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IGtleSA9IGl0b3IubmV4dCgpOwotCQkJCVRlYW1Qcm9maWxlIHRlYW0gPSAoVGVhbVByb2ZpbGUpIG1hcC5nZXQoa2V5KTsKLQotCQkJCS8vIGFkZCB0byB0ZWFtCi0JCQkJdGVhbS5nZXRUZWFtUm9sZXMoKS5hZGQoKFJvbGVEZXNjcmlwdG9yKSBrZXkpOwotCQkJfQotCQl9Ci0KLQkJCi0JfQotCi0JcHVibGljIHZvaWQgdW5kbygpIHsKLQotCQkvLyBiYXNpY2FsbHkgcmVtb3ZlIGZyb20gY29uZmlndXJhdGlvbiBpZiBhbnl0aGluZyB3YXMgYWRkZWQKLQkJc3VwZXIudW5kbygpOwotCi0JCWlmIChhY3Rpb24gPT0gSUFjdGlvblR5cGVDb25zdGFudHMuQUREX0FERElUSU9OQUxfUEVSRk9STUVSKSB7Ci0JCQl0YXNrRGVzYy5nZXRQZXJmb3JtZWRQcmltYXJpbHlCeSgpLnJlbW92ZUFsbCgKLQkJCQkJZXhpc3RpbmdSb2xlRGVzY0xpc3QpOwotCQkJdGFza0Rlc2MuZ2V0UGVyZm9ybWVkUHJpbWFyaWx5QnkoKS5yZW1vdmVBbGwobmV3Um9sZURlc2NMaXN0KTsKLQkJfSBlbHNlCWlmIChhY3Rpb24gPT0gSUFjdGlvblR5cGVDb25zdGFudHMuQUREX0FERElUSU9OQUxfUEVSRk9STUVSKSB7Ci0JCQl0YXNrRGVzYy5nZXRBZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSgpLnJlbW92ZUFsbCgKLQkJCQkJZXhpc3RpbmdSb2xlRGVzY0xpc3QpOwotCQkJdGFza0Rlc2MuZ2V0QWRkaXRpb25hbGx5UGVyZm9ybWVkQnkoKS5yZW1vdmVBbGwobmV3Um9sZURlc2NMaXN0KTsKLQkJfSBlbHNlIGlmIChhY3Rpb24gPT0gSUFjdGlvblR5cGVDb25zdGFudHMuQUREX0FTU0lTVEVEX0JZKSB7Ci0JCQl0YXNrRGVzYy5nZXRBc3Npc3RlZEJ5KCkucmVtb3ZlQWxsKGV4aXN0aW5nUm9sZURlc2NMaXN0KTsKLQkJCXRhc2tEZXNjLmdldEFzc2lzdGVkQnkoKS5yZW1vdmVBbGwobmV3Um9sZURlc2NMaXN0KTsKLQkJfQotCQlhY3Rpdml0eS5nZXRCcmVha2Rvd25FbGVtZW50cygpLnJlbW92ZUFsbChuZXdSb2xlRGVzY0xpc3QpOwotCi0JCWlmIChtYXAgIT0gbnVsbCkgewotCQkJU2V0IGtleXNldCA9IG1hcC5rZXlTZXQoKTsKLQkJCWZvciAoSXRlcmF0b3IgaXRvciA9IGtleXNldC5pdGVyYXRvcigpOyBpdG9yLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3Qga2V5ID0gaXRvci5uZXh0KCk7Ci0JCQkJVGVhbVByb2ZpbGUgdGVhbSA9IChUZWFtUHJvZmlsZSkgbWFwLmdldChrZXkpOwotCi0JCQkJLy8gcmVtb3ZlIGl0IGZyb20gdGVhbQotCQkJCXRlYW0uZ2V0VGVhbVJvbGVzKCkucmVtb3ZlKChSb2xlRGVzY3JpcHRvcikga2V5KTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHByZXBhcmUoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldE1vZGlmaWVkUmVzb3VyY2VzKCkgewotCi0JCWlmIChyb2xlcyAhPSBudWxsICYmICFyb2xlcy5pc0VtcHR5KCkpIHsKLQkJCWlmIChhY3Rpdml0eS5lUmVzb3VyY2UoKSAhPSBudWxsKSB7Ci0JCQkJbW9kaWZpZWRSZXNvdXJjZXMuYWRkKGFjdGl2aXR5LmVSZXNvdXJjZSgpKTsKLQkJCX0KLQkJCWlmICh0YXNrRGVzYy5lUmVzb3VyY2UoKSAhPSBudWxsKSB7Ci0JCQkJbW9kaWZpZWRSZXNvdXJjZXMuYWRkKHRhc2tEZXNjLmVSZXNvdXJjZSgpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbW9kaWZpZWRSZXNvdXJjZXM7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9Bc3NpZ25XUFRvRGVsaXZlcmFibGUuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL0Fzc2lnbldQVG9EZWxpdmVyYWJsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NmU2NDUxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL0Fzc2lnbldQVG9EZWxpdmVyYWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudWkuVXNlckludGVyYWN0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Qcm9jZXNzVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yOwotCi0KLS8qKgotICogCi0gKiBDb21tYW5kIHRvIGFzc2lnbiBkZWxpdmVyYWJsZSBwYXJ0cyB0byB3b3JrIHByb2R1Y3QgZGVzY3JpcHRvcgotICogCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQXNzaWduV1BUb0RlbGl2ZXJhYmxlIGV4dGVuZHMgQWRkTWV0aG9kRWxlbWVudENvbW1hbmQgewotCi0JcHJpdmF0ZSBMaXN0IHdvcmtQcm9kdWN0czsKLQotCXByaXZhdGUgQWN0aXZpdHkgYWN0aXZpdHk7Ci0KLQlwcml2YXRlIFdvcmtQcm9kdWN0RGVzY3JpcHRvciB3cERlc2M7Ci0KLQlwcml2YXRlIENvbGxlY3Rpb24gbW9kaWZpZWRSZXNvdXJjZXM7Ci0KLQlwcml2YXRlIEhhc2hNYXAgbWFwID0gbmV3IEhhc2hNYXAoKTsKLQotCUxpc3QgZXhpc3RpbmdXUERlc2NMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCi0JTGlzdCBuZXdXUERlc2NMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIEFzc2lnbldQVG9EZWxpdmVyYWJsZShXb3JrUHJvZHVjdERlc2NyaXB0b3Igd3BEZXNjLCBMaXN0IHdvcmtQcm9kdWN0cykgewotCQlzdXBlcihUbmdVdGlsLmdldE93bmluZ1Byb2Nlc3Mod3BEZXNjKSk7Ci0KLQkJdGhpcy53b3JrUHJvZHVjdHMgPSB3b3JrUHJvZHVjdHM7Ci0JCXRoaXMud3BEZXNjID0gd3BEZXNjOwotCi0JCU9iamVjdCBwYXJlbnQgPSBnZXRQYXJlbnRBY3Rpdml0eSh3cERlc2MpOwotCQlpZiAocGFyZW50IGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCXRoaXMuYWN0aXZpdHkgPSAoQWN0aXZpdHkpIHBhcmVudDsKLQkJfQotCi0JCXRoaXMubW9kaWZpZWRSZXNvdXJjZXMgPSBuZXcgSGFzaFNldCgpOwotCi0JfQotCi0JLyoqCi0JICogR2V0IHBhcmVudCBhY3Rpdml0eSBmb3IgYnJlYWtkb3duZWxlbWVudAotCSAqIAotCSAqIEBwYXJhbSBickVsZW1lbnQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBPYmplY3QgZ2V0UGFyZW50QWN0aXZpdHkoQnJlYWtkb3duRWxlbWVudCBickVsZW1lbnQpIHsKLQkJQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkgPSBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCS5nZXRQQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpOwotCQlJdGVtUHJvdmlkZXJBZGFwdGVyIGFkYXB0ZXIgPSAoSXRlbVByb3ZpZGVyQWRhcHRlcikgYWRhcHRlckZhY3RvcnkKLQkJCQkuYWRhcHQoYnJFbGVtZW50LCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQlPYmplY3QgcGFyZW50ID0gYWRhcHRlci5nZXRQYXJlbnQoYnJFbGVtZW50KTsKLQkJd2hpbGUgKCEocGFyZW50IGluc3RhbmNlb2YgQWN0aXZpdHkpKSB7Ci0JCQlickVsZW1lbnQgPSAoQnJlYWtkb3duRWxlbWVudCkgcGFyZW50OwotCQkJYWRhcHRlciA9IChJdGVtUHJvdmlkZXJBZGFwdGVyKSBhZGFwdGVyRmFjdG9yeS5hZGFwdChickVsZW1lbnQsCi0JCQkJCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCQlwYXJlbnQgPSBhZGFwdGVyLmdldFBhcmVudChickVsZW1lbnQpOwotCQl9Ci0KLQkJcmV0dXJuIHBhcmVudDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kI2V4ZWN1dGUoKQotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0KLQkJTGlzdCBicmVha2Rvd25FbGVtZW50cyA9IGFjdGl2aXR5LmdldEJyZWFrZG93bkVsZW1lbnRzKCk7Ci0KLQkJLy8gYWRkIHRvIGRlZmF1bHQgY29uZmlndXJhdGlvbiBpZiBub3QgdGhlcmUgYWxyZWFkeQotCQlpZiAoIXN1cGVyLmFkZFRvRGVmYXVsdENvbmZpZ3VyYXRpb24od29ya1Byb2R1Y3RzKSkKLQkJCXJldHVybjsKLQotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gd29ya1Byb2R1Y3RzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCWJvb2xlYW4gZGVzY0V4aXN0cyA9IGZhbHNlOwotCQkJV29ya1Byb2R1Y3Qgd3AgPSAoV29ya1Byb2R1Y3QpIGl0Lm5leHQoKTsKLQkJCVdvcmtQcm9kdWN0RGVzY3JpcHRvciBuZXdXcERlc2MgPSBudWxsOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBicmVha2Rvd25FbGVtZW50cy5zaXplKCk7IGkrKykgewotCQkJCUJyZWFrZG93bkVsZW1lbnQgZWxlbWVudCA9IChCcmVha2Rvd25FbGVtZW50KSBicmVha2Rvd25FbGVtZW50cwotCQkJCQkJLmdldChpKTsKLQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgewotCQkJCQluZXdXcERlc2MgPSAoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBlbGVtZW50OwotCQkJCQlXb3JrUHJvZHVjdCBlbGVtZW50V1AgPSBuZXdXcERlc2MuZ2V0V29ya1Byb2R1Y3QoKTsKLQkJCQkJaWYgKHdwLmVxdWFscyhlbGVtZW50V1ApKSB7Ci0JCQkJCQkvLyBpZiBmb3VuZCB1bmRlciB0aGUgcGFyZW50IGFjdGl2aXR5LCByZXR1cm4gdGhhdAotCQkJCQkJLy8gd3BkZXNjcmlwdG9yCi0JCQkJCQlkZXNjRXhpc3RzID0gdHJ1ZTsKLQotCQkJCQkJZXhpc3RpbmdXUERlc2NMaXN0LmFkZChlbGVtZW50KTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCi0JCQl9Ci0KLQkJCWlmICghZGVzY0V4aXN0cykgewotCQkJCW5ld1dQRGVzY0xpc3QuYWRkKFByb2Nlc3NVdGlsLmNyZWF0ZVdvcmtQcm9kdWN0RGVzY3JpcHRvcih3cCkpOwotCQkJfQotCi0JCQkvLyBnZXQgZGVsaXZlcmFibGUKLQkJCVdvcmtQcm9kdWN0RGVzY3JpcHRvciBkZWxpdmVyYWJsZSA9IFVzZXJJbnRlcmFjdGlvbkhlbHBlcgotCQkJCQkuZ2V0RGVsaXZlcmFibGUoYWN0aXZpdHksIHdwKTsKLQkJCWlmIChkZWxpdmVyYWJsZSAhPSBudWxsKSB7Ci0JCQkJbWFwLnB1dChuZXdXcERlc2MsIGRlbGl2ZXJhYmxlKTsKLQkJCX0KLQkJfQotCi0JCXJlZG8oKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kI3JlZG8oKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlZG8oKSB7Ci0KLQkJd3BEZXNjLmdldERlbGl2ZXJhYmxlUGFydHMoKS5hZGRBbGwoZXhpc3RpbmdXUERlc2NMaXN0KTsKLQkJd3BEZXNjLmdldERlbGl2ZXJhYmxlUGFydHMoKS5hZGRBbGwobmV3V1BEZXNjTGlzdCk7Ci0KLQkJLy8gYWN0aXZpdHkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5hZGRBbGwobmV3V1BEZXNjTGlzdCk7Ci0KLQkJCi0JfQotCi0JcHVibGljIHZvaWQgdW5kbygpIHsKLQotCQkvLyBiYXNpY2FsbHkgcmVtb3ZlIGZyb20gY29uZmlndXJhdGlvbiBpZiBhbnl0aGluZyB3YXMgYWRkZWQKLQkJc3VwZXIudW5kbygpOwotCi0JCXdwRGVzYy5nZXREZWxpdmVyYWJsZVBhcnRzKCkucmVtb3ZlQWxsKGV4aXN0aW5nV1BEZXNjTGlzdCk7Ci0JCXdwRGVzYy5nZXREZWxpdmVyYWJsZVBhcnRzKCkucmVtb3ZlQWxsKG5ld1dQRGVzY0xpc3QpOwotCi0JCS8vIGFjdGl2aXR5LmdldEJyZWFrZG93bkVsZW1lbnRzKCkucmVtb3ZlQWxsKG5ld1dQRGVzY0xpc3QpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHByZXBhcmUoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldE1vZGlmaWVkUmVzb3VyY2VzKCkgewotCQlpZiAod29ya1Byb2R1Y3RzICE9IG51bGwgJiYgICF3b3JrUHJvZHVjdHMuaXNFbXB0eSgpKSB7Ci0JCQlpZiAoYWN0aXZpdHkuZVJlc291cmNlKCkgIT0gbnVsbCkgewotCQkJCW1vZGlmaWVkUmVzb3VyY2VzLmFkZChhY3Rpdml0eS5lUmVzb3VyY2UoKSk7Ci0JCQl9Ci0JCQlpZiAod3BEZXNjLmVSZXNvdXJjZSgpICE9IG51bGwpIHsKLQkJCQltb2RpZmllZFJlc291cmNlcy5hZGQod3BEZXNjLmVSZXNvdXJjZSgpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbW9kaWZpZWRSZXNvdXJjZXM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvQXNzaWduV1BUb1JvbGVEZXNjcmlwdG9yLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9Bc3NpZ25XUFRvUm9sZURlc2NyaXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTRkNTY0OC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9Bc3NpZ25XUFRvUm9sZURlc2NyaXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwMCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudWkuVXNlckludGVyYWN0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Qcm9jZXNzVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3I7Ci0KLQotLyoqCi0gKiBDb21tYW5kIHRvIGFzc2lnbiB3b3JrIHByb2R1Y3RzIHRvIHJvbGUgZGVzY3JpcHRvcnMuIEl0IHdpbGwgc2V0IHJlcG9uc2libGUKLSAqIHJvbGUgZmVhdHVyZS4KLSAqIAotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEFzc2lnbldQVG9Sb2xlRGVzY3JpcHRvciBleHRlbmRzIEFkZE1ldGhvZEVsZW1lbnRDb21tYW5kIHsKLQotCXByaXZhdGUgTGlzdCB3b3JrUHJvZHVjdHM7Ci0KLQlwcml2YXRlIEFjdGl2aXR5IGFjdGl2aXR5OwotCi0JcHJpdmF0ZSBSb2xlRGVzY3JpcHRvciByb2xlRGVzYzsKLQotCXByaXZhdGUgQ29sbGVjdGlvbiBtb2RpZmllZFJlc291cmNlczsKLQotCXByaXZhdGUgSGFzaE1hcCBtYXAgPSBuZXcgSGFzaE1hcCgpOwotCi0JcHJpdmF0ZSBpbnQgYWN0aW9uOwotCi0JTGlzdCBleGlzdGluZ1dQRGVzY0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQlMaXN0IG5ld1dQRGVzY0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQlwcml2YXRlIE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnOwotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIEFzc2lnbldQVG9Sb2xlRGVzY3JpcHRvcihSb2xlRGVzY3JpcHRvciByb2xlRGVzYywgTGlzdCB3b3JrUHJvZHVjdHMsCi0JCQlpbnQgYWN0aW9uLCBNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZykgewotCi0JCXN1cGVyKFRuZ1V0aWwuZ2V0T3duaW5nUHJvY2Vzcyhyb2xlRGVzYykpOwotCi0JCXRoaXMud29ya1Byb2R1Y3RzID0gd29ya1Byb2R1Y3RzOwotCQl0aGlzLnJvbGVEZXNjID0gcm9sZURlc2M7Ci0JCXRoaXMuYWN0aW9uID0gYWN0aW9uOwotCQl0aGlzLmNvbmZpZyA9IGNvbmZpZzsKLQotCQlBZGFwdGVyRmFjdG9yeSBhRmFjdG9yeSA9IFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJLmdldE9CU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCk7Ci0JCUl0ZW1Qcm92aWRlckFkYXB0ZXIgYWRhcHRlciA9IChJdGVtUHJvdmlkZXJBZGFwdGVyKSBhRmFjdG9yeS5hZGFwdCgKLQkJCQlyb2xlRGVzYywgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJT2JqZWN0IHBhcmVudCA9IGFkYXB0ZXIuZ2V0UGFyZW50KHJvbGVEZXNjKTsKLQkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQl0aGlzLmFjdGl2aXR5ID0gKEFjdGl2aXR5KSBwYXJlbnQ7Ci0JCX0KLQkJdGhpcy5tb2RpZmllZFJlc291cmNlcyA9IG5ldyBIYXNoU2V0KCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZCNleGVjdXRlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQkvLyBhZGQgdG8gZGVmYXVsdCBjb25maWd1cmF0aW9uIGlmIG5vdCB0aGVyZSBhbHJlYWR5Ci0JCWlmICghc3VwZXIuYWRkVG9EZWZhdWx0Q29uZmlndXJhdGlvbih3b3JrUHJvZHVjdHMpKQotCQkJcmV0dXJuOwotCi0JCWZvciAoSXRlcmF0b3IgaXQgPSB3b3JrUHJvZHVjdHMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJV29ya1Byb2R1Y3Qgd3AgPSAoV29ya1Byb2R1Y3QpIGl0Lm5leHQoKTsKLQkJCVdvcmtQcm9kdWN0RGVzY3JpcHRvciBuZXdXcERlc2MgPSBudWxsOwotCi0JCQlib29sZWFuIGlzTmV3RGVzY3JpcHRvciA9IGZhbHNlOwotCQkJLy8gY2hlY2sgZm9yIGxvY2FsIGRlc2NyaXB0b3IKLQkJCW5ld1dwRGVzYyA9IChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIFByb2Nlc3NDb21tYW5kVXRpbAotCQkJCQkuZ2V0RGVzY3JpcHRvcih3cCwgYWN0aXZpdHksIGNvbmZpZyk7Ci0JCQlpZiAobmV3V3BEZXNjID09IG51bGwpIHsKLQkJCQkvLyBjaGVjayBmb3IgaW5oZXJpdGVkIGRlc2NyaXB0b3IKLQkJCQluZXdXcERlc2MgPSAoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBQcm9jZXNzQ29tbWFuZFV0aWwKLQkJCQkJCS5nZXRJbmhlcml0ZWREZXNjcmlwdG9yKHdwLCBhY3Rpdml0eSwgY29uZmlnKTsKLQkJCQlpZiAobmV3V3BEZXNjID09IG51bGwpIHsKLQkJCQkJbmV3V3BEZXNjID0gUHJvY2Vzc1V0aWwuY3JlYXRlV29ya1Byb2R1Y3REZXNjcmlwdG9yKHdwKTsKLQkJCQkJaXNOZXdEZXNjcmlwdG9yID0gdHJ1ZTsKLQotCQkJCX0KLQkJCX0KLQkJCWlmIChpc05ld0Rlc2NyaXB0b3IpCi0JCQkJbmV3V1BEZXNjTGlzdC5hZGQobmV3V3BEZXNjKTsKLQkJCWVsc2UKLQkJCQlleGlzdGluZ1dQRGVzY0xpc3QuYWRkKG5ld1dwRGVzYyk7Ci0KLQkJCS8vIGdldCBkZWxpdmVyYWJsZQotCQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yIGRlbGl2ZXJhYmxlID0gVXNlckludGVyYWN0aW9uSGVscGVyCi0JCQkJCS5nZXREZWxpdmVyYWJsZShhY3Rpdml0eSwgd3ApOwotCQkJaWYgKGRlbGl2ZXJhYmxlICE9IG51bGwpIHsKLQkJCQltYXAucHV0KG5ld1dwRGVzYywgZGVsaXZlcmFibGUpOwotCQkJfQotCQl9Ci0KLQkJcmVkbygpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQjcmVkbygpCi0JICovCi0JcHVibGljIHZvaWQgcmVkbygpIHsKLQotCQlpZiAoYWN0aW9uID09IElBY3Rpb25UeXBlQ29uc3RhbnRzLkFERF9SRVNQT05TSUJMRV9GT1IpIHsKLQkJCXJvbGVEZXNjLmdldFJlc3BvbnNpYmxlRm9yKCkuYWRkQWxsKGV4aXN0aW5nV1BEZXNjTGlzdCk7Ci0JCQlyb2xlRGVzYy5nZXRSZXNwb25zaWJsZUZvcigpLmFkZEFsbChuZXdXUERlc2NMaXN0KTsKLQkJfQotCi0JCWFjdGl2aXR5LmdldEJyZWFrZG93bkVsZW1lbnRzKCkuYWRkQWxsKG5ld1dQRGVzY0xpc3QpOwotCi0JCWlmIChtYXAgIT0gbnVsbCkgewotCQkJU2V0IGtleXNldCA9IG1hcC5rZXlTZXQoKTsKLQkJCWZvciAoSXRlcmF0b3IgaXRvciA9IGtleXNldC5pdGVyYXRvcigpOyBpdG9yLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3Qga2V5ID0gaXRvci5uZXh0KCk7Ci0JCQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yIHdwRGVzYyA9IChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIG1hcAotCQkJCQkJLmdldChrZXkpOwotCi0JCQkJLy8gYWRkIHRvIGRlbGl2ZXJhYmxlCi0JCQkJd3BEZXNjLmdldERlbGl2ZXJhYmxlUGFydHMoKS5hZGQoKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikga2V5KTsKLQkJCX0KLQkJfQotCi0JCQotCX0KLQotCXB1YmxpYyB2b2lkIHVuZG8oKSB7Ci0KLQkJLy8gcmVtb3ZlIGZyb20gY29uZmlndXJhdGlvbiBpZiBhbnl0aGluZyB3YXMgYWRkZWQKLQkJc3VwZXIudW5kbygpOwotCi0JCWlmIChhY3Rpb24gPT0gSUFjdGlvblR5cGVDb25zdGFudHMuQUREX1JFU1BPTlNJQkxFX0ZPUikgewotCQkJcm9sZURlc2MuZ2V0UmVzcG9uc2libGVGb3IoKS5yZW1vdmVBbGwoZXhpc3RpbmdXUERlc2NMaXN0KTsKLQkJCXJvbGVEZXNjLmdldFJlc3BvbnNpYmxlRm9yKCkucmVtb3ZlQWxsKG5ld1dQRGVzY0xpc3QpOwotCQl9Ci0KLQkJYWN0aXZpdHkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5yZW1vdmVBbGwobmV3V1BEZXNjTGlzdCk7Ci0KLQkJaWYgKG1hcCAhPSBudWxsKSB7Ci0JCQlTZXQga2V5c2V0ID0gbWFwLmtleVNldCgpOwotCQkJZm9yIChJdGVyYXRvciBpdG9yID0ga2V5c2V0Lml0ZXJhdG9yKCk7IGl0b3IuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBrZXkgPSBpdG9yLm5leHQoKTsKLQkJCQlXb3JrUHJvZHVjdERlc2NyaXB0b3Igd3BEZXNjID0gKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgbWFwCi0JCQkJCQkuZ2V0KGtleSk7Ci0KLQkJCQkvLyByZW1vdmUgaXQgZnJvbSBkZWxpdmVyYWJsZQotCQkJCXdwRGVzYy5nZXREZWxpdmVyYWJsZVBhcnRzKCkKLQkJCQkJCS5yZW1vdmUoKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikga2V5KTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHByZXBhcmUoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldE1vZGlmaWVkUmVzb3VyY2VzKCkgewotCQlpZiAod29ya1Byb2R1Y3RzICE9IG51bGwgJiYgICF3b3JrUHJvZHVjdHMuaXNFbXB0eSgpKSB7Ci0JCQlpZiAoYWN0aXZpdHkuZVJlc291cmNlKCkgIT0gbnVsbCkgewotCQkJCW1vZGlmaWVkUmVzb3VyY2VzLmFkZChhY3Rpdml0eS5lUmVzb3VyY2UoKSk7Ci0JCQl9Ci0JCQlpZiAocm9sZURlc2MuZVJlc291cmNlKCkgIT0gbnVsbCkgewotCQkJCW1vZGlmaWVkUmVzb3VyY2VzLmFkZChyb2xlRGVzYy5lUmVzb3VyY2UoKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG1vZGlmaWVkUmVzb3VyY2VzOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL0Fzc2lnbldQVG9UYXNrRGVzY3JpcHRvci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvQXNzaWduV1BUb1Rhc2tEZXNjcmlwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmMzg5ZGYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvQXNzaWduV1BUb1Rhc2tEZXNjcmlwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnVpLlVzZXJJbnRlcmFjdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuUHJvY2Vzc1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yOwotCi0KLS8qKgotICogQ29tbWFuZCB0byBhc3NpZ24gd29yayBwcm9kdWN0cyB0byB0YXNrIGRlc2NyaXB0b3IuIEl0IHdpbGwgc2V0IGV4dGVybmFsCi0gKiBpbnB1dHMsIG1hbmRhdG9yeSBpbnB1dHMsIG9wdGlvbmFsIGlucHV0cyBhbmQgb3V0cHV0cy4KLSAqIAotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEFzc2lnbldQVG9UYXNrRGVzY3JpcHRvciBleHRlbmRzIEFkZE1ldGhvZEVsZW1lbnRDb21tYW5kIHsKLQotCXByaXZhdGUgTGlzdCB3b3JrUHJvZHVjdHM7Ci0KLQlwcml2YXRlIEFjdGl2aXR5IGFjdGl2aXR5OwotCi0JcHJpdmF0ZSBUYXNrRGVzY3JpcHRvciB0YXNrRGVzYzsKLQotCXByaXZhdGUgQ29sbGVjdGlvbiBtb2RpZmllZFJlc291cmNlczsKLQotCXByaXZhdGUgaW50IGFjdGlvbjsKLQotCXByaXZhdGUgSGFzaE1hcCBtYXAgPSBuZXcgSGFzaE1hcCgpOwotCi0JTGlzdCBleGlzdGluZ1dQRGVzY0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQlMaXN0IG5ld1dQRGVzY0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQlwcml2YXRlIE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnOwotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIEFzc2lnbldQVG9UYXNrRGVzY3JpcHRvcihUYXNrRGVzY3JpcHRvciB0YXNrRGVzYywgTGlzdCB3b3JrUHJvZHVjdHMsCi0JCQlpbnQgYWN0aW9uLCBNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZykgewotCQlzdXBlcihUbmdVdGlsLmdldE93bmluZ1Byb2Nlc3ModGFza0Rlc2MpKTsKLQotCQl0aGlzLndvcmtQcm9kdWN0cyA9IHdvcmtQcm9kdWN0czsKLQkJdGhpcy50YXNrRGVzYyA9IHRhc2tEZXNjOwotCQl0aGlzLmFjdGlvbiA9IGFjdGlvbjsKLQkJdGhpcy5jb25maWcgPSBjb25maWc7Ci0KLQkJQWRhcHRlckZhY3RvcnkgYUZhY3RvcnkgPSBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCS5nZXRXQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpOwotCQlJdGVtUHJvdmlkZXJBZGFwdGVyIGFkYXB0ZXIgPSAoSXRlbVByb3ZpZGVyQWRhcHRlcikgYUZhY3RvcnkuYWRhcHQoCi0JCQkJdGFza0Rlc2MsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCU9iamVjdCBwYXJlbnQgPSBhZGFwdGVyLmdldFBhcmVudCh0YXNrRGVzYyk7Ci0JCWlmIChwYXJlbnQgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJdGhpcy5hY3Rpdml0eSA9IChBY3Rpdml0eSkgcGFyZW50OwotCQl9Ci0JCXRoaXMubW9kaWZpZWRSZXNvdXJjZXMgPSBuZXcgSGFzaFNldCgpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQjZXhlY3V0ZSgpCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJLy8gYWRkIHRvIGRlZmF1bHQgY29uZmlndXJhdGlvbiBpZiBub3QgdGhlcmUgYWxyZWFkeQotCQlpZiAoIXN1cGVyLmFkZFRvRGVmYXVsdENvbmZpZ3VyYXRpb24od29ya1Byb2R1Y3RzKSkKLQkJCXJldHVybjsKLQotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gd29ya1Byb2R1Y3RzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCVdvcmtQcm9kdWN0IHdwID0gKFdvcmtQcm9kdWN0KSBpdC5uZXh0KCk7Ci0JCQlXb3JrUHJvZHVjdERlc2NyaXB0b3IgbmV3V3BEZXNjID0gbnVsbDsKLQotCQkJYm9vbGVhbiBpc05ld0Rlc2NyaXB0b3IgPSBmYWxzZTsKLQkJCS8vIGNoZWNrIGZvciBsb2NhbCBkZXNjcmlwdG9yCi0JCQluZXdXcERlc2MgPSAoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBQcm9jZXNzQ29tbWFuZFV0aWwKLQkJCQkJLmdldERlc2NyaXB0b3Iod3AsIGFjdGl2aXR5LCBjb25maWcpOwotCQkJaWYgKG5ld1dwRGVzYyA9PSBudWxsKSB7Ci0JCQkJLy8gY2hlY2sgZm9yIGluaGVyaXRlZCBkZXNjcmlwdG9yCi0JCQkJbmV3V3BEZXNjID0gKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgUHJvY2Vzc0NvbW1hbmRVdGlsCi0JCQkJCQkuZ2V0SW5oZXJpdGVkRGVzY3JpcHRvcih3cCwgYWN0aXZpdHksIGNvbmZpZyk7Ci0JCQkJaWYgKG5ld1dwRGVzYyA9PSBudWxsKSB7Ci0JCQkJCW5ld1dwRGVzYyA9IFByb2Nlc3NVdGlsLmNyZWF0ZVdvcmtQcm9kdWN0RGVzY3JpcHRvcih3cCk7Ci0JCQkJCWlzTmV3RGVzY3JpcHRvciA9IHRydWU7Ci0KLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoaXNOZXdEZXNjcmlwdG9yKQotCQkJCW5ld1dQRGVzY0xpc3QuYWRkKG5ld1dwRGVzYyk7Ci0JCQllbHNlCi0JCQkJZXhpc3RpbmdXUERlc2NMaXN0LmFkZChuZXdXcERlc2MpOwotCi0JCQkvLyBnZXQgZGVsaXZlcmFibGUKLQkJCVdvcmtQcm9kdWN0RGVzY3JpcHRvciBkZWxpdmVyYWJsZSA9IFVzZXJJbnRlcmFjdGlvbkhlbHBlcgotCQkJCQkuZ2V0RGVsaXZlcmFibGUoYWN0aXZpdHksIHdwKTsKLQkJCWlmIChkZWxpdmVyYWJsZSAhPSBudWxsKSB7Ci0JCQkJbWFwLnB1dChuZXdXcERlc2MsIGRlbGl2ZXJhYmxlKTsKLQkJCX0KLQkJfQotCi0JCXJlZG8oKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kI3JlZG8oKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlZG8oKSB7Ci0KLQkJaWYgKGFjdGlvbiA9PSBJQWN0aW9uVHlwZUNvbnN0YW50cy5BRERfRVhURVJOQUxfSU5QVVQpIHsKLQkJCXRhc2tEZXNjLmdldEV4dGVybmFsSW5wdXQoKS5hZGRBbGwoZXhpc3RpbmdXUERlc2NMaXN0KTsKLQkJCXRhc2tEZXNjLmdldEV4dGVybmFsSW5wdXQoKS5hZGRBbGwobmV3V1BEZXNjTGlzdCk7Ci0JCX0gZWxzZSBpZiAoYWN0aW9uID09IElBY3Rpb25UeXBlQ29uc3RhbnRzLkFERF9NQU5EQVRPUllfSU5QVVQpIHsKLQkJCXRhc2tEZXNjLmdldE1hbmRhdG9yeUlucHV0KCkuYWRkQWxsKGV4aXN0aW5nV1BEZXNjTGlzdCk7Ci0JCQl0YXNrRGVzYy5nZXRNYW5kYXRvcnlJbnB1dCgpLmFkZEFsbChuZXdXUERlc2NMaXN0KTsKLQkJfSBlbHNlIGlmIChhY3Rpb24gPT0gSUFjdGlvblR5cGVDb25zdGFudHMuQUREX09QVElPTkFMX0lOUFVUKSB7Ci0JCQl0YXNrRGVzYy5nZXRPcHRpb25hbElucHV0KCkuYWRkQWxsKGV4aXN0aW5nV1BEZXNjTGlzdCk7Ci0JCQl0YXNrRGVzYy5nZXRPcHRpb25hbElucHV0KCkuYWRkQWxsKG5ld1dQRGVzY0xpc3QpOwotCQl9IGVsc2UgaWYgKGFjdGlvbiA9PSBJQWN0aW9uVHlwZUNvbnN0YW50cy5BRERfT1VUUFVUKSB7Ci0JCQl0YXNrRGVzYy5nZXRPdXRwdXQoKS5hZGRBbGwoZXhpc3RpbmdXUERlc2NMaXN0KTsKLQkJCXRhc2tEZXNjLmdldE91dHB1dCgpLmFkZEFsbChuZXdXUERlc2NMaXN0KTsKLQkJfQotCi0JCWFjdGl2aXR5LmdldEJyZWFrZG93bkVsZW1lbnRzKCkuYWRkQWxsKG5ld1dQRGVzY0xpc3QpOwotCi0JCWlmIChtYXAgIT0gbnVsbCkgewotCQkJU2V0IGtleXNldCA9IG1hcC5rZXlTZXQoKTsKLQkJCWZvciAoSXRlcmF0b3IgaXRvciA9IGtleXNldC5pdGVyYXRvcigpOyBpdG9yLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3Qga2V5ID0gaXRvci5uZXh0KCk7Ci0JCQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yIHdwRGVzYyA9IChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIG1hcAotCQkJCQkJLmdldChrZXkpOwotCi0JCQkJLy8gYWRkIHRvIGRlbGl2ZXJhYmxlCi0JCQkJd3BEZXNjLmdldERlbGl2ZXJhYmxlUGFydHMoKS5hZGQoKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikga2V5KTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHVuZG8oKSB7Ci0KLQkJLy8gcmVtb3ZlIGZyb20gY29uZmlndXJhdGlvbiBpZiBhbnl0aGluZyB3YXMgYWRkZWQKLQkJc3VwZXIudW5kbygpOwotCi0JCWlmIChhY3Rpb24gPT0gSUFjdGlvblR5cGVDb25zdGFudHMuQUREX0VYVEVSTkFMX0lOUFVUKSB7Ci0JCQl0YXNrRGVzYy5nZXRFeHRlcm5hbElucHV0KCkucmVtb3ZlQWxsKGV4aXN0aW5nV1BEZXNjTGlzdCk7Ci0JCQl0YXNrRGVzYy5nZXRFeHRlcm5hbElucHV0KCkucmVtb3ZlQWxsKG5ld1dQRGVzY0xpc3QpOwotCQl9IGVsc2UgaWYgKGFjdGlvbiA9PSBJQWN0aW9uVHlwZUNvbnN0YW50cy5BRERfTUFOREFUT1JZX0lOUFVUKSB7Ci0JCQl0YXNrRGVzYy5nZXRNYW5kYXRvcnlJbnB1dCgpLnJlbW92ZUFsbChleGlzdGluZ1dQRGVzY0xpc3QpOwotCQkJdGFza0Rlc2MuZ2V0TWFuZGF0b3J5SW5wdXQoKS5yZW1vdmVBbGwobmV3V1BEZXNjTGlzdCk7Ci0JCX0gZWxzZSBpZiAoYWN0aW9uID09IElBY3Rpb25UeXBlQ29uc3RhbnRzLkFERF9PUFRJT05BTF9JTlBVVCkgewotCQkJdGFza0Rlc2MuZ2V0T3B0aW9uYWxJbnB1dCgpLnJlbW92ZUFsbChleGlzdGluZ1dQRGVzY0xpc3QpOwotCQkJdGFza0Rlc2MuZ2V0T3B0aW9uYWxJbnB1dCgpLnJlbW92ZUFsbChuZXdXUERlc2NMaXN0KTsKLQkJfSBlbHNlIGlmIChhY3Rpb24gPT0gSUFjdGlvblR5cGVDb25zdGFudHMuQUREX09VVFBVVCkgewotCQkJdGFza0Rlc2MuZ2V0T3V0cHV0KCkucmVtb3ZlQWxsKGV4aXN0aW5nV1BEZXNjTGlzdCk7Ci0JCQl0YXNrRGVzYy5nZXRPdXRwdXQoKS5yZW1vdmVBbGwobmV3V1BEZXNjTGlzdCk7Ci0JCX0KLQkJYWN0aXZpdHkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5yZW1vdmVBbGwobmV3V1BEZXNjTGlzdCk7Ci0KLQkJaWYgKG1hcCAhPSBudWxsKSB7Ci0JCQlTZXQga2V5c2V0ID0gbWFwLmtleVNldCgpOwotCQkJZm9yIChJdGVyYXRvciBpdG9yID0ga2V5c2V0Lml0ZXJhdG9yKCk7IGl0b3IuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBrZXkgPSBpdG9yLm5leHQoKTsKLQkJCQlXb3JrUHJvZHVjdERlc2NyaXB0b3Igd3BEZXNjID0gKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgbWFwCi0JCQkJCQkuZ2V0KGtleSk7Ci0KLQkJCQkvLyByZW1vdmUgaXQgZnJvbSBkZWxpdmVyYWJsZQotCQkJCXdwRGVzYy5nZXREZWxpdmVyYWJsZVBhcnRzKCkKLQkJCQkJCS5yZW1vdmUoKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikga2V5KTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHByZXBhcmUoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldE1vZGlmaWVkUmVzb3VyY2VzKCkgewotCQlpZiAod29ya1Byb2R1Y3RzICE9IG51bGwgJiYgICF3b3JrUHJvZHVjdHMuaXNFbXB0eSgpKSB7Ci0JCQlpZiAoYWN0aXZpdHkuZVJlc291cmNlKCkgIT0gbnVsbCkgewotCQkJCW1vZGlmaWVkUmVzb3VyY2VzLmFkZChhY3Rpdml0eS5lUmVzb3VyY2UoKSk7Ci0JCQl9Ci0JCQlpZiAodGFza0Rlc2MuZVJlc291cmNlKCkgIT0gbnVsbCkgewotCQkJCW1vZGlmaWVkUmVzb3VyY2VzLmFkZCh0YXNrRGVzYy5lUmVzb3VyY2UoKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG1vZGlmaWVkUmVzb3VyY2VzOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL0JTRHJhZ0FuZERyb3BDb21tYW5kLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9CU0RyYWdBbmREcm9wQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMjY3ZWZhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL0JTRHJhZ0FuZERyb3BDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tcG91bmRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5JZGVudGl0eUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLlVuZXhlY3V0YWJsZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuUmVzb3VyY2VBd2FyZUNvbXBvdW5kQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuUmVzb3VyY2VBd2FyZURyYWdBbmREcm9wQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnVpLlVzZXJJbnRlcmFjdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb24uRGVwZW5kZW5jeUNoZWNrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzOwotCi0KLS8qKgotICogQWJzdHJhY3QgZHJhZyBhbmQgZHJvcCBjb21tYW5kIGZvciBwcm9jZXNzIGF1dGhvcmluZwotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEJTRHJhZ0FuZERyb3BDb21tYW5kIGV4dGVuZHMgUmVzb3VyY2VBd2FyZURyYWdBbmREcm9wQ29tbWFuZCB7Ci0KLQkvKioKLQkgKiBAcGFyYW0gZG9tYWluCi0JICogQHBhcmFtIG93bmVyCi0JICogQHBhcmFtIGxvY2F0aW9uCi0JICogQHBhcmFtIG9wZXJhdGlvbnMKLQkgKiBAcGFyYW0gb3BlcmF0aW9uCi0JICogQHBhcmFtIGNvbGxlY3Rpb24KLQkgKi8KLQlwdWJsaWMgQlNEcmFnQW5kRHJvcENvbW1hbmQoRWRpdGluZ0RvbWFpbiBkb21haW4sIE9iamVjdCBvd25lciwKLQkJCWZsb2F0IGxvY2F0aW9uLCBpbnQgb3BlcmF0aW9ucywgaW50IG9wZXJhdGlvbiwgQ29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKGRvbWFpbiwgb3duZXIsIGxvY2F0aW9uLCBvcGVyYXRpb25zLCBvcGVyYXRpb24sIGNvbGxlY3Rpb24pOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHByZXBhcmVEcm9wQ29weU9uKCkgewotCQlyZXR1cm4gcHJlcGFyZURyb3BMaW5rT24oKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBwcmVwYXJlRHJvcExpbmtPbigpIHsKLQkJZHJhZ0NvbW1hbmQgPSBJZGVudGl0eUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCWRyb3BDb21tYW5kID0gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQotCQlBcnJheUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJQXJyYXlMaXN0IGFjdExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGNvbGxlY3Rpb24uaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3Qgb2JqID0gaXRlci5uZXh0KCk7Ci0JCQlPYmplY3QgZSA9IFRuZ1V0aWwudW53cmFwKG9iaik7Ci0JCQlpZiAoVG5nVXRpbC5pc0xvY2tlZCgoRU9iamVjdCkgb3duZXIpKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCWlmIChhY2NlcHQoZSkpIHsKLQkJCQlsaXN0LmFkZChlKTsKLQkJCX0KLQkJCS8vIGVsc2UgaWYob2JqIGluc3RhbmNlb2YgUHJvY2VzcykgewotCQkJLy8gLy8gZGlzYWxsb3cgZHJvcCBhIHByb2Nlc3MgYXMgYW4gYWN0aXZpdHkKLQkJCS8vIH0KLQkJCWVsc2UgaWYgKGUgaW5zdGFuY2VvZiBBY3Rpdml0eSAmJiBvd25lciBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJQWN0aXZpdHkgdGFyZ2V0ID0gKEFjdGl2aXR5KSBvd25lcjsKLQkJCQlpZiAoRGVwZW5kZW5jeUNoZWNrZXIubmV3Q2hlY2tBY3QpIHsKLQkJCQkJaWYgKCEgRGVwZW5kZW5jeUNoZWNrZXIuY2hlY2tDaXJjdWxhckZvck1vdmluZ1ZhcmlhYmlsaXR5RWxlbWVudAotCQkJCQkJCSh0YXJnZXQsIENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QoZSksIHRydWUpKSB7Ci0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCX0JCQkJCQotCQkJCX0gZWxzZSBpZiAoIURlcGVuZGVuY3lDaGVja2VyLmNoZWNrQ2lyY3VsYXJEZXBlbmRlbmN5KChBY3Rpdml0eSkgZSwgdGFyZ2V0KS5pc09LKCkpewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJCQotLy8JCQkJUHJvY2VzcyBzcmNQcm9jID0gVG5nVXRpbC5nZXRPd25pbmdQcm9jZXNzKChCcmVha2Rvd25FbGVtZW50KSBvYmopOwotLy8JCQkJUHJvY2VzcyB0YXJnZXRQcm9jID0gVG5nVXRpbC5nZXRPd25pbmdQcm9jZXNzKHRhcmdldCk7Ci0vLwotLy8JCQkJaWYgKCEoc3JjUHJvYyBpbnN0YW5jZW9mIERlbGl2ZXJ5UHJvY2VzcyAmJiB0YXJnZXRQcm9jIGluc3RhbmNlb2YgQ2FwYWJpbGl0eVBhdHRlcm4pKSB7Ci0vLwkJCQkJYWN0TGlzdC5hZGQob2JqKTsKLS8vCQkJCX0KLQkJCQkKLQkJCQkvLyBubyBtb3JlIGNoZWNrIHRvIHByZXZlbnQgYXBwbHlpbmcgYW4gYWN0aXZpdHkgb2YgYSBkZWxpdmVyeSBwcm9jZXNzIG9udG8gYSBjYXBhYmlsaXR5IHBhdHRlcgotCQkJCS8vIHNpbmNlIGludHJvZHVjdGlvbiBvZiBkZWVwLWNvcHkuIERlZXAgY29weSBjYW4gYWx3YXlzIGJlIGFwcGxpZWQgcmVnYXJkbGVzcyBvZiBzb3VyY2UgYW5kIHRhcmdldAotCQkJCS8vIHByb2Nlc3Nlcy4KLQkJCQkvLwotCQkJCWFjdExpc3QuYWRkKG9iaik7Ci0JCQl9Ci0JCX0KLQotCQlib29sZWFuIHJlc3VsdDsKLQkJaWYgKGxpc3QuaXNFbXB0eSgpICYmIGFjdExpc3QuaXNFbXB0eSgpKSB7Ci0JCQlyZXN1bHQgPSBmYWxzZTsKLQkJfSBlbHNlIHsKLQkJCUNvbXBvdW5kQ29tbWFuZCBjbWQgPSBuZXcgUmVzb3VyY2VBd2FyZUNvbXBvdW5kQ29tbWFuZCgpOwotCQkJaWYgKCFsaXN0LmlzRW1wdHkoKSkgewotCQkJCWNtZC5hcHBlbmQoY3JlYXRlRHJvcENvbW1hbmQob3duZXIsIGxpc3QpKTsKLQkJCX0KLQkJCWlmICghYWN0TGlzdC5pc0VtcHR5KCkpIHsKLQkJCQlpZiAob3duZXIgaW5zdGFuY2VvZiBBY3Rpdml0eSkKLQkJCQkJY21kLmFwcGVuZChuZXcgQWN0aXZpdHlEcm9wQ29tbWFuZCgoQWN0aXZpdHkpIG93bmVyLCBhY3RMaXN0LAotCQkJCQkJZ2V0VGFyZ2V0Vmlld2VyKCksICgoQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluKWRvbWFpbikuZ2V0QWRhcHRlckZhY3RvcnkoKSkpOwotCQkJfQotCQkJZHJvcENvbW1hbmQgPSBjbWQ7Ci0JCQlyZXN1bHQgPSBkcm9wQ29tbWFuZC5jYW5FeGVjdXRlKCk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcm90ZWN0ZWQgT2JqZWN0IGdldFRhcmdldFZpZXdlcigpIHsKLQkJaWYgKGRvbWFpbiBpbnN0YW5jZW9mIEFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbikgewotCQkJUHJvY2VzcyBwcm9jID0gVG5nVXRpbC5nZXRPd25pbmdQcm9jZXNzKChCcmVha2Rvd25FbGVtZW50KSBvd25lcik7Ci0JCQlBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSA9ICgoQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluKSBkb21haW4pCi0JCQkJCS5nZXRBZGFwdGVyRmFjdG9yeSgpOwotCQkJcmV0dXJuIFVzZXJJbnRlcmFjdGlvbkhlbHBlci5nZXRVSUhlbHBlcigpLmdldFZpZXdlcihhZGFwdGVyRmFjdG9yeSwgcHJvYyk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5EcmFnQW5kRHJvcENvbW1hbmQjZ2V0QWZmZWN0ZWRPYmplY3RzKCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRBZmZlY3RlZE9iamVjdHMoKSB7Ci0JCXJldHVybiBkcm9wQ29tbWFuZC5nZXRBZmZlY3RlZE9iamVjdHMoKTsJCQotCX0KLQotCXByb3RlY3RlZCBhYnN0cmFjdCBib29sZWFuIGFjY2VwdChPYmplY3Qgb2JqKTsKLQotCXByb3RlY3RlZCBhYnN0cmFjdCBDb21tYW5kIGNyZWF0ZURyb3BDb21tYW5kKE9iamVjdCBvd25lciwgTGlzdCBkcm9wU3JjKTsKLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvQlNEcm9wQ29tbWFuZC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvQlNEcm9wQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MDExYTgzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL0JTRHJvcENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkyNiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZDsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkFic3RyYWN0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklDb25maWd1cmF0aW9uQXBwbGljYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5Qcm92aWRlcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLkJhdGNoQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSU5lc3RlZENvbW1hbmRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSVJlc291cmNlQXdhcmVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5OZXN0ZWRDb21tYW5kRXhjZWN1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudWkuVXNlckludGVyYWN0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5FeHRlbnNpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5JUnVubmFibGVXaXRoUHJvZ3Jlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlByb2Nlc3NVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3I7Ci0KLS8qKgotICogQWJzdHJhY3QgYmFzZSBEcm9wQ29tbWFuZCBjbGFzcyBmb3IgYnJlYWtkb3duIHN0cnVjdHVyZSBlZGl0b3IKLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEJTRHJvcENvbW1hbmQgZXh0ZW5kcyBBYnN0cmFjdENvbW1hbmQgaW1wbGVtZW50cwotCQlJUmVzb3VyY2VBd2FyZUNvbW1hbmQgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFNldDxFUmVmZXJlbmNlPiBCQVNJQ19TWU5DX1JFRkVSRU5DRVMgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVTZXQobmV3IEhhc2hTZXQ8RVJlZmVyZW5jZT4oQXJyYXlzLmFzTGlzdChuZXcgRVJlZmVyZW5jZVtdIHsKLQkJCS8vIGd1aWRhbmNlCi0JCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb250ZW50RWxlbWVudF9DaGVja2xpc3RzKCksCi0JCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb250ZW50RWxlbWVudF9Db25jZXB0c0FuZFBhcGVycygpLAotCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29udGVudEVsZW1lbnRfRXhhbXBsZXMoKSwKLQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbnRlbnRFbGVtZW50X0d1aWRlbGluZXMoKSwKLQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbnRlbnRFbGVtZW50X0Fzc2V0cygpLAotCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29udGVudEVsZW1lbnRfU3VwcG9ydGluZ01hdGVyaWFscygpCi0JfSkpKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFNldDxFU3RydWN0dXJhbEZlYXR1cmU+IERFRkFVTFRfU1lOQ0hfRkVBVFVSRVMgPSBuZXcgSGFzaFNldDxFU3RydWN0dXJhbEZlYXR1cmU+KEFycmF5cy5hc0xpc3QoCi0JCQluZXcgRVN0cnVjdHVyYWxGZWF0dXJlW10gewotCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXROYW1lZEVsZW1lbnRfTmFtZSgpLAotCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRNZXRob2RFbGVtZW50X0JyaWVmRGVzY3JpcHRpb24oKSwKLQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWV0aG9kRWxlbWVudF9QcmVzZW50YXRpb25OYW1lKCksCi0JCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tfT3B0aW9uYWxJbnB1dCgpLAotCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrX01hbmRhdG9yeUlucHV0KCksCi0JCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tfT3V0cHV0KCksCi0JCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tfU3RlcHMoKSwJCQkJCi0JCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tfUGVyZm9ybWVkQnkoKSwKLQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza19BZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSgpLAotCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRSb2xlX1Jlc3BvbnNpYmxlRm9yKCksCi0JCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEFydGlmYWN0X0NvbnRhaW5lZEFydGlmYWN0cygpLAotCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXREZWxpdmVyYWJsZV9EZWxpdmVyZWRXb3JrUHJvZHVjdHMoKQotCQkJfQotCSkpOwotCQotCS8qKgotCSAqIE1hcCBvZiBsaW5rZWQgZWxlbWVudCdzIGZlYXR1cmUgdG8gZGVzY3JpcHRvcidzIGZlYXR1cmUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIE1hcDxFU3RydWN0dXJhbEZlYXR1cmUsIEVTdHJ1Y3R1cmFsRmVhdHVyZT4gRkVBVFVSRV9NQVAgPSBuZXcgSGFzaE1hcDxFU3RydWN0dXJhbEZlYXR1cmUsIEVTdHJ1Y3R1cmFsRmVhdHVyZT4oKTsKLQlzdGF0aWMgewotCQlERUZBVUxUX1NZTkNIX0ZFQVRVUkVTLmFkZEFsbChCQVNJQ19TWU5DX1JFRkVSRU5DRVMpOwotCQkKLQkJRkVBVFVSRV9NQVAucHV0KFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE5hbWVkRWxlbWVudF9OYW1lKCksIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE5hbWVkRWxlbWVudF9OYW1lKCkpOwotCQlGRUFUVVJFX01BUC5wdXQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWV0aG9kRWxlbWVudF9CcmllZkRlc2NyaXB0aW9uKCksIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE1ldGhvZEVsZW1lbnRfQnJpZWZEZXNjcmlwdGlvbigpKTsKLQkJRkVBVFVSRV9NQVAucHV0KFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE1ldGhvZEVsZW1lbnRfUHJlc2VudGF0aW9uTmFtZSgpLCBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRNZXRob2RFbGVtZW50X1ByZXNlbnRhdGlvbk5hbWUoKSk7Ci0JCUZFQVRVUkVfTUFQLnB1dChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrX09wdGlvbmFsSW5wdXQoKSwgVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza0Rlc2NyaXB0b3JfT3B0aW9uYWxJbnB1dCgpKTsKLQkJRkVBVFVSRV9NQVAucHV0KFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tfTWFuZGF0b3J5SW5wdXQoKSwgVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza0Rlc2NyaXB0b3JfTWFuZGF0b3J5SW5wdXQoKSk7Ci0JCUZFQVRVUkVfTUFQLnB1dChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrX091dHB1dCgpLCBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrRGVzY3JpcHRvcl9PdXRwdXQoKSk7Ci0JCUZFQVRVUkVfTUFQLnB1dChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRSb2xlX1Jlc3BvbnNpYmxlRm9yKCksIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFJvbGVEZXNjcmlwdG9yX1Jlc3BvbnNpYmxlRm9yKCkpOwotCQlGRUFUVVJFX01BUC5wdXQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RGVsaXZlcmFibGVfRGVsaXZlcmVkV29ya1Byb2R1Y3RzKCksIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9EZWxpdmVyYWJsZVBhcnRzKCkpOwotCQlGRUFUVVJFX01BUC5wdXQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza19TdGVwcygpLCBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrRGVzY3JpcHRvcl9TZWxlY3RlZFN0ZXBzKCkpOwotLy8JCUZFQVRVUkVfTUFQLnB1dChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRFc3RpbWF0ZWRNZXRob2RFbGVtZW50X0VzdGltYXRlKCksIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEVzdGltYXRlZE1ldGhvZEVsZW1lbnRfRXN0aW1hdGUoKSk7Ci0JCUZFQVRVUkVfTUFQLnB1dChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrX0FkZGl0aW9uYWxseVBlcmZvcm1lZEJ5KCksIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tEZXNjcmlwdG9yX0FkZGl0aW9uYWxseVBlcmZvcm1lZEJ5KCkpOwotCQlGRUFUVVJFX01BUC5wdXQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza19QZXJmb3JtZWRCeSgpLCBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrRGVzY3JpcHRvcl9QZXJmb3JtZWRQcmltYXJpbHlCeSgpKTsKLQkJLy8gZ3VpZGFuY2UKLQkJRkVBVFVSRV9NQVAucHV0KFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbnRlbnRFbGVtZW50X0NoZWNrbGlzdHMoKSwgVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QnJlYWtkb3duRWxlbWVudF9DaGVja2xpc3RzKCkpOwotCQlGRUFUVVJFX01BUC5wdXQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29udGVudEVsZW1lbnRfQ29uY2VwdHNBbmRQYXBlcnMoKSwgVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QnJlYWtkb3duRWxlbWVudF9Db25jZXB0cygpKTsKLQkJRkVBVFVSRV9NQVAucHV0KFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbnRlbnRFbGVtZW50X0V4YW1wbGVzKCksIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEJyZWFrZG93bkVsZW1lbnRfRXhhbXBsZXMoKSk7Ci0JCUZFQVRVUkVfTUFQLnB1dChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb250ZW50RWxlbWVudF9HdWlkZWxpbmVzKCksIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEJyZWFrZG93bkVsZW1lbnRfR3VpZGVsaW5lcygpKTsKLQkJRkVBVFVSRV9NQVAucHV0KFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbnRlbnRFbGVtZW50X0Fzc2V0cygpLCBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRCcmVha2Rvd25FbGVtZW50X1JldXNhYmxlQXNzZXRzKCkpOwotCQlGRUFUVVJFX01BUC5wdXQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29udGVudEVsZW1lbnRfU3VwcG9ydGluZ01hdGVyaWFscygpLCBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRCcmVha2Rvd25FbGVtZW50X1N1cHBvcnRpbmdNYXRlcmlhbHMoKSk7Ci0vLwkJRkVBVFVSRV9NQVAucHV0KFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbnRlbnRFbGVtZW50XywgVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QnJlYWtkb3duRWxlbWVudF8pOwkKLQl9Ci0KLQlwcm90ZWN0ZWQgQWN0aXZpdHkgYWN0aXZpdHk7Ci0KLQlwcm90ZWN0ZWQgTGlzdDxPYmplY3Q+IGRyb3BFbGVtZW50czsKLQkKLQlwcm90ZWN0ZWQgTGlzdDxPYmplY3Q+IHVud3JhcHBlZERyb3BFbGVtZW50czsKLQotCXByaXZhdGUgU2V0PFJlc291cmNlPiBtb2RpZmllZFJlc291cmNlczsKLQotCXByb3RlY3RlZCBMaXN0PE9iamVjdD4gZWxlbWVudHNUb0FkZFRvRGVmYXVsdENvbmZpZzsKLQotCXByb3RlY3RlZCBTZXQ8T2JqZWN0PiBhZGRlZE9iamVjdHM7Ci0KLQlwcml2YXRlIFByb2Nlc3MgcHJvY2VzczsKLQotCXByaXZhdGUgYm9vbGVhbiBhZGRlZFRvRGVmYXVsdENvbmZpZyA9IGZhbHNlOwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gc3luY2hyb25pemUgPSBmYWxzZTsKLQotCXByb3RlY3RlZCBBcnJheUxpc3Q8VGFza0Rlc2NyaXB0b3I+IHRhc2tEZXNjTGlzdDsKLQotCXByb3RlY3RlZCBBcnJheUxpc3Q8RGVzY3JpcHRvcj4gdGFza0Rlc2NyaXB0b3JzVG9VcGRhdGU7Ci0KLS8vCXByb3RlY3RlZCBTZXQgZGVzY3JpcHRvcnNUb1JlZnJlc2g7Ci0KLQkvKioKLQkgKiBNYXAgb2YgZGVzY3JpcHRvciB0byBvbGQgcmVmcmVzaGFibGUgZmVhdHVyZSBtYXAKLQkgKi8KLQlwcml2YXRlIE1hcDxEZXNjcmlwdG9yLCBNYXA8PywgPz4+IGRlc2NyaXB0b3JUb09sZFJlZnJlc2hhYmxlRmVhdHVyZXNNYXA7Ci0KLQkvKioKLQkgKiBNYXAgb2YgZGVzY3JpcHRvciB0byBtYXAgb2YgZmVhdHVyZSB0byBuZXcgdmFsdWVzCi0JICovCi0vLwlwcm90ZWN0ZWQgTWFwIGRlc2NyaXB0b3JUb05ld0ZlYXR1cmVWYWx1ZXNNYXA7Ci0vLwlwcml2YXRlIEhhc2hNYXAgZGVzY3JpcHRvclRvT2xkRmVhdHVyZVZhbHVlc01hcDsJCi0JcHJvdGVjdGVkIERlc2NyaXB0b3JVcGRhdGVCYXRjaENvbW1hbmQgYmF0Y2hDb21tYW5kOwotCi0vLwlwcml2YXRlIEhhc2hNYXAgd3BkVG9PbGRSZXNwb25zaWJsZVJvbGVNYXA7Ci0KLQkvKioKLQkgKiBNYXAgb2YgVGFza0Rlc2NyaXB0b3IgdG8gbGlzdCBvZiBuZXdseSBhZGRlZCBzdGVwcwotCSAqLwotCXByaXZhdGUgTWFwIHRhc2tEZXNjVG9OZXdTdGVwc01hcDsKLQotCXByaXZhdGUgTWFwIHRhc2tEZXNjVG9PbGRFc3RpbWF0ZU1hcDsKLQkKLQlwcm90ZWN0ZWQgYm9vbGVhbiBjYW5jZWxlZDsKLQotCXByaXZhdGUgTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWc7Ci0KLQlwcm90ZWN0ZWQgU2V0IHN5bmNoRmVhdHVyZXMgPSBERUZBVUxUX1NZTkNIX0ZFQVRVUkVTOwotCi0JcHJpdmF0ZSBCYXRjaENvbW1hbmQgcmVmcmVzaFJlc3BvbnNpYmxlRm9yQ29tbWFuZDsKLQotCXByb3RlY3RlZCBib29sZWFuIGV4ZWN1dGVkOwotCi0vLwlwcm90ZWN0ZWQgT2JqZWN0IFVJQ29udGV4dDsKLQkKLQlwcm90ZWN0ZWQgYm9vbGVhbiBydW5Bc0pvYjsKLQkKLQlwcml2YXRlIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcjsKLQotCXByaXZhdGUgaW50IHdvcmtlZFVuaXRzOwotCi0JcHJpdmF0ZSBOZXN0ZWRDb21tYW5kRXhjZWN1dG9yIG5lc3RlZENvbW1hbmRFeGNlY3V0b3I7Ci0JCi0JLyoqCi0JICogQHBhcmFtIGFjdGl2aXR5Ci0JICogICAgICAgICAgICB0aGUgYWN0aXZpdHkgdGhhdCB0aGUgZ2l2ZW4gZWxlbWVudHMgYXJlIGRyb3BwZWQgb24KLQkgKiBAcGFyYW0gZHJvcEVsZW1lbnRzCi0JICogICAgICAgICAgICB0aGUgZWxlbWVudHMgdG8gZHJvcCBvbiB0aGUgZ2l2ZW4gYWN0aXZpdHkKLQkgKi8KLQlwdWJsaWMgQlNEcm9wQ29tbWFuZChBY3Rpdml0eSBhY3Rpdml0eSwgTGlzdDxPYmplY3Q+IGRyb3BFbGVtZW50cykgewotCQl0aGlzKGFjdGl2aXR5LCBkcm9wRWxlbWVudHMsIG51bGwsIG51bGwsIGZhbHNlKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gc3luY2gKLQkgKiAgICAgICAgICAgIGlmIHRydWUsIHRoZSBjb21tYW5kIHdpbGwgY2xlYW4gdGhlIGNvbnRlbnQgYW5kIHJlbGF0aW9uc2hpcHMKLQkgKiAgICAgICAgICAgIG9mIGV4aXN0aW5nIGRlc2NyaXB0b3JzIGFuZCByZWZyZXNoIHRoZW0gd2l0aCB0aGUgbGlua2VkCi0JICogICAgICAgICAgICBNZXRob2RFbGVtZW50Ci0JICovCi0JcHVibGljIEJTRHJvcENvbW1hbmQoQWN0aXZpdHkgYWN0aXZpdHksIExpc3Q8T2JqZWN0PiBkcm9wRWxlbWVudHMsIGJvb2xlYW4gc3luY2gpIHsKLQkJdGhpcyhhY3Rpdml0eSwgZHJvcEVsZW1lbnRzLCBudWxsLCBudWxsLCBzeW5jaCk7Ci0JfQotCi0JLyoqCi0JICogU3luY2hyb25pemUgdGhlIGdpdmVuIGNvbnRlbnQgZWxlbWVudHMgdG8gaXRzIFRhc2tEZXNjcmlwdG9ycyBpbiB0aGUKLQkgKiBnaXZlbiBhY3Rpdml0eSB1c2luZyB0aGUgZ2l2ZW4gTWV0aG9kQ29uZmlndXJhdGlvbiBhbmQgbGlzdCBvZgotCSAqIHN5bmNocm9uaXphYmxlIGZlYXR1cmVzLgotCSAqIAotCSAqIEBwYXJhbSBhY3Rpdml0eQotCSAqIEBwYXJhbSBkcm9wRWxlbWVudHMKLQkgKiAgICAgICAgICAgIHRoZSBlbGVtZW50cyB0byBzeW5jaHJvbml6ZQotCSAqIEBwYXJhbSBjb25maWcKLQkgKiBAcGFyYW0gc3luY2hGZWF0dXJlcwotCSAqICAgICAgICAgICAgdGhlIHN5bmNocm9uaXphYmxlIGZlYXR1cmVzLCBpZiA8Y29kZT5udWxsPC9jb2RlPiB0aGUgREVGQVVMVF9TWU5DSF9GRUFUVVJFUyB3aWxsIGJlIHVzZWQuCi0JICovCi0JcHVibGljIEJTRHJvcENvbW1hbmQoQWN0aXZpdHkgYWN0aXZpdHksIExpc3Q8T2JqZWN0PiBkcm9wRWxlbWVudHMsCi0JCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZywgU2V0IHN5bmNoRmVhdHVyZXMpIHsKLQkJdGhpcyhhY3Rpdml0eSwgZHJvcEVsZW1lbnRzLCBjb25maWcsIHN5bmNoRmVhdHVyZXMsIHRydWUpOwotCX0KLQkKLQlwdWJsaWMgQlNEcm9wQ29tbWFuZChBY3Rpdml0eSBhY3Rpdml0eSwgTGlzdDxPYmplY3Q+IGRyb3BFbGVtZW50cywKLQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnLCBTZXQgc3luY2hGZWF0dXJlcywgYm9vbGVhbiBzeW5jaCkgewotCQlzdXBlcigpOwotCQl0aGlzLmFjdGl2aXR5ID0gYWN0aXZpdHk7Ci0JCXByb2Nlc3MgPSBUbmdVdGlsLmdldE93bmluZ1Byb2Nlc3MoYWN0aXZpdHkpOwotCQl0aGlzLnN5bmNocm9uaXplID0gc3luY2g7Ci0JCXRoaXMuY29uZmlnID0gY29uZmlnOwotCQlpZiAoc3luY2hGZWF0dXJlcyA9PSBudWxsKSB7Ci0JCQl0aGlzLnN5bmNoRmVhdHVyZXMgPSBERUZBVUxUX1NZTkNIX0ZFQVRVUkVTOwotCQl9Ci0JCWVsc2UgewotCQkJdGhpcy5zeW5jaEZlYXR1cmVzID0gc3luY2hGZWF0dXJlczsKLQkJfQotCQkKLQkJdGhpcy5kcm9wRWxlbWVudHMgPSBkcm9wRWxlbWVudHM7Ci0JCW5lc3RlZENvbW1hbmRFeGNlY3V0b3IgPSBjcmVhdGVOZXN0ZWRDb21tYW5kRXhjZWN1dG9yKCk7Ci0JfQotCQotCXByb3RlY3RlZCBOZXN0ZWRDb21tYW5kRXhjZWN1dG9yIGNyZWF0ZU5lc3RlZENvbW1hbmRFeGNlY3V0b3IoKSB7Ci0JCXJldHVybiBuZXcgTmVzdGVkQ29tbWFuZEV4Y2VjdXRvcih0aGlzKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGV4ZWN1dGVOZXN0ZWRDb21tYW5kcygpIHsKLQkJCQlpZih0YXNrRGVzY0xpc3QgIT0gbnVsbCAmJiAhdGFza0Rlc2NMaXN0LmlzRW1wdHkoKSkgewotCQkJCQlMaXN0IG5lc3RlZENvbW1hbmRQcm92aWRlcnMgPSBFeHRlbnNpb25NYW5hZ2VyCi0JCQkJCS5nZXROZXN0ZWRDb21tYW5kUHJvdmlkZXJzKCk7Ci0JCQkJCWlmICghbmVzdGVkQ29tbWFuZFByb3ZpZGVycy5pc0VtcHR5KCkpIHsKLQkJCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IG5lc3RlZENvbW1hbmRQcm92aWRlcnMuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCQlJTmVzdGVkQ29tbWFuZFByb3ZpZGVyIGNtZFByb3ZpZGVyID0gKElOZXN0ZWRDb21tYW5kUHJvdmlkZXIpIGl0ZXIKLQkJCQkJCQkubmV4dCgpOwotCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCUNvbW1hbmQgY21kID0gY21kUHJvdmlkZXIuY3JlYXRlUmVsYXRlZE9iamVjdHMoCi0JCQkJCQkJCQkJdGFza0Rlc2NMaXN0LCBCU0Ryb3BDb21tYW5kLnRoaXMpOwotCQkJCQkJCQlpZiAoY21kICE9IG51bGwgJiYgY21kLmNhbkV4ZWN1dGUoKSkgewotCQkJCQkJCQkJY21kLmV4ZWN1dGUoKTsKLQkJCQkJCQkJCWdldE5lc3RlZENvbW1hbmRzKCkuYWRkKGNtZCk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJCQlMaWJyYXJ5RWRpdFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkKLQkJCQkJCQkJLmxvZ0Vycm9yKGUpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQotCQkJCXN1cGVyLmV4ZWN1dGVOZXN0ZWRDb21tYW5kcygpOwotCQkJfQotCQl9OwotCX0KLQkKLQlwcm90ZWN0ZWQgSVByb2dyZXNzTW9uaXRvciBnZXRQcm9ncmVzc01vbml0b3IoKSB7Ci0JCWlmKG1vbml0b3IgPT0gbnVsbCkgewotCQkJbW9uaXRvciA9IG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCk7Ci0JCX0KLQkJcmV0dXJuIG1vbml0b3I7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHByZXBhcmVEcm9wRWxlbWVudHMoKSB7CQkKLQkJQXJyYXlMaXN0PE9iamVjdD4gZWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0PE9iamVjdD4oKTsKLQkJZ2V0TWV0aG9kQ29uZmlndXJhdGlvbigpOwotCQl1bndyYXBwZWREcm9wRWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0PE9iamVjdD4oKTsKLQkJZm9yIChPYmplY3QgbyA6IGRyb3BFbGVtZW50cykgewotCQkJT2JqZWN0IGVsZW1lbnQgPSBUbmdVdGlsLnVud3JhcChvKTsKLQkJCWVsZW1lbnQgPSBQcm92aWRlcnMuZ2V0Q29uZmlndXJhdGlvbkFwcGxpY2F0b3IoKS5yZXNvbHZlKGVsZW1lbnQsIGNvbmZpZyk7Ci0JCQlpZiAoIWVsZW1lbnRzLmNvbnRhaW5zKGVsZW1lbnQpCi0JCQkJCSYmICEoZWxlbWVudCBpbnN0YW5jZW9mIEVPYmplY3QgJiYgKChFT2JqZWN0KSBlbGVtZW50KQotCQkJCQkJCS5lSXNQcm94eSgpKSkgewkJCQkKLQkJCQllbGVtZW50cy5hZGQoZWxlbWVudCk7Ci0JCQkJdW53cmFwcGVkRHJvcEVsZW1lbnRzLmFkZChvKTsKLQkJCX0KLQkJfQotCQlkcm9wRWxlbWVudHMgPSBlbGVtZW50czsKLQl9Ci0JCi0vLwkvKioKLS8vCSAqIFNldHMgVUkgY29udGV4dCBmb3IgdGhpcyBjb21tYW5kLCB0aGlzIGNhbiBiZSBhIFNoZWxsIG9iamVjdAotLy8JICogQHBhcmFtIFVJQ29udGV4dAotLy8JICovCi0vLwlwdWJsaWMgdm9pZCBzZXRVSUNvbnRleHQoT2JqZWN0IFVJQ29udGV4dCkgewotLy8JCXRoaXMuVUlDb250ZXh0ID0gVUlDb250ZXh0OwotLy8JfQotCi0JcHVibGljIE1ldGhvZENvbmZpZ3VyYXRpb24gZ2V0TWV0aG9kQ29uZmlndXJhdGlvbigpIHsKLQkJaWYoY29uZmlnID09IG51bGwpIHsKLQkJCWNvbmZpZyA9IFRuZ1V0aWwuZ2V0T3duaW5nUHJvY2VzcyhhY3Rpdml0eSkuZ2V0RGVmYXVsdENvbnRleHQoKTsKLQkJfQotCQlyZXR1cm4gY29uZmlnOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkFic3RyYWN0Q29tbWFuZCNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlpZiAoZHJvcEVsZW1lbnRzICE9IG51bGwpIHsKLQkJCWRyb3BFbGVtZW50cy5jbGVhcigpOwotCQl9Ci0JCWlmKHVud3JhcHBlZERyb3BFbGVtZW50cyAhPSBudWxsKSB7Ci0JCQl1bndyYXBwZWREcm9wRWxlbWVudHMuY2xlYXIoKTsKLQkJfQotCQlpZiAobW9kaWZpZWRSZXNvdXJjZXMgIT0gbnVsbCkgewotCQkJbW9kaWZpZWRSZXNvdXJjZXMuY2xlYXIoKTsKLQkJfQotCQlpZiAoZWxlbWVudHNUb0FkZFRvRGVmYXVsdENvbmZpZyAhPSBudWxsKSB7Ci0JCQllbGVtZW50c1RvQWRkVG9EZWZhdWx0Q29uZmlnLmNsZWFyKCk7Ci0JCX0KLQkJaWYgKGFkZGVkT2JqZWN0cyAhPSBudWxsKSB7Ci0JCQlhZGRlZE9iamVjdHMuY2xlYXIoKTsKLQkJfQotCQlpZiAoZGVzY3JpcHRvclRvT2xkUmVmcmVzaGFibGVGZWF0dXJlc01hcCAhPSBudWxsKSB7Ci0JCQlkZXNjcmlwdG9yVG9PbGRSZWZyZXNoYWJsZUZlYXR1cmVzTWFwLmNsZWFyKCk7Ci0JCX0KLQkJaWYgKHRhc2tEZXNjTGlzdCAhPSBudWxsKSB7Ci0JCQl0YXNrRGVzY0xpc3QuY2xlYXIoKTsKLQkJfQotCQlpZiAodGFza0Rlc2NUb05ld1N0ZXBzTWFwICE9IG51bGwpIHsKLQkJCXRhc2tEZXNjVG9OZXdTdGVwc01hcC5jbGVhcigpOwotCQl9Ci0JCWlmICh0YXNrRGVzY1RvT2xkRXN0aW1hdGVNYXAgIT0gbnVsbCkgewotCQkJdGFza0Rlc2NUb09sZEVzdGltYXRlTWFwLmNsZWFyKCk7Ci0JCX0KLQkJaWYgKHJlZnJlc2hSZXNwb25zaWJsZUZvckNvbW1hbmQgIT0gbnVsbCkgewotCQkJcmVmcmVzaFJlc3BvbnNpYmxlRm9yQ29tbWFuZC5kaXNwb3NlKCk7Ci0JCX0KLQkJaWYgKHRhc2tEZXNjcmlwdG9yc1RvVXBkYXRlICE9IG51bGwpIHsKLQkJCXRhc2tEZXNjcmlwdG9yc1RvVXBkYXRlLmNsZWFyKCk7Ci0JCX0KLQkJaWYoYmF0Y2hDb21tYW5kICE9IG51bGwpIHsKLQkJCWJhdGNoQ29tbWFuZC5kaXNwb3NlKCk7Ci0JCX0KLQkJYWN0aXZpdHkgPSBwcm9jZXNzID0gbnVsbDsKLQkJaWYobmVzdGVkQ29tbWFuZEV4Y2VjdXRvciAhPSBudWxsKSB7Ci0JCQluZXN0ZWRDb21tYW5kRXhjZWN1dG9yLmRpc3Bvc2UoKTsKLQkJfQotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5jb21tYW5kLklSZXNvdXJjZUF3YXJlQ29tbWFuZCNnZXRNb2RpZmllZFJlc291cmNlcygpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb248UmVzb3VyY2U+IGdldE1vZGlmaWVkUmVzb3VyY2VzKCkgewotCQlpZiAobW9kaWZpZWRSZXNvdXJjZXMgPT0gbnVsbCkgewotCQkJbW9kaWZpZWRSZXNvdXJjZXMgPSBuZXcgSGFzaFNldDxSZXNvdXJjZT4oKTsKLQkJCWlmIChhY3Rpdml0eS5lUmVzb3VyY2UoKSAhPSBudWxsKSB7Ci0JCQkJbW9kaWZpZWRSZXNvdXJjZXMuYWRkKGFjdGl2aXR5LmVSZXNvdXJjZSgpKTsKLQkJCX0KLQkJfQotCQkKLQkJbW9kaWZpZWRSZXNvdXJjZXMuYWRkQWxsKG5lc3RlZENvbW1hbmRFeGNlY3V0b3IuZ2V0TW9kaWZpZWRSZXNvdXJjZXMoKSk7Ci0KLQkJcmV0dXJuIG1vZGlmaWVkUmVzb3VyY2VzOwotCX0KLQotCS8qKgotCSAqIENsZWFycyBhbGwgdGhlIHJlZnJlc2hhYmxlIGZlYXR1cmVzIG9mIHRoZSBnaXZlbiBkZXNjcmlwdG9yCi0JICogCi0JICogQHBhcmFtIGRlc2NyaXB0b3IKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gY2xlYXJEZXNjcmlwdG9yKERlc2NyaXB0b3IgZGVzY3JpcHRvcikgewotCQlTZXQgZXhjbHVkZVN5bmNoRmVhdHVyZXMgPSBuZXcgSGFzaFNldChERUZBVUxUX1NZTkNIX0ZFQVRVUkVTKTsKLQkJZXhjbHVkZVN5bmNoRmVhdHVyZXMucmVtb3ZlQWxsKHN5bmNoRmVhdHVyZXMpOwotCQlTZXQgZXhjbHVkZUZlYXR1cmVzOwotCQlpZiAoZXhjbHVkZVN5bmNoRmVhdHVyZXMuaXNFbXB0eSgpKSB7Ci0JCQlleGNsdWRlRmVhdHVyZXMgPSBleGNsdWRlU3luY2hGZWF0dXJlczsKLQkJfQotCQllbHNlIHsKLQkJCWV4Y2x1ZGVGZWF0dXJlcyA9IG5ldyBIYXNoU2V0KCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBleGNsdWRlU3luY2hGZWF0dXJlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IGdldERlc2NyaXB0b3JGZWF0dXJlKChFU3RydWN0dXJhbEZlYXR1cmUpIGl0ZXIubmV4dCgpKTsKLQkJCQlpZihmZWF0dXJlICE9IG51bGwpIHsKLQkJCQkJZXhjbHVkZUZlYXR1cmVzLmFkZChmZWF0dXJlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJYm9vbGVhbiByZXQgPSBQcm9jZXNzQ29tbWFuZFV0aWwuY2xlYXJEZXNjcmlwdG9yKGRlc2NyaXB0b3IsCi0JCQkJZGVzY3JpcHRvclRvT2xkUmVmcmVzaGFibGVGZWF0dXJlc01hcCwgZXhjbHVkZUZlYXR1cmVzKTsKLQkJaWYgKHJldCAmJiBkZXNjcmlwdG9yIGluc3RhbmNlb2YgVGFza0Rlc2NyaXB0b3IpIHsKLQkJCWlmICh0YXNrRGVzY3JpcHRvcnNUb1VwZGF0ZSA9PSBudWxsKSB7Ci0JCQkJdGFza0Rlc2NyaXB0b3JzVG9VcGRhdGUgPSBuZXcgQXJyYXlMaXN0PERlc2NyaXB0b3I+KCk7Ci0JCQl9Ci0JCQl0YXNrRGVzY3JpcHRvcnNUb1VwZGF0ZS5hZGQoZGVzY3JpcHRvcik7Ci0JCX0KLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZmVhdHVyZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBFU3RydWN0dXJhbEZlYXR1cmUgZ2V0RGVzY3JpcHRvckZlYXR1cmUoRVN0cnVjdHVyYWxGZWF0dXJlIGxpbmtlZEVsZW1lbnRGZWF0dXJlKSB7Ci0JCXJldHVybiAoRVN0cnVjdHVyYWxGZWF0dXJlKSBGRUFUVVJFX01BUC5nZXQobGlua2VkRWxlbWVudEZlYXR1cmUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgYm9vbGVhbiBwcmVFeGVjdXRlKCkgewotCQlwcmVwYXJlRHJvcEVsZW1lbnRzKCk7Ci0JCQotCQlib29sZWFuIGIgPSAhZHJvcEVsZW1lbnRzLmlzRW1wdHkoKTsKLQkJaWYgKGIpIHsKLS8vCQkJZGVzY3JpcHRvclRvTmV3RmVhdHVyZVZhbHVlc01hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCQliYXRjaENvbW1hbmQgPSBuZXcgRGVzY3JpcHRvclVwZGF0ZUJhdGNoQ29tbWFuZChmYWxzZSwgc3luY2hGZWF0dXJlcywgY29uZmlnKTsgLy9UT0RPOiB3aHkgY2xlYXIgbXVzdCBiZSBmYWxzZSA/Pz8KLQotLy8JCQlpZiAoc3luY2hyb25pemUpIHsKLS8vCQkJCWRlc2NyaXB0b3JzVG9SZWZyZXNoID0gbmV3IEhhc2hTZXQoKTsKLS8vCQkJfQotCQl9Ci0JCXJldHVybiBiOwotCX0KLQkKLQlwcm90ZWN0ZWQgYm9vbGVhbiBjb2xsZWN0RWxlbWVudHNUb0FkZFRvRGVmYXVsdENvbmZpZygpIHsKLQkJaWYgKGVsZW1lbnRzVG9BZGRUb0RlZmF1bHRDb25maWcgPT0gbnVsbCkgewotCQkJZWxlbWVudHNUb0FkZFRvRGVmYXVsdENvbmZpZyA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PigpOwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gZHJvcEVsZW1lbnRzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBlbGVtZW50ID0gaXRlci5uZXh0KCk7Ci0JCQkJc3dpdGNoIChVc2VySW50ZXJhY3Rpb25IZWxwZXIuY2hlY2tBZ2FpbnN0RGVmYXVsdENvbmZpZ3VyYXRpb24oCi0JCQkJCQlwcm9jZXNzLCBlbGVtZW50KSkgewotCQkJCWNhc2UgMDoKLQkJCQkJaXRlci5yZW1vdmUoKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAyOgotCQkJCQllbGVtZW50c1RvQWRkVG9EZWZhdWx0Q29uZmlnLmFkZChlbGVtZW50KTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAtMToKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIGVsZW1lbnRzIHRvIHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24KLQkgKiAKLQkgKiBAcmV0dXJuIHRydWUgaWYgZGVmYXVsdCBjb25maWd1cmF0aW9uIGhhcyBiZWVuIG1vZGlmaWVkLCBmYWxzZSBvdGhlcndpc2UKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gYWRkVG9EZWZhdWx0Q29uZmlndXJhdGlvbigpIHsKLQkJaWYgKCFhZGRlZFRvRGVmYXVsdENvbmZpZyAmJiBlbGVtZW50c1RvQWRkVG9EZWZhdWx0Q29uZmlnICE9IG51bGwgJiYgIWVsZW1lbnRzVG9BZGRUb0RlZmF1bHRDb25maWcuaXNFbXB0eSgpKSB7Ci0JCQlpZihhZGRlZE9iamVjdHMgPT0gbnVsbCkgewotCQkJCWFkZGVkT2JqZWN0cyA9IG5ldyBIYXNoU2V0KCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlhZGRlZE9iamVjdHMuY2xlYXIoKTsKLQkJCX0KLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGVsZW1lbnRzVG9BZGRUb0RlZmF1bHRDb25maWcuaXRlcmF0b3IoKTsgaXRlcgotCQkJLmhhc05leHQoKTspIHsKLQkJCQlFT2JqZWN0IGVsZW1lbnQgPSAoRU9iamVjdCkgaXRlci5uZXh0KCk7Ci0JCQkJUHJvY2Vzc1V0aWwuYWRkVG9EZWZhdWx0Q29uZmlndXJhdGlvbihwcm9jZXNzLCBlbGVtZW50LAotCQkJCQkJYWRkZWRPYmplY3RzKTsKLQkJCX0KLQkJCWlmICghYWRkZWRPYmplY3RzLmlzRW1wdHkoKSkgewotCQkJCWdldE1vZGlmaWVkUmVzb3VyY2VzKCkuYWRkKAotCQkJCQkJcHJvY2Vzcy5nZXREZWZhdWx0Q29udGV4dCgpLmVSZXNvdXJjZSgpKTsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJCWFkZGVkVG9EZWZhdWx0Q29uZmlnID0gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCXByb3RlY3RlZCBpbnQgZ2V0VG90YWxXb3JrKCkgewotCQlyZXR1cm4gMjA7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHdvcmtlZChpbnQgdW5pdHNPZldvcmspIHsKLQkJbW9uaXRvci53b3JrZWQodW5pdHNPZldvcmspOwotCQl3b3JrZWRVbml0cyA9IHdvcmtlZFVuaXRzICsgdW5pdHNPZldvcms7Ci0JfQotCQotCXByb3RlY3RlZCBpbnQgZ2V0UmVtYWluaW5nV29yaygpIHsKLQkJaW50IHJlbWFpbmluZyA9IGdldFRvdGFsV29yaygpIC0gd29ya2VkVW5pdHM7Ci0JCWlmKHJlbWFpbmluZyA8IDApIHsKLQkJCXJlbWFpbmluZyA9IDA7Ci0JCX0KLQkJcmV0dXJuIHJlbWFpbmluZzsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiB1cGRhdGVEZWZhdWx0Q29uZmlndXJhdGlvbk5lZWRlZCgpIHsKLQkJcmV0dXJuICFzeW5jaHJvbml6ZTsKLQl9Ci0JCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZCNleGVjdXRlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewkJCi0JCS8vIEJ1c3lJbmRpY2F0b3Iuc2hvd1doaWxlKERpc3BsYXkuZ2V0Q3VycmVudCgpLCBuZXcgUnVubmFibGUoKSB7Ci0JCS8vCQkJCi0JCS8vIHB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJLy8gY2FuY2VsZWQgPSAhYWRkVG9EZWZhdWx0Q29uZmlndXJhdGlvbigpOwotCQkvLyB9Ci0JCS8vCQkJCi0JCS8vIH0pOwotCQkvLwkJCi0JCS8vIC8vVE9ETzogVGhpcyBjYXVzZWQgTnVsbFBvaW50ZXJFeGNlcHRpb24gb3IgVGhyZWFkQWNjZXNzRXJyb3Igd2hlbgotCQkvLyBzaG93aW5nIHNlbGVjdGlvbiBkaWFsb2cgaXMgbmVlZGVkCi0JCS8vIC8vCi0JCS8vIElSdW5uYWJsZVdpdGhQcm9ncmVzcyBydW5uYWJsZSA9IG5ldyBJUnVubmFibGVXaXRoUHJvZ3Jlc3MoKSB7Ci0JCS8vCi0JCS8vIHB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cwotCQkvLyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCS8vIGNhbmNlbGVkID0gIXByZUV4ZWN1dGUoKTsKLQkJLy8gfQotCQkvLwkJCQotCQkvLyB9OwotCQkvLyBVc2VySW50ZXJhY3Rpb25IZWxwZXIucnVuV2l0aFByb2dyZXNzKHJ1bm5hYmxlLCBudWxsKTsKLQkJLy8JCQotCQkvLyBpZighY2FuY2VsZWQpIHsKLQkJLy8gQnVzeUluZGljYXRvci5zaG93V2hpbGUoRGlzcGxheS5nZXRDdXJyZW50KCksIG5ldyBSdW5uYWJsZSgpIHsKLQkJLy8JCQkJCi0JCS8vIHB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJLy8gcmVkbygpOwotCQkvLyB9Ci0JCS8vCQkJCQotCQkvLyB9KTsKLQkJLy8gfQotCi0vLwkJQnVzeUluZGljYXRvci5zaG93V2hpbGUoRGlzcGxheS5nZXRDdXJyZW50KCksIG5ldyBSdW5uYWJsZSgpIHsKLS8vCi0vLwkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLS8vCQkJCWlmICgoIXN5bmNocm9uaXplICYmIGFkZFRvRGVmYXVsdENvbmZpZ3VyYXRpb24oKSkgJiYgcHJlRXhlY3V0ZSgpKSB7Ci0vLwkJCQkJcmVkbygpOwotLy8JCQkJfQotLy8JCQl9Ci0vLwotLy8JCX0pOwotCQkKLQkJaWYodXBkYXRlRGVmYXVsdENvbmZpZ3VyYXRpb25OZWVkZWQoKSkgewotCQkJaWYoIWNvbGxlY3RFbGVtZW50c1RvQWRkVG9EZWZhdWx0Q29uZmlnKCkpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJCi0JCWZpbmFsIFN0cmluZyB0YXNrTmFtZSA9IChsYWJlbCA9PSBudWxsID8gIiIgOiBsYWJlbCk7IC8vJE5PTi1OTFMtMSQKLQkJSVJ1bm5hYmxlV2l0aFByb2dyZXNzIHJ1bm5hYmxlID0gbmV3IElSdW5uYWJsZVdpdGhQcm9ncmVzcygpIHsKLQotCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJCQl0cnkgewotCQkJCQltb25pdG9yLmJlZ2luVGFzayh0YXNrTmFtZSwgZ2V0VG90YWxXb3JrKCkpOwotCQkJCQlCU0Ryb3BDb21tYW5kLnRoaXMubW9uaXRvciA9IG1vbml0b3I7Ci0JCQkJCXdvcmtlZChnZXRSZW1haW5pbmdXb3JrKCkgLyAzKTsKLQkJCQkJCi0JCQkJCS8vIHRoaXMgbXVzdCBiZSBjYWxsZWQgYmVmb3JlIHByZUV4ZWN1dGUoKSB0byBhZGQgcmVxdWlyZWQgZWxlbWVudHMgdG8gY29uZmlndXJhdGlvbgotCQkJCQkvLyBzbyB0aGUgY29tbWFuZCBjYW4gcmVhbGl6ZSBkYXRhIGNvcnJlY3RseQotCQkJCQkvLwotCQkJCQlhZGRUb0RlZmF1bHRDb25maWd1cmF0aW9uKCk7Ci0JCQkJCXdvcmtlZChnZXRSZW1haW5pbmdXb3JrKCkgLyAzKTsKLQkJCQkJCi0JCQkJCWlmIChwcmVFeGVjdXRlKCkpIHsKLQkJCQkJCXdvcmtlZChnZXRSZW1haW5pbmdXb3JrKCkgLyAzKTsKLQkJCQkJCXJlZG8oKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlmaW5hbGx5IHsKLQkJCQkJbW9uaXRvci5kb25lKCk7Ci0JCQkJfQotCQkJfQotCQkJCi0JCX07Ci0JCWlmKHJ1bkFzSm9iKSB7Ci0JCQlVc2VySW50ZXJhY3Rpb25IZWxwZXIucnVuQXNKb2IocnVubmFibGUsIHRhc2tOYW1lKTsKLQkJfQotCQllbHNlIHsKLS8vCQkJVXNlckludGVyYWN0aW9uSGVscGVyLnJ1bkluVUkocnVubmFibGUsIChTaGVsbCludWxsKTsKLQkJCVVzZXJJbnRlcmFjdGlvbkhlbHBlci5ydW5XaXRoUHJvZ3Jlc3MocnVubmFibGUsIG51bGwpOwotCQl9Ci0JfQotCQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQjcmVkbygpCi0JICovCi0JcHVibGljIHZvaWQgcmVkbygpIHsKLQkJdHJ5IHsKLQkJCS8vIGFkZCBlbGVtZW50cyB0byB0aGUgZGVmYXVsdCBjb25maWd1cmF0aW9uIGlmIG5lZWRlZAotCQkJLy8KLQkJCWFkZFRvRGVmYXVsdENvbmZpZ3VyYXRpb24oKTsKLQkJCQotCQkJZG9FeGVjdXRlKCk7Ci0JCQl1cGRhdGVEZXNjcmlwdG9ycygpOwotCQkJCi0JCQlsb25nIHRpbWUgPSAwOwotCQkJaWYoVG5nVXRpbC5ERUJVRykgewotCQkJCXRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCX0KLQkJCW5lc3RlZENvbW1hbmRFeGNlY3V0b3IuZXhlY3V0ZU5lc3RlZENvbW1hbmRzKCk7Ci0JCQlpZihUbmdVdGlsLkRFQlVHKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJCU0Ryb3BDb21tYW5kLnJlZG8oKTogZXhlY3V0ZU5lc3RlZENvbW1hbmRzKCkuICIgKyAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSB0aW1lKSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCQotCQkJZXhlY3V0ZWQgPSB0cnVlOwotCQl9Ci0JCWNhdGNoKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkJaWYoVG5nVXRpbC5ERUJVRykgewotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9Ci0JCQlMaWJyYXJ5RWRpdFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQl0aHJvdyBlOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVXBkYXRlcyBkZXNjcmlwdG9ycwotCSAqLwotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZURlc2NyaXB0b3JzKCkgewotCQlpZiAoc3luY2hyb25pemUpIHsKLQkJCWNsZWFyRGVzY3JpcHRvcnMoKTsKLQkJCWlmKCFiYXRjaENvbW1hbmQuZ2V0RGVzY3JpcHRvcnNUb1JlZnJlc2goKS5pc0VtcHR5KCkpIHsKLQkJCQlBcnJheUxpc3Q8RVJlZmVyZW5jZT4gYmFzaWNTeW5jUmVmZXJlbmNlcyA9IG5ldyBBcnJheUxpc3Q8RVJlZmVyZW5jZT4oKTsKLQkJCQlmb3IgKE9iamVjdCBmZWF0dXJlIDogc3luY2hGZWF0dXJlcykgewotCQkJCQlpZihCQVNJQ19TWU5DX1JFRkVSRU5DRVMuY29udGFpbnMoZmVhdHVyZSkpIHsKLQkJCQkJCWJhc2ljU3luY1JlZmVyZW5jZXMuYWRkKChFUmVmZXJlbmNlKSBmZWF0dXJlKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAoIWJhc2ljU3luY1JlZmVyZW5jZXMuaXNFbXB0eSgpKSB7Ci0JCQkJCWZvciAoT2JqZWN0IGRlc2MgOiBiYXRjaENvbW1hbmQKLQkJCQkJCQkuZ2V0RGVzY3JpcHRvcnNUb1JlZnJlc2goKSkgewotCQkJCQkJRGVzY3JpcHRvciBkZXNjcmlwdG9yID0gKERlc2NyaXB0b3IpIGRlc2M7Ci0JCQkJCQlNZXRob2RFbGVtZW50IGVsZW1lbnQgPSBQcm9jZXNzVXRpbC5nZXRBc3NvY2lhdGVkRWxlbWVudChkZXNjcmlwdG9yKTsKLQkJCQkJCWlmKGVsZW1lbnQgaW5zdGFuY2VvZiBWYXJpYWJpbGl0eUVsZW1lbnQpIHsKLQkJCQkJCQlmb3IgKEVSZWZlcmVuY2UgcmVmIDogYmFzaWNTeW5jUmVmZXJlbmNlcykgewotCQkJCQkJCQlPYmplY3QgdmFsdWUgPSBQcm92aWRlcnMuZ2V0Q29uZmlndXJhdGlvbkFwcGxpY2F0b3IoKS5nZXRSZWZlcmVuY2UoKFZhcmlhYmlsaXR5RWxlbWVudCkgZWxlbWVudCwgcmVmLCBjb25maWcpOwotCQkJCQkJCQlFU3RydWN0dXJhbEZlYXR1cmUgZGVzY3JpcHRvckZlYXR1cmUgPSBGRUFUVVJFX01BUC5nZXQocmVmKTsKLQkJCQkJCQkJaWYoZGVzY3JpcHRvckZlYXR1cmUuaXNNYW55KCkpIHsKLQkJCQkJCQkJCWJhdGNoQ29tbWFuZC5hZGRGZWF0dXJlVmFsdWVzKGRlc2NyaXB0b3IsIGRlc2NyaXB0b3JGZWF0dXJlLCAoQ29sbGVjdGlvbikgdmFsdWUpOwotCQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQkJYmF0Y2hDb21tYW5kLmFkZEZlYXR1cmVWYWx1ZShkZXNjcmlwdG9yLCBkZXNjcmlwdG9yRmVhdHVyZSwgdmFsdWUpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJCQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJLy8gdXBkYXRlIG5ldyB2YWx1ZXM7Ci0JCS8vCi0JCWJhdGNoQ29tbWFuZC5leGVjdXRlKCk7Ci0JCQotCQl1cGRhdGVUYXNrRGVzY3JpcHRvcnMoKTsKLQotCQlzZXRSZXNwb25zaWJsZVJvbGVzKCk7Ci0JfQotCi0vLwkvKioKLS8vCSAqIEBwYXJhbSBkZXNjCi0vLwkgKiBAcGFyYW0gZmVhdHVyZQotLy8JICogQHBhcmFtIHZhbHVlCi0vLwkgKi8KLS8vCXByb3RlY3RlZCB2b2lkIHNhdmVPbGRGZWF0dXJlVmFsdWUoRGVzY3JpcHRvciBkZXNjLAotLy8JCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSkgewotLy8JCWlmIChkZXNjcmlwdG9yVG9PbGRGZWF0dXJlVmFsdWVzTWFwID09IG51bGwpIHsKLS8vCQkJZGVzY3JpcHRvclRvT2xkRmVhdHVyZVZhbHVlc01hcCA9IG5ldyBIYXNoTWFwKCk7Ci0vLwkJfQotLy8JCU9iamVjdCB2YWx1ZSA9IGRlc2MuZUdldChmZWF0dXJlKTsKLS8vCQlpZihmZWF0dXJlLmlzTWFueSgpKSB7Ci0vLwkJCXZhbHVlID0gbmV3IEFycmF5TGlzdCgoTGlzdCl2YWx1ZSk7Ci0vLwkJfQotLy8JCU1hcCBmZWF0dXJlTWFwID0gKE1hcCkgZGVzY3JpcHRvclRvT2xkRmVhdHVyZVZhbHVlc01hcC5nZXQoZGVzYyk7Ci0vLwkJaWYgKGZlYXR1cmVNYXAgPT0gbnVsbCkgewotLy8JCQlmZWF0dXJlTWFwID0gbmV3IEhhc2hNYXAoKTsKLS8vCQkJZGVzY3JpcHRvclRvT2xkRmVhdHVyZVZhbHVlc01hcC5wdXQoZGVzYywgZmVhdHVyZU1hcCk7Ci0vLwkJfQotLy8JCWZlYXR1cmVNYXAucHV0KGZlYXR1cmUsIHZhbHVlKTsKLS8vCX0KLQotCXByb3RlY3RlZCB2b2lkIHVuZG9VcGRhdGVEZXNjcmlwdG9ycygpIHsKLQkJdW5kb1NldFJlc3BvbnNpYmxlUm9sZSgpOwotCi0JCXVuZG9VcGRhdGVUYXNrRGVzY3JpcHRvcnMoKTsKLQotCQkvLyByZXN0b3JlIG9sZCB2YWx1ZXMKLQkJLy8KLQkJYmF0Y2hDb21tYW5kLnVuZG8oKTsKLQotCQkvLyByZXN0b3JlIHZhbHVlIGZvciByZWZyZXNoYWJsZSBmZWF0dXJlcyB0aGF0IGhhZCBiZWVuIGNsZWFyZWQKLQkJLy8KLQkJaWYgKHN5bmNocm9uaXplKSB7Ci0JCQl1bmRvQ2xlYXJEZXNjcmlwdG9ycygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNsZWFyRGVzY3JpcHRvcnMoKSB7Ci0JCWlmIChkZXNjcmlwdG9yVG9PbGRSZWZyZXNoYWJsZUZlYXR1cmVzTWFwID09IG51bGwpIHsKLQkJCWRlc2NyaXB0b3JUb09sZFJlZnJlc2hhYmxlRmVhdHVyZXNNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQkJaWYgKCFiYXRjaENvbW1hbmQuZ2V0RGVzY3JpcHRvcnNUb1JlZnJlc2goKS5pc0VtcHR5KCkpIHsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBiYXRjaENvbW1hbmQuZ2V0RGVzY3JpcHRvcnNUb1JlZnJlc2goKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQljbGVhckRlc2NyaXB0b3IoKERlc2NyaXB0b3IpIGl0ZXIubmV4dCgpKTsKLQkJCQl9Ci0JCQkJLy8gZGVzY3JpcHRvcnNUb1JlZnJlc2guY2xlYXIoKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFVwZGF0ZXMgYWZmZWN0ZWQgdGFzayBkZXNjcmlwdG9ycyB3aXRoIG5ldyBkYXRhIGZyb20gbWV0aG9kIGNvbnRlbnQKLQkgKi8KLQlwcml2YXRlIHZvaWQgdXBkYXRlVGFza0Rlc2NyaXB0b3JzKCkgewotCQlpZiAodGFza0Rlc2NyaXB0b3JzVG9VcGRhdGUgIT0gbnVsbCkgewotCQkJLy8gcmVmcmVzaCBzdGVwcyBmcm9tIHRoZSBhc3NvY2lhdGVkIHRhc2sKLQkJCS8vCi0JCQlpZihzeW5jaEZlYXR1cmVzLmNvbnRhaW5zKFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tfU3RlcHMoKSkpIHsKLQkJCQlpZiAodGFza0Rlc2NUb05ld1N0ZXBzTWFwID09IG51bGwpIHsKLQkJCQkJdGFza0Rlc2NUb05ld1N0ZXBzTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJCQl9Ci0JCQkJSUNvbmZpZ3VyYXRpb25BcHBsaWNhdG9yIGNvbmZpZ0FwcGxpY2F0b3IgPSBQcm92aWRlcnMKLQkJCQkuZ2V0Q29uZmlndXJhdGlvbkFwcGxpY2F0b3IoKTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB0YXNrRGVzY3JpcHRvcnNUb1VwZGF0ZS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCQkJVGFza0Rlc2NyaXB0b3IgdGFza0Rlc2MgPSAoVGFza0Rlc2NyaXB0b3IpIGl0ZXIubmV4dCgpOwotCQkJCQlUYXNrIHRhc2sgPSB0YXNrRGVzYy5nZXRUYXNrKCk7Ci0JCQkJCWlmICh0YXNrICE9IG51bGwgJiYgISgoRU9iamVjdCkgdGFzaykuZUlzUHJveHkoKSkgewotCQkJCQkJTGlzdCBzdGVwcyA9IChMaXN0KSBjb25maWdBcHBsaWNhdG9yLmdldFJlZmVyZW5jZSh0YXNrCi0JCQkJCQkJCS5nZXRQcmVzZW50YXRpb24oKSwgdGFzaywgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJLmdldENvbnRlbnREZXNjcmlwdGlvbl9TZWN0aW9ucygpLCBjb25maWcpOwotCQkJCQkJCi0JCQkJCQkvLyBhZGQgdGhvc2Ugc3RlcHMgdG8gVGFza0Rlc2NyaXB0b3IgaWYgdGhleSBhcmUgbm90IHRoZXJlCi0JCQkJCQkvLyB5ZXQuCi0JCQkJCQkvLwotCQkJCQkJQXJyYXlMaXN0IG5ld1N0ZXBzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQkJdGFza0Rlc2MuZ2V0U2VsZWN0ZWRTdGVwcygpLnJldGFpbkFsbChzdGVwcyk7Ci0JCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIxID0gc3RlcHMuaXRlcmF0b3IoKTsgaXRlcjEuaGFzTmV4dCgpOykgewotCQkJCQkJCU9iamVjdCBzdGVwID0gaXRlcjEubmV4dCgpOwotCQkJCQkJCWlmICghdGFza0Rlc2MuZ2V0U2VsZWN0ZWRTdGVwcygpLmNvbnRhaW5zKHN0ZXApKSB7Ci0JCQkJCQkJCW5ld1N0ZXBzLmFkZChzdGVwKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQlpZiAoIW5ld1N0ZXBzLmlzRW1wdHkoKSkgewotCQkJCQkJCXRhc2tEZXNjLmdldFNlbGVjdGVkU3RlcHMoKS5hZGRBbGwobmV3U3RlcHMpOwotCQkJCQkJCXRhc2tEZXNjVG9OZXdTdGVwc01hcC5wdXQodGFza0Rlc2MsIG5ld1N0ZXBzKTsKLS8vCQkJCQkJCVN5c3RlbS5vdXQKLS8vCQkJCQkJCS5wcmludGxuKCJCU0Ryb3BDb21tYW5kLnVwZGF0ZVRhc2tEZXNjcmlwdG9ycygpOiBjaGFuZ2VkIik7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCB1bmRvVXBkYXRlVGFza0Rlc2NyaXB0b3JzKCkgewotCQlpZiAodGFza0Rlc2NUb05ld1N0ZXBzTWFwICE9IG51bGwpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHRhc2tEZXNjVG9OZXdTdGVwc01hcC5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQlNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBpdGVyLm5leHQoKTsKLQkJCQlUYXNrRGVzY3JpcHRvciB0YXNrRGVzYyA9IChUYXNrRGVzY3JpcHRvcikgZW50cnkuZ2V0S2V5KCk7Ci0JCQkJdGFza0Rlc2MuZ2V0U2VsZWN0ZWRTdGVwcygpLnJlbW92ZUFsbCgKLQkJCQkJCShDb2xsZWN0aW9uKSBlbnRyeS5nZXRWYWx1ZSgpKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEdvIHRocnUgYWxsIHRoZSB3b3JrIHByb2R1Y3QgZGVzY3JpcHRvcnMgb2YgdGhpcyBhY3Rpdml0eSBhbmQgc2V0IHRoZQotCSAqIHJlc3BvbnNpYmxlIHJvbGUgZm9yIHRoZW0gaWYgdGhlcmUgaXMgYW55Ci0JICovCi0JcHJpdmF0ZSB2b2lkIHNldFJlc3BvbnNpYmxlUm9sZXMoKSB7Ci0JCWlmKCFzeW5jaEZlYXR1cmVzLmNvbnRhaW5zKFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFJvbGVfUmVzcG9uc2libGVGb3IoKSkpIHsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJaWYocmVmcmVzaFJlc3BvbnNpYmxlRm9yQ29tbWFuZCAhPSBudWxsKSB7Ci0JCQlyZWZyZXNoUmVzcG9uc2libGVGb3JDb21tYW5kLmRpc3Bvc2UoKTsKLQkJfQotCQlyZWZyZXNoUmVzcG9uc2libGVGb3JDb21tYW5kID0gbmV3IEJhdGNoQ29tbWFuZCh0cnVlKTsKLSAKLQkJTGlzdCBickVsZW1lbnRzID0gYWN0aXZpdHkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKTsKLQkJTGlzdCB3cERlc2NMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlMaXN0IHJvbGVEZXNjcmlwdG9ycyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChJdGVyYXRvciBpdG9yID0gYnJFbGVtZW50cy5pdGVyYXRvcigpOyBpdG9yLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBvYmogPSBpdG9yLm5leHQoKTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3IpIHsKLQkJCQl3cERlc2NMaXN0LmFkZChvYmopOwotCQkJfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBSb2xlRGVzY3JpcHRvcikgewotCQkJCXJvbGVEZXNjcmlwdG9ycy5hZGQob2JqKTsKLQkJCX0KLQkJfQotCi0JCWZvciAoSXRlcmF0b3IgaXRvciA9IHJvbGVEZXNjcmlwdG9ycy5pdGVyYXRvcigpOyBpdG9yLmhhc05leHQoKTspIHsKLQkJCVJvbGVEZXNjcmlwdG9yIHJvbGVEZXNjID0gKFJvbGVEZXNjcmlwdG9yKSBpdG9yLm5leHQoKTsKLQkJCVJvbGUgcm9sZSA9IHJvbGVEZXNjLmdldFJvbGUoKTsKLQkJCWlmIChyb2xlICE9IG51bGwpIHsJCQkJCi0JCQkJTGlzdCByZXNwb25zaWJsZVdvcmtQcm9kdWN0cyA9IChMaXN0KSBQcm92aWRlcnMuZ2V0Q29uZmlndXJhdGlvbkFwcGxpY2F0b3IoKS5nZXRSZWZlcmVuY2Uocm9sZSwgVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Um9sZV9SZXNwb25zaWJsZUZvcigpLCBjb25maWcpOwotCQkJCUxpc3QgcmVzcG9uc2libGVXUERMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCWZvciAoaW50IGogPSB3cERlc2NMaXN0LnNpemUoKSAtIDE7IGogPiAtMTsgai0tKSB7Ci0JCQkJCVdvcmtQcm9kdWN0RGVzY3JpcHRvciB3cERlc2MgPSAoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSB3cERlc2NMaXN0Ci0JCQkJCQkJLmdldChqKTsKLS8vCQkJCQlSb2xlRGVzY3JpcHRvciByZXNwb25zaWJsZVJvbGVEZXNjID0gQXNzb2NpYXRpb25IZWxwZXIuZ2V0UmVzcG9uc2libGVSb2xlRGVzY3JpcHRvcih3cERlc2MpOwotLy8JCQkJCWlmIChyZXNwb25zaWJsZVdvcmtQcm9kdWN0cy5jb250YWlucyh3cERlc2MKLS8vCQkJCQkJCS5nZXRXb3JrUHJvZHVjdCgpKQotLy8JCQkJCQkJJiYgIHJlc3BvbnNpYmxlUm9sZURlc2MgIT0gcm9sZURlc2MpIHsKLS8vCQkJCQkJd3BkVG9PbGRSZXNwb25zaWJsZVJvbGVNYXAucHV0KHdwRGVzYywgcmVzcG9uc2libGVSb2xlRGVzYyk7Ci0vLy8vCQkJCQkJd3BEZXNjLnNldFJlc3BvbnNpYmxlUm9sZShyb2xlRGVzYyk7Ci0vLwkJCQkJCXJvbGVEZXNjLmdldFJlc3BvbnNpYmxlRm9yKCkuYWRkKHdwRGVzYyk7Ci0vLwkJCQkJfQotCQkJCQkKLQkJCQkJaWYocmVzcG9uc2libGVXb3JrUHJvZHVjdHMuY29udGFpbnMod3BEZXNjLmdldFdvcmtQcm9kdWN0KCkpKSB7Ci0JCQkJCQlyZXNwb25zaWJsZVdQRExpc3QuYWRkKHdwRGVzYyk7Ci0JCQkJCX0KLQkJCQl9CQkJCQotCQkJCWlmKCFyb2xlRGVzYy5nZXRSZXNwb25zaWJsZUZvcigpLmVxdWFscyhyZXNwb25zaWJsZVdQRExpc3QpKSB7Ci0JCQkJCXJlZnJlc2hSZXNwb25zaWJsZUZvckNvbW1hbmQuYWRkRmVhdHVyZVZhbHVlcyhyb2xlRGVzYywgVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Um9sZURlc2NyaXB0b3JfUmVzcG9uc2libGVGb3IoKSwgcmVzcG9uc2libGVXUERMaXN0KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCXJlZnJlc2hSZXNwb25zaWJsZUZvckNvbW1hbmQuZXhlY3V0ZSgpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkFic3RyYWN0Q29tbWFuZCN1bmRvKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bmRvKCkgewotCQluZXN0ZWRDb21tYW5kRXhjZWN1dG9yLnVuZG9OZXN0ZWRDb21tYW5kcygpOwotCQkKLQkJLy8gcmVtb3ZlIGFueSBvYmplY3QgdGhhdCBoYWQgYmVlbiBhZGRlZCB0byB0aGUgZGVmYXVsdCBjb25maWd1cmF0aW9uCi0JCS8vCi0JCWlmIChhZGRlZE9iamVjdHMgIT0gbnVsbCAmJiAhYWRkZWRPYmplY3RzLmlzRW1wdHkoKSkgewotCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSBwcm9jZXNzLmdldERlZmF1bHRDb250ZXh0KCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBhZGRlZE9iamVjdHMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyLm5leHQoKTsKLQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikgewotCQkJCQljb25maWcuZ2V0TWV0aG9kUGx1Z2luU2VsZWN0aW9uKCkucmVtb3ZlKGVsZW1lbnQpOwotCQkJCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZFBhY2thZ2UpIHsKLQkJCQkJY29uZmlnLmdldE1ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKS5yZW1vdmUoZWxlbWVudCk7Ci0JCQkJfQotCQkJfQotCQkJYWRkZWRUb0RlZmF1bHRDb25maWcgPSBmYWxzZTsKLQkJfQotCi0JCXVuZG9VcGRhdGVEZXNjcmlwdG9ycygpOwotCi0JCWRvVW5kbygpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgdm9pZCB1bmRvQ2xlYXJEZXNjcmlwdG9ycygpIHsKLQkJaWYoZGVzY3JpcHRvclRvT2xkUmVmcmVzaGFibGVGZWF0dXJlc01hcCAhPSBudWxsKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBkZXNjcmlwdG9yVG9PbGRSZWZyZXNoYWJsZUZlYXR1cmVzTWFwLmVudHJ5U2V0KCkKLQkJCQkJLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCU1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIGl0ZXIubmV4dCgpOwotCQkJCURlc2NyaXB0b3IgZGVzYyA9IChEZXNjcmlwdG9yKSBlbnRyeS5nZXRLZXkoKTsKLQkJCQlNYXAgZmVhdHVyZU1hcCA9IChNYXApIGVudHJ5LmdldFZhbHVlKCk7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGZlYXR1cmVNYXAuZW50cnlTZXQoKS5pdGVyYXRvcigpOyBpdGVyYXRvcgotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCWVudHJ5ID0gKE1hcC5FbnRyeSkgaXRlcmF0b3IubmV4dCgpOwotCQkJCQlkZXNjCi0JCQkJCS5lU2V0KChFU3RydWN0dXJhbEZlYXR1cmUpIGVudHJ5LmdldEtleSgpLCBlbnRyeQotCQkJCQkJCS5nZXRWYWx1ZSgpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBVbmRvZXMgdGhlIGNoYW5nZSBtYWRlIGJ5Ci0JICoge0BsaW5rICNzZXRSZXNwb25zaWJsZVJvbGVzKCkgc2V0UmVzcG9uc2libGVSb2xlcygpIH0KLQkgKi8KLQlwcml2YXRlIHZvaWQgdW5kb1NldFJlc3BvbnNpYmxlUm9sZSgpIHsKLS8vCQlpZih3cGRUb09sZFJlc3BvbnNpYmxlUm9sZU1hcCAhPSBudWxsICYmICF3cGRUb09sZFJlc3BvbnNpYmxlUm9sZU1hcC5pc0VtcHR5KCkpIHsKLS8vCQkJZm9yIChJdGVyYXRvciBpdGVyID0gd3BkVG9PbGRSZXNwb25zaWJsZVJvbGVNYXAuZW50cnlTZXQoKS5pdGVyYXRvcigpOyBpdGVyCi0vLwkJCS5oYXNOZXh0KCk7KSB7Ci0vLwkJCQlNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBpdGVyLm5leHQoKTsKLS8vCQkJCVdvcmtQcm9kdWN0RGVzY3JpcHRvciB3cGQgPSAoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBlbnRyeS5nZXRLZXkoKTsKLS8vCQkJCSgoUm9sZURlc2NyaXB0b3IpIGVudHJ5LmdldFZhbHVlKCkpLmdldFJlc3BvbnNpYmxlRm9yKCkucmVtb3ZlKHdwZCk7Ci0vLwkJCX0KLS8vCQl9Ci0JCWlmKHJlZnJlc2hSZXNwb25zaWJsZUZvckNvbW1hbmQgIT0gbnVsbCkgewotCQkJcmVmcmVzaFJlc3BvbnNpYmxlRm9yQ29tbWFuZC51bmRvKCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBwcmVwYXJlKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgZG9FeGVjdXRlKCk7Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBkb1VuZG8oKTsKLQotCXB1YmxpYyBzdGF0aWMgaW50ZXJmYWNlIElFeGVjdXRvciB7Ci0JCWJvb2xlYW4gcHJlRXhlY3V0ZSgpOwotCi0JCXZvaWQgZG9FeGNlY3V0ZSgpOwotCi0JCXZvaWQgZG9VbmRvKCk7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvQmFzaWNTeW5jaHJvbml6ZURlc2NyaXB0b3JDb21tYW5kLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9CYXNpY1N5bmNocm9uaXplRGVzY3JpcHRvckNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTU4MGUwMS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9CYXNpY1N5bmNocm9uaXplRGVzY3JpcHRvckNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQWJzdHJhY3RDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5Qcm92aWRlcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklSZXNvdXJjZUF3YXJlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuUHJvY2Vzc1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvcjsKLQotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgNy4wCi0gKi8KLXB1YmxpYyBjbGFzcyBCYXNpY1N5bmNocm9uaXplRGVzY3JpcHRvckNvbW1hbmQgZXh0ZW5kcyBBYnN0cmFjdENvbW1hbmQKLQkJaW1wbGVtZW50cyBJUmVzb3VyY2VBd2FyZUNvbW1hbmQgewotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU2V0IE5PTkVNUFRZX0FUVFJJQlVURVMgPSBuZXcgSGFzaFNldChBcnJheXMuYXNMaXN0KAotCQkJbmV3IEVTdHJ1Y3R1cmFsRmVhdHVyZVtdIHsKLQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TmFtZWRFbGVtZW50X05hbWUoKSwKLQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWV0aG9kRWxlbWVudF9QcmVzZW50YXRpb25OYW1lKCkKLQkJCX0KLQkpKTsKLQkKLQotCXByb3RlY3RlZCBEZXNjcmlwdG9yIGRlc2NyaXB0b3I7Ci0JcHJvdGVjdGVkIFNldCBzeW5jaEZlYXR1cmVzOwotCXByb3RlY3RlZCBNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZzsKLQlwcml2YXRlIEhhc2hNYXAgZmVhdHVyZU1hcDsKLQotCXB1YmxpYyBCYXNpY1N5bmNocm9uaXplRGVzY3JpcHRvckNvbW1hbmQoRGVzY3JpcHRvciBkZXNjcmlwdG9yLCBTZXQgc3luY2hGZWF0dXJlcywgTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLQkJdGhpcy5kZXNjcmlwdG9yID0gZGVzY3JpcHRvcjsKLQkJaWYgKHN5bmNoRmVhdHVyZXMgPT0gbnVsbCkgewotCQkJdGhpcy5zeW5jaEZlYXR1cmVzID0gQlNEcm9wQ29tbWFuZC5ERUZBVUxUX1NZTkNIX0ZFQVRVUkVTOwotCQl9Ci0JCWVsc2UgewotCQkJdGhpcy5zeW5jaEZlYXR1cmVzID0gc3luY2hGZWF0dXJlczsKLQkJfQotCQl0aGlzLmNvbmZpZyA9IGNvbmZpZzsKLQl9Ci0JCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0TW9kaWZpZWRSZXNvdXJjZXMoKSB7Ci0JCWlmKGRlc2NyaXB0b3IuZVJlc291cmNlKCkgIT0gbnVsbCkgewotCQkJcmV0dXJuIENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QoZGVzY3JpcHRvci5lUmVzb3VyY2UoKSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBAcGFyYW0gZmVhdHVyZQotCSAqIEBwYXJhbSB2YWx1ZQotCSAqLwotCXByaXZhdGUgdm9pZCBzYXZlT2xkRmVhdHVyZVZhbHVlKEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKSB7Ci0JCWlmIChmZWF0dXJlTWFwID09IG51bGwpIHsKLQkJCWZlYXR1cmVNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQl9Ci0JCWZlYXR1cmVNYXAucHV0KGZlYXR1cmUsIGRlc2NyaXB0b3IuZUdldChmZWF0dXJlKSk7Ci0JfQotCi0KLQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQkvLyB1cGRhdGUgdGhlIGxpbmtlZCBlbGVtZW50IGlmIHJlcXVpcmVkCi0JCS8vCi0JCU1ldGhvZEVsZW1lbnQgZSA9IFByb2Nlc3NVdGlsLmdldEFzc29jaWF0ZWRFbGVtZW50KGRlc2NyaXB0b3IpOwotCQlPYmplY3QgcmVzb2x2ZWQgPSBQcm92aWRlcnMuZ2V0Q29uZmlndXJhdGlvbkFwcGxpY2F0b3IoKS5yZXNvbHZlKGUsIGNvbmZpZyk7Ci0JCWlmKHJlc29sdmVkICE9IGUpIHsKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlOwotCQkJaWYoZGVzY3JpcHRvciBpbnN0YW5jZW9mIFRhc2tEZXNjcmlwdG9yKSB7Ci0JCQkJZmVhdHVyZSA9IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tEZXNjcmlwdG9yX1Rhc2soKTsJCQkJCQotCQkJfQotCQkJZWxzZSBpZihkZXNjcmlwdG9yIGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yKSB7Ci0JCQkJZmVhdHVyZSA9IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9Xb3JrUHJvZHVjdCgpOwkJCQkJCi0JCQl9Ci0JCQllbHNlIGlmKGRlc2NyaXB0b3IgaW5zdGFuY2VvZiBSb2xlRGVzY3JpcHRvcikgewotCQkJCWZlYXR1cmUgPSBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRSb2xlRGVzY3JpcHRvcl9Sb2xlKCk7CQkJCQkKLQkJCX0KLQkJCWVsc2UgewotCQkJCWZlYXR1cmUgPSBudWxsOwotCQkJfQotCQkJc2F2ZU9sZEZlYXR1cmVWYWx1ZShmZWF0dXJlKTsKLQkJCWUgPSAoTWV0aG9kRWxlbWVudCkgcmVzb2x2ZWQ7Ci0JCQlkZXNjcmlwdG9yLmVTZXQoZmVhdHVyZSwgZSk7Ci0JCX0KLQkJCi0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHN5bmNoRmVhdHVyZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZiA9IGl0ZXIubmV4dCgpOwotCQkJaWYoZiBpbnN0YW5jZW9mIEVBdHRyaWJ1dGUpIHsKLQkJCQlFQXR0cmlidXRlIGF0dHJpYiA9IChFQXR0cmlidXRlKSBmOyAKLQkJCQlFQXR0cmlidXRlIGRlc2NBdHRyaWIgPSAoRUF0dHJpYnV0ZSkgQlNEcm9wQ29tbWFuZC5GRUFUVVJFX01BUC5nZXQoYXR0cmliKTsKLQkJCQlpZihkZXNjQXR0cmliICE9IG51bGwpIHsKLQkJCQkJaWYoTk9ORU1QVFlfQVRUUklCVVRFUy5jb250YWlucyhhdHRyaWIpKSB7Ci0JCQkJCQkvLyByZWZyZXNoIGF0dHJpYnV0ZSB0aGF0IGNhbiBub3QgYmUgZW1wdHkKLQkJCQkJCS8vCi0JCQkJCQlPYmplY3QgdmFsdWUgPSAgZSBpbnN0YW5jZW9mIFZhcmlhYmlsaXR5RWxlbWVudCA/IAotCQkJCQkJCQkoU3RyaW5nKSBQcm92aWRlcnMuZ2V0Q29uZmlndXJhdGlvbkFwcGxpY2F0b3IoKS5nZXRBdHRyaWJ1dGUoKFZhcmlhYmlsaXR5RWxlbWVudCkgZSwgYXR0cmliLCBjb25maWcpIAotCQkJCQkJCQk6IGUuZUdldChhdHRyaWIpOwotCQkJCQkJLy8gaWYgYXR0cml1YnV0ZSBpcyBwcmVzZW50YXRpb24gbmFtZSBhbmQgbmV3IHZhbHVlIGlzIGJsYW5rLCBjb3B5IG5hbWUgb3ZlcgotCQkJCQkJaWYgKChkZXNjQXR0cmliLmVxdWFscyhVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRNZXRob2RFbGVtZW50X1ByZXNlbnRhdGlvbk5hbWUoKSkpICYmICh2YWx1ZSA9PSBudWxsIHx8IHZhbHVlLmVxdWFscygiIikpKSAvLyROT04tTkxTLTEkCi0JCQkJCQkJdmFsdWUgPSBlIGluc3RhbmNlb2YgVmFyaWFiaWxpdHlFbGVtZW50ID8gCi0JCQkJCQkJCQkoU3RyaW5nKSBQcm92aWRlcnMuZ2V0Q29uZmlndXJhdGlvbkFwcGxpY2F0b3IoKS5nZXRBdHRyaWJ1dGUoKFZhcmlhYmlsaXR5RWxlbWVudCkgZSwgVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TmFtZWRFbGVtZW50X05hbWUoKSwgY29uZmlnKSAKLQkJCQkJCQkJCTogZS5lR2V0KFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE5hbWVkRWxlbWVudF9OYW1lKCkpOwotCQkJCQkJT2JqZWN0IGRlc2NWYWx1ZSA9IGRlc2NyaXB0b3IuZUdldChkZXNjQXR0cmliKTsKLQkJCQkJCi0JCQkJCQlpZigodmFsdWUgPT0gbnVsbCAmJiBkZXNjVmFsdWUgIT0gbnVsbCkgfHwgKHZhbHVlICE9IG51bGwgJiYgIXZhbHVlLmVxdWFscyhkZXNjVmFsdWUpKSkgewotCQkJCQkJCXNhdmVPbGRGZWF0dXJlVmFsdWUoZGVzY0F0dHJpYik7Ci0JCQkJCQkJZGVzY3JpcHRvci5lU2V0KGRlc2NBdHRyaWIsIHZhbHVlKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCS8vIHJlc2V0IGF0dHJpYnV0ZSB0byBpdHMgZGVmYXVsdCB2YWx1ZQotCQkJCQkJLy8KLQkJCQkJCXNhdmVPbGRGZWF0dXJlVmFsdWUoZGVzY0F0dHJpYik7Ci0JCQkJCQlkZXNjcmlwdG9yLmVTZXQoZGVzY0F0dHJpYiwgZGVzY0F0dHJpYi5nZXREZWZhdWx0VmFsdWUoKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCByZWRvKCkgewotCQlleGVjdXRlKCk7Ci0JfQotCQotCXByb3RlY3RlZCBib29sZWFuIHByZXBhcmUoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB1bmRvKCkgewotCQlpZihmZWF0dXJlTWFwICE9IG51bGwpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBmZWF0dXJlTWFwLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IKLQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSkgaXRlcmF0b3IubmV4dCgpOwotCQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgZW50cnkKLQkJCQkuZ2V0S2V5KCk7Ci0JCQkJdHJ5IHsKLQkJCQkJZGVzY3JpcHRvci5lU2V0KGZlYXR1cmUsIGVudHJ5LmdldFZhbHVlKCkpOwotCQkJCX0KLQkJCQljYXRjaChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCQkJdGhyb3cgZTsKLQkJCQl9Ci0JCQl9CQotCQkJZmVhdHVyZU1hcC5jbGVhcigpOwotCQl9Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5BYnN0cmFjdENvbW1hbmQjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJaWYoZmVhdHVyZU1hcCAhPSBudWxsKSB7Ci0JCQlmZWF0dXJlTWFwLmNsZWFyKCk7Ci0JCQlmZWF0dXJlTWFwID0gbnVsbDsKLQkJfQkJCi0JCXN1cGVyLmRpc3Bvc2UoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9Db250cmlidXRlVG9BY3Rpdml0eUNvbW1hbmQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL0NvbnRyaWJ1dGVUb0FjdGl2aXR5Q29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNDM1Mjc5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL0NvbnRyaWJ1dGVUb0FjdGl2aXR5Q29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuUHJvY2Vzc1V0aWw7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZSAtIE9jdCAxMCwgMjAwNQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQ29udHJpYnV0ZVRvQWN0aXZpdHlDb21tYW5kIGV4dGVuZHMgVmFyeUFjdGl2aXR5Q29tbWFuZCB7Ci0KLQkvKioKLQkgKiBAcGFyYW0gd3JhcHBlcgotCSAqLwotCXB1YmxpYyBDb250cmlidXRlVG9BY3Rpdml0eUNvbW1hbmQoCi0JCQlCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlciB3cmFwcGVyKSB7Ci0JCXN1cGVyKHdyYXBwZXIpOwotCQlzZXRMYWJlbChMaWJyYXJ5RWRpdFJlc291cmNlcy5jb250cmlidXRlVG9BY3Rpdml0eV90ZXh0KTsgCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQuVmFyeUFjdGl2aXR5Q29tbWFuZCNkb1ZhcnkoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRvVmFyeSgpIHsKLQkJUHJvY2Vzc1V0aWwuY29udHJpYnV0ZVRvQWN0aXZpdHkod3JhcHBlciwgY3JlYXRlZEFjdGl2aXRpZXMpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvQ29weUhlbHBlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvQ29weUhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNmJiYTY3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL0NvcHlIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZDsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db3B5Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBDb3B5SGVscGVyIGV4dGVuZHMgQ29weUNvbW1hbmQuSGVscGVyIHsKLQkvKioKLQkgKiBDb21tZW50IGZvciA8Y29kZT5zZXJpYWxWZXJzaW9uVUlEPC9jb2RlPgotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDUyNjQzODkzOTM5NTU2MzkwMDRMOwotCi0JcHJpdmF0ZSBNYXAgY29weVRvT3JpZ2luYWxNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQotCXByaXZhdGUgTWFwIGJhc2VUb1ZhcmlhYmlsaXR5RWxlbWVudE1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JcHJpdmF0ZSBNYXAgYmFzZVRvQmFja3VwVmFyaWFiaWxpdHlFbGVtZW50TWFwID0gbmV3IEhhc2hNYXAoKTsKLQotCXByaXZhdGUgTWFwPFN0cmluZywgQnJlYWtkb3duRWxlbWVudD4gd3JhcHBlclBhdGhUb0NvcHlNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIEJyZWFrZG93bkVsZW1lbnQ+KCk7Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgamF2YS51dGlsLkhhc2hNYXAjY2xlYXIoKQotCSAqLwotCXB1YmxpYyB2b2lkIGNsZWFyKCkgewkJCi0JCXN1cGVyLmNsZWFyKCk7Ci0JCWNvcHlUb09yaWdpbmFsTWFwLmNsZWFyKCk7Ci0JCWJhc2VUb0JhY2t1cFZhcmlhYmlsaXR5RWxlbWVudE1hcC5jbGVhcigpOwotCQliYXNlVG9WYXJpYWJpbGl0eUVsZW1lbnRNYXAuY2xlYXIoKTsKLQkJd3JhcHBlclBhdGhUb0NvcHlNYXAuY2xlYXIoKTsKLQl9Ci0JCi0JcHVibGljIE9iamVjdCBnZXRPcmlnaW5hbChPYmplY3QgY29weSkgewotCQlyZXR1cm4gY29weVRvT3JpZ2luYWxNYXAuZ2V0KGNvcHkpOwotCX0KLQkKLQlwdWJsaWMgT2JqZWN0IHB1dFZhcmlhYmlsaXR5RWxlbWVudChWYXJpYWJpbGl0eUVsZW1lbnQgYmFzZSwgVmFyaWFiaWxpdHlFbGVtZW50IHZlKSB7Ci0JCXJldHVybiBiYXNlVG9WYXJpYWJpbGl0eUVsZW1lbnRNYXAucHV0KGJhc2UsIHZlKTsKLQl9Ci0JCi0JcHVibGljIE9iamVjdCByZW1vdmVWYXJpYWJpbGl0eUVsZW1lbnQoVmFyaWFiaWxpdHlFbGVtZW50IGJhc2UpIHsKLQkJcmV0dXJuIGJhc2VUb1ZhcmlhYmlsaXR5RWxlbWVudE1hcC5yZW1vdmUoYmFzZSk7Ci0JfQotCQotCXB1YmxpYyBPYmplY3QgcHV0QmFja3VwQ29weShWYXJpYWJpbGl0eUVsZW1lbnQgYmFzZSwgVmFyaWFiaWxpdHlFbGVtZW50IGJhY2t1cCkgewotCQlyZXR1cm4gYmFzZVRvQmFja3VwVmFyaWFiaWxpdHlFbGVtZW50TWFwLnB1dChiYXNlLCBiYWNrdXApOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29weUNvbW1hbmQuSGVscGVyI3B1dChqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBFT2JqZWN0IHB1dChFT2JqZWN0IGtleSwgRU9iamVjdCB2YWx1ZSkgewotCQljb3B5VG9PcmlnaW5hbE1hcC5wdXQodmFsdWUsIGtleSk7Ci0JCXJldHVybiBzdXBlci5wdXQoa2V5LCB2YWx1ZSk7Ci0JfQotCQotCXB1YmxpYyBPYmplY3QgYmFzaWNQdXQoRU9iamVjdCBrZXksIEVPYmplY3QgdmFsdWUpIHsKLQkJT2JqZWN0IG9sZCA9IHN1cGVyLnB1dChrZXksIHZhbHVlKTsKLQkJaW5pdGlhbGl6YXRpb25MaXN0LnJlbW92ZShrZXkpOwotCQlyZXR1cm4gb2xkOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvcHlDb21tYW5kLkhlbHBlciNnZXRDb3B5KG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KQotCSAqLwotCXB1YmxpYyBFT2JqZWN0IGdldENvcHkoRU9iamVjdCBvYmplY3QpIHsKLQkJaWYob2JqZWN0IGluc3RhbmNlb2YgVmFyaWFiaWxpdHlFbGVtZW50KSB7Ci0JCQlPYmplY3QgdmUgPSBnZXRWYXJpYWJpbGl0eUVsZW1lbnQoYmFzZVRvVmFyaWFiaWxpdHlFbGVtZW50TWFwLCBvYmplY3QpOwotCQkJaWYodmUgIT0gbnVsbCkgewotCQkJCXJldHVybiBzdXBlci5nZXRDb3B5KChFT2JqZWN0KSB2ZSk7Ci0JCQl9Ci0JCX0KLQkJRU9iamVjdCBjb3B5ID0gc3VwZXIuZ2V0Q29weShvYmplY3QpOwotCQlpZihjb3B5ID09IG51bGwpIHsKLQkJCS8vIGdldCBiYWNrdXAgY29weQotCQkJLy8KLQkJCU9iamVjdCB2ZSA9IGdldFZhcmlhYmlsaXR5RWxlbWVudChiYXNlVG9CYWNrdXBWYXJpYWJpbGl0eUVsZW1lbnRNYXAsIG9iamVjdCk7Ci0JCQlpZih2ZSAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIHN1cGVyLmdldENvcHkoKEVPYmplY3QpIHZlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gY29weTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgT2JqZWN0IGdldFZhcmlhYmlsaXR5RWxlbWVudChNYXAgYmFzZVRvVmFyaWFiaWxpdHlFbGVtZW50TWFwLCBPYmplY3QgYmFzZSkgewotCQlPYmplY3QgdmUgPSBudWxsOwkJCi0JCWRvIHsKLQkJCWJhc2UgPSBiYXNlVG9WYXJpYWJpbGl0eUVsZW1lbnRNYXAuZ2V0KGJhc2UpOwotCQkJaWYoYmFzZSAhPSBudWxsKSB7Ci0JCQkJdmUgPSBiYXNlOwotCQkJfQotCQl9IHdoaWxlIChiYXNlICE9IG51bGwpOwotCQlyZXR1cm4gdmU7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29weUNvbW1hbmQuSGVscGVyI2dldENvcHlUYXJnZXQob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QsIGJvb2xlYW4pCi0JICovCi0JcHVibGljIEVPYmplY3QgZ2V0Q29weVRhcmdldChFT2JqZWN0IHRhcmdldCwgYm9vbGVhbiBjb3B5UmVxdWlyZWQpIHsKLQkJaWYoY29weVJlcXVpcmVkKSB7Ci0JCQlyZXR1cm4gc3VwZXIuZ2V0Q29weSh0YXJnZXQpOwotCQl9Ci0JCWVsc2UgewotCQkJRU9iamVjdCBjb3BpZWQgPSBnZXRDb3B5KHRhcmdldCk7Ci0JCQlpZiAoY29waWVkID09IG51bGwpCi0JCQl7Ci0JCQkJcmV0dXJuIHRhcmdldDsKLQkJCX0KLQkJCXJldHVybiBjb3BpZWQ7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIE1hcCBnZXRPYmplY3RUb0NvcHlNYXAoKSB7Ci0JCUhhc2hTZXQgb2JqZWN0cyA9IG5ldyBIYXNoU2V0KGJhc2VUb0JhY2t1cFZhcmlhYmlsaXR5RWxlbWVudE1hcC5rZXlTZXQoKSk7Ci0JCW9iamVjdHMuYWRkQWxsKGJhc2VUb1ZhcmlhYmlsaXR5RWxlbWVudE1hcC5rZXlTZXQoKSk7Ci0JCW9iamVjdHMuYWRkQWxsKGtleVNldCgpKTsJCQotCQlNYXAgbWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gb2JqZWN0cy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBvYmplY3QgPSBpdGVyLm5leHQoKTsKLQkJCW1hcC5wdXQob2JqZWN0LCBnZXRDb3B5KChFT2JqZWN0KSBvYmplY3QpKTsKLQkJfQotCQlyZXR1cm4gbWFwOwotCX0JCQotCi0JcHVibGljIHZvaWQgcHV0V3JhcHBlckNvcHkoU3RyaW5nIGd1aWRQYXRoLCBCcmVha2Rvd25FbGVtZW50IGUpIHsKLQkJd3JhcHBlclBhdGhUb0NvcHlNYXAgLnB1dChndWlkUGF0aCwgZSk7Ci0JfQotCQotCXB1YmxpYyBCcmVha2Rvd25FbGVtZW50IGdldFdyYXBwZXJDb3B5KFN0cmluZyBndWlkUGF0aCkgewotCQlyZXR1cm4gd3JhcHBlclBhdGhUb0NvcHlNYXAuZ2V0KGd1aWRQYXRoKTsKLQl9Ci0KLQlwdWJsaWMgTWFwPFN0cmluZywgQnJlYWtkb3duRWxlbWVudD4gZ2V0V3JhcHBlclBhdGhUb0NvcHlNYXAoKSB7Ci0JCXJldHVybiB3cmFwcGVyUGF0aFRvQ29weU1hcDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvQ3JlYXRlUHJvY2Vzc0NvbXBvbmVudENvbW1hbmQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL0NyZWF0ZVByb2Nlc3NDb21wb25lbnRDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjZGNjOTkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvQ3JlYXRlUHJvY2Vzc0NvbXBvbmVudENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZDsKLQotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNyZWF0ZUNoaWxkQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5QcmVzZW50YXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklVc2VySW50ZXJhY3Rpb25IYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5NZXRob2RFbGVtZW50QWRkQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuVXNlcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQubmF2aWdhdG9yLlByb2Nlc3NQYWNrYWdlSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudWkuVXNlckludGVyYWN0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5BZGFwdGVyRmFjdG9yeUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5FeHRlbnNpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5JdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb24uSVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb24uSVZhbGlkYXRvckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzLklMaWJyYXJ5UGVyc2lzdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy5TZXJ2aWNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNhcGFiaWxpdHlQYXR0ZXJuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcnlQcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NGYW1pbHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5Db250ZW50RGVzY3JpcHRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5NZXNzYWdlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5VbWFVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLQotLyoqCi0gKiBFeGVjdXRlcyB0aGUgQ3JlYXRlIFByb2Nlc3MgQ29tcG9uZW50IGNvbW1hbmQuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBDcmVhdGVQcm9jZXNzQ29tcG9uZW50Q29tbWFuZCBleHRlbmRzIENyZWF0ZUNoaWxkQ29tbWFuZCB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBDb2xsZWN0aW9uPEVDbGFzcz4gRUNMQVNTRVMgPSBuZXcgSGFzaFNldDxFQ2xhc3M+KCk7Ci0KLQlwcml2YXRlIFByb2Nlc3MgcHJvY2VzczsKLQotCXByaXZhdGUgSVN0YXR1cyBzdGF0dXM7Ci0KLQlzdGF0aWMgewotCQlFQ0xBU1NFUy5hZGQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWV0aG9kUGFja2FnZSgpKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGNsYXNzIENvbXBhcmVCeU5hbWUgaW1wbGVtZW50cyBDb21wYXJhdG9yPE1ldGhvZEVsZW1lbnQ+IHsKLQotCQlwdWJsaWMgaW50IGNvbXBhcmUoTWV0aG9kRWxlbWVudCBvYmoxLCBNZXRob2RFbGVtZW50IG9iajIpIHsKLQkJCVN0cmluZyBuYW1lMSwgbmFtZTI7Ci0JCQlpZiAoUHJlc2VudGF0aW9uQ29udGV4dC5JTlNUQU5DRS5pc1Nob3dQcmVzZW50YXRpb25OYW1lcygpKSB7Ci0JCQkJbmFtZTEgPSBUbmdVdGlsLmdldFByZXNlbnRhdGlvbk5hbWUob2JqMSk7Ci0JCQkJbmFtZTIgPSBUbmdVdGlsLmdldFByZXNlbnRhdGlvbk5hbWUob2JqMik7Ci0JCQl9IGVsc2UgewotCQkJCW5hbWUxID0gKChNZXRob2RFbGVtZW50KSBvYmoxKS5nZXROYW1lKCk7Ci0JCQkJbmFtZTIgPSAoKE1ldGhvZEVsZW1lbnQpIG9iajIpLmdldE5hbWUoKTsJCQotCQkJfQotCQkJcmV0dXJuIG5hbWUxLmNvbXBhcmVUb0lnbm9yZUNhc2UobmFtZTIpOwotCQl9Ci0JfQotCi0JcHVibGljIGNsYXNzIENvbmZpZ1ZhbGlkYXRvciBpbXBsZW1lbnRzIElWYWxpZGF0b3IgewotCi0JCXB1YmxpYyBJU3RhdHVzIGlzVmFsaWQoT2JqZWN0IG9iaikgewotCQkJaWYgKG9iaiA9PSBudWxsKSB7Ci0JCQkJU3RyaW5nIG1zZyA9IExpYnJhcnlFZGl0UmVzb3VyY2VzLm5vRGVmYXVsdENvbmZpZ0Vycm9yX21zZzsKLQkJCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBMaWJyYXJ5RWRpdFBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCQkJCS5nZXRJZCgpLCAwLCBtc2csIG51bGwpOwotCQkJfQotCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGlzVmFsaWQoU3RyaW5nIG5hbWUpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIENyZWF0ZVByb2Nlc3NDb21wb25lbnRDb21tYW5kKEVkaXRpbmdEb21haW4gZG9tYWluLCBFT2JqZWN0IG93bmVyLAotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIE9iamVjdCBjaGlsZCwgaW50IGluZGV4LAotCQkJQ29sbGVjdGlvbjw/PiBzZWxlY3Rpb24sIEhlbHBlciBoZWxwZXIpIHsKLQkJc3VwZXIoZG9tYWluLCBvd25lciwgZmVhdHVyZSwgY2hpbGQsIGluZGV4LCBzZWxlY3Rpb24sIGhlbHBlcik7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY2FuVW5kbygpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCU1ldGhvZExpYnJhcnkgbGliID0gVW1hVXRpbC5nZXRNZXRob2RMaWJyYXJ5KG93bmVyKTsKLQkJCi0JCU9iamVjdCBzaGVsbCA9IExpYnJhcnlFZGl0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRDb250ZXh0KCk7Ci0JCQotCQkvLyBUaGUgb3duZXIgbXVzdCBiZSB1cGRhdGFibGUuCi0JCS8vCi0JCXN0YXR1cyA9IFVzZXJJbnRlcmFjdGlvbkhlbHBlci5jaGVja01vZGlmeShvd25lciwgc2hlbGwpOwotCQlpZiAoIXN0YXR1cy5pc09LKCkpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCUxpc3QgY29uZmlncyA9IGxpYi5nZXRQcmVkZWZpbmVkQ29uZmlndXJhdGlvbnMoKTsKLQkJTGlzdCBtZXRob2RDb25maWdzID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjb25maWdzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyLm5leHQoKTsKLQkJCWlmICghKGVsZW1lbnQgaW5zdGFuY2VvZiBQcm9jZXNzRmFtaWx5KSkgewotCQkJCW1ldGhvZENvbmZpZ3MuYWRkKGVsZW1lbnQpOwotCQkJfQotCQl9Ci0KLQkJaWYgKG1ldGhvZENvbmZpZ3MuaXNFbXB0eSgpKSB7Ci0JCQlzdGF0dXMgPSBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIExpYnJhcnlFZGl0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRJZCgpLAotCQkJCQkJCQkwLCBMaWJyYXJ5RWRpdFJlc291cmNlcy5ub0NvbmZpZ0Vycm9yX21zZywgbnVsbCk7Ci0vLwkJCU1lc3Nlbmdlci5JTlNUQU5DRS5zaG93RXJyb3IoCi0vLwkJCQkJTGlicmFyeUVkaXRSZXNvdXJjZXMuY3JlYXRlUHJvY2Vzc190ZXh0LAotLy8JCQkJCUxpYnJhcnlFZGl0UmVzb3VyY2VzLm5vQ29uZmlnRXJyb3JfbXNnKTsJCQkKLQkJCXJldHVybjsKLQkJfQotCi0JCVByb2Nlc3NQYWNrYWdlSXRlbVByb3ZpZGVyIGFkYXB0ZXIgPSAoUHJvY2Vzc1BhY2thZ2VJdGVtUHJvdmlkZXIpIGhlbHBlcjsKLQotCQlBcnJheUxpc3QgcHJvY0NsYXNzZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWlmIChhZGFwdGVyLmdldFByb2Nlc3NUeXBlKCkgPT0gVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0UHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUoKSkgewotCQkJcHJvY0NsYXNzZXMuYWRkKERlbGl2ZXJ5UHJvY2Vzcy5jbGFzcyk7Ci0JCQlwcm9jQ2xhc3Nlcy5hZGQoQ2FwYWJpbGl0eVBhdHRlcm4uY2xhc3MpOwotCQl9Ci0JCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSBVbWFVdGlsLmdldE1ldGhvZFBsdWdpbigoRWxlbWVudCkgb3duZXIpOwkJCi0JCUxpc3QgYmFzZVByb2NMaXN0ID0gVG5nVXRpbC5nZXRBdmFpbGFibGVCYXNlUHJvY2Vzc2VzKHBsdWdpbiwKLQkJCQlwcm9jQ2xhc3Nlcyk7Ci0KLQkJLy8gc29ydCBieSBuYW1lCi0JCUNvbGxlY3Rpb25zLnNvcnQobWV0aG9kQ29uZmlncywgbmV3IENvbXBhcmVCeU5hbWUoKSk7Ci0KLQkJTWV0aG9kQ29uZmlndXJhdGlvbltdIHByb2NDdHhzID0gbmV3IE1ldGhvZENvbmZpZ3VyYXRpb25bbWV0aG9kQ29uZmlncwotCQkJCS5zaXplKCldOwotCQltZXRob2RDb25maWdzLnRvQXJyYXkocHJvY0N0eHMpOwotCi0JCVByb2Nlc3NbXSBiYXNlUHJvY2Vzc2VzID0gbmV3IFByb2Nlc3NbYmFzZVByb2NMaXN0LnNpemUoKV07Ci0JCWJhc2VQcm9jTGlzdC50b0FycmF5KGJhc2VQcm9jZXNzZXMpOwotCi0JCWZpbmFsIFByb2Nlc3NDb21wb25lbnQgcHJvY0NvbXAgPSAoUHJvY2Vzc0NvbXBvbmVudCkgY2hpbGQ7Ci0JCUVDbGFzcyBwcm9jVHlwZSA9IGFkYXB0ZXIuZ2V0UHJvY2Vzc1R5cGUoKTsKLQkJcHJvY0NvbXAuc2V0UHJvY2VzcygoUHJvY2VzcykgVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlKHByb2NUeXBlKSk7Ci0JCQotCQlJVXNlckludGVyYWN0aW9uSGFuZGxlciB1aUhhbmRsZXIgPSBFeHRlbnNpb25NYW5hZ2VyLmdldERlZmF1bHRVc2VySW50ZXJhY3Rpb25IYW5kbGVyKCk7Ci0JCUxpc3QgdXNlcklucHV0cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJSVZhbGlkYXRvciBuYW1lVmFsaWRhdG9yID0gSVZhbGlkYXRvckZhY3RvcnkuSU5TVEFOQ0UuY3JlYXRlTmFtZVZhbGlkYXRvcigKLQkJCQlvd25lciwgcHJvY0NvbXApOwotCQkvLyBuYW1lCi0JCVVzZXJJbnB1dCBuYW1lSW5wdXQgPSBuZXcgVXNlcklucHV0KExpYnJhcnlFZGl0UmVzb3VyY2VzLm5hbWVMYWJlbF90ZXh0LCBVc2VySW5wdXQuVEVYVCwKLQkJCQlmYWxzZSwgbnVsbCwgbnVsbCwgbmFtZVZhbGlkYXRvciwgbnVsbCk7Ci0JCXVzZXJJbnB1dHMuYWRkKG5hbWVJbnB1dCk7Ci0JCQotCQkvLyBkZWZhdWx0IGNvbmZpZ3VyYXRpb24KLQkJLy8KLQkJVXNlcklucHV0IGRlZmF1bHRDb25maWdJbnB1dCA9IG5ldyBVc2VySW5wdXQoTGlicmFyeUVkaXRSZXNvdXJjZXMuZGVmYXVsdENvbmZpZ0xhYmVsX3RleHQsIFVzZXJJbnB1dC5TRUxFQ1RJT04sCi0JCQkJZmFsc2UsIG1ldGhvZENvbmZpZ3MsIG5ldyBJdGVtTGFiZWxQcm92aWRlcigpIHsKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgewotCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJCQlpZiAoUHJlc2VudGF0aW9uQ29udGV4dC5JTlNUQU5DRS5pc1Nob3dQcmVzZW50YXRpb25OYW1lcygpKQotCQkJCQkJcmV0dXJuIFRuZ1V0aWwuZ2V0UHJlc2VudGF0aW9uTmFtZShlbGVtZW50KTsKLQkJCQkJZWxzZSByZXR1cm4gKChNZXRob2RFbGVtZW50KSBlbGVtZW50KS5nZXROYW1lKCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJcmV0dXJuIGVsZW1lbnQudG9TdHJpbmcoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0sIG5ldyBDb25maWdWYWxpZGF0b3IoKSwgbnVsbCk7Ci0JCXVzZXJJbnB1dHMuYWRkKGRlZmF1bHRDb25maWdJbnB1dCk7Ci0JCS8vIGJhc2UgcHJvY2VzcwotCQlVc2VySW5wdXQgYmFzZVByb2NJbnB1dCA9IG51bGw7Ci0JCQotCQlpZihwcm9jQ29tcC5nZXRQcm9jZXNzKCkgaW5zdGFuY2VvZiBQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSkgewotCQkJYmFzZVByb2NJbnB1dCA9IG5ldyBVc2VySW5wdXQoTGlicmFyeUVkaXRSZXNvdXJjZXMuYmFzZWRPblByb2Nlc3Nlc0xhYmVsX3RleHQsIFVzZXJJbnB1dC5TRUxFQ1RJT04sCi0JCQkJCXRydWUsIGJhc2VQcm9jTGlzdCwgbmV3IEFkYXB0ZXJGYWN0b3J5SXRlbUxhYmVsUHJvdmlkZXIoVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpLCAgbnVsbCk7Ci0JCQl1c2VySW5wdXRzLmFkZChiYXNlUHJvY0lucHV0KTsKLQkJfQotCQkKLQkJYm9vbGVhbiBjYW5FeGVjdXRlID0gZmFsc2U7Ci0JCVN0cmluZyBtc2cgPSBOTFMuYmluZChMaWJyYXJ5RWRpdFJlc291cmNlcy5DcmVhdGVQcm9jZXNzQ29tcG9uZW50Q29tbWFuZF9NZXNzYWdlLCAKLQkJCQlUbmdVdGlsLmdldFR5cGVUZXh0KHByb2NUeXBlLmdldE5hbWUoKSkudG9Mb3dlckNhc2UoKSk7Ci0JCQotCQkvLyByZXF1ZXN0IGlucHV0Ci0JCWlmICh1aUhhbmRsZXIucmVxdWVzdElucHV0KExpYnJhcnlFZGl0UmVzb3VyY2VzLm5ld1Byb2Nlc3NDb21wb25lbnREaWFsb2dfdGl0bGUsIAotCQkJCW1zZywgdXNlcklucHV0cykpIHsKLQkJCVN0cmluZyBuYW1lID0gKFN0cmluZykgbmFtZUlucHV0LmdldElucHV0KCk7Ci0JCQlwcm9jQ29tcC5zZXROYW1lKG5hbWUpOwotCQkJcHJvY2VzcyA9IHByb2NDb21wLmdldFByb2Nlc3MoKTsKLQkJCXByb2Nlc3Muc2V0TmFtZShuYW1lKTsKLQkJCXByb2Nlc3Muc2V0UHJlc2VudGF0aW9uTmFtZShuYW1lKTsKLQkJCXByb2Nlc3Muc2V0RGVmYXVsdENvbnRleHQoKE1ldGhvZENvbmZpZ3VyYXRpb24pIGRlZmF1bHRDb25maWdJbnB1dC5nZXRJbnB1dCgpKTsKLQkJCWlmKGJhc2VQcm9jSW5wdXQgIT0gbnVsbCkgewotCQkJCUxpc3QgbGlzdCA9IChMaXN0KSBiYXNlUHJvY0lucHV0LmdldElucHV0KCk7Ci0JCQkJaWYoIWxpc3QuaXNFbXB0eSgpKSB7Ci0JCQkJCSgoUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUpcHJvY0NvbXApLmdldEJhc2VkT25Qcm9jZXNzZXMoKS5hZGRBbGwobGlzdCk7Ci0JCQkJfQotCQkJfQotCQkJY2FuRXhlY3V0ZSA9IHRydWU7Ci0JCX0KLQotCQlpZiAoY2FuRXhlY3V0ZSkgewotCQkJLy8gY3JlYXRlIHByb2Nlc3MgY29tcG9uZW50IG5lZWQgdG8gdXBkYXRlIHRoZSBjb25maWd1cmF0aW9uIHRoYXQKLQkJCS8vIGhhcyBiZWVuIHNlbGVjdGVkIGFzCi0JCQkvLyBkZWZhdWx0IGNvbnRleHQgb2YgaXRzIHByb2Nlc3MuIENoZWNrIGlmIHRoZSBjb25maWd1cmF0aW9uIGZpbGUKLQkJCS8vIGlzIHVwZGF0YWJsZQotCQkJLy8KLQkJCXN0YXR1cyA9IFVzZXJJbnRlcmFjdGlvbkhlbHBlci5jaGVja01vZGlmeShwcm9jQ29tcC5nZXRQcm9jZXNzKCkKLQkJCQkJLmdldERlZmF1bHRDb250ZXh0KCksIHNoZWxsKTsKLQkJCWlmICghc3RhdHVzLmlzT0soKSkgewotCQkJCXJldHVybjsKLQkJCX0KLQkJCQotCQkJc3VwZXIuZXhlY3V0ZSgpOwotCi0JCQlDb21tYW5kIGNtZCA9IGdldENvbW1hbmQoKTsKLQkJCWlmIChjbWQgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50QWRkQ29tbWFuZCkgewotCQkJCUlTdGF0dXMgc3RhdHVzID0gKChNZXRob2RFbGVtZW50QWRkQ29tbWFuZCkgY21kKS5nZXRTdGF0dXMoKTsKLQkJCQlpZiAoc3RhdHVzICE9IG51bGwgJiYgIXN0YXR1cy5pc09LKCkpIHsKLQkJCQkJdGhpcy5zdGF0dXMgPSBzdGF0dXM7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQl9Ci0KLQkJCWZpbmFsIE1ldGhvZENvbmZpZ3VyYXRpb24gcHJvY0N0eCA9IHByb2Nlc3MuZ2V0RGVmYXVsdENvbnRleHQoKTsKLQkJCQotCQkJLy8gbmVlZCB0byBhZGQgdGhlIHBhcmVudCBwYWNrYWdlcyBhbmQgcGx1Z2luIGludG8gdGhlIGNvbmZpZ3VyYXRpb24KLQkJCS8vIGFzIHdlbGwKLQkJCS8vIE5ldyBwcm9jZXNzIGluIG5ldyBwbHVnLWluIG5vdCBhdXRvbWF0aWNhbGx5IHZpc2libGUgaW4KLQkJCS8vIGNvbmZpZ3VyYXRpb24gdmlldwotCQkJTGlzdCBwa2dzID0gcHJvY0N0eC5nZXRNZXRob2RQYWNrYWdlU2VsZWN0aW9uKCk7Ci0JCQlmb3IgKEVPYmplY3Qgb2JqID0gcHJvY0NvbXA7IG9iaiAhPSBudWxsOyBvYmogPSBvYmouZUNvbnRhaW5lcigpKSB7Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIE1ldGhvZFBhY2thZ2UpIHsKLQkJCQkJcGtncy5hZGQob2JqKTsKLQkJCQl9Ci0JCQl9Ci0JCQlwcm9jQ3R4LmdldE1ldGhvZFBsdWdpblNlbGVjdGlvbigpLmFkZChwbHVnaW4pOwotCQkJCi0JCQlwcm9jZXNzLmdldFZhbGlkQ29udGV4dCgpLmFkZChwcm9jQ3R4KTsKLQkJCXByb2Nlc3Muc2V0UHJlc2VudGF0aW9uKENvbnRlbnREZXNjcmlwdGlvbkZhY3RvcnkKLQkJCQkJLmNyZWF0ZUNvbnRlbnREZXNjcmlwdGlvbihwcm9jZXNzKSk7Ci0KLQkJCVJ1bm5hYmxlIHJ1bm5hYmxlID0gbmV3IFJ1bm5hYmxlKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJLy8gc2F2ZSB0aGUgcmVzb3VyY2Ugb2YgcGFyZW50IFByb2Nlc3NQYWNrYWdlCi0JCQkJCVJlc291cmNlIHJlc291cmNlID0gKChFT2JqZWN0KSBvd25lcikuZVJlc291cmNlKCk7Ci0JCQkJCWlmIChyZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQkJCQlJTGlicmFyeVBlcnNpc3Rlci5GYWlsU2FmZU1ldGhvZExpYnJhcnlQZXJzaXN0ZXIgcGVyc2lzdGVyID0gU2VydmljZXMuZ2V0RGVmYXVsdExpYnJhcnlQZXJzaXN0ZXIoKQotCQkJCQkJCQkuZ2V0RmFpbFNhZmVQZXJzaXN0ZXIoKTsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJLy8gc2F2ZSB0aGUgcmVzb3VyY2Ugb2YgbmV3bHkgY3JlYXRlZAotCQkJCQkJCS8vIFByb2Nlc3NDb21wb25lbnQgYWdhaW4gYWZ0ZXIgY3JlYXRpbmcgcHJvY2VzcydzCi0JCQkJCQkJLy8gcHJlc2VudGF0aW9uCi0JCQkJCQkJcGVyc2lzdGVyLnNhdmUocHJvY0NvbXAuZVJlc291cmNlKCkpOwotCi0JCQkJCQkJcGVyc2lzdGVyLnNhdmUocmVzb3VyY2UpOwotCi0JCQkJCQkJLy8gc2F2ZSB0aGUgcmVzb3VyY2Ugb2YgdGhlIHByb2Nlc3MncyBkZWZhdWx0Ci0JCQkJCQkJLy8gY29udGV4dAotCQkJCQkJCXBlcnNpc3Rlci5zYXZlKHByb2NDdHguZVJlc291cmNlKCkpOwotCi0JCQkJCQkJcGVyc2lzdGVyLmNvbW1pdCgpOwotCQkJCQkJCQotCQkJCQkJCS8vIGNyZWF0ZSBuZXcgZGlhZ3JhbSBmaWxlCi0JCQkJCQkJLy8KLQkJCQkJCQkKLQkJCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJdHJ5IHsKLQkJCQkJCQkJcGVyc2lzdGVyLnJvbGxiYWNrKCk7Ci0JCQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCQkJCUxpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmxvZyhleCk7Ci0JCQkJCQkJCUxpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmxvZyhlKTsKLQkJCQkJCQl9Ci0JCQkJCQkJCi0JCQkJCQkJc3RhdHVzID0gU3RhdHVzLkNBTkNFTF9TVEFUVVM7Ci0JCQkJCQkJdGhyb3cgbmV3IE1lc3NhZ2VFeGNlcHRpb24oCi0JCQkJCQkJCQlOTFMKLQkJCQkJCQkJCQkJLmJpbmQoCi0JCQkJCQkJCQkJCQkJTGlicmFyeUVkaXRSZXNvdXJjZXMuc2F2ZVByb2Nlc3NFcnJvcl9yZWFzb24sCi0JCQkJCQkJCQkJCQkJcHJvY0NvbXAuZ2V0TmFtZSgpKSwgZSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9OwotCi0JCQlVc2VySW50ZXJhY3Rpb25IZWxwZXIKLQkJCQkJLnJ1bldpdGhQcm9ncmVzcygKLQkJCQkJCQlydW5uYWJsZSwKLQkJCQkJCQlNZXNzYWdlRm9ybWF0Ci0JCQkJCQkJCQkuZm9ybWF0KAotCQkJCQkJCQkJCQlMaWJyYXJ5RWRpdFJlc291cmNlcy5jcmVhdGluZ1Byb2Nlc3NDb21wb25lbnRUYXNrX25hbWUsCi0JCQkJCQkJCQkJCW5ldyBPYmplY3RbXSB7IHByb2NDb21wLmdldE5hbWUoKSB9KSk7IAotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgcmVkbygpIHsKLQkJc3VwZXIucmVkbygpOwotCQlQcm9jZXNzQ29tcG9uZW50IHByb2NDb21wID0gKFByb2Nlc3NDb21wb25lbnQpIGNoaWxkOwotCQlNZXRob2RDb25maWd1cmF0aW9uIHByb2NDdHggPSBwcm9jZXNzLmdldERlZmF1bHRDb250ZXh0KCk7Ci0JCWlmIChwcm9jQ3R4IGluc3RhbmNlb2YgTWV0aG9kQ29uZmlndXJhdGlvbikgewotCQkJKChNZXRob2RDb25maWd1cmF0aW9uKSBwcm9jQ3R4KS5nZXRNZXRob2RQYWNrYWdlU2VsZWN0aW9uKCkuYWRkKAotCQkJCQlwcm9jQ29tcCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ3JlYXRlQ2hpbGRDb21tYW5kI3VuZG8oKQotCSAqLwotCXB1YmxpYyB2b2lkIHVuZG8oKSB7Ci0JCU1ldGhvZENvbmZpZ3VyYXRpb24gcHJvY0N0eCA9IHByb2Nlc3MuZ2V0RGVmYXVsdENvbnRleHQoKTsKLQkJaWYgKHByb2NDdHggaW5zdGFuY2VvZiBNZXRob2RDb25maWd1cmF0aW9uKSB7Ci0JCQkoKE1ldGhvZENvbmZpZ3VyYXRpb24pIHByb2NDdHgpLmdldE1ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKS5yZW1vdmUoCi0JCQkJCWNoaWxkKTsKLQkJfQotCQlzdXBlci51bmRvKCk7Ci0JfQotCi0JcHVibGljIElTdGF0dXMgZ2V0U3RhdHVzKCkgewotCQlyZXR1cm4gc3RhdHVzOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL0RlbGV0ZVJvbGVEZXNjcmlwdG9yLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9EZWxldGVSb2xlRGVzY3JpcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzODQ3N2Q2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL0RlbGV0ZVJvbGVEZXNjcmlwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51aS5SZWZlcmVuY2VTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlByb2Nlc3NVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRlYW1Qcm9maWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5Bc3NvY2lhdGlvbkhlbHBlcjsKLQotCi07Ci0KLS8qKgotICogRGVsZXRlIHJvbGUgZGVzY3JpcHRvcgotICogCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMAotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBEZWxldGVSb2xlRGVzY3JpcHRvciBleHRlbmRzIFJlbW92ZVVudXNlZERlc2NyaXB0b3JzQ29tbWFuZCB7Ci0JcHJpdmF0ZSBBY3Rpdml0eSBhY3Rpdml0eTsKLQotCXByaXZhdGUgUm9sZURlc2NyaXB0b3Igcm9sZURlc2M7Ci0KLQlwcml2YXRlIENvbGxlY3Rpb24gbW9kaWZpZWRSZXNvdXJjZXM7Ci0KLQlwcml2YXRlIExpc3Qgbm90VXNlZFJlZmVyZW5jZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQlwcml2YXRlIGJvb2xlYW4gZm9yY2VSZW1vdmVVbnVzZWRSZWZlcmVuY2VzOwotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIERlbGV0ZVJvbGVEZXNjcmlwdG9yKFJvbGVEZXNjcmlwdG9yIHJvbGVEZXNjKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJdGhpcy5yb2xlRGVzYyA9IHJvbGVEZXNjOwotCi0JCUFkYXB0ZXJGYWN0b3J5IGFGYWN0b3J5ID0gVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkuZ2V0T0JTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKTsKLQkJSXRlbVByb3ZpZGVyQWRhcHRlciBhZGFwdGVyID0gKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIGFGYWN0b3J5LmFkYXB0KAotCQkJCXJvbGVEZXNjLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQlPYmplY3QgcGFyZW50ID0gYWRhcHRlci5nZXRQYXJlbnQocm9sZURlc2MpOwotCQlpZiAocGFyZW50IGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCXRoaXMuYWN0aXZpdHkgPSAoQWN0aXZpdHkpIHBhcmVudDsKLQkJfQotCi0JCXRoaXMubW9kaWZpZWRSZXNvdXJjZXMgPSBuZXcgSGFzaFNldCgpOwotCQlpZiAoYWN0aXZpdHkuZVJlc291cmNlKCkgIT0gbnVsbCkgewotCQkJbW9kaWZpZWRSZXNvdXJjZXMuYWRkKGFjdGl2aXR5LmVSZXNvdXJjZSgpKTsKLQkJfQotCQlpZiAocm9sZURlc2MuZVJlc291cmNlKCkgIT0gbnVsbCkgewotCQkJbW9kaWZpZWRSZXNvdXJjZXMuYWRkKHJvbGVEZXNjLmVSZXNvdXJjZSgpKTsKLQkJfQotCX0KLQotCXB1YmxpYyBEZWxldGVSb2xlRGVzY3JpcHRvcihSb2xlRGVzY3JpcHRvciByb2xlRGVzYywKLQkJCWJvb2xlYW4gZm9yY2VSZW1vdmVVbnVzZWRSZWZlcmVuY2VzKSB7Ci0JCXRoaXMocm9sZURlc2MpOwotCQl0aGlzLmZvcmNlUmVtb3ZlVW51c2VkUmVmZXJlbmNlcyA9IGZvcmNlUmVtb3ZlVW51c2VkUmVmZXJlbmNlczsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kI2V4ZWN1dGUoKQotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCVNldCByZWZMaXN0ID0gbmV3IEhhc2hTZXQoKTsKLQotCQkvLyBnZXQgUm9sZURlc2NyaXB0b3IgcmVsYXRpb25zaGlwcyByZWZlcmVuY2VzCi0JCUxpc3QgYXNzaXN0ZWRUYXNrRGVzY3JpcHRvcnMgPSBBc3NvY2lhdGlvbkhlbHBlci5nZXRBc3Npc3RlZFRhc2tEZXNjcmlwdG9ycyhyb2xlRGVzYyk7Ci0JCUxpc3QgYWRkaXRpb25hbFRhc2tEZXNjcmlwdG9ycyA9IEFzc29jaWF0aW9uSGVscGVyLmdldEFkZGl0aW9uYWxUYXNrRGVzY3JpcHRvcnMocm9sZURlc2MpOwotCQlMaXN0IHByaW1hcnlUYXNrRGVzY3JpcHRvcnMgPSBBc3NvY2lhdGlvbkhlbHBlci5nZXRQcmltYXJ5VGFza0Rlc2NyaXB0b3JzKHJvbGVEZXNjKTsKLQkJcmVmTGlzdC5hZGRBbGwoYXNzaXN0ZWRUYXNrRGVzY3JpcHRvcnMpOwotCQlyZWZMaXN0LmFkZEFsbChhZGRpdGlvbmFsVGFza0Rlc2NyaXB0b3JzKTsKLQkJcmVmTGlzdC5hZGRBbGwocHJpbWFyeVRhc2tEZXNjcmlwdG9ycyk7Ci0JCXJlZkxpc3QuYWRkQWxsKHJvbGVEZXNjLmdldFJlc3BvbnNpYmxlRm9yKCkpOwotCi0JCWZvciAoSXRlcmF0b3IgaXRvciA9IHJlZkxpc3QuaXRlcmF0b3IoKTsgaXRvci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3Qgb2JqZWN0ID0gaXRvci5uZXh0KCk7Ci0KLQkJCWlmIChvYmplY3QgaW5zdGFuY2VvZiBEZXNjcmlwdG9yKSB7Ci0JCQkJaWYgKCFQcm9jZXNzVXRpbC5jaGVja0Rlc2NyaXB0b3JSZWZlcmVuY2VzKHJvbGVEZXNjLAotCQkJCQkJKERlc2NyaXB0b3IpIG9iamVjdCkpIHsKLQkJCQkJaWYgKGFjdGl2aXR5LmdldEJyZWFrZG93bkVsZW1lbnRzKCkuY29udGFpbnMob2JqZWN0KSkgLy8gY2hlY2sKLQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBmb3IKLQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBsb2NhbAotCQkJCQkJCQkJCQkJCQkJCQkJCS8vIGRlc2NyaXB0b3IKLQkJCQkJCW5vdFVzZWRSZWZlcmVuY2VzLmFkZChvYmplY3QpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWlmICghKG5vdFVzZWRSZWZlcmVuY2VzLmlzRW1wdHkoKSkpIHsKLQkJCXRyeSB7Ci0JCQkJT2JqZWN0W10gcmVmVG9CZURlbGV0ZWQgPSBmb3JjZVJlbW92ZVVudXNlZFJlZmVyZW5jZXMgPyBub3RVc2VkUmVmZXJlbmNlcwotCQkJCQkJLnRvQXJyYXkoKQotCQkJCQkJOiBSZWZlcmVuY2VTZWxlY3Rpb24uZ2V0UmVmZXJlbmNlcyhub3RVc2VkUmVmZXJlbmNlcywKLQkJCQkJCQkJcm9sZURlc2MpOwotCQkJCQkJCi0JCQkJCQlkZWxldGUocmVmVG9CZURlbGV0ZWQpOwotCQkJfQotCQkJY2F0Y2goT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24gZSkgewotCQkJCWFib3J0ZWQgPSB0cnVlOwotCQkJfQotCQl9Ci0KLQkJLy8gY2xlYXIgcmVsYXRpb25zaGlwcwotLy8JCWNsZWFyKHJvbGVEZXNjLmdldEFzc2lzdHNJbigpKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gYXNzaXN0ZWRUYXNrRGVzY3JpcHRvcnMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlUYXNrRGVzY3JpcHRvciB0ZCA9IChUYXNrRGVzY3JpcHRvcikgaXRlci5uZXh0KCk7Ci0JCQl0ZC5nZXRBc3Npc3RlZEJ5KCkucmVtb3ZlKHJvbGVEZXNjKTsKLQkJfQotLy8JCWNsZWFyKHJvbGVEZXNjLmdldFBlcmZvcm1zQWRkaXRpb25hbGx5KCkpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBhZGRpdGlvbmFsVGFza0Rlc2NyaXB0b3JzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJVGFza0Rlc2NyaXB0b3IgdGQgPSAoVGFza0Rlc2NyaXB0b3IpIGl0ZXIubmV4dCgpOwotCQkJdGQuZ2V0QWRkaXRpb25hbGx5UGVyZm9ybWVkQnkoKS5yZW1vdmUocm9sZURlc2MpOwotCQl9Ci0vLwkJY2xlYXIocm9sZURlc2MuZ2V0UGVyZm9ybXNBc093bmVyKCkpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBwcmltYXJ5VGFza0Rlc2NyaXB0b3JzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJVGFza0Rlc2NyaXB0b3IgdGQgPSAoVGFza0Rlc2NyaXB0b3IpIGl0ZXIubmV4dCgpOwotCQkJdGQuZ2V0UGVyZm9ybWVkUHJpbWFyaWx5QnkoKS5yZW1vdmUocm9sZURlc2MpOwotCQl9Ci0JCWNsZWFyKHJvbGVEZXNjLmdldFJlc3BvbnNpYmxlRm9yKCkpOwotCi0JCS8vIGlmIHJvbGUgaXMgcGFydCBvZiBhbnkgdGVhbSwgcGxlYXNlIHJlbW92ZSBpdCBmcm9tIHRlYW0gYXMgd2VsbAotCQlMaXN0IHRlYW1zID0gQXNzb2NpYXRpb25IZWxwZXIuZ2V0VGVhbVByb2ZpbGVzKHJvbGVEZXNjKTsKLQkJZm9yIChJdGVyYXRvciBpdG9yID0gdGVhbXMuaXRlcmF0b3IoKTsgaXRvci5oYXNOZXh0KCk7KSB7Ci0JCQlUZWFtUHJvZmlsZSB0ZWFtID0gKFRlYW1Qcm9maWxlKSBpdG9yLm5leHQoKTsKLQkJCXRlYW0uZ2V0VGVhbVJvbGVzKCkucmVtb3ZlKHJvbGVEZXNjKTsKLQotCQkJLy8gZmluZCBtYXRjaGluZyByb2xlRGVzY3JpcHRvciBpbiB0ZWFtIHJvbGVzCi0JCQlPYmplY3QgdGVhbVJvbGVEZXNjID0gUHJvY2Vzc1V0aWwKLQkJCQkJLmZpbmRSb2xlRGVzY3JpcHRvcih0ZWFtLCByb2xlRGVzYyk7Ci0JCQl0ZWFtLmdldFRlYW1Sb2xlcygpLnJlbW92ZSh0ZWFtUm9sZURlc2MpOwotCQl9Ci0KLQkJcmVkbygpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjbGVhcihMaXN0IGxpc3QpIHsKLQkJdHJ5IHsKLQkJCWlmICgobGlzdCAhPSBudWxsKSAmJiAobGlzdC5zaXplKCkgPiAwKSkgewotCi0JCQkJbGlzdC5jbGVhcigpOwotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQjcmVkbygpCi0JICovCi0JcHVibGljIHZvaWQgcmVkbygpIHsKLQotCX0KLQotCXB1YmxpYyB2b2lkIHVuZG8oKSB7Ci0KLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBwcmVwYXJlKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRNb2RpZmllZFJlc291cmNlcygpIHsKLQotCQlyZXR1cm4gbW9kaWZpZWRSZXNvdXJjZXM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvRGVsZXRlVGFza0Rlc2NyaXB0b3IuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL0RlbGV0ZVRhc2tEZXNjcmlwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4MWU4MmEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvRGVsZXRlVGFza0Rlc2NyaXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnVpLlJlZmVyZW5jZVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuUHJvY2Vzc1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRvcjsKLQotCi0vKioKLSAqIERlbGV0ZSBUYXNrIGRlc2NyaXB0b3IKLSAqIAotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIERlbGV0ZVRhc2tEZXNjcmlwdG9yIGV4dGVuZHMgUmVtb3ZlVW51c2VkRGVzY3JpcHRvcnNDb21tYW5kIHsKLQlwcml2YXRlIEFjdGl2aXR5IGFjdGl2aXR5OwotCi0JcHJpdmF0ZSBUYXNrRGVzY3JpcHRvciB0YXNrRGVzYzsKLQotCXByaXZhdGUgQ29sbGVjdGlvbiBtb2RpZmllZFJlc291cmNlczsKLQotCXByaXZhdGUgTGlzdCBub3RVc2VkUmVmZXJlbmNlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCXByaXZhdGUgYm9vbGVhbiBmb3JjZVJlbW92ZVVudXNlZFJlZmVyZW5jZXM7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgRGVsZXRlVGFza0Rlc2NyaXB0b3IoVGFza0Rlc2NyaXB0b3IgdGFza0Rlc2MpIHsKLQkJc3VwZXIoKTsKLQotCQl0aGlzLnRhc2tEZXNjID0gdGFza0Rlc2M7Ci0KLQkJQWRhcHRlckZhY3RvcnkgYUZhY3RvcnkgPSBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCS5nZXRXQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpOwotCQlJdGVtUHJvdmlkZXJBZGFwdGVyIGFkYXB0ZXIgPSAoSXRlbVByb3ZpZGVyQWRhcHRlcikgYUZhY3RvcnkuYWRhcHQoCi0JCQkJdGFza0Rlc2MsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCU9iamVjdCBwYXJlbnQgPSBhZGFwdGVyLmdldFBhcmVudCh0YXNrRGVzYyk7Ci0JCWlmIChwYXJlbnQgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJdGhpcy5hY3Rpdml0eSA9IChBY3Rpdml0eSkgcGFyZW50OwotCQl9Ci0KLQkJdGhpcy5tb2RpZmllZFJlc291cmNlcyA9IG5ldyBIYXNoU2V0KCk7Ci0JCWlmIChhY3Rpdml0eS5lUmVzb3VyY2UoKSAhPSBudWxsKSB7Ci0JCQltb2RpZmllZFJlc291cmNlcy5hZGQoYWN0aXZpdHkuZVJlc291cmNlKCkpOwotCQl9Ci0JCWlmICh0YXNrRGVzYy5lUmVzb3VyY2UoKSAhPSBudWxsKSB7Ci0JCQltb2RpZmllZFJlc291cmNlcy5hZGQodGFza0Rlc2MuZVJlc291cmNlKCkpOwotCQl9Ci0JfQotCi0JcHVibGljIERlbGV0ZVRhc2tEZXNjcmlwdG9yKFRhc2tEZXNjcmlwdG9yIHRhc2tEZXNjLAotCQkJYm9vbGVhbiBmb3JjZVJlbW92ZVVudXNlZFJlZmVyZW5jZXMpIHsKLQkJdGhpcyh0YXNrRGVzYyk7Ci0JCXRoaXMuZm9yY2VSZW1vdmVVbnVzZWRSZWZlcmVuY2VzID0gZm9yY2VSZW1vdmVVbnVzZWRSZWZlcmVuY2VzOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQjZXhlY3V0ZSgpCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJU2V0IHJlZkxpc3QgPSBuZXcgSGFzaFNldCgpOwotCi0JCS8vIGdldCBUYXNrRGVzY3JpcHRvciByZWxhdGlvbnNoaXBzIHJlZmVyZW5jZXMKLQkJcmVmTGlzdC5hZGRBbGwodGFza0Rlc2MuZ2V0QWRkaXRpb25hbGx5UGVyZm9ybWVkQnkoKSk7Ci0JCXJlZkxpc3QuYWRkQWxsKHRhc2tEZXNjLmdldEFzc2lzdGVkQnkoKSk7Ci0JCXJlZkxpc3QuYWRkQWxsKHRhc2tEZXNjLmdldFBlcmZvcm1lZFByaW1hcmlseUJ5KCkpOwotCQlyZWZMaXN0LmFkZEFsbCh0YXNrRGVzYy5nZXRNYW5kYXRvcnlJbnB1dCgpKTsKLQkJcmVmTGlzdC5hZGRBbGwodGFza0Rlc2MuZ2V0RXh0ZXJuYWxJbnB1dCgpKTsKLQkJcmVmTGlzdC5hZGRBbGwodGFza0Rlc2MuZ2V0T3B0aW9uYWxJbnB1dCgpKTsKLQkJcmVmTGlzdC5hZGRBbGwodGFza0Rlc2MuZ2V0T3V0cHV0KCkpOwotCi0JCWZvciAoSXRlcmF0b3IgaXRvciA9IHJlZkxpc3QuaXRlcmF0b3IoKTsgaXRvci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3Qgb2JqZWN0ID0gaXRvci5uZXh0KCk7Ci0KLQkJCS8vIGNoZWNrIGFsbCBpdCdzIHJlZmVyZW5jZXMKLQkJCWlmIChvYmplY3QgaW5zdGFuY2VvZiBEZXNjcmlwdG9yKSB7Ci0JCQkJaWYgKCFQcm9jZXNzVXRpbC5jaGVja0Rlc2NyaXB0b3JSZWZlcmVuY2VzKHRhc2tEZXNjLAotCQkJCQkJKERlc2NyaXB0b3IpIG9iamVjdCkpIHsKLQkJCQkJaWYgKGFjdGl2aXR5LmdldEJyZWFrZG93bkVsZW1lbnRzKCkuY29udGFpbnMob2JqZWN0KSkgLy8gY2hlY2sKLQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBmb3IKLQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBsb2NhbAotCQkJCQkJCQkJCQkJCQkJCQkJCS8vIGRlc2NyaXB0b3IKLQkJCQkJCW5vdFVzZWRSZWZlcmVuY2VzLmFkZChvYmplY3QpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWlmICghKG5vdFVzZWRSZWZlcmVuY2VzLmlzRW1wdHkoKSkpIHsKLQkJCXRyeSB7Ci0JCQkJT2JqZWN0W10gcmVmVG9CZURlbGV0ZWQgPSBmb3JjZVJlbW92ZVVudXNlZFJlZmVyZW5jZXMgPyBub3RVc2VkUmVmZXJlbmNlcwotCQkJCQkJLnRvQXJyYXkoKQotCQkJCQkJOiBSZWZlcmVuY2VTZWxlY3Rpb24uZ2V0UmVmZXJlbmNlcyhub3RVc2VkUmVmZXJlbmNlcywKLQkJCQkJCQkJdGFza0Rlc2MpOwotCQkJCQkJCi0JCQkJCQlkZWxldGUocmVmVG9CZURlbGV0ZWQpOwotCQkJfQotCQkJY2F0Y2goT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24gZSkgewotCQkJCWFib3J0ZWQgPSB0cnVlOwotCQkJfQotCQl9Ci0KLQkJLy8gY2xlYXIgb3V0IGFsbCB0YXNrZGVzY3JpcHRvciByZWxhdGlvbnNoaXAKLQkJY2xlYXIodGFza0Rlc2MuZ2V0QWRkaXRpb25hbGx5UGVyZm9ybWVkQnkoKSk7Ci0JCWNsZWFyKHRhc2tEZXNjLmdldEFzc2lzdGVkQnkoKSk7Ci0JCWNsZWFyKHRhc2tEZXNjLmdldE1hbmRhdG9yeUlucHV0KCkpOwotCQljbGVhcih0YXNrRGVzYy5nZXRFeHRlcm5hbElucHV0KCkpOwotCQljbGVhcih0YXNrRGVzYy5nZXRPcHRpb25hbElucHV0KCkpOwotCQljbGVhcih0YXNrRGVzYy5nZXRPdXRwdXQoKSk7Ci0JCWNsZWFyKHRhc2tEZXNjLmdldFBlcmZvcm1lZFByaW1hcmlseUJ5KCkpOwotCi0JCXJlZG8oKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY2xlYXIoTGlzdCBsaXN0KSB7Ci0JCXRyeSB7Ci0JCQlpZiAoKGxpc3QgIT0gbnVsbCkgJiYgKGxpc3Quc2l6ZSgpID4gMCkpIHsKLQkJCQlsaXN0LmNsZWFyKCk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZCNyZWRvKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWRvKCkgewotCi0JfQotCi0JcHVibGljIHZvaWQgdW5kbygpIHsKLQotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHByZXBhcmUoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldE1vZGlmaWVkUmVzb3VyY2VzKCkgewotCi0JCXJldHVybiBtb2RpZmllZFJlc291cmNlczsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9EZWxldGVUZWFtUHJvZmlsZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvRGVsZXRlVGVhbVByb2ZpbGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDczOGExNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9EZWxldGVUZWFtUHJvZmlsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQWJzdHJhY3RDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklSZXNvdXJjZUF3YXJlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRlYW1Qcm9maWxlOwotCi0KLS8qKgotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIERlbGV0ZVRlYW1Qcm9maWxlIGV4dGVuZHMgQWJzdHJhY3RDb21tYW5kIGltcGxlbWVudHMKLQkJSVJlc291cmNlQXdhcmVDb21tYW5kIHsKLQlwcml2YXRlIEFjdGl2aXR5IGFjdGl2aXR5OwotCi0JcHJpdmF0ZSBUZWFtUHJvZmlsZSB0ZWFtOwotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uIG1vZGlmaWVkUmVzb3VyY2VzOwotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIERlbGV0ZVRlYW1Qcm9maWxlKFRlYW1Qcm9maWxlIHRlYW0pIHsKLQkJc3VwZXIoKTsKLQotCQl0aGlzLnRlYW0gPSB0ZWFtOwotCi0JCU9iamVjdCBwYXJlbnQgPSBnZXRQYXJlbnRBY3Rpdml0eSh0ZWFtKTsKLQotCQlpZiAocGFyZW50IGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCXRoaXMuYWN0aXZpdHkgPSAoQWN0aXZpdHkpIHBhcmVudDsKLQkJfQotCi0JCXRoaXMubW9kaWZpZWRSZXNvdXJjZXMgPSBuZXcgSGFzaFNldCgpOwotCQlpZiAoYWN0aXZpdHkuZVJlc291cmNlKCkgIT0gbnVsbCkgewotCQkJbW9kaWZpZWRSZXNvdXJjZXMuYWRkKGFjdGl2aXR5LmVSZXNvdXJjZSgpKTsKLQkJfQotCQlpZiAodGVhbS5lUmVzb3VyY2UoKSAhPSBudWxsKSB7Ci0JCQltb2RpZmllZFJlc291cmNlcy5hZGQodGVhbS5lUmVzb3VyY2UoKSk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kI2V4ZWN1dGUoKQotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCS8vIGdldCBhbGwgc3VidGVhbSByZWN1cnNpdmVseQotCQlMaXN0IHRlYW1MaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlnZXRTdWJUZWFtcyh0ZWFtLCB0ZWFtTGlzdCk7Ci0KLQkJdGVhbUxpc3QuYWRkKHRlYW0pOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgdGVhbUxpc3Quc2l6ZSgpOyBpKyspIHsKLQkJCVRlYW1Qcm9maWxlIHR0ID0gKFRlYW1Qcm9maWxlKSB0ZWFtTGlzdC5nZXQoaSk7Ci0JCQkvLyBjbGVhciB0ZWFtJ3Mgcm9sZWRlc2NyaXB0b3IKLQkJCXR0LmdldFRlYW1Sb2xlcygpLmNsZWFyKCk7Ci0JCX0KLQotCQlyZWRvKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGdldFN1YlRlYW1zKFRlYW1Qcm9maWxlIHRlYW0sIExpc3QgdGVhbUxpc3QpIHsKLQkJTGlzdCBsaXN0ID0gdGVhbS5nZXRTdWJUZWFtKCk7Ci0JCWlmIChsaXN0ICE9IG51bGwpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRvciA9IGxpc3QuaXRlcmF0b3IoKTsgaXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJVGVhbVByb2ZpbGUgdHQgPSAoVGVhbVByb2ZpbGUpIGl0b3IubmV4dCgpOwotCQkJCXRlYW1MaXN0LmFkZCh0dCk7Ci0JCQkJZ2V0U3ViVGVhbXModHQsIHRlYW1MaXN0KTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEdldCBwYXJlbnQgYWN0aXZpdHkgZm9yIGJyZWFrZG93bmVsZW1lbnQKLQkgKiAKLQkgKiBAcGFyYW0gYnJFbGVtZW50Ci0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgT2JqZWN0IGdldFBhcmVudEFjdGl2aXR5KEJyZWFrZG93bkVsZW1lbnQgYnJFbGVtZW50KSB7Ci0JCUFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5ID0gVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkuZ2V0T0JTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKTsKLQkJSXRlbVByb3ZpZGVyQWRhcHRlciBhZGFwdGVyID0gKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIGFkYXB0ZXJGYWN0b3J5Ci0JCQkJLmFkYXB0KGJyRWxlbWVudCwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJT2JqZWN0IHBhcmVudCA9IGFkYXB0ZXIuZ2V0UGFyZW50KGJyRWxlbWVudCk7Ci0JCXdoaWxlICghKHBhcmVudCBpbnN0YW5jZW9mIEFjdGl2aXR5KSkgewotCQkJYnJFbGVtZW50ID0gKEJyZWFrZG93bkVsZW1lbnQpIHBhcmVudDsKLQkJCWFkYXB0ZXIgPSAoSXRlbVByb3ZpZGVyQWRhcHRlcikgYWRhcHRlckZhY3RvcnkuYWRhcHQoYnJFbGVtZW50LAotCQkJCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkJcGFyZW50ID0gYWRhcHRlci5nZXRQYXJlbnQoYnJFbGVtZW50KTsKLQkJfQotCi0JCXJldHVybiBwYXJlbnQ7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZCNyZWRvKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWRvKCkgewotCi0JfQotCi0JcHVibGljIHZvaWQgdW5kbygpIHsKLQotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHByZXBhcmUoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldE1vZGlmaWVkUmVzb3VyY2VzKCkgewotCi0JCXJldHVybiBtb2RpZmllZFJlc291cmNlczsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9EZWxldGVVbnVzZWREZXNjcmlwdG9yc0NvbW1hbmQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL0RlbGV0ZVVudXNlZERlc2NyaXB0b3JzQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNjM5NzFkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL0RlbGV0ZVVudXNlZERlc2NyaXB0b3JzQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21wb3VuZENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkFic3RyYWN0VHJlZUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklJbnRlcmFjdGl2ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSVVzZXJJbnRlcmFjdGlvbkhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkFkYXB0ZXJGYWN0b3J5SXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlByb2Nlc3NVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3I7Ci0KLQotLyoqCi0gKiBDb21tYW5kIGZvciBjbGVhbi11cCB1bnVzZWQgZGVzY3JpcHRvcnMKLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIERlbGV0ZVVudXNlZERlc2NyaXB0b3JzQ29tbWFuZCBleHRlbmRzIENvbXBvdW5kQ29tbWFuZCAKLWltcGxlbWVudHMgSUludGVyYWN0aXZlCi17Ci0JcHJpdmF0ZSBDb2xsZWN0aW9uIGVsZW1lbnRzOwotCXByaXZhdGUgTGlzdCBkZXNjcmlwdG9yc1RvRGVsZXRlOwotCXByaXZhdGUgYm9vbGVhbiBpbmNsdWRlQ2hpbGRyZW47Ci0JcHJpdmF0ZSBDb2xsZWN0aW9uIGRlbGV0ZWREZXNjcmlwdG9yczsKLQlwcml2YXRlIElVc2VySW50ZXJhY3Rpb25IYW5kbGVyIHVzZXJJbnRlcmFjdGlvbkhhbmRsZXI7Ci0KLQkvKioKLQkgKiBAcGFyYW0gZWxlbWVudHMgbGlzdCBvZiBlbGVtZW50cyB0byBjaGVjayBmb3IgdW51c2VkIGRlc2NyaXB0b3JzIHRvIGRlbGV0ZSAKLQkgKiBAcGFyYW0gaW5jbHVkZUNoaWxkcmVuIGlmIDxjb2RlPnRydWU8L2NvZGU+IHdpbGwgY2hlY2sgdGhlIG9mZnN0cmluZyBvZiBhY3Rpdml0aWVzIGluIHRoZSBnaXZlbiBlbGVtZW50cwotCSAqLwotCXB1YmxpYyBEZWxldGVVbnVzZWREZXNjcmlwdG9yc0NvbW1hbmQoQ29sbGVjdGlvbiBlbGVtZW50cywgYm9vbGVhbiBpbmNsdWRlQ2hpbGRyZW4sIENvbGxlY3Rpb24gZGVsZXRlZERlc2NyaXB0b3JzKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuZWxlbWVudHMgPSBlbGVtZW50czsKLQkJdGhpcy5pbmNsdWRlQ2hpbGRyZW4gPSBpbmNsdWRlQ2hpbGRyZW47Ci0JCXRoaXMuZGVsZXRlZERlc2NyaXB0b3JzID0gZGVsZXRlZERlc2NyaXB0b3JzOwotCX0KLQkKLQkvKioKLQkgKiBEZWxldGVzIHRoZSBzcGVjaWZpZWQgZWxlbWVudHMuIFN1YmNsYXNzcyBtdXN0IGltcGxlbWVudCB0aGlzIG1ldGhvZAotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50cwotCSAqIEByZXR1cm4gdGhlIGV4ZWN1dGVkIGNvbW1hbmQgdGhhdCBkZWxldGVkIHRoZSBnaXZlbiBlbGVtZW50cwotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCBDb21tYW5kIGRlbGV0ZShMaXN0IGVsZW1lbnRzKTsKLQkKLQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQkvLyBmaW5kIGFsbCByb2xlIGFuZCB3b3JrIHByb2R1Y3QgZGVzY3JpcHRvcnMgdGhhdCBhcmUgbm90IHVzZWQKLQkJLy8gaW4gYW55IHJlbGF0aW9uc2hpcAotCQkvLyBhbmQgZGVsZXRlIHRoZW0KLQkJLy8KLQkJaWYgKGRlc2NyaXB0b3JzVG9EZWxldGUgPT0gbnVsbCkgewotCQkJZGVzY3JpcHRvcnNUb0RlbGV0ZSA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCUl0ZXJhdG9yIGl0ZXI7Ci0JCQlpZihpbmNsdWRlQ2hpbGRyZW4pIHsKLQkJCQlpdGVyID0gbmV3IEFic3RyYWN0VHJlZUl0ZXJhdG9yKGVsZW1lbnRzLCBmYWxzZSkgewotCQkJCQkKLQkJCQkJCi0JCQkJCS8qKgotCQkJCQkgKiBDb21tZW50IGZvciA8Y29kZT5zZXJpYWxWZXJzaW9uVUlEPC9jb2RlPgotCQkJCQkgKi8KLQkJCQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gNDcxODg4OTQwOTQwMzE0MTcwN0w7Ci0JCQkJCQotCQkJCQlwcm90ZWN0ZWQgSXRlcmF0b3IgZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQkJCQkJaWYgKG9iamVjdCA9PSBlbGVtZW50cykgewotCQkJCQkJCXJldHVybiBlbGVtZW50cy5pdGVyYXRvcigpOwotCQkJCQkJfSBlbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCQkJCXJldHVybiAoKEFjdGl2aXR5KSBvYmplY3QpCi0JCQkJCQkJLmdldEJyZWFrZG93bkVsZW1lbnRzKCkuaXRlcmF0b3IoKTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1QuaXRlcmF0b3IoKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQkKLQkJCQl9OwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJaXRlciA9IGVsZW1lbnRzLml0ZXJhdG9yKCk7Ci0JCQl9Ci0JCQlBcnJheUxpc3QgY3VycmVudERlc2NyaXB0b3JzVG9EZWxldGUgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlpZihkZWxldGVkRGVzY3JpcHRvcnMgIT0gbnVsbCkgewotCQkJCS8vIGFkZCBkZWxldGVkIGRlc2NyaXB0b3JzIHRvIHRoZSBsaXN0IGJlZm9yZSBjaGVja2luZyBmb3IgdW51c2VkIGRlc2NyaXB0b3JzCi0JCQkJLy8gdGhvc2UgZGVsZXRlZCBkZXNjcmlwdG9ycyB3aWxsIGJlIHJlbW92ZWQgZnJvbSB0aGUgbGlzdCBhZnRlciB0aGUgY2hlY2sKLQkJCQkvLwotCQkJCWN1cnJlbnREZXNjcmlwdG9yc1RvRGVsZXRlLmFkZEFsbChkZWxldGVkRGVzY3JpcHRvcnMpOwotCQkJfQotCQkJZm9yICg7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBlbGVtZW50ID0gaXRlci5uZXh0KCk7Ci0JCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBSb2xlRGVzY3JpcHRvciB8fCBlbGVtZW50IGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yKSB7Ci0JCQkJCQlpZiAoIVByb2Nlc3NVdGlsLmNoZWNrRGVzY3JpcHRvclJlZmVyZW5jZXMoCi0JCQkJCQkJY3VycmVudERlc2NyaXB0b3JzVG9EZWxldGUsIChEZXNjcmlwdG9yKSBlbGVtZW50KSkgewotCQkJCQkJY3VycmVudERlc2NyaXB0b3JzVG9EZWxldGUuYWRkKGVsZW1lbnQpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJY3VycmVudERlc2NyaXB0b3JzVG9EZWxldGUucmVtb3ZlQWxsKGRlbGV0ZWREZXNjcmlwdG9ycyk7Ci0JCQlpZiAoIWN1cnJlbnREZXNjcmlwdG9yc1RvRGVsZXRlLmlzRW1wdHkoKSkgewotCQkJCXNlbGVjdERlc2NyaXB0b3JzVG9EZWxldGUoY3VycmVudERlc2NyaXB0b3JzVG9EZWxldGUpOwotCQkJCWlmKCFjdXJyZW50RGVzY3JpcHRvcnNUb0RlbGV0ZS5pc0VtcHR5KCkpIHsKLQkJCQkJQ29tbWFuZCBjbWQgPSBkZWxldGUoY3VycmVudERlc2NyaXB0b3JzVG9EZWxldGUpOwotCQkJCQlpZiAoY21kICE9IG51bGwpIHsKLQkJCQkJCWNvbW1hbmRMaXN0LmFkZChjbWQpOwotCQkJCQkJZGVzY3JpcHRvcnNUb0RlbGV0ZS5hZGRBbGwoY3VycmVudERlc2NyaXB0b3JzVG9EZWxldGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJaWYoIWRlc2NyaXB0b3JzVG9EZWxldGUuaXNFbXB0eSgpKSB7Ci0JCQkJY29tbWFuZExpc3QuY2xlYXIoKTsKLQkJCQlhcHBlbmQoZGVsZXRlKGRlc2NyaXB0b3JzVG9EZWxldGUpKTsKLQkJCX0KLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgc2VsZWN0RGVzY3JpcHRvcnNUb0RlbGV0ZShMaXN0IGRlc2NyaXB0b3JzVG9EZWxldGUpIHsKLQkJaWYodXNlckludGVyYWN0aW9uSGFuZGxlciAhPSBudWxsKSB7Ci0JCQlJSXRlbUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlciA9IG5ldyBBZGFwdGVyRmFjdG9yeUl0ZW1MYWJlbFByb3ZpZGVyKAotCQkJCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpOwotCQkJU3RyaW5nIHRpdGxlID0gTGlicmFyeUVkaXRSZXNvdXJjZXMudWlfcmVmZXJlbmNlczsKLQkJCVN0cmluZyBtc2cgPSBMaWJyYXJ5RWRpdFJlc291cmNlcy5zZWxlY3REZXNjcmlwdG9yc1RvRGVsZXRlX21zZzsJCQkKLQkJCUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoZGVzY3JpcHRvcnNUb0RlbGV0ZSk7Ci0JCQlDb2xsZWN0aW9uIHNlbGVjdGVkID0gdXNlckludGVyYWN0aW9uSGFuZGxlci5zZWxlY3QobGlzdCwgbGFiZWxQcm92aWRlciwgdHJ1ZSwgbGlzdCwgdGl0bGUsIG1zZyk7Ci0JCQlpZihzZWxlY3RlZCA9PSBudWxsKSB7Ci0JCQkJdGhyb3cgbmV3IE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uKCk7Ci0JCQl9Ci0JCQlkZXNjcmlwdG9yc1RvRGVsZXRlLnJldGFpbkFsbChzZWxlY3RlZCk7Ci0JCX0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSUludGVyYWN0aXZlI3NldFVzZXJJbnRlcmFjdGlvbkhhbmRsZXIob3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklVc2VySW50ZXJhY3Rpb25IYW5kbGVyKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFVzZXJJbnRlcmFjdGlvbkhhbmRsZXIoSVVzZXJJbnRlcmFjdGlvbkhhbmRsZXIgaGFuZGxlcikgewotCQl1c2VySW50ZXJhY3Rpb25IYW5kbGVyID0gaGFuZGxlcjsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9EZWxldGVXb3JrUHJvZHVjdERlc2NyaXB0b3IuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL0RlbGV0ZVdvcmtQcm9kdWN0RGVzY3JpcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YTMyYTMxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL0RlbGV0ZVdvcmtQcm9kdWN0RGVzY3JpcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjU0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5PcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51aS5SZWZlcmVuY2VTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlByb2Nlc3NVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BcnRpZmFjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5Bc3NvY2lhdGlvbkhlbHBlcjsKLQotCi0vKioKLSAqIERlbGV0ZSB3b3JrIHByb2R1Y3QgZGVzY3JpcHRvcgotICogCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgRGVsZXRlV29ya1Byb2R1Y3REZXNjcmlwdG9yIGV4dGVuZHMgUmVtb3ZlVW51c2VkRGVzY3JpcHRvcnNDb21tYW5kIHsKLQlwcml2YXRlIEFjdGl2aXR5IGFjdGl2aXR5OwotCi0JcHJpdmF0ZSBXb3JrUHJvZHVjdERlc2NyaXB0b3Igd3BEZXNjOwotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uIG1vZGlmaWVkUmVzb3VyY2VzOwotCi0JcHJpdmF0ZSBMaXN0IG5vdFVzZWRSZWZlcmVuY2VzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JcHJpdmF0ZSBib29sZWFuIGZvcmNlUmVtb3ZlVW51c2VkUmVmZXJlbmNlczsKLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBEZWxldGVXb3JrUHJvZHVjdERlc2NyaXB0b3IoV29ya1Byb2R1Y3REZXNjcmlwdG9yIHdwRGVzYykgewotCQlzdXBlcigpOwotCi0JCXRoaXMud3BEZXNjID0gd3BEZXNjOwotCi0JCUFkYXB0ZXJGYWN0b3J5IGFGYWN0b3J5ID0gVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkuZ2V0UEJTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKTsKLQkJSXRlbVByb3ZpZGVyQWRhcHRlciBhZGFwdGVyID0gKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIGFGYWN0b3J5LmFkYXB0KAotCQkJCXdwRGVzYywgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJT2JqZWN0IHBhcmVudCA9IGFkYXB0ZXIuZ2V0UGFyZW50KHdwRGVzYyk7Ci0JCWlmIChwYXJlbnQgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJdGhpcy5hY3Rpdml0eSA9IChBY3Rpdml0eSkgcGFyZW50OwotCQl9Ci0KLQkJdGhpcy5tb2RpZmllZFJlc291cmNlcyA9IG5ldyBIYXNoU2V0KCk7Ci0JCWlmIChhY3Rpdml0eS5lUmVzb3VyY2UoKSAhPSBudWxsKSB7Ci0JCQltb2RpZmllZFJlc291cmNlcy5hZGQoYWN0aXZpdHkuZVJlc291cmNlKCkpOwotCQl9Ci0JCWlmICh3cERlc2MuZVJlc291cmNlKCkgIT0gbnVsbCkgewotCQkJbW9kaWZpZWRSZXNvdXJjZXMuYWRkKHdwRGVzYy5lUmVzb3VyY2UoKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgRGVsZXRlV29ya1Byb2R1Y3REZXNjcmlwdG9yKFdvcmtQcm9kdWN0RGVzY3JpcHRvciB3cERlc2MsCi0JCQlib29sZWFuIGZvcmNlUmVtb3ZlVW51c2VkUmVmZXJlbmNlcykgewotCQl0aGlzKHdwRGVzYyk7Ci0JCXRoaXMuZm9yY2VSZW1vdmVVbnVzZWRSZWZlcmVuY2VzID0gZm9yY2VSZW1vdmVVbnVzZWRSZWZlcmVuY2VzOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQjZXhlY3V0ZSgpCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJU2V0IHJlZkxpc3QgPSBuZXcgSGFzaFNldCgpOwotCi0JCUxpc3QgbWFuZGF0b3J5SW5wdXRUbyA9IEFzc29jaWF0aW9uSGVscGVyLmdldE1hbmRhdG9yeUlucHV0VG8od3BEZXNjKTsKLQkJTGlzdCBleHRlcm5hbElucHV0VG8gPSBBc3NvY2lhdGlvbkhlbHBlci5nZXRFeHRlcm5hbElucHV0VG8od3BEZXNjKTsKLQkJTGlzdCBvcHRpb25hbElucHV0VG8gPSBBc3NvY2lhdGlvbkhlbHBlci5nZXRPcHRpb25hbElucHV0VG8od3BEZXNjKTsKLQkJTGlzdCBvdXRwdXRGcm9tID0gQXNzb2NpYXRpb25IZWxwZXIuZ2V0T3V0cHV0RnJvbSh3cERlc2MpOwotCQlMaXN0IHJlc3BvbnNpYmxlUm9sZURlc2NMaXN0ID0gQXNzb2NpYXRpb25IZWxwZXIuZ2V0UmVzcG9uc2libGVSb2xlRGVzY3JpcHRvcnMod3BEZXNjKTsKLQkJLy8gZ2V0IFdvcmtQcm9kdWN0RGVzY3JpcHRvciByZWxhdGlvbnNoaXBzIHJlZmVyZW5jZXMKLQkJcmVmTGlzdC5hZGRBbGwod3BEZXNjLmdldEltcGFjdGVkQnkoKSk7Ci0JCXJlZkxpc3QuYWRkQWxsKHdwRGVzYy5nZXRJbXBhY3RzKCkpOwotCQlyZWZMaXN0LmFkZEFsbChtYW5kYXRvcnlJbnB1dFRvKTsKLQkJcmVmTGlzdC5hZGRBbGwoZXh0ZXJuYWxJbnB1dFRvKTsKLQkJcmVmTGlzdC5hZGRBbGwob3B0aW9uYWxJbnB1dFRvKTsKLQkJcmVmTGlzdC5hZGRBbGwob3V0cHV0RnJvbSk7Ci0JCXJlZkxpc3QuYWRkKHJlc3BvbnNpYmxlUm9sZURlc2NMaXN0KTsKLQotCQlmb3IgKEl0ZXJhdG9yIGl0b3IgPSByZWZMaXN0Lml0ZXJhdG9yKCk7IGl0b3IuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IG9iamVjdCA9IGl0b3IubmV4dCgpOwotCi0JCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgRGVzY3JpcHRvcikgewotCQkJCWlmICghUHJvY2Vzc1V0aWwuY2hlY2tEZXNjcmlwdG9yUmVmZXJlbmNlcyh3cERlc2MsCi0JCQkJCQkoRGVzY3JpcHRvcikgb2JqZWN0KSkgewotCQkJCQlpZiAoYWN0aXZpdHkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5jb250YWlucyhvYmplY3QpKSAvLyBjaGVjawotCQkJCQkJCQkJCQkJCQkJCQkJCS8vIGZvcgotCQkJCQkJCQkJCQkJCQkJCQkJCS8vIGxvY2FsCi0JCQkJCQkJCQkJCQkJCQkJCQkJLy8gZGVzY3JpcHRvcgotCQkJCQkJbm90VXNlZFJlZmVyZW5jZXMuYWRkKG9iamVjdCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJaWYgKCEobm90VXNlZFJlZmVyZW5jZXMuaXNFbXB0eSgpKSkgewotCQkJdHJ5IHsKLQkJCQlPYmplY3RbXSByZWZUb0JlRGVsZXRlZCA9IGZvcmNlUmVtb3ZlVW51c2VkUmVmZXJlbmNlcyA/IG5vdFVzZWRSZWZlcmVuY2VzCi0JCQkJCQkudG9BcnJheSgpCi0JCQkJCQk6IFJlZmVyZW5jZVNlbGVjdGlvbi5nZXRSZWZlcmVuY2VzKG5vdFVzZWRSZWZlcmVuY2VzLAotCQkJCQkJCQl3cERlc2MpOwotCQkJCQkJZGVsZXRlKHJlZlRvQmVEZWxldGVkKTsKLQkJCX0KLQkJCWNhdGNoKE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uIGUpIHsKLQkJCQlhYm9ydGVkID0gdHJ1ZTsKLQkJCX0KLQkJfQotCi0JCS8vIGNoZWNrIHdoZXRoZXIgd3BkZXNjIGFydGlmYWN0IGhhcyBhbnkgc3ViLWFydGlmYWN0cwotCQlMaXN0IGNoaWxkcmVuID0gbmV3IEFycmF5TGlzdCgpOwotCQlpZiAod3BEZXNjLmdldFdvcmtQcm9kdWN0KCkgaW5zdGFuY2VvZiBBcnRpZmFjdCkgewotCQkJQXJ0aWZhY3QgYXJ0aWZhY3QgPSAoQXJ0aWZhY3QpIHdwRGVzYy5nZXRXb3JrUHJvZHVjdCgpOwotCQkJTGlzdCBsaXN0ID0gYXJ0aWZhY3QuZ2V0Q29udGFpbmVkQXJ0aWZhY3RzKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGxpc3Quc2l6ZSgpOyBpKyspIHsKLQkJCQlPYmplY3QgZGVzY3JpcHRvciA9IGdldERlc2NyaXB0b3Iod3BEZXNjLCAoQXJ0aWZhY3QpIGxpc3QKLQkJCQkJCS5nZXQoaSkpOwotCQkJCWlmIChkZXNjcmlwdG9yICE9IG51bGwpIHsKLQkJCQkJY2hpbGRyZW4uYWRkKGRlc2NyaXB0b3IpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCUxpc3Qgb2JqZWN0c1RvQ2xlYXJlZCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJb2JqZWN0c1RvQ2xlYXJlZC5hZGQod3BEZXNjKTsKLQkJb2JqZWN0c1RvQ2xlYXJlZC5hZGRBbGwoY2hpbGRyZW4pOwotCi0JCWZvciAoSXRlcmF0b3IgaXRvciA9IG9iamVjdHNUb0NsZWFyZWQuaXRlcmF0b3IoKTsgaXRvci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3Qgb2JqID0gaXRvci5uZXh0KCk7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yKSB7Ci0JCQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yIHdwRGVzY09iaiA9IChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIG9iajsKLQotCQkJCS8vIHdwRGVzY09iai5nZXRJbXBhY3RlZEJ5KCkuY2xlYXIoKTsKLQkJCQkvLyB3cERlc2NPYmouZ2V0SW1wYWN0cygpLmNsZWFyKCk7Ci0JCQkJLy8gd3BEZXNjT2JqLmdldE1hbmRhdG9yeUlucHV0VG8oKS5jbGVhcigpOwotCQkJCS8vIHdwRGVzY09iai5nZXRFeHRlcm5hbElucHV0VG8oKS5jbGVhcigpOwotCQkJCS8vIHdwRGVzY09iai5nZXRPcHRpb25hbElucHV0VG8oKS5jbGVhcigpOwotCQkJCS8vIHdwRGVzY09iai5nZXRPdXRwdXRGcm9tKCkuY2xlYXIoKTsKLQkJCQkvLyB3cERlc2NPYmouZ2V0V29ya2VkT25CeSgpLmNsZWFyKCk7Ci0JCQkJY2xlYXIod3BEZXNjT2JqLmdldEltcGFjdGVkQnkoKSk7Ci0JCQkJY2xlYXIod3BEZXNjT2JqLmdldEltcGFjdHMoKSk7Ci0vLwkJCQljbGVhcih3cERlc2NPYmouZ2V0RXh0ZXJuYWxJbnB1dFRvKCkpOwotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGV4dGVybmFsSW5wdXRUby5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQlUYXNrRGVzY3JpcHRvciB0ZCA9IChUYXNrRGVzY3JpcHRvcikgaXRlci5uZXh0KCk7Ci0JCQkJCXRkLmdldEV4dGVybmFsSW5wdXQoKS5yZW1vdmUod3BEZXNjT2JqKTsKLQkJCQl9Ci0vLwkJCQljbGVhcih3cERlc2NPYmouZ2V0TWFuZGF0b3J5SW5wdXRUbygpKTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBtYW5kYXRvcnlJbnB1dFRvLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCVRhc2tEZXNjcmlwdG9yIHRkID0gKFRhc2tEZXNjcmlwdG9yKSBpdGVyLm5leHQoKTsKLQkJCQkJdGQuZ2V0TWFuZGF0b3J5SW5wdXQoKS5yZW1vdmUod3BEZXNjT2JqKTsKLQkJCQl9Ci0vLwkJCQljbGVhcih3cERlc2NPYmouZ2V0T3B0aW9uYWxJbnB1dFRvKCkpOwotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IG9wdGlvbmFsSW5wdXRUby5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQlUYXNrRGVzY3JpcHRvciB0ZCA9IChUYXNrRGVzY3JpcHRvcikgaXRlci5uZXh0KCk7Ci0JCQkJCXRkLmdldE9wdGlvbmFsSW5wdXQoKS5yZW1vdmUod3BEZXNjT2JqKTsKLQkJCQl9Ci0vLwkJCQljbGVhcih3cERlc2NPYmouZ2V0T3V0cHV0RnJvbSgpKTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBvdXRwdXRGcm9tLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCVRhc2tEZXNjcmlwdG9yIHRkID0gKFRhc2tEZXNjcmlwdG9yKSBpdGVyLm5leHQoKTsKLQkJCQkJdGQuZ2V0T3V0cHV0KCkucmVtb3ZlKHdwRGVzY09iaik7Ci0JCQkJfQotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHJlc3BvbnNpYmxlUm9sZURlc2NMaXN0Lml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCVJvbGVEZXNjcmlwdG9yIHJvbGVEZXNjID0gKFJvbGVEZXNjcmlwdG9yKSBpdGVyLm5leHQoKTsKLQkJCQkJcm9sZURlc2MuZ2V0UmVzcG9uc2libGVGb3IoKS5yZW1vdmUod3BEZXNjT2JqKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQkvLyB0aGlzLmFjdGl2aXR5LmdldEJyZWFrZG93bkVsZW1lbnRzKCkucmVtb3ZlKHdwRGVzYyk7Ci0KLQkJcmVkbygpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjbGVhcihMaXN0IGxpc3QpIHsKLQkJdHJ5IHsKLQkJCWlmICgobGlzdCAhPSBudWxsKSAmJiAobGlzdC5zaXplKCkgPiAwKSkKLQkJCQlsaXN0LmNsZWFyKCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UubG9nKGV4KTsKLQkJfQotCX0KLQotCXByaXZhdGUgT2JqZWN0IGdldERlc2NyaXB0b3IoT2JqZWN0IHBhcmVudERlc2NyaXB0b3IsIEFydGlmYWN0IGFydGlmYWN0KSB7Ci0JCS8vIEFjdGl2aXR5IGFjdGl2aXR5ID0gZ2V0QWN0aXZpdHkocGFyZW50RGVzY3JpcHRvcik7Ci0JCWlmIChhY3Rpdml0eSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCUxpc3QgbGlzdCA9IGFjdGl2aXR5LmdldEJyZWFrZG93bkVsZW1lbnRzKCk7Ci0JCWludCBzaXplID0gbGlzdC5zaXplKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlPYmplY3Qgb2JqID0gbGlzdC5nZXQoaSk7Ci0JCQlpZiAoKG9iaiBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0RGVzY3JpcHRvcikKLQkJCQkJJiYgKGFydGlmYWN0ID09ICgoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBvYmopCi0JCQkJCQkJLmdldFdvcmtQcm9kdWN0KCkpKSB7Ci0JCQkJcmV0dXJuIG9iajsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kI3JlZG8oKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlZG8oKSB7Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB1bmRvKCkgewotCi0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gcHJlcGFyZSgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0TW9kaWZpZWRSZXNvdXJjZXMoKSB7Ci0KLQkJcmV0dXJuIG1vZGlmaWVkUmVzb3VyY2VzOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL0Rlc2NyaXB0b3JTeW5jaHJvbml6ZUNvbW1hbmQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL0Rlc2NyaXB0b3JTeW5jaHJvbml6ZUNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjg1MDk0YS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9EZXNjcmlwdG9yU3luY2hyb25pemVDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5BYnN0cmFjdENvbW1hbmQ7Ci0KLS8qKgotICogQ29tbWFuZCB0byBzeW5jaHJvbml6ZSBkZXNjcmlwdG9yJ3MgYXR0cmlidXRlcyBhbmQgb3duIHJlZmVyZW5jZXMKLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUgLSBGZWIgMSwgMjAwNgotICogQHNpbmNlICAxLjAKLSAqLwotcHVibGljIGNsYXNzIERlc2NyaXB0b3JTeW5jaHJvbml6ZUNvbW1hbmQgZXh0ZW5kcyBBYnN0cmFjdENvbW1hbmQgewotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIERlc2NyaXB0b3JTeW5jaHJvbml6ZUNvbW1hbmQoKSB7Ci0JCXN1cGVyKCk7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY29uc3RydWN0b3Igc3R1YgotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBsYWJlbAotCSAqLwotCXB1YmxpYyBEZXNjcmlwdG9yU3luY2hyb25pemVDb21tYW5kKFN0cmluZyBsYWJlbCkgewotCQlzdXBlcihsYWJlbCk7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY29uc3RydWN0b3Igc3R1YgotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBsYWJlbAotCSAqIEBwYXJhbSBkZXNjcmlwdGlvbgotCSAqLwotCXB1YmxpYyBEZXNjcmlwdG9yU3luY2hyb25pemVDb21tYW5kKFN0cmluZyBsYWJlbCwgU3RyaW5nIGRlc2NyaXB0aW9uKSB7Ci0JCXN1cGVyKGxhYmVsLCBkZXNjcmlwdGlvbik7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY29uc3RydWN0b3Igc3R1YgotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kI2V4ZWN1dGUoKQotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kI3JlZG8oKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlZG8oKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvRGVzY3JpcHRvclVwZGF0ZUJhdGNoQ29tbWFuZC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvRGVzY3JpcHRvclVwZGF0ZUJhdGNoQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkODRlY2MzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL0Rlc2NyaXB0b3JVcGRhdGVCYXRjaENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZDsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbXBvdW5kQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuQmF0Y2hDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci0KLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZSAtIEZlYiA5LCAyMDA2Ci0gKiBAc2luY2UgIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRGVzY3JpcHRvclVwZGF0ZUJhdGNoQ29tbWFuZCBleHRlbmRzIEJhdGNoQ29tbWFuZCB7Ci0JcHJpdmF0ZSBTZXQgZGVzY3JpcHRvcnNUb1JlZnJlc2g7Ci0JcHJpdmF0ZSBDb21wb3VuZENvbW1hbmQgcmVmcmVzaERlc2NyaXB0b3JzQ29tbWFuZDsKLQlwcml2YXRlIFNldCBzeW5jaEZlYXR1cmVzOwotCXByaXZhdGUgTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWc7Ci0JCi0JLyoqCi0JICogQHBhcmFtIGNsZWFyCi0JICovCi0JcHVibGljIERlc2NyaXB0b3JVcGRhdGVCYXRjaENvbW1hbmQoYm9vbGVhbiBjbGVhciwgU2V0IHN5bmNoRmVhdHVyZXMsIE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0JCXN1cGVyKGNsZWFyKTsKLQkJdGhpcy5zeW5jaEZlYXR1cmVzID0gc3luY2hGZWF0dXJlczsKLQkJdGhpcy5jb25maWcgPSBjb25maWc7Ci0JfQotCi0JcHVibGljIFNldCBnZXREZXNjcmlwdG9yc1RvUmVmcmVzaCgpIHsKLQkJaWYoZGVzY3JpcHRvcnNUb1JlZnJlc2ggPT0gbnVsbCkgewotCQkJZGVzY3JpcHRvcnNUb1JlZnJlc2ggPSBuZXcgSGFzaFNldCgpOwotCQl9Ci0JCXJldHVybiBkZXNjcmlwdG9yc1RvUmVmcmVzaDsKLQl9Ci0JCi0Jdm9pZCBzZXREZXNjcmlwdG9yc1RvUmVmcmVzaChTZXQgZGVzY3JpcHRvcnNUb1JlZnJlc2gpIHsKLQkJdGhpcy5kZXNjcmlwdG9yc1RvUmVmcmVzaCA9IGRlc2NyaXB0b3JzVG9SZWZyZXNoOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5CYXRjaENvbW1hbmQjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJaWYoZGVzY3JpcHRvcnNUb1JlZnJlc2ggIT0gbnVsbCkgewotCQkJZGVzY3JpcHRvcnNUb1JlZnJlc2guY2xlYXIoKTsKLQkJCWRlc2NyaXB0b3JzVG9SZWZyZXNoID0gbnVsbDsKLQkJfQotCQkKLQkJaWYocmVmcmVzaERlc2NyaXB0b3JzQ29tbWFuZCAhPSBudWxsKSB7Ci0JCQlyZWZyZXNoRGVzY3JpcHRvcnNDb21tYW5kLmRpc3Bvc2UoKTsKLQkJfQotCQkKLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuQmF0Y2hDb21tYW5kI2NhbkV4ZWN1dGUoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGNhbkV4ZWN1dGUoKSB7Ci0JCXJldHVybiBzdXBlci5jYW5FeGVjdXRlKCkgfHwgKGRlc2NyaXB0b3JzVG9SZWZyZXNoICE9IG51bGwgJiYgIWRlc2NyaXB0b3JzVG9SZWZyZXNoLmlzRW1wdHkoKSk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5CYXRjaENvbW1hbmQjZXhlY3V0ZSgpCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJc3VwZXIuZXhlY3V0ZSgpOwotCQkKLQkJLy8gY3JlYXRlIHJlZnJlc2hEZXNjcmlwdG9yc0NvbW1hbmQKLQkJLy8KLQkJaWYoZGVzY3JpcHRvcnNUb1JlZnJlc2ggIT0gbnVsbCAmJiAhZGVzY3JpcHRvcnNUb1JlZnJlc2guaXNFbXB0eSgpCi0JCQkJJiYgcmVmcmVzaERlc2NyaXB0b3JzQ29tbWFuZCA9PSBudWxsKSB7Ci0JCQlyZWZyZXNoRGVzY3JpcHRvcnNDb21tYW5kID0gbmV3IENvbXBvdW5kQ29tbWFuZCgpOwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gZGVzY3JpcHRvcnNUb1JlZnJlc2guaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJRGVzY3JpcHRvciBkZXNjID0gKERlc2NyaXB0b3IpIGl0ZXIubmV4dCgpOwotCQkJCXJlZnJlc2hEZXNjcmlwdG9yc0NvbW1hbmQuYXBwZW5kKG5ldyBCYXNpY1N5bmNocm9uaXplRGVzY3JpcHRvckNvbW1hbmQoZGVzYywgc3luY2hGZWF0dXJlcywgY29uZmlnKSk7CQkJCQotCQkJfQotCQl9Ci0KLQkJLy8gcmVmcmVzaCBkZXNjcmlwdG9ycwotCQkvLwotCQlpZihyZWZyZXNoRGVzY3JpcHRvcnNDb21tYW5kICE9IG51bGwpIHsKLQkJCXJlZnJlc2hEZXNjcmlwdG9yc0NvbW1hbmQuZXhlY3V0ZSgpOwotCQl9Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5CYXRjaENvbW1hbmQjdW5kbygpCi0JICovCi0JcHVibGljIHZvaWQgdW5kbygpIHsKLQkJaWYocmVmcmVzaERlc2NyaXB0b3JzQ29tbWFuZCAhPSBudWxsKSB7Ci0JCQlyZWZyZXNoRGVzY3JpcHRvcnNDb21tYW5kLnVuZG8oKTsKLQkJfQotCQkKLQkJc3VwZXIudW5kbygpOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL0dlbmVyaWNEcm9wQ29tbWFuZC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvR2VuZXJpY0Ryb3BDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxNjk4ZjAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvR2VuZXJpY0Ryb3BDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5BYnN0cmFjdENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSVJlc291cmNlQXdhcmVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotCi0KLS8qKgotICogRHJvcCBjb21tYW5kIHRvIGRyb3AgYW55IG9iamVjdCBvbiBhIHRhcmdldCB0aGF0IHN1cHBvcnRzIGFkYXB0aW5nIGRyb3AKLSAqIG9iamVjdCB0byBpdHMgb3duIG9iamVjdC4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEdlbmVyaWNEcm9wQ29tbWFuZCBleHRlbmRzIEFic3RyYWN0Q29tbWFuZCBpbXBsZW1lbnRzCi0JCUlSZXNvdXJjZUF3YXJlQ29tbWFuZCB7Ci0KLQlwcml2YXRlIENvbGxlY3Rpb24gZHJvcEVsZW1lbnRzOwotCi0JcHJpdmF0ZSBBcnJheUxpc3QgZmVhdHVyZUVsZW1lbnRzOwotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uIG1vZGlmaWVkUmVzb3VyY2VzOwotCi0JcHJpdmF0ZSBFT2JqZWN0IHRhcmdldDsKLQotCXByaXZhdGUgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmU7Ci0KLQlwcml2YXRlIEVsZW1lbnRBZGFwdGVyIGRyb3BBZGFwdGVyOwotCi0JcHVibGljIEdlbmVyaWNEcm9wQ29tbWFuZChFT2JqZWN0IHRhcmdldCwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsCi0JCQlDb2xsZWN0aW9uIGRyb3BFbGVtZW50cywgRWxlbWVudEFkYXB0ZXIgZHJvcEFkYXB0ZXIpIHsKLQkJdGhpcy50YXJnZXQgPSB0YXJnZXQ7Ci0JCXRoaXMuZmVhdHVyZSA9IGZlYXR1cmU7Ci0JCXRoaXMuZHJvcEVsZW1lbnRzID0gZHJvcEVsZW1lbnRzOwotCQl0aGlzLmRyb3BBZGFwdGVyID0gZHJvcEFkYXB0ZXI7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQWJzdHJhY3RDb21tYW5kI3ByZXBhcmUoKQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHByZXBhcmUoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuY29tbWFuZC5JUmVzb3VyY2VBd2FyZUNvbW1hbmQjZ2V0TW9kaWZpZWRSZXNvdXJjZXMoKQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldE1vZGlmaWVkUmVzb3VyY2VzKCkgewotCQlpZiAobW9kaWZpZWRSZXNvdXJjZXMgPT0gbnVsbCkgewotCQkJbW9kaWZpZWRSZXNvdXJjZXMgPSBuZXcgSGFzaFNldCgpOwotCQl9Ci0JCXJldHVybiBtb2RpZmllZFJlc291cmNlczsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kI2V4ZWN1dGUoKQotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCS8vIGNvbXBpbGUgdGhlIGZlYXR1cmVFbGVtZW50cyBsaXN0Ci0JCS8vCi0JCWZlYXR1cmVFbGVtZW50cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZHJvcEVsZW1lbnRzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGVsZW1lbnQgPSBUbmdVdGlsLnVud3JhcChpdGVyLm5leHQoKSk7Ci0JCQllbGVtZW50ID0gZHJvcEFkYXB0ZXIuYWRhcHQoZWxlbWVudCk7Ci0JCQlpZiAoZWxlbWVudCAhPSBudWxsKSB7Ci0JCQkJZmVhdHVyZUVsZW1lbnRzLmFkZChlbGVtZW50KTsKLQkJCX0KLQkJCS8vIGlmKGVsZW1lbnQgaW5zdGFuY2VvZiBSb2xlKSB7Ci0JCQkvLyBpZihjcmVhdGVEZXNjcmlwdG9yKSB7Ci0JCQkvLyBmZWF0dXJlRWxlbWVudHMuYWRkKFByb2Nlc3NVdGlsLmNyZWF0ZVJvbGVEZXNjcmlwdG9yKChSb2xlKQotCQkJLy8gZWxlbWVudCkpOwotCQkJLy8gfQotCQkJLy8gZWxzZSB7Ci0JCQkvLyBmZWF0dXJlRWxlbWVudHMuYWRkKGVsZW1lbnQpOwotCQkJLy8gfQotCQkJLy8gfQotCQl9Ci0KLQkJcmVkbygpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQjcmVkbygpCi0JICovCi0JcHVibGljIHZvaWQgcmVkbygpIHsKLQkJaWYgKCFmZWF0dXJlRWxlbWVudHMuaXNFbXB0eSgpKSB7Ci0JCQkoKExpc3QpIHRhcmdldC5lR2V0KGZlYXR1cmUpKS5hZGRBbGwoZmVhdHVyZUVsZW1lbnRzKTsKLQkJCWlmICh0YXJnZXQuZVJlc291cmNlKCkgIT0gbnVsbCkgewotCQkJCWdldE1vZGlmaWVkUmVzb3VyY2VzKCkuYWRkKHRhcmdldC5lUmVzb3VyY2UoKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5BYnN0cmFjdENvbW1hbmQjdW5kbygpCi0JICovCi0JcHVibGljIHZvaWQgdW5kbygpIHsKLQkJKChMaXN0KSB0YXJnZXQuZUdldChmZWF0dXJlKSkucmVtb3ZlQWxsKGZlYXR1cmVFbGVtZW50cyk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQWJzdHJhY3RDb21tYW5kI2dldEFmZmVjdGVkT2JqZWN0cygpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0QWZmZWN0ZWRPYmplY3RzKCkgewotCQlyZXR1cm4gZmVhdHVyZUVsZW1lbnRzOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgaW50ZXJmYWNlIEVsZW1lbnRBZGFwdGVyIHsKLQkJLyoqCi0JCSAqIEFkYXB0cyB0aGUgZHJvcCBlbGVtZW50IHRvIHRoZSByaWdodCBlbGVtZW50IGZvciB0aGUgZHJvcCB0YXJnZXQuCi0JCSAqIAotCQkgKiBAcGFyYW0gZHJvcEVsZW1lbnQKLQkJICogQHJldHVybgotCQkgKi8KLQkJT2JqZWN0IGFkYXB0KE9iamVjdCBkcm9wRWxlbWVudCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9JQWN0aW9uVHlwZUNvbnN0YW50cy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvSUFjdGlvblR5cGVDb25zdGFudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGU1OGExYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9JQWN0aW9uVHlwZUNvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQ7Ci0KLXB1YmxpYyBjbGFzcyBJQWN0aW9uVHlwZUNvbnN0YW50cyB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBRERfUFJJTUFSWV9QRVJGT1JNRVIgPSAwOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUREX0FERElUSU9OQUxfUEVSRk9STUVSID0gMTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFERF9BU1NJU1RFRF9CWSA9IDI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBRERfRVhURVJOQUxfSU5QVVQgPSAzOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUREX01BTkRBVE9SWV9JTlBVVCA9IDQ7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBRERfT1BUSU9OQUxfSU5QVVQgPSA1OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUREX09VVFBVVCA9IDY7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBRERfUkVTUE9OU0lCTEVfRk9SID0gNzsKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL0xpbmtNZXRob2RFbGVtZW50Q29tbWFuZC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvTGlua01ldGhvZEVsZW1lbnRDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0NDRkZTAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvTGlua01ldGhvZEVsZW1lbnRDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFzazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yOwotCi0KLS8qKgotICogQ29tbWFuZCBmb3IgbGlua2luZyBtZXRob2QgZWxlbWVudCB0byBkZXNjcmlwdG9yCi0gKiAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4wCi0gKi8KLQotcHVibGljIGNsYXNzIExpbmtNZXRob2RFbGVtZW50Q29tbWFuZCBleHRlbmRzIEFkZE1ldGhvZEVsZW1lbnRDb21tYW5kIHsKLQotCXByaXZhdGUgRGVzY3JpcHRvciBkZXNjOwotCi0JcHJpdmF0ZSBPYmplY3Qgb2JqOwotCi0JcHJpdmF0ZSBMaXN0IG9iamVjdHM7Ci0KLQlwcml2YXRlIGludCBmZWF0dXJlSUQ7Ci0KLQlwcml2YXRlIENvbGxlY3Rpb24gbW9kaWZpZWRSZXNvdXJjZXM7Ci0KLQkvKioKLQkgKiBBc3NpZ24gcm9sZSB0byB0YXNrIGRlc2NyaXB0b3IgVXNlZCBmb3IgYm90aCBhZGRpdGlvbmFsbHkgcGVyZm9ybWVkIGJ5Ci0JICogYW5kIGFzc2lzdGVkIGJ5Ci0JICovCi0JcHVibGljIExpbmtNZXRob2RFbGVtZW50Q29tbWFuZChEZXNjcmlwdG9yIGRlc2MsIE9iamVjdCBvYmosIGludCBmZWF0dXJlSUQpIHsKLQotCQlzdXBlcihUbmdVdGlsLmdldE93bmluZ1Byb2Nlc3MoZGVzYykpOwotCi0JCXRoaXMuZGVzYyA9IGRlc2M7Ci0JCXRoaXMub2JqID0gb2JqOwotCQl0aGlzLmZlYXR1cmVJRCA9IGZlYXR1cmVJRDsKLQotCQlpZiAob2JqICE9IG51bGwpIHsKLQkJCW9iamVjdHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlvYmplY3RzLmFkZChvYmopOwotCQl9Ci0JCXRoaXMubW9kaWZpZWRSZXNvdXJjZXMgPSBuZXcgSGFzaFNldCgpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQjZXhlY3V0ZSgpCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQotCQlpZiAoZGVzYyA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCS8vIGFkZCB0byBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gaWYgbm90IHRoZXJlIGFscmVhZHkKLQkJaWYgKCFzdXBlci5hZGRUb0RlZmF1bHRDb25maWd1cmF0aW9uKG9iamVjdHMpKQotCQkJcmV0dXJuOwotCi0JCWlmICghb2JqZWN0cy5pc0VtcHR5KCkpCi0JCQlyZWRvKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZCNyZWRvKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWRvKCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19UQVNLOgotCQkJKChUYXNrRGVzY3JpcHRvcikgZGVzYykuc2V0VGFzaygoVGFzaykgb2JqKTsKLQkJCWJyZWFrOwotCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9ERVNDUklQVE9SX19ST0xFOgotCQkJKChSb2xlRGVzY3JpcHRvcikgZGVzYykuc2V0Um9sZSgoUm9sZSkgb2JqKTsKLQkJCWJyZWFrOwotCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX1dPUktfUFJPRFVDVDoKLQkJCSgoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBkZXNjKS5zZXRXb3JrUHJvZHVjdCgoV29ya1Byb2R1Y3QpIG9iaik7Ci0JCQlicmVhazsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHVuZG8oKSB7Ci0JCWlmICghb2JqZWN0cy5pc0VtcHR5KCkpIHsKLQkJCS8vIGJhc2ljYWxseSByZW1vdmUgZnJvbSBjb25maWd1cmF0aW9uIGlmIGFueXRoaW5nIHdhcyBhZGRlZAotCQkJc3VwZXIudW5kbygpOwotCi0JCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fVEFTSzoKLQkJCQkoKFRhc2tEZXNjcmlwdG9yKSBkZXNjKS5zZXRUYXNrKG51bGwpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfREVTQ1JJUFRPUl9fUk9MRToKLQkJCQkoKFJvbGVEZXNjcmlwdG9yKSBkZXNjKS5zZXRSb2xlKG51bGwpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX19XT1JLX1BST0RVQ1Q6Ci0JCQkJKChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIGRlc2MpLnNldFdvcmtQcm9kdWN0KG51bGwpOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gcHJlcGFyZSgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0TW9kaWZpZWRSZXNvdXJjZXMoKSB7Ci0JCWlmIChkZXNjLmVSZXNvdXJjZSgpICE9IG51bGwgJiYgIW9iamVjdHMuaXNFbXB0eSgpKSB7Ci0JCQltb2RpZmllZFJlc291cmNlcy5hZGQoZGVzYy5lUmVzb3VyY2UoKSk7Ci0JCX0KLQkJcmV0dXJuIG1vZGlmaWVkUmVzb3VyY2VzOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL0xvY2FsbHlSZXBsYWNlQW5kRGVlcENvcHlDb21tYW5kLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9Mb2NhbGx5UmVwbGFjZUFuZERlZXBDb3B5Q29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NDcyOTQwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL0xvY2FsbHlSZXBsYWNlQW5kRGVlcENvcHlDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnVpLlVzZXJJbnRlcmFjdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuQWN0aXZpdHlIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLnV0aWwuT3Bwb3NpdGVGZWF0dXJlOwotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlIC0gSnVsIDYsIDIwMDYKLSAqIEBzaW5jZSAgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBMb2NhbGx5UmVwbGFjZUFuZERlZXBDb3B5Q29tbWFuZCBleHRlbmRzIFJlcGxhY2VBY3Rpdml0eUNvbW1hbmQgewotCi0JLyoqCi0JICogQHBhcmFtIHdyYXBwZXIKLQkgKi8KLQlwdWJsaWMgTG9jYWxseVJlcGxhY2VBbmREZWVwQ29weUNvbW1hbmQoQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIgd3JhcHBlcikgewotCQlzdXBlcih3cmFwcGVyKTsJCQotCQlzZXRMYWJlbChMaWJyYXJ5RWRpdFJlc291cmNlcy5sb2NhbFJlcGxhY2VtZW50QW5kRGVlcENvcHlfdGV4dCk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kLlJlcGxhY2VBY3Rpdml0eUNvbW1hbmQjZG9WYXJ5KCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkb1ZhcnkoKSB7Ci0JCS8vIGRlZXAgY29weSB0aGUgYWN0aXZpdHkKLQkJLy8KLQkJQWN0aXZpdHkgYWN0aXZpdHkgPSAoQWN0aXZpdHkpIFRuZ1V0aWwudW53cmFwKHdyYXBwZXIpOwotCQlpZighVXNlckludGVyYWN0aW9uSGVscGVyLmNvbmZpcm1EZWVwQ29weShDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KGFjdGl2aXR5KSkpIHsKLQkJCXJldHVybjsKLQkJfQkJCi0JCVByb2Nlc3MgdGFyZ2V0UHJvY2VzcyA9IChQcm9jZXNzKSB3cmFwcGVyLmdldFRvcEl0ZW0oKTsKLQkJTWV0aG9kQ29uZmlndXJhdGlvbiBkZWVwQ29weUNvbmZpZyA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlkZWVwQ29weUNvbmZpZyA9IFVzZXJJbnRlcmFjdGlvbkhlbHBlci5jaG9vc2VEZWVwQ29weUNvbmZpZ3VyYXRpb24odGFyZ2V0UHJvY2Vzcywgd3JhcHBlci5nZXRBZGFwdGVyRmFjdG9yeSgpKTsKLQkJfQotCQljYXRjaChPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJQWN0aXZpdHlIYW5kbGVyIGFjdGl2aXR5SGFuZGxlciA9IG5ldyBBY3Rpdml0eUhhbmRsZXIoKTsKLQkJYWN0aXZpdHlIYW5kbGVyLnNldERlZXBDb3B5Q29uZmlnKGRlZXBDb3B5Q29uZmlnKTsKLQkJYWN0aXZpdHlIYW5kbGVyLnNldFRhcmdldFByb2Nlc3ModGFyZ2V0UHJvY2Vzcyk7Ci0JCWFjdGl2aXR5SGFuZGxlci5kZWVwQ29weShhY3Rpdml0eSk7Ci0JCUFjdGl2aXR5IGNvcHkgPSAoQWN0aXZpdHkpIGFjdGl2aXR5SGFuZGxlci5nZXRBY3Rpdml0aWVzKCkuZ2V0KDApOwotCQkKLQkJc3VwZXIuZG9WYXJ5KCk7Ci0JCQotCQkvLyByZXBsYWNlIHRoZSBsb2NhbCByZXBsYWNlbWVudCB3aXRoIGRlZXAgY29weQotCQkvLwotCQlpbnQgcG9zID0gY3JlYXRlZEFjdGl2aXRpZXMuc2l6ZSgpIC0gMTsKLQkJQWN0aXZpdHkgbG9jYWxSZXBsYWNlbWVudCA9IChBY3Rpdml0eSkgY3JlYXRlZEFjdGl2aXRpZXMuZ2V0KHBvcyk7CQkKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gbG9jYWxSZXBsYWNlbWVudC5nZXRPcHBvc2l0ZUZlYXR1cmVzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPcHBvc2l0ZUZlYXR1cmUgb3Bwb3NpdGVGZWF0dXJlID0gKE9wcG9zaXRlRmVhdHVyZSkgaXRlci5uZXh0KCk7Ci0JCQlPYmplY3QgdmFsdWUgPSBsb2NhbFJlcGxhY2VtZW50LmdldE9wcG9zaXRlRmVhdHVyZVZhbHVlKG9wcG9zaXRlRmVhdHVyZSk7Ci0JCQlpZih2YWx1ZSAhPSBudWxsKSB7Ci0JCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBvcHBvc2l0ZUZlYXR1cmUuZ2V0VGFyZ2V0RmVhdHVyZSgpOwotCQkJCWlmKG9wcG9zaXRlRmVhdHVyZS5pc01hbnkoKSkgewotCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gbmV3IEFycmF5TGlzdCgoKENvbGxlY3Rpb24pdmFsdWUpKS5pdGVyYXRvcigpOyBpdGVyYXRvcgotCQkJCQkuaGFzTmV4dCgpOykgewkJCi0JCQkJCQlFT2JqZWN0IG8gPSAoRU9iamVjdCkgaXRlcmF0b3IubmV4dCgpOwotCQkJCQkJaWYoZmVhdHVyZS5pc01hbnkoKSkgewotCQkJCQkJCUxpc3QgbGlzdCA9IChMaXN0KSBvLmVHZXQoZmVhdHVyZSk7Ci0JCQkJCQkJbGlzdC5yZW1vdmUobG9jYWxSZXBsYWNlbWVudCk7Ci0JCQkJCQkJbGlzdC5hZGQoY29weSk7Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIHsKLQkJCQkJCQlvLmVTZXQoZmVhdHVyZSwgY29weSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCUVPYmplY3QgbyA9IChFT2JqZWN0KSB2YWx1ZTsKLQkJCQkJaWYoZmVhdHVyZS5pc01hbnkoKSkgewotCQkJCQkJTGlzdCBsaXN0ID0gKExpc3QpIG8uZUdldChmZWF0dXJlKTsKLQkJCQkJCWxpc3QucmVtb3ZlKGxvY2FsUmVwbGFjZW1lbnQpOwotCQkJCQkJbGlzdC5hZGQoY29weSk7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQlvLmVTZXQoZmVhdHVyZSwgY29weSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJY3JlYXRlZEFjdGl2aXRpZXMuc2V0KHBvcywgY29weSk7Ci0JCWNvcHkuc2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudChsb2NhbFJlcGxhY2VtZW50LmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSk7Ci0JCWNvcHkuc2V0VmFyaWFiaWxpdHlUeXBlKGxvY2FsUmVwbGFjZW1lbnQuZ2V0VmFyaWFiaWxpdHlUeXBlKCkpOwotCQljb3B5LnNldFByZXNlbnRlZEFmdGVyKGxvY2FsUmVwbGFjZW1lbnQuZ2V0UHJlc2VudGVkQWZ0ZXIoKSk7Ci0JCWNvcHkuc2V0UHJlc2VudGVkQmVmb3JlKGxvY2FsUmVwbGFjZW1lbnQuZ2V0UHJlc2VudGVkQmVmb3JlKCkpOwotCQlBY3Rpdml0eSBzdXBlckFjdCA9IGxvY2FsUmVwbGFjZW1lbnQuZ2V0U3VwZXJBY3Rpdml0aWVzKCk7Ci0JCWludCBpZCA9IHN1cGVyQWN0LmdldEJyZWFrZG93bkVsZW1lbnRzKCkuaW5kZXhPZihsb2NhbFJlcGxhY2VtZW50KTsKLQkJc3VwZXJBY3QuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5zZXQoaWQsIGNvcHkpOwotCQkKLQkJLy8gYWRkIGNvcHkgcGFja2FnZSB0byB0aGUgcGFja2FnZSBvZiBzdXBlciBhY3Rpdml0eQotCQkvLwotCQkoKFByb2Nlc3NQYWNrYWdlKXN1cGVyQWN0LmVDb250YWluZXIoKSkuZ2V0Q2hpbGRQYWNrYWdlcygpLmFkZCgoTWV0aG9kUGFja2FnZSkgY29weS5lQ29udGFpbmVyKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL01vdmVEb3duQ29tbWFuZC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvTW92ZURvd25Db21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0OGQyYTcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvTW92ZURvd25Db21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5BYnN0cmFjdENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JUmVzb3VyY2VBd2FyZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQ7Ci0KLQotLyoqCi0gKiBDb21tYW5kIHRvIG1vdmUgZG93biBlbGVtZW50IGluIGJyZWFrZG93biBzdHJ1Y3R1cmUKLSAqIAotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIE1vdmVEb3duQ29tbWFuZCBleHRlbmRzIEFic3RyYWN0Q29tbWFuZCBpbXBsZW1lbnRzCi0JCUlSZXNvdXJjZUF3YXJlQ29tbWFuZCB7Ci0JcHJpdmF0ZSBBY3Rpdml0eSBhY3Rpdml0eTsKLQotCXByaXZhdGUgQ29sbGVjdGlvbiBtb2RpZmllZFJlc291cmNlczsKLQotCXByaXZhdGUgaW50IGVsZW1lbnRMb2NhdGlvbiA9IDA7Ci0KLQlwcml2YXRlIGludCB0cmFuc2ZlckxvY2F0aW9uID0gMDsKLQotCXByaXZhdGUgT2JqZWN0IGVsZW1lbnRPYmo7Ci0KLQlwcml2YXRlIENvbGxlY3Rpb24gZUNsYXNzZXM7Ci0JCi0JcHJpdmF0ZSBib29sZWFuIGFkamFjZW50ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgTW92ZURvd25Db21tYW5kKEFjdGl2aXR5IGFjdGl2aXR5LCBPYmplY3QgZWxlbWVudE9iaiwKLQkJCUNvbGxlY3Rpb24gZUNsYXNzZXMpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5hY3Rpdml0eSA9IGFjdGl2aXR5OwotCQl0aGlzLmVsZW1lbnRPYmogPSBlbGVtZW50T2JqOwotCQl0aGlzLmVDbGFzc2VzID0gZUNsYXNzZXM7Ci0KLQkJdGhpcy5tb2RpZmllZFJlc291cmNlcyA9IG5ldyBIYXNoU2V0KCk7Ci0JCWlmIChhY3Rpdml0eS5lUmVzb3VyY2UoKSAhPSBudWxsKSB7Ci0JCQltb2RpZmllZFJlc291cmNlcy5hZGQoYWN0aXZpdHkuZVJlc291cmNlKCkpOwotCQl9Ci0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kI2V4ZWN1dGUoKQotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCUxpc3QgYWxsRWxlbWVudHMgPSBhY3Rpdml0eS5nZXRCcmVha2Rvd25FbGVtZW50cygpOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgYWxsRWxlbWVudHMuc2l6ZSgpOyBpKyspIHsKLQkJCU9iamVjdCBvYmogPSBhbGxFbGVtZW50cy5nZXQoaSk7Ci0JCQlpZiAob2JqLmVxdWFscyhlbGVtZW50T2JqKSkgewotCQkJCWVsZW1lbnRMb2NhdGlvbiA9IGk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQotCQlmb3IgKGludCBpID0gZWxlbWVudExvY2F0aW9uICsgMTsgaSA8PSBhbGxFbGVtZW50cy5zaXplKCk7IGkrKykgewotCQkJT2JqZWN0IG9iaiA9IGFsbEVsZW1lbnRzLmdldChpKTsKLQkJCWlmIChUbmdVdGlsLmlzRUNsYXNzSW5zdGFuY2VPZihlQ2xhc3Nlcywgb2JqKSkgewotCQkJCXRyYW5zZmVyTG9jYXRpb24gPSBpOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0KLQkJQnJlYWtkb3duRWxlbWVudCBuZXh0ID0gIChCcmVha2Rvd25FbGVtZW50KSBhbGxFbGVtZW50cy5nZXQodHJhbnNmZXJMb2NhdGlvbik7Ci0JCUJyZWFrZG93bkVsZW1lbnQgZSA9IChCcmVha2Rvd25FbGVtZW50KSBlbGVtZW50T2JqOwotCQlpZihlLmdldFByZXNlbnRlZEFmdGVyKCkgPT0gbmV4dCkgewotCQkJYWRqYWNlbnQgPSB0cnVlOwotCQl9Ci0KLQkJcmVkbygpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQjcmVkbygpCi0JICovCi0JcHVibGljIHZvaWQgcmVkbygpIHsKLQkJaWYoYWRqYWNlbnQpIHsKLQkJCS8vIHN3YXAgInByZW5zZW50ZWQtYWZ0ZXIiIGVsZW1lbnQKLQkJCS8vCi0JCQlCcmVha2Rvd25FbGVtZW50IG5leHQgPSAgKEJyZWFrZG93bkVsZW1lbnQpIGFjdGl2aXR5LmdldEJyZWFrZG93bkVsZW1lbnRzKCkuZ2V0KHRyYW5zZmVyTG9jYXRpb24pOwotCQkJQnJlYWtkb3duRWxlbWVudCBlID0gKEJyZWFrZG93bkVsZW1lbnQpIGVsZW1lbnRPYmo7Ci0JCQllLnNldFByZXNlbnRlZEFmdGVyKG5leHQuZ2V0UHJlc2VudGVkQWZ0ZXIoKSk7Ci0JCQluZXh0LnNldFByZXNlbnRlZEFmdGVyKGUpOwotCQl9Ci0JCSgoRUxpc3QpIGFjdGl2aXR5LmdldEJyZWFrZG93bkVsZW1lbnRzKCkpLm1vdmUodHJhbnNmZXJMb2NhdGlvbiwKLQkJCQllbGVtZW50TG9jYXRpb24pOwotCX0KLQotCXB1YmxpYyB2b2lkIHVuZG8oKSB7Ci0JCSgoRUxpc3QpIGFjdGl2aXR5LmdldEJyZWFrZG93bkVsZW1lbnRzKCkpLm1vdmUoZWxlbWVudExvY2F0aW9uLAotCQkJCXRyYW5zZmVyTG9jYXRpb24pOwotCQlpZihhZGphY2VudCkgewotCQkJLy8gcmVzdG9yZSAicHJlbnNlbnRlZC1hZnRlciIgZWxlbWVudAotCQkJLy8KLQkJCUJyZWFrZG93bkVsZW1lbnQgbmV4dCA9ICAoQnJlYWtkb3duRWxlbWVudCkgYWN0aXZpdHkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5nZXQodHJhbnNmZXJMb2NhdGlvbik7Ci0JCQlCcmVha2Rvd25FbGVtZW50IGUgPSAoQnJlYWtkb3duRWxlbWVudCkgZWxlbWVudE9iajsKLQkJCW5leHQuc2V0UHJlc2VudGVkQWZ0ZXIoZS5nZXRQcmVzZW50ZWRBZnRlcigpKTsKLQkJCWUuc2V0UHJlc2VudGVkQWZ0ZXIobmV4dCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBwcmVwYXJlKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRNb2RpZmllZFJlc291cmNlcygpIHsKLQkJcmV0dXJuIG1vZGlmaWVkUmVzb3VyY2VzOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL01vdmVVcENvbW1hbmQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL01vdmVVcENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTUyOWRkNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9Nb3ZlVXBDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5BYnN0cmFjdENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JUmVzb3VyY2VBd2FyZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQ7Ci0KLQotLyoqCi0gKiBDb21tYW5kIHRvIG1vdmUgdXAgdGhlIGVsZW1lbnQgaW4gYnJlYWtkb3duIHN0cnVjdHVyZQotICogCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTW92ZVVwQ29tbWFuZCBleHRlbmRzIEFic3RyYWN0Q29tbWFuZCBpbXBsZW1lbnRzCi0JCUlSZXNvdXJjZUF3YXJlQ29tbWFuZCB7Ci0JcHJpdmF0ZSBBY3Rpdml0eSBhY3Rpdml0eTsKLQotCXByaXZhdGUgQ29sbGVjdGlvbiBtb2RpZmllZFJlc291cmNlczsKLQotCXByaXZhdGUgaW50IGVsZW1lbnRMb2NhdGlvbiA9IDA7Ci0KLQlwcml2YXRlIGludCB0cmFuc2ZlckxvY2F0aW9uID0gMDsKLQotCXByaXZhdGUgT2JqZWN0IGVsZW1lbnRPYmo7Ci0KLQlwcml2YXRlIENvbGxlY3Rpb24gZUNsYXNzZXM7Ci0JCi0JcHJpdmF0ZSBib29sZWFuIGFkamFjZW50ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgTW92ZVVwQ29tbWFuZChBY3Rpdml0eSBhY3Rpdml0eSwgT2JqZWN0IGVsZW1lbnRPYmosCi0JCQlDb2xsZWN0aW9uIGVDbGFzc2VzKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuYWN0aXZpdHkgPSBhY3Rpdml0eTsKLQkJdGhpcy5lbGVtZW50T2JqID0gZWxlbWVudE9iajsKLQkJdGhpcy5lQ2xhc3NlcyA9IGVDbGFzc2VzOwotCi0JCXRoaXMubW9kaWZpZWRSZXNvdXJjZXMgPSBuZXcgSGFzaFNldCgpOwotCQlpZiAoYWN0aXZpdHkuZVJlc291cmNlKCkgIT0gbnVsbCkgewotCQkJbW9kaWZpZWRSZXNvdXJjZXMuYWRkKGFjdGl2aXR5LmVSZXNvdXJjZSgpKTsKLQkJfQotCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZCNleGVjdXRlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQlMaXN0IGFsbEVsZW1lbnRzID0gYWN0aXZpdHkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IGFsbEVsZW1lbnRzLnNpemUoKTsgaSsrKSB7Ci0JCQlPYmplY3Qgb2JqID0gYWxsRWxlbWVudHMuZ2V0KGkpOwotCQkJaWYgKG9iai5lcXVhbHMoZWxlbWVudE9iaikpIHsKLQkJCQllbGVtZW50TG9jYXRpb24gPSBpOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCWZvciAoaW50IGkgPSBlbGVtZW50TG9jYXRpb24gLSAxOyBpID49IDA7IGktLSkgewotCQkJT2JqZWN0IG9iaiA9IGFsbEVsZW1lbnRzLmdldChpKTsKLQkJCWlmIChUbmdVdGlsLmlzRUNsYXNzSW5zdGFuY2VPZihlQ2xhc3Nlcywgb2JqKSkgewotCQkJCXRyYW5zZmVyTG9jYXRpb24gPSBpOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCQotCQlCcmVha2Rvd25FbGVtZW50IHByZXYgPSAgKEJyZWFrZG93bkVsZW1lbnQpIGFsbEVsZW1lbnRzLmdldCh0cmFuc2ZlckxvY2F0aW9uKTsJCQotCQlpZihwcmV2LmdldFByZXNlbnRlZEFmdGVyKCkgPT0gZWxlbWVudE9iaikgewotCQkJYWRqYWNlbnQgPSB0cnVlOwotCQl9Ci0KLQkJcmVkbygpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQjcmVkbygpCi0JICovCi0JcHVibGljIHZvaWQgcmVkbygpIHsKLQkJaWYoYWRqYWNlbnQpIHsKLQkJCS8vIHN3YXAgInByZXNlbnRlZC1hZnRlciIgZWxlbWVudAotCQkJLy8KLQkJCUJyZWFrZG93bkVsZW1lbnQgcHJldiA9ICAoQnJlYWtkb3duRWxlbWVudCkgYWN0aXZpdHkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5nZXQodHJhbnNmZXJMb2NhdGlvbik7CQkKLQkJCUJyZWFrZG93bkVsZW1lbnQgZSA9IChCcmVha2Rvd25FbGVtZW50KSBlbGVtZW50T2JqOwotCQkJcHJldi5zZXRQcmVzZW50ZWRBZnRlcihlLmdldFByZXNlbnRlZEFmdGVyKCkpOwotCQkJZS5zZXRQcmVzZW50ZWRBZnRlcihwcmV2KTsKLQkJfQotCQkoKEVMaXN0KSBhY3Rpdml0eS5nZXRCcmVha2Rvd25FbGVtZW50cygpKS5tb3ZlKHRyYW5zZmVyTG9jYXRpb24sCi0JCQkJZWxlbWVudExvY2F0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB1bmRvKCkgewotCQkoKEVMaXN0KSBhY3Rpdml0eS5nZXRCcmVha2Rvd25FbGVtZW50cygpKS5tb3ZlKGVsZW1lbnRMb2NhdGlvbiwKLQkJCQl0cmFuc2ZlckxvY2F0aW9uKTsKLQkJaWYoYWRqYWNlbnQpIHsKLQkJCS8vIHJlc3RvcmUgInByZXNlbnRlZC1hZnRlciIgZWxlbWVudAotCQkJLy8KLQkJCUJyZWFrZG93bkVsZW1lbnQgcHJldiA9ICAoQnJlYWtkb3duRWxlbWVudCkgYWN0aXZpdHkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5nZXQodHJhbnNmZXJMb2NhdGlvbik7CQkKLQkJCUJyZWFrZG93bkVsZW1lbnQgZSA9IChCcmVha2Rvd25FbGVtZW50KSBlbGVtZW50T2JqOwotCQkJZS5zZXRQcmVzZW50ZWRBZnRlcihwcmV2LmdldFByZXNlbnRlZEFmdGVyKCkpOwotCQkJcHJldi5zZXRQcmVzZW50ZWRBZnRlcihlKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHByZXBhcmUoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldE1vZGlmaWVkUmVzb3VyY2VzKCkgewotCQlyZXR1cm4gbW9kaWZpZWRSZXNvdXJjZXM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvT0JTRHJhZ0FuZERyb3BDb21tYW5kLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9PQlNEcmFnQW5kRHJvcENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGY5MTE2Yy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9PQlNEcmFnQW5kRHJvcENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuVW5leGVjdXRhYmxlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CcmVha2Rvd25FbGVtZW50SXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Qcm9jZXNzVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29tcG9zaXRlUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZWFtUHJvZmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogRHJhZyBhbmQgZHJvcCBjb21tYW5kIGZvciBkcmFnZ2luZyByb2xlIGludG8gVGVhbSBBbGxvY2F0aW9uCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgT0JTRHJhZ0FuZERyb3BDb21tYW5kIGV4dGVuZHMgQlNEcmFnQW5kRHJvcENvbW1hbmQgewotCi0JLyoqCi0JICogQHBhcmFtIGRvbWFpbgotCSAqIEBwYXJhbSBvd25lcgotCSAqIEBwYXJhbSBsb2NhdGlvbgotCSAqIEBwYXJhbSBvcGVyYXRpb25zCi0JICogQHBhcmFtIG9wZXJhdGlvbgotCSAqIEBwYXJhbSBjb2xsZWN0aW9uCi0JICovCi0JcHVibGljIE9CU0RyYWdBbmREcm9wQ29tbWFuZChFZGl0aW5nRG9tYWluIGRvbWFpbiwgT2JqZWN0IG93bmVyLAotCQkJZmxvYXQgbG9jYXRpb24sIGludCBvcGVyYXRpb25zLCBpbnQgb3BlcmF0aW9uLCBDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoZG9tYWluLCBvd25lciwgbG9jYXRpb24sIG9wZXJhdGlvbnMsIG9wZXJhdGlvbiwgY29sbGVjdGlvbik7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0KE9iamVjdCBvYmopIHsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIFJvbGUpIHsKLQkJCWlmIChvd25lciBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0vLwkJCQlyZXR1cm4gUHJvY2Vzc0NvbW1hbmRVdGlsLmdldFZhbGlkRGVzY3JpcHRvcihvYmosCi0vLwkJCQkJCShBY3Rpdml0eSkgb3duZXIsCi0vLwkJCQkJCSgoQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluKSBkb21haW4pCi0vLwkJCQkJCQkJLmdldEFkYXB0ZXJGYWN0b3J5KCkpID09IG51bGw7Ci0JCQl9IGVsc2UgaWYgKG93bmVyIGluc3RhbmNlb2YgVGVhbVByb2ZpbGUpIHsKLQkJCQlpZiAoUHJvY2Vzc1V0aWwuZ2V0QXNzb2NpYXRlZEVsZW1lbnRMaXN0KAotCQkJCQkJKChUZWFtUHJvZmlsZSkgb3duZXIpLmdldFRlYW1Sb2xlcygpKS5jb250YWlucyhvYmopKQotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29tbWFuZCBjcmVhdGVEcm9wQ29tbWFuZChPYmplY3Qgb3duZXIsIExpc3QgZHJvcFNyYykgewotCQlpZiAob3duZXIgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJcmV0dXJuIG5ldyBPQlNEcm9wQ29tbWFuZCgoQWN0aXZpdHkpIG93bmVyLCBkcm9wU3JjKTsKLQkJfSBlbHNlIGlmIChvd25lciBpbnN0YW5jZW9mIFRlYW1Qcm9maWxlKSB7Ci0JCQkvLyByZXR1cm4gbmV3IEdlbmVyaWNEcm9wQ29tbWFuZCgoVGVhbVByb2ZpbGUpIG93bmVyLAotCQkJLy8gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGVhbVByb2ZpbGVfVGVhbVJvbGVzKCksIGRyb3BTcmMsCi0JCQkvLyBnZXREcm9wQWRhcHRlcihvd25lcikpOwotCQkJcmV0dXJuIG5ldyBBZGRSb2xlVG9UZWFtQ29tbWFuZCgoVGVhbVByb2ZpbGUpIG93bmVyLCBkcm9wU3JjKTsKLQkJfSBlbHNlIGlmIChvd25lciBpbnN0YW5jZW9mIENvbXBvc2l0ZVJvbGUpIHsKLQkJCXJldHVybiBuZXcgR2VuZXJpY0Ryb3BDb21tYW5kKChDb21wb3NpdGVSb2xlKSBvd25lciwKLQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29tcG9zaXRlUm9sZV9BZ2dyZWdhdGVkUm9sZXMoKSwKLQkJCQkJZHJvcFNyYywgZ2V0RHJvcEFkYXB0ZXIob3duZXIpKTsKLQkJfQotCi0JCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCX0KLQotCXByaXZhdGUgR2VuZXJpY0Ryb3BDb21tYW5kLkVsZW1lbnRBZGFwdGVyIGdldERyb3BBZGFwdGVyKE9iamVjdCBvd25lcikgewotCQlBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSA9ICgoQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluKSBkb21haW4pCi0JCQkJLmdldEFkYXB0ZXJGYWN0b3J5KCk7Ci0JCUJyZWFrZG93bkVsZW1lbnRJdGVtUHJvdmlkZXIgYWRhcHRlciA9IChCcmVha2Rvd25FbGVtZW50SXRlbVByb3ZpZGVyKSBhZGFwdGVyRmFjdG9yeQotCQkJCS5hZGFwdChvd25lciwgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIuY2xhc3MpOwotCQlyZXR1cm4gYWRhcHRlci5jcmVhdGVEcm9wQWRhcHRlcigpOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL09CU0Ryb3BDb21tYW5kLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9PQlNEcm9wQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZTFjMzAyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL09CU0Ryb3BDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MzcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklDb25maWd1cmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51aS5Vc2VySW50ZXJhY3Rpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlByb2Nlc3NVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbi5VbmlxdWVOYW1lUE5hbWVIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZWFtUHJvZmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvcjsKLQotLyoqCi0gKiBDb21tYW5kIHRvIGRyYXAgYW5kIGRyb3Agcm9sZXMgdG8gVGVhbSBBbGxvY2F0aW9uIGJyZWFrZG93biBzdHJ1Y3R1cmUKLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBPQlNEcm9wQ29tbWFuZCBleHRlbmRzIEJTRHJvcENvbW1hbmQgewotCXByaXZhdGUgQXJyYXlMaXN0IHdwRGVzY0xpc3Q7Ci0KLQlwcml2YXRlIEFycmF5TGlzdCByb2xlRGVzY0xpc3Q7Ci0KLQlwcml2YXRlIE1hcDxSb2xlRGVzY3JpcHRvciwgVGVhbVByb2ZpbGU+IHJvbGVEZXNjVGVhbVByb2ZpbGVNYXA7Ci0KLQlwcml2YXRlIE1hcCB3cERlc2NUb0RlbGl2ZXJhYmxlUGFydHM7Ci0KLQlwcml2YXRlIEhhc2hNYXA8V29ya1Byb2R1Y3REZXNjcmlwdG9yLCBXb3JrUHJvZHVjdERlc2NyaXB0b3I+IHdwZFRvRGVsaXZlcmFibGVEZXNjcmlwdG9yTWFwOwotCi0JcHJpdmF0ZSBIYXNoTWFwIHdwZFRvVGFza0ZlYXR1cmVzTWFwOyAvLyBtYXAgb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yIHRvCi0KLQkvLyBtYXAgb2YgdGFzayBvdCBmZWF0dXJlIGxpc3QKLQotCXByaXZhdGUgSUNvbmZpZ3VyYXRvciBjb25maWdyYXRvcjsKLQotCXByaXZhdGUgYm9vbGVhbiBuZXdEdXBsaWNhdGVzUmVtb3ZlZDsKLQkKLQlwdWJsaWMgT0JTRHJvcENvbW1hbmQoQWN0aXZpdHkgYWN0LCBMaXN0IHJvbGVzKSB7Ci0JCXN1cGVyKGFjdCwgcm9sZXMpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBkcm9wRWxlbWVudHMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZWxlbWVudCA9IGl0ZXIubmV4dCgpOwotCQkJaWYgKCEoZWxlbWVudCBpbnN0YW5jZW9mIFJvbGUpKSB7Ci0JCQkJaXRlci5yZW1vdmUoKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBhY3Rpdml0eQotCSAqIEBwYXJhbSBkcm9wRWxlbWVudHMKLQkgKiBAcGFyYW0gY29uZmlnCi0JICogQHBhcmFtIHN5bmNoRmVhdHVyZXMKLQkgKi8KLQlwdWJsaWMgT0JTRHJvcENvbW1hbmQoQWN0aXZpdHkgYWN0aXZpdHksIExpc3QgZHJvcEVsZW1lbnRzLAotCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcsIFNldCBzeW5jaEZlYXR1cmVzLAotCQkJSUNvbmZpZ3VyYXRvciBjb25maWd1cmF0b3IpIHsKLQkJc3VwZXIoYWN0aXZpdHksIGRyb3BFbGVtZW50cywgY29uZmlnLCBzeW5jaEZlYXR1cmVzKTsKLQkJdGhpcy5jb25maWdyYXRvciA9IGNvbmZpZ3VyYXRvcjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZC5CU0Ryb3BDb21tYW5kI3ByZUV4ZWN1dGUoKQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHByZUV4ZWN1dGUoKSB7Ci0JCWlmICghc3VwZXIucHJlRXhlY3V0ZSgpKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCXJvbGVEZXNjTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJdGFza0Rlc2NMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQl3cERlc2NMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQl3cERlc2NUb0RlbGl2ZXJhYmxlUGFydHMgPSBuZXcgSGFzaE1hcCgpOwotCQl3cGRUb0RlbGl2ZXJhYmxlRGVzY3JpcHRvck1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0KLQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSBnZXRNZXRob2RDb25maWd1cmF0aW9uKCk7Ci0JCVNldCBkZXNjcmlwdG9yc1RvUmVmcmVzaCA9IHN5bmNocm9uaXplID8gYmF0Y2hDb21tYW5kCi0JCQkJLmdldERlc2NyaXB0b3JzVG9SZWZyZXNoKCkgOiBudWxsOwotCi0JCUxpc3QgYmVzID0gYWN0aXZpdHkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKTsKLQkJVW5pcXVlTmFtZVBOYW1lSGFuZGxlciB1bmlxdWVOYW1lc0hhbmRsZXIgPSBuZXcgVW5pcXVlTmFtZVBOYW1lSGFuZGxlcihiZXMpOwotCQkJCQotCQlpbnQgc2l6ZSA9IGRyb3BFbGVtZW50cy5zaXplKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlSb2xlIHJvbGUgPSAoUm9sZSkgZHJvcEVsZW1lbnRzLmdldChpKTsKLQkJCWlmIChUbmdVdGlsLmlzQ29udHJpYnV0b3Iocm9sZSkpIHsKLQkJCQlyb2xlID0gKFJvbGUpIFRuZ1V0aWwuZ2V0QmFzZShyb2xlKTsKLQkJCX0KLQotCQkJLy8gY2hlY2sgaWYgdGhlIHJvbGUgZGVzY3JpcHRvciBvZiB0aGUgcm9sZSBleGlzdHMgdW5kZXIgdGhpcwotCQkJLy8gYWN0aXZpdHkKLQkJCVJvbGVEZXNjcmlwdG9yIHJvbGVEZXNjID0gbnVsbDsKLQkJCWlmIChzeW5jaHJvbml6ZSkgewotCQkJCXJvbGVEZXNjID0gKFJvbGVEZXNjcmlwdG9yKSBQcm9jZXNzQ29tbWFuZFV0aWwKLQkJCQkJLmdldERlc2NyaXB0b3Iocm9sZSwgYWN0aXZpdHksIGNvbmZpZyk7Ci0JCQl9Ci0KLQkJCWlmIChyb2xlRGVzYyA9PSBudWxsKSB7Ci0JCQkJLy8gY3JlYXRlIHJvbGUgZGVzY3JpcHRvciBvYmplY3QKLQkJCQlyb2xlRGVzYyA9IFByb2Nlc3NVdGlsLmNyZWF0ZVJvbGVEZXNjcmlwdG9yKHJvbGUpOwotCQkJCXVuaXF1ZU5hbWVzSGFuZGxlci5lbnN1cmVVbmlxdWUocm9sZURlc2MpOwotCQkJCXJvbGVEZXNjTGlzdC5hZGQocm9sZURlc2MpOwotCQkJfSBlbHNlIHsKLQkJCQkvLyBuZWVkIHRvIGNsZWFyIGFsbCB0aGUgcmVmcmVzaGFibGUgZmVhdHVyZXMgb2YgdGhlIGV4aXN0aW5nCi0JCQkJLy8gZGVzY3JpcHRvcgotCQkJCS8vCi0JCQkJaWYgKHN5bmNocm9uaXplCi0JCQkJCQkmJiByb2xlRGVzYy5nZXRJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UoKQotCQkJCQkJCQkuYm9vbGVhblZhbHVlKCkpIHsKLQkJCQkJYmF0Y2hDb21tYW5kLmdldERlc2NyaXB0b3JzVG9SZWZyZXNoKCkuYWRkKHJvbGVEZXNjKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQkvLyBpZiBub3QgYSBzeW5jaHJvbml6YXRpb24sIGdldCBhbGwgd29ya3Byb2R1Y3RzIHdoaWNoIGhhdmUgcm9sZSBhcwotCQkvLyByZXNwb25zaWJsZSByb2xlIGZvcgotCQkvLyB3aGljaCB3b3JrIHByb2R1Y3QgZGVzY3JpcHRvciBuZWVkcyB0byBiZSBjcmVhdGVkCi0JCS8vCi0JCWlmICghc3luY2hyb25pemUpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJUm9sZSByb2xlID0gKFJvbGUpIGRyb3BFbGVtZW50cy5nZXQoaSk7Ci0JCQkJTGlzdCB3b3JrUHJvZHVjdHMgPSBQcm9jZXNzVXRpbC5nZXRXb3JrUHJvZHVjdHNGb3JSb2xlKHJvbGUsCi0JCQkJCQljb25maWcpOwotCQkJCWlmICgod29ya1Byb2R1Y3RzICE9IG51bGwpICYmICghKHdvcmtQcm9kdWN0cy5pc0VtcHR5KCkpKSkgewotCQkJCQlIYXNoTWFwIHdwVG9FeGlzdGluZ0Rlc2NyaXB0b3JNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQkJCQlMaXN0IGVsZW1lbnRzID0gbmV3IEFycmF5TGlzdChhY3Rpdml0eQotCQkJCQkJCS5nZXRCcmVha2Rvd25FbGVtZW50cygpKTsKLQkJCQkJZWxlbWVudHMuYWRkQWxsKHdwRGVzY0xpc3QpOwotCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB3b3JrUHJvZHVjdHMuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlXb3JrUHJvZHVjdCB3cCA9IChXb3JrUHJvZHVjdCkgaXRlci5uZXh0KCk7CQkJCQkJCi0JCQkJCQlPYmplY3Qgd3BkID0gUHJvY2Vzc1V0aWwuZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yKHdwRGVzY0xpc3QsIHdwKTsKLQkJCQkJCWlmKHdwZCA9PSBudWxsKSB7Ci0JCQkJCQkJd3BkID0gUHJvY2Vzc0NvbW1hbmRVdGlsLmdldERlc2NyaXB0b3Iod3AsIGFjdGl2aXR5LCBjb25maWcpOwotCQkJCQkJfQotCQkJCQkJaWYgKHdwZCAhPSBudWxsKSB7Ci0JCQkJCQkJd3BUb0V4aXN0aW5nRGVzY3JpcHRvck1hcC5wdXQod3AsIHdwZCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJTGlzdCBzZWxlY3RlZFdvcmtQcm9kdWN0cyA9IG5ldyBBcnJheUxpc3QoCi0JCQkJCQkJd3BUb0V4aXN0aW5nRGVzY3JpcHRvck1hcC5rZXlTZXQoKSk7Ci0JCQkJCXdvcmtQcm9kdWN0cy5yZW1vdmVBbGwoc2VsZWN0ZWRXb3JrUHJvZHVjdHMpOwotCQkJCQkKLQkJCQkJZmluYWwgTGlzdCBmaW5hbFNlbGVjdGVkV3BzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQlpZiAoIXdvcmtQcm9kdWN0cy5pc0VtcHR5KCkpIHsKLQkJCQkJCWZpbmFsIExpc3QgZmluYWxXcHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCQlmaW5hbFdwcy5hZGRBbGwod29ya1Byb2R1Y3RzKTsKLQkJCQkJCWZpbmFsIFJvbGUgZmluYWxSb2xlID0gcm9sZTsKLQkJCQkJCQotCQkJCQkJVXNlckludGVyYWN0aW9uSGVscGVyLmdldFVJSGVscGVyKCkucnVuU2FmZWx5KG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJCUxpc3Qgc2VsZWN0ZWQgPSBVc2VySW50ZXJhY3Rpb25IZWxwZXIKLQkJCQkJCQkJCQkuc2VsZWN0V29ya1Byb2R1Y3RzKGZpbmFsV3BzLCBmaW5hbFJvbGUpOwotCQkJCQkJCQlpZiAoc2VsZWN0ZWQgIT0gbnVsbCkgewotCQkJCQkJCQkJZmluYWxTZWxlY3RlZFdwcy5hZGRBbGwoc2VsZWN0ZWQpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfSwgdHJ1ZSk7Ci0JCQkJCX0KLQotCQkJCQlzZWxlY3RlZFdvcmtQcm9kdWN0cy5hZGRBbGwoZmluYWxTZWxlY3RlZFdwcyk7Ci0JCQkJCWlmICghc2VsZWN0ZWRXb3JrUHJvZHVjdHMuaXNFbXB0eSgpKSB7Ci0JCQkJCQlIYXNoU2V0IGFsbFNlbGVjdGVkVGFza3MgPSBuZXcgSGFzaFNldCgpOwotCi0JCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IHNlbGVjdGVkV29ya1Byb2R1Y3RzLnNpemUoKTsgaisrKSB7Ci0JCQkJCQkJV29ya1Byb2R1Y3Qgd3AgPSAoV29ya1Byb2R1Y3QpIHNlbGVjdGVkV29ya1Byb2R1Y3RzCi0JCQkJCQkJCQkuZ2V0KGopOwotCi0JCQkJCQkJaWYgKFRuZ1V0aWwuaXNDb250cmlidXRvcih3cCkpIHsKLQkJCQkJCQkJd3AgPSAoV29ya1Byb2R1Y3QpIFRuZ1V0aWwuZ2V0QmFzZSh3cCk7Ci0JCQkJCQkJfQotCQkJCQkJCVdvcmtQcm9kdWN0RGVzY3JpcHRvciB3cERlc2MgPSAoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSB3cFRvRXhpc3RpbmdEZXNjcmlwdG9yTWFwLmdldCh3cCk7Ci0JCQkJCQkJaWYgKHdwRGVzYyA9PSBudWxsKSB7Ci0JCQkJCQkJCXdwRGVzYyA9IChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIFByb2Nlc3NDb21tYW5kVXRpbAotCQkJCQkJCQkJCS5nZXREZXNjcmlwdG9yKHdwLCBhY3Rpdml0eSwgY29uZmlnKTsKLQkJCQkJCQl9Ci0JCQkJCQkJaWYgKHdwRGVzYyA9PSBudWxsKSB7Ci0JCQkJCQkJCXdwRGVzYyA9IFByb2Nlc3NDb21tYW5kVXRpbAotCQkJCQkJCQkJCS5jcmVhdGVXb3JrUHJvZHVjdERlc2NyaXB0b3Iod3AsCi0JCQkJCQkJCQkJCQljb25maWcsCi0JCQkJCQkJCQkJCQl3cERlc2NUb0RlbGl2ZXJhYmxlUGFydHMpOwotCQkJCQkJCQl3cERlc2NMaXN0LmFkZCh3cERlc2MpOwotCi0JCQkJCQkJCS8vIGF1dG9tYXRpYyBhZGRpbmcgdG8gdGhlIGV4aXN0aW5nIGRlbGl2ZXJhYmxlCi0JCQkJCQkJCS8vIGRlc2NyaXB0b3IgaW4gdGhlIGFjdGl2aXR5J3Mgc2NvcGUgaWYgdGhlcmUKLQkJCQkJCQkJLy8gaXMKLQkJCQkJCQkJLy8gYW55Ci0JCQkJCQkJCS8vIHZhbGlkIG9uZS4KLQkJCQkJCQkJLy8KLQkJCQkJCQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBVc2VySW50ZXJhY3Rpb25IZWxwZXIKLQkJCQkJCQkJCQkuZ2V0RGVsaXZlcmFibGUoYWN0aXZpdHksIHdwKTsKLQkJCQkJCQkJaWYgKGRlc2NyaXB0b3IgIT0gbnVsbCkgewotCQkJCQkJCQkJd3BkVG9EZWxpdmVyYWJsZURlc2NyaXB0b3JNYXAucHV0KHdwRGVzYywKLQkJCQkJCQkJCQkJZGVzY3JpcHRvcik7Ci0JCQkJCQkJCX0KLQotCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCWlmIChkZXNjcmlwdG9yc1RvUmVmcmVzaCAhPSBudWxsCi0JCQkJCQkJCQkJJiYgd3BEZXNjLmdldElzU3luY2hyb25pemVkV2l0aFNvdXJjZSgpCi0JCQkJCQkJCQkJCQkuYm9vbGVhblZhbHVlKCkpIHsKLQkJCQkJCQkJCWRlc2NyaXB0b3JzVG9SZWZyZXNoLmFkZCh3cERlc2MpOwotCQkJCQkJCQl9Ci0JCQkJCQkJCWlmICh3cCBpbnN0YW5jZW9mIERlbGl2ZXJhYmxlCi0JCQkJCQkJCQkJJiYgc3luY2hGZWF0dXJlcwotCQkJCQkJCQkJCQkJLmNvbnRhaW5zKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJCQkJCS5nZXREZWxpdmVyYWJsZV9EZWxpdmVyZWRXb3JrUHJvZHVjdHMoKSkpIHsKLQkJCQkJCQkJCVByb2Nlc3NDb21tYW5kVXRpbC5jcmVhdGVEZWxpdmVyYWJsZVBhcnRzKAotCQkJCQkJCQkJCQl3cERlc2MsIChEZWxpdmVyYWJsZSkgd3AsIGNvbmZpZywKLQkJCQkJCQkJCQkJd3BEZXNjVG9EZWxpdmVyYWJsZVBhcnRzLAotCQkJCQkJCQkJCQlkZXNjcmlwdG9yc1RvUmVmcmVzaCk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0KLQkJCQkJCQkvLyBnZXQgYWxsIHBvc3NpYmxlIHRhc2tzIGZvciB0aGlzIHdvcmtwcm9kdWN0IGZvcgotCQkJCQkJCS8vIHdoaWNoIHRhc2sgZGVzY3JpcHRvciBuZWVkcyB0byBiZSBjcmVhdGVkCi0JCQkJCQkJTGlzdCB0YXNrcyA9IFByb2Nlc3NVdGlsLmdldFRhc2tzRm9yV29ya1Byb2R1Y3Qod3AsCi0JCQkJCQkJCQljb25maWcpOwotCi0JCQkJCQkJaWYgKCh0YXNrcyAhPSBudWxsKSAmJiAodGFza3Muc2l6ZSgpID4gMCkpIHsKLQkJCQkJCQkJLy8gZXhjbHVkZSBhbnkgdGFzayB0aGF0IGlzIGFscmVhZHkgc2VsZWN0ZWQgb3IgYWxyZWFkeSBleGlzdHMgaW4gYWN0aXZpdHkKLQkJCQkJCQkJLy8KLQkJCQkJCQkJdGFza3MucmVtb3ZlQWxsKGFsbFNlbGVjdGVkVGFza3MpOwotCQkJCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB0YXNrcy5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCQkJCVRhc2sgdGFzayA9IChUYXNrKSBpdGVyLm5leHQoKTsKLQkJCQkJCQkJCU9iamVjdCB0ZCA9IFByb2Nlc3NVdGlsLmdldFRhc2tEZXNjcmlwdG9yKHRhc2tEZXNjTGlzdCwgdGFzayk7IAotCQkJCQkJCQkJaWYodGQgPT0gbnVsbCkgewotCQkJCQkJCQkJCXRkID0gUHJvY2Vzc0NvbW1hbmRVdGlsLmdldERlc2NyaXB0b3IodGFzaywgYWN0aXZpdHksIGNvbmZpZyk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCQlpZih0ZCAhPSBudWxsKSB7Ci0JCQkJCQkJCQkJaXRlci5yZW1vdmUoKTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCi0JCQkJCQkJCWlmICghdGFza3MuaXNFbXB0eSgpKSB7Ci0JCQkJCQkJCQlmaW5hbCBMaXN0IGZpbmFsVGFza3MgPSB0YXNrczsKLQkJCQkJCQkJCWZpbmFsIFdvcmtQcm9kdWN0IGZpbmFsV3AgPSB3cDsKLQkJCQkJCQkJCWZpbmFsIExpc3QgZmluYWxTZWxlY3RlZCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJCQkJCUxpc3Qgc2VsZWN0ZWRUYXNrcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJCQkJCS8vIHNob3cgdGFzayBzZWxlY3Rpb25zIGRpYWxvZwotCQkJCQkJCQkJVXNlckludGVyYWN0aW9uSGVscGVyLmdldFVJSGVscGVyKCkucnVuU2FmZWx5KG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJCQkJCUxpc3Qgc2VsZWN0ZWQgPSBVc2VySW50ZXJhY3Rpb25IZWxwZXIKLQkJCQkJCQkJCQkJLnNlbGVjdFRhc2tzKGZpbmFsVGFza3MsIGZpbmFsV3ApOwotCQkJCQkJCQkJCQlmaW5hbFNlbGVjdGVkLmFkZEFsbChzZWxlY3RlZCk7Ci0JCQkJCQkJCQkJfQotCQkJCQkJCQkJfSwgdHJ1ZSk7Ci0JCQkJCQkJCQlzZWxlY3RlZFRhc2tzLmFkZEFsbChmaW5hbFNlbGVjdGVkKTsKLQkJCQkJCQkJCWlmICgoc2VsZWN0ZWRUYXNrcyAhPSBudWxsKQotCQkJCQkJCQkJCQkmJiAoKCFzZWxlY3RlZFRhc2tzLmlzRW1wdHkoKSkpKSB7Ci0JCQkJCQkJCQkJYWxsU2VsZWN0ZWRUYXNrcy5hZGRBbGwoc2VsZWN0ZWRUYXNrcyk7Ci0JCQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQkJCS8vIElmIG5vIHRhc2tzIGFyZSBzZWxlY3RlZCwgYWRkCi0JCQkJCQkJCQkJLy8gUmVzcG9uc2libGUgcm9sZSB0byB3cAotCQkJCQkJCQkJCVByb2Nlc3NDb21tYW5kVXRpbC5hZGRSZXNwb25zaWJsZVJvbGVEZXNjcmlwdG9ycygKLQkJCQkJCQkJCQkJCXdwRGVzYywgYWN0aXZpdHksIHJvbGVEZXNjTGlzdCwKLQkJCQkJCQkJCQkJCW51bGwsIGNvbmZpZyk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQkvLyBJZiB0aGVyZSBhcmUgbm8gdGFza3MgdG8gc2hvdywgYWRkCi0JCQkJCQkJCS8vIFJlc3BvbnNpYmxlIHJvbGUgdG8gd3AKLQkJCQkJCQkJUHJvY2Vzc0NvbW1hbmRVdGlsLmFkZFJlc3BvbnNpYmxlUm9sZURlc2NyaXB0b3JzKHdwRGVzYywKLQkJCQkJCQkJCQlhY3Rpdml0eSwgcm9sZURlc2NMaXN0LCBudWxsLCBjb25maWcpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQotCQkJCQkJLy8gY3JlYXRlIHRhc2sgZGVzY3JpcHRvcnMgZm9yIHRoaXMgd29ya3Byb2R1Y3QKLQkJCQkJCWlmICgoYWxsU2VsZWN0ZWRUYXNrcyAhPSBudWxsKQotCQkJCQkJCQkmJiAoIShhbGxTZWxlY3RlZFRhc2tzLmlzRW1wdHkoKSkpKSB7Ci0JCQkJCQkJZm9yIChJdGVyYXRvciBpdG9yID0gYWxsU2VsZWN0ZWRUYXNrcy5pdGVyYXRvcigpOyBpdG9yCi0JCQkJCQkJCQkuaGFzTmV4dCgpOykgewotCi0JCQkJCQkJCVRhc2sgdGFzayA9IChUYXNrKSBpdG9yLm5leHQoKTsKLQotCQkJCQkJCQkvLyBjYWxsIHRoaXMgbWV0aG9kIGV2ZW4gdGhlIGRlc2NyaXB0b3IgZm9yIHRoZQotCQkJCQkJCQkvLyBnaXZlbiB0YXNrIGFscmVhZHkgZXhpc3RzIGluIHRoaXMgYWN0aXZpdHkKLQkJCQkJCQkJLy8gdG8gYWRkIGFueSBhZGRpdGlvbmFsIHJlbGF0aW9uc2hpcHMgaW4gY2FzZQotCQkJCQkJCQkvLyBvZgotCQkJCQkJCQkvLyByZWNlbnQgY2hhbmdlIGluIHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24KLQkJCQkJCQkJLy8gb2YgdGhlIHByb2Nlc3MuCi0JCQkJCQkJCVBCU0Ryb3BDb21tYW5kCi0JCQkJCQkJCQkJLmFkZFRvRGVzY3JpcHRvckxpc3RzKAotCQkJCQkJCQkJCQkJdGFzaywKLQkJCQkJCQkJCQkJCWFjdGl2aXR5LAotCQkJCQkJCQkJCQkJdGFza0Rlc2NMaXN0LAotCQkJCQkJCQkJCQkJcm9sZURlc2NMaXN0LAotCQkJCQkJCQkJCQkJd3BEZXNjTGlzdCwKLQkJCQkJCQkJCQkJCXdwRGVzY1RvRGVsaXZlcmFibGVQYXJ0cywKLQkJCQkJCQkJCQkJCWRlc2NyaXB0b3JzVG9SZWZyZXNoLAotCQkJCQkJCQkJCQkJYmF0Y2hDb21tYW5kCi0JCQkJCQkJCQkJCQkJCS5nZXRPYmplY3RUb05ld0ZlYXR1cmVWYWx1ZXNNYXAoKSwKLQkJCQkJCQkJCQkJCWNvbmZpZywgc3luY2hyb25pemUsIHN5bmNoRmVhdHVyZXMpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCS8vIGVuc3VyZSB1bmlxdWUgbmFtZXMgZm9yIHdwIGRlc2NyaXB0b3JzCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgd3BEZXNjTGlzdC5zaXplKCk7IGkrKykgewotCQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yIHdwRGVzYyA9IChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIHdwRGVzY0xpc3QuZ2V0KGkpOwkJCQotCQkJaWYgKHdwRGVzYyAhPSBudWxsKSB7Ci0JCQkJdW5pcXVlTmFtZXNIYW5kbGVyLmVuc3VyZVVuaXF1ZSh3cERlc2MpOwkKLQkJCX0KLQkJfQotCQlyZXR1cm4gKCFyb2xlRGVzY0xpc3QuaXNFbXB0eSgpIC8vIHx8ICFyb2xlQXNzb2NpYXRpb25MaXN0LmlzRW1wdHkoKQotCQkJCXx8ICF0YXNrRGVzY0xpc3QuaXNFbXB0eSgpCi0JCQkJfHwgIXdwRGVzY0xpc3QuaXNFbXB0eSgpCi0JCQkJfHwgKHdwRGVzY1RvRGVsaXZlcmFibGVQYXJ0cyAhPSBudWxsICYmICF3cERlc2NUb0RlbGl2ZXJhYmxlUGFydHMKLQkJCQkJCS5pc0VtcHR5KCkpIHx8ICF3cGRUb0RlbGl2ZXJhYmxlRGVzY3JpcHRvck1hcC5pc0VtcHR5KCkpCi0JCQkJfHwgKGRlc2NyaXB0b3JzVG9SZWZyZXNoICE9IG51bGwgJiYgIWRlc2NyaXB0b3JzVG9SZWZyZXNoCi0JCQkJCQkuaXNFbXB0eSgpKSB8fCBiYXRjaENvbW1hbmQuY2FuRXhlY3V0ZSgpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kLkJTRHJvcENvbW1hbmQjZG9FeGVjdXRlKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkb0V4ZWN1dGUoKSB7Ci0JCXJlbW92ZU5ld0R1cGxpY2F0ZXMoKTsKLQotCQkvLyBhZGQgcm9sZSBkZXNjcmlwdG9ycyB0byBhY3Rpdml0eQotCQkvLwotCQlhY3Rpdml0eS5nZXRCcmVha2Rvd25FbGVtZW50cygpLmFkZEFsbChyb2xlRGVzY0xpc3QpOwotCi0JCWlmIChyb2xlRGVzY1RlYW1Qcm9maWxlTWFwID09IG51bGwpIHsKLQkJCS8vIHByZXBhcmUgZm9yIGF1dG9tYXRpYyBhc3NpZ25tZW50IG9mIHJvbGUgZGVzY3JpcHRvciB0byB0ZWFtCi0JCQkvLyBwcm9maWxlCi0JCQkvLwotCQkJcm9sZURlc2NUZWFtUHJvZmlsZU1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSByb2xlRGVzY0xpc3QuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJUm9sZURlc2NyaXB0b3Igcm9sZURlc2MgPSAoUm9sZURlc2NyaXB0b3IpIGl0ZXIubmV4dCgpOwotCQkJCVRlYW1Qcm9maWxlIHRlYW1Qcm9maWxlID0gVXNlckludGVyYWN0aW9uSGVscGVyLmdldFRlYW0oCi0JCQkJCQlhY3Rpdml0eSwgcm9sZURlc2MuZ2V0Um9sZSgpKTsKLQkJCQlpZiAodGVhbVByb2ZpbGUgIT0gbnVsbCkgewotCQkJCQlyb2xlRGVzY1RlYW1Qcm9maWxlTWFwLnB1dChyb2xlRGVzYywgdGVhbVByb2ZpbGUpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCS8vIGFkZCByb2xlIGRlc2NyaXB0b3JzIHRvIHRlYW0gcHJvZmlsZXMKLQkJLy8KLQkJZm9yIChNYXAuRW50cnk8Um9sZURlc2NyaXB0b3IsIFRlYW1Qcm9maWxlPiBlbnRyeSA6IHJvbGVEZXNjVGVhbVByb2ZpbGVNYXAuZW50cnlTZXQoKSkgewotCQkJVGVhbVByb2ZpbGUgdGVhbSA9IChUZWFtUHJvZmlsZSkgZW50cnkuZ2V0VmFsdWUoKTsKLQkJCXRlYW0uZ2V0VGVhbVJvbGVzKCkuYWRkKGVudHJ5LmdldEtleSgpKTsKLQkJfQotCi0JCS8vIGF1dG9tYXRpY2FsbHkgYWRkIHdvcmsgcHJvZHVjdCBkZXNjcmlwdG9yIHRvIGRlbGl2ZXJhYmxlIHBhcnQKLQkJLy8KLQkJaWYgKCF3cGRUb0RlbGl2ZXJhYmxlRGVzY3JpcHRvck1hcC5pc0VtcHR5KCkpIHsKLQkJCWZvciAoTWFwLkVudHJ5PFdvcmtQcm9kdWN0RGVzY3JpcHRvciwgV29ya1Byb2R1Y3REZXNjcmlwdG9yPiBlbnRyeSA6Ci0JCQkJd3BkVG9EZWxpdmVyYWJsZURlc2NyaXB0b3JNYXAuZW50cnlTZXQoKSkgewotCQkJCVdvcmtQcm9kdWN0RGVzY3JpcHRvciBkZWxpdmVyYWJsZSA9IChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIGVudHJ5Ci0JCQkJCQkuZ2V0VmFsdWUoKTsKLQkJCQlkZWxpdmVyYWJsZS5nZXREZWxpdmVyYWJsZVBhcnRzKCkuYWRkKGVudHJ5LmdldEtleSgpKTsKLQkJCX0KLQkJfQotCi0JCS8vIGFkZCB3b3JrIHByb2R1Y3QgZGVzY3JpcHRvcnMKLQkJLy8KLQkJYWN0aXZpdHkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5hZGRBbGwod3BEZXNjTGlzdCk7Ci0KLQkJLy8gYWRkIHRhc2sgZGVzY3JpcHRvcnMKLQkJLy8KLQkJYWN0aXZpdHkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5hZGRBbGwodGFza0Rlc2NMaXN0KTsKLQotCQkvLyBhZGQgZGVsaXZlcmFibGUgcGFydHMgdG8gdGhlIHdvcmsgcHJvZHVjdCBkZXNjcmlwdG9ycwotCQkvLwotCQlpZiAoIXdwRGVzY1RvRGVsaXZlcmFibGVQYXJ0cy5pc0VtcHR5KCkpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHdwRGVzY1RvRGVsaXZlcmFibGVQYXJ0cy5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQlNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBpdGVyLm5leHQoKTsKLQkJCQlXb3JrUHJvZHVjdERlc2NyaXB0b3Igd3BEZXNjID0gKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgZW50cnkKLQkJCQkJCS5nZXRLZXkoKTsKLQkJCQl3cERlc2MuZ2V0RGVsaXZlcmFibGVQYXJ0cygpLmFkZEFsbCgKLQkJCQkJCShDb2xsZWN0aW9uKSBlbnRyeS5nZXRWYWx1ZSgpKTsKLQkJCX0KLQkJfQotCi0JCS8vIGFkZCBuZXcgZGVzY3JpcHRvcnMgdG8gYWN0aXZpdHkncyBwYWNrYWdlCi0JCS8vCi0JCVByb2Nlc3NQYWNrYWdlIHBrZyA9IChQcm9jZXNzUGFja2FnZSkgYWN0aXZpdHkuZUNvbnRhaW5lcigpOwotCQlpZiAocGtnICE9IG51bGwpIHsKLQkJCXBrZy5nZXRQcm9jZXNzRWxlbWVudHMoKS5hZGRBbGwodGFza0Rlc2NMaXN0KTsKLQkJCXBrZy5nZXRQcm9jZXNzRWxlbWVudHMoKS5hZGRBbGwocm9sZURlc2NMaXN0KTsKLQkJCXBrZy5nZXRQcm9jZXNzRWxlbWVudHMoKS5hZGRBbGwod3BEZXNjTGlzdCk7Ci0KLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHdwRGVzY1RvRGVsaXZlcmFibGVQYXJ0cy52YWx1ZXMoKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJcGtnLmdldFByb2Nlc3NFbGVtZW50cygpLmFkZEFsbCgoQ29sbGVjdGlvbikgaXRlci5uZXh0KCkpOwotCQkJfQotCQl9Ci0KLQkJLy8gZ2V0TW9kaWZpZWRSZXNvdXJjZXMoKS5hZGQoYWN0aXZpdHkuZVJlc291cmNlKCkpOwotCi0JfQotCi0JLyoqCi0JICogUmVtb3ZlcyBuZXcgZWxlbWVudHMgdGhhdCBhcmUgZHVwbGljYXRlIGIvYyB0aGV5IGFyZSBjcmVhdGVkIGJ5IHRoZQotCSAqIHByZXZpb3VzIFdCU0Ryb3BDb21tYW5kCi0JICovCi0JcHJpdmF0ZSB2b2lkIHJlbW92ZU5ld0R1cGxpY2F0ZXMoKSB7Ci0JCWlmIChzeW5jaHJvbml6ZSkgewotCQkJaWYgKCFuZXdEdXBsaWNhdGVzUmVtb3ZlZCkgewotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHdwRGVzY0xpc3QuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCVdvcmtQcm9kdWN0RGVzY3JpcHRvciB3cGQgPSAoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBpdGVyCi0JCQkJCQkJLm5leHQoKTsKLQkJCQkJT2JqZWN0IGRlc2MgPSBQcm9jZXNzQ29tbWFuZFV0aWwuZ2V0RGVzY3JpcHRvcih3cGQKLQkJCQkJCQkuZ2V0V29ya1Byb2R1Y3QoKSwgYWN0aXZpdHksCi0JCQkJCQkJZ2V0TWV0aG9kQ29uZmlndXJhdGlvbigpKTsKLQkJCQkJaWYgKGRlc2MgIT0gbnVsbCkgewotCQkJCQkJaXRlci5yZW1vdmUoKTsKLQkJCQkJCWlmICh3cERlc2NUb0RlbGl2ZXJhYmxlUGFydHMgIT0gbnVsbCkgewotCQkJCQkJCXdwRGVzY1RvRGVsaXZlcmFibGVQYXJ0cy5yZW1vdmUod3BkKTsKLQkJCQkJCX0KLQkJCQkJCWlmICh3cGRUb1Rhc2tGZWF0dXJlc01hcCAhPSBudWxsKSB7Ci0JCQkJCQkJd3BkVG9UYXNrRmVhdHVyZXNNYXAucmVtb3ZlKHdwZCk7Ci0JCQkJCQl9Ci0JCQkJCQlpZiAod3BkVG9EZWxpdmVyYWJsZURlc2NyaXB0b3JNYXAgIT0gbnVsbCkgewotCQkJCQkJCXdwZFRvRGVsaXZlcmFibGVEZXNjcmlwdG9yTWFwLnJlbW92ZSh3cGQpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCW5ld0R1cGxpY2F0ZXNSZW1vdmVkID0gdHJ1ZTsKLQkJCX0KLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kLkJTRHJvcENvbW1hbmQjZG9VbmRvKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkb1VuZG8oKSB7Ci0JCS8vIHJlbW92ZSByb2xlIGRlc2NyaXB0b3JzIGZyb20gYWN0aXZpdHkKLQkJLy8KLQkJYWN0aXZpdHkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5yZW1vdmVBbGwocm9sZURlc2NMaXN0KTsKLQotCQkvLyByZW1vdmUgcm9sZSBkZXNjcmlwdG9ycyBmcm9tIHRlYW0gcHJvZmlsZXMKLQkJLy8KLQkJZm9yIChJdGVyYXRvciBpdGVyID0gcm9sZURlc2NUZWFtUHJvZmlsZU1hcC5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkuaGFzTmV4dCgpOykgewotCQkJTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSkgaXRlci5uZXh0KCk7Ci0JCQlUZWFtUHJvZmlsZSB0ZWFtID0gKFRlYW1Qcm9maWxlKSBlbnRyeS5nZXRWYWx1ZSgpOwotCQkJdGVhbS5nZXRUZWFtUm9sZXMoKS5yZW1vdmUoZW50cnkuZ2V0S2V5KCkpOwotCQl9Ci0KLQkJLy8gcmVtb3ZlIHdvcmsgcHJvZHVjdCBkZXNjcmlwdG9ycwotCQkvLwotCQlhY3Rpdml0eS5nZXRCcmVha2Rvd25FbGVtZW50cygpLnJlbW92ZUFsbCh3cERlc2NMaXN0KTsKLQotCQkvLyByZW1vdmUgdGFzayBkZXNjcmlwdG9ycwotCQkvLwotCQlhY3Rpdml0eS5nZXRCcmVha2Rvd25FbGVtZW50cygpLnJlbW92ZUFsbCh0YXNrRGVzY0xpc3QpOwotCi0JCS8vIC8vIGRpc2Fzc29jaWF0ZSBuZXcgd29yayBwcm9kdWN0IGRlc2NyaXB0b3JzIHdpdGggdGFzayBkZXNjcmlwdG9ycwotCQkvLyAvLwotCQkvLyBpZih3cGRUb1Rhc2tGZWF0dXJlc01hcCAhPSBudWxsKSB7Ci0JCS8vIGZvciAoSXRlcmF0b3IgaXRlciA9IHdwZFRvVGFza0ZlYXR1cmVzTWFwLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsKLQkJLy8gaXRlci5oYXNOZXh0KCk7KSB7Ci0JCS8vIE1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIGl0ZXIubmV4dCgpOwotCQkvLyBNYXAgdGFza0ZlYXR1cmVzID0gKE1hcCkgZW50cnkuZ2V0VmFsdWUoKTsKLQkJLy8gZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IHRhc2tGZWF0dXJlcy5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yCi0JCS8vIC5oYXNOZXh0KCk7KSB7Ci0JCS8vIE1hcC5FbnRyeSBlbnQgPSAoTWFwLkVudHJ5KSBpdGVyYXRvci5uZXh0KCk7Ci0JCS8vIFRhc2tEZXNjcmlwdG9yIHRhc2tEZXNjID0gKFRhc2tEZXNjcmlwdG9yKQotCQkvLyBQcm9jZXNzQ29tbWFuZFV0aWwuZ2V0RGVzY3JpcHRvcihlbnQuZ2V0S2V5KCksIGFjdGl2aXR5LAotCQkvLyBnZXRNZXRob2RDb25maWd1cmF0aW9uKCkpOwotCQkvLyBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yMSA9ICgoQ29sbGVjdGlvbillbnQuZ2V0VmFsdWUoKSkuaXRlcmF0b3IoKTsKLQkJLy8gaXRlcmF0b3IxCi0JCS8vIC5oYXNOZXh0KCk7KSB7Ci0JCS8vIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmID0gKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgaXRlcmF0b3IxLm5leHQoKTsKLQkJLy8gRVN0cnVjdHVyYWxGZWF0dXJlIGRlc2NGZWF0dXJlID0gKEVTdHJ1Y3R1cmFsRmVhdHVyZSkKLQkJLy8gRkVBVFVSRV9NQVAuZ2V0KGYpOwotCQkvLyBpZihkZXNjRmVhdHVyZS5pc01hbnkoKSkgewotCQkvLyAoKExpc3QpdGFza0Rlc2MuZUdldChkZXNjRmVhdHVyZSkpLnJlbW92ZShlbnRyeS5nZXRLZXkoKSk7Ci0JCS8vIH0KLQkJLy8gZWxzZSB7Ci0JCS8vIHRhc2tEZXNjLmVTZXQoZGVzY0ZlYXR1cmUsIG51bGwpOwotCQkvLyB9Ci0JCS8vIH0KLQkJLy8gfQotCQkvLyB9Ci0JCS8vIH0KLQotCQkvLyByZW1vdmUgZGVsaXZlcmFibGUgcGFydHMgdG8gdGhlIHdvcmsgcHJvZHVjdCBkZXNjcmlwdG9ycwotCQkvLwotCQlpZiAoIXdwRGVzY1RvRGVsaXZlcmFibGVQYXJ0cy5pc0VtcHR5KCkpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHdwRGVzY1RvRGVsaXZlcmFibGVQYXJ0cy5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQlNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBpdGVyLm5leHQoKTsKLQkJCQlXb3JrUHJvZHVjdERlc2NyaXB0b3Igd3BEZXNjID0gKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgZW50cnkKLQkJCQkJCS5nZXRLZXkoKTsKLQkJCQl3cERlc2MuZ2V0RGVsaXZlcmFibGVQYXJ0cygpLnJlbW92ZUFsbCgKLQkJCQkJCShDb2xsZWN0aW9uKSBlbnRyeS5nZXRWYWx1ZSgpKTsKLQkJCX0KLQkJfQotCi0JCS8vIHJlbW92ZSB3b3JrIHByb2R1Y3QgZGVzY3JpcHRvciBmcm9tIGRlbGl2ZXJhYmxlIHBhcnQKLQkJLy8KLQkJaWYgKCF3cGRUb0RlbGl2ZXJhYmxlRGVzY3JpcHRvck1hcC5pc0VtcHR5KCkpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHdwZFRvRGVsaXZlcmFibGVEZXNjcmlwdG9yTWFwLmVudHJ5U2V0KCkKLQkJCQkJLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCU1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIGl0ZXIubmV4dCgpOwotCQkJCVdvcmtQcm9kdWN0RGVzY3JpcHRvciBkZWxpdmVyYWJsZSA9IChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIGVudHJ5Ci0JCQkJCQkuZ2V0VmFsdWUoKTsKLQkJCQlkZWxpdmVyYWJsZS5nZXREZWxpdmVyYWJsZVBhcnRzKCkucmVtb3ZlKGVudHJ5LmdldEtleSgpKTsKLQkJCX0KLQkJfQotCi0JCS8vIHJlbW92ZSByb2xlIGRlc2NyaXB0b3JzIGZyb20gYWN0aXZpdHkncyBwYWNrYWdlCi0JCS8vCi0JCVByb2Nlc3NQYWNrYWdlIHBrZyA9IChQcm9jZXNzUGFja2FnZSkgYWN0aXZpdHkuZUNvbnRhaW5lcigpOwotCQlpZiAocGtnICE9IG51bGwpIHsKLQkJCXBrZy5nZXRQcm9jZXNzRWxlbWVudHMoKS5yZW1vdmVBbGwodGFza0Rlc2NMaXN0KTsKLQkJCXBrZy5nZXRQcm9jZXNzRWxlbWVudHMoKS5yZW1vdmVBbGwocm9sZURlc2NMaXN0KTsKLQkJCXBrZy5nZXRQcm9jZXNzRWxlbWVudHMoKS5yZW1vdmVBbGwod3BEZXNjTGlzdCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB3cERlc2NUb0RlbGl2ZXJhYmxlUGFydHMudmFsdWVzKCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCXBrZy5nZXRQcm9jZXNzRWxlbWVudHMoKS5yZW1vdmVBbGwoKENvbGxlY3Rpb24pIGl0ZXIubmV4dCgpKTsKLQkJCX0KLQkJfQotCX0KLQotCS8vIC8qKgotCS8vICogR2V0IHRhc2sgZGVzY3JpcHRvcnMgbWFwIGZvciBhbiBhY3Rpdml0eQotCS8vICogQHBhcmFtIGFjdGl2aXR5Ci0JLy8gKiBAcmV0dXJuCi0JLy8gKi8KLQkvLyBwcml2YXRlIHN0YXRpYyBIYXNoTWFwIGdldFRhc2tzTWFwRm9yQWN0aXZpdHkoQWN0aXZpdHkgYWN0aXZpdHkpCi0JLy8gewotCS8vIExpc3QgZWxlbWVudHMgPSBhY3Rpdml0eS5nZXRCcmVha2Rvd25FbGVtZW50cygpOwotCS8vIEhhc2hNYXAgbWFwID0gbmV3IEhhc2hNYXAoKTsKLQkvLyBmb3IgKGludCBpPTA7IGkgPCBlbGVtZW50cy5zaXplKCk7IGkrKykKLQkvLyB7Ci0JLy8gT2JqZWN0IG9iaiA9IGVsZW1lbnRzLmdldChpKTsKLQkvLyBpZiAob2JqIGluc3RhbmNlb2YgVGFza0Rlc2NyaXB0b3IpCi0JLy8gewotCS8vIFRhc2tEZXNjcmlwdG9yIHRhc2tEZXNjID0gKFRhc2tEZXNjcmlwdG9yKSBvYmo7Ci0JLy8gVGFzayB0YXNrID0gdGFza0Rlc2MuZ2V0VGFzaygpOwotCS8vIGlmICh0YXNrICE9IG51bGwpCi0JLy8gewotCS8vIG1hcC5wdXQodGFzaywgdGFza0Rlc2MpOwotCS8vIH0KLQkvLyB9Ci0JLy8gfQotCS8vIHJldHVybiBtYXA7Ci0JLy8gfQotCS8vCQotCS8vCQotCS8vIC8qKgotCS8vICogU2hvdyBSb2xlQXNzb2NpYXRpb24gRGlhbG9nCi0JLy8gKiBAcGFyYW0gdGFza3MKLQkvLyAqLwotCS8vIHByaXZhdGUgc3RhdGljIGludCBzaG93Um9sZUFzc29jaWF0aW9uRGlhbG9nKFRhc2sgdGFzaykKLQkvLyB7Ci0JLy8JCQotCS8vIFJvbGVBc3NvY2lhdGlvbkRpYWxvZyByb2xlQXNzb2MgPSBuZXcKLQkvLyBSb2xlQXNzb2NpYXRpb25EaWFsb2coRGlzcGxheS5nZXRDdXJyZW50KCkuZ2V0QWN0aXZlU2hlbGwoKSwgdGFzayk7Ci0JLy8gcm9sZUFzc29jLm9wZW4oKTsKLQkvLwkJCi0JLy8gLy8gc2VsZWN0ZWQgdGFza3M7Ci0JLy8gcmV0dXJuIHJvbGVBc3NvYy5nZXRSb2xlQXNzb2NpYXRpb24oKTsKLQkvLyB9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5BYnN0cmFjdENvbW1hbmQjZ2V0QWZmZWN0ZWRPYmplY3RzKCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRBZmZlY3RlZE9iamVjdHMoKSB7Ci0JCWlmIChyb2xlRGVzY0xpc3QgIT0gbnVsbCkgewotCQkJcmV0dXJuIHJvbGVEZXNjTGlzdDsKLQkJfQotCi0JCXJldHVybiBzdXBlci5nZXRBZmZlY3RlZE9iamVjdHMoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kLkJTRHJvcENvbW1hbmQjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJaWYgKHJvbGVEZXNjTGlzdCAhPSBudWxsKSB7Ci0JCQlyb2xlRGVzY0xpc3QuY2xlYXIoKTsKLQkJfQotCQlpZiAocm9sZURlc2NUZWFtUHJvZmlsZU1hcCAhPSBudWxsKSB7Ci0JCQlyb2xlRGVzY1RlYW1Qcm9maWxlTWFwLmNsZWFyKCk7Ci0JCX0KLQkJaWYgKHdwRGVzY0xpc3QgIT0gbnVsbCkgewotCQkJd3BEZXNjTGlzdC5jbGVhcigpOwotCQl9Ci0JCWlmICh3cERlc2NUb0RlbGl2ZXJhYmxlUGFydHMgIT0gbnVsbCkgewotCQkJd3BEZXNjVG9EZWxpdmVyYWJsZVBhcnRzLmNsZWFyKCk7Ci0JCX0KLQkJaWYgKHdwZFRvRGVsaXZlcmFibGVEZXNjcmlwdG9yTWFwICE9IG51bGwpIHsKLQkJCXdwZFRvRGVsaXZlcmFibGVEZXNjcmlwdG9yTWFwLmNsZWFyKCk7Ci0JCX0KLQkJaWYgKHdwZFRvVGFza0ZlYXR1cmVzTWFwICE9IG51bGwpIHsKLQkJCXdwZFRvVGFza0ZlYXR1cmVzTWFwLmNsZWFyKCk7Ci0JCX0KLQotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvUEJTRHJhZ0FuZERyb3BDb21tYW5kLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9QQlNEcmFnQW5kRHJvcENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmZjZjU2Mi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9QQlNEcmFnQW5kRHJvcENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3Q7Ci0KLS8qKgotICogRHJhZyBhbmQgZHJvcCBjb21tYW5kIGZvciBkcm9wcGluZyB3b3JrIHByb2R1Y3RzIGludG8gV1AgVXNhZ2Ugc3RydWN0dXJlCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUEJTRHJhZ0FuZERyb3BDb21tYW5kIGV4dGVuZHMgQlNEcmFnQW5kRHJvcENvbW1hbmQgewotCi0JLyoqCi0JICogQHBhcmFtIGRvbWFpbgotCSAqIEBwYXJhbSBvd25lcgotCSAqIEBwYXJhbSBsb2NhdGlvbgotCSAqIEBwYXJhbSBvcGVyYXRpb25zCi0JICogQHBhcmFtIG9wZXJhdGlvbgotCSAqIEBwYXJhbSBjb2xsZWN0aW9uCi0JICovCi0JcHVibGljIFBCU0RyYWdBbmREcm9wQ29tbWFuZChFZGl0aW5nRG9tYWluIGRvbWFpbiwgT2JqZWN0IG93bmVyLAotCQkJZmxvYXQgbG9jYXRpb24sIGludCBvcGVyYXRpb25zLCBpbnQgb3BlcmF0aW9uLCBDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoZG9tYWluLCBvd25lciwgbG9jYXRpb24sIG9wZXJhdGlvbnMsIG9wZXJhdGlvbiwgY29sbGVjdGlvbik7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQuQlNEcmFnQW5kRHJvcENvbW1hbmQjYWNjZXB0KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0KE9iamVjdCBvYmopIHsKLQkJb2JqID0gVG5nVXRpbC51bndyYXAob2JqKTsKLQotCQlpZihvYmogaW5zdGFuY2VvZiBXb3JrUHJvZHVjdCkgewotCQkJaWYob3duZXIgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCXJldHVybiB0cnVlOwotLy8JCQkJcmV0dXJuIFByb2Nlc3NDb21tYW5kVXRpbC5nZXRWYWxpZERlc2NyaXB0b3Iob2JqLCAoQWN0aXZpdHkpIG93bmVyLAotLy8JCQkJCQkoKEFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbilkb21haW4pLmdldEFkYXB0ZXJGYWN0b3J5KCkpID09IG51bGw7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kLkJTRHJhZ0FuZERyb3BDb21tYW5kI2NyZWF0ZURyb3BDb21tYW5kKGphdmEubGFuZy5PYmplY3QsCi0JICogICAgICBqYXZhLnV0aWwuTGlzdCkKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBjcmVhdGVEcm9wQ29tbWFuZChPYmplY3Qgb3duZXIsIExpc3QgZHJvcFNyYykgewotCQlyZXR1cm4gbmV3IFBCU0Ryb3BDb21tYW5kKChBY3Rpdml0eSkgb3duZXIsIGRyb3BTcmMpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvUEJTRHJvcENvbW1hbmQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL1BCU0Ryb3BDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2ODFiMmYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvUEJTRHJvcENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQWJzdHJhY3RUcmVlSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklDb25maWd1cmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5Qcm92aWRlcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLkJhdGNoQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnVpLlVzZXJJbnRlcmFjdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuUHJvY2Vzc1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLlVuaXF1ZU5hbWVQTmFtZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFydGlmYWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc1BhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvcjsKLQotCi0vKioKLSAqIENvbW1hbmQgdG8gZHJhZyBhbmQgZHJvcCB3b3JrIHByb2R1Y3RzIHRvIFdvcmsgUHJvZHVjdCBVc2FnZSBicmVha2Rvd24KLSAqIHN0cnVjdHVyZQotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFBCU0Ryb3BDb21tYW5kIGV4dGVuZHMgQlNEcm9wQ29tbWFuZCB7Ci0JcHJpdmF0ZSBBcnJheUxpc3Qgd3BEZXNjTGlzdDsKLQotCXByaXZhdGUgQXJyYXlMaXN0IHJvbGVEZXNjTGlzdDsKLQotCXByaXZhdGUgTWFwIHdwRGVzY1RvRGVsaXZlcmFibGVQYXJ0czsKLQotCXByaXZhdGUgSGFzaE1hcDxXb3JrUHJvZHVjdERlc2NyaXB0b3IsIFdvcmtQcm9kdWN0RGVzY3JpcHRvcj4gd3BkVG9EZWxpdmVyYWJsZURlc2NyaXB0b3JNYXA7Ci0KLQlwcml2YXRlIEJhdGNoQ29tbWFuZCB1cGRhdGVEZWxpdmVyYWJsZVBhcnRzQ21kOwotCi0JcHJpdmF0ZSBib29sZWFuIG5ld0R1cGxpY2F0ZXNSZW1vdmVkOwotCi0JcHJpdmF0ZSBJQ29uZmlndXJhdG9yIGNvbmZpZ3VyYXRvcjsKLQotCXByaXZhdGUgQXJyYXlMaXN0IGxpbmtlZFRhc2tzOwotCi0JcHJpdmF0ZSBIYXNoTWFwIHdwZFRvVGFza0ZlYXR1cmVzTWFwOwotCi0JcHVibGljIFBCU0Ryb3BDb21tYW5kKEFjdGl2aXR5IGFjdGl2aXR5LCBMaXN0IHdvcmtQcm9kdWN0cykgewotCQlzdXBlcihhY3Rpdml0eSwgd29ya1Byb2R1Y3RzKTsKLQkJdGhpcy5hY3Rpdml0eSA9IGFjdGl2aXR5OwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBkcm9wRWxlbWVudHMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZWxlbWVudCA9IGl0ZXIubmV4dCgpOwotCQkJaWYgKCEoZWxlbWVudCBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0KSkgewotCQkJCWl0ZXIucmVtb3ZlKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gYWN0aXZpdHkKLQkgKiBAcGFyYW0gZHJvcEVsZW1lbnRzCi0JICogQHBhcmFtIHN5bmNoCi0JICovCi0JcHVibGljIFBCU0Ryb3BDb21tYW5kKEFjdGl2aXR5IGFjdGl2aXR5LCBMaXN0IGRyb3BFbGVtZW50cywgYm9vbGVhbiBzeW5jaCkgewotCQlzdXBlcihhY3Rpdml0eSwgZHJvcEVsZW1lbnRzLCBzeW5jaCk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGFjdGl2aXR5Ci0JICogQHBhcmFtIGRyb3BFbGVtZW50cwotCSAqIEBwYXJhbSBjb25maWcKLQkgKiBAcGFyYW0gc3luY2hGZWF0dXJlcwotCSAqLwotCXB1YmxpYyBQQlNEcm9wQ29tbWFuZChBY3Rpdml0eSBhY3Rpdml0eSwgTGlzdCBkcm9wRWxlbWVudHMsCi0JCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZywgU2V0IHN5bmNoRmVhdHVyZXMsIElDb25maWd1cmF0b3IgY29uZmlndXJhdG9yKSB7Ci0JCXN1cGVyKGFjdGl2aXR5LCBkcm9wRWxlbWVudHMsIGNvbmZpZywgc3luY2hGZWF0dXJlcyk7Ci0JCXRoaXMuY29uZmlndXJhdG9yID0gY29uZmlndXJhdG9yOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kLkJTRHJvcENvbW1hbmQjcHJlRXhlY3V0ZSgpCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gcHJlRXhlY3V0ZSgpIHsKLQkJaWYgKCFzdXBlci5wcmVFeGVjdXRlKCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJd3BEZXNjTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJdGFza0Rlc2NMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlyb2xlRGVzY0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXdwRGVzY1RvRGVsaXZlcmFibGVQYXJ0cyA9IG5ldyBIYXNoTWFwKCk7Ci0JCXdwZFRvRGVsaXZlcmFibGVEZXNjcmlwdG9yTWFwID0gbmV3IEhhc2hNYXAoKTsKLQotCQlpZighc3luY2hyb25pemUgfHwgKHN5bmNocm9uaXplICYmIHN5bmNoRmVhdHVyZXMuY29udGFpbnMoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QXJ0aWZhY3RfQ29udGFpbmVkQXJ0aWZhY3RzKCkpKSkgewotCQkJLy8gYWRkIHN1YmFydGlmYWN0cyB0byBkcm9wRWxlbWVudHMgbGlzdCBpZiB0aGVyZSBpcyBhbnkKLQkJCS8vCi0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBuZXcgQXJyYXlMaXN0KGRyb3BFbGVtZW50cykuaXRlcmF0b3IoKTsgaXRlcgotCQkJLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3QgZWxlbWVudCA9IGl0ZXIubmV4dCgpOwotCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgQXJ0aWZhY3QpIHsKLQkJCQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBuZXcgQWJzdHJhY3RUcmVlSXRlcmF0b3IoZWxlbWVudCwgZmFsc2UpIHsKLQkJCQkJCQotCQkJCQkJLyoqCi0JCQkJCQkgKiBDb21tZW50IGZvciA8Y29kZT5zZXJpYWxWZXJzaW9uVUlEPC9jb2RlPgotCQkJCQkJICovCi0JCQkJCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtNDgyMDQ3Nzg4NzQyNjA4NzI2Mkw7Ci0JCQkJCQkKLQkJCQkJCXByb3RlY3RlZCBJdGVyYXRvciBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJCQkJT2JqZWN0IHN1YkFydGlmYWN0cyA9IFByb3ZpZGVycy5nZXRDb25maWd1cmF0aW9uQXBwbGljYXRvcigpLmdldFJlZmVyZW5jZSgKLQkJCQkJCQkJCShWYXJpYWJpbGl0eUVsZW1lbnQpIG9iamVjdCwKLQkJCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEFydGlmYWN0X0NvbnRhaW5lZEFydGlmYWN0cygpLAotCQkJCQkJCQkJZ2V0TWV0aG9kQ29uZmlndXJhdGlvbigpKTsKLQkJCQkJCQlyZXR1cm4gKChDb2xsZWN0aW9uKXN1YkFydGlmYWN0cykuaXRlcmF0b3IoKTsKLQkJCQkJCX0KLQkJCQkJCQotCQkJCQl9OwotCQkJCQkKLQkJCQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCQkJQXJ0aWZhY3Qgc3ViQXJ0aWZhY3QgPSAoQXJ0aWZhY3QpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJCWlmICghZHJvcEVsZW1lbnRzLmNvbnRhaW5zKHN1YkFydGlmYWN0KSAmJiBwcmVwYXJlQWRkKChXb3JrUHJvZHVjdCkgc3ViQXJ0aWZhY3QpKSAKLQkJCQkJCXsKLQkJCQkJCQlkcm9wRWxlbWVudHMuYWRkKHN1YkFydGlmYWN0KTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gZ2V0TWV0aG9kQ29uZmlndXJhdGlvbigpOwotCQlTZXQgZGVzY3JpcHRvcnNUb1JlZnJlc2ggPSBzeW5jaHJvbml6ZSA/IGJhdGNoQ29tbWFuZC5nZXREZXNjcmlwdG9yc1RvUmVmcmVzaCgpIDogbnVsbDsKLQkJCi0JCUxpc3QgYmVzID0gYWN0aXZpdHkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKTsKLQkJVW5pcXVlTmFtZVBOYW1lSGFuZGxlciB1bmlxdWVOYW1lc0hhbmRsZXIgPSBuZXcgVW5pcXVlTmFtZVBOYW1lSGFuZGxlcihiZXMpOwotCQkKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkcm9wRWxlbWVudHMuc2l6ZSgpOyBpKyspIHsKLQkJCVdvcmtQcm9kdWN0IHdwID0gKFdvcmtQcm9kdWN0KSBkcm9wRWxlbWVudHMuZ2V0KGkpOwkJCQotCQkJaWYgKFRuZ1V0aWwuaXNDb250cmlidXRvcih3cCkpIHsKLQkJCQl3cCA9IChXb3JrUHJvZHVjdCkgVG5nVXRpbC5nZXRCYXNlKHdwKTsKLQkJCX0KLQkJCVdvcmtQcm9kdWN0RGVzY3JpcHRvciB3cERlc2MgPSBudWxsOwotCQkJaWYgKHN5bmNocm9uaXplKSB7Ci0JCQkJd3BEZXNjID0gKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgUHJvY2Vzc0NvbW1hbmRVdGlsCi0JCQkJCS5nZXREZXNjcmlwdG9yKHdwLCBhY3Rpdml0eSwgY29uZmlnKTsKLQkJCX0KLQkJCWlmICh3cERlc2MgPT0gbnVsbCkgewotCQkJCXdwRGVzYyA9IFByb2Nlc3NDb21tYW5kVXRpbC5jcmVhdGVXb3JrUHJvZHVjdERlc2NyaXB0b3Iod3AsIGNvbmZpZywKLQkJCQkJCXdwRGVzY1RvRGVsaXZlcmFibGVQYXJ0cyk7Ci0vLwkJCQl1bmlxdWVOYW1lc0hhbmRsZXIuZW5zdXJlVW5pcXVlKHdwRGVzYyk7Ci0JCQkJd3BEZXNjTGlzdC5hZGQod3BEZXNjKTsKLQotCQkJCS8vIGF1dG9tYXRpYyBhZGRpbmcgdG8gdGhlIGV4aXN0aW5nIGRlbGl2ZXJhYmxlIGRlc2NyaXB0b3IgaW4KLQkJCQkvLyB0aGUgYWN0aXZpdHkncyBzY29wZSBpZiB0aGVyZSBpcyBhbnkKLQkJCQkvLyB2YWxpZCBvbmUuCi0JCQkJLy8KLQkJCQlXb3JrUHJvZHVjdERlc2NyaXB0b3IgZGVzY3JpcHRvciA9IFVzZXJJbnRlcmFjdGlvbkhlbHBlcgotCQkJCQkJLmdldERlbGl2ZXJhYmxlKGFjdGl2aXR5LCB3cCk7Ci0JCQkJaWYgKGRlc2NyaXB0b3IgIT0gbnVsbCkgewotCQkJCQl3cGRUb0RlbGl2ZXJhYmxlRGVzY3JpcHRvck1hcC5wdXQod3BEZXNjLCBkZXNjcmlwdG9yKTsKLQkJCQl9Ci0JCQkJCi0JCQkJaWYod3BkVG9UYXNrRmVhdHVyZXNNYXAgIT0gbnVsbCkgewotCQkJCQkvLyByZXBsYWNlIHdvcmsgcHJvZHVjdCB3aXRoIGl0cyB3b3JrIHByb2R1Y3QgZGVzY3JpcHRvciBpbiB3cGRUb1Rhc2tGZWF0dXJlc01hcAotCQkJCQkvLwotCQkJCQlNYXAgZmVhdHVyZXNNYXAgPSAoTWFwKSB3cGRUb1Rhc2tGZWF0dXJlc01hcC5nZXQod3ApOwotCQkJCQlpZihmZWF0dXJlc01hcCAhPSBudWxsKSB7Ci0JCQkJCQl3cGRUb1Rhc2tGZWF0dXJlc01hcC5yZW1vdmUod3ApOwotCQkJCQkJd3BkVG9UYXNrRmVhdHVyZXNNYXAucHV0KHdwRGVzYywgZmVhdHVyZXNNYXApOwotCQkJCQl9Ci0JCQkJfQotCi0JCQl9IGVsc2UgewotCQkJCWlmIChkZXNjcmlwdG9yc1RvUmVmcmVzaCAhPSBudWxsICYmIHdwRGVzYy5nZXRJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UoKS5ib29sZWFuVmFsdWUoKSkgewotCQkJCQlkZXNjcmlwdG9yc1RvUmVmcmVzaC5hZGQod3BEZXNjKTsKLQkJCQl9Ci0JCQkJaWYgKHdwIGluc3RhbmNlb2YgRGVsaXZlcmFibGUgJiYgc3luY2hGZWF0dXJlcy5jb250YWlucyhVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXREZWxpdmVyYWJsZV9EZWxpdmVyZWRXb3JrUHJvZHVjdHMoKSkpIHsKLQkJCQkJUHJvY2Vzc0NvbW1hbmRVdGlsLmNyZWF0ZURlbGl2ZXJhYmxlUGFydHMod3BEZXNjLAotCQkJCQkJCShEZWxpdmVyYWJsZSkgd3AsIGNvbmZpZywgd3BEZXNjVG9EZWxpdmVyYWJsZVBhcnRzLCBkZXNjcmlwdG9yc1RvUmVmcmVzaCk7Ci0JCQkJfQotCQkJCQotCQkJCWlmKHdwZFRvVGFza0ZlYXR1cmVzTWFwICE9IG51bGwpIHsKLQkJCQkJd3BkVG9UYXNrRmVhdHVyZXNNYXAucmVtb3ZlKHdwKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCi0JCQlpZiAoIXN5bmNocm9uaXplKSB7Ci0JCQkJLy8gZ2V0IGFsbCBwb3NzaWJsZSB0YXNrcyBmb3IgdGhpcyB3b3JrcHJvZHVjdCBmb3IKLQkJCQkvLyB3aGljaCB0YXNrIGRlc2NyaXB0b3IgbmVlZHMgdG8gYmUgY3JlYXRlZAotCQkJCUxpc3QgdGFza3MgPSBQcm9jZXNzVXRpbC5nZXRUYXNrc0ZvcldvcmtQcm9kdWN0KHdwLCBjb25maWcpOwotCi0JCQkJaWYgKCh0YXNrcyAhPSBudWxsKSAmJiAodGFza3Muc2l6ZSgpID4gMCkpIHsKLQkJCQkJLy8gc2hvdyB0YXNrIHNlbGVjdGlvbnMgZGlhbG9nCQkKLQkJCQkJZmluYWwgTGlzdCBmaW5hbFRhc2tzID0gdGFza3M7Ci0JCQkJCWZpbmFsIFdvcmtQcm9kdWN0IGZpbmFsV3AgPSB3cDsKLQkJCQkJZmluYWwgTGlzdCBmaW5hbFNlbGVjdGVkID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQlMaXN0IHNlbGVjdGVkVGFza3MgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCS8vIHNob3cgdGFzayBzZWxlY3Rpb25zIGRpYWxvZwotCQkJCQlVc2VySW50ZXJhY3Rpb25IZWxwZXIuZ2V0VUlIZWxwZXIoKS5ydW5TYWZlbHkobmV3IFJ1bm5hYmxlKCkgewotCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCUxpc3Qgc2VsZWN0ZWQgPSBVc2VySW50ZXJhY3Rpb25IZWxwZXIuc2VsZWN0VGFza3MoCi0JCQkJCQkJCQlmaW5hbFRhc2tzLCBmaW5hbFdwKTsJCQkJCQkKLQkJCQkJCQlmaW5hbFNlbGVjdGVkLmFkZEFsbChzZWxlY3RlZCk7Ci0JCQkJCQl9Ci0JCQkJCX0sIHRydWUpOwotCQkJCQlzZWxlY3RlZFRhc2tzLmFkZEFsbChmaW5hbFNlbGVjdGVkKTsKLQkJCQkJCi0JCQkJCS8vIGNyZWF0ZSB0YXNrIGRlc2NyaXB0b3JzIGZvciB0aGlzIHdvcmtwcm9kdWN0Ci0JCQkJCWlmICgoc2VsZWN0ZWRUYXNrcyAhPSBudWxsKSAmJiAoIShzZWxlY3RlZFRhc2tzLmlzRW1wdHkoKSkpKSB7Ci0JCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IHNlbGVjdGVkVGFza3Muc2l6ZSgpOyBqKyspIHsKLQkJCQkJCQlUYXNrIHRhc2sgPSAoVGFzaykgc2VsZWN0ZWRUYXNrcy5nZXQoaik7Ci0KLQkJCQkJCQkvLyBjYWxsIHRoaXMgbWV0aG9kIGV2ZW4gdGhlIGRlc2NyaXB0b3IgZm9yIHRoZQotCQkJCQkJCS8vIGdpdmVuIHRhc2sgYWxyZWFkeSBleGlzdHMgaW4gdGhpcyBhY3Rpdml0eQotCQkJCQkJCS8vIHRvIGFkZCBhbnkgYWRkaXRpb25hbCByZWxhdGlvbnNoaXBzIGluIGNhc2Ugb2YKLQkJCQkJCQkvLyByZWNlbnQgY2hhbmdlIGluIHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24KLQkJCQkJCQkvLyBvZiB0aGUgcHJvY2Vzcy4KLQkJCQkJCQlQQlNEcm9wQ29tbWFuZC5hZGRUb0Rlc2NyaXB0b3JMaXN0cyh0YXNrLCBhY3Rpdml0eSwKLQkJCQkJCQkJCXRhc2tEZXNjTGlzdCwgcm9sZURlc2NMaXN0LCB3cERlc2NMaXN0LAotCQkJCQkJCQkJd3BEZXNjVG9EZWxpdmVyYWJsZVBhcnRzLAotCQkJCQkJCQkJZGVzY3JpcHRvcnNUb1JlZnJlc2gsCi0JCQkJCQkJCQliYXRjaENvbW1hbmQuZ2V0T2JqZWN0VG9OZXdGZWF0dXJlVmFsdWVzTWFwKCksIAotCQkJCQkJCQkJY29uZmlnLCB0cnVlLCBzeW5jaEZlYXR1cmVzKTsKLQkJCQkJCX0KLQkJCQkJfSBlbHNlIHsKLQkJCQkJCS8vIElmIG5vIHRhc2tzIGFyZSBzZWxlY3RlZCwgYWRkIFJlc3BvbnNpYmxlIHJvbGUgdG8gd3AKLQkJCQkJCVByb2Nlc3NDb21tYW5kVXRpbC5hZGRSZXNwb25zaWJsZVJvbGVEZXNjcmlwdG9ycyh3cERlc2MsIGFjdGl2aXR5LAotCQkJCQkJCQlyb2xlRGVzY0xpc3QsIGRlc2NyaXB0b3JzVG9SZWZyZXNoLCBjb25maWcpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQkvLwlJZiB0aGVyZSBhcmUgbm8gdGFza3MgdG8gc2hvdywgYWRkIFJlc3BvbnNpYmxlIHJvbGUgdG8gd3AKLQkJCQkJUHJvY2Vzc0NvbW1hbmRVdGlsLmFkZFJlc3BvbnNpYmxlUm9sZURlc2NyaXB0b3JzKHdwRGVzYywgYWN0aXZpdHksCXJvbGVEZXNjTGlzdCwgZGVzY3JpcHRvcnNUb1JlZnJlc2gsIGNvbmZpZyk7Ci0JCQkJfQotCQkJfQotLy8JCQllbHNlIHsKLS8vCQkJCS8vCWluIGNhc2Ugb2Ygc3luY2hyb25pemF0aW9uLCBhZGQgUmVzcG9uc2libGUgcm9sZSB0byB3cAotLy8JCQkJaWYgKHN5bmNoRmVhdHVyZXMuY29udGFpbnMoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Um9sZV9SZXNwb25zaWJsZUZvcigpKSkKLS8vCQkJCQlQQlNEcm9wQ29tbWFuZC5hZGRSZXNwb25zaWJsZVJvbGUod3BEZXNjLCBhY3Rpdml0eSwJcm9sZURlc2NMaXN0LCBkZXNjcmlwdG9yc1RvUmVmcmVzaCwgY29uZmlnKTsKLS8vCQkJfQkJCQkKLQkJfQotCi0JCWlmKCF3cERlc2NUb0RlbGl2ZXJhYmxlUGFydHMuaXNFbXB0eSgpKSB7Ci0JCQl1cGRhdGVEZWxpdmVyYWJsZVBhcnRzQ21kID0gbmV3IEJhdGNoQ29tbWFuZCh0cnVlKTsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHdwRGVzY1RvRGVsaXZlcmFibGVQYXJ0cy5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSkgaXRlci5uZXh0KCk7Ci0JCQkJT2JqZWN0IHdwRGVzYyA9IGVudHJ5LmdldEtleSgpOwotCQkJCXVwZGF0ZURlbGl2ZXJhYmxlUGFydHNDbWQuZ2V0T2JqZWN0VG9OZXdGZWF0dXJlVmFsdWVzTWFwKCkucHV0KHdwRGVzYywgCi0JCQkJCQlDb2xsZWN0aW9ucy5zaW5nbGV0b25NYXAoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX0RlbGl2ZXJhYmxlUGFydHMoKSwgZW50cnkuZ2V0VmFsdWUoKSkpOwotCQkJfQotCQl9Ci0JCQotCi0JCS8vIGVuc3VyZSB1bmlxdWUgbmFtZXMgZm9yIHdwIGRlc2NyaXB0b3JzCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgd3BEZXNjTGlzdC5zaXplKCk7IGkrKykgewotCQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yIHdwRGVzYyA9IChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIHdwRGVzY0xpc3QKLQkJCQkJLmdldChpKTsKLQkJCWlmICh3cERlc2MgIT0gbnVsbCkgewotCQkJCXVuaXF1ZU5hbWVzSGFuZGxlci5lbnN1cmVVbmlxdWUod3BEZXNjKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gIXRhc2tEZXNjTGlzdC5pc0VtcHR5KCkKLQkJCQl8fCAhcm9sZURlc2NMaXN0LmlzRW1wdHkoKQotCQkJCXx8ICF3cERlc2NMaXN0LmlzRW1wdHkoKQotCQkJCXx8ICh1cGRhdGVEZWxpdmVyYWJsZVBhcnRzQ21kICE9IG51bGwgJiYgdXBkYXRlRGVsaXZlcmFibGVQYXJ0c0NtZC5jYW5FeGVjdXRlKCkpCi0JCQkJfHwgIXdwZFRvRGVsaXZlcmFibGVEZXNjcmlwdG9yTWFwLmlzRW1wdHkoKQotCQkJCXx8IChkZXNjcmlwdG9yc1RvUmVmcmVzaCAhPSBudWxsICYmICFkZXNjcmlwdG9yc1RvUmVmcmVzaAotCQkJCQkJLmlzRW1wdHkoKSkKLQkJCQl8fCBiYXRjaENvbW1hbmQuY2FuRXhlY3V0ZSgpOwotCX0KLQkKLQkvKioKLQkgKiBAcGFyYW0gc3ViQXJ0aWZhY3QKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIHByZXBhcmVBZGQoV29ya1Byb2R1Y3Qgd3ApIHsKLQkJaWYgKHN5bmNocm9uaXplKSB7CQotCQkJLy8gZ2V0IGxpbmtlZCB0YXNrcyBvZiB0aGUgdGFzayBkZXNjcmlwdG9ycyBpbiB0aGUgYWN0aXZpdHkgZm9yIHRoZSBjb25maWd1cmF0aW9uCi0JCQkvLwotCQkJTGlzdCB0YXNrcyA9IGdldExpbmtlZFRhc2tzKCk7Ci0JCQkKLQkJCWlmKCF0YXNrcy5pc0VtcHR5KCkpIHsKLQkJCQkvLyBzZWxlY3Qgb25seSB3b3JrIHByb2R1Y3RzIHRoYXQgYXJlIGlucHV0IG9yIG91dHB1dCBvZiBhbiBleGlzdGluZyB0YXNrIGluIHRoZSBhY3Rpdml0eQotCQkJCS8vCQotCQkJCU1hcCBmZWF0dXJlc01hcCA9IFByb2Nlc3NDb21tYW5kVXRpbC5nZXRGZWF0dXJlc01hcCh0YXNrcywgd3AsIGdldE1ldGhvZENvbmZpZ3VyYXRpb24oKSk7Ci0JCQkJaWYoIWZlYXR1cmVzTWFwLmlzRW1wdHkoKSkgewotCQkJCQkvLyB1c2UgdGhlIHdwIHRvIHRoZSBrZXkgaW4gdGhlIG1hcCByaWdodCBub3cgYW5kIHJlcGxhY2UgaXQgd2l0aAotCQkJCQkvLyBpdHMgd29yayBwcm9kdWN0IGRlc2NyaXB0b3IgbGF0ZXIKLQkJCQkJLy8KLQkJCQkJaWYod3BkVG9UYXNrRmVhdHVyZXNNYXAgPT0gbnVsbCkgewotCQkJCQkJd3BkVG9UYXNrRmVhdHVyZXNNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQkJCQl9Ci0JCQkJCXdwZFRvVGFza0ZlYXR1cmVzTWFwLnB1dCh3cCwgZmVhdHVyZXNNYXApOwotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgTGlzdCBnZXRMaW5rZWRUYXNrcygpIHsKLQkJaWYobGlua2VkVGFza3MgPT0gbnVsbCkgewotCQkJbGlua2VkVGFza3MgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBhY3Rpdml0eS5nZXRCcmVha2Rvd25FbGVtZW50cygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBlbGVtZW50ID0gaXRlci5uZXh0KCk7Ci0JCQkJaWYoZWxlbWVudCBpbnN0YW5jZW9mIFRhc2tEZXNjcmlwdG9yKSB7Ci0JCQkJCVRhc2sgdGFzayA9ICgoVGFza0Rlc2NyaXB0b3IpZWxlbWVudCkuZ2V0VGFzaygpOwotCQkJCQlpZih0YXNrICE9IG51bGwgJiYgY29uZmlndXJhdG9yLmFjY2VwdChlbGVtZW50KSkgewotCQkJCQkJbGlua2VkVGFza3MuYWRkKHRhc2spOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBsaW5rZWRUYXNrczsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmVzIG5ldyBlbGVtZW50cyB0aGF0IGFyZSBkdXBsaWNhdGUgYi9jIHRoZXkgYXJlIGNyZWF0ZWQgYnkgdGhlIHByZXZpb3VzIFdCU0Ryb3BDb21tYW5kCi0JICovCi0JcHJpdmF0ZSB2b2lkIHJlbW92ZU5ld0R1cGxpY2F0ZXMoKSB7Ci0JCWlmKHN5bmNocm9uaXplKSB7Ci0JCQlpZighbmV3RHVwbGljYXRlc1JlbW92ZWQpIHsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSByb2xlRGVzY0xpc3QuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCVJvbGVEZXNjcmlwdG9yIHJvbGVEZXNjID0gKFJvbGVEZXNjcmlwdG9yKSBpdGVyLm5leHQoKTsKLQkJCQkJT2JqZWN0IGRlc2MgPSBQcm9jZXNzQ29tbWFuZFV0aWwuZ2V0RGVzY3JpcHRvcihyb2xlRGVzYy5nZXRSb2xlKCksIGFjdGl2aXR5LCBnZXRNZXRob2RDb25maWd1cmF0aW9uKCkpOwotCQkJCQlpZihkZXNjICE9IG51bGwpIHsKLQkJCQkJCWl0ZXIucmVtb3ZlKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJbmV3RHVwbGljYXRlc1JlbW92ZWQgPSB0cnVlOwkJCQotCQkJfQotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQuQlNEcm9wQ29tbWFuZCNkb0V4ZWN1dGUoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRvRXhlY3V0ZSgpIHsKLQkJcmVtb3ZlTmV3RHVwbGljYXRlcygpOwotCQkKLQkJLy8gYXV0b21hdGljYWxseSBhZGQgd29yayBwcm9kdWN0IGRlc2NyaXB0b3IgdG8gZGVsaXZlcmFibGUgcGFydAotCQkvLwotCQlpZiAoIXdwZFRvRGVsaXZlcmFibGVEZXNjcmlwdG9yTWFwLmlzRW1wdHkoKSkgewotCQkJZm9yIChNYXAuRW50cnk8V29ya1Byb2R1Y3REZXNjcmlwdG9yLCBXb3JrUHJvZHVjdERlc2NyaXB0b3I+IGVudHJ5IDogCi0JCQkJd3BkVG9EZWxpdmVyYWJsZURlc2NyaXB0b3JNYXAuZW50cnlTZXQoKSkgewotCQkJCVdvcmtQcm9kdWN0RGVzY3JpcHRvciBkZWxpdmVyYWJsZSA9IChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIGVudHJ5Ci0JCQkJCQkuZ2V0VmFsdWUoKTsKLQkJCQlkZWxpdmVyYWJsZS5nZXREZWxpdmVyYWJsZVBhcnRzKCkuYWRkKGVudHJ5LmdldEtleSgpKTsKLQkJCX0KLQkJfQotCi0JCS8vIGFkZCB3b3JrIHByb2R1Y3QgZGVzY3JpcHRvcnMKLQkJLy8KLQkJYWN0aXZpdHkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5hZGRBbGwod3BEZXNjTGlzdCk7Ci0KLQkJLy8gYWRkIHRhc2sgZGVzY3JpcHRvcnMKLQkJLy8KLQkJYWN0aXZpdHkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5hZGRBbGwodGFza0Rlc2NMaXN0KTsKLQotCQkvLyBhZGQgcm9sZSBkZXNjcmlwdG9ycwotCQkvLwotCQlhY3Rpdml0eS5nZXRCcmVha2Rvd25FbGVtZW50cygpLmFkZEFsbChyb2xlRGVzY0xpc3QpOwotCQkKLQkJLy8gYXNzb2NpYXRlIG5ldyB3b3JrIHByb2R1Y3QgZGVzY3JpcHRvcnMgd2l0aCB0YXNrIGRlc2NyaXB0b3JzCi0JCS8vCi0JCWlmKHdwZFRvVGFza0ZlYXR1cmVzTWFwICE9IG51bGwpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHdwZFRvVGFza0ZlYXR1cmVzTWFwLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSkgaXRlci5uZXh0KCk7Ci0JCQkJTWFwIHRhc2tGZWF0dXJlcyA9IChNYXApIGVudHJ5LmdldFZhbHVlKCk7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IHRhc2tGZWF0dXJlcy5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCQkJTWFwLkVudHJ5IGVudCA9IChNYXAuRW50cnkpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJVGFza0Rlc2NyaXB0b3IgdGFza0Rlc2MgPSAoVGFza0Rlc2NyaXB0b3IpIFByb2Nlc3NDb21tYW5kVXRpbC5nZXREZXNjcmlwdG9yKGVudC5nZXRLZXkoKSwgYWN0aXZpdHkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKSwgZ2V0TWV0aG9kQ29uZmlndXJhdGlvbigpLCBmYWxzZSk7Ci0JCQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IxID0gKChDb2xsZWN0aW9uKWVudC5nZXRWYWx1ZSgpKS5pdGVyYXRvcigpOyBpdGVyYXRvcjEKLQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmID0gKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgaXRlcmF0b3IxLm5leHQoKTsKLQkJCQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBkZXNjRmVhdHVyZSA9IChFU3RydWN0dXJhbEZlYXR1cmUpIEZFQVRVUkVfTUFQLmdldChmKTsKLQkJCQkJCWlmKGRlc2NGZWF0dXJlLmlzTWFueSgpKSB7Ci0JCQkJCQkJKChMaXN0KXRhc2tEZXNjLmVHZXQoZGVzY0ZlYXR1cmUpKS5hZGQoZW50cnkuZ2V0S2V5KCkpOwkJCQkJCQkKLQkJCQkJCX0KLQkJCQkJCWVsc2UgewotCQkJCQkJCS8vIFRPRE86IG5lZWQgdG8gYmFjayB1cCBvbGQgdmFsdWUgaGVyZQotCQkJCQkJCS8vCi0JCQkJCQkJdGFza0Rlc2MuZVNldChkZXNjRmVhdHVyZSwgZW50cnkuZ2V0S2V5KCkpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJLy8gYWRkIG5ldyBkZXNjcmlwdG9ycyB0byBhY3Rpdml0eSdzIHBhY2thZ2UKLQkJLy8KLQkJUHJvY2Vzc1BhY2thZ2UgcGtnID0gKFByb2Nlc3NQYWNrYWdlKSBhY3Rpdml0eS5lQ29udGFpbmVyKCk7Ci0JCWlmIChwa2cgIT0gbnVsbCkgewotCQkJcGtnLmdldFByb2Nlc3NFbGVtZW50cygpLmFkZEFsbCh0YXNrRGVzY0xpc3QpOwotCQkJcGtnLmdldFByb2Nlc3NFbGVtZW50cygpLmFkZEFsbChyb2xlRGVzY0xpc3QpOwotCQkJcGtnLmdldFByb2Nlc3NFbGVtZW50cygpLmFkZEFsbCh3cERlc2NMaXN0KTsKLQotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gd3BEZXNjVG9EZWxpdmVyYWJsZVBhcnRzLnZhbHVlcygpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQlwa2cuZ2V0UHJvY2Vzc0VsZW1lbnRzKCkuYWRkQWxsKChDb2xsZWN0aW9uKSBpdGVyLm5leHQoKSk7Ci0JCQl9Ci0JCX0KLQotLy8JCWdldE1vZGlmaWVkUmVzb3VyY2VzKCkuYWRkKGFjdGl2aXR5LmVSZXNvdXJjZSgpKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQuQlNEcm9wQ29tbWFuZCN1cGRhdGVEZXNjcmlwdG9ycygpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlRGVzY3JpcHRvcnMoKSB7Ci0JCXN1cGVyLnVwZGF0ZURlc2NyaXB0b3JzKCk7Ci0JCQotCQkvLyBhZGQgZGVsaXZlcmFibGUgcGFydHMgdG8gdGhlIHdvcmsgcHJvZHVjdCBkZXNjcmlwdG9ycwotCQkvLwotCQlpZih1cGRhdGVEZWxpdmVyYWJsZVBhcnRzQ21kICE9IG51bGwpIHsKLQkJCXVwZGF0ZURlbGl2ZXJhYmxlUGFydHNDbWQuZXhlY3V0ZSgpOwotCQl9Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kLkJTRHJvcENvbW1hbmQjdW5kb1VwZGF0ZURlc2NyaXB0b3JzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB1bmRvVXBkYXRlRGVzY3JpcHRvcnMoKSB7Ci0JCS8vIHJlbW92ZSBkZWxpdmVyYWJsZSBwYXJ0cyBvZiB0aGUgd29yayBwcm9kdWN0IGRlc2NyaXB0b3JzCi0JCS8vCi0JCWlmKHVwZGF0ZURlbGl2ZXJhYmxlUGFydHNDbWQgIT0gbnVsbCkgewotCQkJdXBkYXRlRGVsaXZlcmFibGVQYXJ0c0NtZC51bmRvKCk7Ci0JCX0KLQotCQlzdXBlci51bmRvVXBkYXRlRGVzY3JpcHRvcnMoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZC5CU0Ryb3BDb21tYW5kI2RvVW5kbygpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZG9VbmRvKCkgewotCQkvLyByZW1vdmUgd29yayBwcm9kdWN0IGRlc2NyaXB0b3JzCi0JCS8vCi0JCWFjdGl2aXR5LmdldEJyZWFrZG93bkVsZW1lbnRzKCkucmVtb3ZlQWxsKHdwRGVzY0xpc3QpOwotCi0JCS8vIHJlbW92ZSByb2xlIGRlc2NyaXB0b3JzCi0JCS8vCi0JCWFjdGl2aXR5LmdldEJyZWFrZG93bkVsZW1lbnRzKCkucmVtb3ZlQWxsKHJvbGVEZXNjTGlzdCk7Ci0KLQkJLy8gcmVtb3ZlIHRhc2sgZGVzY3JpcHRvcnMKLQkJLy8KLQkJYWN0aXZpdHkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5yZW1vdmVBbGwodGFza0Rlc2NMaXN0KTsKLQotCQkvLyByZW1vdmUgd29yayBwcm9kdWN0IGRlc2NyaXB0b3IgZnJvbSBkZWxpdmVyYWJsZSBwYXJ0Ci0JCS8vCi0JCWlmICghd3BkVG9EZWxpdmVyYWJsZURlc2NyaXB0b3JNYXAuaXNFbXB0eSgpKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB3cGRUb0RlbGl2ZXJhYmxlRGVzY3JpcHRvck1hcC5lbnRyeVNldCgpCi0JCQkJCS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBpdGVyLm5leHQoKTsKLQkJCQlXb3JrUHJvZHVjdERlc2NyaXB0b3IgZGVsaXZlcmFibGUgPSAoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBlbnRyeQotCQkJCQkJLmdldFZhbHVlKCk7Ci0JCQkJZGVsaXZlcmFibGUuZ2V0RGVsaXZlcmFibGVQYXJ0cygpLnJlbW92ZShlbnRyeS5nZXRLZXkoKSk7Ci0JCQl9Ci0JCX0KLQotCQkvLyByZW1vdmUgZGVzY3JpcHRvcnMgZnJvbSBhY3Rpdml0eSdzIHBhY2thZ2UKLQkJLy8KLQkJUHJvY2Vzc1BhY2thZ2UgcGtnID0gKFByb2Nlc3NQYWNrYWdlKSBhY3Rpdml0eS5lQ29udGFpbmVyKCk7Ci0JCWlmIChwa2cgIT0gbnVsbCkgewotCQkJcGtnLmdldFByb2Nlc3NFbGVtZW50cygpLnJlbW92ZUFsbCh0YXNrRGVzY0xpc3QpOwotCQkJcGtnLmdldFByb2Nlc3NFbGVtZW50cygpLnJlbW92ZUFsbChyb2xlRGVzY0xpc3QpOwotCQkJcGtnLmdldFByb2Nlc3NFbGVtZW50cygpLnJlbW92ZUFsbCh3cERlc2NMaXN0KTsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHdwRGVzY1RvRGVsaXZlcmFibGVQYXJ0cy52YWx1ZXMoKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJcGtnLmdldFByb2Nlc3NFbGVtZW50cygpLnJlbW92ZUFsbCgoQ29sbGVjdGlvbikgaXRlci5uZXh0KCkpOwotCQkJfQotCQl9Ci0JCQotCQkvLyBkaXNhc3NvY2lhdGUgbmV3IHdvcmsgcHJvZHVjdCBkZXNjcmlwdG9ycyB3aXRoIHRhc2sgZGVzY3JpcHRvcnMKLQkJLy8KLQkJaWYod3BkVG9UYXNrRmVhdHVyZXNNYXAgIT0gbnVsbCkgewotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gd3BkVG9UYXNrRmVhdHVyZXNNYXAuZW50cnlTZXQoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBpdGVyLm5leHQoKTsKLQkJCQlNYXAgdGFza0ZlYXR1cmVzID0gKE1hcCkgZW50cnkuZ2V0VmFsdWUoKTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gdGFza0ZlYXR1cmVzLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IKLQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCU1hcC5FbnRyeSBlbnQgPSAoTWFwLkVudHJ5KSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCVRhc2tEZXNjcmlwdG9yIHRhc2tEZXNjID0gKFRhc2tEZXNjcmlwdG9yKSBQcm9jZXNzQ29tbWFuZFV0aWwuZ2V0RGVzY3JpcHRvcihlbnQuZ2V0S2V5KCksIGFjdGl2aXR5LCBnZXRNZXRob2RDb25maWd1cmF0aW9uKCkpOwotCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yMSA9ICgoQ29sbGVjdGlvbillbnQuZ2V0VmFsdWUoKSkuaXRlcmF0b3IoKTsgaXRlcmF0b3IxCi0JCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmID0gKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgaXRlcmF0b3IxLm5leHQoKTsKLQkJCQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBkZXNjRmVhdHVyZSA9IChFU3RydWN0dXJhbEZlYXR1cmUpIEZFQVRVUkVfTUFQLmdldChmKTsKLQkJCQkJCWlmKGRlc2NGZWF0dXJlLmlzTWFueSgpKSB7Ci0JCQkJCQkJKChMaXN0KXRhc2tEZXNjLmVHZXQoZGVzY0ZlYXR1cmUpKS5yZW1vdmUoZW50cnkuZ2V0S2V5KCkpOwkJCQkJCQkKLQkJCQkJCX0KLQkJCQkJCWVsc2UgewotCQkJCQkJCXRhc2tEZXNjLmVTZXQoZGVzY0ZlYXR1cmUsIG51bGwpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQWJzdHJhY3RDb21tYW5kI2dldEFmZmVjdGVkT2JqZWN0cygpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0QWZmZWN0ZWRPYmplY3RzKCkgewotCQlpZiAod3BEZXNjTGlzdCAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gd3BEZXNjTGlzdDsKLQkJfQotCi0JCXJldHVybiBzdXBlci5nZXRBZmZlY3RlZE9iamVjdHMoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gdGFzawotCSAqIEBwYXJhbSBhY3Rpdml0eQotCSAqIEBwYXJhbSB0YXNrRGVzY0xpc3QKLQkgKiBAcGFyYW0gcm9sZURlc2NMaXN0Ci0JICogQHBhcmFtIHdwRGVzY0xpc3QKLQkgKiBAcGFyYW0gd3BEZXNjVG9EZWxpdmVyYWJsZVBhcnRzCi0JICogQHBhcmFtIGRlc2NyaXB0b3JzVG9SZWZyZXNoCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBhIG5ldyBUYXNrRGVzY3JpcHRvciBpcyBjcmVhdGVkIGZvciB0aGUKLQkgKiAgICAgICAgIGdpdmVuIHRhc2ssIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKLQkgKi8KLQlzdGF0aWMgYm9vbGVhbiBhZGRUb0Rlc2NyaXB0b3JMaXN0cyhUYXNrIHRhc2ssIEFjdGl2aXR5IGFjdGl2aXR5LAotCQkJTGlzdCB0YXNrRGVzY0xpc3QsIExpc3Qgcm9sZURlc2NMaXN0LCBMaXN0IHdwRGVzY0xpc3QsCi0JCQlNYXAgd3BEZXNjVG9EZWxpdmVyYWJsZVBhcnRzLCBTZXQgZGVzY3JpcHRvcnNUb1JlZnJlc2gsCi0JCQlNYXAgZGVzY3JpcHRvclRvTmV3RmVhdHVyZVZhbHVlc01hcCwgTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcsIGJvb2xlYW4gdXNlRXhpc3RpbmdEZXNjcmlwdG9yLCBTZXQgc3luY2hGZWF0dXJlcykgewotCQlUYXNrRGVzY3JpcHRvciBkZXNjID0gUHJvY2Vzc0NvbW1hbmRVdGlsLmNyZWF0ZVRhc2tEZXNjcmlwdG9yKHRhc2ssIGFjdGl2aXR5LAotCQkJCXJvbGVEZXNjTGlzdCwgd3BEZXNjTGlzdCwgd3BEZXNjVG9EZWxpdmVyYWJsZVBhcnRzLCBudWxsLAotCQkJCWRlc2NyaXB0b3JzVG9SZWZyZXNoLCBkZXNjcmlwdG9yVG9OZXdGZWF0dXJlVmFsdWVzTWFwLCAKLQkJCQljb25maWcsIHVzZUV4aXN0aW5nRGVzY3JpcHRvciwgc3luY2hGZWF0dXJlcyk7Ci0JCWlmICgoZGVzYyAhPSBudWxsKSAmJiAodGFza0Rlc2NMaXN0ICE9IG51bGwpCi0JCQkJJiYgIXRhc2tEZXNjTGlzdC5jb250YWlucyhkZXNjKSkgewotCQkJdGFza0Rlc2NMaXN0LmFkZChkZXNjKTsKLQkJfQotCQlyZXR1cm4gZGVzYyAhPSBudWxsOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kLkJTRHJvcENvbW1hbmQjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJaWYocm9sZURlc2NMaXN0ICE9IG51bGwpIHsKLQkJCXJvbGVEZXNjTGlzdC5jbGVhcigpOwotCQl9Ci0JCWlmKHdwRGVzY0xpc3QgIT0gbnVsbCkgewotCQkJd3BEZXNjTGlzdC5jbGVhcigpOwotCQl9Ci0JCWlmKHdwRGVzY1RvRGVsaXZlcmFibGVQYXJ0cyAhPSBudWxsKSB7Ci0JCQl3cERlc2NUb0RlbGl2ZXJhYmxlUGFydHMuY2xlYXIoKTsKLQkJfQotCQlpZih3cGRUb0RlbGl2ZXJhYmxlRGVzY3JpcHRvck1hcCAhPSBudWxsKSB7Ci0JCQl3cGRUb0RlbGl2ZXJhYmxlRGVzY3JpcHRvck1hcC5jbGVhcigpOwotCQl9Ci0JCWlmKHdwZFRvVGFza0ZlYXR1cmVzTWFwICE9IG51bGwpIHsKLQkJCXdwZFRvVGFza0ZlYXR1cmVzTWFwLmNsZWFyKCk7Ci0JCX0KLQkJCi0JCXN1cGVyLmRpc3Bvc2UoKTsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9Qcm9jZXNzQ29tbWFuZFV0aWwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL1Byb2Nlc3NDb21tYW5kVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NTBiNmM1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL1Byb2Nlc3NDb21tYW5kVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODYyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5TdHJVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYXRpb25BcHBsaWNhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuUHJvdmlkZXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5CYXRjaENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudWkuVXNlckludGVyYWN0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Qcm9jZXNzVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuU3VwcHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFzazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQXNzb2NpYXRpb25IZWxwZXI7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZSAtIE5vdiAyMywgMjAwNQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgUHJvY2Vzc0NvbW1hbmRVdGlsIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEVTdHJ1Y3R1cmFsRmVhdHVyZVtdIERFU0NSSVBUT1JfUkVGUkVTSEFCTEVfRkVBVFVSRVMgPSB7Ci0JCS8vIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE5hbWVkRWxlbWVudF9OYW1lKCksCi0JCS8vIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE1ldGhvZEVsZW1lbnRfUHJlc2VudGF0aW9uTmFtZSgpLAotCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRNZXRob2RFbGVtZW50X0JyaWVmRGVzY3JpcHRpb24oKSwKLQkJLy8gZ3VpZGFuY2UKLQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QnJlYWtkb3duRWxlbWVudF9DaGVja2xpc3RzKCksCi0JCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEJyZWFrZG93bkVsZW1lbnRfQ29uY2VwdHMoKSwKLQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QnJlYWtkb3duRWxlbWVudF9FeGFtcGxlcygpLAotCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRCcmVha2Rvd25FbGVtZW50X0d1aWRlbGluZXMoKSwKLQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QnJlYWtkb3duRWxlbWVudF9SZXVzYWJsZUFzc2V0cygpLAotCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRCcmVha2Rvd25FbGVtZW50X1N1cHBvcnRpbmdNYXRlcmlhbHMoKQotCX07Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEVTdHJ1Y3R1cmFsRmVhdHVyZVtdIFRBU0tfREVTQ1JJUFRPUl9SRUZSRVNIQUJMRV9GRUFUVVJFUyA9IHsKLQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza0Rlc2NyaXB0b3JfQWRkaXRpb25hbGx5UGVyZm9ybWVkQnkoKSwKLQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza0Rlc2NyaXB0b3JfTWFuZGF0b3J5SW5wdXQoKSwKLQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza0Rlc2NyaXB0b3JfT3B0aW9uYWxJbnB1dCgpLAotCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrRGVzY3JpcHRvcl9PdXRwdXQoKSwKLQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza0Rlc2NyaXB0b3JfUGVyZm9ybWVkUHJpbWFyaWx5QnkoKSwKLQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza0Rlc2NyaXB0b3JfU2VsZWN0ZWRTdGVwcygpIAotCX07Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEVTdHJ1Y3R1cmFsRmVhdHVyZVtdIFJPTEVfREVTQ1JJUFRPUl9SRUZSRVNIQUJMRV9GRUFUVVJFUyA9IHsgCi0JCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFJvbGVEZXNjcmlwdG9yX1Jlc3BvbnNpYmxlRm9yKCkgCi0JfTsKLQotLy8JcHVibGljIHN0YXRpYyBmaW5hbCBFU3RydWN0dXJhbEZlYXR1cmVbXSBXT1JLX1BST0RVQ1RfUkVGUkVTSEFCTEVfRkVBVFVSRVMgPSB7Ci0vLwotLy8JfTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSByZWZyZXNoYWJsZSBmZWF0dXJlIG1hcCBmb3IgdGhlIGdpdmVuIGRlc2NyaXB0b3IuIEEgZGVzY3JpcHRvcgotCSAqIGZlYXR1cmUgaXMgY29uc2lkZXJlZCByZWZyZXNoYWJsZSBpZiB0aGVyZSBpcyBhIHNpbWlsaWFyIGZlYXR1cmUgaW4gaXRzCi0JICogbGlua2VkIE1ldGhvZEVsZW1lbnQKLQkgKiAKLQkgKiBAcGFyYW0gZGVzY3JpcHRvcgotCSAqIEByZXR1cm4gdGhlIHJlZnJlc2hhYmxlIGZlYXR1cmUgbWFwIGZvciB0aGUgZ2l2ZW4gZGVzY3JpcHRvcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTWFwIGNyZWF0ZVJlZnJlc2hhYmxlRmVhdHVyZU1hcChEZXNjcmlwdG9yIGRlc2NyaXB0b3IsIFNldCBleGNsdWRlRmVhdHVyZXMpIHsKLQkJTWFwIGZlYXR1cmVNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQlhZGRUb0ZlYXR1cmVNYXAoZGVzY3JpcHRvciwgREVTQ1JJUFRPUl9SRUZSRVNIQUJMRV9GRUFUVVJFUywgZmVhdHVyZU1hcCwgZXhjbHVkZUZlYXR1cmVzKTsKLQkJaWYgKGRlc2NyaXB0b3IgaW5zdGFuY2VvZiBUYXNrRGVzY3JpcHRvcikgewotCQkJYWRkVG9GZWF0dXJlTWFwKGRlc2NyaXB0b3IsIFRBU0tfREVTQ1JJUFRPUl9SRUZSRVNIQUJMRV9GRUFUVVJFUywKLQkJCQkJZmVhdHVyZU1hcCwgZXhjbHVkZUZlYXR1cmVzKTsKLQkJfSBlbHNlIGlmIChkZXNjcmlwdG9yIGluc3RhbmNlb2YgUm9sZURlc2NyaXB0b3IpIHsKLQkJCWFkZFRvRmVhdHVyZU1hcChkZXNjcmlwdG9yLCBST0xFX0RFU0NSSVBUT1JfUkVGUkVTSEFCTEVfRkVBVFVSRVMsCi0JCQkJCWZlYXR1cmVNYXAsIGV4Y2x1ZGVGZWF0dXJlcyk7Ci0JCX0gZWxzZSBpZiAoZGVzY3JpcHRvciBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgewotCQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yIHdwZCA9IChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIGRlc2NyaXB0b3I7Ci0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkuZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX0RlbGl2ZXJhYmxlUGFydHMoKTsKLQkJCWlmICh3cGQuZ2V0V29ya1Byb2R1Y3QoKSBpbnN0YW5jZW9mIERlbGl2ZXJhYmxlICYmICFleGNsdWRlRmVhdHVyZXMuY29udGFpbnMoZmVhdHVyZSkpIHsKLQkJCQlmZWF0dXJlTWFwLnB1dChmZWF0dXJlLCB3cGQuZ2V0RGVsaXZlcmFibGVQYXJ0cygpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmVhdHVyZU1hcDsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGFkZFRvRmVhdHVyZU1hcChFT2JqZWN0IGVPYmplY3QsCi0JCQlFU3RydWN0dXJhbEZlYXR1cmVbXSBmZWF0dXJlcywgTWFwIGZlYXR1cmVNYXAsIFNldCBleGNsdWRlRmVhdHVyZXMpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmZWF0dXJlcy5sZW5ndGg7IGkrKykgewotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBmZWF0dXJlc1tpXTsKLQkJCWlmICghZXhjbHVkZUZlYXR1cmVzLmNvbnRhaW5zKGZlYXR1cmUpKSB7Ci0JCQkJT2JqZWN0IHZhbHVlID0gZU9iamVjdC5lR2V0KGZlYXR1cmUpOwotCQkJCWlmIChmZWF0dXJlLmlzTWFueSgpKSB7Ci0JCQkJCXZhbHVlID0gbmV3IEFycmF5TGlzdCgoQ29sbGVjdGlvbikgdmFsdWUpOwotCQkJCX0KLQkJCQlmZWF0dXJlTWFwLnB1dChmZWF0dXJlLCB2YWx1ZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvLyBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzVmFsaWRSZWZlcmVuY2UoRU9iamVjdCBlKSB7Ci0JLy8gaWYgKGUuZUlzUHJveHkoKSkgewotCS8vIHJldHVybiBmYWxzZTsKLQkvLyB9Ci0JLy8gaWYgKGUgaW5zdGFuY2VvZiBEZXNjcmlwdG9yKSB7Ci0JLy8gTWV0aG9kRWxlbWVudCBlbGVtZW50ID0gUHJvY2Vzc1V0aWwKLQkvLyAuZ2V0QXNzb2NpYXRlZEVsZW1lbnQoKERlc2NyaXB0b3IpIGUpOwotCS8vIGlmIChlbGVtZW50ID09IG51bGwgfHwgZWxlbWVudC5lSXNQcm94eSgpKSB7Ci0JLy8gcmV0dXJuIGZhbHNlOwotCS8vIH0KLQkvLyB9Ci0JLy8gcmV0dXJuIHRydWU7Ci0JLy8gfQotCi0JLyoqCi0JICogQ2xlYXJzIGFsbCBhdHRyaWJ1dGVzLiBGb3IgcmVmZXJlbmNlcywgcmVtb3ZlIG9ubHkgdGhvc2UgdGhhdCBhcmUKLQkgKiBkZXNjcmlwdG9ycyB3aGljaCBhcmUgbm90IGxpbmtlZCB0byBhbnkgY29udGVudCBlbGVtZW50LgotCSAqIAotCSAqIEBwYXJhbSBkZXNjcmlwdG9yCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTWFwIGNsZWFyUmVmcmVzaGFibGVGZWF0dXJlcyhEZXNjcmlwdG9yIGRlc2NyaXB0b3IsIFNldCBleGNsdWRlRmVhdHVyZXMpIHsKLQkJTWFwIGZlYXR1cmVNYXAgPSBjcmVhdGVSZWZyZXNoYWJsZUZlYXR1cmVNYXAoZGVzY3JpcHRvciwgZXhjbHVkZUZlYXR1cmVzKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZmVhdHVyZU1hcC5rZXlTZXQoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgaXRlci5uZXh0KCk7Ci0JCQlpZiAoZmVhdHVyZSBpbnN0YW5jZW9mIEVBdHRyaWJ1dGUpIHsKLQkJCQlkZXNjcmlwdG9yLmVTZXQoZmVhdHVyZSwgZmVhdHVyZS5nZXREZWZhdWx0VmFsdWUoKSk7Ci0JCQl9IGVsc2UgewotCQkJCWlmIChmZWF0dXJlLmlzTWFueSgpKSB7Ci0JCQkJCS8vIHdvcmsgYXJvdW5kIHRvIGF2b2lkIEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbgotCQkJCQkvLwotCQkJCQlMaXN0IGxpc3QgPSAoKExpc3QpIGRlc2NyaXB0b3IuZUdldChmZWF0dXJlKSk7Ci0JCQkJCXN3aXRjaCAobGlzdC5zaXplKCkpIHsKLQkJCQkJY2FzZSAwOgotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgMToKLQkJCQkJCWxpc3QucmVtb3ZlKDApOwotCQkJCQkJYnJlYWs7Ci0JCQkJCWRlZmF1bHQ6Ci0JCQkJCQlsaXN0LmNsZWFyKCk7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQlkZXNjcmlwdG9yLmVTZXQoZmVhdHVyZSwgZmVhdHVyZS5nZXREZWZhdWx0VmFsdWUoKSk7Ci0JCQkJfQotCQkJCS8vIGlmKGZlYXR1cmUuaXNNYW55KCkpIHsKLQkJCQkvLyBMaXN0IGxpc3QgPSAoKExpc3QpZGVzY3JpcHRvci5lR2V0KGZlYXR1cmUpKTsKLQkJCQkvLyBMaXN0IGVsZW1lbnRzVG9SZW1vdmUgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJLy8gZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGxpc3QuaXRlcmF0b3IoKTsgaXRlcmF0b3IKLQkJCQkvLyAuaGFzTmV4dCgpOykgewotCQkJCS8vIEVPYmplY3QgZSA9IChFT2JqZWN0KSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJLy8gaWYoIWlzVmFsaWRSZWZlcmVuY2UoZSkpIHsKLQkJCQkvLyBlbGVtZW50c1RvUmVtb3ZlLmFkZChlKTsKLQkJCQkvLyB9Ci0JCQkJLy8gfQotCQkJCS8vIGlmKCFlbGVtZW50c1RvUmVtb3ZlLmlzRW1wdHkoKSkgewotCQkJCS8vIGxpc3QucmVtb3ZlQWxsKGVsZW1lbnRzVG9SZW1vdmUpOwotCQkJCS8vIFN5c3RlbS5vdXQKLQkJCQkvLyAucHJpbnRsbigiUHJvY2Vzc0NvbW1hbmRVdGlsLmNsZWFyUmVmcmVzaGFibGVGZWF0dXJlcygpOgotCQkJCS8vIGNoYW5nZWQiKTsKLQkJCQkvLyB9Ci0JCQkJLy8gfQotCQkJCS8vIGVsc2UgewotCQkJCS8vIEVPYmplY3Qgb2JqID0gKEVPYmplY3QpIGRlc2NyaXB0b3IuZUdldChmZWF0dXJlKTsKLQkJCQkvLyBpZihvYmogIT0gbnVsbCAmJiBvYmogIT0gZmVhdHVyZS5nZXREZWZhdWx0VmFsdWUoKSAmJgotCQkJCS8vICFpc1ZhbGlkUmVmZXJlbmNlKG9iaikpIHsKLQkJCQkvLyBkZXNjcmlwdG9yLmVTZXQoZmVhdHVyZSwgZmVhdHVyZS5nZXREZWZhdWx0VmFsdWUoKSk7Ci0JCQkJLy8gU3lzdGVtLm91dAotCQkJCS8vIC5wcmludGxuKCJQcm9jZXNzQ29tbWFuZFV0aWwuY2xlYXJSZWZyZXNoYWJsZUZlYXR1cmVzKCk6Ci0JCQkJLy8gY2hhbmdlZCIpOwotCQkJCS8vIH0KLQkJCQkvLyB9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gZmVhdHVyZU1hcDsKLQl9Ci0KLQkvKioKLQkgKiBDbGVhcnMgYWxsIHRoZSByZWZyZXNoYWJsZSBmZWF0dXJlcyBvZiB0aGUgZ2l2ZW4gZGVzY3JpcHRvcgotCSAqIAotCSAqIEBwYXJhbSBkZXNjcmlwdG9yCi0JICogQHBhcmFtIGRlc2NyaXB0b3JUb09sZFJlZnJlc2hhYmxlRmVhdHVyZXNNYXAKLQkgKiBAcGFyYW0gZXhjbHVkZUZlYXR1cmVzIGZlYXR1cmVzIHRvIGV4Y2x1ZGUgZnJvbSByZWZyZXNoaW5nCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNsZWFyRGVzY3JpcHRvcihEZXNjcmlwdG9yIGRlc2NyaXB0b3IsCi0JCQlNYXAgZGVzY3JpcHRvclRvT2xkUmVmcmVzaGFibGVGZWF0dXJlc01hcCwKLQkJCVNldCBleGNsdWRlRmVhdHVyZXMpIHsKLQkJaWYgKGRlc2NyaXB0b3JUb09sZFJlZnJlc2hhYmxlRmVhdHVyZXNNYXAgIT0gbnVsbCkgewotCQkJLy8gbmVlZCB0byBjbGVhciBhbGwgdGhlIHJlZnJlc2hhYmxlIGZlYXR1cmVzIG9mIHRoZSBleGlzdGluZwotCQkJLy8gZGVzY3JpcHRvcgotCQkJLy8KLQkJCWlmICghZGVzY3JpcHRvclRvT2xkUmVmcmVzaGFibGVGZWF0dXJlc01hcC5jb250YWluc0tleShkZXNjcmlwdG9yKSkgewotCQkJCWRlc2NyaXB0b3JUb09sZFJlZnJlc2hhYmxlRmVhdHVyZXNNYXAKLQkJCQkJCS5wdXQoZGVzY3JpcHRvciwgY2xlYXJSZWZyZXNoYWJsZUZlYXR1cmVzKGRlc2NyaXB0b3IsIGV4Y2x1ZGVGZWF0dXJlcykpOwotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1ZhbGlkRGVzY3JpcHRvck9mKE9iamVjdCBlbGVtZW50LCBNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZywgT2JqZWN0IGRlc2NyaXB0b3IsIGJvb2xlYW4gZXhjbHVkZVN1cHByZXNzZWQpIHsJCQotCQlpZihkZXNjcmlwdG9yIGluc3RhbmNlb2YgRGVzY3JpcHRvcikgewotCQkJRGVzY3JpcHRvciBkZXNjID0gICgoRGVzY3JpcHRvcilkZXNjcmlwdG9yKTsKLQkJCWlmKGV4Y2x1ZGVTdXBwcmVzc2VkICYmIGRlc2MuZ2V0U3VwcHJlc3NlZCgpLmJvb2xlYW5WYWx1ZSgpKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCi0JCQlPYmplY3QgZWxlbWVudE9iaiA9IFByb2Nlc3NVdGlsLmdldEFzc29jaWF0ZWRFbGVtZW50KGRlc2MpOwotCQkJZWxlbWVudE9iaiA9IFByb3ZpZGVycy5nZXRDb25maWd1cmF0aW9uQXBwbGljYXRvcigpLnJlc29sdmUoZWxlbWVudE9iaiwgY29uZmlnKTsKLQkJCXJldHVybiBlbGVtZW50ID09IGVsZW1lbnRPYmo7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQkvKioKLQkgKiBDaGVja3MgaWYgdGhlIGdpdmVuIDxjb2RlPm9iamVjdDwvY29kZT4gaXMgYSB2YWxpZCBkZXNjcmlwdG9yIG9yIGRlc2NyaXB0b3Igd3JhcHBlciBvZiB0aGUgZ2l2ZW4gPGNvZGU+ZWxlbWVudDwvY29kZT4KLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqIEBwYXJhbSBjb25maWcKLQkgKiBAcGFyYW0gb2JqZWN0Ci0JICogCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNWYWxpZERlc2NyaXB0b3JPckRlc2NyaXB0b3JXcmFwcGVyT2YoT2JqZWN0IGVsZW1lbnQsIE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnLCBTdXBwcmVzc2lvbiBzdXBwcmVzc2lvbiwgT2JqZWN0IG9iamVjdCkgewotCQlpZihvYmplY3QgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgewotCQkJaWYoc3VwcHJlc3Npb24uaXNJblN1cHByZXNzZWRMaXN0KChCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgb2JqZWN0KSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXJldHVybiBpc1ZhbGlkRGVzY3JpcHRvck9mKGVsZW1lbnQsIGNvbmZpZywgVG5nVXRpbC51bndyYXAob2JqZWN0KSwgZmFsc2UpOwotCQkJfQotCQl9Ci0JCXJldHVybiBpc1ZhbGlkRGVzY3JpcHRvck9mKGVsZW1lbnQsIGNvbmZpZywgb2JqZWN0LCB0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSB1bnN1cHByZXNzZWQgZGVzY3JpcHRvciBmcm9tIGEgZGVzY3JpcHRvciBsaXN0LiBUaGUgZGVzY3JpcHRvciBsaXN0IGlzIHVzdWFsbHkKLQkgKiB0aGUgYnJlYWtkb3duIGVsZW1lbnRzIG9mIGFuIGFjdGl2aXR5LgotCSAqIAotCSAqIEBwYXJhbSBvYmoKLQkgKiBAcGFyYW0gZGVzY3JpcHRvckxpc3QKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBPYmplY3QgZ2V0RGVzY3JpcHRvcihPYmplY3Qgb2JqLCBMaXN0IGRlc2NyaXB0b3JMaXN0LCBNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZykgewotCQlyZXR1cm4gZ2V0RGVzY3JpcHRvcihvYmosIGRlc2NyaXB0b3JMaXN0LCBjb25maWcsIHRydWUpOwotCX0KLQkKLQlzdGF0aWMgT2JqZWN0IGdldERlc2NyaXB0b3IoT2JqZWN0IG9iaiwgTGlzdCBkZXNjcmlwdG9yTGlzdCwgTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcsIGJvb2xlYW4gZXhjbHVkZVN1cHByZXNzZWQpIHsKLQkJaW50IHNpemUgPSBkZXNjcmlwdG9yTGlzdC5zaXplKCk7Ci0JCWZvciAoaW50IGogPSAwOyBqIDwgc2l6ZTsgaisrKSB7Ci0JCQkvLyBpdGVyYXRlIHRocnUgbGlzdCB0byBzZWUgd2hldGhlciBhIHZhbGlkIGRlc2NyaXB0b3IgbGlua2VkIHdpdGggdGhlIGdpdmVuIG9iamVjdAotCQkJLy8gYWxyZWFkeSBleGlzdHMKLQkJCS8vCi0JCQlPYmplY3Qgb2JqZWN0ID0gZGVzY3JpcHRvckxpc3QuZ2V0KGopOwotCQkJaWYoaXNWYWxpZERlc2NyaXB0b3JPZihvYmosIGNvbmZpZywgb2JqZWN0LCBleGNsdWRlU3VwcHJlc3NlZCkpIHsKLQkJCQlyZXR1cm4gb2JqZWN0OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKioKLQkgKiBHZXRzIHRoZSB2YWxpZCBkZXNjcmlwdG9yLCBlaXRoZXIgbG9jYWwgb3IgaW5oZXJpdGVkLCBvZiB0aGUgZ2l2ZW4gb2JqZWN0IHVuZGVyIHRoZSBnaXZlbiBhY3Rpdml0eQotCSAqIAotCSAqIEBwYXJhbSBvYmoKLQkgKiBAcGFyYW0gYWN0aXZpdHkKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBEZXNjcmlwdG9yIGdldFZhbGlkRGVzY3JpcHRvcihPYmplY3Qgb2JqLCBBY3Rpdml0eSBhY3Rpdml0eSwgQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJUHJvY2VzcyBwcm9jID0gVG5nVXRpbC5nZXRPd25pbmdQcm9jZXNzKGFjdGl2aXR5KTsKLQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSBwcm9jLmdldERlZmF1bHRDb250ZXh0KCk7Ci0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciBhZGFwdGVyID0gKElUcmVlSXRlbUNvbnRlbnRQcm92aWRlcikgYWRhcHRlckZhY3RvcnkuYWRhcHQoYWN0aXZpdHksIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGFkYXB0ZXIuZ2V0Q2hpbGRyZW4oYWN0aXZpdHkpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGNoaWxkID0gaXRlci5uZXh0KCk7Ci0JCQlpZihpc1ZhbGlkRGVzY3JpcHRvck9yRGVzY3JpcHRvcldyYXBwZXJPZihvYmosIGNvbmZpZywgU3VwcHJlc3Npb24uZ2V0U3VwcHJlc3Npb24ocHJvYyksIGNoaWxkKSkgewotCQkJCXJldHVybiAoRGVzY3JpcHRvcikgVG5nVXRpbC51bndyYXAoY2hpbGQpOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkKLQotCS8qKgotCSAqIEdldHMgdGhlIGxvY2FsIHVuc3VwcHJlc3NlZCBkZXNjcmlwdG9yIG9mIHRoZSBnaXZlbiByb2xlLCB0YXNrLCBvciB3b3JrUHJvZHVjdC4KLQkgKiAKLQkgKiBAcGFyYW0gb2JqCi0JICogQHBhcmFtIGFjdGl2aXR5Ci0JICogQHJldHVybiBUaGUgZGVzY3JpcHRvciBvZiB0aGUgb2JqZWN0LCBvciBudWxsIGlmIG5vdCBleGlzdC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9iamVjdCBnZXREZXNjcmlwdG9yKE9iamVjdCBvYmosIEFjdGl2aXR5IGFjdGl2aXR5LCBNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZykgewotCQlyZXR1cm4gZ2V0RGVzY3JpcHRvcihvYmosIGFjdGl2aXR5LmdldEJyZWFrZG93bkVsZW1lbnRzKCksIGNvbmZpZyk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBSb2xlIERlc2NyaXB0b3JzIGZvciB0aGUgcmVzcG9uc2libGUgcm9sZXMgb2YgdGhlIGdpdmVuIHdvcmsgcHJvZHVjdAotCSAqIGRlc2NyaXB0b3IuCi0JICogCi0JICogQHBhcmFtIHdwRGVzYwotCSAqIEBwYXJhbSBhY3Rpdml0eQotCSAqIEBwYXJhbSByb2xlRGVzY3JpcHRvcnMgbmV3bHkgY3JlYXRlZCByb2xlIGRlc2NyaXB0b3JzIHdpbGwgYmUgYWRkZWQgdG8gdGhpcyBsaXN0Ci0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBhZGRSZXNwb25zaWJsZVJvbGVEZXNjcmlwdG9ycygKLQkJCVdvcmtQcm9kdWN0RGVzY3JpcHRvciB3cERlc2MsIEFjdGl2aXR5IGFjdGl2aXR5LAotCQkJTGlzdDxSb2xlRGVzY3JpcHRvcj4gcm9sZURlc2NyaXB0b3JzLCBTZXQgZGVzY3JpcHRvcnNUb1JlZnJlc2gsIE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0JCWlmICh3cERlc2MgIT0gbnVsbCkgewotCQkJV29ya1Byb2R1Y3Qgd3AgPSB3cERlc2MuZ2V0V29ya1Byb2R1Y3QoKTsKLQkJCWlmICh3cCAhPSBudWxsKSB7Ci0JCQkJaWYgKFRuZ1V0aWwuaXNDb250cmlidXRvcih3cCkpIHsKLQkJCQkJd3AgPSAoV29ya1Byb2R1Y3QpIFRuZ1V0aWwuZ2V0QmFzZSh3cCk7Ci0JCQkJfQotCQkJCS8vIGdldCByZXNwb25zaWJsZSByb2xlIGZvciB3b3JrIHByb2R1Y3QKLQkJCQlMaXN0IHJvbGVzID0gQXNzb2NpYXRpb25IZWxwZXIuZ2V0UmVzcG9uc2libGVSb2xlcyh3cCk7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IHJvbGVzLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCQkJUm9sZSByb2xlID0gKFJvbGUpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJaWYgKFRuZ1V0aWwuaXNDb250cmlidXRvcihyb2xlKSkgewotCQkJCQkJcm9sZSA9IChSb2xlKSBUbmdVdGlsLmdldEJhc2Uocm9sZSk7Ci0JCQkJCX0KLQkJCQkJYm9vbGVhbiBpc05ld0Rlc2NyaXB0b3IgPSBmYWxzZTsKLQkJCQkJLy8gY2hlY2sgZm9yIHJvbGVkZXNjcmlwdG9yIHdoZXRoZXIgaXQncyBwcmVzZW50IGluIGFjdGl2aXR5Ci0JCQkJCS8vIGJyZWFrZG93biBlbGVtZW50cwotCQkJCQlSb2xlRGVzY3JpcHRvciByb2xlRGVzYyA9IChSb2xlRGVzY3JpcHRvcikgZ2V0RGVzY3JpcHRvcigKLQkJCQkJCQlyb2xlLCBhY3Rpdml0eSwgY29uZmlnKTsKLQkJCQkJaWYgKHJvbGVEZXNjID09IG51bGwpIHsKLQkJCQkJCS8vIGNoZWNrIGZvciByb2xlZGVzY3JpcHRvciB3aGV0aGVyIGl0J3MgcHJlc2VudCBpbiBiYXNlCi0JCQkJCQkvLyBhY3Rpdml0eS4KLQkJCQkJCXJvbGVEZXNjID0gKFJvbGVEZXNjcmlwdG9yKSBQcm9jZXNzQ29tbWFuZFV0aWwuZ2V0SW5oZXJpdGVkRGVzY3JpcHRvcigKLQkJCQkJCQkJcm9sZSwgYWN0aXZpdHksIGNvbmZpZyk7Ci0JCQkJCQlpZiAocm9sZURlc2MgPT0gbnVsbCkgewotCQkJCQkJCS8vIGNoZWNrIGZvciByb2xlZGVzY3JpcHRvciB3aGV0aGVyIGl0J3MgcHJlc2VudCBpbgotCQkJCQkJCS8vIGxpc3Qgb2Ygcm9sZWRlc2NyaXB0b3JzIHBhc3NlZCBpbgotCQkJCQkJCXJvbGVEZXNjID0gKFJvbGVEZXNjcmlwdG9yKSBnZXREZXNjcmlwdG9yKHJvbGUsCi0JCQkJCQkJCQlyb2xlRGVzY3JpcHRvcnMsIGNvbmZpZyk7Ci0JCQkJCQkJaWYgKHJvbGVEZXNjID09IG51bGwpIHsKLQkJCQkJCQkJcm9sZURlc2MgPSBQcm9jZXNzVXRpbC5jcmVhdGVSb2xlRGVzY3JpcHRvcihyb2xlKTsKLQkJCQkJCQkJcm9sZURlc2NyaXB0b3JzLmFkZChyb2xlRGVzYyk7Ci0JCQkJCQkJCWlzTmV3RGVzY3JpcHRvciA9IHRydWU7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWlmICghaXNOZXdEZXNjcmlwdG9yICYmIGRlc2NyaXB0b3JzVG9SZWZyZXNoICE9IG51bGwgCi0JCQkJCQkJJiYgcm9sZURlc2MuZ2V0SXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKCkuYm9vbGVhblZhbHVlKCkpIHsKLQkJCQkJCWRlc2NyaXB0b3JzVG9SZWZyZXNoLmFkZChyb2xlRGVzYyk7Ci0JCQkJCX0JCQkJCQkKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDb2xsZWN0cyB3b3JrIHByb2R1Y3QgZGVzY3JpcHRvcnMgZm9yIHRoZSBnaXZlbgotCSAqIDxjb2RlPnRhc2tEZXNjcmlwdG9yRmVhdHVyZTwvY29kZT4gYmFzZWQgb24gdGhlIGNvcnJlc3BvbmRpbmcgZmVhdHVyZQotCSAqIGluIHRoZSBsaW5rZWQgdGFzayBvZiB0aGUgZ2l2ZW4gPGNvZGU+dGFza0Rlc2NyaXB0b3I8L2NvZGU+Ci0JICogCi0JICogQHBhcmFtIHRhc2sgdGhlIHRhc2sgdGhhdCB0aGUgdGFzayBkZXNjcmlwdG9yIGlzIGxpbmtlZCB0bwotCSAqIEBwYXJhbSB0YXNrRGVzY3JpcHRvciB0aGUgdGFzayBkZXNjcmlwdG9yIHdob3NlIHdvcmsgcHJvZHVjdCBkZXNjcmlwdG9ycyBpbiB0aGUgZ2l2ZW4gPGNvZGU+dGFza0Rlc2NyaXB0b3JGZWF0dXJlPC9jb2RlPgotCSAqICAgICAgICB3aWxsIGJlIGNvbGxlY3RlZAotCSAqIEBwYXJhbSB0YXNrRmVhdHVyZSB0aGUgdGFzayBmZWF0dXJlIHRoYXQgaXMgY29ycmVzcG9uZGluZyB0byB0aGUgdGFzayBkZXNjcmlwdG9yIGZlYXR1cmUKLQkgKiBAcGFyYW0gdGFza0Rlc2NyaXB0b3JGZWF0dXJlIHRoZSBmZWF0dXJlIG9mIHRhc2sgZGVzY3JpcHRvciB0aGF0IGhvbGRzIHJlZmVyZW5jZXMgdG8gCi0JICogICAgICAgIHRoZSB3b3JrIHByb2R1Y3QgZGVzY3JpcHRvciB0byBjb2xsZWN0Ci0JICogQHBhcmFtIGFjdGl2aXR5IHRoZSBhY3Rpdml0eSBvZiBkZXNjcmlwdG9ycwotCSAqIEBwYXJhbSBjb25maWcgdGhlIHNlbGVjdGVkIGNvbmZpZ3VyYXRpb24KLQkgKiBAcGFyYW0gd3BEZXNjcmlwdG9ycwotCSAqIEBwYXJhbSB3cGRUb0RlbGl2ZXJhYmxlUGFydHNNYXAKLQkgKiBAcGFyYW0gd3BkVG9EZWxpdmVyYWJsZURlc2NyaXB0b3JNYXAKLQkgKiBAcGFyYW0gZGVzY3JpcHRvcnNUb1JlZnJlc2gKLQkgKiAgICAgICAgICAgIG91cHV0IHRoYXQga2VlcHMgdGhlIGRlc2NyaXB0b3IgZmVhdHVyZXMgdGhhdCBuZWVkIHRvIGJlCi0JICogICAgICAgICAgICByZWZyZXNoZWQKLQkgKiBAcGFyYW0gZGVzY3JpcHRvclRvTmV3RmVhdHVyZVZhbHVlc01hcAotCSAqICAgICAgICAgICAgb3V0cHV0IHRoYXQga2VlcHMgdGhlIGNvbGxlY3RlZCB3b3JrIHByb2R1Y3QgZGVzY3JpcHRvcnMKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGNvbGxlY3RXb3JrUHJvZHVjdERlc2NydGlwdG9ycygKLQkJCVRhc2sgdGFzaywKLQkJCVRhc2tEZXNjcmlwdG9yIHRhc2tEZXNjcmlwdG9yLCBFUmVmZXJlbmNlIHRhc2tGZWF0dXJlLAotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIHRhc2tEZXNjcmlwdG9yRmVhdHVyZSwKLQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnLCBBY3Rpdml0eSBhY3Rpdml0eSwgTGlzdCB3cERlc2NyaXB0b3JzLAotCQkJTWFwIHdwZFRvRGVsaXZlcmFibGVQYXJ0c01hcCwgTWFwIHdwZFRvRGVsaXZlcmFibGVEZXNjcmlwdG9yTWFwLAotCQkJU2V0IGRlc2NyaXB0b3JzVG9SZWZyZXNoLCBNYXAgZGVzY3JpcHRvclRvTmV3RmVhdHVyZVZhbHVlc01hcCkgewotCQlMaXN0IHdvcmtQcm9kdWN0cyA9IChMaXN0KSBQcm92aWRlcnMuZ2V0Q29uZmlndXJhdGlvbkFwcGxpY2F0b3IoKQotCQkJCS5nZXRSZWZlcmVuY2UodGFzaywgdGFza0ZlYXR1cmUsIGNvbmZpZyk7Ci0JCUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJUHJvY2Vzc0NvbW1hbmRVdGlsLmNyZWF0ZVdvcmtQcm9kdWN0RGVzY3JpcHRvcnMod29ya1Byb2R1Y3RzLCBsaXN0LCBhY3Rpdml0eSwKLQkJCQl3cERlc2NyaXB0b3JzLCB3cGRUb0RlbGl2ZXJhYmxlUGFydHNNYXAsCi0JCQkJd3BkVG9EZWxpdmVyYWJsZURlc2NyaXB0b3JNYXAsIGRlc2NyaXB0b3JzVG9SZWZyZXNoLCBjb25maWcpOwotCQlpZiAoIWxpc3QuaXNFbXB0eSgpKSB7Ci0JCQlCYXRjaENvbW1hbmQuYWRkRmVhdHVyZVZhbHVlcyhkZXNjcmlwdG9yVG9OZXdGZWF0dXJlVmFsdWVzTWFwLCB0YXNrRGVzY3JpcHRvciwKLQkJCQkJdGFza0Rlc2NyaXB0b3JGZWF0dXJlLCBsaXN0KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgd29yayBwcm9kdWN0IGRlc2NyaXB0b3JzIGZyb20gdGhlIGdpdmVuIHdvcmsgcHJvZHVjdHMgZm9yIHRoZQotCSAqIGdpdmVuIGFjdGl2aXR5IGlmIGl0IGRvZXMgbm90IGhhdmUgdGhlbSBhbHJlYWR5Ci0JICogCi0JICogQHBhcmFtIHdvcmtQcm9kdWN0cwotCSAqICAgICAgICAgICAgV29ya1Byb2R1Y3QgbGlzdAotCSAqIEBwYXJhbSBmZWF0dXJlVmFsdWUKLQkgKiAgICAgICAgICAgIHRhcmdldCBXb3JrUHJvZHVjdERlc2NyaXB0b3IgbGlzdCBmb3IgdGhlIGdpdmVuIFdvcmtQcm9kdWN0Ci0JICogICAgICAgICAgICBsaXN0Ci0JICogQHBhcmFtIGFjdGl2aXR5Ci0JICogQHBhcmFtIHdwRGVzY3JpcHRvcnMKLQkgKiAgICAgICAgICAgIG5ld2x5IGNyZWF0ZWQgd29yayBwcm9kdWN0IGRlc2NyaXB0b3IgKG91dHB1dCkKLQkgKi8KLQlzdGF0aWMgdm9pZCBjcmVhdGVXb3JrUHJvZHVjdERlc2NyaXB0b3JzKExpc3Qgd29ya1Byb2R1Y3RzLAotCQkJTGlzdCBmZWF0dXJlVmFsdWUsIEFjdGl2aXR5IGFjdGl2aXR5LCBMaXN0IHdwRGVzY3JpcHRvcnMsCi0JCQlNYXAgd3BkVG9EZWxpdmVyYWJsZVBhcnRzTWFwLCBNYXAgd3BkVG9EZWxpdmVyYWJsZURlc2NyaXB0b3JNYXAsCi0JCQlTZXQgZGVzY3JpcHRvcnNUb1JlZnJlc2gsIE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0JCWlmICh3b3JrUHJvZHVjdHMgIT0gbnVsbCkgewotCQkJYm9vbGVhbiB3YXNFbXB0eSA9IGZlYXR1cmVWYWx1ZS5pc0VtcHR5KCk7Ci0JCQlmb3IgKGludCBqID0gMDsgaiA8IHdvcmtQcm9kdWN0cy5zaXplKCk7IGorKykgewotCQkJCVdvcmtQcm9kdWN0IHdwT2JqID0gKFdvcmtQcm9kdWN0KSB3b3JrUHJvZHVjdHMuZ2V0KGopOwotCQkJCWlmICh3cE9iaiAhPSBudWxsKSB7Ci0JCQkJCWlmIChUbmdVdGlsLmlzQ29udHJpYnV0b3Iod3BPYmopKSB7Ci0JCQkJCQl3cE9iaiA9IChXb3JrUHJvZHVjdCkgVG5nVXRpbC5nZXRCYXNlKHdwT2JqKTsKLQkJCQkJfQotCQkJCQlXb3JrUHJvZHVjdERlc2NyaXB0b3Igd3BEZXNjID0gKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgZ2V0RGVzY3JpcHRvcih3cE9iaiwgYWN0aXZpdHksIGNvbmZpZyk7Ci0JCQkJCWlmICh3cERlc2MgPT0gbnVsbCkgewotCQotCQkJCQkJLy8gZ2V0IGluaGVyaXRlZCB3b3JrIHByb2R1Y3QgZGVzY3JpcHRvcnMKLQkJCQkJCXdwRGVzYyA9IChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIFByb2Nlc3NDb21tYW5kVXRpbAotCQkJCQkJCQkuZ2V0SW5oZXJpdGVkRGVzY3JpcHRvcih3cE9iaiwgYWN0aXZpdHksIGNvbmZpZyk7Ci0JCQkJCQlpZiAod3BEZXNjID09IG51bGwpIHsKLQkJCQkJCQl3cERlc2MgPSAoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBnZXREZXNjcmlwdG9yKHdwT2JqLCB3cERlc2NyaXB0b3JzLCBjb25maWcpOwotCQkJCQkJCWlmICh3cERlc2MgPT0gbnVsbCkgewotCQkJCQkJCQl3cERlc2MgPSBQcm9jZXNzQ29tbWFuZFV0aWwuY3JlYXRlV29ya1Byb2R1Y3REZXNjcmlwdG9yKHdwT2JqLAotCQkJCQkJCQkJCWNvbmZpZywgd3BkVG9EZWxpdmVyYWJsZVBhcnRzTWFwKTsKLQkJCQkJCQkJd3BEZXNjcmlwdG9ycy5hZGQod3BEZXNjKTsKLQkKLQkJCQkJCQkJLy8gYXV0b21hdGljIGFkZGluZyB0byB0aGUgZXhpc3RpbmcgZGVsaXZlcmFibGUKLQkJCQkJCQkJLy8gZGVzY3JpcHRvciBpbiB0aGUgYWN0aXZpdHkncyBzY29wZSBpZiB0aGVyZQotCQkJCQkJCQkvLyBpcwotCQkJCQkJCQkvLyBhbnkKLQkJCQkJCQkJLy8gdmFsaWQgb25lLgotCQkJCQkJCQkvLwotCQkJCQkJCQlXb3JrUHJvZHVjdERlc2NyaXB0b3IgZGVzY3JpcHRvciA9IFVzZXJJbnRlcmFjdGlvbkhlbHBlcgotCQkJCQkJCQkJCS5nZXREZWxpdmVyYWJsZShhY3Rpdml0eSwgd3BPYmopOwotCQkJCQkJCQlpZiAoZGVzY3JpcHRvciAhPSBudWxsKSB7Ci0JCQkJCQkJCQl3cGRUb0RlbGl2ZXJhYmxlRGVzY3JpcHRvck1hcC5wdXQod3BEZXNjLAotCQkJCQkJCQkJCQlkZXNjcmlwdG9yKTsKLQkJCQkJCQkJfQotCQotCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCWlmIChkZXNjcmlwdG9yc1RvUmVmcmVzaCAhPSBudWxsKSB7Ci0JCQkJCQkJCQlkZXNjcmlwdG9yc1RvUmVmcmVzaC5hZGQod3BEZXNjKTsKLQkJCQkJCQkJfQotCQkJCQkJCQlpZiAod3BPYmogaW5zdGFuY2VvZiBEZWxpdmVyYWJsZQotCQkJCQkJCQkJCSYmIHdwZFRvRGVsaXZlcmFibGVQYXJ0c01hcCAhPSBudWxsKSB7Ci0JCQkJCQkJCQlQcm9jZXNzQ29tbWFuZFV0aWwuY3JlYXRlRGVsaXZlcmFibGVQYXJ0cyh3cERlc2MsCi0JCQkJCQkJCQkJCShEZWxpdmVyYWJsZSkgd3BPYmosIGNvbmZpZywKLQkJCQkJCQkJCQkJd3BkVG9EZWxpdmVyYWJsZVBhcnRzTWFwLCBkZXNjcmlwdG9yc1RvUmVmcmVzaCk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJaWYgKHdhc0VtcHR5IHx8ICFmZWF0dXJlVmFsdWUuY29udGFpbnMod3BEZXNjKSkgewotCQkJCQkJZmVhdHVyZVZhbHVlLmFkZCh3cERlc2MpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIHRhc2sgZGVzY3JpcHRvciBmb3IgdGhlIGdpdmVuIHRhc2sgd2l0aGluIHRoZSBhY3Rpdml0eSBpZiBpdAotCSAqIGRvZXMgbm90IGV4aXN0IGFscmVhZHksIGFuZCB1cGRhdGUgdGhlIHJvbGVEZXNjcmlwdG9ycyBhbmQgd3BEZXNjcmlwdG9ycyBsaXN0cwotCSAqIGFzc29jaWF0ZWQgd2l0aCB0aGlzIFRhc2sgZGVzY3JpcHRvci4gQ2FsbGVyIHNob3VsZCBhZGQgdGhlIG5ldyB0YXNrCi0JICogZGVzY3JpcHRvciBhbmQgdGhlIG90aGVyRGVzY3JpcHRvcnMgaW50byB0aGUgYWN0aXZpdHkncyBicmVha2Rvd24gZWxlbWVudAotCSAqIGxpc3QuCi0JICogCi0JICogQHBhcmFtIHRhc2sKLQkgKiBAcGFyYW0gYWN0aXZpdHkKLQkgKiBAcGFyYW0gcm9sZURlc2NyaXB0b3JzCi0JICogICAgICAgICAgICBMaXN0IHRvIGhvbGQgdGhlIGNyZWF0ZWQgcm9sZSBkZXNjcmlwdG9ycyBhc3NvY2lhdGVkIHdpdGggdGhpcwotCSAqICAgICAgICAgICAgbmV3IHRhc2sgZGVzY3JpcHRvciwgbm8gcm9sZSBkZXNjcmlwdG9yIHdpbGwgYmUgY3JlYXRlZCBpZgotCSAqICAgICAgICAgICAgcm9sZURlc2NyaXB0b3JzIGlzIG51bGwKLQkgKiAKLQkgKiBAcGFyYW0gd3BEZXNjcmlwdG9ycwotCSAqICAgICAgICAgICAgTGlzdCB0byBob2xkIHRoZSBjcmVhdGVkIHdvcmtwcm9kdWN0IGRlc2NyaXB0b3JzIGFzc29jaWF0ZWQKLQkgKiAgICAgICAgICAgIHdpdGggdGhpcyBuZXcgdGFzayBkZXNjcmlwdG9yLCBubyB3b3JrcHJvZHVjdCBkZXNjcmlwdG9yIHdpbGwKLQkgKiAgICAgICAgICAgIGJlIGNyZWF0ZWQgaWYgd3BEZXNjcmlwdG9ycyBpcyBudWxsCi0JICogCi0JICogQHBhcmFtIHdwZFRvRGVsaXZlcmFibGVEZXNjcmlwdG9yTWFwIAotCSAqICAgICAgICAgICAgTWFwIHRvIGhvbGQgd29yayBwcm9kdWN0IGRlc2NyaXB0b3IgYW5kIGRlbGl2ZXJhYmxlIGRlc2NyaXB0b3IgdG8gYXNzaWduCi0JICogICAgICAgICAgICB0aGUgd29yayBwcm9kdWN0IGRlc2NyaXB0b3IgdG8KLQkgKiAgICAgICAgICAgICAKLQkgKiBAcmV0dXJuIFRhc2tEZXNjcmlwdG9yIG9yIG51bGwgaWYgdGhlIHRhc2sgZGVzY3JpcHRvciBmb3IgdGhlIGdpdmVuIHRhc2sKLQkgKiAgICAgICAgIGFscmVhZHkgZXhpc3RzLCBhbmQgdXBkYXRlZCB0aGUgcm9sZURlc2NyaXB0b3JzIGFuZCB3cERlc2NyaXB0b3JzCi0JICogICAgICAgICBsaXN0cwotCSAqLwotCXB1YmxpYyBzdGF0aWMgVGFza0Rlc2NyaXB0b3IgY3JlYXRlVGFza0Rlc2NyaXB0b3IoVGFzayB0YXNrLAotCQkJQWN0aXZpdHkgYWN0aXZpdHksIExpc3Qgcm9sZURlc2NyaXB0b3JzLCBMaXN0IHdwRGVzY3JpcHRvcnMsCi0JCQlNYXAgd3BkVG9EZWxpdmVyYWJsZVBhcnRzTWFwLCBNYXAgd3BkVG9EZWxpdmVyYWJsZURlc2NyaXB0b3JNYXAsCi0JCQlTZXQgZGVzY3JpcHRvcnNUb1JlZnJlc2gsIE1hcCBkZXNjcmlwdG9yVG9OZXdGZWF0dXJlVmFsdWVzTWFwLAotCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcsIGJvb2xlYW4gdXNlRXhpc3RpbmdEZXNjcmlwdG9yLCBTZXQgc3luY2hGZWF0dXJlcykgewotCQlpZiAoVG5nVXRpbC5pc0NvbnRyaWJ1dG9yKHRhc2spKSB7Ci0JCQl0YXNrID0gKFRhc2spIFRuZ1V0aWwuZ2V0QmFzZSh0YXNrKTsKLQkJfQotCQotCQkvLyBjcmVhdGUgdGFzayBkZXNjcmlwdG9yIG9iamVjdAotCQkvLwotCQlUYXNrRGVzY3JpcHRvciB0YXNrRGVzYyA9IG51bGw7Ci0JCWlmICh1c2VFeGlzdGluZ0Rlc2NyaXB0b3IpCi0JCQl0YXNrRGVzYyA9IAkoVGFza0Rlc2NyaXB0b3IpIGdldERlc2NyaXB0b3IodGFzaywgYWN0aXZpdHksIGNvbmZpZyk7Ci0JCWJvb2xlYW4gaXNOZXdUYXNrRGVzY3JpcHRvciA9IGZhbHNlOwotCQotCQkvLyBpZiAoIHRhc2tEZXNjICE9IG51bGwgKQotCQkvLyB7Ci0JCS8vIHJldHVybiB0YXNrRGVzYzsKLQkJLy8gfQotCQkvLyB0YXNrRGVzYyA9IGNyZWF0ZVRhc2tEZXNjcmlwdG9yKHRhc2spOwotCQotCQlpZiAodGFza0Rlc2MgPT0gbnVsbCkgewotCQkJdGFza0Rlc2MgPSBQcm9jZXNzQ29tbWFuZFV0aWwuY3JlYXRlVGFza0Rlc2NyaXB0b3IodGFzayk7Ci0JCQlpc05ld1Rhc2tEZXNjcmlwdG9yID0gdHJ1ZTsKLQkJfSBlbHNlIHsKLQkJCWlmIChkZXNjcmlwdG9yc1RvUmVmcmVzaCAhPSBudWxsICYmIHRhc2tEZXNjLmdldElzU3luY2hyb25pemVkV2l0aFNvdXJjZSgpLmJvb2xlYW5WYWx1ZSgpKSB7Ci0JCQkJZGVzY3JpcHRvcnNUb1JlZnJlc2guYWRkKHRhc2tEZXNjKTsKLQkJCX0KLQkJfQotCQotCQlJQ29uZmlndXJhdGlvbkFwcGxpY2F0b3IgY29uZmlnQXBwbGljYXRvciA9IFByb3ZpZGVycwotCQkJCS5nZXRDb25maWd1cmF0aW9uQXBwbGljYXRvcigpOwotCQotCQlpZiAoaXNOZXdUYXNrRGVzY3JpcHRvcikgewotCQkJLy8gYWRkIGFsbCB0YXNrIHN0ZXBzIHRvIFRhc2tEZXNjcmlwdG9yIHN0ZXAgc2VsZWN0aW9uCi0JCQkvLwotCQkJTGlzdCBzdGVwcyA9IChMaXN0KSBjb25maWdBcHBsaWNhdG9yLmdldFJlZmVyZW5jZSh0YXNrCi0JCQkJCS5nZXRQcmVzZW50YXRpb24oKSwgdGFzaywgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJLmdldENvbnRlbnREZXNjcmlwdGlvbl9TZWN0aW9ucygpLCBjb25maWcpOwotCQkJdGFza0Rlc2MuZ2V0U2VsZWN0ZWRTdGVwcygpLmFkZEFsbChzdGVwcyk7Ci0JCQkKLQkJfQotCQotCQkvLyBtb3ZlZCB0aGlzIGNvZGUgdG8gQlNEcm9wQ29tbWFuZCNleGVjdXRlKCkgdG8gc3VwcG9ydCB1bmRvIGFuZAotCQkvLyBwcm9ncmVzcyBtb25pdG9yCi0JCS8vCi0JCS8vIGVsc2UgewotCQkvLyBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBzdGVwcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJLy8gT2JqZWN0IHN0ZXAgPSBpdGVyLm5leHQoKTsKLQkJLy8gaWYgKCF0YXNrRGVzYy5nZXRTZWxlY3RlZFN0ZXBzKCkuY29udGFpbnMoc3RlcCkpIHsKLQkJLy8gdGFza0Rlc2MuZ2V0U2VsZWN0ZWRTdGVwcygpLmFkZChzdGVwKTsKLQkJLy8gfQotCQkvLyB9Ci0JCS8vIH0KLQkKLQkJaWYgKHJvbGVEZXNjcmlwdG9ycyAhPSBudWxsKSB7Ci0JCQkvLyBnZXQvY3JlYXRlIHJvbGUgZGVzY3JpcHRvciBmb3IgcHJpbWFyeSBwZXJmb3JtZXJzCi0JCQkvLwotCQkJRVJlZmVyZW5jZSByZWYgPSBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrX1BlcmZvcm1lZEJ5KCk7Ci0JCQlMaXN0IHByaW1hcnlQZXJmb3JtZXJzID0gc3luY2hGZWF0dXJlcy5jb250YWlucyhyZWYpID8gKExpc3QpIGNvbmZpZ0FwcGxpY2F0b3IuZ2V0UmVmZXJlbmNlKHRhc2ssCi0JCQkJCXJlZiwgY29uZmlnKSA6IG51bGw7Ci0JCQlpZiAocHJpbWFyeVBlcmZvcm1lcnMgIT0gbnVsbCkgewotCQkJCWZvciAoaW50IGogPSAwOyBqIDwgcHJpbWFyeVBlcmZvcm1lcnMuc2l6ZSgpOyBqKyspIHsKLQkJCQkJUm9sZSByb2xlID0gKFJvbGUpIHByaW1hcnlQZXJmb3JtZXJzLmdldChqKTsKLQkJCQkJaWYgKHJvbGUgIT0gbnVsbCkgewotCQkJCQkJLy8gaWYgKFRuZ1V0aWwuaXNDb250cmlidXRvcihyb2xlKSkgewotCQkJCQkJLy8gcm9sZSA9IChSb2xlKSBUbmdVdGlsLmdldEJhc2Uocm9sZSk7Ci0JCQkJCQkvLyB9Ci0JCQkKLQkJCQkJCS8vIGNoZWNrIGZvciBsb2NhbCBkZXNjcmlwdG9yCi0JCQkJCQlSb2xlRGVzY3JpcHRvciBwcmltYXJ5Um9sZURlc2MgPSAoUm9sZURlc2NyaXB0b3IpIGdldERlc2NyaXB0b3IoCi0JCQkJCQkJCXJvbGUsIGFjdGl2aXR5LCBjb25maWcpOwotCQkJCQkJYm9vbGVhbiBpc05ld1JvbGVEZXNjcmlwdG9yID0gZmFsc2U7Ci0JCQkJCQlpZiAocHJpbWFyeVJvbGVEZXNjID09IG51bGwpIHsKLQkJCQkJCQkvLyBjaGVjayBmb3IgaW5oZXJpdGVkIGRlc2NyaXB0b3IKLQkJCQkJCQlwcmltYXJ5Um9sZURlc2MgPSAoUm9sZURlc2NyaXB0b3IpIFByb2Nlc3NDb21tYW5kVXRpbC5nZXRJbmhlcml0ZWREZXNjcmlwdG9yKAotCQkJCQkJCQkJcm9sZSwgYWN0aXZpdHksIGNvbmZpZyk7Ci0JCQkJCQkJaWYgKHByaW1hcnlSb2xlRGVzYyA9PSBudWxsKSB7Ci0JCQkJCQkJCS8vIGNoZWNrIGZvciBkZXNjcmlwdG9yIGluIHBhc3NlZCBpbiBkZXNjcmlwdG9yIGxpc3QKLQkJCQkJCQkJcHJpbWFyeVJvbGVEZXNjID0gKFJvbGVEZXNjcmlwdG9yKSBnZXREZXNjcmlwdG9yKHJvbGUsCi0JCQkJCQkJCQkJcm9sZURlc2NyaXB0b3JzLCBjb25maWcpOwotCQkJCQkJCQlpZiAocHJpbWFyeVJvbGVEZXNjID09IG51bGwpIHsKLQkJCQkJCQkJCXByaW1hcnlSb2xlRGVzYyA9IFByb2Nlc3NVdGlsLmNyZWF0ZVJvbGVEZXNjcmlwdG9yKHJvbGUpOwotCQkJCQkJCQkJaXNOZXdSb2xlRGVzY3JpcHRvciA9IHRydWU7Ci0JCQkJCQkJCQlyb2xlRGVzY3JpcHRvcnMuYWRkKHByaW1hcnlSb2xlRGVzYyk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQlpZiAoZGVzY3JpcHRvcnNUb1JlZnJlc2ggIT0gbnVsbCAmJiAhaXNOZXdSb2xlRGVzY3JpcHRvcgotCQkJCQkJCQkmJiBwcmltYXJ5Um9sZURlc2MuZ2V0SXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKCkuYm9vbGVhblZhbHVlKCkpIHsKLQkJCQkJCQlkZXNjcmlwdG9yc1RvUmVmcmVzaC5hZGQocHJpbWFyeVJvbGVEZXNjKTsKLQkJCQkJCX0KLQkJCQkJCWlmIChpc05ld1Rhc2tEZXNjcmlwdG9yICYmIGlzTmV3Um9sZURlc2NyaXB0b3IpIHsKLQkJCQkJCQl0YXNrRGVzYy5nZXRQZXJmb3JtZWRQcmltYXJpbHlCeSgpLmFkZChwcmltYXJ5Um9sZURlc2MpOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlCYXRjaENvbW1hbmQuYWRkRmVhdHVyZVZhbHVlKGRlc2NyaXB0b3JUb05ld0ZlYXR1cmVWYWx1ZXNNYXAsIHRhc2tEZXNjLAotCQkJCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCQkJLmdldFRhc2tEZXNjcmlwdG9yX1BlcmZvcm1lZFByaW1hcmlseUJ5KCksCi0JCQkJCQkJCQlwcmltYXJ5Um9sZURlc2MpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQotCQkJLy8gZ2V0L2NyZWF0ZSByb2xlIGRlc2NyaXB0b3JzIGZvciBhZGRpdGlvbmFsIHBlcmZvcm1pbmcgcm9sZXMKLQkJCS8vCi0JCQlyZWYgPSBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrX0FkZGl0aW9uYWxseVBlcmZvcm1lZEJ5KCk7CQkJCi0JCQlMaXN0IGFkZGl0aW9uYWxQZXJmb3JtZXJzID0gc3luY2hGZWF0dXJlcy5jb250YWlucyhyZWYpID8gKExpc3QpIGNvbmZpZ0FwcGxpY2F0b3IuZ2V0UmVmZXJlbmNlKAotCQkJCQl0YXNrLCByZWYsIGNvbmZpZykgOiBudWxsOwotCQkJaWYgKGFkZGl0aW9uYWxQZXJmb3JtZXJzICE9IG51bGwpIHsKLQkJCQlmb3IgKGludCBqID0gMDsgaiA8IGFkZGl0aW9uYWxQZXJmb3JtZXJzLnNpemUoKTsgaisrKSB7Ci0JCQkJCVJvbGUgcm9sZU9iaiA9IChSb2xlKSBhZGRpdGlvbmFsUGVyZm9ybWVycy5nZXQoaik7Ci0JCQkJCS8vIGNoZWNrIGZvciBsb2NhbCBkZXNjcmlwdG9yCi0JCQkJCVJvbGVEZXNjcmlwdG9yIHJvbGVEZXNjID0gKFJvbGVEZXNjcmlwdG9yKSBnZXREZXNjcmlwdG9yKAotCQkJCQkJCXJvbGVPYmosIGFjdGl2aXR5LCBjb25maWcpOwotCQkJCQlib29sZWFuIGlzTmV3Um9sZURlc2NyaXB0b3IgPSBmYWxzZTsKLQkJCQkJaWYgKHJvbGVEZXNjID09IG51bGwpIHsKLQkJCQkJCS8vIGNoZWNrIGZvciBpbmhlcml0ZWQgZGVzY3JpcHRvcgotCQkJCQkJcm9sZURlc2MgPSAoUm9sZURlc2NyaXB0b3IpIFByb2Nlc3NDb21tYW5kVXRpbC5nZXRJbmhlcml0ZWREZXNjcmlwdG9yKAotCQkJCQkJCQlyb2xlT2JqLCBhY3Rpdml0eSwgY29uZmlnKTsKLQkJCQkJCWlmIChyb2xlRGVzYyA9PSBudWxsKSB7Ci0JCQkJCQkJcm9sZURlc2MgPSAoUm9sZURlc2NyaXB0b3IpIGdldERlc2NyaXB0b3Iocm9sZU9iaiwKLQkJCQkJCQkJCXJvbGVEZXNjcmlwdG9ycywgY29uZmlnKTsKLQkJCQkJCQlpZiAocm9sZURlc2MgPT0gbnVsbCkgewotCQkJCQkJCQlyb2xlRGVzYyA9IFByb2Nlc3NVdGlsLmNyZWF0ZVJvbGVEZXNjcmlwdG9yKHJvbGVPYmopOwotCQkJCQkJCQlpc05ld1JvbGVEZXNjcmlwdG9yID0gdHJ1ZTsKLQkJCQkJCQkJcm9sZURlc2NyaXB0b3JzLmFkZChyb2xlRGVzYyk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWlmIChkZXNjcmlwdG9yc1RvUmVmcmVzaCAhPSBudWxsICYmICFpc05ld1JvbGVEZXNjcmlwdG9yCi0JCQkJCQkJJiYgcm9sZURlc2MuZ2V0SXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKCkuYm9vbGVhblZhbHVlKCkpIHsKLQkJCQkJCWRlc2NyaXB0b3JzVG9SZWZyZXNoLmFkZChyb2xlRGVzYyk7Ci0JCQkJCX0KLQkJCQkJaWYgKGlzTmV3VGFza0Rlc2NyaXB0b3IgJiYgaXNOZXdSb2xlRGVzY3JpcHRvcikgewotCQkJCQkJdGFza0Rlc2MuZ2V0QWRkaXRpb25hbGx5UGVyZm9ybWVkQnkoKS5hZGQocm9sZURlc2MpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJQmF0Y2hDb21tYW5kLmFkZEZlYXR1cmVWYWx1ZSgKLQkJCQkJCQkJZGVzY3JpcHRvclRvTmV3RmVhdHVyZVZhbHVlc01hcCwKLQkJCQkJCQkJdGFza0Rlc2MsCi0JCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJLmdldFRhc2tEZXNjcmlwdG9yX0FkZGl0aW9uYWxseVBlcmZvcm1lZEJ5KCksCi0JCQkJCQkJCXJvbGVEZXNjKTsKLQkKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQkKLQkJaWYgKHdwRGVzY3JpcHRvcnMgIT0gbnVsbCkgewotCQkJaWYgKCFpc05ld1Rhc2tEZXNjcmlwdG9yICYmICFzeW5jaEZlYXR1cmVzLmNvbnRhaW5zKFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldERlbGl2ZXJhYmxlX0RlbGl2ZXJlZFdvcmtQcm9kdWN0cygpKSkgewotCQkJCXdwZFRvRGVsaXZlcmFibGVQYXJ0c01hcCA9IG51bGw7Ci0JCQl9Ci0JCQkKLQkJCS8vIGNyZWF0ZSB3b3JrIHByb2R1Y3QgZGVzY3JpcHRvciBmb3IgaW5wdXQgd29ya3Byb2R1Y3RzCi0JCQkvLwotCQkJaWYgKGlzTmV3VGFza0Rlc2NyaXB0b3IgfHwgc3luY2hGZWF0dXJlcy5jb250YWlucyhVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrX01hbmRhdG9yeUlucHV0KCkpKSB7Ci0JCQkJY29sbGVjdFdvcmtQcm9kdWN0RGVzY3J0aXB0b3JzKHRhc2ssIHRhc2tEZXNjLCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJLmdldFRhc2tfTWFuZGF0b3J5SW5wdXQoKSwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCS5nZXRUYXNrRGVzY3JpcHRvcl9NYW5kYXRvcnlJbnB1dCgpLCBjb25maWcsIGFjdGl2aXR5LAotCQkJCQkJd3BEZXNjcmlwdG9ycywgd3BkVG9EZWxpdmVyYWJsZVBhcnRzTWFwLAotCQkJCQkJd3BkVG9EZWxpdmVyYWJsZURlc2NyaXB0b3JNYXAsIGRlc2NyaXB0b3JzVG9SZWZyZXNoLAotCQkJCQkJZGVzY3JpcHRvclRvTmV3RmVhdHVyZVZhbHVlc01hcCk7Ci0JCQl9Ci0JCQlpZiAoaXNOZXdUYXNrRGVzY3JpcHRvciB8fCBzeW5jaEZlYXR1cmVzLmNvbnRhaW5zKFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tfT3B0aW9uYWxJbnB1dCgpKSkgewotCQkJCWNvbGxlY3RXb3JrUHJvZHVjdERlc2NydGlwdG9ycyh0YXNrLCB0YXNrRGVzYywgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCS5nZXRUYXNrX09wdGlvbmFsSW5wdXQoKSwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCS5nZXRUYXNrRGVzY3JpcHRvcl9PcHRpb25hbElucHV0KCksIGNvbmZpZywgYWN0aXZpdHksCi0JCQkJCQl3cERlc2NyaXB0b3JzLCB3cGRUb0RlbGl2ZXJhYmxlUGFydHNNYXAsCi0JCQkJCQl3cGRUb0RlbGl2ZXJhYmxlRGVzY3JpcHRvck1hcCwgZGVzY3JpcHRvcnNUb1JlZnJlc2gsCi0JCQkJCQlkZXNjcmlwdG9yVG9OZXdGZWF0dXJlVmFsdWVzTWFwKTsKLQkJCX0KLQkKLQkJCS8vIGNyZWF0ZSB3b3JrIHByb2R1Y3QgZGVzY3JpcHRvciBmb3Igb3V0cHV0IHdvcmtwcm9kdWN0cwotCQkJLy8KLQkJCWlmIChpc05ld1Rhc2tEZXNjcmlwdG9yIHx8IHN5bmNoRmVhdHVyZXMuY29udGFpbnMoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza19PdXRwdXQoKSkpIHsKLQkJCQljb2xsZWN0V29ya1Byb2R1Y3REZXNjcnRpcHRvcnModGFzaywgdGFza0Rlc2MsIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkuZ2V0VGFza19PdXRwdXQoKSwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCS5nZXRUYXNrRGVzY3JpcHRvcl9PdXRwdXQoKSwgY29uZmlnLCBhY3Rpdml0eSwKLQkJCQkJCXdwRGVzY3JpcHRvcnMsIHdwZFRvRGVsaXZlcmFibGVQYXJ0c01hcCwKLQkJCQkJCXdwZFRvRGVsaXZlcmFibGVEZXNjcmlwdG9yTWFwLCBkZXNjcmlwdG9yc1RvUmVmcmVzaCwKLQkJCQkJCWRlc2NyaXB0b3JUb05ld0ZlYXR1cmVWYWx1ZXNNYXApOwotCQkJfQotCQl9Ci0JCi0JCWlmIChpc05ld1Rhc2tEZXNjcmlwdG9yKSB7Ci0JCQlyZXR1cm4gdGFza0Rlc2M7Ci0JCX0KLQkKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgVGFza0Rlc2NyaXB0b3IgY3JlYXRlVGFza0Rlc2NyaXB0b3IoVGFzayB0YXNrKSB7Ci0JCVRhc2tEZXNjcmlwdG9yIHRhc2tEZXNjID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlVGFza0Rlc2NyaXB0b3IoKTsKLQkJdGFza0Rlc2Muc2V0VGFzayh0YXNrKTsKLQkJdGFza0Rlc2Muc2V0TmFtZSh0YXNrLmdldE5hbWUoKSk7Ci0JCXRhc2tEZXNjLnNldFByZXNlbnRhdGlvbk5hbWUoU3RyVXRpbAotCQkJCS5pc0JsYW5rKHRhc2suZ2V0UHJlc2VudGF0aW9uTmFtZSgpKSA/IHRhc2suZ2V0TmFtZSgpIDogdGFzawotCQkJCS5nZXRQcmVzZW50YXRpb25OYW1lKCkpOwotCQkvLyB0YXNrRGVzYy5zZXRCcmllZkRlc2NyaXB0aW9uKHRhc2suZ2V0QnJpZWZEZXNjcmlwdGlvbigpKTsKLQkJcmV0dXJuIHRhc2tEZXNjOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgZGVsaXZlcmFibGUgcGFydHMgZm9yIHRoZSBnaXZlbiB3b3JrIHByb2R1Y3QgZGVzY3JpcHRvciBmcm9tIHRoZQotCSAqIGRlbGl2ZXJhYmxlIHdvcmsgcHJvZHVjdHMgb2YgdGhlIGdpdmVuIGRlbGl2ZXJhYmxlIGFkZCBwdXQgdGhlbSBpbgotCSAqIDxjb2RlPndwRGVzY1RvRGVsaXZlcmFibGVQYXJ0czwvY29kZT4KLQkgKiAKLQkgKiBAcGFyYW0gd3BkCi0JICogQHBhcmFtIGRlbGl2ZXJhYmxlCi0JICogQHBhcmFtIHdwRGVzY1RvRGVsaXZlcmFibGVQYXJ0cwotCSAqICAgICAgICAgICAgKG91dHB1dCkgbWFwIG9mIHdvcmsgcHJvZHVjdCBkZXNjcmlwdG9yIHRvIGl0cyBuZXdseSBjcmVhdGVkCi0JICogICAgICAgICAgICBkZWxpdmVyYWJsZSBwYXJ0cwotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBjcmVhdGVEZWxpdmVyYWJsZVBhcnRzKFdvcmtQcm9kdWN0RGVzY3JpcHRvciB3cGQsCi0JCQlEZWxpdmVyYWJsZSBkZWxpdmVyYWJsZSwgTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcsCi0JCQlNYXAgd3BEZXNjVG9EZWxpdmVyYWJsZVBhcnRzLCBTZXQgZGVzY3JpcHRvcnNUb1JlZnJlc2gpIHsKLQkJSUNvbmZpZ3VyYXRpb25BcHBsaWNhdG9yIGNvbmZpZ0FwcGxpY2F0b3IgPSBQcm92aWRlcnMKLQkJCQkuZ2V0Q29uZmlndXJhdGlvbkFwcGxpY2F0b3IoKTsKLQkKLQkJTGlzdCBkZWxpdmVyZWRXUHMgPSAoTGlzdCkgY29uZmlnQXBwbGljYXRvci5nZXRSZWZlcmVuY2UoZGVsaXZlcmFibGUsCi0JCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RGVsaXZlcmFibGVfRGVsaXZlcmVkV29ya1Byb2R1Y3RzKCksCi0JCQkJY29uZmlnKTsKLQkJTGlzdCBwYXJ0cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJaWYgKHdwZC5nZXREZWxpdmVyYWJsZVBhcnRzKCkuaXNFbXB0eSgpKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBkZWxpdmVyZWRXUHMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJcGFydHMuYWRkKFByb2Nlc3NDb21tYW5kVXRpbC5jcmVhdGVXb3JrUHJvZHVjdERlc2NyaXB0b3IoCi0JCQkJCQkoV29ya1Byb2R1Y3QpIGl0ZXIubmV4dCgpLCBjb25maWcsCi0JCQkJCQl3cERlc2NUb0RlbGl2ZXJhYmxlUGFydHMpKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGRlbGl2ZXJlZFdQcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlXb3JrUHJvZHVjdCB3b3JrUHJvZHVjdCA9IChXb3JrUHJvZHVjdCkgaXRlci5uZXh0KCk7Ci0JCQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yIGRlc2MgPSAoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBnZXREZXNjcmlwdG9yKHdvcmtQcm9kdWN0LCB3cGQuZ2V0RGVsaXZlcmFibGVQYXJ0cygpLCBjb25maWcpOwotCQkJCWlmIChkZXNjID09IG51bGwpIHsKLQkJCQkJZGVzYyA9IFByb2Nlc3NDb21tYW5kVXRpbC5jcmVhdGVXb3JrUHJvZHVjdERlc2NyaXB0b3IoCi0JCQkJCQkJd29ya1Byb2R1Y3QsIGNvbmZpZywgd3BEZXNjVG9EZWxpdmVyYWJsZVBhcnRzKTsKLQkJCQl9IGVsc2UgewotCQkJCQlpZihkZXNjcmlwdG9yc1RvUmVmcmVzaCAhPSBudWxsKSB7Ci0JCQkJCQlkZXNjcmlwdG9yc1RvUmVmcmVzaC5hZGQoZGVzYyk7Ci0JCQkJCX0KLQkJCQkJaWYgKHdvcmtQcm9kdWN0IGluc3RhbmNlb2YgRGVsaXZlcmFibGUpIHsKLQkJCQkJCWNyZWF0ZURlbGl2ZXJhYmxlUGFydHMoZGVzYywgKERlbGl2ZXJhYmxlKSB3b3JrUHJvZHVjdCwKLQkJCQkJCQkJY29uZmlnLCB3cERlc2NUb0RlbGl2ZXJhYmxlUGFydHMsIGRlc2NyaXB0b3JzVG9SZWZyZXNoKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlwYXJ0cy5hZGQoZGVzYyk7Ci0JCQl9Ci0JCX0KLQkJaWYgKCFwYXJ0cy5pc0VtcHR5KCkpIHsKLQkJCXdwRGVzY1RvRGVsaXZlcmFibGVQYXJ0cy5wdXQod3BkLCBwYXJ0cyk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHdvcmsgcHJvZHVjdCBkZXNjcmlwdG9yIGZvciB0aGUgZ2l2ZW4gd29yayBwcm9kdWN0Ci0JICogCi0JICogQHBhcmFtIHdwCi0JICogQHBhcmFtIGNvbmZpZwotCSAqIEBwYXJhbSB3cERlc2NUb0RlbGl2ZXJhYmxlUGFydHMKLQkgKiAgICAgICAgICAgIChvdXRwdXQpIG1hcCBvZiB3b3JrIHByb2R1Y3QgZGVzY3JpcHRvciB0byBpdHMgbmV3bHkgY3JlYXRlZAotCSAqICAgICAgICAgICAgZGVsaXZlcmFibGUgcGFydHMKLQkgKiBAcmV0dXJuIG5ldyBXb3JrUHJvZHVjdERlc2NyaXB0b3Igb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlCi0JICogICAgICAgICBkZXNjcmlwdG9yIGZvciB0aGUgZ2l2ZW4gd29yayBwcm9kdWN0IGFscmVhZHkgZXhpc3RzCi0JICovCi0JcHVibGljIHN0YXRpYyBXb3JrUHJvZHVjdERlc2NyaXB0b3IgY3JlYXRlV29ya1Byb2R1Y3REZXNjcmlwdG9yKAotCQkJV29ya1Byb2R1Y3Qgd3AsIE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnLAotCQkJTWFwIHdwRGVzY1RvRGVsaXZlcmFibGVQYXJ0cykgewotCQlXb3JrUHJvZHVjdERlc2NyaXB0b3Igd3BkID0gUHJvY2Vzc1V0aWwuY3JlYXRlV29ya1Byb2R1Y3REZXNjcmlwdG9yKHdwKTsKLQkJaWYgKHdwIGluc3RhbmNlb2YgRGVsaXZlcmFibGUgJiYgd3BEZXNjVG9EZWxpdmVyYWJsZVBhcnRzICE9IG51bGwpIHsKLQkJCWNyZWF0ZURlbGl2ZXJhYmxlUGFydHMod3BkLCAoRGVsaXZlcmFibGUpIHdwLCBjb25maWcsCi0JCQkJCXdwRGVzY1RvRGVsaXZlcmFibGVQYXJ0cywgbnVsbCk7Ci0JCX0KLQkJcmV0dXJuIHdwZDsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgaW5oZXJ0aWVkIGRlc2NyaXB0b3IgZm9yIHRoZSBnaXZlbiByb2xlLCB0YXNrIG9yIHdvcmtQcm9kdWN0LiBVbmxpa2UgbG9jYWwgZGVzY3JpcHRvciwgYW4gaW5oZXJpdGVkIAotCSAqIGRlc2NyaXB0b3IgdGhhdCBpcyBleHRlcm5hbGx5IHN1cHByZXNzZWQgaXMgY29uc2lkZXJlZCB2YWxpZC4KLQkgKiAKLQkgKiBAcGFyYW0gb2JqCi0JICogQHBhcmFtIGFjdGl2aXR5Ci0JICogQHJldHVybiBkZXNjcmlwdG9yIG9mIHRoZSBvYmplY3QsIG51bGwgaWYgbm90IGV4aXN0cwotCSAqLwotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IGdldEluaGVyaXRlZERlc2NyaXB0b3IoT2JqZWN0IG9iaiwgQWN0aXZpdHkgYWN0aXZpdHksIE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0JCWZvciAoVmFyaWFiaWxpdHlUeXBlIHZhcmlhYmlsaXR5VHlwZSA9IGFjdGl2aXR5LmdldFZhcmlhYmlsaXR5VHlwZSgpOwotCQkJdmFyaWFiaWxpdHlUeXBlID09IFZhcmlhYmlsaXR5VHlwZS5FWFRFTkRTIHx8IHZhcmlhYmlsaXR5VHlwZSA9PSBWYXJpYWJpbGl0eVR5cGUuTE9DQUxfQ09OVFJJQlVUSU9OOwotCQkJdmFyaWFiaWxpdHlUeXBlID0gYWN0aXZpdHkuZ2V0VmFyaWFiaWxpdHlUeXBlKCkpIHsKLQkJCVZhcmlhYmlsaXR5RWxlbWVudCBlbGVtZW50ID0gYWN0aXZpdHkuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpOwotCQotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCUFjdGl2aXR5IGJhc2VBY3Rpdml0eSA9IChBY3Rpdml0eSkgZWxlbWVudDsKLQkJCQlPYmplY3QgZGVzYyA9IGdldERlc2NyaXB0b3Iob2JqLCBiYXNlQWN0aXZpdHkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKSwgY29uZmlnLCBmYWxzZSk7Ci0JCQkJaWYoZGVzYyAhPSBudWxsKSB7Ci0JCQkJCXJldHVybiBkZXNjOwotCQkJCX0KLQkJCQlhY3Rpdml0eSA9IGJhc2VBY3Rpdml0eTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCi0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKioKLQkgKiBHZXQgdGhlIG1hcCBvZiB0YXNrIHRvIGZlYXR1cmVzIHRoYXQgY29udGFpbiB0aGUgd29yayBwcm9kdWN0IAotCSAqIChpbnB1dCBvciBvdXRwdXQgb2YgdGhlIHRhc2spCi0JICogCi0JICogQHBhcmFtIHRhc2tzCi0JICogQHBhcmFtIHdwCi0JICogQHJldHVybiBNYXAgb2YgdGFzayB0byBmZWF0dXJlcyB0aGF0IGNvbnRhaW4gdGhlIHdvcmsgcHJvZHVjdAotCSAqLwotCXB1YmxpYyBzdGF0aWMgTWFwIGdldEZlYXR1cmVzTWFwKExpc3QgdGFza3MsIFdvcmtQcm9kdWN0IHdwLCBNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZykgewotCQlNYXAgZmVhdHVyZXNNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQlFUmVmZXJlbmNlW10gdGFza0ZlYXR1cmVzID0gewotCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tfTWFuZGF0b3J5SW5wdXQoKSwKLQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrX09wdGlvbmFsSW5wdXQoKSwKLQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrX091dHB1dCgpCi0JCX07Ci0JCWZvciAoaW50IGkgPSB0YXNrcy5zaXplKCkgLSAxOyBpID4gLTE7IGktLSkgewotCQkJVGFzayB0YXNrID0gKFRhc2spIHRhc2tzLmdldChpKTsKLQkJCWZvciAoaW50IGogPSAwOyBqIDwgdGFza0ZlYXR1cmVzLmxlbmd0aDsgaisrKSB7Ci0JCQkJRVJlZmVyZW5jZSBmZWF0dXJlID0gdGFza0ZlYXR1cmVzW2pdOwotCQkJCU9iamVjdCB2YWx1ZSA9IFByb3ZpZGVycy5nZXRDb25maWd1cmF0aW9uQXBwbGljYXRvcigpLmdldFJlZmVyZW5jZSh0YXNrLCBmZWF0dXJlLCBjb25maWcpOwotCQkJCWlmKChmZWF0dXJlLmlzTWFueSgpICYmICgoTGlzdCl2YWx1ZSkuY29udGFpbnMod3ApKSB8fAotCQkJCQkJdmFsdWUgPT0gd3ApIAotCQkJCXsKLQkJCQkJQ29sbGVjdGlvbiBmZWF0dXJlcyA9IChDb2xsZWN0aW9uKSBmZWF0dXJlc01hcC5nZXQodGFzayk7Ci0JCQkJCWlmKGZlYXR1cmVzID09IG51bGwpIHsKLQkJCQkJCWZlYXR1cmVzID0gbmV3IEFycmF5TGlzdCgpOwkKLQkJCQkJCWZlYXR1cmVzTWFwLnB1dCh0YXNrLCBmZWF0dXJlcyk7Ci0JCQkJCX0KLQkJCQkJZmVhdHVyZXMuYWRkKGZlYXR1cmUpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZmVhdHVyZXNNYXA7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvUHJvY2Vzc0RlZXBDb3B5Q29tbWFuZC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvUHJvY2Vzc0RlZXBDb3B5Q29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNmJmMDQ0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL1Byb2Nlc3NEZWVwQ29weUNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklDb25maWd1cmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuTmVzdGVkQ29tbWFuZEV4Y2VjdXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VydmljZXMuSUxpYnJhcnlQZXJzaXN0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzLlNlcnZpY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcnlQcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc1BhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotCi0vKioKLSAqIFBoeXNpY2FsbHkgY29waWVzIGEgcHJvY2VzcyB3aXRoIGFsbCBvZiBpdHMgZGlyZWN0IG9yIGluaGVyaXRlZCBzdHJ1Y3R1cmFsIGZlYXR1cmVzIGFuZCByZWZlcmVuY2VzLgotICogQWRkIHRoZSBuZXdseSBjcmVhdGVkIHByb2Nlc3MgdG8gdGhlIHNwZWNpZmllZCBwcm9jZXNzIHBhY2thZ2UuCi0gKiAgICAKLSAqIFRoaXMgY2xhc3MgZXh0ZW5kcyB0aGUgQWN0aXZpdHlEZWVwQ29weUNvbW1hbmQgdG8gcmV1c2UgbW9zdCBvZiBpdCdzIGZ1bmN0aW9uYWxpdHkuCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlICAxLjAKLSAqLwotcHVibGljIGNsYXNzIFByb2Nlc3NEZWVwQ29weUNvbW1hbmQgZXh0ZW5kcyBBY3Rpdml0eURlZXBDb3B5Q29tbWFuZCB7Ci0KLQlwcml2YXRlIFByb2Nlc3NQYWNrYWdlIHRhcmdldFBhY2thZ2U7Ci0JcHJpdmF0ZSBQcm9jZXNzQ29tcG9uZW50IHRlbXBQYzsKLQlwcml2YXRlIFN0cmluZyBuZXdQcm9jZXNzTmFtZTsKLQlwcml2YXRlIE5lc3RlZENvbW1hbmRFeGNlY3V0b3IgbmVzdGVkQ29tbWFuZEV4ZWN1dG9yOwotCQotCXB1YmxpYyBQcm9jZXNzRGVlcENvcHlDb21tYW5kKG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzcyBwcm9jZXNzLCBTdHJpbmcgbmV3UHJvY2Vzc05hbWUsCi0JCQlDb3B5SGVscGVyIGNvcHlIZWxwZXIsIE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnLCBQcm9jZXNzUGFja2FnZSB0YXJnZXRQYWNrYWdlLAotCQkJSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLElDb25maWd1cmF0b3IgY29uZmlndXJhdG9yKSB7Ci0KLQkJc3VwZXIocHJvY2VzcywgY29weUhlbHBlciwgY29uZmlnLCBudWxsLCBtb25pdG9yLCBjb25maWd1cmF0b3IpOwotCi0JCXRoaXMubmV3UHJvY2Vzc05hbWUgPSBuZXdQcm9jZXNzTmFtZTsJCQotCQl0aGlzLnRhcmdldFBhY2thZ2UgPSB0YXJnZXRQYWNrYWdlOwotCQljcmVhdGV0YXJnZXRQcm9jZXNzKCk7Ci0JCS8vVE9ETzogZGlzYWJsZSBjb3B5aW5nIGRpYWdyYW1zIGZvciBub3cKLQkJLy8KLS8vCQluZXN0ZWRDb21tYW5kRXhlY3V0b3IgPSBuZXcgTmVzdGVkQ29tbWFuZEV4Y2VjdXRvcih0aGlzKTsKLQl9CQotCQotCXB1YmxpYyBNZXRob2RDb25maWd1cmF0aW9uIGdldE1ldGhvZENvbmZpZ3VyYXRpb24oKSB7Ci0JCXJldHVybiBjb25maWc7Ci0JfQkKLQkKLQlwdWJsaWMgUHJvY2VzcyBnZXRUYXJnZXRQcm9jZXNzKCkgewotCQlyZXR1cm4gdGFyZ2V0UHJvY2VzczsKLQl9Ci0JCi0JcHVibGljIFByb2Nlc3MgZ2V0U291cmNlUHJvY2VzcygpIHsKLQkJcmV0dXJuIChQcm9jZXNzKSBhY3Rpdml0eTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZXRhcmdldFByb2Nlc3MoKSB7Ci0JCS8vIGNyZWF0ZSBhIHBsYWNlaG9sZGVyIGZvciB0aGUgbmV3IHByb2Nlc3MKLQkJLy8gc2luY2UgdGhlIGNvbnRlbnQgcHJvY2Vzc29yIG5lZWRzIHRvIGtub3cgdGhlIHRhcmV0IHByb2Nlc3MgaW4gb3JkZXIgdG8gZml4IHRoZSB1cmxzCi0JCQotCQl0ZW1wUGMgPSBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQcm9jZXNzQ29tcG9uZW50KCk7Ci0JCXRhcmdldFBhY2thZ2UuZ2V0Q2hpbGRQYWNrYWdlcygpLmFkZCh0ZW1wUGMpOwotCQkKLQkJaWYgKCBzdXBlci5hY3Rpdml0eSBpbnN0YW5jZW9mIERlbGl2ZXJ5UHJvY2VzcyApIHsKLQkJCXRhcmdldFByb2Nlc3MgPSBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVEZWxpdmVyeVByb2Nlc3MoKTsKLQkJfSBlbHNlIHsKLQkJCXRhcmdldFByb2Nlc3MgPSBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVDYXBhYmlsaXR5UGF0dGVybigpOwkJCQotCQl9Ci0JCXRhcmdldFByb2Nlc3Muc2V0TmFtZShuZXdQcm9jZXNzTmFtZSk7Ci0JCXRhcmdldFByb2Nlc3Muc2V0UHJlc2VudGF0aW9uTmFtZShuZXdQcm9jZXNzTmFtZSk7Ci0JCXRlbXBQYy5zZXROYW1lKG5ld1Byb2Nlc3NOYW1lKTsKLQotCQl0ZW1wUGMuc2V0UHJvY2Vzcyh0YXJnZXRQcm9jZXNzKTsJCQotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlpZihuZXN0ZWRDb21tYW5kRXhlY3V0b3IgIT0gbnVsbCkgewotCQkJbmVzdGVkQ29tbWFuZEV4ZWN1dG9yLmRpc3Bvc2UoKTsKLQkJfQotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29weUNvbW1hbmQjZXhlY3V0ZSgpCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsJCQkJCi0JCXN1cGVyLmV4ZWN1dGUoKTsJCi0JCQkJCi0JCS8vIG5ldyBjb3B5IG9mIHRoZSBwcm9jZXNzIG11c3QgYmUgc2F2ZWQgc28gb3RoZXIgbmVzdGVkIGNvbW1hbmRzIGxpa2UgZGlhZ3JhbSBjb3B5IGNvbW1hbmQgCi0JCS8vIGNhbiBiZSBleGVjdXRlZC4KLQkJaWYocGtnQ29weSAhPSBudWxsICYmIHBrZ0NvcHkgaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50KSB7Ci0JCQlJTGlicmFyeVBlcnNpc3Rlci5GYWlsU2FmZU1ldGhvZExpYnJhcnlQZXJzaXN0ZXIgcGVyc2lzdGVyID0gU2VydmljZXMuZ2V0RGVmYXVsdExpYnJhcnlQZXJzaXN0ZXIoKS5nZXRGYWlsU2FmZVBlcnNpc3RlcigpOwotCQkJdHJ5IHsKLQkJCQlwZXJzaXN0ZXIuc2F2ZShwa2dDb3B5LmVSZXNvdXJjZSgpKTsKLQkJCQlwZXJzaXN0ZXIuY29tbWl0KCk7Ci0JCQl9Ci0JCQljYXRjaChFeGNlcHRpb24gZSkgewotCQkJCUxpYnJhcnlFZGl0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCQl0cnkgewotCQkJCQlwZXJzaXN0ZXIucm9sbGJhY2soKTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCQkJTGlicmFyeUVkaXRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQkJaWYobmVzdGVkQ29tbWFuZEV4ZWN1dG9yICE9IG51bGwpIHsKLQkJCW5lc3RlZENvbW1hbmRFeGVjdXRvci5leGVjdXRlTmVzdGVkQ29tbWFuZHMoKTsKLQkJfQotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1bmRvKCkgewotCQlpZihuZXN0ZWRDb21tYW5kRXhlY3V0b3IgIT0gbnVsbCkgewotCQkJbmVzdGVkQ29tbWFuZEV4ZWN1dG9yLnVuZG9OZXN0ZWRDb21tYW5kcygpOwotCQl9Ci0JCXN1cGVyLnVuZG8oKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgZml4UHJvY2Vzc0NvbXBvbmVudCgpIHsKLQkJLy8gcmVwbGFjZSB0aGUgcGxhY2UgaG9sZGVyIHdpdGggdGhlIGFjdHVhbCBjb3BpZWQgcHJvY2VzcwotCQlpZiAocGtnQ29weSBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQgKSB7Ci0JCQlwa2dDb3B5LnNldE5hbWUobmV3UHJvY2Vzc05hbWUpOwotCQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzIHByb2MgPSAoKFByb2Nlc3NDb21wb25lbnQpcGtnQ29weSkuZ2V0UHJvY2VzcygpOwotCQkJcHJvYy5zZXROYW1lKG5ld1Byb2Nlc3NOYW1lKTsKLQkJCXByb2Muc2V0UHJlc2VudGF0aW9uTmFtZShuZXdQcm9jZXNzTmFtZSk7Ci0JCQl0YXJnZXRQcm9jZXNzID0gcHJvYzsKLQkJCUVjb3JlVXRpbC5yZXBsYWNlKHRlbXBQYywgcGtnQ29weSk7Ci0JCX0KLQl9Ci0JCi0JLyogCi0JICogcmV0dXJucyBhIENvbGxlY3Rpb24gY29udGFpbmluZyB0aGUgbmV3IHByb2Nlc3MKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21wb3VuZENvbW1hbmQjZ2V0UmVzdWx0KCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbjw/PiBnZXRSZXN1bHQoKSB7Ci0JCWlmKHBrZ0NvcHkgIT0gbnVsbCAmJiBwa2dDb3B5IGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkgewotCQkJcmV0dXJuIENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QoICgoUHJvY2Vzc0NvbXBvbmVudClwa2dDb3B5KS5nZXRQcm9jZXNzKCkpOwotCQl9Ci0JCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCX0JCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9Qcm9jZXNzRWxlbWVudEFkZENvbW1hbmQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL1Byb2Nlc3NFbGVtZW50QWRkQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZWY2NDE1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL1Byb2Nlc3NFbGVtZW50QWRkQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSVJlc291cmNlQXdhcmVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5NZXRob2RFbGVtZW50QWRkQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb24uSVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb24uSVZhbGlkYXRvckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlIC0gU2VwIDE2LCAyMDA1Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9jZXNzRWxlbWVudEFkZENvbW1hbmQgZXh0ZW5kcyBNZXRob2RFbGVtZW50QWRkQ29tbWFuZCAKLWltcGxlbWVudHMgSVJlc291cmNlQXdhcmVDb21tYW5kCi17Ci0KLQlwdWJsaWMgUHJvY2Vzc0VsZW1lbnRBZGRDb21tYW5kKENvbW1hbmQgY29tbWFuZCkgewotCQkvLyBkaXNhYmxlIHJ1biB3aXRoIHByb2dyZXNzIGJhciB3aGVuIGFkZGluZyBpbiBwcm9jZXNzIGVkaXRvcgotCQkvLwotCQlzdXBlcihjb21tYW5kLCBmYWxzZSk7Ci0JfQotCi0JcHVibGljIFByb2Nlc3NFbGVtZW50QWRkQ29tbWFuZChDb21tYW5kIGNvbW1hbmQsIGJvb2xlYW4gcnVuV2l0aFByb2dyZXNzKSB7Ci0JCXN1cGVyKGNvbW1hbmQsIHJ1bldpdGhQcm9ncmVzcyk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5jb21tYW5kLk1ldGhvZEVsZW1lbnRBZGRDb21tYW5kI2dldEZlYXR1cmVzVG9DaGVjaygpCi0JICovCi0JcHJvdGVjdGVkIENvbGxlY3Rpb24gZ2V0RmVhdHVyZXNUb0NoZWNrKCkgewotCQlpZiAoZmVhdHVyZXNUb0NoZWNrID09IG51bGwpIHsKLQkJCXN1cGVyLmdldEZlYXR1cmVzVG9DaGVjaygpLmFkZCgKLQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkuZ2V0TWV0aG9kRWxlbWVudF9QcmVzZW50YXRpb25OYW1lKCkpOwotCQl9Ci0JCXJldHVybiBmZWF0dXJlc1RvQ2hlY2s7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5NZXRob2RFbGVtZW50QWRkQ29tbWFuZCN3aWxsU2F2ZU1vZGlmaWVkUmVzb3VyY2VzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiB3aWxsU2F2ZU1vZGlmaWVkUmVzb3VyY2VzKCkgewotCQkvLyBkb24ndCBzYXZlIHRoZSByZXNvdXJjZXMgYWZ0ZXIgZWFjaCBhZGQKLQkJLy8KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuY29tbWFuZC5NZXRob2RFbGVtZW50QWRkQ29tbWFuZCNzYXZlTW9kaWZpZWRSZXNvdXJjZXMoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNhdmVNb2RpZmllZFJlc291cmNlcygpIHsKLQkJLy8gZG9uJ3Qgc2F2ZSB0aGUgcmVzb3VyY2VzIGFmdGVyIGVhY2ggYWRkCi0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLk1ldGhvZEVsZW1lbnRBZGRDb21tYW5kI2NyZWF0ZVZhbGlkYXRvcihvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCwgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZSkKLQkgKi8KLQlwcm90ZWN0ZWQgSVZhbGlkYXRvciBjcmVhdGVWYWxpZGF0b3IoRU9iamVjdCBlLCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSkgewotCQlFZGl0aW5nRG9tYWluIGRvbWFpbiA9IGFkZENvbW1hbmQuZ2V0RG9tYWluKCk7Ci0JCWlmIChlIGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudAotCQkJCSYmIGFkZENvbW1hbmQuZ2V0RmVhdHVyZSgpIGluc3RhbmNlb2YgRVJlZmVyZW5jZQotCQkJCSYmIGRvbWFpbiBpbnN0YW5jZW9mIEFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbikgewotCQkJcmV0dXJuIElWYWxpZGF0b3JGYWN0b3J5LklOU1RBTkNFLmNyZWF0ZVZhbGlkYXRvcihhZGRDb21tYW5kLmdldE93bmVyKCksIG51bGwsIGUsCi0JCQkJCWZlYXR1cmUsICgoQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluKSBkb21haW4pLmdldEFkYXB0ZXJGYWN0b3J5KCkpOwotCQl9Ci0JCXJldHVybiBzdXBlci5jcmVhdGVWYWxpZGF0b3IoZSwgZmVhdHVyZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvUHJvY2Vzc0VsZW1lbnREZWxldGVDb21tYW5kLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9Qcm9jZXNzRWxlbWVudERlbGV0ZUNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmY2ODY2MS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9Qcm9jZXNzRWxlbWVudERlbGV0ZUNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQWJzdHJhY3RUcmVlSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuUmVtb3ZlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuRGVsZXRlTWV0aG9kRWxlbWVudENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFydGlmYWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5Db250ZW50RGVzY3JpcHRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5VbWFVdGlsOwotCi0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUgLSBKYW4gMjYsIDIwMDYKLSAqIEBzaW5jZSAgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9jZXNzRWxlbWVudERlbGV0ZUNvbW1hbmQgZXh0ZW5kcwotCQlEZWxldGVNZXRob2RFbGVtZW50Q29tbWFuZCB7Ci0JcHJpdmF0ZSBTZXQgY29udGVudHNUb1JlbW92ZTsKLQotCXByaXZhdGUgQXJyYXlMaXN0IGVsZW1lbnRzVG9SZW1vdmVSZWZlcmVuY2VzOwotCi0JcHJpdmF0ZSBib29sZWFuIG93bmVkRWxlbWVudHNJbmNsdWRlZDsKLQotCS8qKgotCSAqIEBwYXJhbSBjb21tYW5kCi0JICogQHBhcmFtIGVsZW1lbnRzCi0JICovCi0JcHVibGljIFByb2Nlc3NFbGVtZW50RGVsZXRlQ29tbWFuZChDb21tYW5kIGNvbW1hbmQsIENvbGxlY3Rpb24gZWxlbWVudHMpIHsKLQkJc3VwZXIoY29tbWFuZCwgZWxlbWVudHMpOwotCX0KLQkKLQkvKioKLQkgKiBAcGFyYW0gY29tbWFuZAotCSAqIEBwYXJhbSBlbGVtZW50cwotCSAqIEBwYXJhbSBjb25maXJtUmVtb3ZlUmVmcwotCSAqLwotCXB1YmxpYyBQcm9jZXNzRWxlbWVudERlbGV0ZUNvbW1hbmQoQ29tbWFuZCBjb21tYW5kLCBDb2xsZWN0aW9uIGVsZW1lbnRzLCBib29sZWFuIGNvbmZpcm1SZW1vdmVSZWZzKSB7Ci0JCXN1cGVyKGNvbW1hbmQsIGVsZW1lbnRzLCBjb25maXJtUmVtb3ZlUmVmcyk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLkRlbGV0ZU1ldGhvZEVsZW1lbnRDb21tYW5kI2V4ZWN1dGUoKQotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCWlmKCFvd25lZEVsZW1lbnRzSW5jbHVkZWQpIHsKLQkJCUNvbGxlY3Rpb24gb3duZWRFbGVtZW50cyA9IGdldE93bmVkRWxlbWVudHMoZWxlbWVudHMpOwotCQkJaWYoIW93bmVkRWxlbWVudHMuaXNFbXB0eSgpKSB7Ci0JCQkJaW5jbHVkZUVsZW1lbnRzKG93bmVkRWxlbWVudHMpOwotCQkJfQotCQkJb3duZWRFbGVtZW50c0luY2x1ZGVkID0gdHJ1ZTsKLQkJfQotCQkKLQkJc3VwZXIuZXhlY3V0ZSgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgQ29sbGVjdGlvbiBnZXRPd25lZEVsZW1lbnRzKENvbGxlY3Rpb24gZWxlbWVudHMpIHsKLQkJQXJyYXlMaXN0IG93bmVkRWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGVsZW1lbnRzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGVsZW1lbnQgPSAoT2JqZWN0KSBpdGVyLm5leHQoKTsKLQkJCWlmKGVsZW1lbnQgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3IpIHsKLQkJCQlXb3JrUHJvZHVjdERlc2NyaXB0b3Igd3BkID0gKChXb3JrUHJvZHVjdERlc2NyaXB0b3IpZWxlbWVudCk7Ci0JCQkJV29ya1Byb2R1Y3Qgd3AgPSB3cGQuZ2V0V29ya1Byb2R1Y3QoKTsKLQkJCQlpZih3cCBpbnN0YW5jZW9mIEFydGlmYWN0KSB7Ci0JCQkJCUl0ZXJhdG9yIGl0ZXIxID0gbmV3IEFic3RyYWN0VHJlZUl0ZXJhdG9yKHdwLCBmYWxzZSkgewotCi0JCQkJCQkvKioKLQkJCQkJCSAqIENvbW1lbnQgZm9yIDxjb2RlPnNlcmlhbFZlcnNpb25VSUQ8L2NvZGU+Ci0JCQkJCQkgKi8KLQkJCQkJCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDQyMjE4MTc4MjI2ODg3ODI4OUw7Ci0KLQkJCQkJCXByb3RlY3RlZCBJdGVyYXRvciBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJCQkJcmV0dXJuICgoQXJ0aWZhY3Qpb2JqZWN0KS5nZXRDb250YWluZWRBcnRpZmFjdHMoKS5pdGVyYXRvcigpOwotCQkJCQkJfQotCQkJCQkJCi0JCQkJCX07Ci0JCQkJCUhhc2hTZXQgd29ya1Byb2R1Y3RzID0gbmV3IEhhc2hTZXQoKTsKLQkJCQkJd2hpbGUoaXRlcjEuaGFzTmV4dCgpKSB7Ci0JCQkJCQl3b3JrUHJvZHVjdHMuYWRkKGl0ZXIxLm5leHQoKSk7Ci0JCQkJCX0KLQkJCQkJQWN0aXZpdHkgYWN0aXZpdHkgPSBVbWFVdGlsLmdldFBhcmVudEFjdGl2aXR5KHdwZCk7Ci0JCQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBhY3Rpdml0eS5nZXRCcmVha2Rvd25FbGVtZW50cygpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCQkJCU9iamVjdCBiZSA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJCWlmIChiZSBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0RGVzY3JpcHRvcgotCQkJCQkJCQkmJiB3b3JrUHJvZHVjdHMuY29udGFpbnMoKChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIGJlKQotCQkJCQkJCQkJCS5nZXRXb3JrUHJvZHVjdCgpKSkgewotCQkJCQkJCW93bmVkRWxlbWVudHMuYWRkKGJlKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQkKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG93bmVkRWxlbWVudHM7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZXhjbHVkZUVsZW1lbnRzKENvbGxlY3Rpb24gZXhjbHVkZWRFbGVtZW50cykgewotCQllbGVtZW50cy5yZW1vdmVBbGwoZXhjbHVkZWRFbGVtZW50cyk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGV4Y2x1ZGVkRWxlbWVudHMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZWxlbWVudCA9IChPYmplY3QpIGl0ZXIubmV4dCgpOwotCQkJUmVtb3ZlQ29tbWFuZCBjbWQgPSBnZXRSZW1vdmVDb21tYW5kKGVsZW1lbnQpOwotCQkJaWYoY21kICE9IG51bGwpIHsKLQkJCQljbWQuZ2V0Q29sbGVjdGlvbigpLnJlbW92ZShlbGVtZW50KTsKLQkJCX0KLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBpbmNsdWRlRWxlbWVudHMoQ29sbGVjdGlvbiBpbmNsdWRlZEVsZW1lbnRzKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGluY2x1ZGVkRWxlbWVudHMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZWxlbWVudCA9IGl0ZXIubmV4dCgpOwotCQkJaWYoIWVsZW1lbnRzLmNvbnRhaW5zKGVsZW1lbnQpKSB7Ci0JCQkJZWxlbWVudHMuYWRkKGVsZW1lbnQpOwotCQkJCVJlbW92ZUNvbW1hbmQgY21kID0gZ2V0UmVtb3ZlQ29tbWFuZChlbGVtZW50KTsKLQkJCQlpZihjbWQgIT0gbnVsbCkgewotCQkJCQlDb2xsZWN0aW9uIGNvbGxlY3Rpb24gPSBjbWQuZ2V0Q29sbGVjdGlvbigpOwotCQkJCQlpZighY29sbGVjdGlvbi5jb250YWlucyhlbGVtZW50KSkgewotCQkJCQkJY29sbGVjdGlvbi5hZGQoZWxlbWVudCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRFbGVtZW50c1RvUmVtb3ZlUmVmZXJlbmNlcygpIHsKLQkJaWYgKGVsZW1lbnRzVG9SZW1vdmVSZWZlcmVuY2VzID09IG51bGwpIHsKLQkJCWVsZW1lbnRzVG9SZW1vdmVSZWZlcmVuY2VzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gZWxlbWVudHMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyLm5leHQoKTsKLQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJCUVPYmplY3QgcGtnID0gKChBY3Rpdml0eSkgZWxlbWVudCkuZUNvbnRhaW5lcigpOwotCQkJCQlpZiAocGtnICE9IG51bGwpIHsKLQkJCQkJCWVsZW1lbnRzVG9SZW1vdmVSZWZlcmVuY2VzLmFkZChwa2cpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJZWxlbWVudHNUb1JlbW92ZVJlZmVyZW5jZXMuYWRkKGVsZW1lbnQpOwotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJZWxlbWVudHNUb1JlbW92ZVJlZmVyZW5jZXMuYWRkKGVsZW1lbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZWxlbWVudHNUb1JlbW92ZVJlZmVyZW5jZXM7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gY2FuUmVtb3ZlUmVmZXJlbmNlcyhvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQgZSkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVSZWZlcmVuY2VzKCkgewotCQljb250ZW50c1RvUmVtb3ZlID0gbmV3IEhhc2hTZXQoKTsKLQkJLy8gaGF2ZSB0byByZW1vdmUgdGhlIGRlbGV0ZWQgcHJvY2VzcyBlbGVtZW50cyBmcm9tIGl0cyBjb250YWluZXIKLQkJLy8gYW5kL29yIHJlc291cmNlCi0JCS8vIHNvIHN1cGVyLnJlbW92ZVJlZmVyZW5jZXMoKSBjYW4gcmVtb3ZlIHRoZWlyIHJlZmVyZW5jZXMKLQkJLy8KLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZWxlbWVudHMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3Qgb2JqID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgRU9iamVjdCkgewotCQkJCUVPYmplY3QgZU9iaiA9IChFT2JqZWN0KSBvYmo7Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJCUFjdGl2aXR5IGFjdCA9IChBY3Rpdml0eSkgb2JqOwotCi0JCQkJCS8vIHJlbW92ZSBjb250ZW50IG9mIHRoZSBhY3Rpdml0eSBmcm9tIGl0cyByZXNvdXJjZQotCQkJCQkvLwotCQkJCQkvLyByZW1vdmVDb250ZW50RnJvbVJlc291cmNlKGFjdCwgbW9kaWZpZWRSZXNvdXJjZXMpOwotCQkJCQlpZiAoQ29udGVudERlc2NyaXB0aW9uRmFjdG9yeS5oYXNQcmVzZW50YXRpb24oYWN0KSkgewotCQkJCQkJY29udGVudHNUb1JlbW92ZS5hZGQoYWN0LmdldFByZXNlbnRhdGlvbigpKTsKLQkJCQkJfQotCi0JCQkJCS8vIHJlbW92ZSB0aGUgcHJvY2VzcyBwYWNrYWdlIG9mIHRoaXMgYWN0aXZpdHkKLQkJCQkJLy8KLQkJCQkJRU9iamVjdCBjb250YWluZXIgPSBlT2JqLmVDb250YWluZXIoKTsKLQkJCQkJaWYgKGNvbnRhaW5lciAhPSBudWxsKSB7Ci0JCQkJCQlFY29yZVV0aWwucmVtb3ZlKGNvbnRhaW5lcik7Ci0JCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gY29udGFpbmVyLmVBbGxDb250ZW50cygpOyBpdGVyYXRvcgotCQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJCU9iamVjdCBlbGVtZW50ID0gaXRlcmF0b3IubmV4dCgpOwotCQkJCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQkJCQkJYWN0ID0gKEFjdGl2aXR5KSBlbGVtZW50OwotCi0JCQkJCQkJCS8vIHJlbW92ZSBjb250ZW50IG9mIHRoZSBhY3Rpdml0eSBmcm9tIGl0cwotCQkJCQkJCQkvLyByZXNvdXJjZQotCQkJCQkJCQkvLwotCQkJCQkJCQkvLyByZW1vdmVDb250ZW50RnJvbVJlc291cmNlKGFjdCwKLQkJCQkJCQkJLy8gbW9kaWZpZWRSZXNvdXJjZXMpOwotCQkJCQkJCQlpZiAoQ29udGVudERlc2NyaXB0aW9uRmFjdG9yeQotCQkJCQkJCQkJCS5oYXNQcmVzZW50YXRpb24oYWN0KSkgewotCQkJCQkJCQkJY29udGVudHNUb1JlbW92ZS5hZGQoYWN0Ci0JCQkJCQkJCQkJCS5nZXRQcmVzZW50YXRpb24oKSk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQlFY29yZVV0aWwucmVtb3ZlKChFT2JqZWN0KSBvYmopOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXN1cGVyLnJlbW92ZVJlZmVyZW5jZXMoKTsKLQl9Ci0JCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBEZWxldGVNZXRob2RFbGVtZW50Q29tbWFuZCNkZWxldGVDb250ZW50KCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkZWxldGVDb250ZW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGNvbnRlbnRzVG9SZW1vdmUuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlFY29yZVV0aWwucmVtb3ZlKChFT2JqZWN0KSBpdGVyLm5leHQoKSk7Ci0JCX0KLQkJZWxlbWVudHNUb0RlbGV0ZUNvbnRlbnQuYWRkQWxsKGNvbnRlbnRzVG9SZW1vdmUpOwotCQlzdXBlci5kZWxldGVDb250ZW50KCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLkRlbGV0ZU1ldGhvZEVsZW1lbnRDb21tYW5kI2NvbGxlY3RPYmplY3RzVG9SZW1vdmUoamF2YS51dGlsLkNvbGxlY3Rpb24sIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0LCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCwgamF2YS51dGlsLkNvbGxlY3Rpb24pCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gY29sbGVjdE9iamVjdHNUb1JlbW92ZShDb2xsZWN0aW9uIG9iamVjdHNUb1JlbW92ZSwgRU9iamVjdCBlbGVtZW50VG9EZWxldGUsIEVPYmplY3QgcmVmZXJlbmNlciwgQ29sbGVjdGlvbiByZWZlcmVuY2VzKSB7Ci0JCWJvb2xlYW4gcmV0ID0gc3VwZXIuY29sbGVjdE9iamVjdHNUb1JlbW92ZShvYmplY3RzVG9SZW1vdmUsIGVsZW1lbnRUb0RlbGV0ZSwKLQkJCQlyZWZlcmVuY2VyLCByZWZlcmVuY2VzKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gcmVmZXJlbmNlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCUVSZWZlcmVuY2UgcmVmID0gKEVSZWZlcmVuY2UpIGl0ZXIubmV4dCgpOwotCQkJaWYocmVmID09IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFVNQVNlbWFudGljTW9kZWxCcmlkZ2VfRWxlbWVudCgpKSB7Ci0JCQkJRU9iamVjdCBjb250YWluZXIgPSByZWZlcmVuY2VyLmVDb250YWluZXIoKTsKLQkJCQlpZihjb250YWluZXIgIT0gbnVsbCAmJiBjb250YWluZXIuZUNvbnRhaW5lcigpICE9IG51bGwpIHsKLQkJCQkJb2JqZWN0c1RvUmVtb3ZlLmFkZChjb250YWluZXIpOwotCQkJCQlyZXQgPSB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gcmV0OwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZFdyYXBwZXIjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJaWYoY29udGVudHNUb1JlbW92ZSAhPSBudWxsKSB7Ci0JCQljb250ZW50c1RvUmVtb3ZlLmNsZWFyKCk7Ci0JCX0KLQkJaWYoZWxlbWVudHNUb1JlbW92ZVJlZmVyZW5jZXMgIT0gbnVsbCkgewotCQkJZWxlbWVudHNUb1JlbW92ZVJlZmVyZW5jZXMuY2xlYXIoKTsKLQkJfQotCQkKLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL1JlbW92ZVVudXNlZERlc2NyaXB0b3JzQ29tbWFuZC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvUmVtb3ZlVW51c2VkRGVzY3JpcHRvcnNDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmZDZjNzMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvUmVtb3ZlVW51c2VkRGVzY3JpcHRvcnNDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5BYnN0cmFjdENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklSZXNvdXJjZUF3YXJlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkFzc29jaWF0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5VbWFVdGlsOwotCi0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUgLSBOb3YgMzAsIDIwMDUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFJlbW92ZVVudXNlZERlc2NyaXB0b3JzQ29tbWFuZCBleHRlbmRzIEFic3RyYWN0Q29tbWFuZCBpbXBsZW1lbnRzCi0JCUlSZXNvdXJjZUF3YXJlQ29tbWFuZCB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIE9iamVjdFtdIFRBU0tfREVTQ1JJUFRPUl9fUkVMQVRJT05TSElQUyA9IHsKLQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza0Rlc2NyaXB0b3JfQWRkaXRpb25hbGx5UGVyZm9ybWVkQnkoKSwJCQotCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrRGVzY3JpcHRvcl9Bc3Npc3RlZEJ5KCksCi0JCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tEZXNjcmlwdG9yX1BlcmZvcm1lZFByaW1hcmlseUJ5KCksCi0JCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tEZXNjcmlwdG9yX01hbmRhdG9yeUlucHV0KCksCi0JCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tEZXNjcmlwdG9yX0V4dGVybmFsSW5wdXQoKSwKLQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza0Rlc2NyaXB0b3JfT3B0aW9uYWxJbnB1dCgpLAotCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrRGVzY3JpcHRvcl9PdXRwdXQoKQotCX07Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBPYmplY3RbXSBST0xFX0RFU0NSSVBUT1JfX1JFTEFUSU9OU0hJUFMgPSB7Ci0JCUFzc29jaWF0aW9uSGVscGVyLlJvbGVEZXNjcmlwdG9yX0Fzc2lzdHNJbl9UYXNrRGVzY3JpcHRvcnMsCi0JCUFzc29jaWF0aW9uSGVscGVyLlJvbGVEZXNjcmlwdG9yX0FkZGl0aW9uYWxUYXNrRGVzY3JpcHRvcnMsCi0JCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFJvbGVEZXNjcmlwdG9yX1Jlc3BvbnNpYmxlRm9yKCkKLQl9OwotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgT2JqZWN0W10gV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX1JFTEFUSU9OU0hJUFMgPSB7Ci0JCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9JbXBhY3RlZEJ5KCksCi0JCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9JbXBhY3RzKCksCi0JCUFzc29jaWF0aW9uSGVscGVyLldvcmtQcm9kdWN0RGVzY3JpcHRvcl9NYW5kYXRvcnlJbnB1dFRvX1Rhc2tEZXNjcmlwdG9ycywKLQkJQXNzb2NpYXRpb25IZWxwZXIuV29ya1Byb2R1Y3REZXNjcmlwdG9yX0V4dGVybmFsSW5wdXRUb19UYXNrRGVzY3JpcHRvcnMsCi0JCUFzc29jaWF0aW9uSGVscGVyLldvcmtQcm9kdWN0RGVzY3JpcHRvcl9PcHRpb25hbElucHV0VG9fVGFza0Rlc2NyaXB0b3JzLAotCQlBc3NvY2lhdGlvbkhlbHBlci5Xb3JrUHJvZHVjdERlc2NyaXB0b3JfT3V0cHV0RnJvbV9UYXNrRGVzY3JpcHRvcnMsCi0JCUFzc29jaWF0aW9uSGVscGVyLldvcmtQcm9kdWN0RGVzY3JpcHRvcl9SZXNwb25zaWJsZVJvbGVEZXNjcmlwdG9ycwotCX07Ci0JCi0JcHJpdmF0ZSBIYXNoU2V0IHJlbW92ZWREZXNjcmlwdG9yczsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBhYm9ydGVkOyAKLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBSZW1vdmVVbnVzZWREZXNjcmlwdG9yc0NvbW1hbmQoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGxhYmVsCi0JICovCi0JcHVibGljIFJlbW92ZVVudXNlZERlc2NyaXB0b3JzQ29tbWFuZChTdHJpbmcgbGFiZWwpIHsKLQkJc3VwZXIobGFiZWwpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBsYWJlbAotCSAqIEBwYXJhbSBkZXNjcmlwdGlvbgotCSAqLwotCXB1YmxpYyBSZW1vdmVVbnVzZWREZXNjcmlwdG9yc0NvbW1hbmQoU3RyaW5nIGxhYmVsLCBTdHJpbmcgZGVzY3JpcHRpb24pIHsKLQkJc3VwZXIobGFiZWwsIGRlc2NyaXB0aW9uKTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNBYm9ydGVkKCkgewotCQlyZXR1cm4gYWJvcnRlZDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LmNvbW1hbmQuSVJlc291cmNlQXdhcmVDb21tYW5kI2dldE1vZGlmaWVkUmVzb3VyY2VzKCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRNb2RpZmllZFJlc291cmNlcygpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZCNleGVjdXRlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQjcmVkbygpCi0JICovCi0JcHVibGljIHZvaWQgcmVkbygpIHsKLQl9Ci0KLQlwcml2YXRlIE9iamVjdCBnZXRQYXJlbnQoRGVzY3JpcHRvciBvYmopIHsKLQkJLy8gQWRhcHRlckZhY3RvcnkgZmFjdG9yeSA9IG51bGw7Ci0JCS8vIGlmIChvYmogaW5zdGFuY2VvZiBSb2xlRGVzY3JpcHRvcikgewotCQkvLyBmYWN0b3J5ID0gVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJLy8gLmdldE9CU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCk7Ci0JCS8vIH0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgVGFza0Rlc2NyaXB0b3IpIHsKLQkJLy8gZmFjdG9yeSA9IFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCS8vIC5nZXRXQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpOwotCQkvLyB9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgewotCQkvLyBmYWN0b3J5ID0gVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJLy8gLmdldFBCU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCk7Ci0JCS8vIH0KLQkJLy8KLQkJLy8gSXRlbVByb3ZpZGVyQWRhcHRlciBwcm92aWRlciA9IChJdGVtUHJvdmlkZXJBZGFwdGVyKQotCQkvLyBmYWN0b3J5LmFkYXB0KG9iaiwKLQkJLy8gSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJLy8gT2JqZWN0IGFjdCA9IHByb3ZpZGVyLmdldFBhcmVudChvYmopOwotCQkvLwotCQkvLyByZXR1cm4gYWN0OwotCi0JCXJldHVybiBVbWFVdGlsLmdldFBhcmVudEFjdGl2aXR5KG9iaik7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZGVsZXRlKE9iamVjdFtdIHJlZlRvYmVEZWxldGVkKSB7Ci0JCWlmIChyZWZUb2JlRGVsZXRlZCAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZlRvYmVEZWxldGVkLmxlbmd0aDsgaSsrKSB7Ci0JCQkJRGVzY3JpcHRvciBvYmogPSAoRGVzY3JpcHRvcikgcmVmVG9iZURlbGV0ZWRbaV07Ci0JCQkJLy8gZ2V0IHBhcmVudCBhbmQgcmVtb3ZlIHJlZiBvYmplY3QKLQkJCQlPYmplY3QgYWN0ID0gZ2V0UGFyZW50KG9iaik7Ci0JCQkJaWYgKGFjdCBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJCWlmICgoKEFjdGl2aXR5KSBhY3QpLmdldEJyZWFrZG93bkVsZW1lbnRzKCkucmVtb3ZlKG9iaikpIHsKLQkJCQkJCWdldFJlbW92ZWREZXNjcmlwdG9ycygpLmFkZChvYmopOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0UmVtb3ZlZERlc2NyaXB0b3JzKCkgewotCQlpZiAocmVtb3ZlZERlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXJlbW92ZWREZXNjcmlwdG9ycyA9IG5ldyBIYXNoU2V0KCk7Ci0JCX0KLQkJcmV0dXJuIHJlbW92ZWREZXNjcmlwdG9yczsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL1JlcGxhY2VBY3Rpdml0eUNvbW1hbmQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL1JlcGxhY2VBY3Rpdml0eUNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWIzZjkwOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9SZXBsYWNlQWN0aXZpdHlDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Qcm9jZXNzVXRpbDsKLQotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlIC0gT2N0IDEwLCAyMDA1Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBSZXBsYWNlQWN0aXZpdHlDb21tYW5kIGV4dGVuZHMgVmFyeUFjdGl2aXR5Q29tbWFuZCB7Ci0KLQkvKioKLQkgKiBAcGFyYW0gd3JhcHBlcgotCSAqLwotCXB1YmxpYyBSZXBsYWNlQWN0aXZpdHlDb21tYW5kKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyIHdyYXBwZXIpIHsKLQkJc3VwZXIod3JhcHBlcik7Ci0JCXNldExhYmVsKExpYnJhcnlFZGl0UmVzb3VyY2VzLmxvY2FsUmVwbGFjZXNfdGV4dCk7IAotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kLlZhcnlBY3Rpdml0eUNvbW1hbmQjZG9WYXJ5KCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkb1ZhcnkoKSB7Ci0JCVByb2Nlc3NVdGlsLnJlcGxhY2VBY3Rpdml0eUxvY2FsbHkod3JhcHBlciwgY3JlYXRlZEFjdGl2aXRpZXMpOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL1JvbGVBc3NvY2lhdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvUm9sZUFzc29jaWF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkODZhNzguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvUm9sZUFzc29jaWF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRvcjsKLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUm9sZUFzc29jaWF0aW9uIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBSSU1BUlkgPSAwOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQURESVRJT05BTCA9IDE7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBU1NJU1RFRCA9IDI7Ci0KLQlwcml2YXRlIGludCB0eXBlOwotCi0JcHJpdmF0ZSBSb2xlRGVzY3JpcHRvciByb2xlRGVzY3JpcHRvcjsKLQotCXByaXZhdGUgVGFza0Rlc2NyaXB0b3IgdGFza0Rlc2NyaXB0b3I7Ci0KLQlwcml2YXRlIFJvbGVEZXNjcmlwdG9yIG9sZFJvbGVEZXNjcmlwdG9yOwotCi0JcHVibGljIFJvbGVBc3NvY2lhdGlvbihpbnQgdHlwZSwgUm9sZURlc2NyaXB0b3Igcm9sZURlc2NyaXB0b3IsCi0JCQlUYXNrRGVzY3JpcHRvciB0YXNrRGVzY3JpcHRvcikgewotCQl0aGlzLnR5cGUgPSB0eXBlOwotCQl0aGlzLnJvbGVEZXNjcmlwdG9yID0gcm9sZURlc2NyaXB0b3I7Ci0JCXRoaXMudGFza0Rlc2NyaXB0b3IgPSB0YXNrRGVzY3JpcHRvcjsKLQl9Ci0KLQlwdWJsaWMgUm9sZURlc2NyaXB0b3IgZ2V0T2xkUm9sZURlc2NyaXB0b3IoKSB7Ci0JCXJldHVybiBvbGRSb2xlRGVzY3JpcHRvcjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRPbGRSb2xlRGVzY3JpcHRvcihSb2xlRGVzY3JpcHRvciBvbGRSb2xlRGVzY3JpcHRvcikgewotCQl0aGlzLm9sZFJvbGVEZXNjcmlwdG9yID0gb2xkUm9sZURlc2NyaXB0b3I7Ci0JfQotCi0JcHVibGljIFJvbGVEZXNjcmlwdG9yIGdldFJvbGVEZXNjcmlwdG9yKCkgewotCQlyZXR1cm4gcm9sZURlc2NyaXB0b3I7Ci0JfQotCi0JcHVibGljIFRhc2tEZXNjcmlwdG9yIGdldFRhc2tEZXNjcmlwdG9yKCkgewotCQlyZXR1cm4gdGFza0Rlc2NyaXB0b3I7Ci0JfQotCi0JcHVibGljIGludCBnZXRUeXBlKCkgewotCQlyZXR1cm4gdHlwZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL1JvbGVUZWFtUHJvZmlsZUFzc29jaWF0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9Sb2xlVGVhbVByb2ZpbGVBc3NvY2lhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OTkyOGYxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL1JvbGVUZWFtUHJvZmlsZUFzc29jaWF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZDsKLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZSAtIEp1bCAyOSwgMjAwNQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUm9sZVRlYW1Qcm9maWxlQXNzb2NpYXRpb24gewotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9TeW5jaHJvbml6ZUNvbW1hbmQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL1N5bmNocm9uaXplQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNjllNTFhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL1N5bmNocm9uaXplQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjM1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5Db21tb25QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkJhc2ljQ29tbWFuZFN0YWNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21wb3VuZENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkFic3RyYWN0VHJlZUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5XcmFwcGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuUmVtb3ZlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuUHJvdmlkZXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLkJhdGNoQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSVJlc291cmNlQXdhcmVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudWkuVXNlckludGVyYWN0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5NZXNzZW5nZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlByb2Nlc3NVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFzazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGVhbVByb2ZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvcjsKLQotCi0vKioKLSAqIENvbW1hbmQgZm9yIG9uZS13YXkgc3luY2hyb25pemF0aW9uIGZyb20gbWV0aG9kIHRvIHByb2Nlc3MuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlIC0gTm92IDIyLCAyMDA1Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBTeW5jaHJvbml6ZUNvbW1hbmQgZXh0ZW5kcyBDb21wb3VuZENvbW1hbmQgaW1wbGVtZW50cwotCQlJUmVzb3VyY2VBd2FyZUNvbW1hbmQgewotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uIGVsZW1lbnRzOwotCi0JcHJpdmF0ZSBJQ29uZmlndXJhdG9yIGNvbmZpZ3VyYXRvcjsKLQotCXByb3RlY3RlZCBib29sZWFuIGFib3J0ZWQ7Ci0KLQlwcml2YXRlIEFycmF5TGlzdCBkZWxldGVMaXN0OwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gcHJlRXhlY1N1Y2Nlc3NmdWw7Ci0KLQlwcm90ZWN0ZWQgTGlzdCBkZWxldGVDb21tYW5kTGlzdDsKLQotCXByb3RlY3RlZCBib29sZWFuIHN1Y2Nlc3NmdWw7Ci0KLQlwcml2YXRlIE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnOwotCi0JcHJpdmF0ZSBTZXQgc3luY2hGZWF0dXJlczsKLQotCXByaXZhdGUgRGVsZXRlVW51c2VkRGVzY3JpcHRvcnNDb21tYW5kIGRlbGV0ZVVudXNlZERlc2NyaXB0b3JzQ29tbWFuZDsKLQkKLQlwcml2YXRlIENvbGxlY3Rpb24gYWN0aXZpdGllczsKLQotCXByaXZhdGUgYm9vbGVhbiBzaG93U3VjY2Vzc2Z1bE1zZyA9IHRydWU7Ci0KLQlwcml2YXRlIGJvb2xlYW4gaW50aWFsaXplZDsKLQkKLQlwcml2YXRlIEJhdGNoQ29tbWFuZCBiYXRjaENvbW1hbmQgPSBuZXcgQmF0Y2hDb21tYW5kKGZhbHNlKTsKLQlwcml2YXRlIE1hcDxWYXJpYWJpbGl0eUVsZW1lbnQsIFZhcmlhYmlsaXR5RWxlbWVudD4gcmVwbGFjZXJUb0Jhc2VNYXAgPSBuZXcgSGFzaE1hcDxWYXJpYWJpbGl0eUVsZW1lbnQsIFZhcmlhYmlsaXR5RWxlbWVudD4oKTsgIAotCi0vLwlwcml2YXRlIE9iamVjdCBVSUNvbnRleHQ7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RzIGEgU3luY2hyb25pemVDb21tYW5kIHRoYXQgdXNlIHRoZSBwcm9jZXNzIGRlZmF1bHQKLQkgKiBjb25maWd1cmF0aW9uIHRvIHN5bmNocm9uaXplIGFsbCB0aGUgc3luY2hyb25pemFibGUgZmVhdHVyZXMKLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudHMKLQkgKiAgICAgICAgICAgIGEgbGlzdCBvZiBCcmVha2Rvd25FbGVtZW50IG9iamVjdHMKLQkgKi8KLQlwdWJsaWMgU3luY2hyb25pemVDb21tYW5kKFN0cmluZyBsYWJlbCwgQ29sbGVjdGlvbiBlbGVtZW50cykgewotCQlzdXBlcihsYWJlbCk7Ci0JCXRoaXMuZWxlbWVudHMgPSBlbGVtZW50czsKLQl9Ci0JCi0JLyoqCi0JICogQ29uc3RydWN0cyBhIFN5bmNocm9uaXplQ29tbWFuZCB0aGF0IHVzZSB0aGUgZ2l2ZW4gY29uZmlndXJhdGlvbiAKLQkgKiBhbmQgbGlzdCBvZiBzeW5jaHJvbml6YWJsZSBmZWF0dXJlcyB0byBzeW5jaHJvbml6ZQotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50cwotCSAqIEBwYXJhbSBjb25maWcgdGhlIGNvbmZpZ3VyYXRpb24KLQkgKiBAcGFyYW0gc3luY2hGZWF0dXJlcyB0aGUgc3luY2hyb25pemFibGUgZmVhdHVyZXMKLQkgKi8KLQlwdWJsaWMgU3luY2hyb25pemVDb21tYW5kKENvbGxlY3Rpb24gZWxlbWVudHMsIE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnLCBTZXQgc3luY2hGZWF0dXJlcywgYm9vbGVhbiBzaG93U3VjY2Vzc2Z1bE1zZykgewotCQlzdXBlcihMaWJyYXJ5RWRpdFJlc291cmNlcy5BdXRvU3luY2hyb25pemVDb21tYW5kX2xhYmVsKTsgCi0JCXRoaXMuZWxlbWVudHMgPSBlbGVtZW50czsKLQkJdGhpcy5jb25maWcgPSBjb25maWc7Ci0JCXRoaXMuc3luY2hGZWF0dXJlcyA9IHN5bmNoRmVhdHVyZXM7Ci0JCXRoaXMuc2hvd1N1Y2Nlc3NmdWxNc2cgPSBzaG93U3VjY2Vzc2Z1bE1zZzsgCi0JfQotCQotCXB1YmxpYyB2b2lkIHNldE1ldGhvZENvbmZpZ3VyYXRpb24oTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLQkJdGhpcy5jb25maWcgPSBjb25maWc7Ci0JCWlmKGNvbmZpZ3VyYXRvciAhPSBudWxsKSB7Ci0JCQljb25maWd1cmF0b3Iuc2V0TWV0aG9kQ29uZmlndXJhdGlvbihjb25maWcpOwotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFN5bmNocm9uaXphdGlvbkZlYXR1cmVzKFNldCBzeW5jaEZlYXR1cmVzKSB7Ci0JCXRoaXMuc3luY2hGZWF0dXJlcyA9IHN5bmNoRmVhdHVyZXM7Ci0JfQotCQotCXByaXZhdGUgYm9vbGVhbiBkb0luaXRpYWxpemUoKSB7Ci0JCWNvbW1hbmRMaXN0LmNsZWFyKCk7Ci0JCQotCQlpZiAoZWxlbWVudHMgPT0gbnVsbCB8fCBlbGVtZW50cy5pc0VtcHR5KCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCWRlbGV0ZUNvbW1hbmRMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlkZWxldGVMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlhY3Rpdml0aWVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBlbGVtZW50cy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gKE9iamVjdCkgaXRlci5uZXh0KCk7Ci0JCQlhZGRUb0RlbGV0ZUxpc3QoZWxlbWVudCwgZGVsZXRlTGlzdCk7Ci0JCQlpZihlbGVtZW50IGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQlhY3Rpdml0aWVzLmFkZChlbGVtZW50KTsKLQkJCX0KLQkJfQotCQllbGVtZW50cy5yZW1vdmVBbGwoZGVsZXRlTGlzdCk7Ci0JCQotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBlbGVtZW50cy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBvYmplY3QgPSBpdGVyLm5leHQoKTsKLQkJCWlmIChvYmplY3QgaW5zdGFuY2VvZiBEZXNjcmlwdG9yKSB7Ci0JCQkJRGVzY3JpcHRvciBkZXNjcmlwdG9yID0gKERlc2NyaXB0b3IpIG9iamVjdDsKLQkJCQlpZiAoZGVzY3JpcHRvci5nZXRJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UoKS5ib29sZWFuVmFsdWUoKQotCQkJCQkJJiYgIWRlbGV0ZUxpc3QuY29udGFpbnMoZGVzY3JpcHRvcikpIHsKLQkJCQkJaWYoZGVzY3JpcHRvci5nZXRTdXBlckFjdGl2aXRpZXMoKSA9PSBudWxsKSB7CQkJCQkJCi0JCQkJCQkvLyBkZXNjcmlwdG9yIGlzIHVzZWQgYnkgVGVhbVByb2ZpbGUgdG8gcmVwcmVzZW50IGEgcm9sZSBvciB1c2VkIGJ5IGEgZGVsaXZlcmFibGUgZGVzY3JpcHRvciB0bwotCQkJCQkJLy8gcmVwcmVzZW50IGEgZGVsaXZlcmFibGUgcGFydAotCQkJCQkJLy8KLQkJCQkJCWlmKGRlc2NyaXB0b3IgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3IgJiYgKChXb3JrUHJvZHVjdERlc2NyaXB0b3IpZGVzY3JpcHRvcikuZ2V0V29ya1Byb2R1Y3QoKSBpbnN0YW5jZW9mIERlbGl2ZXJhYmxlKSB7Ci0JCQkJCQkJYXBwZW5kKG5ldyBTeW5jaHJvbml6ZURlbGl2ZXJhYmxlRGVzY3JpcHRvckNvbW1hbmQoKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgZGVzY3JpcHRvciwgc3luY2hGZWF0dXJlcywgY29uZmlnKSk7Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIHsKLQkJCQkJCQlhcHBlbmQobmV3IEJhc2ljU3luY2hyb25pemVEZXNjcmlwdG9yQ29tbWFuZChkZXNjcmlwdG9yLCBzeW5jaEZlYXR1cmVzLCBjb25maWcpKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCUFjdGl2aXR5IGFjdCA9IGRlc2NyaXB0b3IuZ2V0U3VwZXJBY3Rpdml0aWVzKCk7Ci0JCQkJCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgVGFza0Rlc2NyaXB0b3IpIHsKLQkJCQkJCQlUYXNrIHRhc2sgPSAoKFRhc2tEZXNjcmlwdG9yKSBvYmplY3QpLmdldFRhc2soKTsKLQkJCQkJCQlpZiAodGFzayAhPSBudWxsKSB7Ci0JCQkJCQkJCWlmKHJlcGxhY2VyVG9CYXNlTWFwLmNvbnRhaW5zS2V5KHRhc2spKSB7Ci0JCQkJCQkJCQl0YXNrID0gKFRhc2spIHJlcGxhY2VyVG9CYXNlTWFwLmdldCh0YXNrKTsKLQkJCQkJCQkJfQotCQkJCQkJCQlhcHBlbmQobmV3IFdCU0Ryb3BDb21tYW5kKGFjdCwgQ29sbGVjdGlvbnMKLQkJCQkJCQkJCQkuc2luZ2xldG9uTGlzdCh0YXNrKSwgY29uZmlnLCBzeW5jaEZlYXR1cmVzKSk7Ci0JCQkJCQkJfQotCQkJCQkJfSBlbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBSb2xlRGVzY3JpcHRvcikgewotCQkJCQkJCVJvbGUgcm9sZSA9ICgoUm9sZURlc2NyaXB0b3IpIG9iamVjdCkuZ2V0Um9sZSgpOwotCQkJCQkJCWlmIChyb2xlICE9IG51bGwpIHsKLQkJCQkJCQkJaWYocmVwbGFjZXJUb0Jhc2VNYXAuY29udGFpbnNLZXkocm9sZSkpIHsKLQkJCQkJCQkJCXJvbGUgPSAoUm9sZSkgcmVwbGFjZXJUb0Jhc2VNYXAuZ2V0KHJvbGUpOwotCQkJCQkJCQl9Ci0JCQkJCQkJCWFwcGVuZChuZXcgT0JTRHJvcENvbW1hbmQoYWN0LCBDb2xsZWN0aW9ucwotCQkJCQkJCQkJCS5zaW5nbGV0b25MaXN0KHJvbGUpLCBjb25maWcsIHN5bmNoRmVhdHVyZXMsIGNvbmZpZ3VyYXRvcikpOwotCQkJCQkJCX0KLQkJCQkJCX0gZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yKSB7Ci0JCQkJCQkJV29ya1Byb2R1Y3Qgd3AgPSAoKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgb2JqZWN0KQotCQkJCQkJCS5nZXRXb3JrUHJvZHVjdCgpOwotCQkJCQkJCWlmICh3cCAhPSBudWxsKSB7Ci0JCQkJCQkJCWlmKHJlcGxhY2VyVG9CYXNlTWFwLmNvbnRhaW5zS2V5KHdwKSkgewotCQkJCQkJCQkJd3AgPSAoV29ya1Byb2R1Y3QpIHJlcGxhY2VyVG9CYXNlTWFwLmdldCh3cCk7Ci0JCQkJCQkJCX0KLQkJCQkJCQkJYXBwZW5kKG5ldyBQQlNEcm9wQ29tbWFuZChhY3QsIENvbGxlY3Rpb25zCi0JCQkJCQkJCQkJLnNpbmdsZXRvbkxpc3Qod3ApLCBjb25maWcsIHN5bmNoRmVhdHVyZXMsIGNvbmZpZ3VyYXRvcikpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0gZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQlhcHBlbmRDb21tYW5kcygoQWN0aXZpdHkpIG9iamVjdCk7Ci0JCQl9IGVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIFRlYW1Qcm9maWxlKSB7Ci0JCQkJYXBwZW5kQ29tbWFuZHMoKFRlYW1Qcm9maWxlKW9iamVjdCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuICFkZWxldGVMaXN0LmlzRW1wdHkoKSB8fCAhY29tbWFuZExpc3QuaXNFbXB0eSgpIHx8ICFhY3Rpdml0aWVzLmlzRW1wdHkoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpbml0aWxpemUoKSB7Ci0JCWJvb2xlYW4gYiA9IGlzUHJlcGFyZWQ7Ci0JCXRyeSB7Ci0JCQkvLyBzaW5jZSBFY2xpcHNlIDMuMywgQ29tcG91bmRDb21tYW5kLmFwcGVuZCgpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgaXNQcmVwYXJlZCBpcyBhbHJlYWR5IHNldAotCQkJLy8gYnV0IHRoaXMgbWV0aG9kIGlzIGNhbGxlZCBhZnRlciBpc1ByZXBhcmVkIGlzIHNldCBpbiBjYW5FeGVjdXRlKCkgYW5kIGl0IG1ha2VzIG1hbnkgY2FsbHMgdG8gYXBwZW5kKCkKLQkJCS8vIHdvcmstYXJvdW5kIGlzIHRvIHVuc2V0IGlzUHJlcGFyZWQgYXQgYmVnaW5uaW5nIG9mIHRoaXMgbWV0aG9kIGFuZCBzZXQgaXQgYmFjayB0byBvbGQgdmFsdWUgYXQgbWV0aG9kIGVuZC4KLQkJCS8vCi0JCQlpc1ByZXBhcmVkID0gZmFsc2U7Ci0JCQlyZXR1cm4gaW50aWFsaXplZCA9IGRvSW5pdGlhbGl6ZSgpOwkJCi0JCX0KLQkJZmluYWxseSB7Ci0JCQlpc1ByZXBhcmVkID0gYjsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBAcmV0dXJuIHRoZSBpbnRpYWxpemVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNJbnRpYWxpemVkKCkgewotCQlyZXR1cm4gaW50aWFsaXplZDsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gYWN0aXZpdHkKLQkgKi8KLQlwcml2YXRlIHZvaWQgYXBwZW5kQ29tbWFuZHMoQWN0aXZpdHkgYWN0aXZpdHkpIHsKLQkJTGlzdCB0YXNrcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJTGlzdCByb2xlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJTGlzdCB3b3JrUHJvZHVjdHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUxpc3QgYWN0aXZpdGllcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gYWN0aXZpdHkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIERlc2NyaXB0b3IpIHsKLQkJCQlpZiAoKChEZXNjcmlwdG9yKSBlbGVtZW50KS5nZXRJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UoKQotCQkJCQkJLmJvb2xlYW5WYWx1ZSgpCi0JCQkJCQkmJiAhZGVsZXRlTGlzdC5jb250YWlucyhlbGVtZW50KSkgewotCQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFRhc2tEZXNjcmlwdG9yKSB7Ci0JCQkJCQlUYXNrIHRhc2sgPSAoKFRhc2tEZXNjcmlwdG9yKSBlbGVtZW50KS5nZXRUYXNrKCk7Ci0JCQkJCQlpZiAodGFzayAhPSBudWxsKSB7Ci0JCQkJCQkJaWYocmVwbGFjZXJUb0Jhc2VNYXAuY29udGFpbnNLZXkodGFzaykpIHsKLQkJCQkJCQkJdGFzayA9IChUYXNrKSByZXBsYWNlclRvQmFzZU1hcC5nZXQodGFzayk7Ci0JCQkJCQkJfQotCQkJCQkJCXRhc2tzLmFkZCh0YXNrKTsKLQkJCQkJCX0KLQkJCQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgUm9sZURlc2NyaXB0b3IpIHsKLQkJCQkJCVJvbGUgcm9sZSA9ICgoUm9sZURlc2NyaXB0b3IpIGVsZW1lbnQpLmdldFJvbGUoKTsKLQkJCQkJCWlmIChyb2xlICE9IG51bGwpIHsKLQkJCQkJCQlpZihyZXBsYWNlclRvQmFzZU1hcC5jb250YWluc0tleShyb2xlKSkgewotCQkJCQkJCQlyb2xlID0gKFJvbGUpIHJlcGxhY2VyVG9CYXNlTWFwLmdldChyb2xlKTsKLQkJCQkJCQl9Ci0JCQkJCQkJcm9sZXMuYWRkKHJvbGUpOwotCQkJCQkJfQotCQkJCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3IpIHsKLQkJCQkJCVdvcmtQcm9kdWN0IHdwID0gKChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIGVsZW1lbnQpCi0JCQkJCQkJCS5nZXRXb3JrUHJvZHVjdCgpOwotCQkJCQkJaWYgKHdwICE9IG51bGwpIHsKLQkJCQkJCQlpZihyZXBsYWNlclRvQmFzZU1hcC5jb250YWluc0tleSh3cCkpIHsKLQkJCQkJCQkJd3AgPSAoV29ya1Byb2R1Y3QpIHJlcGxhY2VyVG9CYXNlTWFwLmdldCh3cCk7Ci0JCQkJCQkJfQotCQkJCQkJCXdvcmtQcm9kdWN0cy5hZGQod3ApOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQlhY3Rpdml0aWVzLmFkZChlbGVtZW50KTsKLQkJCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFRlYW1Qcm9maWxlKSB7Ci0JCQkJYXBwZW5kQ29tbWFuZHMoKFRlYW1Qcm9maWxlKWVsZW1lbnQpOwotCQkJfQotCQl9Ci0JCWlmICghdGFza3MuaXNFbXB0eSgpKSB7Ci0JCQlhcHBlbmQobmV3IFdCU0Ryb3BDb21tYW5kKGFjdGl2aXR5LCB0YXNrcywgY29uZmlnLCBzeW5jaEZlYXR1cmVzKSk7Ci0JCX0KLQkJaWYgKCFyb2xlcy5pc0VtcHR5KCkpIHsKLQkJCWFwcGVuZChuZXcgT0JTRHJvcENvbW1hbmQoYWN0aXZpdHksIHJvbGVzLCBjb25maWcsIHN5bmNoRmVhdHVyZXMsIGNvbmZpZ3VyYXRvcikpOwotCQl9Ci0JCWlmICghd29ya1Byb2R1Y3RzLmlzRW1wdHkoKSkgewotCQkJYXBwZW5kKG5ldyBQQlNEcm9wQ29tbWFuZChhY3Rpdml0eSwgd29ya1Byb2R1Y3RzLCBjb25maWcsCi0JCQkJCXN5bmNoRmVhdHVyZXMsIGNvbmZpZ3VyYXRvcikpOwotCQl9Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGFjdGl2aXRpZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlhcHBlbmRDb21tYW5kcygoQWN0aXZpdHkpIGl0ZXIubmV4dCgpKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgYXBwZW5kQ29tbWFuZHMoVGVhbVByb2ZpbGUgdGVhbSkgewotCQlJdGVyYXRvciBpdGVyID0gbmV3IEFic3RyYWN0VHJlZUl0ZXJhdG9yKHRlYW0sIGZhbHNlKSB7Ci0KLQkJCS8qKgotCQkJICogCi0JCQkgKi8KLQkJCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JCQlwcm90ZWN0ZWQgSXRlcmF0b3IgZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQkJCWlmKG9iamVjdCBpbnN0YW5jZW9mIFRlYW1Qcm9maWxlKSB7Ci0JCQkJCVRlYW1Qcm9maWxlIHRlYW0gPSAoKFRlYW1Qcm9maWxlKW9iamVjdCk7Ci0JCQkJCUxpc3QgY2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KHRlYW0uZ2V0U3ViVGVhbSgpKTsKLQkJCQkJY2hpbGRyZW4uYWRkQWxsKHRlYW0uZ2V0VGVhbVJvbGVzKCkpOwotCQkJCQlyZXR1cm4gY2hpbGRyZW4uaXRlcmF0b3IoKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNULml0ZXJhdG9yKCk7Ci0JCQkJfQotCQkJfQotCQkJCi0JCX07Ci0JCXdoaWxlKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlPYmplY3Qgb2JqID0gaXRlci5uZXh0KCk7Ci0JCQkKLQkJCS8vIHN5bmNoIG9ubHkgb3duIHJvbGUgZGVzY3JpcHRvciBvZiB0ZWFtIHByb2ZpbGUKLQkJCS8vCi0JCQlpZihvYmogaW5zdGFuY2VvZiBSb2xlRGVzY3JpcHRvciAmJiAoKFJvbGVEZXNjcmlwdG9yKW9iaikuZ2V0U3VwZXJBY3Rpdml0aWVzKCkgPT0gbnVsbCkgewotCQkJCWFwcGVuZChuZXcgQmFzaWNTeW5jaHJvbml6ZURlc2NyaXB0b3JDb21tYW5kKChEZXNjcmlwdG9yKSBvYmosIHN5bmNoRmVhdHVyZXMsIGNvbmZpZykpOwotCQkJfQotCQl9Ci0JfQotCQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuY29tbWFuZC5JUmVzb3VyY2VBd2FyZUNvbW1hbmQjZ2V0TW9kaWZpZWRSZXNvdXJjZXMoKQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldE1vZGlmaWVkUmVzb3VyY2VzKCkgewotCQlIYXNoU2V0IG1vZGlmaWVkUmVzb3VyY2VzID0gbmV3IEhhc2hTZXQoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gY29tbWFuZExpc3QuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkKLQkJCU9iamVjdCBjbWQgPSBpdGVyLm5leHQoKTsKLQkJCWlmKGNtZCBpbnN0YW5jZW9mIElSZXNvdXJjZUF3YXJlQ29tbWFuZCkgewotCQkJCW1vZGlmaWVkUmVzb3VyY2VzLmFkZEFsbCgoKElSZXNvdXJjZUF3YXJlQ29tbWFuZCljbWQpLmdldE1vZGlmaWVkUmVzb3VyY2VzKCkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBtb2RpZmllZFJlc291cmNlczsKLQl9Ci0JCi0vLwlwdWJsaWMgdm9pZCBzZXRVSUNvbnRleHQoT2JqZWN0IFVJQ29udGV4dCkgewotLy8JCXRoaXMuVUlDb250ZXh0ID0gVUlDb250ZXh0OwotLy8JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tcG91bmRDb21tYW5kI2V4ZWN1dGUoKQotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCS8vIGRlbGV0ZSBhbGwgZGVzY3JpcHRvcnMgd2hvc2UgbGlua2VkIGVsZW1lbnQgYXJlIG5vIGxvbmdlciBpbiB0aGUKLQkJLy8gY29uZmlndXJhdGlvbgotCQkvLwotCQlpZiAoIWRlbGV0ZUxpc3QuaXNFbXB0eSgpKSB7Ci0JCQlDb21tYW5kIGNtZCA9IGRlbGV0ZShkZWxldGVMaXN0KTsKLQkJCWlmIChjbWQgIT0gbnVsbCkgewotCQkJCWRlbGV0ZUNvbW1hbmRMaXN0LmFkZChjbWQpOwotCQkJfQotCQl9Ci0JCQotCQliYXRjaENvbW1hbmQuZXhlY3V0ZSgpOwotCQkKLQkJaWYgKCFhYm9ydGVkKSB7Ci0vLwkJCUlSdW5uYWJsZVdpdGhQcm9ncmVzcyBydW5uYWJsZSA9IG5ldyBJUnVubmFibGVXaXRoUHJvZ3Jlc3MoKSB7Ci0vLwotLy8JCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLS8vCQkJCQkJdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLS8vCQkJCQlwcmVFeGVjU3VjY2Vzc2Z1bCA9IHByZUV4ZWN1dGUoKTsKLS8vCQkJCX0KLS8vCi0vLwkJCX07Ci0vLwkJCQkJCQotLy8JCQlVc2VySW50ZXJhY3Rpb25IZWxwZXIucnVuV2l0aFByb2dyZXNzKHJ1bm5hYmxlLCBmYWxzZSwgbnVsbCk7Ci0vLwotLy8JCQlpZiAocHJlRXhlY1N1Y2Nlc3NmdWwpIHsKLS8vCQkJCXRyeSB7Ci0vLwkJCQkJQnVzeUluZGljYXRvci5zaG93V2hpbGUoRGlzcGxheS5nZXRDdXJyZW50KCksIG5ldyBSdW5uYWJsZSgpIHsKLS8vCQkJCQkJCi0vLwkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLS8vCQkJCQkJCXN1cGVyUmVkbygpOwotLy8JCQkJCQkJc3VjY2Vzc2Z1bCA9IHRydWU7Ci0vLwkJCQkJCX0KLS8vCQkJCQkJCi0vLwkJCQkJfSk7Ci0vLwkJCQl9Ci0vLwkJCQljYXRjaChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLS8vCQkJCQlMaWJyYXJ5RWRpdFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkuZGlzcGxheUVycm9yKGdldExhYmVsKCksIGUudG9TdHJpbmcoKSk7Ci0vLwkJCQl9Ci0vLwkJCX0KLQkJCQotCQkJUnVubmFibGUgcnVubmFibGUgPSBuZXcgUnVubmFibGUoKSB7Ci0KLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCXByZUV4ZWNTdWNjZXNzZnVsID0gcHJlRXhlY3V0ZSgpOwotCQkJCQlpZihwcmVFeGVjdXRlKCkpIHsKLQkJCQkJCXN1cGVyUmVkbygpOwotCQkJCQkJc3VjY2Vzc2Z1bCA9IHRydWU7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCX07Ci0JCQlVc2VySW50ZXJhY3Rpb25IZWxwZXIucnVuSW5VSShydW5uYWJsZSwgZ2V0TGFiZWwoKSk7Ci0JCQkKLQkJCWlmIChzdWNjZXNzZnVsKSB7CQkJCQotCQkJCWlmKCFhY3Rpdml0aWVzLmlzRW1wdHkoKSkgewotCQkJCQlpZihkZWxldGVVbnVzZWREZXNjcmlwdG9yc0NvbW1hbmQgPT0gbnVsbCkgewotCQkJCQkJZGVsZXRlVW51c2VkRGVzY3JpcHRvcnNDb21tYW5kID0gbmV3IERlbGV0ZVVudXNlZERlc2NyaXB0b3JzQ29tbWFuZChlbGVtZW50cywgdHJ1ZSwgZGVsZXRlTGlzdCkgewotCQkJCQkJCQotCQkJCQkJCXByb3RlY3RlZCBDb21tYW5kIGRlbGV0ZShMaXN0IGVsZW1lbnRzKSB7Ci0JCQkJCQkJCXJldHVybiBTeW5jaHJvbml6ZUNvbW1hbmQudGhpcy5kZWxldGUoZWxlbWVudHMpOwotCQkJCQkJCX0KLQkJCQkJCQkKLQkJCQkJCX07Ci0JCQkJCQlkZWxldGVDb21tYW5kTGlzdC5hZGQoZGVsZXRlVW51c2VkRGVzY3JpcHRvcnNDb21tYW5kKTsKLQkJCQkJfQotCQkJCQlkZWxldGVVbnVzZWREZXNjcmlwdG9yc0NvbW1hbmQuZXhlY3V0ZSgpOwotCQkJCX0KLQkJCQkKLQkJCQlpZiAoc2hvd1N1Y2Nlc3NmdWxNc2cpIHsKLQkJCQkJaWYoIXJlcGxhY2VyVG9CYXNlTWFwLmlzRW1wdHkoKSkgewotCQkJCQkJcmVmcmVzaFZpZXdlcigpOwotCQkJCQl9Ci0JCQkJCU1lc3Nlbmdlci5JTlNUQU5DRS5zaG93SW5mbygKLQkJCQkJCQkJCUxpYnJhcnlFZGl0UmVzb3VyY2VzLlN5bmNocm9uaXplQ29tcGxldGVEaWFsb2dfVGl0bGUsCi0JCQkJCQkJCQlMaWJyYXJ5RWRpdFJlc291cmNlcy5BdXRvU3luY2hyb25pemVDb21tYW5kX3N1Y2Vzc2Z1bCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHJlZnJlc2hWaWV3ZXIoKSB7Ci0JCWlmKGVsZW1lbnRzLmlzRW1wdHkoKSkgIHJldHVybjsKLQkJUHJvY2VzcyBwcm9jID0gVG5nVXRpbC5nZXRPd25pbmdQcm9jZXNzKGVsZW1lbnRzLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJaWYocHJvYyAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IFRuZ0FkYXB0ZXJGYWN0b3J5LnByb2Nlc3NBZGFwdGVyRmFjdG9yaWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkgPSBUbmdBZGFwdGVyRmFjdG9yeS5wcm9jZXNzQWRhcHRlckZhY3Rvcmllc1tpXTsKLQkJCQlQcm9jZXNzVXRpbC5yZWZyZXNoVmlld2VyKGFkYXB0ZXJGYWN0b3J5LCBwcm9jKTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBzdXBlclJlZG8oKSB7Ci0JCXN1cGVyLnJlZG8oKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21wb3VuZENvbW1hbmQjcmVkbygpCi0JICovCi0JcHVibGljIHZvaWQgcmVkbygpIHsKLQkJZXhlY3V0ZSgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzU3VjZXNzZnVsKCkgewotCQlyZXR1cm4gc3VjY2Vzc2Z1bDsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBwcmVFeGVjdXRlKCkgewotCQlmb3IgKExpc3RJdGVyYXRvciBjb21tYW5kcyA9IGNvbW1hbmRMaXN0Lmxpc3RJdGVyYXRvcigpOyBjb21tYW5kcwotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgY29tbWFuZCA9IGNvbW1hbmRzLm5leHQoKTsKLQkJCWlmKGNvbW1hbmQgaW5zdGFuY2VvZiBCU0Ryb3BDb21tYW5kICYmICEoKEJTRHJvcENvbW1hbmQpY29tbWFuZCkucHJlRXhlY3V0ZSgpKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJCi0JCQkvLyBiZSBwb2xpdGUgdG8gb3RoZXIgdGhyZWFkcyAobm8gZWZmZWN0IG9uIHNvbWUgcGxhdGZvcm1zKQotCQkJLy8KLQkJCVRocmVhZC55aWVsZCgpOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIERlbGV0ZXMgdGhlIHNwZWNpZmllZCBlbGVtZW50cwotCSAqIEBwYXJhbSBlbGVtZW50cwotCSAqIEByZXR1cm4gdGhlIGV4ZWN1dGVkIGNvbW1hbmQgdGhhdCBkZWxldGVkIHRoZSBnaXZlbiBlbGVtZW50cwotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGRlbGV0ZShMaXN0IGVsZW1lbnRzKSB7Ci0JCUVkaXRpbmdEb21haW4gZG9tYWluID0gbmV3IEFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbigKLQkJCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRS5nZXRQcm9jZXNzQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpLAotCQkJCW5ldyBCYXNpY0NvbW1hbmRTdGFjaygpKTsKLQkJQ29tbWFuZCBjbWQgPSBuZXcgUHJvY2Vzc0VsZW1lbnREZWxldGVDb21tYW5kKFJlbW92ZUNvbW1hbmQuY3JlYXRlKGRvbWFpbiwKLQkJCQllbGVtZW50cyksIGVsZW1lbnRzKTsKLQkJY21kLmV4ZWN1dGUoKTsKLQkJcmV0dXJuIGNtZDsKLQl9Ci0KLQlwcml2YXRlIElDb25maWd1cmF0b3IgZ2V0Q29uZmlndXJhdG9yKCkgewotCQlpZiAoY29uZmlndXJhdG9yID09IG51bGwpIHsKLQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gdGhpcy5jb25maWc7Ci0JCQlpZihjb25maWcgPT0gbnVsbCkgewotCQkJCVByb2Nlc3MgcHJvYyA9IFRuZ1V0aWwuZ2V0T3duaW5nUHJvY2VzcygoQnJlYWtkb3duRWxlbWVudCkgZWxlbWVudHMKLQkJCQkJCS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCQkJY29uZmlnID0gcHJvYy5nZXREZWZhdWx0Q29udGV4dCgpOwotCQkJfQotCQkJY29uZmlndXJhdG9yID0gUHJvdmlkZXJzLmdldENvbmZpZ3VyYXRvckZhY3RvcnkoKQotCQkJCQkuY3JlYXRlQ29uZmlndXJhdG9yKGNvbmZpZyk7Ci0JCX0KLQkJcmV0dXJuIGNvbmZpZ3VyYXRvcjsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqIEBwYXJhbSBkZWxldGVMaXN0Ci0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZFRvRGVsZXRlTGlzdChPYmplY3QgZWxlbWVudCwgTGlzdCBkZWxldGVMaXN0KSB7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgRGVzY3JpcHRvcikgewotCQkJaWYgKCFnZXRDb25maWd1cmF0b3IoKS5hY2NlcHQoZWxlbWVudCkpIHsKLQkJCQlNZXRob2RFbGVtZW50IGxpbmtlZEVsZW1lbnQgPSBQcm9jZXNzVXRpbC5nZXRBc3NvY2lhdGVkRWxlbWVudCgoRGVzY3JpcHRvcikgZWxlbWVudCk7CQkJCQotCQkJCWlmKGxpbmtlZEVsZW1lbnQgaW5zdGFuY2VvZiBWYXJpYWJpbGl0eUVsZW1lbnQgJiYgVG5nVXRpbC5pc1JlcGxhY2VyKChWYXJpYWJpbGl0eUVsZW1lbnQpIGxpbmtlZEVsZW1lbnQpKSB7Ci0JCQkJCS8vIGlmIHRoZSBsaW5rZWQgZWxlbWVudCBvZiB0aGUgZGVzY3JpcHRvciBpcyBhIHJlcGxhY2VyLCBkZWxldGUgdGhlIGRlc2NyaXB0b3IgaW4gdGhpcyBzeW5jaHJvbml6YXRpb24KLQkJCQkJLy8gb25seSBpZiB0aGUgYmFzZSBvZiBsaW5rZWQgZWxlbWVudCBpcyBub3QgaW4gdGhlIGNvbmZpZ3VyYXRpb24KLQkJCQkJLy8KLQkJCQkJVmFyaWFiaWxpdHlFbGVtZW50IGJhc2UgPSAoKFZhcmlhYmlsaXR5RWxlbWVudClsaW5rZWRFbGVtZW50KS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCk7Ci0JCQkJCXdoaWxlKGJhc2UgIT0gbnVsbCAmJiBUbmdVdGlsLmlzQ29udHJpYnV0b3JPclJlcGxhY2VyKGJhc2UpKSB7Ci0JCQkJCQliYXNlID0gYmFzZS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCk7Ci0JCQkJCX0KLQkJCQkJaWYoYmFzZSAhPSBudWxsKSB7Ci0JCQkJCQlpZighZ2V0Q29uZmlndXJhdG9yKCkuYWNjZXB0KGJhc2UpKSB7Ci0JCQkJCQkJZGVsZXRlTGlzdC5hZGQoZWxlbWVudCk7Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIHsKLQkJCQkJCQliYXRjaENvbW1hbmQuYWRkRmVhdHVyZVZhbHVlKChFT2JqZWN0KSBlbGVtZW50LCAKLQkJCQkJCQkJCVByb2Nlc3NVdGlsLmdldExpbmtSZWZlcmVuY2UoKERlc2NyaXB0b3IpIGVsZW1lbnQpLCBiYXNlKTsKLQkJCQkJCQlyZXBsYWNlclRvQmFzZU1hcC5wdXQoKFZhcmlhYmlsaXR5RWxlbWVudCkgbGlua2VkRWxlbWVudCwgYmFzZSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWRlbGV0ZUxpc3QuYWRkKGVsZW1lbnQpOwotCQkJCX0KLQkJCX0KLQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9ICgoQWN0aXZpdHkpIGVsZW1lbnQpLmdldEJyZWFrZG93bkVsZW1lbnRzKCkKLQkJCQkJLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCWFkZFRvRGVsZXRlTGlzdChpdGVyLm5leHQoKSwgZGVsZXRlTGlzdCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgc3VwZXJVbmRvKCkgewotCQlzdXBlci51bmRvKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tcG91bmRDb21tYW5kI3VuZG8oKQotCSAqLwotCXB1YmxpYyB2b2lkIHVuZG8oKSB7Ci0JCVVzZXJJbnRlcmFjdGlvbkhlbHBlci5nZXRVSUhlbHBlcigpLnJ1bldpdGhCdXN5SW5kaWNhdG9yKG5ldyBSdW5uYWJsZSgpIHsKLQotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCWlmICghZGVsZXRlQ29tbWFuZExpc3QuaXNFbXB0eSgpKSB7Ci0JCQkJCWZvciAoTGlzdEl0ZXJhdG9yIGNvbW1hbmRzID0gZGVsZXRlQ29tbWFuZExpc3QKLQkJCQkJCQkubGlzdEl0ZXJhdG9yKGRlbGV0ZUNvbW1hbmRMaXN0LnNpemUoKSk7IGNvbW1hbmRzCi0JCQkJCQkJLmhhc1ByZXZpb3VzKCk7KSB7Ci0JCQkJCQl0cnkgewotCQkJCQkJCUNvbW1hbmQgY29tbWFuZCA9IChDb21tYW5kKSBjb21tYW5kcy5wcmV2aW91cygpOwotCQkJCQkJCWNvbW1hbmQudW5kbygpOwotCQkJCQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLQkJCQkJCQkvLyBTa2lwIG92ZXIgdGhlIGNvbW1hbmQgdGhhdCB0aHJldyB0aGUgZXhjZXB0aW9uLgotCQkJCQkJCS8vCi0JCQkJCQkJY29tbWFuZHMubmV4dCgpOwotCi0JCQkJCQkJdHJ5IHsKLQkJCQkJCQkJLy8gSXRlcmF0ZSBmb3J3YXJkIG92ZXIgdGhlIHVuZG9uZSBjb21tYW5kcyB0bwotCQkJCQkJCQkvLyByZWRvIHRoZW0uCi0JCQkJCQkJCS8vCi0JCQkJCQkJCXdoaWxlIChjb21tYW5kcy5oYXNOZXh0KCkpIHsKLQkJCQkJCQkJCUNvbW1hbmQgY29tbWFuZCA9IChDb21tYW5kKSBjb21tYW5kcy5uZXh0KCk7Ci0JCQkJCQkJCQljb21tYW5kLnJlZG8oKTsKLQkJCQkJCQkJfQotCQkJCQkJCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gbmVzdGVkRXhjZXB0aW9uKSB7Ci0JCQkJCQkJCUNvbW1vblBsdWdpbi5JTlNUQU5DRQotCQkJCQkJCQkJCS5sb2cobmV3IFdyYXBwZWRFeGNlcHRpb24oCi0JCQkJCQkJCQkJCQlDb21tb25QbHVnaW4uSU5TVEFOQ0UKLQkJCQkJCQkJCQkJCQkJLmdldFN0cmluZygiX1VJX0lnbm9yZUV4Y2VwdGlvbl9leGNlcHRpb24iKSwgbmVzdGVkRXhjZXB0aW9uKS5maWxsSW5TdGFja1RyYWNlKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJfQotCi0JCQkJCQkJdGhyb3cgZXhjZXB0aW9uOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCi0JCQkJc3VwZXJVbmRvKCk7Ci0JCQkJCi0JCQkJYmF0Y2hDb21tYW5kLnVuZG8oKTsKLQkJCX0KLQotCQl9KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21wb3VuZENvbW1hbmQjcHJlcGFyZSgpCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gcHJlcGFyZSgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21wb3VuZENvbW1hbmQjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJaWYoYWN0aXZpdGllcyAhPSBudWxsKSB7Ci0JCQlhY3Rpdml0aWVzLmNsZWFyKCk7Ci0JCX0KLQkJaWYoZGVsZXRlQ29tbWFuZExpc3QgIT0gbnVsbCkgewotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gZGVsZXRlQ29tbWFuZExpc3QuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJQ29tbWFuZCBjbWQgPSAoQ29tbWFuZCkgaXRlci5uZXh0KCk7Ci0JCQkJY21kLmRpc3Bvc2UoKTsKLQkJCX0KLQkJfQotCQlpZihkZWxldGVMaXN0ICE9IG51bGwpIHsKLQkJCWRlbGV0ZUxpc3QuY2xlYXIoKTsKLQkJfQotCQkKLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL1N5bmNocm9uaXplRGVsaXZlcmFibGVEZXNjcmlwdG9yQ29tbWFuZC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvU3luY2hyb25pemVEZWxpdmVyYWJsZURlc2NyaXB0b3JDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3NzVlN2IuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvU3luY2hyb25pemVEZWxpdmVyYWJsZURlc2NyaXB0b3JDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvcjsKLQotCi0vKioKLSAqIENvbW1hbmQgdG8gc3luY2hyb25pemUgYXR0cmlidXRlcyBhbmQgZGVsaXZlcmFibGUgcGFydHMgb2YgYSBkZWxpdmVyYWJsZSBkZXNjcmlwdG9yCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlIC0gRmViIDksIDIwMDYKLSAqIEBzaW5jZSAgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBTeW5jaHJvbml6ZURlbGl2ZXJhYmxlRGVzY3JpcHRvckNvbW1hbmQgZXh0ZW5kcwotCQlCYXNpY1N5bmNocm9uaXplRGVzY3JpcHRvckNvbW1hbmQgewotCQotCXByaXZhdGUgU2V0IGRlc2NyaXB0b3JzVG9SZWZyZXNoOwotCXByaXZhdGUgTWFwIHdwRGVzY1RvRGVsaXZlcmFibGVQYXJ0czsKLQlwcml2YXRlIERlc2NyaXB0b3JVcGRhdGVCYXRjaENvbW1hbmQgIHVwZGF0ZURlbGl2ZXJhYmxlUGFydHNDbWQ7Ci0JCi0JLyoqCi0JICogQHBhcmFtIGRlc2NyaXB0b3IKLQkgKiBAcGFyYW0gc3luY2hGZWF0dXJlcwotCSAqIEBwYXJhbSBjb25maWcKLQkgKi8KLQlwdWJsaWMgU3luY2hyb25pemVEZWxpdmVyYWJsZURlc2NyaXB0b3JDb21tYW5kKFdvcmtQcm9kdWN0RGVzY3JpcHRvciBkZXNjcmlwdG9yLAotCQkJU2V0IHN5bmNoRmVhdHVyZXMsIE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0JCXN1cGVyKGRlc2NyaXB0b3IsIHN5bmNoRmVhdHVyZXMsIGNvbmZpZyk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQuQmFzaWNTeW5jaHJvbml6ZURlc2NyaXB0b3JDb21tYW5kI2V4ZWN1dGUoKQotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCS8vIHVwZGF0ZSBsaW5rZWQgZWxlbWVudCBpZiBuZWVkZWQKLQkJLy8gc3luY2hyb25pemUgYXR0cmlidXRlcwotCQkvLwotCQlzdXBlci5leGVjdXRlKCk7Ci0JCQotCQlpZihkZXNjcmlwdG9yc1RvUmVmcmVzaCA9PSBudWxsKSB7Ci0JCQlkZXNjcmlwdG9yc1RvUmVmcmVzaCA9IG5ldyBIYXNoU2V0KCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlkZXNjcmlwdG9yc1RvUmVmcmVzaC5jbGVhcigpOwotCQl9Ci0JCWlmKHdwRGVzY1RvRGVsaXZlcmFibGVQYXJ0cyA9PSBudWxsKSB7Ci0JCQl3cERlc2NUb0RlbGl2ZXJhYmxlUGFydHMgPSBuZXcgSGFzaE1hcCgpOwotCQl9Ci0JCWVsc2UgewotCQkJd3BEZXNjVG9EZWxpdmVyYWJsZVBhcnRzLmNsZWFyKCk7Ci0JCX0KLQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yIHdwZCA9IChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIGRlc2NyaXB0b3I7Ci0JCVByb2Nlc3NDb21tYW5kVXRpbC5jcmVhdGVEZWxpdmVyYWJsZVBhcnRzKHdwZCwgKERlbGl2ZXJhYmxlKXdwZC5nZXRXb3JrUHJvZHVjdCgpLCBjb25maWcsCi0JCQkJd3BEZXNjVG9EZWxpdmVyYWJsZVBhcnRzLCBkZXNjcmlwdG9yc1RvUmVmcmVzaCk7Ci0JCQotCQlpZighd3BEZXNjVG9EZWxpdmVyYWJsZVBhcnRzLmlzRW1wdHkoKSB8fCAhZGVzY3JpcHRvcnNUb1JlZnJlc2guaXNFbXB0eSgpKSB7Ci0JCQlpZih1cGRhdGVEZWxpdmVyYWJsZVBhcnRzQ21kID09IG51bGwpIHsKLQkJCQl1cGRhdGVEZWxpdmVyYWJsZVBhcnRzQ21kID0gbmV3IERlc2NyaXB0b3JVcGRhdGVCYXRjaENvbW1hbmQodHJ1ZSwgc3luY2hGZWF0dXJlcywgY29uZmlnKTsKLQkJCQl1cGRhdGVEZWxpdmVyYWJsZVBhcnRzQ21kLnNldERlc2NyaXB0b3JzVG9SZWZyZXNoKGRlc2NyaXB0b3JzVG9SZWZyZXNoKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXVwZGF0ZURlbGl2ZXJhYmxlUGFydHNDbWQuZ2V0T2JqZWN0VG9OZXdGZWF0dXJlVmFsdWVzTWFwKCkuY2xlYXIoKTsKLQkJCX0KLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHdwRGVzY1RvRGVsaXZlcmFibGVQYXJ0cy5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSkgaXRlci5uZXh0KCk7Ci0JCQkJT2JqZWN0IHdwRGVzYyA9IGVudHJ5LmdldEtleSgpOwotCQkJCXVwZGF0ZURlbGl2ZXJhYmxlUGFydHNDbWQuZ2V0T2JqZWN0VG9OZXdGZWF0dXJlVmFsdWVzTWFwKCkucHV0KHdwRGVzYywgCi0JCQkJCQlDb2xsZWN0aW9ucy5zaW5nbGV0b25NYXAoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX0RlbGl2ZXJhYmxlUGFydHMoKSwgZW50cnkuZ2V0VmFsdWUoKSkpOwotCQkJfQotCQkJCi0JCQl1cGRhdGVEZWxpdmVyYWJsZVBhcnRzQ21kLmV4ZWN1dGUoKTsKLQkJfQkJCi0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kLkJhc2ljU3luY2hyb25pemVEZXNjcmlwdG9yQ29tbWFuZCN1bmRvKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bmRvKCkgewotCQlpZih1cGRhdGVEZWxpdmVyYWJsZVBhcnRzQ21kICE9IG51bGwpIHsKLQkJCXVwZGF0ZURlbGl2ZXJhYmxlUGFydHNDbWQudW5kbygpOwotCQl9Ci0JCQotCQlzdXBlci51bmRvKCk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5BYnN0cmFjdENvbW1hbmQjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsJCQotCQlzdXBlci5kaXNwb3NlKCk7Ci0JCQotCQlpZih1cGRhdGVEZWxpdmVyYWJsZVBhcnRzQ21kICE9IG51bGwpIHsKLQkJCXVwZGF0ZURlbGl2ZXJhYmxlUGFydHNDbWQuZGlzcG9zZSgpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvVXBkYXRlU3VwcHJlc3Npb25Gcm9tQmFzZUNvbW1hbmQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL1VwZGF0ZVN1cHByZXNzaW9uRnJvbUJhc2VDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllNzgzNTMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvVXBkYXRlU3VwcHJlc3Npb25Gcm9tQmFzZUNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkFic3RyYWN0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlUcmVlSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklSZXNvdXJjZUF3YXJlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlByb2Nlc3NVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5TdXBwcmVzc2lvbjsKLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZSAtIEZlYiAxMCwgMjAwNgotICogQHNpbmNlICAxLjAKLSAqLwotcHVibGljIGNsYXNzIFVwZGF0ZVN1cHByZXNzaW9uRnJvbUJhc2VDb21tYW5kIGV4dGVuZHMgQWJzdHJhY3RDb21tYW5kIGltcGxlbWVudHMKLQkJSVJlc291cmNlQXdhcmVDb21tYW5kIHsKLQotCXByaXZhdGUgU3VwcHJlc3Npb24gc3VwcHJlc3Npb247Ci0JcHJpdmF0ZSBDb2xsZWN0aW9uIGVsZW1lbnRzOwotCXByaXZhdGUgSGFzaFNldCBpbmhlcml0ZWRFbGVtZW50czsKLQlwcml2YXRlIEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5OwotCXByaXZhdGUgQ29sbGVjdGlvbiBhZmZlY3RlZE9iamVjdHM7Ci0JcHJpdmF0ZSBIYXNoTWFwIG9iamVjdFRvU3VwcHJlc3Npb25TdGF0ZU1hcDsKLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBVcGRhdGVTdXBwcmVzc2lvbkZyb21CYXNlQ29tbWFuZCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbGFiZWwKLQkgKi8KLQlwdWJsaWMgVXBkYXRlU3VwcHJlc3Npb25Gcm9tQmFzZUNvbW1hbmQoU3RyaW5nIGxhYmVsLCBDb2xsZWN0aW9uIGVsZW1lbnRzLCBBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwgU3VwcHJlc3Npb24gc3VwcHJlc3Npb24pIHsKLQkJc3VwZXIobGFiZWwpOwotCQl0aGlzLmVsZW1lbnRzID0gZWxlbWVudHM7Ci0JCXRoaXMuYWRhcHRlckZhY3RvcnkgPSBhZGFwdGVyRmFjdG9yeTsKLQkJdGhpcy5zdXBwcmVzc2lvbiA9IHN1cHByZXNzaW9uOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQWJzdHJhY3RDb21tYW5kI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWlmKGFmZmVjdGVkT2JqZWN0cyAhPSBudWxsKSB7Ci0JCQlhZmZlY3RlZE9iamVjdHMuY2xlYXIoKTsKLQkJCWFmZmVjdGVkT2JqZWN0cyA9IG51bGw7Ci0JCX0KLQkJCi0JCWlmKGluaGVyaXRlZEVsZW1lbnRzICE9IG51bGwpIHsKLQkJCWluaGVyaXRlZEVsZW1lbnRzLmNsZWFyKCk7Ci0JCQlpbmhlcml0ZWRFbGVtZW50cyA9IG51bGw7Ci0JCX0KLQkJCi0JCWlmKG9iamVjdFRvU3VwcHJlc3Npb25TdGF0ZU1hcCAhPSBudWxsKSB7Ci0JCQlvYmplY3RUb1N1cHByZXNzaW9uU3RhdGVNYXAuY2xlYXIoKTsKLQkJCW9iamVjdFRvU3VwcHJlc3Npb25TdGF0ZU1hcCA9IG51bGw7Ci0JCX0KLQkJCi0JCXN1cGVyLmRpc3Bvc2UoKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSVJlc291cmNlQXdhcmVDb21tYW5kI2dldE1vZGlmaWVkUmVzb3VyY2VzKCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRNb2RpZmllZFJlc291cmNlcygpIHsKLQkJUmVzb3VyY2UgcmVzb3VyY2UgPSBzdXBwcmVzc2lvbi5nZXRQcm9jZXNzKCkuZVJlc291cmNlKCk7Ci0JCWlmKHJlc291cmNlICE9IG51bGwpIHsKLQkJCXJldHVybiBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KHJlc291cmNlKTsKLQkJfQotCQllbHNlIHsKLQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCQl9Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5BYnN0cmFjdENvbW1hbmQjZ2V0QWZmZWN0ZWRPYmplY3RzKCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRBZmZlY3RlZE9iamVjdHMoKSB7Ci0JCWlmKGFmZmVjdGVkT2JqZWN0cyA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gc3VwZXIuZ2V0QWZmZWN0ZWRPYmplY3RzKCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXR1cm4gYWZmZWN0ZWRPYmplY3RzOwotCQl9Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQjZXhlY3V0ZSgpCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJaWYoYWZmZWN0ZWRPYmplY3RzID09IG51bGwpIHsKLQkJCWFmZmVjdGVkT2JqZWN0cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJfQotCQllbHNlIHsKLQkJCWFmZmVjdGVkT2JqZWN0cy5jbGVhcigpOwotCQl9Ci0JCQotCQlpZihvYmplY3RUb1N1cHByZXNzaW9uU3RhdGVNYXAgPT0gbnVsbCkgewotCQkJb2JqZWN0VG9TdXBwcmVzc2lvblN0YXRlTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJfQotCQllbHNlIHsKLQkJCW9iamVjdFRvU3VwcHJlc3Npb25TdGF0ZU1hcC5jbGVhcigpOwotCQl9Ci0JCQotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBnZXRJbmhlcml0ZWRFbGVtZW50cygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIgd3JhcHBlciA9IChCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgaXRlci5uZXh0KCk7Ci0JCQlib29sZWFuIHdhc1N1cHByZXNzZWQgPSBzdXBwcmVzc2lvbi5pc0luU3VwcHJlc3NlZExpc3Qod3JhcHBlcik7Ci0JCQlpZihzdXBwcmVzc2lvbi51cGRhdGVTdXBwcmVzc2lvbkZyb21CYXNlKHdyYXBwZXIpKSB7Ci0JCQkJYWZmZWN0ZWRPYmplY3RzLmFkZCh3cmFwcGVyKTsKLQkJCQlvYmplY3RUb1N1cHByZXNzaW9uU3RhdGVNYXAucHV0KHdyYXBwZXIsIEJvb2xlYW4udmFsdWVPZih3YXNTdXBwcmVzc2VkKSk7Ci0JCQl9CQkJCQkJCQkJCQotCQl9Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQjcmVkbygpCi0JICovCi0JcHVibGljIHZvaWQgcmVkbygpIHsJCQotCQlleGVjdXRlKCk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5BYnN0cmFjdENvbW1hbmQjdW5kbygpCi0JICovCi0JcHVibGljIHZvaWQgdW5kbygpIHsKLQkJaWYob2JqZWN0VG9TdXBwcmVzc2lvblN0YXRlTWFwICE9IG51bGwgJiYgIW9iamVjdFRvU3VwcHJlc3Npb25TdGF0ZU1hcC5pc0VtcHR5KCkpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IG9iamVjdFRvU3VwcHJlc3Npb25TdGF0ZU1hcC5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCU1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIGl0ZXIubmV4dCgpOwotCQkJCUJvb2xlYW4gc3VwcHJlc3NlZCA9IChCb29sZWFuKSBlbnRyeS5nZXRWYWx1ZSgpOwotCQkJCWlmKHN1cHByZXNzZWQuYm9vbGVhblZhbHVlKCkpIHsKLQkJCQkJc3VwcHJlc3Npb24uc3VwcHJlc3MoQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChlbnRyeS5nZXRLZXkoKSkpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJc3VwcHJlc3Npb24ucmV2ZWFsKENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QoZW50cnkuZ2V0S2V5KCkpKTsKLQkJCQl9Ci0JCQl9Ci0JCQlhZmZlY3RlZE9iamVjdHMuY2xlYXIoKTsKLQkJCWFmZmVjdGVkT2JqZWN0cy5hZGRBbGwoZWxlbWVudHMpOwotCQl9Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5BYnN0cmFjdENvbW1hbmQjcHJlcGFyZSgpCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gcHJlcGFyZSgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uIGdldEluaGVyaXRlZEVsZW1lbnRzKCkgewotCQlpZihpbmhlcml0ZWRFbGVtZW50cyA9PSBudWxsKSB7Ci0JCQlpbmhlcml0ZWRFbGVtZW50cyA9IG5ldyBIYXNoU2V0KCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBlbGVtZW50cy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3QgZWxlbWVudCA9IChPYmplY3QpIGl0ZXIubmV4dCgpOwotCQkJCWZvciAoSXRlcmF0b3IgdHJlZUl0ZXIgPSBuZXcgQWRhcHRlckZhY3RvcnlUcmVlSXRlcmF0b3IoYWRhcHRlckZhY3RvcnksIGVsZW1lbnQpOyB0cmVlSXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCU9iamVjdCBlID0gdHJlZUl0ZXIubmV4dCgpOwotCQkJCQlpZihQcm9jZXNzVXRpbC5pc0luaGVyaXRlZChlKSkgewotCQkJCQkJaW5oZXJpdGVkRWxlbWVudHMuYWRkKGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBpbmhlcml0ZWRFbGVtZW50czsKLQl9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvVmFyeUFjdGl2aXR5Q29tbWFuZC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvVmFyeUFjdGl2aXR5Q29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MjQzYmVjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL1ZhcnlBY3Rpdml0eUNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5BYnN0cmFjdENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUNvbW1hbmRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlByb3ZpZGVyczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSVJlc291cmNlQXdhcmVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZSAtIE9jdCAxMCwgMjAwNQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgVmFyeUFjdGl2aXR5Q29tbWFuZCBleHRlbmRzIEFic3RyYWN0Q29tbWFuZCBpbXBsZW1lbnRzCi0JCUlSZXNvdXJjZUF3YXJlQ29tbWFuZCB7Ci0KLQlwcm90ZWN0ZWQgQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIgd3JhcHBlcjsKLQotCXByaXZhdGUgUHJvY2VzcyBwcm9jOwotCi0JcHJvdGVjdGVkIExpc3QgY3JlYXRlZEFjdGl2aXRpZXM7Ci0JCi0JcHVibGljIEFjdGl2aXR5IHN1cGVyQWN0aXZpdHk7Ci0KLQlwdWJsaWMgVmFyeUFjdGl2aXR5Q29tbWFuZChCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlciB3cmFwcGVyKSB7Ci0JCXRoaXMud3JhcHBlciA9IHdyYXBwZXI7Ci0JCXByb2MgPSAoUHJvY2Vzcykgd3JhcHBlci5nZXRUb3BJdGVtKCk7Ci0JfQotCi0JcHVibGljIEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyIGdldFdyYXBwZXIoKSB7Ci0JCXJldHVybiB3cmFwcGVyOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuY29tbWFuZC5JUmVzb3VyY2VBd2FyZUNvbW1hbmQjZ2V0TW9kaWZpZWRSZXNvdXJjZXMoKQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldE1vZGlmaWVkUmVzb3VyY2VzKCkgewotCQlpZiAocHJvYy5lUmVzb3VyY2UoKSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChwcm9jLmVSZXNvdXJjZSgpKTsKLQkJfQotCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5BYnN0cmFjdENvbW1hbmQjcHJlcGFyZSgpCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gcHJlcGFyZSgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZCNleGVjdXRlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQlpZiAoY3JlYXRlZEFjdGl2aXRpZXMgPT0gbnVsbCkgewotCQkJY3JlYXRlZEFjdGl2aXRpZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCX0gZWxzZSB7Ci0JCQljcmVhdGVkQWN0aXZpdGllcy5jbGVhcigpOwotCQl9Ci0KLQkJZG9WYXJ5KCk7Ci0KLQkJTGlzdCBsaXN0ZW5lcnMgPSBQcm92aWRlcnMKLQkJCQkuZ2V0Q29tbWFuZExpc3RlbmVycyhWYXJ5QWN0aXZpdHlDb21tYW5kLmNsYXNzKTsKLQkJaWYgKGxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBsaXN0ZW5lcnMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJSUNvbW1hbmRMaXN0ZW5lciBsaXN0ZW5lciA9IChJQ29tbWFuZExpc3RlbmVyKSBpdGVyLm5leHQoKTsKLQkJCQlsaXN0ZW5lci5ub3RpZnlFeGVjdXRlZCh0aGlzKTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGRvVmFyeSgpOwotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZCNyZWRvKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWRvKCkgewotCQkvLyBmaW5kIHRoZSBuZXcgd3JhcHBlcgotCQkvLwotCQlPYmplY3Qgb3duZXIgPSB3cmFwcGVyLmdldE93bmVyKCk7Ci0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciBpcCA9IChJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIpIHdyYXBwZXIuZ2V0QWRhcHRlckZhY3RvcnkoKS5hZGFwdChvd25lciwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gaXAuZ2V0Q2hpbGRyZW4ob3duZXIpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGNoaWxkID0gaXRlci5uZXh0KCk7CQkKLQkJCWlmKGNoaWxkIGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIgJiYKLQkJCQkJKChCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlciljaGlsZCkuZ2V0VmFsdWUoKSA9PSB3cmFwcGVyLmdldFZhbHVlKCkpIHsKLQkJCQl3cmFwcGVyID0gKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSBjaGlsZDsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQkKLQkJZXhlY3V0ZSgpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkFic3RyYWN0Q29tbWFuZCN1bmRvKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bmRvKCkgewotCQlMaXN0IGxpc3RlbmVycyA9IFByb3ZpZGVycwotCQkJCS5nZXRDb21tYW5kTGlzdGVuZXJzKFZhcnlBY3Rpdml0eUNvbW1hbmQuY2xhc3MpOwotCQlpZiAobGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGxpc3RlbmVycy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlJQ29tbWFuZExpc3RlbmVyIGxpc3RlbmVyID0gKElDb21tYW5kTGlzdGVuZXIpIGl0ZXIubmV4dCgpOwotCQkJCWxpc3RlbmVyLnByZVVuZG8odGhpcyk7Ci0JCQl9Ci0JCX0KLQotCQlpZiAoIWNyZWF0ZWRBY3Rpdml0aWVzLmlzRW1wdHkoKSkgewotCQkJcmVzdG9yZU9yZGVyKCk7Ci0JCQlBY3Rpdml0eSBhY3QgPSAoQWN0aXZpdHkpIGNyZWF0ZWRBY3Rpdml0aWVzLmdldCgwKTsKLQkJCXN1cGVyQWN0aXZpdHkgPSBhY3QuZ2V0U3VwZXJBY3Rpdml0aWVzKCk7Ci0JCQlhY3Quc2V0U3VwZXJBY3Rpdml0aWVzKG51bGwpOwotCQkJY3JlYXRlZEFjdGl2aXRpZXMuY2xlYXIoKTsKLQkJfQotCQkKLQkJaWYgKGxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBsaXN0ZW5lcnMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJSUNvbW1hbmRMaXN0ZW5lciBsaXN0ZW5lciA9IChJQ29tbWFuZExpc3RlbmVyKSBpdGVyLm5leHQoKTsKLQkJCQlsaXN0ZW5lci5wb3N0VW5kbyh0aGlzKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFJlc3RvcmVzIHRoZSBvcmRlciBvZiB0aGUgc2libGluZ3Mgb2YgdGhlIHdyYXBwZXIKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZXN0b3JlT3JkZXIoKSB7Ci0JCUFjdGl2aXR5IHZhcmllZEFjdCA9IChBY3Rpdml0eSkgY3JlYXRlZEFjdGl2aXRpZXMuZ2V0KGNyZWF0ZWRBY3Rpdml0aWVzLnNpemUoKSAtIDEpOwotCQlCcmVha2Rvd25FbGVtZW50IGJlID0gKEJyZWFrZG93bkVsZW1lbnQpIFRuZ1V0aWwudW53cmFwKHdyYXBwZXIpOwotCQlCcmVha2Rvd25FbGVtZW50IHByZXYgPSB2YXJpZWRBY3QuZ2V0UHJlc2VudGVkQmVmb3JlKCk7Ci0JCWlmKHByZXYgIT0gbnVsbCAmJiBwcm9jID09IFRuZ1V0aWwuZ2V0T3duaW5nUHJvY2VzcyhwcmV2KSkgewotCQkJcHJldi5zZXRQcmVzZW50ZWRBZnRlcihiZSk7Ci0JCX0KLQkJQnJlYWtkb3duRWxlbWVudCBuZXh0ID0gdmFyaWVkQWN0LmdldFByZXNlbnRlZEFmdGVyKCk7Ci0JCWlmKG5leHQgIT0gbnVsbCAmJiBwcm9jID09IFRuZ1V0aWwuZ2V0T3duaW5nUHJvY2VzcyhuZXh0KSkgewotCQkJbmV4dC5zZXRQcmVzZW50ZWRCZWZvcmUoYmUpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQWJzdHJhY3RDb21tYW5kI2dldFJlc3VsdCgpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0UmVzdWx0KCkgewotCQlyZXR1cm4gY3JlYXRlZEFjdGl2aXRpZXM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvV0JTRHJhZ0FuZERyb3BDb21tYW5kLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9XQlNEcmFnQW5kRHJvcENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjIwNzhjZi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9XQlNEcmFnQW5kRHJvcENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFzazsKLQotLyoqCi0gKiBEcmFnIGFuZCBkcm9wIGNvbW1hbmQgdG8gZHJvcCB0YXNrcyBpbiBXQlMgc3RydWN0dXJlCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMAotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBXQlNEcmFnQW5kRHJvcENvbW1hbmQgZXh0ZW5kcyBCU0RyYWdBbmREcm9wQ29tbWFuZCB7Ci0KLQkvKioKLQkgKiBAcGFyYW0gZG9tYWluCi0JICogQHBhcmFtIG93bmVyCi0JICogQHBhcmFtIGxvY2F0aW9uCi0JICogQHBhcmFtIG9wZXJhdGlvbnMKLQkgKiBAcGFyYW0gb3BlcmF0aW9uCi0JICogQHBhcmFtIGNvbGxlY3Rpb24KLQkgKi8KLQlwdWJsaWMgV0JTRHJhZ0FuZERyb3BDb21tYW5kKEVkaXRpbmdEb21haW4gZG9tYWluLCBPYmplY3Qgb3duZXIsCi0JCQlmbG9hdCBsb2NhdGlvbiwgaW50IG9wZXJhdGlvbnMsIGludCBvcGVyYXRpb24sIENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihkb21haW4sIG93bmVyLCBsb2NhdGlvbiwgb3BlcmF0aW9ucywgb3BlcmF0aW9uLCBjb2xsZWN0aW9uKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZC5CU0RyYWdBbmREcm9wQ29tbWFuZCNhY2NlcHQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHQoT2JqZWN0IG9iaikgewotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIldCU0RyYWdBbmREcm9wQ29tbWFuZC5hY2NlcHQoKTogb2JqPSIrb2JqKTsKLQotCQlpZihvYmogaW5zdGFuY2VvZiBUYXNrKSB7Ci0JCQlpZihvd25lciBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0vLwkJCQlyZXR1cm4gUHJvY2Vzc0NvbW1hbmRVdGlsLmdldFZhbGlkRGVzY3JpcHRvcihvYmosIChBY3Rpdml0eSkgb3duZXIsCi0vLwkJCQkJCSgoQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluKWRvbWFpbikuZ2V0QWRhcHRlckZhY3RvcnkoKSkgPT0gbnVsbDsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQuQlNEcmFnQW5kRHJvcENvbW1hbmQjY3JlYXRlRHJvcENvbW1hbmQoamF2YS5sYW5nLk9iamVjdCwKLQkgKiAgICAgIGphdmEudXRpbC5MaXN0KQotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGNyZWF0ZURyb3BDb21tYW5kKE9iamVjdCBvd25lciwgTGlzdCBkcm9wU3JjKSB7Ci0JCXJldHVybiBuZXcgV0JTRHJvcENvbW1hbmQoKEFjdGl2aXR5KSBvd25lciwgZHJvcFNyYyk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9XQlNEcm9wQ29tbWFuZC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvV0JTRHJvcENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGEyNzVmMy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9XQlNEcm9wQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQ4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnVpLlVzZXJJbnRlcmFjdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb24uVW5pcXVlTmFtZVBOYW1lSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZWFtUHJvZmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvcjsKLQotCi0vKioKLSAqIENvbW1hbmQgdG8gZHJhcCBhbmQgZHJvcCB0YXNrcyBvbnRvIGFuIGFjdGl2aXR5IGluIHdvcmsgYnJlYWtkb3duIHN0cnVjdHVyZQotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBXQlNEcm9wQ29tbWFuZCBleHRlbmRzIEJTRHJvcENvbW1hbmQgewotCXByaXZhdGUgQXJyYXlMaXN0IHJvbGVEZXNjTGlzdDsKLQotCXByaXZhdGUgQXJyYXlMaXN0IHdwRGVzY0xpc3Q7Ci0KLQlwcml2YXRlIEhhc2hNYXAgd3BEZXNjVG9EZWxpdmVyYWJsZVBhcnRzOwotCi0JcHJpdmF0ZSBIYXNoTWFwPFdvcmtQcm9kdWN0RGVzY3JpcHRvciwgV29ya1Byb2R1Y3REZXNjcmlwdG9yPiB3cGRUb0RlbGl2ZXJhYmxlRGVzY3JpcHRvck1hcDsKLQotCXByaXZhdGUgSGFzaE1hcDxSb2xlRGVzY3JpcHRvciwgVGVhbVByb2ZpbGU+IHJvbGVEZXNjVGVhbVByb2ZpbGVNYXA7Ci0JCi0JcHJpdmF0ZSBJRXhlY3V0b3IgZXhlY3V0b3I7Ci0KLQlwcml2YXRlIGNsYXNzIEV4ZWN1dG9yIGltcGxlbWVudHMgSUV4ZWN1dG9yIHsKLQotCQlwdWJsaWMgYm9vbGVhbiBwcmVFeGVjdXRlKCkgewotCQkJdGFza0Rlc2NMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJcm9sZURlc2NMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJd3BEZXNjTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCXdwRGVzY1RvRGVsaXZlcmFibGVQYXJ0cyA9IG5ldyBIYXNoTWFwKCk7Ci0JCQl3cGRUb0RlbGl2ZXJhYmxlRGVzY3JpcHRvck1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCQlTZXQgZGVzY3JpcHRvcnNUb1JlZnJlc2ggPSBzeW5jaHJvbml6ZSA/IGJhdGNoQ29tbWFuZC5nZXREZXNjcmlwdG9yc1RvUmVmcmVzaCgpIDogbnVsbDsKLQotCQkJTGlzdCBiZXMgPSBhY3Rpdml0eS5nZXRCcmVha2Rvd25FbGVtZW50cygpOwotCQkJVW5pcXVlTmFtZVBOYW1lSGFuZGxlciB1bmlxdWVOYW1lc0hhbmRsZXIgPSBuZXcgVW5pcXVlTmFtZVBOYW1lSGFuZGxlcihiZXMpOwotCQkJCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IGRyb3BFbGVtZW50cy5zaXplKCk7IGkrKykgewotCQkJCVRhc2sgdGFzayA9IChUYXNrKSBkcm9wRWxlbWVudHMuZ2V0KGkpOwotCQkJCVRhc2tEZXNjcmlwdG9yIGRlc2MgPSBQcm9jZXNzQ29tbWFuZFV0aWwuY3JlYXRlVGFza0Rlc2NyaXB0b3IodGFzaywKLQkJCQkJCWFjdGl2aXR5LCByb2xlRGVzY0xpc3QsIHdwRGVzY0xpc3QsCi0JCQkJCQl3cERlc2NUb0RlbGl2ZXJhYmxlUGFydHMsCi0JCQkJCQl3cGRUb0RlbGl2ZXJhYmxlRGVzY3JpcHRvck1hcCwgZGVzY3JpcHRvcnNUb1JlZnJlc2gsCi0JCQkJCQliYXRjaENvbW1hbmQuZ2V0T2JqZWN0VG9OZXdGZWF0dXJlVmFsdWVzTWFwKCksIAotCQkJCQkJV0JTRHJvcENvbW1hbmQudGhpcy5nZXRNZXRob2RDb25maWd1cmF0aW9uKCksCi0JCQkJCQlzeW5jaHJvbml6ZSwKLQkJCQkJCXN5bmNoRmVhdHVyZXMpOwotCQkJCWlmIChkZXNjICE9IG51bGwpIHsKLQkJCQkJdW5pcXVlTmFtZXNIYW5kbGVyLmVuc3VyZVVuaXF1ZShkZXNjKTsKLQkJCQkJdGFza0Rlc2NMaXN0LmFkZChkZXNjKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCS8vIEFkZCB1bmlxdWUgbmFtZSBjaGVjayBmb3Igcm9sZWRlc2MgYW5kIHdwIGRlc2NyaXB0b3JzIGFzIHdlbGwKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcm9sZURlc2NMaXN0LnNpemUoKTsgaSsrKSB7Ci0JCQkJUm9sZURlc2NyaXB0b3Igcm9sZURlc2MgPSAoUm9sZURlc2NyaXB0b3IpIHJvbGVEZXNjTGlzdC5nZXQoaSk7CQkJCi0JCQkJaWYgKHJvbGVEZXNjICE9IG51bGwpIHsKLQkJCQkJdW5pcXVlTmFtZXNIYW5kbGVyLmVuc3VyZVVuaXF1ZShyb2xlRGVzYyk7CQotCQkJCX0KLQkJCX0KLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgd3BEZXNjTGlzdC5zaXplKCk7IGkrKykgewotCQkJCVdvcmtQcm9kdWN0RGVzY3JpcHRvciB3cERlc2MgPSAoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSB3cERlc2NMaXN0LmdldChpKTsJCQkKLQkJCQlpZiAod3BEZXNjICE9IG51bGwpIHsKLQkJCQkJdW5pcXVlTmFtZXNIYW5kbGVyLmVuc3VyZVVuaXF1ZSh3cERlc2MpOwkKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gIXRhc2tEZXNjTGlzdC5pc0VtcHR5KCkKLQkJCQkJfHwgIXJvbGVEZXNjTGlzdC5pc0VtcHR5KCkKLQkJCQkJfHwgIXdwRGVzY0xpc3QuaXNFbXB0eSgpCi0JCQkJCXx8ICF3cERlc2NUb0RlbGl2ZXJhYmxlUGFydHMuaXNFbXB0eSgpCi0JCQkJCXx8ICF3cGRUb0RlbGl2ZXJhYmxlRGVzY3JpcHRvck1hcC5pc0VtcHR5KCkKLQkJCQkJfHwgYmF0Y2hDb21tYW5kLmNhbkV4ZWN1dGUoKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGRvRXhjZWN1dGUoKSB7Ci0JCQkvLyBhdXRvbWF0aWNhbGx5IGFkZCB3b3JrIHByb2R1Y3QgZGVzY3JpcHRvciB0byBkZWxpdmVyYWJsZSBwYXJ0Ci0JCQkvLwotCQkJaWYgKCF3cGRUb0RlbGl2ZXJhYmxlRGVzY3JpcHRvck1hcC5pc0VtcHR5KCkpIHsKLQkJCQlmb3IgKE1hcC5FbnRyeTxXb3JrUHJvZHVjdERlc2NyaXB0b3IsIFdvcmtQcm9kdWN0RGVzY3JpcHRvcj4gZW50cnkgOiAKLQkJCQkJd3BkVG9EZWxpdmVyYWJsZURlc2NyaXB0b3JNYXAuZW50cnlTZXQoKSkgewotCQkJCQlXb3JrUHJvZHVjdERlc2NyaXB0b3IgZGVsaXZlcmFibGUgPSAoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBlbnRyeQotCQkJCQkJCS5nZXRWYWx1ZSgpOwotCQkJCQlpZiAoIWRlbGl2ZXJhYmxlLmdldERlbGl2ZXJhYmxlUGFydHMoKS5jb250YWlucygKLQkJCQkJCQllbnRyeS5nZXRLZXkoKSkpIHsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJZGVsaXZlcmFibGUuZ2V0RGVsaXZlcmFibGVQYXJ0cygpLmFkZCgKLQkJCQkJCQkJCWVudHJ5LmdldEtleSgpKTsKLQkJCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJCQkJCS5sb2coIldCU0Ryb3BDb21tYW5kOjpkb0V4ZWN1dGUgLSBBZGRpbmcgZGVsaXZlcmFibGUgcGFydCB0byBkZWxpdmVyYWJsZSIgKyBlKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQkvLyBhZGQgdGFzayBkZXNjcmlwdG9ycwotCQkJLy8KLQkJCWFjdGl2aXR5LmdldEJyZWFrZG93bkVsZW1lbnRzKCkuYWRkQWxsKHRhc2tEZXNjTGlzdCk7Ci0KLQkJCS8vIGFkZCByb2xlIGRlc2NyaXB0b3JzCi0JCQkvLwotCQkJYWN0aXZpdHkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5hZGRBbGwocm9sZURlc2NMaXN0KTsKLQotCQkJLy8gYWRkIHdvcmsgcHJvZHVjdCBkZXNjcmlwdG9ycwotCQkJLy8KLQkJCWFjdGl2aXR5LmdldEJyZWFrZG93bkVsZW1lbnRzKCkuYWRkQWxsKHdwRGVzY0xpc3QpOwotCi0JCQkvLyBhZGQgZGVsaXZlcmFibGUgcGFydHMgdG8gdGhlIHdvcmsgcHJvZHVjdCBkZXNjcmlwdG9ycwotCQkJLy8KLQkJCWlmICghd3BEZXNjVG9EZWxpdmVyYWJsZVBhcnRzLmlzRW1wdHkoKSkgewotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHdwRGVzY1RvRGVsaXZlcmFibGVQYXJ0cy5lbnRyeVNldCgpCi0JCQkJCQkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCU1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIGl0ZXIubmV4dCgpOwotCQkJCQlXb3JrUHJvZHVjdERlc2NyaXB0b3Igd3BEZXNjID0gKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgZW50cnkKLQkJCQkJCQkuZ2V0S2V5KCk7Ci0JCQkJCXdwRGVzYy5nZXREZWxpdmVyYWJsZVBhcnRzKCkuYWRkQWxsKAotCQkJCQkJCShDb2xsZWN0aW9uKSBlbnRyeS5nZXRWYWx1ZSgpKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmKHJvbGVEZXNjVGVhbVByb2ZpbGVNYXAgPT0gbnVsbCkgewotCQkJCXJvbGVEZXNjVGVhbVByb2ZpbGVNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHJvbGVEZXNjTGlzdC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJUm9sZURlc2NyaXB0b3Igcm9sZURlc2MgPSAoUm9sZURlc2NyaXB0b3IpIGl0ZXIubmV4dCgpOwotCQkJCQlUZWFtUHJvZmlsZSB0ZWFtUHJvZmlsZSA9IFVzZXJJbnRlcmFjdGlvbkhlbHBlci5nZXRUZWFtKAotCQkJCQkJCWFjdGl2aXR5LCByb2xlRGVzYy5nZXRSb2xlKCkpOwotCQkJCQlpZiAodGVhbVByb2ZpbGUgIT0gbnVsbCkgewotCQkJCQkJcm9sZURlc2NUZWFtUHJvZmlsZU1hcC5wdXQocm9sZURlc2MsIHRlYW1Qcm9maWxlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCS8vIGFkZCByb2xlIGRlc2NyaXB0b3JzIHRvIHRlYW0gcHJvZmlsZXMKLQkJCS8vCi0JCQlmb3IgKE1hcC5FbnRyeTxSb2xlRGVzY3JpcHRvciwgVGVhbVByb2ZpbGU+IGVudHJ5IDogcm9sZURlc2NUZWFtUHJvZmlsZU1hcC5lbnRyeVNldCgpKSB7Ci0JCQkJVGVhbVByb2ZpbGUgdGVhbSA9IChUZWFtUHJvZmlsZSkgZW50cnkuZ2V0VmFsdWUoKTsKLQkJCQl0ZWFtLmdldFRlYW1Sb2xlcygpLmFkZChlbnRyeS5nZXRLZXkoKSk7Ci0JCQl9Ci0KLQkJCS8vIGFkZCBuZXcgZGVzY3JpcHRvcnMgdG8gYWN0aXZpdHkncyBwYWNrYWdlCi0JCQkvLwotCQkJUHJvY2Vzc1BhY2thZ2UgcGtnID0gKFByb2Nlc3NQYWNrYWdlKSBhY3Rpdml0eS5lQ29udGFpbmVyKCk7Ci0JCQlpZiAocGtnICE9IG51bGwpIHsKLQkJCQlwa2cuZ2V0UHJvY2Vzc0VsZW1lbnRzKCkuYWRkQWxsKHRhc2tEZXNjTGlzdCk7Ci0JCQkJcGtnLmdldFByb2Nlc3NFbGVtZW50cygpLmFkZEFsbChyb2xlRGVzY0xpc3QpOwotCQkJCXBrZy5nZXRQcm9jZXNzRWxlbWVudHMoKS5hZGRBbGwod3BEZXNjTGlzdCk7Ci0JCQl9Ci0JCQkKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGRvVW5kbygpIHsKLQkJCQotCQkJLy8gcmVtb3ZlIHdvcmsgcHJvZHVjdCBkZXNjcmlwdG9ycwotCQkJLy8KLQkJCWFjdGl2aXR5LmdldEJyZWFrZG93bkVsZW1lbnRzKCkucmVtb3ZlQWxsKHdwRGVzY0xpc3QpOwotCi0JCQkvLyByZW1vdmUgcm9sZSBkZXNjcmlwdG9ycwotCQkJLy8KLQkJCWFjdGl2aXR5LmdldEJyZWFrZG93bkVsZW1lbnRzKCkucmVtb3ZlQWxsKHJvbGVEZXNjTGlzdCk7Ci0KLQkJCS8vIHJlbW92ZSB0YXNrIGRlc2NyaXB0b3JzCi0JCQkvLwotCQkJYWN0aXZpdHkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5yZW1vdmVBbGwodGFza0Rlc2NMaXN0KTsKLQotCQkJLy8gcmVtb3ZlIGRlbGl2ZXJhYmxlIHBhcnRzIHRvIHRoZSB3b3JrIHByb2R1Y3QgZGVzY3JpcHRvcnMKLQkJCS8vCi0JCQlpZiAoIXdwRGVzY1RvRGVsaXZlcmFibGVQYXJ0cy5pc0VtcHR5KCkpIHsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB3cERlc2NUb0RlbGl2ZXJhYmxlUGFydHMuZW50cnlTZXQoKQotCQkJCQkJLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQlNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBpdGVyLm5leHQoKTsKLQkJCQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yIHdwRGVzYyA9IChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIGVudHJ5Ci0JCQkJCQkJLmdldEtleSgpOwotCQkJCQl3cERlc2MuZ2V0RGVsaXZlcmFibGVQYXJ0cygpLnJlbW92ZUFsbCgKLQkJCQkJCQkoQ29sbGVjdGlvbikgZW50cnkuZ2V0VmFsdWUoKSk7Ci0JCQkJfQotCQkJfQotCi0JCQkvLyByZW1vdmUgd29yayBwcm9kdWN0IGRlc2NyaXB0b3IgZnJvbSBkZWxpdmVyYWJsZSBwYXJ0Ci0JCQkvLwotCQkJaWYgKCF3cGRUb0RlbGl2ZXJhYmxlRGVzY3JpcHRvck1hcC5pc0VtcHR5KCkpIHsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB3cGRUb0RlbGl2ZXJhYmxlRGVzY3JpcHRvck1hcC5lbnRyeVNldCgpCi0JCQkJCQkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCU1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIGl0ZXIubmV4dCgpOwotCQkJCQlXb3JrUHJvZHVjdERlc2NyaXB0b3IgZGVsaXZlcmFibGUgPSAoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBlbnRyeQotCQkJCQkJCS5nZXRWYWx1ZSgpOwotCQkJCQlkZWxpdmVyYWJsZS5nZXREZWxpdmVyYWJsZVBhcnRzKCkucmVtb3ZlKGVudHJ5LmdldEtleSgpKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCS8vIHJlbW92ZSByb2xlIGRlc2NyaXB0b3JzIGZyb20gdGVhbSBwcm9maWxlcwotCQkJLy8KLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHJvbGVEZXNjVGVhbVByb2ZpbGVNYXAuZW50cnlTZXQoKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSkgaXRlci5uZXh0KCk7Ci0JCQkJVGVhbVByb2ZpbGUgdGVhbSA9IChUZWFtUHJvZmlsZSkgZW50cnkuZ2V0VmFsdWUoKTsKLQkJCQl0ZWFtLmdldFRlYW1Sb2xlcygpLnJlbW92ZShlbnRyeS5nZXRLZXkoKSk7Ci0JCQl9Ci0KLQkJCS8vIHJlbW92ZSBkZXNjcmlwdG9ycyBmcm9tIGFjdGl2aXR5J3MgcGFja2FnZQotCQkJLy8KLQkJCVByb2Nlc3NQYWNrYWdlIHBrZyA9IChQcm9jZXNzUGFja2FnZSkgYWN0aXZpdHkuZUNvbnRhaW5lcigpOwotCQkJaWYgKHBrZyAhPSBudWxsKSB7Ci0JCQkJcGtnLmdldFByb2Nlc3NFbGVtZW50cygpLnJlbW92ZUFsbCh0YXNrRGVzY0xpc3QpOwotCQkJCXBrZy5nZXRQcm9jZXNzRWxlbWVudHMoKS5yZW1vdmVBbGwocm9sZURlc2NMaXN0KTsKLQkJCQlwa2cuZ2V0UHJvY2Vzc0VsZW1lbnRzKCkucmVtb3ZlQWxsKHdwRGVzY0xpc3QpOwotCQkJfQotCQl9Ci0KLQl9OwotCi0JLyoqCi0JICogQHBhcmFtIGFjdAotCSAqICAgICAgICAgICAgdGhlIGFjdGl2aXR5IHRoYXQgdGhlIGdpdmVuIHRhc2tzIGFyZSBkcm9wcGVkIG9uCi0JICogQHBhcmFtIHRhc2tzCi0JICogICAgICAgICAgICB0aGUgdGFza3MgdG8gZHJvcCBvbiB0aGUgZ2l2ZW4gYWN0aXZpdHkKLQkgKi8KLQlwdWJsaWMgV0JTRHJvcENvbW1hbmQoQWN0aXZpdHkgYWN0LCBMaXN0IHRhc2tzKSB7Ci0JCXN1cGVyKGFjdCwgdGFza3MpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBkcm9wRWxlbWVudHMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZWxlbWVudCA9IGl0ZXIubmV4dCgpOwotCQkJaWYgKCEoZWxlbWVudCBpbnN0YW5jZW9mIFRhc2spKSB7Ci0JCQkJaXRlci5yZW1vdmUoKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBhY3Rpdml0eQotCSAqIEBwYXJhbSBkcm9wRWxlbWVudHMKLQkgKiBAcGFyYW0gc3luY2gKLQkgKi8KLQlwdWJsaWMgV0JTRHJvcENvbW1hbmQoQWN0aXZpdHkgYWN0aXZpdHksIExpc3QgZHJvcEVsZW1lbnRzLCBib29sZWFuIHN5bmNoKSB7Ci0JCXN1cGVyKGFjdGl2aXR5LCBkcm9wRWxlbWVudHMsIHN5bmNoKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gYWN0aXZpdHkKLQkgKiBAcGFyYW0gZHJvcEVsZW1lbnRzCi0JICogQHBhcmFtIGNvbmZpZwotCSAqIEBwYXJhbSBzeW5jaEZlYXR1cmVzCi0JICovCi0JcHVibGljIFdCU0Ryb3BDb21tYW5kKEFjdGl2aXR5IGFjdGl2aXR5LCBMaXN0IGRyb3BFbGVtZW50cywKLQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnLCBTZXQgc3luY2hGZWF0dXJlcykgewotCQlzdXBlcihhY3Rpdml0eSwgZHJvcEVsZW1lbnRzLCBjb25maWcsIHN5bmNoRmVhdHVyZXMpOwotCX0KLQotCXB1YmxpYyBJRXhlY3V0b3IgZ2V0RXhlY3V0b3IoKSB7Ci0JCWlmIChleGVjdXRvciA9PSBudWxsKSB7Ci0JCQlleGVjdXRvciA9IG5ldyBFeGVjdXRvcigpOwotCQl9Ci0JCXJldHVybiBleGVjdXRvcjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZC5CU0Ryb3BDb21tYW5kI3ByZUV4ZWN1dGUoKQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHByZUV4ZWN1dGUoKSB7Ci0JCWlmICghc3VwZXIucHJlRXhlY3V0ZSgpKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCXJldHVybiBnZXRFeGVjdXRvcigpLnByZUV4ZWN1dGUoKTsKLQl9Ci0JCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQuQlNEcm9wQ29tbWFuZCNkb0V4ZWN1dGUoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRvRXhlY3V0ZSgpIHsKLQkJZXhlY3V0b3IuZG9FeGNlY3V0ZSgpOwotCX0KLQkKLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5BYnN0cmFjdENvbW1hbmQjZ2V0QWZmZWN0ZWRPYmplY3RzKCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRBZmZlY3RlZE9iamVjdHMoKSB7Ci0JCWlmICh0YXNrRGVzY0xpc3QgIT0gbnVsbCkgewotCQkJcmV0dXJuIHRhc2tEZXNjTGlzdDsKLQkJfQotCi0JCXJldHVybiBzdXBlci5nZXRBZmZlY3RlZE9iamVjdHMoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZC5CU0Ryb3BDb21tYW5kI2RvVW5kbygpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZG9VbmRvKCkgewotCQlleGVjdXRvci5kb1VuZG8oKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZC5CU0Ryb3BDb21tYW5kI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWlmIChyb2xlRGVzY0xpc3QgIT0gbnVsbCkgewotCQkJcm9sZURlc2NMaXN0LmNsZWFyKCk7Ci0JCX0KLQkJaWYgKHJvbGVEZXNjVGVhbVByb2ZpbGVNYXAgIT0gbnVsbCkgewotCQkJcm9sZURlc2NUZWFtUHJvZmlsZU1hcC5jbGVhcigpOwotCQl9Ci0JCWlmICh3cERlc2NMaXN0ICE9IG51bGwpIHsKLQkJCXdwRGVzY0xpc3QuY2xlYXIoKTsKLQkJfQotCQlpZiAod3BEZXNjVG9EZWxpdmVyYWJsZVBhcnRzICE9IG51bGwpIHsKLQkJCXdwRGVzY1RvRGVsaXZlcmFibGVQYXJ0cy5jbGVhcigpOwotCQl9Ci0JCWlmICh3cGRUb0RlbGl2ZXJhYmxlRGVzY3JpcHRvck1hcCAhPSBudWxsKSB7Ci0JCQl3cGRUb0RlbGl2ZXJhYmxlRGVzY3JpcHRvck1hcC5jbGVhcigpOwotCQl9Ci0KLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL1dvcmtQcm9kdWN0RGVzY3JpcHRvckNyZWF0ZUNvcHlDb21tYW5kLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9Xb3JrUHJvZHVjdERlc2NyaXB0b3JDcmVhdGVDb3B5Q29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYjNjZmJkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL1dvcmtQcm9kdWN0RGVzY3JpcHRvckNyZWF0ZUNvcHlDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29weUNvbW1hbmQuSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5BZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlUcmVlSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQXJ0aWZhY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC5jb21tYW5kLk1ldGhvZEVsZW1lbnRDcmVhdGVDb3B5Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQuZG9tYWluLlRyYWNlYWJsZUFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbjsKLQotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlIC0gT2N0IDEyLCAyMDA1Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBXb3JrUHJvZHVjdERlc2NyaXB0b3JDcmVhdGVDb3B5Q29tbWFuZCBleHRlbmRzCi0JCU1ldGhvZEVsZW1lbnRDcmVhdGVDb3B5Q29tbWFuZCB7Ci0KLQkvKioKLQkgKiBAcGFyYW0gZG9tYWluCi0JICogQHBhcmFtIG93bmVyCi0JICogQHBhcmFtIGNvcHlIZWxwZXIKLQkgKi8KLQlwdWJsaWMgV29ya1Byb2R1Y3REZXNjcmlwdG9yQ3JlYXRlQ29weUNvbW1hbmQoRWRpdGluZ0RvbWFpbiBkb21haW4sCi0JCQlFT2JqZWN0IG93bmVyLCBIZWxwZXIgY29weUhlbHBlcikgewotCQlzdXBlcihkb21haW4sIG93bmVyLCBjb3B5SGVscGVyKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC5jb21tYW5kLk1ldGhvZEVsZW1lbnRDcmVhdGVDb3B5Q29tbWFuZCNkb0V4ZWN1dGUoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRvRXhlY3V0ZSgpIHsKLQkJc3VwZXIuZG9FeGVjdXRlKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNyZWF0ZUNvcHlDb21tYW5kI2RvR2V0Q2hpbGRyZW5Ub0NvcHkoKQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGRvR2V0Q2hpbGRyZW5Ub0NvcHkoKSB7Ci0JCUNvbGxlY3Rpb24gY2hpbGRyZW4gPSBzdXBlci5kb0dldENoaWxkcmVuVG9Db3B5KCk7Ci0KLQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yIHdwZCA9IChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIG93bmVyOwotCQlXb3JrUHJvZHVjdCB3cCA9IHdwZC5nZXRXb3JrUHJvZHVjdCgpOwotCQlpZiAod3AgaW5zdGFuY2VvZiBEZWxpdmVyYWJsZSkgewotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gd3BkLmdldERlbGl2ZXJhYmxlUGFydHMoKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yIHBhcnQgPSAoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBpdGVyCi0JCQkJCQkubmV4dCgpOwotCQkJCWlmIChwYXJ0LmdldFN1cGVyQWN0aXZpdGllcygpID09IG51bGwgJiYgcGFydCAhPSB3cGQpIHsKLQkJCQkJY2hpbGRyZW4uYWRkKHBhcnQpOwotCQkJCX0KLQkJCX0KLQkJfSBlbHNlIGlmICh3cCBpbnN0YW5jZW9mIEFydGlmYWN0KSB7Ci0JCQlpZiAoZG9tYWluIGluc3RhbmNlb2YgQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluKSB7Ci0JCQkJQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkgPSAoKEFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbikgZG9tYWluKQotCQkJCQkJLmdldEFkYXB0ZXJGYWN0b3J5KCk7Ci0JCQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyIGl0ZW1Qcm92aWRlciA9IChJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIpIGFkYXB0ZXJGYWN0b3J5Ci0JCQkJCQkuYWRhcHQob3duZXIsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gaXRlbVByb3ZpZGVyLmdldENoaWxkcmVuKG93bmVyKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQljaGlsZHJlbi5hZGQoVG5nVXRpbC51bndyYXAoaXRlci5uZXh0KCkpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gY2hpbGRyZW47Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQuY29tbWFuZC5NZXRob2RFbGVtZW50Q3JlYXRlQ29weUNvbW1hbmQjZG9HZXRSZXN1bHQoKQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGRvR2V0UmVzdWx0KCkgewotCQlBcnJheUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlyZXN1bHQuYWRkKGNvcHkpOwotCi0JCS8vIENoaWxkcmVuIHRoYXQgYXJlIHNob3duIGluIEJTIGR1ZSB0byBjaGlsZCByZWxhdGlvbnNoaXAgb2YgaXRzIGxpbmtlZAotCQkvLyBDb250ZW50RWxlbWVudAotCQkvLyBidXQgdGhleSBhcmUgbm90IGRpcmVjdGx5IGFzc29jaWF0ZWQgd2l0aCB0aGUgb3duZXIuIFdlIG5lZWQgdG8gYWRkCi0JCS8vIHRoZWlyIGNvcGllcyB0byB0aGUgcmVzdWx0Ci0JCS8vIHNvIHRoZXkgd2lsbCBiZSBhZGRlZCB0byBjbGlwYm9hcmQgZm9yIGxhdGVyIHBhc3RlCi0JCS8vCi0JCVdvcmtQcm9kdWN0RGVzY3JpcHRvciB3cGQgPSAoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBvd25lcjsKLQkJV29ya1Byb2R1Y3Qgd3AgPSB3cGQuZ2V0V29ya1Byb2R1Y3QoKTsKLQkJaWYgKHdwIGluc3RhbmNlb2YgQXJ0aWZhY3QpIHsKLQkJCWlmIChkb21haW4gaW5zdGFuY2VvZiBBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW4pIHsKLQkJCQlBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSA9ICgoQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluKSBkb21haW4pCi0JCQkJCQkuZ2V0QWRhcHRlckZhY3RvcnkoKTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBuZXcgQWRhcHRlckZhY3RvcnlUcmVlSXRlcmF0b3IoCi0JCQkJCQlhZGFwdGVyRmFjdG9yeSwgd3BkLCBmYWxzZSk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQlPYmplY3QgY2hpbGRDb3B5ID0gY29weUhlbHBlci5nZXQoVG5nVXRpbC51bndyYXAoaXRlcgotCQkJCQkJCS5uZXh0KCkpKTsKLQkJCQkJaWYgKGNoaWxkQ29weSAhPSBudWxsKSB7Ci0JCQkJCQlyZXN1bHQuYWRkKGNoaWxkQ29weSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlpZiAoZG9tYWluIGluc3RhbmNlb2YgVHJhY2VhYmxlQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluKQotCQkJKChUcmFjZWFibGVBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW4pIGRvbWFpbikuYWRkQ29weUluZm8ocmVzdWx0LAotCQkJCQljb3B5SGVscGVyKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL3BhY2thZ2UuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWE0OTg3NC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyBjb21tYW5kcyBmb3IgZWRpdGluZyBicmVha2Rvd24gZWxlbWVudHMgaW4gYSBQcm9jZXNzIGVkaXRvci4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29uc29saWRhdGVkL0FjdGl2aXR5SXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29uc29saWRhdGVkL0FjdGl2aXR5SXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3OTcxNGMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbnNvbGlkYXRlZC9BY3Rpdml0eUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb25zb2xpZGF0ZWQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkJTQWN0aXZpdHlJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkV4cG9zZWRBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuUHJvY2Vzc1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQXNzb2NpYXRpb25IZWxwZXI7Ci0KLQotLyoqCi0gKiBBY3Rpdml0eSBpdGVtIHByb3ZpZGVyIGZvciBjb25zb2xpZGF0ZWQgdmlldwotICogCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXR5SXRlbVByb3ZpZGVyIGV4dGVuZHMgQlNBY3Rpdml0eUl0ZW1Qcm92aWRlciB7Ci0KLQkvKioKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgQWN0aXZpdHlJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CU0FjdGl2aXR5SXRlbVByb3ZpZGVyI2dldE9iamVjdChvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaXB0b3IpCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBnZXRPYmplY3QoRGVzY3JpcHRvciBkZXNjcmlwdG9yKSB7Ci0JCXJldHVybiAoKFRhc2tEZXNjcmlwdG9yKSBkZXNjcmlwdG9yKS5nZXRUYXNrKCk7Ci0JfQotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0RUNsYXNzZXMoKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CU0FjdGl2aXR5SXRlbVByb3ZpZGVyI2RvUmVmcmVzaEFmZmVjdGVkVmlld2VycygpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZG9SZWZyZXNoQWZmZWN0ZWRWaWV3ZXJzKCkgewotCQlPYmplY3QgcHJvYyA9IGdldFRvcEl0ZW0oKTsKLQkJT2JqZWN0IGl0ZW1Qcm92aWRlciA9IGFkYXB0ZXJGYWN0b3J5LmFkYXB0KHByb2MsCi0JCQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJaWYgKGl0ZW1Qcm92aWRlciBpbnN0YW5jZW9mIEJTQWN0aXZpdHlJdGVtUHJvdmlkZXIpIHsKLQkJCSgoQlNBY3Rpdml0eUl0ZW1Qcm92aWRlcikgaXRlbVByb3ZpZGVyKQotCQkJCQkuc2V0UmVmcmVzaEFsbElEc1JlcXVpcmVkKHRydWUpOwotCQl9Ci0KLQkJUHJvY2Vzc1V0aWwKLQkJCQkucmVmcmVzaElEc0luVmlld2VycygoRXhwb3NlZEFkYXB0ZXJGYWN0b3J5KSBnZXRSb290QWRhcHRlckZhY3RvcnkoKSk7Ci0JfQotCQotCXByb3RlY3RlZCBDb2xsZWN0aW9uIHJlbW92ZVN1YmFydGlmYWN0c0Zyb21DaGlsZHJlbihDb2xsZWN0aW9uIGNoaWxkcmVuLCBib29sZWFuIHVud3JhcCkgewotCQlyZXR1cm4gUHJvY2Vzc1V0aWwucmVtb3ZlU3ViYXJ0aWZhY3RzRnJvbUNoaWxkcmVuKGNoaWxkcmVuLCB1bndyYXApOwotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBvYmopIHsKLQkJTGlzdCBuZXdDaGlsZHJlbiA9IG5ldyBBcnJheUxpc3QoKTsKLQkJQ29sbGVjdGlvbiBjaGlsZHJlbiA9IHN1cGVyLmdldENoaWxkcmVuKG9iaik7Ci0JCWNoaWxkcmVuID0gcmVtb3ZlU3ViYXJ0aWZhY3RzRnJvbUNoaWxkcmVuKGNoaWxkcmVuLCBmYWxzZSk7Ci0JCUxpc3Qgcm9sZURlc2NyaXB0b3JzID0gbmV3IEFycmF5TGlzdCgpOwotCQlMaXN0IHdwRGVzY3JpcHRvcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRvciA9IGNoaWxkcmVuLml0ZXJhdG9yKCk7IGl0b3IuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IG9iamVjdCA9IGl0b3IubmV4dCgpOwotCQkJT2JqZWN0IGUgPSBUbmdVdGlsLnVud3JhcChvYmplY3QpOwotCQkJCi0JCQkvLyBkb24ndCByZXR1cm4gcm9sZWRlc2NyaXB0b3Igd2hpY2ggYXJlIGxpbmtlZCB0byB0YXNrZGVzY3JpcHRvcgotCQkJLy8gCi0JCQlpZiAoZSBpbnN0YW5jZW9mIFJvbGVEZXNjcmlwdG9yKSB7Ci0JCQkJUm9sZURlc2NyaXB0b3Igcm9sZURlc2MgPSAoUm9sZURlc2NyaXB0b3IpIGU7Ci0JCQkJaWYoQXNzb2NpYXRpb25IZWxwZXIuZ2V0UHJpbWFyeVRhc2tEZXNjcmlwdG9ycyhyb2xlRGVzYykuaXNFbXB0eSgpICYmCi0JCQkJCQlBc3NvY2lhdGlvbkhlbHBlci5nZXRBZGRpdGlvbmFsVGFza0Rlc2NyaXB0b3JzKHJvbGVEZXNjKS5pc0VtcHR5KCkgJiYKLQkJCQkJCUFzc29jaWF0aW9uSGVscGVyLmdldEFzc2lzdGVkVGFza0Rlc2NyaXB0b3JzKHJvbGVEZXNjKS5pc0VtcHR5KCkpIAotCQkJCXsKLQkJCQkJcm9sZURlc2NyaXB0b3JzLmFkZChvYmplY3QpOwotCQkJCX0KLQkJCX0KLQkJCS8vIGRvbid0IHJldHVybiB3cGRlc2NyaXB0b3Igd2hpY2ggYXJlIGxpbmtlZCB0byBlaXRoZXIKLQkJCS8vIHRhc2tkZXNjcmlwdG9yIG9yIHJvbGVkZXNjcmlwdG9yCi0JCQllbHNlIGlmIChlIGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yKSB7Ci0JCQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yIHdwRGVzYyA9IChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIGU7Ci0JCQkJaWYoQXNzb2NpYXRpb25IZWxwZXIuZ2V0RXh0ZXJuYWxJbnB1dFRvKHdwRGVzYykuaXNFbXB0eSgpICYmCi0JCQkJCQlBc3NvY2lhdGlvbkhlbHBlci5nZXRNYW5kYXRvcnlJbnB1dFRvKHdwRGVzYykuaXNFbXB0eSgpICYmCi0JCQkJCQlBc3NvY2lhdGlvbkhlbHBlci5nZXRPcHRpb25hbElucHV0VG8od3BEZXNjKS5pc0VtcHR5KCkgJiYKLQkJCQkJCUFzc29jaWF0aW9uSGVscGVyLmdldE91dHB1dEZyb20od3BEZXNjKS5pc0VtcHR5KCkgJiYKLQkJCQkJCUFzc29jaWF0aW9uSGVscGVyLmdldFJlc3BvbnNpYmxlUm9sZURlc2NyaXB0b3JzKHdwRGVzYykuaXNFbXB0eSgpKQotCQkJCXsKLQkJCQkJd3BEZXNjcmlwdG9ycy5hZGQob2JqZWN0KTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCW5ld0NoaWxkcmVuLmFkZChvYmplY3QpOwotCQkJfQotCQl9Ci0JCi0JCW5ld0NoaWxkcmVuLmFkZEFsbChyb2xlRGVzY3JpcHRvcnMpOwotCQluZXdDaGlsZHJlbi5hZGRBbGwod3BEZXNjcmlwdG9ycyk7Ci0JCQotCQl1cGRhdGVDYWNoZWRDaGlsZHJlbihuZXdDaGlsZHJlbik7Ci0JCQotCQlyZXR1cm4gbmV3Q2hpbGRyZW47Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CU0FjdGl2aXR5SXRlbVByb3ZpZGVyI2dldFJvbGx1cENoaWxkcmVuRnJvbUNhY2hlKCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRSb2xsdXBDaGlsZHJlbkZyb21DYWNoZSgpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CU0FjdGl2aXR5SXRlbVByb3ZpZGVyI2lzUm9sbGVkVXAoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUm9sbGVkVXAoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb25zb2xpZGF0ZWQvSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb25zb2xpZGF0ZWQvSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGY0Mjk4Yy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29uc29saWRhdGVkL0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29uc29saWRhdGVkOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5UZWFtUHJvZmlsZUl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuV0JTSXRlbVByb3ZpZGVyQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5IGV4dGVuZHMgV0JTSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkgewotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5JdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSNjcmVhdGVUYXNrRGVzY3JpcHRvckFkYXB0ZXIoKQotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVRhc2tEZXNjcmlwdG9yQWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBUYXNrRGVzY3JpcHRvckl0ZW1Qcm92aWRlcih0aGlzLAotCQkJCShJdGVtUHJvdmlkZXJBZGFwdGVyKSBUbmdVdGlsLnVtYUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5Ci0JCQkJCQkuY3JlYXRlVGFza0Rlc2NyaXB0b3JBZGFwdGVyKCkpOwotCX0KLQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVJvbGVEZXNjcmlwdG9yQWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBSb2xlRGVzY3JpcHRvckl0ZW1Qcm92aWRlcih0aGlzLAotCQkJCShJdGVtUHJvdmlkZXJBZGFwdGVyKSBUbmdVdGlsLnVtYUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5Ci0JCQkJCQkuY3JlYXRlUm9sZURlc2NyaXB0b3JBZGFwdGVyKCkpOwotCX0KLQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVdvcmtQcm9kdWN0RGVzY3JpcHRvckFkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgV29ya1Byb2R1Y3REZXNjcmlwdG9ySXRlbVByb3ZpZGVyKHRoaXMsCi0JCQkJKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIFRuZ1V0aWwudW1hSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkKLQkJCQkJCS5jcmVhdGVXb3JrUHJvZHVjdERlc2NyaXB0b3JBZGFwdGVyKCkpOwotCX0KLQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUFjdGl2aXR5QWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBBY3Rpdml0eUl0ZW1Qcm92aWRlcih0aGlzKTsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVDYXBhYmlsaXR5UGF0dGVybkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvY2Vzc0l0ZW1Qcm92aWRlcih0aGlzLAotCQkJCShJdGVtUHJvdmlkZXJBZGFwdGVyKSBUbmdVdGlsLnVtYUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5Ci0JCQkJCQkuY3JlYXRlQ2FwYWJpbGl0eVBhdHRlcm5BZGFwdGVyKCkpOwotCX0KLQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZURlbGl2ZXJ5UHJvY2Vzc0FkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvY2Vzc0l0ZW1Qcm92aWRlcih0aGlzLAotCQkJCShJdGVtUHJvdmlkZXJBZGFwdGVyKSBUbmdVdGlsLnVtYUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5Ci0JCQkJCQkuY3JlYXRlRGVsaXZlcnlQcm9jZXNzQWRhcHRlcigpKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5VbWFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSNjcmVhdGVUZWFtUHJvZmlsZUFkYXB0ZXIoKQotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVRlYW1Qcm9maWxlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBUZWFtUHJvZmlsZUl0ZW1Qcm92aWRlcih0aGlzLCAoSXRlbVByb3ZpZGVyQWRhcHRlcikgVG5nVXRpbC51bWFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5jcmVhdGVUZWFtUHJvZmlsZUFkYXB0ZXIoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbnNvbGlkYXRlZC9Qcm9jZXNzSXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29uc29saWRhdGVkL1Byb2Nlc3NJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGEwYTllOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29uc29saWRhdGVkL1Byb2Nlc3NJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb25zb2xpZGF0ZWQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLQotLyoqCi0gKiBQcm9jZXNzIGl0ZW0gcHJvdmlkZXIgZm9yIGNvbnNvbGlkYXRlZCB2aWV3Ci0gKiAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9jZXNzSXRlbVByb3ZpZGVyIGV4dGVuZHMgQWN0aXZpdHlJdGVtUHJvdmlkZXIgewotCi0JcHJpdmF0ZSBJdGVtUHJvdmlkZXJBZGFwdGVyIGRlbGVnYXRlSXRlbVByb3ZpZGVyOwotCi0JcHVibGljIFByb2Nlc3NJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksCi0JCQlJdGVtUHJvdmlkZXJBZGFwdGVyIGRlbGVnYXRlSXRlbVByb3ZpZGVyKSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQkJdGhpcy5kZWxlZ2F0ZUl0ZW1Qcm92aWRlciA9IGRlbGVnYXRlSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5BY3Rpdml0eUl0ZW1Qcm92aWRlciNnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9IGRlbGVnYXRlSXRlbVByb3ZpZGVyCi0JCQkJCS5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKFByb2Nlc3NDb21wb25lbnQuY2xhc3MpKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX19QUkVTRU5UQVRJT05fTkFNRToKLQkJCS8vIG5lZWQgdG8gdXBkYXRlIHRoZSBsaWJyYXJ5IHZpZXcKLQkJCS8vIGJ1dCBQcm9jZXNzQ29tcG9uZW50cyBkb24ndCBoYXZlIGEgUHJlc2VudGF0aW9uIE5hbWUsIHNvCi0JCQkvLyBjaGFuZ2UgdGhlIG5hbWUgb2YgdGhlIHByb2NDb21wIHRvIGl0c2VsZgotCQkJLy8gdGhpcyB3aWxsIGNhdXNlIGEgcmVmcmVzaAotCQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzIHByb2MgPSAob3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzKSBub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKTsKLQkJCWlmIChwcm9jLmVDb250YWluZXIoKSAhPSBudWxsKSB7Ci0JCQkJYm9vbGVhbiBvbGQgPSBwcm9jLmVDb250YWluZXIoKS5lRGVsaXZlcigpOwotCQkJCXRyeSB7Ci0JCQkJCXByb2MuZUNvbnRhaW5lcigpLmVTZXREZWxpdmVyKHRydWUpOwotCQkJCQlpZiAocHJvYy5lQ29udGFpbmVyKCkgaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50KQotCQkJCQkJKChQcm9jZXNzQ29tcG9uZW50KXByb2MuZUNvbnRhaW5lcigpKS5zZXROYW1lKCgoUHJvY2Vzc0NvbXBvbmVudClwcm9jLmVDb250YWluZXIoKSkuZ2V0TmFtZSgpKTsKLQkJCQl9IGZpbmFsbHkgewotCQkJCQlwcm9jLmVDb250YWluZXIoKS5lU2V0RGVsaXZlcihvbGQpOwotCQkJCX0KLQkJCX0KLQkJCWJyZWFrOwotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29uc29saWRhdGVkL1JvbGVEZXNjcmlwdG9ySXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29uc29saWRhdGVkL1JvbGVEZXNjcmlwdG9ySXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2N2RhNmEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbnNvbGlkYXRlZC9Sb2xlRGVzY3JpcHRvckl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb25zb2xpZGF0ZWQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuV3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5JQlNJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLklCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkNvbXBhcmF0b3JzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Qcm9jZXNzVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5Bc3NvY2lhdGlvbkhlbHBlcjsKLQotCi0vKioKLSAqIFJvbGVEZXNjcmlwdG9yIEl0ZW0gcHJvdmlkZXIgZm9yIGNvbnNvbGlkYXRlZCB2aWV3Ci0gKiAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBSb2xlRGVzY3JpcHRvckl0ZW1Qcm92aWRlciBleHRlbmRzCi0JCW9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5Sb2xlRGVzY3JpcHRvckl0ZW1Qcm92aWRlciB7Ci0KLQkvKioKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKiBAcGFyYW0gZGVsZWdhdGVJdGVtUHJvdmlkZXIKLQkgKi8KLQlwdWJsaWMgUm9sZURlc2NyaXB0b3JJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksCi0JCQlJdGVtUHJvdmlkZXJBZGFwdGVyIGRlbGVnYXRlSXRlbVByb3ZpZGVyKSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5LCBkZWxlZ2F0ZUl0ZW1Qcm92aWRlcik7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkJyZWFrZG93bkVsZW1lbnRJdGVtUHJvdmlkZXIjY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoamF2YS51dGlsLkNvbGxlY3Rpb24sCi0JICogICAgICBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywKLQkJCU9iamVjdCBvYmplY3QpIHsKLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQobmV3IENvbW1hbmRQYXJhbWV0ZXIodGFyZ2V0LAotCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFJvbGVEZXNjcmlwdG9yX1Jlc3BvbnNpYmxlRm9yKCksCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlV29ya1Byb2R1Y3REZXNjcmlwdG9yKCkpKTsKLQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CcmVha2Rvd25FbGVtZW50SXRlbVByb3ZpZGVyI2dldENoaWxkcmVuRmVhdHVyZXMoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbkZlYXR1cmVzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGNoaWxkcmVuRmVhdHVyZXMgPT0gbnVsbCkgewotCQkJY2hpbGRyZW5GZWF0dXJlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWNoaWxkcmVuRmVhdHVyZXMuYWRkKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCS5nZXRSb2xlRGVzY3JpcHRvcl9SZXNwb25zaWJsZUZvcigpKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW5GZWF0dXJlczsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjaXNXcmFwcGluZ05lZWRlZChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzV3JhcHBpbmdOZWVkZWQoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0Q3JlYXRlQ2hpbGRUZXh0KGphdmEubGFuZy5PYmplY3QsCi0JICogICAgICBqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLnV0aWwuQ29sbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENyZWF0ZUNoaWxkVGV4dChPYmplY3Qgb3duZXIsIE9iamVjdCBmZWF0dXJlLAotCQkJT2JqZWN0IGNoaWxkLCBDb2xsZWN0aW9uIHNlbGVjdGlvbikgewotCQlyZXR1cm4gZ2V0RmVhdHVyZVRleHQoZmVhdHVyZSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldENyZWF0ZUNoaWxkSW1hZ2UoamF2YS5sYW5nLk9iamVjdCwKLQkgKiAgICAgIGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5PYmplY3QsIGphdmEudXRpbC5Db2xsZWN0aW9uKQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0Q3JlYXRlQ2hpbGRJbWFnZShPYmplY3Qgb3duZXIsIE9iamVjdCBmZWF0dXJlLAotCQkJT2JqZWN0IGNoaWxkLCBDb2xsZWN0aW9uIHNlbGVjdGlvbikgewotCQlPYmplY3QgaW1nID0gVG5nVXRpbC5nZXRJbWFnZShjaGlsZCk7Ci0JCXJldHVybiBpbWcgIT0gbnVsbCA/IGltZyA6IHN1cGVyLmdldENyZWF0ZUNoaWxkSW1hZ2Uob3duZXIsIGZlYXR1cmUsIGNoaWxkLCBzZWxlY3Rpb24pOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNjcmVhdGVXcmFwcGVyKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0LAotCSAqICAgICAgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZSwgamF2YS5sYW5nLk9iamVjdCwgaW50KQotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgY3JlYXRlV3JhcHBlcihFT2JqZWN0IG9iamVjdCwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsCi0JCQlPYmplY3QgdmFsdWUsIGludCBpbmRleCkgewotCQlCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlciB3cmFwcGVyID0gKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSBJQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJLmNyZWF0ZVdyYXBwZXIodmFsdWUsIG9iamVjdCwgZmVhdHVyZSwgaW5kZXgsIGFkYXB0ZXJGYWN0b3J5KTsKLQkJd3JhcHBlci5zZXRSZWFkT25seShmYWxzZSk7Ci0JCXJldHVybiB3cmFwcGVyOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CcmVha2Rvd25FbGVtZW50SXRlbVByb3ZpZGVyI25vdGlmeUNoYW5nZWQob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCi0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChSb2xlRGVzY3JpcHRvci5jbGFzcykpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfREVTQ1JJUFRPUl9fUkVTUE9OU0lCTEVfRk9SOgotCQkJcmVmcmVzaENoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIG5vdGlmaWNhdGlvbgotCSAqLwotCXByaXZhdGUgdm9pZCByZWZyZXNoQ2hpbGRyZW4oTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQlpZiAoUHJvY2Vzc1V0aWwuaXNSZWZyZXNoUmVxdWlyZWQobm90aWZpY2F0aW9uLCBudWxsKSkgewotCQkJUHJvY2VzcyB0b3BBY3QgPSAoUHJvY2VzcykgZ2V0VG9wSXRlbSgpOwotCQkJQWRhcHRlckZhY3Rvcnkgcm9vdEFkYXB0ZXJGYWN0b3J5ID0gZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCk7Ci0KLQkJCVByb2Nlc3NVdGlsLnJlZnJlc2hWaWV3ZXIocm9vdEFkYXB0ZXJGYWN0b3J5LCB0b3BBY3QpOwotCQl9Ci0JCQotCQkvLyByZWZyZXNoIGNoaWxkcmVuIG9mIHRoaXMgaXRlbSBwcm92aWRlciwgaXRzIHBhcmVudCBhY3Rpdml0eSBhbmQKLQkJLy8gYWxsIGV4dGVuZGVycywgbG9jYWwgY29udHJpYnV0b3JzIG9mIHRoZSBwYXJlbnQgYWN0aXZpdHkKLQkJLy8KLQkJVGFza0Rlc2NyaXB0b3JJdGVtUHJvdmlkZXIucmVmcmVzaENoaWxkcmVuKHRoaXMsIG5vdGlmaWNhdGlvbik7Ci0JfQotCQotCXByaXZhdGUgdm9pZCB1cGRhdGVDYWNoZWRDaGlsZHJlbihDb2xsZWN0aW9uIGNoaWxkcmVuKSB7Ci0vLwkJaWYoY2FjaGVkQ2hpbGRyZW4gPT0gbnVsbCkgewotLy8JCQljYWNoZWRDaGlsZHJlbiA9IG5ldyBBcnJheUxpc3QoY2hpbGRyZW4pOwotLy8JCX0KLS8vCQllbHNlIHsKLS8vCQkJY2FjaGVkQ2hpbGRyZW4uY2xlYXIoKTsKLS8vCQkJY2FjaGVkQ2hpbGRyZW4uYWRkQWxsKGNoaWxkcmVuKTsKLS8vCQl9Ci0JfQotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iaikgewotCQlSb2xlRGVzY3JpcHRvciByb2xlRGVzYyA9IChSb2xlRGVzY3JpcHRvcikgb2JqOwotCQlMaXN0IG5ld0NoaWxkcmVuOwotCQotCQkvLyBJZiByb2xlcyBoYXMgYW55IG9mIHRhc2tkZXNjcmlwdG9yIGxpbmtlZCB0aGVuIGRvbid0IHNob3cgYW55Ci0JCS8vIGNoaWxkcmVuIG90aGVyd2lzZSBzaG93IGl0J3MgbGlua2VkIHdvcmtwcm9kdWN0IGRlc2NyaXB0b3IKLQkJaWYoIUFzc29jaWF0aW9uSGVscGVyLmdldFByaW1hcnlUYXNrRGVzY3JpcHRvcnMocm9sZURlc2MpLmlzRW1wdHkoKSB8fAotCQkJCSFBc3NvY2lhdGlvbkhlbHBlci5nZXRBZGRpdGlvbmFsVGFza0Rlc2NyaXB0b3JzKHJvbGVEZXNjKS5pc0VtcHR5KCkgfHwKLQkJCQkhQXNzb2NpYXRpb25IZWxwZXIuZ2V0QXNzaXN0ZWRUYXNrRGVzY3JpcHRvcnMocm9sZURlc2MpLmlzRW1wdHkoKSkKLQkJewotCQkJbmV3Q2hpbGRyZW4gPSBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCQl9Ci0JCWVsc2UgewotCQkJLy8gZ2V0IGNoaWxkcmVuCi0JCQlDb2xsZWN0aW9uIGNoaWxkcmVuID0gc3VwZXIuZ2V0Q2hpbGRyZW4ob2JqKTsKLQkJCW5ld0NoaWxkcmVuID0gbmV3IEFycmF5TGlzdCgpOwotCQkJSUZpbHRlciBmaWx0ZXIgPSBnZXRGaWx0ZXIob2JqKTsKLQkJCQotCQkJZm9yIChJdGVyYXRvciBpdG9yID0gY2hpbGRyZW4uaXRlcmF0b3IoKTsgaXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IG8gPSBpdG9yLm5leHQoKTsKLQkJCQlpZiAobyBpbnN0YW5jZW9mIFdyYXBwZXJJdGVtUHJvdmlkZXIpIHsKLQkJCQkJT2JqZWN0IGNoaWxkID0gKChXcmFwcGVySXRlbVByb3ZpZGVyKSBvKS5nZXRWYWx1ZSgpOwotCQkJCQlpZiAoKGZpbHRlciAhPSBudWxsKSAmJiAoZmlsdGVyLmFjY2VwdChjaGlsZCkpKSB7Ci0JCQkJCQluZXdDaGlsZHJlbi5hZGQobyk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCS8vCQkgc29ydCB0aGUgY2hpbGRyZW4KLQkJQ29sbGVjdGlvbnMuc29ydChuZXdDaGlsZHJlbiwgQ29tcGFyYXRvcnMuUFJFU0VOVEFUSU9OX05BTUVfQ09NUEFSQVRPUik7Ci0JCQotCQl1cGRhdGVDYWNoZWRDaGlsZHJlbihuZXdDaGlsZHJlbik7Ci0JCXJldHVybiBuZXdDaGlsZHJlbjsKLQl9Ci0KLQlwcml2YXRlIElGaWx0ZXIgZ2V0RmlsdGVyKE9iamVjdCBvYmopIHsKLQkJSUZpbHRlciBmaWx0ZXIgPSBudWxsOwotCQlPYmplY3QgcGFyZW50ID0gZ2V0UGFyZW50KG9iaik7Ci0JCUlCU0l0ZW1Qcm92aWRlciBhZGFwdGVyID0gKElCU0l0ZW1Qcm92aWRlcikgZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCkKLQkJCQkuYWRhcHQocGFyZW50LCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQlpZiAoYWRhcHRlciBpbnN0YW5jZW9mIEFjdGl2aXR5SXRlbVByb3ZpZGVyKSB7Ci0JCQlmaWx0ZXIgPSAoKEFjdGl2aXR5SXRlbVByb3ZpZGVyKSBhZGFwdGVyKS5nZXRGaWx0ZXIoKTsKLQkJfQotCi0JCXJldHVybiBmaWx0ZXI7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29uc29saWRhdGVkL1Rhc2tEZXNjcmlwdG9ySXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29uc29saWRhdGVkL1Rhc2tEZXNjcmlwdG9ySXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjYWM2MzkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbnNvbGlkYXRlZC9UYXNrRGVzY3JpcHRvckl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzY2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb25zb2xpZGF0ZWQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLldyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuSUJTSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5JQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Db21wYXJhdG9yczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuUHJvY2Vzc1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlUeXBlOwotCi0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3MgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBUYXNrRGVzY3JpcHRvckl0ZW1Qcm92aWRlciBleHRlbmRzCi0JCW9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5UYXNrRGVzY3JpcHRvckl0ZW1Qcm92aWRlciB7Ci0KLQlwcm90ZWN0ZWQgQ29sbGVjdGlvbiBjYWNoZWRDaGlsZHJlbjsKLQotCS8qKgotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqIEBwYXJhbSBkZWxlZ2F0ZUl0ZW1Qcm92aWRlcgotCSAqLwotCXB1YmxpYyBUYXNrRGVzY3JpcHRvckl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwKLQkJCUl0ZW1Qcm92aWRlckFkYXB0ZXIgZGVsZWdhdGVJdGVtUHJvdmlkZXIpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnksIGRlbGVnYXRlSXRlbVByb3ZpZGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuQnJlYWtkb3duRWxlbWVudEl0ZW1Qcm92aWRlciNjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhqYXZhLnV0aWwuQ29sbGVjdGlvbiwKLQkgKiAgICAgIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLAotCQkJT2JqZWN0IG9iamVjdCkgewotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChuZXcgQ29tbWFuZFBhcmFtZXRlcih0YXJnZXQsCi0JCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza0Rlc2NyaXB0b3JfUGVyZm9ybWVkUHJpbWFyaWx5QnkoKSwKLQkJCQlVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVSb2xlRGVzY3JpcHRvcigpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0VGFza0Rlc2NyaXB0b3JfQWRkaXRpb25hbGx5UGVyZm9ybWVkQnkoKSwKLQkJCQlVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVSb2xlRGVzY3JpcHRvcigpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0VGFza0Rlc2NyaXB0b3JfQXNzaXN0ZWRCeSgpLCBVbWFGYWN0b3J5LmVJTlNUQU5DRQotCQkJCS5jcmVhdGVSb2xlRGVzY3JpcHRvcigpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0VGFza0Rlc2NyaXB0b3JfTWFuZGF0b3J5SW5wdXQoKSwgVW1hRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkuY3JlYXRlV29ya1Byb2R1Y3REZXNjcmlwdG9yKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRUYXNrRGVzY3JpcHRvcl9PcHRpb25hbElucHV0KCksIFVtYUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJLmNyZWF0ZVdvcmtQcm9kdWN0RGVzY3JpcHRvcigpKSk7Ci0JCQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRUYXNrRGVzY3JpcHRvcl9FeHRlcm5hbElucHV0KCksIFVtYUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJLmNyZWF0ZVdvcmtQcm9kdWN0RGVzY3JpcHRvcigpKSk7Ci0JCQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRUYXNrRGVzY3JpcHRvcl9PdXRwdXQoKSwgVW1hRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkuY3JlYXRlV29ya1Byb2R1Y3REZXNjcmlwdG9yKCkpKTsKLQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CcmVha2Rvd25FbGVtZW50SXRlbVByb3ZpZGVyI2dldENoaWxkcmVuRmVhdHVyZXMoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbkZlYXR1cmVzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGNoaWxkcmVuRmVhdHVyZXMgPT0gbnVsbCkgewotCQkJY2hpbGRyZW5GZWF0dXJlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWNoaWxkcmVuRmVhdHVyZXMuYWRkKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCS5nZXRUYXNrRGVzY3JpcHRvcl9QZXJmb3JtZWRQcmltYXJpbHlCeSgpKTsKLQkJCWNoaWxkcmVuRmVhdHVyZXMuYWRkKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCS5nZXRUYXNrRGVzY3JpcHRvcl9BZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSgpKTsKLQkJCWNoaWxkcmVuRmVhdHVyZXMuYWRkKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCS5nZXRUYXNrRGVzY3JpcHRvcl9Bc3Npc3RlZEJ5KCkpOwotCQkJY2hpbGRyZW5GZWF0dXJlcy5hZGQoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJLmdldFRhc2tEZXNjcmlwdG9yX01hbmRhdG9yeUlucHV0KCkpOwotCQkJY2hpbGRyZW5GZWF0dXJlcy5hZGQoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJLmdldFRhc2tEZXNjcmlwdG9yX09wdGlvbmFsSW5wdXQoKSk7Ci0JCQljaGlsZHJlbkZlYXR1cmVzLmFkZChVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkuZ2V0VGFza0Rlc2NyaXB0b3JfRXh0ZXJuYWxJbnB1dCgpKTsKLQkJCWNoaWxkcmVuRmVhdHVyZXMuYWRkKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCS5nZXRUYXNrRGVzY3JpcHRvcl9PdXRwdXQoKSk7Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuRmVhdHVyZXM7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2lzV3JhcHBpbmdOZWVkZWQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1dyYXBwaW5nTmVlZGVkKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldENyZWF0ZUNoaWxkVGV4dChqYXZhLmxhbmcuT2JqZWN0LAotCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLk9iamVjdCwgamF2YS51dGlsLkNvbGxlY3Rpb24pCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDcmVhdGVDaGlsZFRleHQoT2JqZWN0IG93bmVyLCBPYmplY3QgZmVhdHVyZSwKLQkJCU9iamVjdCBjaGlsZCwgQ29sbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJcmV0dXJuIGdldEZlYXR1cmVUZXh0KGZlYXR1cmUpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRDcmVhdGVDaGlsZEltYWdlKGphdmEubGFuZy5PYmplY3QsCi0JICogICAgICBqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLnV0aWwuQ29sbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldENyZWF0ZUNoaWxkSW1hZ2UoT2JqZWN0IG93bmVyLCBPYmplY3QgZmVhdHVyZSwKLQkJCU9iamVjdCBjaGlsZCwgQ29sbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJT2JqZWN0IGltZyA9IFRuZ1V0aWwuZ2V0SW1hZ2UoY2hpbGQpOwotCQlyZXR1cm4gaW1nICE9IG51bGwgPyBpbWcgOiBzdXBlci5nZXRDcmVhdGVDaGlsZEltYWdlKG93bmVyLCBmZWF0dXJlLCBjaGlsZCwgc2VsZWN0aW9uKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjY3JlYXRlV3JhcHBlcihvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmUsIGphdmEubGFuZy5PYmplY3QsIGludCkKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGNyZWF0ZVdyYXBwZXIoRU9iamVjdCBvYmplY3QsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLAotCQkJT2JqZWN0IHZhbHVlLCBpbnQgaW5kZXgpIHsKLQkJQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIgd3JhcHBlciA9IChCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgSUJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCS5jcmVhdGVXcmFwcGVyKHZhbHVlLCBvYmplY3QsIGZlYXR1cmUsIGluZGV4LCBhZGFwdGVyRmFjdG9yeSk7Ci0JCXdyYXBwZXIuc2V0UmVhZE9ubHkoZmFsc2UpOwotCQlyZXR1cm4gd3JhcHBlcjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuQnJlYWtkb3duRWxlbWVudEl0ZW1Qcm92aWRlciNub3RpZnlDaGFuZ2VkKG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoVGFza0Rlc2NyaXB0b3IuY2xhc3MpKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX1BFUkZPUk1FRF9QUklNQVJJTFlfQlk6Ci0JCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX0FERElUSU9OQUxMWV9QRVJGT1JNRURfQlk6Ci0JCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX0FTU0lTVEVEX0JZOgotCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19NQU5EQVRPUllfSU5QVVQ6Ci0JCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX09QVElPTkFMX0lOUFVUOgotCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19FWFRFUk5BTF9JTlBVVDoKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fT1VUUFVUOgotCQkJcmVmcmVzaENoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCQotCXN0YXRpYyB2b2lkIHJlZnJlc2hDaGlsZHJlbihJdGVtUHJvdmlkZXJBZGFwdGVyIGlwYSwgTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewkJCi0JCWlmIChQcm9jZXNzVXRpbC5pc1JlZnJlc2hSZXF1aXJlZChub3RpZmljYXRpb24sIG51bGwpKSB7Ci0JCQlpcGEuZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbgotCQkJCQkuZ2V0Tm90aWZpZXIoKSwgdHJ1ZSwgZmFsc2UpKTsKLQotCQkJQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkgPSBpcGEuZ2V0QWRhcHRlckZhY3RvcnkoKTsKLQkJCQotCQkJaWYobm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCkgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50KSB7Ci0JCQkJLy8gbmVlZCB0byByZWZyZXNoIGNoaWxkcmVuIG9mIHBhcmVudCBhY3Rpdml0eQotCQkJCS8vCi0JCQkJQWN0aXZpdHkgcGFyZW50ID0gKChCcmVha2Rvd25FbGVtZW50KW5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpKS5nZXRTdXBlckFjdGl2aXRpZXMoKTsKLQkJCQlPYmplY3QgYWRhcHRlciA9IGFkYXB0ZXJGYWN0b3J5LmFkYXB0KHBhcmVudCwKLQkJCQkJCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCQkJaWYgKGFkYXB0ZXIgaW5zdGFuY2VvZiBJdGVtUHJvdmlkZXJBZGFwdGVyKSB7Ci0JCQkJCSgoSXRlbVByb3ZpZGVyQWRhcHRlcikgYWRhcHRlcikKLQkJCQkJLmZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLAotCQkJCQkJCXBhcmVudCwgdHJ1ZSwgZmFsc2UpKTsKLQkJCQl9Ci0KLQkJCQkvLyByZWZyZXNoIGV4dGVuZGVycyBhbmQgbG9jYWwgY29udHJpYnV0b3JzIG9mIHRoZSBwYXJlbnQKLQkJCQkvLwotCQkJCWlmKHBhcmVudCBpbnN0YW5jZW9mIFZhcmlhYmlsaXR5RWxlbWVudCkgewotCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBUbmdVdGlsLmdldEdlbmVyYWxpemVycyhwYXJlbnQpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJCVZhcmlhYmlsaXR5RWxlbWVudCB2ZSA9IChWYXJpYWJpbGl0eUVsZW1lbnQpIGl0ZXIubmV4dCgpOwotCQkJCQkJaWYodmUuZ2V0VmFyaWFiaWxpdHlUeXBlKCkgPT0gVmFyaWFiaWxpdHlUeXBlLkVYVEVORFMKLQkJCQkJCQkJfHwgdmUuZ2V0VmFyaWFiaWxpdHlUeXBlKCkgPT0gVmFyaWFiaWxpdHlUeXBlLkxPQ0FMX0NPTlRSSUJVVElPTikgewotCQkJCQkJCWFkYXB0ZXIgPSBUbmdVdGlsLmdldEFkYXB0ZXJCeVR5cGUodmUsIGFkYXB0ZXJGYWN0b3J5KTsKLQkJCQkJCQlpZiAoYWRhcHRlciBpbnN0YW5jZW9mIEl0ZW1Qcm92aWRlckFkYXB0ZXIpIHsKLQkJCQkJCQkJKChJdGVtUHJvdmlkZXJBZGFwdGVyKSBhZGFwdGVyKQotCQkJCQkJCQkuZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sCi0JCQkJCQkJCQkJdmUsIHRydWUsIGZhbHNlKSk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIG5vdGlmaWNhdGlvbgotCSAqLwotCXByaXZhdGUgdm9pZCByZWZyZXNoQ2hpbGRyZW4oTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQlyZWZyZXNoQ2hpbGRyZW4odGhpcywgbm90aWZpY2F0aW9uKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdXBkYXRlQ2FjaGVkQ2hpbGRyZW4oQ29sbGVjdGlvbiBjaGlsZHJlbikgewotLy8JCWlmKGNhY2hlZENoaWxkcmVuID09IG51bGwpIHsKLS8vCQkJY2FjaGVkQ2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KGNoaWxkcmVuKTsKLS8vCQl9Ci0vLwkJZWxzZSB7Ci0vLwkJCWNhY2hlZENoaWxkcmVuLmNsZWFyKCk7Ci0vLwkJCWNhY2hlZENoaWxkcmVuLmFkZEFsbChjaGlsZHJlbik7Ci0vLwkJfQotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBvYmopIHsKLQkJQ29sbGVjdGlvbiBjaGlsZHJlbiA9IHN1cGVyLmdldENoaWxkcmVuKG9iaik7Ci0JCUxpc3QgbmV3Q2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUxpc3QgcHJpbWFyeVBlcmZvcm1lcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUxpc3QgYWRkaXRpb25hbFBlcmZvcm1lcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUxpc3QgYXNzaXRlZEJ5ID0gbmV3IEFycmF5TGlzdCgpOwotCQlMaXN0IG1hbmRhdG9yeUlucHV0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlMaXN0IGV4dGVybmFsSW5wdXQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUxpc3Qgb3B0aW9uYWxJbnB1dCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJTGlzdCBvdXRwdXQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJSUZpbHRlciBmaWx0ZXIgPSBnZXRGaWx0ZXIob2JqKTsKLQotCQlmb3IgKEl0ZXJhdG9yIGl0b3IgPSBjaGlsZHJlbi5pdGVyYXRvcigpOyBpdG9yLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBvID0gaXRvci5uZXh0KCk7Ci0JCQlpZiAobyBpbnN0YW5jZW9mIFdyYXBwZXJJdGVtUHJvdmlkZXIpIHsKLQkJCQlPYmplY3QgY2hpbGQgPSAoKFdyYXBwZXJJdGVtUHJvdmlkZXIpIG8pLmdldFZhbHVlKCk7Ci0JCQkJCi0JCQkJCi0JCQkJaWYgKChmaWx0ZXIgIT0gbnVsbCkgJiYgKGZpbHRlci5hY2NlcHQoY2hpbGQpKSkgewotCQkJCQlpZiAoKChXcmFwcGVySXRlbVByb3ZpZGVyKSBvKS5nZXRGZWF0dXJlKCkuZXF1YWxzKAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkuZ2V0VGFza0Rlc2NyaXB0b3JfUGVyZm9ybWVkUHJpbWFyaWx5QnkoKSkpIHsKLQkJCQkJCXByaW1hcnlQZXJmb3JtZXJzLmFkZChvKTsKLQkJCQkJfSBlbHNlIGlmICgoKFdyYXBwZXJJdGVtUHJvdmlkZXIpIG8pCi0JCQkJCQkJLmdldEZlYXR1cmUoKQotCQkJCQkJCS5lcXVhbHMoCi0JCQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJCQkuZ2V0VGFza0Rlc2NyaXB0b3JfQWRkaXRpb25hbGx5UGVyZm9ybWVkQnkoKSkpIHsKLQkJCQkJCWFkZGl0aW9uYWxQZXJmb3JtZXJzLmFkZChvKTsKLQkJCQkJfSBlbHNlIGlmICgoKFdyYXBwZXJJdGVtUHJvdmlkZXIpIG8pLmdldEZlYXR1cmUoKQotCQkJCQkJCS5lcXVhbHMoCi0JCQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJCQkuZ2V0VGFza0Rlc2NyaXB0b3JfQXNzaXN0ZWRCeSgpKSkgewotCQkJCQkJYXNzaXRlZEJ5LmFkZChvKTsKLQkJCQkJfSBlbHNlIGlmICgoKFdyYXBwZXJJdGVtUHJvdmlkZXIpIG8pLmdldEZlYXR1cmUoKS5lcXVhbHMoCi0JCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCS5nZXRUYXNrRGVzY3JpcHRvcl9NYW5kYXRvcnlJbnB1dCgpKSkgewotCQkJCQkJbWFuZGF0b3J5SW5wdXQuYWRkKG8pOwotCQkJCQl9IGVsc2UgaWYgKCgoV3JhcHBlckl0ZW1Qcm92aWRlcikgbykuZ2V0RmVhdHVyZSgpLmVxdWFscygKLQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJLmdldFRhc2tEZXNjcmlwdG9yX0V4dGVybmFsSW5wdXQoKSkpIHsKLQkJCQkJCWV4dGVybmFsSW5wdXQuYWRkKG8pOwotCQkJCQl9IGVsc2UgaWYgKCgoV3JhcHBlckl0ZW1Qcm92aWRlcikgbykuZ2V0RmVhdHVyZSgpLmVxdWFscygKLQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJLmdldFRhc2tEZXNjcmlwdG9yX09wdGlvbmFsSW5wdXQoKSkpIHsKLQkJCQkJCW9wdGlvbmFsSW5wdXQuYWRkKG8pOwotCQkJCQl9IGVsc2UgaWYgKCgoV3JhcHBlckl0ZW1Qcm92aWRlcikgbykuZ2V0RmVhdHVyZSgpLmVxdWFscygKLQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrRGVzY3JpcHRvcl9PdXRwdXQoKSkpIHsKLQkJCQkJCW91dHB1dC5hZGQobyk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQkvLyBzb3J0IGZvciBhbGwgY2hpbGRyZW4KLQkJQ29sbGVjdGlvbnMuc29ydChwcmltYXJ5UGVyZm9ybWVycywgQ29tcGFyYXRvcnMuUFJFU0VOVEFUSU9OX05BTUVfQ09NUEFSQVRPUik7Ci0JCUNvbGxlY3Rpb25zLnNvcnQoYWRkaXRpb25hbFBlcmZvcm1lcnMsIENvbXBhcmF0b3JzLlBSRVNFTlRBVElPTl9OQU1FX0NPTVBBUkFUT1IpOwotCQlDb2xsZWN0aW9ucy5zb3J0KGFzc2l0ZWRCeSwgQ29tcGFyYXRvcnMuUFJFU0VOVEFUSU9OX05BTUVfQ09NUEFSQVRPUik7Ci0JCUNvbGxlY3Rpb25zLnNvcnQoZXh0ZXJuYWxJbnB1dCwgQ29tcGFyYXRvcnMuUFJFU0VOVEFUSU9OX05BTUVfQ09NUEFSQVRPUik7Ci0JCUNvbGxlY3Rpb25zLnNvcnQobWFuZGF0b3J5SW5wdXQsIENvbXBhcmF0b3JzLlBSRVNFTlRBVElPTl9OQU1FX0NPTVBBUkFUT1IpOwotCQlDb2xsZWN0aW9ucy5zb3J0KG9wdGlvbmFsSW5wdXQsIENvbXBhcmF0b3JzLlBSRVNFTlRBVElPTl9OQU1FX0NPTVBBUkFUT1IpOwotCQlDb2xsZWN0aW9ucy5zb3J0KG91dHB1dCwgQ29tcGFyYXRvcnMuUFJFU0VOVEFUSU9OX05BTUVfQ09NUEFSQVRPUik7Ci0JCQotCQluZXdDaGlsZHJlbi5hZGRBbGwocHJpbWFyeVBlcmZvcm1lcnMpOwotCQluZXdDaGlsZHJlbi5hZGRBbGwoYWRkaXRpb25hbFBlcmZvcm1lcnMpOwotCQluZXdDaGlsZHJlbi5hZGRBbGwoYXNzaXRlZEJ5KTsKLQkJbmV3Q2hpbGRyZW4uYWRkQWxsKGV4dGVybmFsSW5wdXQpOwotCQluZXdDaGlsZHJlbi5hZGRBbGwobWFuZGF0b3J5SW5wdXQpOwotCQluZXdDaGlsZHJlbi5hZGRBbGwob3B0aW9uYWxJbnB1dCk7Ci0JCW5ld0NoaWxkcmVuLmFkZEFsbChvdXRwdXQpOwotCQkKLQkJbmV3Q2hpbGRyZW4gPSByZW1vdmVTdWJhcnRpZmFjdHNGcm9tQ2hpbGRyZW4obmV3Q2hpbGRyZW4sIHRydWUpOwotCQl1cGRhdGVDYWNoZWRDaGlsZHJlbihuZXdDaGlsZHJlbik7Ci0JCXJldHVybiBuZXdDaGlsZHJlbjsKLQl9Ci0JCi0JcHJvdGVjdGVkIExpc3QgcmVtb3ZlU3ViYXJ0aWZhY3RzRnJvbUNoaWxkcmVuKENvbGxlY3Rpb24gY2hpbGRyZW4sIGJvb2xlYW4gdW53cmFwKSB7Ci0JCXJldHVybiBQcm9jZXNzVXRpbC5yZW1vdmVTdWJhcnRpZmFjdHNGcm9tQ2hpbGRyZW4oY2hpbGRyZW4sIHVud3JhcCk7Ci0JfQotCi0JcHJpdmF0ZSBJRmlsdGVyIGdldEZpbHRlcihPYmplY3Qgb2JqKSB7Ci0JCUlGaWx0ZXIgZmlsdGVyID0gbnVsbDsKLQkJT2JqZWN0IHBhcmVudCA9IGdldFBhcmVudChvYmopOwotCQlJQlNJdGVtUHJvdmlkZXIgYWRhcHRlciA9IChJQlNJdGVtUHJvdmlkZXIpIGdldFJvb3RBZGFwdGVyRmFjdG9yeSgpCi0JCQkJLmFkYXB0KHBhcmVudCwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJaWYgKGFkYXB0ZXIgaW5zdGFuY2VvZiBBY3Rpdml0eUl0ZW1Qcm92aWRlcikgewotCQkJZmlsdGVyID0gKChBY3Rpdml0eUl0ZW1Qcm92aWRlcikgYWRhcHRlcikuZ2V0RmlsdGVyKCk7Ci0JCX0KLQotCQlyZXR1cm4gZmlsdGVyOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUNhY2hlZENoaWxkcmVuSXRlbVByb3ZpZGVyI2dldENoaWxkcmVuRnJvbUNhY2hlKCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbkZyb21DYWNoZSgpIHsKLQkJaWYoY2FjaGVkQ2hpbGRyZW4gPT0gbnVsbCkgewotCQkJZ2V0Q2hpbGRyZW4odGFyZ2V0KTsKLQkJfQotCQlyZXR1cm4gY2FjaGVkQ2hpbGRyZW47Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JQ2FjaGVkQ2hpbGRyZW5JdGVtUHJvdmlkZXIjZ2V0Um9sbHVwQ2hpbGRyZW5Gcm9tQ2FjaGUoKQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldFJvbGx1cENoaWxkcmVuRnJvbUNhY2hlKCkgewotCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgeyAKLQkJaWYoY2FjaGVkQ2hpbGRyZW4gIT0gbnVsbCkgewotCQkJY2FjaGVkQ2hpbGRyZW4uY2xlYXIoKTsKLQkJCWNhY2hlZENoaWxkcmVuID0gbnVsbDsKLQkJfQotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbnNvbGlkYXRlZC9Xb3JrUHJvZHVjdERlc2NyaXB0b3JJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb25zb2xpZGF0ZWQvV29ya1Byb2R1Y3REZXNjcmlwdG9ySXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhOTk1ZGEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbnNvbGlkYXRlZC9Xb3JrUHJvZHVjdERlc2NyaXB0b3JJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29uc29saWRhdGVkOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuSUJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuQ29tcGFyYXRvcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci0KLQotLyoqCi0gKiBXb3JrUHJvZHVjdERlc2NyaXB0b3IgSXRlbSBwcm92aWRlciBmb3IgY29uc29saWRhdGVkIHZpZXcKLSAqIAotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFdvcmtQcm9kdWN0RGVzY3JpcHRvckl0ZW1Qcm92aWRlciBleHRlbmRzCi0JCW9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5Xb3JrUHJvZHVjdERlc2NyaXB0b3JJdGVtUHJvdmlkZXIgewotCi0JLyoqCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICogQHBhcmFtIGRlbGVnYXRlSXRlbVByb3ZpZGVyCi0JICovCi0JcHVibGljIFdvcmtQcm9kdWN0RGVzY3JpcHRvckl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwKLQkJCUl0ZW1Qcm92aWRlckFkYXB0ZXIgZGVsZWdhdGVJdGVtUHJvdmlkZXIpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnksIGRlbGVnYXRlSXRlbVByb3ZpZGVyKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuQnJlYWtkb3duRWxlbWVudEl0ZW1Qcm92aWRlciNjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhqYXZhLnV0aWwuQ29sbGVjdGlvbiwKLQkgKiAgICAgIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLAotCQkJT2JqZWN0IG9iamVjdCkgewotCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkJyZWFrZG93bkVsZW1lbnRJdGVtUHJvdmlkZXIjZ2V0Q2hpbGRyZW5GZWF0dXJlcyhqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuRmVhdHVyZXMoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjaXNXcmFwcGluZ05lZWRlZChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzV3JhcHBpbmdOZWVkZWQoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0Q3JlYXRlQ2hpbGRUZXh0KGphdmEubGFuZy5PYmplY3QsCi0JICogICAgICBqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLnV0aWwuQ29sbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENyZWF0ZUNoaWxkVGV4dChPYmplY3Qgb3duZXIsIE9iamVjdCBmZWF0dXJlLAotCQkJT2JqZWN0IGNoaWxkLCBDb2xsZWN0aW9uIHNlbGVjdGlvbikgewotCQlyZXR1cm4gZ2V0RmVhdHVyZVRleHQoZmVhdHVyZSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldENyZWF0ZUNoaWxkSW1hZ2UoamF2YS5sYW5nLk9iamVjdCwKLQkgKiAgICAgIGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5PYmplY3QsIGphdmEudXRpbC5Db2xsZWN0aW9uKQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0Q3JlYXRlQ2hpbGRJbWFnZShPYmplY3Qgb3duZXIsIE9iamVjdCBmZWF0dXJlLAotCQkJT2JqZWN0IGNoaWxkLCBDb2xsZWN0aW9uIHNlbGVjdGlvbikgewotCQlPYmplY3QgaW1nID0gVG5nVXRpbC5nZXRJbWFnZShjaGlsZCk7Ci0JCXJldHVybiBpbWcgIT0gbnVsbCA/IGltZyA6IHN1cGVyLmdldENyZWF0ZUNoaWxkSW1hZ2Uob3duZXIsIGZlYXR1cmUsIGNoaWxkLCBzZWxlY3Rpb24pOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNjcmVhdGVXcmFwcGVyKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0LAotCSAqICAgICAgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZSwgamF2YS5sYW5nLk9iamVjdCwgaW50KQotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgY3JlYXRlV3JhcHBlcihFT2JqZWN0IG9iamVjdCwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsCi0JCQlPYmplY3QgdmFsdWUsIGludCBpbmRleCkgewotCQlCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlciB3cmFwcGVyID0gKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSBJQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJLmNyZWF0ZVdyYXBwZXIodmFsdWUsIG9iamVjdCwgZmVhdHVyZSwgaW5kZXgsIGFkYXB0ZXJGYWN0b3J5KTsKLQkJd3JhcHBlci5zZXRSZWFkT25seShmYWxzZSk7Ci0JCXJldHVybiB3cmFwcGVyOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CcmVha2Rvd25FbGVtZW50SXRlbVByb3ZpZGVyI25vdGlmeUNoYW5nZWQob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCi0JCS8vIHN3aXRjaChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKFJvbGVEZXNjcmlwdG9yLmNsYXNzKSkgewotCQkvLyBjYXNlIFVtYVBhY2thZ2UuUk9MRV9ERVNDUklQVE9SX19SRVNQT05TSUJMRV9GT1I6Ci0JCS8vIHJlZnJlc2hDaGlsZHJlbihub3RpZmljYXRpb24pOwotCQkvLyB9Ci0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5EZXNjcmlwdG9ySXRlbVByb3ZpZGVyI2dldEF0dHJpYnV0ZShqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0cmlidXRlKE9iamVjdCBvYmplY3QsIFN0cmluZyBwcm9wZXJ0eSkgewotCQlyZXR1cm4gc3VwZXIuZ2V0QXR0cmlidXRlKG9iamVjdCwgcHJvcGVydHkpOwotCX0KLQkKLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuV29ya1Byb2R1Y3REZXNjcmlwdG9ySXRlbVByb3ZpZGVyI2dldENoaWxkcmVuKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iaikgewotCQlDb2xsZWN0aW9uIGNoaWxkcmVuID0gc3VwZXIuZ2V0Q2hpbGRyZW4ob2JqKTsKLQkJTGlzdCBuZXdDaGlsZHJlbiA9IG5ldyBBcnJheUxpc3QoKTsKLQkJbmV3Q2hpbGRyZW4uYWRkQWxsKGNoaWxkcmVuKTsKLQkJLy8gc29ydCB0aGUgY2hpbGRyZW4KLQkJQ29sbGVjdGlvbnMuc29ydChuZXdDaGlsZHJlbiwgQ29tcGFyYXRvcnMuUFJFU0VOVEFUSU9OX05BTUVfQ09NUEFSQVRPUik7Ci0KLQkJcmV0dXJuIG5ld0NoaWxkcmVuOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb25zb2xpZGF0ZWQvcGFja2FnZS5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbnNvbGlkYXRlZC9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmMmE3N2IuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbnNvbGlkYXRlZC9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyBpdGVtIHByb3ZpZGVycyBmb3IgZGlzcGxheWluZyBhbmQgZWRpdGluZyBicmVha2Rvd24gZWxlbWVudHMgaW4gYSBQcm9jZXNzIGVkaXRvcidzIENvbnNvbGlkYXRlZCBWaWV3IHBhZ2UuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2ludGVybmFsL0JyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyRmFjdG9yeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2ludGVybmFsL0JyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOWQwNWFkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9pbnRlcm5hbC9CcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JV3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuQWN0aXZpdHlXcmFwcGVySXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuQ29tcG9zaXRlUm9sZVdyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkRlbGl2ZXJhYmxlRGVzY3JpcHRvcldyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLklCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLk1pbGVzdG9uZVdyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLlJvbGVEZXNjcmlwdG9yV3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuVGFza0Rlc2NyaXB0b3JXcmFwcGVySXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5UZWFtUHJvZmlsZVdyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLldvcmtQcm9kdWN0RGVzY3JpcHRvcldyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db21wb3NpdGVSb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NaWxlc3RvbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGVhbVByb2ZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3I7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXJGYWN0b3J5IGltcGxlbWVudHMKLQkJSUJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyRmFjdG9yeSB7Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuSUJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyRmFjdG9yeSNjcmVhdGVXcmFwcGVyKGphdmEubGFuZy5PYmplY3QsCi0JICogICAgICBqYXZhLmxhbmcuT2JqZWN0LCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeSkKLQkgKi8KLQlwdWJsaWMgSVdyYXBwZXJJdGVtUHJvdmlkZXIgY3JlYXRlV3JhcHBlcihPYmplY3QgdmFsdWUsCi0JCQlPYmplY3Qgb3duZXIsIEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXJldHVybiBjcmVhdGVXcmFwcGVyKHZhbHVlLCBvd25lciwgbnVsbCwgQ29tbWFuZFBhcmFtZXRlci5OT19JTkRFWCwKLQkJCQlhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLklCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlckZhY3RvcnkjY3JlYXRlV3JhcHBlcihqYXZhLmxhbmcuT2JqZWN0LAotCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCwgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZSwgaW50LAotCSAqICAgICAgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3RvcnkpCi0JICovCi0JcHVibGljIElXcmFwcGVySXRlbVByb3ZpZGVyIGNyZWF0ZVdyYXBwZXIoT2JqZWN0IHZhbHVlLAotCQkJT2JqZWN0IG93bmVyLCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgaW50IGluZGV4LAotCQkJQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJdmFsdWUgPSBUbmdVdGlsLnVud3JhcCh2YWx1ZSk7Ci0JCWlmICh2YWx1ZSBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQlyZXR1cm4gbmV3IEFjdGl2aXR5V3JhcHBlckl0ZW1Qcm92aWRlcigoQWN0aXZpdHkpIHZhbHVlLCBvd25lciwKLQkJCQkJZmVhdHVyZSwgaW5kZXgsIGFkYXB0ZXJGYWN0b3J5KTsKLQkJfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIE1pbGVzdG9uZSkgewotCQkJcmV0dXJuIG5ldyBNaWxlc3RvbmVXcmFwcGVySXRlbVByb3ZpZGVyKChNaWxlc3RvbmUpIHZhbHVlLCBvd25lciwKLQkJCQkJZmVhdHVyZSwgaW5kZXgsIGFkYXB0ZXJGYWN0b3J5KTsKLQkJfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIENvbXBvc2l0ZVJvbGUpIHsKLQkJCXJldHVybiBuZXcgQ29tcG9zaXRlUm9sZVdyYXBwZXJJdGVtUHJvdmlkZXIoKENvbXBvc2l0ZVJvbGUpIHZhbHVlLAotCQkJCQlvd25lciwgZmVhdHVyZSwgaW5kZXgsIGFkYXB0ZXJGYWN0b3J5KTsKLQkJfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFJvbGVEZXNjcmlwdG9yKSB7Ci0JCQlyZXR1cm4gbmV3IFJvbGVEZXNjcmlwdG9yV3JhcHBlckl0ZW1Qcm92aWRlcigKLQkJCQkJKFJvbGVEZXNjcmlwdG9yKSB2YWx1ZSwgb3duZXIsIGZlYXR1cmUsIGluZGV4LAotCQkJCQlhZGFwdGVyRmFjdG9yeSk7Ci0JCX0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBUYXNrRGVzY3JpcHRvcikgewotCQkJcmV0dXJuIG5ldyBUYXNrRGVzY3JpcHRvcldyYXBwZXJJdGVtUHJvdmlkZXIoCi0JCQkJCShUYXNrRGVzY3JpcHRvcikgdmFsdWUsIG93bmVyLCBmZWF0dXJlLCBpbmRleCwKLQkJCQkJYWRhcHRlckZhY3RvcnkpOwotCQl9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgVGVhbVByb2ZpbGUpIHsKLQkJCXJldHVybiBuZXcgVGVhbVByb2ZpbGVXcmFwcGVySXRlbVByb3ZpZGVyKChUZWFtUHJvZmlsZSkgdmFsdWUsCi0JCQkJCW93bmVyLCBmZWF0dXJlLCBpbmRleCwgYWRhcHRlckZhY3RvcnkpOwotCQl9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yKSB7Ci0JCQlXb3JrUHJvZHVjdERlc2NyaXB0b3Igd3BkID0gKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgdmFsdWU7Ci0JCQlpZiAod3BkLmdldFdvcmtQcm9kdWN0KCkgaW5zdGFuY2VvZiBEZWxpdmVyYWJsZSkgewotCQkJCXJldHVybiBuZXcgRGVsaXZlcmFibGVEZXNjcmlwdG9yV3JhcHBlckl0ZW1Qcm92aWRlcih3cGQsIG93bmVyLAotCQkJCQkJZmVhdHVyZSwgaW5kZXgsIGFkYXB0ZXJGYWN0b3J5KTsKLQkJCX0KLQkJCXJldHVybiBuZXcgV29ya1Byb2R1Y3REZXNjcmlwdG9yV3JhcHBlckl0ZW1Qcm92aWRlcih3cGQsIG93bmVyLAotCQkJCQlmZWF0dXJlLCBpbmRleCwgYWRhcHRlckZhY3RvcnkpOwotCQl9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudCkgewotCQkJcmV0dXJuIG5ldyBCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcigKLQkJCQkJKEJyZWFrZG93bkVsZW1lbnQpIHZhbHVlLCBvd25lciwgZmVhdHVyZSwgaW5kZXgsCi0JCQkJCWFkYXB0ZXJGYWN0b3J5KTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9pbnRlcm5hbC9wYWNrYWdlLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvaW50ZXJuYWwvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOThlYTg3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9pbnRlcm5hbC9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyBpbXBsZW1lbnRhdGlvbiBzdXBwb3J0IGZvciBkaXNwbGF5aW5nIGFuZCBlZGl0aW5nIGEgcHJvY2Vzcy4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvcGFja2FnZS5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZmYzU2Zi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgaXRlbSBwcm92aWRlcnMgZm9yIGRpc3BsYXlpbmcgYW5kIGVkaXRpbmcgYnJlYWtkb3duIGVsZW1lbnRzIGluIGEgUHJvY2VzcyBlZGl0b3IuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL3B1Ymxpc2hpbmcvQ0JTQWN0aXZpdHlJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9wdWJsaXNoaW5nL0NCU0FjdGl2aXR5SXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkOTA5ZjMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL3B1Ymxpc2hpbmcvQ0JTQWN0aXZpdHlJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5wdWJsaXNoaW5nOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb25zb2xpZGF0ZWQuQWN0aXZpdHlJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlByb2Nlc3NVdGlsOwotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlIC0gTWFyIDIyLCAyMDA2Ci0gKiBAc2luY2UgIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQ0JTQWN0aXZpdHlJdGVtUHJvdmlkZXIgZXh0ZW5kcyBBY3Rpdml0eUl0ZW1Qcm92aWRlciB7Ci0KLQkvKioKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgQ0JTQWN0aXZpdHlJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29uc29saWRhdGVkLkFjdGl2aXR5SXRlbVByb3ZpZGVyI3JlbW92ZVN1YmFydGlmYWN0c0Zyb21DaGlsZHJlbihqYXZhLnV0aWwuQ29sbGVjdGlvbiwgYm9vbGVhbikKLQkgKi8KLQlwcm90ZWN0ZWQgQ29sbGVjdGlvbiByZW1vdmVTdWJhcnRpZmFjdHNGcm9tQ2hpbGRyZW4oQ29sbGVjdGlvbiBjaGlsZHJlbiwgYm9vbGVhbiB1bndyYXApIHsKLQkJcmV0dXJuIFByb2Nlc3NVdGlsLnJlbW92ZVN1YmFydGlmYWN0c0Zyb21DaGlsZHJlbihjaGlsZHJlbiwgdW53cmFwLCBhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlpZihpc1JvbGxlZFVwKCkpIHsKLQkJCWlmKGNhY2hlZFJvbGx1cENoaWxkcmVuID09IG51bGwpIHsKLQkJCQljYWNoZWRSb2xsdXBDaGlsZHJlbiA9IG5ldyBBcnJheUxpc3Qoc3VwZXIuZ2V0Q2hpbGRyZW4ob2JqZWN0KSk7Ci0JCQl9Ci0JCQlyZXR1cm4gY2FjaGVkUm9sbHVwQ2hpbGRyZW47Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpZihjYWNoZWRDaGlsZHJlbiA9PSBudWxsKSB7Ci0JCQkJY2FjaGVkQ2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KHN1cGVyLmdldENoaWxkcmVuKG9iamVjdCkpOwotCQkJfQotCQkJcmV0dXJuIGNhY2hlZENoaWxkcmVuOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvcHVibGlzaGluZy9DQlNJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL3B1Ymxpc2hpbmcvQ0JTSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjcyNDRhOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvcHVibGlzaGluZy9DQlNJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLnB1Ymxpc2hpbmc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbnNvbGlkYXRlZC5JdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZSAtIE1hciAyMiwgMjAwNgotICogQHNpbmNlICAxLjAKLSAqLwotcHVibGljIGNsYXNzIENCU0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5IGV4dGVuZHMgSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkgewotCi0JcHVibGljIENCU0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb25zb2xpZGF0ZWQuSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkjY3JlYXRlQWN0aXZpdHlBZGFwdGVyKCkKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVBY3Rpdml0eUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgQ0JTQWN0aXZpdHlJdGVtUHJvdmlkZXIodGhpcyk7Ci0JfQotCQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUNhcGFiaWxpdHlQYXR0ZXJuQWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBDQlNQcm9jZXNzSXRlbVByb3ZpZGVyKHRoaXMsCi0JCQkJKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIFRuZ1V0aWwudW1hSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkKLQkJCQkJCS5jcmVhdGVDYXBhYmlsaXR5UGF0dGVybkFkYXB0ZXIoKSk7Ci0JfQotCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRGVsaXZlcnlQcm9jZXNzQWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBDQlNQcm9jZXNzSXRlbVByb3ZpZGVyKHRoaXMsCi0JCQkJKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIFRuZ1V0aWwudW1hSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkKLQkJCQkJCS5jcmVhdGVEZWxpdmVyeVByb2Nlc3NBZGFwdGVyKCkpOwotCX0KLQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVRhc2tEZXNjcmlwdG9yQWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBDQlNUYXNrRGVzY3JpcHRvckl0ZW1Qcm92aWRlcih0aGlzLAotCQkJCShJdGVtUHJvdmlkZXJBZGFwdGVyKSBUbmdVdGlsLnVtYUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5Ci0JCQkJCQkuY3JlYXRlVGFza0Rlc2NyaXB0b3JBZGFwdGVyKCkpOwotCX0KLQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVJvbGVEZXNjcmlwdG9yQWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBDQlNSb2xlRGVzY3JpcHRvckl0ZW1Qcm92aWRlcih0aGlzLAotCQkJCShJdGVtUHJvdmlkZXJBZGFwdGVyKSBUbmdVdGlsLnVtYUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5Ci0JCQkJCQkuY3JlYXRlUm9sZURlc2NyaXB0b3JBZGFwdGVyKCkpOwotCX0KLQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVdvcmtQcm9kdWN0RGVzY3JpcHRvckFkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgQ0JTV29ya1Byb2R1Y3REZXNjcmlwdG9ySXRlbVByb3ZpZGVyKHRoaXMsCi0JCQkJKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIFRuZ1V0aWwudW1hSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkKLQkJCQkJCS5jcmVhdGVXb3JrUHJvZHVjdERlc2NyaXB0b3JBZGFwdGVyKCkpOwotCX0JCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvcHVibGlzaGluZy9DQlNQcm9jZXNzSXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvcHVibGlzaGluZy9DQlNQcm9jZXNzSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhNTBhYTYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL3B1Ymxpc2hpbmcvQ0JTUHJvY2Vzc0l0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLnB1Ymxpc2hpbmc7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29uc29saWRhdGVkLlByb2Nlc3NJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlByb2Nlc3NVdGlsOwotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlIC0gTWFyIDIyLCAyMDA2Ci0gKiBAc2luY2UgIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQ0JTUHJvY2Vzc0l0ZW1Qcm92aWRlciBleHRlbmRzIFByb2Nlc3NJdGVtUHJvdmlkZXIgewotCi0JLyoqCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICogQHBhcmFtIGRlbGVnYXRlSXRlbVByb3ZpZGVyCi0JICovCi0JcHVibGljIENCU1Byb2Nlc3NJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksCi0JCQlJdGVtUHJvdmlkZXJBZGFwdGVyIGRlbGVnYXRlSXRlbVByb3ZpZGVyKSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5LCBkZWxlZ2F0ZUl0ZW1Qcm92aWRlcik7Ci0JfQotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlpZihpc1JvbGxlZFVwKCkpIHsKLQkJCWlmKGNhY2hlZFJvbGx1cENoaWxkcmVuID09IG51bGwpIHsKLQkJCQljYWNoZWRSb2xsdXBDaGlsZHJlbiA9IG5ldyBBcnJheUxpc3Qoc3VwZXIuZ2V0Q2hpbGRyZW4ob2JqZWN0KSk7Ci0JCQl9Ci0JCQlyZXR1cm4gY2FjaGVkUm9sbHVwQ2hpbGRyZW47Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpZihjYWNoZWRDaGlsZHJlbiA9PSBudWxsKSB7Ci0JCQkJY2FjaGVkQ2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KHN1cGVyLmdldENoaWxkcmVuKG9iamVjdCkpOwotCQkJfQotCQkJcmV0dXJuIGNhY2hlZENoaWxkcmVuOwotCQl9Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb25zb2xpZGF0ZWQuQWN0aXZpdHlJdGVtUHJvdmlkZXIjcmVtb3ZlU3ViYXJ0aWZhY3RzRnJvbUNoaWxkcmVuKGphdmEudXRpbC5Db2xsZWN0aW9uLCBib29sZWFuKQotCSAqLwotCXByb3RlY3RlZCBDb2xsZWN0aW9uIHJlbW92ZVN1YmFydGlmYWN0c0Zyb21DaGlsZHJlbihDb2xsZWN0aW9uIGNoaWxkcmVuLCBib29sZWFuIHVud3JhcCkgewotCQlyZXR1cm4gUHJvY2Vzc1V0aWwucmVtb3ZlU3ViYXJ0aWZhY3RzRnJvbUNoaWxkcmVuKGNoaWxkcmVuLCB1bndyYXAsIGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9wdWJsaXNoaW5nL0NCU1JvbGVEZXNjcmlwdG9ySXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvcHVibGlzaGluZy9DQlNSb2xlRGVzY3JpcHRvckl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMWNhYmEwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9wdWJsaXNoaW5nL0NCU1JvbGVEZXNjcmlwdG9ySXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MucHVibGlzaGluZzsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb25zb2xpZGF0ZWQuUm9sZURlc2NyaXB0b3JJdGVtUHJvdmlkZXI7Ci0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUgLSBNYXIgMjIsIDIwMDYKLSAqIEBzaW5jZSAgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBDQlNSb2xlRGVzY3JpcHRvckl0ZW1Qcm92aWRlciBleHRlbmRzIFJvbGVEZXNjcmlwdG9ySXRlbVByb3ZpZGVyIHsKLQotCS8qKgotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqIEBwYXJhbSBkZWxlZ2F0ZUl0ZW1Qcm92aWRlcgotCSAqLwotCXB1YmxpYyBDQlNSb2xlRGVzY3JpcHRvckl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwKLQkJCUl0ZW1Qcm92aWRlckFkYXB0ZXIgZGVsZWdhdGVJdGVtUHJvdmlkZXIpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnksIGRlbGVnYXRlSXRlbVByb3ZpZGVyKTsKLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmKGNhY2hlZENoaWxkcmVuID09IG51bGwpIHsKLQkJCWNhY2hlZENoaWxkcmVuID0gbmV3IEFycmF5TGlzdChzdXBlci5nZXRDaGlsZHJlbihvYmplY3QpKTsKLQkJfQotCQlyZXR1cm4gY2FjaGVkQ2hpbGRyZW47Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvcHVibGlzaGluZy9DQlNUYXNrRGVzY3JpcHRvckl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL3B1Ymxpc2hpbmcvQ0JTVGFza0Rlc2NyaXB0b3JJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDZiYThhZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvcHVibGlzaGluZy9DQlNUYXNrRGVzY3JpcHRvckl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLnB1Ymxpc2hpbmc7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29uc29saWRhdGVkLlRhc2tEZXNjcmlwdG9ySXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Qcm9jZXNzVXRpbDsKLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZSAtIE1hciAyMiwgMjAwNgotICogQHNpbmNlICAxLjAKLSAqLwotcHVibGljIGNsYXNzIENCU1Rhc2tEZXNjcmlwdG9ySXRlbVByb3ZpZGVyIGV4dGVuZHMgVGFza0Rlc2NyaXB0b3JJdGVtUHJvdmlkZXIgewotCi0JLyoqCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICogQHBhcmFtIGRlbGVnYXRlSXRlbVByb3ZpZGVyCi0JICovCi0JcHVibGljIENCU1Rhc2tEZXNjcmlwdG9ySXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LAotCQkJSXRlbVByb3ZpZGVyQWRhcHRlciBkZWxlZ2F0ZUl0ZW1Qcm92aWRlcikgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSwgZGVsZWdhdGVJdGVtUHJvdmlkZXIpOwotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJaWYoY2FjaGVkQ2hpbGRyZW4gPT0gbnVsbCkgewotCQkJY2FjaGVkQ2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KHN1cGVyLmdldENoaWxkcmVuKG9iamVjdCkpOwotCQl9Ci0JCXJldHVybiBjYWNoZWRDaGlsZHJlbjsKLQl9Ci0KLQlwcm90ZWN0ZWQgTGlzdCByZW1vdmVTdWJhcnRpZmFjdHNGcm9tQ2hpbGRyZW4oQ29sbGVjdGlvbiBjaGlsZHJlbiwgYm9vbGVhbiB1bndyYXApIHsKLQkJcmV0dXJuIFByb2Nlc3NVdGlsLnJlbW92ZVN1YmFydGlmYWN0c0Zyb21DaGlsZHJlbihjaGlsZHJlbiwgdW53cmFwLCBhZGFwdGVyRmFjdG9yeSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL3B1Ymxpc2hpbmcvQ0JTV29ya1Byb2R1Y3REZXNjcmlwdG9ySXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvcHVibGlzaGluZy9DQlNXb3JrUHJvZHVjdERlc2NyaXB0b3JJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGU0MDQyNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvcHVibGlzaGluZy9DQlNXb3JrUHJvZHVjdERlc2NyaXB0b3JJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5wdWJsaXNoaW5nOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbnNvbGlkYXRlZC5Xb3JrUHJvZHVjdERlc2NyaXB0b3JJdGVtUHJvdmlkZXI7Ci0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUgLSBNYXIgMjIsIDIwMDYKLSAqIEBzaW5jZSAgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBDQlNXb3JrUHJvZHVjdERlc2NyaXB0b3JJdGVtUHJvdmlkZXIgZXh0ZW5kcwotCQlXb3JrUHJvZHVjdERlc2NyaXB0b3JJdGVtUHJvdmlkZXIgewotCi0JLyoqCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICogQHBhcmFtIGRlbGVnYXRlSXRlbVByb3ZpZGVyCi0JICovCi0JcHVibGljIENCU1dvcmtQcm9kdWN0RGVzY3JpcHRvckl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwKLQkJCUl0ZW1Qcm92aWRlckFkYXB0ZXIgZGVsZWdhdGVJdGVtUHJvdmlkZXIpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnksIGRlbGVnYXRlSXRlbVByb3ZpZGVyKTsKLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmKGNhY2hlZENoaWxkcmVuID09IG51bGwpIHsKLQkJCWNhY2hlZENoaWxkcmVuID0gbmV3IEFycmF5TGlzdChzdXBlci5nZXRDaGlsZHJlbihvYmplY3QpKTsKLQkJfQotCQlyZXR1cm4gY2FjaGVkQ2hpbGRyZW47Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvcHVibGlzaGluZy9UQlNBY3Rpdml0eUl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL3B1Ymxpc2hpbmcvVEJTQWN0aXZpdHlJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2FmNDc2MC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvcHVibGlzaGluZy9UQlNBY3Rpdml0eUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLnB1Ymxpc2hpbmc7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLk9CU0FjdGl2aXR5SXRlbVByb3ZpZGVyOwotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlIC0gTWFyIDIyLCAyMDA2Ci0gKiBAc2luY2UgIDEuMAotICovCi1wdWJsaWMgY2xhc3MgVEJTQWN0aXZpdHlJdGVtUHJvdmlkZXIgZXh0ZW5kcyBPQlNBY3Rpdml0eUl0ZW1Qcm92aWRlciB7Ci0KLQkvKioKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgVEJTQWN0aXZpdHlJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuT0JTQWN0aXZpdHlJdGVtUHJvdmlkZXIjZ2V0Q2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmKGlzUm9sbGVkVXAoKSkgewotCQkJaWYoY2FjaGVkUm9sbHVwQ2hpbGRyZW4gPT0gbnVsbCkgewotCQkJCWNhY2hlZFJvbGx1cENoaWxkcmVuID0gbmV3IEFycmF5TGlzdChzdXBlci5nZXRDaGlsZHJlbihvYmplY3QpKTsKLQkJCX0KLQkJCXJldHVybiBjYWNoZWRSb2xsdXBDaGlsZHJlbjsKLQkJfQotCQllbHNlIHsKLQkJCWlmKGNhY2hlZENoaWxkcmVuID09IG51bGwpIHsKLQkJCQljYWNoZWRDaGlsZHJlbiA9IG5ldyBBcnJheUxpc3Qoc3VwZXIuZ2V0Q2hpbGRyZW4ob2JqZWN0KSk7Ci0JCQl9Ci0JCQlyZXR1cm4gY2FjaGVkQ2hpbGRyZW47Ci0JCX0KLQl9Ci0JCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvcHVibGlzaGluZy9UQlNJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL3B1Ymxpc2hpbmcvVEJTSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmNmZGYwNS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvcHVibGlzaGluZy9UQlNJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLnB1Ymxpc2hpbmc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLk9CU0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlIC0gTWFyIDIyLCAyMDA2Ci0gKiBAc2luY2UgIDEuMAotICovCi1wdWJsaWMgY2xhc3MgVEJTSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkgZXh0ZW5kcwotCQlPQlNJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSB7Ci0KLQlwdWJsaWMgVEJTSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLk9CU0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5I2NyZWF0ZUFjdGl2aXR5QWRhcHRlcigpCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQWN0aXZpdHlBZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IFRCU0FjdGl2aXR5SXRlbVByb3ZpZGVyKHRoaXMpOwotCX0KLQkKLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVDYXBhYmlsaXR5UGF0dGVybkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgVEJTUHJvY2Vzc0l0ZW1Qcm92aWRlcih0aGlzLCAoSXRlbVByb3ZpZGVyQWRhcHRlcikgVG5nVXRpbC51bWFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5jcmVhdGVDYXBhYmlsaXR5UGF0dGVybkFkYXB0ZXIoKSk7Ci0JfQotCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRGVsaXZlcnlQcm9jZXNzQWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBUQlNQcm9jZXNzSXRlbVByb3ZpZGVyKHRoaXMsIChJdGVtUHJvdmlkZXJBZGFwdGVyKSBUbmdVdGlsLnVtYUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LmNyZWF0ZURlbGl2ZXJ5UHJvY2Vzc0FkYXB0ZXIoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL3B1Ymxpc2hpbmcvVEJTUHJvY2Vzc0l0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL3B1Ymxpc2hpbmcvVEJTUHJvY2Vzc0l0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MGJkMTNmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9wdWJsaXNoaW5nL1RCU1Byb2Nlc3NJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5wdWJsaXNoaW5nOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLk9CU1Byb2Nlc3NJdGVtUHJvdmlkZXI7Ci0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUgLSBNYXIgMjIsIDIwMDYKLSAqIEBzaW5jZSAgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBUQlNQcm9jZXNzSXRlbVByb3ZpZGVyIGV4dGVuZHMgT0JTUHJvY2Vzc0l0ZW1Qcm92aWRlciB7Ci0KLQkvKioKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKiBAcGFyYW0gZGVsZWdhdGVJdGVtUHJvdmlkZXIKLQkgKi8KLQlwdWJsaWMgVEJTUHJvY2Vzc0l0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwKLQkJCUl0ZW1Qcm92aWRlckFkYXB0ZXIgZGVsZWdhdGVJdGVtUHJvdmlkZXIpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnksIGRlbGVnYXRlSXRlbVByb3ZpZGVyKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lk9CU1Byb2Nlc3NJdGVtUHJvdmlkZXIjZ2V0Q2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmKGlzUm9sbGVkVXAoKSkgewotCQkJaWYoY2FjaGVkUm9sbHVwQ2hpbGRyZW4gPT0gbnVsbCkgewotCQkJCWNhY2hlZFJvbGx1cENoaWxkcmVuID0gbmV3IEFycmF5TGlzdChzdXBlci5nZXRDaGlsZHJlbihvYmplY3QpKTsKLQkJCX0KLQkJCXJldHVybiBjYWNoZWRSb2xsdXBDaGlsZHJlbjsKLQkJfQotCQllbHNlIHsKLQkJCWlmKGNhY2hlZENoaWxkcmVuID09IG51bGwpIHsKLQkJCQljYWNoZWRDaGlsZHJlbiA9IG5ldyBBcnJheUxpc3Qoc3VwZXIuZ2V0Q2hpbGRyZW4ob2JqZWN0KSk7Ci0JCQl9Ci0JCQlyZXR1cm4gY2FjaGVkQ2hpbGRyZW47Ci0JCX0KLQl9Ci0JCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvcHVibGlzaGluZy9XQlNBY3Rpdml0eUl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL3B1Ymxpc2hpbmcvV0JTQWN0aXZpdHlJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDVjMjc3Ny4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvcHVibGlzaGluZy9XQlNBY3Rpdml0eUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLnB1Ymxpc2hpbmc7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUgLSBNYXIgMjIsIDIwMDYKLSAqIEBzaW5jZSAgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBXQlNBY3Rpdml0eUl0ZW1Qcm92aWRlciBleHRlbmRzCi0JCW9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5XQlNBY3Rpdml0eUl0ZW1Qcm92aWRlciB7Ci0KLQkvKioKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgV0JTQWN0aXZpdHlJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5XQlNBY3Rpdml0eUl0ZW1Qcm92aWRlciNnZXRDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJaWYoaXNSb2xsZWRVcCgpKSB7Ci0JCQlpZihjYWNoZWRSb2xsdXBDaGlsZHJlbiA9PSBudWxsKSB7Ci0JCQkJY2FjaGVkUm9sbHVwQ2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KHN1cGVyLmdldENoaWxkcmVuKG9iamVjdCkpOwotCQkJfQotCQkJcmV0dXJuIGNhY2hlZFJvbGx1cENoaWxkcmVuOwotCQl9Ci0JCWVsc2UgewotCQkJaWYoY2FjaGVkQ2hpbGRyZW4gPT0gbnVsbCkgewotCQkJCWNhY2hlZENoaWxkcmVuID0gbmV3IEFycmF5TGlzdChzdXBlci5nZXRDaGlsZHJlbihvYmplY3QpKTsKLQkJCX0KLQkJCXJldHVybiBjYWNoZWRDaGlsZHJlbjsKLQkJfQotCX0KLQkKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9wdWJsaXNoaW5nL1dCU0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvcHVibGlzaGluZy9XQlNJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMzdiNzdjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9wdWJsaXNoaW5nL1dCU0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MucHVibGlzaGluZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZSAtIE1hciAyMiwgMjAwNgotICogQHNpbmNlICAxLjAKLSAqLwotcHVibGljIGNsYXNzIFdCU0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5IGV4dGVuZHMKLQkJb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLldCU0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5IHsKLQotCXB1YmxpYyBXQlNJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuV0JTSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkjY3JlYXRlQWN0aXZpdHlBZGFwdGVyKCkKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVBY3Rpdml0eUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgV0JTQWN0aXZpdHlJdGVtUHJvdmlkZXIodGhpcyk7Ci0JfQotCQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUNhcGFiaWxpdHlQYXR0ZXJuQWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBXQlNQcm9jZXNzSXRlbVByb3ZpZGVyKHRoaXMsIChJdGVtUHJvdmlkZXJBZGFwdGVyKSBUbmdVdGlsLnVtYUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5Ci0JCQkJLmNyZWF0ZUNhcGFiaWxpdHlQYXR0ZXJuQWRhcHRlcigpKTsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVEZWxpdmVyeVByb2Nlc3NBZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IFdCU1Byb2Nlc3NJdGVtUHJvdmlkZXIodGhpcywgKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIFRuZ1V0aWwudW1hSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkKLQkJCQkuY3JlYXRlRGVsaXZlcnlQcm9jZXNzQWRhcHRlcigpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvcHVibGlzaGluZy9XQlNQcm9jZXNzSXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvcHVibGlzaGluZy9XQlNQcm9jZXNzSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4ODAwOTIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL3B1Ymxpc2hpbmcvV0JTUHJvY2Vzc0l0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLnB1Ymxpc2hpbmc7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZSAtIE1hciAyMiwgMjAwNgotICogQHNpbmNlICAxLjAKLSAqLwotcHVibGljIGNsYXNzIFdCU1Byb2Nlc3NJdGVtUHJvdmlkZXIgZXh0ZW5kcwotCQlvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuV0JTUHJvY2Vzc0l0ZW1Qcm92aWRlciB7Ci0KLQkvKioKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKiBAcGFyYW0gZGVsZWdhdGVJdGVtUHJvdmlkZXIKLQkgKi8KLQlwdWJsaWMgV0JTUHJvY2Vzc0l0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwKLQkJCUl0ZW1Qcm92aWRlckFkYXB0ZXIgZGVsZWdhdGVJdGVtUHJvdmlkZXIpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnksIGRlbGVnYXRlSXRlbVByb3ZpZGVyKTsKLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmKGlzUm9sbGVkVXAoKSkgewotCQkJaWYoY2FjaGVkUm9sbHVwQ2hpbGRyZW4gPT0gbnVsbCkgewotCQkJCWNhY2hlZFJvbGx1cENoaWxkcmVuID0gbmV3IEFycmF5TGlzdChzdXBlci5nZXRDaGlsZHJlbihvYmplY3QpKTsKLQkJCX0KLQkJCXJldHVybiBjYWNoZWRSb2xsdXBDaGlsZHJlbjsKLQkJfQotCQllbHNlIHsKLQkJCWlmKGNhY2hlZENoaWxkcmVuID09IG51bGwpIHsKLQkJCQljYWNoZWRDaGlsZHJlbiA9IG5ldyBBcnJheUxpc3Qoc3VwZXIuZ2V0Q2hpbGRyZW4ob2JqZWN0KSk7Ci0JCQl9Ci0JCQlyZXR1cm4gY2FjaGVkQ2hpbGRyZW47Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9wdWJsaXNoaW5nL1dQQlNBY3Rpdml0eUl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL3B1Ymxpc2hpbmcvV1BCU0FjdGl2aXR5SXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlNjNhMDYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL3B1Ymxpc2hpbmcvV1BCU0FjdGl2aXR5SXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MucHVibGlzaGluZzsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuUEJTQWN0aXZpdHlJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlByb2Nlc3NVdGlsOwotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlIC0gTWFyIDIyLCAyMDA2Ci0gKiBAc2luY2UgIDEuMAotICovCi1wdWJsaWMgY2xhc3MgV1BCU0FjdGl2aXR5SXRlbVByb3ZpZGVyIGV4dGVuZHMgUEJTQWN0aXZpdHlJdGVtUHJvdmlkZXIgewotCi0JLyoqCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICovCi0JcHVibGljIFdQQlNBY3Rpdml0eUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLlBCU0FjdGl2aXR5SXRlbVByb3ZpZGVyI2dldENoaWxkcmVuKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlpZihpc1JvbGxlZFVwKCkpIHsKLQkJCWlmKGNhY2hlZFJvbGx1cENoaWxkcmVuID09IG51bGwpIHsKLQkJCQljYWNoZWRSb2xsdXBDaGlsZHJlbiA9IG5ldyBBcnJheUxpc3Qoc3VwZXIuZ2V0Q2hpbGRyZW4ob2JqZWN0KSk7Ci0JCQl9Ci0JCQlyZXR1cm4gY2FjaGVkUm9sbHVwQ2hpbGRyZW47Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpZihjYWNoZWRDaGlsZHJlbiA9PSBudWxsKSB7Ci0JCQkJY2FjaGVkQ2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KHN1cGVyLmdldENoaWxkcmVuKG9iamVjdCkpOwotCQkJfQotCQkJcmV0dXJuIGNhY2hlZENoaWxkcmVuOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCBMaXN0IHJlbW92ZVN1YmFydGlmYWN0c0Zyb21DaGlsZHJlbihDb2xsZWN0aW9uIGNoaWxkcmVuLCBib29sZWFuIHVud3JhcCkgewotCQlyZXR1cm4gUHJvY2Vzc1V0aWwucmVtb3ZlU3ViYXJ0aWZhY3RzRnJvbUNoaWxkcmVuKGNoaWxkcmVuLCB1bndyYXAsIGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9wdWJsaXNoaW5nL1dQQlNJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL3B1Ymxpc2hpbmcvV1BCU0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1NzZkNDUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL3B1Ymxpc2hpbmcvV1BCU0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MucHVibGlzaGluZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuUEJTSXRlbVByb3ZpZGVyQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUgLSBNYXIgMjIsIDIwMDYKLSAqIEBzaW5jZSAgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBXUEJTSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkgZXh0ZW5kcwotCQlQQlNJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSB7Ci0KLQlwdWJsaWMgV1BCU0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5QQlNJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSNjcmVhdGVBY3Rpdml0eUFkYXB0ZXIoKQotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUFjdGl2aXR5QWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBXUEJTQWN0aXZpdHlJdGVtUHJvdmlkZXIodGhpcyk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5JdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSNjcmVhdGVXb3JrUHJvZHVjdERlc2NyaXB0b3JBZGFwdGVyKCkKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVXb3JrUHJvZHVjdERlc2NyaXB0b3JBZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IFdQQlNXb3JrUHJvZHVjdERlc2NyaXB0b3JJdGVtUHJvdmlkZXIodGhpcywKLQkJCQkoSXRlbVByb3ZpZGVyQWRhcHRlcikgVG5nVXRpbC51bWFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeQotCQkJCQkJLmNyZWF0ZVdvcmtQcm9kdWN0RGVzY3JpcHRvckFkYXB0ZXIoKSk7Ci0JfQotCQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUNhcGFiaWxpdHlQYXR0ZXJuQWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBXUEJTUHJvY2Vzc0l0ZW1Qcm92aWRlcih0aGlzLCAoSXRlbVByb3ZpZGVyQWRhcHRlcikgVG5nVXRpbC51bWFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeQotCQkJCS5jcmVhdGVDYXBhYmlsaXR5UGF0dGVybkFkYXB0ZXIoKSk7Ci0JfQotCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRGVsaXZlcnlQcm9jZXNzQWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBXUEJTUHJvY2Vzc0l0ZW1Qcm92aWRlcih0aGlzLCAoSXRlbVByb3ZpZGVyQWRhcHRlcikgVG5nVXRpbC51bWFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeQotCQkJCS5jcmVhdGVEZWxpdmVyeVByb2Nlc3NBZGFwdGVyKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9wdWJsaXNoaW5nL1dQQlNQcm9jZXNzSXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvcHVibGlzaGluZy9XUEJTUHJvY2Vzc0l0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YjJmM2UyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9wdWJsaXNoaW5nL1dQQlNQcm9jZXNzSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MucHVibGlzaGluZzsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5QQlNQcm9jZXNzSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Qcm9jZXNzVXRpbDsKLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZSAtIE1hciAyMiwgMjAwNgotICogQHNpbmNlICAxLjAKLSAqLwotcHVibGljIGNsYXNzIFdQQlNQcm9jZXNzSXRlbVByb3ZpZGVyIGV4dGVuZHMgUEJTUHJvY2Vzc0l0ZW1Qcm92aWRlciB7Ci0KLQkvKioKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKiBAcGFyYW0gZGVsZWdhdGVJdGVtUHJvdmlkZXIKLQkgKi8KLQlwdWJsaWMgV1BCU1Byb2Nlc3NJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksCi0JCQlJdGVtUHJvdmlkZXJBZGFwdGVyIGRlbGVnYXRlSXRlbVByb3ZpZGVyKSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5LCBkZWxlZ2F0ZUl0ZW1Qcm92aWRlcik7Ci0JfQotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlpZihpc1JvbGxlZFVwKCkpIHsKLQkJCWlmKGNhY2hlZFJvbGx1cENoaWxkcmVuID09IG51bGwpIHsKLQkJCQljYWNoZWRSb2xsdXBDaGlsZHJlbiA9IG5ldyBBcnJheUxpc3Qoc3VwZXIuZ2V0Q2hpbGRyZW4ob2JqZWN0KSk7Ci0JCQl9Ci0JCQlyZXR1cm4gY2FjaGVkUm9sbHVwQ2hpbGRyZW47Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpZihjYWNoZWRDaGlsZHJlbiA9PSBudWxsKSB7Ci0JCQkJY2FjaGVkQ2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KHN1cGVyLmdldENoaWxkcmVuKG9iamVjdCkpOwotCQkJfQotCQkJcmV0dXJuIGNhY2hlZENoaWxkcmVuOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIExpc3QgcmVtb3ZlU3ViYXJ0aWZhY3RzRnJvbUNoaWxkcmVuKENvbGxlY3Rpb24gY2hpbGRyZW4sIGJvb2xlYW4gdW53cmFwKSB7Ci0JCXJldHVybiBQcm9jZXNzVXRpbC5yZW1vdmVTdWJhcnRpZmFjdHNGcm9tQ2hpbGRyZW4oY2hpbGRyZW4sIHVud3JhcCwgYWRhcHRlckZhY3RvcnkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL3B1Ymxpc2hpbmcvV1BCU1dvcmtQcm9kdWN0RGVzY3JpcHRvckl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL3B1Ymxpc2hpbmcvV1BCU1dvcmtQcm9kdWN0RGVzY3JpcHRvckl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNDM3MTdmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9wdWJsaXNoaW5nL1dQQlNXb3JrUHJvZHVjdERlc2NyaXB0b3JJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5wdWJsaXNoaW5nOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuUHJvY2Vzc1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFydGlmYWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5VbWFVdGlsOwotCi0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUgLSBNYXIgMjIsIDIwMDYKLSAqIEBzaW5jZSAgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBXUEJTV29ya1Byb2R1Y3REZXNjcmlwdG9ySXRlbVByb3ZpZGVyIGV4dGVuZHMKLQkJb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLldvcmtQcm9kdWN0RGVzY3JpcHRvckl0ZW1Qcm92aWRlciB7Ci0KLQkvKioKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKiBAcGFyYW0gZGVsZWdhdGVJdGVtUHJvdmlkZXIKLQkgKi8KLQlwdWJsaWMgV1BCU1dvcmtQcm9kdWN0RGVzY3JpcHRvckl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwKLQkJCUl0ZW1Qcm92aWRlckFkYXB0ZXIgZGVsZWdhdGVJdGVtUHJvdmlkZXIpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnksIGRlbGVnYXRlSXRlbVByb3ZpZGVyKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuV29ya1Byb2R1Y3REZXNjcmlwdG9ySXRlbVByb3ZpZGVyI2dldENoaWxkcmVuKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlpZihjYWNoZWRDaGlsZHJlbiA9PSBudWxsKSB7Ci0JCQljYWNoZWRDaGlsZHJlbiA9IG5ldyBBcnJheUxpc3Qoc3VwZXIuZ2V0Q2hpbGRyZW4ob2JqZWN0KSk7Ci0JCX0KLQkJcmV0dXJuIGNhY2hlZENoaWxkcmVuOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuV29ya1Byb2R1Y3REZXNjcmlwdG9ySXRlbVByb3ZpZGVyI2FkZENvbnRhaW5lZEFydGlmYWN0RGVzY3JpcHRvcnMob3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3IsIGphdmEudXRpbC5Db2xsZWN0aW9uKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZENvbnRhaW5lZEFydGlmYWN0RGVzY3JpcHRvcnMoV29ya1Byb2R1Y3REZXNjcmlwdG9yIHdwRGVzYywgQ29sbGVjdGlvbiBjaGlsZHJlbikgewotCQlBY3Rpdml0eSBhY3Rpdml0eSA9IFVtYVV0aWwuZ2V0UGFyZW50QWN0aXZpdHkod3BEZXNjKTsKLQkJaWYoYWN0aXZpdHkgIT0gbnVsbCkgewotCQkJLy8gY29sbGVjdCBhbGwgYXJ0aWZhY3QgZGVzY3JpcHRvcnMgb3IgdGhlaXIgd3JhcHBlcnMgdW5kZXIgdGhlIHNhbWUgYWN0aXZpdHkKLQkJCS8vCi0JCQlMaXN0IGFydGlmYWN0RGVzY0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlDb2xsZWN0aW9uIHNpYmxpbmdzID0gYWN0aXZpdHkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKTsKLQkJCUlGaWx0ZXIgZmlsdGVyID0gUHJvY2Vzc1V0aWwuZ2V0RmlsdGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHNpYmxpbmdzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBlID0gaXRlci5uZXh0KCk7Ci0JCQkJaWYoZSBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0RGVzY3JpcHRvciAKLQkJCQkJCSYmICgoV29ya1Byb2R1Y3REZXNjcmlwdG9yKWUpLmdldFdvcmtQcm9kdWN0KCkgaW5zdGFuY2VvZiBBcnRpZmFjdAotCQkJCQkJJiYgKGZpbHRlciA9PSBudWxsIHx8IGZpbHRlci5hY2NlcHQoZSkpKSB7Ci0JCQkJCWFydGlmYWN0RGVzY0xpc3QuYWRkKGUpOwotCQkJCX0KLQkJCX0KLQkJCQotCQkJY2hpbGRyZW4uYWRkQWxsKFByb2Nlc3NVdGlsLmdldENvbnRhaW5lZEFydGlmYWN0c0Rlc2NyaXB0b3JzKHdwRGVzYywgYXJ0aWZhY3REZXNjTGlzdCkpOwkJCQotCQl9Ci0KLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvcHVibGlzaGluZy9wYWNrYWdlLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvcHVibGlzaGluZy9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1ZDhjODIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL3B1Ymxpc2hpbmcvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgaXRlbSBwcm92aWRlcnMgZm9yIGRpc3BsYXlpbmcgYSBwcm9jZXNzIGluIGEgcHVibGlzaGVkIGNvbmZpZ3VyYXRpb24uCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91aS9JQWN0aW9uVHlwZVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3VpL0lBY3Rpb25UeXBlUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTJkYmI3Ni4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3VpL0lBY3Rpb25UeXBlUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSUFjdGlvbk1hbmFnZXI7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElBY3Rpb25UeXBlUHJvdmlkZXIgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09QWSA9IDE7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFWFRFTkQgPSAyOwotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFRVBfQ09QWSA9IDM7Ci0KLQl2b2lkIHNldElucHV0RGF0YShPYmplY3Qgb2JqZWN0KTsKLQotCXZvaWQgc2V0QWN0aW9uTWFuYWdlcihJQWN0aW9uTWFuYWdlciBhY3Rpb25NZ3IpOwotCi0JLyoqCi0JICogRXhlY3V0ZXMgZ2l2ZW4gY29tbWFuZCBiYXNlZCBvbiB0aGUgY2hvaWNlIHRoYXQgdXNlciBzZWxlY3RlZCBmcm9tIGdpdmVuCi0JICogPGNvZGU+Y2hvaWNlczwvY29kZT4uIENob2ljZSBjYW4gYmUgb25lIG9mIHRoZSBjb25zdGFudCB7QGxpbmsgI0NPUFl9LAotCSAqIHtAbGluayAjRVhURU5EfSwgb3Ige0BsaW5rICNERUVQX0NPUFl9Ci0JICogCi0JICogQHBhcmFtIGNtZAotCSAqIEBwYXJhbSBjaG9pY2VzCi0JICovCi0Jdm9pZCBleGVjdXRlKENvbW1hbmQgY21kLCBpbnRbXSBjaG9pY2VzKTsKLQotLy8JaW50IGdldEFjdGlvblR5cGUoKTsKLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91aS9JVUlIZWxwZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdWkvSVVJSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlNmVmYWUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91aS9JVUlIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudWk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLklTY2hlZHVsaW5nUnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuQlNBY3Rpdml0eUl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuRXhwb3NlZEFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5JUnVubmFibGVXaXRoUHJvZ3Jlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGVhbVByb2ZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdDsKLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuNQotICoKLSAqLwotcHVibGljIGludGVyZmFjZSBJVUlIZWxwZXIgewotCXB1YmxpYyB2b2lkIHJ1blNhZmVseShSdW5uYWJsZSBydW5uYWJsZSwgYm9vbGVhbiBzeW5jaHJvbm91cyk7Ci0JCi0JcHVibGljIHZvaWQgcnVuV2l0aEJ1c3lJbmRpY2F0b3IoUnVubmFibGUgcnVubmFibGUpOwotCQotCXB1YmxpYyBib29sZWFuIHJ1bldpdGhQcm9ncmVzcyhJUnVubmFibGVXaXRoUHJvZ3Jlc3MgcnVubmFibGUsIGJvb2xlYW4gY2FuQ2FuY2VsLCBTdHJpbmcgbXNnKTsKLQotCXB1YmxpYyBJU3RhdHVzIHJ1bkFzSm9iKElSdW5uYWJsZVdpdGhQcm9ncmVzcyBydW5uYWJsZSwgU3RyaW5nIHRhc2tOYW1lLAotCQkJT2JqZWN0IHNoZWxsKTsKLQotCXB1YmxpYyBib29sZWFuIHJ1bkluVUkoSVJ1bm5hYmxlV2l0aFByb2dyZXNzIHJ1bm5hYmxlLAotCQkJSVNjaGVkdWxpbmdSdWxlIHJ1bGUsIE9iamVjdCBzaGVsbCk7Ci0JCi0JcHVibGljIHZvaWQgcnVuSW5VSShJUnVubmFibGVXaXRoUHJvZ3Jlc3MgcnVubmFibGUsCi0JCQlTdHJpbmcgdGFza05hbWUpOwotCi0JSVN0YXR1cyBydW5Jbk1vZGFsQ29udGV4dChJUnVubmFibGVXaXRoUHJvZ3Jlc3Mgb3BlcmF0aW9uLCBib29sZWFuIGZvcmssCi0JCQlJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIE9iamVjdCB1aUNvbnRleHQpOwotCi0JcHVibGljIFRlYW1Qcm9maWxlIGdldFRlYW0oQWN0aXZpdHkgYWN0aXZpdHksIFJvbGUgcm9sZSwgT2JqZWN0IFVJQ29udGV4dCk7Ci0KLQkvKioKLQkgKiBTZWxlY3QgdGFza3Mgd2hpY2ggaGFzIGdpdmVuIHdvcmtwcm9kdWN0IGFzIG91dHB1dC4KLQkgKiAKLQkgKiBAcGFyYW0gdGFza0xpc3QKLQkgKiBAcGFyYW0gd3AKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIExpc3Qgc2VsZWN0VGFza3MoTGlzdCB0YXNrTGlzdCwgV29ya1Byb2R1Y3Qgd3ApOwotCi0JLyoqCi0JICogU2VsZWN0IHJlc3BvbnNpYmxlIHdvcmsgcHJvZHVjdHMgZm9yIHRoZSBnaXZlbiByb2xlCi0JICogCi0JICogQHBhcmFtIHdwTGlzdAotCSAqIEBwYXJhbSByb2xlCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBMaXN0IHNlbGVjdFdvcmtQcm9kdWN0cyhMaXN0IHdwTGlzdCwgUm9sZSByb2xlKTsKLQotCXB1YmxpYyBib29sZWFuIHJlZnJlc2hOZWVkZWQoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksCi0JCQlCU0FjdGl2aXR5SXRlbVByb3ZpZGVyIGl0ZW1Qcm92aWRlcik7Ci0KLQlwdWJsaWMgdm9pZCByZWZyZXNoVmlld2VyKEFkYXB0ZXJGYWN0b3J5IGZhY3RvcnksIFByb2Nlc3MgcHJvYyk7Ci0JCi0JcHVibGljIHZvaWQgcmVmcmVzaEFsbFZpZXdlcnMoZmluYWwgRXhwb3NlZEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KTsKLQotCXB1YmxpYyB2b2lkIHJlZnJlc2hJRHNJblZpZXdlcihFeHBvc2VkQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpOwotCQotCXB1YmxpYyBPYmplY3QgZ2V0Vmlld2VyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LCBQcm9jZXNzIHByb2MpOwotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3VpL1JlZmVyZW5jZVNlbGVjdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91aS9SZWZlcmVuY2VTZWxlY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWYyY2Q0NS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3VpL1JlZmVyZW5jZVNlbGVjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudWk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5PcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JVXNlckludGVyYWN0aW9uSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuQWRhcHRlckZhY3RvcnlJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuRXh0ZW5zaW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotLyoqCi0gKiBVSSBEaWFsb2cgY2xhc3Mgd2hpY2ggd2lsbCBnaXZlIHVzZXIgdG8gc2VsZWN0IHJlZmVyZW5jZXMgdG8gYmUgZGVsZXRlZAotICogCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUmVmZXJlbmNlU2VsZWN0aW9uIHsKLQotCXB1YmxpYyBzdGF0aWMgT2JqZWN0W10gZ2V0UmVmZXJlbmNlcyhMaXN0IHJlZiwgRGVzY3JpcHRvciBkZXNjKSB7Ci0JCXJldHVybiBnZXRSZWZlcmVuY2VzKHJlZiwgTkxTLmJpbmQoTGlicmFyeUVkaXRSZXNvdXJjZXMudWlfcmVmX2RlbGV0ZSwKLQkJCQlkZXNjLmdldE5hbWUoKSkpOwotCX0KLQotCS8qKgotCSAqIFNob3dzIGRpYWxvZyBib3ggZm9yIGFsbCByZWZlcmVuY2VzIHRvIGJlIGRlbGV0ZWQgZm9yIHRoZSBnaXZlbgotCSAqIGRlc2NyaXB0b3IuIFRoZXNlIHJlZmVyZW5jZXMgYXJlIG5vdCBiZWluZyB1c2VkIGFueXdoZXJlIGVsc2UuCi0JICogCi0JICogQHBhcmFtIHJlZgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9iamVjdFtdIGdldFJlZmVyZW5jZXMoTGlzdCByZWYpIHsKLQotCQlTdHJpbmcgbWVzc2FnZSA9IExpYnJhcnlFZGl0UmVzb3VyY2VzLnVpX3JlZl9kZWxldGUyOwotCQl0cnkgewotCQkJcmV0dXJuIGdldFJlZmVyZW5jZXMocmVmLCBtZXNzYWdlKTsKLQkJfSBjYXRjaCAoT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBJdCBzaG93cyBzZWxlY3Rpb24gZGlhbG9nIGJveCB3aXRoIGxpc3Qgb2YgcmVmZXJlbmNlICg8Y29kZT5yZWY8L2NvZGU+KQotCSAqIGZvciB1c2VyIHRvIHNlbGVjdC4KLQkgKiAKLQkgKiBAcGFyYW0gcmVmCi0JICogQHJldHVybgotCSAqIEBleGNlcHRpb24gT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBpZiB1c2VyIGNhbmNlbGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBPYmplY3RbXSBnZXRSZWZlcmVuY2VzKExpc3QgcmVmLCBTdHJpbmcgbXNnKQotCQkJdGhyb3dzIE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uIHsKLQkJLy8gSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIgY29udGVudFByb3ZpZGVyID0gbmV3Ci0JCS8vIEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKAotCQkvLyBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkvLyAuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpIHsKLQkJLy8gcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBvYmplY3QpIHsKLQkJLy8gcmV0dXJuICgoTGlzdCkgb2JqZWN0KS50b0FycmF5KCk7Ci0JCS8vIH0KLQkJLy8gfTsKLQkJLy8gSUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlciA9IG5ldyBBZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIoCi0JCS8vIFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCS8vIC5nZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSk7Ci0JCS8vCi0JCS8vIHRyeSB7Ci0JCS8vIFByb2Nlc3NMaXN0U2VsZWN0aW9uRGlhbG9nIGRsZyA9IG5ldwotCQkvLyBQcm9jZXNzTGlzdFNlbGVjdGlvbkRpYWxvZyhQbGF0Zm9ybVVJCi0JCS8vIC5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRTaGVsbCgpLCByZWYsCi0JCS8vIGNvbnRlbnRQcm92aWRlciwgbGFiZWxQcm92aWRlciwgbXNnKTsKLQkJLy8KLQkJLy8gZGxnLnNldFRpdGxlKExpYnJhcnlFZGl0UmVzb3VyY2VzLnVpX3JlZmVyZW5jZXMpOyAvLyROT04tTkxTLTEkCi0JCS8vIGRsZy5zZXRCbG9ja09uT3Blbih0cnVlKTsKLQkJLy8gaWYgKGRsZy5vcGVuKCkgPT0gRGlhbG9nLkNBTkNFTCkgewotCQkvLyB0aHJvdyBuZXcgT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24oKTsKLQkJLy8gfQotCQkvLyBPYmplY3Qgb2Jqc1tdID0gZGxnLmdldFJlc3VsdCgpOwotCQkvLyByZXR1cm4gb2JqczsKLQkJLy8gfSBmaW5hbGx5IHsKLQkJLy8gY29udGVudFByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJLy8gbGFiZWxQcm92aWRlci5kaXNwb3NlKCk7Ci0JCS8vIH0KLQotCQlJVXNlckludGVyYWN0aW9uSGFuZGxlciB1aUhhbmRsZXIgPSBFeHRlbnNpb25NYW5hZ2VyCi0JCQkJLmdldERlZmF1bHRVc2VySW50ZXJhY3Rpb25IYW5kbGVyKCk7Ci0JCWlmICh1aUhhbmRsZXIgIT0gbnVsbCkgewotCQkJSUl0ZW1MYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIgPSBuZXcgQWRhcHRlckZhY3RvcnlJdGVtTGFiZWxQcm92aWRlcigKLQkJCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpOwotCQkJU3RyaW5nIHRpdGxlID0gTGlicmFyeUVkaXRSZXNvdXJjZXMudWlfcmVmZXJlbmNlczsKLQkJCUxpc3Qgc2VsZWN0ZWQgPSB1aUhhbmRsZXIuc2VsZWN0KHJlZiwgbGFiZWxQcm92aWRlciwgdHJ1ZSwgcmVmLAotCQkJCQl0aXRsZSwgbXNnKTsKLQkJCWlmIChzZWxlY3RlZCA9PSBudWxsKSB7Ci0JCQkJdGhyb3cgbmV3IE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uKCk7Ci0JCQl9Ci0JCQlyZXR1cm4gc2VsZWN0ZWQudG9BcnJheSgpOwotCQl9Ci0KLQkJLy8gbm8gdXNlciBpbnRlcmFjdGlvbiBoYW5kbGVyIGF2YWlsYWJsZQotCQkvLyByZXR1cm4gdGhlIGVudGlyZSByZWZlcmVuY2UgbGlzdAotCQkvLwotCQlyZXR1cm4gcmVmLnRvQXJyYXkoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3VpL1VzZXJJbnRlcmFjdGlvbkhlbHBlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91aS9Vc2VySW50ZXJhY3Rpb25IZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGFjYmYyNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3VpL1VzZXJJbnRlcmFjdGlvbkhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzgzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudWk7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUm9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5NdWx0aVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5JU2NoZWR1bGluZ1J1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5BZGRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklDb25maWd1cmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlByb3ZpZGVyczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSVVzZXJJbnRlcmFjdGlvbkhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLlVzZXJJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuRXh0ZW5zaW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuSVJ1bm5hYmxlV2l0aFByb2dyZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5NZXNzZW5nZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlByb2Nlc3NVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbi5BYnN0cmFjdFN0cmluZ1ZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb24uSVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VydmljZXMuSUFjY2Vzc0NvbnRyb2xsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzLlNlcnZpY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTmFtZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZWFtUHJvZmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUuaW1wbC5NdWx0aVJlc291cmNlRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLnV0aWwuT3Bwb3NpdGVGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5VbWFVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLS8qKgotICogRGVmaW5lcyBzdGF0aWMgbWV0aG9kcyB0aGF0IGludGVyYWN0IHdpdGggdXNlciB2aWEgZGlhbG9nIGJveGVzIHRvIHJldHJpZXZlCi0gKiBtb3JlIGluZm9ybWF0aW9uIG9yIGNvbmZpcm1hdGlvbiBmcm9tIHRoZSB1c2Vycy4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBVc2VySW50ZXJhY3Rpb25IZWxwZXIgewotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gY2FuSW50ZXJhY3QgPSB0cnVlOwotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIElVSUhlbHBlciB1aUhlbHBlciA9IChJVUlIZWxwZXIpIEV4dGVuc2lvbk1hbmFnZXIuZ2V0RXh0ZW5zaW9uKAotCQkJTGlicmFyeUVkaXRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldElkKCksICJ1aUhlbHBlciIpOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIFVzZXJJbnRlcmFjdGlvbkhlbHBlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY2FuSW50ZXJhY3QoKSB7Ci0JCXJldHVybiBjYW5JbnRlcmFjdDsKLQl9Ci0KLQkvKioKLQkgKiBDaGVja3MgYWdhaW5zdCBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gb2YgdGhlIGdpdmVuIHByb2Nlc3Mgd2hldGhlciB0aGUKLQkgKiBnaXZlbiAobWV0aG9kKSBvYmplY3QgY2FuIGJlIHVzZWQgaW4gdGhlIHByb2Nlc3MuIFRoaXMgbWV0aG9kIHdpbGwgcHJvbXB0Ci0JICogdXNlciB0byBhZGQgdGhlIG9iamVjdCBhbmQgdGhvc2UgZWxlbWVudHMgdGhhdCBpdCBpcyBhc3NvY2lhdGVkIHdpdGggdG8KLQkgKiB0aGUgZGVmYXVsdCBjb25maWd1cmF0aW9uIGlmIHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gZG9lcyBub3QgaGF2ZSB0aGVtCi0JICogeWV0LgotCSAqIAotCSAqIEBwYXJhbSBwcm9jCi0JICogICAgICAgICAgICB0aGUgcHJvY2VzcwotCSAqIEBwYXJhbSBvYmplY3QKLQkgKiAgICAgICAgICAgIHRoZSBtZXRob2Qgb2JqZWN0Ci0JICogQHJldHVybgotCSAqICAgICAgICAgICAgPGxpPjEgaWYgdGhlIHByb2Nlc3MnZXMgZGVmYXVsdCBjb25maWd1cmF0aW9uIGFscmVhZHkgaGFzIHRoZQotCSAqICAgICAgICAgICAgb2JqZWN0Ci0JICogICAgICAgICAgICA8bGk+MiBpZiB0aGUgb2JqZWN0IGlzIG5vdCBpbiB0aGUgY29uZmlndXJhdGlvbiwgYnV0IHVzZXIKLQkgKiAgICAgICAgICAgIHdhbnRzIHRvIGFkZCBpdCBub3cKLQkgKiAgICAgICAgICAgIDxsaT4wIGlmIHRoZSBvYmplY3QgaXMgbm90IGluIHRoZSBjb25maWd1cmF0aW9uIGFuZCB1c2VyCi0JICogICAgICAgICAgICBkb24ndCB3YW50IHRvIGFkZCBpdAotCSAqICAgICAgICAgICAgPGxpPi0xIGlmIHVzZXIgY2FuY2VsIHRoZSBwcm9tcHQgdG8gYWRkIHRoZSBvYmplY3RzIGFuZAotCSAqICAgICAgICAgICAgYXNzb2NpYXRlZCBkZXBlbmRlbmNpZXMgdG8gdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IGNoZWNrQWdhaW5zdERlZmF1bHRDb25maWd1cmF0aW9uKFByb2Nlc3MgcHJvYywKLQkJCU9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIGNoZWNrQWdhaW5zdERlZmF1bHRDb25maWd1cmF0aW9uKHByb2MsIG9iamVjdCwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogQ2hlY2tzIGFnYWluc3QgZGVmYXVsdCBjb25maWd1cmF0aW9uIG9mIHRoZSBnaXZlbiBwcm9jZXNzIHdoZXRoZXIgdGhlCi0JICogZ2l2ZW4gKG1ldGhvZCkgb2JqZWN0IGNhbiBiZSB1c2VkIGluIHRoZSBwcm9jZXNzLiBUaGlzIG1ldGhvZCB3aWxsIHByb21wdAotCSAqIHVzZXIgdG8gYWRkIHRoZSBvYmplY3QgYW5kIHRob3NlIGVsZW1lbnRzIHRoYXQgaXQgaXMgYXNzb2NpYXRlZCB3aXRoIHRvCi0JICogdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbiBpZiB0aGUgZGVmYXVsdCBjb25maWd1cmF0aW9uIGRvZXMgbm90IGhhdmUgdGhlbQotCSAqIHlldC4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvYwotCSAqICAgICAgICAgICAgdGhlIHByb2Nlc3MKLQkgKiBAcGFyYW0gb2JqZWN0Ci0JICogICAgICAgICAgICB0aGUgbWV0aG9kIG9iamVjdAotCSAqIEByZXR1cm4KLQkgKiAgICAgICAgICAgIDxsaT4xIGlmIHRoZSBwcm9jZXNzJ2VzIGRlZmF1bHQgY29uZmlndXJhdGlvbiBhbHJlYWR5IGhhcyB0aGUKLQkgKiAgICAgICAgICAgIG9iamVjdAotCSAqICAgICAgICAgICAgPGxpPjIgaWYgdGhlIG9iamVjdCBpcyBub3QgaW4gdGhlIGNvbmZpZ3VyYXRpb24sIGJ1dCB1c2VyCi0JICogICAgICAgICAgICB3YW50cyB0byBhZGQgaXQgbm93Ci0JICogICAgICAgICAgICA8bGk+MCBpZiB0aGUgb2JqZWN0IGlzIG5vdCBpbiB0aGUgY29uZmlndXJhdGlvbiBhbmQgdXNlcgotCSAqICAgICAgICAgICAgZG9uJ3Qgd2FudCB0byBhZGQgaXQKLQkgKiAgICAgICAgICAgIDxsaT4tMSBpZiB1c2VyIGNhbmNlbCB0aGUgcHJvbXB0IHRvIGFkZCB0aGUgb2JqZWN0cyBhbmQKLQkgKiAgICAgICAgICAgIGFzc29jaWF0ZWQgZGVwZW5kZW5jaWVzIHRvIHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBjaGVja0FnYWluc3REZWZhdWx0Q29uZmlndXJhdGlvbihQcm9jZXNzIHByb2MsCi0JCQlPYmplY3Qgb2JqZWN0LCBJQ29uZmlndXJhdG9yIGNvbmZpZ3VyYXRvcikgewotCQlPYmplY3QgZSA9IFRuZ1V0aWwudW53cmFwKG9iamVjdCk7Ci0JCWlmICghKGUgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSkKLQkJCXJldHVybiAwOwotCi0JCWlmIChjb25maWd1cmF0b3IgPT0gbnVsbCkKLQkJCWNvbmZpZ3VyYXRvciA9IFByb3ZpZGVycy5nZXRDb25maWd1cmF0b3JGYWN0b3J5KCkKLQkJCQkJLmNyZWF0ZUNvbmZpZ3VyYXRvcihwcm9jLmdldERlZmF1bHRDb250ZXh0KCkpOwotCQlpZiAoZSBpbnN0YW5jZW9mIFZhcmlhYmlsaXR5RWxlbWVudCkgewotCQkJLy8gY2hlY2sgYWxsIHRoZSBiYXNlIGVsZW1lbnRzIGlmIHRoZXJlIGlzIGFueQotCQkJLy8KLQkJCWJvb2xlYW4gYWxsSW4gPSB0cnVlOwotCQkJZm9yIChWYXJpYWJpbGl0eUVsZW1lbnQgYyA9ICgoVmFyaWFiaWxpdHlFbGVtZW50KSBvYmplY3QpOyBjICE9IG51bGw7IGMgPSAoVmFyaWFiaWxpdHlFbGVtZW50KSBjCi0JCQkJCS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkpIHsKLQkJCQlpZiAoIWNvbmZpZ3VyYXRvci5hY2NlcHQoYykpIHsKLQkJCQkJYWxsSW4gPSBmYWxzZTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQkJaWYgKGFsbEluKSB7Ci0JCQkJcmV0dXJuIDE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGNvbmZpZ3VyYXRvci5hY2NlcHQoZSkpCi0JCQlyZXR1cm4gMTsKLQotCQkvLyBvYmplY3QgaXMgbm90IGluIHRoZSBjb25maWd1cmF0aW9uCi0JCS8vIGFzayB1c2VyIGlmIGhlL3NoZSB3YW50IHRvIGFkZCBpdCB0byB0aGUgZGVmYXVsdCBjb25maWd1cmF0aW9uCi0JCS8vCi0JCVN0cmluZyBtc2cgPSBOTFMKLQkJCQkuYmluZCgKLQkJCQkJCUxpYnJhcnlFZGl0UmVzb3VyY2VzLnVpX1VzZXJJbnRlcmFjdGlvbkhlbHBlcl9kZWZhdWx0Y29uZmlnY2hlY2ssCi0JCQkJCQkoKE1ldGhvZEVsZW1lbnQpIGUpLmdldE5hbWUoKSk7CQkKLQkJSVVzZXJJbnRlcmFjdGlvbkhhbmRsZXIgdWlIYW5kbGVyID0gRXh0ZW5zaW9uTWFuYWdlci5nZXREZWZhdWx0VXNlckludGVyYWN0aW9uSGFuZGxlcigpOwotCQlpZih1aUhhbmRsZXIgIT0gbnVsbCkgewotCQkJaW50IHJldCA9IHVpSGFuZGxlci5zZWxlY3RPbmUobmV3IGludFtdIHsKLQkJCQkJSVVzZXJJbnRlcmFjdGlvbkhhbmRsZXIuQUNUSU9OX1lFUywKLQkJCQkJSVVzZXJJbnRlcmFjdGlvbkhhbmRsZXIuQUNUSU9OX05PLAotCQkJCQlJVXNlckludGVyYWN0aW9uSGFuZGxlci5BQ1RJT05fQ0FOQ0VMCi0JCQkJfSwgTGlicmFyeUVkaXRSZXNvdXJjZXMuYWRkX3RvX2RlZmF1bHRfY29uZmlnX2RsZ190aXRsZSwgbXNnLCBudWxsKTsKLQkJCWlmIChUbmdVdGlsLkRFQlVHKSB7Ci0JCQkJU3lzdGVtLm91dAotCQkJCS5wcmludGxuKCJVc2VySW50ZXJhY3Rpb25IZWxwZXIuY2hlY2tBZ2FpbnN0RGVmYXVsdENvbmZpZ3VyYXRpb24oKTogZWxlbWVudD0iIC8vJE5PTi1OTFMtMSQKLQkJCQkJCSsgZSArICIsIHBhdGg9IiArIFRuZ1V0aWwuZ2V0TGFiZWxXaXRoUGF0aChlKSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCXN3aXRjaCAocmV0KSB7Ci0JCQljYXNlIElVc2VySW50ZXJhY3Rpb25IYW5kbGVyLkFDVElPTl9ZRVM6Ci0JCQkJSVN0YXR1cyBzdGF0dXMgPSBUbmdVdGlsLmNoZWNrRWRpdChwcm9jLmdldERlZmF1bHRDb250ZXh0KCksIG51bGwpOwotCQkJCWlmICghc3RhdHVzLmlzT0soKSkgewotCQkJCQlyZXR1cm4gMDsKLQkJCQl9Ci0JCQkJcmV0dXJuIDI7Ci0JCQljYXNlIElVc2VySW50ZXJhY3Rpb25IYW5kbGVyLkFDVElPTl9OTzoKLQkJCQlyZXR1cm4gMDsKLQkJCWNhc2UgSVVzZXJJbnRlcmFjdGlvbkhhbmRsZXIuQUNUSU9OX0NBTkNFTDoKLQkJCQlyZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIDA7Ci0JfQotCi0JLyoqCi0JICogU2VsZWN0IHRhc2tzIHdoaWNoIGhhcyBnaXZlbiB3b3JrcHJvZHVjdCBhcyBvdXRwdXQuCi0JICogCi0JICogQHBhcmFtIHRhc2tMaXN0Ci0JICogQHBhcmFtIHdwCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCBzZWxlY3RUYXNrcyhMaXN0IHRhc2tMaXN0LCBXb3JrUHJvZHVjdCB3cCkgewotCQlyZXR1cm4gdWlIZWxwZXIuc2VsZWN0VGFza3ModGFza0xpc3QsIHdwKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWxlY3QgcmVzcG9uc2libGUgd29yayBwcm9kdWN0cyBmb3IgdGhlIGdpdmVuIHJvbGUKLQkgKiAKLQkgKiBAcGFyYW0gd3BMaXN0Ci0JICogQHBhcmFtIHJvbGUKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0IHNlbGVjdFdvcmtQcm9kdWN0cyhMaXN0IHdwTGlzdCwgUm9sZSByb2xlKSB7Ci0JCXJldHVybiB1aUhlbHBlci5zZWxlY3RXb3JrUHJvZHVjdHMod3BMaXN0LCByb2xlKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXF1ZXN0cyBuYW1lIGZyb20gdXNlcgotCSAqIAotCSAqIEBwYXJhbSBvYmplY3QKLQkgKiBAcGFyYW0gbmFtZUZlYXR1cmUKLQkgKiBAcmV0dXJuIHRoZSByZXF1ZXN0ZWQgbmFtZSBvZiBudWxsIGlmIHVzZXIgY2FuY2VsZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZXF1ZXN0TmFtZShPYmplY3QgY2hpbGQsCi0JCQlFU3RydWN0dXJhbEZlYXR1cmUgbmFtZUZlYXR1cmUsIFN0cmluZyB0aXRsZSwKLQkJCWZpbmFsIElWYWxpZGF0b3IgdmFsaWRhdG9yKSB7Ci0JCUlWYWxpZGF0b3IgaW5wdXRWYWxpZGF0b3IgPSBuZXcgQWJzdHJhY3RTdHJpbmdWYWxpZGF0b3IoKSB7Ci0KLQkJCXB1YmxpYyBTdHJpbmcgaXNWYWxpZChTdHJpbmcgbmV3VGV4dCkgewotCQkJCWlmICh2YWxpZGF0b3IgIT0gbnVsbCkgewotCQkJCQlyZXR1cm4gZ2V0U2ltcGxlRXJyb3JNZXNzYWdlKHZhbGlkYXRvci5pc1ZhbGlkKG5ld1RleHQpKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0KLQkJfTsKLQkJU3RyaW5nIG5hbWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQlpZiAoY2hpbGQgaW5zdGFuY2VvZiBFT2JqZWN0KSB7Ci0JCQlFT2JqZWN0IGUgPSAoRU9iamVjdCkgY2hpbGQ7Ci0JCQlTdHJpbmcgc3RyID0gKFN0cmluZykgZS5lR2V0KG5hbWVGZWF0dXJlKTsKLQkJCWlmIChzdHIgIT0gbnVsbCkgewotCQkJCW5hbWUgPSBzdHI7Ci0JCQl9Ci0JCX0KLQkJSVVzZXJJbnRlcmFjdGlvbkhhbmRsZXIgdWlIYW5kbGVyID0gRXh0ZW5zaW9uTWFuYWdlci5nZXREZWZhdWx0VXNlckludGVyYWN0aW9uSGFuZGxlcigpOwotCQlpZih1aUhhbmRsZXIgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJVXNlcklucHV0IGlucHV0ID0gbmV3IFVzZXJJbnB1dCgiIiwgVXNlcklucHV0LlRFWFQsIGZhbHNlLCBudWxsLCBudWxsLCBpbnB1dFZhbGlkYXRvciwgbnVsbCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5wdXQuc2V0SW5wdXQobmFtZSk7Ci0JCWJvb2xlYW4gcmV0ID0gdWlIYW5kbGVyLnJlcXVlc3RJbnB1dCh0aXRsZSwgTGlicmFyeUVkaXRSZXNvdXJjZXMuVXNlckludGVyYWN0aW9uSGVscGVyX1Byb2Nlc3NQYWNrYWdlX05hbWUsIAotCQkJQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChpbnB1dCkpOwotCQlpZihyZXQpIHsKLQkJCXJldHVybiBpbnB1dC5nZXRJbnB1dCgpLnRvU3RyaW5nKCkudHJpbSgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFNpbXBsZUVycm9yTWVzc2FnZShTdHJpbmcgbXNnKSB7Ci0JCWlmIChtc2cgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCWludCBzID0gbXNnLmluZGV4T2YoJzonKTsKLQotCQlTdHJpbmcgcHJlZml4ID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKHMgPj0gMCkgewotCQkJcHJlZml4ID0gbXNnLnN1YnN0cmluZygwLCBzKTsKLQotCQkJU3RyaW5nIGVtcHR5RWxlbWVudE5hbWVFcnJvck1zZyA9IExpYnJhcnlFZGl0UmVzb3VyY2VzLmVtcHR5RWxlbWVudE5hbWVFcnJvcl9tc2c7IAotCQkJU3RyaW5nIGR1cENvbnRlbnRGaWxlRXJyb3JNc2cgPSBMaWJyYXJ5RWRpdFJlc291cmNlcy5kdXBsaWNhdGVDb250ZW50RmlsZUVycm9yX21zZzsgCi0JCQlTdHJpbmcgZHVwRWxlbWVudE5hbWVFcnJvck1zZyA9IExpYnJhcnlFZGl0UmVzb3VyY2VzLmR1cGxpY2F0ZUVsZW1lbnROYW1lRXJyb3JfbXNnOyAKLQotCQkJaWYgKGVtcHR5RWxlbWVudE5hbWVFcnJvck1zZyAhPSBudWxsCi0JCQkJCSYmIGVtcHR5RWxlbWVudE5hbWVFcnJvck1zZy5zdGFydHNXaXRoKHByZWZpeCkpCi0JCQkJcmV0dXJuIExpYnJhcnlFZGl0UmVzb3VyY2VzLmVtcHR5RWxlbWVudE5hbWVFcnJvcl9zaW1wbGVfbXNnOyAKLQkJCWVsc2UgaWYgKGR1cENvbnRlbnRGaWxlRXJyb3JNc2cgIT0gbnVsbAotCQkJCQkmJiBkdXBDb250ZW50RmlsZUVycm9yTXNnLnN0YXJ0c1dpdGgocHJlZml4KSkKLQkJCQlyZXR1cm4gTGlicmFyeUVkaXRSZXNvdXJjZXMuZHVwbGljYXRlQ29udGVudEZpbGVFcnJvcl9zaW1wbGVfbXNnOyAKLQkJCWVsc2UgaWYgKGR1cEVsZW1lbnROYW1lRXJyb3JNc2cgIT0gbnVsbAotCQkJCQkmJiBkdXBFbGVtZW50TmFtZUVycm9yTXNnLnN0YXJ0c1dpdGgocHJlZml4KSkKLQkJCQlyZXR1cm4gTGlicmFyeUVkaXRSZXNvdXJjZXMuZHVwbGljYXRlRWxlbWVudE5hbWVFcnJvcl9zaW1wbGVfbXNnOyAKLQkJfQotCi0JCWlmIChzIDwgMCkKLQkJCXMgPSAwOwotCQllbHNlCi0JCQlzKys7Ci0JCWludCB0ID0gbXNnLmluZGV4T2YoJ1xuJyk7Ci0JCWlmICh0IDwgMCkKLQkJCXQgPSBtc2cubGVuZ3RoKCk7Ci0KLQkJcmV0dXJuIG1zZy5zdWJzdHJpbmcocywgdCkudHJpbSgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0ZWFtIGluIHdoaWNoIHVzZXIgd291bGQgYXV0b21hdGljYWxseSBhc3NpZ24gYSByb2xlIGludG8KLQkgKiAKLQkgKiBAcGFyYW0gYWN0aXZpdHkKLQkgKiBAcGFyYW0gcm9sZQotCSAqIEByZXR1cm4KLQkgKiAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFRlYW1Qcm9maWxlIGdldFRlYW0oQWN0aXZpdHkgYWN0aXZpdHksIFJvbGUgcm9sZSkgewotCQlyZXR1cm4gZ2V0VGVhbShhY3Rpdml0eSwgcm9sZSwgbnVsbCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBUZWFtUHJvZmlsZSBnZXRUZWFtKEFjdGl2aXR5IGFjdGl2aXR5LCBSb2xlIHJvbGUsCi0JCQlPYmplY3QgVUlDb250ZXh0KSB7Ci0JCXJldHVybiB1aUhlbHBlci5nZXRUZWFtKGFjdGl2aXR5LCByb2xlLCBVSUNvbnRleHQpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBydW5XaXRoUHJvZ3Jlc3MoZmluYWwgUnVubmFibGUgcnVubmFibGUsCi0JCQlmaW5hbCBTdHJpbmcgbXNnKSB7Ci0JCWZpbmFsIElSdW5uYWJsZVdpdGhQcm9ncmVzcyBvcGVyYXRpb24gPSBuZXcgSVJ1bm5hYmxlV2l0aFByb2dyZXNzKCkgewotCi0JCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQotCQkJCQl0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQkJCXJ1bm5hYmxlLnJ1bigpOwotCQkJfQotCi0JCX07Ci0JCQotCQlyZXR1cm4gcnVuV2l0aFByb2dyZXNzKG9wZXJhdGlvbiwgbXNnKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gcnVuV2l0aFByb2dyZXNzKAotCQkJZmluYWwgSVJ1bm5hYmxlV2l0aFByb2dyZXNzIHJ1bm5hYmxlLCBmaW5hbCBTdHJpbmcgbXNnKSB7Ci0JCXJldHVybiBydW5XaXRoUHJvZ3Jlc3MocnVubmFibGUsIGZhbHNlLCBtc2cpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBydW5XaXRoUHJvZ3Jlc3MoCi0JCQlmaW5hbCBJUnVubmFibGVXaXRoUHJvZ3Jlc3MgcnVubmFibGUsIGZpbmFsIGJvb2xlYW4gY2FuQ2FuY2VsLAotCQkJZmluYWwgU3RyaW5nIG1zZykgewotCQlyZXR1cm4gdWlIZWxwZXIucnVuV2l0aFByb2dyZXNzKHJ1bm5hYmxlLCBjYW5DYW5jZWwsIG1zZyk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJU3RhdHVzIHJ1bkFzSm9iKElSdW5uYWJsZVdpdGhQcm9ncmVzcyBydW5uYWJsZSwKLQkJCVN0cmluZyB0YXNrTmFtZSkgewotCQlPYmplY3Qgc2hlbGwgPSBMaWJyYXJ5RWRpdFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0Q29udGV4dCgpOwotCQlpZiAoc2hlbGwgPT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlydW5uYWJsZS5ydW4obmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIExpYnJhcnlFZGl0UGx1Z2luLmdldFBsdWdpbigpCi0JCQkJCQkuZ2V0SWQoKSwgMCwgZS50b1N0cmluZygpLCBlKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXJldHVybiBydW5Bc0pvYihydW5uYWJsZSwgdGFza05hbWUsIHNoZWxsKTsKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSVN0YXR1cyBydW5Bc0pvYihmaW5hbCBJUnVubmFibGVXaXRoUHJvZ3Jlc3MgcnVubmFibGUsCi0JCQlmaW5hbCBTdHJpbmcgdGFza05hbWUsIE9iamVjdCBzaGVsbCkgewotCQlyZXR1cm4gdWlIZWxwZXIucnVuQXNKb2IocnVubmFibGUsIHRhc2tOYW1lLCBzaGVsbCk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBydW5JblVJKGZpbmFsIFJ1bm5hYmxlIHJ1bm5hYmxlLAotCQkJZmluYWwgU3RyaW5nIHRhc2tOYW1lKSB7Ci0JCXJldHVybiBydW5JblVJKHJ1bm5hYmxlLCB0YXNrTmFtZSwgbnVsbCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIHJ1bkluVUkoZmluYWwgUnVubmFibGUgcnVubmFibGUsCi0JCQlmaW5hbCBTdHJpbmcgdGFza05hbWUsIElTY2hlZHVsaW5nUnVsZSBydWxlKSB7Ci0JCU9iamVjdCBzaGVsbCA9IExpYnJhcnlFZGl0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRDb250ZXh0KCk7Ci0JCWlmIChzaGVsbCA9PSBudWxsKSB7Ci0JCQlydW5uYWJsZS5ydW4oKTsKLQkJCXJldHVybiB0cnVlOwotCQl9IGVsc2UgewotCQkJSVJ1bm5hYmxlV2l0aFByb2dyZXNzIHJ1bm5lciA9IG5ldyBJUnVubmFibGVXaXRoUHJvZ3Jlc3MoKSB7Ci0KLQkJCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQotCQkJCQkJdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCW1vbml0b3IuYmVnaW5UYXNrKHRhc2tOYW1lLCAyKTsKLQkJCQkJCW1vbml0b3Iud29ya2VkKDEpOwotCQkJCQkJcnVubmFibGUucnVuKCk7Ci0JCQkJCX0gZmluYWxseSB7Ci0JCQkJCQltb25pdG9yLmRvbmUoKTsKLQkJCQkJfQotCQkJCX0KLQotCQkJfTsKLQkJCXJldHVybiBydW5JblVJKHJ1bm5lciwgcnVsZSwgc2hlbGwpOwotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIHJ1bkluVUkoSVJ1bm5hYmxlV2l0aFByb2dyZXNzIHJ1bm5hYmxlLAotCQkJT2JqZWN0IHNoZWxsKSB7Ci0JCXJldHVybiBydW5JblVJKHJ1bm5hYmxlLCBudWxsLCBzaGVsbCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIHJ1bkluVUkoSVJ1bm5hYmxlV2l0aFByb2dyZXNzIHJ1bm5hYmxlLAotCQkJSVNjaGVkdWxpbmdSdWxlIHJ1bGUsIE9iamVjdCBzaGVsbCkgewotCQlyZXR1cm4gdWlIZWxwZXIucnVuSW5VSShydW5uYWJsZSwgcnVsZSwgc2hlbGwpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBEZWxpdmVyYWJsZSBpbiB3aGljaCB1c2VyIHdvdWxkIGF1dG9tYXRpY2FsbHkgYXNzaWduIGEgd3AgaW50bwotCSAqIAotCSAqIEBwYXJhbSBhY3Rpdml0eQotCSAqIEBwYXJhbSB3cAotCSAqIEByZXR1cm4KLQkgKiAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFdvcmtQcm9kdWN0RGVzY3JpcHRvciBnZXREZWxpdmVyYWJsZShBY3Rpdml0eSBhY3Rpdml0eSwKLQkJCVdvcmtQcm9kdWN0IHdwKSB7Ci0KLQkJLy8gUExFQUUgRE9OJ1QgQ0xFQU4gVVAKLQkJLy8gY29tbWVudGVkIG91dCBmb3Igbm93IHNpbmNlIHdlIHNodXQtb2ZmIGF1dG9tYXRpYyBhc3NpZ25tZW50Ci0JCS8vIG9mIGRlbGl2ZXJhYmxlIGZvciBub3cKLQkJLy8gTGlzdCBkZWxpdmVyYWJsZUxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCS8vIEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5ID0gVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJLy8gLmdldFBCU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCk7Ci0JCS8vIC8vIGZpbmQgb3V0IGFsbCBkZWxpdmVyYWJsZXMgaW4gdmlzaWJsZSBzY29wZQotCQkvLyBnZXREZWxpdmVyYWJsZXNJblNjb3BlKGFkYXB0ZXJGYWN0b3J5LCBhY3Rpdml0eSwgd3AsCi0JCS8vIGRlbGl2ZXJhYmxlTGlzdCk7Ci0JCS8vIGlmIChkZWxpdmVyYWJsZUxpc3Quc2l6ZSgpID09IDEpIHsKLQkJLy8gcmV0dXJuIChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIGRlbGl2ZXJhYmxlTGlzdC5nZXQoMCk7Ci0JCS8vIH0KLQkJLy8gaWYgKGRlbGl2ZXJhYmxlTGlzdC5zaXplKCkgPiAxKSB7Ci0JCS8vIHJldHVybiBEZWxpdmVyYWJsZVNlbGVjdGlvbi5nZXRTZWxlY3RlZERlbGl2ZXJhYmxlKGRlbGl2ZXJhYmxlTGlzdCwKLQkJLy8gd3ApOwotCQkvLyB9Ci0JCS8vIHRoZXJlIGFyZSBubyBkZWxpdmVyYWJsZSB0byBhc3NpZ24KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUExFQVNFIERPTidUIENMRUFOIFVQLiBUaGlzIG1ldGhvZCBpcyBjdXJyZW50bHkgbm90IHVzZWQgc2luY2Ugd2UKLQkgKiBzaHV0LW9mZiBhdXRvbWF0aWMgYXNzaWdubWVudCBvZiBkZWxpdmVyYWJsZS4gR2V0IGRlbGl2ZXJhYmxlIGluIHNjb3BlCi0JICogCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICogQHBhcmFtIGUKLQkgKiBAcGFyYW0gV29ya1Byb2R1Y3REZXNjcmlwdG9yCi0JICogQHBhcmFtIGRlbGl2ZXJhYmxlTGlzdAotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgZ2V0RGVsaXZlcmFibGVzSW5TY29wZShBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwKLQkJCUJyZWFrZG93bkVsZW1lbnQgZSwgV29ya1Byb2R1Y3Qgd3AsIExpc3QgZGVsaXZlcmFibGVMaXN0KSB7Ci0JCS8vIGdldCBjaGlsZHJlbiBmb3IgYWN0aXZpdHkKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyIGl0ZW1Qcm92aWRlciA9IChJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIpIGFkYXB0ZXJGYWN0b3J5Ci0JCQkJLmFkYXB0KGUsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCUNvbGxlY3Rpb24gY2hpbGRyZW4gPSBpdGVtUHJvdmlkZXIuZ2V0Q2hpbGRyZW4oZSk7Ci0JCWZvciAoSXRlcmF0b3IgaXRvciA9IGNoaWxkcmVuLml0ZXJhdG9yKCk7IGl0b3IuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IG9iaiA9IGl0b3IubmV4dCgpOwotCQkJaWYgKChvYmogaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3IpCi0JCQkJCSYmIChQcm9jZXNzVXRpbAotCQkJCQkJCS5nZXRBc3NvY2lhdGVkRWxlbWVudCgoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBvYmopIGluc3RhbmNlb2YgRGVsaXZlcmFibGUpKSB7Ci0JCQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yIHdwRGVzYyA9IChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIG9iajsKLQotCQkJCS8vIGdldCBkZWxpdmVyYWJsZSBwYXJ0cyBmcm9tIGRlbGl2ZXJhYmxlCi0JCQkJTGlzdCBwYXJ0cyA9IFByb2Nlc3NVdGlsLmdldEFzc29jaWF0ZWRFbGVtZW50TGlzdCh3cERlc2MKLQkJCQkJCS5nZXREZWxpdmVyYWJsZVBhcnRzKCkpOwotCQkJCWlmIChwYXJ0cy5jb250YWlucyh3cCkpIHsKLQkJCQkJZGVsaXZlcmFibGVMaXN0LmFkZChvYmopOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCS8vIGdldCBwYXJlbnQKLQkJT2JqZWN0IGN1cnJlbnRQYXJlbnQgPSBpdGVtUHJvdmlkZXIuZ2V0UGFyZW50KGUpOwotCQlpZiAoY3VycmVudFBhcmVudCAhPSBudWxsKSB7Ci0JCQkvLyBnbyB1cAotCQkJZ2V0RGVsaXZlcmFibGVzSW5TY29wZShhZGFwdGVyRmFjdG9yeSwKLQkJCQkJKEJyZWFrZG93bkVsZW1lbnQpIGN1cnJlbnRQYXJlbnQsIHdwLCBkZWxpdmVyYWJsZUxpc3QpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ2hlY2tzIGlmIHRoZSBnaXZlbiBlbGVtZW50IGNhbiBiZSBtb2RpZmllZC4gVGhpcyBpbmNsdWRlcyBsb2NrIGNoZWNrIGFuZAotCSAqIGVkaXQgY2hlY2suCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiBAcGFyYW0gc2hlbGwKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBJU3RhdHVzIGNoZWNrTW9kaWZ5KEVPYmplY3QgZWxlbWVudCwgT2JqZWN0IHNoZWxsKSB7Ci0JCWlmIChUbmdVdGlsLmlzTG9ja2VkKGVsZW1lbnQpKSB7Ci0JCQlTdHJpbmcgbXNnID0gTWVzc2FnZUZvcm1hdAotCQkJCQkuZm9ybWF0KAotCQkJCQkJCUxpYnJhcnlFZGl0UmVzb3VyY2VzLlVzZXJJbnRlcmFjdGlvbkhlbHBlcl9sb2NrZWRQbHVnaW4sCi0JCQkJCQkJbmV3IE9iamVjdFtdIHsgVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4oZWxlbWVudCkKLQkJCQkJCQkJCS5nZXROYW1lKCkgfSk7IAotCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwKLQkJCQkJTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0SWQoKSwgMCwgbXNnLCBudWxsKTsKLQkJfQotCQlyZXR1cm4gVG5nVXRpbC5jaGVja0VkaXQoKEVPYmplY3QpIGVsZW1lbnQsIHNoZWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBDaGVja3MgZm9yIHVubW9kaWZpYWJsZSByZXNvdXJjZXMuCi0JICogCi0JICogQHBhcmFtIG1vZGlmaWVkUmVzb3VyY2VzCi0JICogICAgICAgICAgICBBIGNvbGxlY3Rpb24gb2YgcmVzb3VyY2VzLgotCSAqIEBwYXJhbSBjb250ZXh0Ci0JICogICAgICAgICAgICBUaGUgY29udGV4dCBvZiB0aGlzIGNhbGwuIEZvciBSQ1AsIHRoaXMgaXMgdGhlIHNoZWxsLgotCSAqIEByZXR1cm4gQW4gPGNvZGU+SVN0YXR1czwvY29kZT4gb2JqZWN0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVN0YXR1cyBjaGVja01vZGlmeShDb2xsZWN0aW9uIG1vZGlmaWVkUmVzb3VyY2VzLCBPYmplY3QgY29udGV4dCkgewotCQlJQWNjZXNzQ29udHJvbGxlciBhYyA9IFNlcnZpY2VzLmdldEFjY2Vzc0NvbnRyb2xsZXIoKTsKLQkJaWYgKGFjID09IG51bGwpIHsKLQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCQl9Ci0JCVJlc291cmNlW10gcmVzb3VyY2VzID0gbmV3IFJlc291cmNlW21vZGlmaWVkUmVzb3VyY2VzLnNpemUoKV07Ci0JCW1vZGlmaWVkUmVzb3VyY2VzLnRvQXJyYXkocmVzb3VyY2VzKTsKLQkJcmV0dXJuIGFjLmNoZWNrTW9kaWZ5KHJlc291cmNlcywgY29udGV4dCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJUmVzb3VyY2UgZ2V0V29ya3NwYWNlUmVzb3VyY2UoUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJaWYgKCFyZXNvdXJjZS5nZXRVUkkoKS5pc0ZpbGUoKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJSVdvcmtzcGFjZVJvb3Qgd29ya3NwYWNlUm9vdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7Ci0JCUlQYXRoIHBhdGggPSBuZXcgUGF0aChyZXNvdXJjZS5nZXRVUkkoKS50b0ZpbGVTdHJpbmcoKSk7Ci0JCXJldHVybiB3b3Jrc3BhY2VSb290LmdldEZpbGVGb3JMb2NhdGlvbihwYXRoKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY2hlY2tPdXRPZlN5bmNoKENvbGxlY3Rpb24gcmVzb3VyY2VzKSB7Ci0JCUFycmF5TGlzdCBvdXRPZlN5bmNoUmVzb3VyY2VzID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSByZXNvdXJjZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlSZXNvdXJjZSByZXNvdXJjZSA9IChSZXNvdXJjZSkgaXRlci5uZXh0KCk7Ci0JCQlJUmVzb3VyY2Ugd3NSZXNvdXJjZSA9IGdldFdvcmtzcGFjZVJlc291cmNlKHJlc291cmNlKTsKLQkJCWlmICh3c1Jlc291cmNlICE9IG51bGwKLQkJCQkJJiYgIXdzUmVzb3VyY2UuaXNTeW5jaHJvbml6ZWQoSVJlc291cmNlLkRFUFRIX1pFUk8pKSB7Ci0JCQkJb3V0T2ZTeW5jaFJlc291cmNlcy5hZGQod3NSZXNvdXJjZSk7Ci0JCQl9Ci0JCX0KLQkJaWYgKG91dE9mU3luY2hSZXNvdXJjZXMuaXNFbXB0eSgpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfSBlbHNlIHsKLQkJCU11bHRpU3RhdHVzIG11bHRpU3RhdHVzID0gbmV3IE11bHRpU3RhdHVzKAotCQkJCQlMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRTeW1ib2xpY05hbWUoKSwgSVN0YXR1cy5PSywKLQkJCQkJIiIsIG51bGwpOyAvLyROT04tTkxTLTEkCi0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBvdXRPZlN5bmNoUmVzb3VyY2VzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCUlSZXNvdXJjZSB3c1Jlc291cmNlID0gKElSZXNvdXJjZSkgaXRlci5uZXh0KCk7Ci0JCQkJSVN0YXR1cyBzdGF0dXMgPSBuZXcgU3RhdHVzKElTdGF0dXMuSU5GTywKLQkJCQkJCUxpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldFN5bWJvbGljTmFtZSgpLAotCQkJCQkJSVN0YXR1cy5PSywgd3NSZXNvdXJjZS5nZXRMb2NhdGlvbigpLnRvT1NTdHJpbmcoKSwgbnVsbCk7Ci0JCQkJbXVsdGlTdGF0dXMuYWRkKHN0YXR1cyk7Ci0JCQl9Ci0JCQlTdHJpbmcgdGl0bGUgPSBMaWJyYXJ5RWRpdFJlc291cmNlcy51cGRhdGVfb3V0b2ZzeW5jaF90aXRsZTsKLQkJCVN0cmluZyBtc2cgPSBMaWJyYXJ5RWRpdFJlc291cmNlcy51cGRhdGVfb3V0b2ZzeW5jaF9tc2c7Ci0KLQkJCUlVc2VySW50ZXJhY3Rpb25IYW5kbGVyIHVpSGFuZGxlciA9IEV4dGVuc2lvbk1hbmFnZXIuZ2V0RGVmYXVsdFVzZXJJbnRlcmFjdGlvbkhhbmRsZXIoKTsKLQkJCXJldHVybiB1aUhhbmRsZXIuc2VsZWN0T25lKG5ldyBpbnRbXSB7SVVzZXJJbnRlcmFjdGlvbkhhbmRsZXIuQUNUSU9OX09LLAotCQkJCQlJVXNlckludGVyYWN0aW9uSGFuZGxlci5BQ1RJT05fQ0FOQ0VMfSwgdGl0bGUsIG1zZywgbXVsdGlTdGF0dXMpICE9IElVc2VySW50ZXJhY3Rpb25IYW5kbGVyLkFDVElPTl9DQU5DRUw7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDaGVjayBpZiBjaGFuZ2UgdG8gdGhlIGdpdmVuIGZlYXR1cmUgb2YgdGhlIGdpdmVuIGZlYXR1cmVPd25lciB3aWxsCi0JICogbW9kaWZ5IHRoZSBlbGVtZW50IGluIG9wcG9zaXRlIGZlYXR1cmUgdmFsdWUKLQkgKiAKLQkgKiBAcGFyYW0gZmVhdHVyZU93bmVyCi0JICogQHBhcmFtIGZlYXR1cmUKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY2hlY2tNb2RpZnlPcHBvc2l0ZShNZXRob2RFbGVtZW50IGZlYXR1cmVPd25lciwKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBNZXRob2RFbGVtZW50IGVsZW1lbnQpIHsKLQkJT3Bwb3NpdGVGZWF0dXJlIG9wcG9zaXRlRmVhdHVyZSA9IE9wcG9zaXRlRmVhdHVyZQotCQkJCS5nZXRPcHBvc2l0ZUZlYXR1cmUoZmVhdHVyZSk7Ci0JCU11bHRpUmVzb3VyY2VFT2JqZWN0IG1yRU9iaiA9IChNdWx0aVJlc291cmNlRU9iamVjdCkgZWxlbWVudDsKLQkJaWYgKG9wcG9zaXRlRmVhdHVyZSAhPSBudWxsICYmICFvcHBvc2l0ZUZlYXR1cmUuaXNNYW55KCkpIHsKLQkJCU5hbWVkRWxlbWVudCBvbGRPcHBvc2l0ZUZlYXR1cmVWYWx1ZSA9IChOYW1lZEVsZW1lbnQpIG1yRU9iagotCQkJCQkuZ2V0T3Bwb3NpdGVGZWF0dXJlTWFwKCkuZ2V0KG9wcG9zaXRlRmVhdHVyZSk7Ci0JCQlpZiAob2xkT3Bwb3NpdGVGZWF0dXJlVmFsdWUgIT0gbnVsbAotCQkJCQkvLyBtYWtlIHN1cmUgdGhlIGVsZW1lbnQgaXMgc3RpbGwgaW4gdGhlIGxpYnJhcnkgYW5kIG5vdAotCQkJCQkvLyBkZWxldGVkIHlldC4KLQkJCQkJLy8KLQkJCQkJJiYgKG9sZE9wcG9zaXRlRmVhdHVyZVZhbHVlIGluc3RhbmNlb2YgTWV0aG9kTGlicmFyeSB8fCBvbGRPcHBvc2l0ZUZlYXR1cmVWYWx1ZQotCQkJCQkJCS5lQ29udGFpbmVyKCkgIT0gbnVsbCkKLQkJCQkJJiYgb2xkT3Bwb3NpdGVGZWF0dXJlVmFsdWUuZVJlc291cmNlKCkgIT0gbnVsbCkgewotCQkJCS8vIHNpbXBsZSByZWplY3QgZm9yIDcuMC4wIHJlbGVhc2UKLQkJCQkvLwotCQkJCVN0cmluZyBtc2cgPSBNZXNzYWdlRm9ybWF0Ci0JCQkJCQkuZm9ybWF0KAotCQkJCQkJCQlMaWJyYXJ5RWRpdFJlc291cmNlcy5Vc2VySW50ZXJhY3Rpb25IZWxwZXJfZXJyUmVsYXRpb25zaGlwRXhpc3RzLAotCQkJCQkJCQluZXcgT2JqZWN0W10gewotCQkJCQkJCQkJCWVsZW1lbnQuZ2V0TmFtZSgpLAotCQkJCQkJCQkJCVRuZ1V0aWwKLQkJCQkJCQkJCQkJCS5nZXRMYWJlbFdpdGhQYXRoKG9sZE9wcG9zaXRlRmVhdHVyZVZhbHVlKSwKLQkJCQkJCQkJCQlmZWF0dXJlT3duZXIuZ2V0TmFtZSgpIH0pOwotCQkJCU1lc3Nlbmdlci5JTlNUQU5DRS5zaG93V2FybmluZygKLQkJCQkJCUxpYnJhcnlFZGl0UmVzb3VyY2VzLmVycm9yRGlhbG9nX3RpdGxlLCBtc2cpOwotCQkJCXJldHVybiBmYWxzZTsKLQotCQkJCS8vIFRPRE86IHVuY29tbWVudCB0byB1c2UgdGhpcyBjb2RlIGZvciA3LjAuMSByZWxlYXNlCi0JCQkJLy8KLQkJCQkvLyBTdHJpbmcgdGl0bGUgPSAiVXBkYXRlIFJlbGF0aW9uc2hpcCI7Ci0JCQkJLy8gU3RyaW5nIG1zZyA9IE1lc3NhZ2VGb3JtYXQuZm9ybWF0KCJBZGRpbmcgJyd7MH0nJyB0byAnJ3sxfScnCi0JCQkJLy8gd2lsbCByZW1vdmUgJyd7MH0nJyBmcm9tICcnezJ9JycuIERvIHlvdSB3YW50IHRvIGNvbnRpbnVlPyIKLQkJCQkvLyAsIG5ldyBPYmplY3RbXSB7IGVsZW1lbnQuZ2V0TmFtZSgpLCBmZWF0dXJlT3duZXIuZ2V0TmFtZSgpLAotCQkJCS8vIG9sZE9wcG9zaXRlRmVhdHVyZVZhbHVlLmdldE5hbWUoKSB9KTsKLQkJCQkvLyBpZighTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0TXNnRGlhbG9nKCkuZGlzcGxheUNvbmZpcm1hdGlvbih0aXRsZSwKLQkJCQkvLyBtc2cpKSB7Ci0JCQkJLy8gcmV0dXJuIGZhbHNlOwotCQkJCS8vIH0KLQkJCQkvLwkJCQkKLQkJCQkvLyBJU3RhdHVzIHN0YXR1cyA9Ci0JCQkJLy8gVXNlckludGVyYWN0aW9uSGVscGVyLmNoZWNrTW9kaWZ5KG9sZE9wcG9zaXRlRmVhdHVyZVZhbHVlLAotCQkJCS8vIG51bGwpOwotCQkJCS8vIGlmKCFzdGF0dXMuaXNPSygpKSB7Ci0JCQkJLy8gTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0TXNnRGlhbG9nKCkuZGlzcGxheUVycm9yKHRpdGxlLAotCQkJCS8vICJDYW5ub3QgdXBkYXRlIHJlbGF0aW9uc2hpcCIsIHN0YXR1cyk7Ci0JCQkJLy8gcmV0dXJuIGZhbHNlOwotCQkJCS8vIH0KLQkJCX0KLQkJfQotCi0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIENoZWNrcyBpZgotCSAqIAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElTdGF0dXMgY2hlY2tDb25maWd1cmF0aW9uc1RvVXBkYXRlKEFkZENvbW1hbmQgYWRkQ29tbWFuZCwKLQkJCU9iamVjdCBzaGVsbCkgewotCQlFT2JqZWN0IHBhcmVudCA9IGFkZENvbW1hbmQuZ2V0T3duZXIoKTsKLQkJaWYgKCEocGFyZW50IGluc3RhbmNlb2YgTWV0aG9kUGFja2FnZSkpIHsKLQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCQl9Ci0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gYWRkQ29tbWFuZC5nZXRGZWF0dXJlKCk7Ci0JCWlmICghKGZlYXR1cmUgaW5zdGFuY2VvZiBFUmVmZXJlbmNlKQotCQkJCXx8ICEoKEVSZWZlcmVuY2UpIGZlYXR1cmUpLmlzQ29udGFpbm1lbnQoKSkgewotCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCX0KLQotCQkvLyBjaGVjayBpZiB0aGUgY29uZmlndXJhdGlvbnMgdGhhdCB3aWxsIGJlIHVwZGF0ZWQgYWZ0ZXIgdGhpcyBjb21tYW5kCi0JCS8vIGNhbiBiZSBtb2RpZmllZAotCQkvLwotCQlBcnJheUxpc3QgY29uZmlnc1RvVXBkYXRlID0gbmV3IEFycmF5TGlzdCgpOwotCQlNZXRob2RQYWNrYWdlIHBhcmVudFBrZyA9IChNZXRob2RQYWNrYWdlKSBwYXJlbnQ7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGFkZENvbW1hbmQuZ2V0Q29sbGVjdGlvbigpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyLm5leHQoKTsKLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kUGFja2FnZSkgewotCQkJCVRuZ1V0aWwuZ2V0Q29uZmlndXJhdGlvbnNUb1VwZGF0ZShwYXJlbnRQa2csCi0JCQkJCQkoTWV0aG9kUGFja2FnZSkgZWxlbWVudCwgY29uZmlnc1RvVXBkYXRlKTsKLQkJCX0KLQkJfQotCQlpZiAoIWNvbmZpZ3NUb1VwZGF0ZS5pc0VtcHR5KCkpIHsKLQkJCUNvbGxlY3Rpb24gcmVzb3VyY2VzVG9DaGVjayA9IG5ldyBIYXNoU2V0KCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjb25maWdzVG9VcGRhdGUuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJRU9iamVjdCBjb25maWcgPSAoRU9iamVjdCkgaXRlci5uZXh0KCk7Ci0JCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSBjb25maWcuZVJlc291cmNlKCk7Ci0JCQkJaWYgKHJlc291cmNlICE9IG51bGwpIHsKLQkJCQkJcmVzb3VyY2VzVG9DaGVjay5hZGQocmVzb3VyY2UpOwotCQkJCX0KLQkJCX0KLQkJCS8vIGNoZWNrIGFmZmVjdGVkIHJlc291cmNlcyBmb3IgdW5tb2RpZmlhYmxlCi0JCQlyZXR1cm4gVXNlckludGVyYWN0aW9uSGVscGVyLmNoZWNrTW9kaWZ5KHJlc291cmNlc1RvQ2hlY2ssIHNoZWxsKTsKLQkJfQotCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY29uZmlybURlZXBDb3B5KENvbGxlY3Rpb24gYWN0aXZpdGllcykgewotCQlpZiAoVXNlckludGVyYWN0aW9uSGVscGVyLmNhbkludGVyYWN0KCkpIHsKLQkJCS8vIGNoZWNrcyBpZiB0aGUgcGF0dGVybiBvciBhY3Rpdml0eSBjb250YWlucyBhbnkgZXh0ZW5kaW5nIGVsZW1lbnRzCi0JCQkvLyBhbmQgcHJvbXB0cyB0aGUgdXNlciBpZiBoZSByZWFsbHkKLQkJCS8vIHdhbnRzIHRvIGRlZXAgY29weSBkeW5hbWljYWxseSBsaW5rZWQgYWN0aXZpdGllcyB3YXJuaW5nIHRoZQotCQkJLy8gcHJvY2VzcyBhdXRob3IgdGhhdCBoZSB3aWxsIGdldCBhIGNvcHkKLQkJCS8vIG9mIGFsbCBkeW5hbWljYWxseSBsaW5rZWQgZWxlbWVudHMgdGhhdCBoZSBuZWVkcyB0byBtYWludGFpbgotCQkJLy8gc2VwYXJhdGVseSBmcm9tIG5vdyBvbgotCQkJYm9vbGVhbiBwcm9tcHROZWVkZWQgPSBmYWxzZTsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGFjdGl2aXRpZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IGUgPSAoT2JqZWN0KSBpdGVyLm5leHQoKTsKLQkJCQlpZiAoZSBpbnN0YW5jZW9mIEFjdGl2aXR5Ci0JCQkJCQkmJiBQcm9jZXNzVXRpbC5oYXNJbmhlcml0ZWQoKEFjdGl2aXR5KSBlKSkgewotCQkJCQlwcm9tcHROZWVkZWQgPSB0cnVlOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAocHJvbXB0TmVlZGVkKSB7Ci0JCQkJU3RyaW5nIHRpdGxlID0gTGlicmFyeUVkaXRSZXNvdXJjZXMuZGVlcENvcHlfdGl0bGU7Ci0JCQkJU3RyaW5nIG1zZyA9IExpYnJhcnlFZGl0UmVzb3VyY2VzLmRlZXBDb3B5X3Byb21wdE1zZzsKLQkJCQlpbnQgcmV0ID0gRXh0ZW5zaW9uTWFuYWdlci5nZXREZWZhdWx0VXNlckludGVyYWN0aW9uSGFuZGxlcigpCi0JCQkJCS5zZWxlY3RPbmUobmV3IGludFtdIHsKLQkJCQkJCQlJVXNlckludGVyYWN0aW9uSGFuZGxlci5BQ1RJT05fWUVTLAotCQkJCQkJCUlVc2VySW50ZXJhY3Rpb25IYW5kbGVyLkFDVElPTl9OTwotCQkJCQl9LCB0aXRsZSwgbXNnLCBudWxsKTsKLQkJCQlpZiAocmV0ID09IElVc2VySW50ZXJhY3Rpb25IYW5kbGVyLkFDVElPTl9OTykgewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIFByb21wdHMgdXNlciB0byBjaG9vc2UgY29uZmlndXJhdGlvbiBmb3IgZGVlcCBjb3B5Ci0JICogCi0JICogQHBhcmFtIHRhcmdldFByb2Nlc3MKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKiBAcmV0dXJuCi0JICogQGV4Y2VwdGlvbiBPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIGlmIHVzZXIgY2FuY2VsbGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBNZXRob2RDb25maWd1cmF0aW9uIGNob29zZURlZXBDb3B5Q29uZmlndXJhdGlvbigKLQkJCVByb2Nlc3MgdGFyZ2V0UHJvY2VzcywgQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJSUZpbHRlciBmaWx0ZXIgPSBQcm9jZXNzVXRpbC5nZXRGaWx0ZXIoYWRhcHRlckZhY3RvcnkpOwotCQlNZXRob2RDb25maWd1cmF0aW9uIGRlZXBDb3B5Q29uZmlnID0gbnVsbDsKLQkJaWYgKGZpbHRlciBpbnN0YW5jZW9mIElDb25maWd1cmF0b3IpIHsKLQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY3VycmVudENvbmZpZyA9ICgoSUNvbmZpZ3VyYXRvcikgZmlsdGVyKQotCQkJCQkuZ2V0TWV0aG9kQ29uZmlndXJhdGlvbigpOwotCQkJaWYgKGN1cnJlbnRDb25maWcgIT0gbnVsbAotCQkJCQkmJiBjdXJyZW50Q29uZmlnICE9IHRhcmdldFByb2Nlc3MuZ2V0RGVmYXVsdENvbnRleHQoKSkgewotCQkJCWlmIChVc2VySW50ZXJhY3Rpb25IZWxwZXIuY2FuSW50ZXJhY3QoKSkgewotCQkJCQlTdHJpbmcgbXNnID0gTGlicmFyeUVkaXRSZXNvdXJjZXMuQWN0aXZpdHlEcm9wQ29tbWFuZF9kZWVwQ29weV9wcm9tcHRDb25maWd1cmF0aW9uTXNnOwotCQkJCQlJVXNlckludGVyYWN0aW9uSGFuZGxlciB1aUhhbmRsZXIgPSBFeHRlbnNpb25NYW5hZ2VyLmdldERlZmF1bHRVc2VySW50ZXJhY3Rpb25IYW5kbGVyKCk7Ci0JCQkJCWlmKHVpSGFuZGxlciAhPSBudWxsKSB7Ci0JCQkJCQlpbnQgcmV0ID0gdWlIYW5kbGVyLnNlbGVjdE9uZShuZXcgaW50W10gewotCQkJCQkJCQlJVXNlckludGVyYWN0aW9uSGFuZGxlci5BQ1RJT05fWUVTLAotCQkJCQkJCQlJVXNlckludGVyYWN0aW9uSGFuZGxlci5BQ1RJT05fTk8sCi0JCQkJCQkJCUlVc2VySW50ZXJhY3Rpb25IYW5kbGVyLkFDVElPTl9DQU5DRUwKLQkJCQkJCQl9LCBMaWJyYXJ5RWRpdFJlc291cmNlcy5kZWVwQ29weV90aXRsZSwgbXNnLCBudWxsKTsJCQkJCQkKLQkJCQkJCXN3aXRjaCAocmV0KSB7Ci0JCQkJCQljYXNlIElVc2VySW50ZXJhY3Rpb25IYW5kbGVyLkFDVElPTl9ZRVM6Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQljYXNlIElVc2VySW50ZXJhY3Rpb25IYW5kbGVyLkFDVElPTl9OTzoKLQkJCQkJCQlkZWVwQ29weUNvbmZpZyA9IGN1cnJlbnRDb25maWc7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQljYXNlIElVc2VySW50ZXJhY3Rpb25IYW5kbGVyLkFDVElPTl9DQU5DRUw6Ci0JCQkJCQkJdGhyb3cgbmV3IE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uKCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGRlZXBDb3B5Q29uZmlnOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY29weUV4dGVybmFsVmFyaWF0aW9uc0FsbG93ZWQoUHJvY2VzcyB0YXJnZXRQcm9jZXNzLCBBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQkvLyBhc2sgdXNlcnMgdG8gY29weSBleHRlcm5hbCBjb250cmlidXRpb24ocykvcmVwbGFjZW1lbnQocykgaWYKLQkJLy8gY3VycmVudCBjb25maWcgaXMgbm90IHRoZSBkZWZhdWx0IGNvbmZpZyBvZiB0aGUgdGFyZ2V0IHByb2Nlc3MKLQkJLy8KLQkJSUZpbHRlciBmaWx0ZXIgPSBQcm9jZXNzVXRpbC5nZXRGaWx0ZXIoYWRhcHRlckZhY3RvcnkpOwotCQlpZiAoZmlsdGVyIGluc3RhbmNlb2YgSUNvbmZpZ3VyYXRvcikgewotCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjdXJyZW50Q29uZmlnID0gKChJQ29uZmlndXJhdG9yKSBmaWx0ZXIpCi0JCQkJCS5nZXRNZXRob2RDb25maWd1cmF0aW9uKCk7Ci0JCQlpZiAoY3VycmVudENvbmZpZyAhPSBudWxsCi0JCQkJCSYmIGN1cnJlbnRDb25maWcgIT0gdGFyZ2V0UHJvY2Vzcy5nZXREZWZhdWx0Q29udGV4dCgpKSB7CQkJCQotCQkJCVN0cmluZyBtc2cgPSBMaWJyYXJ5RWRpdFJlc291cmNlcy5hY3Rpdml0eV9kZWVwX2NvcHlfdmFyaWFiaWxpdHlfcHJvbXB0OwotCQkJCUlVc2VySW50ZXJhY3Rpb25IYW5kbGVyIHVpSGFuZGxlciA9IEV4dGVuc2lvbk1hbmFnZXIuZ2V0RGVmYXVsdFVzZXJJbnRlcmFjdGlvbkhhbmRsZXIoKTsKLQkJCQlpZih1aUhhbmRsZXIgIT0gbnVsbCkgewotCQkJCQlpbnQgcmV0ID0gdWlIYW5kbGVyLnNlbGVjdE9uZShuZXcgaW50W10gewotCQkJCQkJCUlVc2VySW50ZXJhY3Rpb25IYW5kbGVyLkFDVElPTl9ZRVMsCi0JCQkJCQkJSVVzZXJJbnRlcmFjdGlvbkhhbmRsZXIuQUNUSU9OX05PLAotCQkJCQkJCUlVc2VySW50ZXJhY3Rpb25IYW5kbGVyLkFDVElPTl9DQU5DRUwKLQkJCQkJCX0sIExpYnJhcnlFZGl0UmVzb3VyY2VzLmRlZXBDb3B5X3RpdGxlLCBtc2csIG51bGwpOwkJCQkJCQotCQkJCQlzd2l0Y2ggKHJldCkgewotCQkJCQljYXNlIElVc2VySW50ZXJhY3Rpb25IYW5kbGVyLkFDVElPTl9ZRVM6Ci0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJY2FzZSBJVXNlckludGVyYWN0aW9uSGFuZGxlci5BQ1RJT05fTk86Ci0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCWNhc2UgSVVzZXJJbnRlcmFjdGlvbkhhbmRsZXIuQUNUSU9OX0NBTkNFTDoKLQkJCQkJCXRocm93IG5ldyBPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbigpOwotCQkJCQl9Ci0JCQkJfQkJCQkKLQkJCX0KLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIElVSUhlbHBlciBnZXRVSUhlbHBlcigpIHsKLQkJcmV0dXJuIHVpSGVscGVyOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3VpL3BhY2thZ2UuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdWkvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYzM3M2RmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdWkvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgc3VwcG9ydGluZyBkaWFsb2dzIGZvciBzZWxlY3RpbmcgYW5kIGVkaXRpbmcgbWV0aG9kIGxpYnJhcnkgZWxlbWVudHMuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL0FjdGl2aXR5SGFuZGxlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL0FjdGl2aXR5SGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MjZiNmEyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9BY3Rpdml0eUhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkJhc2ljQ29tbWFuZFN0YWNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21wb3VuZENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLlVuZXhlY3V0YWJsZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29weUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db3B5Q29tbWFuZC5IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5BZGFwdGVyRmFjdG9yeVRyZWVJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuSUJTSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kLkFjdGl2aXR5RGVlcENvcHlDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kLkNvcHlIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtCcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC5kb21haW4uVHJhY2VhYmxlQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5VbWFVdGlsOwotCi0KLS8qKgotICogVXNlZCB0byBleHRlbmQvY29weSBhY3Rpdml0aWVzCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eUhhbmRsZXIgewotCi0JcHJpdmF0ZSBBcnJheUxpc3Q8UHJvY2Vzc1BhY2thZ2U+IHByb2NQYWNrYWdlczsKLQkKLQkvKioKLQkgKiBMaXN0IG9mIGFjdGl2aXRpZXMgb3IgYWN0aXZpdHkgd3JhcHBlcnMgdG8gZGVlcCBjb3B5LgotCSAqLwotCXByaXZhdGUgQXJyYXlMaXN0PE9iamVjdD4gYWN0aXZpdGllc1RvRGVlcENvcHk7CQotCQotCXByaXZhdGUgTWV0aG9kQ29uZmlndXJhdGlvbiBkZWVwQ29weUNvbmZpZzsJCi0JcHJpdmF0ZSBMaXN0IGRlZXBDb3BpZXM7Ci0JcHJpdmF0ZSBNYXAgZGVlcENvcHlUb09yaWdpbmFsTWFwOwotCXByaXZhdGUgQXJyYXlMaXN0PEFjdGl2aXR5PiBhY3Rpdml0aWVzOwotCi0JcHJpdmF0ZSBNYXAgY29weVRvT3JpZ2luYWw7Ci0JCi0JcHJpdmF0ZSBBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW4gZWRpdGluZ0RvbWFpbjsKLQkKLQlwcml2YXRlIEhlbHBlciBjb3B5SGVscGVyOwotCQotCXByaXZhdGUgQ29weUhlbHBlciBkZWVwQ29weUhlbHBlcjsKLQotCXByaXZhdGUgUHJvY2VzcyB0YXJnZXRQcm9jZXNzOwotCQotCXByaXZhdGUgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yOwotCQotCXByaXZhdGUgSUNvbmZpZ3VyYXRvciBhY3Rpdml0eURlZXBDb3B5Q29uZmlndXJhdG9yOwotCQotCXByaXZhdGUgYm9vbGVhbiBjb3B5RXh0ZXJuYWxWYXJpYXRpb25zID0gdHJ1ZTsKLQotCS8qKgotCSAqIENvbnN0cnVjdHMgYSBuZXcgQWN0aXZpdHlIYW5kbGVyCi0JICovCi0JcHVibGljIEFjdGl2aXR5SGFuZGxlcigpIHsKLQkJYWN0aXZpdGllcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJYWN0aXZpdGllc1RvRGVlcENvcHkgPSBuZXcgQXJyYXlMaXN0PE9iamVjdD4oKTsKLQkJZGVlcENvcGllcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZGVlcENvcHlUb09yaWdpbmFsTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJY29weVRvT3JpZ2luYWwgPSBuZXcgSGFzaE1hcCgpOwotCQlwcm9jUGFja2FnZXMgPSBuZXcgQXJyYXlMaXN0KCk7CQotCQljb3B5SGVscGVyID0gbmV3IEhlbHBlcigpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlhY3Rpdml0aWVzLmNsZWFyKCk7Ci0JCWFjdGl2aXRpZXNUb0RlZXBDb3B5LmNsZWFyKCk7Ci0JCWNvcHlUb09yaWdpbmFsLmNsZWFyKCk7Ci0JCXByb2NQYWNrYWdlcy5jbGVhcigpOwotCQljb3B5SGVscGVyLmNsZWFyKCk7CQkKLQkJZGVlcENvcGllcy5jbGVhcigpOwkJCi0JCWlmKGRlZXBDb3B5SGVscGVyICE9IG51bGwpIHsKLQkJCWRlZXBDb3B5SGVscGVyLmNsZWFyKCk7Ci0JCX0KLQkJZGVlcENvcHlUb09yaWdpbmFsTWFwLmNsZWFyKCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldENvcHlFeHRlcm5hbFZhcmlhdGlvbnMoYm9vbGVhbiBjb3B5RXh0ZXJuYWxWYXJpYXRpb25zKSB7Ci0JCXRoaXMuY29weUV4dGVybmFsVmFyaWF0aW9ucyA9IGNvcHlFeHRlcm5hbFZhcmlhdGlvbnM7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGNvcHkoQWN0aXZpdHkgYWN0aXZpdHkpIHsKLQkJcHJvY1BhY2thZ2VzLmFkZCgoUHJvY2Vzc1BhY2thZ2UpIGFjdGl2aXR5LmVDb250YWluZXIoKSk7Ci0JfQotCQotCXB1YmxpYyBNZXRob2RDb25maWd1cmF0aW9uIGdldERlZXBDb3B5Q29uZmlnKCkgewotCQlyZXR1cm4gZGVlcENvcHlDb25maWc7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RGVlcENvcHlDb25maWcoTWV0aG9kQ29uZmlndXJhdGlvbiBkZWVwQ29weUNvbmZpZykgewotCQl0aGlzLmRlZXBDb3B5Q29uZmlnID0gZGVlcENvcHlDb25maWc7Ci0JfQotCQotCXB1YmxpYyBQcm9jZXNzIGdldFRhcmdldFByb2Nlc3MoKSB7Ci0JCXJldHVybiB0YXJnZXRQcm9jZXNzOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFRhcmdldFByb2Nlc3Mob3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzIHByb2MpIHsKLQkJdGFyZ2V0UHJvY2VzcyA9IHByb2M7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldE1vbml0b3IoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCXRoaXMubW9uaXRvciA9IG1vbml0b3I7Ci0JfQotCi0JcHVibGljIExpc3QgZ2V0RGVlcENvcGllcygpIHsKLQkJcmV0dXJuIGRlZXBDb3BpZXM7Ci0JfQotCi0JcHVibGljIHZvaWQgZGVlcENvcHkoT2JqZWN0IGFjdGl2aXR5T3JXcmFwcGVyKSB7Ci0JCU9iamVjdCB1bndyYXBwZWQgPSBUbmdVdGlsLnVud3JhcChhY3Rpdml0eU9yV3JhcHBlcik7Ci0JCWlmKHVud3JhcHBlZCBpbnN0YW5jZW9mIEFjdGl2aXR5ICYmICgoQWN0aXZpdHkpdW53cmFwcGVkKS5lQ29udGFpbmVyKCkgIT0gbnVsbCkgewotCQkJYWN0aXZpdGllc1RvRGVlcENvcHkuYWRkKGFjdGl2aXR5T3JXcmFwcGVyKTsKLQkJfQotCX0JCi0JCi0JcHVibGljIHZvaWQgZXh0ZW5kKEFjdGl2aXR5IGFjdCkgewotCQlBY3Rpdml0eSBleHRlbmRlZEFjdCA9IFByb2Nlc3NVdGlsLmdlbmVyYWxpemUoYWN0LAotCQkJCVZhcmlhYmlsaXR5VHlwZS5FWFRFTkRTKTsKLQkJYWN0aXZpdGllcy5hZGQoZXh0ZW5kZWRBY3QpOwotCX0KLQkKLQlwdWJsaWMgTGlzdDxBY3Rpdml0eT4gZ2V0QWN0aXZpdGllcygpIHsKLQkJaWYgKCFwcm9jUGFja2FnZXMuaXNFbXB0eSgpIHx8ICFhY3Rpdml0aWVzVG9EZWVwQ29weS5pc0VtcHR5KCkpIHsKLQkJCWVkaXRpbmdEb21haW4gPSBuZXcgVHJhY2VhYmxlQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluKAotCQkJCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRS5nZXRXQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQluZXcgQmFzaWNDb21tYW5kU3RhY2soKSk7Ci0JCQlpZighcHJvY1BhY2thZ2VzLmlzRW1wdHkoKSkgewotCQkJCWFjdGl2aXRpZXMuYWRkQWxsKGNvcHkocHJvY1BhY2thZ2VzKSk7Ci0JCQl9Ci0JCQlpZighYWN0aXZpdGllc1RvRGVlcENvcHkuaXNFbXB0eSgpKSB7Ci0JCQkJCWlmIChtb25pdG9yID09IG51bGwpIHsKLQkJCQkJbW9uaXRvciA9IG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCk7Ci0JCQkJfQotCQkJCWZvciAoT2JqZWN0IGFjdCA6IGFjdGl2aXRpZXNUb0RlZXBDb3B5KSB7Ci0JCQkJCUFjdGl2aXR5RGVlcENvcHlDb21tYW5kIGNtZCA9IG5ldyBBY3Rpdml0eURlZXBDb3B5Q29tbWFuZCgKLQkJCQkJCQlhY3QsIGdldERlZXBDb3B5SGVscGVyKCksIGRlZXBDb3B5Q29uZmlnLCB0YXJnZXRQcm9jZXNzLCBtb25pdG9yLGFjdGl2aXR5RGVlcENvcHlDb25maWd1cmF0b3IpOwotCQkJCQljbWQuc2V0Q29weUV4dGVybmFsVmFyaWF0aW9ucyhjb3B5RXh0ZXJuYWxWYXJpYXRpb25zKTsKLQkJCQkJdHJ5IHsKLQkJCQkJCWxvbmcgdGltZSA9IDA7Ci0JCQkJCQlpZiAoVG5nVXRpbC5ERUJVRykgewotCQkJCQkJCXRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCQkJCX0KLQkJCQkJCWNtZC5leGVjdXRlKCk7Ci0JCQkJCQlpZiAoVG5nVXRpbC5ERUJVRykgewotCQkJCQkJCVN5c3RlbS5vdXQKLQkJCQkJCQkJCS5wcmludGxuKCJBY3Rpdml0eURlZXBDb3B5Q29tbWFuZCBleGVjdXRlZDogIiAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQkJCSsgKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gdGltZSkKLQkJCQkJCQkJCQkJKyAiIG1zIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQl0aW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCQkJCQl9Ci0JCQkJCQlDb2xsZWN0aW9uPD8+IHJlc3VsdCA9IGNtZC5nZXRSZXN1bHQoKTsKLQkJCQkJCWlmICghcmVzdWx0LmlzRW1wdHkoKSkgewotCQkJCQkJCUFjdGl2aXR5IGRlZXBDb3B5ID0gKEFjdGl2aXR5KSByZXN1bHQuaXRlcmF0b3IoKQotCQkJCQkJCQkJLm5leHQoKTsKLQkJCQkJCQlQcm9jZXNzVXRpbAotCQkJCQkJCQkJLmZpeEJyZWFrZG9ud0VsZW1lbnRPcmRlclJlY3Vyc2l2ZWx5KGRlZXBDb3B5KTsKLQkJCQkJCQlpZiAoVG5nVXRpbC5ERUJVRykgewotCQkJCQkJCQlTeXN0ZW0ub3V0Ci0JCQkJCQkJCQkJLnByaW50bG4oIlByb2Nlc3NVdGlsLmZpeEJyZWFrZG9ud0VsZW1lbnRPcmRlclJlY3Vyc2l2ZWx5KCk6ICIgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJCQkJKyAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSB0aW1lKQotCQkJCQkJCQkJCQkJKyAiIG1zIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJdGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQkJCQkJCX0KLQkJCQkJCQljbWQuY29weVN1cHByZXNzaW9uU3RhdGVzKCk7Ci0JCQkJCQkJaWYgKFRuZ1V0aWwuREVCVUcpIHsKLQkJCQkJCQkJU3lzdGVtLm91dAotCQkJCQkJCQkJCS5wcmludGxuKCJBY3Rpdml0eURlZXBDb3B5Q29tbWFuZC5jb3B5U3VwcHJlc3Npb25TdGF0ZXMoKTogIiAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQkJCQkrIChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHRpbWUpCi0JCQkJCQkJCQkJCQkrICIgbXMiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQl0aW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCQkJCQkJfQotCQkJCQkJCWRlZXBDb3BpZXMuYWRkKGRlZXBDb3B5KTsKLQkJCQkJCQlkZWVwQ29weVRvT3JpZ2luYWxNYXAucHV0KGRlZXBDb3B5LCBhY3QpOwotCQkJCQkJfQotCQkJCQl9IGZpbmFsbHkgewotCQkJCQkJY21kLmRpc3Bvc2UoKTsKLQkJCQkJfQotCQkJCX0KLQotCQkJCWFjdGl2aXRpZXMuYWRkQWxsKGRlZXBDb3BpZXMpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGFjdGl2aXRpZXM7Ci0JfQotCQotCXByaXZhdGUgdm9pZCB1cGRhdGVQcmVkZWNlc3NvcnMoTGlzdCB3b3JrQnJlYWtkb3duRWxlbWVudHMpIHsKLQkJLy8gZ2V0IHRoZSBwcmVkZXNzb3IgbGlzdHMgb2Ygb3JpZ2luYWwgd29yayBicmVha2Rvd24gZWxlbWVudHMKLQkJLy8KLQkJTGlzdCBwcmVkZWNlc3Nvckxpc3RzID0gbmV3IEFycmF5TGlzdCgpOwkJCi0JCU9iamVjdCBvcmlnaW5hbCA9IGNvcHlUb09yaWdpbmFsLmdldCh3b3JrQnJlYWtkb3duRWxlbWVudHMuZ2V0KDApKTsKLQkJQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkgPSBlZGl0aW5nRG9tYWluLmdldEFkYXB0ZXJGYWN0b3J5KCk7Ci0JCUlCU0l0ZW1Qcm92aWRlciBic0l0ZW1Qcm92aWRlciA9IChJQlNJdGVtUHJvdmlkZXIpIGFkYXB0ZXJGYWN0b3J5LmFkYXB0KG9yaWdpbmFsLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQlpbnQgZmlyc3RJRCA9IGJzSXRlbVByb3ZpZGVyLmdldElkKCk7IAotCQlwcmVkZWNlc3Nvckxpc3RzLmFkZChic0l0ZW1Qcm92aWRlci5nZXRQcmVkZWNlc3NvcnMoKSk7Ci0JCS8vIEl0ZW0gcHJvdmlkZXIgb2YgbGFzdCB3b3JrIGJyZWFrZG93biBlbGVtZW50IGluIHRoZSBzdWJ0cmVlIHdob3NlIHJvb3QgaXMgb3JpZ2luYWwgYWN0aXZpdHkKLQkJSUJTSXRlbVByb3ZpZGVyIGxhc3RXQklwID0gbnVsbDsKLQkJZm9yKEl0ZXJhdG9yIGl0ZXIgPSBuZXcgQWRhcHRlckZhY3RvcnlUcmVlSXRlcmF0b3IoYWRhcHRlckZhY3RvcnksIG9yaWdpbmFsLCBmYWxzZSk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IG9iaiA9IGl0ZXIubmV4dCgpOwotCQkJT2JqZWN0IGUgPSBUbmdVdGlsLnVud3JhcChvYmopOwotCQkJaWYoZSBpbnN0YW5jZW9mIFdvcmtCcmVha2Rvd25FbGVtZW50KSB7Ci0JCQkJSUJTSXRlbVByb3ZpZGVyIGJzSXAgPSBudWxsOwotCQkJCWlmKG9iaiBpbnN0YW5jZW9mIElCU0l0ZW1Qcm92aWRlcikgewotCQkJCQlic0lwID0gKChJQlNJdGVtUHJvdmlkZXIpb2JqKTsKLQkJCQkJcHJlZGVjZXNzb3JMaXN0cy5hZGQoYnNJcC5nZXRQcmVkZWNlc3NvcnMoKSk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlPYmplY3QgaXAgPSBhZGFwdGVyRmFjdG9yeS5hZGFwdChvYmosIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCQkJCWlmKGlwIGluc3RhbmNlb2YgSUJTSXRlbVByb3ZpZGVyKSB7Ci0JCQkJCQlic0lwID0gKChJQlNJdGVtUHJvdmlkZXIpaXApOwotCQkJCQkJcHJlZGVjZXNzb3JMaXN0cy5hZGQoYnNJcC5nZXRQcmVkZWNlc3NvcnMoKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYoYnNJcCAhPSBudWxsKSB7Ci0JCQkJCWxhc3RXQklwID0gYnNJcDsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaW50IGxhc3RJRCA9IGxhc3RXQklwICE9IG51bGwgPyBsYXN0V0JJcC5nZXRJZCgpIDogZmlyc3RJRDsKLQkJCi0JCS8vIHVwZGF0ZSBwcmVkZWNlc3NvcnMKLQkJLy8KLQkJaW50IHNpemUgPSB3b3JrQnJlYWtkb3duRWxlbWVudHMuc2l6ZSgpOwotCQlBc3NlcnQuaXNUcnVlKHNpemUgPT0gcHJlZGVjZXNzb3JMaXN0cy5zaXplKCkpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJV29ya0JyZWFrZG93bkVsZW1lbnQgZSA9IChXb3JrQnJlYWtkb3duRWxlbWVudCkgd29ya0JyZWFrZG93bkVsZW1lbnRzLmdldChpKTsKLQkJCWUuZ2V0TGlua1RvUHJlZGVjZXNzb3IoKS5jbGVhcigpOwotCQkJUHJlZGVjZXNzb3JMaXN0IHByZWRMaXN0ID0gKFByZWRlY2Vzc29yTGlzdCkgcHJlZGVjZXNzb3JMaXN0cy5nZXQoaSk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gcHJlZExpc3QuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJCWJzSXRlbVByb3ZpZGVyID0gKElCU0l0ZW1Qcm92aWRlcikgaXRlcmF0b3IubmV4dCgpOwotCQkJCWludCBpZCA9IGJzSXRlbVByb3ZpZGVyLmdldElkKCk7Ci0JCQkJaWYoaWQgPj0gZmlyc3RJRCAmJiBpZCA8PSBsYXN0SUQpIHsKLQkJCQkJV29ya0JyZWFrZG93bkVsZW1lbnQgcHJlZCA9IChXb3JrQnJlYWtkb3duRWxlbWVudCkgd29ya0JyZWFrZG93bkVsZW1lbnRzLmdldChpZCAtIGZpcnN0SUQpOwotCQkJCQllLmdldExpbmtUb1ByZWRlY2Vzc29yKCkuYWRkKFVtYVV0aWwuY3JlYXRlRGVmYXVsdFdvcmtPcmRlcihlLCBwcmVkKSk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQkvLyBwcmVkZWNlc3NvciBpcyBvdXRzaWRlIG9mIHRoZSBzdWJ0cmVlLCBkb24ndCBzZWxlY3QgaXQgZm9yIG5vdwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkKLQlwcml2YXRlIENvbGxlY3Rpb248Pz4gY29weVByb2Nlc3NQYWNrYWdlcyhDb2xsZWN0aW9uPFByb2Nlc3NQYWNrYWdlPiBwcm9jUGFja2FnZXMpIHsKLQkJQ29tbWFuZCBjb21tYW5kID0gY3JlYXRlQ29weUNvbW1hbmQoZWRpdGluZ0RvbWFpbiwgcHJvY1BhY2thZ2VzKTsKLQkJaWYoY29tbWFuZCAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCWNvbW1hbmQuZXhlY3V0ZSgpOwotCQkJCXJldHVybiBjb21tYW5kLmdldFJlc3VsdCgpOwotCQkJfSBmaW5hbGx5IHsJCQkKLQkJCQljb21tYW5kLmRpc3Bvc2UoKTsJCQkKLQkJCX0KLQkJfQotCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQl9Ci0JCQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhIGNvbW1hbmQgdGhhdCBjb3BpZXMgdGhlIGdpdmVuIGNvbGxlY3Rpb24gb2Ygb2JqZWN0cy4gSWYgdGhlIGNvbGxlY3Rpb24gY29udGFpbnMgbW9yZSB0aGFuIG9uZSBvYmplY3QsCi0JICogdGhlbiBhIGNvbXBvdW5kIGNvbW1hbmQgd2lsbCBiZSBjcmVhdGVkIGNvbnRhaW5pbmcgaW5kaXZpZHVhbCBjb3B5IGNvbW1hbmRzIGZvciBlYWNoIG9iamVjdC4KLQkgKi8KLQlwcml2YXRlIENvbW1hbmQgY3JlYXRlQ29weUNvbW1hbmQoZmluYWwgRWRpdGluZ0RvbWFpbiBkb21haW4sIGZpbmFsIENvbGxlY3Rpb24gY29sbGVjdGlvbikKLQl7Ci0JCWlmIChjb2xsZWN0aW9uID09IG51bGwgfHwgY29sbGVjdGlvbi5pc0VtcHR5KCkpIAotCQl7Ci0JCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJfQotCi0JCUNvbXBvdW5kQ29tbWFuZCBjb3B5Q29tbWFuZCA9IG5ldyBDb21wb3VuZENvbW1hbmQoQ29tcG91bmRDb21tYW5kLk1FUkdFX0NPTU1BTkRfQUxMKTsKLQkJZm9yIChJdGVyYXRvciBvYmplY3RzID0gY29sbGVjdGlvbi5pdGVyYXRvcigpOyBvYmplY3RzLmhhc05leHQoKTsgKQotCQl7Ci0JCQljb3B5Q29tbWFuZC5hcHBlbmQoZG9tYWluLmNyZWF0ZUNvbW1hbmQoQ29weUNvbW1hbmQuY2xhc3MsIG5ldyBDb21tYW5kUGFyYW1ldGVyKG9iamVjdHMubmV4dCgpLCBudWxsLCBjb3B5SGVscGVyKSkpOwotCQl9Ci0KLQkJcmV0dXJuIGNvcHlDb21tYW5kLnVud3JhcCgpOwotCX0KLQotCQotCS8qKgotCSAqIENvcGllcyB0aGUgZ2l2ZW4gcHJvY2VzcyBwYWNrYWdlcwotCSAqIAotCSAqIEBwYXJhbSBlZGl0aW5nRG9tYWluCi0JICogQHBhcmFtIHByb2NQYWNrYWdlcwotCSAqIEByZXR1cm4gYWN0aXZpdGllcyBvZiB0aGUgY29waWVzCi0JICovCi0JcHJpdmF0ZSBMaXN0PEFjdGl2aXR5PiBjb3B5KExpc3Q8UHJvY2Vzc1BhY2thZ2U+IHByb2NQYWNrYWdlcykgewotCQlDb2xsZWN0aW9uPD8+IGNvcHlQYWNrYWdlcyA9IGNvcHlQcm9jZXNzUGFja2FnZXMocHJvY1BhY2thZ2VzKTsKLQkJQXJyYXlMaXN0PEFjdGl2aXR5PiBhY3Rpdml0aWVzID0gbmV3IEFycmF5TGlzdDxBY3Rpdml0eT4oKTsKLQkJZm9yIChJdGVyYXRvcjw/PiBpdGVyID0gY29weVBhY2thZ2VzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJUHJvY2Vzc1BhY2thZ2UgY29weSA9IChQcm9jZXNzUGFja2FnZSkgaXRlci5uZXh0KCk7Ci0JCQlpZiAoY29weSBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpIHsKLQkJCQlBY3Rpdml0eSBhY3RDb3B5ID0gKChQcm9jZXNzQ29tcG9uZW50KSBjb3B5KQotCQkJCS5nZXRQcm9jZXNzKCk7Ci0JCQkJLy8gY29weSBkYXRhIGZyb20gUHJvY2Vzc0NvbXBvbmVudCB0byBhIG5ldwotCQkJCS8vIFByb2Nlc3NQYWNrYWdlCi0JCQkJUHJvY2Vzc1BhY2thZ2UgcGtnQ29weSA9IFVtYUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJLmNyZWF0ZVByb2Nlc3NQYWNrYWdlKCk7Ci0JCQkJcGtnQ29weS5zZXROYW1lKGFjdENvcHkuZ2V0TmFtZSgpKTsKLQkJCQlwa2dDb3B5LmdldFByb2Nlc3NFbGVtZW50cygpLmFkZChhY3RDb3B5KTsKLQkJCQlwa2dDb3B5LmdldFByb2Nlc3NFbGVtZW50cygpLmFkZEFsbCgKLQkJCQkJCWNvcHkuZ2V0UHJvY2Vzc0VsZW1lbnRzKCkpOwotCQkJCXBrZ0NvcHkuZ2V0RGlhZ3JhbXMoKS5hZGRBbGwoY29weS5nZXREaWFncmFtcygpKTsKLQkJCQlwa2dDb3B5LmdldENoaWxkUGFja2FnZXMoKS5hZGRBbGwoCi0JCQkJCQljb3B5LmdldENoaWxkUGFja2FnZXMoKSk7Ci0JCQkJCi0JCQkJYWN0aXZpdGllcy5hZGQoYWN0Q29weSk7Ci0JCQl9IGVsc2UgewotCQkJCWFjdGl2aXRpZXMuYWRkKFByb2Nlc3NVdGlsLmZpbmRBY3Rpdml0eShjb3B5KSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGFjdGl2aXRpZXM7Ci0JfQotCi0JcHVibGljIE1hcCBnZXREZWVwQ29weVRvT3JpZ2luYWxNYXAoKSB7Ci0JCXJldHVybiBkZWVwQ29weVRvT3JpZ2luYWxNYXA7Ci0JfQotCQotCXB1YmxpYyBIZWxwZXIgZ2V0Q29weUhlbHBlcigpewotCQlyZXR1cm4gY29weUhlbHBlcjsKLQl9Ci0JCi0JcHVibGljIENvcHlIZWxwZXIgZ2V0RGVlcENvcHlIZWxwZXIoKSB7Ci0JCWlmKGRlZXBDb3B5SGVscGVyID09IG51bGwpIHsKLQkJCWRlZXBDb3B5SGVscGVyID0gbmV3IENvcHlIZWxwZXIoKTsKLQkJfQotCQlyZXR1cm4gZGVlcENvcHlIZWxwZXI7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0QWN0aXZpdHlEZWVwQ29weUNvbmZpZ3VyYXRvcigKLQkJCUlDb25maWd1cmF0b3IgYWN0aXZpdHlEZWVwQ29weUNvbmZpZ3VyYXRvcikgewotCQl0aGlzLmFjdGl2aXR5RGVlcENvcHlDb25maWd1cmF0b3IgPSBhY3Rpdml0eURlZXBDb3B5Q29uZmlndXJhdG9yOwotCX0KLQkKLQkKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9BY3Rpdml0eVRyZWVJdGVyYXRvci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL0FjdGl2aXR5VHJlZUl0ZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzZDkxYzAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL0FjdGl2aXR5VHJlZUl0ZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkFic3RyYWN0VHJlZUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci0KLS8qKgotICogSW50ZXJhdG9yIHVzZWQgdG8gaXRlcmF0ZSB0aGUgYnJlYWtkb3duIGVsZW1lbnQgdHJlZSBvZiBhbiBhY3Rpdml0eQotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZpdHlUcmVlSXRlcmF0b3IgZXh0ZW5kcyBBYnN0cmFjdFRyZWVJdGVyYXRvciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA2NDAyMDE3NzY4MjA1NjQyMDY4TDsKLQotCXB1YmxpYyBBY3Rpdml0eVRyZWVJdGVyYXRvcihBY3Rpdml0eSBhY3QpIHsKLQkJc3VwZXIoYWN0LCBmYWxzZSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQWJzdHJhY3RUcmVlSXRlcmF0b3IjZ2V0Q2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgSXRlcmF0b3IgZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCXJldHVybiAoKEFjdGl2aXR5KSBvYmplY3QpLmdldEJyZWFrZG93bkVsZW1lbnRzKCkuaXRlcmF0b3IoKTsKLQkJfQotCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVC5pdGVyYXRvcigpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL0FkYXB0ZXJGYWN0b3J5SXRlbUxhYmVsUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9BZGFwdGVyRmFjdG9yeUl0ZW1MYWJlbFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyYjkyMWMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL0FkYXB0ZXJGYWN0b3J5SXRlbUxhYmVsUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuNQotICoKLSAqLwotcHVibGljIGNsYXNzIEFkYXB0ZXJGYWN0b3J5SXRlbUxhYmVsUHJvdmlkZXIgZXh0ZW5kcyBJdGVtTGFiZWxQcm92aWRlciB7Ci0JcHJpdmF0ZSBBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeTsKLQotCXB1YmxpYyBBZGFwdGVyRmFjdG9yeUl0ZW1MYWJlbFByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuYWRhcHRlckZhY3RvcnkgPSBhZGFwdGVyRmFjdG9yeTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JICAgIC8vIEdldCB0aGUgYWRhcHRlciBmcm9tIHRoZSBmYWN0b3J5LgotCQkvLwotCQlJSXRlbUxhYmVsUHJvdmlkZXIgaXRlbUxhYmVsUHJvdmlkZXIgPSAoSUl0ZW1MYWJlbFByb3ZpZGVyKSBhZGFwdGVyRmFjdG9yeQotCQkJCS5hZGFwdChvYmplY3QsIElJdGVtTGFiZWxQcm92aWRlci5jbGFzcyk7Ci0KLQkJcmV0dXJuIGl0ZW1MYWJlbFByb3ZpZGVyICE9IG51bGwgPyBpdGVtTGFiZWxQcm92aWRlci5nZXRJbWFnZShvYmplY3QpCi0JCQkJOiBzdXBlci5nZXRJbWFnZShvYmplY3QpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCSAgICAvLyBHZXQgdGhlIGFkYXB0ZXIgZnJvbSB0aGUgZmFjdG9yeS4KLQkJLy8KLQkJSUl0ZW1MYWJlbFByb3ZpZGVyIGl0ZW1MYWJlbFByb3ZpZGVyID0gKElJdGVtTGFiZWxQcm92aWRlcikgYWRhcHRlckZhY3RvcnkKLQkJCQkuYWRhcHQob2JqZWN0LCBJSXRlbUxhYmVsUHJvdmlkZXIuY2xhc3MpOwotCi0JCXJldHVybiBpdGVtTGFiZWxQcm92aWRlciAhPSBudWxsID8gaXRlbUxhYmVsUHJvdmlkZXIuZ2V0VGV4dChvYmplY3QpCi0JCQkJOiBzdXBlci5nZXRUZXh0KG9iamVjdCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL0NhdGVnb3J5U29ydEhlbHBlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL0NhdGVnb3J5U29ydEhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZWI1ODIxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9DYXRlZ29yeVNvcnRIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuUHJlc2VudGF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwubW9kZWwuT3JkZXJJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudENhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ3VzdG9tQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaXNjaXBsaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnRQcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Ub29sOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdFR5cGU7Ci0KLS8qKgotICogSGVscGVyIGNsYXNzIHRvIGhhbmRsZSBzb3J0aW5nIG9mIENhdGVnb3J5IGVsZW1lbnRzCi0gKiBAYXV0aG9yIEplZmYgSGFyZHkKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBDYXRlZ29yeVNvcnRIZWxwZXIgewotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9DQVRFR09SWV9FTEVNRU5UU19fU09SVF9UWVBFID0gIkNhdGVnb3J5RWxlbWVudHNTb3J0VHlwZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWX0NBVEVHT1JZX0VMRU1FTlRTX19TT1JUX1RZUEVfQUxQSEEgPSAiQWxwaGFiZXRpYyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWX0NBVEVHT1JZX0VMRU1FTlRTX19TT1JUX1RZUEVfUkVWRVJTRV9BTFBIQSA9ICJSZXZlcnNlQWxwaGFiZXRpYyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWX0NBVEVHT1JZX0VMRU1FTlRTX19TT1JUX1RZUEVfTUVUSE9EX1RZUEUgPSAiTWV0aG9kVHlwZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWX0NBVEVHT1JZX0VMRU1FTlRTX19TT1JUX1RZUEVfTUFOVUFMID0gIk1hbnVhbCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgTWV0aG9kRWxlbWVudFByb3BlcnR5IHRvIHN0b3JlIHRoZSBDYXRlZ29yeSBzb3J0IHR5cGUKLQkgKiBAcGFyYW0gc29ydFR5cGUKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBNZXRob2RFbGVtZW50UHJvcGVydHkgY3JlYXRlTmV3U29ydFByb3BlcnR5KFN0cmluZyBzb3J0VHlwZSkgewotCQlNZXRob2RFbGVtZW50UHJvcGVydHkgcHJvcCA9IFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZU1ldGhvZEVsZW1lbnRQcm9wZXJ0eSgpOwotCQlwcm9wLnNldE5hbWUoS0VZX0NBVEVHT1JZX0VMRU1FTlRTX19TT1JUX1RZUEUpOwotCQlpZiAoc29ydFR5cGUgIT0gbnVsbCkgewotCQkJcHJvcC5zZXRWYWx1ZShzb3J0VHlwZSk7Ci0JCX0KLQkJcmV0dXJuIHByb3A7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiBjYXRlZ29yeSBzb3J0IHByb3BlcnR5IGZvciBtZXRob2QgZWxlbWVudAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogQHJldHVybgotCSAqIAkJIHByb3BlcnR5IGlmIGZvdW5kLCBlbHNlIG51bGwKLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1ldGhvZEVsZW1lbnRQcm9wZXJ0eSBnZXRDYXRlZ29yeVNvcnRQcm9wZXJ0eShNZXRob2RFbGVtZW50IGVsZW1lbnQpIHsKLQkJTGlzdCBwcm9wcyA9IGVsZW1lbnQuZ2V0TWV0aG9kRWxlbWVudFByb3BlcnR5KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSBwcm9wcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlNZXRob2RFbGVtZW50UHJvcGVydHkgcHJvcCA9IChNZXRob2RFbGVtZW50UHJvcGVydHkpIGl0Lm5leHQoKTsKLQkJCWlmIChLRVlfQ0FURUdPUllfRUxFTUVOVFNfX1NPUlRfVFlQRS5lcXVhbHMocHJvcC5nZXROYW1lKCkpKSB7Ci0JCQkJcmV0dXJuIHByb3A7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qKgotCSAqIHJldHVybiB0cnVlIGlmZiB0aGUgY2F0ZWdvcnkgc29ydC10eXBlIGlzIHNldCB0byBtYW51YWwKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqIEByZXR1cm4KLQkgKiAJCSBwcm9wZXJ0eSBpZiBmb3VuZCwgZWxzZSBudWxsCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzTWFudWFsQ2F0ZWdvcnlTb3J0KE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgewotCQlTdHJpbmcgc29ydFR5cGUgPSBnZXRDYXRlZ29yeVNvcnRWYWx1ZShlbGVtZW50KTsKLQkJaWYgKFZfQ0FURUdPUllfRUxFTUVOVFNfX1NPUlRfVFlQRV9NQU5VQUwuZXF1YWxzKHNvcnRUeXBlKSkKLQkJCXJldHVybiB0cnVlOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc29ydC10eXBlIGZvciB0aGUgZ2l2ZW4gTWV0aG9kRWxlbWVudC4KLQkgKiBJZiBub25lIGlzIHNldCwgd2lsbCByZXR1cm4gQWxwaGFiZXRpYyBzb3J0IChWX0NBVEVHT1JZX0VMRU1FTlRTX19TT1JUX1RZUEVfQUxQSEEpIGFzIGEgZGVmYXVsdAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldENhdGVnb3J5U29ydFZhbHVlKE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgewotCQlNZXRob2RFbGVtZW50UHJvcGVydHkgcHJvcCA9IGdldENhdGVnb3J5U29ydFByb3BlcnR5KGVsZW1lbnQpOwotCQlpZiAocHJvcCA9PSBudWxsKQotCQkJcmV0dXJuIFZfQ0FURUdPUllfRUxFTUVOVFNfX1NPUlRfVFlQRV9NQU5VQUw7Ci0JCXJldHVybiBwcm9wLmdldFZhbHVlKCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBMaXN0PFN0cmluZz4gZ2V0Q2F0ZWdvcnlTb3J0VHlwZXMoKSB7Ci0JCUxpc3Q8U3RyaW5nPiByZXR1cm5MaXN0ID0gQXJyYXlzLjxTdHJpbmc+YXNMaXN0KAotCQkJCVZfQ0FURUdPUllfRUxFTUVOVFNfX1NPUlRfVFlQRV9NQU5VQUwsCi0JCQkJVl9DQVRFR09SWV9FTEVNRU5UU19fU09SVF9UWVBFX0FMUEhBLAotCQkJCVZfQ0FURUdPUllfRUxFTUVOVFNfX1NPUlRfVFlQRV9SRVZFUlNFX0FMUEhBLAotCQkJCVZfQ0FURUdPUllfRUxFTUVOVFNfX1NPUlRfVFlQRV9NRVRIT0RfVFlQRSk7Ci0JCXJldHVybiByZXR1cm5MaXN0OwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFNvcnRUeXBlRGlzcGxheU5hbWUoU3RyaW5nIHNvcnRUeXBlKSB7Ci0JCWlmIChWX0NBVEVHT1JZX0VMRU1FTlRTX19TT1JUX1RZUEVfQUxQSEEuZXF1YWxzKHNvcnRUeXBlKSkgewotCQkJcmV0dXJuIExpYnJhcnlFZGl0UmVzb3VyY2VzLlNvcnRUeXBlX0FscGhhYmV0aWM7Ci0JCX0KLQkJaWYgKFZfQ0FURUdPUllfRUxFTUVOVFNfX1NPUlRfVFlQRV9SRVZFUlNFX0FMUEhBLmVxdWFscyhzb3J0VHlwZSkpIHsKLQkJCXJldHVybiBMaWJyYXJ5RWRpdFJlc291cmNlcy5Tb3J0VHlwZV9SZXZlcnNlQWxwaGFiZXRpYzsKLQkJfQotCQlpZiAoVl9DQVRFR09SWV9FTEVNRU5UU19fU09SVF9UWVBFX01FVEhPRF9UWVBFLmVxdWFscyhzb3J0VHlwZSkpIHsKLQkJCXJldHVybiBMaWJyYXJ5RWRpdFJlc291cmNlcy5Tb3J0VHlwZV9NZXRob2RUeXBlOwotCQl9Ci0JCWlmIChWX0NBVEVHT1JZX0VMRU1FTlRTX19TT1JUX1RZUEVfTUFOVUFMLmVxdWFscyhzb3J0VHlwZSkpIHsKLQkJCXJldHVybiBMaWJyYXJ5RWRpdFJlc291cmNlcy5Tb3J0VHlwZV9NYW51YWw7Ci0JCX0KLQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JfQotCQotCS8qKgotCSAqIFJldHVybnMgYSBzb3J0ZWQgY2F0ZWdvcnkgZWxlbWVudCBsaXN0IGJhc2VkIG9uIHRoZSBjYXRlZ29yeSdzIHNvcnQgdHlwZQotCSAqIFJlc3BlY3RzIHRoZSBOYW1lL1ByZXNOYW1lIHRvZ2dsZQotCSAqIEBwYXJhbSBlbGVtZW50IAotCSAqIEBwYXJhbSBlbGVtZW50cyBhcnJheSB0byBzb3J0Ci0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdDxPYmplY3Q+IHNvcnRDYXRlZ29yeUVsZW1lbnRzKE1ldGhvZEVsZW1lbnQgZWxlbWVudCwgT2JqZWN0W10gZWxlbWVudHMpIHsKLQkJcmV0dXJuIHNvcnRDYXRlZ29yeUVsZW1lbnRzKGVsZW1lbnQsIGVsZW1lbnRzLCBmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIHNvcnRlZCBjYXRlZ29yeSBlbGVtZW50IGxpc3QgYmFzZWQgb24gdGhlIGNhdGVnb3J5J3Mgc29ydCB0eXBlCi0JICogQHBhcmFtIGVsZW1lbnQgCi0JICogQHBhcmFtIGVsZW1lbnRzIGFycmF5IHRvIHNvcnQKLQkgKiBAcGFyYW0gZm9yY2VQcmVzTmFtZVNvcnQgdHJ1ZSB0byBhbHdheXMgc29ydCBieSBwcmVzTmFtZS4gZmFsc2Ugd2lsbCByZXNwZWN0IHRoZSB0b2dnbGUKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0PE9iamVjdD4gc29ydENhdGVnb3J5RWxlbWVudHMoTWV0aG9kRWxlbWVudCBlbGVtZW50LCBPYmplY3RbXSBlbGVtZW50cywgYm9vbGVhbiBmb3JjZVByZXNOYW1lU29ydCkgewotCQkvKgotCQkgKiBUT0RPOiBjYW4ndCB1c2UgZ2VuZXJpY3MgaGVyZSBiZWNhdXNlIEVNRiBkb2Vzbid0IHVzZSB0aGVtIHlldCAtIHRoZSBlbGVtZW50cyBwYXJhbQotCQkgKiB1c3VhbGx5IGNvbWVzIGZyb20gQ29udGVudEVsZW1lbnRzT3JkZXJMaXN0IGNsYXNzIHdoaWNoIGV4dGVuZHMgRU1GJ3MgQmFzaWNFTGlzdCBhbmQgc28KLQkJICogdGhlIHRvQXJyYXkoKSBtZXRob2Qgd2lsbCBvbmx5IHJldHVybiBPYmplY3RbXQotCQkgKi8KLQkJTGlzdDxPYmplY3Q+IHJldHVybkxpc3QgPSBuZXcgQXJyYXlMaXN0PE9iamVjdD4oQXJyYXlzLjxPYmplY3Q+YXNMaXN0KGVsZW1lbnRzKSk7Ci0JCVN0cmluZyBzb3J0VHlwZSA9IGdldENhdGVnb3J5U29ydFZhbHVlKGVsZW1lbnQpOwotCQlpZiAoVl9DQVRFR09SWV9FTEVNRU5UU19fU09SVF9UWVBFX01BTlVBTC5lcXVhbHMoc29ydFR5cGUpKSB7Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIENvbnRlbnRDYXRlZ29yeSkgewotCQkJCXJldHVybiBmaW5kTWFudWFsU29ydE9yZGVySW5Db250cmlidXRvcnMoKENvbnRlbnRDYXRlZ29yeSllbGVtZW50LCByZXR1cm5MaXN0KTsKLQkJCX0KLQkJCXJldHVybiByZXR1cm5MaXN0OwotCQl9IGVsc2UgaWYgKFZfQ0FURUdPUllfRUxFTUVOVFNfX1NPUlRfVFlQRV9BTFBIQS5lcXVhbHMoc29ydFR5cGUpKSB7Ci0JCQlDb21wYXJhdG9yIGNvbXBhcmF0b3IgPSBQcmVzZW50YXRpb25Db250ZXh0LklOU1RBTkNFLmdldENvbXBhcmF0b3IoKTsKLQkJCWlmIChmb3JjZVByZXNOYW1lU29ydCkKLQkJCQljb21wYXJhdG9yID0gUHJlc2VudGF0aW9uQ29udGV4dC5JTlNUQU5DRS5nZXRQcmVzTmFtZUNvbXBhcmF0b3IoKTsKLQkJCUNvbGxlY3Rpb25zLjxPYmplY3Q+c29ydChyZXR1cm5MaXN0LCBjb21wYXJhdG9yKTsKLQkJfSBlbHNlIGlmIChWX0NBVEVHT1JZX0VMRU1FTlRTX19TT1JUX1RZUEVfUkVWRVJTRV9BTFBIQS5lcXVhbHMoc29ydFR5cGUpKSB7Ci0JCQlDb21wYXJhdG9yIGNvbXBhcmF0b3IgPSBQcmVzZW50YXRpb25Db250ZXh0LklOU1RBTkNFLmdldFJldmVyc2VDb21wYXJhdG9yKCk7Ci0JCQlpZiAoZm9yY2VQcmVzTmFtZVNvcnQpCi0JCQkJY29tcGFyYXRvciA9IFByZXNlbnRhdGlvbkNvbnRleHQuSU5TVEFOQ0UuZ2V0UHJlc05hbWVSZXZlcnNlQ29tcGFyYXRvcigpOwotCQkJQ29sbGVjdGlvbnMuPE9iamVjdD5zb3J0KHJldHVybkxpc3QsIGNvbXBhcmF0b3IpOwotCQl9IGVsc2UgaWYgKFZfQ0FURUdPUllfRUxFTUVOVFNfX1NPUlRfVFlQRV9NRVRIT0RfVFlQRS5lcXVhbHMoc29ydFR5cGUpKSB7Ci0JCQlDb21wYXJhdG9yIGNvbXBhcmF0b3IgPSBQcmVzZW50YXRpb25Db250ZXh0LklOU1RBTkNFLmdldE1ldGhvZEVsZW1lbnRUeXBlQ29tcGFyYXRvcigpOwotCQkJaWYgKGZvcmNlUHJlc05hbWVTb3J0KQotCQkJCWNvbXBhcmF0b3IgPSBQcmVzZW50YXRpb25Db250ZXh0LklOU1RBTkNFLmdldFByZXNOYW1lTWV0aG9kRWxlbWVudFR5cGVDb21wYXJhdG9yKCk7Ci0JCQlDb2xsZWN0aW9ucy48T2JqZWN0PnNvcnQocmV0dXJuTGlzdCwgY29tcGFyYXRvcik7Ci0JCX0KLQkJcmV0dXJuIHJldHVybkxpc3Q7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIExpc3Q8T2JqZWN0PiBmaW5kTWFudWFsU29ydE9yZGVySW5Db250cmlidXRvcnMoQ29udGVudENhdGVnb3J5IGNjLCBMaXN0PE9iamVjdD4gZWxlbWVudExpc3QpIHsKLQkJT3JkZXJJbmZvIGxhdGVzdEluZm8gPSBudWxsOwotCQlNYXA8U3RyaW5nLCBNZXRob2RFbGVtZW50PiBndWlkTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBNZXRob2RFbGVtZW50PigpOwotCi0JCVN0cmluZyBzb3J0VHlwZSA9IGdldENhdGVnb3J5U29ydFZhbHVlKGNjKTsKLQkJaWYgKFZfQ0FURUdPUllfRUxFTUVOVFNfX1NPUlRfVFlQRV9NQU5VQUwuZXF1YWxzKHNvcnRUeXBlKSkgewotCQkJLy8gc2V0IHVwIEdVSUQgbWFwCi0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gZWxlbWVudExpc3QuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBvID0gaXRlcmF0b3IubmV4dCgpOwotCQkJCWlmIChvIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJCQlndWlkTWFwLnB1dCgoKE1ldGhvZEVsZW1lbnQpbykuZ2V0R3VpZCgpLAotCQkJCQkJCShNZXRob2RFbGVtZW50KW8pOwotCQkJCX0KLQkJCX0KLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IFRuZ1V0aWwuZ2V0Q29udHJpYnV0b3JzKGNjKTtpdGVyLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3Qgb2JqID0gaXRlci5uZXh0KCk7Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIENvbnRlbnRDYXRlZ29yeSkgewotCQkJCQlDb250ZW50Q2F0ZWdvcnkgY29udHJpYnV0b3IgPSAoQ29udGVudENhdGVnb3J5KW9iajsKLQkJCQkJT3JkZXJJbmZvIG9yZGVySW5mbyA9IFRuZ1V0aWwuZ2V0T3JkZXJJbmZvKGNvbnRyaWJ1dG9yLCBDb250ZW50RWxlbWVudE9yZGVyTGlzdC5PUkRFUl9JTkZPX05BTUUpOwotCQkJCQlpZiAob3JkZXJJbmZvID09IG51bGwpIHsKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQl9Ci0JCQkJCS8vIGZpbmQgbGF0ZXN0IE9yZGVySW5mbyB0aGF0IGNvbnRhaW5zIGFsbCB0aGVzZSBlbGVtZW50cwotCQkJCQlpZiAobGF0ZXN0SW5mbyA9PSBudWxsIHx8IG9yZGVySW5mby5nZXRUaW1lc3RhbXAoKSA+IGxhdGVzdEluZm8uZ2V0VGltZXN0YW1wKCkpIHsKLQkJCQkJCWxhdGVzdEluZm8gPSBvcmRlckluZm87Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlpZiAobGF0ZXN0SW5mbyAhPSBudWxsKSB7Ci0JCQkJTGlzdDxPYmplY3Q+IHJldHVybkxpc3QgPSBuZXcgQXJyYXlMaXN0PE9iamVjdD4oKTsKLQkJCQkvLyBzb3J0IGxpc3QgYWNjb3JkaW5nIHRvIG9yZGVySW5mbwotCQkJCWludCBzaXplID0gbGF0ZXN0SW5mby5nZXRHVUlEcygpLnNpemUoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCQlTdHJpbmcgZ3VpZCA9IChTdHJpbmcpbGF0ZXN0SW5mby5nZXRHVUlEcygpLmdldChpKTsKLQkJCQkJT2JqZWN0IGVsZW1lbnQgPSBndWlkTWFwLmdldChndWlkKTsKLQkJCQkJaWYgKGVsZW1lbnQgIT0gbnVsbCkgewotCQkJCQkJcmV0dXJuTGlzdC5hZGQoZWxlbWVudCk7Ci0JCQkJCQlndWlkTWFwLnJlbW92ZShndWlkKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCS8vIHRyeSB0byBmaW5kIGVsZW1lbnQgaW4gdGhlIGd1aWRNYXAgdGhhdCBoYXMgYSBnZW5lcmFsaXplciB3aXRoICJndWlkIgotCQkJCQkJTWV0aG9kRWxlbWVudCBtZSA9IGZpbmRFbGVtZW50SW5HZW5lcmFsaXplckxpc3QoZ3VpZE1hcCwgZ3VpZCk7Ci0JCQkJCQlpZiAobWUgIT0gbnVsbCkgewotCQkJCQkJCXJldHVybkxpc3QuYWRkKG1lKTsKLQkJCQkJCQlndWlkTWFwLnJlbW92ZShndWlkKTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJLy8gY291bGQgbm90IGxvY2F0ZSwgd2lsbCByZXR1cm4gb3JpZ2luYWwgbGlzdAotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCWlmIChlbGVtZW50TGlzdC5zaXplKCkgPT0gcmV0dXJuTGlzdC5zaXplKCkpCi0JCQkJCXJldHVybiByZXR1cm5MaXN0OwotCQkJfQotCQl9Ci0JCXJldHVybiBlbGVtZW50TGlzdDsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgTWV0aG9kRWxlbWVudCBmaW5kRWxlbWVudEluR2VuZXJhbGl6ZXJMaXN0KE1hcDxTdHJpbmcsIE1ldGhvZEVsZW1lbnQ+IGd1aWRNYXAsIFN0cmluZyBndWlkKSB7Ci0JCWZvciAoSXRlcmF0b3I8TWV0aG9kRWxlbWVudD4gaXRlciA9IGd1aWRNYXAudmFsdWVzKCkuaXRlcmF0b3IoKTtpdGVyLmhhc05leHQoKTspIHsKLQkJCU1ldGhvZEVsZW1lbnQgdmFsdWUgPSBpdGVyLm5leHQoKTsKLQkJCWlmICh2YWx1ZSBpbnN0YW5jZW9mIFZhcmlhYmlsaXR5RWxlbWVudCkgewotCQkJCWZvciAoSXRlcmF0b3IgZ2VuSXRlciA9IFRuZ1V0aWwuZ2V0R2VuZXJhbGl6ZXJzKChWYXJpYWJpbGl0eUVsZW1lbnQpdmFsdWUpO2dlbkl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQlPYmplY3QgZ2VuZXJhbGl6ZXIgPSBnZW5JdGVyLm5leHQoKTsKLQkJCQkJaWYgKGdlbmVyYWxpemVyIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJCQkJaWYgKCgoTWV0aG9kRWxlbWVudClnZW5lcmFsaXplcikuZ2V0R3VpZCgpLmVxdWFscyhndWlkKSkgewotCQkJCQkJCXJldHVybiAoTWV0aG9kRWxlbWVudClnZW5lcmFsaXplcjsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogQHBhcmFtIGNjCi0JICogQHBhcmFtIGZlYXR1cmUKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIG5lZWRUb1NvcnQoTWV0aG9kRWxlbWVudCBlbGVtZW50LCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSkgewotCQlpZiAoISAoZWxlbWVudCBpbnN0YW5jZW9mIENvbnRlbnRDYXRlZ29yeSkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEN1c3RvbUNhdGVnb3J5ICYmIAotCQkJCWZlYXR1cmUgPT0gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q3VzdG9tQ2F0ZWdvcnlfQ2F0ZWdvcml6ZWRFbGVtZW50cygpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIERpc2NpcGxpbmUgJiYgCi0JCQkJZmVhdHVyZSA9PSBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXREaXNjaXBsaW5lX1Rhc2tzKCkpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgRG9tYWluICYmIAotCQkJCWZlYXR1cmUgPT0gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RG9tYWluX1dvcmtQcm9kdWN0cygpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFJvbGVTZXQgJiYgCi0JCQkJZmVhdHVyZSA9PSBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRSb2xlU2V0X1JvbGVzKCkpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgVG9vbCAmJiAKLQkJCQlmZWF0dXJlID09IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRvb2xfVG9vbE1lbnRvcnMoKSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdFR5cGUgJiYgCi0JCQkJZmVhdHVyZSA9PSBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRXb3JrUHJvZHVjdFR5cGVfV29ya1Byb2R1Y3RzKCkpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9Db21wYXJhdG9ycy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL0NvbXBhcmF0b3JzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmMDdiMmEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL0NvbXBhcmF0b3JzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlByZXNlbnRhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5uYXZpZ2F0b3IuUGx1Z2luVUlQYWNrYWdlc0l0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmliYWJsZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLWltcG9ydCBjb20uaWJtLmljdS50ZXh0LkNvbGxhdG9yOwotCi0KLS8qKgotICogQ29sbGVjdGlvbiBvZiBjb21wYXJhdG9ycwotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgQ29tcGFyYXRvcnMgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDb21wYXJhdG9yPE9iamVjdD4gREVGQVVMVF9DT01QQVJBVE9SID0gbmV3IENvbXBhcmF0b3I8T2JqZWN0PigpIHsKLQotCQlwdWJsaWMgaW50IGNvbXBhcmUoT2JqZWN0IG8xLCBPYmplY3QgbzIpIHsKLQkJCWlmIChvMSA9PSBvMikKLQkJCQlyZXR1cm4gMDsKLQkJCUNvbGxhdG9yIGNvbGxhdG9yID0gQ29sbGF0b3IuZ2V0SW5zdGFuY2UoKTsKLQkJCWlmIChvMSBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQgJiYgbzIgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQkJcmV0dXJuIGNvbGxhdG9yLmNvbXBhcmUoKChNZXRob2RFbGVtZW50KSBvMSkuZ2V0TmFtZSgpLCAoKE1ldGhvZEVsZW1lbnQpIG8yKS5nZXROYW1lKCkpOwotCQkJfQotCQkJT2JqZWN0IG8xdW53cmFwID0gVG5nVXRpbC51bndyYXAobzEpOwotCQkJT2JqZWN0IG8ydW53cmFwID0gVG5nVXRpbC51bndyYXAobzIpOwotCQkJaWYgKG8xdW53cmFwIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudAotCQkJCQkmJiBvMnVud3JhcCBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCQlyZXR1cm4gY29sbGF0b3IuY29tcGFyZSgoKE1ldGhvZEVsZW1lbnQpIG8xdW53cmFwKS5nZXROYW1lKCksICgoTWV0aG9kRWxlbWVudCkgbzJ1bndyYXApLmdldE5hbWUoKSk7Ci0JCQl9Ci0JCQlyZXR1cm4gMDsKLQkJfQotCi0JfTsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIENvbXBhcmF0b3I8T2JqZWN0PiBSRVZFUlNFX0RFRkFVTFRfQ09NUEFSQVRPUiA9IG5ldyBDb21wYXJhdG9yPE9iamVjdD4oKSB7Ci0KLQkJcHVibGljIGludCBjb21wYXJlKE9iamVjdCBvMSwgT2JqZWN0IG8yKSB7Ci0JCQlpZiAobzEgPT0gbzIpCi0JCQkJcmV0dXJuIDA7Ci0JCQlDb2xsYXRvciBjb2xsYXRvciA9IENvbGxhdG9yLmdldEluc3RhbmNlKCk7Ci0JCQlpZiAobzEgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50ICYmIG8yIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJCXJldHVybiBvcHBvc2l0ZVZhbHVlKGNvbGxhdG9yLmNvbXBhcmUoKChNZXRob2RFbGVtZW50KSBvMSkuZ2V0TmFtZSgpLCAoKE1ldGhvZEVsZW1lbnQpIG8yKS5nZXROYW1lKCkpKTsKLQkJCX0KLQkJCU9iamVjdCBvMXVud3JhcCA9IFRuZ1V0aWwudW53cmFwKG8xKTsKLQkJCU9iamVjdCBvMnVud3JhcCA9IFRuZ1V0aWwudW53cmFwKG8yKTsKLQkJCWlmIChvMXVud3JhcCBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQKLQkJCQkJJiYgbzJ1bndyYXAgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQkJcmV0dXJuIG9wcG9zaXRlVmFsdWUoY29sbGF0b3IuY29tcGFyZSgoKE1ldGhvZEVsZW1lbnQpIG8xdW53cmFwKS5nZXROYW1lKCksICgoTWV0aG9kRWxlbWVudCkgbzJ1bndyYXApLmdldE5hbWUoKSkpOwotCQkJfQotCQkJcmV0dXJuIDA7Ci0JCX0KLQotCX07Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgaW50IG9wcG9zaXRlVmFsdWUoaW50IHZhbCkgewotCQlpZiAodmFsICE9IDApIHsKLQkJCXZhbCA9IDAgLSB2YWw7Ci0JCX0KLQkJcmV0dXJuIHZhbDsKLQl9Ci0KLQotCXB1YmxpYyBzdGF0aWMgYWJzdHJhY3QgY2xhc3MgVHlwZUNvbXBhcmF0b3IgaW1wbGVtZW50cyBDb21wYXJhdG9yIHsKLQkJcHJvdGVjdGVkIENvbXBhcmF0b3I8T2JqZWN0PiBnZXREZWZhdWx0Q29tcGFyYXRvcigpIHsKLQkJCXJldHVybiBERUZBVUxUX0NPTVBBUkFUT1I7Ci0JCX0KLQkJCi0JCXByb3RlY3RlZCBhYnN0cmFjdCBpbnQgZ2V0T3JkZXJJZChPYmplY3Qgb2JqKTsKLQotCQlwdWJsaWMgaW50IGNvbXBhcmUoT2JqZWN0IG8xLCBPYmplY3QgbzIpIHsKLQkJCW8xID0gVG5nVXRpbC51bndyYXAobzEpOwotCQkJbzIgPSBUbmdVdGlsLnVud3JhcChvMik7Ci0JCQlpZiAobzEgPT0gbzIpCi0JCQkJcmV0dXJuIDA7Ci0JCQlpbnQgcmV0ID0gMDsKLQkJCXJldCA9IGdldE9yZGVySWQoKEVPYmplY3QpIG8xKSAtIGdldE9yZGVySWQoKEVPYmplY3QpIG8yKTsKLQkJCWlmIChyZXQgPT0gMCkgewotCQkJCXJldHVybiBnZXREZWZhdWx0Q29tcGFyYXRvcigpLmNvbXBhcmUobzEsIG8yKTsKLQkJCX0KLQkJCXJldHVybiByZXQ7Ci0JCX0KLQotCX0KLQotCXByaXZhdGUgc3RhdGljIGludCBjb21wYXJlUHJlc2VudGF0aW9uTmFtZShNZXRob2RFbGVtZW50IGUxLCBNZXRob2RFbGVtZW50IGUyKSB7Ci0JCUNvbGxhdG9yIGNvbGxhdG9yID0gQ29sbGF0b3IuZ2V0SW5zdGFuY2UoKTsKLQkJU3RyaW5nIG5hbWUxID0gZTEgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50ID8gUHJvY2Vzc1V0aWwuZ2V0UHJlc2VudGF0aW9uTmFtZSgoQnJlYWtkb3duRWxlbWVudCllMSkKLQkJCQk6IGUxLmdldFByZXNlbnRhdGlvbk5hbWUoKTsKLQkJaWYgKG5hbWUxLmxlbmd0aCgpIDwgMSkgbmFtZTEgPSBlMS5nZXROYW1lKCk7Ci0JCVN0cmluZyBuYW1lMiA9IGUyIGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudCA/IFByb2Nlc3NVdGlsLmdldFByZXNlbnRhdGlvbk5hbWUoKEJyZWFrZG93bkVsZW1lbnQpZTIpCi0JCQkJOiBlMi5nZXRQcmVzZW50YXRpb25OYW1lKCk7Ci0JCWlmIChuYW1lMi5sZW5ndGgoKSA8IDEpIG5hbWUyID0gZTIuZ2V0TmFtZSgpOwotCQlyZXR1cm4gY29sbGF0b3IuY29tcGFyZShuYW1lMSwgbmFtZTIpOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBNZXRob2RFbGVtZW50IGdldE1ldGhvZEVsZW1lbnQoT2JqZWN0IG9iaikgewotCQlPYmplY3Qgb2JqZWN0ID0gVG5nVXRpbC51bndyYXAob2JqKTsKLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpCi0JCQlvYmplY3QgPSAoKFByb2Nlc3NDb21wb25lbnQpIG9iamVjdCkuZ2V0UHJvY2VzcygpOwotCQlvYmplY3QgPSBUbmdVdGlsLnVud3JhcChvYmplY3QpOwotCQlpZihvYmplY3QgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQlyZXR1cm4gKE1ldGhvZEVsZW1lbnQpb2JqZWN0OwotCQl9Ci0JCXJldHVybiBudWxsOwotCQkKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENvbXBhcmF0b3I8T2JqZWN0PiBQUkVTRU5UQVRJT05fTkFNRV9DT01QQVJBVE9SID0gbmV3IENvbXBhcmF0b3I8T2JqZWN0PigpIHsKLQkJCi0JCXB1YmxpYyBpbnQgY29tcGFyZShPYmplY3QgbzEsIE9iamVjdCBvMikgewotCQkJaWYgKG8xID09IG8yKQotCQkJCXJldHVybiAwOwotCQkJbzEgPSBnZXRNZXRob2RFbGVtZW50KG8xKTsKLQkJCWlmIChvMSA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIDA7Ci0JCQl9Ci0KLQkJCW8yID0gZ2V0TWV0aG9kRWxlbWVudChvMik7Ci0JCQlpZiAobzIgPT0gbnVsbCkgewotCQkJCXJldHVybiAwOwotCQkJfQotCi0JCQlyZXR1cm4gY29tcGFyZVByZXNlbnRhdGlvbk5hbWUoKE1ldGhvZEVsZW1lbnQpIG8xLCAoTWV0aG9kRWxlbWVudCkgbzIpOwotCQl9Ci0KLQl9OwotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29tcGFyYXRvcjxPYmplY3Q+IFJFVkVSU0VfUFJFU0VOVEFUSU9OX05BTUVfQ09NUEFSQVRPUiA9IG5ldyBDb21wYXJhdG9yPE9iamVjdD4oKSB7Ci0JCQotCQlwdWJsaWMgaW50IGNvbXBhcmUoT2JqZWN0IG8xLCBPYmplY3QgbzIpIHsKLQkJCWlmIChvMSA9PSBvMikKLQkJCQlyZXR1cm4gMDsKLQkJCWlmKCEobzEgaW5zdGFuY2VvZiBEZXNjcmliYWJsZUVsZW1lbnQpKSB7Ci0JCQkJbzEgPSBUbmdVdGlsLnVud3JhcChvMSk7Ci0JCQkJaWYoIShvMSBpbnN0YW5jZW9mIERlc2NyaWJhYmxlRWxlbWVudCkpIHsKLQkJCQkJcmV0dXJuIDA7Ci0JCQkJfQotCQkJfQotCQkJaWYoIShvMiBpbnN0YW5jZW9mIERlc2NyaWJhYmxlRWxlbWVudCkpIHsKLQkJCQlvMiA9IFRuZ1V0aWwudW53cmFwKG8yKTsKLQkJCQlpZighKG8yIGluc3RhbmNlb2YgRGVzY3JpYmFibGVFbGVtZW50KSkgewotCQkJCQlyZXR1cm4gMDsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gb3Bwb3NpdGVWYWx1ZShjb21wYXJlUHJlc2VudGF0aW9uTmFtZSgoRGVzY3JpYmFibGVFbGVtZW50KSBvMSwgKERlc2NyaWJhYmxlRWxlbWVudCkgbzIpKTsKLQkJfQotCi0JfTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29tcGFyYXRvciBNRVRIT0RfVFlQRV9DT01QQVJBVE9SID0gbmV3IFR5cGVDb21wYXJhdG9yKCkgewotCQkvKiAobm9uLUphdmFkb2MpCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkNvbXBhcmF0b3JzLlR5cGVDb21wYXJhdG9yI2dldERlZmF1bHRDb21wYXJhdG9yKCkKLQkJICovCi0JCXByb3RlY3RlZCBDb21wYXJhdG9yIGdldERlZmF1bHRDb21wYXJhdG9yKCkgewotCQkJcmV0dXJuIFByZXNlbnRhdGlvbkNvbnRleHQuSU5TVEFOQ0UuZ2V0Q29tcGFyYXRvcigpOwotCQl9Ci0KLQkJcHJvdGVjdGVkIGludCBnZXRPcmRlcklkKE9iamVjdCBvYmopIHsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQkJaW50IGlkID0gKChNZXRob2RFbGVtZW50KSBvYmopLmVDbGFzcygpLmdldENsYXNzaWZpZXJJRCgpOwotCQkJCWlmIChpZCA9PSBVbWFQYWNrYWdlLlRFUk1fREVGSU5JVElPTikgewotCQkJCQlpZCA9IEludGVnZXIuTUFYX1ZBTFVFOwotCQkJCX0KLQkJCQlyZXR1cm4gaWQ7Ci0JCQl9Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQl9OwotCQotCS8qKgotCSAqIEFsd2F5cyBzb3J0IGJ5IHByZXNlbnRhdGlvbiBuYW1lCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDb21wYXJhdG9yIE1FVEhPRF9UWVBFX1BSRVNfTkFNRV9DT01QQVJBVE9SID0gbmV3IFR5cGVDb21wYXJhdG9yKCkgewotCQkvKiAobm9uLUphdmFkb2MpCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkNvbXBhcmF0b3JzLlR5cGVDb21wYXJhdG9yI2dldERlZmF1bHRDb21wYXJhdG9yKCkKLQkJICovCi0JCXByb3RlY3RlZCBDb21wYXJhdG9yIGdldERlZmF1bHRDb21wYXJhdG9yKCkgewotCQkJcmV0dXJuIFByZXNlbnRhdGlvbkNvbnRleHQuSU5TVEFOQ0UuZ2V0UHJlc05hbWVDb21wYXJhdG9yKCk7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgaW50IGdldE9yZGVySWQoT2JqZWN0IG9iaikgewotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCQlpbnQgaWQgPSAoKE1ldGhvZEVsZW1lbnQpIG9iaikuZUNsYXNzKCkuZ2V0Q2xhc3NpZmllcklEKCk7Ci0JCQkJaWYgKGlkID09IFVtYVBhY2thZ2UuVEVSTV9ERUZJTklUSU9OKSB7Ci0JCQkJCWlkID0gSW50ZWdlci5NQVhfVkFMVUU7Ci0JCQkJfQotCQkJCXJldHVybiBpZDsKLQkJCX0KLQkJCXJldHVybiAtMTsKLQkJfQotCX07Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENvbXBhcmF0b3I8T2JqZWN0PiBQTFVHSU5QQUNLQUdFX0NPTVBBUkFUT1IgPSBuZXcgQ29tcGFyYXRvcjxPYmplY3Q+KCkgewotCQotCQlwdWJsaWMgaW50IGNvbXBhcmUoT2JqZWN0IG8xLCBPYmplY3QgbzIpIHsKLQkJCWlmIChvMSA9PSBvMikKLQkJCQlyZXR1cm4gMDsKLQkJCW8xID0gVG5nVXRpbC51bndyYXAobzEpOwotCQkJbzIgPSBUbmdVdGlsLnVud3JhcChvMik7Ci0JCQkKLQkJCQotCQkJaWYgKG8xIGluc3RhbmNlb2YgUGx1Z2luVUlQYWNrYWdlc0l0ZW1Qcm92aWRlciAmJiBvMiBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikgewotCQkJCXJldHVybiAtMTsKLQkJCX0KLQkJCWlmIChvMSBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbiAmJiBvMiBpbnN0YW5jZW9mIFBsdWdpblVJUGFja2FnZXNJdGVtUHJvdmlkZXIpIHsKLQkJCQlyZXR1cm4gMTsKLQkJCX0KLQkKLQkJCWJvb2xlYW4gdXNlUHJlc05hbWUgPSBQcmVzZW50YXRpb25Db250ZXh0LklOU1RBTkNFLmlzU2hvd1ByZXNlbnRhdGlvbk5hbWVzKCk7Ci0JCQlTdHJpbmcgczEgPSBudWxsOwotCQkJU3RyaW5nIHMyID0gbnVsbDsKLQkJCWlmICh1c2VQcmVzTmFtZSAmJiBvMSBpbnN0YW5jZW9mIERlc2NyaWJhYmxlRWxlbWVudCkgewotCQkJCXMxID0gKChEZXNjcmliYWJsZUVsZW1lbnQpIG8xKS5nZXRQcmVzZW50YXRpb25OYW1lKCk7Ci0JCQl9IGVsc2UgaWYgKG8xIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJCXMxID0gKChNZXRob2RFbGVtZW50KSBvMSkuZ2V0TmFtZSgpOwotCQkJfSBlbHNlIGlmIChvMSBpbnN0YW5jZW9mIFBsdWdpblVJUGFja2FnZXNJdGVtUHJvdmlkZXIpIHsKLQkJCQlzMSA9ICgoUGx1Z2luVUlQYWNrYWdlc0l0ZW1Qcm92aWRlcikgbzEpLmdldEZ1bGxOYW1lKCk7Ci0JCQl9IGVsc2UgaWYgKG8xIGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0JCQkJczEgPSAoU3RyaW5nKSBvMTsKLQkJCX0gCi0JCQkKLQkJCWlmICh1c2VQcmVzTmFtZSAmJiBvMiBpbnN0YW5jZW9mIERlc2NyaWJhYmxlRWxlbWVudCkgewotCQkJCXMyID0gKChEZXNjcmliYWJsZUVsZW1lbnQpIG8yKS5nZXRQcmVzZW50YXRpb25OYW1lKCk7Ci0JCQl9IGVsc2UgaWYgKG8yIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJCXMyID0gKChNZXRob2RFbGVtZW50KSBvMikuZ2V0TmFtZSgpOwotCQkJfSBlbHNlIGlmIChvMiBpbnN0YW5jZW9mIFBsdWdpblVJUGFja2FnZXNJdGVtUHJvdmlkZXIpIHsKLQkJCQlzMiA9ICgoUGx1Z2luVUlQYWNrYWdlc0l0ZW1Qcm92aWRlcikgbzIpLmdldEZ1bGxOYW1lKCk7Ci0JCQl9IGVsc2UgaWYgKG8yIGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0JCQkJczIgPSAoU3RyaW5nKSBvMjsKLQkJCX0KLQkJCQotCQkJaWYgKHMxID09IG51bGwgfHwgczIgPT0gbnVsbCkgewotCQkJCXJldHVybiAwOwotCQkJfQotCQkJCi0JCQlyZXR1cm4gczEuY29tcGFyZVRvSWdub3JlQ2FzZShzMik7Ci0JCX0KLQl9OwotCi0JCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvQ29uZmlndXJhYmxlQ29tcG9zZWRBZGFwdGVyRmFjdG9yeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL0NvbmZpZ3VyYWJsZUNvbXBvc2VkQWRhcHRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWY0YWViYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvQ29uZmlndXJhYmxlQ29tcG9zZWRBZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbDsKLQotaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5TdHJpbmdXcml0ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlZEFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklDb25maWd1cmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFJlc291cmNlczsKLQotCi0vKioKLSAqIEluc3RhbmNlIG9mIHRoaXMgY2xhc3MgY2FuIGJlIGNvbmZpZ3VyZWQgdXNpbmcgdGhlIHNwZWNpZmllZCBmaWx0ZXIKLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUgLSBKdWwgMjcsIDIwMDUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIENvbmZpZ3VyYWJsZUNvbXBvc2VkQWRhcHRlckZhY3RvcnkgZXh0ZW5kcyBDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IHsKLQotCXByaXZhdGUgSUZpbHRlciBmaWx0ZXI7Ci0KLQkvLyBwcml2YXRlIFNldCBkaXNwb3NhYmxlQWRhcHRlcnM7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgQ29uZmlndXJhYmxlQ29tcG9zZWRBZGFwdGVyRmFjdG9yeShBZGFwdGVyRmFjdG9yeVtdIGFkYXB0ZXJGYWN0b3JpZXMpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3Rvcmllcyk7Ci0JfQotCi0JLy8gcHJpdmF0ZSBTZXQgZ2V0RGlzcG9zYWJsZUFkYXB0ZXJzKCkgewotCS8vIGlmKGRpc3Bvc2FibGVBZGFwdGVycyA9PSBudWxsKSB7Ci0JLy8gZGlzcG9zYWJsZUFkYXB0ZXJzID0gbmV3IEhhc2hTZXQoKTsKLQkvLyB9Ci0JLy8gcmV0dXJuIGRpc3Bvc2FibGVBZGFwdGVyczsKLQkvLyB9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5I2FkYXB0KGphdmEubGFuZy5PYmplY3QsCi0JICogICAgICBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBPYmplY3QgYWRhcHQoT2JqZWN0IG9iamVjdCwgT2JqZWN0IHR5cGUpIHsKLQkJT2JqZWN0IGFkYXB0ZXIgPSBzdXBlci5hZGFwdChvYmplY3QsIHR5cGUpOwotCQlpZiAoYWRhcHRlciBpbnN0YW5jZW9mIElDb25maWd1cmFibGUpIHsKLQkJCSgoSUNvbmZpZ3VyYWJsZSkgYWRhcHRlcikuc2V0RmlsdGVyKGZpbHRlcik7Ci0JCX0KLQkJLy8gaWYoYWRhcHRlciBpbnN0YW5jZW9mIElEaXNwb3NhYmxlKSB7Ci0JCS8vIGdldERpc3Bvc2FibGVBZGFwdGVycygpLmFkZChhZGFwdGVyKTsKLQkJLy8gfQotCQlyZXR1cm4gYWRhcHRlcjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5I2FkYXB0KG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyLAotCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBhZGFwdChOb3RpZmllciB0YXJnZXQsIE9iamVjdCB0eXBlKSB7Ci0JCUFkYXB0ZXIgYWRhcHRlciA9IHN1cGVyLmFkYXB0KHRhcmdldCwgdHlwZSk7Ci0JCWlmIChhZGFwdGVyIGluc3RhbmNlb2YgSUNvbmZpZ3VyYWJsZSkgewotCQkJKChJQ29uZmlndXJhYmxlKSBhZGFwdGVyKS5zZXRGaWx0ZXIoZmlsdGVyKTsKLQkJfQotCQkvLyBpZihhZGFwdGVyIGluc3RhbmNlb2YgSURpc3Bvc2FibGUpIHsKLQkJLy8gZ2V0RGlzcG9zYWJsZUFkYXB0ZXJzKCkuYWRkKGFkYXB0ZXIpOwotCQkvLyB9Ci0JCXJldHVybiBhZGFwdGVyOwotCX0KLQotCS8vIC8qIChub24tSmF2YWRvYykKLQkvLyAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSNkaXNwb3NlKCkKLQkvLyAqLwotCS8vIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JLy8gaWYoZGlzcG9zYWJsZUFkYXB0ZXJzICE9IG51bGwgJiYgIWRpc3Bvc2FibGVBZGFwdGVycy5pc0VtcHR5KCkpIHsKLQkvLyBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBkaXNwb3NhYmxlQWRhcHRlcnMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JLy8gSURpc3Bvc2FibGUgYWRhcHRlciA9IChJRGlzcG9zYWJsZSkgaXRlci5uZXh0KCk7Ci0JLy8gYWRhcHRlci5kaXNwb3NlKCk7Ci0JLy8gfQotCS8vIH0KLQkvLyBzdXBlci5kaXNwb3NlKCk7Ci0JLy8gfQotCi0JcHVibGljIElGaWx0ZXIgZ2V0RmlsdGVyKCkgewotCQlyZXR1cm4gZmlsdGVyOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEZpbHRlcihJRmlsdGVyIGZpbHRlcikgewotCQl0aGlzLmZpbHRlciA9IGZpbHRlcjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VkQWRhcHRlckZhY3RvcnkjZmlyZU5vdGlmeUNoYW5nZWQob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIGZpcmVOb3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdHJ5IHsKLQkJCXN1cGVyLmZpcmVOb3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkJaWYgKG5vdGlmaWNhdGlvbiBpbnN0YW5jZW9mIFZpZXdlck5vdGlmaWNhdGlvbikgewotCQkJCUxpYnJhcnlFZGl0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQotCQkJCVN0cmluZ1dyaXRlciBzdHJXcml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0JCQkJZS5wcmludFN0YWNrVHJhY2UobmV3IFByaW50V3JpdGVyKHN0cldyaXRlcikpOwotCQkJCU1lc3Nlbmdlci5JTlNUQU5DRQotCQkJCQkJLnNob3dFcnJvcigKLQkJCQkJCQkJTGlicmFyeUVkaXRSZXNvdXJjZXMudXRpbF9jb25maWd1cmFibGVjb21wb3NlZGFkYXB0ZXJfZmF0YWxlcnIsCi0JCQkJCQkJCUxpYnJhcnlFZGl0UmVzb3VyY2VzLnV0aWxfY29uZmlndXJhYmxlY29tcG9zZWRhZGFwdGVyX3JlZmVyc2hpbmd2aWV3ZXIsCi0JCQkJCQkJCUxpYnJhcnlFZGl0UmVzb3VyY2VzLnV0aWxfY29uZmlndXJhYmxlY29tcG9zZWRhZGFwdGVyX3VuaGFuZGxlZF9leGNlcHRpb24sCi0JCQkJCQkJCXN0cldyaXRlci50b1N0cmluZygpLCBlKTsgCi0JCQkJcmV0dXJuOwotCQkJfQotCQkJdGhyb3cgZTsKLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvQ29uZmlndXJhdGlvblNldHRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL0NvbmZpZ3VyYXRpb25TZXR0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmEwMzQ0Ni4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvQ29uZmlndXJhdGlvblNldHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjIKLSAqLwotcHVibGljIGNsYXNzIENvbmZpZ3VyYXRpb25TZXR0ZXIgewotCXByaXZhdGUgQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3Rvcnk7Ci0JcHJpdmF0ZSBJQ29uZmlndXJhdG9yIGNvbmZpZ3VyYXRvcjsKLQlwcml2YXRlIE1ldGhvZENvbmZpZ3VyYXRpb24gb2xkQ29uZmlnOwotCi0JcHVibGljIENvbmZpZ3VyYXRpb25TZXR0ZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJdGhpcy5hZGFwdGVyRmFjdG9yeSA9IGFkYXB0ZXJGYWN0b3J5OwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXQoTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLQkJSUZpbHRlciBmaWx0ZXIgPSBQcm9jZXNzVXRpbC5nZXRGaWx0ZXIoYWRhcHRlckZhY3RvcnkpOwotCQljb25maWd1cmF0b3IgPSBmaWx0ZXIgaW5zdGFuY2VvZiBJQ29uZmlndXJhdG9yID8gKElDb25maWd1cmF0b3IpIGZpbHRlciA6IG51bGw7Ci0JCWlmKGNvbmZpZ3VyYXRvciAhPSBudWxsKSB7Ci0JCQlvbGRDb25maWcgPSBjb25maWd1cmF0b3IuZ2V0TWV0aG9kQ29uZmlndXJhdGlvbigpOwotCQkJY29uZmlndXJhdG9yLnNldE1ldGhvZENvbmZpZ3VyYXRpb24oY29uZmlnKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCByZXN0b3JlKCkgewotCQlpZihjb25maWd1cmF0b3IgIT0gbnVsbCkgewotCQkJY29uZmlndXJhdG9yLnNldE1ldGhvZENvbmZpZ3VyYXRpb24ob2xkQ29uZmlnKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgSUNvbmZpZ3VyYXRvciBnZXRDb25maWd1cmF0b3IoKSB7Ci0JCXJldHVybiBjb25maWd1cmF0b3I7Ci0JfQotCQotCXB1YmxpYyBNZXRob2RDb25maWd1cmF0aW9uIGdldE9sZENvbmZpZ3VyYXRpb24oKSB7Ci0JCXJldHVybiBvbGRDb25maWc7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL0NvbmZpZ3VyYXRpb25VdGlsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvQ29uZmlndXJhdGlvblV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTlmYjg2Zi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvQ29uZmlndXJhdGlvblV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklBY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudENhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIFV0aWxpdHkgY2xhc3MgdG8gYWRkL3JlbW92ZSBvYmplY3RzIGZyb20gYSBNZXRob2RDb25maWd1cmF0aW9uIHVzaW5nIGFuIElBY3Rpb25NYW5hZ2VyCi0gKiBAYXV0aG9yIEplZmYgSGFyZHkKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBDb25maWd1cmF0aW9uVXRpbCB7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBhY3Rpb25PbkNvbGxlY3Rpb24oSUFjdGlvbk1hbmFnZXIgYWN0aW9uTWdyLAotCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcsIENvbGxlY3Rpb24gdmFsdWUsIGludCBhY3Rpb25UeXBlLAotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIExpc3QgbGlzdEZlYXR1cmUpIHsKLQkJaWYgKGNvbmZpZyAhPSBudWxsICYmIHZhbHVlICE9IG51bGwgJiYgIXZhbHVlLmlzRW1wdHkoKSkgewotCQkJaWYgKGFjdGlvbk1nciAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIGFjdGlvbk1nci5kb0FjdGlvbihhY3Rpb25UeXBlLCBjb25maWcsIGZlYXR1cmUsIHZhbHVlLAotCQkJCQkJLTEpOwotCQkJfSBlbHNlIHsKLQkJCQlpZiAoYWN0aW9uVHlwZSA9PSBJQWN0aW9uTWFuYWdlci5BRERfTUFOWSkgewotCQkJCQlyZXR1cm4gbGlzdEZlYXR1cmUuYWRkQWxsKHZhbHVlKTsKLQkJCQl9IGVsc2UgaWYgKGFjdGlvblR5cGUgPT0gSUFjdGlvbk1hbmFnZXIuUkVNT1ZFX01BTlkpIHsKLQkJCQkJcmV0dXJuIGxpc3RGZWF0dXJlLnJlbW92ZUFsbCh2YWx1ZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGFjdGlvbk9uSXRlbShJQWN0aW9uTWFuYWdlciBhY3Rpb25NZ3IsCi0JCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZywgT2JqZWN0IHZhbHVlLCBpbnQgYWN0aW9uVHlwZSwKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBMaXN0IGxpc3RGZWF0dXJlKSB7Ci0JCWlmIChjb25maWcgIT0gbnVsbAotCQkJCSYmIHZhbHVlICE9IG51bGwKLQkJCQkmJiAoKGFjdGlvblR5cGUgPT0gSUFjdGlvbk1hbmFnZXIuQUREICYmICFsaXN0RmVhdHVyZQotCQkJCQkJLmNvbnRhaW5zKHZhbHVlKSkgfHwgKGFjdGlvblR5cGUgPT0gSUFjdGlvbk1hbmFnZXIuUkVNT1ZFICYmIGxpc3RGZWF0dXJlCi0JCQkJCQkuY29udGFpbnModmFsdWUpKSkpIHsKLQkJCWlmIChhY3Rpb25NZ3IgIT0gbnVsbCkgewotCQkJCXJldHVybiBhY3Rpb25NZ3IuZG9BY3Rpb24oYWN0aW9uVHlwZSwgY29uZmlnLCBmZWF0dXJlLCB2YWx1ZSwKLQkJCQkJCS0xKTsKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKGFjdGlvblR5cGUgPT0gSUFjdGlvbk1hbmFnZXIuQUREKSB7Ci0JCQkJCXJldHVybiBsaXN0RmVhdHVyZS5hZGQodmFsdWUpOwotCQkJCX0gZWxzZSBpZiAoYWN0aW9uVHlwZSA9PSBJQWN0aW9uTWFuYWdlci5SRU1PVkUpIHsKLQkJCQkJcmV0dXJuIGxpc3RGZWF0dXJlLnJlbW92ZSh2YWx1ZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCQotCS8qKgotCSAqIEFkZHMgdGhlIGdpdmVuIGNvbGxlY3Rpb24gdG8gdGhlIE1ldGhvZENvbmZpZ3VyYXRpb24ncyBsaXN0IG9mIHNlbGVjdGVkIE1ldGhvZFBsdWdpbnMKLQkgKiBAcGFyYW0gYWN0aW9uTWdyIHVzZSB0aGlzIElBY3Rpb25NYW5hZ2VyIHRvIGNoYW5nZSB0aGUgTWV0aG9kQ29uZmlndXJhdGlvbiwgaWYgbnVsbCB3aWxsIGNoYW5nZSB0aGUgTWV0aG9kQ29uZmlndXJhdGlvbiBkaXJlY3RseS4KLQkgKiBAcGFyYW0gY29uZmlnCi0JICogQHBhcmFtIHZhbHVlCi0JICogQHJldHVybiBmYWxzZSBpZiBhY3Rpb25NYW5hZ2VyIG9yIGxpc3QgbWFuaXB1bGF0aW9uIGZhaWxzLCB0cnVlIG90aGVyd2lzZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBhZGRDb2xsVG9NZXRob2RQbHVnaW5MaXN0KElBY3Rpb25NYW5hZ2VyIGFjdGlvbk1nciwgTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcsIENvbGxlY3Rpb24gdmFsdWUpIHsKLQkJcmV0dXJuIGFjdGlvbk9uQ29sbGVjdGlvbihhY3Rpb25NZ3IsIGNvbmZpZywgdmFsdWUsIElBY3Rpb25NYW5hZ2VyLkFERF9NQU5ZLCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJLmdldE1ldGhvZENvbmZpZ3VyYXRpb25fTWV0aG9kUGx1Z2luU2VsZWN0aW9uKCksIGNvbmZpZy5nZXRNZXRob2RQbHVnaW5TZWxlY3Rpb24oKSk7Ci0JfQotCi0JLyoqCi0JICogQWRkcyB0aGUgZ2l2ZW4gTWV0aG9kUGx1Z2luIHRvIHRoZSBNZXRob2RDb25maWd1cmF0aW9uJ3MgbGlzdCBvZiBzZWxlY3RlZCBNZXRob2RQbHVnaW5zCi0JICogQHBhcmFtIGFjdGlvbk1nciB1c2UgdGhpcyBJQWN0aW9uTWFuYWdlciB0byBjaGFuZ2UgdGhlIE1ldGhvZENvbmZpZ3VyYXRpb24sIGlmIG51bGwgd2lsbCBjaGFuZ2UgdGhlIE1ldGhvZENvbmZpZ3VyYXRpb24gZGlyZWN0bHkuCi0JICogQHBhcmFtIGNvbmZpZwotCSAqIEBwYXJhbSB2YWx1ZQotCSAqIEByZXR1cm4gZmFsc2UgaWYgYWN0aW9uTWFuYWdlciBvciBsaXN0IG1hbmlwdWxhdGlvbiBmYWlscywgdHJ1ZSBvdGhlcndpc2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gYWRkVG9NZXRob2RQbHVnaW5MaXN0KElBY3Rpb25NYW5hZ2VyIGFjdGlvbk1nciwgTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcsIE1ldGhvZFBsdWdpbiB2YWx1ZSkgewotCQlyZXR1cm4gYWN0aW9uT25JdGVtKGFjdGlvbk1nciwgY29uZmlnLCB2YWx1ZSwgSUFjdGlvbk1hbmFnZXIuQURELCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRNZXRob2RDb25maWd1cmF0aW9uX01ldGhvZFBsdWdpblNlbGVjdGlvbigpLCBjb25maWcuZ2V0TWV0aG9kUGx1Z2luU2VsZWN0aW9uKCkpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZXMgdGhlIGdpdmVuIGNvbGxlY3Rpb24gZnJvbSB0aGUgTWV0aG9kQ29uZmlndXJhdGlvbidzIGxpc3Qgb2Ygc2VsZWN0ZWQgTWV0aG9kUGx1Z2lucwotCSAqIEBwYXJhbSBhY3Rpb25NZ3IgdXNlIHRoaXMgSUFjdGlvbk1hbmFnZXIgdG8gY2hhbmdlIHRoZSBNZXRob2RDb25maWd1cmF0aW9uLCBpZiBudWxsIHdpbGwgY2hhbmdlIHRoZSBNZXRob2RDb25maWd1cmF0aW9uIGRpcmVjdGx5LgotCSAqIEBwYXJhbSBjb25maWcKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiBAcmV0dXJuIGZhbHNlIGlmIGFjdGlvbk1hbmFnZXIgb3IgbGlzdCBtYW5pcHVsYXRpb24gZmFpbHMsIHRydWUgb3RoZXJ3aXNlCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHJlbW92ZUNvbGxGcm9tTWV0aG9kUGx1Z2luTGlzdChJQWN0aW9uTWFuYWdlciBhY3Rpb25NZ3IsIE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnLCBDb2xsZWN0aW9uIHZhbHVlKSB7Ci0JCXJldHVybiBhY3Rpb25PbkNvbGxlY3Rpb24oYWN0aW9uTWdyLCBjb25maWcsIHZhbHVlLCBJQWN0aW9uTWFuYWdlci5SRU1PVkVfTUFOWSwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0TWV0aG9kQ29uZmlndXJhdGlvbl9NZXRob2RQbHVnaW5TZWxlY3Rpb24oKSwgY29uZmlnLmdldE1ldGhvZFBsdWdpblNlbGVjdGlvbigpKTsKLQl9Ci0JCi0JLyoqCi0JICogUmVtb3ZlcyB0aGUgZ2l2ZW4gTWV0aG9kUGx1Z2luIGZyb20gdGhlIE1ldGhvZENvbmZpZ3VyYXRpb24ncyBsaXN0IG9mIHNlbGVjdGVkIE1ldGhvZFBsdWdpbnMKLQkgKiBAcGFyYW0gYWN0aW9uTWdyIHVzZSB0aGlzIElBY3Rpb25NYW5hZ2VyIHRvIGNoYW5nZSB0aGUgTWV0aG9kQ29uZmlndXJhdGlvbiwgaWYgbnVsbCB3aWxsIGNoYW5nZSB0aGUgTWV0aG9kQ29uZmlndXJhdGlvbiBkaXJlY3RseS4KLQkgKiBAcGFyYW0gY29uZmlnCi0JICogQHBhcmFtIHZhbHVlCi0JICogQHJldHVybiBmYWxzZSBpZiBhY3Rpb25NYW5hZ2VyIG9yIGxpc3QgbWFuaXB1bGF0aW9uIGZhaWxzLCB0cnVlIG90aGVyd2lzZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiByZW1vdmVGcm9tTWV0aG9kUGx1Z2luTGlzdChJQWN0aW9uTWFuYWdlciBhY3Rpb25NZ3IsIE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnLCBNZXRob2RQbHVnaW4gdmFsdWUpIHsKLQkJcmV0dXJuIGFjdGlvbk9uSXRlbShhY3Rpb25NZ3IsIGNvbmZpZywgdmFsdWUsIElBY3Rpb25NYW5hZ2VyLlJFTU9WRSwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0TWV0aG9kQ29uZmlndXJhdGlvbl9NZXRob2RQbHVnaW5TZWxlY3Rpb24oKSwgY29uZmlnLmdldE1ldGhvZFBsdWdpblNlbGVjdGlvbigpKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIHRoZSBnaXZlbiBjb2xsZWN0aW9uIHRvIHRoZSBNZXRob2RDb25maWd1cmF0aW9uJ3MgbGlzdCBvZiBzZWxlY3RlZCBNZXRob2RQYWNrYWdlcwotCSAqIEBwYXJhbSBhY3Rpb25NZ3IgdXNlIHRoaXMgSUFjdGlvbk1hbmFnZXIgdG8gY2hhbmdlIHRoZSBNZXRob2RDb25maWd1cmF0aW9uLCBpZiBudWxsIHdpbGwgY2hhbmdlIHRoZSBNZXRob2RDb25maWd1cmF0aW9uIGRpcmVjdGx5LgotCSAqIEBwYXJhbSBjb25maWcKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiBAcmV0dXJuIGZhbHNlIGlmIGFjdGlvbk1hbmFnZXIgb3IgbGlzdCBtYW5pcHVsYXRpb24gZmFpbHMsIHRydWUgb3RoZXJ3aXNlCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGFkZENvbGxUb01ldGhvZFBhY2thZ2VMaXN0KElBY3Rpb25NYW5hZ2VyIGFjdGlvbk1nciwgTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcsIENvbGxlY3Rpb24gdmFsdWUpIHsKLQkJcmV0dXJuIGFjdGlvbk9uQ29sbGVjdGlvbihhY3Rpb25NZ3IsIGNvbmZpZywgdmFsdWUsIElBY3Rpb25NYW5hZ2VyLkFERF9NQU5ZLCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRNZXRob2RDb25maWd1cmF0aW9uX01ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKSwgY29uZmlnLmdldE1ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKSk7Ci0JfQotCQotCS8qKgotCSAqIEFkZHMgdGhlIGdpdmVuIE1ldGhvZFBhY2thZ2UgdG8gdGhlIE1ldGhvZENvbmZpZ3VyYXRpb24ncyBsaXN0IG9mIHNlbGVjdGVkIE1ldGhvZFBhY2thZ2VzCi0JICogQHBhcmFtIGFjdGlvbk1nciB1c2UgdGhpcyBJQWN0aW9uTWFuYWdlciB0byBjaGFuZ2UgdGhlIE1ldGhvZENvbmZpZ3VyYXRpb24sIGlmIG51bGwgd2lsbCBjaGFuZ2UgdGhlIE1ldGhvZENvbmZpZ3VyYXRpb24gZGlyZWN0bHkuCi0JICogQHBhcmFtIGNvbmZpZwotCSAqIEBwYXJhbSB2YWx1ZQotCSAqIEByZXR1cm4gZmFsc2UgaWYgYWN0aW9uTWFuYWdlciBvciBsaXN0IG1hbmlwdWxhdGlvbiBmYWlscywgdHJ1ZSBvdGhlcndpc2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gYWRkVG9NZXRob2RQYWNrYWdlTGlzdChJQWN0aW9uTWFuYWdlciBhY3Rpb25NZ3IsIE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnLCBNZXRob2RQYWNrYWdlIHZhbHVlKSB7Ci0JCXJldHVybiBhY3Rpb25Pbkl0ZW0oYWN0aW9uTWdyLCBjb25maWcsIHZhbHVlLCBJQWN0aW9uTWFuYWdlci5BREQsIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldE1ldGhvZENvbmZpZ3VyYXRpb25fTWV0aG9kUGFja2FnZVNlbGVjdGlvbigpLCBjb25maWcuZ2V0TWV0aG9kUGFja2FnZVNlbGVjdGlvbigpKTsKLQl9Ci0KLQkKLQkvKioKLQkgKiBSZW1vdmVzIHRoZSBnaXZlbiBjb2xsZWN0aW9uIGZyb20gdGhlIE1ldGhvZENvbmZpZ3VyYXRpb24ncyBsaXN0IG9mIHNlbGVjdGVkIE1ldGhvZFBhY2thZ2VzCi0JICogQHBhcmFtIGFjdGlvbk1nciB1c2UgdGhpcyBJQWN0aW9uTWFuYWdlciB0byBjaGFuZ2UgdGhlIE1ldGhvZENvbmZpZ3VyYXRpb24sIGlmIG51bGwgd2lsbCBjaGFuZ2UgdGhlIE1ldGhvZENvbmZpZ3VyYXRpb24gZGlyZWN0bHkuCi0JICogQHBhcmFtIGNvbmZpZwotCSAqIEBwYXJhbSB2YWx1ZQotCSAqIEByZXR1cm4gZmFsc2UgaWYgYWN0aW9uTWFuYWdlciBvciBsaXN0IG1hbmlwdWxhdGlvbiBmYWlscywgdHJ1ZSBvdGhlcndpc2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gcmVtb3ZlQ29sbEZyb21NZXRob2RQYWNrYWdlTGlzdChJQWN0aW9uTWFuYWdlciBhY3Rpb25NZ3IsIE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnLCBDb2xsZWN0aW9uIHZhbHVlKSB7Ci0JCXJldHVybiBhY3Rpb25PbkNvbGxlY3Rpb24oYWN0aW9uTWdyLCBjb25maWcsIHZhbHVlLCBJQWN0aW9uTWFuYWdlci5SRU1PVkVfTUFOWSwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0TWV0aG9kQ29uZmlndXJhdGlvbl9NZXRob2RQYWNrYWdlU2VsZWN0aW9uKCksIGNvbmZpZy5nZXRNZXRob2RQYWNrYWdlU2VsZWN0aW9uKCkpOwotCX0KLQkKLQkvKioKLQkgKiBSZW1vdmVzIHRoZSBnaXZlbiBNZXRob2RQYWNrYWdlIGZyb20gdGhlIE1ldGhvZENvbmZpZ3VyYXRpb24ncyBsaXN0IG9mIHNlbGVjdGVkIE1ldGhvZFBhY2thZ2VzCi0JICogQHBhcmFtIGFjdGlvbk1nciB1c2UgdGhpcyBJQWN0aW9uTWFuYWdlciB0byBjaGFuZ2UgdGhlIE1ldGhvZENvbmZpZ3VyYXRpb24sIGlmIG51bGwgd2lsbCBjaGFuZ2UgdGhlIE1ldGhvZENvbmZpZ3VyYXRpb24gZGlyZWN0bHkuCi0JICogQHBhcmFtIGNvbmZpZwotCSAqIEBwYXJhbSB2YWx1ZQotCSAqIEByZXR1cm4gZmFsc2UgaWYgYWN0aW9uTWFuYWdlciBvciBsaXN0IG1hbmlwdWxhdGlvbiBmYWlscywgdHJ1ZSBvdGhlcndpc2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gcmVtb3ZlRnJvbU1ldGhvZFBhY2thZ2VMaXN0KElBY3Rpb25NYW5hZ2VyIGFjdGlvbk1nciwgTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcsIE1ldGhvZFBhY2thZ2UgdmFsdWUpIHsKLQkJcmV0dXJuIGFjdGlvbk9uSXRlbShhY3Rpb25NZ3IsIGNvbmZpZywgdmFsdWUsIElBY3Rpb25NYW5hZ2VyLlJFTU9WRSwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0TWV0aG9kQ29uZmlndXJhdGlvbl9NZXRob2RQYWNrYWdlU2VsZWN0aW9uKCksIGNvbmZpZy5nZXRNZXRob2RQYWNrYWdlU2VsZWN0aW9uKCkpOwotCX0KLQotCi0JLyoqCi0JICogQWRkcyB0aGUgZ2l2ZW4gY29sbGVjdGlvbiB0byB0aGUgTWV0aG9kQ29uZmlndXJhdGlvbidzIGxpc3Qgb2Ygc2VsZWN0ZWQgYWRkZWQtY2F0ZWdvcmllcwotCSAqIEBwYXJhbSBhY3Rpb25NZ3IgdXNlIHRoaXMgSUFjdGlvbk1hbmFnZXIgdG8gY2hhbmdlIHRoZSBNZXRob2RDb25maWd1cmF0aW9uLCBpZiBudWxsIHdpbGwgY2hhbmdlIHRoZSBNZXRob2RDb25maWd1cmF0aW9uIGRpcmVjdGx5LgotCSAqIEBwYXJhbSBjb25maWcKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiBAcmV0dXJuIGZhbHNlIGlmIGFjdGlvbk1hbmFnZXIgb3IgbGlzdCBtYW5pcHVsYXRpb24gZmFpbHMsIHRydWUgb3RoZXJ3aXNlCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGFkZENvbGxUb0FkZGVkQ2F0ZWdvcnlMaXN0KElBY3Rpb25NYW5hZ2VyIGFjdGlvbk1nciwgTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcsIENvbGxlY3Rpb24gdmFsdWUpIHsKLQkJcmV0dXJuIGFjdGlvbk9uQ29sbGVjdGlvbihhY3Rpb25NZ3IsIGNvbmZpZywgdmFsdWUsIElBY3Rpb25NYW5hZ2VyLkFERF9NQU5ZLCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRNZXRob2RDb25maWd1cmF0aW9uX0FkZGVkQ2F0ZWdvcnkoKSwgY29uZmlnLmdldEFkZGVkQ2F0ZWdvcnkoKSk7Ci0JfQotCQotCS8qKgotCSAqIEFkZHMgdGhlIGdpdmVuIENvbnRlbnRDYXRlZ29yeSB0byB0aGUgTWV0aG9kQ29uZmlndXJhdGlvbidzIGxpc3Qgb2Ygc2VsZWN0ZWQgYWRkZWQtY2F0ZWdvcmllcwotCSAqIEBwYXJhbSBhY3Rpb25NZ3IgdXNlIHRoaXMgSUFjdGlvbk1hbmFnZXIgdG8gY2hhbmdlIHRoZSBNZXRob2RDb25maWd1cmF0aW9uLCBpZiBudWxsIHdpbGwgY2hhbmdlIHRoZSBNZXRob2RDb25maWd1cmF0aW9uIGRpcmVjdGx5LgotCSAqIEBwYXJhbSBjb25maWcKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiBAcmV0dXJuIGZhbHNlIGlmIGFjdGlvbk1hbmFnZXIgb3IgbGlzdCBtYW5pcHVsYXRpb24gZmFpbHMsIHRydWUgb3RoZXJ3aXNlCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGFkZFRvQWRkZWRDYXRlZ29yeUxpc3QoSUFjdGlvbk1hbmFnZXIgYWN0aW9uTWdyLCBNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZywgQ29udGVudENhdGVnb3J5IHZhbHVlKSB7Ci0JCXJldHVybiBhY3Rpb25Pbkl0ZW0oYWN0aW9uTWdyLCBjb25maWcsIHZhbHVlLCBJQWN0aW9uTWFuYWdlci5BREQsIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldE1ldGhvZENvbmZpZ3VyYXRpb25fQWRkZWRDYXRlZ29yeSgpLCBjb25maWcuZ2V0QWRkZWRDYXRlZ29yeSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmVzIHRoZSBnaXZlbiBjb2xsZWN0aW9uIGZyb20gdGhlIE1ldGhvZENvbmZpZ3VyYXRpb24ncyBsaXN0IG9mIHNlbGVjdGVkIGFkZGVkLWNhdGVnb3JpZXMKLQkgKiBAcGFyYW0gYWN0aW9uTWdyIHVzZSB0aGlzIElBY3Rpb25NYW5hZ2VyIHRvIGNoYW5nZSB0aGUgTWV0aG9kQ29uZmlndXJhdGlvbiwgaWYgbnVsbCB3aWxsIGNoYW5nZSB0aGUgTWV0aG9kQ29uZmlndXJhdGlvbiBkaXJlY3RseS4KLQkgKiBAcGFyYW0gY29uZmlnCi0JICogQHBhcmFtIHZhbHVlCi0JICogQHJldHVybiBmYWxzZSBpZiBhY3Rpb25NYW5hZ2VyIG9yIGxpc3QgbWFuaXB1bGF0aW9uIGZhaWxzLCB0cnVlIG90aGVyd2lzZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiByZW1vdmVDb2xsRnJvbUFkZGVkQ2F0ZWdvcnlMaXN0KElBY3Rpb25NYW5hZ2VyIGFjdGlvbk1nciwgTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcsIENvbGxlY3Rpb24gdmFsdWUpIHsKLQkJcmV0dXJuIGFjdGlvbk9uQ29sbGVjdGlvbihhY3Rpb25NZ3IsIGNvbmZpZywgdmFsdWUsIElBY3Rpb25NYW5hZ2VyLlJFTU9WRV9NQU5ZLCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRNZXRob2RDb25maWd1cmF0aW9uX0FkZGVkQ2F0ZWdvcnkoKSwgY29uZmlnLmdldEFkZGVkQ2F0ZWdvcnkoKSk7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlcyB0aGUgZ2l2ZW4gQ29udGVudENhdGVnb3J5IGZyb20gdGhlIE1ldGhvZENvbmZpZ3VyYXRpb24ncyBsaXN0IG9mIHNlbGVjdGVkIGFkZGVkLWNhdGVnb3JpZXMKLQkgKiBAcGFyYW0gYWN0aW9uTWdyIHVzZSB0aGlzIElBY3Rpb25NYW5hZ2VyIHRvIGNoYW5nZSB0aGUgTWV0aG9kQ29uZmlndXJhdGlvbiwgaWYgbnVsbCB3aWxsIGNoYW5nZSB0aGUgTWV0aG9kQ29uZmlndXJhdGlvbiBkaXJlY3RseS4KLQkgKiBAcGFyYW0gY29uZmlnCi0JICogQHBhcmFtIHZhbHVlCi0JICogQHJldHVybiBmYWxzZSBpZiBhY3Rpb25NYW5hZ2VyIG9yIGxpc3QgbWFuaXB1bGF0aW9uIGZhaWxzLCB0cnVlIG90aGVyd2lzZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiByZW1vdmVGcm9tQWRkZWRDYXRlZ29yeUxpc3QoSUFjdGlvbk1hbmFnZXIgYWN0aW9uTWdyLCBNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZywgQ29udGVudENhdGVnb3J5IHZhbHVlKSB7Ci0JCXJldHVybiBhY3Rpb25Pbkl0ZW0oYWN0aW9uTWdyLCBjb25maWcsIHZhbHVlLCBJQWN0aW9uTWFuYWdlci5SRU1PVkUsIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldE1ldGhvZENvbmZpZ3VyYXRpb25fQWRkZWRDYXRlZ29yeSgpLCBjb25maWcuZ2V0QWRkZWRDYXRlZ29yeSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIHRoZSBnaXZlbiBjb2xsZWN0aW9uIHRvIHRoZSBNZXRob2RDb25maWd1cmF0aW9uJ3MgbGlzdCBvZiBzZWxlY3RlZCBzdWJ0cmFjdGVkLWNhdGVnb3JpZXMKLQkgKiBAcGFyYW0gYWN0aW9uTWdyIHVzZSB0aGlzIElBY3Rpb25NYW5hZ2VyIHRvIGNoYW5nZSB0aGUgTWV0aG9kQ29uZmlndXJhdGlvbiwgaWYgbnVsbCB3aWxsIGNoYW5nZSB0aGUgTWV0aG9kQ29uZmlndXJhdGlvbiBkaXJlY3RseS4KLQkgKiBAcGFyYW0gY29uZmlnCi0JICogQHBhcmFtIHZhbHVlCi0JICogQHJldHVybiBmYWxzZSBpZiBhY3Rpb25NYW5hZ2VyIG9yIGxpc3QgbWFuaXB1bGF0aW9uIGZhaWxzLCB0cnVlIG90aGVyd2lzZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBhZGRDb2xsVG9TdWJ0cmFjdGVkQ2F0ZWdvcnlMaXN0KElBY3Rpb25NYW5hZ2VyIGFjdGlvbk1nciwgTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcsIENvbGxlY3Rpb24gdmFsdWUpIHsKLQkJcmV0dXJuIGFjdGlvbk9uQ29sbGVjdGlvbihhY3Rpb25NZ3IsIGNvbmZpZywgdmFsdWUsIElBY3Rpb25NYW5hZ2VyLkFERF9NQU5ZLCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRNZXRob2RDb25maWd1cmF0aW9uX1N1YnRyYWN0ZWRDYXRlZ29yeSgpLCBjb25maWcuZ2V0U3VidHJhY3RlZENhdGVnb3J5KCkpOwotCX0KLQkKLQkvKioKLQkgKiBBZGRzIHRoZSBnaXZlbiBDb250ZW50Q2F0ZWdvcnkgdG8gdGhlIE1ldGhvZENvbmZpZ3VyYXRpb24ncyBsaXN0IG9mIHNlbGVjdGVkIHN1YnRyYWN0ZWQtY2F0ZWdvcmllcwotCSAqIEBwYXJhbSBhY3Rpb25NZ3IgdXNlIHRoaXMgSUFjdGlvbk1hbmFnZXIgdG8gY2hhbmdlIHRoZSBNZXRob2RDb25maWd1cmF0aW9uLCBpZiBudWxsIHdpbGwgY2hhbmdlIHRoZSBNZXRob2RDb25maWd1cmF0aW9uIGRpcmVjdGx5LgotCSAqIEBwYXJhbSBjb25maWcKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiBAcmV0dXJuIGZhbHNlIGlmIGFjdGlvbk1hbmFnZXIgb3IgbGlzdCBtYW5pcHVsYXRpb24gZmFpbHMsIHRydWUgb3RoZXJ3aXNlCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGFkZFRvU3VidHJhY3RlZENhdGVnb3J5TGlzdChJQWN0aW9uTWFuYWdlciBhY3Rpb25NZ3IsIE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnLCBDb250ZW50Q2F0ZWdvcnkgdmFsdWUpIHsKLQkJcmV0dXJuIGFjdGlvbk9uSXRlbShhY3Rpb25NZ3IsIGNvbmZpZywgdmFsdWUsIElBY3Rpb25NYW5hZ2VyLkFERCwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0TWV0aG9kQ29uZmlndXJhdGlvbl9TdWJ0cmFjdGVkQ2F0ZWdvcnkoKSwgY29uZmlnLmdldFN1YnRyYWN0ZWRDYXRlZ29yeSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmVzIHRoZSBnaXZlbiBjb2xsZWN0aW9uIGZyb20gdGhlIE1ldGhvZENvbmZpZ3VyYXRpb24ncyBsaXN0IG9mIHNlbGVjdGVkIHN1YnRyYWN0ZWQtY2F0ZWdvcmllcwotCSAqIEBwYXJhbSBhY3Rpb25NZ3IgdXNlIHRoaXMgSUFjdGlvbk1hbmFnZXIgdG8gY2hhbmdlIHRoZSBNZXRob2RDb25maWd1cmF0aW9uLCBpZiBudWxsIHdpbGwgY2hhbmdlIHRoZSBNZXRob2RDb25maWd1cmF0aW9uIGRpcmVjdGx5LgotCSAqIEBwYXJhbSBjb25maWcKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiBAcmV0dXJuIGZhbHNlIGlmIGFjdGlvbk1hbmFnZXIgb3IgbGlzdCBtYW5pcHVsYXRpb24gZmFpbHMsIHRydWUgb3RoZXJ3aXNlCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHJlbW92ZUNvbGxGcm9tU3VidHJhY3RlZENhdGVnb3J5TGlzdChJQWN0aW9uTWFuYWdlciBhY3Rpb25NZ3IsIE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnLCBDb2xsZWN0aW9uIHZhbHVlKSB7Ci0JCXJldHVybiBhY3Rpb25PbkNvbGxlY3Rpb24oYWN0aW9uTWdyLCBjb25maWcsIHZhbHVlLCBJQWN0aW9uTWFuYWdlci5SRU1PVkVfTUFOWSwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0TWV0aG9kQ29uZmlndXJhdGlvbl9TdWJ0cmFjdGVkQ2F0ZWdvcnkoKSwgY29uZmlnLmdldFN1YnRyYWN0ZWRDYXRlZ29yeSgpKTsKLQl9Ci0JCi0JLyoqCi0JICogUmVtb3ZlcyB0aGUgZ2l2ZW4gQ29udGVudENhdGVnb3J5IGZyb20gdGhlIE1ldGhvZENvbmZpZ3VyYXRpb24ncyBsaXN0IG9mIHNlbGVjdGVkIHN1YnRyYWN0ZWQtY2F0ZWdvcmllcwotCSAqIEBwYXJhbSBhY3Rpb25NZ3IgdXNlIHRoaXMgSUFjdGlvbk1hbmFnZXIgdG8gY2hhbmdlIHRoZSBNZXRob2RDb25maWd1cmF0aW9uLCBpZiBudWxsIHdpbGwgY2hhbmdlIHRoZSBNZXRob2RDb25maWd1cmF0aW9uIGRpcmVjdGx5LgotCSAqIEBwYXJhbSBjb25maWcKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiBAcmV0dXJuIGZhbHNlIGlmIGFjdGlvbk1hbmFnZXIgb3IgbGlzdCBtYW5pcHVsYXRpb24gZmFpbHMsIHRydWUgb3RoZXJ3aXNlCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHJlbW92ZUZyb21TdWJ0cmFjdGVkQ2F0ZWdvcnlMaXN0KElBY3Rpb25NYW5hZ2VyIGFjdGlvbk1nciwgTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcsIENvbnRlbnRDYXRlZ29yeSB2YWx1ZSkgewotCQlyZXR1cm4gYWN0aW9uT25JdGVtKGFjdGlvbk1nciwgY29uZmlnLCB2YWx1ZSwgSUFjdGlvbk1hbmFnZXIuUkVNT1ZFLCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRNZXRob2RDb25maWd1cmF0aW9uX1N1YnRyYWN0ZWRDYXRlZ29yeSgpLCBjb25maWcuZ2V0U3VidHJhY3RlZENhdGVnb3J5KCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9Db25zdHJhaW50TWFuYWdlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL0NvbnN0cmFpbnRNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmYzYyMDIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL0NvbnN0cmFpbnRNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnN0cmFpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hRmFjdG9yeTsKLQotCi0vKioKLSAqIEhlbHBlciBjbGFzcyB0aGF0IG1hbmFnZXMgdGhlIHVzZSBvZiBDb250cmFpbnQgaW4gbGlicmFyeSB0byBzdG9yZQotICogaW1wbGVtZW50YXRpb24tc3BlY2lmaWMgZGF0YQotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZSAtIERlYyAxLCAyMDA1Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBDb25zdHJhaW50TWFuYWdlciB7Ci0JLyoqIENvbnN0YW50cyBmb3IgY29udHJhaW4gbmFtZSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDSVRJVllfRElBR1JBTSA9ICJkaWFncmFtIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPQ0VTU19TVVBQUkVTU0lPTiA9ICIiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENvbnN0cmFpbnQgZ2V0Q29uc3RyYWludChNZXRob2RFbGVtZW50IGUsCi0JCQlTdHJpbmcgY29uc3RyYWludE5hbWUsIGJvb2xlYW4gY3JlYXRlKSB7Ci0JCWlmIChjb25zdHJhaW50TmFtZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlDb25zdHJhaW50IGNvbnN0cmFpbnQgPSBudWxsOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBlLmdldE93bmVkUnVsZXMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCUNvbnN0cmFpbnQgYyA9IChDb25zdHJhaW50KSBpdGVyLm5leHQoKTsKLQkJCWlmIChjLmdldE5hbWUoKS5lcXVhbHMoY29uc3RyYWludE5hbWUpKSB7Ci0JCQkJY29uc3RyYWludCA9IGM7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJaWYgKGNvbnN0cmFpbnQgPT0gbnVsbCAmJiBjcmVhdGUpIHsKLQkJCWNvbnN0cmFpbnQgPSBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVDb25zdHJhaW50KCk7Ci0JCQljb25zdHJhaW50LnNldE5hbWUoY29uc3RyYWludE5hbWUpOwotCQkJZS5nZXRPd25lZFJ1bGVzKCkuYWRkKGNvbnN0cmFpbnQpOwotCQl9Ci0JCXJldHVybiBjb25zdHJhaW50OwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9Db250ZW50RWxlbWVudEluaGVyaXRhbmNlSGVscGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvQ29udGVudEVsZW1lbnRJbmhlcml0YW5jZUhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NzRkMzliLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9Db250ZW50RWxlbWVudEluaGVyaXRhbmNlSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5BYnN0cmFjdFRyZWVJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlNlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5Bc3NvY2lhdGlvbkhlbHBlcjsKLQotCi0vKioKLSAqIFRoaXMgY2xhc3MgZGVmaW5lcyBzdGF0aWMgaGVscGVyIG1ldGhvZHMgdGhhdCBhcmUgcmVsYXRlZCB0byBjb250ZW50IGVsZW1lbnQKLSAqIGluaGVyaXRhbmNlLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgQ29udGVudEVsZW1lbnRJbmhlcml0YW5jZUhlbHBlciB7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgTGlzdCBkZXNjZW5kaW5nU29ydEJ5Q3JlYXRpb25UaW1lKExpc3QgdGFza3MpIHsKLQkJcmV0dXJuIHRhc2tzOwotCX0KLQotCS8vIHByaXZhdGUgc3RhdGljIHZvaWQgYWRkU3RlcHMoTGlzdCBzdGVwcywgVGFzayBiYXNlKSB7Ci0JLy8gT2JqZWN0IGZpcnN0ID0gbnVsbDsKLQkvLyBpZighc3RlcHMuaXNFbXB0eSgpKSB7Ci0JLy8gZmlyc3QgPSBzdGVwcy5nZXQoMCk7Ci0JLy8gfQotCS8vIExpc3QgdGFza3MgPSBBc3NvY2lhdGlvbkhlbHBlci5nZXRJbW1lZGlhdGVWYXJpZXRpZXMoYmFzZSk7Ci0JLy8gaW50IHNpemUgPSB0YXNrcy5zaXplKCk7Ci0JLy8gZm9yKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCS8vIFRhc2sgdGFzayA9IChUYXNrKSB0YXNrcy5nZXQoaSk7Ci0JLy8gTGlzdCBzZWN0aW9ucyA9IHRhc2suZ2V0UHJlc2VudGF0aW9uKCkuZ2V0U2VjdGlvbnMoKTsKLQkvLyBpbnQgbnVtT2ZTZWN0aW9ucyA9IHNlY3Rpb25zLnNpemUoKTsKLQkvLyBTZWN0aW9uIHByZXYgPSBudWxsOwotCS8vIGZvciAoaW50IGogPSAwOyBqIDwgbnVtT2ZTZWN0aW9uczsgaisrKSB7Ci0JLy8gU2VjdGlvbiBzZWN0aW9uID0gKFNlY3Rpb24pIHNlY3Rpb25zLmdldChqKTsKLQkvLyBTZWN0aW9uIHByZWQgPSBzZWN0aW9uLmdldFByZWRlY2Vzc29yKCk7Ci0JLy8gaWYocHJlZCA9PSBudWxsKSB7Ci0JLy8gfQotCS8vIH0KLQkvLyB9Ci0JLy8gfQotCi0JLyoqCi0JICogR2V0cyBhbGwgc3RlcHMgaW4gdGhlIHRhc2sgdHJlZSB0aGF0IHRoZSBnaXZlbiB0YXNrIGJlbG9uZ3MgdG8KLQkgKiAKLQkgKiBAcGFyYW0gdGFzawotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3QgZ2V0QWxsVGFza1N0ZXBzKFRhc2sgdGFzaykgewotCQlUYXNrIGJhc2UgPSAoVGFzaykgVG5nVXRpbC5nZXRCYXNlKHRhc2spOwotCQlMaXN0IHN0ZXBzID0gbmV3IEFycmF5TGlzdChiYXNlLmdldFByZXNlbnRhdGlvbigpLmdldFNlY3Rpb25zKCkpOwotCQlJdGVyYXRvciB0YXNrcyA9IG5ldyBBYnN0cmFjdFRyZWVJdGVyYXRvcihiYXNlLCBmYWxzZSkgewotCi0JCQlwcm90ZWN0ZWQgSXRlcmF0b3IgZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQkJCXJldHVybiBBc3NvY2lhdGlvbkhlbHBlci5nZXRJbW1lZGlhdGVWYXJpZXRpZXMoCi0JCQkJCQkoVmFyaWFiaWxpdHlFbGVtZW50KSBvYmplY3QpLml0ZXJhdG9yKCk7Ci0JCQl9Ci0KLQkJfTsKLQkJVGFzayBjdXJyZW50QmFzZSA9IGJhc2U7Ci0JCXdoaWxlICh0YXNrcy5oYXNOZXh0KCkpIHsKLQkJCVRhc2sgdCA9IChUYXNrKSB0YXNrcy5uZXh0KCk7Ci0JCQlpZiAoY3VycmVudEJhc2UgIT0gdC5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkpIHsKLQkJCQkvLyBuZXcgaW5oZXJpdGFuY2UgbGV2ZWwKLQkJCQkvLwotCQkJCWN1cnJlbnRCYXNlID0gKFRhc2spIHQuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpOwotCi0JCQl9Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB0LmdldFByZXNlbnRhdGlvbigpLmdldFNlY3Rpb25zKCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCVNlY3Rpb24gcyA9IChTZWN0aW9uKSBpdGVyLm5leHQoKTsKLQkJCQlTZWN0aW9uIHByZWQgPSBzLmdldFByZWRlY2Vzc29yKCk7Ci0JCQkJaWYgKHByZWQgIT0gbnVsbCkgewotCi0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBzdGVwczsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9Db250ZW50RWxlbWVudExpc3QuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9Db250ZW50RWxlbWVudExpc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDRmNDA4Yy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvQ29udGVudEVsZW1lbnRMaXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQWJzdHJhY3RUcmVlSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50UGFja2FnZTsKLQotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBDb250ZW50RWxlbWVudExpc3QgewotCi0JcHJpdmF0ZSBDb250ZW50UGFja2FnZSBjb250ZW50UGtnOwotCi0JcHJvdGVjdGVkIGNsYXNzIEVsZW1lbnRJdGVyYXRvciBleHRlbmRzIEFic3RyYWN0VHJlZUl0ZXJhdG9yIHsKLQotCQkvKioKLQkJICogQ29tbWVudCBmb3IgPGNvZGU+c2VyaWFsVmVyc2lvblVJRDwvY29kZT4KLQkJICovCi0JCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC0yMjkxNDM4OTcwMTIzOTg1OTA2TDsKLQotCQlwcm90ZWN0ZWQgRWxlbWVudEl0ZXJhdG9yKCkgewotCQkJc3VwZXIoY29udGVudFBrZywgZmFsc2UpOwotCQl9Ci0JCQotCQlwcm90ZWN0ZWQgTGlzdCBnZXRDaGlsZHJlbkxpc3QoT2JqZWN0IG9iamVjdCkgewotCQkJQXJyYXlMaXN0IGNoaWxkcmVuID0gbmV3IEFycmF5TGlzdCgpOwotCQkJaWYob2JqZWN0IGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UpIHsKLQkJCQlDb250ZW50UGFja2FnZSBwa2cgPSAoQ29udGVudFBhY2thZ2UpIG9iamVjdDsKLQkJCQljaGlsZHJlbi5hZGRBbGwocGtnLmdldENoaWxkUGFja2FnZXMoKSk7Ci0JCQkJTGlzdCBlbGVtZW50cyA9IHBrZy5nZXRDb250ZW50RWxlbWVudHMoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGVsZW1lbnRzLnNpemUoKTsgaSsrKSB7Ci0JCQkJCU9iamVjdCBvYmogPSBlbGVtZW50cy5nZXQoaSk7Ci0JCQkJCWlmIChhY2NlcHQob2JqKSkgewotCQkJCQkJY2hpbGRyZW4uYWRkKG9iaik7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gY2hpbGRyZW47Ci0JCX0KLQotCQkvKiAobm9uLUphdmFkb2MpCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkFic3RyYWN0VHJlZUl0ZXJhdG9yI2dldENoaWxkcmVuKGphdmEubGFuZy5PYmplY3QpCi0JCSAqLwotCQlwcm90ZWN0ZWQgSXRlcmF0b3IgZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQkJcmV0dXJuIGdldENoaWxkcmVuTGlzdChvYmplY3QpLml0ZXJhdG9yKCk7Ci0JCX0KLQkJCi0JfTsKLQkKLQlwdWJsaWMgQ29udGVudEVsZW1lbnRMaXN0KENvbnRlbnRQYWNrYWdlIGNvbnRlbnRQa2cpIHsKLQkJdGhpcy5jb250ZW50UGtnID0gY29udGVudFBrZzsKLQl9Ci0KLQlwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBhY2NlcHQoT2JqZWN0IG9iaik7Ci0KLQlwcm90ZWN0ZWQgSXRlcmF0b3IgZWxlbWVudEl0ZXJhdG9yKCkgewotCQlyZXR1cm4gbmV3IEVsZW1lbnRJdGVyYXRvcigpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgZ2V0QWxsRWxlbWVudHMoQ29udGVudFBhY2thZ2UgcGtnLCBMaXN0IGxpc3QpIHsKLS8vCQlMaXN0IGVsZW1lbnRzID0gcGtnLmdldENvbnRlbnRFbGVtZW50cygpOwotLy8JCWZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMuc2l6ZSgpOyBpKyspIHsKLS8vCQkJT2JqZWN0IG9iaiA9IGVsZW1lbnRzLmdldChpKTsKLS8vCQkJaWYgKGFjY2VwdChvYmopKSB7Ci0vLwkJCQlsaXN0LmFkZChvYmopOwotLy8JCQl9Ci0vLwkJfQotLy8JCUxpc3QgcGFja2FnZXMgPSBwa2cuZ2V0Q2hpbGRQYWNrYWdlcygpOwotLy8JCWZvciAoaW50IGkgPSAwOyBpIDwgcGFja2FnZXMuc2l6ZSgpOyBpKyspIHsKLS8vCQkJT2JqZWN0IG9iaiA9IHBhY2thZ2VzLmdldChpKTsKLS8vCQkJaWYgKG9iaiBpbnN0YW5jZW9mIENvbnRlbnRQYWNrYWdlKSB7Ci0vLwkJCQlnZXRBbGxFbGVtZW50cygoQ29udGVudFBhY2thZ2UpIG9iaiwgbGlzdCk7Ci0vLwkJCX0KLS8vCQl9Ci0JCQotCQlmb3IoSXRlcmF0b3IgaXRlciA9IGVsZW1lbnRJdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlID0gaXRlci5uZXh0KCk7Ci0JCQlpZighKGUgaW5zdGFuY2VvZiBDb250ZW50UGFja2FnZSkpIHsKLQkJCQlsaXN0LmFkZChlKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyBMaXN0IGdldExpc3QoKSB7Ci0JCUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZ2V0QWxsRWxlbWVudHMoY29udGVudFBrZywgbGlzdCk7Ci0JCXJldHVybiBsaXN0OwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL0NvbnRlbnRFbGVtZW50T3JkZXJMaXN0LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvQ29udGVudEVsZW1lbnRPcmRlckxpc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTI2YTA2Zi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvQ29udGVudEVsZW1lbnRPcmRlckxpc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxMiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWw7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRIYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5BYnN0cmFjdFRyZWVJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQmFzaWNFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLlhNTFJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5tb2RlbC5Nb2RlbEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLm1vZGVsLk9yZGVySW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwubW9kZWwuT3JkZXJJbmZvQ29sbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwubW9kZWwudXRpbC5TdHJpbmdSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaWJhYmxlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQXNzb2NpYXRpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci0KLS8qKgotICogCi0gKiBUaGlzIGNsYXNzIGVuY2Fwc3VsYXRlcyBhbGwgdGhlIGxvZ2ljcyB1c2VkIHRvIHJldHJpZXZlIHRoZSBsaXN0IG9mIGFsbAotICogY29udHJpYnV0ZWQvaW5oZXJpdGVkIHNlY3Rpb25zIG9mIHRoZSBnaXZlbiBlbGVtZW50IGFzIHdlbGwgYXMgYWxsb3dzCi0gKiBtYW5pcHVsYXRlIHRoaXMgbGlzdC4KLSAqIAotICogMS41OiBSZWZhY3RvcmVkIHRvIHdvcmsgb24gYW55IFZhcmlhYmlsaXR5RWxlbWVudAotICogCi0gKiBAYXV0aG9yIExva2FuYXRoIEphZ2dhCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQ29udGVudEVsZW1lbnRPcmRlckxpc3QgZXh0ZW5kcyBCYXNpY0VMaXN0IHsKLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDMyNTc1NzI3OTc0ODcwNjkyMzNMOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1JERVJfSU5GT19OQU1FID0gImNvbnRlbnQgZWxlbWVudHMiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXAgREVGQVVMVF9TQVZFX09QVElPTlMgPSBuZXcgSGFzaE1hcCgpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09OVEVOVF9FTEVNRU5UU19fRk9SX0VMRU1FTlRfT05MWSA9IDE7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT05URU5UX0VMRU1FTlRTX19GT1JfRUxFTUVOVF9BTkRfUEFSRU5UUyA9IDI7Ci0KLQlzdGF0aWMgewotCQlERUZBVUxUX1NBVkVfT1BUSU9OUy5wdXQoWE1MUmVzb3VyY2UuT1BUSU9OX0VOQ09ESU5HLCAiQVNDSUkiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByaXZhdGUgVmFyaWFiaWxpdHlFbGVtZW50IGVkaXRFbGVtZW50OwotCi0JcHJpdmF0ZSBib29sZWFuIG1peGVkID0gdHJ1ZTsKLQotCXByaXZhdGUgYm9vbGVhbiBjaGFuZ2VkID0gZmFsc2U7Ci0KLQlwcml2YXRlIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlOwotCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0NvbnRyaWJ1dG9yKFZhcmlhYmlsaXR5RWxlbWVudCBlKSB7Ci0JCXJldHVybiBUbmdVdGlsLmlzQ29udHJpYnV0b3IoZSk7Ci0JfQotCi0JcHVibGljIENvbnRlbnRFbGVtZW50T3JkZXJMaXN0KFZhcmlhYmlsaXR5RWxlbWVudCBlLCBpbnQgc2NvcGUsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKSB7Ci0JCXRoaXMuZmVhdHVyZSA9IGZlYXR1cmU7Ci0JCWVkaXRFbGVtZW50ID0gZTsKLQkJaWYgKHNjb3BlID09IENPTlRFTlRfRUxFTUVOVFNfX0ZPUl9FTEVNRU5UX09OTFkpIHsKLQkJCW1peGVkID0gZmFsc2U7Ci0JCX0gZWxzZSBpZiAoc2NvcGUgPT0gQ09OVEVOVF9FTEVNRU5UU19fRk9SX0VMRU1FTlRfQU5EX1BBUkVOVFMpIHsKLQkJCWNhbGN1bGF0ZVBhcmVudHNPbmx5KGUpOwotCQl9IGVsc2UgewotCQkJbWl4ZWQgPSBmYWxzZTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBjYWxjdWxhdGVQYXJlbnRzT25seShWYXJpYWJpbGl0eUVsZW1lbnQgZSkgewotCQlJdGVyYXRvciBpdGVyID0gbnVsbDsKLQkJaWYgKGlzQ29udHJpYnV0b3IoZSkgfHwgaXNFeHRlbmRlZChlKSkgewotCQkJTGlzdCBzdXBlcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlVbWFVdGlsLmdldEFsbFN1cGVyc0JvdGgoc3VwZXJzLCBlLAotCQkJCQlWYXJpYWJpbGl0eVR5cGUuQ09OVFJJQlVURVMsCi0JCQkJCVZhcmlhYmlsaXR5VHlwZS5FWFRFTkRTKTsKLQkJCXN1cGVycy5hZGQoZSk7Ci0JCQlpdGVyID0gc3VwZXJzLml0ZXJhdG9yKCk7Ci0JCX0gZWxzZSB7Ci0JCQltaXhlZCA9IGZhbHNlOwotCQl9Ci0KLQkJaWYgKG1peGVkKSB7Ci0JCQkvLyBjcmVhdGUgYSBtYXAgb2YgR1VJRCAvIGNvbnRyaWJ1dG9yIAotCQkJCi0JCQlPcmRlckluZm8gbGF0ZXN0SW5mbyA9IG51bGw7Ci0JCQlNYXAgZ3VpZE1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCQlTZXQgZWxlbWVudHMgPSBuZXcgTGlua2VkSGFzaFNldCgpOwotCQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQkJVmFyaWFiaWxpdHlFbGVtZW50IGVsZW1lbnQgPSAoVmFyaWFiaWxpdHlFbGVtZW50KSBpdGVyLm5leHQoKTsKLQkJCQlMaXN0IGNvbnRlbnRFbGVtZW50cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQlPYmplY3QgZUdldCA9ICgoVmFyaWFiaWxpdHlFbGVtZW50KSBlbGVtZW50KS5lR2V0KGZlYXR1cmUpOwotCQkJCWlmIChlR2V0IGluc3RhbmNlb2YgTGlzdCkgewotCQkJCQljb250ZW50RWxlbWVudHMuYWRkQWxsKChMaXN0KSBlR2V0KTsKLQkJCQl9Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGNvbnRlbnRFbGVtZW50cy5pdGVyYXRvcigpOyBpdGVyYXRvcgotCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJRGVzY3JpYmFibGVFbGVtZW50IGNhdGVnb3JpemVkRWxlbWVudCA9IChEZXNjcmliYWJsZUVsZW1lbnQpIGl0ZXJhdG9yCi0JCQkJCQkJLm5leHQoKTsKLQkJCQkJZ3VpZE1hcC5wdXQoY2F0ZWdvcml6ZWRFbGVtZW50LmdldEd1aWQoKSwKLQkJCQkJCQljYXRlZ29yaXplZEVsZW1lbnQpOwotCQkJCQllbGVtZW50cy5hZGQoY2F0ZWdvcml6ZWRFbGVtZW50KTsKLQkJCQl9Ci0KLQkJCQlPcmRlckluZm8gb3JkZXJJbmZvID0gVG5nVXRpbC5nZXRPcmRlckluZm8oZWxlbWVudCwKLQkJCQkJCU9SREVSX0lORk9fTkFNRSk7Ci0JCQkJaWYgKG9yZGVySW5mbyAhPSBudWxsKSB7Ci0JCQkJCWlmIChsYXRlc3RJbmZvID09IG51bGwKLQkJCQkJCQl8fCBvcmRlckluZm8uZ2V0VGltZXN0YW1wKCkgPiBsYXRlc3RJbmZvCi0JCQkJCQkJCQkuZ2V0VGltZXN0YW1wKCkpIHsKLQkJCQkJCWxhdGVzdEluZm8gPSBvcmRlckluZm87Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmIChsYXRlc3RJbmZvICE9IG51bGwpIHsKLQkJCQkvLyByZW9yZGVyIHRoZSBzZWN0aW9ucyBiYXNlZCBvbiB0aGUgbGF0ZXN0IG9yZGVyIGluZm8KLQkJCQlpbnQgc2l6ZSA9IGxhdGVzdEluZm8uZ2V0R1VJRHMoKS5zaXplKCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQkJT2JqZWN0IGd1aWQgPSBsYXRlc3RJbmZvLmdldEdVSURzKCkuZ2V0KGkpOwotCQkJCQlPYmplY3QgZWxlbWVudCA9IGd1aWRNYXAuZ2V0KGd1aWQpOwotCQkJCQlpZiAoZWxlbWVudCAhPSBudWxsKSB7Ci0JCQkJCQlzdXBlci5hZGQoZWxlbWVudCk7Ci0JCQkJCQllbGVtZW50cy5yZW1vdmUoZWxlbWVudCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlzdXBlci5hZGRBbGwoZWxlbWVudHMpOwotCQl9Ci0JfQotCi0JLy8gZGVwcmVjYXRlIHRoZSBmb2xsb3dpbmcgY29uc3RydWN0b3IKLQlwdWJsaWMgQ29udGVudEVsZW1lbnRPcmRlckxpc3QoVmFyaWFiaWxpdHlFbGVtZW50IGUpIHsKLQkJZWRpdEVsZW1lbnQgPSBlOwotCQlJdGVyYXRvciBpdGVyID0gbnVsbDsKLQkJaWYgKGlzQ29udHJpYnV0b3IoZSkgfHwgVG5nVXRpbC5oYXNDb250cmlidXRvcihlKSkgewotCQkJVmFyaWFiaWxpdHlFbGVtZW50IGJhc2UgPSBUbmdVdGlsLmdldEJhc2UoZSk7Ci0JCQlpdGVyID0gbmV3IEFic3RyYWN0VHJlZUl0ZXJhdG9yKGJhc2UpIHsKLQotCQkJCXByb3RlY3RlZCBJdGVyYXRvciBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJCUxpc3QgY2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBBc3NvY2lhdGlvbkhlbHBlcgotCQkJCQkJCS5nZXRJbW1lZGlhdGVWYXJpZXRpZXMoKFZhcmlhYmlsaXR5RWxlbWVudCkgb2JqZWN0KQotCQkJCQkJCS5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlWYXJpYWJpbGl0eUVsZW1lbnQgZWxlbWVudCA9IChWYXJpYWJpbGl0eUVsZW1lbnQpIGl0ZXJhdG9yCi0JCQkJCQkJCS5uZXh0KCk7Ci0JCQkJCQlpZiAoZWxlbWVudC5nZXRWYXJpYWJpbGl0eVR5cGUoKSA9PSBWYXJpYWJpbGl0eVR5cGUuQ09OVFJJQlVURVMpIHsKLQkJCQkJCQljaGlsZHJlbi5hZGQoZWxlbWVudCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIGNoaWxkcmVuLml0ZXJhdG9yKCk7Ci0JCQkJfQotCi0JCQl9OwotCQl9IGVsc2UgaWYgKGlzRXh0ZW5kZWQoZSkpIHsKLQkJCVN5c3RlbS5vdXQKLQkJCQkJLnByaW50bG4oIiQkJCBmb3IgIiArIGUuZ2V0TmFtZSgpICsgIiA9IGV4dGVuZGVkIGlzIHRydWUiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlMaXN0IHN1cGVycyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCVVtYVV0aWwuZ2V0QWxsU3VwZXJzKHN1cGVycywgZSwgVmFyaWFiaWxpdHlUeXBlLkVYVEVORFMpOwotCQkJc3VwZXJzLmFkZChlKTsKLQkJCWl0ZXIgPSBzdXBlcnMuaXRlcmF0b3IoKTsKLQkJfSBlbHNlIHsKLQkJCW1peGVkID0gZmFsc2U7Ci0JCX0KLQotCQlpZiAobWl4ZWQpIHsKLQkJCS8vIGNyZWF0ZSBhIG1hcCBvZiBHVUlEIC8gY29udHJpYnV0b3IKLQkJCU9yZGVySW5mbyBsYXRlc3RJbmZvID0gbnVsbDsKLQkJCU1hcCBndWlkTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJCUxpc3QgZWxlbWVudHMgPSBuZXcgTGlua2VkTGlzdCgpOwotCQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQkJVmFyaWFiaWxpdHlFbGVtZW50IGVsZW1lbnQgPSAoVmFyaWFiaWxpdHlFbGVtZW50KSBpdGVyLm5leHQoKTsKLQkJCQlndWlkTWFwLnB1dChlbGVtZW50LmdldEd1aWQoKSwgZWxlbWVudCk7Ci0JCQkJZWxlbWVudHMuYWRkKGVsZW1lbnQpOwotCi0JCQkJT3JkZXJJbmZvIG9yZGVySW5mbyA9IFRuZ1V0aWwuZ2V0T3JkZXJJbmZvKGVsZW1lbnQsCi0JCQkJCQlPUkRFUl9JTkZPX05BTUUpOwotCQkJCWlmIChvcmRlckluZm8gIT0gbnVsbCkgewotCQkJCQlpZiAobGF0ZXN0SW5mbyA9PSBudWxsCi0JCQkJCQkJfHwgb3JkZXJJbmZvLmdldFRpbWVzdGFtcCgpID4gbGF0ZXN0SW5mbwotCQkJCQkJCQkJLmdldFRpbWVzdGFtcCgpKSB7Ci0JCQkJCQlsYXRlc3RJbmZvID0gb3JkZXJJbmZvOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQlpZiAobGF0ZXN0SW5mbyAhPSBudWxsKSB7Ci0JCQkJLy8gcmVvcmRlciB0aGUgc2VjdGlvbnMgYmFzZWQgb24gdGhlIGxhdGVzdCBvcmRlciBpbmZvCi0JCQkJLy8KLQkJCQlpbnQgc2l6ZSA9IGxhdGVzdEluZm8uZ2V0R1VJRHMoKS5zaXplKCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQkJT2JqZWN0IGd1aWQgPSBsYXRlc3RJbmZvLmdldEdVSURzKCkuZ2V0KGkpOwotCQkJCQlPYmplY3QgZWxlbWVudCA9IGd1aWRNYXAuZ2V0KGd1aWQpOwotCQkJCQlpZiAoZWxlbWVudCAhPSBudWxsKSB7Ci0JCQkJCQlzdXBlci5hZGQoZWxlbWVudCk7Ci0JCQkJCQllbGVtZW50cy5yZW1vdmUoZWxlbWVudCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlzdXBlci5hZGRBbGwoZWxlbWVudHMpOwotCQl9Ci0JCS8vIGVsc2UgewotCQkvLyAvLyBhZGRBbGwoZWRpdEVsZW1lbnQuZ2V0UHJlc2VudGF0aW9uKCkuZ2V0U2VjdGlvbnMoKSk7Ci0JCS8vIG1peGVkID0gZmFsc2U7Ci0JCS8vIH0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzRXh0ZW5kZWQoVmFyaWFiaWxpdHlFbGVtZW50IGUpIHsKLQkJcmV0dXJuIGUuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpICE9IG51bGwKLQkJCQkmJiBlLmdldFZhcmlhYmlsaXR5VHlwZSgpID09IFZhcmlhYmlsaXR5VHlwZS5FWFRFTkRTOwotCX0KLQotCS8qKgotCSAqIEFwcGxpZXMgcmVjZW50IGNoYW5nZXMgaW4gdGhlIGxpc3QKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBhcHBseSgpIHsKLQkJaWYgKCFtaXhlZCB8fCAhY2hhbmdlZCkKLQkJCXJldHVybjsKLQotCQkvLyBzYXZlIHRoZSBvcmRlciBpbmZvIHRvIHRoZSBvcmRlcmluZ0d1aWRlIG9mIHRoZSBlZGl0RWxlbWVudAotCQkvLwotCQlTdHJpbmcgc3RyID0gZWRpdEVsZW1lbnQuZ2V0T3JkZXJpbmdHdWlkZSgpOwotCQlPcmRlckluZm9Db2xsZWN0aW9uIG9yZGVySW5mb3MgPSBudWxsOwotCQlTdHJpbmdSZXNvdXJjZSByZXMgPSBudWxsOwotCQlpZiAoc3RyID09IG51bGwgfHwgc3RyLmxlbmd0aCgpID09IDApIHsKLQkJCW9yZGVySW5mb3MgPSBNb2RlbEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZU9yZGVySW5mb0NvbGxlY3Rpb24oKTsKLQkJfSBlbHNlIHsKLQkJCXJlcyA9IG5ldyBTdHJpbmdSZXNvdXJjZShzdHIpOwotCQkJdHJ5IHsKLQkJCQlyZXMubG9hZChudWxsKTsKLQkJCQlpZiAocmVzLmdldENvbnRlbnRzKCkuaXNFbXB0eSgpKSB7Ci0JCQkJCW9yZGVySW5mb3MgPSBNb2RlbEZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJCQkJLmNyZWF0ZU9yZGVySW5mb0NvbGxlY3Rpb24oKTsKLQkJCQl9IGVsc2UgewotCQkJCQlvcmRlckluZm9zID0gKE9yZGVySW5mb0NvbGxlY3Rpb24pIHJlcy5nZXRDb250ZW50cygpLmdldCgwKTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQkJfQotCi0JCS8vIGZpbmQgdGhlIG9yZGVyIGluZm9yIGZvciBzZWN0aW9ucwotCQkvLwotCQlPcmRlckluZm8gc2VjdE9yZGVySW5mbyA9IG51bGw7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IG9yZGVySW5mb3MuZ2V0T3JkZXJJbmZvcygpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkuaGFzTmV4dCgpOykgewotCQkJT3JkZXJJbmZvIG9yZGVySW5mbyA9IChPcmRlckluZm8pIGl0ZXIubmV4dCgpOwotCQkJaWYgKE9SREVSX0lORk9fTkFNRS5lcXVhbHNJZ25vcmVDYXNlKG9yZGVySW5mby5nZXROYW1lKCkpKSB7Ci0JCQkJc2VjdE9yZGVySW5mbyA9IG9yZGVySW5mbzsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCi0JCWlmIChzZWN0T3JkZXJJbmZvID09IG51bGwpIHsKLQkJCXNlY3RPcmRlckluZm8gPSBNb2RlbEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZU9yZGVySW5mbygpOwotCQkJc2VjdE9yZGVySW5mby5zZXROYW1lKE9SREVSX0lORk9fTkFNRSk7Ci0JCQlvcmRlckluZm9zLmdldE9yZGVySW5mb3MoKS5hZGQoc2VjdE9yZGVySW5mbyk7Ci0JCX0gZWxzZSB7Ci0JCQlzZWN0T3JkZXJJbmZvLmdldEdVSURzKCkuY2xlYXIoKTsKLQkJfQotCi0JCWludCBzaXplID0gc2l6ZSgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJRGVzY3JpYmFibGVFbGVtZW50IHNlY3QgPSAoRGVzY3JpYmFibGVFbGVtZW50KSBnZXQoaSk7Ci0JCQlzZWN0T3JkZXJJbmZvLmdldEdVSURzKCkuYWRkKHNlY3QuZ2V0R3VpZCgpKTsKLQkJfQotCQlzZWN0T3JkZXJJbmZvLnNldFRpbWVzdGFtcChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSk7Ci0JCWlmIChyZXMgPT0gbnVsbCkgewotCQkJcmVzID0gbmV3IFN0cmluZ1Jlc291cmNlKG51bGwpOwotCQkJcmVzLmdldENvbnRlbnRzKCkuYWRkKG9yZGVySW5mb3MpOwotCQl9Ci0JCXRyeSB7Ci0JCQlyZXMuc2F2ZShERUZBVUxUX1NBVkVfT1BUSU9OUyk7Ci0JCQlzdHIgPSByZXMuZ2V0U3RyaW5nKCk7Ci0JCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlNlY3Rpb25MaXN0LmFwcGx5KCk6IG5ldyBvcmRlcmluZyBndWlkZSIpOwotCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCItLS0tLS0gb3JkZXJpbmdHdWlkZSBzdGFydCAtLS0tLS0iKTsKLQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbihzdHIpOwotCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCItLS0tLS0gb3JkZXJpbmdHdWlkZSBlbmQgLS0tLS0tIik7Ci0JCQllZGl0RWxlbWVudC5zZXRPcmRlcmluZ0d1aWRlKHN0cik7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0KLQotCXB1YmxpYyBib29sZWFuIGNhblJlbW92ZShWYXJpYWJpbGl0eUVsZW1lbnQgY29udGVudEVsZW1lbnQpIHsKLQkJaWYgKGVHZXQoKS5jb250YWlucyhjb250ZW50RWxlbWVudCkpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IHJlbW92ZShpbnQgaW5kZXgpIHsKLQkJaWYgKG1peGVkKSB7Ci0JCQlpZiAoIWNhblJlbW92ZSgoVmFyaWFiaWxpdHlFbGVtZW50KSBnZXQoaW5kZXgpKSkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCU9iamVjdCByZW1vdmVkID0gc3VwZXIucmVtb3ZlKGluZGV4KTsKLQkJCWVHZXQoKS5yZW1vdmUocmVtb3ZlZCk7Ci0JCQlyZXR1cm4gcmVtb3ZlZDsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBlR2V0KCkucmVtb3ZlKGluZGV4KTsKLQkJfQotCX0KLQotCXB1YmxpYyBib29sZWFuIHJlbW92ZShPYmplY3QgbykgewotCQlpZiAoIWNhblJlbW92ZSgoVmFyaWFiaWxpdHlFbGVtZW50KSBvKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJaWYgKG1peGVkKSB7Ci0JCQlpZiAoc3VwZXIucmVtb3ZlKG8pKSB7Ci0JCQkJZUdldCgpLnJlbW92ZShvKTsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gZUdldCgpLnJlbW92ZShvKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiByZW1vdmVBbGwoQ29sbGVjdGlvbiBjKSB7Ci0JCWlmIChtaXhlZCkgewotCQkJYm9vbGVhbiBtb2RpZmllZCA9IGZhbHNlOwotCQkJSXRlcmF0b3IgZSA9IGl0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoZS5oYXNOZXh0KCkpIHsKLQkJCQlPYmplY3QgbyA9IGUubmV4dCgpOwotCQkJCWlmIChjLmNvbnRhaW5zKG8pICYmIGNhblJlbW92ZSgoVmFyaWFiaWxpdHlFbGVtZW50KSBvKSkgewotCQkJCQllLnJlbW92ZSgpOwotCQkJCQllR2V0KCkucmVtb3ZlKG8pOwotCQkJCQltb2RpZmllZCA9IHRydWU7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIG1vZGlmaWVkOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIGVHZXQoKS5yZW1vdmVBbGwoYyk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGQoaW50IGluZGV4LCBPYmplY3QgZWxlbWVudCkgewotCQlpZiAobWl4ZWQpIHsKLQkJCXN1cGVyLmFkZChpbmRleCwgZWxlbWVudCk7Ci0JCQllR2V0KCkuYWRkKGVsZW1lbnQpOwotCQkJY2hhbmdlZCA9IHRydWU7Ci0JCX0gZWxzZSB7Ci0JCQllR2V0KCkuYWRkKGluZGV4LCBlbGVtZW50KTsKLQkJfQotCX0KLQotCXB1YmxpYyBib29sZWFuIGFkZChPYmplY3QgbykgewotCQlib29sZWFuIGIgPSBlR2V0KCkuYWRkKG8pOwotCQlpZiAobWl4ZWQpIHsKLQkJCWIgPSBzdXBlci5hZGQobyk7Ci0JCQlpZiAoYikKLQkJCQljaGFuZ2VkID0gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gYjsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBhZGRBbGwoQ29sbGVjdGlvbiBjKSB7Ci0JCWJvb2xlYW4gYiA9IGVHZXQoKS5hZGRBbGwoYyk7Ci0JCTsKLQkJaWYgKG1peGVkKSB7Ci0JCQliID0gc3VwZXIuYWRkQWxsKGMpOwotCQkJaWYgKGIpCi0JCQkJY2hhbmdlZCA9IHRydWU7Ci0JCX0KLQkJcmV0dXJuIGI7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gYWRkQWxsKGludCBpbmRleCwgQ29sbGVjdGlvbiBjKSB7Ci0JCWlmIChtaXhlZCkgewotCQkJZUdldCgpLmFkZEFsbChjKTsKLQkJCTsKLQkJCWJvb2xlYW4gYiA9IHN1cGVyLmFkZEFsbChpbmRleCwgYyk7Ci0JCQlpZiAoYikKLQkJCQljaGFuZ2VkID0gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZUdldCgpLmFkZEFsbChjKTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IHNldChpbnQgaW5kZXgsIE9iamVjdCBlbGVtZW50KSB7Ci0JCWlmIChtaXhlZCkKLQkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCQlyZXR1cm4gZUdldCgpLnNldChpbmRleCwgZWxlbWVudCk7Ci0JfQotCi0JcHVibGljIHZvaWQgY2xlYXIoKSB7Ci0JCWlmIChtaXhlZCkKLQkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCQllR2V0KCkuY2xlYXIoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBtb3ZlKGludCBpbmRleCwgT2JqZWN0IG9iamVjdCkgewotCQlpZiAobWl4ZWQpIHsKLQkJCXN1cGVyLm1vdmUoaW5kZXgsIG9iamVjdCk7Ci0JCQljaGFuZ2VkID0gdHJ1ZTsKLQkJfSBlbHNlIHsKLQkJCSgoRUxpc3QpIGVHZXQoKSkubW92ZShpbmRleCwgb2JqZWN0KTsKLQkJfQotCX0KLQotCXB1YmxpYyBPYmplY3QgbW92ZShpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCkgewotCQlpZiAobWl4ZWQpIHsKLQkJCU9iamVjdCBtb3ZlZCA9IHN1cGVyLm1vdmUodGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsKLQkJCWNoYW5nZWQgPSB0cnVlOwotCQkJcmV0dXJuIG1vdmVkOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIGVHZXQoKS5tb3ZlKHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldChpbnQgaW5kZXgpIHsKLQkJaWYgKG1peGVkKSB7Ci0JCQlyZXR1cm4gc3VwZXIuZ2V0KGluZGV4KTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBlR2V0KCkuZ2V0KGluZGV4KTsKLQkJfQotCX0KLQotCXB1YmxpYyBpbnQgc2l6ZSgpIHsKLQkJaWYgKG1peGVkKSB7Ci0JCQlyZXR1cm4gc3VwZXIuc2l6ZSgpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIGVHZXQoKS5zaXplKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgSXRlcmF0b3IgaXRlcmF0b3IoKSB7Ci0JCWlmIChtaXhlZCkgewotCQkJcmV0dXJuIHN1cGVyLml0ZXJhdG9yKCk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gZUdldCgpLml0ZXJhdG9yKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjb250YWlucyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChtaXhlZCkgewotCQkJcmV0dXJuIHN1cGVyLmNvbnRhaW5zKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGVHZXQoKS5jb250YWlucyhvYmplY3QpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zQWxsKENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlpZiAobWl4ZWQpCi0JCQlyZXR1cm4gc3VwZXIuY29udGFpbnNBbGwoY29sbGVjdGlvbik7Ci0JCXJldHVybiBlR2V0KCkuY29udGFpbnNBbGwoY29sbGVjdGlvbik7Ci0JfQotCi0JcHVibGljIE9iamVjdFtdIHRvQXJyYXkoKSB7Ci0JCWlmIChtaXhlZCkgewotCQkJcmV0dXJuIHN1cGVyLnRvQXJyYXkoKTsKLQkJfQotCQlyZXR1cm4gZUdldCgpLnRvQXJyYXkoKTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0W10gdG9BcnJheShPYmplY3RbXSBhcnJheSkgewotCQlpZiAobWl4ZWQpCi0JCQlyZXR1cm4gc3VwZXIudG9BcnJheShhcnJheSk7Ci0JCXJldHVybiBlR2V0KCkudG9BcnJheShhcnJheSk7Ci0JfQotCi0JcHVibGljIGludCBpbmRleE9mKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKG1peGVkKQotCQkJcmV0dXJuIHN1cGVyLmluZGV4T2Yob2JqZWN0KTsKLQkJcmV0dXJuIGVHZXQoKS5pbmRleE9mKG9iamVjdCk7Ci0JfQotCi0JcHVibGljIGludCBsYXN0SW5kZXhPZihPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChtaXhlZCkKLQkJCXJldHVybiBzdXBlci5sYXN0SW5kZXhPZihvYmplY3QpOwotCQlyZXR1cm4gZUdldCgpLmxhc3RJbmRleE9mKG9iamVjdCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNNaXhlZCgpIHsKLQkJcmV0dXJuIG1peGVkOwotCX0KLQotCXByaXZhdGUgRUxpc3QgZUdldCgpIHsKLQkJRUxpc3QgbGlzdCA9IG51bGw7Ci0JCU9iamVjdCBvYmplY3QgPSBlZGl0RWxlbWVudC5lR2V0KGZlYXR1cmUpOwotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgRUxpc3QpIHsKLQkJCWxpc3QgPSAoRUxpc3QpIG9iamVjdDsKLQkJfQotCQlpZiAobGlzdCA9PSBudWxsKSB7Ci0JCQlsaXN0ID0gbmV3IEJhc2ljRUxpc3QoKTsKLQkJfQotCQlyZXR1cm4gbGlzdDsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvRGVidWdVdGlsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvRGVidWdVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5NmI1ZDUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL0RlYnVnVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsOwotCi1pbXBvcnQgamF2YS5pby5QcmludFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci0KLS8qKgotICogVXRpbGl0eSBjbGFzcyBmb3IgZGVidWcgcHVycG9zZQotICogCi0gKiBAYXV0aG9yIFdlaXBpbmcgTHUKLSAqIEBzaW5jZSAxLjIKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIERlYnVnVXRpbCB7Ci0KLQlwcml2YXRlIHN0YXRpYyBQcmludFN0cmVhbSBvdXRwdXQ7Ci0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHByb21wdCA9ICJMRD4gIjsgCQkJCQkvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldE91dHB1dChQcmludFN0cmVhbSBvcCkgewotCQlvdXRwdXQgPSBvcDsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldFByb21wdChTdHJpbmcgcHQpIHsKLQkJcHJvbXB0ID0gcHQ7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIFByaW50U3RyZWFtIG91dCgpIHsKLQkJaWYgKG91dHB1dCAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gb3V0cHV0OwotCQl9Ci0JCXJldHVybiBTeXN0ZW0ub3V0OwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgcHJpbnQoU3RyaW5nIGJlZ2luVGl0bGUsIFN0cmluZyBlbmRUaXRsZSwgQ29sbGVjdGlvbjw/IGV4dGVuZHMgTWV0aG9kRWxlbWVudD4gZWxlbWVudHMsIGludCBpeCkgewotCQlpZiAoYmVnaW5UaXRsZSAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgc3RyID0gIiI7CQkJCS8vJE5PTi1OTFMtMSQKLQkJCWlmIChlbGVtZW50cyA9PSBudWxsKSB7Ci0JCQkJc3RyID0gIm51bGwiOwkJCQkvLyROT04tTkxTLTEkCi0JCQl9IGVsc2UgaWYgKGVsZW1lbnRzLmlzRW1wdHkoKSkgewotCQkJCXN0ciA9IGVsZW1lbnRzLnRvU3RyaW5nKCk7Ci0JCQl9Ci0JCQlvdXQoKS5wcmludGxuKHByb21wdCArIGJlZ2luVGl0bGUgKyBzdHIpOwotCQl9Ci0JCQotCQlpZiAoZWxlbWVudHMgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWZvciAoSXRlcmF0b3I8PyBleHRlbmRzIE1ldGhvZEVsZW1lbnQ+IGl0ID0gZWxlbWVudHMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJTWV0aG9kRWxlbWVudCBlbGVtZW50ID0gaXQubmV4dCgpOwotCQkJb3V0KCkucHJpbnRsbihwcm9tcHQgKyB0b1N0cmluZyhlbGVtZW50LCBpeCkpOwotCQl9Ci0JCQotCQlpZiAoZW5kVGl0bGUgIT0gbnVsbCkgewotCQkJb3V0KCkucHJpbnRsbihwcm9tcHQgKyBlbmRUaXRsZSk7Ci0JCX0KLQkJb3V0KCkucHJpbnRsbigiIik7CQkJLy8kTk9OLU5MUy0xJAotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0b1N0cmluZyhNZXRob2RFbGVtZW50IGVsZW1lbnQsIGludCBpeCkgewotCQlpZiAoaXggPT0gMSkgewotCQkJcmV0dXJuIFRuZ1V0aWwuZ2V0TGFiZWxXaXRoUGF0aChlbGVtZW50KTsKLQkJfSAKLQkJaWYgKGl4ID09IDIpIHsKLQkJCXJldHVybiBlbGVtZW50LmVDbGFzcygpLmdldE5hbWUoKSArICIsICIgKyAgLy8kTk9OLU5MUy0xJAotCQkJCQllbGVtZW50LmdldEd1aWQoKSArICIsICIgKyBUbmdVdGlsLmdldExhYmVsV2l0aFBhdGgoZWxlbWVudCk7Ly8kTk9OLU5MUy0xJCAKLQkJfQotCQlyZXR1cm4gZWxlbWVudC50b1N0cmluZygpOwotCX0JCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL0RlcHRoTGV2ZWxBZGFwdGVyRmFjdG9yeVRyZWVJdGVyYXRvci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL0RlcHRoTGV2ZWxBZGFwdGVyRmFjdG9yeVRyZWVJdGVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OTY1MTkwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9EZXB0aExldmVsQWRhcHRlckZhY3RvcnlUcmVlSXRlcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5VHJlZUl0ZXJhdG9yOwotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4yCi0gKi8KLXB1YmxpYyBjbGFzcyBEZXB0aExldmVsQWRhcHRlckZhY3RvcnlUcmVlSXRlcmF0b3I8RT4gZXh0ZW5kcwotCQlBZGFwdGVyRmFjdG9yeVRyZWVJdGVyYXRvcjxFPiB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAyNTI3MTc4Mjc3NjIwMDA4MjJMOwotCi0JcHJpdmF0ZSBpbnQgZGVwdGhMZXZlbDsKLQotCXB1YmxpYyBEZXB0aExldmVsQWRhcHRlckZhY3RvcnlUcmVlSXRlcmF0b3IoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksCi0JCQlPYmplY3Qgb2JqZWN0LCBib29sZWFuIGluY2x1ZGVSb290KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5LCBvYmplY3QsIGluY2x1ZGVSb290KTsKLQl9Ci0KLQlwdWJsaWMgRGVwdGhMZXZlbEFkYXB0ZXJGYWN0b3J5VHJlZUl0ZXJhdG9yKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LAotCQkJRSBvYmplY3QpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnksIG9iamVjdCk7Ci0JfQotCi0JcHVibGljIEUgbmV4dCgpIHsKLQkJZGVwdGhMZXZlbCA9IHNpemUoKTsKLQkJcmV0dXJuIHN1cGVyLm5leHQoKTsKLQl9Ci0JCi0JcHVibGljIGludCBnZXREZXB0aExldmVsKCkgewotCQlyZXR1cm4gZGVwdGhMZXZlbDsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvRGlhZ3JhbU9wdGlvbnMuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9EaWFncmFtT3B0aW9ucy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNjBmMTVhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9EaWFncmFtT3B0aW9ucy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudFByb3BlcnR5OwotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKgotICogQHNpbmNlIDEuMgotICovCi1wdWJsaWMgY2xhc3MgRGlhZ3JhbU9wdGlvbnMgewotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QX1BVQkxJU0hfQUQgPSAicHVibGlzaF9hZCI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUF9QVUJMSVNIX0FERCA9ICJwdWJsaXNoX2FkZCI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUF9QVUJMSVNIX1dQREQgPSAicHVibGlzaF93cGRkIjsgLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgdm9pZCBzZXRQdWJsaXNoQUQoQWN0aXZpdHkgYWN0aXZpdHksIGJvb2xlYW4gYil7Ci0JCU1ldGhvZEVsZW1lbnRQcm9wZXJ0eUhlbHBlci5zZXRQcm9wZXJ0eShhY3Rpdml0eSwgUFJPUF9QVUJMSVNIX0FELCBiKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIGlzUHVibGlzaEFEKEFjdGl2aXR5IGFjdGl2aXR5KXsKLQkJTWV0aG9kRWxlbWVudFByb3BlcnR5IHByb3AgPSBNZXRob2RFbGVtZW50UHJvcGVydHlIZWxwZXIuZ2V0UHJvcGVydHkoYWN0aXZpdHksIFBST1BfUFVCTElTSF9BRCk7Ci0JCXJldHVybiBwcm9wICE9IG51bGwgPyBCb29sZWFuLnBhcnNlQm9vbGVhbihwcm9wLmdldFZhbHVlKCkpIDogdHJ1ZTsgCi0JfQotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgdm9pZCBzZXRQdWJsaXNoQUREKEFjdGl2aXR5IGFjdGl2aXR5LCBib29sZWFuIGIpewotCQlNZXRob2RFbGVtZW50UHJvcGVydHlIZWxwZXIuc2V0UHJvcGVydHkoYWN0aXZpdHksIFBST1BfUFVCTElTSF9BREQsIGIpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gaXNQdWJsaXNoQUREKEFjdGl2aXR5IGFjdGl2aXR5KXsKLQkJTWV0aG9kRWxlbWVudFByb3BlcnR5IHByb3AgPSBNZXRob2RFbGVtZW50UHJvcGVydHlIZWxwZXIuZ2V0UHJvcGVydHkoYWN0aXZpdHksIFBST1BfUFVCTElTSF9BREQpOwotCQlyZXR1cm4gcHJvcCAhPSBudWxsID8gQm9vbGVhbi5wYXJzZUJvb2xlYW4ocHJvcC5nZXRWYWx1ZSgpKSA6IHRydWU7IAotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIHZvaWQgc2V0UHVibGlzaFdQREQoQWN0aXZpdHkgYWN0aXZpdHksIGJvb2xlYW4gYil7Ci0JCU1ldGhvZEVsZW1lbnRQcm9wZXJ0eUhlbHBlci5zZXRQcm9wZXJ0eShhY3Rpdml0eSwgUFJPUF9QVUJMSVNIX1dQREQsIGIpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gaXNQdWJsaXNoV1BERChBY3Rpdml0eSBhY3Rpdml0eSl7Ci0JCU1ldGhvZEVsZW1lbnRQcm9wZXJ0eSBwcm9wID0gTWV0aG9kRWxlbWVudFByb3BlcnR5SGVscGVyLmdldFByb3BlcnR5KGFjdGl2aXR5LCBQUk9QX1BVQkxJU0hfV1BERCk7Ci0JCXJldHVybiBwcm9wICE9IG51bGwgPyBCb29sZWFuLnBhcnNlQm9vbGVhbihwcm9wLmdldFZhbHVlKCkpIDogdHJ1ZTsgCi0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL0VkaXRpbmdEb21haW5Db21wb3NlZEFkYXB0ZXJGYWN0b3J5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvRWRpdGluZ0RvbWFpbkNvbXBvc2VkQWRhcHRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzIyYTllNy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvRWRpdGluZ0RvbWFpbkNvbXBvc2VkQWRhcHRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5BZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLklFZGl0aW5nRG9tYWluUHJvdmlkZXI7Ci0KLS8qKgotICogQSBDb25maWd1cmFibGVDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IHRoYXQgaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpblByb3ZpZGVyCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBFZGl0aW5nRG9tYWluQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBleHRlbmRzCi0JCUNvbmZpZ3VyYWJsZUNvbXBvc2VkQWRhcHRlckZhY3RvcnkgaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpblByb3ZpZGVyIHsKLQotCXByaXZhdGUgRWRpdGluZ0RvbWFpbiBlZGl0aW5nRG9tYWluOwotCi0JcHVibGljIEVkaXRpbmdEb21haW5Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KEFkYXB0ZXJGYWN0b3J5W10gYWRhcHRlckZhY3RvcmllcykgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yaWVzKTsKLQl9Ci0KLQlwdWJsaWMgRWRpdGluZ0RvbWFpbiBnZXRFZGl0aW5nRG9tYWluKCkgewotCQlyZXR1cm4gZWRpdGluZ0RvbWFpbjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRFZGl0aW5nRG9tYWluKEVkaXRpbmdEb21haW4gZWRpdGluZ0RvbWFpbikgewotCQl0aGlzLmVkaXRpbmdEb21haW4gPSBlZGl0aW5nRG9tYWluOwotCQlpZiAoZWRpdGluZ0RvbWFpbiBpbnN0YW5jZW9mIEFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbikgewotCQkJKChBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW4pIGVkaXRpbmdEb21haW4pCi0JCQkJCS5zZXRBZGFwdGVyRmFjdG9yeSh0aGlzKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL0V4cG9zZWRBZGFwdGVyRmFjdG9yeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL0V4cG9zZWRBZGFwdGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NTYzOGYwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9FeHBvc2VkQWRhcHRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JUmVmZXJlbmNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuSUNvbHVtbkF3YXJlOwotCi0KLS8qKgotICogQW4gRWRpdGluZ0RvbWFpbkNvbXBvc2VkQWRhcHRlckZhY3RvcnkgdGhhdCBleHBvc2VzIGludGVybmFsIGRhdGEKLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEV4cG9zZWRBZGFwdGVyRmFjdG9yeSBleHRlbmRzIEVkaXRpbmdEb21haW5Db21wb3NlZEFkYXB0ZXJGYWN0b3J5Ci0JCWltcGxlbWVudHMgSUNvbHVtbkF3YXJlLCBJUmVmZXJlbmNlciB7Ci0KLQlwcml2YXRlIE1hcCBjb2x1bW5JbmRleFRvTmFtZU1hcDsKLQotCS8qKgotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yaWVzCi0JICovCi0JcHVibGljIEV4cG9zZWRBZGFwdGVyRmFjdG9yeShBZGFwdGVyRmFjdG9yeVtdIGFkYXB0ZXJGYWN0b3JpZXMpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3Rvcmllcyk7Ci0JfQotCi0JcHVibGljIExpc3QgZ2V0Q2hhbmdlTGlzdGVuZXJzKCkgewotCQlyZXR1cm4gY2hhbmdlTm90aWZpZXI7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLklDb2x1bW5Bd2FyZSNzZXRDb2x1bW5JbmRleFRvTmFtZU1hcChqYXZhLnV0aWwuTWFwKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvbHVtbkluZGV4VG9OYW1lTWFwKE1hcCBtYXApIHsKLQkJY29sdW1uSW5kZXhUb05hbWVNYXAgPSBtYXA7Ci0KLQkJZm9yIChJdGVyYXRvciBpdGVyID0gYWRhcHRlckZhY3Rvcmllcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBhZGFwdGVyRmFjdG9yeSA9IGl0ZXIubmV4dCgpOwotCQkJaWYgKGFkYXB0ZXJGYWN0b3J5IGluc3RhbmNlb2YgSUNvbHVtbkF3YXJlKSB7Ci0JCQkJKChJQ29sdW1uQXdhcmUpIGFkYXB0ZXJGYWN0b3J5KS5zZXRDb2x1bW5JbmRleFRvTmFtZU1hcChtYXApOwotCQkJfQotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLklDb2x1bW5Bd2FyZSNnZXRDb2x1bW5JbmRleFRvTmFtZU1hcCgpCi0JICovCi0JcHVibGljIE1hcCBnZXRDb2x1bW5JbmRleFRvTmFtZU1hcCgpIHsKLQkJcmV0dXJuIGNvbHVtbkluZGV4VG9OYW1lTWFwOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSVJlZmVyZW5jZXIjY2xlYW5VcCgpCi0JICovCi0JcHVibGljIHZvaWQgY2xlYW5VcCgpIHsKLQkJaW50IHNpemUgPSBhZGFwdGVyRmFjdG9yaWVzLnNpemUoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCU9iamVjdCBhZGFwdGVyRmFjdG9yeSA9IGFkYXB0ZXJGYWN0b3JpZXMuZ2V0KGkpOwotCQkJaWYoYWRhcHRlckZhY3RvcnkgaW5zdGFuY2VvZiBJUmVmZXJlbmNlcikgewotCQkJCSgoSVJlZmVyZW5jZXIpYWRhcHRlckZhY3RvcnkpLmNsZWFuVXAoKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSVJlZmVyZW5jZXIjcmVtb3ZlKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIGJvb2xlYW4gcmVtb3ZlKE9iamVjdCByZWYpIHsKLQkJYm9vbGVhbiByZW1vdmVkID0gZmFsc2U7Ci0JCWludCBzaXplID0gYWRhcHRlckZhY3Rvcmllcy5zaXplKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlPYmplY3QgYWRhcHRlckZhY3RvcnkgPSBhZGFwdGVyRmFjdG9yaWVzLmdldChpKTsKLQkJCWlmKGFkYXB0ZXJGYWN0b3J5IGluc3RhbmNlb2YgSVJlZmVyZW5jZXIpIHsKLQkJCQkoKElSZWZlcmVuY2VyKWFkYXB0ZXJGYWN0b3J5KS5yZW1vdmUocmVmKTsKLQkJCQlyZW1vdmVkID0gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVtb3ZlZDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9FeHRlbnNpb25NYW5hZ2VyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvRXh0ZW5zaW9uTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMWU0M2Y1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9FeHRlbnNpb25NYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLkV4dGVuc2lvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JTmVzdGVkQ29tbWFuZFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JVXNlckludGVyYWN0aW9uSGFuZGxlcjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwotCi0vKioKLSAqIEhlbHBlciBjbGFzcyB3aXRoIG1ldGhvZHMgdG8gcmV0cmlldmUgZXh0ZW5zaW9ucwotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZSAtIEp1biAyNywgMjAwNgotICogQHNpbmNlICAxLjAKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEV4dGVuc2lvbk1hbmFnZXIgewotCXByaXZhdGUgc3RhdGljIExpc3Q8SU5lc3RlZENvbW1hbmRQcm92aWRlcj4gbmVzdGVkQ29tbWFuZFByb3ZpZGVyczsKLQlwcml2YXRlIHN0YXRpYyBMaXN0IG9wcG9zaXRlRmVhdHVyZUxvYWRlcnM7Ci0JCi0JcHVibGljIHN0YXRpYyA8VD5MaXN0PFQ+IGdldEV4dGVuc2lvbnMoU3RyaW5nIG5hbWVzcGFjZSwgU3RyaW5nIGV4dGVuc2lvblBvaW50TmFtZSwgQ2xhc3M8VD4gdHlwZSkgewotCQlyZXR1cm4gRXh0ZW5zaW9uSGVscGVyLmdldEV4dGVuc2lvbnMobmFtZXNwYWNlLCBleHRlbnNpb25Qb2ludE5hbWUsIHR5cGUpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIE9iamVjdCBjcmVhdGVFeHRlbnNpb24oU3RyaW5nIG5hbWVzcGFjZSwgU3RyaW5nIGV4dGVuc2lvblBvaW50TmFtZSkgewotCQlyZXR1cm4gRXh0ZW5zaW9uSGVscGVyLmNyZWF0ZUV4dGVuc2lvbihuYW1lc3BhY2UsIGV4dGVuc2lvblBvaW50TmFtZSk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IGdldEV4dGVuc2lvbihTdHJpbmcgbmFtZXNwYWNlLCBTdHJpbmcgZXh0ZW5zaW9uUG9pbnROYW1lKSB7Ci0JCXJldHVybiBFeHRlbnNpb25IZWxwZXIuZ2V0RXh0ZW5zaW9uKG5hbWVzcGFjZSwgZXh0ZW5zaW9uUG9pbnROYW1lKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIElUZXh0UmVmZXJlbmNlUmVwbGFjZXIgZ2V0VGV4dFJlZmVyZW5jZVJlcGxhY2VyKCkgewotCQlyZXR1cm4gKElUZXh0UmVmZXJlbmNlUmVwbGFjZXIpIGdldEV4dGVuc2lvbihMaWJyYXJ5RWRpdFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SWQoKSwgInRleHRSZWZlcmVuY2VSZXBsYWNlciIpOyAvLyROT04tTkxTLTEkIAotCX0KLQotCXB1YmxpYyBzdGF0aWMgTGlzdDxJTmVzdGVkQ29tbWFuZFByb3ZpZGVyPiBnZXROZXN0ZWRDb21tYW5kUHJvdmlkZXJzKCkgewotCQlpZihuZXN0ZWRDb21tYW5kUHJvdmlkZXJzID09IG51bGwpIHsKLQkJCW5lc3RlZENvbW1hbmRQcm92aWRlcnMgPSBnZXRFeHRlbnNpb25zKExpYnJhcnlFZGl0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRJZCgpLCAKLQkJCQkJIm5lc3RlZENvbW1hbmRQcm92aWRlcnMiLCBJTmVzdGVkQ29tbWFuZFByb3ZpZGVyLmNsYXNzKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBuZXN0ZWRDb21tYW5kUHJvdmlkZXJzOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSURpYWdyYW1NYW5hZ2VyIGdldERpYWdyYW1NYW5hZ2VyKCkgewotCQlyZXR1cm4gKElEaWFncmFtTWFuYWdlcikgZ2V0RXh0ZW5zaW9uKExpYnJhcnlFZGl0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRJZCgpLCAiZGlhZ3JhbU1hbmFnZXIiKTsgLy8kTk9OLU5MUy0xJCAKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBMaXN0IGdldE9wcG9zaXRlRmVhdHVyZUxvYWRlcnMoKSB7Ci0JCWlmKG9wcG9zaXRlRmVhdHVyZUxvYWRlcnMgPT0gbnVsbCkgewotCQkJb3Bwb3NpdGVGZWF0dXJlTG9hZGVycyA9IGdldEV4dGVuc2lvbnMoTGlicmFyeUVkaXRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldElkKCksIAotCQkJCQkib3Bwb3NpdGVGZWF0dXJlTG9hZGVycyIsIElOZXN0ZWRDb21tYW5kUHJvdmlkZXIuY2xhc3MpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIG9wcG9zaXRlRmVhdHVyZUxvYWRlcnM7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgSVVzZXJJbnRlcmFjdGlvbkhhbmRsZXIgZ2V0RGVmYXVsdFVzZXJJbnRlcmFjdGlvbkhhbmRsZXIoKSB7Ci0JCXJldHVybiAoSVVzZXJJbnRlcmFjdGlvbkhhbmRsZXIpIGdldEV4dGVuc2lvbihMaWJyYXJ5RWRpdFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SWQoKSwgInVzZXJJbnRlcmFjdGlvbkhhbmRsZXIiKTsgLy8kTk9OLU5MUy0xJAotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvR3JhcGhpY2FsRGF0YS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL0dyYXBoaWNhbERhdGEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Y4ZDMwMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvR3JhcGhpY2FsRGF0YS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsOwotCi1pbXBvcnQgamF2YS5hd3QuRGltZW5zaW9uOwotaW1wb3J0IGphdmEuYXd0LlBvaW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhOb2RlOwotCi0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEdyYXBoaWNhbERhdGEgewotCXByaXZhdGUgUG9pbnQgbG9jYXRpb24gPSBuZXcgUG9pbnQoMCwgMCk7Ci0KLQlwcml2YXRlIERpbWVuc2lvbiBzaXplID0gbmV3IERpbWVuc2lvbigtMSwgLTEpOwotCi0JcHJpdmF0ZSBHcmFwaE5vZGUgZ3JhcGhOb2RlOwotCi0JcHJpdmF0ZSBEaWFncmFtIGRpYWdyYW07Ci0KLQlwdWJsaWMgRGlhZ3JhbSBnZXREaWFncmFtKCkgewotCQlyZXR1cm4gZGlhZ3JhbTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXREaWFncmFtKERpYWdyYW0gZGlhZ3JhbSkgewotCQl0aGlzLmRpYWdyYW0gPSBkaWFncmFtOwotCX0KLQotCXB1YmxpYyBHcmFwaE5vZGUgZ2V0R3JhcGhOb2RlKCkgewotCQlyZXR1cm4gZ3JhcGhOb2RlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEdyYXBoTm9kZShHcmFwaE5vZGUgZ3JhcGhOb2RlKSB7Ci0JCXRoaXMuZ3JhcGhOb2RlID0gZ3JhcGhOb2RlOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgbG9jYXRpb24uCi0JICovCi0JcHVibGljIFBvaW50IGdldExvY2F0aW9uKCkgewotCQlyZXR1cm4gbG9jYXRpb247Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGxvY2F0aW9uCi0JICogICAgICAgICAgICBUaGUgbG9jYXRpb24gdG8gc2V0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldExvY2F0aW9uKFBvaW50IGxvY2F0aW9uKSB7Ci0JCXRoaXMubG9jYXRpb24gPSBsb2NhdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIHNpemUuCi0JICovCi0JcHVibGljIERpbWVuc2lvbiBnZXRTaXplKCkgewotCQlyZXR1cm4gc2l6ZTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gc2l6ZQotCSAqICAgICAgICAgICAgVGhlIHNpemUgdG8gc2V0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNpemUoRGltZW5zaW9uIHNpemUpIHsKLQkJdGhpcy5zaXplID0gc2l6ZTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvSUJyZWFrZG93blN0cnVjdHVyZUFkYXB0ZXJGYWN0b3JpZXMuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9JQnJlYWtkb3duU3RydWN0dXJlQWRhcHRlckZhY3Rvcmllcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOTY2MWI1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9JQnJlYWtkb3duU3RydWN0dXJlQWRhcHRlckZhY3Rvcmllcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci0KLS8qKgotICogSW50ZXJmYWNlIHRvIHByb3ZpZGVzIGEgcmVsYXRlZCBzZXQgb2YgYWRhcHRlciBmYWN0b3JpZXMgZm9yIGJyZWFrZG93bgotICogc3RydWN0dXJlIHZpZXdzCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlIC0gTWFyIDIwLCAyMDA2Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUJyZWFrZG93blN0cnVjdHVyZUFkYXB0ZXJGYWN0b3JpZXMgewotCUFkYXB0ZXJGYWN0b3J5IGdldFdCU0FkYXB0ZXJGYWN0b3J5KCk7Ci0KLQlBZGFwdGVyRmFjdG9yeSBnZXRUQlNBZGFwdGVyRmFjdG9yeSgpOwotCi0JQWRhcHRlckZhY3RvcnkgZ2V0V1BCU0FkYXB0ZXJGYWN0b3J5KCk7Ci0KLQlBZGFwdGVyRmFjdG9yeSBnZXRDQlNBZGFwdGVyRmFjdG9yeSgpOwotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL0lEaWFncmFtTWFuYWdlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL0lEaWFncmFtTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Mjg2OWM0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9JRGlhZ3JhbU1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtOwotCi0vKioKLSAqIE1hbmFnZXMgZGlhZ3JhbXMgb2YgYWN0aXZpdHkKLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUgLSBKdW4gMjcsIDIwMDYKLSAqIEBzaW5jZSAgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSURpYWdyYW1NYW5hZ2VyIHsKLQkvKiogRGlhZ3JhbSB0eXBlIGNvbnN0YW50cyAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFDVElWSVRZX0RJQUdSQU0gPSAwOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV09SS19QUk9EVUNUX0RFUEVOREVOQ1lfRElBR1JBTSA9IDE7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBQ1RJVklUWV9ERVRBSUxfRElBR1JBTSA9IDI7Ci0KLQkvKioKLQkgKiBHZXRzIGRpYWdyYW0gb2YgZ2l2ZW4gdHlwZSBmb3IgdGhlIGdpdmVuIGFjdGl2aXR5Ci0JICogCi0JICogQHBhcmFtIGFjdAotCSAqIEBwYXJhbSB0eXBlIGNhbiBiZSBvbmUgb2YgdGhlIGNvbnN0YW50cyB7QGxpbmsgI0FDVElWSVRZX0RJQUdSQU19LCB7QGxpbmsgI0FDVElWSVRZX0RFVEFJTF9ESUFHUkFNfSwgb3Ige0BsaW5rICNXT1JLX1BST0RVQ1RfREVQRU5ERU5DWV9ESUFHUkFNfQotCSAqIEByZXR1cm4KLQkgKi8KLQlEaWFncmFtIGdldERpYWdyYW0oQWN0aXZpdHkgYWN0LCBpbnQgdHlwZSk7Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvSUxpYnJhcnlJbnNwZWN0b3IuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9JTGlicmFyeUluc3BlY3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNDVkOTI4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9JTGlicmFyeUluc3BlY3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotCi0vKioKLSAqIEludGVyZmFjZSBmb3IgZGVidWcgcHVycG9zZQotICogCi0gKiBAYXV0aG9yIFdlaXBpbmcgTHUgLSBBdWd1c3QgMTEsIDIwMDYKLSAqIEBzaW5jZSAgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUxpYnJhcnlJbnNwZWN0b3IgewotCS8qKgotCSAqIFNob3cgYWxsIGNvbnRlbnRzIG9mIHRoZSBsaWJyYXJ5Ci0JICovCi0Jdm9pZCBzaG93QWxsQ29udGVudHMoKTsKLQkKLQkvKioKLQkgKiBTaG93IGFsbCBjb250ZW50cyBvZiB0aGUgbGlicmFyeQotCSAqLwotCXZvaWQgc2hvd0FsbENvbnRlbnRzKE1ldGhvZExpYnJhcnkgbGliKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvSU9wcG9zaXRlRmVhdHVyZUxvYWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL0lPcHBvc2l0ZUZlYXR1cmVMb2FkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTI3ODllZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvSU9wcG9zaXRlRmVhdHVyZUxvYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLS8qKgotICogT3Bwb3NpdGUgZmVhdHVyZSBsb2FkZXIKLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUgLSBTZXAgMTQsIDIwMDYKLSAqIEBzaW5jZSAgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSU9wcG9zaXRlRmVhdHVyZUxvYWRlciB7Ci0JLyoqCi0JICogTG9hZHMgb3Bwb3NpdGUgZmVhdHVyZXMgZm9yIHRoZSBnaXZlbiBlbGVtZW50cwotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50cwotCSAqLwotCXZvaWQgbG9hZE9wcG9zaXRlRmVhdHVyZXMoQ29sbGVjdGlvbiBlbGVtZW50cyk7Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvSVJ1bm5hYmxlV2l0aFByb2dyZXNzLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvSVJ1bm5hYmxlV2l0aFByb2dyZXNzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViZDJhY2UuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL0lSdW5uYWJsZVdpdGhQcm9ncmVzcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS41Ci0gKgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElSdW5uYWJsZVdpdGhQcm9ncmVzcyB7Ci0gICAgLyoqCi0gICAgICogUnVucyB0aGlzIG9wZXJhdGlvbi4gIFByb2dyZXNzIHNob3VsZCBiZSByZXBvcnRlZCB0byB0aGUgZ2l2ZW4gcHJvZ3Jlc3MgbW9uaXRvci4KLSAgICAgKiBUaGlzIG1ldGhvZCBpcyB1c3VhbGx5IGludm9rZWQgYnkgYW4gPGNvZGU+SVJ1bm5hYmxlQ29udGV4dDwvY29kZT4ncyA8Y29kZT5ydW48L2NvZGU+IG1ldGhvZCwKLSAgICAgKiB3aGljaCBzdXBwbGllcyB0aGUgcHJvZ3Jlc3MgbW9uaXRvci4KLSAgICAgKiBBIHJlcXVlc3QgdG8gY2FuY2VsIHRoZSBvcGVyYXRpb24gc2hvdWxkIGJlIGhvbm9yZWQgYW5kIGFja25vd2xlZGdlZCAKLSAgICAgKiBieSB0aHJvd2luZyA8Y29kZT5JbnRlcnJ1cHRlZEV4Y2VwdGlvbjwvY29kZT4uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbW9uaXRvciB0aGUgcHJvZ3Jlc3MgbW9uaXRvciB0byB1c2UgdG8gZGlzcGxheSBwcm9ncmVzcyBhbmQgcmVjZWl2ZQotICAgICAqICAgcmVxdWVzdHMgZm9yIGNhbmNlbGF0aW9uCi0gICAgICogQGV4Y2VwdGlvbiBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGlmIHRoZSBydW4gbWV0aG9kIG11c3QgcHJvcGFnYXRlIGEgY2hlY2tlZCBleGNlcHRpb24sCi0gICAgICogCWl0IHNob3VsZCB3cmFwIGl0IGluc2lkZSBhbiA8Y29kZT5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uPC9jb2RlPjsgcnVudGltZSBleGNlcHRpb25zIGFyZSBhdXRvbWF0aWNhbGx5Ci0gICAgICogIHdyYXBwZWQgaW4gYW4gPGNvZGU+SW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjwvY29kZT4gYnkgdGhlIGNhbGxpbmcgY29udGV4dAotICAgICAqIEBleGNlcHRpb24gSW50ZXJydXB0ZWRFeGNlcHRpb24gaWYgdGhlIG9wZXJhdGlvbiBkZXRlY3RzIGEgcmVxdWVzdCB0byBjYW5jZWwsIAotICAgICAqICB1c2luZyA8Y29kZT5JUHJvZ3Jlc3NNb25pdG9yLmlzQ2FuY2VsZWQoKTwvY29kZT4sIGl0IHNob3VsZCBleGl0IGJ5IHRocm93aW5nIAotICAgICAqICA8Y29kZT5JbnRlcnJ1cHRlZEV4Y2VwdGlvbjwvY29kZT4KLSAgICAgKgotICAgICAqIEBzZWUgSVJ1bm5hYmxlQ29udGV4dCNydW4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwKLSAgICAgICAgICAgIEludGVycnVwdGVkRXhjZXB0aW9uOwotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL0lUZXh0UmVmZXJlbmNlUmVwbGFjZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9JVGV4dFJlZmVyZW5jZVJlcGxhY2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkZGY1MTIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL0lUZXh0UmVmZXJlbmNlUmVwbGFjZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotLyoqCi0gKiBJbnN0YW5jZSBvZiB0aGlzIGNsYXNzIGNhbiBzY2FuIHRleHQgYW5kIHJlcGxhY2VzIHRleHR1YWwgcmVmZXJlbmNlcyB0byB0aGUKLSAqIG9sZCBvYmplY3RzIHdpdGggcmVmZXJlbmNlcyB0byBuZXcgb2JqZWN0cwotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZSAtIEp1biAyMiwgMjAwNgotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElUZXh0UmVmZXJlbmNlUmVwbGFjZXIgewotCS8qKgotCSAqIFJlcGxhY2VzIHRleHR1YWwgcmVmZXJlbmNlcyB0byB0aGUgb2xkIG9iamVjdHMgd2l0aCByZWZlcmVuY2VzIHRvIG5ldwotCSAqIG9iamVjdHMgcHJvdmlkZWQgaW4gdGhlIDxjb2RlPm9sZFRvTmV3T2JqZWN0TWFwPC9jb2RlPgotCSAqIAotCSAqIEBwYXJhbSB0ZXh0Ci0JICogQHBhcmFtIG93bmVyCi0JICogICAgICAgICAgICB0aGUgb3duZXIgb2YgdGhlIHRleHQKLQkgKiBAcGFyYW0gb2xkVG9OZXdPYmplY3RNYXAKLQkgKiBAcmV0dXJuCi0JICovCi0JU3RyaW5nIHJlcGxhY2UoU3RyaW5nIHRleHQsIEVPYmplY3Qgb3duZXIsIE1hcCBvbGRUb05ld09iamVjdE1hcCk7Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvSXRlbUxhYmVsUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9JdGVtTGFiZWxQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyN2RiOGZiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9JdGVtTGFiZWxQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS41Ci0gKgotICovCi1wdWJsaWMgY2xhc3MgSXRlbUxhYmVsUHJvdmlkZXIgaW1wbGVtZW50cyBJSXRlbUxhYmVsUHJvdmlkZXIgewotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyI2dldEltYWdlKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlciNnZXRUZXh0KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG9iamVjdCA9PSBudWxsID8gIiIgOiBvYmplY3QudG9TdHJpbmcoKTsvLyROT04tTkxTLTEkCi0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvTGlicmFyeUVkaXRDb25zdGFudHMuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9MaWJyYXJ5RWRpdENvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNTJhMDYwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9MaWJyYXJ5RWRpdENvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRQbHVnaW47Ci0KLS8qKgotICogQ29uc3RhbnRzIGZvciBsaWJyYXJ5IGVkaXQgcGx1Z2luCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlIEp1biAzMCwgMjAwNQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgTGlicmFyeUVkaXRDb25zdGFudHMgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nW10gVU5DQVRFR09SSVpFRF9UQVNLU19QQVRIID0gewotCQkJTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfQ29udGVudF9ncm91cCIpIC8vJE5PTi1OTFMtMSQKLQkJCSwKLQkJCUxpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCS5nZXRTdHJpbmcoIl9VSV9TdGFuZGFyZF9DYXRlZ29yaWVzX2dyb3VwIikgLy8kTk9OLU5MUy0xJAotCQkJLAotCQkJTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfRGlzY2lwbGluZXNfZ3JvdXAiKSAvLyROT04tTkxTLTEkCi0JCQksCi0JCQlMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkuZ2V0U3RyaW5nKCJfVUlfVW5jYXRlZ29yaXplZF9UYXNrc190ZXh0IikgLy8kTk9OLU5MUy0xJAotCX07Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZ1tdIFVOQ0FURUdPUklaRURfRE9NQUlOX1dPUktQUk9EVUNUU19QQVRIID0gewotCQkJTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfQ29udGVudF9ncm91cCIpIC8vJE5PTi1OTFMtMSQKLQkJCSwKLQkJCUxpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCS5nZXRTdHJpbmcoIl9VSV9TdGFuZGFyZF9DYXRlZ29yaWVzX2dyb3VwIikgLy8kTk9OLU5MUy0xJAotCQkJLCBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9Eb21haW5zX2dyb3VwIikgLy8kTk9OLU5MUy0xJAotCQkJLCBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9VbmNhdGVnb3JpemVkX3RleHQiKSAvLyROT04tTkxTLTEkCQkJCQotCX07Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZ1tdIFVOQ0FURUdPUklaRURfV09SS1BST0RVQ1RUWVBFX1dPUktQUk9EVUNUU19QQVRIID0gewotCQkJTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfQ29udGVudF9ncm91cCIpIC8vJE5PTi1OTFMtMSQKLQkJCSwKLQkJCUxpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCS5nZXRTdHJpbmcoIl9VSV9TdGFuZGFyZF9DYXRlZ29yaWVzX2dyb3VwIikgLy8kTk9OLU5MUy0xJAotCQkJLAotCQkJTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfV29ya1Byb2R1Y3RUeXBlc19ncm91cCIpIC8vJE5PTi1OTFMtMSQKLQkJCSwgTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfVW5jYXRlZ29yaXplZF90ZXh0IikgLy8kTk9OLU5MUy0xJAkJCQkKLQl9OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBVTkNBVEVHT1JJWkVEX1JPTEVTX1BBVEggPSB7Ci0JCQlMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9Db250ZW50X2dyb3VwIikgLy8kTk9OLU5MUy0xJAotCQkJLAotCQkJTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJLmdldFN0cmluZygiX1VJX1N0YW5kYXJkX0NhdGVnb3JpZXNfZ3JvdXAiKSAvLyROT04tTkxTLTEkCi0JCQksCi0JCQlMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9Sb2xlX1NldHNfZ3JvdXAiKSAvLyROT04tTkxTLTEkCi0JCQksCi0JCQlMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkuZ2V0U3RyaW5nKCJfVUlfVW5jYXRlZ29yaXplZF9Sb2xlc190ZXh0IikgLy8kTk9OLU5MUy0xJAkJCi0JfTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nW10gVU5DQVRFR09SSVpFRF9UT09MTUVOVE9SU19QQVRIID0gewotCQkJTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfQ29udGVudF9ncm91cCIpIC8vJE5PTi1OTFMtMSQKLQkJCSwKLQkJCUxpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCS5nZXRTdHJpbmcoIl9VSV9TdGFuZGFyZF9DYXRlZ29yaWVzX2dyb3VwIikgLy8kTk9OLU5MUy0xJAotCQkJLCBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9Ub29sc19ncm91cCIpIC8vJE5PTi1OTFMtMSQKLQkJCSwgTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfVW5jYXRlZ29yaXplZF90ZXh0IikgLy8kTk9OLU5MUy0xJAkJCQkKLQl9OwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZfUFJFRklYID0gIm9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRl9FTkFCTEVfUFJPQ0VTU19DT05UUklCVVRJT04gPSBQUkVGX1BSRUZJWAotCQkJKyAiZW5hYmxlX3Byb2Nlc3NfY29udHJpYnV0aW9uIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRl9FTkFCTEVfSEVBTFRIX0NIRUNLID0gUFJFRl9QUkVGSVgKLQkJCSsgImVuYWJsZV9oZWFsdGhfY2hlY2siOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGX0lOSEVSSVRfU1VQUFJFU1NJT05fU1RBVEUgPSBQUkVGX1BSRUZJWAotCQkJKyAiaW5oZXJpdF9zdXBwcmVzc2lvbl9zdGF0ZSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZfV0JTX0NPTFVNTlMgPSBQUkVGX1BSRUZJWCArICJ3YnNfY29sdW1ucyI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZfVEJTX0NPTFVNTlMgPSBQUkVGX1BSRUZJWCArICJ0YnNfY29sdW1ucyI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZfV1BCU19DT0xVTU5TID0gUFJFRl9QUkVGSVggKyAid3Bic19jb2x1bW5zIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVXX0NVU1RPTV9DQVRFR09SWSA9ICJuZXdfY3VzdG9tX2NhdGVnb3J5IjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVXX0RJU0NJUExJTkUgPSAibmV3X2Rpc2NpcGxpbmUiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBORVdfRElTQ0lQTElORV9HUk9VUElORyA9ICJuZXdfZGlzY2lwbGluZV9ncm91cGluZyI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5FV19ET01BSU4gPSAibmV3X2RvbWFpbiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5FV19ST0xFX1NFVCA9ICJuZXdfcm9sZV9zZXQiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBORVdfUk9MRV9TRVRfR1JPVVBJTkcgPSAibmV3X3JvbGVfc2V0X2dyb3VwaW5nIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVXX1RPT0wgPSAibmV3X3Rvb2wiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBORVdfV09SS19QUk9EVUNUX1RZUEUgPSAibmV3X3dvcmtfcHJvZHVjdF9raW5kIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVXX1JPTEUgPSAibmV3X3JvbGUiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBORVdfVEFTSyA9ICJuZXdfdGFzayI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5FV19XT1JLUFJPRFVDVCA9ICJuZXdfd29ya3Byb2R1Y3QiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBORVdfQVJUSUZBQ1QgPSAibmV3X2FydGlmYWN0IjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVXX0RFTElWRVJBQkxFID0gIm5ld19kZWxpdmVyYWJsZSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5FV19PVVRDT01FID0gIm5ld19vdXRjb21lIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVXX0NIRUNLTElTVCA9ICJuZXdfY2hlY2tsaXN0IjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVXX1dISVRFUEFQRVIgPSAibmV3X3doaXRlcGFwZXIiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBORVdfQ09OQ0VQVCA9ICJuZXdfY29uY2VwdCI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5FV19FU1RJTUFURSA9ICJuZXdfZXN0aW1hdGUiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBORVdfRVNUSU1BVElPTl9DT05TSURFUkFUSU9OID0gIm5ld19lc3RpbWF0aW9uX2NvbnNpZGVyYXRpb25zIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVXX0VTVElNQVRBVElOR19NRVRSSUMgPSAibmV3X2VzdGltYXRpbmdfbWV0cmljIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVXX0VYQU1QTEUgPSAibmV3X2V4YW1wbGUiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBORVdfUFJBQ1RJQ0UgPSAibmV3X3ByYWN0aWNlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVXX1JFUE9SVCA9ICJuZXdfcmVwb3J0IjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVXX1JPQURNQVAgPSAibmV3X3JvYWRtYXAiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBORVdfUkVVU0FCTEVfQVNTRVQgPSAibmV3X3JldXNhYmxlX2Fzc2V0IjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVXX1NVUFBPUlRJTkdfTUFURVJJQUwgPSAibmV3X3N1cHBvcnRpbmdfbWF0ZXJpYWwiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBORVdfVEVNUExBVEUgPSAibmV3X3RlbXBsYXRlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVXX1RFUk1fREVGSU5JVElPTiA9ICJuZXdfdGVybV9kZWZpbml0aW9uIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVXX1RPT0xfTUVOVE9SID0gIm5ld190b29sbWVudG9yIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVXX0dVSURFTElORSA9ICJuZXdfZ3VpZGVsaW5lIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVXX0dVSURBTkNFID0gIm5ld19ndWlkYW5jZSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5FV19DT05URU5UX1BBQ0tBR0UgPSAibmV3X2NvbnRlbnRfcGFja2FnZSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5FV19DT05GSUdVUkFUSU9OID0gIm5ld19jb25maWd1cmF0aW9uIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVXX1BST0NFU1NfRkFNSUxZID0gIm5ld19wcm9jZXNzX2ZhbWlseSI7IC8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9NZXNzZW5nZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9NZXNzZW5nZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDEwNWZlNS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvTWVzc2VuZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5zZXJ2aWNlYWJpbGl0eS5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5TdHJVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklVc2VySW50ZXJhY3Rpb25IYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JVXNlckludGVyYWN0aW9uSGFuZGxlci5JTWVzc2VuZ2VyOwotCi0vKioKLSAqIERlZmF1bHQgbWVzc2VuZ2VyIHRoYXQgd2lsbCBkZWxpdmVyIG1lc3NhZ2VzIHVzaW5nIHRoZSBtZXNzZW5nZXIgb2YKLSAqIHtAbGluayBFeHRlbnNpb25NYW5hZ2VyI2dldERlZmF1bHRVc2VySW50ZXJhY3Rpb25IYW5kbGVyKCkgZGVmYXVsdCB1c2VyCi0gKiBpbnRlcmFjdGlvbiBoYW5kbGVyfSBpZiBvbmUgZXhpc3RzLiBPdGhlcndpc2UsIGl0IHdpbGwgbG9nIHRoZSBtZXNzYWdlcyB1c2luZwotICogcGx1Z2luJ3MgbG9nZ2VyLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZSAtIE9jdCAyNSwgMjAwNgotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTWVzc2VuZ2VyIGltcGxlbWVudHMgSVVzZXJJbnRlcmFjdGlvbkhhbmRsZXIuSU1lc3NlbmdlciB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBNZXNzZW5nZXIgSU5TVEFOQ0UgPSBuZXcgTWVzc2VuZ2VyKCk7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVXX0xJTkUgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoCi0JCQkibGluZS5zZXBhcmF0b3IiLCAiXG4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQlwcml2YXRlIElNZXNzZW5nZXIgZGVsZWdhdGU7Ci0KLQlwcml2YXRlIExvZ2dlciBsb2dnZXIgPSBMaWJyYXJ5RWRpdFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCk7Ci0KLQlwcml2YXRlIE1lc3NlbmdlcigpIHsKLQkJSVVzZXJJbnRlcmFjdGlvbkhhbmRsZXIgdWlIYW5kbGVyID0gRXh0ZW5zaW9uTWFuYWdlcgotCQkJCS5nZXREZWZhdWx0VXNlckludGVyYWN0aW9uSGFuZGxlcigpOwotCQlpZiAodWlIYW5kbGVyICE9IG51bGwpIHsKLQkJCWRlbGVnYXRlID0gdWlIYW5kbGVyLmdldE1lc3NlbmdlcigpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSVVzZXJJbnRlcmFjdGlvbkhhbmRsZXIuSU1lc3NlbmdlciNzaG93RXJyb3IoamF2YS5sYW5nLlN0cmluZywKLQkgKiAgICAgIGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgc2hvd0Vycm9yKFN0cmluZyB0aXRsZSwgU3RyaW5nIG1zZykgewotCQlpZiAoZGVsZWdhdGUgIT0gbnVsbCkgewotCQkJZGVsZWdhdGUuc2hvd0Vycm9yKHRpdGxlLCBtc2cpOwotCQl9IGVsc2UgewotCQkJU3RyaW5nQnVmZmVyIHN0ckJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIodGl0bGUpOwotCQkJaWYoIVN0clV0aWwuaXNCbGFuayhtc2cpKSB7Ci0JCQkJc3RyQnVmLmFwcGVuZChORVdfTElORSkuYXBwZW5kKG1zZyk7Ci0JCQl9Ci0JCQlsb2dnZXIubG9nRXJyb3Ioc3RyQnVmLnRvU3RyaW5nKCkpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSVVzZXJJbnRlcmFjdGlvbkhhbmRsZXIuSU1lc3NlbmdlciNzaG93RXJyb3IoamF2YS5sYW5nLlN0cmluZywKLQkgKiAgICAgIGphdmEubGFuZy5TdHJpbmcsIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzKQotCSAqLwotCXB1YmxpYyB2b2lkIHNob3dFcnJvcihTdHJpbmcgdGl0bGUsIFN0cmluZyBtc2csIElTdGF0dXMgc3RhdHVzKSB7Ci0JCWlmIChkZWxlZ2F0ZSAhPSBudWxsKSB7Ci0JCQlkZWxlZ2F0ZS5zaG93RXJyb3IodGl0bGUsIG1zZywgc3RhdHVzKTsKLQkJfSBlbHNlIHsKLQkJCUxpYnJhcnlFZGl0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2coKS5sb2coc3RhdHVzKTsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklVc2VySW50ZXJhY3Rpb25IYW5kbGVyLklNZXNzZW5nZXIjc2hvd0Vycm9yKGphdmEubGFuZy5TdHJpbmcsCi0JICogICAgICBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuRXhjZXB0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIHNob3dFcnJvcihTdHJpbmcgdGl0bGUsIFN0cmluZyBtc2csIFN0cmluZyByZWFzb24sCi0JCQlFeGNlcHRpb24gZXhjZXB0aW9uKSB7Ci0JCWlmIChkZWxlZ2F0ZSAhPSBudWxsKSB7Ci0JCQlkZWxlZ2F0ZS5zaG93RXJyb3IodGl0bGUsIG1zZywgcmVhc29uLCBleGNlcHRpb24pOwotCQl9IGVsc2UgewotCQkJU3RyaW5nQnVmZmVyIHN0ckJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIodGl0bGUpOwotCQkJaWYoIVN0clV0aWwuaXNCbGFuayhtc2cpKSB7Ci0JCQkJc3RyQnVmLmFwcGVuZChORVdfTElORSkuYXBwZW5kKG1zZyk7Ci0JCQl9Ci0JCQlsb2dnZXIubG9nRXJyb3Ioc3RyQnVmLnRvU3RyaW5nKCksIGV4Y2VwdGlvbik7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JVXNlckludGVyYWN0aW9uSGFuZGxlci5JTWVzc2VuZ2VyI3Nob3dXYXJuaW5nKGphdmEubGFuZy5TdHJpbmcsCi0JICogICAgICBqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIHNob3dXYXJuaW5nKFN0cmluZyB0aXRsZSwgU3RyaW5nIG1zZykgewotCQlpZiAoZGVsZWdhdGUgIT0gbnVsbCkgewotCQkJZGVsZWdhdGUuc2hvd1dhcm5pbmcodGl0bGUsIG1zZyk7Ci0JCX0gZWxzZSB7Ci0JCQlTdHJpbmdCdWZmZXIgc3RyQnVmID0gbmV3IFN0cmluZ0J1ZmZlcih0aXRsZSk7Ci0JCQlpZighU3RyVXRpbC5pc0JsYW5rKG1zZykpIHsKLQkJCQlzdHJCdWYuYXBwZW5kKE5FV19MSU5FKS5hcHBlbmQobXNnKTsKLQkJCX0KLQkJCWxvZ2dlci5sb2dXYXJuaW5nKHN0ckJ1Zi50b1N0cmluZygpKTsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklVc2VySW50ZXJhY3Rpb25IYW5kbGVyLklNZXNzZW5nZXIjc2hvd1dhcm5pbmcoamF2YS5sYW5nLlN0cmluZywKLQkgKiAgICAgIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgc2hvd1dhcm5pbmcoU3RyaW5nIHRpdGxlLCBTdHJpbmcgbXNnLCBTdHJpbmcgcmVhc29uKSB7Ci0JCWlmIChkZWxlZ2F0ZSAhPSBudWxsKSB7Ci0JCQlkZWxlZ2F0ZS5zaG93V2FybmluZyh0aXRsZSwgbXNnLCByZWFzb24pOwotCQl9IGVsc2UgewotCQkJU3RyaW5nQnVmZmVyIHN0ckJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIodGl0bGUpOwotCQkJaWYoIVN0clV0aWwuaXNCbGFuayhtc2cpKSB7Ci0JCQkJc3RyQnVmLmFwcGVuZChORVdfTElORSkuYXBwZW5kKG1zZyk7Ci0JCQl9Ci0JCQlpZighU3RyVXRpbC5pc0JsYW5rKHJlYXNvbikpIHsKLQkJCQlzdHJCdWYuYXBwZW5kKE5FV19MSU5FKS5hcHBlbmQocmVhc29uKTsKLQkJCX0KLQkJCWxvZ2dlci5sb2dXYXJuaW5nKHN0ckJ1Zi50b1N0cmluZygpKTsKLQkJfQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JVXNlckludGVyYWN0aW9uSGFuZGxlci5JTWVzc2VuZ2VyI3Nob3dJbmZvKGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgc2hvd0luZm8oU3RyaW5nIHRpdGxlLCBTdHJpbmcgbXNnKSB7Ci0JCWlmIChkZWxlZ2F0ZSAhPSBudWxsKSB7Ci0JCQlkZWxlZ2F0ZS5zaG93SW5mbyh0aXRsZSwgbXNnKTsKLQkJfSBlbHNlIHsKLQkJCVN0cmluZ0J1ZmZlciBzdHJCdWYgPSBuZXcgU3RyaW5nQnVmZmVyKHRpdGxlKTsKLQkJCWlmKCFTdHJVdGlsLmlzQmxhbmsobXNnKSkgewotCQkJCXN0ckJ1Zi5hcHBlbmQoTkVXX0xJTkUpLmFwcGVuZChtc2cpOwotCQkJfQotCQkJbG9nZ2VyLmxvZ0luZm8oc3RyQnVmLnRvU3RyaW5nKCkpOwotCQl9Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklVc2VySW50ZXJhY3Rpb25IYW5kbGVyLklNZXNzZW5nZXIjc2hvd0Vycm9yKGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5FeGNlcHRpb24pCi0JICovCi0JcHVibGljIHZvaWQgc2hvd0Vycm9yKFN0cmluZyB0aXRsZSwgU3RyaW5nIG1zZywgU3RyaW5nIHJlYXNvbiwgU3RyaW5nIGRldGFpbHMsIEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLQkJaWYgKGRlbGVnYXRlICE9IG51bGwpIHsKLQkJCWRlbGVnYXRlLnNob3dJbmZvKHRpdGxlLCBtc2cpOwotCQl9IGVsc2UgewotCQkJU3RyaW5nQnVmZmVyIHN0ckJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIodGl0bGUpOwotCQkJaWYoIVN0clV0aWwuaXNCbGFuayhtc2cpKSB7Ci0JCQkJc3RyQnVmLmFwcGVuZChORVdfTElORSkuYXBwZW5kKG1zZyk7Ci0JCQl9Ci0JCQlpZighU3RyVXRpbC5pc0JsYW5rKHJlYXNvbikpIHsKLQkJCQlzdHJCdWYuYXBwZW5kKE5FV19MSU5FKS5hcHBlbmQocmVhc29uKTsKLQkJCX0KLQkJCWlmKCFTdHJVdGlsLmlzQmxhbmsoZGV0YWlscykpIHsKLQkJCQlzdHJCdWYuYXBwZW5kKE5FV19MSU5FKS5hcHBlbmQoZGV0YWlscyk7Ci0JCQl9Ci0JCQlsb2dnZXIubG9nRXJyb3Ioc3RyQnVmLnRvU3RyaW5nKCksIGV4Y2VwdGlvbik7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9NZXRob2RFbGVtZW50UHJvcGVydGllcy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL01ldGhvZEVsZW1lbnRQcm9wZXJ0aWVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkNDA5ZjQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL01ldGhvZEVsZW1lbnRQcm9wZXJ0aWVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwODcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZEhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkxpc3RlbmVyTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuTWV0aG9kRWxlbWVudFByb3BlcnR5TWdyLkNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5NZXRob2RFbGVtZW50UHJvcGVydHlNZ3IuQ2hhbmdlRXZlbnRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50UHJvcGVydHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiAgQ2xhc3MgbWFuYWdpbmcgY2FjaGVkIG1ldGhvZCBlbGVtZW50IHByb3BlcnRpZXMKLSAqIAotICogQGF1dGhvciBXZWlwaW5nIEx1IC0gTWF5IDEwLCAyMDA4Ci0gKiBAc2luY2UgMS41Ci0gKi8KLXB1YmxpYyBjbGFzcyBNZXRob2RFbGVtZW50UHJvcGVydGllcyBleHRlbmRzIEFkYXB0ZXJJbXBsIHsKLQotCXByaXZhdGUgTWV0aG9kRWxlbWVudCBlbGVtZW50OwotCXByaXZhdGUgTGlzdGVuZXJMaXN0IGxpc3RlbmVycyA9IG5ldyBMaXN0ZW5lckxpc3QoKTsKLQlwcml2YXRlIFNldDxTdHJpbmc+IHByb3BOYW1lU2V0ID0gbmV3IExpbmtlZEhhc2hTZXQ8U3RyaW5nPigpOwotCXByaXZhdGUgTWFwPFN0cmluZywgTGlzdDxNZXRob2RFbGVtZW50UHJvcGVydHk+PiBwcm9wZXJ0eU1hcDsKLQkKLQlwdWJsaWMgTWV0aG9kRWxlbWVudFByb3BlcnRpZXMoTWV0aG9kRWxlbWVudCBlbGVtZW50LCBTdHJpbmdbXSBwcm9wTmFtZUFycmF5KSB7Ci0JCXRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7Ci0JCWlmIChwcm9wTmFtZUFycmF5ICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcHJvcE5hbWVBcnJheS5sZW5ndGg7IGkrKykgewotCQkJCXByb3BOYW1lU2V0LmFkZChwcm9wTmFtZUFycmF5W2ldKTsKLQkJCX0KLQkJfQkJCi0JCXByb3BlcnR5TWFwID0gTWV0aG9kRWxlbWVudFByb3BlcnR5SGVscGVyLmdldFByb3BlcnR5TWFwKGVsZW1lbnQsIGdldFByb3BOYW1lU2V0KCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgU2V0PFN0cmluZz4gZ2V0UHJvcE5hbWVTZXQoKSB7Ci0JCXJldHVybiAgcHJvcE5hbWVTZXQ7Ci0JfQotCQotCi0JcHVibGljIGJvb2xlYW4gcHJvcE5hbWVSZWdpc3RlcmVkKFN0cmluZyBwcm9wTmFtZSkgewotCQlyZXR1cm4gZ2V0UHJvcE5hbWVTZXQoKSAhPSBudWxsICYmIGdldFByb3BOYW1lU2V0KCkuY29udGFpbnMocHJvcE5hbWUpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBtc2cpIHsKLQkJT2JqZWN0IG9iaiA9IG1zZy5nZXROb3RpZmllcigpOwotCQlNZXRob2RFbGVtZW50UHJvcGVydHkgbWVQcm9wID0gbnVsbDsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnRQcm9wZXJ0eSkgewotCQkJbWVQcm9wID0gKE1ldGhvZEVsZW1lbnRQcm9wZXJ0eSkgb2JqOwotCQl9IGVsc2UgaWYgKG9iaiA9PSBlbGVtZW50KSB7Ci0JCQlpZiAobXNnLmdldEZlYXR1cmUoKSAhPSBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkuZ2V0TWV0aG9kRWxlbWVudF9NZXRob2RFbGVtZW50UHJvcGVydHkoKSkgewotCQkJCXJldHVybjsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJLy9UbyBiZSBpbXBsZW1lbnRlZDogZG8gbm90aGluZyBmb3Igbm93Ci0KLQl9Ci0JCi0JcHVibGljIE1ldGhvZEVsZW1lbnRQcm9wZXJ0eSBnZXRQcm9wZXJ0eShTdHJpbmcgcHJvcE5hbWUpIHsKLQkJTGlzdDxNZXRob2RFbGVtZW50UHJvcGVydHk+IHByb3BMaXN0ID0gcHJvcGVydHlNYXAuZ2V0KHByb3BOYW1lKTsKLQkJcmV0dXJuIHByb3BMaXN0ID09IG51bGwgfHwgcHJvcExpc3QuaXNFbXB0eSgpID8gbnVsbCA6IHByb3BMaXN0LmdldCgwKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0UHJvcGVydHkoU3RyaW5nIHByb3BOYW1lLCBTdHJpbmcgcHJvcFZhbHVlKSB7Ci0JCUxpc3Q8TWV0aG9kRWxlbWVudFByb3BlcnR5PiBwcm9wTGlzdCA9IHByb3BlcnR5TWFwLmdldChwcm9wTmFtZSk7Ci0JCWlmIChwcm9wTGlzdCA9PSBudWxsKSB7Ci0JCQlwcm9wTGlzdCA9IG5ldyBBcnJheUxpc3Q8TWV0aG9kRWxlbWVudFByb3BlcnR5PigpOwotCQkJcHJvcGVydHlNYXAucHV0KHByb3BOYW1lLCBwcm9wTGlzdCk7Ci0JCX0KLQkJTWV0aG9kRWxlbWVudFByb3BlcnR5IHByb3AgPSBwcm9wTGlzdC5pc0VtcHR5KCkgPyBudWxsIDogcHJvcExpc3QuZ2V0KDApOwotCQlpZiAocHJvcCA9PSBudWxsKSB7Ci0JCQlwcm9wID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlTWV0aG9kRWxlbWVudFByb3BlcnR5KCk7Ci0JCQlwcm9wLnNldE5hbWUocHJvcE5hbWUpOwotCQkJZWxlbWVudC5nZXRNZXRob2RFbGVtZW50UHJvcGVydHkoKS5hZGQocHJvcCk7Ci0JCQlpZiAocHJvcExpc3QuaXNFbXB0eSgpKSB7Ci0JCQkJcHJvcExpc3QuYWRkKHByb3ApOwotCQkJfQotCQl9Ci0JCVN0cmluZyBvbGRWYWx1ZSA9IHByb3AuZ2V0VmFsdWUoKTsJCQotCQlpZiAoZXF1YWwob2xkVmFsdWUsIHByb3BWYWx1ZSkpIHsKLQkJCXJldHVybjsKLQkJfQotCQlwcm9wLnNldFZhbHVlKHByb3BWYWx1ZSk7CQkKLQkJbm90aWZ5TGlzdGVuZXJzKG5ldyBDaGFuZ2VFdmVudChwcm9wLCBvbGRWYWx1ZSwgcHJvcFZhbHVlKSk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGdldEJvb2xlYW5WYWx1ZShTdHJpbmcgcHJvcE5hbWUpIHsKLQkJTWV0aG9kRWxlbWVudFByb3BlcnR5IHByb3AgPSBnZXRQcm9wZXJ0eShwcm9wTmFtZSk7Ci0JCWlmIChwcm9wID09IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlTdHJpbmcgdmFsdWUgPSBwcm9wLmdldFZhbHVlKCk7Ci0JCXJldHVybiBCb29sZWFuLlRSVUUudG9TdHJpbmcoKS5lcXVhbHMocHJvcC5nZXRWYWx1ZSgpKTsKLQl9Ci0JCi0JcHJpdmF0ZSBib29sZWFuIGVxdWFsKE9iamVjdCBhLCBPYmplY3QgYikgewotCQlpZiAoYSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gYS5lcXVhbHMoYik7Ci0JCX0JCQotCQlyZXR1cm4gYiA9PSBudWxsOwotCX0KLQkJCi0JcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoQ2hhbmdlRXZlbnRMaXN0ZW5lciBsaXN0ZW5lcikgewotCQl0aGlzLmxpc3RlbmVycy5hZGQobGlzdGVuZXIpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCByZW1vdmVMaXN0ZW5lcihDaGFuZ2VFdmVudExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXRoaXMubGlzdGVuZXJzLnJlbW92ZShsaXN0ZW5lcik7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBub3RpZnlMaXN0ZW5lcnMoQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJZm9yIChPYmplY3QgbyA6IGxpc3RlbmVycy5nZXRMaXN0ZW5lcnMoKSkgewotCQkJaWYgKG8gaW5zdGFuY2VvZiBDaGFuZ2VFdmVudExpc3RlbmVyKQotCQkJCSgoQ2hhbmdlRXZlbnRMaXN0ZW5lcikgbykubm90aWZ5Q2hhbmdlKGV2ZW50KTsKLQkJfQotCX0JCi0JCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJZWxlbWVudCA9IG51bGw7Ci0JCWxpc3RlbmVycyA9IG51bGw7Ci0JCXByb3BOYW1lU2V0ID0gbnVsbDsKLQkJcHJvcGVydHlNYXAgPSBudWxsOwotCQkKLQkJLy9UbyBkbzogcmVtb3ZlIGZyb20gdGhpcyBhZGFwdGVyIGZyb20gYWxsIGF0dGFjaGVkIE5vdGlmaWVyIG9iamVjdHMKLQl9Ci0JCQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL01ldGhvZEVsZW1lbnRQcm9wZXJ0eUhlbHBlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL01ldGhvZEVsZW1lbnRQcm9wZXJ0eUhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZTE0NDA3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9NZXRob2RFbGVtZW50UHJvcGVydHlIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudFByb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hRmFjdG9yeTsKLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBXZWlwaW5nIEx1Ci0gKgotICogQHNpbmNlIDEuMgotICovCi1wdWJsaWMgY2xhc3MgTWV0aG9kRWxlbWVudFByb3BlcnR5SGVscGVyIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXT1JLX09SREVSX19QUkVERUNFU1NPUl9QUk9DRVNTX1BBVEggPSAicHJlZF9wcm9jZXNzX3BhdGgiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09ORklHX1BST1BCTEVNX0hJREVfRVJST1JTID0gImhpZGVfZXJyb3JzIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTkZJR19QUk9QQkxFTV9ISURFX1dBUk5JTkdTID0gImhpZGVfd2FybmluZ3MiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09ORklHX1BST1BCTEVNX0hJREVfSU5GT1MgPSAiaGlkZV9pbmZvcyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDVVNUT01fQ0FURUdPUllfX0lOQ0xVREVEX0VMRU1FTlRTID0gImluY2x1ZGUiOyAvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBNZXRob2RFbGVtZW50UHJvcGVydHkgZ2V0UHJvcGVydHkoTWV0aG9kRWxlbWVudCBlLCBTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCWlmIChlICE9IG51bGwpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGUuZ2V0TWV0aG9kRWxlbWVudFByb3BlcnR5KCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJTWV0aG9kRWxlbWVudFByb3BlcnR5IHByb3AgPSAoTWV0aG9kRWxlbWVudFByb3BlcnR5KSBpdGVyLm5leHQoKTsKLQkJCQlpZihwcm9wLmdldE5hbWUoKS5lcXVhbHMocHJvcGVydHlOYW1lKSkgewotCQkJCQlyZXR1cm4gcHJvcDsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgdm9pZCBzZXRQcm9wZXJ0eShNZXRob2RFbGVtZW50IGUsIFN0cmluZyBwcm9wTmFtZSwgU3RyaW5nIHByb3BWYWx1ZSkgewotCQlNZXRob2RFbGVtZW50UHJvcGVydHkgcHJvcCA9IGdldFByb3BlcnR5KGUsIHByb3BOYW1lKTsKLQkJaWYgKHByb3AgPT0gbnVsbCkgewotCQkJcHJvcCA9IFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZU1ldGhvZEVsZW1lbnRQcm9wZXJ0eSgpOwotCQkJcHJvcC5zZXROYW1lKHByb3BOYW1lKTsKLQkJCWUuZ2V0TWV0aG9kRWxlbWVudFByb3BlcnR5KCkuYWRkKHByb3ApOwotCQl9Ci0JCWlmIChwcm9wVmFsdWUgIT0gbnVsbCAmJiBwcm9wVmFsdWUuZXF1YWxzKHByb3AuZ2V0VmFsdWUoKSkpIHJldHVybjsKLQkJaWYgKHByb3BWYWx1ZSA9PSBudWxsICYmIHByb3AuZ2V0VmFsdWUoKSA9PSBudWxsKSByZXR1cm47Ci0JCXByb3Auc2V0VmFsdWUocHJvcFZhbHVlKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIHZvaWQgc2V0UHJvcGVydHkoTWV0aG9kRWxlbWVudCBlLCBTdHJpbmcgcHJvcE5hbWUsIGJvb2xlYW4gYikgewotCQlzZXRQcm9wZXJ0eShlLCBwcm9wTmFtZSwgU3RyaW5nLnZhbHVlT2YoYikpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgdm9pZCByZW1vdmVQcm9wZXJ0eShNZXRob2RFbGVtZW50IGUsIFN0cmluZyBwcm9wTmFtZSkgewotCQlNZXRob2RFbGVtZW50UHJvcGVydHkgcHJvcGVydHkgPSBnZXRQcm9wZXJ0eShlLCBwcm9wTmFtZSk7Ci0JCWlmIChwcm9wZXJ0eSAhPSBudWxsKSB7Ci0JCQllLmdldE1ldGhvZEVsZW1lbnRQcm9wZXJ0eSgpLnJlbW92ZShwcm9wZXJ0eSk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBMaXN0PE1ldGhvZEVsZW1lbnRQcm9wZXJ0eT4gZ2V0UHJvcGVydHlMaXN0KE1ldGhvZEVsZW1lbnQgZSwgU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlpZiAoZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQkJCi0JCUxpc3Q8TWV0aG9kRWxlbWVudFByb3BlcnR5PiBhbGxQcm9wcyA9IGUuZ2V0TWV0aG9kRWxlbWVudFByb3BlcnR5KCk7CQkKLQkJaWYgKGFsbFByb3BzID09IG51bGwgfHwgYWxsUHJvcHMuaXNFbXB0eSgpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQotCQlMaXN0PE1ldGhvZEVsZW1lbnRQcm9wZXJ0eT4gcHJvcExpc3QgPSBuZXcgQXJyYXlMaXN0PE1ldGhvZEVsZW1lbnRQcm9wZXJ0eT4oKTsKLQkJZm9yIChNZXRob2RFbGVtZW50UHJvcGVydHkgcHJvcDogYWxsUHJvcHMpIHsKLQkJCWlmKHByb3AuZ2V0TmFtZSgpLmVxdWFscyhwcm9wZXJ0eU5hbWUpKSB7Ci0JCQkJcHJvcExpc3QuYWRkKHByb3ApOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHByb3BMaXN0LmlzRW1wdHkoKSA/IG51bGwgOiBwcm9wTGlzdDsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBNYXA8U3RyaW5nLCBMaXN0PE1ldGhvZEVsZW1lbnRQcm9wZXJ0eT4+IGdldFByb3BlcnR5TWFwKE1ldGhvZEVsZW1lbnQgZSwgQ29sbGVjdGlvbjxTdHJpbmc+IHByb3BlcnR5TmFtZXMpIHsKLQkJTWFwIHByb3BlcnR5TWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBMaXN0PE1ldGhvZEVsZW1lbnRQcm9wZXJ0eT4+KCk7Ci0JCWlmIChlID09IG51bGwgfHwgcHJvcGVydHlOYW1lcyA9PSBudWxsIHx8IHByb3BlcnR5TmFtZXMuaXNFbXB0eSgpKSB7Ci0JCQlyZXR1cm4gcHJvcGVydHlNYXA7Ci0JCX0KLQkKLQkJZm9yIChTdHJpbmcgcHJvcE5hbWU6IHByb3BlcnR5TmFtZXMpIHsKLQkJCUxpc3Q8TWV0aG9kRWxlbWVudFByb3BlcnR5PiBwcm9wTGlzdCA9IGdldFByb3BlcnR5TGlzdChlLCBwcm9wTmFtZSk7Ci0JCQlwcm9wZXJ0eU1hcC5wdXQocHJvcE5hbWUsIHByb3BMaXN0KTsKLQkJfQotCQlyZXR1cm4gcHJvcGVydHlNYXA7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL01ldGhvZEVsZW1lbnRQcm9wZXJ0eU1nci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL01ldGhvZEVsZW1lbnRQcm9wZXJ0eU1nci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMDQwYTg0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9NZXRob2RFbGVtZW50UHJvcGVydHlNZ3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA4NyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5MaXN0ZW5lckxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudFByb3BlcnR5OwotCi0vKioKLSAqIENsYXNzIG1hbmFnaW5nIG1ldGhvZCBlbGVtZW50IHByb3BlcnRpZXMKLSAqIAotICogQGF1dGhvciBXZWlwaW5nIEx1IC0gTWF5IDEwLCAyMDA4Ci0gKiBAc2luY2UgMS41Ci0gKi8KLXB1YmxpYyBjbGFzcyBNZXRob2RFbGVtZW50UHJvcGVydHlNZ3IgewotCi0JcHJpdmF0ZSBzdGF0aWMgTWV0aG9kRWxlbWVudFByb3BlcnR5TWdyIGluc3RhbmNlID0gbmV3IE1ldGhvZEVsZW1lbnRQcm9wZXJ0eU1ncigpOwotCi0JcHJpdmF0ZSBNYXA8TWV0aG9kRWxlbWVudCwgTWV0aG9kRWxlbWVudFByb3BlcnRpZXM+IHJlZ2lzdGVyZWRNYXAgPSAKLQkJCQkJCQluZXcgSGFzaE1hcDxNZXRob2RFbGVtZW50LCBNZXRob2RFbGVtZW50UHJvcGVydGllcz4oKTsKLQotCXByaXZhdGUgTGlzdGVuZXJMaXN0IGxpc3RlbmVycyA9IG5ldyBMaXN0ZW5lckxpc3QoKTsKLQkKLQlwcml2YXRlIE1ldGhvZEVsZW1lbnRQcm9wZXJ0eU1ncigpIHsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIE1ldGhvZEVsZW1lbnRQcm9wZXJ0eU1nciBnZXRJbnN0YW5jZSgpIHsKLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLQotCXB1YmxpYyBNZXRob2RFbGVtZW50UHJvcGVydGllcyByZWdpc3RlcihNZXRob2RFbGVtZW50IGVsZW1lbnQsCi0JCQlTdHJpbmdbXSBwcm9wTmFtZXMpIHsKLQkJTWV0aG9kRWxlbWVudFByb3BlcnRpZXMgcHJvcHMgPSBuZXcgTWV0aG9kRWxlbWVudFByb3BlcnRpZXMoZWxlbWVudCwgcHJvcE5hbWVzKTsKLQkJcmVnaXN0ZXIoZWxlbWVudCwgcHJvcHMpOwotCQlyZXR1cm4gcHJvcHM7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJlZ2lzdGVyKE1ldGhvZEVsZW1lbnQgZWxlbWVudCwKLQkJCU1ldGhvZEVsZW1lbnRQcm9wZXJ0aWVzIHByb3BzKSB7Ci0JCXVucmVnaXN0ZXIoZWxlbWVudCk7Ci0JCXJlZ2lzdGVyZWRNYXAucHV0KGVsZW1lbnQsIHByb3BzKTsKLQl9Ci0KLQlwdWJsaWMgTWV0aG9kRWxlbWVudFByb3BlcnRpZXMgdW5yZWdpc3RlcihNZXRob2RFbGVtZW50IGVsZW1lbnQpIHsKLQkJTWV0aG9kRWxlbWVudFByb3BlcnRpZXMgcHJvcHMgPSByZWdpc3RlcmVkTWFwLnJlbW92ZShlbGVtZW50KTsKLQkJaWYgKHByb3BzICE9IG51bGwpIHsKLQkJCXByb3BzLmRpc3Bvc2UoKTsKLQkJfQkJCi0JCXJldHVybiBwcm9wczsKLQl9Ci0JCi0JcHVibGljIE1ldGhvZEVsZW1lbnRQcm9wZXJ0eSBnZXRQcm9wZXJ0eShNZXRob2RFbGVtZW50IGUsIFN0cmluZyBwcm9wTmFtZSkgewotCQlNZXRob2RFbGVtZW50UHJvcGVydGllcyBwcm9wcyA9IHJlZ2lzdGVyZWRNYXAuZ2V0KGUpOwotCQlpZiAocHJvcHMgIT0gbnVsbCAmJiBwcm9wcy5wcm9wTmFtZVJlZ2lzdGVyZWQocHJvcE5hbWUpKSB7Ci0JCQlyZXR1cm4gcHJvcHMuZ2V0UHJvcGVydHkocHJvcE5hbWUpOwotCQl9IAkJCQotCQlyZXR1cm4gTWV0aG9kRWxlbWVudFByb3BlcnR5SGVscGVyLmdldFByb3BlcnR5KGUsIHByb3BOYW1lKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0UHJvcGVydHkoTWV0aG9kRWxlbWVudCBlLCBTdHJpbmcgcHJvcE5hbWUsIFN0cmluZyBwcm9wVmFsdWUpIHsKLQkJTWV0aG9kRWxlbWVudFByb3BlcnRpZXMgcHJvcHMgPSByZWdpc3RlcmVkTWFwLmdldChlKTsKLQkJaWYgKHByb3BzICE9IG51bGwgJiYgcHJvcHMucHJvcE5hbWVSZWdpc3RlcmVkKHByb3BOYW1lKSkgewotCQkJcHJvcHMuc2V0UHJvcGVydHkocHJvcE5hbWUsIHByb3BWYWx1ZSk7Ci0JCX0gZWxzZSB7Ci0JCQlNZXRob2RFbGVtZW50UHJvcGVydHlIZWxwZXIuc2V0UHJvcGVydHkoZSwgcHJvcE5hbWUsIHByb3BWYWx1ZSk7Ci0JCX0KLQl9Ci0JCQotCXB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKENoYW5nZUV2ZW50TGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJbGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKENoYW5nZUV2ZW50TGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJbGlzdGVuZXJzLnJlbW92ZShsaXN0ZW5lcik7Ci0JfQotCi0KLQlwdWJsaWMgc3RhdGljIGNsYXNzIENoYW5nZUV2ZW50TGlzdGVuZXIgewotCQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2UoQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgY2xhc3MgQ2hhbmdlRXZlbnQgewotCQlwdWJsaWMgU3RyaW5nIHByb3BOYW1lOwotCQlwdWJsaWMgTWV0aG9kRWxlbWVudFByb3BlcnR5IHByb3BFbGVtZW50OwotCQlwdWJsaWMgU3RyaW5nIG9sZFZhbHVlOwotCQlwdWJsaWMgU3RyaW5nIG5ld1ZhbHVlOwotCQlwdWJsaWMgQ2hhbmdlRXZlbnQoU3RyaW5nIHByb3BOYW1lLCBTdHJpbmcgb2xkVmFsdWUsIFN0cmluZyBuZXdWYWx1ZSkgewotCQkJdGhpcy5wcm9wRWxlbWVudCA9IHByb3BFbGVtZW50OwotCQkJdGhpcy5vbGRWYWx1ZSA9IG9sZFZhbHVlOwotCQkJdGhpcy5uZXdWYWx1ZSA9IG5ld1ZhbHVlOwotCQl9Ci0JCXB1YmxpYyBDaGFuZ2VFdmVudChNZXRob2RFbGVtZW50UHJvcGVydHkgcHJvcEVsZW1lbnQsIFN0cmluZyBvbGRWYWx1ZSwgU3RyaW5nIG5ld1ZhbHVlKSB7Ci0JCQl0aGlzKHByb3BFbGVtZW50ID09IG51bGwgPyBudWxsIDogcHJvcEVsZW1lbnQuZ2V0TmFtZSgpLCBvbGRWYWx1ZSwgbmV3VmFsdWUpOwotCQkJdGhpcy5wcm9wRWxlbWVudCA9IHByb3BFbGVtZW50OwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvTWV0aG9kRWxlbWVudFV0aWwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9NZXRob2RFbGVtZW50VXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiN2FhMWZhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9NZXRob2RFbGVtZW50VXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3VpZGFuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5Bc3NvY2lhdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLQotLyoqCi0gKiBDbGFzcyB3aXRoIHN0YXRpYyB1dGlsaXR5IG1ldGhvZHMgZm9yIHF1ZXJ5aW5nIG1ldGhvZCBlbGVtZW50Ci0gKiAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTWV0aG9kRWxlbWVudFV0aWwgewotCi0JLyoqCi0JICogUmV0dXJuIG1ldGhvZCBtb2RlbCBvZiB0aGUgb2JqZWN0Ci0JICogCi0JICogQHBhcmFtIG9iagotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1ldGhvZFBsdWdpbiBnZXRNZXRob2RNb2RlbChPYmplY3Qgb2JqKSB7Ci0JCXJldHVybiBVbWFVdGlsLmdldE1ldGhvZFBsdWdpbigoTWV0aG9kRWxlbWVudCkgb2JqKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGxpc3Qgb2YgbW9kZWxzIGFzIHNwZWNpZmllZC4uIDEuIE1ldGhvZCBtb2RlbCBvZiB0aGUgb2JqZWN0IDIuCi0JICogUmVmZXJlbmNlZCBtb2RlbHMgb2YgdGhlIG1ldGhvZCBtb2RlbCBvZiB0aGUgb2JqZWN0IChlLmcuIHJlZmVyZW5jZQotCSAqIHJlbGF0aW9uc2hpcCkKLQkgKiAKLQkgKiBAcGFyYW0gb2JqZWN0Ci0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRBbGxNb2RlbHMoT2JqZWN0IG9iamVjdCkgewotCQlMaXN0IGFsbE1vZGVscyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQkvLyBnZXQgbWV0aG9kIG1vZGVsIG9mIHRoZSBvYmplY3QKLQkJTWV0aG9kUGx1Z2luIG1vZGVsID0gZ2V0TWV0aG9kTW9kZWwob2JqZWN0KTsKLQotCQlpZiAobW9kZWwgIT0gbnVsbCkgewotCi0JCQkvLyBnZXQgYWxsIGJhc2UgbW9kZWxzCi0JCQkvLwotCQkJTWlzYy5nZXRBbGxCYXNlKG1vZGVsLCBhbGxNb2RlbHMpOwotCi0JCQlhbGxNb2RlbHMuYWRkKG1vZGVsKTsKLQotCQl9Ci0KLQkJcmV0dXJuIGFsbE1vZGVsczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHJlZmVyZW5jZXMgZ3VpZGFuY2VzIGZvciB0aGUgZ2l2ZW4gb2JqZWN0Ci0JICogCi0JICogQHBhcmFtIG9iamVjdAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3QgZ2V0U2VsZWN0ZWRHdWlkYW5jZXMoRU9iamVjdCBvYmplY3QpIHsKLQkJTGlzdCBpdGVtTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQlMaXN0IHJlZmVyZW5jZXMgPSAoKEVPYmplY3QpIG9iamVjdCkuZUNyb3NzUmVmZXJlbmNlcygpOwotCQlpZiAocmVmZXJlbmNlcyAhPSBudWxsICYmIHJlZmVyZW5jZXMuc2l6ZSgpID4gMCkgewotCQkJZm9yIChJdGVyYXRvciBpdCA9IHJlZmVyZW5jZXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBvYmogPSAoT2JqZWN0KSBpdC5uZXh0KCk7Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIEd1aWRhbmNlKSB7Ci0JCQkJCWl0ZW1MaXN0LmFkZChvYmopOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWl0ZW1MaXN0Ci0JCQkJLmFkZEFsbChBc3NvY2lhdGlvbkhlbHBlci5nZXRQcmFjdGljZXMoKENvbnRlbnRFbGVtZW50KSBvYmplY3QpKTsKLQotCQlyZXR1cm4gaXRlbUxpc3Q7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgYSBtYXAgYnVpbHQgZnJvbSB0aGUgZ2l2ZW4gZWxlbWVudHMuIFRoZSBtYXAgaGFzIGd1aWRzIGFzIGtleXMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1hcDxTdHJpbmcsIE1ldGhvZEVsZW1lbnQ+IGJ1aWxkTWFwKENvbGxlY3Rpb248PyBleHRlbmRzIE1ldGhvZEVsZW1lbnQ+IGVsZW1lbnRzKSB7Ci0JCU1hcDxTdHJpbmcsIE1ldGhvZEVsZW1lbnQ+IG1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgTWV0aG9kRWxlbWVudD4oKTsKLQkJCi0JCWlmIChlbGVtZW50cyAhPSBudWxsICYmICFlbGVtZW50cy5pc0VtcHR5KCkpIHsKLQkJCWZvciAoSXRlcmF0b3I8PyBleHRlbmRzIE1ldGhvZEVsZW1lbnQ+IGl0ID0gZWxlbWVudHMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCU1ldGhvZEVsZW1lbnQgZWxlbWVudCA9IGl0Lm5leHQoKTsKLQkJCQltYXAucHV0KGVsZW1lbnQuZ2V0R3VpZCgpLCBlbGVtZW50KTsKLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIG1hcDsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvTWlzYy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL01pc2MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDNiODJiOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvTWlzYy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTmFtZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFzazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5Bc3NvY2lhdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLQotCi0vKioKLSAqIE1hbnkgbWV0aG9kcyBvZiB0aGlzIGNsYXNzIGhhZCBiZWVuIG1vdmVkIHRvIG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5VbWFVdGlsCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBNaXNjIHsKLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBnZXRBbGxXb3JrUHJvZHVjdHMoQ29udGVudFBhY2thZ2UgcGtnLCBMaXN0IGxpc3QpIHsKLQkJTGlzdCBlbGVtZW50cyA9IHBrZy5nZXRDb250ZW50RWxlbWVudHMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbGVtZW50cy5zaXplKCk7IGkrKykgewotCQkJT2JqZWN0IG9iaiA9IGVsZW1lbnRzLmdldChpKTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBXb3JrUHJvZHVjdCkgewotCQkJCWxpc3QuYWRkKG9iaik7Ci0JCQl9Ci0JCX0KLQkJTGlzdCBwYWNrYWdlcyA9IHBrZy5nZXRDaGlsZFBhY2thZ2VzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcGFja2FnZXMuc2l6ZSgpOyBpKyspIHsKLQkJCU9iamVjdCBvYmogPSBwYWNrYWdlcy5nZXQoaSk7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UpIHsKLQkJCQlnZXRBbGxXb3JrUHJvZHVjdHMoKENvbnRlbnRQYWNrYWdlKSBvYmosIGxpc3QpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyBMaXN0IGdldEFsbFdvcmtQcm9kdWN0cyhDb250ZW50UGFja2FnZSBwa2cpIHsKLQkJTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlnZXRBbGxXb3JrUHJvZHVjdHMocGtnLCBsaXN0KTsKLQkJcmV0dXJuIGxpc3Q7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBnZXRBbGxUYXNrcyhDb250ZW50UGFja2FnZSBwa2csIExpc3QgbGlzdCkgewotCQlMaXN0IGVsZW1lbnRzID0gcGtnLmdldENvbnRlbnRFbGVtZW50cygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGVsZW1lbnRzLnNpemUoKTsgaSsrKSB7Ci0JCQlPYmplY3Qgb2JqID0gZWxlbWVudHMuZ2V0KGkpOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFRhc2spIHsKLQkJCQlsaXN0LmFkZChvYmopOwotCQkJfQotCQl9Ci0JCUxpc3QgcGFja2FnZXMgPSBwa2cuZ2V0Q2hpbGRQYWNrYWdlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHBhY2thZ2VzLnNpemUoKTsgaSsrKSB7Ci0JCQlPYmplY3Qgb2JqID0gcGFja2FnZXMuZ2V0KGkpOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIENvbnRlbnRQYWNrYWdlKSB7Ci0JCQkJZ2V0QWxsVGFza3MoKENvbnRlbnRQYWNrYWdlKSBvYmosIGxpc3QpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyBMaXN0IGdldEFsbFRhc2tzKENvbnRlbnRQYWNrYWdlIHBrZykgewotCQlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWdldEFsbFRhc2tzKHBrZywgbGlzdCk7Ci0JCXJldHVybiBsaXN0OwotCX0KLQotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRBbGxVbmNhdGVnb3JpemVkVGFza3MoQ29udGVudFBhY2thZ2UgcGtnKSB7Ci0JCUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZ2V0QWxsVW5jYXRlZ29yaXplZFRhc2tzKHBrZywgbGlzdCk7Ci0JCXJldHVybiBsaXN0OwotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgZ2V0QWxsVW5jYXRlZ29yaXplZFRhc2tzKENvbnRlbnRQYWNrYWdlIHBrZywgTGlzdCBsaXN0KSB7Ci0JCUxpc3QgZWxlbWVudHMgPSBwa2cuZ2V0Q29udGVudEVsZW1lbnRzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMuc2l6ZSgpOyBpKyspIHsKLQkJCU9iamVjdCBvYmogPSBlbGVtZW50cy5nZXQoaSk7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgVGFzawotCQkJCQkmJiBBc3NvY2lhdGlvbkhlbHBlci5nZXREaXNjaXBsaW5lcygoVGFzaykgb2JqKS5pc0VtcHR5KCkpIHsKLQkJCQlsaXN0LmFkZChvYmopOwotCQkJfQotCQl9Ci0JCUxpc3QgcGFja2FnZXMgPSBwa2cuZ2V0Q2hpbGRQYWNrYWdlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHBhY2thZ2VzLnNpemUoKTsgaSsrKSB7Ci0JCQlPYmplY3Qgb2JqID0gcGFja2FnZXMuZ2V0KGkpOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIENvbnRlbnRQYWNrYWdlKSB7Ci0JCQkJZ2V0QWxsVW5jYXRlZ29yaXplZFRhc2tzKChDb250ZW50UGFja2FnZSkgb2JqLCBsaXN0KTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nW10gZ2V0UGF0aFJlbGF0aXZlVG9QbHVnaW4oTmFtZWRFbGVtZW50IGUpIHsKLQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IFVtYVV0aWwuZ2V0TWV0aG9kUGx1Z2luKGUpOwotCQlBcnJheUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJbGlzdC5hZGQoU3RyaW5nLnZhbHVlT2YoZS5nZXROYW1lKCkpKTsKLQkJZm9yIChlID0gKE5hbWVkRWxlbWVudCkgKChFT2JqZWN0KSBlKS5lQ29udGFpbmVyKCk7IGUgIT0gbnVsbAotCQkJCSYmIGUgIT0gcGx1Z2luOyBlID0gKE5hbWVkRWxlbWVudCkgKChFT2JqZWN0KSBlKS5lQ29udGFpbmVyKCkpIHsKLQkJCWxpc3QuYWRkKDAsIFN0cmluZy52YWx1ZU9mKGUuZ2V0TmFtZSgpKSk7Ci0JCX0KLQkJU3RyaW5nW10gcGF0aCA9IG5ldyBTdHJpbmdbbGlzdC5zaXplKCldOwotCQlsaXN0LnRvQXJyYXkocGF0aCk7Ci0JCXJldHVybiBwYXRoOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIENvbGxlY3Rpb248TmFtZWRFbGVtZW50PiBnZXRPYmplY3RUcmVlUmVsYXRpdmVUb1BsdWdpbihOYW1lZEVsZW1lbnQgZSkgewotCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4oZSk7Ci0JCUFycmF5TGlzdDxOYW1lZEVsZW1lbnQ+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PE5hbWVkRWxlbWVudD4oKTsKLQkJbGlzdC5hZGQoZSk7Ci0JCWZvciAoZSA9IChOYW1lZEVsZW1lbnQpZS5lQ29udGFpbmVyKCk7IGUgIT0gbnVsbAotCQkJCSYmIGUgIT0gcGx1Z2luOyBlID0gKE5hbWVkRWxlbWVudCllLmVDb250YWluZXIoKSkgewotCQkJbGlzdC5hZGQoMCwgZSk7Ci0JCX0KLQkJcmV0dXJuIGxpc3Q7Ci0JfQotCi0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRQYXRoUmVsYXRpdmVUb0xpYnJhcnkoTmFtZWRFbGVtZW50IGUpIHsKLQkJaWYgKGUgPT0gbnVsbCkKLQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4oZSk7Ci0JCWlmIChwbHVnaW4gPT0gbnVsbCkKLQkJCXJldHVybiBlLmdldE5hbWUoKTsKLQkJU3RyaW5nQnVmZmVyIHBhdGggPSBuZXcgU3RyaW5nQnVmZmVyKGUuZ2V0TmFtZSgpKTsKLQkJU3RyaW5nW10gYXJyID0gZ2V0UGF0aFJlbGF0aXZlVG9QbHVnaW4oZSk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSB7Ci0JCQlwYXRoLmFwcGVuZCgnLycpLmFwcGVuZChhcnJbaV0pOwotCQl9Ci0JCXJldHVybiBwYXRoLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyBhbGwgYmFzZSBwbHVnaW5zIG9mIHRoZSBnaXZlbiBwbHVnaW4KLQkgKiAKLQkgKiBAcGFyYW0gcGx1Z2luCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRBbGxCYXNlKE1ldGhvZFBsdWdpbiBwbHVnaW4pIHsKLQkJTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlnZXRBbGxCYXNlKHBsdWdpbiwgbGlzdCk7Ci0JCXJldHVybiBsaXN0OwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBnZXRBbGxCYXNlKE1ldGhvZFBsdWdpbiBwbHVnaW4sIExpc3QgbGlzdCkgewotCQlMaXN0IGJhc2UgPSBwbHVnaW4uZ2V0QmFzZXMoKTsKLQotCQkvLyBDaGVjayBpZiB0aGUgYmFzZXMgaW4gdGhlIGxpc3QgYWxyZWFkeS4KLQkJaWYgKCFsaXN0LmNvbnRhaW5zQWxsKGJhc2UpKSB7Ci0JCQlsaXN0LmFkZEFsbChiYXNlKTsKLQkJfQotCQlmb3IgKGludCBpID0gMDsgaSA8IGJhc2Uuc2l6ZSgpOyBpKyspIHsKLQkJCXBsdWdpbiA9IChNZXRob2RQbHVnaW4pIGJhc2UuZ2V0KGkpOwotCQkJZ2V0QWxsQmFzZShwbHVnaW4sIGxpc3QpOwotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzQmFzZU9mKE1ldGhvZFBsdWdpbiBiYXNlLCBNZXRob2RQbHVnaW4gcGx1Z2luKSB7Ci0JCWlmIChwbHVnaW4gPT0gbnVsbCkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCk7Ci0JCX0KLQkJTGlzdCBiYXNlcyA9IHBsdWdpbi5nZXRCYXNlcygpOwotCQlpbnQgc2l6ZSA9IGJhc2VzLnNpemUoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCWlmIChiYXNlID09IGJhc2VzLmdldChpKSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJaWYgKGlzQmFzZU9mKGJhc2UsIChNZXRob2RQbHVnaW4pIGJhc2VzLmdldChpKSkpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL01vZGVsU3RydWN0dXJlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvTW9kZWxTdHJ1Y3R1cmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzNhMzU5MC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvTW9kZWxTdHJ1Y3R1cmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyNSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc1BhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotCi0KLS8qKgotICogRGVmaW5lcyBpbnRlcm5hbCBzdHJ1Y3R1cmUgb2YgYSBtZXRob2QgcGx1Z2luIHdpdGggcHJlZGVmaW5lZCBwYWNrYWdlcwotICogIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIE1vZGVsU3RydWN0dXJlIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgTW9kZWxTdHJ1Y3R1cmUgREVGQVVMVCA9IG5ldyBNb2RlbFN0cnVjdHVyZSgpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSElEREVOX1BBQ0tBR0VfTkFNRSA9ICJIaWRkZW4iOyAvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVEVOVF9QQUNLQUdFX05BTUUgPSAiQ29udGVudCI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT1JFX0NPTlRFTlRfUEFDQUtHRV9OQU1FID0gIkNvcmVDb250ZW50IjsgLy8kTk9OLU5MUy0xJAotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDQVRFR09SSUVTID0gIkNhdGVnb3JpZXMiOyAvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUk9MRV9TRVRfUEFDS0FHRV9OQU1FID0gIlJvbGVTZXRzIjsgLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERJU0NJUExJTkVfUEFDS0FHRV9OQU1FID0gIkRpc2NpcGxpbmVzIjsgLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENVU1RPTV9DQVRFR09SWV9QQUNLQUdFX05BTUUgPSAiQ3VzdG9tQ2F0ZWdvcmllcyI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIERFRkFVTFRfQ09SRV9DT05URU5UX1BBVEggPSB7Ci0JCUNPTlRFTlRfUEFDS0FHRV9OQU1FLCBDT1JFX0NPTlRFTlRfUEFDQUtHRV9OQU1FIH07Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBERUZBVUxUX1JPTEVfU0VUX1BBQ0tBR0VfUEFUSCA9IHsKLQkJQ09OVEVOVF9QQUNLQUdFX05BTUUsIENBVEVHT1JJRVMsICBST0xFX1NFVF9QQUNLQUdFX05BTUV9OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBERUZBVUxUX0RJU0NJUExJTkVfREVGX1BBVEggPSB7Ci0JCUNPTlRFTlRfUEFDS0FHRV9OQU1FLCBDQVRFR09SSUVTLCBESVNDSVBMSU5FX1BBQ0tBR0VfTkFNRSB9OwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gREVGQVVMVF9UT09MX1BBVEggPSB7Ci0JCUNPTlRFTlRfUEFDS0FHRV9OQU1FLCBDQVRFR09SSUVTLCAiVG9vbHMiIH07IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIERFRkFVTFRfU1RBTkRBUkRfQ0FURUdPUllfUEFUSCA9IHsKLQkJQ09OVEVOVF9QQUNLQUdFX05BTUUsIENBVEVHT1JJRVMsICJTdGFuZGFyZENhdGVnb3JpZXMiIH07IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIERFRkFVTFRfREVMSVZFUllfUFJPQ0VTU19QQVRIID0geyAiRGVsaXZlcnlQcm9jZXNzZXMiIH07IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIERFRkFVTFRfQ0FQQUJJTElUWV9QQVRURVJOX1BBVEggPSB7Ci0JCUNPTlRFTlRfUEFDS0FHRV9OQU1FLCAiQ2FwYWJpbGl0eVBhdHRlcm5zIiB9OyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZ1tdIERFRkFVTFRfRE9NQUlOX1BBVEggPSB7Ci0JCUNPTlRFTlRfUEFDS0FHRV9OQU1FLCBDQVRFR09SSUVTLCAiRG9tYWlucyIgfTsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBERUZBVUxUX1dPUktfUFJPRFVDVF9UWVBFX1BBVEggPSB7Ci0JCUNPTlRFTlRfUEFDS0FHRV9OQU1FLCBDQVRFR09SSUVTLCAiV1AgVHlwZXMiIH07IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nW10gREVGQVVMVF9DVVNUT01fQ0FURUdPUllfUEFUSCA9IHsKLQkJQ09OVEVOVF9QQUNLQUdFX05BTUUsIENBVEVHT1JJRVMsICBDVVNUT01fQ0FURUdPUllfUEFDS0FHRV9OQU1FfTsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZ1tdIERFRkFVTFRfRVNUSU1BVElOR19NT0RFTFNfUEFUSCA9IHsKLQkJQ09OVEVOVF9QQUNLQUdFX05BTUUsIENBVEVHT1JJRVMsICJFc3RpbWF0aW5nTW9kZWxzIiB9OyAvLyROT04tTkxTLTEkCi0KLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIERFRkFVTFRfUFJPQ0VTU19DT05UUklCVVRJT05fUEFUSCA9IHsgIlByb2Nlc3NDb250cmlidXRpb25zIiB9OyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBERUZBVUxUX1BST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfUEFUSCA9IHsgIlByb2Nlc3NQbGFubmluZ1RlbXBsYXRlcyIgfTsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDb2xsZWN0aW9uIEFMTF9QUkVERUZJTkVEX1BBVEhTID0gbmV3IEhhc2hTZXQoKTsKLQotCXB1YmxpYyBTdHJpbmdbXSBjb3JlQ29udGVudFBhdGg7Ci0KLQlwdWJsaWMgU3RyaW5nW10gcm9sZVNldFBhdGg7Ci0KLQlwdWJsaWMgU3RyaW5nW10gZGlzY2lwbGluZURlZmluaXRpb25QYXRoOwotCi0JcHVibGljIFN0cmluZ1tdIGRvbWFpblBhdGg7Ci0KLQlwdWJsaWMgU3RyaW5nW10gdG9vbFBhdGg7Ci0KLQlwdWJsaWMgU3RyaW5nW10gY2FwYWJpbGl0eVBhdHRlcm5QYXRoOwotCi0JcHVibGljIFN0cmluZ1tdIGRlbGl2ZXJ5UHJvY2Vzc1BhdGg7Ci0KLQlwdWJsaWMgU3RyaW5nW10gd29ya1Byb2R1Y3RUeXBlUGF0aDsKLQotCXB1YmxpYyBTdHJpbmdbXSBwcm9jZXNzQ29udHJpYnV0aW9uUGF0aDsKLQotCXB1YmxpYyBTdHJpbmdbXSBjdXN0b21DYXRlZ29yeVBhdGg7Ci0KLQlwdWJsaWMgU3RyaW5nW10gZXN0aW1hdGluZ01vZGVsUGF0aDsKLQkKLQlwdWJsaWMgU3RyaW5nW10gc3RhbmRhcmRDYXRlZ29yeVBhdGg7Ci0KLQlwdWJsaWMgU3RyaW5nW10gcHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGVQYXRoOwotCi0JLyoqCi0JICogdGhpcyBpcyB0aGUgbWV0aG9kIHRvIHJldHVybiBhbGwgdGhlIHN5c3RlbSBkZWZpbmVkIHBhY2thZ2UgcGF0aCBQbGVhc2UKLQkgKiBhZGQgdGhpcyB0aGlzIGFycmF5IHdoZW4gZXZlciB5b3UgaGF2ZSBuZXcgc3lzdGVtIHBhY2thZ2VzIGRlZmluZWQKLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIFN0cmluZ1tdW10gZ2V0QWxsU3lzdGVtUGF0aHMoKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nW11bXSB7IGNvcmVDb250ZW50UGF0aCwgcm9sZVNldFBhdGgsCi0JCQkJZGlzY2lwbGluZURlZmluaXRpb25QYXRoLCBkb21haW5QYXRoLCB0b29sUGF0aCwKLQkJCQljYXBhYmlsaXR5UGF0dGVyblBhdGgsIGRlbGl2ZXJ5UHJvY2Vzc1BhdGgsCi0JCQkJd29ya1Byb2R1Y3RUeXBlUGF0aCwgcHJvY2Vzc0NvbnRyaWJ1dGlvblBhdGgsCi0JCQkJY3VzdG9tQ2F0ZWdvcnlQYXRoLCBzdGFuZGFyZENhdGVnb3J5UGF0aCwKLQkJCQlwcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZVBhdGgsIH07Ci0JfQotCi0JcHVibGljIFN0cmluZ1tdW10gZ2V0Q2F0ZWdvcnlQYXRocygpIHsKLQkJcmV0dXJuIG5ldyBTdHJpbmdbXVtdIHsgcm9sZVNldFBhdGgsIGRpc2NpcGxpbmVEZWZpbml0aW9uUGF0aCwKLQkJCQlkb21haW5QYXRoLCB0b29sUGF0aCwgd29ya1Byb2R1Y3RUeXBlUGF0aCwKLQkJCQlzdGFuZGFyZENhdGVnb3J5UGF0aCwgY3VzdG9tQ2F0ZWdvcnlQYXRoLCB9OwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRvTGluZXMoU3RyaW5nW10gcGF0aCkgewotCQlTdHJpbmdCdWZmZXIgbGluZXMgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWludCBtYXggPSBwYXRoLmxlbmd0aCAtIDE7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbWF4OyBpKyspIHsKLQkJCWxpbmVzLmFwcGVuZChwYXRoW2ldKS5hcHBlbmQoJ1xuJyk7Ci0JCX0KLQkJbGluZXMuYXBwZW5kKHBhdGhbbWF4XSk7Ci0JCXJldHVybiBsaW5lcy50b1N0cmluZygpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRvRmlsZVBhdGgoU3RyaW5nW10gcGF0aCkgewotCQlTdHJpbmdCdWZmZXIgbGluZXMgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWludCBtYXggPSBwYXRoLmxlbmd0aDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtYXg7IGkrKykgewotCQkJbGluZXMuYXBwZW5kKHBhdGhbaV0pLmFwcGVuZCgnLycpOwotCQl9Ci0JCXJldHVybiBsaW5lcy50b1N0cmluZygpOwotCX0KLQotCXN0YXRpYyB7Ci0JCURFRkFVTFQuY29yZUNvbnRlbnRQYXRoID0gREVGQVVMVF9DT1JFX0NPTlRFTlRfUEFUSDsKLQkJREVGQVVMVC5kaXNjaXBsaW5lRGVmaW5pdGlvblBhdGggPSBERUZBVUxUX0RJU0NJUExJTkVfREVGX1BBVEg7Ci0JCURFRkFVTFQucm9sZVNldFBhdGggPSBERUZBVUxUX1JPTEVfU0VUX1BBQ0tBR0VfUEFUSDsKLQkJREVGQVVMVC5kb21haW5QYXRoID0gREVGQVVMVF9ET01BSU5fUEFUSDsKLQkJREVGQVVMVC50b29sUGF0aCA9IERFRkFVTFRfVE9PTF9QQVRIOwotCQlERUZBVUxULmNhcGFiaWxpdHlQYXR0ZXJuUGF0aCA9IERFRkFVTFRfQ0FQQUJJTElUWV9QQVRURVJOX1BBVEg7Ci0JCURFRkFVTFQuZGVsaXZlcnlQcm9jZXNzUGF0aCA9IERFRkFVTFRfREVMSVZFUllfUFJPQ0VTU19QQVRIOwotCQlERUZBVUxULndvcmtQcm9kdWN0VHlwZVBhdGggPSBERUZBVUxUX1dPUktfUFJPRFVDVF9UWVBFX1BBVEg7Ci0JCURFRkFVTFQucHJvY2Vzc0NvbnRyaWJ1dGlvblBhdGggPSBERUZBVUxUX1BST0NFU1NfQ09OVFJJQlVUSU9OX1BBVEg7Ci0JCURFRkFVTFQuc3RhbmRhcmRDYXRlZ29yeVBhdGggPSBERUZBVUxUX1NUQU5EQVJEX0NBVEVHT1JZX1BBVEg7Ci0JCURFRkFVTFQuY3VzdG9tQ2F0ZWdvcnlQYXRoID0gREVGQVVMVF9DVVNUT01fQ0FURUdPUllfUEFUSDsKLQkJREVGQVVMVC5lc3RpbWF0aW5nTW9kZWxQYXRoID0gREVGQVVMVF9FU1RJTUFUSU5HX01PREVMU19QQVRIOwotCQlERUZBVUxULnByb2Nlc3NQbGFubmluZ1RlbXBsYXRlUGF0aCA9IERFRkFVTFRfUFJPQ0VTU19QTEFOTklOR19URU1QTEFURV9QQVRIOwotCi0JCUFMTF9QUkVERUZJTkVEX1BBVEhTLmFkZCh0b0ZpbGVQYXRoKERFRkFVTFQuY29yZUNvbnRlbnRQYXRoKSk7Ci0JCUFMTF9QUkVERUZJTkVEX1BBVEhTLmFkZCh0b0ZpbGVQYXRoKERFRkFVTFQuZGlzY2lwbGluZURlZmluaXRpb25QYXRoKSk7Ci0JCUFMTF9QUkVERUZJTkVEX1BBVEhTLmFkZCh0b0ZpbGVQYXRoKERFRkFVTFQucm9sZVNldFBhdGgpKTsKLQkJQUxMX1BSRURFRklORURfUEFUSFMuYWRkKHRvRmlsZVBhdGgoREVGQVVMVC5kb21haW5QYXRoKSk7Ci0JCUFMTF9QUkVERUZJTkVEX1BBVEhTLmFkZCh0b0ZpbGVQYXRoKERFRkFVTFQudG9vbFBhdGgpKTsKLQkJQUxMX1BSRURFRklORURfUEFUSFMuYWRkKHRvRmlsZVBhdGgoREVGQVVMVC5jYXBhYmlsaXR5UGF0dGVyblBhdGgpKTsKLQkJQUxMX1BSRURFRklORURfUEFUSFMuYWRkKHRvRmlsZVBhdGgoREVGQVVMVC5kZWxpdmVyeVByb2Nlc3NQYXRoKSk7Ci0JCUFMTF9QUkVERUZJTkVEX1BBVEhTLmFkZCh0b0ZpbGVQYXRoKERFRkFVTFQud29ya1Byb2R1Y3RUeXBlUGF0aCkpOwotCQlBTExfUFJFREVGSU5FRF9QQVRIUy5hZGQodG9GaWxlUGF0aChERUZBVUxULnByb2Nlc3NDb250cmlidXRpb25QYXRoKSk7Ci0JCUFMTF9QUkVERUZJTkVEX1BBVEhTLmFkZCh0b0ZpbGVQYXRoKERFRkFVTFQuc3RhbmRhcmRDYXRlZ29yeVBhdGgpKTsKLQkJQUxMX1BSRURFRklORURfUEFUSFMuYWRkKHRvRmlsZVBhdGgoREVGQVVMVC5jdXN0b21DYXRlZ29yeVBhdGgpKTsKLQkJQUxMX1BSRURFRklORURfUEFUSFMuYWRkKHRvRmlsZVBhdGgoREVGQVVMVC5lc3RpbWF0aW5nTW9kZWxQYXRoKSk7Ci0JCUFMTF9QUkVERUZJTkVEX1BBVEhTCi0JCQkJLmFkZCh0b0ZpbGVQYXRoKERFRkFVTFQucHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGVQYXRoKSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBQcm9jZXNzUGFja2FnZSBjcmVhdGVQcm9jZXNzQ29udHJpYnV0aW9uUGFja2FnZSgKLQkJCU1ldGhvZFBsdWdpbiBwbHVnaW4pIHsKLQkJLy8gYm9vbGVhbiBvbGQgPSBwbHVnaW4uZURlbGl2ZXIoKTsKLQkJdHJ5IHsKLQkJCS8vIGNyZWF0ZSBQcm9jZXNzQ29udHJpYnV0aW9ucyBwcm9jZXNzIHBhY2thZ2UKLQkJCS8vCi0JCQlQcm9jZXNzUGFja2FnZSBwa2cgPSBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQcm9jZXNzUGFja2FnZSgpOwotCQkJcGtnLnNldE5hbWUoTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC5wcm9jZXNzQ29udHJpYnV0aW9uUGF0aFswXSk7Ci0KLQkJCS8vIGRpc2FibGUgbm90aWZpY2F0aW9uCi0JCQkvLwotCQkJcGx1Z2luLmVTZXREZWxpdmVyKGZhbHNlKTsKLQotCQkJcGx1Z2luLmdldE1ldGhvZFBhY2thZ2VzKCkuYWRkKHBrZyk7Ci0JCQlyZXR1cm4gcGtnOwotCQl9IGZpbmFsbHkgewotCQkJLy8gcmVzdG9yZSBvcmlnaW5hbCBub3RpZmFjdGlvbiBzZXR0aW5nCi0JCQkvLwotCQkJcGx1Z2luLmVTZXREZWxpdmVyKHRydWUpOwotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyBQcm9jZXNzUGFja2FnZSBjcmVhdGVQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZVBhY2thZ2UoCi0JCQlNZXRob2RQbHVnaW4gcGx1Z2luKSB7Ci0JCS8vIGJvb2xlYW4gb2xkID0gcGx1Z2luLmVEZWxpdmVyKCk7Ci0JCXRyeSB7Ci0JCQkvLyBjcmVhdGUgUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGVzIHByb2Nlc3MgcGFja2FnZQotCQkJLy8KLQkJCVByb2Nlc3NQYWNrYWdlIHBrZyA9IFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVByb2Nlc3NQYWNrYWdlKCk7Ci0JCQlwa2cuc2V0TmFtZShNb2RlbFN0cnVjdHVyZS5ERUZBVUxULnByb2Nlc3NQbGFubmluZ1RlbXBsYXRlUGF0aFswXSk7Ci0KLQkJCS8vIGRpc2FibGUgbm90aWZpY2F0aW9uCi0JCQkvLwotCQkJcGx1Z2luLmVTZXREZWxpdmVyKGZhbHNlKTsKLQotCQkJcGx1Z2luLmdldE1ldGhvZFBhY2thZ2VzKCkuYWRkKHBrZyk7Ci0JCQlyZXR1cm4gcGtnOwotCQl9IGZpbmFsbHkgewotCQkJLy8gcmVzdG9yZSBvcmlnaW5hbCBub3RpZmFjdGlvbiBzZXR0aW5nCi0JCQkvLwotCQkJcGx1Z2luLmVTZXREZWxpdmVyKHRydWUpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvUGx1Z2luVUlQYWNrYWdlc01hcC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL1BsdWdpblVJUGFja2FnZXNNYXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmQzODZhYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvUGx1Z2luVUlQYWNrYWdlc01hcC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotCi0vKioKLSAqIEhvbGRzIGEgbWFwIG9mIFBsdWdpbiBQYWNrYWdlIG5hbWVzIHRvIHRoZSBsaXN0IG9mIHBsdWdpbnMgY29udGFpbmVkIGJ5IHRoZW0KLSAqIEBhdXRob3IgSmVmZiBIYXJkeQotICoKLSAqLwotcHVibGljIGNsYXNzIFBsdWdpblVJUGFja2FnZXNNYXAgZXh0ZW5kcyBIYXNoTWFwPFN0cmluZywgU2V0PE1ldGhvZFBsdWdpbj4+IHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC04MzIxMzc5MDE1ODcwMDkwMjU2TDsKLQotCXB1YmxpYyBQbHVnaW5VSVBhY2thZ2VzTWFwKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBhZGQoU3RyaW5nIHBhY2thZ2VOYW1lLCBNZXRob2RQbHVnaW4gcGx1Z2luKSB7Ci0JCVNldDxNZXRob2RQbHVnaW4+IHBsdWdpbnMgPSBnZXQocGFja2FnZU5hbWUpOwotCQlpZiAocGx1Z2lucyA9PSBudWxsKSB7Ci0JCQlwbHVnaW5zID0gbmV3IEhhc2hTZXQ8TWV0aG9kUGx1Z2luPigpOwotCQl9Ci0JCXBsdWdpbnMuYWRkKHBsdWdpbik7Ci0JCXB1dChwYWNrYWdlTmFtZSwgcGx1Z2lucyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL1ByZWRlY2Vzc29yTGlzdC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL1ByZWRlY2Vzc29yTGlzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MWRiNzQyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9QcmVkZWNlc3Nvckxpc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5BZGFwdGVyRmFjdG9yeVRyZWVJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLklCU0l0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50UHJvcGVydHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NaWxlc3RvbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtPcmRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtPcmRlclR5cGU7Ci0KLS8qKgotICogVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgcHJlZGVjZXNzb3IgbGlzdCBvZiBhbiBpdGVtIHByb3ZpZGVyIGZvciBhIHdvcmsKLSAqIGJyZWFrZG93biBlbGVtZW50LiBJdCBjYWxjdWxhdGVzIHRoZSBwcmVkZWNlc3NvcnMgYmFzZWQgb24gdGhlIGN1cnJlbnRseQotICogc2VsZWN0ZWQgY29uZmlndXJhdGlvbiBhbmQgYWNjb3JkaW5nIHRvIHZhcmlhYmlsaXR5IHJ1bGVzLiBJdCBjYW4gcmVmcmVzaAotICogaXRzZWxmIHVwb24gY2hhbmdlIGluIHByZWRlY2Vzc29yIGxpc3Qgb2Ygd29yayBicmVha2Rvd24gZWxlbWVudC4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFByZWRlY2Vzc29yTGlzdCBleHRlbmRzIEFycmF5TGlzdDxPYmplY3Q+IHsKLQkvKioKLQkgKiBDb21tZW50IGZvciA8Y29kZT5zZXJpYWxWZXJzaW9uVUlEPC9jb2RlPgotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDM2MTc4NTMwOTI1NzA0MTIwODJMOwkKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklOSVNIX1RPX1NUQVJUID0gTGlicmFyeUVkaXRSZXNvdXJjZXMuV29ya09yZGVyVHlwZUFiYnJldmlhdGlvbl9GSU5JU0hfVE9fU1RBUlQ7IAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGSU5JU0hfVE9fRklOSVNIID0gTGlicmFyeUVkaXRSZXNvdXJjZXMuV29ya09yZGVyVHlwZUFiYnJldmlhdGlvbl9GSU5JU0hfVE9fRklOSVNIOyAKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RBUlRfVE9fU1RBUlQgPSBMaWJyYXJ5RWRpdFJlc291cmNlcy5Xb3JrT3JkZXJUeXBlQWJicmV2aWF0aW9uX1NUQVJUX1RPX1NUQVJUOyAKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RBUlRfVE9fRklOSVNIID0gTGlicmFyeUVkaXRSZXNvdXJjZXMuV29ya09yZGVyVHlwZUFiYnJldmlhdGlvbl9TVEFSVF9UT19GSU5JU0g7IAotCXByaXZhdGUgTWFwIG1hcDRMaW5rVHlwZSA9IG5ldyBIYXNoTWFwKCk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFByZWRlY2Vzc29yTGlzdCBFTVBUWV9MSVNUID0gbmV3IFByZWRlY2Vzc29yTGlzdCgpIHsKLQotCQkvKioKLQkJICogQ29tbWVudCBmb3IgPGNvZGU+c2VyaWFsVmVyc2lvblVJRDwvY29kZT4KLQkJICovCi0JCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDM5MDQ2NzYwOTgyMTcwOTcwMTZMOwotCi0JCXB1YmxpYyB2b2lkIHJlZnJlc2goKSB7Ci0KLQkJfQotCi0JCXB1YmxpYyB2b2lkIGFkZChpbnQgaW5kZXgsIE9iamVjdCBlbGVtZW50KSB7Ci0KLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGFkZChPYmplY3QgbykgewotCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBhZGRBbGwoamF2YS51dGlsLkNvbGxlY3Rpb24gYykgewotCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBhZGRBbGwoaW50IGluZGV4LCBqYXZhLnV0aWwuQ29sbGVjdGlvbiBjKSB7Ci0JCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQkJfQotCi0JfTsKLQotCXByaXZhdGUgQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3Rvcnk7Ci0KLQlwcml2YXRlIE9iamVjdCBvYmplY3Q7Ci0KLQlwcml2YXRlIEFkYXB0ZXIgbGlzdGVuZXIgPSBuZXcgQWRhcHRlckltcGwoKSB7Ci0JCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uIG1zZykgewotCQkJc3dpdGNoIChtc2cuZ2V0RmVhdHVyZUlEKEJyZWFrZG93bkVsZW1lbnQuY2xhc3MpKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19CUkVBS0RPV05fRUxFTUVOVF9fTElOS19UT19QUkVERUNFU1NPUjoKLQkJCQlyZWZyZXNoKCk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JfTsKLQotCXByaXZhdGUgT2JqZWN0IHRvcDsKLQotCXByaXZhdGUgUHJlZGVjZXNzb3JMaXN0KCkgewotCi0JfQotCi0JcHVibGljIFByZWRlY2Vzc29yTGlzdChBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwgT2JqZWN0IG9iamVjdCkgewotCQl0aGlzLmFkYXB0ZXJGYWN0b3J5ID0gYWRhcHRlckZhY3Rvcnk7Ci0JCXRoaXMub2JqZWN0ID0gb2JqZWN0OwotCQlCcmVha2Rvd25FbGVtZW50IGUgPSAoQnJlYWtkb3duRWxlbWVudCkgVG5nVXRpbC51bndyYXAob2JqZWN0KTsKLQkJZS5lQWRhcHRlcnMoKS5hZGQoMCwgbGlzdGVuZXIpOwotCQlpZiAoIW1hcDRMaW5rVHlwZS5pc0VtcHR5KCkpCi0JCQltYXA0TGlua1R5cGUuY2xlYXIoKTsKLQkJaW5pdGlhbGl6ZSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCU9iamVjdCBlID0gVG5nVXRpbC51bndyYXAob2JqZWN0KTsKLQkJaWYgKGUgaW5zdGFuY2VvZiBFT2JqZWN0KSB7Ci0JCQkoKEVPYmplY3QpIGUpLmVBZGFwdGVycygpLnJlbW92ZShsaXN0ZW5lcik7Ci0JCX0KLQkJY2xlYXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSByaWdodCB0b3AgaXRlbSBpbiB0aGUgYnJlYWtkb3duIHN0cnVjdHVyZSB0cmVlIHRvIHNlYXJjaCBmb3IKLQkgKiBpdGVtIHByb3ZpZGVycyBvZiBwcmVkZWNlc3NvcnMKLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBnZXRUb3BJdGVtKCkgewotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIHsKLQkJCUJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyIGl0ZW1Qcm92aWRlciA9IChCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgb2JqZWN0OwotCQkJaWYgKGl0ZW1Qcm92aWRlci5pc1JlYWRPbmx5KCkpIHsKLQkJCQkvLyB0aGlzIHJlcHJlc2VudHMgYW4gaW5oZXJpdGVkIGJyZWFrZG93biBlbGVtZW50Ci0JCQkJLy8KLQkJCQlCcmVha2Rvd25FbGVtZW50IGUgPSAoQnJlYWtkb3duRWxlbWVudCkgVG5nVXRpbC51bndyYXAob2JqZWN0KTsKLQkJCQlQcm9jZXNzIHByb2MgPSBUbmdVdGlsLmdldE93bmluZ1Byb2Nlc3MoZSk7Ci0KLQkJCQlPYmplY3QgdG9wID0gaXRlbVByb3ZpZGVyOwotCQkJCWZvciAoT2JqZWN0IHBhcmVudCA9IGl0ZW1Qcm92aWRlci5nZXRQYXJlbnQob2JqZWN0KTsgcGFyZW50ICE9IG51bGw7KSB7Ci0JCQkJCXRvcCA9IHBhcmVudDsKLQkJCQkJQnJlYWtkb3duRWxlbWVudCBwYXJlbnRFbGVtZW50ID0gKEJyZWFrZG93bkVsZW1lbnQpIFRuZ1V0aWwKLQkJCQkJCQkudW53cmFwKHBhcmVudCk7Ci0JCQkJCVByb2Nlc3MgcGFyZW50UHJvYyA9IFRuZ1V0aWwKLQkJCQkJCQkuZ2V0T3duaW5nUHJvY2VzcyhwYXJlbnRFbGVtZW50KTsKLQkJCQkJaWYgKHBhcmVudFByb2MgIT0gcHJvYykgewotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlcikgewotCQkJCQkJcGFyZW50ID0gKChJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIpIHBhcmVudCkKLQkJCQkJCQkJLmdldFBhcmVudChwYXJlbnQpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyIGFkYXB0ZXIgPSAoSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyKSBhZGFwdGVyRmFjdG9yeQotCQkJCQkJCQkuYWRhcHQocGFyZW50LCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkJCQkJcGFyZW50ID0gYWRhcHRlci5nZXRQYXJlbnQocGFyZW50KTsKLQkJCQkJfQotCQkJCX0KLQkJCQlyZXR1cm4gdG9wOwotCQkJfSBlbHNlIHsKLQkJCQlyZXR1cm4gaXRlbVByb3ZpZGVyLmdldFRvcEl0ZW0oKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCUlCU0l0ZW1Qcm92aWRlciBhZGFwdGVyID0gKElCU0l0ZW1Qcm92aWRlcikgYWRhcHRlckZhY3RvcnkuYWRhcHQoCi0JCQkJCW9iamVjdCwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCXJldHVybiBhZGFwdGVyLmdldFRvcEl0ZW0oKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGNsYXNzIERlcHRoTGV2ZWxJdGVtUHJvdmlkZXIgewotCQlwcml2YXRlIGludCBkZXB0aExldmVsOwotCQlwcml2YXRlIE9iamVjdCBpdGVtUHJvdmlkZXI7Ci0JCXByaXZhdGUgT2JqZWN0IG9iamVjdDsKLQkJcHJpdmF0ZSBPYmplY3QgZWxlbWVudDsKLQkJCi0JCXByaXZhdGUgRGVwdGhMZXZlbEl0ZW1Qcm92aWRlcihPYmplY3Qgb2JqZWN0LCBpbnQgZGVwdGhMZXZlbCwgT2JqZWN0IGl0ZW1Qcm92aWRlciwgT2JqZWN0IGVsZW1lbnQpIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLm9iamVjdCA9IG9iamVjdDsKLQkJCXRoaXMuZGVwdGhMZXZlbCA9IGRlcHRoTGV2ZWw7Ci0JCQl0aGlzLml0ZW1Qcm92aWRlciA9IGl0ZW1Qcm92aWRlcjsKLQkJCXRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7Ci0JCX0JCi0JCQotCQlwdWJsaWMgT2JqZWN0IGdldEl0ZW1Qcm92aWRlcigpIHsKLQkJCXJldHVybiBpdGVtUHJvdmlkZXI7Ci0JCX0KLQl9Ci0JCi0Jc3RhdGljIExpc3Q8RGVwdGhMZXZlbEl0ZW1Qcm92aWRlcj4gY3JlYXRlSXRlbVByb3ZpZGVyTGlzdChPYmplY3QgdG9wLCBBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlMaXN0PERlcHRoTGV2ZWxJdGVtUHJvdmlkZXI+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PERlcHRoTGV2ZWxJdGVtUHJvdmlkZXI+KCk7Ci0JCURlcHRoTGV2ZWxBZGFwdGVyRmFjdG9yeVRyZWVJdGVyYXRvcjxPYmplY3Q+IGl0ZXIgPSBuZXcgRGVwdGhMZXZlbEFkYXB0ZXJGYWN0b3J5VHJlZUl0ZXJhdG9yPE9iamVjdD4oCi0JCQkJYWRhcHRlckZhY3RvcnksIHRvcCkgewotCQkJCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQkJCQkJQE92ZXJyaWRlCi0JCQkJCXByb3RlY3RlZCBJdGVyYXRvcjxPYmplY3Q+IGdldENoaWxkcmVuKE9iamVjdCBvKSB7Ci0JCQkJCQlPYmplY3QgZSA9IFRuZ1V0aWwudW53cmFwKG8pOyAKLQkJCQkJCWlmKGUgaW5zdGFuY2VvZiBEZXNjcmlwdG9yIHx8IGUgaW5zdGFuY2VvZiBNaWxlc3RvbmUpIHsKLQkJCQkJCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCkuaXRlcmF0b3IoKTsKLQkJCQkJCX0KLQkJCQkJCXJldHVybiBzdXBlci5nZXRDaGlsZHJlbihvKTsKLQkJCQkJfQkJCQotCQl9OwotCQlmb3IoOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBvYmplY3QgPSBpdGVyLm5leHQoKTsKLQkJCU9iamVjdCBlbGVtZW50ID0gVG5nVXRpbC51bndyYXAob2JqZWN0KTsKLQkJCWlmKGVsZW1lbnQgaW5zdGFuY2VvZiBXb3JrQnJlYWtkb3duRWxlbWVudCkgewotCQkJCWludCBkZXB0aExldmVsID0gaXRlci5nZXREZXB0aExldmVsKCk7Ci0JCQkJT2JqZWN0IGl0ZW1Qcm92aWRlciA9IGFkYXB0ZXJGYWN0b3J5LmFkYXB0KG9iamVjdCwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCQlsaXN0LmFkZChuZXcgRGVwdGhMZXZlbEl0ZW1Qcm92aWRlcihvYmplY3QsIGRlcHRoTGV2ZWwsIGl0ZW1Qcm92aWRlciwgZWxlbWVudCkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBsaXN0OwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyB2b2lkIHVwZGF0ZUVsZW1lbnRUb0l0ZW1Qcm92aWRlcnNNYXAoTWFwPE9iamVjdCwgQ29sbGVjdGlvbjxPYmplY3Q+PiBtYXAsIE9iamVjdCBlbGVtZW50LCBPYmplY3QgaXRlbVByb3ZpZGVyKSB7Ci0JCUNvbGxlY3Rpb248T2JqZWN0PiBpdGVtUHJvdmlkZXJzID0gbWFwLmdldChlbGVtZW50KTsKLQkJaWYoaXRlbVByb3ZpZGVycyA9PSBudWxsKSB7Ci0JCQlpdGVtUHJvdmlkZXJzID0gbmV3IEFycmF5TGlzdDxPYmplY3Q+KCk7Ci0JCQltYXAucHV0KGVsZW1lbnQsIGl0ZW1Qcm92aWRlcnMpOwotCQl9Ci0JCWl0ZW1Qcm92aWRlcnMuYWRkKGl0ZW1Qcm92aWRlcik7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgVmFyaWFiaWxpdHlFbGVtZW50KSB7Ci0JCQlWYXJpYWJpbGl0eUVsZW1lbnQgdmUgPSAoVmFyaWFiaWxpdHlFbGVtZW50KSBlbGVtZW50OwotCQkJaWYgKHZlLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSAhPSBudWxsKSB7Ci0JCQkJaXRlbVByb3ZpZGVycyA9IG1hcC5nZXQodmUuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpKTsKLQkJCQlpZihpdGVtUHJvdmlkZXJzID09IG51bGwpIHsKLQkJCQkJaXRlbVByb3ZpZGVycyA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PigpOwotCQkJCQltYXAucHV0KHZlLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSwgaXRlbVByb3ZpZGVycyk7Ci0JCQkJfQotCQkJCWl0ZW1Qcm92aWRlcnMuYWRkKGl0ZW1Qcm92aWRlcik7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JTWFwPD8sIENvbGxlY3Rpb248T2JqZWN0Pj4gY3JlYXRlQnJlYWtkb3duRWxlbWVudFRvSXRlbVByb3ZpZGVyTWFwKExpc3Q8RGVwdGhMZXZlbEl0ZW1Qcm92aWRlcj4gbGlzdCkgewotCQlPYmplY3QgdG9wID0gZ2V0VG9wSXRlbSgpOwotCQkvLyBmaW5kIHRvcCdzIGl0ZW0gcHJvdmlkZXIKLQkJLy8KLQkJRGVwdGhMZXZlbEl0ZW1Qcm92aWRlciB0b3BJcCA9IG51bGw7Ci0JCWludCBzdGFydEluZGV4ID0gMDsKLQkJZm9yIChEZXB0aExldmVsSXRlbVByb3ZpZGVyIGl0ZW1Qcm92aWRlciA6IGxpc3QpIHsKLQkJCWlmKGl0ZW1Qcm92aWRlci5vYmplY3QgPT0gdG9wKSB7Ci0JCQkJdG9wSXAgPSBpdGVtUHJvdmlkZXI7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlzdGFydEluZGV4Kys7Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0IHRvcElwICE9IG51bGwgOiAiQ291bGQgbm90IGZpbmQgaXRlbSBwcm92aWRlciBvZiB0b3Agb2JqZWN0IGluIHRoZSBnaXZlbiBpdGVtIHByb3ZpZGVyIGxpc3QuIjsgLy8kTk9OLU5MUy0xJAotCQkvLyBmaW5kIHRoZSBpbmRleCBvZiBsYXN0IGl0ZW0gcHJvdmlkZXIgaW4gdGhlIHN1YnRyZWUgb2YgdG9wCi0JCS8vCi0JCWludCBzaXplID0gbGlzdC5zaXplKCk7Ci0JCWludCBsYXN0SW5kZXggPSBzdGFydEluZGV4ICsgMTsKLQkJZm9yICg7IGxhc3RJbmRleCA8IHNpemUgJiYgbGlzdC5nZXQobGFzdEluZGV4KS5kZXB0aExldmVsID4gdG9wSXAuZGVwdGhMZXZlbDsgbGFzdEluZGV4KyspOwkJCi0JCQkKLQkJLy8gY29weSB0aGUgdHJlZSB0byBhIG1hcCBvZiBicmVha2Rvd24gZWxlbWVudCAvIGl0ZW0gcHJvdmlkZXIgZm9yCi0JCS8vIHJldXNlCi0JCS8vCi0JCUhhc2hNYXA8T2JqZWN0LCBDb2xsZWN0aW9uPE9iamVjdD4+IG1hcCA9IG5ldyBIYXNoTWFwPE9iamVjdCwgQ29sbGVjdGlvbjxPYmplY3Q+PigpOwotCQlmb3IgKERlcHRoTGV2ZWxJdGVtUHJvdmlkZXIgaXRlbVByb3ZpZGVyIDogbGlzdC5zdWJMaXN0KHN0YXJ0SW5kZXgsIGxhc3RJbmRleCkpIHsKLQkJCXVwZGF0ZUVsZW1lbnRUb0l0ZW1Qcm92aWRlcnNNYXAobWFwLCBpdGVtUHJvdmlkZXIuZWxlbWVudCwgaXRlbVByb3ZpZGVyLml0ZW1Qcm92aWRlcik7Ci0JCX0KLQkJcmV0dXJuIG1hcDsKLQl9Ci0JCi0Jc3RhdGljIE1hcDxPYmplY3QsIENvbGxlY3Rpb248T2JqZWN0Pj4gY3JlYXRlQnJlYWtkb3duRWxlbWVudFRvSXRlbVByb3ZpZGVyTWFwKE9iamVjdCB0b3AsIEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCUFkYXB0ZXJGYWN0b3J5VHJlZUl0ZXJhdG9yPE9iamVjdD4gaXRlciA9IG5ldyBBZGFwdGVyRmFjdG9yeVRyZWVJdGVyYXRvcjxPYmplY3Q+KAotCQkJCWFkYXB0ZXJGYWN0b3J5LCB0b3ApIHsKLQkJCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgSXRlcmF0b3I8T2JqZWN0PiBnZXRDaGlsZHJlbihPYmplY3QgbykgewotCQkJCU9iamVjdCBlID0gVG5nVXRpbC51bndyYXAobyk7IAotCQkJCWlmKGUgaW5zdGFuY2VvZiBEZXNjcmlwdG9yIHx8IGUgaW5zdGFuY2VvZiBNaWxlc3RvbmUpIHsKLQkJCQkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpLml0ZXJhdG9yKCk7Ci0JCQkJfQotCQkJCXJldHVybiBzdXBlci5nZXRDaGlsZHJlbihvKTsKLQkJCX0JCQkKLQkJfTsKLQkJCi0JCS8vIGNvcHkgdGhlIHRyZWUgdG8gYSBtYXAgb2YgYnJlYWtkb3duIGVsZW1lbnQgLyBpdGVtIHByb3ZpZGVyIGZvcgotCQkvLyByZXVzZQotCQkvLwotCQlIYXNoTWFwPE9iamVjdCwgQ29sbGVjdGlvbjxPYmplY3Q+PiBtYXAgPSBuZXcgSGFzaE1hcDxPYmplY3QsIENvbGxlY3Rpb248T2JqZWN0Pj4oKTsKLQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlPYmplY3Qgb2JqID0gaXRlci5uZXh0KCk7Ci0JCQlPYmplY3QgYmUgPSBUbmdVdGlsLnVud3JhcChvYmopOwotCQkJaWYoYmUgaW5zdGFuY2VvZiBXb3JrQnJlYWtkb3duRWxlbWVudCkgewotCQkJCUlCU0l0ZW1Qcm92aWRlciBpcCA9IChJQlNJdGVtUHJvdmlkZXIpIChvYmogaW5zdGFuY2VvZiBJQlNJdGVtUHJvdmlkZXIgPyBvYmogOgotCQkJCQlhZGFwdGVyRmFjdG9yeS5hZGFwdChvYmosIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcykpOwotCQkJCXVwZGF0ZUVsZW1lbnRUb0l0ZW1Qcm92aWRlcnNNYXAobWFwLCBiZSwgaXApOwotCQkJfQotCQl9Ci0JCXJldHVybiBtYXA7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplKCkgewotCQlPYmplY3QgdW53cmFwcGVkID0gVG5nVXRpbC51bndyYXAob2JqZWN0KTsKLQkJaWYgKHVud3JhcHBlZCBpbnN0YW5jZW9mIFdvcmtCcmVha2Rvd25FbGVtZW50KSB7Ci0JCQlXb3JrQnJlYWtkb3duRWxlbWVudCBlID0gKFdvcmtCcmVha2Rvd25FbGVtZW50KSB1bndyYXBwZWQ7Ci0JCQlMaXN0IHdvcmtPcmRlcnMgPSBlLmdldExpbmtUb1ByZWRlY2Vzc29yKCk7Ci0JCQlpZiAod29ya09yZGVycy5pc0VtcHR5KCkpCi0JCQkJcmV0dXJuOwotCQkJdG9wID0gZ2V0VG9wSXRlbSgpOwkKLQkJCWluaXRpYWxpemUoY3JlYXRlQnJlYWtkb3duRWxlbWVudFRvSXRlbVByb3ZpZGVyTWFwKHRvcCwgYWRhcHRlckZhY3RvcnkpKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZShNYXA8PywgQ29sbGVjdGlvbjxPYmplY3Q+PiBtYXApIHsKLQotCQlpZiAoVG5nVXRpbC51bndyYXAob2JqZWN0KSBpbnN0YW5jZW9mIFdvcmtCcmVha2Rvd25FbGVtZW50KSB7Ci0JCQlXb3JrQnJlYWtkb3duRWxlbWVudCBlID0gKFdvcmtCcmVha2Rvd25FbGVtZW50KSBUbmdVdGlsCi0JCQkJCS51bndyYXAob2JqZWN0KTsKLQkJCUxpc3Qgd29ya09yZGVycyA9IGUuZ2V0TGlua1RvUHJlZGVjZXNzb3IoKTsKLQkJCWlmICh3b3JrT3JkZXJzLmlzRW1wdHkoKSkKLQkJCQlyZXR1cm47Ci0JCQlXb3JrQnJlYWtkb3duRWxlbWVudCB0b3BFbGVtZW50ID0gKFdvcmtCcmVha2Rvd25FbGVtZW50KSBUbmdVdGlsLnVud3JhcCh0b3ApOwotCQkJU3RyaW5nIHRvcEdVSUQgPSB0b3BFbGVtZW50LmdldEd1aWQoKTsKLQkJCQotCQkJaW50IG4gPSB3b3JrT3JkZXJzLnNpemUoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKSB7Ci0JCQkJV29ya09yZGVyIHdvcmtPcmRlciA9IChXb3JrT3JkZXIpIHdvcmtPcmRlcnMuZ2V0KGkpOwkJCQkJCi0KLQkJCQkvL1N5c3RlbS5vdXQucHJpbnRsbih3b3JrT3JkZXIuZ2V0TGlua1R5cGUoKS5nZXRMaXRlcmFsKCkpOwotCi0JCQkJQnJlYWtkb3duRWxlbWVudCBwcmVkID0gd29ya09yZGVyLmdldFByZWQoKTsKLQkJCQlDb2xsZWN0aW9uPE9iamVjdD4gaXRlbVByb3ZpZGVycyA9IG1hcC5nZXQocHJlZCk7Ci0JCQkJaWYoaXRlbVByb3ZpZGVycyAhPSBudWxsICYmICFpdGVtUHJvdmlkZXJzLmlzRW1wdHkoKSkgewotCQkJCQlJQlNJdGVtUHJvdmlkZXIgYnNJdGVtUHJvdmlkZXIgPSBudWxsOwotCQkJCQlNZXRob2RFbGVtZW50UHJvcGVydHkgcHJvcCA9IE1ldGhvZEVsZW1lbnRQcm9wZXJ0eUhlbHBlci5nZXRQcm9wZXJ0eSh3b3JrT3JkZXIsIAotCQkJCQkJCU1ldGhvZEVsZW1lbnRQcm9wZXJ0eUhlbHBlci5XT1JLX09SREVSX19QUkVERUNFU1NPUl9QUk9DRVNTX1BBVEgpOwotCQkJCQlpZihwcm9wID09IG51bGwpIHsKLQkJCQkJCS8vIHByZWRlY2Vzc29yIGlzIGxvY2FsIG9yIFdvcmtPcmRlciBpcyBjcmVhdGVkIGJlZm9yZSBzdXBwb3J0IGZvciAnZ3JlZW4nIHByZWRlY2Vzc29yCi0JCQkJCQkvLyBieSBzYXZpbmcgaXRzIHByb2Nlc3MgcGF0aCBpbiBtZXRob2RFbGVtZW50UHJvcGVydHkgb2YgdGhlIHdvcmsgb3JkZXIKLQkJCQkJCS8vCi0JCQkJCQlic0l0ZW1Qcm92aWRlciA9IChJQlNJdGVtUHJvdmlkZXIpIGl0ZW1Qcm92aWRlcnMuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQlTdHJpbmcgcHJvY1BhdGggPSBwcm9wLmdldFZhbHVlKCk7Ci0JCQkJCQkKLQkJCQkJCS8vIGNhbGN1bGF0ZSB0aGUgcGF0aCBpbiB0aGlzIHByb2Nlc3MKLQkJCQkJCS8vCQkJCQkJCi0JCQkJCQlpbnQgaW5kZXg7Ci0JCQkJCQlTdHJpbmcgZ3VpZCA9IHRvcEdVSUQ7Ci0JCQkJCQlWYXJpYWJpbGl0eUVsZW1lbnQgYmFzZSA9IHRvcEVsZW1lbnQgaW5zdGFuY2VvZiBWYXJpYWJpbGl0eUVsZW1lbnQgPyAoKFZhcmlhYmlsaXR5RWxlbWVudCl0b3BFbGVtZW50KS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkgOiBudWxsOwotCQkJCQkJZm9yKGluZGV4ID0gcHJvY1BhdGguaW5kZXhPZihndWlkKTsgaW5kZXggPT0gLTEgJiYgYmFzZSAhPSBudWxsOyBpbmRleCA9IHByb2NQYXRoLmluZGV4T2YoZ3VpZCkpIHsKLQkJCQkJCQlpZihiYXNlICE9IG51bGwpIHsKLQkJCQkJCQkJZ3VpZCA9IGJhc2UuZ2V0R3VpZCgpOyAKLQkJCQkJCQkJYmFzZSA9IGJhc2UuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCWlmKGluZGV4ICE9IC0xKSB7Ci0JCQkJCQkJU3RyaW5nQnVmZmVyIHN0ckJ1ZmYgPSBuZXcgU3RyaW5nQnVmZmVyKHByb2NQYXRoLnN1YnN0cmluZyhpbmRleCArIGd1aWQubGVuZ3RoKCkpKTsKLQkJCQkJCQlPYmplY3QgdG9wT2JqZWN0ID0gdG9wOwotCQkJCQkJCWZvcihXb3JrQnJlYWtkb3duRWxlbWVudCB3YmUgPSB0b3BFbGVtZW50OyB3YmUgIT0gbnVsbDspIHsKLQkJCQkJCQkJc3RyQnVmZi5pbnNlcnQoMCwgd2JlLmdldEd1aWQoKSk7Ci0JCQkJCQkJCXN0ckJ1ZmYuaW5zZXJ0KDAsICcvJyk7Ci0JCQkJCQkJCWlmKHRvcE9iamVjdCBpbnN0YW5jZW9mIFdvcmtCcmVha2Rvd25FbGVtZW50KSB7Ci0JCQkJCQkJCQl0b3BPYmplY3QgPSB3YmUgPSAoKFdvcmtCcmVha2Rvd25FbGVtZW50KXRvcE9iamVjdCkuZ2V0U3VwZXJBY3Rpdml0aWVzKCk7Ci0JCQkJCQkJCX0KLQkJCQkJCQkJZWxzZSB7Ci0JCQkJCQkJCQl0b3BPYmplY3QgPSBhZGFwdGVyRmFjdG9yeS5hZGFwdCh0b3BPYmplY3QsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCQkJCQkJCQl3YmUgPSAoV29ya0JyZWFrZG93bkVsZW1lbnQpIFRuZ1V0aWwudW53cmFwKHRvcE9iamVjdCk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQkJc3RyQnVmZi5pbnNlcnQoMCwgIjovIikuaW5zZXJ0KDAsIFN1cHByZXNzaW9uLldCUyk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQlTdHJpbmcgcGF0aCA9IHN0ckJ1ZmYudG9TdHJpbmcoKTsKLQkJCQkJCQlmaW5kX3dyYXBwZXI6Ci0JCQkJCQkJZm9yIChPYmplY3QgaXRlbVByb3ZpZGVyIDogaXRlbVByb3ZpZGVycykgewotCQkJCQkJCQlpZihpdGVtUHJvdmlkZXIgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgewotCQkJCQkJCQkJU3RyaW5nIHAgPSBTdXBwcmVzc2lvbi5nZXRQYXRoKChCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgaXRlbVByb3ZpZGVyKTsKLQkJCQkJCQkJCWlmKHBhdGguZXF1YWxzKHApKSB7Ci0JCQkJCQkJCQkJYnNJdGVtUHJvdmlkZXIgPSAoSUJTSXRlbVByb3ZpZGVyKSBpdGVtUHJvdmlkZXI7Ci0JCQkJCQkJCQkJYnJlYWsgZmluZF93cmFwcGVyOwotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWlmIChic0l0ZW1Qcm92aWRlciAhPSBudWxsKSB7Ci0JCQkJCQlhZGQoYnNJdGVtUHJvdmlkZXIpOwotCQkJCQkJbWFwNExpbmtUeXBlLnB1dChic0l0ZW1Qcm92aWRlci5nZXRJZCgpLCB3b3JrT3JkZXIuZ2V0TGlua1R5cGUoKS5nZXRWYWx1ZSgpKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBjbGVhcigpIHsKLQkJc3VwZXIuY2xlYXIoKTsKLQkJaWYgKCFtYXA0TGlua1R5cGUuaXNFbXB0eSgpKQotCQkJbWFwNExpbmtUeXBlLmNsZWFyKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaCgpIHsKLQkJY2xlYXIoKTsKLQkJaW5pdGlhbGl6ZSgpOwotCX0KLQkKLQl2b2lkIHJlZnJlc2goTGlzdDxEZXB0aExldmVsSXRlbVByb3ZpZGVyPiBsaXN0KSB7Ci0JCWNsZWFyKCk7Ci0JCWluaXRpYWxpemUoY3JlYXRlQnJlYWtkb3duRWxlbWVudFRvSXRlbVByb3ZpZGVyTWFwKGxpc3QpKTsKLQl9Ci0JCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBqYXZhLnV0aWwuQWJzdHJhY3RDb2xsZWN0aW9uI3RvU3RyaW5nKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gdG9VblN1cHByZXNzZWRTdHJpbmcobnVsbCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1VuU3VwcHJlc3NlZFN0cmluZyhTdXBwcmVzc2lvbiBzdXApIHsKLQkJLy8gcmVtb3ZlIHRoZSBpdGVtIHByb3ZpZGVycyBvZiB0aGUgZGVsZXRlZCBlbGVtZW50cwotCQkvLwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBpdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlID0gVG5nVXRpbC51bndyYXAoaXRlci5uZXh0KCkpOwotCQkJaWYgKGUgaW5zdGFuY2VvZiBJdGVtUHJvdmlkZXJBZGFwdGVyKSB7Ci0JCQkJZSA9ICgoSXRlbVByb3ZpZGVyQWRhcHRlcikgZSkuZ2V0VGFyZ2V0KCk7Ci0JCQkJaWYgKGUgPT0gbnVsbCkgewotCQkJCQkvLyBvYmplY3QgZGVsZXRlZAotCQkJCQkvLwotCQkJCQlpdGVyLnJlbW92ZSgpOwotCQkJCX0KLQkJCX0KLQkJCWlmIChlIGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudCkgewotCQkJCUJyZWFrZG93bkVsZW1lbnQgYmUgPSAoQnJlYWtkb3duRWxlbWVudCkgZTsKLQkJCQlBY3Rpdml0eSBzdXBlckFjdCA9IGJlLmdldFN1cGVyQWN0aXZpdGllcygpOwotCQkJCWlmIChzdXBlckFjdCA9PSBudWxsICYmIFRuZ1V0aWwuZ2V0T3duaW5nUHJvY2VzcyhiZSkgIT0gYmUpIHsKLQkJCQkJaXRlci5yZW1vdmUoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlpZiAoaXNFbXB0eSgpKQotCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0KLQkJU3RyaW5nQnVmZmVyIHN0ckJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJaW50IG4gPSBzaXplKCkgLSAxOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG47IGkrKykgewotCQkJSUJTSXRlbVByb3ZpZGVyIGJzSXRlbVByb3ZpZGVyID0gKElCU0l0ZW1Qcm92aWRlcikgZ2V0KGkpOwotCQkJaWYgKChzdXAgPT0gbnVsbCkgfHwgIXN1cC5pc1N1cHByZXNzZWQoYnNJdGVtUHJvdmlkZXIpKSB7Ci0JCQkJc3RyQnVmLmFwcGVuZChic0l0ZW1Qcm92aWRlci5nZXRJZCgpKS5hcHBlbmQoJywnKTsJCQkJCi0JCQl9Ci0JCX0KLQkJSUJTSXRlbVByb3ZpZGVyIGJzSXRlbVByb3ZpZGVyID0gKElCU0l0ZW1Qcm92aWRlcikgZ2V0KG4pOwotCQlpZiAoKHN1cCA9PSBudWxsKSB8fCAhc3VwLmlzU3VwcHJlc3NlZChic0l0ZW1Qcm92aWRlcikpIHsKLQkJCXN0ckJ1Zi5hcHBlbmQoYnNJdGVtUHJvdmlkZXIuZ2V0SWQoKSk7Ci0JCX0KLQotCQlyZXR1cm4gc3RyQnVmLnRvU3RyaW5nKCk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgdG9VblN1cHByZXNzZWRTdHJpbmcoU3VwcHJlc3Npb24gc3VwLCBib29sZWFuIGlzTGlua1R5cGVSZXF1aXJlZCkgewotCQkvLyByZW1vdmUgdGhlIGl0ZW0gcHJvdmlkZXJzIG9mIHRoZSBkZWxldGVkIGVsZW1lbnRzCi0JCS8vCi0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGl0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGUgPSBUbmdVdGlsLnVud3JhcChpdGVyLm5leHQoKSk7Ci0JCQlpZiAoZSBpbnN0YW5jZW9mIEl0ZW1Qcm92aWRlckFkYXB0ZXIpIHsKLQkJCQllID0gKChJdGVtUHJvdmlkZXJBZGFwdGVyKSBlKS5nZXRUYXJnZXQoKTsKLQkJCQlpZiAoZSA9PSBudWxsKSB7Ci0JCQkJCS8vIG9iamVjdCBkZWxldGVkCi0JCQkJCS8vCi0JCQkJCWl0ZXIucmVtb3ZlKCk7Ci0JCQkJfQotCQkJfQotCQkJaWYgKGUgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50KSB7Ci0JCQkJQnJlYWtkb3duRWxlbWVudCBiZSA9IChCcmVha2Rvd25FbGVtZW50KSBlOwotCQkJCUFjdGl2aXR5IHN1cGVyQWN0ID0gYmUuZ2V0U3VwZXJBY3Rpdml0aWVzKCk7Ci0JCQkJaWYgKHN1cGVyQWN0ID09IG51bGwgJiYgVG5nVXRpbC5nZXRPd25pbmdQcm9jZXNzKGJlKSAhPSBiZSkgewotCQkJCQlpdGVyLnJlbW92ZSgpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWlmIChpc0VtcHR5KCkpCi0JCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQotCQlTdHJpbmdCdWZmZXIgc3RyQnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlpbnQgbiA9IHNpemUoKSAtIDE7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKSB7Ci0JCQlJQlNJdGVtUHJvdmlkZXIgYnNJdGVtUHJvdmlkZXIgPSAoSUJTSXRlbVByb3ZpZGVyKSBnZXQoaSk7Ci0JCQlpZiAoKHN1cCA9PSBudWxsKSB8fCAhc3VwLmlzU3VwcHJlc3NlZChic0l0ZW1Qcm92aWRlcikpIHsKLQkJCQlzdHJCdWYuYXBwZW5kKGJzSXRlbVByb3ZpZGVyLmdldElkKCkpOwotCQkJICAgIE9iamVjdCB2YWx1ZSA9IG1hcDRMaW5rVHlwZS5nZXQoYnNJdGVtUHJvdmlkZXIuZ2V0SWQoKSk7Ci0JCQkgICAgaWYgKHZhbHVlICE9IG51bGwgJiYgaXNMaW5rVHlwZVJlcXVpcmVkKSB7Ci0JCQkgICAgCWludCB2ID0gSW50ZWdlci5wYXJzZUludCh2YWx1ZS50b1N0cmluZygpKTsKLQkJCSAgICAJU3RyaW5nIGFiYnJldiA9IHRvV29ya09yZGVyVHlwZUFiYnJldmlhdGlvbih2KTsKLQkJCSAgICAJaWYoYWJicmV2ICE9IG51bGwpIHsKLQkJCSAgICAJCXN0ckJ1Zi5hcHBlbmQoYWJicmV2KTsKLQkJCSAgICAJfQotCQkJICAgIH0KLQkJCQlzdHJCdWYuYXBwZW5kKCcsJyk7Ci0JCQl9Ci0JCX0KLQkJSUJTSXRlbVByb3ZpZGVyIGJzSXRlbVByb3ZpZGVyID0gKElCU0l0ZW1Qcm92aWRlcikgZ2V0KG4pOwotCQlpZiAoKHN1cCA9PSBudWxsKSB8fCAhc3VwLmlzU3VwcHJlc3NlZChic0l0ZW1Qcm92aWRlcikpIHsKLQkJCXN0ckJ1Zi5hcHBlbmQoYnNJdGVtUHJvdmlkZXIuZ2V0SWQoKSk7Ci0JCQkvL1N5c3RlbS5vdXQucHJpbnRsbihtYXA0TGlua1R5cGUuZ2V0KGJzSXRlbVByb3ZpZGVyLmdldElkKCkpKTsKLQkJCU9iamVjdCB2YWx1ZSA9IG1hcDRMaW5rVHlwZS5nZXQoYnNJdGVtUHJvdmlkZXIuZ2V0SWQoKSk7Ci0JCSAgICBpZiAodmFsdWUgIT0gbnVsbCAmJiBpc0xpbmtUeXBlUmVxdWlyZWQpIHsKLQkJICAgIAlpbnQgdiA9IEludGVnZXIucGFyc2VJbnQodmFsdWUudG9TdHJpbmcoKSk7Ci0JCSAgICAJU3RyaW5nIGFiYnJldiA9IHRvV29ya09yZGVyVHlwZUFiYnJldmlhdGlvbih2KTsKLQkJICAgIAlpZihhYmJyZXYgIT0gbnVsbCkgewotCQkgICAgCQlzdHJCdWYuYXBwZW5kKGFiYnJldik7Ci0JCSAgICAJfQotCQkgICAgfQotCQl9Ci0KLQkJcmV0dXJuIHN0ckJ1Zi50b1N0cmluZygpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gcHJlcGFyZVVwZGF0ZVByZWRlY2Vzc29ycyhBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwgV29ya0JyZWFrZG93bkVsZW1lbnQgd2JlLAotCQkJTGlzdDxPYmplY3Q+IHByZWRlY2Vzc29ycywgTGlzdDxXb3JrT3JkZXI+IGFkZExpc3QsIExpc3Q8V29ya09yZGVyPiBwcmVkVG9CZURlbGV0ZWQpIHsKLQkJV29ya09yZGVyIHdvID0gbnVsbDsKLQkJaW50IHNpemUgPSB3YmUuZ2V0TGlua1RvUHJlZGVjZXNzb3IoKS5zaXplKCk7Ci0JCQotCQkvLyByZW1vdmUgV29ya09yZGVycyBmb3IgcHJlZGVjZXNzb3JzIHRoYXQgYXJlIG5vdCBpbiBwcmVkZWNlc3NvciBsaXN0IGFuZCBhY2NlcHRlZCBieSB0aGUgZmlsdGVyCi0JCS8vCi0JCUlGaWx0ZXIgZmlsdGVyID0gUHJvY2Vzc1V0aWwuZ2V0RmlsdGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQkJYm9vbGVhbiBudWxsRmlsdGVyID0gZmlsdGVyID09IG51bGw7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHdiZS5nZXRMaW5rVG9QcmVkZWNlc3NvcigpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkuaGFzTmV4dCgpOykgewotCQkJd28gPSAoV29ya09yZGVyKSBpdGVyLm5leHQoKTsKLQkJCWlmICgobnVsbEZpbHRlciB8fCBmaWx0ZXIuYWNjZXB0KHdvLmdldFByZWQoKSkpKSB7Ci0JCQkJYm9vbGVhbiBmb3VuZCA9IGZhbHNlOwotCQkJCWZpbmRfcHJlZDoJCQkJCQkKLQkJCQlmb3IoT2JqZWN0IHByZWQgOiBwcmVkZWNlc3NvcnMpIHsKLQkJCQkJaWYocHJlZCBpbnN0YW5jZW9mIFdvcmtCcmVha2Rvd25FbGVtZW50KSB7Ci0JCQkJCQlpZih3by5nZXRQcmVkKCkgPT0gcHJlZCkgewotCQkJCQkJCWZvdW5kID0gdHJ1ZTsKLQkJCQkJCQlicmVhayBmaW5kX3ByZWQ7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJZWxzZSBpZihwcmVkIGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIHsKLQkJCQkJCWlmKGlzUHJlZGVjZXNzb3IoKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSBwcmVkLCB3bykpIHsKLQkJCQkJCQlmb3VuZCA9IHRydWU7Ci0JCQkJCQkJYnJlYWsgZmluZF9wcmVkOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCWlmKCFmb3VuZCkgewotCQkJCQlwcmVkVG9CZURlbGV0ZWQuYWRkKHdvKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlzaXplID0gcHJlZGVjZXNzb3JzLnNpemUoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCU9iamVjdCBvYmogPSBwcmVkZWNlc3NvcnMuZ2V0KGkpOwotCQkJV29ya0JyZWFrZG93bkVsZW1lbnQgZWxlbWVudCA9IChXb3JrQnJlYWtkb3duRWxlbWVudCkgVG5nVXRpbC51bndyYXAob2JqKTsKLQkJCWJvb2xlYW4gZm91bmQgPSBmYWxzZTsKLQkJCUJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyIHdyYXBwZXIgPSAoQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIChvYmogaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlciA/IG9iaiA6IG51bGwpOwotCQkJU3RyaW5nIHByb2NQYXRoID0gbnVsbDsKLQkJCWZpbmRfcHJlZDogZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IHdiZQotCQkJCQkuZ2V0TGlua1RvUHJlZGVjZXNzb3IoKS5pdGVyYXRvcigpOyBpdGVyYXRvcgotCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCXdvID0gKFdvcmtPcmRlcikgaXRlcmF0b3IubmV4dCgpOwotCQkJCWlmICh3by5nZXRQcmVkKCkgPT0gZWxlbWVudCkgewotCQkJCQlpZih3cmFwcGVyICE9IG51bGwpIHsKLQkJCQkJCWlmKGlzUHJlZGVjZXNzb3Iod3JhcHBlciwgd28pKSB7Ci0JCQkJCQkJZm91bmQgPSB0cnVlOwotCQkJCQkJCWJyZWFrIGZpbmRfcHJlZDsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCS8vIHRoZSBwcmVkZWNlc3NvciBpcyBsb2NhbCwgbm8gbmVlZCB0byBsb29rIGZvciB3cmFwcGVyCi0JCQkJCQkvLwotCQkJCQkJZm91bmQgPSB0cnVlOwotCQkJCQkJYnJlYWsgZmluZF9wcmVkOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJaWYgKCFmb3VuZCkgewkJCQkJCi0JCQkJd28gPSBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVXb3JrT3JkZXIoKTsKLQkJCQl3by5zZXRQcmVkKGVsZW1lbnQpOwotCQkJCWlmKHdyYXBwZXIgIT0gbnVsbCkgewotCQkJCQlpZihwcm9jUGF0aCA9PSBudWxsKSB7Ci0JCQkJCQlwcm9jUGF0aCA9IFN1cHByZXNzaW9uLmdldFBhdGgod3JhcHBlcik7Ci0JCQkJCX0KLQkJCQkJTWV0aG9kRWxlbWVudFByb3BlcnR5SGVscGVyLnNldFByb3BlcnR5KHdvLCBNZXRob2RFbGVtZW50UHJvcGVydHlIZWxwZXIuV09SS19PUkRFUl9fUFJFREVDRVNTT1JfUFJPQ0VTU19QQVRILCBwcm9jUGF0aCk7Ci0JCQkJfQotCQkJCWFkZExpc3QuYWRkKHdvKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JLyoqCi0JICogUGFyc2VzIGEgY29tbWFuZC1zZXBhcmF0ZWQgbGlzdCBvZiBwcmVkZWNlc3NvciBpbmRleGVzIGludG8gbGlzdHMgb2YKLQkgKiBwcmVkZWNlc3NvcnNzIHRvIGJlIGFkZGVkIGFuZCBkZWxldGVkIGZvciB1cGRhdGUuCi0JICogCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICogQHBhcmFtIHdiZQotCSAqIEBwYXJhbSBpbmRleExpc3QKLQkgKiAgICAgICAgICAgIGEgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgcHJlZGVjZXNzb3IgaW5kZXhlcwotCSAqIEBwYXJhbSBhZGRMaXN0Ci0JICogQHBhcmFtIHByZWRUb0JlRGVsZXRlZAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gcHJlcGFyZVVwZGF0ZVByZWRlY2Vzc29ycygKLQkJCUFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LCBXb3JrQnJlYWtkb3duRWxlbWVudCB3YmUsCi0JCQlTdHJpbmcgaW5kZXhMaXN0LCBMaXN0PFdvcmtPcmRlcj4gYWRkTGlzdCwgTGlzdDxXb3JrT3JkZXI+IHByZWRUb0JlRGVsZXRlZCkgewotCQlQcm9jZXNzIHByb2Nlc3MgPSBUbmdVdGlsLmdldE93bmluZ1Byb2Nlc3Mod2JlKTsKLQkJTGlzdDxPYmplY3Q+IHByZWRlY2Vzc29ycyA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PigpOwotCQlpZiAoUHJvY2Vzc1V0aWwuY2hlY2tQcmVkZWNlc3Nvckxpc3Qod2JlLCBpbmRleExpc3QsIGFkYXB0ZXJGYWN0b3J5LAotCQkJCXByb2Nlc3MsIHByZWRlY2Vzc29ycykgPT0gbnVsbCkgewotCQkJcmV0dXJuIHByZXBhcmVVcGRhdGVQcmVkZWNlc3NvcnMoYWRhcHRlckZhY3RvcnksIHdiZSwgcHJlZGVjZXNzb3JzLCBhZGRMaXN0LCBwcmVkVG9CZURlbGV0ZWQpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0b1dvcmtPcmRlclR5cGVBYmJyZXZpYXRpb24oaW50IHdvcmtPcmRlclR5cGUpIHsKLQkJc3dpdGNoKHdvcmtPcmRlclR5cGUpIHsKLQkJY2FzZSBXb3JrT3JkZXJUeXBlLkZJTklTSF9UT19GSU5JU0hfVkFMVUU6Ci0JCQlyZXR1cm4gRklOSVNIX1RPX0ZJTklTSDsKLQkJY2FzZSBXb3JrT3JkZXJUeXBlLlNUQVJUX1RPX0ZJTklTSF9WQUxVRToKLQkJCXJldHVybiBTVEFSVF9UT19GSU5JU0g7Ci0JCWNhc2UgV29ya09yZGVyVHlwZS5TVEFSVF9UT19TVEFSVF9WQUxVRToKLQkJCXJldHVybiBTVEFSVF9UT19TVEFSVDsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogQ2hlY2tzIGlmIHRoZSBnaXZlbiB3cmFwcGVyIGlzIGEgcHJlZGVjZXNzb3IgZGVmaW5lZCBieSB0aGUgZ2l2ZW4gV29ya09yZGVyLgotCSAqIAotCSAqIEBwYXJhbSB3cmFwcGVyCi0JICogQHBhcmFtIHdvcmtPcmRlcgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNQcmVkZWNlc3NvcihCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlciB3cmFwcGVyLCBXb3JrT3JkZXIgd29ya09yZGVyKSB7Ci0JCU1ldGhvZEVsZW1lbnRQcm9wZXJ0eSBwcm9wID0gTWV0aG9kRWxlbWVudFByb3BlcnR5SGVscGVyLmdldFByb3BlcnR5KHdvcmtPcmRlciwgCi0JCQkJTWV0aG9kRWxlbWVudFByb3BlcnR5SGVscGVyLldPUktfT1JERVJfX1BSRURFQ0VTU09SX1BST0NFU1NfUEFUSCk7Ci0JCWlmKHByb3AgPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWVsc2UgewotCQkJU3RyaW5nIHByb2NQYXRoID0gcHJvcC5nZXRWYWx1ZSgpOwotCQkJU3RyaW5nIHAgPSBTdXBwcmVzc2lvbi5nZXRQYXRoKHdyYXBwZXIpOwotCQkJcmV0dXJuIHByb2NQYXRoLmVxdWFscyhwKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9Qcm9jZXNzVXRpbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL1Byb2Nlc3NVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiNTU0NjEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL1Byb2Nlc3NVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMzgyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLk5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkFic3RyYWN0VHJlZUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlUcmVlSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUNoYW5nZU5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVdyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuV3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLlN0clV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhdGlvbkFwcGxpY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5Qcm92aWRlcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSUFjdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkFjdGl2aXR5V3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuQlNBY3Rpdml0eUl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkNvbXBvc2VkQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkRlc2NyaWJhYmxlRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLklCU0l0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuUm9sZURlc2NyaXB0b3JXcmFwcGVySXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5UYXNrRGVzY3JpcHRvcldyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLldvcmtQcm9kdWN0RGVzY3JpcHRvcldyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQuQlNEcm9wQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZC5Db3B5SGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kLlByb2Nlc3NDb21tYW5kVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZC5Qcm9jZXNzRGVlcENvcHlDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kLldCU0Ryb3BDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudWkuVXNlckludGVyYWN0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5QcmVkZWNlc3Nvckxpc3QuRGVwdGhMZXZlbEl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb24uTmFtZUNoZWNrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFydGlmYWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbXBvc2l0ZVJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkd1aWRhbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NaWxlc3RvbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuU2VjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlN0ZXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZWFtUHJvZmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya0JyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrT3JkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLlVtYUVkaXRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkFzc29jaWF0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5VbWFVdGlsOwotCi1pbXBvcnQgY29tLmlibS5pY3UudGV4dC5NZXNzYWdlRm9ybWF0OwotaW1wb3J0IGNvbS5pYm0uaWN1LnV0aWwuU3RyaW5nVG9rZW5pemVyOwotCi0KLS8qKgotICogVXRpbGl0eSBjbGFzcyB0aGF0IGRlZmluZXMgc3RhdGljIG1ldGhvZHMgZm9yIHByb2Nlc3MgYXV0aG9yaW5nCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgUHJvY2Vzc1V0aWwgewotCXByaXZhdGUgc3RhdGljIENvbGxlY3Rpb248RUNsYXNzPiBPQlNFY2xhc3NlcyA9IG51bGw7Ci0KLQlwcml2YXRlIHN0YXRpYyBDb2xsZWN0aW9uPEVDbGFzcz4gV0JTRWNsYXNzZXMgPSBudWxsOwotCi0JcHJpdmF0ZSBzdGF0aWMgQ29sbGVjdGlvbjxFQ2xhc3M+IFBCU0VjbGFzc2VzID0gbnVsbDsKLQotCXByaXZhdGUgc3RhdGljIENvbGxlY3Rpb248VmFyaWFiaWxpdHlUeXBlPiBleHRlbmRBbmRMb2NhbENvbnRyaWJ1dGlvblZhcmlhYmlsaXR5VHlwZXMgPSBudWxsOwotCi0JcHJpdmF0ZSBzdGF0aWMgQ29sbGVjdGlvbjxWYXJpYWJpbGl0eVR5cGU+IGdldEV4dGVuZEFuZExvY2FsQ29udHJpYnV0aW9uVmFyaWFiaWxpdHlUeXBlcygpIHsKLQkJaWYgKGV4dGVuZEFuZExvY2FsQ29udHJpYnV0aW9uVmFyaWFiaWxpdHlUeXBlcyA9PSBudWxsKSB7Ci0JCQlleHRlbmRBbmRMb2NhbENvbnRyaWJ1dGlvblZhcmlhYmlsaXR5VHlwZXMgPSBuZXcgQXJyYXlMaXN0PFZhcmlhYmlsaXR5VHlwZT4oKTsKLQkJCWV4dGVuZEFuZExvY2FsQ29udHJpYnV0aW9uVmFyaWFiaWxpdHlUeXBlcwotCQkJCQkuYWRkKFZhcmlhYmlsaXR5VHlwZS5FWFRFTkRTKTsKLQkJCWV4dGVuZEFuZExvY2FsQ29udHJpYnV0aW9uVmFyaWFiaWxpdHlUeXBlcwotCQkJCQkuYWRkKFZhcmlhYmlsaXR5VHlwZS5MT0NBTF9DT05UUklCVVRJT04pOwotCQl9Ci0JCXJldHVybiBleHRlbmRBbmRMb2NhbENvbnRyaWJ1dGlvblZhcmlhYmlsaXR5VHlwZXM7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2hlY2tCcmVha2Rvd25FbGVtZW50TmFtZSgKLQkJCUFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LCBCcmVha2Rvd25FbGVtZW50IGUsIFN0cmluZyBuYW1lLCBTdXBwcmVzc2lvbiBzdXBwcmVzc2lvbikgewotCQlyZXR1cm4gTmFtZUNoZWNrZXIuY2hlY2tOYW1lKGFkYXB0ZXJGYWN0b3J5LCBlLCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXROYW1lZEVsZW1lbnRfTmFtZSgpLCBuYW1lLCBzdXBwcmVzc2lvbik7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNoZWNrQnJlYWtkb3duRWxlbWVudE5hbWUoCi0JCQlBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwgQnJlYWtkb3duRWxlbWVudCBlLCBTdHJpbmcgbmFtZSwgU3VwcHJlc3Npb24gc3VwcHJlc3Npb24sIGJvb2xlYW4gaWdub3JlU3VwcHJlc3NlZCkgewotCQlyZXR1cm4gTmFtZUNoZWNrZXIuY2hlY2tOYW1lKGFkYXB0ZXJGYWN0b3J5LCBlLCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXROYW1lZEVsZW1lbnRfTmFtZSgpLCBuYW1lLCBzdXBwcmVzc2lvbiwgaWdub3JlU3VwcHJlc3NlZCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2hlY2tCcmVha2Rvd25FbGVtZW50UHJlc2VudGF0aW9uTmFtZSgKLQkJCUFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LCBCcmVha2Rvd25FbGVtZW50IGUsIFN0cmluZyBuYW1lLCBTdXBwcmVzc2lvbiBzdXBwcmVzc2lvbikgewotCQkvLyBtaWdodCBhbGxvdyBlbXB0eSBwcmVzZW50YXRpb24gbmFtZSBmb3IgZXh0ZW5kZXIgb3IgY29udHJpYnV0b3IuIFRoZSBlbGVtZW50IHdpbGwgaW5oZXJpdAotCQkvLyB0aGUgcHJlc2VudGF0aW9uIG5hbWUgZnJvbSB0aGUgYmFzZSBlbGVtZW50LiBDaGVjayB3aWxsIGJlIHBlcmZvcm1lZCBvbiB0aGUgaW5oZXJpdGVkIG5hbWUKLQkJLy8KLQkJaWYgKG5hbWUgPT0gbnVsbCB8fCBuYW1lLmxlbmd0aCgpID09IDApIHsKLQkJCWlmIChpc0V4dGVuZGluZ09yTG9jYWxseUNvbnRyaWJ1dGluZyhlKSkgewotCQkJCUJyZWFrZG93bkVsZW1lbnQgYmFzZSA9IChCcmVha2Rvd25FbGVtZW50KSAoKFZhcmlhYmlsaXR5RWxlbWVudCkgZSkKLQkJCQkJCS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCk7Ci0JCQkJbmFtZSA9IGdldFByZXNlbnRhdGlvbk5hbWUoYmFzZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIE5hbWVDaGVja2VyLmNoZWNrTmFtZShhZGFwdGVyRmFjdG9yeSwgZSwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0TWV0aG9kRWxlbWVudF9QcmVzZW50YXRpb25OYW1lKCksIG5hbWUsIHN1cHByZXNzaW9uKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2hlY2tCcmVha2Rvd25FbGVtZW50UHJlc2VudGF0aW9uTmFtZSgKLQkJCUFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LCBCcmVha2Rvd25FbGVtZW50IGUsIFN0cmluZyBuYW1lLCBTdXBwcmVzc2lvbiBzdXBwcmVzc2lvbiwgYm9vbGVhbiBpZ25vcmVTdXBwcmVzc2VkKSB7Ci0KLQkJcmV0dXJuIE5hbWVDaGVja2VyLmNoZWNrTmFtZShhZGFwdGVyRmFjdG9yeSwgZSwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0TWV0aG9kRWxlbWVudF9QcmVzZW50YXRpb25OYW1lKCksIG5hbWUsIHN1cHByZXNzaW9uLCBpZ25vcmVTdXBwcmVzc2VkKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIE9iamVjdCBnZXRSb290UHJvY2VzcyhBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwKLQkJCUl0ZW1Qcm92aWRlckFkYXB0ZXIgYWRhcHRlciwgT2JqZWN0IG9iaikgewotCQlPYmplY3QgcGFyZW50ID0gYWRhcHRlci5nZXRQYXJlbnQob2JqKTsKLQkJYWRhcHRlciA9IChJdGVtUHJvdmlkZXJBZGFwdGVyKSBhZGFwdGVyRmFjdG9yeS5hZGFwdChwYXJlbnQsCi0JCQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJaWYgKHBhcmVudCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gb2JqOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIGdldFJvb3RQcm9jZXNzKGFkYXB0ZXJGYWN0b3J5LCBhZGFwdGVyLCBwYXJlbnQpOwotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyBDb2xsZWN0aW9uPEVDbGFzcz4gZ2V0V0JTRWNsYXNzZXMoKSB7Ci0JCWlmIChXQlNFY2xhc3NlcyA9PSBudWxsKSB7Ci0JCQlXQlNFY2xhc3NlcyA9IG5ldyBIYXNoU2V0PEVDbGFzcz4oKTsKLQkJCVdCU0VjbGFzc2VzLmFkZChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrRGVzY3JpcHRvcigpKTsKLQkJCVdCU0VjbGFzc2VzLmFkZChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRBY3Rpdml0eSgpKTsKLQkJCVdCU0VjbGFzc2VzLmFkZChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRNaWxlc3RvbmUoKSk7Ci0JCX0KLQkJcmV0dXJuIFdCU0VjbGFzc2VzOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgQ29sbGVjdGlvbjxFQ2xhc3M+IGdldE9CU0VjbGFzc2VzKCkgewotCQlpZiAoT0JTRWNsYXNzZXMgPT0gbnVsbCkgewotCQkJT0JTRWNsYXNzZXMgPSBuZXcgSGFzaFNldDxFQ2xhc3M+KCk7Ci0JCQlPQlNFY2xhc3Nlcy5hZGQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Um9sZURlc2NyaXB0b3IoKSk7Ci0JCQlPQlNFY2xhc3Nlcy5hZGQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QWN0aXZpdHkoKSk7Ci0JCQlPQlNFY2xhc3Nlcy5hZGQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWlsZXN0b25lKCkpOwotCQkJT0JTRWNsYXNzZXMuYWRkKFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRlYW1Qcm9maWxlKCkpOwotCQkJT0JTRWNsYXNzZXMuYWRkKFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbXBvc2l0ZVJvbGUoKSk7Ci0JCX0KLQotCQlyZXR1cm4gT0JTRWNsYXNzZXM7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBDb2xsZWN0aW9uPEVDbGFzcz4gZ2V0UEJTRWNsYXNzZXMoKSB7Ci0JCWlmIChQQlNFY2xhc3NlcyA9PSBudWxsKSB7Ci0JCQlQQlNFY2xhc3NlcyA9IG5ldyBIYXNoU2V0PEVDbGFzcz4oKTsKLQkJCVBCU0VjbGFzc2VzLmFkZChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRXb3JrUHJvZHVjdERlc2NyaXB0b3IoKSk7Ci0JCQlQQlNFY2xhc3Nlcy5hZGQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QWN0aXZpdHkoKSk7Ci0JCQlQQlNFY2xhc3Nlcy5hZGQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWlsZXN0b25lKCkpOwotCQl9Ci0JCXJldHVybiBQQlNFY2xhc3NlczsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNGaXJzdEVsZW1lbnQoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksCi0JCQlJdGVtUHJvdmlkZXJBZGFwdGVyIGl0ZW1Qcm92aWRlciwgT2JqZWN0IG9iaikgewotCQlPYmplY3QgcGFyZW50ID0gaXRlbVByb3ZpZGVyLmdldFBhcmVudChvYmopOwotCQlpZiAocGFyZW50IGluc3RhbmNlb2YgVGVhbVByb2ZpbGUpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJTGlua2VkTGlzdCBzaWJsaW5ncyA9IGdldFNpYmxpbmdzKGFkYXB0ZXJGYWN0b3J5LCBpdGVtUHJvdmlkZXIsIG9iaik7Ci0JCWlmIChzaWJsaW5ncyAhPSBudWxsICYmICFzaWJsaW5ncy5pc0VtcHR5KCkpIHsKLQkJCXJldHVybiBzaWJsaW5ncy5nZXRGaXJzdCgpID09IG9iajsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIExpbmtlZExpc3QgZ2V0U2libGluZ3MoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksCi0JCQlJdGVtUHJvdmlkZXJBZGFwdGVyIGl0ZW1Qcm92aWRlciwgT2JqZWN0IG9iaikgewotCQlPYmplY3QgcGFyZW50ID0gaXRlbVByb3ZpZGVyLmdldFBhcmVudChvYmopOwotCQlpZiAocGFyZW50ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyIHBhcmVudEl0ZW1Qcm92aWRlciA9IChJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIpIGFkYXB0ZXJGYWN0b3J5Ci0JCQkJLmFkYXB0KHBhcmVudCwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJaWYgKHBhcmVudEl0ZW1Qcm92aWRlciAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gbmV3IExpbmtlZExpc3QocGFyZW50SXRlbVByb3ZpZGVyLmdldENoaWxkcmVuKHBhcmVudCkpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0xhc3RFbGVtZW50KEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LAotCQkJSXRlbVByb3ZpZGVyQWRhcHRlciBpdGVtUHJvdmlkZXIsIE9iamVjdCBvYmopIHsKLQkJT2JqZWN0IHBhcmVudCA9IGl0ZW1Qcm92aWRlci5nZXRQYXJlbnQob2JqKTsKLQkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIFRlYW1Qcm9maWxlKQotCQkJcmV0dXJuIHRydWU7Ci0JCUxpbmtlZExpc3Qgc2libGluZ3MgPSBnZXRTaWJsaW5ncyhhZGFwdGVyRmFjdG9yeSwgaXRlbVByb3ZpZGVyLCBvYmopOwotCQlpZiAoc2libGluZ3MgIT0gbnVsbCAmJiAhc2libGluZ3MuaXNFbXB0eSgpKSB7Ci0JCQlyZXR1cm4gc2libGluZ3MuZ2V0TGFzdCgpID09IG9iajsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIGVsZW1lbnRzIHRoYXQgaGF2ZSBiZWVuIGFmZmVjdGVkIGFmdGVyIHRoZSBldmVudCB0aGF0IHRyaWdnZXJlZCB0aGUKLQkgKiBnaXZlbiBub3RpZmljYXRpb24uCi0JICogCi0JICogQHBhcmFtIG5vdGlmaWNhdGlvbgotCSAqIEBwYXJhbSBmaWx0ZXIKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0IGdldEFmZmVjdGVkRWxlbWVudHMoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbiwKLQkJCUlGaWx0ZXIgZmlsdGVyKSB7Ci0JCUxpc3QgYWZmZWN0ZWRFbGVtZW50cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RXZlbnRUeXBlKCkpIHsKLQkJY2FzZSBOb3RpZmljYXRpb24uQUREOgotCQkJT2JqZWN0IG9iaiA9IG5vdGlmaWNhdGlvbi5nZXROZXdWYWx1ZSgpOwotCQkJaWYgKGZpbHRlciA9PSBudWxsIHx8IGZpbHRlci5hY2NlcHQob2JqKSkgewotCQkJCWFmZmVjdGVkRWxlbWVudHMuYWRkKG9iaik7Ci0JCQl9Ci0JCQlicmVhazsKLQkJY2FzZSBOb3RpZmljYXRpb24uQUREX01BTlk6Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSAoKENvbGxlY3Rpb24pIG5vdGlmaWNhdGlvbi5nZXROZXdWYWx1ZSgpKQotCQkJCQkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyLm5leHQoKTsKLQkJCQlpZiAoZmlsdGVyID09IG51bGwgfHwgZmlsdGVyLmFjY2VwdChlbGVtZW50KSkgewotCQkJCQlhZmZlY3RlZEVsZW1lbnRzLmFkZChlbGVtZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCQlicmVhazsKLQkJY2FzZSBOb3RpZmljYXRpb24uUkVNT1ZFOgotCQkJb2JqID0gbm90aWZpY2F0aW9uLmdldE9sZFZhbHVlKCk7Ci0JCQlpZiAoZmlsdGVyID09IG51bGwgfHwgZmlsdGVyLmFjY2VwdChvYmopKSB7Ci0JCQkJYWZmZWN0ZWRFbGVtZW50cy5hZGQob2JqKTsKLQkJCX0KLQkJCWJyZWFrOwotCQljYXNlIE5vdGlmaWNhdGlvbi5SRU1PVkVfTUFOWToKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9ICgoQ29sbGVjdGlvbikgbm90aWZpY2F0aW9uLmdldE9sZFZhbHVlKCkpCi0JCQkJCS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3QgZWxlbWVudCA9IGl0ZXIubmV4dCgpOwotCQkJCWlmIChmaWx0ZXIgPT0gbnVsbCB8fCBmaWx0ZXIuYWNjZXB0KGVsZW1lbnQpKSB7Ci0JCQkJCWFmZmVjdGVkRWxlbWVudHMuYWRkKGVsZW1lbnQpOwotCQkJCX0KLQkJCX0KLQkJCWJyZWFrOwotCi0JCWNhc2UgTm90aWZpY2F0aW9uLk1PVkU6Ci0JCQlvYmogPSBub3RpZmljYXRpb24uZ2V0TmV3VmFsdWUoKTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBDb2xsZWN0aW9uKSB7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gKChDb2xsZWN0aW9uKSBvYmopLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCU9iamVjdCBlbGVtZW50ID0gaXRlci5uZXh0KCk7Ci0JCQkJCWlmIChmaWx0ZXIgPT0gbnVsbCB8fCBmaWx0ZXIuYWNjZXB0KGVsZW1lbnQpKSB7Ci0JCQkJCQlhZmZlY3RlZEVsZW1lbnRzLmFkZChlbGVtZW50KTsKLQkJCQkJfQotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKGZpbHRlciA9PSBudWxsIHx8IGZpbHRlci5hY2NlcHQob2JqKSkgewotCQkJCQlhZmZlY3RlZEVsZW1lbnRzLmFkZChvYmopOwotCQkJCX0KLQkJCX0KLQkJCWJyZWFrOwotCQl9Ci0JCXJldHVybiBhZmZlY3RlZEVsZW1lbnRzOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1JlZnJlc2hSZXF1aXJlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uLAotCQkJSUZpbHRlciBmaWx0ZXIpIHsKLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RXZlbnRUeXBlKCkpIHsKLQkJY2FzZSBOb3RpZmljYXRpb24uU0VUOgotCQljYXNlIE5vdGlmaWNhdGlvbi5BREQ6Ci0JCQlPYmplY3Qgb2JqID0gbm90aWZpY2F0aW9uLmdldE5ld1ZhbHVlKCk7Ci0JCQlpZiAoZmlsdGVyID09IG51bGwgfHwgZmlsdGVyLmFjY2VwdChvYmopKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCQlicmVhazsKLQkJY2FzZSBOb3RpZmljYXRpb24uQUREX01BTlk6Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSAoKENvbGxlY3Rpb24pIG5vdGlmaWNhdGlvbi5nZXROZXdWYWx1ZSgpKQotCQkJCQkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyLm5leHQoKTsKLQkJCQlpZiAoZmlsdGVyID09IG51bGwgfHwgZmlsdGVyLmFjY2VwdChlbGVtZW50KSkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCQlicmVhazsKLQkJY2FzZSBOb3RpZmljYXRpb24uUkVNT1ZFOgotCQkJb2JqID0gbm90aWZpY2F0aW9uLmdldE9sZFZhbHVlKCk7Ci0JCQlpZiAoZmlsdGVyID09IG51bGwgfHwgZmlsdGVyLmFjY2VwdChvYmopKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCQlicmVhazsKLQkJY2FzZSBOb3RpZmljYXRpb24uUkVNT1ZFX01BTlk6Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSAoKENvbGxlY3Rpb24pIG5vdGlmaWNhdGlvbi5nZXRPbGRWYWx1ZSgpKQotCQkJCQkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyLm5leHQoKTsKLQkJCQlpZiAoZmlsdGVyID09IG51bGwgfHwgZmlsdGVyLmFjY2VwdChlbGVtZW50KSkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCQlicmVhazsKLQotCQljYXNlIE5vdGlmaWNhdGlvbi5NT1ZFOgotCQkJb2JqID0gbm90aWZpY2F0aW9uLmdldE5ld1ZhbHVlKCk7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgQ29sbGVjdGlvbikgewotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9ICgoQ29sbGVjdGlvbikgb2JqKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQlPYmplY3QgZWxlbWVudCA9IGl0ZXIubmV4dCgpOwotCQkJCQlpZiAoZmlsdGVyID09IG51bGwgfHwgZmlsdGVyLmFjY2VwdChlbGVtZW50KSkgewotCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCWlmIChmaWx0ZXIgPT0gbnVsbCB8fCBmaWx0ZXIuYWNjZXB0KG9iaikpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQotCQkJYnJlYWs7Ci0JCX0KLQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGFkZFRvQ29udGFpbmVyKEJyZWFrZG93bkVsZW1lbnQgZSwKLQkJCUl0ZW1Qcm92aWRlckFkYXB0ZXIgaXRlbVByb3ZpZGVyKSB7Ci0JCWFkZFRvQ29udGFpbmVyKGUsIGl0ZW1Qcm92aWRlciwgdHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogQWRkcyB0aGUgZ2l2ZW4gQnJlYWtkb3duRWxlbWVudCB0byBhIG5ldyBjb250YWluZXIgaWYgaXQgZG9lcyBub3QgaGF2ZQotCSAqIG9uZSBvciBtb3ZlcyBpdCB0byB0aGUgcmlnaHQgY29udGFpbmVyIGlmIHJlcXVlc3RlZC4KLQkgKiAKLQkgKiBAcGFyYW0gZQotCSAqIEBwYXJhbSBpdGVtUHJvdmlkZXIKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgYWRkVG9Db250YWluZXIoQnJlYWtkb3duRWxlbWVudCBlLAotCQkJSXRlbVByb3ZpZGVyQWRhcHRlciBpdGVtUHJvdmlkZXIsIGJvb2xlYW4gbW92ZSkgewotCQlQcm9jZXNzUGFja2FnZSBwa2cgPSBudWxsOwotCQlPYmplY3QgcGFyZW50ID0gaXRlbVByb3ZpZGVyLmdldFBhcmVudChlKTsKLQkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIEVPYmplY3QpIHsKLQkJCUVPYmplY3QgY29udGFpbmVyID0gKChFT2JqZWN0KSBwYXJlbnQpLmVDb250YWluZXIoKTsKLQkJCWlmIChjb250YWluZXIgaW5zdGFuY2VvZiBQcm9jZXNzUGFja2FnZSkgewotCQkJCXBrZyA9IChQcm9jZXNzUGFja2FnZSkgY29udGFpbmVyOwotCQkJfQotCQl9Ci0KLQkJaWYgKHBrZyA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlpZiAoZSBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQlBY3Rpdml0eSBhY3QgPSAoQWN0aXZpdHkpIGU7Ci0JCQlpZiAoYWN0LmVDb250YWluZXIoKSA9PSBudWxsKSB7Ci0JCQkJLy8gY3JlYXRlIG5ldyBQcm9jZXNzUGFja2FnZSBmb3IgdGhlIGFjdGl2aXR5Ci0JCQkJLy8KLQkJCQlQcm9jZXNzUGFja2FnZSBuZXdQa2cgPSBVbWFGYWN0b3J5LmVJTlNUQU5DRQotCQkJCQkJLmNyZWF0ZVByb2Nlc3NQYWNrYWdlKCk7Ci0JCQkJbmV3UGtnLnNldE5hbWUoYWN0LmdldE5hbWUoKSk7Ci0JCQkJcGtnLmdldENoaWxkUGFja2FnZXMoKS5hZGQobmV3UGtnKTsKLQkJCQluZXdQa2cuZ2V0UHJvY2Vzc0VsZW1lbnRzKCkuYWRkKGUpOwotCQkJfSBlbHNlIGlmIChtb3ZlKSB7Ci0JCQkJLy8gQ2hlY2sgaWYgdGhlIGFjdGl2aXR5J3MgUHJvY2Vzc1BhY2thZ2UgaXMgYXQgdGhlIHJpZ2h0IHBsYWNlLgotCQkJCS8vIElmIG5vdCwgbW92ZSBpdCB0byB0aGUgcmlnaHQgUHJvY2Vzc0NvbXBvbmVudC4KLQkJCQkvLwotCQkJCVByb2Nlc3NQYWNrYWdlIG9sZFBrZyA9IChQcm9jZXNzUGFja2FnZSkgYWN0LmVDb250YWluZXIoKTsKLQkJCQlpZiAob2xkUGtnLmVDb250YWluZXIoKSAhPSBwa2cpIHsKLQkJCQkJcGtnLmdldENoaWxkUGFja2FnZXMoKS5hZGQob2xkUGtnKTsKLQkJCQl9Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoZS5lQ29udGFpbmVyKCkgPT0gbnVsbCkgewotCQkJCXBrZy5nZXRQcm9jZXNzRWxlbWVudHMoKS5hZGQoZSk7Ci0JCQl9IGVsc2UgaWYgKG1vdmUgJiYgZS5lQ29udGFpbmVyKCkgIT0gcGtnKSB7Ci0JCQkJLy8gbW92ZSB0byBuZXcgUHJvY2Vzc1BhY2thZ2UKLQkJCQkvLwotCQkJCXBrZy5nZXRQcm9jZXNzRWxlbWVudHMoKS5hZGQoZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0UGFyZW50KE9iamVjdCBjaGlsZCwgT2JqZWN0IHBhcmVudCwKLQkJCUFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCU9iamVjdCBhZGFwdGVyID0gYWRhcHRlckZhY3RvcnkuYWRhcHQoY2hpbGQsCi0JCQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJaWYgKGFkYXB0ZXIgaW5zdGFuY2VvZiBJQlNJdGVtUHJvdmlkZXIpIHsKLQkJCSgoSUJTSXRlbVByb3ZpZGVyKSBhZGFwdGVyKS5zZXRQYXJlbnQocGFyZW50KTsKLQkJfSAKLS8vCQllbHNlIHsKLS8vCQkJU3lzdGVtLm91dAotLy8JCQkJCS5wcmludGxuKExpYnJhcnlFZGl0UmVzb3VyY2VzLnV0aWxfUHJvY2Vzc1V0aWxfZXJyX3NldHBhcmVudCArIGNoaWxkKTsgLy8kTk9OLU5MUy0xJAotLy8JCQlTeXN0ZW0ub3V0Ci0vLwkJCQkJLnByaW50bG4oTGlicmFyeUVkaXRSZXNvdXJjZXMudXRpbF9Qcm9jZXNzVXRpbF9jaGlsZGFkYXB0ZXIgKyBhZGFwdGVyKTsgLy8kTk9OLU5MUy0xJAotLy8JCX0KLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IFJvbGVEZXNjcmlwdG9yIGZyb20gdGhlIGdpdmVuIHJvbGUuCi0JICogCi0JICogQHBhcmFtIHJvbGUKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBSb2xlRGVzY3JpcHRvciBjcmVhdGVSb2xlRGVzY3JpcHRvcihSb2xlIHJvbGUpIHsKLQkJUm9sZURlc2NyaXB0b3Igcm9sZURlc2MgPSBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVSb2xlRGVzY3JpcHRvcigpOwotCQlyb2xlRGVzYy5zZXRSb2xlKHJvbGUpOwotCQlTdHJpbmcgcHJlc2VudGF0aW9uTmFtZSA9IHJvbGUuZ2V0UHJlc2VudGF0aW9uTmFtZSgpOwotCQlyb2xlRGVzYy5zZXROYW1lKHJvbGUuZ2V0TmFtZSgpKTsKLQkJcm9sZURlc2Muc2V0UHJlc2VudGF0aW9uTmFtZShTdHJVdGlsLmlzQmxhbmsocHJlc2VudGF0aW9uTmFtZSkgPyByb2xlCi0JCQkJLmdldE5hbWUoKSA6IHByZXNlbnRhdGlvbk5hbWUpOwotCQkvLyByb2xlRGVzYy5zZXRCcmllZkRlc2NyaXB0aW9uKHJvbGUuZ2V0QnJpZWZEZXNjcmlwdGlvbigpKTsKLQkJcmV0dXJuIHJvbGVEZXNjOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgV29ya1Byb2R1Y3REZXNjcmlwdG9yIGNyZWF0ZVdvcmtQcm9kdWN0RGVzY3JpcHRvcigKLQkJCVdvcmtQcm9kdWN0IHdwKSB7Ci0JCVdvcmtQcm9kdWN0RGVzY3JpcHRvciB3cERlc2MgPSBVbWFGYWN0b3J5LmVJTlNUQU5DRQotCQkJCS5jcmVhdGVXb3JrUHJvZHVjdERlc2NyaXB0b3IoKTsKLQkJd3BEZXNjLnNldFdvcmtQcm9kdWN0KHdwKTsKLQkJd3BEZXNjLnNldE5hbWUod3AuZ2V0TmFtZSgpKTsKLQkJd3BEZXNjCi0JCQkJLnNldFByZXNlbnRhdGlvbk5hbWUoU3RyVXRpbC5pc0JsYW5rKHdwLmdldFByZXNlbnRhdGlvbk5hbWUoKSkgPyB3cAotCQkJCQkJLmdldE5hbWUoKQotCQkJCQkJOiB3cC5nZXRQcmVzZW50YXRpb25OYW1lKCkpOwotCQkvLyB3cERlc2Muc2V0QnJpZWZEZXNjcmlwdGlvbih3cC5nZXRCcmllZkRlc2NyaXB0aW9uKCkpOwotCQlyZXR1cm4gd3BEZXNjOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiByZWZyZXNoTmVlZGVkKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LAotCQkJQlNBY3Rpdml0eUl0ZW1Qcm92aWRlciBpdGVtUHJvdmlkZXIpIHsKLQkJcmV0dXJuIFVzZXJJbnRlcmFjdGlvbkhlbHBlci5nZXRVSUhlbHBlcigpLnJlZnJlc2hOZWVkZWQoYWRhcHRlckZhY3RvcnksIGl0ZW1Qcm92aWRlcik7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCByZWZyZXNoUHJlZGVjY2Vzc29yTGlzdHMoQWRhcHRlckZhY3RvcnkgZmFjdG9yeSwgUHJvY2VzcyBwcm9jKSB7Ci0JCUxpc3Q8RGVwdGhMZXZlbEl0ZW1Qcm92aWRlcj4gbGlzdCA9IFByZWRlY2Vzc29yTGlzdC5jcmVhdGVJdGVtUHJvdmlkZXJMaXN0KHByb2MsIGZhY3RvcnkpOwotCQlmb3IgKERlcHRoTGV2ZWxJdGVtUHJvdmlkZXIgaXAgOiBsaXN0KSB7Ci0JCQlPYmplY3QgaXRlbVByb3ZpZGVyID0gaXAuZ2V0SXRlbVByb3ZpZGVyKCk7Ci0JCQlpZihpdGVtUHJvdmlkZXIgaW5zdGFuY2VvZiBJQlNJdGVtUHJvdmlkZXIpIHsKLQkJCQlQcmVkZWNlc3Nvckxpc3QgcHJlZExpc3QgPSAoKElCU0l0ZW1Qcm92aWRlcilpdGVtUHJvdmlkZXIpLmdldFByZWRlY2Vzc29ycygpOwotCQkJCWlmKHByZWRMaXN0ICE9IG51bGwpIHsKLQkJCQkJcHJlZExpc3QucmVmcmVzaChsaXN0KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogVXBkYXRlcyBJRHMgb2Ygd29yayBicmVha2Rvd24gZWxlbWVudHMgb2YgdGhlIHZpZXcgb2YgdGhlIGdpdmVuIHByb2Nlc3MKLQkgKiAKLQkgKiBAcGFyYW0gZmFjdG9yeQotCSAqICAgICAgICAgICAgYWRhcHRlciBmYWN0b3J5IG9mIHRoZSBjdXJyZW50IHByb2Nlc3MgdmlldyAoV0JTLCBUQlMsIFdQQlMsCi0JICogICAgICAgICAgICBDQlMpCi0JICogQHBhcmFtIHByb2MKLQkgKiAgICAgICAgICAgIG11c3QgYmUgcmVmcmVzaGVkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCB1cGRhdGVJRHMoQWRhcHRlckZhY3RvcnkgZmFjdG9yeSwgUHJvY2VzcyBwcm9jKSB7Ci0JCUFkYXB0ZXJGYWN0b3J5VHJlZUl0ZXJhdG9yPE9iamVjdD4gaXRlciA9IG5ldyBBZGFwdGVyRmFjdG9yeVRyZWVJdGVyYXRvcjxPYmplY3Q+KAotCQkJCWZhY3RvcnksIHByb2MpIHsKLQkJCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgSXRlcmF0b3I8T2JqZWN0PiBnZXRDaGlsZHJlbihPYmplY3QgbykgewotCQkJCU9iamVjdCBlID0gVG5nVXRpbC51bndyYXAobyk7IAotCQkJCWlmKGUgaW5zdGFuY2VvZiBEZXNjcmlwdG9yIHx8IGUgaW5zdGFuY2VvZiBNaWxlc3RvbmUpIHsKLQkJCQkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpLml0ZXJhdG9yKCk7Ci0JCQkJfQotCQkJCXJldHVybiBzdXBlci5nZXRDaGlsZHJlbihvKTsKLQkJCX0JCQkKLQkJfTsKLQotCQlPYmplY3Qgb2JqOwotCQlmb3IgKGludCBpZCA9IDA7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJb2JqID0gaXRlci5uZXh0KCk7Ci0JCQlPYmplY3QgYWRhcHRlciA9IGZhY3RvcnkuYWRhcHQob2JqLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkJaWYgKGFkYXB0ZXIgaW5zdGFuY2VvZiBJQlNJdGVtUHJvdmlkZXIpIHsKLQkJCQlJQlNJdGVtUHJvdmlkZXIgaXRlbVByb3ZpZGVyID0gKElCU0l0ZW1Qcm92aWRlcikgYWRhcHRlcjsKLQkJCQlpZiAoaXRlbVByb3ZpZGVyICE9IG51bGwKLQkJCQkJCSYmIFRuZ1V0aWwudW53cmFwKG9iaikgaW5zdGFuY2VvZiBXb3JrQnJlYWtkb3duRWxlbWVudCkgewotCQkJCQlpdGVtUHJvdmlkZXIuc2V0SWQoaWQrKyk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlZnJlc2hWaWV3ZXIoQWRhcHRlckZhY3RvcnkgZmFjdG9yeSwgUHJvY2VzcyBwcm9jKSB7Ci0JCVVzZXJJbnRlcmFjdGlvbkhlbHBlci5nZXRVSUhlbHBlcigpLnJlZnJlc2hWaWV3ZXIoZmFjdG9yeSwgcHJvYyk7Ci0JfQotCi0JLyoqCi0JICogUmVmcmVzaGVzIHRoZSBlbGVtZW50IElEcyBpbiB0aG9zZSB2aWV3ZXJzIHRoYXQgcmVxdWlyZSB0aGlzLgotCSAqIAotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZWZyZXNoSURzSW5WaWV3ZXJzKGZpbmFsIEV4cG9zZWRBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlVc2VySW50ZXJhY3Rpb25IZWxwZXIuZ2V0VUlIZWxwZXIoKS5yZWZyZXNoSURzSW5WaWV3ZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCByZWZyZXNoQWxsVmlld2VycyhmaW5hbCBFeHBvc2VkQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJVXNlckludGVyYWN0aW9uSGVscGVyLmdldFVJSGVscGVyKCkucmVmcmVzaEFsbFZpZXdlcnMoYWRhcHRlckZhY3RvcnkpOwotCX0KLQkKLQkvKioKLQkgKiBAcGFyYW0gZQotCSAqICAgICAgICAgICAgdGhlIGJyZWFrZG93biBlbGVtZW50IHdob3NlIHByZWRlY2Vzc29yIGxpc3QgdG8gYmUgY2hlY2tlZC4KLQkgKiBAcGFyYW0gcHJlZElkTGlzdAotCSAqICAgICAgICAgICAgYSBsaXN0IG9mIHByZWRlY2Vzc29yIElEcyAoSW50ZWdlcikgYXMgc2hvd24gaW4gdGhlIElEIGNvbHVtbgotCSAqICAgICAgICAgICAgb2YgdGhlIGVkaXRvcgotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqIEBwYXJhbSBwcm9jZXNzCi0JICogQHBhcmFtIHByZWRlY2Vzc29ycwotCSAqICAgICAgICAgICAgb3V0cHV0LCB0aGUgcHJlZGVjZXNzb3IgbGlzdAotCSAqIEByZXR1cm4gbnVsbCBpZiBwcmVkTGlzdCBpcyB2YWxpZCwgYW4gZXJyb3IgbWVzc2FnZSBvdGhlcndpc2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjaGVja1ByZWRlY2Vzc29yTGlzdChXb3JrQnJlYWtkb3duRWxlbWVudCBlLAotCQkJTGlzdDxJbnRlZ2VyPiBwcmVkSWRMaXN0LCBBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwgT2JqZWN0IHByb2Nlc3MsCi0JCQlMaXN0PE9iamVjdD4gcHJlZGVjZXNzb3JzKSB7Ci0JCS8vIGdldCBCcmVha2Rvd25FbGVtZW50IGxpc3QgZnJvbSBJRCBsaXN0Ci0JCS8vCi0JCUxpc3Q8T2JqZWN0PiBiZUxpc3QgPSBuZXcgQXJyYXlMaXN0PE9iamVjdD4oKTsKLQkJTGlzdDxPYmplY3Q+IGFsbEVsZW1lbnRzID0gbmV3IEFycmF5TGlzdDxPYmplY3Q+KCk7Ci0JCWZvciAoSXRlcmF0b3I8T2JqZWN0PiBpdGVyID0gbmV3IEFkYXB0ZXJGYWN0b3J5VHJlZUl0ZXJhdG9yPE9iamVjdD4oYWRhcHRlckZhY3RvcnksCi0JCQkJcHJvY2Vzcyk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IG9iaiA9IGl0ZXIubmV4dCgpOwotCQkJSUJTSXRlbVByb3ZpZGVyIGl0ZW1Qcm92aWRlciA9IChJQlNJdGVtUHJvdmlkZXIpIGFkYXB0ZXJGYWN0b3J5Ci0JCQkJCS5hZGFwdChvYmosIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCQlJbnRlZ2VyIGlkID0gbmV3IEludGVnZXIoaXRlbVByb3ZpZGVyLmdldElkKCkpOwotCQkJT2JqZWN0IGVsZW1lbnQgPSBUbmdVdGlsLnVud3JhcChvYmopOwotCQkJYWxsRWxlbWVudHMuYWRkKGVsZW1lbnQpOwotCQkJaWYgKHByZWRJZExpc3QuY29udGFpbnMoaWQpKSB7Ci0JCQkJYmVMaXN0LmFkZChvYmopOwotCQkJfQotCQl9Ci0KLQkJLy8gY2hlY2sgZm9yIGNpcmN1bGFyIGRlcGVuZGVuY3kKLQkJLy8KLQkJaW50IHNpemUgPSBiZUxpc3Quc2l6ZSgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJT2JqZWN0IG9iaiA9IFRuZ1V0aWwudW53cmFwKGJlTGlzdC5nZXQoaSkpOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFdvcmtCcmVha2Rvd25FbGVtZW50KSB7Ci0JCQkJV29ya0JyZWFrZG93bkVsZW1lbnQgcHJlZCA9IChXb3JrQnJlYWtkb3duRWxlbWVudCkgb2JqOwotCQkJCWlmIChQcm9jZXNzVXRpbC5jaGVja0NpcmN1bGFyKGUsIHByZWQsIGFsbEVsZW1lbnRzKSkgewotCQkJCQlyZXR1cm4gTGlicmFyeUVkaXRSZXNvdXJjZXMudXRpbF9Qcm9jZXNzVXRpbF9lcnJfc2FtZV9icmVha2Rvd25fZWxlbWVudDsgCi0JCQkJfQotCQkJCWlmIChUbmdVdGlsLmlzU3ViZWxlbWVudE9mKHByZWQsIGUsIGFkYXB0ZXJGYWN0b3J5KSkgewotCQkJCQlyZXR1cm4gTGlicmFyeUVkaXRSZXNvdXJjZXMudXRpbF9Qcm9jZXNzVXRpbF9lcnJfc2FtZV9zdWJfZWxlbWVudDsgCi0JCQkJfQotCQkJCWlmIChUbmdVdGlsLmlzU3VwZXJFbGVtZW50T2YocHJlZCwgZSwgYWRhcHRlckZhY3RvcnkpKSB7Ci0JCQkJCXJldHVybiBMaWJyYXJ5RWRpdFJlc291cmNlcy51dGlsX1Byb2Nlc3NVdGlsX2Vycl9jaGlsZF9lbGVtZW50OyAKLQkJCQl9Ci0JCQl9IGVsc2UKLQkJCQlyZXR1cm4gTGlicmFyeUVkaXRSZXNvdXJjZXMudXRpbF9Qcm9jZXNzVXRpbF9lcnJfd3JvbmdfZWxlbWVudDsgCi0JCX0KLQotCQlpZiAocHJlZGVjZXNzb3JzICE9IG51bGwpCi0JCQlwcmVkZWNlc3NvcnMuYWRkQWxsKGJlTGlzdCk7Ci0JCQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDaGVja3MgZm9yIGNpcmN1bGFyIGRlcGVuZGVuY3kKLQkgKiAKLQkgKiBAcGFyYW0gc3VjY2Vzc29yCi0JICogQHBhcmFtIHByZWRlY2Vzc29yCi0JICogQHBhcmFtIGxpc3QKLQkgKiAgICAgICAgICAgIHRoZSBsaXN0IG9mIGFsbCBicmVha2Rvd24gZWxlbWVudHMgaW4gdGhlIGJyZWFrZG93biBzdHJ1Y3R1cmUKLQkgKi8KLQkgcHVibGljIHN0YXRpYyBib29sZWFuIGNoZWNrQ2lyY3VsYXIoV29ya0JyZWFrZG93bkVsZW1lbnQgc3VjY2Vzc29yLAotCQkJV29ya0JyZWFrZG93bkVsZW1lbnQgcHJlZGVjZXNzb3IsIExpc3QgbGlzdCkgewotCQlpZiAoc3VjY2Vzc29yID09IHByZWRlY2Vzc29yKSB7Ci0JCQlpZiAocHJlZGVjZXNzb3IuZ2V0SXNSZXBlYXRhYmxlKCkuYm9vbGVhblZhbHVlKCkpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlmb3IgKEl0ZXJhdG9yPD8+IGl0ZXIgPSBwcmVkZWNlc3Nvci5nZXRMaW5rVG9QcmVkZWNlc3NvcigpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkuaGFzTmV4dCgpOykgewotCQkJV29ya09yZGVyIGVsZW1lbnQgPSAoV29ya09yZGVyKSBpdGVyLm5leHQoKTsKLQkJCVdvcmtCcmVha2Rvd25FbGVtZW50IHByZWQgPSBlbGVtZW50LmdldFByZWQoKTsKLQkJCWlmIChwcmVkICE9IHByZWRlY2Vzc29yICYmIGxpc3QuY29udGFpbnMocHJlZCkpIHsKLQkJCQlpZiAoY2hlY2tDaXJjdWxhcihzdWNjZXNzb3IsIHByZWQsIGxpc3QpKQotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCSAKLQlwdWJsaWMgc3RhdGljIHZvaWQgZ2V0QWxsUHJlZGVjZXNzb3JMaXN0KFdvcmtCcmVha2Rvd25FbGVtZW50IHByZWRlY2Vzc29yLAotCQkJTGlzdCBsaXN0LCBMaXN0IHByZWRMaXN0KSB7Ci0JCWlmICghcHJlZExpc3QuY29udGFpbnMocHJlZGVjZXNzb3IpKQotCQkJcHJlZExpc3QuYWRkKHByZWRlY2Vzc29yKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gcHJlZGVjZXNzb3IuZ2V0TGlua1RvUHJlZGVjZXNzb3IoKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCVdvcmtPcmRlciBlbGVtZW50ID0gKFdvcmtPcmRlcikgaXRlci5uZXh0KCk7Ci0JCQlXb3JrQnJlYWtkb3duRWxlbWVudCBwcmVkID0gKFdvcmtCcmVha2Rvd25FbGVtZW50KSBlbGVtZW50Ci0JCQkJCS5nZXRQcmVkKCk7Ci0JCQlpZiAocHJlZCAhPSBwcmVkZWNlc3NvciAmJiBsaXN0LmNvbnRhaW5zKHByZWQpKSB7Ci0JCQkJaWYgKCFwcmVkTGlzdC5jb250YWlucyhwcmVkKSkgewotCQkJCQlwcmVkTGlzdC5hZGQocHJlZCk7Ci0JCQkJCWdldEFsbFByZWRlY2Vzc29yTGlzdChwcmVkLCBsaXN0LCBwcmVkTGlzdCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIGUKLQkgKiAgICAgICAgICAgIHRoZSBicmVha2Rvd24gZWxlbWVudCB3aG9zZSBwcmVkZWNlc3NvciBsaXN0IHRvIGJlIGNoZWNrZWQuCi0JICogQHBhcmFtIHByZWRMaXN0Ci0JICogICAgICAgICAgICBhIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIHByZWRlY2Vzc29yIElEcwotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqIEBwYXJhbSB0b3BBY3QKLQkgKiBAcGFyYW0gcHJlZGVjZXNzb3JzCi0JICogICAgICAgICAgICBvdXRwdXQsIHRoZSBwcmVkZWNlc3NvciBsaXN0Ci0JICogQHBhcmFtIGFsbEVsZW1lbnRzCi0JICogICAgICAgICAgICBvdXRwdXQsIHRoZSB3aG9sZSBicmVha2Rvd24gZWxlbWVudCBsaXN0IGlzIGNvcGllZCBpbnRvIHRoaXMKLQkgKiAgICAgICAgICAgIGxpc3QuCi0JICogQHJldHVybiBudWxsIGlmIHByZWRMaXN0IGlzIHZhbGlkLiBUaGUgcHJlZGVjZXNzb3IgbGlzdCBpcyBzYXZlZCBpbgotCSAqICAgICAgICAgcHJlZGVjZXNzb3JzIGFuZCB0aGUgd2hvbGUgYnJlYWtkb3duIGVsZW1lbnQgbGlzdCBpcyBzYXZlZCBpbgotCSAqICAgICAgICAgYWxsRWxlbWVudHMuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2hlY2tQcmVkZWNlc3Nvckxpc3QoV29ya0JyZWFrZG93bkVsZW1lbnQgZSwKLQkJCVN0cmluZyBwcmVkTGlzdCwgQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksIE9iamVjdCB0b3BBY3QsCi0JCQlMaXN0PE9iamVjdD4gcHJlZGVjZXNzb3JzKSB7Ci0JCUxpc3Q8SW50ZWdlcj4gaWRMaXN0ID0gbmV3IEFycmF5TGlzdDxJbnRlZ2VyPigpOwotCQlmb3IgKFN0cmluZ1Rva2VuaXplciB0b2tlbnMgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHByZWRMaXN0LCAiLCIpOyB0b2tlbnMuaGFzTW9yZVRva2VucygpOykgeyAvLyROT04tTkxTLTEkCi0JCQlTdHJpbmcgdG9rZW4gPSB0b2tlbnMubmV4dFRva2VuKCkudHJpbSgpOwotCQkJSW50ZWdlciBpZDsKLQkJCXRyeSB7Ci0JCQkJaWQgPSBuZXcgSW50ZWdlcih0b2tlbik7Ci0JCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZXgpIHsKLQkJCQlyZXR1cm4gTGlicmFyeUVkaXRSZXNvdXJjZXMuaW52YWxpZFByZWRlY2Vzc29yRXJyb3JfbXNnOyAKLQkJCX0KLQkJCWlkTGlzdC5hZGQoaWQpOwotCQl9Ci0KLQkJcmV0dXJuIGNoZWNrUHJlZGVjZXNzb3JMaXN0KGUsIGlkTGlzdCwgYWRhcHRlckZhY3RvcnksIHRvcEFjdCwKLQkJCQlwcmVkZWNlc3NvcnMpOwotCX0KLQotCS8qKgotCSAqIEFkZHMgdGhlIGdpdmVuIG9iamVjdCdzIG1ldGhvZCBwYWNrYWdlIGFuZCBwbHVnaW4gdG8gdGhlIGRlZmF1bHQKLQkgKiBjb25maWd1cmF0aW9uIG9mIHRoZSBnaXZlbiBwcm9jZXNzIGlmIHRoZXkgYXJlIG5vdCBpbiB0aGUgY29uZmlndXJhdGlvbgotCSAqIHlldC4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvYwotCSAqIEBwYXJhbSBvYmplY3QKLQkgKiBAcGFyYW0gYWRkZWRPYmplY3RzCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGFkZFRvRGVmYXVsdENvbmZpZ3VyYXRpb24oUHJvY2VzcyBwcm9jLCBFT2JqZWN0IGUsCi0JCQlTZXQgYWRkZWRPYmplY3RzKSB7Ci0JCS8vIGFkZCB0aGUgZWxlbWVudCdzIG1ldGhvZCBwYWNrYWdlIHRvIHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24KLQkJLy8KLQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSBwcm9jLmdldERlZmF1bHRDb250ZXh0KCk7Ci0JCWlmIChlIGluc3RhbmNlb2YgVGFzaykgewotCQkJYWRkVGFza1RvRGVmYXVsdENvbmZpZ3VyYXRpb24ocHJvYywgKFRhc2spIGUsIGFkZGVkT2JqZWN0cywgdHJ1ZSk7Ci0JCX0gZWxzZSBpZiAoZSBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0KSB7Ci0JCQlXb3JrUHJvZHVjdCB3cCA9IChXb3JrUHJvZHVjdCkgZTsKLQkJCWFkZFdQVG9EZWZhdWx0Q29uZmlndXJhdGlvbihwcm9jLCB3cCwgYWRkZWRPYmplY3RzKTsKLQkJCUxpc3QgdGFza3MgPSBnZXRUYXNrc0ZvcldvcmtQcm9kdWN0KHdwLCBjb25maWcpOwotCQkJaWYgKHRhc2tzICE9IG51bGwpCi0JCQl7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gdGFza3MuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCWFkZFRhc2tUb0RlZmF1bHRDb25maWd1cmF0aW9uKHByb2MsIChUYXNrKSBpdGVyLm5leHQoKSwKLQkJCQkJCQlhZGRlZE9iamVjdHMsIGZhbHNlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoZSBpbnN0YW5jZW9mIFJvbGUpIHsKLQkJCVJvbGUgcm9sZSA9IChSb2xlKSBlOwotCQkJYWRkUm9sZVRvRGVmYXVsdENvbmZpZ3VyYXRpb24ocHJvYywgcm9sZSwgYWRkZWRPYmplY3RzKTsKLQotCQl9IGVsc2UgaWYgKGUgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJYWRkQWN0aXZpdHlUb0RlZmF1bHRDb25maWd1cmF0aW9uKHByb2MsIChBY3Rpdml0eSkgZSwgYWRkZWRPYmplY3RzKTsKLQkJfSBlbHNlIGlmIChlIGluc3RhbmNlb2YgR3VpZGFuY2UpIHsKLQkJCVRuZ1V0aWwuYWRkVG9Db25maWd1cmF0aW9uKGNvbmZpZywgKEd1aWRhbmNlKSBlLCBhZGRlZE9iamVjdHMpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIHZvaWQgYWRkQWN0aXZpdHlUb0RlZmF1bHRDb25maWd1cmF0aW9uKFByb2Nlc3MgcHJvYywgQWN0aXZpdHkgYWN0aXZpdHksIFNldCBhZGRlZE9iamVjdHMpIHsKLQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSBwcm9jLmdldERlZmF1bHRDb250ZXh0KCk7Ci0JCVRuZ1V0aWwuYWRkVG8oY29uZmlnLCBVbWFVdGlsLmdldFByb2Nlc3NDb21wb25lbnQoYWN0aXZpdHkpLCBhZGRlZE9iamVjdHMpOwotCQkvLyBhZGQgbGlua2VkIGVsZW1lbnQgb2YgZGVzY3JpcHRvcnMKLQkJLy8KLQkJZm9yIChJdGVyYXRvciBpdGVyID0gYWN0aXZpdHkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlID0gKE9iamVjdCkgaXRlci5uZXh0KCk7Ci0JCQlpZihlIGluc3RhbmNlb2YgRGVzY3JpcHRvcikgewotCQkJCU1ldGhvZEVsZW1lbnQgbyA9IFByb2Nlc3NVdGlsLmdldEFzc29jaWF0ZWRFbGVtZW50KChEZXNjcmlwdG9yKSBlKTsKLQkJCQlpZihvICE9IG51bGwpIHsKLQkJCQkJYWRkVG9EZWZhdWx0Q29uZmlndXJhdGlvbihwcm9jLCBvLCBhZGRlZE9iamVjdHMpOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgaWYgKGUgaW5zdGFuY2VvZiBBY3Rpdml0eSl7Ci0JCQkJLy8gdGhpcyBpcyBuZWVkZWQgZm9yIGFkZGluZyBzdWItYWN0aXZpdGllcyBkZXNjcmlwdG9ycyAKLQkJCQlhZGRBY3Rpdml0eVRvRGVmYXVsdENvbmZpZ3VyYXRpb24ocHJvYywgKEFjdGl2aXR5KSBlLCBhZGRlZE9iamVjdHMpOwotCQkJfQotCQl9Ci0KLQkJLy8gYWRkIGFsbCB0aGUgYmFzZSBlbGVtZW50cyBpZiB0aGVyZSBpcyBhbnkKLQkJZm9yIChBY3Rpdml0eSBiYXNlID0gKEFjdGl2aXR5KSBhY3Rpdml0eS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCk7IGJhc2UgIT0gbnVsbDsgYmFzZSA9IChBY3Rpdml0eSkgYmFzZQotCQkuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpKSB7Ci0JCQlhZGRBY3Rpdml0eVRvRGVmYXVsdENvbmZpZ3VyYXRpb24ocHJvYywgYmFzZSwgYWRkZWRPYmplY3RzKTsKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgYWRkVGFza1RvRGVmYXVsdENvbmZpZ3VyYXRpb24oUHJvY2VzcyBwcm9jLCBUYXNrIHRhc2ssCi0JCQlTZXQgYWRkZWRPYmplY3RzLCBib29sZWFuIGluY2x1ZGVXb3JrUHJvZHVjdHMpIHsKLQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSBwcm9jLmdldERlZmF1bHRDb250ZXh0KCk7Ci0KLQkJVG5nVXRpbC5hZGRUb0NvbmZpZ3VyYXRpb24oY29uZmlnLCB0YXNrLCBhZGRlZE9iamVjdHMpOwotCi0JCS8vIGFkZCBhbGwgb3RoZXIgZGVwZW5kZW5jaWVzCi0JCS8vCi0KLQkJLy8gYWRkIHJvbGVzCi0JCUFycmF5TGlzdDxFT2JqZWN0PiBkZXBlbmRlbmNpZXMgPSBuZXcgQXJyYXlMaXN0PEVPYmplY3Q+KCk7Ci0JCWRlcGVuZGVuY2llcy5hZGRBbGwodGFzay5nZXRBZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSgpKTsKLQkJZGVwZW5kZW5jaWVzLmFkZEFsbCh0YXNrLmdldFBlcmZvcm1lZEJ5KCkpOwotCQlmb3IgKEVPYmplY3QgZU9iamVjdCA6IGRlcGVuZGVuY2llcykgewotCQkJVG5nVXRpbC5hZGRUb0NvbmZpZ3VyYXRpb24oY29uZmlnLCBlT2JqZWN0LAotCQkJCQlhZGRlZE9iamVjdHMpOwotCQl9Ci0KLQkJLy8gYWRkIHdvcmsgcHJvZHVjdHMKLQkJaWYgKGluY2x1ZGVXb3JrUHJvZHVjdHMpIHsKLQkJCWRlcGVuZGVuY2llcy5jbGVhcigpOwotCQkJZGVwZW5kZW5jaWVzLmFkZEFsbCh0YXNrLmdldE9wdGlvbmFsSW5wdXQoKSk7Ci0JCQlkZXBlbmRlbmNpZXMuYWRkQWxsKHRhc2suZ2V0T3V0cHV0KCkpOwotCQkJZGVwZW5kZW5jaWVzLmFkZEFsbCh0YXNrLmdldE1hbmRhdG9yeUlucHV0KCkpOwotCQkJZm9yIChFT2JqZWN0IGVPYmplY3QgOiBkZXBlbmRlbmNpZXMpIHsKLQkJCQlhZGRXUFRvRGVmYXVsdENvbmZpZ3VyYXRpb24ocHJvYywgKFdvcmtQcm9kdWN0KSBlT2JqZWN0LAotCQkJCQkJYWRkZWRPYmplY3RzKTsKLQkJCX0KLQkJfQotCi0JCWZvciAoU2VjdGlvbiBzdGVwIDogdGFzay5nZXRTdGVwcygpKSB7CQkJCi0JCQlFT2JqZWN0IGJhc2UgPSBzdGVwLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsKLQkJCWlmIChiYXNlICE9IG51bGwpIHsKLQkJCQlUbmdVdGlsLmFkZFRvQ29uZmlndXJhdGlvbihjb25maWcsIGJhc2UsIGFkZGVkT2JqZWN0cyk7Ci0JCQl9Ci0JCX0KLQotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgYWRkUm9sZVRvRGVmYXVsdENvbmZpZ3VyYXRpb24oUHJvY2VzcyBwcm9jLAotCQkJUm9sZSByb2xlLCBTZXQgYWRkZWRPYmplY3RzKSB7Ci0JCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gcHJvYy5nZXREZWZhdWx0Q29udGV4dCgpOwotCQlUbmdVdGlsLmFkZFRvQ29uZmlndXJhdGlvbihjb25maWcsIHJvbGUsIGFkZGVkT2JqZWN0cyk7Ci0JCQotCQkvLyBhZGQgd29yayBwcm9kdWN0cwotCQlBcnJheUxpc3QgZGVwZW5kZW5jaWVzID0gbmV3IEFycmF5TGlzdCgpOwotCQotCQlkZXBlbmRlbmNpZXMuYWRkQWxsKHJvbGUuZ2V0TW9kaWZpZXMoKSk7Ci0JCWRlcGVuZGVuY2llcy5hZGRBbGwocm9sZS5nZXRSZXNwb25zaWJsZUZvcigpKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZGVwZW5kZW5jaWVzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJYWRkV1BUb0RlZmF1bHRDb25maWd1cmF0aW9uKHByb2MsIChXb3JrUHJvZHVjdCkgaXRlci5uZXh0KCksCi0JCQkJCWFkZGVkT2JqZWN0cyk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBhZGRXUFRvRGVmYXVsdENvbmZpZ3VyYXRpb24oUHJvY2VzcyBwcm9jLAotCQkJV29ya1Byb2R1Y3Qgd3AsIFNldCBhZGRlZE9iamVjdHMpIHsKLQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSBwcm9jLmdldERlZmF1bHRDb250ZXh0KCk7Ci0JCVRuZ1V0aWwuYWRkVG9Db25maWd1cmF0aW9uKGNvbmZpZywgd3AsIGFkZGVkT2JqZWN0cyk7Ci0JCWlmICh3cCBpbnN0YW5jZW9mIERlbGl2ZXJhYmxlKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSAoKERlbGl2ZXJhYmxlKSB3cCkuZ2V0RGVsaXZlcmVkV29ya1Byb2R1Y3RzKCkKLQkJCQkJLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCVRuZ1V0aWwuYWRkVG9Db25maWd1cmF0aW9uKGNvbmZpZywgKEVPYmplY3QpIGl0ZXIubmV4dCgpLAotCQkJCQkJYWRkZWRPYmplY3RzKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCB1cGRhdGVUYXNrRGVzY3JpcHRvclN0ZXBzKEFjdGl2aXR5IGFjdGl2aXR5LAotCQkJVGFza0Rlc2NyaXB0b3IgdGFza0Rlc2MpIHsKLQkJaWYgKHRhc2tEZXNjID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCVRhc2sgdGFzayA9IHRhc2tEZXNjLmdldFRhc2soKTsKLQotCQlJQ29uZmlndXJhdGlvbkFwcGxpY2F0b3IgY29uZmlnQXBwbGljYXRvciA9IFByb3ZpZGVycwotCQkJCS5nZXRDb25maWd1cmF0aW9uQXBwbGljYXRvcigpOwotCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IFRuZ1V0aWwuZ2V0T3duaW5nUHJvY2VzcyhhY3Rpdml0eSkKLQkJCQkuZ2V0RGVmYXVsdENvbnRleHQoKTsKLQkJTGlzdDxTdGVwPiBzdGVwcyA9IChMaXN0PFN0ZXA+KSBjb25maWdBcHBsaWNhdG9yLmdldFJlZmVyZW5jZSh0YXNrLAotCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tfU3RlcHMoKSwgY29uZmlnKTsKLQotCQkvLyBhZGQgdGhvc2Ugc3RlcHMgdG8gVGFza0Rlc2NyaXB0b3IgaWYgdGhleSBhcmUgbm90IHRoZXJlIHlldC4KLQkJLy8KLQkJZm9yIChTdGVwIHN0ZXAgOiBzdGVwcykgewotCQkJaWYgKCF0YXNrRGVzYy5nZXRTZWxlY3RlZFN0ZXBzKCkuY29udGFpbnMoc3RlcCkpIHsKLQkJCQl0YXNrRGVzYy5nZXRTZWxlY3RlZFN0ZXBzKCkuYWRkKHN0ZXApOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgTWV0aG9kRWxlbWVudCB0aGF0IHRoZSBnaXZlbiBkZXNjcmlwdG9yIGlzIGFzc29jaWF0ZWQgd2l0aC4KLQkgKiAKLQkgKiBAcGFyYW0gZGVzY3JpcHRvcgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1ldGhvZEVsZW1lbnQgZ2V0QXNzb2NpYXRlZEVsZW1lbnQoRGVzY3JpcHRvciBkZXNjcmlwdG9yKSB7Ci0JCWlmIChkZXNjcmlwdG9yIGluc3RhbmNlb2YgUm9sZURlc2NyaXB0b3IpIHsKLQkJCXJldHVybiAoKFJvbGVEZXNjcmlwdG9yKSBkZXNjcmlwdG9yKS5nZXRSb2xlKCk7Ci0JCX0gZWxzZSBpZiAoZGVzY3JpcHRvciBpbnN0YW5jZW9mIFRhc2tEZXNjcmlwdG9yKSB7Ci0JCQlyZXR1cm4gKChUYXNrRGVzY3JpcHRvcikgZGVzY3JpcHRvcikuZ2V0VGFzaygpOwotCQl9IGVsc2UgaWYgKGRlc2NyaXB0b3IgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3IpIHsKLQkJCXJldHVybiAoKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgZGVzY3JpcHRvcikuZ2V0V29ya1Byb2R1Y3QoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBFUmVmZXJlbmNlIGdldExpbmtSZWZlcmVuY2UoRGVzY3JpcHRvciBkZXNjcmlwdG9yKSB7Ci0JCWlmIChkZXNjcmlwdG9yIGluc3RhbmNlb2YgUm9sZURlc2NyaXB0b3IpIHsKLQkJCXJldHVybiBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRSb2xlRGVzY3JpcHRvcl9Sb2xlKCk7Ci0JCX0gZWxzZSBpZiAoZGVzY3JpcHRvciBpbnN0YW5jZW9mIFRhc2tEZXNjcmlwdG9yKSB7Ci0JCQlyZXR1cm4gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza0Rlc2NyaXB0b3JfVGFzaygpOwotCQl9IGVsc2UgaWYgKGRlc2NyaXB0b3IgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3IpIHsKLQkJCXJldHVybiBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JfV29ya1Byb2R1Y3QoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBkaXNwb3NlV3JhcHBlcnMoQ29sbGVjdGlvbiBjaGlsZHJlbikgewotCQlpZiAoY2hpbGRyZW4gPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gY2hpbGRyZW4uaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZWxlbWVudCA9IGl0ZXIubmV4dCgpOwotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJV3JhcHBlckl0ZW1Qcm92aWRlcikgewotCQkJCSgoSVdyYXBwZXJJdGVtUHJvdmlkZXIpIGVsZW1lbnQpLmRpc3Bvc2UoKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEdldCBhbGwgdGFza3MgdGhhdCBoYXZlIHRoZSBnaXZlbiB3b3JrcHJvZHVjdCBpbiB0aGVpciBvdXRwdXQKLQkgKiBpbiB0aGUgZ2l2ZW4gY29uZmlndXJhdGlvbgotCSAqIAotCSAqIEBwYXJhbSB3cAotCSAqIEBwYXJhbSBjb25maWcKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0IGdldFRhc2tzRm9yV29ya1Byb2R1Y3QoV29ya1Byb2R1Y3Qgd3AsCi0JCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZykgewotCQlJQ29uZmlndXJhdGlvbkFwcGxpY2F0b3IgY29uZmlnQXBwbGljYXRvciA9IFByb3ZpZGVycy5nZXRDb25maWd1cmF0aW9uQXBwbGljYXRvcigpOwotCi0JCUxpc3QgdGFza3MgPSAoTGlzdCkgY29uZmlnQXBwbGljYXRvci5nZXRSZWZlcmVuY2Uod3AsIEFzc29jaWF0aW9uSGVscGVyLldvcmtQcm9kdWN0X091dHB1dEZyb21fVGFza3MsIGNvbmZpZyk7Ci0KLQkJcmV0dXJuIHRhc2tzOwotCX0KLQotCS8qKgotCSAqIEdldCBhbGwgd29ya3Byb2R1Y3RzIHRoYXQgaGF2ZSB0aGUgcm9sZSBhcyByZXNwb25zaWJsZSByb2xlIGluIHRoZQotCSAqIGdpdmVuIGNvbmZpZ3VyYXRpb24KLQkgKiAKLQkgKiBAcGFyYW0gd3AKLQkgKiBAcGFyYW0gY29uZmlnCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRXb3JrUHJvZHVjdHNGb3JSb2xlKFJvbGUgcm9sZSwKLQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0JCUlDb25maWd1cmF0aW9uQXBwbGljYXRvciBjb25maWdBcHBsaWNhdG9yID0gUHJvdmlkZXJzLmdldENvbmZpZ3VyYXRpb25BcHBsaWNhdG9yKCk7Ci0JCUxpc3Qgd3BzID0gKExpc3QpIGNvbmZpZ0FwcGxpY2F0b3IuZ2V0UmVmZXJlbmNlKHJvbGUsIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFJvbGVfUmVzcG9uc2libGVGb3IoKSwgY29uZmlnKTsKLQkJcmV0dXJuIHdwczsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIGFsbCB3b3JrcHJvZHVjdHMgd2hpY2ggYXJlLCBleGNlcHQgdGhlIGNvbnRyaWJ1dG9yLCBpbiB0aGUgZ2l2ZW4KLQkgKiBwbHVnaW4uCi0JICogCi0JICogQHBhcmFtIHBsdWdpbgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3QgZ2V0QWxsV29ya1Byb2R1Y3RzKE1ldGhvZFBsdWdpbiBwbHVnaW4pIHsKLQotCQlDb250ZW50UGFja2FnZSBjb3JlQ29udGVudFBrZyA9IFVtYVV0aWwuZmluZENvbnRlbnRQYWNrYWdlKHBsdWdpbiwKLQkJCQlNb2RlbFN0cnVjdHVyZS5ERUZBVUxULmNvcmVDb250ZW50UGF0aCk7Ci0JCUl0ZXJhdG9yIGl0ZXIgPSBuZXcgQWJzdHJhY3RUcmVlSXRlcmF0b3IoY29yZUNvbnRlbnRQa2csIGZhbHNlKSB7Ci0KLQkJCS8qKgotCQkJICogQ29tbWVudCBmb3IgPGNvZGU+c2VyaWFsVmVyc2lvblVJRDwvY29kZT4KLQkJCSAqLwotCQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMzgzMzc1MjA2NjMyNDgzNzkzN0w7Ci0KLQkJCXByb3RlY3RlZCBJdGVyYXRvciBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJaWYgKCEob2JqZWN0IGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UpKQotCQkJCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVC5pdGVyYXRvcigpOwotCQkJCUNvbnRlbnRQYWNrYWdlIHBrZyA9IChDb250ZW50UGFja2FnZSkgb2JqZWN0OwotCQkJCUxpc3QgY2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IHBrZy5nZXRDaGlsZFBhY2thZ2VzKCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IKLQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCU9iamVjdCBlbGVtZW50ID0gaXRlcmF0b3IubmV4dCgpOwotCQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIENvbnRlbnRQYWNrYWdlKSB7Ci0JCQkJCQljaGlsZHJlbi5hZGQoZWxlbWVudCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IHBrZy5nZXRDb250ZW50RWxlbWVudHMoKS5pdGVyYXRvcigpOyBpdGVyYXRvcgotCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyYXRvci5uZXh0KCk7Ci0KLQkJCQkJaWYgKChlbGVtZW50IGluc3RhbmNlb2YgV29ya1Byb2R1Y3QpCi0JCQkJCQkJJiYgIVRuZ1V0aWwKLQkJCQkJCQkJCS5pc0NvbnRyaWJ1dG9yKChWYXJpYWJpbGl0eUVsZW1lbnQpIGVsZW1lbnQpKSB7Ci0JCQkJCQljaGlsZHJlbi5hZGQoZWxlbWVudCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJcmV0dXJuIGNoaWxkcmVuLml0ZXJhdG9yKCk7Ci0JCQl9Ci0KLQkJfTsKLQkJTGlzdCBtZXRob2RFbGVtZW50cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlPYmplY3QgZSA9IGl0ZXIubmV4dCgpOwotCQkJaWYgKGUgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdCkgewotCQkJCW1ldGhvZEVsZW1lbnRzLmFkZChlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbWV0aG9kRWxlbWVudHM7Ci0JfQotCi0JLyoqCi0JICogR2V0cyBhbGwgdGFzaywgZXhjZXB0IHRoZSBjb250cmlidXRvciwgaW4gdGhlIGdpdmVuIHBsdWdpbi4KLQkgKiAKLQkgKiBAcGFyYW0gcGx1Z2luCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRBbGxUYXNrcyhNZXRob2RQbHVnaW4gcGx1Z2luKSB7Ci0JCUNvbnRlbnRQYWNrYWdlIGNvcmVDb250ZW50UGtnID0gVW1hVXRpbC5maW5kQ29udGVudFBhY2thZ2UocGx1Z2luLAotCQkJCU1vZGVsU3RydWN0dXJlLkRFRkFVTFQuY29yZUNvbnRlbnRQYXRoKTsKLQkJSXRlcmF0b3IgaXRlciA9IG5ldyBBYnN0cmFjdFRyZWVJdGVyYXRvcihjb3JlQ29udGVudFBrZywgZmFsc2UpIHsKLQotCQkJLyoqCi0JCQkgKiBDb21tZW50IGZvciA8Y29kZT5zZXJpYWxWZXJzaW9uVUlEPC9jb2RlPgotCQkJICovCi0JCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAzODMzNzUyMDY2MzI0ODM3OTM3TDsKLQotCQkJcHJvdGVjdGVkIEl0ZXJhdG9yIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJCQlpZiAoIShvYmplY3QgaW5zdGFuY2VvZiBDb250ZW50UGFja2FnZSkpCi0JCQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNULml0ZXJhdG9yKCk7Ci0JCQkJQ29udGVudFBhY2thZ2UgcGtnID0gKENvbnRlbnRQYWNrYWdlKSBvYmplY3Q7Ci0JCQkJTGlzdCBjaGlsZHJlbiA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gcGtnLmdldENoaWxkUGFja2FnZXMoKS5pdGVyYXRvcigpOyBpdGVyYXRvcgotCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UpIHsKLQkJCQkJCWNoaWxkcmVuLmFkZChlbGVtZW50KTsKLQkJCQkJfQotCQkJCX0KLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gcGtnLmdldENvbnRlbnRFbGVtZW50cygpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yCi0JCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQlPYmplY3QgZWxlbWVudCA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBUYXNrCi0JCQkJCQkJJiYgIVRuZ1V0aWwKLQkJCQkJCQkJCS5pc0NvbnRyaWJ1dG9yKChWYXJpYWJpbGl0eUVsZW1lbnQpIGVsZW1lbnQpKSB7Ci0JCQkJCQljaGlsZHJlbi5hZGQoZWxlbWVudCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJcmV0dXJuIGNoaWxkcmVuLml0ZXJhdG9yKCk7Ci0JCQl9Ci0KLQkJfTsKLQkJTGlzdCB0YXNrcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlPYmplY3QgZSA9IGl0ZXIubmV4dCgpOwotCQkJaWYgKGUgaW5zdGFuY2VvZiBUYXNrKSB7Ci0JCQkJdGFza3MuYWRkKGUpOwotCQkJfQotCQl9Ci0JCXJldHVybiB0YXNrczsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNFeHRlbmRpbmdPckxvY2FsbHlDb250cmlidXRpbmcoQnJlYWtkb3duRWxlbWVudCBlKSB7Ci0JCXJldHVybiBUbmdVdGlsLmlzR2VuZXJhbGl6ZXIoZSwKLQkJCQlnZXRFeHRlbmRBbmRMb2NhbENvbnRyaWJ1dGlvblZhcmlhYmlsaXR5VHlwZXMoKSk7Ci0JfQotCQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UHJlc2VudGF0aW9uTmFtZShCcmVha2Rvd25FbGVtZW50IGUpIHsKLQkJaWYgKGUuZ2V0UHJlc2VudGF0aW9uTmFtZSgpID09IG51bGwKLQkJCQl8fCBlLmdldFByZXNlbnRhdGlvbk5hbWUoKS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQlpZiAoaXNFeHRlbmRpbmdPckxvY2FsbHlDb250cmlidXRpbmcoZSkpIHsKLQkJCQlCcmVha2Rvd25FbGVtZW50IGJhc2UgPSAoQnJlYWtkb3duRWxlbWVudCkgKChWYXJpYWJpbGl0eUVsZW1lbnQpIGUpCi0JCQkJCQkuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpOwotCQkJCXJldHVybiBnZXRQcmVzZW50YXRpb25OYW1lKGJhc2UpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGUuZ2V0UHJlc2VudGF0aW9uTmFtZSgpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldExhYmVsV2l0aFBhdGgoQnJlYWtkb3duRWxlbWVudCBlKSB7Ci0JCVN0cmluZ0J1ZmZlciBwYXRoID0gbmV3IFN0cmluZ0J1ZmZlcihlLmdldE5hbWUoKSk7Ci0JCVByb2Nlc3MgcHJvYyA9IFRuZ1V0aWwuZ2V0T3duaW5nUHJvY2VzcyhlKTsKLQkJaWYgKHByb2MgIT0gbnVsbCkgewotCQkJcGF0aC5hcHBlbmQoIiwgIik7IC8vJE5PTi1OTFMtMSQKLQkJCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSBVbWFVdGlsLmdldE1ldGhvZFBsdWdpbihwcm9jKTsKLQkJCWlmIChwbHVnaW4gIT0gbnVsbCkgewotCQkJCXBhdGguYXBwZW5kKHBsdWdpbi5nZXROYW1lKCkpOwotCQkJfQotCQkJaWYgKGUgIT0gcHJvYykgewotCQkJCXBhdGguYXBwZW5kKCcvJykuYXBwZW5kKHByb2MuZ2V0TmFtZSgpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcGF0aC50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIG1vZGVsIGluZm8gb2YgdGhlIGdpdmVuIEJyZWFrZG93bkVsZW1lbnQgaW4gdGhlIGdpdmVuCi0JICogU3RyaW5nQnVmZmVyCi0JICogCi0JICogQHBhcmFtIGUKLQkgKiBAcGFyYW0gYWRhcHRlcgotCSAqIEBwYXJhbSBtb2RlbEluZm8KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgZ2V0TW9kZWxJbmZvKEJyZWFrZG93bkVsZW1lbnQgZSwgT2JqZWN0IGFkYXB0ZXIsCi0JCQlTdHJpbmdCdWZmZXIgbW9kZWxJbmZvKSB7Ci0JCWlmIChlIGluc3RhbmNlb2YgVmFyaWFiaWxpdHlFbGVtZW50KSB7Ci0JCQlWYXJpYWJpbGl0eUVsZW1lbnQgdmUgPSAoVmFyaWFiaWxpdHlFbGVtZW50KSBlOwotCQkJVmFyaWFiaWxpdHlFbGVtZW50IGJhc2UgPSB2ZS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCk7Ci0JCQlpZiAoYmFzZSAhPSBudWxsKSB7Ci0JCQkJVmFyaWFiaWxpdHlUeXBlIHR5cGUgPSB2ZS5nZXRWYXJpYWJpbGl0eVR5cGUoKTsKLQkJCQlpZiAobW9kZWxJbmZvLmxlbmd0aCgpID4gMCkgewotCQkJCQltb2RlbEluZm8uYXBwZW5kKCI7ICIpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJCVN0cmluZyBwYXR0ZXJuID0gbnVsbDsKLQkJCQlpZiAodHlwZSA9PSBWYXJpYWJpbGl0eVR5cGUuQ09OVFJJQlVURVMpIHsKLQkJCQkJcGF0dGVybiA9IExpYnJhcnlFZGl0UmVzb3VyY2VzLnV0aWxfUHJvY2Vzc1V0aWxfY29udHJpYnV0ZXN0bzsgCi0JCQkJfSBlbHNlIGlmICh0eXBlID09IFZhcmlhYmlsaXR5VHlwZS5MT0NBTF9DT05UUklCVVRJT04pIHsKLQkJCQkJcGF0dGVybiA9IExpYnJhcnlFZGl0UmVzb3VyY2VzLnV0aWxfUHJvY2Vzc1V0aWxfbG9jYWxDb250cmlidXRlc3RvOyAKLQkJCQl9IGVsc2UgaWYgKHR5cGUgPT0gVmFyaWFiaWxpdHlUeXBlLkVYVEVORFMpIHsKLQkJCQkJcGF0dGVybiA9IExpYnJhcnlFZGl0UmVzb3VyY2VzLnByb2Nlc3NfZXh0ZW5kczsgCi0JCQkJfSBlbHNlIGlmICh0eXBlID09IFZhcmlhYmlsaXR5VHlwZS5SRVBMQUNFUykgewotCQkJCQlwYXR0ZXJuID0gTGlicmFyeUVkaXRSZXNvdXJjZXMucHJvY2Vzc19yZXBsYWNlczsgCi0JCQkJfSBlbHNlIGlmICh0eXBlID09IFZhcmlhYmlsaXR5VHlwZS5MT0NBTF9SRVBMQUNFTUVOVCkgewotCQkJCQlwYXR0ZXJuID0gTGlicmFyeUVkaXRSZXNvdXJjZXMucHJvY2Vzc19sb2NhbFJlcGxhY2VzOyAKLQkJCQl9Ci0KLQkJCQkvLyBpZihhZGFwdGVyIGluc3RhbmNlb2YgSXRlbVByb3ZpZGVyQWRhcHRlcikgewotCQkJCS8vIEFkYXB0ZXJGYWN0b3J5IGZhY3RvcnkgPQotCQkJCS8vICgoSXRlbVByb3ZpZGVyQWRhcHRlcilhZGFwdGVyKS5nZXRBZGFwdGVyRmFjdG9yeSgpOwotCQkJCS8vIE9iamVjdCBpdGVtUHJvdmlkZXIgPSBmYWN0b3J5LmFkYXB0KGJhc2UsCi0JCQkJLy8gSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCQkvLyBpZihpdGVtUHJvdmlkZXIgaW5zdGFuY2VvZiBJQlNJdGVtUHJvdmlkZXIpIHsKLQkJCQkvLyBJQlNJdGVtUHJvdmlkZXIgYnNJdGVtUHJvdmlkZXIgPSAoSUJTSXRlbVByb3ZpZGVyKQotCQkJCS8vIGl0ZW1Qcm92aWRlcjsKLQkJCQkvLyBQcm9jZXNzIHByb2MgPSAoUHJvY2VzcykgYnNJdGVtUHJvdmlkZXIuZ2V0VG9wSXRlbSgpOwotCQkJCS8vIGlmKHByb2MgIT0gbnVsbCkgewotCQkJCS8vIHN0cmJ1Zi5hcHBlbmQoVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4ocHJvYykuZ2V0TmFtZSgpKS5hcHBlbmQoJzonKQotCQkJCS8vIC5hcHBlbmQocHJvYy5nZXROYW1lKCkpLmFwcGVuZCgnOicpOwotCQkJCS8vIH0KLQkJCQkvLyB9Ci0JCQkJLy8gfQotCi0JCQkJLy8gUHJvY2VzcyBwcm9jID0gVG5nVXRpbC5nZXRPd25pbmdQcm9jZXNzKChCcmVha2Rvd25FbGVtZW50KQotCQkJCS8vIGJhc2UpOwotCQkJCS8vIGlmKHByb2MgIT0gbnVsbCkgewotCQkJCS8vIE1ldGhvZFBsdWdpbiBwbHVnaW4gPSBVbWFVdGlsLmdldE1ldGhvZFBsdWdpbihwcm9jKTsKLQkJCQkvLyBpZihwbHVnaW4gIT0gbnVsbCkgewotCQkJCS8vIG1vZGVsSW5mby5hcHBlbmQoVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4ocHJvYykuZ2V0TmFtZSgpKS5hcHBlbmQoJzonKTsKLQkJCQkvLyB9Ci0JCQkJLy8gbW9kZWxJbmZvLmFwcGVuZChwcm9jLmdldE5hbWUoKSk7Ci0JCQkJLy8gfQotCQkJCS8vCQkJCQotCQkJCS8vIGlmKGJhc2UgIT0gcHJvYykgewotCQkJCS8vIG1vZGVsSW5mby5hcHBlbmQoJzonKS5hcHBlbmQoYmFzZS5nZXROYW1lKCkpOwotCQkJCS8vIH0KLQkJCQkvLyBtb2RlbEluZm8uYXBwZW5kKCInIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlpZiAocGF0dGVybiAhPSBudWxsKSB7Ci0JCQkJCVN0cmluZyBwYXRoID0gZ2V0TGFiZWxXaXRoUGF0aCgoQnJlYWtkb3duRWxlbWVudCkgYmFzZSk7Ci0JCQkJCW1vZGVsSW5mby5hcHBlbmQoTWVzc2FnZUZvcm1hdC5mb3JtYXQocGF0dGVybiwKLQkJCQkJCQluZXcgT2JqZWN0W10geyBwYXRoIH0pKTsKLQotCQkJCQlnZXRNb2RlbEluZm8oKEJyZWFrZG93bkVsZW1lbnQpIGJhc2UsIGFkYXB0ZXIsIG1vZGVsSW5mbyk7Ci0JCQkJfQotCQkJfQotCQl9IGVsc2UgaWYgKGFkYXB0ZXIgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgewotCQkJQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIgd3JhcHBlciA9IChCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgYWRhcHRlcjsKLQkJCXdyYXBwZXIuZ2V0T3duZXIoKTsKLQkJCWlmICh3cmFwcGVyLmdldEZlYXR1cmUoKSAhPSBudWxsKSB7Ci0JCQkJbW9kZWxJbmZvLmFwcGVuZChUbmdVdGlsLmdldEZlYXR1cmVUZXh0KHdyYXBwZXIuZ2V0RmVhdHVyZSgpKSk7Ci0JCQl9IGVsc2UgewotCQkJCWlmICh3cmFwcGVyIGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yV3JhcHBlckl0ZW1Qcm92aWRlcikgewotLy8JCQkJCWdldE1vZGVsSW5mb0ZvcldvcmtQcm9kdWN0RGVzY3JpcHRvcihtb2RlbEluZm8sCi0vLwkJCQkJCQkoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBUbmdVdGlsLnVud3JhcCh3cmFwcGVyKSk7Ci0JCQkJCQotCQkJCQlnZXRXUERNb2RlbEluZm8obW9kZWxJbmZvLCB3cmFwcGVyLCB3cmFwcGVyKTsKLQkJCQkJCi0JCQkJfQotCQkJfQotCQl9Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldENvbHVtbk5hbWUoU3RyaW5nIHByb3BlcnR5KSB7Ci0JCWlmIChJQlNJdGVtUHJvdmlkZXIuQ09MX0lELmVxdWFscyhwcm9wZXJ0eSkpIHsKLQkJCXJldHVybiBJQlNJdGVtUHJvdmlkZXIuQ09MX0lEOwotCQl9IGVsc2UgaWYgKElCU0l0ZW1Qcm92aWRlci5DT0xfTkFNRS5lcXVhbHMocHJvcGVydHkpKSB7Ci0JCQlyZXR1cm4gSUJTSXRlbVByb3ZpZGVyLkNPTF9OQU1FOwotCQl9IGVsc2UgaWYgKElCU0l0ZW1Qcm92aWRlci5DT0xfUFJFU0VOVEFUSU9OX05BTUUuZXF1YWxzKHByb3BlcnR5KSkgewotCQkJcmV0dXJuIElCU0l0ZW1Qcm92aWRlci5DT0xfUFJFU0VOVEFUSU9OX05BTUU7Ci0JCX0gZWxzZSBpZiAoSUJTSXRlbVByb3ZpZGVyLkNPTF9QUkVERUNFU1NPUlMuZXF1YWxzKHByb3BlcnR5KSkgewotCQkJcmV0dXJuIElCU0l0ZW1Qcm92aWRlci5DT0xfUFJFREVDRVNTT1JTOwotCQl9IGVsc2UgaWYgKElCU0l0ZW1Qcm92aWRlci5DT0xfSVNfRVZFTlRfRFJJVkVOLmVxdWFscyhwcm9wZXJ0eSkpIHsKLQkJCXJldHVybiBJQlNJdGVtUHJvdmlkZXIuQ09MX0lTX0VWRU5UX0RSSVZFTjsKLQkJfSBlbHNlIGlmIChJQlNJdGVtUHJvdmlkZXIuQ09MX0lTX09OR09JTkcuZXF1YWxzKHByb3BlcnR5KSkgewotCQkJcmV0dXJuIElCU0l0ZW1Qcm92aWRlci5DT0xfSVNfT05HT0lORzsKLQkJfSBlbHNlIGlmIChJQlNJdGVtUHJvdmlkZXIuQ09MX0lTX1JFUEVBVEFCTEUuZXF1YWxzKHByb3BlcnR5KSkgewotCQkJcmV0dXJuIElCU0l0ZW1Qcm92aWRlci5DT0xfSVNfUkVQRUFUQUJMRTsKLQkJfSBlbHNlIGlmIChJQlNJdGVtUHJvdmlkZXIuQ09MX1BSRUZJWC5lcXVhbHMocHJvcGVydHkpKSB7Ci0JCQlyZXR1cm4gSUJTSXRlbVByb3ZpZGVyLkNPTF9QUkVGSVg7Ci0JCX0gZWxzZSBpZiAoSUJTSXRlbVByb3ZpZGVyLkNPTF9NT0RFTF9JTkZPLmVxdWFscyhwcm9wZXJ0eSkpIHsKLQkJCXJldHVybiBJQlNJdGVtUHJvdmlkZXIuQ09MX01PREVMX0lORk87Ci0JCX0gZWxzZSBpZiAoSUJTSXRlbVByb3ZpZGVyLkNPTF9UWVBFLmVxdWFscyhwcm9wZXJ0eSkpIHsKLQkJCXJldHVybiBJQlNJdGVtUHJvdmlkZXIuQ09MX1RZUEU7Ci0JCX0gZWxzZSBpZiAoSUJTSXRlbVByb3ZpZGVyLkNPTF9URUFNUy5lcXVhbHMocHJvcGVydHkpKSB7Ci0JCQlyZXR1cm4gSUJTSXRlbVByb3ZpZGVyLkNPTF9URUFNUzsKLQkJfSBlbHNlIGlmIChJQlNJdGVtUHJvdmlkZXIuQ09MX0VOVFJZX1NUQVRFLmVxdWFscyhwcm9wZXJ0eSkpIHsKLQkJCXJldHVybiBJQlNJdGVtUHJvdmlkZXIuQ09MX0VOVFJZX1NUQVRFOwotCQl9IGVsc2UgaWYgKElCU0l0ZW1Qcm92aWRlci5DT0xfRVhJVF9TVEFURS5lcXVhbHMocHJvcGVydHkpKSB7Ci0JCQlyZXR1cm4gSUJTSXRlbVByb3ZpZGVyLkNPTF9FWElUX1NUQVRFOwotCQl9IGVsc2UgaWYgKElCU0l0ZW1Qcm92aWRlci5DT0xfREVMSVZFUkFCTEUuZXF1YWxzKHByb3BlcnR5KSkgewotCQkJcmV0dXJuIElCU0l0ZW1Qcm92aWRlci5DT0xfREVMSVZFUkFCTEU7Ci0JCX0gZWxzZSBpZiAoSUJTSXRlbVByb3ZpZGVyLkNPTF9JU19PUFRJT05BTC5lcXVhbHMocHJvcGVydHkpKSB7Ci0JCQlyZXR1cm4gSUJTSXRlbVByb3ZpZGVyLkNPTF9JU19PUFRJT05BTDsKLQkJfSBlbHNlIGlmIChJQlNJdGVtUHJvdmlkZXIuQ09MX0lTX1BMQU5ORUQuZXF1YWxzKHByb3BlcnR5KSkgewotCQkJcmV0dXJuIElCU0l0ZW1Qcm92aWRlci5DT0xfSVNfUExBTk5FRDsKLQkJfSBlbHNlIGlmIChJQlNJdGVtUHJvdmlkZXIuQ09MX0hBU19NVUxUSVBMRV9PQ0NVUlJFTkNFUy5lcXVhbHMocHJvcGVydHkpKSB7Ci0JCQlyZXR1cm4gSUJTSXRlbVByb3ZpZGVyLkNPTF9IQVNfTVVMVElQTEVfT0NDVVJSRU5DRVM7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0QXR0cmlidXRlKE9iamVjdCBvYmplY3QsIFN0cmluZyBwcm9wZXJ0eSwKLQkJCU9iamVjdCBhZGFwdGVyKSB7Ci0JCUJyZWFrZG93bkVsZW1lbnQgZSA9IChCcmVha2Rvd25FbGVtZW50KSBUbmdVdGlsLnVud3JhcChvYmplY3QpOwotCQlpZiAocHJvcGVydHkgPT0gSUJTSXRlbVByb3ZpZGVyLkNPTF9JRCkgewotCQkJaWYgKGUgaW5zdGFuY2VvZiBXb3JrQnJlYWtkb3duRWxlbWVudAotCQkJCQkmJiBhZGFwdGVyIGluc3RhbmNlb2YgSUJTSXRlbVByb3ZpZGVyKSB7Ci0JCQkJcmV0dXJuIFN0cmluZy52YWx1ZU9mKCgoSUJTSXRlbVByb3ZpZGVyKSBhZGFwdGVyKS5nZXRJZCgpKTsKLQkJCX0KLQkJfSBlbHNlIGlmIChwcm9wZXJ0eSA9PSBJQlNJdGVtUHJvdmlkZXIuQ09MX05BTUUpIHsKLQkJCWlmIChhZGFwdGVyIGluc3RhbmNlb2YgSUl0ZW1MYWJlbFByb3ZpZGVyKSB7Ci0JCQkJcmV0dXJuICgoSUl0ZW1MYWJlbFByb3ZpZGVyKSBhZGFwdGVyKS5nZXRUZXh0KGUpOwotCQkJfQotCQl9IGVsc2UgaWYgKHByb3BlcnR5ID09IElCU0l0ZW1Qcm92aWRlci5DT0xfUFJFU0VOVEFUSU9OX05BTUUpIHsKLQkJCXJldHVybiBnZXRQcmVzZW50YXRpb25OYW1lKGUpOwotCQl9IGVsc2UgaWYgKHByb3BlcnR5ID09IElCU0l0ZW1Qcm92aWRlci5DT0xfUFJFREVDRVNTT1JTKSB7Ci0JCQlpZiAoYWRhcHRlciBpbnN0YW5jZW9mIElCU0l0ZW1Qcm92aWRlcikgewotCQkJCXJldHVybiAoKElCU0l0ZW1Qcm92aWRlcikgYWRhcHRlcikuZ2V0UHJlZGVjZXNzb3JzKCkudG9TdHJpbmcoKTsKLQkJCX0KLQkJfSBlbHNlIGlmIChwcm9wZXJ0eSA9PSBJQlNJdGVtUHJvdmlkZXIuQ09MX0lTX0VWRU5UX0RSSVZFTikgewotCQkJaWYgKGUgaW5zdGFuY2VvZiBXb3JrQnJlYWtkb3duRWxlbWVudCkgewotCQkJCXJldHVybiBTdHJpbmcudmFsdWVPZigoKFdvcmtCcmVha2Rvd25FbGVtZW50KSBlKQotCQkJCQkJLmdldElzRXZlbnREcml2ZW4oKSk7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAocHJvcGVydHkgPT0gSUJTSXRlbVByb3ZpZGVyLkNPTF9JU19PTkdPSU5HKSB7Ci0JCQlpZiAoZSBpbnN0YW5jZW9mIFdvcmtCcmVha2Rvd25FbGVtZW50KSB7Ci0JCQkJcmV0dXJuIFN0cmluZwotCQkJCQkJLnZhbHVlT2YoKChXb3JrQnJlYWtkb3duRWxlbWVudCkgZSkuZ2V0SXNPbmdvaW5nKCkpOwotCQkJfQotCQl9IGVsc2UgaWYgKHByb3BlcnR5ID09IElCU0l0ZW1Qcm92aWRlci5DT0xfSVNfUkVQRUFUQUJMRSkgewotCQkJaWYgKGUgaW5zdGFuY2VvZiBXb3JrQnJlYWtkb3duRWxlbWVudCkgewotCQkJCXJldHVybiBTdHJpbmcudmFsdWVPZigoKFdvcmtCcmVha2Rvd25FbGVtZW50KSBlKQotCQkJCQkJLmdldElzUmVwZWF0YWJsZSgpKTsKLQkJCX0KLQkJfSBlbHNlIGlmIChwcm9wZXJ0eSA9PSBJQlNJdGVtUHJvdmlkZXIuQ09MX1BSRUZJWCkgewotCQkJcmV0dXJuIGUuZ2V0UHJlZml4KCk7Ci0JCX0gZWxzZSBpZiAocHJvcGVydHkgPT0gSUJTSXRlbVByb3ZpZGVyLkNPTF9NT0RFTF9JTkZPKSB7Ci0JCQlTdHJpbmdCdWZmZXIgbW9kZWxJbmZvID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJZ2V0TW9kZWxJbmZvKGUsIGFkYXB0ZXIsIG1vZGVsSW5mbyk7Ci0JCQlyZXR1cm4gbW9kZWxJbmZvLnRvU3RyaW5nKCk7Ci0JCX0gZWxzZSBpZiAocHJvcGVydHkgPT0gSUJTSXRlbVByb3ZpZGVyLkNPTF9UWVBFKSB7Ci0JCQlTdHJpbmcgdHlwZU5hbWUgPSBudWxsOwotCQkJaWYgKGUgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3IpIHsKLQkJCQlXb3JrUHJvZHVjdCB3cCA9ICgoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBlKQotCQkJCQkJLmdldFdvcmtQcm9kdWN0KCk7Ci0JCQkJaWYgKHdwICE9IG51bGwpIHsKLQkJCQkJdHlwZU5hbWUgPSB3cC5lQ2xhc3MoKS5nZXROYW1lKCkgKyAiRGVzY3JpcHRvciI7IC8vJE5PTi1OTFMtMSQgIAotCQkJCX0KLQkJCX0KLQkJCWlmICh0eXBlTmFtZSA9PSBudWxsICYmIGUgaW5zdGFuY2VvZiBFT2JqZWN0KSB7Ci0JCQkJdHlwZU5hbWUgPSAoKEVPYmplY3QpIGUpLmVDbGFzcygpLmdldE5hbWUoKTsKLQkJCX0KLQkJCWlmICh0eXBlTmFtZSAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJCS5nZXRTdHJpbmcoIl9VSV8iICsgdHlwZU5hbWUgKyAiX3R5cGUiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQl9Ci0JCX0gZWxzZSBpZiAocHJvcGVydHkgPT0gSUJTSXRlbVByb3ZpZGVyLkNPTF9URUFNUykgewotCQkJaWYgKGUgaW5zdGFuY2VvZiBUZWFtUHJvZmlsZSkgewotCQkJCXJldHVybiBUbmdVdGlsLmdldFByZXNlbnRhdGlvbk5hbWUoKChUZWFtUHJvZmlsZSkgZSkKLQkJCQkJCS5nZXRTdXBlclRlYW0oKSk7Ci0JCQl9Ci0JCQllbHNlIGlmIChlIGluc3RhbmNlb2YgUm9sZURlc2NyaXB0b3IgJiYgYWRhcHRlciBpbnN0YW5jZW9mIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlcikgewotCQkJCUFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5ID0gbnVsbDsKLQkJCQlpZihhZGFwdGVyIGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIHsKLQkJCQkJYWRhcHRlckZhY3RvcnkgPSAoKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKWFkYXB0ZXIpLmdldEFkYXB0ZXJGYWN0b3J5KCk7Ci0JCQkJfQotCQkJCWVsc2UgaWYoYWRhcHRlciBpbnN0YW5jZW9mIEl0ZW1Qcm92aWRlckFkYXB0ZXIpIHsKLQkJCQkJYWRhcHRlckZhY3RvcnkgPSAoKEl0ZW1Qcm92aWRlckFkYXB0ZXIpYWRhcHRlcikuZ2V0QWRhcHRlckZhY3RvcnkoKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIGdldFRlYW1MaXN0U3RyaW5nKGdldFRlYW1Qcm9maWxlcyhvYmplY3QsIChJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIpYWRhcHRlciwgYWRhcHRlckZhY3RvcnkpKTsKLSAJCQl9Ci0JCX0KLQkJaWYgKHByb3BlcnR5ID09IElCU0l0ZW1Qcm92aWRlci5DT0xfRU5UUllfU1RBVEUpIHsKLQkJCWlmIChlIGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yKSB7Ci0JCQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yIHdwZCA9IChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIGU7Ci0JCQkJcmV0dXJuIFRuZ1V0aWwuY2hlY2tOdWxsKHdwZC5nZXRBY3Rpdml0eUVudHJ5U3RhdGUoKSk7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAocHJvcGVydHkgPT0gSUJTSXRlbVByb3ZpZGVyLkNPTF9FWElUX1NUQVRFKSB7Ci0JCQlpZiAoZSBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgewotCQkJCVdvcmtQcm9kdWN0RGVzY3JpcHRvciB3cGQgPSAoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBlOwotCQkJCXJldHVybiBUbmdVdGlsLmNoZWNrTnVsbCh3cGQuZ2V0QWN0aXZpdHlFeGl0U3RhdGUoKSk7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAocHJvcGVydHkgPT0gSUJTSXRlbVByb3ZpZGVyLkNPTF9ERUxJVkVSQUJMRSkgewotCQkJaWYgKGUgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3IpIHsKLQkJCQlMaXN0IGRlbGl2ZXJhYmxlcyA9IEFzc29jaWF0aW9uSGVscGVyCi0JCQkJCQkuZ2V0RGVsaXZlcmFibGVEZXNjcmlwdG9ycygoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBlKTsKLQkJCQlpZiAoZGVsaXZlcmFibGVzLmlzRW1wdHkoKSkKLQkJCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCQkJU3RyaW5nQnVmZmVyIHN0ckJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCQlpbnQgbWF4ID0gZGVsaXZlcmFibGVzLnNpemUoKSAtIDE7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtYXg7IGkrKykgewotCQkJCQlzdHJCdWYuYXBwZW5kKAotCQkJCQkJCVRuZ1V0aWwuZ2V0UHJlc2VudGF0aW9uTmFtZShkZWxpdmVyYWJsZXMuZ2V0KGkpKSkKLQkJCQkJCQkuYXBwZW5kKCcsJyk7Ci0JCQkJfQotCQkJCXN0ckJ1Zi5hcHBlbmQoVG5nVXRpbAotCQkJCQkJLmdldFByZXNlbnRhdGlvbk5hbWUoZGVsaXZlcmFibGVzLmdldChtYXgpKSk7Ci0JCQkJcmV0dXJuIHN0ckJ1Zi50b1N0cmluZygpOwotCQkJfQotCQl9IGVsc2UgaWYgKHByb3BlcnR5ID09IElCU0l0ZW1Qcm92aWRlci5DT0xfSVNfT1BUSU9OQUwpIHsKLQkJCXJldHVybiBTdHJpbmcudmFsdWVPZihlLmdldElzT3B0aW9uYWwoKSk7Ci0JCX0gZWxzZSBpZiAocHJvcGVydHkgPT0gSUJTSXRlbVByb3ZpZGVyLkNPTF9JU19QTEFOTkVEKSB7Ci0JCQlyZXR1cm4gU3RyaW5nLnZhbHVlT2YoZS5nZXRJc1BsYW5uZWQoKSk7Ci0JCX0gZWxzZSBpZiAocHJvcGVydHkgPT0gSUJTSXRlbVByb3ZpZGVyLkNPTF9IQVNfTVVMVElQTEVfT0NDVVJSRU5DRVMpIHsKLQkJCXJldHVybiBTdHJpbmcudmFsdWVPZihlLmdldEhhc011bHRpcGxlT2NjdXJyZW5jZXMoKSk7Ci0JCX0KLQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogR2V0IHBhcmVudCBhY3Rpdml0eSBmb3IgdGVhbSBwcm9maWxlIGJyZWFrZG93biBlbGVtZW50Ci0JICogVW1hVXRpbC5nZXRQYXJlbnRBY3Rpdml0eSBkb2Vzbid0IHdvcmsgY29ycmVjdGx5IGZvciBzdWItdGVhbXMKLQkgKiBUaGlzIG1ldGhvZCBzaG91bGQgb25seSBiZSB1c2VkIGZvciBicmVha2Rvd24gZWxlbWVudHMgdW5kZXIgdGVhbWFsbG9jYXRpb24KLQkgKiBAcGFyYW0gdGVhbQotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9iamVjdCBnZXRQYXJlbnRBY3Rpdml0eU9mVGVhbShCcmVha2Rvd25FbGVtZW50IGJyRWxlbWVudCkKLQl7Ci0JCUFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5ID0gVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UuZ2V0T0JTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKTsKLQkJSXRlbVByb3ZpZGVyQWRhcHRlciBhZGFwdGVyID0gKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIGFkYXB0ZXJGYWN0b3J5Ci0JCQkJLmFkYXB0KGJyRWxlbWVudCwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJT2JqZWN0IHBhcmVudCA9IGFkYXB0ZXIuZ2V0UGFyZW50KGJyRWxlbWVudCk7Ci0JCXdoaWxlICghKHBhcmVudCBpbnN0YW5jZW9mIEFjdGl2aXR5KSkgewotCQkJYnJFbGVtZW50ID0gKEJyZWFrZG93bkVsZW1lbnQpIHBhcmVudDsKLQkJCWFkYXB0ZXIgPSAoSXRlbVByb3ZpZGVyQWRhcHRlcikgYWRhcHRlckZhY3RvcnkuYWRhcHQoYnJFbGVtZW50LAotCQkJCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkJcGFyZW50ID0gYWRhcHRlci5nZXRQYXJlbnQoYnJFbGVtZW50KTsKLQkJfQotCi0JCXJldHVybiBwYXJlbnQ7CQotCX0KLQkKLQkKLQkvKioKLQkgKiBSZXR1cm4gcm9sZWRlc2NyaXB0b3JzIHVuZGVyIGFjdGl2aXR5IHdoaWNoIGNvdWxkIHBvc3NpYmxlIG1hdGNoIGZvcgotCSAqIHJvbGVzIHVuZGVyIHRoZSB0ZWFtcy4gSXQgd2lsbCByZWN1cnNlIHRocnUgYWxsIGNoaWxkIGFjdGl2aXRpZXMgdG8gZmluZCAKLQkgKiByb2xlIGRlc2NyaXB0b3JzCi0JICogCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICogQHBhcmFtIHBhcmVudAotCSAqIEBwYXJhbSByb2xlRGVzY0xpc3QKLQkgKiBAcGFyYW0gcm9sZXMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgZ2V0Um9sZURlc2NyaXB0b3IoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksCi0JCQlBY3Rpdml0eSBwYXJlbnQsICBMaXN0IHJvbGVEZXNjTGlzdCwgTGlzdCByb2xlcykgewotCQlJdGVtUHJvdmlkZXJBZGFwdGVyIGFkYXB0ZXIgPSAoSXRlbVByb3ZpZGVyQWRhcHRlcikgYWRhcHRlckZhY3RvcnkKLQkJCQkuYWRhcHQocGFyZW50LCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCi0JCU9iamVjdCBvID0gYWRhcHRlci5nZXRDaGlsZHJlbihwYXJlbnQpOwotCQlpZiAobyBpbnN0YW5jZW9mIExpc3QpIHsKLQkJCUxpc3QgY2hpbGRyZW4gPSAoTGlzdCkgbzsKLQkJCWZvciAoSXRlcmF0b3IgaXRvciA9IGNoaWxkcmVuLml0ZXJhdG9yKCk7IGl0b3IuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBvYmogPSBpdG9yLm5leHQoKTsKLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQkJZ2V0Um9sZURlc2NyaXB0b3IoYWRhcHRlckZhY3RvcnksIChBY3Rpdml0eSkgb2JqLAotCQkJCQkJCXJvbGVEZXNjTGlzdCwgcm9sZXMpOwotCQkJCX0KLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgUm9sZURlc2NyaXB0b3IpCi0JCQkJewotCQkJCQlSb2xlRGVzY3JpcHRvciByb2xlRGVzYyA9IChSb2xlRGVzY3JpcHRvcikgb2JqOwotCQkJCQlpZiAoKHJvbGVEZXNjLmdldFJvbGUoKSE9IG51bGwpICYmIAotCQkJCQkJCShyb2xlcy5jb250YWlucyhyb2xlRGVzYy5nZXRSb2xlKCkpKSkKLQkJCQkJCXJvbGVEZXNjTGlzdC5hZGQob2JqKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldFRlYW1MaXN0U3RyaW5nKExpc3QgdGVhbVByb2ZpbGVzKSB7Ci0JCWlmICh0ZWFtUHJvZmlsZXMuaXNFbXB0eSgpKQotCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZ0J1ZmZlciBzdHJCdWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWludCBtYXggPSB0ZWFtUHJvZmlsZXMuc2l6ZSgpIC0gMTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtYXg7IGkrKykgewotCQkJc3RyQnVmLmFwcGVuZChUbmdVdGlsLmdldFByZXNlbnRhdGlvbk5hbWUodGVhbVByb2ZpbGVzLmdldChpKSkpCi0JCQkJCS5hcHBlbmQoJywnKTsKLQkJfQotCQlzdHJCdWYuYXBwZW5kKFRuZ1V0aWwuZ2V0UHJlc2VudGF0aW9uTmFtZSh0ZWFtUHJvZmlsZXMuZ2V0KG1heCkpKTsKLQkJcmV0dXJuIHN0ckJ1Zi50b1N0cmluZygpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRBdHRyaWJ1dGUoV29ya0JyZWFrZG93bkVsZW1lbnQgZSwgU3RyaW5nIHByb3AsCi0JCQlTdHJpbmcgdHh0KSB7Ci0JCWlmIChwcm9wID09IElCU0l0ZW1Qcm92aWRlci5DT0xfTkFNRSkgewotCQkJZS5zZXROYW1lKHR4dCk7Ci0JCX0gZWxzZSBpZiAocHJvcCA9PSBJQlNJdGVtUHJvdmlkZXIuQ09MX1BSRUZJWCkgewotCQkJZS5zZXRQcmVmaXgodHh0KTsKLQkJfSBlbHNlIGlmIChwcm9wID09IElCU0l0ZW1Qcm92aWRlci5DT0xfSVNfRVZFTlRfRFJJVkVOKSB7Ci0JCQllLnNldElzRXZlbnREcml2ZW4oQm9vbGVhbi52YWx1ZU9mKHR4dCkpOwotCQl9IGVsc2UgaWYgKHByb3AgPT0gSUJTSXRlbVByb3ZpZGVyLkNPTF9JU19PTkdPSU5HKSB7Ci0JCQllLnNldElzT25nb2luZyhCb29sZWFuLnZhbHVlT2YodHh0KSk7Ci0JCX0gZWxzZSBpZiAocHJvcCA9PSBJQlNJdGVtUHJvdmlkZXIuQ09MX0lTX1JFUEVBVEFCTEUpIHsKLQkJCWUuc2V0SXNSZXBlYXRhYmxlKEJvb2xlYW4udmFsdWVPZih0eHQpKTsKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRBdHRyaWJ1dGUoSUFjdGlvbk1hbmFnZXIgYWN0aW9uTWdyLAotCQkJQnJlYWtkb3duRWxlbWVudCBlLCBTdHJpbmcgcHJvcCwgU3RyaW5nIHR4dCkgewotCQlpZiAocHJvcCA9PSBJQlNJdGVtUHJvdmlkZXIuQ09MX05BTUUpIHsKLQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5TRVQsIGUsIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCS5nZXROYW1lZEVsZW1lbnRfTmFtZSgpLCB0eHQsIC0xKTsKLQkJfSBlbHNlIGlmIChwcm9wID09IElCU0l0ZW1Qcm92aWRlci5DT0xfUFJFRklYKSB7Ci0JCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuU0VULCBlLCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkuZ2V0QnJlYWtkb3duRWxlbWVudF9QcmVmaXgoKSwgdHh0LCAtMSk7Ci0JCX0gZWxzZSBpZiAocHJvcCA9PSBJQlNJdGVtUHJvdmlkZXIuQ09MX0lTX0VWRU5UX0RSSVZFTikgewotCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlNFVCwgZSwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJLmdldFdvcmtCcmVha2Rvd25FbGVtZW50X0lzRXZlbnREcml2ZW4oKSwgQm9vbGVhbgotCQkJCQkudmFsdWVPZih0eHQpLCAtMSk7Ci0JCX0gZWxzZSBpZiAocHJvcCA9PSBJQlNJdGVtUHJvdmlkZXIuQ09MX0lTX09OR09JTkcpIHsKLQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5TRVQsIGUsIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCS5nZXRXb3JrQnJlYWtkb3duRWxlbWVudF9Jc09uZ29pbmcoKSwgQm9vbGVhbi52YWx1ZU9mKHR4dCksCi0JCQkJCS0xKTsKLQkJfSBlbHNlIGlmIChwcm9wID09IElCU0l0ZW1Qcm92aWRlci5DT0xfSVNfUkVQRUFUQUJMRSkgewotCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlNFVCwgZSwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJLmdldFdvcmtCcmVha2Rvd25FbGVtZW50X0lzUmVwZWF0YWJsZSgpLCBCb29sZWFuCi0JCQkJCS52YWx1ZU9mKHR4dCksIC0xKTsKLQkJfSBlbHNlIGlmIChwcm9wID09IElCU0l0ZW1Qcm92aWRlci5DT0xfUFJFU0VOVEFUSU9OX05BTUUpIHsKLQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5TRVQsIGUsIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCS5nZXRNZXRob2RFbGVtZW50X1ByZXNlbnRhdGlvbk5hbWUoKSwgdHh0LCAtMSk7Ci0JCX0gZWxzZSBpZiAocHJvcCA9PSBJQlNJdGVtUHJvdmlkZXIuQ09MX0lTX09QVElPTkFMKSB7Ci0JCQlhY3Rpb25NZ3IKLQkJCQkJLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlNFVCwgZSwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkuZ2V0QnJlYWtkb3duRWxlbWVudF9Jc09wdGlvbmFsKCksIEJvb2xlYW4KLQkJCQkJCQkudmFsdWVPZih0eHQpLCAtMSk7Ci0JCX0gZWxzZSBpZiAocHJvcCA9PSBJQlNJdGVtUHJvdmlkZXIuQ09MX0lTX1BMQU5ORUQpIHsKLQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5TRVQsIGUsIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCS5nZXRCcmVha2Rvd25FbGVtZW50X0lzUGxhbm5lZCgpLCBCb29sZWFuLnZhbHVlT2YodHh0KSwgLTEpOwotCQl9IGVsc2UgaWYgKHByb3AgPT0gSUJTSXRlbVByb3ZpZGVyLkNPTF9IQVNfTVVMVElQTEVfT0NDVVJSRU5DRVMpIHsKLQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5TRVQsIGUsIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCS5nZXRCcmVha2Rvd25FbGVtZW50X0hhc011bHRpcGxlT2NjdXJyZW5jZXMoKSwgQm9vbGVhbgotCQkJCQkudmFsdWVPZih0eHQpLCAtMSk7Ci0JCX0gZWxzZSBpZiAoZSBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgewotCQkJaWYgKHByb3AgPT0gSUJTSXRlbVByb3ZpZGVyLkNPTF9FTlRSWV9TVEFURSkgewotCQkJCWFjdGlvbk1ncgotCQkJCQkJLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlNFVCwgZSwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJLmdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9BY3Rpdml0eUVudHJ5U3RhdGUoKSwKLQkJCQkJCQkJdHh0LCAtMSk7Ci0JCQl9IGVsc2UgaWYgKHByb3AgPT0gSUJTSXRlbVByb3ZpZGVyLkNPTF9FWElUX1NUQVRFKSB7Ci0JCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlNFVCwgZSwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCS5nZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JfQWN0aXZpdHlFeGl0U3RhdGUoKSwgdHh0LCAtMSk7Ci0JCQl9Ci0JCX0KLQotCX0KLQotCXB1YmxpYyBzdGF0aWMgQWN0aXZpdHkgZ2VuZXJhbGl6ZShBY3Rpdml0eSBiYXNlLCBWYXJpYWJpbGl0eVR5cGUgdHlwZSkgewkJCi0JCUFjdGl2aXR5IGFjdCA9IChBY3Rpdml0eSkgVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlKGJhc2UuZUNsYXNzKCkpOwotCQlhY3Quc2V0TmFtZShiYXNlLmdldE5hbWUoKSk7Ci0JCWlmICh0eXBlID09IFZhcmlhYmlsaXR5VHlwZS5MT0NBTF9SRVBMQUNFTUVOVCkgewotCQkJU3RyaW5nIHByZXNlbnRhdGlvbk5hbWUgPSBnZXRQcmVzZW50YXRpb25OYW1lKGJhc2UpOwotCQkJYWN0LnNldFByZXNlbnRhdGlvbk5hbWUoU3RyVXRpbC5pc0JsYW5rKHByZXNlbnRhdGlvbk5hbWUpID8gYmFzZQotCQkJCQkuZ2V0TmFtZSgpIDogcHJlc2VudGF0aW9uTmFtZSk7Ci0JCX0KLQkJYWN0LnNldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoYmFzZSk7Ci0JCWFjdC5zZXRWYXJpYWJpbGl0eVR5cGUodHlwZSk7Ci0KLQkJaWYgKHR5cGUgPT0gVmFyaWFiaWxpdHlUeXBlLkVYVEVORFMpIHsKLQkJCS8vIGluaGVyaXQgYm9vbGVhbiBhdHRyaWJ1dGVzIGZyb20gYmFzZQotCQkJLy8KLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGJhc2UuZUNsYXNzKCkuZ2V0RUFsbEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJRUF0dHJpYnV0ZSBhdHRyaWJ1dGUgPSAoRUF0dHJpYnV0ZSkgaXRlci5uZXh0KCk7Ci0JCQkJaWYgKGF0dHJpYnV0ZS5nZXRFQXR0cmlidXRlVHlwZSgpLmdldEluc3RhbmNlQ2xhc3MoKSA9PSBCb29sZWFuLmNsYXNzKSB7Ci0JCQkJCWFjdC5lU2V0KGF0dHJpYnV0ZSwgYmFzZS5lR2V0KGF0dHJpYnV0ZSkpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCS8vIGNvcHkgcHJlZGVjZXNzb3JzIGxpc3QKLQkJLy8gVE9ETzogbmVlZCB0byBjaGVjayB3aXRoIHZhcmlhYmlsaXR5IHJ1bGVzLgotCQkvLwotCQlBcnJheUxpc3Qgd29ya09yZGVycyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gbmV3IEFycmF5TGlzdChiYXNlLmdldExpbmtUb1ByZWRlY2Vzc29yKCkpCi0JCQkJLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJd29ya09yZGVycy5hZGQoVG5nVXRpbC5jb3B5KChXb3JrT3JkZXIpIGl0ZXIubmV4dCgpKSk7Ci0JCX0KLQotCQlhY3QuZ2V0TGlua1RvUHJlZGVjZXNzb3IoKS5hZGRBbGwod29ya09yZGVycyk7Ci0JCXJldHVybiBhY3Q7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBsaXN0IG9mIGVsZW1lbnRzIHNwZWNpZmllZCBpbiBjbGFzcyAidHlwZSIgZWcuKFJvbGVEZXNjcmlwdG9yLAotCSAqIFdvcmtQcm9kdWN0RGVzY3JpcHRvciIgdW50aWwgdGhlIHJvb3QgbGV2ZWwuCi0JICogCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiBAcGFyYW0gdHlwZQotCSAqIEBwYXJhbSBpdGVtcwotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3QgZ2V0RWxlbWVudHNJblNjb3BlKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LAotCQkJQnJlYWtkb3duRWxlbWVudCBlbGVtZW50LCBDbGFzcyB0eXBlLCBMaXN0IGl0ZW1zKSB7Ci0JCS8vIGdldCBjaGlsZHJlbiBmb3IgYWN0aXZpdHkKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyIGl0ZW1Qcm92aWRlciA9IChJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIpIGFkYXB0ZXJGYWN0b3J5Ci0JCQkJLmFkYXB0KGVsZW1lbnQsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCUNvbGxlY3Rpb24gY2hpbGRyZW4gPSAoKEFjdGl2aXR5KSBlbGVtZW50KS5nZXRCcmVha2Rvd25FbGVtZW50cygpOwotCQkJZm9yIChJdGVyYXRvciBpdG9yID0gY2hpbGRyZW4uaXRlcmF0b3IoKTsgaXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IG9iaiA9IGl0b3IubmV4dCgpOwotCQkJCWlmICh0eXBlLmlzSW5zdGFuY2Uob2JqKSkgewotCQkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIk9iaiAtIiArIG9iaik7Ci0JCQkJCWlmICghKGl0ZW1zLmNvbnRhaW5zKG9iaikpKSB7Ci0JCQkJCQlpdGVtcy5hZGQob2JqKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCS8vIGdldCBwYXJlbnQKLQkJT2JqZWN0IGN1cnJlbnRQYXJlbnQgPSBpdGVtUHJvdmlkZXIuZ2V0UGFyZW50KGVsZW1lbnQpOwotCQlpZiAoY3VycmVudFBhcmVudCAhPSBudWxsKSB7Ci0JCQkvLyBnbyB1cAotCQkJZ2V0RWxlbWVudHNJblNjb3BlKGFkYXB0ZXJGYWN0b3J5LAotCQkJCQkoQnJlYWtkb3duRWxlbWVudCkgY3VycmVudFBhcmVudCwgdHlwZSwgaXRlbXMpOwotCQl9Ci0JCXJldHVybiBpdGVtczsKLQotCX0KLQotCS8qKgotCSAqIEdldCByb2xlcyBmcm9tIHJvbGVkZXNjcmlwdG9yIGxpc3QKLQkgKiAKLQkgKiBAcGFyYW0gcm9sZURlc2NMaXN0Ci0JICogQHJldHVybgotCSAqLwotCi0JcHVibGljIHN0YXRpYyBMaXN0IGdldFJvbGVzKExpc3Qgcm9sZURlc2NMaXN0KSB7Ci0JCUxpc3Qgcm9sZUxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWlmIChyb2xlRGVzY0xpc3QgIT0gbnVsbCkgewotCQkJZm9yIChJdGVyYXRvciBpdG9yID0gcm9sZURlc2NMaXN0Lml0ZXJhdG9yKCk7IGl0b3IuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBvYmogPSBpdG9yLm5leHQoKTsKLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgUm9sZURlc2NyaXB0b3IpIHsKLQkJCQkJUm9sZSByb2xlID0gKChSb2xlRGVzY3JpcHRvcikgb2JqKS5nZXRSb2xlKCk7Ci0JCQkJCXJvbGVMaXN0LmFkZChyb2xlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJvbGVMaXN0OwotCX0KLQotCS8qKgotCSAqIEdldCBhc3NvY2lhdGVkIG1ldGhvZCBlbGVtZW50IGxpc3QKLQkgKiAKLQkgKiBAcGFyYW0gZGVzY3JpcHRvckxpc3QKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0IGdldEFzc29jaWF0ZWRFbGVtZW50TGlzdChMaXN0IGRlc2NyaXB0b3JMaXN0KSB7Ci0JCUxpc3QgZWxlbWVudExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWlmIChkZXNjcmlwdG9yTGlzdCAhPSBudWxsKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0b3IgPSBkZXNjcmlwdG9yTGlzdC5pdGVyYXRvcigpOyBpdG9yLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3Qgb2JqID0gaXRvci5uZXh0KCk7Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIERlc2NyaXB0b3IpIHsKLQkJCQkJTWV0aG9kRWxlbWVudCBlbGVtZW50ID0gZ2V0QXNzb2NpYXRlZEVsZW1lbnQoKERlc2NyaXB0b3IpIG9iaik7Ci0JCQkJCWVsZW1lbnRMaXN0LmFkZChlbGVtZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVsZW1lbnRMaXN0OwotCX0KLQotCXB1YmxpYyBzdGF0aWMgQnJlYWtkb3duRWxlbWVudCBnZXRUb3BCcmVha2Rvd25FbGVtZW50KFByb2Nlc3NDb21wb25lbnQgcGMpIHsKLQkJQnJlYWtkb3duRWxlbWVudCBiZSA9IHBjLmdldFByb2Nlc3MoKTsKLQkJaWYgKGJlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJT2JqZWN0IGFkYXB0ZXIgPSBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCS5nZXRXQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpLmFkYXB0KGJlLAotCQkJCQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJaWYgKCEoYWRhcHRlciBpbnN0YW5jZW9mIElCU0l0ZW1Qcm92aWRlcikpCi0JCQlyZXR1cm4gYmU7Ci0JCUlCU0l0ZW1Qcm92aWRlciBpdGVtUHJvdmlkZXIgPSAoSUJTSXRlbVByb3ZpZGVyKSBhZGFwdGVyOwotCQlpZiAoaXRlbVByb3ZpZGVyLmdldFRvcEl0ZW0oKSA9PSBudWxsKSB7Ci0JCQlpdGVtUHJvdmlkZXIuc2V0VG9wSXRlbShiZSk7Ci0JCQlpdGVtUHJvdmlkZXIgPSAoSUJTSXRlbVByb3ZpZGVyKSBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkuZ2V0T0JTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKS5hZGFwdChiZSwKLQkJCQkJCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkJaXRlbVByb3ZpZGVyLnNldFRvcEl0ZW0oYmUpOwotCQkJaXRlbVByb3ZpZGVyID0gKElCU0l0ZW1Qcm92aWRlcikgVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJLmdldFBCU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkuYWRhcHQoYmUsCi0JCQkJCQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCWl0ZW1Qcm92aWRlci5zZXRUb3BJdGVtKGJlKTsKLQkJCWl0ZW1Qcm92aWRlciA9IChJQlNJdGVtUHJvdmlkZXIpIFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCS5nZXRQcm9jZXNzQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpLmFkYXB0KGJlLAotCQkJCQkJCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCQlpdGVtUHJvdmlkZXIuc2V0VG9wSXRlbShiZSk7Ci0JCX0KLQkJUHJvY2Vzc1V0aWwudXBkYXRlSURzKGJlLCBiZSk7Ci0JCXJldHVybiBiZTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHVwZGF0ZUlEcyhFT2JqZWN0IHRvcEFjdCwgT2JqZWN0IG5ld09iaikgewotCQlJdGVtUHJvdmlkZXJBZGFwdGVyIGFkYXB0ZXIgPSAoSXRlbVByb3ZpZGVyQWRhcHRlcikgVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkuZ2V0V0JTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKS5hZGFwdCh0b3BBY3QsCi0JCQkJCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQlBZGFwdGVyRmFjdG9yeSBmYWN0b3J5ID0gVG5nVXRpbC5nZXRCZXN0QWRhcHRlckZhY3RvcnkoYWRhcHRlcgotCQkJCS5nZXRBZGFwdGVyRmFjdG9yeSgpKTsKLQkJYm9vbGVhbiB1cGRhdGVXaG9sZVByb2Nlc3MgPSB0b3BBY3QgPT0gbmV3T2JqCi0JCQkJJiYgdG9wQWN0IGluc3RhbmNlb2YgUHJvY2VzczsKLQkJaWYgKHVwZGF0ZVdob2xlUHJvY2VzcykgewotCQkJUHJvY2VzcyBwcm9jID0gKFByb2Nlc3MpIHRvcEFjdDsKLQkJCXVwZGF0ZUlEcyhmYWN0b3J5LCBwcm9jKTsKLQkJCXJlZnJlc2hWaWV3ZXIoZmFjdG9yeSwgcHJvYyk7Ci0JCX0gZWxzZSB7Ci0JCQlBZGFwdGVyRmFjdG9yeVRyZWVJdGVyYXRvciBpdGVyID0gbmV3IEFkYXB0ZXJGYWN0b3J5VHJlZUl0ZXJhdG9yKAotCQkJCQlmYWN0b3J5LCB0b3BBY3QpOwotCQkJdXBkYXRlSURzKGZhY3RvcnksIGl0ZXIsIG5ld09iaik7Ci0JCX0KLQotCQkvLyBObyBtb3JlIElEIGNvbHVtbiBpbiBUQlMgYW5kIFdQQlMKLQkJLy8KLQkJLy8gYWRhcHRlciA9IChJdGVtUHJvdmlkZXJBZGFwdGVyKQotCQkvLyBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRS5nZXRPQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpLmFkYXB0KHRvcEFjdCwKLQkJLy8gSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJLy8gZmFjdG9yeSA9IFRuZ1V0aWwuZ2V0QmVzdEFkYXB0ZXJGYWN0b3J5KGFkYXB0ZXIuZ2V0QWRhcHRlckZhY3RvcnkoKSk7Ci0JCS8vIGl0ZXIgPSBuZXcgQWRhcHRlckZhY3RvcnlUcmVlSXRlcmF0b3IoZmFjdG9yeSwgdG9wQWN0KTsKLQkJLy8gUHJvY2Vzc1V0aWwudXBkYXRlSURzKGZhY3RvcnksIGl0ZXIsIG5ld09iaik7Ci0JCS8vIGFkYXB0ZXIgPSAoSXRlbVByb3ZpZGVyQWRhcHRlcikKLQkJLy8gVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UuZ2V0UEJTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKS5hZGFwdCh0b3BBY3QsCi0JCS8vIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCS8vIGZhY3RvcnkgPSBUbmdVdGlsLmdldEJlc3RBZGFwdGVyRmFjdG9yeShhZGFwdGVyLmdldEFkYXB0ZXJGYWN0b3J5KCkpOwotCQkvLyBpdGVyID0gbmV3IEFkYXB0ZXJGYWN0b3J5VHJlZUl0ZXJhdG9yKGZhY3RvcnksIHRvcEFjdCk7Ci0JCS8vIFByb2Nlc3NVdGlsLnVwZGF0ZUlEcyhmYWN0b3J5LCBpdGVyLCBuZXdPYmopOwotCi0JCWFkYXB0ZXIgPSAoSXRlbVByb3ZpZGVyQWRhcHRlcikgVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkuZ2V0UHJvY2Vzc0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKS5hZGFwdCh0b3BBY3QsCi0JCQkJCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQlmYWN0b3J5ID0gVG5nVXRpbC5nZXRCZXN0QWRhcHRlckZhY3RvcnkoYWRhcHRlci5nZXRBZGFwdGVyRmFjdG9yeSgpKTsKLQkJaWYgKHVwZGF0ZVdob2xlUHJvY2VzcykgewotCQkJUHJvY2VzcyBwcm9jID0gKFByb2Nlc3MpIHRvcEFjdDsKLQkJCXVwZGF0ZUlEcyhmYWN0b3J5LCBwcm9jKTsKLQkJCXJlZnJlc2hWaWV3ZXIoZmFjdG9yeSwgcHJvYyk7Ci0JCX0gZWxzZSB7Ci0JCQlBZGFwdGVyRmFjdG9yeVRyZWVJdGVyYXRvciBpdGVyID0gbmV3IEFkYXB0ZXJGYWN0b3J5VHJlZUl0ZXJhdG9yKAotCQkJCQlmYWN0b3J5LCB0b3BBY3QpOwotCQkJdXBkYXRlSURzKGZhY3RvcnksIGl0ZXIsIG5ld09iaik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gaXRlcgotCSAqIEBwYXJhbSBuZXdPYmoKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgdXBkYXRlSURzKEFkYXB0ZXJGYWN0b3J5IGZhY3RvcnksCi0JCQlBZGFwdGVyRmFjdG9yeVRyZWVJdGVyYXRvciBpdGVyLCBPYmplY3QgbmV3T2JqKSB7Ci0JCWludCBpZCA9IDA7Ci0JCU9iamVjdCBvYmo7Ci0JCU1hcCBjaGFuZ2VNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCW9iaiA9IGl0ZXIubmV4dCgpOwotCQkJSUJTSXRlbVByb3ZpZGVyIGl0ZW1Qcm92aWRlciA9IChJQlNJdGVtUHJvdmlkZXIpIGZhY3RvcnkuYWRhcHQob2JqLAotCQkJCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkJaXRlbVByb3ZpZGVyLnNldElkKGlkKyspOwotCQkJY2hhbmdlTWFwLnB1dChvYmosIGl0ZW1Qcm92aWRlcik7Ci0JCX0KLQotCQkvLyByZWZyZXNoIHRoZSBsYWJlbAotCQkvLwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gY2hhbmdlTWFwLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IKLQkJCQkuaGFzTmV4dCgpOykgewotCQkJTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSkgaXRlcmF0b3IubmV4dCgpOwotCQkJSUNoYW5nZU5vdGlmaWVyIGFkYXB0ZXIgPSAoSUNoYW5nZU5vdGlmaWVyKSBlbnRyeS5nZXRWYWx1ZSgpOwotCQkJb2JqID0gZW50cnkuZ2V0S2V5KCk7Ci0JCQlhZGFwdGVyLmZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24oCi0JCQkJCW5ldyBOb3RpZmljYXRpb25JbXBsKE5vdGlmaWNhdGlvbi5TRVQsIG9iaiwgb2JqKSwgb2JqLAotCQkJCQlmYWxzZSwgdHJ1ZSkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIGRlc2NyaXB0b3IKLQkgKiBAcGFyYW0gb2JqCi0JICogQHJldHVybgotCSAqIEBzZWUgI2NoZWNrRGVzY3JpcHRvclJlZmVyZW5jZXMoQ29sbGVjdGlvbiwgRGVzY3JpcHRvcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY2hlY2tEZXNjcmlwdG9yUmVmZXJlbmNlcyhEZXNjcmlwdG9yIGRlc2NyaXB0b3IsCi0JCQlEZXNjcmlwdG9yIG9iaikgewotCQlDb2xsZWN0aW9uIGRlc2NyaXB0b3JzID0gZGVzY3JpcHRvciAhPSBudWxsID8gQ29sbGVjdGlvbnMKLQkJCQkuc2luZ2xldG9uKGRlc2NyaXB0b3IpIDogQ29sbGVjdGlvbnMuRU1QVFlfU0VUOwotCQlyZXR1cm4gY2hlY2tEZXNjcmlwdG9yUmVmZXJlbmNlcyhkZXNjcmlwdG9ycywgb2JqKTsKLQl9Ci0KLQkKLQkvKioKLQkgKiBDaGVjayB3aGV0aGVyIHRoZXJlIGFyZSBhbnkgcmVmZXJlbmNlcyBvZiB0aGUgb2JqZWN0ICJvYmoiLiBJZiByZWZlcmVuY2VzCi0JICogZXhpc3QgaW4gYW55IGRlc2NyaXB0b3IgaW4gPGNvZGU+ZGVzY3JpcHRvcnM8L2NvZGU+LCBpZ25vcmUgaXQuCi0JICogCi0JICogQHBhcmFtIGRlc2NyaXB0b3JzCi0JICogQHBhcmFtIG9iagotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY2hlY2tEZXNjcmlwdG9yUmVmZXJlbmNlcyhDb2xsZWN0aW9uIGRlc2NyaXB0b3JzLAotCQkJRGVzY3JpcHRvciBvYmopIHsKLQkJYm9vbGVhbiByZWZlcmVuY2VzRXhpc3RzID0gZmFsc2U7Ci0KLQkJaWYgKG9iaiBpbnN0YW5jZW9mIFJvbGVEZXNjcmlwdG9yKSB7Ci0JCQlSb2xlRGVzY3JpcHRvciByZWZPYmplY3QgPSAoUm9sZURlc2NyaXB0b3IpIG9iajsKLQkJCUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWxpc3QuYWRkQWxsKEFzc29jaWF0aW9uSGVscGVyLmdldEFzc2lzdGVkVGFza0Rlc2NyaXB0b3JzKHJlZk9iamVjdCkpOwotCQkJbGlzdC5hZGRBbGwocmVmT2JqZWN0LmdldFJlc3BvbnNpYmxlRm9yKCkpOwotCQkJbGlzdC5hZGRBbGwoQXNzb2NpYXRpb25IZWxwZXIuZ2V0QWRkaXRpb25hbFRhc2tEZXNjcmlwdG9ycyhyZWZPYmplY3QpKTsKLQkJCWxpc3QuYWRkQWxsKEFzc29jaWF0aW9uSGVscGVyLmdldFByaW1hcnlUYXNrRGVzY3JpcHRvcnMocmVmT2JqZWN0KSk7Ci0JCQlsaXN0LmFkZEFsbChBc3NvY2lhdGlvbkhlbHBlci5nZXRUZWFtUHJvZmlsZXMocmVmT2JqZWN0KSk7Ci0KLQkJCWZvciAoSXRlcmF0b3IgcmVmSXRvciA9IGxpc3QuaXRlcmF0b3IoKTsgcmVmSXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IHJlZkl0b3JPYmplY3QgPSAoT2JqZWN0KSByZWZJdG9yLm5leHQoKTsKLQkJCQlpZiAoKChyZWZJdG9yT2JqZWN0IGluc3RhbmNlb2YgRGVzY3JpcHRvcikgJiYgIWRlc2NyaXB0b3JzCi0JCQkJCQkuY29udGFpbnMocmVmSXRvck9iamVjdCkpCi0JCQkJCQl8fCAocmVmSXRvck9iamVjdCBpbnN0YW5jZW9mIFRlYW1Qcm9maWxlKSkgewotCQkJCQlyZWZlcmVuY2VzRXhpc3RzID0gdHJ1ZTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCi0JCQl9Ci0JCX0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yKSB7CQkKLQkJCXJldHVybiBjaGVja1dvcmtQcm9kdWN0RGVzY3JpcHRvclJlZmVyZW5jZXMoZGVzY3JpcHRvcnMsIChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIG9iaiwgZmFsc2UsIC0xKTsKLQkJfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBUYXNrRGVzY3JpcHRvcikgewotCQkJVGFza0Rlc2NyaXB0b3IgcmVmT2JqZWN0ID0gKFRhc2tEZXNjcmlwdG9yKSBvYmo7Ci0JCQlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlsaXN0LmFkZEFsbChyZWZPYmplY3QuZ2V0QWRkaXRpb25hbGx5UGVyZm9ybWVkQnkoKSk7Ci0JCQlsaXN0LmFkZEFsbChyZWZPYmplY3QuZ2V0QXNzaXN0ZWRCeSgpKTsKLQkJCWxpc3QuYWRkQWxsKHJlZk9iamVjdC5nZXRFeHRlcm5hbElucHV0KCkpOwotCQkJbGlzdC5hZGRBbGwocmVmT2JqZWN0LmdldE1hbmRhdG9yeUlucHV0KCkpOwotCQkJbGlzdC5hZGRBbGwocmVmT2JqZWN0LmdldE9wdGlvbmFsSW5wdXQoKSk7Ci0JCQlsaXN0LmFkZEFsbChyZWZPYmplY3QuZ2V0T3V0cHV0KCkpOwotCQkJbGlzdC5hZGRBbGwocmVmT2JqZWN0LmdldFBlcmZvcm1lZFByaW1hcmlseUJ5KCkpOwotCi0JCQlmb3IgKEl0ZXJhdG9yIHJlZkl0b3IgPSBsaXN0Lml0ZXJhdG9yKCk7IHJlZkl0b3IuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCByZWZJdG9yT2JqZWN0ID0gKE9iamVjdCkgcmVmSXRvci5uZXh0KCk7Ci0JCQkJaWYgKChyZWZJdG9yT2JqZWN0IGluc3RhbmNlb2YgRGVzY3JpcHRvcikKLQkJCQkJCSYmICFkZXNjcmlwdG9ycy5jb250YWlucyhyZWZJdG9yT2JqZWN0KSkgewotCQkJCQlyZWZlcmVuY2VzRXhpc3RzID0gdHJ1ZTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHJlZmVyZW5jZXNFeGlzdHM7Ci0JfQotCQotCS8qKgotCSAqIENoZWNrIHdoZXRoZXIgdGhlcmUgYXJlIGFueSByZWZlcmVuY2VzIG9mIHRoZSB3b3JrUHJvZHVjdGRlc2NyaXB0b3Igb2JqZWN0ICJyZWZPYmplY3QuIAotCSAqIElmIHJlZmVyZW5jZXMgZXhpc3QgaW4gYW55IGRlc2NyaXB0b3IgaW4gPGNvZGU+ZGVzY3JpcHRvcnM8L2NvZGU+LCBpZ25vcmUgaXQuCi0JICogCi0JICogQHBhcmFtIGRlc2NyaXB0b3JzCi0JICogQHBhcmFtIHJlZk9iamVjdAotCSAqIEBwYXJhbSByZW1vdmVSZWxhdGlvbiAtIGZsYWcgdG8gaW5kaWNhdGUgd2hldGhlciB3ZSdyZSByZW1vdmluZyByZWxhdGlvbgotCSAqICAgICBCeSBkZWZhdWx0IHRoaXMgc2hvdWxkIGJlIGZhbHNlLiAKLQkgKiAgICAgVGhpcyBpcyBvbmx5IGFwcGxpY2FibGUgaWYgeW91IGFyZSBjb21pbmcgZnJvbSBwcm9wZXJ0aWVzIHZpZXcuIAotCSAqICAgICBlZy4gcmVtb3ZpbmcgcmVsYXRpb25zaGlwIG9mIHdvcmsgcHJvZHVjdCBkZXNjcmlwdG9yIHRvIHRhc2sgZGVzY3JpcHRvciAKLQkgKiBAcGFyYW0gZmVhdHVyZUlECi0JICogCQlUaGlzIGlzIG9ubHkgYXBwbGljYWJsZSBpZiAicmVtb3ZlUmVsYXRpb24iIGlzIHRydWUuIFlvdSBuZWVkIHRvIGdpdmUgZmVhdHVyZUlECi0JICogCQlmb3Igd2hpY2ggcmVsYXRpb24geW91IGFyZSByZW1vdmluZy4KLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNoZWNrV29ya1Byb2R1Y3REZXNjcmlwdG9yUmVmZXJlbmNlcygKLQkJCUNvbGxlY3Rpb24gZGVzY3JpcHRvcnMsIFdvcmtQcm9kdWN0RGVzY3JpcHRvciByZWZPYmplY3QsIGJvb2xlYW4gcmVtb3ZlUmVsYXRpb24sIGludCBmZWF0dXJlSUQpIHsKLQkJCi0JCUxpc3QgYWxsT2JqZWN0cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJYWxsT2JqZWN0cy5hZGQocmVmT2JqZWN0KTsKLQotCQlBY3Rpdml0eSBwYXJlbnRBY3Rpdml0eSA9IFVtYVV0aWwuZ2V0UGFyZW50QWN0aXZpdHkocmVmT2JqZWN0KTsKLQkJLy8gY2hlY2sgd2hldGhlciByZWZlcmVuY2Ugb2JqZWN0IGluc3RhbmNlIG9mIGFydGlmYWN0Ci0JCWlmIChyZWZPYmplY3QuZ2V0V29ya1Byb2R1Y3QoKSBpbnN0YW5jZW9mIEFydGlmYWN0KSB7Ci0JCQlMaXN0IGNvbnRhaW5lZEFydGlmYWN0cyA9ICgoQXJ0aWZhY3QpIHJlZk9iamVjdC5nZXRXb3JrUHJvZHVjdCgpKQotCQkJCQkuZ2V0Q29udGFpbmVkQXJ0aWZhY3RzKCk7Ci0KLQkJCUxpc3QgY29udGFpbmVkV3BEZXNjTGlzdCA9IGdldFdwRGVzY0ZvckFydGlmYWN0cygKLQkJCQkJY29udGFpbmVkQXJ0aWZhY3RzLCBwYXJlbnRBY3Rpdml0eSk7Ci0KLQkJCUxpc3QgY29udGFpbmVyQXJ0aWZhY3RzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJQXJ0aWZhY3QgYXJ0aWZhY3QgPSAoKEFydGlmYWN0KSByZWZPYmplY3QuZ2V0V29ya1Byb2R1Y3QoKSkKLQkJCQkJLmdldENvbnRhaW5lckFydGlmYWN0KCk7Ci0JCQl3aGlsZSAoYXJ0aWZhY3QgIT0gbnVsbCkgewotCQkJCWNvbnRhaW5lckFydGlmYWN0cy5hZGQoYXJ0aWZhY3QpOwotCQkJCWFydGlmYWN0ID0gKChBcnRpZmFjdCkgYXJ0aWZhY3QpLmdldENvbnRhaW5lckFydGlmYWN0KCk7Ci0JCQl9Ci0JCQlMaXN0IGNvbnRhaW5lcldwRGVzY0xpc3QgPSBnZXRXcERlc2NGb3JBcnRpZmFjdHMoCi0JCQkJCWNvbnRhaW5lckFydGlmYWN0cywgcGFyZW50QWN0aXZpdHkpOwotCi0JCQlhbGxPYmplY3RzLmFkZEFsbChjb250YWluZWRXcERlc2NMaXN0KTsKLQkJCWFsbE9iamVjdHMuYWRkQWxsKGNvbnRhaW5lcldwRGVzY0xpc3QpOwotCQl9Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhbGxPYmplY3RzLnNpemUoKTsgaSsrKSB7Ci0JCQlXb3JrUHJvZHVjdERlc2NyaXB0b3Igd3BPYmogPSAoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBhbGxPYmplY3RzCi0JCQkJCS5nZXQoaSk7Ci0KLQkJCUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWxpc3QuYWRkQWxsKHdwT2JqLmdldEltcGFjdGVkQnkoKSk7Ci0JCQlsaXN0LmFkZEFsbCh3cE9iai5nZXRJbXBhY3RzKCkpOwotCQkJbGlzdC5hZGRBbGwoQXNzb2NpYXRpb25IZWxwZXIuZ2V0UmVzcG9uc2libGVSb2xlRGVzY3JpcHRvcnMod3BPYmopKTsKLQkJCWxpc3QuYWRkQWxsKHdwT2JqLmdldERlbGl2ZXJhYmxlUGFydHMoKSk7Ci0KLQkJCUxpc3QgaW5wdXRMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJaW5wdXRMaXN0LmFkZEFsbChBc3NvY2lhdGlvbkhlbHBlci5nZXRFeHRlcm5hbElucHV0VG8od3BPYmopKTsKLQkJCWlucHV0TGlzdC5hZGRBbGwoQXNzb2NpYXRpb25IZWxwZXIuZ2V0TWFuZGF0b3J5SW5wdXRUbyh3cE9iaikpOwotCQkJaW5wdXRMaXN0LmFkZEFsbChBc3NvY2lhdGlvbkhlbHBlci5nZXRPcHRpb25hbElucHV0VG8od3BPYmopKTsKLQotCQkJTGlzdCBvdXRwdXRMaXN0ID0gQXNzb2NpYXRpb25IZWxwZXIuZ2V0T3V0cHV0RnJvbSh3cE9iaik7Ci0JCQlpZiAocmVtb3ZlUmVsYXRpb24pCi0JCQl7Ci0JCQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19FWFRFUk5BTF9JTlBVVDoKLQkJCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19NQU5EQVRPUllfSU5QVVQ6Ci0JCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fT1BUSU9OQUxfSU5QVVQ6Ci0JCQkJCWlmIChvdXRwdXRMaXN0LmNvbnRhaW5zQWxsKGRlc2NyaXB0b3JzKSkKLQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQlicmVhazsKLQkJCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19PVVRQVVQgOgkJCQkKLQkJCQkJaWYgKGlucHV0TGlzdC5jb250YWluc0FsbChkZXNjcmlwdG9ycykpCi0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCWxpc3QuYWRkQWxsKGlucHV0TGlzdCk7Ci0JCQlsaXN0LmFkZEFsbChvdXRwdXRMaXN0KTsKLQkJCQotCQkJZm9yIChJdGVyYXRvciByZWZJdG9yID0gbGlzdC5pdGVyYXRvcigpOyByZWZJdG9yLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3QgcmVmSXRvck9iamVjdCA9IChPYmplY3QpIHJlZkl0b3IubmV4dCgpOwotCQkJCWlmICgocmVmSXRvck9iamVjdCBpbnN0YW5jZW9mIERlc2NyaXB0b3IpCi0JCQkJCQkmJiAhZGVzY3JpcHRvcnMuY29udGFpbnMocmVmSXRvck9iamVjdCkpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkKLQkvKioKLQkgKiBSZXR1cm4gbGlzdCBvZiBjb3JyZXNwb25kaW5nIHdvcmsgcHJvZHVjdCBkZXNjcmlwdG9ycyBmb3IgYXJ0aWZhY3RzCi0JICogQHBhcmFtIGFydGlmYWN0cwotCSAqIEBwYXJhbSBwYXJlbnRBY3Rpdml0eQotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3QgZ2V0V3BEZXNjRm9yQXJ0aWZhY3RzKExpc3QgYXJ0aWZhY3RzLAotCQkJQWN0aXZpdHkgcGFyZW50QWN0aXZpdHkpIHsKLQkJTGlzdCB3cERlc2NMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGFydGlmYWN0cy5zaXplKCk7IGkrKykgewotCQkJQXJ0aWZhY3QgYXJ0aWZhY3QgPSAoQXJ0aWZhY3QpIGFydGlmYWN0cy5nZXQoaSk7Ci0JCQlpZiAocGFyZW50QWN0aXZpdHkgIT0gbnVsbCkgewotCQkJCUxpc3QgYnJFbGVtZW50cyA9IHBhcmVudEFjdGl2aXR5LmdldEJyZWFrZG93bkVsZW1lbnRzKCk7Ci0KLQkJCQlmb3IgKEl0ZXJhdG9yIGl0b3IgPSBickVsZW1lbnRzLml0ZXJhdG9yKCk7IGl0b3IuaGFzTmV4dCgpOykgewotCQkJCQlPYmplY3QgYnJPYmogPSAoT2JqZWN0KSBpdG9yLm5leHQoKTsKLQkJCQkJaWYgKGJyT2JqIGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yKSB7Ci0JCQkJCQlXb3JrUHJvZHVjdERlc2NyaXB0b3Igd3BEZXNjID0gKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgYnJPYmo7Ci0JCQkJCQlpZiAod3BEZXNjLmdldFdvcmtQcm9kdWN0KCkgaW5zdGFuY2VvZiBBcnRpZmFjdCkgewotCQkJCQkJCWlmICh3cERlc2MuZ2V0V29ya1Byb2R1Y3QoKS5lcXVhbHMoYXJ0aWZhY3QpKQotCQkJCQkJCQl3cERlc2NMaXN0LmFkZCh3cERlc2MpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiB3cERlc2NMaXN0OwotCX0KLQotCXB1YmxpYyBzdGF0aWMgQ29tcG9zaXRlUm9sZSBjcmVhdGVDb21wb3NpdGVSb2xlKENvbXBvc2l0ZVJvbGUgb2JqKSB7Ci0JCUNvbXBvc2l0ZVJvbGUgY29tcFJvbGUgPSBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVDb21wb3NpdGVSb2xlKCk7Ci0JCWNvbXBSb2xlLmdldEFnZ3JlZ2F0ZWRSb2xlcygpLmFkZEFsbChvYmouZ2V0QWdncmVnYXRlZFJvbGVzKCkpOwotCi0JCVN0cmluZyBwcmVzZW50YXRpb25OYW1lID0gb2JqLmdldFByZXNlbnRhdGlvbk5hbWUoKTsKLQkJY29tcFJvbGUuc2V0TmFtZShvYmouZ2V0TmFtZSgpKTsKLQkJY29tcFJvbGUuc2V0UHJlc2VudGF0aW9uTmFtZShTdHJVdGlsLmlzQmxhbmsocHJlc2VudGF0aW9uTmFtZSkgPyBvYmoKLQkJCQkuZ2V0TmFtZSgpIDogcHJlc2VudGF0aW9uTmFtZSk7Ci0JCXJldHVybiBjb21wUm9sZTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgYWRkVGFza1RvQWN0aXZpdHkoVGFzayB0YXNrLCBBY3Rpdml0eSBhY3QpIHsKLQkJV0JTRHJvcENvbW1hbmQgY21kID0gbmV3IFdCU0Ryb3BDb21tYW5kKGFjdCwgQ29sbGVjdGlvbnMKLQkJCQkuc2luZ2xldG9uTGlzdCh0YXNrKSk7Ci0JCUJTRHJvcENvbW1hbmQuSUV4ZWN1dG9yIGV4ZWN1dG9yID0gY21kLmdldEV4ZWN1dG9yKCk7Ci0JCWlmIChleGVjdXRvci5wcmVFeGVjdXRlKCkpIHsKLQkJCWV4ZWN1dG9yLmRvRXhjZWN1dGUoKTsKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBoYXNQcm9jZXNzTm90T2ZUeXBlKFByb2Nlc3NQYWNrYWdlIHBrZywKLQkJCUVDbGFzcyBwcm9jZXNzVHlwZSkgewotCQlpZiAocGtnIGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkgewotCQkJUHJvY2VzcyBwcm9jID0gKChQcm9jZXNzQ29tcG9uZW50KSBwa2cpLmdldFByb2Nlc3MoKTsKLQkJCWlmIChwcm9jICE9IG51bGwgJiYgIXByb2Nlc3NUeXBlLmlzSW5zdGFuY2UocHJvYykpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gcGtnLmdldENoaWxkUGFja2FnZXMoKS5pdGVyYXRvcigpOyBpdGVyYXRvcgotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgY2hpbGRQa2cgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAoY2hpbGRQa2cgaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50KSB7Ci0JCQkJUHJvY2VzcyBwcm9jID0gKChQcm9jZXNzQ29tcG9uZW50KSBjaGlsZFBrZykuZ2V0UHJvY2VzcygpOwotCQkJCWlmIChwcm9jICE9IG51bGwgJiYgIXByb2Nlc3NUeXBlLmlzSW5zdGFuY2UocHJvYykpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfSBlbHNlIGlmIChjaGlsZFBrZyBpbnN0YW5jZW9mIFByb2Nlc3NQYWNrYWdlKSB7Ci0JCQkJaWYgKGhhc1Byb2Nlc3NOb3RPZlR5cGUoKFByb2Nlc3NQYWNrYWdlKSBjaGlsZFBrZywgcHJvY2Vzc1R5cGUpKSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogRmluZCBjb3JyZXNwb2Rpbmcgcm9sZURlc2NyaXB0b3IgaW4gdGVhbSBzaW5jZSB3ZSBtYWludGFpbiB0d28gcm9sZQotCSAqIGRlc2NyaXB0b3IgZm9yIHRoZSBzYW1lIHJvbGUKLQkgKiAKLQkgKiBAcGFyYW0gdGVhbQotCSAqIEBwYXJhbSByb2xlRGVzYwotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9iamVjdCBmaW5kUm9sZURlc2NyaXB0b3IoVGVhbVByb2ZpbGUgdGVhbSwKLQkJCVJvbGVEZXNjcmlwdG9yIHJvbGVEZXNjKSB7Ci0JCUxpc3QgdGVhbVJvbGVzID0gdGVhbS5nZXRUZWFtUm9sZXMoKTsKLQotCQlmb3IgKEl0ZXJhdG9yIGl0b3IgPSB0ZWFtUm9sZXMuaXRlcmF0b3IoKTsgaXRvci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgaXRvck9iamVjdCA9IGl0b3IubmV4dCgpOwotCQkJaWYgKHJvbGVEZXNjIGluc3RhbmNlb2YgQ29tcG9zaXRlUm9sZSkgewotCQkJCWlmIChpdG9yT2JqZWN0IGluc3RhbmNlb2YgQ29tcG9zaXRlUm9sZSkgewotCQkJCQlMaXN0IGZpcnN0T2JqZWN0QWdnUm9sZXMgPSAoKENvbXBvc2l0ZVJvbGUpIHJvbGVEZXNjKQotCQkJCQkJCS5nZXRBZ2dyZWdhdGVkUm9sZXMoKTsKLQkJCQkJTGlzdCBzZWNvbmRPYmplY3RBZ2dSb2xlcyA9ICgoQ29tcG9zaXRlUm9sZSkgaXRvck9iamVjdCkKLQkJCQkJCQkuZ2V0QWdncmVnYXRlZFJvbGVzKCk7Ci0JCQkJCWlmIChmaXJzdE9iamVjdEFnZ1JvbGVzLmVxdWFscyhzZWNvbmRPYmplY3RBZ2dSb2xlcykpIHsKLQkJCQkJCXJldHVybiBpdG9yT2JqZWN0OwotCQkJCQl9Ci0JCQkJfQotCQkJfSBlbHNlIGlmIChyb2xlRGVzYyBpbnN0YW5jZW9mIFJvbGVEZXNjcmlwdG9yKSB7Ci0JCQkJaWYgKChpdG9yT2JqZWN0IGluc3RhbmNlb2YgUm9sZURlc2NyaXB0b3IpCi0JCQkJCQkmJiAoIShpdG9yT2JqZWN0IGluc3RhbmNlb2YgQ29tcG9zaXRlUm9sZSkpKSB7Ci0JCQkJCU9iamVjdCBvYmpSb2xlID0gKChSb2xlRGVzY3JpcHRvcikgcm9sZURlc2MpLmdldFJvbGUoKTsKLQkJCQkJT2JqZWN0IGl0b3JPYmpSb2xlID0gKChSb2xlRGVzY3JpcHRvcikgaXRvck9iamVjdCkKLQkJCQkJCQkuZ2V0Um9sZSgpOwotCQkJCQlpZiAob2JqUm9sZS5lcXVhbHMoaXRvck9ialJvbGUpKSB7Ci0JCQkJCQlyZXR1cm4gaXRvck9iamVjdDsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBjb2x1bW5JbmRleFRvTmFtZU1hcCBmcm9tIHRoZSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBjb2x1bW4KLQkgKiBuYW1lcwotCSAqIAotCSAqIEBwYXJhbSBuZXdWYWx1ZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1hcCB0b0NvbHVtbkluZGV4VG9OYW1lTWFwKFN0cmluZyBjb2xOYW1lcykgewotCQlNYXAgY29sdW1uSW5kZXhUb05hbWVNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQlTdHJpbmdUb2tlbml6ZXIgdG9rZW5zID0gbmV3IFN0cmluZ1Rva2VuaXplcihjb2xOYW1lcywgIiwiKTsgLy8kTk9OLU5MUy0xJAotCQlpbnQgaWQgPSAwOwotCQl3aGlsZSAodG9rZW5zLmhhc01vcmVUb2tlbnMoKSkgewotCQkJU3RyaW5nIHRva2VuID0gdG9rZW5zLm5leHRUb2tlbigpOwotCQkJY29sdW1uSW5kZXhUb05hbWVNYXAucHV0KG5ldyBJbnRlZ2VyKGlkKSwgZ2V0Q29sdW1uSUQodG9rZW4pKTsKLQkJCWlkKys7Ci0JCX0KLQkJcmV0dXJuIGNvbHVtbkluZGV4VG9OYW1lTWFwOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSB0b2tlbgotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0Q29sdW1uSUQoU3RyaW5nIGNvbE5hbWUpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBJQlNJdGVtUHJvdmlkZXIuQ09MVU1OUy5sZW5ndGg7IGkrKykgewotCQkJU3RyaW5nIGNvbCA9IElCU0l0ZW1Qcm92aWRlci5DT0xVTU5TW2ldOwotCQkJaWYgKGNvbC5lcXVhbHMoY29sTmFtZSkpIHsKLQkJCQlyZXR1cm4gY29sOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8vIFRoaXMgbWV0aG9kIGlzIHVzZWQgdG8gY2hlY2sgd2hldGhlciBhbiBuZXcgZGVzY3JpcHRvciBjYW4gYmUgY3JlYXRlZCBmb3IgYSBnaXZlbiBtZXRob2QgZWxlbWVudAotCS8vIHVuZGVyIHRoZSBnaXZlbiBhY3Rpdml0eSwgY29uc2lkZXJpbmcgYWxsIGluaGVyaXRlZCBkZXNjcmlwdG9ycyBvZiB0aGUgYWN0aXZpdHkuCi0JLy8gSXQgaXMgTk9UIEVGRklDSUVOVCB0byBjb2xsZWN0IGFsbCBsaW5rZWQgZWxlbWVudHMgb2YgdGhlIGluaGVyaXRlZCBkZXNjcmlwdG9ycyBpbnRvIGEgbGlzdCBhbmQgdGhlbiBjaGVjayBpZgotCS8vIHdoZXRoZXIgdGhlIGdpdmVuIG1ldGhvZCBlbGVtZW50IGlzIGluIHRoZSBsaXN0LgotCS8vCi0JLy8gVXNlIFByb2Nlc3NDb21tYW5kVXRpbCNnZXRWYWxpZERlc2NyaXB0b3IoT2JqZWN0IG9iaiwgQWN0aXZpdHkgYWN0aXZpdHkpIGluc3RlYWQKLQkvLwotLy8JcHVibGljIHN0YXRpYyBMaXN0IGdldFZhcmlhYmlsaXR5RWxlbWVudChPYmplY3Qgb3duZXIpIHsKLS8vCQlMaXN0IGJhc2VFbGVtZW50cyA9IG5ldyBBcnJheUxpc3QoKTsKLS8vCQlpZiAob3duZXIgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotLy8JCQlBY3Rpdml0eSBhY3Rpdml0eSA9IChBY3Rpdml0eSkgb3duZXI7Ci0vLwkJCXdoaWxlICghYWN0aXZpdHkuZ2V0VmFyaWFiaWxpdHlUeXBlKCkuZXF1YWxzKAotLy8JCQkJCVZhcmlhYmlsaXR5VHlwZS5OQSkpIHsKLS8vCQkJCVZhcmlhYmlsaXR5RWxlbWVudCBlbGVtZW50ID0gYWN0aXZpdHkKLS8vCQkJCQkJLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsKLS8vCi0vLwkJCQlpZiAoKGVsZW1lbnQgIT0gbnVsbCkgJiYgKGVsZW1lbnQgaW5zdGFuY2VvZiBBY3Rpdml0eSkpIHsKLS8vCQkJCQlBY3Rpdml0eSBiYXNlQWN0aXZpdHkgPSAoQWN0aXZpdHkpIGVsZW1lbnQ7Ci0vLwotLy8JCQkJCUxpc3QgYnJlYWtkb3duRWxlbWVudHMgPSBiYXNlQWN0aXZpdHkKLS8vCQkJCQkJCS5nZXRCcmVha2Rvd25FbGVtZW50cygpOwotLy8JCQkJCWZvciAoSXRlcmF0b3IgaXRvciA9IGJyZWFrZG93bkVsZW1lbnRzLml0ZXJhdG9yKCk7IGl0b3IKLS8vCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0vLwkJCQkJCU9iamVjdCBvYmplY3QgPSBpdG9yLm5leHQoKTsKLS8vCQkJCQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIERlc2NyaXB0b3IpIHsKLS8vCQkJCQkJCU9iamVjdCBiYXNlT2JqID0gZ2V0QXNzb2NpYXRlZEVsZW1lbnQoKERlc2NyaXB0b3IpIG9iamVjdCk7Ci0vLwkJCQkJCQlpZiAoYmFzZU9iaiAhPSBudWxsKSB7Ci0vLwkJCQkJCQkJYmFzZUVsZW1lbnRzLmFkZChiYXNlT2JqKTsKLS8vCQkJCQkJCX0KLS8vCQkJCQkJfQotLy8JCQkJCX0KLS8vCi0vLwkJCQkJYWN0aXZpdHkgPSBiYXNlQWN0aXZpdHk7Ci0vLwkJCQl9Ci0vLwkJCQllbHNlIHsKLS8vCQkJCQlicmVhazsKLS8vCQkJCX0KLS8vCQkJfQotLy8JCX0KLS8vCi0vLwkJcmV0dXJuIGJhc2VFbGVtZW50czsKLS8vCX0KLQotCS8qKgotCSAqIFJlZnJlc2hlcyBwcmVkZWNlc3NvciBsaXN0IG9mIGFsbCBpdGVtIHByb3ZpZGVycyBvZiB0aGUgZ2l2ZW4gcHJvY2VzcwotCSAqIAotCSAqIEBwYXJhbSBmYWN0b3J5Ci0JICogQHBhcmFtIHByb2MKLQkgKiBAcGFyYW0gZWxlbWVudHMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVtb3ZlUHJlZGVjZXNzb3JzKEFkYXB0ZXJGYWN0b3J5IGZhY3RvcnksIFByb2Nlc3MgcHJvYywKLQkJCUxpc3QgcmVtb3ZlZEVsZW1lbnRzKSB7Ci0JCUhhc2hTZXQgZWxlbWVudHMgPSBuZXcgSGFzaFNldChyZW1vdmVkRWxlbWVudHMpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBuZXcgQWRhcHRlckZhY3RvcnlUcmVlSXRlcmF0b3IoZmFjdG9yeSwgcHJvYyk7IGl0ZXIKLQkJCQkuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IG9iaiA9IGl0ZXIubmV4dCgpOwotCQkJSUJTSXRlbVByb3ZpZGVyIGl0ZW1Qcm92aWRlciA9IChJQlNJdGVtUHJvdmlkZXIpIGZhY3RvcnkuYWRhcHQob2JqLAotCQkJCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkJaWYgKGl0ZW1Qcm92aWRlciAhPSBudWxsCi0JCQkJCSYmIFRuZ1V0aWwudW53cmFwKG9iaikgaW5zdGFuY2VvZiBXb3JrQnJlYWtkb3duRWxlbWVudCkgewotCQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBpdGVtUHJvdmlkZXIuZ2V0UHJlZGVjZXNzb3JzKCkKLQkJCQkJCS5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJCU9iamVjdCBlID0gVG5nVXRpbC51bndyYXAoaXRlcmF0b3IubmV4dCgpKTsKLQkJCQkJaWYgKGUgaW5zdGFuY2VvZiBJdGVtUHJvdmlkZXJBZGFwdGVyKSB7Ci0JCQkJCQllID0gKChJdGVtUHJvdmlkZXJBZGFwdGVyKSBlKS5nZXRUYXJnZXQoKTsKLQkJCQkJfQotCQkJCQlpZiAoZWxlbWVudHMuY29udGFpbnMoZSkpIHsKLQkJCQkJCWl0ZXJhdG9yLnJlbW92ZSgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGFkZFRvQWN0aXZpdHkoQWN0aXZpdHkgYWN0LCBCcmVha2Rvd25FbGVtZW50IGJlLCBPYmplY3RbXSBwcmV2QW5kTmV4dCkgewotCQlPYmplY3QgbmV4dCA9IHByZXZBbmROZXh0WzFdOwotCQlib29sZWFuIGFkZGVkID0gZmFsc2U7Ci0JCWlmKG5leHQgIT0gbnVsbCkgewotCQkJaW50IGlkID0gYWN0LmdldEJyZWFrZG93bkVsZW1lbnRzKCkuaW5kZXhPZihuZXh0KTsKLQkJCWlmKGlkICE9IC0xKSB7IAotCQkJCWFjdC5nZXRCcmVha2Rvd25FbGVtZW50cygpLmFkZChpZCwgYmUpOwotCQkJCWFkZGVkID0gdHJ1ZTsKLQkJCX0KLQkJfQotCQlpZighYWRkZWQpIHsKLQkJCU9iamVjdCBwcmV2ID0gcHJldkFuZE5leHRbMF07Ci0JCQlpZihwcmV2ICE9IG51bGwpIHsJCQkJCi0JCQkJaW50IGlkID0gYWN0LmdldEJyZWFrZG93bkVsZW1lbnRzKCkuaW5kZXhPZihwcmV2KTsKLQkJCQlpZihpZCAhPSAtMSkgewotCQkJCQlhY3QuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5hZGQoaWQgKyAxLCBiZSk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlhY3QuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5hZGQoYmUpOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgewotCQkJCWFjdC5nZXRCcmVha2Rvd25FbGVtZW50cygpLmFkZChiZSk7Ci0JCQl9Ci0JCX0KLQotCX0KLQkKLQkvKioKLQkgKiBMb2NhbGx5IGNvbnRyaWJ1dGVzIHRvIHRoZSBpbmhlcml0ZWQgYWN0aXZpdHkgcmVwcmVzZW50ZWQgYnkgdGhlIGdpdmVuIGFkYXB0ZXIKLQkgKiAKLQkgKiBAcGFyYW0gYWRhcHRlcgotCSAqIEBwYXJhbSBjcmVhdGVkQWN0aXZpdGllcwotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEFjdGl2aXR5IGNvbnRyaWJ1dGVUb0FjdGl2aXR5KAotCQkJQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIgYWRhcHRlciwgTGlzdCBjcmVhdGVkQWN0aXZpdGllcykgewotCQlPYmplY3QgcGFyZW50ID0gYWRhcHRlci5nZXRQYXJlbnQobnVsbCk7Ci0JCU9iamVjdFtdIHByZXZBbmROZXh0ID0gUHJvY2Vzc1V0aWwKLQkJCQkuZ2V0UHJldmlvdXNBbmROZXh0KGFkYXB0ZXIpOwotCQlpZiAocGFyZW50IGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIHsKLQkJCXBhcmVudCA9IGNvbnRyaWJ1dGVUb0FjdGl2aXR5KAotCQkJCQkoQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIHBhcmVudCwKLQkJCQkJY3JlYXRlZEFjdGl2aXRpZXMpOwotCQl9Ci0JCUFjdGl2aXR5IGFjdCA9IFByb2Nlc3NVdGlsLmdlbmVyaWFsaXplKGFkYXB0ZXIsCi0JCQkJVmFyaWFiaWxpdHlUeXBlLkxPQ0FMX0NPTlRSSUJVVElPTiwgcHJldkFuZE5leHQpOwotCQlBY3Rpdml0eSBwYXJlbnRBY3QgPSAoKEFjdGl2aXR5KSBwYXJlbnQpOwotCQlhZGRUb0FjdGl2aXR5KHBhcmVudEFjdCwgYWN0LCBwcmV2QW5kTmV4dCk7Ci0JCWNyZWF0ZWRBY3Rpdml0aWVzLmFkZChhY3QpOwotCQlyZXR1cm4gYWN0OwotCX0KLQotCS8qKgotCSAqIExvY2FsbHkgcmVwbGFjZXMgdGhlIGluaGVyaXRlZCBhY3Rpdml0eSByZXByZXNlbnRlZCBieSB0aGUgZ2l2ZW4gYWRhcHRlcgotCSAqIAotCSAqIEBwYXJhbSBhZGFwdGVyCi0JICogQHBhcmFtIGNyZWF0ZWRBY3Rpdml0aWVzCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlcGxhY2VBY3Rpdml0eUxvY2FsbHkoCi0JCQlCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlciBhZGFwdGVyLCBMaXN0IGNyZWF0ZWRBY3Rpdml0aWVzKSB7Ci0JCU9iamVjdCBwYXJlbnQgPSBhZGFwdGVyLmdldFBhcmVudChudWxsKTsKLQkJT2JqZWN0W10gcHJldkFuZE5leHQgPSBQcm9jZXNzVXRpbAotCQkJCS5nZXRQcmV2aW91c0FuZE5leHQoYWRhcHRlcik7Ci0JCWlmIChwYXJlbnQgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgewotCQkJcGFyZW50ID0gY29udHJpYnV0ZVRvQWN0aXZpdHkoCi0JCQkJCShCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgcGFyZW50LAotCQkJCQljcmVhdGVkQWN0aXZpdGllcyk7Ci0JCX0KLQkJQWN0aXZpdHkgYWN0ID0gUHJvY2Vzc1V0aWwuZ2VuZXJpYWxpemUoYWRhcHRlciwKLQkJCQlWYXJpYWJpbGl0eVR5cGUuTE9DQUxfUkVQTEFDRU1FTlQsIHByZXZBbmROZXh0KTsKLQkJQWN0aXZpdHkgcGFyZW50QWN0ID0gKChBY3Rpdml0eSkgcGFyZW50KTsKLQkJYWRkVG9BY3Rpdml0eShwYXJlbnRBY3QsIGFjdCwgcHJldkFuZE5leHQpOwotCQljcmVhdGVkQWN0aXZpdGllcy5hZGQoYWN0KTsKLQl9Ci0KLQlzdGF0aWMgT2JqZWN0W10gZ2V0UHJldmlvdXNBbmROZXh0KAotCQkJQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIgYWRhcHRlcikgewotCQlPYmplY3QgcGFyZW50ID0gYWRhcHRlci5nZXRQYXJlbnQobnVsbCk7Ci0JCUFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5ID0gVG5nVXRpbC5nZXRCZXN0QWRhcHRlckZhY3RvcnkoYWRhcHRlcgotCQkJCS5nZXRBZGFwdGVyRmFjdG9yeSgpKTsKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyIGl0ZW1Qcm92aWRlciA9IChJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIpIGFkYXB0ZXJGYWN0b3J5Ci0JCQkJLmFkYXB0KHBhcmVudCwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJTGlzdCBjaGlsZHJlbiA9IChMaXN0KSBpdGVtUHJvdmlkZXIuZ2V0Q2hpbGRyZW4ocGFyZW50KTsKLQkJaW50IGlkID0gY2hpbGRyZW4uaW5kZXhPZihhZGFwdGVyKSArIDE7Ci0JCU9iamVjdCBuZXh0ID0gbnVsbDsKLQkJaWYgKGlkIDwgY2hpbGRyZW4uc2l6ZSgpKSB7Ci0JCQluZXh0ID0gY2hpbGRyZW4uZ2V0KGlkKTsKLQkJfQotCQlPYmplY3QgcHJldiA9IG51bGw7Ci0JCWlkIC09IDI7Ci0JCWlmIChpZCA+IC0xKSB7Ci0JCQlwcmV2ID0gY2hpbGRyZW4uZ2V0KGlkKTsKLQkJfQotCi0JCU9iamVjdFtdIHByZXZBbmROZXh0ID0geyBwcmV2LCBuZXh0IH07Ci0JCXJldHVybiBwcmV2QW5kTmV4dDsKLQl9Ci0KLQlzdGF0aWMgQWN0aXZpdHkgZ2VuZXJpYWxpemUoQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIgYWRhcHRlciwKLQkJCVZhcmlhYmlsaXR5VHlwZSB0eXBlLCBPYmplY3RbXSBwcmV2QW5kTmV4dCkgewotCQlBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSA9IFRuZ1V0aWwuZ2V0QmVzdEFkYXB0ZXJGYWN0b3J5KGFkYXB0ZXIKLQkJCQkuZ2V0QWRhcHRlckZhY3RvcnkoKSk7Ci0KLQkJQWN0aXZpdHkgYWN0ID0gZ2VuZXJhbGl6ZSgoQWN0aXZpdHkpIFRuZ1V0aWwudW53cmFwKGFkYXB0ZXIpLCB0eXBlKTsKLQkJT2JqZWN0IG5leHQgPSBwcmV2QW5kTmV4dFsxXTsKLQkJaWYobmV4dCAhPSBudWxsKSB7Ci0JCQlhY3Quc2V0UHJlc2VudGVkQWZ0ZXIoKEJyZWFrZG93bkVsZW1lbnQpIFRuZ1V0aWwudW53cmFwKG5leHQpKTsKLQkJCWlmKG5leHQgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50KSB7Ci0JCQkJKChCcmVha2Rvd25FbGVtZW50KW5leHQpLnNldFByZXNlbnRlZEJlZm9yZShhY3QpOwotCQkJfQotCQl9Ci0JCU9iamVjdCBwcmV2ID0gcHJldkFuZE5leHRbMF07Ci0JCWlmKHByZXYgIT0gbnVsbCkgewotCQkJYWN0LnNldFByZXNlbnRlZEJlZm9yZSgoQnJlYWtkb3duRWxlbWVudCkgVG5nVXRpbC51bndyYXAocHJldikpOwotCQkJaWYgKHByZXYgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50KSB7Ci0JCQkJKChCcmVha2Rvd25FbGVtZW50KXByZXYpLnNldFByZXNlbnRlZEFmdGVyKGFjdCk7Ci0JCQl9Ci0JCX0KLQkJSUJTSXRlbVByb3ZpZGVyIGJzSXRlbVByb3ZpZGVyID0gKElCU0l0ZW1Qcm92aWRlcikgYWRhcHRlckZhY3RvcnkKLQkJCQkuYWRhcHQoYWN0LCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQlic0l0ZW1Qcm92aWRlci5zZXRFeHBhbmRlZChhZGFwdGVyLmlzRXhwYW5kZWQoKSk7Ci0JCXJldHVybiBhY3Q7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgaW1tZWRpYXRlIGJhc2UgcHJvY2VzcyBvZiB0aGUgZ2l2ZW4KLQkgKiBCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlciB0aGF0IHJlcHJlc2VudHMgYW4gaW5oZXJpdGVkCi0JICogYnJlYWtkb3duIGVsZW1lbnQuCi0JICogCi0JICogQHBhcmFtIGl0ZW1Qcm92aWRlcgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFByb2Nlc3MgZ2V0SW1tZWRpYXRlQmFzZVByb2Nlc3MoCi0JCQlCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlciBpdGVtUHJvdmlkZXIpIHsKLQkJQWN0aXZpdHkgaW5oZXJpdG9yID0gZ2V0SW5oZXJpdG9yKGl0ZW1Qcm92aWRlcik7Ci0JCWlmIChpbmhlcml0b3IgIT0gbnVsbCkgewotCQkJcmV0dXJuIFRuZ1V0aWwuZ2V0T3duaW5nUHJvY2VzcygoQnJlYWtkb3duRWxlbWVudCkgaW5oZXJpdG9yCi0JCQkJCS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGFjdGl2aXR5IGluIHRoZSBwcm9jZXNzIG9mIHRoZSBnaXZlbiBpdGVtIHByb3ZpZGVyIHRoYXQgaW5oZXJpdHMKLQkgKiB0aGUgZWxlbWVudCByZXByZXNlbnRlZCBieSB0aGUgZ2l2ZW4gaXRlbSBwcm92aWRlcgotCSAqIAotCSAqIEBwYXJhbSBpdGVtUHJvdmlkZXIKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBBY3Rpdml0eSBnZXRJbmhlcml0b3IoCi0JCQlCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlciBpdGVtUHJvdmlkZXIpIHsKLQkJaWYgKGl0ZW1Qcm92aWRlci5pc1JlYWRPbmx5KCkpIHsKLQkJCS8vIHRoaXMgcmVwcmVzZW50cyBhbiBpbmhlcml0ZWQgYnJlYWtkb3duIGVsZW1lbnQKLQkJCS8vCi0JCQlmb3IgKE9iamVjdCBwYXJlbnQgPSBpdGVtUHJvdmlkZXIuZ2V0UGFyZW50KGl0ZW1Qcm92aWRlcik7IHBhcmVudCAhPSBudWxsOykgewotCQkJCWlmIChwYXJlbnQgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgewotCQkJCQlwYXJlbnQgPSAoKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSBwYXJlbnQpCi0JCQkJCQkJLmdldFBhcmVudChwYXJlbnQpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXJldHVybiAoQWN0aXZpdHkpIHBhcmVudDsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogR2V0cyBwYXJlbnQgbGlzdCBvZiA8Y29kZT53cmFwcGVyPC9jb2RlPiBmcm9tIDxjb2RlPmZyb208L2NvZGU+LAotCSAqIGV4Y2x1ZGVkIDxjb2RlPmZyb208L2NvZGU+Ci0JICogCi0JICogQHBhcmFtIGZyb20KLQkgKiBAcGFyYW0gd3JhcHBlcgotCSAqIEByZXR1cm4gbGlzdCBvZiB1bndyYXBwZWQgcGFyZW50IG9iamVjdHMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3QgZ2V0UGFyZW50TGlzdChPYmplY3QgZnJvbSwKLQkJCUJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyIHdyYXBwZXIpIHsKLQkJcmV0dXJuIGdldFBhcmVudExpc3Qod3JhcHBlciwgZnJvbSwgd3JhcHBlci5nZXRBZGFwdGVyRmFjdG9yeSgpKTsKLQl9Ci0JCi0JLyoqCi0JICogR2V0cyB0aGUgbGlzdCBvZiBHVUlEcyBmcm9tIHRoZSB0b3AgZWxlbWVudCB0byB0aGUgd3JhcHBlciBpbmNsdXNpdmUuCi0JICogCi0JICogQHBhcmFtIHdyYXBwZXIKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBMaW5rZWRMaXN0PFN0cmluZz4gZ2V0R3VpZExpc3QoQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIgd3JhcHBlcikgewotCQlMaW5rZWRMaXN0PFN0cmluZz4gZ3VpZExpc3QgPSBuZXcgTGlua2VkTGlzdDxTdHJpbmc+KCk7Ci0JCUxpc3QgcGFyZW50TGlzdCA9IFByb2Nlc3NVdGlsLmdldFBhcmVudExpc3QobnVsbCwgd3JhcHBlcik7Ci0JCWlmICghcGFyZW50TGlzdC5pc0VtcHR5KCkpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHBhcmVudExpc3QuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJTWV0aG9kRWxlbWVudCBlID0gKE1ldGhvZEVsZW1lbnQpIGl0ZXIubmV4dCgpOwotCQkJCS8vIGV4Y2x1ZGUgVGFza0Rlc2NyaXB0b3IgYW5kIFJvbGVEZXNjcmlwdG9yIGZyb20gdGhlIHBhcmVudAotCQkJCS8vIHBhdGggYi9jIHRob3NlIGRlc2NyaXB0b3JzIGNhbiBiZQotCQkJCS8vIHBhcmVudCBvbmx5IGluIENCUyB2aWV3Ci0JCQkJaWYgKCEoZSBpbnN0YW5jZW9mIFRhc2tEZXNjcmlwdG9yIHx8IGUgaW5zdGFuY2VvZiBSb2xlRGVzY3JpcHRvcikpIHsKLQkJCQkJZ3VpZExpc3QuYWRkKGUuZ2V0R3VpZCgpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJTWV0aG9kRWxlbWVudCBlID0gKE1ldGhvZEVsZW1lbnQpIFRuZ1V0aWwudW53cmFwKHdyYXBwZXIpOwotCQlndWlkTGlzdC5hZGQoZS5nZXRHdWlkKCkpOwotCQlyZXR1cm4gZ3VpZExpc3Q7Ci0JfQotCQotCS8qKgotCSAqIEdldHMgdGhlIGxpc3Qgb2YgR1VJRHMgZnJvbSBzdGFydCB0byBhY3Rpdml0eSwgZXhjbHVkZWQgc3RhcnQgYWN0aXZpdHkuCi0JICogQHBhcmFtIGZyb20KLQkgKiBAcGFyYW0gYWN0aXZpdHkKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBMaW5rZWRMaXN0PFN0cmluZz4gZ2V0R3VpZExpc3QoQWN0aXZpdHkgc3RhcnQsIEFjdGl2aXR5IGFjdGl2aXR5KSB7Ci0JCUxpbmtlZExpc3Q8U3RyaW5nPiBndWlkTGlzdCA9IG5ldyBMaW5rZWRMaXN0PFN0cmluZz4oKTsKLQkJZm9yKEFjdGl2aXR5IHBhcmVudCA9IGFjdGl2aXR5OyBwYXJlbnQgIT0gbnVsbCAmJiAoc3RhcnQgPT0gbnVsbCB8fCBwYXJlbnQgIT0gc3RhcnQpOyBwYXJlbnQgPSBwYXJlbnQuZ2V0U3VwZXJBY3Rpdml0aWVzKCkpIHsKLQkJCWd1aWRMaXN0LmFkZEZpcnN0KHBhcmVudC5nZXRHdWlkKCkpOwotCQl9Ci0JCXJldHVybiBndWlkTGlzdDsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBMaXN0PFN0cmluZz4gZ2V0R3VpZExpc3QoT2JqZWN0IGFjdGl2aXR5T3JXcmFwcGVyKSB7Ci0JCWlmKGFjdGl2aXR5T3JXcmFwcGVyIGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIHsKLQkJCXJldHVybiBnZXRHdWlkTGlzdCgoQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpYWN0aXZpdHlPcldyYXBwZXIpOwotCQl9Ci0JCWVsc2UgaWYoYWN0aXZpdHlPcldyYXBwZXIgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJcmV0dXJuIGdldEd1aWRMaXN0KG51bGwsIChBY3Rpdml0eSkgYWN0aXZpdHlPcldyYXBwZXIpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0b0d1aWRQYXRoKExpc3Q8U3RyaW5nPiBndWlkTGlzdCkgewotCQlTdHJpbmdCdWZmZXIgcGF0aCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJZm9yIChTdHJpbmcgZ3VpZCA6IGd1aWRMaXN0KSB7Ci0JCQlwYXRoLmFwcGVuZCgnLycpLmFwcGVuZChndWlkKTsKLQkJfQotCQlyZXR1cm4gcGF0aC50b1N0cmluZygpOwotCX0KLQkKLQkvKioKLQkgKiBHZXRzIHBhcmVudCBsaXN0IG9mIDxjb2RlPm9iamVjdDwvY29kZT4gZnJvbSA8Y29kZT5mcm9tPC9jb2RlPiwKLQkgKiBleGNsdWRlZCA8Y29kZT5mcm9tPC9jb2RlPgotCSAqIAotCSAqIEBwYXJhbSBvYmplY3QKLQkgKiBAcGFyYW0gZnJvbQotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqIEByZXR1cm4gbGlzdCBvZiB1bndyYXBwZWQgcGFyZW50IG9iamVjdHMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3QgZ2V0UGFyZW50TGlzdChPYmplY3Qgb2JqZWN0LCBPYmplY3QgZnJvbSwgQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJQXJyYXlMaXN0IHBhcmVudExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciBpdGVtUHJvdmlkZXIgPSAoSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyKSBhZGFwdGVyRmFjdG9yeS5hZGFwdChvYmplY3QsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCWZvciAoT2JqZWN0IHBhcmVudCA9IGl0ZW1Qcm92aWRlci5nZXRQYXJlbnQob2JqZWN0KTsgcGFyZW50ICE9IGZyb20KLQkJCQkmJiBwYXJlbnQgIT0gbnVsbDspIHsKLQkJCU9iamVjdCBvYmogPSBUbmdVdGlsLnVud3JhcChwYXJlbnQpOwotCQkJTWV0aG9kRWxlbWVudCBlOwkJCQotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCQllID0gKE1ldGhvZEVsZW1lbnQpIG9iajsKLQkJCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIgYWRhcHRlcjsKLQkJCQlpZiAocGFyZW50IGluc3RhbmNlb2YgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyKSB7Ci0JCQkJCWFkYXB0ZXIgPSAoSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyKSBwYXJlbnQ7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJYWRhcHRlciA9IChJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIpIGFkYXB0ZXJGYWN0b3J5LmFkYXB0KAotCQkJCQkJCXBhcmVudCwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCQl9Ci0JCQkJaWYoUHJvY2Vzc1V0aWwuaXNUb3BQcm9jZXNzKGUpKSB7Ci0JCQkJCXBhcmVudCA9IG51bGw7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlwYXJlbnQgPSBhZGFwdGVyLmdldFBhcmVudChwYXJlbnQpOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJLy8gbXVzdCBiZSBhIEl0ZW1Qcm92aWRlckFkYXB0ZXIKLQkJCQkvLwotCQkJCUl0ZW1Qcm92aWRlckFkYXB0ZXIgYWRhcHRlciA9ICgoSXRlbVByb3ZpZGVyQWRhcHRlcikgb2JqKTsKLQkJCQllID0gKE1ldGhvZEVsZW1lbnQpIGFkYXB0ZXIuZ2V0VGFyZ2V0KCk7Ci0JCQkJcGFyZW50ID0gYWRhcHRlci5nZXRQYXJlbnQocGFyZW50KTsKLQkJCX0KLQkJCXBhcmVudExpc3QuYWRkKDAsIGUpOwotCQl9Ci0JCXJldHVybiBwYXJlbnRMaXN0OwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHdyYXBwZXJzIG9mIGFsbCBicmVha2Rvd24gc3RydWN0dXJlIChCUykgdmlld3MgaW4gdGhlIGZvbGxvd2luZwotCSAqIG9yZGVyOiBXQlMsIFRCUywgV1BCUwotCSAqIAotCSAqIEBwYXJhbSB3cmFwcGVyCi0JICogICAgICAgICAgICB0aGUgd3JhcHBlciBvZiBhIEJTIHZpZXcKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0IGdldFdyYXBwZXJzKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyIHdyYXBwZXIsIEFkYXB0ZXJGYWN0b3J5W10gYWRhcHRlckZhY3RvcmllcykgewotCQlBcnJheUxpc3Qgcm9sbGVkVXBJdGVtUHJvdmlkZXJzID0gbmV3IEFycmF5TGlzdCgpOwotCQl0cnkgewotCQkJQWRhcHRlckZhY3Rvcnkgcm9vdEFkYXB0ZXJGYWN0b3J5ID0gVG5nVXRpbC5nZXRCZXN0QWRhcHRlckZhY3Rvcnkod3JhcHBlci5nZXRBZGFwdGVyRmFjdG9yeSgpKTsKLQkJCU9iamVjdCBwcm9jID0gd3JhcHBlci5nZXRUb3BJdGVtKCk7CQkJCQkJCi0JCQlBcnJheUxpc3Qgb2JqZWN0cyA9IG5ldyBBcnJheUxpc3QoUHJvY2Vzc1V0aWwuZ2V0UGFyZW50TGlzdChwcm9jLAotCQkJCQl3cmFwcGVyKSk7Ci0JCQlBcnJheUxpc3Qgd3JhcHBlcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGFkYXB0ZXJGYWN0b3JpZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSA9IGFkYXB0ZXJGYWN0b3JpZXNbaV07Ci0JCQkJaWYgKGFkYXB0ZXJGYWN0b3J5ID09IHJvb3RBZGFwdGVyRmFjdG9yeSkgewotCQkJCQl3cmFwcGVycy5hZGQod3JhcHBlcik7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCQlPYmplY3QgZSA9IFRuZ1V0aWwudW53cmFwKHdyYXBwZXIpOwotCQkJCW9iamVjdHMuYWRkKGUpOwotCQkJCU9iamVjdCBvYmplY3QgPSBwcm9jOwotCQkJCWZvciAoSXRlcmF0b3IgaXRlcjEgPSBvYmplY3RzLml0ZXJhdG9yKCk7IGl0ZXIxLmhhc05leHQoKTspIHsKLQkJCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyMS5uZXh0KCk7Ci0JCQkJCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciBhZGFwdGVyID0gKElUcmVlSXRlbUNvbnRlbnRQcm92aWRlcikgYWRhcHRlckZhY3RvcnkKLQkJCQkJLmFkYXB0KG9iamVjdCwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCQkJCi0JCQkJCS8vIG1ha2Ugc3VyZSB0aGUgYWN0aXZpdHkgaXMgcm9sbGVkIGRvd24gYmVmb3JlIGxvb2tpbmcgaW50byBpdHMgY2hpbGRyZW4KLQkJCQkJLy8KLQkJCQkJT2JqZWN0IGJlID0gVG5nVXRpbC51bndyYXAob2JqZWN0KTsJCQkJCQkJCQotCQkJCQlpZihiZSBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJCQlpZihhZGFwdGVyIGluc3RhbmNlb2YgQlNBY3Rpdml0eUl0ZW1Qcm92aWRlcikgewotCQkJCQkJCUJTQWN0aXZpdHlJdGVtUHJvdmlkZXIgaXRlbVByb3ZpZGVyID0gKEJTQWN0aXZpdHlJdGVtUHJvdmlkZXIpIGFkYXB0ZXI7Ci0JCQkJCQkJaWYoaXRlbVByb3ZpZGVyLmlzUm9sbGVkVXAoKSkgewotCQkJCQkJCQlpdGVtUHJvdmlkZXIuYmFzaWNTZXRSb2xsZWRVcChmYWxzZSk7Ci0JCQkJCQkJCXJvbGxlZFVwSXRlbVByb3ZpZGVycy5hZGQoaXRlbVByb3ZpZGVyKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIGlmKGFkYXB0ZXIgaW5zdGFuY2VvZiBJQlNJdGVtUHJvdmlkZXIpIHsKLQkJCQkJCQlJQlNJdGVtUHJvdmlkZXIgaXRlbVByb3ZpZGVyID0gKElCU0l0ZW1Qcm92aWRlcikgYWRhcHRlcjsKLQkJCQkJCQlpZihpdGVtUHJvdmlkZXIuaXNSb2xsZWRVcCgpKSB7Ci0JCQkJCQkJCWl0ZW1Qcm92aWRlci5zZXRSb2xsZWRVcChmYWxzZSk7Ci0JCQkJCQkJCXJvbGxlZFVwSXRlbVByb3ZpZGVycy5hZGQoaXRlbVByb3ZpZGVyKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJCi0JCQkJCWZpbmRfY2hpbGQ6IGZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBhZGFwdGVyCi0JCQkJCQkJLmdldENoaWxkcmVuKG9iamVjdCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJCQkJT2JqZWN0IGNoaWxkID0gaXRlcmF0b3IubmV4dCgpOwotCQkJCQkJaWYgKGVsZW1lbnQgPT0gVG5nVXRpbC51bndyYXAoY2hpbGQpKSB7Ci0JCQkJCQkJb2JqZWN0ID0gY2hpbGQ7Ci0JCQkJCQkJYnJlYWsgZmluZF9jaGlsZDsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIHsKLQkJCQkJd3JhcHBlcnMuYWRkKG9iamVjdCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oCi0JCQkJCQkJIkNvdWxkIG5vdCBmaW5kIHdyYXBwZXIgZm9yICIgKyBlICsgIiB1c2luZyBhZGFwdGVyIGZhY3RvcnkgIiArIGFkYXB0ZXJGYWN0b3J5KTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJfQotCQkJfQotCQkJcmV0dXJuIHdyYXBwZXJzOwotCQl9Ci0JCWZpbmFsbHkgewotCQkJaWYoIXJvbGxlZFVwSXRlbVByb3ZpZGVycy5pc0VtcHR5KCkpIHsKLQkJCQkvLyByZXN0b3JlIHRoZSByb2xsZWRVcCBmbGFnCi0JCQkJLy8KLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSByb2xsZWRVcEl0ZW1Qcm92aWRlcnMuaXRlcmF0b3IoKTsgaXRlcgotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCSgoQlNBY3Rpdml0eUl0ZW1Qcm92aWRlcikgaXRlci5uZXh0KCkpLmJhc2ljU2V0Um9sbGVkVXAodHJ1ZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCQotCS8qKgotCSAqIEdldHMgV29ya1Byb2R1Y3REZXNjcmlwdG9yIHNwZWNpZmljIG1vZGVsIGluZm8gCi0JICogQHBhcmFtIG1vZGVsSW5mbwotCSAqIEBwYXJhbSBvYmplY3QgV29ya1Byb2R1Y3REZXNjcmlwdG9yIG9yIGl0cyB3cmFwcGVyCi0JICogQHBhcmFtIGl0ZW1Qcm92aWRlciBpdGVtIHByb3ZpZGVyIG9mIFdvcmtQcm9kdWN0RGVzY3JpcHRvciBvciBpdHMgd3JhcHBlcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBnZXRXUERNb2RlbEluZm8oU3RyaW5nQnVmZmVyIG1vZGVsSW5mbywgT2JqZWN0IG9iamVjdCwgT2JqZWN0IGl0ZW1Qcm92aWRlcikgewotCQlPYmplY3QgZWxlbWVudCA9IFRuZ1V0aWwudW53cmFwKG9iamVjdCk7Ci0JCWlmKGVsZW1lbnQgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3IpIHsJCi0JCQlXb3JrUHJvZHVjdERlc2NyaXB0b3Igd3BkID0gKFdvcmtQcm9kdWN0RGVzY3JpcHRvcillbGVtZW50OwotCQkJaWYoaXRlbVByb3ZpZGVyIGluc3RhbmNlb2YgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyKSB7Ci0JCQkJLy8gY2hlY2sgaWYgdGhpcyB3b3JrIHByb2R1Y3QgZGVzY3JpcHRvciBpcyBzaG93biB1bmRlciBhIHRhc2sgZGVzY3JpcHRvciBvciByb2xlIGRlc2NyaXB0b3IKLQkJCQkvLwotCQkJCUFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5ID0gbnVsbDsKLQkJCQlpZihpdGVtUHJvdmlkZXIgaW5zdGFuY2VvZiBJdGVtUHJvdmlkZXJBZGFwdGVyKSB7Ci0JCQkJCWFkYXB0ZXJGYWN0b3J5ID0gKChJdGVtUHJvdmlkZXJBZGFwdGVyKWl0ZW1Qcm92aWRlcikuZ2V0QWRhcHRlckZhY3RvcnkoKTsKLQkJCQl9Ci0JCQkJZWxzZSBpZihpdGVtUHJvdmlkZXIgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgewotCQkJCQlhZGFwdGVyRmFjdG9yeSA9ICgoQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpaXRlbVByb3ZpZGVyKS5nZXRBZGFwdGVyRmFjdG9yeSgpOwotCQkJCX0KLQkJCQlpZihhZGFwdGVyRmFjdG9yeSAhPSBudWxsKSB7Ci0JCQkJCU9iamVjdCBwYXJlbnREZXNjcmlwdG9yID0gbnVsbDsKLQkJCQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyIGFkYXB0ZXIgPSAoSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyKWl0ZW1Qcm92aWRlcjsKLQkJCQkJZmluZFBhcmVudERlc2NyaXB0b3I6Ci0JCQkJCQlmb3IoT2JqZWN0IHBhcmVudCA9IGFkYXB0ZXIuZ2V0UGFyZW50KG9iamVjdCk7IHBhcmVudCAhPSBudWxsOyBwYXJlbnQgPSBhZGFwdGVyLmdldFBhcmVudChwYXJlbnQpKSB7Ci0JCQkJCQkJT2JqZWN0IGUgPSBUbmdVdGlsLnVud3JhcChwYXJlbnQpOwotCQkJCQkJCWlmKGUgaW5zdGFuY2VvZiBUYXNrRGVzY3JpcHRvcikgewotCQkJCQkJCQlwYXJlbnREZXNjcmlwdG9yID0gZTsKLQkJCQkJCQkJYnJlYWsgZmluZFBhcmVudERlc2NyaXB0b3I7Ci0JCQkJCQkJfQotCQkJCQkJCWVsc2UgaWYoZSBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJCQkJCWJyZWFrIGZpbmRQYXJlbnREZXNjcmlwdG9yOwotCQkJCQkJCX0KLQkJCQkJCQlhZGFwdGVyID0gKElUcmVlSXRlbUNvbnRlbnRQcm92aWRlcikgYWRhcHRlckZhY3RvcnkuYWRhcHQocGFyZW50LCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkJCQkJfQotCQkJCQlpZihwYXJlbnREZXNjcmlwdG9yICE9IG51bGwpIHsJCi0JCQkJCQkvLyB3b3JrIHByb2R1Y3QgZGVzY3JpcHRvciBpcyBzaG93biB1bmRlciBhIHRhc2sgZGVzY3JpcHRvcgotCQkJCQkJLy8gc2hvdyBvbmx5IG1vZGVsIGluZm8gcmVsYXRlZCB0byB0aGlzIHRhc2sgZGVzY3JpcHRvcgotCQkJCQkJLy8KLQkJCQkJCUFycmF5TGlzdCBmZWF0dXJlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJCWlmKEFzc29jaWF0aW9uSGVscGVyLmdldE1hbmRhdG9yeUlucHV0VG8od3BkKS5jb250YWlucyhwYXJlbnREZXNjcmlwdG9yKSkgewotCQkJCQkJCWZlYXR1cmVzLmFkZChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrRGVzY3JpcHRvcl9NYW5kYXRvcnlJbnB1dCgpKTsKLQkJCQkJCX0KLQkJCQkJCWlmKEFzc29jaWF0aW9uSGVscGVyLmdldE9wdGlvbmFsSW5wdXRUbyh3cGQpLmNvbnRhaW5zKHBhcmVudERlc2NyaXB0b3IpKSB7Ci0JCQkJCQkJZmVhdHVyZXMuYWRkKFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tEZXNjcmlwdG9yX09wdGlvbmFsSW5wdXQoKSk7CQkJCQkJCQotCQkJCQkJfQotCQkJCQkJaWYoQXNzb2NpYXRpb25IZWxwZXIuZ2V0T3V0cHV0RnJvbSh3cGQpLmNvbnRhaW5zKHBhcmVudERlc2NyaXB0b3IpKSB7Ci0JCQkJCQkJZmVhdHVyZXMuYWRkKFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tEZXNjcmlwdG9yX091dHB1dCgpKTsKLQkJCQkJCX0KLQkJCQkJCWlmKCFmZWF0dXJlcy5pc0VtcHR5KCkpIHsKLQkJCQkJCQlpZiAobW9kZWxJbmZvLnRvU3RyaW5nKCkubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJCQkJCW1vZGVsSW5mby5hcHBlbmQoIiwiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCX0KLQkJCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGZlYXR1cmVzLnNpemUoKTsgaSsrKSB7Ci0JCQkJCQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgZmVhdHVyZXMuZ2V0KGkpOwotCQkJCQkJCQltb2RlbEluZm8uYXBwZW5kKFRuZ1V0aWwuZ2V0RmVhdHVyZVRleHQoZmVhdHVyZSkpOwotCQkJCQkJCQlpZihpIDwgZmVhdHVyZXMuc2l6ZSgpIC0xKXsKLQkJCQkJCQkJCW1vZGVsSW5mby5hcHBlbmQoIiwiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQl9Ci0JCQkJCQkJfQkJCQkJCQotCQkJCQkJfQotCQkJCQkJcmV0dXJuOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJZ2V0TW9kZWxJbmZvRm9yV29ya1Byb2R1Y3REZXNjcmlwdG9yKG1vZGVsSW5mbywgd3BkKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHJpZXZlcyB0aGUgTW9kZWxJbmZvcm1hdGlvbiBzcGVjaWZpYyB0byBXb3JrUHJvZHVjdERlc2NyaXB0b3IuIE1vZGVsCi0JICogSW5mb3JtYXRpb24gaXMgZm9yIFBCUyAoV29ya1Byb2R1Y3REZXNjcmlwdG9ycywgaW5jbHVkaW5nIEV4dGVuZGVkCi0JICogQWN0aXZpdHkncyBXb3JrUHJvZHVjdERlc2NyaXB0b3JzKS4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGdldE1vZGVsSW5mb0ZvcldvcmtQcm9kdWN0RGVzY3JpcHRvcigKLQkJCVN0cmluZ0J1ZmZlciBtb2RlbEluZm8sIFdvcmtQcm9kdWN0RGVzY3JpcHRvciBvYmplY3QpIHsKLQkJU3RyaW5nIGNvbW1hID0gIiwiOyAvLyROT04tTkxTLTEkCi0JCWlmICghQXNzb2NpYXRpb25IZWxwZXIuZ2V0TWFuZGF0b3J5SW5wdXRUbyhvYmplY3QpLmlzRW1wdHkoKSkgewotCQkJaWYgKG1vZGVsSW5mby50b1N0cmluZygpLmxlbmd0aCgpID4gMCkgewotCQkJCW1vZGVsSW5mby5hcHBlbmQoY29tbWEpOwotCQkJfQotCQkJbW9kZWxJbmZvLmFwcGVuZChVbWFFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCS5nZXRTdHJpbmcoIl9VSV9UYXNrRGVzY3JpcHRvcl9tYW5kYXRvcnlJbnB1dF9mZWF0dXJlIikpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJaWYgKCFBc3NvY2lhdGlvbkhlbHBlci5nZXRPcHRpb25hbElucHV0VG8ob2JqZWN0KS5pc0VtcHR5KCkpIHsKLQkJCWlmIChtb2RlbEluZm8udG9TdHJpbmcoKS5sZW5ndGgoKSA+IDApIHsKLQkJCQltb2RlbEluZm8uYXBwZW5kKGNvbW1hKTsKLQkJCX0KLQkJCW1vZGVsSW5mby5hcHBlbmQoVW1hRWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkuZ2V0U3RyaW5nKCJfVUlfVGFza0Rlc2NyaXB0b3Jfb3B0aW9uYWxJbnB1dF9mZWF0dXJlIikpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJaWYgKCFBc3NvY2lhdGlvbkhlbHBlci5nZXRPdXRwdXRGcm9tKG9iamVjdCkuaXNFbXB0eSgpKSB7Ci0JCQlpZiAobW9kZWxJbmZvLnRvU3RyaW5nKCkubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJbW9kZWxJbmZvLmFwcGVuZChjb21tYSk7Ci0JCQl9Ci0JCQltb2RlbEluZm8uYXBwZW5kKFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJLmdldFN0cmluZygiX1VJX1Rhc2tEZXNjcmlwdG9yX291dHB1dF9mZWF0dXJlIikpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIENvbGxlY3Rpb24gZ2V0RHVwbGljYXRlRGVzY3JpcHRvcnNBZnRlclJldmVhbChDb2xsZWN0aW9uIGVsZW1lbnRzVG9SZXZlYWwpIHsKLQkJQ29sbGVjdGlvbiBkdXBsaWNhdGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBlbGVtZW50c1RvUmV2ZWFsLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyLm5leHQoKTsKLQkJCWlmKGVsZW1lbnQgaW5zdGFuY2VvZiBEZXNjcmlwdG9yKSB7Ci0JCQkJRGVzY3JpcHRvciBkZXNjID0gKERlc2NyaXB0b3IpIGVsZW1lbnQ7Ci0JCQkJTWV0aG9kRWxlbWVudCBlID0gUHJvY2Vzc1V0aWwuZ2V0QXNzb2NpYXRlZEVsZW1lbnQoZGVzYyk7Ci0JCQkJaWYoZSAhPSBudWxsKSB7Ci0JCQkJCUFjdGl2aXR5IGFjdCA9IFVtYVV0aWwuZ2V0UGFyZW50QWN0aXZpdHkoZGVzYyk7Ci0JCQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gVG5nVXRpbC5nZXRPd25pbmdQcm9jZXNzKGFjdCkuZ2V0RGVmYXVsdENvbnRleHQoKTsKLQkJCQkJZSA9IChNZXRob2RFbGVtZW50KSBQcm92aWRlcnMuZ2V0Q29uZmlndXJhdGlvbkFwcGxpY2F0b3IoKS5yZXNvbHZlKGUsIGNvbmZpZyk7Ci0JCQkJCU9iamVjdCBkdXBsaWNhdGUgPSBQcm9jZXNzQ29tbWFuZFV0aWwuZ2V0RGVzY3JpcHRvcihlLCBhY3QsIGNvbmZpZyk7Ci0JCQkJCWlmKGR1cGxpY2F0ZSAhPSBudWxsICYmICFkdXBsaWNhdGVzLmNvbnRhaW5zKGR1cGxpY2F0ZSkpIHsJCQkJCQotCQkJCQkJZHVwbGljYXRlcy5hZGQoZHVwbGljYXRlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIGR1cGxpY2F0ZXM7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgQ29sbGVjdGlvbjxEZXNjcmlwdG9yPiBnZXREdXBsaWNhdGVEZXNjcmlwdG9yc0FmdGVyU3VwcHJlc3MoQ29sbGVjdGlvbiBlbGVtZW50c1RvU3VwcHJlc3MpIHsKLQkJQ29sbGVjdGlvbjxEZXNjcmlwdG9yPiBkdXBsaWNhdGVzID0gbmV3IEFycmF5TGlzdDxEZXNjcmlwdG9yPigpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBlbGVtZW50c1RvU3VwcHJlc3MuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgaXRlbSA9IGl0ZXIubmV4dCgpOwotCQkJaWYoaXRlbSBpbnN0YW5jZW9mIERlc2NyaXB0b3IpIHsKLQkJCQlEZXNjcmlwdG9yIGRlc2MgPSAoRGVzY3JpcHRvcikgaXRlbTsKLQkJCQlNZXRob2RFbGVtZW50IGUgPSBQcm9jZXNzVXRpbC5nZXRBc3NvY2lhdGVkRWxlbWVudChkZXNjKTsKLQkJCQlpZihlICE9IG51bGwpIHsKLQkJCQkJQWN0aXZpdHkgYWN0ID0gVW1hVXRpbC5nZXRQYXJlbnRBY3Rpdml0eShkZXNjKTsKLQkJCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGFjdC5nZXRCcmVha2Rvd25FbGVtZW50cygpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCQkJCUJyZWFrZG93bkVsZW1lbnQgZWxlbWVudCA9IChCcmVha2Rvd25FbGVtZW50KSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCQlpZihlbGVtZW50ICE9IGRlc2MgJiYgZWxlbWVudCBpbnN0YW5jZW9mIERlc2NyaXB0b3IgJiYgZWxlbWVudC5nZXRTdXBwcmVzc2VkKCkuYm9vbGVhblZhbHVlKCkpIHsKLQkJCQkJCQlNZXRob2RFbGVtZW50IGxpbmtlZEVsZW1lbnQgPSBQcm9jZXNzVXRpbC5nZXRBc3NvY2lhdGVkRWxlbWVudCgoRGVzY3JpcHRvcikgZWxlbWVudCk7Ci0JCQkJCQkJaWYobGlua2VkRWxlbWVudCA9PSBlKSB7Ci0JCQkJCQkJCWR1cGxpY2F0ZXMuYWRkKChEZXNjcmlwdG9yKSBlbGVtZW50KTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiBkdXBsaWNhdGVzOwotCQkKLQl9Ci0KLQkvKioKLQkgKiBDaGVja3MgaWYgdGhlIGdpdmVuIG9iamVjdCBpcyByZXByZXNlbnRpbmcgYSBpbmhlcml0ZWQgZWxlbWVudCBpbiBhIGJyZWFrZG93biBzdHJ1Y3R1cmUgdHJlZSBvZiBwcm9jZXNzIGVkaXRvcgotCSAqIAotCSAqIEBwYXJhbSBvYmplY3QKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzSW5oZXJpdGVkKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG9iamVjdCBpbnN0YW5jZW9mIERlc2NyaWJhYmxlRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIKLQkJJiYgKChEZXNjcmliYWJsZUVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKW9iamVjdCkuaXNJbmhlcml0ZWQoKTsKLQl9Ci0JCi0JLyoqCi0JICogQ2hlY2tzIGlmIHRoZSBnaXZlbiBhY3Rpdml0eSBoYXMgaW5oZXJpdGVkIGFueSBicmVha2Rvd24gZWxlbWVudCB2aWEgZXh0ZW5zaW9uIG9mIGxvY2FsIGNvbnRyaWJ1dGlvbgotCSAqIAotCSAqIEBwYXJhbSBhY3Rpdml0eQotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaGFzSW5oZXJpdGVkKEFjdGl2aXR5IGFjdGl2aXR5KSB7Ci0JCUl0ZXJhdG9yIGl0ZXIgPSBuZXcgQWJzdHJhY3RUcmVlSXRlcmF0b3IoYWN0aXZpdHkpIHsKLQotCQkJLyoqCi0JCQkgKiBDb21tZW50IGZvciA8Y29kZT5zZXJpYWxWZXJzaW9uVUlEPC9jb2RlPgotCQkJICovCi0JCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAwTDsKLQotCQkJcHJvdGVjdGVkIEl0ZXJhdG9yIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJCQlpZihvYmplY3QgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCQlyZXR1cm4gKChBY3Rpdml0eSlvYmplY3QpLmdldEJyZWFrZG93bkVsZW1lbnRzKCkuaXRlcmF0b3IoKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1QuaXRlcmF0b3IoKTsKLQkJCX0KLQkJCQotCQl9OwotCQl3aGlsZShpdGVyLmhhc05leHQoKSkgewotCQkJT2JqZWN0IG8gPSBpdGVyLm5leHQoKTsKLQkJCWlmKG8gaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCUFjdGl2aXR5IGFjdCA9IChBY3Rpdml0eSkgbzsKLQkJCQlWYXJpYWJpbGl0eUVsZW1lbnQgdmUgPSBhY3QuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpOwotCQkJCWlmKHZlICE9IG51bGwpIHsKLQkJCQkJVmFyaWFiaWxpdHlUeXBlIHR5cGUgPSBhY3QuZ2V0VmFyaWFiaWxpdHlUeXBlKCk7Ci0JCQkJCWlmKHR5cGUgPT0gVmFyaWFiaWxpdHlUeXBlLkVYVEVORFMgfHwgdHlwZSA9PSBWYXJpYWJpbGl0eVR5cGUuTE9DQUxfQ09OVFJJQlVUSU9OKSB7Ci0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0NvbnRyaWJ1dGVkKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG9iamVjdCBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyCi0JCSYmICgoQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpb2JqZWN0KS5pc0NvbnRyaWJ1dGVkKCk7Ci0JfQkKLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgZ2V0QWxsU3ViVGVhbXMoVGVhbVByb2ZpbGUgdGVhbSwgTGlzdCB0ZWFtcykgewotCQl0ZWFtcy5hZGQodGVhbSk7Ci0JCUxpc3Qgc3ViVGVhbXMgPSB0ZWFtLmdldFN1YlRlYW0oKTsKLQkJZm9yIChJdGVyYXRvciBpdG9yID0gc3ViVGVhbXMuaXRlcmF0b3IoKTsgaXRvci5oYXNOZXh0KCk7KSB7Ci0JCQlUZWFtUHJvZmlsZSBzdWJUZWFtID0gKFRlYW1Qcm9maWxlKSBpdG9yLm5leHQoKTsKLQotCQkJZ2V0QWxsU3ViVGVhbXMoc3ViVGVhbSwgdGVhbXMpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIExpc3QgZ2V0VGVhbVByb2ZpbGVzKE9iamVjdCBvYmplY3QsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlciBhZGFwdGVyLCBBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlSb2xlRGVzY3JpcHRvciByb2xlRGVzYyA9IChSb2xlRGVzY3JpcHRvcikgVG5nVXRpbC51bndyYXAob2JqZWN0KTsKLQkJTGlzdCB0ZWFtcyA9IG5ldyBBcnJheUxpc3QoQXNzb2NpYXRpb25IZWxwZXIuZ2V0VGVhbVByb2ZpbGVzKHJvbGVEZXNjKSk7Ci0JCQotCQkvLyBnZXQgYWxsIHRoZSB0ZWFtIHByb2ZpbGVzIHRoYXQgYXJlIGluIHNjb3BlIG9mIHRoZSB3cmFwcGVyCi0JCS8vCi0JCUhhc2hTZXQgdmlzaWJsZVRlYW1zID0gbmV3IEhhc2hTZXQoKTsKLQkJZm9yIChPYmplY3QgcGFyZW50ID0gYWRhcHRlci5nZXRQYXJlbnQob2JqZWN0KTsgcGFyZW50ICE9IG51bGw7KSB7Ci0JCQlhZGFwdGVyID0gKElUcmVlSXRlbUNvbnRlbnRQcm92aWRlcikgYWRhcHRlckZhY3RvcnkuYWRhcHQocGFyZW50LCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwkJCi0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBhZGFwdGVyLmdldENoaWxkcmVuKHBhcmVudCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IGUgPSBUbmdVdGlsLnVud3JhcChpdGVyLm5leHQoKSk7Ci0JCQkJaWYgKGUgaW5zdGFuY2VvZiBUZWFtUHJvZmlsZSkgewotCQkJCQlMaXN0IGFjdGl2aXR5VGVhbXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCWdldEFsbFN1YlRlYW1zKChUZWFtUHJvZmlsZSkgZSwgYWN0aXZpdHlUZWFtcyk7Ci0JCQkJCWZvciAoSXRlcmF0b3IgaXRvciA9IGFjdGl2aXR5VGVhbXMuaXRlcmF0b3IoKTsgaXRvci5oYXNOZXh0KCk7KQl7Ci0JCQkJCQlPYmplY3QgbyA9IGl0b3IubmV4dCgpOwotCQkJCQkJaWYobyBpbnN0YW5jZW9mIFRlYW1Qcm9maWxlICYmICgoVGVhbVByb2ZpbGUpbykuZ2V0VGVhbVJvbGVzKCkuY29udGFpbnMocm9sZURlc2MpKSB7Ci0JCQkJCQkJdmlzaWJsZVRlYW1zLmFkZChvKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCU9iamVjdCBuZXdQYXJlbnQgPSBhZGFwdGVyLmdldFBhcmVudChwYXJlbnQpOwotCQkJaWYobmV3UGFyZW50ID09IG51bGwgJiYgcGFyZW50IGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQluZXdQYXJlbnQgPSBVbWFVdGlsLmdldFBhcmVudEFjdGl2aXR5KChBY3Rpdml0eSlwYXJlbnQpOwotCQkJfQotCQkJcGFyZW50ID0gbmV3UGFyZW50OwotCQl9Ci0JCQotCQkvLyByZW1vdmUgYW55IHRlYW0gcHJvZmlsZSB0aGF0IGlzIG5vdCBpbiB0aGUgc2NvcGUgb2YgdGhlIHdyYXBwZXIKLQkJLy8KLQkJZm9yIChJdGVyYXRvciBpdGVyID0gdGVhbXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgdGVhbSA9IGl0ZXIubmV4dCgpOwotCQkJaWYoIXZpc2libGVUZWFtcy5jb250YWlucyh0ZWFtKSkgewotCQkJCWl0ZXIucmVtb3ZlKCk7Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiB0ZWFtczsKLQotCX0KLQkKLQkvKioKLQkgKiBHZXRzIHRoZSBsaXN0IG9mIHZpc2libGUgdGVhbSBwcm9maWxlcyBmb3IgdGhlIHJvbGUgZGVzY3JpcHRvciByZXByZXNlbnRlZCBieSB0aGUgZ2l2ZW4gd3JhcHBlcgotCSAqIAotCSAqIEBwYXJhbSByb2xlRGVzY1dyYXBwZXIKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0IGdldFRlYW1Qcm9maWxlcyhSb2xlRGVzY3JpcHRvcldyYXBwZXJJdGVtUHJvdmlkZXIgcm9sZURlc2NXcmFwcGVyKSB7Ci0JCXJldHVybiBnZXRUZWFtUHJvZmlsZXMocm9sZURlc2NXcmFwcGVyLCByb2xlRGVzY1dyYXBwZXIsIHJvbGVEZXNjV3JhcHBlci5nZXRBZGFwdGVyRmFjdG9yeSgpKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBMaXN0IGdldFRlYW1Qcm9maWxlcyhSb2xlRGVzY3JpcHRvciByb2xlRGVzYywgQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyIGFkYXB0ZXIgPSAoSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyKSBhZGFwdGVyRmFjdG9yeS5hZGFwdChyb2xlRGVzYywgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJcmV0dXJuIGdldFRlYW1Qcm9maWxlcyhyb2xlRGVzYywgYWRhcHRlciwgYWRhcHRlckZhY3RvcnkpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gbGlzdCBvZiByZWN1cnNpdmUgY2hpbGQgZWxlbWVudHMgZm9yIHRoZSBnaXZlbiBhY3Rpdml0eSBhbmQgZ2l2ZW4gdHlwZQotCSAqIEBwYXJhbSBhY3QKLQkgKiBAcGFyYW0gdHlwZQotCSAqIEBwYXJhbSBjb2xsZWN0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGdldENoaWxkRWxlbWVudHMoQWN0aXZpdHkgYWN0LCBDbGFzcyB0eXBlLCBDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJZm9yIChpbnQgaSA9IGFjdC5nZXRCcmVha2Rvd25FbGVtZW50cygpLnNpemUoKSAtIDE7IGkgPiAtMTsgaS0tKSB7Ci0JCQlPYmplY3QgZWxlbWVudCA9IGFjdC5nZXRCcmVha2Rvd25FbGVtZW50cygpLmdldChpKTsKLQkJCWlmKHR5cGUuaXNJbnN0YW5jZShlbGVtZW50KSkgewotCQkJCWNvbGxlY3Rpb24uYWRkKGVsZW1lbnQpOwotCQkJfQotCQkJaWYoZWxlbWVudCBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJZ2V0Q2hpbGRFbGVtZW50cygoQWN0aXZpdHkpIGVsZW1lbnQsIHR5cGUsIGNvbGxlY3Rpb24pOwotCQkJfQotCQl9Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgSUZpbHRlciBnZXRGaWx0ZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJQWRhcHRlckZhY3Rvcnkgcm9vdEFkYXB0ZXJGYWN0b3J5ID0gVG5nVXRpbC5nZXRCZXN0QWRhcHRlckZhY3RvcnkoYWRhcHRlckZhY3RvcnkpOwotCQlpZihyb290QWRhcHRlckZhY3RvcnkgaW5zdGFuY2VvZiBDb25maWd1cmFibGVDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KSB7Ci0JCQlyZXR1cm4gKChDb25maWd1cmFibGVDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KXJvb3RBZGFwdGVyRmFjdG9yeSkuZ2V0RmlsdGVyKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qKgotCSAqIEdldHMgdGhlIGNhbGN1bGF0ZWQgbGlzdCBvZiBhcnRpZmFjdCBjb250YWluZWQgYnkgdGhlIGdpdmVuIGFydGlmYWN0IGJhc2VkIG9uIHRoZQotCSAqIGNvbmZpZ3VyYXRpb24gYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBhZGFwdGVyIGZhY3RvcnkuCi0JICogCi0JICogQHBhcmFtIGFydGlmYWN0Ci0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRDb250YWluZWRBcnRpZmFjdHMoQXJ0aWZhY3QgYXJ0aWZhY3QsIEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gbnVsbDsKLQkJSUZpbHRlciBmaWx0ZXIgPSBQcm9jZXNzVXRpbC5nZXRGaWx0ZXIoYWRhcHRlckZhY3RvcnkpOwotCQlpZihmaWx0ZXIgaW5zdGFuY2VvZiBJQ29uZmlndXJhdG9yKSB7Ci0JCQljb25maWcgPSAoKElDb25maWd1cmF0b3IpZmlsdGVyKS5nZXRNZXRob2RDb25maWd1cmF0aW9uKCk7Ci0JCX0KLQkJCi0JCWlmKGNvbmZpZyA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gYXJ0aWZhY3QuZ2V0Q29udGFpbmVkQXJ0aWZhY3RzKCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXR1cm4gKExpc3QpIFByb3ZpZGVycy5nZXRDb25maWd1cmF0aW9uQXBwbGljYXRvcigpLmdldFJlZmVyZW5jZSgKLQkJCQkJYXJ0aWZhY3QsCi0JCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEFydGlmYWN0X0NvbnRhaW5lZEFydGlmYWN0cygpLAotCQkJCQljb25maWcpOwotCQl9CQkKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBMaXN0IGdldENvbnRhaW5lZEFydGlmYWN0c0Rlc2NyaXB0b3JzKFdvcmtQcm9kdWN0RGVzY3JpcHRvciBhcnRpZmFjdERlc2MsIExpc3QgYXJ0aWZhY3REZXNjcmlwdG9ycykgewotCQlpZihhcnRpZmFjdERlc2NyaXB0b3JzLmlzRW1wdHkoKSkgewotCQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JCX0KLQkJQXJ0aWZhY3QgYXJ0aWZhY3QgPSAoQXJ0aWZhY3QpIGFydGlmYWN0RGVzYy5nZXRXb3JrUHJvZHVjdCgpOwotCQkKLQkJLy8gY29sbGVjdCBvd24gYW5kIGNvbnRyaWJ1dGluZyBzdWJhcnRpZmFjdCBkZXNjcmlwdG9ycwotCQkvLwotCQlBcnJheUxpc3QgY29udGFpbmVkRGVzY3JpcHRvcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvcihpbnQgaSA9IGFydGlmYWN0RGVzY3JpcHRvcnMuc2l6ZSgpIC0gMTsgaSA+IC0xOyBpLS0pIHsKLQkJCVdvcmtQcm9kdWN0RGVzY3JpcHRvciB3cGQgPSAoKFdvcmtQcm9kdWN0RGVzY3JpcHRvcilhcnRpZmFjdERlc2NyaXB0b3JzLmdldChpKSk7Ci0JCQlXb3JrUHJvZHVjdCBhID0gd3BkLmdldFdvcmtQcm9kdWN0KCk7Ci0JCQlpZihhICE9IG51bGwpIHsKLQkJCQlFT2JqZWN0IGNvbnRhaW5lciA9IGEuZUNvbnRhaW5lcigpOwotCQkJCWlmKGNvbnRhaW5lciA9PSBhcnRpZmFjdCB8fCAKLQkJCQkJCShjb250YWluZXIgaW5zdGFuY2VvZiBBcnRpZmFjdCAmJiBUbmdVdGlsLmlzQ29udHJpYnV0b3JPZihhcnRpZmFjdCwgKEFydGlmYWN0KSBjb250YWluZXIpKSkgewotCQkJCQljb250YWluZWREZXNjcmlwdG9ycy5hZGQod3BkKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGNvbnRhaW5lZERlc2NyaXB0b3JzOwotCX0KLQkKLS8vCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0NvbnRhaW5lZEJ5KEFydGlmYWN0IHBhcmVudCwgQXJ0aWZhY3QgY2hpbGQsIEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0vLwkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSBudWxsOwotLy8JCUlGaWx0ZXIgZmlsdGVyID0gUHJvY2Vzc1V0aWwuZ2V0RmlsdGVyKGFkYXB0ZXJGYWN0b3J5KTsKLS8vCQlpZihmaWx0ZXIgaW5zdGFuY2VvZiBJQ29uZmlndXJhdG9yKSB7Ci0vLwkJCWNvbmZpZyA9ICgoSUNvbmZpZ3VyYXRvcilmaWx0ZXIpLmdldE1ldGhvZENvbmZpZ3VyYXRpb24oKTsKLS8vCQl9Ci0vLwkJCi0vLwkJaWYoY29uZmlnID09IG51bGwpIHsKLS8vCQkJcmV0dXJuIFVtYVV0aWwuaXNDb250YWluZWRCeShjaGlsZCwgcGFyZW50KTsKLS8vCQl9Ci0vLwkJCi0vLwkJZmluYWwgTWV0aG9kQ29uZmlndXJhdGlvbiBjZmcgPSBjb25maWc7CQkKLS8vCQlJdGVyYXRvciBpdGVyID0gbmV3IEFic3RyYWN0VHJlZUl0ZXJhdG9yKHBhcmVudCwgZmFsc2UpIHsKLS8vCi0vLwkJCS8qKgotLy8JCQkgKiBDb21tZW50IGZvciA8Y29kZT5zZXJpYWxWZXJzaW9uVUlEPC9jb2RlPgotLy8JCQkgKi8KLS8vCQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0vLwotLy8JCQlwcm90ZWN0ZWQgSXRlcmF0b3IgZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotLy8JCQkJcmV0dXJuICgoQ29sbGVjdGlvbikgUHJvdmlkZXJzLmdldENvbmZpZ3VyYXRpb25BcHBsaWNhdG9yKCkuZ2V0UmVmZXJlbmNlKAotLy8JCQkJCQkoVmFyaWFiaWxpdHlFbGVtZW50KSBvYmplY3QsCi0vLwkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEFydGlmYWN0X0NvbnRhaW5lZEFydGlmYWN0cygpLAotLy8JCQkJCQljZmcpKS5pdGVyYXRvcigpOwotLy8JCQl9Ci0vLwkJCQotLy8JCX07Ci0vLwkJd2hpbGUoaXRlci5oYXNOZXh0KCkpIHsKLS8vCQkJaWYoY2hpbGQgPT0gaXRlci5uZXh0KCkpIHsKLS8vCQkJCXJldHVybiB0cnVlOwotLy8JCQl9Ci0vLwkJfQotLy8JCQotLy8JCXJldHVybiBmYWxzZTsKLS8vCX0KLQkKLQkvKioKLQkgKiBDaGVja3MgaWYgdGhlIGdpdmVuIFdvcmtQcm9kdWN0RGVzY3JpcHRvciA8Y29kZT5wYXJlbnQ8L2NvZGU+IGNhbiByZXByZXNlbnQgdGhlIHBhcmVudCBvZiB0aGUgV29ya1Byb2R1Y3REZXNjcmlwdG9yCi0JICogPGNvZGU+Y2hpbGQ8L2NvZGU+IGJhc2VkIG9uIHRoZSByZWxhdGlvbnNoaXAgb2YgdGhlaXIgbGlua2VkIGFydGlmYWN0IGFuZCB0aGUgbGlzdCBvZiBhdmFpbGFibGUgYXJ0aWZhY3QgZGVzY3JpcHRvcnMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNDb250YWluZWRCeShXb3JrUHJvZHVjdERlc2NyaXB0b3IgcGFyZW50LCBXb3JrUHJvZHVjdERlc2NyaXB0b3IgY2hpbGQsIGZpbmFsIExpc3QgYXJ0aWZhY3REZXNjTGlzdCkgewotLy8JCUl0ZXJhdG9yIGl0ZXIgPSBuZXcgQWJzdHJhY3RUcmVlSXRlcmF0b3IocGFyZW50LCBmYWxzZSkgewotLy8JCQkKLS8vCQkJLyoqCi0vLwkJCSAqIENvbW1lbnQgZm9yIDxjb2RlPnNlcmlhbFZlcnNpb25VSUQ8L2NvZGU+Ci0vLwkJCSAqLwotLy8JCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLS8vCQkJCi0vLwkJCXByb3RlY3RlZCBJdGVyYXRvciBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0vLwkJCQlyZXR1cm4gZ2V0Q29udGFpbmVkQXJ0aWZhY3RzRGVzY3JpcHRvcnMoKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgb2JqZWN0LCBhcnRpZmFjdERlc2NMaXN0KS5pdGVyYXRvcigpOwotLy8JCQl9Ci0vLwkJCQotLy8JCX07Ci0vLwkJd2hpbGUoaXRlci5oYXNOZXh0KCkpIHsKLS8vCQkJaWYoY2hpbGQgPT0gaXRlci5uZXh0KCkpIHsKLS8vCQkJCXJldHVybiB0cnVlOwotLy8JCQl9Ci0vLwkJfQotLy8JCQotLy8JCXJldHVybiBmYWxzZTsKLQkJCi0JCXJldHVybiBVbWFVdGlsLmlzQ29udGFpbmVkQnkoY2hpbGQuZ2V0V29ya1Byb2R1Y3QoKSwgcGFyZW50LmdldFdvcmtQcm9kdWN0KCkpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgTGlzdCByZW1vdmVTdWJhcnRpZmFjdHNGcm9tQ2hpbGRyZW4oZmluYWwgQ29sbGVjdGlvbiBjaGlsZHJlbiwgYm9vbGVhbiB1bndyYXApIHsKLQkJTGlzdCBhcnRpZmFjdExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCi0JCS8vIGdldCB0aGUgYXJ0aWZhY3QgbGlzdAotCQkvLwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjaGlsZHJlbi5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBjaGlsZCA9IGl0ZXIubmV4dCgpOwotCQkJaWYodW53cmFwKSB7Ci0JCQkJY2hpbGQgPSBUbmdVdGlsLnVud3JhcChjaGlsZCk7Ci0JCQl9Ci0JCQlpZiAoY2hpbGQgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3IpIHsKLQkJCQlXb3JrUHJvZHVjdCB3cCA9ICgoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBjaGlsZCkKLQkJCQkJCS5nZXRXb3JrUHJvZHVjdCgpOwotCQkJCWlmICh3cCBpbnN0YW5jZW9mIEFydGlmYWN0KSB7Ci0JCQkJCWFydGlmYWN0TGlzdC5hZGQod3ApOwotCQkJCX0KLQkJCX0KLQkJfQotCQotCQkvLyBwcm9jZXNzIHRoZSBhcnRpZmFjdCBsaXN0IHRvIGdldCB0aGUgdG9wLW1vc3Qgb25lcwotCQkvLwotCQlTZXQgdG9wTW9zdEFydGlmYWN0cyA9IG5ldyBIYXNoU2V0KCk7Ci0JCUFydGlmYWN0IGNhbmRpZGF0ZSA9IG51bGw7Ci0JCi0JCWJvb2xlYW4gZm91bmQgPSBmYWxzZTsKLQkJd2hpbGUgKCFhcnRpZmFjdExpc3QuaXNFbXB0eSgpKSB7Ci0JCQkKLQkJCWlmICghZm91bmQpCi0JCQl7Ci0JCQkJY2FuZGlkYXRlID0gKEFydGlmYWN0KSBhcnRpZmFjdExpc3QuZ2V0KDApOwotCQkJCWFydGlmYWN0TGlzdC5yZW1vdmUoMCk7Ci0JCQl9Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBhcnRpZmFjdExpc3QuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJQXJ0aWZhY3QgYXJ0aWZhY3QgPSAoQXJ0aWZhY3QpIGl0ZXIubmV4dCgpOwotCQkJCWZvdW5kID0gZmFsc2U7Ci0JCQkJLy8gaWYoY2FuZGlkYXRlLmdldENvbnRhaW5lZEFydGlmYWN0cygpLmNvbnRhaW5zKGFydGlmYWN0KSkgewotCQkJCWlmIChVbWFVdGlsLmlzQ29udGFpbmVkQnkoYXJ0aWZhY3QsIGNhbmRpZGF0ZSkpIHsKLQkJCQkJaXRlci5yZW1vdmUoKTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAoVW1hVXRpbC5pc0NvbnRhaW5lZEJ5KGNhbmRpZGF0ZSwgYXJ0aWZhY3QpKSB7Ci0JCQkJCWl0ZXIucmVtb3ZlKCk7Ci0JCQkJCWNhbmRpZGF0ZSA9IGFydGlmYWN0OwotCQkJCQlmb3VuZCA9IHRydWU7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJCWlmICghZm91bmQgfHwgYXJ0aWZhY3RMaXN0LmlzRW1wdHkoKSkKLQkJCQl0b3BNb3N0QXJ0aWZhY3RzLmFkZChjYW5kaWRhdGUpOwotCQkJZWxzZSBpZiAoYXJ0aWZhY3RMaXN0LmlzRW1wdHkoKSkKLQkJCQkJdG9wTW9zdEFydGlmYWN0cy5hZGQoY2FuZGlkYXRlKTsJCQotCQl9Ci0JCi0JCUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGNpID0gY2hpbGRyZW4uaXRlcmF0b3IoKTsgY2kuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGNoaWxkID0gY2kubmV4dCgpOwotCQkJT2JqZWN0IGUgPSB1bndyYXAgPyBUbmdVdGlsLnVud3JhcChjaGlsZCkgOiBjaGlsZDsKLQkJCWJvb2xlYW4gc2VsZWN0ZWQgPSBmYWxzZTsKLQkJCWlmIChlIGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yKSB7Ci0JCQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yIHdwZCA9ICgoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBlKTsKLQkJCQlXb3JrUHJvZHVjdCB3cCA9IHdwZC5nZXRXb3JrUHJvZHVjdCgpOwotCQkJCWlmICghKHdwIGluc3RhbmNlb2YgQXJ0aWZhY3QpKSB7Ci0JCQkJCXNlbGVjdGVkID0gdHJ1ZTsKLQkJCQl9IGVsc2UgaWYgKHRvcE1vc3RBcnRpZmFjdHMuY29udGFpbnMod3ApKSB7Ci0JCQkJCXNlbGVjdGVkID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCXNlbGVjdGVkID0gdHJ1ZTsKLQkJCX0KLQkJCWlmIChzZWxlY3RlZCkgewotCQkJCXJlc3VsdC5hZGQoY2hpbGQpOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaGVscHMgYnVpbGQgdGhlIGFydGlmYWN0IGRlc2NyaXB0b3IgdHJlZSBjb3JyZWN0bHkKLQkgKiAKLQkgKiBAcGFyYW0gY2hpbGRyZW4KLQkgKiBAcGFyYW0gdW53cmFwCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCByZW1vdmVTdWJhcnRpZmFjdHNGcm9tQ2hpbGRyZW4oZmluYWwgQ29sbGVjdGlvbiBjaGlsZHJlbiwgYm9vbGVhbiB1bndyYXAsIEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCUxpc3QgYXJ0aWZhY3REZXNjTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQkvLyBnZXQgdGhlIGFydGlmYWN0IGxpc3QKLQkJLy8KLQkJZm9yIChJdGVyYXRvciBpdGVyID0gY2hpbGRyZW4uaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgY2hpbGQgPSBpdGVyLm5leHQoKTsKLQkJCWlmKHVud3JhcCkgewotCQkJCWNoaWxkID0gVG5nVXRpbC51bndyYXAoY2hpbGQpOwotCQkJfQotCQkJaWYgKGNoaWxkIGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yKSB7Ci0JCQkJV29ya1Byb2R1Y3Qgd3AgPSAoKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgY2hpbGQpCi0JCQkJCQkuZ2V0V29ya1Byb2R1Y3QoKTsKLQkJCQlpZiAod3AgaW5zdGFuY2VvZiBBcnRpZmFjdCkgewotCQkJCQlhcnRpZmFjdERlc2NMaXN0LmFkZChjaGlsZCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJaWYoYXJ0aWZhY3REZXNjTGlzdC5pc0VtcHR5KCkpIHsKLQkJCWlmKGNoaWxkcmVuIGluc3RhbmNlb2YgTGlzdCkgewotCQkJCXJldHVybiAoTGlzdCkgY2hpbGRyZW47Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5TGlzdChjaGlsZHJlbik7Ci0JCQl9Ci0JCX0KLQkJCi0JCS8vIHByb2Nlc3MgdGhlIGFydGlmYWN0IGxpc3QgdG8gZ2V0IHRoZSB0b3AtbW9zdCBvbmVzCi0JCS8vCi0JCVNldCB0b3BNb3N0QXJ0aWZhY3REZXNjTGlzdCA9IG5ldyBIYXNoU2V0KCk7Ci0JCUxpc3QgYXJ0aWZhY3REZXNjcmlwdG9ycyA9IG5ldyBBcnJheUxpc3QoYXJ0aWZhY3REZXNjTGlzdCk7Ci0JCVdvcmtQcm9kdWN0RGVzY3JpcHRvciBjYW5kaWRhdGUgPSBudWxsOwotCQlib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0JCXdoaWxlICghYXJ0aWZhY3REZXNjTGlzdC5pc0VtcHR5KCkpIHsKLQkJCQotCQkJaWYgKCFmb3VuZCkKLQkJCXsKLQkJCQljYW5kaWRhdGUgPSAoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBhcnRpZmFjdERlc2NMaXN0LmdldCgwKTsKLQkJCQlhcnRpZmFjdERlc2NMaXN0LnJlbW92ZSgwKTsKLQkJCX0KLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGFydGlmYWN0RGVzY0xpc3QuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yIGFydGlmYWN0RGVzYyA9IChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIGl0ZXIubmV4dCgpOwotCQkJCWZvdW5kID0gZmFsc2U7Ci0JCQkJaWYgKFByb2Nlc3NVdGlsLmlzQ29udGFpbmVkQnkoY2FuZGlkYXRlLCBhcnRpZmFjdERlc2MsIGFydGlmYWN0RGVzY3JpcHRvcnMpKSB7Ci0JCQkJCWl0ZXIucmVtb3ZlKCk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKFByb2Nlc3NVdGlsLmlzQ29udGFpbmVkQnkoYXJ0aWZhY3REZXNjLCBjYW5kaWRhdGUsIGFydGlmYWN0RGVzY3JpcHRvcnMpKSB7Ci0JCQkJCWl0ZXIucmVtb3ZlKCk7Ci0JCQkJCWNhbmRpZGF0ZSA9IGFydGlmYWN0RGVzYzsKLQotCQkJCQlmb3VuZCA9IHRydWU7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJCWlmICghZm91bmQgfHwgYXJ0aWZhY3REZXNjTGlzdC5pc0VtcHR5KCkpCi0JCQkJdG9wTW9zdEFydGlmYWN0RGVzY0xpc3QuYWRkKGNhbmRpZGF0ZSk7Ci0JCQllbHNlIGlmIChhcnRpZmFjdERlc2NMaXN0LmlzRW1wdHkoKSkKLQkJCQkJdG9wTW9zdEFydGlmYWN0RGVzY0xpc3QuYWRkKGNhbmRpZGF0ZSk7CQkKLQkJfQotCi0JCUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGNpID0gY2hpbGRyZW4uaXRlcmF0b3IoKTsgY2kuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGNoaWxkID0gY2kubmV4dCgpOwotCQkJT2JqZWN0IGUgPSB1bndyYXAgPyBUbmdVdGlsLnVud3JhcChjaGlsZCkgOiBjaGlsZDsKLQkJCWJvb2xlYW4gc2VsZWN0ZWQgPSBmYWxzZTsKLQkJCWlmIChlIGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yKSB7Ci0JCQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yIHdwZCA9ICgoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBlKTsKLQkJCQlXb3JrUHJvZHVjdCB3cCA9IHdwZC5nZXRXb3JrUHJvZHVjdCgpOwotCQkJCWlmICghKHdwIGluc3RhbmNlb2YgQXJ0aWZhY3QpKSB7Ci0JCQkJCXNlbGVjdGVkID0gdHJ1ZTsKLQkJCQl9IGVsc2UgaWYgKHRvcE1vc3RBcnRpZmFjdERlc2NMaXN0LmNvbnRhaW5zKHdwZCkpIHsKLQkJCQkJc2VsZWN0ZWQgPSB0cnVlOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJc2VsZWN0ZWQgPSB0cnVlOwotCQkJfQotCQkJaWYgKHNlbGVjdGVkKSB7Ci0JCQkJcmVzdWx0LmFkZChjaGlsZCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIEFjdGl2aXR5IGZpbmRBY3Rpdml0eShQcm9jZXNzUGFja2FnZSBwcm9jUGFja2FnZSkgewotCQlpZihwcm9jUGFja2FnZSBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpIHsKLQkJCXJldHVybiAoKFByb2Nlc3NDb21wb25lbnQpcHJvY1BhY2thZ2UpLmdldFByb2Nlc3MoKTsKLQkJfQotCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gcHJvY1BhY2thZ2UKLQkJCQkuZ2V0UHJvY2Vzc0VsZW1lbnRzKCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IKLQkJCQkuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJcmV0dXJuICgoQWN0aXZpdHkpIGVsZW1lbnQpOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0JCi0JCi0JcHVibGljIHN0YXRpYyB2b2lkIGZpeEJyZWFrZG9ud0VsZW1lbnRPcmRlclJlY3Vyc2l2ZWx5KEFjdGl2aXR5IGFjdCkgewotCQlJdGVyYXRvciBpdGVyID0gbmV3IEFic3RyYWN0VHJlZUl0ZXJhdG9yKGFjdCkgewotCi0JCQkvKioKLQkJCSAqIENvbW1lbnQgZm9yIDxjb2RlPnNlcmlhbFZlcnNpb25VSUQ8L2NvZGU+Ci0JCQkgKi8KLQkJCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDMzNjgyNjE2ODU2NjMzNTQ0NzhMOwotCi0JCQlwcm90ZWN0ZWQgSXRlcmF0b3IgZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQkJCUFycmF5TGlzdCBhY3Rpdml0aWVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSAoKEFjdGl2aXR5KW9iamVjdCkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5pdGVyYXRvcigpOyBpdGVyYXRvcgotCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCWlmKGVsZW1lbnQgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCQkJYWN0aXZpdGllcy5hZGQoZWxlbWVudCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJcmV0dXJuIGFjdGl2aXRpZXMuaXRlcmF0b3IoKTsKLQkJCX0KLQkJCQotCQl9OwotCQl3aGlsZShpdGVyLmhhc05leHQoKSkgewotCQkJZml4QnJlYWtkb3duRWxlbWVudE9yZGVyKChBY3Rpdml0eSlpdGVyLm5leHQoKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gYWN0aXZpdHkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgZml4QnJlYWtkb3duRWxlbWVudE9yZGVyKEFjdGl2aXR5IGFjdGl2aXR5KSB7Ci0JCUVMaXN0IGxpc3QgPSAoRUxpc3QpIGFjdGl2aXR5LmdldEJyZWFrZG93bkVsZW1lbnRzKCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IG5ldyBBcnJheUxpc3QobGlzdCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlCcmVha2Rvd25FbGVtZW50IGUgPSAoQnJlYWtkb3duRWxlbWVudCkgaXRlci5uZXh0KCk7Ci0JCQlCcmVha2Rvd25FbGVtZW50IHN1Y2MgPSBlLmdldFByZXNlbnRlZEFmdGVyKCk7Ci0JCQlpZihzdWNjICE9IG51bGwgJiYgc3VjYyAhPSBlKSB7Ci0JCQkJaW50IHN1Y2NJZCA9IGxpc3QuaW5kZXhPZihzdWNjKTsKLQkJCQlpZihzdWNjSWQgIT0gLTEpIHsKLQkJCQkJaW50IGlkID0gbGlzdC5pbmRleE9mKGUpOwotCQkJCQlpZihpZCAhPSBzdWNjSWQgLSAxKSB7Ci0JCQkJCQlpZihpZCA8IHN1Y2NJZCkgewotCQkJCQkJCWxpc3QubW92ZShzdWNjSWQgLSAxLCBpZCk7Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIHsKLQkJCQkJCQlsaXN0Lm1vdmUoaWQsIHN1Y2NJZCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJZS5zZXRQcmVzZW50ZWRBZnRlcihudWxsKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplcyBpdGVtIHByb3ZpZGVyIHBhdGggb2YgdGhlIGdpdmVuIGFjdGl2aXR5LCB0aGUgcGF0aCBmcm9tIHRvcCBwcm9jZXNzIHRvIHRoZSBhY3Rpdml0eQotCSAqIAotCSAqIEBwYXJhbSBhY3Rpdml0eQotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBpbml0aWFsaXplSXRlbVByb3ZpZGVyUGF0aChBY3Rpdml0eSBhY3Rpdml0eSwgQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyIGlwID0gKElUcmVlSXRlbUNvbnRlbnRQcm92aWRlcikgYWRhcHRlckZhY3RvcnkuYWRhcHQoYWN0aXZpdHksIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCUlCU0l0ZW1Qcm92aWRlciBic0lwID0gKElCU0l0ZW1Qcm92aWRlcikgaXA7Ci0JCU9iamVjdCB0b3AgPSBic0lwLmdldFRvcEl0ZW0oKTsKLQkJaWYoISh0b3AgaW5zdGFuY2VvZiBQcm9jZXNzKSB8fCAhKCgoRU9iamVjdCl0b3ApLmVDb250YWluZXIoKSBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpKSB7Ci0JCQkvLyBpdGVtIHByb3ZpZGVyIHRyZWUgb2YgdGhlIG93bmVyJ3MgcHJvY2VzcyBpcyBub3QgaW5pdGlhbGl6ZWQgeWV0Ci0JCQkvLyBpbml0aWFsaXplIGl0LgotCi0JCQkvLyBnZXQgdGhlIGFjdGl2aXR5IHBhdGgKLQkJCS8vCi0JCQlBcnJheUxpc3QgYWN0UGF0aCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWZvcihhY3Rpdml0eSA9IGFjdGl2aXR5LmdldFN1cGVyQWN0aXZpdGllcygpOyBhY3Rpdml0eSAhPSBudWxsOyBhY3Rpdml0eSA9IGFjdGl2aXR5LmdldFN1cGVyQWN0aXZpdGllcygpKSB7Ci0JCQkJYWN0UGF0aC5hZGQoMCwgYWN0aXZpdHkpOwotCQkJfQotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gYWN0UGF0aC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3QgYWN0ID0gaXRlci5uZXh0KCk7Ci0JCQkJaXAgPSAoSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyKSBhZGFwdGVyRmFjdG9yeS5hZGFwdChhY3QsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCQkJaXAuZ2V0Q2hpbGRyZW4oYWN0KTsKLQkJCX0KLQkJfQotCX0JCQotCi0JLyoqCi0JICogQ2hlY2sgaWYgdGhlIGdpdmVuIGFjdGl2aXR5IG9yIGFueSBvZiBpdHMgc3ViYWN0aXZpdGllcyBpcyBhIGNvbnRyaWJ1dG9yIG9yIHJlcGxhY2VyCi0JICogCi0JICogQHBhcmFtIGFjdGl2aXR5Ci0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBoYXNDb250cmlidXRvck9yUmVwbGFjZXIoQWN0aXZpdHkgYWN0aXZpdHkpIHsKLQkJSXRlcmF0b3IgaXRlciA9IG5ldyBBYnN0cmFjdFRyZWVJdGVyYXRvcihhY3Rpdml0eSkgewotCi0JCQkvKioKLQkJCSAqIENvbW1lbnQgZm9yIDxjb2RlPnNlcmlhbFZlcnNpb25VSUQ8L2NvZGU+Ci0JCQkgKi8KLQkJCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDBMOwotCi0JCQlwcm90ZWN0ZWQgSXRlcmF0b3IgZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQkJCWlmKG9iamVjdCBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJCUFycmF5TGlzdCBjaGlsZHJlbiA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9ICgoQWN0aXZpdHkpb2JqZWN0KS5nZXRCcmVha2Rvd25FbGVtZW50cygpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yCi0JCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCU9iamVjdCBlbGVtZW50ID0gaXRlcmF0b3IubmV4dCgpOwotCQkJCQkJaWYoZWxlbWVudCBpbnN0YW5jZW9mIFZhcmlhYmlsaXR5RWxlbWVudCkgewotCQkJCQkJCWNoaWxkcmVuLmFkZChlbGVtZW50KTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlyZXR1cm4gY2hpbGRyZW4uaXRlcmF0b3IoKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1QuaXRlcmF0b3IoKTsKLQkJCX0KLQkJCQotCQl9OwotCQkKLQkJd2hpbGUoaXRlci5oYXNOZXh0KCkpIHsKLQkJCVZhcmlhYmlsaXR5RWxlbWVudCB2ZSA9IChWYXJpYWJpbGl0eUVsZW1lbnQpIGl0ZXIubmV4dCgpOwotCQkJVmFyaWFiaWxpdHlFbGVtZW50IGJhc2UgPSB2ZS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCk7Ci0JCQlWYXJpYWJpbGl0eVR5cGUgdlR5cGUgPSB2ZS5nZXRWYXJpYWJpbGl0eVR5cGUoKTsKLQkJCWlmKGJhc2UgIT0gbnVsbCAmJiAodlR5cGUgPT0gVmFyaWFiaWxpdHlUeXBlLkNPTlRSSUJVVEVTIHx8IHZUeXBlID09IFZhcmlhYmlsaXR5VHlwZS5SRVBMQUNFUykpIHsKLS8vCQkJCVByb2Nlc3MgcHJvYyA9IFRuZ1V0aWwuZ2V0T3duaW5nUHJvY2VzcygoQnJlYWtkb3duRWxlbWVudCkgYmFzZSk7Ci0vLwkJCQlpZihwcm9jICE9IHByb2Nlc3MpIHsKLS8vCQkJCQlyZXR1cm4gdHJ1ZTsKLS8vCQkJCX0KLQkJCQkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIGZhbHNlOwotCX0JCi0JCi0JLyoqCi0JICogQHBhcmFtIHRhcmdldAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNUb3BQcm9jZXNzKE9iamVjdCB0YXJnZXQpIHsKLQkJcmV0dXJuIHRhcmdldCBpbnN0YW5jZW9mIFByb2Nlc3MgJiYgKChQcm9jZXNzKXRhcmdldCkuZUNvbnRhaW5lcigpIGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudDsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gd3BEZXNjTGlzdAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFdvcmtQcm9kdWN0RGVzY3JpcHRvciBnZXRXb3JrUHJvZHVjdERlc2NyaXB0b3IoQ29sbGVjdGlvbiBlbGVtZW50cywgV29ya1Byb2R1Y3Qgd3ApIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZWxlbWVudHMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZSA9IChPYmplY3QpIGl0ZXIubmV4dCgpOwotCQkJaWYoZSBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgewotCQkJCVdvcmtQcm9kdWN0RGVzY3JpcHRvciB3cGQgPSAoKFdvcmtQcm9kdWN0RGVzY3JpcHRvcillKTsKLQkJCQlpZih3cGQuZ2V0V29ya1Byb2R1Y3QoKSA9PSB3cCkgewotCQkJCQlyZXR1cm4gd3BkOwotCQkJCX0KLQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSB0YXNrRGVzY0xpc3QKLQkgKiBAcGFyYW0gdGFzawotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFRhc2tEZXNjcmlwdG9yIGdldFRhc2tEZXNjcmlwdG9yKENvbGxlY3Rpb24gZWxlbWVudHMsIFRhc2sgdGFzaykgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBlbGVtZW50cy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlID0gKE9iamVjdCkgaXRlci5uZXh0KCk7Ci0JCQlpZihlIGluc3RhbmNlb2YgVGFza0Rlc2NyaXB0b3IpIHsKLQkJCQlUYXNrRGVzY3JpcHRvciB0ZCA9IChUYXNrRGVzY3JpcHRvcikgZTsKLQkJCQlpZih0ZC5nZXRUYXNrKCkgPT0gdGFzaykgewotCQkJCQlyZXR1cm4gdGQ7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIG93bmluZyB3b3JrIGJyZWFrZG93biBlbGVtZW50IG9mIGEgd29yayBvcmRlci4KLQkgKiAKLQkgKiBAcGFyYW0gd29ya09yZGVyCi0JICogICAgICAgICAgICBhIHdvcmsgb3JkZXIKLQkgKiBAcmV0dXJuIGEgd29yayBicmVha2Rvd24gZWxlbWVudCB0aGF0IG93bnMgdGhlIHdvcmsgb3JkZXIgb3IKLQkgKiAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBXb3JrQnJlYWtkb3duRWxlbWVudCBnZXRPd25lcihXb3JrT3JkZXIgd29ya09yZGVyKSB7Ci0JCXJldHVybiBBc3NvY2lhdGlvbkhlbHBlci5nZXRTdWNjZXNzb3Iod29ya09yZGVyKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIENvbXBvc2VkQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIgZ2V0Q29tcG9zZWRXcmFwcGVyKE9iamVjdCBvYmplY3QpIHsKLQkJd2hpbGUoIShvYmplY3QgaW5zdGFuY2VvZiBDb21wb3NlZEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKQotCQkJCSYmIG9iamVjdCBpbnN0YW5jZW9mIElXcmFwcGVySXRlbVByb3ZpZGVyKSB7Ci0JCQlvYmplY3QgPSAoKElXcmFwcGVySXRlbVByb3ZpZGVyKW9iamVjdCkuZ2V0VmFsdWUoKTsKLQkJfQotCQlpZihvYmplY3QgaW5zdGFuY2VvZiBDb21wb3NlZEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSB7Ci0JCQlyZXR1cm4gKENvbXBvc2VkQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIG9iamVjdDsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogR2V0cyB0aGUgZGlzcGxheSBuYW1lIGZvciB0aGUgZ2l2ZW4gYnJlYWtkb3duIHN0cnVjdHVyZSBjb2x1bW4gSUQuIFRoZQotCSAqIGJyZWFrZG93biBzdHJ1Y3R1cmUgY29sdW1uIElEcyBhcmUgZGVmaW5lZCBhcyBjb25zdGFudHMgaW4KLQkgKiB7QGxpbmsgSUJTSXRlbVByb3ZpZGVyfSB0aGF0IHN0YXJ0IHdpdGggQ09MXwotCSAqIAotCSAqIEBwYXJhbSBjb2x1bW5OYW1lCi0JICogICAgICAgICAgICBvbmUgb2YgdGhlIGNvbHVtbnMgSUQgY29uc3RhbnRzIChDT0xfWFhYKSBkZWZpbmVkIGluCi0JICogICAgICAgICAgICB7QGxpbmsgSUJTSXRlbVByb3ZpZGVyfQotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBnZXRDb2x1bW5EaXNwbGF5TmFtZShTdHJpbmcgY29sdW1uSWQpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIkJTX0NvbHVtbl8iICsgY29sdW1uSWQpOyAvLyROT04tTkxTLTEkIAotCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgewotCQl9Ci0JCXJldHVybiBjb2x1bW5JZDsKLQl9Ci0JCi0JCi0JLyoqCi0JICogR2V0IGxpc3Qgb2YgdGFzayBkZXNjcmlwdG9ycyB1bmRlciBzZWxlY3RlZCBhY3Rpdml0aWVzCi0JICogQHBhcmFtIHNlbGVjdGlvbgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3QgZ2V0VGFza0Rlc2NyaXB0b3JzKExpc3Qgc2VsZWN0aW9uKSB7Ci0JCUxpc3QgdGFza0Rlc2NyaXB0b3JzID0gbmV3IEFycmF5TGlzdCgpOwotCQlFeHBvc2VkQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkgPSAoRXhwb3NlZEFkYXB0ZXJGYWN0b3J5KSBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCS5nZXRXQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0b3IgPSBzZWxlY3Rpb24uaXRlcmF0b3IoKTsgaXRvci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgaXRvck9iaiA9IGl0b3IubmV4dCgpOwotCQkJaWYgKGl0b3JPYmogaW5zdGFuY2VvZiBBY3Rpdml0eQotCQkJCQl8fCBpdG9yT2JqIGluc3RhbmNlb2YgQWN0aXZpdHlXcmFwcGVySXRlbVByb3ZpZGVyKSB7Ci0JCQkJZ2V0VGFza0Rlc2NyaXB0b3JzKGFkYXB0ZXJGYWN0b3J5LCBpdG9yT2JqLCB0YXNrRGVzY3JpcHRvcnMpOwotCQkJfQotCQkJaWYgKGl0b3JPYmogaW5zdGFuY2VvZiBUYXNrRGVzY3JpcHRvcgotCQkJCQl8fCBpdG9yT2JqIGluc3RhbmNlb2YgVGFza0Rlc2NyaXB0b3JXcmFwcGVySXRlbVByb3ZpZGVyKSB7Ci0JCQkJaWYgKCF0YXNrRGVzY3JpcHRvcnMuY29udGFpbnMoaXRvck9iaikpCi0JCQkJCXRhc2tEZXNjcmlwdG9ycy5hZGQoaXRvck9iaik7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRhc2tEZXNjcmlwdG9yczsKLQl9Ci0JCi0JCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBnZXRUYXNrRGVzY3JpcHRvcnMoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksIE9iamVjdCBhY3QsCi0JCQlMaXN0IHRhc2tEZXNjcmlwdG9ycykgewotCQlPYmplY3QgbGlzdCA9IG51bGw7Ci0JCWlmIChhY3QgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJSXRlbVByb3ZpZGVyQWRhcHRlciBhZGFwdGVyID0gKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIGFkYXB0ZXJGYWN0b3J5Ci0JCQkJCS5hZGFwdChhY3QsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCQkvLyBnZXQgY2hpbGRyZW4KLQkJCWxpc3QgPSBhZGFwdGVyLmdldENoaWxkcmVuKGFjdCk7Ci0JCX0gZWxzZSBpZiAoYWN0IGluc3RhbmNlb2YgQWN0aXZpdHlXcmFwcGVySXRlbVByb3ZpZGVyKSB7Ci0JCQlsaXN0ID0gKChXcmFwcGVySXRlbVByb3ZpZGVyKSBhY3QpLmdldENoaWxkcmVuKGFjdCk7Ci0JCX0KLQkJaWYgKGxpc3QgIT0gbnVsbCAmJiBsaXN0IGluc3RhbmNlb2YgTGlzdCkgewotCQkJTGlzdCBjaGlsZHJlbiA9IChMaXN0KSBsaXN0OwotCQkJZm9yIChJdGVyYXRvciBjaGlsZEl0ZXIgPSBjaGlsZHJlbi5pdGVyYXRvcigpOyBjaGlsZEl0ZXIuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBvYmogPSBjaGlsZEl0ZXIubmV4dCgpOwotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBBY3Rpdml0eSB8fCBvYmogaW5zdGFuY2VvZiBBY3Rpdml0eVdyYXBwZXJJdGVtUHJvdmlkZXIpIHsKLQkJCQkJZ2V0VGFza0Rlc2NyaXB0b3JzKGFkYXB0ZXJGYWN0b3J5LCBvYmosIHRhc2tEZXNjcmlwdG9ycyk7Ci0JCQkJfQotCQkJCQotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBUYXNrRGVzY3JpcHRvcgotCQkJCQkJfHwgb2JqIGluc3RhbmNlb2YgVGFza0Rlc2NyaXB0b3JXcmFwcGVySXRlbVByb3ZpZGVyKSB7Ci0JCQkJCWlmICghdGFza0Rlc2NyaXB0b3JzLmNvbnRhaW5zKG9iaikpCi0JCQkJCQl0YXNrRGVzY3JpcHRvcnMuYWRkKG9iaik7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQ2hlY2tzIGlmIHRoZSBnaXZlbiBvYmplY3QgaXMgYSBkZXNjcmlwdG9yIG9yIGl0cyB3cmFwcGVyIG9mIHJvbGxlZC11cCBhY3Rpdml0eS4KLQkgKiAKLQkgKiBAcGFyYW0gbwotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNSb2xsZWRVcERlc2NyaXB0b3IoT2JqZWN0IG8sCi0JCQlBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlpZihUbmdVdGlsLnVud3JhcChvKSBpbnN0YW5jZW9mIERlc2NyaXB0b3IpIHsKLQkJCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciBhZGFwdGVyID0gKElUcmVlSXRlbUNvbnRlbnRQcm92aWRlcikgYWRhcHRlckZhY3RvcnkuYWRhcHQobywgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCU9iamVjdCBwYXJlbnQgPSBhZGFwdGVyLmdldFBhcmVudChvKTsKLQkJCWlmKFRuZ1V0aWwudW53cmFwKHBhcmVudCkgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCU9iamVjdCBwYXJlbnRBZGFwdGVyID0gYWRhcHRlckZhY3RvcnkuYWRhcHQocGFyZW50LCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkJCXJldHVybiBwYXJlbnRBZGFwdGVyIGluc3RhbmNlb2YgSUJTSXRlbVByb3ZpZGVyIAotCQkJCSYmICgoSUJTSXRlbVByb3ZpZGVyKXBhcmVudEFkYXB0ZXIpLmlzUm9sbGVkVXAoKTsKLQkJCX0JCQkKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0vLwkvKioKLS8vCSAqIENyZWF0ZXMgYSBkZWVwIGNvcHkgb2YgYSBwcm9jZXNzIHRvIHRoZSBzcGVjaWZpZWQgcHJvY2VzcyBwYWNrYWdlLgotLy8JICogCi0vLwkgKiBAcGFyYW0gbW9uaXRvcgotLy8JICogQHBhcmFtIHByb2Nlc3MKLS8vCSAqIEBwcmFybSBuZXdQcm9jZXNzTmFtZQotLy8JICogQHBhcmFtIGRlZXBDb3B5Q29uZmlnCi0vLwkgKiBAcGFyYW0gdGFyZ2V0UGFja2FnZQotLy8JICogQHJldHVybiBQcm9jZXNzIHRoZSBuZXdseSBjcmVhdGVkIHByb2Nlc3MKLS8vCSAqLwotLy8JcHVibGljIHN0YXRpYyBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3MgZGVlcENvcHkoCi0vLwkJCUlQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgCi0vLwkJCW9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzcyBwcm9jZXNzLCAKLS8vCQkJU3RyaW5nIG5ld1Byb2Nlc3NOYW1lLAotLy8JCQlNZXRob2RDb25maWd1cmF0aW9uIGRlZXBDb3B5Q29uZmlnLCAKLS8vCQkJUHJvY2Vzc1BhY2thZ2UgdGFyZ2V0UGFja2FnZSkgewotLy8JCUNvcHlIZWxwZXIgaGVscGVyID0gbmV3IENvcHlIZWxwZXIoKTsJCi0vLwkJdHJ5IHsKLS8vCQkJcmV0dXJuIGRlZXBDb3B5KG1vbml0b3IsIHByb2Nlc3MsIG5ld1Byb2Nlc3NOYW1lLCBkZWVwQ29weUNvbmZpZywgdGFyZ2V0UGFja2FnZSwgaGVscGVyKTsKLS8vCQl9Ci0vLwkJZmluYWxseSB7Ci0vLwkJCWhlbHBlci5jbGVhcigpOwotLy8JCX0KLS8vCX0KLQkJCi0JcHVibGljIHN0YXRpYyBQcm9jZXNzIGRlZXBDb3B5KAotCQkJSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCAKLQkJCW9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzcyBwcm9jZXNzLCAKLQkJCVN0cmluZyBuZXdQcm9jZXNzTmFtZSwKLQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gZGVlcENvcHlDb25maWcsIAotCQkJUHJvY2Vzc1BhY2thZ2UgdGFyZ2V0UGFja2FnZSwKLQkJCUNvcHlIZWxwZXIgY29weUhlbHBlciwKLQkJCUlDb25maWd1cmF0b3IgY29uZmlndXJhdG9yKSB7CQkKLQkJLy8gaWYgdGhlIHRhcmdldFBhY2thZ2UgaXMgbnVsbCwgdXNlIHRoZSBzYW1lIHBhY2thZ2Ugb2YgdGhlIHNvdXJjZSBwcm9jZXNzCi0JCWlmICggdGFyZ2V0UGFja2FnZSA9PSBudWxsICkgewotCQkJdGFyZ2V0UGFja2FnZSA9IChQcm9jZXNzUGFja2FnZSlwcm9jZXNzLmVDb250YWluZXIoKS5lQ29udGFpbmVyKCk7Ci0JCX0KLQkJCi0JCS8vCQluZXcgZGVlcC1jb3BpZWQgcHJvY2VzcydzIHJlZmVyZW5jZQotCQlvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3MgbmV3UHJvY2VzcyA9IG51bGw7Ci0JCi0JCWlmKG1vbml0b3IgPT0gbnVsbCkgewotCQkJbW9uaXRvciA9IG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCk7Ci0JCX0KLQotCQlQcm9jZXNzRGVlcENvcHlDb21tYW5kIGNtZCA9IG5ldyBQcm9jZXNzRGVlcENvcHlDb21tYW5kKHByb2Nlc3MsIG5ld1Byb2Nlc3NOYW1lLCAKLQkJCQljb3B5SGVscGVyLCBkZWVwQ29weUNvbmZpZywgdGFyZ2V0UGFja2FnZSwgbW9uaXRvcixjb25maWd1cmF0b3IpOwotCQl0cnkgewotCQkJY21kLmV4ZWN1dGUoKTsKLQkJCUNvbGxlY3Rpb24gcmVzdWx0ID0gY21kLmdldFJlc3VsdCgpOwotCQkJaWYoIXJlc3VsdC5pc0VtcHR5KCkpIHsKLQkJCQluZXdQcm9jZXNzID0gKG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzcykgcmVzdWx0LnRvQXJyYXkoKVswXTsKLQkJCQkvLyBmaXggYnJlYWtkb3duIGVsZW1lbnQgb3JkZXIgb2YgYWxsIGFjdGl2aXRpZXMKLQkJCQkvLwotCQkJCWZpeEJyZWFrZG9ud0VsZW1lbnRPcmRlclJlY3Vyc2l2ZWx5KG5ld1Byb2Nlc3MpOwkKLQkJCQljbWQuY29weVN1cHByZXNzaW9uU3RhdGVzKCk7Ci0JCQl9Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQljbWQuZGlzcG9zZSgpOwotCQl9Ci0JCQotCQlyZXR1cm4gbmV3UHJvY2VzczsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGFjY2VwdChBY3Rpdml0eSBhY3QsIElGaWx0ZXIgcHJvY2Vzc0ZpbHRlciwgYm9vbGVhbiBjaGVja093bmluZ1Byb2Nlc3MpIHsKLQkJaWYocHJvY2Vzc0ZpbHRlciA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlBY3Rpdml0eSBiYXNlID0gKEFjdGl2aXR5KSBhY3QuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpOwotCQlWYXJpYWJpbGl0eVR5cGUgdHlwZSA9IGFjdC5nZXRWYXJpYWJpbGl0eVR5cGUoKTsKLQkJaWYgKGJhc2UgPT0gbnVsbCkKLQkJewotCQkJaWYoY2hlY2tPd25pbmdQcm9jZXNzKSB7Ci0JCQkJcmV0dXJuIHByb2Nlc3NGaWx0ZXIuYWNjZXB0KFRuZ1V0aWwuZ2V0T3duaW5nUHJvY2VzcyhhY3QpKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCWVsc2UgaWYodHlwZSA9PSBWYXJpYWJpbGl0eVR5cGUuRVhURU5EUyB8fCB0eXBlID09IFZhcmlhYmlsaXR5VHlwZS5MT0NBTF9DT05UUklCVVRJT04gfHwgdHlwZSA9PSBWYXJpYWJpbGl0eVR5cGUuTE9DQUxfUkVQTEFDRU1FTlQpCi0JCXsKLQkJCS8vIGNoZWNrIG93bmluZyBwcm9jZXNzIG9mIGJhc2UgYWN0aXZpdHkgb25seSBmb3IgZXh0ZW5kcyBhbmQgbG9jYWwgY29udHJpYnV0aW9uL3JlcGxhY2VtZW50Ci0JCQkvLwotCQkJYm9vbGVhbiByZXQ7Ci0JCQlkbyB7Ci0JCQkJcmV0ID0gcHJvY2Vzc0ZpbHRlci5hY2NlcHQoVG5nVXRpbC5nZXRPd25pbmdQcm9jZXNzKGJhc2UpKTsKLQkJCQl0eXBlID0gYmFzZS5nZXRWYXJpYWJpbGl0eVR5cGUoKTsKLQkJCQliYXNlID0gKEFjdGl2aXR5KSBiYXNlLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsKLQkJCX0gd2hpbGUgKHJldAotCQkJCQkmJiBiYXNlICE9IG51bGwKLQkJCQkJJiYgKHR5cGUgPT0gVmFyaWFiaWxpdHlUeXBlLkVYVEVORFMKLQkJCQkJCQl8fCB0eXBlID09IFZhcmlhYmlsaXR5VHlwZS5MT0NBTF9DT05UUklCVVRJT04gfHwgdHlwZSA9PSBWYXJpYWJpbGl0eVR5cGUuTE9DQUxfUkVQTEFDRU1FTlQpKTsKLQkJCXJldHVybiByZXQ7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBQcm9jZXNzIHRvIHdoaWNoIGFuIGFjdGl2aXR5IGJlbG9uZ3MKLQkgKiBAcGFyYW0gYWN0aXZpdHkKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBQcm9jZXNzIGdldFByb2Nlc3MoQWN0aXZpdHkgYWN0aXZpdHkpIHsKLQkJUHJvY2Vzc0NvbXBvbmVudCBwcm9jQ29tcCA9IFVtYVV0aWwuZ2V0UHJvY2Vzc0NvbXBvbmVudChhY3Rpdml0eSk7Ci0JCWlmIChwcm9jQ29tcCAhPSBudWxsKSB7Ci0JCQlvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3MgcHJvYyA9IHByb2NDb21wLmdldFByb2Nlc3MoKTsKLQkJCXJldHVybiBwcm9jOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvU2VjdGlvbkxpc3QuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9TZWN0aW9uTGlzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNDc1ODc3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9TZWN0aW9uTGlzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTE1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZEhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkFic3RyYWN0VHJlZUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5CYXNpY0VMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLlhNTFJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5tb2RlbC5Nb2RlbEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLm1vZGVsLk9yZGVySW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwubW9kZWwuT3JkZXJJbmZvQ29sbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwubW9kZWwudXRpbC5TdHJpbmdSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuU2VjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQXNzb2NpYXRpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkNvbnRlbnREZXNjcmlwdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci0KLQotLyoqCi0gKiAKLSAqIFRoaXMgY2xhc3MgZW5jYXBzdWxhdGVzIGFsbCB0aGUgbG9naWNzIHVzZWQgdG8gcmV0cmlldmUgdGhlIGxpc3Qgb2YgYWxsCi0gKiBjb250cmlidXRlZC9pbmhlcml0ZWQgc2VjdGlvbnMgb2YgdGhlIGdpdmVuIGVsZW1lbnQgYXMgd2VsbCBhcyBhbGxvd3MKLSAqIG1hbmlwdWxhdGUgdGhpcyBsaXN0LgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgU2VjdGlvbkxpc3QgZXh0ZW5kcyBCYXNpY0VMaXN0PFNlY3Rpb24+IHsKLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDMyNTc1NzI3OTc0ODcwNjkyMzNMOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE9SREVSX0lORk9fTkFNRSA9ICJzZWN0aW9ucyI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIE1hcCBERUZBVUxUX1NBVkVfT1BUSU9OUyA9IG5ldyBIYXNoTWFwKCk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEVQU19GT1JfRUxFTUVOVF9PTkxZID0gMTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNURVBTX0ZPUl9FTEVNRU5UX0FORF9QQVJFTlRTID0gMjsKLQotCXN0YXRpYyB7Ci0JCURFRkFVTFRfU0FWRV9PUFRJT05TLnB1dChYTUxSZXNvdXJjZS5PUFRJT05fRU5DT0RJTkcsICJBU0NJSSIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJpdmF0ZSBDb250ZW50RWxlbWVudCBlZGl0RWxlbWVudDsKLQotCXByaXZhdGUgYm9vbGVhbiBtaXhlZCA9IHRydWU7Ci0KLQlwcml2YXRlIGJvb2xlYW4gY2hhbmdlZCA9IGZhbHNlOwotCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0NvbnRyaWJ1dG9yKFZhcmlhYmlsaXR5RWxlbWVudCBlKSB7Ci0JCXJldHVybiBUbmdVdGlsLmlzQ29udHJpYnV0b3IoZSk7Ci0JfQotCi0JcHVibGljIFNlY3Rpb25MaXN0KENvbnRlbnRFbGVtZW50IGUsIGludCBzY29wZSkgewotCQllZGl0RWxlbWVudCA9IGU7Ci0JCWlmIChzY29wZSA9PSBTVEVQU19GT1JfRUxFTUVOVF9PTkxZKSB7Ci0JCQltaXhlZCA9IGZhbHNlOwotCQl9IGVsc2UgaWYgKHNjb3BlID09IFNURVBTX0ZPUl9FTEVNRU5UX0FORF9QQVJFTlRTKSB7Ci0JCQljYWxjdWxhdGVQYXJlbnRzT25seShlKTsKLQkJfSBlbHNlIHsKLQkJCW1peGVkID0gZmFsc2U7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgY2FsY3VsYXRlUGFyZW50c09ubHkoQ29udGVudEVsZW1lbnQgZSkgewotCQlJdGVyYXRvciBpdGVyID0gbnVsbDsKLQkJLy8gaWYoaXNDb250cmlidXRvcihlKSkgewotCQkvLyAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIiQkJCBmb3IgIiArIGUuZ2V0TmFtZSgpICsgIiA9IGNvbnRyaWJ1dGluZyBpcwotCQkvLyB0cnVlIik7Ci0JCS8vIExpc3Qgc3VwZXJzID0gbmV3IEFycmF5TGlzdCgpOwotCQkvLyBVbWFVdGlsLmdldEFsbFN1cGVycyhzdXBlcnMsIGUsIFZhcmlhYmlsaXR5VHlwZS5DT05UUklCVVRFUyk7Ci0JCS8vIHN1cGVycy5hZGQoZSk7Ci0JCS8vIGl0ZXIgPSBzdXBlcnMuaXRlcmF0b3IoKTsKLQkJLy8gfSBlbHNlIGlmKGlzRXh0ZW5kZWQoZSkpIHsKLQkJLy8gLy8gU3lzdGVtLm91dC5wcmludGxuKCIkJCQgZm9yICIgKyBlLmdldE5hbWUoKSArICIgPSBleHRlbmRpbmcgaXMKLQkJLy8gdHJ1ZSIpOwotCQkvLyBMaXN0IHN1cGVycyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJLy8gVW1hVXRpbC5nZXRBbGxTdXBlcnMoc3VwZXJzLCBlLCBWYXJpYWJpbGl0eVR5cGUuRVhURU5EUyk7Ci0JCS8vIHN1cGVycy5hZGQoZSk7Ci0JCS8vIGl0ZXIgPSBzdXBlcnMuaXRlcmF0b3IoKTsKLQkJLy8gfQotCQlpZiAoaXNDb250cmlidXRvcihlKSB8fCBpc0V4dGVuZGVkKGUpKSB7Ci0JCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIiQkJCBmb3IgIiArIGUuZ2V0TmFtZSgpICsgIiA9IGNvbnRyaWJ1dGluZyBpcwotCQkJLy8gdHJ1ZSIpOwotCQkJTGlzdCBzdXBlcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlVbWFVdGlsLmdldEFsbFN1cGVyc0JvdGgoc3VwZXJzLCBlLAotCQkJCQlWYXJpYWJpbGl0eVR5cGUuQ09OVFJJQlVURVMsCi0JCQkJCVZhcmlhYmlsaXR5VHlwZS5FWFRFTkRTKTsKLQkJCXN1cGVycy5hZGQoZSk7Ci0JCQlpdGVyID0gc3VwZXJzLml0ZXJhdG9yKCk7Ci0JCX0gZWxzZSB7Ci0JCQltaXhlZCA9IGZhbHNlOwotCQl9Ci0KLQkJaWYgKG1peGVkKSB7Ci0JCQkvLyBjcmVhdGUgYSBtYXAgb2YgR1VJRCAvIGNvbnRyaWJ1dG9yCi0JCQkvLwotCQkJT3JkZXJJbmZvIGxhdGVzdEluZm8gPSBudWxsOwotCQkJTWFwPFN0cmluZywgU2VjdGlvbj4gZ3VpZFNlY3Rpb25NYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFNlY3Rpb24+KCk7Ci0JCQlTZXQgc2VjdHMgPSBuZXcgTGlua2VkSGFzaFNldCgpOwotCQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQkJQ29udGVudEVsZW1lbnQgZWxlbWVudCA9IChDb250ZW50RWxlbWVudCkgaXRlci5uZXh0KCk7Ci0JCQkJaWYgKENvbnRlbnREZXNjcmlwdGlvbkZhY3RvcnkuaGFzUHJlc2VudGF0aW9uKGVsZW1lbnQpKSB7Ci0JCQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBlbGVtZW50LmdldFByZXNlbnRhdGlvbigpCi0JCQkJCQkJLmdldFNlY3Rpb25zKCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJCQkJU2VjdGlvbiBzZWN0ID0gKFNlY3Rpb24pIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJCWd1aWRTZWN0aW9uTWFwLnB1dChzZWN0LmdldEd1aWQoKSwgc2VjdCk7Ci0JCQkJCQlzZWN0cy5hZGQoc2VjdCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJT3JkZXJJbmZvIG9yZGVySW5mbyA9IFRuZ1V0aWwuZ2V0T3JkZXJJbmZvKGVsZW1lbnQsCi0JCQkJCQlPUkRFUl9JTkZPX05BTUUpOwotCQkJCWlmIChvcmRlckluZm8gIT0gbnVsbCkgewotCQkJCQlpZiAobGF0ZXN0SW5mbyA9PSBudWxsCi0JCQkJCQkJfHwgb3JkZXJJbmZvLmdldFRpbWVzdGFtcCgpID4gbGF0ZXN0SW5mbwotCQkJCQkJCQkJLmdldFRpbWVzdGFtcCgpKSB7Ci0JCQkJCQlsYXRlc3RJbmZvID0gb3JkZXJJbmZvOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQlpZiAobGF0ZXN0SW5mbyAhPSBudWxsKSB7Ci0JCQkJLy8gcmVvcmRlciB0aGUgc2VjdGlvbnMgYmFzZWQgb24gdGhlIGxhdGVzdCBvcmRlciBpbmZvCi0JCQkJLy8KLQkJCQlpbnQgc2l6ZSA9IGxhdGVzdEluZm8uZ2V0R1VJRHMoKS5zaXplKCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQkJT2JqZWN0IGd1aWQgPSBsYXRlc3RJbmZvLmdldEdVSURzKCkuZ2V0KGkpOwotCQkJCQlTZWN0aW9uIHNlY3QgPSBndWlkU2VjdGlvbk1hcC5nZXQoZ3VpZCk7Ci0JCQkJCWlmIChzZWN0ICE9IG51bGwpIHsKLQkJCQkJCXN1cGVyLmFkZChzZWN0KTsKLQkJCQkJCXNlY3RzLnJlbW92ZShzZWN0KTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCXN1cGVyLmFkZEFsbChzZWN0cyk7Ci0JCX0KLQl9Ci0KLQkvLyBkZXByZWNhdGUgdGhlIGZvbGxvd2luZyBjb25zdHJ1Y3RvcgotCXB1YmxpYyBTZWN0aW9uTGlzdChDb250ZW50RWxlbWVudCBlKSB7Ci0JCWVkaXRFbGVtZW50ID0gZTsKLQkJSXRlcmF0b3IgaXRlciA9IG51bGw7Ci0JCWlmIChpc0NvbnRyaWJ1dG9yKGUpIHx8IFRuZ1V0aWwuaGFzQ29udHJpYnV0b3IoZSkpIHsKLQkJCVZhcmlhYmlsaXR5RWxlbWVudCBiYXNlID0gVG5nVXRpbC5nZXRCYXNlKGUpOwotCQkJaXRlciA9IG5ldyBBYnN0cmFjdFRyZWVJdGVyYXRvcihiYXNlKSB7Ci0KLQkJCQlwcm90ZWN0ZWQgSXRlcmF0b3IgZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQkJCQlMaXN0IGNoaWxkcmVuID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gQXNzb2NpYXRpb25IZWxwZXIKLQkJCQkJCQkuZ2V0SW1tZWRpYXRlVmFyaWV0aWVzKChWYXJpYWJpbGl0eUVsZW1lbnQpIG9iamVjdCkKLQkJCQkJCQkuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJCQkJVmFyaWFiaWxpdHlFbGVtZW50IGVsZW1lbnQgPSAoVmFyaWFiaWxpdHlFbGVtZW50KSBpdGVyYXRvcgotCQkJCQkJCQkubmV4dCgpOwotCQkJCQkJaWYgKGVsZW1lbnQuZ2V0VmFyaWFiaWxpdHlUeXBlKCkgPT0gVmFyaWFiaWxpdHlUeXBlLkNPTlRSSUJVVEVTKSB7Ci0JCQkJCQkJY2hpbGRyZW4uYWRkKGVsZW1lbnQpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCXJldHVybiBjaGlsZHJlbi5pdGVyYXRvcigpOwotCQkJCX0KLQotCQkJfTsKLQkJfSBlbHNlIGlmIChpc0V4dGVuZGVkKGUpKSB7Ci0JCQlTeXN0ZW0ub3V0Ci0JCQkJCS5wcmludGxuKCIkJCQgZm9yICIgKyBlLmdldE5hbWUoKSArICIgPSBleHRlbmRlZCBpcyB0cnVlIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJTGlzdCBzdXBlcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlVbWFVdGlsLmdldEFsbFN1cGVycyhzdXBlcnMsIGUsIFZhcmlhYmlsaXR5VHlwZS5FWFRFTkRTKTsKLQkJCXN1cGVycy5hZGQoZSk7Ci0JCQlpdGVyID0gc3VwZXJzLml0ZXJhdG9yKCk7Ci0JCX0gZWxzZSB7Ci0JCQltaXhlZCA9IGZhbHNlOwotCQl9Ci0KLQkJaWYgKG1peGVkKSB7Ci0JCQkvLyBjcmVhdGUgYSBtYXAgb2YgR1VJRCAvIGNvbnRyaWJ1dG9yCi0JCQkvLwotCQkJT3JkZXJJbmZvIGxhdGVzdEluZm8gPSBudWxsOwotCQkJTWFwPFN0cmluZywgU2VjdGlvbj4gZ3VpZFNlY3Rpb25NYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFNlY3Rpb24+KCk7Ci0JCQlMaXN0IHNlY3RzID0gbmV3IExpbmtlZExpc3QoKTsKLQkJCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJCUNvbnRlbnRFbGVtZW50IGVsZW1lbnQgPSAoQ29udGVudEVsZW1lbnQpIGl0ZXIubmV4dCgpOwotCQkJCWlmIChDb250ZW50RGVzY3JpcHRpb25GYWN0b3J5Lmhhc1ByZXNlbnRhdGlvbihlbGVtZW50KSkgewotCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gZWxlbWVudC5nZXRQcmVzZW50YXRpb24oKQotCQkJCQkJCS5nZXRTZWN0aW9ucygpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCQkJCVNlY3Rpb24gc2VjdCA9IChTZWN0aW9uKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCQlndWlkU2VjdGlvbk1hcC5wdXQoc2VjdC5nZXRHdWlkKCksIHNlY3QpOwotCQkJCQkJc2VjdHMuYWRkKHNlY3QpOwotCQkJCQl9Ci0JCQkJfQotCQkJCU9yZGVySW5mbyBvcmRlckluZm8gPSBUbmdVdGlsLmdldE9yZGVySW5mbyhlbGVtZW50LAotCQkJCQkJT1JERVJfSU5GT19OQU1FKTsKLQkJCQlpZiAob3JkZXJJbmZvICE9IG51bGwpIHsKLQkJCQkJaWYgKGxhdGVzdEluZm8gPT0gbnVsbAotCQkJCQkJCXx8IG9yZGVySW5mby5nZXRUaW1lc3RhbXAoKSA+IGxhdGVzdEluZm8KLQkJCQkJCQkJCS5nZXRUaW1lc3RhbXAoKSkgewotCQkJCQkJbGF0ZXN0SW5mbyA9IG9yZGVySW5mbzsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJaWYgKGxhdGVzdEluZm8gIT0gbnVsbCkgewotCQkJCS8vIHJlb3JkZXIgdGhlIHNlY3Rpb25zIGJhc2VkIG9uIHRoZSBsYXRlc3Qgb3JkZXIgaW5mbwotCQkJCS8vCi0JCQkJaW50IHNpemUgPSBsYXRlc3RJbmZvLmdldEdVSURzKCkuc2l6ZSgpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJCU9iamVjdCBndWlkID0gbGF0ZXN0SW5mby5nZXRHVUlEcygpLmdldChpKTsKLQkJCQkJU2VjdGlvbiBzZWN0ID0gZ3VpZFNlY3Rpb25NYXAuZ2V0KGd1aWQpOwotCQkJCQlpZiAoc2VjdCAhPSBudWxsKSB7Ci0JCQkJCQlzdXBlci5hZGQoc2VjdCk7Ci0JCQkJCQlzZWN0cy5yZW1vdmUoc2VjdCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlzdXBlci5hZGRBbGwoc2VjdHMpOwotCQl9Ci0JCS8vIGVsc2UgewotCQkvLyAvLyBhZGRBbGwoZWRpdEVsZW1lbnQuZ2V0UHJlc2VudGF0aW9uKCkuZ2V0U2VjdGlvbnMoKSk7Ci0JCS8vIG1peGVkID0gZmFsc2U7Ci0JCS8vIH0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzRXh0ZW5kZWQoQ29udGVudEVsZW1lbnQgZSkgewotCQlyZXR1cm4gZS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkgIT0gbnVsbAotCQkJCSYmIGUuZ2V0VmFyaWFiaWxpdHlUeXBlKCkgPT0gVmFyaWFiaWxpdHlUeXBlLkVYVEVORFM7Ci0JfQotCi0JLyoqCi0JICogQXBwbGllcyByZWNlbnQgY2hhbmdlcyBpbiB0aGUgbGlzdAotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIGFwcGx5KCkgewotCQlpZiAoIW1peGVkIHx8ICFjaGFuZ2VkKQotCQkJcmV0dXJuOwotCi0JCS8vIHNhdmUgdGhlIG9yZGVyIGluZm8gdG8gdGhlIG9yZGVyaW5nR3VpZGUgb2YgdGhlIGVkaXRFbGVtZW50Ci0JCS8vCi0JCVN0cmluZyBzdHIgPSBlZGl0RWxlbWVudC5nZXRPcmRlcmluZ0d1aWRlKCk7Ci0JCU9yZGVySW5mb0NvbGxlY3Rpb24gb3JkZXJJbmZvcyA9IG51bGw7Ci0JCVN0cmluZ1Jlc291cmNlIHJlcyA9IG51bGw7Ci0JCWlmIChzdHIgPT0gbnVsbCB8fCBzdHIubGVuZ3RoKCkgPT0gMCkgewotCQkJb3JkZXJJbmZvcyA9IE1vZGVsRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlT3JkZXJJbmZvQ29sbGVjdGlvbigpOwotCQl9IGVsc2UgewotCQkJcmVzID0gbmV3IFN0cmluZ1Jlc291cmNlKHN0cik7Ci0JCQl0cnkgewotCQkJCXJlcy5sb2FkKG51bGwpOwotCQkJCWlmIChyZXMuZ2V0Q29udGVudHMoKS5pc0VtcHR5KCkpIHsKLQkJCQkJb3JkZXJJbmZvcyA9IE1vZGVsRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkJCQkuY3JlYXRlT3JkZXJJbmZvQ29sbGVjdGlvbigpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCW9yZGVySW5mb3MgPSAoT3JkZXJJbmZvQ29sbGVjdGlvbikgcmVzLmdldENvbnRlbnRzKCkuZ2V0KDApOwotCQkJCX0KLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJfQotCQl9Ci0KLQkJLy8gZmluZCB0aGUgb3JkZXIgaW5mb3IgZm9yIHNlY3Rpb25zCi0JCS8vCi0JCU9yZGVySW5mbyBzZWN0T3JkZXJJbmZvID0gbnVsbDsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gb3JkZXJJbmZvcy5nZXRPcmRlckluZm9zKCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQlPcmRlckluZm8gb3JkZXJJbmZvID0gKE9yZGVySW5mbykgaXRlci5uZXh0KCk7Ci0JCQlpZiAoT1JERVJfSU5GT19OQU1FLmVxdWFsc0lnbm9yZUNhc2Uob3JkZXJJbmZvLmdldE5hbWUoKSkpIHsKLQkJCQlzZWN0T3JkZXJJbmZvID0gb3JkZXJJbmZvOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0KLQkJaWYgKHNlY3RPcmRlckluZm8gPT0gbnVsbCkgewotCQkJc2VjdE9yZGVySW5mbyA9IE1vZGVsRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlT3JkZXJJbmZvKCk7Ci0JCQlzZWN0T3JkZXJJbmZvLnNldE5hbWUoT1JERVJfSU5GT19OQU1FKTsKLQkJCW9yZGVySW5mb3MuZ2V0T3JkZXJJbmZvcygpLmFkZChzZWN0T3JkZXJJbmZvKTsKLQkJfSBlbHNlIHsKLQkJCXNlY3RPcmRlckluZm8uZ2V0R1VJRHMoKS5jbGVhcigpOwotCQl9Ci0KLQkJaW50IHNpemUgPSBzaXplKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlTZWN0aW9uIHNlY3QgPSAoU2VjdGlvbikgZ2V0KGkpOwotCQkJc2VjdE9yZGVySW5mby5nZXRHVUlEcygpLmFkZChzZWN0LmdldEd1aWQoKSk7Ci0JCX0KLQkJc2VjdE9yZGVySW5mby5zZXRUaW1lc3RhbXAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpOwotCQlpZiAocmVzID09IG51bGwpIHsKLQkJCXJlcyA9IG5ldyBTdHJpbmdSZXNvdXJjZShudWxsKTsKLQkJCXJlcy5nZXRDb250ZW50cygpLmFkZChvcmRlckluZm9zKTsKLQkJfQotCQl0cnkgewotCQkJcmVzLnNhdmUoREVGQVVMVF9TQVZFX09QVElPTlMpOwotCQkJc3RyID0gcmVzLmdldFN0cmluZygpOwotCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJTZWN0aW9uTGlzdC5hcHBseSgpOiBuZXcgb3JkZXJpbmcgZ3VpZGUiKTsKLQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiLS0tLS0tIG9yZGVyaW5nR3VpZGUgc3RhcnQgLS0tLS0tIik7Ci0JCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oc3RyKTsKLQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiLS0tLS0tIG9yZGVyaW5nR3VpZGUgZW5kIC0tLS0tLSIpOwotCQkJZWRpdEVsZW1lbnQuc2V0T3JkZXJpbmdHdWlkZShzdHIpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjYW5SZW1vdmUoU2VjdGlvbiBzZWN0aW9uKSB7Ci0JCWlmIChDb250ZW50RGVzY3JpcHRpb25GYWN0b3J5Lmhhc1ByZXNlbnRhdGlvbihlZGl0RWxlbWVudCkpIHsKLQkJCXJldHVybiBlZGl0RWxlbWVudC5nZXRQcmVzZW50YXRpb24oKSA9PSBzZWN0aW9uLmVDb250YWluZXIoKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIFNlY3Rpb24gcmVtb3ZlKGludCBpbmRleCkgewotCQlpZiAobWl4ZWQpIHsKLQkJCWlmICghY2FuUmVtb3ZlKChTZWN0aW9uKSBnZXQoaW5kZXgpKSkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCVNlY3Rpb24gcmVtb3ZlZCA9IHN1cGVyLnJlbW92ZShpbmRleCk7Ci0JCQllZGl0RWxlbWVudC5nZXRQcmVzZW50YXRpb24oKS5nZXRTZWN0aW9ucygpLnJlbW92ZShyZW1vdmVkKTsKLQkJCXJldHVybiByZW1vdmVkOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIGVkaXRFbGVtZW50LmdldFByZXNlbnRhdGlvbigpLmdldFNlY3Rpb25zKCkucmVtb3ZlKGluZGV4KTsKLQkJfQotCX0KLQotCXB1YmxpYyBib29sZWFuIHJlbW92ZShPYmplY3QgbykgewotCQlpZiAoIWNhblJlbW92ZSgoU2VjdGlvbikgbykpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWlmIChtaXhlZCkgewotCQkJaWYgKHN1cGVyLnJlbW92ZShvKSkgewotCQkJCWVkaXRFbGVtZW50LmdldFByZXNlbnRhdGlvbigpLmdldFNlY3Rpb25zKCkucmVtb3ZlKG8pOwotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiBlZGl0RWxlbWVudC5nZXRQcmVzZW50YXRpb24oKS5nZXRTZWN0aW9ucygpLnJlbW92ZShvKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiByZW1vdmVBbGwoQ29sbGVjdGlvbiBjKSB7Ci0JCWlmIChtaXhlZCkgewotCQkJYm9vbGVhbiBtb2RpZmllZCA9IGZhbHNlOwotCQkJSXRlcmF0b3IgZSA9IGl0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoZS5oYXNOZXh0KCkpIHsKLQkJCQlPYmplY3QgbyA9IGUubmV4dCgpOwotCQkJCWlmIChjLmNvbnRhaW5zKG8pICYmIGNhblJlbW92ZSgoU2VjdGlvbikgbykpIHsKLQkJCQkJZS5yZW1vdmUoKTsKLQkJCQkJZWRpdEVsZW1lbnQuZ2V0UHJlc2VudGF0aW9uKCkuZ2V0U2VjdGlvbnMoKS5yZW1vdmUobyk7Ci0JCQkJCW1vZGlmaWVkID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gbW9kaWZpZWQ7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gZWRpdEVsZW1lbnQuZ2V0UHJlc2VudGF0aW9uKCkuZ2V0U2VjdGlvbnMoKS5yZW1vdmVBbGwoYyk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGQoaW50IGluZGV4LCBTZWN0aW9uIGVsZW1lbnQpIHsKLQkJaWYgKG1peGVkKSB7Ci0JCQlzdXBlci5hZGQoaW5kZXgsIGVsZW1lbnQpOwotCQkJZWRpdEVsZW1lbnQuZ2V0UHJlc2VudGF0aW9uKCkuZ2V0U2VjdGlvbnMoKS5hZGQoZWxlbWVudCk7Ci0JCQljaGFuZ2VkID0gdHJ1ZTsKLQkJfSBlbHNlIHsKLQkJCWVkaXRFbGVtZW50LmdldFByZXNlbnRhdGlvbigpLmdldFNlY3Rpb25zKCkuYWRkKGluZGV4LCBlbGVtZW50KTsKLQkJfQotCX0KLQotCXB1YmxpYyBib29sZWFuIGFkZChTZWN0aW9uIG8pIHsKLQkJYm9vbGVhbiBiID0gZWRpdEVsZW1lbnQuZ2V0UHJlc2VudGF0aW9uKCkuZ2V0U2VjdGlvbnMoKS5hZGQobyk7Ci0JCWlmIChtaXhlZCkgewotCQkJYiA9IHN1cGVyLmFkZChvKTsKLQkJCWlmIChiKQotCQkJCWNoYW5nZWQgPSB0cnVlOwotCQl9Ci0JCXJldHVybiBiOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBhZGRBbGwoQ29sbGVjdGlvbjw/IGV4dGVuZHMgU2VjdGlvbj4gYykgewotCQlib29sZWFuIGIgPSBlZGl0RWxlbWVudC5nZXRQcmVzZW50YXRpb24oKS5nZXRTZWN0aW9ucygpLmFkZEFsbChjKTsKLQkJaWYgKG1peGVkKSB7Ci0JCQliID0gc3VwZXIuYWRkQWxsKGMpOwotCQkJaWYgKGIpCi0JCQkJY2hhbmdlZCA9IHRydWU7Ci0JCX0KLQkJcmV0dXJuIGI7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gYWRkQWxsKGludCBpbmRleCwgQ29sbGVjdGlvbjw/IGV4dGVuZHMgU2VjdGlvbj4gYykgewotCQlpZiAobWl4ZWQpIHsKLQkJCWVkaXRFbGVtZW50LmdldFByZXNlbnRhdGlvbigpLmdldFNlY3Rpb25zKCkuYWRkQWxsKGMpOwotCQkJYm9vbGVhbiBiID0gc3VwZXIuYWRkQWxsKGluZGV4LCBjKTsKLQkJCWlmIChiKQotCQkJCWNoYW5nZWQgPSB0cnVlOwotCQl9Ci0JCXJldHVybiBlZGl0RWxlbWVudC5nZXRQcmVzZW50YXRpb24oKS5nZXRTZWN0aW9ucygpLmFkZEFsbChpbmRleCwgYyk7Ci0JfQotCi0JcHVibGljIFNlY3Rpb24gc2V0KGludCBpbmRleCwgU2VjdGlvbiBlbGVtZW50KSB7Ci0JCWlmIChtaXhlZCkKLQkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCQlyZXR1cm4gZWRpdEVsZW1lbnQuZ2V0UHJlc2VudGF0aW9uKCkuZ2V0U2VjdGlvbnMoKS5zZXQoaW5kZXgsIGVsZW1lbnQpOwotCX0KLQotCXB1YmxpYyB2b2lkIGNsZWFyKCkgewotCQlpZiAobWl4ZWQpCi0JCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQkJZWRpdEVsZW1lbnQuZ2V0UHJlc2VudGF0aW9uKCkuZ2V0U2VjdGlvbnMoKS5jbGVhcigpOwotCX0KLQotCXB1YmxpYyB2b2lkIG1vdmUoaW50IGluZGV4LCBTZWN0aW9uIG9iamVjdCkgewotCQlpZiAobWl4ZWQpIHsKLQkJCXN1cGVyLm1vdmUoaW5kZXgsIG9iamVjdCk7Ci0JCQljaGFuZ2VkID0gdHJ1ZTsKLQkJfSBlbHNlIHsKLQkJCSgoRUxpc3QpIGVkaXRFbGVtZW50LmdldFByZXNlbnRhdGlvbigpLmdldFNlY3Rpb25zKCkpLm1vdmUoaW5kZXgsCi0JCQkJCW9iamVjdCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgU2VjdGlvbiBtb3ZlKGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KSB7Ci0JCWlmIChtaXhlZCkgewotCQkJU2VjdGlvbiBtb3ZlZCA9IHN1cGVyLm1vdmUodGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsKLQkJCWNoYW5nZWQgPSB0cnVlOwotCQkJcmV0dXJuIG1vdmVkOwotCQl9IGVsc2UgewotCQkJcmV0dXJuICgoRUxpc3Q8U2VjdGlvbj4pIGVkaXRFbGVtZW50LmdldFByZXNlbnRhdGlvbigpLmdldFNlY3Rpb25zKCkpLm1vdmUoCi0JCQkJCXRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgU2VjdGlvbiBnZXQoaW50IGluZGV4KSB7Ci0JCWlmIChtaXhlZCkgewotCQkJcmV0dXJuIHN1cGVyLmdldChpbmRleCk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gZWRpdEVsZW1lbnQuZ2V0UHJlc2VudGF0aW9uKCkuZ2V0U2VjdGlvbnMoKS5nZXQoaW5kZXgpOwotCQl9Ci0JfQotCi0JcHVibGljIGludCBzaXplKCkgewotCQlpZiAobWl4ZWQpIHsKLQkJCXJldHVybiBzdXBlci5zaXplKCk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gZWRpdEVsZW1lbnQuZ2V0UHJlc2VudGF0aW9uKCkuZ2V0U2VjdGlvbnMoKS5zaXplKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgSXRlcmF0b3IgaXRlcmF0b3IoKSB7Ci0JCWlmIChtaXhlZCkgewotCQkJcmV0dXJuIHN1cGVyLml0ZXJhdG9yKCk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gZWRpdEVsZW1lbnQuZ2V0UHJlc2VudGF0aW9uKCkuZ2V0U2VjdGlvbnMoKS5pdGVyYXRvcigpOwotCQl9Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY29udGFpbnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAobWl4ZWQpIHsKLQkJCXJldHVybiBzdXBlci5jb250YWlucyhvYmplY3QpOwotCQl9Ci0JCXJldHVybiBlZGl0RWxlbWVudC5nZXRQcmVzZW50YXRpb24oKS5nZXRTZWN0aW9ucygpLmNvbnRhaW5zKG9iamVjdCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY29udGFpbnNBbGwoQ29sbGVjdGlvbjw/PiBjb2xsZWN0aW9uKSB7Ci0JCWlmIChtaXhlZCkKLQkJCXJldHVybiBzdXBlci5jb250YWluc0FsbChjb2xsZWN0aW9uKTsKLQkJcmV0dXJuIGVkaXRFbGVtZW50LmdldFByZXNlbnRhdGlvbigpLmdldFNlY3Rpb25zKCkuY29udGFpbnNBbGwoCi0JCQkJY29sbGVjdGlvbik7Ci0JfQotCi0JcHVibGljIE9iamVjdFtdIHRvQXJyYXkoKSB7Ci0JCWlmIChtaXhlZCkgewotCQkJcmV0dXJuIHN1cGVyLnRvQXJyYXkoKTsKLQkJfQotCQlyZXR1cm4gZWRpdEVsZW1lbnQuZ2V0UHJlc2VudGF0aW9uKCkuZ2V0U2VjdGlvbnMoKS50b0FycmF5KCk7Ci0JfQotCi0JcHVibGljIE9iamVjdFtdIHRvQXJyYXkoT2JqZWN0W10gYXJyYXkpIHsKLQkJaWYgKG1peGVkKQotCQkJcmV0dXJuIHN1cGVyLnRvQXJyYXkoYXJyYXkpOwotCQlyZXR1cm4gZWRpdEVsZW1lbnQuZ2V0UHJlc2VudGF0aW9uKCkuZ2V0U2VjdGlvbnMoKS50b0FycmF5KGFycmF5KTsKLQl9Ci0KLQlwdWJsaWMgaW50IGluZGV4T2YoT2JqZWN0IG9iamVjdCkgewotCQlpZiAobWl4ZWQpCi0JCQlyZXR1cm4gc3VwZXIuaW5kZXhPZihvYmplY3QpOwotCQlyZXR1cm4gZWRpdEVsZW1lbnQuZ2V0UHJlc2VudGF0aW9uKCkuZ2V0U2VjdGlvbnMoKS5pbmRleE9mKG9iamVjdCk7Ci0JfQotCi0JcHVibGljIGludCBsYXN0SW5kZXhPZihPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChtaXhlZCkKLQkJCXJldHVybiBzdXBlci5sYXN0SW5kZXhPZihvYmplY3QpOwotCQlyZXR1cm4gZWRpdEVsZW1lbnQuZ2V0UHJlc2VudGF0aW9uKCkuZ2V0U2VjdGlvbnMoKS5sYXN0SW5kZXhPZihvYmplY3QpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzTWl4ZWQoKSB7Ci0JCXJldHVybiBtaXhlZDsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvU3RlcExpc3QuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9TdGVwTGlzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNTUwZWFkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9TdGVwTGlzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaWJhYmxlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlNlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5Bc3NvY2lhdGlvbkhlbHBlcjsKLQotCi0vKioKLSAqIFJlb3JkZXIgc3RlcHMKLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFN0ZXBMaXN0IHsKLQotCS8qKgotCSAqIENvbW1lbnQgZm9yIDxjb2RlPnNlcmlhbFZlcnNpb25VSUQ8L2NvZGU+Ci0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMzI1NzU2NzMyNTg0OTg1ODg3MUw7Ci0KLQlwcml2YXRlIHN0YXRpYyBEZXNjcmliYWJsZUVsZW1lbnQgZ2V0RGVzY3JpYmFibGVFbGVtZW50KFNlY3Rpb24gc3RlcCkgewotCQlyZXR1cm4gKERlc2NyaWJhYmxlRWxlbWVudCkgc3RlcC5lQ29udGFpbmVyKCkuZUNvbnRhaW5lcigpOwotCX0KLQotCXByaXZhdGUgVGFzayBjdXJyZW50VGFzazsKLQotCXByaXZhdGUgTGlua2VkTGlzdCBzdGVwTGlzdHM7Ci0KLQlwdWJsaWMgU3RlcExpc3QoVGFzayBjdXJyZW50VGFzaywgTGlzdCBzdGVwTGlzdHMpIHsKLQkJdGhpcy5jdXJyZW50VGFzayA9IGN1cnJlbnRUYXNrOwotCQl0aGlzLnN0ZXBMaXN0cyA9IG5ldyBMaW5rZWRMaXN0KHN0ZXBMaXN0cyk7Ci0JCXJlb3JkZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHZvaWQgcmVvcmRlcigpIHsKLQkJTWFwIG93bmVyU2VjdGlvbnNNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQlpbnQgc2l6ZSA9IHN0ZXBMaXN0cy5zaXplKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlFY29yZUVMaXN0IGVMaXN0ID0gKEVjb3JlRUxpc3QpIHN0ZXBMaXN0cy5nZXQoaSk7Ci0JCQlvd25lclNlY3Rpb25zTWFwLnB1dChlTGlzdC5nZXROb3RpZmllcigpLCBlTGlzdCk7Ci0JCX0KLQkJZm9yIChJdGVyYXRvciBpdGVyID0gbmV3IEFycmF5TGlzdChzdGVwTGlzdHMpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkuaGFzTmV4dCgpOykgewotCQkJTGlzdCBzdGVwTGlzdCA9IChMaXN0KSBpdGVyLm5leHQoKTsKLQkJCWlmICghc3RlcExpc3QuaXNFbXB0eSgpKSB7Ci0JCQkJU2VjdGlvbiBzdGVwID0gKFNlY3Rpb24pIHN0ZXBMaXN0LmdldCgwKTsKLQkJCQlTZWN0aW9uIHByZWQgPSBzdGVwLmdldFByZWRlY2Vzc29yKCk7Ci0JCQkJaWYgKHByZWQgPT0gbnVsbCkgewotCQkJCQlMaXN0IG9sZEZpcnN0TGlzdCA9IChMaXN0KSBzdGVwTGlzdHMuZ2V0KDApOwotCi0JCQkJCS8vIHB1dCB0aGlzIHN0ZXAgbGlzdCBhdCBiZWdpbm5pbmcKLQkJCQkJLy8KLQkJCQkJc3RlcExpc3RzLnJlbW92ZShzdGVwTGlzdCk7Ci0JCQkJCXN0ZXBMaXN0cy5hZGQoMCwgc3RlcExpc3QpOwotCi0JCQkJCS8vIHNldCB0aGlzIHN0ZXAgbGlzdCB0byBiZSB0aGUgcHJlZGVjZXNzb3Igb2YgdGhlIHByZXZpb3VzCi0JCQkJCS8vIGZpcnN0IGxpc3QKLQkJCQkJLy8KLQkJCQkJaWYgKCFvbGRGaXJzdExpc3QuaXNFbXB0eSgpKSB7Ci0JCQkJCQlTZWN0aW9uIG9sZEZpcnN0U3RlcCA9IChTZWN0aW9uKSBvbGRGaXJzdExpc3QuZ2V0KDApOwotCQkJCQkJaWYgKFRuZ1V0aWwuY2FuUmVmZXJlbmNlKAotCQkJCQkJCQlnZXREZXNjcmliYWJsZUVsZW1lbnQob2xkRmlyc3RTdGVwKSwKLQkJCQkJCQkJZ2V0RGVzY3JpYmFibGVFbGVtZW50KHN0ZXApKSkgewotCQkJCQkJCW9sZEZpcnN0U3RlcC5zZXRQcmVkZWNlc3NvcihzdGVwKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCUxpc3QgcHJlZExpc3QgPSAoTGlzdCkgb3duZXJTZWN0aW9uc01hcC5nZXQocHJlZAotCQkJCQkJCS5lQ29udGFpbmVyKCkpOwotCQkJCQlzdGVwTGlzdHMucmVtb3ZlKHByZWRMaXN0KTsKLQkJCQkJaW50IGlkID0gc3RlcExpc3RzLmluZGV4T2Yoc3RlcExpc3QpOwotCQkJCQlzdGVwTGlzdHMuYWRkKGlkLCBwcmVkTGlzdCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLy8gcHJpdmF0ZSB2b2lkIHJlYXNzaWduUHJlZGVjZXNzb3JzKCkgewotCS8vCi0JLy8gfQotCi0JcHVibGljIExpc3QgZ2V0U3RlcHMoKSB7Ci0JCUxpc3QgYWxsU3RlcHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWludCBzaXplID0gc3RlcExpc3RzLnNpemUoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCUxpc3Qgc3RlcHMgPSAoTGlzdCkgc3RlcExpc3RzLmdldChpKTsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHN0ZXBzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCWFsbFN0ZXBzLmFkZChpdGVyLm5leHQoKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGFsbFN0ZXBzOwotCX0KLQotCXB1YmxpYyBib29sZWFuIG1vdmVVcChTZWN0aW9uIHN0ZXApIHsKLQkJTGlzdCBzdGVwcyA9IGN1cnJlbnRUYXNrLmdldFByZXNlbnRhdGlvbigpLmdldFNlY3Rpb25zKCk7Ci0JCWludCBpZCA9IHN0ZXBzLmluZGV4T2Yoc3RlcCk7Ci0JCWlmIChpZCA9PSAtMSkKLQkJCXJldHVybiBmYWxzZTsKLQkJaWYgKGlkID4gMCkgewotCQkJaWYgKGlkID09IDEpIHsKLQotCQkJfQotCQkJLy8gbW92ZSB0aGUgc3RlcCB3aXRoaW4gaXRzIGxpc3QKLQkJCS8vCi0JCQlDb2xsZWN0aW9ucy5zd2FwKHN0ZXBzLCBpZCAtIDEsIGlkKTsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCS8vIG1vdmUgdGhlIHdob2xlIHN0ZXAgbGlzdCB1cAotCQkvLwotCQlpZCA9IHN0ZXBMaXN0cy5pbmRleE9mKHN0ZXBzKTsKLQkJaWYgKGlkID09IC0xKQotCQkJcmV0dXJuIGZhbHNlOwotCQlMaXN0IHByZWRMaXN0ID0gbnVsbDsKLQkJaW50IHByZWRMaXN0SWQgPSBpZCAtIDE7Ci0JCS8vIGxvb2sgZm9yIG5vbi1lbXB0eSBwcmVkZWNlc3NvciBsaXN0Ci0JCS8vCi0JCWZpbmRfcHJlZExpc3Q6IGZvciAoOyBwcmVkTGlzdElkID4gLTE7IHByZWRMaXN0SWQtLSkgewotCQkJTGlzdCBsaXN0ID0gKExpc3QpIHN0ZXBMaXN0cy5nZXQocHJlZExpc3RJZCk7Ci0JCQlpZiAoIWxpc3QuaXNFbXB0eSgpKSB7Ci0JCQkJcHJlZExpc3QgPSBsaXN0OwotCQkJCWJyZWFrIGZpbmRfcHJlZExpc3Q7Ci0JCQl9Ci0JCX0KLQkJU2VjdGlvbiBvbGRQcmVkID0gKChTZWN0aW9uKSBzdGVwcy5nZXQoMCkpLmdldFByZWRlY2Vzc29yKCk7Ci0JCUxpc3Qgb2xkU3VjY2Vzc29ycyA9IEFzc29jaWF0aW9uSGVscGVyLmdldFN1Y2Nlc3NvcnMoKFNlY3Rpb24pIHN0ZXBzCi0JCQkJLmdldChzdGVwcy5zaXplKCkgLSAxKSk7Ci0JCWlmIChwcmVkTGlzdCAhPSBudWxsKSB7Ci0JCQlzdGVwTGlzdHMucmVtb3ZlKHN0ZXBzKTsKLQkJCXN0ZXBMaXN0cy5hZGQocHJlZExpc3RJZCwgc3RlcHMpOwotCQkJU2VjdGlvbiBsYXN0ID0gKFNlY3Rpb24pIHByZWRMaXN0LmdldChwcmVkTGlzdC5zaXplKCkgLSAxKTsKLQkJCUxpc3Qgb2xkUHJlZFN1Y2Nlc3NvcnMgPSBBc3NvY2lhdGlvbkhlbHBlci5nZXRTdWNjZXNzb3JzKGxhc3QpOwotCQkJaWYgKFRuZ1V0aWwuY2FuUmVmZXJlbmNlKGN1cnJlbnRUYXNrLCBnZXREZXNjcmliYWJsZUVsZW1lbnQobGFzdCkpKSB7Ci0JCQkJc3RlcC5zZXRQcmVkZWNlc3NvcihsYXN0KTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBvbGRQcmVkU3VjY2Vzc29ycy5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQlTZWN0aW9uIHNlY3QgPSAoU2VjdGlvbikgaXRlci5uZXh0KCk7Ci0JCQkJCXNlY3Quc2V0UHJlZGVjZXNzb3Ioc3RlcCk7Ci0JCQkJfQotCQkJfQotCQl9IGVsc2UgewotCQkJc3RlcExpc3RzLmFkZCgwLCBzdGVwcyk7Ci0JCX0KLQkJRGVzY3JpYmFibGVFbGVtZW50IG9sZFByZWRUYXNrID0gZ2V0RGVzY3JpYmFibGVFbGVtZW50KG9sZFByZWQpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBvbGRTdWNjZXNzb3JzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJU2VjdGlvbiBzZWN0ID0gKFNlY3Rpb24pIGl0ZXIubmV4dCgpOwotCQkJaWYgKFRuZ1V0aWwuY2FuUmVmZXJlbmNlKGdldERlc2NyaWJhYmxlRWxlbWVudChzZWN0KSwgb2xkUHJlZFRhc2spKSB7Ci0JCQkJc2VjdC5zZXRQcmVkZWNlc3NvcihvbGRQcmVkKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIG1vdmVEb3duKFNlY3Rpb24gc3RlcCkgewotCQlMaXN0IHN0ZXBzID0gY3VycmVudFRhc2suZ2V0UHJlc2VudGF0aW9uKCkuZ2V0U2VjdGlvbnMoKTsKLQkJaW50IGlkID0gc3RlcHMuaW5kZXhPZihzdGVwKTsKLQkJaWYgKGlkID09IC0xKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAoaWQgPCBzdGVwcy5zaXplKCkgLSAxKSB7Ci0JCQkvLyBtb3ZlIHRoZSBzdGVwIHdpdGhpbiBpdHMgbGlzdAotCQkJLy8KLQkJCUNvbGxlY3Rpb25zLnN3YXAoc3RlcHMsIGlkICsgMSwgaWQpOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJLy8gbW92ZSB0aGUgd2hvbGUgc3RlcCBsaXN0IHVwCi0JCS8vCi0JCWlkID0gc3RlcExpc3RzLmluZGV4T2Yoc3RlcHMpOwotCQlpZiAoaWQgPT0gLTEpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCUxpc3Qgc3VjY0xpc3QgPSBudWxsOwotCQlpbnQgc3VjY0xpc3RJZCA9IGlkICsgMTsKLQkJaW50IHNpemUgPSBzdGVwTGlzdHMuc2l6ZSgpOwotCi0JCS8vIGxvb2sgZm9yIG5vbi1lbXB0eSBzdWNjZXNzb3IgbGlzdAotCQkvLwotCQlmaW5kX0xpc3Q6IGZvciAoOyBzdWNjTGlzdElkIDwgc2l6ZTsgc3VjY0xpc3RJZCsrKSB7Ci0JCQlMaXN0IGxpc3QgPSAoTGlzdCkgc3RlcExpc3RzLmdldChzdWNjTGlzdElkKTsKLQkJCWlmICghbGlzdC5pc0VtcHR5KCkpIHsKLQkJCQlzdWNjTGlzdCA9IGxpc3Q7Ci0JCQkJYnJlYWsgZmluZF9MaXN0OwotCQkJfQotCQl9Ci0JCWlmIChzdWNjTGlzdCAhPSBudWxsKSB7Ci0JCQlzdGVwTGlzdHMucmVtb3ZlKHN1Y2NMaXN0KTsKLQkJCXN0ZXBMaXN0cy5hZGQoaWQsIHN1Y2NMaXN0KTsKLQkJfSBlbHNlIHsKLQkJCXN0ZXBMaXN0cy5hZGQoc3RlcHMpOwotCQl9Ci0KLQkJcmV0dXJuIHRydWU7Ci0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9TdXBwcmVzc2lvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL1N1cHByZXNzaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxY2YyN2YuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL1N1cHByZXNzaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTkzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQWJzdHJhY3RDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5BZGFwdGVyRmFjdG9yeVRyZWVJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5XcmFwcGVySXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JUmVzb3VyY2VBd2FyZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkJTQWN0aXZpdHlJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5Db21wb3NlZEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5JQlNJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQuUmVtb3ZlVW51c2VkRGVzY3JpcHRvcnNDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BcnRpZmFjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db25zdHJhaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRlYW1Qcm9maWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya0JyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLmltcGwuTXVsdGlSZXNvdXJjZUVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS51dGlsLk9wcG9zaXRlRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQXNzb2NpYXRpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci0KLWltcG9ydCBjb20uaWJtLmljdS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGNhbGN1bGF0ZXMgdGhlIHN1cHByZXNzaW9uIHN0YXRlLCBib3RoIGRpcmVjdCBhbmQgaW5kaXJlY3QsIG9mIGFueQotICogYnJlYWtkb3duIGVsZW1lbnQgb3IgaXRzIHdyYXBwZXIgaW4gdGhlIHNwZWNpZmllZCBwcm9jZXNzLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgU3VwcHJlc3Npb24gewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0JTID0gIndicyI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRCUyA9ICJ0YnMiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXUEJTID0gIndwYnMiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDQlMgPSAiY2JzIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwIHByb2NUb1N1cHByZXNzaW9uTWFwID0gbmV3IEhhc2hNYXAoKTsKLQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gYXV0b0luaGVyaXRJbnRlcm1lZGlhdGVTdXBwcmVzc2lvblN0YXRlID0gdHJ1ZTsKLQotCXByb3RlY3RlZCBQcm9jZXNzIHByb2Nlc3M7Ci0KLQlwcml2YXRlIFNldCBzdXBwcmVzc2VkRXh0ZXJuYWxFbGVtZW50UGF0aHM7Ci0KLQlwcml2YXRlIGJvb2xlYW4gbW9kaWZpZWQ7Ci0KLQlwcml2YXRlIFNldCBpbnRlcm5hbFVuc3VwcHJlc3NlZEVsZW1lbnRzID0gbmV3IEhhc2hTZXQoKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgdm9pZCBjbGVhckNhY2hlZFN1cHByZXNzaW9ucygpIHsKLQkJcHJvY1RvU3VwcHJlc3Npb25NYXAuY2xlYXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmVzIHN1cHByZXNzaW9ucyBvZiBpbnZhbGlkIHByb2Nlc3NlcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgdm9pZCBjbGVhblVwKCkgewotCQlBcnJheUxpc3QgbGlzdFRvUmVtb3ZlID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBuZXcgQXJyYXlMaXN0KHByb2NUb1N1cHByZXNzaW9uTWFwLmtleVNldCgpKQotCQkJCS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCVByb2Nlc3MgcHJvYyA9IChQcm9jZXNzKSBpdGVyLm5leHQoKTsKLQkJCWlmIChwcm9jLmVJc1Byb3h5KCkpIHsKLQkJCQlsaXN0VG9SZW1vdmUuYWRkKHByb2MpOwotCQkJfQotCQl9Ci0JCWludCBzaXplID0gbGlzdFRvUmVtb3ZlLnNpemUoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCXByb2NUb1N1cHByZXNzaW9uTWFwLnJlbW92ZShsaXN0VG9SZW1vdmUuZ2V0KGkpKTsKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgdm9pZCBzZXRBdXRvSW5oZXJpdFN1cHByZXNzaW9uU3RhdGVzKGJvb2xlYW4gYikgewotCQlhdXRvSW5oZXJpdEludGVybWVkaWF0ZVN1cHByZXNzaW9uU3RhdGUgPSBiOwotCX0KLQotCXB1YmxpYyBTdXBwcmVzc2lvbihQcm9jZXNzIHByb2Nlc3MpIHsKLQkJdGhpcy5wcm9jZXNzID0gcHJvY2VzczsKLQkJc3VwcHJlc3NlZEV4dGVybmFsRWxlbWVudFBhdGhzID0gbG9hZFN1cHByZXNzZWRFbGVtZW50UGF0aHMoKTsKLQl9Ci0KLQlwdWJsaWMgUHJvY2VzcyBnZXRQcm9jZXNzKCkgewotCQlyZXR1cm4gcHJvY2VzczsKLQl9Ci0KLQlwcml2YXRlIFNldCBsb2FkU3VwcHJlc3NlZEVsZW1lbnRQYXRocygpIHsKLQkJQ29uc3RyYWludCBydWxlID0gQ29uc3RyYWludE1hbmFnZXIuZ2V0Q29uc3RyYWludChwcm9jZXNzLAotCQkJCUNvbnN0cmFpbnRNYW5hZ2VyLlBST0NFU1NfU1VQUFJFU1NJT04sIGZhbHNlKTsgLy8gKENvbnN0cmFpbnQpCi0JCS8vIHByb2Nlc3MuZ2V0T3duZWRSdWxlcygpLmdldCgwKTsKLQkJaWYgKHJ1bGUgIT0gbnVsbCAmJiBydWxlLmdldEJvZHkoKS5sZW5ndGgoKSA+IDApIHsKLQkJCVNldCBwYXRocyA9IG5ldyBIYXNoU2V0KCk7Ci0JCQlmb3IgKFN0cmluZ1Rva2VuaXplciB0b2tlbnMgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHJ1bGUuZ2V0Qm9keSgpKTsgdG9rZW5zCi0JCQkJCS5oYXNNb3JlVG9rZW5zKCk7KSB7Ci0JCQkJcGF0aHMuYWRkKHRva2Vucy5uZXh0VG9rZW4oKSk7Ci0JCQl9Ci0JCQlyZXR1cm4gcGF0aHM7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBTZXQgZ2V0U3VwcHJlc3NlZEV4dGVybmFsRWxlbWVudFBhdGhzKCkgewotCQlpZiAoc3VwcHJlc3NlZEV4dGVybmFsRWxlbWVudFBhdGhzID09IG51bGwpIHsKLQkJCXN1cHByZXNzZWRFeHRlcm5hbEVsZW1lbnRQYXRocyA9IGxvYWRTdXBwcmVzc2VkRWxlbWVudFBhdGhzKCk7Ci0JCQlpZiAoc3VwcHJlc3NlZEV4dGVybmFsRWxlbWVudFBhdGhzID09IG51bGwpIHsKLQkJCQlzdXBwcmVzc2VkRXh0ZXJuYWxFbGVtZW50UGF0aHMgPSBuZXcgSGFzaFNldCgpOwotCQkJfQotCQl9Ci0JCXJldHVybiBzdXBwcmVzc2VkRXh0ZXJuYWxFbGVtZW50UGF0aHM7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHByb2Nlc3MKLQkgKiBAcGFyYW0gc2VsZWN0aW9uCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc1N1cHByZXNzZWQoQ29sbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gc2VsZWN0aW9uLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyLm5leHQoKTsKLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIHsKLQkJCQlpZiAoaXNTdXBwcmVzc2VkKChCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgZWxlbWVudCkpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudCkgewotCQkJCWlmIChpc1N1cHByZXNzZWQoKEJyZWFrZG93bkVsZW1lbnQpIGVsZW1lbnQpKSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQ2hlY2tzIGlmIHRoZSBnaXZlbiBzZWxlY3Rpb24gaGFzIGFueSBlbGVtZW50IHRoYXQgaXMgbm90IHN1cHByZXNzZWQgeWV0Ci0JICogaW4gdGhpcyBzdXBwcmVzc2lvbidzIHByb2Nlc3MKLQkgKiAKLQkgKiBAcGFyYW0gc2VsZWN0aW9uCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBib29sZWFuIGNhblN1cHByZXNzKENvbGxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCXJldHVybiBjYW5EbyhzZWxlY3Rpb24sIHRydWUpOwotCX0KLQotCS8qKgotCSAqIENoZWNrcyBpZiB0aGUgZ2l2ZW4gc2VsZWN0aW9uIGhhcyBhbnkgZWxlbWVudCB0aGF0IGlzIHN1cHByZXNzZWQgaW4gdGhpcwotCSAqIHN1cHByZXNzaW9uJ3MgcHJvY2VzcwotCSAqIAotCSAqIEBwYXJhbSBzZWxlY3Rpb24KLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2FuUmV2ZWFsKENvbGxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCXJldHVybiBjYW5EbyhzZWxlY3Rpb24sIGZhbHNlKTsKLQl9Ci0KLQkvKioKLQkgKiBFeHRyYWN0cyBpdGVtcyBmcm9tIHRoZSBnaXZlbiBzZWxlY3Rpb24gdGhhdCBjYW4gYmUgc3VwcHJlc3NlZC9yZXZlYWxlZAotCSAqIChkZXBlbmRpbmcgb24gdGhlIDxjb2RlPnN1cHByZXNzZWQ8L2NvZGU+IHBhcmFtZXRlcikKLQkgKiAKLQkgKiBAcGFyYW0gc2VsZWN0aW9uCi0JICogQHBhcmFtIHN1cHByZXNzZWQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBDb2xsZWN0aW9uIGdldEFwcGxpY2FibGVJdGVtcyhDb2xsZWN0aW9uIHNlbGVjdGlvbiwKLQkJCWJvb2xlYW4gc3VwcHJlc3NlZCkgewotCQlBcnJheUxpc3QgYXBwbGljYWJsZUl0ZW1zID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBzZWxlY3Rpb24uaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZWxlbWVudCA9IGl0ZXIubmV4dCgpOwotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgewotCQkJCUJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyIHdyYXBwZXIgPSAoQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIGVsZW1lbnQ7Ci0JCQkJaWYgKHdyYXBwZXIuaXNSZWFkT25seSgpKSB7Ci0JCQkJCWlmIChpc0luU3VwcHJlc3NlZExpc3Qod3JhcHBlcikgIT0gc3VwcHJlc3NlZCkgewotCQkJCQkJYXBwbGljYWJsZUl0ZW1zLmFkZChlbGVtZW50KTsKLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCU9iamVjdCBlID0gVG5nVXRpbC51bndyYXAod3JhcHBlcik7Ci0JCQkJCWlmIChlIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudAotCQkJCQkJCSYmICgoTWV0aG9kRWxlbWVudCkgZSkuZ2V0U3VwcHJlc3NlZCgpCi0JCQkJCQkJCQkuYm9vbGVhblZhbHVlKCkgIT0gc3VwcHJlc3NlZCkgewotCQkJCQkJYXBwbGljYWJsZUl0ZW1zLmFkZChlbGVtZW50KTsKLQkJCQkJfQotCQkJCX0KLQkJCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCQlpZiAoKChNZXRob2RFbGVtZW50KSBlbGVtZW50KS5nZXRTdXBwcmVzc2VkKCkuYm9vbGVhblZhbHVlKCkgIT0gc3VwcHJlc3NlZCkgewotCQkJCQlhcHBsaWNhYmxlSXRlbXMuYWRkKGVsZW1lbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gYXBwbGljYWJsZUl0ZW1zOwotCX0KLQotCS8qKgotCSAqIENoZWNrcyBpZiB0aGUgZ2l2ZW4gZWxlbWVudCBpcyB2YWxpZCB0byBzdXBwcmVzcy9yZXZlYWwgdXBvbgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1ZhbGlkKE9iamVjdCBlbGVtZW50KSB7Ci0JCS8vIGRvbid0IHNob3cgc3VwcHJlc3MvcmV2ZWFsIGZvciByb2xlZGVzY3JpcHRvciB1bmRlciB0ZWFtLCB3b3JrCi0JCS8vIHByb2R1Y3QgZGVzY3JpcHRvciB1bmRlciBkZWxpdmVyYWJsZSB3b3JrIHByb2R1Y3QsCi0JCS8vIGFuZCByb2xsZWQtdXAgaXRlbQotCQkvLwotCQlCcmVha2Rvd25FbGVtZW50IG9iaiA9IG51bGw7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIHsKLQkJCUJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyIHdyYXBwZXIgPSAoQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIGVsZW1lbnQ7Ci0JCQlpZiAod3JhcHBlci5pc1JvbGx1cENoaWxkKCkpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQlvYmogPSAoQnJlYWtkb3duRWxlbWVudCkgVG5nVXRpbC51bndyYXAod3JhcHBlcik7Ci0JCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnQpCi0JCQlvYmogPSAoQnJlYWtkb3duRWxlbWVudCkgZWxlbWVudDsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIFJvbGVEZXNjcmlwdG9yCi0JCQkJfHwgb2JqIGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yKSB7Ci0JCQlpZiAob2JqLmdldFN1cGVyQWN0aXZpdGllcygpID09IG51bGwKLQkJCQkJfHwgb2JqLmdldFN1cGVyQWN0aXZpdGllcygpID09IG51bGwpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBDaGVja3MgaWYgdGhlIGdpdmVuIHNlbGVjdGlvbiBoYXMgYW55IGl0ZW0gdGhhdCBjYW4gYmUKLQkgKiBzdXBwcmVzc2VkL3JldmVhbGVkIChkZXBlbmRpbmcgb24gdGhlIDxjb2RlPnN1cHByZXNzZWQ8L2NvZGU+Ci0JICogcGFyYW1ldGVyKQotCSAqIAotCSAqIEBwYXJhbSBzZWxlY3Rpb24KLQkgKiBAcGFyYW0gc3VwcHJlc3NlZAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gY2FuRG8oQ29sbGVjdGlvbiBzZWxlY3Rpb24sIGJvb2xlYW4gc3VwcHJlc3NlZCkgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBzZWxlY3Rpb24uaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZWxlbWVudCA9IGl0ZXIubmV4dCgpOwotCQkJaWYgKGlzVmFsaWQoZWxlbWVudCkpIHsKLQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSB7Ci0JCQkJCUJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyIHdyYXBwZXIgPSAoQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIGVsZW1lbnQ7Ci0JCQkJCWlmICh3cmFwcGVyLmlzUmVhZE9ubHkoKSkgewotCQkJCQkJaWYgKGlzSW5TdXBwcmVzc2VkTGlzdCh3cmFwcGVyKSAhPSBzdXBwcmVzc2VkKSB7Ci0JCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCQl9Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlPYmplY3QgZSA9IFRuZ1V0aWwudW53cmFwKHdyYXBwZXIpOwotCQkJCQkJaWYgKGUgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50Ci0JCQkJCQkJCSYmICgoTWV0aG9kRWxlbWVudCkgZSkuZ2V0U3VwcHJlc3NlZCgpCi0JCQkJCQkJCQkJLmJvb2xlYW5WYWx1ZSgpICE9IHN1cHByZXNzZWQpIHsKLQkJCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCQkJaWYgKCgoTWV0aG9kRWxlbWVudCkgZWxlbWVudCkuZ2V0U3VwcHJlc3NlZCgpCi0JCQkJCQkJLmJvb2xlYW5WYWx1ZSgpICE9IHN1cHByZXNzZWQpIHsKLQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBBIGJyZWFrZG93biBlbGVtZW50IGlzIHN1cHByZXNzZWQgaWYgaXRzZWxmIG9yIGFueSBvZiBpdHMgcGFyZW50IGFjdGl2aXR5Ci0JICogaXMgc3VwcHJlc3NlZAotCSAqIAotCSAqIEBwYXJhbSBlCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBfX2lzU3VwcHJlc3NlZChCcmVha2Rvd25FbGVtZW50IGUpIHsKLQkJcmV0dXJuIGdldFN1cHByZXNzZWQoZSwgdHJ1ZSwgbnVsbCkgIT0gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzRGlyZWN0bHlTdXBwcmVzc2VkKE1ldGhvZEVsZW1lbnQgZSkgewotCQlCb29sZWFuIGIgPSBlLmdldFN1cHByZXNzZWQoKTsKLQkJaWYgKGIgIT0gbnVsbCAmJiBiLmJvb2xlYW5WYWx1ZSgpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlpZiAoZSBpbnN0YW5jZW9mIFZhcmlhYmlsaXR5RWxlbWVudCkgewotCQkJVmFyaWFiaWxpdHlFbGVtZW50IHZlID0gKFZhcmlhYmlsaXR5RWxlbWVudCkgZTsKLQkJCVZhcmlhYmlsaXR5VHlwZSB2YXJpYWJpbGl0eVR5cGUgPSB2ZS5nZXRWYXJpYWJpbGl0eVR5cGUoKTsKLQkJCWlmICh2YXJpYWJpbGl0eVR5cGUgPT0gVmFyaWFiaWxpdHlUeXBlLkVYVEVORFMKLQkJCQkJfHwgdmFyaWFiaWxpdHlUeXBlID09IFZhcmlhYmlsaXR5VHlwZS5DT05UUklCVVRFUykgewotCQkJCWlmICh2ZS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkgIT0gbnVsbCkgewotCQkJCQlyZXR1cm4gaXNEaXJlY3RseVN1cHByZXNzZWQodmUKLQkJCQkJCQkuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgc3VwcHJlc3NlZCBicmVha2Rvd24gZWxlbWVudCB0aGF0IG1hZGUgdGhlIGdpdmVuIGJyZWFrZG93bgotCSAqIGVsZW1lbnQgYmVjb21lIHN1cHByZXNzZWQuIFRoaXMgbWV0aG9kIHdpbGwgY2hlY2sgdGhlIHN1cHByZXNzaW9uIHN0YXRlCi0JICogb2YgdGhlIHBhcmVudCB1cHRvIHRoZSBzcGVjaWZpZWQgPGNvZGU+dG9wPC9jb2RlPiBvbmx5IGlmCi0JICogPGNvZGU+Y2hlY2tQYXJlbnQ8L2NvZGU+IGlzIDxjb2RlPnRydWU8L2NvZGU+LiBJdCB3aWxsIG5vdCBjaGVjayB0aGUKLQkgKiBzdXBwcmVzc2lvbiBzdGF0ZSBvZiA8Y29kZT50b3A8L2NvZGU+Ci0JICogCi0JICogQHBhcmFtIGUKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgQnJlYWtkb3duRWxlbWVudCBnZXRTdXBwcmVzc2VkKEJyZWFrZG93bkVsZW1lbnQgZSwKLQkJCWJvb2xlYW4gY2hlY2tQYXJlbnQsIE9iamVjdCB0b3ApIHsKLQkJaWYgKGUuZ2V0U3VwcHJlc3NlZCgpLmJvb2xlYW5WYWx1ZSgpKSB7Ci0JCQlyZXR1cm4gZTsKLQkJfQotCi0JCWlmIChjaGVja1BhcmVudCkgewotCQkJZm9yIChCcmVha2Rvd25FbGVtZW50IGJlID0gZTsgYmUgIT0gdG9wCi0JCQkJCSYmIGJlLmdldFN1cGVyQWN0aXZpdGllcygpICE9IG51bGw7KSB7Ci0JCQkJYmUgPSBiZS5nZXRTdXBlckFjdGl2aXRpZXMoKTsKLQkJCQlpZiAoYmUuZ2V0U3VwcHJlc3NlZCgpLmJvb2xlYW5WYWx1ZSgpKSB7Ci0JCQkJCXJldHVybiBiZTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCS8vIHNwZWNpYWwgaGFuZGxpbmcgZm9yIG5lc3RlZCBhcnRpZmFjdCBkZXNjcmlwdG9ycyBhbmQgZGVsaXZlcmFibGUKLQkJCS8vIHBhcnRzCi0JCQkvLwotCQkJaWYgKGUgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3IpIHsKLQkJCQlXb3JrUHJvZHVjdERlc2NyaXB0b3Igd3BEZXNjID0gKChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIGUpOwotCQkJCVdvcmtQcm9kdWN0IHdwID0gd3BEZXNjLmdldFdvcmtQcm9kdWN0KCk7Ci0JCQkJaWYgKHdwIGluc3RhbmNlb2YgQXJ0aWZhY3QpIHsKLQkJCQkJLy8gbG9vayBmb3IgcGFyZW50IGFydGlmYWN0IGRlc2NyaXB0b3IgaW4gdGhlIHNhbWUgYWN0aXZpdHkKLQkJCQkJLy8gYW5kIGNoZWNrIHRoZWlyIHN1cHByZXNzaW9uIHN0YXRlCi0JCQkJCS8vCi0JCQkJCUFjdGl2aXR5IGFjdCA9IFVtYVV0aWwuZ2V0UGFyZW50QWN0aXZpdHkoZSk7Ci0JCQkJCWlmIChhY3QgIT0gbnVsbCkgewotCQkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gYWN0LmdldEJyZWFrZG93bkVsZW1lbnRzKCkKLQkJCQkJCQkJLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQkJCU9iamVjdCBlbGVtZW50ID0gaXRlci5uZXh0KCk7Ci0JCQkJCQkJaWYgKGVsZW1lbnQgIT0gZQotCQkJCQkJCQkJJiYgZWxlbWVudCBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgewotCQkJCQkJCQlXb3JrUHJvZHVjdERlc2NyaXB0b3Igd3BkID0gKChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIGVsZW1lbnQpOwotCQkJCQkJCQlXb3JrUHJvZHVjdCBvdGhlcldwID0gd3BkLmdldFdvcmtQcm9kdWN0KCk7Ci0JCQkJCQkJCWlmIChvdGhlcldwIGluc3RhbmNlb2YgQXJ0aWZhY3QKLQkJCQkJCQkJCQkmJiBVbWFVdGlsLmlzQ29udGFpbmVkQnkod3AsIG90aGVyV3ApCi0JCQkJCQkJCQkJJiYgd3BkLmdldFN1cHByZXNzZWQoKS5ib29sZWFuVmFsdWUoKSkgewotCQkJCQkJCQkJcmV0dXJuIHdwZDsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAod3BEZXNjICE9IHRvcCAmJiB3cERlc2MuZ2V0U3VwZXJBY3Rpdml0aWVzKCkgPT0gbnVsbCkgewotCQkJCQlMaXN0IGxpc3QgPSBBc3NvY2lhdGlvbkhlbHBlcgotCQkJCQkJCS5nZXREZWxpdmVyYWJsZURlc2NyaXB0b3JzKHdwRGVzYyk7Ci0JCQkJCWlmIChsaXN0LnNpemUoKSA9PSAxKSB7Ci0JCQkJCQkvLyB0aGlzIHdvcmsgcHJvZHVjdCBkZXNjcmlwdG9yIGlzIGEgZGVsaXZlcmFibGUgcGFydCBvZgotCQkJCQkJLy8gYSBkZWxpdmVyYWJsZSB3b3JrIHByb2R1Y3QgZGVzY3JpcHRvcgotCQkJCQkJLy8gY2hlY2sgdGhlIHN1cHByZXNzaW9uIHN0YXRlIG9mIHRoZSBkZWxpdmVyYWJsZSB3b3JrCi0JCQkJCQkvLyBwcm9kdWN0IGRlc2NyaXB0b3IKLQkJCQkJCS8vCi0JCQkJCQlyZXR1cm4gZ2V0U3VwcHJlc3NlZCgoQnJlYWtkb3duRWxlbWVudCkgbGlzdC5nZXQoMCksCi0JCQkJCQkJCWNoZWNrUGFyZW50LCB0b3ApOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJLy8gc3BlY2lhbCBoYW5kbGluZyBmb3IgdGVhbSBwcm9maWxlIG93biByb2xlIGRlc2NyaXB0b3IKLQkJCS8vCi0JCQllbHNlIGlmIChlIGluc3RhbmNlb2YgUm9sZURlc2NyaXB0b3IpIHsKLQkJCQlpZiAoZS5nZXRTdXBlckFjdGl2aXRpZXMoKSA9PSBudWxsKSB7Ci0JCQkJCUxpc3QgbGlzdCA9IEFzc29jaWF0aW9uSGVscGVyCi0JCQkJCQkJLmdldFRlYW1Qcm9maWxlcygoUm9sZURlc2NyaXB0b3IpIGUpOwotCQkJCQlpZiAobGlzdC5zaXplKCkgPT0gMSkgewotCQkJCQkJVGVhbVByb2ZpbGUgdGVhbSA9IChUZWFtUHJvZmlsZSkgbGlzdC5nZXQoMCk7Ci0JCQkJCQlpZiAodGVhbSAhPSB0b3AgJiYgdGVhbSAhPSBudWxsKSB7Ci0JCQkJCQkJcmV0dXJuIGdldFN1cHByZXNzZWQodGVhbSwgY2hlY2tQYXJlbnQsIHRvcCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQkvLyBzcGVjaWFsIGhhbmRsaW5nIGZvciBzdWIgdGVhbSBwcm9maWxlCi0JCQkvLwotCQkJZWxzZSBpZiAoZSBpbnN0YW5jZW9mIFRlYW1Qcm9maWxlKSB7Ci0JCQkJaWYgKGUuZ2V0U3VwZXJBY3Rpdml0aWVzKCkgPT0gbnVsbCkgewotCQkJCQlUZWFtUHJvZmlsZSBzdXBlclRlYW0gPSAoKFRlYW1Qcm9maWxlKSBlKS5nZXRTdXBlclRlYW0oKTsKLQkJCQkJaWYgKHN1cGVyVGVhbSAhPSB0b3AgJiYgc3VwZXJUZWFtICE9IG51bGwpIHsKLQkJCQkJCXJldHVybiBnZXRTdXBwcmVzc2VkKHN1cGVyVGVhbSwgY2hlY2tQYXJlbnQsIHRvcCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0luU3VwcHJlc3NlZExpc3QoCi0JCQlCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlciB3cmFwcGVyKSB7Ci0JCWlmIChzdXBwcmVzc2VkRXh0ZXJuYWxFbGVtZW50UGF0aHMgPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJLy8gY2hlY2sgaWYgd3JhcHBlcidzIHBhdGggaXMgaW4gc3VwcHJlc3NlZEV4dGVybmFsRWxlbWVudFBhdGhzIHNldAotCQkvLwotCQlTdHJpbmcgcGF0aCA9IGdldFBhdGgod3JhcHBlcik7Ci0JCXJldHVybiBzdXBwcmVzc2VkRXh0ZXJuYWxFbGVtZW50UGF0aHMuY29udGFpbnMocGF0aCk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgc3VwcHJlc3NlZCBicmVha2Rvd24gZWxlbWVudCB0aGF0IG1hZGUgdGhlIGdpdmVuIHdyYXBwZXIgYmVjb21lCi0JICogc3VwcHJlc3NlZAotCSAqIAotCSAqIEBwYXJhbSB3cmFwcGVyCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgQnJlYWtkb3duRWxlbWVudCBnZXRTdXBwcmVzc2VkKAotCQkJQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIgd3JhcHBlcikgewotCQlyZXR1cm4gZ2V0U3VwcHJlc3NlZCh3cmFwcGVyLCB0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBzdXBwcmVzc2VkIGJyZWFrZG93biBlbGVtZW50IHRoYXQgbWFkZSB0aGUgZ2l2ZW4gd3JhcHBlciBiZWNvbWUKLQkgKiBzdXBwcmVzc2VkCi0JICogCi0JICogQHBhcmFtIHdyYXBwZXIKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBCcmVha2Rvd25FbGVtZW50IGdldFN1cHByZXNzZWQoCi0JCQlCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlciB3cmFwcGVyLCBib29sZWFuIGNoZWNrQmFzZSkgewotCQlyZXR1cm4gZ2V0U3VwcHJlc3NlZCh3cmFwcGVyLCBjaGVja0Jhc2UsIHRydWUsCi0JCQkJYXV0b0luaGVyaXRJbnRlcm1lZGlhdGVTdXBwcmVzc2lvblN0YXRlKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBzdXBwcmVzc2VkIGJyZWFrZG93biBlbGVtZW50IHRoYXQgbWFkZSB0aGUgZ2l2ZW4gd3JhcHBlciBiZWNvbWUKLQkgKiBzdXBwcmVzc2VkCi0JICogCi0JICogQHBhcmFtIHdyYXBwZXIKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBCcmVha2Rvd25FbGVtZW50IGdldFN1cHByZXNzZWQoCi0JCQlCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlciB3cmFwcGVyLCBib29sZWFuIGNoZWNrQmFzZSwKLQkJCWJvb2xlYW4gY2hlY2tMb2NhbCwgYm9vbGVhbiBpbmhlcml0U3VwcHJlc3Npb25TdGF0ZSkgewotCQlyZXR1cm4gZ2V0U3VwcHJlc3NlZCh3cmFwcGVyLCBjaGVja0Jhc2UsIGNoZWNrTG9jYWwsCi0JCQkJaW5oZXJpdFN1cHByZXNzaW9uU3RhdGUsIHRydWUsIG51bGwpOwotCX0KLQotCXByaXZhdGUgQnJlYWtkb3duRWxlbWVudCBnZXRTdXBwcmVzc2VkKAotCQkJQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIgd3JhcHBlciwgYm9vbGVhbiBjaGVja0Jhc2UsCi0JCQlib29sZWFuIGNoZWNrTG9jYWwsIGJvb2xlYW4gaW5oZXJpdFN1cHByZXNzaW9uU3RhdGUsCi0JCQlib29sZWFuIGNoZWNrUGFyZW50LCBPYmplY3QgdG9wKSB7Ci0JCUJyZWFrZG93bkVsZW1lbnQgZSA9IChCcmVha2Rvd25FbGVtZW50KSBUbmdVdGlsLnVud3JhcCh3cmFwcGVyKTsKLQkJaWYgKCF3cmFwcGVyLmlzUmVhZE9ubHkoKSkgewotCQkJLy8gdGhpcyBpcyBhIHdyYXBwZXIgb2YgbG9jYWwgZWxlbWVudAotCQkJLy8KLQkJCXJldHVybiBnZXRTdXBwcmVzc2VkKGUsIGNoZWNrUGFyZW50LCB0b3ApOwotCQl9Ci0KLQkJLy8gY2hlY2sgaWYgdGhlIGJhc2UgYnJlYWtkb3duIGVsZW1lbnQgaXMgc3VwcHJlc3NlZCwgZGlyZWN0bHkgb3IKLQkJLy8gaW5kaXJlY3RseSwgaW4gaXRzIG93biBwcm9jZXNzCi0JCS8vCi0JCWlmIChjaGVja0Jhc2UpIHsKLQkJCUJyZWFrZG93bkVsZW1lbnQgc3VwcHJlc3NlZCA9IGdldFN1cHByZXNzZWQoZSwgY2hlY2tQYXJlbnQsIHRvcCk7Ci0JCQlpZiAoc3VwcHJlc3NlZCAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIHN1cHByZXNzZWQ7Ci0JCQl9Ci0JCX0KLQotCQlPYmplY3QgcGFyZW50ID0gbnVsbDsKLQkJaWYgKGNoZWNrTG9jYWwpIHsKLQkJCS8vIGNoZWNrIGlmIHRoZSB3cmFwcGVyIGlzIHN1cHByZXNzZWQgaW4gdGhpcyBwcm9jZXNzCi0JCQkvLwotCQkJaWYgKGlzSW5TdXBwcmVzc2VkTGlzdCh3cmFwcGVyKSkgewotCQkJCXJldHVybiBlOwotCQkJfQotCi0JCQkvLyBjaGVjayBpZiB0aGUgYW55IGxvY2FsIHBhcmVudCBpcyBzdXBwcmVzc2VkCi0JCQkvLwotCQkJaWYgKGNoZWNrUGFyZW50KSB7Ci0JCQkJcGFyZW50ID0gd3JhcHBlci5nZXRQYXJlbnQod3JhcHBlcik7Ci0JCQkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnQgJiYgcGFyZW50ICE9IHRvcCkgewotCQkJCQlCcmVha2Rvd25FbGVtZW50IHN1cHByZXNzZWQgPSBnZXRTdXBwcmVzc2VkKAotCQkJCQkJCShCcmVha2Rvd25FbGVtZW50KSBwYXJlbnQsIGNoZWNrUGFyZW50LCB0b3ApOwotCQkJCQlpZiAoc3VwcHJlc3NlZCAhPSBudWxsKSB7Ci0JCQkJCQlyZXR1cm4gc3VwcHJlc3NlZDsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCS8vIGNoZWNrIGlmIHRoZSBicmVha2Rvd24gZWxlbWVudCBpcyBzdXBwcmVzc2VkIGluIG9uZSBvZiB0aGUgaW1tZWRpYXRlCi0JCS8vIGJhc2UgcHJvY2VzcwotCQkvLwotCQlpZiAoaW5oZXJpdFN1cHByZXNzaW9uU3RhdGUpIHsKLQkJCVByb2Nlc3MgcHJvYyA9IFRuZ1V0aWwuZ2V0T3duaW5nUHJvY2VzcyhlKTsKLQkJCUFjdGl2aXR5IGluaGVyaXRvciA9IFByb2Nlc3NVdGlsLmdldEluaGVyaXRvcih3cmFwcGVyKTsKLQkJCUJyZWFrZG93bkVsZW1lbnQgYmFzZSA9IChCcmVha2Rvd25FbGVtZW50KSBpbmhlcml0b3IKLQkJCQkJLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsKLQkJCWlmIChiYXNlICE9IG51bGwpIHsKLQkJCQlQcm9jZXNzIGltbWVkaWF0ZUJhc2VQcm9jID0gVG5nVXRpbC5nZXRPd25pbmdQcm9jZXNzKGJhc2UpOwotCQkJCWlmIChwcm9jICE9IGltbWVkaWF0ZUJhc2VQcm9jKSB7Ci0JCQkJCS8vIGZpbmQgdGhlIG9iamVjdCBpbiB0aGUgYnJlYWtkb3duIHN0cnVjdHVyZSBvZiB0aGUKLQkJCQkJLy8gaW1tZWRpYXRlCi0JCQkJCS8vIGJhc2UgcHJvY2VzcyB0aGF0IHJlcHJlc2VudHMgdGhlIHNhbWUgYnJlYWtkb3duIGVsZW1lbnQKLQkJCQkJLy8KLQkJCQkJT2JqZWN0IG9iamVjdCA9IGluaGVyaXRvci5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCk7Ci0JCQkJCUFycmF5TGlzdCBvYmplY3RzID0gbmV3IEFycmF5TGlzdChQcm9jZXNzVXRpbAotCQkJCQkJCS5nZXRQYXJlbnRMaXN0KGluaGVyaXRvciwgd3JhcHBlcikpOwotCQkJCQlvYmplY3RzLmFkZChlKTsKLQkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gb2JqZWN0cy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJCU9iamVjdCBlbGVtZW50ID0gaXRlci5uZXh0KCk7Ci0JCQkJCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIgYWRhcHRlciA9IChJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIpIHdyYXBwZXIKLQkJCQkJCQkJLmdldEFkYXB0ZXJGYWN0b3J5KCkuYWRhcHQob2JqZWN0LAotCQkJCQkJCQkJCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCQkJCQlmaW5kX2NoaWxkOiBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gYWRhcHRlcgotCQkJCQkJCQkuZ2V0Q2hpbGRyZW4ob2JqZWN0KS5pdGVyYXRvcigpOyBpdGVyYXRvcgotCQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJCU9iamVjdCBjaGlsZCA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJCQlpZiAoZWxlbWVudCA9PSBUbmdVdGlsLnVud3JhcChjaGlsZCkpIHsKLQkJCQkJCQkJb2JqZWN0ID0gY2hpbGQ7Ci0JCQkJCQkJCWJyZWFrIGZpbmRfY2hpbGQ7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWlmIChvYmplY3QgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgewotCQkJCQkJU3VwcHJlc3Npb24gc3VwcHJlc3Npb24gPSBnZXRTdXBwcmVzc2lvbihpbW1lZGlhdGVCYXNlUHJvYyk7Ci0JCQkJCQlCcmVha2Rvd25FbGVtZW50IGVsZW1lbnQgPSBzdXBwcmVzc2lvbi5nZXRTdXBwcmVzc2VkKAotCQkJCQkJCQkoQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIG9iamVjdCwKLQkJCQkJCQkJZmFsc2UsIHRydWUsIGluaGVyaXRTdXBwcmVzc2lvblN0YXRlLAotCQkJCQkJCQljaGVja1BhcmVudCwgVG5nVXRpbC51bndyYXAob2JqZWN0KSk7Ci0JCQkJCQlpZiAoZWxlbWVudCAhPSBudWxsKSB7Ci0JCQkJCQkJcmV0dXJuIGVsZW1lbnQ7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQkvLyBjaGVjayBpZiB0aGUgYW55IGluaGVyaXRlZCBwYXJlbnQgaXMgc3VwcHJlc3NlZAotCQkvLwotCQlpZiAoY2hlY2tQYXJlbnQpIHsKLQkJCWlmIChwYXJlbnQgPT0gbnVsbCkgewotCQkJCXBhcmVudCA9IHdyYXBwZXIuZ2V0UGFyZW50KHdyYXBwZXIpOwotCQkJfQotCQkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyCi0JCQkJCSYmIFRuZ1V0aWwudW53cmFwKHBhcmVudCkgIT0gdG9wKSB7Ci0JCQkJcmV0dXJuIGdldFN1cHByZXNzZWQoCi0JCQkJCQkoQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIHBhcmVudCwKLQkJCQkJCWNoZWNrQmFzZSwgdHJ1ZSwgaW5oZXJpdFN1cHByZXNzaW9uU3RhdGUsIGNoZWNrUGFyZW50LAotCQkJCQkJdG9wKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGNhY2hlZCBzdXBwcmVzc2lvbiBmb3IgdGhlIGdpdmVuIHByb2Nlc3MgaWYgb25lIGV4aXN0cyBvcgotCSAqIGNyZWF0ZXMgbmV3IG9uZQotCSAqIAotCSAqIEBwYXJhbSBpbW1lZGlhdGVCYXNlUHJvYwotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN1cHByZXNzaW9uIGdldFN1cHByZXNzaW9uKFByb2Nlc3MgcHJvYykgewotCQlTdXBwcmVzc2lvbiBzdXBwcmVzc2lvbiA9IChTdXBwcmVzc2lvbikgcHJvY1RvU3VwcHJlc3Npb25NYXAuZ2V0KHByb2MpOwotCQlpZiAoc3VwcHJlc3Npb24gPT0gbnVsbCkgewotCQkJc3luY2hyb25pemVkIChwcm9jVG9TdXBwcmVzc2lvbk1hcCkgewotCQkJCXN1cHByZXNzaW9uID0gKFN1cHByZXNzaW9uKSBwcm9jVG9TdXBwcmVzc2lvbk1hcC5nZXQocHJvYyk7Ci0JCQkJaWYgKHN1cHByZXNzaW9uID09IG51bGwpIHsKLQkJCQkJc3VwcHJlc3Npb24gPSBuZXcgU3VwcHJlc3Npb24ocHJvYyk7Ci0JCQkJCXByb2NUb1N1cHByZXNzaW9uTWFwLnB1dChwcm9jLCBzdXBwcmVzc2lvbik7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBzdXBwcmVzc2lvbjsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHN5bmNocm9uaXplZCB2b2lkIHNldFN1cHByZXNzaW9uKFN1cHByZXNzaW9uIHN1cCkgewotCQlwcm9jVG9TdXBwcmVzc2lvbk1hcC5wdXQoc3VwLmdldFByb2Nlc3MoKSwgc3VwKTsKLQl9Ci0JCi0JcHJpdmF0ZSBib29sZWFuIF9faXNTdXBwcmVzc2VkKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyIHdyYXBwZXIpIHsKLQkJcmV0dXJuIGdldFN1cHByZXNzZWQod3JhcHBlcikgIT0gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzYXZlVG9Nb2RlbCgpIHsKLQkJaWYgKHN1cHByZXNzZWRFeHRlcm5hbEVsZW1lbnRQYXRocyA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlTdHJpbmdCdWZmZXIgcGF0aHMgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHN1cHByZXNzZWRFeHRlcm5hbEVsZW1lbnRQYXRocy5pdGVyYXRvcigpOyBpdGVyCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCVN0cmluZyBwYXRoID0gKFN0cmluZykgaXRlci5uZXh0KCk7Ci0JCQlpZiAoaXNWYWxpZChwYXRoKSkgewotCQkJCXBhdGhzLmFwcGVuZChwYXRoKS5hcHBlbmQoJyAnKTsKLQkJCX0KLQkJfQotCi0JCUNvbnN0cmFpbnQgcnVsZSA9IENvbnN0cmFpbnRNYW5hZ2VyLmdldENvbnN0cmFpbnQocHJvY2VzcywKLQkJCQlDb25zdHJhaW50TWFuYWdlci5QUk9DRVNTX1NVUFBSRVNTSU9OLCB0cnVlKTsKLQkJLy8gaWYocHJvY2Vzcy5nZXRPd25lZFJ1bGVzKCkuaXNFbXB0eSgpKSB7Ci0JCS8vIHJ1bGUgPSBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVDb25zdHJhaW50KCk7Ci0JCS8vIHByb2Nlc3MuZ2V0T3duZWRSdWxlcygpLmFkZChydWxlKTsKLQkJLy8gfQotCQkvLyBlbHNlIHsKLQkJLy8gcnVsZSA9IChDb25zdHJhaW50KSBwcm9jZXNzLmdldE93bmVkUnVsZXMoKS5nZXQoMCk7Ci0JCS8vIH0KLQkJLy8JCQotCQlydWxlLnNldEJvZHkocGF0aHMudG9TdHJpbmcoKSk7Ci0JfQotCi0JLyoqCi0JICogQ2hlY2tzIGlmIHRoZSBnaXZlbiBwYXRoIGlzIHZhbGlkIGluIHByb2Nlc3MKLQkgKiAKLQkgKiBAcGFyYW0gcGF0aAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNWYWxpZChTdHJpbmcgcGF0aCkgewotCQlVUkkgdXJpID0gVVJJLmNyZWF0ZVVSSShwYXRoKTsKLQkJU3RyaW5nIHR5cGUgPSB1cmkuc2NoZW1lKCk7Ci0JCUNvbmZpZ3VyYWJsZUNvbXBvc2VkQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkgPSBudWxsOwotCQlpZiAoV0JTLmVxdWFscyh0eXBlKSkgewotCQkJYWRhcHRlckZhY3RvcnkgPSAoQ29uZmlndXJhYmxlQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSkgVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJLmdldFdCU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCk7Ci0JCX0gZWxzZSBpZiAoVEJTLmVxdWFscyh0eXBlKSkgewotCQkJYWRhcHRlckZhY3RvcnkgPSAoQ29uZmlndXJhYmxlQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSkgVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJLmdldE9CU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCk7Ci0JCX0gZWxzZSBpZiAoV1BCUy5lcXVhbHModHlwZSkpIHsKLQkJCWFkYXB0ZXJGYWN0b3J5ID0gKENvbmZpZ3VyYWJsZUNvbXBvc2VkQWRhcHRlckZhY3RvcnkpIFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCS5nZXRQQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpOwotCQl9IGVsc2UgaWYgKENCUy5lcXVhbHModHlwZSkpIHsKLQkJCWFkYXB0ZXJGYWN0b3J5ID0gKENvbmZpZ3VyYWJsZUNvbXBvc2VkQWRhcHRlckZhY3RvcnkpIFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCS5nZXRQcm9jZXNzQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJLy8gdXNlIHByb2Nlc3MncyBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gdG8gdmFsaWRhdGUKLQkJLy8KLQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjdXJyZW50Q29uZmlnID0gbnVsbDsKLQkJSUNvbmZpZ3VyYXRvciBjb25maWd1cmF0b3IgPSBudWxsOwotCQlJRmlsdGVyIGZpbHRlciA9IGFkYXB0ZXJGYWN0b3J5LmdldEZpbHRlcigpOwotCQlpZiAoZmlsdGVyIGluc3RhbmNlb2YgSUNvbmZpZ3VyYXRvcikgewotCQkJY29uZmlndXJhdG9yID0gKElDb25maWd1cmF0b3IpIGFkYXB0ZXJGYWN0b3J5LmdldEZpbHRlcigpOwotCQkJY3VycmVudENvbmZpZyA9IGNvbmZpZ3VyYXRvci5nZXRNZXRob2RDb25maWd1cmF0aW9uKCk7Ci0JCQljb25maWd1cmF0b3Iuc2V0TWV0aG9kQ29uZmlndXJhdGlvbihwcm9jZXNzLmdldERlZmF1bHRDb250ZXh0KCkpOwotCQl9Ci0JCXRyeSB7Ci0JCQlTdHJpbmcgZ3VpZCA9IHVyaS5hdXRob3JpdHkoKTsKLQkJCWlmICghcHJvY2Vzcy5nZXRHdWlkKCkuZXF1YWxzKGd1aWQpKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJT2JqZWN0IG9iamVjdCA9IHByb2Nlc3M7Ci0JCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIgYWRhcHRlciA9IChJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIpIGFkYXB0ZXJGYWN0b3J5Ci0JCQkJCS5hZGFwdChvYmplY3QsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHVyaS5zZWdtZW50Q291bnQoKTsgaSsrKSB7Ci0JCQkJZ3VpZCA9IHVyaS5zZWdtZW50KGkpOwotCQkJCUl0ZXJhdG9yIGl0ZXIgPSBhZGFwdGVyLmdldENoaWxkcmVuKG9iamVjdCkuaXRlcmF0b3IoKTsKLQkJCQlhZGFwdGVyID0gbnVsbDsKLQkJCQlmaW5kX2FkYXB0ZXI6IHdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJCQlPYmplY3QgY2hpbGQgPSBpdGVyLm5leHQoKTsKLQkJCQkJb2JqZWN0ID0gVG5nVXRpbC51bndyYXAoY2hpbGQpOwotCQkJCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJCQkJaWYgKGd1aWQuZXF1YWxzKCgoTWV0aG9kRWxlbWVudCkgb2JqZWN0KS5nZXRHdWlkKCkpKSB7Ci0JCQkJCQkJaWYgKGNoaWxkIGluc3RhbmNlb2YgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyKSB7Ci0JCQkJCQkJCWFkYXB0ZXIgPSAoSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyKSBjaGlsZDsKLQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQlhZGFwdGVyID0gKElUcmVlSXRlbUNvbnRlbnRQcm92aWRlcikgYWRhcHRlckZhY3RvcnkKLQkJCQkJCQkJCQkuYWRhcHQoY2hpbGQsCi0JCQkJCQkJCQkJCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkJCQkJCX0KLQkJCQkJCQlicmVhayBmaW5kX2FkYXB0ZXI7Ci0JCQkJCQl9Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQkvLyBtdXN0IGJlIGFuIEl0ZW1Qcm92aWRlckFkYXB0ZXIKLQkJCQkJCS8vCi0JCQkJCQlJdGVtUHJvdmlkZXJBZGFwdGVyIGl0ZW1Qcm92aWRlciA9IChJdGVtUHJvdmlkZXJBZGFwdGVyKSBvYmplY3Q7Ci0JCQkJCQlNZXRob2RFbGVtZW50IGUgPSAoTWV0aG9kRWxlbWVudCkgaXRlbVByb3ZpZGVyCi0JCQkJCQkJCS5nZXRUYXJnZXQoKTsKLQkJCQkJCWlmIChndWlkLmVxdWFscyhlLmdldEd1aWQoKSkpIHsKLQkJCQkJCQlhZGFwdGVyID0gKElUcmVlSXRlbUNvbnRlbnRQcm92aWRlcikgaXRlbVByb3ZpZGVyOwotCQkJCQkJCWJyZWFrIGZpbmRfYWRhcHRlcjsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAoYWRhcHRlciA9PSBudWxsKSB7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfSBmaW5hbGx5IHsKLQkJCS8vIHJlc3RvcmUgY29uZmlndXJhdGlvbgotCQkJLy8KLQkJCWlmIChjb25maWd1cmF0b3IgIT0gbnVsbCkgewotCQkJCWNvbmZpZ3VyYXRvci5zZXRNZXRob2RDb25maWd1cmF0aW9uKGN1cnJlbnRDb25maWcpOwotCQkJfQotCQl9Ci0JfQotCi0JLy8gcHJpdmF0ZSBib29sZWFuIHJldmVhbChMaXN0IHNlbGVjdGlvbiwgQ29sbGVjdGlvbiByZXZlYWxlZERlc2NyaXB0b3JzKSB7Ci0JLy8gYm9vbGVhbiByZWFkT25seUVsZW1lbnRBZmZlY3RlZCA9IGZhbHNlOwotCS8vIGZvciAoSXRlcmF0b3IgaXRlciA9IHNlbGVjdGlvbi5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkvLyBPYmplY3QgZWxlbWVudCA9IChPYmplY3QpIGl0ZXIubmV4dCgpOwotCS8vIGlmIChlbGVtZW50IGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIHsKLQkvLyBCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlciB3cmFwcGVyID0KLQkvLyAoQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIGVsZW1lbnQ7Ci0JLy8gTWV0aG9kRWxlbWVudCBlID0gKE1ldGhvZEVsZW1lbnQpIFRuZ1V0aWwudW53cmFwKHdyYXBwZXIpOwotCS8vIGlmICghd3JhcHBlci5pc1JlYWRPbmx5KCkpIHsgLy8gd3JhcHBlciBvZiBsb2NhbCBlbGVtZW50Ci0JLy8gZS5zZXRTdXBwcmVzc2VkKEJvb2xlYW4uRkFMU0UpOwotCS8vIGlmKGUgaW5zdGFuY2VvZiBEZXNjcmlwdG9yKSB7Ci0JLy8gcmV2ZWFsZWREZXNjcmlwdG9ycy5hZGQoZSk7Ci0JLy8gfQotCS8vIH0gZWxzZSB7IC8vIHdhcyBzdXBwcmVzc2VkIGJ5IHRoaXMgcHJvY2VzcwotCS8vCi0JLy8gLy8gcmVtb3ZlIHRoZSBwYXRoIG9mIHN1cHByZXNzZWQgZWxlbWVudCBmcm9tIHRoZSBsaXN0Ci0JLy8gLy8KLQkvLyBTdHJpbmcgcGF0aCA9IGdldFBhdGgod3JhcHBlcik7Ci0JLy8gZ2V0U3VwcHJlc3NlZEV4dGVybmFsRWxlbWVudFBhdGhzKCkucmVtb3ZlKHBhdGgpOwotCS8vIHJlYWRPbmx5RWxlbWVudEFmZmVjdGVkID0gdHJ1ZTsKLQkvLyB9Ci0JLy8gfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCS8vICgoTWV0aG9kRWxlbWVudCkgZWxlbWVudCkuc2V0U3VwcHJlc3NlZChCb29sZWFuLkZBTFNFKTsKLQkvLyBpZihlbGVtZW50IGluc3RhbmNlb2YgRGVzY3JpcHRvcikgewotCS8vIHJldmVhbGVkRGVzY3JpcHRvcnMuYWRkKGVsZW1lbnQpOwotCS8vIH0KLQkvLyB9Ci0JLy8gfQotCS8vIG1vZGlmaWVkID0gdHJ1ZTsKLQkvLyByZXR1cm4gcmVhZE9ubHlFbGVtZW50QWZmZWN0ZWQ7Ci0JLy8gfQotCi0JLy8gLyoqCi0JLy8gKiBAcGFyYW0gc2VsZWN0aW9uCi0JLy8gKiBAcmV0dXJuIHRydWUgaWYgdGhpcyBjYWxsIHJldmVhbGVkIGFueSByZWFkLW9ubHkgZWxlbWVudAotCS8vICovCi0JLy8gcHVibGljIGJvb2xlYW4gcmV2ZWFsKExpc3Qgc2VsZWN0aW9uKSB7Ci0JLy8gQXJyYXlMaXN0IHJldmVhbGVkRGVzY3JpcHRvcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JLy8gYm9vbGVhbiByZXQgPSByZXZlYWwoc2VsZWN0aW9uLCByZXZlYWxlZERlc2NyaXB0b3JzKTsKLQkvLyBMaXN0IGRlc2NyaXB0b3JzVG9SZXZlYWwgPSBnZXRPd25SZWxhdGVkRWxlbWVudHMocmV2ZWFsZWREZXNjcmlwdG9ycywKLQkvLyBmYWxzZSk7Ci0JLy8gaWYoZGVzY3JpcHRvcnNUb1JldmVhbCAhPSBudWxsKSB7Ci0JLy8gYm9vbGVhbiByZXQyID0gcmV2ZWFsKGRlc2NyaXB0b3JzVG9SZXZlYWwsIHJldmVhbGVkRGVzY3JpcHRvcnMpOwotCS8vIHJldHVybiByZXQgfHwgcmV0MjsKLQkvLyB9Ci0JLy8gcmV0dXJuIHJldDsKLQkvLyB9Ci0KLQkvKioKLQkgKiBAZGVwcmVjYXRlZCBuZWVkIHRvIHVzZSB7QGxpbmsgU3VwcHJlc3Npb25Db21tYW5kfSBpbnN0ZWFkCi0JICovCi0JcHVibGljIHZvaWQgcmV2ZWFsKExpc3Qgc2VsZWN0aW9uKSB7Ci0JCWRvU2V0U3VwcHJlc3NlZChzZWxlY3Rpb24sIGZhbHNlKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0Vmlld1R5cGUoCi0JCQlCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlciB3cmFwcGVyKSB7Ci0JCS8vIG5vIG5lZWQgdG8gc3RvcmUgc2VwYXJhdGUgcGF0aCBmb3IgQ0JTLCByZXVzZSBXQlMvVEJTL1dQQlMgcGF0aHMKLQkJLy8JCQotCQlPYmplY3QgZSA9IFRuZ1V0aWwudW53cmFwKHdyYXBwZXIpOwotCQlpZiAoZSBpbnN0YW5jZW9mIFdvcmtCcmVha2Rvd25FbGVtZW50KSB7Ci0JCQlyZXR1cm4gV0JTOwotCQl9IGVsc2UgaWYgKGUgaW5zdGFuY2VvZiBUZWFtUHJvZmlsZSB8fCBlIGluc3RhbmNlb2YgUm9sZURlc2NyaXB0b3IpIHsKLQkJCXJldHVybiBUQlM7Ci0JCX0gZWxzZSBpZiAoZSBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgewotCQkJcmV0dXJuIFdQQlM7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHByb2Nlc3MgR1VJRCBpbiB0aGUgZ2l2ZW4gR1VJRCBwYXRoCi0JICogCi0JICogQHBhcmFtIGd1aWRQYXRoCi0JICogQHJldHVybgotCSAqIEBzZWUgI2dldFBhdGgoQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UHJvY2Vzc0dVSUQoU3RyaW5nIGd1aWRQYXRoKSB7Ci0JCWludCBpZCA9IGd1aWRQYXRoLmluZGV4T2YoIjovLyIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChpZCAhPSAtMSkgewotCQkJaW50IGJlZ2luSW5kZXggPSBpZCArIDM7Ci0JCQlpZiAoYmVnaW5JbmRleCA8IGd1aWRQYXRoLmxlbmd0aCgpKSB7Ci0JCQkJaW50IGVuZEluZGV4ID0gZ3VpZFBhdGguaW5kZXhPZignLycsIGJlZ2luSW5kZXgpOwotCQkJCWlmIChlbmRJbmRleCAhPSAtMSkgewotCQkJCQlyZXR1cm4gZ3VpZFBhdGguc3Vic3RyaW5nKGJlZ2luSW5kZXgsIGVuZEluZGV4KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHdyYXBwZXIKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UGF0aChCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlciB3cmFwcGVyKSB7Ci0JCVN0cmluZ0J1ZmZlciBwYXRoID0gZ2V0UGF0aFdpdGhvdXRWaWV3VHlwZSh3cmFwcGVyKTsKLQkJU3RyaW5nIHZpZXdUeXBlID0gZ2V0Vmlld1R5cGUod3JhcHBlcik7Ci0JCXBhdGguaW5zZXJ0KDAsICI6LyIpLmluc2VydCgwLCB2aWV3VHlwZSk7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIHBhdGgudG9TdHJpbmcoKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmdCdWZmZXIgZ2V0UGF0aFdpdGhvdXRWaWV3VHlwZShCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlciB3cmFwcGVyKSB7Ci0JCVN0cmluZ0J1ZmZlciBwYXRoID0gbmV3IFN0cmluZ0J1ZmZlcigpOyAKLQkJTGlzdCBwYXJlbnRMaXN0ID0gUHJvY2Vzc1V0aWwuZ2V0UGFyZW50TGlzdChudWxsLCB3cmFwcGVyKTsKLQkJaWYgKCFwYXJlbnRMaXN0LmlzRW1wdHkoKSkgewotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gcGFyZW50TGlzdC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlNZXRob2RFbGVtZW50IGUgPSAoTWV0aG9kRWxlbWVudCkgaXRlci5uZXh0KCk7Ci0JCQkJLy8gZXhjbHVkZSBUYXNrRGVzY3JpcHRvciBhbmQgUm9sZURlc2NyaXB0b3IgZnJvbSB0aGUgcGFyZW50Ci0JCQkJLy8gcGF0aCBiL2MgdGhvc2UgZGVzY3JpcHRvcnMgY2FuIGJlCi0JCQkJLy8gcGFyZW50IG9ubHkgaW4gQ0JTIHZpZXcKLQkJCQlpZiAoIShlIGluc3RhbmNlb2YgVGFza0Rlc2NyaXB0b3IgfHwgZSBpbnN0YW5jZW9mIFJvbGVEZXNjcmlwdG9yKSkgewotCQkJCQlwYXRoLmFwcGVuZCgnLycpLmFwcGVuZChlLmdldEd1aWQoKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCU1ldGhvZEVsZW1lbnQgZSA9IChNZXRob2RFbGVtZW50KSBUbmdVdGlsLnVud3JhcCh3cmFwcGVyKTsKLQkJcGF0aC5hcHBlbmQoJy8nKS5hcHBlbmQoZS5nZXRHdWlkKCkpOwotCQlyZXR1cm4gcGF0aDsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgTGlzdCBnZXRPd25SZWxhdGVkRWxlbWVudHMoQ29sbGVjdGlvbiBjaGFuZ2VkRGVzY3JpcHRvcnMsCi0JCQlib29sZWFuIHN1cHByZXNzZWQpIHsKLQkJaWYgKCFjaGFuZ2VkRGVzY3JpcHRvcnMuaXNFbXB0eSgpKSB7Ci0JCQlBcnJheUxpc3QgZGVzY3JpcHRvcnNUb0NoYW5nZSA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IG5ldyBBcnJheUxpc3QoY2hhbmdlZERlc2NyaXB0b3JzKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJRGVzY3JpcHRvciBkZXNjID0gKERlc2NyaXB0b3IpIGl0ZXIubmV4dCgpOwotCQkJCU9iamVjdFtdIHJlbGF0aW9uc2hpcHMgPSBudWxsOwotCQkJCWlmIChkZXNjIGluc3RhbmNlb2YgVGFza0Rlc2NyaXB0b3IpIHsKLQkJCQkJcmVsYXRpb25zaGlwcyA9IFJlbW92ZVVudXNlZERlc2NyaXB0b3JzQ29tbWFuZC5UQVNLX0RFU0NSSVBUT1JfX1JFTEFUSU9OU0hJUFM7Ci0JCQkJfSBlbHNlIGlmIChkZXNjIGluc3RhbmNlb2YgUm9sZURlc2NyaXB0b3IpIHsKLQkJCQkJcmVsYXRpb25zaGlwcyA9IFJlbW92ZVVudXNlZERlc2NyaXB0b3JzQ29tbWFuZC5ST0xFX0RFU0NSSVBUT1JfX1JFTEFUSU9OU0hJUFM7Ci0JCQkJfSBlbHNlIGlmIChkZXNjIGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yKSB7Ci0JCQkJCXJlbGF0aW9uc2hpcHMgPSBSZW1vdmVVbnVzZWREZXNjcmlwdG9yc0NvbW1hbmQuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX1JFTEFUSU9OU0hJUFM7Ci0JCQkJfQotCQkJCWlmIChyZWxhdGlvbnNoaXBzICE9IG51bGwpIHsKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWxhdGlvbnNoaXBzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQlPYmplY3QgZmVhdHVyZSA9IHJlbGF0aW9uc2hpcHNbaV07Ci0JCQkJCQlib29sZWFuIGlzTWFueTsKLQkJCQkJCU9iamVjdCB2YWx1ZTsKLQkJCQkJCWlmIChmZWF0dXJlIGluc3RhbmNlb2YgT3Bwb3NpdGVGZWF0dXJlKSB7Ci0JCQkJCQkJT3Bwb3NpdGVGZWF0dXJlIGYgPSAoT3Bwb3NpdGVGZWF0dXJlKSBmZWF0dXJlOwotCQkJCQkJCWlzTWFueSA9IGYuaXNNYW55KCk7Ci0JCQkJCQkJdmFsdWUgPSAoKE11bHRpUmVzb3VyY2VFT2JqZWN0KSBkZXNjKQotCQkJCQkJCQkJLmdldE9wcG9zaXRlRmVhdHVyZVZhbHVlKGYpOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlFU3RydWN0dXJhbEZlYXR1cmUgZiA9IChFU3RydWN0dXJhbEZlYXR1cmUpIGZlYXR1cmU7Ci0JCQkJCQkJaXNNYW55ID0gZi5pc01hbnkoKTsKLQkJCQkJCQl2YWx1ZSA9IGRlc2MuZUdldChmKTsKLQkJCQkJCX0KLQkJCQkJCWlmIChpc01hbnkpIHsKLQkJCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gKChDb2xsZWN0aW9uKSB2YWx1ZSkKLQkJCQkJCQkJCS5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJCURlc2NyaXB0b3IgcmVmID0gKERlc2NyaXB0b3IpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJCQkJaWYgKHJlZi5nZXRTdXBwcmVzc2VkKCkuYm9vbGVhblZhbHVlKCkgIT0gc3VwcHJlc3NlZAotCQkJCQkJCQkJCSYmICFQcm9jZXNzVXRpbAotCQkJCQkJCQkJCQkJLmNoZWNrRGVzY3JpcHRvclJlZmVyZW5jZXMoCi0JCQkJCQkJCQkJCQkJCWNoYW5nZWREZXNjcmlwdG9ycywgcmVmKSkgewotCQkJCQkJCQkJZGVzY3JpcHRvcnNUb0NoYW5nZS5hZGQocmVmKTsKLQkJCQkJCQkJCWNoYW5nZWREZXNjcmlwdG9ycy5hZGQocmVmKTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJRGVzY3JpcHRvciByZWYgPSAoRGVzY3JpcHRvcikgdmFsdWU7Ci0JCQkJCQkJaWYgKHJlZiAhPSBudWxsKSB7Ci0JCQkJCQkJCWlmIChyZWYuZ2V0U3VwcHJlc3NlZCgpLmJvb2xlYW5WYWx1ZSgpICE9IHN1cHByZXNzZWQKLQkJCQkJCQkJCQkmJiAhUHJvY2Vzc1V0aWwuY2hlY2tEZXNjcmlwdG9yUmVmZXJlbmNlcygKLQkJCQkJCQkJCQkJCWNoYW5nZWREZXNjcmlwdG9ycywgcmVmKSkgewotCQkJCQkJCQkJZGVzY3JpcHRvcnNUb0NoYW5nZS5hZGQocmVmKTsKLQkJCQkJCQkJCWNoYW5nZWREZXNjcmlwdG9ycy5hZGQocmVmKTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBkZXNjcmlwdG9yc1RvQ2hhbmdlOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFN1cHByZXNzZXMgb3IgcmV2ZWFscyB0aGUgZ2l2ZW4gc2VsZWN0aW9uCi0JICogCi0JICogQHBhcmFtIHNlbGVjdGlvbgotCSAqIEBwYXJhbSBzdXBwcmVzc2VkCi0JICogQHJldHVybiB7QGxpbmsgUmVzdWx0fSBvYmplY3QgdGhhdCBjb250YWlucyB0aGUgcmVzdWx0IG9mIHRoaXMgY2FsbAotCSAqLwotCXByaXZhdGUgUmVzdWx0IHNldFN1cHByZXNzZWQoTGlzdCBzZWxlY3Rpb24sIGJvb2xlYW4gc3VwcHJlc3NlZCkgewotCQlSZXN1bHQgcmVzdWx0ID0gZG9TZXRTdXBwcmVzc2VkKHNlbGVjdGlvbiwgc3VwcHJlc3NlZCk7Ci0KLQkJLy8gaWYgZGVzY3JpcHRvcnMgaGFkIGJlZW4gc3VwcHJlc3NlZCwgcmVsYXRlZCBlbGVtZW50cyB0aGF0IGFyZSBub3QKLQkJLy8gdXNlZCBhbnl3aGVyZSBlbHNlIGFsc28gbmVlZCB0byBiZSBzdXBwcmVzc2VkIChqdXN0IGxpa2UgZGVsZXRlKQotCQkvLwkKLQkJaWYgKCFyZXN1bHQuZGVzY3JpcHRvcnMuaXNFbXB0eSgpKSB7Ci0JCQlMaXN0IGRlc2NyaXB0b3JzVG9TdXBwcmVzcyA9IGdldE93blJlbGF0ZWRFbGVtZW50cygKLQkJCQkJcmVzdWx0LmRlc2NyaXB0b3JzLCBzdXBwcmVzc2VkKTsKLQkJCWlmIChkZXNjcmlwdG9yc1RvU3VwcHJlc3MgIT0gbnVsbCkgewotCQkJCVJlc3VsdCByZXN1bHQyID0gZG9TZXRTdXBwcmVzc2VkKGRlc2NyaXB0b3JzVG9TdXBwcmVzcywKLQkJCQkJCXN1cHByZXNzZWQpOwotCi0JCQkJLy8gbWVyZ2UgcmVzdWx0cwotCQkJCS8vCi0JCQkJcmVzdWx0LmVsZW1lbnRzLmFkZEFsbChyZXN1bHQyLmVsZW1lbnRzKTsKLQkJCQlyZXN1bHQuZGVzY3JpcHRvcnMuYWRkQWxsKHJlc3VsdDIuZGVzY3JpcHRvcnMpOwotCQkJCXJlc3VsdC5wYXRocy5hZGRBbGwocmVzdWx0Mi5wYXRocyk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIEBkZXByZWNhdGVkIG5lZWQgdG8gdXNlIHtAbGluayBTdXBwcmVzc2lvbkNvbW1hbmR9IGluc3RlYWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdXBwcmVzcyhMaXN0IHNlbGVjdGlvbikgewotCQlkb1NldFN1cHByZXNzZWQoc2VsZWN0aW9uLCB0cnVlKTsKLQl9Ci0KLQkvLyBwdWJsaWMgYm9vbGVhbiBzdXBwcmVzcyhMaXN0IHNlbGVjdGlvbikgewotCS8vIEFycmF5TGlzdCBzdXBwcmVzc2VkRGVzY3JpcHRvcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JLy8gYm9vbGVhbiByZXQgPSBzdXBwcmVzcyhzZWxlY3Rpb24sIHN1cHByZXNzZWREZXNjcmlwdG9ycyk7Ci0JLy8JCQotCS8vIC8vIGlmIGRlc2NyaXB0b3JzIGhhZCBiZWVuIHN1cHByZXNzZWQsIHJlbGF0ZWQgZWxlbWVudHMgdGhhdCBhcmUgbm90IHVzZWQKLQkvLyBhbnl3aGVyZSBlbHNlIGFsc28gbmVlZCB0byBiZSBzdXBwcmVzc2VkIChqdXN0IGxpa2UgZGVsZXRlKQotCS8vIC8vCi0JLy8gTGlzdCBkZXNjcmlwdG9yc1RvU3VwcHJlc3MgPSBnZXRPd25SZWxhdGVkRWxlbWVudHMoc3VwcHJlc3NlZERlc2NyaXB0b3JzLAotCS8vIHRydWUpOwotCS8vIGlmKGRlc2NyaXB0b3JzVG9TdXBwcmVzcyAhPSBudWxsKSB7Ci0JLy8gQXJyYXlMaXN0IG91dCA9IG5ldyBBcnJheUxpc3QoKTsKLQkvLyBib29sZWFuIHJldDIgPSBzdXBwcmVzcyhkZXNjcmlwdG9yc1RvU3VwcHJlc3MsIG91dCk7Ci0JLy8gaWYob3V0LnNpemUoKSAhPSBkZXNjcmlwdG9yc1RvU3VwcHJlc3Muc2l6ZSgpKSB7Ci0JLy8gTGlicmFyeUVkaXRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKCJTdXBwcmVzc2lvbi5zdXBwcmVzcyhMaXN0KQotCS8vIGlzIGJ1Z2d5LiIpOyAvLyROT04tTkxTLTEkCi0JLy8gfQotCS8vIHJldHVybiByZXQgfHwgcmV0MjsKLQkvLyB9Ci0JLy8gcmV0dXJuIHJldDsKLQkvLyB9Ci0KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBSZXN1bHQgewotCQkvKiogRWxlbWVudHMgdGhhdCBoYXZlIGJlZW4gc3VwcHJlc3NlZCBvciByZXZlYWxlZCAqLwotCQlDb2xsZWN0aW9uIGVsZW1lbnRzOwotCi0JCS8qKiBEZXNjcmlwdG9ycyB0aGF0IGhhdmUgYmVlbiBzdXBwcmVzc2VkIG9yIHJldmVhbGVkICovCi0JCUNvbGxlY3Rpb24gZGVzY3JpcHRvcnM7Ci0KLQkJLyoqCi0JCSAqIFBhdGhzIHRoYXQgaGF2ZSBiZWVuIGFkZGVkIHRvIG9yIHJlbW92ZWQgZnJvbQotCQkgKiA8Y29kZT5zdXBwcmVzc2VkRXh0ZXJuYWxFbGVtZW50UGF0aHM8L2NvZGU+Ci0JCSAqLwotCQlDb2xsZWN0aW9uIHBhdGhzOwotCi0JCVJlc3VsdCgpIHsKLQkJCWVsZW1lbnRzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJZGVzY3JpcHRvcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlwYXRocyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJfQotCi0JCWJvb2xlYW4gaXNFbXB0eSgpIHsKLQkJCXJldHVybiBlbGVtZW50cy5pc0VtcHR5KCkgJiYgcGF0aHMuaXNFbXB0eSgpOwotCQl9Ci0KLQkJdm9pZCBjbGVhcigpIHsKLQkJCWVsZW1lbnRzLmNsZWFyKCk7Ci0JCQlkZXNjcmlwdG9ycy5jbGVhcigpOwotCQkJcGF0aHMuY2xlYXIoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFN1cHByZXNzZXMgb3IgcmV2ZWFscyB0aGUgZ2l2ZW4gc2VsZWN0aW9uIGRlcGVuZGluZyBvbiB0aGUgdmFsdWUgb2YKLQkgKiA8Y29kZT5zdXBwcmVzc2VkPC9jb2RlPgotCSAqIAotCSAqIEBwYXJhbSBzZWxlY3Rpb24KLQkgKiBAcGFyYW0gc3VwcHJlc3NlZAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIFJlc3VsdCBkb1NldFN1cHByZXNzZWQoTGlzdCBzZWxlY3Rpb24sIGJvb2xlYW4gc3VwcHJlc3NlZCkgewotCQlSZXN1bHQgcmVzdWx0ID0gbmV3IFJlc3VsdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBzZWxlY3Rpb24uaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZWxlbWVudCA9IChPYmplY3QpIGl0ZXIubmV4dCgpOwotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgewotCQkJCUJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyIHdyYXBwZXIgPSAoQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIGVsZW1lbnQ7Ci0JCQkJLy8gaWYgKCFpc1N1cHByZXNzZWQod3JhcHBlcikpIHsKLQkJCQlCcmVha2Rvd25FbGVtZW50IGUgPSAoQnJlYWtkb3duRWxlbWVudCkgVG5nVXRpbC51bndyYXAod3JhcHBlcik7Ci0JCQkJaWYgKCF3cmFwcGVyLmlzUmVhZE9ubHkoKSkgewotCQkJCQkvLyB3cmFwcGVyIG9mIGxvY2FsIGVsZW1lbnQKLQkJCQkJLy8KLQkJCQkJaWYgKGUuZ2V0U3VwcHJlc3NlZCgpLmJvb2xlYW5WYWx1ZSgpICE9IHN1cHByZXNzZWQpIHsKLQkJCQkJCWUuc2V0U3VwcHJlc3NlZChCb29sZWFuLnZhbHVlT2Yoc3VwcHJlc3NlZCkpOwotCQkJCQkJcmVzdWx0LmVsZW1lbnRzLmFkZChlKTsKLQkJCQkJCWlmIChlIGluc3RhbmNlb2YgRGVzY3JpcHRvcikgewotCQkJCQkJCXJlc3VsdC5kZXNjcmlwdG9ycy5hZGQoZSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQkvLyBhZGQgdGhlIHBhdGhzIG9mIHN1cHByZXNzZWQgZWxlbWVudCB0byB0aGUgbWFwCi0JCQkJCS8vCi0JCQkJCVN0cmluZyBwYXRoID0gZ2V0UGF0aCh3cmFwcGVyKTsKLQkJCQkJYm9vbGVhbiBiOwotCQkJCQlpZiAoc3VwcHJlc3NlZCkgewotCQkJCQkJYiA9IGdldFN1cHByZXNzZWRFeHRlcm5hbEVsZW1lbnRQYXRocygpLmFkZChwYXRoKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCWIgPSBnZXRTdXBwcmVzc2VkRXh0ZXJuYWxFbGVtZW50UGF0aHMoKS5yZW1vdmUocGF0aCk7Ci0JCQkJCX0KLQkJCQkJaWYgKGIpIHsKLQkJCQkJCXJlc3VsdC5wYXRocy5hZGQocGF0aCk7Ci0JCQkJCX0KLQkJCQkJLy8gfQotCQkJCX0KLQkJCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCQlNZXRob2RFbGVtZW50IGUgPSAoKE1ldGhvZEVsZW1lbnQpIGVsZW1lbnQpOwotCQkJCWlmIChlLmdldFN1cHByZXNzZWQoKS5ib29sZWFuVmFsdWUoKSAhPSBzdXBwcmVzc2VkKSB7Ci0JCQkJCWUuc2V0U3VwcHJlc3NlZChCb29sZWFuLnZhbHVlT2Yoc3VwcHJlc3NlZCkpOwotCQkJCQlyZXN1bHQuZWxlbWVudHMuYWRkKGUpOwotCQkJCQlpZiAoZSBpbnN0YW5jZW9mIERlc2NyaXB0b3IpIHsKLQkJCQkJCXJlc3VsdC5kZXNjcmlwdG9ycy5hZGQoZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJbW9kaWZpZWQgPSAhcmVzdWx0LmlzRW1wdHkoKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvLyBwcml2YXRlIGJvb2xlYW4gc3VwcHJlc3MoTGlzdCBzZWxlY3Rpb24sIENvbGxlY3Rpb24KLQkvLyBzdXBwcmVzc2VkRGVzY3JpcHRvcnMpIHsKLQkvLyBib29sZWFuIHJlYWRPbmx5RWxlbWVudFN1cHByZXNzZWQgPSBmYWxzZTsKLQkvLyBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBzZWxlY3Rpb24uaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JLy8gT2JqZWN0IGVsZW1lbnQgPSAoT2JqZWN0KSBpdGVyLm5leHQoKTsKLQkvLyBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSB7Ci0JLy8gQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIgd3JhcHBlciA9Ci0JLy8gKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSBlbGVtZW50OwotCS8vIGlmICghaXNTdXBwcmVzc2VkKHdyYXBwZXIpKSB7Ci0JLy8gQnJlYWtkb3duRWxlbWVudCBlID0gKEJyZWFrZG93bkVsZW1lbnQpIFRuZ1V0aWwKLQkvLyAudW53cmFwKHdyYXBwZXIpOwotCS8vIGlmICghd3JhcHBlci5pc1JlYWRPbmx5KCkpIHsKLQkvLyAvLyB3cmFwcGVyIG9mIGxvY2FsIGVsZW1lbnQKLQkvLyAvLwotCS8vIGUuc2V0U3VwcHJlc3NlZChCb29sZWFuLlRSVUUpOwotCS8vIGlmKGUgaW5zdGFuY2VvZiBEZXNjcmlwdG9yKSB7Ci0JLy8gc3VwcHJlc3NlZERlc2NyaXB0b3JzLmFkZChlKTsKLQkvLyB9Ci0JLy8gfSBlbHNlIHsKLQkvLyAvLyBhZGQgdGhlIHBhdGhzIG9mIHN1cHByZXNzZWQgZWxlbWVudCB0byB0aGUgbWFwCi0JLy8gLy8KLQkvLyBTdHJpbmcgcGF0aCA9IGdldFBhdGgod3JhcHBlcik7Ci0JLy8gZ2V0U3VwcHJlc3NlZEV4dGVybmFsRWxlbWVudFBhdGhzKCkuYWRkKHBhdGgpOwotCS8vIHJlYWRPbmx5RWxlbWVudFN1cHByZXNzZWQgPSB0cnVlOwotCS8vIH0KLQkvLyB9Ci0JLy8gfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCS8vICgoTWV0aG9kRWxlbWVudCkgZWxlbWVudCkuc2V0U3VwcHJlc3NlZChCb29sZWFuLlRSVUUpOwotCS8vIGlmKGVsZW1lbnQgaW5zdGFuY2VvZiBEZXNjcmlwdG9yKSB7Ci0JLy8gc3VwcHJlc3NlZERlc2NyaXB0b3JzLmFkZChlbGVtZW50KTsKLQkvLyB9Ci0JLy8gfQotCS8vIH0KLQkvLyBtb2RpZmllZCA9IHRydWU7Ci0JLy8gcmV0dXJuIHJlYWRPbmx5RWxlbWVudFN1cHByZXNzZWQ7Ci0JLy8gfQotCi0JLyoqCi0JICogQHBhcmFtIHNlbGVjdGlvbgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNVbnN1cHByZXNzZWQoTGlzdCBzZWxlY3Rpb24pIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gc2VsZWN0aW9uLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyLm5leHQoKTsKLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIHsKLQkJCQlpZiAoIWlzU3VwcHJlc3NlZCgoQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIGVsZW1lbnQpKSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnQpIHsKLQkJCQlpZiAoIWlzU3VwcHJlc3NlZCgoQnJlYWtkb3duRWxlbWVudCkgZWxlbWVudCkpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIG1vZGlmaWVkLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2F2ZU5lZWRlZCgpIHsKLQkJcmV0dXJuIG1vZGlmaWVkOwotCX0KLQotCXB1YmxpYyB2b2lkIHNhdmVJc0RvbmUoKSB7Ci0JCW1vZGlmaWVkID0gZmFsc2U7Ci0JfQotCQotCXByb3RlY3RlZCBib29sZWFuIF9faXNTdXBwcmVzc2VkKENvbXBvc2VkQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIgY29tcG9zZWRXcmFwcGVyKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGNvbXBvc2VkV3JhcHBlci5nZXRWYWx1ZXMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gaXRlci5uZXh0KCk7Ci0JCQlpZighaXNTdXBwcmVzc2VkKGVsZW1lbnQpKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIGNoZWNrIGlmIHRoZSBlbGVtZW50LCBvciB0aGUgaXRlbSBwcm92aWRlciBvciBhZGFwdG9yIGFzc29jaWF0ZWQgd2l0aCB0aGUKLQkgKiBlbGVtZW50IGlzIHN1cHByZXNzZWQuCi0JICogCi0JICogQHBhcmFtIGUKLQkgKiAgICAgICAgICAgIE1ldGhvZEVsZW1lbnQgb3IgYW4gYXNzb2NpYXRlZCB3cmFwcGVyLCBhZGFwdG9yLCBvciBpdGVtCi0JICogICAgICAgICAgICBwcm92aWRlciwgZXRjLgotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU3VwcHJlc3NlZChPYmplY3QgZSkgewotCQkvLyBsb25nIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0KLQkJdHJ5IHsKLQotCQkJaWYgKGUgPT0gbnVsbCkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQkJCi0JCQlDb21wb3NlZEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyIGNvbXBvc2VkV3JhcHBlciA9IFByb2Nlc3NVdGlsLmdldENvbXBvc2VkV3JhcHBlcihlKTsKLQkJCWlmKGNvbXBvc2VkV3JhcHBlciAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIF9faXNTdXBwcmVzc2VkKGNvbXBvc2VkV3JhcHBlcik7Ci0JCQl9Ci0KLQkJCWlmIChpbnRlcm5hbFVuc3VwcHJlc3NlZEVsZW1lbnRzLmNvbnRhaW5zKGUpKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCi0JCQlpZiAoZSBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSB7Ci0JCQkJcmV0dXJuIF9faXNTdXBwcmVzc2VkKChCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgZSk7Ci0JCQl9IGVsc2UgaWYgKGUgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50KSB7Ci0JCQkJcmV0dXJuIF9faXNTdXBwcmVzc2VkKChCcmVha2Rvd25FbGVtZW50KSBlKTsKLQkJCX0gZWxzZSB7Ci0JCQkJT2JqZWN0IHRhcmdldE9iaiA9IG51bGw7Ci0JCQkJaWYgKGUgaW5zdGFuY2VvZiBXcmFwcGVySXRlbVByb3ZpZGVyKSB7Ci0JCQkJCXRhcmdldE9iaiA9ICgoV3JhcHBlckl0ZW1Qcm92aWRlcikgZSkuZ2V0VmFsdWUoKTsKLQkJCQl9IGVsc2UgaWYgKGUgaW5zdGFuY2VvZiBJdGVtUHJvdmlkZXJBZGFwdGVyKSB7Ci0JCQkJCXRhcmdldE9iaiA9ICgoSXRlbVByb3ZpZGVyQWRhcHRlcikgZSkuZ2V0VGFyZ2V0KCk7Ci0JCQkJfQotCi0JCQkJaWYgKHRhcmdldE9iaiAhPSBudWxsICYmIHRhcmdldE9iaiAhPSBlKSB7Ci0JCQkJCXJldHVybiBpc1N1cHByZXNzZWQodGFyZ2V0T2JqKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCXJldHVybiBmYWxzZTsKLQotCQl9IGZpbmFsbHkgewotCQkJLy8gbG9uZyB0aW1lID0gKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gc3RhcnQpOwotCQkJLy8gaWYodGltZSA+IDEwMDApIHsKLQkJCS8vIEJyZWFrZG93bkVsZW1lbnQgYmUgPSAoQnJlYWtkb3duRWxlbWVudClUbmdVdGlsLnVud3JhcChlKTsKLQkJCS8vIFN0cmluZyBtc2cgPSAiU3VwcHJlc3Npb24uaXNTdXBwcmVzc2VkKCk6IHRpbWUgdGFrZW4gKG1zKSAiICsKLQkJCS8vIHRpbWUgKwotCQkJLy8gIlxuIHByb2Nlc3M6ICIgKyAoZSBpbnN0YW5jZW9mCi0JCQkvLyBCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlciA/Ci0JCQkvLyAoKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKWUpLmdldFRvcEl0ZW0oKSA6Ci0JCQkvLyBUbmdVdGlsLmdldE93bmluZ1Byb2Nlc3MoYmUpKSArCi0JCQkvLyAiXG4gZWxlbWVudDogIiArIFByb2Nlc3NVdGlsLmdldExhYmVsV2l0aFBhdGgoYmUpOwotCQkJLy8JCQkJCi0JCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4obXNnKTsKLQkJCS8vIExpYnJhcnlFZGl0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dJbmZvKG1zZyk7Ci0JCQkvLyB9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBVcGRhdGVzIHRoZSBzdXBwcmVzc2lvbiBzdGF0ZSBvZiB0aGUgZ2l2ZW4gPGNvZGU+d3JhcHBlcjwvY29kZT4gZnJvbQotCSAqIGl0cyBiYXNlLgotCSAqIAotCSAqIEBwYXJhbSB3cmFwcGVyCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIGNhbGwgbW9kaWZpZWQgdGhlIHN1cHByZXNzaW9uIHN0YXRlCi0JICogICAgICAgICBvZiB0aGUgZ2l2ZW4gd3JhcHBlciwgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotCSAqLwotCXB1YmxpYyBib29sZWFuIHVwZGF0ZVN1cHByZXNzaW9uRnJvbUJhc2UoCi0JCQlCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlciB3cmFwcGVyKSB7Ci0JCVN0cmluZyBwYXRoID0gZ2V0UGF0aCh3cmFwcGVyKTsKLQkJYm9vbGVhbiByZXQ7Ci0JCUJyZWFrZG93bkVsZW1lbnQgZSA9IGdldFN1cHByZXNzZWQod3JhcHBlciwgdHJ1ZSwgZmFsc2UsIHRydWUsIGZhbHNlLAotCQkJCW51bGwpOwotCQlpZiAoZSAhPSBudWxsKSB7Ci0JCQlyZXQgPSBnZXRTdXBwcmVzc2VkRXh0ZXJuYWxFbGVtZW50UGF0aHMoKS5hZGQocGF0aCk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXQgPSBnZXRTdXBwcmVzc2VkRXh0ZXJuYWxFbGVtZW50UGF0aHMoKS5yZW1vdmUocGF0aCk7Ci0JCX0KLQkJaWYgKHJldCkgewotCQkJbW9kaWZpZWQgPSB0cnVlOwotCQl9Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JLyoqCi0JICogRXhjbHVkZXMgdGhlIGRlc2NyaXB0b3JzIHdpdGggdGhlIHNhbWUgbGlua2VkIGVsZW1lbnQgZnJvbSB0aGUgY2hlY2sKLQkgKiAKLQkgKiBAcGFyYW0gc2VsZWN0aW9uVG9SZXZlYWwKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIFN0cmluZyBjaGVja0R1cGxpY2F0ZU5hbWVBZnRlclJldmVhbCgKLQkJCUNvbGxlY3Rpb24gc2VsZWN0aW9uVG9SZXZlYWxPclN1cHByZXNzLAotCQkJQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJQ29sbGVjdGlvbiBlbGVtZW50c1RvUmV2ZWFsID0gZ2V0QXBwbGljYWJsZUl0ZW1zKAotCQkJCXNlbGVjdGlvblRvUmV2ZWFsT3JTdXBwcmVzcywgZmFsc2UpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBlbGVtZW50c1RvUmV2ZWFsLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyLm5leHQoKTsKLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudCkgewotCQkJCUJyZWFrZG93bkVsZW1lbnQgYmUgPSAoQnJlYWtkb3duRWxlbWVudCkgZWxlbWVudDsKLQkJCQlTdHJpbmcgbXNnID0gUHJvY2Vzc1V0aWwuY2hlY2tCcmVha2Rvd25FbGVtZW50TmFtZSgKLQkJCQkJCWFkYXB0ZXJGYWN0b3J5LCBiZSwgYmUuZ2V0TmFtZSgpLCB0aGlzKTsKLQkJCQlpZiAobXNnICE9IG51bGwpIHsKLQkJCQkJcmV0dXJuIExpYnJhcnlFZGl0UmVzb3VyY2VzLlN1cHByZXNzaW9uX25hbWVEdXBsaWNhdGlvbjsgCi0JCQkJfQotCQkJCW1zZyA9IFByb2Nlc3NVdGlsLmNoZWNrQnJlYWtkb3duRWxlbWVudFByZXNlbnRhdGlvbk5hbWUoCi0JCQkJCQlhZGFwdGVyRmFjdG9yeSwgYmUsIGJlLmdldFByZXNlbnRhdGlvbk5hbWUoKSwgdGhpcyk7Ci0JCQkJaWYgKG1zZyAhPSBudWxsKSB7Ci0JCQkJCXJldHVybiBMaWJyYXJ5RWRpdFJlc291cmNlcy5TdXBwcmVzc2lvbl9wcmVzZW50YXRpb25OYW1lRHVwbGljYXRpb247IAotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJT2JqZWN0IHVud3JhcHBlZCA9IFRuZ1V0aWwudW53cmFwKGVsZW1lbnQpOwotCQkJCWlmICh1bndyYXBwZWQgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50KSB7Ci0JCQkJCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciBpdGVtUHJvdmlkZXIgPSAoSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyKSBhZGFwdGVyRmFjdG9yeQotCQkJCQkJCS5hZGFwdChlbGVtZW50LCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkJCQlPYmplY3QgcGFyZW50ID0gaXRlbVByb3ZpZGVyLmdldFBhcmVudChlbGVtZW50KTsKLQkJCQkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnQpIHsKLQkJCQkJCWl0ZW1Qcm92aWRlciA9IChJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIpIGFkYXB0ZXJGYWN0b3J5Ci0JCQkJCQkJCS5hZGFwdChwYXJlbnQsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCQkJCQlDb2xsZWN0aW9uIHNpYmxpbmdzID0gaXRlbVByb3ZpZGVyLmdldENoaWxkcmVuKHBhcmVudCk7Ci0JCQkJCQlPYmplY3QgbGlua2VkRWxlbWVudCA9IG51bGw7Ci0JCQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIERlc2NyaXB0b3IpIHsKLQkJCQkJCQlsaW5rZWRFbGVtZW50ID0gUHJvY2Vzc1V0aWwKLQkJCQkJCQkJCS5nZXRBc3NvY2lhdGVkRWxlbWVudCgoRGVzY3JpcHRvcikgZWxlbWVudCk7Ci0JCQkJCQl9Ci0JCQkJCQl0cnkgewotCQkJCQkJCWludGVybmFsVW5zdXBwcmVzc2VkRWxlbWVudHMuYWRkKGVsZW1lbnQpOwotCQkJCQkJCW5hbWVDaGVja0xvb3A6IGZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBzaWJsaW5ncwotCQkJCQkJCQkJLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCQkJCQkJT2JqZWN0IHNpYmxpbmcgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCQkJCWlmIChzaWJsaW5nIGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudCkgewotCQkJCQkJCQkJQnJlYWtkb3duRWxlbWVudCBiZSA9IChCcmVha2Rvd25FbGVtZW50KSBzaWJsaW5nOwotCQkJCQkJCQkJLy8gc2tpcCBjaGVja2luZyBvbiBzdXBwcmVzc2VkIGVsZW1lbnQKLQkJCQkJCQkJCS8vCi0JCQkJCQkJCQlpZiAoYmUuZ2V0U3VwcHJlc3NlZCgpLmJvb2xlYW5WYWx1ZSgpKSB7Ci0JCQkJCQkJCQkJY29udGludWUgbmFtZUNoZWNrTG9vcDsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJCWlmIChsaW5rZWRFbGVtZW50ICE9IG51bGwKLQkJCQkJCQkJCQkJJiYgc2libGluZyBpbnN0YW5jZW9mIERlc2NyaXB0b3IpIHsKLQkJCQkJCQkJCQkvLyBza2lwIGNoZWNraW5nIG9uIGRlc2NyaXB0b3JzIHdpdGggdGhlCi0JCQkJCQkJCQkJLy8gc2FtZSBsaW5rZWQgZWxlbWVudAotCQkJCQkJCQkJCS8vCi0JCQkJCQkJCQkJT2JqZWN0IG90aGVyTGlua2VkRWxlbWVudCA9IFByb2Nlc3NVdGlsCi0JCQkJCQkJCQkJCQkuZ2V0QXNzb2NpYXRlZEVsZW1lbnQoKERlc2NyaXB0b3IpIGVsZW1lbnQpOwotCQkJCQkJCQkJCWlmIChvdGhlckxpbmtlZEVsZW1lbnQgPT0gbGlua2VkRWxlbWVudCkgewotCQkJCQkJCQkJCQljb250aW51ZSBuYW1lQ2hlY2tMb29wOwotCQkJCQkJCQkJCX0KLQkJCQkJCQkJCX0KLQkJCQkJCQkJCVN0cmluZyBtc2cgPSBQcm9jZXNzVXRpbAotCQkJCQkJCQkJCQkuY2hlY2tCcmVha2Rvd25FbGVtZW50TmFtZSgKLQkJCQkJCQkJCQkJCQlhZGFwdGVyRmFjdG9yeSwgYmUsIGJlCi0JCQkJCQkJCQkJCQkJCQkuZ2V0TmFtZSgpLCB0aGlzKTsKLQkJCQkJCQkJCWlmIChtc2cgIT0gbnVsbCkgewotCQkJCQkJCQkJCXJldHVybiBMaWJyYXJ5RWRpdFJlc291cmNlcy5TdXBwcmVzc2lvbl9uYW1lRHVwbGljYXRpb247IAotCQkJCQkJCQkJfQotCQkJCQkJCQkJbXNnID0gUHJvY2Vzc1V0aWwKLQkJCQkJCQkJCQkJLmNoZWNrQnJlYWtkb3duRWxlbWVudFByZXNlbnRhdGlvbk5hbWUoCi0JCQkJCQkJCQkJCQkJYWRhcHRlckZhY3RvcnksIGJlLAotCQkJCQkJCQkJCQkJCWJlLmdldFByZXNlbnRhdGlvbk5hbWUoKSwKLQkJCQkJCQkJCQkJCQl0aGlzKTsKLQkJCQkJCQkJCWlmIChtc2cgIT0gbnVsbCkgewotCQkJCQkJCQkJCXJldHVybiBMaWJyYXJ5RWRpdFJlc291cmNlcy5TdXBwcmVzc2lvbl9wcmVzZW50YXRpb25OYW1lRHVwbGljYXRpb247IAotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfSBmaW5hbGx5IHsKLQkJCQkJCQlpbnRlcm5hbFVuc3VwcHJlc3NlZEVsZW1lbnRzLnJlbW92ZShlbGVtZW50KTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldE9iamVjdEJ5UGF0aChTdHJpbmdbXSBndWlkUGF0aCwKLQkJCUFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCWlmIChndWlkUGF0aC5sZW5ndGggPT0gMCB8fCBhZGFwdGVyRmFjdG9yeSA9PSBudWxsCi0JCQkJfHwgIWd1aWRQYXRoWzBdLmVxdWFscyhwcm9jZXNzLmdldEd1aWQoKSkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJT2JqZWN0IG9iamVjdCA9IHByb2Nlc3M7Ci0JCWludCBsZW4gPSBndWlkUGF0aC5sZW5ndGg7Ci0JCWZvciAoaW50IGkgPSAxOyBpIDwgbGVuOyBpKyspIHsKLQkJCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciBhZGFwdGVyID0gKElUcmVlSXRlbUNvbnRlbnRQcm92aWRlcikgYWRhcHRlckZhY3RvcnkKLQkJCQkJLmFkYXB0KG9iamVjdCwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCWJvb2xlYW4gZm91bmQgPSBmYWxzZTsKLQotCQkJLy8gaWYgY3VycmVudCBvYmplY3QgaXMgYW4gYWN0aXZpdHksIG1ha2Ugc3VyZSBpdCBpcyByb2xsZWQgZG93bgotCQkJLy8gYmVmb3JlIGxvb2tpbmcgaW50byBpdHMgY2hpbGRyZW4KLQkJCS8vCi0JCQlJQlNJdGVtUHJvdmlkZXIgcm9sbGVkVXBBZGFwdGVyID0gbnVsbDsKLQkJCUl0ZXJhdG9yIGl0ZXIgPSBudWxsOwotCQkJdHJ5IHsKLQkJCQlpZiAoVG5nVXRpbC51bndyYXAob2JqZWN0KSBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJCWlmIChhZGFwdGVyIGluc3RhbmNlb2YgQlNBY3Rpdml0eUl0ZW1Qcm92aWRlcikgewotCQkJCQkJQlNBY3Rpdml0eUl0ZW1Qcm92aWRlciBhY3Rpdml0eUl0ZW1Qcm92aWRlciA9IChCU0FjdGl2aXR5SXRlbVByb3ZpZGVyKSBhZGFwdGVyOwotCQkJCQkJaWYgKGFjdGl2aXR5SXRlbVByb3ZpZGVyLmlzUm9sbGVkVXAoKSkgewotCQkJCQkJCWFjdGl2aXR5SXRlbVByb3ZpZGVyLmJhc2ljU2V0Um9sbGVkVXAoZmFsc2UpOwotCQkJCQkJCXJvbGxlZFVwQWRhcHRlciA9IGFjdGl2aXR5SXRlbVByb3ZpZGVyOwotCQkJCQkJfQotCQkJCQl9IGVsc2UgaWYgKGFkYXB0ZXIgaW5zdGFuY2VvZiBJQlNJdGVtUHJvdmlkZXIpIHsKLQkJCQkJCUlCU0l0ZW1Qcm92aWRlciBpdGVtUHJvdmlkZXIgPSAoSUJTSXRlbVByb3ZpZGVyKSBhZGFwdGVyOwotCQkJCQkJaWYgKGl0ZW1Qcm92aWRlci5pc1JvbGxlZFVwKCkpIHsKLQkJCQkJCQlpdGVtUHJvdmlkZXIuc2V0Um9sbGVkVXAoZmFsc2UpOwotCQkJCQkJCXJvbGxlZFVwQWRhcHRlciA9IGl0ZW1Qcm92aWRlcjsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQlpdGVyID0gYWRhcHRlci5nZXRDaGlsZHJlbihvYmplY3QpLml0ZXJhdG9yKCk7Ci0JCQl9IGZpbmFsbHkgewotCQkJCWlmIChyb2xsZWRVcEFkYXB0ZXIgIT0gbnVsbCkgewotCQkJCQlyb2xsZWRVcEFkYXB0ZXIuc2V0Um9sbGVkVXAodHJ1ZSk7Ci0JCQkJfQotCQkJfQotCi0JCQlmaW5kX2NoaWxkOiB3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCQlPYmplY3QgY2hpbGQgPSBpdGVyLm5leHQoKTsKLQkJCQlPYmplY3QgZSA9IFRuZ1V0aWwudW53cmFwKGNoaWxkKTsKLQkJCQlpZiAoZSBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQKLQkJCQkJCSYmICgoTWV0aG9kRWxlbWVudCkgZSkuZ2V0R3VpZCgpLmVxdWFscyhndWlkUGF0aFtpXSkpIHsKLQkJCQkJZm91bmQgPSB0cnVlOwotCQkJCQlvYmplY3QgPSBjaGlsZDsKLQkJCQkJYnJlYWsgZmluZF9jaGlsZDsKLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmICghZm91bmQpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gb2JqZWN0OwotCX0KLQotCS8qKgotCSAqIENoZWNrcyBpZiB0aGUgYnJlYWtkb3duIGVsZW1lbnQgaWRlbnRpZmllZCBieSB0aGUgZ2l2ZW4KLQkgKiA8Y29kZT5ndWlkUGF0aDwvY29kZT4gaXMgc3VwcHJlc3NlZCBpbiB0aGUgcHJvY2VzcyBvZiB0aGlzIFN1cHByZXNzaW9uCi0JICogb2JqZWN0Ci0JICogCi0JICogQHBhcmFtIGd1aWRQYXRoCi0JICogQHJldHVybgotCSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgaWYgdGhlIG9iamVjdCB3aXRoIHRoZSBnaXZlbiBwYXRoIGNvdWxkIG5vdCBiZSBmb3VuZCB1c2luZwotCSAqICAgICAgICAgICAgICAgIHRoZSBnaXZlbiBhZGFwdGVyIGZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1N1cHByZXNzZWQoU3RyaW5nW10gZ3VpZFBhdGgsIEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KQotCQkJdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7Ci0JCU9iamVjdCBvYmplY3QgPSBnZXRPYmplY3RCeVBhdGgoZ3VpZFBhdGgsIGFkYXB0ZXJGYWN0b3J5KTsKLQkJaWYgKG9iamVjdCA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAotCQkJCQkiQ291bGQgbm90IGZpbmQgb2JqZWN0IHdpdGggcGF0aCAnIiArIGd1aWRQYXRoICsgIiciKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQkJcmV0dXJuIGlzU3VwcHJlc3NlZChvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHNldCBvZiBzdXBwcmVzc2VkIGl0ZW0gb2YgdGhlIGdpdmVuIHByb2Nlc3Nlcy4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvYwotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yaWVzCi0JICogICAgICAgICAgICB0aGUgYWRhcHRlciBmYWN0b3JpZXMgZm9yIFdCUywgVEJTLCBXUEJTLCBhbmQgQ0JTIHZpZXdzCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU2V0IGdldFN1cHByZXNzZWRJdGVtcyhQcm9jZXNzIHByb2MsCi0JCQlBZGFwdGVyRmFjdG9yeVtdIGFkYXB0ZXJGYWN0b3JpZXMpIHsKLQkJU2V0IHN1cHByZXNzZWRJdGVtcyA9IG5ldyBIYXNoU2V0KCk7Ci0JCVN1cHByZXNzaW9uIHN1cHByZXNzaW9uID0gbmV3IFN1cHByZXNzaW9uKHByb2MpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGFkYXB0ZXJGYWN0b3JpZXMubGVuZ3RoOyBpKyspIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IG5ldyBBZGFwdGVyRmFjdG9yeVRyZWVJdGVyYXRvcigKLQkJCQkJYWRhcHRlckZhY3Rvcmllc1tpXSwgcHJvYyk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBpdGVtID0gaXRlci5uZXh0KCk7Ci0JCQkJaWYgKHN1cHByZXNzaW9uLmlzU3VwcHJlc3NlZChpdGVtKSkgewotCQkJCQlzdXBwcmVzc2VkSXRlbXMuYWRkKGl0ZW0pOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwcHJlc3NlZEl0ZW1zOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgY2xhc3MgU3VwcHJlc3Npb25Db21tYW5kIGV4dGVuZHMgQWJzdHJhY3RDb21tYW5kIGltcGxlbWVudHMKLQkJCUlSZXNvdXJjZUF3YXJlQ29tbWFuZCB7Ci0JCXByb3RlY3RlZCBDb2xsZWN0aW9uIG1vZGlmaWVkUmVzb3VyY2VzOwotCi0JCXByb3RlY3RlZCBMaXN0IGNvbGxlY3Rpb247Ci0KLQkJcHJvdGVjdGVkIFJlc3VsdCByZXN1bHQ7Ci0KLQkJcHJvdGVjdGVkIGJvb2xlYW4gc3VwcHJlc3NlZDsKLQotCQlwcm90ZWN0ZWQgU3VwcHJlc3Npb24gc3VwcHJlc3Npb247Ci0KLQkJcHVibGljIFN1cHByZXNzaW9uQ29tbWFuZChTdXBwcmVzc2lvbiBzdXBwcmVzc2lvbiwgTGlzdCBzZWxlY3Rpb24sCi0JCQkJYm9vbGVhbiBzdXBwcmVzc2VkKSB7Ci0JCQl0aGlzLnN1cHByZXNzaW9uID0gc3VwcHJlc3Npb247Ci0JCQljb2xsZWN0aW9uID0gc2VsZWN0aW9uOwotCQkJdGhpcy5zdXBwcmVzc2VkID0gc3VwcHJlc3NlZDsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklSZXNvdXJjZUF3YXJlQ29tbWFuZCNnZXRNb2RpZmllZFJlc291cmNlcygpCi0JCSAqLwotCQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRNb2RpZmllZFJlc291cmNlcygpIHsKLQkJCWlmIChtb2RpZmllZFJlc291cmNlcyA9PSBudWxsKSB7Ci0JCQkJbW9kaWZpZWRSZXNvdXJjZXMgPSBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KHN1cHByZXNzaW9uCi0JCQkJCQkuZ2V0UHJvY2VzcygpLmVSZXNvdXJjZSgpKTsKLQkJCX0KLQkJCXJldHVybiBtb2RpZmllZFJlc291cmNlczsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQjZXhlY3V0ZSgpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQkJcmVzdWx0ID0gc3VwcHJlc3Npb24uc2V0U3VwcHJlc3NlZChjb2xsZWN0aW9uLCBzdXBwcmVzc2VkKTsKLQkJCWRpZEV4ZWN1dGUoKTsKLQkJfQotCi0JCS8qKgotCQkgKiAKLQkJICovCi0JCXByb3RlY3RlZCB2b2lkIGRpZEV4ZWN1dGUoKSB7Ci0KLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQjcmVkbygpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCByZWRvKCkgewotCQkJZXhlY3V0ZSgpOwotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQWJzdHJhY3RDb21tYW5kI3VuZG8oKQotCQkgKi8KLQkJcHVibGljIHZvaWQgdW5kbygpIHsKLQkJCWlmIChyZXN1bHQgIT0gbnVsbCAmJiAhcmVzdWx0LmlzRW1wdHkoKSkgewotCQkJCWlmICghcmVzdWx0LmVsZW1lbnRzLmlzRW1wdHkoKSkgewotCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSByZXN1bHQuZWxlbWVudHMuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlNZXRob2RFbGVtZW50IGUgPSAoTWV0aG9kRWxlbWVudCkgaXRlci5uZXh0KCk7Ci0JCQkJCQllLnNldFN1cHByZXNzZWQoQm9vbGVhbi52YWx1ZU9mKCFzdXBwcmVzc2VkKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKCFyZXN1bHQucGF0aHMuaXNFbXB0eSgpKSB7Ci0JCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHJlc3VsdC5wYXRocy5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCU9iamVjdCBwYXRoID0gaXRlci5uZXh0KCk7Ci0JCQkJCQlpZiAoc3VwcHJlc3NlZCkgewotCQkJCQkJCXN1cHByZXNzaW9uLmdldFN1cHByZXNzZWRFeHRlcm5hbEVsZW1lbnRQYXRocygpCi0JCQkJCQkJCQkucmVtb3ZlKHBhdGgpOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlzdXBwcmVzc2lvbi5nZXRTdXBwcmVzc2VkRXh0ZXJuYWxFbGVtZW50UGF0aHMoKQotCQkJCQkJCQkJLmFkZChwYXRoKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQlkaWRVbmRvKCk7Ci0JCQkJcmVzdWx0LmNsZWFyKCk7Ci0JCQl9Ci0JCX0KLQotCQkvKioKLQkJICogCi0JCSAqLwotCQlwcm90ZWN0ZWQgdm9pZCBkaWRVbmRvKCkgewotCi0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5BYnN0cmFjdENvbW1hbmQjcHJlcGFyZSgpCi0JCSAqLwotCQlwcm90ZWN0ZWQgYm9vbGVhbiBwcmVwYXJlKCkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5BYnN0cmFjdENvbW1hbmQjZ2V0UmVzdWx0KCkKLQkJICovCi0JCXB1YmxpYyBDb2xsZWN0aW9uIGdldFJlc3VsdCgpIHsKLQkJCWlmICghcmVzdWx0LmlzRW1wdHkoKSkgewotCQkJCXJldHVybiBjb2xsZWN0aW9uOwotCQkJfQotCQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5BYnN0cmFjdENvbW1hbmQjZ2V0QWZmZWN0ZWRPYmplY3RzKCkKLQkJICovCi0JCXB1YmxpYyBDb2xsZWN0aW9uIGdldEFmZmVjdGVkT2JqZWN0cygpIHsKLQkJCXJldHVybiBjb2xsZWN0aW9uOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gaXNSZWFkT25seUVsZW1lbnRBZmZlY3RlZCgpIHsKLQkJCXJldHVybiAhcmVzdWx0LnBhdGhzLmlzRW1wdHkoKTsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkFic3RyYWN0Q29tbWFuZCNkaXNwb3NlKCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCQlpZiAocmVzdWx0ICE9IG51bGwpIHsKLQkJCQlyZXN1bHQuY2xlYXIoKTsKLQkJCX0KLQotCQkJc3VwZXIuZGlzcG9zZSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIG9iagotCSAqIEByZXR1cm4gcGh5c2ljYWwgc3RhdGUgb2YgdGhlIHByb2Nlc3NFbGVtZW50Ci0JICovCi0JcHVibGljIGJvb2xlYW4gaXNJdHNlbGZTdXBwcmVzc2VkKE9iamVjdCBvYmopewotCQlpZihvYmogaW5zdGFuY2VvZiBQcm9jZXNzRWxlbWVudCl7Ci0JCQlyZXR1cm4gKChQcm9jZXNzRWxlbWVudClvYmopLmdldFN1cHByZXNzZWQoKTsKLQkJfQotCQkKLQkJaWYob2JqIGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIgJiYgUHJvY2Vzc1V0aWwuaXNJbmhlcml0ZWQob2JqKSl7Ci0JCQlyZXR1cm4gaXNJblN1cHByZXNzZWRMaXN0KChCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcilvYmopOwotCQl9Ci0JCQotCQlpZihvYmogaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlciAmJiAhUHJvY2Vzc1V0aWwuaXNJbmhlcml0ZWQob2JqKSl7Ci0JCQlPYmplY3Qgb2JqZWN0ID0gVG5nVXRpbC51bndyYXAob2JqKTsKLQkJCXJldHVybiAoKE1ldGhvZEVsZW1lbnQpb2JqZWN0KS5nZXRTdXBwcmVzc2VkKCk7Ci0JCX0KLQkJCQkKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc1N1cHByZXNzZWQoT2JqZWN0IG9iaiwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUpIHsKLQkJcmV0dXJuIGlzU3VwcHJlc3NlZChvYmopOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL1RuZ1V0aWwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9UbmdVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5YmJjZTkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL1RuZ1V0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwODMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLlN0cmluZ1dyaXRlcjsKLWltcG9ydCBqYXZhLm5ldC5VUkk7Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmRXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21wb3VuZENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkFic3RyYWN0VHJlZUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXBVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsLkNvcGllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkFkZENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Nb3ZlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLlBhc3RlRnJvbUNsaXBib2FyZENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5SZW1vdmVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuU2V0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5BdHRyaWJ1dGVWYWx1ZVdyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5GZWF0dXJlTWFwRW50cnlXcmFwcGVySXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklDaGFuZ2VOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRGlzcG9zYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSU5vdGlmeUNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVdyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5OZXRVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuU3RyVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkZlYXR1cmVWYWx1ZVdyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRGVmYXVsdE5hbWVTZXR0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUdyb3VwQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlByZXNlbnRhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNhdGVnb3J5LkN1c3RvbUNhdGVnb3J5SXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY2F0ZWdvcnkuU3RhbmRhcmRDYXRlZ29yaWVzSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JQWN0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSVJlc291cmNlQXdhcmVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuZWxlbWVudC5Db250ZW50UGFja2FnZUl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmludGVybmFsLklMaXN0ZW5lclByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQubmF2aWdhdG9yLkNvbnRlbnRJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5uYXZpZ2F0b3IuTWV0aG9kUGx1Z2luSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuSUJTSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kLk1vdmVEb3duQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZC5Nb3ZlVXBDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5tb2RlbC5PcmRlckluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLm1vZGVsLk9yZGVySW5mb0NvbGxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLm1vZGVsLnV0aWwuU3RyaW5nUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLkRlcGVuZGVuY3lDaGVja2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbi5OYW1lQ2hlY2tlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb24uVW5pcXVlTmFtZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzLklBY2Nlc3NDb250cm9sbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy5JRmlsZUJhc2VkTGlicmFyeVBlcnNpc3RlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VydmljZXMuU2VydmljZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DYXBhYmlsaXR5UGF0dGVybjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRDYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DdXN0b21DYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJ5UHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaWJhYmxlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpc2NpcGxpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Eb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5FeGFtcGxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3VpZGFuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnRQcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTmFtZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NQbGFubmluZ1RlbXBsYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUmV1c2FibGVBc3NldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGVtcGxhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Ub29sOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5XaGl0ZXBhcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya0JyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrT3JkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLmltcGwuTXVsdGlSZXNvdXJjZUVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS51dGlsLk9wcG9zaXRlRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLk1ldGhvZEVsZW1lbnRJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5VbWFFZGl0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuVW1hSXRlbVByb3ZpZGVyQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkFzc29jaWF0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5NZXNzYWdlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5VbWFSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotaW1wb3J0IGNvbS5pYm0uaWN1LnV0aWwuU3RyaW5nVG9rZW5pemVyOwotCi0KLS8qKgotICogVXRpbGl0eSBjbGFzcyB3aXRoIHN0YXRpYyBtZXRob2RzIGZvciBtZXRob2QgYXV0aG9yaW5nCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgVG5nVXRpbCB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFVtYUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5IHVtYUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5ID0gbmV3IFVtYUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUcgPSBMaWJyYXJ5RWRpdFBsdWdpbi5nZXRQbHVnaW4oKQotCQkJLmlzRGVidWdnaW5nKCk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHVUlEQU5DRV9GSUxFU1RSSU5HX1NFUEFSQVRPUiA9ICJ8IjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEdVSURBTkNFX0ZJTEVTVFJJTkdfU0VQQVJBVE9SX1NQTElUVEVSID0gIlxcfCI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTU1BX1NFUEFSQVRPUiA9ICIsIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT01NQV9TRVBBUkFUT1JfU1BMSVRURVIgPSAiXFwsIjsgLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBVQkxJU0hfQ0FURUdPUllfUFJPUEVSVFkgPSAiUFVCTElTSF9DQVRFR09SWSI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBSZW1vdmVzIGFsbCBhZGFwdGVycyB0aGF0IGFyZSBpbnN0YW5jZSBvZiB0aGUgZ2l2ZW4gY2xhc3MgZnJvbSB0aGUgZ2l2ZW4KLQkgKiBFT2JqZWN0LgotCSAqIAotCSAqIEBwYXJhbSBlT2JqCi0JICogQHBhcmFtIGNscwotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVBZGFwdGVycyhFT2JqZWN0IGVPYmosIENsYXNzIGNscykgewotCQlmb3IgKEl0ZXJhdG9yIGFkYXB0ZXJzID0gZU9iai5lQWRhcHRlcnMoKS5pdGVyYXRvcigpOyBhZGFwdGVycwotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQlBZGFwdGVyIGFkYXB0ZXIgPSAoQWRhcHRlcikgYWRhcHRlcnMubmV4dCgpOwotCQkJaWYgKGNscy5pc0luc3RhbmNlKGFkYXB0ZXIpKSB7Ci0JCQkJYWRhcHRlcnMucmVtb3ZlKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIE9iamVjdCBnZXRBZGFwdGVyKEVPYmplY3QgZU9iaiwgQ2xhc3MgY2xzKSB7Ci0JCWZvciAoSXRlcmF0b3IgYWRhcHRlcnMgPSBlT2JqLmVBZGFwdGVycygpLml0ZXJhdG9yKCk7IGFkYXB0ZXJzCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCUFkYXB0ZXIgYWRhcHRlciA9IChBZGFwdGVyKSBhZGFwdGVycy5uZXh0KCk7Ci0JCQlpZiAoY2xzLmlzSW5zdGFuY2UoYWRhcHRlcikpIHsKLQkJCQlyZXR1cm4gYWRhcHRlcjsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIEFkYXB0ZXIgYWRhcHQoQWRhcHRlckZhY3RvcnkgZmFjdG9yeSwgTm90aWZpZXIgbm90aWZpZXIsCi0JCQlPYmplY3QgdHlwZSwgQ2xhc3Mgdmlld1R5cGUpIHsKLQkJZm9yIChJdGVyYXRvciBhZGFwdGVycyA9IG5vdGlmaWVyLmVBZGFwdGVycygpLml0ZXJhdG9yKCk7IGFkYXB0ZXJzCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCUFkYXB0ZXIgYWRhcHRlciA9IChBZGFwdGVyKSBhZGFwdGVycy5uZXh0KCk7Ci0JCQlpZiAoYWRhcHRlci5pc0FkYXB0ZXJGb3JUeXBlKHR5cGUpICYmIHZpZXdUeXBlLmlzSW5zdGFuY2UoYWRhcHRlcikpIHsKLQkJCQlyZXR1cm4gYWRhcHRlcjsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFjdG9yeS5hZGFwdE5ldyhub3RpZmllciwgdHlwZSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzVmFsaWRGaWxlTmFtZShTdHJpbmcgbmFtZSkgewotCQlpZiAoU3RyVXRpbC5pc0JsYW5rKG5hbWUpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAobmFtZS5pbmRleE9mKCcvJykgIT0gLTEgfHwgbmFtZS5pbmRleE9mKCdcXCcpICE9IC0xCi0JCQkJfHwgbmFtZS5pbmRleE9mKCc6JykgIT0gLTEgfHwgbmFtZS5pbmRleE9mKCcqJykgIT0gLTEKLQkJCQl8fCBuYW1lLmluZGV4T2YoJz8nKSAhPSAtMSB8fCBuYW1lLmluZGV4T2YoJyInKSAhPSAtMQotCQkJCXx8IG5hbWUuaW5kZXhPZignPCcpICE9IC0xIHx8IG5hbWUuaW5kZXhPZignPicpICE9IC0xCi0JCQkJfHwgbmFtZS5pbmRleE9mKCd8JykgIT0gLTEgfHwgbmFtZS5pbmRleE9mKCc7JykgIT0gLTEpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiB0cnVlOwotCX0KLQkKLQkvKioKLQkgKiB2YWxpZGF0ZSB0aGUgc3RyaW5nIGZvciBhIHBsdWdpbiBuYW1lCi0JICogCi0JICogQHBhcmFtIG5hbWUgU3RyaW5nCi0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNWYWxpZFBsdWdpbk5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJaWYgKGlzVmFsaWRGaWxlTmFtZShuYW1lKSA9PSBmYWxzZSApIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQkKLQkJLy8gbmVlZCB0byByZW1vdmUgdGhlc2UgY2hhcmFjdGVycyBzaW5jZSB0aGV5IGNhdXNlZCBwcm9ibGVtIHdpdGggZWxlbWVudCB1cmwgZW5jb2RpbmcsIGJvb2ttYXJrIGlzc3VlLCAKLQkJLy8gYW5kIGphdmFzY3JpcHQgc3RyaW5nIGxpdGVybmFsIGVzY2FwaW5nIGlzc3VlCi0JCS8vIHNlZSAxNTY5NDYgLSBwbHVnaW4gbmFtZSBzaG91bGQgbm90IGFsbG93ICUsICMsIGFuZCAnCi0JCWlmIChuYW1lLmluZGV4T2YoJyUnKSAhPSAtMSB8fCBuYW1lLmluZGV4T2YoJyMnKSAhPSAtMQotCQkJCXx8IG5hbWUuaW5kZXhPZignXCcnKSAhPSAtMSApCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIENoZWNrcyBpZiB0aGUgZ2l2ZW4gbmFtZSBpcyB2YWxpZCBmb3IgdGhlIGdpdmVuIEVPYmplY3QuCi0JICogCi0JICogQHBhcmFtIGVPYmoKLQkgKiBAcGFyYW0gbmFtZQotCSAqIEBwYXJhbSBlQ2xhc3NlcwotCSAqICAgICAgICAgICAgY29sbGVjdGlvbiBvZiBFQ2xhc3Mgb2JqZWN0cy4gVGhlIEVPYmplY3QgaW5zdGFuY2VzIG9mIHRoZXNlCi0JICogICAgICAgICAgICBFQ2xhc3Mgb2JqZWN0cyB3aWxsIGJlIHNhdmVkIGluIHRoZWlyIG93biBkaXJlY3RvcnkuCi0JICogQHJldHVybiBudWxsIGlmIHN1Y2Nlc3NmdWwsIGVycm9yIG1lc3NhZ2Ugb3RoZXJ3aXNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNoZWNrTmFtZShOYW1lZEVsZW1lbnQgZSwgU3RyaW5nIG5hbWUsCi0JCQlDb2xsZWN0aW9uIGVDbGFzc2VzKSB7Ci0JCXJldHVybiBjaGVja05hbWUoKChFT2JqZWN0KSBlKS5lQ29udGFpbmVyKCksIGUsIG5hbWUsIFRuZ1V0aWwKLQkJCQkuZ2V0VHlwZVRleHQoZSksIGVDbGFzc2VzKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjaGVja05hbWUoRU9iamVjdCBwYXJlbnQsIE5hbWVkRWxlbWVudCBlLCBTdHJpbmcgbmFtZSwKLQkJCVN0cmluZyBlbGVtZW50VHlwZVRleHQsIENvbGxlY3Rpb24gZUNsYXNzZXMpIHsKLQkJU3RyaW5nIG1zZyA9IGNoZWNrRWxlbWVudE5hbWUobmFtZSwgZWxlbWVudFR5cGVUZXh0KTsKLQkJaWYgKG1zZyAhPSBudWxsKQotCQkJcmV0dXJuIG1zZzsKLQkJaWYgKHBhcmVudCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCUxpc3QgY2hpbGRyZW4gPSBwYXJlbnQuZUNvbnRlbnRzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4uc2l6ZSgpOyBpKyspIHsKLQkJCU5hbWVkRWxlbWVudCBjaGlsZCA9IChOYW1lZEVsZW1lbnQpIGNoaWxkcmVuLmdldChpKTsKLQkJCWlmIChjaGlsZCAhPSBlICYmIGlzRUNsYXNzSW5zdGFuY2VPZihlQ2xhc3NlcywgY2hpbGQpCi0JCQkJCSYmIG5hbWUuZXF1YWxzSWdub3JlQ2FzZShjaGlsZC5nZXROYW1lKCkpKSB7Ci0JCQkJLy8JCXJldHVybiBJMThuVXRpbC5mb3JtYXRTdHJpbmcoUkVTT1VSQ0VfQlVORExFLCBrZXksIGRhdGEpOwotCQkJCXJldHVybiBOTFMuYmluZChMaWJyYXJ5RWRpdFJlc291cmNlcy5kdXBsaWNhdGVFbGVtZW50TmFtZUVycm9yX21zZywgbmFtZSk7IAotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNoZWNrTmFtZShFT2JqZWN0IHBhcmVudCwgTmFtZWRFbGVtZW50IGUsIFN0cmluZyBuYW1lLAotCQkJU3RyaW5nIGVsZW1lbnRUeXBlVGV4dCwgSUZpbHRlciBjaGlsZEZpbHRlcikgewotCQlTdHJpbmcgbXNnID0gY2hlY2tFbGVtZW50TmFtZShuYW1lLCBlbGVtZW50VHlwZVRleHQpOwotCQlpZiAobXNnICE9IG51bGwpCi0JCQlyZXR1cm4gbXNnOwotCQlpZiAocGFyZW50ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJTGlzdCBjaGlsZHJlbiA9IHBhcmVudC5lQ29udGVudHMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5zaXplKCk7IGkrKykgewotCQkJTmFtZWRFbGVtZW50IGNoaWxkID0gKE5hbWVkRWxlbWVudCkgY2hpbGRyZW4uZ2V0KGkpOwotCQkJaWYgKGNoaWxkICE9IGUgJiYgY2hpbGRGaWx0ZXIuYWNjZXB0KGNoaWxkKQotCQkJCQkmJiBuYW1lLmVxdWFsc0lnbm9yZUNhc2UoY2hpbGQuZ2V0TmFtZSgpKSkgewotCQkJCS8vCQlyZXR1cm4gSTE4blV0aWwuZm9ybWF0U3RyaW5nKFJFU09VUkNFX0JVTkRMRSwga2V5LCBkYXRhKTsKLQkJCQlyZXR1cm4gTkxTLmJpbmQoTGlicmFyeUVkaXRSZXNvdXJjZXMuZHVwbGljYXRlRWxlbWVudE5hbWVFcnJvcl9tc2csIG5hbWUpOyAKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDaGVja3MgaWYgdGhlIGdpdmVuIG5hbWUgY2FuIGJlIHVzZWQgZm9yIHRoZSBnaXZlbiBlbGVtZW50LiBUaGUgbWV0aG9kCi0JICogYXNzdW1lIHRoYXQgdGhlIGdpdmVuIGVsZW1lbnQgd2lsbCBiZSBzYXZlZCB1bmRlciB0aGUgZ2l2ZW4gZGlyZWN0b3J5Ci0JICogdXNpbmcgdGhlIGdpdmVuIG5hbWUuCi0JICogCi0JICogQHBhcmFtIGRpcgotCSAqICAgICAgICAgICAgRGlyZWN0b3J5IHdoZXJlIHRoZSBnaXZlbiBlbGVtZW50IHdpbGwgYmUgc2F2ZWQgaW4gYSBmaWxlIG9yIGEKLQkgKiAgICAgICAgICAgIGRpcmVjdG9yeSBkZXBlbmRpbmcgb24gdGhlIHZhbHVlIG9mIGlzRGlyCi0JICogQHBhcmFtIHNpYmxpbmdzCi0JICogICAgICAgICAgICBleGlzaXRpbmcgc2libGluZ3Mgb2YgdGhlIGdpdmVuIGVsZW1lbnQgPGNvZGU+ZTwvY29kZT4KLQkgKiBAcGFyYW0gZQotCSAqICAgICAgICAgICAgdGhlIGVsZW1lbnQgaXRzIG5hbWUgdG8gYmUgY2hlY2tlZC4KLQkgKiBAcGFyYW0gbmFtZQotCSAqICAgICAgICAgICAgdGhlIHN1Z2dlc3RlZCBuZXcgbmFtZSBmb3IgdGhlIGdpdmVuIGVsZW1lbnQgPGNvZGU+ZTwvY29kZT4KLQkgKiBAcGFyYW0gdHlwZUxhYmVsCi0JICogICAgICAgICAgICB0aGUgZWxlbWVudCB0eXBlIGxhYmVsLgotCSAqIEBwYXJhbSBpc0RpcgotCSAqICAgICAgICAgICAgZmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIGdpdmVuIGVsZW1lbnQgd2lsbCBiZSBzYXZlZCBhCi0JICogICAgICAgICAgICBkaXJlY3RvcnkKLQkgKiBAcmV0dXJuIG51bGwgaWYgdGhlIGdpdmVuIG5hbWUgY2FuIGJlIHVzZWQsIGFuIGVycm9yIG1lc3NhZ2UgaWYgdGhlIG5hbWUKLQkgKiAgICAgICAgIGlzIGFscmVhZHkgdGFrZW4uCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2hlY2tOYW1lKEZpbGUgZGlyLCBDb2xsZWN0aW9uIHNpYmxpbmdzLAotCQkJTmFtZWRFbGVtZW50IGUsIFN0cmluZyBuYW1lLCBTdHJpbmcgZWxlbWVudFR5cGVUZXh0LCBib29sZWFuIGlzRGlyKSB7Ci0JCVN0cmluZyBtc2cgPSBjaGVja0VsZW1lbnROYW1lKG5hbWUsIGVsZW1lbnRUeXBlVGV4dCk7Ci0JCWlmIChtc2cgIT0gbnVsbCkKLQkJCXJldHVybiBtc2c7Ci0JCVN0cmluZyBmaWxlTmFtZSA9IG5hbWU7Ci0JCWlmICghaXNEaXIpIHsKLQkJCWZpbGVOYW1lID0gZmlsZU5hbWUgKyAoKElGaWxlQmFzZWRMaWJyYXJ5UGVyc2lzdGVyKVNlcnZpY2VzLmdldERlZmF1bHRMaWJyYXJ5UGVyc2lzdGVyKCkpLmdldEZpbGVFeHRlbnNpb24oZSk7Ci0JCX0KLQkJRmlsZSBmaWxlID0gbmV3IEZpbGUoZGlyLCBmaWxlTmFtZSk7Ci0JCUZpbGUgY3VycmVudEZpbGUgPSBudWxsOwotCQlpZiAoZSAhPSBudWxsICYmIGUuZVJlc291cmNlKCkgIT0gbnVsbCkgewotCQkJY3VycmVudEZpbGUgPSBuZXcgRmlsZShlLmVSZXNvdXJjZSgpLmdldFVSSSgpLnRvRmlsZVN0cmluZygpKTsKLQkJCWlmIChpc0RpcikgewotCQkJCWN1cnJlbnRGaWxlID0gY3VycmVudEZpbGUuZ2V0UGFyZW50RmlsZSgpOwotCQkJfQotCQl9Ci0JCWJvb2xlYW4gYiA9IGZpbGUuZXhpc3RzKCk7Ci0JCWlmIChiICYmICFmaWxlLmVxdWFscyhjdXJyZW50RmlsZSkpIHsKLQkJCW1zZyA9IE5MUy5iaW5kKExpYnJhcnlFZGl0UmVzb3VyY2VzLmR1cGxpY2F0ZUVsZW1lbnROYW1lRXJyb3JfbXNnLCBuYW1lKTsKLQkJCS8qIFRPRE86IGlzIHRoaXMgbmVlZGVkPyBBZnRlciBjYWxsaW5nIE5MUy5iaW5kLCB0aGVyZSB3aWxsCW5vdCBiZSBhbnkgcGxhY2Vob2xkZXJzIGxlZnQgZm9yIHBhcmFtcy4KLQkJCU9iamVjdFtdIHBhcmFtcyA9IG5ldyBPYmplY3RbMl07Ci0JCQlpZiAoZmlsZS5pc0ZpbGUoKSkgewotCQkJCXBhcmFtc1swXSA9IExpYnJhcnlFZGl0UmVzb3VyY2VzLmZpbGVfdGV4dDsgCi0JCQl9IGVsc2UgewotCQkJCXBhcmFtc1swXSA9IExpYnJhcnlFZGl0UmVzb3VyY2VzLmRpcmVjdG9yeV90ZXh0OyAKLQkJCX0KLQkJCXBhcmFtc1sxXSA9IGZpbGU7Ci0JCQlyZXR1cm4gTWVzc2FnZUZvcm1hdC5mb3JtYXQobXNnLCBwYXJhbXMpLnRvU3RyaW5nKCk7Ci0JCQkqLwotCQkJcmV0dXJuIG1zZzsKLQkJfQotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBzaWJsaW5ncy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU5hbWVkRWxlbWVudCBjaGlsZCA9IChOYW1lZEVsZW1lbnQpIGl0ZXIubmV4dCgpOwotCQkJaWYgKGNoaWxkICE9IGUgJiYgbmFtZS5lcXVhbHNJZ25vcmVDYXNlKGNoaWxkLmdldE5hbWUoKSkpIHsKLQkJCQkvLwkJcmV0dXJuIEkxOG5VdGlsLmZvcm1hdFN0cmluZyhSRVNPVVJDRV9CVU5ETEUsIGtleSwgZGF0YSk7Ci0JCQkJcmV0dXJuIE5MUy5iaW5kKExpYnJhcnlFZGl0UmVzb3VyY2VzLmR1cGxpY2F0ZUVsZW1lbnROYW1lRXJyb3JfbXNnLCBuYW1lKTsgCi0JCQl9Ci0JCX0KLQkJLy8gCi0JCXJldHVybiBudWxsOwotCi0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2hlY2tFbGVtZW50TmFtZShTdHJpbmcgbmFtZSwgU3RyaW5nIGVsZW1lbnRUeXBlVGV4dCkgewotCQlpZiAobmFtZSA9PSBudWxsIHx8IG5hbWUudHJpbSgpLmxlbmd0aCgpID09IDApCi0JCQkvLwkJcmV0dXJuIEkxOG5VdGlsLmZvcm1hdFN0cmluZyhSRVNPVVJDRV9CVU5ETEUsIGtleSwgZGF0YSk7Ci0JCQlyZXR1cm4gTkxTLmJpbmQoTGlicmFyeUVkaXRSZXNvdXJjZXMuZW1wdHlFbGVtZW50TmFtZUVycm9yX21zZywgU3RyVXRpbC50b0xvd2VyKGVsZW1lbnRUeXBlVGV4dCkpOyAKLQkJaWYgKG5hbWUuc3RhcnRzV2l0aCgiICIpKSAvLyROT04tTkxTLTEkCi0JCQkvLwkJcmV0dXJuIEkxOG5VdGlsLmZvcm1hdFN0cmluZyhSRVNPVVJDRV9CVU5ETEUsIGtleSwgZGF0YSk7Ci0JCQlyZXR1cm4gTkxTLmJpbmQoTGlicmFyeUVkaXRSZXNvdXJjZXMuaW52YWxpZEVsZW1lbnROYW1lRXJyb3IxX21zZywgbmFtZSk7IAotCQlpZiAobmFtZS5lbmRzV2l0aCgiLiIpKSAvLyROT04tTkxTLTEkCi0JCQkvLwkJcmV0dXJuIEkxOG5VdGlsLmZvcm1hdFN0cmluZyhSRVNPVVJDRV9CVU5ETEUsIGtleSwgZGF0YSk7Ci0JCQlyZXR1cm4gTkxTLmJpbmQoTGlicmFyeUVkaXRSZXNvdXJjZXMuaW52YWxpZEVsZW1lbnROYW1lRXJyb3IyX21zZywgbmFtZSk7IAkJCi0JCWlmICghaXNWYWxpZEZpbGVOYW1lKG5hbWUpKQotCQkJLy8JCXJldHVybiBJMThuVXRpbC5mb3JtYXRTdHJpbmcoUkVTT1VSQ0VfQlVORExFLCBrZXksIGRhdGEpOwotCQkJcmV0dXJuIE5MUy5iaW5kKExpYnJhcnlFZGl0UmVzb3VyY2VzLmludmFsaWRFbGVtZW50TmFtZUVycm9yM19tc2csIG5hbWUpOyAKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2hlY2tQbHVnaW5OYW1lKFN0cmluZyBuYW1lKSB7Ci0JCi0JCVN0cmluZyBlcnJvciA9IGNoZWNrRWxlbWVudE5hbWUobmFtZSwgVG5nVXRpbC5nZXRUeXBlVGV4dCgiTWV0aG9kUGx1Z2luIikgKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAoIGVycm9yICE9IG51bGwgKSB7Ci0JCQlyZXR1cm4gZXJyb3I7Ci0JCX0KLQkJCi0JCS8vIDE1Njk0NiAtIHBsdWdpbiBuYW1lIHNob3VsZCBub3QgYWxsb3cgJSwgIywgYW5kICcKLQkJaWYgKCFpc1ZhbGlkUGx1Z2luTmFtZShuYW1lKSApIHsKLQkJCS8vCQlyZXR1cm4gSTE4blV0aWwuZm9ybWF0U3RyaW5nKFJFU09VUkNFX0JVTkRMRSwga2V5LCBkYXRhKTsKLQkJCXJldHVybiBOTFMuYmluZChMaWJyYXJ5RWRpdFJlc291cmNlcy5pbnZhbGlkUGx1Z2luTmFtZUVycm9yX21zZywgbmFtZSk7IAotCQl9IGVsc2UgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJCi0JfQotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNoZWNrQWN0aXZpdHlOYW1lKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LAotCQkJT2JqZWN0IG9iamVjdCwgU3RyaW5nIG5hbWUsIFN1cHByZXNzaW9uIHN1cHByZXNzaW9uKSB7Ci0JCWlmICghKG9iamVjdCBpbnN0YW5jZW9mIEFjdGl2aXR5KSkKLQkJCXJldHVybiBudWxsOwotCQkvLyBpZighaXNWYWxpZEZpbGVOYW1lKG5hbWUpKSByZXR1cm4gIkludmFsaWQgbmFtZTogJyIgKyBuYW1lICsgIicuIFRoZQotCQkvLyBuYW1lIGNhbm5vdCBjb250YWluIGZvbGxvd2luZyBjaGFyYWN0ZXJzOiBcXCAvIDogKiA/IFwiIDwgPiB8IjsKLQkJcmV0dXJuIE5hbWVDaGVja2VyLmNoZWNrTmFtZShhZGFwdGVyRmFjdG9yeSwgKEJyZWFrZG93bkVsZW1lbnQpIG9iamVjdCwgQWN0aXZpdHkuY2xhc3MsCi0JCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TmFtZWRFbGVtZW50X05hbWUoKSwgbmFtZSwgc3VwcHJlc3Npb24pOwotCX0KLQotLy8JcHVibGljIHN0YXRpYyBTdHJpbmcgY2hlY2tXQlNBY3Rpdml0eU5hbWUoT2JqZWN0IGFjdCwgU3RyaW5nIG5hbWUpIHsKLS8vCQlyZXR1cm4gY2hlY2tBY3Rpdml0eU5hbWUoVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLS8vCQkJCS5nZXRXQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpLCBhY3QsIG5hbWUpOwotLy8JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2hlY2tXQlNBY3Rpdml0eVByZXNlbnRhdGlvbk5hbWUoT2JqZWN0IGFjdCwKLQkJCVN0cmluZyBuYW1lLCBTdXBwcmVzc2lvbiBzdXBwcmVzc2lvbikgewotCQlpZiAoIShhY3QgaW5zdGFuY2VvZiBBY3Rpdml0eSkpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIE5hbWVDaGVja2VyLmNoZWNrTmFtZShUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCS5nZXRXQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpLCAoQnJlYWtkb3duRWxlbWVudCkgYWN0LCBBY3Rpdml0eS5jbGFzcywKLQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRNZXRob2RFbGVtZW50X1ByZXNlbnRhdGlvbk5hbWUoKSwKLQkJCQluYW1lLCBzdXBwcmVzc2lvbik7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2hlY2tXb3JrQnJlYWtkb3duRWxlbWVudFByZXNlbnRhdGlvbk5hbWUoT2JqZWN0IGUsCi0JCQlTdHJpbmcgbmFtZSwgU3VwcHJlc3Npb24gc3VwcHJlc3Npb24pIHsKLQkJaWYgKCEoZSBpbnN0YW5jZW9mIFdvcmtCcmVha2Rvd25FbGVtZW50KSkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gTmFtZUNoZWNrZXIuY2hlY2tOYW1lKFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJLmdldFdCU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCksIChCcmVha2Rvd25FbGVtZW50KSBlLAotCQkJCVdvcmtCcmVha2Rvd25FbGVtZW50LmNsYXNzLCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJLmdldE1ldGhvZEVsZW1lbnRfUHJlc2VudGF0aW9uTmFtZSgpLCBuYW1lLCBzdXBwcmVzc2lvbik7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2hlY2tXb3JrUHJvZHVjdERlc2NyaXB0b3JQcmVzZW50YXRpb25OYW1lKE9iamVjdCBlLAotCQkJU3RyaW5nIG5hbWUsIFN1cHByZXNzaW9uIHN1cHByZXNzaW9uKSB7Ci0JCWlmICghKGUgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3IpKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiBOYW1lQ2hlY2tlci5jaGVja05hbWUoVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkuZ2V0UEJTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSwgKEJyZWFrZG93bkVsZW1lbnQpIGUsCi0JCQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yLmNsYXNzLCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJLmdldE1ldGhvZEVsZW1lbnRfUHJlc2VudGF0aW9uTmFtZSgpLCBuYW1lLCBzdXBwcmVzc2lvbik7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2hlY2tSb2xlRGVzY3JpcHRvclByZXNlbnRhdGlvbk5hbWUoT2JqZWN0IGUsCi0JCQlTdHJpbmcgbmFtZSwgU3VwcHJlc3Npb24gc3VwcHJlc3Npb24pIHsKLQkJaWYgKCEoZSBpbnN0YW5jZW9mIFJvbGVEZXNjcmlwdG9yKSkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gTmFtZUNoZWNrZXIuY2hlY2tOYW1lKFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJLmdldE9CU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCksIChCcmVha2Rvd25FbGVtZW50KSBlLCBSb2xlRGVzY3JpcHRvci5jbGFzcywKLQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRNZXRob2RFbGVtZW50X1ByZXNlbnRhdGlvbk5hbWUoKSwKLQkJCQluYW1lLCBzdXBwcmVzc2lvbik7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzRUNsYXNzSW5zdGFuY2VPZihDb2xsZWN0aW9uIGVDbGFzc2VzLCBPYmplY3Qgb2JqKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGVDbGFzc2VzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJRUNsYXNzIGVDbGFzcyA9IChFQ2xhc3MpIGl0ZXIubmV4dCgpOwotCQkJaWYgKGVDbGFzcy5pc0luc3RhbmNlKG9iaikpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0luc3RhbmNlT2YoQ29sbGVjdGlvbiBjbGFzc2VzLCBPYmplY3Qgb2JqKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGNsYXNzZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlDbGFzcyBjbGF6eiA9IChDbGFzcykgaXRlci5uZXh0KCk7Ci0JCQlpZiAoY2xhenouaXNJbnN0YW5jZShvYmopKQotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIEFkYXB0ZXJGYWN0b3J5IGdldEJlc3RBZGFwdGVyRmFjdG9yeSgKLQkJCUFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCWlmIChhZGFwdGVyRmFjdG9yeSBpbnN0YW5jZW9mIENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIHsKLQkJCXJldHVybiAoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCk7Ci0JCX0KLQkJcmV0dXJuIGFkYXB0ZXJGYWN0b3J5OwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBvYmplY3QKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRMYWJlbChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBnZXRMYWJlbChvYmplY3QsICIiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldExhYmVsKE9iamVjdCBvYmplY3QsIFN0cmluZyBhbHRlcm5hdGl2ZUxhYmVsKSB7Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBDb250ZW50RGVzY3JpcHRpb24pIHsKLQkJCXJldHVybiBnZXRMYWJlbCgoKENvbnRlbnREZXNjcmlwdGlvbikgb2JqZWN0KS5lQ29udGFpbmVyKCksIGFsdGVybmF0aXZlTGFiZWwpOwotCQl9Ci0JCQotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgRU9iamVjdCkgewotCQkJRU9iamVjdCBlT2JqID0gKEVPYmplY3QpIG9iamVjdDsKLQkJCWlmIChlT2JqLmVJc1Byb3h5KCkpIHsKLQkJCQlTdHJpbmcgcGF0aCA9IG51bGw7Ci0JCQkJdHJ5IHsKLQkJCQkJb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSSB1cmkgPSBlT2JqLmVSZXNvdXJjZSgpLmdldFJlc291cmNlU2V0KCkuZ2V0VVJJQ29udmVydGVyKCkKLQkJCQkJCQkubm9ybWFsaXplKCgoSW50ZXJuYWxFT2JqZWN0KSBlT2JqKS5lUHJveHlVUkkoKSk7Ci0JCQkJCXBhdGggPSB1cmkuaXNGaWxlKCkgPyB1cmkudG9GaWxlU3RyaW5nKCkgOiB1cmkudG9TdHJpbmcoKTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkvLwotCQkJCX0KLQkJCQlpZiAocGF0aCAhPSBudWxsKSB7Ci0JCQkJCXBhdGggPSBNZXNzYWdlRm9ybWF0LmZvcm1hdCgKLQkJCQkJCQkiICcnezB9JyciLCBuZXcgT2JqZWN0W10geyBwYXRoIH0pOyAvLyROT04tTkxTLTEkCi0JCQkJfSBlbHNlIHsKLQkJCQkJcGF0aCA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJCS8vCQlyZXR1cm4gSTE4blV0aWwuZm9ybWF0U3RyaW5nKFJFU09VUkNFX0JVTkRMRSwga2V5LCBkYXRhKTsKLQkJCQlyZXR1cm4gTkxTLmJpbmQoTGlicmFyeUVkaXRSZXNvdXJjZXMudW5yZXNvbHZlZF90ZXh0LCBwYXRoKTsgCi0JCQl9Ci0JCX0KLQkJU3RyaW5nIGxhYmVsID0gbnVsbDsKLQkJYm9vbGVhbiBzaG93UHJlc2VudGF0aW9uTmFtZXMgPSBQcmVzZW50YXRpb25Db250ZXh0LklOU1RBTkNFLmlzU2hvd1ByZXNlbnRhdGlvbk5hbWVzKCk7Ci0JCWlmIChzaG93UHJlc2VudGF0aW9uTmFtZXMgJiYgb2JqZWN0IGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkKLQkJCWxhYmVsID0gKChQcm9jZXNzQ29tcG9uZW50KSBvYmplY3QpLmdldFByb2Nlc3MoKQotCQkJCQkuZ2V0UHJlc2VudGF0aW9uTmFtZSgpOwotCQllbHNlIGlmIChzaG93UHJlc2VudGF0aW9uTmFtZXMgJiYgb2JqZWN0IGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkKLQkJCWxhYmVsID0gKChNZXRob2RFbGVtZW50KSBvYmplY3QpLmdldFByZXNlbnRhdGlvbk5hbWUoKTsKLQkJaWYgKGxhYmVsID09IG51bGwgfHwgbGFiZWwudHJpbSgpLmxlbmd0aCgpID09IDApCi0JCQlsYWJlbCA9ICgoTmFtZWRFbGVtZW50KSBvYmplY3QpLmdldE5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwudHJpbSgpLmxlbmd0aCgpID09IDAgPyBhbHRlcm5hdGl2ZUxhYmVsIDogbGFiZWw7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TGFiZWwoVmFyaWFiaWxpdHlFbGVtZW50IG9iamVjdCwKLQkJCVN0cmluZyBhbHRlcm5hdGl2ZUxhYmVsLCBib29sZWFuIHByZWZlckJhc2UpIHsKLQkJU3RyaW5nIGxhYmVsID0gVG5nVXRpbC5nZXRMYWJlbChvYmplY3QsIGFsdGVybmF0aXZlTGFiZWwpOwotCQlpZiAocHJlZmVyQmFzZSAmJiBvYmplY3QuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpICE9IG51bGwpIHsKLQkJCVZhcmlhYmlsaXR5VHlwZSB0eXBlID0gb2JqZWN0LmdldFZhcmlhYmlsaXR5VHlwZSgpOwotCQkJU3RyaW5nIHZhcmlhYmlsaXR5VHh0ID0gbnVsbDsKLQkJCWlmICh0eXBlID09IFZhcmlhYmlsaXR5VHlwZS5DT05UUklCVVRFUykgewotCQkJCXZhcmlhYmlsaXR5VHh0ID0gTGlicmFyeUVkaXRSZXNvdXJjZXMuY29udHJpYnV0ZXNUb190ZXh0OyAKLQkJCX0gZWxzZSBpZiAodHlwZSA9PSBWYXJpYWJpbGl0eVR5cGUuTE9DQUxfQ09OVFJJQlVUSU9OKSB7Ci0JCQkJCXZhcmlhYmlsaXR5VHh0ID0gTGlicmFyeUVkaXRSZXNvdXJjZXMubG9jYWxDb250cmlidXRlc1RvX3RleHQ7IAotCQkJfSBlbHNlIGlmICh0eXBlID09IFZhcmlhYmlsaXR5VHlwZS5FWFRFTkRTKSB7Ci0JCQkJdmFyaWFiaWxpdHlUeHQgPSBMaWJyYXJ5RWRpdFJlc291cmNlcy5leHRlbmRzX3RleHQ7IAotCQkJfSBlbHNlIGlmICh0eXBlID09IFZhcmlhYmlsaXR5VHlwZS5SRVBMQUNFUykgewotCQkJCXZhcmlhYmlsaXR5VHh0ID0gTGlicmFyeUVkaXRSZXNvdXJjZXMucmVwbGFjZXNfdGV4dDsgCi0JCQl9IGVsc2UgaWYgKHR5cGUgPT0gVmFyaWFiaWxpdHlUeXBlLkxPQ0FMX1JFUExBQ0VNRU5UKSB7Ci0JCQkJdmFyaWFiaWxpdHlUeHQgPSBMaWJyYXJ5RWRpdFJlc291cmNlcy5sb2NhbFJlcGxhY2VzX3RleHQ7IAotCQkJfSBlbHNlIGlmICh0eXBlID09IFZhcmlhYmlsaXR5VHlwZS5FWFRFTkRTX1JFUExBQ0VTKXsKLQkJCQl2YXJpYWJpbGl0eVR4dCA9IExpYnJhcnlFZGl0UmVzb3VyY2VzLmV4dGVuZHNfcmVwbGFjZXNfdGV4dDsKLQkJCX0KLQkJCWlmICh2YXJpYWJpbGl0eVR4dCAhPSBudWxsKSB7Ci0JCQkJTWV0aG9kUGx1Z2luIGJhc2VQbHVnaW4gPSBVbWFVdGlsLmdldE1ldGhvZFBsdWdpbihvYmplY3QKLQkJCQkJCS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkpOwotCQkJCWlmIChiYXNlUGx1Z2luICE9IG51bGwpIHsKLQkJCQkJbGFiZWwgPSBOTFMuYmluZChMaWJyYXJ5RWRpdFJlc291cmNlcy5VdGlsX2xhYmVscGF0aF92YXJpYWJpbGl0eXdpdGhwbHVnaW5faW5mbywgKG5ldyBTdHJpbmdbXSB7Ci0JCQkJCWxhYmVsLAotCQkJCQl2YXJpYWJpbGl0eVR4dCwKLQkJCQkJVG5nVXRpbAotCQkJCQkJCS5nZXRMYWJlbCgKLQkJCQkJCQkJCW9iamVjdAotCQkJCQkJCQkJCQkuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpLAotCQkJCQkJCQkJYWx0ZXJuYXRpdmVMYWJlbCksCi0JCQkJCWJhc2VQbHVnaW4uZ2V0TmFtZSgpIH0pKTsKLQkJCQl9IGVsc2UgewotCQkJCQlsYWJlbCA9IE5MUy5iaW5kKExpYnJhcnlFZGl0UmVzb3VyY2VzLlV0aWxfbGFiZWxwYXRoX3ZhcmlhYmlsaXR5X2luZm8sIChuZXcgU3RyaW5nW10gewotCQkJCQlsYWJlbCwKLQkJCQkJdmFyaWFiaWxpdHlUeHQsCi0JCQkJCVRuZ1V0aWwuZ2V0TGFiZWwob2JqZWN0Ci0JCQkJCQkJLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSwKLQkJCQkJCQlhbHRlcm5hdGl2ZUxhYmVsKSB9KSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGxhYmVsOwotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemVzIGEgbmV3bHkgY3JlYXRlZCBQcm9jZXNzQ29tcG9uZW50Ci0JICogCi0JICogQHBhcmFtIGNvbXBvbmVudAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBpbml0aWFsaXplUHJvY2Vzc0NvbXBvbmVudChQcm9jZXNzQ29tcG9uZW50IGNvbXBvbmVudCwKLQkJCUVDbGFzcyB0eXBlKSB7Ci0JCS8vIGNyZWF0ZSBuZXcgcHJvY2VzcyBmb3IgdGhlIHByb2Nlc3MgY29tcG9uZW50Ci0JCS8vCi0JCVByb2Nlc3MgcHJvYyA9IGNvbXBvbmVudC5nZXRQcm9jZXNzKCk7Ci0JCWlmIChwcm9jID09IG51bGwpIHsKLQkJCXByb2MgPSAoUHJvY2VzcykgVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlKHR5cGUpOwotCQkJY29tcG9uZW50LnNldFByb2Nlc3MocHJvYyk7Ci0JCX0KLQotCQkvLyBjcmVhdGUgdG9wIGFjdGl2aXR5Ci0JCS8vCi0JCS8vIGlmKHByb2MuZ2V0VG9wTGV2ZWxCcmVha2Rvd25FbGVtZW50KCkgPT0gbnVsbCkgewotCQkvLyBBY3Rpdml0eSBhY3QgPSBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVBY3Rpdml0eSgpOwotCQkvLyBwcm9jLnNldFRvcExldmVsQnJlYWtkb3duRWxlbWVudChhY3QpOwotCQkvLyBjb21wb25lbnQuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5hZGQoYWN0KTsKLQkJLy8gfQotCi0JCS8vIGNyZWF0ZSBXQlMsIE9CUywgYW5kIFBCUwotCQkvLwotCQkvLyBpZihjb21wb25lbnQuZ2V0V0JTKCkgPT0gbnVsbCkKLQkJLy8gY29tcG9uZW50LnNldFdCUyhVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVXQlMoKSk7Ci0JCS8vIGlmKGNvbXBvbmVudC5nZXRUQlMoKSA9PSBudWxsKQotCQkvLyBjb21wb25lbnQuc2V0VEJTKFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVRCUygpKTsKLQkJLy8gaWYoY29tcG9uZW50LmdldFdQQlMoKSA9PSBudWxsKQotCQkvLyBjb21wb25lbnQuc2V0V1BCUyhVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVXUEJTKCkpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgQnJlYWtkb3duRWxlbWVudCBnZXRQYXJlbnQoQnJlYWtkb3duRWxlbWVudCBiZSkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjaGVja051bGwoU3RyaW5nIHN0cikgewotCQlyZXR1cm4gKHN0ciA9PSBudWxsID8gIiIgOiBzdHIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGRlc2NyaXB0b3JFeGlzdHMoUm9sZSByb2xlLCBMaXN0IHJvbGVEZXNjcmlwdG9yTGlzdCkgewotCQlmb3IgKGludCBpID0gcm9sZURlc2NyaXB0b3JMaXN0LnNpemUoKSAtIDE7IGkgPiAtMTsgaS0tKSB7Ci0JCQlSb2xlRGVzY3JpcHRvciByb2xlRGVzYyA9IChSb2xlRGVzY3JpcHRvcikgcm9sZURlc2NyaXB0b3JMaXN0Ci0JCQkJCS5nZXQoaSk7Ci0JCQlpZiAocm9sZURlc2MuZ2V0Um9sZSgpID09IHJvbGUpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgTWV0aG9kRWxlbWVudCBjb3B5KE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgewotCQlDb3BpZXIgY29waWVyID0gbmV3IENvcGllcigpIHsKLQkJCS8qKgotCQkJICogQ29tbWVudCBmb3IgPGNvZGU+c2VyaWFsVmVyc2lvblVJRDwvY29kZT4KLQkJCSAqLwotCQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMzI1Nzg0NjU3NjAzMzkwNDY5MUw7Ci0KLQkJCS8qKgotCQkJICogQ2FsbGVkIHRvIGhhbmRsZSB0aGUgY29weWluZyBvZiBhIGNyb3NzIHJlZmVyZW5jZTsgdGhpcyBhZGRzCi0JCQkgKiB2YWx1ZXMgb3Igc2V0cyBhIHNpbmdsZSB2YWx1ZSBhcyBhcHByb3ByaWF0ZSBmb3IgdGhlIG11bHRpcGxpY2l0eQotCQkJICogd2hpbGUgb21pdHRpbmcgYW55IGJpZGlyZWN0aW9uYWwgcmVmZXJlbmNlIG9yIHNpbmdsZSBvcHBvc2l0ZQotCQkJICogZmVhdHVyZSdzIHJlZmVyZW5jZSB0aGF0IGlzbid0IGluIHRoZSBjb3B5IG1hcC4KLQkJCSAqIAotCQkJICogQHBhcmFtIGVSZWZlcmVuY2UKLQkJCSAqICAgICAgICAgICAgdGhlIHJlZmVyZW5jZSB0byBjb3B5LgotCQkJICogQHBhcmFtIGVPYmplY3QKLQkJCSAqICAgICAgICAgICAgdGhlIG9iamVjdCBmcm9tIHdoaWNoIHRvIGNvcHkuCi0JCQkgKiBAcGFyYW0gY29weUVPYmplY3QKLQkJCSAqICAgICAgICAgICAgdGhlIG9iamVjdCB0byBjb3B5IHRvLgotCQkJICovCi0JCQlwcm90ZWN0ZWQgdm9pZCBjb3B5UmVmZXJlbmNlKEVSZWZlcmVuY2UgZVJlZmVyZW5jZSwKLQkJCQkJRU9iamVjdCBlT2JqZWN0LCBFT2JqZWN0IGNvcHlFT2JqZWN0KSB7Ci0JCQkJaWYgKGVPYmplY3QuZUlzU2V0KGVSZWZlcmVuY2UpKSB7Ci0JCQkJCU9wcG9zaXRlRmVhdHVyZSBvcHBvc2l0ZUZlYXR1cmUgPSBPcHBvc2l0ZUZlYXR1cmUuZ2V0T3Bwb3NpdGVGZWF0dXJlKGVSZWZlcmVuY2UpOwotCQkJCQkKLQkJCQkJLy8gIm1hbnkiIG9wcG9zaXRlIGZlYXR1cmUgZG9lcyBub3QgcmVxdWlyZSBjb3BpZWQgdGFyZ2V0LCBpdCBpcwotCQkJCQkvLyB0cmVhdGVkIGFzIGEgcmVndWxhciBub24tY29udGFpbm1lbnQgcmVmZXJlbmNlCi0JCQkJCS8vIFRPRE86IGJpZGlyZWN0aW9uYWwgcmVsYXRpb25zaGlwcyBhcmUgbm90IGF1dG9tYXRpY2FsbHkgY29waWVkIGluCi0JCQkJCS8vIEVNRiBpbXBsZW1lbnRhdGlvbgotCQkJCQkvLwotCQkJCQlib29sZWFuIGNvcGllZFRhcmdldFJlcXVpcmVkID0gZVJlZmVyZW5jZS5nZXRFT3Bwb3NpdGUoKSAhPSBudWxsCi0JCQkJCQkJfHwgKG9wcG9zaXRlRmVhdHVyZSAhPSBudWxsICYmICFvcHBvc2l0ZUZlYXR1cmUuaXNNYW55KCkpOwotCQkJCQkJCQkJCQotCQkJCQlpZiAoZVJlZmVyZW5jZS5pc01hbnkoKSkgewotCQkJCQkJTGlzdCBzb3VyY2UgPSAoTGlzdCkgZU9iamVjdC5lR2V0KGVSZWZlcmVuY2UpOwotCQkJCQkJSW50ZXJuYWxFTGlzdCB0YXJnZXQgPSAoSW50ZXJuYWxFTGlzdCkgY29weUVPYmplY3QKLQkJCQkJCQkJLmVHZXQoZ2V0VGFyZ2V0KGVSZWZlcmVuY2UpKTsKLQkJCQkJCWlmIChzb3VyY2UuaXNFbXB0eSgpKSB7Ci0JCQkJCQkJdGFyZ2V0LmNsZWFyKCk7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCWludCBpbmRleCA9IDA7Ci0JCQkJCQkJZm9yIChJdGVyYXRvciBrID0gc291cmNlLml0ZXJhdG9yKCk7IGsuaGFzTmV4dCgpOykgewotCQkJCQkJCQlPYmplY3QgcmVmZXJlbmNlZEVPYmplY3QgPSBrLm5leHQoKTsKLQkJCQkJCQkJT2JqZWN0IGNvcHlSZWZlcmVuY2VkRU9iamVjdCA9IGdldChyZWZlcmVuY2VkRU9iamVjdCk7Ci0JCQkJCQkJCWlmIChjb3B5UmVmZXJlbmNlZEVPYmplY3QgPT0gbnVsbCkgewotCQkJCQkJCQkJaWYgKCFjb3BpZWRUYXJnZXRSZXF1aXJlZCkgewotCQkJCQkJCQkJCXRhcmdldC5hZGRVbmlxdWUoaW5kZXgsCi0JCQkJCQkJCQkJCQlyZWZlcmVuY2VkRU9iamVjdCk7Ci0JCQkJCQkJCQkJKytpbmRleDsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJCWlmIChjb3BpZWRUYXJnZXRSZXF1aXJlZCkgewotCQkJCQkJCQkJCWludCBwb3NpdGlvbiA9IHRhcmdldAotCQkJCQkJCQkJCQkJLmluZGV4T2YoY29weVJlZmVyZW5jZWRFT2JqZWN0KTsKLQkJCQkJCQkJCQlpZiAocG9zaXRpb24gPT0gLTEpIHsKLQkJCQkJCQkJCQkJdGFyZ2V0LmFkZFVuaXF1ZShpbmRleCwKLQkJCQkJCQkJCQkJCQljb3B5UmVmZXJlbmNlZEVPYmplY3QpOwotCQkJCQkJCQkJCX0gZWxzZSBpZiAoaW5kZXggIT0gcG9zaXRpb24pIHsKLQkJCQkJCQkJCQkJdGFyZ2V0Lm1vdmUoaW5kZXgsCi0JCQkJCQkJCQkJCQkJY29weVJlZmVyZW5jZWRFT2JqZWN0KTsKLQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQkJCXRhcmdldC5hZGRVbmlxdWUoaW5kZXgsCi0JCQkJCQkJCQkJCQljb3B5UmVmZXJlbmNlZEVPYmplY3QpOwotCQkJCQkJCQkJfQotCQkJCQkJCQkJKytpbmRleDsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfSBlbHNlIHsKLQkJCQkJCU9iamVjdCByZWZlcmVuY2VkRU9iamVjdCA9IGVPYmplY3QuZUdldChlUmVmZXJlbmNlKTsKLQkJCQkJCWlmIChyZWZlcmVuY2VkRU9iamVjdCA9PSBudWxsKSB7Ci0JCQkJCQkJY29weUVPYmplY3QuZVNldChnZXRUYXJnZXQoZVJlZmVyZW5jZSksIG51bGwpOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlPYmplY3QgY29weVJlZmVyZW5jZWRFT2JqZWN0ID0gZ2V0KHJlZmVyZW5jZWRFT2JqZWN0KTsKLQkJCQkJCQlpZiAoY29weVJlZmVyZW5jZWRFT2JqZWN0ID09IG51bGwpIHsKLQkJCQkJCQkJaWYgKCFjb3BpZWRUYXJnZXRSZXF1aXJlZCkgewotCQkJCQkJCQkJY29weUVPYmplY3QuZVNldChnZXRUYXJnZXQoZVJlZmVyZW5jZSksCi0JCQkJCQkJCQkJCXJlZmVyZW5jZWRFT2JqZWN0KTsKLQkJCQkJCQkJfQotCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCWNvcHlFT2JqZWN0LmVTZXQoZ2V0VGFyZ2V0KGVSZWZlcmVuY2UpLAotCQkJCQkJCQkJCWNvcHlSZWZlcmVuY2VkRU9iamVjdCk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9OwotCQlNZXRob2RFbGVtZW50IGNvcHkgPSAoTWV0aG9kRWxlbWVudCkgY29waWVyLmNvcHkoZWxlbWVudCk7Ci0JCWNvcGllci5jb3B5UmVmZXJlbmNlcygpOwotCi0JCS8vIHVuc2V0IHRoZSBHVUlEIG9mIHRoZSBjb3B5IGFuZCBpdHMgb2Zmc3RyaW5nCi0JCS8vCi0JCWNvcHkuc2V0R3VpZChudWxsKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gY29weS5lQWxsQ29udGVudHMoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZSA9IGl0ZXIubmV4dCgpOwotCQkJaWYgKGUgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQkJKChNZXRob2RFbGVtZW50KSBlKS5zZXRHdWlkKG51bGwpOwotCQkJfQotCQl9Ci0JCXJldHVybiBjb3B5OwotCX0KLQotCXB1YmxpYyBzdGF0aWMgVmFyaWFiaWxpdHlFbGVtZW50IGdldEJhc2UoVmFyaWFiaWxpdHlFbGVtZW50IGMpIHsKLQkJZm9yICg7IGMuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpICE9IG51bGw7IGMgPSAoVmFyaWFiaWxpdHlFbGVtZW50KSBjCi0JCQkJLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSkKLQkJCTsKLQkJcmV0dXJuIGM7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBDb250ZW50Q2F0ZWdvcnkgZmluZEluaGVyaXRlZChDb2xsZWN0aW9uIGluaGVyaXRlZExpc3QsCi0JCQlDb250ZW50Q2F0ZWdvcnkgY2F0ZWdvcnkpIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gaW5oZXJpdGVkTGlzdC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCUNvbnRlbnRDYXRlZ29yeSBlbGVtZW50ID0gKENvbnRlbnRDYXRlZ29yeSkgaXRlci5uZXh0KCk7Ci0JCQlpZiAoZWxlbWVudC5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkgIT0gbnVsbAotCQkJCQkmJiAoZWxlbWVudC5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkgPT0gY2F0ZWdvcnkgfHwgZWxlbWVudAotCQkJCQkJCS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkgPT0gY2F0ZWdvcnkKLQkJCQkJCQkuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpKSkKLQkJCQlyZXR1cm4gZWxlbWVudDsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIENvbnRlbnRDYXRlZ29yeSByZW1vdmVJbmhlcml0ZWQoTGlzdCBpbmhlcml0ZWRMaXN0LAotCQkJQ29udGVudENhdGVnb3J5IGNhdGVnb3J5KSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGluaGVyaXRlZExpc3QuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlDb250ZW50Q2F0ZWdvcnkgZWxlbWVudCA9IChDb250ZW50Q2F0ZWdvcnkpIGl0ZXIubmV4dCgpOwotCQkJaWYgKGVsZW1lbnQuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpID09IGNhdGVnb3J5KSB7Ci0JCQkJaXRlci5yZW1vdmUoKTsKLQkJCQlyZXR1cm4gZWxlbWVudDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBDb250ZW50SXRlbVByb3ZpZGVyIGdldENvbnRlbnRJdGVtUHJvdmlkZXIoTWV0aG9kUGx1Z2luIHBsdWdpbikgewotCQlNZXRob2RQbHVnaW5JdGVtUHJvdmlkZXIgbWV0aG9kUGx1Z2luSXRlbVByb3ZpZGVyID0gKE1ldGhvZFBsdWdpbkl0ZW1Qcm92aWRlcilnZXRBZGFwdGVyKAotCQkJCXBsdWdpbiwJTWV0aG9kUGx1Z2luSXRlbVByb3ZpZGVyLmNsYXNzKTsKLQkJbWV0aG9kUGx1Z2luSXRlbVByb3ZpZGVyLmdldENoaWxkcmVuKHBsdWdpbik7Ci0JCUlHcm91cENvbnRhaW5lciBncm91cENvbnRhaW5lciA9IChJR3JvdXBDb250YWluZXIpIFRuZ1V0aWwuZ2V0QWRhcHRlcigKLQkJCQkoRU9iamVjdCkgcGx1Z2luLCBJR3JvdXBDb250YWluZXIuY2xhc3MpOwotCQlpZiAoZ3JvdXBDb250YWluZXIgIT0gbnVsbCkgewotCQkJcmV0dXJuIChDb250ZW50SXRlbVByb3ZpZGVyKSBncm91cENvbnRhaW5lcgotCQkJCQkuZ2V0R3JvdXBJdGVtUHJvdmlkZXIoTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJCQkuZ2V0U3RyaW5nKCJfVUlfQ29udGVudF9ncm91cCIpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFN0YW5kYXJkQ2F0ZWdvcmllc0l0ZW1Qcm92aWRlciBnZXRTdGFuZGFyZENhdGVnb3JpZXNJdGVtUHJvdmlkZXIoTWV0aG9kUGx1Z2luIHBsdWdpbikgewotCQlDb250ZW50SXRlbVByb3ZpZGVyIGNvbnRlbnRJdGVtUHJvdmlkZXIgPSBnZXRDb250ZW50SXRlbVByb3ZpZGVyKHBsdWdpbik7Ci0JCWNvbnRlbnRJdGVtUHJvdmlkZXIuZ2V0Q2hpbGRyZW4oY29udGVudEl0ZW1Qcm92aWRlcik7Ci0JCWlmIChjb250ZW50SXRlbVByb3ZpZGVyICE9IG51bGwpIHsKLQkJCXJldHVybiAoU3RhbmRhcmRDYXRlZ29yaWVzSXRlbVByb3ZpZGVyKWNvbnRlbnRJdGVtUHJvdmlkZXIuZ2V0R3JvdXBJdGVtUHJvdmlkZXIoTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJLmdldFN0cmluZygiX1VJX1N0YW5kYXJkX0NhdGVnb3JpZXNfZ3JvdXAiKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IGdldERpc2NpcGxpbmVDYXRlZ29yaWVzSXRlbVByb3ZpZGVyKE1ldGhvZFBsdWdpbiBtb2RlbCkgewotCQlTdGFuZGFyZENhdGVnb3JpZXNJdGVtUHJvdmlkZXIgc3RhbmRhcmRDYXRlZ29yaWVzSXRlbVByb3ZpZGVyID0gZ2V0U3RhbmRhcmRDYXRlZ29yaWVzSXRlbVByb3ZpZGVyKG1vZGVsKTsKLQkJc3RhbmRhcmRDYXRlZ29yaWVzSXRlbVByb3ZpZGVyLmdldENoaWxkcmVuKHN0YW5kYXJkQ2F0ZWdvcmllc0l0ZW1Qcm92aWRlcik7Ci0JCWlmIChzdGFuZGFyZENhdGVnb3JpZXNJdGVtUHJvdmlkZXIgIT0gbnVsbCkgewotCQkJcmV0dXJuIHN0YW5kYXJkQ2F0ZWdvcmllc0l0ZW1Qcm92aWRlcgotCQkJLmdldEdyb3VwSXRlbVByb3ZpZGVyKExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCS5nZXRTdHJpbmcoIl9VSV9EaXNjaXBsaW5lc19ncm91cCIpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IGdldERvbWFpbnNJdGVtUHJvdmlkZXIoTWV0aG9kUGx1Z2luIG1vZGVsKSB7Ci0JCVN0YW5kYXJkQ2F0ZWdvcmllc0l0ZW1Qcm92aWRlciBzdGFuZGFyZENhdGVnb3JpZXNJdGVtUHJvdmlkZXIgPSBnZXRTdGFuZGFyZENhdGVnb3JpZXNJdGVtUHJvdmlkZXIobW9kZWwpOwotCQlzdGFuZGFyZENhdGVnb3JpZXNJdGVtUHJvdmlkZXIuZ2V0Q2hpbGRyZW4oc3RhbmRhcmRDYXRlZ29yaWVzSXRlbVByb3ZpZGVyKTsKLQkJaWYgKHN0YW5kYXJkQ2F0ZWdvcmllc0l0ZW1Qcm92aWRlciAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gc3RhbmRhcmRDYXRlZ29yaWVzSXRlbVByb3ZpZGVyCi0JCQkuZ2V0R3JvdXBJdGVtUHJvdmlkZXIoTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJLmdldFN0cmluZygiX1VJX0RvbWFpbnNfZ3JvdXAiKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIE9iamVjdCBnZXRXb3JrUHJvZHVjdFR5cGVzSXRlbVByb3ZpZGVyKE1ldGhvZFBsdWdpbiBtb2RlbCkgewotCQlTdGFuZGFyZENhdGVnb3JpZXNJdGVtUHJvdmlkZXIgc3RhbmRhcmRDYXRlZ29yaWVzSXRlbVByb3ZpZGVyID0gZ2V0U3RhbmRhcmRDYXRlZ29yaWVzSXRlbVByb3ZpZGVyKG1vZGVsKTsKLQkJc3RhbmRhcmRDYXRlZ29yaWVzSXRlbVByb3ZpZGVyLmdldENoaWxkcmVuKHN0YW5kYXJkQ2F0ZWdvcmllc0l0ZW1Qcm92aWRlcik7Ci0JCWlmIChzdGFuZGFyZENhdGVnb3JpZXNJdGVtUHJvdmlkZXIgIT0gbnVsbCkgewotCQkJcmV0dXJuIHN0YW5kYXJkQ2F0ZWdvcmllc0l0ZW1Qcm92aWRlcgotCQkJLmdldEdyb3VwSXRlbVByb3ZpZGVyKExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCS5nZXRTdHJpbmcoIl9VSV9Xb3JrUHJvZHVjdFR5cGVzX2dyb3VwIikpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBPYmplY3QgZ2V0Um9sZVNldHNJdGVtUHJvdmlkZXIoTWV0aG9kUGx1Z2luIG1vZGVsKSB7Ci0JCVN0YW5kYXJkQ2F0ZWdvcmllc0l0ZW1Qcm92aWRlciBzdGFuZGFyZENhdGVnb3JpZXNJdGVtUHJvdmlkZXIgPSBnZXRTdGFuZGFyZENhdGVnb3JpZXNJdGVtUHJvdmlkZXIobW9kZWwpOwotCQlzdGFuZGFyZENhdGVnb3JpZXNJdGVtUHJvdmlkZXIuZ2V0Q2hpbGRyZW4oc3RhbmRhcmRDYXRlZ29yaWVzSXRlbVByb3ZpZGVyKTsKLQkJaWYgKHN0YW5kYXJkQ2F0ZWdvcmllc0l0ZW1Qcm92aWRlciAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gc3RhbmRhcmRDYXRlZ29yaWVzSXRlbVByb3ZpZGVyCi0JCQkuZ2V0R3JvdXBJdGVtUHJvdmlkZXIoTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJLmdldFN0cmluZygiX1VJX1JvbGVfU2V0c19ncm91cCIpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IGdldFRvb2xzSXRlbVByb3ZpZGVyKE1ldGhvZFBsdWdpbiBtb2RlbCkgewotCQlTdGFuZGFyZENhdGVnb3JpZXNJdGVtUHJvdmlkZXIgc3RhbmRhcmRDYXRlZ29yaWVzSXRlbVByb3ZpZGVyID0gZ2V0U3RhbmRhcmRDYXRlZ29yaWVzSXRlbVByb3ZpZGVyKG1vZGVsKTsKLQkJc3RhbmRhcmRDYXRlZ29yaWVzSXRlbVByb3ZpZGVyLmdldENoaWxkcmVuKHN0YW5kYXJkQ2F0ZWdvcmllc0l0ZW1Qcm92aWRlcik7Ci0JCWlmIChzdGFuZGFyZENhdGVnb3JpZXNJdGVtUHJvdmlkZXIgIT0gbnVsbCkgewotCQkJcmV0dXJuIHN0YW5kYXJkQ2F0ZWdvcmllc0l0ZW1Qcm92aWRlcgotCQkJLmdldEdyb3VwSXRlbVByb3ZpZGVyKExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCS5nZXRTdHJpbmcoIl9VSV9Ub29sc19ncm91cCIpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKioKLQkgKiBHZXRzIHRoZSBuZXh0IGF2YWlsYWJsZSBuYW1lIHRoYXQgaXMgbm90IGFscmVhZHkgdGFrZW4gYnkgYW55IG9mIHRoZSBzcGVjaWZpZWQgZWxlbWVudHMuCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnRzCi0JICogQHBhcmFtIGUKLQkgKiBAcGFyYW0gYmFzZU5hbWUKLQkgKiBAcmV0dXJuIGJhc2VOYW1lIG9mIGJhc2VOYW1lX1ggd2hlcmUgaXMgaXMgdGhlIG51bWJlciBzdGFydGluZyBmcm9tIDIKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXROZXh0QXZhaWxhYmxlTmFtZShMaXN0PD8gZXh0ZW5kcyBNZXRob2RFbGVtZW50PiBlbGVtZW50cywgU3RyaW5nIGJhc2VOYW1lKSB7Ci0JCWlmKGlzTmFtZVRha2VuKGVsZW1lbnRzLCBudWxsLCBiYXNlTmFtZSkpIHsKLQkJCWZvciAoaW50IGkgPSAyOyB0cnVlOyBpKyspIHsKLQkJCQlTdHJpbmcgbmFtZSA9IGJhc2VOYW1lICsgJ18nICsgaTsKLQkJCQlpZiAoIWlzTmFtZVRha2VuKGVsZW1lbnRzLCBudWxsLCBuYW1lKSkgewotCQkJCQlyZXR1cm4gbmFtZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGJhc2VOYW1lOwotCX0KLQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldERlZmF1bHROYW1lKExpc3Q8PyBleHRlbmRzIE1ldGhvZEVsZW1lbnQ+IHNpYmxpbmdzLCBNZXRob2RFbGVtZW50IGUsCi0JCQlTdHJpbmcgYmFzZU5hbWUpIHsKLQkJaWYgKGUuZ2V0TmFtZSgpICE9IG51bGwgJiYgZS5nZXROYW1lKCkudHJpbSgpLmxlbmd0aCgpID4gMCkKLQkJCXJldHVybjsKLQotCQlpZiAoIWlzTmFtZVRha2VuKHNpYmxpbmdzLCBlLCBiYXNlTmFtZSkpIHsKLQkJCWUuc2V0TmFtZShiYXNlTmFtZSk7Ci0JCQlzZXRQcmVzZW50YXRpb25OYW1lKGUsIGJhc2VOYW1lKTsKLQkJCXJldHVybjsKLQkJfQotCQlmb3IgKGludCBpID0gMjsgdHJ1ZTsgaSsrKSB7Ci0JCQlTdHJpbmcgbmFtZSA9IGJhc2VOYW1lICsgJ18nICsgaTsKLQkJCWlmICghaXNOYW1lVGFrZW4oc2libGluZ3MsIGUsIG5hbWUpKSB7Ci0JCQkJZS5zZXROYW1lKG5hbWUpOwotCQkJCXNldFByZXNlbnRhdGlvbk5hbWUoZSwgbmFtZSk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JfQotCQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0RGVmYXVsdE5hbWUoQ3VzdG9tQ2F0ZWdvcnkgcGFyZW50LCBDdXN0b21DYXRlZ29yeSBjYywgU3RyaW5nIGJhc2VOYW1lKSB7Ci0JCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSBVbWFVdGlsLmdldE1ldGhvZFBsdWdpbihwYXJlbnQpOwotCQlDb250ZW50UGFja2FnZSBwa2cgPSBwbHVnaW4gPT0gbnVsbCA/IG51bGwgOiBVbWFVdGlsLmZpbmRDb250ZW50UGFja2FnZShwbHVnaW4sCi0JCQkJTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC5jdXN0b21DYXRlZ29yeVBhdGgpOwotCQlpZiAocGtnID09IG51bGwpIHsKLQkJCVRuZ1V0aWwuc2V0RGVmYXVsdE5hbWUocGFyZW50LmdldENhdGVnb3JpemVkRWxlbWVudHMoKSwgY2MsIGJhc2VOYW1lKTsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJVW5pcXVlTmFtZUhhbmRsZXIgaGFuZGxlciA9IG5ldyBVbmlxdWVOYW1lSGFuZGxlcigpOwotCQloYW5kbGVyLnJlZ2lzdGVyTmFtZXMocGtnLmdldENvbnRlbnRFbGVtZW50cygpKTsKLQkJU3RyaW5nIG5hbWUgPSBoYW5kbGVyLmdldFVuaXF1ZU5hbWUoYmFzZU5hbWUpOwotCQljYy5zZXROYW1lKG5hbWUpOwotCQljYy5zZXRQcmVzZW50YXRpb25OYW1lKG5hbWUpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgc2V0UHJlc2VudGF0aW9uTmFtZShNZXRob2RFbGVtZW50IGUsIFN0cmluZyBiYXNlTmFtZSkgewotCQlpZiAoZSBpbnN0YW5jZW9mIERlc2NyaWJhYmxlRWxlbWVudCkgewotCQkJRGVzY3JpYmFibGVFbGVtZW50IGRlID0gKERlc2NyaWJhYmxlRWxlbWVudCkgZTsKLQotCQkJU3RyaW5nQnVmZmVyIHByZXNOYW1lQnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJU3RyaW5nVG9rZW5pemVyIHN0ID0gbmV3IFN0cmluZ1Rva2VuaXplcihiYXNlTmFtZSwgIl8iKTsgLy8kTk9OLU5MUy0xJAotCQkJd2hpbGUgKHN0Lmhhc01vcmVUb2tlbnMoKSkgewotCQkJCVN0cmluZyBhV29yZCA9IHN0Lm5leHRUb2tlbigpOwotCQkJCXByZXNOYW1lQnVmLmFwcGVuZChhV29yZC5zdWJzdHJpbmcoMCwgMSkudG9VcHBlckNhc2UoKQotCQkJCQkJKyBhV29yZC5zdWJzdHJpbmcoMSkgKyAiICIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0KLQkJCWRlLnNldFByZXNlbnRhdGlvbk5hbWUocHJlc05hbWVCdWYudG9TdHJpbmcoKS50cmltKCkpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc05hbWVUYWtlbihMaXN0PD8gZXh0ZW5kcyBNZXRob2RFbGVtZW50PiBzaWJsaW5ncywgTWV0aG9kRWxlbWVudCBlLAotCQkJU3RyaW5nIG5hbWUpIHsKLQkJZm9yIChpbnQgaSA9IHNpYmxpbmdzLnNpemUoKSAtIDE7IGkgPiAtMTsgaS0tKSB7Ci0JCQlNZXRob2RFbGVtZW50IHNpYmxpbmcgPSAoTWV0aG9kRWxlbWVudCkgc2libGluZ3MuZ2V0KGkpOwotCQkJaWYgKHNpYmxpbmcgIT0gZSAmJiBuYW1lLmVxdWFsc0lnbm9yZUNhc2Uoc2libGluZy5nZXROYW1lKCkpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgTGlzdCBleHRyYWN0KENvbGxlY3Rpb24gY29sbGVjdGlvbiwgQ2xhc3MgY2xzKSB7Ci0JCUFycmF5TGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjb2xsZWN0aW9uLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyLm5leHQoKTsKLQkJCWlmIChjbHMuaXNJbnN0YW5jZShlbGVtZW50KSkgewotCQkJCWxpc3QuYWRkKGVsZW1lbnQpOwotCQkJfQotCQl9Ci0JCXJldHVybiBsaXN0OwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIDxUPiBMaXN0PFQ+IGV4dHJhY3RUeXBlKENvbGxlY3Rpb248PyBleHRlbmRzIE9iamVjdD4gY29sbGVjdGlvbiwgQ2xhc3M8VD4gY2xzKSB7Ci0JCUFycmF5TGlzdDxUPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxUPigpOwotCQlmb3IgKEl0ZXJhdG9yPD8gZXh0ZW5kcyBPYmplY3Q+IGl0ZXIgPSBjb2xsZWN0aW9uLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyLm5leHQoKTsKLQkJCWlmIChjbHMuaXNJbnN0YW5jZShlbGVtZW50KSkgewotCQkJCWxpc3QuYWRkKChUKWVsZW1lbnQpOwotCQkJfQotCQl9Ci0JCXJldHVybiBsaXN0OwotCX0KLQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldERlZmF1bHROYW1lKElEZWZhdWx0TmFtZVNldHRlciBkZWZhdWx0TmFtZVNldHRlciwKLQkJCU5vdGlmaWNhdGlvbiBtc2cpIHsKLQkJaWYgKGRlZmF1bHROYW1lU2V0dGVyLmdldEludGVyZXN0ZWRGZWF0dXJlT3duZXJDbGFzcygpICE9IG51bGwpIHsKLQkJCWludCBmZWF0dXJlSWQgPSBtc2cuZ2V0RmVhdHVyZUlEKGRlZmF1bHROYW1lU2V0dGVyCi0JCQkJCS5nZXRJbnRlcmVzdGVkRmVhdHVyZU93bmVyQ2xhc3MoKSk7Ci0JCQlpZiAoZmVhdHVyZUlkID09IGRlZmF1bHROYW1lU2V0dGVyLmdldEludGVyZXN0ZWRGZWF0dXJlSUQoKSkgewotCQkJCXN3aXRjaCAobXNnLmdldEV2ZW50VHlwZSgpKSB7Ci0JCQkJY2FzZSBOb3RpZmljYXRpb24uQUREOgotCQkJCQlkZWZhdWx0TmFtZVNldHRlci5zZXREZWZhdWx0TmFtZShtc2cuZ2V0TmV3VmFsdWUoKSk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgTm90aWZpY2F0aW9uLkFERF9NQU5ZOgotCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSAoKENvbGxlY3Rpb24pIG1zZy5nZXROZXdWYWx1ZSgpKQotCQkJCQkJCS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJCWRlZmF1bHROYW1lU2V0dGVyLnNldERlZmF1bHROYW1lKGl0ZXIubmV4dCgpKTsKLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gYmFzZUNhdGVnb3J5Ci0JICogQHBhcmFtIG1ldGhvZENvbmYKLQkgKiBAcGFyYW0gY2hpbGRyZW4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgYWRkRXh0ZW5kZWRDaGlsZHJlbihDb250ZW50Q2F0ZWdvcnkgYmFzZUNhdGVnb3J5LAotCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBtZXRob2RDb25mLCBDb2xsZWN0aW9uIGNoaWxkcmVuLAotCQkJU3RyaW5nW10gY2F0ZWdvcnlQa2dQYXRoKSB7Ci0JCU1ldGhvZFBsdWdpbiBiYXNlUGx1Z2luID0gVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4oYmFzZUNhdGVnb3J5KTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gbWV0aG9kQ29uZi5nZXRNZXRob2RQbHVnaW5TZWxlY3Rpb24oKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSAoTWV0aG9kUGx1Z2luKSBpdGVyLm5leHQoKTsKLQkJCWlmIChNaXNjLmlzQmFzZU9mKGJhc2VQbHVnaW4sIHBsdWdpbikpIHsKLQkJCQlDb250ZW50UGFja2FnZSBjYXRlZ29yeVBrZyA9IFVtYVV0aWwuZmluZENvbnRlbnRQYWNrYWdlKHBsdWdpbiwKLQkJCQkJCWNhdGVnb3J5UGtnUGF0aCk7Ci0JCQkJaWYgKGNhdGVnb3J5UGtnICE9IG51bGwKLQkJCQkJCSYmIG1ldGhvZENvbmYuZ2V0TWV0aG9kUGFja2FnZVNlbGVjdGlvbigpLmNvbnRhaW5zKAotCQkJCQkJCQljYXRlZ29yeVBrZykpIHsKLQkJCQkJQ29udGVudENhdGVnb3J5IGNhdGVnb3J5ID0gZmluZEluaGVyaXRlZChjYXRlZ29yeVBrZwotCQkJCQkJCS5nZXRDb250ZW50RWxlbWVudHMoKSwgYmFzZUNhdGVnb3J5KTsKLQkJCQkJaWYgKGNhdGVnb3J5ICE9IG51bGwpIHsKLQkJCQkJCUl0ZW1Qcm92aWRlckFkYXB0ZXIgYWRhcHRlciA9IChJdGVtUHJvdmlkZXJBZGFwdGVyKSBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkJCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkKLQkJCQkJCQkJLmFkYXB0KGNhdGVnb3J5LCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkJCQkJaWYgKGFkYXB0ZXIgPT0gbnVsbCkgewotCQkJCQkJCVN5c3RlbS5lcnIKLQkJCQkJCQkJCS5wcmludGxuKCJEaXNjaXBsaW5lR3JvdXBpbmdJdGVtUHJvdmlkZXIuYWRkRXh0ZW5kZWRDaGlsZHJlbigpOiBjb3VsZCBub3QgZmluZCBhZGFwdGVyIGZvciAiICsgY2F0ZWdvcnkpOyAvLyROT04tTkxTLTEkCi0JCQkJCQl9Ci0JCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gYWRhcHRlci5nZXRDaGlsZHJlbihjYXRlZ29yeSkKLQkJCQkJCQkJLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCQkJCQlPYmplY3QgY2hpbGQgPSAoT2JqZWN0KSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCQkJQ29udGVudEVsZW1lbnQgZWxlbWVudCA9IG51bGw7Ci0JCQkJCQkJaWYgKGNoaWxkIGluc3RhbmNlb2YgQ29udGVudEVsZW1lbnQpIHsKLQkJCQkJCQkJZWxlbWVudCA9IChDb250ZW50RWxlbWVudCkgY2hpbGQ7Ci0JCQkJCQkJfQotCQkJCQkJCWlmIChlbGVtZW50ICE9IG51bGwKLQkJCQkJCQkJCSYmIGVsZW1lbnQuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpID09IG51bGwpIHsKLQkJCQkJCQkJLy8gdGhpcyBpcyBhbiBvd24gY2hpbGQgb2YgYW4gZXh0ZW5kZWQgY2F0ZWdvcnkKLQkJCQkJCQkJLy8gaXQgbXVzdCBiZSBhZGRlZCB0byB0aGUgY2hpbGQgbGlzdCBvZiB0aGUKLQkJCQkJCQkJLy8gYmFzZSBjYXRlZ29yeSBpbiB0aGUgY29uZmlndXJhdGlvbi4KLQkJCQkJCQkJLy8KLQkJCQkJCQkJY2hpbGRyZW4uYWRkKGNoaWxkKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0KLQkJCQkJCS8vIGNvbGxlY3QgdGhlIG93biBjaGlsZHJlbiBvZiB0aGUgZXh0ZW5kZWQgY2F0ZWdvcmllcwotCQkJCQkJLy8gb2YgdGhpcyBjYXRlZ29yeSBkb3duIHRoZSBpbmhlcml0YW5jZSB0cmVlCi0JCQkJCQkvLwotCQkJCQkJYWRkRXh0ZW5kZWRDaGlsZHJlbihjYXRlZ29yeSwgbWV0aG9kQ29uZiwgY2hpbGRyZW4sCi0JCQkJCQkJCWNhdGVnb3J5UGtnUGF0aCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIGFkZEFsbFRvKExpc3QgYWxsQ2hpbGRyZW4sIExpc3QgbmV3Q2hpbGRyZW4pIHsKLQkJaW50IGlkOwotCQlCcmVha2Rvd25FbGVtZW50IGNoaWxkLCBuZXh0LCBsYXN0OwotCQlBcnJheUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJd2hpbGUoIW5ld0NoaWxkcmVuLmlzRW1wdHkoKSkgewotCQkJY2hpbGQgPSAoQnJlYWtkb3duRWxlbWVudCkgbmV3Q2hpbGRyZW4ucmVtb3ZlKDApOwotCQkJbGlzdC5jbGVhcigpOwotCQkJbGlzdC5hZGQoY2hpbGQpOwotCQkJbGFzdCA9IG51bGw7Ci0JCQkKLQkJCS8vIGZpbmQgdGhlIGxhc3QgZWxlbWVudCBvZiB0aGUgY2hhaW4gaW4gbmV3IGNoaWxkcmVuIGxpc3QKLQkJCS8vCi0JCQlmaW5kX2xhc3Q6Ci0JCQlmb3IobmV4dCA9IGNoaWxkLmdldFByZXNlbnRlZEFmdGVyKCk7IG5leHQgIT0gbnVsbDsgbmV4dCA9IG5leHQuZ2V0UHJlc2VudGVkQWZ0ZXIoKSkgewotCQkJCWxhc3QgPSBuZXh0OwotCQkJCWlkID0gaW5kZXhPZk5leHRFbGVtZW50KG5ld0NoaWxkcmVuLCBuZXh0KTsKLQkJCQlpZihpZCA9PSAtMSkgewotCQkJCQlicmVhayBmaW5kX2xhc3Q7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlsaXN0LmFkZChuZXdDaGlsZHJlbi5yZW1vdmUoaWQpKTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZihsYXN0ICE9IG51bGwpIHsKLQkJCQlpZCA9IGluZGV4T2ZOZXh0RWxlbWVudChhbGxDaGlsZHJlbiwgbGFzdCk7Ci0JCQkJaWYoaWQgPT0gLTEpIHsKLQkJCQkJYWxsQ2hpbGRyZW4uYWRkQWxsKGxpc3QpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJYWxsQ2hpbGRyZW4uYWRkQWxsKGlkLCBsaXN0KTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlhbGxDaGlsZHJlbi5hZGQoY2hpbGQpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQWRkcyB0aGUgZ2l2ZW4gY2hpbGQgdG8gdGhlIGFsbENoaWxkcmVuIGxpc3QgYmFzZWQgb24gdGhlIHByZXNlbnRlZEJlZm9yZQotCSAqIG9mIGNoaWxkLgotCSAqIAotCSAqIEBwYXJhbSBhbGxDaGlsZHJlbgotCSAqIEBwYXJhbSBjaGlsZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBhZGRUbyhMaXN0IGFsbENoaWxkcmVuLCBCcmVha2Rvd25FbGVtZW50IGNoaWxkLAotCQkJT2JqZWN0IG93bmVyLCBBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlCcmVha2Rvd25FbGVtZW50IG5leHQgPSBjaGlsZC5nZXRQcmVzZW50ZWRBZnRlcigpOwotCQlpbnQgaWQ7Ci0JCWlmIChuZXh0ID09IG51bGwpIHsKLQkJCWlkID0gLTE7Ci0JCX0gZWxzZSB7Ci0JCQlpZCA9IGluZGV4T2ZOZXh0RWxlbWVudChhbGxDaGlsZHJlbiwgbmV4dCk7Ci0JCQkvLyBpZihpZCA9PSAtMSkgewotCQkJLy8gLy8gU3lzdGVtLm91dC5wcmludGxuKCJUbmdVdGlsLmFkZFRvKCk6IGludmFsaWQgcHJlc2VudGVkQmVmb3JlCi0JCQkvLyBvZiAiICsgY2hpbGQpOwotCQkJLy8gQnJlYWtkb3duRWxlbWVudCBwcmV2ID0gY2hpbGQuZ2V0UHJlc2VudGVkQmVmb3JlKCk7Ci0JCQkvLyBpZihwcmV2ID09IG51bGwpIHsKLQkJCS8vIGlkID0gMDsKLQkJCS8vIH0KLQkJCS8vIGVsc2UgewotCQkJLy8gaWQgPSBpbmRleE9mKGFsbENoaWxkcmVuLCBwcmV2KTsKLQkJCS8vIGlmKGlkID4gLTEpIHsKLQkJCS8vIGlmKGlkIDwgYWxsQ2hpbGRyZW4uc2l6ZSgpIC0gMSkgewotCQkJLy8gaWQrKzsKLQkJCS8vIH0KLQkJCS8vIGVsc2UgewotCQkJLy8gaWQgPSAtMTsKLQkJCS8vIH0KLQkJCS8vIH0KLQkJCS8vIH0KLQkJCS8vIH0KLQkJfQotCQlpZiAoaWQgPT0gLTEpIHsKLQkJCWFsbENoaWxkcmVuLmFkZChjaGlsZCk7Ci0JCX0gZWxzZSB7Ci0JCQlhbGxDaGlsZHJlbi5hZGQoaWQsIGNoaWxkKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGluZGV4IG9mIG5leHQgZWxlbWVudCBvZiB0aGUgYnJlYWtkb3duIGVsZW1lbnQgd2hvc2UgcHJlc2VudGVkLWFmdGVyIGVsZW1lbnQgaXMgdGhlIGdpdmVuIAotCSAqIGJyZWFrIGRvd24gZWxlbWVudAotCSAqIEBwYXJhbSBtaXhlZExpc3QKLQkgKiAgICAgICAgICAgIG1peGVkIGxpc3Qgb2YgQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIgYW5kCi0JICogICAgICAgICAgICBCcmVha2Rvd25FbGVtZW50IG9iamVjdHMKLQkgKiBAcGFyYW0gcHJlc2VudGVkQWZ0ZXIKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgaW50IGluZGV4T2ZOZXh0RWxlbWVudChMaXN0IG1peGVkTGlzdCwgQnJlYWtkb3duRWxlbWVudCBwcmVzZW50ZWRBZnRlcikgewotCQlpbnQgc2l6ZSA9IG1peGVkTGlzdC5zaXplKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlPYmplY3QgbyA9IHVud3JhcChtaXhlZExpc3QuZ2V0KGkpKTsKLQkJCWlmIChvID09IHByZXNlbnRlZEFmdGVyCi0JCQkJCXx8IChvIGluc3RhbmNlb2YgVmFyaWFiaWxpdHlFbGVtZW50ICYmICgoVmFyaWFiaWxpdHlFbGVtZW50KW8pLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSA9PSBwcmVzZW50ZWRBZnRlcikpIHsKLQkJCQlyZXR1cm4gaTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gLTE7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRBdmFpbGFibGVCYXNlUHJvY2Vzc2VzKE1ldGhvZFBsdWdpbiBwbHVnaW4sCi0JCQlMaXN0IHByb2Nlc3NDbGFzc2VzKSB7Ci0JCUxpc3QgcHJvY2Vzc2VzID0gbmV3IEFycmF5TGlzdCgpOwotCQlMaXN0IGFsbEJhc2VQbHVnaW5zID0gTWlzYy5nZXRBbGxCYXNlKHBsdWdpbik7Ci0JCWFsbEJhc2VQbHVnaW5zLmFkZCgwLCBwbHVnaW4pOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBhbGxCYXNlUGx1Z2lucy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU1ldGhvZFBsdWdpbiBiYXNlUGx1Z2luID0gKE1ldGhvZFBsdWdpbikgaXRlci5uZXh0KCk7Ci0JCQlDb2xsZWN0aW9uIHBhY2thZ2VzID0gZ2V0Um9vdFByb2Nlc3NQYWNrYWdlcyhiYXNlUGx1Z2luLAotCQkJCQlwcm9jZXNzQ2xhc3Nlcyk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gcGFja2FnZXMuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJCVByb2Nlc3NQYWNrYWdlIHBrZyA9IChQcm9jZXNzUGFja2FnZSkgaXRlcmF0b3IubmV4dCgpOwotCQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IxID0gcGtnLmdldENoaWxkUGFja2FnZXMoKS5pdGVyYXRvcigpOyBpdGVyYXRvcjEKLQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCU9iamVjdCBjaGlsZFBrZyA9IChPYmplY3QpIGl0ZXJhdG9yMS5uZXh0KCk7Ci0JCQkJCWlmIChjaGlsZFBrZyBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpIHsKLQkJCQkJCVByb2Nlc3MgcHJvYyA9ICgoUHJvY2Vzc0NvbXBvbmVudCkgY2hpbGRQa2cpCi0JCQkJCQkJCS5nZXRQcm9jZXNzKCk7Ci0JCQkJCQlpZiAoaXNJbnN0YW5jZU9mKHByb2Nlc3NDbGFzc2VzLCBwcm9jKSkgewotCQkJCQkJCXByb2Nlc3Nlcy5hZGQocHJvYyk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHByb2Nlc3NlczsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmdbXSBnZXRSb290UHJvY2Vzc1BhY2thZ2VQYXRoKENsYXNzIHByb2NDbGFzcykgewotCQlpZiAocHJvY0NsYXNzID09IERlbGl2ZXJ5UHJvY2Vzcy5jbGFzcykgewotCQkJcmV0dXJuIE1vZGVsU3RydWN0dXJlLkRFRkFVTFQuZGVsaXZlcnlQcm9jZXNzUGF0aDsKLQkJfSBlbHNlIGlmIChwcm9jQ2xhc3MgPT0gQ2FwYWJpbGl0eVBhdHRlcm4uY2xhc3MpIHsKLQkJCXJldHVybiBNb2RlbFN0cnVjdHVyZS5ERUZBVUxULmNhcGFiaWxpdHlQYXR0ZXJuUGF0aDsKLQkJfSBlbHNlIGlmIChwcm9jQ2xhc3MgPT0gUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUuY2xhc3MpIHsKLQkJCXJldHVybiBNb2RlbFN0cnVjdHVyZS5ERUZBVUxULnByb2Nlc3NQbGFubmluZ1RlbXBsYXRlUGF0aDsKLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgc3RhdGljIENvbGxlY3Rpb24gZ2V0Um9vdFByb2Nlc3NQYWNrYWdlcyhNZXRob2RQbHVnaW4gcGx1Z2luLAotCQkJQ29sbGVjdGlvbiBwcm9jQ2xhc3NlcykgewotCQlMaXN0IHBhY2thZ2VzID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBwcm9jQ2xhc3Nlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCUNsYXNzIGNsYXp6ID0gKENsYXNzKSBpdGVyLm5leHQoKTsKLQkJCVN0cmluZ1tdIHBhdGggPSBnZXRSb290UHJvY2Vzc1BhY2thZ2VQYXRoKGNsYXp6KTsKLQkJCWlmIChwYXRoICE9IG51bGwpIHsKLQkJCQlNZXRob2RQYWNrYWdlIHBrZyA9IFVtYVV0aWwuZmluZE1ldGhvZFBhY2thZ2UocGx1Z2luLCBwYXRoKTsKLQkJCQlpZiAocGtnIGluc3RhbmNlb2YgUHJvY2Vzc1BhY2thZ2UpIHsKLQkJCQkJcGFja2FnZXMuYWRkKHBrZyk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHBhY2thZ2VzOwotCX0KLQkKLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gcGx1Z2luCi0JICogQHJldHVybiB0cnVlIGlmZiB0aGUgcGx1Z2luIGhhcyBhbnkgQ29udGVudENhdGVnb3J5IG9iamVjdHMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaGFzQ2F0ZWdvcmllcyhNZXRob2RQbHVnaW4gcGx1Z2luKSB7Ci0JCUxpc3Q8Q29udGVudFBhY2thZ2U+IGNvblBhY2tzID0gZ2V0Q29udGVudENhdGVnb3J5UGFja2FnZXMocGx1Z2luKTsKLQkJZm9yIChJdGVyYXRvcjxDb250ZW50UGFja2FnZT4gY29uUGFja3NJdGVyID0gY29uUGFja3MuaXRlcmF0b3IoKTtjb25QYWNrc0l0ZXIuaGFzTmV4dCgpOykgewotCQkJQ29udGVudFBhY2thZ2UgY29uUGFjayA9IGNvblBhY2tzSXRlci5uZXh0KCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGNvblBhY2tJdGVyID0gY29uUGFjay5nZXRDb250ZW50RWxlbWVudHMoKS5pdGVyYXRvcigpO2NvblBhY2tJdGVyLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3QgbyA9IGNvblBhY2tJdGVyLm5leHQoKTsKLQkJCQlpZiAobyBpbnN0YW5jZW9mIENvbnRlbnRDYXRlZ29yeSkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0JCQotCi0JcHVibGljIHN0YXRpYyBMaXN0PFByb2Nlc3M+IGdldEFsbFByb2Nlc3NlcyhNZXRob2RQbHVnaW4gcGx1Z2luKSB7Ci0JCUxpc3Q8UHJvY2Vzcz4gcHJvY2Vzc2VzID0gbmV3IEFycmF5TGlzdDxQcm9jZXNzPigpOwotCQlmb3IgKE1ldGhvZFBhY2thZ2UgcGtnIDogcGx1Z2luLmdldE1ldGhvZFBhY2thZ2VzKCkpIHsKLQkJCV9pdGVyYXRlUGFja2FnZUZvclByb2Nlc3Nlcyhwa2csIHByb2Nlc3Nlcyk7Ci0JCX0KLQotCQlyZXR1cm4gcHJvY2Vzc2VzOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgTGlzdDxQcm9jZXNzPiBnZXRBbGxQcm9jZXNzZXMoTWV0aG9kUGFja2FnZSBwa2cpIHsKLQkJTGlzdDxQcm9jZXNzPiAgcHJvY2Vzc2VzID0gbmV3IEFycmF5TGlzdDxQcm9jZXNzPiAoKTsKLQkJX2l0ZXJhdGVQYWNrYWdlRm9yUHJvY2Vzc2VzKHBrZywgcHJvY2Vzc2VzKTsKLQotCQlyZXR1cm4gcHJvY2Vzc2VzOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyB2b2lkIF9pdGVyYXRlUGFja2FnZUZvclByb2Nlc3NlcyhNZXRob2RQYWNrYWdlIHBrZywKLQkJCUxpc3QgcHJvY2Vzc2VzKSB7Ci0JCWlmIChwa2cgaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50KSB7Ci0JCQlQcm9jZXNzIHAgPSAoKFByb2Nlc3NDb21wb25lbnQpIHBrZykuZ2V0UHJvY2VzcygpOwotCQkJaWYgKHAgIT0gbnVsbCAmJiAhcHJvY2Vzc2VzLmNvbnRhaW5zKHApKSB7Ci0JCQkJcHJvY2Vzc2VzLmFkZChwKTsKLQkJCX0KLQkJfQotCi0JCWZvciAoSXRlcmF0b3IgaXQgPSBwa2cuZ2V0Q2hpbGRQYWNrYWdlcygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCV9pdGVyYXRlUGFja2FnZUZvclByb2Nlc3NlcygoTWV0aG9kUGFja2FnZSkgaXQubmV4dCgpLCBwcm9jZXNzZXMpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ2hlY2tzIGlmIGUgaXMgYSBzdWJlbGVtZW50IG9mIHBhcmVudAotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiBAcGFyYW0gZQotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNTdWJlbGVtZW50T2YoT2JqZWN0IHBhcmVudCwgT2JqZWN0IGUsCi0JCQlBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlpZiAocGFyZW50ID09IGUpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciBhZGFwdGVyID0gKElUcmVlSXRlbUNvbnRlbnRQcm92aWRlcikgYWRhcHRlckZhY3RvcnkKLQkJCQkuYWRhcHQocGFyZW50LCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQlmb3IgKEl0ZXJhdG9yPD8+IGl0ZXIgPSBhZGFwdGVyLmdldENoaWxkcmVuKHBhcmVudCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZWxlbWVudCA9IChPYmplY3QpIGl0ZXIubmV4dCgpOwotCQkJaWYgKGVsZW1lbnQgPT0gZSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCWlmIChpc1N1YmVsZW1lbnRPZihlbGVtZW50LCBlLCBhZGFwdGVyRmFjdG9yeSkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gY2hpbGQKLQkgKiBAcGFyYW0gZQotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNTdXBlckVsZW1lbnRPZihPYmplY3QgY2hpbGQsIE9iamVjdCBlLAotCQkJQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJaWYgKGNoaWxkID09IGUpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciBhZGFwdGVyID0gKElUcmVlSXRlbUNvbnRlbnRQcm92aWRlcikgYWRhcHRlckZhY3RvcnkKLQkJCQkuYWRhcHQoZSwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJZm9yIChJdGVyYXRvcjw/PiBpdGVyID0gYWRhcHRlci5nZXRDaGlsZHJlbihlKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gKE9iamVjdCkgaXRlci5uZXh0KCk7Ci0JCQlpZiAoZWxlbWVudCA9PSBjaGlsZCkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCWlmIChpc1N1cGVyRWxlbWVudE9mKGNoaWxkLCBlbGVtZW50LCBhZGFwdGVyRmFjdG9yeSkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIE9iamVjdCB1bndyYXAoT2JqZWN0IG9iaikgewotCQlpZiAob2JqIGluc3RhbmNlb2YgSVdyYXBwZXJJdGVtUHJvdmlkZXIpIHsKLQkJCWRvIHsKLQkJCQlvYmogPSAoKElXcmFwcGVySXRlbVByb3ZpZGVyKSBvYmopLmdldFZhbHVlKCk7Ci0JCQl9IHdoaWxlIChvYmogaW5zdGFuY2VvZiBJV3JhcHBlckl0ZW1Qcm92aWRlcik7Ci0JCX0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgQ29tbWFuZFdyYXBwZXIpIHsKLQkJCWRvIHsKLQkJCQlvYmogPSAoKENvbW1hbmRXcmFwcGVyKSBvYmopLmdldENvbW1hbmQoKTsKLQkJCX0gd2hpbGUgKG9iaiBpbnN0YW5jZW9mIENvbW1hbmRXcmFwcGVyKTsKLQkJfQotCi0JCXJldHVybiBvYmo7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgYm9vbGVhbiB2YWx1ZSBiYXNlZCBvbiB3aGV0aGVyIG9iamVjdCBpcyB3cmFwcGVyIG9iamVjdCBvciBub3QKLQkgKiBAcGFyYW0gb2JqCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1dyYXBwZWQoT2JqZWN0IG9iaikgewotCQlpZiAob2JqIGluc3RhbmNlb2YgSVdyYXBwZXJJdGVtUHJvdmlkZXIgfHwgb2JqIGluc3RhbmNlb2YgQ29tbWFuZFdyYXBwZXIpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIENvbW1hbmQgdW53cmFwKENvbW1hbmQgY21kKSB7Ci0JCXdoaWxlIChjbWQgaW5zdGFuY2VvZiBDb21tYW5kV3JhcHBlcikgewotCQkJY21kID0gKChDb21tYW5kV3JhcHBlcikgY21kKS5nZXRDb21tYW5kKCk7Ci0JCX0KLQotCQlyZXR1cm4gY21kOwotCX0KLQotCS8qKgotCSAqIENoZWNrcyBpZiB0aGUgZ2l2ZW4gPGNvZGU+YmFzZTwvY29kZT4gaXMgdGhlIGJhc2UgZWxlbWVudCBvZiBhbnkKLQkgKiBlbGVtZW50IGluIHRoZSBnaXZlbiBlbGVtZW50cwotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50cwotCSAqIEBwYXJhbSBiYXNlCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0Jhc2UoTGlzdCBlbGVtZW50cywgT2JqZWN0IGJhc2UpIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZWxlbWVudHMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZWxlbWVudCA9IChPYmplY3QpIGl0ZXIubmV4dCgpOwotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBWYXJpYWJpbGl0eUVsZW1lbnQpIHsKLQkJCQlpZiAoYmFzZSA9PSAoKFZhcmlhYmlsaXR5RWxlbWVudCkgZWxlbWVudCkKLQkJCQkJCS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRQcmVzZW50YXRpb25OYW1lKE9iamVjdCBlKSB7Ci0JCXJldHVybiBnZXRQcmVzZW50YXRpb25OYW1lKGUsIG51bGwpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRQcmVzZW50YXRpb25OYW1lKE9iamVjdCBlLCBQcmVzZW50YXRpb25OYW1lSGVscGVyIGhlbHBlcikgewotCQlpZiAoZSBpbnN0YW5jZW9mIENvbnRlbnREZXNjcmlwdGlvbikgewotCQkJZSA9ICgoQ29udGVudERlc2NyaXB0aW9uKSBlKS5lQ29udGFpbmVyKCk7Ci0JCX0KLQotCQlpZiAoZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCVN0cmluZyBuYW1lID0gbnVsbDsKLQkJCi0JCWlmIChlIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJbmFtZSA9ICgoTWV0aG9kRWxlbWVudCkgZSkuZ2V0UHJlc2VudGF0aW9uTmFtZSgpOwotCQkJaWYgKFN0clV0aWwuaXNCbGFuayhuYW1lKSkgCXsKLQkJCQlpZiAoaGVscGVyICE9IG51bGwpIHsKLQkJCQkJbmFtZSA9IGhlbHBlci5nZXRQcmVzZW50YXRpb25OYW1lKChNZXRob2RFbGVtZW50KSBlKTsKLQkJCQl9IAotCQkJCWlmIChoZWxwZXIgPT0gbnVsbCB8fCBTdHJVdGlsLmlzQmxhbmsobmFtZSkpIHsKLQkJCQkJbmFtZSA9ICgoTWV0aG9kRWxlbWVudCkgZSkuZ2V0TmFtZSgpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiBuYW1lOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgUHJvY2VzcyBnZXRPd25pbmdQcm9jZXNzKEJyZWFrZG93bkVsZW1lbnQgZSkgewotCQlFT2JqZWN0IGNvbnRhaW5lcjsKLQkJZm9yIChjb250YWluZXIgPSBlLmVDb250YWluZXIoKTsgY29udGFpbmVyICE9IG51bGwKLQkJCQkmJiAhKGNvbnRhaW5lciBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpOyBjb250YWluZXIgPSBjb250YWluZXIKLQkJCQkuZUNvbnRhaW5lcigpKQotCQkJOwotCQlpZiAoY29udGFpbmVyICE9IG51bGwpIHsKLQkJCXJldHVybiAoKFByb2Nlc3NDb21wb25lbnQpIGNvbnRhaW5lcikuZ2V0UHJvY2VzcygpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFByb2Nlc3MgZ2V0T3duaW5nUHJvY2VzcyhCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlciB3cmFwcGVyKSB7Ci0JCU9iamVjdCB0b3AgPSB3cmFwcGVyLmdldFRvcEl0ZW0oKTsKLQkJaWYodG9wIGluc3RhbmNlb2YgUHJvY2VzcykgewotCQkJUHJvY2VzcyBwcm9jID0gKFByb2Nlc3MpIHRvcDsKLQkJCWlmKHByb2MuZUNvbnRhaW5lcigpIGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkgewotCQkJCXJldHVybiBwcm9jOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFByb2Nlc3MgZ2V0T3duaW5nUHJvY2VzcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmKG9iamVjdCBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnQpIHsKLQkJCXJldHVybiBnZXRPd25pbmdQcm9jZXNzKChCcmVha2Rvd25FbGVtZW50KW9iamVjdCk7Ci0JCX0KLQkJZWxzZSBpZihvYmplY3QgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgewotCQkJcmV0dXJuIGdldE93bmluZ1Byb2Nlc3MoKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKW9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNhblJlZmVyZW5jZShNZXRob2RFbGVtZW50IHNvdXJjZSwKLQkJCU1ldGhvZEVsZW1lbnQgdGFyZ2V0KSB7Ci0JCU1ldGhvZFBsdWdpbiB0YXJnZXRQbHVnaW4gPSBVbWFVdGlsLmdldE1ldGhvZFBsdWdpbih0YXJnZXQpOwotCQlNZXRob2RQbHVnaW4gc291cmNlUGx1Z2luID0gVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4oc291cmNlKTsKLQkJaWYgKHNvdXJjZVBsdWdpbiA9PSB0YXJnZXRQbHVnaW4pCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJcmV0dXJuIE1pc2MuaXNCYXNlT2YodGFyZ2V0UGx1Z2luLCBzb3VyY2VQbHVnaW4pOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgT3JkZXJJbmZvIGdldE9yZGVySW5mbyhNZXRob2RFbGVtZW50IGUsIFN0cmluZyBvcmRlckluZm9OYW1lKSB7Ci0JCVN0cmluZyBzdHIgPSBlLmdldE9yZGVyaW5nR3VpZGUoKTsKLQkJaWYgKHN0ciA9PSBudWxsIHx8IHN0ci5sZW5ndGgoKSA9PSAwKQotCQkJcmV0dXJuIG51bGw7Ci0JCVJlc291cmNlIHJlcyA9IG5ldyBTdHJpbmdSZXNvdXJjZShzdHIpOwotCQl0cnkgewotCQkJcmVzLmxvYWQobnVsbCk7Ci0JCQlpZiAocmVzLmdldENvbnRlbnRzKCkuaXNFbXB0eSgpKQotCQkJCXJldHVybiBudWxsOwotCQkJT3JkZXJJbmZvQ29sbGVjdGlvbiBvcmRlckluZm9zID0gKE9yZGVySW5mb0NvbGxlY3Rpb24pIHJlcwotCQkJCQkuZ2V0Q29udGVudHMoKS5nZXQoMCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBvcmRlckluZm9zLmdldE9yZGVySW5mb3MoKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJT3JkZXJJbmZvIG9yZGVySW5mbyA9IChPcmRlckluZm8pIGl0ZXIubmV4dCgpOwotCQkJCWlmIChvcmRlckluZm9OYW1lLmVxdWFsc0lnbm9yZUNhc2Uob3JkZXJJbmZvLmdldE5hbWUoKSkpIHsKLQkJCQkJcmV0dXJuIG9yZGVySW5mbzsKLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUxKSB7Ci0JCQllMS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gcHJvdmlkZXIKLQkgKiBAcGFyYW0gbm90aWZpY2F0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlZnJlc2hDb250cmlidXRvcnMoSUNoYW5nZU5vdGlmaWVyIG5vdGlmaWVyLAotCQkJTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbiwgYm9vbGVhbiBjb250ZW50UmVmcmVzaCwKLQkJCWJvb2xlYW4gbGFiZWxVcGRhdGUpIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZ2V0Q29udHJpYnV0b3JzKChWYXJpYWJpbGl0eUVsZW1lbnQpIG5vdGlmaWNhdGlvbgotCQkJCS5nZXROb3RpZmllcigpKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZWxlbWVudCA9IGl0ZXIubmV4dCgpOwotCQkJbm90aWZpZXIuZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sCi0JCQkJCWVsZW1lbnQsIGNvbnRlbnRSZWZyZXNoLCBsYWJlbFVwZGF0ZSkpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIFVzZWQgdG8gcmVmcmVzaCBwbHVnaW5zIHRoYXQgZXh0ZW5kIGFub3RoZXIKLQkgKiBAcGFyYW0gbm90aWZpZXIKLQkgKiBAcGFyYW0gbm90aWZpY2F0aW9uCi0JICogQHBhcmFtIGNvbnRlbnRSZWZyZXNoCi0JICogQHBhcmFtIGxhYmVsVXBkYXRlCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlZnJlc2hQbHVnaW5FeHRlbmRlcnMoSUNoYW5nZU5vdGlmaWVyIG5vdGlmaWVyLAotCQkJTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbiwgYm9vbGVhbiBjb250ZW50UmVmcmVzaCwKLQkJCWJvb2xlYW4gbGFiZWxVcGRhdGUpIHsKLQkJT2JqZWN0IG9iaiA9IG5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpOwotCQlpZiAob2JqIGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBBc3NvY2lhdGlvbkhlbHBlci5nZXRQbHVnaW5EaXJlY3RFeHRlbnNpb25zKAotCQkJCQkoKE1ldGhvZFBsdWdpbikgb2JqKSkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyLm5leHQoKTsKLQkJCQlub3RpZmllci5maXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwKLQkJCQkJCWVsZW1lbnQsIGNvbnRlbnRSZWZyZXNoLCBsYWJlbFVwZGF0ZSkpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGhhc0NvbnRyaWJ1dG9yKFZhcmlhYmlsaXR5RWxlbWVudCBlKSB7Ci0JCXJldHVybiBoYXNHZW5lcmFsaXplcihlLCBDb2xsZWN0aW9ucwotCQkJCS5zaW5nbGV0b24oVmFyaWFiaWxpdHlUeXBlLkNPTlRSSUJVVEVTKSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGhhc0dlbmVyYWxpemVyKFZhcmlhYmlsaXR5RWxlbWVudCBlLAotCQkJQ29sbGVjdGlvbiB2YXJpYWJpbGl0eVR5cGVzKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBBc3NvY2lhdGlvbkhlbHBlci5nZXRJbW1lZGlhdGVWYXJpZXRpZXMoZSkKLQkJCQkuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJVmFyaWFiaWxpdHlFbGVtZW50IGVsZW1lbnQgPSAoVmFyaWFiaWxpdHlFbGVtZW50KSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAodmFyaWFiaWxpdHlUeXBlcy5jb250YWlucyhlbGVtZW50LmdldFZhcmlhYmlsaXR5VHlwZSgpKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIEl0ZXJhdG9yIGdldEltbWVkaWF0ZVZhcmlldGllcyhWYXJpYWJpbGl0eUVsZW1lbnQgZWxlbSwgVmFyaWFiaWxpdHlUeXBlIHR5cGUpIHsKLQkJTGlzdCBzZWxlY3RlZFZlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJTGlzdCBhbGxWZXMgPSBBc3NvY2lhdGlvbkhlbHBlci5nZXRJbW1lZGlhdGVWYXJpZXRpZXMoZWxlbSk7Ci0JCWZvciAoaW50IGk9MDsgaTxhbGxWZXMuc2l6ZSgpOyBpKyspIHsKLQkJCVZhcmlhYmlsaXR5RWxlbWVudCB2ZSA9IChWYXJpYWJpbGl0eUVsZW1lbnQpIGFsbFZlcy5nZXQoaSk7Ci0JCQlpZiAodHlwZSA9PSB2ZS5nZXRWYXJpYWJpbGl0eVR5cGUoKSkgewotCQkJCXNlbGVjdGVkVmVzLmFkZCh2ZSk7Ci0JCQl9CQkJCi0JCX0KLQkJcmV0dXJuIHNlbGVjdGVkVmVzLml0ZXJhdG9yKCk7Ci0JfQotCQkKLQlwdWJsaWMgc3RhdGljIEl0ZXJhdG9yIGdldEdlbmVyYWxpemVycyhWYXJpYWJpbGl0eUVsZW1lbnQgZSwKLQkJCWZpbmFsIFZhcmlhYmlsaXR5VHlwZSB0eXBlKSB7Ci0JCXJldHVybiBuZXcgQWJzdHJhY3RUcmVlSXRlcmF0b3IoZSwgZmFsc2UpIHsKLQotCQkJLyoqCi0JCQkgKiBDb21tZW50IGZvciA8Y29kZT5zZXJpYWxWZXJzaW9uVUlEPC9jb2RlPgotCQkJICovCi0JCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAzOTc4MTQ1NDM5NDQ5Mjk4NDgzTDsKLQotCQkJcHJvdGVjdGVkIEl0ZXJhdG9yIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJCQlMaXN0IGNoaWxkcmVuID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBBc3NvY2lhdGlvbkhlbHBlcgotCQkJCQkJLmdldEltbWVkaWF0ZVZhcmlldGllcygoVmFyaWFiaWxpdHlFbGVtZW50KSBvYmplY3QpCi0JCQkJCQkuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJCQlWYXJpYWJpbGl0eUVsZW1lbnQgZWxlbWVudCA9IChWYXJpYWJpbGl0eUVsZW1lbnQpIGl0ZXJhdG9yCi0JCQkJCQkJLm5leHQoKTsKLQkJCQkJaWYgKCh0eXBlID09IG51bGwpIHx8IGVsZW1lbnQuZ2V0VmFyaWFiaWxpdHlUeXBlKCkgPT0gdHlwZSkgewotCQkJCQkJY2hpbGRyZW4uYWRkKGVsZW1lbnQpOwotCQkJCQl9Ci0JCQkJfQotCQkJCXJldHVybiBjaGlsZHJlbi5pdGVyYXRvcigpOwotCQkJfQotCi0JCX07Ci0JfQotCi0JLyoqCi0JICogZ2V0IGdlZW5yYWxpemVycyBvZiBhbGwgdHlwZXMsIHJlY3Vyc2l2ZWx5Ci0JICogCi0JICogQHBhcmFtIGUKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBJdGVyYXRvciBnZXRHZW5lcmFsaXplcnMoVmFyaWFiaWxpdHlFbGVtZW50IGUpIHsKLQkJcmV0dXJuIGdldEdlbmVyYWxpemVycyhlLCBudWxsKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIEl0ZXJhdG9yIGdldENvbnRyaWJ1dG9ycyhWYXJpYWJpbGl0eUVsZW1lbnQgZSkgewotCQlyZXR1cm4gZ2V0R2VuZXJhbGl6ZXJzKGUsIFZhcmlhYmlsaXR5VHlwZS5DT05UUklCVVRFUyk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJdGVtUHJvdmlkZXJBZGFwdGVyIGdldEFkYXB0ZXIoTWV0aG9kUGx1Z2luIHBsdWdpbiwKLQkJCVN0cmluZ1tdIHBhdGgpIHsKLQkJSUdyb3VwQ29udGFpbmVyIGdyb3VwcyA9IChJR3JvdXBDb250YWluZXIpIFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJLmdldE5hdmlnYXRvclZpZXdfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpLmFkYXB0KHBsdWdpbiwKLQkJCQkJCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCWludCBpOwotCQlmb3IgKGkgPSAwOyBpIDwgcGF0aC5sZW5ndGggLSAxOyBpKyspIHsKLQkJCWdyb3VwcyA9IChJR3JvdXBDb250YWluZXIpIGdyb3Vwcy5nZXRHcm91cEl0ZW1Qcm92aWRlcihwYXRoW2ldKTsKLQkJCWlmIChncm91cHMgPT0gbnVsbCkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIGdyb3Vwcy5nZXRHcm91cEl0ZW1Qcm92aWRlcihwYXRoW2ldKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHJlZnJlc2hBZGFwdGVyKE1ldGhvZFBsdWdpbiBwbHVnaW4sIFN0cmluZ1tdIHBhdGgsCi0JCQlOb3RpZmljYXRpb24gbXNnKSB7Ci0JCWlmIChwbHVnaW4gPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCUl0ZW1Qcm92aWRlckFkYXB0ZXIgYWRhcHRlciA9IGdldEFkYXB0ZXIocGx1Z2luLCBwYXRoKTsKLQkJaWYgKGFkYXB0ZXIgIT0gbnVsbCkgewotCQkJYWRhcHRlci5maXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG1zZywgYWRhcHRlciwKLQkJCQkJdHJ1ZSwgZmFsc2UpKTsKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCByZWZyZXNoQWRhcHRlcihTdHJpbmdbXSBwYXRoLCBOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCUVPYmplY3QgZU9iaiA9IG51bGw7Ci0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEV2ZW50VHlwZSgpKSB7Ci0JCWNhc2UgTm90aWZpY2F0aW9uLkFERDoKLQkJCWVPYmogPSAoRU9iamVjdCkgbm90aWZpY2F0aW9uLmdldE5ld1ZhbHVlKCk7Ci0JCQlicmVhazsKLQkJY2FzZSBOb3RpZmljYXRpb24uQUREX01BTlk6Ci0JCQllT2JqID0gKEVPYmplY3QpIG5ldyBBcnJheUxpc3QoKENvbGxlY3Rpb24pIG5vdGlmaWNhdGlvbgotCQkJCQkuZ2V0TmV3VmFsdWUoKSkuZ2V0KDApOwotCQkJYnJlYWs7Ci0JCWNhc2UgTm90aWZpY2F0aW9uLlJFTU9WRToKLQkJCWVPYmogPSAoRU9iamVjdCkgbm90aWZpY2F0aW9uLmdldE9sZFZhbHVlKCk7Ci0JCQlicmVhazsKLQkJY2FzZSBOb3RpZmljYXRpb24uUkVNT1ZFX01BTlk6Ci0JCQllT2JqID0gKEVPYmplY3QpIG5ldyBBcnJheUxpc3QoKENvbGxlY3Rpb24pIG5vdGlmaWNhdGlvbgotCQkJCQkuZ2V0T2xkVmFsdWUoKSkuZ2V0KDApOwotCQkJYnJlYWs7Ci0JCX0KLQkJaWYgKGVPYmogIT0gbnVsbCkgewotCQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IFVtYVV0aWwuZ2V0TWV0aG9kUGx1Z2luKGVPYmopOwotCQkJVG5nVXRpbC5yZWZyZXNoQWRhcHRlcihwbHVnaW4sIHBhdGgsIG5vdGlmaWNhdGlvbik7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVmcmVzaFVuY2F0ZWdvcml6ZWRUYXNrc0l0ZW1Qcm92aWRlcigKLQkJCU1ldGhvZFBsdWdpbiBwbHVnaW4sIE5vdGlmaWNhdGlvbiBtc2cpIHsKLQkJLy8gcmVmcmVzaCB0aGUgdW5jYXRlZ29yaXplZCB0YXNrcyBncm91cAotCQkvLwotCi0JCXJlZnJlc2hBZGFwdGVyKHBsdWdpbiwgTGlicmFyeUVkaXRDb25zdGFudHMuVU5DQVRFR09SSVpFRF9UQVNLU19QQVRILAotCQkJCW1zZyk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlZnJlc2hEb21haW5VbmNhdGVnb3JpemVkV29ya1Byb2R1Y3RzSXRlbVByb3ZpZGVyKAotCQkJTWV0aG9kUGx1Z2luIHBsdWdpbiwgTm90aWZpY2F0aW9uIG1zZykgewotCQlyZWZyZXNoQWRhcHRlcihwbHVnaW4sCi0JCQkJTGlicmFyeUVkaXRDb25zdGFudHMuVU5DQVRFR09SSVpFRF9ET01BSU5fV09SS1BST0RVQ1RTX1BBVEgsCi0JCQkJbXNnKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVmcmVzaFdvcmtQcm9kdWN0VHlwZVVuY2F0ZWdvcml6ZWQoTWV0aG9kUGx1Z2luIHBsdWdpbiwKLQkJCU5vdGlmaWNhdGlvbiBtc2cpIHsKLQkJcmVmcmVzaEFkYXB0ZXIoCi0JCQkJcGx1Z2luLAotCQkJCUxpYnJhcnlFZGl0Q29uc3RhbnRzLlVOQ0FURUdPUklaRURfV09SS1BST0RVQ1RUWVBFX1dPUktQUk9EVUNUU19QQVRILAotCQkJCW1zZyk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlZnJlc2hVbmNhdGVnb3JpemVkV29ya1Byb2R1Y3RzSXRlbVByb3ZpZGVycygKLQkJCU1ldGhvZFBsdWdpbiBwbHVnaW4sIE5vdGlmaWNhdGlvbiBtc2cpIHsKLQkJcmVmcmVzaERvbWFpblVuY2F0ZWdvcml6ZWRXb3JrUHJvZHVjdHNJdGVtUHJvdmlkZXIocGx1Z2luLCBtc2cpOwotCQlyZWZyZXNoV29ya1Byb2R1Y3RUeXBlVW5jYXRlZ29yaXplZChwbHVnaW4sIG1zZyk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlZnJlc2hVbmNhdGVnb3JpemVkUm9sZXNJdGVtUHJvdmlkZXIoCi0JCQlNZXRob2RQbHVnaW4gcGx1Z2luLCBOb3RpZmljYXRpb24gbXNnKSB7Ci0JCXJlZnJlc2hBZGFwdGVyKHBsdWdpbiwgTGlicmFyeUVkaXRDb25zdGFudHMuVU5DQVRFR09SSVpFRF9ST0xFU19QQVRILAotCQkJCW1zZyk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlZnJlc2hVbmNhdGVnb3JpemVkVG9vbE1lbnRvcnNJdGVtUHJvdmlkZXIoCi0JCQlNZXRob2RQbHVnaW4gcGx1Z2luLCBOb3RpZmljYXRpb24gbXNnKSB7Ci0JCXJlZnJlc2hBZGFwdGVyKHBsdWdpbiwKLQkJCQlMaWJyYXJ5RWRpdENvbnN0YW50cy5VTkNBVEVHT1JJWkVEX1RPT0xNRU5UT1JTX1BBVEgsIG1zZyk7Ci0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIE9iamVjdCBjcmVhdGVXcmFwcGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LAotCQkJRU9iamVjdCBvYmplY3QsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBPYmplY3QgdmFsdWUsIGludCBpbmRleCkgewotCQlpZiAoRmVhdHVyZU1hcFV0aWwuaXNGZWF0dXJlTWFwKGZlYXR1cmUpKSB7Ci0JCQl2YWx1ZSA9IG5ldyBGZWF0dXJlTWFwRW50cnlXcmFwcGVySXRlbVByb3ZpZGVyKAotCQkJCQkoRmVhdHVyZU1hcC5FbnRyeSkgdmFsdWUsIG9iamVjdCwgKEVBdHRyaWJ1dGUpIGZlYXR1cmUsCi0JCQkJCWluZGV4LCBhZGFwdGVyRmFjdG9yeSwgbnVsbCk7Ci0JCX0gZWxzZSBpZiAoZmVhdHVyZSBpbnN0YW5jZW9mIEVBdHRyaWJ1dGUpIHsKLQkJCXZhbHVlID0gbmV3IEF0dHJpYnV0ZVZhbHVlV3JhcHBlckl0ZW1Qcm92aWRlcih2YWx1ZSwgb2JqZWN0LAotCQkJCQkoRUF0dHJpYnV0ZSkgZmVhdHVyZSwgaW5kZXgsIGFkYXB0ZXJGYWN0b3J5LCBudWxsKTsKLQkJfSBlbHNlIGlmICghKChFUmVmZXJlbmNlKSBmZWF0dXJlKS5pc0NvbnRhaW5tZW50KCkpIHsKLQkJCXZhbHVlID0gbmV3IEZlYXR1cmVWYWx1ZVdyYXBwZXJJdGVtUHJvdmlkZXIoZmVhdHVyZSwgdmFsdWUsIG9iamVjdCwKLQkJCQkJYWRhcHRlckZhY3RvcnkpOwotCQl9Ci0KLQkJcmV0dXJuIHZhbHVlOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IGdldE5hdmlnYXRvclBhcmVudEl0ZW1Qcm92aWRlcihHdWlkYW5jZSBndWlkYW5jZSkgewotCQlFT2JqZWN0IGNvbnRhaW5lciA9IGd1aWRhbmNlLmVDb250YWluZXIoKTsKLQkJaWYgKCEoY29udGFpbmVyIGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UpKQotCQkJcmV0dXJuIG51bGw7Ci0JCUNvbnRlbnRQYWNrYWdlSXRlbVByb3ZpZGVyIGl0ZW1Qcm92aWRlciA9IChDb250ZW50UGFja2FnZUl0ZW1Qcm92aWRlcikgVG5nVXRpbAotCQkJCS5nZXRBZGFwdGVyKGNvbnRhaW5lciwgQ29udGVudFBhY2thZ2VJdGVtUHJvdmlkZXIuY2xhc3MpOwotCQlyZXR1cm4gaXRlbVByb3ZpZGVyICE9IG51bGwgPyBpdGVtUHJvdmlkZXIuZ2V0R3VpZGFuY2VzKCkgOiBudWxsOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IGdldE5hdmlnYXRvclBhcmVudEl0ZW1Qcm92aWRlcihXb3JrUHJvZHVjdCBvYmplY3QpIHsKLQkJRU9iamVjdCBjb250ZW50UGtnID0gb2JqZWN0LmVDb250YWluZXIoKTsKLQkJaWYgKGNvbnRlbnRQa2cgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlDb250ZW50UGFja2FnZUl0ZW1Qcm92aWRlciBpdGVtUHJvdmlkZXIgPSAoQ29udGVudFBhY2thZ2VJdGVtUHJvdmlkZXIpIFRuZ1V0aWwKLQkJCQkuZ2V0QWRhcHRlcihjb250ZW50UGtnLCBDb250ZW50UGFja2FnZUl0ZW1Qcm92aWRlci5jbGFzcyk7Ci0JCXJldHVybiBpdGVtUHJvdmlkZXIgIT0gbnVsbCA/IGl0ZW1Qcm92aWRlci5nZXRXb3JrUHJvZHVjdHMoKSA6IG51bGw7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJT2JqZWN0IGFkYXB0ZXIgPSBudWxsOwotCQl0cnkgewotCQkJYWRhcHRlciA9IHVtYUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LmFkYXB0KG9iamVjdCwKLQkJCQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCWlmIChhZGFwdGVyIGluc3RhbmNlb2YgSUl0ZW1MYWJlbFByb3ZpZGVyKSB7Ci0JCQkJcmV0dXJuICgoSUl0ZW1MYWJlbFByb3ZpZGVyKSBhZGFwdGVyKS5nZXRJbWFnZShvYmplY3QpOwotCQkJfQotCQl9Ci0JCWZpbmFsbHkgewotCQkJaWYoYWRhcHRlciAhPSBvYmplY3QgJiYgYWRhcHRlciBpbnN0YW5jZW9mIElEaXNwb3NhYmxlKSB7Ci0JCQkJKChJRGlzcG9zYWJsZSlhZGFwdGVyKS5kaXNwb3NlKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBPYmplY3QgZ2V0Q29sdW1uSW1hZ2UoT2JqZWN0IG9iamVjdCwgU3RyaW5nIGNvbE5hbWUpIHsKLQkJLy8gaWYoY29sTmFtZSA9PSBJQlNJdGVtUHJvdmlkZXIuQ09MX1RZUEUpCi0JCS8vIGlmKGNvbE5hbWUgPT0gSUJTSXRlbVByb3ZpZGVyLkNPTF9OQU1FKQotCQlpZiAoY29sTmFtZSA9PSBJQlNJdGVtUHJvdmlkZXIuQ09MX1BSRVNFTlRBVElPTl9OQU1FKSB7Ci0JCQlyZXR1cm4gZ2V0SW1hZ2Uob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBNb3ZlIGVsZW1lbnQgdXAgd2l0aGluZyB0aGUgcGFyZW50Ci0JICogCi0JICogQHBhcmFtIGFjdGl2aXR5Ci0JICogQHBhcmFtIGVsZW1lbnRPYmoKLQkgKiBAcGFyYW0gZUNsYXNzZXMKLQkgKiBAcGFyYW0gYWN0aW9uTWdyCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIG1vdmVVcChBY3Rpdml0eSBhY3Rpdml0eSwgT2JqZWN0IGVsZW1lbnRPYmosCi0JCQlDb2xsZWN0aW9uIGVDbGFzc2VzLCBJQWN0aW9uTWFuYWdlciBhY3Rpb25NZ3IpIHsKLQkJTW92ZVVwQ29tbWFuZCBjbWQgPSBuZXcgTW92ZVVwQ29tbWFuZChhY3Rpdml0eSwgZWxlbWVudE9iaiwgZUNsYXNzZXMpOwotCQlhY3Rpb25NZ3IuZXhlY3V0ZShjbWQpOwotCX0KLQotCS8qKgotCSAqIE1vdmUgZWxlbWVudCBkb3duIHdpdGhpbiB0aGUgcGFyZW50Ci0JICogCi0JICogQHBhcmFtIGFjdGl2aXR5Ci0JICogQHBhcmFtIGVsZW1lbnRPYmoKLQkgKiBAcGFyYW0gZUNsYXNzZXMKLQkgKiBAcGFyYW0gYWN0aW9uTWdyCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIG1vdmVEb3duKEFjdGl2aXR5IGFjdGl2aXR5LCBPYmplY3QgZWxlbWVudE9iaiwKLQkJCUNvbGxlY3Rpb24gZUNsYXNzZXMsIElBY3Rpb25NYW5hZ2VyIGFjdGlvbk1ncikgewotCQlNb3ZlRG93bkNvbW1hbmQgY21kID0gbmV3IE1vdmVEb3duQ29tbWFuZChhY3Rpdml0eSwgZWxlbWVudE9iaiwKLQkJCQllQ2xhc3Nlcyk7Ci0JCWFjdGlvbk1nci5leGVjdXRlKGNtZCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBDdXN0b21DYXRlZ29yeSBjcmVhdGVSb290Q3VzdG9tQ2F0ZWdvcnkoCi0JCQlDb250ZW50UGFja2FnZSBjdXN0b21DYXRlZ29yeVBrZykgewotCQkvLyBjcmVhdGUgcm9vdCBjdXN0b20gY2F0ZWdvcnkKLQkJLy8KLQkJQ3VzdG9tQ2F0ZWdvcnkgcm9vdEN1c3RvbUNhdGVnb3J5ID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkuY3JlYXRlQ3VzdG9tQ2F0ZWdvcnkoKTsKLQkJcm9vdEN1c3RvbUNhdGVnb3J5LnNldE5hbWUoTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkuZ2V0U3RyaW5nKCJfVUlfQ3VzdG9tX0NhdGVnb3JpZXNfZ3JvdXAiKSk7IC8vJE5PTi1OTFMtMSQKLQkJQ29udGVudFBhY2thZ2UgaGlkZGVuUGtnID0gVW1hVXRpbC5maW5kQ29udGVudFBhY2thZ2UoY3VzdG9tQ2F0ZWdvcnlQa2cKLQkJCQkuZ2V0Q2hpbGRQYWNrYWdlcygpLCBNb2RlbFN0cnVjdHVyZS5ISURERU5fUEFDS0FHRV9OQU1FKTsKLQkJaWYgKGhpZGRlblBrZyA9PSBudWxsKSB7Ci0JCQkvLyBjcmVhdGUgaGlkZGVuIHBhY2thZ2UgdG8gc3RvcmUgdGhlIHJvb3QgY3VzdG9tIGNhdGVnb3J5Ci0JCQkvLwotCQkJaGlkZGVuUGtnID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQ29udGVudFBhY2thZ2UoKTsKLQkJCWhpZGRlblBrZy5zZXROYW1lKE1vZGVsU3RydWN0dXJlLkhJRERFTl9QQUNLQUdFX05BTUUpOwotCQkJY3VzdG9tQ2F0ZWdvcnlQa2cuZ2V0Q2hpbGRQYWNrYWdlcygpLmFkZChoaWRkZW5Qa2cpOwotCQl9Ci0JCWhpZGRlblBrZy5nZXRDb250ZW50RWxlbWVudHMoKS5hZGQocm9vdEN1c3RvbUNhdGVnb3J5KTsKLQotCQlyZXR1cm4gcm9vdEN1c3RvbUNhdGVnb3J5OwotCX0KLQotCXB1YmxpYyBzdGF0aWMgQ3VzdG9tQ2F0ZWdvcnkgZ2V0Um9vdEN1c3RvbUNhdGVnb3J5KE1ldGhvZFBsdWdpbiBwbHVnaW4pIHsKLQkJQ29udGVudFBhY2thZ2UgY3VzdG9tQ2F0ZWdvcnlQa2cgPSBVbWFVdGlsLmZpbmRDb250ZW50UGFja2FnZShwbHVnaW4sCi0JCQkJTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC5jdXN0b21DYXRlZ29yeVBhdGgpOwotCQlpZiAoY3VzdG9tQ2F0ZWdvcnlQa2cgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlDb250ZW50UGFja2FnZSBoaWRkZW5Qa2cgPSBVbWFVdGlsLmZpbmRDb250ZW50UGFja2FnZShjdXN0b21DYXRlZ29yeVBrZwotCQkJCS5nZXRDaGlsZFBhY2thZ2VzKCksIE1vZGVsU3RydWN0dXJlLkhJRERFTl9QQUNLQUdFX05BTUUpOwotCQlpZiAoaGlkZGVuUGtnICE9IG51bGwgJiYgIWhpZGRlblBrZy5nZXRDb250ZW50RWxlbWVudHMoKS5pc0VtcHR5KCkpIHsKLQkJCXJldHVybiAoQ3VzdG9tQ2F0ZWdvcnkpIGhpZGRlblBrZy5nZXRDb250ZW50RWxlbWVudHMoKS5nZXQoMCk7Ci0JCX0KLQkJQ3VzdG9tQ2F0ZWdvcnkgcm9vdCA9IGNyZWF0ZVJvb3RDdXN0b21DYXRlZ29yeShjdXN0b21DYXRlZ29yeVBrZyk7Ci0JCS8vIGNvZGUgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHk6IGFkZCBhbGwgdGhlIGN1c3RvbSBjYXRlZ29yaWVzIHVuZGVyCi0JCS8vIGN1c3RvbUNhdGVnb3J5UGtnCi0JCS8vIHRvIHRoZSBjb250ZW50IGVsZW1lbnQgcmVmZXJlbmNlIGxpc3Qgb2YgdGhlIHJvb3QgY3VzdG9tIGNhdGVnb3J5IHNvCi0JCS8vIHRoZXkgY2FuIGJlIHZpc2libGUKLQkJLy8gaW4gdGhlIG5ldyBVSQotCQkvLwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjdXN0b21DYXRlZ29yeVBrZy5nZXRDb250ZW50RWxlbWVudHMoKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEN1c3RvbUNhdGVnb3J5KSB7Ci0JCQkJcm9vdC5nZXRDYXRlZ29yaXplZEVsZW1lbnRzKCkuYWRkKChEZXNjcmliYWJsZUVsZW1lbnQpIGVsZW1lbnQpOwotCQkJfQotCQl9Ci0JCXJldHVybiByb290OwotCX0KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1Jvb3RDdXN0b21DYXRlZ29yeShDdXN0b21DYXRlZ29yeSBjYXRlZ29yeSkgewotCQlFT2JqZWN0IHBrZyA9IGNhdGVnb3J5LmVDb250YWluZXIoKTsKLQkJaWYgKHBrZyBpbnN0YW5jZW9mIENvbnRlbnRQYWNrYWdlCi0JCQkJJiYgTW9kZWxTdHJ1Y3R1cmUuSElEREVOX1BBQ0tBR0VfTkFNRQotCQkJCQkJLmVxdWFscygoKENvbnRlbnRQYWNrYWdlKSBwa2cpLmdldE5hbWUoKSkpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNSb290Q3V0b21DYXRlZ29yeVBhY2thZ2UoTWV0aG9kUGFja2FnZSBwa2cpIHsKLQkJaWYgKCAhKHBrZyBpbnN0YW5jZW9mIENvbnRlbnRQYWNrYWdlKSB8fAotCQkJCSFNb2RlbFN0cnVjdHVyZS5ISURERU5fUEFDS0FHRV9OQU1FCi0JCQkJCQkuZXF1YWxzKHBrZy5nZXROYW1lKCkpICkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCQotCQkvLyBjaGVjayB0aGUgcGx1Z2luIGFuZCBtYWtlIHN1cmUgaXQncyB0aGUgb2JqZWN0LCBUT0RPCi0JCQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JLyoqCi0JICogU2F2ZXMgcmVzb3VyY2Ugb2YgdGhlIGdpdmVuIGVsZW1lbnQncyBjb250YWluZXIgaWYgdGhpcyBoYXMgYmVlbiBtb2RpZmllZAotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNhdmVDb250YWluZXJSZXNvdXJjZShFT2JqZWN0IGVsZW1lbnQsCi0JCQlJRmlsZUJhc2VkTGlicmFyeVBlcnNpc3RlciBwZXJzaXN0ZXIpIHsKLQkJLy8gc2F2ZSBjb250YWluZXIncyByZXNvdXJjZQotCQlpZiAoZWxlbWVudC5lQ29udGFpbmVyKCkgIT0gbnVsbCkgewotCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSBlbGVtZW50LmVDb250YWluZXIoKS5lUmVzb3VyY2UoKTsKLQkJCWlmIChyZXNvdXJjZSAhPSBudWxsICYmIHJlc291cmNlLmlzTW9kaWZpZWQoKSkgewotCQkJCXRyeSB7Ci0JCQkJCXBlcnNpc3Rlci5zYXZlKHJlc291cmNlKTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JfQotCi0JcHVibGljIHN0YXRpYyBDb250ZW50Q2F0ZWdvcnkgZmluZENvbnRyaWJ1dG9yKENvbnRlbnRQYWNrYWdlIGNhdGVnb3J5UGtnLAotCQkJQ29udGVudENhdGVnb3J5IGJhc2VDYXRlZ29yeSkgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjYXRlZ29yeVBrZy5nZXRDb250ZW50RWxlbWVudHMoKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCUNvbnRlbnRDYXRlZ29yeSBjYXQgPSAoQ29udGVudENhdGVnb3J5KSBpdGVyLm5leHQoKTsKLQkJCWlmIChjYXQuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpID09IGJhc2VDYXRlZ29yeSkgewotCQkJCXJldHVybiBjYXQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzRW1wdHkoQ29udGVudENhdGVnb3J5IGNhdGVnb3J5KSB7Ci0JCWlmICghY2F0ZWdvcnkuZ2V0Q29uY2VwdHNBbmRQYXBlcnMoKS5pc0VtcHR5KCkKLQkJCQl8fCAhY2F0ZWdvcnkuZ2V0U3VwcG9ydGluZ01hdGVyaWFscygpLmlzRW1wdHkoKSkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlpZiAoY2F0ZWdvcnkgaW5zdGFuY2VvZiBEaXNjaXBsaW5lKSB7Ci0JCQlyZXR1cm4gKChEaXNjaXBsaW5lKSBjYXRlZ29yeSkuZ2V0VGFza3MoKS5pc0VtcHR5KCk7Ci0JCX0gZWxzZSBpZiAoY2F0ZWdvcnkgaW5zdGFuY2VvZiBEb21haW4pIHsKLQkJCXJldHVybiAoKERvbWFpbikgY2F0ZWdvcnkpLmdldFdvcmtQcm9kdWN0cygpLmlzRW1wdHkoKTsKLQkJfSBlbHNlIGlmIChjYXRlZ29yeSBpbnN0YW5jZW9mIFJvbGVTZXQpIHsKLQkJCXJldHVybiAoKFJvbGVTZXQpIGNhdGVnb3J5KS5nZXRSb2xlcygpLmlzRW1wdHkoKTsKLQkJfSBlbHNlIGlmIChjYXRlZ29yeSBpbnN0YW5jZW9mIFRvb2wpIHsKLQkJCXJldHVybiAoKFRvb2wpIGNhdGVnb3J5KS5nZXRUb29sTWVudG9ycygpLmlzRW1wdHkoKTsKLQkJfSBlbHNlIGlmIChjYXRlZ29yeSBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0VHlwZSkgewotCQkJcmV0dXJuICgoV29ya1Byb2R1Y3RUeXBlKSBjYXRlZ29yeSkuZ2V0V29ya1Byb2R1Y3RzKCkuaXNFbXB0eSgpOwotCQl9IGVsc2UgaWYgKGNhdGVnb3J5IGluc3RhbmNlb2YgQ3VzdG9tQ2F0ZWdvcnkpIHsKLQkJCUN1c3RvbUNhdGVnb3J5IHVzZXJEZWZpbmVkQ2F0ZWdvcnkgPSAoKEN1c3RvbUNhdGVnb3J5KSBjYXRlZ29yeSk7Ci0JCQlyZXR1cm4gdXNlckRlZmluZWRDYXRlZ29yeS5nZXRDYXRlZ29yaXplZEVsZW1lbnRzKCkuaXNFbXB0eSgpCi0JCQkvLyAmJiB1c2VyRGVmaW5lZENhdGVnb3J5LmdldFN1YkNhdGVnb3JpZXMoKS5pc0VtcHR5KCkKLQkJCTsKLQkJfQotCi0JCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlVua25vd24gY2F0ZWdvcnk6ICIgKyBjYXRlZ29yeSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gb3JkZXIKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGFkZFRvUGFja2FnZShXb3JrT3JkZXIgb3JkZXIsIEJyZWFrZG93bkVsZW1lbnQgZSkgewotCQlFT2JqZWN0IGNvbnRhaW5lciA9IGUuZUNvbnRhaW5lcigpOwotCQlpZihjb250YWluZXIgIT0gbnVsbCkgewotCQkJKChQcm9jZXNzUGFja2FnZSkgY29udGFpbmVyKS5nZXRQcm9jZXNzRWxlbWVudHMoKS5hZGQob3JkZXIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIG9yZGVyCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCByZW1vdmVGcm9tUGFja2FnZShXb3JrT3JkZXIgb3JkZXIsIEJyZWFrZG93bkVsZW1lbnQgZSkgewotCQlFT2JqZWN0IGNvbnRhaW5lciA9IGUuZUNvbnRhaW5lcigpOwotCQlpZihjb250YWluZXIgaW5zdGFuY2VvZiBQcm9jZXNzUGFja2FnZSkgewotCQkJKChQcm9jZXNzUGFja2FnZSkgY29udGFpbmVyKS5nZXRQcm9jZXNzRWxlbWVudHMoKS5yZW1vdmUob3JkZXIpOwotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGhhbmRsZVByZWRlY2Vzc29yTGlzdENoYW5nZSgKLQkJCUl0ZW1Qcm92aWRlckFkYXB0ZXIgYWRhcHRlciwgTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQlpZiAobm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCkgaW5zdGFuY2VvZiBXb3JrQnJlYWtkb3duRWxlbWVudCkgewotCQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKFdvcmtCcmVha2Rvd25FbGVtZW50LmNsYXNzKSkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX19MSU5LX1RPX1BSRURFQ0VTU09SOgotCQkJCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEV2ZW50VHlwZSgpKSB7Ci0JCQkJY2FzZSBOb3RpZmljYXRpb24uQUREOgotCQkJCQlhZGRUb1BhY2thZ2UoKFdvcmtPcmRlcikgbm90aWZpY2F0aW9uLmdldE5ld1ZhbHVlKCksCi0JCQkJCQkJKEJyZWFrZG93bkVsZW1lbnQpIG5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBOb3RpZmljYXRpb24uQUREX01BTlk6Ci0JCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9ICgoQ29sbGVjdGlvbikgbm90aWZpY2F0aW9uCi0JCQkJCQkJLmdldE5ld1ZhbHVlKCkpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQkJYWRkVG9QYWNrYWdlKChXb3JrT3JkZXIpIGl0ZXIubmV4dCgpLAotCQkJCQkJCQkoQnJlYWtkb3duRWxlbWVudCkgbm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCkpOwotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgTm90aWZpY2F0aW9uLlJFTU9WRToKLQkJCQkJcmVtb3ZlRnJvbVBhY2thZ2UoKFdvcmtPcmRlcikgbm90aWZpY2F0aW9uLmdldE9sZFZhbHVlKCksCi0JCQkJCQkJKEJyZWFrZG93bkVsZW1lbnQpIG5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBOb3RpZmljYXRpb24uUkVNT1ZFX01BTlk6Ci0JCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9ICgoQ29sbGVjdGlvbikgbm90aWZpY2F0aW9uCi0JCQkJCQkJLmdldE9sZFZhbHVlKCkpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQkJcmVtb3ZlRnJvbVBhY2thZ2UoKFdvcmtPcmRlcikgaXRlci5uZXh0KCksCi0JCQkJCQkJCShCcmVha2Rvd25FbGVtZW50KSBub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKSk7Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0KLQkJCQl9Ci0KLQkJCQlhZGFwdGVyLmZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLAotCQkJCQkJbm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCksIGZhbHNlLCB0cnVlKSk7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIHJldHVybiBhbGwgdGhlIGdsb2JhbCBwYWNrYWdlcyBmb3IgdGhlIG1ldGhvZCBwbHVnaW4KLQkgKiAKLQkgKiBAcGFyYW0gcGx1Z2luCi0JICogICAgICAgICAgICBNZXRob2RQbHVnaW4KLQkgKiBAcmV0dXJuIExpc3QgYSBsaXN0IG9mIGdsb2JhbCBwYWNrYWdlcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdDxDb250ZW50UGFja2FnZT4gZ2V0R2xvYmFsUGFja2FnZXMoTWV0aG9kUGx1Z2luIHBsdWdpbikgewotCQlBcnJheUxpc3Q8Q29udGVudFBhY2thZ2U+IHBhY2thZ2VzID0gbmV3IEFycmF5TGlzdDxDb250ZW50UGFja2FnZT4oKTsKLQkJU3RyaW5nW11bXSBjYXRlZ29yeVBhdGhzID0gTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC5nZXRDYXRlZ29yeVBhdGhzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2F0ZWdvcnlQYXRocy5sZW5ndGg7IGkrKykgewotCQkJU3RyaW5nW10gcGF0aCA9IGNhdGVnb3J5UGF0aHNbaV07Ci0JCQlDb250ZW50UGFja2FnZSBjYXRlZ29yeVBrZyA9IFVtYVV0aWwuZmluZENvbnRlbnRQYWNrYWdlKHBsdWdpbiwKLQkJCQkJcGF0aCk7Ci0JCQlpZiAoY2F0ZWdvcnlQa2cgIT0gbnVsbCkgewotCQkJCXBhY2thZ2VzLmFkZChjYXRlZ29yeVBrZyk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gcGFja2FnZXM7Ci0JfQotCi0JCi0JLyoqCi0JICogcmV0dXJuIGFsbCB0aGUgY29udGVudCBjYXRlZ29yeSBwYWNrYWdlcyBmb3IgdGhlIG1ldGhvZCBwbHVnaW4uIAotCSAqIAotCSAqIEBwYXJhbSBwbHVnaW4KLQkgKiAgICAgICAgICAgIE1ldGhvZFBsdWdpbgotCSAqIEByZXR1cm4gTGlzdCBhIGxpc3Qgb2YgZ2xvYmFsIHBhY2thZ2VzCi0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0PENvbnRlbnRQYWNrYWdlPiBnZXRDb250ZW50Q2F0ZWdvcnlQYWNrYWdlcyhNZXRob2RQbHVnaW4gcGx1Z2luKSB7Ci0JCXJldHVybiBnZXRHbG9iYWxQYWNrYWdlcyhwbHVnaW4pOwotCX0KLQkKLQkKLQkvKioKLQkgKiByZXR1cm4gYWxsIHRoZSBzeXN0ZW0gZGVmaW5lZCBwYWNrYWdlcyBmb3IgdGhlIG1ldGhvZCBwbHVnaW4KLQkgKiAKLQkgKiBAcGFyYW0gcGx1Z2luCi0JICogICAgICAgICAgICBNZXRob2RQbHVnaW4KLQkgKiBAcmV0dXJuIExpc3QgYSBsaXN0IG9mIGFsbCBzeXN0ZW0gcGFja2FnZXMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3QgZ2V0QWxsU3lzdGVtUGFja2FnZXMoTWV0aG9kUGx1Z2luIHBsdWdpbikgewotCQlBcnJheUxpc3QgcGFja2FnZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCVN0cmluZ1tdW10gcGF0aHMgPSBNb2RlbFN0cnVjdHVyZS5ERUZBVUxULmdldEFsbFN5c3RlbVBhdGhzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcGF0aHMubGVuZ3RoOyBpKyspIHsKLQkJCVN0cmluZ1tdIHBhdGggPSBwYXRoc1tpXTsKLQkJCU1ldGhvZFBhY2thZ2UgcGtnID0gVW1hVXRpbC5maW5kTWV0aG9kUGFja2FnZShwbHVnaW4sIHBhdGgpOwotCQkJaWYgKHBrZyAhPSBudWxsICYmICFwYWNrYWdlcy5jb250YWlucyhwa2cpKSB7Ci0JCQkJcGFja2FnZXMuYWRkKHBrZyk7Ci0JCQkJRU9iamVjdCBvID0gcGtnLmVDb250YWluZXIoKTsKLQkJCQl3aGlsZSAoKG8gaW5zdGFuY2VvZiBNZXRob2RQYWNrYWdlKSAmJiAhcGFja2FnZXMuY29udGFpbnMobykpIHsKLQkJCQkJcGFja2FnZXMuYWRkKG8pOwotCQkJCQlvID0gby5lQ29udGFpbmVyKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJLy8gYWxzbyBhZGQgdGhlIGhpZGRlbiBjb3N0b20gY2F0ZWdvcnkgcGFja2FnZQotCQlDb250ZW50UGFja2FnZSBjdXN0b21DYXRlZ29yeVBrZyA9IFVtYVV0aWwuZmluZENvbnRlbnRQYWNrYWdlKHBsdWdpbiwKLQkJCQlNb2RlbFN0cnVjdHVyZS5ERUZBVUxULmN1c3RvbUNhdGVnb3J5UGF0aCk7Ci0JCWlmIChjdXN0b21DYXRlZ29yeVBrZyAhPSBudWxsKSB7Ci0JCQlDb250ZW50UGFja2FnZSBoaWRkZW5Qa2cgPSBVbWFVdGlsLmZpbmRDb250ZW50UGFja2FnZSgKLQkJCQkJY3VzdG9tQ2F0ZWdvcnlQa2cuZ2V0Q2hpbGRQYWNrYWdlcygpLAotCQkJCQlNb2RlbFN0cnVjdHVyZS5ISURERU5fUEFDS0FHRV9OQU1FKTsKLQkJCWlmIChoaWRkZW5Qa2cgIT0gbnVsbCkgewotCQkJCXBhY2thZ2VzLmFkZChoaWRkZW5Qa2cpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHBhY2thZ2VzOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1ByZWRlZmluZWQoTWV0aG9kRWxlbWVudCBlKSB7Ci0JCWlmIChlIGluc3RhbmNlb2YgQ3VzdG9tQ2F0ZWdvcnkKLQkJCQkmJiBpc1Jvb3RDdXN0b21DYXRlZ29yeSgoQ3VzdG9tQ2F0ZWdvcnkpIGUpKQotCQkJcmV0dXJuIHRydWU7Ci0JCVN0cmluZyBwYXRoID0gTW9kZWxTdHJ1Y3R1cmUKLQkJCQkudG9GaWxlUGF0aChNaXNjLmdldFBhdGhSZWxhdGl2ZVRvUGx1Z2luKGUpKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gTW9kZWxTdHJ1Y3R1cmUuQUxMX1BSRURFRklORURfUEFUSFMuaXRlcmF0b3IoKTsgaXRlcgotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQlTdHJpbmcgcHJlZGVmaW5lUGF0aCA9IChTdHJpbmcpIGl0ZXIubmV4dCgpOwotCQkJaWYgKHByZWRlZmluZVBhdGguc3RhcnRzV2l0aChwYXRoKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQotCXB1YmxpYyBzdGF0aWMgTWV0aG9kUGFja2FnZSBnZXRNZXRob2RQYWNrYWdlKEVPYmplY3QgZSkgewotCQlmb3IgKDsgIShlIGluc3RhbmNlb2YgTWV0aG9kUGFja2FnZSkgJiYgZSAhPSBudWxsOyBlID0gZS5lQ29udGFpbmVyKCkpCi0JCQk7Ci0JCXJldHVybiAoTWV0aG9kUGFja2FnZSkgZTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBNZXRob2RQYWNrYWdlIGdldFBhcmVudE1ldGhvZFBhY2thZ2UoRU9iamVjdCBlKSB7Ci0JCUVPYmplY3QgZW9iaiA9IGU7Ci0JCXdoaWxlKGVvYmogIT0gbnVsbCkgewotCQkJZW9iaiA9IGVvYmouZUNvbnRhaW5lcigpOwotCQkJaWYgKGVvYmogPT0gbnVsbCApIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0gZWxzZSBpZiAoZW9iaiBpbnN0YW5jZW9mIE1ldGhvZFBhY2thZ2UpIHsKLQkJCQlyZXR1cm4gKE1ldGhvZFBhY2thZ2UpIGVvYmo7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuICBudWxsOwotCX0KLQotCS8qKgotCSAqIHZhbGlkYXRlIHRoZSBjb25maWd1cmF0aW9uIGJ5IGZvcmNpbmcgdG8gc2VsZWN0IHRoZSBnbG9iYWwgcGFja2FnZXMgb2YKLQkgKiB0aGUgc2VsZWN0ZWQgbWV0aG9kIHBsdWdpbnMsIHRoaXMgaXMgbmVlZGVkIGZvciBjb25maWd1cmF0aW9uIGV4cG9ydGluZy4KLQkgKiBJZiBnbG9iYWwgcGFja2FnZXMgYXJlIG1pc3NpbmcsIHRoZSBleHBvcnRlZCBjb25maWd1cmF0aW9uIGlzIG5vdCB2YWxpZAotCSAqIAotCSAqIEBwYXJhbSBhY3Rpb25NZ3IgaWYgbm90IG51bGwsIHdpbGwgdXNlIHRoZSBnaXZlbiBJQWN0aW9uTWFuYWdlciB0byBjaGFuZ2UgdGhlIGNvbmZpZ3VyYXRpb24sIG90aGVyd2lzZSBjb25maWd1cmF0aW9uIHdpbGwgYmUgY2hhbmdlZCBkaXJlY3RseQotCSAqIEBwYXJhbSBwbHVnaW4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgdmFsaWRhdGVNZXRob2RDb25maWd1cmF0aW9uKElBY3Rpb25NYW5hZ2VyIGFjdGlvbk1nciwgTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLQkJTGlzdCBwbHVnaW5zID0gbmV3IEFycmF5TGlzdChjb25maWcuZ2V0TWV0aG9kUGx1Z2luU2VsZWN0aW9uKCkpOwotCQlMaXN0IHBrZ1NlbHMgPSBuZXcgQXJyYXlMaXN0KGNvbmZpZy5nZXRNZXRob2RQYWNrYWdlU2VsZWN0aW9uKCkpOwotCQlMaXN0PE1ldGhvZFBsdWdpbj4gcGx1Z2luc1RvQWRkID0gbmV3IEFycmF5TGlzdDxNZXRob2RQbHVnaW4+KCk7Ci0JCUxpc3Q8TWV0aG9kUGFja2FnZT4gcGFja2FnZXNUb0FkZCA9IG5ldyBBcnJheUxpc3Q8TWV0aG9kUGFja2FnZT4oKTsKLQotCQkvLyBtYWtlIHN1cmUgYWxsIHJlcXVpcmVkIHBhY2thZ2VzIGFyZSBzZWxlY3RlZC4KLQkJLy8gaWYgYSBwYWNrYWdlIGlzIHNlbGVjdGVkLCBhbGwgdGhlIHBhcmVudCBwYWNrYWdlcyBtdXN0IGJlIHNlbGVjdGVkLgotCQlmb3IgKCBJdGVyYXRvciBpdCA9IG5ldyBBcnJheUxpc3QocGtnU2VscykuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOyApIHsKLQkJCU1ldGhvZFBhY2thZ2UgcGtnID0gKE1ldGhvZFBhY2thZ2UpaXQubmV4dCgpOwotCQkJRU9iamVjdCBjID0gcGtnLmVDb250YWluZXIoKTsKLQkJCXdoaWxlICggKChjIGluc3RhbmNlb2YgTWV0aG9kUGFja2FnZSkgfHwgKGMgaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pKSAKLQkJCQkJJiYgIXBrZ1NlbHMuY29udGFpbnMoYykgJiYgIXBsdWdpbnMuY29udGFpbnMoYykgKSB7Ci0JCQkJaWYgKGMgaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pIHsKLQkJCQkJcGx1Z2lucy5hZGQoYyk7Ci0JCQkJCXBsdWdpbnNUb0FkZC5hZGQoKE1ldGhvZFBsdWdpbiljKTsKLQkJCQl9IGVsc2UgewotCQkJCQlwa2dTZWxzLmFkZChjKTsKLQkJCQkJcGFja2FnZXNUb0FkZC5hZGQoKE1ldGhvZFBhY2thZ2UpYyk7Ci0JCQkJfQotCQkJCQotCQkJCWMgPSBjLmVDb250YWluZXIoKTsKLQkJCX0JCi0JCQkKLQkJCS8vIGlmIHRoZSBwYWNrYWdlIGlzIGEgUHJvY2Vzc0NvbXBvbmVudCwgc2VsZWN0IGFsbCB0aGUgY2hpbGQgcGFja2FnZXMKLQkJCWlmICggcGtnIGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCApIHsKLQkJCQlMaXN0IG9sZFBrZ1NlbHMgPSBuZXcgQXJyYXlMaXN0KHBrZ1NlbHMpOwotCQkJCWdldEFsbENoaWxkUGFja2FnZXMocGtnLCBwa2dTZWxzKTsKLQkJCQlwa2dTZWxzLnJlbW92ZUFsbChvbGRQa2dTZWxzKTsKLQkJCQlwYWNrYWdlc1RvQWRkLmFkZEFsbChwa2dTZWxzKTsKLQkJCX0KLQkJfQotCQlDb25maWd1cmF0aW9uVXRpbC5hZGRDb2xsVG9NZXRob2RQbHVnaW5MaXN0KGFjdGlvbk1nciwgY29uZmlnLCBwbHVnaW5zVG9BZGQpOwotCQlDb25maWd1cmF0aW9uVXRpbC5hZGRDb2xsVG9NZXRob2RQYWNrYWdlTGlzdChhY3Rpb25NZ3IsIGNvbmZpZywgcGFja2FnZXNUb0FkZCk7Ci0JCXBrZ1NlbHMgPSBuZXcgQXJyYXlMaXN0KGNvbmZpZy5nZXRNZXRob2RQYWNrYWdlU2VsZWN0aW9uKCkpOwotCi0JCS8vIG1ha2Ugc3VyZSBhbGwgc3lzdGVtIHBhY2thZ2VzIGFyZSBzZWxlY3RlZAotCQlMaXN0PE1ldGhvZFBhY2thZ2U+IHN5c1BhY2thZ2VzVG9BZGQgPSBuZXcgQXJyYXlMaXN0PE1ldGhvZFBhY2thZ2U+KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRwID0gcGx1Z2lucy5pdGVyYXRvcigpOyBpdHAuaGFzTmV4dCgpOykgewotCQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IChNZXRob2RQbHVnaW4pIGl0cC5uZXh0KCk7Ci0JCQlMaXN0IHBrZ3MgPSBUbmdVdGlsLmdldEFsbFN5c3RlbVBhY2thZ2VzKHBsdWdpbik7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gcGtncy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IHBrZyA9IGl0Lm5leHQoKTsKLQkJCQlpZiAoIXBrZ1NlbHMuY29udGFpbnMocGtnKSAmJiBwa2cgaW5zdGFuY2VvZiBNZXRob2RQYWNrYWdlKSB7Ci0JCQkJCXBrZ1NlbHMuYWRkKHBrZyk7Ci0JCQkJCXN5c1BhY2thZ2VzVG9BZGQuYWRkKChNZXRob2RQYWNrYWdlKXBrZyk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCUNvbmZpZ3VyYXRpb25VdGlsLmFkZENvbGxUb01ldGhvZFBhY2thZ2VMaXN0KGFjdGlvbk1nciwgY29uZmlnLCBzeXNQYWNrYWdlc1RvQWRkKTsKLQl9Ci0JCi0JLyoqCi0JICogZ2V0IGFsbCBjaGlsZCBwYWNrYWdlcyBvZiB0aGUgZ2l2ZW4gTWV0aG9kUGFja2FnZSBhbmQgYWRkIHRvIHRoZSBsaXN0Ci0JICogQHBhcmFtIHBrZyBNZXRob2RQYWNrYWdlCi0JICogQHBhcmFtIHJlc3VsdCBMaXN0IHRoZSBwYWNrYWdlcyBmb3VuZAotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgZ2V0QWxsQ2hpbGRQYWNrYWdlcyhNZXRob2RQYWNrYWdlIHBrZywgTGlzdCByZXN1bHQpIHsKLQkJTGlzdCBwa2dzID0gcGtnLmdldENoaWxkUGFja2FnZXMoKTsKLQkJCi0JCS8vIG9ubHkgYWRkIHVuaXF1ZSBpdGVtcwotCQlmb3IgKCBJdGVyYXRvciBpdCA9IHBrZ3MuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOyApIHsKLQkJCU9iamVjdCBwID0gaXQubmV4dCgpOwotCQkJaWYgKCAhcmVzdWx0LmNvbnRhaW5zKHApICkgewotCQkJCXJlc3VsdC5hZGQocCk7Ci0JCQl9Ci0JCX0KLQotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gcGtncy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlnZXRBbGxDaGlsZFBhY2thZ2VzKChNZXRob2RQYWNrYWdlKSBpdC5uZXh0KCksIHJlc3VsdCk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQWRkcyB0aGUgZ2l2ZW4gb2JqZWN0J3MgbWV0aG9kIHBhY2thZ2UgYW5kIHBsdWdpbiB0byB0aGUgZ2l2ZW4KLQkgKiBjb25maWd1cmF0aW9uIGlmIHRoZXkgYXJlIG5vdCBpbiB0aGUgY29uZmlndXJhdGlvbiB5ZXQuCi0JICogCi0JICogQHBhcmFtIGNvbmZpZwotCSAqIEBwYXJhbSBvYmplY3QKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gYWRkVG8oTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcsIEVPYmplY3Qgb2JqZWN0LAotCQkJU2V0IGFkZGVkT2JqZWN0cykgewotCQlNZXRob2RQYWNrYWdlIHBrZyA9IGdldE1ldGhvZFBhY2thZ2Uob2JqZWN0KTsKLQkJaWYgKHBrZyAhPSBudWxsKSB7Ci0JCQlpZiAoIWNvbmZpZy5nZXRNZXRob2RQYWNrYWdlU2VsZWN0aW9uKCkuY29udGFpbnMocGtnKSkgewotCQkJCWNvbmZpZy5nZXRNZXRob2RQYWNrYWdlU2VsZWN0aW9uKCkuYWRkKHBrZyk7Ci0JCQkJYWRkZWRPYmplY3RzLmFkZChwa2cpOwotCQkJCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSBVbWFVdGlsLmdldE1ldGhvZFBsdWdpbihwa2cpOwotCQkJCQotCQkJCS8vIDE1MDU1MiAtIFByb2Nlc3NlczogSWYgY29uZmlndXJhdGlvbiBpcyB1cGRhdGVkIGJ5IGl0c2VsZiBkdWUgdG8gYWN0aW9ucyBsaWtlIENQIGV4dGVuZGlpbmcgb3IgZGVlcCBjb3B5LCAKLQkJCQkvLyB0aGVyZSBpcyBhIHJlZnJlc2ggaXNzdWUuCi0JCQkJLy8gbWlzc2luZyB0aGUgIiEiIGhlcmUhCi0JCQkJaWYgKCFjb25maWcuZ2V0TWV0aG9kUGx1Z2luU2VsZWN0aW9uKCkuY29udGFpbnMocGx1Z2luKSkgewotCQkJCQljb25maWcuZ2V0TWV0aG9kUGx1Z2luU2VsZWN0aW9uKCkuYWRkKHBsdWdpbik7Ci0JCQkJCWFkZGVkT2JqZWN0cy5hZGQocGx1Z2luKTsKLQkJCQkKLQkJCQkJLy8gbmVlZCB0byB2YWxpZGF0ZSB0aGUgbWV0aG9kIGNvbmZpZ3VyYXRpb24gdG8gbWFrZSBzdXJlIGFsbCByZWxhdGVkIHN5c3RlbSBwYWNrYWdlcyBhcmUgc2VsZWN0ZWQuCi0JCQkJCS8vIG90aGVyd2lzZSB0aGUgY29uZmlndXJhdGlvbiBleHBsb3JlciB3aWxsIG5vdCB3b3JrCi0JCQkJCS8vIDE1MDU1MiAtIFByb2Nlc3NlczogSWYgY29uZmlndXJhdGlvbiBpcyB1cGRhdGVkIGJ5IGl0c2VsZiBkdWUgdG8gYWN0aW9ucyBsaWtlIENQIGV4dGVuZGlpbmcgb3IgZGVlcCBjb3B5LCB0aGVyZSBpcyBhIHJlZnJlc2ggaXNzdWUuCQkKLQkJCQkJdmFsaWRhdGVNZXRob2RDb25maWd1cmF0aW9uKG51bGwsIGNvbmZpZyk7Ci0JCQkJfQotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gYWRkVG9Db25maWd1cmF0aW9uKE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnLAotCQkJRU9iamVjdCBvYmplY3QsIFNldCBhZGRlZE9iamVjdHMpIHsKLQkJaW50IHNpemUgPSBhZGRlZE9iamVjdHMuc2l6ZSgpOwotCQlhZGRUbyhjb25maWcsIG9iamVjdCwgYWRkZWRPYmplY3RzKTsKLQotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgVmFyaWFiaWxpdHlFbGVtZW50KSB7Ci0JCQkvLyBhZGQgYWxsIHRoZSBiYXNlIGVsZW1lbnRzIGlmIHRoZXJlIGlzIGFueQotCQkJZm9yIChWYXJpYWJpbGl0eUVsZW1lbnQgYyA9ICgoVmFyaWFiaWxpdHlFbGVtZW50KSBvYmplY3QpCi0JCQkJCS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCk7IGMgIT0gbnVsbDsgYyA9IChWYXJpYWJpbGl0eUVsZW1lbnQpIGMKLQkJCQkJLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSkgewotCQkJCWFkZFRvKGNvbmZpZywgYywgYWRkZWRPYmplY3RzKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBhZGRlZE9iamVjdHMuc2l6ZSgpID4gc2l6ZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gZU9iagotCSAqIEBwYXJhbSBjb250ZXh0Ci0JICogICAgICAgICAgICB0aGUgPGNvZGU+b3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw8L2NvZGU+IHRoYXQgaXMgdG8gYmUKLQkgKiAgICAgICAgICAgIHVzZWQgdG8gcGFyZW50IGFueSBkaWFsb2dzIHdpdGggdGhlIHVzZXIsIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICogICAgICAgICAgICBpZiB0aGVyZSBpcyBubyBVSSBjb250ZXh0IChkZWNsYXJlZCBhcyBhbiA8Y29kZT5PYmplY3Q8L2NvZGU+Ci0JICogICAgICAgICAgICB0byBhdm9pZCBhbnkgZGlyZWN0IHJlZmVyZW5jZXMgb24gdGhlIFNXVCBjb21wb25lbnQpCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVN0YXR1cyBjaGVja0VkaXQoRU9iamVjdCBlT2JqLCBPYmplY3QgY29udGV4dCkgewotCQlpZiAoKChJbnRlcm5hbEVPYmplY3QpIGVPYmopLmVQcm94eVVSSSgpICE9IG51bGwpIHsKLQkJCS8vIHRoaXMgaXMgYSB1bnJlc29sdmVkIHByb3h5LCBkaXNhbGxvdyBlZGl0aW5nIGl0Ci0JCQkvLwotCQkJRU9iamVjdCBwcm94eSA9IGVPYmo7Ci0JCQlTdHJpbmcgdXJpID0gKChJbnRlcm5hbEVPYmplY3QpIHByb3h5KS5lUHJveHlVUkkoKS50b1N0cmluZygpOwotCQkJb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSSBjb250YWluZXJVUkkgPSBwcm94eS5lQ29udGFpbmVyKCkgIT0gbnVsbCA/IHByb3h5Ci0JCQkJCS5lQ29udGFpbmVyKCkuZVJlc291cmNlKCkuZ2V0VVJJKCkKLQkJCQkJOiBudWxsOwotCQkJU3RyaW5nIGxvY2F0aW9uOwotCQkJaWYgKGNvbnRhaW5lclVSSSAhPSBudWxsKSB7Ci0JCQkJbG9jYXRpb24gPSBjb250YWluZXJVUkkgIT0gbnVsbCAmJiBjb250YWluZXJVUkkuaXNGaWxlKCkgPyBjb250YWluZXJVUkkudG9GaWxlU3RyaW5nKCkKLQkJCQkJCTogIiI7IC8vJE5PTi1OTFMtMSQKLQkJCQlpZiAobG9jYXRpb24ubGVuZ3RoKCkgIT0gMCkgewotCQkJCQlsb2NhdGlvbiA9IE1lc3NhZ2VGb3JtYXQuZm9ybWF0KAotCQkJCQkJCSIgaW4gJyd7MH0nJyIsIG5ldyBPYmplY3RbXSB7IGxvY2F0aW9uIH0pOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlsb2NhdGlvbiA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlTdHJpbmcgbXNnID0gTWVzc2FnZUZvcm1hdC5mb3JtYXQoTGlicmFyeUVkaXRSZXNvdXJjZXMudW5yZXNvbHZlZE9iamVjdEVycm9yX3JlYXNvbgotCQkJCQksIG5ldyBPYmplY3RbXSB7IHByb3h5LmVDbGFzcygpLmdldE5hbWUoKSwgdXJpLCBsb2NhdGlvbiB9KTsKLQkJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCS5nZXRTeW1ib2xpY05hbWUoKSwgMCwgbXNnLCBudWxsKTsKLQkJfQkJCQkKLQkJCi0JCUlBY2Nlc3NDb250cm9sbGVyIGFjID0gU2VydmljZXMuZ2V0QWNjZXNzQ29udHJvbGxlcigpOwotCQlpZihhYyA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQkJfQotCQlyZXR1cm4gYWMuY2hlY2tNb2RpZnkoQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChlT2JqKSwgY29udGV4dCk7Ci0JfQotCQotCS8qKgotCSAqIENoZWNrIHRoZSBnaXZlbiBlbGVtZW50IGZvciBtb2RpZmlhYmxlCi0JICogCi0JICogQHBhcmFtIGUKLQkgKiBAdGhyb3dzIE1lc3NhZ2VFeGNlcHRpb24gaWYgdGhlIGVsZW1lbnQgY2Fubm90IGJlIG1vZGlmaWVkCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGNoZWNrTW9kaWZ5KEVPYmplY3QgZSkgewotCQlJQWNjZXNzQ29udHJvbGxlciBhYyA9IFNlcnZpY2VzLmdldEFjY2Vzc0NvbnRyb2xsZXIoKTsKLQkJaWYoYWMgIT0gbnVsbCkgewotCQkJSVN0YXR1cyBzdGF0dXMgPSBhYy5jaGVja01vZGlmeShDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KGUpLCBudWxsKTsKLQkJCWlmICghc3RhdHVzLmlzT0soKSkgewotCQkJCVN0cmluZyBtc2cgPSBVbWFVdGlsLmdldE1lc3NhZ2Uoc3RhdHVzKTsKLQkJCQlpZiAobXNnID09IG51bGwpIHsKLQkJCQkJT2JqZWN0IG9iajsKLQkJCQkJaWYoZS5lUmVzb3VyY2UoKS5nZXRVUkkoKS5pc0ZpbGUoKSkgewotCQkJCQkJb2JqID0gZS5lUmVzb3VyY2UoKS5nZXRVUkkoKS50b0ZpbGVTdHJpbmcoKTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCW9iaiA9IGU7IAotCQkJCQl9Ci0JCQkJCW1zZyA9IE1lc3NhZ2VGb3JtYXQuZm9ybWF0KFVtYVJlc291cmNlcy5lcnJfY2Fubm90TW9kaWZ5MCwKLQkJCQkJCQluZXcgT2JqZWN0W10geyBvYmogfSk7Ci0JCQkJfQotCQkJCXRocm93IG5ldyBNZXNzYWdlRXhjZXB0aW9uKG1zZyk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRNZXNzYWdlKElTdGF0dXMgc3RhdHVzKSB7Ci0JCVN0cmluZyBtc2cgPSBzdGF0dXMuZ2V0TWVzc2FnZSgpOwotCQlpZiAoc3RhdHVzLmlzTXVsdGlTdGF0dXMoKSkgewotCQkJU3RyaW5nQnVmZmVyIHN0ckJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIobXNnKTsKLQkJCUlTdGF0dXMgc3RhdHVzZXNbXSA9IHN0YXR1cy5nZXRDaGlsZHJlbigpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzdGF0dXNlcy5sZW5ndGg7IGkrKykgewotCQkJCXN0ckJ1Zi5hcHBlbmQoJ1xuJykuYXBwZW5kKHN0YXR1c2VzW2ldLmdldE1lc3NhZ2UoKSk7Ci0JCQl9Ci0JCQltc2cgPSBzdHJCdWYudG9TdHJpbmcoKTsKLQkJfQotCQlpZiAobXNnID09IG51bGwgfHwgbXNnLmxlbmd0aCgpID09IDApIHsKLQkJCW1zZyA9IExpYnJhcnlFZGl0UmVzb3VyY2VzLnV0aWxfdG5ndXRpbF9jYW5ub3RfZWRpdF9yZXNvdXJjZTsgCi0JCX0KLQkJcmV0dXJuIG1zZzsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNDb250cmlidXRvcihWYXJpYWJpbGl0eUVsZW1lbnQgZSkgewotCQlyZXR1cm4gZS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkgIT0gbnVsbAotCQkmJiAoZS5nZXRWYXJpYWJpbGl0eVR5cGUoKSA9PSBWYXJpYWJpbGl0eVR5cGUuQ09OVFJJQlVURVMpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNSZXBsYWNlcihWYXJpYWJpbGl0eUVsZW1lbnQgZSkgewotCQlyZXR1cm4gZS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkgIT0gbnVsbAotCQkmJiAoZS5nZXRWYXJpYWJpbGl0eVR5cGUoKSA9PSBWYXJpYWJpbGl0eVR5cGUuUkVQTEFDRVMpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNDb250cmlidXRvck9yUmVwbGFjZXIoVmFyaWFiaWxpdHlFbGVtZW50IGUpIHsKLQkJVmFyaWFiaWxpdHlFbGVtZW50IGJhc2UgPSBlLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsKLQkJVmFyaWFiaWxpdHlUeXBlIHR5cGUgPSBlLmdldFZhcmlhYmlsaXR5VHlwZSgpOwotCQlyZXR1cm4gYmFzZSAhPSBudWxsICYmICh0eXBlID09IFZhcmlhYmlsaXR5VHlwZS5DT05UUklCVVRFUyB8fCB0eXBlID09IFZhcmlhYmlsaXR5VHlwZS5SRVBMQUNFUyk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzR2VuZXJhbGl6ZXIoT2JqZWN0IG9iaiwgQ29sbGVjdGlvbiB0eXBlcykgewotCQlpZiAoIShvYmogaW5zdGFuY2VvZiBWYXJpYWJpbGl0eUVsZW1lbnQpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlWYXJpYWJpbGl0eUVsZW1lbnQgdmUgPSAoVmFyaWFiaWxpdHlFbGVtZW50KSBvYmo7Ci0JCWlmICh2ZS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJaWYgKHR5cGVzID09IG51bGwpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJcmV0dXJuIHR5cGVzLmNvbnRhaW5zKHZlLmdldFZhcmlhYmlsaXR5VHlwZSgpKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRUeXBlVGV4dChTdHJpbmcgdHlwZUtleSkgewotCQl0cnkgewotCQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfIiArIHR5cGVLZXkgKyAiX3R5cGUiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfVW5rbm93bl90eXBlIik7IC8vJE5PTi1OTFMtMSQJCQotCX0KLQotCS8qKgotCSAqIExvb2tzIHVwIHRoZSB1c2VyIGZyaWVuZGx5IHR5cGUgbmFtZSBmb3IgYSBNZXRob2QgZWxlbWVudC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRUeXBlVGV4dChFT2JqZWN0IGVsZW1lbnQpIHsKLQkJcmV0dXJuIGdldFR5cGVUZXh0KGVsZW1lbnQuZUNsYXNzKCkpOwotCX0KLQkKLQkvKioKLQkgKiBMb29rcyB1cCB0aGUgdXNlci1mcmllbmRseSB0eXBlIG5hbWUgZm9yIGEgZ2l2ZW4gdHlwZS4KLQkgKiAKLQkgKiBAcGFyYW0gdHlwZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRUeXBlVGV4dChFQ2xhc3MgdHlwZSkgewotCQlyZXR1cm4gZ2V0VHlwZVRleHQodHlwZS5nZXROYW1lKCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbG9va3MgdXAgdGhlIG5hbWUgb2YgdGhlIHNwZWNpZmllZCBmZWF0dXJlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEZlYXR1cmVUZXh0KE9iamVjdCBmZWF0dXJlKSB7Ci0JCWlmIChmZWF0dXJlIGluc3RhbmNlb2YgRVN0cnVjdHVyYWxGZWF0dXJlKSB7Ci0JCQlyZXR1cm4gZ2V0RmVhdHVyZVRleHQoKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgZmVhdHVyZSk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gIlVua25vd24iOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDaGVja3MgaWYgdGhlIGdpdmVuIG9iamVjdCBpcyBsb2NrZWQuIEFuIG9iamVjdCBpcyBjb25zaWRlcmVkIGxvY2tlZCBpZgotCSAqIGl0cyBNZXRob2RQbHVnaW4gaGFzIHRoZSBhdHRyaWJ1dGUgdXNlckNoYW5nZWFibGUgc2V0IHRvIGZhbHNlLiBUaGUKLQkgKiAnbG9ja2VkJyBzdGF0dXMgb2YgYW4gb2JqZWN0IGlzIGluZGVwZW5kZW50IGZyb20gJ3JlYWQtb25seScgc3RhdHVzIG9mCi0JICogaXRzIHJlc291cmNlIGZpbGUuCi0JICogCi0JICogQHBhcmFtIG9iamVjdAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNMb2NrZWQoRU9iamVjdCBvYmplY3QpIHsKLQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IFVtYVV0aWwuZ2V0TWV0aG9kUGx1Z2luKG9iamVjdCk7Ci0JCWlmIChwbHVnaW4gPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuICFwbHVnaW4uZ2V0VXNlckNoYW5nZWFibGUoKS5ib29sZWFuVmFsdWUoKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY2hlY2tFeGlzdChDb2xsZWN0aW9uIHdyYXBwZXJzLCBPYmplY3QgZSkgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gd3JhcHBlcnMuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGVsZW1lbnQgPSB1bndyYXAoaXRlcmF0b3IubmV4dCgpKTsKLQkJCWlmIChlbGVtZW50ID09IGUpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCS8qKgotCSAqIEdldHMgdGhlIGluZGV4IG9mIGVsZW1lbnQgb3IgaXRzIHdyYXBwZXIgaW4gdGhlIGdpdmVuIGxpc3QKLQkgKiBAcGFyYW0gbGlzdCBhIG1peGVkIGxpc3Qgb2YgZWxlbWVudCBhbmQgd3JhcHBlcgotCSAqIEBwYXJhbSBlCi0JICogQHJldHVybiAtMSBpZiB0aGUgZWxlbWVudCBvciBpdHMgd3JhcHBlciBjb3VsZCBub3QgYmUgZm91bmQgaW4gdGhlIGxpc3QKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBnZXRJbmRleE9mKExpc3QgbGlzdCwgT2JqZWN0IGUpIHsKLQkJaW50IHNpemUgPSBsaXN0LnNpemUoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gdW53cmFwKGxpc3QuZ2V0KGkpKTsKLQkJCWlmKGVsZW1lbnQgPT0gZSkgewotCQkJCXJldHVybiBpOwotCQkJfQotCQl9Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIEVTdHJ1Y3R1cmFsRmVhdHVyZSBnZXRDb250YWluaW5nRmVhdHVyZShPYmplY3Qgb2JqZWN0LAotCQkJQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyIGFkYXB0ZXIgPSAoSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyKSBhZGFwdGVyRmFjdG9yeQotCQkJCS5hZGFwdChvYmplY3QsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCWlmIChhZGFwdGVyID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJT2JqZWN0IHBhcmVudCA9IGFkYXB0ZXIuZ2V0UGFyZW50KG9iamVjdCk7Ci0JCWlmICghKHBhcmVudCBpbnN0YW5jZW9mIEVPYmplY3QpKQotCQkJcmV0dXJuIG51bGw7Ci0JCWFkYXB0ZXIgPSAoSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyKSBhZGFwdGVyRmFjdG9yeS5hZGFwdChwYXJlbnQsCi0JCQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJaWYgKGFkYXB0ZXIgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50SXRlbVByb3ZpZGVyKSB7Ci0JCQlFT2JqZWN0IHBhcmVudEVPYmogPSAoRU9iamVjdCkgcGFyZW50OwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gKChNZXRob2RFbGVtZW50SXRlbVByb3ZpZGVyKSBhZGFwdGVyKQotCQkJCQkuZ2V0Q2hpbGRyZW5GZWF0dXJlcyhwYXJlbnQpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmID0gKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgaXRlci5uZXh0KCk7Ci0JCQkJaWYgKGYuaXNNYW55KCkpIHsKLQkJCQkJaWYgKCgoQ29sbGVjdGlvbikgcGFyZW50RU9iai5lR2V0KGYpKS5jb250YWlucyhvYmplY3QpKSB7Ci0JCQkJCQlyZXR1cm4gZjsKLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCWlmIChwYXJlbnRFT2JqLmVHZXQoZikgPT0gb2JqZWN0KSB7Ci0JCQkJCQlyZXR1cm4gZjsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogTG9va3MgdXAgdGhlIHVzZXItZnJpZW5kbHkgbmFtZSBmb3IgYSBnaXZlbiBmZWF0dXJlLgotCSAqIAotCSAqIEBwYXJhbSBmZWF0dXJlCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEZlYXR1cmVUZXh0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZS5nZXRGZWF0dXJlSUQoKSkgewotCQkvLyBjYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19QRVJGT1JNRURfUFJJTUFSSUxZX0JZOgotCQkvLyByZXR1cm4gIlByaW1hcnkgUGVyZm9ybWVyIjsKLQkJLy8gY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fQURESVRJT05BTExZX1BFUkZPUk1FRF9CWToKLQkJLy8gcmV0dXJuICJTZWNvbmRhcnkgUGVyZm9ybWVyIjsKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fQVNTSVNURURfQlk6Ci0JCQlyZXR1cm4gTGlicmFyeUVkaXRSZXNvdXJjZXMuYXNzaXN0c190ZXh0OyAKLQkJfQotCi0JCVN0cmluZyBmZWF0dXJlS2V5OwotCQlpZiAoZmVhdHVyZSBpbnN0YW5jZW9mIEVTdHJ1Y3R1cmFsRmVhdHVyZSkgewotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlID0gKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgZmVhdHVyZTsKLQkJCWZlYXR1cmVLZXkgPSBlRmVhdHVyZS5nZXRFQ29udGFpbmluZ0NsYXNzKCkuZ2V0TmFtZSgpCi0JCQkJCSsgIl8iICsgZUZlYXR1cmUuZ2V0TmFtZSgpOyAvLyROT04tTkxTLTEkCi0JCX0gZWxzZSB7Ci0JCQlmZWF0dXJlS2V5ID0gTGlicmFyeUVkaXRSZXNvdXJjZXMudW5rbm93bl90ZXh0OyAKLQkJfQotCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCS5nZXRTdHJpbmcoIl9VSV8iICsgZmVhdHVyZUtleSArICJfZmVhdHVyZSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBnZXQgdGhlIGxpYnJhcnkgcm9vdCBwYXRoIGZvciB0aGUgZ2l2ZW4gZWxlbWVudCwgYXNzdW1pbmcgdGhlIGVsZW1lbnQgYW5kCi0JICogaXQncyBwYXJlbnRzIGFyZSBsb2FkZWQKLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqIEByZXR1cm4gRmlsZSB0aGUgcm9vdCBwYXRoIG9mIHRoZSBsaWJyYXJ5Ci0JICovCi0JcHVibGljIHN0YXRpYyBGaWxlIGdldExpYnJhcnlSb290UGF0aChFT2JqZWN0IGVsZW1lbnQpIHsKLQkJRU9iamVjdCBwYXJlbnQgPSBlbGVtZW50OwotCQl3aGlsZSAoKHBhcmVudCAhPSBudWxsKSAmJiAhKHBhcmVudCBpbnN0YW5jZW9mIE1ldGhvZExpYnJhcnkpKSB7Ci0JCQlwYXJlbnQgPSBwYXJlbnQuZUNvbnRhaW5lcigpOwotCQl9Ci0KLQkJaWYgKHBhcmVudCAhPSBudWxsICYmIHBhcmVudC5lUmVzb3VyY2UoKSAhPSBudWxsKSB7Ci0JCQlvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJIHVyaSA9IHBhcmVudC5lUmVzb3VyY2UoKS5nZXRVUkkoKTsKLQkJCVN0cmluZyBwYXRoID0gdXJpLnRvRmlsZVN0cmluZygpOwotCQkJRmlsZSBmID0gbmV3IEZpbGUocGF0aCk7Ci0JCQlyZXR1cm4gZi5nZXRQYXJlbnRGaWxlKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogZ2V0IHRoZSBmdWxsIHBhdGggVVJJIGJ5IGFwcGVuZGluZyB0aGUgcmVsYXRpdmUgcGF0aCBVUkkgdG8gdGhlIG9iamVjdCdzCi0JICogbGlicmFyeSBwYXRoCi0JICogCi0JICogQHBhcmFtIG8KLQkgKiAgICAgICAgICAgIEVPYmplY3QgdGhlIG9iamVjdCB0byBmaW5kIHRoZSBNZXRob2RMaWJyYXJ5LCBjYW4gYmUgYW55Ci0JICogICAgICAgICAgICBvYmplY3QgaW4gdGhlIGxpYnJhcnkKLQkgKiBAcGFyYW0gdXJpCi0JICogICAgICAgICAgICBUaGUgdXJpIHRvIGJlIGZpeGVkCi0JICogQHJldHVybiBVUkkgdGhlIGZ1bGwgcGF0aCB1cmkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFVSSSBnZXRGdWxsUGF0aFVSSShFT2JqZWN0IG8sIFVSSSB1cmkpIHsKLQkJaWYgKHVyaSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gdXJpOwotCQl9Ci0KLQkJLy8gdHJ5IGlmIHRoaXMgaXMgYSB2YWxpZCBVUkwgb3Igbm90Ci0JCXRyeSB7Ci0JCQlVUkwgdXJsID0gdXJpLnRvVVJMKCk7Ci0JCQlpZiAodXJsICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gdXJpOwotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCTsgLy8gbm90IGEgdmFsaWQgdXJsLCBtYXliZSBhIHJlbGF0aXZlIHBhdGgKLQkJfQotCi0JCS8vIG5lZWQgdG8gZ2V0IHRoZSBlbGVtZW50J3MgcmVzb3VyY2UgcGF0aAotCQlGaWxlIGYgPSBnZXRMaWJyYXJ5Um9vdFBhdGgobyk7Ci0JCWlmIChmICE9IG51bGwpIHsKLQkJCXJldHVybiBuZXcgRmlsZShmLCBOZXRVdGlsLmRlY29kZWRGaWxlVXJsKHVyaS50b1N0cmluZygpKSkudG9VUkkoKTsKLQkJfQotCi0JCXJldHVybiB1cmk7Ci0JfQotCi0JCi0JLyoqCi0JICogVG8gZ2V0IHRoZSBub2RlIGljb24vc2hhcGUgaWNvbiBmdWxsIHBhdGggVVJJIGJ5IGFwcGVuZGluZyB0aGUgcmVsYXRpdmUgcGF0aCBVUkkgdG8gdGhlIG9iamVjdCdzCi0JICogbGlicmFyeSBwYXRoCi0JICogCi0JICogQHBhcmFtIG8KLQkgKiAgICAgICAgICAgIEVPYmplY3QgdGhlIG9iamVjdCB0byBmaW5kIHRoZSBNZXRob2RMaWJyYXJ5LCBjYW4gYmUgYW55Ci0JICogICAgICAgICAgICBvYmplY3QgaW4gdGhlIGxpYnJhcnkKLQkgKiBAcGFyYW0gdXJpCi0JICogICAgICAgICAgICBUaGUgdXJpIHRvIGJlIGZpeGVkCi0JICogQHJldHVybiBVUkkgdGhlIGZ1bGwgcGF0aCB1cmkKLQkgKi8KLQkvL0ZJWE1FOiBtYWtlIHN0b3JhZ2UgaW5kZXBlbmRlbnQKLQlwdWJsaWMgc3RhdGljIFVSSSBnZXRGdWxsUGF0aG9mTm9kZW9yU2hhcGVJY29uVVJJKEVPYmplY3QgbywgVVJJIHVyaSkgewotCQlpZiAodXJpID09IG51bGwpIHsKLQkJCXJldHVybiB1cmk7Ci0JCX0KLQotCQkvLyB0cnkgaWYgdGhpcyBpcyBhIHZhbGlkIFVSTCBvciBub3QKLQkJdHJ5IHsKLQkJCVVSTCB1cmwgPSB1cmkudG9VUkwoKTsKLQkJCWlmICh1cmwgIT0gbnVsbCkgewotCQkJCXJldHVybiB1cmk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJOyAvLyBub3QgYSB2YWxpZCB1cmwsIG1heWJlIGEgcmVsYXRpdmUgcGF0aAotCQl9Ci0KLQkJLy8gbmVlZCB0byBnZXQgdGhlIGVsZW1lbnQncyByZXNvdXJjZSBwYXRoCi0JCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSBVbWFVdGlsLmdldE1ldGhvZFBsdWdpbihvKTsKLQkJaWYgKHBsdWdpbiAhPSBudWxsICYmIFVtYVV0aWwuaGFzRGlyZWN0UmVzb3VyY2UocGx1Z2luKSkgewotCQkJRmlsZSBmID0gZ2V0TGlicmFyeVJvb3RQYXRoKG8pOwotCQkJU3RyaW5nIHBhdGggPSB1cmkuZ2V0UGF0aCgpOwotCQkJaWYgKGYgIT0gbnVsbCAmJiBwYXRoLmluZGV4T2YocGx1Z2luLmdldE5hbWUoKSArICIvIikgPT0gMCkgeyAvLyROT04tTkxTLTEkCi0JCQkJcmV0dXJuIG5ldyBGaWxlKGYsIE5ldFV0aWwuZGVjb2RlZEZpbGVVcmwodXJpLnRvU3RyaW5nKCkpKQotCQkJCQkJLnRvVVJJKCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlJRmlsZUJhc2VkTGlicmFyeVBlcnNpc3RlciBwZXJzaXN0ZXIgPSAoSUZpbGVCYXNlZExpYnJhcnlQZXJzaXN0ZXIpIFNlcnZpY2VzCi0JCQkJCQkuZ2V0TGlicmFyeVBlcnNpc3RlcihTZXJ2aWNlcy5YTUlfUEVSU0lTVEVOQ0VfVFlQRSk7Ci0JCQkJRmlsZSBwbHVnaW5EaXIgPSBwZXJzaXN0ZXIuZ2V0RmlsZShwbHVnaW4uZVJlc291cmNlKCkpCi0JCQkJCQkuZ2V0UGFyZW50RmlsZSgpOwotCi0JCQkJcmV0dXJuIG5ldyBGaWxlKHBsdWdpbkRpciwgTmV0VXRpbC5kZWNvZGVkRmlsZVVybCh1cmkKLQkJCQkJCS50b1N0cmluZygpKSkudG9VUkkoKTsKLQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkvKioKLQkgKiBAcGFyYW0gZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0b1N0YWNrVHJhY2VTdHJpbmcoVGhyb3dhYmxlIGUpIHsKLQkJU3RyaW5nV3JpdGVyIHN0cldyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLQkJZS5wcmludFN0YWNrVHJhY2UobmV3IFByaW50V3JpdGVyKHN0cldyaXRlcikpOwotCQlyZXR1cm4gc3RyV3JpdGVyLnRvU3RyaW5nKCk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldExhYmVsV2l0aFBhdGgoT2JqZWN0IG9iamVjdCkgewotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudCkgewotCQkJcmV0dXJuIFByb2Nlc3NVdGlsLmdldExhYmVsV2l0aFBhdGgoKEJyZWFrZG93bkVsZW1lbnQpIG9iamVjdCk7Ci0JCX0KLQotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgQ29udGVudERlc2NyaXB0aW9uKSB7Ci0JCQlyZXR1cm4gZ2V0TGFiZWxXaXRoUGF0aCgoKENvbnRlbnREZXNjcmlwdGlvbikgb2JqZWN0KS5lQ29udGFpbmVyKCkpOwotCQl9Ci0KLQkJaWYob2JqZWN0IGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJTWV0aG9kRWxlbWVudCBtZSA9IChNZXRob2RFbGVtZW50KSBvYmplY3Q7Ci0JCQlDb2xsZWN0aW9uPE5hbWVkRWxlbWVudD4gaXRlbVBhdGggPSBNaXNjLmdldE9iamVjdFRyZWVSZWxhdGl2ZVRvUGx1Z2luKG1lKTsKLQkJCVN0cmluZ0J1ZmZlciBwYXRoID0gbmV3IFN0cmluZ0J1ZmZlcihnZXRMYWJlbChvYmplY3QsIG1lLmdldEd1aWQoKSkpOwotCQkJaWYgKE1ldGhvZEVsZW1lbnRVdGlsLmdldE1ldGhvZE1vZGVsKG9iamVjdCkgIT0gbnVsbCkgewotCQkJCXBhdGgKLQkJCQkuYXBwZW5kKCIsICIpLmFwcGVuZChNZXRob2RFbGVtZW50VXRpbC5nZXRNZXRob2RNb2RlbChvYmplY3QpLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQlmb3IgKEl0ZXJhdG9yPE5hbWVkRWxlbWVudD4gaXRlciA9IGl0ZW1QYXRoLml0ZXJhdG9yKCk7aXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCU5hbWVkRWxlbWVudCBlID0gaXRlci5uZXh0KCk7Ci0JCQkJCVN0cmluZyBzID0gU3RyaW5nLnZhbHVlT2YoZS5nZXROYW1lKCkpOwotCi0JCQkJCWlmIChNb2RlbFN0cnVjdHVyZS5DT1JFX0NPTlRFTlRfUEFDQUtHRV9OQU1FLmVxdWFscyhzKSB8fCBNb2RlbFN0cnVjdHVyZS5DT05URU5UX1BBQ0tBR0VfTkFNRS5lcXVhbHNJZ25vcmVDYXNlKHMpCi0JCQkJCQkJfHwgKCgoTmFtZWRFbGVtZW50KSBvYmplY3QpLmVxdWFscyhlKSkpIHsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCXBhdGguYXBwZW5kKCcvJykuYXBwZW5kKHMpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIHBhdGgudG9TdHJpbmcoKTsKLQkJfQotCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIEVPYmplY3QgZ2V0T3duZXIoQ29tbWFuZCBjb21tYW5kKSB7Ci0JCWNvbW1hbmQgPSBUbmdVdGlsLnVud3JhcChjb21tYW5kKTsKLQkJRU9iamVjdCBvd25lciA9IG51bGw7Ci0JCWlmIChjb21tYW5kIGluc3RhbmNlb2YgQWRkQ29tbWFuZCkgewotCQkJb3duZXIgPSAoKEFkZENvbW1hbmQpIGNvbW1hbmQpLmdldE93bmVyKCk7Ci0JCX0gZWxzZSBpZiAoY29tbWFuZCBpbnN0YW5jZW9mIFJlbW92ZUNvbW1hbmQpIHsKLQkJCW93bmVyID0gKChSZW1vdmVDb21tYW5kKSBjb21tYW5kKS5nZXRPd25lcigpOwotCQl9IGVsc2UgaWYgKGNvbW1hbmQgaW5zdGFuY2VvZiBTZXRDb21tYW5kKSB7Ci0JCQlvd25lciA9ICgoU2V0Q29tbWFuZCkgY29tbWFuZCkuZ2V0T3duZXIoKTsKLQkJfSBlbHNlIGlmIChjb21tYW5kIGluc3RhbmNlb2YgTW92ZUNvbW1hbmQpIHsKLQkJCW93bmVyID0gKChNb3ZlQ29tbWFuZCkgY29tbWFuZCkuZ2V0T3duZXIoKTsKLQkJfSBlbHNlIGlmIChjb21tYW5kIGluc3RhbmNlb2YgUGFzdGVGcm9tQ2xpcGJvYXJkQ29tbWFuZCkgewotCQkJT2JqZWN0IG8gPSAoKFBhc3RlRnJvbUNsaXBib2FyZENvbW1hbmQpIGNvbW1hbmQpLmdldE93bmVyKCk7Ci0JCQlpZiAobyBpbnN0YW5jZW9mIEVPYmplY3QpIHsKLQkJCQlvd25lciA9IChFT2JqZWN0KSBvOwotCQkJfQotCQl9Ci0JCXJldHVybiBvd25lcjsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBTZXQ8UmVzb3VyY2U+IGdldE1vZGlmaWVkUmVzb3VyY2VzKENvbW1hbmQgY21kKSB7Ci0JCVNldDxSZXNvdXJjZT4gbW9kaWZpZWRSZXNvdXJjZXMgPSBuZXcgSGFzaFNldDxSZXNvdXJjZT4oKTsKLQkJY29sbGVjdE1vZGlmaWVkUmVzb3VyY2VzKGNtZCwgbW9kaWZpZWRSZXNvdXJjZXMpOwotCQlyZXR1cm4gbW9kaWZpZWRSZXNvdXJjZXM7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBjb2xsZWN0TW9kaWZpZWRSZXNvdXJjZXMoQ29tbWFuZCBjb21tYW5kLCBTZXQ8UmVzb3VyY2U+IG1vZGlmaWVkUmVzb3VyY2VzKSB7Ci0JCWlmIChjb21tYW5kIGluc3RhbmNlb2YgSVJlc291cmNlQXdhcmVDb21tYW5kKSB7Ci0JCQltb2RpZmllZFJlc291cmNlcy5hZGRBbGwoKChJUmVzb3VyY2VBd2FyZUNvbW1hbmQpIGNvbW1hbmQpCi0JCQkJCS5nZXRNb2RpZmllZFJlc291cmNlcygpKTsKLQkJfSAKLQkJZWxzZSBpZihjb21tYW5kIGluc3RhbmNlb2YgQ29tcG91bmRDb21tYW5kKXsKLQkJCUxpc3QgY29tbWFuZExpc3QgPSAoKENvbXBvdW5kQ29tbWFuZCljb21tYW5kKS5nZXRDb21tYW5kTGlzdCgpOwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gY29tbWFuZExpc3QuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJY29sbGVjdE1vZGlmaWVkUmVzb3VyY2VzKChDb21tYW5kKSBpdGVyLm5leHQoKSwgbW9kaWZpZWRSZXNvdXJjZXMpOwkJCQkKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCUVPYmplY3QgbW9kaWZpZWQgPSBUbmdVdGlsLmdldE93bmVyKGNvbW1hbmQpOwotCQkJaWYobW9kaWZpZWQgIT0gbnVsbCkgewotCQkJCVJlc291cmNlIHJlc291cmNlID0gbW9kaWZpZWQuZVJlc291cmNlKCk7Ci0JCQkJaWYocmVzb3VyY2UgIT0gbnVsbCkgewotCQkJCQltb2RpZmllZFJlc291cmNlcy5hZGQocmVzb3VyY2UpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgTGlzdCBjb252ZXJ0R3VpZGFuY2VBdHRhY2htZW50c1RvTGlzdChTdHJpbmcgYXR0YWNobWVudFN0cmluZykgewotCQlBcnJheUxpc3QgYXR0YWNobWVudHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWlmIChhdHRhY2htZW50U3RyaW5nID09IG51bGwpCi0JCQlhdHRhY2htZW50U3RyaW5nID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIGZpbGVzW10gPSBhdHRhY2htZW50U3RyaW5nCi0JCQkJLnNwbGl0KEdVSURBTkNFX0ZJTEVTVFJJTkdfU0VQQVJBVE9SX1NQTElUVEVSKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykgewotCQkJaWYgKGZpbGVzW2ldLnRyaW0oKS5sZW5ndGgoKSA+IDApCi0JCQkJYXR0YWNobWVudHMuYWRkKGZpbGVzW2ldKTsKLQkJfQotCQlyZXR1cm4gYXR0YWNobWVudHM7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29udmVydEd1aWRhbmNlQXR0YWNobWVudHNUb1N0cmluZyhMaXN0IGF0dGFjaG1lbnRMaXN0KSB7Ci0JCVN0cmluZyBhdHRhY2htZW50U3RyaW5nID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJaW50IGkgPSAwOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBhdHRhY2htZW50TGlzdC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCVN0cmluZyBhdHRhY2htZW50ID0gKFN0cmluZykgaXRlci5uZXh0KCk7Ci0JCQlpZiAoaSsrID4gMCkKLQkJCQlhdHRhY2htZW50U3RyaW5nID0gYXR0YWNobWVudFN0cmluZwotCQkJCQkJLmNvbmNhdChHVUlEQU5DRV9GSUxFU1RSSU5HX1NFUEFSQVRPUik7Ci0JCQlhdHRhY2htZW50U3RyaW5nID0gYXR0YWNobWVudFN0cmluZy5jb25jYXQoYXR0YWNobWVudCk7Ci0JCX0KLQkJcmV0dXJuIGF0dGFjaG1lbnRTdHJpbmc7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgTGlzdDxTdHJpbmc+IGNvbnZlcnRTdHJpbmdzVG9MaXN0KFN0cmluZyBzdHJpbmcpIHsKLQkJQXJyYXlMaXN0PFN0cmluZz4gc3RyTGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlpZiAoc3RyaW5nID09IG51bGwpCi0JCQlzdHJpbmcgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgc3RyaW5nc1tdID0gc3RyaW5nCi0JCQkJLnNwbGl0KENPTU1BX1NFUEFSQVRPUl9TUExJVFRFUik7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc3RyaW5ncy5sZW5ndGg7IGkrKykgewotCQkJaWYgKHN0cmluZ3NbaV0udHJpbSgpLmxlbmd0aCgpID4gMCkKLQkJCQlzdHJMaXN0LmFkZChzdHJpbmdzW2ldLnRyaW0oKSk7Ci0JCX0KLQkJcmV0dXJuIHN0ckxpc3Q7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29udmVydExpc3RUb1N0cmluZyhMaXN0PFN0cmluZz4gc3RyTGlzdCkgewotCQlTdHJpbmcgc3RyaW5nID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJaW50IGkgPSAwOwotCQlpZiAoc3RyTGlzdCAhPSBudWxsKSB7Ci0JCQlmb3IgKFN0cmluZyBhU3RyaW5nOiBzdHJMaXN0KSB7Ci0JCQkJaWYgKGkrKyA+IDApCi0JCQkJCXN0cmluZyA9IHN0cmluZwotCQkJCQkJCS5jb25jYXQoQ09NTUFfU0VQQVJBVE9SKTsKLQkJCQlzdHJpbmcgPSBzdHJpbmcuY29uY2F0KGFTdHJpbmcpOwotCQkJfQotCQl9Ci0JCXJldHVybiBzdHJpbmc7Ci0JfQotCi0JCi0JLyoqCi0JICogCi0JICogQHBhcmFtIGUKLQkgKiBAcmV0dXJuIHRydWUgaWZmIHRoZSBNZXRob2RFbGVtZW50IGlzIGFsbG93ZWQgYW4gYXR0YWNobWVudC4gIEN1cnJlbnRseSwgb25seQotCSAqIEV4YW1wbGUsIFJlc3VhYmxlQXNzZXQsIFRlbXBsYXRlLCAgV2hpdGVwYXBlciBhcmUgYWxsb3dlZCBhdHRhY2htZW50cwotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0FsbG93ZWRBdHRhY2htZW50cyhNZXRob2RFbGVtZW50IGUpIHsKLQkJaWYgKGUgPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWlmIChlIGluc3RhbmNlb2YgRXhhbXBsZSkKLQkJCXJldHVybiB0cnVlOwotCQlpZiAoZSBpbnN0YW5jZW9mIFJldXNhYmxlQXNzZXQpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJaWYgKGUgaW5zdGFuY2VvZiBUZW1wbGF0ZSkKLQkJCXJldHVybiB0cnVlOwotCQlpZiAoZSBpbnN0YW5jZW9mIFdoaXRlcGFwZXIpCi0JCQlyZXR1cm4gdHJ1ZTsKLQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQ2hlY2tzIGlmIHRoZSBnaXZlbiA8Y29kZT5lbGVtZW50czwvY29kZT4gY29udGFpbnMgPGNvZGU+ZTwvY29kZT4gb3IgaGFzIGEgd3JhcHBlciBvZiA8Y29kZT5lPC9jb2RlPgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50cwotCSAqIEBwYXJhbSBlCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjb250YWlucyhDb2xsZWN0aW9uIGVsZW1lbnRzLCBPYmplY3QgZSkgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBlbGVtZW50cy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gaXRlci5uZXh0KCk7Ci0JCQlpZihlbGVtZW50ID09IGUgfHwgZSA9PSB1bndyYXAoZWxlbWVudCkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCS8qKgotCSAqIENoZWNrcyBpZiB0aGUgZ2l2ZW4gQ3VzdG9tQ2F0ZWdvcnkgaXMgYW4gYW5jZXN0b3Igb2YgdGhlIGdpdmVuIERlc2NpYmFibGVFbGVtZW50Ci0JICogCi0JICogQHBhcmFtIGNjCi0JICogQHBhcmFtIGUKLQkgKiBAcmV0dXJuCi0JICogQGRlcHJlY2F0ZWQgbW92ZWQgdG8ge0BsaW5rIERlcGVuZGVuY3lDaGVja2VyI2lzQW5jZXNzb3JPZihDdXN0b21DYXRlZ29yeSwgRGVzY3JpYmFibGVFbGVtZW50KX0KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNBbmNlc3Nvck9mKEN1c3RvbUNhdGVnb3J5IGNjLCBEZXNjcmliYWJsZUVsZW1lbnQgZSkgewotCQlyZXR1cm4gRGVwZW5kZW5jeUNoZWNrZXIuaXNBbmNlc3Nvck9mKGNjLCBlKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlZnJlc2hQYXJlbnRJZk5hbWVDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24sIEl0ZW1Qcm92aWRlckFkYXB0ZXIgYWRhcHRlcikgewotCQlpZihub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKSBpbnN0YW5jZW9mIENvbnRlbnRFbGVtZW50KSB7Ci0JCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoRGVzY3JpYmFibGVFbGVtZW50LmNsYXNzKSkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkRFU0NSSUJBQkxFX0VMRU1FTlRfX05BTUU6Ci0JCQkJaWYoUHJlc2VudGF0aW9uQ29udGV4dC5JTlNUQU5DRS5pc1Nob3dQcmVzZW50YXRpb25OYW1lcygpKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFVtYVBhY2thZ2UuREVTQ1JJQkFCTEVfRUxFTUVOVF9fUFJFU0VOVEFUSU9OX05BTUU6Ci0JCQkJaWYoIVByZXNlbnRhdGlvbkNvbnRleHQuSU5TVEFOQ0UuaXNTaG93UHJlc2VudGF0aW9uTmFtZXMoKSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZiAoIG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoTmFtZWRFbGVtZW50LmNsYXNzKSAhPSBVbWFQYWNrYWdlLk5BTUVEX0VMRU1FTlRfX05BTUUgKXsKLQkJCXJldHVybjsKLQkJfQotCQkvLyBuYW1lIGNoYW5nZSBtaWdodCBjaGFuZ2UgdGhlIGVsZW1lbnQncyBvcmRlciBpbiB0aGUgc29ydGVkIGxpc3QKLQkJLy8gcmVmcmVzaCB0aGUgcGFyZW50IGNvbnRlbnQgdG8gcmVzb3J0IHRoZSBlbGVtZW50IGxpc3QKLQkJLy8KLQkJYWRhcHRlci5maXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgYWRhcHRlci5nZXRQYXJlbnQobm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCkpLCB0cnVlLCBmYWxzZSkpOwotCX0JCi0JCi0JLyoqCi0JICogQ2hlY2tzIGlmIHRoZSBnaXZlbiBlbGVtZW50IDxjb2RlPmU8L2NvZGU+IGlzIGEgY29udHJpYnV0b3Igb2YgdGhlIGdpdmVuIDxjb2RlPmJhc2U8L2NvZGU+Ci0JICogQHBhcmFtIGJhc2UKLQkgKiBAcGFyYW0gZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNDb250cmlidXRvck9mKE9iamVjdCBiYXNlLCBWYXJpYWJpbGl0eUVsZW1lbnQgZSkgewotCQlmb3IoVmFyaWFiaWxpdHlFbGVtZW50IHZlID0gKFZhcmlhYmlsaXR5RWxlbWVudCkgZTsKLQkJdmUgIT0gbnVsbCAmJiB2ZS5nZXRWYXJpYWJpbGl0eVR5cGUoKSA9PSBWYXJpYWJpbGl0eVR5cGUuQ09OVFJJQlVURVMgJiYgdmUuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpICE9IG51bGw7Ci0JCXZlID0gdmUuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpKSB7Ci0JCQlpZih2ZS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkgPT0gYmFzZSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLS8vCS8qKgotLy8JICogQ2hlY2tzIGlmIHRoZSBnaXZlbiBwYXJlbnQgY29udGFpbnMgdGhlIGdpdmVuIGNoaWxkLCBlaXRoZXIgdmlhIGNvbnRhaW5tZW50IG9yIGNvbnRyaWJ1dGlvbgotLy8JICogQHBhcmFtIHBhcmVudAotLy8JICogQHBhcmFtIGNoaWxkCi0vLwkgKiBAcmV0dXJuCi0vLwkgKi8KLS8vCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0NvbnRhaW5lZEJ5KEFydGlmYWN0IHBhcmVudCwgQXJ0aWZhY3QgY2hpbGQpIHsKLS8vCQlFT2JqZWN0IGNvbnRhaW5lciA9IGNoaWxkLmVDb250YWluZXIoKTsKLS8vCQlpZihjb250YWluZXIgaW5zdGFuY2VvZiBBcnRpZmFjdCkgewotLy8JCQlBcnRpZmFjdCBjdXJyZW50UGFyZW50ID0gKEFydGlmYWN0KWNvbnRhaW5lcjsKLS8vCQkJaWYoY29udGFpbmVyID09IHBhcmVudCB8fCBpc0NvbnRyaWJ1dG9yT2YocGFyZW50LCBjdXJyZW50UGFyZW50KSkgewotLy8JCQkJcmV0dXJuIHRydWU7Ci0vLwkJCX0KLS8vCQkJSXRlcmF0b3IgaXRlciA9IG5ldyBBYnN0cmFjdFRyZWVJdGVyYXRvcihwYXJlbnQsIGZhbHNlKSB7Ci0vLwkJCQkKLS8vCQkJCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotLy8JCQkJCi0vLwkJCQlwcm90ZWN0ZWQgSXRlcmF0b3IgZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotLy8JCQkJCXJldHVybiAoKEFydGlmYWN0KW9iamVjdCkuZ2V0Q29udGFpbmVkQXJ0aWZhY3RzKCkuaXRlcmF0b3IoKTsKLS8vCQkJCX0KLS8vCQkJCQotLy8JCQl9OwotLy8JCQl3aGlsZShpdGVyLmhhc05leHQoKSkgewotLy8JCQkJT2JqZWN0IG8gPSBpdGVyLm5leHQoKTsKLS8vCQkJCWlmKG8gPT0gY3VycmVudFBhcmVudCB8fCBpc0NvbnRyaWJ1dG9yT2YobywgY3VycmVudFBhcmVudCkpIHsKLS8vCQkJCQlyZXR1cm4gdHJ1ZTsKLS8vCQkJCX0KLS8vCQkJfQotLy8JCQlyZXR1cm4gZmFsc2U7Ci0vLwkJfQotLy8JCWVsc2UgewotLy8JCQlyZXR1cm4gVW1hVXRpbC5pc0NvbnRhaW5lZEJ5KGNoaWxkLCBwYXJlbnQpOwotLy8JCX0KLS8vCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgZ2V0Q29uZmlndXJhdGlvbnNUb1VwZGF0ZShNZXRob2RQYWNrYWdlIHBhcmVudCwgTWV0aG9kUGFja2FnZSBwa2csIENvbGxlY3Rpb24gY29uZmlnc1RvVXBkYXRlKSB7Ci0JCU9iamVjdCBjb25maWdzID0gKChNdWx0aVJlc291cmNlRU9iamVjdCkgcGFyZW50KQotCQkuZ2V0T3Bwb3NpdGVGZWF0dXJlVmFsdWUoQXNzb2NpYXRpb25IZWxwZXIuTWV0aG9kUGFja2FnZV9NZXRob2RDb25maWd1cmF0aW9ucyk7Ci0JCWlmIChjb25maWdzIGluc3RhbmNlb2YgTGlzdCkgewotCQkJZm9yIChJdGVyYXRvciBpdGNvbmZpZyA9ICgoTGlzdCkgY29uZmlncykuaXRlcmF0b3IoKTsgaXRjb25maWcKLQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSAoTWV0aG9kQ29uZmlndXJhdGlvbikgaXRjb25maWcKLQkJCQkubmV4dCgpOwotCQkJCUxpc3QgcGtncyA9IGNvbmZpZy5nZXRNZXRob2RQYWNrYWdlU2VsZWN0aW9uKCk7Ci0JCQkJaWYgKCFwa2dzLmNvbnRhaW5zKHBrZykpIHsKLQkJCQkJY29uZmlnc1RvVXBkYXRlLmFkZChjb25maWcpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkKLQkvKioKLQkgKiBDaGVja3MgaWYgdGhlIGdpdmVuIG9iamVjdCBjYW4gYmUgZXN0aW1hdGVkCi0JICogCi0JICogQHBhcmFtIG8KLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNhbkVzdGltYXRlKE9iamVjdCBvKSB7Ci0JCXJldHVybiBvIGluc3RhbmNlb2YgVGFzayB8fCBvIGluc3RhbmNlb2YgV29ya0JyZWFrZG93bkVsZW1lbnQ7Ci0JfQotCQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBkZWJ1Z1Nob3dBbGwoKSB7Ci0JCUlMaWJyYXJ5SW5zcGVjdG9yIGluc3BlY3RvciA9IGdldExpYnJhcnlJbnNwZWN0b3IoKTsKLQkJaWYgKGluc3BlY3RvciAhPSBudWxsKSB7Ci0JCQlpbnNwZWN0b3Iuc2hvd0FsbENvbnRlbnRzKCk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIGRlYnVnU2hvd0FsbChNZXRob2RMaWJyYXJ5IGxpYikgewotCQlJTGlicmFyeUluc3BlY3RvciBpbnNwZWN0b3IgPSBnZXRMaWJyYXJ5SW5zcGVjdG9yKCk7Ci0JCWlmIChpbnNwZWN0b3IgIT0gbnVsbCkgewotCQkJaW5zcGVjdG9yLnNob3dBbGxDb250ZW50cyhsaWIpOwotCQl9Ci0JfQotCQotCS8vVXNlZCBmb3IgZGVidWcgb25seQotCXB1YmxpYyBzdGF0aWMgSUxpYnJhcnlJbnNwZWN0b3IgZ2V0TGlicmFyeUluc3BlY3RvcigpIHsKLQkJcmV0dXJuIChJTGlicmFyeUluc3BlY3RvcikgRXh0ZW5zaW9uTWFuYWdlci5nZXRFeHRlbnNpb24oIm9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQiLCAibGlicmFyeUluc3BlY3RvciIpOyAJCQkvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzSW5QbHVnaW5XaXRoTGVzc1RoYW5PbmVTdXBlckN1c3RvbUNhdGVnb3J5KEN1c3RvbUNhdGVnb3J5IGNjLCBNZXRob2RQbHVnaW4gcGx1Z2luKSB7Ci0JCWlmKFVtYVV0aWwuZ2V0TWV0aG9kUGx1Z2luKGNjKSAhPSBwbHVnaW4pIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlMaXN0IGxpc3QgPSBBc3NvY2lhdGlvbkhlbHBlci5nZXRDdXN0b21DYXRlZ29yaWVzKGNjKTsKLQkJaW50IGNvdW50ID0gMDsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gbGlzdC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKSAmJiBjb3VudCA8IDI7KSB7Ci0JCQlDdXN0b21DYXRlZ29yeSBjYXQgPSAoQ3VzdG9tQ2F0ZWdvcnkpIGl0ZXIubmV4dCgpOwotCQkJaWYoVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4oY2F0KSA9PSBwbHVnaW4pIHsKLQkJCQljb3VudCsrOwotCQkJfQkJCQkJCQotCQl9Ci0JCXJldHVybiBjb3VudCA8IDI7Ci0JfQotCi0JLyoqCi0JICogQ2hlY2sgaWYgdGhlIGdpdmVuIHdyYXBwZXIgaXMgdW5kZXIgYSBjdXN0b20gY2F0ZWdvcnkgdHJlZQotCSAqIAotCSAqIEBwYXJhbSBpdGVtCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1VuZGVyQ3VzdG9tQ2F0ZWdvcnlUcmVlKElXcmFwcGVySXRlbVByb3ZpZGVyIHdyYXBwZXIpIHsKLQkJZG8gewotCQkJT2JqZWN0IG93bmVyID0gd3JhcHBlci5nZXRPd25lcigpOwotCQkJaWYodW53cmFwKG93bmVyKSBpbnN0YW5jZW9mIEN1c3RvbUNhdGVnb3J5KSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCQl3cmFwcGVyID0gb3duZXIgaW5zdGFuY2VvZiBJV3JhcHBlckl0ZW1Qcm92aWRlciA/IChJV3JhcHBlckl0ZW1Qcm92aWRlcikgb3duZXIgOiBudWxsOwotCQl9IHdoaWxlKHdyYXBwZXIgIT0gbnVsbCk7Ci0JCQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgQ29sbGVjdGlvbiBnZXRFeGNsdXNpdmVTdWJDdXN0b21DYXRlZ29yaWVzKEN1c3RvbUNhdGVnb3J5IGNjKSB7Ci0JCUFycmF5TGlzdCBjb2xsZWN0aW9uID0gbmV3IEFycmF5TGlzdCgpOwotCQljb2xsZWN0RXhjbHVzaXZlU3ViQ3VzdG9tQ2F0ZWdvcmllcyhjb2xsZWN0aW9uLCBjYywgVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4oY2MpKTsKLQkJcmV0dXJuIGNvbGxlY3Rpb247Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIHZvaWQgY29sbGVjdEV4Y2x1c2l2ZVN1YkN1c3RvbUNhdGVnb3JpZXMoQ29sbGVjdGlvbiBjb2xsZWN0aW9uLCBDdXN0b21DYXRlZ29yeSBjYywgTWV0aG9kUGx1Z2luIHBsdWdpbikgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjYy5nZXRDYXRlZ29yaXplZEVsZW1lbnRzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZSA9IChPYmplY3QpIGl0ZXIubmV4dCgpOwotCQkJaWYoZSBpbnN0YW5jZW9mIEN1c3RvbUNhdGVnb3J5KSB7Ci0JCQkJQ3VzdG9tQ2F0ZWdvcnkgc3ViID0gKEN1c3RvbUNhdGVnb3J5KSBlOwotCQkJCWlmKGlzSW5QbHVnaW5XaXRoTGVzc1RoYW5PbmVTdXBlckN1c3RvbUNhdGVnb3J5KHN1YiwgcGx1Z2luKSkgewotCQkJCQljb2xsZWN0aW9uLmFkZChlKTsKLQkJCQkJY29sbGVjdEV4Y2x1c2l2ZVN1YkN1c3RvbUNhdGVnb3JpZXMoY29sbGVjdGlvbiwgc3ViLCBwbHVnaW4pOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIE9iamVjdCBnZXRBZGFwdGVyQnlUeXBlKE5vdGlmaWVyIG5vdGlmaWVyLCBPYmplY3QgdHlwZSkgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBub3RpZmllci5lQWRhcHRlcnMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCUFkYXB0ZXIgYWRhcHRlciA9IChBZGFwdGVyKSBpdGVyLm5leHQoKTsKLQkJCWlmKGFkYXB0ZXIuaXNBZGFwdGVyRm9yVHlwZSh0eXBlKSkgewotCQkJCXJldHVybiBhZGFwdGVyOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZXMgYWxsIHJlZmVyZW5jZXMgdG8gYSBtZXRob2QgZWxlbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqICAgICAgICAgICAgYSBtZXRob2QgZWxlbWVudAotCSAqIEByZXR1cm4gYSBtYXAgY29udGFpbmluZyB0aGUgcmVtb3ZlZCByZWZlcmVuY2VzCi0JICovCi0JcHVibGljIHN0YXRpYyBNYXAgcmVtb3ZlUmVmZXJlbmNlcyhNZXRob2RFbGVtZW50IGVsZW1lbnQpIHsKLQkJcmV0dXJuIFRuZ1V0aWwucmVtb3ZlUmVmZXJlbmNlcyhlbGVtZW50LCBmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlcyBhbGwgcmVmZXJlbmNlcyB0byBhIG1ldGhvZCBlbGVtZW50LgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogICAgICAgICAgICBhIG1ldGhvZCBlbGVtZW50Ci0JICogQHJldHVybiBhIG1hcCBvZiBtZXRob2QgZWxlbWVudHMgd2hvc2UgcmVmZXJlbmNlcyB0byB0aGUgZ2l2ZW4gZWxlbWVudAotCSAqICAgICAgICAgYXJlIGp1c3QgcmVtb3ZlZCwgYW5kIHRoZWlyIGZlYXR1cmVzIHRoYXQgaG9sZCB0aGUgcmVmZXJlbmNlcyB0bwotCSAqICAgICAgICAgdGhlIGdpdmVuIGVsZW1lbnQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1hcCByZW1vdmVSZWZlcmVuY2VzKE1ldGhvZEVsZW1lbnQgZWxlbWVudCwKLQkJCWJvb2xlYW4gY2hlY2tNb2RpZnkpIHsKLQkJLy8gTGlzdCByZWZlcmVuY2VycyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJTWFwIG9iamVjdEZlYXR1cmVzTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJTXVsdGlSZXNvdXJjZUVPYmplY3QgZU9iaiA9IChNdWx0aVJlc291cmNlRU9iamVjdCkgZWxlbWVudDsKLQkKLQkJaWYgKGVPYmouYmFzaWNHZXRPcHBvc2l0ZUZlYXR1cmVNYXAoKSA9PSBudWxsKQotCQkJcmV0dXJuIG9iamVjdEZlYXR1cmVzTWFwOwotCQotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBlT2JqLmdldE9wcG9zaXRlRmVhdHVyZU1hcCgpLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQlNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBpdGVyLm5leHQoKTsKLQkJCU9wcG9zaXRlRmVhdHVyZSBvcHBvc2l0ZUZlYXR1cmUgPSAoKE9wcG9zaXRlRmVhdHVyZSkgZW50cnkuZ2V0S2V5KCkpOwotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBvcHBvc2l0ZUZlYXR1cmUuZ2V0VGFyZ2V0RmVhdHVyZSgpOwotCQkJaWYgKGZlYXR1cmUuaXNNYW55KCkpIHsKLQkJCQlpZiAob3Bwb3NpdGVGZWF0dXJlLmlzTWFueSgpKSB7Ci0JCQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBuZXcgQXJyYXlMaXN0KChDb2xsZWN0aW9uKSBlT2JqCi0JCQkJCQkJLmdldE9wcG9zaXRlRmVhdHVyZVZhbHVlKG9wcG9zaXRlRmVhdHVyZSkpCi0JCQkJCQkJLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCQkJCUVPYmplY3Qgb2JqID0gKEVPYmplY3QpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJCWlmIChjaGVja01vZGlmeSkgewotCQkJCQkJCWNoZWNrTW9kaWZ5KG9iaik7Ci0JCQkJCQl9Ci0JCQkJCQkoKExpc3QpIG9iai5lR2V0KGZlYXR1cmUpKS5yZW1vdmUoZWxlbWVudCk7Ci0JCQkJCQlMaXN0IGZlYXR1cmVzID0gKExpc3QpIG9iamVjdEZlYXR1cmVzTWFwLmdldChvYmopOwotCQkJCQkJaWYgKGZlYXR1cmVzID09IG51bGwpIHsKLQkJCQkJCQlmZWF0dXJlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJCQlvYmplY3RGZWF0dXJlc01hcC5wdXQob2JqLCBmZWF0dXJlcyk7Ci0JCQkJCQl9Ci0JCQkJCQlmZWF0dXJlcy5hZGQoZmVhdHVyZSk7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQlFT2JqZWN0IG9iaiA9IChFT2JqZWN0KSBlT2JqCi0JCQkJCQkJLmdldE9wcG9zaXRlRmVhdHVyZVZhbHVlKG9wcG9zaXRlRmVhdHVyZSk7Ci0JCQkJCWlmIChvYmogIT0gbnVsbCkgewotCQkJCQkJaWYgKGNoZWNrTW9kaWZ5KSB7Ci0JCQkJCQkJY2hlY2tNb2RpZnkob2JqKTsKLQkJCQkJCX0KLQkJCQkJCSgoTGlzdCkgb2JqLmVHZXQoZmVhdHVyZSkpLnJlbW92ZShlbGVtZW50KTsKLQkJCQkJCUxpc3QgZmVhdHVyZXMgPSAoTGlzdCkgb2JqZWN0RmVhdHVyZXNNYXAuZ2V0KG9iaik7Ci0JCQkJCQlpZiAoZmVhdHVyZXMgPT0gbnVsbCkgewotCQkJCQkJCWZlYXR1cmVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQkJCW9iamVjdEZlYXR1cmVzTWFwLnB1dChvYmosIGZlYXR1cmVzKTsKLQkJCQkJCX0KLQkJCQkJCWZlYXR1cmVzLmFkZChmZWF0dXJlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKG9wcG9zaXRlRmVhdHVyZS5pc01hbnkoKSkgewotCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gbmV3IEFycmF5TGlzdCgoQ29sbGVjdGlvbikgZU9iagotCQkJCQkJCS5nZXRPcHBvc2l0ZUZlYXR1cmVWYWx1ZShvcHBvc2l0ZUZlYXR1cmUpKQotCQkJCQkJCS5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlFT2JqZWN0IG9iaiA9IChFT2JqZWN0KSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCQlpZiAoY2hlY2tNb2RpZnkpIHsKLQkJCQkJCQljaGVja01vZGlmeShvYmopOwotCQkJCQkJfQotCQkJCQkJb2JqLmVTZXQoZmVhdHVyZSwgbnVsbCk7Ci0JCQkJCQlMaXN0IGZlYXR1cmVzID0gKExpc3QpIG9iamVjdEZlYXR1cmVzTWFwLmdldChvYmopOwotCQkJCQkJaWYgKGZlYXR1cmVzID09IG51bGwpIHsKLQkJCQkJCQlmZWF0dXJlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJCQlvYmplY3RGZWF0dXJlc01hcC5wdXQob2JqLCBmZWF0dXJlcyk7Ci0JCQkJCQl9Ci0JCQkJCQlmZWF0dXJlcy5hZGQoZmVhdHVyZSk7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQlFT2JqZWN0IG9iaiA9IChFT2JqZWN0KSBlT2JqCi0JCQkJCQkJLmdldE9wcG9zaXRlRmVhdHVyZVZhbHVlKG9wcG9zaXRlRmVhdHVyZSk7Ci0JCQkJCWlmIChvYmogIT0gbnVsbCkgewotCQkJCQkJaWYgKGNoZWNrTW9kaWZ5KSB7Ci0JCQkJCQkJY2hlY2tNb2RpZnkob2JqKTsKLQkJCQkJCX0KLQkJCQkJCW9iai5lU2V0KGZlYXR1cmUsIG51bGwpOwotCQkJCQkJTGlzdCBmZWF0dXJlcyA9IChMaXN0KSBvYmplY3RGZWF0dXJlc01hcC5nZXQob2JqKTsKLQkJCQkJCWlmIChmZWF0dXJlcyA9PSBudWxsKSB7Ci0JCQkJCQkJZmVhdHVyZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCQkJb2JqZWN0RmVhdHVyZXNNYXAucHV0KG9iaiwgZmVhdHVyZXMpOwotCQkJCQkJfQotCQkJCQkJZmVhdHVyZXMuYWRkKGZlYXR1cmUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCS8vIGZvciAoSXRlcmF0b3IgaXRlciA9IG9iamVjdEZlYXR1cmVzTWFwLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsKLQkJLy8gaXRlci5oYXNOZXh0KCk7KSB7Ci0JCS8vIE1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIGl0ZXIubmV4dCgpOwotCQkvLyByZWZlcmVuY2Vycy5hZGQobmV3IFJlZmVyZW5jZXIoKEVPYmplY3QpZW50cnkuZ2V0S2V5KCksCi0JCS8vIChMaXN0KWVudHJ5LmdldFZhbHVlKCkpKTsKLQkJLy8gfQotCQkvLyByZXR1cm4gcmVmZXJlbmNlcnM7Ci0JCXJldHVybiBvYmplY3RGZWF0dXJlc01hcDsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHB1Ymxpc2hpbmcgY2F0ZWdvcnkgcHJvcGVydHkgZm9yIG1ldGhvZCBlbGVtZW50Ci0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiBAcmV0dXJuCi0JICogCQkgcHJvcGVydHkgaWYgZm91bmQsIGVsc2UgbnVsbAotCSAqLwotCXB1YmxpYyBzdGF0aWMgTWV0aG9kRWxlbWVudFByb3BlcnR5IGdldFB1Ymxpc2hDYXRlZ29yeVByb3BlcnR5KE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgewotCQlMaXN0IHByb3BzID0gZWxlbWVudC5nZXRNZXRob2RFbGVtZW50UHJvcGVydHkoKTsKLQkJaWYgKHByb3BzID09IG51bGwgfHwgcHJvcHMuc2l6ZSgpID09IDApIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJZm9yIChJdGVyYXRvciBpdCA9IHByb3BzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCU1ldGhvZEVsZW1lbnRQcm9wZXJ0eSBwcm9wID0gKE1ldGhvZEVsZW1lbnRQcm9wZXJ0eSkgaXQubmV4dCgpOwotCQkJaWYgKFBVQkxJU0hfQ0FURUdPUllfUFJPUEVSVFkuZXF1YWxzKHByb3AuZ2V0TmFtZSgpKSkgewotCQkJCXJldHVybiBwcm9wOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBMaXN0PElOb3RpZnlDaGFuZ2VkTGlzdGVuZXI+IGdldE5vdGlmeUNoYW5nZWRMaXN0ZW5lcnMoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksIE9iamVjdCBvYmopIHsKLQkJT2JqZWN0IGFkYXB0ZXIgPSBhZGFwdGVyRmFjdG9yeS5hZGFwdChvYmosIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCWlmKGFkYXB0ZXIgaW5zdGFuY2VvZiBJTGlzdGVuZXJQcm92aWRlcikgewotCQkJcmV0dXJuICgoSUxpc3RlbmVyUHJvdmlkZXIpIGFkYXB0ZXIpLmdldE5vdGlmeUNoYW5nZWRMaXN0ZW5lcnMoKTsKLQkJfQotCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgQ29sbGVjdGlvbjw/PiBnZXRXcmFwcGVycyhBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwgT2JqZWN0IG9iaikgewotCQlIYXNoU2V0PE9iamVjdD4gd3JhcHBlcnMgPSBuZXcgSGFzaFNldDxPYmplY3Q+KCk7Ci0JCWZvciAoSU5vdGlmeUNoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lciA6IGdldE5vdGlmeUNoYW5nZWRMaXN0ZW5lcnMoYWRhcHRlckZhY3RvcnksIG9iaikpIHsKLQkJCWlmKGxpc3RlbmVyIGluc3RhbmNlb2YgSVdyYXBwZXJJdGVtUHJvdmlkZXIgJiYgdW53cmFwKGxpc3RlbmVyKSA9PSBvYmopIHsKLQkJCQl3cmFwcGVycy5hZGQobGlzdGVuZXIpOwotCQkJfQotCQl9Ci0JCXJldHVybiB3cmFwcGVyczsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSB3cmFwcGVyIGZvciB0aGUgZ2l2ZW4gdmFsdWUgaW4gdGhlIGdpdmVuIHdyYXBwZXJzLgotCSAqIAotCSAqIEBwYXJhbSB3cmFwcGVycwotCSAqIEBwYXJhbSB2YWx1ZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEZlYXR1cmVWYWx1ZVdyYXBwZXJJdGVtUHJvdmlkZXIgZ2V0V3JhcHBlcihDb2xsZWN0aW9uIHdyYXBwZXJzLCBPYmplY3QgdmFsdWUpIHsKLQkJaWYgKHdyYXBwZXJzID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gd3JhcHBlcnMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgbGlzdGVuZXIgPSAoT2JqZWN0KSBpdGVyLm5leHQoKTsKLQkJCWlmKGxpc3RlbmVyIGluc3RhbmNlb2YgRmVhdHVyZVZhbHVlV3JhcHBlckl0ZW1Qcm92aWRlcgotCQkJCQkmJiB1bndyYXAobGlzdGVuZXIpID09IHZhbHVlKSB7Ci0JCQkJcmV0dXJuIChGZWF0dXJlVmFsdWVXcmFwcGVySXRlbVByb3ZpZGVyKSBsaXN0ZW5lcjsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIE9iamVjdCBnZXRGZWF0dXJlVmFsdWVXcmFwcGVySXRlbVByb3ZpZGVyRm9yQ0MoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksIEN1c3RvbUNhdGVnb3J5IGNjKSB7Ci0JCS8vIGdldCBJVHJlZUNvbnRlbnRQcm92aWRlciBhZGFwYXRlcgotCQlDdXN0b21DYXRlZ29yeUl0ZW1Qcm92aWRlciBhZGFwdGVyID0gKEN1c3RvbUNhdGVnb3J5SXRlbVByb3ZpZGVyKSBhZGFwdGVyRmFjdG9yeS5hZGFwdChjYywgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gYWRhcHRlci5nZXROb3RpZnlDaGFuZ2VkTGlzdGVuZXJzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgbGlzdGVuZXIgPSBpdGVyLm5leHQoKTsKLQkJCWlmIChsaXN0ZW5lciBpbnN0YW5jZW9mIEZlYXR1cmVWYWx1ZVdyYXBwZXJJdGVtUHJvdmlkZXIKLQkJCQkJJiYgdW53cmFwKGxpc3RlbmVyKSA9PSBjYykgewotCQkJCXJldHVybiAoRmVhdHVyZVZhbHVlV3JhcHBlckl0ZW1Qcm92aWRlcilsaXN0ZW5lcjsKLQkJCX0KLQkJfQotCQlyZXR1cm4gY2M7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgY2xhc3MgUHJlc2VudGF0aW9uTmFtZUhlbHBlciB7Ci0JCS8vdG8gYmUgb3ZlcnJpZGVuIGJ5IHN1YmNsYXNzCi0JCXB1YmxpYyBTdHJpbmcgZ2V0UHJlc2VudGF0aW9uTmFtZShNZXRob2RFbGVtZW50IGVsZW1lbnQpIHsKLQkJCXJldHVybiBlbGVtZW50LmdldFByZXNlbnRhdGlvbk5hbWUoKTsKLQkJfQotCX0KLQkKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvV3JhcHBlck1hbmFnZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9XcmFwcGVyTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MjAyNWI2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9XcmFwcGVyTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM2ICswLDAgQEAKLS8vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuRGVsZWdhdGluZ1dyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSURpc3Bvc2FibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVdyYXBwZXJJdGVtUHJvdmlkZXI7Ci0KLS8qKgotICogTWFuYWdlcyB3cmFwcGVycyBvZiBhbiBpdGVtIHByb3ZpZGVyCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlIC0gRmViIDE1LCAyMDA2Ci0gKiBAc2luY2UgIDEuMAotICovCi1wdWJsaWMgY2xhc3MgV3JhcHBlck1hbmFnZXIgaW1wbGVtZW50cyBJRGlzcG9zYWJsZSB7Ci0KLQlwcml2YXRlIEhhc2hNYXAgdmFsdWVUb1dyYXBwZXJNYXA7Ci0JcHJpdmF0ZSBBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeTsKLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBXcmFwcGVyTWFuYWdlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcigpOwotCQl0aGlzLmFkYXB0ZXJGYWN0b3J5ID0gYWRhcHRlckZhY3Rvcnk7Ci0JfQotCQotCXB1YmxpYyBPYmplY3QgZ2V0V3JhcHBlcihPYmplY3QgdmFsdWUpIHsKLQkJaWYodmFsdWVUb1dyYXBwZXJNYXAgIT0gbnVsbCkgewotCQkJcmV0dXJuIHZhbHVlVG9XcmFwcGVyTWFwLmdldCh2YWx1ZSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldFdyYXBwZXJzKCkgewotCQlpZih2YWx1ZVRvV3JhcHBlck1hcCAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gdmFsdWVUb1dyYXBwZXJNYXAudmFsdWVzKCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIG9mIHRoaXMgd3JhcHBlciBmb3IgdGhlIGdpdmVuIHZhbHVlLCBvd25lciwgYW5kIGFkYXB0ZXIgZmFjdG9yeS4KLQkgKi8KLQlwcm90ZWN0ZWQgSVdyYXBwZXJJdGVtUHJvdmlkZXIgY3JlYXRlV3JhcHBlcihPYmplY3QgdmFsdWUsIE9iamVjdCBvd25lciwgQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJcmV0dXJuIG5ldyBEZWxlZ2F0aW5nV3JhcHBlckl0ZW1Qcm92aWRlcih2YWx1ZSwgb3duZXIsIG51bGwsIENvbW1hbmRQYXJhbWV0ZXIuTk9fSU5ERVgsIGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB1cGRhdGUoQ29sbGVjdGlvbiBkZWxlZ2F0ZVZhbHVlcykgewotCQlib29sZWFuIGNoYW5nZWQgPSBmYWxzZTsKLQkJU2V0IG9sZERlbGVnYXRlVmFsdWVzID0gZGVsZWdhdGVWYWx1ZXMgIT0gbnVsbCA/IG5ldyBIYXNoU2V0KGRlbGVnYXRlVmFsdWVzKSA6IENvbGxlY3Rpb25zLkVNUFRZX1NFVDsKLQkJCi0JCWlmICh2YWx1ZVRvV3JhcHBlck1hcCA9PSBudWxsICYmICFkZWxlZ2F0ZVZhbHVlcy5pc0VtcHR5KCkpCi0JCXsKLQkJCXZhbHVlVG9XcmFwcGVyTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJfQotCQkKLQkJLy8gV3JhcCBhbnkgbmV3IGNoaWxkcmVuIGFuZCBhZGQgdGhlbSB0byB0aGUgbWFwLiBSZW1vdmUgZWFjaCBjdXJyZW50IGNoaWxkIGZyb20gdGhlIHNldCBvZiBvbGQgY2hpbGRyZW4uCi0JCS8vCi0JCWZvciAoSXRlcmF0b3IgaSA9IGRlbGVnYXRlVmFsdWVzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0JCXsKLQkJCU9iamVjdCBjaGlsZCA9IGkubmV4dCgpOwotCQkJCi0JCQlpZiAoIXZhbHVlVG9XcmFwcGVyTWFwLmNvbnRhaW5zS2V5KGNoaWxkKSkKLQkJCXsKLQkJCQlJV3JhcHBlckl0ZW1Qcm92aWRlciB3cmFwcGVyID0gY3JlYXRlV3JhcHBlcihjaGlsZCwgdGhpcywgYWRhcHRlckZhY3RvcnkpOwotCQkJCXZhbHVlVG9XcmFwcGVyTWFwLnB1dChjaGlsZCwgd3JhcHBlcik7Ci0JCQkJY2hhbmdlZCA9IHRydWU7Ci0JCQl9Ci0JCQlvbGREZWxlZ2F0ZVZhbHVlcy5yZW1vdmUoY2hpbGQpOwotCQl9Ci0JCQotCQkvLyBSZW1vdmUgYW5kIGRpc3Bvc2UgYW55IHdyYXBwZXJzIGZvciByZW1haW5pbmcgb2xkIGNoaWxkcmVuLgotCQkvLwotCQlpZiAoIW9sZERlbGVnYXRlVmFsdWVzLmlzRW1wdHkoKSkKLQkJewotCQkJY2hhbmdlZCA9IHRydWU7Ci0JCQkKLQkJCWZvciAoSXRlcmF0b3IgaSA9IG9sZERlbGVnYXRlVmFsdWVzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0JCQl7Ci0JCQkJT2JqZWN0IGNoaWxkID0gaS5uZXh0KCk7Ci0JCQkJCi0JCQkJSVdyYXBwZXJJdGVtUHJvdmlkZXIgd3JhcHBlciA9IChJV3JhcHBlckl0ZW1Qcm92aWRlcil2YWx1ZVRvV3JhcHBlck1hcC5yZW1vdmUoY2hpbGQpOwotCQkJCWlmICh3cmFwcGVyICE9IG51bGwpCi0JCQkJewotCQkJCQl3cmFwcGVyLmRpc3Bvc2UoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCS8vIElmIGFueSBjaGlsZHJlbiB3ZXJlIGFkZGVkIG9yIHJlbW92ZWQsIHJlc2V0IHRoZSBpbmRpY2VzLgotCQlpZiAoY2hhbmdlZCkKLQkJewotCQkJaW50IGluZGV4ID0gMDsKLQkJCWZvciAoSXRlcmF0b3IgaSA9IGRlbGVnYXRlVmFsdWVzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyBpbmRleCsrKQotCQkJewotCQkJCSgoSVdyYXBwZXJJdGVtUHJvdmlkZXIpdmFsdWVUb1dyYXBwZXJNYXAuZ2V0KGkubmV4dCgpKSkuc2V0SW5kZXgoaW5kZXgpOwotCQkJfQotCQl9Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSURpc3Bvc2FibGUjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkgICAgaWYgKHZhbHVlVG9XcmFwcGVyTWFwICE9IG51bGwpCi0JICAgIHsKLQkgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSB2YWx1ZVRvV3JhcHBlck1hcC52YWx1ZXMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0JICAgICAgewotCSAgICAgICAgKChJRGlzcG9zYWJsZSlpLm5leHQoKSkuZGlzcG9zZSgpOwotCSAgICAgIH0KLQkgICAgICB2YWx1ZVRvV3JhcHBlck1hcC5jbGVhcigpOwotCSAgICAgIHZhbHVlVG9XcmFwcGVyTWFwID0gbnVsbDsKLQkgICAgfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL21vZGVsL01vZGVsRmFjdG9yeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL21vZGVsL01vZGVsRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNDRmZTIyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9tb2RlbC9Nb2RlbEZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5tb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRmFjdG9yeTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBUaGUgPGI+RmFjdG9yeTwvYj4gZm9yIHRoZSBtb2RlbC4gSXQgcHJvdmlkZXMgYQotICogY3JlYXRlIG1ldGhvZCBmb3IgZWFjaCBub24tYWJzdHJhY3QgY2xhc3Mgb2YgdGhlIG1vZGVsLiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIAotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwubW9kZWwuTW9kZWxQYWNrYWdlCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgTW9kZWxGYWN0b3J5IGV4dGVuZHMgRUZhY3RvcnkgewotCS8qKgotCSAqIFRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIGZhY3RvcnkuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU1vZGVsRmFjdG9yeSBlSU5TVEFOQ0UgPSBuZXcgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLm1vZGVsLmltcGwuTW9kZWxGYWN0b3J5SW1wbCgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5PcmRlciBJbmZvPC9lbT4nLiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+T3JkZXIgSW5mbzwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JT3JkZXJJbmZvIGNyZWF0ZU9yZGVySW5mbygpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5PcmRlciBJbmZvIENvbGxlY3Rpb248L2VtPicuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5PcmRlciBJbmZvIENvbGxlY3Rpb248L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU9yZGVySW5mb0NvbGxlY3Rpb24gY3JlYXRlT3JkZXJJbmZvQ29sbGVjdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcGFja2FnZSBzdXBwb3J0ZWQgYnkgdGhpcyBmYWN0b3J5LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHBhY2thZ2Ugc3VwcG9ydGVkIGJ5IHRoaXMgZmFjdG9yeS4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTW9kZWxQYWNrYWdlIGdldE1vZGVsUGFja2FnZSgpOwotCi19IC8vIE1vZGVsRmFjdG9yeQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL21vZGVsL01vZGVsUGFja2FnZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL21vZGVsL01vZGVsUGFja2FnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYmRhNWUyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9tb2RlbC9Nb2RlbFBhY2thZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxMCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwubW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBUaGUgPGI+UGFja2FnZTwvYj4gZm9yIHRoZSBtb2RlbC4gSXQgY29udGFpbnMKLSAqIGFjY2Vzc29ycyBmb3IgdGhlIG1ldGEgb2JqZWN0cyB0byByZXByZXNlbnQKLSAqIDx1bD4KLSAqIDxsaT5lYWNoIGNsYXNzLDwvbGk+Ci0gKiA8bGk+ZWFjaCBmZWF0dXJlIG9mIGVhY2ggY2xhc3MsPC9saT4KLSAqIDxsaT5lYWNoIGVudW0sPC9saT4KLSAqIDxsaT5hbmQgZWFjaCBkYXRhIHR5cGU8L2xpPgotICogPC91bD4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5tb2RlbC5Nb2RlbEZhY3RvcnkKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBNb2RlbFBhY2thZ2UgZXh0ZW5kcyBFUGFja2FnZSB7Ci0JLyoqCi0JICogVGhlIHBhY2thZ2UgbmFtZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBlTkFNRSA9ICJtb2RlbCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSBwYWNrYWdlIG5hbWVzcGFjZSBVUkkuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZU5TX1VSSSA9ICJodHRwOi8vL2NvbS9pYm0vdW1hL2VkaXQvdG5nL3V0aWwvbW9kZWwuZWNvcmUiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgcGFja2FnZSBuYW1lc3BhY2UgbmFtZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBlTlNfUFJFRklYID0gIm9yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC50bmcudXRpbC5tb2RlbCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIHBhY2thZ2UuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU1vZGVsUGFja2FnZSBlSU5TVEFOQ0UgPSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwubW9kZWwuaW1wbC5Nb2RlbFBhY2thZ2VJbXBsCi0JCQkuaW5pdCgpOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwubW9kZWwuaW1wbC5PcmRlckluZm9JbXBsIDxlbT5PcmRlciBJbmZvPC9lbT59JwotCSAqIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5tb2RlbC5pbXBsLk9yZGVySW5mb0ltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5tb2RlbC5pbXBsLk1vZGVsUGFja2FnZUltcGwjZ2V0T3JkZXJJbmZvKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IE9SREVSX0lORk8gPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgT1JERVJfSU5GT19fTkFNRSA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R1VJIERzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgT1JERVJfSU5GT19fR1VJX0RTID0gMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UaW1lc3RhbXA8L2I+PC9lbT4nIGF0dHJpYnV0ZS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgT1JERVJfSU5GT19fVElNRVNUQU1QID0gMjsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+T3JkZXIgSW5mbzwvZW0+JwotCSAqIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgT1JERVJfSU5GT19GRUFUVVJFX0NPVU5UID0gMzsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLm1vZGVsLmltcGwuT3JkZXJJbmZvQ29sbGVjdGlvbkltcGwgPGVtPk9yZGVyIEluZm8gQ29sbGVjdGlvbjwvZW0+fScKLQkgKiBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwubW9kZWwuaW1wbC5PcmRlckluZm9Db2xsZWN0aW9uSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLm1vZGVsLmltcGwuTW9kZWxQYWNrYWdlSW1wbCNnZXRPcmRlckluZm9Db2xsZWN0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IE9SREVSX0lORk9fQ09MTEVDVElPTiA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXIgSW5mb3M8L2I+PC9lbT4nIGNvbnRhaW5tZW50Ci0JICogcmVmZXJlbmNlIGxpc3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBPUkRFUl9JTkZPX0NPTExFQ1RJT05fX09SREVSX0lORk9TID0gMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+T3JkZXIgSW5mbyBDb2xsZWN0aW9uPC9lbT4nCi0JICogY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBPUkRFUl9JTkZPX0NPTExFQ1RJT05fRkVBVFVSRV9DT1VOVCA9IDE7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwubW9kZWwuT3JkZXJJbmZvIDxlbT5PcmRlciBJbmZvPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5PcmRlciBJbmZvPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLm1vZGVsLk9yZGVySW5mbwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0T3JkZXJJbmZvKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5tb2RlbC5PcmRlckluZm8jZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5OYW1lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLm1vZGVsLk9yZGVySW5mbyNnZXROYW1lKCkKLQkgKiBAc2VlICNnZXRPcmRlckluZm8oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldE9yZGVySW5mb19OYW1lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLm1vZGVsLk9yZGVySW5mbyNnZXRHVUlEcyA8ZW0+R1VJIERzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+R1VJIERzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLm1vZGVsLk9yZGVySW5mbyNnZXRHVUlEcygpCi0JICogQHNlZSAjZ2V0T3JkZXJJbmZvKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRPcmRlckluZm9fR1VJRHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLm1vZGVsLk9yZGVySW5mbyNnZXRUaW1lc3RhbXAgPGVtPlRpbWVzdGFtcDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5UaW1lc3RhbXA8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwubW9kZWwuT3JkZXJJbmZvI2dldFRpbWVzdGFtcCgpCi0JICogQHNlZSAjZ2V0T3JkZXJJbmZvKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRPcmRlckluZm9fVGltZXN0YW1wKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwubW9kZWwuT3JkZXJJbmZvQ29sbGVjdGlvbiA8ZW0+T3JkZXIgSW5mbyBDb2xsZWN0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5PcmRlciBJbmZvIENvbGxlY3Rpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwubW9kZWwuT3JkZXJJbmZvQ29sbGVjdGlvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0T3JkZXJJbmZvQ29sbGVjdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5tb2RlbC5PcmRlckluZm9Db2xsZWN0aW9uI2dldE9yZGVySW5mb3MgPGVtPk9yZGVyIEluZm9zPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+T3JkZXIgSW5mb3M8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwubW9kZWwuT3JkZXJJbmZvQ29sbGVjdGlvbiNnZXRPcmRlckluZm9zKCkKLQkgKiBAc2VlICNnZXRPcmRlckluZm9Db2xsZWN0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRPcmRlckluZm9Db2xsZWN0aW9uX09yZGVySW5mb3MoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGZhY3RvcnkgdGhhdCBjcmVhdGVzIHRoZSBpbnN0YW5jZXMgb2YgdGhlIG1vZGVsLiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGZhY3RvcnkgdGhhdCBjcmVhdGVzIHRoZSBpbnN0YW5jZXMgb2YgdGhlIG1vZGVsLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlNb2RlbEZhY3RvcnkgZ2V0TW9kZWxGYWN0b3J5KCk7Ci0KLX0gLy8gTW9kZWxQYWNrYWdlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvbW9kZWwvT3JkZXJJbmZvLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvbW9kZWwvT3JkZXJJbmZvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlMmU0Y2IuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL21vZGVsL09yZGVySW5mby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLm1vZGVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi0vKioKLSAqIEBtb2RlbAotICovCi1wdWJsaWMgaW50ZXJmYWNlIE9yZGVySW5mbyBleHRlbmRzIEVPYmplY3QgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRZUEVfTUFOVUFMID0gIm1hbnVhbCI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuCi0JICogQG1vZGVsCi0JICovCi0JU3RyaW5nIGdldE5hbWUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5tb2RlbC5PcmRlckluZm8jZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fScKLQkgKiBhdHRyaWJ1dGUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXROYW1lKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuCi0JICogQG1vZGVsIHR5cGU9ImphdmEubGFuZy5TdHJpbmciIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqLwotCUVMaXN0IGdldEdVSURzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5UaW1lc3RhbXA8L2I+PC9lbT4nIGF0dHJpYnV0ZS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlRpbWVzdGFtcDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5UaW1lc3RhbXA8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFRpbWVzdGFtcChsb25nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLm1vZGVsLk1vZGVsUGFja2FnZSNnZXRPcmRlckluZm9fVGltZXN0YW1wKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JbG9uZyBnZXRUaW1lc3RhbXAoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5tb2RlbC5PcmRlckluZm8jZ2V0VGltZXN0YW1wIDxlbT5UaW1lc3RhbXA8L2VtPn0nCi0JICogYXR0cmlidXRlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiAgICAgICAgICAgIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VGltZXN0YW1wPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRUaW1lc3RhbXAoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFRpbWVzdGFtcChsb25nIHZhbHVlKTsKLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL21vZGVsL09yZGVySW5mb0NvbGxlY3Rpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9tb2RlbC9PcmRlckluZm9Db2xsZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmZThkZWMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL21vZGVsL09yZGVySW5mb0NvbGxlY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5tb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotLyoqCi0gKiBDb2xsZWN0aW9uIG9mIG9yZGVyIGluZm9ybWF0aW9uCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKiBAbW9kZWwKLSAqLwotcHVibGljIGludGVyZmFjZSBPcmRlckluZm9Db2xsZWN0aW9uIGV4dGVuZHMgRU9iamVjdCB7Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICogQG1vZGVsIHR5cGU9ImNvbS5pYm0ubGlicmFyeS5lZGl0LnV0aWwubW9kZWwuT3JkZXJJbmZvIgotCSAqICAgICAgICBjb250YWluZW1lbnQ9InRydWUiCi0JICovCi0JRUxpc3QgZ2V0T3JkZXJJbmZvcygpOwotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvbW9kZWwvZWRpdHV0aWwuZWNvcmUgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvbW9kZWwvZWRpdHV0aWwuZWNvcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5ODc2M2EuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL21vZGVsL2VkaXR1dGlsLmVjb3JlCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxlY29yZTpFUGFja2FnZSB4bWk6dmVyc2lvbj0iMi4wIgotICAgIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgICB4bWxuczplY29yZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSIgbmFtZT0ibW9kZWwiCi0gICAgbnNVUkk9Imh0dHA6Ly8vY29tL2libS91bWEvZWRpdC90bmcvdXRpbC9tb2RlbC5lY29yZSIgbnNQcmVmaXg9ImNvbS5pYm0udW1hLmVkaXQudG5nLnV0aWwubW9kZWwiPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ik9yZGVySW5mbyI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im5hbWUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idHlwZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0ibWFudWFsIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImdVSURzIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ0aW1lc3RhbXAiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VMb25nIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ik9yZGVySW5mb0NvbGxlY3Rpb24iPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJvcmRlckluZm9zIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL09yZGVySW5mbyIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci08L2Vjb3JlOkVQYWNrYWdlPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL21vZGVsL2VkaXR1dGlsLmdlbm1vZGVsIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL21vZGVsL2VkaXR1dGlsLmdlbm1vZGVsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MGNhNjQ5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9tb2RlbC9lZGl0dXRpbC5nZW5tb2RlbAorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Z2VubW9kZWw6R2VuTW9kZWwgeG1pOnZlcnNpb249IjIuMCIKLSAgICB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOmVjb3JlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIgotICAgIHhtbG5zOmdlbm1vZGVsPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIiBtb2RlbERpcmVjdG9yeT0iL2NvbS5pYm0udW1hLmVkaXQudG5nL3NyYyIKLSAgICBlZGl0RGlyZWN0b3J5PSIvY29tLmlibS51bWEucmVzb3VyY2VtYW5hZ2VyLmVkaXQvc3JjIiBlZGl0b3JEaXJlY3Rvcnk9Ii9jb20uaWJtLnVtYS5yZXNvdXJjZW1hbmFnZXIuZWRpdG9yL3NyYyIKLSAgICBtb2RlbFBsdWdpbklEPSJjb20uaWJtLnVtYS5lZGl0LnRuZyIgcnVudGltZUphcj0idHJ1ZSIgbW9kZWxOYW1lPSJlZGl0dXRpbCIgZWRpdFBsdWdpbkNsYXNzPSJjb20uaWJtLnVtYS5yZXNvdXJjZW1hbmFnZXIucHJvdmlkZXIuZWRpdHV0aWxFZGl0UGx1Z2luIgotICAgIGVkaXRvclBsdWdpbkNsYXNzPSJjb20uaWJtLnVtYS5yZXNvdXJjZW1hbmFnZXIucHJlc2VudGF0aW9uLmVkaXR1dGlsRWRpdG9yUGx1Z2luIgotICAgIHJ1bnRpbWVDb21wYXRpYmlsaXR5PSJmYWxzZSI+Ci0gIDxmb3JlaWduTW9kZWw+QG1vZGVsPC9mb3JlaWduTW9kZWw+Ci0gIDxnZW5QYWNrYWdlcyBwcmVmaXg9Ik1vZGVsIiBiYXNlUGFja2FnZT0iY29tLmlibS51bWEuZWRpdC50bmcudXRpbCIgZWNvcmVQYWNrYWdlPSJlZGl0dXRpbC5lY29yZSMvIj4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJlZGl0dXRpbC5lY29yZSMvL09yZGVySW5mbyI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZWRpdHV0aWwuZWNvcmUjLy9PcmRlckluZm8vbmFtZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGVkaXR1dGlsLmVjb3JlIy8vT3JkZXJJbmZvL2dVSURzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImVkaXR1dGlsLmVjb3JlIy8vT3JkZXJJbmZvQ29sbGVjdGlvbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgZWRpdHV0aWwuZWNvcmUjLy9PcmRlckluZm9Db2xsZWN0aW9uL29yZGVySW5mb3MiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gIDwvZ2VuUGFja2FnZXM+Ci08L2dlbm1vZGVsOkdlbk1vZGVsPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL21vZGVsL2ltcGwvTW9kZWxGYWN0b3J5SW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL21vZGVsL2ltcGwvTW9kZWxGYWN0b3J5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZGJmMTQ1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9tb2RlbC9pbXBsL01vZGVsRmFjdG9yeUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5tb2RlbC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FRmFjdG9yeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLm1vZGVsLk1vZGVsRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwubW9kZWwuTW9kZWxQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5tb2RlbC5PcmRlckluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLm1vZGVsLk9yZGVySW5mb0NvbGxlY3Rpb247Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgPGI+RmFjdG9yeTwvYj4uIDwhLS0KLSAqIGVuZC11c2VyLWRvYyAtLT4KLSAqIAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgTW9kZWxGYWN0b3J5SW1wbCBleHRlbmRzIEVGYWN0b3J5SW1wbCBpbXBsZW1lbnRzIE1vZGVsRmFjdG9yeSB7Ci0JLyoqCi0JICogQ3JlYXRlcyBhbmQgaW5zdGFuY2Ugb2YgdGhlIGZhY3RvcnkuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBNb2RlbEZhY3RvcnlJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRU9iamVjdCBjcmVhdGUoRUNsYXNzIGVDbGFzcykgewotCQlzd2l0Y2ggKGVDbGFzcy5nZXRDbGFzc2lmaWVySUQoKSkgewotCQljYXNlIE1vZGVsUGFja2FnZS5PUkRFUl9JTkZPOgotCQkJcmV0dXJuIGNyZWF0ZU9yZGVySW5mbygpOwotCQljYXNlIE1vZGVsUGFja2FnZS5PUkRFUl9JTkZPX0NPTExFQ1RJT046Ci0JCQlyZXR1cm4gY3JlYXRlT3JkZXJJbmZvQ29sbGVjdGlvbigpOwotCQlkZWZhdWx0OgotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKLQkJCQkJIlRoZSBjbGFzcyAnIiArIGVDbGFzcy5nZXROYW1lKCkgKyAiJyBpcyBub3QgYSB2YWxpZCBjbGFzc2lmaWVyIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPcmRlckluZm8gY3JlYXRlT3JkZXJJbmZvKCkgewotCQlPcmRlckluZm9JbXBsIG9yZGVySW5mbyA9IG5ldyBPcmRlckluZm9JbXBsKCk7Ci0JCXJldHVybiBvcmRlckluZm87Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPcmRlckluZm9Db2xsZWN0aW9uIGNyZWF0ZU9yZGVySW5mb0NvbGxlY3Rpb24oKSB7Ci0JCU9yZGVySW5mb0NvbGxlY3Rpb25JbXBsIG9yZGVySW5mb0NvbGxlY3Rpb24gPSBuZXcgT3JkZXJJbmZvQ29sbGVjdGlvbkltcGwoKTsKLQkJcmV0dXJuIG9yZGVySW5mb0NvbGxlY3Rpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBNb2RlbFBhY2thZ2UgZ2V0TW9kZWxQYWNrYWdlKCkgewotCQlyZXR1cm4gKE1vZGVsUGFja2FnZSkgZ2V0RVBhY2thZ2UoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZGVwcmVjYXRlZAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1vZGVsUGFja2FnZSBnZXRQYWNrYWdlKCkgewotCQlyZXR1cm4gTW9kZWxQYWNrYWdlLmVJTlNUQU5DRTsKLQl9Ci0KLX0gLy8gTW9kZWxGYWN0b3J5SW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL21vZGVsL2ltcGwvTW9kZWxQYWNrYWdlSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL21vZGVsL2ltcGwvTW9kZWxQYWNrYWdlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyODgzZTRiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9tb2RlbC9pbXBsL01vZGVsUGFja2FnZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwubW9kZWwuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVQYWNrYWdlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwubW9kZWwuTW9kZWxGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5tb2RlbC5Nb2RlbFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLm1vZGVsLk9yZGVySW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwubW9kZWwuT3JkZXJJbmZvQ29sbGVjdGlvbjsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCA8Yj5QYWNrYWdlPC9iPi4gPCEtLQotICogZW5kLXVzZXItZG9jIC0tPgotICogCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBNb2RlbFBhY2thZ2VJbXBsIGV4dGVuZHMgRVBhY2thZ2VJbXBsIGltcGxlbWVudHMgTW9kZWxQYWNrYWdlIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3Mgb3JkZXJJbmZvRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBvcmRlckluZm9Db2xsZWN0aW9uRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIG1vZGVsIDxiPlBhY2thZ2U8L2I+LCByZWdpc3RlcmVkIHdpdGgKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlLlJlZ2lzdHJ5IEVQYWNrYWdlLlJlZ2lzdHJ5fSBieSB0aGUKLQkgKiBwYWNrYWdlIHBhY2thZ2UgVVJJIHZhbHVlLgotCSAqIDxwPgotCSAqIE5vdGU6IHRoZSBjb3JyZWN0IHdheSB0byBjcmVhdGUgdGhlIHBhY2thZ2UgaXMgdmlhIHRoZSBzdGF0aWMgZmFjdG9yeQotCSAqIG1ldGhvZCB7QGxpbmsgI2luaXQgaW5pdCgpfSwgd2hpY2ggYWxzbyBwZXJmb3JtcyBpbml0aWFsaXphdGlvbiBvZiB0aGUKLQkgKiBwYWNrYWdlLCBvciByZXR1cm5zIHRoZSByZWdpc3RlcmVkIHBhY2thZ2UsIGlmIG9uZSBhbHJlYWR5IGV4aXN0cy4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZS5SZWdpc3RyeQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLm1vZGVsLk1vZGVsUGFja2FnZSNlTlNfVVJJCi0JICogQHNlZSAjaW5pdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgTW9kZWxQYWNrYWdlSW1wbCgpIHsKLQkJc3VwZXIoZU5TX1VSSSwgTW9kZWxGYWN0b3J5LmVJTlNUQU5DRSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNJbml0ZWQgPSBmYWxzZTsKLQotCS8qKgotCSAqIENyZWF0ZXMsIHJlZ2lzdGVycywgYW5kIGluaXRpYWxpemVzIHRoZSA8Yj5QYWNrYWdlPC9iPiBmb3IgdGhpcyBtb2RlbCwKLQkgKiBhbmQgZm9yIGFueSBvdGhlcnMgdXBvbiB3aGljaCBpdCBkZXBlbmRzLiBTaW1wbGUgZGVwZW5kZW5jaWVzIGFyZQotCSAqIHNhdGlzZmllZCBieSBjYWxsaW5nIHRoaXMgbWV0aG9kIG9uIGFsbCBkZXBlbmRlbnQgcGFja2FnZXMgYmVmb3JlIGRvaW5nCi0JICogYW55dGhpbmcgZWxzZS4gVGhpcyBtZXRob2QgZHJpdmVzIGluaXRpYWxpemF0aW9uIGZvciBpbnRlcmRlcGVuZGVudAotCSAqIHBhY2thZ2VzIGRpcmVjdGx5LCBpbiBwYXJhbGxlbCB3aXRoIHRoaXMgcGFja2FnZSwgaXRzZWxmLgotCSAqIDxwPgotCSAqIE9mIHRoaXMgcGFja2FnZSBhbmQgaXRzIGludGVyZGVwZW5kZW5jaWVzLCBhbGwgcGFja2FnZXMgd2hpY2ggaGF2ZSBub3QKLQkgKiB5ZXQgYmVlbiByZWdpc3RlcmVkIGJ5IHRoZWlyIFVSSSB2YWx1ZXMgYXJlIGZpcnN0IGNyZWF0ZWQgYW5kIHJlZ2lzdGVyZWQuCi0JICogVGhlIHBhY2thZ2VzIGFyZSB0aGVuIGluaXRpYWxpemVkIGluIHR3byBzdGVwczogbWV0YS1tb2RlbCBvYmplY3RzIGZvcgotCSAqIGFsbCBvZiB0aGUgcGFja2FnZXMgYXJlIGNyZWF0ZWQgYmVmb3JlIGFueSBhcmUgaW5pdGlhbGl6ZWQsIHNpbmNlIG9uZQotCSAqIHBhY2thZ2UncyBtZXRhLW1vZGVsIG9iamVjdHMgbWF5IHJlZmVyIHRvIHRob3NlIG9mIGFub3RoZXIuCi0JICogPHA+Ci0JICogSW52b2NhdGlvbiBvZiB0aGlzIG1ldGhvZCB3aWxsIG5vdCBhZmZlY3QgYW55IHBhY2thZ2VzIHRoYXQgaGF2ZSBhbHJlYWR5Ci0JICogYmVlbiBpbml0aWFsaXplZC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjZU5TX1VSSQotCSAqIEBzZWUgI2NyZWF0ZVBhY2thZ2VDb250ZW50cygpCi0JICogQHNlZSAjaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgTW9kZWxQYWNrYWdlIGluaXQoKSB7Ci0JCWlmIChpc0luaXRlZCkKLQkJCXJldHVybiAoTW9kZWxQYWNrYWdlKSBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRQotCQkJCQkuZ2V0RVBhY2thZ2UoTW9kZWxQYWNrYWdlLmVOU19VUkkpOwotCi0JCS8vIE9idGFpbiBvciBjcmVhdGUgYW5kIHJlZ2lzdGVyIHBhY2thZ2UKLQkJTW9kZWxQYWNrYWdlSW1wbCB0aGVNb2RlbFBhY2thZ2UgPSAoTW9kZWxQYWNrYWdlSW1wbCkgKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFCi0JCQkJLmdldEVQYWNrYWdlKGVOU19VUkkpIGluc3RhbmNlb2YgTW9kZWxQYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFCi0JCQkJLmdldEVQYWNrYWdlKGVOU19VUkkpCi0JCQkJOiBuZXcgTW9kZWxQYWNrYWdlSW1wbCgpKTsKLQotCQlpc0luaXRlZCA9IHRydWU7Ci0KLQkJLy8gQ3JlYXRlIHBhY2thZ2UgbWV0YS1kYXRhIG9iamVjdHMKLQkJdGhlTW9kZWxQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCi0JCS8vIEluaXRpYWxpemUgY3JlYXRlZCBtZXRhLWRhdGEKLQkJdGhlTW9kZWxQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQotCQkvLyBNYXJrIG1ldGEtZGF0YSB0byBpbmRpY2F0ZSBpdCBjYW4ndCBiZSBjaGFuZ2VkCi0JCXRoZU1vZGVsUGFja2FnZS5mcmVlemUoKTsKLQotCQlyZXR1cm4gdGhlTW9kZWxQYWNrYWdlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldE9yZGVySW5mbygpIHsKLQkJcmV0dXJuIG9yZGVySW5mb0VDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0T3JkZXJJbmZvX05hbWUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgb3JkZXJJbmZvRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldE9yZGVySW5mb19HVUlEcygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSBvcmRlckluZm9FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0T3JkZXJJbmZvX1RpbWVzdGFtcCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSBvcmRlckluZm9FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRPcmRlckluZm9Db2xsZWN0aW9uKCkgewotCQlyZXR1cm4gb3JkZXJJbmZvQ29sbGVjdGlvbkVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0T3JkZXJJbmZvQ29sbGVjdGlvbl9PcmRlckluZm9zKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIG9yZGVySW5mb0NvbGxlY3Rpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpCi0JCQkJLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE1vZGVsRmFjdG9yeSBnZXRNb2RlbEZhY3RvcnkoKSB7Ci0JCXJldHVybiAoTW9kZWxGYWN0b3J5KSBnZXRFRmFjdG9yeUluc3RhbmNlKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc0NyZWF0ZWQgPSBmYWxzZTsKLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIG1ldGEtbW9kZWwgb2JqZWN0cyBmb3IgdGhlIHBhY2thZ2UuIFRoaXMgbWV0aG9kIGlzIGd1YXJkZWQgdG8KLQkgKiBoYXZlIG5vIGFmZmVjdCBvbiBhbnkgaW52b2NhdGlvbiBidXQgaXRzIGZpcnN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVQYWNrYWdlQ29udGVudHMoKSB7Ci0JCWlmIChpc0NyZWF0ZWQpCi0JCQlyZXR1cm47Ci0JCWlzQ3JlYXRlZCA9IHRydWU7Ci0KLQkJLy8gQ3JlYXRlIGNsYXNzZXMgYW5kIHRoZWlyIGZlYXR1cmVzCi0JCW9yZGVySW5mb0VDbGFzcyA9IGNyZWF0ZUVDbGFzcyhPUkRFUl9JTkZPKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShvcmRlckluZm9FQ2xhc3MsIE9SREVSX0lORk9fX05BTUUpOwotCQljcmVhdGVFQXR0cmlidXRlKG9yZGVySW5mb0VDbGFzcywgT1JERVJfSU5GT19fR1VJX0RTKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShvcmRlckluZm9FQ2xhc3MsIE9SREVSX0lORk9fX1RJTUVTVEFNUCk7Ci0KLQkJb3JkZXJJbmZvQ29sbGVjdGlvbkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhPUkRFUl9JTkZPX0NPTExFQ1RJT04pOwotCQljcmVhdGVFUmVmZXJlbmNlKG9yZGVySW5mb0NvbGxlY3Rpb25FQ2xhc3MsCi0JCQkJT1JERVJfSU5GT19DT0xMRUNUSU9OX19PUkRFUl9JTkZPUyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc0luaXRpYWxpemVkID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBDb21wbGV0ZSB0aGUgaW5pdGlhbGl6YXRpb24gb2YgdGhlIHBhY2thZ2UgYW5kIGl0cyBtZXRhLW1vZGVsLiBUaGlzCi0JICogbWV0aG9kIGlzIGd1YXJkZWQgdG8gaGF2ZSBubyBhZmZlY3Qgb24gYW55IGludm9jYXRpb24gYnV0IGl0cyBmaXJzdC4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpIHsKLQkJaWYgKGlzSW5pdGlhbGl6ZWQpCi0JCQlyZXR1cm47Ci0JCWlzSW5pdGlhbGl6ZWQgPSB0cnVlOwotCi0JCS8vIEluaXRpYWxpemUgcGFja2FnZQotCQlzZXROYW1lKGVOQU1FKTsKLQkJc2V0TnNQcmVmaXgoZU5TX1BSRUZJWCk7Ci0JCXNldE5zVVJJKGVOU19VUkkpOwotCi0JCS8vIEFkZCBzdXBlcnR5cGVzIHRvIGNsYXNzZXMKLQotCQkvLyBJbml0aWFsaXplIGNsYXNzZXMgYW5kIGZlYXR1cmVzOyBhZGQgb3BlcmF0aW9ucyBhbmQgcGFyYW1ldGVycwotCQlpbml0RUNsYXNzKAotCQkJCW9yZGVySW5mb0VDbGFzcywKLQkJCQlPcmRlckluZm8uY2xhc3MsCi0JCQkJIk9yZGVySW5mbyIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZSgKLQkJCQlnZXRPcmRlckluZm9fTmFtZSgpLAotCQkJCWVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksCi0JCQkJIm5hbWUiLCBudWxsLCAwLCAxLCBPcmRlckluZm8uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoCi0JCQkJZ2V0T3JkZXJJbmZvX0dVSURzKCksCi0JCQkJZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwKLQkJCQkiZ1VJRHMiLCBudWxsLCAwLCAtMSwgT3JkZXJJbmZvLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKAotCQkJCWdldE9yZGVySW5mb19UaW1lc3RhbXAoKSwKLQkJCQllY29yZVBhY2thZ2UuZ2V0RUxvbmcoKSwKLQkJCQkidGltZXN0YW1wIiwgbnVsbCwgMCwgMSwgT3JkZXJJbmZvLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcygKLQkJCQlvcmRlckluZm9Db2xsZWN0aW9uRUNsYXNzLAotCQkJCU9yZGVySW5mb0NvbGxlY3Rpb24uY2xhc3MsCi0JCQkJIk9yZGVySW5mb0NvbGxlY3Rpb24iLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0T3JkZXJJbmZvQ29sbGVjdGlvbl9PcmRlckluZm9zKCksCi0JCQkJdGhpcy5nZXRPcmRlckluZm8oKSwKLQkJCQludWxsLAotCQkJCSJvcmRlckluZm9zIiwgbnVsbCwgMCwgLTEsIE9yZGVySW5mb0NvbGxlY3Rpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQkvLyBDcmVhdGUgcmVzb3VyY2UKLQkJY3JlYXRlUmVzb3VyY2UoZU5TX1VSSSk7Ci0JfQotCi19IC8vIE1vZGVsUGFja2FnZUltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9tb2RlbC9pbXBsL09yZGVySW5mb0NvbGxlY3Rpb25JbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvbW9kZWwvaW1wbC9PcmRlckluZm9Db2xsZWN0aW9uSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZTg1MDFhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9tb2RlbC9pbXBsL09yZGVySW5mb0NvbGxlY3Rpb25JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLm1vZGVsLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5tb2RlbC5Nb2RlbFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLm1vZGVsLk9yZGVySW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwubW9kZWwuT3JkZXJJbmZvQ29sbGVjdGlvbjsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5PcmRlciBJbmZvIENvbGxlY3Rpb248L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwubW9kZWwuaW1wbC5PcmRlckluZm9Db2xsZWN0aW9uSW1wbCNnZXRPcmRlckluZm9zIDxlbT5PcmRlciBJbmZvczwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICogCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBPcmRlckluZm9Db2xsZWN0aW9uSW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMKLQkJT3JkZXJJbmZvQ29sbGVjdGlvbiB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0T3JkZXJJbmZvcygpIDxlbT5PcmRlciBJbmZvczwvZW0+fScKLQkgKiBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjZ2V0T3JkZXJJbmZvcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IG9yZGVySW5mb3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBPcmRlckluZm9Db2xsZWN0aW9uSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBNb2RlbFBhY2thZ2UuZUlOU1RBTkNFLmdldE9yZGVySW5mb0NvbGxlY3Rpb24oKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldE9yZGVySW5mb3MoKSB7Ci0JCWlmIChvcmRlckluZm9zID09IG51bGwpIHsKLQkJCW9yZGVySW5mb3MgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoT3JkZXJJbmZvLmNsYXNzLCB0aGlzLAotCQkJCQlNb2RlbFBhY2thZ2UuT1JERVJfSU5GT19DT0xMRUNUSU9OX19PUkRFUl9JTkZPUyk7Ci0JCX0KLQkJcmV0dXJuIG9yZGVySW5mb3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsCi0JCQlpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCWNhc2UgTW9kZWxQYWNrYWdlLk9SREVSX0lORk9fQ09MTEVDVElPTl9fT1JERVJfSU5GT1M6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdCkgZ2V0T3JkZXJJbmZvcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwKLQkJCQkJCW1zZ3MpOwotCQkJZGVmYXVsdDoKLQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywKLQkJCQkJCW1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQljYXNlIE1vZGVsUGFja2FnZS5PUkRFUl9JTkZPX0NPTExFQ1RJT05fX09SREVSX0lORk9TOgotCQkJcmV0dXJuIGdldE9yZGVySW5mb3MoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQljYXNlIE1vZGVsUGFja2FnZS5PUkRFUl9JTkZPX0NPTExFQ1RJT05fX09SREVSX0lORk9TOgotCQkJZ2V0T3JkZXJJbmZvcygpLmNsZWFyKCk7Ci0JCQlnZXRPcmRlckluZm9zKCkuYWRkQWxsKChDb2xsZWN0aW9uKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJY2FzZSBNb2RlbFBhY2thZ2UuT1JERVJfSU5GT19DT0xMRUNUSU9OX19PUkRFUl9JTkZPUzoKLQkJCWdldE9yZGVySW5mb3MoKS5jbGVhcigpOwotCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQljYXNlIE1vZGVsUGFja2FnZS5PUkRFUl9JTkZPX0NPTExFQ1RJT05fX09SREVSX0lORk9TOgotCQkJcmV0dXJuIG9yZGVySW5mb3MgIT0gbnVsbCAmJiAhb3JkZXJJbmZvcy5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotfSAvLyBPcmRlckluZm9Db2xsZWN0aW9uSW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL21vZGVsL2ltcGwvT3JkZXJJbmZvSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL21vZGVsL2ltcGwvT3JkZXJJbmZvSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMmNmMjU4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9tb2RlbC9pbXBsL09yZGVySW5mb0ltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwubW9kZWwuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRURhdGFUeXBlVW5pcXVlRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLm1vZGVsLk1vZGVsUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwubW9kZWwuT3JkZXJJbmZvOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk9yZGVyIEluZm88L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwubW9kZWwuaW1wbC5PcmRlckluZm9JbXBsI2dldE5hbWUgPGVtPk5hbWU8L2VtPn08L2xpPgotICogPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwubW9kZWwuaW1wbC5PcmRlckluZm9JbXBsI2dldEdVSURzIDxlbT5HVUkgRHM8L2VtPn08L2xpPgotICogPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwubW9kZWwuaW1wbC5PcmRlckluZm9JbXBsI2dldFRpbWVzdGFtcCA8ZW0+VGltZXN0YW1wPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKiAKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIE9yZGVySW5mb0ltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIE9yZGVySW5mbyB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWUoKSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZSgpIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjZ2V0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBuYW1lID0gTkFNRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEdVSURzKCkgPGVtPkdVSSBEczwvZW0+fScgYXR0cmlidXRlCi0JICogbGlzdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjZ2V0R1VJRHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBnVUlEcyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VGltZXN0YW1wKCkgPGVtPlRpbWVzdGFtcDwvZW0+fScKLQkgKiBhdHRyaWJ1dGUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI2dldFRpbWVzdGFtcCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBsb25nIFRJTUVTVEFNUF9FREVGQVVMVCA9IDBMOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VGltZXN0YW1wKCkgPGVtPlRpbWVzdGFtcDwvZW0+fScKLQkgKiBhdHRyaWJ1dGUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI2dldFRpbWVzdGFtcCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGxvbmcgdGltZXN0YW1wID0gVElNRVNUQU1QX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBPcmRlckluZm9JbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIE1vZGVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0T3JkZXJJbmZvKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5ld05hbWUpIHsKLQkJU3RyaW5nIG9sZE5hbWUgPSBuYW1lOwotCQluYW1lID0gbmV3TmFtZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJTW9kZWxQYWNrYWdlLk9SREVSX0lORk9fX05BTUUsIG9sZE5hbWUsIG5hbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldEdVSURzKCkgewotCQlpZiAoZ1VJRHMgPT0gbnVsbCkgewotCQkJZ1VJRHMgPSBuZXcgRURhdGFUeXBlVW5pcXVlRUxpc3QoU3RyaW5nLmNsYXNzLCB0aGlzLAotCQkJCQlNb2RlbFBhY2thZ2UuT1JERVJfSU5GT19fR1VJX0RTKTsKLQkJfQotCQlyZXR1cm4gZ1VJRHM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBsb25nIGdldFRpbWVzdGFtcCgpIHsKLQkJcmV0dXJuIHRpbWVzdGFtcDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VGltZXN0YW1wKGxvbmcgbmV3VGltZXN0YW1wKSB7Ci0JCWxvbmcgb2xkVGltZXN0YW1wID0gdGltZXN0YW1wOwotCQl0aW1lc3RhbXAgPSBuZXdUaW1lc3RhbXA7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCU1vZGVsUGFja2FnZS5PUkRFUl9JTkZPX19USU1FU1RBTVAsIG9sZFRpbWVzdGFtcCwgdGltZXN0YW1wKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJY2FzZSBNb2RlbFBhY2thZ2UuT1JERVJfSU5GT19fTkFNRToKLQkJCXJldHVybiBnZXROYW1lKCk7Ci0JCWNhc2UgTW9kZWxQYWNrYWdlLk9SREVSX0lORk9fX0dVSV9EUzoKLQkJCXJldHVybiBnZXRHVUlEcygpOwotCQljYXNlIE1vZGVsUGFja2FnZS5PUkRFUl9JTkZPX19USU1FU1RBTVA6Ci0JCQlyZXR1cm4gbmV3IExvbmcoZ2V0VGltZXN0YW1wKCkpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCWNhc2UgTW9kZWxQYWNrYWdlLk9SREVSX0lORk9fX05BTUU6Ci0JCQlzZXROYW1lKChTdHJpbmcpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBNb2RlbFBhY2thZ2UuT1JERVJfSU5GT19fR1VJX0RTOgotCQkJZ2V0R1VJRHMoKS5jbGVhcigpOwotCQkJZ2V0R1VJRHMoKS5hZGRBbGwoKENvbGxlY3Rpb24pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBNb2RlbFBhY2thZ2UuT1JERVJfSU5GT19fVElNRVNUQU1QOgotCQkJc2V0VGltZXN0YW1wKCgoTG9uZykgbmV3VmFsdWUpLmxvbmdWYWx1ZSgpKTsKLQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQljYXNlIE1vZGVsUGFja2FnZS5PUkRFUl9JTkZPX19OQU1FOgotCQkJc2V0TmFtZShOQU1FX0VERUZBVUxUKTsKLQkJCXJldHVybjsKLQkJY2FzZSBNb2RlbFBhY2thZ2UuT1JERVJfSU5GT19fR1VJX0RTOgotCQkJZ2V0R1VJRHMoKS5jbGVhcigpOwotCQkJcmV0dXJuOwotCQljYXNlIE1vZGVsUGFja2FnZS5PUkRFUl9JTkZPX19USU1FU1RBTVA6Ci0JCQlzZXRUaW1lc3RhbXAoVElNRVNUQU1QX0VERUZBVUxUKTsKLQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJY2FzZSBNb2RlbFBhY2thZ2UuT1JERVJfSU5GT19fTkFNRToKLQkJCXJldHVybiBOQU1FX0VERUZBVUxUID09IG51bGwgPyBuYW1lICE9IG51bGwgOiAhTkFNRV9FREVGQVVMVAotCQkJCQkuZXF1YWxzKG5hbWUpOwotCQljYXNlIE1vZGVsUGFja2FnZS5PUkRFUl9JTkZPX19HVUlfRFM6Ci0JCQlyZXR1cm4gZ1VJRHMgIT0gbnVsbCAmJiAhZ1VJRHMuaXNFbXB0eSgpOwotCQljYXNlIE1vZGVsUGFja2FnZS5PUkRFUl9JTkZPX19USU1FU1RBTVA6Ci0JCQlyZXR1cm4gdGltZXN0YW1wICE9IFRJTUVTVEFNUF9FREVGQVVMVDsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKQotCQkJcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAobmFtZTogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChuYW1lKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBnVUlEczogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChnVUlEcyk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgdGltZXN0YW1wOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKHRpbWVzdGFtcCk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvLyBPcmRlckluZm9JbXBsCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvbW9kZWwvaW1wbC9wYWNrYWdlLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvbW9kZWwvaW1wbC9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0ODJhYzIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL21vZGVsL2ltcGwvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgdGhlIGltcGxlbWVudGF0aW9uIGZvciBvcmRlcmluZyBjb250ZW50IGVsZW1lbnRzLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9tb2RlbC9wYWNrYWdlLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvbW9kZWwvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZjIzYmIxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9tb2RlbC9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyB0aGUgaW50ZXJmYWNlcyBmb3Igb3JkZXJpbmcgY29udGVudCBlbGVtZW50cy4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvbW9kZWwvdXRpbC9Nb2RlbEFkYXB0ZXJGYWN0b3J5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvbW9kZWwvdXRpbC9Nb2RlbEFkYXB0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1ZTkxMjguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL21vZGVsL3V0aWwvTW9kZWxBZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5tb2RlbC51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwubW9kZWwuTW9kZWxQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5tb2RlbC5PcmRlckluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLm1vZGVsLk9yZGVySW5mb0NvbGxlY3Rpb247Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBUaGUgPGI+QWRhcHRlciBGYWN0b3J5PC9iPiBmb3IgdGhlIG1vZGVsLiBJdAotICogcHJvdmlkZXMgYW4gYWRhcHRlciA8Y29kZT5jcmVhdGVYWFg8L2NvZGU+IG1ldGhvZCBmb3IgZWFjaCBjbGFzcyBvZiB0aGUKLSAqIG1vZGVsLiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIAotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwubW9kZWwuTW9kZWxQYWNrYWdlCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBNb2RlbEFkYXB0ZXJGYWN0b3J5IGV4dGVuZHMgQWRhcHRlckZhY3RvcnlJbXBsIHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIG1vZGVsIHBhY2thZ2UuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIE1vZGVsUGFja2FnZSBtb2RlbFBhY2thZ2U7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBhZGFwdGVyIGZhY3RvcnkuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBNb2RlbEFkYXB0ZXJGYWN0b3J5KCkgewotCQlpZiAobW9kZWxQYWNrYWdlID09IG51bGwpIHsKLQkJCW1vZGVsUGFja2FnZSA9IE1vZGVsUGFja2FnZS5lSU5TVEFOQ0U7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBmYWN0b3J5IGlzIGFwcGxpY2FibGUgZm9yIHRoZSB0eXBlIG9mIHRoZSBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+Ci0JICogaWYgdGhlIG9iamVjdCBpcyBlaXRoZXIgdGhlIG1vZGVsJ3MgcGFja2FnZSBvciBpcyBhbiBpbnN0YW5jZSBvYmplY3Qgb2YKLQkgKiB0aGUgbW9kZWwuIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gd2hldGhlciB0aGlzIGZhY3RvcnkgaXMgYXBwbGljYWJsZSBmb3IgdGhlIHR5cGUgb2YgdGhlIG9iamVjdC4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNGYWN0b3J5Rm9yVHlwZShPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChvYmplY3QgPT0gbW9kZWxQYWNrYWdlKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgRU9iamVjdCkgewotCQkJcmV0dXJuICgoRU9iamVjdCkgb2JqZWN0KS5lQ2xhc3MoKS5nZXRFUGFja2FnZSgpID09IG1vZGVsUGFja2FnZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogVGhlIHN3aXRjaCB0aGUgZGVsZWdhdGVzIHRvIHRoZSA8Y29kZT5jcmVhdGVYWFg8L2NvZGU+IG1ldGhvZHMuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBNb2RlbFN3aXRjaCBtb2RlbFN3aXRjaCA9IG5ldyBNb2RlbFN3aXRjaCgpIHsKLQkJcHVibGljIE9iamVjdCBjYXNlT3JkZXJJbmZvKE9yZGVySW5mbyBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVPcmRlckluZm9BZGFwdGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGNhc2VPcmRlckluZm9Db2xsZWN0aW9uKE9yZGVySW5mb0NvbGxlY3Rpb24gb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlT3JkZXJJbmZvQ29sbGVjdGlvbkFkYXB0ZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgZGVmYXVsdENhc2UoRU9iamVjdCBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVFT2JqZWN0QWRhcHRlcigpOwotCQl9Ci0JfTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gYWRhcHRlciBmb3IgdGhlIDxjb2RlPnRhcmdldDwvY29kZT4uIDwhLS0gYmVnaW4tdXNlci1kb2MKLQkgKiAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHBhcmFtIHRhcmdldAotCSAqICAgICAgICAgICAgdGhlIG9iamVjdCB0byBhZGFwdC4KLQkgKiBAcmV0dXJuIHRoZSBhZGFwdGVyIGZvciB0aGUgPGNvZGU+dGFyZ2V0PC9jb2RlPi4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQWRhcHRlcihOb3RpZmllciB0YXJnZXQpIHsKLQkJcmV0dXJuIChBZGFwdGVyKSBtb2RlbFN3aXRjaC5kb1N3aXRjaCgoRU9iamVjdCkgdGFyZ2V0KTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5tb2RlbC5PcmRlckluZm8gPGVtPk9yZGVyIEluZm88L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdAotCSAqIHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOyBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2UKLQkgKiB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5tb2RlbC5PcmRlckluZm8KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlT3JkZXJJbmZvQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwubW9kZWwuT3JkZXJJbmZvQ29sbGVjdGlvbiA8ZW0+T3JkZXIgSW5mbyBDb2xsZWN0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQKLQkgKiB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsgaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlCi0JICogd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwubW9kZWwuT3JkZXJJbmZvQ29sbGVjdGlvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVPcmRlckluZm9Db2xsZWN0aW9uQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciB0aGUgZGVmYXVsdCBjYXNlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBUaGlzCi0JICogZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwuIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVFT2JqZWN0QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19IC8vIE1vZGVsQWRhcHRlckZhY3RvcnkKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9tb2RlbC91dGlsL01vZGVsU3dpdGNoLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvbW9kZWwvdXRpbC9Nb2RlbFN3aXRjaC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZDkxNmNkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9tb2RlbC91dGlsL01vZGVsU3dpdGNoLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLm1vZGVsLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLm1vZGVsLk1vZGVsUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwubW9kZWwuT3JkZXJJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5tb2RlbC5PcmRlckluZm9Db2xsZWN0aW9uOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gVGhlIDxiPlN3aXRjaDwvYj4gZm9yIHRoZSBtb2RlbCdzIGluaGVyaXRhbmNlCi0gKiBoaWVyYXJjaHkuIEl0IHN1cHBvcnRzIHRoZSBjYWxsIHtAbGluayAjZG9Td2l0Y2goRU9iamVjdCkgZG9Td2l0Y2gob2JqZWN0KX0KLSAqIHRvIGludm9rZSB0aGUgPGNvZGU+Y2FzZVhYWDwvY29kZT4gbWV0aG9kIGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbCwKLSAqIHN0YXJ0aW5nIHdpdGggdGhlIGFjdHVhbCBjbGFzcyBvZiB0aGUgb2JqZWN0IGFuZCBwcm9jZWVkaW5nIHVwIHRoZQotICogaW5oZXJpdGFuY2UgaGllcmFyY2h5IHVudGlsIGEgbm9uLW51bGwgcmVzdWx0IGlzIHJldHVybmVkLCB3aGljaCBpcyB0aGUKLSAqIHJlc3VsdCBvZiB0aGUgc3dpdGNoLiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIAotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwubW9kZWwuTW9kZWxQYWNrYWdlCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBNb2RlbFN3aXRjaCB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCBtb2RlbCBwYWNrYWdlIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIE1vZGVsUGFja2FnZSBtb2RlbFBhY2thZ2U7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBzd2l0Y2guIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBNb2RlbFN3aXRjaCgpIHsKLQkJaWYgKG1vZGVsUGFja2FnZSA9PSBudWxsKSB7Ci0JCQltb2RlbFBhY2thZ2UgPSBNb2RlbFBhY2thZ2UuZUlOU1RBTkNFOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ2FsbHMgPGNvZGU+Y2FzZVhYWDwvY29kZT4gZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsIHVudGlsIG9uZQotCSAqIHJldHVybnMgYSBub24gbnVsbCByZXN1bHQ7IGl0IHlpZWxkcyB0aGF0IHJlc3VsdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBmaXJzdCBub24tbnVsbCByZXN1bHQgcmV0dXJuZWQgYnkgYSA8Y29kZT5jYXNlWFhYPC9jb2RlPgotCSAqICAgICAgICAgY2FsbC4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBkb1N3aXRjaChFT2JqZWN0IHRoZUVPYmplY3QpIHsKLQkJcmV0dXJuIGRvU3dpdGNoKHRoZUVPYmplY3QuZUNsYXNzKCksIHRoZUVPYmplY3QpOwotCX0KLQotCS8qKgotCSAqIENhbGxzIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbCB1bnRpbCBvbmUKLQkgKiByZXR1cm5zIGEgbm9uIG51bGwgcmVzdWx0OyBpdCB5aWVsZHMgdGhhdCByZXN1bHQuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgZmlyc3Qgbm9uLW51bGwgcmVzdWx0IHJldHVybmVkIGJ5IGEgPGNvZGU+Y2FzZVhYWDwvY29kZT4KLQkgKiAgICAgICAgIGNhbGwuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZG9Td2l0Y2goRUNsYXNzIHRoZUVDbGFzcywgRU9iamVjdCB0aGVFT2JqZWN0KSB7Ci0JCWlmICh0aGVFQ2xhc3MuZUNvbnRhaW5lcigpID09IG1vZGVsUGFja2FnZSkgewotCQkJcmV0dXJuIGRvU3dpdGNoKHRoZUVDbGFzcy5nZXRDbGFzc2lmaWVySUQoKSwgdGhlRU9iamVjdCk7Ci0JCX0gZWxzZSB7Ci0JCQlMaXN0IGVTdXBlclR5cGVzID0gdGhlRUNsYXNzLmdldEVTdXBlclR5cGVzKCk7Ci0JCQlyZXR1cm4gZVN1cGVyVHlwZXMuaXNFbXB0eSgpID8gZGVmYXVsdENhc2UodGhlRU9iamVjdCkgOiBkb1N3aXRjaCgKLQkJCQkJKEVDbGFzcykgZVN1cGVyVHlwZXMuZ2V0KDApLCB0aGVFT2JqZWN0KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENhbGxzIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbCB1bnRpbCBvbmUKLQkgKiByZXR1cm5zIGEgbm9uIG51bGwgcmVzdWx0OyBpdCB5aWVsZHMgdGhhdCByZXN1bHQuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgZmlyc3Qgbm9uLW51bGwgcmVzdWx0IHJldHVybmVkIGJ5IGEgPGNvZGU+Y2FzZVhYWDwvY29kZT4KLQkgKiAgICAgICAgIGNhbGwuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZG9Td2l0Y2goaW50IGNsYXNzaWZpZXJJRCwgRU9iamVjdCB0aGVFT2JqZWN0KSB7Ci0JCXN3aXRjaCAoY2xhc3NpZmllcklEKSB7Ci0JCWNhc2UgTW9kZWxQYWNrYWdlLk9SREVSX0lORk86IHsKLQkJCU9yZGVySW5mbyBvcmRlckluZm8gPSAoT3JkZXJJbmZvKSB0aGVFT2JqZWN0OwotCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VPcmRlckluZm8ob3JkZXJJbmZvKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJY2FzZSBNb2RlbFBhY2thZ2UuT1JERVJfSU5GT19DT0xMRUNUSU9OOiB7Ci0JCQlPcmRlckluZm9Db2xsZWN0aW9uIG9yZGVySW5mb0NvbGxlY3Rpb24gPSAoT3JkZXJJbmZvQ29sbGVjdGlvbikgdGhlRU9iamVjdDsKLQkJCU9iamVjdCByZXN1bHQgPSBjYXNlT3JkZXJJbmZvQ29sbGVjdGlvbihvcmRlckluZm9Db2xsZWN0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJZGVmYXVsdDoKLQkJCXJldHVybiBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5PcmRlciBJbmZvPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOyByZXR1cm5pbmcgYQotCSAqIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcGFyYW0gb2JqZWN0Ci0JICogICAgICAgICAgICB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk9yZGVyIEluZm88L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZU9yZGVySW5mbyhPcmRlckluZm8gb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5PcmRlciBJbmZvIENvbGxlY3Rpb248L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7IHJldHVybmluZyBhCi0JICogbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBwYXJhbSBvYmplY3QKLQkgKiAgICAgICAgICAgIHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+T3JkZXIgSW5mbyBDb2xsZWN0aW9uPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VPcmRlckluZm9Db2xsZWN0aW9uKE9yZGVySW5mb0NvbGxlY3Rpb24gb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FT2JqZWN0PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOyByZXR1cm5pbmcgYQotCSAqIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLCBidXQgdGhpcyBpcyB0aGUgbGFzdCBjYXNlCi0JICogYW55d2F5LiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcGFyYW0gb2JqZWN0Ci0JICogICAgICAgICAgICB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVPYmplY3Q8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZGVmYXVsdENhc2UoRU9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19IC8vIE1vZGVsU3dpdGNoCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvbW9kZWwvdXRpbC9TdHJpbmdSZXNvdXJjZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL21vZGVsL3V0aWwvU3RyaW5nUmVzb3VyY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzE1ZGU0YS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvbW9kZWwvdXRpbC9TdHJpbmdSZXNvdXJjZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLm1vZGVsLnV0aWw7Ci0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5TdHJpbmdCdWZmZXJJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuaW1wbC5YTUlSZXNvdXJjZUltcGw7Ci0KLS8qKgotICogUmVzb3VyY2UgdG8gc3RvcmUgc3RyaW5nCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgIDEuMAotICovCi1wdWJsaWMgY2xhc3MgU3RyaW5nUmVzb3VyY2UgZXh0ZW5kcyBYTUlSZXNvdXJjZUltcGwgewotCXByaXZhdGUgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG91dDsKLQotCXByaXZhdGUgU3RyaW5nIHN0cjsKLQotCXB1YmxpYyBTdHJpbmdSZXNvdXJjZShTdHJpbmcgc3RyKSB7Ci0JCXRoaXMuc3RyID0gc3RyOwotCX0KLQotCXB1YmxpYyB2b2lkIHNhdmUoTWFwIG9wdGlvbnMpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCW91dCA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLQkJdHJ5IHsKLQkJCXNhdmUob3V0LCBvcHRpb25zKTsKLQkJfSBmaW5hbGx5IHsKLQkJCW91dC5jbG9zZSgpOwotCQl9Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRTdHJpbmcoKSB7Ci0JCWlmIChvdXQgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlpZiAoZW5jb2RpbmcgPT0gbnVsbCkgewotCQkJcmV0dXJuIG91dC50b1N0cmluZygpOwotCQl9Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gb3V0LnRvU3RyaW5nKGVuY29kaW5nKTsKLQkJfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIGxvYWQoTWFwIG9wdGlvbnMpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWlmICghaXNMb2FkZWQpIHsKLQkJCUlucHV0U3RyZWFtIGlucHV0U3RyZWFtID0gbmV3IFN0cmluZ0J1ZmZlcklucHV0U3RyZWFtKHN0cik7Ci0JCQl0cnkgewotCQkJCWxvYWQoaW5wdXRTdHJlYW0sIG9wdGlvbnMpOwotCQkJfSBmaW5hbGx5IHsKLQkJCQlpbnB1dFN0cmVhbS5jbG9zZSgpOwotCQkJfQotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvbW9kZWwvdXRpbC9wYWNrYWdlLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvbW9kZWwvdXRpbC9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3MWFhZjIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL21vZGVsL3V0aWwvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgaW1wbGVtZW50YXRpb24gc3VwcG9ydCBmb3Igb3JkZXJpbmcgY29udGVudCBlbGVtZW50cy4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvcGFja2FnZS5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDc4Yjc0MS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgZWRpdGluZyBhbmQgcXVlcnlpbmcgc3VwcG9ydCBmb3IgbWV0aG9kIGxpYnJhcnkgZWxlbWVudHMuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC92YWxpZGF0aW9uL0Fic3RyYWN0U3RyaW5nVmFsaWRhdG9yLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3ZhbGlkYXRpb24vQWJzdHJhY3RTdHJpbmdWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmZmMjY4Zi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3ZhbGlkYXRpb24vQWJzdHJhY3RTdHJpbmdWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFBsdWdpbjsKLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlICAxLjAKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0U3RyaW5nVmFsaWRhdG9yIGltcGxlbWVudHMgSVZhbGlkYXRvciB7Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLklWYWxpZGF0b3IjaXNWYWxpZChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBJU3RhdHVzIGlzVmFsaWQoT2JqZWN0IHZhbHVlKSB7Ci0JCWlmKHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0JCQlTdHJpbmcgbXNnID0gaXNWYWxpZCgoU3RyaW5nKXZhbHVlKTsKLQkJCWlmKG1zZyA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBMaWJyYXJ5RWRpdFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SWQoKSwKLQkJCQkJCTAsIG1zZywgbnVsbCk7Ci0JCQl9Ci0JCX0KLQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdmFsaWRhdGlvbi9DaXJjdWxhckRlcGVuZGVuY3lDaGVjay5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC92YWxpZGF0aW9uL0NpcmN1bGFyRGVwZW5kZW5jeUNoZWNrLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhZGMwZDUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC92YWxpZGF0aW9uL0NpcmN1bGFyRGVwZW5kZW5jeUNoZWNrLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudDsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGRvZXMgY2lyY3VsYXIgZGVwZW5kZW5jeSBjaGVjawotICogCi0gKiBAYXV0aG9yIFdlaXBpbmcgTHUKLSAqIEBzaW5jZSAxLjIKLSAqLwotcHVibGljIGNsYXNzIENpcmN1bGFyRGVwZW5kZW5jeUNoZWNrIHsKLQkJCi0JcHJpdmF0ZSBEZXBlbmRlbmN5SW5mb01nciBkZXBJbmZvTWdyOwotCXByaXZhdGUgSURlcGVuZGVuY3lJbmZvIHZlSW5mbzsKLQlwcml2YXRlIGJvb2xlYW4gbW92ZSA9IGZhbHNlOwotCQotCXB1YmxpYyBDaXJjdWxhckRlcGVuZGVuY3lDaGVjayhEZXBlbmRlbmN5SW5mb01nciBtZ3IsIFZhcmlhYmlsaXR5RWxlbWVudCB2ZSwKLQkJCQkJCQkJYm9vbGVhbiBmaWx0ZXIsIGJvb2xlYW4gbW92ZSkgewotCQlkZXBJbmZvTWdyID0gbWdyOwotCQl2ZUluZm8gPSBkZXBJbmZvTWdyLnJlZ2lzdGVyVmFyaWFiaWxpdHlFbGVtZW50KHZlLCBmaWx0ZXIsIGZhbHNlKTsKLQkJdGhpcy5tb3ZlID0gbW92ZTsKLQl9Ci0JCi0JcHJvdGVjdGVkIERlcGVuZGVuY3lJbmZvTWdyIGdldERlcEluZm9NZ3IoKSB7Ci0JCXJldHVybiBkZXBJbmZvTWdyOwotCX0KLQkKLQlwcm90ZWN0ZWQgSURlcGVuZGVuY3lJbmZvIGdldFZlSW5mbygpIHsKLQkJcmV0dXJuIHZlSW5mbzsKLQl9Ci0JCQotCXB1YmxpYyBib29sZWFuIGFjY2VwdChPYmplY3Qgb2JqKSB7Ci0KLQkJaWYgKHJlYWNoYWJsZShvYmosIHRydWUsIHRydWUpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJCi0JCWlmIChtb3ZlKSB7Ci0JCQlpZighKG9iaiBpbnN0YW5jZW9mIFZhcmlhYmlsaXR5RWxlbWVudCkpIHJldHVybiB0cnVlOwotCQkJVmFyaWFiaWxpdHlFbGVtZW50IG9ialZlQmFzZSA9ICgoVmFyaWFiaWxpdHlFbGVtZW50KSBvYmopLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsKLQkJCWlmIChvYmpWZUJhc2UgIT0gbnVsbCkgewotCQkJCUlEZXBlbmRlbmN5SW5mbyBpbmZvID0gZGVwSW5mb01nci5yZWdpc3RlclZhcmlhYmlsaXR5RWxlbWVudChvYmpWZUJhc2UsIGZhbHNlLCBmYWxzZSk7CQotCQkJCWlmIChpbmZvLnJlYWNoYWJsZUJ5KHZlSW5mbykpIHsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCX0KLQkJfQotCQkJCQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JcHJpdmF0ZSBib29sZWFuIHJlYWNoYWJsZShPYmplY3Qgb2JqLCBib29sZWFuIGNoZWNrUmVhY2hhYmxlQnlPYmosIGJvb2xlYW4gY2hlY2tSZWFjaGFibGVUb09iaikgewotCQlpZiAoISAob2JqIGluc3RhbmNlb2YgVmFyaWFiaWxpdHlFbGVtZW50KSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCQotCQlWYXJpYWJpbGl0eUVsZW1lbnQgdmUgPSAoVmFyaWFiaWxpdHlFbGVtZW50KSB2ZUluZm8uZ2V0RWxlbWVudCgpOwotCQlpZiAodmUgPT0gb2JqKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsJCQkKLQkJfQotCi0JCUlEZXBlbmRlbmN5SW5mbyBvYmpWZUluZm8gPSBkZXBJbmZvTWdyLnJlZ2lzdGVyVmFyaWFiaWxpdHlFbGVtZW50KCAoVmFyaWFiaWxpdHlFbGVtZW50KSBvYmosIGZhbHNlLCBtb3ZlKTsJCQotCQkKLQkJaWYgKGNoZWNrUmVhY2hhYmxlQnlPYmogJiYgdmVJbmZvLnJlYWNoYWJsZUJ5KG9ialZlSW5mbykpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCQotCQlpZiAoY2hlY2tSZWFjaGFibGVUb09iaiAmJiBvYmpWZUluZm8ucmVhY2hhYmxlQnkodmVJbmZvKSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0JCQotCQkKLQkJcmV0dXJuIGZhbHNlOwotCX0JCi0JCi0JcHVibGljIGJvb2xlYW4gcmVhY2hhYmxlQnkoT2JqZWN0IG9iaikgewotCQlyZXR1cm4gcmVhY2hhYmxlKG9iaiwgdHJ1ZSwgZmFsc2UpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiByZWFjaGFibGVUbyhPYmplY3Qgb2JqKSB7Ci0JCXJldHVybiByZWFjaGFibGUob2JqLCBmYWxzZSwgdHJ1ZSk7Ci0JfQkKLQkKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdmFsaWRhdGlvbi9DaXJjdWxhckRlcGVuZGVuY3lDaGVja0ZpbHRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC92YWxpZGF0aW9uL0NpcmN1bGFyRGVwZW5kZW5jeUNoZWNrRmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiNzUzYWQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC92YWxpZGF0aW9uL0NpcmN1bGFyRGVwZW5kZW5jeUNoZWNrRmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50OwotCi0vKioKLSAqIFRoaXMgY2xhc3MgaW1wbGVtZW50cyBhIGZpbHRlciBmb3IgY2lyY3VsYXIgZGVwZW5kZW5jeSBjaGVjawotICogCi0gKiBAYXV0aG9yIFdlaXBpbmcgTHUKLSAqIEBzaW5jZSAxLjIKLSAqLwotcHVibGljIGNsYXNzIENpcmN1bGFyRGVwZW5kZW5jeUNoZWNrRmlsdGVyIGV4dGVuZHMgQ2lyY3VsYXJEZXBlbmRlbmN5Q2hlY2sgaW1wbGVtZW50cyBJRmlsdGVyIHsJCi0JCi0JcHJpdmF0ZSBNYXAgYW5jZXN0b3JNYXA7Ci0JCi0JCi0JcHVibGljIENpcmN1bGFyRGVwZW5kZW5jeUNoZWNrRmlsdGVyKERlcGVuZGVuY3lJbmZvTWdyIG1nciwgVmFyaWFiaWxpdHlFbGVtZW50IHZlKSB7Ci0JCXN1cGVyKG1nciwgdmUsIHRydWUsIGZhbHNlKTsKLQkJCi0JCQotCQkKLQl9CQkJCi0JCi0JcHVibGljIGJvb2xlYW4gYWNjZXB0KE9iamVjdCBvYmopIHsKLQkJcmV0dXJuIHN1cGVyLmFjY2VwdChvYmopOwotCX0KLQkKLS8qCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBWZVRvQ2hlY2soT2JqZWN0IG9iaikgewotCQlyZXR1cm4gCW9iaiBpbnN0YW5jZW9mIERvbWFpbiB8fCAJCQkJLy9nZXRTdWJkb21haW5zCi0JCQkJb2JqIGluc3RhbmNlb2YgQ3VzdG9tQ2F0ZWdvcnkgfHwgCQkvL2dldFN1YkNhdGVnb3JpZXMKLQkJCQlvYmogaW5zdGFuY2VvZiBBcnRpZmFjdCB8fCAJCQkJLy9nZXRDb250YWluZWRBcnRpZmFjdHMKLQkJCQlvYmogaW5zdGFuY2VvZiBQcmFjdGljZSB8fCAJCQkJLy9nZXRTdWJQcmFjdGljZXMKLQkJCQlvYmogaW5zdGFuY2VvZiBEZWxpdmVyYWJsZSB8fAkJCS8vZ2V0RGVsaXZlcmVkV29ya1Byb2R1Y3RzCi0JCQkJb2JqIGluc3RhbmNlb2YgQWN0aXZpdHk7CQkJCS8vZ2V0QnJlYWtkb3duRWxlbWVudHMKLQl9Ki8KLQkKLQkKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdmFsaWRhdGlvbi9EZXBlbmRlbmN5Q2hlY2tlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC92YWxpZGF0aW9uL0RlcGVuZGVuY3lDaGVja2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmN2UwYmIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC92YWxpZGF0aW9uL0RlcGVuZGVuY3lDaGVja2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NzIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQWJzdHJhY3RUcmVlSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Qcm9jZXNzVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQXJ0aWZhY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ3VzdG9tQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaWJhYmxlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgaGFzIHN0YXRpYyBtZXRob2RzIHRoYXQgY2hlY2sgZm9yIGN5Y2xlcyBpbiB0aGUgZWxlbWVudCBkZXBlbmRlbmN5Ci0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBEZXBlbmRlbmN5Q2hlY2tlciB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSVN0YXR1cyBFUlJPUl9TVEFUVVMgPSBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsCi0JCQlMaWJyYXJ5RWRpdFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SWQoKSwgMCwgIiIsIG51bGwpOyAvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIHN0YXRpYyBib29sZWFuIG5ld0NoZWNrIAkJPSB0cnVlOwkJCS8vdGVtcCBmbGFnLCB3aWxsIGJlIHJlbW92ZWQhCi0JcHVibGljIHN0YXRpYyBib29sZWFuIG5ld0NoZWNrQWN0IAk9IHRydWU7CQkJLy90ZW1wIGZsYWcsIHdpbGwgYmUgcmVtb3ZlZCEKLQotCS8qKgotCSAqIENoZWNrcyBmb3IgdGhlIGN5Y2xlcyBpbiB0aGUgZGVwZW5kZW5jeSBncmFwaCBvZiB0aGUgZ2l2ZW4gZmVhdHVyZSBpZiB0aGUKLQkgKiBnaXZlbiB2YWx1ZSBpcyBhZGRlZC9hc3NpZ25lZCB0byBpdC4KLQkgKiAKLQkgKiBAcGFyYW0gb3duZXIKLQkgKiAgICAgICAgICAgIHRoZSBvd25lciBvZiB0aGUgZmVhdHVyZQotCSAqIEBwYXJhbSBmZWF0dXJlCi0JICogICAgICAgICAgICB0aGUgZmVhdHVyZSB0byBjaGVjayBmb3IgY2lyY3VsYXIgZGVwZW5kZW5jeQotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgdGhlIHZhbHVlIHRvIGJlIGFkZGVkL2Fzc2lnbmVkIHRvIHRoZSBmZWF0dXJlCi0JICogQHJldHVybiBjaGVjayBzdGF0dXMsIE9LIGlmIG5vIGN5Y2xlLCBFUlJPUiBpZiB0aGVyZSB3aWxsIGJlIGNpcmN1bGFyCi0JICogICAgICAgICBkZXBlbmRlbmN5Ci0JICovCi0JcHVibGljIHN0YXRpYyBJU3RhdHVzIGNoZWNrQ2lyY3VsYXJEZXBlbmRlbmN5KEVPYmplY3Qgb3duZXIsCi0JCQlmaW5hbCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgT2JqZWN0IHZhbHVlKSB7Ci0JCWlmIChmZWF0dXJlID09IFVtYVBhY2thZ2UuTGl0ZXJhbHMuQUNUSVZJVFlfX0JSRUFLRE9XTl9FTEVNRU5UUykgewotCQkJaWYgKHZhbHVlIGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQlBY3Rpdml0eSBhY3Rpdml0eSA9IChBY3Rpdml0eSkgb3duZXI7Ci0JCQkJVmFyaWFiaWxpdHlUeXBlIHR5cGUgPSBhY3Rpdml0eS5nZXRWYXJpYWJpbGl0eVR5cGUoKTsKLQkJCQlyZXR1cm4gY2hlY2tDaXJjdWxhckRlcGVuZGVuY3koYWN0aXZpdHksIChBY3Rpdml0eSkgdmFsdWUsIHR5cGUpOwotCQkJfQotCQl9IGVsc2UgaWYgKGZlYXR1cmUgPT0gVW1hUGFja2FnZS5MaXRlcmFscy5WQVJJQUJJTElUWV9FTEVNRU5UX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UKSB7Ci0JCQlpZiAoaXNDaXJjdWxhckRlcGVuZGVuY3koKFZhcmlhYmlsaXR5RWxlbWVudCkgb3duZXIsCi0JCQkJCShWYXJpYWJpbGl0eUVsZW1lbnQpIHZhbHVlKSkgewotCQkJCXJldHVybiBFUlJPUl9TVEFUVVM7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoZmVhdHVyZSA9PSBVbWFQYWNrYWdlLkxpdGVyYWxzLkRFTElWRVJBQkxFX19ERUxJVkVSRURfV09SS19QUk9EVUNUUykgewotCQkJaWYgKCFjaGVja0NpcmN1bGFyRGVsaXZlcmFibGVzKChEZWxpdmVyYWJsZSl2YWx1ZSwgKERlbGl2ZXJhYmxlKW93bmVyKSkgewotCQkJCXJldHVybiBFUlJPUl9TVEFUVVM7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoZmVhdHVyZS5pc01hbnkoKSkgewotCQkJCUl0ZXJhdG9yIGl0ZXIgPSBuZXcgQWJzdHJhY3RUcmVlSXRlcmF0b3IodmFsdWUpIHsKLQotCQkJCQkvKioKLQkJCQkJICogQ29tbWVudCBmb3IgPGNvZGU+c2VyaWFsVmVyc2lvblVJRDwvY29kZT4KLQkJCQkJICovCi0JCQkJCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDBMOwotCi0JCQkJCXByb3RlY3RlZCBJdGVyYXRvciBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJCQlpZiAoZmVhdHVyZS5nZXRDb250YWluZXJDbGFzcygpLmlzSW5zdGFuY2Uob2JqZWN0KSkgewotCQkJCQkJCUVPYmplY3QgZU9iamVjdCA9IChFT2JqZWN0KSBvYmplY3Q7Ci0JCQkJCQkJTGlzdCBsaXN0ID0gKExpc3QpIGVPYmplY3QuZUdldChmZWF0dXJlKTsKLQkJCQkJCQlpZiAoIWxpc3QuaXNFbXB0eSgpKSB7Ci0JCQkJCQkJCUFycmF5TGlzdCBjaGlsZHJlbiA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGxpc3QuaXRlcmF0b3IoKTsgaXRlcmF0b3IKLQkJCQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCQkJCQlpZiAoZmVhdHVyZS5nZXRDb250YWluZXJDbGFzcygpLmlzSW5zdGFuY2UoCi0JCQkJCQkJCQkJCWVsZW1lbnQpKSB7Ci0JCQkJCQkJCQkJY2hpbGRyZW4uYWRkKGVsZW1lbnQpOwotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJCXJldHVybiBjaGlsZHJlbi5pdGVyYXRvcigpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNULml0ZXJhdG9yKCk7Ci0JCQkJCX0KLQotCQkJCX07Ci0KLQkJCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCQkJaWYgKGl0ZXIubmV4dCgpID09IG93bmVyKSB7Ci0JCQkJCQlyZXR1cm4gRVJST1JfU1RBVFVTOwotCQkJCQl9Ci0JCQkJfQotCi0JCQl9IGVsc2UgewotCQkJCWlmIChmZWF0dXJlLmdldENvbnRhaW5lckNsYXNzKCkuaXNJbnN0YW5jZSh2YWx1ZSkpIHsKLQkJCQkJRU9iamVjdCB2ID0gKEVPYmplY3QpIHZhbHVlOwotCQkJCQlkbyB7Ci0JCQkJCQlpZiAodiA9PSBvd25lcikgewotCQkJCQkJCXJldHVybiBFUlJPUl9TVEFUVVM7Ci0JCQkJCQl9Ci0JCQkJCQlPYmplY3QgbyA9IHYuZUdldChmZWF0dXJlKTsKLQkJCQkJCWlmIChmZWF0dXJlLmdldENvbnRhaW5lckNsYXNzKCkuaXNJbnN0YW5jZShvKSkgewotCQkJCQkJCXYgPSAoRU9iamVjdCkgbzsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJdiA9IG51bGw7Ci0JCQkJCQl9Ci0JCQkJCX0gd2hpbGUgKHYgIT0gbnVsbCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JfQotCi0JLyoqCi0JICogQ2hlY2tzIGZvciBjaXJjdWxhciBkZXBlbmRlbmN5IGlmIHRoZSBnaXZlbiBhY3Rpdml0eSBpcyBhcHBsaWVkIHRvIHRoZQotCSAqIGdpdmVuIHRhcmdldCBhY3Rpdml0eSB2aWEgZXh0ZW5kIG9yIGNvcHkuCi0JICogCi0JICogQHBhcmFtIGFjdGl2aXR5IGFjdGl2aXR5IHRvIGFwcGx5Ci0JICogQHBhcmFtIHRhcmdldCB0YXJnZXQgYWN0aXZpdHkgdG8gYWRkIGV4dGVuc2lvbiBvciBjb3B5IG9mIHRoZSBnaXZlbiBhY3Rpdml0eQotCSAqIEByZXR1cm4gc3RhdHVzIG9mIHRoaXMgY2hlY2sKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElTdGF0dXMgY2hlY2tDaXJjdWxhckRlcGVuZGVuY3koQWN0aXZpdHkgYWN0aXZpdHksIEFjdGl2aXR5IHRhcmdldCkgewotCQlpZiAoaXNQYXJlbnQoYWN0aXZpdHksIHRhcmdldCkpIHsKLQkJCU9iamVjdFtdIGFyZ3MgPSB7IHRhcmdldC5nZXROYW1lKCkgfTsKLQkJCVN0cmluZyBtZXNzYWdlID0gTkxTCi0JCQkJCS5iaW5kKAotCQkJCQkJCUxpYnJhcnlFZGl0UmVzb3VyY2VzLmFjdGl2aXR5X3ZhcmlhYmlsaXR5X2Vycm9yX21zZzEsCi0JCQkJCQkJYXJncyk7Ci0KLQkJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIExpYnJhcnlFZGl0UGx1Z2luLmdldERlZmF1bHQoKQotCQkJCQkuZ2V0SWQoKSwgMCwgbWVzc2FnZSwgbnVsbCk7Ci0JCX0KLQkJUHJvY2VzcyBwcm9jZXNzID0gVG5nVXRpbC5nZXRPd25pbmdQcm9jZXNzKHRhcmdldCk7Ci0JCWlmKCFuZXdDaGVja0FjdCAmJiBoYXNDeWNsaWNEZXBlbmRlbmN5KGFjdGl2aXR5LCBwcm9jZXNzKSB8fAotCQkJCW5ld0NoZWNrQWN0ICYmIHNvdXJjZVJlYWNoYWJsZUJ5VGFyZ2V0KGFjdGl2aXR5LCB0YXJnZXQpKSB7Ci0JCQlPYmplY3RbXSBhcmdzID0geyBhY3Rpdml0eS5nZXROYW1lKCksIHByb2Nlc3MuZ2V0TmFtZSgpIH07Ci0JCQlTdHJpbmcgbWVzc2FnZSA9IE5MUy5iaW5kKAotCQkJCQkJCUxpYnJhcnlFZGl0UmVzb3VyY2VzLmFwcGx5X3BhdHRlcm5fZXJyb3JfbXNnLAotCQkJCQkJCWFyZ3MpOwotCi0JCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBMaWJyYXJ5RWRpdFBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCQkJLmdldElkKCksIDAsIG1lc3NhZ2UsIG51bGwpOwotCQl9Ci0JCWVsc2UgaWYoUHJvY2Vzc1V0aWwuaGFzQ29udHJpYnV0b3JPclJlcGxhY2VyKGFjdGl2aXR5KSkgewotCQkJT2JqZWN0W10gYXJncyA9IHsgYWN0aXZpdHkuZ2V0TmFtZSgpLCBwcm9jZXNzLmdldE5hbWUoKSB9OwotCQkJU3RyaW5nIG1lc3NhZ2UgPSBOTFMKLQkJCQkJLmJpbmQoCi0JCQkJCQkJTGlicmFyeUVkaXRSZXNvdXJjZXMuYXBwbHlfcGF0dGVybl9lcnJvcl9tc2cxLAotCQkJCQkJCWFyZ3MpOwotCi0JCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBMaWJyYXJ5RWRpdFBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCQkJLmdldElkKCksIDAsIG1lc3NhZ2UsIG51bGwpOwotCi0JCX0KLQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaGFzQ3ljbGljRGVwZW5kZW5jeShBY3Rpdml0eSBhY3Rpdml0eSwgUHJvY2VzcyBwcm9jZXNzKSB7Ci0JCUl0ZXJhdG9yIGl0ZXIgPSBuZXcgQWJzdHJhY3RUcmVlSXRlcmF0b3IoYWN0aXZpdHkpIHsKLQotCQkJLyoqCi0JCQkgKiBDb21tZW50IGZvciA8Y29kZT5zZXJpYWxWZXJzaW9uVUlEPC9jb2RlPgotCQkJICovCi0JCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAwTDsKLQotCQkJcHJvdGVjdGVkIEl0ZXJhdG9yIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQkJQXJyYXlMaXN0IGNoaWxkcmVuID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gKChBY3Rpdml0eSkgb2JqZWN0KQotCQkJCQkJCS5nZXRCcmVha2Rvd25FbGVtZW50cygpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yCi0JCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCU9iamVjdCBlbGVtZW50ID0gaXRlcmF0b3IubmV4dCgpOwotCQkJCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBWYXJpYWJpbGl0eUVsZW1lbnQpIHsKLQkJCQkJCQljaGlsZHJlbi5hZGQoZWxlbWVudCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIGNoaWxkcmVuLml0ZXJhdG9yKCk7Ci0JCQkJfQotCQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNULml0ZXJhdG9yKCk7Ci0JCQl9Ci0KLQkJfTsKLQotCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCVZhcmlhYmlsaXR5RWxlbWVudCB2ZSA9IChWYXJpYWJpbGl0eUVsZW1lbnQpIGl0ZXIubmV4dCgpOwotCQkJVmFyaWFiaWxpdHlFbGVtZW50IGJhc2UgPSB2ZS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCk7Ci0JCQlWYXJpYWJpbGl0eVR5cGUgdlR5cGUgPSB2ZS5nZXRWYXJpYWJpbGl0eVR5cGUoKTsKLQkJCWlmIChiYXNlICE9IG51bGwgJiYgKHZUeXBlID09IFZhcmlhYmlsaXR5VHlwZS5FWFRFTkRTKSkgewotCQkJCVByb2Nlc3MgcHJvYyA9IFRuZ1V0aWwKLQkJCQkJCS5nZXRPd25pbmdQcm9jZXNzKChCcmVha2Rvd25FbGVtZW50KSBiYXNlKTsKLQkJCQlpZiAocHJvYyA9PSBwcm9jZXNzKSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBDaGVja3MgaWYgdGhlIGdpdmVuIHBhcmVudCBpcyBhIHN1cGVyIGFjdGl2aXR5IG9mIGNoaWxkLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiBAcGFyYW0gY2hpbGQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzUGFyZW50KEFjdGl2aXR5IHBhcmVudCwgQnJlYWtkb3duRWxlbWVudCBjaGlsZCkgewotCQlmb3IgKEFjdGl2aXR5IGFjdCA9IGNoaWxkLmdldFN1cGVyQWN0aXZpdGllcygpOyBhY3QgIT0gbnVsbDsgYWN0ID0gYWN0Ci0JCQkJLmdldFN1cGVyQWN0aXZpdGllcygpKSB7Ci0JCQlpZiAoYWN0ID09IHBhcmVudCkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBDaGVja3MgZm9yIGN5Y2xlcyBpbiBkZXBlbmRlbmN5IHBhdGggb2YgdGhlIGdpdmVuIGFjdGl2aXR5Ci0JICogPGNvZGU+YWN0PC9jb2RlPiBpZiA8Y29kZT5iYXNlPC9jb2RlPiBpcyB0aGUgYmFzZSBhY3Rpdml0eSBvZgotCSAqIDxjb2RlPmFjdDwvY29kZT4gZm9yIGdpdmVuIHZhcmlhYmlsaXR5IHR5cGUKLQkgKiAKLQkgKiBAcGFyYW0gYWN0Ci0JICogQHBhcmFtIGJhc2UKLQkgKiBAcGFyYW0gdHlwZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElTdGF0dXMgY2hlY2tDaXJjdWxhckRlcGVuZGVuY3koQWN0aXZpdHkgYWN0LCBBY3Rpdml0eSBiYXNlLAotCQkJVmFyaWFiaWxpdHlUeXBlIHR5cGUpIHsKLQkJcmV0dXJuIGNoZWNrQ2lyY3VsYXJEZXBlbmRlbmN5KGFjdCwgYmFzZSwgdHlwZSwgZmFsc2UpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIElTdGF0dXMgY2hlY2tDaXJjdWxhckRlcGVuZGVuY3lBZnRlckZpbHRlclNlbGVjdGlvbihBY3Rpdml0eSBhY3QsIEFjdGl2aXR5IGJhc2UsCi0JCQlWYXJpYWJpbGl0eVR5cGUgdHlwZSkgewotCQlyZXR1cm4gY2hlY2tDaXJjdWxhckRlcGVuZGVuY3koYWN0LCBiYXNlLCB0eXBlLCB0cnVlKTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgSVN0YXR1cyBjaGVja0NpcmN1bGFyRGVwZW5kZW5jeShBY3Rpdml0eSBhY3QsIEFjdGl2aXR5IGJhc2UsCi0JCQlWYXJpYWJpbGl0eVR5cGUgdHlwZSwgYm9vbGVhbiBmaWx0ZXJpbmcpIHsKLQkJaWYoKGJhc2UgaW5zdGFuY2VvZiBQcm9jZXNzKQotCQkJCSYmICh0eXBlID09IFZhcmlhYmlsaXR5VHlwZS5SRVBMQUNFUykgJiYgIShhY3QgaW5zdGFuY2VvZiBQcm9jZXNzKSkgewotCQkJU3RyaW5nIG1lc3NhZ2UgPSBMaWJyYXJ5RWRpdFJlc291cmNlcy5hY3Rpdml0eV92YXJpYWJpbGl0eV9lcnJvcl9tc2czOwotCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgTGlicmFyeUVkaXRQbHVnaW4uZ2V0RGVmYXVsdCgpCi0JCQkJCS5nZXRJZCgpLCAwLCBtZXNzYWdlLCBudWxsKTsKLQkJfQotCQllbHNlIGlmIChpc1BhcmVudChiYXNlLCBhY3QpKSB7Ci0JCQlPYmplY3RbXSBhcmdzID0geyBhY3QuZ2V0TmFtZSgpIH07Ci0JCQlTdHJpbmcgbWVzc2FnZSA9IE5MUwotCQkJCQkuYmluZCgKLQkJCQkJCQlMaWJyYXJ5RWRpdFJlc291cmNlcy5hY3Rpdml0eV92YXJpYWJpbGl0eV9lcnJvcl9tc2cxLAotCQkJCQkJCWFyZ3MpOwotCi0JCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBMaWJyYXJ5RWRpdFBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCQkJLmdldElkKCksIDAsIG1lc3NhZ2UsIG51bGwpOwotCQl9IAotCQllbHNlIGlmIChuZXdDaGVja0FjdCAmJiBmaWx0ZXJpbmcpIHsKLQkJCUlGaWx0ZXIgZmlsdGVyID0gZ2V0Q2lyY3VsYXJEZXBlbmRlbmN5Q2hlY2tGaWx0ZXIoYWN0KTsKLQkJCWlmICghIGZpbHRlci5hY2NlcHQoYmFzZSkpIHsKLQkJCQlPYmplY3RbXSBhcmdzID0geyBhY3QuZ2V0TmFtZSgpLCBiYXNlLmdldE5hbWUoKSB9OwotCQkJCVN0cmluZyBtZXNzYWdlID0gTkxTCi0JCQkJCQkuYmluZCgKLQkJCQkJCQkJTGlicmFyeUVkaXRSZXNvdXJjZXMuYWN0aXZpdHlfdmFyaWFiaWxpdHlfZXJyb3JfbXNnMiwKLQkJCQkJCQkJYXJncyk7Ci0KLQkJCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBMaWJyYXJ5RWRpdFBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCQkJCS5nZXRJZCgpLCAwLCBtZXNzYWdlLCBudWxsKTsKLQkJCX0KLQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCQl9Ci0JCWVsc2UgaWYgKGlzQ2lyY3VsYXJEZXBlbmRlbmN5KGFjdCwgYmFzZSkpIHsKLQkJCU9iamVjdFtdIGFyZ3MgPSB7IGFjdC5nZXROYW1lKCksIGJhc2UuZ2V0TmFtZSgpIH07Ci0JCQlTdHJpbmcgbWVzc2FnZSA9IE5MUwotCQkJCQkuYmluZCgKLQkJCQkJCQlMaWJyYXJ5RWRpdFJlc291cmNlcy5hY3Rpdml0eV92YXJpYWJpbGl0eV9lcnJvcl9tc2cyLAotCQkJCQkJCWFyZ3MpOwotCi0JCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBMaWJyYXJ5RWRpdFBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCQkJLmdldElkKCksIDAsIG1lc3NhZ2UsIG51bGwpOwotCQl9Ci0JCS8vIGJsb2NrIGZvciBjaGlsZHJlbgotCQllbHNlIGlmIChQcm9jZXNzVXRpbC5oYXNDb250cmlidXRvck9yUmVwbGFjZXIoYmFzZSkKLQkJCQkmJiB0eXBlID09IFZhcmlhYmlsaXR5VHlwZS5FWFRFTkRTKSB7Ci0JCQlPYmplY3RbXSBhcmdzID0geyBhY3QuZ2V0TmFtZSgpLCBiYXNlLmdldE5hbWUoKSB9OwotCQkJU3RyaW5nIG1lc3NhZ2UgPSBOTFMKLQkJCQkJLmJpbmQoCi0JCQkJCQkJTGlicmFyeUVkaXRSZXNvdXJjZXMuYWN0aXZpdHlfdmFyaWFiaWxpdHlfZXJyb3JfbXNnLAotCQkJCQkJCWFyZ3MpOwotCi0JCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBMaWJyYXJ5RWRpdFBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCQkJLmdldElkKCksIDAsIG1lc3NhZ2UsIG51bGwpOwotCQl9Ci0JCVByb2Nlc3MgcHJvY2VzcyA9IFRuZ1V0aWwuZ2V0T3duaW5nUHJvY2VzcyhhY3QpOwotCQlpZihwcm9jZXNzICE9IG51bGwgJiYgaGFzQ3ljbGljRGVwZW5kZW5jeShiYXNlLCBwcm9jZXNzKSkgewotCQkJT2JqZWN0W10gYXJncyA9IHsgYWN0LmdldE5hbWUoKSwgYmFzZS5nZXROYW1lKCkgfTsKLQkJCVN0cmluZyBtZXNzYWdlID0gTkxTCi0JCQkJCS5iaW5kKAotCQkJCQkJCUxpYnJhcnlFZGl0UmVzb3VyY2VzLmFjdGl2aXR5X3ZhcmlhYmlsaXR5X2Vycm9yX21zZzIsCi0JCQkJCQkJYXJncyk7Ci0KLQkJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIExpYnJhcnlFZGl0UGx1Z2luLmdldERlZmF1bHQoKQotCQkJCQkuZ2V0SWQoKSwgMCwgbWVzc2FnZSwgbnVsbCk7Ci0JCX0KLQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JfQotCQotCi0JLyoqCi0JICogQ2hlY2sgZm9yIGNpcmN1bGFyIGRlcGVuZGVuY3kgaWYgPGNvZGU+YmFzZTwvY29kZT4gaXMgdGhlIGJhc2UgZWxlbWVudAotCSAqIG9mIHRoZSBnaXZlbiA8Y29kZT5lbGVtZW50PC9jb2RlPi4KLQkgKiAKLQkgKiBAcGFyYW0gYmFzZQotCSAqICAgICAgICAgICAgYmFzZSBlbGVtZW50Ci0JICogQHJldHVybiBzdGF0dXMgd2hpY2ggaW5kaWNhdGVzIGNpcmN1bGFyIGRlcGVuZWRlbmN5IGlzIGRldGVjdGVkIG9yIG5vdAotCSAqLwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNDaXJjdWxhckRlcGVuZGVuY3koVmFyaWFiaWxpdHlFbGVtZW50IGVsZW1lbnQsCi0JCQlWYXJpYWJpbGl0eUVsZW1lbnQgYmFzZSkgewotCQkvLyBzdGFuZGFyZCBjaGVjawotCQkvLwotCQlWYXJpYWJpbGl0eVR5cGUgdHlwZSA9IGJhc2UuZ2V0VmFyaWFiaWxpdHlUeXBlKCk7Ci0JCXdoaWxlICh0eXBlICE9IFZhcmlhYmlsaXR5VHlwZS5OQSkgewotCQkJVmFyaWFiaWxpdHlFbGVtZW50IHZlID0gYmFzZS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCk7Ci0JCQlpZiAodmUgIT0gbnVsbCAmJiB2ZSA9PSBlbGVtZW50KQotCQkJCXJldHVybiB0cnVlOwotCQkJYmFzZSA9IHZlOwotCQkJdHlwZSA9IHZlLmdldFZhcmlhYmlsaXR5VHlwZSgpOwotCi0JCX0KLQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQ2hlY2sgd2hldGhlciBnaXZlbiBkZWxpdmVyYWJsZXMgbGVhZHMgdG8gY2lyY3VsYXIgZGVwZW5kZW5jeQotCSAqIAotCSAqIEBwYXJhbSB0b0JlUGFydAotCSAqIEBwYXJhbSBkZWxpdmVyYWJsZQotCSAqIEByZXR1cm4gPGNvZGU+ZmFsc2U8L2NvZGU+IHRvIGluZGljYXRlIHdoZXRoZXIgY2lyY3VsYXIgZGVwZW5kZW5jeSBpcwotCSAqICAgICAgICAgZGV0ZWN0ZWQsIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZXJlIGlzIG5vIGNpcmN1bGFyIGRlcGVuZGVuY3kKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY2hlY2tDaXJjdWxhckRlbGl2ZXJhYmxlcyhEZWxpdmVyYWJsZSB0b0JlUGFydCwKLQkJCURlbGl2ZXJhYmxlIGRlbGl2ZXJhYmxlKSB7Ci0JCWlmIChuZXdDaGVjaykgewotCQkJcmV0dXJuICEgc291cmNlUmVhY2hhYmxlQnlUYXJnZXQodG9CZVBhcnQsIGRlbGl2ZXJhYmxlKTsKLQkJfQotCQkKLQkJaWYgKHRvQmVQYXJ0ID09IGRlbGl2ZXJhYmxlKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJamF2YS51dGlsLkxpc3QgZGVsaXZlcmFibGVzID0gdG9CZVBhcnQuZ2V0RGVsaXZlcmVkV29ya1Byb2R1Y3RzKCk7Ci0JCWlmIChkZWxpdmVyYWJsZXMgIT0gbnVsbCAmJiBkZWxpdmVyYWJsZXMuc2l6ZSgpID4gMCkgewotCQkJaWYgKGRlbGl2ZXJhYmxlcy5jb250YWlucyhkZWxpdmVyYWJsZSkpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGRlbGl2ZXJhYmxlcy5pdGVyYXRvcigpOyBpdGVyYXRvcgotCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBvYmogPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIERlbGl2ZXJhYmxlKSB7Ci0JCQkJCXJldHVybiBjaGVja0NpcmN1bGFyRGVsaXZlcmFibGVzKChEZWxpdmVyYWJsZSkgb2JqLAotCQkJCQkJCWRlbGl2ZXJhYmxlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogQ2hlY2tzIGlmIHRoZSBnaXZlbiBDdXN0b21DYXRlZ29yeSBpcyBhbiBhbmNlc3RvciBvZiB0aGUgZ2l2ZW4KLQkgKiBEZXNjaWJhYmxlRWxlbWVudAotCSAqIAotCSAqIEBwYXJhbSBjYwotCSAqIEBwYXJhbSBlCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0FuY2Vzc29yT2YoQ3VzdG9tQ2F0ZWdvcnkgY2MsIERlc2NyaWJhYmxlRWxlbWVudCBlKSB7Ci0JCUl0ZXJhdG9yIGl0ZXIgPSBuZXcgQWJzdHJhY3RUcmVlSXRlcmF0b3IoY2MsIGZhbHNlKSB7Ci0JCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCQkJcHJvdGVjdGVkIEl0ZXJhdG9yIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgQ3VzdG9tQ2F0ZWdvcnkpIHsKLQkJCQkJcmV0dXJuICgoQ3VzdG9tQ2F0ZWdvcnkpIG9iamVjdCkuZ2V0Q2F0ZWdvcml6ZWRFbGVtZW50cygpCi0JCQkJCQkJLml0ZXJhdG9yKCk7Ci0JCQkJfQotCQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNULml0ZXJhdG9yKCk7Ci0JCQl9Ci0KLQkJfTsKLQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlpZiAoaXRlci5uZXh0KCkgPT0gZSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JLyoqCi0JICogQ2hlY2tzIGNpcmN1bGFyIGRlcGVuZGVuY3kgd2hlbiBtb3ZpbmcgYSBjb2xsZWN0aW9uIG9mIGFydGlmYWN0IG9iamVjdHMKLQkgKiBpbiAic291cmNlRWxlbWVudHMiIHVuZGVyICJkZXN0aW5hdGlvbiIKLQkgKiAKLQkgKiBAcGFyYW0gZGVzdGluYXRpb24KLQkgKiBAcGFyYW0gc291cmNlRWxlbWVudHMKLQkgKiBAcmV0dXJuIHRydWUgaWYgbm8gY2lyY3VsYXIgZGVwZW5kZW5jeSBkZXRlY3RlZCwgb3RoZXJ3aXNlIGZhbHNlCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNoZWNrQ2lyY3VsYXJGb3JBcnRpZmFjdHMoQXJ0aWZhY3QgZGVzdGluYXRpb24sCi0JCQlDb2xsZWN0aW9uIHNvdXJjZUVsZW1lbnRzKSB7Ci0JCUhhc2hTZXQgdmFyaWFudFNldCA9IG5ldyBIYXNoU2V0KCk7Ci0JCWNvbGxlY3RWYXJpYW50U2V0KGRlc3RpbmF0aW9uLCB2YXJpYW50U2V0LCBWYXJpYWJpbGl0eVR5cGUuUkVQTEFDRVMpOwotCQljb2xsZWN0VmFyaWFudFNldChkZXN0aW5hdGlvbiwgdmFyaWFudFNldCwgVmFyaWFiaWxpdHlUeXBlLkVYVEVORFMpOwotCQlpZiAoISBjaGVja0NpcmN1bGFyRm9yQXJ0aWZhY3RzMShkZXN0aW5hdGlvbiwgc291cmNlRWxlbWVudHMsIHZhcmlhbnRTZXQpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIGNoZWNrQ2lyY3VsYXJGb3JBcnRpZmFjdHMyKGRlc3RpbmF0aW9uLCBzb3VyY2VFbGVtZW50cyk7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gY2hlY2tDaXJjdWxhckZvckFydGlmYWN0czEoQXJ0aWZhY3QgZGVzdGluYXRpb24sCi0JCQlDb2xsZWN0aW9uIHNvdXJjZUVsZW1lbnRzLCBIYXNoU2V0IHZhcmlhbnRTZXQpIHsKLQkJaWYgKHNvdXJjZUVsZW1lbnRzID09IG51bGwpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHNvdXJjZUVsZW1lbnRzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IG9iaiA9IGl0ZXIubmV4dCgpOwotCQkJaWYob2JqIGluc3RhbmNlb2YgQXJ0aWZhY3QpewotCQkJCUFydGlmYWN0IGFydGlmYWN0ID0gKEFydGlmYWN0KSBvYmo7Ci0JCQkJaWYgKHZhcmlhbnRTZXQuY29udGFpbnMoYXJ0aWZhY3QpKSB7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQkJaWYgKCEgY2hlY2tDaXJjdWxhckZvckFydGlmYWN0czEoZGVzdGluYXRpb24sIGFydGlmYWN0LmdldENvbnRhaW5lZEFydGlmYWN0cygpLCB2YXJpYW50U2V0KSkgewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJfQkJCQotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGNoZWNrQ2lyY3VsYXJGb3JBcnRpZmFjdHMyKEFydGlmYWN0IGRlc3RpbmF0aW9uLAotCQkJQ29sbGVjdGlvbiBzb3VyY2VFbGVtZW50cykgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBzb3VyY2VFbGVtZW50cy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBvYmogPSBpdGVyLm5leHQoKTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBBcnRpZmFjdCAmJiBzb3VyY2VJc09yQWJvdmVNZSgoQXJ0aWZhY3QpIG9iaiwgZGVzdGluYXRpb24pKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQkJCQotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIHNvdXJjZUlzT3JBYm92ZU1lKEFydGlmYWN0IHNvdXJjZSwgQXJ0aWZhY3QgbWUpIHsKLQkJaWYgKHNvdXJjZSA9PSBtZSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJT2JqZWN0IG9iaiA9IG1lLmdldENvbnRhaW5lckFydGlmYWN0KCk7Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBBcnRpZmFjdCAmJiBzb3VyY2VJc09yQWJvdmVNZShzb3VyY2UsIChBcnRpZmFjdCkgb2JqKSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJb2JqID0gbWUuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpOwotCQlpZiAob2JqIGluc3RhbmNlb2YgQXJ0aWZhY3QgJiYgc291cmNlSXNPckFib3ZlTWUoc291cmNlLCAoQXJ0aWZhY3QpIG9iaikpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9CQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCS8vQ29sbGVjdCBhbGwgdmFyaWFudHMgb2YgImEiIGFuZCAiYSJzIGFuY2VzdHJvciBBcnRpZmFjdCBvYmplY3RzCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBjb2xsZWN0VmFyaWFudFNldChBcnRpZmFjdCBhLCBIYXNoU2V0IHZhcmlhbnRTZXQsIFZhcmlhYmlsaXR5VHlwZSB0eXBlKSB7Ci0JCXdoaWxlIChhICE9IG51bGwpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IFRuZ1V0aWwuZ2V0R2VuZXJhbGl6ZXJzKGEsIHR5cGUpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQl2YXJpYW50U2V0LmFkZChpdGVyLm5leHQoKSk7Ci0JCQl9Ci0JCQlhID0gYS5nZXRDb250YWluZXJBcnRpZmFjdCgpOwotCQl9Ci0JfQkJCQotCQotCXByaXZhdGUgc3RhdGljIENpcmN1bGFyRGVwZW5kZW5jeUNoZWNrIGdldENpcmN1bGFyRGVwZW5kZW5jeUNoZWNrKFZhcmlhYmlsaXR5RWxlbWVudCB2ZSwgCi0JCQkJCWJvb2xlYW4gZmlsdGVyLCBib29sZWFuIG1vdmUsIGJvb2xlYW4gZG5kKSB7Ci0JCU1ldGhvZExpYnJhcnkgbGliID0gVW1hVXRpbC5nZXRNZXRob2RMaWJyYXJ5KHZlKTsJCQkJCQkKLQkJRGVwZW5kZW5jeUluZm9NZ3IgZGVwSW5mb01nciA9IG5ldyBEZXBlbmRlbmN5SW5mb01ncihsaWIpOwotCQlkZXBJbmZvTWdyLnNldERuZEJpdChkbmQpOwotCQlyZXR1cm4gbmV3IENpcmN1bGFyRGVwZW5kZW5jeUNoZWNrKGRlcEluZm9NZ3IsIHZlLCBmaWx0ZXIsIG1vdmUgfHwgZG5kKTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBzb3VyY2VSZWFjaGFibGVCeVRhcmdldChWYXJpYWJpbGl0eUVsZW1lbnQgc291cmNlLCBWYXJpYWJpbGl0eUVsZW1lbnQgdGFyZ2V0KSB7Ci0JCXJldHVybiBnZXRDaXJjdWxhckRlcGVuZGVuY3lDaGVjayhzb3VyY2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UpLnJlYWNoYWJsZUJ5KHRhcmdldCk7Ci0JfQotCQotCS8qKgotCSAqIHJldHVybiBhIGNpcmN1bGFyIGRlcGVuZGVuY3kgY2hlY2sgZmlsdGVyCi0JICovCi0JcHVibGljIHN0YXRpYyBJRmlsdGVyIGdldENpcmN1bGFyRGVwZW5kZW5jeUNoZWNrRmlsdGVyKFZhcmlhYmlsaXR5RWxlbWVudCB2ZSkgewotCQlNZXRob2RMaWJyYXJ5IGxpYiA9IFVtYVV0aWwuZ2V0TWV0aG9kTGlicmFyeSh2ZSk7CQkJCQkJCi0JCURlcGVuZGVuY3lJbmZvTWdyIGRlcEluZm9NZ3IgPSBuZXcgRGVwZW5kZW5jeUluZm9NZ3IobGliKTsKLQkJcmV0dXJuIG5ldyBDaXJjdWxhckRlcGVuZGVuY3lDaGVja0ZpbHRlcihkZXBJbmZvTWdyLCB2ZSk7Ci0JfQkKLQkKLQkvL1JldHVybiB0cnVlIGlmIG5vIGNpcmN1bGFyIGRldGVjdGVkCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNoZWNrQ2lyY3VsYXJGb3JNb3ZpbmdWYXJpYWJpbGl0eUVsZW1lbnQoVmFyaWFiaWxpdHlFbGVtZW50IGRlc3RpbmF0aW9uLAotCQkJQ29sbGVjdGlvbiBzb3VyY2VFbGVtZW50cykgewotCQlyZXR1cm4gY2hlY2tDaXJjdWxhckZvck1vdmluZ1ZhcmlhYmlsaXR5RWxlbWVudChkZXN0aW5hdGlvbiwgc291cmNlRWxlbWVudHMsIGZhbHNlKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNoZWNrQ2lyY3VsYXJGb3JNb3ZpbmdWYXJpYWJpbGl0eUVsZW1lbnQoVmFyaWFiaWxpdHlFbGVtZW50IGRlc3RpbmF0aW9uLAotCQkJQ29sbGVjdGlvbiBzb3VyY2VFbGVtZW50cywgYm9vbGVhbiBkbmQpIHsKLQkJaWYgKCEgRGVwZW5kZW5jeUluZm9NZ3IuVmVUb0NoZWNrKGRlc3RpbmF0aW9uKSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJCi0JCUNpcmN1bGFyRGVwZW5kZW5jeUNoZWNrIGNoZWNrID0gZ2V0Q2lyY3VsYXJEZXBlbmRlbmN5Q2hlY2soZGVzdGluYXRpb24sIGZhbHNlLCB0cnVlLCBkbmQpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gc291cmNlRWxlbWVudHMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJaWYgKCEgY2hlY2suYWNjZXB0KGl0Lm5leHQoKSkpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiB0cnVlOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIElTdGF0dXMgY2hlY2tDaXJjdWxhckZvckFwcGx5aW5nVmFyaWFiaWxpdHlFbGVtZW50KFZhcmlhYmlsaXR5RWxlbWVudCBiYXNlLAotCQkJVmFyaWFiaWxpdHlFbGVtZW50IHZlLCBib29sZWFuIGRuZCkgewotCQlib29sZWFuIG9rID0gY2hlY2tDaXJjdWxhckZvck1vdmluZ1ZhcmlhYmlsaXR5RWxlbWVudChiYXNlLCBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KHZlKSwgdHJ1ZSk7Ci0JCWlmICghb2spIHsKLQkJCU9iamVjdFtdIGFyZ3MgPSB7IHZlLmdldE5hbWUoKSwgYmFzZS5nZXROYW1lKCkgfTsKLQkJCVN0cmluZyBtZXNzYWdlID0gTkxTCi0JCQkJCS5iaW5kKAotCQkJCQkJCUxpYnJhcnlFZGl0UmVzb3VyY2VzLnZhcmlhYmlsaXR5X2Vycm9yX21zZywKLQkJCQkJCQlhcmdzKTsJCi0JCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBMaWJyYXJ5RWRpdFBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCQkJLmdldElkKCksIDAsIG1lc3NhZ2UsIG51bGwpOwotCQl9Ci0JCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIElTdGF0dXMgY2hlY2tDaXJjdWxhckRlcGVuZGVuY3lBZnRlckZpbHRlclNlbGVjdGlvbihWYXJpYWJpbGl0eUVsZW1lbnQgdmUsIFZhcmlhYmlsaXR5RWxlbWVudCBiYXNlKSB7Ci0JCQlJRmlsdGVyIGZpbHRlciA9IGdldENpcmN1bGFyRGVwZW5kZW5jeUNoZWNrRmlsdGVyKHZlKTsKLQkJCWlmICghIGZpbHRlci5hY2NlcHQoYmFzZSkpIHsKLQkJCQlPYmplY3RbXSBhcmdzID0geyB2ZS5nZXROYW1lKCksIGJhc2UuZ2V0TmFtZSgpIH07Ci0JCQkJU3RyaW5nIG1lc3NhZ2UgPSBOTFMKLQkJCQkJCS5iaW5kKAotCQkJCQkJCQlMaWJyYXJ5RWRpdFJlc291cmNlcy52YXJpYWJpbGl0eV9lcnJvcl9tc2csCi0JCQkJCQkJCWFyZ3MpOwkJLy9Ob3QgcmlnaHQgbWVzc2FnZSwgbmVlZCB0byBhZGQgYSBuZXcgcmVzb3VjZSBzdHJpbmcgbGF0ZXIhCi0JCi0JCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgTGlicmFyeUVkaXRQbHVnaW4uZ2V0RGVmYXVsdCgpCi0JCQkJCQkuZ2V0SWQoKSwgMCwgbWVzc2FnZSwgbnVsbCk7Ci0JCX0KLQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC92YWxpZGF0aW9uL0RlcGVuZGVuY3lJbmZvTWdyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3ZhbGlkYXRpb24vRGVwZW5kZW5jeUluZm9NZ3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzAzZDY5OS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3ZhbGlkYXRpb24vRGVwZW5kZW5jeUluZm9NZ3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TdGFjazsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5NdWx0aVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLlByb2ZpbGluZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BcnRpZmFjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkN1c3RvbUNhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Eb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByYWN0aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlUeXBlOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgbWFuYWdlcyBjaXJjdWxhciBkZXBlbmRlbmN5IGluZm8uCi0gKiAKLSAqIEBhdXRob3IgV2VpcGluZyBMdQotICogQHNpbmNlIDEuMgotICovCi1wdWJsaWMgY2xhc3MgRGVwZW5kZW5jeUluZm9NZ3IgewotCQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gcHJvZmlsaW5nID0gZmFsc2U7Ci0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBkZWJ1ZyA9IGZhbHNlOwotCXByaXZhdGUgTWV0aG9kTGlicmFyeSBsaWI7Ci0JcHJpdmF0ZSBNYXAgcmVhY2hhYmxlSW5mb01hcDsJLy97Z3VpZCwgdXB3YXJkUmVhY2hhYmxlSW5mb30KLQlwcml2YXRlIE1hcCByZXBsYWNlck1hcDsKLQlwcml2YXRlIE1hcCBwcm9jZXNzZWQ7Ci0JcHJpdmF0ZSBNZXRob2RFbGVtZW50IGZpbHRlckVsZW1lbnQ7Ci0JcHJpdmF0ZSBNZXRob2RFbGVtZW50IG1vdmVFbGVtZW50OwotCXByaXZhdGUgTGlzdCBjaXJjdWxhckxpc3Q7Ci0JcHJpdmF0ZSBib29sZWFuIGRuZEJpdCA9IGZhbHNlOwotCQotCXB1YmxpYyBEZXBlbmRlbmN5SW5mb01ncihNZXRob2RMaWJyYXJ5IGxpYikgewotCQl0aGlzLmxpYiA9IGxpYjsKLQl9Ci0JCi0JcHVibGljIHZvaWQgbG9nQ2lyY3VsYXJEZXBlbmRlbmN5KFN0YWNrIHRyYWNlKSB7Ci0JCWlmIChjaXJjdWxhckxpc3QgPT0gbnVsbCkgewotCQkJY2lyY3VsYXJMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQl9Ci0JCWNpcmN1bGFyTGlzdC5hZGRBbGwodHJhY2UpOwotCX0KLQkKLQlwcml2YXRlIExpc3QgZ2V0QW5kQ2xlYXJDaXJjdWxhckxpc3QoKSB7Ci0JCUxpc3QgcmV0ID0gY2lyY3VsYXJMaXN0OwotCQljaXJjdWxhckxpc3QgPSBudWxsOwotCQlyZXR1cm4gcmV0OwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc0ZpbHRlckVsZW1lbnQoTWV0aG9kRWxlbWVudCBlbGVtKSB7Ci0JCXJldHVybiBmaWx0ZXJFbGVtZW50ID09IGVsZW07Ci0JfQkKLQkKLQlwdWJsaWMgYm9vbGVhbiBpc01vdmVFbGVtZW50KE1ldGhvZEVsZW1lbnQgZWxlbSkgewotCQlyZXR1cm4gbW92ZUVsZW1lbnQgPT0gZWxlbTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGxvZyhTdHJpbmcgbXNnKSB7Ci0JCUxpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmxvZyhtc2cpOwotCX0KLQkKLQlwdWJsaWMgSVN0YXR1cyBjaGVja0NpcmN1bGFyRGVwZW5kbmVjeShWYXJpYWJpbGl0eUVsZW1lbnQgdmUpIHsKLQkJaWYgKGRlYnVnKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxEPiB2ZTogIiArIFRuZ1V0aWwuZ2V0TGFiZWxXaXRoUGF0aCh2ZSkpOwkJLy8kTk9OLU5MUy0xJAotCQl9Ci0JCUlEZXBlbmRlbmN5SW5mbyBpbmZvID0gcmVnaXN0ZXJWYXJpYWJpbGl0eUVsZW1lbnQodmUsIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7Ci0JCUxpc3QgY2lyTGlzdCA9IGdldEFuZENsZWFyQ2lyY3VsYXJMaXN0KCk7Ci0JCWJvb2xlYW4gbG9vcCA9IGNpckxpc3QgIT0gbnVsbCAmJiAhY2lyTGlzdC5pc0VtcHR5KCk7Ci0JCWJvb2xlYW4gcmVwbGFjaW5nQW5jZXN0b3IgPSBpbmZvLmluaGVyaXRBbmNlc3RvcihWYXJpYWJpbGl0eVR5cGUuUkVQTEFDRVMpOwotCQlib29sZWFuIGFjdEluaGVyZW50aW5nQW5jZXN0b3IgPSBnZXRBY3RJbmVyZW50aW5nQW5jZXN0b3IodmUpOwotCQkKLQkJTXVsdGlTdGF0dXMgbXVsdGlTdGF0dXMgPSBuZXcgTXVsdGlTdGF0dXMoTGlicmFyeUVkaXRQbHVnaW4uUExVR0lOX0lELCAwLCAiIiwgbnVsbCk7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKGxvb3ApIHsKLQkJCWxvZygiRXJyb3I+IENpcmN1bGFyIGRlcGVuZGVuY3kgZGV0ZWN0ZWQ6ICIpOwkJLy8kTk9OLU5MUy0xJAotCQkJZm9yIChpbnQgaT0wOyBpPGNpckxpc3Quc2l6ZSgpOyBpKyspIHsKLQkJCQlJRGVwZW5kZW5jeUluZm8gbG9vcEluZm8gPSAoSURlcGVuZGVuY3lJbmZvKSBjaXJMaXN0LmdldChpKTsKLQkJCQlNZXRob2RFbGVtZW50IGVsZW0gPSBsb29wSW5mby5nZXRFbGVtZW50KCk7CQkJCQkJCQotCQkJCWxvZygiRXJyb3I+ICIgKyBpICsgIjogIiArIFRuZ1V0aWwuZ2V0TGFiZWxXaXRoUGF0aChlbGVtKSk7Ly8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQl9Ci0JCQkKLQkJCW11bHRpU3RhdHVzLmFkZChuZXcgVmFsaWRhdGlvblN0YXR1cyhJU3RhdHVzLkVSUk9SLCAwLCBnZW5FcnJvck1zZyhjaXJMaXN0KSwgdmUsIG51bGwpKTsJCQkKLQkJfQotCQlpZiAocmVwbGFjaW5nQW5jZXN0b3IpIHsKLQkJCU1ldGhvZEVsZW1lbnQgZWxlbSA9IGluZm8uZ2V0RWxlbWVudCgpOwotCQkJbG9nKCJFcnJvcj4gIiArIFRuZ1V0aWwuZ2V0TGFiZWxXaXRoUGF0aChlbGVtKSArICIgaXMgcmVwbGFjaW5nIGFuIGFuY2VzdG9yLiIpOy8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCi0JCQltdWx0aVN0YXR1cy5hZGQobmV3IFZhbGlkYXRpb25TdGF0dXMoSVN0YXR1cy5FUlJPUiwgMCwgTGlicmFyeUVkaXRSZXNvdXJjZXMucmVwbGFjaW5nX2FuY2VzdG9yX2Vycm9yX21zZywgdmUsIG51bGwpKTsJCQkJCQkJCi0JCX0KLQkJaWYgKGFjdEluaGVyZW50aW5nQW5jZXN0b3IpIHsKLQkJCU1ldGhvZEVsZW1lbnQgZWxlbSA9IGluZm8uZ2V0RWxlbWVudCgpOwotCQkJbXVsdGlTdGF0dXMuYWRkKG5ldyBWYWxpZGF0aW9uU3RhdHVzKElTdGF0dXMuRVJST1IsIDAsIExpYnJhcnlFZGl0UmVzb3VyY2VzLmNpcmN1bGFyX2RlcGVuZGVuY3lfZXJyb3JfbXNnLCB2ZSwgbnVsbCkpOwkJCQkJCQkKLQkJfQotCi0JCQotCQkKLQkJcmV0dXJuIG11bHRpU3RhdHVzOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBnZXRBY3RJbmVyZW50aW5nQW5jZXN0b3IoVmFyaWFiaWxpdHlFbGVtZW50IHZlKSB7Ci0JCWlmICh2ZSBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQlBY3Rpdml0eSBiYXNlID0gKEFjdGl2aXR5KSB2ZS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCk7Ci0JCQlpZiAoYmFzZSAhPSBudWxsKSB7Ci0JCQkJZm9yIChBY3Rpdml0eSBhY3QgPSAoKEFjdGl2aXR5KSB2ZSkuZ2V0U3VwZXJBY3Rpdml0aWVzKCk7IAotCQkJCQkJCQkJYWN0ICE9IG51bGw7IGFjdCA9IGFjdC5nZXRTdXBlckFjdGl2aXRpZXMoKSkgewotCQkJCQlpZiAoYWN0ID09IGJhc2UpIHsKLQkJCQkJCXJldHVybiB0cnVlOwkKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCXByaXZhdGUgU3RyaW5nIGdlbkVycm9yTXNnKExpc3QgY2lyTGlzdCkgewotCQlTdHJpbmcgbXNnID0gTGlicmFyeUVkaXRSZXNvdXJjZXMudmFyaWFiaWxpdHlfZWxlbWVudF9jaXJjdWxhcl9sb29wX2Vycm9yX21zZzsKLQkJZm9yIChpbnQgaT0wOyBpPGNpckxpc3Quc2l6ZSgpOyBpKyspIHsKLQkJCUlEZXBlbmRlbmN5SW5mbyBsb29wSW5mbyA9IChJRGVwZW5kZW5jeUluZm8pIGNpckxpc3QuZ2V0KGkpOwotCQkJTWV0aG9kRWxlbWVudCBlbGVtID0gbG9vcEluZm8uZ2V0RWxlbWVudCgpOwkKLQkJCWlmIChpID4gMCkgewotCQkJCW1zZyArPSAiOiAiOyAvLyROT04tTkxTLTEkIAotCQkJfQotCQkJbXNnICs9IFRuZ1V0aWwuZ2V0TGFiZWxXaXRoUGF0aChlbGVtKTsJCi0JCX0KLQkJcmV0dXJuIG1zZzsKLQl9Ci0JCQkKLQlwdWJsaWMgSURlcGVuZGVuY3lJbmZvIHJlZ2lzdGVyVmFyaWFiaWxpdHlFbGVtZW50KFZhcmlhYmlsaXR5RWxlbWVudCB2ZSwgCi0JCQlib29sZWFuCWlzRmlsdGVyRWxlbWVudCwgYm9vbGVhbiBpc01vdmVFbGVtZW50KSB7Ci0JCXJldHVybiByZWdpc3RlclZhcmlhYmlsaXR5RWxlbWVudCh2ZSwgaXNGaWx0ZXJFbGVtZW50LCBpc01vdmVFbGVtZW50LCBmYWxzZSk7Ci0JfQotCQotCXByaXZhdGUgSURlcGVuZGVuY3lJbmZvIHJlZ2lzdGVyVmFyaWFiaWxpdHlFbGVtZW50KFZhcmlhYmlsaXR5RWxlbWVudCB2ZSwgCi0JCQlib29sZWFuCWlzRmlsdGVyRWxlbWVudCwgYm9vbGVhbiBpc01vdmVFbGVtZW50LCBib29sZWFuIGNoZWNrQ2lyY3VsYXIpIHsKLQkJaWYgKGlzRmlsdGVyRWxlbWVudCkgewotCQkJZmlsdGVyRWxlbWVudCA9IHZlOwotCQl9Ci0JCWlmIChpc01vdmVFbGVtZW50KSB7Ci0JCQltb3ZlRWxlbWVudCA9IHZlOwotCQl9CQkKLQkJSURlcGVuZGVuY3lJbmZvIGluZm8gPSAgZ2V0UHJvY2Vzc2VkSW5mbyh2ZSk7Ci0JCWlmIChpbmZvID09IG51bGwpIHsJCQotCQkJaW5mbyA9IG5ld0RlcGVuZGVuY3lJbmZvKHRoaXMsIHZlKTsKLQkJfQotCQlpZiAoISBpbmZvLmlzQ29tcGxldGUoKSkgewotCQkJaW5mby5idWlsZChjaGVja0NpcmN1bGFyKTsKLQkJfQotCQlyZXR1cm4gaW5mbzsKLQl9Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gcHJvY2Vzc2VkKE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgewotCQlyZXR1cm4gcHJvY2Vzc2VkICE9IG51bGwgJiYgcHJvY2Vzc2VkLmNvbnRhaW5zS2V5KGVsZW1lbnQuZ2V0R3VpZCgpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIElEZXBlbmRlbmN5SW5mbyBnZXRQcm9jZXNzZWRJbmZvKE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgewotCQlyZXR1cm4gcHJvY2Vzc2VkID09IG51bGwgPyBudWxsIDogKElEZXBlbmRlbmN5SW5mbykgcHJvY2Vzc2VkLmdldChlbGVtZW50LmdldEd1aWQoKSk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGFkZFRvUHJvY2Vzc2VkKElEZXBlbmRlbmN5SW5mbyBpbmZvKSB7Ci0JCWlmIChwcm9jZXNzZWQgPT0gbnVsbCkgewotCQkJcHJvY2Vzc2VkID0gbmV3IEhhc2hNYXAoKTsKLQkJfQotCQlwcm9jZXNzZWQucHV0KGluZm8uZ2V0RWxlbWVudCgpLmdldEd1aWQoKSwgaW5mbyk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGFkZFRvUmVwbGFjZXJNYXAoSURlcGVuZGVuY3lJbmZvIHJlcGxhY2VySW5mbykgewotCQlpZiAocmVwbGFjZXJNYXAgPT0gbnVsbCkgewotCQkJcmVwbGFjZXJNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQl9Ci0JCXJlcGxhY2VyTWFwLnB1dChyZXBsYWNlckluZm8uZ2V0RWxlbWVudCgpLmdldEd1aWQoKSwgcmVwbGFjZXJJbmZvKTsKLQl9CQotCQkKLQlwcml2YXRlIElEZXBlbmRlbmN5SW5mbyBhZGRUb1JlYWNoYWJsZUluZm9NYXAoTWV0aG9kRWxlbWVudCBlbGVtKSB7Ci0JCWlmIChyZWFjaGFibGVJbmZvTWFwID09IG51bGwpIHsKLQkJCXJlYWNoYWJsZUluZm9NYXAgPSBuZXcgSGFzaE1hcCgpOwotCQl9Ci0JCUlEZXBlbmRlbmN5SW5mbyBpbmZvID0gKElEZXBlbmRlbmN5SW5mbykgcmVhY2hhYmxlSW5mb01hcC5nZXQoZWxlbS5nZXRHdWlkKCkpOwotCQlpZiAoaW5mbyA9PSBudWxsKSB7CQkKLQkJCWluZm8gPSBuZXdEZXBlbmRlbmN5SW5mbyh0aGlzLCBlbGVtKTsKLQkJCXJlYWNoYWJsZUluZm9NYXAucHV0KGVsZW0uZ2V0R3VpZCgpLCBpbmZvKTsKLQkJfQkJCi0JCXJldHVybiBpbmZvOwotCX0KLQotCS8qCi0JICogRGV0ZWN0IGNpcmN1bGFyIGRlcGVuZGVuY3kgZm9yIHRoZSB3aG9sZSBsaWJyYXJ5Ci0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzQ2lyY3VsYXJEZXBlbmRlbmN5KCkgIHsKLQkJYnVpbGRSZWFjaGFibGVJbmZvTWFwKCk7Ci0JCQotCQlib29sZWFuIHJlcGxhY2luZ0FjZXN0b3IgPSBmYWxzZTsKLQkJaWYgKHJlcGxhY2VyTWFwICE9IG51bGwpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSByZXBsYWNlck1hcC52YWx1ZXMoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJVXB3YXJkUmVhY2hhYmxlSW5mbyBpbmZvID0gKFVwd2FyZFJlYWNoYWJsZUluZm8pIGl0Lm5leHQoKTsKLQkJCQlpZiAoaW5mby5pbmhlcml0QW5jZXN0b3IoVmFyaWFiaWxpdHlUeXBlLlJFUExBQ0VTKSkgewotCQkJCQlyZXBsYWNpbmdBY2VzdG9yID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKGRlYnVnICYmIGNpcmN1bGFyTGlzdCAhPSBudWxsKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxEPiBDaXJjdWxhciBsb29wcyBkZXRlY3RlZDogIik7CS8vJE5PTi1OTFMtMSQKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBjaXJjdWxhckxpc3QuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCVN0YWNrIHN0YWNrID0gKFN0YWNrKSBpdC5uZXh0KCk7Ci0JCQkJZm9yIChpbnQgaT0wOyBpPHN0YWNrLnNpemUoKTsgaSsrKSB7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTEQ+ICIgKyAoaSkgKyAiOiAiICsgc3RhY2suZ2V0KGkpKTsJLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gcmVwbGFjaW5nQWNlc3RvciB8fCBudW1DaXJjdWxhckRlcGVuZGVuY3koKSA+IDA7Ci0JfQotCQotCXByaXZhdGUgaW50IG51bUNpcmN1bGFyRGVwZW5kZW5jeSgpIHsKLQkJcmV0dXJuIGNpcmN1bGFyTGlzdCA9PSBudWxsID8gMCA6IGNpcmN1bGFyTGlzdC5zaXplKCk7Ci0JfQotCQotCS8vdG8gYmUgc3BlY2lhbGl6ZWQgYnkgc3ViIGNsYXNzZXMKLQlwcm90ZWN0ZWQgSURlcGVuZGVuY3lJbmZvIG5ld0RlcGVuZGVuY3lJbmZvKERlcGVuZGVuY3lJbmZvTWdyIG1nciwgTWV0aG9kRWxlbWVudCBlbGVtKSB7Ci0JCXJldHVybiAgbmV3IFVwd2FyZFJlYWNoYWJsZUluZm8odGhpcywgZWxlbSk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBidWlsZFJlYWNoYWJsZUluZm9NYXAoKSB7Ci0JCWxvbmcgdXNlZE1lbTAgPSAwOwotCQlSdW50aW1lIHJ0ID0gUnVudGltZS5nZXRSdW50aW1lKCk7IAotCQlpZiAocHJvZmlsaW5nKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gbGliLmVBbGxDb250ZW50cygpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJaXQubmV4dCgpOwotCQkJfQotCQkJUHJvZmlsaW5nVXRpbC5mdWxsR0MoKTsKLQkJCXVzZWRNZW0wID0gcnQudG90YWxNZW1vcnkoKSAtIHJ0LmZyZWVNZW1vcnkoKTsKLQkJfQotCQkKLQkJYnVpbGRSZWFjaGFibGVJbmZvTWFwXygpOwotCQlpZiAocHJvZmlsaW5nKSB7Ci0JCQlQcm9maWxpbmdVdGlsLmZ1bGxHQygpOwotCQkJU3lzdGVtLm91dC5wcmludGxuKCJMRD4gdXNlZE1lbTA6ICIgKyB1c2VkTWVtMC8xMDAwICsgIiBrIGJ5dGVzIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJbG9uZyB1c2VkTWVtMSA9IHJ0LnRvdGFsTWVtb3J5KCkgLSBydC5mcmVlTWVtb3J5KCk7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxEPiB1c2VkTWVtMTogIiArIHVzZWRNZW0xLzEwMDAgKyAiIGsgYnl0ZXMiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxEPiBkaWZmTWVtOiAiICsgKHVzZWRNZW0xIC0gdXNlZE1lbTApLzEwMDAgKyAiIGsgYnl0ZXMiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgYnVpbGRSZWFjaGFibGVJbmZvTWFwXygpIHsKLQkJcmVhY2hhYmxlSW5mb01hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCUxpc3QgcGx1Z2lucyA9IGxpYi5nZXRNZXRob2RQbHVnaW5zKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcGx1Z2lucy5zaXplKCk7IGkrKykgewotCQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IChNZXRob2RQbHVnaW4pIHBsdWdpbnMuZ2V0KGkpOwotCQkJZm9yIChJdGVyYXRvciBpdCA9IHBsdWdpbi5lQWxsQ29udGVudHMoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBvYmogPSBpdC5uZXh0KCk7Ci0JCQkJaWYgKFZlVG9DaGVjayhvYmopKSB7Ci0JCQkJCWFkZFRvUmVhY2hhYmxlSW5mb01hcCgoTWV0aG9kRWxlbWVudCkgb2JqKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCWZvciAoSXRlcmF0b3IgaXQgPSByZWFjaGFibGVJbmZvTWFwLnZhbHVlcygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCUlEZXBlbmRlbmN5SW5mbyBpbmZvID0gKElEZXBlbmRlbmN5SW5mbykgaXQubmV4dCgpOwotCQkJaWYgKCEgcHJvY2Vzc2VkKGluZm8uZ2V0RWxlbWVudCgpKSkgewotCQkJCWluZm8uYnVpbGQodHJ1ZSk7Ci0JCQl9Ci0JCX0JCi0KLQl9CQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIFZlVG9DaGVjayhPYmplY3Qgb2JqKSB7Ci0JCXJldHVybiAJb2JqIGluc3RhbmNlb2YgRG9tYWluIHx8IAotCQkJCW9iaiBpbnN0YW5jZW9mIEN1c3RvbUNhdGVnb3J5IHx8IAotCQkJCW9iaiBpbnN0YW5jZW9mIEFydGlmYWN0IHx8IAotCQkJCW9iaiBpbnN0YW5jZW9mIFByYWN0aWNlIHx8IAotCQkJCW9iaiBpbnN0YW5jZW9mIERlbGl2ZXJhYmxlIHx8Ci0JCQkJb2JqIGluc3RhbmNlb2YgQWN0aXZpdHk7Ci0JfQotCQotCS8qCi0JICogQ2hlY2sgY2lyY3VsYXIgZGVwZW5kZW5jeSBmb3IgdGhlIGxpYnJhcnkuCi0JICovCi0JcHVibGljIENoZWNrUmVzdWx0IGNoZWNrQ2lyY3VsYXJEZXBlbmRuZWN5KFRyYWNlciB0cmFjZXIpIHsKLQkJbG9uZyB1c2VkTWVtMCA9IDA7Ci0JCVJ1bnRpbWUgcnQgPSBSdW50aW1lLmdldFJ1bnRpbWUoKTsgCi0JCWlmIChwcm9maWxpbmcpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBsaWIuZUFsbENvbnRlbnRzKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlpdC5uZXh0KCk7Ci0JCQl9Ci0JCQlQcm9maWxpbmdVdGlsLmZ1bGxHQygpOwotCQkJdXNlZE1lbTAgPSBydC50b3RhbE1lbW9yeSgpIC0gcnQuZnJlZU1lbW9yeSgpOwotCQl9Ci0KLQkJQ2hlY2tSZXN1bHQgcmVzdWx0ID0gY2hlY2tDaXJjdWxhckRlcGVuZG5lY3lfKHRyYWNlcik7Ci0JCQotCQlpZiAocHJvZmlsaW5nKSB7Ci0JCQlQcm9maWxpbmdVdGlsLmZ1bGxHQygpOwotCQkJU3lzdGVtLm91dC5wcmludGxuKCJMRD4gdXNlZE1lbTA6ICIgKyB1c2VkTWVtMC8xMDAwICsgIiBrIGJ5dGVzIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJbG9uZyB1c2VkTWVtMSA9IHJ0LnRvdGFsTWVtb3J5KCkgLSBydC5mcmVlTWVtb3J5KCk7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxEPiB1c2VkTWVtMTogIiArIHVzZWRNZW0xLzEwMDAgKyAiIGsgYnl0ZXMiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxEPiBkaWZmTWVtOiAiICsgKHVzZWRNZW0xIC0gdXNlZE1lbTApLzEwMDAgKyAiIGsgYnl0ZXMiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi0JcHJpdmF0ZSBDaGVja1Jlc3VsdCBjaGVja0NpcmN1bGFyRGVwZW5kbmVjeV8oVHJhY2VyIHRyYWNlcikgewotCQlDaGVja1Jlc3VsdCByZXN1bHQgPSBuZXcgQ2hlY2tSZXN1bHQoKTsKLQkJCi0JCUhhc2hTZXQgc2VlbiA9IG5ldyBIYXNoU2V0KCk7Ci0JCUxpc3QgcGx1Z2lucyA9IGxpYi5nZXRNZXRob2RQbHVnaW5zKCk7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSBwbHVnaW5zLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSAoTWV0aG9kUGx1Z2luKSBpdC5uZXh0KCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGlpdCA9IHBsdWdpbi5lQWxsQ29udGVudHMoKTsgaWl0Lmhhc05leHQoKTspIHsKLQkJCQlPYmplY3Qgb2JqID0gaWl0Lm5leHQoKTsKLQkJCQlpZiAoc2Vlbi5jb250YWlucyhvYmopKSB7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCQlzZWVuLmFkZChvYmopOwkJCQkKLQkJCQlpZiAoVmVUb0NoZWNrKG9iaikpIHsKLQkJCQkJSURlcGVuZGVuY3lJbmZvIGluZm8gPSByZWdpc3RlclZhcmlhYmlsaXR5RWxlbWVudCgoVmFyaWFiaWxpdHlFbGVtZW50KSBvYmosIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7Ci0JCQkJCUxpc3QgY2lyTGlzdCA9IGdldEFuZENsZWFyQ2lyY3VsYXJMaXN0KCk7Ci0JCQkJCQotCQkJCQlib29sZWFuIGxvb3AgPSBjaXJMaXN0ICE9IG51bGwgJiYgIWNpckxpc3QuaXNFbXB0eSgpOwotCQkJCQlib29sZWFuIHJlcGxhY2luZ0FuY2VzdG9yID0gaW5mby5pbmhlcml0QW5jZXN0b3IoVmFyaWFiaWxpdHlUeXBlLlJFUExBQ0VTKTsKLQkJCQkJCi0JCQkJCWlmIChsb29wKSB7Ci0JCQkJCQl0cmFjZXIudHJhY2UoIkVycm9yPiBDaXJjdWxhciBkZXBlbmRlbmN5IGRldGVjdGVkOiAiKTsJCS8vJE5PTi1OTFMtMSQKLQkJCQkJCWZvciAoaW50IGk9MDsgaTxjaXJMaXN0LnNpemUoKTsgaSsrKSB7Ci0JCQkJCQkJSURlcGVuZGVuY3lJbmZvIGxvb3BJbmZvID0gKElEZXBlbmRlbmN5SW5mbykgY2lyTGlzdC5nZXQoaSk7Ci0JCQkJCQkJTWV0aG9kRWxlbWVudCBlbGVtID0gbG9vcEluZm8uZ2V0RWxlbWVudCgpOwkJCQkJCQkKLQkJCQkJCQl0cmFjZXIudHJhY2UoIkVycm9yPiAiICsgaSArICI6ICIgKyBUbmdVdGlsLmdldExhYmVsV2l0aFBhdGgoZWxlbSkpOy8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJfQotCQkJCQkJcmVzdWx0LmNpcmN1bGFyTGlzdC5hZGQoY2lyTGlzdCk7Ci0JCQkJCX0KLQkJCQkJaWYgKHJlcGxhY2luZ0FuY2VzdG9yKSB7Ci0JCQkJCQlNZXRob2RFbGVtZW50IGVsZW0gPSBpbmZvLmdldEVsZW1lbnQoKTsKLQkJCQkJCXRyYWNlci50cmFjZSgiRXJyb3I+ICIgKyBUbmdVdGlsLmdldExhYmVsV2l0aFBhdGgoZWxlbSkgKyAiIGlzIHJlcGxhY2luZyBhbiBhbmNlc3Rvci4iKTsvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCXJlc3VsdC5yZXBsYWNpbmdBbmNlc3Rvckxpc3QuYWRkKGluZm8pOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9CQkJCQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGNsYXNzIENoZWNrUmVzdWx0IHsKLQkJcHVibGljIExpc3QgY2lyY3VsYXJMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlwdWJsaWMgTGlzdCByZXBsYWNpbmdBbmNlc3Rvckxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQotCQlwdWJsaWMgaW50IGdldEVycm9yQ291bnQoKSB7Ci0JCQlyZXR1cm4gY2lyY3VsYXJMaXN0LnNpemUoKSArIHJlcGxhY2luZ0FuY2VzdG9yTGlzdC5zaXplKCk7Ci0JCX0KLQkJCi0JCXB1YmxpYyBpbnQgZ2V0Q2lyY3VsYXJFbGVtZW50Q291bnQoKSB7Ci0JCQlpbnQgY291bnQgPSByZXBsYWNpbmdBbmNlc3Rvckxpc3Quc2l6ZSgpOwotCQkJZm9yIChpbnQgaT0wOyBpPGNpcmN1bGFyTGlzdC5zaXplKCk7IGkrKykgewotCQkJCUxpc3QgbGlzdCA9IChMaXN0KSBjaXJjdWxhckxpc3QuZ2V0KGkpOwotCQkJCWludCBzeiA9IGxpc3QgPT0gbnVsbCA/IDAgOiBsaXN0LnNpemUoKTsKLQkJCQljb3VudCArPSBzejsKLQkJCX0KLQkJCXJldHVybiBjb3VudDsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0RuZEVsZW1lbnQoTWV0aG9kRWxlbWVudCBlbGVtKSB7Ci0JCXJldHVybiBkbmRCaXQgJiYgbW92ZUVsZW1lbnQgPT0gZWxlbTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0RG5kQml0KGJvb2xlYW4gYikgewotCQlkbmRCaXQgPSBiOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdmFsaWRhdGlvbi9EZXBlbmRlbmN5VmFsaWRhdGlvbk1nci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC92YWxpZGF0aW9uL0RlcGVuZGVuY3lWYWxpZGF0aW9uTWdyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2NDJjYjkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC92YWxpZGF0aW9uL0RlcGVuZGVuY3lWYWxpZGF0aW9uTWdyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQ7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBtYW5hZ2VzIGFsbCBkZXBlbmRlbmN5IGNoZWNrcyBmb3IgdmFsaWRhdGlvbgotICogCi0gKiBAYXV0aG9yIFdlaXBpbmcgTHUKLSAqIEBzaW5jZSAxLjIKLSAqLwotcHVibGljIGNsYXNzIERlcGVuZGVuY3lWYWxpZGF0aW9uTWdyIHsKLQkKLQlwcml2YXRlIERlcGVuZGVuY3lJbmZvTWdyIHZlRGVwSW5mb01ncjsKLQlwcml2YXRlIFBsdWdpbkRlcGVuZGVuY3lJbmZvTWdyIHBsdWdpbkRlcEluZm9NZ3I7Ci0JCi0JcHVibGljIERlcGVuZGVuY3lWYWxpZGF0aW9uTWdyKE1ldGhvZExpYnJhcnkgbGliKSB7Ci0JCXZlRGVwSW5mb01nciA9IG5ldyBEZXBlbmRlbmN5SW5mb01ncihsaWIpOwotCQlwbHVnaW5EZXBJbmZvTWdyID0gbmV3IFBsdWdpbkRlcGVuZGVuY3lJbmZvTWdyKGxpYik7Ci0JfQotCQotCXB1YmxpYyBJU3RhdHVzIGNoZWNrQ2lyY3VsYXJEZXBlbmRuZWN5KE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgewotCQlJU3RhdHVzIHN0YXR1cyA9IFN0YXR1cy5PS19TVEFUVVM7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgVmFyaWFiaWxpdHlFbGVtZW50KSB7Ci0JCQlyZXR1cm4gdmVEZXBJbmZvTWdyLmNoZWNrQ2lyY3VsYXJEZXBlbmRuZWN5KChWYXJpYWJpbGl0eUVsZW1lbnQpIGVsZW1lbnQpOwotCQl9Ci0JCQotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikgewotCQkJcmV0dXJuIHBsdWdpbkRlcEluZm9NZ3IuY2hlY2tDaXJjdWxhckRlcGVuZG5lY3koKE1ldGhvZFBsdWdpbikgZWxlbWVudCk7Ci0JCX0JCQotCQkKLQkJcmV0dXJuIHN0YXR1czsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3ZhbGlkYXRpb24vSURlcGVuZGVuY3lJbmZvLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3ZhbGlkYXRpb24vSURlcGVuZGVuY3lJbmZvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5MDkyZmIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC92YWxpZGF0aW9uL0lEZXBlbmRlbmN5SW5mby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eVR5cGU7Ci0KLS8qKgotICogSW50ZXJmYWNlIGZvciBkZXBlbmRlbmN5IGluZm8gdXNlZCBpbiBjaXJjdWxhciBkZXBlbmRlbmN5IGNoZWNraW5nCi0gKiAKLSAqIEBhdXRob3IgV2VpcGluZyBMdQotICogQHNpbmNlIDEuMgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElEZXBlbmRlbmN5SW5mbyB7Ci0JCi0Jdm9pZCBidWlsZChib29sZWFuIGNoZWNrQ2lyY3VsYXIpOwotCQotCWJvb2xlYW4gaXNDb21wbGV0ZSgpOwotCQotCWJvb2xlYW4gcmVhY2hhYmxlQnkoSURlcGVuZGVuY3lJbmZvIGluZm8pOwotCQotCWJvb2xlYW4gaW5oZXJpdEFuY2VzdG9yKFZhcmlhYmlsaXR5VHlwZSB0eXBlKTsKLQkKLQlNZXRob2RFbGVtZW50IGdldEVsZW1lbnQoKTsKLQkKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdmFsaWRhdGlvbi9JTmFtZVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3ZhbGlkYXRpb24vSU5hbWVQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMDQ2Mjg4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdmFsaWRhdGlvbi9JTmFtZVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb247Ci0KLS8qKgotICogSW50ZXJmYWNlIHRvIHByb3ZpZGUgbmFtZSBmb3IgYSBzcGVjaWZpZWQgb2JqZWN0Ci0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlIC0gSmFuIDMxLCAyMDA2Ci0gKiBAc2luY2UgIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElOYW1lUHJvdmlkZXIgewotCVN0cmluZyBnZXROYW1lKE9iamVjdCBvYmplY3QpOwotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC92YWxpZGF0aW9uL0lWYWxpZGF0b3IuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdmFsaWRhdGlvbi9JVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjMjUzOTAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC92YWxpZGF0aW9uL0lWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotCi0vKioKLSAqIEludGVyZmFjZSBmb3IgdmFsaWRhdG9yLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZSAtIEF1ZyAxLCAyMDA1Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVZhbGlkYXRvciB7Ci0JLyoqCi0JICogVmFsaWRhdGVzIHRoZSBnaXZlbiBzdHJpbmcuIFJldHVybnMgYW4gZXJyb3IgbWVzc2FnZSB0byBkaXNwbGF5IGlmIHRoZQotCSAqIG5ldyB0ZXh0IGlzIGludmFsaWQuIFJldHVybnMgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlcmUgaXMgbm8gZXJyb3IuCi0JICogTm90ZSB0aGF0IHRoZSBlbXB0eSBzdHJpbmcgaXMgbm90IHRyZWF0ZWQgdGhlIHNhbWUgYXMgPGNvZGU+bnVsbDwvY29kZT47Ci0JICogaXQgaW5kaWNhdGVzIGFuIGVycm9yIHN0YXRlIGJ1dCB3aXRoIG5vIG1lc3NhZ2UgdG8gZGlzcGxheS4KLQkgKiAKLQkgKiBAcGFyYW0gbmV3VGV4dAotCSAqICAgICAgICAgICAgdGhlIHRleHQgdG8gY2hlY2sgZm9yIHZhbGlkaXR5Ci0JICogCi0JICogQHJldHVybiBhbiBlcnJvciBtZXNzYWdlIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vIGVycm9yCi0JICovCi0JcHVibGljIFN0cmluZyBpc1ZhbGlkKFN0cmluZyBuZXdUZXh0KTsKLQkKLQkvKioKLQkgKiBWYWxpZGF0ZXMgdGhlIGdpdmVuIG9iamVjdCB2YWx1ZS4KLQkgKiAKLQkgKiBAcGFyYW0gdmFsdWUgdGhlIHZhbHVlIHRvIHZhbGlkYXRlCi0JICogQHJldHVybiBhIHN0YXR1cwotCSAqLwotCXB1YmxpYyBJU3RhdHVzIGlzVmFsaWQoT2JqZWN0IHZhbHVlKTsKLQkKLQlwdWJsaWMgaW50IE1heEZpbGVQYXRoTmFtZUxlbmd0aCA9IDI1NTsKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdmFsaWRhdGlvbi9JVmFsaWRhdG9yRmFjdG9yeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC92YWxpZGF0aW9uL0lWYWxpZGF0b3JGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmYWYwYmEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC92YWxpZGF0aW9uL0lWYWxpZGF0b3JGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb247Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLmludGVybmFsLlZhbGlkYXRvckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaWJhYmxlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk5hbWVkRWxlbWVudDsKLQotLyoqCi0gKiBGYWN0b3J5IGludGVyZmFjZSB0byBjcmVhdGUgdmFyaW91cyB2YWxpZGF0b3JzIHRvIHZhbGlkYXRlIHN0cmluZyB2YWx1ZSBvZgotICogc3BlY2lmaWVkIG9iamVjdCBmZWF0dXJlLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElWYWxpZGF0b3JGYWN0b3J5IHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIElWYWxpZGF0b3JGYWN0b3J5IElOU1RBTkNFID0gVmFsaWRhdG9yRmFjdG9yeQotCQkJLmNyZWF0ZVZhbGlkYXRvckZhY3RvcnkoKTsKLQotCUlWYWxpZGF0b3IgY3JlYXRlTmFtZVZhbGlkYXRvcihOYW1lZEVsZW1lbnQgZSwgQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpOwotCi0JLyoqCi0JICogQ3JlYXRlcyBuYW1lIHZhbGlkYXRvciBmb3IgYSBjb250ZW50IGVsZW1lbnQKLQkgKiAKLQkgKiBAcGFyYW0gZQotCSAqIEByZXR1cm4KLQkgKi8KLQlJVmFsaWRhdG9yIGNyZWF0ZU5hbWVWYWxpZGF0b3IoT2JqZWN0IHBhcmVudCwgQ29udGVudEVsZW1lbnQgZSk7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIG5hbWUgdmFsaWRhdG9yIGZvciBhIGVsZW1lbnQKLQkgKiAKLQkgKiBAcGFyYW0gZQotCSAqIEByZXR1cm4KLQkgKi8KLQlJVmFsaWRhdG9yIGNyZWF0ZU5hbWVWYWxpZGF0b3IoT2JqZWN0IHBhcmVudCwgTmFtZWRFbGVtZW50IGUpOwotCi0JLyoqCi0JICogQ3JlYXRlcyBuYW1lIHZhbGlkYXRvciBmb3IgYW4gZWxlbWVudCBvZiBuZXdUeXBlIHdpdGggbmFtZSBvZiBlLmdldE5hbWUoKQotCSAqIAotCSAqIEBwYXJhbSBlCi0JICogQHJldHVybgotCSAqLwotCUlWYWxpZGF0b3IgY3JlYXRlTmFtZVZhbGlkYXRvcihPYmplY3QgcGFyZW50LCBOYW1lZEVsZW1lbnQgZSwgRUNsYXNzIG5ld1R5cGUpOwotCi0JSVZhbGlkYXRvciBjcmVhdGVQcmVzZW50YXRpb25OYW1lVmFsaWRhdG9yKE9iamVjdCBwYXJlbnQsCi0JCQlEZXNjcmliYWJsZUVsZW1lbnQgZSk7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgdmFsaWRhdG9yIGZvciB0aGUgZ2l2ZW4gZmVhdHVyZSBvZiB0aGUgZ2l2ZW4gb2JqZWN0LiBUaGUgb2JqZWN0Ci0JICogaXMgcmVmZXJlbmNlZCBieSB0aGUgZ2l2ZW4gcGFyZW50IHZpYSB0aGUgc3BlY2lmaWVkIHJlZmVyZW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogQHBhcmFtIHJlZmVyZW5jZSAKLQkgKiBAcGFyYW0gb2JqZWN0Ci0JICogQHBhcmFtIGZlYXR1cmUKLQkgKiAgICAgICAgICAgIHRoZSBmZWF0dXJlIHRvIHZhbGlkYXRlIGl0cyB2YWx1ZQotCSAqIEBwYXJhbSBlQ2xhc3MKLQkgKiAgICAgICAgICAgIHRoZSBFQ2xhc3Mgb2YgdGhlIG9iamVjdCB0byB2YWxpZGF0ZSBvciA8Y29kZT5udWxsPC9jb2RlPiBpZgotCSAqICAgICAgICAgICAgbm90IGFwcGxpY2FibGUKLQkgKiBAcmV0dXJuCi0JICovCi0JSVZhbGlkYXRvciBjcmVhdGVWYWxpZGF0b3IoRU9iamVjdCBwYXJlbnQsIEVSZWZlcmVuY2UgcmVmZXJlbmNlLAotCQkJRUNsYXNzIGVDbGFzcywgRU9iamVjdCBvYmplY3QsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKTsKLQkKLQlJVmFsaWRhdG9yIGNyZWF0ZVZhbGlkYXRvcihFT2JqZWN0IHBhcmVudCwgRVJlZmVyZW5jZSByZWZlcmVuY2UsCi0JCQlJRmlsdGVyIGNoaWxkRmlsdGVyLCBFT2JqZWN0IG9iamVjdCwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUpOwkKLQkKLQlJVmFsaWRhdG9yIGNyZWF0ZVZhbGlkYXRvcihPYmplY3QgcGFyZW50LCBFQ2xhc3MgZUNsYXNzLCBFT2JqZWN0IG9iamVjdCwKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSk7Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3ZhbGlkYXRpb24vTmFtZUNoZWNrZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdmFsaWRhdGlvbi9OYW1lQ2hlY2tlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNjQ5MmQ4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdmFsaWRhdGlvbi9OYW1lQ2hlY2tlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzk0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlUcmVlSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuU3RyVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuQlNBY3Rpdml0eUl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuUHJvY2Vzc1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlN1cHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ2FwYWJpbGl0eVBhdHRlcm47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmliYWJsZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk5hbWVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGVhbVByb2ZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBkZWZpbmVzIHZhcmlvdXMgc3RhdGljIG1ldGhvZHMgdG8gdmFsaWRhdGUgbmFtZSBvZiBzcGVjaWZpZWQKLSAqIG9iamVjdAotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgTmFtZUNoZWNrZXIgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVMRU1FTlRfVEVYVCA9IExpYnJhcnlFZGl0UmVzb3VyY2VzLmVsZW1lbnRfdGV4dDsgCi0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSU5hbWVQcm92aWRlciBwcmVzZW50YXRpb25OYW1lUHJvdmlkZXIgPSBuZXcgSU5hbWVQcm92aWRlcigpIHsKLQotCQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoT2JqZWN0IG9iamVjdCkgewotCQkJaWYob2JqZWN0IGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudCkgewotCQkJCXJldHVybiBQcm9jZXNzVXRpbC5nZXRQcmVzZW50YXRpb25OYW1lKChCcmVha2Rvd25FbGVtZW50KSBvYmplY3QpOwotCQkJfQotCQkJZWxzZSBpZihvYmplY3QgaW5zdGFuY2VvZiBEZXNjcmliYWJsZUVsZW1lbnQpIHsKLQkJCQlyZXR1cm4gKChEZXNjcmliYWJsZUVsZW1lbnQpb2JqZWN0KS5nZXRQcmVzZW50YXRpb25OYW1lKCk7Ci0JCQl9Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQkKLQl9OwotCQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBjaGVja05hbWUoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksCi0JCQlPYmplY3QgcGFyZW50LCBPYmplY3QgZSwgZmluYWwgQ2xhc3MgdHlwZSwKLQkJCUlOYW1lUHJvdmlkZXIgbmFtZVByb3ZpZGVyLCBTdHJpbmcgbmV3TmFtZSwgU3VwcHJlc3Npb24gc3VwcHJlc2lvbiwKLQkJCWJvb2xlYW4gaWdub3JlU3VwcHJlc3NlZCkgewotCQlJRmlsdGVyIGNoaWxkRmlsdGVyID0gbmV3IElGaWx0ZXIoKSB7Ci0KLQkJCXB1YmxpYyBib29sZWFuIGFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCQkJcmV0dXJuIHR5cGUuaXNJbnN0YW5jZShvYmopOwotCQkJfQotCi0JCX07Ci0KLQkJcmV0dXJuIGNoZWNrTmFtZShhZGFwdGVyRmFjdG9yeSwgcGFyZW50LCBlLCBjaGlsZEZpbHRlciwgbmFtZVByb3ZpZGVyLAotCQkJCW5ld05hbWUsIHN1cHByZXNpb24sIGlnbm9yZVN1cHByZXNzZWQpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBjaGVja05hbWUoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksCi0JCQlPYmplY3QgcGFyZW50LCBPYmplY3QgZSwgSUZpbHRlciBjaGlsZEZpbHRlciwKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBuYW1lRmVhdHVyZSwgU3RyaW5nIG5ld05hbWUsCi0JCQlTdXBwcmVzc2lvbiBzdXBwcmVzc2lvbiwgYm9vbGVhbiBpZ25vcmVTdXBwcmVzc2VkKSB7Ci0JCXJldHVybiBjaGVja05hbWUoYWRhcHRlckZhY3RvcnksIHBhcmVudCwgZSwgY2hpbGRGaWx0ZXIsCi0JCQkJY3JlYXRlTmFtZVByb3ZpZGVyKG5hbWVGZWF0dXJlKSwgbmV3TmFtZSwgc3VwcHJlc3Npb24sCi0JCQkJaWdub3JlU3VwcHJlc3NlZCk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGNoZWNrTmFtZShBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwKLQkJCU9iamVjdCBwYXJlbnQsIE9iamVjdCBlLCBJRmlsdGVyIGNoaWxkRmlsdGVyLAotCQkJSU5hbWVQcm92aWRlciBuYW1lUHJvdmlkZXIsIFN0cmluZyBuZXdOYW1lLAotCQkJU3VwcHJlc3Npb24gc3VwcHJlc3Npb24sIGJvb2xlYW4gaWdub3JlU3VwcHJlc3NlZCkgCi0JewotCQlpZiAoaWdub3JlU3VwcHJlc3NlZCkKLQkJCWlmIChzdXBwcmVzc2lvbiAhPSBudWxsICYmIHN1cHByZXNzaW9uLmlzU3VwcHJlc3NlZChlKSkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciBhZGFwdGVyID0gKElUcmVlSXRlbUNvbnRlbnRQcm92aWRlcikgYWRhcHRlckZhY3RvcnkKLQkJCQkuYWRhcHQocGFyZW50LCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQlDb2xsZWN0aW9uIGNoaWxkcmVuOwotCi0JCS8vIGdldCBjaGlsZHJlbiBvZiB0aGUgcm9sbGVkLWRvd24gZGFwdGVyCi0JCS8vCi0JCWJvb2xlYW4gd2FzUm9sbGVkVXAgPSBmYWxzZTsKLQkJQlNBY3Rpdml0eUl0ZW1Qcm92aWRlciBic0l0ZW1Qcm92aWRlciA9IG51bGw7Ci0JCWlmIChhZGFwdGVyIGluc3RhbmNlb2YgQlNBY3Rpdml0eUl0ZW1Qcm92aWRlcikgewotCQkJYnNJdGVtUHJvdmlkZXIgPSAoKEJTQWN0aXZpdHlJdGVtUHJvdmlkZXIpIGFkYXB0ZXIpOwotCQkJd2FzUm9sbGVkVXAgPSBic0l0ZW1Qcm92aWRlci5pc1JvbGxlZFVwKCk7Ci0JCX0KLQkJdHJ5IHsKLQkJCWlmICh3YXNSb2xsZWRVcCkgewotCQkJCWJzSXRlbVByb3ZpZGVyLnNldFJvbGxlZFVwKGZhbHNlKTsKLQkJCX0KLQkJCWNoaWxkcmVuID0gYWRhcHRlci5nZXRDaGlsZHJlbihwYXJlbnQpOwotCQl9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBleCkgewotCQkJdGhyb3cgZXg7Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAod2FzUm9sbGVkVXApIHsKLQkJCQlic0l0ZW1Qcm92aWRlci5iYXNpY1NldFJvbGxlZFVwKHdhc1JvbGxlZFVwKTsKLQkJCX0KLQkJfQotCQkKLQkJaWYgKGUgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50KSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGNoaWxkcmVuLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGl0ZW0gPSBpdGVyLm5leHQoKTsKLQotCQkJLy8gc2tpcCBjaGVja2luZyBvbiBzdXBwcmVzc2VkIGVsZW1lbnQKLQkJCS8vCi0vKjE3MDA1OAlpZiAoc3VwcHJlc3Npb24gIT0gbnVsbCAmJiBzdXBwcmVzc2lvbi5pc1N1cHByZXNzZWQoaXRlbSkpIHsKLQkJCQljb250aW51ZTsKLQkJCX0qLwotCi0JCQlPYmplY3QgY2hpbGQgPSBUbmdVdGlsLnVud3JhcChpdGVtKTsKLQkJCWlmIChjaGlsZCAhPSBlICYmIGNoaWxkRmlsdGVyLmFjY2VwdChjaGlsZCkpIHsKLQkJCQlTdHJpbmcgbmFtZSA9IG5hbWVQcm92aWRlci5nZXROYW1lKGNoaWxkKTsKLQkJCQlpZiAobmFtZS5lcXVhbHNJZ25vcmVDYXNlKG5ld05hbWUpKSB7Ci0JCQkJCS8vIHJldHVybiBJMThuVXRpbC5mb3JtYXRTdHJpbmcoUkVTT1VSQ0VfQlVORExFLCBrZXksIGRhdGEpOwotCQkJCQlyZXR1cm4gTkxTLmJpbmQoCi0JCQkJCQkJTGlicmFyeUVkaXRSZXNvdXJjZXMuZHVwbGljYXRlRWxlbWVudE5hbWVFcnJvcl9tc2csCi0JCQkJCQkJbmFtZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgc3RhdGljIElOYW1lUHJvdmlkZXIgY3JlYXRlTmFtZVByb3ZpZGVyKAotCQkJZmluYWwgRVN0cnVjdHVyYWxGZWF0dXJlIG5hbWVGZWF0dXJlKSB7Ci0JCWlmKG5hbWVGZWF0dXJlID09IFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCS5nZXRNZXRob2RFbGVtZW50X1ByZXNlbnRhdGlvbk5hbWUoKSkgewotCQkJcmV0dXJuIHByZXNlbnRhdGlvbk5hbWVQcm92aWRlcjsgCi0JCX0KLQkJCi0JCXJldHVybiBuZXcgSU5hbWVQcm92aWRlcigpIHsKLQotCQkJcHVibGljIFN0cmluZyBnZXROYW1lKE9iamVjdCBvYmplY3QpIHsKLQkJCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgRU9iamVjdCkgewotCQkJCQlyZXR1cm4gKFN0cmluZykgKChFT2JqZWN0KSBvYmplY3QpLmVHZXQobmFtZUZlYXR1cmUpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXJldHVybiBudWxsOwotCQkJCX0KLQkJCX0KLQotCQl9OwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNoZWNrTmFtZShBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwKLQkJCWZpbmFsIEJyZWFrZG93bkVsZW1lbnQgZSwgQ2xhc3MgdHlwZSwgRVN0cnVjdHVyYWxGZWF0dXJlIG5hbWVGZWF0dXJlLAotCQkJU3RyaW5nIG5ld05hbWUsIFN1cHByZXNzaW9uIHN1cHByZXNzaW9uKSAKLQl7Ci0JCXJldHVybiBjaGVja05hbWUoYWRhcHRlckZhY3RvcnksIG51bGwsIGUsIHR5cGUsIG5hbWVGZWF0dXJlLCBuZXdOYW1lLAotCQkJCXN1cHByZXNzaW9uLCBmYWxzZSk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNoZWNrTmFtZShBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwgT2JqZWN0IHBhcmVudCwKLQkJCWZpbmFsIEJyZWFrZG93bkVsZW1lbnQgZSwgQ2xhc3MgdHlwZSwgZmluYWwgRVN0cnVjdHVyYWxGZWF0dXJlIG5hbWVGZWF0dXJlLAotCQkJU3RyaW5nIG5ld05hbWUsIFN1cHByZXNzaW9uIHN1cHByZXNzaW9uLCBib29sZWFuIGlnbm9yZVN1cHByZXNzZWQpIAotCXsKLQkJU3RyaW5nIG1zZyA9IGNoZWNrRW1wdHkoZSwgbmV3TmFtZSk7Ci0JCWlmKG1zZyAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gbXNnOwotCQl9Ci0KLQkJaWYodHlwZSA9PSBudWxsKSB7Ci0JCQl0eXBlID0gY2hvb3NlVHlwZShlKTsKLQkJfQotCQkKLQkJaWYocGFyZW50ID09IG51bGwpIHsKLQkJCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciBpdGVtUHJvdmlkZXIgPSAoSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyKSBhZGFwdGVyRmFjdG9yeQotCQkJCQkuYWRhcHQoZSwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCXBhcmVudCA9IGl0ZW1Qcm92aWRlci5nZXRQYXJlbnQoZSk7Ci0JCQlpZihwYXJlbnQgPT0gbnVsbCkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9Ci0KLQkJLy8gYmFzaWMgY2hlY2sKLQkJLy8KLQkJbXNnID0gY2hlY2tOYW1lKGFkYXB0ZXJGYWN0b3J5LCBwYXJlbnQsIGUsIHR5cGUsCi0JCQkJY3JlYXRlTmFtZVByb3ZpZGVyKG5hbWVGZWF0dXJlKSwgbmV3TmFtZSwgc3VwcHJlc3Npb24sCi0JCQkJaWdub3JlU3VwcHJlc3NlZCk7Ci0KLQkJaWYgKG1zZyAhPSBudWxsKQotCQkJcmV0dXJuIG1zZzsKLQkJSUZpbHRlciBjaGlsZEZpbHRlciA9IG51bGw7Ci0JCWlmIChlIGluc3RhbmNlb2YgVGVhbVByb2ZpbGUpIHsKLQkJCS8vIGRvbid0IGFsbG93IHRlYW0gd2l0aCB0aGUgc2FtZSBuYW1lIHdpdGhpbiB0aGUgc2FtZSBzY29wZQotCQkJLy8KLQkJCWNoaWxkRmlsdGVyID0gbmV3IElGaWx0ZXIoKSB7Ci0JCQkJcHVibGljIGJvb2xlYW4gYWNjZXB0KE9iamVjdCBvYmopIHsKLQkJCQkJcmV0dXJuIGUgaW5zdGFuY2VvZiBUZWFtUHJvZmlsZTsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0KLQkJLy8gUExFQVNFIERPTidUIENMRUFOIFVQLgotCQkvLyBDb21tZW50ZWQgb3V0IGZvciBub3csIHNpbmNlIHdlIGNoYW5nZSBzY29wZSBvZiBEZWxpdmVyYWJsZS4KLQkJLy8gZWxzZSBpZiAoZSBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0RGVzY3JpcHRvcgotCQkvLyAmJiAoKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgZSkuZ2V0V29ya1Byb2R1Y3QoKSBpbnN0YW5jZW9mCi0JCS8vIERlbGl2ZXJhYmxlKSB7Ci0JCS8vIGNoaWxkRmlsdGVyID0gbmV3IElGaWx0ZXIoKSB7Ci0JCS8vCQotCQkvLyBwdWJsaWMgYm9vbGVhbiBhY2NlcHQoT2JqZWN0IG9iaikgewotCQkvLyByZXR1cm4gZSBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0RGVzY3JpcHRvcgotCQkvLyAmJiAoKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgZSkuZ2V0V29ya1Byb2R1Y3QoKSBpbnN0YW5jZW9mCi0JCS8vIERlbGl2ZXJhYmxlOwotCQkvLyB9Ci0JCS8vIH07Ci0JCS8vIH0KLQotCQlpZiAoY2hpbGRGaWx0ZXIgIT0gbnVsbCkgewotCQkJcmV0dXJuIGNoZWNrTmFtZUluU2NvcGUoYWRhcHRlckZhY3RvcnksIHBhcmVudCwgZSwgbmFtZUZlYXR1cmUsIG5ld05hbWUsCi0JCQkJCWNoaWxkRmlsdGVyLCBzdXBwcmVzc2lvbiwgaWdub3JlU3VwcHJlc3NlZCk7Ci0JCX0KLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGNoZWNrRW1wdHkoT2JqZWN0IGUsIFN0cmluZyBuZXdOYW1lKSB7Ci0JCS8vIHNraXAgY2hlY2tpbmcgb24gYWN0aXZpdHkgdGhhdCBpcyBhIGV4dGVuZGVyIG9yIGxvY2FsIGNvbnRyaWJ1dG9yCi0JCS8vCi0JCWlmKGUgaW5zdGFuY2VvZiBBY3Rpdml0eSAmJiBQcm9jZXNzVXRpbC5pc0V4dGVuZGluZ09yTG9jYWxseUNvbnRyaWJ1dGluZygoQnJlYWtkb3duRWxlbWVudCkgZSkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCQotCQlTdHJpbmcgZWxlbWVudFR5cGU7Ci0JCWlmIChlIGluc3RhbmNlb2YgTmFtZWRFbGVtZW50KSB7Ci0JCQllbGVtZW50VHlwZSA9IFRuZ1V0aWwuZ2V0VHlwZVRleHQoKE5hbWVkRWxlbWVudCkgZSk7Ci0JCX0gZWxzZSB7Ci0JCQllbGVtZW50VHlwZSA9IEVMRU1FTlRfVEVYVDsKLQkJfQotCQlpZiAobmV3TmFtZSA9PSBudWxsIHx8IG5ld05hbWUudHJpbSgpLmxlbmd0aCgpID09IDApIHsJCQkKLQkJCXJldHVybiBOTFMuYmluZChMaWJyYXJ5RWRpdFJlc291cmNlcy5lbXB0eUVsZW1lbnROYW1lRXJyb3JfbXNnLAotCQkJCQlTdHJVdGlsLnRvTG93ZXIoZWxlbWVudFR5cGUpKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBVc2VkIGJ5Ci0JICoge0BsaW5rICNjaGVja05hbWUoQWRhcHRlckZhY3RvcnksIEJyZWFrZG93bkVsZW1lbnQsIEVTdHJ1Y3R1cmFsRmVhdHVyZSwgU3RyaW5nLCBTdXBwcmVzc2lvbiwgYm9vbGVhbikgY2hlY2tOYW1lKCl9Ci0JICogCi0JICogQHBhcmFtIGUKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgQ2xhc3MgY2hvb3NlVHlwZShCcmVha2Rvd25FbGVtZW50IGUpIHsKLQkJaWYgKGUgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJcmV0dXJuIEFjdGl2aXR5LmNsYXNzOwotCQl9IGVsc2UgaWYgKGUgaW5zdGFuY2VvZiBUYXNrRGVzY3JpcHRvcikgewotCQkJcmV0dXJuIFRhc2tEZXNjcmlwdG9yLmNsYXNzOwotCQl9IGVsc2UgaWYgKGUgaW5zdGFuY2VvZiBSb2xlRGVzY3JpcHRvcikgewotCQkJcmV0dXJuIFJvbGVEZXNjcmlwdG9yLmNsYXNzOwotCQl9IGVsc2UgaWYgKGUgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3IpIHsKLQkJCXJldHVybiBXb3JrUHJvZHVjdERlc2NyaXB0b3IuY2xhc3M7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gZS5nZXRDbGFzcygpOwotCQl9Ci0JCS8vIHJldHVybiBCcmVha2Rvd25FbGVtZW50LmNsYXNzOwotCX0KLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBjaGVja05hbWVJblNjb3BlKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LAotCQkJT2JqZWN0IGN1cnJlbnRQYXJlbnQsIEJyZWFrZG93bkVsZW1lbnQgZSwKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBTdHJpbmcgbmFtZSwgSUZpbHRlciBjaGlsZEZpbHRlciwKLQkJCVN1cHByZXNzaW9uIHN1cHByZXNzaW9uLCBib29sZWFuIGlnbm9yZVN1cHByZXNzZWQpIHsKLQkJLy8gY2hlY2sgdXAKLQkJZm9yIChPYmplY3QgcGFyZW50ID0gY3VycmVudFBhcmVudDsgcGFyZW50ICE9IG51bGw7KSB7Ci0JCQlTdHJpbmcgbXNnID0gY2hlY2tOYW1lKGFkYXB0ZXJGYWN0b3J5LCBwYXJlbnQsIGUsIGNoaWxkRmlsdGVyLAotCQkJCQlmZWF0dXJlLCBuYW1lLCBzdXBwcmVzc2lvbiwgaWdub3JlU3VwcHJlc3NlZCk7Ci0JCQlpZiAobXNnICE9IG51bGwpCi0JCQkJcmV0dXJuIG1zZzsKLQkJCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciBpdGVtUHJvdmlkZXIgPSAoSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyKSBhZGFwdGVyRmFjdG9yeQotCQkJCQkuYWRhcHQocGFyZW50LCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkJcGFyZW50ID0gaXRlbVByb3ZpZGVyLmdldFBhcmVudChwYXJlbnQpOwotCQl9Ci0KLQkJLy8gY2hlY2sgZG93bgotCQlpZiAoY3VycmVudFBhcmVudCAhPSBudWxsKSB7Ci0JCQlJdGVyYXRvciBpdGVyID0gbmV3IEFkYXB0ZXJGYWN0b3J5VHJlZUl0ZXJhdG9yKGFkYXB0ZXJGYWN0b3J5LAotCQkJCQljdXJyZW50UGFyZW50LCBmYWxzZSk7Ci0JCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCQlPYmplY3QgY2hpbGQgPSBUbmdVdGlsLnVud3JhcChpdGVyLm5leHQoKSk7Ci0JCQkJaWYgKGNoaWxkICE9IGUgJiYgY2hpbGRGaWx0ZXIuYWNjZXB0KGNoaWxkKSkgewotCQkJCQlTdHJpbmcgY2hpbGROYW1lID0gKFN0cmluZykgKChFT2JqZWN0KSBjaGlsZCkuZUdldChmZWF0dXJlKTsKLQkJCQkJaWYgKG5hbWUuZXF1YWxzSWdub3JlQ2FzZShjaGlsZE5hbWUpKSB7Ci0JCQkJCQkvLyByZXR1cm4gSTE4blV0aWwuZm9ybWF0U3RyaW5nKFJFU09VUkNFX0JVTkRMRSwga2V5LAotCQkJCQkJLy8gZGF0YSk7Ci0JCQkJCQlyZXR1cm4gTkxTCi0JCQkJCQkJCS5iaW5kKAotCQkJCQkJCQkJCUxpYnJhcnlFZGl0UmVzb3VyY2VzLmR1cGxpY2F0ZUVsZW1lbnROYW1lRXJyb3JfbXNnLAotCQkJCQkJCQkJCW5hbWUpOwotCQkJCQl9Ci0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjaGVja05hbWUoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksCi0JCQlmaW5hbCBCcmVha2Rvd25FbGVtZW50IGUsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBTdHJpbmcgbmFtZSwKLQkJCVN1cHByZXNzaW9uIHN1cHByZXNzaW9uKSB7Ci0JCXJldHVybiBjaGVja05hbWUoYWRhcHRlckZhY3RvcnksIGUsIGZlYXR1cmUsIG5hbWUsIHN1cHByZXNzaW9uLCBmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogQ2hlY2tzIHRoZSBuYW1lIG9yIHByZXNlbnRhdGlvbiBuYW1lIG9mIGEgYnJlYWtkb3duIGVsZW1lbnQgdGhhdCBpcwotCSAqIGFscmVhZHkgcGFydCBvZiBhIHByb2Nlc3MuCi0JICogCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICogQHBhcmFtIGUKLQkgKiBAcGFyYW0gZmVhdHVyZQotCSAqIEBwYXJhbSBuYW1lCi0JICogQHBhcmFtIHN1cHByZXNzaW9uCi0JICogQHBhcmFtIGlnbm9yZVN1cHByZXNzZWQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2hlY2tOYW1lKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LAotCQkJZmluYWwgQnJlYWtkb3duRWxlbWVudCBlLCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgU3RyaW5nIG5hbWUsCi0JCQlTdXBwcmVzc2lvbiBzdXBwcmVzc2lvbiwgYm9vbGVhbiBpZ25vcmVTdXBwcmVzc2VkKSAKLQl7Ci0JCXJldHVybiBjaGVja05hbWUoYWRhcHRlckZhY3RvcnksIChPYmplY3QpbnVsbCwgZSwgKENsYXNzKW51bGwsIGZlYXR1cmUsIG5hbWUsIHN1cHByZXNzaW9uLCBpZ25vcmVTdXBwcmVzc2VkKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNhbkhhdmVFbXB0eVByZXNlbnRhdGlvbk5hbWUoRGVzY3JpYmFibGVFbGVtZW50IGUpIHsKLQkJaWYoZSBpbnN0YW5jZW9mIFZhcmlhYmlsaXR5RWxlbWVudCkgewotCQkJVmFyaWFiaWxpdHlUeXBlIHZUeXBlID0gKChWYXJpYWJpbGl0eUVsZW1lbnQpZSkuZ2V0VmFyaWFiaWxpdHlUeXBlKCk7Ci0JCQlyZXR1cm4gdlR5cGUgPT0gVmFyaWFiaWxpdHlUeXBlLkVYVEVORFMKLQkJCQl8fCB2VHlwZSA9PSBWYXJpYWJpbGl0eVR5cGUuQ09OVFJJQlVURVMKLQkJCQl8fCB2VHlwZSA9PSBWYXJpYWJpbGl0eVR5cGUuTE9DQUxfQ09OVFJJQlVUSU9OOwkJCQotCQl9Ci0JCXJldHVybiBmYWxzZTsJCi0JfQotCQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjaGVja0ZpbGVQYXRoTGVuZ3RoKAotCQkJTWV0aG9kRWxlbWVudCBwYXJlbnRFbGVtZW50V2l0aFJlc291cmNlLAotCQkJTWV0aG9kRWxlbWVudCBlbGVtZW50LAotCQkJU3RyaW5nIG5hbWUsCi0JCQlpbnQgbWF4TGVuZ3RoLAotCQkJU3RyaW5nW10gZmlsZVBhdGhOYW1lKSB7Ci0JCVJlc291cmNlIHJlcyA9IHBhcmVudEVsZW1lbnRXaXRoUmVzb3VyY2UuZVJlc291cmNlKCk7Ci0JCVVSSSB1cmkgPSByZXMuZ2V0VVJJKCk7Ci0JCWlmIChmaWxlUGF0aE5hbWUgIT0gbnVsbCAmJiBmaWxlUGF0aE5hbWUubGVuZ3RoID49IDEpIHsKLQkJCS8vVG8gZG86IGNhbGN1bGF0ZSBwYXRoCi0JCQkvL2ZpbGVQYXRoTmFtZVswXSA9ID8/Ci0JCX0JCQotCQkKLQkJaW50IHBhcmVudFJlc0xlbiA9IHVyaS50b0ZpbGVTdHJpbmcoKS5sZW5ndGgoKTsJCQotCQlpbnQgbG9jYWxHcm91cExlbiA9IDIwOwotCQlpZiAocGFyZW50RWxlbWVudFdpdGhSZXNvdXJjZSBpbnN0YW5jZW9mIE1ldGhvZExpYnJhcnkpIHsKLQkJCWxvY2FsR3JvdXBMZW4gPSAwOwotCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBSb2xlKSB7Ci0JCQlsb2NhbEdyb3VwTGVuID0gNTsJCS8vInJvbGVzIgotCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBDYXBhYmlsaXR5UGF0dGVybikgewotCQkJbG9jYWxHcm91cExlbiA9IDE4OwkJLy8iY2FwYWJpbGl0eXBhdHRlcm5zIgotCQl9Ci0JCS8vTW9yZSBlbHNlIGlmIGhlcmUKLQkJCi0JCWludCB0b3RhbExlbiA9IHBhcmVudFJlc0xlbiArIGxvY2FsR3JvdXBMZW4gKyBuYW1lLmxlbmd0aCgpOwkJCi0JCXJldHVybiB0b3RhbExlbiA8PSBtYXhMZW5ndGg7CQotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdmFsaWRhdGlvbi9QbHVnaW5EZXBJbmZvLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3ZhbGlkYXRpb24vUGx1Z2luRGVwSW5mby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjhjNjk0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdmFsaWRhdGlvbi9QbHVnaW5EZXBJbmZvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU3RhY2s7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGhhbmRsZXMgcGx1Z2luIGRlcGVuZGVuY3kgaW5mbyBmb3IgY2lyY3VsYXIgZGVwZW5kZW5jeSBjaGVjawotICogCi0gKiBAYXV0aG9yIFdlaXBpbmcgTHUKLSAqIEBzaW5jZSAxLjIKLSAqLwotcHVibGljIGNsYXNzIFBsdWdpbkRlcEluZm8gewotCi0JcHJpdmF0ZSBQbHVnaW5EZXBlbmRlbmN5SW5mb01nciBtZ3I7Ci0JcHJpdmF0ZSBNZXRob2RQbHVnaW4gcGx1Z2luOwotCXByaXZhdGUgSGFzaE1hcCBwYXJlbnRNYXA7Ci0JcHJpdmF0ZSBib29sZWFuIGNvbXBsZXRlID0gZmFsc2U7Ci0JcHJpdmF0ZSBib29sZWFuIGRlYnVnID0gZmFsc2U7Ci0JCi0JcHJvdGVjdGVkIFBsdWdpbkRlcEluZm8oUGx1Z2luRGVwZW5kZW5jeUluZm9NZ3IgbWdyLCBNZXRob2RQbHVnaW4gcGx1Z2luKSB7Ci0JCXRoaXMubWdyID0gbWdyOwotCQl0aGlzLnBsdWdpbiA9IHBsdWdpbjsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNDb21wbGV0ZSgpIHsKLQkJcmV0dXJuIGNvbXBsZXRlOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBidWlsZChib29sZWFuIGNoZWNrQ2lyY3VsYXIpIHsKLQkJaWYgKGRlYnVnKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxEPiBidWlsZDogIiArIHRoaXMpOwkvLyROT04tTkxTLTEkCi0JCX0KLQkJYnVpbGRJbm5lcihjaGVja0NpcmN1bGFyKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkSW5uZXIoYm9vbGVhbiBjaGVja0NpcmN1bGFyKSB7Ci0JCU9iamVjdCBpbmZvID0gbWdyLmdldFByb2Nlc3NlZEluZm8oZ2V0UGx1Z2luKCkpOwotCQlpZiAoaW5mbyAhPSBudWxsKSB7Ci0JCQlpZiAoaW5mbyA9PSB0aGlzICYmIGNvbXBsZXRlKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkludGVybmFsIGVycm9yIGluIGJ1aWxkSW5uZXI6ICIgKyBpbmZvKTsJCS8vJE5PTi1OTFMtMSQKLQkJfQotCQltZ3IuYWRkVG9Qcm9jZXNzZWQodGhpcyk7Ci0JCWlmIChkZWJ1ZykgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJMRD4gYnVpbGRJbm5lcjogIiArIHRoaXMpOwkvLyROT04tTkxTLTEkCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIiIpOwkJCQkJCQkvLyROT04tTkxTLTEkCi0JCX0KLQkJYnVpbGRJbm5lcl8oY2hlY2tDaXJjdWxhcik7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBidWlsZElubmVyXyhib29sZWFuIGNoZWNrQ2lyY3VsYXIpIHsKLQkJTGlzdCBwYXJlbnRzID0gZ2V0UGx1Z2luKCkuZ2V0QmFzZXMoKTsKLQkJaW50IHN6ID0gcGFyZW50cyA9PSBudWxsID8gMCA6IHBhcmVudHMuc2l6ZSgpOwotCQlpZiAoc3ogPT0gMCkgewotCQkJY29tcGxldGUgPSB0cnVlOwotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlwYXJlbnRNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQlMaXN0IHByb2Nlc3NlZFBhcmVudHMgPSBudWxsOwotCQlmb3IgKGludCBpID0gMDsgaTwgc3o7IGkrKykgewotCQkJTWV0aG9kUGx1Z2luIHBhcmVudEVsZW0gPSAoTWV0aG9kUGx1Z2luKSBwYXJlbnRzLmdldChpKTsKLQkJCVBsdWdpbkRlcEluZm8gcGluZm8gPSAoUGx1Z2luRGVwSW5mbykgbWdyLmdldFByb2Nlc3NlZEluZm8ocGFyZW50RWxlbSk7Ci0JCQlpZiAocGluZm8gPT0gbnVsbCl7Ci0JCQkJcGluZm8gPSBuZXcgUGx1Z2luRGVwSW5mbyhtZ3IsIHBhcmVudEVsZW0pOwotCQkJCXBhcmVudE1hcC5wdXQocGFyZW50RWxlbS5nZXRHdWlkKCksIHBpbmZvKTsKLQkJCQlwaW5mby5idWlsZElubmVyKGNoZWNrQ2lyY3VsYXIpOwotCQkJfSBlbHNlIHsKLQkJCQlwYXJlbnRNYXAucHV0KHBhcmVudEVsZW0uZ2V0R3VpZCgpLCBwaW5mbyk7Ci0JCQkJaWYgKGNoZWNrQ2lyY3VsYXIpIHsKLQkJCQkJaWYgKHByb2Nlc3NlZFBhcmVudHMgPT0gbnVsbCkgewotCQkJCQkJcHJvY2Vzc2VkUGFyZW50cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJfQotCQkJCQlwcm9jZXNzZWRQYXJlbnRzLmFkZChwaW5mbyk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWNvbXBsZXRlID0gdHJ1ZTsKLQkJCQotCQlpZiAoY2hlY2tDaXJjdWxhciAmJiBwcm9jZXNzZWRQYXJlbnRzICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGk9MDsgaTxwcm9jZXNzZWRQYXJlbnRzLnNpemUoKTsgaSsrKSB7Ci0JCQkJcmVhY2hhYmxlQnkoKFBsdWdpbkRlcEluZm8pIHByb2Nlc3NlZFBhcmVudHMuZ2V0KGkpKTsKLQkJCX0KLQkJfQotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiByZWFjaGFibGVCeShQbHVnaW5EZXBJbmZvIGluZm8pICB7Ci0JCWlmICghIChpbmZvIGluc3RhbmNlb2YgUGx1Z2luRGVwSW5mbykpIHsKLQkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCQl9Ci0JCWlmIChkZWJ1ZykgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJMRD4gRW50cnkgcmVhY2hhYmxlQnk6IHRoaXMgLT4gIiArIHRoaXMpOwkvLyROT04tTkxTLTEkCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxEPiBFbnRyeSByZWFjaGFibGVCeTogaW5mbyAtPiAiICsgaW5mbyk7CS8vJE5PTi1OTFMtMSQKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiIik7CQkJCQkJCQkJCQkvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIHJlYWNoYWJsZUJ5KChQbHVnaW5EZXBJbmZvKSBpbmZvLCBuZXcgU3RhY2soKSwgbmV3IEhhc2hNYXAoKSk7Ci0JfQotCQotCXByaXZhdGUgYm9vbGVhbiByZWFjaGFibGVCeShQbHVnaW5EZXBJbmZvIGluZm8sIFN0YWNrIHN0YWNrLCBNYXAgc2VlbikgIHsKLQkJc3RhY2sucHVzaChpbmZvKTsKLQkJaWYgKGRlYnVnKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxEPiByZWFjaGFibGVCeTogdGhpcyAtPiAiICsgdGhpcyk7CQkvLyROT04tTkxTLTEkCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxEPiByZWFjaGFibGVCeTogaW5mbyAtPiAiICsgaW5mbyk7CQkvLyROT04tTkxTLTEkCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIiIpOwkJCQkJCQkJCQkvLyROT04tTkxTLTEkCi0JCX0KLQkJYm9vbGVhbiByZXQgPSAgcmVhY2hhYmxlQnlfKGluZm8sIHN0YWNrLCBzZWVuKTsKLQkJc3RhY2sucG9wKCk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCQotCXByaXZhdGUgYm9vbGVhbiByZWFjaGFibGVCeV8oUGx1Z2luRGVwSW5mbyBpbmZvLCBTdGFjayBzdGFjaywgTWFwIHNlZW4pICB7Ci0JCU1hcCB0ZXN0TWFwID0gaW5mby5wYXJlbnRNYXA7CQkKLQkJaWYgKHRlc3RNYXAgPT0gbnVsbCB8fCB0ZXN0TWFwLmlzRW1wdHkoKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCQotCQlpZiAodGVzdE1hcC5jb250YWluc0tleShnZXRQbHVnaW4oKS5nZXRHdWlkKCkpKSB7Ci0JCQlpZiAoZGVidWcpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxEPiBDb250YWluZWQgaW4gcGFyZW50TWFwIG9mOiAiICsgaW5mbyk7CQkvLyROT04tTkxTLTEkCQkJCQkJCQkJCi0JCQl9Ci0JCQlzdGFjay5wdXNoKHRoaXMpOwotCQkJbWdyLmxvZ0NpcmN1bGFyRGVwZW5kZW5jeSgoU3RhY2spIHN0YWNrLmNsb25lKCkpOwotCQkJc3RhY2sucG9wKCk7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQkKLQkJaWYgKHNlZW4uY29udGFpbnNLZXkoaW5mby5nZXRQbHVnaW4oKS5nZXRHdWlkKCkpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJCi0JCQotCQlzZWVuLnB1dChpbmZvLmdldFBsdWdpbigpLmdldEd1aWQoKSwgaW5mbyk7Ci0JCQotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gdGVzdE1hcC52YWx1ZXMoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlQbHVnaW5EZXBJbmZvIHBhcmVudEluZm8gPSAoUGx1Z2luRGVwSW5mbykgaXQubmV4dCgpOwotCQkJaWYgKHBhcmVudEluZm8uY29udGFpbmVkSW4oc3RhY2spKSB7Ci0JCQkJaWYgKGRlYnVnKSB7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTEQ+IGNvbnRhaW5lZEluIHN0YWNrOiAiICsgaW5mbyk7CQkvLyROT04tTkxTLTEkCQkJCQkJCQkJCi0JCQkJfQotCQkJCXN0YWNrLnB1c2gocGFyZW50SW5mbyk7Ci0JCQkJbWdyLmxvZ0NpcmN1bGFyRGVwZW5kZW5jeSgoU3RhY2spIHN0YWNrLmNsb25lKCkpOwotCQkJCXN0YWNrLnBvcCgpOwotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQkJaWYgIChyZWFjaGFibGVCeShwYXJlbnRJbmZvLCBzdGFjaywgc2VlbikpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQkKLQkJCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JcHVibGljIE1ldGhvZFBsdWdpbiBnZXRQbHVnaW4oKSB7Ci0JCXJldHVybiBwbHVnaW47Ci0JfQotCQkJCQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBUbmdVdGlsLmdldExhYmVsV2l0aFBhdGgocGx1Z2luKTsKLQl9Ci0JCi0JLy9UaGlzIHdvdWxkIHNjYWxlIHVwIGZvciBwZXJmb3JtYW5jZSB3aGVuIGluZm9MaXN0IGdldHMgbGFyZ2UKLQlwcml2YXRlIGJvb2xlYW4gY29udGFpbmVkSW4oTGlzdCBpbmZvTGlzdCkgewotCQlpbnQgc3ogPSBpbmZvTGlzdCA9PSBudWxsID8gMCA6IGluZm9MaXN0LnNpemUoKTsKLQkJaWYgKHN6ID09IDApIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlTdHJpbmcgZ3VpZCA9IGdldFBsdWdpbigpLmdldEd1aWQoKTsKLQkJaWYgKHN6ID09IDEpIHsKLQkJCXJldHVybiBndWlkLmVxdWFscygoKFBsdWdpbkRlcEluZm8pIGluZm9MaXN0LmdldCgwKSkuZ2V0UGx1Z2luKCkuZ2V0R3VpZCgpKTsKLQkJfQotCQlNYXAgbGlzdE1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCWZvciAoaW50IGk9MDsgaTxzejsgaSsrKSB7Ci0JCQlQbHVnaW5EZXBJbmZvIGluZm8gPSAoUGx1Z2luRGVwSW5mbykgaW5mb0xpc3QuZ2V0KGkpOwotCQkJbGlzdE1hcC5wdXQoaW5mby5nZXRQbHVnaW4oKS5nZXRHdWlkKCksIGluZm8pOwotCQl9Ci0JCQotCQlyZXR1cm4gbGlzdE1hcC5jb250YWluc0tleShndWlkKTsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3ZhbGlkYXRpb24vUGx1Z2luRGVwZW5kZW5jeUluZm9NZ3IuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdmFsaWRhdGlvbi9QbHVnaW5EZXBlbmRlbmN5SW5mb01nci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMGViYTg2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdmFsaWRhdGlvbi9QbHVnaW5EZXBlbmRlbmN5SW5mb01nci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlN0YWNrOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLlByb2ZpbGluZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci0KLS8qKgotICogVGhpcyBjbGFzcyBtYW5hZ2VzIGNpcmN1bGFyIGRlcGVuZGVuY3kgaW5mbyBmb3IgcGx1Z2lucy4KLSAqIAotICogQGF1dGhvciBXZWlwaW5nIEx1Ci0gKiBAc2luY2UgMS4yCi0gKi8KLXB1YmxpYyBjbGFzcyBQbHVnaW5EZXBlbmRlbmN5SW5mb01nciB7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBwcm9maWxpbmcgPSBmYWxzZTsKLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGRlYnVnID0gZmFsc2U7Ci0JcHJpdmF0ZSBNZXRob2RMaWJyYXJ5IGxpYjsKLQlwcml2YXRlIE1hcCBwcm9jZXNzZWQ7Ci0JcHJpdmF0ZSBMaXN0IGNpcmN1bGFyTGlzdDsKLQkKLQlwdWJsaWMgUGx1Z2luRGVwZW5kZW5jeUluZm9NZ3IoTWV0aG9kTGlicmFyeSBsaWIpIHsKLQkJdGhpcy5saWIgPSBsaWI7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGxvZ0NpcmN1bGFyRGVwZW5kZW5jeShTdGFjayB0cmFjZSkgewotCQlpZiAoY2lyY3VsYXJMaXN0ID09IG51bGwpIHsKLQkJCWNpcmN1bGFyTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJfQotCQljaXJjdWxhckxpc3QuYWRkQWxsKHRyYWNlKTsKLQl9Ci0JCi0JcHJpdmF0ZSBMaXN0IGdldEFuZENsZWFyQ2lyY3VsYXJMaXN0KCkgewotCQlMaXN0IHJldCA9IGNpcmN1bGFyTGlzdDsKLQkJY2lyY3VsYXJMaXN0ID0gbnVsbDsKLQkJcmV0dXJuIHJldDsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGxvZyhTdHJpbmcgbXNnKSB7Ci0JCUxpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmxvZyhtc2cpOwotCX0KLQkKLQlwcml2YXRlIFBsdWdpbkRlcEluZm8gcmVnaXN0ZXJQbHVnaW4oTWV0aG9kUGx1Z2luIHBsdWdpbiwgYm9vbGVhbiBjaGVja0NpcmN1bGFyKSB7CQkKLQkJUGx1Z2luRGVwSW5mbyBpbmZvID0gIGdldFByb2Nlc3NlZEluZm8ocGx1Z2luKTsKLQkJaWYgKGluZm8gPT0gbnVsbCkgewkJCi0JCQlpbmZvID0gbmV3IFBsdWdpbkRlcEluZm8odGhpcywgcGx1Z2luKTsKLQkJfQotCQlpZiAoISBpbmZvLmlzQ29tcGxldGUoKSkgewotCQkJaW5mby5idWlsZChjaGVja0NpcmN1bGFyKTsKLQkJfQotCQlyZXR1cm4gaW5mbzsKLQl9Ci0JCi0JcHVibGljIElTdGF0dXMgY2hlY2tDaXJjdWxhckRlcGVuZG5lY3koTWV0aG9kUGx1Z2luIHBsdWdpbikgewotCQlpZiAoZGVidWcpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTEQ+IHBsdWdpbjogIiArIFRuZ1V0aWwuZ2V0TGFiZWxXaXRoUGF0aChwbHVnaW4pKTsJCS8vJE5PTi1OTFMtMSQKLQkJfQotCQlQbHVnaW5EZXBJbmZvIGluZm8gPSByZWdpc3RlclBsdWdpbihwbHVnaW4sIHRydWUpOwotCQlMaXN0IGNpckxpc3QgPSBnZXRBbmRDbGVhckNpcmN1bGFyTGlzdCgpOwotCQlib29sZWFuIGxvb3AgPSBjaXJMaXN0ICE9IG51bGwgJiYgIWNpckxpc3QuaXNFbXB0eSgpOwotCQlpZiAobG9vcCkgewotCQkJbG9nKCJFcnJvcj4gQ2lyY3VsYXIgZGVwZW5kZW5jeSBkZXRlY3RlZDogIik7CQkvLyROT04tTkxTLTEkCi0JCQlmb3IgKGludCBpPTA7IGk8Y2lyTGlzdC5zaXplKCk7IGkrKykgewotCQkJCVBsdWdpbkRlcEluZm8gbG9vcEluZm8gPSAoUGx1Z2luRGVwSW5mbykgY2lyTGlzdC5nZXQoaSk7Ci0JCQkJTWV0aG9kRWxlbWVudCBlbGVtID0gbG9vcEluZm8uZ2V0UGx1Z2luKCk7CQkJCQkJCQotCQkJCWxvZygiRXJyb3I+ICIgKyBpICsgIjogIiArIFRuZ1V0aWwuZ2V0TGFiZWxXaXRoUGF0aChlbGVtKSk7Ly8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQl9Ci0JCQkJbG9nKCIiKTsJCQkJCQkJCS8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBuZXcgVmFsaWRhdGlvblN0YXR1cyhJU3RhdHVzLkVSUk9SLCAwLCBnZW5FcnJvck1zZyhjaXJMaXN0KSwgcGx1Z2luLCBudWxsKTsKLQkJfQotCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQl9Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgZ2VuRXJyb3JNc2coTGlzdCBjaXJMaXN0KSB7Ci0JCVN0cmluZyBtc2cgPSBMaWJyYXJ5RWRpdFJlc291cmNlcy52YXJpYWJpbGl0eV9lbGVtZW50X2NpcmN1bGFyX2xvb3BfZXJyb3JfbXNnOwotCQlmb3IgKGludCBpPTA7IGk8Y2lyTGlzdC5zaXplKCk7IGkrKykgewotCQkJUGx1Z2luRGVwSW5mbyBsb29wSW5mbyA9IChQbHVnaW5EZXBJbmZvKSBjaXJMaXN0LmdldChpKTsKLQkJCU1ldGhvZEVsZW1lbnQgZWxlbSA9IGxvb3BJbmZvLmdldFBsdWdpbigpOwkKLQkJCWlmIChpID4gMCkgewotCQkJCW1zZyArPSAiOiAiOyAvLyROT04tTkxTLTEkIAotCQkJfQotCQkJbXNnICs9IFRuZ1V0aWwuZ2V0TGFiZWxXaXRoUGF0aChlbGVtKTsJCi0JCX0KLQkJcmV0dXJuIG1zZzsKLQl9Ci0JCQkKLQlwcm90ZWN0ZWQgYm9vbGVhbiBwcm9jZXNzZWQoTWV0aG9kUGx1Z2luIHBsdWdpbikgewotCQlyZXR1cm4gcHJvY2Vzc2VkICE9IG51bGwgJiYgcHJvY2Vzc2VkLmNvbnRhaW5zS2V5KHBsdWdpbi5nZXRHdWlkKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgUGx1Z2luRGVwSW5mbyBnZXRQcm9jZXNzZWRJbmZvKE1ldGhvZFBsdWdpbiBwbHVnaW4pIHsKLQkJcmV0dXJuIHByb2Nlc3NlZCA9PSBudWxsID8gbnVsbCA6IChQbHVnaW5EZXBJbmZvKSBwcm9jZXNzZWQuZ2V0KHBsdWdpbi5nZXRHdWlkKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBhZGRUb1Byb2Nlc3NlZChQbHVnaW5EZXBJbmZvIGluZm8pIHsKLQkJaWYgKHByb2Nlc3NlZCA9PSBudWxsKSB7Ci0JCQlwcm9jZXNzZWQgPSBuZXcgSGFzaE1hcCgpOwotCQl9Ci0JCXByb2Nlc3NlZC5wdXQoaW5mby5nZXRQbHVnaW4oKS5nZXRHdWlkKCksIGluZm8pOwotCX0KLQkKLQkvKgotCSAqIENoZWNrIGNpcmN1bGFyIGRlcGVuZGVuY3kgYW1vbmcgdGhlIHBsdWdpbnMgb2YgdGhlIGxpYnJhcnkuCi0JICovCi0JcHVibGljIENoZWNrUmVzdWx0IGNoZWNrQ2lyY3VsYXJEZXBlbmRuZWN5KFRyYWNlciB0cmFjZXIsIGJvb2xlYW4gYWNjdW1FcnJvcnMpIHsKLQkJaWYgKHRyYWNlciA9PSBudWxsKSB7Ci0JCQl0cmFjZXIgPSBuZXcgVHJhY2VyKCkgewotCQkJCXB1YmxpYyB2b2lkIHRyYWNlKFN0cmluZyBsaW5lKSB7fQotCQkJfTsKLQkJfQotCQlsb25nIHVzZWRNZW0wID0gMDsKLQkJUnVudGltZSBydCA9IFJ1bnRpbWUuZ2V0UnVudGltZSgpOyAKLQkJaWYgKHByb2ZpbGluZykgewotCQkJZm9yIChJdGVyYXRvciBpdCA9IGxpYi5lQWxsQ29udGVudHMoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCWl0Lm5leHQoKTsKLQkJCX0KLQkJCVByb2ZpbGluZ1V0aWwuZnVsbEdDKCk7Ci0JCQl1c2VkTWVtMCA9IHJ0LnRvdGFsTWVtb3J5KCkgLSBydC5mcmVlTWVtb3J5KCk7Ci0JCX0KLQotCQlDaGVja1Jlc3VsdCByZXN1bHQgPSBjaGVja0NpcmN1bGFyRGVwZW5kbmVjeV8odHJhY2VyLCBhY2N1bUVycm9ycyk7Ci0JCQotCQlpZiAocHJvZmlsaW5nKSB7Ci0JCQlQcm9maWxpbmdVdGlsLmZ1bGxHQygpOwotCQkJU3lzdGVtLm91dC5wcmludGxuKCJMRD4gdXNlZE1lbTA6ICIgKyB1c2VkTWVtMC8xMDAwICsgIiBrIGJ5dGVzIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJbG9uZyB1c2VkTWVtMSA9IHJ0LnRvdGFsTWVtb3J5KCkgLSBydC5mcmVlTWVtb3J5KCk7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxEPiB1c2VkTWVtMTogIiArIHVzZWRNZW0xLzEwMDAgKyAiIGsgYnl0ZXMiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxEPiBkaWZmTWVtOiAiICsgKHVzZWRNZW0xIC0gdXNlZE1lbTApLzEwMDAgKyAiIGsgYnl0ZXMiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi0JcHJpdmF0ZSBDaGVja1Jlc3VsdCBjaGVja0NpcmN1bGFyRGVwZW5kbmVjeV8oVHJhY2VyIHRyYWNlciwgYm9vbGVhbiBhY2N1bUVycm9ycykgewotCQlDaGVja1Jlc3VsdCByZXN1bHQgPSBuZXcgQ2hlY2tSZXN1bHQoKTsKLQkJCi0JCUxpc3QgcGx1Z2lucyA9IGxpYi5nZXRNZXRob2RQbHVnaW5zKCk7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSBwbHVnaW5zLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSAoTWV0aG9kUGx1Z2luKSBpdC5uZXh0KCk7Ci0JCQkKLQkJCVBsdWdpbkRlcEluZm8gaW5mbyA9IHJlZ2lzdGVyUGx1Z2luKHBsdWdpbiwgdHJ1ZSk7Ci0JCQlMaXN0IGNpckxpc3QgPSBnZXRBbmRDbGVhckNpcmN1bGFyTGlzdCgpOwkJCQotCQkJYm9vbGVhbiBsb29wID0gY2lyTGlzdCAhPSBudWxsICYmICFjaXJMaXN0LmlzRW1wdHkoKTsKLQkJCWlmIChsb29wKSB7Ci0JCQkJdHJhY2VyLnRyYWNlKCJFcnJvcj4gQ2lyY3VsYXIgZGVwZW5kZW5jeSBkZXRlY3RlZDogIik7CQkvLyROT04tTkxTLTEkCi0JCQkJZm9yIChpbnQgaT0wOyBpPGNpckxpc3Quc2l6ZSgpOyBpKyspIHsKLQkJCQkJUGx1Z2luRGVwSW5mbyBsb29wSW5mbyA9IChQbHVnaW5EZXBJbmZvKSBjaXJMaXN0LmdldChpKTsKLQkJCQkJTWV0aG9kRWxlbWVudCBlbGVtID0gbG9vcEluZm8uZ2V0UGx1Z2luKCk7CQkJCQkJCQotCQkJCQl0cmFjZXIudHJhY2UoIkVycm9yPiAiICsgaSArICI6ICIgKyBUbmdVdGlsLmdldExhYmVsV2l0aFBhdGgoZWxlbSkpOy8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCX0KLQkJCQlyZXN1bHQuY2lyY3VsYXJMaXN0LmFkZChjaXJMaXN0KTsKLQkJCQlpZiAoISBhY2N1bUVycm9ycykgewotCQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJCX0KLQkJCX0KLQkJfQkJCQkKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBjbGFzcyBDaGVja1Jlc3VsdCB7Ci0JCXB1YmxpYyBMaXN0IGNpcmN1bGFyTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCi0JCXB1YmxpYyBpbnQgZ2V0RXJyb3JDb3VudCgpIHsKLQkJCXJldHVybiBjaXJjdWxhckxpc3Quc2l6ZSgpOwotCQl9CQkKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3ZhbGlkYXRpb24vVHJhY2VyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3ZhbGlkYXRpb24vVHJhY2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4YTQxM2MuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC92YWxpZGF0aW9uL1RyYWNlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbjsKLQotcHVibGljIGludGVyZmFjZSBUcmFjZXIgewotCXZvaWQgdHJhY2UoU3RyaW5nIGxpbmUpOwotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC92YWxpZGF0aW9uL1VuaXF1ZU5hbWVIYW5kbGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3ZhbGlkYXRpb24vVW5pcXVlTmFtZUhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmM3ZTRhOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3ZhbGlkYXRpb24vVW5pcXVlTmFtZUhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotCi0KLS8qKgotICogVGhpcyBjbGFzcyBpcyBhIGhlbHBlciBjbGFzcyBmb3IgbWV0aG9kIGVsZW1lbnQgdW5pcXVlIG5hbWUgaGFuZGxpbmcKLSAqIAotICogQGF1dGhvciBXZWlwaW5nIEx1Ci0gKiBAc2luY2UgMS4yCi0gKi8KLXB1YmxpYyBjbGFzcyBVbmlxdWVOYW1lSGFuZGxlciB7Ci0JcHJpdmF0ZSBTZXQ8U3RyaW5nPiBuYW1lcyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKLQkKLQkvKioKLQkgKiBFbXB0eSBjb25zdHJ1Y3RvcgotCSAqLwotCXB1YmxpYyBVbmlxdWVOYW1lSGFuZGxlcigpIHsKLQl9Ci0JCi0JLyoqCi0JICogQHBhcmFtIGVsZW1lbnRzCi0JICovCi0JcHVibGljIHZvaWQgcmVnaXN0ZXJOYW1lcyhDb2xsZWN0aW9uPD8gZXh0ZW5kcyBNZXRob2RFbGVtZW50PiBlbGVtZW50cykgewotCQlpZiAoZWxlbWVudHMgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWZvciAoSXRlcmF0b3I8PyBleHRlbmRzIE1ldGhvZEVsZW1lbnQ+IGl0ID0gZWxlbWVudHMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJTWV0aG9kRWxlbWVudCBlbGVtZW50ID0gaXQubmV4dCgpOwotCQkJcmVnaXN0ZXIoZWxlbWVudC5nZXROYW1lKCkpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIEBwYXJhbSBlbGVtZW50cwotCSAqLwotCXB1YmxpYyB2b2lkIHJlZ2lzdGVyUHJlc2VudGF0aW9uTmFtZXMoQ29sbGVjdGlvbjw/IGV4dGVuZHMgTWV0aG9kRWxlbWVudD4gZWxlbWVudHMpIHsKLQkJaWYgKGVsZW1lbnRzID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQlmb3IgKEl0ZXJhdG9yPD8gZXh0ZW5kcyBNZXRob2RFbGVtZW50PiBpdCA9IGVsZW1lbnRzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCU1ldGhvZEVsZW1lbnQgZWxlbWVudCA9IGl0Lm5leHQoKTsKLQkJCXJlZ2lzdGVyKGVsZW1lbnQuZ2V0UHJlc2VudGF0aW9uTmFtZSgpKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqLwotCXB1YmxpYyB2b2lkIHJlZ2lzdGVyKFN0cmluZyBuYW1lKSB7Ci0JCW5hbWVzLmFkZChuYW1lLnRvVXBwZXJDYXNlKCkpOwkJCi0JfQotCQotCS8qKgotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICovCi0JcHVibGljIFN0cmluZyBnZXRVbmlxdWVOYW1lKFN0cmluZyBvbGROYW1lKSB7CQkKLQkJU3RyaW5nIG5hbWUgPSBvbGROYW1lOwotCQlpbnQgaSA9IDA7Ci0JCXdoaWxlKG5hbWVzLmNvbnRhaW5zKG5hbWUudG9VcHBlckNhc2UoKSkpIHsKLQkJCWkrKzsKLQkJCW5hbWUgPSBvbGROYW1lICsgIl8iICsgaTsJCS8vJE5PTi1OTFMtMSQgCi0JCX0JCQkKLQkJcmV0dXJuIG5hbWU7Ci0JfQotCQotCQotCQotCQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC92YWxpZGF0aW9uL1VuaXF1ZU5hbWVQTmFtZUhhbmRsZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdmFsaWRhdGlvbi9VbmlxdWVOYW1lUE5hbWVIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlMDBmNDEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC92YWxpZGF0aW9uL1VuaXF1ZU5hbWVQTmFtZUhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmliYWJsZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotCi0KLS8qKgotICogVGhpcyBjbGFzcyBpcyBhIGhlbHBlciBjbGFzcyBmb3IgdW5pcXVlIG5hbWUgYW5kIHByZXNlbnRhdGlvbiBuYW1lIGhhbmRsaW5nCi0gKiAKLSAqIEBhdXRob3IgV2VpcGluZyBMdQotICogQHNpbmNlIDEuMgotICovCi1wdWJsaWMgY2xhc3MgVW5pcXVlTmFtZVBOYW1lSGFuZGxlciB7Ci0JcHJpdmF0ZSBVbmlxdWVOYW1lSGFuZGxlciBuYW1lSGFuZGxlciA9IG5ldyBVbmlxdWVOYW1lSGFuZGxlcigpOwotCXByaXZhdGUgVW5pcXVlTmFtZUhhbmRsZXIgcG5hbWVIYW5kbGVyID0gbmV3IFVuaXF1ZU5hbWVIYW5kbGVyKCk7Ci0JCi0JLyoqCi0JICogRW1wdHkgY29uc3RydWN0b3IKLQkgKi8KLQlwdWJsaWMgVW5pcXVlTmFtZVBOYW1lSGFuZGxlcihDb2xsZWN0aW9uPD8gZXh0ZW5kcyBNZXRob2RFbGVtZW50PiBlbGVtZW50cykgewotCQluYW1lSGFuZGxlci5yZWdpc3Rlck5hbWVzKGVsZW1lbnRzKTsKLQkJcG5hbWVIYW5kbGVyLnJlZ2lzdGVyUHJlc2VudGF0aW9uTmFtZXMoZWxlbWVudHMpOwkJCi0JfQotCQotCS8qKgotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICovCi0JcHVibGljIHZvaWQgZW5zdXJlVW5pcXVlKERlc2NyaWJhYmxlRWxlbWVudCBlbGVtZW50KSB7Ci0JCVN0cmluZyBuYW1lID0gbmFtZUhhbmRsZXIuZ2V0VW5pcXVlTmFtZShlbGVtZW50LmdldE5hbWUoKSk7Ci0JCWlmICghIG5hbWUuZXF1YWxzKGVsZW1lbnQuZ2V0TmFtZSgpKSkgewotCQkJZWxlbWVudC5zZXROYW1lKG5hbWUpOwkJCi0JCX0KLQkJbmFtZUhhbmRsZXIucmVnaXN0ZXIobmFtZSk7Ci0JCQotCQlTdHJpbmcgcG5hbWUgPSBwbmFtZUhhbmRsZXIuZ2V0VW5pcXVlTmFtZShlbGVtZW50LmdldFByZXNlbnRhdGlvbk5hbWUoKSk7Ci0JCWlmICghIHBuYW1lLmVxdWFscyhlbGVtZW50LmdldFByZXNlbnRhdGlvbk5hbWUoKSkpIHsKLQkJCWVsZW1lbnQuc2V0UHJlc2VudGF0aW9uTmFtZShwbmFtZSk7CQkKLQkJfQotCQlwbmFtZUhhbmRsZXIucmVnaXN0ZXIocG5hbWUpOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdmFsaWRhdGlvbi9VcHdhcmRSZWFjaGFibGVJbmZvLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3ZhbGlkYXRpb24vVXB3YXJkUmVhY2hhYmxlSW5mby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMjE1YWZmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdmFsaWRhdGlvbi9VcHdhcmRSZWFjaGFibGVJbmZvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMDUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU3RhY2s7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ3VzdG9tQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkFzc29jaWF0aW9uSGVscGVyOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgaGFuZGxlcyB1cHdhcmQgcmVhY2hhYmxlIGluZm8gZm9yIGNpcmN1bGFyIGRlcGVuZGVuY3kgY2hlY2tpbmcKLSAqIAotICogQGF1dGhvciBXZWlwaW5nIEx1Ci0gKiBAc2luY2UgMS4yCi0gKi8KLXB1YmxpYyBjbGFzcyBVcHdhcmRSZWFjaGFibGVJbmZvIGltcGxlbWVudHMgSURlcGVuZGVuY3lJbmZvIHsKLQotCXByaXZhdGUgRGVwZW5kZW5jeUluZm9NZ3IgbWdyOwotCXByaXZhdGUgTWV0aG9kRWxlbWVudCBlbGVtZW50OwotCXByaXZhdGUgSGFzaE1hcCBwYXJlbnRNYXA7Ci0JcHJpdmF0ZSBib29sZWFuIGNvbXBsZXRlID0gZmFsc2U7Ci0JcHJpdmF0ZSBib29sZWFuIGRlYnVnID0gZmFsc2U7Ci0JCi0JcHJvdGVjdGVkIFVwd2FyZFJlYWNoYWJsZUluZm8oRGVwZW5kZW5jeUluZm9NZ3IgbWdyLCBNZXRob2RFbGVtZW50IGVsZW1lbnQpIHsKLQkJdGhpcy5tZ3IgPSBtZ3I7Ci0JCXRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGlzQ29tcGxldGUoKSB7Ci0JCXJldHVybiBjb21wbGV0ZTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgYnVpbGQoYm9vbGVhbiBjaGVja0NpcmN1bGFyKSB7Ci0JCWlmIChkZWJ1ZykgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJMRD4gYnVpbGQ6ICIgKyB0aGlzKTsJLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWJ1aWxkSW5uZXIoY2hlY2tDaXJjdWxhcik7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBidWlsZElubmVyKGJvb2xlYW4gY2hlY2tDaXJjdWxhcikgewotCQlPYmplY3QgaW5mbyA9IG1nci5nZXRQcm9jZXNzZWRJbmZvKGVsZW1lbnQpOwotCQlpZiAoaW5mbyAhPSBudWxsKSB7Ci0JCQlpZiAoaW5mbyA9PSB0aGlzICYmIGNvbXBsZXRlKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkludGVybmFsIGVycm9yIGluIGJ1aWxkSW5uZXI6ICIgKyBpbmZvKTsJCS8vJE5PTi1OTFMtMSQKLQkJfQotCQltZ3IuYWRkVG9Qcm9jZXNzZWQodGhpcyk7Ci0JCWlmIChkZWJ1ZykgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJMRD4gYnVpbGRJbm5lcjogIiArIHRoaXMpOwkvLyROT04tTkxTLTEkCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIiIpOwkJCQkJCQkvLyROT04tTkxTLTEkCi0JCX0KLQkJYnVpbGRJbm5lcl8oY2hlY2tDaXJjdWxhcik7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBidWlsZElubmVyXyhib29sZWFuIGNoZWNrQ2lyY3VsYXIpIHsKLQkJTGlzdCBwYXJlbnRzID0gZ2V0TWl4ZWRQYXJlbnRMaXN0KCk7Ci0JCWludCBzeiA9IHBhcmVudHMgPT0gbnVsbCA/IDAgOiBwYXJlbnRzLnNpemUoKTsKLQkJaWYgKHN6ID09IDApIHsKLQkJCWNvbXBsZXRlID0gdHJ1ZTsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJcGFyZW50TWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJTGlzdCBwcm9jZXNzZWRQYXJlbnRzID0gbnVsbDsKLQkJZm9yIChpbnQgaSA9IDA7IGk8IHN6OyBpKyspIHsKLQkJCU1ldGhvZEVsZW1lbnQgcGFyZW50RWxlbSA9IChNZXRob2RFbGVtZW50KSBwYXJlbnRzLmdldChpKTsKLQkJCVVwd2FyZFJlYWNoYWJsZUluZm8gcGluZm8gPSAoVXB3YXJkUmVhY2hhYmxlSW5mbykgbWdyLmdldFByb2Nlc3NlZEluZm8ocGFyZW50RWxlbSk7Ci0JCQlpZiAocGluZm8gPT0gbnVsbCl7Ci0JCQkJcGluZm8gPSBuZXcgVXB3YXJkUmVhY2hhYmxlSW5mbyhtZ3IsIHBhcmVudEVsZW0pOwotCQkJCXBhcmVudE1hcC5wdXQocGFyZW50RWxlbS5nZXRHdWlkKCksIHBpbmZvKTsKLQkJCQlwaW5mby5idWlsZElubmVyKGNoZWNrQ2lyY3VsYXIpOwotCQkJfSBlbHNlIHsKLQkJCQlwYXJlbnRNYXAucHV0KHBhcmVudEVsZW0uZ2V0R3VpZCgpLCBwaW5mbyk7Ci0JCQkJaWYgKGNoZWNrQ2lyY3VsYXIpIHsKLQkJCQkJaWYgKHByb2Nlc3NlZFBhcmVudHMgPT0gbnVsbCkgewotCQkJCQkJcHJvY2Vzc2VkUGFyZW50cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJfQotCQkJCQlwcm9jZXNzZWRQYXJlbnRzLmFkZChwaW5mbyk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWNvbXBsZXRlID0gdHJ1ZTsKLQkJCQotCQlpZiAoY2hlY2tDaXJjdWxhciAmJiBwcm9jZXNzZWRQYXJlbnRzICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGk9MDsgaTxwcm9jZXNzZWRQYXJlbnRzLnNpemUoKTsgaSsrKSB7Ci0JCQkJcmVhY2hhYmxlQnkoKElEZXBlbmRlbmN5SW5mbykgcHJvY2Vzc2VkUGFyZW50cy5nZXQoaSkpOwotCQkJfQotCQl9Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIHJlYWNoYWJsZUJ5KElEZXBlbmRlbmN5SW5mbyBpbmZvKSAgewotCQlpZiAoISAoaW5mbyBpbnN0YW5jZW9mIFVwd2FyZFJlYWNoYWJsZUluZm8pKSB7Ci0JCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQkJfQotCQlpZiAoZGVidWcpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTEQ+IEVudHJ5IHJlYWNoYWJsZUJ5OiB0aGlzIC0+ICIgKyB0aGlzKTsJLy8kTk9OLU5MUy0xJAotCQkJU3lzdGVtLm91dC5wcmludGxuKCJMRD4gRW50cnkgcmVhY2hhYmxlQnk6IGluZm8gLT4gIiArIGluZm8pOwkvLyROT04tTkxTLTEkCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIiIpOwkJCQkJCQkJCQkJLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiByZWFjaGFibGVCeSgoVXB3YXJkUmVhY2hhYmxlSW5mbykgaW5mbywgbmV3IFN0YWNrKCksIG5ldyBIYXNoTWFwKCkpOwotCX0KLQkKLQlwcml2YXRlIGJvb2xlYW4gcmVhY2hhYmxlQnkoVXB3YXJkUmVhY2hhYmxlSW5mbyBpbmZvLCBTdGFjayBzdGFjaywgTWFwIHNlZW4pICB7Ci0JCXN0YWNrLnB1c2goaW5mbyk7Ci0JCWlmIChkZWJ1ZykgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJMRD4gcmVhY2hhYmxlQnk6IHRoaXMgLT4gIiArIHRoaXMpOwkJLy8kTk9OLU5MUy0xJAotCQkJU3lzdGVtLm91dC5wcmludGxuKCJMRD4gcmVhY2hhYmxlQnk6IGluZm8gLT4gIiArIGluZm8pOwkJLy8kTk9OLU5MUy0xJAotCQkJU3lzdGVtLm91dC5wcmludGxuKCIiKTsJCQkJCQkJCQkJLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWJvb2xlYW4gcmV0ID0gIHJlYWNoYWJsZUJ5XyhpbmZvLCBzdGFjaywgc2Vlbik7Ci0JCXN0YWNrLnBvcCgpOwotCQlyZXR1cm4gcmV0OwotCX0KLQkKLQlwcml2YXRlIGJvb2xlYW4gcmVhY2hhYmxlQnlfKFVwd2FyZFJlYWNoYWJsZUluZm8gaW5mbywgU3RhY2sgc3RhY2ssIE1hcCBzZWVuKSAgewotCQlNYXAgdGVzdE1hcCA9IGluZm8ucGFyZW50TWFwOwkJCi0JCWlmICh0ZXN0TWFwID09IG51bGwgfHwgdGVzdE1hcC5pc0VtcHR5KCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQkKLQkJaWYgKHRlc3RNYXAuY29udGFpbnNLZXkoZWxlbWVudC5nZXRHdWlkKCkpKSB7Ci0JCQlpZiAoZGVidWcpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxEPiBDb250YWluZWQgaW4gcGFyZW50TWFwIG9mOiAiICsgaW5mbyk7CQkvLyROT04tTkxTLTEkCQkJCQkJCQkJCi0JCQl9Ci0JCQlzdGFjay5wdXNoKHRoaXMpOwotCQkJbWdyLmxvZ0NpcmN1bGFyRGVwZW5kZW5jeSgoU3RhY2spIHN0YWNrLmNsb25lKCkpOwotCQkJc3RhY2sucG9wKCk7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQkKLQkJaWYgKHNlZW4uY29udGFpbnNLZXkoaW5mby5nZXRFbGVtZW50KCkuZ2V0R3VpZCgpKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCQotCQkKLQkJc2Vlbi5wdXQoaW5mby5nZXRFbGVtZW50KCkuZ2V0R3VpZCgpLCBpbmZvKTsKLQkJCi0JCWZvciAoSXRlcmF0b3IgaXQgPSB0ZXN0TWFwLnZhbHVlcygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCVVwd2FyZFJlYWNoYWJsZUluZm8gcGFyZW50SW5mbyA9IChVcHdhcmRSZWFjaGFibGVJbmZvKSBpdC5uZXh0KCk7Ci0JCQlpZiAocGFyZW50SW5mby5jb250YWluZWRJbihzdGFjaykpIHsKLQkJCQlpZiAoZGVidWcpIHsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJMRD4gY29udGFpbmVkSW4gc3RhY2s6ICIgKyBpbmZvKTsJCS8vJE5PTi1OTFMtMSQJCQkJCQkJCQkKLQkJCQl9Ci0JCQkJc3RhY2sucHVzaChwYXJlbnRJbmZvKTsKLQkJCQltZ3IubG9nQ2lyY3VsYXJEZXBlbmRlbmN5KChTdGFjaykgc3RhY2suY2xvbmUoKSk7Ci0JCQkJc3RhY2sucG9wKCk7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCQlpZiAgKHJlYWNoYWJsZUJ5KHBhcmVudEluZm8sIHN0YWNrLCBzZWVuKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9CQotCQkKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlwdWJsaWMgTWV0aG9kRWxlbWVudCBnZXRFbGVtZW50KCkgewotCQlyZXR1cm4gZWxlbWVudDsKLQl9Ci0JCi0JcHJpdmF0ZSBMaXN0IGdldE1peGVkUGFyZW50TGlzdCgpIHsKLQkJTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQljb2xsZWN0UGFyZW50TGlzdChlbGVtZW50LCBsaXN0KTsKLQkJVmFyaWFiaWxpdHlFbGVtZW50IHZlID0gKFZhcmlhYmlsaXR5RWxlbWVudCkgZWxlbWVudDsKLQkJY29sbGVjdFBhcmVudExpc3RCeVZhcmlhbnRQYXRocyh2ZSwgbGlzdCk7Ci0JCWlmICh2ZS5nZXRWYXJpYWJpbGl0eVR5cGUoKSA9PSBWYXJpYWJpbGl0eVR5cGUuUkVQTEFDRVMgKSB7Ci0JCQltZ3IuYWRkVG9SZXBsYWNlck1hcCh0aGlzKTsKLQkJfQotCQlyZXR1cm4gbGlzdDsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNvbGxlY3RQYXJlbnRMaXN0KE1ldGhvZEVsZW1lbnQgZWxlbSwgTGlzdCBsaXN0KSB7Ci0JCUxpc3QgcGFyZW50TGlzdCA9IGdldFBhcmVudExpc3QoZWxlbSk7Ci0JCQotCQlpbnQgc3ogPSBwYXJlbnRMaXN0ID09IG51bGwgPyAwIDogcGFyZW50TGlzdC5zaXplKCk7Ci0JCWlmIChtZ3IuaXNNb3ZlRWxlbWVudChlbGVtKSkgewotCQkJaWYgKHN6ID4gMSAmJiAhKGVsZW0gaW5zdGFuY2VvZiBDdXN0b21DYXRlZ29yeSkpIHsKLQkJCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsJCi0JCQl9Ci0JCX0gZWxzZSBpZiAoc3ogPiAwKSB7Ci0JCQlsaXN0LmFkZEFsbChwYXJlbnRMaXN0KTsKLQkJfQotCi0JfQotCi0JcHVibGljIHN0YXRpYyBMaXN0IGdldFBhcmVudExpc3QoTWV0aG9kRWxlbWVudCBlbGVtKSB7Ci0JCUxpc3QgcGFyZW50TGlzdCA9IG51bGw7Ci0JCQotCQlpZiAoZWxlbSBpbnN0YW5jZW9mIEN1c3RvbUNhdGVnb3J5KSB7Ci0JCQlwYXJlbnRMaXN0ID0gQXNzb2NpYXRpb25IZWxwZXIuZ2V0Q3VzdG9tQ2F0ZWdvcmllcygoQ3VzdG9tQ2F0ZWdvcnkpIGVsZW0pOwotCQl9IGVsc2UgaWYgKGVsZW0gaW5zdGFuY2VvZiBEZWxpdmVyYWJsZSkgewotCQkJcGFyZW50TGlzdCA9IEFzc29jaWF0aW9uSGVscGVyLmdldERlbGl2ZXJhYmxlcygoRGVsaXZlcmFibGUpIGVsZW0pOwkJCQotCQl9IGVsc2UgewkKLQkJCU9iamVjdCBwYXJlbnQgPSBnZXRTYW1lVHlwZVBhcmVudChlbGVtKTsKLQkJCWlmIChwYXJlbnQgIT0gbnVsbCkgewotCQkJCXBhcmVudExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJcGFyZW50TGlzdC5hZGQocGFyZW50KTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcGFyZW50TGlzdDsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNvbGxlY3RQYXJlbnRMaXN0QnlWYXJpYW50UGF0aHMoVmFyaWFiaWxpdHlFbGVtZW50IHZlLCBMaXN0IGxpc3QpIHsKLQkJaWYgKCEgbWdyLmlzRmlsdGVyRWxlbWVudCh2ZSkpIHsKLQkJCVZhcmlhYmlsaXR5RWxlbWVudCBwYXJlbnRWZSA9IHZlLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsKLQkJCVZhcmlhYmlsaXR5VHlwZSB0eXBlID0gcGFyZW50VmUgPT0gbnVsbCA/IG51bGwgOiB2ZS5nZXRWYXJpYWJpbGl0eVR5cGUoKTsKLQkJCWlmICh0eXBlID09IFZhcmlhYmlsaXR5VHlwZS5DT05UUklCVVRFUyB8fCB0eXBlID09IFZhcmlhYmlsaXR5VHlwZS5SRVBMQUNFUykgewotCQkJCWxpc3QuYWRkKHBhcmVudFZlKTsKLQkJCX0KLQkJfQotCi0JCWlmIChtZ3IuaXNEbmRFbGVtZW50KHZlKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCQkJCi0JCWZvciAoSXRlcmF0b3IgaXQgPSBUbmdVdGlsLmdldEltbWVkaWF0ZVZhcmlldGllcyh2ZSwgVmFyaWFiaWxpdHlUeXBlLkVYVEVORFMpIDsgaXQuaGFzTmV4dCgpOykgewotCQkJVmFyaWFiaWxpdHlFbGVtZW50IGV4dGVuZGVyID0gKFZhcmlhYmlsaXR5RWxlbWVudCkgaXQubmV4dCgpOwotCQkJaWYgKCEgbWdyLmlzRmlsdGVyRWxlbWVudChleHRlbmRlcikpIHsKLQkJCQlsaXN0LmFkZChleHRlbmRlcik7Ci0JCQl9Ci0JCX0KLQkJCi0JfQotCQotCXByaXZhdGUgc3RhdGljIE1ldGhvZEVsZW1lbnQgZ2V0U2FtZVR5cGVQYXJlbnQoTWV0aG9kRWxlbWVudCBlbGVtKSB7Ci0JCWlmIChlbGVtIGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCXJldHVybiAoKEFjdGl2aXR5KSBlbGVtKS5nZXRTdXBlckFjdGl2aXRpZXMoKTsKLQkJfQotCQkJCi0JCU1ldGhvZEVsZW1lbnQgcGFyZW50ID0gKE1ldGhvZEVsZW1lbnQpIGVsZW0uZUNvbnRhaW5lcigpOwotCQlyZXR1cm4gcGFyZW50LmdldFR5cGUoKSA9PSBlbGVtLmdldFR5cGUoKSA/IHBhcmVudCA6IG51bGw7Ci0JfQkJCi0JCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFRuZ1V0aWwuZ2V0TGFiZWxXaXRoUGF0aChlbGVtZW50KTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaW5oZXJpdEFuY2VzdG9yKFZhcmlhYmlsaXR5VHlwZSB0eXBlKSB7Ci0JCVZhcmlhYmlsaXR5RWxlbWVudCBwYXJlbnRWZSA9ICgoVmFyaWFiaWxpdHlFbGVtZW50KSBlbGVtZW50KS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCk7Ci0JCWlmIChwYXJlbnRWZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJaWYgKCgoVmFyaWFiaWxpdHlFbGVtZW50KSBlbGVtZW50KS5nZXRWYXJpYWJpbGl0eVR5cGUoKSAhPSB0eXBlKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJQXJyYXlMaXN0IG1peFBhcmVudExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7CQotCQljb2xsZWN0UGFyZW50TGlzdChlbGVtZW50LCBtaXhQYXJlbnRMaXN0KTsKLQkJaWYgKG1peFBhcmVudExpc3QgIT0gbnVsbCAmJiBtaXhQYXJlbnRMaXN0LmNvbnRhaW5zKHBhcmVudFZlKSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQotCQlVcHdhcmRSZWFjaGFibGVJbmZvIHBhcmVudFZlSW5mbyA9IChVcHdhcmRSZWFjaGFibGVJbmZvKSBwYXJlbnRNYXAuZ2V0KHBhcmVudFZlLmdldEd1aWQoKSk7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSBwYXJlbnRNYXAudmFsdWVzKCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJVXB3YXJkUmVhY2hhYmxlSW5mbyBwYXJlbnRJbmZvID0gKFVwd2FyZFJlYWNoYWJsZUluZm8pIGl0Lm5leHQoKTsKLQkJCWlmICAocGFyZW50VmVJbmZvID09IHBhcmVudEluZm8pIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCWlmIChwYXJlbnRWZUluZm8ucmVhY2hhYmxlQnkocGFyZW50SW5mbykpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQkJCQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCS8vVGhpcyB3b3VsZCBzY2FsZSB1cCBmb3IgcGVyZm9ybWFuY2Ugd2hlbiBpbmZvTGlzdCBnZXRzIGxhcmdlCi0JcHJpdmF0ZSBib29sZWFuIGNvbnRhaW5lZEluKExpc3QgaW5mb0xpc3QpIHsKLQkJaW50IHN6ID0gaW5mb0xpc3QgPT0gbnVsbCA/IDAgOiBpbmZvTGlzdC5zaXplKCk7Ci0JCWlmIChzeiA9PSAwKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJU3RyaW5nIGd1aWQgPSBnZXRFbGVtZW50KCkuZ2V0R3VpZCgpOwotCQlpZiAoc3ogPT0gMSkgewotCQkJcmV0dXJuIGd1aWQuZXF1YWxzKCgoSURlcGVuZGVuY3lJbmZvKSBpbmZvTGlzdC5nZXQoMCkpLmdldEVsZW1lbnQoKS5nZXRHdWlkKCkpOwotCQl9Ci0JCU1hcCBsaXN0TWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJZm9yIChpbnQgaT0wOyBpPHN6OyBpKyspIHsKLQkJCUlEZXBlbmRlbmN5SW5mbyBpbmZvID0gKElEZXBlbmRlbmN5SW5mbykgaW5mb0xpc3QuZ2V0KGkpOwotCQkJbGlzdE1hcC5wdXQoaW5mby5nZXRFbGVtZW50KCkuZ2V0R3VpZCgpLCBpbmZvKTsKLQkJfQotCQkKLQkJcmV0dXJuIGxpc3RNYXAuY29udGFpbnNLZXkoZ3VpZCk7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25TdGF0dXMuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdmFsaWRhdGlvbi9WYWxpZGF0aW9uU3RhdHVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlOTYyZGMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25TdGF0dXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbjsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRQbHVnaW47Ci0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBWYWxpZGF0aW9uU3RhdHVzIGV4dGVuZHMgU3RhdHVzIHsKLQotCXByaXZhdGUgT2JqZWN0IGNoZWNrZWRPYmplY3Q7Ci0JcHJpdmF0ZSBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZTsKLQotCS8qKgotCSAqIEBwYXJhbSBzZXZlcml0eQotCSAqIEBwYXJhbSBjb2RlCi0JICogQHBhcmFtIG1lc3NhZ2UKLQkgKiBAcGFyYW0gY2hlY2tlZE9iamVjdAotCSAqLwotCXB1YmxpYyBWYWxpZGF0aW9uU3RhdHVzKGludCBzZXZlcml0eSwgaW50IGNvZGUsIFN0cmluZyBtZXNzYWdlLCBPYmplY3QgY2hlY2tlZE9iamVjdCwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUpIHsKLQkJc3VwZXIoc2V2ZXJpdHksIExpYnJhcnlFZGl0UGx1Z2luLlBMVUdJTl9JRCwgY29kZSwgbWVzc2FnZSwgbnVsbCk7Ci0JCXRoaXMuY2hlY2tlZE9iamVjdCA9IGNoZWNrZWRPYmplY3Q7Ci0JCXRoaXMuZmVhdHVyZSA9IGZlYXR1cmU7Ci0JfQotCQotCXB1YmxpYyBWYWxpZGF0aW9uU3RhdHVzKFN0cmluZyBwbHVnaW5JZCwgaW50IHNldmVyaXR5LCBpbnQgY29kZSwgU3RyaW5nIG1lc3NhZ2UsIE9iamVjdCBjaGVja2VkT2JqZWN0LCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSkgewotCQlzdXBlcihzZXZlcml0eSwgcGx1Z2luSWQsIGNvZGUsIG1lc3NhZ2UsIG51bGwpOwotCQl0aGlzLmNoZWNrZWRPYmplY3QgPSBjaGVja2VkT2JqZWN0OwotCQl0aGlzLmZlYXR1cmUgPSBmZWF0dXJlOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0Q2hlY2tlZE9iamVjdCgpIHsKLQkJcmV0dXJuIGNoZWNrZWRPYmplY3Q7Ci0JfQotCi0JcHVibGljIEVTdHJ1Y3R1cmFsRmVhdHVyZSBnZXRGZWF0dXJlKCkgewotCQlyZXR1cm4gZmVhdHVyZTsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3ZhbGlkYXRpb24vaW50ZXJuYWwvQ29udGVudEVsZW1lbnROYW1lVmFsaWRhdG9yLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3ZhbGlkYXRpb24vaW50ZXJuYWwvQ29udGVudEVsZW1lbnROYW1lVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiNzdmZDcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC92YWxpZGF0aW9uL2ludGVybmFsL0NvbnRlbnRFbGVtZW50TmFtZVZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbi5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb24uTmFtZUNoZWNrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzLklGaWxlQmFzZWRMaWJyYXJ5UGVyc2lzdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy5TZXJ2aWNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuU2VjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkNvbnRlbnREZXNjcmlwdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotCi0vKioKLSAqIE5hbWUgdmFsaWRhdG9yIGZvciBDb250ZW50RWxlbWVudC4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQ29udGVudEVsZW1lbnROYW1lVmFsaWRhdG9yIGV4dGVuZHMgVW5pcXVlbmVzc1ZhbGlkYXRvciB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBDb250ZW50RWxlbWVudE5hbWVWYWxpZGF0b3IoRU9iamVjdCBjb250YWluZXIsIENvbnRlbnRFbGVtZW50IGUsCi0JCQlJRmlsdGVyIGNoaWxkRmlsdGVyKSB7Ci0JCXN1cGVyKGNvbnRhaW5lciwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0Q29udGVudFBhY2thZ2VfQ29udGVudEVsZW1lbnRzKCksIGNoaWxkRmlsdGVyLCBlLAotCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE5hbWVkRWxlbWVudF9OYW1lKCkpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIENvbnRlbnRFbGVtZW50TmFtZVZhbGlkYXRvcihFT2JqZWN0IHBhcmVudCwKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBjb250YWluaW5nRmVhdHVyZSwgQ29udGVudEVsZW1lbnQgZSwKLQkJCUlGaWx0ZXIgY2hpbGRGaWx0ZXIpIHsKLQkJc3VwZXIocGFyZW50LCBjb250YWluaW5nRmVhdHVyZSwgY2hpbGRGaWx0ZXIsIGUsIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldE5hbWVkRWxlbWVudF9OYW1lKCkpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLmludGVybmFsLlVuaXF1ZW5lc3NWYWxpZGF0b3IjaXNWYWxpZChTdHJpbmcpCi0JICovCi0JcHVibGljIFN0cmluZyBpc1ZhbGlkKFN0cmluZyBuZXdUZXh0KSB7Ci0JCUNvbnRlbnRFbGVtZW50IGUgPSAoQ29udGVudEVsZW1lbnQpIG9iamVjdDsKLQotCQkvLyAxNTY5NDUgLSBFbGVtZW50IG5hbWUgbmVlZCB0byBhbGxvdyBtb3JlIHNwZWNpYWwgY2hhcmFjdGVycyBzdWNoIGFzID8gCi0JCS8vIGlmIHRoZSBlbGVtZW50IGRvZXMgbm90IGdlbmVyYXRlIGEgcmVzb3VyY2UgZmlsZQotCQlpZiAoIGUgaW5zdGFuY2VvZiBTZWN0aW9uICkgewotCQkJcmV0dXJuIG5ld1RleHQ7Ci0JCX0KLQkJCi0JCVN0cmluZyBtc2cgPSBUbmdVdGlsLmNoZWNrRWxlbWVudE5hbWUobmV3VGV4dCwgVG5nVXRpbC5nZXRUeXBlVGV4dChlKSk7Ci0JCWlmIChtc2cgIT0gbnVsbCkKLQkJCXJldHVybiBtc2c7Ci0JCQotCQlpZiAoY29udGFpbmVyICE9IG51bGwpIHsKLQkJCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSBVbWFVdGlsLmdldE1ldGhvZFBsdWdpbihjb250YWluZXIpOwotCQkKLQkJCUludGVnZXIgbWF4ID0gbmV3IEludGVnZXIoTWF4RmlsZVBhdGhOYW1lTGVuZ3RoKTsKLQkJCWlmICghIE5hbWVDaGVja2VyLmNoZWNrRmlsZVBhdGhMZW5ndGgocGx1Z2luLCBlLCBuZXdUZXh0LCBtYXguaW50VmFsdWUoKSwgbnVsbCkpIHsKLQkJCQltc2cgPSBOTFMuYmluZChMaWJyYXJ5RWRpdFJlc291cmNlcy5maWxlUGF0aE5hbWVUb29Mb25nX21zZywgCi0JCQkJCQluZXcgT2JqZWN0W10geyBtYXggfSApOwotCQkJCXJldHVybiBtc2c7Ci0JCQl9Ci0JCX0KLQotCQkvLyBDaGVjayB3aGV0aGVyIGEgZmlsZSB3aXRoIHRoZSBzYW1lIG5hbWUgYWxyZWFkeSBleGlzdHMuCi0JCWlmIChjb250YWluZXIgIT0gbnVsbCAmJiBDb250ZW50RGVzY3JpcHRpb25GYWN0b3J5Lmhhc1ByZXNlbnRhdGlvbihlKSkgewotCQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IFVtYVV0aWwuZ2V0TWV0aG9kUGx1Z2luKGNvbnRhaW5lcik7Ci0JCQlpZihwbHVnaW4gPT0gVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4oZSkpIHsKLQkJCQlVUkkgdXJpID0gcGx1Z2luLmVSZXNvdXJjZSgpLmdldFVSSSgpOwotCQkJCWlmKHVyaS5pc0ZpbGUoKSkgewotCQkJCQlGaWxlIHBsdWdpbkRpciA9IG5ldyBGaWxlKHVyaS50b0ZpbGVTdHJpbmcoKSkuZ2V0UGFyZW50RmlsZSgpOwotCQkJCQlJRmlsZUJhc2VkTGlicmFyeVBlcnNpc3RlciBwZXJzaXN0ZXIgPSAoKElGaWxlQmFzZWRMaWJyYXJ5UGVyc2lzdGVyKVNlcnZpY2VzLmdldExpYnJhcnlQZXJzaXN0ZXIoU2VydmljZXMuWE1JX1BFUlNJU1RFTkNFX1RZUEUpKTsJCQkKLQkJCQkJU3RyaW5nIGZvbGRlclBhdGggPSBwZXJzaXN0ZXIuZ2V0Rm9sZGVyUmVsYXRpdmVQYXRoKGUpOwotCQkJCQlTdHJpbmcgZGlyID0gbmV3IFN0cmluZ0J1ZmZlcihwbHVnaW5EaXIuZ2V0QWJzb2x1dGVQYXRoKCkpLmFwcGVuZCgKLQkJCQkJCQlGaWxlLnNlcGFyYXRvcikuYXBwZW5kKGZvbGRlclBhdGgpLnRvU3RyaW5nKCk7Ci0JCQkJCVN0cmluZyBmaWxlTmFtZSA9IG5ld1RleHQgKyBwZXJzaXN0ZXIuZ2V0RmlsZUV4dGVuc2lvbihlKTsKLQkJCQkJRmlsZSBmaWxlID0gbmV3IEZpbGUoZGlyLCBmaWxlTmFtZSk7Ci0JCQkJCUZpbGUgY3VycmVudEZpbGUgPSBudWxsOwotCQkJCQlDb250ZW50RGVzY3JpcHRpb24gY29udGVudCA9IGUuZ2V0UHJlc2VudGF0aW9uKCk7Ci0JCQkJCWlmIChjb250ZW50LmVSZXNvdXJjZSgpICE9IG51bGwpIHsKLQkJCQkJCWN1cnJlbnRGaWxlID0gbmV3IEZpbGUoY29udGVudC5lUmVzb3VyY2UoKS5nZXRVUkkoKQotCQkJCQkJCQkudG9GaWxlU3RyaW5nKCkpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJY3VycmVudEZpbGUgPSBmaWxlOwotCQkJCQl9Ci0JCQkJCWlmIChmaWxlLmV4aXN0cygpICYmICFuZXdUZXh0LmVxdWFscyhlLmdldE5hbWUoKSkgJiYgIWZpbGUuZXF1YWxzKGN1cnJlbnRGaWxlKSkgewotCQkJCQkJcmV0dXJuIE5MUy5iaW5kKExpYnJhcnlFZGl0UmVzb3VyY2VzLmR1cGxpY2F0ZUNvbnRlbnRGaWxlRXJyb3JfbXNnLCBmaWxlKTsgCi0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gc3VwZXIuaXNWYWxpZChuZXdUZXh0KTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3ZhbGlkYXRpb24vaW50ZXJuYWwvQ3VzdG9tQ2F0ZWdvcnlOYW1lVmFsaWRhdG9yLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3ZhbGlkYXRpb24vaW50ZXJuYWwvQ3VzdG9tQ2F0ZWdvcnlOYW1lVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwMTBmZDMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC92YWxpZGF0aW9uL2ludGVybmFsL0N1c3RvbUNhdGVnb3J5TmFtZVZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ3VzdG9tQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0KLS8qKgotICogTmFtZSB2YWxpZGF0b3IgZm9yIEN1c3RvbUNhdGVnb3J5LgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQ3VzdG9tQ2F0ZWdvcnlOYW1lVmFsaWRhdG9yIGV4dGVuZHMgQ29udGVudEVsZW1lbnROYW1lVmFsaWRhdG9yIHsKLQotCS8qKgotCSAqIEBwYXJhbSBjb250YWluZXIKLQkgKiBAcGFyYW0gZQotCSAqIEBwYXJhbSBjaGlsZEZpbHRlcgotCSAqLwotCXB1YmxpYyBDdXN0b21DYXRlZ29yeU5hbWVWYWxpZGF0b3IoQ3VzdG9tQ2F0ZWdvcnkgcGFyZW50LCBDdXN0b21DYXRlZ29yeSBlLAotCQkJSUZpbHRlciBjaGlsZEZpbHRlcikgewotCQlzdXBlcihwYXJlbnQsIFVtYVBhY2thZ2UuTGl0ZXJhbHMuQ1VTVE9NX0NBVEVHT1JZX19DQVRFR09SSVpFRF9FTEVNRU5UUywgZSwgY2hpbGRGaWx0ZXIpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC92YWxpZGF0aW9uL2ludGVybmFsL0RvTm90aGluZ1ZhbGlkYXRvci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC92YWxpZGF0aW9uL2ludGVybmFsL0RvTm90aGluZ1ZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNTUyYmIyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdmFsaWRhdGlvbi9pbnRlcm5hbC9Eb05vdGhpbmdWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbi5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLklWYWxpZGF0b3I7Ci0KLS8qKgotICogVmFsaWRhdG9yIHRoYXQgdmFsaWRhdGVzIG5vdGhpbmcuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlIC0gQXVnIDQsIDIwMDUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIERvTm90aGluZ1ZhbGlkYXRvciBpbXBsZW1lbnRzIElWYWxpZGF0b3IgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgRG9Ob3RoaW5nVmFsaWRhdG9yIElOU1RBTkNFID0gbmV3IERvTm90aGluZ1ZhbGlkYXRvcigpOwotCi0JcHJpdmF0ZSBEb05vdGhpbmdWYWxpZGF0b3IoKSB7Ci0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbi5JVmFsaWRhdG9yI2lzVmFsaWQoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGlzVmFsaWQoU3RyaW5nIG5ld1RleHQpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLklWYWxpZGF0b3IjaXNWYWxpZChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBJU3RhdHVzIGlzVmFsaWQoT2JqZWN0IHZhbHVlKSB7Ci0JCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdmFsaWRhdGlvbi9pbnRlcm5hbC9NZXRob2RDb25maWd1cmF0aW9uTmFtZVZhbGlkYXRvci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC92YWxpZGF0aW9uL2ludGVybmFsL01ldGhvZENvbmZpZ3VyYXRpb25OYW1lVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiYmY1ZWUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC92YWxpZGF0aW9uL2ludGVybmFsL01ldGhvZENvbmZpZ3VyYXRpb25OYW1lVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb24uaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbi5BYnN0cmFjdFN0cmluZ1ZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb24uTmFtZUNoZWNrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzLklGaWxlQmFzZWRMaWJyYXJ5UGVyc2lzdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy5TZXJ2aWNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLQotLyoqCi0gKiBOYW1lIHZhbGlkYXRvciBmb3IgTWV0aG9kQ29uZmlndXJhdGlvbi4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUgLSBNYXkgMTIsIDIwMDYKLSAqIEBzaW5jZSAgMS4wCi0gKiBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTc3OTczCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXRob2RDb25maWd1cmF0aW9uTmFtZVZhbGlkYXRvciBleHRlbmRzIEFic3RyYWN0U3RyaW5nVmFsaWRhdG9yIHsKLQotCXByaXZhdGUgTWV0aG9kTGlicmFyeSBsaWJyYXJ5OwotCXByaXZhdGUgTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWc7Ci0KLQlwdWJsaWMgTWV0aG9kQ29uZmlndXJhdGlvbk5hbWVWYWxpZGF0b3IoTWV0aG9kTGlicmFyeSBsaWIsIE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0JCWxpYnJhcnkgPSBsaWI7Ci0JCXRoaXMuY29uZmlnID0gY29uZmlnOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb24uSVZhbGlkYXRvciNpc1ZhbGlkKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIFN0cmluZyBpc1ZhbGlkKFN0cmluZyBuZXdUZXh0KSB7Ci0JCW5ld1RleHQgPSBuZXdUZXh0LnRyaW0oKTsgLy9maXggaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE3Nzk3MwotCQlJbnRlZ2VyIG1heCA9IG5ldyBJbnRlZ2VyKE1heEZpbGVQYXRoTmFtZUxlbmd0aCk7Ci0JCWlmICghIE5hbWVDaGVja2VyLmNoZWNrRmlsZVBhdGhMZW5ndGgobGlicmFyeSwgY29uZmlnLCBuZXdUZXh0LCBtYXguaW50VmFsdWUoKSwgbnVsbCkpIHsKLQkJCVN0cmluZyBtc2cgPSBOTFMuYmluZChMaWJyYXJ5RWRpdFJlc291cmNlcy5maWxlUGF0aE5hbWVUb29Mb25nX21zZywgCi0JCQkJCW5ldyBPYmplY3RbXSB7IG1heCB9ICk7Ci0JCQlyZXR1cm4gbXNnOwotCQl9Ci0JCVN0cmluZyBjb25maWdGb2xkZXIgPSAoKElGaWxlQmFzZWRMaWJyYXJ5UGVyc2lzdGVyKVNlcnZpY2VzLmdldExpYnJhcnlQZXJzaXN0ZXIoU2VydmljZXMuWE1JX1BFUlNJU1RFTkNFX1RZUEUpKSAKLQkJCS5nZXRGb2xkZXJSZWxhdGl2ZVBhdGgoY29uZmlnKTsKLQkJRmlsZSBkaXIgPSBuZXcgRmlsZShuZXcgRmlsZShsaWJyYXJ5LmVSZXNvdXJjZSgpLmdldFVSSSgpLnRvRmlsZVN0cmluZygpKQotCQkJCQkJLmdldFBhcmVudCgpLCBjb25maWdGb2xkZXIpOwotCQlyZXR1cm4gVG5nVXRpbC5jaGVja05hbWUoZGlyLCBsaWJyYXJ5LmdldFByZWRlZmluZWRDb25maWd1cmF0aW9ucygpLCBjb25maWcsCi0JCQkJbmV3VGV4dCwgVG5nVXRpbC5nZXRUeXBlVGV4dChjb25maWcpLCBmYWxzZSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdmFsaWRhdGlvbi9pbnRlcm5hbC9NZXRob2RQbHVnaW5OYW1lVmFsaWRhdG9yLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3ZhbGlkYXRpb24vaW50ZXJuYWwvTWV0aG9kUGx1Z2luTmFtZVZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMGRlNjczLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdmFsaWRhdGlvbi9pbnRlcm5hbC9NZXRob2RQbHVnaW5OYW1lVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb24uaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbi5BYnN0cmFjdFN0cmluZ1ZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb24uTmFtZUNoZWNrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAgMS4xCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXRob2RQbHVnaW5OYW1lVmFsaWRhdG9yIGV4dGVuZHMgQWJzdHJhY3RTdHJpbmdWYWxpZGF0b3IgewotCXByaXZhdGUgTWV0aG9kTGlicmFyeSBsaWI7Ci0JcHJpdmF0ZSBNZXRob2RQbHVnaW4gcGx1Z2luOwkKLQotCS8qKgotCSAqIEBwYXJhbSBsaWIKLQkgKi8KLQlwdWJsaWMgTWV0aG9kUGx1Z2luTmFtZVZhbGlkYXRvcihNZXRob2RMaWJyYXJ5IGxpYiwgTWV0aG9kUGx1Z2luIHBsdWdpbikgewotCQlzdXBlcigpOwotCQl0aGlzLmxpYiA9IGxpYjsKLQkJdGhpcy5wbHVnaW4gPSBwbHVnaW47Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLklWYWxpZGF0b3IjaXNWYWxpZChqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgaXNWYWxpZChTdHJpbmcgbmV3VGV4dCkgewotCQlTdHJpbmcgbXNnID0gVG5nVXRpbC5jaGVja1BsdWdpbk5hbWUobmV3VGV4dCk7Ci0JCWlmKG1zZyAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gbXNnOwotCQl9Ci0JCQotCQlJbnRlZ2VyIG1heCA9IG5ldyBJbnRlZ2VyKE1heEZpbGVQYXRoTmFtZUxlbmd0aCk7Ci0JCWlmICghIE5hbWVDaGVja2VyLmNoZWNrRmlsZVBhdGhMZW5ndGgobGliLCBwbHVnaW4sIG5ld1RleHQsIG1heC5pbnRWYWx1ZSgpLCBudWxsKSkgewotCQkJbXNnID0gTkxTLmJpbmQoTGlicmFyeUVkaXRSZXNvdXJjZXMuZmlsZVBhdGhOYW1lVG9vTG9uZ19tc2csIAotCQkJCQluZXcgT2JqZWN0W10geyBtYXggfSApOwotCQkJcmV0dXJuIG1zZzsKLQkJfQotCQkKLQkJRmlsZSBkaXIgPSBuZXcgRmlsZShsaWIuZVJlc291cmNlKCkuZ2V0VVJJKCkudG9GaWxlU3RyaW5nKCkpCi0JCQkJLmdldFBhcmVudEZpbGUoKTsKLQkJU3RyaW5nIGVsZW1lbnRUeXBlVGV4dCA9IChwbHVnaW4gIT0gbnVsbCkgPyBUbmdVdGlsLmdldFR5cGVUZXh0KHBsdWdpbikKLQkJCQk6IFRuZ1V0aWwuZ2V0VHlwZVRleHQoIk1ldGhvZFBsdWdpbiIpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBUbmdVdGlsLmNoZWNrTmFtZShkaXIsIGxpYi5nZXRNZXRob2RQbHVnaW5zKCksIHBsdWdpbiwgbmV3VGV4dCwKLQkJCQllbGVtZW50VHlwZVRleHQsIHRydWUpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC92YWxpZGF0aW9uL2ludGVybmFsL1Byb2Nlc3NDb21wb25lbnROYW1lVmFsaWRhdG9yLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3ZhbGlkYXRpb24vaW50ZXJuYWwvUHJvY2Vzc0NvbXBvbmVudE5hbWVWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTNkOGQyMS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3ZhbGlkYXRpb24vaW50ZXJuYWwvUHJvY2Vzc0NvbXBvbmVudE5hbWVWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbi5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuU3RyVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbi5BYnN0cmFjdFN0cmluZ1ZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb24uTmFtZUNoZWNrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzLklGaWxlQmFzZWRMaWJyYXJ5UGVyc2lzdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy5TZXJ2aWNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi0KLS8qKgotICogVmFsaWRhdGVzIHRoZSBuYW1lIG9mIGEgcHJvY2VzcyBjb21wb25lbnQuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFByb2Nlc3NDb21wb25lbnROYW1lVmFsaWRhdG9yIGV4dGVuZHMgQWJzdHJhY3RTdHJpbmdWYWxpZGF0b3IgewotCi0JcHJpdmF0ZSBQcm9jZXNzUGFja2FnZSBwYXJlbnQ7Ci0KLQlwcml2YXRlIFByb2Nlc3NDb21wb25lbnQgcHJvY0NvbXA7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBQcm9jZXNzQ29tcG9uZW50TmFtZVZhbGlkYXRvcihQcm9jZXNzUGFja2FnZSBwYXJlbnQsCi0JCQlQcm9jZXNzQ29tcG9uZW50IHByb2NDb21wKSB7Ci0JCXRoaXMucGFyZW50ID0gcGFyZW50OwotCQl0aGlzLnByb2NDb21wID0gcHJvY0NvbXA7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb24uSVZhbGlkYXRvciNpc1ZhbGlkKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIFN0cmluZyBpc1ZhbGlkKFN0cmluZyBuZXdUZXh0KSB7Ci0JCVN0cmluZyByZWxhdGl2ZVBhdGggPSAoKElGaWxlQmFzZWRMaWJyYXJ5UGVyc2lzdGVyKVNlcnZpY2VzLmdldExpYnJhcnlQZXJzaXN0ZXIoU2VydmljZXMuWE1JX1BFUlNJU1RFTkNFX1RZUEUpKQotCQkJLmdldEZvbGRlclJlbGF0aXZlUGF0aChwcm9jQ29tcCk7Ci0JCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSBVbWFVdGlsLmdldE1ldGhvZFBsdWdpbihwYXJlbnQpOwotCQkKLQkJSW50ZWdlciBtYXggPSBuZXcgSW50ZWdlcihNYXhGaWxlUGF0aE5hbWVMZW5ndGgpOwotCQlpZiAoISBOYW1lQ2hlY2tlci5jaGVja0ZpbGVQYXRoTGVuZ3RoKHBsdWdpbiwgcHJvY0NvbXAsIG5ld1RleHQsIG1heC5pbnRWYWx1ZSgpLCBudWxsKSkgewotCQkJU3RyaW5nIG1zZyA9IE5MUy5iaW5kKExpYnJhcnlFZGl0UmVzb3VyY2VzLmZpbGVQYXRoTmFtZVRvb0xvbmdfbXNnLCAKLQkJCQkJbmV3IE9iamVjdFtdIHsgbWF4IH0gKTsKLQkJCXJldHVybiBtc2c7Ci0JCX0KLQkJCi0JCUZpbGUgZGlyID0gbmV3IEZpbGUoCi0JCQkJbmV3IEZpbGUocGx1Z2luLmVSZXNvdXJjZSgpLmdldFVSSSgpLnRvRmlsZVN0cmluZygpKQotCQkJCQkJLmdldFBhcmVudCgpCi0JCQkJCQkrIEZpbGUuc2VwYXJhdG9yICsgcmVsYXRpdmVQYXRoKTsKLQkJaWYgKCEgbmV3VGV4dC5lcXVhbHMoU3RyVXRpbC5tYWtlVmFsaWRGaWxlTmFtZShuZXdUZXh0KSkpIHsKLQkJCXJldHVybiBOTFMuYmluZChMaWJyYXJ5RWRpdFJlc291cmNlcy5pbnZhbGlkRWxlbWVudE5hbWVFcnJvcjNfbXNnLCBuZXdUZXh0KTsgCi0JCX0KLQkJcmV0dXJuIFRuZ1V0aWwuY2hlY2tOYW1lKGRpciwgcGFyZW50LmdldENoaWxkUGFja2FnZXMoKSwgcHJvY0NvbXAsCi0JCQkJbmV3VGV4dCwgVG5nVXRpbC5nZXRUeXBlVGV4dChwcm9jQ29tcCksIHRydWUpOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdmFsaWRhdGlvbi9pbnRlcm5hbC9VbmlxdWVuZXNzVmFsaWRhdG9yLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3ZhbGlkYXRpb24vaW50ZXJuYWwvVW5pcXVlbmVzc1ZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZDExNjU2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdmFsaWRhdGlvbi9pbnRlcm5hbC9VbmlxdWVuZXNzVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuU3RyVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbi5JVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLS8qKgotICogVmFsaWRhdGVzIHRoZSB1bmlxdWVuZXNzIG9mIGFuIG9iamVjdCB3aXRoaW4gYSBnaXZlbiBmZWF0dXJlIHRoYXQgY29udGFpbnMgaXQuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBVbmlxdWVuZXNzVmFsaWRhdG9yIGltcGxlbWVudHMgSVZhbGlkYXRvciB7Ci0JcHJvdGVjdGVkIEVPYmplY3Qgb2JqZWN0OwotCi0JcHJpdmF0ZSBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZTsKLQotCXByaXZhdGUgU3RyaW5nIGZlYXR1cmVOYW1lOwotCi0JcHJpdmF0ZSBFU3RydWN0dXJhbEZlYXR1cmUgY29udGFpbmluZ0ZlYXR1cmU7Ci0KLQlwcml2YXRlIElGaWx0ZXIgY2hpbGRGaWx0ZXI7Ci0KLQlwcm90ZWN0ZWQgRU9iamVjdCBjb250YWluZXI7Ci0KLQlwdWJsaWMgVW5pcXVlbmVzc1ZhbGlkYXRvcihFT2JqZWN0IGNvbnRhaW5lciwKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBjb250YWluaW5nRmVhdHVyZSwgSUZpbHRlciBjaGlsZEZpbHRlciwKLQkJCUVPYmplY3Qgb2JqLCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSkgewotCQl0aGlzKGNvbnRhaW5lciwgY29udGFpbmluZ0ZlYXR1cmUsIGNoaWxkRmlsdGVyLCBvYmosIGZlYXR1cmUsIFN0clV0aWwKLQkJCQkudG9Mb3dlcihUbmdVdGlsLmdldEZlYXR1cmVUZXh0KGZlYXR1cmUpKSk7Ci0JfQotCi0JcHVibGljIFVuaXF1ZW5lc3NWYWxpZGF0b3IoRU9iamVjdCBjb250YWluZXIsCi0JCQlFU3RydWN0dXJhbEZlYXR1cmUgY29udGFpbmluZ0ZlYXR1cmUsIElGaWx0ZXIgY2hpbGRGaWx0ZXIsCi0JCQlFT2JqZWN0IG9iaiwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIFN0cmluZyBmZWF0dXJlTmFtZSkgewotCQl0aGlzLmNvbnRhaW5lciA9IGNvbnRhaW5lcjsKLQkJb2JqZWN0ID0gb2JqOwotCQl0aGlzLmNvbnRhaW5pbmdGZWF0dXJlID0gY29udGFpbmluZ0ZlYXR1cmU7Ci0JCXRoaXMuY2hpbGRGaWx0ZXIgPSBjaGlsZEZpbHRlcjsKLQkJdGhpcy5mZWF0dXJlID0gZmVhdHVyZTsKLQkJdGhpcy5mZWF0dXJlTmFtZSA9IGZlYXR1cmVOYW1lOwotCX0KLQkKLQl2b2lkIHNldENoaWxkRmlsdGVyKElGaWx0ZXIgY2hpbGRGaWx0ZXIpIHsKLQkJdGhpcy5jaGlsZEZpbHRlciA9IGNoaWxkRmlsdGVyOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLklWYWxpZGF0b3IjaXNWYWxpZChqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgaXNWYWxpZChTdHJpbmcgbmV3VGV4dCkgewotCQlpZiAoY29udGFpbmVyID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJbmV3VGV4dCA9IG5ld1RleHQudHJpbSgpOwotCQlpZiAoU3RyVXRpbC5pc0JsYW5rKG5ld1RleHQpKSB7Ci0JCQkvLyByZXR1cm4gSTE4blV0aWwuZm9ybWF0U3RyaW5nKFJFU09VUkNFX0JVTkRMRSwga2V5LCBkYXRhKTsKLQkJCXJldHVybiBOTFMuYmluZChMaWJyYXJ5RWRpdFJlc291cmNlcy5lbXB0eUVsZW1lbnROYW1lRXJyb3JfbXNnLAotCQkJCQlmZWF0dXJlTmFtZSk7Ci0JCX0KLQkJQ29sbGVjdGlvbiBjaGlsZHJlbjsKLQkJaWYgKGNvbnRhaW5pbmdGZWF0dXJlID09IG51bGwpIHsKLQkJCWNoaWxkcmVuID0gY29udGFpbmVyLmVDb250ZW50cygpOwotCQl9IGVsc2UgewotCQkJY2hpbGRyZW4gPSAoQ29sbGVjdGlvbikgY29udGFpbmVyLmVHZXQoY29udGFpbmluZ0ZlYXR1cmUpOwotCQl9Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGNoaWxkcmVuLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGNoaWxkID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAoY2hpbGQgIT0gb2JqZWN0ICYmIGNoaWxkRmlsdGVyLmFjY2VwdChjaGlsZCkpIHsKLQkJCQlTdHJpbmcgbmFtZSA9IChTdHJpbmcpICgoRU9iamVjdCkgY2hpbGQpLmVHZXQoZmVhdHVyZSk7Ci0JCQkJaWYgKG5hbWUuZXF1YWxzSWdub3JlQ2FzZShuZXdUZXh0KSkgewotCQkJCQkvLyByZXR1cm4gSTE4blV0aWwuZm9ybWF0U3RyaW5nKFJFU09VUkNFX0JVTkRMRSwga2V5LCBkYXRhKTsKLQkJCQkJcmV0dXJuIE5MUy5iaW5kKAotCQkJCQkJCUxpYnJhcnlFZGl0UmVzb3VyY2VzLmR1cGxpY2F0ZUVsZW1lbnROYW1lRXJyb3JfbXNnLAotCQkJCQkJCW5ld1RleHQpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLklWYWxpZGF0b3IjaXNWYWxpZChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBJU3RhdHVzIGlzVmFsaWQoT2JqZWN0IHZhbHVlKSB7Ci0JCWlmIChjb250YWluZXIgPT0gbnVsbCkKLQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCQlDb2xsZWN0aW9uIGNoaWxkcmVuOwotCQlpZiAoY29udGFpbmluZ0ZlYXR1cmUgPT0gbnVsbCkgewotCQkJY2hpbGRyZW4gPSBjb250YWluZXIuZUNvbnRlbnRzKCk7Ci0JCX0gZWxzZSB7Ci0JCQljaGlsZHJlbiA9IChDb2xsZWN0aW9uKSBjb250YWluZXIuZUdldChjb250YWluaW5nRmVhdHVyZSk7Ci0JCX0KLQkJZm9yIChJdGVyYXRvciBpdGVyID0gY2hpbGRyZW4uaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgY2hpbGQgPSBpdGVyLm5leHQoKTsKLQkJCWlmIChjaGlsZCAhPSBvYmplY3QgJiYgY2hpbGRGaWx0ZXIuYWNjZXB0KGNoaWxkKSkgewotCQkJCVN0cmluZyBvID0gKFN0cmluZykgKChFT2JqZWN0KSBjaGlsZCkuZUdldChmZWF0dXJlKTsKLQkJCQlpZiAoby5lcXVhbHModmFsdWUpKSB7Ci0JCQkJCXJldHVybiBuZXcgU3RhdHVzKAotCQkJCQkJCUlTdGF0dXMuRVJST1IsCi0JCQkJCQkJTGlicmFyeUVkaXRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldElkKCksCi0JCQkJCQkJMCwKLQkJCQkJCQlOTFMKLQkJCQkJCQkJCS5iaW5kKAotCQkJCQkJCQkJCQlMaWJyYXJ5RWRpdFJlc291cmNlcy5kdXBsaWNhdGVGZWF0dXJlVmFsdWUsCi0JCQkJCQkJCQkJCW5ldyBPYmplY3RbXSB7Ci0JCQkJCQkJCQkJCQkJVG5nVXRpbC5nZXRMYWJlbChjb250YWluZXIpLAotCQkJCQkJCQkJCQkJCWZlYXR1cmVOYW1lCi0JCQkJCQkJCQkJCX0pLCBudWxsKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JfQotCi0JcHVibGljIEVPYmplY3QgZ2V0RU9iamVjdCgpIHsKLQkJcmV0dXJuIG9iamVjdDsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3ZhbGlkYXRpb24vaW50ZXJuYWwvVmFsaWRhdG9yRmFjdG9yeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC92YWxpZGF0aW9uL2ludGVybmFsL1ZhbGlkYXRvckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzc0Njk3My4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3ZhbGlkYXRpb24vaW50ZXJuYWwvVmFsaWRhdG9yRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDM5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbi5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25SZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLlN0clV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlN1cHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbi5BYnN0cmFjdFN0cmluZ1ZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb24uSVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb24uSVZhbGlkYXRvckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLk5hbWVDaGVja2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DdXN0b21DYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaWJhYmxlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk5hbWVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc1BhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci0KLS8qKgotICogSW1wbGVtZW50YXRpb24gb2YgSVZhbGlkYXRvckZhY3RvcnkuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBWYWxpZGF0b3JGYWN0b3J5IGltcGxlbWVudHMgSVZhbGlkYXRvckZhY3RvcnkgewotCXByaXZhdGUgc3RhdGljIExpc3QgY29udHJpYnV0ZWRWYWxpZGF0b3JGYWN0b3JpZXM7Ci0KLQlwcml2YXRlIHN0YXRpYyBJVmFsaWRhdG9yRmFjdG9yeSBpbnN0YW5jZTsKLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLklWYWxpZGF0b3JGYWN0b3J5I2NyZWF0ZU5hbWVWYWxpZGF0b3Iob3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RWxlbWVudCkKLQkgKi8KLQlwdWJsaWMgSVZhbGlkYXRvciBjcmVhdGVOYW1lVmFsaWRhdG9yKE9iamVjdCBwYXJlbnQsIENvbnRlbnRFbGVtZW50IGUpIHsKLQkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIEN1c3RvbUNhdGVnb3J5ICYmIGUgaW5zdGFuY2VvZiBDdXN0b21DYXRlZ29yeSkgewotCQkJcmV0dXJuIG5ldyBDb250ZW50RWxlbWVudE5hbWVWYWxpZGF0b3IoKEVPYmplY3QpIHBhcmVudCwKLQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkuZ2V0Q3VzdG9tQ2F0ZWdvcnlfQ2F0ZWdvcml6ZWRFbGVtZW50cygpLCBlLAotCQkJCQluZXcgVHlwZUZpbHRlcihlKSk7Ci0JCX0KLQkJRU9iamVjdCBjb250YWluZXIgPSBudWxsOwotCQlpZiAocGFyZW50IGluc3RhbmNlb2YgRU9iamVjdCkgewotCQkJY29udGFpbmVyID0gKEVPYmplY3QpIHBhcmVudDsKLQkJfQotCQlyZXR1cm4gbmV3IENvbnRlbnRFbGVtZW50TmFtZVZhbGlkYXRvcihjb250YWluZXIsIGUsIG5ldyBUeXBlRmlsdGVyKGUpKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbi5JVmFsaWRhdG9yRmFjdG9yeSNjcmVhdGVQcmVzZW50YXRpb25OYW1lVmFsaWRhdG9yKG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudEVsZW1lbnQpCi0JICogICAgICBDaGFuZ2VkIGZyb20gQ29udGVudEVsZW1lbnQgdG8gRGVzY3JpYmFibGVFbGVtZW50LCBiZWNhdXNlCi0JICogICAgICBQcmVzZW50YXRpb25OYW1lIGF0dHJpYnV0ZSBpcyBhdmFpbGFibGUgaW4gRGVzY3JpYmFibGVFbGVtZW50LgotCSAqLwotCXB1YmxpYyBJVmFsaWRhdG9yIGNyZWF0ZVByZXNlbnRhdGlvbk5hbWVWYWxpZGF0b3IoT2JqZWN0IHBhcmVudCwKLQkJCURlc2NyaWJhYmxlRWxlbWVudCBlKSB7Ci0JCWlmIChwYXJlbnQgaW5zdGFuY2VvZiBFT2JqZWN0KSB7Ci0JCQlPYmplY3RbXSBhcnIgPSBnZXRDaGlsZFJlZmVyZW5jZUFuZEZpbHRlcihwYXJlbnQsIGUpOwotCQkJRVJlZmVyZW5jZSByZWZlcmVuY2UgPSAoRVJlZmVyZW5jZSkgYXJyWzBdOwotCQkJSUZpbHRlciBjaGlsZEZpbHRlciA9IChJRmlsdGVyKSBhcnJbMV07Ci0JCQlpZiAocmVmZXJlbmNlICE9IG51bGwpIHsKLQkJCQlpZiAoY2hpbGRGaWx0ZXIgPT0gbnVsbCkgewotCQkJCQljaGlsZEZpbHRlciA9IG5ldyBUeXBlRmlsdGVyKGUpOwotCQkJCX0KLQkJCQlyZXR1cm4gbmV3IFVuaXF1ZW5lc3NWYWxpZGF0b3IoKEVPYmplY3QpIHBhcmVudCwgcmVmZXJlbmNlLAotCQkJCQkJY2hpbGRGaWx0ZXIsIGUsIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCS5nZXRNZXRob2RFbGVtZW50X1ByZXNlbnRhdGlvbk5hbWUoKSkgewotCQkJCQkvKgotCQkJCQkgKiAobm9uLUphdmFkb2MpCi0JCQkJCSAqIAotCQkJCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbi5pbnRlcm5hbC5VbmlxdWVuZXNzVmFsaWRhdG9yI2lzVmFsaWQoamF2YS5sYW5nLlN0cmluZykKLQkJCQkJICovCi0JCQkJCXB1YmxpYyBTdHJpbmcgaXNWYWxpZChTdHJpbmcgbmV3VGV4dCkgewotCQkJCQkJaWYgKFN0clV0aWwuaXNCbGFuayhuZXdUZXh0KQotCQkJCQkJCQkmJiBOYW1lQ2hlY2tlcgotCQkJCQkJCQkJCS5jYW5IYXZlRW1wdHlQcmVzZW50YXRpb25OYW1lKChEZXNjcmliYWJsZUVsZW1lbnQpIG9iamVjdCkpIHsKLQkJCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQkJCX0KLQkJCQkJCXJldHVybiBzdXBlci5pc1ZhbGlkKG5ld1RleHQpOwotCQkJCQl9Ci0JCQkJfTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBEb05vdGhpbmdWYWxpZGF0b3IuSU5TVEFOQ0U7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBjbGFzcyBUeXBlRmlsdGVyIGltcGxlbWVudHMgSUZpbHRlciB7Ci0JCXByaXZhdGUgaW50IGNsYXNzSUQ7Ci0KLQkJcHJpdmF0ZSBFQ2xhc3MgZUNsYXNzOwotCi0JCS8qKgotCQkgKiAKLQkJICovCi0JCXB1YmxpYyBUeXBlRmlsdGVyKEVPYmplY3Qgb2JqKSB7Ci0JCQljbGFzc0lEID0gb2JqLmVDbGFzcygpLmdldENsYXNzaWZpZXJJRCgpOwotCQl9Ci0KLQkJcHVibGljIFR5cGVGaWx0ZXIoRUNsYXNzIGVDbGFzcykgewotCQkJdGhpcy5lQ2xhc3MgPSBlQ2xhc3M7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoT2JqZWN0IG9iaikgewotCQkJaWYgKGVDbGFzcyAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIGVDbGFzcy5pc0luc3RhbmNlKG9iaik7Ci0JCQl9Ci0KLQkJCXJldHVybiBvYmogaW5zdGFuY2VvZiBFT2JqZWN0Ci0JCQkJCSYmIGNsYXNzSUQgPT0gKChFT2JqZWN0KSBvYmopLmVDbGFzcygpLmdldENsYXNzaWZpZXJJRCgpOwotCQl9Ci0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIElGaWx0ZXIgbm9uRmlsdGVyID0gbmV3IElGaWx0ZXIoKSB7Ci0KLQkJcHVibGljIGJvb2xlYW4gYWNjZXB0KE9iamVjdCBvYmopIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0KLQl9OwotCi0JcHJpdmF0ZSBzdGF0aWMgT2JqZWN0W10gZ2V0Q2hpbGRSZWZlcmVuY2VBbmRGaWx0ZXIoT2JqZWN0IHBhcmVudCwKLQkJCU9iamVjdCBjaGlsZCkgewotCQlFUmVmZXJlbmNlIHJlZmVyZW5jZSA9IG51bGw7Ci0JCUlGaWx0ZXIgY2hpbGRGaWx0ZXIgPSBudWxsOwotCQlpZiAoY2hpbGQgaW5zdGFuY2VvZiBDb250ZW50RWxlbWVudCkgewotCQkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIEN1c3RvbUNhdGVnb3J5Ci0JCQkJCSYmIGNoaWxkIGluc3RhbmNlb2YgQ3VzdG9tQ2F0ZWdvcnkpIHsKLQkJCQlyZWZlcmVuY2UgPSBVbWFQYWNrYWdlLkxpdGVyYWxzLkNVU1RPTV9DQVRFR09SWV9fQ0FURUdPUklaRURfRUxFTUVOVFM7Ci0JCQkJY2hpbGRGaWx0ZXIgPSBuZXcgVHlwZUZpbHRlcigKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuQ1VTVE9NX0NBVEVHT1JZKTsKLQkJCX0gZWxzZSBpZiAocGFyZW50IGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UpIHsKLQkJCQlyZWZlcmVuY2UgPSBVbWFQYWNrYWdlLkxpdGVyYWxzLkNPTlRFTlRfUEFDS0FHRV9fQ09OVEVOVF9FTEVNRU5UUzsKLQkJCX0KLQkJfSBlbHNlIGlmIChjaGlsZCBpbnN0YW5jZW9mIE1ldGhvZFBhY2thZ2UKLQkJCQkmJiBwYXJlbnQgaW5zdGFuY2VvZiBNZXRob2RQYWNrYWdlKSB7Ci0JCQlyZWZlcmVuY2UgPSBVbWFQYWNrYWdlLkxpdGVyYWxzLk1FVEhPRF9QQUNLQUdFX19DSElMRF9QQUNLQUdFUzsKLQkJfSBlbHNlIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBNZXRob2RMaWJyYXJ5KSB7Ci0JCQlpZiAoY2hpbGQgaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pIHsKLQkJCQlyZWZlcmVuY2UgPSBVbWFQYWNrYWdlLkxpdGVyYWxzLk1FVEhPRF9MSUJSQVJZX19NRVRIT0RfUExVR0lOUzsKLQkJCQljaGlsZEZpbHRlciA9IG5vbkZpbHRlcjsKLQkJCX0gZWxzZSBpZiAoY2hpbGQgaW5zdGFuY2VvZiBNZXRob2RDb25maWd1cmF0aW9uKSB7Ci0JCQkJcmVmZXJlbmNlID0gVW1hUGFja2FnZS5MaXRlcmFscy5NRVRIT0RfTElCUkFSWV9fUFJFREVGSU5FRF9DT05GSUdVUkFUSU9OUzsKLQkJCQljaGlsZEZpbHRlciA9IG5vbkZpbHRlcjsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbmV3IE9iamVjdFtdIHsgcmVmZXJlbmNlLCBjaGlsZEZpbHRlciB9OwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLklWYWxpZGF0b3JGYWN0b3J5I2NyZWF0ZU5hbWVWYWxpZGF0b3Iob3JnLmVjbGlwc2UuZXBmLnVtYS5OYW1lZEVsZW1lbnQpCi0JICovCi0JcHVibGljIElWYWxpZGF0b3IgY3JlYXRlTmFtZVZhbGlkYXRvcihPYmplY3QgcGFyZW50LCBmaW5hbCBOYW1lZEVsZW1lbnQgZSkgewotCQlmaW5hbCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IFVtYVBhY2thZ2UuTGl0ZXJhbHMuTkFNRURfRUxFTUVOVF9fTkFNRTsKLQkJT2JqZWN0W10gYXJyID0gZ2V0Q2hpbGRSZWZlcmVuY2VBbmRGaWx0ZXIocGFyZW50LCBlKTsKLQkJRVJlZmVyZW5jZSByZWZlcmVuY2UgPSAoRVJlZmVyZW5jZSkgYXJyWzBdOwotCQlJRmlsdGVyIGNoaWxkRmlsdGVyID0gKElGaWx0ZXIpIGFyclsxXTsKLQkJaWYgKHJlZmVyZW5jZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gY3JlYXRlVmFsaWRhdG9yKChFT2JqZWN0KSBwYXJlbnQsIHJlZmVyZW5jZSwgY2hpbGRGaWx0ZXIsIGUsCi0JCQkJCWZlYXR1cmUpOwotCQl9IGVsc2UgaWYgKGUgaW5zdGFuY2VvZiBNZXRob2RDb25maWd1cmF0aW9uCi0JCQkmJiBwYXJlbnQgaW5zdGFuY2VvZiBNZXRob2RMaWJyYXJ5KSB7Ci0JCQlyZXR1cm4gbmV3IE1ldGhvZENvbmZpZ3VyYXRpb25OYW1lVmFsaWRhdG9yKAotCQkJCShNZXRob2RMaWJyYXJ5KSBwYXJlbnQsIChNZXRob2RDb25maWd1cmF0aW9uKSBlKTsKLQkJfQotCQlyZXR1cm4gRG9Ob3RoaW5nVmFsaWRhdG9yLklOU1RBTkNFOwotCX0KLQotCXB1YmxpYyBJVmFsaWRhdG9yIGNyZWF0ZU5hbWVWYWxpZGF0b3IoT2JqZWN0IHBhcmVudCwgZmluYWwgTmFtZWRFbGVtZW50IGUsIEVDbGFzcyBuZXdUeXBlKSB7Ci0JCWZpbmFsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gVW1hUGFja2FnZS5MaXRlcmFscy5OQU1FRF9FTEVNRU5UX19OQU1FOwotCQlPYmplY3RbXSBhcnIgPSBnZXRDaGlsZFJlZmVyZW5jZUFuZEZpbHRlcihwYXJlbnQsIGUpOwotCQlFUmVmZXJlbmNlIHJlZmVyZW5jZSA9IChFUmVmZXJlbmNlKSBhcnJbMF07Ci0JCUlGaWx0ZXIgY2hpbGRGaWx0ZXIgPSBuZXcgVHlwZUZpbHRlcihuZXdUeXBlKTsKLQkJaWYgKHJlZmVyZW5jZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gY3JlYXRlVmFsaWRhdG9yKChFT2JqZWN0KSBwYXJlbnQsIHJlZmVyZW5jZSwgY2hpbGRGaWx0ZXIsIGUsCi0JCQkJCWZlYXR1cmUpOwotCQl9Ci0JCXJldHVybiBEb05vdGhpbmdWYWxpZGF0b3IuSU5TVEFOQ0U7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb24uSVZhbGlkYXRvckZhY3RvcnkjY3JlYXRlTmFtZVZhbGlkYXRvcihvcmcuZWNsaXBzZS5lcGYudW1hLk5hbWVkRWxlbWVudCwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5KQotCSAqLwotCXB1YmxpYyBJVmFsaWRhdG9yIGNyZWF0ZU5hbWVWYWxpZGF0b3IoTmFtZWRFbGVtZW50IGUsCi0JCQlBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlFU3RydWN0dXJhbEZlYXR1cmUgY29udGFpbmluZ0ZlYXR1cmUgPSBUbmdVdGlsLmdldENvbnRhaW5pbmdGZWF0dXJlKGUsCi0JCQkJYWRhcHRlckZhY3RvcnkpOwotCQlpZiAoY29udGFpbmluZ0ZlYXR1cmUgIT0gbnVsbCkgewotCQkJRU9iamVjdCBwYXJlbnQgPSAoRU9iamVjdCkgKChJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIpIGFkYXB0ZXJGYWN0b3J5Ci0JCQkJCS5hZGFwdChlLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpKS5nZXRQYXJlbnQoZSk7Ci0JCQlpZiAoZSBpbnN0YW5jZW9mIENvbnRlbnRFbGVtZW50KSB7Ci0JCQkJcmV0dXJuIG5ldyBDb250ZW50RWxlbWVudE5hbWVWYWxpZGF0b3IocGFyZW50LAotCQkJCQkJY29udGFpbmluZ0ZlYXR1cmUsIChDb250ZW50RWxlbWVudCkgZSwKLQkJCQkJCW5ldyBUeXBlRmlsdGVyKGUpKTsKLQkJCX0gZWxzZSBpZiAoZSBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQKLQkJCQkJJiYgcGFyZW50IGluc3RhbmNlb2YgUHJvY2Vzc1BhY2thZ2UpIHsKLQkJCQlyZXR1cm4gbmV3IFByb2Nlc3NDb21wb25lbnROYW1lVmFsaWRhdG9yKAotCQkJCQkJKFByb2Nlc3NQYWNrYWdlKSBwYXJlbnQsIChQcm9jZXNzQ29tcG9uZW50KSBlKTsKLQkJCX0gZWxzZSBpZiAoZSBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbgotCQkJCQkmJiBwYXJlbnQgaW5zdGFuY2VvZiBNZXRob2RMaWJyYXJ5KSB7Ci0JCQkJcmV0dXJuIG5ldyBNZXRob2RQbHVnaW5OYW1lVmFsaWRhdG9yKAotCQkJCQkJKE1ldGhvZExpYnJhcnkpIHBhcmVudCwgKE1ldGhvZFBsdWdpbikgZSk7Ci0JCQl9IGVsc2UgaWYgKGUgaW5zdGFuY2VvZiBNZXRob2RDb25maWd1cmF0aW9uCi0JCQkJCSYmIHBhcmVudCBpbnN0YW5jZW9mIE1ldGhvZExpYnJhcnkpIHsKLQkJCQlyZXR1cm4gbmV3IE1ldGhvZENvbmZpZ3VyYXRpb25OYW1lVmFsaWRhdG9yKAotCQkJCQkJKE1ldGhvZExpYnJhcnkpIHBhcmVudCwgKE1ldGhvZENvbmZpZ3VyYXRpb24pIGUpOwotCQkJfSBlbHNlIHsKLQkJCQlyZXR1cm4gbmV3IFVuaXF1ZW5lc3NWYWxpZGF0b3IocGFyZW50LCBjb250YWluaW5nRmVhdHVyZSwKLQkJCQkJCW5ldyBUeXBlRmlsdGVyKGUpLCBlLCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkuZ2V0TmFtZWRFbGVtZW50X05hbWUoKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGNyZWF0ZU5hbWVWYWxpZGF0b3IoZS5lQ29udGFpbmVyKCksIGUpOwotCX0KLQkKLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbi5JVmFsaWRhdG9yRmFjdG9yeSNjcmVhdGVWYWxpZGF0b3Iob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QsCi0JICogICAgICBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZSwgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QsCi0JICogICAgICBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzLAotCSAqICAgICAgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZSkKLQkgKi8KLQlwdWJsaWMgSVZhbGlkYXRvciBjcmVhdGVWYWxpZGF0b3IoRU9iamVjdCBwYXJlbnQsIEVSZWZlcmVuY2UgcmVmZXJlbmNlLAotCQkJRUNsYXNzIGVDbGFzcywgZmluYWwgRU9iamVjdCBvYmplY3QsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKSB7Ci0JCUlGaWx0ZXIgY2hpbGRGaWx0ZXIgPSBlQ2xhc3MgIT0gbnVsbCA/IG5ldyBUeXBlRmlsdGVyKGVDbGFzcykgOiBudWxsOwotCQlyZXR1cm4gY3JlYXRlVmFsaWRhdG9yKHBhcmVudCwgcmVmZXJlbmNlLCBjaGlsZEZpbHRlciwgb2JqZWN0LCBmZWF0dXJlKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIElWYWxpZGF0b3JGYWN0b3J5IGNyZWF0ZVZhbGlkYXRvckZhY3RvcnkoKSB7Ci0JCWlmIChjb250cmlidXRlZFZhbGlkYXRvckZhY3RvcmllcyAhPSBudWxsKSB7Ci0JCQljb250cmlidXRlZFZhbGlkYXRvckZhY3RvcmllcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCUlFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSA9IFBsYXRmb3JtCi0JCQkJCS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpOwotCQkJSUV4dGVuc2lvblBvaW50IGV4dGVuc2lvblBvaW50ID0gZXh0ZW5zaW9uUmVnaXN0cnkKLQkJCQkJLmdldEV4dGVuc2lvblBvaW50KExpYnJhcnlFZGl0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRJZCgpLAotCQkJCQkJCSJ2YWxpZGF0aW9uU3VwcG9ydCIpOyAvLyROT04tTkxTLTEkCi0JCQlpZiAoZXh0ZW5zaW9uUG9pbnQgIT0gbnVsbCkgewotCQkJCUlFeHRlbnNpb25bXSBleHRlbnNpb25zID0gZXh0ZW5zaW9uUG9pbnQuZ2V0RXh0ZW5zaW9ucygpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZXh0ZW5zaW9ucy5sZW5ndGg7IGkrKykgewotCQkJCQlJRXh0ZW5zaW9uIGV4dGVuc2lvbiA9IGV4dGVuc2lvbnNbaV07Ci0JCQkJCVN0cmluZyBwbHVnaW5JZCA9IGV4dGVuc2lvbi5nZXROYW1lc3BhY2VJZGVudGlmaWVyKCk7Ci0JCQkJCUJ1bmRsZSBidW5kbGUgPSBQbGF0Zm9ybS5nZXRCdW5kbGUocGx1Z2luSWQpOwotCQkJCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjb25maWdFbGVtZW50cyA9IGV4dGVuc2lvbgotCQkJCQkJCS5nZXRDb25maWd1cmF0aW9uRWxlbWVudHMoKTsKLQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBjb25maWdFbGVtZW50cy5sZW5ndGg7IGorKykgewotCQkJCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNvbmZpZ0VsZW1lbnQgPSBjb25maWdFbGVtZW50c1tqXTsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJU3RyaW5nIGNsYXNzTmFtZSA9IGNvbmZpZ0VsZW1lbnQKLQkJCQkJCQkJCS5nZXRBdHRyaWJ1dGUoImNsYXNzIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQlpZiAoY2xhc3NOYW1lICE9IG51bGwpIHsKLQkJCQkJCQkJT2JqZWN0IGV4dCA9IGJ1bmRsZS5sb2FkQ2xhc3MoY2xhc3NOYW1lKQotCQkJCQkJCQkJCS5uZXdJbnN0YW5jZSgpOwotCQkJCQkJCQlib29sZWFuIHJlcGxhY2UgPSBuZXcgQm9vbGVhbihjb25maWdFbGVtZW50Ci0JCQkJCQkJCQkJLmdldEF0dHJpYnV0ZSgicmVwbGFjZSIpKS5ib29sZWFuVmFsdWUoKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQlpZiAocmVwbGFjZSkgewotCQkJCQkJCQkJY29udHJpYnV0ZWRWYWxpZGF0b3JGYWN0b3JpZXMuY2xlYXIoKTsKLQkJCQkJCQkJCWluc3RhbmNlID0gKElWYWxpZGF0b3JGYWN0b3J5KSBleHQ7Ci0JCQkJCQkJCX0gZWxzZSBpZiAoaW5zdGFuY2UgPT0gbnVsbCkgewotCQkJCQkJCQkJY29udHJpYnV0ZWRWYWxpZGF0b3JGYWN0b3JpZXMuYWRkKGV4dCk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJCUxpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmxvZyhlKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQl9Ci0JCWlmIChpbnN0YW5jZSA9PSBudWxsKSB7Ci0JCQlpbnN0YW5jZSA9IG5ldyBWYWxpZGF0b3JGYWN0b3J5KCk7Ci0JCX0KLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLklWYWxpZGF0b3JGYWN0b3J5I2NyZWF0ZVZhbGlkYXRvcihvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzLAotCSAqICAgICAgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QsCi0JICogICAgICBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlLAotCSAqICAgICAgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3RvcnkpCi0JICovCi0JcHVibGljIElWYWxpZGF0b3IgY3JlYXRlVmFsaWRhdG9yKGZpbmFsIE9iamVjdCBwYXJlbnQsIEVDbGFzcyBlQ2xhc3MsCi0JCQlmaW5hbCBFT2JqZWN0IG9iamVjdCwgZmluYWwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsCi0JCQlmaW5hbCBBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudCkgewotCQkJaWYgKGZlYXR1cmUgPT0gVW1hUGFja2FnZS5MaXRlcmFscy5OQU1FRF9FTEVNRU5UX19OQU1FCi0JCQkJCXx8IGZlYXR1cmUgPT0gVW1hUGFja2FnZS5MaXRlcmFscy5NRVRIT0RfRUxFTUVOVF9fUFJFU0VOVEFUSU9OX05BTUUpIHsKLQkJCQlmaW5hbCBCcmVha2Rvd25FbGVtZW50IGJlID0gKEJyZWFrZG93bkVsZW1lbnQpIG9iamVjdDsKLQkJCQlQcm9jZXNzIHByb2MgPSBUbmdVdGlsLmdldE93bmluZ1Byb2Nlc3MocGFyZW50KTsKLQkJCQlpZiAocHJvYyAhPSBudWxsKSB7Ci0JCQkJCWZpbmFsIFN1cHByZXNzaW9uIHN1cHAgPSBTdXBwcmVzc2lvbi5nZXRTdXBwcmVzc2lvbihwcm9jKTsKLQkJCQkJcmV0dXJuIG5ldyBBYnN0cmFjdFN0cmluZ1ZhbGlkYXRvcigpIHsKLQotCQkJCQkJcHVibGljIFN0cmluZyBpc1ZhbGlkKFN0cmluZyBuZXdUZXh0KSB7Ci0JCQkJCQkJcmV0dXJuIE5hbWVDaGVja2VyLmNoZWNrTmFtZShhZGFwdGVyRmFjdG9yeSwKLQkJCQkJCQkJCXBhcmVudCwgYmUsIG51bGwsIGZlYXR1cmUsIG5ld1RleHQsIHN1cHAsCi0JCQkJCQkJCQl0cnVlKTsKLQkJCQkJCX0KLQotCQkJCQl9OwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiBEb05vdGhpbmdWYWxpZGF0b3IuSU5TVEFOQ0U7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgSUZpbHRlciBnZXRGaWx0ZXIoSUZpbHRlciBmaWx0ZXIsIEVPYmplY3QgZU9iamVjdCkgewotCQlyZXR1cm4gZmlsdGVyICE9IG51bGwgPyBmaWx0ZXIgOiAoZU9iamVjdCAhPSBudWxsID8gbmV3IFR5cGVGaWx0ZXIoCi0JCQkJZU9iamVjdCkgOiBub25GaWx0ZXIpOwotCX0KLQotCXB1YmxpYyBJVmFsaWRhdG9yIGNyZWF0ZVZhbGlkYXRvcihFT2JqZWN0IHBhcmVudCwgRVJlZmVyZW5jZSByZWZlcmVuY2UsCi0JCQlJRmlsdGVyIGNoaWxkRmlsdGVyLCBmaW5hbCBFT2JqZWN0IG9iamVjdCwKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKSB7Ci0JCWlmIChmZWF0dXJlID09IFVtYVBhY2thZ2UuTGl0ZXJhbHMuTkFNRURfRUxFTUVOVF9fTkFNRSkgewotCQkJSVZhbGlkYXRvciB2YWxpZGF0b3IgPSBudWxsOwotCQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIENvbnRlbnRFbGVtZW50KSB7Ci0JCQkJaWYgKHJlZmVyZW5jZSA9PSBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJLmdldENvbnRlbnRQYWNrYWdlX0NvbnRlbnRFbGVtZW50cygpCi0JCQkJCQl8fCAocmVmZXJlbmNlID09IFVtYVBhY2thZ2UuTGl0ZXJhbHMuQ1VTVE9NX0NBVEVHT1JZX19DQVRFR09SSVpFRF9FTEVNRU5UUyAmJiBvYmplY3QgaW5zdGFuY2VvZiBDdXN0b21DYXRlZ29yeSkpIHsKLQkJCQkJdmFsaWRhdG9yID0gbmV3IENvbnRlbnRFbGVtZW50TmFtZVZhbGlkYXRvcihwYXJlbnQsCi0JCQkJCQkJcmVmZXJlbmNlLCAoQ29udGVudEVsZW1lbnQpIG9iamVjdCwgZ2V0RmlsdGVyKAotCQkJCQkJCQkJY2hpbGRGaWx0ZXIsIG9iamVjdCkpOwotCi0JCQkJfSBlbHNlIGlmICgocmVmZXJlbmNlID09IFVtYVBhY2thZ2UuTGl0ZXJhbHMuRElTQ0lQTElORV9HUk9VUElOR19fRElTQ0lQTElORVMpCi0JCQkJCQl8fCAocmVmZXJlbmNlID09IFVtYVBhY2thZ2UuTGl0ZXJhbHMuUk9MRV9TRVRfR1JPVVBJTkdfX1JPTEVfU0VUUykpIHsKLQkJCQkJLy8gRGlzY2lwbGluZSBhbmQgRGlzY2lwbGluZUdyb3VwaW5nLCBSb2xlU2V0IGFuZAotCQkJCQkvLyBSb2xlU2V0R3JvdXBpbmcKLQkJCQkJLy8gaGFuZGxpbmcKLQkJCQkJLy8gbmVjZXNzYXJ5IGluIG9yZGVyIHRvIG1haW50YWluIHVuaXF1ZW5lc3MgYWNyb3NzIHBsdWdpbi4KLQkJCQkJdmFsaWRhdG9yID0gbmV3IFVuaXF1ZW5lc3NWYWxpZGF0b3IocGFyZW50LmVDb250YWluZXIoKSwKLQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJLmdldENvbnRlbnRQYWNrYWdlX0NvbnRlbnRFbGVtZW50cygpLAotCQkJCQkJCWdldEZpbHRlcihjaGlsZEZpbHRlciwgb2JqZWN0KSwgb2JqZWN0LCBmZWF0dXJlKTsKLQkJCQl9IGVsc2UgaWYgKChyZWZlcmVuY2UgPT0gVW1hUGFja2FnZS5MaXRlcmFscy5BUlRJRkFDVF9fQ09OVEFJTkVEX0FSVElGQUNUUykKLQkJCQkJCXx8IChyZWZlcmVuY2UgPT0gVW1hUGFja2FnZS5MaXRlcmFscy5ESVNDSVBMSU5FX19TVUJESVNDSVBMSU5FKQotCQkJCQkJfHwgKHJlZmVyZW5jZSA9PSBVbWFQYWNrYWdlLkxpdGVyYWxzLlBSQUNUSUNFX19TVUJfUFJBQ1RJQ0VTKQotCQkJCQkJfHwgKHJlZmVyZW5jZSA9PSBVbWFQYWNrYWdlLkxpdGVyYWxzLkRPTUFJTl9fU1VCRE9NQUlOUykKLQkJCQkJCSkgewotCQkJCQl2YWxpZGF0b3IgPSBuZXcgQ29udGVudEVsZW1lbnROYW1lVmFsaWRhdG9yKHBhcmVudCwKLQkJCQkJCQlyZWZlcmVuY2UsIChDb250ZW50RWxlbWVudCkgb2JqZWN0LCBnZXRGaWx0ZXIoCi0JCQkJCQkJCQljaGlsZEZpbHRlciwgb2JqZWN0KSk7Ci0JCQkJfQotCQkJfSBlbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50Ci0JCQkJCSYmIHBhcmVudCBpbnN0YW5jZW9mIFByb2Nlc3NQYWNrYWdlCi0JCQkJCSYmIHJlZmVyZW5jZSA9PSBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCS5nZXRNZXRob2RQYWNrYWdlX0NoaWxkUGFja2FnZXMoKSkgewotCQkJCVByb2Nlc3NQYWNrYWdlIHBrZyA9IChQcm9jZXNzUGFja2FnZSkgcGFyZW50OwotCQkJCWlmIChwa2cuZVJlc291cmNlKCkuZ2V0VVJJKCkuaXNGaWxlKCkpIHsKLQkJCQkJcmV0dXJuIG5ldyBQcm9jZXNzQ29tcG9uZW50TmFtZVZhbGlkYXRvcigKLQkJCQkJCQkoUHJvY2Vzc1BhY2thZ2UpIHBhcmVudCwgKFByb2Nlc3NDb21wb25lbnQpIG9iamVjdCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJcmV0dXJuIG5ldyBVbmlxdWVuZXNzVmFsaWRhdG9yKChFT2JqZWN0KSBwYXJlbnQsIHJlZmVyZW5jZSwKLQkJCQkJCQlnZXRGaWx0ZXIoY2hpbGRGaWx0ZXIsIG9iamVjdCksIG9iamVjdCwgZmVhdHVyZSk7Ci0JCQkJfQotCQkJfSBlbHNlIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBNZXRob2RMaWJyYXJ5KSB7Ci0JCQkJTWV0aG9kTGlicmFyeSBsaWIgPSAoTWV0aG9kTGlicmFyeSkgcGFyZW50OwotCQkJCWlmIChyZWZlcmVuY2UgPT0gVW1hUGFja2FnZS5MaXRlcmFscy5NRVRIT0RfTElCUkFSWV9fTUVUSE9EX1BMVUdJTlMpIHsKLQkJCQkJaWYgKGxpYi5lUmVzb3VyY2UoKS5nZXRVUkkoKS5pc0ZpbGUoKSkgewotCQkJCQkJcmV0dXJuIG5ldyBNZXRob2RQbHVnaW5OYW1lVmFsaWRhdG9yKGxpYiwKLQkJCQkJCQkJKE1ldGhvZFBsdWdpbikgb2JqZWN0KTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCXJldHVybiBuZXcgVW5pcXVlbmVzc1ZhbGlkYXRvcigKLQkJCQkJCQkJbGliLAotCQkJCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLk1FVEhPRF9MSUJSQVJZX19NRVRIT0RfUExVR0lOUywKLQkJCQkJCQkJbm9uRmlsdGVyLCBvYmplY3QsIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJLmdldE5hbWVkRWxlbWVudF9OYW1lKCkpOwotCQkJCQl9Ci0JCQkJfSBlbHNlIGlmIChyZWZlcmVuY2UgPT0gVW1hUGFja2FnZS5MaXRlcmFscy5NRVRIT0RfTElCUkFSWV9fUFJFREVGSU5FRF9DT05GSUdVUkFUSU9OUykgewotCQkJCQlpZiAobGliLmVSZXNvdXJjZSgpLmdldFVSSSgpLmlzRmlsZSgpKSB7Ci0JCQkJCQlyZXR1cm4gbmV3IE1ldGhvZENvbmZpZ3VyYXRpb25OYW1lVmFsaWRhdG9yKGxpYiwKLQkJCQkJCQkJKE1ldGhvZENvbmZpZ3VyYXRpb24pIG9iamVjdCk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlyZXR1cm4gbmV3IFVuaXF1ZW5lc3NWYWxpZGF0b3IoCi0JCQkJCQkJCWxpYiwKLQkJCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5NRVRIT0RfTElCUkFSWV9fUFJFREVGSU5FRF9DT05GSUdVUkFUSU9OUywKLQkJCQkJCQkJbm9uRmlsdGVyLCBvYmplY3QsIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJLmdldE5hbWVkRWxlbWVudF9OYW1lKCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQl2YWxpZGF0b3IgPSBuZXcgVW5pcXVlbmVzc1ZhbGlkYXRvcihwYXJlbnQsIHJlZmVyZW5jZSwKLQkJCQkJCWdldEZpbHRlcihjaGlsZEZpbHRlciwgb2JqZWN0KSwgb2JqZWN0LCBmZWF0dXJlKTsKLQkJCX0KLQotCQkJcmV0dXJuIHZhbGlkYXRvcjsKLQkJfSBlbHNlIGlmIChmZWF0dXJlID09IFVtYVBhY2thZ2UuTGl0ZXJhbHMuTUVUSE9EX0VMRU1FTlRfX1BSRVNFTlRBVElPTl9OQU1FKSB7Ci0JCQlyZXR1cm4gY3JlYXRlUHJlc2VudGF0aW9uTmFtZVZhbGlkYXRvcihwYXJlbnQsCi0JCQkJCShEZXNjcmliYWJsZUVsZW1lbnQpIG9iamVjdCk7Ci0JCX0KLQotCQlyZXR1cm4gRG9Ob3RoaW5nVmFsaWRhdG9yLklOU1RBTkNFOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdmFsaWRhdGlvbi9pbnRlcm5hbC9wYWNrYWdlLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwN2UxODIxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdmFsaWRhdGlvbi9pbnRlcm5hbC9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyB0aGUgaW1wbGVtZW50YXRpb24gZm9yIHZhbGlkYXRpbmcgbWV0aG9kIGxpYnJhcnkgZWxlbWVudHMuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC92YWxpZGF0aW9uL3BhY2thZ2UuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdmFsaWRhdGlvbi9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2YzNkMDYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC92YWxpZGF0aW9uL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIHRoZSBpbnRlcmZhY2VzIGZvciB2YWxpZGF0aW5nIG1ldGhvZCBsaWJyYXJ5IGVsZW1lbnRzLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLy5jbGFzc3BhdGggYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YzRmMjBmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiPgotCQk8YXR0cmlidXRlcz4KLQkJPC9hdHRyaWJ1dGVzPgotCTwvY2xhc3NwYXRoZW50cnk+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIj4KLQkJPGF0dHJpYnV0ZXM+Ci0JCTwvYXR0cmlidXRlcz4KLQk8L2NsYXNzcGF0aGVudHJ5PgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiI+Ci0JCTxhdHRyaWJ1dGVzPgotCQk8L2F0dHJpYnV0ZXM+Ci0JPC9jbGFzc3BhdGhlbnRyeT4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UvLm9wdGlvbnMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS8ub3B0aW9ucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2QzYjhlZi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS8ub3B0aW9ucworKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotIyBUdXJuIG9uIGRlYnVnIHRyYWNlIGZvciB0aGUgQ29tbW9uIHBsdWctaW4KLW9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL2RlYnVnPXRydWUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLy5wcm9qZWN0IGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzYzE4Y2EuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNmRmOGMxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlOyBzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjUuMC5xdWFsaWZpZXIKLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLAotIG9yZy5lY2xpcHNlLmVwZi5jb21tb247dmlzaWJpbGl0eTo9cmVleHBvcnQsCi0gb3JnLmVjbGlwc2UuZXBmLnVtYTt2aXNpYmlsaXR5Oj1yZWV4cG9ydCwKLSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcywKLSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUsCi0gb3JnLmVjbGlwc2UuZW1mLm1hcHBpbmcuZWNvcmUyZWNvcmU7dmlzaWJpbGl0eTo9cmVleHBvcnQsCi0gb3JnLmVjbGlwc2UuZW1mLm1hcHBpbmcuZWNvcmUyeG1sO3Zpc2liaWxpdHk6PXJlZXhwb3J0LAotIG9yZy5lY2xpcHNlLmNvcmUuZmlsZWJ1ZmZlcnMsCi0gb3JnLmVjbGlwc2UuamZhY2UudGV4dCwKLSBvcmcuZWNsaXBzZS5lcGYuc2VydmljZXM7dmlzaWJpbGl0eTo9cmVleHBvcnQsCi0gb3JnLmVjbGlwc2UuZW1mLndvcmtzcGFjZSwKLSBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnNlcnZpY2U7dmlzaWJpbGl0eTo9cmVleHBvcnQKLUVjbGlwc2UtTGF6eVN0YXJ0OiB0cnVlCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UsCi0gb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UuaW50ZXJuYWwsCi0gb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uuc3luY2gsCi0gb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UudXRpbCwKLSBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UsCi0gb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLm1pZ3JhdGlvbiwKLSBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UucmVmcmVzaCwKLSBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UucmVmcmVzaC5pbnRlcm5hbCwKLSBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UudXRpbCwKLSBvcmcuZWNsaXBzZS5lcGYucmVzb3VyY2VtYW5hZ2VyLAotIG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuaW1wbCwKLSBvcmcuZWNsaXBzZS5lcGYucmVzb3VyY2VtYW5hZ2VyLnV0aWwKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVBsdWdpbgotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9idWlsZC5wcm9wZXJ0aWVzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzVjY2E3YS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1zb3VyY2UuLiA9IHNyYy8KLW91dHB1dC4uID0gYmluLwotYmluLmluY2x1ZGVzID0gLixcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgbWlncmF0aW9uLyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIHNjaGVtYS8KLQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UvbWlncmF0aW9uL21pZ3JhdG9ycy5wcm9wZXJ0aWVzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UvbWlncmF0aW9uL21pZ3JhdG9ycy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MDc5ZTZjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL21pZ3JhdGlvbi9taWdyYXRvcnMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotaHR0cFw6Ly8vY29tL2libS91bWEuZWNvcmU9b3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLm1pZ3JhdGlvbi5pbnRlcm5hbC5NaWdyYXRvcgotb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLm1pZ3JhdGlvbi5pbnRlcm5hbC5NaWdyYXRvcj1odHRwXDovL3d3dy5pYm0uY29tL3VtYS8xLjAuMi91bWEuZWNvcmUKLWh0dHBcOi8vd3d3LmlibS5jb20vdW1hLzEuMC4yL3VtYS5lY29yZT1vcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UubWlncmF0aW9uLmludGVybmFsLk1pZ3JhdG9yMTAyCi1vcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UubWlncmF0aW9uLmludGVybmFsLk1pZ3JhdG9yMTAyPWh0dHBcOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjMvdW1hLmVjb3JlCi0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL21pZ3JhdGlvbi91bWExLjAuMl8xLjAuMy5lY29yZTJlY29yZSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL21pZ3JhdGlvbi91bWExLjAuMl8xLjAuMy5lY29yZTJlY29yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTAyZTc0ZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9taWdyYXRpb24vdW1hMS4wLjJfMS4wLjMuZWNvcmUyZWNvcmUKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZWNvcmUyZWNvcmU6RWNvcmUyRWNvcmVNYXBwaW5nUm9vdCB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOmVjb3JlMmVjb3JlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDA0L0Vjb3JlMkVjb3JlIiB0b3BUb0JvdHRvbT0idHJ1ZSI+Ci0gIDxpbnB1dHMgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLnVtYS9tb2RlbC8xLjAuMi91bWEuZWNvcmUjLyIvPgotICA8b3V0cHV0cyBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYudW1hL21vZGVsLzEuMC4zL3VtYS5lY29yZSMvIi8+Ci08L2Vjb3JlMmVjb3JlOkVjb3JlMkVjb3JlTWFwcGluZ1Jvb3Q+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9wbHVnaW4ucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NjI3ZTQxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLQotIyBQbHVnLWluCi1wbHVnaW5OYW1lPUVQRiBMaWJyYXJ5IFBlcnNpc3RlbmNlCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKLVBlcnNpc3RlbmNlTWFya2VyVHlwZU5hbWU9VW5yZXNvbHZlZCBFbGVtZW50cyBQcm9ibGVtcwotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9wbHVnaW4ueG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDNlYjE2NS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTxwbHVnaW4+Ci0gICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJtaWdyYXRvcnMiIG5hbWU9Ik1pZ3JhdG9ycyIgc2NoZW1hPSJzY2hlbWEvbWlncmF0b3JzLmV4c2QiLz4KLSAgIDxleHRlbnNpb24tcG9pbnQgaWQ9InJlc291cmNlU2V0RmFjdG9yaWVzIiBuYW1lPSJMaWJyYXJ5IFJlc291cmNlIFNldCBGYWN0b3JpZXMiIHNjaGVtYT0ic2NoZW1hL3Jlc291cmNlU2V0RmFjdG9yaWVzLmV4c2QiLz4KLQotICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuZ2VuZXJhdGVkX3BhY2thZ2UiPgotICAgIDxwYWNrYWdlIAotICAgICAgIHVyaSA9ICJodHRwOi8vL2NvbS9pYm0vdW1hL3Jlc291cmNlbWFuYWdlci5lY29yZSIgCi0gICAgICAgY2xhc3MgPSAib3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlci5SZXNvdXJjZW1hbmFnZXJQYWNrYWdlIiAvPgotICAgIDxwYWNrYWdlCi0gICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuUmVzb3VyY2VtYW5hZ2VyUGFja2FnZSIKLSAgICAgICAgICB1cmk9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZXBmL3VtYS9yZXNvdXJjZW1hbmFnZXIuZWNvcmUiLz4KLSAgPC9leHRlbnNpb24+Ci0gIDxleHRlbnNpb24KLSAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLm1pZ3JhdG9ycyI+Ci0gICAgIDxtaWdyYXRvcgotICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLm1pZ3JhdGlvbi5pbnRlcm5hbC5NaWdyYXRvciIKLSAgICAgICAgICAgbGliTnNVUkk9Imh0dHA6Ly8vY29tL2libS91bWEuZWNvcmUiLz4KLSAgPC9leHRlbnNpb24+Ci0gIDxleHRlbnNpb24KLSAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy5zZXJ2aWNlUHJvdmlkZXJzIj4KLSAgICAgPGFjY2Vzc0NvbnRyb2xsZXIgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLmludGVybmFsLkFjY2Vzc0NvbnRyb2xsZXIiLz4KLSAgICAgPGxpYnJhcnlQZXJzaXN0ZXIKLSAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5YTUlMaWJyYXJ5UGVyc2lzdGVyIgotICAgICAgICAgICBkZWZhdWx0PSJmYWxzZSIKLSAgICAgICAgICAgdHlwZT0ieG1pIi8+Ci0gICAgIDxmaWxlTWFuYWdlciBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLkRlbGVnYXRlRmlsZU1hbmFnZXIiLz4KLSAgPC9leHRlbnNpb24+Ci0gIDxleHRlbnNpb24KLSAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLnJlc291cmNlU2V0RmFjdG9yaWVzIj4KLSAgICAgPHJlc291cmNlU2V0RmFjdG9yeQotICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLlhNSUxpYnJhcnlSZXNvdXJjZVNldEZhY3RvcnkiCi0gICAgICAgICAgIHR5cGU9InhtaSIvPgotICA8L2V4dGVuc2lvbj4KLSAgPGV4dGVuc2lvbgotICAgICAgICBpZD0idW5yZXNvbHZlZFByb3h5TWFya2VyIgotICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMubWFya2VycyIgbmFtZT0iJVBlcnNpc3RlbmNlTWFya2VyVHlwZU5hbWUiPgotICAgICA8cGVyc2lzdGVudAotICAgICAgICAgICB2YWx1ZT0iZmFsc2UiPgotICAgICA8L3BlcnNpc3RlbnQ+Ci0gICAgIDxzdXBlcgotICAgICAgICAgICB0eXBlPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcm9ibGVtbWFya2VyIj4KLSAgICAgPC9zdXBlcj4KLSAgICAgPGF0dHJpYnV0ZQotICAgICAgICAgICBuYW1lPSJwcm94eVVSSSI+Ci0gICAgIDwvYXR0cmlidXRlPgotICAgICA8YXR0cmlidXRlCi0gICAgICAgICAgIG5hbWU9Im93bmVyR1VJRCI+Ci0gICAgIDwvYXR0cmlidXRlPgotICA8L2V4dGVuc2lvbj4KLQotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zY2hlbWEvbWlncmF0b3JzLmV4c2QgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zY2hlbWEvbWlncmF0b3JzLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2MGEwZWUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc2NoZW1hL21pZ3JhdG9ycy5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTIwICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlIj4KLTxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZSIgaWQ9Im1pZ3JhdG9ycyIgbmFtZT0iTWlncmF0b3JzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIE1pZ3JhdG9yIG1pZ3JhdGVzIG1ldGhvZCBsaWJyYXJ5IGZyb20gb25lIHZlcnNpb24gdG8gYW5vdGhlcgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJtaWdyYXRvciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJtaWdyYXRvciI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSBKYXZhIGNsYXNzIHRoYXQgaW1wbGVtZW50cyBhIG1pZ3JhdG9yLiBUaGlzIGNsYXNzIG11c3QgYmUgYSBwdWJsaWMgaW1wbGVtZW50YXRpb24gb2YgJmx0O2NvZGUmZ3Q7b3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLklNaWdyYXRvciZsdDsvY29kZSZndDsgd2l0aCBhIHB1YmxpYyAwLWFyZ3VtZW50IGNvbnN0cnVjdG9yLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImxpYk5zVVJJIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSBuYW1lIHNwYWNlIFVSSSBvZiB0aGUgbWV0aG9kIGxpYnJhcnkgdGhhdCB0aGlzIG1pZ3JhdG9yIGNhbiBtaWdyYXRlcwotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAxLjAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgJmx0O3AmZ3Q7Ci0mbHQ7cHJlJmd0OwotICAmbHQ7ZXh0ZW5zaW9uCi0gICAgICAgIHBvaW50PSZxdW90O29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLm1pZ3JhdG9ycyZxdW90OyZndDsKLSAgICAgJmx0O21pZ3JhdG9yCi0gICAgICAgICAgIGNsYXNzPSZxdW90O29yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5taWdyYXRpb24uaW50ZXJuYWwuTWlncmF0b3ImcXVvdDsKLSAgICAgICAgICAgbGliTnNVUkk9JnF1b3Q7aHR0cDovLy9jb20vaWJtL3VtYS5lY29yZSZxdW90Oy8mZ3Q7Ci0gICZsdDsvZXh0ZW5zaW9uJmd0OwotJmx0Oy9wcmUmZ3Q7Ci0mbHQ7L3AmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLklNaWdyYXRvcgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UubWlncmF0aW9uLmludGVybmFsLk1pZ3JhdG9yCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuJmx0O2JyJmd0OwotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgJmx0O2EgCi1ocmVmPSZxdW90O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJnF1b3Q7Jmd0O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJmx0Oy9hJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NjaGVtYS9yZXNvdXJjZVNldEZhY3Rvcmllcy5leHNkIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc2NoZW1hL3Jlc291cmNlU2V0RmFjdG9yaWVzLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjMmQ3YjYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc2NoZW1hL3Jlc291cmNlU2V0RmFjdG9yaWVzLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMjYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UiPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlIiBpZD0icmVzb3VyY2VTZXRGYWN0b3JpZXMiIG5hbWU9IkxpYnJhcnkgUmVzb3VyY2UgU2V0IEZhY3RvcmllcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBFeHRlbnNpb24gcG9pbnQgdG8gY29udHJpYnV0ZSBmYWN0b3JpZXMgZm9yIGNyZWF0aW9uIG9mIGxpYnJhcnkgcmVzb3VyY2Ugc2V0LiBUaGUgZmFjdG9yaWVzIG11c3QgaW1wbGVtZW50IGludGVyZmFjZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS5JTGlicmFyeVJlc291cmNlU2V0RmFjdG9yeSBhbmQgbXVzdCBoYXZlIGEgcHVibGljIG5vbi1hcmd1bWVudCBjb25zdHJ1Y3Rvci4KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0icmVzb3VyY2VTZXRGYWN0b3J5IiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9InJlc291cmNlU2V0RmFjdG9yeSI+Ci0gICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgPG1ldGEuZWxlbWVudCBsYWJlbEF0dHJpYnV0ZT0idHlwZSIvPgotICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ0eXBlIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUga2luZD0iamF2YSIgYmFzZWRPbj0ib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UuSUxpYnJhcnlSZXNvdXJjZVNldEZhY3RvcnkiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ2ZXJzaW9uIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAxLjEKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UuSUxpYnJhcnlSZXNvdXJjZVNldEZhY3RvcnkKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuJmx0O2JyJmd0OwotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgJmx0O2EgCi1ocmVmPSZxdW90O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJnF1b3Q7Jmd0O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJmx0Oy9hJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9wZXJzaXN0ZW5jZS9JTGlicmFyeVJlc291cmNlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvcGVyc2lzdGVuY2UvSUxpYnJhcnlSZXNvdXJjZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZWRjYTU0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9wZXJzaXN0ZW5jZS9JTGlicmFyeVJlc291cmNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElMaWJyYXJ5UmVzb3VyY2UgZXh0ZW5kcyBSZXNvdXJjZSB7Ci0JLyoqCi0JICogR2V0cyBsb2FkIHN0YW1wLgotCSAqIAotCSAqIEByZXR1cm4KLQkgKi8KLQlsb25nIGdldExvYWRTdGFtcCgpOwotCQotCS8qKgotCSAqIEdldHMgcHJveHkgVVJJIGZvciB0aGUgc3BlY2lmaWVkIG9iamVjdC4KLQkgKiAKLQkgKiBAcGFyYW0gb2JqZWN0Ci0JICogQHJldHVybgotCSAqLwotCVVSSSBnZXRQcm94eVVSSShFT2JqZWN0IG9iamVjdCk7Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvcGVyc2lzdGVuY2UvSUxpYnJhcnlSZXNvdXJjZVNldC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3BlcnNpc3RlbmNlL0lMaWJyYXJ5UmVzb3VyY2VTZXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDk5ZGI1Yy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvcGVyc2lzdGVuY2UvSUxpYnJhcnlSZXNvdXJjZVNldC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLnJlZnJlc2guSVJlZnJlc2hMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VydmljZXMuSUxpYnJhcnlQZXJzaXN0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzLlNlcnZpY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLklVbWFSZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLnV0aWwuT3Bwb3NpdGVGZWF0dXJlOwotCi0vKioKLSAqIEEgcmVzb3VyY2Ugc2V0IHRoYXQgbWFuYWdlcyBhIGNvbGxlY3Rpb24gb2Yge0BsaW5rIFJlc291cmNlfQotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMQotICovCi1wdWJsaWMgaW50ZXJmYWNlIElMaWJyYXJ5UmVzb3VyY2VTZXQgZXh0ZW5kcyBJVW1hUmVzb3VyY2VTZXQgewotCS8qKgotCSAqIEdldHMgdGhlIHBlcnNpc3RlbmNlIHR5cGUgdGhpcyByZXNvdXJjZSBzZXQgc3VwcG9ydHMKLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBwZXJzaXN0ZW5jZSB0eXBlCi0JICogQHNlZSBTZXJ2aWNlcyNnZXREZWZhdWx0TGlicmFyeVBlcnNpc3RlbmNlVHlwZSgpCi0JICogQHNlZSBTZXJ2aWNlcyNYTUlfUEVSU0lTVEVOQ0VfVFlQRQotCSAqLwotCVN0cmluZyBnZXRQZXJzaXN0ZW5jZVR5cGUoKTsKLQotCS8qKgotCSAqIExvYWRzIG1ldGhvZCBsaWJyYXJpZXMgaW50byB0aGlzIHJlc291cmNlIHNldCBmcm9tIHRoZSBnaXZlbiBVUkkuCi0JICogCi0JICogQHBhcmFtIHBhcmFtZXRlcnMKLQkgKiBAcmV0dXJuCi0JICovCi0Jdm9pZCBsb2FkTWV0aG9kTGlicmFyaWVzKFVSSSB1cmksIE1hcDw/LCA/PiBwYXJhbWV0ZXJzKQotCQkJdGhyb3dzIExpYnJhcnlSZXNvdXJjZUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIEdldHMgdGhlIGxpc3Qgb2YgbWV0aG9kIGxpYnJhcmllcyB0aGF0IGhhdmUgYmVlbiBsb2FkZWQgaW50byB0aGlzCi0JICogcmVzb3VyY2Ugc2V0LgotCSAqIAotCSAqIEByZXR1cm4KLQkgKi8KLQlMaXN0PE1ldGhvZExpYnJhcnk+IGdldE1ldGhvZExpYnJhcmllcygpOwotCi0JLyoqCi0JICogR2V0cyB0aGUgZmlyc3QgbG9hZGVkIG1ldGhvZCBsaWJyYXJ5IG9mIHRoaXMgcmVzb3VyY2Ugc2V0LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG1ldGhvZCBsaWJyYXJ5IG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIGl0IGlzIG5vdCBsb2FkZWQKLQkgKiAgICAgICAgIHlldC4KLQkgKiBAc2VlICNsb2FkTGlicmFyeShVUkksIE1hcCkKLQkgKi8KLQlNZXRob2RMaWJyYXJ5IGdldEZpcnN0TWV0aG9kTGlicmFyeSgpOwotCi0JLyoqCi0JICogR2V0cyB0aGUgb2JqZWN0IHdpdGggdGhlIHNwZWNpZmllZCBHVUlEIChHbG9iYWxseSBVbmlxdWUgSWRlbnRpZmllcikKLQkgKiAKLQkgKiBAcGFyYW0gZ3VpZAotCSAqIEByZXR1cm4KLQkgKi8KLQlFT2JqZWN0IGdldEVPYmplY3QoU3RyaW5nIGd1aWQpOwotCi0JTWFwPD8sID8+IGdldERlZmF1bHRTYXZlT3B0aW9ucygpOwotCi0JLyoqCi0JICogTG9hZHMgdGhlIGdpdmVuIG9wcG9zaXRlIGZlYXR1cmVzIG9mIGFsbCBsb2FkZWQgb2JqZWN0cyBpbiB0aGlzIHJlc291cmNlCi0JICogc2V0LgotCSAqIAotCSAqIEBwYXJhbSBvcHBvc2l0ZUZlYXR1cmVzCi0JICovCi0Jdm9pZCBsb2FkT3Bwb3NpdGVGZWF0dXJlcyhMaXN0PE9wcG9zaXRlRmVhdHVyZT4gb3Bwb3NpdGVGZWF0dXJlcyk7Ci0KLQkvKioKLQkgKiBMb2FkcyB0aGUgZ2l2ZW4gb3Bwb3NpdGUgZmVhdHVyZXMgb2YgdGhvc2Ugb2JqZWN0cyBpbiB0aGlzIHJlc291cmNlIHNldAotCSAqIHdob3NlIEdVSURzIGFyZSBzcGVjaWZpZWQgaW4gPGNvZGU+R1VJRHM8L2NvZGU+IHNldC4KLQkgKiAKLQkgKiBAcGFyYW0gb3Bwb3NpdGVGZWF0dXJlcwotCSAqIEBwYXJhbSBHVUlEcwotCSAqLwotCXZvaWQgbG9hZE9wcG9zaXRlRmVhdHVyZXMoTGlzdDxPcHBvc2l0ZUZlYXR1cmU+IG9wcG9zaXRlRmVhdHVyZXMsIFNldDxTdHJpbmc+IEdVSURzKTsKLQotCS8qKgotCSAqIFNhdmVzIHRoaXMgcmVzb3VyY2Ugc2V0IHdpdGggdGhlIGdpdmVuIHNhdmUgb3B0aW9ucy4KLQkgKiAKLQkgKiBAcGFyYW0gb3B0aW9ucwotCSAqICAgICAgICAgICAgc2F2ZSBvcHRpb25zCi0JICogQHRocm93cyBMaWJyYXJ5UmVzb3VyY2VFeGNlcHRpb24KLQkgKi8KLQl2b2lkIHNhdmUoTWFwPD8sID8+IG9wdGlvbnMpIHRocm93cyBMaWJyYXJ5UmVzb3VyY2VFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBVbmxvYWRzIHRoZSBnaXZlbiBvYmplY3QgaW4gdGhpcyByZXNvdXJjZSBzZXQKLQkgKiAKLQkgKiBAcGFyYW0gb2JqZWN0Ci0JICogQHJldHVybiBib29sZWFuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBnaXZlbiBvYmplY3Qgd2FzIHVubG9hZGVkCi0JICogICAgICAgICBzdWNjZXNzZnVsbHkKLQkgKi8KLQlib29sZWFuIHVubG9hZChFT2JqZWN0IG9iamVjdCk7Ci0KLQkvKioKLQkgKiBVbmxvYWRzIHRoZSBzcGVjaWZpZWQgcmVzb3VyY2Ugb2YgdGhpcyByZXNvdXJjZSBzZXQuCi0JICogCi0JICogQHBhcmFtIHJlc291cmNlCi0JICogQHBhcmFtIG9wdGlvbnMKLQkgKiBAcmV0dXJuIFRPRE8KLQkgKi8KLQlib29sZWFuIHVubG9hZChSZXNvdXJjZSByZXNvdXJjZSwgTWFwPD8sID8+IG9wdGlvbnMpOwotCi0JLyoqCi0JICogUmVsb2FkcyB0aGUgZ2l2ZW4gcmVzb3VyY2VzCi0JICogCi0JICogQHBhcmFtIHJlc291cmNlcwotCSAqIEByZXR1cm4gcmVzb3VyY2VzIHRoYXQgaGFkIGJlZW4gcmVsb2FkZWQKLQkgKi8KLQlDb2xsZWN0aW9uPFJlc291cmNlPiByZWxvYWRSZXNvdXJjZXMoQ29sbGVjdGlvbjxSZXNvdXJjZT4gcmVzb3VyY2VzKTsKLQotCS8qKgotCSAqIFJlbG9hZHMgdGhlIGdpdmVuIHBlcnNpc3RlZCBvYmplY3RzLgotCSAqIAotCSAqIEBwYXJhbSBvYmplY3RzCi0JICogQHJldHVybiBvYmplY3RzIHRoYXQgaGF2ZSBiZWVuIHJlbG9hZGVkCi0JICovCi0JQ29sbGVjdGlvbjxFT2JqZWN0PiByZWxvYWRPYmplY3RzKENvbGxlY3Rpb248RU9iamVjdD4gb2JqZWN0cyk7Ci0KLQkvKioKLQkgKiBVbmxvYWRzIHRoaXMgcmVzb3VyY2Ugc2V0LiBUaGlzIHdpbGwgdW5sb2FkIGV2ZXJ5IHJlc291cmNlIGluIHRoaXMKLQkgKiByZXNvdXJjZSBzZXQgYW5kIHJlc2V0IHRoZSByZXNvdXJjZSBzZXQgdG8gdGhlIHN0YXRlIGJlZm9yZSBsb2FkaW5nIHRoZQotCSAqIGxpYnJhcnkuCi0JICogCi0JICovCi0Jdm9pZCB1bmxvYWQoKTsKLQotCS8qKgotCSAqIENoZWNrcyBpZiB0aGVyZSBpcyBhbnkgdW5yZXNvbHZlZCBwcm94eSBkZXRlY3RlZCBpbiB0aGUgbGlicmFyeQotCSAqIAotCSAqIEByZXR1cm4KLQkgKi8KLQlib29sZWFuIGhhc1VucmVzb2x2ZWRQcm94eSgpOwotCi0JLyoqCi0JICogU3Vic2NyaWJlcyB0aGUgc3BlY2lmaWVkIGxpc3RlbmVyIHRvIGxpc3RlbiB0byByZWZyZXNoIGV2ZW50cyBicm9hZGNhc3RlZAotCSAqIHdoZW5ldmVyIHJlc291cmNlcyBvciBvYmplY3RzIG9mIHRoaXMgcmVzb3VyY2Ugc2V0IGlzIHJlZnJlc2hlZC9yZWxvYWRlZC4KLQkgKiAKLQkgKiBAcGFyYW0gbGlzdGVuZXIKLQkgKiBAc2VlICNyZWxvYWRSZXNvdXJjZXMoQ29sbGVjdGlvbikKLQkgKi8KLQl2b2lkIGFkZFJlZnJlc2hMaXN0ZW5lcihJUmVmcmVzaExpc3RlbmVyIGxpc3RlbmVyKTsKLQkKLQkvKioKLQkgKiBVbnN1YnNjcmliZXMgdGhlIHNwZWNpZmllZCBsaXN0ZW5lciBmcm9tIGxpc3RlbmluZyB0byByZWZyZXNoIGV2ZW50cy4KLQkgKiAKLQkgKiBAcGFyYW0gbGlzdGVuZXIKLQkgKi8KLQl2b2lkIHJlbW92ZVJlZnJlc2hMaXN0ZW50ZXIoSVJlZnJlc2hMaXN0ZW5lciBsaXN0ZW5lcik7Ci0KLQlJTGlicmFyeVBlcnNpc3RlciBnZXRQZXJzaXN0ZXIoKTsKLQotCXZvaWQgY2hlY2tNb2RpZnkoUmVzb3VyY2VbXSByZXNvdXJjZXMsIE9iamVjdCBjb250ZXh0KQotCQkJdGhyb3dzIExpYnJhcnlSZXNvdXJjZUV4Y2VwdGlvbjsKLQotCUlTdGF0dXMgY2hlY2tNb2RpZnkoQ29sbGVjdGlvbjxFT2JqZWN0PiBlT2JqZWN0cywgT2JqZWN0IGNvbnRleHQpOwotCQotCUNvbGxlY3Rpb248UmVzb3VyY2U+IGxvYWROZXdSZXNvdXJjZXMoKTsKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9wZXJzaXN0ZW5jZS9JTGlicmFyeVJlc291cmNlU2V0RmFjdG9yeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3BlcnNpc3RlbmNlL0lMaWJyYXJ5UmVzb3VyY2VTZXRGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyOTczYjUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3BlcnNpc3RlbmNlL0lMaWJyYXJ5UmVzb3VyY2VTZXRGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZTsKLQotLyoqCi0gKiBGYWN0b3J5IHRvIGNyZWF0ZSB7QGxpbmsgSUxpYnJhcnlSZXNvdXJjZVNldH0gaW5zdGFuY2Ugb2YgdGhlIHBhcnRpY3VsYXIKLSAqIHBlcnNpc3RlbmNlIHR5cGUKLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUgLSBPY3QgMjYsIDIwMDYKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJTGlicmFyeVJlc291cmNlU2V0RmFjdG9yeSB7Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBwZXJzaXN0ZW5jZSB0eXBlIG9mIHRoZSByZXNvdXJjZSBzZXQgY3JlYXRlZCBieSB0aGlzIGZhY3RvcnkKLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBwZXJzaXN0ZW5jZSB0eXBlCi0JICovCi0JU3RyaW5nIGdldFBlcnNpc3RlbmNlVHlwZSgpOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBsaWJyYXJ5IHJlc291cmNlIHNldAotCSAqIAotCSAqIEByZXR1cm4gYSBuZXcgbGlicmFyeSByZXNvdXJjZSBzZXQKLQkgKi8KLQlJTGlicmFyeVJlc291cmNlU2V0IGNyZWF0ZUxpYnJhcnlSZXNvdXJjZVNldCgpOwotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3BlcnNpc3RlbmNlL0lSZWZyZXNoSW5mby5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3BlcnNpc3RlbmNlL0lSZWZyZXNoSW5mby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZWE3YjBjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9wZXJzaXN0ZW5jZS9JUmVmcmVzaEluZm8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUgLSBPY3QgMywgMjAwNgotICogQHNpbmNlICAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJUmVmcmVzaEluZm8gewotCS8qKgotCSAqIEdldHMgZXhpc3RpbmcgcmVzb3VyY2VzIHRoYXQgcmVhcHBlYXJzIGluIHdvcmtzcGFjZQotCSAqIAotCSAqIEByZXR1cm4gdGhlIGFkZGVkUmVzb3VyY2VzCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0QWRkZWRSZXNvdXJjZXMoKTsKLQkKLQkvKioKLQkgKiBHZXRzIG5ld2x5IGFkZGVkIHdvcmtzcGFjZSByZXNvdXJjZXMKLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0QWRkZWRXb3Jrc3BhY2VSZXNvdXJjZXMoKTsKLQkKLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIGNoYW5nZWRSZXNvdXJjZXMuCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hhbmdlZFJlc291cmNlcygpOwotCQotCS8qKgotCSAqIEByZXR1cm4gdGhlIGxvYWRlZEJlZm9yZVJlZnJlc2hSZXNvdXJjZXMKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRSZWxvYWRlZEJlZm9yZVJlZnJlc2hSZXNvdXJjZXMoKTsKLQkKLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIHJlbW92ZWRSZXNvdXJjZXMuCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0UmVtb3ZlZFJlc291cmNlcygpOwotCQotCS8qKgotCSAqIE5vdGlmaWVzIHRoaXMgbWFuYWdlciB0aGF0IHRoZSBnaXZlbiByZXNvdXJjZSBqdXN0IGhhcyBiZWVuIHNhdmVkLgotCSAqIAotCSAqIEBwYXJhbSByZXNvdXJjZQotCSAqLwotCXB1YmxpYyB2b2lkIHJlc291cmNlU2F2ZWQoUmVzb3VyY2UgcmVzb3VyY2UpOwkKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9wZXJzaXN0ZW5jZS9MaWJyYXJ5UmVzb3VyY2VFeGNlcHRpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9wZXJzaXN0ZW5jZS9MaWJyYXJ5UmVzb3VyY2VFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTQwYjAxMy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvcGVyc2lzdGVuY2UvTGlicmFyeVJlc291cmNlRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZTsKLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZSAtIE9jdCAyLCAyMDA2Ci0gKiBAc2luY2UgIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTGlicmFyeVJlc291cmNlRXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uIHsKLQotCS8qKgotCSAqIENvbW1lbnQgZm9yIDxjb2RlPnNlcmlhbFZlcnNpb25VSUQ8L2NvZGU+Ci0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gODI3MjU4NzM0NDY3ODY3NjgyOEw7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgTGlicmFyeVJlc291cmNlRXhjZXB0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBtZXNzYWdlCi0JICovCi0JcHVibGljIExpYnJhcnlSZXNvdXJjZUV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSkgewotCQlzdXBlcihtZXNzYWdlKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbWVzc2FnZQotCSAqIEBwYXJhbSBjYXVzZQotCSAqLwotCXB1YmxpYyBMaWJyYXJ5UmVzb3VyY2VFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBjYXVzZSkgewotCQlzdXBlcihtZXNzYWdlLCBjYXVzZSk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGNhdXNlCi0JICovCi0JcHVibGljIExpYnJhcnlSZXNvdXJjZUV4Y2VwdGlvbihUaHJvd2FibGUgY2F1c2UpIHsKLQkJc3VwZXIoY2F1c2UpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3BlcnNpc3RlbmNlL1BlcnNpc3RlbmNlU2VydmljZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3BlcnNpc3RlbmNlL1BlcnNpc3RlbmNlU2VydmljZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNjYwZGU5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9wZXJzaXN0ZW5jZS9QZXJzaXN0ZW5jZVNlcnZpY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZTsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uQ29tbW9uUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VydmljZXMuU2VydmljZXM7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUGVyc2lzdGVuY2VTZXJ2aWNlIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHID0gUGVyc2lzdGVuY2VQbHVnaW4uZ2V0RGVmYXVsdCgpLmlzRGVidWdnaW5nKCk7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBQZXJzaXN0ZW5jZVNlcnZpY2UgSU5TVEFOQ0UgPSBuZXcgUGVyc2lzdGVuY2VTZXJ2aWNlKCk7Ci0KLQlwcml2YXRlIHN0YXRpYyBIYXNoTWFwPFN0cmluZywgRmFjdG9yeURlZj4gdHlwZVRvRmFjdG9yeURlZk1hcDsKLQotCXByaXZhdGUgUGVyc2lzdGVuY2VTZXJ2aWNlKCkgewotCi0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBSZXNvdXJjZVNldCBmb3IgdGhlIGdpdmVuIHBlcnNpc3RlbmNlIHR5cGUKLQkgKiAKLQkgKiBAcGFyYW0gdHlwZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgSUxpYnJhcnlSZXNvdXJjZVNldCBjcmVhdGVSZXNvdXJjZVNldChTdHJpbmcgdHlwZSkgewotCQlJTGlicmFyeVJlc291cmNlU2V0RmFjdG9yeSBmYWN0b3J5ID0gZ2V0RmFjdG9yeSh0eXBlKTsKLQkJaWYoZmFjdG9yeSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFjdG9yeS5jcmVhdGVMaWJyYXJ5UmVzb3VyY2VTZXQoKTsKLQkJfQotCQllbHNlIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlVua25vd24gdHlwZTogIiArIHR5cGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBGYWN0b3J5RGVmIHsKLQkJQnVuZGxlIGJ1bmRsZTsKLQotCQlTdHJpbmcgdHlwZTsKLQotCQlTdHJpbmcgY2xhc3NOYW1lOwotCQkKLQkJaW50IHZlcnNpb247Ci0JCQotCQlJTGlicmFyeVJlc291cmNlU2V0RmFjdG9yeSBpbnN0YW5jZTsKLQotCQkvKioKLQkJICogQHBhcmFtIGJ1bmRsZQotCQkgKiBAcGFyYW0gdHlwZQotCQkgKiBAcGFyYW0gY2xhc3NOYW1lCi0JCSAqIEBwYXJhbSBpbnN0YW5jZQotCQkgKi8KLQkJcHJpdmF0ZSBGYWN0b3J5RGVmKEJ1bmRsZSBidW5kbGUsIFN0cmluZyB0eXBlLCBTdHJpbmcgY2xhc3NOYW1lLCBpbnQgdmVyc2lvbikgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMuYnVuZGxlID0gYnVuZGxlOwotCQkJdGhpcy50eXBlID0gdHlwZTsKLQkJCXRoaXMuY2xhc3NOYW1lID0gY2xhc3NOYW1lOwotCQkJdGhpcy52ZXJzaW9uID0gdmVyc2lvbjsKLQkJfQotCQkJCQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIElMaWJyYXJ5UmVzb3VyY2VTZXRGYWN0b3J5IGdldEZhY3RvcnkoU3RyaW5nIHBlcnNpc3RlbmNlVHlwZSkgewotCQlpZiAodHlwZVRvRmFjdG9yeURlZk1hcCA9PSBudWxsKSB7Ci0JCQl0eXBlVG9GYWN0b3J5RGVmTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBGYWN0b3J5RGVmPigpOwotCQkJLy8gUHJvY2VzcyB0aGUgIm9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLm1pZ3JhdG9ycyIKLQkJCS8vIGV4dGVuc2lvbiBwb2ludAotCQkJLy8gY29udHJpYnV0b3JzLgotCQkJSUV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5ID0gUGxhdGZvcm0KLQkJCQkJLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCk7Ci0JCQlJRXh0ZW5zaW9uUG9pbnQgZXh0ZW5zaW9uUG9pbnQgPSBleHRlbnNpb25SZWdpc3RyeQotCQkJCQkuZ2V0RXh0ZW5zaW9uUG9pbnQoCi0JCQkJCQkJIm9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlIiwgInJlc291cmNlU2V0RmFjdG9yaWVzIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJaWYgKGV4dGVuc2lvblBvaW50ICE9IG51bGwpIHsKLQkJCQlJRXh0ZW5zaW9uW10gZXh0ZW5zaW9ucyA9IGV4dGVuc2lvblBvaW50LmdldEV4dGVuc2lvbnMoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGV4dGVuc2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCQkJSUV4dGVuc2lvbiBleHRlbnNpb24gPSBleHRlbnNpb25zW2ldOwotCQkJCQlTdHJpbmcgcGx1Z2luSWQgPSBleHRlbnNpb24uZ2V0TmFtZXNwYWNlSWRlbnRpZmllcigpOwotCQkJCQlCdW5kbGUgYnVuZGxlID0gUGxhdGZvcm0uZ2V0QnVuZGxlKHBsdWdpbklkKTsKLQkJCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gY29uZmlnRWxlbWVudHMgPSBleHRlbnNpb24KLQkJCQkJCQkuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzKCk7Ci0JCQkJCWZvciAoaW50IGogPSAwOyBqIDwgY29uZmlnRWxlbWVudHMubGVuZ3RoOyBqKyspIHsKLQkJCQkJCUlDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWdFbGVtZW50ID0gY29uZmlnRWxlbWVudHNbal07Ci0JCQkJCQl0cnkgewotCQkJCQkJCVN0cmluZyBjbGFzc05hbWUgPSBjb25maWdFbGVtZW50Ci0JCQkJCQkJCQkuZ2V0QXR0cmlidXRlKCJjbGFzcyIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJU3RyaW5nIHR5cGUgPSBjb25maWdFbGVtZW50Ci0JCQkJCQkJCQkuZ2V0QXR0cmlidXRlKCJ0eXBlIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQlpZiAoY2xhc3NOYW1lICE9IG51bGwKLQkJCQkJCQkJCSYmIGNsYXNzTmFtZS50cmltKCkubGVuZ3RoKCkgPiAwCi0JCQkJCQkJCQkmJiB0eXBlICE9IG51bGwKLQkJCQkJCQkJCSYmIHR5cGUudHJpbSgpLmxlbmd0aCgpID4gMCkgewotCQkJCQkJCQlpbnQgdmVyc2lvbiA9IFNlcnZpY2VzLnBhcnNlVmVyc2lvbihjb25maWdFbGVtZW50LmdldEF0dHJpYnV0ZSgidmVyc2lvbiIpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQlGYWN0b3J5RGVmIGZhY3RvcnlEZWYgPSB0eXBlVG9GYWN0b3J5RGVmTWFwLmdldCh0eXBlKTsJCQkJCQkJCQotCQkJCQkJCQlpZihmYWN0b3J5RGVmID09IG51bGwgfHwgZmFjdG9yeURlZi52ZXJzaW9uIDwgdmVyc2lvbikgewotCQkJCQkJCQkJdHlwZVRvRmFjdG9yeURlZk1hcC5wdXQodHlwZSwgbmV3IEZhY3RvcnlEZWYoYnVuZGxlLAotCQkJCQkJCQkJCQl0eXBlLCBjbGFzc05hbWUsIHZlcnNpb24pKTsJCQkJCQkJCQkKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJQ29tbW9uUGx1Z2luLklOU1RBTkNFLmxvZyhlKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlGYWN0b3J5RGVmIGZhY3RvcnkgPSAoRmFjdG9yeURlZikgdHlwZVRvRmFjdG9yeURlZk1hcC5nZXQocGVyc2lzdGVuY2VUeXBlKTsKLQkJaWYgKGZhY3RvcnkgIT0gbnVsbCkgewotCQkJaWYgKGZhY3RvcnkuaW5zdGFuY2UgPT0gbnVsbCkgewotCQkJCXRyeSB7Ci0JCQkJCUlMaWJyYXJ5UmVzb3VyY2VTZXRGYWN0b3J5IHJlc291cmNlU2V0RmFjdG9yeSA9IChJTGlicmFyeVJlc291cmNlU2V0RmFjdG9yeSkgZmFjdG9yeS5idW5kbGUubG9hZENsYXNzKAotCQkJCQkJCWZhY3RvcnkuY2xhc3NOYW1lKS5uZXdJbnN0YW5jZSgpOwotCQkJCQlpZihwZXJzaXN0ZW5jZVR5cGUuZXF1YWxzKHJlc291cmNlU2V0RmFjdG9yeS5nZXRQZXJzaXN0ZW5jZVR5cGUoKSkpIHsKLQkJCQkJCWZhY3RvcnkuaW5zdGFuY2UgPSByZXNvdXJjZVNldEZhY3Rvcnk7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQlQZXJzaXN0ZW5jZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZmFjdG9yeS5jbGFzc05hbWUgKwotCQkJCQkJCQkiIGlzIHJlZ2lzdGVyZWQgd2l0aCB0aGUgd3JvbmcgcGVyc2lzdGVuY2UgdHlwZSAnIiArIHBlcnNpc3RlbmNlVHlwZSArIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJIicuIFRoZSBjb3JyZWN0IHR5cGUgbXVzdCBiZSAnIiArIHJlc291cmNlU2V0RmFjdG9yeS5nZXRQZXJzaXN0ZW5jZVR5cGUoKSArICInIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQl9Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJUGVyc2lzdGVuY2VQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCQlpZihERUJVRykgewotCQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBmYWN0b3J5Lmluc3RhbmNlOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3BlcnNpc3RlbmNlL2ludGVybmFsL0FjY2Vzc0NvbnRyb2xsZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9wZXJzaXN0ZW5jZS9pbnRlcm5hbC9BY2Nlc3NDb250cm9sbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhYzJiOTkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3BlcnNpc3RlbmNlL2ludGVybmFsL0FjY2Vzc0NvbnRyb2xsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UuSUxpYnJhcnlSZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UuRmlsZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzLklBY2Nlc3NDb250cm9sbGVyOwotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlIC0gT2N0IDksIDIwMDYKLSAqIEBzaW5jZSAgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBBY2Nlc3NDb250cm9sbGVyIGltcGxlbWVudHMgSUFjY2Vzc0NvbnRyb2xsZXIgewotCi0JcHVibGljIEFjY2Vzc0NvbnRyb2xsZXIoKSB7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLklBY2Nlc3NDb250cm9sbGVyI2NoZWNrTW9kaWZ5KGphdmEudXRpbC5Db2xsZWN0aW9uLCBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBJU3RhdHVzIGNoZWNrTW9kaWZ5KENvbGxlY3Rpb24gZU9iamVjdHMsIE9iamVjdCBjb250ZXh0KSB7Ci0JCWlmKGVPYmplY3RzLmlzRW1wdHkoKSkgewotCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCX0KLQkJSUxpYnJhcnlSZXNvdXJjZVNldCByZXNvdXJjZVNldCA9IG51bGw7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGVPYmplY3RzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJRU9iamVjdCBvID0gKEVPYmplY3QpIGl0ZXIubmV4dCgpOwotCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSBvLmVSZXNvdXJjZSgpOwotCQkJaWYocmVzb3VyY2UgIT0gbnVsbCAmJiByZXNvdXJjZS5nZXRSZXNvdXJjZVNldCgpIGluc3RhbmNlb2YgSUxpYnJhcnlSZXNvdXJjZVNldCkgewotCQkJCXJlc291cmNlU2V0ID0gKElMaWJyYXJ5UmVzb3VyY2VTZXQpIHJlc291cmNlLmdldFJlc291cmNlU2V0KCk7Ci0JCQkJaWYocmVzb3VyY2VTZXQgIT0gbnVsbCkgewotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYocmVzb3VyY2VTZXQgIT0gbnVsbCkgewotCQkJcmV0dXJuIHJlc291cmNlU2V0LmNoZWNrTW9kaWZ5KGVPYmplY3RzLCBjb250ZXh0KTsKLQkJfQotCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuSUFjY2Vzc0NvbnRyb2xsZXIjY2hlY2tNb2RpZnkob3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlW10sIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIElTdGF0dXMgY2hlY2tNb2RpZnkoUmVzb3VyY2VbXSByZXNvdXJjZXMsIE9iamVjdCBjb250ZXh0KSB7Ci0JCWlmKHJlc291cmNlcy5sZW5ndGggPT0gMCkgewotCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCX0KLQkJQXJyYXlMaXN0PFN0cmluZz4gcGF0aHMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZXNvdXJjZXMubGVuZ3RoOyBpKyspIHsKLQkJCVJlc291cmNlIHJlc291cmNlID0gcmVzb3VyY2VzW2ldOwotCQkJU3RyaW5nIHBhdGggPSBGaWxlTWFuYWdlci50b0ZpbGVTdHJpbmcocmVzb3VyY2UuZ2V0VVJJKCkpOwotCQkJaWYocGF0aCAhPSBudWxsKSB7Ci0JCQkJcGF0aHMuYWRkKHBhdGgpOwotCQkJfQotCQl9Ci0JCWlmKCFwYXRocy5pc0VtcHR5KCkpIHsKLQkJCVN0cmluZ1tdIGFyciA9IG5ldyBTdHJpbmdbcGF0aHMuc2l6ZSgpXTsKLQkJCXBhdGhzLnRvQXJyYXkoYXJyKTsKLQkJCXJldHVybiBGaWxlTWFuYWdlci5nZXRJbnN0YW5jZSgpLmNoZWNrTW9kaWZ5KGFyciwgY29udGV4dCk7Ci0JCX0KLQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7CQotCQkKLS8vCQlNdWx0aVN0YXR1cyBtdWx0aVN0YXR1cyA9IG5ldyBNdWx0aVN0YXR1cyhQZXJzaXN0ZW5jZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SWQoKSwKLS8vCQkJCUlTdGF0dXMuT0ssIFBlcnNpc3RlbmNlUmVzb3VyY2VzLm1vZGlmeUZpbGVzRXJyb3JfbXNnLAotLy8JCQkJbnVsbCk7Ci0vLwotLy8JCUhhc2hNYXA8SUxpYnJhcnlSZXNvdXJjZVNldCwgU2V0PFJlc291cmNlPj4gcmVzb3VyY2VTZXRUb1Jlc291cmNlc01hcCA9IG5ldyBIYXNoTWFwPElMaWJyYXJ5UmVzb3VyY2VTZXQsIFNldDxSZXNvdXJjZT4+KCk7Ci0vLwkJU2V0PFJlc291cmNlPiByZXNvdXJjZXNXaXRob3V0TGlicmFyeVJlc291cmNlU2V0ID0gbnVsbDsKLS8vCQlmb3IgKGludCBpID0gMDsgaSA8IHJlc291cmNlcy5sZW5ndGg7IGkrKykgewotLy8JCQlSZXNvdXJjZSByZXNvdXJjZSA9IHJlc291cmNlc1tpXTsKLS8vCQkJaWYocmVzb3VyY2UuZ2V0UmVzb3VyY2VTZXQoKSBpbnN0YW5jZW9mIElMaWJyYXJ5UmVzb3VyY2VTZXQpIHsKLS8vCQkJCVNldCBzZXQgPSByZXNvdXJjZVNldFRvUmVzb3VyY2VzTWFwLmdldChyZXNvdXJjZS5nZXRSZXNvdXJjZVNldCgpKTsKLS8vCQkJCWlmKHNldCA9PSBudWxsKSB7Ci0vLwkJCQkJc2V0ID0gbmV3IEhhc2hTZXQ8UmVzb3VyY2U+KCk7Ci0vLwkJCQkJcmVzb3VyY2VTZXRUb1Jlc291cmNlc01hcC5wdXQoKElMaWJyYXJ5UmVzb3VyY2VTZXQpIHJlc291cmNlLmdldFJlc291cmNlU2V0KCksIHNldCk7Ci0vLwkJCQl9Ci0vLwkJCQlzZXQuYWRkKHJlc291cmNlKTsJCQkJCi0vLwkJCX0KLS8vCQkJZWxzZSB7Ci0vLwkJCQlpZihyZXNvdXJjZXNXaXRob3V0TGlicmFyeVJlc291cmNlU2V0ID09IG51bGwpIHsKLS8vCQkJCQlyZXNvdXJjZXNXaXRob3V0TGlicmFyeVJlc291cmNlU2V0ID0gbmV3IEhhc2hTZXQ8UmVzb3VyY2U+KCk7Ci0vLwkJCQl9Ci0vLwkJCQlyZXNvdXJjZXNXaXRob3V0TGlicmFyeVJlc291cmNlU2V0LmFkZChyZXNvdXJjZSk7Ci0vLwkJCX0KLS8vCQl9Ci0vLwkJaWYoIXJlc291cmNlU2V0VG9SZXNvdXJjZXNNYXAuaXNFbXB0eSgpKSB7Ci0vLwkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHJlc291cmNlU2V0VG9SZXNvdXJjZXNNYXAuZW50cnlTZXQoKS5pdGVyYXRvcigpOyBpdGVyCi0vLwkJCQkJLmhhc05leHQoKTspIHsKLS8vCQkJCU1hcC5FbnRyeTxJTGlicmFyeVJlc291cmNlU2V0LCBTZXQ8UmVzb3VyY2U+PiBlbnRyeSA9IChFbnRyeTxJTGlicmFyeVJlc291cmNlU2V0LCBTZXQ8UmVzb3VyY2U+PikgaXRlci5uZXh0KCk7Ci0vLwkJCQlSZXNvdXJjZVtdIGFyciA9IG5ldyBSZXNvdXJjZVtlbnRyeS5nZXRWYWx1ZSgpLnNpemUoKV07Ci0vLwkJCQllbnRyeS5nZXRWYWx1ZSgpLnRvQXJyYXkoYXJyKTsKLS8vCQkJCWVudHJ5LmdldEtleSgpLmNoZWNrTW9kaWZ5KGFyciwgY29udGV4dCk7Ci0vLwkJCX0KLS8vCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvcGVyc2lzdGVuY2UvaW50ZXJuYWwvSUZhaWxTYWZlU2F2YWJsZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3BlcnNpc3RlbmNlL2ludGVybmFsL0lGYWlsU2FmZVNhdmFibGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTk3MWNhMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvcGVyc2lzdGVuY2UvaW50ZXJuYWwvSUZhaWxTYWZlU2F2YWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UuaW50ZXJuYWw7Ci0KLS8qKgotICogSW50ZXJmYWNlIGEgcmVzb3VyY2UgbXVzdCBpbXBsZW1lbnQgdG8gc3VwcG9ydCBmYWlsLXNhZmUgcGVyc2lzdGVuY2UKLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqCi0gKiBAc2luY2UgMS4yCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUZhaWxTYWZlU2F2YWJsZSB7Ci0Jdm9pZCBjb21taXQoKTsKLQkKLQlib29sZWFuIHJlc3RvcmUoKTsKLQkKLQl2b2lkIHNldFR4SUQoU3RyaW5nIHR4SUQpOwotCQotCWJvb2xlYW4gaGFzVGVtcFVSSSgpOwotCQotCXZvaWQgdHhGaW5pc2hlZChib29sZWFuIHN1Y2Nlc3NmdWwpOwotCQotCXZvaWQgZGVsZXRlQmFja3VwKCk7Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvcGVyc2lzdGVuY2Uvc3luY2gvSVN5bmNocm9uaXphdGlvbkhlbHBlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3BlcnNpc3RlbmNlL3N5bmNoL0lTeW5jaHJvbml6YXRpb25IZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmQ2YWYxMy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvcGVyc2lzdGVuY2Uvc3luY2gvSVN5bmNocm9uaXphdGlvbkhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uuc3luY2g7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uuc3luY2guaW50ZXJuYWwuU3luY2hyb25pemF0aW9uSGVscGVyOwotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luZSAxLjIKLSAqLwotcHVibGljIGludGVyZmFjZSBJU3luY2hyb25pemF0aW9uSGVscGVyIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIElTeW5jaHJvbml6YXRpb25IZWxwZXIgSU5TVEFOQ0UgPSBuZXcgU3luY2hyb25pemF0aW9uSGVscGVyKCk7Ci0JCi0JbG9uZyBnZXRNb2RpZmljYXRpb25TdGFtcChSZXNvdXJjZSByZXNvdXJjZSk7Ci0JCi0JYm9vbGVhbiBpc1N5bmNocm9uaXplZChSZXNvdXJjZSByZXNvdXJjZSk7Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvcGVyc2lzdGVuY2Uvc3luY2gvaW50ZXJuYWwvU3luY2hyb25pemF0aW9uSGVscGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvcGVyc2lzdGVuY2Uvc3luY2gvaW50ZXJuYWwvU3luY2hyb25pemF0aW9uSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3YzYwNWUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3BlcnNpc3RlbmNlL3N5bmNoL2ludGVybmFsL1N5bmNocm9uaXphdGlvbkhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uuc3luY2guaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi53b3Jrc3BhY2UudXRpbC5Xb3Jrc3BhY2VTeW5jaHJvbml6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uuc3luY2guSVN5bmNocm9uaXphdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UuRmlsZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLklGaWxlSW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UuTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsOwotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luZSAxLjIKLSAqLwotcHVibGljIGNsYXNzIFN5bmNocm9uaXphdGlvbkhlbHBlciBpbXBsZW1lbnRzIElTeW5jaHJvbml6YXRpb25IZWxwZXIgewotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uuc3luY2guSVN5bmNocm9uaXphdGlvbkhlbHBlciNnZXRNb2RpZmljYXRpb25TdGFtcChvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2UpCi0JICovCi0JcHVibGljIGxvbmcgZ2V0TW9kaWZpY2F0aW9uU3RhbXAoUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJaWYocmVzb3VyY2UgaW5zdGFuY2VvZiBNdWx0aUZpbGVYTUlSZXNvdXJjZUltcGwpIHsKLQkJCUlGaWxlSW5mbyBpbmZvID0gRmlsZU1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5nZXRGaWxlSW5mbyhyZXNvdXJjZSk7Ci0JCQlyZXR1cm4gaW5mbyAhPSBudWxsID8gaW5mby5nZXRNb2RpZmljYXRpb25TdGFtcCgpIDogSVJlc291cmNlLk5VTExfU1RBTVA7Ci0JCX0KLQkJcmV0dXJuIElSZXNvdXJjZS5OVUxMX1NUQU1QOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLnN5bmNoLklTeW5jaHJvbml6YXRpb25IZWxwZXIjaXNTeW5jaHJvbml6ZWQob3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU3luY2hyb25pemVkKFJlc291cmNlIHJlc291cmNlKSB7Ci0JCWlmKHJlc291cmNlIGluc3RhbmNlb2YgTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsKSB7Ci0JCQlyZXR1cm4gKChNdWx0aUZpbGVYTUlSZXNvdXJjZUltcGwpcmVzb3VyY2UpLmlzU3luY2hyb25pemVkKCk7Ci0JCX0KLQkJSUZpbGUgZmlsZSA9IFdvcmtzcGFjZVN5bmNocm9uaXplci5nZXRGaWxlKHJlc291cmNlKTsKLQkJaWYoZmlsZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gZmlsZS5pc1N5bmNocm9uaXplZChJUmVzb3VyY2UuREVQVEhfWkVSTyk7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvcGVyc2lzdGVuY2UvdXRpbC9FeHRlbmRlZFJlc291cmNlU2V0LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvcGVyc2lzdGVuY2UvdXRpbC9FeHRlbmRlZFJlc291cmNlU2V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzMTk0YjguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3BlcnNpc3RlbmNlL3V0aWwvRXh0ZW5kZWRSZXNvdXJjZVNldC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuaW1wbC5SZXNvdXJjZVNldEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5Db21tb25QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLlVubm9ybWFsaXplZFVSSUV4Y2VwdGlvbjsKLQotLyoqCi0gKiBBIGV4dGVuZGVkIHJlc291cmNlIHNldCB3aG9zZSBvYmplY3RzIGNhbiByZWZlcmVuY2VzIG9iamVjdHMgb2Ygb3RoZXIgcmVzb3VyY2Ugc2V0Ci0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlIC0gQXVnIDksIDIwMDYKLSAqIEBzaW5jZSAgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBFeHRlbmRlZFJlc291cmNlU2V0IGV4dGVuZHMgUmVzb3VyY2VTZXRJbXBsIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBVUklfVFlQRV9VTktOT1dOID0gMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBVUklfVFlQRV9MT0NBTCA9IDE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVVJJX1RZUEVfRVhURVJOQUwgPSAyOwotCQotCXByb3RlY3RlZCBMaXN0PFJlc291cmNlU2V0PiByZWZlcmVuY2VkUmVzb3VyY2VTZXRzID0gbmV3IEFycmF5TGlzdDxSZXNvdXJjZVNldD4oKTsKLQotCQotCS8qKgotCSAqIEdldHMgdGhlIHR5cGUgb2YgdGhlIGdpdmVuIFVSSS4KLQkgKiAKLQkgKiBAcGFyYW0gdXJpCi0JICogQHJldHVybiBvbmUgb2YgVVJJIHR5cGUgY29uc3RhbnRzOiB7QGxpbmsgI1VSSV9UWVBFX0VYVEVSTkFMfSwge0BsaW5rICNVUklfVFlQRV9MT0NBTH0sIHtAbGluayAjVVJJX1RZUEVfVU5LTk9XTn0KLQkgKi8KLQlwcm90ZWN0ZWQgaW50IGdldFVSSVR5cGUoVVJJIHVyaSkgewotCQlyZXR1cm4gVVJJX1RZUEVfVU5LTk9XTjsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gYWRkKFJlc291cmNlU2V0IHJlZmVyZW5jZWRSZXNvdXJjZVNldCkgewotCQlpZighcmVmZXJlbmNlZFJlc291cmNlU2V0cy5jb250YWlucyhyZWZlcmVuY2VkUmVzb3VyY2VTZXQpKSB7Ci0JCQlyZXR1cm4gcmVmZXJlbmNlZFJlc291cmNlU2V0cy5hZGQocmVmZXJlbmNlZFJlc291cmNlU2V0KTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBFT2JqZWN0IGdldEVPYmplY3QoVVJJIHVyaSwgYm9vbGVhbiBsb2FkT25EZW1hbmQpIHsKLQkJRU9iamVjdCBvYmplY3QgPSBudWxsOwotCQlVbm5vcm1hbGl6ZWRVUklFeGNlcHRpb24gZXggPSBudWxsOwotCQlpbnQgdXJpVHlwZSA9IGdldFVSSVR5cGUodXJpKTsKLQkJaWYodXJpVHlwZSA9PSBVUklfVFlQRV9VTktOT1dOIHx8IHVyaVR5cGUgPT0gVVJJX1RZUEVfTE9DQUwpIHsKLQkJCXRyeSB7Ci0JCQkJb2JqZWN0ID0gc3VwZXIuZ2V0RU9iamVjdCh1cmksIGxvYWRPbkRlbWFuZCk7Ci0JCQl9IGNhdGNoIChVbm5vcm1hbGl6ZWRVUklFeGNlcHRpb24gZSkgewotCQkJCWV4ID0gZTsKLQkJCX0KLQkJCWlmKG9iamVjdCAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIG9iamVjdDsKLQkJCX0KLQkJfQotCQlpZih1cmlUeXBlID09IFVSSV9UWVBFX1VOS05PV04gfHwgdXJpVHlwZSA9PSBVUklfVFlQRV9FWFRFUk5BTCkgewotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gcmVmZXJlbmNlZFJlc291cmNlU2V0cy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlSZXNvdXJjZVNldCByZXNvdXJjZVNldCA9IChSZXNvdXJjZVNldCkgaXRlci5uZXh0KCk7Ci0JCQkJdHJ5IHsKLQkJCQkJb2JqZWN0ID0gcmVzb3VyY2VTZXQuZ2V0RU9iamVjdCh1cmksIGxvYWRPbkRlbWFuZCk7Ci0JCQkJCWlmKG9iamVjdCAhPSBudWxsKSB7Ci0JCQkJCQlyZXR1cm4gb2JqZWN0OwotCQkJCQl9Ci0JCQkJfSBjYXRjaCAoVW5ub3JtYWxpemVkVVJJRXhjZXB0aW9uIGUpIHsKLQkJCQkJZXggPSBlOwotCQkJCX0KLQkJCX0KLQkJfSAKLQkJCi0JCWlmKGV4ICE9IG51bGwpIHsKLQkJCXRocm93IGV4OwotCQl9Ci0JCXJldHVybiBvYmplY3Q7Ci0JfQkKLQkKLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBnZXRSZXNvdXJjZXMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCVJlc291cmNlIHJlc291cmNlID0gKFJlc291cmNlKSBpdGVyLm5leHQoKTsKLQkJCXRyeXsKLQkJCQlyZXNvdXJjZS51bmxvYWQoKTsJCQkKLQkJCX0KLQkJCWNhdGNoKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJQ29tbW9uUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCX0KLQkJfQotCQlyZWZlcmVuY2VkUmVzb3VyY2VTZXRzLmNsZWFyKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3BlcnNpc3RlbmNlL3V0aWwvRmlsZVN5bmNocm9uaXplci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3BlcnNpc3RlbmNlL3V0aWwvRmlsZVN5bmNocm9uaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOTI1ZjA5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9wZXJzaXN0ZW5jZS91dGlsL0ZpbGVTeW5jaHJvbml6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyMSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlRGVsdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlRGVsdGFWaXNpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlUGx1Z2luOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci0KLS8qKgotICogU3luY2hyb25pemVzIHRoZSBkb2N1bWVudCB3aXRoIGV4dGVybmFsIHJlc291cmNlIGNoYW5nZXMuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKgotICogQHNpbmNlIDEuMgotICovCi1wdWJsaWMgY2xhc3MgRmlsZVN5bmNocm9uaXplciBpbXBsZW1lbnRzIElSZXNvdXJjZUNoYW5nZUxpc3RlbmVyIHsKLQotCS8qKgotCSAqIEJ1bmRsZSBvZiBhbGwgcmVxdWlyZWQgaW5mb3JtYXRpb24gdG8gYWxsb3cgZmlsZXMgYXMgdW5kZXJseWluZyBkb2N1bWVudCByZXNvdXJjZXMuCi0JICovCi0JcHVibGljIHN0YXRpYyBjbGFzcyBGaWxlSW5mbyAvL2V4dGVuZHMgU3RvcmFnZUluZm8gCi0JewotCQkvKiogVGhlIHRpbWUgc3RhbXAgYXQgd2hpY2ggdGhpcyBwcm92aWRlciBjaGFuZ2VkIHRoZSBmaWxlLiAqLwotCQlwdWJsaWMgbG9uZyBmTW9kaWZpY2F0aW9uU3RhbXA9IElSZXNvdXJjZS5OVUxMX1NUQU1QOwotCQlwdWJsaWMgYm9vbGVhbiBmQ2FuQmVTYXZlZDsKLQkJcHVibGljIElGaWxlIGZGaWxlOwotCi0JCS8qKgotCQkgKiBDcmVhdGVzIGFuZCByZXR1cm5zIGEgbmV3IGZpbGUgaW5mby4KLQkJICoKLQkJICogQHBhcmFtIGRvY3VtZW50IHRoZSBkb2N1bWVudAotCQkgKiBAcGFyYW0gbW9kZWwgdGhlIGFubm90YXRpb24gbW9kZWwKLQkJICogQHBhcmFtIGZpbGVTeW5jaHJvbml6ZXIgdGhlIGZpbGUgc3luY2hyb25pemVyCi0JCSAqLwotCQlwdWJsaWMgRmlsZUluZm8oSUZpbGUgZmlsZSkgewotCQkJZkZpbGUgPSBmaWxlOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQSBmbGFnIGluZGljYXRpbmcgd2hldGhlciB0aGlzIHN5bmNocm9uaXplciBpcyBpbnN0YWxsZWQgb3Igbm90LgotCSAqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gZklzSW5zdGFsbGVkPSBmYWxzZTsKLQkKLQkvKiogRWxlbWVudCBpbmZvcm1hdGlvbiBvZiBhbGwgY29ubmVjdGVkIGVsZW1lbnRzICovCi0JcHJpdmF0ZSBNYXA8T2JqZWN0LCBGaWxlSW5mbz4gZkZpbGVJbmZvTWFwPSBuZXcgSGFzaE1hcDxPYmplY3QsIEZpbGVJbmZvPigpOwotCi0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGZpbGUgc3luY2hyb25pemVyLiBJcyBub3QgeWV0IGluc3RhbGxlZCBvbiBhIHJlc291cmNlLgotCSAqLwotCXB1YmxpYyBGaWxlU3luY2hyb25pemVyKCkgewotCQlpbnN0YWxsKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gYWNjZXB0KElGaWxlIGZpbGUpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc0luc3RhbGxlZCgpIHsKLQkJcmV0dXJuIGZJc0luc3RhbGxlZDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdXBkYXRlTW9kaWZpY2F0aW9uU3RhbXAoSUZpbGUgZmlsZSkgewotCQlGaWxlSW5mbyBpbmZvID0gZ2V0RmlsZUluZm8oZmlsZSk7Ci0JCWlmKGluZm8gIT0gbnVsbCkgewotCQkJaW5mby5mTW9kaWZpY2F0aW9uU3RhbXAgPSBjb21wdXRlTW9kaWZpY2F0aW9uU3RhbXAoZmlsZSk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZWxlbWVudCBpbmZvIG9iamVjdCBmb3IgdGhlIGdpdmVuIGVsZW1lbnQuCi0JICoKLQkgKiBAcGFyYW0gZWxlbWVudCB0aGUgZWxlbWVudAotCSAqIEByZXR1cm4gdGhlIGVsZW1lbnQgaW5mbyBvYmplY3QsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUKLQkgKi8KLQlwdWJsaWMgRmlsZUluZm8gZ2V0RmlsZUluZm8oT2JqZWN0IGVsZW1lbnQpIHsKLQkJcmV0dXJuIChGaWxlSW5mbykgZkZpbGVJbmZvTWFwLmdldChlbGVtZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBJbnN0YWxscyB0aGUgc3luY2hyb25pemVyIG9uIHRoZSBpbnB1dCdzIGZpbGUuCi0JICovCi0JcHVibGljIHZvaWQgaW5zdGFsbCgpIHsKLQkJUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmFkZFJlc291cmNlQ2hhbmdlTGlzdGVuZXIodGhpcywgSVJlc291cmNlQ2hhbmdlRXZlbnQuUE9TVF9DSEFOR0UpOwotCQlmSXNJbnN0YWxsZWQ9IHRydWU7Ci0JfQotCi0JLyoqCi0JICogVW5pbnN0YWxscyB0aGUgc3luY2hyb25pemVyIGZyb20gdGhlIGlucHV0J3MgZmlsZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCB1bmluc3RhbGwoKSB7Ci0JCVJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5yZW1vdmVSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKHRoaXMpOwotCQlmSXNJbnN0YWxsZWQ9IGZhbHNlOwotCX0KLQotCS8qCi0JICogQHNlZSBJUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciNyZXNvdXJjZUNoYW5nZWQoSVJlc291cmNlQ2hhbmdlRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgcmVzb3VyY2VDaGFuZ2VkKElSZXNvdXJjZUNoYW5nZUV2ZW50IGUpIHsKLQkJSVJlc291cmNlRGVsdGEgZGVsdGE9IGUuZ2V0RGVsdGEoKTsKLQkJdHJ5IHsKLQkJCWlmIChkZWx0YSAhPSBudWxsICYmIGZJc0luc3RhbGxlZCkgewotCQkJCVJlc291cmNlRGVsdGFWaXNpc3RvciB2aXNpdG9yID0gbmV3IFJlc291cmNlRGVsdGFWaXNpc3RvcigpOwotCQkJCWRlbHRhLmFjY2VwdCh2aXNpdG9yKTsKLQkJCQlSdW5uYWJsZSBydW5uYWJsZSA9IHZpc2l0b3IuZ2V0UnVubmFibGUoKTsKLQkJCQlpZihydW5uYWJsZSAhPSBudWxsKSB7Ci0JCQkJCXVwZGF0ZShydW5uYWJsZSk7Ci0JCQkJfQotCQkJfSAKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiB4KSB7Ci0JCQloYW5kbGVDb3JlRXhjZXB0aW9uKHgsICJFcnJvciBoYW5kbGluZyByZXNvdXJjZSBjaGFuZ2UgZXZlbnQuIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKgotCSAqIERlZmluZXMgdGhlIHN0YW5kYXJkIHByb2NlZHVyZSB0byBoYW5kbGUgPGNvZGU+Q29yZUV4Y2VwdGlvbnM8L2NvZGU+LiBFeGNlcHRpb25zCi0JICogYXJlIHdyaXR0ZW4gdG8gdGhlIHBsdWctaW4gbG9nLgotCSAqCi0JICogQHBhcmFtIGV4Y2VwdGlvbiB0aGUgZXhjZXB0aW9uIHRvIGJlIGxvZ2dlZAotCSAqIEBwYXJhbSBtZXNzYWdlIHRoZSBtZXNzYWdlIHRvIGJlIGxvZ2dlZAotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGhhbmRsZUNvcmVFeGNlcHRpb24oQ29yZUV4Y2VwdGlvbiBleGNlcHRpb24sIFN0cmluZyBtZXNzYWdlKSB7Ci0KLQkJQnVuZGxlIGJ1bmRsZSA9IFBsYXRmb3JtLmdldEJ1bmRsZShQZXJzaXN0ZW5jZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SWQoKSk7Ci0JCUlMb2cgbG9nPSBQbGF0Zm9ybS5nZXRMb2coYnVuZGxlKTsKLQotCQlpZiAobWVzc2FnZSAhPSBudWxsKQotCQkJbG9nLmxvZyhuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFBlcnNpc3RlbmNlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJZCgpLCAwLCBtZXNzYWdlLCBleGNlcHRpb24pKTsKLQkJZWxzZQotCQkJbG9nLmxvZyhleGNlcHRpb24uZ2V0U3RhdHVzKCkpOwotCX0KLQkKLQkvKioKLQkgKiBDb21wdXRlcyB0aGUgaW5pdGlhbCBtb2RpZmljYXRpb24gc3RhbXAgZm9yIHRoZSBnaXZlbiByZXNvdXJjZS4KLQkgKgotCSAqIEBwYXJhbSByZXNvdXJjZSB0aGUgcmVzb3VyY2UKLQkgKiBAcmV0dXJuIHRoZSBtb2RpZmljYXRpb24gc3RhbXAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGxvbmcgY29tcHV0ZU1vZGlmaWNhdGlvblN0YW1wKElSZXNvdXJjZSByZXNvdXJjZSkgewotCQlpZihyZXNvdXJjZSA9PSBudWxsKSB7Ci0JCQlTeXN0ZW0uZXJyLnByaW50bG4oIkZBVEFMIEVSUk9SOiByZXNvdXJjZSBpcyBudWxsLiIpOyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gMDsKLQkJfQotCQlsb25nIG1vZGlmaWNhdGlvblN0YW1wPSByZXNvdXJjZS5nZXRNb2RpZmljYXRpb25TdGFtcCgpOwotCi0JCUlQYXRoIHBhdGg9IHJlc291cmNlLmdldExvY2F0aW9uKCk7Ci0JCWlmIChwYXRoID09IG51bGwpCi0JCQlyZXR1cm4gbW9kaWZpY2F0aW9uU3RhbXA7Ci0KLQkJbW9kaWZpY2F0aW9uU3RhbXA9IHBhdGgudG9GaWxlKCkubGFzdE1vZGlmaWVkKCk7Ci0JCXJldHVybiBtb2RpZmljYXRpb25TdGFtcDsKLQl9Ci0JCi0JcHJpdmF0ZSBjbGFzcyBSZXNvdXJjZURlbHRhVmlzaXN0b3IgaW1wbGVtZW50cyBJUmVzb3VyY2VEZWx0YVZpc2l0b3IgewotCQlwcml2YXRlIENvbGxlY3Rpb248SUZpbGU+IGNoYW5nZWRGaWxlcyA9IG5ldyBBcnJheUxpc3Q8SUZpbGU+KCk7Ci0JCXByaXZhdGUgTWFwPElGaWxlLCBJUGF0aD4gbW92ZWRGaWxlVG9OZXdQYXRoTWFwID0gbmV3IEhhc2hNYXA8SUZpbGUsIElQYXRoPigpOwotCQlwcml2YXRlIENvbGxlY3Rpb248SUZpbGU+IGRlbGV0ZWRGaWxlcyA9IG5ldyBBcnJheUxpc3Q8SUZpbGU+KCk7Ci0JCXByaXZhdGUgQ29sbGVjdGlvbjxJRmlsZT4gYWRkZWRGaWxlcyA9IG5ldyBBcnJheUxpc3Q8SUZpbGU+KCk7Ci0KLQkJLyoKLQkJICogQHNlZSBJUmVzb3VyY2VEZWx0YVZpc2l0b3IjdmlzaXQob3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlRGVsdGEpCi0JCSAqLwotCQlwdWJsaWMgYm9vbGVhbiB2aXNpdChJUmVzb3VyY2VEZWx0YSBkZWx0YSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkJaWYgKGRlbHRhID09IG51bGwpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJaWYgKChkZWx0YS5nZXRGbGFncygpICYgSVJlc291cmNlRGVsdGEuTUFSS0VSUykgIT0gSVJlc291cmNlRGVsdGEuTUFSS0VSUwotCQkJCQkmJiBkZWx0YS5nZXRSZXNvdXJjZSgpLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuRklMRSkgewotCQkJCXN3aXRjaCAoZGVsdGEuZ2V0S2luZCgpKSB7Ci0JCQkJY2FzZSBJUmVzb3VyY2VEZWx0YS5DSEFOR0VEOgotCQkJCQlGaWxlSW5mbyBpbmZvID0gKEZpbGVJbmZvKSBnZXRGaWxlSW5mbyhkZWx0YS5nZXRSZXNvdXJjZSgpKTsKLQkJCQkJaWYgKGluZm8gPT0gbnVsbCB8fCBpbmZvLmZDYW5CZVNhdmVkKQotCQkJCQkJYnJlYWs7Ci0JCQkJCUlGaWxlIGZpbGUgPSAoSUZpbGUpIGRlbHRhLmdldFJlc291cmNlKCk7Ci0JCQkJCWJvb2xlYW4gaXNTeW5jaHJvbml6ZWQgPSBjb21wdXRlTW9kaWZpY2F0aW9uU3RhbXAoZmlsZSkgPT0gaW5mby5mTW9kaWZpY2F0aW9uU3RhbXA7Ci0JCQkJCWlmICgoKElSZXNvdXJjZURlbHRhLkVOQ09ESU5HICYgZGVsdGEuZ2V0RmxhZ3MoKSkgIT0gMCAmJiBpc1N5bmNocm9uaXplZCkKLQkJCQkJCQl8fCAoKElSZXNvdXJjZURlbHRhLkNPTlRFTlQgJiBkZWx0YS5nZXRGbGFncygpKSAhPSAwICYmICFpc1N5bmNocm9uaXplZCkpIHsKLQkJCQkJCWNoYW5nZWRGaWxlcy5hZGQoZmlsZSk7Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0KLQkJCQljYXNlIElSZXNvdXJjZURlbHRhLlJFTU9WRUQ6Ci0JCQkJCWlmICgoSVJlc291cmNlRGVsdGEuTU9WRURfVE8gJiBkZWx0YS5nZXRGbGFncygpKSAhPSAwKSB7Ci0JCQkJCQlpbmZvID0gKEZpbGVJbmZvKSBnZXRGaWxlSW5mbyhkZWx0YS5nZXRSZXNvdXJjZSgpKTsKLQkJCQkJCWlmIChpbmZvID09IG51bGwpCi0JCQkJCQkJYnJlYWs7Ci0JCQkJCQlmaW5hbCBJUGF0aCBwYXRoID0gZGVsdGEuZ2V0TW92ZWRUb1BhdGgoKTsKLQkJCQkJCW1vdmVkRmlsZVRvTmV3UGF0aE1hcC5wdXQoKElGaWxlKSBkZWx0YS5nZXRSZXNvdXJjZSgpLAotCQkJCQkJCQlwYXRoKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCWluZm8gPSAoRmlsZUluZm8pIGdldEZpbGVJbmZvKGRlbHRhLmdldFJlc291cmNlKCkpOwotCQkJCQkJaWYgKGluZm8gIT0gbnVsbCAmJiAhaW5mby5mQ2FuQmVTYXZlZCkgewotCQkJCQkJCWRlbGV0ZWRGaWxlcy5hZGQoKElGaWxlKSBkZWx0YS5nZXRSZXNvdXJjZSgpKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQljYXNlIElSZXNvdXJjZURlbHRhLkFEREVEOgotCQkJCQlmaWxlID0gKElGaWxlKSBkZWx0YS5nZXRSZXNvdXJjZSgpOwotCQkJCQlpZihhY2NlcHQoZmlsZSkpIHsKLQkJCQkJCWFkZGVkRmlsZXMuYWRkKGZpbGUpOwotCQkJCQl9Ci0KLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQkKLQkJcHVibGljIFJ1bm5hYmxlIGdldFJ1bm5hYmxlKCkgewotCQkJLy8gY29uc2lkZXIgdGhlIGZpbGUgaXMgbmV3bHkgYWRkZWQgaWYgaXQgaXMgYWNjZXB0ZWQgYW5kIG5vdCBhIG1vdmVkIGZpbGUKLQkJCS8vCi0JCQlpZiAoIWFkZGVkRmlsZXMuaXNFbXB0eSgpICYmICFtb3ZlZEZpbGVUb05ld1BhdGhNYXAuaXNFbXB0eSgpKSB7Ci0JCQkJZm9yIChJdGVyYXRvcjxJRmlsZT4gaXRlciA9IGFkZGVkRmlsZXMuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJSUZpbGUgZmlsZSA9IGl0ZXIubmV4dCgpOwotCQkJCQlpZiAobW92ZWRGaWxlVG9OZXdQYXRoTWFwLmNvbnRhaW5zVmFsdWUoZmlsZSkpIHsKLQkJCQkJCWl0ZXIucmVtb3ZlKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlpZihjaGFuZ2VkRmlsZXMuaXNFbXB0eSgpICYmIG1vdmVkRmlsZVRvTmV3UGF0aE1hcC5pc0VtcHR5KCkgJiYgZGVsZXRlZEZpbGVzLmlzRW1wdHkoKSAmJiBhZGRlZEZpbGVzLmlzRW1wdHkoKSkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQkJCi0JCQlyZXR1cm4gbmV3IFJ1bm5hYmxlKCkgewotCi0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQloYW5kbGVDaGFuZ2VkKFJlc291cmNlRGVsdGFWaXNpc3Rvci50aGlzKTsKLQkJCQl9Ci0JCQkJCi0JCQl9OwotCQl9Ci0JfQotCi0JLyoqCi0JICogUG9zdHMgdGhlIHVwZGF0ZSBjb2RlICJiZWhpbmQiIHRoZSBydW5uaW5nIG9wZXJhdGlvbi4KLQkgKgotCSAqIEBwYXJhbSBydW5uYWJsZSB0aGUgdXBkYXRlIGNvZGUKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGUoUnVubmFibGUgcnVubmFibGUpIHsKLQkJcnVubmFibGUucnVuKCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIG1vbml0b3IoSUZpbGUgZmlsZSkgewotCQlGaWxlSW5mbyBpbmZvPSAoRmlsZUluZm8pIGZGaWxlSW5mb01hcC5nZXQoZmlsZSk7Ci0JCWlmIChpbmZvID09IG51bGwpIHsKLQkJCWluZm8gPSBuZXcgRmlsZUluZm8oZmlsZSk7Ci0JCQlpbmZvLmZNb2RpZmljYXRpb25TdGFtcCA9IGNvbXB1dGVNb2RpZmljYXRpb25TdGFtcChmaWxlKTsKLQkJCWZGaWxlSW5mb01hcC5wdXQoZmlsZSwgaW5mbyk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgdW5tb25pdG9yKElGaWxlIGZpbGUpIHsKLQkJZkZpbGVJbmZvTWFwLnJlbW92ZShmaWxlKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdW5tb25pdG9yQWxsKCkgewotCQlmRmlsZUluZm9NYXAuY2xlYXIoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlQ2hhbmdlZChSZXNvdXJjZURlbHRhVmlzaXN0b3IgdmlzaXRvcikgewotCQlpZighdmlzaXRvci5jaGFuZ2VkRmlsZXMuaXNFbXB0eSgpKSB7Ci0JCQloYW5kbGVDaGFuZ2VkRmlsZXModmlzaXRvci5jaGFuZ2VkRmlsZXMpOwotCQl9Ci0JCWlmKCF2aXNpdG9yLm1vdmVkRmlsZVRvTmV3UGF0aE1hcC5pc0VtcHR5KCkpIHsKLQkJCWhhbmRsZU1vdmVkRmlsZXModmlzaXRvci5tb3ZlZEZpbGVUb05ld1BhdGhNYXApOwotCQl9Ci0JCWlmKCF2aXNpdG9yLmRlbGV0ZWRGaWxlcy5pc0VtcHR5KCkpIHsKLQkJCWhhbmRsZURlbGV0ZWRGaWxlcyh2aXNpdG9yLmRlbGV0ZWRGaWxlcyk7Ci0JCX0KLQkJaWYoIXZpc2l0b3IuYWRkZWRGaWxlcy5pc0VtcHR5KCkpIHsKLQkJCWhhbmRsZUFkZGVkRmlsZXModmlzaXRvci5hZGRlZEZpbGVzKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBDb2xsZWN0aW9uPElGaWxlPiBoYW5kbGVEZWxldGVkRmlsZXMoQ29sbGVjdGlvbjxJRmlsZT4gZGVsZXRlZEZpbGVzKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29sbGVjdGlvbjxJRmlsZT4gaGFuZGxlTW92ZWRGaWxlcyhNYXA8SUZpbGUsIElQYXRoPiBtb3ZlZEZpbGVUb05ld1BhdGhNYXApIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOwotCX0KLQotCXByb3RlY3RlZCBDb2xsZWN0aW9uPElGaWxlPiBoYW5kbGVDaGFuZ2VkRmlsZXMoQ29sbGVjdGlvbjxJRmlsZT4gY2hhbmdlZEZpbGVzKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIENvbGxlY3Rpb248SUZpbGU+IGhhbmRsZUFkZGVkRmlsZXMoQ29sbGVjdGlvbjxJRmlsZT4gYWRkZWRGaWxlcykgewotCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7Ci0JfQotfQotCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL0RlbGVnYXRlRmlsZU1hbmFnZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvRGVsZWdhdGVGaWxlTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1N2FiYmQyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvRGVsZWdhdGVGaWxlTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzLklGaWxlTWFuYWdlcjsKLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZSAtIE9jdCAxMCwgMjAwNgotICogQHNpbmNlICAxLjAKLSAqLwotcHVibGljIGNsYXNzIERlbGVnYXRlRmlsZU1hbmFnZXIgaW1wbGVtZW50cyBJRmlsZU1hbmFnZXIgewotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLklGaWxlTWFuYWdlciNjaGVja01vZGlmeShqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBJU3RhdHVzIGNoZWNrTW9kaWZ5KFN0cmluZyBwYXRoLCBPYmplY3QgY29udGV4dCkgewotCQlyZXR1cm4gRmlsZU1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5jaGVja01vZGlmeShwYXRoLCBjb250ZXh0KTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuSUZpbGVNYW5hZ2VyI2NoZWNrTW9kaWZ5KGphdmEubGFuZy5TdHJpbmdbXSwgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgSVN0YXR1cyBjaGVja01vZGlmeShTdHJpbmdbXSBwYXRocywgT2JqZWN0IGNvbnRleHQpIHsKLQkJcmV0dXJuIEZpbGVNYW5hZ2VyLmdldEluc3RhbmNlKCkuY2hlY2tNb2RpZnkocGF0aHMsIGNvbnRleHQpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5JRmlsZU1hbmFnZXIjZGVsZXRlKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIGJvb2xlYW4gZGVsZXRlKFN0cmluZyBwYXRoKSB7Ci0JCXJldHVybiBGaWxlTWFuYWdlci5nZXRJbnN0YW5jZSgpLmRlbGV0ZShwYXRoKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuSUZpbGVNYW5hZ2VyI21vdmUoamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBtb3ZlKFN0cmluZyBvbGRQYXRoLCBTdHJpbmcgbmV3UGF0aCkgewotCQlyZXR1cm4gRmlsZU1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5tb3ZlKG9sZFBhdGgsIG5ld1BhdGgpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5JRmlsZU1hbmFnZXIjcmVuYW1lKGphdmEuaW8uRmlsZSwgamF2YS5pby5GaWxlKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHJlbmFtZShGaWxlIG9sZEZpbGUsIEZpbGUgbmV3RmlsZSkgewotCQlyZXR1cm4gRmlsZU1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5yZW5hbWUob2xkRmlsZSwgbmV3RmlsZSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL0V4dGVuZGVkUmVzb3VyY2VTZXQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvRXh0ZW5kZWRSZXNvdXJjZVNldC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OTc2MWM3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvRXh0ZW5kZWRSZXNvdXJjZVNldC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotLyoqCi0gKiBBIGV4dGVuZGVkIHJlc291cmNlIHNldCB3aG9zZSBvYmplY3RzIGNhbiByZWZlcmVuY2VzIG9iamVjdHMgb2Ygb3RoZXIgcmVzb3VyY2Ugc2V0Ci0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlIC0gQXVnIDksIDIwMDYKLSAqIEBzaW5jZSAgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBFeHRlbmRlZFJlc291cmNlU2V0IGV4dGVuZHMgTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBVUklfVFlQRV9VTktOT1dOID0gMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBVUklfVFlQRV9MT0NBTCA9IDE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVVJJX1RZUEVfRVhURVJOQUwgPSAyOwotCQotCXByb3RlY3RlZCBNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwgcmVmZXJlbmNlZFJlc291cmNlU2V0OwotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiB7QGxpbmsgRXh0ZW5kZWRSZXNvdXJjZVNldH0gdGhhdCBjYW4gaGF2ZSByZWZlcmVuY2UgdG8gb2JqZWN0cyBpbiB0aGUgZ2l2ZW4gcmVzb3VyY2Ugc2V0IAotCSAqLwotCXB1YmxpYyBFeHRlbmRlZFJlc291cmNlU2V0KE11bHRpRmlsZVJlc291cmNlU2V0SW1wbCByZWZlcmVuY2VkUmVzb3VyY2VTZXQpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5yZWZlcmVuY2VkUmVzb3VyY2VTZXQgPSByZWZlcmVuY2VkUmVzb3VyY2VTZXQ7Ci0JfQotCQotCS8qKgotCSAqIEdldHMgdGhlIHR5cGUgb2YgdGhlIGdpdmVuIFVSSS4KLQkgKiAKLQkgKiBAcGFyYW0gdXJpCi0JICogQHJldHVybiBvbmUgb2YgVVJJIHR5cGUgY29uc3RhbnRzOiB7QGxpbmsgI1VSSV9UWVBFX0VYVEVSTkFMfSwge0BsaW5rICNVUklfVFlQRV9MT0NBTH0sIHtAbGluayAjVVJJX1RZUEVfVU5LTk9XTn0KLQkgKi8KLQlwcm90ZWN0ZWQgaW50IGdldFVSSVR5cGUoVVJJIHVyaSkgewotCQlyZXR1cm4gVVJJX1RZUEVfVU5LTk9XTjsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLk11bHRpRmlsZVJlc291cmNlU2V0SW1wbCNnZXRFT2JqZWN0KG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0LCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJLCBib29sZWFuKQotCSAqLwotCXB1YmxpYyBFT2JqZWN0IGdldEVPYmplY3QoRU9iamVjdCByZXNvbHZlciwgVVJJIHVyaSwgYm9vbGVhbiBsb2FkT25EZW1hbmQpIHsKLQkJRU9iamVjdCBvYmplY3QgPSBudWxsOwotCQlVbm5vcm1hbGl6ZWRVUklFeGNlcHRpb24gZXggPSBudWxsOwotCQlpbnQgdXJpVHlwZSA9IGdldFVSSVR5cGUodXJpKTsKLQkJaWYodXJpVHlwZSA9PSBVUklfVFlQRV9VTktOT1dOIHx8IHVyaVR5cGUgPT0gVVJJX1RZUEVfTE9DQUwpIHsKLQkJCXRyeSB7Ci0JCQkJb2JqZWN0ID0gc3VwZXIuZ2V0RU9iamVjdChyZXNvbHZlciwgdXJpLCBsb2FkT25EZW1hbmQpOwotCQkJfSBjYXRjaCAoVW5ub3JtYWxpemVkVVJJRXhjZXB0aW9uIGUpIHsKLQkJCQlleCA9IGU7Ci0JCQl9Ci0JCQlpZihvYmplY3QgIT0gbnVsbCkgewotCQkJCXJldHVybiBvYmplY3Q7Ci0JCQl9Ci0JCX0KLQkJaWYodXJpVHlwZSA9PSBVUklfVFlQRV9VTktOT1dOIHx8IHVyaVR5cGUgPT0gVVJJX1RZUEVfRVhURVJOQUwpIHsKLQkJCXRyeSB7Ci0JCQkJb2JqZWN0ID0gcmVmZXJlbmNlZFJlc291cmNlU2V0LmdldEVPYmplY3QocmVzb2x2ZXIsIHVyaSwKLQkJCQkJCWxvYWRPbkRlbWFuZCk7Ci0JCQl9IGNhdGNoIChVbm5vcm1hbGl6ZWRVUklFeGNlcHRpb24gZSkgewotCQkJCWV4ID0gZTsKLQkJCX0KLQkJfSAKLQkJCi0JCWlmKGV4ICE9IG51bGwpIHsKLQkJCXRocm93IGV4OwotCQl9Ci0JCXJldHVybiBvYmplY3Q7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS9GYWlsU2FmZVBlcnNpc3RlbmNlSGVscGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL0ZhaWxTYWZlUGVyc2lzdGVuY2VIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmJlMjVjNS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL0ZhaWxTYWZlUGVyc2lzdGVuY2VIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2U7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLkNvbW1vblBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuVVJJQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuRmlsZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLnV0aWwuUGVyc2lzdGVuY2VSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICoKLSAqIEBzaW5jZSAxLjIKLSAqLwotcHVibGljIGNsYXNzIEZhaWxTYWZlUGVyc2lzdGVuY2VIZWxwZXIgewotCXByaXZhdGUgVVJJIGZpbmFsVVJJOwotCXByaXZhdGUgVVJJIG9sZFVSSTsKLQlwcml2YXRlIFN0cmluZyBjdXJyZW50VHhJRDsKLQlwcml2YXRlIFJlc291cmNlIHJlc291cmNlOwotCXByaXZhdGUgVVJJIHRlbXBVUkk7Ci0JcHJpdmF0ZSBTdHJpbmcgaWQ7Ci0JcHJpdmF0ZSBTdHJpbmcgYmFja3VwRmlsZTsKLQlwcml2YXRlIFVSSUNvbnZlcnRlciBjb252ZXJ0ZXI7Ci0JcHJpdmF0ZSBib29sZWFuIGNvbW1pdEVtcHR5UmVzb3VyY2U7Ci0JCi0JcHVibGljIEZhaWxTYWZlUGVyc2lzdGVuY2VIZWxwZXIoUmVzb3VyY2UgcmVzb3VyY2UsIFN0cmluZyBpZCkgewotCQl0aGlzLnJlc291cmNlID0gcmVzb3VyY2U7IAotCQl0aGlzLmlkID0gaWQ7Ci0JCXRoaXMuY29udmVydGVyID0gcmVzb3VyY2UuZ2V0UmVzb3VyY2VTZXQoKSAhPSBudWxsID8gcmVzb3VyY2UuZ2V0UmVzb3VyY2VTZXQoKS5nZXRVUklDb252ZXJ0ZXIoKSA6IG51bGw7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldENvbW1pdEVtcHR5UmVzb3VyY2UoYm9vbGVhbiBjb21taXRFbXB0eVJlc291cmNlKSB7Ci0JCXRoaXMuY29tbWl0RW1wdHlSZXNvdXJjZSA9IGNvbW1pdEVtcHR5UmVzb3VyY2U7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdGVtcG9yYXJ5IFVSSSB0byBzYXZlIHRoaXMgcmVzb3VyY2UgdG8gYW5kIGl0IHdpbGwgYmUgcmVuYW1lZCB0bwotCSAqIHRoZSBvcmlnaW5hbCBVUkkgd2hlbiBzYXZpbmcgaXMgZG9uZQotCSAqLwotCXB1YmxpYyBVUkkgc2V0VGVtcFVSSShTdHJpbmcgdHhJRCkgewotCQlpZiAoZmluYWxVUkkgPT0gbnVsbCkgewotCQkJZmluYWxVUkkgPSBvbGRVUkkgPSByZXNvdXJjZS5nZXRVUkkoKTsKLQkJCWN1cnJlbnRUeElEID0gdHhJRDsKLQotCQkJdGVtcFVSSSA9IGNyZWF0ZVRlbXBVUkkoKTsKLQkJCXJlc291cmNlLnNldFVSSSh0ZW1wVVJJKTsKLQkJfQotCQlyZXR1cm4gdGVtcFVSSTsKLQl9Ci0JCi0JcHJpdmF0ZSBVUkkgY3JlYXRlVGVtcFVSSSgpIHsKLQkJcmV0dXJuIFVSSS5jcmVhdGVGaWxlVVJJKG5ldyBTdHJpbmdCdWZmZXIoTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsLmdldFRlbXBEaXIoKSkuYXBwZW5kKAotCQkJCUZpbGUuc2VwYXJhdG9yKS5hcHBlbmQoY3VycmVudFR4SUQpCi0JCQkJLmFwcGVuZCgibmV3IikuYXBwZW5kKGlkKS50b1N0cmluZygpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldEJhY2t1cEZpbGVQYXRoKCkgewotCQlTdHJpbmcgYmFja3VwRmlsZSA9IG5ldyBTdHJpbmdCdWZmZXIoTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsLmdldFRlbXBEaXIoKSkKLQkJCQkuYXBwZW5kKEZpbGUuc2VwYXJhdG9yKQotCQkJCS5hcHBlbmQoY3VycmVudFR4SUQpCi0JCQkJLmFwcGVuZCgib2xkIikuYXBwZW5kKGlkKS50b1N0cmluZygpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBiYWNrdXBGaWxlOwotCX0KLQkKLQlwcml2YXRlIFN0cmluZyB0b0ZpbGVTdHJpbmcoVVJJIHVyaSkgewotCQlyZXR1cm4gRmlsZU1hbmFnZXIudG9GaWxlU3RyaW5nKHVyaSwgY29udmVydGVyKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgY29tbWl0KCkgewotCQlpZiAoZmluYWxVUkkgIT0gbnVsbCAmJiAoY29tbWl0RW1wdHlSZXNvdXJjZSB8fCAhcmVzb3VyY2UuZ2V0Q29udGVudHMoKS5pc0VtcHR5KCkpKSB7Ci0JCQlGaWxlIGZpbmFsRmlsZSA9IG5ldyBGaWxlKHRvRmlsZVN0cmluZyhmaW5hbFVSSSkpOwotCQkJYm9vbGVhbiB3YXNNb3ZlID0gIW9sZFVSSS5lcXVhbHMoZmluYWxVUkkpOwotCQkJaWYgKHdhc01vdmUpIHsKLQkJCX0gZWxzZSB7Ci0JCQkJLy8gYmFjayB1cCB0aGUgZmlsZQotCQkJCS8vCi0JCQkJU3RyaW5nIGJhY2t1cCA9IGdldEJhY2t1cEZpbGVQYXRoKCk7Ci0JCQkJRmlsZSBiYWtGaWxlID0gbmV3IEZpbGUoYmFja3VwKTsKLQotCQkJCS8vIHRyeWluZyB0byBkZWxldGUgdGhlIG9sZCBiYWNrdXAgZmlsZSBpZiBpdCBleGlzdHMKLQkJCQkvLwotCQkJCWlmIChiYWtGaWxlLmV4aXN0cygpKSB7Ci0JCQkJCWJha0ZpbGUuZGVsZXRlKCk7Ci0JCQkJfQotCi0JCQkJaWYgKGZpbmFsRmlsZS5leGlzdHMoKSkgewotCQkJCQkvLyBzb21lIENNIHByb3ZpZGVyIGxpa2UgQ2xlYXJDYXNlIHJlbmFtZWQgdGhlIHZlcnNpb25lZAotCQkJCQkvLyBmaWxlIGl0IGl0cyByZXBvc2l0b3J5IGFzIHNvb24gYXMgdXNlciByZW5hbWVkIHRoZSBmaWxlCi0JCQkJCS8vIGluIHRoZSB3b3Jrc3BhY2UuIFRvIGF2b2lkIHRoaXMsIHVzZSBvbmx5IHJlZ3VsYXIgcmVuYW1lCi0JCQkJCS8vIHJvdXRpbmUgb2YgamF2YS5pby5GaWxlIGluc3RlYWQgb2YgSVJlc291cmNlIHJvdXRpbmUKLQkJCQkJLy8KLQkJCQkJaWYgKEZpbGVVdGlsLm1vdmVGaWxlKGZpbmFsRmlsZSwgYmFrRmlsZSkpIHsKLQkJCQkJCWJhY2t1cEZpbGUgPSBiYWNrdXA7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlTdHJpbmcgbXNnID0gTkxTLmJpbmQoCi0JCQkJCQkJCVBlcnNpc3RlbmNlUmVzb3VyY2VzLnJlbmFtZUVycm9yX21zZywKLQkJCQkJCQkJZmluYWxGaWxlLCBiYWNrdXApOwotCQkJCQkJdGhyb3cgbmV3IE11bHRpRmlsZUlPRXhjZXB0aW9uKG1zZyk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCS8vIHJlbmFtZSB0aGUgcmVzb3VyY2UgZmlsZSB0byB0aGUgb3JpZ2luYWwgbmFtZQotCQkJLy8KLQkJCUZpbGUgY3VycmVudEZpbGUgPSBuZXcgRmlsZSh3YXNNb3ZlID8gdG9GaWxlU3RyaW5nKG9sZFVSSSkKLQkJCQkJOiB0b0ZpbGVTdHJpbmcocmVzb3VyY2UuZ2V0VVJJKCkpKTsKLQkJCWJvb2xlYW4gc3VjY2VzcyA9IGZhbHNlOwotCQkJaWYgKHdhc01vdmUpIHsKLQkJCQlzdWNjZXNzID0gTXVsdGlGaWxlU2F2ZVV0aWwubW92ZShyZXNvdXJjZSwgY3VycmVudEZpbGUsIGZpbmFsRmlsZSk7Ci0JCQl9IGVsc2UgewotCQkJCS8vIHNvbWUgQ00gcHJvdmlkZXIgbGlrZSBDbGVhckNhc2UgcmVuYW1lZCB0aGUgdmVyc2lvbmVkIGZpbGUgaXQKLQkJCQkvLyBpdHMgcmVwb3NpdG9yeSBhcyBzb29uIGFzIHVzZXIgcmVuYW1lZCB0aGUgZmlsZQotCQkJCS8vIGluIHRoZSB3b3Jrc3BhY2UuIFRvIGF2b2lkIHRoaXMsIHVzZSBvbmx5IHJlZ3VsYXIgcmVuYW1lCi0JCQkJLy8gcm91dGluZSBvZiBqYXZhLmlvLkZpbGUgaW5zdGVhZCBvZiBJUmVzb3VyY2Ugcm91dGluZQotCQkJCS8vCi0JCQkJc3VjY2VzcyA9IEZpbGVVdGlsLm1vdmVGaWxlKGN1cnJlbnRGaWxlLCBmaW5hbEZpbGUpOwotCQkJfQotCQkJaWYgKCFzdWNjZXNzKSB7Ci0JCQkJU3RyaW5nIG1zZyA9IE5MUy5iaW5kKFBlcnNpc3RlbmNlUmVzb3VyY2VzLnJlbmFtZUVycm9yX21zZywKLQkJCQkJCWN1cnJlbnRGaWxlLCBmaW5hbEZpbGUpOwotCQkJCXRocm93IG5ldyBNdWx0aUZpbGVJT0V4Y2VwdGlvbihtc2cpOwotCQkJfSBlbHNlIHsKLQkJCQlpZiAod2FzTW92ZSkgewotCQkJCQlkaWRNb3ZlKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogU3ViY2xhc3MgdG8gb3ZlcnJpZGUgdG8gaGFuZGxlIHBvc3QgbW92ZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRpZE1vdmUoKSB7Ci0JfQotCi0JcHVibGljIHZvaWQgZGVsZXRlQmFja3VwKCkgewotCQlpZiAoYmFja3VwRmlsZSAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCS8vIEZpbGVNYW5hZ2VyLmdldEluc3RhbmNlKCkuZGVsZXRlKGJhY2t1cEZpbGUpOwotCQkJCW5ldyBGaWxlKGJhY2t1cEZpbGUpLmRlbGV0ZSgpOwotCQkJCWJhY2t1cEZpbGUgPSBudWxsOwotCQkJfSBjYXRjaCAoVGhyb3dhYmxlIGUpIHsKLQkJCQlDb21tb25QbHVnaW4uSU5TVEFOQ0UubG9nKGUpOwotCQkJCWlmIChNdWx0aUZpbGVTYXZlVXRpbC5ERUJVRykgewotCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBoYXNUZW1wVVJJKCkgewotCQlpZiAoY3VycmVudFR4SUQgIT0gbnVsbCkgewotCQkJcmV0dXJuIGNyZWF0ZVRlbXBVUkkoKS5lcXVhbHMocmVzb3VyY2UuZ2V0VVJJKCkpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgVVJJIGdldEZpbmFsVVJJKCkgewotCQlpZiAoZmluYWxVUkkgIT0gbnVsbCkgewotCQkJcmV0dXJuIGZpbmFsVVJJOwotCQl9Ci0JCXJldHVybiByZXNvdXJjZS5nZXRVUkkoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiByZXN0b3JlKCkgewotCQlGaWxlIHNyYyA9IG51bGwsIGRlc3QgPSBudWxsOwotCQlib29sZWFuIG1vdmVkID0gZmFsc2U7Ci0JCWlmIChiYWNrdXBGaWxlICE9IG51bGwpIHsKLQkJCXNyYyA9IG5ldyBGaWxlKGJhY2t1cEZpbGUpOwotCQkJZGVzdCA9IG5ldyBGaWxlKHRvRmlsZVN0cmluZyhnZXRGaW5hbFVSSSgpKSk7Ci0JCX0gZWxzZSB7Ci0JCQltb3ZlZCA9IG9sZFVSSSAhPSBudWxsICYmICFvbGRVUkkuZXF1YWxzKGZpbmFsVVJJKTsKLQkJCWlmIChtb3ZlZCkgewotCQkJCUZpbGUgZmlsZSA9IG5ldyBGaWxlKHRvRmlsZVN0cmluZyhnZXRGaW5hbFVSSSgpKSk7Ci0JCQkJZGVzdCA9IG5ldyBGaWxlKHRvRmlsZVN0cmluZyhvbGRVUkkpKTsKLQkJCQltb3ZlZCA9IGZpbGUuZXhpc3RzKCkgJiYgIWRlc3QuZXhpc3RzKCk7Ci0JCQkJaWYgKG1vdmVkKSB7Ci0JCQkJCXNyYyA9IGZpbGU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmIChzcmMgIT0gbnVsbCkgewotCQkJaWYgKGRlc3QuZXhpc3RzKCkpIHsKLQkJCQlGaWxlVXRpbC5tb3ZlRmlsZShkZXN0LG5ldyBGaWxlKHRvRmlsZVN0cmluZyhyZXNvdXJjZS5nZXRVUkkoKSkpKTsKLQkJCX0KLQkJCWJvb2xlYW4gc3VjY2VzczsKLQkJCWlmIChtb3ZlZCkgewotCQkJCXN1Y2Nlc3MgPSBNdWx0aUZpbGVTYXZlVXRpbC5tb3ZlKHJlc291cmNlLCBzcmMsIGRlc3QpOwotCQkJCS8vIGlmKHN1Y2Nlc3MpIHsKLQkJCQkvLyBNdWx0aUZpbGVTYXZlVXRpbC51cGRhdGVVUklNYXBwaW5ncyh0aGlzLCBudWxsKTsKLQkJCQkvLyB9Ci0JCQl9IGVsc2UgewotCQkJCXN1Y2Nlc3MgPSBGaWxlVXRpbC5tb3ZlRmlsZShzcmMsZGVzdCk7Ci0JCQl9Ci0JCQlpZiAoIXN1Y2Nlc3MpIHsKLQkJCQl0aHJvdyBuZXcgTXVsdGlGaWxlSU9FeGNlcHRpb24oTkxTLmJpbmQoCi0JCQkJCQlQZXJzaXN0ZW5jZVJlc291cmNlcy5yZXN0b3JlUmVzb3VyY2VFcnJvcl9tc2csIHRoaXMpKTsKLQkJCX0KLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0eEZpbmlzaGVkKGJvb2xlYW4gc3VjY2Vzc2Z1bCkgewotLy8JCWJvb2xlYW4gd2FzTW92ZSA9ICFvbGRVUkkuZXF1YWxzKGZpbmFsVVJJKTsKLQkJaWYgKHN1Y2Nlc3NmdWwpIHsKLQkJCXJlc291cmNlLnNldFVSSShmaW5hbFVSSSk7Ci0JCQlyZXNvdXJjZS5zZXRNb2RpZmllZChmYWxzZSk7Ci0vLwkJCXVwZGF0ZVRpbWVTdGFtcHMoKTsKLQkJCUZpbGVNYW5hZ2VyLmdldEluc3RhbmNlKCkucmVmcmVzaChyZXNvdXJjZSk7Ci0vLwkJCWlmKCF3YXNNb3ZlKSB7Ci0vLwkJCQlNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwgcmVzb3VyY2VTZXQgPSAoTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsKSBnZXRSZXNvdXJjZVNldCgpOwotLy8JCQkJaWYocmVzb3VyY2VTZXQgIT0gbnVsbCkgewotLy8JCQkJCXJlc291cmNlU2V0LmdldFVucmVzb2x2ZWRQcm94eU1hcmtlck1hbmFnZXIoKS52YWxpZGF0ZU1hcmtlcnModGhpcyk7Ci0vLwkJCQl9Ci0vLwkJCX0KLQkJfSBlbHNlIHsKLQkJCXJlc3RvcmVVUkkoKTsKLS8vCQkJaWYgKHdhc01vdmUpIHsKLS8vCQkJCS8vIHJlc3RvcmUgdXJpIG9mIFJlc291cmNlRGVzY3JpcHRvciBvZiB0aGlzIHJlc291cmNlCi0vLwkJCQkvLwotLy8JCQkJTXVsdGlGaWxlU2F2ZVV0aWwudXBkYXRlVVJJTWFwcGluZ3ModGhpcywgb2xkVVJJLCBudWxsLCB0cnVlKTsKLS8vCQkJfQotCQl9Ci0vLwkJaWYgKG9sZFVSSSAhPSBudWxsKSB7Ci0vLwkJCU11bHRpRmlsZVJlc291cmNlU2V0SW1wbCByZXNvdXJjZVNldCA9IChNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwpIGdldFJlc291cmNlU2V0KCk7Ci0vLwkJCWlmIChyZXNvdXJjZVNldCAhPSBudWxsKSB7Ci0vLwkJCQlyZXNvdXJjZVNldC5nZXRVUklUb1RlbXBVUklNYXAoKS5yZW1vdmUob2xkVVJJKTsKLS8vCQkJfQotLy8JCQlvbGRVUkkgPSBudWxsOwotLy8JCX0KLQkJY3VycmVudFR4SUQgPSBudWxsOwotCQlmaW5hbFVSSSA9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmVzdG9yZXMgdGhlIHJlc291cmNlIFVSSSB0byB0aGUgb3JpZ2luYWwgb25lLiBUaGlzIG1ldGhvZCBtdXN0IGJlIGNhbGwKLQkgKiBhZnRlciBzYXZpbmcgcmVnYXJsZXNzIG9mIGl0cyBzdWNjZXNzLgotCSAqIAotCSAqLwotCXByaXZhdGUgdm9pZCByZXN0b3JlVVJJKCkgewotCQlpZiAob2xkVVJJICE9IG51bGwpIHsKLQkJCXJlc291cmNlLnNldFVSSShvbGRVUkkpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL0ZpbGVNYW5hZ2VyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL0ZpbGVNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhMzRiN2EuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS9GaWxlTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZTsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnNlY3VyaXR5LkFjY2Vzc0NvbnRyb2xsZXI7Ci1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmludGVybmFsLnJlc291cmNlcy5SZXNvdXJjZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmludGVybmFsLnJlc291cmNlcy5SZXNvdXJjZVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmludGVybmFsLnV0aWxzLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTXVsdGlTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5Db21tb25QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlVSSUNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYud29ya3NwYWNlLnV0aWwuV29ya3NwYWNlU3luY2hyb25pemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS51dGlsLlBlcnNpc3RlbmNlUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy5JRmlsZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotaW1wb3J0IHN1bi5zZWN1cml0eS5hY3Rpb24uR2V0UHJvcGVydHlBY3Rpb247Ci0KLS8qKgotICogSW1wbGVtZW50YXRpb24gY2xhc3MgZm9yIElGaWxlTWFuYWdlci4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEZpbGVNYW5hZ2VyIGltcGxlbWVudHMgSUZpbGVNYW5hZ2VyIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9IEZpbGVNYW5hZ2VyLmNsYXNzLmdldFBhY2thZ2UoKQotCQkJLmdldE5hbWUoKTsKLQotCXByaXZhdGUgc3RhdGljIEZpbGVNYW5hZ2VyIGluc3RhbmNlID0gbnVsbDsKLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyB0bXBkaXI7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRUZW1wRGlyKCkgewotCQlpZiAodG1wZGlyID09IG51bGwpIHsKLQkJCUdldFByb3BlcnR5QWN0aW9uIGEgPSBuZXcgR2V0UHJvcGVydHlBY3Rpb24oImphdmEuaW8udG1wZGlyIik7IC8vJE5PTi1OTFMtMSQKLQkJCXRtcGRpciA9ICgoU3RyaW5nKSBBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZChhKSk7Ci0JCX0KLQkJcmV0dXJuIHRtcGRpcjsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gdmFsaWRhdGVFZGl0SW5pdGlhbGl6ZWQgPSBmYWxzZTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgRmlsZU1hbmFnZXIgZ2V0SW5zdGFuY2UoKSB7Ci0JCWlmIChpbnN0YW5jZSA9PSBudWxsKSB7Ci0JCQlzeW5jaHJvbml6ZWQgKEZpbGVNYW5hZ2VyLmNsYXNzKSB7Ci0JCQkJaWYgKGluc3RhbmNlID09IG51bGwpIHsKLQkJCQkJaW5zdGFuY2UgPSBuZXcgRmlsZU1hbmFnZXIoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotCi0JcHJvdGVjdGVkIEZpbGVNYW5hZ2VyKCkgewotCX0KLQotCXB1YmxpYyBzdGF0aWMgSVJlc291cmNlIGdldFJlc291cmNlRm9yTG9jYXRpb24oU3RyaW5nIGxvY2F0aW9uKSB7Ci0JCUZpbGUgZmlsZSA9IG5ldyBGaWxlKGxvY2F0aW9uKTsKLQkJaWYgKCFmaWxlLmV4aXN0cygpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlJV29ya3NwYWNlUm9vdCB3b3Jrc3BhY2VSb290ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKLQkJSVBhdGggcGF0aCA9IG5ldyBQYXRoKGxvY2F0aW9uKTsKLQkJSVJlc291cmNlIHJlc291cmNlOwotCQlpZiAoZmlsZS5pc0ZpbGUoKSkgewotCQkJcmVzb3VyY2UgPSB3b3Jrc3BhY2VSb290LmdldEZpbGVGb3JMb2NhdGlvbihwYXRoKTsKLQkJCWlmIChyZXNvdXJjZSA9PSBudWxsKSB7Ci0JCQkJSVJlc291cmNlIHBhcmVudFJlc291cmNlID0gZ2V0UmVzb3VyY2VGb3JMb2NhdGlvbihmaWxlCi0JCQkJCQkuZ2V0UGFyZW50KCkpOwotCQkJCWlmIChwYXJlbnRSZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlwYXJlbnRSZXNvdXJjZS5yZWZyZXNoTG9jYWwoSVJlc291cmNlLkRFUFRIX09ORSwgbnVsbCk7Ci0JCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotLy8JCQkJCQlDb21tb25QbHVnaW4uSU5TVEFOQ0UubG9nKGUpOwotCQkJCQl9Ci0JCQkJCXJlc291cmNlID0gd29ya3NwYWNlUm9vdC5nZXRGaWxlRm9yTG9jYXRpb24ocGF0aCk7Ci0JCQkJfQotCQkJfQotCQl9IGVsc2UgewotCQkJcmVzb3VyY2UgPSB3b3Jrc3BhY2VSb290LmdldENvbnRhaW5lckZvckxvY2F0aW9uKHBhdGgpOwotCQl9Ci0JCXJldHVybiByZXNvdXJjZTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gcmVmcmVzaChJUmVzb3VyY2UgcmVzb3VyY2UpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKCFyZXNvdXJjZS5leGlzdHMoKSkgewotCQkJQXJyYXlMaXN0IGZvbGRlcnNUb1JlZnJlc2ggPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlJQ29udGFpbmVyIGNvbnRhaW5lcjsKLQkJCWZvciAoY29udGFpbmVyID0gcmVzb3VyY2UuZ2V0UGFyZW50KCk7ICFjb250YWluZXIuZXhpc3RzKCk7IGNvbnRhaW5lciA9IGNvbnRhaW5lcgotCQkJCQkuZ2V0UGFyZW50KCkpIHsKLQkJCQlmb2xkZXJzVG9SZWZyZXNoLmFkZCgwLCBjb250YWluZXIpOwotCQkJfQotCQkJaWYgKGNvbnRhaW5lci5leGlzdHMoKSkgewotCQkJCWNvbnRhaW5lci5yZWZyZXNoTG9jYWwoSVJlc291cmNlLkRFUFRIX09ORSwgbnVsbCk7Ci0JCQl9Ci0JCQlpZiAoIWZvbGRlcnNUb1JlZnJlc2guaXNFbXB0eSgpKSB7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gZm9sZGVyc1RvUmVmcmVzaC5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQlJRm9sZGVyIGZvbGRlciA9IChJRm9sZGVyKSBpdGVyLm5leHQoKTsKLQkJCQkJaWYgKGZvbGRlci5leGlzdHMoKSkgewotCQkJCQkJZm9sZGVyLnJlZnJlc2hMb2NhbChJUmVzb3VyY2UuREVQVEhfT05FLCBudWxsKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXNvdXJjZS5yZWZyZXNoTG9jYWwoSVJlc291cmNlLkRFUFRIX09ORSwgbnVsbCk7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIFJlZnJlc2hlcyBmaWxlIG9yIGRpcmVjdG9yeSB3aXRoIGdpdmVuIGxvY2FsIGZpbGUgc3lzdGVtCi0JICogPGNvZGU+cGF0aDwvY29kZT4KLQkgKiAKLQkgKiBAcGFyYW0gcGF0aAotCSAqICAgICAgICAgICAgbG9jYWwgZmlsZSBzeXN0ZW0gcGF0aAotCSAqIEByZXR1cm4KLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIHJlZnJlc2goU3RyaW5nIHBhdGgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJSVJlc291cmNlIHJlc291cmNlID0gZ2V0UmVzb3VyY2VGb3JMb2NhdGlvbihwYXRoKTsKLQkJaWYgKHJlc291cmNlICE9IG51bGwpIHsKLQkJCXJldHVybiByZWZyZXNoKHJlc291cmNlKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gcmVmcmVzaChSZXNvdXJjZSByZXNvdXJjZSkgewotCQl0cnkgewotCQkJcmV0dXJuIHJlZnJlc2godG9GaWxlU3RyaW5nKHJlc291cmNlLmdldFVSSSgpKSk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotLy8JCQlDb21tb25QbHVnaW4uSU5TVEFOQ0UubG9nKGUpOwotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gbW92ZShTdHJpbmcgb2xkUGF0aCwgU3RyaW5nIG5ld1BhdGgpIHsKLQkJcmV0dXJuIG1vdmUob2xkUGF0aCwgbmV3UGF0aCwgZmFsc2UpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIG1vdmUoU3RyaW5nIG9sZFBhdGgsIFN0cmluZyBuZXdQYXRoLAotCQkJYm9vbGVhbiBmb3JjZVJlbW92ZVNvdXJjZSkgewotCQl0cnkgewotCQkJcmVmcmVzaChvbGRQYXRoKTsKLQotCQkJSVJlc291cmNlIHJlc291cmNlID0gbnVsbDsKLQkJCUlXb3Jrc3BhY2VSb290IHdvcmtzcGFjZVJvb3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkKLQkJCQkJLmdldFJvb3QoKTsKLQotCQkJLy8gY3JlYXRlIHRoZSBmb2xkZXJzIG9mIHRoZSBkZXN0aW5hdGlvbiBpZiB0aGV5IGRpZCBub3QgZXhpc3QKLQkJCUlQYXRoIGRlc3RQYXRoID0gbmV3IFBhdGgobmV3UGF0aCk7Ci0JCQlpZiAobmV3IEZpbGUob2xkUGF0aCkuaXNGaWxlKCkpIHsKLQkJCQlyZXNvdXJjZSA9IHdvcmtzcGFjZVJvb3QuZ2V0RmlsZUZvckxvY2F0aW9uKGRlc3RQYXRoKTsKLQkJCQlpZihyZXNvdXJjZSA9PSBudWxsKSB7Ci0JCQkJCXJlc291cmNlID0gd29ya3NwYWNlUm9vdC5nZXRDb250YWluZXJGb3JMb2NhdGlvbihkZXN0UGF0aCk7Ci0JCQkJfQotCQkJfSBlbHNlIHsJCQkJCi0JCQkJcmVzb3VyY2UgPSB3b3Jrc3BhY2VSb290LmdldENvbnRhaW5lckZvckxvY2F0aW9uKGRlc3RQYXRoKTsKLQkJCQlpZihyZXNvdXJjZSA9PSBudWxsKSB7Ci0JCQkJCXJlc291cmNlID0gd29ya3NwYWNlUm9vdC5nZXRGaWxlRm9yTG9jYXRpb24oZGVzdFBhdGgpOwotCQkJCX0KLQkJCX0JCi0JCQlpZihyZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQkJaWYgKHJlc291cmNlLmV4aXN0cygpKSB7Ci0JCQkJCXJlc291cmNlLnJlZnJlc2hMb2NhbChJUmVzb3VyY2UuREVQVEhfWkVSTywgbnVsbCk7Ci0JCQkJCWlmKHJlc291cmNlLmV4aXN0cygpKSB7Ci0JCQkJCQl0aHJvdyBuZXcgTXVsdGlGaWxlSU9FeGNlcHRpb24oTkxTLmJpbmQoCi0JCQkJCQkJCVBlcnNpc3RlbmNlUmVzb3VyY2VzLm1vdmVFcnJvcl9tc2csIG9sZFBhdGgsIG5ld1BhdGgpKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlBcnJheUxpc3QgZm9sZGVyc1RvQ3JlYXRlID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCUlDb250YWluZXIgY29udGFpbmVyOwotCQkJCWZvciAoY29udGFpbmVyID0gcmVzb3VyY2UuZ2V0UGFyZW50KCk7ICFjb250YWluZXIuZXhpc3RzKCk7IGNvbnRhaW5lciA9IGNvbnRhaW5lcgotCQkJCS5nZXRQYXJlbnQoKSkgewotCQkJCQlmb2xkZXJzVG9DcmVhdGUuYWRkKDAsIGNvbnRhaW5lcik7Ci0JCQkJfQotCQkJCWlmICghZm9sZGVyc1RvQ3JlYXRlLmlzRW1wdHkoKSkgewotCQkJCQljb250YWluZXIucmVmcmVzaExvY2FsKElSZXNvdXJjZS5ERVBUSF9PTkUsIG51bGwpOwotCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBmb2xkZXJzVG9DcmVhdGUuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlJRm9sZGVyIGZvbGRlciA9IChJRm9sZGVyKSBpdGVyLm5leHQoKTsKLQkJCQkJCWlmICghZm9sZGVyLmV4aXN0cygpKSB7Ci0JCQkJCQkJZm9sZGVyLmNyZWF0ZSh0cnVlLCB0cnVlLCBudWxsKTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJZm9sZGVyLnJlZnJlc2hMb2NhbChJUmVzb3VyY2UuREVQVEhfT05FLCBudWxsKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQlkZXN0UGF0aCA9IHJlc291cmNlLmdldEZ1bGxQYXRoKCk7Ci0JCQl9Ci0JCQllbHNlIGlmKFBsYXRmb3JtLmdldExvY2F0aW9uKCkuaXNQcmVmaXhPZihkZXN0UGF0aCkpIHsKLQkJCQlkZXN0UGF0aCA9IG5ldyBQYXRoKGRlc3RQYXRoLnRvT1NTdHJpbmcoKS5zdWJzdHJpbmcoUGxhdGZvcm0uZ2V0TG9jYXRpb24oKS50b09TU3RyaW5nKCkubGVuZ3RoKCkpKTsJCQkJCQkKLQkJCX0KLQkJCQotCQkJSVBhdGggcGF0aCA9IG5ldyBQYXRoKG9sZFBhdGgpOwotCQkJSUZpbGUgZmlsZSA9IHdvcmtzcGFjZVJvb3QuZ2V0RmlsZUZvckxvY2F0aW9uKHBhdGgpOwotCQkJaWYgKGZpbGUgIT0gbnVsbCAmJiBmaWxlLmV4aXN0cygpKSB7Ci0JCQkJcmVzb3VyY2UgPSBmaWxlOwotCQkJfSBlbHNlIHsKLQkJCQlyZXNvdXJjZSA9IHdvcmtzcGFjZVJvb3QuZ2V0Q29udGFpbmVyRm9yTG9jYXRpb24ocGF0aCk7Ci0JCQl9Ci0JCQlpZiAocmVzb3VyY2UgIT0gbnVsbCkgewotCQkJCXRyeSB7Ci0JCQkJCXJlc291cmNlLm1vdmUoZGVzdFBhdGgsIHRydWUsIG51bGwpOwotCQkJCX0gY2F0Y2ggKFJlc291cmNlRXhjZXB0aW9uIGUpIHsKLQkJCQkJUGVyc2lzdGVuY2VQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZygpLmxvZyhlLmdldFN0YXR1cygpKTsKLQkJCQkJCi0JCQkJCWlmIChmb3JjZVJlbW92ZVNvdXJjZSkgewotCQkJCQkJdGhyb3cgZTsKLQkJCQkJfQotCi0JCQkJCWJvb2xlYW4gZmFpbGVkID0gZmFsc2U7Ci0KLQkJCQkJLy8gaGFuZGxlIHNpdHVhdGlvbiB3aGVuIEVjbGlwc2UgbW92ZXMgZmlsZS9kaXJlY3RvcnkgYnkKLQkJCQkJLy8gY29weWluZyBpdCB0byBkZXN0aW5hdGlvbiB0aGVuIGRlbGV0aW5nIHRoZSBzb3VyY2UKLQkJCQkJLy8gYnV0IGRlbGV0aW9uIGZhaWxlZAotCQkJCQlJU3RhdHVzW10gc3RhdHVzZXMgPSBlLmdldFN0YXR1cygpLmdldENoaWxkcmVuKCk7Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc3RhdHVzZXMubGVuZ3RoOyBpKyspIHsKLQkJCQkJCUlTdGF0dXMgc3RhdHVzID0gc3RhdHVzZXNbaV07Ci0JCQkJCQlpZiAoc3RhdHVzLmdldENvZGUoKSA9PSBJUmVzb3VyY2VTdGF0dXMuRkFJTEVEX0RFTEVURV9MT0NBTAotCQkJCQkJCQkmJiBzdGF0dXMuZ2V0TWVzc2FnZSgpID09IE1lc3NhZ2VzLmxvY2Fsc3RvcmVfZGVsZXRlUHJvYmxlbSkgewotCQkJCQkJCVN0cmluZyBtc2cgPSBNZXNzYWdlRm9ybWF0Ci0JCQkJCQkJCQkuZm9ybWF0KAotCQkJCQkJCQkJCQkiV2FybmluZyB3aGlsZSBtb3ZpbmcgJyd7MH0nJyB0byAnJ3sxfScnOiB7Mn0iLCBuZXcgT2JqZWN0W10geyBvbGRQYXRoLCBuZXdQYXRoLCBzdGF0dXMuZ2V0TWVzc2FnZSgpIH0pOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJUGVyc2lzdGVuY2VQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ1dhcm5pbmcobXNnKTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJZmFpbGVkID0gdHJ1ZTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlpZiAoZmFpbGVkIHx8ICFuZXcgRmlsZShuZXdQYXRoKS5leGlzdHMoKSkgewotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQl9Ci0JCQkJfQotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCVBlcnNpc3RlbmNlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCWlmIChNdWx0aUZpbGVTYXZlVXRpbC5ERUJVRykgewotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHJlbmFtZShGaWxlIG9sZEZpbGUsIEZpbGUgbmV3RmlsZSkgewotCQlyZXR1cm4gbW92ZShvbGRGaWxlLmdldEFic29sdXRlUGF0aCgpLCBuZXdGaWxlLmdldEFic29sdXRlUGF0aCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkZWxldGVSZXNvdXJjZShTdHJpbmcgcGF0aCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQotCQkJdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkvLyBubyBuZWVkIHRvIHJlZnJlc2ggdGhlIHdob2xlIHRyZWUgZnJvbSBzcGVjaWZpZWQgcGF0aAotCQkvLyBnZXRSZXNvdXJjZUZvckxvY2F0aW9uKCkgcmVmcmVzaGVzIHJlc291cmNlIGluIGEgbW9yZSBlZmZpY2llbnQgd2F5Ci0JCS8vCi0JCS8vIElXb3Jrc3BhY2VSb290IHdvcmtzcGFjZVJvb3QgPQotCQkvLyBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOwotCQkvLyB0cnkgewotCQkvLyB3b3Jrc3BhY2VSb290LnJlZnJlc2hMb2NhbChJUmVzb3VyY2UuREVQVEhfSU5GSU5JVEUsIG1vbml0b3IpOwotCQkvLyB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUxKSB7Ci0JCS8vIGUxLnByaW50U3RhY2tUcmFjZSgpOwotCQkvLyB9Ci0KLQkJSVJlc291cmNlIHJlc291cmNlID0gZ2V0UmVzb3VyY2VGb3JMb2NhdGlvbihwYXRoKTsKLQkJaWYgKHJlc291cmNlICE9IG51bGwpIHsKLQkJCXJlc291cmNlLmRlbGV0ZSh0cnVlLCBtb25pdG9yKTsKLQkJfQotCX0KLQotCXB1YmxpYyBib29sZWFuIGRlbGV0ZShTdHJpbmcgcGF0aCkgewotCQl0cnkgewotCQkJZGVsZXRlUmVzb3VyY2UocGF0aCwgbnVsbCk7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlDb21tb25QbHVnaW4uSU5TVEFOQ0UubG9nKGUpOwotCQkJaWYgKE11bHRpRmlsZVNhdmVVdGlsLkRFQlVHKSB7Ci0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBmcm9tQ0MoSVN0YXR1cyBzdGF0dXMpIHsKLQkJU3RyaW5nIHBsdWdpbklkID0gc3RhdHVzLmdldFBsdWdpbigpOwotCQlyZXR1cm4gcGx1Z2luSWQgIT0gbnVsbAotCQkJCSYmIHBsdWdpbklkLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiY2xlYXJjYXNlIikgIT0gLTE7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgSVN0YXR1cyBjaGVja01vZGlmeShTdHJpbmdbXSBwYXRocywgT2JqZWN0IGNvbnRleHQpIHsKLQkJSVN0YXR1cyBzdGF0dXMgPSBudWxsOwotCQlJV29ya3NwYWNlIHdvcmtzcGFjZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKTsKLQkJSUZpbGVbXSBmaWxlcyA9IG5ldyBJRmlsZVtwYXRocy5sZW5ndGhdOwotCQlBcnJheUxpc3Q8U3RyaW5nPiBub3RGb3VuZEZpbGVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcGF0aHMubGVuZ3RoOyBpKyspIHsKLQkJCVN0cmluZyBwYXRoID0gcGF0aHNbaV07Ci0JCQl0cnkgewotCQkJCXJlZnJlc2gocGF0aCk7Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQlQZXJzaXN0ZW5jZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQl9Ci0JCQlJRmlsZSBmaWxlID0gd29ya3NwYWNlLmdldFJvb3QoKS5nZXRGaWxlRm9yTG9jYXRpb24obmV3IFBhdGgocGF0aCkpOwotCQkJaWYgKGZpbGUgPT0gbnVsbCkgewotCQkJCW5vdEZvdW5kRmlsZXMuYWRkKHBhdGgpOwotCQkJfSBlbHNlIHsKLQkJCQlmaWxlc1tpXSA9IGZpbGU7Ci0JCQl9Ci0JCX0KLQkJaWYgKCFub3RGb3VuZEZpbGVzLmlzRW1wdHkoKSkgewotCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5XQVJOSU5HLCBQTFVHSU5fSUQsIElTdGF0dXMuV0FSTklORywgTkxTCi0JCQkJCS5iaW5kKFBlcnNpc3RlbmNlUmVzb3VyY2VzLmZpbGVOb3RGb3VuZEVycm9yX21zZywKLQkJCQkJCQlub3RGb3VuZEZpbGVzKSwgbnVsbCk7Ci0JCX0KLQotCQlpZiAoIXZhbGlkYXRlRWRpdEluaXRpYWxpemVkKSB7Ci0JCQlzdGF0dXMgPSB3b3Jrc3BhY2UudmFsaWRhdGVFZGl0KGZpbGVzLCBjb250ZXh0KTsKLQkJCXZhbGlkYXRlRWRpdEluaXRpYWxpemVkID0gdHJ1ZTsKLQkJCWlmIChzdGF0dXMuaXNPSygpKSB7Ci0JCQkJLy8gZG91YmxlLWNoZWNrIGFmdGVyIGluaXRpYWxpemF0aW9uCi0JCQkJLy8KLQkJCQlzdGF0dXMgPSB3b3Jrc3BhY2UudmFsaWRhdGVFZGl0KGZpbGVzLCBjb250ZXh0KTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXN0YXR1cyA9IHdvcmtzcGFjZS52YWxpZGF0ZUVkaXQoZmlsZXMsIGNvbnRleHQpOwotCQl9Ci0KLQkJaWYgKHN0YXR1cy5pc09LKCkpIHsKLQkJCU11bHRpU3RhdHVzIG11bHRpU3RhdHVzID0gbmV3IE11bHRpU3RhdHVzKFBMVUdJTl9JRCwKLQkJCQkJSVN0YXR1cy5PSywgUGVyc2lzdGVuY2VSZXNvdXJjZXMubW9kaWZ5RmlsZXNFcnJvcl9tc2csCi0JCQkJCW51bGwpOwotCi0JCQkvLyBzb21lIHZlcnNpb24gY29udHJvbCBwcm92aWRlciBzdGlsbCByZXR1cm5zIE9LIHN0YXR1cyBldmVuIHRob3VnaAotCQkJLy8gdXNlciBjYW5jZWxsZWQgdGhlIGNoZWNrIG91dAotCQkJLy8gZG91YmxlLWNoZWNrIGhlcmUgYWdhaW4gdG8gbWFrZSBzdXJlIHRoZSBmaWxlIGlzIG5vdCByZWFkLW9ubHkKLQkJCS8vCQkJCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJSUZpbGUgZmlsZSA9IGZpbGVzW2ldOwotCQkJCXRyeSB7Ci0JCQkJCWZpbGUucmVmcmVzaExvY2FsKElSZXNvdXJjZS5ERVBUSF9aRVJPLCBudWxsKTsKLQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJQ29tbW9uUGx1Z2luLklOU1RBTkNFLmxvZyhlKTsKLQkJCQl9Ci0JCQkJaWYgKGZpbGUuaXNSZWFkT25seSgpKSB7Ci0JCQkJCVN0cmluZyBsb2NhbFBhdGggPSBmaWxlLmdldExvY2F0aW9uKCkudG9PU1N0cmluZygpOwotCQkJCQlTdHJpbmcgbXNnID0gTWVzc2FnZUZvcm1hdC5mb3JtYXQoCi0JCQkJCQkJUGVyc2lzdGVuY2VSZXNvdXJjZXMuRmlsZU1hbmFnZXJfZmlsZVJlYWRPbmx5LAotCQkJCQkJCW5ldyBPYmplY3RbXSB7IGxvY2FsUGF0aCB9KTsKLQkJCQkJbXVsdGlTdGF0dXMuYWRkKG5ldyBSZXNvdXJjZVN0YXR1cyhJU3RhdHVzLkVSUk9SLCAwLCBmaWxlCi0JCQkJCQkJLmdldEZ1bGxQYXRoKCksIG1zZywgbnVsbCkpOwotCQkJCX0KLQkJCX0KLQkJCWlmKCFtdWx0aVN0YXR1cy5pc09LKCkpIHsKLQkJCQlyZXR1cm4gbXVsdGlTdGF0dXM7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQkvLyBoYWNrIGZvciBjbGVhcmNhc2UKLQkJCWlmIChmcm9tQ0Moc3RhdHVzKSkgewotCQkJCVN0cmluZyBtc2cgPSBQZXJzaXN0ZW5jZVJlc291cmNlcy5tb2RpZnlGaWxlc0Vycm9yX21zZzsKLQkJCQlNdWx0aVN0YXR1cyBtdWx0aVN0YXR1cyA9IG5ldyBNdWx0aVN0YXR1cyhQTFVHSU5fSUQsIHN0YXR1cwotCQkJCQkJLmdldENvZGUoKSwgbXNnLCBudWxsKTsKLQkJCQltdWx0aVN0YXR1cy5hZGQoc3RhdHVzKTsKLQkJCQlyZXR1cm4gbXVsdGlTdGF0dXM7Ci0JCQl9Ci0JCX0KLQotCQkvLyBjb252ZXJ0IHdvcmtzcGFjZSBwYXRoIHRvIGxvY2FsIGZpbGUgc3lzdGVtIHBhdGgKLQkJaWYgKHN0YXR1cyBpbnN0YW5jZW9mIE11bHRpU3RhdHVzKSB7Ci0JCQlNdWx0aVN0YXR1cyBtcyA9IChNdWx0aVN0YXR1cykgc3RhdHVzOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtcy5nZXRDaGlsZHJlbigpLmxlbmd0aDsgaSsrKSB7Ci0JCQkJSVN0YXR1cyBjaGlsZFN0YXR1cyA9IG1zLmdldENoaWxkcmVuKClbaV07Ci0JCQkJbXMuZ2V0Q2hpbGRyZW4oKVtpXSA9IHRvU3RhdHVzV2l0aExvY2FsUGF0aChjaGlsZFN0YXR1cyk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQlzdGF0dXMgPSB0b1N0YXR1c1dpdGhMb2NhbFBhdGgoc3RhdHVzKTsKLQkJfQotCi0JCXJldHVybiBzdGF0dXM7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIElTdGF0dXMgdG9TdGF0dXNXaXRoTG9jYWxQYXRoKElTdGF0dXMgc3RhdHVzKSB7Ci0JCWlmIChzdGF0dXMgaW5zdGFuY2VvZiBJUmVzb3VyY2VTdGF0dXMKLQkJCQkmJiBzdGF0dXMuZ2V0Q29kZSgpID09IElSZXNvdXJjZVN0YXR1cy5SRUFEX09OTFlfTE9DQUwpIHsKLQkJCUlSZXNvdXJjZVN0YXR1cyByZXNvdXJjZVN0YXR1cyA9ICgoSVJlc291cmNlU3RhdHVzKSBzdGF0dXMpOwotCQkJSVBhdGggcGF0aCA9IHJlc291cmNlU3RhdHVzLmdldFBhdGgoKTsKLQkJCUlGaWxlIGZpbGUgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpCi0JCQkJCS5nZXRGaWxlKHBhdGgpOwotCQkJU3RyaW5nIGxvY2FsUGF0aCA9IGZpbGUuZ2V0TG9jYXRpb24oKS50b09TU3RyaW5nKCk7Ci0JCQlTdHJpbmcgbXNnID0gTWVzc2FnZUZvcm1hdC5mb3JtYXQoCi0JCQkJCVBlcnNpc3RlbmNlUmVzb3VyY2VzLkZpbGVNYW5hZ2VyX2ZpbGVSZWFkT25seSwKLQkJCQkJbmV3IE9iamVjdFtdIHsgbG9jYWxQYXRoIH0pOyAKLQkJCXJldHVybiBuZXcgUmVzb3VyY2VTdGF0dXMoc3RhdHVzCi0JCQkJCS5nZXRTZXZlcml0eSgpLCBzdGF0dXMuZ2V0Q29kZSgpLAotCQkJCQlyZXNvdXJjZVN0YXR1cy5nZXRQYXRoKCksIG1zZywgc3RhdHVzCi0JCQkJCQkJLmdldEV4Y2VwdGlvbigpKTsKLQkJfQotCQlyZXR1cm4gc3RhdHVzOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzLklGaWxlTWFuYWdlciNjaGVja01vZGlmeShqYXZhLmxhbmcuU3RyaW5nLAotCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgSVN0YXR1cyBjaGVja01vZGlmeShTdHJpbmcgcGF0aCwgT2JqZWN0IGNvbnRleHQpIHsKLQkJcmV0dXJuIGNoZWNrTW9kaWZ5KG5ldyBTdHJpbmdbXSB7IHBhdGggfSwgY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogQ2hlY2tzIGlmIHRoZSBnaXZlbiBwYXRoIGlzIHRlYW0tcHJpdmF0ZSBmaWxlIG9yIGZvbGRlcgotCSAqIAotCSAqIEBwYXJhbSBwYXRoCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzVGVhbVByaXZhdGUoU3RyaW5nIHBhdGgpIHsKLQkJSVJlc291cmNlIHJlc291cmNlID0gZ2V0UmVzb3VyY2VGb3JMb2NhdGlvbihwYXRoKTsKLQkJcmV0dXJuIHJlc291cmNlICE9IG51bGwgJiYgcmVzb3VyY2UuaXNUZWFtUHJpdmF0ZU1lbWJlcigpOwotCX0KLQotICAgIC8qKgotICAgICAqIEZpbmRzIHRoZSBmaWxlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCBVUkksIHVzaW5nIGEgVVJJIGNvbnZlcnRlcgotICAgICAqIGlmIG5lY2Vzc2FyeSAoYW5kIHByb3ZpZGVkKSB0byBub3JtYWxpemUgaXQuCi0gICAgICogCi0gICAgICogQHBhcmFtIHVyaSBhIFVSSQotICAgICAqIEBwYXJhbSBjb252ZXJ0ZXIgYW4gb3B0aW9uYWwgVVJJIGNvbnZlcnRlciAobWF5IGJlIDxjb2RlPm51bGw8L2NvZGU+KQotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGZpbGUsIGlmIGF2YWlsYWJsZSBpbiB0aGUgd29ya3NwYWNlCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBJRmlsZSBnZXRGaWxlKFVSSSB1cmksIFVSSUNvbnZlcnRlciBjb252ZXJ0ZXIpIHsKLSAgICAgICAgSUZpbGUgcmVzdWx0ID0gbnVsbDsKLSAgICAgICAgCi0gICAgICAgIGlmICgicGxhdGZvcm0iLmVxdWFscyh1cmkuc2NoZW1lKCkpICYmICh1cmkuc2VnbWVudENvdW50KCkgPiAyKSkgeyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICBpZiAoInJlc291cmNlIi5lcXVhbHModXJpLnNlZ21lbnQoMCkpKSB7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICBJUGF0aCBwYXRoID0gbmV3IFBhdGgoVVJJLmRlY29kZSh1cmkucGF0aCgpKSkucmVtb3ZlRmlyc3RTZWdtZW50cygxKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICByZXN1bHQgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGUocGF0aCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAodXJpLmlzRmlsZSgpICYmICF1cmkuaXNSZWxhdGl2ZSgpKSB7Ci0gICAgICAgICAgICByZXN1bHQgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGVGb3JMb2NhdGlvbigKLSAgICAgICAgICAgICAgICBuZXcgUGF0aCh1cmkudG9GaWxlU3RyaW5nKCkpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIG5vcm1hbGl6ZSwgdG8gc2VlIHdoZXRoZXIgbWF5IHdlIGNhbiByZXNvbHZlIGl0IHRoaXMgdGltZQotICAgICAgICAgICAgaWYgKGNvbnZlcnRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgVVJJIG5vcm1hbGl6ZWQgPSBjb252ZXJ0ZXIubm9ybWFsaXplKHVyaSk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYgKCF1cmkuZXF1YWxzKG5vcm1hbGl6ZWQpKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIHJlY3Vyc2Ugb24gdGhlIG5ldyBVUkkKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gZ2V0RmlsZShub3JtYWxpemVkLCBjb252ZXJ0ZXIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0b0ZpbGVTdHJpbmcoVVJJIHVyaSwgVVJJQ29udmVydGVyIGNvbnZlcnRlcikgewotCQlpZih1cmkuaXNGaWxlKCkpIHsKLQkJCXJldHVybiB1cmkudG9GaWxlU3RyaW5nKCk7Ci0JCX0KLQkJSUZpbGUgZmlsZSA9IGdldEZpbGUodXJpLCBjb252ZXJ0ZXIpOwotCQlyZXR1cm4gZmlsZSAhPSBudWxsID8gZmlsZS5nZXRMb2NhdGlvbigpLnRvT1NTdHJpbmcoKSA6IG51bGw7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRvRmlsZVN0cmluZyhVUkkgdXJpKSB7Ci0JCXJldHVybiB0b0ZpbGVTdHJpbmcodXJpLCBudWxsKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBjbGFzcyBGaWxlSW5mbyBpbXBsZW1lbnRzIElGaWxlSW5mbyB7Ci0JCQotCQlwcml2YXRlIElGaWxlIGZpbGU7Ci0KLQkJcHJpdmF0ZSBGaWxlSW5mbyhJRmlsZSBmaWxlKSB7Ci0JCQl0aGlzLmZpbGUgPSBmaWxlOwotCQl9Ci0KLQkJcHVibGljIGxvbmcgZ2V0TW9kaWZpY2F0aW9uU3RhbXAoKSB7Ci0JCQlyZXR1cm4gZmlsZS5nZXRNb2RpZmljYXRpb25TdGFtcCgpOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gaXNTeW5jaHJvbml6ZWQoKSB7Ci0JCQlyZXR1cm4gZmlsZS5pc1N5bmNocm9uaXplZChJUmVzb3VyY2UuREVQVEhfWkVSTyk7Ci0JCX0KLQotCQlwdWJsaWMgRmlsZSBnZXRGaWxlKCkgewotCQkJSVBhdGggbG9jID0gZmlsZS5nZXRMb2NhdGlvbigpOwotCQkJcmV0dXJuIGxvYyAhPSBudWxsID8gZmlsZS5nZXRMb2NhdGlvbigpLnRvRmlsZSgpIDogbnVsbDsKLQkJfQotCQkKLQl9Ci0JCi0JcHVibGljIElGaWxlSW5mbyBnZXRGaWxlSW5mbyhSZXNvdXJjZSByZXNvdXJjZSkgewotCQlJRmlsZSBmaWxlID0gV29ya3NwYWNlU3luY2hyb25pemVyLmdldEZpbGUocmVzb3VyY2UpOwotCQlyZXR1cm4gZmlsZSAhPSBudWxsID8gbmV3IEZpbGVJbmZvKGZpbGUpIDogbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL0ZpbGVQYXRoUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvRmlsZVBhdGhQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMTRlZmRlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvRmlsZVBhdGhQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci0KLS8qKgotICogRmlsZS1iYXNlZCBVUkkgcHJvdmlkZXIKLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUgLSBBdWcgOCwgMjAwNgotICogQHNpbmNlICAxLjAKLSAqLwotcHVibGljIGNsYXNzIEZpbGVQYXRoUHJvdmlkZXIgaW1wbGVtZW50cyBJVVJJUHJvdmlkZXIgewotCXByb3RlY3RlZCBGaWxlUGF0aFByb3ZpZGVyKCkgewotCQkKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UuSVVSSVByb3ZpZGVyI2dldFVSSShvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkKLQkgKi8KLQlwdWJsaWMgVVJJIGdldFVSSShFT2JqZWN0IG9iamVjdCkgewotCQlpZihvYmplY3QgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQlyZXR1cm4gTXVsdGlGaWxlU2F2ZVV0aWwuY3JlYXRlRmlsZVVSSSgoTWV0aG9kRWxlbWVudCkgb2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvSUZpbGVJbmZvLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL0lGaWxlSW5mby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NDkwNjEwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvSUZpbGVJbmZvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2U7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5lIDEuMgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElGaWxlSW5mbyB7Ci0JRmlsZSBnZXRGaWxlKCk7Ci0JCi0JbG9uZyBnZXRNb2RpZmljYXRpb25TdGFtcCgpOwotCQotCWJvb2xlYW4gaXNTeW5jaHJvbml6ZWQoKTsKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvSVVSSVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL0lVUklQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZmVjZjVhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvSVVSSVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi0vKioKLSAqIEludGVyZmFjZSB0byBwcm92aWRlIFVSSSBmb3IgYW4gRU9iamVjdC4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUgLSBBdWcgOCwgMjAwNgotICogQHNpbmNlICAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJVVJJUHJvdmlkZXIgewotCQotCS8qKgotCSAqIEdldHMgdGhlIFVSSSBmb3IgdGhlIGdpdmVuIG9iamVjdCBpZiB0aGlzIG9iamVjdCBoYXMgb3Igc2hvdWxkIGhhdmUgYSBkaXJlY3QgcmVzb3VyY2UKLQkgKiAKLQkgKiBAcGFyYW0gb2JqZWN0Ci0JICogQHJldHVybiB0aGUgVVJJIG9yIG51bGwgaWYgdGhlIGdpdmVuIG9iamVjdCBkb2VzL3dpbGwgbm90IGhhdmUgYSBkaXJlY3QgcmVzb3VyY2UKLQkgKi8KLQlVUkkgZ2V0VVJJKEVPYmplY3Qgb2JqZWN0KTsKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvTWV0aG9kTGlicmFyeVBlcnNpc3Rlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS9NZXRob2RMaWJyYXJ5UGVyc2lzdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyOWY5NmMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS9NZXRob2RMaWJyYXJ5UGVyc2lzdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTY3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZTsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5Db21tb25QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuV3JhcHBlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS5pbnRlcm5hbC5JRmFpbFNhZmVTYXZhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5yZWZyZXNoLlJlZnJlc2hKb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLnV0aWwuUGVyc2lzdGVuY2VSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLnV0aWwuUGVyc2lzdGVuY2VVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy5JRmlsZUJhc2VkTGlicmFyeVBlcnNpc3RlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNhcGFiaWxpdHlQYXR0ZXJuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyeVByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmliYWJsZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUuaW1wbC5NdWx0aVJlc291cmNlRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi0vKioKLSAqIEZpbGUtYmFzZWQgaW1wbGVtZW50YXRpb24gZm9yIElNZXRob2RMaWJyYXJ5UGVyc2lzdGVyCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXRob2RMaWJyYXJ5UGVyc2lzdGVyIGltcGxlbWVudHMgSUZpbGVCYXNlZExpYnJhcnlQZXJzaXN0ZXIgewotCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgRm9sZGVySW5mbyB7Ci0KLQkJRUNsYXNzIGVDbGF6ejsKLQotCQlib29sZWFuIHNoYXJlZDsKLQotCQlwcml2YXRlIFN0cmluZyBuYW1lOwotCi0JCS8qKgotCQkgKiBAcGFyYW0gY2xhenoKLQkJICogQHBhcmFtIHNoYXJlZAotCQkgKi8KLQkJcHVibGljIEZvbGRlckluZm8oRUNsYXNzIGNsYXp6LCBib29sZWFuIHNoYXJlZCkgewotCQkJc3VwZXIoKTsKLQkJCWVDbGF6eiA9IGNsYXp6OwotCQkJdGhpcy5zaGFyZWQgPSBzaGFyZWQ7Ci0JCQl0aGlzLm5hbWUgPSBsb3dlckFuZFBsdXJhbGl6ZShjbGF6ei5nZXROYW1lKCkpOwotCQl9Ci0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIE1ldGhvZExpYnJhcnlQZXJzaXN0ZXIgSU5TVEFOQ0UgPSBuZXcgTWV0aG9kTGlicmFyeVBlcnNpc3RlcigpOwotCi0JLy8gbmVlZCB0byBleHBvc2UgdGhpcywganhpCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVTT1VSQ0VfRk9MREVSID0gInJlc291cmNlcyI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIExpc3QgZm9sZGVySW5mb3MgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQlzdGF0aWMgewotCQlmb2xkZXJJbmZvcy5hZGQobmV3IEZvbGRlckluZm8oVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0R3VpZGFuY2UoKSwKLQkJCQlmYWxzZSkpOwotCQlmb2xkZXJJbmZvcy5hZGQobmV3IEZvbGRlckluZm8oVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V29ya1Byb2R1Y3QoKSwKLQkJCQl0cnVlKSk7Ci0JCWZvbGRlckluZm9zCi0JCQkJLmFkZChuZXcgRm9sZGVySW5mbyhVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRBY3Rpdml0eSgpLCB0cnVlKSk7Ci0JfQotCi0JcHJvdGVjdGVkIExpc3Qgd2FybmluZ3M7Ci0KLQlwdWJsaWMgTWV0aG9kTGlicmFyeVBlcnNpc3RlcigpIHsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjb3JyZWN0IHBhdGggKHJlbGF0aXZlIHRvIHRoZSBwbHVnaW4pIG9mIHRoZSBmaWxlIG9mIHRoZQotCSAqIGdpdmVuIGNvbnRlbnQgZGVzY3JpcHRpb24gb3IgbnVsbCBpZiB0aGUgZ2l2ZW4gY29udGVudCBkb2VzIG5vdCBiZSBsb25nCi0JICogdG8gYW55IHBsdWdpbi4KLQkgKiAKLQkgKiBAcGFyYW0gY29udGVudAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRDb3JyZWN0UGF0aChDb250ZW50RGVzY3JpcHRpb24gY29udGVudCkgewotCQlyZXR1cm4gZ2V0Q29ycmVjdFBhdGgoKERlc2NyaWJhYmxlRWxlbWVudCkgY29udGVudC5lQ29udGFpbmVyKCksCi0JCQkJY29udGVudCk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldENvcnJlY3RQYXRoKERlc2NyaWJhYmxlRWxlbWVudCBlLAotCQkJQ29udGVudERlc2NyaXB0aW9uIGNvbnRlbnQpIHsKLQkJaWYgKGUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4oZSk7Ci0JCWlmIChwbHVnaW4gPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJUmVzb3VyY2UgcmVzb3VyY2UgPSBwbHVnaW4uZVJlc291cmNlKCk7Ci0JCVVSSSB1cmkgPSBNdWx0aUZpbGVTYXZlVXRpbC5nZXRGaW5hbFVSSShyZXNvdXJjZSk7Ci0JCUZpbGUgcGx1Z2luRGlyID0gbmV3IEZpbGUodXJpLnRvRmlsZVN0cmluZygpKS5nZXRQYXJlbnRGaWxlKCk7Ci0JCVN0cmluZyBmb2xkZXJQYXRoID0gc3RhdGljR2V0Rm9sZGVyUGF0aChlLmVDbGFzcygpKTsKLQkJU3RyaW5nIGRpciA9IG5ldyBTdHJpbmdCdWZmZXIocGx1Z2luRGlyLmdldEFic29sdXRlUGF0aCgpKS5hcHBlbmQoCi0JCQkJRmlsZS5zZXBhcmF0b3IpLmFwcGVuZChmb2xkZXJQYXRoKS5hcHBlbmQoRmlsZS5zZXBhcmF0b3IpCi0JCQkJLnRvU3RyaW5nKCk7Ci0KLQkJcmV0dXJuIGdldE5leHRBdmFpbGFibGVGaWxlTmFtZShkaXIsIGUsIGNvbnRlbnQpOwotCX0KLQotCS8qKgotCSAqIEdldHMgbmV4dCBhdmFpbGFibGUgZmlsZSBuYW1lIGZvciB0aGUgZ2l2ZW4ge0BsaW5rIE11bHRpUmVzb3VyY2VFT2JqZWN0fSBpbiB0aGUgZ2l2ZW4gZGlyZWN0b3J5IDxjb2RlPmRpcjwvY29kZT4KLQkgKiAKLQkgKiBAcGFyYW0gZGlyIHRoZSBkaXJlY3RvcnkgcGF0aCB0aGF0IG11c3QgaGF2ZSBhIGZpbGUgc2VwYXJhdG9yIGF0IHRoZSBlbmQKLQkgKiBAcGFyYW0gcmVxdWVzdGVkTmFtZQotCSAqIEBwYXJhbSBlCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE5leHRBdmFpbGFibGVGaWxlTmFtZShTdHJpbmcgZGlyLCBTdHJpbmcgcmVxdWVzdGVkTmFtZSwKLQkJCU11bHRpUmVzb3VyY2VFT2JqZWN0IGUpIHsKLQkJU3RyaW5nIGN1cnJlbnRGaWxlbmFtZSA9IG51bGw7Ci0JCUZpbGUgY3VycmVudEZpbGUgPSBudWxsOwotCQlNdWx0aUZpbGVYTUlSZXNvdXJjZUltcGwgcmVzb3VyY2UgPSAoTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsKSBlCi0JCQkJLmVEaXJlY3RSZXNvdXJjZSgpOwotCQlpZiAocmVzb3VyY2UgIT0gbnVsbCkgewotCQkJLy8ga2VlcCBleGlzdGluZyBmaWxlIG5hbWUgZHVyaW5nIG1vdmUgaWYgaXQgaXMgbm90IHRha2VuIHlldC4gRG9uJ3QKLQkJCS8vIHRyeSB0byBtYXRjaCB0aGUgZWxlbWVudCdzIG5hbWUKLQkJCS8vCi0JCQlTdHJpbmcgcGF0aCA9ICgoTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsKSBlLmVSZXNvdXJjZSgpKQotCQkJCQkuZ2V0RmluYWxVUkkoKS50b0ZpbGVTdHJpbmcoKTsKLQkJCWN1cnJlbnRGaWxlID0gbmV3IEZpbGUocGF0aCk7Ci0JCQljdXJyZW50RmlsZW5hbWUgPSBjdXJyZW50RmlsZS5nZXROYW1lKCk7Ci0JCQlGaWxlIGZpbGUgPSBuZXcgRmlsZShkaXIsIGN1cnJlbnRGaWxlbmFtZSk7Ci0JCQlpZiAoIWZpbGUuZXhpc3RzKCkpIHsKLQkJCQkvLyB0aGUgZWxlbWVudCBpcyBiZWluZyBtb3ZlZAotCQkJCS8vCi0JCQkJcmV0dXJuIGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0JCQl9Ci0JCX0KLQotCQkvLyBlbGVtZW50IHdpdGhvdXQgYSByZXNvdXJjZSBvciBwYXRoIGlzIGFscmVhZHkgdGFrZW4KLQkJLy8KLQkJU3RyaW5nIHBhdGggPSBuZXcgU3RyaW5nQnVmZmVyKGRpcikuYXBwZW5kKHJlcXVlc3RlZE5hbWUpLmFwcGVuZCgKLQkJCQlNdWx0aUZpbGVTYXZlVXRpbC5ERUZBVUxUX0ZJTEVfRVhURU5TSU9OKS50b1N0cmluZygpOwotCQlGaWxlIGZpbGUgPSBuZXcgRmlsZShwYXRoKTsKLQkJaWYoZmlsZS5lcXVhbHMoY3VycmVudEZpbGUpKSB7Ci0JCQlyZXR1cm4gcGF0aDsKLQkJfQotCQlpZiAoKGN1cnJlbnRGaWxlbmFtZSAhPSBudWxsICYmIGN1cnJlbnRGaWxlbmFtZS5lcXVhbHMocmVxdWVzdGVkTmFtZSkpCi0JCQkJfHwgZmlsZS5leGlzdHMoKSkgewotCQkJZm9yIChpbnQgaSA9IDI7IHRydWU7IGkrKykgewotCQkJCXBhdGggPSBuZXcgU3RyaW5nQnVmZmVyKGRpcikuYXBwZW5kKHJlcXVlc3RlZE5hbWUpLmFwcGVuZCgnICcpCi0JCQkJCQkuYXBwZW5kKGkpLmFwcGVuZCgKLQkJCQkJCQkJTXVsdGlGaWxlU2F2ZVV0aWwuREVGQVVMVF9GSUxFX0VYVEVOU0lPTikKLQkJCQkJCS50b1N0cmluZygpOwotCQkJCWlmICghbmV3IEZpbGUocGF0aCkuZXhpc3RzKCkpIHsKLQkJCQkJcmV0dXJuIHBhdGg7Ci0JCQkJfQotCQkJfQotCQl9IGVsc2UgewotCQkJcmV0dXJuIHBhdGg7Ci0JCX0KLQl9Ci0KLQlzdGF0aWMgU3RyaW5nIGdldE5leHRBdmFpbGFibGVGaWxlTmFtZShTdHJpbmcgZGlyLAotCQkJQ29udGVudERlc2NyaXB0aW9uIGNvbnRlbnQpIHsKLQkJcmV0dXJuIGdldE5leHRBdmFpbGFibGVGaWxlTmFtZShkaXIsIChEZXNjcmliYWJsZUVsZW1lbnQpIGNvbnRlbnQKLQkJCQkuZUNvbnRhaW5lcigpLCBjb250ZW50KTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0TmV4dEF2YWlsYWJsZUZpbGVOYW1lKFN0cmluZyBkaXIsCi0JCQlEZXNjcmliYWJsZUVsZW1lbnQgZSwgQ29udGVudERlc2NyaXB0aW9uIGNvbnRlbnQpIHsKLQkJcmV0dXJuIGdldE5leHRBdmFpbGFibGVGaWxlTmFtZShkaXIsIGUuZ2V0TmFtZSgpLAotCQkJCShNdWx0aVJlc291cmNlRU9iamVjdCkgY29udGVudCk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHN0YXRpY0dldEZvbGRlclBhdGgoRUNsYXNzIGVDbGF6eikgewotCQlpbnQgc2l6ZSA9IGZvbGRlckluZm9zLnNpemUoKTsKLQkJRm9sZGVySW5mbyBpbmZvID0gbnVsbDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCUZvbGRlckluZm8gZm9sZGVySW5mbyA9IChGb2xkZXJJbmZvKSBmb2xkZXJJbmZvcy5nZXQoaSk7Ci0JCQlpZiAoZm9sZGVySW5mby5lQ2xhenouaXNTdXBlclR5cGVPZihlQ2xhenopKSB7Ci0JCQkJaW5mbyA9IGZvbGRlckluZm87Ci0JCQl9Ci0JCX0KLQkJaWYgKGluZm8gIT0gbnVsbCkgewotCQkJaWYgKGluZm8uZUNsYXp6ID09IGVDbGF6eiB8fCBpbmZvLnNoYXJlZCkgewotCQkJCXJldHVybiBpbmZvLm5hbWU7Ci0JCQl9IGVsc2UgewotCQkJCXJldHVybiBuZXcgU3RyaW5nQnVmZmVyKGluZm8ubmFtZSkuYXBwZW5kKEZpbGUuc2VwYXJhdG9yQ2hhcikKLQkJCQkJCS5hcHBlbmQobG93ZXJBbmRQbHVyYWxpemUoZUNsYXp6LmdldE5hbWUoKSkpLnRvU3RyaW5nKCk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gbG93ZXJBbmRQbHVyYWxpemUoZUNsYXp6LmdldE5hbWUoKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBsb3dlckFuZFBsdXJhbGl6ZShTdHJpbmcgbmFtZSkgewotCQluYW1lID0gbmFtZS50b0xvd2VyQ2FzZSgpOwotCQlpZiAobmFtZS5lbmRzV2l0aCgiY2hpbGRyZW4iKSkgeyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gbmFtZTsKLQkJfSBlbHNlIGlmIChuYW1lLmVuZHNXaXRoKCJjaGlsZCIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBuYW1lICsgInJlbiI7IC8vJE5PTi1OTFMtMSQKLQkJfSBlbHNlIGlmIChuYW1lLmVuZHNXaXRoKCJkYXRhIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIG5hbWU7Ci0JCX0gZWxzZSBpZiAobmFtZS5lbmRzV2l0aCgiZGF0dW0iKSkgeyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gbmFtZS5zdWJzdHJpbmcoMCwgbmFtZS5sZW5ndGgoKSAtIDIpICsgImEiOyAvLyROT04tTkxTLTEkCi0JCX0gZWxzZSBpZiAobmFtZS5lbmRzV2l0aCgiYnkiKSkgeyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gbmFtZSArICJzIjsgLy8kTk9OLU5MUy0xJAotCQl9IGVsc2UgaWYgKG5hbWUuZW5kc1dpdGgoInkiKSkgeyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gbmFtZS5zdWJzdHJpbmcoMCwgbmFtZS5sZW5ndGgoKSAtIDEpICsgImllcyI7IC8vJE5PTi1OTFMtMSQKLQkJfSBlbHNlIGlmIChuYW1lLmVuZHNXaXRoKCJleCIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBuYW1lLnN1YnN0cmluZygwLCBuYW1lLmxlbmd0aCgpIC0gMikgKyAiaWNlcyI7IC8vJE5PTi1OTFMtMSQKLQkJfSBlbHNlIGlmIChuYW1lLmVuZHNXaXRoKCJ4IikpIHsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIG5hbWUgKyAiZXMiOyAvLyROT04tTkxTLTEkCi0JCX0gZWxzZSBpZiAobmFtZS5lbmRzV2l0aCgidXMiKSkgeyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gbmFtZS5zdWJzdHJpbmcoMCwgbmFtZS5sZW5ndGgoKSAtIDIpICsgImkiOyAvLyROT04tTkxTLTEkCi0JCX0gZWxzZSBpZiAobmFtZS5lbmRzV2l0aCgic3MiKSkgeyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gbmFtZSArICJlcyI7IC8vJE5PTi1OTFMtMSQKLQkJfSBlbHNlIGlmIChuYW1lLmVuZHNXaXRoKCJzIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIG5hbWU7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gbmFtZSArICJzIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgdmlydHVhbCBwYXRoIHRvIHRoZSByZXNvdXJjZSBmb2xkZXIgb2YgdGhlIGdpdmVuIE1ldGhvZEVsZW1lbnQgb2JqZWN0LgotCSAqIAotCSAqIEBwYXJhbSBlCi0JICogQHJldHVybgotCSAqIEBzZWUgI2dldEVsZW1lbnRWaXJ0dWFsUGF0aChNZXRob2RFbGVtZW50KQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2VSZXNvdXJjZVZpcnR1YWxQYXRoKE1ldGhvZEVsZW1lbnQgZSkgewotCQlTdHJpbmcgZm9sZGVyUGF0aCA9IGdldEVsZW1lbnRWaXJ0dWFsUGF0aChlKTsKLQkJaWYgKGZvbGRlclBhdGggPT0gbnVsbCB8fCBmb2xkZXJQYXRoLmxlbmd0aCgpID09IDApCi0JCXsKLQkJCXJldHVybiBSRVNPVVJDRV9GT0xERVI7Ci0JCX0gZWxzZSB7Ci0JCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcihmb2xkZXJQYXRoKTsKLQkJCWlmICggIWZvbGRlclBhdGguZW5kc1dpdGgoRmlsZS5zZXBhcmF0b3IpICkgewotCQkJCWJ1ZmZlci5hcHBlbmQoRmlsZS5zZXBhcmF0b3IpOwotCQkJfSAKLQkJCQotCQkJYnVmZmVyLmFwcGVuZChSRVNPVVJDRV9GT0xERVIpOwkJCQkKLQkJCQotCQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgdmlydHVhbCBwYXRoIHRvIHRoZSBmb2xkZXIgb2YgdGhlIGdpdmVuIE1ldGhvZEVsZW1lbnQgb2JqZWN0LiBUaGlzIHBhdGggd2lsbCBoYXZlIHRoZSBmb2xsb3dpbmcgZm9ybWF0OgotCSAqIDxwbHVnaW5fbmFtZT5cZm9sZGVyX3JlbGF0aXZlX3BhdGhcCi0JICogCi0JICogQHBhcmFtIGUKLQkgKiBAcmV0dXJuCi0JICovCQotCXB1YmxpYyBTdHJpbmcgZ2V0RWxlbWVudFZpcnR1YWxQYXRoKE1ldGhvZEVsZW1lbnQgZSkgewotCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4oZSk7Ci0JCWlmIChwbHVnaW4gPT0gbnVsbCkgewotCQkJaWYgKCEoZSBpbnN0YW5jZW9mIE1ldGhvZENvbmZpZ3VyYXRpb24gfHwgZSBpbnN0YW5jZW9mIE1ldGhvZExpYnJhcnkpKSB7Ci0JCQkJLy8gZXJyb3I6IHBsdWdpbiBlbGVtZW50IHdpdGhvdXQgYSB2YWxpZCBwbHVnaW4gc2V0LiBUaGlzCi0JCQkJLy8gcHJvYmxlbSBuZWVkcyB0byBiZSBmaXhlZC4KLQkJCQkvLyBzdGlsbCBzZWUgaXQgZnJvbSB0aW1lIHRvIHRpbWUsCi0JCQkJLy8gZm9yIGV4YW1wbGUsIHdoZW4gbGljayBvbiBhIGNhcGFiaWxpdHkgcGF0dGVybiBpbgotCQkJCS8vIENvbmZpZ3VyYXRpb24gRXhwbG9yZXIKLQkJCQlTeXN0ZW0uZXJyCi0JCQkJCQkucHJpbnRsbigiZXJyb3IgaW4gTWV0aG9kTGlicmFyeVBlcnNpc3Rlci5nZXRFbGVtZW50UGF0aCgpOiBwbHVnaW4gZWxlbWVudCB3aXRob3V0IGEgdmFsaWQgcGx1Z2luLiBUaGlzIHByb2JsZW0gbmVlZHMgdG8gYmUgZml4ZWQuIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCQotCQlTdHJpbmcgZm9sZGVyUGF0aCA9IGdldEZvbGRlclJlbGF0aXZlUGF0aChlKTsKLQkJU3RyaW5nIHBsdWdpbk5hbWUgPSBwbHVnaW4uZ2V0TmFtZSgpOwotCQlyZXR1cm4gKGZvbGRlclBhdGgubGVuZ3RoKCkgPT0gMCA/IHBsdWdpbk5hbWUgKyBGaWxlLnNlcGFyYXRvciA6IG5ldyBTdHJpbmdCdWZmZXIoCi0JCQkJcGx1Z2luTmFtZSkuYXBwZW5kKEZpbGUuc2VwYXJhdG9yQ2hhcikuYXBwZW5kKGZvbGRlclBhdGgpCi0JCQkJLmFwcGVuZChGaWxlLnNlcGFyYXRvckNoYXIpLnRvU3RyaW5nKCkpOwotCX0KLQkKLQkvKioKLQkgKiBHZXRzIHRoZSBwYXRoIHJlbGF0aXZlIHRvIHRoZSBsaWJyYXJ5IHJvb3QgZGlyZWN0b3J5IHRvIHRoZQotCSAqIGZvbGRlciBvZiB0aGUgZ2l2ZW4gTWV0aG9kRWxlbWVudCBvYmplY3QuCi0JICogCi0JICogQHBhcmFtIGUKLQkgKiBAcmV0dXJuCi0JICovCQotCXByaXZhdGUgU3RyaW5nIGdldFJlbGF0aXZlRWxlbWVudFBhdGgoTWV0aG9kRWxlbWVudCBlKSB7Ci0JCVN0cmluZyBmb2xkZXJQYXRoID0gZ2V0Rm9sZGVyUmVsYXRpdmVQYXRoKGUpOwotCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4oZSk7Ci0JCWlmIChwbHVnaW4gPT0gbnVsbCkgewotCQkJaWYgKChlIGluc3RhbmNlb2YgTWV0aG9kQ29uZmlndXJhdGlvbiB8fCBlIGluc3RhbmNlb2YgTWV0aG9kTGlicmFyeSkpIHsKLQkJCQlyZXR1cm4gZm9sZGVyUGF0aDsKLQkJCX0KLQkJCWVsc2UgewotCQkJCS8vIGVycm9yOiBwbHVnaW4gZWxlbWVudCB3aXRob3V0IGEgdmFsaWQgcGx1Z2luIHNldC4gVGhpcwotCQkJCS8vIHByb2JsZW0gbmVlZHMgdG8gYmUgZml4ZWQuCi0JCQkJLy8gc3RpbGwgc2VlIGl0IGZyb20gdGltZSB0byB0aW1lLAotCQkJCS8vIGZvciBleGFtcGxlLCB3aGVuIGxpY2sgb24gYSBjYXBhYmlsaXR5IHBhdHRlcm4gaW4KLQkJCQkvLyBDb25maWd1cmF0aW9uIEV4cGxvcmVyCi0JCQkJU3lzdGVtLmVycgotCQkJCQkJLnByaW50bG4oImVycm9yIGluIE1ldGhvZExpYnJhcnlQZXJzaXN0ZXIuZ2V0RWxlbWVudFBhdGgoKTogcGx1Z2luIGVsZW1lbnQgd2l0aG91dCBhIHZhbGlkIHBsdWdpbi4gVGhpcyBwcm9ibGVtIG5lZWRzIHRvIGJlIGZpeGVkLiIpOyAvLyROT04tTkxTLTEkCi0JCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQotCQlpZiAocGx1Z2luLmVDb250YWluZXIoKSA9PSBudWxsKSB7Ci0JCQkvLyBlcnJvcjogcGx1Z2luIHdpdGhvdXQgbGlicmFyeSBzZXQuIFRoaXMgcHJvYmxlbSBuZWVkcyB0byBiZQotCQkJLy8gZml4ZWQuCi0JCQkvLyBzdGlsbCBzZWUgaXQgZnJvbSB0aW1lIHRvIHRpbWUKLQkJCVN5c3RlbS5lcnIKLQkJCQkJLnByaW50bG4oImVycm9yIGluIE1ldGhvZExpYnJhcnlQZXJzaXN0ZXIuZ2V0RWxlbWVudFBhdGgoKTogcGx1Z2luIHdpdGhvdXQgbGlicmFyeSBzZXQuIFRoaXMgcHJvYmxlbSBuZWVkcyB0byBiZSBmaXhlZC4iKTsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlTdHJpbmcgcmVsUGx1Z2luUGF0aDsKLQkJaWYgKHBsdWdpbi5lUmVzb3VyY2UoKSAhPSBudWxsKSB7Ci0JCQlSZXNvdXJjZSBsaWJSZXMgPSBVbWFVdGlsLmdldE1ldGhvZExpYnJhcnkocGx1Z2luKS5lUmVzb3VyY2UoKTsKLQkJCWlmIChsaWJSZXMgPT0gcGx1Z2luLmVSZXNvdXJjZSgpKSB7Ci0JCQkJLy8gdGhlIHBsdWdpbiBpcyBub3Qgc2F2ZWQgeWV0Ci0JCQkJcmVsUGx1Z2luUGF0aCA9IHBsdWdpbi5nZXROYW1lKCk7Ci0JCQl9IGVsc2UgewotCQkJCVVSSSB1cmkgPSBNdWx0aUZpbGVTYXZlVXRpbC5nZXRGaW5hbFVSSShwbHVnaW4uZVJlc291cmNlKCkpOwotCQkJCVVSSSBsaWJVcmkgPSBNdWx0aUZpbGVTYXZlVXRpbC5nZXRGaW5hbFVSSShsaWJSZXMpOwotCQkJCVVSSSByZWxVcmkgPSB1cmkuZGVyZXNvbHZlKGxpYlVyaSk7Ci0JCQkJcmVsUGx1Z2luUGF0aCA9IHJlbFVyaS50cmltU2VnbWVudHMoMSkudG9GaWxlU3RyaW5nKCk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQkvLyB0aGUgbGlicmFyeSBpcyBub3Qgc2F2ZWQgeWV0Ci0JCQlyZWxQbHVnaW5QYXRoID0gcGx1Z2luLmdldE5hbWUoKTsKLQkJfQotCi0JCXJldHVybiAoZm9sZGVyUGF0aC5sZW5ndGgoKSA9PSAwID8gcmVsUGx1Z2luUGF0aCArIEZpbGUuc2VwYXJhdG9yOiBuZXcgU3RyaW5nQnVmZmVyKAotCQkJCXJlbFBsdWdpblBhdGgpLmFwcGVuZChGaWxlLnNlcGFyYXRvckNoYXIpLmFwcGVuZChmb2xkZXJQYXRoKQotCQkJCS5hcHBlbmQoRmlsZS5zZXBhcmF0b3JDaGFyKS50b1N0cmluZygpKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JCUVDbGFzcyBlQ2xzID0gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGVtcGxhdGUoKTsKLQkJU3lzdGVtLm91dC5wcmludGxuKGVDbHMuZ2V0TmFtZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGp1c3RzIHRoZSBsb2NhdGlvbiBvZiB0aGUgZ2l2ZW4gcmVzb3VyY2UgYW5kIHNhdmUgYWxsIHRoZSByZXNvdXJjZXMKLQkgKiB0aGF0IGhhdmUgYmVlbiBjaGFuZ2VkIGFzIHRoZSByZXN1bHQgb2YgdGhpcyBhZGp1c3RtZW50Ci0JICogCi0JICogQHBhcmFtIHJlc291cmNlCi0JICovCi0JcHVibGljIHZvaWQgYWRqdXN0TG9jYXRpb24oUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJU2V0IG1vZGlmaWVkUmVzb3VyY2VzID0gbmV3IEhhc2hTZXQoKTsKLQkJTXVsdGlGaWxlU2F2ZVV0aWwuYWRqdXN0TG9jYXRpb24ocmVzb3VyY2UsIG1vZGlmaWVkUmVzb3VyY2VzKTsKLQotCQkvLyBzYXZlIHRoZSBtb2RpZmllZCByZXNvdXJjZXMKLQkJTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsIHJlc291cmNlU2V0ID0gKE11bHRpRmlsZVJlc291cmNlU2V0SW1wbCkgcmVzb3VyY2UKLQkJCQkuZ2V0UmVzb3VyY2VTZXQoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gbW9kaWZpZWRSZXNvdXJjZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQl0cnkgewotCQkJCXJlc291cmNlU2V0LnNhdmUoKFJlc291cmNlKSBpdGVyLm5leHQoKSwgbnVsbCk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCUNvbW1vblBsdWdpbi5JTlNUQU5DRS5sb2coZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzYXZlKFJlc291cmNlIHJlc291cmNlKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsIHJlc291cmNlU2V0ID0gKE11bHRpRmlsZVJlc291cmNlU2V0SW1wbCkgcmVzb3VyY2UKLQkJCQkuZ2V0UmVzb3VyY2VTZXQoKTsKLQkJcmVzb3VyY2VTZXQuc2F2ZShyZXNvdXJjZSwgbnVsbCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZGVsZXRlRmlsZXMoTWV0aG9kRWxlbWVudCBlLCBTdHJpbmcgcGF0aCwKLQkJCVJlc291cmNlU2V0IHJlc291cmNlU2V0KSB7Ci0JCWlmIChuZXcgRmlsZShwYXRoKS5pc0RpcmVjdG9yeSgpICYmICFlLmVJc1Byb3h5KCkpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHJlc291cmNlU2V0LmdldFJlc291cmNlcygpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQlSZXNvdXJjZSByZXMgPSAoUmVzb3VyY2UpIGl0ZXIubmV4dCgpOwotCQkJCU1ldGhvZEVsZW1lbnQgbWUgPSBQZXJzaXN0ZW5jZVV0aWwuZ2V0TWV0aG9kRWxlbWVudChyZXMpOwotCQkJCWlmIChtZSAhPSBudWxsICYmIFVtYVV0aWwuaXNDb250YWluZWRCeShtZSwgZSkpIHsKLQkJCQkJcmVzLnVubG9hZCgpOwotCQkJCQlpdGVyLnJlbW92ZSgpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXRyeSB7Ci0JCQlGaWxlTWFuYWdlci5nZXRJbnN0YW5jZSgpLmRlbGV0ZVJlc291cmNlKHBhdGgsIG51bGwpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGV4KSB7Ci0JCQlDb21tb25QbHVnaW4uSU5TVEFOQ0UubG9nKGV4KTsKLQkJCXRocm93IG5ldyBXcmFwcGVkRXhjZXB0aW9uKGV4KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIERlbGV0ZXMgdGhlIGZpbGVzIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gTWV0aG9kRWxlbWVudAotCSAqIAotCSAqIEBwYXJhbSBlCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZGVsZXRlKE1ldGhvZEVsZW1lbnQgZSwgU2V0IG1vZGlmaWVkUmVzb3VyY2VzKSB7Ci0JCWlmICghVW1hVXRpbC5oYXNEaXJlY3RSZXNvdXJjZShlKSkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsIHJlc291cmNlID0gKE11bHRpRmlsZVhNSVJlc291cmNlSW1wbCkgZQotCQkJCS5lUmVzb3VyY2UoKTsKLQkJTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsIHJlc291cmNlU2V0ID0gKE11bHRpRmlsZVJlc291cmNlU2V0SW1wbCkgcmVzb3VyY2UKLQkJCQkuZ2V0UmVzb3VyY2VTZXQoKTsKLQotCQkvLyBEb24ndCBkZWxldGUgdGhpcyByZXNvdXJjZSdzIGZpbGUgaWYgaXQgc3RpbGwgY29udGFpbnMgb3RoZXIKLQkJLy8gTWV0aG9kRWxlbWVudAotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSByZXNvdXJjZS5nZXRDb250ZW50cygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyLm5leHQoKTsKLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCAmJiBlbGVtZW50ICE9IGUpIHsKLQkJCQlyZXNvdXJjZVNldC5yZW1vdmVVUklNYXBwaW5ncyhlLCBtb2RpZmllZFJlc291cmNlcyk7Ci0JCQkJcmVzb3VyY2UuZ2V0Q29udGVudHMoKS5yZW1vdmUoZSk7Ci0JCQkJbW9kaWZpZWRSZXNvdXJjZXMuYWRkKHJlc291cmNlKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQotCQlTdHJpbmcgcGF0aDsKLQkJaWYgKE11bHRpRmlsZVNhdmVVdGlsLmhhc093bkZvbGRlcihlKSkgewotCQkJLy8gcGF0aCBpcyB0aGUgZGlyZWN0b3J5IG9mIHRoZSBNZXRob2RQbHVnaW4vUHJvY2Vzc0NvbXBvbmVudAotCQkJLy8KLQkJCXBhdGggPSBuZXcgRmlsZShyZXNvdXJjZS5nZXRGaW5hbFVSSSgpLnRvRmlsZVN0cmluZygpKS5nZXRQYXJlbnQoKTsKLQotCQkJLy8gdW5sb2FkL3JlbW92ZSBhbGwgcmVzb3VyY2VzIHVuZGVyIHRoZSBmb2xkZXIKLQkJCS8vCi0JCQlDb2xsZWN0aW9uIHVubG9hZGVkUmVzb3VyY2VzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJZG8gewotCQkJCXVubG9hZGVkUmVzb3VyY2VzLmNsZWFyKCk7Ci0JCQkJLy8gY29sbGVjdCBhbGwgcmVzb3VyY2VzIHdob3NlIHJvb3QgZWxlbWVudCBpcyBjb250YWluZWQgYnkgdGhlCi0JCQkJLy8gZ2l2ZW4gZWxlbWVudAotCQkJCS8vCi0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gbmV3IEFycmF5TGlzdChyZXNvdXJjZVNldC5nZXRSZXNvdXJjZXMoKSkKLQkJCQkJCS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJUmVzb3VyY2UgcmVzID0gKFJlc291cmNlKSBpdGVyLm5leHQoKTsKLQkJCQkJaWYgKHJlcy5pc0xvYWRlZCgpKSB7Ci0JCQkJCQlNZXRob2RFbGVtZW50IG1lID0gUGVyc2lzdGVuY2VVdGlsCi0JCQkJCQkJCS5nZXRNZXRob2RFbGVtZW50KHJlcyk7Ci0JCQkJCQlpZiAobWUgIT0gbnVsbCAmJiBVbWFVdGlsLmlzQ29udGFpbmVkQnkobWUsIGUpKSB7Ci0JCQkJCQkJdW5sb2FkZWRSZXNvdXJjZXMuYWRkKHJlcyk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gdW5sb2FkZWRSZXNvdXJjZXMuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJUmVzb3VyY2UgcmVzID0gKFJlc291cmNlKSBpdGVyLm5leHQoKTsKLQkJCQkJcmVzLnVubG9hZCgpOwotCQkJCX0KLQkJCQlyZXNvdXJjZVNldC5nZXRSZXNvdXJjZXMoKS5yZW1vdmVBbGwodW5sb2FkZWRSZXNvdXJjZXMpOwotCQkJfSB3aGlsZSAoIXVubG9hZGVkUmVzb3VyY2VzLmlzRW1wdHkoKSk7Ci0JCX0gZWxzZSB7Ci0JCQlwYXRoID0gcmVzb3VyY2UuZ2V0RmluYWxVUkkoKS50b0ZpbGVTdHJpbmcoKTsKLQkJfQotCi0JCXRyeSB7Ci0JCQlyZXNvdXJjZVNldC5jbGVhblVwKHJlc291cmNlLCBtb2RpZmllZFJlc291cmNlcyk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlMSkgewotCQkJQ29tbW9uUGx1Z2luLklOU1RBTkNFLmxvZyhlMSk7Ci0JCQlpZiAoTXVsdGlGaWxlU2F2ZVV0aWwuREVCVUcpIHsKLQkJCQllMS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQkJfQotCi0JCWRlbGV0ZUZpbGVzKGUsIHBhdGgsIHJlc291cmNlU2V0KTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZQotCSAqIEBwYXJhbSBvYmplY3RzV2l0aERpcmVjdFJlc291cmNlcwotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgZ2V0T2JqZWN0c1dpdGhEaXJlY3RSZXNvdXJjZXMoRU9iamVjdCBlLAotCQkJQ29sbGVjdGlvbiBvYmplY3RzV2l0aERpcmVjdFJlc291cmNlcykgewotCQlpZiAoVW1hVXRpbC5oYXNEaXJlY3RSZXNvdXJjZShlKSkgewotCQkJb2JqZWN0c1dpdGhEaXJlY3RSZXNvdXJjZXMuYWRkKGUpOwotCQl9IGVsc2UgewotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gZS5lQ29udGVudHMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlnZXRPYmplY3RzV2l0aERpcmVjdFJlc291cmNlcygoRU9iamVjdCkgaXRlci5uZXh0KCksCi0JCQkJCQlvYmplY3RzV2l0aERpcmVjdFJlc291cmNlcyk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy5JRmlsZUJhc2VkTGlicmFyeVBlcnNpc3RlciNkZWxldGUob3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGRlbGV0ZShNZXRob2RFbGVtZW50IGUpIHsKLQkJLy8gY29sbGVjdCBhbGwgZWxlbWVudHMgd2l0aCBkaXJlY3QgcmVzb3VyY2VzIHRoYXQgYXJlIHRoZSBnaXZlbiBlbGVtZW50Ci0JCS8vIG9yIGl0cyBvZmZzdHJpbmcKLQkJQXJyYXlMaXN0IGVsZW1lbnRzID0gbmV3IEFycmF5TGlzdCgpOwotCQlnZXRPYmplY3RzV2l0aERpcmVjdFJlc291cmNlcyhlLCBlbGVtZW50cyk7Ci0JCWRlbGV0ZUFuZFNhdmUoZWxlbWVudHMpOwotCX0KLQotCXByaXZhdGUgdm9pZCBkZWxldGVBbmRTYXZlKEFycmF5TGlzdCBlbGVtZW50cykgewotCQlpZiAoIWVsZW1lbnRzLmlzRW1wdHkoKSkgewotCQkJU2V0IG1vZGlmaWVkUmVzb3VyY2VzID0gbmV3IEhhc2hTZXQoKTsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGVsZW1lbnRzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCWRlbGV0ZSgoTWV0aG9kRWxlbWVudCkgaXRlci5uZXh0KCksIG1vZGlmaWVkUmVzb3VyY2VzKTsKLQkJCX0KLQotCQkJLy8gc2F2ZSBtb2RpZmllZCByZXNvdXJjZXMKLQkJCS8vCi0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBtb2RpZmllZFJlc291cmNlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlSZXNvdXJjZSByZXNvdXJjZSA9IChSZXNvdXJjZSkgaXRlci5uZXh0KCk7Ci0JCQkJdHJ5IHsKLQkJCQkJc2F2ZShyZXNvdXJjZSk7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCXRocm93IG5ldyBXcmFwcGVkRXhjZXB0aW9uKGV4KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSByZWxhdGl2ZSBwYXRoIG9mIHRoZSBmb2xkZXIgdGhhdCBjYW4gc3RvcmUgdGhlIGNvbnRlbnQgb2YgdGhlCi0JICogZ2l2ZW4gTWV0aG9kRWxlbWVudC4gVGhlIHBhdGggaXMgcmVsYXRpdmUgdG8gaXRzIHBsdWdpbiBmb2xkZXIgb3IgbGlicmFyeQotCSAqIGZvbGRlciBpZiB0aGUgZWxlbWVudCBjYW5ub3QgYmUgc3RvcmVkIGluIGEgcGx1Z2luLgotCSAqLwotCXByaXZhdGUgc3RhdGljIFN0cmluZyBzdGF0aWNHZXRGb2xkZXJSZWxhdGl2ZVBhdGgoTWV0aG9kRWxlbWVudCBlKSB7Ci0JCWlmIChlIGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luKSB7Ci0JCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJfSBlbHNlIGlmIChlIGluc3RhbmNlb2YgQ29udGVudEVsZW1lbnQpIHsKLQkJCXJldHVybiBzdGF0aWNHZXRGb2xkZXJQYXRoKGUuZUNsYXNzKCkpOwotCQl9IGVsc2UgaWYgKGUgaW5zdGFuY2VvZiBNZXRob2RDb25maWd1cmF0aW9uKSB7Ci0JCQlyZXR1cm4gTXVsdGlGaWxlU2F2ZVV0aWwuTUVUSE9EX0NPTkZJR1VSQVRJT05fRk9MREVSX05BTUU7Ci0JCX0KLQotCQlNZXRob2RVbml0IHVuaXQgPSBVbWFVdGlsLmdldE1ldGhvZFVuaXQoZSk7Ci0KLQkJaWYgKHVuaXQgaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50KSB7Ci0JCQlQcm9jZXNzIHByb2MgPSAoKFByb2Nlc3NDb21wb25lbnQpIHVuaXQpLmdldFByb2Nlc3MoKTsKLQkJCWlmIChwcm9jIGluc3RhbmNlb2YgQ2FwYWJpbGl0eVBhdHRlcm4pIHsKLQkJCQlyZXR1cm4gTXVsdGlGaWxlU2F2ZVV0aWwuQ0FQQUJJTElUWV9QQVRURVJOX1BBVEg7Ci0JCQl9IGVsc2UgaWYgKHByb2MgaW5zdGFuY2VvZiBEZWxpdmVyeVByb2Nlc3MpIHsKLQkJCQlyZXR1cm4gTXVsdGlGaWxlU2F2ZVV0aWwuREVMSVZFUllfUFJPQ0VTU19QQVRIOwotCQkJfQotCQl9IGVsc2UgaWYgKHVuaXQgaW5zdGFuY2VvZiBDb250ZW50RGVzY3JpcHRpb24pIHsKLQkJCXJldHVybiBzdGF0aWNHZXRGb2xkZXJSZWxhdGl2ZVBhdGgoKE1ldGhvZEVsZW1lbnQpIHVuaXQKLQkJCQkJLmVDb250YWluZXIoKSk7Ci0JCX0KLQotCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEZvbGRlclJlbGF0aXZlUGF0aChNZXRob2RFbGVtZW50IGUpIHsKLQkJcmV0dXJuIHN0YXRpY0dldEZvbGRlclJlbGF0aXZlUGF0aChlKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5JRmlsZUJhc2VkTGlicmFyeVBlcnNpc3RlciNnZXRXYXJuaW5ncygpCi0JICovCi0JcHVibGljIExpc3QgZ2V0V2FybmluZ3MoKSB7Ci0JCWlmICh3YXJuaW5ncyA9PSBudWxsKSB7Ci0JCQl3YXJuaW5ncyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJfQotCQlyZXR1cm4gd2FybmluZ3M7Ci0JfQotCi0Jc3RhdGljIGNsYXNzIEZhaWxTYWZlUGVyc2lzdGVyIGV4dGVuZHMgTWV0aG9kTGlicmFyeVBlcnNpc3RlciBpbXBsZW1lbnRzCi0JCQlGYWlsU2FmZU1ldGhvZExpYnJhcnlQZXJzaXN0ZXIgewotCi0JCXByaXZhdGUgTWFwIHNhdmVPcHRpb25zOwotCi0JCXByaXZhdGUgVHhSZWNvcmQgdHhSZWNvcmQgPSBuZXcgVHhSZWNvcmQoKSB7Ci0JCQkvKgotCQkJICogKG5vbi1KYXZhZG9jKQotCQkJICogCi0JCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5UeFJlY29yZCNjbGVhcigpCi0JCQkgKi8KLQkJCXB1YmxpYyB2b2lkIGNsZWFyKCkgewotCQkJCWlmICh3YXJuaW5ncyAhPSBudWxsICYmICF3YXJuaW5ncy5pc0VtcHR5KCkpIHsKLQkJCQkJLy8gY29weSB0aGUgd2FybmluZyB0byBwZXJzaXN0ZXIKLQkJCQkJLy8KLQkJCQkJRmFpbFNhZmVQZXJzaXN0ZXIudGhpcy53YXJuaW5ncyA9IENvbGxlY3Rpb25zCi0JCQkJCQkJLnVubW9kaWZpYWJsZUxpc3Qod2FybmluZ3MpOwotCQkJCX0KLQkJCQlzdXBlci5jbGVhcigpOwotCQkJfQotCQl9OwotCi0JCXByaXZhdGUgTWFwIGVsZW1lbnRUb0luZm9NYXBUb0RlbGV0ZUZpbGVzOwotCi0JCXB1YmxpYyBGYWlsU2FmZVBlcnNpc3RlcigpIHsKLQkJCXNhdmVPcHRpb25zID0gbmV3IEhhc2hNYXAoCi0JCQkJCU11bHRpRmlsZVJlc291cmNlU2V0SW1wbC5ERUZBVUxUX1NBVkVfT1BUSU9OUyk7Ci0JCQl0eFJlY29yZCA9IG5ldyBUeFJlY29yZCgpOwotCQkJc2F2ZU9wdGlvbnMucHV0KE11bHRpRmlsZVhNSVNhdmVJbXBsLlRYX1JFQ09SRCwgdHhSZWNvcmQpOwotCQkJZWxlbWVudFRvSW5mb01hcFRvRGVsZXRlRmlsZXMgPSBuZXcgSGFzaE1hcCgpOwotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UuTWV0aG9kTGlicmFyeVBlcnNpc3RlciNnZXRXYXJuaW5ncygpCi0JCSAqLwotCQlwdWJsaWMgTGlzdCBnZXRXYXJuaW5ncygpIHsKLQkJCWlmICh0eFJlY29yZC5nZXRUeElEKCkgPT0gbnVsbCkgewotCQkJCXJldHVybiBzdXBlci5nZXRXYXJuaW5ncygpOwotCQkJfQotCQkJcmV0dXJuIHR4UmVjb3JkLmdldFdhcm5pbmdzKCk7Ci0JCX0KLQotCQlwdWJsaWMgTWFwIGdldFNhdmVPcHRpb25zKCkgewotCQkJcmV0dXJuIHNhdmVPcHRpb25zOwotCQl9Ci0KLQkJdm9pZCBjaGVja01vdmUoUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJCS8vIGRpc2FsbG93IG5ldyBvcGVyYXRpb24gb24gcmVzb3VyY2Ugd2hpY2ggaGFzIHN0YXJ0ZWQgb3BlcmF0aW9uCi0JCQkvLyB0aGF0IGlzIG5vdCBjb21taXR0ZWQKLQkJCU11bHRpRmlsZVhNSVJlc291cmNlSW1wbCBtZlJlc291cmNlID0gKE11bHRpRmlsZVhNSVJlc291cmNlSW1wbCkgcmVzb3VyY2U7Ci0JCQlpZiAobWZSZXNvdXJjZS50eFN0YXJ0ZWQoKSkgewotCQkJCXRocm93IG5ldyBNdWx0aUZpbGVJT0V4Y2VwdGlvbihOTFMuYmluZCgKLQkJCQkJCVBlcnNpc3RlbmNlUmVzb3VyY2VzLm1vdmVSZXNvdXJjZUVycm9yX21zZywgcmVzb3VyY2UpKTsKLQkJCX0JCQkKLQkJfQkJCQkKLQkJCi0JCS8qKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEucGVyc2lzdGVuY2UuTWV0aG9kTGlicmFyeVBlcnNpc3RlciNzYXZlKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZSkKLQkJICovCi0JCXB1YmxpYyB2b2lkIHNhdmUoUmVzb3VyY2UgcmVzb3VyY2UpIHRocm93cyBFeGNlcHRpb24gewotCQkJaWYocmVzb3VyY2UuZ2V0UmVzb3VyY2VTZXQoKSBpbnN0YW5jZW9mIE11bHRpRmlsZVJlc291cmNlU2V0SW1wbCAmJgotCQkJCQlyZXNvdXJjZSBpbnN0YW5jZW9mIE11bHRpRmlsZVhNSVJlc291cmNlSW1wbCkgewotCQkJCU11bHRpRmlsZVJlc291cmNlU2V0SW1wbCByZXNvdXJjZVNldCA9IChNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwpIHJlc291cmNlCi0JCQkJLmdldFJlc291cmNlU2V0KCk7Ci0JCQkJaWYgKHJlc291cmNlU2V0ID09IG51bGwpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQotCQkJCS8vIHVwZGF0ZSB2ZXJzaW9uIGluZm8gaW4gbGlicmFyeSByZXNvdXJjZSBpZiBuZWVkZWQKLQkJCQkvLwotCQkJCVJlc291cmNlIGxpYlJlc291cmNlVG9TYXZlID0gbnVsbDsKLQkJCQlNZXRob2RFbGVtZW50IG1lID0gUGVyc2lzdGVuY2VVdGlsLmdldE1ldGhvZEVsZW1lbnQocmVzb3VyY2UpOwotCQkJCWlmKG1lICE9IG51bGwpIHsKLQkJCQkJTWV0aG9kTGlicmFyeSBsaWIgPSBVbWFVdGlsLmdldE1ldGhvZExpYnJhcnkobWUpOwotCQkJCQlpZihsaWIgIT0gbnVsbCkgewotCQkJCQkJUmVzb3VyY2UgbGliUmVzb3VyY2UgPSBsaWIuZVJlc291cmNlKCk7Ci0JCQkJCQlpZihsaWJSZXNvdXJjZSAhPSBudWxsIAotCQkJCQkJCQkmJiBsaWJSZXNvdXJjZSAhPSByZXNvdXJjZQotCQkJCQkJCQkmJiBQZXJzaXN0ZW5jZVV0aWwuY2hlY2tUb29sVmVyc2lvbihsaWJSZXNvdXJjZSkgIT0gMCkgewotCQkJCQkJCWxpYlJlc291cmNlVG9TYXZlID0gbGliUmVzb3VyY2U7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQlpZiAoTXVsdGlGaWxlWE1JU2F2ZUltcGwuY2hlY2tNb2RpZnlSZXF1aXJlZChzYXZlT3B0aW9ucykpIHsKLQkJCQkJQ29sbGVjdGlvbjxSZXNvdXJjZT4gcmVzb3VyY2VzOwotCQkJCQlpZihsaWJSZXNvdXJjZVRvU2F2ZSAhPSBudWxsKSB7Ci0JCQkJCQlyZXNvdXJjZXMgPSBuZXcgQXJyYXlMaXN0PFJlc291cmNlPigpOwotCQkJCQkJcmVzb3VyY2VzLmFkZChyZXNvdXJjZSk7Ci0JCQkJCQlyZXNvdXJjZXMuYWRkKGxpYlJlc291cmNlVG9TYXZlKTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCXJlc291cmNlcyA9IENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QocmVzb3VyY2UpOwotCQkJCQl9Ci0JCQkJCU11bHRpRmlsZVNhdmVVdGlsLmNoZWNrTW9kaWZ5KHJlc291cmNlcyk7Ci0JCQkJCQotCQkJCQkvLyBjaGVjayBvdXQtb2Ytc3luYwotCQkJCQkvLwotCQkJCQlNdWx0aUZpbGVTYXZlVXRpbC5jaGVja091dE9mU3luY2gocmVzb3VyY2VzLCBzYXZlT3B0aW9ucyk7Ci0JCQkJCQotCQkJCQlNdWx0aUZpbGVTYXZlVXRpbC5jaGVja0ZpbGVQYXRoTGVuZ3RoKHJlc291cmNlcyk7Ci0JCQkJfQotCi0JCQkJcmVzb3VyY2VTZXQuc2F2ZShyZXNvdXJjZSwgc2F2ZU9wdGlvbnMpOwotCQkJCWlmKGxpYlJlc291cmNlVG9TYXZlICE9IG51bGwpIHsKLQkJCQkJcmVzb3VyY2VTZXQuc2F2ZShsaWJSZXNvdXJjZVRvU2F2ZSwgc2F2ZU9wdGlvbnMpOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgaWYocmVzb3VyY2UgaW5zdGFuY2VvZiBJRmFpbFNhZmVTYXZhYmxlKSB7Ci0JCQkJSUZhaWxTYWZlU2F2YWJsZSBmYWlsU2FmZVNhdmFibGUgPSAoSUZhaWxTYWZlU2F2YWJsZSkgcmVzb3VyY2U7Ci0JCQkJZmFpbFNhZmVTYXZhYmxlLnNldFR4SUQodHhSZWNvcmQuZ2V0VHhJRCgpKTsKLQkJCQlyZXNvdXJjZS5zYXZlKHNhdmVPcHRpb25zKTsKLQkJCQl0eFJlY29yZC5nZXRSZXNvdXJjZXNUb0NvbW1pdCgpLmFkZChyZXNvdXJjZSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbigiUmVzb3VyY2UgbXVzdCBpbXBsZW1lbnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UuaW50ZXJuYWwuSUZhaWxTYWZlU2F2YWJsZSIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQotCQkvKioKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnBlcnNpc3RlbmNlLk1ldGhvZExpYnJhcnlQZXJzaXN0ZXIjYWRqdXN0TG9jYXRpb24ob3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlKQotCQkgKi8KLQkJcHVibGljIHZvaWQgYWRqdXN0TG9jYXRpb24oUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJCWNoZWNrTW92ZShyZXNvdXJjZSk7Ci0JCQlTZXQgbW9kaWZpZWRSZXNvdXJjZXMgPSBuZXcgSGFzaFNldCgpOwotCQkJaWYgKE11bHRpRmlsZVNhdmVVdGlsLnByZXBhcmVBZGp1c3RMb2NhdGlvbigKLQkJCQkJKE11bHRpRmlsZVhNSVJlc291cmNlSW1wbCkgcmVzb3VyY2UsIG1vZGlmaWVkUmVzb3VyY2VzKSkgewotCQkJCXR4UmVjb3JkLmdldFJlc291cmNlc1RvQ29tbWl0KCkuYWRkKHJlc291cmNlKTsKLQkJCQkKLQkJCQlIYXNoU2V0IHJlc291cmNlc1RvQ2hlY2sgPSBuZXcgSGFzaFNldChtb2RpZmllZFJlc291cmNlcyk7Ci0JCQkJcmVzb3VyY2VzVG9DaGVjay5hZGRBbGwocmVzb3VyY2VzVG9DaGVjayk7Ci0JCQkJTXVsdGlGaWxlU2F2ZVV0aWwuY2hlY2tNb2RpZnkocmVzb3VyY2VzVG9DaGVjayk7Ci0JCQkJCi0JCQkJaWYgKCFtb2RpZmllZFJlc291cmNlcy5pc0VtcHR5KCkpIHsJCQotCQkJCQkKLQkJCQkJTXVsdGlGaWxlU2F2ZVV0aWwuY2hlY2tPdXRPZlN5bmNoKG1vZGlmaWVkUmVzb3VyY2VzLCBzYXZlT3B0aW9ucyk7Ci0KLQkJCQkJLy8gc2F2ZSB0aGUgbW9kaWZpZWQgcmVzb3VyY2VzCi0JCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IG1vZGlmaWVkUmVzb3VyY2VzLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJdHJ5IHsKLQkJCQkJCQlzYXZlKChSZXNvdXJjZSkgaXRlci5uZXh0KCkpOwotCQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQlQZXJzaXN0ZW5jZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkJCQkJdGhyb3cgbmV3IE11bHRpRmlsZUlPRXhjZXB0aW9uKGUudG9TdHJpbmcoKSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQljb21taXQoKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGFkanVzdExvY2F0aW9uKENvbGxlY3Rpb24gcmVzb3VyY2VzKSB7Ci0JCQlpZiAocmVzb3VyY2VzID09IG51bGwgfHwgcmVzb3VyY2VzLmlzRW1wdHkoKSkgewotCQkJCXJldHVybjsKLQkJCX0KLQotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gcmVzb3VyY2VzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCWNoZWNrTW92ZSgoUmVzb3VyY2UpIGl0ZXIubmV4dCgpKTsKLQkJCX0KLQotCQkJU2V0IG1vZGlmaWVkUmVzb3VyY2VzID0gbmV3IEhhc2hTZXQoKTsKLQkJCUhhc2hTZXQgcmVzb3VyY2VzVG9DaGVjayA9IG5ldyBIYXNoU2V0KCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSByZXNvdXJjZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsIHJlc291cmNlID0gKE11bHRpRmlsZVhNSVJlc291cmNlSW1wbCkgaXRlcgotCQkJCQkJLm5leHQoKTsKLQkJCQlpZiAoTXVsdGlGaWxlU2F2ZVV0aWwucHJlcGFyZUFkanVzdExvY2F0aW9uKAotCQkJCQkJKE11bHRpRmlsZVhNSVJlc291cmNlSW1wbCkgcmVzb3VyY2UsIG1vZGlmaWVkUmVzb3VyY2VzKSkgewotCQkJCQl0eFJlY29yZC5nZXRSZXNvdXJjZXNUb0NvbW1pdCgpLmFkZChyZXNvdXJjZSk7Ci0JCQkJCXJlc291cmNlc1RvQ2hlY2suYWRkKHJlc291cmNlKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCXJlc291cmNlc1RvQ2hlY2suYWRkQWxsKG1vZGlmaWVkUmVzb3VyY2VzKTsKLQkJCWlmKCFyZXNvdXJjZXNUb0NoZWNrLmlzRW1wdHkoKSkgewotCQkJCU11bHRpRmlsZVNhdmVVdGlsLmNoZWNrTW9kaWZ5KHJlc291cmNlc1RvQ2hlY2spOwotCQkJfQkJCQotCQkJaWYgKCFtb2RpZmllZFJlc291cmNlcy5pc0VtcHR5KCkpIHsKLQkJCQlNdWx0aUZpbGVTYXZlVXRpbC5jaGVja091dE9mU3luY2gobW9kaWZpZWRSZXNvdXJjZXMsIHNhdmVPcHRpb25zKTsKLQotCQkJCS8vIHNhdmUgdGhlIG1vZGlmaWVkIHJlc291cmNlcwotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IG1vZGlmaWVkUmVzb3VyY2VzLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlzYXZlKChSZXNvdXJjZSkgaXRlci5uZXh0KCkpOwotCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJQ29tbW9uUGx1Z2luLklOU1RBTkNFLmxvZyhlKTsKLQkJCQkJCXRocm93IG5ldyBNdWx0aUZpbGVJT0V4Y2VwdGlvbihlLnRvU3RyaW5nKCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJY29tbWl0KCk7Ci0JCX0KLQotCQkvKioKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnBlcnNpc3RlbmNlLk1ldGhvZExpYnJhcnlQZXJzaXN0ZXIjZGVsZXRlRmlsZXMob3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50LAotCQkgKiAgICAgIGphdmEubGFuZy5TdHJpbmcsIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldCkKLQkJICovCi0JCXByb3RlY3RlZCB2b2lkIGRlbGV0ZUZpbGVzKE1ldGhvZEVsZW1lbnQgZSwgU3RyaW5nIHBhdGgsCi0JCQkJUmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQpIHsKLQkJCS8vIGtlZXAgdGhlIGluZm8gdG8gcmVhbGx5IGRlbGV0ZSB0aGUgZmlsZXMgaW4gY29tbWl0KCkKLQkJCWVsZW1lbnRUb0luZm9NYXBUb0RlbGV0ZUZpbGVzLnB1dChlLCBuZXcgT2JqZWN0W10geyBwYXRoLAotCQkJCQlyZXNvdXJjZVNldCB9KTsKLQkJfQotCi0JCXByaXZhdGUgdm9pZCBzdXBlckRlbGV0ZUZpbGVzKE1ldGhvZEVsZW1lbnQgZSwgU3RyaW5nIHBhdGgsCi0JCQkJUmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQpIHsKLQkJCXN1cGVyLmRlbGV0ZUZpbGVzKGUsIHBhdGgsIHJlc291cmNlU2V0KTsKLQkJfQotCi0JCS8qKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5JRmlsZUJhc2VkTGlicmFyeVBlcnNpc3Rlci5GYWlsU2FmZU1ldGhvZExpYnJhcnlQZXJzaXN0ZXIjY29tbWl0KCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIGNvbW1pdCgpIHsKLQkJCS8vIHNhdmUgaXMgZG9uZQotCQkJLy8gY2FsbCBzYXZlSXNEb25lKCkgb24gZXZlcnkgc2F2ZWQgZmlsZSB0byByZW5hbWUgaXQgdG8gdGhlIGNvcnJlY3QKLQkJCS8vIG5hbWUKLQkJCWludCBzaXplID0gdHhSZWNvcmQuZ2V0UmVzb3VyY2VzVG9Db21taXQoKS5zaXplKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCSgoSUZhaWxTYWZlU2F2YWJsZSkgdHhSZWNvcmQuZ2V0UmVzb3VyY2VzVG9Db21taXQoKQotCQkJCQkJLmdldChpKSkuY29tbWl0KCk7Ci0JCQl9Ci0KLQkJCS8vIG5vdGlmeSBhbGwgY29tbWl0ZWQgcmVzb3VyY2VzIHRoYXQgdGhlIHRyYW5zYWN0aW9uIGlzIGRvbmUKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJKChJRmFpbFNhZmVTYXZhYmxlKSB0eFJlY29yZC5nZXRSZXNvdXJjZXNUb0NvbW1pdCgpCi0JCQkJCQkuZ2V0KGkpKS50eEZpbmlzaGVkKHRydWUpOwotCQkJfQotCi0JCQkvLyBkZWxldGUgYmFja3VwCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCSgoSUZhaWxTYWZlU2F2YWJsZSkgdHhSZWNvcmQuZ2V0UmVzb3VyY2VzVG9Db21taXQoKQotCQkJCQkJLmdldChpKSkuZGVsZXRlQmFja3VwKCk7Ci0JCQl9Ci0KLQkJCXR4UmVjb3JkLmNsZWFyKCk7Ci0KLQkJCS8vIGRlbGV0ZSBmaWxlcyBvZiBkZWxldGVkIGVsZW1lbnRzCi0JCQkvLwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gZWxlbWVudFRvSW5mb01hcFRvRGVsZXRlRmlsZXMuZW50cnlTZXQoKQotCQkJCQkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSkgaXRlci5uZXh0KCk7Ci0JCQkJT2JqZWN0W10gaW5mbyA9IChPYmplY3RbXSkgZW50cnkuZ2V0VmFsdWUoKTsKLQkJCQlTdHJpbmcgcGF0aCA9IChTdHJpbmcpIGluZm9bMF07Ci0JCQkJdHJ5IHsKLQkJCQkJc3VwZXJEZWxldGVGaWxlcygoTWV0aG9kRWxlbWVudCkgZW50cnkuZ2V0S2V5KCksIHBhdGgsCi0JCQkJCQkJKFJlc291cmNlU2V0KSBpbmZvWzFdKTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQlpZiAoZSBpbnN0YW5jZW9mIFdyYXBwZWRFeGNlcHRpb24pIHsKLQkJCQkJCWUgPSAoKFdyYXBwZWRFeGNlcHRpb24pIGUpLmV4Y2VwdGlvbigpOwotCQkJCQl9Ci0JCQkJCVN0cmluZyBtc2cgPSBQZXJzaXN0ZW5jZVJlc291cmNlcy5FcnJNc2dfQ291bGROb3REZWxldGU7Ci0JCQkJCVN0cmluZyBvdGhlck1zZyA9IG51bGw7Ci0JCQkJCWlmIChlIGluc3RhbmNlb2YgQ29yZUV4Y2VwdGlvbikgewotCQkJCQkJSVN0YXR1cyBzdGF0dXMgPSAoKENvcmVFeGNlcHRpb24pIGUpLmdldFN0YXR1cygpOwotCQkJCQkJaWYgKHN0YXR1cyAhPSBudWxsKSB7Ci0JCQkJCQkJb3RoZXJNc2cgPSBVbWFVdGlsLmdldE1lc3NhZ2Uoc3RhdHVzKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlpZiAob3RoZXJNc2cgPT0gbnVsbCkgewotCQkJCQkJb3RoZXJNc2cgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJCW1zZyA9IE1lc3NhZ2VGb3JtYXQuZm9ybWF0KG1zZywgbmV3IE9iamVjdFtdIHsgcGF0aCwKLQkJCQkJCQlvdGhlck1zZyB9KTsKLQkJCQkJZSA9IG5ldyBFeGNlcHRpb24obXNnLCBlKTsKLQkJCQkJZ2V0V2FybmluZ3MoKS5hZGQoZSk7Ci0JCQkJCUNvbW1vblBsdWdpbi5JTlNUQU5DRS5sb2coZSk7Ci0JCQkJCWlmIChNdWx0aUZpbGVTYXZlVXRpbC5ERUJVRykgewotCQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWVsZW1lbnRUb0luZm9NYXBUb0RlbGV0ZUZpbGVzLmNsZWFyKCk7Ci0JCX0KLQotCQkvKioKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuSUZpbGVCYXNlZExpYnJhcnlQZXJzaXN0ZXIuRmFpbFNhZmVNZXRob2RMaWJyYXJ5UGVyc2lzdGVyI3JvbGxiYWNrKCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIHJvbGxiYWNrKCkgewotCQkJaWYgKCF0eFJlY29yZC5nZXRSZXNvdXJjZXNUb0NvbW1pdCgpLmlzRW1wdHkoKSkgewotCQkJCXRyeSB7Ci0JCQkJCWludCBtYXggPSB0eFJlY29yZC5nZXRSZXNvdXJjZXNUb0NvbW1pdCgpLnNpemUoKSAtIDE7Ci0JCQkJCUFycmF5TGlzdCByZXN0b3JlZFJlc291cmNlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQkJCQkvLyBTb21ldGhpbmcgd2VudCB3cm9uZywgcmVzdG9yZSBmcm9tIGJhY2t1cAotCQkJCQlmb3IgKGludCBpID0gbWF4OyBpID4gLTE7IGktLSkgewotCQkJCQkJSUZhaWxTYWZlU2F2YWJsZSByZXNvdXJjZSA9IChJRmFpbFNhZmVTYXZhYmxlKSB0eFJlY29yZAotCQkJCQkJCQkuZ2V0UmVzb3VyY2VzVG9Db21taXQoKS5nZXQoaSk7Ci0JCQkJCQlpZiAocmVzb3VyY2UucmVzdG9yZSgpKSB7Ci0JCQkJCQkJcmVzdG9yZWRSZXNvdXJjZXMuYWRkKHJlc291cmNlKTsKLQkJCQkJCX0KLQkJCQkJfQotCi0JCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHJlc3RvcmVkUmVzb3VyY2VzLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSAoUmVzb3VyY2UpIGl0ZXIKLQkJCQkJCQkJLm5leHQoKTsKLQkJCQkJCXJlc291cmNlLnNldE1vZGlmaWVkKHRydWUpOwotCQkJCQl9Ci0KLQkJCQkJLy8gZGVsZXRlIHRlbXAgZmlsZXMKLQkJCQkJZm9yIChpbnQgaSA9IG1heDsgaSA+IC0xOyBpLS0pIHsKLQkJCQkJCVJlc291cmNlIHJlc291cmNlID0gKFJlc291cmNlKSB0eFJlY29yZAotCQkJCQkJCQkuZ2V0UmVzb3VyY2VzVG9Db21taXQoKS5nZXQoaSk7Ci0JCQkJCQlpZiAoKChJRmFpbFNhZmVTYXZhYmxlKXJlc291cmNlKS5oYXNUZW1wVVJJKCkpIHsKLQkJCQkJCQkvLyB1cmkga2VlcHMgdGhlIHBhdGggdG8gdGVtcCBmaWxlCi0JCQkJCQkJdHJ5IHsKLQkJCQkJCQkJbmV3IEZpbGUocmVzb3VyY2UuZ2V0VVJJKCkudG9GaWxlU3RyaW5nKCkpCi0JCQkJCQkJCQkJLmRlbGV0ZSgpOwotCQkJCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJCUNvbW1vblBsdWdpbi5JTlNUQU5DRS5sb2coZSk7Ci0JCQkJCQkJCWlmIChNdWx0aUZpbGVTYXZlVXRpbC5ERUJVRykgewotCQkJCQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCi0JCQkJCS8vIG5vdGlmeSBhbGwgY29tbWl0ZWQgcmVzb3VyY2VzIHRoYXQgdGhlIHRyYW5zYWN0aW9uIGlzCi0JCQkJCS8vIGRvbmUKLQkJCQkJZm9yIChpbnQgaSA9IG1heDsgaSA+IC0xOyBpLS0pIHsKLQkJCQkJCSgoSUZhaWxTYWZlU2F2YWJsZSkgdHhSZWNvcmQKLQkJCQkJCQkJLmdldFJlc291cmNlc1RvQ29tbWl0KCkuZ2V0KGkpKQotCQkJCQkJCQkudHhGaW5pc2hlZChmYWxzZSk7Ci0JCQkJCX0KLQotCQkJCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkJCQlDb21tb25QbHVnaW4uSU5TVEFOQ0UubG9nKGUpOwotCQkJCQlpZiAoTXVsdGlGaWxlU2F2ZVV0aWwuREVCVUcpIHsKLQkJCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJCX0KLQkJCQkJdGhyb3cgZTsKLQkJCQl9Ci0JCQl9Ci0JCQl0eFJlY29yZC5jbGVhcigpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzLklGaWxlQmFzZWRMaWJyYXJ5UGVyc2lzdGVyI2dldEZhaWxTYWZlUGVyc2lzdGVyKCkKLQkJICovCi0JCXB1YmxpYyBGYWlsU2FmZU1ldGhvZExpYnJhcnlQZXJzaXN0ZXIgZ2V0RmFpbFNhZmVQZXJzaXN0ZXIoKSB7Ci0JCQlyZXR1cm4gdGhpczsKLQkJfQotCi0JCS8qKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5JRmlsZUJhc2VkTGlicmFyeVBlcnNpc3Rlci5GYWlsU2FmZU1ldGhvZExpYnJhcnlQZXJzaXN0ZXIjZ2V0Q3VycmVudFR4SUQoKQotCQkgKi8KLQkJcHVibGljIFN0cmluZyBnZXRDdXJyZW50VHhJRCgpIHsKLQkJCXJldHVybiB0eFJlY29yZC5nZXRUeElEKCk7Ci0JCX0KLQotCX0KLQotCUZhaWxTYWZlUGVyc2lzdGVyIGdldEZhaWxTYWZlUGVyc2lzdGVyKE1hcCBvcHRpb25zKSB7Ci0JCUZhaWxTYWZlUGVyc2lzdGVyIHBlcnNpc3RlciA9IG5ldyBGYWlsU2FmZVBlcnNpc3RlcigpOwotCQlwZXJzaXN0ZXIuc2F2ZU9wdGlvbnMucHV0QWxsKG9wdGlvbnMpOwotCi0JCS8vIG1ha2Ugc3VyZSB0aGF0IFRYX1JFQ09SRCBzdGlsbCBrZWVwcyB0aGUgY29ycmVjdCB2YWx1ZQotCQlwZXJzaXN0ZXIuc2F2ZU9wdGlvbnMucHV0KE11bHRpRmlsZVhNSVNhdmVJbXBsLlRYX1JFQ09SRCwKLQkJCQlwZXJzaXN0ZXIudHhSZWNvcmQpOwotCi0JCXJldHVybiBwZXJzaXN0ZXI7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuSUZpbGVCYXNlZExpYnJhcnlQZXJzaXN0ZXIjaGFzT3duRm9sZGVyKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzT3duRm9sZGVyKE9iamVjdCBlKSB7Ci0JCXJldHVybiBNdWx0aUZpbGVTYXZlVXRpbC5oYXNPd25Gb2xkZXIoZSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuSUZpbGVCYXNlZExpYnJhcnlQZXJzaXN0ZXIjaGFzT3duUmVzb3VyY2UoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNPd25SZXNvdXJjZShPYmplY3QgZSkgewotCQlyZXR1cm4gTXVsdGlGaWxlU2F2ZVV0aWwuaGFzT3duUmVzb3VyY2UoZSwKLQkJCQlNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwuREVGQVVMVF9TQVZFX1NFUEFSQVRFTFlfQ0xBU1NfU0VUKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy5JRmlsZUJhc2VkTGlicmFyeVBlcnNpc3RlciNnZXRGYWlsU2FmZVBlcnNpc3RlcigpCi0JICovCi0JcHVibGljIEZhaWxTYWZlTWV0aG9kTGlicmFyeVBlcnNpc3RlciBnZXRGYWlsU2FmZVBlcnNpc3RlcigpIHsKLQkJcmV0dXJuIG5ldyBGYWlsU2FmZVBlcnNpc3RlcigpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgY2xhc3MgTm9uRmFpbFNhZmVQZXJzaXN0ZXIgZXh0ZW5kcyBNZXRob2RMaWJyYXJ5UGVyc2lzdGVyCi0JCQlpbXBsZW1lbnRzIEZhaWxTYWZlTWV0aG9kTGlicmFyeVBlcnNpc3RlciB7Ci0JCXByaXZhdGUgTWFwIHNhdmVPcHRpb25zID0gbmV3IEhhc2hNYXAoKTsKLQotCQkvKioKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuSUZpbGVCYXNlZExpYnJhcnlQZXJzaXN0ZXIuRmFpbFNhZmVNZXRob2RMaWJyYXJ5UGVyc2lzdGVyI2NvbW1pdCgpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBjb21taXQoKSB7Ci0JCQkvLyBkbyBub3RoaW5nCi0JCX0KLQotCQkvKioKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuSUZpbGVCYXNlZExpYnJhcnlQZXJzaXN0ZXIuRmFpbFNhZmVNZXRob2RMaWJyYXJ5UGVyc2lzdGVyI3JvbGxiYWNrKCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIHJvbGxiYWNrKCkgewotCQkJLy8gZG8gbm90aGluZwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLklGaWxlQmFzZWRMaWJyYXJ5UGVyc2lzdGVyLkZhaWxTYWZlTWV0aG9kTGlicmFyeVBlcnNpc3RlciNnZXRDdXJyZW50VHhJRCgpCi0JCSAqLwotCQlwdWJsaWMgU3RyaW5nIGdldEN1cnJlbnRUeElEKCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQkvKioKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuSUZpbGVCYXNlZExpYnJhcnlQZXJzaXN0ZXIuRmFpbFNhZmVNZXRob2RMaWJyYXJ5UGVyc2lzdGVyI2FkanVzdExvY2F0aW9uKGphdmEudXRpbC5Db2xsZWN0aW9uKQotCQkgKi8KLQkJcHVibGljIHZvaWQgYWRqdXN0TG9jYXRpb24oQ29sbGVjdGlvbiByZXNvdXJjZXMpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHJlc291cmNlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlhZGp1c3RMb2NhdGlvbigoUmVzb3VyY2UpIGl0ZXIubmV4dCgpKTsKLQkJCX0KLQkJfQotCi0JCXB1YmxpYyBNYXAgZ2V0U2F2ZU9wdGlvbnMoKSB7Ci0JCQlyZXR1cm4gc2F2ZU9wdGlvbnM7Ci0JCX0KLQotCX0KLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIEZhaWxTYWZlTWV0aG9kTGlicmFyeVBlcnNpc3RlciBub25GYWlsU2FmZVBlcnNpc3RlciA9IG5ldyBOb25GYWlsU2FmZVBlcnNpc3RlcigpOwotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuSUZpbGVCYXNlZExpYnJhcnlQZXJzaXN0ZXIjZ2V0RmlsZUV4dGVuc2lvbihqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RmlsZUV4dGVuc2lvbihPYmplY3QgZSkgewotCQlyZXR1cm4gTXVsdGlGaWxlU2F2ZVV0aWwuREVGQVVMVF9GSUxFX0VYVEVOU0lPTjsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuSUZpbGVCYXNlZExpYnJhcnlQZXJzaXN0ZXIjc2F2ZShvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQpCi0JICovCi0JcHVibGljIHZvaWQgc2F2ZShNZXRob2RFbGVtZW50IGVsZW1lbnQpIHRocm93cyBFeGNlcHRpb24gewotCQlpZighaGFzT3duUmVzb3VyY2VXaXRob3V0UmVmZXJyZXIoZWxlbWVudCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQlNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwgcmVzb3VyY2VTZXQgPSAoTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsKSBVbWFVdGlsLmdldE1ldGhvZExpYnJhcnkoZWxlbWVudCkuZVJlc291cmNlKCkuZ2V0UmVzb3VyY2VTZXQoKTsKLQkJTWFwIG9wdGlvbnMgPSByZXNvdXJjZVNldC5nZXREZWZhdWx0U2F2ZU9wdGlvbnMoKTsgCi0JCVJlc291cmNlIHJlcyA9ICgoSW50ZXJuYWxFT2JqZWN0KWVsZW1lbnQpLmVEaXJlY3RSZXNvdXJjZSgpOwotCQlNdWx0aUZpbGVYTUlSZXNvdXJjZUltcGwgcmVzb3VyY2U7Ci0JCWlmKHJlcyBpbnN0YW5jZW9mIE11bHRpRmlsZVhNSVJlc291cmNlSW1wbCkgewotCQkJcmVzb3VyY2UgPSAoTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsKSByZXM7Ci0JCQlyZXNvdXJjZVNldC5zYXZlKHJlc291cmNlLCBvcHRpb25zKTsKLQkJfQotCQllbHNlIHsKLQkJCVVSSSB1cmkgPSBNdWx0aUZpbGVTYXZlVXRpbC5jcmVhdGVVUkkoZWxlbWVudCwgcmVzb3VyY2VTZXQpOwotCQkJcmVzb3VyY2UgPSBNdWx0aUZpbGVTYXZlVXRpbC5zYXZlKHJlc291cmNlU2V0LCBlbGVtZW50LCB1cmksIG9wdGlvbnMsIGZhbHNlKTsKLQkJfQotCQlyZXNvdXJjZS51cGRhdGVUaW1lU3RhbXBzKCk7Ci0JCQotCQlTdHJpbmcgc3RyID0gKFN0cmluZykgb3B0aW9ucy5nZXQoTXVsdGlGaWxlWE1JU2F2ZUltcGwuUkVGUkVTSF9ORVdfUkVTT1VSQ0UpOwotCQlpZiAoc3RyICE9IG51bGwgJiYgQm9vbGVhbi52YWx1ZU9mKHN0cikuYm9vbGVhblZhbHVlKCkpIHsKLQkJCS8vIG5vdGlmeSBSZWZyZXNoSm9iIHRoZSB0aGlzIHJlc291cmNlIGlzIHNhdmVkIHNvIGl0IHdpbGwgbm90IGJlCi0JCQkvLyByZWxvYWRlZCBhZnRlciByZWZyZXNoaW5nIGl0Ci0JCQkvLwotCQkJUmVmcmVzaEpvYi5nZXRJbnN0YW5jZSgpLnJlc291cmNlU2F2ZWQocmVzb3VyY2UpOwotCi0JCQkvLyByZWZyZXNoIHRoZSBuZXdseSBjcmVhdGVkIHJlc291cmNlIHNvIGl0IGlzIGluIHN5bmNoIHdpdGggdGhlCi0JCQkvLyB3b3Jrc3BhY2UKLQkJCS8vCi0JCQlGaWxlTWFuYWdlci5nZXRJbnN0YW5jZSgpLnJlZnJlc2gocmVzb3VyY2UpOwotCQl9Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLklGaWxlQmFzZWRMaWJyYXJ5UGVyc2lzdGVyI2hhc093blJlc291cmNlV2l0aG91dFJlZmVycmVyKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzT3duUmVzb3VyY2VXaXRob3V0UmVmZXJyZXIoT2JqZWN0IGUpIHsKLQkJcmV0dXJuIGUgaW5zdGFuY2VvZiBNZXRob2RDb25maWd1cmF0aW9uOwotCX0KLQotCXB1YmxpYyBGaWxlIGNyZWF0ZU1ldGhvZFBsdWdpbkZvbGRlcihTdHJpbmcgcGx1Z2luTmFtZSwgTWV0aG9kTGlicmFyeSBsaWJyYXJ5KSB7Ci0JCUZpbGUgbGliRGlyID0gbmV3IEZpbGUobGlicmFyeS5lUmVzb3VyY2UoKS5nZXRVUkkoKS50b0ZpbGVTdHJpbmcoKSkuZ2V0UGFyZW50RmlsZSgpOwotCQlGaWxlIHBsdWdpbkRpciA9IG5ldyBGaWxlKGxpYkRpciwgcGx1Z2luTmFtZSk7Ci0JCWlmKCFwbHVnaW5EaXIuZXhpc3RzKCkpIHsKLQkJCWlmKCFwbHVnaW5EaXIubWtkaXJzKCkpIHsKLQkJCQl0aHJvdyBuZXcgTXVsdGlGaWxlSU9FeGNlcHRpb24oTkxTLmJpbmQoUGVyc2lzdGVuY2VSZXNvdXJjZXMuY2Fubm90X2NyZWF0ZV9kaXJfbXNnLCBwbHVnaW5EaXIpKTsJCQkJCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIHBsdWdpbkRpcjsKLQl9Ci0KLQlwdWJsaWMgRmlsZSBnZXREZWZhdWx0TWV0aG9kQ29uZmlndXJhdGlvbkZvbGRlcihNZXRob2RMaWJyYXJ5IGxpYnJhcnkpIHsKLQkJcmV0dXJuIGdldERlZmF1bHRNZXRob2RDb25maWd1cmF0aW9uRm9sZGVyKGxpYnJhcnksIHRydWUpOwotCX0KLQkKLQlwdWJsaWMgRmlsZSBnZXREZWZhdWx0TWV0aG9kQ29uZmlndXJhdGlvbkZvbGRlcihNZXRob2RMaWJyYXJ5IGxpYnJhcnksCi0JCQlib29sZWFuIGNyZWF0ZSkgewotCQlGaWxlIGxpYkRpciA9IG5ldyBGaWxlKGxpYnJhcnkuZVJlc291cmNlKCkuZ2V0VVJJKCkudG9GaWxlU3RyaW5nKCkpLmdldFBhcmVudEZpbGUoKTsKLQkJRmlsZSBjb25maWdEaXIgPSBuZXcgRmlsZShsaWJEaXIsIE11bHRpRmlsZVNhdmVVdGlsLk1FVEhPRF9DT05GSUdVUkFUSU9OX0ZPTERFUl9OQU1FKTsKLQkJaWYoY29uZmlnRGlyLmV4aXN0cygpKSB7Ci0JCQlyZXR1cm4gY29uZmlnRGlyOwotCQl9IGVsc2UgaWYoY3JlYXRlKSB7Ci0JCQlpZighY29uZmlnRGlyLm1rZGlycygpKSB7Ci0JCQkJdGhyb3cgbmV3IE11bHRpRmlsZUlPRXhjZXB0aW9uKE5MUy5iaW5kKFBlcnNpc3RlbmNlUmVzb3VyY2VzLmNhbm5vdF9jcmVhdGVfZGlyX21zZywgY29uZmlnRGlyKSk7CQkJCQotCQkJfSBlbHNlIHsKLQkJCQlyZXR1cm4gY29uZmlnRGlyOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldERlZmF1bHRNZXRob2RDb25maWd1cmF0aW9uRm9sZGVyKE1ldGhvZExpYnJhcnkgbGlicmFyeSwgRmlsZSBmaWxlKSB7Ci0JCS8vIG5vdCBhbGxvd2VkCi0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNDb250YWluZWRCeShSZXNvdXJjZSByZXNvdXJjZSwgUmVzb3VyY2UgY29udGFpbmVyUmVzb3VyY2UpIHsKLQkJTWV0aG9kRWxlbWVudCBlID0gUGVyc2lzdGVuY2VVdGlsLmdldE1ldGhvZEVsZW1lbnQoY29udGFpbmVyUmVzb3VyY2UpOwotCQlpZihoYXNPd25Gb2xkZXIoZSkpIHsKLQkJCVN0cmluZyBwYXRoID0gRmlsZU1hbmFnZXIudG9GaWxlU3RyaW5nKHJlc291cmNlLmdldFVSSSgpKTsKLQkJCVN0cmluZyBjb250YWluZXJQYXRoID0gRmlsZU1hbmFnZXIudG9GaWxlU3RyaW5nKGNvbnRhaW5lclJlc291cmNlLmdldFVSSSgpKTsJCQotCQkJaWYocGF0aCA9PSBudWxsIHx8IGNvbnRhaW5lclBhdGggPT0gbnVsbCkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCXJldHVybiBuZXcgUGF0aChjb250YWluZXJQYXRoKS5yZW1vdmVMYXN0U2VnbWVudHMoMSkuaXNQcmVmaXhPZihuZXcgUGF0aChwYXRoKSk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0UmVzb3VyY2VGb2xkZXJQYXRoKE1ldGhvZEVsZW1lbnQgZSkgewotCQlTdHJpbmcgZm9sZGVyUGF0aCA9IGdldEZvbGRlckFic29sdXRlUGF0aChlKTsKLQkJcmV0dXJuIGZvbGRlclBhdGggIT0gbnVsbCA/IG5ldyBGaWxlKGZvbGRlclBhdGgsIFJFU09VUkNFX0ZPTERFUikuZ2V0QWJzb2x1dGVQYXRoKCkgOiBSRVNPVVJDRV9GT0xERVI7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRGb2xkZXJBYnNvbHV0ZVBhdGgoTWV0aG9kRWxlbWVudCBlKSB7Ci0JCU1ldGhvZExpYnJhcnkgbGlicmFyeSA9IFVtYVV0aWwuZ2V0TWV0aG9kTGlicmFyeShlKTsKLQkJRmlsZSBsaWJEaXIgPSBudWxsOwotCQlpZihsaWJyYXJ5ID09IG51bGwpIHsKLQkJCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSBVbWFVdGlsLmdldE1ldGhvZFBsdWdpbihlKTsKLQkJCVJlc291cmNlIHJlc291cmNlOwotCQkJaWYocGx1Z2luICE9IG51bGwgJiYgKHJlc291cmNlID0gKChJbnRlcm5hbEVPYmplY3QpIHBsdWdpbikuZURpcmVjdFJlc291cmNlKCkpICE9IG51bGwpIHsKLQkJCQlVUkkgdXJpID0gTXVsdGlGaWxlU2F2ZVV0aWwuZ2V0RmluYWxVUkkocmVzb3VyY2UpOwotCQkJCWxpYkRpciA9IG5ldyBGaWxlKHVyaS50b0ZpbGVTdHJpbmcoKSkuZ2V0UGFyZW50RmlsZSgpLmdldFBhcmVudEZpbGUoKTsKLQkJCX0JCQkKLQkJfQotCQllbHNlIHsKLQkJCVVSSSB1cmkgPSBNdWx0aUZpbGVTYXZlVXRpbC5nZXRGaW5hbFVSSShsaWJyYXJ5LmVSZXNvdXJjZSgpKTsKLQkJCWxpYkRpciA9IG5ldyBGaWxlKHVyaS50b0ZpbGVTdHJpbmcoKSkuZ2V0UGFyZW50RmlsZSgpOwotCQl9Ci0JCWlmIChsaWJEaXIgIT0gbnVsbCkgewotCQkJcmV0dXJuIG5ldyBGaWxlKGxpYkRpciwgZ2V0UmVsYXRpdmVFbGVtZW50UGF0aChlKSkKLQkJCQkJLmdldEFic29sdXRlUGF0aCgpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzLklMaWJyYXJ5UGVyc2lzdGVyI2RlbGV0ZShqYXZhLnV0aWwuQ29sbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBkZWxldGUoQ29sbGVjdGlvbjxNZXRob2RFbGVtZW50PiBlbGVtcykgewotCQlBcnJheUxpc3QgZWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoSXRlcmF0b3I8TWV0aG9kRWxlbWVudD4gaXQgPSBlbGVtcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlnZXRPYmplY3RzV2l0aERpcmVjdFJlc291cmNlcyhpdC5uZXh0KCksIGVsZW1lbnRzKTsKLQkJfQotCQlkZWxldGVBbmRTYXZlKGVsZW1lbnRzKTsKLQl9Ci0KLQlwdWJsaWMgRmlsZSBnZXRGaWxlKFJlc291cmNlIHJlc291cmNlKSB7Ci0JCVVSSSB1cmkgPSBNdWx0aUZpbGVTYXZlVXRpbC5nZXRGaW5hbFVSSShyZXNvdXJjZSk7Ci0JCXJldHVybiBuZXcgRmlsZShGaWxlTWFuYWdlci50b0ZpbGVTdHJpbmcodXJpKSk7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS9NdWx0aUZpbGVJT0V4Y2VwdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS9NdWx0aUZpbGVJT0V4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlM2MyNzk2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvTXVsdGlGaWxlSU9FeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZTsKLQotLyoqCi0gKiBCYXNlIGV4Y2VwdGlvbiBmb3IgZmlsZS1iYXNlZCBwZXJzaXN0ZW5jZQotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTXVsdGlGaWxlSU9FeGNlcHRpb24gZXh0ZW5kcyBSdW50aW1lRXhjZXB0aW9uIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDMyNTc4NTMxOTg3MjIzNDczMjFMOwotCi0JcHJpdmF0ZSBPYmplY3QgdHJvdWJsZU9iamVjdDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIE11bHRpRmlsZUlPRXhjZXB0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIE11bHRpRmlsZUlPRXhjZXB0aW9uKFN0cmluZyBhcmcwKSB7Ci0JCXN1cGVyKGFyZzApOwotCX0KLQotCXB1YmxpYyBNdWx0aUZpbGVJT0V4Y2VwdGlvbihTdHJpbmcgbXNnLCBPYmplY3QgdHJvdWJsZU9iaikgewotCQlzdXBlcihtc2cpOwotCQl0cm91YmxlT2JqZWN0ID0gdHJvdWJsZU9iajsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIHRyb3VibGVPYmplY3QuCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRUcm91YmxlT2JqZWN0KCkgewotCQlyZXR1cm4gdHJvdWJsZU9iamVjdDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL011bHRpRmlsZVJlc291cmNlU2V0SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NmI5MTI5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjEwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZTsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLkNvbW1vblBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5Ob3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5BYnN0cmFjdFRyZWVJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VbmlxdWVFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuV3JhcHBlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3NpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5VUklDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLmltcGwuUmVzb3VyY2VTZXRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuWE1MUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5pbXBsLlhNTEluZm9JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuaW1wbC5YTUxNYXBJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuaW1wbC5YTUxSZXNvdXJjZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5GaWxlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS5JTGlicmFyeVJlc291cmNlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLkxpYnJhcnlSZXNvdXJjZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UucmVmcmVzaC5JUmVmcmVzaEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5yZWZyZXNoLklSZWZyZXNoTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLnJlZnJlc2guUmVmcmVzaEpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UucmVmcmVzaC5pbnRlcm5hbC5SZWZyZXNoRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLnV0aWwuUGVyc2lzdGVuY2VSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLnV0aWwuUGVyc2lzdGVuY2VVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS51dGlsLlVucmVzb2x2ZWRQcm94eU1hcmtlck1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlci5SZXNvdXJjZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlci5SZXNvdXJjZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzLklMaWJyYXJ5UGVyc2lzdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy5TZXJ2aWNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5TZW1hbnRpY01vZGVsQnJpZGdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGVhbVByb2ZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VTUFTZW1hbnRpY01vZGVsQnJpZGdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrT3JkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS5JUHJveHlSZXNvbHV0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS5JVW1hUmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS5SZXNvbHZlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUuaW1wbC5NdWx0aVJlc291cmNlRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLnV0aWwuRXZlbnRUeXBlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLnV0aWwuT3Bwb3NpdGVGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5Bc3NvY2lhdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQ29udGVudERlc2NyaXB0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi1pbXBvcnQgY29tLmlibS5pY3UudGV4dC5EYXRlRm9ybWF0OwotaW1wb3J0IGNvbS5pYm0uaWN1LnRleHQuU2ltcGxlRGF0ZUZvcm1hdDsKLWltcG9ydCBjb20uaWJtLmljdS51dGlsLkNhbGVuZGFyOwotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwgZXh0ZW5kcyBSZXNvdXJjZVNldEltcGwgaW1wbGVtZW50cwotCQlJUHJveHlSZXNvbHV0aW9uTGlzdGVuZXIsIElVbWFSZXNvdXJjZVNldCwgSUxpYnJhcnlSZXNvdXJjZVNldCB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBERUZBVUxUX0RFTElWRVJZX1BST0NFU1NfUEFUSCA9IHsgIkRlbGl2ZXJ5UHJvY2Vzc2VzIiB9OyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBERUZBVUxUX0NBUEFCSUxJVFlfUEFUVEVSTl9QQVRIID0gewotCQkJIkNvbnRlbnQiLCAiQ2FwYWJpbGl0eVBhdHRlcm5zIiB9OyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIERFRkFVTFRfUFJPQ0VTU19DT05UUklCVVRJT05fUEFUSCA9IHsgIlByb2Nlc3NDb250cmlidXRpb25zIiB9OyAvLyROT04tTkxTLTEkCQkKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nW11bXSBQUk9DRVNTX1BBQ0tBR0VfUEFUSFMgPSB7Ci0JCQlERUZBVUxUX0RFTElWRVJZX1BST0NFU1NfUEFUSCwgREVGQVVMVF9DQVBBQklMSVRZX1BBVFRFUk5fUEFUSCwKLQkJCURFRkFVTFRfUFJPQ0VTU19DT05UUklCVVRJT05fUEFUSCB9OwotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIFJFUE9SVF9FUlJPUiA9IHRydWU7Ci0KLQlzdGF0aWMgZmluYWwgTWFwPE9iamVjdCwgT2JqZWN0PiBERUZBVUxUX1NBVkVfT1BUSU9OUyA9IG5ldyBIYXNoTWFwPE9iamVjdCwgT2JqZWN0PigpOwotCi0Jc3RhdGljIGZpbmFsIFNldCBERUZBVUxUX1NBVkVfU0VQQVJBVEVMWV9DTEFTU19TRVQgPSBuZXcgSGFzaFNldCgpOwotCi0Jc3RhdGljIHsKLQkJREVGQVVMVF9TQVZFX1NFUEFSQVRFTFlfQ0xBU1NfU0VULmFkZChVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRNZXRob2RQbHVnaW4oKSk7Ci0JCURFRkFVTFRfU0FWRV9TRVBBUkFURUxZX0NMQVNTX1NFVC5hZGQoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0UHJvY2Vzc0NvbXBvbmVudCgpKTsKLQkJREVGQVVMVF9TQVZFX1NFUEFSQVRFTFlfQ0xBU1NfU0VULmFkZChVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRDb250ZW50RGVzY3JpcHRpb24oKSk7Ci0JCS8vIGVDbGFzc2VzLmFkZChSZXNvdXJjZW1hbmFnZXJQYWNrYWdlLmVJTlNUQU5DRS5nZXRSZXNvdXJjZU1hbmFnZXIoKSk7Ci0JCURFRkFVTFRfU0FWRV9TRVBBUkFURUxZX0NMQVNTX1NFVC5hZGQoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0TWV0aG9kQ29uZmlndXJhdGlvbigpKTsKLQotCQlYTUxSZXNvdXJjZS5YTUxNYXAgeG1sTWFwID0gY3JlYXRlU2F2ZVhNTE1hcCgpOwotCi0JCUhhc2hTZXQgc2F2ZVRvZ2V0aGVyID0gbmV3IEhhc2hTZXQoKTsKLQkJc2F2ZVRvZ2V0aGVyLmFkZChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24oKSk7Ci0KLQkJREVGQVVMVF9TQVZFX09QVElPTlMucHV0KAotCQkJCU11bHRpRmlsZVhNSVNhdmVJbXBsLlNBVkVfU0VQQVJBVEVMWV9DTEFTU19TRVQsCi0JCQkJREVGQVVMVF9TQVZFX1NFUEFSQVRFTFlfQ0xBU1NfU0VUKTsKLQkJREVGQVVMVF9TQVZFX09QVElPTlMucHV0KE11bHRpRmlsZVhNSVNhdmVJbXBsLlNBVkVfQUxMLCAiZmFsc2UiKTsgLy8kTk9OLU5MUy0xJAotCQlERUZBVUxUX1NBVkVfT1BUSU9OUy5wdXQoTXVsdGlGaWxlWE1JU2F2ZUltcGwuU0FWRV9UT0dFVEhFUl9DTEFTU19TRVQsCi0JCQkJc2F2ZVRvZ2V0aGVyKTsKLQkJREVGQVVMVF9TQVZFX09QVElPTlMucHV0KE11bHRpRmlsZVhNSVNhdmVJbXBsLlJFRlJFU0hfTkVXX1JFU09VUkNFLAotCQkJCSJ0cnVlIik7IC8vJE5PTi1OTFMtMSQKLQkJREVGQVVMVF9TQVZFX09QVElPTlMucHV0KE11bHRpRmlsZVhNSVNhdmVJbXBsLkNIRUNLX01PRElGWSwgInRydWUiKTsgLy8kTk9OLU5MUy0xJAotCQlERUZBVUxUX1NBVkVfT1BUSU9OUy5wdXQoWE1MUmVzb3VyY2UuT1BUSU9OX0VOQ09ESU5HLCAiVVRGLTgiKTsgLy8kTk9OLU5MUy0xJAotCQlERUZBVUxUX1NBVkVfT1BUSU9OUy5wdXQoWE1MUmVzb3VyY2UuT1BUSU9OX1BST0NFU1NfREFOR0xJTkdfSFJFRiwKLQkJCQlYTUxSZXNvdXJjZS5PUFRJT05fUFJPQ0VTU19EQU5HTElOR19IUkVGX0RJU0NBUkQpOwotCQlERUZBVUxUX1NBVkVfT1BUSU9OUy5wdXQoWE1MUmVzb3VyY2UuT1BUSU9OX1hNTF9NQVAsIHhtbE1hcCk7Ci0JCURFRkFVTFRfU0FWRV9PUFRJT05TLnB1dChYTUxSZXNvdXJjZS5PUFRJT05fQ09ORklHVVJBVElPTl9DQUNIRSwgQm9vbGVhbi5UUlVFKTsKLQotCQlBc3NvY2lhdGlvbkhlbHBlci5pbml0KCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVTTUdSX1hNSSA9ICJyZXNtZ3IueG1pIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBIYXNoTWFwPE9iamVjdCwgT2JqZWN0PiBkZWZhdWx0U2F2ZU9wdGlvbnM7Ci0KLQlwcml2YXRlIEhhc2hNYXA8U3RyaW5nLCBFT2JqZWN0PiBndWlkVG9NZXRob2RFbGVtZW50TWFwOwotCi0JcHJpdmF0ZSBib29sZWFuIGxvYWRpbmc7Ci0KLQlwcml2YXRlIGJvb2xlYW4gbG9hZGluZ1Jlc291cmNlTWFuYWdlclRyZWU7Ci0KLQlwcml2YXRlIE1hcCBVUklUb1RlbXBVUklNYXA7Ci0KLQlwcml2YXRlIFVucmVzb2x2ZWRQcm94eU1hcmtlck1hbmFnZXIgbWFya2VyTWFuYW5nZXI7Ci0KLQlwcml2YXRlIFVuaXF1ZUVMaXN0PElSZWZyZXNoTGlzdGVuZXI+IHJlZnJlc2hMaXN0ZW5lcnM7Ci0KLQlwcm90ZWN0ZWQgSVVSSVByb3ZpZGVyIHVyaVByb3ZpZGVyOwotCi0JcHJpdmF0ZSBQYXRoIGNvbmZpZ0ZvbGRlclBhdGg7Ci0KLQlwcml2YXRlIFBhdGggbGliRm9sZGVyUGF0aDsKLQotCXByaXZhdGUgc3RhdGljIFhNTFJlc291cmNlLlhNTE1hcCBjcmVhdGVMb2FkWE1MTWFwKCkgewotCQlYTUxSZXNvdXJjZS5YTUxNYXAgeG1sTWFwID0gbmV3IFhNTE1hcEltcGwoKTsKLQkJU2V0IGV4Y2x1ZGVkQXR0cmlidXRlcyA9IG5ldyBIYXNoU2V0KCk7Ci0JCWV4Y2x1ZGVkQXR0cmlidXRlcy5hZGQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWV0aG9kRWxlbWVudF9HdWlkKCkpOwotCQlleGNsdWRlZEF0dHJpYnV0ZXMuYWRkKFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE5hbWVkRWxlbWVudF9OYW1lKCkpOwotCi0JCWZvciAoSXRlcmF0b3IgaXRlciA9IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEVDbGFzc2lmaWVycygpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkuaGFzTmV4dCgpOykgewotCQkJRUNsYXNzaWZpZXIgZUNsYXNzaWZpZXIgPSAoRUNsYXNzaWZpZXIpIGl0ZXIubmV4dCgpOwotCQkJaWYgKGVDbGFzc2lmaWVyIGluc3RhbmNlb2YgRUNsYXNzKSB7Ci0JCQkJRUNsYXNzIGVDbGFzcyA9IChFQ2xhc3MpIGVDbGFzc2lmaWVyOwotCi0JCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGVDbGFzcy5nZXRFQXR0cmlidXRlcygpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yCi0JCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQlFQXR0cmlidXRlIGF0dHJpYiA9IChFQXR0cmlidXRlKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCWlmICghZXhjbHVkZWRBdHRyaWJ1dGVzLmNvbnRhaW5zKGF0dHJpYikpIHsKLQkJCQkJCVhNTFJlc291cmNlLlhNTEluZm8geG1sSW5mbyA9IG5ldyBYTUxJbmZvSW1wbCgpOwotCQkJCQkJeG1sSW5mby5zZXROYW1lKGF0dHJpYi5nZXROYW1lKCkpOwotCQkJCQkJeG1sSW5mbwotCQkJCQkJCQkuc2V0WE1MUmVwcmVzZW50YXRpb24oWE1MUmVzb3VyY2UuWE1MSW5mby5FTEVNRU5UKTsKLQkJCQkJCXhtbE1hcC5hZGQoYXR0cmliLCB4bWxJbmZvKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiB4bWxNYXA7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBzYXZlQXR0cmlidXRlQXNFbGVtZW50KEVDbGFzcyBlQ2xhc3MsCi0JCQlDb2xsZWN0aW9uIHNlbGVjdGVkRUNsYXNzZXMpIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gc2VsZWN0ZWRFQ2xhc3Nlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCUVDbGFzcyBiYXNlID0gKEVDbGFzcykgaXRlci5uZXh0KCk7Ci0JCQlpZiAoYmFzZS5pc1N1cGVyVHlwZU9mKGVDbGFzcykpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgWE1MUmVzb3VyY2UuWE1MTWFwIGNyZWF0ZVNhdmVYTUxNYXAoKSB7Ci0JCVhNTFJlc291cmNlLlhNTE1hcCB4bWxNYXAgPSBuZXcgWE1MTWFwSW1wbCgpOwotCQlTZXQgZXhjbHVkZWRBdHRyaWJ1dGVzID0gbmV3IEhhc2hTZXQoKTsKLQkJZXhjbHVkZWRBdHRyaWJ1dGVzLmFkZChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRNZXRob2RFbGVtZW50X0d1aWQoKSk7Ci0JCWV4Y2x1ZGVkQXR0cmlidXRlcy5hZGQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TmFtZWRFbGVtZW50X05hbWUoKSk7Ci0KLQkJLy8gc2VsZWN0IG9ubHkgQ29udGVudERlc2NyaXB0aW9uIGFuZCBTZWN0aW9uCi0JCVNldCBzZWxlY3RlZEVDbGFzc2VzID0gbmV3IEhhc2hTZXQoKTsKLQkJc2VsZWN0ZWRFQ2xhc3Nlcy5hZGQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29udGVudERlc2NyaXB0aW9uKCkpOwotCQlzZWxlY3RlZEVDbGFzc2VzLmFkZChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRTZWN0aW9uKCkpOwotCi0JCWZvciAoSXRlcmF0b3IgaXRlciA9IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEVDbGFzc2lmaWVycygpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkuaGFzTmV4dCgpOykgewotCQkJRUNsYXNzaWZpZXIgZUNsYXNzaWZpZXIgPSAoRUNsYXNzaWZpZXIpIGl0ZXIubmV4dCgpOwotCQkJaWYgKGVDbGFzc2lmaWVyIGluc3RhbmNlb2YgRUNsYXNzKSB7Ci0JCQkJRUNsYXNzIGVDbGFzcyA9IChFQ2xhc3MpIGVDbGFzc2lmaWVyOwotCi0JCQkJaWYgKHNhdmVBdHRyaWJ1dGVBc0VsZW1lbnQoZUNsYXNzLCBzZWxlY3RlZEVDbGFzc2VzKSkgewotCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gZUNsYXNzLmdldEVBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IKLQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJRUF0dHJpYnV0ZSBhdHRyaWIgPSAoRUF0dHJpYnV0ZSkgaXRlcmF0b3IubmV4dCgpOwotCQkJCQkJaWYgKCFleGNsdWRlZEF0dHJpYnV0ZXMuY29udGFpbnMoYXR0cmliKSkgewotCQkJCQkJCVhNTFJlc291cmNlLlhNTEluZm8geG1sSW5mbyA9IG5ldyBYTUxJbmZvSW1wbCgpOwotCQkJCQkJCXhtbEluZm8uc2V0TmFtZShhdHRyaWIuZ2V0TmFtZSgpKTsKLQkJCQkJCQl4bWxJbmZvCi0JCQkJCQkJCQkuc2V0WE1MUmVwcmVzZW50YXRpb24oWE1MUmVzb3VyY2UuWE1MSW5mby5FTEVNRU5UKTsKLQkJCQkJCQl4bWxNYXAuYWRkKGF0dHJpYiwgeG1sSW5mbyk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4geG1sTWFwOwotCX0KLQotCXB1YmxpYyBNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JCW1hcmtlck1hbmFuZ2VyID0gbmV3IFVucmVzb2x2ZWRQcm94eU1hcmtlck1hbmFnZXIodGhpcyk7Ci0JfQotCi0JcHVibGljIE11bHRpRmlsZVJlc291cmNlU2V0SW1wbChib29sZWFuIHJlcG9ydEVycm9yKSB7Ci0JCXRoaXMoKTsKLQkJbWFya2VyTWFuYW5nZXIuc2V0RW5hYmxlZChyZXBvcnRFcnJvcik7Ci0JfQotCi0JcHVibGljIFVucmVzb2x2ZWRQcm94eU1hcmtlck1hbmFnZXIgZ2V0VW5yZXNvbHZlZFByb3h5TWFya2VyTWFuYWdlcigpIHsKLQkJcmV0dXJuIG1hcmtlck1hbmFuZ2VyOwkJCi0JfQotCQotCXByb3RlY3RlZCBJVVJJUHJvdmlkZXIgZ2V0VVJJUHJvdmlkZXIoKSB7Ci0JCWlmKHVyaVByb3ZpZGVyID09IG51bGwpIHsKLQkJCXVyaVByb3ZpZGVyID0gbmV3IEZpbGVQYXRoUHJvdmlkZXIoKTsKLQkJfQotCQlyZXR1cm4gdXJpUHJvdmlkZXI7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBoYW5kbGVSZXNvdXJjZUNoYW5nZShJUmVzb3VyY2Ugd3NSZXMpIHsKLQkJU3lzdGVtLm91dAotCQkJCS5wcmludGxuKCJNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwuaGFuZGxlUmVzb3VyY2VDaGFuZ2UoKTogIiArIHdzUmVzLnRvU3RyaW5nKCkpOyAvLyROT04tTkxTLTEkCi0KLQkJTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsIHJlc291cmNlID0gKE11bHRpRmlsZVhNSVJlc291cmNlSW1wbCkgZ2V0UmVzb3VyY2UoCi0JCQkJVVJJLmNyZWF0ZUZpbGVVUkkod3NSZXMuZ2V0TG9jYXRpb24oKS50b1N0cmluZygpKSwgZmFsc2UpOwotCQlpZiAocmVzb3VyY2UgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlBcnJheUxpc3QgcHJveGllcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQlyZXNvdXJjZS5yZWxvYWQocHJveGllcyk7Ci0KLQkJCQkvLyBub3RpZnkgTUFLRV9QUk9YWSBldmVudCBmb3IgYWxsIHByb3hpZXMKLQkJCQkvLwotCQkJCU5vdGlmaWNhdGlvbiBtc2cgPSBuZXcgTm90aWZpY2F0aW9uSW1wbChFdmVudFR5cGVzLk1BS0VfUFJPWFksCi0JCQkJCQlmYWxzZSwgdHJ1ZSk7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gcHJveGllcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJRU9iamVjdCBvID0gKEVPYmplY3QpIGl0ZXIubmV4dCgpOwotCQkJCQlvLmVOb3RpZnkobXNnKTsKLQkJCQl9Ci0KLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQlDb21tb25QbHVnaW4uSU5TVEFOQ0UubG9nKGUpOwotCQkJfQotCQl9Ci0KLQl9Ci0KLQlwdWJsaWMgTWFwPE9iamVjdCwgT2JqZWN0PiBnZXRMb2FkT3B0aW9ucygpIHsKLQkJTWFwPE9iamVjdCwgT2JqZWN0PiBvcHRpb25zID0gc3VwZXIuZ2V0TG9hZE9wdGlvbnMoKTsKLQkJb3B0aW9ucy5wdXQoWE1MUmVzb3VyY2UuT1BUSU9OX0VOQ09ESU5HLCAiVVRGLTgiKTsgLy8kTk9OLU5MUy0xJAotCQlvcHRpb25zLnB1dChYTUxSZXNvdXJjZS5PUFRJT05fWE1MX01BUCwgY3JlYXRlTG9hZFhNTE1hcCgpKTsKLQkJcmV0dXJuIG9wdGlvbnM7Ci0JfQotCi0JcHVibGljIE1hcDxPYmplY3QsIE9iamVjdD4gZ2V0RGVmYXVsdFNhdmVPcHRpb25zKCkgewotCQlpZiAoZGVmYXVsdFNhdmVPcHRpb25zID09IG51bGwpIHsKLQkJCWRlZmF1bHRTYXZlT3B0aW9ucyA9IG5ldyBIYXNoTWFwPE9iamVjdCwgT2JqZWN0PigpOwotCQkJZGVmYXVsdFNhdmVPcHRpb25zLnB1dEFsbChERUZBVUxUX1NBVkVfT1BUSU9OUyk7Ci0JCX0KLQotCQlyZXR1cm4gZGVmYXVsdFNhdmVPcHRpb25zOwotCX0KLQotCXByaXZhdGUgUmVzb3VyY2UgZ2V0TWV0aG9kTGlicmFyeVJlc291cmNlKCkgewotCQlpZiAoZ2V0UmVzb3VyY2VzKCkuaXNFbXB0eSgpKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoUmVzb3VyY2UpIGdldFJlc291cmNlcygpLmdldCgwKTsKLQl9Ci0KLQlwdWJsaWMgTWV0aG9kTGlicmFyeSBnZXRNZXRob2RMaWJyYXJ5KCkgewotCQlSZXNvdXJjZSByZXNvdXJjZSA9IGdldE1ldGhvZExpYnJhcnlSZXNvdXJjZSgpOwotCQlyZXR1cm4gcmVzb3VyY2UgPT0gbnVsbCA/IG51bGwgOiAoTWV0aG9kTGlicmFyeSkgUGVyc2lzdGVuY2VVdGlsCi0JCQkJLmdldE1ldGhvZEVsZW1lbnQocmVzb3VyY2UpOwotCX0KLQotCXByb3RlY3RlZCBSZXNvdXJjZU1hbmFnZXIgZ2V0Um9vdFJlc291cmNlTWFuYWdlcigpIHsKLQkJUmVzb3VyY2UgcmVzb3VyY2UgPSBnZXRNZXRob2RMaWJyYXJ5UmVzb3VyY2UoKTsKLQkJcmV0dXJuIHJlc291cmNlID09IG51bGwgPyBudWxsIDogTXVsdGlGaWxlU2F2ZVV0aWwKLQkJCQkuZ2V0UmVzb3VyY2VNYW5hZ2VyKHJlc291cmNlKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5pbXBsLlJlc291cmNlU2V0SW1wbCNnZXRVUklDb252ZXJ0ZXIoKQotCSAqLwotCXB1YmxpYyBVUklDb252ZXJ0ZXIgZ2V0VVJJQ29udmVydGVyKCkgewotCQlpZiAodXJpQ29udmVydGVyID09IG51bGwpIHsKLQkJCXVyaUNvbnZlcnRlciA9IG5ldyBNdWx0aUZpbGVVUklDb252ZXJ0ZXIodGhpcyk7Ci0JCX0KLQkJcmV0dXJuIHVyaUNvbnZlcnRlcjsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gdXJpCi0JICogQHJldHVybiBudWxsIGlmIHRoZSByZXNvdXJjZSB3aXRoIHRoZSBnaXZlbiBVUkkgY291bGQgbm90IGJlIGZvdW5kCi0JICovCi0JcHVibGljIFJlc291cmNlIGdldFJlc291cmNlKFVSSSB1cmkpIHsKLQkJaWYgKGdldFVSSUNvbnZlcnRlcigpLm5vcm1hbGl6ZSh1cmkpID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJUmVzb3VyY2UgcmVzID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXJlcyA9IHN1cGVyLmdldFJlc291cmNlKHVyaSwgZmFsc2UpOwotCQkJaWYgKHJlcyA9PSBudWxsKSB7Ci0JCQkJTWFwIG1hcCA9IGdldFVSSVJlc291cmNlTWFwKCk7Ci0JCQkJcmVzID0gY3JlYXRlUmVzb3VyY2UodXJpKTsKLQotCQkJCXRyeSB7Ci0JCQkJCWRlbWFuZExvYWRIZWxwZXIocmVzKTsKLQkJCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCQkJLy8gcmVtb3ZlIHRoZSByZXNvdXJjZSBmcm9tIHJlc291cmNlIHNldCBpZiBpdCBjb3VsZCBub3QgYmUKLQkJCQkJLy8gbG9hZGVkCi0JCQkJCS8vCi0JCQkJCWdldFJlc291cmNlcygpLnJlbW92ZShyZXMpOwotCQkJCQl0aHJvdyBlOwotCQkJCX0KLQotCQkJCWlmIChtYXAgIT0gbnVsbCkgewotCQkJCQltYXAucHV0KHVyaSwgcmVzKTsKLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKFdyYXBwZWRFeGNlcHRpb24gZSkgewotCQkJaWYgKGUuZXhjZXB0aW9uKCkgaW5zdGFuY2VvZiBGaWxlTm90Rm91bmRFeGNlcHRpb24pIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJCXRocm93IGU7Ci0JCX0KLQkJcmV0dXJuIHJlczsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLmltcGwuUmVzb3VyY2VTZXRJbXBsI2RlbWFuZExvYWQob3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRlbWFuZExvYWQoUmVzb3VyY2UgcmVzb3VyY2UpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXN1cGVyLmRlbWFuZExvYWQocmVzb3VyY2UpOwotCi0JCS8vIHJlZnJlc2ggd29ya3NwYWNlIHJlc291cmNlIG9mIHRoaXMgcmVzb3VyY2UgdG8gbWFrZSB0aGVtIHN5bmNocm9uaXplZAotCQkvLwotCQlib29sZWFuIHJldCA9IEZpbGVNYW5hZ2VyLmdldEluc3RhbmNlKCkucmVmcmVzaChyZXNvdXJjZSk7Ci0JCWlmKE11bHRpRmlsZVNhdmVVdGlsLkRFQlVHKSB7Ci0JCQlpZighcmV0KSB7Ci0JCQkJU3lzdGVtLmVyci5wcmludGxuKCJNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwuZGVtYW5kTG9hZCgpOiBjb3VsZCBub3QgcmVmcmVzaCByZXNvdXJjZSAiICsgcmVzb3VyY2UpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogUmVzb2x2ZXMgY29udGFpbmVyIG9mIHRoZSBNZXRob2RFbGVtZW50IGluIHRoZSBnaXZlbiByZXNvdXJjZS4KLQkgKiAKLQkgKiBAcGFyYW0gcmVzCi0JICovCi0JcHVibGljIHZvaWQgcmVzb2x2ZUNvbnRhaW5lcihSZXNvdXJjZSByZXMpIHsKLQkJTWV0aG9kTGlicmFyeSBsaWIgPSBnZXRNZXRob2RMaWJyYXJ5KCk7Ci0JCWlmKGxvYWRpbmcgJiYgbGliID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gcmVzLmdldENvbnRlbnRzKCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGVsZW1lbnQgPSAoT2JqZWN0KSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZihlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJCU1ldGhvZEVsZW1lbnQgZSA9IChNZXRob2RFbGVtZW50KSBlbGVtZW50OwotCQkJCWlmKGUgIT0gbGliICYmIGUuZUNvbnRhaW5lcigpID09IG51bGwpIHsKLQkJCQkJLy8gdGhlIG1ldGhvZCBlbGVtZW50IG1pZ2h0IGhhdmUgYmVlbiBsb2FkZWQgYmVmb3JlIGl0cyBjb250YWluZXIgYWNjZXNzZWQgaXQKLQkJCQkJLy8KLQkJCQkJUmVzb3VyY2VEZXNjcmlwdG9yIHJlc0Rlc2MgPSBNdWx0aUZpbGVTYXZlVXRpbC5nZXRSZXNvdXJjZURlc2NyaXB0b3IocmVzKTsKLQkJCQkJaWYocmVzRGVzYyAhPSBudWxsKSB7Ci0JCQkJCQlSZXNvdXJjZSBjb250YWluZXJSZXNvdXJjZSA9IHJlc0Rlc2MuZVJlc291cmNlKCk7Ci0JCQkJCQlpZihjb250YWluZXJSZXNvdXJjZSBpbnN0YW5jZW9mIFhNTFJlc291cmNlSW1wbCkgewotCQkJCQkJCU9iamVjdCBwcm94eSA9ICgoWE1MUmVzb3VyY2VJbXBsKWNvbnRhaW5lclJlc291cmNlKS5nZXRJRFRvRU9iamVjdE1hcCgpLmdldChlLmdldEd1aWQoKSk7Ci0JCQkJCQkJaWYocHJveHkgaW5zdGFuY2VvZiBFT2JqZWN0KSB7Ci0JCQkJCQkJCUVPYmplY3QgcHJveHlFT2JqZWN0ID0gKChFT2JqZWN0KXByb3h5KTsgCi0JCQkJCQkJCUVSZWZlcmVuY2UgcmVmID0gcHJveHlFT2JqZWN0LmVDb250YWlubWVudEZlYXR1cmUoKTsKLQkJCQkJCQkJRU9iamVjdCBjb250YWluZXIgPSBwcm94eUVPYmplY3QuZUNvbnRhaW5lcigpOwotCQkJCQkJCQlpZihjb250YWluZXIgIT0gbnVsbCkgewotCQkJCQkJCQkJaWYgKHJlZi5pc01hbnkoKSkgewotCQkJCQkJCQkJCUxpc3QgdmFsdWVzID0gKExpc3QpIGNvbnRhaW5lci5lR2V0KHJlZik7Ci0JCQkJCQkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gdmFsdWVzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOyBpdGVyCi0JCQkJCQkJCQkJLm5leHQoKSkKLQkJCQkJCQkJCQkJOwotCQkJCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJCQljb250YWluZXIuZUdldChyZWYpOwotCQkJCQkJCQkJfQotCQkJCQkJCQkJcmVzb2x2ZUNvbnRhaW5lcihjb250YWluZXJSZXNvdXJjZSk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9CQkJCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5pbXBsLlJlc291cmNlU2V0SW1wbCNnZXRSZXNvdXJjZShvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJLAotCSAqICAgICAgYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2UgZ2V0UmVzb3VyY2UoVVJJIHVyaSwgYm9vbGVhbiBsb2FkT25EZW1hbmQpIHsKLQkJaWYgKGdldFVSSUNvbnZlcnRlcigpLm5vcm1hbGl6ZSh1cmkpID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJUmVzb3VyY2UgcmVzID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXJlcyA9IHN1cGVyLmdldFJlc291cmNlKHVyaSwgbG9hZE9uRGVtYW5kKTsKLQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCQlTdHJpbmcgbXNnID0gbnVsbDsKLQkJCWlmIChlLmdldE1lc3NhZ2UoKSAhPSBudWxsKQotCQkJCW1zZyA9IE5MUy5iaW5kKAotCQkJCQkJUGVyc2lzdGVuY2VSZXNvdXJjZXMubG9hZFJlc291cmNlRXJyb3JXaXRoUmVhc29uX21zZywKLQkJCQkJCShuZXcgT2JqZWN0W10geyB1cmksIGUuZ2V0TWVzc2FnZSgpIH0pKTsKLQkJCWVsc2UKLQkJCQltc2cgPSBOTFMuYmluZChQZXJzaXN0ZW5jZVJlc291cmNlcy5sb2FkUmVzb3VyY2VFcnJvcl9tc2csIHVyaSk7Ci0JCQloYW5kbGVFeGNlcHRpb24obXNnKTsKLQkJCXRocm93IGU7Ci0JCX0KLQkJcmV0dXJuIHJlczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRSZWZyZXNoTGlzdGVuZXIoSVJlZnJlc2hMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlpZiAocmVmcmVzaExpc3RlbmVycyA9PSBudWxsKSB7Ci0JCQlyZWZyZXNoTGlzdGVuZXJzID0gbmV3IFVuaXF1ZUVMaXN0PElSZWZyZXNoTGlzdGVuZXI+KCk7Ci0JCX0KLQkJcmVmcmVzaExpc3RlbmVycy5hZGQobGlzdGVuZXIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZVJlZnJlc2hMaXN0ZW50ZXIoSVJlZnJlc2hMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlpZiAocmVmcmVzaExpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQlyZWZyZXNoTGlzdGVuZXJzLnJlbW92ZShsaXN0ZW5lcik7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgbm90aWZ5UmVmcmVzaExpc3RlbmVycyhJUmVmcmVzaEV2ZW50IGV2ZW50KSB7Ci0JCWlmKHJlZnJlc2hMaXN0ZW5lcnMgIT0gbnVsbCAmJiAhcmVmcmVzaExpc3RlbmVycy5pc0VtcHR5KCkpIHsKLQkJCWZvciAoSVJlZnJlc2hMaXN0ZW5lciBsaXN0ZW5lciA6IHJlZnJlc2hMaXN0ZW5lcnMpIHsKLQkJCQl0cnkgewotCQkJCQlsaXN0ZW5lci5ub3RpZnlSZWZyZXNoZWQoZXZlbnQpOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCVBlcnNpc3RlbmNlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZWxvYWRzIHRoZSBnaXZlbiByZXNvdXJjZXMKLQkgKiAKLQkgKiBAcGFyYW0gcmVzb3VyY2VzCi0JICogQHJldHVybiByZXNvdXJjZXMgdGhhdCBoYWQgYmVlbiByZWxvYWRlZAotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgQ29sbGVjdGlvbiByZWxvYWRSZXNvdXJjZXMoQ29sbGVjdGlvbiByZXNvdXJjZXMpIHsJCQotCQkvLyBzYXZlIHRoZSBSZXNvdXJjZURlc2NyaXB0b3IgZm9yIHRoZSByZXNvdXJjZXMgdG8gY3JlYXRlIFVSSSBmb3IgdGhlaXIKLQkJLy8gcHJveGllcyBhZnRlciB1bmxvYWQKLQkJLy8KLQkJZm9yIChJdGVyYXRvciBpdGVyID0gcmVzb3VyY2VzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsIHJlc291cmNlID0gKE11bHRpRmlsZVhNSVJlc291cmNlSW1wbCkgaXRlcgotCQkJCQkubmV4dCgpOwotCQkJCi0JCQlpZihNdWx0aUZpbGVTYXZlVXRpbC5ERUJVRykgewotCQkJCVN5c3RlbS5vdXQKLQkJCQkJCS5wcmludGxuKCJNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwucmVsb2FkUmVzb3VyY2VzKCk6IHJlc291cmNlPSIgKyByZXNvdXJjZSArICIsIGVsZW1lbnQ9IiArIFBlcnNpc3RlbmNlVXRpbC5nZXRNZXRob2RFbGVtZW50KHJlc291cmNlKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJfQotCQkJCi0JCQlSZXNvdXJjZURlc2NyaXB0b3IgcmVzRGVzYyA9IE11bHRpRmlsZVNhdmVVdGlsCi0JCQkJCS5nZXRSZXNvdXJjZURlc2NyaXB0b3IocmVzb3VyY2UpOwotCQkJaWYgKHJlc0Rlc2MgIT0gbnVsbCkgewotCQkJCXJlc291cmNlLnNldFJlc291cmNlRGVzY3JpcHRvcihyZXNEZXNjKTsKLQkJCX0KLQkJfQotCi0JCUFycmF5TGlzdCByZWxvYWRlZFJlc291cmNlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJSGFzaFNldCBwcm94aWVzID0gbmV3IEhhc2hTZXQoKTsKLQkJQXJyYXlMaXN0IHJlc291cmNlTGlzdCA9IG5ldyBBcnJheUxpc3QocmVzb3VyY2VzKTsKLQotCQlSZXNvdXJjZSBsaWJSZXNvdXJjZSA9IGdldE1ldGhvZExpYnJhcnlSZXNvdXJjZSgpOwotCQlib29sZWFuIHJlbG9hZEFsbENvbmZpZ3MgPSBmYWxzZTsKLQkJaWYgKHJlc291cmNlTGlzdC5yZW1vdmUobGliUmVzb3VyY2UpKSB7Ci0JCQkvLyBNZXRob2RMaWJyYXJ5IHJlc291cmNlIGlzIHRvIHJlbG9hZCwgaXQgbXVzdCBiZSByZWxvYWRlZCBmaXJzdAotCQkJLy8JCQkKLQkJCU11bHRpRmlsZVhNSVJlc291cmNlSW1wbCByZXNvdXJjZSA9IChNdWx0aUZpbGVYTUlSZXNvdXJjZUltcGwpIGxpYlJlc291cmNlOwotCi0JCQkvLyBjbGVhciBtYXJrZXJzIGZvciB0aGlzIHJlc291cmNlCi0JCQkvLwotCQkJbWFya2VyTWFuYW5nZXIuY2xlYXJNYXJrZXJzKHJlc291cmNlKTsKLQotCQkJdHJ5IHsKLQkJCQlpZiAocmVzb3VyY2UucmVsb2FkKHByb3hpZXMpKSB7Ci0JCQkJCXJlbG9hZGVkUmVzb3VyY2VzLmFkZChyZXNvdXJjZSk7Ci0KLQkJCQkJLy8gcmVzZXQgdGhlIHJlc291cmNlIG1hbmFnZXIgcmVmZXJlbmNlIGluIFVSSUNvbnZlcnRlciBvZgotCQkJCQkvLyB0aGlzIHJlc291cmNlIHNldAotCQkJCQkvLyBzaW5jZSB0aGUgcmVzb3VyY2UgbWFuYWdlciBpcyByZWxvYWRlZAotCQkJCQkvLwotCQkJCQlNdWx0aUZpbGVVUklDb252ZXJ0ZXIgdXJpQ29udmVydGVyID0gKE11bHRpRmlsZVVSSUNvbnZlcnRlcikgZ2V0VVJJQ29udmVydGVyKCk7Ci0JCQkJCXVyaUNvbnZlcnRlci5yZXNNZ3IgPSBudWxsOwotCQkJCQkKLQkJCQkJcmVsb2FkQWxsQ29uZmlncyA9IHRydWU7Ci0JCQkJfQotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCUNvbW1vblBsdWdpbi5JTlNUQU5DRS5sb2coZSk7Ci0JCQl9Ci0KLQkJfQotCQkvLyByZWxvYWQgdGhlIHJlc291cmNlcwotCQkvLwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSByZXNvdXJjZUxpc3QuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlNdWx0aUZpbGVYTUlSZXNvdXJjZUltcGwgcmVzb3VyY2UgPSAoTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsKSBpdGVyCi0JCQkJCS5uZXh0KCk7Ci0KLQkJCS8vIGNsZWFyIG1hcmtlcnMgZm9yIHRoaXMgcmVzb3VyY2UKLQkJCS8vCi0JCQltYXJrZXJNYW5hbmdlci5jbGVhck1hcmtlcnMocmVzb3VyY2UpOwotCi0JCQl0cnkgewotCQkJCWlmIChyZXNvdXJjZS5yZWxvYWQocHJveGllcykpIHsKLQkJCQkJcmVsb2FkZWRSZXNvdXJjZXMuYWRkKHJlc291cmNlKTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJQ29tbW9uUGx1Z2luLklOU1RBTkNFLmxvZyhlKTsKLQkJCX0KLQkJfQotCi0JCWlmICghcmVsb2FkZWRSZXNvdXJjZXMuaXNFbXB0eSgpKSB7Ci0JCQkvLyByZWluaXRpYWxpemUgdGhlIHJlc291cmNlIHNldAotCQkJLy8KLQkJCWluaXRpYWxpemUocmVsb2FkQWxsQ29uZmlncyk7Ci0KLQkJCS8vIG5vdGlmeSB0aGUgbGlzdGVuZXJzCi0JCQkvLwotCQkJaWYgKHJlZnJlc2hMaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJCUlSZWZyZXNoRXZlbnQgZXZlbnQgPSBuZXcgUmVmcmVzaEV2ZW50KHJlbG9hZGVkUmVzb3VyY2VzLAotCQkJCQkJcHJveGllcyk7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gbmV3IEFycmF5TGlzdChyZWZyZXNoTGlzdGVuZXJzKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQlJUmVmcmVzaExpc3RlbmVyIGxpc3RlbmVyID0gKElSZWZyZXNoTGlzdGVuZXIpIGl0ZXIubmV4dCgpOwotCQkJCQlsaXN0ZW5lci5ub3RpZnlSZWZyZXNoZWQoZXZlbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiByZWxvYWRlZFJlc291cmNlczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKGJvb2xlYW4gbG9hZENvbmZpZ3VyYXRpb25zKSB7Ci0JCS8vIGxvYWQgdGhlIFJlc291cmNlTWFuYWdlciB0cmVlIGFuZCBvcHBvc2l0ZSBmZWF0dXJlcwotCQkvLwotCQlsb2FkUmVzb3VyY2VNYW5hZ2VyVHJlZSgpOwotCi0JCXNldENvbnRhaW5lcnNPZkxvYWRlZEVsZW1lbnRzKCk7Ci0JCQotCQlpZihsb2FkQ29uZmlndXJhdGlvbnMpIHsKLQkJCWxvYWRDb25maWd1cmF0aW9ucygpOwotCQl9Ci0KLQkJbG9hZE9wcG9zaXRlRmVhdHVyZXMoKTsKLQotCQkvLyByZXNldCB0aGUgcmVzb3VyY2UgbWFuYWdlciByZWZlcmVuY2UgaW4gVVJJQ29udmVydGVyIG9mIHRoaXMgcmVzb3VyY2UKLQkJLy8gc2V0Ci0JCS8vCi0JCU11bHRpRmlsZVVSSUNvbnZlcnRlciB1cmlDb252ZXJ0ZXIgPSAoTXVsdGlGaWxlVVJJQ29udmVydGVyKSBnZXRVUklDb252ZXJ0ZXIoKTsKLQkJdXJpQ29udmVydGVyLnJlc01nciA9IG51bGw7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBzZXRDb250YWluZXJzT2ZMb2FkZWRFbGVtZW50cygpIHsKLQkJUmVzb3VyY2VNYW5hZ2VyIHJlc01nciA9IGdldFJvb3RSZXNvdXJjZU1hbmFnZXIoKTsKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBuZXcgQWJzdHJhY3RUcmVlSXRlcmF0b3IocmVzTWdyLCBmYWxzZSkgewotCi0JCQkvKioKLQkJCSAqIENvbW1lbnQgZm9yIDxjb2RlPnNlcmlhbFZlcnNpb25VSUQ8L2NvZGU+Ci0JCQkgKi8KLQkJCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDIxNzI2OTEwMTc5ODc3MDI1MDZMOwotCi0JCQlwcm90ZWN0ZWQgSXRlcmF0b3IgZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQkJCVJlc291cmNlTWFuYWdlciByZXNNZ3IgPSAoUmVzb3VyY2VNYW5hZ2VyKSBvYmplY3Q7Ci0JCQkJQ29sbGVjdGlvbiBHVUlEcyA9IG5ldyBIYXNoU2V0KCk7Ci0JCQkJTGlzdCBzdWJNZ3JzID0gbmV3IEFycmF5TGlzdChyZXNNZ3IuZ2V0U3ViTWFuYWdlcnMoKSk7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gc3ViTWdycy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCUludGVybmFsRU9iamVjdCBzdWJNZ3IgPSAoSW50ZXJuYWxFT2JqZWN0KSBpdGVyCi0JCQkJCQkJCS5uZXh0KCk7Ci0JCQkJCQlpZiAoc3ViTWdyICE9IG51bGwgJiYgIXN1Yk1nci5lSXNQcm94eSgpKSB7Ci0JCQkJCQkJTWV0aG9kRWxlbWVudCBlID0gUGVyc2lzdGVuY2VVdGlsCi0JCQkJCQkJCQkuZ2V0TWV0aG9kRWxlbWVudChzdWJNZ3IuZVJlc291cmNlKCkpOwotCQkJCQkJCUdVSURzLmFkZChlLmdldEd1aWQoKSk7Ci0JCQkJCQl9Ci0JCQkJCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkJCQkJdGhyb3cgZTsKLQkJCQkJfQotCQkJCX0KLQkJCQlSZXNvdXJjZSByZXNvdXJjZSA9IHJlc01nci5lUmVzb3VyY2UoKTsKLQkJCQlpZihyZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQkJCU1ldGhvZEVsZW1lbnQgcGFyZW50ID0gUGVyc2lzdGVuY2VVdGlsCi0JCQkJCQkJLmdldE1ldGhvZEVsZW1lbnQocmVzb3VyY2UpOwotCi0JCQkJCS8vIHJlc29sdmUgdGhlIHByb3h5IG9mIHRoaXMgZWxlbWVudCBpbiB0aGUgcGFyZW50Ci0JCQkJCS8vCi0JCQkJCU11bHRpRmlsZVNhdmVVdGlsLnJlc29sdmVQcm94aWVzKEdVSURzLCBwYXJlbnQpOwotCQkJCX0KLQotCQkJCXJldHVybiByZXNNZ3IuZ2V0U3ViTWFuYWdlcnMoKS5pdGVyYXRvcigpOwotCQkJfQotCi0JCX07Ci0JCWZvciAoOyBpdGVyYXRvci5oYXNOZXh0KCk7IGl0ZXJhdG9yLm5leHQoKSkKLQkJCTsKLQl9Ci0KLQkvKioKLQkgKiBDaGVja3MgaWYgdGhlIGdpdmVuIHdvcmtzcGFjZSByZXNvdXJjZSByZXByZXNlbnRzIGEgbGlicmFyeSByZXNvdXJjZQotCSAqIAotCSAqIEBwYXJhbSB3c1Jlc291cmNlCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzTGlicmFyeVJlc291cmNlKElSZXNvdXJjZSB3c1Jlc291cmNlKSB7Ci0JCXJldHVybiBsaWJGb2xkZXJQYXRoICE9IG51bGwgJiYgbGliRm9sZGVyUGF0aC5pc1ByZWZpeE9mKHdzUmVzb3VyY2UuZ2V0TG9jYXRpb24oKSk7Ci0JfQotCQotCS8qKgotCSAqIENoZWNrcyBpZiB0aGUgZ2l2ZW4gd29ya3NwYWNlIHJlc291cmNlIGlzIGEgbmV3IHJlc291cmNlIHRoYXQgY2FuIGJlIGxvYWRlZCAKLQkgKiB1c2luZyB7QGxpbmsgI2xvYWROZXdSZXNvdXJjZXMoQ29sbGVjdGlvbil9Ci0JICogIAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc05ld1Jlc291cmNlVG9Mb2FkKElSZXNvdXJjZSB3c1Jlc291cmNlKSB7Ci0JCUlQYXRoIGxvYyA9IHdzUmVzb3VyY2UuZ2V0TG9jYXRpb24oKTsKLQkJcmV0dXJuIChsb2MgIT0gbnVsbCAmJiBjb25maWdGb2xkZXJQYXRoICE9IG51bGwgCi0JCQkJJiYgTXVsdGlGaWxlU2F2ZVV0aWwuREVGQVVMVF9GSUxFX0VYVEVOU0lPTi5lcXVhbHNJZ25vcmVDYXNlKCIuIiArIGxvYy5nZXRGaWxlRXh0ZW5zaW9uKCkpIC8vJE5PTi1OTFMtMSQKLQkJCQkmJiBjb25maWdGb2xkZXJQYXRoLmlzUHJlZml4T2YobG9jKQotCQkJCSYmICFGaWxlTWFuYWdlci5nZXRJbnN0YW5jZSgpLmlzVGVhbVByaXZhdGUobG9jLnRvU3RyaW5nKCkpKTsKLQotCX0KLQkKLQkvKioKLQkgKiBMb2FkcyBuZXcgcmVzb3VyY2VzIHNwZWNpZmllZCBieSB0aGUgZ2l2ZW4gY29sbGVjdGlvbiBvZiB7QGxpbmsgSVJlc291cmNlIHdvcmsgc3BhY2UgcmVzb3VyY2VzfQotCSAqIGludG8gdGhpcyByZXNvdXJjZSBzZXQKLQkgKiBUT0RPOiBtZXJnZSB0aGlzIGNvZGUgdG8ge0BsaW5rICNnZXRSZXNvdXJjZShVUkksIGJvb2xlYW4pfQotCSAqIEBwYXJhbSB3c1Jlc291cmNlcyBjb2xsZWN0aW9uIG9mIHtAbGluayBJUmVzb3VyY2V9IG9iamVjdHMKLQkgKi8KLQlwdWJsaWMgdm9pZCBsb2FkTmV3UmVzb3VyY2VzKENvbGxlY3Rpb248SVJlc291cmNlPiB3c1Jlc291cmNlcykgewotCQlBcnJheUxpc3QgbmV3Q29uZmlnRmlsZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHdzUmVzb3VyY2VzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IHdzUmVzb3VyY2UgPSAoT2JqZWN0KSBpdGVyLm5leHQoKTsKLQkJCWlmKHdzUmVzb3VyY2UgaW5zdGFuY2VvZiBJUmVzb3VyY2UpIHsKLQkJCQlJUmVzb3VyY2Ugd3NSZXMgPSAoSVJlc291cmNlKSB3c1Jlc291cmNlOwotCQkJCUlQYXRoIGxvYyA9IHdzUmVzLmdldExvY2F0aW9uKCk7Ci0JCQkJU3RyaW5nIGNvbmZpZ0ZpbGU7Ci0JCQkJaWYobG9jICE9IG51bGwgJiYgY29uZmlnRm9sZGVyUGF0aCAhPSBudWxsIAotCQkJCQkJJiYgTXVsdGlGaWxlU2F2ZVV0aWwuREVGQVVMVF9GSUxFX0VYVEVOU0lPTi5lcXVhbHNJZ25vcmVDYXNlKCIuIiArIGxvYy5nZXRGaWxlRXh0ZW5zaW9uKCkpIC8vJE5PTi1OTFMtMSQKLQkJCQkJCSYmIGNvbmZpZ0ZvbGRlclBhdGguaXNQcmVmaXhPZihsb2MpCi0JCQkJCQkmJiAhRmlsZU1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5pc1RlYW1Qcml2YXRlKGNvbmZpZ0ZpbGUgPSBsb2MudG9TdHJpbmcoKSkpIHsKLQkJCQkJbmV3Q29uZmlnRmlsZXMuYWRkKGNvbmZpZ0ZpbGUpOwotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQkJLy8gbG9hZCBuZXcgY29uZmlndXJhdGlvbnMKLQkJLy8KLQkJZm9yIChJdGVyYXRvciBpdGVyID0gbmV3Q29uZmlnRmlsZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlTdHJpbmcgY29uZmlnRmlsZSA9IChTdHJpbmcpIGl0ZXIubmV4dCgpOwotCQkJbG9hZENvbmZpZ3VyYXRpb24obmV3IEZpbGUoY29uZmlnRmlsZSkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU3BlY2lhbCBoYW5kbGluZyBmb3IgTWV0aG9kQ29uZmlndXJhdGlvbiBzaW5jZSBNZXRob2RMaWJyYXJ5IHdpbGwgbm8KLQkgKiBsb25nZXIga2VlcHMgdGhlIHJlZmVyZW5jZXMgdG8gTWV0aG9kQ29uZmlndXJhdGlvbnMgYW5kIHRoZWlyIGZpbGVzLiBBbnkKLQkgKiBYTUkgZmlsZSB1bmRlciBmb2xkZXIgLi9jb25maWd1cmF0aW9ucyBhbmQgaXRzIHN1YmZvbGRlcnMgd2lsbCBiZSB0cmVhdGVkCi0JICogYXMgYSBjb25maWd1cmF0aW9uIGZpbGUuIFRoZXkgd2lsbCBiZSBsb2FkZWQgYW5kIGFkZGVkIHRvIE1ldGhvZExpYnJhcnkKLQkgKiBhcyBpdHMgY29uZmlndXJhdGlvbnMuCi0JICogQHJldHVybiBUT0RPCi0JICovCi0JcHJvdGVjdGVkIENvbGxlY3Rpb248UmVzb3VyY2U+IGxvYWRDb25maWd1cmF0aW9ucygpIHsKLQkJTWV0aG9kTGlicmFyeSBsaWIgPSBnZXRNZXRob2RMaWJyYXJ5KCk7Ci0JCUZpbGUgY29uZmlnRGlyID0gbmV3IEZpbGUobmV3IEZpbGUobGliLmVSZXNvdXJjZSgpLmdldFVSSSgpCi0JCQkJLnRvRmlsZVN0cmluZygpKS5nZXRQYXJlbnQoKSwKLQkJCQlNdWx0aUZpbGVTYXZlVXRpbC5NRVRIT0RfQ09ORklHVVJBVElPTl9GT0xERVJfTkFNRSk7Ci0JCXJldHVybiBsb2FkQ29uZmlndXJhdGlvbnMoY29uZmlnRGlyKTsKLQl9Ci0JCi0JLyoqCi0JICogTG9hZHMgbWV0aG9kIGNvbmZpZ3VyYXRpb25zIGZyb20gdGhlIHNwZWNpZmllZCBkaXJlY3RvcnkuCi0JICogCi0JICogQHBhcmFtIGNvbmZpZ0RpcgotCSAqIEByZXR1cm4gVE9ETwotCSAqLwotCXByb3RlY3RlZCBDb2xsZWN0aW9uPFJlc291cmNlPiBsb2FkQ29uZmlndXJhdGlvbnMoRmlsZSBjb25maWdEaXIpIHsKLQkJQXJyYXlMaXN0PFJlc291cmNlPiByZXNvdXJjZXMgPSBuZXcgQXJyYXlMaXN0PFJlc291cmNlPigpOwotCQlJdGVyYXRvciBkaXJJdGVyID0gTXVsdGlGaWxlU2F2ZVV0aWwubGlzdENvbmZpZ0ZpbGVzKGNvbmZpZ0Rpcik7Ci0JCUhhc2hTZXQ8RmlsZT4gY29uZmlnRmlsZXMgPSBuZXcgSGFzaFNldDxGaWxlPigpOwotCQl3aGlsZSAoZGlySXRlci5oYXNOZXh0KCkpIHsKLQkJCUZpbGUgY29uZmlnRmlsZSA9IChGaWxlKSBkaXJJdGVyLm5leHQoKTsKLQkJCWlmKGNvbmZpZ0ZpbGUuaXNGaWxlKCkpIHsKLQkJCQljb25maWdGaWxlcy5hZGQoY29uZmlnRmlsZSk7Ci0JCQl9Ci0JCX0KLQkJTWV0aG9kTGlicmFyeSBsaWIgPSBnZXRNZXRob2RMaWJyYXJ5KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGxpYi5nZXRQcmVkZWZpbmVkQ29uZmlndXJhdGlvbnMoKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gKE1ldGhvZENvbmZpZ3VyYXRpb24pIGl0ZXIubmV4dCgpOwotCQkJRmlsZSBmaWxlID0gbmV3IEZpbGUoY29uZmlnLmVSZXNvdXJjZSgpLmdldFVSSSgpLnRvRmlsZVN0cmluZygpKTsKLQkJCWlmIChjb25maWdGaWxlcy5jb250YWlucyhmaWxlKSkgewotCQkJCWNvbmZpZ0ZpbGVzLnJlbW92ZShmaWxlKTsKLQkJCX0KLQkJfQotCi0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGNvbmZpZ0ZpbGVzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJRmlsZSBmaWxlID0gKEZpbGUpIGl0ZXIubmV4dCgpOwotCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSBsb2FkQ29uZmlndXJhdGlvbihmaWxlKTsKLQkJCWlmKHJlc291cmNlICE9IG51bGwpIHsKLQkJCQlyZXNvdXJjZXMuYWRkKHJlc291cmNlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzb3VyY2VzOwotCX0KLQotCXByb3RlY3RlZCBSZXNvdXJjZSBsb2FkQ29uZmlndXJhdGlvbihGaWxlIGNvbmZpZ0ZpbGUpIHsKLQkJdHJ5IHsKLQkJCU1ldGhvZExpYnJhcnkgbGliID0gZ2V0TWV0aG9kTGlicmFyeSgpOwotCQkJVVJJIHVyaSA9IFVSSS5jcmVhdGVGaWxlVVJJKGNvbmZpZ0ZpbGUuZ2V0Q2Fub25pY2FsUGF0aCgpKTsKLQkJCVJlc291cmNlIHJlc291cmNlID0gc3VwZXIuZ2V0UmVzb3VyY2UodXJpLCB0cnVlKTsKLQkJCWlmIChyZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQkJTWV0aG9kRWxlbWVudCBlID0gUGVyc2lzdGVuY2VVdGlsCi0JCQkJCQkuZ2V0TWV0aG9kRWxlbWVudChyZXNvdXJjZSk7Ci0JCQkJaWYgKGUgaW5zdGFuY2VvZiBNZXRob2RDb25maWd1cmF0aW9uKSB7Ci0JCQkJCWlmKFBlcnNpc3RlbmNlVXRpbC5oYXNEdXBsaWNhdGVHVUlEKGUsIGxpYi5nZXRQcmVkZWZpbmVkQ29uZmlndXJhdGlvbnMoKSkpIHsKLQkJCQkJCVBlcnNpc3RlbmNlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcigKLQkJCQkJCQkJTkxTLmJpbmQoUGVyc2lzdGVuY2VSZXNvdXJjZXMubG9hZENvbmZpZ3VyYXRpb25fY291bGROb3RMb2FkX2xvZ01zZywgY29uZmlnRmlsZSkpOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJbGliLmdldFByZWRlZmluZWRDb25maWd1cmF0aW9ucygpLmFkZCgoTWV0aG9kQ29uZmlndXJhdGlvbikgZSk7Ci0JCQkJCQlyZXR1cm4gcmVzb3VyY2U7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQlQZXJzaXN0ZW5jZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoCi0JCQkJCQkJTkxTLmJpbmQoUGVyc2lzdGVuY2VSZXNvdXJjZXMubG9hZENvbmZpZ3VyYXRpb25fbm90Q29uZmlnRmlsZV9sb2dNc2csIGNvbmZpZ0ZpbGUpCi0JCQkJCQkJKTsKLQkJCQl9Ci0JCQkJcmVzb3VyY2UudW5sb2FkKCk7Ci0JCQkJZ2V0UmVzb3VyY2VzKCkucmVtb3ZlKHJlc291cmNlKTsKLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVBlcnNpc3RlbmNlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gc3RyaW5nCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlRXhjZXB0aW9uKE9iamVjdCBlcnIpIHsKLQkJaWYgKGVyciBpbnN0YW5jZW9mIFRocm93YWJsZSkgewotCQkJUGVyc2lzdGVuY2VQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKChFeGNlcHRpb24pZXJyKTsKLQkJfSBlbHNlIHsKLQkJCVBlcnNpc3RlbmNlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlcnIudG9TdHJpbmcoKSk7Ci0JCX0KLQkJaWYoTXVsdGlGaWxlU2F2ZVV0aWwuREVCVUcpIHsKLQkJCWlmIChlcnIgaW5zdGFuY2VvZiBUaHJvd2FibGUpIHsKLQkJCQkoKEV4Y2VwdGlvbikgZXJyKS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0gZWxzZSB7Ci0JCQkJU3lzdGVtLmVyci5wcmludGxuKGVyci50b1N0cmluZygpKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHJlc2V0KCkgewotCQlpZiAodXJpQ29udmVydGVyIGluc3RhbmNlb2YgTXVsdGlGaWxlVVJJQ29udmVydGVyKSB7Ci0JCQkoKE11bHRpRmlsZVVSSUNvbnZlcnRlcikgdXJpQ29udmVydGVyKS5kaXNwb3NlKCk7Ci0JCX0KLQkJdXJpQ29udmVydGVyID0gbnVsbDsKLQkJYm9vbGVhbiBub3RpZnkgPSBlRGVsaXZlcigpOwotCQlib29sZWFuIHJlcG9ydEVycm9yID0gUkVQT1JUX0VSUk9SOwotCQlib29sZWFuIHJlZnJlc2ggPSBSZWZyZXNoSm9iLmdldEluc3RhbmNlKCkuaXNFbmFibGVkKCk7Ci0JCWJvb2xlYW4gb2xkTWFya2VyTWFuYWdlckVuYWJsZWQgPSBtYXJrZXJNYW5hbmdlci5pc0VuYWJsZWQoKTsKLQotCQl0cnkgewotCQkJaWYoUmVmcmVzaEpvYi5nZXRJbnN0YW5jZSgpLmdldFJlc291cmNlU2V0KCkgPT0gdGhpcykgewotCQkJCVJlZnJlc2hKb2IuZ2V0SW5zdGFuY2UoKS5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQlSZWZyZXNoSm9iLmdldEluc3RhbmNlKCkucmVzZXQoKTsKLQkJCX0KLQkJCWVTZXREZWxpdmVyKGZhbHNlKTsKLQkJCVJFUE9SVF9FUlJPUiA9IGZhbHNlOwotCQkJbWFya2VyTWFuYW5nZXIuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQltYXJrZXJNYW5hbmdlci5jbGVhckFsbCgpOwotCi0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBuZXcgQXJyYXlMaXN0KGdldFJlc291cmNlcygpKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSAoUmVzb3VyY2UpIGl0ZXIubmV4dCgpOwotCQkJCXRyeSB7Ci0JCQkJCXJlc291cmNlLnVubG9hZCgpOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCS8vIFN5c3RlbS5lcnIucHJpbnRsbigiRXJyb3IgdW5sb2FkaW5nIHJlc291cmNlOiAiICsKLQkJCQkJLy8gcmVzb3VyY2UuZ2V0VVJJKCkpOwotCQkJCQkvLyBlLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCX0KLQkJCX0KLQotCQkJY2xlYXJFcnJvcnMoKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWVTZXREZWxpdmVyKG5vdGlmeSk7Ci0JCQlSRVBPUlRfRVJST1IgPSByZXBvcnRFcnJvcjsKLQkJCW1hcmtlck1hbmFuZ2VyLnNldEVuYWJsZWQob2xkTWFya2VyTWFuYWdlckVuYWJsZWQpOwotCQkJaWYoUmVmcmVzaEpvYi5nZXRJbnN0YW5jZSgpLmdldFJlc291cmNlU2V0KCkgPT0gdGhpcykgewotCQkJCVJlZnJlc2hKb2IuZ2V0SW5zdGFuY2UoKS5zZXRFbmFibGVkKHJlZnJlc2gpOwotCQkJfQotCQl9Ci0KLQkJaWYgKGd1aWRUb01ldGhvZEVsZW1lbnRNYXAgIT0gbnVsbCkgewotCQkJZ3VpZFRvTWV0aG9kRWxlbWVudE1hcC5jbGVhcigpOwotCQl9Ci0KLQkJZ2V0UmVzb3VyY2VzKCkuY2xlYXIoKTsKLQotCQlpZiAoVVJJVG9UZW1wVVJJTWFwICE9IG51bGwpIHsKLQkJCVVSSVRvVGVtcFVSSU1hcC5jbGVhcigpOwotCQl9Ci0KLQkJTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsLmNsZWFyRGV0YWNoZWRFT2JqZWN0VG9JRE1hcCgpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjbGVhckVycm9ycygpIHsKLQkJLy8gY2xlYXIgYWxsIG1hcmtlcnMKLQkJbWFya2VyTWFuYW5nZXIuY2xlYXJBbGwoKTsKLQl9Ci0KLQlwdWJsaWMgTWV0aG9kTGlicmFyeSBsb2FkTGlicmFyeShTdHJpbmcgcGF0aCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWxvbmcgYmVnaW4gPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQotCQlyZXNldCgpOwotCi0JCWxvbmcgYWZ0ZXJSZXNldCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQkKLQkJaWYgKE11bHRpRmlsZVNhdmVVdGlsLkRFQlVHKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIlJlc2V0IHRpbWU6ICIgKyAoYWZ0ZXJSZXNldCAtIGJlZ2luKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCU1ldGhvZExpYnJhcnkgbGliID0gbG9hZExpYnJhcnlXaXRob3V0UmVzZXQocGF0aCk7Ci0KLQkJaWYgKE11bHRpRmlsZVNhdmVVdGlsLkRFQlVHKSB7Ci0JCQlTeXN0ZW0ub3V0Ci0JCQkJCS5wcmludGxuKCJMb2FkIHRpbWU6ICIgKyAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBiZWdpbikpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlpZiAoTXVsdGlGaWxlU2F2ZVV0aWwuREVCVUcpIHsKLQkJCS8vIGNoZWNrIGlmIGFueSByZXNvdXJjZSBpcyBtYXJrZWQgYXMgbW9kaWZpZWQgYWZ0ZXIgbG9hZGluZwotCQkJLy8KLQkJCVN5c3RlbS5lcnIucHJpbnRsbigiTW9kaWZpZWQgcmVzb3VyY2VzIGFmdGVyIGxvYWRpbmc6Iik7IC8vJE5PTi1OTFMtMSQKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGdldFJlc291cmNlcygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCVJlc291cmNlIHJlc291cmNlID0gKFJlc291cmNlKSBpdGVyLm5leHQoKTsKLQkJCQlpZiAocmVzb3VyY2UuaXNNb2RpZmllZCgpKSB7Ci0JCQkJCVN5c3RlbS5lcnIucHJpbnRsbigiICAiICsgcmVzb3VyY2UuZ2V0VVJJKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGxpYjsKLQl9Ci0JCi0JcHJvdGVjdGVkIFJlc291cmNlIGxvYWRMaWJyYXJ5UmVzb3VyY2UoU3RyaW5nIHBhdGgpIHsKLQkJVVJJIHVyaSA9IFVSSS5jcmVhdGVGaWxlVVJJKHBhdGgpOwotCQlSZXNvdXJjZSByZXMgPSBzdXBlci5nZXRSZXNvdXJjZSh1cmksIHRydWUpOwotCQlpZiAoIXJlcy5nZXRFcnJvcnMoKS5pc0VtcHR5KCkpIHsKLQkJCVN0cmluZ0J1ZmZlciBzdHJCdWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQlzdHJCdWYuYXBwZW5kKFBlcnNpc3RlbmNlUmVzb3VyY2VzLmxvYWRMaWJyYXJ5RXJyb3JfbXNnKTsKLQkJCWZvciAoSXRlcmF0b3I8Pz4gaXRlciA9IHJlcy5nZXRFcnJvcnMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlSZXNvdXJjZS5EaWFnbm9zdGljIGVycm9yID0gKFJlc291cmNlLkRpYWdub3N0aWMpIGl0ZXIKLQkJCQkJCS5uZXh0KCk7Ci0JCQkJc3RyQnVmLmFwcGVuZChOTFMuYmluZCgKLQkJCQkJCVBlcnNpc3RlbmNlUmVzb3VyY2VzLmxvYWRMaWJyYXJ5RXJyb3JfZGV0YWlscywKLQkJCQkJCShuZXcgT2JqZWN0W10geyBTdHJpbmcudmFsdWVPZihlcnJvci5nZXRMaW5lKCkpLAotCQkJCQkJCQlTdHJpbmcudmFsdWVPZihlcnJvci5nZXRDb2x1bW4oKSksCi0JCQkJCQkJCWVycm9yLmdldE1lc3NhZ2UoKSB9KSkpOwotCQkJfQotCQkJU3RyaW5nIG1zZyA9IHN0ckJ1Zi50b1N0cmluZygpOwotCQkJQ29tbW9uUGx1Z2luLklOU1RBTkNFLmxvZyhtc2cpOwotCQkJaWYoTXVsdGlGaWxlU2F2ZVV0aWwuREVCVUcpIHsKLQkJCQlTeXN0ZW0uZXJyLnByaW50bG4obXNnKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzOwotCX0KLQotCXB1YmxpYyBNZXRob2RMaWJyYXJ5IGxvYWRMaWJyYXJ5V2l0aG91dFJlc2V0KFN0cmluZyBwYXRoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJbG9hZGluZyA9IHRydWU7Ci0KLQkJLy8gbm8gcmVmcmVzaCBkdXJpbmcgbG9hZAotCQkvLwotCQlib29sZWFuIGIgPSBSZWZyZXNoSm9iLmdldEluc3RhbmNlKCkuaXNFbmFibGVkKCk7Ci0JCWlmKFJlZnJlc2hKb2IuZ2V0SW5zdGFuY2UoKS5nZXRSZXNvdXJjZVNldCgpID09IHRoaXMpIHsKLQkJCVJlZnJlc2hKb2IuZ2V0SW5zdGFuY2UoKS5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCVJlZnJlc2hKb2IuZ2V0SW5zdGFuY2UoKS5yZXNldCgpOwotCQl9Ci0JCQotCQkvLyBkZWZlciBhZGRpbmcgbWFya2VycyBkdXJpbmcgbG9hZAotCQkvLwotCQlib29sZWFuIGF1dG9TY2hlZHVsZWQgPSBtYXJrZXJNYW5hbmdlci5pc0F1dG9TY2hlZHVsZWQoKTsKLQkJbWFya2VyTWFuYW5nZXIuc2V0QXV0b1NjaGVkdWxlZChmYWxzZSk7Ci0JCXRyeSB7CQkKLQkJCUZpbGUgbGliRmlsZSA9IG5ldyBGaWxlKHBhdGgpOwotCQkJY29uZmlnRm9sZGVyUGF0aCA9IG5ldyBQYXRoKG5ldyBGaWxlKGxpYkZpbGUuZ2V0UGFyZW50RmlsZSgpLAotCQkJCQlNdWx0aUZpbGVTYXZlVXRpbC5NRVRIT0RfQ09ORklHVVJBVElPTl9GT0xERVJfTkFNRSkuZ2V0Q2Fub25pY2FsUGF0aCgpKTsKLQkJCWxpYkZvbGRlclBhdGggPSBuZXcgUGF0aChsaWJGaWxlLmdldFBhcmVudEZpbGUoKS5nZXRDYW5vbmljYWxQYXRoKCkpOwotCQkJUmVzb3VyY2UgcmVzID0gbG9hZExpYnJhcnlSZXNvdXJjZShsaWJGaWxlLmdldENhbm9uaWNhbFBhdGgoKSk7IAotCQkJdHJ5IHsKLQkJCQlpbml0aWFsaXplKHRydWUpOwotCQkJCQotCQkJCS8vIFNldCBtb2RpZmllZCBmbGFnIG9mIGxpYnJhcnkgcmVzb3VyY2UgdG8gZmFsc2UgaW4gY2FzZSBpdCBoYWQgYmVlbiBtb2RpZmllZCBkdXJpbmcgaW5pdGlhbGl6YXRpb24KLQkJCQkvLwotCQkJCWlmKHJlcyAhPSBudWxsKSB7Ci0JCQkJCXJlcy5zZXRNb2RpZmllZChmYWxzZSk7Ci0JCQkJfQotCQkJCQotCQkJCXJldHVybiBnZXRNZXRob2RMaWJyYXJ5KCk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCVBlcnNpc3RlbmNlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKE5MUy5iaW5kKAotCQkJCQkJUGVyc2lzdGVuY2VSZXNvdXJjZXMuaW52YWxpZExpYnJhcnlGaWxlRXJyb3JfbXNnLCBwYXRoKSk7Ci0JCQl9Ci0JCX0gZmluYWxseSB7Ci0JCQlpZihSZWZyZXNoSm9iLmdldEluc3RhbmNlKCkuZ2V0UmVzb3VyY2VTZXQoKSA9PSB0aGlzKSB7Ci0JCQkJUmVmcmVzaEpvYi5nZXRJbnN0YW5jZSgpLnNldEVuYWJsZWQoYik7Ci0JCQl9Ci0JCQkJCQotCQkJbWFya2VyTWFuYW5nZXIuc2V0QXV0b1NjaGVkdWxlZChhdXRvU2NoZWR1bGVkKTsKLQkJCW1hcmtlck1hbmFuZ2VyLnN0YXJ0KCk7Ci0JCQkKLQkJCWxvYWRpbmcgPSBmYWxzZTsKLQkJfQotCX0KLQotCS8qKgotCSAqIExvYWRzIG9wcG9zaXRlIGZlYXR1cmVzIGZvciBhbGwgbG9hZGVkIG9iamVjdHMKLQkgKi8KLQlwcml2YXRlIHZvaWQgbG9hZE9wcG9zaXRlRmVhdHVyZXMoKSB7Ci0JCUFycmF5TGlzdCBvcHBvc2l0ZUZlYXR1cmVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBBc3NvY2lhdGlvbkhlbHBlci5nZXRQcmVkZWZpbmVkT3Bwb3NpdGVGZWF0dXJlcygpCi0JCQkJLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT3Bwb3NpdGVGZWF0dXJlIG9wcG9zaXRlRmVhdHVyZSA9IChPcHBvc2l0ZUZlYXR1cmUpIGl0ZXIubmV4dCgpOwotCQkJaWYgKG9wcG9zaXRlRmVhdHVyZS5yZXNvbHZlT3duZXIoKSkgewotCQkJCW9wcG9zaXRlRmVhdHVyZXMuYWRkKG9wcG9zaXRlRmVhdHVyZSk7Ci0JCQl9Ci0JCX0KLQkJbG9hZE9wcG9zaXRlRmVhdHVyZXMob3Bwb3NpdGVGZWF0dXJlcyk7Ci0JfQotCi0JLyoqCi0JICogTG9hZHMgUmVzb3VyY2VNYW5hZ2VyIHRyZWUgb2YgdGhlIG9wZW4gbGlicmFyeSBhbmQgY29ubmVjdCBhbnkgbG9hZGVkCi0JICogTWV0aG9kVW5pdCB0byB0aGUgbGlicmFyeSB0cmVlIGFzIHdlbGwuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGxvYWRSZXNvdXJjZU1hbmFnZXJUcmVlKCkgewotCQlsb25nIGJlZ2luID0gMDsKLQkJCi0JCWlmKE11bHRpRmlsZVNhdmVVdGlsLkRFQlVHKSB7Ci0JCQliZWdpbiA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQl9Ci0KLQkJLy8gZGlzYWJsZSBsb2dnaW5nIHVucmVzb2x2ZWQgcHJveGllcyBkdXJpbmcgbG9hZGluZyByZXNvdXJjZSBtYW5hZ2VyCi0JCS8vIHRyZWUKLQkJLy8KLQkJYm9vbGVhbiBvbGRNYXJrZXJNYW5hZ2VyRW5hYmxlZCA9IG1hcmtlck1hbmFuZ2VyLmlzRW5hYmxlZCgpOwotCQltYXJrZXJNYW5hbmdlci5zZXRFbmFibGVkKGZhbHNlKTsKLQotCQlNdWx0aUZpbGVVUklDb252ZXJ0ZXIgdXJpQ29udmVydGVyID0gKE11bHRpRmlsZVVSSUNvbnZlcnRlcikgZ2V0VVJJQ29udmVydGVyKCk7Ci0JCXRyeSB7Ci0JCQkvLyB0aGlzIHByZXZlbnRzIHVyaUNvbnZlcnRlciBmcm9tIGxvYWRpbmcgcmVzb3VyY2VzIHdoaWxlCi0JCQkvLyBub3JtYWxpemluZyBVUkkKLQkJCS8vCi0JCQl1cmlDb252ZXJ0ZXIuc2V0UmVzb2x2ZVByb3h5KGZhbHNlKTsKLQotCQkJUmVzb3VyY2VNYW5hZ2VyIHJlc01nciA9IGdldFJvb3RSZXNvdXJjZU1hbmFnZXIoKTsKLQkJCUl0ZXJhdG9yPD8+IGl0ZXJhdG9yID0gbmV3IEFic3RyYWN0VHJlZUl0ZXJhdG9yPE9iamVjdD4ocmVzTWdyLCBmYWxzZSkgewotCi0JCQkJLyoqCi0JCQkJICogQ29tbWVudCBmb3IgPGNvZGU+c2VyaWFsVmVyc2lvblVJRDwvY29kZT4KLQkJCQkgKi8KLQkJCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAyMTcyNjkxMDE3OTg3NzAyNTA2TDsKLQotCQkJCXByb3RlY3RlZCBJdGVyYXRvcjw/PiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJCVJlc291cmNlTWFuYWdlciByZXNNZ3IgPSAoUmVzb3VyY2VNYW5hZ2VyKSBvYmplY3Q7Ci0JCQkJCXJldHVybiByZXNNZ3IuZ2V0U3ViTWFuYWdlcnMoKS5pdGVyYXRvcigpOwotCQkJCX0KLQotCQkJfTsKLQkJCWxvYWRpbmdSZXNvdXJjZU1hbmFnZXJUcmVlID0gdHJ1ZTsKLQkJCWZvciAoOyBpdGVyYXRvci5oYXNOZXh0KCk7IGl0ZXJhdG9yLm5leHQoKSkKLQkJCQk7Ci0JCX0gZmluYWxseSB7Ci0JCQltYXJrZXJNYW5hbmdlci5zZXRFbmFibGVkKG9sZE1hcmtlck1hbmFnZXJFbmFibGVkKTsKLQkJCXVyaUNvbnZlcnRlci5zZXRSZXNvbHZlUHJveHkodHJ1ZSk7Ci0JCQlsb2FkaW5nUmVzb3VyY2VNYW5hZ2VyVHJlZSA9IGZhbHNlOwotCi0JCQkvLyBSZXBvcnRpbmcgb2YgdW5ub3JtYWxpemVkIFVSSXMgd2FzIGRpc2FibGVkIHdoaWxlIGxvYWRpbmcKLQkJCS8vIHJlc291cmNlIG1hbmFnZXIgdHJlZS4gTm93IHdlIG5lZWQKLQkJCS8vIHRvIGdvIHRocnUgYWxsIHRoZSBsb2FkZWQgb2JqZWN0cyB0byBmaW5kIHByb3hpZXMgd2l0aAotCQkJLy8gdW5ub3JtYWxpemVkIFVSSXMgYW5kIHJlcG9ydCB0aGVtCi0JCQkvLwotCQkJdHJ5IHsKLQkJCQlmb3IgKEl0ZXJhdG9yPD8+IGl0ZXIgPSBuZXcgQXJyYXlMaXN0PE9iamVjdD4oZ2V0R3VpZFRvTWV0aG9kRWxlbWVudE1hcCgpLnZhbHVlcygpKQotCQkJCQkJLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQlJbnRlcm5hbEVPYmplY3QgbyA9IChJbnRlcm5hbEVPYmplY3QpIGl0ZXIubmV4dCgpOwotCQkJCQlpZiAoby5lSXNQcm94eSgpICYmIG8uZUNvbnRhaW5lcigpICE9IG51bGwpIHsKLQkJCQkJCVVSSSB1cmkgPSBvLmVQcm94eVVSSSgpOwotCQkJCQkJVVJJIG5vcm1hbGl6ZWRVUkkgPSBnZXRVUklDb252ZXJ0ZXIoKS5ub3JtYWxpemUodXJpKTsKLQkJCQkJCWlmIChub3JtYWxpemVkVVJJID09IG51bGwpIHsKLQkJCQkJCQkvLyB0aGlzIGNhbGwgd2lsbCBsb2cgZXJyb3IgYWJvdXQgdW5yZXNvbHZlZCBwcm94eQotCQkJCQkJCS8vCi0JCQkJCQkJKChJbnRlcm5hbEVPYmplY3QpIG8uZUNvbnRhaW5lcigpKS5lUmVzb2x2ZVByb3h5KG8pOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJY2F0Y2goRXhjZXB0aW9uIGUpIHsKLQkJCQlQZXJzaXN0ZW5jZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQl9Ci0JCQkKLQkJCWlmKE11bHRpRmlsZVNhdmVVdGlsLkRFQlVHKSB7Ci0JCQkJU3lzdGVtLm91dAotCQkJCQkJLnByaW50bG4oIk11bHRpRmlsZVJlc291cmNlU2V0SW1wbC5sb2FkUmVzb3VyY2VNYW5hZ2VyVHJlZSgpOiAiICsgKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gYmVnaW4pKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIFJlc291cmNlTWFuYWdlciBnZXRSZXNvdXJjZU1hbmFnZXIoKSB7Ci0JCXJldHVybiAoKE11bHRpRmlsZVVSSUNvbnZlcnRlcikgZ2V0VVJJQ29udmVydGVyKCkpLmdldFJlc291cmNlTWFuYWdlcigpOwotCX0KLQotCXByb3RlY3RlZCBFT2JqZWN0IGZpbmRFT2JqZWN0SW5VbmxvYWRlZFJlc291cmNlcyhTdHJpbmcgaWQpIHsKLQkJcmV0dXJuIGZpbmRFT2JqZWN0SW5VbmxvYWRlZFJlc291cmNlcyhnZXRSZXNvdXJjZU1hbmFnZXIoKSwgaWQpOwotCX0KLQotCXByaXZhdGUgRU9iamVjdCBmaW5kRU9iamVjdEluVW5sb2FkZWRSZXNvdXJjZXMoUmVzb3VyY2VNYW5hZ2VyIHJlc01nciwKLQkJCVN0cmluZyBpZCkgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSByZXNNZ3IuZ2V0UmVzb3VyY2VEZXNjcmlwdG9ycygpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkuaGFzTmV4dCgpOykgewotCQkJUmVzb3VyY2VEZXNjcmlwdG9yIGRlc2MgPSAoUmVzb3VyY2VEZXNjcmlwdG9yKSBpdGVyLm5leHQoKTsKLQkJCVJlc291cmNlIHJlc291cmNlID0gc3VwZXIuZ2V0UmVzb3VyY2UoZGVzYy5nZXRSZXNvbHZlZFVSSSgpLCBmYWxzZSk7Ci0JCQlpZiAocmVzb3VyY2UgPT0gbnVsbCB8fCAhcmVzb3VyY2UuaXNMb2FkZWQoKSkgewotCQkJCXRyeSB7Ci0JCQkJCXJlc291cmNlID0gc3VwZXIuZ2V0UmVzb3VyY2UoZGVzYy5nZXRSZXNvbHZlZFVSSSgpLCB0cnVlKTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkvLwotCQkJCX0KLQkJCQlpZiAocmVzb3VyY2UgIT0gbnVsbCkgewotCQkJCQlFT2JqZWN0IGVPYmplY3QgPSByZXNvdXJjZS5nZXRFT2JqZWN0KGlkKTsKLQkJCQkJaWYgKGVPYmplY3QgIT0gbnVsbCkgewotCQkJCQkJcmV0dXJuIGVPYmplY3Q7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZm9yIChJdGVyYXRvciBpdGVyID0gcmVzTWdyLmdldFN1Yk1hbmFnZXJzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlFT2JqZWN0IGVPYmplY3QgPSBmaW5kRU9iamVjdEluVW5sb2FkZWRSZXNvdXJjZXMoCi0JCQkJCShSZXNvdXJjZU1hbmFnZXIpIGl0ZXIubmV4dCgpLCBpZCk7Ci0JCQlpZiAoZU9iamVjdCAhPSBudWxsKQotCQkJCXJldHVybiBlT2JqZWN0OwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEdldHMgb2JqZWN0IHdpdGggdGhlIGdpdmVuIGlkCi0JICovCi0JcHVibGljIEVPYmplY3QgZ2V0RU9iamVjdChTdHJpbmcgaWQpIHsKLQkJLy8gZmlyc3QsIHRyeSB0byBnZXQgdGhlIG9iamVjdCBmcm9tIHRoZSBjYWNoZSBndWlkVG9NZXRob2RFbGVtZW50Ci0JCS8vCi0JCUVPYmplY3QgZU9iamVjdCA9IChFT2JqZWN0KSBnZXRHdWlkVG9NZXRob2RFbGVtZW50TWFwKCkuZ2V0KGlkKTsKLQkJaWYgKGVPYmplY3QgIT0gbnVsbCkKLQkJCXJldHVybiBlT2JqZWN0OwotCi0JCVVSSSB1cmkgPSBNdWx0aUZpbGVVUklDb252ZXJ0ZXIuY3JlYXRlVVJJKGlkKS5hcHBlbmRGcmFnbWVudChpZCk7Ci0JCVVSSSBub3JtYWxpemVkID0gZ2V0VVJJQ29udmVydGVyKCkubm9ybWFsaXplKHVyaSk7Ci0JCWlmIChub3JtYWxpemVkID09IG51bGwpIHsKLQkJCS8vIHRoZSBvYmplY3Qgd2l0aCB0aGUgZ2l2ZW4gaWQgbWlnaHQgbm90IGhhdmUgZGlyZWN0IHJlc291cmNlLAotCQkJLy8gaGVuY2UsIGl0IGRvZXMgbm90IGhhdmUKLQkJCS8vIGl0cyBvd24gUmVzb3VyY2VEZXNjcmlwdG9yIGluIFJlc291cmNlTWFuYWdlciB0cmVlLgotCQkJLy8gZ28gdGhydSBhbGwgdW5sb2FkZWQgcmVzb3VyY2VzLCBsb2FkIHRoZW0sIGFuZCB0cnkgdG8gZmluZCB0aGUKLQkJCS8vIG9iamVjdCB3aXRoIHRoZSBnaXZlbiBpZC4KLQkJCS8vCi0JCQllT2JqZWN0ID0gZmluZEVPYmplY3RJblVubG9hZGVkUmVzb3VyY2VzKGlkKTsKLQkJCWlmIChlT2JqZWN0ID09IG51bGwgJiYgUkVQT1JUX0VSUk9SKSB7Ci0JCQkJaGFuZGxlRXhjZXB0aW9uKE5MUy5iaW5kKAotCQkJCQkJUGVyc2lzdGVuY2VSZXNvdXJjZXMub2JqTm90Rm91bmRFcnJvcl9tc2csIGlkKSk7Ci0JCQl9Ci0JCQlyZXR1cm4gZU9iamVjdDsKLQkJfQotCi0JCXRyeSB7Ci0JCQlyZXR1cm4gZ2V0RU9iamVjdCh1cmksIHRydWUpOwotCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQjZ2V0RU9iamVjdChvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJLAotCSAqICAgICAgYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgRU9iamVjdCBnZXRFT2JqZWN0KFVSSSB1cmksIGJvb2xlYW4gbG9hZE9uRGVtYW5kKSB7Ci0JCXJldHVybiBnZXRFT2JqZWN0KG51bGwsIHVyaSwgbG9hZE9uRGVtYW5kKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldCNjcmVhdGVSZXNvdXJjZShvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJKQotCSAqLwotCXB1YmxpYyBSZXNvdXJjZSBjcmVhdGVSZXNvdXJjZShVUkkgdXJpKSB7Ci0JCVJlc291cmNlIHJlc3VsdCA9IGRvQ3JlYXRlUmVzb3VyY2UodXJpKTsKLQkJcmVzdWx0LnNldFRyYWNraW5nTW9kaWZpY2F0aW9uKHRydWUpOwotCQlnZXRSZXNvdXJjZXMoKS5hZGQocmVzdWx0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi0JcHJvdGVjdGVkIFJlc291cmNlIGRvQ3JlYXRlUmVzb3VyY2UoVVJJIHVyaSkgewotCQlyZXR1cm4gbmV3IE11bHRpRmlsZVhNSVJlc291cmNlSW1wbCh1cmkpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gYmFja3VwUmVxdWlyZWQoTWFwIG9wdGlvbnMpIHsKLQkJQm9vbGVhbiBiYWNrdXAgPSAoQm9vbGVhbikgb3B0aW9ucwotCQkJCS5nZXQoTXVsdGlGaWxlWE1JU2F2ZUltcGwuQkFDS19VUF9CRUZPUkVfU0FWRSk7Ci0JCXJldHVybiBiYWNrdXAgIT0gbnVsbCAmJiBiYWNrdXAuYm9vbGVhblZhbHVlKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGJhY2t1cChSZXNvdXJjZSByZXMpIHsKLQkJdHJ5IHsKLQkJCWlmIChyZXMuZ2V0Q29udGVudHMoKS5pc0VtcHR5KCkpCi0JCQkJcmV0dXJuOwotCQkJT2JqZWN0IG9iamVjdCA9IHJlcy5nZXRDb250ZW50cygpLmdldCgwKTsKLQkJCWlmICghKG9iamVjdCBpbnN0YW5jZW9mIE1ldGhvZExpYnJhcnkKLQkJCQkJfHwgb2JqZWN0IGluc3RhbmNlb2YgUmVzb3VyY2VNYW5hZ2VyIHx8IG9iamVjdCBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikpCi0JCQkJcmV0dXJuOwotCi0JCQlNZXRob2RMaWJyYXJ5IGxpYnJhcnkgPSBnZXRNZXRob2RMaWJyYXJ5KCk7Ci0JCQlTdHJpbmcgYmFja3VwRGlyID0gbmV3IEZpbGUobGlicmFyeS5lUmVzb3VyY2UoKS5nZXRVUkkoKQotCQkJCQkudG9GaWxlU3RyaW5nKCkpLmdldFBhcmVudCgpCi0JCQkJCSsgRmlsZS5zZXBhcmF0b3IgKyAiLmJhayI7IC8vJE5PTi1OTFMtMSQKLQkJCVNpbXBsZURhdGVGb3JtYXQgZGF0ZUZvcm1hdHRlciA9IG5ldyBTaW1wbGVEYXRlRm9ybWF0KAotCQkJCQkieXlNTWRkSEhtbXNzLlMiKTsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKHJlcyA9PSBsaWJyYXJ5LmVSZXNvdXJjZSgpKSB7Ci0JCQkJRGF0ZUZvcm1hdC5nZXRJbnN0YW5jZSgpLmZvcm1hdCgKLQkJCQkJCUNhbGVuZGFyLmdldEluc3RhbmNlKCkuZ2V0VGltZSgpKTsKLQkJCQlGaWxlIGJhY2t1cEZpbGUgPSBuZXcgRmlsZShiYWNrdXBEaXIsCi0JCQkJCQlNdWx0aUZpbGVTYXZlVXRpbC5ERUZBVUxUX0xJQlJBUllfTU9ERUxfRklMRU5BTUUKLQkJCQkJCQkJKyAnXycKLQkJCQkJCQkJKyBkYXRlRm9ybWF0dGVyLmZvcm1hdChDYWxlbmRhci5nZXRJbnN0YW5jZSgpCi0JCQkJCQkJCQkJLmdldFRpbWUoKSkpOwotCQkJCWlmICghYmFja3VwRmlsZS5nZXRQYXJlbnRGaWxlKCkuZXhpc3RzKCkpIHsKLQkJCQkJYmFja3VwRmlsZS5nZXRQYXJlbnRGaWxlKCkubWtkaXJzKCk7Ci0JCQkJfQotCQkJCUZpbGVVdGlsLm1vdmVGaWxlKG5ldyBGaWxlKHJlcy5nZXRVUkkoKS50b0ZpbGVTdHJpbmcoKSksIGJhY2t1cEZpbGUpOwotCQkJfSBlbHNlIHsKLQkJCQlTdHJpbmcgcmVsYXRpdmVQYXRoID0gcmVzLmdldFVSSSgpLmRlcmVzb2x2ZSgKLQkJCQkJCWxpYnJhcnkuZVJlc291cmNlKCkuZ2V0VVJJKCkpLnRvRmlsZVN0cmluZygpOwotCQkJCUZpbGUgYmFja3VwRmlsZSA9IG5ldyBGaWxlKGJhY2t1cERpciwgcmVsYXRpdmVQYXRoCi0JCQkJCQkrICdfJwotCQkJCQkJKyBkYXRlRm9ybWF0dGVyCi0JCQkJCQkJCS5mb3JtYXQoQ2FsZW5kYXIuZ2V0SW5zdGFuY2UoKS5nZXRUaW1lKCkpKTsKLQkJCQlpZiAoIWJhY2t1cEZpbGUuZ2V0UGFyZW50RmlsZSgpLmV4aXN0cygpKSB7Ci0JCQkJCWJhY2t1cEZpbGUuZ2V0UGFyZW50RmlsZSgpLm1rZGlycygpOwotCQkJCX0KLQkJCQlGaWxlVXRpbC5tb3ZlRmlsZShuZXcgRmlsZShyZXMuZ2V0VVJJKCkudG9GaWxlU3RyaW5nKCkpLCBiYWNrdXBGaWxlKTsKLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWhhbmRsZUV4Y2VwdGlvbihlKTsKLQkJCWhhbmRsZUV4Y2VwdGlvbihOTFMuYmluZChQZXJzaXN0ZW5jZVJlc291cmNlcy5iYWNrdXBFcnJvcl9tc2csIHJlcykpOwotCQl9Ci0JfQotCi0Jdm9pZCByZW1vdmVVUklNYXBwaW5ncyhFT2JqZWN0IGVPYmosIFNldCBtb2RpZmllZFJlc291cmNlcykgewotCQlSZXNvdXJjZU1hbmFnZXIgcmVzTWdyID0gTXVsdGlGaWxlU2F2ZVV0aWwuZ2V0UmVzb3VyY2VNYW5hZ2VyKGVPYmoKLQkJCQkuZVJlc291cmNlKCkpOwotCQlpZiAocmVzTWdyICE9IG51bGwgJiYgcmVzTWdyLmVDb250YWluZXIoKSAhPSBudWxsKSB7Ci0JCQlFY29yZVV0aWwucmVtb3ZlKHJlc01ncik7Ci0JCX0KLQkJcmVzTWdyID0gZ2V0Um9vdFJlc291cmNlTWFuYWdlcigpOwotCQlpZihyZXNNZ3IgIT0gbnVsbCkgewotCQkJUmVzb3VyY2VEZXNjcmlwdG9yIGRlc2MgPSBNdWx0aUZpbGVTYXZlVXRpbC5maW5kUmVzb3VyY2VEZXNjcmlwdG9yKAotCQkJCQlyZXNNZ3IsIE11bHRpRmlsZVNhdmVVdGlsLmdldEd1aWQoZU9iaiksCi0JCQkJCW51bGwsIHRydWUpOwotCQkJaWYgKGRlc2MgIT0gbnVsbCkgewotCQkJCWlmIChtb2RpZmllZFJlc291cmNlcyAhPSBudWxsICYmIGRlc2MuZVJlc291cmNlKCkgIT0gbnVsbCkgewotCQkJCQltb2RpZmllZFJlc291cmNlcy5hZGQoZGVzYy5lUmVzb3VyY2UoKSk7Ci0JCQkJfQotCQkJCUVjb3JlVXRpbC5yZW1vdmUoZGVzYyk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjbGVhblVwKFJlc291cmNlIHJlbW92ZWRSZXNvdXJjZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJY2xlYW5VcChyZW1vdmVkUmVzb3VyY2UsIG51bGwpOwotCX0KLQotCS8vIHByb3RlY3RlZCB2b2lkIGNsZWFuVXAoRU9iamVjdCBvYmosIFNldCBtb2RpZmllZFJlc291cmNlcykgewotCS8vIHRyeSB7Ci0JLy8gLy8gcmVtb3ZlIGFsbCB0aGUgVVJJIG1hcHBpbmdzCi0JLy8gLy8KLQkvLyByZW1vdmVVUklNYXBwaW5ncyhvYmosIG1vZGlmaWVkUmVzb3VyY2VzKTsKLQkvLyB9Ci0JLy8gZmluYWxseSB7Ci0JLy8gUmVzb3VyY2UgcmVzb3VyY2UgPSBvYmouZVJlc291cmNlKCk7Ci0JLy8gaWYocmVzb3VyY2UgIT0gbnVsbCAmJiByZXNvdXJjZS5nZXRDb250ZW50cygpLmNvbnRhaW5zKG9iaikpIHsKLQkvLyByZXNvdXJjZS51bmxvYWQoKTsKLQkvLyBnZXRSZXNvdXJjZXMoKS5yZW1vdmUocmVzb3VyY2UpOwotCS8vIH0KLQkvLyB9Ci0JLy8gfQotCi0Jdm9pZCBjbGVhblVwKFJlc291cmNlIHJlbW92ZWRSZXNvdXJjZSwgU2V0IG1vZGlmaWVkUmVzb3VyY2VzKQotCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCS8vCi0JCQlpZiAocmVtb3ZlZFJlc291cmNlLmdldENvbnRlbnRzKCkuaXNFbXB0eSgpKSB7Ci0JCQkJcmVtb3ZlZFJlc291cmNlLnVubG9hZCgpOwotCQkJCXRyeSB7Ci0JCQkJCXJlbW92ZWRSZXNvdXJjZS5sb2FkKG51bGwpOwotCQkJCX0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCS8vIHRoZSBmaWxlIG1pZ2h0IGFscmVhZHkgYmUgZGVsZXRlZCwgbW92ZWQgb3IgbmV2ZXIKLQkJCQkJLy8gY3JlYXJlZC4KLQkJCQkJLy8KLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCX0KLQotCQkJRU9iamVjdCBvYmogPSBQZXJzaXN0ZW5jZVV0aWwuZ2V0TWV0aG9kRWxlbWVudChyZW1vdmVkUmVzb3VyY2UpOwotCi0JCQkvLyBpZihvYmogPT0gbnVsbCkgcmV0dXJuOwotCQkJLy8gYm9vbGVhbiBjbGVhbkZvbGRlcjsKLQkJCS8vIGlmKG9iaiBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikgewotCQkJLy8gY2xlYW5Gb2xkZXIgPSB0cnVlOwotCQkJLy8gfQotCQkJLy8gZWxzZSB7Ci0JCQkvLyBjbGVhbkZvbGRlciA9IGZhbHNlOwotCQkJLy8gfQotCi0JCQkvLyBNdWx0aUZpbGVVUklDb252ZXJ0ZXIgdW1hVXJpQ29udmVydGVyID0KLQkJCS8vICgoTXVsdGlGaWxlVVJJQ29udmVydGVyKWdldFVSSUNvbnZlcnRlcigpKTsKLQkJCS8vIHVtYVVyaUNvbnZlcnRlci5nZXRSZXNvdXJjZU1hbmFnZXIoKS5yZW1vdmVSZXNvdXJjZURlc2NyaXB0b3IocmVtb3ZlZFJlc291cmNlLmdldFVSSSgpLAotCQkJLy8gY2xlYW5Gb2xkZXIpOwotCi0JCQkvLyByZW1vdmUgYWxsIHRoZSBVUkkgbWFwcGluZ3MKLQkJCS8vCi0JCQlyZW1vdmVVUklNYXBwaW5ncyhvYmosIG1vZGlmaWVkUmVzb3VyY2VzKTsKLQotCQkJLy8gaWYob2JqIGluc3RhbmNlb2YgUHJvY2Vzc1BhY2thZ2UpIHsKLQkJCS8vIGNsZWFuVXBSZXNvdXJjZURlc2NyaXB0b3JzKChQcm9jZXNzUGFja2FnZSlvYmopOwotCQkJLy8gfQotCi0JCQlyZW1vdmVkUmVzb3VyY2UudW5sb2FkKCk7Ci0JCX0gZmluYWxseSB7Ci0JCQlnZXRSZXNvdXJjZXMoKS5yZW1vdmUocmVtb3ZlZFJlc291cmNlKTsKLQkJCVVSSSBvbGRVUkkgPSAoKE11bHRpRmlsZVhNSVJlc291cmNlSW1wbCkgcmVtb3ZlZFJlc291cmNlKQotCQkJCQkuZ2V0T2xkVVJJKCk7Ci0JCQlpZiAob2xkVVJJICE9IG51bGwpIHsKLQkJCQlnZXRVUklUb1RlbXBVUklNYXAoKS5yZW1vdmUob2xkVVJJKTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBjbGVhblVwKFByb2Nlc3NQYWNrYWdlIHByb2NQa2cpIHsKLQkJLy8gcmVtb3ZlIENvbnRlbnREZXNjcmlwdGlvbiBvZiBhbGwgUHJvY2Vzc0VsZW1lbnRzIGluIHRoaXMKLQkJLy8gUHJvY2Vzc1BhY2thZ2UKLQkJLy8KLQkJcmVtb3ZlQ29udGVudERlc2NyaXB0aW9ucyhwcm9jUGtnKTsKLQotCQlFY29yZVV0aWwucmVtb3ZlKHByb2NQa2cpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBwcm9jUGtnCi0JICovCi0JcHJpdmF0ZSB2b2lkIHJlbW92ZUNvbnRlbnREZXNjcmlwdGlvbnMoUHJvY2Vzc1BhY2thZ2UgcHJvY1BrZykgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBwcm9jUGtnLmdldFByb2Nlc3NFbGVtZW50cygpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkuaGFzTmV4dCgpOykgewotCQkJUHJvY2Vzc0VsZW1lbnQgZWxlbWVudCA9IChQcm9jZXNzRWxlbWVudCkgaXRlci5uZXh0KCk7Ci0JCQlpZiAoQ29udGVudERlc2NyaXB0aW9uRmFjdG9yeS5oYXNQcmVzZW50YXRpb24oZWxlbWVudCkKLQkJCQkJJiYgZWxlbWVudC5nZXRQcmVzZW50YXRpb24oKS5lUmVzb3VyY2UoKSAhPSBudWxsKSB7Ci0JCQkJcmVtb3ZlUHJlc2VudGF0aW9uKGVsZW1lbnQpOwotCQkJfQotCQl9Ci0KLQkJZm9yIChJdGVyYXRvciBpdGVyID0gcHJvY1BrZy5nZXRDaGlsZFBhY2thZ2VzKCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgcGtnID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAocGtnIGluc3RhbmNlb2YgUHJvY2Vzc1BhY2thZ2UpIHsKLQkJCQlyZW1vdmVDb250ZW50RGVzY3JpcHRpb25zKChQcm9jZXNzUGFja2FnZSkgcGtnKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICovCi0JcHJpdmF0ZSB2b2lkIHJlbW92ZVByZXNlbnRhdGlvbihQcm9jZXNzRWxlbWVudCBlbGVtZW50KSB7Ci0JCVJlc291cmNlIHJlc291cmNlID0gZWxlbWVudC5nZXRQcmVzZW50YXRpb24oKS5lUmVzb3VyY2UoKTsKLQkJcmVzb3VyY2UuZ2V0Q29udGVudHMoKS5yZW1vdmUoZWxlbWVudC5nZXRQcmVzZW50YXRpb24oKSk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIHNhdmUoQ29sbGVjdGlvbiByZXNvdXJjZXMsIE1hcCBvcHRpb25zLCBib29sZWFuIHByZXBhcmVTYXZlKQotCQkJdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWlmIChvcHRpb25zID09IG51bGwpIHsKLQkJCW9wdGlvbnMgPSBnZXREZWZhdWx0U2F2ZU9wdGlvbnMoKTsKLQkJfQotCi0JCVNldCBtb2RpZmllZFJlc291cmNlcyA9IG5ldyBIYXNoU2V0KCk7Ci0JCW9wdGlvbnMucHV0KE11bHRpRmlsZVhNSVNhdmVJbXBsLk1PRElGSUVEX1JFU09VUkNFX1NFVCwKLQkJCQltb2RpZmllZFJlc291cmNlcyk7Ci0JCXRyeSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSByZXNvdXJjZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJUmVzb3VyY2UgcmVzID0gKFJlc291cmNlKSBpdGVyLm5leHQoKTsKLQkJCQlzYXZlKHJlcywgb3B0aW9ucywgcHJlcGFyZVNhdmUpOwotCQkJfQotCQkJc2F2ZU1vZGlmaWVkUmVzb3VyY2VzKG9wdGlvbnMpOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0gZmluYWxseSB7Ci0JCQlvcHRpb25zLnJlbW92ZShNdWx0aUZpbGVYTUlTYXZlSW1wbC5NT0RJRklFRF9SRVNPVVJDRV9TRVQpOwotCQl9Ci0JfQotCi0JYm9vbGVhbiBzYXZlKFJlc291cmNlIHJlcywgTWFwIG9wdGlvbnMsIGJvb2xlYW4gcHJlcGFyZVNhdmUpCi0JCQl0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU2V0IG1vZGlmaWVkUmVzb3VyY2VzID0gKFNldCkgb3B0aW9ucwotCQkJCS5nZXQoTXVsdGlGaWxlWE1JU2F2ZUltcGwuTU9ESUZJRURfUkVTT1VSQ0VfU0VUKTsKLQkJVHhSZWNvcmQgdHhSZWNvcmQgPSAoVHhSZWNvcmQpIG9wdGlvbnMKLQkJCQkuZ2V0KE11bHRpRmlsZVhNSVNhdmVJbXBsLlRYX1JFQ09SRCk7Ci0JCUxpc3QgcmVzb3VyY2VzVG9Db21taXQgPSB0eFJlY29yZCAhPSBudWxsID8gdHhSZWNvcmQKLQkJCQkuZ2V0UmVzb3VyY2VzVG9Db21taXQoKSA6IG51bGw7Ci0KLQkJdHJ5IHsKLQkJCU1ldGhvZEVsZW1lbnQgZU9iaiA9IFBlcnNpc3RlbmNlVXRpbC5nZXRNZXRob2RFbGVtZW50KHJlcyk7Ci0JCQlpZiAoZU9iaiAhPSBudWxsKSB7Ci0JCQkJaWYgKHByZXBhcmVTYXZlKSB7Ci0JCQkJCWlmIChlT2JqIGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkgewotCQkJCQkJUHJvY2Vzc0NvbXBvbmVudCBwcm9jQ29tcCA9IChQcm9jZXNzQ29tcG9uZW50KSBlT2JqOwotCQkJCQkJUmVzb3VyY2UgY29udGVudCA9IHByb2NDb21wLmdldFByb2Nlc3MoKSAhPSBudWxsCi0JCQkJCQkJCSYmIENvbnRlbnREZXNjcmlwdGlvbkZhY3RvcnkKLQkJCQkJCQkJCQkuaGFzUHJlc2VudGF0aW9uKHByb2NDb21wLmdldFByb2Nlc3MoKSkgPyBwcm9jQ29tcAotCQkJCQkJCQkuZ2V0UHJvY2VzcygpLmdldFByZXNlbnRhdGlvbigpLmVSZXNvdXJjZSgpCi0JCQkJCQkJCTogbnVsbDsKLQkJCQkJCWJvb2xlYW4gYWxyZWFkeU1vZGlmaWVkID0gY29udGVudCAhPSBudWxsCi0JCQkJCQkJCSYmIGNvbnRlbnQuaXNNb2RpZmllZCgpOwotCQkJCQkJcHJlcGFyZVNhdmUocHJvY0NvbXApOwotCQkJCQkJaWYgKGNvbnRlbnQgIT0gbnVsbCAmJiBjb250ZW50LmlzTW9kaWZpZWQoKQotCQkJCQkJCQkmJiAhYWxyZWFkeU1vZGlmaWVkKSB7Ci0JCQkJCQkJLy8gY29udGVudCBpcyBtb2RpZmllZCBhcyByZXN1bHQgb2YgcHJlcGFyZVNhdmUoKSwKLQkJCQkJCQkvLyBpdCBuZWVkcyB0byBiZSBzYXZlZCBhZnRlciBtb2RlbCBpcyBzYXZlZAotCQkJCQkJCS8vCi0JCQkJCQkJbW9kaWZpZWRSZXNvdXJjZXMuYWRkKGNvbnRlbnQpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWVsc2UgaWYgKGVPYmogaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pIHsKLQkJCQkJCU11bHRpRmlsZVNhdmVVdGlsLmFkZFJlc291cmNlTWFuYWdlcihyZXMpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWlmIChyZXMuaXNNb2RpZmllZCgpKSB7Ci0JCQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiLS0tLT4gU3RhcnQgc2F2aW5nICIgKyByZXMpOwotCQkJCQlib29sZWFuIGJhY2t1cFJlcXVpcmVkID0gYmFja3VwUmVxdWlyZWQob3B0aW9ucyk7Ci0JCQkJCWlmIChiYWNrdXBSZXF1aXJlZCkgewotCQkJCQkJLy8gYmFjayB1cCByZXNvdXJjZSBiZWZvcmUgc2F2aW5nCi0JCQkJCQkvLwotCQkJCQkJYmFja3VwKHJlcyk7Ci0JCQkJCX0KLQotCQkJCQlpZiAocmVzb3VyY2VzVG9Db21taXQgIT0gbnVsbCkgewotCQkJCQkJKChNdWx0aUZpbGVYTUlSZXNvdXJjZUltcGwpIHJlcykuc2V0VGVtcFVSSSh0eFJlY29yZAotCQkJCQkJCQkuZ2V0VHhJRCgpKTsKLQkJCQkJCXJlc291cmNlc1RvQ29tbWl0LmFkZChyZXMpOwotCQkJCQl9Ci0KLQkJCQkJTXVsdGlGaWxlU2F2ZVV0aWwuc2F2ZShyZXMsIG9wdGlvbnMpOwotCi0JCQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiPC0tLS0gU2F2ZWQgcmVzb3VyY2U6ICIgKyByZXMpOwotCi0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4Y2VwdGlvbikgewotCQkJaGFuZGxlRXhjZXB0aW9uKGV4Y2VwdGlvbik7Ci0JCQl0aHJvdyBleGNlcHRpb247Ci0JCX0KLQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogU2F2ZSBhIHJlc291cmNlIG9mIHRoaXMgcmVzb3VyY2Ugc2V0IHdpdGggdGhlIGdpdmVuIHNhdmUgb3B0aW9ucwotCSAqIAotCSAqIEBwYXJhbSByZXMKLQkgKiBAcGFyYW0gb3B0aW9ucwotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlcmUgaXMgYXQgbGVhc3QgYSByZXNvdXJjZSBoYXMgYmVlbiBzYXZlZCBpbiB0aGlzIGNhbGwKLQkgKiBAdGhyb3dzIEV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBib29sZWFuIHNhdmUoUmVzb3VyY2UgcmVzLCBNYXAgb3B0aW9ucykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0vLwkJLy8gY2xlYXIgYWxsIGVycm9yIG1hcmtlcnMgZm9yIHRoaXMgcmVzb3VyY2UKLS8vCQkvLwotLy8JCW1hcmtlck1hbmFuZ2VyLmNsZWFyTWFya2VycyhyZXMpOwotCi0JCWlmIChyZXMgPT0gbnVsbCB8fCByZXMuZ2V0Q29udGVudHMoKS5pc0VtcHR5KCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJaWYgKG9wdGlvbnMgPT0gbnVsbCkgewotCQkJb3B0aW9ucyA9IGdldERlZmF1bHRTYXZlT3B0aW9ucygpOwotCQl9Ci0KLQkJU2V0IG1vZGlmaWVkUmVzb3VyY2VzID0gbmV3IEhhc2hTZXQoKTsKLQkJb3B0aW9ucy5wdXQoTXVsdGlGaWxlWE1JU2F2ZUltcGwuTU9ESUZJRURfUkVTT1VSQ0VfU0VULAotCQkJCW1vZGlmaWVkUmVzb3VyY2VzKTsKLQkJYm9vbGVhbiBub3RGYWlsU2FmZSA9IG9wdGlvbnMuZ2V0KE11bHRpRmlsZVhNSVNhdmVJbXBsLlRYX1JFQ09SRCkgPT0gbnVsbDsKLQkJdHJ5IHsKLQkJCUNvbGxlY3Rpb24gc2F2ZWRSZXNvdXJjZXMgPSBudWxsOwotCQkJaWYobm90RmFpbFNhZmUpIHsKLQkJCQlzYXZlZFJlc291cmNlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCX0KLQkJCWJvb2xlYW4gcmV0ID0gc2F2ZShyZXMsIG9wdGlvbnMsIHRydWUpOwotCQkJaWYocmV0ICYmIG5vdEZhaWxTYWZlKSB7Ci0JCQkJc2F2ZWRSZXNvdXJjZXMuYWRkKHJlcyk7Ci0JCQl9Ci0JCQlDb2xsZWN0aW9uIGNvbGxlY3Rpb24gPSBzYXZlTW9kaWZpZWRSZXNvdXJjZXMob3B0aW9ucyk7Ci0JCQlpZighY29sbGVjdGlvbi5pc0VtcHR5KCkpIHsKLQkJCQlyZXQgPSB0cnVlOwotCQkJCWlmKG5vdEZhaWxTYWZlKSB7Ci0JCQkJCXNhdmVkUmVzb3VyY2VzLmFkZEFsbChjb2xsZWN0aW9uKTsKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCWlmKG5vdEZhaWxTYWZlICYmIHJldCkgewotCQkJCS8vIHVwZGF0ZSByZXNvdXJjZSBjYWNoZWQgdGltZXN0YW1wcwotCQkJCS8vCi0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gc2F2ZWRSZXNvdXJjZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCU9iamVjdCByZXNvdXJjZSA9IGl0ZXIubmV4dCgpOwotCQkJCQlpZihyZXNvdXJjZSBpbnN0YW5jZW9mIE11bHRpRmlsZVhNSVJlc291cmNlSW1wbCkgewotCQkJCQkJKChNdWx0aUZpbGVYTUlSZXNvdXJjZUltcGwpcmVzb3VyY2UpLnVwZGF0ZVRpbWVTdGFtcHMoKTsKLQkJCQkJfQotCQkJCX0JCQkJCQkJCQotCQkJfQotCQkJCi0JCQlyZXR1cm4gcmV0OwotCQl9IGZpbmFsbHkgewotCQkJb3B0aW9ucy5yZW1vdmUoTXVsdGlGaWxlWE1JU2F2ZUltcGwuTU9ESUZJRURfUkVTT1VSQ0VfU0VUKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNhdmVzIG9ubHkgdGhlIG1vZGlmaWVkIHJlc291cmNlcyBpbiB0aGlzIHJlc291cmNlIHNldC4KLQkgKiAKLQkgKiBAcGFyYW0gb3B0aW9ucwotCSAqLwotCXB1YmxpYyB2b2lkIHNhdmUoTWFwIG9wdGlvbnMpIHRocm93cyBMaWJyYXJ5UmVzb3VyY2VFeGNlcHRpb24gewotCQl0cnkgewotCQkJc2F2ZShvcHRpb25zLCBmYWxzZSwgdHJ1ZSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlpZihlIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgewotCQkJCXRocm93IChSdW50aW1lRXhjZXB0aW9uKWU7Ci0JCQl9Ci0JCQl0aHJvdyBuZXcgTGlicmFyeVJlc291cmNlRXhjZXB0aW9uKGUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIG9wdGlvbnMKLQkgKiBAcmV0dXJuIHJlc291cmNlcyB0aGF0IGhhZCBiZWVuIHNhdmVkIGJ5IHRoaXMgY2FsbAotCSAqIEB0aHJvd3MgTGlicmFyeVJlc291cmNlRXhjZXB0aW9uIAotCSAqLwotCUNvbGxlY3Rpb24gc2F2ZU1vZGlmaWVkUmVzb3VyY2VzKE1hcCBvcHRpb25zKSB0aHJvd3MgTGlicmFyeVJlc291cmNlRXhjZXB0aW9uIHsKLQkJU2V0IG1vZGlmaWVkUmVzb3VyY2VzID0gKFNldCkgb3B0aW9ucwotCQkJCS5nZXQoTXVsdGlGaWxlWE1JU2F2ZUltcGwuTU9ESUZJRURfUkVTT1VSQ0VfU0VUKTsKLQkJVHhSZWNvcmQgdHhSZWNvcmQgPSAoVHhSZWNvcmQpIG9wdGlvbnMKLQkJCQkuZ2V0KE11bHRpRmlsZVhNSVNhdmVJbXBsLlRYX1JFQ09SRCk7Ci0JCUxpc3QgcmVzb3VyY2VzVG9Db21taXQgPSB0eFJlY29yZCAhPSBudWxsID8gdHhSZWNvcmQKLQkJCQkuZ2V0UmVzb3VyY2VzVG9Db21taXQoKSA6IG51bGw7Ci0JCWlmIChtb2RpZmllZFJlc291cmNlcyA9PSBudWxsKQotCQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JCWJvb2xlYW4gYmFja3VwUmVxdWlyZWQgPSBiYWNrdXBSZXF1aXJlZChvcHRpb25zKTsKLQkJYm9vbGVhbiBjaGVja01vZGlmeSA9IE11bHRpRmlsZVhNSVNhdmVJbXBsLmNoZWNrTW9kaWZ5UmVxdWlyZWQob3B0aW9ucyk7Ci0JCUNvbGxlY3Rpb24gc2F2ZWRSZXNvdXJjZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXdoaWxlICghbW9kaWZpZWRSZXNvdXJjZXMuaXNFbXB0eSgpKSB7Ci0JCQlMaXN0PFJlc291cmNlPiByZXNvdXJjZXNUb1NhdmUgPSBuZXcgQXJyYXlMaXN0PFJlc291cmNlPihtb2RpZmllZFJlc291cmNlcyk7Ci0JCQkKLQkJCW1vZGlmaWVkUmVzb3VyY2VzLmNsZWFyKCk7Ci0JCQlpZiAoY2hlY2tNb2RpZnkpIHsKLQkJCQljaGVja01vZGlmeShyZXNvdXJjZXNUb1NhdmUpOwotCQkJCWlmKHJlc291cmNlc1RvQ29tbWl0ICE9IG51bGwpIHsKLQkJCQkJLy8gY2hlY2sgZm9yIG91dC1vZi1zeW5jaCBvbmx5IGluIGZhaWwtc2FmZSBzYXZpbmcgZm9yIG5vdwotCQkJCQkvLwotCQkJCQlNdWx0aUZpbGVTYXZlVXRpbC5jaGVja091dE9mU3luY2gocmVzb3VyY2VzVG9TYXZlLCBvcHRpb25zKTsKLQkJCQl9Ci0JCQl9Ci0JCQlmb3IoSXRlcmF0b3IgaXRlciA9IHJlc291cmNlc1RvU2F2ZS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlSZXNvdXJjZSByZXNvdXJjZSA9IChSZXNvdXJjZSkgaXRlci5uZXh0KCk7Ci0JCQkJLy8gaWYocmVzb3VyY2UuaXNNb2RpZmllZCgpKSB7Ci0JCQkJaWYgKGJhY2t1cFJlcXVpcmVkKSB7Ci0JCQkJCS8vIGJhY2sgdXAgcmVzb3VyY2UgYmVmb3JlIHNhdmluZwotCQkJCQkvLwotCQkJCQliYWNrdXAocmVzb3VyY2UpOwotCQkJCX0KLQotCQkJCWlmIChyZXNvdXJjZXNUb0NvbW1pdCAhPSBudWxsKSB7Ci0JCQkJCSgoTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsKSByZXNvdXJjZSkuc2V0VGVtcFVSSSh0eFJlY29yZAotCQkJCQkJCS5nZXRUeElEKCkpOwotCQkJCQlyZXNvdXJjZXNUb0NvbW1pdC5hZGQocmVzb3VyY2UpOwotCQkJCX0KLQotCQkJCWlmKE11bHRpRmlsZVNhdmVVdGlsLnNhdmUocmVzb3VyY2UsIG9wdGlvbnMpKSB7Ci0JCQkJCXNhdmVkUmVzb3VyY2VzLmFkZChyZXNvdXJjZSk7Ci0JCQkJfQotCQkJCS8vIH0KLQkJCX0KLQkJfQotCQlyZXR1cm4gc2F2ZWRSZXNvdXJjZXM7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIG9wdGlvbnMKLQkgKiBAcGFyYW0gc2F2ZUFsbAotCSAqICAgICAgICAgICAgaWYgdHJ1ZSwgZm9yY2Ugc2F2aW5nIGFsbCB0aGUgcmVzb3VyY2VzIGV2ZW4gaWYgdGhleSBhcmUgbm90Ci0JICogICAgICAgICAgICBtb2RpZmllZC4KLQkgKiBAdGhyb3dzIEV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHNhdmUoTWFwIG9wdGlvbnMsIGJvb2xlYW4gc2F2ZUFsbCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXNhdmUob3B0aW9ucywgc2F2ZUFsbCwgZmFsc2UpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzYXZlKE1hcCBvcHRpb25zLCBib29sZWFuIHNhdmVBbGwsIGJvb2xlYW4gZmFpbFNhZmUpCi0JCQl0aHJvd3MgRXhjZXB0aW9uIHsKLQkJaWYgKG9wdGlvbnMgPT0gbnVsbCkgewotCQkJb3B0aW9ucyA9IG5ldyBIYXNoTWFwKGdldERlZmF1bHRTYXZlT3B0aW9ucygpKTsKLQkJfQotCi0JCU1ldGhvZExpYnJhcnkgbGlicmFyeSA9IGdldE1ldGhvZExpYnJhcnkoKTsKLQkJTXVsdGlGaWxlU2F2ZVV0aWwuc2V0R3VpZChsaWJyYXJ5KTsKLQotCQlwcmVwYXJlU2F2ZShsaWJyYXJ5KTsKLQotCQkvLyBkbyBjbGVhbi11cCB0aGlzIHJlc291cmNlIHNldCBiZWZvcmUgc2F2aW5nCi0JCS8vCi0JCWNsZWFuVXAoKTsKLQotCQlNdWx0aUZpbGVVUklDb252ZXJ0ZXIgdW1hVXJpQ29udmVydGVyID0gKChNdWx0aUZpbGVVUklDb252ZXJ0ZXIpIGdldFVSSUNvbnZlcnRlcigpKTsKLQkJdW1hVXJpQ29udmVydGVyLnNldExpYnJhcnlVUklzKGxpYnJhcnkpOwotCi0JCVNldCBtb2RpZmllZFJlc291cmNlcyA9IG5ldyBIYXNoU2V0KCk7Ci0JCW9wdGlvbnMucHV0KE11bHRpRmlsZVhNSVNhdmVJbXBsLk1PRElGSUVEX1JFU09VUkNFX1NFVCwKLQkJCQltb2RpZmllZFJlc291cmNlcyk7Ci0JCU1ldGhvZExpYnJhcnlQZXJzaXN0ZXIuRmFpbFNhZmVQZXJzaXN0ZXIgcGVyc2lzdGVyID0gbnVsbDsKLQkJaWYgKGZhaWxTYWZlKSB7Ci0JCQlwZXJzaXN0ZXIgPSBNZXRob2RMaWJyYXJ5UGVyc2lzdGVyLklOU1RBTkNFCi0JCQkJCS5nZXRGYWlsU2FmZVBlcnNpc3RlcihvcHRpb25zKTsKLQkJCW9wdGlvbnMgPSBwZXJzaXN0ZXIuZ2V0U2F2ZU9wdGlvbnMoKTsKLQkJfQotCQl0cnkgewotCQkJTGlzdCBsaXN0ID0gZ2V0UmVzb3VyY2VzKCk7Ci0JCQlpbnQgc2l6ZSA9IGxpc3Quc2l6ZSgpOwotCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJTdGFydCBzYXZpbmcgIiArIHNpemUgKyAiIGxvYWRlZCByZXNvdXJjZXM6ICIKLQkJCS8vICsgbGlzdCk7Ci0JCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oKTsKLQkJCWJvb2xlYW4gYmFja3VwUmVxdWlyZWQgPSBiYWNrdXBSZXF1aXJlZChvcHRpb25zKTsKLQkJCUxpc3Qgc2F2ZVJlc291cmNlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCUxpc3QgbW92ZVJlc291cmNlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJUmVzb3VyY2UgcmVzID0gKFJlc291cmNlKSBsaXN0LmdldChpKTsKLQotCQkJCSBpZiAocmVzLmlzTW9kaWZpZWQoKSAmJiAKLQkJCQkJCSBNdWx0aUZpbGVTYXZlVXRpbC5hZGp1c3RMb2NhdGlvblJlcXVpcmVkKChNdWx0aUZpbGVYTUlSZXNvdXJjZUltcGwpIHJlcykpIHsKLQkJCQkJIG1vdmVSZXNvdXJjZXMuYWRkKHJlcyk7Ci0JCQkJIH0KLQotCQkJCU1ldGhvZEVsZW1lbnQgZU9iaiA9IFBlcnNpc3RlbmNlVXRpbC5nZXRNZXRob2RFbGVtZW50KHJlcyk7Ci0JCQkJaWYgKGVPYmogIT0gbnVsbCAmJiBlT2JqIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJCQlpZiAoc2F2ZUFsbCB8fCByZXMuaXNNb2RpZmllZCgpKSB7Ci0vLwkJCQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiLS0tLT4gU3RhcnQgc2F2aW5nICIgKyByZXMpOwotLy8JCQkJCQlpZiAoZmFpbFNhZmUpIHsKLS8vCQkJCQkJCXNhdmVSZXNvdXJjZXMuYWRkKHJlcyk7Ci0vLwkJCQkJCX0gZWxzZSB7Ci0vLwkJCQkJCQlpZiAoYmFja3VwUmVxdWlyZWQpIHsKLS8vCQkJCQkJCQkvLyBiYWNrIHVwIHJlc291cmNlIGJlZm9yZSBzYXZpbmcKLS8vCQkJCQkJCQkvLwotLy8JCQkJCQkJCWJhY2t1cChyZXMpOwotLy8JCQkJCQkJfQotLy8KLS8vCQkJCQkJCWlmKE11bHRpRmlsZVNhdmVVdGlsLnNhdmUocmVzLCBvcHRpb25zKSkgewotLy8JCQkJCQkJCXNhdmVkUmVzb3VyY2VzLmFkZChyZXMpOwotLy8JCQkJCQkJCWlmKHJlcyBpbnN0YW5jZW9mIE11bHRpRmlsZVhNSVJlc291cmNlSW1wbCkgewotLy8JCQkJCQkJCQkoKE11bHRpRmlsZVhNSVJlc291cmNlSW1wbClyZXMpLnVwZGF0ZVRpbWVTdGFtcHMoKTsKLS8vCQkJCQkJCQl9Ci0vLwkJCQkJCQl9Ci0vLwkJCQkJCX0KLS8vCQkJCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCI8LS0tLSBTYXZlZCByZXNvdXJjZTogIiArIHJlcyk7Ci0JCQkJCQkKLQkJCQkJCXNhdmVSZXNvdXJjZXMuYWRkKHJlcyk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmKCFzYXZlUmVzb3VyY2VzLmlzRW1wdHkoKSkgewotCQkJCVJlc291cmNlIGxpYlJlc291cmNlID0gZ2V0TWV0aG9kTGlicmFyeVJlc291cmNlKCk7Ci0JCQkJaWYoIXNhdmVSZXNvdXJjZXMuY29udGFpbnMobGliUmVzb3VyY2UpICYmIFBlcnNpc3RlbmNlVXRpbC5jaGVja1Rvb2xWZXJzaW9uKGxpYlJlc291cmNlKSAhPSAwKSB7Ci0JCQkJCXNhdmVSZXNvdXJjZXMuYWRkKGxpYlJlc291cmNlKTsKLQkJCQl9Ci0JCQkJaWYoTXVsdGlGaWxlWE1JU2F2ZUltcGwuY2hlY2tNb2RpZnlSZXF1aXJlZChvcHRpb25zKSkgewotCQkJCQljaGVja01vZGlmeShzYXZlUmVzb3VyY2VzKTsKLQkJCQl9Ci0JCQkJaWYgKGZhaWxTYWZlKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlzYXZlKHNhdmVSZXNvdXJjZXMsIG9wdGlvbnMsIGZhbHNlKTsKLQkJCQkJCXBlcnNpc3Rlci5jb21taXQoKTsKLQkJCQkJCXBlcnNpc3Rlci5hZGp1c3RMb2NhdGlvbihtb3ZlUmVzb3VyY2VzKTsKLQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCXBlcnNpc3Rlci5yb2xsYmFjaygpOwotCQkJCQkJdGhyb3cgZTsKLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHNhdmVSZXNvdXJjZXMuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlSZXNvdXJjZSByZXNvdXJjZSA9IChSZXNvdXJjZSkgaXRlci5uZXh0KCk7Ci0JCQkJCQlpZihNdWx0aUZpbGVTYXZlVXRpbC5zYXZlKHJlc291cmNlLCBvcHRpb25zKSkgewotCQkJCQkJCWlmKHJlc291cmNlIGluc3RhbmNlb2YgTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsKSB7Ci0JCQkJCQkJCSgoTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsKXJlc291cmNlKS51cGRhdGVUaW1lU3RhbXBzKCk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IG1vdmVSZXNvdXJjZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlSZXNvdXJjZSByZXNvdXJjZSA9IChSZXNvdXJjZSkgaXRlci5uZXh0KCk7Ci0JCQkJCQlNdWx0aUZpbGVTYXZlVXRpbC5hZGp1c3RMb2NhdGlvbihyZXNvdXJjZSwKLQkJCQkJCQkJbW9kaWZpZWRSZXNvdXJjZXMpOwotCQkJCQl9Ci0JCQkJCUNvbGxlY3Rpb24gc2F2ZWQgPSBzYXZlTW9kaWZpZWRSZXNvdXJjZXMob3B0aW9ucyk7Ci0JCQkJCWlmIChzYXZlZCAhPSBudWxsKSB7Ci0JCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBzYXZlZC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJCQlSZXNvdXJjZSByZXNvdXJjZSA9IChSZXNvdXJjZSkgaXRlci5uZXh0KCk7Ci0JCQkJCQkJaWYocmVzb3VyY2UgaW5zdGFuY2VvZiBNdWx0aUZpbGVYTUlSZXNvdXJjZUltcGwpIHsKLQkJCQkJCQkJKChNdWx0aUZpbGVYTUlSZXNvdXJjZUltcGwpcmVzb3VyY2UpLnVwZGF0ZVRpbWVTdGFtcHMoKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLQkJCWhhbmRsZUV4Y2VwdGlvbihleGNlcHRpb24pOwotCQkJdGhyb3cgZXhjZXB0aW9uOwotCQl9IGZpbmFsbHkgewotCQkJb3B0aW9ucy5yZW1vdmUoTXVsdGlGaWxlWE1JU2F2ZUltcGwuTU9ESUZJRURfUkVTT1VSQ0VfU0VUKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNhdmVzIHRoZSBvcGVuIGxpYnJhcnkgdW5kZXIgYSBuZXcgbG9jYXRpb24KLQkgKiAKLQkgKiBAcGFyYW0gbmV3TG9jYXRpb24KLQkgKiAgICAgICAgICAgIGRpcmVjdG9yeSB0byBzYXZlIHRoZSBvcGVuIGxpYnJhcnkgdG8KLQkgKiBAcGFyYW0gaWYKLQkgKiAgICAgICAgICAgIHRydWUsIHJlZ2VuZXJhdGVHVUlEIHJlZ2VuZXJhdGUgR1VJRCBmb3IgYWxsIE1ldGhvZEVsZW1lbnRzIGluCi0JICogICAgICAgICAgICB0aGUgb3BlbiBsaWJyYXJ5Ci0JICovCi0JcHVibGljIHZvaWQgc2F2ZUFzKFN0cmluZyBuZXdMb2NhdGlvbiwgYm9vbGVhbiByZWdlbmVyYXRlR1VJRCwKLQkJCUlQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU1ldGhvZExpYnJhcnkgbGliID0gZ2V0TWV0aG9kTGlicmFyeSgpOwotCQlpZiAobGliID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJLy8gbG9hZCBhbGwgdGhlIHJlc291cmNlcyBpbiBtZW1vcnkKLQkJLy8KLQkJaWYgKG1vbml0b3IgIT0gbnVsbCkKLQkJCW1vbml0b3Iuc2V0VGFza05hbWUoUGVyc2lzdGVuY2VSZXNvdXJjZXMubG9hZFJlc291cmNlc1Rhc2tfbmFtZSk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGxpYi5lQWxsQ29udGVudHMoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlFT2JqZWN0IGVsZW1lbnQgPSAoRU9iamVjdCkgaXRlci5uZXh0KCk7Ci0JCQlpZiAocmVnZW5lcmF0ZUdVSUQgJiYgZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCQkoKE1ldGhvZEVsZW1lbnQpIGVsZW1lbnQpLnNldEd1aWQoVW1hVXRpbC5nZW5lcmF0ZUdVSUQoKSk7Ci0JCQl9Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gZWxlbWVudC5lQ3Jvc3NSZWZlcmVuY2VzKCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IKLQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQlpdGVyYXRvci5uZXh0KCk7Ci0JCQl9Ci0JCX0KLQotCQkvLyBjaGFuZ2UgVVJJIG9mIGFsbCBsb2FkZWQgcmVzb3VyY2VzIGZvciBuZXcgbG9jYXRpb24KLQkJLy8KLQkJVVJJIG9sZERpciA9IFVSSS5jcmVhdGVGaWxlVVJJKG5ldyBGaWxlKGxpYi5lUmVzb3VyY2UoKS5nZXRVUkkoKQotCQkJCS50b0ZpbGVTdHJpbmcoKSkuZ2V0UGFyZW50KCkKLQkJCQkrIEZpbGUuc2VwYXJhdG9yKTsKLQkJVVJJIG5ld0RpciA9IFVSSS5jcmVhdGVGaWxlVVJJKG5ld0xvY2F0aW9uICsgRmlsZS5zZXBhcmF0b3IpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBnZXRSZXNvdXJjZXMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCVJlc291cmNlIHJlc291cmNlID0gKFJlc291cmNlKSBpdGVyLm5leHQoKTsKLQkJCXJlc291cmNlLnNldFVSSShyZXNvdXJjZS5nZXRVUkkoKS5yZXBsYWNlUHJlZml4KG9sZERpciwgbmV3RGlyKSk7Ci0JCX0KLQotCQkvLyBjbGVhciB0aGUgUmVzb3VyY2VNYW5hZ2VyCi0JCS8vCi0JCVJlc291cmNlTWFuYWdlciByZXNNZ3IgPSAoKE11bHRpRmlsZVVSSUNvbnZlcnRlcikgZ2V0VVJJQ29udmVydGVyKCkpCi0JCQkJLmdldFJlc291cmNlTWFuYWdlcigpOwotCQlpZiAocmVzTWdyICE9IG51bGwpIHsKLQkJCXJlc01nci5nZXRSZXNvdXJjZURlc2NyaXB0b3JzKCkuY2xlYXIoKTsKLQkJfQotCi0JCWlmIChtb25pdG9yICE9IG51bGwpCi0JCQltb25pdG9yLnNldFRhc2tOYW1lKFBlcnNpc3RlbmNlUmVzb3VyY2VzLnNhdmVMaWJyYXJ5VGFza19uYW1lKTsKLQkJc2F2ZShudWxsLCB0cnVlKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gdW5sb2FkV2l0aG91dFJlbW92ZShNdWx0aUZpbGVYTUlSZXNvdXJjZUltcGwgcmVzb3VyY2UpIHsKLQkJTWV0aG9kRWxlbWVudCBlID0gUGVyc2lzdGVuY2VVdGlsLmdldE1ldGhvZEVsZW1lbnQocmVzb3VyY2UpOwotCQlyZXNvdXJjZS51bmxvYWRXaXRob3V0UmVtb3ZlKCk7Ci0JCWlmKGUgaW5zdGFuY2VvZiBNZXRob2RDb25maWd1cmF0aW9uKSB7Ci0JCQlNZXRob2RMaWJyYXJ5IGxpYiA9IGdldE1ldGhvZExpYnJhcnkoKTsKLQkJCWlmKGxpYiAhPSBudWxsKSB7Ci0JCQkJbGliLmdldFByZWRlZmluZWRDb25maWd1cmF0aW9ucygpLnJlbW92ZShlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICogCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNsZWFuVXAoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlNZXRob2RMaWJyYXJ5IGxpYnJhcnkgPSBnZXRNZXRob2RMaWJyYXJ5KCk7Ci0JCUxpc3QgcmVtb3ZlZFJlc291cmNlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQlMaXN0IGxpc3QgPSBnZXRSZXNvdXJjZXMoKTsKLQkJaW50IHNpemUgPSBsaXN0LnNpemUoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCVJlc291cmNlIHJlcyA9IChSZXNvdXJjZSkgbGlzdC5nZXQoaSk7Ci0JCQlib29sZWFuIHJlbW92ZSA9IGZhbHNlOwotCQkJaWYgKHJlcy5nZXRDb250ZW50cygpLmlzRW1wdHkoKSkgewotCQkJCVN5c3RlbS5vdXQKLQkJCQkJCS5wcmludGxuKCJNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwuY2xlYW5VcCgpOiBlbXB0eSByZXNvdXJjZTogIiArIHJlcyk7IC8vJE5PTi1OTFMtMSQKLQkJCQlyZW1vdmUgPSB0cnVlOwotCQkJfSBlbHNlIHsKLQkJCQlNZXRob2RFbGVtZW50IGVPYmogPSBQZXJzaXN0ZW5jZVV0aWwuZ2V0TWV0aG9kRWxlbWVudChyZXMpOwotCQkJCWlmIChlT2JqID09IG51bGwKLQkJCQkJCXx8IChlT2JqICE9IGxpYnJhcnkgJiYgZU9iai5lQ29udGFpbmVyKCkgPT0gbnVsbCkpIHsKLQkJCQkJaWYgKGVPYmogPT0gbnVsbCkgewotCQkJCQkJU3lzdGVtLm91dAotCQkJCQkJCQkucHJpbnRsbigiTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsLmNsZWFuVXAoKTogcmVzb3VyY2Ugd2l0aG91dCBhbnkgTWV0aG9kRWxlbWVudDogIiArIHJlcyk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCXJlbW92ZSA9IHRydWU7Ci0JCQkJCX0KLQkJCQkJLy8gc29tZSByZXNvdXJjZXMgbWlnaHQgYmUgbG9hZGVkIGRpcmVjdGx5LCBub3QgdGhydSBpdHMKLQkJCQkJLy8gY29udGFpbmVyLiBUaGVyZWZvcmUsIHdlIGNhbm5vdCBhc3N1bWUKLQkJCQkJLy8gdGhhdCBhIG9iamVjdCB3aXRob3V0IGEgY29udGFpbmVyIGluIGEgbG9hZGVkIHJlc291cmNlIGlzCi0JCQkJCS8vIGEgcmVtb3ZlZCBvYmplY3QuCi0JCQkJCS8vCi0JCQkJCWVsc2UgaWYgKGVPYmogIT0gbGlicmFyeSAmJiBlT2JqLmVDb250YWluZXIoKSA9PSBudWxsKSB7Ci0JCQkJCQlTeXN0ZW0ub3V0Ci0JCQkJCQkJCS5wcmludGxuKCJNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwuY2xlYW5VcCgpOiByZXNvdXJjZSB3aXRob3V0IGEgY29udGFpbmVyOiAiICsgcmVzKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJaWYgKHJlbW92ZSkgewotCQkJCS8vIFRoaXMgaXMgYSByZW1vdmVkIG9iamVjdC4gQWRkIGl0cyBwYXRoIHRvIHRoZSBsaXN0IGZvcgotCQkJCS8vIHJlbW92aW5nIGl0cyBmaWxlcyBsYXRlci4KLQkJCQkvLwotCQkJCXJlbW92ZWRSZXNvdXJjZXMuYWRkKHJlcyk7Ci0JCQl9Ci0JCX0KLQotCQkvLyBkbyBjbGVhbi11cAotCQkvLwotCQlTeXN0ZW0ub3V0Ci0JCQkJLnByaW50bG4oIk11bHRpRmlsZVJlc291cmNlU2V0SW1wbC5jbGVhblVwKCk6IHJlbW92ZWQgcmVzb3VyY2VzOiAiICsgcmVtb3ZlZFJlc291cmNlcyk7IC8vJE5PTi1OTFMtMSQKLQotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSByZW1vdmVkUmVzb3VyY2VzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJUmVzb3VyY2UgcmVzID0gKFJlc291cmNlKSBpdGVyLm5leHQoKTsKLQotCQkJdHJ5IHsKLQkJCQkvLyByZW1vdmUgUmVzb3VyY2VEZXNjcmlwdG9yIG9mIHRoZSByZW1vdmVkIHJlc291cmNlCi0JCQkJLy8KLQkJCQljbGVhblVwKHJlcyk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCWhhbmRsZUV4Y2VwdGlvbihlKTsKLQkJCX0KLQkJfQotCi0JCS8vIGdldFJlc291cmNlcygpLnJlbW92ZUFsbChyZW1vdmVkUmVzb3VyY2VzKTsKLQl9Ci0JCi0JLyoqCi0JICogUHJlcGFyZXMgdGhlIGxpYnJhcnkgZm9yIHNhdmluZwotCSAqLwotCXByaXZhdGUgdm9pZCBwcmVwYXJlU2F2ZShNZXRob2RMaWJyYXJ5IGxpYnJhcnkpIHsKLQkJLy8gY2hlY2sgaWYgdGhlIGxpYnJhcnkgYWxyZWFkeSBoYXMgYSBSZXNvdXJjZU1hbmFnZXIKLQkJLy8gaWYgbm90LCBjcmVhdGUgUmVzb3VyY2VNYW5hZ2VyIGZvciBpdAotCQkvLwotCQlNdWx0aUZpbGVYTUlSZXNvdXJjZUltcGwgcmVzb3VyY2UgPSAoTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsKSBsaWJyYXJ5Ci0JCQkJLmVSZXNvdXJjZSgpOwotCQlSZXNvdXJjZU1hbmFnZXIgbGliUmVzTWdyID0gTXVsdGlGaWxlU2F2ZVV0aWwuYWRkUmVzb3VyY2VNYW5hZ2VyKHJlc291cmNlKTsKLQkJaWYobGliUmVzTWdyICE9IG51bGwpIHsKLQkJCU11bHRpRmlsZVNhdmVVdGlsLnJlZ2lzdGVyV2l0aFJlc291cmNlTWFuYWdlcihsaWJSZXNNZ3IsIGxpYnJhcnksCi0JCQkJCXJlc291cmNlLmdldEZpbmFsVVJJKCkpOwotCQl9Ci0KLQkJTGlzdCBtb2RlbHMgPSBsaWJyYXJ5LmdldE1ldGhvZFBsdWdpbnMoKTsKLQkJaW50IHNpemUgPSBtb2RlbHMuc2l6ZSgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJcHJlcGFyZVNhdmUoKE1ldGhvZFBsdWdpbikgbW9kZWxzLmdldChpKSk7Ci0JCX0KLQotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJY2xlYW5VcCgoTWV0aG9kUGx1Z2luKSBtb2RlbHMuZ2V0KGkpKTsKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgY2xlYW5VcChNZXRob2RQbHVnaW4gcGx1Z2luKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgUFJPQ0VTU19QQUNLQUdFX1BBVEhTLmxlbmd0aDsgaSsrKSB7Ci0JCQlQcm9jZXNzUGFja2FnZSBwa2cgPSAoUHJvY2Vzc1BhY2thZ2UpIFVtYVV0aWwuZmluZE1ldGhvZFBhY2thZ2UoCi0JCQkJCXBsdWdpbiwgUFJPQ0VTU19QQUNLQUdFX1BBVEhTW2ldKTsKLQkJCWlmIChwa2cgIT0gbnVsbCkgewotCQkJCWNsZWFuVXBQcm9jZXNzZXMocGtnKTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBwcmVwYXJlU2F2ZShNZXRob2RQbHVnaW4gbW9kZWwpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBQUk9DRVNTX1BBQ0tBR0VfUEFUSFMubGVuZ3RoOyBpKyspIHsKLQkJCVByb2Nlc3NQYWNrYWdlIHBrZyA9IChQcm9jZXNzUGFja2FnZSkgVW1hVXRpbC5maW5kTWV0aG9kUGFja2FnZSgKLQkJCQkJbW9kZWwsIFBST0NFU1NfUEFDS0FHRV9QQVRIU1tpXSk7Ci0JCQlpZiAocGtnICE9IG51bGwpIHsKLQkJCQlwcmVwYXJlU2F2ZShwa2cpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlcyBwcm9jZXNzIHBhY2thZ2VzIG9mIHVudXNlZCBhY3Rpdml0aWVzLgotCSAqIAotCSAqIEBwYXJhbSBwa2cKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGNsZWFuVXBQcm9jZXNzZXMoUHJvY2Vzc1BhY2thZ2UgcGtnKSB7Ci0JCUxpc3QgbGlzdCA9IHBrZy5nZXRDaGlsZFBhY2thZ2VzKCk7Ci0JCWludCBzaXplID0gbGlzdC5zaXplKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlPYmplY3Qgb2JqID0gbGlzdC5nZXQoaSk7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkgewotCQkJCVByb2Nlc3NDb21wb25lbnQgcHJvY0NvbXAgPSAoUHJvY2Vzc0NvbXBvbmVudCkgb2JqOwotCQkJCUxpc3QgcGFja2FnZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gcHJvY0NvbXAuZ2V0Q2hpbGRQYWNrYWdlcygpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCU9iamVjdCBlbGVtZW50ID0gKE9iamVjdCkgaXRlci5uZXh0KCk7Ci0JCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgUHJvY2Vzc1BhY2thZ2UpIHsKLQkJCQkJCWdldFJlbW92ZWRQYWNrYWdlcygoUHJvY2Vzc1BhY2thZ2UpIGVsZW1lbnQsIHBhY2thZ2VzKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gcGFja2FnZXMuaXRlcmF0b3IoKTsgaXRlcmF0b3IKLQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCUVjb3JlVXRpbC5yZW1vdmUoKEVPYmplY3QpIGl0ZXJhdG9yLm5leHQoKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBnZXRSZW1vdmVkUGFja2FnZXMoUHJvY2Vzc1BhY2thZ2UgcGtnLAotCQkJTGlzdCByZW1vdmVkUGFja2FnZXMpIHsKLQkJLy8gZmluZCBhY3Rpdml0eQotCQkvLwotCQlBY3Rpdml0eSBhY3QgPSBnZXRBY3Rpdml0eShwa2cpOwotCi0JCWlmIChhY3QgPT0gbnVsbCB8fCBnZXRQYXJlbnQoYWN0KSA9PSBudWxsKSB7Ci0JCQkvLyBJbnZhbGlkIHByb2Nlc3MgcGFja2FnZS4gSXQgZG9lcyBub3QgY29udGFpbiBhbnkgYWN0aXZpdHkuCi0JCQkvLyBBZGQgaXQgdG8gdGhlIGxpc3Qgb2YgcGFja2FnZXMgdG8gYmUgcmVtb3ZlZC4KLQkJCS8vCi0JCQlyZW1vdmVkUGFja2FnZXMuYWRkKHBrZyk7Ci0JCX0gZWxzZSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBwa2cuZ2V0Q2hpbGRQYWNrYWdlcygpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3QgZWxlbWVudCA9IChPYmplY3QpIGl0ZXIubmV4dCgpOwotCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgUHJvY2Vzc1BhY2thZ2UpIHsKLQkJCQkJZ2V0UmVtb3ZlZFBhY2thZ2VzKChQcm9jZXNzUGFja2FnZSkgZWxlbWVudCwKLQkJCQkJCQlyZW1vdmVkUGFja2FnZXMpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIEFjdGl2aXR5IGdldEFjdGl2aXR5KFByb2Nlc3NQYWNrYWdlIHBrZykgewotCQkvLyBmaW5kIGFjdGl2aXR5Ci0JCS8vCi0JCUFjdGl2aXR5IGFjdCA9IG51bGw7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHBrZy5nZXRQcm9jZXNzRWxlbWVudHMoKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJYWN0ID0gKEFjdGl2aXR5KSBlbGVtZW50OwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCXJldHVybiBhY3Q7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgT2JqZWN0IGdldFBhcmVudChCcmVha2Rvd25FbGVtZW50IGUpIHsKLQkJLy8gSXRlbVByb3ZpZGVyQWRhcHRlciBhZGFwdGVyID0gKEl0ZW1Qcm92aWRlckFkYXB0ZXIpCi0JCS8vIFRuZ1V0aWwuZ2V0QWRhcHRlcihlLCBJQlNJdGVtUHJvdmlkZXIuY2xhc3MpOwotCQkvLyByZXR1cm4gYWRhcHRlciA9PSBudWxsID8gbnVsbCA6IGFkYXB0ZXIuZ2V0UGFyZW50KGUpOwotCi0JCXJldHVybiBVbWFVdGlsLmdldFBhcmVudEFjdGl2aXR5KGUpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgcHJvY2VzcyBwYWNrYWdlIGZvciB0aG9zZSBhY3Rpdml0aWVzIHRoYXQgc3RpbGwgZG9uJ3QgYmVsb25nIHRvCi0JICogYW55IHByb2Nlc3MgcGFja2FnZS4KLQkgKi8KLQlwcml2YXRlIHZvaWQgcHJlcGFyZVNhdmUoUHJvY2Vzc1BhY2thZ2UgcGtnKSB7Ci0JCUxpc3QgbGlzdCA9IHBrZy5nZXRDaGlsZFBhY2thZ2VzKCk7Ci0JCWludCBzaXplID0gbGlzdC5zaXplKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlPYmplY3Qgb2JqID0gbGlzdC5nZXQoaSk7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkgewotCQkJCXByZXBhcmVTYXZlKChQcm9jZXNzQ29tcG9uZW50KSBvYmopOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHByZXBhcmVTYXZlKFByb2Nlc3NDb21wb25lbnQgcHJvY0NvbXApIHsKLQkJUHJvY2VzcyBwcm9jID0gcHJvY0NvbXAuZ2V0UHJvY2VzcygpOwotCQlpZiAocHJvYyAhPSBudWxsKSB7Ci0JCQkvLyBhc3NvY2lhdGVBbGxBZGFwdGVycyhwcm9jKTsKLQkJCXByZXBhcmVTYXZlKHByb2MpOwotCi0JCQljbGVhblVwRGFuZ2xpbmdEZXNjcmlwdG9ycyhwcm9jQ29tcCk7Ci0KLQkJCUxpc3QgZGFuZ2xpbmdQa2dzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gbmV3IEFycmF5TGlzdChwcm9jQ29tcC5nZXRDaGlsZFBhY2thZ2VzKCkpCi0JCQkJCS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3QgZWxlbWVudCA9IChPYmplY3QpIGl0ZXIubmV4dCgpOwotCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgUHJvY2Vzc1BhY2thZ2UpIHsKLQkJCQkJUHJvY2Vzc1BhY2thZ2UgcGtnID0gKFByb2Nlc3NQYWNrYWdlKSBlbGVtZW50OwotCQkJCQlyZW9yZ2FuaXplKHBrZywgZGFuZ2xpbmdQa2dzKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCS8vIGNsZWFuIHVwIGRhbmdsaW5nIFByb2Nlc3NQYWNrYWdlcwotCQkJLy8KLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGRhbmdsaW5nUGtncy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQljbGVhblVwKChQcm9jZXNzUGFja2FnZSkgaXRlci5uZXh0KCkpOwotCQkJfQotCi0JCX0KLQl9Ci0KLQkvLyAvKioKLQkvLyAqIEBwYXJhbSBhY3Rpdml0eQotCS8vICovCi0JLy8gcHJpdmF0ZSBzdGF0aWMgdm9pZCBhc3NvY2lhdGVBbGxBZGFwdGVycyhBY3Rpdml0eSBhY3Rpdml0eSkgewotCS8vIEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5ID0KLQkvLyBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRS5nZXRXQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpOwotCS8vIEl0ZW1Qcm92aWRlckFkYXB0ZXIgYWRhcHRlciA9IChJdGVtUHJvdmlkZXJBZGFwdGVyKQotCS8vIGFkYXB0ZXJGYWN0b3J5LmFkYXB0KGFjdGl2aXR5LCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCS8vIGZvciAoSXRlcmF0b3IgaXRlciA9IGFkYXB0ZXIuZ2V0Q2hpbGRyZW4oYWN0aXZpdHkpLml0ZXJhdG9yKCk7Ci0JLy8gaXRlci5oYXNOZXh0KCk7KSB7Ci0JLy8gT2JqZWN0IGVsZW1lbnQgPSBpdGVyLm5leHQoKTsKLQkvLyBpZihlbGVtZW50IGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkvLyBhc3NvY2lhdGVBbGxBZGFwdGVycygoQWN0aXZpdHkpIGVsZW1lbnQpOwotCS8vIH0KLQkvLyB9Ci0JLy8gfQotCi0JLyoqCi0JICogQHBhcmFtIGFjdGl2aXR5Ci0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBwcmVwYXJlU2F2ZShBY3Rpdml0eSBhY3Rpdml0eSkgewotCQlQcm9jZXNzUGFja2FnZSBwYXJlbnRQa2cgPSAoUHJvY2Vzc1BhY2thZ2UpIGFjdGl2aXR5LmVDb250YWluZXIoKTsKLQkJTGlzdCBlbGVtZW50cyA9IGFjdGl2aXR5LmdldEJyZWFrZG93bkVsZW1lbnRzKCk7Ci0KLQkJLy8gYWRkIG5ldyBkZXNjcmlwdG9ycyBhbmQgb3RoZXIgbm9uLWFjdGl2aXR5IGJyZWFrZG93biBlbGVtZW50cyBvZiB0aGUKLQkJLy8gYWN0aXZpdHkgdG8gaXRzIHByb2Nlc3MgcGFja2FnZQotCQkvLwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBlbGVtZW50cy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCUVPYmplY3QgZWxlbWVudCA9IChFT2JqZWN0KSBpdGVyLm5leHQoKTsKLQkJCWlmICghKGVsZW1lbnQgaW5zdGFuY2VvZiBBY3Rpdml0eSkgJiYgZWxlbWVudC5lQ29udGFpbmVyKCkgPT0gbnVsbCkgewotCQkJCXBhcmVudFBrZy5nZXRQcm9jZXNzRWxlbWVudHMoKS5hZGQoKFByb2Nlc3NFbGVtZW50KSBlbGVtZW50KTsKLQkJCX0KLQkJfQotCi0JCS8vIGFkZCBuZXcgV29ya09yZGVyIG9iamVjdHMgb3IgcmVtb3ZlIHVudXNlZCBXb3JrT3JkZXIgb2JqZWN0cyBvZiB0aGlzCi0JCS8vIGFjdGl2aXR5Ci0JCS8vCi0JCWZvciAoV29ya09yZGVyIHdvcmtPcmRlciA6IGFjdGl2aXR5LmdldExpbmtUb1ByZWRlY2Vzc29yKCkpIHsKLQkJCWlmICh3b3JrT3JkZXIuZUNvbnRhaW5lcigpID09IG51bGwpIHsKLQkJCQlpZiAod29ya09yZGVyLmdldFByZWQoKSAhPSBudWxsCi0JCQkJCQkmJiBnZXRQYXJlbnQod29ya09yZGVyLmdldFByZWQoKSkgIT0gbnVsbCkgewotCQkJCQlwYXJlbnRQa2cuZ2V0UHJvY2Vzc0VsZW1lbnRzKCkuYWRkKHdvcmtPcmRlcik7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlpZiAod29ya09yZGVyLmdldFByZWQoKSA9PSBudWxsCi0JCQkJCQl8fCBnZXRQYXJlbnQod29ya09yZGVyLmdldFByZWQoKSkgPT0gbnVsbCkgewotCQkJCQlpZiAoTXVsdGlGaWxlU2F2ZVV0aWwuREVCVUcpIHsKLQkJCQkJCVN5c3RlbS5lcnIucHJpbnRsbigiSW52YWxpZCBXb3JrT3JkZXI6ICIgKyB3b3JrT3JkZXIpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQkJcGFyZW50UGtnLmdldFByb2Nlc3NFbGVtZW50cygpLnJlbW92ZSh3b3JrT3JkZXIpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCS8vIHJlbW92ZWQgdW51c2VkIGRpYWdyYW1zCi0JCS8vCi0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHBhcmVudFBrZy5nZXREaWFncmFtcygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJRGlhZ3JhbSBkaWFncmFtID0gKERpYWdyYW0pIGl0ZXIubmV4dCgpOwotCQkJU2VtYW50aWNNb2RlbEJyaWRnZSBicmlkZ2UgPSBkaWFncmFtLmdldFNlbWFudGljTW9kZWwoKTsKLQkJCWlmIChicmlkZ2UgaW5zdGFuY2VvZiBVTUFTZW1hbnRpY01vZGVsQnJpZGdlKSB7Ci0JCQkJTWV0aG9kRWxlbWVudCBlbGVtZW50ID0gKChVTUFTZW1hbnRpY01vZGVsQnJpZGdlKSBicmlkZ2UpCi0JCQkJCQkuZ2V0RWxlbWVudCgpOwotCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgQWN0aXZpdHkKLQkJCQkJCSYmICghKGVsZW1lbnQgaW5zdGFuY2VvZiBQcm9jZXNzKSAmJiBnZXRQYXJlbnQoKEFjdGl2aXR5KSBlbGVtZW50KSA9PSBudWxsKSkgewotCQkJCQlpdGVyLnJlbW92ZSgpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWludCBzaXplID0gZWxlbWVudHMuc2l6ZSgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJT2JqZWN0IGUgPSBlbGVtZW50cy5nZXQoaSk7Ci0JCQlpZiAoZSBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJQWN0aXZpdHkgYWN0ID0gKEFjdGl2aXR5KSBlOwotCQkJCWlmIChhY3QuZUNvbnRhaW5lcigpID09IG51bGwpIHsKLQkJCQkJUHJvY2Vzc1BhY2thZ2UgcGtnID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkJCQkuY3JlYXRlUHJvY2Vzc1BhY2thZ2UoKTsKLQkJCQkJcGtnLnNldE5hbWUoYWN0LmdldE5hbWUoKSk7Ci0JCQkJCXBrZy5nZXRQcm9jZXNzRWxlbWVudHMoKS5hZGQoYWN0KTsKLQkJCQkJTGlzdCBkZXNjcmlwdG9ycyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBhY3QuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5zaXplKCk7IGorKykgewotCQkJCQkJT2JqZWN0IG9iaiA9IGFjdC5nZXRCcmVha2Rvd25FbGVtZW50cygpLmdldChqKTsKLQkJCQkJCWlmIChvYmogaW5zdGFuY2VvZiBEZXNjcmlwdG9yKSB7Ci0JCQkJCQkJZGVzY3JpcHRvcnMuYWRkKG9iaik7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJcGtnLmdldFByb2Nlc3NFbGVtZW50cygpLmFkZEFsbChkZXNjcmlwdG9ycyk7Ci0KLQkJCQkJcGFyZW50UGtnLmdldENoaWxkUGFja2FnZXMoKS5hZGQocGtnKTsKLQkJCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJQcm9jZXNzIHBhY2thZ2UgY3JlYXRlZCBmb3IgYWN0aXZpdHk6Ci0JCQkJCS8vICciICsgYWN0LmdldE5hbWUoKSArICInIik7Ci0JCQkJfQotCQkJCXByZXBhcmVTYXZlKGFjdCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGNsZWFuVXBEYW5nbGluZ0Rlc2NyaXB0b3JzKFByb2Nlc3NQYWNrYWdlIHBrZykgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBwa2cuZ2V0UHJvY2Vzc0VsZW1lbnRzKCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZWxlbWVudCA9IGl0ZXIubmV4dCgpOwotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50Ci0JCQkJCSYmICgoQnJlYWtkb3duRWxlbWVudCkgZWxlbWVudCkuZ2V0U3VwZXJBY3Rpdml0aWVzKCkgPT0gbnVsbCkgewotCQkJCWJvb2xlYW4gcmVtb3ZlID0gZmFsc2U7Ci0JCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBSb2xlRGVzY3JpcHRvcikgewotCQkJCQlpZiAoQXNzb2NpYXRpb25IZWxwZXIuZ2V0VGVhbVByb2ZpbGVzKAotCQkJCQkJCShSb2xlRGVzY3JpcHRvcikgZWxlbWVudCkuaXNFbXB0eSgpKSB7Ci0JCQkJCQlyZW1vdmUgPSB0cnVlOwotCQkJCQl9Ci0JCQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yKSB7Ci0JCQkJCWlmIChBc3NvY2lhdGlvbkhlbHBlci5nZXREZWxpdmVyYWJsZURlc2NyaXB0b3JzKAotCQkJCQkJCShXb3JrUHJvZHVjdERlc2NyaXB0b3IpIGVsZW1lbnQpLmlzRW1wdHkoKSkgewotCQkJCQkJcmVtb3ZlID0gdHJ1ZTsKLQkJCQkJfQotCQkJCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFRlYW1Qcm9maWxlKSB7Ci0JCQkJCWlmICgoKFRlYW1Qcm9maWxlKSBlbGVtZW50KS5nZXRTdXBlclRlYW0oKSA9PSBudWxsKSB7Ci0JCQkJCQlyZW1vdmUgPSB0cnVlOwotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJcmVtb3ZlID0gdHJ1ZTsKLQkJCQl9Ci0KLQkJCQlpZiAocmVtb3ZlKSB7Ci0JCQkJCWl0ZXIucmVtb3ZlKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogTW92ZXMgdGhlIHByb2Nlc3MgcGFja2FnZXMgdG8gdGhlIHJpZ2h0IGxvY2F0aW9uIGluIHRoZSB0cmVlIGlmIG5lZWRlZC4KLQkgKiAKLQkgKiBAcGFyYW0gcGtnCi0JICogQHBhcmFtIGRhbmdsaW5nUGtncwotCSAqLwotCXByaXZhdGUgdm9pZCByZW9yZ2FuaXplKFByb2Nlc3NQYWNrYWdlIHBrZywgTGlzdCBkYW5nbGluZ1BrZ3MpIHsKLQkJQWN0aXZpdHkgYWN0ID0gZ2V0QWN0aXZpdHkocGtnKTsKLQkJaWYgKGFjdCA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCS8vIG1ha2Ugc3VyZSB0aGUgcGFja2FnZSBoYXMgdGhlIHNhbWUgbmFtZSBhcyB0aGUgYWN0aXZpdHkncyBuYW1lCi0JCS8vCi0JCWlmICghcGtnLmdldE5hbWUoKS5lcXVhbHMoYWN0LmdldE5hbWUoKSkpIHsKLQkJCXBrZy5zZXROYW1lKGFjdC5nZXROYW1lKCkpOwotCQl9Ci0KLQkJLy8gY2hlY2sgaWYgdGhlIGNvbnRhaW5lciBvZiBwa2cgaXMgYWN0dWFsbHkgaG9sZGluZyB0aGUgcGFyZW50IGFjdGl2aXR5Ci0JCS8vIG9mIGFjdAotCQkvLwotCQlFT2JqZWN0IHBhcmVudEFjdCA9IChFT2JqZWN0KSBnZXRQYXJlbnQoYWN0KTsKLQotCQlpZiAocGFyZW50QWN0ID09IG51bGwpIHsKLQkJCS8vIGNsZWFuVXBSZXNvdXJjZURlc2NyaXB0b3JzKHBrZyk7Ci0JCQkvLyBjbGVhblVwKHBrZyk7Ci0JCQkvLyByZXR1cm47Ci0JCQlkYW5nbGluZ1BrZ3MuYWRkKHBrZyk7Ci0JCX0gZWxzZSBpZiAocGFyZW50QWN0ICE9IGdldEFjdGl2aXR5KChQcm9jZXNzUGFja2FnZSkgcGtnLmVDb250YWluZXIoKSkpIHsKLQkJCS8vIG1vdmUgdGhlIHBhY2thZ2UgdG8gdGhlIHJpZ2h0IGxvY2F0aW9uLCB1bmRlciB0aGUgcHJvY2VzcyBwYWNrYWdlCi0JCQkvLyBvZiBwYXJlbnRBY3QKLQkJCS8vCi0JCQlQcm9jZXNzUGFja2FnZSBwYXJlbnRQa2cgPSAoUHJvY2Vzc1BhY2thZ2UpIHBhcmVudEFjdC5lQ29udGFpbmVyKCk7Ci0JCQlwYXJlbnRQa2cuZ2V0Q2hpbGRQYWNrYWdlcygpLmFkZChwa2cpOwotCQl9Ci0KLQkJaWYgKHBhcmVudEFjdCAhPSBudWxsKSB7Ci0JCQljbGVhblVwRGFuZ2xpbmdEZXNjcmlwdG9ycyhwa2cpOwotCQl9Ci0KLQkJZm9yIChJdGVyYXRvciBpdGVyID0gcGtnLmdldENoaWxkUGFja2FnZXMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gKE9iamVjdCkgaXRlci5uZXh0KCk7Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFByb2Nlc3NQYWNrYWdlKSB7Ci0JCQkJcmVvcmdhbml6ZSgoUHJvY2Vzc1BhY2thZ2UpIGVsZW1lbnQsIGRhbmdsaW5nUGtncyk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgTWFwPFN0cmluZywgRU9iamVjdD4gZ2V0R3VpZFRvTWV0aG9kRWxlbWVudE1hcCgpIHsKLQkJaWYgKGd1aWRUb01ldGhvZEVsZW1lbnRNYXAgPT0gbnVsbCkgewotCQkJZ3VpZFRvTWV0aG9kRWxlbWVudE1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgRU9iamVjdD4oKTsKLQkJfQotCQlyZXR1cm4gZ3VpZFRvTWV0aG9kRWxlbWVudE1hcDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQmFzaWNOb3RpZmllckltcGwjZU5vdGlmeShvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb24pCi0JICovCi0JcHVibGljIHZvaWQgZU5vdGlmeShOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXRyeSB7Ci0JCQlzdXBlci5lTm90aWZ5KG5vdGlmaWNhdGlvbik7Ci0JCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkJQ29tbW9uUGx1Z2luLklOU1RBTkNFCi0JCQkJCS5sb2coIkVSUk9SIG5vdGlmeWluZyBjaGFuZ2VzOiByZXNvdXJjZVNldD0iICsgdGhpcyArICIsIG5vdGlmaWNhdGlvbj0iICsgbm90aWZpY2F0aW9uKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlDb21tb25QbHVnaW4uSU5TVEFOQ0UubG9nKGUpOwotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGFkZE1hcmtlcihFeGNlcHRpb24gZSkgewotCQl0cnkgewotCQkJLy8gaW5zZXJ0IHByb2JsZW0gbWFya2VyCi0JCQkvLwotCQkJbWFya2VyTWFuYW5nZXIubm90aWZ5RXhjZXB0aW9uKGUpOwotCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGV4KSB7Ci0JCQlDb21tb25QbHVnaW4uSU5TVEFOQ0UubG9nKGV4KTsKLQkJCWlmIChNdWx0aUZpbGVTYXZlVXRpbC5ERUJVRykgewotCQkJCWV4LnByaW50U3RhY2tUcmFjZSgpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TG9hZGluZyhib29sZWFuIGIpIHsKLQkJbG9hZGluZyA9IGI7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLklFeGNlcHRpb25Db2xsZWN0b3IjY29sbGVjdChqYXZhLmxhbmcuRXhjZXB0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUV4Y2VwdGlvbihFeGNlcHRpb24gZSkgewotCQlpZiAobG9hZGluZ1Jlc291cmNlTWFuYWdlclRyZWUpIHsKLQkJCWlmIChlIGluc3RhbmNlb2YgUmVzb2x2ZUV4Y2VwdGlvbikgewotCQkJCWlmICgoKFJlc29sdmVFeGNlcHRpb24pIGUpLmV4Y2VwdGlvbigpIGluc3RhbmNlb2YgTXVsdGlGaWxlSU9FeGNlcHRpb24pIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCX0KLQkJfQotCQl0cnkgewotCQkJYWRkTWFya2VyKGUpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCS8vCi0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUuSVByb3h5UmVzb2x1dGlvbkxpc3RlbmVyI3Byb3h5UmVzb2x2ZWQoamF2YS5sYW5nLk9iamVjdCwKLQkgKiAgICAgIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgcHJveHlSZXNvbHZlZChPYmplY3QgcHJveHksIE9iamVjdCByZXNvbHZlZCkgewotCQlpZihyZXNvbHZlZCBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCVN0cmluZyBndWlkID0gTXVsdGlGaWxlU2F2ZVV0aWwuZ2V0R3VpZChyZXNvbHZlZCk7Ci0JCQlpZiAoZ3VpZCAhPSBudWxsKSB7Ci0JCQkJZ2V0R3VpZFRvTWV0aG9kRWxlbWVudE1hcCgpLnB1dChndWlkLCAoRU9iamVjdCkgcmVzb2x2ZWQpOwotCQkJfQotCQl9Ci0JCW1hcmtlck1hbmFuZ2VyLnByb3h5UmVzb2x2ZWQocHJveHksIHJlc29sdmVkKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgRU9iamVjdCBnZXRFT2JqZWN0QnlHVUlEKFN0cmluZyBndWlkKSB7Ci0JCXJldHVybiAoRU9iamVjdCkgZ2V0R3VpZFRvTWV0aG9kRWxlbWVudE1hcCgpLmdldChndWlkKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUuSVVtYVJlc291cmNlU2V0I2dldEVPYmplY3Qob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QsCi0JICogICAgICBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJLCBib29sZWFuKQotCSAqLwotCXB1YmxpYyBFT2JqZWN0IGdldEVPYmplY3QoRU9iamVjdCByZXNvbHZlciwgVVJJIHVyaSwgYm9vbGVhbiBsb2FkT25EZW1hbmQpIHsKLQkJLy8gbG9uZyBzdGFydDsKLQkJLy8gaWYoTXVsdGlGaWxlU2F2ZVV0aWwuUFJPRklMRSkgewotCQkvLyBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQkvLyB9Ci0KLQkJVVJJIG5vcm1hbGl6ZWQgPSAoKE11bHRpRmlsZVVSSUNvbnZlcnRlcikgZ2V0VVJJQ29udmVydGVyKCkpLm5vcm1hbGl6ZSgKLQkJCQl1cmksIHJlc29sdmVyKTsKLQkJaWYgKG5vcm1hbGl6ZWQgPT0gbnVsbCkgewotCQkJLy8gd29yay1hcm91bmQgdG8gbG9vayB1cCBmb3Igb2JqZWN0IGJ5IGl0cyBHVUlEIGluIGNhc2UgaXQgaGFkIGJlZW4KLQkJCS8vIG1vdmVkIHRvIG90aGVyIHJlc291cmNlCi0JCQkvLwotCQkJU3RyaW5nIGd1aWQgPSB1cmkuZnJhZ21lbnQoKTsKLQkJCUVPYmplY3QgZU9iamVjdCA9IGdldEVPYmplY3RCeUdVSUQoZ3VpZCk7Ci0JCQlpZiAoZU9iamVjdCAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIGVPYmplY3Q7Ci0JCQl9Ci0KLQkJCVN0cmluZyBtc2cgPSBOTFMuYmluZChQZXJzaXN0ZW5jZVJlc291cmNlcy5ub3JtYWxpemVVUklFcnJvcl9tc2csCi0JCQkJCXVyaSk7Ci0JCQl0aHJvdyBuZXcgVW5ub3JtYWxpemVkVVJJRXhjZXB0aW9uKHVyaSwgbXNnKTsKLQkJfQotCQlSZXNvdXJjZSByZXNvdXJjZSA9IGdldFJlc291cmNlKG5vcm1hbGl6ZWQudHJpbUZyYWdtZW50KCksIGxvYWRPbkRlbWFuZCk7Ci0JCWlmIChyZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgZnJhZ21lbnQgPSBub3JtYWxpemVkLmZyYWdtZW50KCk7Ci0JCQlpZiAoZnJhZ21lbnQgPT0gbnVsbCB8fCBmcmFnbWVudC5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJcmV0dXJuIFBlcnNpc3RlbmNlVXRpbC5nZXRNZXRob2RFbGVtZW50KHJlc291cmNlKTsKLQkJCX0KLQkJCUVPYmplY3QgZU9iamVjdCA9IHJlc291cmNlLmdldEVPYmplY3QoZnJhZ21lbnQpOwotCQkJaWYgKGVPYmplY3QgPT0gbnVsbCAmJiAhZnJhZ21lbnQuZXF1YWxzKHVyaS5hdXRob3JpdHkoKSkpIHsKLQkJCQkvLyB3b3JrLWFyb3VuZCB0byBsb29rIHVwIGZvciBvYmplY3QgYnkgaXRzIEdVSUQgaW4gY2FzZSBpdCBoYWQKLQkJCQkvLyBiZWVuIG1vdmVkCi0JCQkJLy8KLQkJCQlyZXR1cm4gZ2V0RU9iamVjdEJ5R1VJRChmcmFnbWVudCk7Ci0JCQl9Ci0JCQlyZXR1cm4gZU9iamVjdDsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJLy8gaWYoTXVsdGlGaWxlU2F2ZVV0aWwuUFJPRklMRSkgewotCQkvLwkJCQotCQkvLyB9Ci0JfQotCi0JLy8gLyoqCi0JLy8gKiBAcmV0dXJuIFJldHVybnMgdGhlIGV4Y2VwdGlvbnMuCi0JLy8gKi8KLQkvLyBwdWJsaWMgTGlzdCBnZXRFeGNlcHRpb25zKCkgewotCS8vIHJldHVybiBleGNlcHRpb25zOwotCS8vIH0KLQotCXB1YmxpYyB2b2lkIGxvYWRPcHBvc2l0ZUZlYXR1cmVzKExpc3Qgb3Bwb3NpdGVGZWF0dXJlcykgewotCQlpbnQgbWF4ID0gb3Bwb3NpdGVGZWF0dXJlcy5zaXplKCkgLSAxOwotCQlpZiAobWF4IDwgMCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCUFycmF5TGlzdCBlbGVtZW50cyA9IG5ldyBBcnJheUxpc3QoZ2V0R3VpZFRvTWV0aG9kRWxlbWVudE1hcCgpLnZhbHVlcygpKTsKLQkJSGFzaFNldCBsb2FkZWRFbGVtZW50cyA9IG5ldyBIYXNoU2V0KCk7Ci0JCXdoaWxlICghZWxlbWVudHMuaXNFbXB0eSgpKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBlbGVtZW50cy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3Qgb2JqID0gaXRlci5uZXh0KCk7Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCQkJTWV0aG9kRWxlbWVudCBlbGVtZW50ID0gKE1ldGhvZEVsZW1lbnQpIG9iajsKLQkJCQkJZm9yIChpbnQgaSA9IG1heDsgaSA+IC0xOyBpLS0pIHsKLQkJCQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSA9ICgoT3Bwb3NpdGVGZWF0dXJlKSBvcHBvc2l0ZUZlYXR1cmVzCi0JCQkJCQkJCS5nZXQoaSkpLmdldFRhcmdldEZlYXR1cmUoKTsKLQkJCQkJCWlmIChlRmVhdHVyZS5nZXRDb250YWluZXJDbGFzcygpLmlzSW5zdGFuY2UoZWxlbWVudCkpIHsKLQkJCQkJCQlpZiAoZUZlYXR1cmUuaXNNYW55KCkpIHsKLQkJCQkJCQkJSW50ZXJuYWxFTGlzdCBsaXN0ID0gKEludGVybmFsRUxpc3QpIGVsZW1lbnQKLQkJCQkJCQkJCQkuZUdldChlRmVhdHVyZSk7Ci0JCQkJCQkJCWlmICghbGlzdC5pc0VtcHR5KCkpIHsKLQkJCQkJCQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBsaXN0Lml0ZXJhdG9yKCk7IGl0ZXJhdG9yCi0JCQkJCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJCQkJaXRlcmF0b3IubmV4dCgpOwotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJZWxlbWVudC5lR2V0KGVGZWF0dXJlKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCS8vIGdldHMgdGhlIG5ld2x5IGxvYWRlZCBlbGVtZW50cyB0byBsb2FkIHRoZWlyIG9wcG9zaXRlIGZlYXR1cmVzCi0JCQkvLwotCQkJbG9hZGVkRWxlbWVudHMuYWRkQWxsKGVsZW1lbnRzKTsKLQkJCWVsZW1lbnRzID0gbmV3IEFycmF5TGlzdChnZXRHdWlkVG9NZXRob2RFbGVtZW50TWFwKCkudmFsdWVzKCkpOwotCQkJZWxlbWVudHMucmVtb3ZlQWxsKGxvYWRlZEVsZW1lbnRzKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGxvYWRPcHBvc2l0ZUZlYXR1cmVzKExpc3Qgb3Bwb3NpdGVGZWF0dXJlcywgU2V0IGRlbGV0ZWRHVUlEcykgewotCQlpbnQgbWF4ID0gb3Bwb3NpdGVGZWF0dXJlcy5zaXplKCkgLSAxOwotCQlpZiAobWF4IDwgMCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCUFycmF5TGlzdCBlbGVtZW50cyA9IG5ldyBBcnJheUxpc3QoZ2V0R3VpZFRvTWV0aG9kRWxlbWVudE1hcCgpLnZhbHVlcygpKTsKLQkJSGFzaFNldCBsb2FkZWRFbGVtZW50cyA9IG5ldyBIYXNoU2V0KCk7Ci0JCXdoaWxlICghZWxlbWVudHMuaXNFbXB0eSgpKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBlbGVtZW50cy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3Qgb2JqID0gaXRlci5uZXh0KCk7Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCQkJTWV0aG9kRWxlbWVudCBlbGVtZW50ID0gKE1ldGhvZEVsZW1lbnQpIG9iajsKLQkJCQkJTXVsdGlSZXNvdXJjZUVPYmplY3QgbXJFT2JqZWN0ID0gKChNdWx0aVJlc291cmNlRU9iamVjdCkgZWxlbWVudCk7Ci0JCQkJCWZvciAoaW50IGkgPSBtYXg7IGkgPiAtMTsgaS0tKSB7Ci0JCQkJCQlPcHBvc2l0ZUZlYXR1cmUgb3Bwb3NpdGVGZWF0dXJlID0gKChPcHBvc2l0ZUZlYXR1cmUpIG9wcG9zaXRlRmVhdHVyZXMKLQkJCQkJCQkJLmdldChpKSk7Ci0JCQkJCQlFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUgPSBvcHBvc2l0ZUZlYXR1cmUuZ2V0VGFyZ2V0RmVhdHVyZSgpOwotCQkJCQkJaWYgKGVGZWF0dXJlLmdldENvbnRhaW5lckNsYXNzKCkuaXNJbnN0YW5jZShlbGVtZW50KSkgewotCQkJCQkJCWlmIChlRmVhdHVyZS5pc01hbnkoKSkgewotCQkJCQkJCQlJbnRlcm5hbEVMaXN0IGxpc3QgPSAoSW50ZXJuYWxFTGlzdCkgZWxlbWVudAotCQkJCQkJCQkJCS5lR2V0KGVGZWF0dXJlKTsKLQkJCQkJCQkJaWYgKCFsaXN0LmlzRW1wdHkoKSkgewotCQkJCQkJCQkJYm9vbGVhbiByZXNvbHZlID0gZmFsc2U7Ci0JCQkJCQkJCQljaGVja19yZXNvbHZlOiBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gbGlzdAotCQkJCQkJCQkJCQkuYmFzaWNJdGVyYXRvcigpOyBpdGVyYXRvcgotCQkJCQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJCQkJCUludGVybmFsRU9iamVjdCBlID0gKEludGVybmFsRU9iamVjdCkgaXRlcmF0b3IKLQkJCQkJCQkJCQkJCS5uZXh0KCk7Ci0JCQkJCQkJCQkJaWYgKGUuZUlzUHJveHkoKSkgewotCQkJCQkJCQkJCQlTdHJpbmcgZ3VpZCA9IGUuZVByb3h5VVJJKCkKLQkJCQkJCQkJCQkJCQkuZnJhZ21lbnQoKTsKLQkJCQkJCQkJCQkJaWYgKGRlbGV0ZWRHVUlEcy5jb250YWlucyhndWlkKSkgewotCQkJCQkJCQkJCQkJcmVzb2x2ZSA9IHRydWU7Ci0JCQkJCQkJCQkJCQlicmVhayBjaGVja19yZXNvbHZlOwotCQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQkJfQotCQkJCQkJCQkJfQotCQkJCQkJCQkJaWYgKHJlc29sdmUpIHsKLQkJCQkJCQkJCQlDb2xsZWN0aW9uPE9iamVjdD4gZGVsZXRlZEVsZW1lbnRzID0gbmV3IEhhc2hTZXQ8T2JqZWN0PigpOwotCQkJCQkJCQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBsaXN0Ci0JCQkJCQkJCQkJCQkuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJCQkJCQkJCQlPYmplY3QgbyA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJCQkJCQkJaWYobyBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQgJiYgZGVsZXRlZEdVSURzLmNvbnRhaW5zKCgoTWV0aG9kRWxlbWVudCkgbykuZ2V0R3VpZCgpKSkgewotCQkJCQkJCQkJCQkJZGVsZXRlZEVsZW1lbnRzLmFkZChvKTsKLQkJCQkJCQkJCQkJfQotCQkJCQkJCQkJCX0KLQkJCQkJCQkJCQlmb3IgKE9iamVjdCBlIDogZGVsZXRlZEVsZW1lbnRzKSB7Ci0JCQkJCQkJCQkJCWlmKG9wcG9zaXRlRmVhdHVyZS5pc01hbnkoKSkgewotCQkJCQkJCQkJCQkJbXJFT2JqZWN0Lm9wcG9zaXRlQWRkKG9wcG9zaXRlRmVhdHVyZSwgZSk7Ci0JCQkJCQkJCQkJCX0KLQkJCQkJCQkJCQkJZWxzZSB7Ci0JCQkJCQkJCQkJCQltckVPYmplY3QuZ2V0T3Bwb3NpdGVGZWF0dXJlTWFwKCkucHV0KG9wcG9zaXRlRmVhdHVyZSwgZSk7Ci0JCQkJCQkJCQkJCX0KLQkJCQkJCQkJCQl9CQkJCQkJCQkJCQotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJT2JqZWN0IHZhbHVlID0gZWxlbWVudC5lR2V0KGVGZWF0dXJlLCBmYWxzZSk7Ci0JCQkJCQkJCWlmICh2YWx1ZSBpbnN0YW5jZW9mIEludGVybmFsRU9iamVjdCkgewotCQkJCQkJCQkJSW50ZXJuYWxFT2JqZWN0IGUgPSAoSW50ZXJuYWxFT2JqZWN0KSB2YWx1ZTsKLQkJCQkJCQkJCWlmIChlLmVJc1Byb3h5KCkpIHsKLQkJCQkJCQkJCQlTdHJpbmcgZ3VpZCA9IGUuZVByb3h5VVJJKCkuZnJhZ21lbnQoKTsKLQkJCQkJCQkJCQlpZiAoZGVsZXRlZEdVSURzLmNvbnRhaW5zKGd1aWQpKSB7Ci0JCQkJCQkJCQkJCU9iamVjdCBvID0gZWxlbWVudC5lR2V0KGVGZWF0dXJlKTsKLQkJCQkJCQkJCQkJaWYob3Bwb3NpdGVGZWF0dXJlLmlzTWFueSgpKSB7Ci0JCQkJCQkJCQkJCQltckVPYmplY3Qub3Bwb3NpdGVBZGQob3Bwb3NpdGVGZWF0dXJlLCBvKTsKLQkJCQkJCQkJCQkJfQotCQkJCQkJCQkJCQllbHNlIHsKLQkJCQkJCQkJCQkJCW1yRU9iamVjdC5nZXRPcHBvc2l0ZUZlYXR1cmVNYXAoKS5wdXQob3Bwb3NpdGVGZWF0dXJlLCBvKTsKLQkJCQkJCQkJCQkJfQotCQkJCQkJCQkJCX0KLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCS8vIGdldHMgdGhlIG5ld2x5IGxvYWRlZCBlbGVtZW50cyB0byBsb2FkIHRoZWlyIG9wcG9zaXRlIGZlYXR1cmVzCi0JCQkvLwotCQkJbG9hZGVkRWxlbWVudHMuYWRkQWxsKGVsZW1lbnRzKTsKLQkJCWVsZW1lbnRzID0gbmV3IEFycmF5TGlzdChnZXRHdWlkVG9NZXRob2RFbGVtZW50TWFwKCkudmFsdWVzKCkpOwotCQkJZWxlbWVudHMucmVtb3ZlQWxsKGxvYWRlZEVsZW1lbnRzKTsKLQkJfQotCX0KLQotCXB1YmxpYyBib29sZWFuIGhhc1VucmVzb2x2ZWRQcm94eSgpIHsKLQkJcmV0dXJuIG1hcmtlck1hbmFuZ2VyLmhhc1VucmVzb2x2ZWRQcm94eSgpOwotCX0KLQotCXByb3RlY3RlZCBNYXAgZ2V0VVJJVG9UZW1wVVJJTWFwKCkgewotCQlpZiAoVVJJVG9UZW1wVVJJTWFwID09IG51bGwpIHsKLQkJCVVSSVRvVGVtcFVSSU1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCX0KLQotCQlyZXR1cm4gVVJJVG9UZW1wVVJJTWFwOwotCX0KLQotCXB1YmxpYyBVbnJlc29sdmVkUHJveHlNYXJrZXJNYW5hZ2VyIGdldE1hcmtlck1hbmFuZ2VyKCkgewotCQlyZXR1cm4gbWFya2VyTWFuYW5nZXI7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjaGVja01vZGlmeShDb2xsZWN0aW9uPFJlc291cmNlPiByZXNvdXJjZXMpIHRocm93cyBMaWJyYXJ5UmVzb3VyY2VFeGNlcHRpb24gewotCQlpZighcmVzb3VyY2VzLmlzRW1wdHkoKSkgewotCQkJUmVzb3VyY2VbXSByZXNvdXJjZUFycmF5ID0gbmV3IFJlc291cmNlW3Jlc291cmNlcy5zaXplKCldOwotCQkJcmVzb3VyY2VzLnRvQXJyYXkocmVzb3VyY2VBcnJheSk7Ci0JCQljaGVja01vZGlmeShyZXNvdXJjZUFycmF5LCBQZXJzaXN0ZW5jZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0Q29udGV4dCgpLypNc2dCb3guZ2V0RGVmYXVsdFNoZWxsKCkqLyk7Ci0JCX0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS5JTGlicmFyeVJlc291cmNlU2V0I2NoZWNrTW9kaWZ5KG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLklMaWJyYXJ5UmVzb3VyY2VbXSwgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjaGVja01vZGlmeShSZXNvdXJjZVtdIHJlc291cmNlcywgT2JqZWN0IGNvbnRleHQpIHRocm93cyBMaWJyYXJ5UmVzb3VyY2VFeGNlcHRpb24gewkJCi0JCU11bHRpRmlsZVNhdmVVdGlsLmRvQ2hlY2tNb2RpZnkoQXJyYXlzLmFzTGlzdChyZXNvdXJjZXMpKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS5JTGlicmFyeVJlc291cmNlU2V0I2NoZWNrTW9kaWZ5KGphdmEudXRpbC5Db2xsZWN0aW9uPEVPYmplY3Q+LCBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBJU3RhdHVzIGNoZWNrTW9kaWZ5KENvbGxlY3Rpb248RU9iamVjdD4gZU9iamVjdHMsIE9iamVjdCBjb250ZXh0KSB7Ci0JCUhhc2hTZXQgcGF0aFNldCA9IG5ldyBIYXNoU2V0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGVPYmplY3RzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJRU9iamVjdCBvID0gKEVPYmplY3QpIGl0ZXIubmV4dCgpOwotCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSBvLmVSZXNvdXJjZSgpOwotCQkJaWYocmVzb3VyY2UgIT0gbnVsbCAmJiByZXNvdXJjZS5nZXRSZXNvdXJjZVNldCgpID09IHRoaXMpIHsKLQkJCQlNdWx0aUZpbGVYTUlSZXNvdXJjZUltcGwgbWZSZXNvdXJjZSA9IChNdWx0aUZpbGVYTUlSZXNvdXJjZUltcGwpIHJlc291cmNlOwotCQkJCWlmKCFtZlJlc291cmNlLmhhc1RlbXBVUkkoKSkgewotCQkJCQlTdHJpbmcgcGF0aCA9IG1mUmVzb3VyY2UuZ2V0VVJJKCkudG9GaWxlU3RyaW5nKCk7Ci0JCQkJCXBhdGhTZXQuYWRkKHBhdGgpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlpZihwYXRoU2V0LmlzRW1wdHkoKSkgewotCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCX0KLQkJU3RyaW5nW10gcGF0aHMgPSBuZXcgU3RyaW5nW3BhdGhTZXQuc2l6ZSgpXTsKLQkJcGF0aFNldC50b0FycmF5KHBhdGhzKTsKLQkJcmV0dXJuIEZpbGVNYW5hZ2VyLmdldEluc3RhbmNlKCkuY2hlY2tNb2RpZnkocGF0aHMsIGNvbnRleHQpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLklMaWJyYXJ5UmVzb3VyY2VTZXQjZ2V0UGVyc2lzdGVyKCkKLQkgKi8KLQlwdWJsaWMgSUxpYnJhcnlQZXJzaXN0ZXIgZ2V0UGVyc2lzdGVyKCkgewotCQlyZXR1cm4gTWV0aG9kTGlicmFyeVBlcnNpc3Rlci5JTlNUQU5DRTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS5JTGlicmFyeVJlc291cmNlU2V0I3VubG9hZChvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2UsIGphdmEudXRpbC5NYXApCi0JICovCi0JcHVibGljIGJvb2xlYW4gdW5sb2FkKFJlc291cmNlIHJlc291cmNlLCBNYXAgb3B0aW9ucykgewotCQlpZihyZXNvdXJjZSBpbnN0YW5jZW9mIE11bHRpRmlsZVhNSVJlc291cmNlSW1wbCkgewotCQkJcmV0dXJuIHVubG9hZFdpdGhvdXRSZW1vdmUoKE11bHRpRmlsZVhNSVJlc291cmNlSW1wbCkgcmVzb3VyY2UpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS5JTGlicmFyeVJlc291cmNlU2V0I3VubG9hZCgpCi0JICovCi0JcHVibGljIHZvaWQgdW5sb2FkKCkgewotCQlyZXNldCgpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLklMaWJyYXJ5UmVzb3VyY2VTZXQjZ2V0Rmlyc3RNZXRob2RMaWJyYXJ5KCkKLQkgKi8KLQlwdWJsaWMgTWV0aG9kTGlicmFyeSBnZXRGaXJzdE1ldGhvZExpYnJhcnkoKSB7Ci0JCXJldHVybiBnZXRNZXRob2RMaWJyYXJ5KCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UuSUxpYnJhcnlSZXNvdXJjZVNldCNnZXRNZXRob2RMaWJyYXJpZXMoKQotCSAqLwotCXB1YmxpYyBMaXN0IGdldE1ldGhvZExpYnJhcmllcygpIHsKLQkJTWV0aG9kTGlicmFyeSBsaWIgPSBnZXRNZXRob2RMaWJyYXJ5KCk7Ci0JCWlmKGxpYiA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQkJfQotCQlyZXR1cm4gQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChsaWIpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLklMaWJyYXJ5UmVzb3VyY2VTZXQjbG9hZE1ldGhvZExpYnJhcmllcyhvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJLCBqYXZhLnV0aWwuTWFwKQotCSAqLwotCXB1YmxpYyB2b2lkIGxvYWRNZXRob2RMaWJyYXJpZXMoVVJJIHVyaSwgTWFwPD8sID8+IHBhcmFtZXRlcnMpIHRocm93cyBMaWJyYXJ5UmVzb3VyY2VFeGNlcHRpb24gewotCQl0cnkgewotCQkJbG9hZExpYnJhcnkodXJpLnRvRmlsZVN0cmluZygpKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWlmKGUgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7Ci0JCQkJdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pZTsKLQkJCX0KLQkJCXRocm93IG5ldyBMaWJyYXJ5UmVzb3VyY2VFeGNlcHRpb24oZSk7Ci0JCX0KLQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLklMaWJyYXJ5UmVzb3VyY2VTZXQjZ2V0UGVyc2lzdGVuY2VUeXBlKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFBlcnNpc3RlbmNlVHlwZSgpIHsKLQkJcmV0dXJuIFNlcnZpY2VzLlhNSV9QRVJTSVNURU5DRV9UWVBFOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLklMaWJyYXJ5UmVzb3VyY2VTZXQjdW5sb2FkKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KQotCSAqLwotCXB1YmxpYyBib29sZWFuIHVubG9hZChFT2JqZWN0IG9iamVjdCkgewotCQlSZXNvdXJjZSByZXNvdXJjZSA9IG9iamVjdC5lUmVzb3VyY2UoKTsKLQkJaWYocmVzb3VyY2UgaW5zdGFuY2VvZiBNdWx0aUZpbGVYTUlSZXNvdXJjZUltcGwpIHsKLQkJCSgoTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsKXJlc291cmNlKS51bmxvYWRlZCgoSW50ZXJuYWxFT2JqZWN0KSBvYmplY3QpOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0JCQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UuSUxpYnJhcnlSZXNvdXJjZVNldCNyZWxvYWRPYmplY3RzKGphdmEudXRpbC5Db2xsZWN0aW9uKQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIHJlbG9hZE9iamVjdHMoQ29sbGVjdGlvbiBvYmplY3RzKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFJlc291cmNlIGdldFJlc291cmNlKElSZXNvdXJjZSB3c1JlcykgewotCQlJUGF0aCBwYXRoID0gd3NSZXMuZ2V0TG9jYXRpb24oKTsKLQkJcmV0dXJuIHBhdGggIT0gbnVsbCA/IFBlcnNpc3RlbmNlVXRpbC5nZXRSZXNvdXJjZShwYXRoLCB0aGlzKSA6IG51bGw7Ci0JfQotCi0vLwlwdWJsaWMgQ29sbGVjdGlvbjxSZXNvdXJjZT4gZ2V0Q29udGFpbmVkUmVzb3VyY2VzKElSZXNvdXJjZSB3c1JlcykgewotLy8JCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwkJCi0vLwl9Ci0JCi0JcHVibGljIENvbGxlY3Rpb248UmVzb3VyY2U+IGxvYWROZXdSZXNvdXJjZXMoKSB7Ci0JCXJldHVybiBsb2FkQ29uZmlndXJhdGlvbnMoKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgaGFuZGxlTGlicmFyeU1vdmVkKFN0cmluZyBuZXdGb2xkZXIpIHsKLQkJUGVyc2lzdGVuY2VVdGlsLnJlcGxhY2VVUklQcmVmaXgobmV3IEFycmF5TGlzdDxSZXNvdXJjZT4oZ2V0UmVzb3VyY2VzKCkpLCBsaWJGb2xkZXJQYXRoLnRvT1NTdHJpbmcoKSwgbmV3Rm9sZGVyKTsKLQkJCi0JCS8vIGNsZWFyIGNhY2hlZCByZXNvbHZlZCBVUkkgaW4gYWxsIFJlc291cmNlRGVzY3JpcHRvcnMKLQkJLy8KLQkJUmVzb3VyY2VNYW5hZ2VyIHJlc01nciA9IGdldFJvb3RSZXNvdXJjZU1hbmFnZXIoKTsKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBuZXcgQWJzdHJhY3RUcmVlSXRlcmF0b3IocmVzTWdyLCBmYWxzZSkgewotCQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkJCXByb3RlY3RlZCBJdGVyYXRvciBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJUmVzb3VyY2VNYW5hZ2VyIHJlc01nciA9IChSZXNvdXJjZU1hbmFnZXIpIG9iamVjdDsKLQkJCQlyZXR1cm4gcmVzTWdyLmdldFN1Yk1hbmFnZXJzKCkuaXRlcmF0b3IoKTsKLQkJCX0KLQotCQl9OwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlSZXNvdXJjZU1hbmFnZXIgbWdyID0gKFJlc291cmNlTWFuYWdlcikgaXRlcmF0b3IubmV4dCgpOwotCQkJZm9yKFJlc291cmNlRGVzY3JpcHRvciByZXNEZXNjIDogbWdyLmdldFJlc291cmNlRGVzY3JpcHRvcnMoKSkgewotCQkJCXJlc0Rlc2MuY2xlYXJSZXNvbHZlZFVSSSgpOwotCQkJfQotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvTXVsdGlGaWxlU2F2ZVV0aWwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvTXVsdGlGaWxlU2F2ZVV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWM4NjMyZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL011bHRpRmlsZVNhdmVVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjcwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZTsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVGaWx0ZXI7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLkNvbW1vblBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQWJzdHJhY3RUcmVlSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkJhc2ljRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuaW1wbC5YTUlSZXNvdXJjZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5TdHJVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLklMaWJyYXJ5UmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UuTGlicmFyeVJlc291cmNlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5yZWZyZXNoLlJlZnJlc2hKb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLnV0aWwuUGVyc2lzdGVuY2VSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLnV0aWwuUGVyc2lzdGVuY2VVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuUmVzb3VyY2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuUmVzb3VyY2VNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuUmVzb3VyY2VtYW5hZ2VyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VydmljZXMuSUxpYnJhcnlQZXJzaXN0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DYXBhYmlsaXR5UGF0dGVybjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJ5UHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUuaW1wbC5NdWx0aVJlc291cmNlRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi1pbXBvcnQgY29tLmlibS5pY3UudGV4dC5TaW1wbGVEYXRlRm9ybWF0OwotaW1wb3J0IGNvbS5pYm0uaWN1LnV0aWwuQ2FsZW5kYXI7Ci0KLS8qKgotICogVXRpbGl0eSBjbGFzcyB3aXRoIHN0YXRpYyByb3V0aW5lcyBmb3IgWE1JIHBlcnNpc3RlbmNlCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgTXVsdGlGaWxlU2F2ZVV0aWwgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9NT0RFTF9GSUxFTkFNRSA9ICJtb2RlbC54bWkiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0NPTlRFTlRfRklMRU5BTUUgPSAiY29udGVudC54bWkiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0xJQlJBUllfTU9ERUxfRklMRU5BTUUgPSAibGlicmFyeS54bWkiOyAvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9QTFVHSU5fRVhQT1JUX0ZJTEVOQU1FID0gImV4cG9ydC54bWkiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX1BMVUdJTl9NT0RFTF9GSUxFTkFNRSA9ICJwbHVnaW4ueG1pIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9GSUxFX0VYVEVOU0lPTiA9ICIueG1pIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTElCUkFSWV9GSUxFX0VYVEVOU0lPTiA9ICJ1bWEiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDQVBBQklMSVRZX1BBVFRFUk5fUEFUSCA9ICJjYXBhYmlsaXR5cGF0dGVybnMiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUxJVkVSWV9QUk9DRVNTX1BBVEggPSAiZGVsaXZlcnlwcm9jZXNzZXMiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9DRVNTX0NPTlRSSUJVVElPTl9QQVRIID0gInByb2Nlc3Njb250cmlidXRpb25zIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVUSE9EX0NPTkZJR1VSQVRJT05fRk9MREVSX05BTUUgPSAiY29uZmlndXJhdGlvbnMiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUcgPSBQZXJzaXN0ZW5jZVBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCS5pc0RlYnVnZ2luZygpOwotCi0Jc3RhdGljIGZpbmFsIGJvb2xlYW4gUFJPRklMRSA9IGZhbHNlOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU2ltcGxlRGF0ZUZvcm1hdCBkYXRlRm9ybWF0dGVyID0gbmV3IFNpbXBsZURhdGVGb3JtYXQoCi0JCQkieXlNTWRkSEhtbXNzLlMiKTsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzVmFsaWRGaWxlTmFtZShTdHJpbmcgbmFtZSkgewotCQlpZiAobmFtZSA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAobmFtZS5pbmRleE9mKCcvJykgIT0gLTEgfHwgbmFtZS5pbmRleE9mKCdcXCcpICE9IC0xCi0JCQkJfHwgbmFtZS5pbmRleE9mKCc6JykgIT0gLTEgfHwgbmFtZS5pbmRleE9mKCcqJykgIT0gLTEKLQkJCQl8fCBuYW1lLmluZGV4T2YoJz8nKSAhPSAtMSB8fCBuYW1lLmluZGV4T2YoJyInKSAhPSAtMQotCQkJCXx8IG5hbWUuaW5kZXhPZignPCcpICE9IC0xIHx8IG5hbWUuaW5kZXhPZignPicpICE9IC0xCi0JCQkJfHwgbmFtZS5pbmRleE9mKCd8JykgIT0gLTEpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFBhdGgoTWV0aG9kRWxlbWVudCBlKSB7Ci0JCVN0cmluZ0J1ZmZlciBzdHJCdWZmID0gbmV3IFN0cmluZ0J1ZmZlcihTdHJpbmcudmFsdWVPZihlLmdldE5hbWUoKSkpOwotCQlmb3IgKGUgPSAoTWV0aG9kRWxlbWVudCkgKChFT2JqZWN0KSBlKS5lQ29udGFpbmVyKCk7IGUgIT0gbnVsbDsgZSA9IChNZXRob2RFbGVtZW50KSAoKEVPYmplY3QpIGUpCi0JCQkJLmVDb250YWluZXIoKSkgewotCQkJc3RyQnVmZi5pbnNlcnQoMCwgU3RyaW5nLnZhbHVlT2YoZS5nZXROYW1lKCkpICsgIiA+ICIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIHN0ckJ1ZmYudG9TdHJpbmcoKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjcmVhdGVEaXJOYW1lKE1ldGhvZEVsZW1lbnQgb2JqKSB7Ci0JCVN0cmluZyBuYW1lID0gKChNZXRob2RFbGVtZW50KSBvYmopLmdldE5hbWUoKTsKLQkJaWYgKGlzVmFsaWRGaWxlTmFtZShuYW1lKSkKLQkJCXJldHVybiBuYW1lOwotCQl0aHJvdyBuZXcgTXVsdGlGaWxlSU9FeGNlcHRpb24oTkxTLmJpbmQoCi0JCQkJUGVyc2lzdGVuY2VSZXNvdXJjZXMuaW52YWxpZE5hbWVFcnJvcl9tc2csIG5hbWUpLCBvYmopOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgRU9iamVjdCByZXNvbHZlKEVPYmplY3QgcHJveHkpIHsKLQkJaWYgKCEocHJveHkgaW5zdGFuY2VvZiBJbnRlcm5hbEVPYmplY3QpKQotCQkJcmV0dXJuIHByb3h5OwotCQlJbnRlcm5hbEVPYmplY3Qgb2JqID0gKEludGVybmFsRU9iamVjdCkgcHJveHk7Ci0JCWlmIChvYmouZVByb3h5VVJJKCkgPT0gbnVsbCkKLQkJCXJldHVybiBwcm94eTsKLQkJWE1JUmVzb3VyY2VJbXBsIHJlcyA9IG5ldyBYTUlSZXNvdXJjZUltcGwob2JqLmVQcm94eVVSSSgpKTsKLQkJdHJ5IHsKLQkJCXJlcy5sb2FkKG51bGwpOwotCQkJcmV0dXJuIFBlcnNpc3RlbmNlVXRpbC5nZXRNZXRob2RFbGVtZW50KHJlcyk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQkJcmV0dXJuIHByb3h5OwotCX0KLQotCXN0YXRpYyBSZXNvdXJjZSBzYXZlKEVPYmplY3QgbywgVVJJIHVyaSwgTWFwIG9wdGlvbnMpIHsKLQkJUmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQgPSBvLmVSZXNvdXJjZSgpLmdldFJlc291cmNlU2V0KCk7Ci0JCU11bHRpRmlsZVhNSVJlc291cmNlSW1wbCByZXNvdXJjZSA9IHNhdmUocmVzb3VyY2VTZXQsIG8sIHVyaSwgb3B0aW9ucyk7Ci0KLQkJaWYgKG9wdGlvbnMgPT0gbnVsbCkgewotCQkJb3B0aW9ucyA9ICgoTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsKSByZXNvdXJjZVNldCkKLQkJCQkJLmdldERlZmF1bHRTYXZlT3B0aW9ucygpOwotCQl9Ci0JCVN0cmluZyBzdHIgPSAoU3RyaW5nKSBvcHRpb25zCi0JCQkJLmdldChNdWx0aUZpbGVYTUlTYXZlSW1wbC5SRUZSRVNIX05FV19SRVNPVVJDRSk7Ci0JCWlmIChzdHIgIT0gbnVsbCAmJiBCb29sZWFuLnZhbHVlT2Yoc3RyKS5ib29sZWFuVmFsdWUoKSkgewotCQkJLy8gbm90aWZ5IFJlZnJlc2hKb2IgdGhlIHRoaXMgcmVzb3VyY2UgaXMgc2F2ZWQgc28gaXQgd2lsbCBub3QgYmUKLQkJCS8vIHJlbG9hZGVkIGFmdGVyIHJlZnJlc2hpbmcgaXQKLQkJCS8vCi0JCQlSZWZyZXNoSm9iLmdldEluc3RhbmNlKCkucmVzb3VyY2VTYXZlZChyZXNvdXJjZSk7Ci0KLQkJCS8vIHJlZnJlc2ggdGhlIG5ld2x5IGNyZWF0ZWQgcmVzb3VyY2Ugc28gaXQgaXMgaW4gc3luY2ggd2l0aCB0aGUKLQkJCS8vIHdvcmtzcGFjZQotCQkJLy8KLQkJCUZpbGVNYW5hZ2VyLmdldEluc3RhbmNlKCkucmVmcmVzaChyZXNvdXJjZSk7Ci0JCX0KLQotCQlyZXR1cm4gcmVzb3VyY2U7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNhblNhdmVUb2dldGhlcihNYXAgb3B0aW9ucywgT2JqZWN0IG9iaikgewotCQlTZXQgc2F2ZVRvZ2V0aGVyQ2xhc3NlcyA9IChTZXQpIG9wdGlvbnMKLQkJCQkuZ2V0KE11bHRpRmlsZVhNSVNhdmVJbXBsLlNBVkVfVE9HRVRIRVJfQ0xBU1NfU0VUKTsKLQkJaWYgKHNhdmVUb2dldGhlckNsYXNzZXMgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gc2F2ZVRvZ2V0aGVyQ2xhc3Nlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCUVDbGFzcyBlQ2xzID0gKEVDbGFzcykgaXRlci5uZXh0KCk7Ci0JCQlpZiAoZUNscy5pc0luc3RhbmNlKG9iaikpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEFkZHMgdGhlIGdpdmVuIG9iamVjdCB0byB0aGUgZ2l2ZW4gcmVzb3VyY2Ugd2hpbGUgc3RpbGwgcHJlc2VydmluZwotCSAqIG9iamVjdCdzIGNvbnRhaW5lciByZWZlcmVuY2UuCi0JICogCi0JICogQHBhcmFtIHJlc291cmNlCi0JICogQHBhcmFtIG8KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGFkZFRvKFJlc291cmNlIHJlc291cmNlLCBNdWx0aVJlc291cmNlRU9iamVjdCBvKSB7Ci0JCUJhc2ljRUxpc3QgY29udGVudHMgPSAoKEJhc2ljRUxpc3QpIHJlc291cmNlLmdldENvbnRlbnRzKCkpOwotCQlpZiAoY29udGVudHMuaXNFbXB0eSgpKSB7Ci0JCQkvLyB0aGlzIHdpbGwgZmxhZyByZXNvdXJjZSBhcyBsb2FkZWQKLQkJCS8vCi0JCQljb250ZW50cy5jbGVhcigpOwotCi0JCQljb250ZW50cy5zZXREYXRhKDEsIG5ldyBPYmplY3RbXSB7IG8gfSk7Ci0JCX0gZWxzZSB7Ci0JCQlPYmplY3RbXSBkYXRhID0gY29udGVudHMudG9BcnJheSgpOwotCQkJT2JqZWN0W10gbmV3RGF0YSA9IG5ldyBPYmplY3RbZGF0YS5sZW5ndGggKyAxXTsKLQkJCVN5c3RlbS5hcnJheWNvcHkoZGF0YSwgMCwgbmV3RGF0YSwgMCwgZGF0YS5sZW5ndGgpOwotCQkJbmV3RGF0YVtkYXRhLmxlbmd0aF0gPSBvOwotCQkJY29udGVudHMuc2V0RGF0YShuZXdEYXRhLmxlbmd0aCwgbmV3RGF0YSk7Ci0JCX0KLQkJby5lU2V0UmVzb3VyY2UoKFJlc291cmNlLkludGVybmFsKSByZXNvdXJjZSk7Ci0JfQotCi0JLyoqCi0JICogU2F2ZXMgYSBuZXcgY29udGFpbmVkIEVPYmplY3QgaW4gaXRzIG93biBuZXcgcmVzb3VyY2UuCi0JICogCi0JICogQHBhcmFtIG8KLQkgKiBAcGFyYW0gdXJpCi0JICogQHBhcmFtIG9wdGlvbnMKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBNdWx0aUZpbGVYTUlSZXNvdXJjZUltcGwgc2F2ZShSZXNvdXJjZVNldCByZXNvdXJjZVNldCwKLQkJCUVPYmplY3QgbywgVVJJIHVyaSwgTWFwIG9wdGlvbnMpIHsKLQkJcmV0dXJuIHNhdmUocmVzb3VyY2VTZXQsIG8sIHVyaSwgb3B0aW9ucywgdHJ1ZSk7Ci0JfQotCQotCXN0YXRpYyBNdWx0aUZpbGVYTUlSZXNvdXJjZUltcGwgc2F2ZShSZXNvdXJjZVNldCByZXNvdXJjZVNldCwKLQkJCUVPYmplY3QgbywgVVJJIHVyaSwgTWFwIG9wdGlvbnMsIGJvb2xlYW4gcmVnaXN0ZXJXaXRoUmVzb3VyY2VNYW5hZ2VyKSB7Ci0JCS8vIERldGFjaCB0aGUgb2JqZWN0IGZyb20gY29udGFpbmVyIHJlc291cmNlCi0JCS8vCi0JCU11bHRpUmVzb3VyY2VFT2JqZWN0IG1yRU9iaiA9IChNdWx0aVJlc291cmNlRU9iamVjdCkgbzsKLQkJTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsIGN1cnJlbnRSZXNvdXJjZSA9IChNdWx0aUZpbGVYTUlSZXNvdXJjZUltcGwpIG8KLQkJCQkuZVJlc291cmNlKCk7Ci0KLQkJaWYgKGN1cnJlbnRSZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQljdXJyZW50UmVzb3VyY2UuZGV0YWNoZWQobyk7Ci0JCX0KLQotCQlMaXN0IG5ld1Jlc291cmNlRGVzY3JpcHRvcnMgPSBudWxsOwotCQlTZXQgbW9kaWZpZWRSZXNvdXJjZXMgPSAoU2V0KSBvcHRpb25zCi0JCQkJLmdldChNdWx0aUZpbGVYTUlTYXZlSW1wbC5NT0RJRklFRF9SRVNPVVJDRV9TRVQpOwotCi0JCU11bHRpRmlsZVhNSVJlc291cmNlSW1wbCByZXMgPSBudWxsOwotCQlpZiAoY2FuU2F2ZVRvZ2V0aGVyKG9wdGlvbnMsIG8pKSB7Ci0JCQlNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwgbWZSZXNvdXJjZVNldCA9ICgoTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsKSByZXNvdXJjZVNldCk7Ci0KLQkJCS8vIGlmIHRoZSB1cmkgaGFzIGEgdGVtcG9yYXJ5IFVSSSwgdXNlIGl0IGluc3RlYWQgdG8gbG9jYXRlIHRoZQotCQkJLy8gcmVzb3VyY2UgdGhhdCBpcyBpbiBwcm9jZXNzIG9mIHNhdmluZwotCQkJLy8KLQkJCVVSSSB0ZW1wVVJJID0gKFVSSSkgbWZSZXNvdXJjZVNldC5nZXRVUklUb1RlbXBVUklNYXAoKS5nZXQodXJpKTsKLQkJCWlmICh0ZW1wVVJJICE9IG51bGwpIHsKLQkJCQl1cmkgPSB0ZW1wVVJJOwotCQkJfQotCi0JCQlyZXMgPSAoTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsKSBtZlJlc291cmNlU2V0LmdldFJlc291cmNlKHVyaSk7Ci0JCQlpZiAocmVzICE9IG51bGwpIHsKLQkJCQlpZiAoIXJlcy5nZXRDb250ZW50cygpLmNvbnRhaW5zKG8pKSB7Ci0JCQkJCWlmIChyZXMuZ2V0RmluYWxVUkkoKSA9PSByZXMuZ2V0VVJJKCkpIHsKLQkJCQkJCWlmIChNdWx0aUZpbGVYTUlTYXZlSW1wbC5jaGVja01vZGlmeVJlcXVpcmVkKG9wdGlvbnMpKSB7Ci0JCQkJCQkJLy8gbm90IGEgdGVtcCBmaWxlIG9mIGZhaWwtc2FmZSBwZXJzaXN0ZW5jZQotCQkJCQkJCS8vIHRyYW5zYWN0aW9uCi0JCQkJCQkJLy8gY2hlY2sgZm9yIHdyaXRlYWJsZQotCQkJCQkJCS8vCi0JCQkJCQkJTXVsdGlGaWxlU2F2ZVV0aWwuY2hlY2tNb2RpZnkocmVzKTsKLQkJCQkJCX0KLQkJCQkJfQotCi0JCQkJCWFkZFRvKHJlcywgbXJFT2JqKTsKLQotCQkJCQlSZXNvdXJjZURlc2NyaXB0b3IgZGVzYyA9IG51bGw7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlpZihyZWdpc3RlcldpdGhSZXNvdXJjZU1hbmFnZXIpIHsKLQkJCQkJCQkvLyByZWdpc3RlciB0aGlzIG5ldyBvYmplY3Qgd2l0aCBSZXNvdXJjZU1hbmFnZXIKLQkJCQkJCQkvLwotCQkJCQkJCVJlc291cmNlTWFuYWdlciByZXNNZ3IgPSBnZXRSZXNvdXJjZU1hbmFnZXJGb3IobywKLQkJCQkJCQkJCW1vZGlmaWVkUmVzb3VyY2VzKTsKLQkJCQkJCQlkZXNjID0gcmVnaXN0ZXJXaXRoUmVzb3VyY2VNYW5hZ2VyKHJlc01nciwgbywgcmVzCi0JCQkJCQkJCQkuZ2V0RmluYWxVUkkoKSk7Ci0JCQkJCQkJaWYgKGRlc2MgIT0gbnVsbCAmJiBtb2RpZmllZFJlc291cmNlcyAhPSBudWxsKSB7Ci0JCQkJCQkJCW1vZGlmaWVkUmVzb3VyY2VzLmFkZChyZXNNZ3IuZVJlc291cmNlKCkpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQotCQkJCQkJcmVzLnNldE1vZGlmaWVkKHRydWUpOwotCQkJCQkJbWZSZXNvdXJjZVNldC5zYXZlKHJlcywgb3B0aW9ucywgZmFsc2UpOwotCi0JCQkJCQlyZXMuYXR0YWNoZWRBbGwobyk7Ci0JCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkvLyByb2xsYmFjawotCQkJCQkJLy8KLQotCQkJCQkJLy8gcmVtb3ZlIHRoaXMgb2JqZWN0IGZyb20gdGhlIHJlc291cmNlCi0JCQkJCQlyZXMuZ2V0Q29udGVudHMoKS5yZW1vdmUobXJFT2JqKTsKLQkJCQkJCW1yRU9iai5lU2V0UmVzb3VyY2UoKFJlc291cmNlLkludGVybmFsKSBudWxsKTsKLQotCQkJCQkJLy8gcmVtb3ZlIHRoZSBjcmVhdGVkIFJlc291cmNlRGVzY3JpcHRvcgotCQkJCQkJaWYgKGRlc2MgIT0gbnVsbCkgewotCQkJCQkJCUVjb3JlVXRpbC5yZW1vdmUoZGVzYyk7Ci0JCQkJCQl9Ci0KLQkJCQkJCS8vIHJlLWF0dGFjaCB0byBjb250YWluZXIgcmVzb3VyY2UKLQkJCQkJCWlmIChjdXJyZW50UmVzb3VyY2UgIT0gbnVsbCkgewotCQkJCQkJCWN1cnJlbnRSZXNvdXJjZS5hdHRhY2hlZChvKTsKLQkJCQkJCX0KLQotCQkJCQkJdGhyb3cgbmV3IE11bHRpRmlsZUlPRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlyZXR1cm4gcmVzOwotCQkJfQotCQl9Ci0KLQkJcmVzID0gKE11bHRpRmlsZVhNSVJlc291cmNlSW1wbCkgcmVzb3VyY2VTZXQuY3JlYXRlUmVzb3VyY2UodXJpKTsKLQkJYWRkVG8ocmVzLCBtckVPYmopOwotCQlpZihtckVPYmogaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pIHsKLQkJCWFkZFJlc291cmNlTWFuYWdlcihyZXMpOwotCQl9Ci0KLQkJTWFwIG9ialRvQ29udGFpbmVyTWFwID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWlmKHJlZ2lzdGVyV2l0aFJlc291cmNlTWFuYWdlcikgewotCQkJCW5ld1Jlc291cmNlRGVzY3JpcHRvcnMgPSByZWdpc3RlcldpdGhSZXNvdXJjZU1hbmFnZXIocmVzLAotCQkJCQltb2RpZmllZFJlc291cmNlcyk7Ci0JCQl9Ci0KLQkJCS8vIGJhY2sgdXAgdGhlIGNvbnRhaW5lciByZWZlcmVuY2VzIGFuZCBzZXQgY29udGVudCBvYmplY3QncwotCQkJLy8gY29udGFpbmVyIHRvIG51bGwKLQkJCS8vCi0JCQlvYmpUb0NvbnRhaW5lck1hcCA9IHJlbW92ZUNvbnRhaW5lcnMocmVzKTsKLQotCQkJcmVzLnNhdmUob3B0aW9ucyk7Ci0KLQkJCXJlcy5hdHRhY2hlZEFsbChvKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCUNvbW1vblBsdWdpbi5JTlNUQU5DRS5sb2coZSk7Ci0KLQkJCS8vIHJvbGxiYWNrCi0JCQkvLwotCi0JCQkvLyByZW1vdmUgdGhlIGZhaWxlZCByZW91c3JjZSBmcm9tIHRoZSByZXNvdXJjZSBzZXQKLQkJCXJlc291cmNlU2V0LmdldFJlc291cmNlcygpLnJlbW92ZShyZXMpOwotCQkJbXJFT2JqLmVTZXRSZXNvdXJjZSgoUmVzb3VyY2UuSW50ZXJuYWwpIG51bGwpOwotCi0JCQkvLyByZW1vdmUgdGhlIGNyZWF0ZWQgUmVzb3VyY2VEZXNjcmlwdG9ycwotCQkJaWYobmV3UmVzb3VyY2VEZXNjcmlwdG9ycyAhPSBudWxsICYmICFuZXdSZXNvdXJjZURlc2NyaXB0b3JzLmlzRW1wdHkoKSkgewotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IG5ld1Jlc291cmNlRGVzY3JpcHRvcnMuaXRlcmF0b3IoKTsgaXRlcgotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCUVjb3JlVXRpbC5yZW1vdmUoKEVPYmplY3QpIGl0ZXIubmV4dCgpKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCS8vIHJlLWF0dGFjaCB0byBjb250YWluZXIgcmVzb3VyY2UKLQkJCWlmIChjdXJyZW50UmVzb3VyY2UgIT0gbnVsbCkgewotCQkJCWN1cnJlbnRSZXNvdXJjZS5hdHRhY2hlZChvKTsKLQkJCX0KLQotCQkJdGhyb3cgbmV3IE11bHRpRmlsZUlPRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKLQkJfSBmaW5hbGx5IHsKLQkJCS8vIHJlc3RvcmUgdGhlIGNvbnRhaW5lciByZWZlcmVuY2VzIGZvciB0aGUgY29udGVudCBvYmplY3RzCi0JCQkvLwotCQkJcmVzdG9yZUNvbnRhaW5lcnMocmVzLCBvYmpUb0NvbnRhaW5lck1hcCk7Ci0JCX0KLQotCQlpZihyZWdpc3RlcldpdGhSZXNvdXJjZU1hbmFnZXIpIHsKLQkJCVJlc291cmNlTWFuYWdlciByZXNNZ3IgPSBhZGROZXdSZXNvdXJjZU1hbmFnZXIocmVzKTsKLQkJCWlmIChyZXNNZ3IgPT0gbnVsbCkgewotCQkJCWlmIChvIGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luKSB7Ci0JCQkJCS8vIGNyZWF0ZSBuZXcgUmVzb3VyY2VNYW5hZ2VyIGZvciBuZXcgTWV0aG9kUGx1Z2luCi0JCQkJCS8vCi0JCQkJCXJlc01nciA9IGdldFJlc291cmNlTWFuYWdlckZvcihvLCBtb2RpZmllZFJlc291cmNlcyk7Ci0JCQkJfQotCQkJfSBlbHNlIGlmIChtb2RpZmllZFJlc291cmNlcyAhPSBudWxsKSB7Ci0JCQkJbW9kaWZpZWRSZXNvdXJjZXMuYWRkKHJlc01nci5lQ29udGFpbmVyKCkuZVJlc291cmNlKCkpOwotCQkJfQotCQl9Ci0KLQkJcmVzLnVwZGF0ZVRpbWVTdGFtcHMoKTsKLQotCQlyZXR1cm4gcmVzOwotCX0KLQotCXByaXZhdGUgc3RhdGljIE1hcCByZW1vdmVDb250YWluZXJzKFJlc291cmNlIHJlc291cmNlKSB7Ci0JCWludCBzaXplID0gcmVzb3VyY2UuZ2V0Q29udGVudHMoKS5zaXplKCk7Ci0JCU1hcCBvYmpUb0NvbnRhaW5lck1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlNdWx0aVJlc291cmNlRU9iamVjdCBtdWx0aVJlc0VPYmogPSAoTXVsdGlSZXNvdXJjZUVPYmplY3QpIHJlc291cmNlCi0JCQkJCS5nZXRDb250ZW50cygpLmdldChpKTsKLQkJCUludGVybmFsRU9iamVjdCBjb250YWluZXIgPSAoSW50ZXJuYWxFT2JqZWN0KSBtdWx0aVJlc0VPYmoKLQkJCQkJLmVDb250YWluZXIoKTsKLQkJCWlmIChjb250YWluZXIgIT0gbnVsbCkgewotCQkJCW9ialRvQ29udGFpbmVyTWFwLnB1dChtdWx0aVJlc0VPYmosIGNvbnRhaW5lcik7Ci0JCQkJbXVsdGlSZXNFT2JqLmVCYXNpY1NldENvbnRhaW5lcihudWxsLCBtdWx0aVJlc0VPYmoKLQkJCQkJCS5lQ29udGFpbmVyRmVhdHVyZUlEKCkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBvYmpUb0NvbnRhaW5lck1hcDsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBjb250YWluZXJzIG9mIG9iamVjdHMgaW4gcmVzb3VyY2UncyBjb250ZW50cwotCSAqIAotCSAqIEBwYXJhbSByZXNvdXJjZQotCSAqIEByZXR1cm4gbWFwIG9mIG9iamVjdCB0byBjb250YWluZXIgZW50cmllcwotCSAqLwotCXN0YXRpYyBNYXAgZ2V0Q29udGFpbmVycyhSZXNvdXJjZSByZXNvdXJjZSkgewotCQlpbnQgc2l6ZSA9IHJlc291cmNlLmdldENvbnRlbnRzKCkuc2l6ZSgpOwotCQlNYXAgb2JqVG9Db250YWluZXJNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJTXVsdGlSZXNvdXJjZUVPYmplY3QgbXVsdGlSZXNFT2JqID0gKE11bHRpUmVzb3VyY2VFT2JqZWN0KSByZXNvdXJjZQotCQkJCQkuZ2V0Q29udGVudHMoKS5nZXQoaSk7Ci0JCQlJbnRlcm5hbEVPYmplY3QgY29udGFpbmVyID0gKEludGVybmFsRU9iamVjdCkgbXVsdGlSZXNFT2JqCi0JCQkJCS5lQ29udGFpbmVyKCk7Ci0JCQlpZiAoY29udGFpbmVyICE9IG51bGwpIHsKLQkJCQlvYmpUb0NvbnRhaW5lck1hcC5wdXQobXVsdGlSZXNFT2JqLCBjb250YWluZXIpOwotCQkJfQotCQl9Ci0JCXJldHVybiBvYmpUb0NvbnRhaW5lck1hcDsKLQotCX0KLQotCS8qKgotCSAqIFJlc3RvcmVzIHRoZSBjb250YWluZXJzIG9mIHRoZSBvYmplY3RzIGluIHJlc291cmNlJ3MgY29udGVudHMgdGhhdAotCSAqIHByZXZpb3VzbHkgc2F2ZWQgaW4gYSBtYXAgcmV0dXJuZWQgZnJvbSBnZXRDb250YWluZXJzKFJlc291cmNlIHJlc291cmNlKQotCSAqIG9yIHJlbW92ZUNvbnRhaW5lcnMoUmVzb3VyY2UgcmVzb3VyY2UpCi0JICogCi0JICogQHBhcmFtIHJlc291cmNlCi0JICogQHBhcmFtIG9ialRvQ29udGFpbmVyTWFwCi0JICogQHNlZSAjZ2V0Q29udGFpbmVycyhSZXNvdXJjZSkKLQkgKiBAc2VlICNyZW1vdmVDb250YWluZXJzKFJlc291cmNlKQotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgcmVzdG9yZUNvbnRhaW5lcnMoUmVzb3VyY2UgcmVzb3VyY2UsCi0JCQlNYXAgb2JqVG9Db250YWluZXJNYXApIHsKLQkJaW50IHNpemUgPSByZXNvdXJjZS5nZXRDb250ZW50cygpLnNpemUoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCU11bHRpUmVzb3VyY2VFT2JqZWN0IG11bHRpUmVzRU9iaiA9IChNdWx0aVJlc291cmNlRU9iamVjdCkgcmVzb3VyY2UKLQkJCQkJLmdldENvbnRlbnRzKCkuZ2V0KGkpOwotCQkJSW50ZXJuYWxFT2JqZWN0IGNvbnRhaW5lciA9IChJbnRlcm5hbEVPYmplY3QpIG9ialRvQ29udGFpbmVyTWFwCi0JCQkJCS5nZXQobXVsdGlSZXNFT2JqKTsKLQkJCWlmIChjb250YWluZXIgIT0gbnVsbCkgewotCQkJCW11bHRpUmVzRU9iai5lQmFzaWNTZXRDb250YWluZXIoY29udGFpbmVyLCBtdWx0aVJlc0VPYmoKLQkJCQkJCS5lQ29udGFpbmVyRmVhdHVyZUlEKCkpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGNoZWNrTW9kaWZ5KFJlc291cmNlIHJlc291cmNlKSB7Ci0JCWNoZWNrTW9kaWZ5KENvbGxlY3Rpb25zLnNpbmdsZXRvbihyZXNvdXJjZSkpOwotCX0KLQotCXN0YXRpYyB2b2lkIGRvQ2hlY2tNb2RpZnkoQ29sbGVjdGlvbjxSZXNvdXJjZT4gcmVzb3VyY2VzKSB7Ci0JCUFycmF5TGlzdDxTdHJpbmc+IHBhdGhMaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHJlc291cmNlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCVJlc291cmNlIHJlc291cmNlID0gKFJlc291cmNlKSBpdGVyLm5leHQoKTsKLQkJCS8vIHNraXAgY2hlY2tpbmcgb24gcmVzb3VyY2UgdGhhdCBpcyBjdXJyZW50bHkgYmVpbmcgc2F2ZWQgdG8gYSB0ZW1wb3JhcnkKLQkJCS8vIGZpbGUKLQkJCS8vCi0JCQlpZihyZXNvdXJjZSBpbnN0YW5jZW9mIE11bHRpRmlsZVhNSVJlc291cmNlSW1wbCAmJiAoKE11bHRpRmlsZVhNSVJlc291cmNlSW1wbClyZXNvdXJjZSkuaGFzVGVtcFVSSSgpKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlwYXRoTGlzdC5hZGQoRmlsZU1hbmFnZXIudG9GaWxlU3RyaW5nKHJlc291cmNlLmdldFVSSSgpKSk7Ci0JCX0KLQkJaWYoIXBhdGhMaXN0LmlzRW1wdHkoKSkgewotCQkJU3RyaW5nW10gcGF0aHMgPSBuZXcgU3RyaW5nW3BhdGhMaXN0LnNpemUoKV07Ci0JCQlwYXRoTGlzdC50b0FycmF5KHBhdGhzKTsKLQkJCUlTdGF0dXMgc3RhdHVzID0gRmlsZU1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5jaGVja01vZGlmeShwYXRocywKLQkJCQkJUGVyc2lzdGVuY2VQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldENvbnRleHQoKS8qTXNnQm94LmdldERlZmF1bHRTaGVsbCgpKi8pOwotCQkJaWYgKCFzdGF0dXMuaXNPSygpKSB7Ci0JCQkJU3RyaW5nIG1zZyA9IFVtYVV0aWwuZ2V0TWVzc2FnZShzdGF0dXMpOwotCQkJCWlmIChtc2cgPT0gbnVsbCkgewotCQkJCQltc2cgPSBOTFMuYmluZChQZXJzaXN0ZW5jZVJlc291cmNlcy5tb2RpZnlGaWxlRXJyb3JfbXNnLCBBcnJheXMKLQkJCQkJCQkuYXNMaXN0KHBhdGhzKSk7Ci0JCQkJfQotCQkJCXRocm93IG5ldyBNdWx0aUZpbGVJT0V4Y2VwdGlvbihtc2cpOwotCQkJfQotCQl9Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBjaGVja01vZGlmeShDb2xsZWN0aW9uPFJlc291cmNlPiByZXNvdXJjZXMpIHsKLQkJTWFwPElMaWJyYXJ5UmVzb3VyY2VTZXQsIENvbGxlY3Rpb248UmVzb3VyY2U+PiBsaWJSZXNvdXJjZVNldFRvUmVzb3VyY2VzTWFwID0gbmV3IEhhc2hNYXA8SUxpYnJhcnlSZXNvdXJjZVNldCwgQ29sbGVjdGlvbjxSZXNvdXJjZT4+KCk7Ci0JCUNvbGxlY3Rpb248UmVzb3VyY2U+IG90aGVyUmVzb3VyY2VzID0gbmV3IEFycmF5TGlzdDxSZXNvdXJjZT4oKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gcmVzb3VyY2VzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSAoUmVzb3VyY2UpIGl0ZXIubmV4dCgpOwotCQkJUmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQgPSByZXNvdXJjZS5nZXRSZXNvdXJjZVNldCgpOwotCQkJaWYocmVzb3VyY2VTZXQgaW5zdGFuY2VvZiBJTGlicmFyeVJlc291cmNlU2V0KSB7Ci0JCQkJQ29sbGVjdGlvbjxSZXNvdXJjZT4gY29sbGVjdGlvbiA9IGxpYlJlc291cmNlU2V0VG9SZXNvdXJjZXNNYXAuZ2V0KHJlc291cmNlU2V0KTsKLQkJCQlpZihjb2xsZWN0aW9uID09IG51bGwpIHsKLQkJCQkJY29sbGVjdGlvbiA9IG5ldyBBcnJheUxpc3Q8UmVzb3VyY2U+KCk7Ci0JCQkJCWxpYlJlc291cmNlU2V0VG9SZXNvdXJjZXNNYXAucHV0KChJTGlicmFyeVJlc291cmNlU2V0KSByZXNvdXJjZVNldCwgY29sbGVjdGlvbik7CQkJCQkKLQkJCQl9Ci0JCQkJY29sbGVjdGlvbi5hZGQocmVzb3VyY2UpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJb3RoZXJSZXNvdXJjZXMuYWRkKHJlc291cmNlKTsKLQkJCX0KLQkJfQotCQlpZighbGliUmVzb3VyY2VTZXRUb1Jlc291cmNlc01hcC5pc0VtcHR5KCkpIHsKLQkJCWZvciAoSXRlcmF0b3I8TWFwLkVudHJ5PElMaWJyYXJ5UmVzb3VyY2VTZXQsIENvbGxlY3Rpb248UmVzb3VyY2U+Pj4gaXRlciA9IGxpYlJlc291cmNlU2V0VG9SZXNvdXJjZXNNYXAuZW50cnlTZXQoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlNYXAuRW50cnk8SUxpYnJhcnlSZXNvdXJjZVNldCwgQ29sbGVjdGlvbjxSZXNvdXJjZT4+IGVudHJ5ID0gaXRlci5uZXh0KCk7Ci0JCQkJSUxpYnJhcnlSZXNvdXJjZVNldCByZXNvdXJjZVNldCA9IGVudHJ5LmdldEtleSgpOwkJCQotCQkJCVJlc291cmNlW10gcmVzb3VyY2VBcnJheSA9IG5ldyBSZXNvdXJjZVtlbnRyeS5nZXRWYWx1ZSgpLnNpemUoKV07Ci0JCQkJZW50cnkuZ2V0VmFsdWUoKS50b0FycmF5KHJlc291cmNlQXJyYXkpOwotCQkJCXRyeSB7Ci0JCQkJCXJlc291cmNlU2V0LmNoZWNrTW9kaWZ5KHJlc291cmNlQXJyYXksIFBlcnNpc3RlbmNlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRDb250ZXh0KCkvKk1zZ0JveC5nZXREZWZhdWx0U2hlbGwoKSovKTsKLQkJCQl9IGNhdGNoIChMaWJyYXJ5UmVzb3VyY2VFeGNlcHRpb24gZSkgewotCQkJCQl0aHJvdyBuZXcgTXVsdGlGaWxlSU9FeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlpZighb3RoZXJSZXNvdXJjZXMuaXNFbXB0eSgpKSB7Ci0JCQlkb0NoZWNrTW9kaWZ5KG90aGVyUmVzb3VyY2VzKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgY2hlY2tPdXRPZlN5bmNoKENvbGxlY3Rpb248UmVzb3VyY2U+IHJlc291cmNlcywgTWFwIHNhdmVPcHRpb25zKSB7Ci0JCUNvbGxlY3Rpb248UmVzb3VyY2U+IHJlc291cmNlc1RvQ2hlY2tPdXRPZlN5bmNoOwotCQlDb2xsZWN0aW9uPFJlc291cmNlPiBvdmVyd3JpdGFibGVSZXNvdXJjZXMgPSAoQ29sbGVjdGlvbjxSZXNvdXJjZT4pIHNhdmVPcHRpb25zLmdldCgKLQkJCQlJTGlicmFyeVBlcnNpc3Rlci5GYWlsU2FmZU1ldGhvZExpYnJhcnlQZXJzaXN0ZXIuT1BUSU9OU19PVkVSV1JJVEFCTEVfUkVTT1VSQ0VTKTsJCQkJCi0JCWlmKG92ZXJ3cml0YWJsZVJlc291cmNlcyAhPSBudWxsICYmICFvdmVyd3JpdGFibGVSZXNvdXJjZXMuaXNFbXB0eSgpKSB7Ci0JCQlyZXNvdXJjZXNUb0NoZWNrT3V0T2ZTeW5jaCA9IG5ldyBBcnJheUxpc3Q8UmVzb3VyY2U+KHJlc291cmNlcyk7Ci0JCQlyZXNvdXJjZXNUb0NoZWNrT3V0T2ZTeW5jaC5yZW1vdmVBbGwob3ZlcndyaXRhYmxlUmVzb3VyY2VzKTsKLQkJfQotCQllbHNlIHsKLQkJCXJlc291cmNlc1RvQ2hlY2tPdXRPZlN5bmNoID0gcmVzb3VyY2VzOwotCQl9Ci0JCWlmKCFyZXNvdXJjZXNUb0NoZWNrT3V0T2ZTeW5jaC5pc0VtcHR5KCkpIHsKLQkJCWNoZWNrT3V0T2ZTeW5jaChyZXNvdXJjZXNUb0NoZWNrT3V0T2ZTeW5jaCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGNoZWNrT3V0T2ZTeW5jaChDb2xsZWN0aW9uIHJlc291cmNlcykgewotCQkvLyBjaGVjayBmb3Igb3V0LW9mLXN5bmNoCi0JCS8vCi0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHJlc291cmNlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU11bHRpRmlsZVhNSVJlc291cmNlSW1wbCByZXMgPSAoTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsKSBpdGVyCi0JCQkJCS5uZXh0KCk7Ci0JCQlpZihyZXMuaXNMb2FkZWQoKSAmJiAhcmVzLmhhc1RlbXBVUkkoKSkgewotCQkJCUZpbGUgZmlsZSA9IG5ldyBGaWxlKHJlcy5nZXRVUkkoKS50b0ZpbGVTdHJpbmcoKSk7Ci0JCQkJaWYoZmlsZS5leGlzdHMoKSkgewotLy8JCQkJCWxvbmcgbGFzdE1vZGlmaWVkID0gZmlsZS5sYXN0TW9kaWZpZWQoKTsKLS8vCQkJCQlpZiAocmVzLmdldEZpbGVMYXN0TW9kaWZpZWQoKSAhPSBsYXN0TW9kaWZpZWQgJiYgIXNhbWUobGFzdE1vZGlmaWVkLCByZXMuZ2V0RmlsZUxhc3RNb2RpZmllZCgpKSkgewotLy8JCQkJCQlTdHJpbmcgbXNnID0gTkxTLmJpbmQoCi0vLwkJCQkJCQkJUGVyc2lzdGVuY2VSZXNvdXJjZXMucmVzb3VyY2VPdXRPZlN5bmNoX21zZywgcmVzCi0vLwkJCQkJCQkJLmdldFVSSSgpLnRvRmlsZVN0cmluZygpKTsKLS8vCQkJCQkJdGhyb3cgbmV3IE11bHRpRmlsZUlPRXhjZXB0aW9uKG1zZyk7Ci0vLwkJCQkJfQotCQkJCQkKLQkJCQkJaWYoIXJlcy5pc1N5bmNocm9uaXplZCgpKSB7Ci0JCQkJCQlTdHJpbmcgbXNnID0gTkxTLmJpbmQoCi0JCQkJCQkJCVBlcnNpc3RlbmNlUmVzb3VyY2VzLnJlc291cmNlT3V0T2ZTeW5jaF9tc2csCi0JCQkJCQkJCXJlcy5nZXRVUkkoKS50b0ZpbGVTdHJpbmcoKSk7Ci0JCQkJCQl0aHJvdyBuZXcgTXVsdGlGaWxlSU9FeGNlcHRpb24obXNnKTsJCQkJCQkKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFNhdmVzIHRoZSBleGlzdGluZyBvd24gcmVzb3VyY2Ugb2YgYSBjb250YWluZWQgRU9iamVjdC4gQWRkcyByZXNvdXJjZXMKLQkgKiB0aGF0IGhhdmUgYmVlbiBtb2RpZmVkIGFmdGVyIHRoaXMgY2FsbCB0byB0aGUgTU9ESUZJRURfUkVTT1VSQ0VfU0VUIG9mCi0JICogdGhlIHNhdmUgb3B0aW9ucy4KLQkgKiAKLQkgKiBAcGFyYW0gcmVzb3VyY2UKLQkgKiBAcGFyYW0gb3B0aW9ucwotCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgZ2l2ZW4gcmVzb3VyY2UgaGFzIGJlZW4gc2F2ZWQgc3VjY2Vzc2Z1bGx5LCBmYWxzZSBvdGhlcndpc2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gc2F2ZShSZXNvdXJjZSByZXNvdXJjZSwgTWFwIG9wdGlvbnMpIHsKLQkJaWYgKHJlc291cmNlLmdldENvbnRlbnRzKCkuaXNFbXB0eSgpKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCVNldCBtb2RpZmllZFJlc291cmNlcyA9IChTZXQpIG9wdGlvbnMKLQkJCQkuZ2V0KE11bHRpRmlsZVhNSVNhdmVJbXBsLk1PRElGSUVEX1JFU09VUkNFX1NFVCk7Ci0KLQkJLy8gc2hvdWxkIG5vdCBjaGFuZ2UgcmVzb3VyY2UgbG9jYXRpb24gYXV0b21hdGljYWxseSB3aXRob3V0IGxldHRpbmcKLQkJLy8gdXNlciBrbm93IGFib3V0IGl0Ci0JCS8vCi0JCS8vIGFkanVzdExvY2F0aW9uKHJlc291cmNlLCBtb2RpZmllZFJlc291cmNlcyk7Ci0KLQkJLy8gYmFjayB1cCB0aGUgY29udGFpbmVyIHJlZmVyZW5jZXMgYW5kIHNldCBjb250ZW50IG9iamVjdCdzIGNvbnRhaW5lcgotCQkvLyB0byBudWxsCi0JCS8vCi0JCU1hcCBvYmpUb0NvbnRhaW5lck1hcCA9IHJlbW92ZUNvbnRhaW5lcnMocmVzb3VyY2UpOwotCQl0cnkgewotCQkJcmVzb3VyY2Uuc2F2ZShvcHRpb25zKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCXRocm93IG5ldyBNdWx0aUZpbGVJT0V4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7Ci0JCX0gZmluYWxseSB7Ci0JCQkvLyByZXN0b3JlIHRoZSBjb250YWluZXIgcmVmZXJlbmNlcyBmb3IgdGhlIGNvbnRlbnQgb2JqZWN0cwotCQkJLy8KLQkJCXJlc3RvcmVDb250YWluZXJzKHJlc291cmNlLCBvYmpUb0NvbnRhaW5lck1hcCk7Ci0JCX0KLQotCQlSZXNvdXJjZU1hbmFnZXIgcmVzTWdyID0gYWRkTmV3UmVzb3VyY2VNYW5hZ2VyKHJlc291cmNlKTsKLQkJaWYgKHJlc01nciAhPSBudWxsICYmIG1vZGlmaWVkUmVzb3VyY2VzICE9IG51bGwpIHsKLQkJCW1vZGlmaWVkUmVzb3VyY2VzLmFkZChyZXNNZ3IuZUNvbnRhaW5lcigpLmVSZXNvdXJjZSgpKTsKLQkJfQotCQkKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIHJlc291cmNlCi0JICogQHJldHVybiBSZXNvdXJjZU1hbmFnZXIgdGhhdCBpcyBqdXN0IGFkZGVkIHRvIHRoZSByZXNvdXJjZSBtYW5hZ2VyIHRyZWUKLQkgKiAgICAgICAgIG9yIG51bGwuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgUmVzb3VyY2VNYW5hZ2VyIGFkZE5ld1Jlc291cmNlTWFuYWdlcihSZXNvdXJjZSByZXNvdXJjZSkgewotCQlSZXNvdXJjZU1hbmFnZXIgcmVzTWdyID0gZ2V0UmVzb3VyY2VNYW5hZ2VyKHJlc291cmNlKTsKLQkJTWV0aG9kRWxlbWVudCBlID0gUGVyc2lzdGVuY2VVdGlsLmdldE1ldGhvZEVsZW1lbnQocmVzb3VyY2UpOwotCQlFT2JqZWN0IGNvbnRhaW5lciA9IGUuZUNvbnRhaW5lcigpOwotCQlpZiAocmVzTWdyICE9IG51bGwgJiYgY29udGFpbmVyICE9IG51bGwgJiYgcmVzTWdyLmVDb250YWluZXIoKSA9PSBudWxsKSB7Ci0JCQkvLyBuZXcgUmVzb3VyY2VNYW5hZ2VyIGlzIGFkZGVkIHRvIHRoZSByZXNvdXJjZQotCQkJLy8KLQkJCVJlc291cmNlTWFuYWdlciBwYXJlbnRSZXNNZ3IgPSBnZXRSZXNvdXJjZU1hbmFnZXIoY29udGFpbmVyCi0JCQkJCS5lUmVzb3VyY2UoKSk7Ci0KLQkJCS8vIGNoZWNrIGlmIHJlc01nciBpcyBhbHJlYWR5IGEgc3ViIG1hbmFnZXIgb2YgcGFyZW50UmVzTWdyIGJlZm9yZQotCQkJLy8gYWRkaW5nIGl0Ci0JCQkvLwotCQkJaWYgKCFwYXJlbnRSZXNNZ3IuZ2V0U3ViTWFuYWdlcnMoKS5jb250YWlucyhyZXNNZ3IpKSB7Ci0JCQkJcGFyZW50UmVzTWdyLmdldFN1Yk1hbmFnZXJzKCkuYWRkKHJlc01ncik7CQkJCQotCQkJCXJlZ2lzdGVyV2l0aFJlc291cmNlTWFuYWdlcihwYXJlbnRSZXNNZ3IsIGUsIE11bHRpRmlsZVNhdmVVdGlsLmdldEZpbmFsVVJJKHJlc291cmNlKSk7Ci0JCQkJcmV0dXJuIHJlc01ncjsKLQkJCX0KLQotCQkJLy8gcmVnaXN0ZXJXaXRoUmVzb3VyY2VNYW5hZ2VyKHBhcmVudFJlc01nciwgcmVzTWdyLAotCQkJLy8gcmVzTWdyLmVSZXNvdXJjZSgpLmdldFVSSSgpLmFwcGVuZEZyYWdtZW50KHJlc01nci5nZXRHdWlkKCkpKTsKLQkJCS8vIHJldHVybiByZXNNZ3I7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHRvRmlsZVN0cmluZyhFT2JqZWN0IGVPYmopIHsKLQkJcmV0dXJuIGVPYmouZVJlc291cmNlKCkuZ2V0UmVzb3VyY2VTZXQoKS5nZXRVUklDb252ZXJ0ZXIoKS5ub3JtYWxpemUoCi0JCQkJZU9iai5lUmVzb3VyY2UoKS5nZXRVUkkoKSkudG9GaWxlU3RyaW5nKCk7Ci0JfQotCi0Jc3RhdGljIGJvb2xlYW4gaGFzT3duRm9sZGVyKE9iamVjdCBlKSB7Ci0JCXJldHVybiBlIGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luIHx8IGUgaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50OwotCX0KLQotCXN0YXRpYyBib29sZWFuIGhhc093blJlc291cmNlKE9iamVjdCBvYmosIENvbGxlY3Rpb24gc2F2ZVNlcGFyYXRlbHlDbGFzc1NldCkgewotCQlpZiAob2JqIGluc3RhbmNlb2YgTWV0aG9kVW5pdCkKLQkJCXJldHVybiB0cnVlOwotCQlpZiAoc2F2ZVNlcGFyYXRlbHlDbGFzc1NldCA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBzYXZlU2VwYXJhdGVseUNsYXNzU2V0Lml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJRUNsYXNzIGVDbHMgPSAoRUNsYXNzKSBpdGVyLm5leHQoKTsKLQkJCWlmIChlQ2xzLmlzSW5zdGFuY2Uob2JqKSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0Jc3RhdGljIFVSSSBjcmVhdGVGaWxlVVJJKE1ldGhvZEVsZW1lbnQgZSkgewotCQlpZiAoZS5lQ29udGFpbmVyKCkgPT0gbnVsbCkKLQkJCXJldHVybiAoKE11bHRpRmlsZVhNSVJlc291cmNlSW1wbCkgZS5lUmVzb3VyY2UoKSkuZ2V0RmluYWxVUkkoKTsKLQotCQkvLyBIYW5kbGUgUHJvY2Vzc0NvbXBvbmVudCBzcGVjaWFsbHkuIFByb2Nlc3NDb21wb25lbnQgb2JqZWN0cyBhcmUKLQkJLy8gc3RvcmVkIGFzIGZvbGxvd2luZyBpbiB0aGUgbWV0aG9kIGxpYnJhcnk6Ci0JCS8vIDxNZXRob2QgTGlicmFyeT4KLQkJLy8gfF8gPE1ldGhvZCBQbHVnaW4+Ci0JCS8vIHxfcHJvY2Vzc2VzCi0JCS8vIHxfY2FwYWJpbGl0eV9wYXR0ZXJucwotCQkvLyB8X2RlbGl2ZXJ5X3Byb2Nlc3NlcwotCQkvLyB8X3Byb2Nlc3NfY29udHJpYnV0aW9ucwotCQkvLwotCQlpZiAoZSBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpIHsKLQkJCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSBVbWFVdGlsLmdldE1ldGhvZFBsdWdpbihlKTsKLQkJCWlmKHBsdWdpbiA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCQlSZXNvdXJjZSByZXNvdXJjZSA9IHBsdWdpbi5lUmVzb3VyY2UoKTsKLQkJCWlmIChyZXNvdXJjZSA9PSBudWxsKSB7Ci0JCQl9Ci0JCQlTdHJpbmcgcGx1Z2luRGlyID0gbnVsbDsKLQkJCWlmKHJlc291cmNlICE9IG51bGwpIHsKLQkJCQlwbHVnaW5EaXIgPSBuZXcgRmlsZShnZXRGaW5hbFVSSShyZXNvdXJjZSkudG9GaWxlU3RyaW5nKCkpLmdldFBhcmVudCgpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJTWV0aG9kTGlicmFyeSBsaWIgPSAoTWV0aG9kTGlicmFyeSkgcGx1Z2luLmVDb250YWluZXIoKTsKLQkJCQlpZiAobGliICE9IG51bGwpIHsKLQkJCQkJU3RyaW5nIGxpYkRpciA9IG5ldyBGaWxlKCgoTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsKSBsaWIKLQkJCQkJCQkuZVJlc291cmNlKCkpLmdldEZpbmFsVVJJKCkudG9GaWxlU3RyaW5nKCkpLmdldFBhcmVudCgpOwotCQkJCQlwbHVnaW5EaXIgPSBsaWJEaXIgKyBGaWxlLnNlcGFyYXRvciArIHBsdWdpbi5nZXROYW1lKCk7Ci0JCQkJfQotCQkJfQotCQkJaWYocGx1Z2luRGlyID09IG51bGwpIHsKLQkJCQkvLyBwbHVnaW4gaXMgYWxyZWFkeSBkZWxldGVkCi0JCQkJLy8KLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQotCQkJU3RyaW5nIHJlbGF0aXZlRGlyOwotCQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzIHByb2MgPSAoKFByb2Nlc3NDb21wb25lbnQpIGUpCi0JCQkJCS5nZXRQcm9jZXNzKCk7Ci0JCQlpZiAocHJvYyBpbnN0YW5jZW9mIENhcGFiaWxpdHlQYXR0ZXJuKSB7Ci0JCQkJcmVsYXRpdmVEaXIgPSBDQVBBQklMSVRZX1BBVFRFUk5fUEFUSDsKLQkJCX0gZWxzZSBpZiAocHJvYyBpbnN0YW5jZW9mIERlbGl2ZXJ5UHJvY2VzcykgewotCQkJCXJlbGF0aXZlRGlyID0gREVMSVZFUllfUFJPQ0VTU19QQVRIOwotCQkJfSBlbHNlIHsKLQkJCQlyZWxhdGl2ZURpciA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0KLQkJCVN0cmluZyBwYXRoID0gcGx1Z2luRGlyICsgRmlsZS5zZXBhcmF0b3IgKyByZWxhdGl2ZURpcgotCQkJCQkrIEZpbGUuc2VwYXJhdG9yICsgZS5nZXROYW1lKCkgKyBGaWxlLnNlcGFyYXRvcgotCQkJCQkrIERFRkFVTFRfTU9ERUxfRklMRU5BTUU7Ci0JCQlyZXR1cm4gVVJJLmNyZWF0ZUZpbGVVUkkocGF0aCk7Ci0JCX0gZWxzZSBpZiAoZSBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbikgewotCQkJU3RyaW5nIGRpciA9IG51bGw7Ci0JCQl0cnkgewotCQkJCWRpciA9IG5ldyBGaWxlKCgoTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsKSBVbWFVdGlsCi0JCQkJCQkuZ2V0UHJvY2Vzc0NvbXBvbmVudChlKS5lUmVzb3VyY2UoKSkuZ2V0RmluYWxVUkkoKQotCQkJCQkJLnRvRmlsZVN0cmluZygpKS5nZXRQYXJlbnQoKTsKLQkJCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZXgpIHsKLQkJCQl0aHJvdyBleDsKLQkJCX0KLQkJCXJldHVybiBVUkkuY3JlYXRlRmlsZVVSSShkaXIgKyBGaWxlLnNlcGFyYXRvcgotCQkJCQkrIERFRkFVTFRfQ09OVEVOVF9GSUxFTkFNRSk7Ci0JCX0gZWxzZSBpZiAoZSBpbnN0YW5jZW9mIENvbnRlbnREZXNjcmlwdGlvbikgewotCQkJVVJJIHVyaTsKLQkJCUNvbnRlbnREZXNjcmlwdGlvbiBjb250ZW50ID0gKENvbnRlbnREZXNjcmlwdGlvbikgZTsKLQkJCVN0cmluZyBwYXRoID0gTWV0aG9kTGlicmFyeVBlcnNpc3Rlci5nZXRDb3JyZWN0UGF0aChjb250ZW50KTsKLQkJCWlmIChwYXRoID09IG51bGwpIHsKLQkJCQlTdHJpbmcgZGlyID0gKChNdWx0aUZpbGVYTUlSZXNvdXJjZUltcGwpIGUuZVJlc291cmNlKCkpCi0JCQkJCQkuZ2V0RmluYWxVUkkoKS50cmltU2VnbWVudHMoMSkudG9GaWxlU3RyaW5nKCkKLQkJCQkJCSsgRmlsZS5zZXBhcmF0b3I7Ci0JCQkJcGF0aCA9IE1ldGhvZExpYnJhcnlQZXJzaXN0ZXIuZ2V0TmV4dEF2YWlsYWJsZUZpbGVOYW1lKGRpciwKLQkJCQkJCWNvbnRlbnQpOwotCQkJfQotCQkJdXJpID0gVVJJLmNyZWF0ZUZpbGVVUkkocGF0aCk7Ci0JCQlyZXR1cm4gdXJpOwotCQl9IGVsc2UgaWYgKGUgaW5zdGFuY2VvZiBNZXRob2RDb25maWd1cmF0aW9uKSB7CQkJCi0JCQlTdHJpbmcgZGlyID0gbmV3IFN0cmluZ0J1ZmZlcigoKE11bHRpRmlsZVhNSVJlc291cmNlSW1wbCkgZQotCQkJCQkuZUNvbnRhaW5lcigpLmVSZXNvdXJjZSgpKS5nZXRGaW5hbFVSSSgpLnRyaW1TZWdtZW50cygxKQotCQkJCQkudG9GaWxlU3RyaW5nKCkpLmFwcGVuZChGaWxlLnNlcGFyYXRvcikuYXBwZW5kKAotCQkJCQlNRVRIT0RfQ09ORklHVVJBVElPTl9GT0xERVJfTkFNRSkuYXBwZW5kKEZpbGUuc2VwYXJhdG9yKQotCQkJCQkudG9TdHJpbmcoKTsKLQkJCVN0cmluZyBwYXRoID0gTWV0aG9kTGlicmFyeVBlcnNpc3Rlci5nZXROZXh0QXZhaWxhYmxlRmlsZU5hbWUoZGlyLAotCQkJCQlTdHJVdGlsLm1ha2VWYWxpZEZpbGVOYW1lKGUuZ2V0TmFtZSgpKSwKLQkJCQkJKE11bHRpUmVzb3VyY2VFT2JqZWN0KSBlKTsKLQkJCXJldHVybiBVUkkuY3JlYXRlRmlsZVVSSShwYXRoKTsKLQkJfQotCi0JCVN0cmluZ0J1ZmZlciBwYXRoID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlFT2JqZWN0IGxhc3RDb250YWluZXIgPSBudWxsOwotCQlmb3IgKE1ldGhvZEVsZW1lbnQgb2JqID0gKE1ldGhvZEVsZW1lbnQpIGUuZUNvbnRhaW5lcigpOyBvYmogIT0gbnVsbDsgb2JqID0gKE1ldGhvZEVsZW1lbnQpIG9iagotCQkJCS5lQ29udGFpbmVyKCkpIHsKLQkJCWxhc3RDb250YWluZXIgPSBvYmo7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgTWV0aG9kTGlicmFyeSkgewotCQkJCXBhdGguaW5zZXJ0KDAsIG5ldyBGaWxlKCgoTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsKSBvYmoKLQkJCQkJCS5lUmVzb3VyY2UoKSkuZ2V0RmluYWxVUkkoKS50b0ZpbGVTdHJpbmcoKSkKLQkJCQkJCS5nZXRQYXJlbnRGaWxlKCkuZ2V0QWJzb2x1dGVQYXRoKCkpOwotCQkJCWJyZWFrOwotCQkJfSBlbHNlIHsKLQkJCQlwYXRoLmluc2VydCgwLCBvYmouZ2V0TmFtZSgpKS5pbnNlcnQoMCwgRmlsZS5zZXBhcmF0b3JDaGFyKTsKLQkJCX0KLQkJfQotCQlpZiAobGFzdENvbnRhaW5lciA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZS5lUmVzb3VyY2UoKSAhPSBudWxsID8gKChNdWx0aUZpbGVYTUlSZXNvdXJjZUltcGwpIGUKLQkJCQkJLmVSZXNvdXJjZSgpKS5nZXRGaW5hbFVSSSgpIDogbnVsbDsKLQkJfQotCQlpZiAoIShsYXN0Q29udGFpbmVyIGluc3RhbmNlb2YgTWV0aG9kTGlicmFyeSkpIHsKLQkJCXBhdGguaW5zZXJ0KDAsIG5ldyBGaWxlKHRvRmlsZVN0cmluZyhsYXN0Q29udGFpbmVyKSkKLQkJCQkJLmdldFBhcmVudEZpbGUoKS5nZXRQYXJlbnRGaWxlKCkuZ2V0QWJzb2x1dGVQYXRoKCkpOwotCQl9Ci0KLQkJU3RyaW5nIG1vZGVsRmlsZU5hbWU7Ci0JCWlmIChlIGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luKSB7Ci0JCQltb2RlbEZpbGVOYW1lID0gREVGQVVMVF9QTFVHSU5fTU9ERUxfRklMRU5BTUU7Ci0JCX0gZWxzZSB7Ci0JCQltb2RlbEZpbGVOYW1lID0gTXVsdGlGaWxlU2F2ZVV0aWwuREVGQVVMVF9NT0RFTF9GSUxFTkFNRTsKLQkJfQotCQlVUkkgdXJpID0gVVJJLmNyZWF0ZUZpbGVVUkkocGF0aC50b1N0cmluZygpICsgRmlsZS5zZXBhcmF0b3IKLQkJCQkrIE11bHRpRmlsZVNhdmVVdGlsLmNyZWF0ZURpck5hbWUoZSkgKyBGaWxlLnNlcGFyYXRvcgotCQkJCSsgbW9kZWxGaWxlTmFtZSk7Ci0JCXJldHVybiB1cmk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGRlbGV0ZShGaWxlIGZpbGUpIHsKLQkJRmlsZVtdIGZpbGVzID0gZmlsZS5saXN0RmlsZXMoKTsKLQkJaWYgKGZpbGVzICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlkZWxldGUoZmlsZXNbaV0pOwotCQkJfQotCQl9Ci0JCWZpbGUuZGVsZXRlKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIGUKLQkgKiBAcGFyYW0gdXJpCi0JICogQHBhcmFtIG1vZGlmaWVkUmVzb3VyY2VzCi0JICogICAgICAgICAgICBvdXRwdXQgb2YgcmVzb3VyY2VzIHRoYXQgaGF2ZSBiZWVuIGNoYW5nZWQgYWZ0ZXIgdGhpcyBjYWxsLgotCSAqLwotCXN0YXRpYyB2b2lkIHNldFVSSU1hcHBpbmcoRU9iamVjdCBlLCBVUkkgdXJpLCBTZXQgbW9kaWZpZWRSZXNvdXJjZXMpIHsKLQkJTXVsdGlGaWxlVVJJQ29udmVydGVyIHVyaUNvbnZlcnRlciA9IChNdWx0aUZpbGVVUklDb252ZXJ0ZXIpIGUKLQkJCQkuZVJlc291cmNlKCkuZ2V0UmVzb3VyY2VTZXQoKS5nZXRVUklDb252ZXJ0ZXIoKTsKLQkJdXJpQ29udmVydGVyLnNldFVSSU1hcHBpbmcoZSwgdXJpLCBtb2RpZmllZFJlc291cmNlcyk7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIHJlc291cmNlCi0JICogQHBhcmFtIG1vZGlmaWVkUmVzb3VyY2VzCi0JICogICAgICAgICAgICBvdXRwdXQgb2YgcmVzb3VyY2VzIHRoYXQgaGF2ZSBiZWVuIGNoYW5nZWQgYWZ0ZXIgdGhpcyBjYWxsCi0JICovCi0Jc3RhdGljIHZvaWQgdXBkYXRlVVJJTWFwcGluZ3MoTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsIHJlc291cmNlLAotCQkJU2V0IG1vZGlmaWVkUmVzb3VyY2VzKSB7Ci0JCXVwZGF0ZVVSSU1hcHBpbmdzKHJlc291cmNlLCBtb2RpZmllZFJlc291cmNlcywgdHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogQ2hlY2tzIGlmIHRoZSBnaXZlbiByZXNvdXJjZVNldCBoYXMgdGhlIGxvYWRlZCByZXNvdXJjZSB3aXRoIHRoZSBnaXZlbgotCSAqIHVyaQotCSAqIAotCSAqIEBwYXJhbSByZXNvdXJjZVNldAotCSAqIEBwYXJhbSB1cmkKLQkgKiBAcmV0dXJuCi0JICovCi0Jc3RhdGljIGJvb2xlYW4gaGFzTG9hZGVkUmVzb3VyY2UoUmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQsIFVSSSB1cmkpIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gcmVzb3VyY2VTZXQuZ2V0UmVzb3VyY2VzKCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQlSZXNvdXJjZSByZXNvdXJjZSA9IChSZXNvdXJjZSkgaXRlci5uZXh0KCk7Ci0JCQlpZiAocmVzb3VyY2UuaXNMb2FkZWQoKSAmJiByZXNvdXJjZS5nZXRVUkkoKS5lcXVhbHModXJpKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBVcGRhdGUgdGhlIFVSSU1hcHBpbmdzIHdpdGggdGhlIGZpbmFsIFVSSSBvZiB0aGUgZ2l2ZW4gcmVzb3VyY2UKLQkgKiAKLQkgKiBAcGFyYW0gcmVzb3VyY2UKLQkgKi8KLQlzdGF0aWMgdm9pZCB1cGRhdGVVUklNYXBwaW5ncyhNdWx0aUZpbGVYTUlSZXNvdXJjZUltcGwgcmVzb3VyY2UsCi0JCQlTZXQgbW9kaWZpZWRSZXNvdXJjZXMsIGJvb2xlYW4gYWZ0ZXJNb3ZlKSB7Ci0JCXVwZGF0ZVVSSU1hcHBpbmdzKHJlc291cmNlLCByZXNvdXJjZS5nZXRGaW5hbFVSSSgpLCBtb2RpZmllZFJlc291cmNlcywKLQkJCQlhZnRlck1vdmUpOwotCX0KLQotCXN0YXRpYyB2b2lkIHVwZGF0ZVVSSU1hcHBpbmdzKE11bHRpRmlsZVhNSVJlc291cmNlSW1wbCByZXNvdXJjZSwgVVJJIHVyaSwKLQkJCVNldCBtb2RpZmllZFJlc291cmNlcywgYm9vbGVhbiBhZnRlck1vdmUpIHsKLQkJLy8gdGhlIHJlc291cmNlIFVSSSBoYXMgYmVlbiBjaGFuZ2VkLCByZXNldCBhbGwgdGhlIGNhY2hlZCByZXNvbHZlZCBVUkkKLQkJLy8gaW4gYWxsIG9mZnN0cmluZyByZXNvdXJjZSBkZXNjcmlwdG9ycwotCQkvLyBvZiBpdHMgbWFuYWdlciwgaWYgaXQgaGFzIG9uZS4KLQkJLy8KLQkJSGFzaE1hcCBvbGRVUklUb1Jlc291cmNlRGVzY3JpcHRvck1hcCA9IG51bGw7Ci0JCVJlc291cmNlTWFuYWdlciByZXNNZ3IgPSBnZXRSZXNvdXJjZU1hbmFnZXIocmVzb3VyY2UpOwotCQlpZiAocmVzTWdyICE9IG51bGwpIHsKLQkJCW9sZFVSSVRvUmVzb3VyY2VEZXNjcmlwdG9yTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHJlc01nci5lQWxsQ29udGVudHMoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IG9iaiA9IGl0ZXIubmV4dCgpOwotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBSZXNvdXJjZURlc2NyaXB0b3IpIHsKLQkJCQkJUmVzb3VyY2VEZXNjcmlwdG9yIGRlc2MgPSAoKFJlc291cmNlRGVzY3JpcHRvcikgb2JqKTsKLQkJCQkJb2xkVVJJVG9SZXNvdXJjZURlc2NyaXB0b3JNYXAucHV0KGRlc2MuZ2V0UmVzb2x2ZWRVUkkoKSwKLQkJCQkJCQlkZXNjKTsKLQkJCQkJaWYgKGFmdGVyTW92ZSkgewotCQkJCQkJZGVzYy5jbGVhclJlc29sdmVkVVJJKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlpZiAoIXJlc291cmNlLmdldENvbnRlbnRzKCkuaXNFbXB0eSgpKSB7Ci0JCQlFT2JqZWN0IGVsZW1lbnQgPSBQZXJzaXN0ZW5jZVV0aWwuZ2V0TWV0aG9kRWxlbWVudChyZXNvdXJjZSk7Ci0JCQkvLyBzZXRVUklNYXBwaW5nKGVsZW1lbnQsIHJlc291cmNlLmdldEZpbmFsVVJJKCksCi0JCQkvLyBtb2RpZmllZFJlc291cmNlcyk7Ci0JCQlNdWx0aUZpbGVVUklDb252ZXJ0ZXIgdXJpQ29udmVydGVyID0gKE11bHRpRmlsZVVSSUNvbnZlcnRlcikgcmVzb3VyY2UKLQkJCQkJLmdldFJlc291cmNlU2V0KCkuZ2V0VVJJQ29udmVydGVyKCk7Ci0JCQl1cmlDb252ZXJ0ZXIuc2V0VVJJTWFwcGluZyhlbGVtZW50LCB1cmksIG1vZGlmaWVkUmVzb3VyY2VzLAotCQkJCQlhZnRlck1vdmUpOwotCQl9Ci0KLQkJLy8gZm9yIChJdGVyYXRvciBpdGVyID0gcmVzb3VyY2UuZ2V0Q29udGVudHMoKS5pdGVyYXRvcigpOwotCQkvLyBpdGVyLmhhc05leHQoKTspIHsKLQkJLy8gRU9iamVjdCBlbGVtZW50ID0gKEVPYmplY3QpIGl0ZXIubmV4dCgpOwotCQkvLyBzZXRVUklNYXBwaW5nKGVsZW1lbnQsIHJlc291cmNlLmdldFVSSSgpLCBtb2RpZmllZFJlc291cmNlcyk7Ci0JCS8vIH0KLQotCQlpZiAob2xkVVJJVG9SZXNvdXJjZURlc2NyaXB0b3JNYXAgIT0gbnVsbCkgewotCQkJLy8gZ28gdGhydSB0aGUgbGlzdCBvZiBsb2FkZWQgcmVzb3VyY2VzIGluIHJlc291cmNlIHNldCB0byB1cGRhdGUKLQkJCS8vIHRoZSBVUkkKLQkJCS8vCi0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSByZXNvdXJjZS5nZXRSZXNvdXJjZVNldCgpLmdldFJlc291cmNlcygpCi0JCQkJCS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlSZXNvdXJjZSByZXMgPSAoUmVzb3VyY2UpIGl0ZXIubmV4dCgpOwotCQkJCVJlc291cmNlRGVzY3JpcHRvciBkZXNjID0gKFJlc291cmNlRGVzY3JpcHRvcikgb2xkVVJJVG9SZXNvdXJjZURlc2NyaXB0b3JNYXAKLQkJCQkJCS5nZXQocmVzLmdldFVSSSgpKTsKLQkJCQlpZiAoZGVzYyAhPSBudWxsKSB7Ci0JCQkJCWlmIChhZnRlck1vdmUpIHsKLQkJCQkJCXJlcy5zZXRVUkkoZGVzYy5nZXRSZXNvbHZlZFVSSSgpKTsKLQkJCQkJfSBlbHNlIGlmIChyZXMuaXNMb2FkZWQoKSkgewotCQkJCQkJZGVzYy5jbGVhclJlc29sdmVkVVJJKCk7Ci0JCQkJCQlyZXMuc2V0VVJJKGRlc2MuZ2V0UmVzb2x2ZWRVUkkoKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gcmVzTWdyCi0JICogQHBhcmFtIG8KLQkgKiBAcGFyYW0gdXJpCi0JICovCi0JLy8gcHJpdmF0ZSBzdGF0aWMgdm9pZCBzZXRVcmkoUmVzb3VyY2VNYW5hZ2VyIHJlc01nciwgTWV0aG9kRWxlbWVudCBlLCBVUkkKLQkvLyB1cmkpIHsKLQkvLyBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSByZXNNZ3IuZ2V0UmVzb3VyY2VEZXNjcmlwdG9ycygpLml0ZXJhdG9yKCk7Ci0JLy8gaXRlci5oYXNOZXh0KCk7KSB7Ci0JLy8gUmVzb3VyY2VEZXNjcmlwdG9yIHJlc0Rlc2MgPSAoUmVzb3VyY2VEZXNjcmlwdG9yKSBpdGVyLm5leHQoKTsKLQkvLyBpZihyZXNEZXNjLmdldElkKCkuZXF1YWxzKGUuZ2V0R3VpZCgpKSkgewotCS8vIC8vIGNoYW5nZSBvdGhlciBVUklzIHRoYXQgYXJlIGNoYW5nZWQgYXMgcmVzdWx0IG9mIHRoaXMgVVJJIGNoYW5nZQotCS8vIC8vCi0JLy8gaWYodXJpLmZyYWdtZW50KCkgPT0gbnVsbCkgewotCS8vIFVSSSBvbGREaXIgPSBVUkkuY3JlYXRlRmlsZVVSSShuZXcKLQkvLyBGaWxlKHJlc0Rlc2MuZ2V0UmVzb2x2ZWRVUkkoKS50b0ZpbGVTdHJpbmcoKSkuZ2V0UGFyZW50KCkgKwotCS8vIEZpbGUuc2VwYXJhdG9yKTsKLQkvLyBVUkkgbmV3RGlyID0gVVJJLmNyZWF0ZUZpbGVVUkkobmV3IEZpbGUodXJpLnRvRmlsZVN0cmluZygpKS5nZXRQYXJlbnQoKSArCi0JLy8gRmlsZS5zZXBhcmF0b3IpOwotCS8vIGZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSByZXNNZ3IuZ2V0UmVzb3VyY2VEZXNjcmlwdG9ycygpLml0ZXJhdG9yKCk7Ci0JLy8gaXRlcmF0b3IKLQkvLyAuaGFzTmV4dCgpOykgewotCS8vIFJlc291cmNlRGVzY3JpcHRvciBlbGVtZW50ID0gKFJlc291cmNlRGVzY3JpcHRvcikgaXRlcmF0b3IubmV4dCgpOwotCS8vIFVSSSBjdXJyZW50VXJpID0gZWxlbWVudC5nZXRSZXNvbHZlZFVSSSgpOwotCS8vIFVSSSBuZXdVcmkgPSBjdXJyZW50VXJpLnJlcGxhY2VQcmVmaXgob2xkRGlyLCBuZXdEaXIpOwotCS8vIGlmKG5ld1VyaSAhPSBudWxsKSB7Ci0JLy8gZWxlbWVudC5zZXRSZXNvbHZlZFVSSShuZXdVcmkpOwotCS8vIH0KLQkvLyB9Ci0JLy8gfQotCS8vIHJlc0Rlc2Muc2V0UmVzb2x2ZWRVUkkodXJpKTsKLQkvLyByZXR1cm47Ci0JLy8gfQotCS8vIH0KLQkvLyBSZXNvdXJjZURlc2NyaXB0b3IgcmVzRGVzYyA9Ci0JLy8gUmVzb3VyY2VtYW5hZ2VyRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUmVzb3VyY2VEZXNjcmlwdG9yKCk7Ci0JLy8gcmVzRGVzYy5zZXRJZChlLmdldEd1aWQoKSk7Ci0JLy8gcmVzRGVzYy5zZXRSZXNvbHZlZFVSSSh1cmkpOwotCS8vIHJlc01nci5nZXRSZXNvdXJjZURlc2NyaXB0b3JzKCkuYWRkKHJlc0Rlc2MpOwotCS8vIH0KLQkvKioKLQkgKiBHZXRzIHRoZSByaWdodCBSZXNvdXJjZU1hbmFnZXIgZm9yIHRoZSBnaXZlbiBFT2JqZWN0LCBjcmVhdGVzIG5ldwotCSAqIFJlc291cmNlTWFuYWdlciBpZiBpdCBkb2VzIG5vdCBleGlzdCB5ZXQuCi0JICogCi0JICogQHBhcmFtIG1vZGlmaWVkUmVzb3VyY2VzCi0JICogICAgICAgICAgICBvdXRwdXQgb2YgcmVzb3VyY2VzIHRoYXQgaGF2ZSBiZWVuIGNoYW5nZWQgYWZ0ZXIgdGhpcyBjYWxsLgotCSAqLwotCXN0YXRpYyBSZXNvdXJjZU1hbmFnZXIgZ2V0UmVzb3VyY2VNYW5hZ2VyRm9yKEVPYmplY3QgZU9iaiwKLQkJCVNldCBtb2RpZmllZFJlc291cmNlcykgewotCQlSZXNvdXJjZSByZXNvdXJjZSA9IGVPYmouZUNvbnRhaW5lcigpICE9IG51bGwgPyBlT2JqLmVDb250YWluZXIoKQotCQkJCS5lUmVzb3VyY2UoKSA6IGVPYmouZVJlc291cmNlKCk7Ci0JCVJlc291cmNlTWFuYWdlciByZXNNZ3IgPSBnZXRSZXNvdXJjZU1hbmFnZXIocmVzb3VyY2UpOwotCQlpZiAocmVzTWdyID09IG51bGwpIHsKLQkJCXJlc01nciA9IFJlc291cmNlbWFuYWdlckZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVJlc291cmNlTWFuYWdlcigpOwotCi0JCQkvLyBhZGQgdG8gYmVnaW5uaW5nIG9mIHRoZSByZXNvdXJjZSdzIGNvbnRlbnRzCi0JCQkvLwotCQkJcmVzb3VyY2UuZ2V0Q29udGVudHMoKS5hZGQoMCwgcmVzTWdyKTsKLQotCQkJaWYgKG1vZGlmaWVkUmVzb3VyY2VzICE9IG51bGwpIHsKLQkJCQltb2RpZmllZFJlc291cmNlcy5hZGQocmVzb3VyY2UpOwotCQkJfQotCQkJRU9iamVjdCBjb250YWluZXIgPSBnZXRDb250YWluZXJXaXRoRGlyZWN0UmVzb3VyY2UoKEludGVybmFsRU9iamVjdCkgZU9iaik7Ci0JCQlpZiAoY29udGFpbmVyICE9IG51bGwgJiYgY29udGFpbmVyLmVSZXNvdXJjZSgpICE9IHJlc291cmNlKSB7Ci0JCQkJUmVzb3VyY2VNYW5hZ2VyIHBhcmVudFJlc01nciA9IGdldFJlc291cmNlTWFuYWdlckZvcihjb250YWluZXIsCi0JCQkJCQltb2RpZmllZFJlc291cmNlcyk7Ci0JCQkJaWYgKHBhcmVudFJlc01nciAhPSBudWxsKSB7Ci0JCQkJCXBhcmVudFJlc01nci5nZXRTdWJNYW5hZ2VycygpLmFkZChyZXNNZ3IpOwotCQkJCQlpZiAobW9kaWZpZWRSZXNvdXJjZXMgIT0gbnVsbCkgewotCQkJCQkJbW9kaWZpZWRSZXNvdXJjZXMuYWRkKHBhcmVudFJlc01nci5lUmVzb3VyY2UoKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gcmVzTWdyOwotCi0JfQotCi0Jc3RhdGljIExpc3QgcmVnaXN0ZXJXaXRoUmVzb3VyY2VNYW5hZ2VyKE11bHRpRmlsZVhNSVJlc291cmNlSW1wbCByZXNvdXJjZSwKLQkJCVNldCBtb2RpZmllZFJlc291cmNlcykgewotCQlSZXNvdXJjZU1hbmFnZXIgcmVzTWdyID0gZ2V0UmVzb3VyY2VNYW5hZ2VyRm9yKAotCQkJCVBlcnNpc3RlbmNlVXRpbC5nZXRNZXRob2RFbGVtZW50KHJlc291cmNlKSwgbW9kaWZpZWRSZXNvdXJjZXMpOwotCi0JCUxpc3QgcmVzb3VyY2VEZXNjcmlwdG9ycyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gcmVzb3VyY2UuZ2V0Q29udGVudHMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gaXRlci5uZXh0KCk7Ci0JCQlpZihlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJCVJlc291cmNlRGVzY3JpcHRvciByZXNEZXNjID0gcmVnaXN0ZXJXaXRoUmVzb3VyY2VNYW5hZ2VyKHJlc01nciwKLQkJCQkJCWVsZW1lbnQsIHJlc291cmNlLmdldEZpbmFsVVJJKCkpOwotCQkJCWlmIChyZXNEZXNjICE9IG51bGwpIHsKLQkJCQkJcmVzb3VyY2VEZXNjcmlwdG9ycy5hZGQocmVzRGVzYyk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmICghcmVzb3VyY2VEZXNjcmlwdG9ycy5pc0VtcHR5KCkgJiYgbW9kaWZpZWRSZXNvdXJjZXMgIT0gbnVsbCkgewotCQkJbW9kaWZpZWRSZXNvdXJjZXMuYWRkKHJlc01nci5lUmVzb3VyY2UoKSk7Ci0JCX0KLQkJcmV0dXJuIHJlc291cmNlRGVzY3JpcHRvcnM7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBSZXNvdXJjZURlc2NyaXB0b3IgcmVnaXN0ZXJXaXRoUmVzb3VyY2VNYW5hZ2VyKAotCQkJUmVzb3VyY2VNYW5hZ2VyIHJlc01nciwgT2JqZWN0IGVsZW1lbnQsIFVSSSB1cmkpIHsKLQkJU3RyaW5nIGd1aWQgPSBnZXRHdWlkKGVsZW1lbnQpOwotCQlpZiAocmVzTWdyLmdldFJlc291cmNlRGVzY3JpcHRvcihndWlkKSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gY3JlYXRlUmVzb3VyY2VEZXNjcmlwdG9yKHJlc01nciwgZ3VpZCwgdXJpKTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JLy8gLyoqCi0JLy8gKiBDcmVhdGVzIGEgbmV3IFJlc291cmNlRGVzY3JpcHRvciBmb3IgdGhlIGdpdmVuIE1ldGhvZEVsZW1lbnQgYW5kIGFkZCBpdAotCS8vIHRvIHRoZSBnaXZlbiBSZXNvdXJjZU1hbmFnZXIKLQkvLyAqCi0JLy8gKiBAcGFyYW0gZQotCS8vICogQHJldHVybiBuZXdseSBhZGRlZCBSZXNvdXJjZURlc2NyaXB0b3IKLQkvLyAqLwotCS8vIHByaXZhdGUgc3RhdGljIFJlc291cmNlRGVzY3JpcHRvcgotCS8vIGNyZWF0ZVJlc291cmNlRGVzY3JpcHRvcihSZXNvdXJjZU1hbmFnZXIgcmVzTWdyLCBNZXRob2RFbGVtZW50IGUpIHsKLQkvLyByZXR1cm4gY3JlYXRlUmVzb3VyY2VEZXNjcmlwdG9yKHJlc01nciwgZS5nZXRHdWlkKCksIGNyZWF0ZUZpbGVVUkkoZSkpOwotCS8vIH0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgUmVzb3VyY2VEZXNjcmlwdG9yIHdpdGggdGhlIGdpdmVuIGlkIGFuZCByZXNvbHZlZFVSSSwgdGhlbgotCSAqIGFkZHMgaXQgdG8gdGhlIGdpdmVuIHJlc01ncgotCSAqIAotCSAqIEBwYXJhbSByZXNNZ3IKLQkgKiBAcGFyYW0gaWQKLQkgKiBAcGFyYW0gcmVzb2x2ZWRVUkkKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgUmVzb3VyY2VEZXNjcmlwdG9yIGNyZWF0ZVJlc291cmNlRGVzY3JpcHRvcigKLQkJCVJlc291cmNlTWFuYWdlciByZXNNZ3IsIFN0cmluZyBpZCwgVVJJIHJlc29sdmVkVVJJKSB7Ci0JCVJlc291cmNlRGVzY3JpcHRvciByZXNEZXNjID0gUmVzb3VyY2VtYW5hZ2VyRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkuY3JlYXRlUmVzb3VyY2VEZXNjcmlwdG9yKCk7Ci0JCXJlc0Rlc2Muc2V0SWQoaWQpOwotCQlyZXNNZ3IuZ2V0UmVzb3VyY2VEZXNjcmlwdG9ycygpLmFkZChyZXNEZXNjKTsKLQkJcmVzRGVzYy5zZXRSZXNvbHZlZFVSSShyZXNvbHZlZFVSSSk7Ci0JCXJldHVybiByZXNEZXNjOwotCX0KLQotCS8vIHN0YXRpYyB2b2lkIHNldFVyaShNdWx0aUZpbGVVUklDb252ZXJ0ZXIgdXJpQ29udmVydGVyLCBNZXRob2RFbGVtZW50IGUsCi0JLy8gVVJJIHVyaSkgewotCS8vIHNldFVyaSh1cmlDb252ZXJ0ZXIsIGUsIHVyaSwgZmFsc2UpOwotCS8vIH0KLQotCS8vIHN0YXRpYyB2b2lkIHNldFVyaShNdWx0aUZpbGVVUklDb252ZXJ0ZXIgdXJpQ29udmVydGVyLCBNZXRob2RFbGVtZW50IGUsCi0JLy8gVVJJIHVyaSwgYm9vbGVhbiBzYXZlTm93KSB7Ci0JLy8gUmVzb3VyY2VNYW5hZ2VyIHJlc01nciA9IHVyaUNvbnZlcnRlci5nZXRSZXNvdXJjZU1hbmFnZXIoKTsKLQkvLyBpZihyZXNNZ3IgPT0gbnVsbCkgewotCS8vIHJlc01nciA9IFJlc291cmNlbWFuYWdlckZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVJlc291cmNlTWFuYWdlcigpOwotCS8vIHVyaUNvbnZlcnRlci5zZXRSZXNvdXJjZU1hbmFnZXIocmVzTWdyKTsKLQkvLyB9Ci0JLy8gc2V0VXJpKHJlc01nciwgZSwgdXJpKTsKLQkvLyByZXNNZ3IuZVJlc291cmNlKCk7Ci0JLy8gfQotCi0JLyoqCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0R3VpZChNZXRob2RFbGVtZW50IGUpIHsKLQkJaWYgKGUuZ2V0R3VpZCgpID09IG51bGwgfHwgZS5nZXRHdWlkKCkudHJpbSgpLmxlbmd0aCgpID09IDApIHsKLQkJCWUuc2V0R3VpZChFY29yZVV0aWwuZ2VuZXJhdGVVVUlEKCkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU2F2ZXMgdGhlIGdpdmVuIE1ldGhvZEVsZW1lbnQgaW4gaXRzIG93biBmaWxlIHdoaWxlIHN0aWxsIHByZXNlcnZpbmcgdGhlCi0JICogZXhpc3RpbmcgY29udGFpbm1lbnQgYXNzb2NpYXRpb24gaWYgdGhlcmUgaXMgYW55Ci0JICogCi0JICogQHBhcmFtIGUKLQkgKiBAdGhyb3dzIExpYnJhcnlSZXNvdXJjZUV4Y2VwdGlvbiAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2F2ZShNZXRob2RFbGVtZW50IGUsIE1hcCBvcHRpb25zKSB0aHJvd3MgTGlicmFyeVJlc291cmNlRXhjZXB0aW9uIHsKLQkJTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsIHJlc291cmNlID0gKE11bHRpRmlsZVhNSVJlc291cmNlSW1wbCkgZQotCQkJCS5lUmVzb3VyY2UoKTsKLQkJTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsIHJlc291cmNlU2V0ID0gKE11bHRpRmlsZVJlc291cmNlU2V0SW1wbCkgcmVzb3VyY2UKLQkJCQkuZ2V0UmVzb3VyY2VTZXQoKTsKLQkJaWYgKG9wdGlvbnMgPT0gbnVsbCkgewotCQkJb3B0aW9ucyA9IHJlc291cmNlU2V0LmdldERlZmF1bHRTYXZlT3B0aW9ucygpOwotCQl9Ci0JCUVPYmplY3QgY29udGFpbmVyID0gZS5lQ29udGFpbmVyKCk7Ci0KLQkJU2V0IG1vZGlmaWVkUmVzb3VyY2VzID0gbmV3IEhhc2hTZXQoKTsKLQkJb3B0aW9ucy5wdXQoTXVsdGlGaWxlWE1JU2F2ZUltcGwuTU9ESUZJRURfUkVTT1VSQ0VfU0VULAotCQkJCW1vZGlmaWVkUmVzb3VyY2VzKTsKLQkJdHJ5IHsKLQkJCVVSSSB1cmkgPSBNdWx0aUZpbGVTYXZlVXRpbC5jcmVhdGVVUkkoZSwgcmVzb3VyY2VTZXQpOwotCQkJYm9vbGVhbiBjcmVhdGVSZXNvdXJjZSA9IHJlc291cmNlID09IG51bGwKLQkJCQkJfHwgKGNvbnRhaW5lciAhPSBudWxsICYmIHJlc291cmNlID09IGNvbnRhaW5lci5lUmVzb3VyY2UoKSk7Ci0JCQlpZiAoY3JlYXRlUmVzb3VyY2UpIHsKLQkJCQlNdWx0aUZpbGVTYXZlVXRpbC5zYXZlKGUsIHVyaSwgb3B0aW9ucyk7Ci0JCQl9IGVsc2UgewotCQkJCVVSSSBvbGRVcmkgPSByZXNvdXJjZS5nZXRVUkkoKTsKLQkJCQlpZiAoIW9sZFVyaS5lcXVhbHModXJpKSkgewotCi0JCQkJCS8vIHJlc291cmNlJ3MgbG9jYXRpb24gaXMgY2hhbmdlZC4KLQkJCQkJLy8gbW92ZSB0aGUgcmVzb3VyY2UsIHRoZW4gY2hhbmdlIGl0cyBVUkkgaWYgdGhlIHJlc291cmNlCi0JCQkJCS8vIG1vdmUgaXMgc3VjY2Vzc2Z1bC4KLQkJCQkJLy8gICAKLQkJCQkJaWYgKEZpbGVNYW5hZ2VyLmdldEluc3RhbmNlKCkubW92ZShvbGRVcmkudG9GaWxlU3RyaW5nKCksCi0JCQkJCQkJdXJpLnRvRmlsZVN0cmluZygpKSkgewotCQkJCQkJLy8gTXVsdGlGaWxlVVJJQ29udmVydGVyIHVyaUNvbnZlcnRlciA9Ci0JCQkJCQkvLyAoTXVsdGlGaWxlVVJJQ29udmVydGVyKQotCQkJCQkJLy8gcmVzb3VyY2UuZ2V0UmVzb3VyY2VTZXQoKS5nZXRVUklDb252ZXJ0ZXIoKTsKLQkJCQkJCS8vIE11bHRpRmlsZVNhdmVVdGlsLnNldFVyaSh1cmlDb252ZXJ0ZXIsIGUsIHVyaSk7Ci0JCQkJCQlyZXNvdXJjZS5zZXRVUkkodXJpKTsKLQkJCQkJCXVwZGF0ZVVSSU1hcHBpbmdzKHJlc291cmNlLCBtb2RpZmllZFJlc291cmNlcyk7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQlpZiAocmVzb3VyY2UuaXNNb2RpZmllZCgpKSB7Ci0JCQkJCU11bHRpRmlsZVNhdmVVdGlsLnNhdmUocmVzb3VyY2UsIG9wdGlvbnMpOwotCQkJCX0KLQkJCX0KLQotCQkJcmVzb3VyY2VTZXQuc2F2ZU1vZGlmaWVkUmVzb3VyY2VzKG9wdGlvbnMpOwotCQl9IGZpbmFsbHkgewotCi0JCX0KLQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFVSSSBjcmVhdGVVUkkoTWV0aG9kRWxlbWVudCBlLCBSZXNvdXJjZVNldCByZXNvdXJjZVNldCkgewotCQlVUkkgdXJpID0gbnVsbDsKLQkJaWYocmVzb3VyY2VTZXQgaW5zdGFuY2VvZiBNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwpIHsKLQkJCUlVUklQcm92aWRlciB1cmlQcm92aWRlciA9ICgoTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsKXJlc291cmNlU2V0KS5nZXRVUklQcm92aWRlcigpOwotCQkJaWYodXJpUHJvdmlkZXIgIT0gbnVsbCkgewotCQkJCXVyaSA9IHVyaVByb3ZpZGVyLmdldFVSSShlKTsKLQkJCX0KLQkJfQotCQlpZih1cmkgPT0gbnVsbCkgewotCQkJdXJpID0gY3JlYXRlRmlsZVVSSShlKTsKLQkJfQotCQlyZXR1cm4gdXJpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBzYXZlKFJlc291cmNlU2V0IHJlc291cmNlU2V0LCBNZXRob2RFbGVtZW50IGUsCi0JCQlNYXAgb3B0aW9ucykgewotCQlVUkkgdXJpID0gY3JlYXRlVVJJKGUsIHJlc291cmNlU2V0KTsKLQkJc2F2ZShyZXNvdXJjZVNldCwgZSwgdXJpLCBvcHRpb25zKTsKLQl9Ci0KLQlzdGF0aWMgdm9pZCBhZGp1c3RMb2NhdGlvbihSZXNvdXJjZSByZXNvdXJjZSwgU2V0IG1vZGlmaWVkUmVzb3VyY2VzKSB7Ci0JCU1ldGhvZEVsZW1lbnQgZSA9IFBlcnNpc3RlbmNlVXRpbC5nZXRNZXRob2RFbGVtZW50KHJlc291cmNlKTsKLQkJaWYgKGUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJVVJJIG5ld0ZpbGUgPSBjcmVhdGVVUkkoZSwgcmVzb3VyY2UuZ2V0UmVzb3VyY2VTZXQoKSk7Ci0JCWlmIChuZXdGaWxlICE9IG51bGwgJiYgYWRqdXN0TG9jYXRpb24ocmVzb3VyY2UsIG5ld0ZpbGUpKSB7Ci0JCQlyZXNvdXJjZS5zZXRVUkkobmV3RmlsZSk7Ci0JCQl1cGRhdGVVUklNYXBwaW5ncygoTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsKSByZXNvdXJjZSwKLQkJCQkJbW9kaWZpZWRSZXNvdXJjZXMpOwotCQl9Ci0JfQotCi0Jc3RhdGljIFVSSSBnZXROZXdVUkkoTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsIHJlc291cmNlKSB7Ci0JCU1ldGhvZEVsZW1lbnQgZSA9IFBlcnNpc3RlbmNlVXRpbC5nZXRNZXRob2RFbGVtZW50KHJlc291cmNlKTsKLQkJaWYgKGUgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJVVJJIG5ld0ZpbGUgPSBjcmVhdGVVUkkoZSwgcmVzb3VyY2UuZ2V0UmVzb3VyY2VTZXQoKSk7Ci0JCWlmIChuZXdGaWxlICE9IG51bGwgJiYgYWRqdXN0TG9jYXRpb25SZXF1aXJlZChyZXNvdXJjZSwgbmV3RmlsZSkpIHsKLQkJCXJldHVybiBuZXdGaWxlOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXN0YXRpYyBib29sZWFuIHByZXBhcmVBZGp1c3RMb2NhdGlvbihNdWx0aUZpbGVYTUlSZXNvdXJjZUltcGwgcmVzb3VyY2UsCi0JCQlTZXQgbW9kaWZpZWRSZXNvdXJjZXMpIHsKLQkJVVJJIG5ld0ZpbGUgPSBnZXROZXdVUkkocmVzb3VyY2UpOwotCQlpZiAobmV3RmlsZSAhPSBudWxsKSB7Ci0JCQlyZXNvdXJjZS5iYWNrVXBVUkkoKTsKLQkJCXJlc291cmNlLnNldEZpbmFsVVJJKG5ld0ZpbGUpOwotCQkJdXBkYXRlVVJJTWFwcGluZ3MoKE11bHRpRmlsZVhNSVJlc291cmNlSW1wbCkgcmVzb3VyY2UsCi0JCQkJCW1vZGlmaWVkUmVzb3VyY2VzLCBmYWxzZSk7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0R3VpZChPYmplY3QgZSkgewotCQlpZihlIGluc3RhbmNlb2YgSW50ZXJuYWxFT2JqZWN0KSB7Ci0JCQlJbnRlcm5hbEVPYmplY3QgbyA9IChJbnRlcm5hbEVPYmplY3QpIGU7Ci0JCQlpZihvLmVJc1Byb3h5KCkpIHsKLQkJCQlVUkkgdXJpID0gby5lUHJveHlVUkkoKTsKLQkJCQlpZih1cmkgIT0gbnVsbCAmJiBNdWx0aUZpbGVVUklDb252ZXJ0ZXIuU0NIRU1FLmVxdWFscyh1cmkuc2NoZW1lKCkpKSB7Ci0JCQkJCVN0cmluZyBndWlkID0gdXJpLmZyYWdtZW50KCk7Ci0JCQkJCWlmKGd1aWQgIT0gbnVsbCkgewotCQkJCQkJcmV0dXJuIGd1aWQ7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKGUgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQlyZXR1cm4gKChNZXRob2RFbGVtZW50KSBlKS5nZXRHdWlkKCk7Ci0JCX0gZWxzZSBpZiAoZSBpbnN0YW5jZW9mIFJlc291cmNlTWFuYWdlcikgewotCQkJcmV0dXJuICgoUmVzb3VyY2VNYW5hZ2VyKSBlKS5nZXRHdWlkKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0Jc3RhdGljIGJvb2xlYW4gYWRqdXN0TG9jYXRpb25SZXF1aXJlZChNdWx0aUZpbGVYTUlSZXNvdXJjZUltcGwgcmVzb3VyY2UsCi0JCQlVUkkgbmV3VVJJKSB7Ci0JCUZpbGUgb2xkRmlsZSA9IG5ldyBGaWxlKHJlc291cmNlLmdldEZpbmFsVVJJKCkudG9GaWxlU3RyaW5nKCkpOwotCQlGaWxlIG5ld0ZpbGUgPSBuZXcgRmlsZShuZXdVUkkudG9GaWxlU3RyaW5nKCkpOwotCQlyZXR1cm4gIW9sZEZpbGUuZXF1YWxzKG5ld0ZpbGUpOwotCX0KLQotCS8qKgotCSAqIENoZWNrcyBpZiB0aGUgcmVzb3VyY2UncyBVUkkgaGFzIGJlZW4gY2hhbmdlZCBhbmQgYWRqdXN0IHRoZSByZXNvdXJjZSdzCi0JICogbG9jYXRpb24uCi0JICogCi0JICogQHBhcmFtIG9sZFVyaQotCSAqIEBwYXJhbSBuZXdVcmkKLQkgKi8KLQlzdGF0aWMgYm9vbGVhbiBhZGp1c3RMb2NhdGlvbihSZXNvdXJjZSByZXNvdXJjZSwgVVJJIG5ld1VyaSkgewotCQlGaWxlIG9sZEZpbGUgPSBuZXcgRmlsZShyZXNvdXJjZS5nZXRVUkkoKS50b0ZpbGVTdHJpbmcoKSk7Ci0JCUZpbGUgbmV3RmlsZSA9IG5ldyBGaWxlKG5ld1VyaS50b0ZpbGVTdHJpbmcoKSk7Ci0JCWlmIChvbGRGaWxlLmVxdWFscyhuZXdGaWxlKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiBtb3ZlKHJlc291cmNlLCBvbGRGaWxlLCBuZXdGaWxlKTsKLQl9Ci0KLQlzdGF0aWMgYm9vbGVhbiBtb3ZlKFJlc291cmNlIHJlc291cmNlLCBGaWxlIG9sZEZpbGUsIEZpbGUgbmV3RmlsZSkgewotCQlib29sZWFuIHJldCA9IHRydWU7Ci0JCWlmIChvbGRGaWxlLmVxdWFscyhuZXdGaWxlKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCU9iamVjdCBvYmogPSBQZXJzaXN0ZW5jZVV0aWwuZ2V0TWV0aG9kRWxlbWVudChyZXNvdXJjZSk7Ci0JCWlmIChoYXNPd25Gb2xkZXIob2JqKSkgewotCQkJU3RyaW5nIG9sZERpciA9IG9sZEZpbGUuZ2V0UGFyZW50RmlsZSgpLnRvU3RyaW5nKCk7Ci0JCQlpZiAoIW9sZEZpbGUuZ2V0UGFyZW50RmlsZSgpLmVxdWFscyhuZXdGaWxlLmdldFBhcmVudEZpbGUoKSkpIHsKLQkJCQlpZiAoRmlsZU1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5yZW5hbWUob2xkRmlsZS5nZXRQYXJlbnRGaWxlKCksCi0JCQkJCQluZXdGaWxlLmdldFBhcmVudEZpbGUoKSkpIHsKLQkJCQkJaWYgKERFQlVHKSB7Ci0JCQkJCQlTeXN0ZW0ub3V0Ci0JCQkJCQkJCS5wcmludGxuKCJEaXJlY3RvcnkgJyIgKyBvbGREaXIgKyAiJyBpcyBzdWNjZXNzZnVsbHkgbW92ZWQgdG8gJyIgKyBuZXdGaWxlLmdldFBhcmVudEZpbGUoKSArICInIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQlyZXQgPSBmYWxzZTsKLQkJCQkJaWYgKERFQlVHKSB7Ci0JCQkJCQlTeXN0ZW0ub3V0Ci0JCQkJCQkJCS5wcmludGxuKCJDb3VsZCBub3QgbW92ZSBkaXJlY3RvcnkgJyIgKyBvbGREaXIgKyAiJyB0byAnIiArIG5ld0ZpbGUuZ2V0UGFyZW50RmlsZSgpICsgIiciKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWlmICghb2xkRmlsZS5nZXROYW1lKCkuZXF1YWxzKG5ld0ZpbGUuZ2V0TmFtZSgpKSkgewotCQkJCW9sZEZpbGUgPSBuZXcgRmlsZShuZXdGaWxlLmdldFBhcmVudEZpbGUoKSwgb2xkRmlsZS5nZXROYW1lKCkpOwotCQkJCWlmIChGaWxlTWFuYWdlci5nZXRJbnN0YW5jZSgpLnJlbmFtZShvbGRGaWxlLCBuZXdGaWxlKSkgewotCQkJCQlpZiAoREVCVUcpIHsKLQkJCQkJCVN5c3RlbS5vdXQKLQkJCQkJCQkJLnByaW50bG4oIkZpbGUgJyIgKyBvbGRGaWxlICsgIicgaXMgc3VjY2Vzc2Z1bGx5IG1vdmVkIHRvICciICsgbmV3RmlsZSArICInIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQlyZXQgPSBmYWxzZTsKLQkJCQkJaWYgKERFQlVHKSB7Ci0JCQkJCQlTeXN0ZW0ub3V0Ci0JCQkJCQkJCS5wcmludGxuKCJDb3VsZCBub3QgbW92ZSBmaWxlICciICsgb2xkRmlsZSArICInIHRvICciICsgbmV3RmlsZSArICInIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gcmV0OwotCQl9IGVsc2UgaWYgKG9sZEZpbGUuZXhpc3RzKCkpIC8qIGlmKG9sZEZpbGUuZ2V0UGFyZW50RmlsZSgpLmVxdWFscyhuZXdGaWxlLmdldFBhcmVudEZpbGUoKSkpICovewotCQkJU3RyaW5nIG9sZEZpbGVTdHIgPSBvbGRGaWxlLnRvU3RyaW5nKCk7Ci0JCQlpZiAoRmlsZU1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5yZW5hbWUob2xkRmlsZSwgbmV3RmlsZSkpIHsKLQkJCQlpZiAoREVCVUcpIHsKLQkJCQkJU3lzdGVtLm91dAotCQkJCQkJCS5wcmludGxuKCJGaWxlICciICsgb2xkRmlsZVN0ciArICInIGlzIHN1Y2Nlc3NmdWxseSBtb3ZlZCB0byAnIiArIG5ld0ZpbGUgKyAiJyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCX0KLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKERFQlVHKSB7Ci0JCQkJCVN5c3RlbS5vdXQKLQkJCQkJCQkucHJpbnRsbigiQ291bGQgbm90IG1vdmUgZmlsZSAnIiArIG9sZEZpbGVTdHIgKyAiJyB0byAnIiArIG5ld0ZpbGUgKyAiJyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIHJlc01ncgotCSAqIEBwYXJhbSBndWlkCi0JICogQHBhcmFtIGV4Y2x1ZGVkUmVzTWFuYWdlcnMKLQkgKiAgICAgICAgICAgIFJlc291cmNlTWFuYWdlciB0aGF0IGFyZSBleGNsdWRlZCBmcm9tIHRoaXMgc2VhcmNoCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgUmVzb3VyY2VEZXNjcmlwdG9yIGZpbmRSZXNvdXJjZURlc2NyaXB0b3IoCi0JCQlSZXNvdXJjZU1hbmFnZXIgcmVzTWdyLCBTdHJpbmcgZ3VpZCwKLQkJCUNvbGxlY3Rpb24gZXhjbHVkZWRSZXNNYW5hZ2VycywgYm9vbGVhbiByZXNvbHZlUHJveHkpIHsKLQkJdHJ5IHsKLQkJCVJlc291cmNlRGVzY3JpcHRvciBkZXNjID0gcmVzTWdyLmdldFJlc291cmNlRGVzY3JpcHRvcihndWlkKTsKLQkJCWlmIChkZXNjICE9IG51bGwpCi0JCQkJcmV0dXJuIGRlc2M7Ci0JCQkvLyBUT0RPOiAoUGhvbmcpIHBlcmZvcm1hbmNlIGltcHJvdmVtZW50IG5lZWRlZCB0byBhdm9pZCBsb2FkaW5nCi0JCQkvLyByZXNvdXJjZXMgZXhjZXNzaXZlbHkKLQkJCS8vCi0JCQlJdGVyYXRvciBpdGVyOwotCQkJaWYgKHJlc29sdmVQcm94eSkgewotCQkJCWl0ZXIgPSBuZXcgQXJyYXlMaXN0KHJlc01nci5nZXRTdWJNYW5hZ2VycygpKS5pdGVyYXRvcigpOwotCQkJfSBlbHNlIHsKLQkJCQlpdGVyID0gKChJbnRlcm5hbEVMaXN0KSByZXNNZ3IuZ2V0U3ViTWFuYWdlcnMoKSkKLQkJCQkJCS5iYXNpY0l0ZXJhdG9yKCk7Ci0JCQl9Ci0JCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCQlSZXNvdXJjZU1hbmFnZXIgbWdyID0gKFJlc291cmNlTWFuYWdlcikgaXRlci5uZXh0KCk7Ci0JCQkJaWYgKG1nciAhPSBudWxsCi0JCQkJCQkmJiAhbWdyLmVJc1Byb3h5KCkKLQkJCQkJCSYmIChleGNsdWRlZFJlc01hbmFnZXJzID09IG51bGwgfHwgIWV4Y2x1ZGVkUmVzTWFuYWdlcnMKLQkJCQkJCQkJLmNvbnRhaW5zKG1ncikpKSB7Ci0JCQkJCWRlc2MgPSBmaW5kUmVzb3VyY2VEZXNjcmlwdG9yKG1nciwgZ3VpZCwKLQkJCQkJCQlleGNsdWRlZFJlc01hbmFnZXJzLCByZXNvbHZlUHJveHkpOwotCQkJCQlpZiAoZGVzYyAhPSBudWxsKQotCQkJCQkJcmV0dXJuIGRlc2M7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIG51bGw7Ci0JCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkJdGhyb3cgZTsKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSByZXNNZ3IKLQkgKiBAcmV0dXJuIGhvdyBtYW55IFJlc291cmNlRGVzY3JpcHRvcnMgYXJlIGluIHRoZSByZXNNZ3IgYW5kIGl0cwotCSAqICAgICAgICAgU3ViTWFuYWdlcnMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBnZXRDb3VudFJlc291cmNlRGVzY3JpcHRvcnMoUmVzb3VyY2VNYW5hZ2VyIHJlc01ncikgewotCQlpbnQgY291bnQgPSByZXNNZ3IuZ2V0UmVzb3VyY2VEZXNjcmlwdG9ycygpLnNpemUoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gcmVzTWdyLmdldFN1Yk1hbmFnZXJzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlSZXNvdXJjZU1hbmFnZXIgbWdyID0gKFJlc291cmNlTWFuYWdlcikgaXRlci5uZXh0KCk7Ci0JCQljb3VudCArPSBnZXRDb3VudFJlc291cmNlRGVzY3JpcHRvcnMobWdyKTsKLQkJfQotCQlyZXR1cm4gY291bnQ7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgcmVzb3VyY2UgZGVzY3JpcHRvciBmb3IgdGhlIGdpdmVuIHJlc291cmNlCi0JICogCi0JICogQHBhcmFtIHJlc291cmNlCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgUmVzb3VyY2VEZXNjcmlwdG9yIGdldFJlc291cmNlRGVzY3JpcHRvcihSZXNvdXJjZSByZXNvdXJjZSkgewotCQlSZXNvdXJjZU1hbmFnZXIgY29udGFpbmVyUmVzTWdyID0gbnVsbDsKLQkJTWV0aG9kRWxlbWVudCBtZSA9IG51bGw7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHJlc291cmNlLmdldENvbnRlbnRzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZWxlbWVudCA9IGl0ZXIubmV4dCgpOwotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RMaWJyYXJ5KSB7Ci0JCQkJUmVzb3VyY2VNYW5hZ2VyIHJlc01nciA9IGdldFJlc291cmNlTWFuYWdlcihyZXNvdXJjZSk7Ci0JCQkJaWYgKHJlc01nciAhPSBudWxsKSB7Ci0JCQkJCVJlc291cmNlRGVzY3JpcHRvciBkZXNjID0gcmVzTWdyCi0JCQkJCQkJLmdldFJlc291cmNlRGVzY3JpcHRvcigoKE1ldGhvZEVsZW1lbnQpIGVsZW1lbnQpCi0JCQkJCQkJCQkuZ2V0R3VpZCgpKTsKLQkJCQkJLy8gaGFjayB0byBhZGQgbWlzc2luZyBSZXNvdXJjZURlc2NyaXB0b3IgZm9yIGxpYnJhcnkncwotCQkJCQkvLyByZXNvdXJjZQotCQkJCQkvLwotCQkJCQlpZiAoZGVzYyA9PSBudWxsKSB7Ci0JCQkJCQlkZXNjID0gcmVnaXN0ZXJXaXRoUmVzb3VyY2VNYW5hZ2VyKHJlc01nciwgZWxlbWVudCwKLQkJCQkJCQkJKChNdWx0aUZpbGVYTUlSZXNvdXJjZUltcGwpIHJlc291cmNlKQotCQkJCQkJCQkJCS5nZXRGaW5hbFVSSSgpKTsKLQkJCQkJfQotCQkJCQlyZXR1cm4gZGVzYzsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAobWUgPT0gbnVsbCAmJiBlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJCW1lID0gKE1ldGhvZEVsZW1lbnQpIGVsZW1lbnQ7Ci0JCQl9Ci0JCQlpZiAoY29udGFpbmVyUmVzTWdyID09IG51bGwgJiYgZWxlbWVudCBpbnN0YW5jZW9mIEludGVybmFsRU9iamVjdCkgewotCQkJCUVPYmplY3QgY29udGFpbmVyID0gZ2V0Q29udGFpbmVyV2l0aERpcmVjdFJlc291cmNlKChJbnRlcm5hbEVPYmplY3QpIGVsZW1lbnQpOwotCQkJCWlmIChjb250YWluZXIgIT0gbnVsbCkgewotCQkJCQljb250YWluZXJSZXNNZ3IgPSBnZXRSZXNvdXJjZU1hbmFnZXIoY29udGFpbmVyLmVSZXNvdXJjZSgpKTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAobWUgIT0gbnVsbCAmJiBjb250YWluZXJSZXNNZ3IgIT0gbnVsbCkgewotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0KLQkJaWYobWUgIT0gbnVsbCkgewotCQkJaWYgKGNvbnRhaW5lclJlc01nciAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIGNvbnRhaW5lclJlc01nci5nZXRSZXNvdXJjZURlc2NyaXB0b3IoKChNZXRob2RFbGVtZW50KSBtZSkKLQkJCQkJCS5nZXRHdWlkKCkpOwotCQkJfQotCQkJZWxzZSBpZihtZS5lQ29udGFpbmVyKCkgPT0gbnVsbCkgewotCQkJCS8vIHRoaXMgZWxlbWVudCBoYXMgYmVlbiBsb2FkZWQgYmVmb3JlIGl0cyBjb250YWluZXIgYWNjZXNzZWQgaXQKLQkJCQkvLyB0cnkgdG8gZmluZCBpdHMgcmVzb3VyY2UgZGVzY3JpcHRvciB1c2luZyByb290IHJlc291cmNlIG1hbmFnZXIKLQkJCQkvLwotCQkJCVJlc291cmNlU2V0IHJlc291cmNlU2V0ID0gcmVzb3VyY2UuZ2V0UmVzb3VyY2VTZXQoKTsKLQkJCQlpZihyZXNvdXJjZVNldCBpbnN0YW5jZW9mIE11bHRpRmlsZVJlc291cmNlU2V0SW1wbCkgewotCQkJCQlSZXNvdXJjZU1hbmFnZXIgcm9vdFJlc01nciA9ICgoTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsKXJlc291cmNlU2V0KS5nZXRSb290UmVzb3VyY2VNYW5hZ2VyKCk7Ci0JCQkJCUl0ZXJhdG9yIGl0ZXIgPSBuZXcgQWJzdHJhY3RUcmVlSXRlcmF0b3Iocm9vdFJlc01ncikgewotCi0JCQkJCQkvKioKLQkJCQkJCSAqIENvbW1lbnQgZm9yIDxjb2RlPnNlcmlhbFZlcnNpb25VSUQ8L2NvZGU+Ci0JCQkJCQkgKi8KLQkJCQkJCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JCQkJCQlwcm90ZWN0ZWQgSXRlcmF0b3IgZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQkJCQkJCWlmKG9iamVjdCBpbnN0YW5jZW9mIFJlc291cmNlTWFuYWdlcikgewotCQkJCQkJCQlBcnJheUxpc3QgY2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCQkJCVJlc291cmNlTWFuYWdlciByZXNNZ3IgPSAoUmVzb3VyY2VNYW5hZ2VyKW9iamVjdDsgCi0JCQkJCQkJCWNoaWxkcmVuLmFkZEFsbChyZXNNZ3IuZ2V0UmVzb3VyY2VEZXNjcmlwdG9ycygpKTsKLQkJCQkJCQkJY2hpbGRyZW4uYWRkQWxsKHJlc01nci5nZXRTdWJNYW5hZ2VycygpKTsKLQkJCQkJCQkJcmV0dXJuIGNoaWxkcmVuLml0ZXJhdG9yKCk7Ci0JCQkJCQkJfQotCQkJCQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNULml0ZXJhdG9yKCk7Ci0JCQkJCQl9Ci0JCQkJCQkKLQkJCQkJfTsKLQkJCQkJVVJJIHVyaSA9IGdldEZpbmFsVVJJKHJlc291cmNlKTsKLQkJCQkJd2hpbGUoaXRlci5oYXNOZXh0KCkpIHsKLQkJCQkJCU9iamVjdCBvID0gaXRlci5uZXh0KCk7Ci0JCQkJCQlpZihvIGluc3RhbmNlb2YgUmVzb3VyY2VEZXNjcmlwdG9yKSB7Ci0JCQkJCQkJUmVzb3VyY2VEZXNjcmlwdG9yIHJlc0Rlc2MgPSAoUmVzb3VyY2VEZXNjcmlwdG9yKSBvOwotCQkJCQkJCWlmKHVyaS5lcXVhbHMocmVzRGVzYy5nZXRSZXNvbHZlZFVSSSgpKSkgewotCQkJCQkJCQlyZXR1cm4gcmVzRGVzYzsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLy8gcHVibGljIHN0YXRpYyBSZXNvdXJjZURlc2NyaXB0b3IgZmluZFJlc291cmNlRGVzY3JpcHRvcihNZXRob2RFbGVtZW50IGUpCi0JLy8gewotCS8vIFJlc291cmNlTWFuYWdlciByZXNNZ3IgPSBudWxsOwotCS8vIGlmKGUuZVJlc291cmNlKCkgIT0gbnVsbCkgewotCS8vIHJlc01nciA9IGdldFJlc291cmNlTWFuYWdlcihlLmVSZXNvdXJjZSgpKTsKLQkvLyB9Ci0JLy8gUmVzb3VyY2VEZXNjcmlwdG9yIGRlc2MgPSBudWxsOwotCS8vIENvbGxlY3Rpb24gZXhjbHVkZWRSZXNNZ3JzID0gbnVsbDsKLQkvLyBpZihyZXNNZ3IgIT0gbnVsbCkgewotCS8vIGRlc2MgPSBmaW5kUmVzb3VyY2VEZXNjcmlwdG9yKHJlc01nciwgZS5nZXRHdWlkKCkpOwotCS8vIGlmKGRlc2MgIT0gbnVsbCkgcmV0dXJuIGRlc2M7Ci0JLy8gZXhjbHVkZWRSZXNNZ3JzID0gQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChyZXNNZ3IpOwotCS8vIH0KLQkvLwkJCi0JLy8gTWV0aG9kTGlicmFyeSBsaWIgPSBVbWFVdGlsLmdldE1ldGhvZExpYnJhcnkoZSk7Ci0JLy8gcmVzTWdyID0gZ2V0UmVzb3VyY2VNYW5hZ2VyKGxpYi5lUmVzb3VyY2UoKSk7Ci0JLy8JCQotCS8vIHJldHVybiBmaW5kUmVzb3VyY2VEZXNjcmlwdG9yKHJlc01nciwgZS5nZXRHdWlkKCksIGV4Y2x1ZGVkUmVzTWdycyk7Ci0JLy8gfQotCi0JLyoqCi0JICogR2V0cyB0aGUgUmVzb3VyY2VNYW5hZ2VyIGluIHRoZSBjb250ZW50cyBvZiB0aGUgZ2l2ZW4gcmVzb3VyY2UKLQkgKiAKLQkgKiBAcGFyYW0gcmVzb3VyY2UKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBSZXNvdXJjZU1hbmFnZXIgZ2V0UmVzb3VyY2VNYW5hZ2VyKFJlc291cmNlIHJlc291cmNlKSB7Ci0JCVJlc291cmNlTWFuYWdlciByZXNNZ3IgPSBudWxsOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSByZXNvdXJjZS5nZXRDb250ZW50cygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGVsZW1lbnQgPSAoT2JqZWN0KSBpdGVyLm5leHQoKTsKLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgUmVzb3VyY2VNYW5hZ2VyKSB7Ci0JCQkJcmVzTWdyID0gKFJlc291cmNlTWFuYWdlcikgZWxlbWVudDsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCi0JCXJldHVybiByZXNNZ3I7Ci0JfQotCi0Jc3RhdGljIEludGVybmFsRU9iamVjdCBnZXRDb250YWluZXJXaXRoRGlyZWN0UmVzb3VyY2UoSW50ZXJuYWxFT2JqZWN0IG9iaikgewotCQlpZiAob2JqLmVDb250YWluZXIoKSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCUludGVybmFsRU9iamVjdCBjb250YWluZXIgPSAoSW50ZXJuYWxFT2JqZWN0KSAoKEludGVybmFsRU9iamVjdCkgb2JqCi0JCQkJLmVDb250YWluZXIoKSk7Ci0JCWlmIChjb250YWluZXIuZURpcmVjdFJlc291cmNlKCkgIT0gbnVsbCkgewotCQkJcmV0dXJuIGNvbnRhaW5lcjsKLQkJfQotCQlyZXR1cm4gZ2V0Q29udGFpbmVyV2l0aERpcmVjdFJlc291cmNlKGNvbnRhaW5lcik7Ci0JfQotCi0Jc3RhdGljIFN0cmluZyBnZXRIUkVGKFJlc291cmNlIHJlc291cmNlLCBPYmplY3Qgb2JqKSB7Ci0JCU1ldGhvZEVsZW1lbnQgb3duZXIgPSBQZXJzaXN0ZW5jZVV0aWwuZ2V0TWV0aG9kRWxlbWVudChyZXNvdXJjZSk7Ci0JCXJldHVybiBNdWx0aUZpbGVVUklDb252ZXJ0ZXIuY3JlYXRlVVJJKG93bmVyLmdldEd1aWQoKSkuYXBwZW5kRnJhZ21lbnQoCi0JCQkJZ2V0R3VpZChvYmopKS50b1N0cmluZygpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEJhY2t1cEZpbGVTdWZmaXgoKSB7Ci0JCXJldHVybiAiXyIgKyBkYXRlRm9ybWF0dGVyLmZvcm1hdChDYWxlbmRhci5nZXRJbnN0YW5jZSgpLmdldFRpbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBSZXNvbHZlIHRoZSBwcm94eSBpZGVudGlmaWVkIGJ5IHRoZSBnaXZlbiA8Y29kZT5ndWlkPC9jb2RlPiB3aXRob3V0Ci0JICogbG9hZGluZyBhbGwgb3RoZXIgcHJveGllcyBpbiA8Y29kZT5wYXJlbnQ8L2NvZGU+Ci0JICogCi0JICogQHBhcmFtIGd1aWQKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZXNvbHZlUHJveGllcyhDb2xsZWN0aW9uIEdVSURzLCBFT2JqZWN0IHBhcmVudCkgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gcGFyZW50LmVDbGFzcygpLmdldEVBbGxDb250YWlubWVudHMoKQotCQkJCS5pdGVyYXRvcigpOyAhR1VJRHMuaXNFbXB0eSgpICYmIGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgaXRlcmF0b3IubmV4dCgpOwotCQkJaWYgKGZlYXR1cmUuaXNNYW55KCkpIHsKLQkJCQlJbnRlcm5hbEVMaXN0IGxpc3QgPSAoSW50ZXJuYWxFTGlzdCkgcGFyZW50LmVHZXQoZmVhdHVyZSk7Ci0JCQkJaW50IGluZGV4ID0gMDsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIxID0gbGlzdC5iYXNpY0l0ZXJhdG9yKCk7ICFHVUlEcy5pc0VtcHR5KCkKLQkJCQkJCSYmIGl0ZXIxLmhhc05leHQoKTsgaW5kZXgrKykgewotCQkJCQlJbnRlcm5hbEVPYmplY3QgY2hpbGQgPSAoSW50ZXJuYWxFT2JqZWN0KSBpdGVyMS5uZXh0KCk7Ci0JCQkJCWlmIChjaGlsZC5lSXNQcm94eSgpKSB7Ci0JCQkJCQlTdHJpbmcgZ3VpZCA9IGNoaWxkLmVQcm94eVVSSSgpLmZyYWdtZW50KCk7Ci0JCQkJCQlpZiAoR1VJRHMuY29udGFpbnMoZ3VpZCkpIHsKLQkJCQkJCQkvLyB0aGlzIHdpbGwgcmVzb2x2ZSB0aGUgb2JqZWN0IHdpdGggZ3VpZAotCQkJCQkJCS8vCi0JCQkJCQkJbGlzdC5nZXQoaW5kZXgpOwotCQkJCQkJCUdVSURzLnJlbW92ZShndWlkKTsKLQkJCQkJCX0KLQkJCQkJfSBlbHNlIHsKLQkJCQkJCXJlc29sdmVQcm94aWVzKEdVSURzLCBjaGlsZCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCUludGVybmFsRU9iamVjdCBjaGlsZCA9IChJbnRlcm5hbEVPYmplY3QpIHBhcmVudC5lR2V0KGZlYXR1cmUsCi0JCQkJCQlmYWxzZSk7Ci0JCQkJaWYgKGNoaWxkICE9IG51bGwpIHsKLQkJCQkJaWYgKGNoaWxkLmVJc1Byb3h5KCkpIHsKLQkJCQkJCVN0cmluZyBndWlkID0gY2hpbGQuZVByb3h5VVJJKCkuZnJhZ21lbnQoKTsKLQkJCQkJCWlmIChHVUlEcy5jb250YWlucyhndWlkKSkgewotCQkJCQkJCS8vIHRoaXMgd2lsbCByZXNvbHZlIHRoZSBvYmplY3Qgd2l0aCBndWlkCi0JCQkJCQkJLy8KLQkJCQkJCQlwYXJlbnQuZUdldChmZWF0dXJlKTsKLQkJCQkJCQlHVUlEcy5yZW1vdmUoZ3VpZCk7Ci0JCQkJCQl9Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlyZXNvbHZlUHJveGllcyhHVUlEcywgY2hpbGQpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyBVUkkgZ2V0RmluYWxVUkkoUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJcmV0dXJuIHJlc291cmNlIGluc3RhbmNlb2YgTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsID8gKChNdWx0aUZpbGVYTUlSZXNvdXJjZUltcGwpIHJlc291cmNlKQotCQkJCS5nZXRGaW5hbFVSSSgpCi0JCQkJOiByZXNvdXJjZS5nZXRVUkkoKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gaW1wbAotCSAqIEByZXR1cm4KLQkgKi8KLQlzdGF0aWMgYm9vbGVhbiBhZGp1c3RMb2NhdGlvblJlcXVpcmVkKE11bHRpRmlsZVhNSVJlc291cmNlSW1wbCByZXNvdXJjZSkgewotCQlNZXRob2RFbGVtZW50IGUgPSBQZXJzaXN0ZW5jZVV0aWwuZ2V0TWV0aG9kRWxlbWVudChyZXNvdXJjZSk7CQkKLQkJaWYoZSAhPSBudWxsICYmIGhhc093bkZvbGRlcihlKSkgewotCQkJVVJJIG5ld1VSSSA9IGNyZWF0ZVVSSShlLCByZXNvdXJjZS5nZXRSZXNvdXJjZVNldCgpKTsKLQkJCWlmKGFkanVzdExvY2F0aW9uUmVxdWlyZWQocmVzb3VyY2UsIG5ld1VSSSkgJiYgIW5ldyBGaWxlKG5ld1VSSS50b0ZpbGVTdHJpbmcoKSkuZXhpc3RzKCkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQ2hlY2tzIGlmIHRoZSBzcGVjaWZpZWQgcmVzb3VyY2UgaXMgY3VycmVudGx5IHN5bmNocm9uaXplZCB3aXRoIGl0cyBkYXRhIHN0b3JlCi0JICogCi0JICogQHJldHVybiA8bGk+IC0xIGRvbid0IGtub3cKLQkgKiAgICAgICAgIDxsaT4gMCBubwotCSAqICAgICAgICAgPGxpPiAxIHllcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IGNoZWNrU3luY2hyb25pemVkKFJlc291cmNlIHJlc291cmNlKSB7Ci0JCWlmKHJlc291cmNlIGluc3RhbmNlb2YgTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsKSB7Ci0JCQlyZXR1cm4gKChNdWx0aUZpbGVYTUlSZXNvdXJjZUltcGwpcmVzb3VyY2UpLmNoZWNrU3luY2hyb25pemVkKCk7Ci0JCX0KLQkJcmV0dXJuIC0xOwotCX0KLQotCS8qKgotCSAqIFNvbWUgdGVhbSBwcm92aWRlcnMgY2hhbmdlZCB0aGUgdGltZXN0YW1wIG9mIGxhc3QgZmlsZSBtb2RpZmljYXRpb24gYnkgcmVtb3Zpbmcgc2Vjb25kIGZyYWN0aW9uCi0JICogZXZlbiB0aGUgZmlsZSB3YXMgbm90IGNoYW5nZWQuIFRoaXMgbWV0aG9kIGNoZWNrIHRoZSBjdXJyZW50IGFuZCBvbGQgdGltZSBzdGFtcHMgZm9yIHRoaXMuCi0JICogCi0JICogQHBhcmFtIGN1cnJlbnRUaW1lU3RhbXAKLQkgKiBAcGFyYW0gbGFzdFRpbWVTdGFtcAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gc2FtZShsb25nIGN1cnJlbnRUaW1lU3RhbXAsIGxvbmcgbGFzdFRpbWVTdGFtcCkgewotCQlyZXR1cm4gY3VycmVudFRpbWVTdGFtcCA8IGxhc3RUaW1lU3RhbXAgJiYgKGN1cnJlbnRUaW1lU3RhbXAgJiA3KSA9PSAwICYmIChsYXN0VGltZVN0YW1wIC0gY3VycmVudFRpbWVTdGFtcCkgPCAxMDAwOwotCX0KLQotCS8qKgotCSAqIEFkZHMgYW4gZW1wdHkgcmVzb3VyY2UgbWFuYWdlciBmb3IgdGhlIGdpdmVuIHJlc291cmNlIGlmIGl0IGRvZXMgbm90IGhhdmUgb25lLgotCSAqIAotCSAqIEBwYXJhbSByZXNvdXJjZQotCSAqIEByZXR1cm4gdHJ1ZSBpZiBhIG5ldyByZXNvdXJjZSBtYW5hZ2VyIGlzIGFkZGVkLCBmYWxzZSBvdGhlcndpc2UKLQkgKi8KLQlzdGF0aWMgUmVzb3VyY2VNYW5hZ2VyIGFkZFJlc291cmNlTWFuYWdlcihSZXNvdXJjZSByZXNvdXJjZSkgewotCQlSZXNvdXJjZU1hbmFnZXIgcmVzTWdyID0gZ2V0UmVzb3VyY2VNYW5hZ2VyKHJlc291cmNlKTsKLQkJaWYgKHJlc01nciA9PSBudWxsKSB7Ci0JCQlyZXNNZ3IgPSBSZXNvdXJjZW1hbmFnZXJGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVSZXNvdXJjZU1hbmFnZXIoKTsKLQkJCXJlc291cmNlLmdldENvbnRlbnRzKCkuYWRkKDAsIHJlc01ncik7Ci0JCQlyZXR1cm4gcmVzTWdyOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlzdGF0aWMgdm9pZCBjaGVja0ZpbGVQYXRoTGVuZ3RoKENvbGxlY3Rpb24gcmVzb3VyY2VzKSB7Ci0JCUxpc3Q8U3RyaW5nPiBwYXRoTGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSByZXNvdXJjZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlSZXNvdXJjZSByZXNvdXJjZSA9IChSZXNvdXJjZSkgaXRlci5uZXh0KCk7Ci0JCQlpZihyZXNvdXJjZSBpbnN0YW5jZW9mIE11bHRpRmlsZVhNSVJlc291cmNlSW1wbCAmJiAoKE11bHRpRmlsZVhNSVJlc291cmNlSW1wbClyZXNvdXJjZSkuaGFzVGVtcFVSSSgpKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlwYXRoTGlzdC5hZGQocmVzb3VyY2UuZ2V0VVJJKCkudG9GaWxlU3RyaW5nKCkpOwotCQl9Ci0JCQotCQlpZighcGF0aExpc3QuaXNFbXB0eSgpKSB7Ci0JCQlTdHJpbmdbXSBwYXRocyA9IG5ldyBTdHJpbmdbcGF0aExpc3Quc2l6ZSgpXTsKLQkJCXBhdGhMaXN0LnRvQXJyYXkocGF0aHMpOwotCi0JCQlmb3IgKGludCBpPTA7IGkgPCBwYXRocy5sZW5ndGg7IGkrKykgewotCQkJCVN0cmluZyBwYXRoID0gcGF0aHNbaV07Ci0JCQkJaWYgKHBhdGhzW2ldLmxlbmd0aCgpID4gMjU1KSB7Ci0JCQkJCVN0cmluZyBtc2cgPSBOTFMuYmluZChQZXJzaXN0ZW5jZVJlc291cmNlcy5maWxlUGF0aE5hbWVUb29Mb25nX21zZywgQXJyYXlzCi0JCQkJCQkJCS5hc0xpc3QocGF0aHMpKTsKLQkJCQkJdGhyb3cgbmV3IE11bHRpRmlsZUlPRXhjZXB0aW9uKG1zZyk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogTGlzdHMgYWxsIHBvc3NpYmxlIGNvbmZpZ3VyYXRpb24gZmlsZXMgaW4gdGhlIHNwZWNpZmllZCBkaXJlY3RvcnkgPGNvZGU+Y29uZmlnRGlyPC9jb2RlPiBhbmQgaXRzIHN1YiBkaXJlY3Rvcmllcy4KLQkgKiAKLQkgKiBAcGFyYW0gY29uZmlnRGlyCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSXRlcmF0b3IgbGlzdENvbmZpZ0ZpbGVzKEZpbGUgY29uZmlnRGlyKSB7Ci0JCXJldHVybiBsaXN0TGlicmFyeUZpbGVzKGNvbmZpZ0Rpcik7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgSXRlcmF0b3I8RmlsZT4gbGlzdExpYnJhcnlGaWxlcyhGaWxlIGRpcikgewotCQlyZXR1cm4gbmV3IEFic3RyYWN0VHJlZUl0ZXJhdG9yPEZpbGU+KGRpciwgZmFsc2UpIHsKLQkJCS8qKgotCQkJICogQ29tbWVudCBmb3IgPGNvZGU+c2VyaWFsVmVyc2lvblVJRDwvY29kZT4KLQkJCSAqLwotCQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMjc1ODQzNjE5MzAwMDY0MDkwN0w7Ci0KLQkJCUZpbGVGaWx0ZXIgZmlsdGVyID0gbmV3IEZpbGVGaWx0ZXIoKSB7Ci0KLQkJCQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoRmlsZSBwYXRobmFtZSkgewotCQkJCQlyZXR1cm4gIUZpbGVNYW5hZ2VyLmdldEluc3RhbmNlKCkuaXNUZWFtUHJpdmF0ZShwYXRobmFtZS5nZXRBYnNvbHV0ZVBhdGgoKSkgJiYKLQkJCQkJCQkocGF0aG5hbWUuaXNEaXJlY3RvcnkoKQotCQkJCQkJCXx8IHBhdGhuYW1lLmdldE5hbWUoKS5lbmRzV2l0aCgKLQkJCQkJCQkJCU11bHRpRmlsZVNhdmVVdGlsLkRFRkFVTFRfRklMRV9FWFRFTlNJT04pKTsKLQkJCQl9Ci0KLQkJCX07Ci0KLQkJCXByb3RlY3RlZCBJdGVyYXRvcjxGaWxlPiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJRmlsZVtdIGZpbGVzID0gKChGaWxlKSBvYmplY3QpLmxpc3RGaWxlcyhmaWx0ZXIpOwotCQkJCWlmIChmaWxlcyAhPSBudWxsICYmIGZpbGVzLmxlbmd0aCA+IDApIHsKLQkJCQkJcmV0dXJuIEFycmF5cy5hc0xpc3QoZmlsZXMpLml0ZXJhdG9yKCk7Ci0JCQkJfQotCQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNULml0ZXJhdG9yKCk7Ci0JCQl9Ci0KLQkJfTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS9NdWx0aUZpbGVVUklDb252ZXJ0ZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvTXVsdGlGaWxlVVJJQ29udmVydGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllZjQyOTIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS9NdWx0aUZpbGVVUklDb252ZXJ0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2U7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkFic3RyYWN0VHJlZUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuaW1wbC5VUklDb252ZXJ0ZXJJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuUmVzb3VyY2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuUmVzb3VyY2VNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci0KLS8qKgotICogVVJJIGNvbnZlcnRlciB0aGF0IGNvbnZlcnRzIGEgZmlsZS1iYXNlZCBVUkkgdG8gYSBVTUEtYmFzZWQgVVJJIGFuZCB2aWNlCi0gKiB2ZXJzYSB1c2luZyB0aGUgbWFwcGluZyBpbmZvcm1hdGlvbiBzdG9yZWQgaW4gUmVzb3VyY2VEZXNjcmlwdG9ycyBvZgotICogUmVzb3VyY2VNYW5hZ2VyLiBBIFVNQS1iYXNlZCBVUkkgaGFzIHRoZSBmb2xsb3dpbmcgZm9ybWF0OgotICogdW1hOi8vR1VJRDEjR1VJRDIgd2hlcmUgR1VJRDEgaXMgdGhlIEdVSUQgb2YgdGhlIGZpbGUgYW5kIEdVSUQyIGlzIHRoZQotICogb2JqZWN0J3MgR1VJRC4gCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBNdWx0aUZpbGVVUklDb252ZXJ0ZXIgZXh0ZW5kcyBVUklDb252ZXJ0ZXJJbXBsIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNDSEVNRSA9ICJ1bWEiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBIYXNoU2V0IGxvY2tlZEdVSURzID0gbmV3IEhhc2hTZXQoKTsKLQotCXByb3RlY3RlZCBSZXNvdXJjZU1hbmFnZXIgcmVzTWdyOwotCi0JcHJpdmF0ZSBVUkkgbGlicmFyeVVSSTsKLQotCXByaXZhdGUgVVJJIGxpYnJhcnlVbWFVUkk7Ci0KLQlwcml2YXRlIE11bHRpRmlsZVJlc291cmNlU2V0SW1wbCByZXNvdXJjZVNldDsKLQotCXByaXZhdGUgYm9vbGVhbiByZXNvbHZlUHJveHk7Ci0KLQlwdWJsaWMgTXVsdGlGaWxlVVJJQ29udmVydGVyKE11bHRpRmlsZVJlc291cmNlU2V0SW1wbCByZXNvdXJjZVNldCkgewotCQl0aGlzLnJlc291cmNlU2V0ID0gcmVzb3VyY2VTZXQ7Ci0JfQotCi0Jdm9pZCBzZXRSZXNvbHZlUHJveHkoYm9vbGVhbiByZXNvbHZlUHJveHkpIHsKLQkJdGhpcy5yZXNvbHZlUHJveHkgPSByZXNvbHZlUHJveHk7Ci0JfQotCi0Jdm9pZCBzZXRMaWJyYXJ5VVJJcyhNZXRob2RMaWJyYXJ5IGxpYnJhcnkpIHsKLQkJbGlicmFyeVVSSSA9IGxpYnJhcnkuZVJlc291cmNlKCkuZ2V0VVJJKCk7Ci0JCWxpYnJhcnlVbWFVUkkgPSBVUkkuY3JlYXRlVVJJKG5ldyBTdHJpbmdCdWZmZXIoU0NIRU1FKQotCQkJCS5hcHBlbmQoIjovLyIpLmFwcGVuZChsaWJyYXJ5LmdldEd1aWQoKSkudG9TdHJpbmcoKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGxvY2tHVUlEKFN0cmluZyBndWlkKSB7Ci0JCXN5bmNocm9uaXplZCAobG9ja2VkR1VJRHMpIHsKLQkJCWxvY2tlZEdVSURzLmFkZChndWlkKTsKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNMb2NrZWRHVUlEKFN0cmluZyBndWlkKSB7Ci0JCXN5bmNocm9uaXplZCAobG9ja2VkR1VJRHMpIHsKLQkJCXJldHVybiBsb2NrZWRHVUlEcy5jb250YWlucyhndWlkKTsKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gdW5sb2NrR1VJRChTdHJpbmcgZ3VpZCkgewotCQlzeW5jaHJvbml6ZWQgKGxvY2tlZEdVSURzKSB7Ci0JCQlyZXR1cm4gbG9ja2VkR1VJRHMucmVtb3ZlKGd1aWQpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuaW1wbC5VUklDb252ZXJ0ZXJJbXBsI25vcm1hbGl6ZShvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJKQotCSAqLwotCXB1YmxpYyBVUkkgbm9ybWFsaXplKFVSSSB1cmkpIHsKLQkJcmV0dXJuIG5vcm1hbGl6ZSh1cmksIG51bGwpOwotCX0KLQotCXB1YmxpYyBVUkkgbm9ybWFsaXplKFVSSSB1cmksIEVPYmplY3QgcmVzb2x2ZXIpIHsKLQkJaWYgKFNDSEVNRS5lcXVhbHNJZ25vcmVDYXNlKHVyaS5zY2hlbWUoKSkpIHsKLQkJCVN0cmluZyBndWlkID0gdXJpLmF1dGhvcml0eSgpOwotCQkJaWYgKGlzTG9ja2VkR1VJRChndWlkKSkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQkJdHJ5IHsKLQkJCQlsb2NrR1VJRChndWlkKTsKLQotCQkJCVJlc291cmNlRGVzY3JpcHRvciBkZXNjID0gbnVsbDsKLQkJCQlIYXNoU2V0IGV4Y2x1ZGVkUmVzTWFuYWdlcnMgPSBudWxsOwotCQkJCWlmIChyZXNvbHZlciAhPSBudWxsICYmIHJlc29sdmVyLmVSZXNvdXJjZSgpICE9IG51bGwpIHsKLQkJCQkJUmVzb3VyY2VNYW5hZ2VyIHJlc01nciA9IE11bHRpRmlsZVNhdmVVdGlsCi0JCQkJCQkJLmdldFJlc291cmNlTWFuYWdlcihyZXNvbHZlci5lUmVzb3VyY2UoKSk7Ci0JCQkJCWlmIChyZXNNZ3IgIT0gbnVsbCkgewotCQkJCQkJZGVzYyA9IE11bHRpRmlsZVNhdmVVdGlsLmZpbmRSZXNvdXJjZURlc2NyaXB0b3IocmVzTWdyLAotCQkJCQkJCQlndWlkLCBudWxsLCByZXNvbHZlUHJveHkpOwotCQkJCQkJaWYgKGRlc2MgPT0gbnVsbCkgewotCQkJCQkJCS8vIGFkZCB0aGlzIFJlc291cmNlTWFuYWdlciBhbmQgaXRzIHN1Ym1hbmFnZXJzIHRvCi0JCQkJCQkJLy8gZXhjbHVkZWRSZXNNYW5hZ2VycwotCQkJCQkJCS8vIHNvIHRoZSBuZXh0IHNlYXJjaCBmb3IgUmVzb3VyY2VEZXNjcmlwdG9yIHdpbGwKLQkJCQkJCQkvLyBpZ25vcmUgdGhlbQotCQkJCQkJCS8vCi0JCQkJCQkJZXhjbHVkZWRSZXNNYW5hZ2VycyA9IG5ldyBIYXNoU2V0KCk7Ci0JCQkJCQkJSXRlcmF0b3IgaXRlciA9IG5ldyBBYnN0cmFjdFRyZWVJdGVyYXRvcihyZXNNZ3IpIHsKLQotCQkJCQkJCQlwcm90ZWN0ZWQgSXRlcmF0b3IgZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQkJCQkJCQkJcmV0dXJuICgoUmVzb3VyY2VNYW5hZ2VyKSBvYmplY3QpCi0JCQkJCQkJCQkJCS5nZXRTdWJNYW5hZ2VycygpLml0ZXJhdG9yKCk7Ci0JCQkJCQkJCX0KLQotCQkJCQkJCX07Ci0JCQkJCQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQkJCQkJCWV4Y2x1ZGVkUmVzTWFuYWdlcnMuYWRkKGl0ZXIubmV4dCgpKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKGRlc2MgPT0gbnVsbCAmJiBnZXRSZXNvdXJjZU1hbmFnZXIoKSAhPSBudWxsKSB7Ci0JCQkJCWRlc2MgPSBNdWx0aUZpbGVTYXZlVXRpbC5maW5kUmVzb3VyY2VEZXNjcmlwdG9yKAotCQkJCQkJCWdldFJlc291cmNlTWFuYWdlcigpLCBndWlkLCBleGNsdWRlZFJlc01hbmFnZXJzLAotCQkJCQkJCXJlc29sdmVQcm94eSk7Ci0JCQkJfQotCQkJCWlmIChkZXNjICE9IG51bGwpIHsKLQkJCQkJVVJJIG5vcm1hbGl6ZWQgPSBkZXNjLmdldFJlc29sdmVkVVJJKCk7Ci0KLQkJCQkJLy8gY2hlY2sgaWYgdGhlIHJlc291cmNlIHdpdGggdGhpcyBub3JtYWxpemVkIFVSSSBoYXMKLQkJCQkJLy8gdGVtcG9yYXJ5IFVSSQotCQkJCQkvLwotCQkJCQlVUkkgdGVtcFVSSSA9IChVUkkpIHJlc291cmNlU2V0LmdldFVSSVRvVGVtcFVSSU1hcCgpLmdldCgKLQkJCQkJCQlub3JtYWxpemVkKTsKLQkJCQkJaWYgKHRlbXBVUkkgIT0gbnVsbCkgewotCQkJCQkJbm9ybWFsaXplZCA9IHRlbXBVUkk7Ci0JCQkJCX0KLQotCQkJCQlpZiAodXJpLmhhc0ZyYWdtZW50KCkpIHsKLQkJCQkJCW5vcm1hbGl6ZWQgPSBub3JtYWxpemVkLmFwcGVuZEZyYWdtZW50KHVyaS5mcmFnbWVudCgpKTsKLQkJCQkJfQotCi0JCQkJCXJldHVybiBub3JtYWxpemVkOwotCQkJCX0KLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0gZmluYWxseSB7Ci0JCQkJdW5sb2NrR1VJRChndWlkKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBzdXBlci5ub3JtYWxpemUodXJpKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5pbXBsLlVSSUNvbnZlcnRlckltcGwjY3JlYXRlSW5wdXRTdHJlYW0ob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSSkKLQkgKi8KLQlwdWJsaWMgSW5wdXRTdHJlYW0gY3JlYXRlSW5wdXRTdHJlYW0oVVJJIHVyaSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaWYgKHVyaSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiBzdXBlci5jcmVhdGVJbnB1dFN0cmVhbSh1cmkpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgVVJJIGNyZWF0ZVVSSShTdHJpbmcgZ3VpZCkgewotCQlyZXR1cm4gVVJJLmNyZWF0ZVVSSShuZXcgU3RyaW5nQnVmZmVyKFNDSEVNRSkKLQkJCQkuYXBwZW5kKCI6Ly8iKS5hcHBlbmQoZ3VpZCkudG9TdHJpbmcoKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFVSSSBjcmVhdGVVUkkoTWV0aG9kRWxlbWVudCBlKSB7Ci0JCXJldHVybiBVUkkuY3JlYXRlVVJJKGNyZWF0ZVVyaVN0cmluZyhlKSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY3JlYXRlVXJpU3RyaW5nKE9iamVjdCBlKSB7Ci0JCUludGVybmFsRU9iamVjdCBvID0gKEludGVybmFsRU9iamVjdCkgZTsKLQotCQlVUkkgb2JqZWN0VVJJID0gby5lUHJveHlVUkkoKTsKLQkJaWYgKG9iamVjdFVSSSAhPSBudWxsICYmIFNDSEVNRS5lcXVhbHMob2JqZWN0VVJJLnNjaGVtZSgpKSkgewotCQkJcmV0dXJuIG9iamVjdFVSSS50b1N0cmluZygpOwotCQl9Ci0KLQkJU3RyaW5nIGd1aWQgPSBNdWx0aUZpbGVTYXZlVXRpbC5nZXRHdWlkKGUpOwotCQlpZiAoZ3VpZCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gbmV3IFN0cmluZ0J1ZmZlcihTQ0hFTUUpLmFwcGVuZCgiOi8vIikuYXBwZW5kKGd1aWQpLnRvU3RyaW5nKCk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvLyBwdWJsaWMgVVJJIHRvVW1hVXJpKFVSSSB1cmkpIHsKLQkvLyAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIk11bHRpRmlsZVVSSUNvbnZlcnRlci50b1VtYVVyaSgpOiB1cmk9Iit1cmkpOwotCS8vIGlmKHVyaS5zY2hlbWUoKS5lcXVhbHMoInVtYSIpIHx8IHVyaURlc2NNYXAgPT0gbnVsbCkgcmV0dXJuIHVyaTsKLQkvLyBpZihsaWJyYXJ5VVJJLmVxdWFscyh1cmkpKSByZXR1cm4gbGlicmFyeVVtYVVSSTsKLQkvLyBSZXNvdXJjZURlc2NyaXB0b3IgZGVzYyA9IChSZXNvdXJjZURlc2NyaXB0b3IpCi0JLy8gdXJpRGVzY01hcC5nZXQodXJpLnRyaW1GcmFnbWVudCgpLnRvU3RyaW5nKCkpOwotCS8vIHJldHVybiBkZXNjID09IG51bGwgPyB1cmkgOiBVUkkuY3JlYXRlVVJJKCJ1bWE6Ly8iICsKLQkvLyBkZXNjLmdldElkKCkpLmFwcGVuZEZyYWdtZW50KHVyaS5mcmFnbWVudCgpKTsKLQkvLyB9Ci0KLQkvLyBwdWJsaWMgdm9pZCBzZXRSZXNvdXJjZU1hbmFnZXIoUmVzb3VyY2VNYW5hZ2VyIHJlc01ncikgewotCS8vIHRoaXMucmVzTWdyID0gcmVzTWdyOwotCS8vIH0KLQotCXB1YmxpYyBSZXNvdXJjZU1hbmFnZXIgZ2V0UmVzb3VyY2VNYW5hZ2VyKCkgewotCQlpZiAocmVzTWdyID09IG51bGwpIHsKLQkJCXJlc01nciA9IHJlc291cmNlU2V0LmdldFJvb3RSZXNvdXJjZU1hbmFnZXIoKTsKLQkJfQotCQlyZXR1cm4gcmVzTWdyOwotCX0KLQotCS8qKgotCSAqIEZpbmRzIFJlc291cmNlRGVzY3JpcHRvciBmb3IgdGhlIGdpdmVuIEdVSUQgZnJvbSByb290IFJlc291cmNlTWFuYWdlcgotCSAqIAotCSAqIEBwYXJhbSBndWlkCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBSZXNvdXJjZURlc2NyaXB0b3IgZmluZFJlc291cmNlRGVzY3JpcHRvcihTdHJpbmcgZ3VpZCkgewotCQlyZXR1cm4gTXVsdGlGaWxlU2F2ZVV0aWwuZmluZFJlc291cmNlRGVzY3JpcHRvcihnZXRSZXNvdXJjZU1hbmFnZXIoKSwKLQkJCQlndWlkLCBudWxsLCByZXNvbHZlUHJveHkpOwotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWlmIChyZXNNZ3IgIT0gbnVsbCkgewotCQkJcmVzTWdyLmRpc3Bvc2UoKTsKLQkJCXJlc01nciA9IG51bGw7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gZQotCSAqIEBwYXJhbSB1cmkKLQkgKiBAcGFyYW0gbW9kaWZpZWRSZXNvdXJjZXMKLQkgKiAgICAgICAgICAgIG91dHB1dCBvZiByZXNvdXJjZXMgdGhhdCBoYXZlIGJlZW4gY2hhbmdlZCBhZnRlciB0aGlzIGNhbGwuCi0JICovCi0JcHVibGljIHZvaWQgc2V0VVJJTWFwcGluZyhFT2JqZWN0IGUsIFVSSSB1cmksIFNldCBtb2RpZmllZFJlc291cmNlcykgewotCQlzZXRVUklNYXBwaW5nKGUsIHVyaSwgbW9kaWZpZWRSZXNvdXJjZXMsIHRydWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFVSSU1hcHBpbmcoRU9iamVjdCBlLCBVUkkgdXJpLCBTZXQgbW9kaWZpZWRSZXNvdXJjZXMsCi0JCQlib29sZWFuIGFmdGVyTW92ZSkgewotCQlTdHJpbmcgZ3VpZCA9IE11bHRpRmlsZVNhdmVVdGlsLmdldEd1aWQoZSk7Ci0JCVJlc291cmNlTWFuYWdlciByZXNNZ3IgPSBNdWx0aUZpbGVTYXZlVXRpbC5nZXRSZXNvdXJjZU1hbmFnZXJGb3IoZSwKLQkJCQltb2RpZmllZFJlc291cmNlcyk7Ci0JCVJlc291cmNlRGVzY3JpcHRvciByZXNEZXNjID0gcmVzTWdyLmdldFJlc291cmNlRGVzY3JpcHRvcihndWlkKTsKLQkJaWYgKHJlc0Rlc2MgIT0gbnVsbCkgewotCQkJaWYgKGFmdGVyTW92ZSkgewotCQkJCXJlc0Rlc2Muc2V0UmVzb2x2ZWRVUkkodXJpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJLy8gcHJlc2VydmUgdGhlIGN1cnJlbnQgcmVzb2x2ZWQgVVJJCi0JCQkJcmVzRGVzYy5nZXRSZXNvbHZlZFVSSSgpOwotCQkJCS8vIHNldCBuZXcgVVJJIHN0cmluZyBmb3IgdGhlIHVwY29taW5nIG1vdmUKLQkJCQlyZXNEZXNjLnNldFVyaSh1cmkuZGVyZXNvbHZlKAotCQkJCQkJTXVsdGlGaWxlU2F2ZVV0aWwuZ2V0RmluYWxVUkkocmVzRGVzYy5lUmVzb3VyY2UoKSkpCi0JCQkJCQkudG9TdHJpbmcoKSk7Ci0JCQl9Ci0JCQlpZiAobW9kaWZpZWRSZXNvdXJjZXMgIT0gbnVsbCkKLQkJCQltb2RpZmllZFJlc291cmNlcy5hZGQocmVzRGVzYy5lUmVzb3VyY2UoKSk7Ci0JCX0gZWxzZSB7Ci0JCQkvLyBmaW5kIHRoZSBSZXNvdXJjZURlc2NyaXB0b3IgaW4gb3RoZXIgUmVzb3VyY2VNYW5hZ2VycwotCQkJLy8KLQkJCU11bHRpRmlsZVJlc291cmNlU2V0SW1wbCByZXNvdXJjZVNldCA9IChNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwpIGUKLQkJCQkJLmVSZXNvdXJjZSgpLmdldFJlc291cmNlU2V0KCk7Ci0JCQlSZXNvdXJjZU1hbmFnZXIgbGliUmVzTWdyID0gcmVzb3VyY2VTZXQuZ2V0Um9vdFJlc291cmNlTWFuYWdlcigpOwotCQkJcmVzRGVzYyA9IE11bHRpRmlsZVNhdmVVdGlsLmZpbmRSZXNvdXJjZURlc2NyaXB0b3IobGliUmVzTWdyLCBndWlkLAotCQkJCQlDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KHJlc01nciksIHJlc29sdmVQcm94eSk7Ci0JCQlpZiAocmVzRGVzYyAhPSBudWxsKSB7Ci0JCQkJLy8gUmVzb3VyY2VEZXNjcmlwdG9yIGFscmVhZHkgZXhpc3RzCi0JCQkJLy8gY2hhbmdlIGl0cyB1cmksIG1vdmUgaXQgYW5kIGl0cyBzdWIgbWFuYWdlciwgaWYgdGhlcmUgaXMgYW55LAotCQkJCS8vIHRvIG5ldyBSZXNvdXJjZU1hbmFnZXIKLQkJCQkvLwotCi0JCQkJLy8gZmluZCBzdWIgbWFuYWdlcgotCQkJCVJlc291cmNlTWFuYWdlciBjdXJyZW50UmVzTWdyID0gKFJlc291cmNlTWFuYWdlcikgcmVzRGVzYwotCQkJCQkJLmVDb250YWluZXIoKTsKLQkJCQlSZXNvdXJjZU1hbmFnZXIgc3ViTWdyID0gbnVsbDsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjdXJyZW50UmVzTWdyLmdldFN1Yk1hbmFnZXJzKCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJUmVzb3VyY2VNYW5hZ2VyIG1nciA9IChSZXNvdXJjZU1hbmFnZXIpIGl0ZXIubmV4dCgpOwotCQkJCQlVUkkgbWdyVVJJID0gKChNdWx0aUZpbGVYTUlSZXNvdXJjZUltcGwpIG1nci5lUmVzb3VyY2UoKSkKLQkJCQkJCQkuZ2V0RmluYWxVUkkoKTsKLQkJCQkJaWYgKG1nclVSSS5lcXVhbHModXJpKSkgewotCQkJCQkJc3ViTWdyID0gbWdyOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQkvLyBtb3ZlIFJlc291cmNlRGVzY3JpcHRvcgotCQkJCXJlc01nci5nZXRSZXNvdXJjZURlc2NyaXB0b3JzKCkuYWRkKHJlc0Rlc2MpOwotCQkJCWlmIChtb2RpZmllZFJlc291cmNlcyAhPSBudWxsKSB7Ci0JCQkJCW1vZGlmaWVkUmVzb3VyY2VzLmFkZChjdXJyZW50UmVzTWdyLmVSZXNvdXJjZSgpKTsKLQkJCQkJbW9kaWZpZWRSZXNvdXJjZXMuYWRkKHJlc01nci5lUmVzb3VyY2UoKSk7Ci0JCQkJfQotCi0JCQkJLy8gbW92ZSBzdWIgUmVzb3VyY2VNYW5hZ2VyCi0JCQkJaWYgKHN1Yk1nciAhPSBudWxsKSB7Ci0JCQkJCXJlc01nci5nZXRTdWJNYW5hZ2VycygpLmFkZChzdWJNZ3IpOwotCQkJCX0KLQotCQkJCS8vIHNldCBuZXcgVVJJCi0JCQkJaWYgKGFmdGVyTW92ZSkgewotCQkJCQlyZXNEZXNjLnNldFJlc29sdmVkVVJJKHVyaSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJLy8gcHJlc2VydmUgdGhlIGN1cnJlbnQgcmVzb2x2ZWQgVVJJCi0JCQkJCXJlc0Rlc2MuZ2V0UmVzb2x2ZWRVUkkoKTsKLQkJCQkJLy8gc2V0IG5ldyBVUkkgc3RyaW5nIGZvciB0aGUgdXBjb21pbmcgbW92ZQotCQkJCQlyZXNEZXNjLnNldFVyaSh1cmkuZGVyZXNvbHZlKHJlc0Rlc2MuZVJlc291cmNlKCkuZ2V0VVJJKCkpCi0JCQkJCQkJLnRvU3RyaW5nKCkpOwotCQkJCX0KLQkJCQlpZiAobW9kaWZpZWRSZXNvdXJjZXMgIT0gbnVsbCkKLQkJCQkJbW9kaWZpZWRSZXNvdXJjZXMuYWRkKHJlc0Rlc2MuZVJlc291cmNlKCkpOwotCQkJfSBlbHNlIHsKLQkJCQlNdWx0aUZpbGVTYXZlVXRpbC5yZWdpc3RlcldpdGhSZXNvdXJjZU1hbmFnZXIocmVzTWdyLCBlLCB1cmkpOwotCQkJCWlmIChtb2RpZmllZFJlc291cmNlcyAhPSBudWxsKQotCQkJCQltb2RpZmllZFJlc291cmNlcy5hZGQocmVzTWdyLmVSZXNvdXJjZSgpKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQkJVVJJIHVyaSA9IFVSSQotCQkJCS5jcmVhdGVVUkkoInVtYTovL19MUHpkQUdaN0VkbUFtX3hTWDJFZFVBIy8vQGJyZWFrZG93bkVsZW1lbnRzLjAiKTsgLy8kTk9OLU5MUy0xJAotCQlTeXN0ZW0ub3V0LnByaW50bG4odXJpKTsKLQkJU3lzdGVtLm91dAotCQkJCS5wcmludGxuKCJkZXJlc29sdmVkIFVSSTogIiArIHVyaS5kZXJlc29sdmUoVVJJLmNyZWF0ZVVSSSgidW1hOi8vX0xQemRBR1o3RWRtQW1feFNYMkVkVUEiKSkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL011bHRpRmlsZVhNSUhlbHBlckltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvTXVsdGlGaWxlWE1JSGVscGVySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZDhhMDhhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvTXVsdGlGaWxlWE1JSGVscGVySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjk2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uQ29tbW9uUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVuaXF1ZUVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5YTUxSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLmltcGwuWE1JSGVscGVySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmVzb3VyY2VtYW5hZ2VyLlJlc291cmNlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS5pbXBsLk11bHRpUmVzb3VyY2VFT2JqZWN0OwotCi0vKioKLSAqIFhNTEhlbHBlciBpbXBsZW1lbnRhdGlvbiBmb3IgbGlicmFyeSBYTUkgcGVyc2lzdGVuY2UKLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIE11bHRpRmlsZVhNSUhlbHBlckltcGwgZXh0ZW5kcyBYTUlIZWxwZXJJbXBsIHsKLQotCS8qKgotCSAqIFBsYXRmb3JtLXNwZWNpZmljIGxpbmUgc2VwYXJhdG9yLgotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMSU5FX1NFUCA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiKTsgLy8kTk9OLU5MUy0xJAotCi0JcHJvdGVjdGVkIGJvb2xlYW4gbG9nRXJyb3IgPSB0cnVlOwotCi0JcHJvdGVjdGVkIExpc3Qgc2FtZURvY1JlZmVyZW5jZXM7Ci0KLQlwcml2YXRlIGJvb2xlYW4gZGlzY2FyZFVucmVzb2x2ZWRSZWY7Ci0JCi0JLyoqCi0JICogQSB0ZW1wb3JhcnkgZmxhZyB0byBoYXZlIGEgcXVpY2sgZml4IGZvciBnZXRWYWx1ZSBtZXRob2QgY2FsbCB3aXRob3V0IG1vZGlmeWluZyB0aGUgcGFzc2VkCi0JICogb2JqZWN0LiBTaG91bGQgYmUgcmVtb3ZlZCB3aXRoIGZ1dHVyZSByZWZhY3RvcmluZy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gdW5tb2RpZmllZEdldFZhbHVlID0gZmFsc2U7CQkKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIE11bHRpRmlsZVhNSUhlbHBlckltcGwoTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsIHhtaVJlcykgewotCQlzdXBlcih4bWlSZXMpOwotCQlzYW1lRG9jUmVmZXJlbmNlcyA9IG5ldyBVbmlxdWVFTGlzdCgpOwotCQlCb29sZWFuIGIgPSAoQm9vbGVhbikgKChNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwpIHhtaVJlcwotCQkJCS5nZXRSZXNvdXJjZVNldCgpKS5nZXREZWZhdWx0U2F2ZU9wdGlvbnMoKS5nZXQoCi0JCQkJTXVsdGlGaWxlWE1JU2F2ZUltcGwuRElTQ0FSRF9VTlJFU09MVkVEX1JFRkVSRU5DRVMpOwotCQlkaXNjYXJkVW5yZXNvbHZlZFJlZiA9IGIgIT0gbnVsbCA/IGIuYm9vbGVhblZhbHVlKCkgOiBmYWxzZTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5pbXBsLlhNTEhlbHBlckltcGwjc2V0UmVzb3VyY2Uob3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5YTUxSZXNvdXJjZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZXNvdXJjZShYTUxSZXNvdXJjZSByZXNvdXJjZSkgewotCQlzdXBlci5zZXRSZXNvdXJjZShyZXNvdXJjZSk7Ci0JCWlmKHJlc291cmNlIGluc3RhbmNlb2YgTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsKSB7Ci0JCQlyZXNvdXJjZVVSSSA9ICgoTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsKXJlc291cmNlKS5nZXRGaW5hbFVSSSgpOwotCQkJZGVyZXNvbHZlID0gcmVzb3VyY2VVUkkgIT0gbnVsbCAmJiAhcmVzb3VyY2VVUkkuaXNSZWxhdGl2ZSgpICYmIHJlc291cmNlVVJJLmlzSGllcmFyY2hpY2FsKCk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuaW1wbC5YTUxIZWxwZXJJbXBsI2dldEhSRUYob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRIUkVGKEVPYmplY3Qgb2JqKSB7Ci0JCWlmIChkaXNjYXJkVW5yZXNvbHZlZFJlZikgewotCQkJLy8gcmVtb3ZlIHVucmVzb2x2ZWQgcmVmZXJlbmNlcwotCQkJLy8KLQkJCWlmIChvYmogaW5zdGFuY2VvZiBNdWx0aVJlc291cmNlRU9iamVjdAotCQkJCQkmJiAhKChNdWx0aVJlc291cmNlRU9iamVjdCkgb2JqKS5pc1ZhbGlkKCkpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJfQotCi0JCWlmIChvYmogaW5zdGFuY2VvZiBNdWx0aVJlc291cmNlRU9iamVjdCkgewotCQkJSW50ZXJuYWxFT2JqZWN0IG8gPSAoSW50ZXJuYWxFT2JqZWN0KSBvYmo7Ci0KLQkJCVVSSSBvYmplY3RVUkkgPSBvLmVQcm94eVVSSSgpOwotCQkJaWYgKG9iamVjdFVSSSA9PSBudWxsKSB7Ci0JCQkJUmVzb3VyY2Ugb3RoZXJSZXNvdXJjZSA9IG9iai5lUmVzb3VyY2UoKTsKLQkJCQlpZiAob3RoZXJSZXNvdXJjZSA9PSBudWxsKSB7Ci0JCQkJCW9iamVjdFVSSSA9IGhhbmRsZURhbmdsaW5nSFJFRihvYmopOwotCQkJCQlpZiAob2JqZWN0VVJJID09IG51bGwpIHsKLQkJCQkJCXJldHVybiBudWxsOwotCQkJCQl9Ci0JCQkJfSBlbHNlIGlmIChyZXNvdXJjZSA9PSBvdGhlclJlc291cmNlKSB7Ci0JCQkJCXJldHVybiAiIyIgKyByZXNvdXJjZS5nZXRVUklGcmFnbWVudChvYmopOyAvLyROT04tTkxTLTEkCi0JCQkJfSBlbHNlIHsKLQkJCQkJaWYgKG9iaiBpbnN0YW5jZW9mIE1ldGhvZENvbmZpZ3VyYXRpb24pIHsKLQkJCQkJCS8vIFNwZWNpYWwgaGFuZGxpbmcgZm9yIE1ldGhvZENvbmZpZ3VyYXRpb24uCi0JCQkJCQkvLyBTZWUKLQkJCQkJCS8vIG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5NdWx0aUZpbGVSZXNvdXJjZVNldEltcGwubG9hZENvbmZpZ3VyYXRpb25zKCkKLQkJCQkJCS8vCi0JCQkJCQlFT2JqZWN0IGxpYiA9IG9iai5lQ29udGFpbmVyKCk7Ci0JCQkJCQlpZiAobGliICE9IG51bGwpIHsKLQkJCQkJCQlvdGhlclJlc291cmNlID0gbGliLmVSZXNvdXJjZSgpOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlpZiAob3RoZXJSZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQkJCQlSZXNvdXJjZVNldCByZXNvdXJjZVNldCA9IG90aGVyUmVzb3VyY2UuZ2V0UmVzb3VyY2VTZXQoKTsKLQkJCQkJCWlmKHJlc291cmNlU2V0IGluc3RhbmNlb2YgTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsIAotCQkJCQkJCQkmJiAoKE11bHRpRmlsZVJlc291cmNlU2V0SW1wbClyZXNvdXJjZVNldCkuZ2V0UmVzb3VyY2VNYW5hZ2VyKCkgPT0gbnVsbCkgewotCQkJCQkJCW9iamVjdFVSSSA9IE11bHRpRmlsZVNhdmVVdGlsLmdldEZpbmFsVVJJKG90aGVyUmVzb3VyY2UpLmFwcGVuZEZyYWdtZW50KGdldFVSSUZyYWdtZW50KG90aGVyUmVzb3VyY2UsIG9iaikpOwotCQkJCQkJCXJldHVybiBkZXJlc29sdmUob2JqZWN0VVJJKS50b1N0cmluZygpOwotCQkJCQkJfQotCQkJCQkJUmVzb3VyY2VEZXNjcmlwdG9yIHJlc0Rlc2MgPSBNdWx0aUZpbGVTYXZlVXRpbAotCQkJCQkJCQkuZ2V0UmVzb3VyY2VEZXNjcmlwdG9yKG90aGVyUmVzb3VyY2UpOwotCQkJCQkJaWYgKHJlc0Rlc2MgIT0gbnVsbCkgewotCQkJCQkJCW9iamVjdFVSSSA9IE11bHRpRmlsZVVSSUNvbnZlcnRlci5jcmVhdGVVUkkoCi0JCQkJCQkJCQlyZXNEZXNjLmdldElkKCkpLmFwcGVuZEZyYWdtZW50KAotCQkJCQkJCQkJZ2V0VVJJRnJhZ21lbnQob3RoZXJSZXNvdXJjZSwgb2JqKSk7Ci0JCQkJCQkJcmV0dXJuIG9iamVjdFVSSS50b1N0cmluZygpOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKCFvYmplY3RVUkkuc2NoZW1lKCkuZXF1YWxzKE11bHRpRmlsZVVSSUNvbnZlcnRlci5TQ0hFTUUpKSB7Ci0JCQkJCVN0cmluZyBmcmFnbWVudCA9IG9iamVjdFVSSS5mcmFnbWVudCgpOwotCQkJCQlpZiAocmVzb3VyY2UgaW5zdGFuY2VvZiBNdWx0aUZpbGVYTUlSZXNvdXJjZUltcGwKLQkJCQkJCQkmJiAoKE11bHRpRmlsZVhNSVJlc291cmNlSW1wbCkgcmVzb3VyY2UpCi0JCQkJCQkJCQkuZ2V0RU9iamVjdEJ5SUQoZnJhZ21lbnQpICE9IG51bGwpIHsKLQkJCQkJCXJldHVybiAiIyIgKyBmcmFnbWVudDsgLy8kTk9OLU5MUy0xJAotCQkJCQl9IGVsc2UgewotCQkJCQkJb2JqZWN0VVJJID0gZGVyZXNvbHZlKG9iamVjdFVSSSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJcmV0dXJuIG9iamVjdFVSSS50b1N0cmluZygpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHN1cGVyLmdldEhSRUYob2JqKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGNsYXNzIFByb3h5UmVmZXJlbmNlIHsKLQkJcHJpdmF0ZSBJbnRlcm5hbEVPYmplY3Qgb3duZXI7Ci0KLQkJcHJpdmF0ZSBFUmVmZXJlbmNlIHJlZmVyZW5jZTsKLQotCQlwcml2YXRlIEludGVybmFsRU9iamVjdCBwcm94eTsKLQotCQkvKioKLQkJICogQHBhcmFtIG93bmVyCi0JCSAqIEBwYXJhbSByZWZlcmVuY2UKLQkJICogQHBhcmFtIHByb3h5Ci0JCSAqLwotCQlwdWJsaWMgUHJveHlSZWZlcmVuY2UoSW50ZXJuYWxFT2JqZWN0IG93bmVyLCBFUmVmZXJlbmNlIHJlZmVyZW5jZSwKLQkJCQlJbnRlcm5hbEVPYmplY3QgcHJveHkpIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLm93bmVyID0gb3duZXI7Ci0JCQl0aGlzLnJlZmVyZW5jZSA9IHJlZmVyZW5jZTsKLQkJCXRoaXMucHJveHkgPSBwcm94eTsKLQkJfQotCi0JCXB1YmxpYyBJbnRlcm5hbEVPYmplY3QgZ2V0T3duZXIoKSB7Ci0JCQlyZXR1cm4gb3duZXI7Ci0JCX0KLQotCQlwdWJsaWMgSW50ZXJuYWxFT2JqZWN0IGdldFByb3h5KCkgewotCQkJcmV0dXJuIHByb3h5OwotCQl9Ci0KLQkJcHVibGljIEVSZWZlcmVuY2UgZ2V0UmVmZXJlbmNlKCkgewotCQkJcmV0dXJuIHJlZmVyZW5jZTsKLQkJfQotCi0JfQotCi0JcHVibGljIHZvaWQgc2V0VmFsdWUoRU9iamVjdCBvYmplY3QsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLAotCQkJT2JqZWN0IHZhbHVlLCBpbnQgcG9zaXRpb24pIHsKLQotCQlpbnQga2luZCA9IGdldEZlYXR1cmVLaW5kKGZlYXR1cmUpOwotCi0JCXRyeSB7Ci0JCQkvLyBUT0RPOiB0ZW1wb3JhcnkgZml4IHRvIGF2b2lkIEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiwKLQkJCS8vIG5lZWRzIHJldmlzaXQKLQkJCS8vCi0JCQlpZiAoa2luZCA9PSBJU19NQU5ZX01PVkUpIHsKLQkJCQlMaXN0IGxpc3QgPSAoTGlzdCkgb2JqZWN0LmVHZXQoZmVhdHVyZSk7Ci0JCQkJaWYgKHBvc2l0aW9uID4gLTEgJiYgbGlzdC5pbmRleE9mKHZhbHVlKSA9PSAtMSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJfQotCi0JCQlzdXBlci5zZXRWYWx1ZShvYmplY3QsIGZlYXR1cmUsIHZhbHVlLCBwb3NpdGlvbik7Ci0KLQkJCXN3aXRjaCAoa2luZCkgewotCQkJY2FzZSBJU19NQU5ZX0FERDoKLQkJCWNhc2UgSVNfTUFOWV9NT1ZFOgotCQkJCUludGVybmFsRUxpc3QgbGlzdCA9IChJbnRlcm5hbEVMaXN0KSBvYmplY3QuZUdldChmZWF0dXJlKTsKLQotCQkJCS8vIHNhdmUgc2FtZSBkb2N1bWVudCBmb3J3YXJkICh1bmlkaXJlY3Rpb25hbCkgcmVmZXJlbmNlcyB0bwotCQkJCS8vIHJlc29sdmUgYXQgdGhlIGVuZCBvZiBkb2N1bWVudCBwYXJzaW5nCi0JCQkJLy8JCQkJCi0JCQkJaWYgKGZlYXR1cmUgaW5zdGFuY2VvZiBFUmVmZXJlbmNlKSB7Ci0JCQkJCUVSZWZlcmVuY2UgcmVmID0gKEVSZWZlcmVuY2UpIGZlYXR1cmU7Ci0JCQkJCWlmIChyZWYuZ2V0RU9wcG9zaXRlKCkgIT0gbnVsbCkgewotCQkJCQkJSW50ZXJuYWxFT2JqZWN0IG93bmVyID0gKEludGVybmFsRU9iamVjdCkgb2JqZWN0OwotCQkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gbGlzdC5iYXNpY0l0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCQlJbnRlcm5hbEVPYmplY3QgZWxlbWVudCA9IChJbnRlcm5hbEVPYmplY3QpIGl0ZXIKLQkJCQkJCQkJCS5uZXh0KCk7Ci0JCQkJCQkJaWYgKGVsZW1lbnQuZUlzUHJveHkoKQotCQkJCQkJCQkJJiYgZWxlbWVudC5lUHJveHlVUkkoKS50cmltRnJhZ21lbnQoKQotCQkJCQkJCQkJCQkuZXF1YWxzKHJlc291cmNlVVJJKSkgewotCQkJCQkJCQlzYW1lRG9jUmVmZXJlbmNlcy5hZGQobmV3IFByb3h5UmVmZXJlbmNlKG93bmVyLAotCQkJCQkJCQkJCXJlZiwgZWxlbWVudCkpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQotCQkJCWJyZWFrOwotCQkJfQotCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCWlmIChsb2dFcnJvcikgewotCQkJCWlmKE11bHRpRmlsZVNhdmVVdGlsLkRFQlVHKSB7Ci0JCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJfQotCQkJCUNvbW1vblBsdWdpbi5JTlNUQU5DRS5sb2coZSk7Ci0JCQkJU3RyaW5nIGVyck1zZyA9IG5ldyBTdHJpbmdCdWZmZXIoCi0JCQkJCQkiTXVsdGlGaWxlWE1JSGVscGVySW1wbC5zZXRWYWx1ZSgpOiBFUlJPUiIpIC8vJE5PTi1OTFMtMSQKLQkJCQkJCS5hcHBlbmQoIlxuICBvYmplY3Q6ICIpLmFwcGVuZChvYmplY3QpIC8vJE5PTi1OTFMtMSQKLQkJCQkJCS5hcHBlbmQoIlxuICBmZWF0dXJlOiAiKS5hcHBlbmQoZmVhdHVyZSkgLy8kTk9OLU5MUy0xJAotCQkJCQkJLmFwcGVuZCgiXG4gIHZhbHVlOiAiKS5hcHBlbmQodmFsdWUpIC8vJE5PTi1OTFMtMSQKLQkJCQkJCS5hcHBlbmQoIlxuICBwb3NpdGlvbjogIikuYXBwZW5kKHBvc2l0aW9uKSAvLyROT04tTkxTLTEkCi0JCQkJCQkuYXBwZW5kKCJcbiAga2luZDogIikuYXBwZW5kKGtpbmQpIC8vJE5PTi1OTFMtMSQKLQkJCQkJCS50b1N0cmluZygpOwotCQkJCWlmKE11bHRpRmlsZVNhdmVVdGlsLkRFQlVHKSB7Ci0JCQkJCVN5c3RlbS5lcnIucHJpbnRsbihlcnJNc2cpOwotCQkJCX0KLQkJCQlDb21tb25QbHVnaW4uSU5TVEFOQ0UubG9nKGVyck1zZyk7Ci0JCQl9Ci0JCQl0aHJvdyBlOwotCQl9Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5pbXBsLlhNTEhlbHBlckltcGwjZ2V0VmFsdWUob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QsIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmUpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRWYWx1ZShFT2JqZWN0IG9iaiwgRVN0cnVjdHVyYWxGZWF0dXJlIGYpIHsKLQkJT2JqZWN0IHZhbHVlID0gc3VwZXIuZ2V0VmFsdWUob2JqLCBmKTsKLQkJCi0JCWlmICh1bm1vZGlmaWVkR2V0VmFsdWUpIHsKLQkJCXJldHVybiB2YWx1ZTsKLQkJfQotCQkKLQkJLy8gcmVtb3ZlIGFueSB2YWx1ZSB0aGF0IGRvZXMgbm90IGJlbG9uZyB0byBhbnkgcmVzb3VyY2UKLQkJLy8KLQkJaWYoZiBpbnN0YW5jZW9mIEVSZWZlcmVuY2UpIHsKLQkJCWlmKGYuaXNNYW55KCkpIHsKLQkJCQlpZihmLmlzQ2hhbmdlYWJsZSgpICYmIHZhbHVlIGluc3RhbmNlb2YgSW50ZXJuYWxFTGlzdCkgewotCQkJCQlJbnRlcm5hbEVMaXN0IGxpc3QgPSAoSW50ZXJuYWxFTGlzdCkgdmFsdWU7Ci0JCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGxpc3QuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlFT2JqZWN0IG8gPSAoRU9iamVjdCkgaXRlci5uZXh0KCk7Ci0JCQkJCQlpZighby5lSXNQcm94eSgpICYmIG8uZVJlc291cmNlKCkgPT0gbnVsbCkgewotCQkJCQkJCWl0ZXIucmVtb3ZlKCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlFT2JqZWN0IG8gPSAoRU9iamVjdCkgdmFsdWU7Ci0JCQkJaWYoIW8uZUlzUHJveHkoKSAmJiBvLmVSZXNvdXJjZSgpID09IG51bGwpIHsKLQkJCQkJdmFsdWUgPSBudWxsOwotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIHZhbHVlOwotCX0KLQkJCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL011bHRpRmlsZVhNSUxvYWRJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL011bHRpRmlsZVhNSUxvYWRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5YWViMzcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS9NdWx0aUZpbGVYTUlMb2FkSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZTsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlB1c2hiYWNrSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLkNvbW1vblBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuWE1MSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuWE1MUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5pbXBsLlNBWFhNSUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5pbXBsLlhNSUxvYWRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24uc2VydmljZS52ZXJzaW9uaW5nLkVQRlZlcnNpb25zOwotaW1wb3J0IG9yZy54bWwuc2F4LmhlbHBlcnMuRGVmYXVsdEhhbmRsZXI7Ci0KLS8qKgotICogWE1MTG9hZCBpbXBsZW1lbnRhdGlvbiBmb3IgbGlicmFyeSBYTUkgcGVyc2lzdGVuY2UKLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIE11bHRpRmlsZVhNSUxvYWRJbXBsIGV4dGVuZHMgWE1JTG9hZEltcGwgewotCi0JcHVibGljIE11bHRpRmlsZVhNSUxvYWRJbXBsKFhNTEhlbHBlciBoZWxwZXIpIHsKLQkJc3VwZXIoaGVscGVyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgRGVmYXVsdEhhbmRsZXIgbWFrZURlZmF1bHRIYW5kbGVyKCkgewotCQlyZXR1cm4gbmV3IFNBWFhNSUhhbmRsZXIocmVzb3VyY2UsIGhlbHBlciwgb3B0aW9ucykgewotCQkJICAKLQkJCXByb3RlY3RlZCBFU3RydWN0dXJhbEZlYXR1cmUgZ2V0RmVhdHVyZShFT2JqZWN0IG9iamVjdCwgU3RyaW5nIHByZWZpeCwgU3RyaW5nIG5hbWUsIGJvb2xlYW4gaXNFbGVtZW50KSB7Ci0JCQkJaWYgKEVQRlZlcnNpb25zLlRPT0xfSUQuZXF1YWxzKHByZWZpeCkpIHsKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCQkJCXJldHVybiBzdXBlci5nZXRGZWF0dXJlKG9iamVjdCwgcHJlZml4LCBuYW1lLCBpc0VsZW1lbnQpOwotCQkJfQotCQkJCi0JCQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVVbmtub3duRmVhdHVyZShTdHJpbmcgcHJlZml4LCBTdHJpbmcgbmFtZSwgYm9vbGVhbiBpc0VsZW1lbnQsIEVPYmplY3QgcGVla09iamVjdCwgU3RyaW5nIHZhbHVlKSB7Ci0JCQkJaWYgKEVQRlZlcnNpb25zLlRPT0xfSUQuZXF1YWxzKHByZWZpeCkpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlzdXBlci5oYW5kbGVVbmtub3duRmVhdHVyZShwcmVmaXgsIG5hbWUsIGlzRWxlbWVudCwgcGVla09iamVjdCwgdmFsdWUpOwotCQkJfQotCQkJCi0JCQlwdWJsaWMgdm9pZCBlbmREb2N1bWVudCgpIHsKLQkJCQlzdXBlci5lbmREb2N1bWVudCgpOwotCi0JCQkJaWYgKGhlbHBlciBpbnN0YW5jZW9mIE11bHRpRmlsZVhNSUhlbHBlckltcGwpIHsKLQkJCQkJTGlzdCBzYW1lRG9jUmVmZXJlbmNlcyA9ICgoTXVsdGlGaWxlWE1JSGVscGVySW1wbCkgaGVscGVyKS5zYW1lRG9jUmVmZXJlbmNlczsKLQkJCQkJaWYgKCFzYW1lRG9jUmVmZXJlbmNlcy5pc0VtcHR5KCkpIHsKLQkJCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHNhbWVEb2NSZWZlcmVuY2VzLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCQlNdWx0aUZpbGVYTUlIZWxwZXJJbXBsLlByb3h5UmVmZXJlbmNlIHByb3h5UmVmID0gKE11bHRpRmlsZVhNSUhlbHBlckltcGwuUHJveHlSZWZlcmVuY2UpIGl0ZXIKLQkJCQkJCQkJCS5uZXh0KCk7Ci0KLQkJCQkJCQkvLyB0aGlzIHdpbGwgbWVyZ2UgdGhlIG9wcG9zaXRlIGZlYXR1cmUgbWFwcyBhcyB3ZWxsCi0JCQkJCQkJRU9iamVjdCByZXNvbHZlZCA9IHByb3h5UmVmLmdldE93bmVyKCkKLQkJCQkJCQkJCS5lUmVzb2x2ZVByb3h5KHByb3h5UmVmLmdldFByb3h5KCkpOwotCi0JCQkJCQkJSW50ZXJuYWxFTGlzdCB2YWx1ZXMgPSAoSW50ZXJuYWxFTGlzdCkgcHJveHlSZWYKLQkJCQkJCQkJCS5nZXRPd25lcigpLmVHZXQocHJveHlSZWYuZ2V0UmVmZXJlbmNlKCkpOwotCQkJCQkJCWludCBpbmRleCA9IHZhbHVlcy5iYXNpY0xpc3QoKS5pbmRleE9mKAotCQkJCQkJCQkJcHJveHlSZWYuZ2V0UHJveHkoKSk7Ci0JCQkJCQkJaWYgKGluZGV4ICE9IC0xKSB7Ci0JCQkJCQkJCXZhbHVlcy5zZXRVbmlxdWUoaW5kZXgsIHJlc29sdmVkKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLmltcGwuWE1MTG9hZEltcGwjbG9hZChvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLlhNTFJlc291cmNlLAotCSAqICAgICAgamF2YS5pby5JbnB1dFN0cmVhbSwgamF2YS51dGlsLk1hcCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBsb2FkKFhNTFJlc291cmNlIHJlc291cmNlLCBJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSwgTWFwIG9wdGlvbnMpCi0JCQl0aHJvd3MgSU9FeGNlcHRpb24gewotCQl0cnkgewotCQkJLy8gc3RyaXAgb2ZmIHRoZSBVVEYtOCBCT00gYnl0ZXMgaWYgdGhleSBhcmUgc3RpbGwgdGhlcmUKLQkJCS8vCi0JCQlQdXNoYmFja0lucHV0U3RyZWFtIHBiaXMgPSBuZXcgUHVzaGJhY2tJbnB1dFN0cmVhbShpbnB1dFN0cmVhbSwgMyk7Ci0JCQlieXRlIGJvbVtdID0gbmV3IGJ5dGVbM107Ci0JCQlpZiAocGJpcy5yZWFkKGJvbSkgPT0gMykgewotCQkJCWlmIChib21bMF0gIT0gKGJ5dGUpIDB4RUYgfHwgYm9tWzFdICE9IChieXRlKSAweEJCCi0JCQkJCQl8fCBib21bMl0gIT0gKGJ5dGUpIDB4QkYpIHsKLQkJCQkJcGJpcy51bnJlYWQoYm9tKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCXN1cGVyLmxvYWQocmVzb3VyY2UsIHBiaXMsIG9wdGlvbnMpOwotCQl9IGNhdGNoIChSZXNvdXJjZS5JT1dyYXBwZWRFeGNlcHRpb24gZSkgewotCQkJaWYgKCFyZXNvdXJjZS5nZXRFcnJvcnMoKS5pc0VtcHR5KCkgJiYgaGVscGVyID09IG51bGwpIHsKLQkJCQkvLyB1bmtub3duIGZlYXR1cmVzIGRldGVjdGVkLCBsb2cgdGhlIHdhcm5pbmcgYW5kIGlnbm9yZSB0aGVtCi0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gcmVzb3VyY2UuZ2V0RXJyb3JzKCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJRXhjZXB0aW9uIGV4ID0gKEV4Y2VwdGlvbikgaXRlci5uZXh0KCk7Ci0JCQkJCUNvbW1vblBsdWdpbi5JTlNUQU5DRS5sb2coZXguZ2V0TWVzc2FnZSgpKTsKLQkJCQl9Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJdGhyb3cgZTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS9NdWx0aUZpbGVYTUlSZXNvdXJjZUltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxZWM1ZDkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS9NdWx0aUZpbGVYTUlSZXNvdXJjZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMTIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLkNvbW1vblBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQWJzdHJhY3RUcmVlSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRUNvbnRlbnRzRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuWE1MSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuWE1MTG9hZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLlhNTFNhdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5pbXBsLlhNSVJlc291cmNlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLkZpbGVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLklMaWJyYXJ5UmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UuaW50ZXJuYWwuSUZhaWxTYWZlU2F2YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UucmVmcmVzaC5SZWZyZXNoSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS51dGlsLlBlcnNpc3RlbmNlUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS51dGlsLlBlcnNpc3RlbmNlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmVzb3VyY2VtYW5hZ2VyLlJlc291cmNlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmVzb3VyY2VtYW5hZ2VyLlJlc291cmNlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VydmljZXMuSUxpYnJhcnlQZXJzaXN0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5TZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLmltcGwuTXVsdGlSZXNvdXJjZUVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS51dGlsLkRlZmF1bHRWYWx1ZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS51dGlsLk9wcG9zaXRlRmVhdHVyZU5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi0vKioKLSAqIFJlc291cmNlIGltcGxlbWVudGF0aW9uIGZvciBsaWJyYXJ5IFhNSSBwZXJzaXN0ZW5jZQotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsIGV4dGVuZHMgWE1JUmVzb3VyY2VJbXBsIAotaW1wbGVtZW50cyBJTGlicmFyeVJlc291cmNlLCBJRmFpbFNhZmVTYXZhYmxlCi17Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgdGVtcERpcjsKLQotCXByaXZhdGUgVVJJIGZpbmFsVVJJOwotCi0JcHJpdmF0ZSBVUkkgb2xkVVJJOwotCi0JcHJpdmF0ZSBTdHJpbmcgYmFja3VwRmlsZTsKLQotCXByaXZhdGUgU3RyaW5nIGN1cnJlbnRUeElEOwotCi0JcHJpdmF0ZSBsb25nIGxhc3RMb2FkVGltZVN0YW1wOwotCi0JcHJpdmF0ZSBSZXNvdXJjZURlc2NyaXB0b3IgcmVzb3VyY2VEZXNjcmlwdG9yOwotCi0JcHJpdmF0ZSBib29sZWFuIGlzVW5sb2FkaW5nOwotCi0JLyoqIENhY2hlZCBtb2RpZmljYXRpb24gc3RhbXAgb2YgdGhlIHJlc291cmNlIGZpbGUgKi8KLQlwcml2YXRlIGxvbmcgbW9kaWZpY2F0aW9uU3RhbXA7Ci0KLQlwcml2YXRlIElGaWxlSW5mbyBmaWxlSW5mbzsKLQotCXB1YmxpYyBNdWx0aUZpbGVYTUlSZXNvdXJjZUltcGwoVVJJIHVyaSkgewotCQlzdXBlcih1cmkpOwotCQlzZXRJbnRyaW5zaWNJRFRvRU9iamVjdE1hcChuZXcgSGFzaE1hcCgpKTsJCQotCX0KLQotCXByb3RlY3RlZCBYTUxMb2FkIGNyZWF0ZVhNTExvYWQoKSB7Ci0JCXJldHVybiBuZXcgTXVsdGlGaWxlWE1JTG9hZEltcGwoY3JlYXRlWE1MSGVscGVyKCkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5pbXBsLlhNTFJlc291cmNlSW1wbCNjcmVhdGVYTUxTYXZlKCkKLQkgKi8KLQlwcm90ZWN0ZWQgWE1MU2F2ZSBjcmVhdGVYTUxTYXZlKCkgewotCQlyZXR1cm4gbmV3IE11bHRpRmlsZVhNSVNhdmVJbXBsKGNyZWF0ZVhNTEhlbHBlcigpKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuaW1wbC5YTUlSZXNvdXJjZUltcGwjY3JlYXRlWE1MSGVscGVyKCkKLQkgKi8KLQlwcm90ZWN0ZWQgWE1MSGVscGVyIGNyZWF0ZVhNTEhlbHBlcigpIHsKLQkJcmV0dXJuIG5ldyBNdWx0aUZpbGVYTUlIZWxwZXJJbXBsKHRoaXMpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5YTUxSZXNvdXJjZSNnZXRJRChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldElEKEVPYmplY3QgZU9iamVjdCkgewotCQlTdHJpbmcgaWQgPSBNdWx0aUZpbGVTYXZlVXRpbC5nZXRHdWlkKGVPYmplY3QpOwotCQlpZiAoaWQgIT0gbnVsbCkKLQkJCXJldHVybiBpZDsKLQkJcmV0dXJuIHN1cGVyLmdldElEKGVPYmplY3QpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5pbXBsLlhNTFJlc291cmNlSW1wbCNzZXRJRChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCwKLQkgKiAgICAgIGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgc2V0SUQoRU9iamVjdCBlT2JqZWN0LCBTdHJpbmcgaWQpIHsKLQkJT2JqZWN0IG9sZElEID0gaWQgIT0gbnVsbCA/IGdldEVPYmplY3RUb0lETWFwKCkucHV0KGVPYmplY3QsIGlkKQotCQkJCTogZ2V0RU9iamVjdFRvSURNYXAoKS5yZW1vdmUoZU9iamVjdCk7Ci0KLQkJaWYoZ2V0UmVzb3VyY2VTZXQoKSA9PSBudWxsKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oKTsKLQkJfQotCQlNYXAgZ3VpZFRvTWV0aG9kRWxlbWVudE1hcCA9ICgoTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsKSBnZXRSZXNvdXJjZVNldCgpKQotCQkJCS5nZXRHdWlkVG9NZXRob2RFbGVtZW50TWFwKCk7Ci0KLQkJaWYgKG9sZElEICE9IG51bGwpIHsKLQkJCWdldElEVG9FT2JqZWN0TWFwKCkucmVtb3ZlKG9sZElEKTsKLQkJCQotCQkJaWYgKGVPYmplY3QgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQkJLy8gcmVtb3ZlIG9iamVjdCBmcm9tIGd1aWRUb01ldGhvZEVsZW1lbnRNYXAgb25seSBpZiBpdCBpcyBhIHByb3h5Ci0JCQkJLy8KLQkJCQlpZihlT2JqZWN0LmVJc1Byb3h5KCkpIHsKLQkJCQkJRU9iamVjdCBvYmogPSAoRU9iamVjdCkgZ3VpZFRvTWV0aG9kRWxlbWVudE1hcC5nZXQoaWQpOwotCQkJCQlpZihvYmogIT0gbnVsbCAmJiBvYmouZUlzUHJveHkoKSkgewotCQkJCQkJZ3VpZFRvTWV0aG9kRWxlbWVudE1hcC5yZW1vdmUoaWQpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlndWlkVG9NZXRob2RFbGVtZW50TWFwLnJlbW92ZShpZCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJaWYgKGlkICE9IG51bGwpIHsKLQkJCWdldElEVG9FT2JqZWN0TWFwKCkucHV0KGlkLCBlT2JqZWN0KTsKLQkJCWlmIChlT2JqZWN0IGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJCWd1aWRUb01ldGhvZEVsZW1lbnRNYXAucHV0KGlkLCBlT2JqZWN0KTsKLQotCQkJCU1ldGhvZEVsZW1lbnQgZSA9IChNZXRob2RFbGVtZW50KSBlT2JqZWN0OwotCQkJCWlmICghZS5nZXRHdWlkKCkuZXF1YWxzKGlkKSkgewotCQkJCQllLnNldEd1aWQoaWQpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5pbXBsLlhNTFJlc291cmNlSW1wbCN1c2VVVUlEcygpCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gdXNlVVVJRHMoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlI2dldFVSSUZyYWdtZW50KG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VVJJRnJhZ21lbnQoRU9iamVjdCBlT2JqZWN0KSB7Ci0JCXRyeSB7Ci0JCQlTdHJpbmcgaWQgPSBnZXRJRChlT2JqZWN0KTsKLQotCQkJaWYgKGlkICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gaWQ7Ci0JCQl9IGVsc2UgewotCQkJCUxpc3QgdXJpRnJhZ21lbnRQYXRoID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCWZvciAoRU9iamVjdCBjb250YWluZXIgPSBlT2JqZWN0LmVDb250YWluZXIoKTsgY29udGFpbmVyICE9IG51bGwKLQkJCQkJCSYmIGNvbnRhaW5lci5lUmVzb3VyY2UoKSA9PSB0aGlzOyBjb250YWluZXIgPSBlT2JqZWN0Ci0JCQkJCQkuZUNvbnRhaW5lcigpKSB7Ci0JCQkJCXVyaUZyYWdtZW50UGF0aC5hZGQoKChJbnRlcm5hbEVPYmplY3QpIGNvbnRhaW5lcikKLQkJCQkJCQkuZVVSSUZyYWdtZW50U2VnbWVudChlT2JqZWN0LmVDb250YWluaW5nRmVhdHVyZSgpLAotCQkJCQkJCQkJZU9iamVjdCkpOwotCQkJCQllT2JqZWN0ID0gY29udGFpbmVyOwotCQkJCX0KLQotCQkJCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKCIvIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlyZXN1bHQuYXBwZW5kKGdldFVSSUZyYWdtZW50Um9vdFNlZ21lbnQoZU9iamVjdCkpOwotCi0JCQkJZm9yIChMaXN0SXRlcmF0b3IgaSA9IHVyaUZyYWdtZW50UGF0aAotCQkJCQkJLmxpc3RJdGVyYXRvcih1cmlGcmFnbWVudFBhdGguc2l6ZSgpKTsgaS5oYXNQcmV2aW91cygpOykgewotCQkJCQlyZXN1bHQuYXBwZW5kKCcvJyk7Ci0JCQkJCXJlc3VsdC5hcHBlbmQoKFN0cmluZykgaS5wcmV2aW91cygpKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCQkJfQotCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCVN5c3RlbS5lcnIucHJpbnRsbigiRXJyb3IgZ2V0dGluZyBVUkkgZnJhZ21lbnQgZm9yICIgKyBlT2JqZWN0KTsgLy8kTk9OLU5MUy0xJAotCQkJdGhyb3cgZTsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5pbXBsLlhNTFJlc291cmNlSW1wbCNhdHRhY2hlZEhlbHBlcihvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhdHRhY2hlZEhlbHBlcihFT2JqZWN0IGVPYmplY3QpIHsKLQkJc3VwZXIuYXR0YWNoZWRIZWxwZXIoZU9iamVjdCk7Ci0KLQkJaWYgKHVzZUlEcygpKSB7Ci0JCQlTdHJpbmcgaWQgPSBnZXRJRChlT2JqZWN0KTsKLQkJCWlmIChpZCAhPSBudWxsKSB7Ci0JCQkJLy8gdXBkYXRlIHRoZSBlT2JqZWN0VG9JRE1hcAotCQkJCS8vCi0JCQkJZ2V0RU9iamVjdFRvSURNYXAoKS5wdXQoZU9iamVjdCwgaWQpOwotCQkJCQotCQkJCWlmIChlT2JqZWN0IGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJCQkoKE11bHRpRmlsZVJlc291cmNlU2V0SW1wbCkgZ2V0UmVzb3VyY2VTZXQoKSkKLQkJCQkJCQkuZ2V0R3VpZFRvTWV0aG9kRWxlbWVudE1hcCgpLnB1dChpZCwgZU9iamVjdCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJaWYgKGlzVHJhY2tpbmdNb2RpZmljYXRpb24oKSAmJiBlT2JqZWN0LmVSZXNvdXJjZSgpICE9IHRoaXMpIHsKLQkJCS8vIHJlbW92ZSB0aGUgbW9kaWZpY2F0aW9uIHRyYWNraW5nIGFkYXB0ZXIgZnJvbSB0aGUgZU9iamVjdAotCQkJLy8KLQkJCWVPYmplY3QuZUFkYXB0ZXJzKCkucmVtb3ZlKG1vZGlmaWNhdGlvblRyYWNraW5nQWRhcHRlcik7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgYXR0YWNoZWRBbGxXaXRoSURzKEVPYmplY3QgZU9iaikgewotCQkvLyBhdHRhY2hlZEhlbHBlcihlT2JqKTsKLQkJLy8gTGlzdCBsaXN0ID0gZU9iai5lQ29udGVudHMoKTsKLQkJLy8gaW50IHNpemUgPSBsaXN0LnNpemUoKTsKLQkJLy8gZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJLy8gRU9iamVjdCBvID0gKEVPYmplY3QpIGxpc3QuZ2V0KGkpOwotCQkvLyBpZiAoby5lUmVzb3VyY2UoKSA9PSB0aGlzKSB7Ci0JCS8vIGF0dGFjaGVkQWxsV2l0aElEcyhvKTsKLQkJLy8gfQotCQkvLyB9Ci0KLQkJSXRlcmF0b3IgYWxsQ29udGVudHMgPSBuZXcgQ29udGVudFRyZWVJdGVyYXRvcihlT2JqKTsKLQotCQl3aGlsZSAoYWxsQ29udGVudHMuaGFzTmV4dCgpKSB7Ci0JCQlhdHRhY2hlZEhlbHBlcigoRU9iamVjdCkgYWxsQ29udGVudHMubmV4dCgpKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBiYXNpY0F0dGFjaGVkQWxsKEVPYmplY3QgZU9iaikgewotCQllT2JqLmVBZGFwdGVycygpLmFkZChtb2RpZmljYXRpb25UcmFja2luZ0FkYXB0ZXIpOwotCQlMaXN0IGxpc3QgPSBlT2JqLmVDb250ZW50cygpOwotCQlpbnQgc2l6ZSA9IGxpc3Quc2l6ZSgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJRU9iamVjdCBvID0gKEVPYmplY3QpIGxpc3QuZ2V0KGkpOwotCQkJaWYgKG8uZVJlc291cmNlKCkgPT0gdGhpcykgewotCQkJCWJhc2ljQXR0YWNoZWRBbGwobyk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDYWxscyBvbiBhbiBvYmplY3QgYW5kIGFsbCBvZiBpdHMgb2Zmc3RyaW5nIG9iamVjdHMgdGhhdCBhcmUgaW4gdGhlIHNhbWUKLQkgKiByZXNvdXJjZSBhcyB0aGUgb2JqZWN0IHdoZW4gdGhlIG9iamVjdCBpcyBhdHRhY2hlZCB0byB0aGlzIHJlc291cmNlLiBUaGlzCi0JICogbWV0aG9kIGlzIGV4cGVuc2l2ZSwgc28gdXNlIGl0IHdpdGggY2F1dGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gZU9iagotCSAqLwotCXB1YmxpYyB2b2lkIGF0dGFjaGVkQWxsKEVPYmplY3QgZU9iaikgewotCQlpZiAodXNlSURzKCkpIHsKLQkJCWF0dGFjaGVkQWxsV2l0aElEcyhlT2JqKTsKLQkJfSBlbHNlIHsKLQkJCWJhc2ljQXR0YWNoZWRBbGwoZU9iaik7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZS5JbnRlcm5hbCNhdHRhY2hlZChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBhdHRhY2hlZChFT2JqZWN0IGVPYmplY3QpIHsKLQkJYXR0YWNoZWRBbGwoZU9iamVjdCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGRldGFjaGVkQWxsV2l0aElEcyhFT2JqZWN0IGVPYmopIHsKLQkJSXRlcmF0b3IgYWxsQ29udGVudHMgPSBuZXcgQ29udGVudFRyZWVJdGVyYXRvcihlT2JqKTsKLQotCQl3aGlsZSAoYWxsQ29udGVudHMuaGFzTmV4dCgpKSB7Ci0JCQlkZXRhY2hlZEhlbHBlcigoRU9iamVjdCkgYWxsQ29udGVudHMubmV4dCgpKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBiYXNpY0RldGFjaGVkQWxsKEVPYmplY3QgZU9iaikgewotCQllT2JqLmVBZGFwdGVycygpLnJlbW92ZShtb2RpZmljYXRpb25UcmFja2luZ0FkYXB0ZXIpOwotCQlMaXN0IGxpc3QgPSBlT2JqLmVDb250ZW50cygpOwotCQlpbnQgc2l6ZSA9IGxpc3Quc2l6ZSgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJRU9iamVjdCBvID0gKEVPYmplY3QpIGxpc3QuZ2V0KGkpOwotCQkJaWYgKG8uZVJlc291cmNlKCkgPT0gdGhpcykgewotCQkJCWJhc2ljRGV0YWNoZWRBbGwobyk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuaW1wbC5YTUxSZXNvdXJjZUltcGwjZ2V0RU9iamVjdEJ5SUQoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwcm90ZWN0ZWQgRU9iamVjdCBnZXRFT2JqZWN0QnlJRChTdHJpbmcgaWQpIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZ2V0Q29udGVudHMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCUVPYmplY3QgZWxlbWVudCA9IChFT2JqZWN0KSBpdGVyLm5leHQoKTsKLQkJCVN0cmluZyBndWlkID0gTXVsdGlGaWxlU2F2ZVV0aWwuZ2V0R3VpZChlbGVtZW50KTsKLQkJCWlmIChndWlkICE9IG51bGwgJiYgZ3VpZC5lcXVhbHMoaWQpKQotCQkJCXJldHVybiBlbGVtZW50OwotCQl9Ci0KLQkJLy8gcmV0dXJuIHN1cGVyLmdldEVPYmplY3RCeUlEKGlkKTsKLQotCQlpZiAoaWRUb0VPYmplY3RNYXAgIT0gbnVsbCkgewotCQkJSW50ZXJuYWxFT2JqZWN0IGVPYmplY3QgPSAoSW50ZXJuYWxFT2JqZWN0KSBpZFRvRU9iamVjdE1hcC5nZXQoaWQpOwotCQkJaWYgKGVPYmplY3QgIT0gbnVsbCAmJiAhZU9iamVjdC5lSXNQcm94eSgpKSB7Ci0JCQkJcmV0dXJuIGVPYmplY3Q7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHJpdmF0ZSBJRmlsZUluZm8gZ2V0RmlsZUluZm8oKSB7Ci0JCWlmKGZpbGVJbmZvID09IG51bGwgfHwgIW5ldyBGaWxlKGdldFVSSSgpLnRvRmlsZVN0cmluZygpKS5lcXVhbHMoZmlsZUluZm8uZ2V0RmlsZSgpKSkgewotCQkJZmlsZUluZm8gPSBGaWxlTWFuYWdlci5nZXRJbnN0YW5jZSgpLmdldEZpbGVJbmZvKHRoaXMpOyAKLQkJfQotCQlyZXR1cm4gZmlsZUluZm87Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuaW1wbC5SZXNvdXJjZUltcGwjbG9hZChqYXZhLnV0aWwuTWFwKQotCSAqLwotCXB1YmxpYyB2b2lkIGxvYWQoTWFwIG9wdGlvbnMpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWlmIChpc1VubG9hZGluZykgewotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlib29sZWFuIG9sZCA9IERlZmF1bHRWYWx1ZU1hbmFnZXIuSU5TVEFOQ0UuaXNVc2VTdGF0aWMoKTsKLQkJdHJ5IHsKLQkJCURlZmF1bHRWYWx1ZU1hbmFnZXIuSU5TVEFOQ0Uuc2V0VXNlU3RhdGljKHRydWUpOwotCQkJc3VwZXIubG9hZChvcHRpb25zKTsJCQotCQkJdXBkYXRlVGltZVN0YW1wcygpOwotCQl9Ci0JCWZpbmFsbHkgewotCQkJRGVmYXVsdFZhbHVlTWFuYWdlci5JTlNUQU5DRS5zZXRVc2VTdGF0aWMob2xkKTsKLQkJfQotCQkKLQkJaWYgKE11bHRpRmlsZVNhdmVVdGlsLkRFQlVHKSB7Ci0JCQlpZiAoZ2V0VVJJKCkudG9TdHJpbmcoKS5lcXVhbHModGVzdFJlc291cmNlVVJJU3RyKSkgewotCQkJCXRlc3RSZXNvdXJjZUxvYWRlZCA9IHRydWU7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIHRlc3RSZXNvdXJjZUxvYWRlZDsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyB0ZXN0UmVzb3VyY2VVUklTdHIgPSAiZmlsZTovQzovdGVtcC9uZXdsaWIvbGlicmFyeS54bWkiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgbG9uZyBnZXRNb2RpZmljYXRpb25TdGFtcCgpIHsKLQkJcmV0dXJuIG1vZGlmaWNhdGlvblN0YW1wOwotCX0KLQkKLQkvKioKLQkgKiBSZWxvYWRzIHRoaXMgcmVzb3VyY2UuIE9sZCBvYmplY3RzIHdpbGwgYmVjb21lIHByb3hpZXMgYW5kIHRoZXkgd2lsbCBiZQotCSAqIGFkZGVkIHRvIHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbiA8Y29kZT5wcm94aWVzPC9jb2RlPgotCSAqIAotCSAqIEBwYXJhbSBwcm94aWVzCi0JICovCi0Jc3luY2hyb25pemVkIGJvb2xlYW4gcmVsb2FkKENvbGxlY3Rpb24gcHJveGllcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaWYgKGlzTG9hZGVkKSB7Ci0JCQlOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uID0gc2V0TG9hZGVkKGZhbHNlKTsKLQkJCWRvVW5sb2FkKHByb3hpZXMsIGZhbHNlKTsKLQkJCS8vIGRvVW5sb2FkKCkgbWlnaHQgaGF2ZSBzZXQgdGhpcyByZXNvdXJjZSBsb2FkZWQgYWdhaW4KLQkJCS8vIHNldCBpc0xvYWRlZCB0byBmYWxzZSBhbmQgY29udGVudHMgdG8gbnVsbCB0byBtYWtlIHN1cmUKLQkJCS8vCi0JCQlpc0xvYWRlZCA9IGZhbHNlOwotCQkJY29udGVudHMgPSBudWxsOwotCQkJaWYgKG5vdGlmaWNhdGlvbiAhPSBudWxsKSB7Ci0JCQkJZU5vdGlmeShub3RpZmljYXRpb24pOwotCQkJfQotCQkJbG9hZChnZXRSZXNvdXJjZVNldCgpLmdldExvYWRPcHRpb25zKCkpOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qCi0JICogSmF2YWRvYyBjb3BpZWQgZnJvbSBpbnRlcmZhY2UuCi0JICovCi0JZmluYWwgdm9pZCB1bmxvYWRXaXRob3V0UmVtb3ZlKCkgewotCQlpZiAoaXNMb2FkZWQpIHsKLQkJCS8vIHNhdmUgdGhlIFJlc291cmNlRGVzY3JpcHRvciBwZiB0aGlzIHJlc291cmNlIGZvciBsYXRlciB1c2UgdG8KLQkJCS8vIGNyZWF0ZSBVUkkgZm9yIHRoZSBwcm94aWVzIGFmdGVyIHVubG9hZAotCQkJLy8KLQkJCVJlc291cmNlRGVzY3JpcHRvciByZXNEZXNjID0gTXVsdGlGaWxlU2F2ZVV0aWwKLQkJCQkJLmdldFJlc291cmNlRGVzY3JpcHRvcih0aGlzKTsKLQkJCWlmIChyZXNEZXNjICE9IG51bGwpIHsKLQkJCQlzZXRSZXNvdXJjZURlc2NyaXB0b3IocmVzRGVzYyk7Ci0JCQl9Ci0KLQkJCU5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24gPSBzZXRMb2FkZWQoZmFsc2UpOwotCQkJZG9VbmxvYWQobnVsbCwgZmFsc2UpOwotCQkJaWYgKG5vdGlmaWNhdGlvbiAhPSBudWxsKSB7Ci0JCQkJZU5vdGlmeShub3RpZmljYXRpb24pOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogRG9lcyBhbGwgdGhlIHdvcmsgb2YgdW5sb2FkaW5nIHRoZSByZXNvdXJjZS4gSXQgY2FsbHMKLQkgKiB7QGxpbmsgI3VubG9hZGVkIHVubG9hZGVkfSBmb3IgZWFjaCBvYmplY3QgaXQgdGhlIGNvbnRlbnQKLQkgKiB7QGxpbmsgI2dldEFsbENvbnRlbnRzIHRyZWV9LCBhbmQgY2xlYXJzIHRoZQotCSAqIHtAbGluayAjZ2V0Q29udGVudHMgY29udGVudHN9LCB7QGxpbmsgI2dldEVycm9ycyBlcnJvcnN9LCBhbmQKLQkgKiB7QGxpbmsgI2dldFdhcm5pbmdzIHdhcm5pbmdzfS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkb1VubG9hZCgpIHsKLQkJZG9VbmxvYWQobnVsbCwgdHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUgLSBKdWwgMTcsIDIwMDYKLQkgKiBAc2luY2UgMS4wCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBjbGFzcyBDb250ZW50VHJlZUl0ZXJhdG9yIGV4dGVuZHMgQWJzdHJhY3RUcmVlSXRlcmF0b3IgewotCQkvKioKLQkJICogQ29tbWVudCBmb3IgPGNvZGU+c2VyaWFsVmVyc2lvblVJRDwvY29kZT4KLQkJICovCi0JCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JCS8qKgotCQkgKiBAcGFyYW0gb2JqZWN0Ci0JCSAqLwotCQlwcml2YXRlIENvbnRlbnRUcmVlSXRlcmF0b3IoT2JqZWN0IG9iamVjdCkgewotCQkJc3VwZXIob2JqZWN0KTsKLQkJfQotCi0JCXByb3RlY3RlZCBJdGVyYXRvciBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgRU9iamVjdCkgewotCQkJCUFycmF5TGlzdCBjaGlsZHJlbiA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQlFQ29udGVudHNFTGlzdCBjb250ZW50cyA9IG5ldyBFQ29udGVudHNFTGlzdCgoRU9iamVjdCkgb2JqZWN0KSB7Ci0JCQkJCS8qCi0JCQkJCSAqIChub24tSmF2YWRvYykKLQkJCQkJICogCi0JCQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRUNvbnRlbnRzRUxpc3QjcmVzb2x2ZSgpCi0JCQkJCSAqLwotCQkJCQlwcm90ZWN0ZWQgYm9vbGVhbiByZXNvbHZlKCkgewotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQl9Ci0JCQkJfTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjb250ZW50cy5iYXNpY0l0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQlFT2JqZWN0IG8gPSAoRU9iamVjdCkgaXRlci5uZXh0KCk7Ci0JCQkJCWlmIChvLmVSZXNvdXJjZSgpID09IE11bHRpRmlsZVhNSVJlc291cmNlSW1wbC50aGlzCi0JCQkJCQkJfHwgby5lSXNQcm94eSgpKSB7Ci0JCQkJCQljaGlsZHJlbi5hZGQobyk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJcmV0dXJuIGNoaWxkcmVuLml0ZXJhdG9yKCk7Ci0JCQl9Ci0JCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVC5pdGVyYXRvcigpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVW5sb2FkcyB0aGlzIHJlc291cmNlLiBPbGQgb2JqZWN0cyB3aWxsIGJlIGNvbWUgcHJveGllcyBhbmQgd2lsbCBiZSBhZGRlZAotCSAqIHRvIHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbiA8Y29kZT5wcm94aWVzPC9jb2RlPgotCSAqIAotCSAqIEBwYXJhbSBwcm94aWVzCi0JICogQHBhcmFtIHJlbW92ZQotCSAqICAgICAgICAgICAgaWYgPGNvZGU+dHJ1ZTwvY29kZT4gd2lsbCByZW1vdmUgYWxsIHRoZSB1bmxvYWRlZCBvYmplY3RzIGluCi0JICogICAgICAgICAgICB0aGUgcmVzb3VyY2UgZnJvbSB0aGVpciBjb250YWluZXJzIGFuZCBhbGwgb3Bwb3NpdGUgZmVhdHVyZQotCSAqICAgICAgICAgICAgZGF0YSBvZiB0aGUgdW5sb2FkZWQgb2JqZWN0cyB3aWxsIGJlIGNsZWFyZWQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZG9VbmxvYWQoQ29sbGVjdGlvbiBwcm94aWVzLCBib29sZWFuIHJlbW92ZSkgewotCQlpc1VubG9hZGluZyA9IHRydWU7Ci0KLQkJdHJ5IHsKLQkJCS8vIGZyb20gUmVzb3VyY2VJbXBsCi0JCQkvLwotCi0JCQlJdGVyYXRvciBhbGxDb250ZW50cyA9IGdldEFsbFByb3BlckNvbnRlbnRzKG5ldyBBcnJheUxpc3QoCi0JCQkJCWdldENvbnRlbnRzKCkpKTsKLQotCQkJLy8gVGhpcyBndWFyZCBpcyBuZWVkZWQgdG8gZW5zdXJlIHRoYXQgY2xlYXIgZG9lc24ndCBtYWtlIHRoZQotCQkJLy8gcmVzb3VyY2UKLQkJCS8vIGJlY29tZSBsb2FkZWQuCi0JCQkvLwotCQkJaWYgKCFnZXRDb250ZW50cygpLmlzRW1wdHkoKSkgewotCQkJCWlmIChyZW1vdmUpIHsKLQkJCQkJZ2V0Q29udGVudHMoKS5jbGVhcigpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCS8vIGRvbid0IGNhbGwgZ2V0Q29udGVudHMoKS5jbGVhcigpIHRvIGtlZXAgdGhlIHJlZmVyZW5jZXMKLQkJCQkJLy8gdG8gZWxlbWVudHMKLQkJCQkJLy8gdGhhdCBqdXN0IGJlY2FtZSBwcm94aWVzIGFmdGVyIHVubG9hZAotCQkJCQkvLwotCQkJCQljb250ZW50cyA9IG51bGw7Ci0JCQkJfQotCi0JCQl9Ci0JCQlnZXRFcnJvcnMoKS5jbGVhcigpOwotCQkJZ2V0V2FybmluZ3MoKS5jbGVhcigpOwotCi0JCQlBcnJheUxpc3Q8RU9iamVjdD4gdW5sb2FkZWRPYmplY3RzID0gbmV3IEFycmF5TGlzdDxFT2JqZWN0PigpOwotCQkJCi0JCQlBcnJheUxpc3QgYWxsQ29udGVudExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQl3aGlsZSAoYWxsQ29udGVudHMuaGFzTmV4dCgpKSB7Ci0JCQkJYWxsQ29udGVudExpc3QuYWRkKGFsbENvbnRlbnRzLm5leHQoKSk7Ci0JCQl9Ci0JCQlJdGVyYXRvciBpdCA9IGFsbENvbnRlbnRMaXN0Lml0ZXJhdG9yKCk7Ci0JCQkKLQkJCXRyeSB7Ci0JCQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJCQl0cnkgewotCQkJCQkJSW50ZXJuYWxFT2JqZWN0IG8gPSAoSW50ZXJuYWxFT2JqZWN0KSBpdAotCQkJCQkJCQkubmV4dCgpOwotCQkJCQkJdW5sb2FkZWQobywgcmVtb3ZlKTsKLQkJCQkJCXVubG9hZGVkT2JqZWN0cy5hZGQobyk7Ci0JCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlDb21tb25QbHVnaW4uSU5TVEFOQ0UubG9nKGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlDb21tb25QbHVnaW4uSU5TVEFOQ0UubG9nKGUpOwotCQkJfQotCQkJaWYgKHByb3hpZXMgIT0gbnVsbCAmJiAhdW5sb2FkZWRPYmplY3RzLmlzRW1wdHkoKSkgewotCQkJCXByb3hpZXMuYWRkQWxsKHVubG9hZGVkT2JqZWN0cyk7Ci0JCQl9Ci0JCQlpZiAocmVtb3ZlKSB7Ci0JCQkJLy8gcmVtb3ZlIHRoZSB1bmxvYWRlZCBvYmplY3RzIGZyb20gaXRzIGNvbnRhaW5lciB0byBwcmV2ZW50IHRoZQotCQkJCS8vIHdob2xlIGxpYnJhcnkgZnJvbSBzdGF5aW5nCi0JCQkJLy8gaW4gbWVtb3J5IGlmIG9ubHkgb25lIG9mIGl0cyBlbGVtZW50IGlzIGxlYWtlZAotCQkJCS8vIAotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHVubG9hZGVkT2JqZWN0cy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJRU9iamVjdCBvYmplY3QgPSAoRU9iamVjdCkgaXRlci5uZXh0KCk7Ci0JCQkJCUVjb3JlVXRpbC5yZW1vdmUob2JqZWN0KTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCS8vIGZyb20gWE1MUmVzb3VyY2VJbWwKLQkJCS8vCQkKLQotCQkJaWYgKGlkVG9FT2JqZWN0TWFwICE9IG51bGwpIHsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBpZFRvRU9iamVjdE1hcC5rZXlTZXQoKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkoKE11bHRpRmlsZVJlc291cmNlU2V0SW1wbCkgZ2V0UmVzb3VyY2VTZXQoKSkKLQkJCQkJCQkuZ2V0R3VpZFRvTWV0aG9kRWxlbWVudE1hcCgpLnJlbW92ZShpdGVyLm5leHQoKSk7Ci0JCQkJfQotCQkJCWlkVG9FT2JqZWN0TWFwLmNsZWFyKCk7Ci0JCQl9Ci0KLQkJCWlmIChlT2JqZWN0VG9JRE1hcCAhPSBudWxsKSB7Ci0JCQkJZU9iamVjdFRvSURNYXAuY2xlYXIoKTsKLQkJCX0KLQotCQkJaWYgKGVPYmplY3RUb0V4dGVuc2lvbk1hcCAhPSBudWxsKSB7Ci0JCQkJZU9iamVjdFRvRXh0ZW5zaW9uTWFwLmNsZWFyKCk7Ci0JCQl9Ci0KLQkJCWlmIChpbnRyaW5zaWNJRFRvRU9iamVjdE1hcCAhPSBudWxsKSB7Ci0JCQkJaW50cmluc2ljSURUb0VPYmplY3RNYXAuY2xlYXIoKTsKLQkJCX0KLQkJCQotCQkJbW9kaWZpY2F0aW9uU3RhbXAgPSBJUmVzb3VyY2UuTlVMTF9TVEFNUDsKLQkJCQotCQl9IGZpbmFsbHkgewotCQkJaXNVbmxvYWRpbmcgPSBmYWxzZTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHVubG9hZGVkKEludGVybmFsRU9iamVjdCBpbnRlcm5hbEVPYmplY3QpIHsKLQkJdW5sb2FkZWQoaW50ZXJuYWxFT2JqZWN0LCB0cnVlKTsKLQl9Ci0JCi0JLyoqCi0JICogQHBhcmFtIGludGVybmFsRU9iamVjdAotCSAqIEBwYXJhbSBjbGVhcgotCSAqICAgICAgICAgICAgaWYgPGNvZGU+dHJ1ZTwvY29kZT4gYWxsIG9wcG9zaXRlIGZlYXR1cmUgZGF0YSBvZiB0aGUKLQkgKiAgICAgICAgICAgIHVubG9hZGVkIG9iamVjdHMgd2lsbCBiZSBjbGVhcmVkLgotCSAqLwotCXByaXZhdGUgdm9pZCB1bmxvYWRlZChJbnRlcm5hbEVPYmplY3QgaW50ZXJuYWxFT2JqZWN0LCBib29sZWFuIGNsZWFyKSB7Ci0JCVN0cmluZyBndWlkID0gTXVsdGlGaWxlU2F2ZVV0aWwuZ2V0R3VpZChpbnRlcm5hbEVPYmplY3QpOwotCQlpZiAoZ3VpZCAhPSBudWxsKSB7Ci0JCQlVUkkgdXJpID0gcmVzb3VyY2VEZXNjcmlwdG9yICE9IG51bGwgPyBNdWx0aUZpbGVVUklDb252ZXJ0ZXIKLQkJCQkJLmNyZWF0ZVVSSShyZXNvdXJjZURlc2NyaXB0b3IuZ2V0SWQoKSkgOiBnZXRVUkkoKTsKLQkJCWludGVybmFsRU9iamVjdC5lU2V0UHJveHlVUkkodXJpLmFwcGVuZEZyYWdtZW50KGd1aWQpKTsKLQkJfQotCQlpbnRlcm5hbEVPYmplY3QuZUFkYXB0ZXJzKCkuY2xlYXIoKTsKLQotCQlpZiAoaW50ZXJuYWxFT2JqZWN0IGluc3RhbmNlb2YgTXVsdGlSZXNvdXJjZUVPYmplY3QgJiYgY2xlYXIpIHsKLQkJCU11bHRpUmVzb3VyY2VFT2JqZWN0IG11bHRpUmVzb3VyY2VFT2JqZWN0ID0gKChNdWx0aVJlc291cmNlRU9iamVjdCkgaW50ZXJuYWxFT2JqZWN0KTsKLQotCQkJLy8gY2xlYXIgb3duIG9wcG9zaXRlIGZlYXR1cmUgbWFwCi0JCQkvLwkJCQotCQkJTWFwIG9wcG9zaXRlRmVhdHVyZU1hcCA9IG11bHRpUmVzb3VyY2VFT2JqZWN0Ci0JCQkJCS5iYXNpY0dldE9wcG9zaXRlRmVhdHVyZU1hcCgpOwotCQkJaWYgKG9wcG9zaXRlRmVhdHVyZU1hcCAhPSBudWxsKSB7Ci0JCQkJb3Bwb3NpdGVGZWF0dXJlTWFwLmNsZWFyKCk7Ci0JCQl9Ci0KLQkJCS8vIHJlbW92ZSBpdHNlbGYgZnJvbSBhbGwgb3Bwb3NpdGUgZmVhdHVyZXMKLQkJCS8vIAotCQkJbXVsdGlSZXNvdXJjZUVPYmplY3QucmVtb3ZlRnJvbUFsbE9wcG9zaXRlRmVhdHVyZXMoKTsKLQkJfQotCQkKLQkJaWYoaW50ZXJuYWxFT2JqZWN0IGluc3RhbmNlb2YgQ29udGVudERlc2NyaXB0aW9uIHx8IGludGVybmFsRU9iamVjdCBpbnN0YW5jZW9mIFNlY3Rpb24pIHsKLQkJCS8vIHNldCBhbGwgc3RyaW5nIGF0dHJpYnV0ZXMgdG8gTlVMTCB0byByZWxlYXNlIG1lbW9yeQotCQkJLy8KLQkJCWZvciAoRUF0dHJpYnV0ZSBhdHRyIDogaW50ZXJuYWxFT2JqZWN0LmVDbGFzcygpLmdldEVBbGxBdHRyaWJ1dGVzKCkpIHsKLQkJCQlpZihhdHRyICE9IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE1ldGhvZEVsZW1lbnRfR3VpZCgpICYmIAotCQkJCQkJYXR0ci5nZXRFQXR0cmlidXRlVHlwZSgpLmdldEluc3RhbmNlQ2xhc3MoKS5pc0Fzc2lnbmFibGVGcm9tKFN0cmluZy5jbGFzcykpIHsKLQkJCQkJaW50ZXJuYWxFT2JqZWN0LmVTZXQoYXR0ciwgYXR0ci5nZXREZWZhdWx0VmFsdWUoKSk7Ci0JCQkJfQotCQkJfQotCQkJCi0JCQlpZihpbnRlcm5hbEVPYmplY3QuZURpcmVjdFJlc291cmNlKCkgIT0gbnVsbCAmJiBpbnRlcm5hbEVPYmplY3QgaW5zdGFuY2VvZiBNdWx0aVJlc291cmNlRU9iamVjdCkgewotCQkJCSgoTXVsdGlSZXNvdXJjZUVPYmplY3QpaW50ZXJuYWxFT2JqZWN0KS5lU2V0UmVzb3VyY2UobnVsbCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBkZXRhY2hlZEFsbChFT2JqZWN0IGVPYmopIHsKLQkJaWYgKHVzZUlEcygpKSB7Ci0JCQlkZXRhY2hlZEFsbFdpdGhJRHMoZU9iaik7Ci0JCX0gZWxzZSB7Ci0JCQliYXNpY0RldGFjaGVkQWxsKGVPYmopOwotCQl9Ci0JfQkJCi0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZS5JbnRlcm5hbCNkZXRhY2hlZChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkZXRhY2hlZChFT2JqZWN0IGVPYmplY3QpIHsKLQkJZGV0YWNoZWRBbGwoZU9iamVjdCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuaW1wbC5SZXNvdXJjZUltcGwjY3JlYXRlTW9kaWZpY2F0aW9uVHJhY2tpbmdBZGFwdGVyKCkKLQkgKi8KLQlwcm90ZWN0ZWQgQWRhcHRlciBjcmVhdGVNb2RpZmljYXRpb25UcmFja2luZ0FkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgTW9kaWZpY2F0aW9uVHJhY2tpbmdBZGFwdGVyKCkgewotCQkJLyoKLQkJCSAqIChub24tSmF2YWRvYykKLQkJCSAqIAotCQkJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuaW1wbC5SZXNvdXJjZUltcGwuTW9kaWZpY2F0aW9uVHJhY2tpbmdBZGFwdGVyI25vdGlmeUNoYW5nZWQob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uKQotCQkJICovCi0JCQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJCQkvLyBkb24ndCBoYW5kbGUgT3Bwb3NpdGVGZWF0dXJlTm90aWZpY2F0aW9uIGIvYyBpdCBkb2VzIG5vdAotCQkJCS8vIHJlYWxseSBtb2RpZnkgdGhpcyByZXNvdXJjZQotCQkJCS8vCi0JCQkJaWYgKG5vdGlmaWNhdGlvbiBpbnN0YW5jZW9mIE9wcG9zaXRlRmVhdHVyZU5vdGlmaWNhdGlvbikgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5pbXBsLlJlc291cmNlSW1wbCNzZXRNb2RpZmllZChib29sZWFuKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1vZGlmaWVkKGJvb2xlYW4gaXNNb2RpZmllZCkgewotCQkvLyBib29sZWFuIHdhc01vZGlmaWVkID0gaXNNb2RpZmllZCgpOwotCQlzdXBlci5zZXRNb2RpZmllZChpc01vZGlmaWVkKTsKLQkJLy8gaWYoTXVsdGlGaWxlU2F2ZVV0aWwuZ2V0TWV0aG9kRWxlbWVudCh0aGlzKSBpbnN0YW5jZW9mCi0JCS8vIFByb2Nlc3NDb21wb25lbnQpIHsKLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJNdWx0aUZpbGVYTUlSZXNvdXJjZUltcGwuc2V0TW9kaWZpZWQoKTogIiArCi0JCS8vIHRoaXMpOwotCQkvLyB9Ci0JCS8vIHRoaXMgY29kZSBpcyBuZWVkZWQgdG8gc2V0IGRpcnR5IGZsYWcgdG8gdGhlIGl0ZW0gcHJvdmlkZXIncyBsYWJlbAotCQkvLwotCQkvLyBpZih3YXNNb2RpZmllZCAhPSBpc01vZGlmaWVkICYmICFnZXRDb250ZW50cygpLmlzRW1wdHkoKSkgewotCQkvLyAvLyByZWZyZXNoIHRoZSBsYWJlbCBvZiB0aGUgcmVzb3VyY2UncyBvYmplY3QKLQkJLy8gLy8KLQkJLy8gRU9iamVjdCBvYmogPSAoRU9iamVjdCkgZ2V0Q29udGVudHMoKS5nZXQoMCk7Ci0JCS8vIGZvciAoSXRlcmF0b3IgaXRlciA9IG9iai5lQWRhcHRlcnMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJLy8gT2JqZWN0IGFkYXB0ZXIgPSBpdGVyLm5leHQoKTsKLQkJLy8gaWYoYWRhcHRlciBpbnN0YW5jZW9mIEl0ZW1Qcm92aWRlckFkYXB0ZXIpIHsKLQkJLy8gKChJdGVtUHJvdmlkZXJBZGFwdGVyKWFkYXB0ZXIpLmZpcmVOb3RpZnlDaGFuZ2VkKG5ldwotCQkvLyBWaWV3ZXJOb3RpZmljYXRpb24obmV3IE5vdGlmaWNhdGlvbkltcGwoTm90aWZpY2F0aW9uLlNFVCwgb2JqLCBvYmopLAotCQkvLyBvYmosIGZhbHNlLCB0cnVlKSk7Ci0JCS8vIH0KLQkJLy8gfQotCQkvLyB9Ci0KLQkJaWYgKE11bHRpRmlsZVNhdmVVdGlsLkRFQlVHKSB7Ci0JCQlpZiAodGVzdFJlc291cmNlTG9hZGVkCi0JCQkJCSYmIGdldFVSSSgpLnRvU3RyaW5nKCkuZXF1YWxzKHRlc3RSZXNvdXJjZVVSSVN0cikpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oImlzTW9kaWZpZWQ9IiArIGlzTW9kaWZpZWQpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuTm90aWZpZXJJbXBsI2VEZWxpdmVyKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlRGVsaXZlcigpIHsKLQkJUmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQgPSBnZXRSZXNvdXJjZVNldCgpOwotCQlpZiAocmVzb3VyY2VTZXQgIT0gbnVsbCAmJiAhcmVzb3VyY2VTZXQuZURlbGl2ZXIoKSkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlyZXR1cm4gc3VwZXIuZURlbGl2ZXIoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzYXZlKE1hcCBvcHRpb25zKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlib29sZWFuIG9sZCA9IERlZmF1bHRWYWx1ZU1hbmFnZXIuSU5TVEFOQ0UuaXNVc2VTdGF0aWMoKTsKLQkJdHJ5IHsKLQkJCURlZmF1bHRWYWx1ZU1hbmFnZXIuSU5TVEFOQ0Uuc2V0VXNlU3RhdGljKHRydWUpOwotCQkJCi0JCQlpZiAob3B0aW9ucyA9PSBudWxsKSB7Ci0JCQkJb3B0aW9ucyA9IE11bHRpRmlsZVJlc291cmNlU2V0SW1wbC5ERUZBVUxUX1NBVkVfT1BUSU9OUzsKLQkJCX0KLQotCQkJc3VwZXIuc2F2ZShvcHRpb25zKTsKLQotCQkJLy8gU3BlY2lhbCBoYW5kbGluZyBmb3Igc2F2aW5nIE1ldGhvZExpYnJhcnkgdG8gcmVtb3ZlIGFsbCByZWZlcmVuY2VzIHRvCi0JCQkvLyBNZXRob2RDb25maWd1cmF0aW9ucyBmcm9tIGxpYnJhcnkgZmlsZS4KLQkJCS8vCi0JCQlNZXRob2RFbGVtZW50IGUgPSBQZXJzaXN0ZW5jZVV0aWwuZ2V0TWV0aG9kRWxlbWVudCh0aGlzKTsKLQkJCWlmIChlIGluc3RhbmNlb2YgTWV0aG9kTGlicmFyeSkgewotCQkJCU1ldGhvZExpYnJhcnkgbGliID0gKE1ldGhvZExpYnJhcnkpIGU7Ci0JCQkJLy8gcmVtb3ZlIFJlc291cmNlRGVzY3JpcHRvcnMgb2YgY29uZmlndXJhdGlvbiBmaWxlcwotCQkJCS8vCi0JCQkJUmVzb3VyY2VNYW5hZ2VyIHJlc01nciA9IE11bHRpRmlsZVNhdmVVdGlsLmdldFJlc291cmNlTWFuYWdlcih0aGlzKTsKLQkJCQlpZiAocmVzTWdyICE9IG51bGwpIHsKLQkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gbGliLmdldFByZWRlZmluZWRDb25maWd1cmF0aW9ucygpCi0JCQkJCQkJLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSAoTWV0aG9kQ29uZmlndXJhdGlvbikgaXRlcgotCQkJCQkJLm5leHQoKTsKLQkJCQkJCVJlc291cmNlRGVzY3JpcHRvciByZXNEZXNjID0gcmVzTWdyCi0JCQkJCQkuZ2V0UmVzb3VyY2VEZXNjcmlwdG9yKGNvbmZpZy5nZXRHdWlkKCkpOwotCQkJCQkJaWYgKHJlc0Rlc2MgIT0gbnVsbCkgewotCQkJCQkJCUVjb3JlVXRpbC5yZW1vdmUocmVzRGVzYyk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJTGlzdCBjb25maWdzID0gbmV3IEFycmF5TGlzdChsaWIuZ2V0UHJlZGVmaW5lZENvbmZpZ3VyYXRpb25zKCkpOwotCQkJCWJvb2xlYW4gb2xkRGVsaXZlciA9IGxpYi5lRGVsaXZlcigpOwotCQkJCXRyeSB7Ci0JCQkJCWxpYi5lU2V0RGVsaXZlcihmYWxzZSk7Ci0JCQkJCWxpYi5nZXRQcmVkZWZpbmVkQ29uZmlndXJhdGlvbnMoKS5jbGVhcigpOwotCi0JCQkJCS8vIFNhdmUgbGlicmFyeSBmaWxlIGFnYWluIHRvIHJlbW92ZSBhbGwgcmVmZXJlbmNlcyB0byBjb25maWd1cmF0aW9ucy4KLQkJCQkJLy8gVGhlIHByZXZpb3VzIHNhdmUgaXMgc3RpbGwgbmVlZGVkIHRvIHNhdmUgbmV3IGNvbmZpZ3VyYXRpb24gaW4gaXRzIG93biBmaWxlCi0JCQkJCS8vCi0JCQkJCXN1cGVyLnNhdmUob3B0aW9ucyk7Ci0JCQkJfSBmaW5hbGx5IHsKLQkJCQkJbGliLmdldFByZWRlZmluZWRDb25maWd1cmF0aW9ucygpLmFkZEFsbChjb25maWdzKTsKLQkJCQkJbGliLmVTZXREZWxpdmVyKG9sZERlbGl2ZXIpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlmaW5hbGx5IHsKLQkJCURlZmF1bHRWYWx1ZU1hbmFnZXIuSU5TVEFOQ0Uuc2V0VXNlU3RhdGljKG9sZCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgVVJJIGdldEZpbmFsVVJJKCkgewotCQlpZiAoZmluYWxVUkkgIT0gbnVsbCkgewotCQkJcmV0dXJuIGZpbmFsVVJJOwotCQl9Ci0JCXJldHVybiBnZXRVUkkoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRGaW5hbFVSSShVUkkgdXJpKSB7Ci0JCWZpbmFsVVJJID0gdXJpOwotCX0KLQotCXB1YmxpYyB2b2lkIGJhY2tVcFVSSSgpIHsKLQkJb2xkVVJJID0gZ2V0VVJJKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaGFzVGVtcFVSSSgpIHsKLQkJaWYgKGN1cnJlbnRUeElEICE9IG51bGwpIHsKLQkJCXJldHVybiBjcmVhdGVUZW1wVVJJKCkuZXF1YWxzKGdldFVSSSgpKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJpdmF0ZSBVUkkgY3JlYXRlVGVtcFVSSSgpIHsKLQkJTWV0aG9kRWxlbWVudCBlID0gUGVyc2lzdGVuY2VVdGlsLmdldE1ldGhvZEVsZW1lbnQodGhpcyk7Ci0JCXJldHVybiBVUkkuY3JlYXRlRmlsZVVSSShuZXcgU3RyaW5nQnVmZmVyKGdldFRlbXBEaXIoKSkuYXBwZW5kKAotCQkJCUZpbGUuc2VwYXJhdG9yKS5hcHBlbmQoY3VycmVudFR4SUQpCi0JCQkJLmFwcGVuZCgibmV3IikuYXBwZW5kKGUuZ2V0R3VpZCgpKS50b1N0cmluZygpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXN0YXRpYyBTdHJpbmcgZ2V0VGVtcERpcigpIHsKLQkJaWYgKHRlbXBEaXIgPT0gbnVsbCkgewotCQkJdGVtcERpciA9IG5ldyBGaWxlKEZpbGVNYW5hZ2VyLmdldFRlbXBEaXIoKSwgIkVQRiIpLmdldEFic29sdXRlUGF0aCgpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIHRlbXBEaXI7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdGVtcG9yYXJ5IFVSSSB0byBzYXZlIHRoaXMgcmVzb3VyY2UgdG8gYW5kIGl0IHdpbGwgYmUgcmVuYW1lZCB0bwotCSAqIHRoZSBvcmlnaW5hbCBVUkkgd2hlbiBzYXZpbmcgaXMgZG9uZQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRlbXBVUkkoU3RyaW5nIHR4SUQpIHsKLQkJaWYgKGZpbmFsVVJJID09IG51bGwpIHsKLQkJCWZpbmFsVVJJID0gb2xkVVJJID0gZ2V0VVJJKCk7Ci0JCQljdXJyZW50VHhJRCA9IHR4SUQ7Ci0KLQkJCVVSSSB0ZW1wVVJJID0gY3JlYXRlVGVtcFVSSSgpOwotCQkJc2V0VVJJKHRlbXBVUkkpOwotCi0JCQlNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwgcmVzb3VyY2VTZXQgPSAoTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsKSBnZXRSZXNvdXJjZVNldCgpOwotCQkJcmVzb3VyY2VTZXQuZ2V0VVJJVG9UZW1wVVJJTWFwKCkucHV0KG9sZFVSSSwgdGVtcFVSSSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXN0b3JlcyB0aGUgcmVzb3VyY2UgVVJJIHRvIHRoZSBvcmlnaW5hbCBvbmUuIFRoaXMgbWV0aG9kIG11c3QgYmUgY2FsbAotCSAqIGFmdGVyIHNhdmluZyByZWdhcmxlc3Mgb2YgaXRzIHN1Y2Nlc3MuCi0JICogCi0JICovCi0JcHJpdmF0ZSB2b2lkIHJlc3RvcmVVUkkoKSB7Ci0JCWlmIChvbGRVUkkgIT0gbnVsbCkgewotCQkJc2V0VVJJKG9sZFVSSSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiB0eFN0YXJ0ZWQoKSB7Ci0JCXJldHVybiBtb3ZlU3RhcnRlZCgpIHx8IHNhdmVTdGFydGVkKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlVGltZVN0YW1wcygpIHsKLQkJRmlsZU1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5yZWZyZXNoKHRoaXMpOwotCQlsYXN0TG9hZFRpbWVTdGFtcCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQlJRmlsZUluZm8gaW5mbyA9IGdldEZpbGVJbmZvKCk7Ci0JCWlmKGluZm8gIT0gbnVsbCkgewotCQkJbW9kaWZpY2F0aW9uU3RhbXAgPSBpbmZvLmdldE1vZGlmaWNhdGlvblN0YW1wKCk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQ2hlY2tzIGlmIHRoaXMgcmVzb3VyY2UgaXMgY3VycmVudGx5IHN5bmNocm9uaXplZCB3aXRoIGl0cyBkYXRhIHN0b3JlCi0JICogCi0JICogQHJldHVybiA8bGk+IC0xIGRvbid0IGtub3cKLQkgKiAgICAgICAgIDxsaT4gMCBubwotCSAqICAgICAgICAgPGxpPiAxIHllcwotCSAqIEBkZXByZWNhdGVkIHVzZSB7QGxpbmsgI2lzU3luY2hyb25pemVkKCl9IGluc3RlYWQKLQkgKi8KLQlwdWJsaWMgaW50IGNoZWNrU3luY2hyb25pemVkKCkgewotLy8JCWxvbmcgY3VycmVudFRpbWUgPSBuZXcgRmlsZShnZXRVUkkoKS50b0ZpbGVTdHJpbmcoKSkubGFzdE1vZGlmaWVkKCk7Ci0vLwkJaWYoTXVsdGlGaWxlU2F2ZVV0aWwuc2FtZShjdXJyZW50VGltZSwgZmlsZUxhc3RNb2RpZmllZCkpIHsKLS8vCQkJLy8gc29tZSB0ZWFtIHByb3ZpZGVycyBjaGFuZ2VkIHRoZSB0aW1lc3RhbXAgb2YgbGFzdCBmaWxlIG1vZGlmaWNhdGlvbiBieSByZW1vdmluZyBzZWNvbmQgZnJhY3Rpb24KLS8vCQkJLy8gZXZlbiB0aGUgZmlsZSB3YXMgbm90IGNoYW5nZWQKLS8vCQkJLy8KLS8vCQkJcmV0dXJuIDE7Ci0vLwkJfQotLy8JCXJldHVybiAtMTsKLQkJcmV0dXJuIGlzU3luY2hyb25pemVkKCkgPyAxIDogMDsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNTeW5jaHJvbml6ZWQoKSB7Ci0JCUlGaWxlSW5mbyBmaWxlSW5mbyA9IGdldEZpbGVJbmZvKCk7Ci0JCWlmIChmaWxlSW5mbyAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gbW9kaWZpY2F0aW9uU3RhbXAgPT0gZmlsZUluZm8uZ2V0TW9kaWZpY2F0aW9uU3RhbXAoKTsKLQkJfQotCQllbHNlIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdHhGaW5pc2hlZChib29sZWFuIHN1Y2Nlc3NmdWwpIHsKLQkJYm9vbGVhbiB3YXNNb3ZlID0gIW9sZFVSSS5lcXVhbHMoZmluYWxVUkkpOwotCQlpZiAoc3VjY2Vzc2Z1bCkgewotCQkJc2V0VVJJKGZpbmFsVVJJKTsKLQkJCWlmKCF3YXNNb3ZlKSB7Ci0JCQkJc2V0TW9kaWZpZWQoZmFsc2UpOwotCQkJfQotCQkJRmlsZU1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5yZWZyZXNoKHRoaXMpOwotCQkJdXBkYXRlVGltZVN0YW1wcygpOwotCQkJaWYoIXdhc01vdmUpIHsKLQkJCQlNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwgcmVzb3VyY2VTZXQgPSAoTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsKSBnZXRSZXNvdXJjZVNldCgpOwotCQkJCWlmKHJlc291cmNlU2V0ICE9IG51bGwpIHsKLQkJCQkJcmVzb3VyY2VTZXQuZ2V0VW5yZXNvbHZlZFByb3h5TWFya2VyTWFuYWdlcigpLnZhbGlkYXRlTWFya2Vycyh0aGlzKTsKLQkJCQl9Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlyZXN0b3JlVVJJKCk7Ci0JCQlpZiAod2FzTW92ZSkgewotCQkJCS8vIGZpbmFsVVJJIG11c3QgYmUgY2xlYXJlZCBiZWZvcmUgcmVzdG9yaW5nIFVSSSBvZiBpdHMgY2hpbGQKLQkJCQkvLyByZXNvdXJjZXMgc28gdGhlIFVSSSBvZiBpdHMgY2hpbGQgcmVzb3VyY2VzIGNhbiBiZSByZXNvbHZlZAotCQkJCS8vIGNvcnJlY3RseS4gU2VlIFJlc291cmNlRGVzY3JpcHRvckltcGwuZ2V0UmVzb2x2ZWRVUkkoKQotCQkJCS8vCi0JCQkJZmluYWxVUkkgPSBudWxsOwotCQkJCQotCQkJCS8vIHJlc3RvcmUgdXJpIG9mIFJlc291cmNlRGVzY3JpcHRvciBvZiB0aGlzIHJlc291cmNlCi0JCQkJLy8KLQkJCQlNdWx0aUZpbGVTYXZlVXRpbC51cGRhdGVVUklNYXBwaW5ncyh0aGlzLCBvbGRVUkksIG51bGwsIHRydWUpOwotCQkJfQotCQl9Ci0JCWlmIChvbGRVUkkgIT0gbnVsbCkgewotCQkJTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsIHJlc291cmNlU2V0ID0gKE11bHRpRmlsZVJlc291cmNlU2V0SW1wbCkgZ2V0UmVzb3VyY2VTZXQoKTsKLQkJCWlmIChyZXNvdXJjZVNldCAhPSBudWxsKSB7Ci0JCQkJcmVzb3VyY2VTZXQuZ2V0VVJJVG9UZW1wVVJJTWFwKCkucmVtb3ZlKG9sZFVSSSk7Ci0JCQl9Ci0JCQlvbGRVUkkgPSBudWxsOwotCQl9Ci0JCWN1cnJlbnRUeElEID0gbnVsbDsKLQkJZmluYWxVUkkgPSBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIGRlbGV0ZUJhY2t1cCgpIHsKLQkJaWYgKGJhY2t1cEZpbGUgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQkvLyBGaWxlTWFuYWdlci5nZXRJbnN0YW5jZSgpLmRlbGV0ZShiYWNrdXBGaWxlKTsKLQkJCQluZXcgRmlsZShiYWNrdXBGaWxlKS5kZWxldGUoKTsKLQkJCQliYWNrdXBGaWxlID0gbnVsbDsKLQkJCX0gY2F0Y2ggKFRocm93YWJsZSBlKSB7Ci0JCQkJQ29tbW9uUGx1Z2luLklOU1RBTkNFLmxvZyhlKTsKLQkJCQlpZiAoTXVsdGlGaWxlU2F2ZVV0aWwuREVCVUcpIHsKLQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiByZXN0b3JlKCkgewotCQlGaWxlIHNyYyA9IG51bGwsIGRlc3QgPSBudWxsOwotCQlib29sZWFuIG1vdmVkID0gZmFsc2U7Ci0JCWlmIChiYWNrdXBGaWxlICE9IG51bGwpIHsKLQkJCXNyYyA9IG5ldyBGaWxlKGJhY2t1cEZpbGUpOwotCQkJZGVzdCA9IG5ldyBGaWxlKGdldEZpbmFsVVJJKCkudG9GaWxlU3RyaW5nKCkpOwotCQl9IGVsc2UgewotCQkJbW92ZWQgPSBvbGRVUkkgIT0gbnVsbCAmJiAhb2xkVVJJLmVxdWFscyhmaW5hbFVSSSk7Ci0JCQlpZiAobW92ZWQpIHsKLQkJCQlGaWxlIGZpbGUgPSBuZXcgRmlsZShnZXRGaW5hbFVSSSgpLnRvRmlsZVN0cmluZygpKTsKLQkJCQlkZXN0ID0gbmV3IEZpbGUob2xkVVJJLnRvRmlsZVN0cmluZygpKTsKLQkJCQltb3ZlZCA9IGZpbGUuZXhpc3RzKCkgJiYgIWRlc3QuZXhpc3RzKCk7Ci0JCQkJaWYgKG1vdmVkKSB7Ci0JCQkJCXNyYyA9IGZpbGU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmIChzcmMgIT0gbnVsbCkgewotCQkJaWYgKGRlc3QuZXhpc3RzKCkpIHsKLQkJCQlGaWxlVXRpbC5tb3ZlRmlsZShkZXN0LG5ldyBGaWxlKGdldFVSSSgpLnRvRmlsZVN0cmluZygpKSk7Ci0JCQl9Ci0JCQlib29sZWFuIHN1Y2Nlc3M7Ci0JCQlpZiAobW92ZWQpIHsKLQkJCQlzdWNjZXNzID0gTXVsdGlGaWxlU2F2ZVV0aWwubW92ZSh0aGlzLCBzcmMsIGRlc3QpOwotCQkJCS8vIGlmKHN1Y2Nlc3MpIHsKLQkJCQkvLyBNdWx0aUZpbGVTYXZlVXRpbC51cGRhdGVVUklNYXBwaW5ncyh0aGlzLCBudWxsKTsKLQkJCQkvLyB9Ci0JCQl9IGVsc2UgewotCQkJCS8vIGRvbid0IHJlc3RvcmUgZmlsZSBpZiB0aGUgc291cmNlIGFuZCBkZXN0aW5hdGlvbiBhcmUgdGhlIHNhbWUKLQkJCQkvLwotCQkJCXN1Y2Nlc3MgPSBzcmMubGFzdE1vZGlmaWVkKCkgPT0gZGVzdC5sYXN0TW9kaWZpZWQoKSAmJiBGaWxlVXRpbC5nZXRTaXplKHNyYykgPT0gRmlsZVV0aWwuZ2V0U2l6ZShkZXN0KTsKLQkJCQlpZighc3VjY2VzcykgewotCQkJCQlzdWNjZXNzID0gRmlsZVV0aWwubW92ZUZpbGUoc3JjLCBkZXN0KTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoIXN1Y2Nlc3MpIHsKLQkJCQl0aHJvdyBuZXcgTXVsdGlGaWxlSU9FeGNlcHRpb24oTkxTLmJpbmQoUGVyc2lzdGVuY2VSZXNvdXJjZXMucmVzdG9yZVJlc291cmNlRXJyb3JfbXNnLCAKLQkJCQkJCUZpbGVNYW5hZ2VyLnRvRmlsZVN0cmluZyhnZXRGaW5hbFVSSSgpKSkpOwotCQkJfQotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCVVSSSBnZXRPbGRVUkkoKSB7Ci0JCXJldHVybiBvbGRVUkk7Ci0JfQotCi0JYm9vbGVhbiBtb3ZlU3RhcnRlZCgpIHsKLQkJcmV0dXJuIG9sZFVSSSAhPSBudWxsICYmICFvbGRVUkkuZXF1YWxzKGdldEZpbmFsVVJJKCkpOwotCX0KLQotCWJvb2xlYW4gc2F2ZVN0YXJ0ZWQoKSB7Ci0JCXJldHVybiBjdXJyZW50VHhJRCAhPSBudWxsOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgcmVmcmVzaFVSSU9mQ2hpbGRSZXNvdXJjZXMoKSB7Ci0JCS8vIHJlZnJlc2ggcmVzb2x2ZSBVUklzIGluIFJlc291cmNlRGVzY3JpcHRvcnMgb2YgdGhlIGNoaWxkCi0JCS8vIHJlc291cmNlcyBvZiB0aGlzIHJlc291cmNlCi0JCS8vCi0JCUhhc2hNYXA8VVJJLCBSZXNvdXJjZURlc2NyaXB0b3I+IG9sZFVSSVRvUmVzb3VyY2VEZXNjcmlwdG9yTWFwID0gbnVsbDsKLQkJUmVzb3VyY2VNYW5hZ2VyIHJlc01nciA9IE11bHRpRmlsZVNhdmVVdGlsCi0JCQkJLmdldFJlc291cmNlTWFuYWdlcih0aGlzKTsKLQkJaWYgKHJlc01nciAhPSBudWxsKSB7Ci0JCQlvbGRVUklUb1Jlc291cmNlRGVzY3JpcHRvck1hcCA9IG5ldyBIYXNoTWFwPFVSSSwgUmVzb3VyY2VEZXNjcmlwdG9yPigpOwotCQkJZm9yIChJdGVyYXRvcjw/PiBpdGVyID0gcmVzTWdyLmVBbGxDb250ZW50cygpOyBpdGVyCi0JCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IG9iaiA9IGl0ZXIubmV4dCgpOwotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBSZXNvdXJjZURlc2NyaXB0b3IpIHsKLQkJCQkJUmVzb3VyY2VEZXNjcmlwdG9yIGRlc2MgPSAoKFJlc291cmNlRGVzY3JpcHRvcikgb2JqKTsKLQkJCQkJb2xkVVJJVG9SZXNvdXJjZURlc2NyaXB0b3JNYXAucHV0KGRlc2MKLQkJCQkJCQkuZ2V0UmVzb2x2ZWRVUkkoKSwgZGVzYyk7Ci0JCQkJCWRlc2MuY2xlYXJSZXNvbHZlZFVSSSgpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCS8vIHJlZnJlc2ggVVJJIG9mIGxvYWRlZCBjaGlsZCByZXNvdXJjZXMgb2YgdGhpcyByZXNvdXJjZQotCQkvLwotCQlpZiAob2xkVVJJVG9SZXNvdXJjZURlc2NyaXB0b3JNYXAgIT0gbnVsbCkgewotCQkJLy8gZ28gdGhydSB0aGUgbGlzdCBvZiBsb2FkZWQgcmVzb3VyY2VzIGluIHJlc291cmNlIHNldAotCQkJLy8gdG8gdXBkYXRlIHRoZSBVUkkKLQkJCS8vCi0JCQlmb3IgKFJlc291cmNlIHJlcyA6IGdldFJlc291cmNlU2V0KCkuZ2V0UmVzb3VyY2VzKCkpIHsKLQkJCQlSZXNvdXJjZURlc2NyaXB0b3IgZGVzYyA9IChSZXNvdXJjZURlc2NyaXB0b3IpIG9sZFVSSVRvUmVzb3VyY2VEZXNjcmlwdG9yTWFwCi0JCQkJCQkuZ2V0KHJlcy5nZXRVUkkoKSk7Ci0JCQkJaWYgKGRlc2MgIT0gbnVsbCkgewotCQkJCQlyZXMuc2V0VVJJKGRlc2MuZ2V0UmVzb2x2ZWRVUkkoKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgY29tbWl0KCkgewotCQlpZiAoZmluYWxVUkkgIT0gbnVsbCAmJiAhZ2V0Q29udGVudHMoKS5pc0VtcHR5KCkpIHsKLQkJCUZpbGUgZmluYWxGaWxlID0gbmV3IEZpbGUoZmluYWxVUkkudG9GaWxlU3RyaW5nKCkpOwotCQkJYm9vbGVhbiB3YXNNb3ZlID0gIW9sZFVSSS5lcXVhbHMoZmluYWxVUkkpOwotCQkJaWYgKHdhc01vdmUpIHsKLQkJCQlPYmplY3QgZSA9IFBlcnNpc3RlbmNlVXRpbC5nZXRNZXRob2RFbGVtZW50KHRoaXMpOwotCQkJCWlmIChlIGluc3RhbmNlb2YgQ29udGVudERlc2NyaXB0aW9uKSB7Ci0JCQkJCWlmIChmaW5hbEZpbGUuZXhpc3RzKCkpIHsKLQkJCQkJCS8vIG5hbWUgZm9yIGZpbmFsRmlsZSBpcyBhbHJlYWR5IHRha2VuCi0JCQkJCQkvLyB0cnkgdG8gZ2V0IHRoZSBuZXh0IGF2YWlsYWJsZSBuYW1lCi0JCQkJCQkvLwotCQkJCQkJZmluYWxVUkkgPSBVUkkuY3JlYXRlRmlsZVVSSShNZXRob2RMaWJyYXJ5UGVyc2lzdGVyCi0JCQkJCQkJCS5nZXROZXh0QXZhaWxhYmxlRmlsZU5hbWUoZmluYWxGaWxlLmdldFBhcmVudCgpCi0JCQkJCQkJCQkJKyBGaWxlLnNlcGFyYXRvciwKLQkJCQkJCQkJCQkoQ29udGVudERlc2NyaXB0aW9uKSBlKSk7Ci0JCQkJCQlmaW5hbEZpbGUgPSBuZXcgRmlsZShmaW5hbFVSSS50b0ZpbGVTdHJpbmcoKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCS8vIGJhY2sgdXAgdGhlIGZpbGUKLQkJCQkvLwotCQkJCVN0cmluZyBiYWNrdXAgPSBnZXRCYWNrdXBGaWxlUGF0aCgpOwotCQkJCUZpbGUgYmFrRmlsZSA9IG5ldyBGaWxlKGJhY2t1cCk7Ci0KLQkJCQkvLyB0cnlpbmcgdG8gZGVsZXRlIHRoZSBvbGQgYmFja3VwIGZpbGUgaWYgaXQgZXhpc3RzCi0JCQkJLy8KLQkJCQlpZiAoYmFrRmlsZS5leGlzdHMoKSkgewotCQkJCQliYWtGaWxlLmRlbGV0ZSgpOwotCQkJCX0KLQotCQkJCWlmIChmaW5hbEZpbGUuZXhpc3RzKCkpIHsKLQkJCQkJLy8gc29tZSBDTSBwcm92aWRlciBsaWtlIENsZWFyQ2FzZSByZW5hbWVkIHRoZSB2ZXJzaW9uZWQKLQkJCQkJLy8gZmlsZSBpdCBpdHMgcmVwb3NpdG9yeSBhcyBzb29uIGFzIHVzZXIgcmVuYW1lZCB0aGUgZmlsZQotCQkJCQkvLyBpbiB0aGUgd29ya3NwYWNlLiBUbyBhdm9pZCB0aGlzLCB1c2Ugb25seSByZWd1bGFyIHJlbmFtZQotCQkJCQkvLyByb3V0aW5lIG9mIGphdmEuaW8uRmlsZSBpbnN0ZWFkIG9mIElSZXNvdXJjZSByb3V0aW5lCi0JCQkJCS8vCi0JCQkJCWlmIChGaWxlVXRpbC5tb3ZlRmlsZShmaW5hbEZpbGUsIGJha0ZpbGUpKSB7Ci0JCQkJCQliYWNrdXBGaWxlID0gYmFja3VwOwotCQkJCQl9IGVsc2UgewotCQkJCQkJU3RyaW5nIG1zZyA9IE5MUy5iaW5kKAotCQkJCQkJCQlQZXJzaXN0ZW5jZVJlc291cmNlcy5yZW5hbWVFcnJvcl9tc2csCi0JCQkJCQkJCWZpbmFsRmlsZSwgYmFja3VwKTsKLQkJCQkJCXRocm93IG5ldyBNdWx0aUZpbGVJT0V4Y2VwdGlvbihtc2cpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQkvLyByZW5hbWUgdGhlIHJlc291cmNlIGZpbGUgdG8gdGhlIG9yaWdpbmFsIG5hbWUKLQkJCS8vCi0JCQlGaWxlIGN1cnJlbnRGaWxlID0gbmV3IEZpbGUod2FzTW92ZSA/IG9sZFVSSS50b0ZpbGVTdHJpbmcoKQotCQkJCQk6IGdldFVSSSgpLnRvRmlsZVN0cmluZygpKTsKLQkJCWJvb2xlYW4gc3VjY2VzcyA9IGZhbHNlOwotCQkJRXhjZXB0aW9uIGV4ID0gbnVsbDsKLQkJCWlmICh3YXNNb3ZlKSB7Ci0JCQkJc3VjY2VzcyA9IE11bHRpRmlsZVNhdmVVdGlsLm1vdmUodGhpcywgY3VycmVudEZpbGUsIGZpbmFsRmlsZSk7Ci0JCQl9IGVsc2UgewotCQkJCS8vIHNvbWUgQ00gcHJvdmlkZXIgbGlrZSBDbGVhckNhc2UgcmVuYW1lZCB0aGUgdmVyc2lvbmVkIGZpbGUgaW4KLQkJCQkvLyBpdHMgcmVwb3NpdG9yeSBhcyBzb29uIGFzIHVzZXIgcmVuYW1lZCB0aGUgZmlsZQotCQkJCS8vIGluIHRoZSB3b3Jrc3BhY2UuIFRvIGF2b2lkIHRoaXMsIHVzZSBvbmx5IHJlZ3VsYXIgcmVuYW1lCi0JCQkJLy8gcm91dGluZSBvZiBqYXZhLmlvLkZpbGUgaW5zdGVhZCBvZiBJUmVzb3VyY2Ugcm91dGluZQotCQkJCS8vCi0JCQkJdHJ5IHsKLQkJCQkJRmlsZVV0aWwuZG9Nb3ZlRmlsZShjdXJyZW50RmlsZSwgZmluYWxGaWxlKTsKLQkJCQkJc3VjY2VzcyA9IHRydWU7Ci0JCQkJfQotCQkJCWNhdGNoKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCWV4ID0gZTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoIXN1Y2Nlc3MpIHsKLQkJCQlTdHJpbmcgbXNnID0gTkxTLmJpbmQoUGVyc2lzdGVuY2VSZXNvdXJjZXMucmVuYW1lRXJyb3JfbXNnLAotCQkJCQkJY3VycmVudEZpbGUsIGZpbmFsRmlsZSk7Ci0JCQkJaWYoZXggIT0gbnVsbCkgewotCQkJCQltc2cgPSBtc2cgKyAiOiAiICArIChleC5nZXRNZXNzYWdlKCkgIT0gbnVsbCA/IGV4LmdldE1lc3NhZ2UoKSA6IGV4LnRvU3RyaW5nKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJCXRocm93IG5ldyBNdWx0aUZpbGVJT0V4Y2VwdGlvbihtc2cpOwotCQkJfSBlbHNlIHsKLQkJCQlpZiAod2FzTW92ZSkgewotCQkJCQkvLyByZWZyZXNoIHJlc29sdmUgVVJJIG9mIFJlc291cmNlRGVzY3JpcHRvciBvZiB0aGlzCi0JCQkJCS8vIHJlc291cmNlCi0JCQkJCS8vCi0JCQkJCVJlc291cmNlRGVzY3JpcHRvciByZXNEZXNjID0gTXVsdGlGaWxlU2F2ZVV0aWwKLQkJCQkJCQkuZ2V0UmVzb3VyY2VEZXNjcmlwdG9yKHRoaXMpOwotCQkJCQlpZiAocmVzRGVzYyAhPSBudWxsKSB7Ci0JCQkJCQlyZXNEZXNjLmNsZWFyUmVzb2x2ZWRVUkkoKTsKLQkJCQkJCXJlc0Rlc2MuZ2V0UmVzb2x2ZWRVUkkoKTsKLQkJCQkJfSAKLQkJCQkJZWxzZSB7Ci0JCQkJCQlpZiAoTXVsdGlGaWxlU2F2ZVV0aWwuREVCVUcpIHsKLQkJCQkJCQlNZXRob2RFbGVtZW50IGUgPSBQZXJzaXN0ZW5jZVV0aWwKLQkJCQkJCQkJCS5nZXRNZXRob2RFbGVtZW50KHRoaXMpOwotCQkJCQkJCWlmIChlICE9IG51bGwKLQkJCQkJCQkJCSYmICFnZXRMaWJyYXJ5UGVyc2lzdGVyKCkKLQkJCQkJCQkJCQkJLmhhc093blJlc291cmNlV2l0aG91dFJlZmVycmVyKGUpKSB7Ci0JCQkJCQkJCVN0cmluZyBtc2cgPSAiRkFUQUwgRVJST1I6IG5vIFJlc291cmNlRGVzY3JpcHRvciBmb3VuZCBpbiBwYXJlbnQgcmVzb3VyY2UgZm9yICIgKyB0aGlzOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJCUNvbW1vblBsdWdpbi5JTlNUQU5DRS5sb2cobXNnKTsKLQkJCQkJCQkJU3lzdGVtLmVyci5wcmludGxuKG1zZyk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0KLQkJCQkJcmVmcmVzaFVSSU9mQ2hpbGRSZXNvdXJjZXMoKTsKLQkJCQl9Ci0KLQkJCQlSZWZyZXNoSm9iLmdldEluc3RhbmNlKCkucmVzb3VyY2VTYXZlZCh0aGlzKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QmFja3VwRmlsZVBhdGgoKSB7Ci0JCVN0cmluZyBiYWNrdXBGaWxlID0gbmV3IFN0cmluZ0J1ZmZlcihnZXRUZW1wRGlyKCkpCi0JCQkJLmFwcGVuZChGaWxlLnNlcGFyYXRvcikKLQkJCQkuYXBwZW5kKGN1cnJlbnRUeElEKQotCQkJCS5hcHBlbmQoIm9sZCIpLmFwcGVuZChQZXJzaXN0ZW5jZVV0aWwuZ2V0TWV0aG9kRWxlbWVudCh0aGlzKS5nZXRHdWlkKCkpLnRvU3RyaW5nKCk7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIGJhY2t1cEZpbGU7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiB0aGUgbGFzdExvYWRUaW1lU3RhbXAKLQkgKi8KLQlwdWJsaWMgbG9uZyBnZXRMYXN0TG9hZFRpbWVTdGFtcCgpIHsKLQkJcmV0dXJuIGxhc3RMb2FkVGltZVN0YW1wOwotCX0KLQotCXN0YXRpYyB2b2lkIGNsZWFyRGV0YWNoZWRFT2JqZWN0VG9JRE1hcCgpIHsKLQkJREVUQUNIRURfRU9CSkVDVF9UT19JRF9NQVAuY2xlYXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gcmVzRGVzYwotCSAqLwotCXZvaWQgc2V0UmVzb3VyY2VEZXNjcmlwdG9yKFJlc291cmNlRGVzY3JpcHRvciByZXNEZXNjKSB7Ci0JCXJlc291cmNlRGVzY3JpcHRvciA9IHJlc0Rlc2M7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UuSUxpYnJhcnlSZXNvdXJjZSNnZXRMb2FkU3RhbXAoKQotCSAqLwotCXB1YmxpYyBsb25nIGdldExvYWRTdGFtcCgpIHsKLQkJcmV0dXJuIGdldExhc3RMb2FkVGltZVN0YW1wKCk7Ci0JfQotCi0JcHVibGljIFVSSSBnZXRQcm94eVVSSShFT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgZ3VpZCA9IE11bHRpRmlsZVNhdmVVdGlsLmdldEd1aWQob2JqZWN0KTsKLQkJaWYgKGd1aWQgIT0gbnVsbCkgewotCQkJUmVzb3VyY2VEZXNjcmlwdG9yIHJlc291cmNlRGVzY3JpcHRvciA9IHRoaXMucmVzb3VyY2VEZXNjcmlwdG9yICE9IG51bGwgPyB0aGlzLnJlc291cmNlRGVzY3JpcHRvciA6Ci0JCQkJCU11bHRpRmlsZVNhdmVVdGlsLmdldFJlc291cmNlRGVzY3JpcHRvcih0aGlzKTsKLQkJCVVSSSB1cmkgPSByZXNvdXJjZURlc2NyaXB0b3IgIT0gbnVsbCA/IE11bHRpRmlsZVVSSUNvbnZlcnRlcgotCQkJCQkuY3JlYXRlVVJJKHJlc291cmNlRGVzY3JpcHRvci5nZXRJZCgpKSA6IGdldFVSSSgpOwotCQkJcmV0dXJuIHVyaS5hcHBlbmRGcmFnbWVudChndWlkKTsKLQkJfQotCQlyZXR1cm4gZ2V0VVJJKCkuYXBwZW5kRnJhZ21lbnQoZ2V0SUQob2JqZWN0KSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VHhJRChTdHJpbmcgdHhJRCkgewotCQlzZXRUZW1wVVJJKHR4SUQpOwotCX0KLQkKLQlwcml2YXRlIElMaWJyYXJ5UGVyc2lzdGVyIGdldExpYnJhcnlQZXJzaXN0ZXIoKSB7Ci0JCXJldHVybiAoKE11bHRpRmlsZVJlc291cmNlU2V0SW1wbClyZXNvdXJjZVNldCkuZ2V0UGVyc2lzdGVyKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvTXVsdGlGaWxlWE1JU2F2ZUltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvTXVsdGlGaWxlWE1JU2F2ZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjU5ODQ3ZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL011bHRpRmlsZVhNSVNhdmVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NTYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uQ29tbW9uUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FeHRlbmRlZE1ldGFEYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuWE1MSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuWE1MUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5pbXBsLlhNSVNhdmVJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24uc2VydmljZS52ZXJzaW9uaW5nLkVQRlZlcnNpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24uc2VydmljZS52ZXJzaW9uaW5nLlZlcnNpb25VdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuUmVzb3VyY2VNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLQotLyoqCi0gKiBYTUxTYXZlIGltcGxlbWVudGF0aW9uIGZvciBsaWJyYXJ5IFhNSSBwZXJzaXN0ZW5jZQotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTXVsdGlGaWxlWE1JU2F2ZUltcGwgZXh0ZW5kcyBYTUlTYXZlSW1wbCB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTQVZFX1NFUEFSQVRFTFlfQ0xBU1NfU0VUID0gIlNBVkVfU0VQQVJBVEVMWV9DTEFTU19TRVQiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBTYXZlIG9wdGlvbnMgdG8gZm9yY2Ugc2F2aW5nIGFsbCByZXNvdXJjZXMgaW4gdGhlIHJlc291cmNlIHNldCwgd2hldGhlcgotCSAqIHRoZXkgaGF2ZSBiZWVuIG1vZGlmaWVkIG9yIHVuY2hhbmdlZC4gSXRzIHZhbHVlIG11c3QgYmUgYSBzdHJpbmcgInRydWUiCi0JICogb3IgImZhbHNlIgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNBVkVfQUxMID0gIlNBVkVfQUxMIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogU2F2ZSBvcHRpb24gdG8gc2F2ZSBvYmplY3RzIG9mIHRoZSBzYXZlIHR5cGUgdG9nZXRoZXIgaW4gdGhlIHNhbWUgZmlsZSBpZgotCSAqIE11bHRpRmlsZVV0aWwuY3JlYXRlRmlsZVVSSSgpIHJldHVybnMgdGhlIHNhbWUgVVJJIGZvciB0aGVtLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNBVkVfVE9HRVRIRVJfQ0xBU1NfU0VUID0gIlNBVkVfVE9HRVRIRVJfQ0xBU1NfU0VUIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkFDS19VUF9CRUZPUkVfU0FWRSA9ICJCQUNLX1VQX0JFRk9SRV9TQVZFIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElTQ0FSRF9VTlJFU09MVkVEX1JFRkVSRU5DRVMgPSAiRElTQ0FSRF9VTlJFU09MVkVEX1JFRkVSRU5DRVMiOyAvLyROT04tTkxTLTEkCi0KLQlzdGF0aWMgZmluYWwgU3RyaW5nIE1PRElGSUVEX1JFU09VUkNFX1NFVCA9ICJNT0RJRklFRF9SRVNPVVJDRV9TRVQiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBTYXZlIG9wdGlvbiB0byBzcGVjaWZ5IGEgVHhSZWNvcmQgdG8gbG9nIHRoZSB0cmFuc2FjdGlvbmFsIGRhdGEgZm9yCi0JICogZmFpbC1zYWZlIHBlcnNpc3RlbmNlCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuSUZpbGVCYXNlZExpYnJhcnlQZXJzaXN0ZXIuRmFpbFNhZmVNZXRob2RMaWJyYXJ5UGVyc2lzdGVyCi0JICogQHNlZSBUeFJlY29yZAotCSAqLwotCXN0YXRpYyBmaW5hbCBTdHJpbmcgVFhfUkVDT1JEID0gIlRYX1JFQ09SRCI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1VTFRJX0ZJTEUgPSAiTVVMVElfRklMRSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFNhdmUgb3B0aW9uIHRvIHJlZnJlc2ggdGhlIHdvcmtzcGFjZSB3aGVuIG5ldyByZXNvdXJjZSBpcyBjcmVhdGVkIGFuZAotCSAqIHNhdmVkLiBJdHMgdmFsdWUgbXVzdCBiZSBhIHN0cmluZyAidHJ1ZSIgb3IgImZhbHNlIgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFRlJFU0hfTkVXX1JFU09VUkNFID0gIlJFRlJFU0hfTkVXX1JFU09VUkNFIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogU2F2ZSBvcHRpb24gdG8gY2hlY2sgdGhlIHJlc291cmNlIGZvciBtb2RpZmlhYmxlIGJlZm9yZSBzYXZpbmcgaXQuIEl0cwotCSAqIHZhbHVlIG11c3QgYmUgYSBzdHJpbmcgInRydWUiIG9yICJmYWxzZSIKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDSEVDS19NT0RJRlkgPSAiQ0hFQ0tfTU9ESUZZIjsgLy8kTk9OLU5MUy0xJAotCi0JLy8gcHJpdmF0ZSBSZXNvdXJjZSByZXNvdXJjZTsKLQlwcml2YXRlIFNldCBzYXZlU2VwYXJhdGVseUNsYXNzU2V0OwotCi0JcHJpdmF0ZSBNYXAgb3B0aW9uczsKLQotCS8qKgotCSAqIEBwYXJhbSBoZWxwZXIKLQkgKi8KLQlwdWJsaWMgTXVsdGlGaWxlWE1JU2F2ZUltcGwoWE1MSGVscGVyIGhlbHBlcikgewotCQlzdXBlcihoZWxwZXIpOwotCX0KLQotCVhNTEhlbHBlciBnZXRYTUxIZWxwZXIoKSB7Ci0JCXJldHVybiBoZWxwZXI7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLmltcGwuWE1MU2F2ZUltcGwjaW5pdChvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLlhNTFJlc291cmNlLAotCSAqICAgICAgamF2YS51dGlsLk1hcCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0KFhNTFJlc291cmNlIHJlc291cmNlLCBNYXAgb3B0cykgewotCQlzdXBlci5pbml0KHJlc291cmNlLCBvcHRzKTsKLQotLy8JCWlmIChlc2NhcGUgIT0gbnVsbCkgewotLy8JCQkvLyB1c2UgTXlFc2NhcGUgdG8gbm90IGVzY2FwZSB3aGl0ZXNwYWNlcwotLy8JCQkvLwotLy8JCQllc2NhcGUgPSBuZXcgTXlFc2NhcGUoKTsKLS8vCQl9Ci0KLQkJc2F2ZVNlcGFyYXRlbHlDbGFzc1NldCA9IChTZXQpIG9wdHMuZ2V0KFNBVkVfU0VQQVJBVEVMWV9DTEFTU19TRVQpOwotCQlvcHRpb25zID0gb3B0czsKLQotCQlSZXNvdXJjZVNldCByZXNvdXJjZVNldCA9IHJlc291cmNlLmdldFJlc291cmNlU2V0KCk7Ci0JCWlmIChyZXNvdXJjZVNldCA9PSBudWxsKSB7Ci0JCQlyZXNvdXJjZVNldCA9IG5ldyBNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwoKTsKLQkJCXJlc291cmNlU2V0LmdldFJlc291cmNlcygpLmFkZChyZXNvdXJjZSk7Ci0JCX0KLQl9Ci0KLQlib29sZWFuIGNhblNhdmVTZXBhcmF0ZWx5KE9iamVjdCBvYmopIHsKLQkJcmV0dXJuIE11bHRpRmlsZVNhdmVVdGlsLmhhc093blJlc291cmNlKG9iaiwgc2F2ZVNlcGFyYXRlbHlDbGFzc1NldCk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0VW1hSFJFRihSZXNvdXJjZSByZXNvdXJjZSwgSW50ZXJuYWxFT2JqZWN0IG8pIHsKLQkJaWYgKG8uZUlzUHJveHkoKQotCQkJCSYmIG8uZVByb3h5VVJJKCkuc2NoZW1lKCkuZXF1YWxzKE11bHRpRmlsZVVSSUNvbnZlcnRlci5TQ0hFTUUpKSB7Ci0JCQlyZXR1cm4gby5lUHJveHlVUkkoKS50b1N0cmluZygpOwotCQl9Ci0JCVN0cmluZyBocmVmID0gbnVsbDsKLQkJaWYgKG8gaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQlocmVmID0gaGVscGVyLmdldEhSRUYobyk7Ci0JCX0KLQkJaWYgKGhyZWYgPT0gbnVsbCkgewotCQkJUGVyc2lzdGVuY2VQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKCJDb3VsZCBub3QgZmluZCByZXNvdXJjZSBkZXNjcmlwdG9yIGZvciByZXNvdXJjZSAiICsgcmVzb3VyY2UgKyAiXG4gIG9iamVjdDogIiArIG8pOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCXJldHVybiBNdWx0aUZpbGVTYXZlVXRpbC5nZXRIUkVGKHJlc291cmNlLCBvKTsKLQkJfQotCQlyZXR1cm4gaHJlZjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuaW1wbC5YTUxTYXZlSW1wbCNzYXZlSHJlZihvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmUpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2F2ZUhyZWYoRU9iamVjdCByZW1vdGUsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmKSB7Ci0JCWlmIChmIGluc3RhbmNlb2YgRVJlZmVyZW5jZSAmJiAoKEVSZWZlcmVuY2UpIGYpLmlzQ29udGFpbm1lbnQoKQotCQkJCSYmICF0b0RPTSkgewotCQkJLy8gaWYgdGhpcyBIUkVGIGlzIGEgY29udGFpbmVkIGVsZW1lbnQsIHNhdmUgaXRzIElEIGF0dHJpYnV0ZSBzbyB0aGUKLQkJCS8vIHByb3h5IGNhbiBiZSBjYWNoZWQgaW4gdGhlCi0JCQkvLyBHVUlEVG9FbGVtZW50TWFwIGZvciB0ZW1wb3JhcnkgdXNlIGJlZm9yZSBpdCBjYW4gYmUgcmVzb2x2ZWQuCi0JCQkvLyBUaGlzIGhlbHBzIGltcHJvdmUgbG9hZGluZyB0aW1lLgotCQkJLy8KLQkJCVN0cmluZyBocmVmID0gaGVscGVyLmdldEhSRUYocmVtb3RlKTsKLQkJCWlmIChocmVmICE9IG51bGwpIHsKLQkJCQlpZiAoZXNjYXBlVVJJICE9IG51bGwpIHsKLQkJCQkJaHJlZiA9IGVzY2FwZVVSSS5jb252ZXJ0KGhyZWYpOwotCQkJCX0KLQkJCQlTdHJpbmcgbmFtZSA9IGhlbHBlci5nZXRRTmFtZShmKTsKLQkJCQlkb2Muc3RhcnRFbGVtZW50KG5hbWUpOwotCQkJCUVDbGFzcyBlQ2xhc3MgPSByZW1vdGUuZUNsYXNzKCk7Ci0JCQkJRUNsYXNzIGV4cGVjdGVkVHlwZSA9IChFQ2xhc3MpIGYuZ2V0RVR5cGUoKTsKLQkJCQlpZiAoc2F2ZVR5cGVJbmZvID8geG1sVHlwZUluZm8uc2hvdWxkU2F2ZVR5cGUoZUNsYXNzLAotCQkJCQkJZXhwZWN0ZWRUeXBlLCBmKSA6IGVDbGFzcyAhPSBleHBlY3RlZFR5cGUKLQkJCQkJCSYmIGV4cGVjdGVkVHlwZS5pc0Fic3RyYWN0KCkpIHsKLQkJCQkJc2F2ZVR5cGVBdHRyaWJ1dGUoZUNsYXNzKTsKLQkJCQl9Ci0JCQkJU3RyaW5nIGlkID0gaGVscGVyLmdldElEKHJlbW90ZSk7Ci0JCQkJaWYgKGlkICE9IG51bGwpIHsKLQkJCQkJZG9jLmFkZEF0dHJpYnV0ZShpZEF0dHJpYnV0ZU5hbWUsIGlkKTsKLQkJCQl9Ci0JCQkJZG9jLmFkZEF0dHJpYnV0ZShYTUxSZXNvdXJjZS5IUkVGLCBocmVmKTsKLQkJCQlpZiAoZU9iamVjdFRvRXh0ZW5zaW9uTWFwICE9IG51bGwpIHsKLQkJCQkJcHJvY2Vzc0F0dHJpYnV0ZUV4dGVuc2lvbnMocmVtb3RlKTsKLQkJCQkJaWYgKHByb2Nlc3NFbGVtZW50RXh0ZW5zaW9ucyhyZW1vdGUpKSB7Ci0JCQkJCQlkb2MuZW5kRWxlbWVudCgpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJZG9jLmVuZEVtcHR5RWxlbWVudCgpOwotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJZG9jLmVuZEVtcHR5RWxlbWVudCgpOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybjsKLQkJfQotCi0JCXN1cGVyLnNhdmVIcmVmKHJlbW90ZSwgZik7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLmltcGwuWE1MU2F2ZUltcGwjc2F2ZUZlYXR1cmVzKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHNhdmVGZWF0dXJlcyhFT2JqZWN0IG8pIHsKLQkJdHJ5IHsKLQkJCU11bHRpRmlsZVhNSVJlc291cmNlSW1wbCByZXNvdXJjZSA9IChNdWx0aUZpbGVYTUlSZXNvdXJjZUltcGwpIG8KLQkJCQkJLmVSZXNvdXJjZSgpOwotCQkJaWYgKHJlc291cmNlICE9IG51bGwpIHsKLQkJCQlFT2JqZWN0IGNvbnRhaW5lciA9IG8uZUNvbnRhaW5lcigpOwotCQkJCUludGVybmFsRU9iamVjdCBpbnRlcm5hbEVPYmplY3QgPSAoKEludGVybmFsRU9iamVjdCkgbyk7Ci0JCQkJaWYgKG8gaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50ICYmIGNhblNhdmVTZXBhcmF0ZWx5KG8pCi0JCQkJCQkmJiBjb250YWluZXIgIT0gbnVsbCkgewotCQkJCQlib29sZWFuIGNvbnRhaW5zTmV3RmVhdHVyZSA9IChyZXNvdXJjZSA9PSBjb250YWluZXIKLQkJCQkJCQkuZVJlc291cmNlKCkpOwotCQkJCQlNZXRob2RFbGVtZW50IGUgPSAoTWV0aG9kRWxlbWVudCkgbzsKLQkJCQkJVVJJIHVyaSA9IE11bHRpRmlsZVNhdmVVdGlsLmNyZWF0ZVVSSShlLCByZXNvdXJjZS5nZXRSZXNvdXJjZVNldCgpKTsKLQkJCQkJaWYgKGNvbnRhaW5zTmV3RmVhdHVyZSkgewotCQkJCQkJaWYgKCFpbnRlcm5hbEVPYmplY3QuZUlzUHJveHkoKSkgewotCQkJCQkJCXJlc291cmNlID0gKE11bHRpRmlsZVhNSVJlc291cmNlSW1wbCkgTXVsdGlGaWxlU2F2ZVV0aWwKLQkJCQkJCQkJCS5zYXZlKG8sIHVyaSwgb3B0aW9ucyk7Ci0JCQkJCQl9Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQkvLyBjaGVjayBpZiB0aGVyZSBpcyBhIFJlc291cmNlRGVzY3JpcHRvciBmb3IgdGhpcwotCQkJCQkJLy8gZWxlbWVudAotCQkJCQkJLy8gY3JlYXRlIGEgbmV3IG9uZSBpZiBuZWVkZWQKLQkJCQkJCS8vCi0JCQkJCQlSZXNvdXJjZU1hbmFnZXIgcmVzTWdyID0gTXVsdGlGaWxlU2F2ZVV0aWwKLQkJCQkJCQkJLmdldFJlc291cmNlTWFuYWdlcihjb250YWluZXIuZVJlc291cmNlKCkpOwotCQkJCQkJaWYgKHJlc01nciAhPSBudWxsCi0JCQkJCQkJCSYmIHJlc01nci5nZXRSZXNvdXJjZURlc2NyaXB0b3IoZS5nZXRHdWlkKCkpID09IG51bGwpIHsKLQkJCQkJCQkvLyBtYWtlIHN1cmUgdGhhdCBubyBvdGhlciBSZXNvdXJjZU1hbmFnZXIgaGFzIGEKLQkJCQkJCQkvLyBSZXNvdXJjZURlc2NyaXB0b3IgZm9yIHRoaXMgZWxlbWVudAotCQkJCQkJCS8vCi0JCQkJCQkJTXVsdGlGaWxlVVJJQ29udmVydGVyIHVyaUNvbnZlcnRlciA9IChNdWx0aUZpbGVVUklDb252ZXJ0ZXIpIHJlc291cmNlCi0JCQkJCQkJCQkuZ2V0UmVzb3VyY2VTZXQoKS5nZXRVUklDb252ZXJ0ZXIoKTsKLQkJCQkJCQlpZiAodXJpQ29udmVydGVyCi0JCQkJCQkJCQkuZmluZFJlc291cmNlRGVzY3JpcHRvcihlLmdldEd1aWQoKSkgPT0gbnVsbCkgewotCQkJCQkJCQlNdWx0aUZpbGVTYXZlVXRpbC5yZWdpc3RlcldpdGhSZXNvdXJjZU1hbmFnZXIoCi0JCQkJCQkJCQkJcmVzTWdyLCBlLCByZXNvdXJjZS5nZXRGaW5hbFVSSSgpKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQotCQkJCQlTdHJpbmcgaHJlZiA9IGdldFVtYUhSRUYocmVzb3VyY2UsIGludGVybmFsRU9iamVjdCk7Ci0JCQkJCWRvYy5hZGRBdHRyaWJ1dGUoWE1MUmVzb3VyY2UuSFJFRiwgaHJlZik7Ci0JCQkJCWVuZFNhdmVGZWF0dXJlcyhvLCAwLCBudWxsKTsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJCWlmIChvIGluc3RhbmNlb2YgUmVzb3VyY2VNYW5hZ2VyCi0JCQkJCQkmJiBoZWxwZXIuZ2V0UmVzb3VyY2UoKSAhPSByZXNvdXJjZSkgewotCQkJCQlTdHJpbmcgaHJlZiA9IGdldFVtYUhSRUYocmVzb3VyY2UsIGludGVybmFsRU9iamVjdCk7Ci0JCQkJCWRvYy5hZGRBdHRyaWJ1dGUoWE1MUmVzb3VyY2UuSFJFRiwgaHJlZik7Ci0JCQkJCWVuZFNhdmVGZWF0dXJlcyhvLCAwLCBudWxsKTsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIHN1cGVyLnNhdmVGZWF0dXJlcyhvKTsKLQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCQlDb21tb25QbHVnaW4uSU5TVEFOQ0UubG9nKGUpOwotCQkJaWYgKE11bHRpRmlsZVNhdmVVdGlsLkRFQlVHKSB7Ci0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQlTeXN0ZW0uZXJyLnByaW50bG4oIkVSUk9SIHNhdmluZyBmZWF0dXJlOiAiICsgbyk7IC8vJE5PTi1OTFMtMSQKLQkJCQlTeXN0ZW0uZXJyLnByaW50bG4oIiAgRmVhdHVyZSByZXNvdXJjZTogIiArIG8uZVJlc291cmNlKCkpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQl0aHJvdyBlOwotCQl9Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuaW1wbC5YTUlTYXZlSW1wbCNhZGROYW1lc3BhY2VEZWNsYXJhdGlvbnMoKQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZE5hbWVzcGFjZURlY2xhcmF0aW9ucygpIHsKLQkJc3VwZXIuYWRkTmFtZXNwYWNlRGVjbGFyYXRpb25zKCk7Ci0JCQotCQlpZiAoIXRvRE9NKSB7Ci0JCQkvLyBzYXZlIHRvb2wgdmVyc2lvbiBpbmZvCi0JCQkvLwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gVmVyc2lvblV0aWwuZ2V0QWxsVG9vbElEcygpLml0ZXJhdG9yKCk7aXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJU3RyaW5nIHRvb2xJRCA9IChTdHJpbmcpaXRlci5uZXh0KCk7Ci0JCQkJRVBGVmVyc2lvbnMgZXBmVmVyc2lvbnMgPSBWZXJzaW9uVXRpbC5nZXRWZXJzaW9ucyh0b29sSUQpOwotCQkJCVN0cmluZyBuc1VyaSA9IGVwZlZlcnNpb25zLmdldE5zVVJJKCk7Ci0JCQkJZG9jLmFkZEF0dHJpYnV0ZShFeHRlbmRlZE1ldGFEYXRhLlhNTE5TX1BSRUZJWCArICI6IiArIHRvb2xJRCwgbnNVcmkpOyAvLyROT04tTkxTLTEkCi0JCQkJU3RyaW5nIHRvb2xWZXJzaW9uID0gZXBmVmVyc2lvbnMuZ2V0TWluVG9vbFZlcnNpb25Gb3JDdXJyZW50TGlicmFyeVZlcnNpb24oKS5nZXRUb29sVmVyc2lvbigpLnRvU3RyaW5nKCk7Ci0JCQkJZG9jLmFkZEF0dHJpYnV0ZSh0b29sSUQgKyAiOnZlcnNpb24iLCB0b29sVmVyc2lvbik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGNsYXNzIE15RXNjYXBlIGV4dGVuZHMgRXNjYXBlIHsKLQkJLy8gRU1GIDIuMiBpbXByb3ZlZCBFc2NhcGUgYSBsb3Qgc28gdGhlIG92ZXJyaWRlIHRoaXMgY2xhc3MgdG8gYWRkIG91ciBjb2RlIGlzIG5vIGxvbmdlciBuZWVkZWQKLQkJLy8gZXhjZXB0IHRvIG1ha2UgaXQgcHVibGljCi0JCQotCQlwdWJsaWMgTXlFc2NhcGUoKSB7Ci0JCQlzZXRNYXBwaW5nTGltaXQoMHgxMEZGRkYpOwotCQl9Ci0JfQotCi0JLy8gVE9ETzogbmVlZHMgdG8gcmV2aXNpdCB0aGlzIGNsYXNzIHBlcmlvZGljYWxseSBzaW5jZSBpdHMgYmFzZSBjbGFzcyBtaWdodCBiZSB1cGRhdGVkIGEKLQkvLyBsb3QgaW4gRU1GLgotLy8JcHVibGljIHN0YXRpYyBjbGFzcyBNeUVzY2FwZSBleHRlbmRzIEVzY2FwZSB7Ci0vLwkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1BWF9VVEZfTUFQUEFCTEVfQ09ERVBPSU5UID0gMHgxMEZGRkY7Ci0vLwotLy8JCXByb3RlY3RlZCBmaW5hbCBjaGFyW10gQkxBTksgPSB7fTsKLS8vCQkKLS8vCQlwcml2YXRlIGJvb2xlYW4gYWxsb3dDb250cm9sQ2hhcmFjdGVyczsKLS8vCi0vLwkJcHVibGljIE15RXNjYXBlKCkgewotLy8JCQlzdXBlcigpOwotLy8JCX0KLS8vCQkKLS8vCQlAT3ZlcnJpZGUKLS8vCQlwdWJsaWMgdm9pZCBzZXRBbGxvd0NvbnRyb2xDaGFyYWN0ZXJzKGJvb2xlYW4gYWxsb3dDb250cm9sQ2hhcmFjdGVycykgewotLy8JCQl0aGlzLmFsbG93Q29udHJvbENoYXJhY3RlcnMgPSBhbGxvd0NvbnRyb2xDaGFyYWN0ZXJzOwotLy8JCX0KLS8vCQkKLS8vCSAgICAvKgotLy8JICAgICAqICBDb252ZXJ0IGF0dHJpYnV0ZSB2YWx1ZXM6Ci0vLwkgICAgICogICYgdG8gJmFtcDsKLS8vCSAgICAgKiAgPCB0byAmbHQ7Ci0vLwkgICAgICogICIgdG8gJnF1b3Q7Ci0vLwkgICAgICogIFx0IHRvICYjeDk7Ci0vLwkgICAgICogIFxuIHRvICYjeEE7Ci0vLwkgICAgICogIFxyIHRvICYjeEQ7Ci0vLwkgICAgICogIAotLy8JICAgICAqICA+IHRvICZndDsgKHRoaXMgaXMgdXNlZCBmb3IgWExJRkYncykKLS8vCSAgICAgKi8KLS8vCSAgICBwdWJsaWMgU3RyaW5nIGNvbnZlcnQoU3RyaW5nIGlucHV0KQotLy8JICAgIHsKLS8vCSAgICAgIGJvb2xlYW4gY2hhbmdlZCA9IGZhbHNlOwotLy8JICAgICAgaW50IGlucHV0TGVuZ3RoID0gaW5wdXQubGVuZ3RoKCk7Ci0vLwkgICAgICBncm93KGlucHV0TGVuZ3RoKTsKLS8vCSAgICAgIGludCBvdXRwdXRQb3MgPSAwOwotLy8JICAgICAgaW50IGlucHV0UG9zID0gMDsKLS8vCSAgICAgIGNoYXIgY2ggPSAwOwotLy8JICAgICAgd2hpbGUgKGlucHV0TGVuZ3RoLS0gPiAwKQotLy8JICAgICAgewotLy8JICAgICAgICBjaCA9IGlucHV0LmNoYXJBdChpbnB1dFBvcysrKTsgLy8gdmFsdWVbb3V0cHV0UG9zXTsKLS8vCSAgICAgICAgc3dpdGNoIChjaCkKLS8vCSAgICAgICAgewotLy8JICAgICAgICAgIGNhc2UgMHgxOgotLy8JICAgICAgICAgIGNhc2UgMHgyOgotLy8JICAgICAgICAgIGNhc2UgMHgzOgotLy8JICAgICAgICAgIGNhc2UgMHg0OgotLy8JICAgICAgICAgIGNhc2UgMHg1OgotLy8JICAgICAgICAgIGNhc2UgMHg2OgotLy8JICAgICAgICAgIGNhc2UgMHg3OgotLy8JICAgICAgICAgIGNhc2UgMHg4OgotLy8JICAgICAgICAgIGNhc2UgMHhCOgotLy8JICAgICAgICAgIGNhc2UgMHhDOgotLy8JICAgICAgICAgIGNhc2UgMHhFOgotLy8JICAgICAgICAgIGNhc2UgMHhGOgotLy8JICAgICAgICAgIGNhc2UgMHgxMDoKLS8vCSAgICAgICAgICBjYXNlIDB4MTE6Ci0vLwkgICAgICAgICAgY2FzZSAweDEyOgotLy8JICAgICAgICAgIGNhc2UgMHgxMzoKLS8vCSAgICAgICAgICBjYXNlIDB4MTQ6Ci0vLwkgICAgICAgICAgY2FzZSAweDE1OgotLy8JICAgICAgICAgIGNhc2UgMHgxNjoKLS8vCSAgICAgICAgICBjYXNlIDB4MTc6Ci0vLwkgICAgICAgICAgY2FzZSAweDE4OgotLy8JICAgICAgICAgIGNhc2UgMHgxOToKLS8vCSAgICAgICAgICBjYXNlIDB4MUE6Ci0vLwkgICAgICAgICAgY2FzZSAweDFCOgotLy8JICAgICAgICAgIGNhc2UgMHgxQzoKLS8vCSAgICAgICAgICBjYXNlIDB4MUQ6Ci0vLwkgICAgICAgICAgY2FzZSAweDFFOgotLy8JICAgICAgICAgIGNhc2UgMHgxRjoKLS8vCSAgICAgICAgICB7Ci0vLwkgICAgICAgICAgICBpZiAoYWxsb3dDb250cm9sQ2hhcmFjdGVycykKLS8vCSAgICAgICAgICAgIHsKLS8vCSAgICAgICAgICAgIG91dHB1dFBvcyA9IHJlcGxhY2VDaGFycyhvdXRwdXRQb3MsIENPTlRST0xfQ0hBUkFDVEVSU1tjaF0sIGlucHV0TGVuZ3RoKTsKLS8vCSAgICAgICAgICAgIGNoYW5nZWQgPSB0cnVlOwotLy8JICAgICAgICAgICAgfQotLy8JICAgICAgICAgICAgZWxzZQotLy8JICAgICAgICAgICAgewotLy8JICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiQW4gaW52YWxpZCBYTUwgY2hhcmFjdGVyIChVbmljb2RlOiAweCIgKyBJbnRlZ2VyLnRvSGV4U3RyaW5nKGNoKSArICIpIHdhcyBmb3VuZCBpbiB0aGUgZWxlbWVudCBjb250ZW50OiIgKyBpbnB1dCk7Ci0vLwkgICAgICAgICAgICB9Ci0vLwkgICAgICAgICAgICBicmVhazsKLS8vCSAgICAgICAgICB9Ci0vLwkgICAgICAgICAgY2FzZSAnJic6Ci0vLwkgICAgICAgICAgewotLy8JICAgICAgICAgICAgb3V0cHV0UG9zID0gcmVwbGFjZUNoYXJzKG91dHB1dFBvcywgQU1QLCBpbnB1dExlbmd0aCk7Ci0vLwkgICAgICAgICAgICBjaGFuZ2VkID0gdHJ1ZTsKLS8vCSAgICAgICAgICAgIGJyZWFrOwotLy8JICAgICAgICAgIH0KLS8vCSAgICAgICAgICBjYXNlICc8JzoKLS8vCSAgICAgICAgICB7Ci0vLwkgICAgICAgICAgICBvdXRwdXRQb3MgPSByZXBsYWNlQ2hhcnMob3V0cHV0UG9zLCBMRVNTLCBpbnB1dExlbmd0aCk7Ci0vLwkgICAgICAgICAgICBjaGFuZ2VkID0gdHJ1ZTsKLS8vCSAgICAgICAgICAgIGJyZWFrOwotLy8JICAgICAgICAgIH0KLS8vCSAgICAgICAgICAvLyBiZWdpbiBuZXcgY29kZQotLy8JICAgICAgICAgIGNhc2UgJz4nOgotLy8JICAgICAgICAgIHsKLS8vCQkgICAgICAgICAgICBvdXRwdXRQb3MgPSByZXBsYWNlQ2hhcnMob3V0cHV0UG9zLCBHUkVBVEVSLCBpbnB1dExlbmd0aCk7Ci0vLwkJICAgICAgICAgICAgY2hhbmdlZCA9IHRydWU7Ci0vLwkJICAgICAgICAgICAgYnJlYWs7ICAKLS8vCSAgICAgICAgICB9Ci0vLwkgICAgICAgICAgLy8gZW5kIG5ldyBjb2RlCSAgICAgICAgICAKLS8vCSAgICAgICAgICBjYXNlICciJzoKLS8vCSAgICAgICAgICB7Ci0vLwkgICAgICAgICAgICBvdXRwdXRQb3MgPSByZXBsYWNlQ2hhcnMob3V0cHV0UG9zLCBRVU9URSwgaW5wdXRMZW5ndGgpOwotLy8JICAgICAgICAgICAgY2hhbmdlZCA9IHRydWU7Ci0vLwkgICAgICAgICAgICBicmVhazsKLS8vCSAgICAgICAgICB9Ci0vLwkgICAgICAgICAgY2FzZSAnXG4nOgotLy8JICAgICAgICAgIHsKLS8vCSAgICAgICAgICAgIG91dHB1dFBvcyA9IHJlcGxhY2VDaGFycyhvdXRwdXRQb3MsIExGLCBpbnB1dExlbmd0aCk7Ci0vLwkgICAgICAgICAgICBjaGFuZ2VkID0gdHJ1ZTsKLS8vCSAgICAgICAgICAgIGJyZWFrOwotLy8JICAgICAgICAgIH0KLS8vCSAgICAgICAgICBjYXNlICdccic6Ci0vLwkgICAgICAgICAgewotLy8JICAgICAgICAgICAgb3V0cHV0UG9zID0gcmVwbGFjZUNoYXJzKG91dHB1dFBvcywgQ1IsIGlucHV0TGVuZ3RoKTsKLS8vCSAgICAgICAgICAgIGNoYW5nZWQgPSB0cnVlOwotLy8JICAgICAgICAgICAgYnJlYWs7Ci0vLwkgICAgICAgICAgfQotLy8JICAgICAgICAgIGNhc2UgJ1x0JzoKLS8vCSAgICAgICAgICB7Ci0vLwkgICAgICAgICAgICBvdXRwdXRQb3MgPSByZXBsYWNlQ2hhcnMob3V0cHV0UG9zLCBUQUIsIGlucHV0TGVuZ3RoKTsKLS8vCSAgICAgICAgICAgIGNoYW5nZWQgPSB0cnVlOwotLy8JICAgICAgICAgICAgYnJlYWs7Ci0vLwkgICAgICAgICAgfQotLy8JICAgICAgICAgIGRlZmF1bHQ6Ci0vLwkgICAgICAgICAgewotLy8JICAgICAgICAgICAgaWYgKCFYTUxDaGFyLmlzVmFsaWQoY2gpKQotLy8JICAgICAgICAgICAgewotLy8JICAgICAgICAgICAgICBpZiAoWE1MQ2hhci5pc0hpZ2hTdXJyb2dhdGUoY2gpKQotLy8JICAgICAgICAgICAgICB7Ci0vLwkgICAgICAgICAgICAgICAgY2hhciBoaWdoID0gY2g7Ci0vLwkgICAgICAgICAgICAgICAgaWYgKGlucHV0TGVuZ3RoLS0gPiAwKQotLy8JICAgICAgICAgICAgICAgIHsKLS8vCSAgICAgICAgICAgICAgICAgIGNoID0gaW5wdXQuY2hhckF0KGlucHV0UG9zKyspOyAKLS8vCSAgICAgICAgICAgICAgICAgIGlmIChYTUxDaGFyLmlzTG93U3Vycm9nYXRlKGNoKSkKLS8vCSAgICAgICAgICAgICAgICAgIHsKLS8vCSAgICAgICAgICAgICAgICAgICAgaWYgKG1hcHBhYmxlTGltaXQgPT0gTUFYX1VURl9NQVBQQUJMRV9DT0RFUE9JTlQpCi0vLwkgICAgICAgICAgICAgICAgICAgIHsKLS8vCSAgICAgICAgICAgICAgICAgICAgICAvLyBFdmVyeSBjb2RlcG9pbnQgaXMgc3VwcG9ydGVkISAKLS8vCSAgICAgICAgICAgICAgICAgICAgICB2YWx1ZVtvdXRwdXRQb3MrK10gPSBoaWdoOwotLy8JICAgICAgICAgICAgICAgICAgICAgIHZhbHVlW291dHB1dFBvcysrXSA9IGNoOwotLy8JICAgICAgICAgICAgICAgICAgICB9Ci0vLwkgICAgICAgICAgICAgICAgICAgIGVsc2UKLS8vCSAgICAgICAgICAgICAgICAgICAgewotLy8JICAgICAgICAgICAgICAgICAgICAgIC8vIFByb2R1Y2UgdGhlIHN1cHBsZW1lbnRhbCBjaGFyYWN0ZXIgYXMgYW4gZW50aXR5Ci0vLwkgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0UG9zID0gcmVwbGFjZUNoYXJzKG91dHB1dFBvcywgKCImI3giICsgSW50ZWdlci50b0hleFN0cmluZyhYTUxDaGFyLnN1cHBsZW1lbnRhbChoaWdoLCBjaCkpICsgIjsiKS50b0NoYXJBcnJheSgpLCBpbnB1dExlbmd0aCk7Ci0vLwkgICAgICAgICAgICAgICAgICAgICAgY2hhbmdlZCA9IHRydWU7Ci0vLwkgICAgICAgICAgICAgICAgICAgIH0KLS8vCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0vLwkgICAgICAgICAgICAgICAgICB9Ci0vLwkgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiQW4gaW52YWxpZCBsb3cgc3Vycm9nYXRlIGNoYXJhY3RlciAoVW5pY29kZTogMHgiICsgSW50ZWdlci50b0hleFN0cmluZyhjaCkgKyAiKSB3YXMgZm91bmQgaW4gdGhlIGVsZW1lbnQgY29udGVudDoiICsgaW5wdXQpOwotLy8JICAgICAgICAgICAgICAgIH0KLS8vCSAgICAgICAgICAgICAgICBlbHNlCi0vLwkgICAgICAgICAgICAgICAgewotLy8JICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkFuIHVucGFpcmVkIGhpZ2ggc3Vycm9nYXRlIGNoYXJhY3RlciAoVW5pY29kZTogMHgiICsgSW50ZWdlci50b0hleFN0cmluZyhjaCkgKyAiKSB3YXMgZm91bmQgaW4gdGhlIGVsZW1lbnQgY29udGVudDoiICsgaW5wdXQpOwotLy8JICAgICAgICAgICAgICAgIH0KLS8vCSAgICAgICAgICAgICAgfQotLy8JICAgICAgICAgICAgICBlbHNlCi0vLwkgICAgICAgICAgICAgIHsKLS8vCSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiQW4gaW52YWxpZCBYTUwgY2hhcmFjdGVyIChVbmljb2RlOiAweCIgKyBJbnRlZ2VyLnRvSGV4U3RyaW5nKGNoKSArICIpIHdhcyBmb3VuZCBpbiB0aGUgZWxlbWVudCBjb250ZW50OiIgKyBpbnB1dCk7Ci0vLwkgICAgICAgICAgICAgIH0KLS8vCSAgICAgICAgICAgIH0KLS8vCSAgICAgICAgICAgIGVsc2UKLS8vCSAgICAgICAgICAgIHsKLS8vCSAgICAgICAgICAgICAgLy8gTm9ybWFsIChCTVApIHVuaWNvZGUgY29kZXBvaW50LiBTZWUgaWYgd2Uga25vdyBmb3IgYSBmYWN0IHRoYXQgdGhlIGVuY29kaW5nIHN1cHBvcnRzIGl0OgotLy8JICAgICAgICAgICAgICBpZiAoY2ggPD0gbWFwcGFibGVMaW1pdCkKLS8vCSAgICAgICAgICAgICAgewotLy8JICAgICAgICAgICAgICAgIHZhbHVlW291dHB1dFBvcysrXSA9IGNoOwotLy8JICAgICAgICAgICAgICB9Ci0vLwkgICAgICAgICAgICAgIGVsc2UKLS8vCSAgICAgICAgICAgICAgewotLy8JICAgICAgICAgICAgICAgIC8vIFdlIG5vdCBzdXJlIHRoZSBlbmNvZGluZyBzdXBwb3J0cyB0aGlzIGNvZGVwb2ludCwgc28gd2Ugd3JpdGUgaXQgYXMgYSBjaGFyYWN0ZXIgZW50aXR5IHJlZmVyZW5jZS4KLS8vCSAgICAgICAgICAgICAgICBvdXRwdXRQb3MgPSByZXBsYWNlQ2hhcnMob3V0cHV0UG9zLCAoIiYjeCIgKyBJbnRlZ2VyLnRvSGV4U3RyaW5nKGNoKSArICI7IikudG9DaGFyQXJyYXkoKSwgaW5wdXRMZW5ndGgpOwotLy8JICAgICAgICAgICAgICAgIGNoYW5nZWQgPSB0cnVlOwotLy8JICAgICAgICAgICAgICB9Ci0vLwkgICAgICAgICAgICB9Ci0vLwkgICAgICAgICAgICBicmVhazsKLS8vCSAgICAgICAgICB9Ci0vLwkgICAgICAgIH0KLS8vCSAgICAgIH0KLS8vCSAgICAgIHJldHVybiBjaGFuZ2VkID8gbmV3IFN0cmluZyh2YWx1ZSwgMCwgb3V0cHV0UG9zKSA6IGlucHV0OwotLy8JICAgIH0KLS8vCi0vLwkgICAgLyoKLS8vCSAgICAgKiAgQ29udmVydCBlbGVtZW50IHZhbHVlczoKLS8vCSAgICAgKiAgJiB0byAmYW1wOwotLy8JICAgICAqICA8IHRvICZsdDsKLS8vCSAgICAgKiAgIiB0byAmcXVvdDsKLS8vCSAgICAgKiAgXG4gdG8gbGluZSBzZXBhcmF0b3IKLS8vCSAgICAgKiAgCi0vLwkgICAgICogIFxyIHRvIGJsYW5rOwotLy8JICAgICAqICA+IHRvICZndDsgKHRoaXMgaXMgdXNlZCBmb3IgWExJRkYncykKLS8vCSAgICAgKi8KLS8vCSAgICBwdWJsaWMgU3RyaW5nIGNvbnZlcnRUZXh0KFN0cmluZyBpbnB1dCkKLS8vCSAgICB7Ci0vLwkgICAgICBib29sZWFuIGNoYW5nZWQgPSBmYWxzZTsKLS8vCSAgICAgIGludCBpbnB1dExlbmd0aCA9IGlucHV0Lmxlbmd0aCgpOwotLy8JICAgICAgZ3JvdyhpbnB1dExlbmd0aCk7Ci0vLwkgICAgICBpbnQgb3V0cHV0UG9zID0gMDsKLS8vCSAgICAgIGludCBpbnB1dFBvcyA9IDA7Ci0vLwkgICAgICBjaGFyIGNoOwotLy8JICAgICAgd2hpbGUgKGlucHV0TGVuZ3RoLS0gPiAwKQotLy8JICAgICAgewotLy8JICAgICAgICBjaCA9IGlucHV0LmNoYXJBdChpbnB1dFBvcysrKTsgLy8gdmFsdWVbb3V0cHV0UG9zXTsKLS8vCSAgICAgICAgc3dpdGNoIChjaCkKLS8vCSAgICAgICAgewotLy8JICAgICAgICAgIGNhc2UgMHgxOgotLy8JICAgICAgICAgIGNhc2UgMHgyOgotLy8JICAgICAgICAgIGNhc2UgMHgzOgotLy8JICAgICAgICAgIGNhc2UgMHg0OgotLy8JICAgICAgICAgIGNhc2UgMHg1OgotLy8JICAgICAgICAgIGNhc2UgMHg2OgotLy8JICAgICAgICAgIGNhc2UgMHg3OgotLy8JICAgICAgICAgIGNhc2UgMHg4OgotLy8JICAgICAgICAgIGNhc2UgMHhCOgotLy8JICAgICAgICAgIGNhc2UgMHhDOgotLy8JICAgICAgICAgIGNhc2UgMHhFOgotLy8JICAgICAgICAgIGNhc2UgMHhGOgotLy8JICAgICAgICAgIGNhc2UgMHgxMDoKLS8vCSAgICAgICAgICBjYXNlIDB4MTE6Ci0vLwkgICAgICAgICAgY2FzZSAweDEyOgotLy8JICAgICAgICAgIGNhc2UgMHgxMzoKLS8vCSAgICAgICAgICBjYXNlIDB4MTQ6Ci0vLwkgICAgICAgICAgY2FzZSAweDE1OgotLy8JICAgICAgICAgIGNhc2UgMHgxNjoKLS8vCSAgICAgICAgICBjYXNlIDB4MTc6Ci0vLwkgICAgICAgICAgY2FzZSAweDE4OgotLy8JICAgICAgICAgIGNhc2UgMHgxOToKLS8vCSAgICAgICAgICBjYXNlIDB4MUE6Ci0vLwkgICAgICAgICAgY2FzZSAweDFCOgotLy8JICAgICAgICAgIGNhc2UgMHgxQzoKLS8vCSAgICAgICAgICBjYXNlIDB4MUQ6Ci0vLwkgICAgICAgICAgY2FzZSAweDFFOgotLy8JICAgICAgICAgIGNhc2UgMHgxRjoKLS8vCSAgICAgICAgICB7Ci0vLwkgICAgICAgICAgICBpZiAoYWxsb3dDb250cm9sQ2hhcmFjdGVycykKLS8vCSAgICAgICAgICAgIHsKLS8vCSAgICAgICAgICAgICAgb3V0cHV0UG9zID0gcmVwbGFjZUNoYXJzKG91dHB1dFBvcywgQ09OVFJPTF9DSEFSQUNURVJTW2NoXSwgaW5wdXRMZW5ndGgpOwotLy8JICAgICAgICAgICAgICBjaGFuZ2VkID0gdHJ1ZTsKLS8vCSAgICAgICAgICAgIH0KLS8vCSAgICAgICAgICAgIGVsc2UKLS8vCSAgICAgICAgICAgIHsKLS8vCSAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkFuIGludmFsaWQgWE1MIGNoYXJhY3RlciAoVW5pY29kZTogMHgiICsgSW50ZWdlci50b0hleFN0cmluZyhjaCkgKyAiKSB3YXMgZm91bmQgaW4gdGhlIGVsZW1lbnQgY29udGVudDoiICsgaW5wdXQpOwotLy8JICAgICAgICAgICAgfQotLy8JICAgICAgICAgICAgYnJlYWs7Ci0vLwkgICAgICAgICAgfQotLy8JICAgICAgICAgIGNhc2UgJyYnOgotLy8JICAgICAgICAgIHsKLS8vCSAgICAgICAgICAgIG91dHB1dFBvcyA9IHJlcGxhY2VDaGFycyhvdXRwdXRQb3MsIEFNUCwgaW5wdXRMZW5ndGgpOwotLy8JICAgICAgICAgICAgY2hhbmdlZCA9IHRydWU7Ci0vLwkgICAgICAgICAgICBicmVhazsKLS8vCSAgICAgICAgICB9Ci0vLwkgICAgICAgICAgY2FzZSAnPCc6Ci0vLwkgICAgICAgICAgewotLy8JICAgICAgICAgICAgb3V0cHV0UG9zID0gcmVwbGFjZUNoYXJzKG91dHB1dFBvcywgTEVTUywgaW5wdXRMZW5ndGgpOwotLy8JICAgICAgICAgICAgY2hhbmdlZCA9IHRydWU7Ci0vLwkgICAgICAgICAgICBicmVhazsKLS8vCSAgICAgICAgICB9Ci0vLwkgICAgICAgICAgY2FzZSAnIic6Ci0vLwkgICAgICAgICAgewotLy8JICAgICAgICAgICAgb3V0cHV0UG9zID0gcmVwbGFjZUNoYXJzKG91dHB1dFBvcywgUVVPVEUsIGlucHV0TGVuZ3RoKTsKLS8vCSAgICAgICAgICAgIGNoYW5nZWQgPSB0cnVlOwotLy8JICAgICAgICAgICAgYnJlYWs7Ci0vLwkgICAgICAgICAgfQotLy8JICAgICAgICAgIGNhc2UgJ1xuJzoKLS8vCSAgICAgICAgICB7Ci0vLwkgICAgICAgICAgICBvdXRwdXRQb3MgPSByZXBsYWNlQ2hhcnMob3V0cHV0UG9zLCBMSU5FX0ZFRUQsIGlucHV0TGVuZ3RoKTsKLS8vCSAgICAgICAgICAgIGNoYW5nZWQgPSB0cnVlOwotLy8JICAgICAgICAgICAgYnJlYWs7Ci0vLwkgICAgICAgICAgfQotLy8JICAgICAgICAgIC8vIGJlZ2luIG1vZGlmaWVkCi0vLwkgICAgICAgICAgY2FzZSAnXHInOgotLy8JICAgICAgICAgIHsKLS8vCSAgICAgICAgICAgIG91dHB1dFBvcyA9IHJlcGxhY2VDaGFycyhvdXRwdXRQb3MsIEJMQU5LLCBpbnB1dExlbmd0aCk7Ci0vLwkgICAgICAgICAgICBjaGFuZ2VkID0gdHJ1ZTsKLS8vCSAgICAgICAgICAgIGJyZWFrOwotLy8JICAgICAgICAgIH0KLS8vCSAgICAgICAgICBjYXNlICc+JzoKLS8vCSAgICAgICAgICB7Ci0vLy8vCSAgICAgICAgICAgIGlmIChpbnB1dFBvcyA+PSAzICYmIGlucHV0LmNoYXJBdChpbnB1dFBvcyAtIDIpID09ICddJyAmJiBpbnB1dC5jaGFyQXQoaW5wdXRQb3MgLSAzKSA9PSAnXScpCi0vLy8vCSAgICAgICAgICAgIHsKLS8vLy8JICAgICAgICAgICAgICBvdXRwdXRQb3MgPSByZXBsYWNlQ2hhcnMob3V0cHV0UG9zLCBHUkVBVEVSLCBpbnB1dExlbmd0aCk7Ci0vLy8vCSAgICAgICAgICAgICAgY2hhbmdlZCA9IHRydWU7Ci0vLy8vCSAgICAgICAgICAgICAgYnJlYWs7Ci0vLy8vCSAgICAgICAgICAgIH0KLS8vLy8JICAgICAgICAgICAgLy8gY29udGludWUgd2l0aCBkZWZhdWx0IHByb2Nlc3NpbmcKLS8vCSAgICAgICAgICAgICAgb3V0cHV0UG9zID0gcmVwbGFjZUNoYXJzKG91dHB1dFBvcywgR1JFQVRFUiwgaW5wdXRMZW5ndGgpOwotLy8JICAgICAgICAgICAgICBjaGFuZ2VkID0gdHJ1ZTsKLS8vCSAgICAgICAgICAgICAgYnJlYWs7Ci0vLwkgICAgICAgICAgfQotLy8JCSAgICAgIC8vIGVuZCBtb2RpZmllZAotLy8JICAgICAgICAgIGRlZmF1bHQ6Ci0vLwkgICAgICAgICAgewotLy8JICAgICAgICAgICAgaWYgKCFYTUxDaGFyLmlzVmFsaWQoY2gpKQotLy8JICAgICAgICAgICAgewotLy8JICAgICAgICAgICAgICBpZiAoWE1MQ2hhci5pc0hpZ2hTdXJyb2dhdGUoY2gpKQotLy8JICAgICAgICAgICAgICB7Ci0vLwkgICAgICAgICAgICAgICAgY2hhciBoaWdoID0gY2g7Ci0vLwkgICAgICAgICAgICAgICAgaWYgKGlucHV0TGVuZ3RoLS0gPiAwKQotLy8JICAgICAgICAgICAgICAgIHsKLS8vCSAgICAgICAgICAgICAgICAgIGNoID0gaW5wdXQuY2hhckF0KGlucHV0UG9zKyspOyAKLS8vCSAgICAgICAgICAgICAgICAgIGlmIChYTUxDaGFyLmlzTG93U3Vycm9nYXRlKGNoKSkKLS8vCSAgICAgICAgICAgICAgICAgIHsKLS8vCSAgICAgICAgICAgICAgICAgICAgaWYgKG1hcHBhYmxlTGltaXQgPT0gTUFYX1VURl9NQVBQQUJMRV9DT0RFUE9JTlQpCi0vLwkgICAgICAgICAgICAgICAgICAgIHsKLS8vCSAgICAgICAgICAgICAgICAgICAgICAvLyBFdmVyeSBjb2RlcG9pbnQgaXMgc3VwcG9ydGVkISAKLS8vCSAgICAgICAgICAgICAgICAgICAgICB2YWx1ZVtvdXRwdXRQb3MrK10gPSBoaWdoOwotLy8JICAgICAgICAgICAgICAgICAgICAgIHZhbHVlW291dHB1dFBvcysrXSA9IGNoOwotLy8JICAgICAgICAgICAgICAgICAgICB9Ci0vLwkgICAgICAgICAgICAgICAgICAgIGVsc2UKLS8vCSAgICAgICAgICAgICAgICAgICAgewotLy8JICAgICAgICAgICAgICAgICAgICAgIC8vIFByb2R1Y2UgdGhlIHN1cHBsZW1lbnRhbCBjaGFyYWN0ZXIgYXMgYW4gZW50aXR5Ci0vLwkgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0UG9zID0gcmVwbGFjZUNoYXJzKG91dHB1dFBvcywgKCImI3giICsgSW50ZWdlci50b0hleFN0cmluZyhYTUxDaGFyLnN1cHBsZW1lbnRhbChoaWdoLCBjaCkpICsgIjsiKS50b0NoYXJBcnJheSgpLCBpbnB1dExlbmd0aCk7Ci0vLwkgICAgICAgICAgICAgICAgICAgICAgY2hhbmdlZCA9IHRydWU7Ci0vLwkgICAgICAgICAgICAgICAgICAgIH0KLS8vCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0vLwkgICAgICAgICAgICAgICAgICB9Ci0vLwkgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiQW4gaW52YWxpZCBsb3cgc3Vycm9nYXRlIGNoYXJhY3RlciAoVW5pY29kZTogMHgiICsgSW50ZWdlci50b0hleFN0cmluZyhjaCkgKyAiKSB3YXMgZm91bmQgaW4gdGhlIGVsZW1lbnQgY29udGVudDoiICsgaW5wdXQpOwotLy8JICAgICAgICAgICAgICAgIH0KLS8vCSAgICAgICAgICAgICAgICBlbHNlCi0vLwkgICAgICAgICAgICAgICAgewotLy8JICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkFuIHVucGFpcmVkIGhpZ2ggc3Vycm9nYXRlIGNoYXJhY3RlciAoVW5pY29kZTogMHgiICsgSW50ZWdlci50b0hleFN0cmluZyhjaCkgKyAiKSB3YXMgZm91bmQgaW4gdGhlIGVsZW1lbnQgY29udGVudDoiICsgaW5wdXQpOwotLy8JICAgICAgICAgICAgICAgIH0KLS8vCSAgICAgICAgICAgICAgfQotLy8JICAgICAgICAgICAgICBlbHNlCi0vLwkgICAgICAgICAgICAgIHsKLS8vCSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiQW4gaW52YWxpZCBYTUwgY2hhcmFjdGVyIChVbmljb2RlOiAweCIgKyBJbnRlZ2VyLnRvSGV4U3RyaW5nKGNoKSArICIpIHdhcyBmb3VuZCBpbiB0aGUgZWxlbWVudCBjb250ZW50OiIgKyBpbnB1dCk7Ci0vLwkgICAgICAgICAgICAgIH0KLS8vCSAgICAgICAgICAgIH0KLS8vCSAgICAgICAgICAgIGVsc2UKLS8vCSAgICAgICAgICAgIHsKLS8vCSAgICAgICAgICAgICAgLy8gTm9ybWFsIChCTVApIHVuaWNvZGUgY29kZXBvaW50LiBTZWUgaWYgd2Uga25vdyBmb3IgYSBmYWN0IHRoYXQgdGhlIGVuY29kaW5nIHN1cHBvcnRzIGl0OgotLy8JICAgICAgICAgICAgICBpZiAoY2ggPD0gbWFwcGFibGVMaW1pdCkKLS8vCSAgICAgICAgICAgICAgewotLy8JICAgICAgICAgICAgICAgIHZhbHVlW291dHB1dFBvcysrXSA9IGNoOwotLy8JICAgICAgICAgICAgICB9Ci0vLwkgICAgICAgICAgICAgIGVsc2UKLS8vCSAgICAgICAgICAgICAgewotLy8JICAgICAgICAgICAgICAgIC8vIFdlIG5vdCBzdXJlIHRoZSBlbmNvZGluZyBzdXBwb3J0cyB0aGlzIGNvZGVwb2ludCwgc28gd2Ugd3JpdGUgaXQgYXMgYSBjaGFyYWN0ZXIgZW50aXR5IHJlZmVyZW5jZS4KLS8vCSAgICAgICAgICAgICAgICBvdXRwdXRQb3MgPSByZXBsYWNlQ2hhcnMob3V0cHV0UG9zLCAoIiYjeCIgKyBJbnRlZ2VyLnRvSGV4U3RyaW5nKGNoKSArICI7IikudG9DaGFyQXJyYXkoKSwgaW5wdXRMZW5ndGgpOwotLy8JICAgICAgICAgICAgICAgIGNoYW5nZWQgPSB0cnVlOwotLy8JICAgICAgICAgICAgICB9Ci0vLwkgICAgICAgICAgICB9Ci0vLwkgICAgICAgICAgICBicmVhazsKLS8vCSAgICAgICAgICB9Ci0vLwkgICAgICAgIH0KLS8vCSAgICAgIH0KLS8vCSAgICAgIHJldHVybiBjaGFuZ2VkID8gbmV3IFN0cmluZyh2YWx1ZSwgMCwgb3V0cHV0UG9zKSA6IGlucHV0OwotLy8JICAgIH0KLS8vCi0vLwl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY2hlY2tNb2RpZnlSZXF1aXJlZChNYXAgb3B0aW9ucykgewotCQlPYmplY3Qgb3B0ID0gb3B0aW9ucy5nZXQoTXVsdGlGaWxlWE1JU2F2ZUltcGwuQ0hFQ0tfTU9ESUZZKTsKLQkJcmV0dXJuIG9wdCAhPSBudWxsID8gQm9vbGVhbi52YWx1ZU9mKG9wdC50b1N0cmluZygpKS5ib29sZWFuVmFsdWUoKQotCQkJCTogZmFsc2U7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvUGVyc2lzdGVuY2VQbHVnaW4uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvUGVyc2lzdGVuY2VQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzk4ZjY2Ni4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL1BlcnNpc3RlbmNlUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLkFic3RyYWN0QWN0aXZhdG9yOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotCi0vKioKLSAqIFRoZSBhY3RpdmF0b3IgY2xhc3MgZm9yIHRoZSBMaWJyYXJ5IFBlcnNpc3RlbmNlIHBsdWctaW4uCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUGVyc2lzdGVuY2VQbHVnaW4gZXh0ZW5kcyBBYnN0cmFjdEFjdGl2YXRvciB7Ci0KLQkvLyBUaGUgc2hhcmVkIHBsdWctaW4gaW5zdGFuY2UuCi0JcHJpdmF0ZSBzdGF0aWMgUGVyc2lzdGVuY2VQbHVnaW4gcGx1Z2luOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgUGVyc2lzdGVuY2VQbHVnaW4oKSB7Ci0JCXN1cGVyKCk7Ci0JCXBsdWdpbiA9IHRoaXM7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBBYnN0cmFjdFBsdWdpbiNzdGFydChCdW5kbGVDb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0YXJ0KGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgQWJzdHJhY3RQbHVnaW4jc3RvcChCdW5kbGVDb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RvcChjb250ZXh0KTsKLQkJcGx1Z2luID0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaGFyZWQgcGx1Zy1pbiBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFBlcnNpc3RlbmNlUGx1Z2luIGdldERlZmF1bHQoKSB7Ci0JCXJldHVybiBwbHVnaW47Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS9UeFJlY29yZC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS9UeFJlY29yZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOWMwZWFhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvVHhSZWNvcmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVW5pcXVlRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBrZWVwIHRoZSB0cmFuc2FjdGlvbiBkYXRhIHRvIHN1cHBvcnQgZmFpbC1zYWZlIHBlcnNpc3RlbmNlCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLWNsYXNzIFR4UmVjb3JkIHsKLQotCXByaXZhdGUgU3RyaW5nIHR4SUQ7Ci0KLQlwcml2YXRlIExpc3QgcmVzb3VyY2VzVG9Db21taXQ7Ci0KLQlwcm90ZWN0ZWQgTGlzdCB3YXJuaW5nczsKLQotCS8qKgotCSAqIEBwYXJhbSB0eGlkCi0JICogQHBhcmFtIGNvbW1pdAotCSAqLwotCXB1YmxpYyBUeFJlY29yZCgpIHsKLQkJc3VwZXIoKTsKLQkJcmVzb3VyY2VzVG9Db21taXQgPSBuZXcgVW5pcXVlRUxpc3QoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFR4SUQoKSB7Ci0JCWlmICh0eElEID09IG51bGwpIHsKLQkJCXR4SUQgPSBVbWFVdGlsLmdlbmVyYXRlR1VJRCgpOwotCQl9Ci0JCXJldHVybiB0eElEOwotCX0KLQotCXB1YmxpYyBMaXN0IGdldFJlc291cmNlc1RvQ29tbWl0KCkgewotCQlyZXR1cm4gcmVzb3VyY2VzVG9Db21taXQ7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiB0aGUgd2FybmluZ3MKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRXYXJuaW5ncygpIHsKLQkJaWYgKHdhcm5pbmdzID09IG51bGwpIHsKLQkJCXdhcm5pbmdzID0gbmV3IEFycmF5TGlzdCgpOwotCQl9Ci0JCXJldHVybiB3YXJuaW5nczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjbGVhcigpIHsKLQkJdHhJRCA9IG51bGw7Ci0JCXJlc291cmNlc1RvQ29tbWl0LmNsZWFyKCk7Ci0JCWlmICh3YXJuaW5ncyAhPSBudWxsKSB7Ci0JCQl3YXJuaW5ncy5jbGVhcigpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL1Vubm9ybWFsaXplZFVSSUV4Y2VwdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS9Vbm5vcm1hbGl6ZWRVUklFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGMzM2EwOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL1Vubm9ybWFsaXplZFVSSUV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLQotLyoqCi0gKiBFeGNlcHRpb24gZm9yIFVSSSB0aGF0IGNhbm5vdCBiZSBub3JtYWxpemVkLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgVW5ub3JtYWxpemVkVVJJRXhjZXB0aW9uIGV4dGVuZHMgTXVsdGlGaWxlSU9FeGNlcHRpb24gewotCi0JcHJpdmF0ZSBVUkkgdXJpOwotCi0JLyoqCi0JICogQHBhcmFtIG1zZwotCSAqLwotCXB1YmxpYyBVbm5vcm1hbGl6ZWRVUklFeGNlcHRpb24oVVJJIHVyaSwgU3RyaW5nIG1zZykgewotCQlzdXBlcihtc2cpOwotCQl0aGlzLnVyaSA9IHVyaTsKLQl9Ci0JCi0JcHVibGljIFVSSSBnZXRVUkkoKSB7Ci0JCXJldHVybiB1cmk7Ci0JfQotCi0JLyoqCi0JICogQ29tbWVudCBmb3IgPGNvZGU+c2VyaWFsVmVyc2lvblVJRDwvY29kZT4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA4MTI5MzE2MjEwNzU1MzM3ODE2TDsKLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS9YTUlMaWJyYXJ5UGVyc2lzdGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL1hNSUxpYnJhcnlQZXJzaXN0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2ExYjFlNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL1hNSUxpYnJhcnlQZXJzaXN0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2U7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzLklGaWxlQmFzZWRMaWJyYXJ5UGVyc2lzdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUgLSBPY3QgMTAsIDIwMDYKLSAqIEBzaW5jZSAgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBYTUlMaWJyYXJ5UGVyc2lzdGVyIGltcGxlbWVudHMgSUZpbGVCYXNlZExpYnJhcnlQZXJzaXN0ZXIgewotCQotCS8qKgotCSAqIENvbnRydWN0cyBhIG5ldyBYTUlMaWJyYXJ5UGVyc2lzdGVyIGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBYTUlMaWJyYXJ5UGVyc2lzdGVyKCkgewotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5JRmlsZUJhc2VkTGlicmFyeVBlcnNpc3RlciNnZXRGaWxlRXh0ZW5zaW9uKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRGaWxlRXh0ZW5zaW9uKE9iamVjdCBlKSB7Ci0JCXJldHVybiBNZXRob2RMaWJyYXJ5UGVyc2lzdGVyLklOU1RBTkNFLmdldEZpbGVFeHRlbnNpb24oZSk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLklGaWxlQmFzZWRMaWJyYXJ5UGVyc2lzdGVyI2dldEZvbGRlclJlbGF0aXZlUGF0aChvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRGb2xkZXJSZWxhdGl2ZVBhdGgoTWV0aG9kRWxlbWVudCBlKSB7Ci0JCXJldHVybiBNZXRob2RMaWJyYXJ5UGVyc2lzdGVyLklOU1RBTkNFLmdldEZvbGRlclJlbGF0aXZlUGF0aChlKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuSUZpbGVCYXNlZExpYnJhcnlQZXJzaXN0ZXIjaGFzT3duRm9sZGVyKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzT3duRm9sZGVyKE9iamVjdCBlKSB7Ci0JCXJldHVybiBNZXRob2RMaWJyYXJ5UGVyc2lzdGVyLklOU1RBTkNFLmhhc093bkZvbGRlcihlKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuSUxpYnJhcnlQZXJzaXN0ZXIjYWRqdXN0TG9jYXRpb24ob3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlKQotCSAqLwotCXB1YmxpYyB2b2lkIGFkanVzdExvY2F0aW9uKFJlc291cmNlIHJlc291cmNlKSB7Ci0JCU1ldGhvZExpYnJhcnlQZXJzaXN0ZXIuSU5TVEFOQ0UuYWRqdXN0TG9jYXRpb24ocmVzb3VyY2UpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5JTGlicmFyeVBlcnNpc3RlciNkZWxldGUob3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGRlbGV0ZShNZXRob2RFbGVtZW50IGUpIHsKLQkJTWV0aG9kTGlicmFyeVBlcnNpc3Rlci5JTlNUQU5DRS5kZWxldGUoZSk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLklMaWJyYXJ5UGVyc2lzdGVyI2dldEZhaWxTYWZlUGVyc2lzdGVyKCkKLQkgKi8KLQlwdWJsaWMgRmFpbFNhZmVNZXRob2RMaWJyYXJ5UGVyc2lzdGVyIGdldEZhaWxTYWZlUGVyc2lzdGVyKCkgewotCQlyZXR1cm4gTWV0aG9kTGlicmFyeVBlcnNpc3Rlci5JTlNUQU5DRS5nZXRGYWlsU2FmZVBlcnNpc3RlcigpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5JTGlicmFyeVBlcnNpc3RlciNnZXRXYXJuaW5ncygpCi0JICovCi0JcHVibGljIExpc3QgZ2V0V2FybmluZ3MoKSB7Ci0JCXJldHVybiBNZXRob2RMaWJyYXJ5UGVyc2lzdGVyLklOU1RBTkNFLmdldFdhcm5pbmdzKCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLklMaWJyYXJ5UGVyc2lzdGVyI2hhc093blJlc291cmNlKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzT3duUmVzb3VyY2UoT2JqZWN0IGUpIHsKLQkJcmV0dXJuIE1ldGhvZExpYnJhcnlQZXJzaXN0ZXIuSU5TVEFOQ0UuaGFzT3duUmVzb3VyY2UoZSk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLklMaWJyYXJ5UGVyc2lzdGVyI2hhc093blJlc291cmNlV2l0aG91dFJlZmVycmVyKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzT3duUmVzb3VyY2VXaXRob3V0UmVmZXJyZXIoT2JqZWN0IGUpIHsKLQkJcmV0dXJuIE1ldGhvZExpYnJhcnlQZXJzaXN0ZXIuSU5TVEFOQ0UuaGFzT3duUmVzb3VyY2VXaXRob3V0UmVmZXJyZXIoZSk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLklMaWJyYXJ5UGVyc2lzdGVyI3NhdmUob3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlKQotCSAqLwotCXB1YmxpYyB2b2lkIHNhdmUoUmVzb3VyY2UgcmVzb3VyY2UpIHRocm93cyBFeGNlcHRpb24gewotCQlNZXRob2RMaWJyYXJ5UGVyc2lzdGVyLklOU1RBTkNFLnNhdmUocmVzb3VyY2UpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5JTGlicmFyeVBlcnNpc3RlciNzYXZlKG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzYXZlKE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU1ldGhvZExpYnJhcnlQZXJzaXN0ZXIuSU5TVEFOQ0Uuc2F2ZShlbGVtZW50KTsKLQl9Ci0KLQlwdWJsaWMgRmlsZSBjcmVhdGVNZXRob2RQbHVnaW5Gb2xkZXIoU3RyaW5nIHBsdWdpbk5hbWUsIE1ldGhvZExpYnJhcnkgbGlicmFyeSkgewotCQlyZXR1cm4gTWV0aG9kTGlicmFyeVBlcnNpc3Rlci5JTlNUQU5DRS5jcmVhdGVNZXRob2RQbHVnaW5Gb2xkZXIocGx1Z2luTmFtZSwgbGlicmFyeSk7Ci0JfQotCi0JcHVibGljIEZpbGUgZ2V0RGVmYXVsdE1ldGhvZENvbmZpZ3VyYXRpb25Gb2xkZXIoTWV0aG9kTGlicmFyeSBsaWJyYXJ5KSB7Ci0JCXJldHVybiBNZXRob2RMaWJyYXJ5UGVyc2lzdGVyLklOU1RBTkNFLmdldERlZmF1bHRNZXRob2RDb25maWd1cmF0aW9uRm9sZGVyKGxpYnJhcnkpOwotCX0KLQkKLQlwdWJsaWMgRmlsZSBnZXREZWZhdWx0TWV0aG9kQ29uZmlndXJhdGlvbkZvbGRlcihNZXRob2RMaWJyYXJ5IGxpYnJhcnksCi0JCQlib29sZWFuIGNyZWF0ZSkgewotCQlyZXR1cm4gTWV0aG9kTGlicmFyeVBlcnNpc3Rlci5JTlNUQU5DRS5nZXREZWZhdWx0TWV0aG9kQ29uZmlndXJhdGlvbkZvbGRlcihsaWJyYXJ5LCBjcmVhdGUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldERlZmF1bHRNZXRob2RDb25maWd1cmF0aW9uRm9sZGVyKE1ldGhvZExpYnJhcnkgbGlicmFyeSwgRmlsZSBmaWxlKSB7Ci0JCU1ldGhvZExpYnJhcnlQZXJzaXN0ZXIuSU5TVEFOQ0Uuc2V0RGVmYXVsdE1ldGhvZENvbmZpZ3VyYXRpb25Gb2xkZXIobGlicmFyeSwgZmlsZSk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNDb250YWluZWRCeShSZXNvdXJjZSByZXNvdXJjZSwgUmVzb3VyY2UgY29udGFpbmVyUmVzb3VyY2UpIHsKLQkJcmV0dXJuIE1ldGhvZExpYnJhcnlQZXJzaXN0ZXIuSU5TVEFOQ0UuaXNDb250YWluZWRCeShyZXNvdXJjZSwgY29udGFpbmVyUmVzb3VyY2UpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0UmVzb3VyY2VGb2xkZXJQYXRoKE1ldGhvZEVsZW1lbnQgZSkgewotCQlyZXR1cm4gTWV0aG9kTGlicmFyeVBlcnNpc3Rlci5JTlNUQU5DRS5nZXRSZXNvdXJjZUZvbGRlclBhdGgoZSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRGb2xkZXJBYnNvbHV0ZVBhdGgoTWV0aG9kRWxlbWVudCBlKSB7Ci0JCXJldHVybiBNZXRob2RMaWJyYXJ5UGVyc2lzdGVyLklOU1RBTkNFLmdldEZvbGRlckFic29sdXRlUGF0aChlKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuc2VydmljZXMuSUxpYnJhcnlQZXJzaXN0ZXIjZGVsZXRlKGphdmEudXRpbC5Db2xsZWN0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIGRlbGV0ZShDb2xsZWN0aW9uPE1ldGhvZEVsZW1lbnQ+IGVsZW1lbnRzKSB7Ci0JCU1ldGhvZExpYnJhcnlQZXJzaXN0ZXIuSU5TVEFOQ0UuZGVsZXRlKGVsZW1lbnRzKTsKLQl9Ci0KLQlwdWJsaWMgRmlsZSBnZXRGaWxlKFJlc291cmNlIHJlc291cmNlKSB7Ci0JCXJldHVybiBNZXRob2RMaWJyYXJ5UGVyc2lzdGVyLklOU1RBTkNFLmdldEZpbGUocmVzb3VyY2UpOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvWE1JTGlicmFyeVJlc291cmNlU2V0RmFjdG9yeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS9YTUlMaWJyYXJ5UmVzb3VyY2VTZXRGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjMmFmOTYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS9YTUlMaWJyYXJ5UmVzb3VyY2VTZXRGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS5JTGlicmFyeVJlc291cmNlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLklMaWJyYXJ5UmVzb3VyY2VTZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy5TZXJ2aWNlczsKLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZSAtIE9jdCAyNywgMjAwNgotICogQHNpbmNlICAxLjAKLSAqLwotcHVibGljIGNsYXNzIFhNSUxpYnJhcnlSZXNvdXJjZVNldEZhY3RvcnkgaW1wbGVtZW50cyBJTGlicmFyeVJlc291cmNlU2V0RmFjdG9yeSB7Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS5JTGlicmFyeVJlc291cmNlU2V0RmFjdG9yeSNjcmVhdGVMaWJyYXJ5UmVzb3VyY2VTZXQoKQotCSAqLwotCXB1YmxpYyBJTGlicmFyeVJlc291cmNlU2V0IGNyZWF0ZUxpYnJhcnlSZXNvdXJjZVNldCgpIHsKLQkJcmV0dXJuIG5ldyBNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwoKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS5JTGlicmFyeVJlc291cmNlU2V0RmFjdG9yeSNnZXRQZXJzaXN0ZW5jZVR5cGUoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UGVyc2lzdGVuY2VUeXBlKCkgewotCQlyZXR1cm4gU2VydmljZXMuWE1JX1BFUlNJU1RFTkNFX1RZUEU7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL21pZ3JhdGlvbi9JTWlncmF0b3IuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvbWlncmF0aW9uL0lNaWdyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOGQ4MDI5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvbWlncmF0aW9uL0lNaWdyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLm1pZ3JhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLQotLyoqCi0gKiBNaWdyYXRlcyBvbmUgdmVyc2lvbiBvZiBVTUEgbGlicmFyeSB0byBhbm90aGVyCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSU1pZ3JhdG9yIHsKLQotCXZvaWQgbWlncmF0ZShTdHJpbmcgbGliUGF0aCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgRXhjZXB0aW9uOwotCXZvaWQgbWlncmF0ZShTdHJpbmcgbGliUGF0aCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBVcGdyYWRlQ2FsbGVySW5mbyBpbmZvKSB0aHJvd3MgRXhjZXB0aW9uOwotCXZvaWQgbWlncmF0ZVhtbEltcG9ydGVkTGliKE1ldGhvZExpYnJhcnkgbGliLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBFeGNlcHRpb247Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvbWlncmF0aW9uL01hcHBpbmdVdGlsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL21pZ3JhdGlvbi9NYXBwaW5nVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNWUwNWUzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvbWlncmF0aW9uL01hcHBpbmdVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLm1pZ3JhdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLkNvbW1vblBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnNlcnZpY2UudmVyc2lvbmluZy5WZXJzaW9uVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UudXRpbC5QZXJzaXN0ZW5jZVV0aWw7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLQotLyoqCi0gKiBVdGlsaXR5IGNsYXNzIHdpdGggc3RhdGljIGNvbnZlbmllbmNlIG1ldGhvZHMgdG8gcGVyZm9ybSBsaWJyYXJ5IHVwZ3JhZGUgZnJvbQotICogb2xkZXIgdmVyc2lvbi4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIE1hcHBpbmdVdGlsIHsKLQotCXByaXZhdGUgc3RhdGljIGNsYXNzIE1pZ3JhdG9yIHsKLQkJQnVuZGxlIGJ1bmRsZTsKLQotCQlTdHJpbmcgY2xhc3NOYW1lOwotCi0JCVN0cmluZyBsaWJOc1VSSTsKLQotCQlJTWlncmF0b3IgaW5zdGFuY2U7Ci0KLQkJLyoqCi0JCSAqIEBwYXJhbSBidW5kbGUKLQkJICogQHBhcmFtIGNsYXNzTmFtZQotCQkgKiBAcGFyYW0gbGliTnNVUkkKLQkJICovCi0JCXB1YmxpYyBNaWdyYXRvcihCdW5kbGUgYnVuZGxlLCBTdHJpbmcgY2xhc3NOYW1lLCBTdHJpbmcgbGliTnNVUkkpIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLmJ1bmRsZSA9IGJ1bmRsZTsKLQkJCXRoaXMuY2xhc3NOYW1lID0gY2xhc3NOYW1lOwotCQkJdGhpcy5saWJOc1VSSSA9IGxpYk5zVVJJOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgYm9vbGVhbiBsb2NhbERlYnVnID0gZmFsc2U7Ci0JcHJpdmF0ZSBzdGF0aWMgTWFwIG1pZ3JhdG9yczsKLQlwcml2YXRlIHN0YXRpYyBTZXQgb2xkTnNVcmlzID0gbmV3IEhhc2hTZXQoKTsKLQlwcml2YXRlIHN0YXRpYyBNYXA8U3RyaW5nLCBTdHJpbmc+IGFkanVzdGVkTGliTnNVUklNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsU3RyaW5nPigpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJTWlncmF0b3IgZ2V0TWlncmF0b3IoU3RyaW5nIGxpYk5zVVJJKSB7Ci0JCWlmIChtaWdyYXRvcnMgPT0gbnVsbCkgewotCQkJbWlncmF0b3JzID0gbmV3IEhhc2hNYXAoKTsKLQkJCS8vIFByb2Nlc3MgdGhlICJvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS5taWdyYXRvcnMiCi0JCQkvLyBleHRlbnNpb24gcG9pbnQKLQkJCS8vIGNvbnRyaWJ1dG9ycy4KLQkJCUlFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSA9IFBsYXRmb3JtCi0JCQkJCS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpOwotCQkJSUV4dGVuc2lvblBvaW50IGV4dGVuc2lvblBvaW50ID0gZXh0ZW5zaW9uUmVnaXN0cnkKLQkJCQkJLmdldEV4dGVuc2lvblBvaW50KAotCQkJCQkJCSJvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZSIsICJtaWdyYXRvcnMiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlpZiAoZXh0ZW5zaW9uUG9pbnQgIT0gbnVsbCkgewotCQkJCUlFeHRlbnNpb25bXSBleHRlbnNpb25zID0gZXh0ZW5zaW9uUG9pbnQuZ2V0RXh0ZW5zaW9ucygpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZXh0ZW5zaW9ucy5sZW5ndGg7IGkrKykgewotCQkJCQlJRXh0ZW5zaW9uIGV4dGVuc2lvbiA9IGV4dGVuc2lvbnNbaV07Ci0JCQkJCVN0cmluZyBwbHVnaW5JZCA9IGV4dGVuc2lvbi5nZXROYW1lc3BhY2VJZGVudGlmaWVyKCk7Ci0JCQkJCUJ1bmRsZSBidW5kbGUgPSBQbGF0Zm9ybS5nZXRCdW5kbGUocGx1Z2luSWQpOwotCQkJCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjb25maWdFbGVtZW50cyA9IGV4dGVuc2lvbgotCQkJCQkJCS5nZXRDb25maWd1cmF0aW9uRWxlbWVudHMoKTsKLQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBjb25maWdFbGVtZW50cy5sZW5ndGg7IGorKykgewotCQkJCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNvbmZpZ0VsZW1lbnQgPSBjb25maWdFbGVtZW50c1tqXTsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJU3RyaW5nIGNsYXNzTmFtZSA9IGNvbmZpZ0VsZW1lbnQKLQkJCQkJCQkJCS5nZXRBdHRyaWJ1dGUoImNsYXNzIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQlTdHJpbmcgbnNVUkkgPSBjb25maWdFbGVtZW50Ci0JCQkJCQkJCQkuZ2V0QXR0cmlidXRlKCJsaWJOc1VSSSIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJaWYgKGNsYXNzTmFtZSAhPSBudWxsCi0JCQkJCQkJCQkmJiBjbGFzc05hbWUudHJpbSgpLmxlbmd0aCgpID4gMAotCQkJCQkJCQkJJiYgbnNVUkkgIT0gbnVsbAotCQkJCQkJCQkJJiYgbnNVUkkudHJpbSgpLmxlbmd0aCgpID4gMCkgewotCQkJCQkJCQltaWdyYXRvcnMucHV0KG5zVVJJLCBuZXcgTWlncmF0b3IoYnVuZGxlLAotCQkJCQkJCQkJCWNsYXNzTmFtZSwgbnNVUkkpKTsKLQkJCQkJCQl9Ci0JCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJCUNvbW1vblBsdWdpbi5JTlNUQU5DRS5sb2coZSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJTWlncmF0b3IgbWlncmF0b3IgPSAoTWlncmF0b3IpIG1pZ3JhdG9ycy5nZXQobGliTnNVUkkpOwotCQlpZiAobWlncmF0b3IgIT0gbnVsbCkgewotCQkJaWYgKG1pZ3JhdG9yLmluc3RhbmNlID09IG51bGwpIHsKLQkJCQl0cnkgewotCQkJCQltaWdyYXRvci5pbnN0YW5jZSA9IChJTWlncmF0b3IpIG1pZ3JhdG9yLmJ1bmRsZS5sb2FkQ2xhc3MoCi0JCQkJCQkJbWlncmF0b3IuY2xhc3NOYW1lKS5uZXdJbnN0YW5jZSgpOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCUNvbW1vblBsdWdpbi5JTlNUQU5DRS5sb2coZSk7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIG1pZ3JhdG9yLmluc3RhbmNlOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gY29udmVyc2lvblJlcXVpcmVkKFN0cmluZyBsaWJQYXRoLAotCQkJVmVyc2lvblV0aWwuVmVyc2lvbkNoZWNrSW5mbyBpbmZvKSB7Ci0JCVN0cmluZyBjdXJyZW50TnNVUkkgPSBQZXJzaXN0ZW5jZVV0aWwuZ2V0VU1BTnNVUkkoKTsKLQkJU3RyaW5nIGxpYk5zVVJJID0gUGVyc2lzdGVuY2VVdGlsLmdldFVNQU5zVVJJKGxpYlBhdGgpOwotCQlsaWJOc1VSSSA9IGdldEFkanVzdGVkTGliTnNVUkkobGliTnNVUkksIGluZm8pOwotCi0JCWlmIChvbGROc1VyaXMuY29udGFpbnMobGliTnNVUkkpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlpZiAoY3VycmVudE5zVVJJLmVxdWFscyhsaWJOc1VSSSkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlib29sZWFuIHJldCA9IGdldE1pZ3JhdG9yKGxpYk5zVVJJKSAhPSBudWxsOwotCQlpZiAocmV0KSB7Ci0JCQlvbGROc1VyaXMuYWRkKGxpYk5zVVJJKTsKLQkJfQotCQlyZXR1cm4gcmV0OwotCX0KLQkKLQkvL1RoaXMgaXMgYW4gdWdseSBwaWVjZSwgYnV0IHdlIG5lZWQgaXQgZm9yIG1pZ3JhdGluZyBFUEYgMS4xLjAKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0QWRqdXN0ZWRMaWJOc1VSSShTdHJpbmcgbGliTnNVUkksIFZlcnNpb25VdGlsLlZlcnNpb25DaGVja0luZm8gaW5mbykgewotCQlTdHJpbmcgcmV0ID0gZ2V0QWRqdXN0ZWRMaWJOc1VSSV8obGliTnNVUkksIGluZm8pOwotCQlpZiAocmV0ICE9IGxpYk5zVVJJKSB7Ci0JCQlpZiAobG9jYWxEZWJ1ZykgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTEQ+IGxpYk5zVVJJOiAiICsgbGliTnNVUkkpOwkvLyROT04tTkxTLTEkIAotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTEQ+IGFkanVzdGVkTGliTnNVUkk6ICIgKyByZXQpOwkvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlhZGp1c3RlZExpYk5zVVJJTWFwLnB1dChsaWJOc1VSSSwgcmV0KTsKLQkJfQotCQlyZXR1cm4gcmV0OwotCX0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0QWRqdXN0ZWRMaWJOc1VSSV8oU3RyaW5nIGxpYk5zVVJJLCBWZXJzaW9uVXRpbC5WZXJzaW9uQ2hlY2tJbmZvIGluZm8pIHsKLQkJU3RyaW5nIGN1cnJlbnROc1VSSSA9IFBlcnNpc3RlbmNlVXRpbC5nZXRVTUFOc1VSSSgpOwotCQlpZiAoISBjdXJyZW50TnNVUkkuZXF1YWxzKGxpYk5zVVJJKSkgewotCQkJcmV0dXJuIGxpYk5zVVJJOwotCQl9IGVsc2UgaWYgKCEgbGliTnNVUkkuZXF1YWxzKCJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIikpIHsgLy8kTk9OLU5MUy0xJCAKLQkJCXJldHVybiBsaWJOc1VSSTsKLQkJfQotCQlpZiAoaW5mby50b29sVmVyc2lvbi5lcXVhbHMoaW5mby5jdXJyZW50TWluVG9vbFZlcnNpb24pKSB7Ci0JCQlyZXR1cm4gbGliTnNVUkk7Ci0JCX0KLQkJcmV0dXJuICJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjMvdW1hLmVjb3JlIjsJLy8kTk9OLU5MUy0xJCAKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWlncmF0ZShTdHJpbmcgbGliUGF0aCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBVcGdyYWRlQ2FsbGVySW5mbyBpbmZvKQotCQkJdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlNaWdyYXRvciBtaWdyYXRvciA9IGdldE1pZ3JhdG9yQnlMaWJQYXRoKGxpYlBhdGgpOwotCQlpZiAobWlncmF0b3IgIT0gbnVsbCkgewotCQkJbWlncmF0b3IubWlncmF0ZShsaWJQYXRoLCBtb25pdG9yLCBpbmZvKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIElNaWdyYXRvciBnZXRNaWdyYXRvckJ5TGliUGF0aChTdHJpbmcgbGliUGF0aCkgewotCQlTdHJpbmcgbnNVUkkgPSBQZXJzaXN0ZW5jZVV0aWwuZ2V0VU1BTnNVUkkobGliUGF0aCk7Ci0JCVN0cmluZyBhZGp1c3RlZExpYk5zVVJJID0gYWRqdXN0ZWRMaWJOc1VSSU1hcC5nZXQobnNVUkkpOwotCQlpZiAoYWRqdXN0ZWRMaWJOc1VSSSAhPSBudWxsKSB7Ci0JCQluc1VSSSA9IGFkanVzdGVkTGliTnNVUkk7Ci0JCX0KLQkJcmV0dXJuIGdldE1pZ3JhdG9yKG5zVVJJKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JCVN0cmluZyBsaWJQYXRoID0gYXJnc1swXTsKLQkJU3lzdGVtLm91dAotCQkJCS5wcmludGxuKCJTdGFydCBtaWdyYXRpbmcgbWV0aG9kIGxpYnJhcnkgYXQgJyIgKyBsaWJQYXRoICsgIicuLi4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCXRyeSB7Ci0JCQltaWdyYXRlKGxpYlBhdGgsIG51bGwsIG51bGwpOwotCQkJU3lzdGVtLm91dC5wcmludGxuKCk7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIk1pZ3JhdGlvbiBzdWNjZXNzZnVsbC4iKTsgLy8kTk9OLU5MUy0xJAotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCVN5c3RlbS5lcnIucHJpbnRsbigpOwotCQkJU3lzdGVtLmVyci5wcmludGxuKCJNaWdyYXRpb24gZmFpbGVkLiIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvbWlncmF0aW9uL01pZ3JhdGlvblJlc291cmNlSGFuZGxlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS9taWdyYXRpb24vTWlncmF0aW9uUmVzb3VyY2VIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyYzM4ZjEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS9taWdyYXRpb24vTWlncmF0aW9uUmVzb3VyY2VIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLm1pZ3JhdGlvbjsKLQotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXAuRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5YTUxSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLmltcGwuQmFzaWNSZXNvdXJjZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkFueVR5cGU7Ci0KLS8qKgotICogUmVzb3VyY2UgaGFuZGxlciBmb3IgbWlncmF0aW5nIFVNQSBsaWJyYXJ5IGZyb20gb25lIHZlcnNpb24gdG8gYW5vdGhlci4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIE1pZ3JhdGlvblJlc291cmNlSGFuZGxlciBleHRlbmRzIEJhc2ljUmVzb3VyY2VIYW5kbGVyIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUcgPSB0cnVlOwotCi0JcHVibGljIE1pZ3JhdGlvblJlc291cmNlSGFuZGxlcigpIHsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuaW1wbC5CYXNpY1Jlc291cmNlSGFuZGxlciNwb3N0TG9hZChvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLlhNTFJlc291cmNlLAotCSAqICAgICAgamF2YS5pby5JbnB1dFN0cmVhbSwgamF2YS51dGlsLk1hcCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBwb3N0TG9hZChYTUxSZXNvdXJjZSByZXNvdXJjZSwgSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0sCi0JCQlNYXAgb3B0aW9ucykgewotCQlpZiAoIXJlc291cmNlLmdldEVPYmplY3RUb0V4dGVuc2lvbk1hcCgpLmlzRW1wdHkoKSkgewotCQkJaWYgKERFQlVHKSB7Ci0JCQkJU3lzdGVtLm91dAotCQkJCQkJLnByaW50bG4oIk1pZ3JhdGlvblJlc291cmNlSGFuZGxlci5wb3N0TG9hZCgpOiAiICsgcmVzb3VyY2UuZ2V0VVJJKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKCItLS0tIFN0YXJ0IHVua25vd24gZmVhdHVyZXMgLS0tLSIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSByZXNvdXJjZS5nZXRFT2JqZWN0VG9FeHRlbnNpb25NYXAoKS5lbnRyeVNldCgpCi0JCQkJCS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBpdGVyLm5leHQoKTsKLQkJCQlpZiAoZW50cnkuZ2V0S2V5KCkgaW5zdGFuY2VvZiBFT2JqZWN0KSB7Ci0JCQkJCS8vIGhhbmRsZSBtb3ZlZCBkYXRhCi0JCQkJCS8vCi0JCQkJCWhhbmRsZVVua25vd25EYXRhKChFT2JqZWN0KSBlbnRyeS5nZXRLZXkoKSwgKEFueVR5cGUpZW50cnkuZ2V0VmFsdWUoKSk7Ci0JCQkJfQotCQkJfQotCQkJaWYgKERFQlVHKQotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiLS0tLSBFbmQgdW5rbm93biBmZWF0dXJlcyAtLS0tIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFRleHQoQW55VHlwZSB2YWx1ZSkgewotCQl0cnkgewotCQkJaWYgKHZhbHVlID09IG51bGwpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQlGZWF0dXJlTWFwLkVudHJ5IGVudHJ5ID0gKEZlYXR1cmVNYXAuRW50cnkpIHZhbHVlLmdldE1peGVkKCkuZ2V0KDApOwotCQkJcmV0dXJuIChTdHJpbmcpIGVudHJ5LmdldFZhbHVlKCk7Ci0JCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkJdGhyb3cgZTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgRUF0dHJpYnV0ZSBnZXRFQXR0cmlidXRlKEVDbGFzcyBlQ2xhc3MsIFN0cmluZyBuYW1lKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBlQ2xhc3MuZ2V0RUFsbEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpOyBpdGVyYXRvcgotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQlFQXR0cmlidXRlIGF0dHJpYiA9IChFQXR0cmlidXRlKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAoYXR0cmliLmdldE5hbWUoKS5lcXVhbHMobmFtZSkpIHsKLQkJCQlyZXR1cm4gYXR0cmliOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRWYWx1ZShFT2JqZWN0IGVPYmplY3QsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLAotCQkJT2JqZWN0IHZhbHVlKSB7Ci0JCWlmICghZmVhdHVyZS5pc01hbnkoKSkgewotCQkJZU9iamVjdC5lU2V0KGZlYXR1cmUsIHZhbHVlKTsKLQkJfSBlbHNlIHsKLQkJCUNvbGxlY3Rpb24gdmFsdWVzID0gKENvbGxlY3Rpb24pIGVPYmplY3QuZUdldChmZWF0dXJlKTsKLQkJCWlmICh2YWx1ZSBpbnN0YW5jZW9mIENvbGxlY3Rpb24pIHsKLQkJCQl2YWx1ZXMuYWRkQWxsKChDb2xsZWN0aW9uKSB2YWx1ZSk7Ci0JCQl9IGVsc2UgewotCQkJCXZhbHVlcy5hZGQodmFsdWUpOwotCQkJfQotCQl9Ci0KLQl9Ci0JCi0JcHJvdGVjdGVkIGFic3RyYWN0IGJvb2xlYW4gaGFuZGxlVW5rbm93bkZlYXR1cmUoRU9iamVjdCBvd25lciwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIE9iamVjdCB2YWx1ZSk7Ci0KLQlwcml2YXRlIHZvaWQgaGFuZGxlVW5rbm93bkZlYXR1cmVzKEVPYmplY3Qgb3duZXIsIEZlYXR1cmVNYXAgZmVhdHVyZU1hcCkgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBmZWF0dXJlTWFwLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJRmVhdHVyZU1hcC5FbnRyeSBlbnRyeSA9IChGZWF0dXJlTWFwLkVudHJ5KSBpdGVyLm5leHQoKTsKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmID0gZW50cnkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlKCk7Ci0JCQlpZihoYW5kbGVVbmtub3duRmVhdHVyZShvd25lciwgZiwgZW50cnkuZ2V0VmFsdWUoKSkpIHsKLQkJCQlpdGVyLnJlbW92ZSgpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGtleQotCSAqIEBwYXJhbSB2YWx1ZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGhhbmRsZVVua25vd25EYXRhKEVPYmplY3QgZSwgQW55VHlwZSB1bmtub3duRGF0YSkgewotCQloYW5kbGVVbmtub3duRmVhdHVyZXMoZSwgdW5rbm93bkRhdGEuZ2V0TWl4ZWQoKSk7Ci0JCWhhbmRsZVVua25vd25GZWF0dXJlcyhlLCB1bmtub3duRGF0YS5nZXRBbnlBdHRyaWJ1dGUoKSk7Ci0JfQotCi0KLQlwdWJsaWMgc3RhdGljIE9iamVjdCBnZXRTaW5nbGVWYWx1ZShGZWF0dXJlTWFwIGZlYXR1cmVNYXAsCi0JCQlTdHJpbmcgZmVhdHVyZU5hbWUpIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZmVhdHVyZU1hcC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCUZlYXR1cmVNYXAuRW50cnkgZW50cnkgPSAoRW50cnkpIGl0ZXIubmV4dCgpOwotCQkJaWYgKGVudHJ5LmdldEVTdHJ1Y3R1cmFsRmVhdHVyZSgpLmdldE5hbWUoKS5lcXVhbHMoZmVhdHVyZU5hbWUpKSB7Ci0JCQkJcmV0dXJuIGVudHJ5LmdldFZhbHVlKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBDb2xsZWN0aW9uIGdldFZhbHVlKEZlYXR1cmVNYXAgZmVhdHVyZU1hcCwKLQkJCVN0cmluZyBmZWF0dXJlTmFtZSkgewotCQlDb2xsZWN0aW9uIGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGZlYXR1cmVNYXAuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlGZWF0dXJlTWFwLkVudHJ5IGVudHJ5ID0gKEVudHJ5KSBpdGVyLm5leHQoKTsKLQkJCWlmIChlbnRyeS5nZXRFU3RydWN0dXJhbEZlYXR1cmUoKS5nZXROYW1lKCkuZXF1YWxzKGZlYXR1cmVOYW1lKSkgewotCQkJCWxpc3QuYWRkKGVudHJ5LmdldFZhbHVlKCkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBsaXN0OwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS9taWdyYXRpb24vTWlncmF0b3JJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL21pZ3JhdGlvbi9NaWdyYXRvckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzlmZjM5Yi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL21pZ3JhdGlvbi9NaWdyYXRvckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLm1pZ3JhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLQotLyoqCi0gKiBEZWZhdWx0IGltcGxlbWVudGF0b24gZm9yIElNaWdyYXRvcgotICogCi0gKiBAYXV0aG9yIFdlaXBpbmcgTHUKLSAqIAotICogQHNpbmNlIDEuMgotICovCi1wdWJsaWMgY2xhc3MgTWlncmF0b3JJbXBsIGltcGxlbWVudHMgSU1pZ3JhdG9yIHsKLQkKLQlwdWJsaWMgdm9pZCBtaWdyYXRlKFN0cmluZyBsaWJQYXRoLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBFeGNlcHRpb24gewkJCi0JfQotCQotCXB1YmxpYyB2b2lkIG1pZ3JhdGUoU3RyaW5nIGxpYlBhdGgsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgVXBncmFkZUNhbGxlckluZm8gaW5mbykgdGhyb3dzIEV4Y2VwdGlvbiB7CQkKLQl9Ci0JCi0JcHVibGljIHZvaWQgbWlncmF0ZVhtbEltcG9ydGVkTGliKE1ldGhvZExpYnJhcnkgbGliLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBFeGNlcHRpb24gewkJCi0JfQotCi0JCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL21pZ3JhdGlvbi9VTUEyVU1BUmVzb3VyY2VIYW5kbGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL21pZ3JhdGlvbi9VTUEyVU1BUmVzb3VyY2VIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0MjVkMWIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS9taWdyYXRpb24vVU1BMlVNQVJlc291cmNlSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5taWdyYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXAuRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkFueVR5cGU7Ci0KLS8qKgotICogUmVzb3VyY2UgaGFuZGxlciBmb3IgbWlncmF0aW5nIFVNQSBsaWJyYXJ5IGZyb20gb25lIHZlcnNpb24gdG8gYW5vdGhlci4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFVNQTJVTUFSZXNvdXJjZUhhbmRsZXIgZXh0ZW5kcyBNaWdyYXRpb25SZXNvdXJjZUhhbmRsZXIgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyA9IHRydWU7Ci0KLQlwcml2YXRlIExpc3QgbW92ZUluZm9zOwotCi0JcHVibGljIFVNQTJVTUFSZXNvdXJjZUhhbmRsZXIoKSB7Ci0JCW1vdmVJbmZvcyA9IG5ldyBBcnJheUxpc3QoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIEVBdHRyaWJ1dGUgZ2V0RUF0dHJpYnV0ZShFQ2xhc3MgZUNsYXNzLCBTdHJpbmcgbmFtZSkgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gZUNsYXNzLmdldEVBbGxBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IKLQkJCQkuaGFzTmV4dCgpOykgewotCQkJRUF0dHJpYnV0ZSBhdHRyaWIgPSAoRUF0dHJpYnV0ZSkgaXRlcmF0b3IubmV4dCgpOwotCQkJaWYgKGF0dHJpYi5nZXROYW1lKCkuZXF1YWxzKG5hbWUpKSB7Ci0JCQkJcmV0dXJuIGF0dHJpYjsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBTdWJjbGFzcyBjYW4gb3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gY3VzdG9taXplIHJ1bGVzIHRvIG1vdmUgZGF0YQotCSAqIAotCSAqIEBwYXJhbSBvd25lcgotCSAqIEBwYXJhbSBmZWF0dXJlTmFtZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwcm90ZWN0ZWQgRVN0cnVjdHVyYWxGZWF0dXJlIGdldE5ld0ZlYXR1cmUoRU9iamVjdCBvd25lciwgU3RyaW5nIGZlYXR1cmVOYW1lKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFN1YmNsYXNzIGNhbiBvdmVycmlkZSB0aGlzIG1ldGhvZCB0byBjdXN0b21pemUgcnVsZXMgdG8gbW92ZSBkYXRhCi0JICogCi0JICogQHBhcmFtIG9sZE93bmVyCi0JICogQHBhcmFtIGZlYXR1cmVOYW1lCi0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBFT2JqZWN0IGdldE5ld093bmVyKEVPYmplY3Qgb2xkT3duZXIsIFN0cmluZyBmZWF0dXJlTmFtZSkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgT2JqZWN0IGdldE5ld1ZhbHVlKEVPYmplY3Qgb2xkT3duZXIsIFN0cmluZyBmZWF0dXJlTmFtZSwKLQkJCUFueVR5cGUgdmFsdWUpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgbW92ZURhdGEoKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IG1vdmVJbmZvcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU1vdmVJbmZvIGluZm8gPSAoTW92ZUluZm8pIGl0ZXIubmV4dCgpOwotCQkJRU9iamVjdCBuZXdPd25lciA9IGdldE5ld093bmVyKGluZm8ub2xkT3duZXIsIGluZm8ub2xkRmVhdHVyZU5hbWUpOwotCQkJaWYgKG5ld093bmVyICE9IG51bGwpIHsKLQkJCQlzZXRWYWx1ZShuZXdPd25lciwgaW5mby5uZXdGZWF0dXJlLCBpbmZvLnZhbHVlKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRWYWx1ZShFT2JqZWN0IGVPYmplY3QsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLAotCQkJT2JqZWN0IHZhbHVlKSB7Ci0JCWlmICghZmVhdHVyZS5pc01hbnkoKSkgewotCQkJZU9iamVjdC5lU2V0KGZlYXR1cmUsIHZhbHVlKTsKLQkJfSBlbHNlIHsKLQkJCUNvbGxlY3Rpb24gdmFsdWVzID0gKENvbGxlY3Rpb24pIGVPYmplY3QuZUdldChmZWF0dXJlKTsKLQkJCWlmICh2YWx1ZSBpbnN0YW5jZW9mIENvbGxlY3Rpb24pIHsKLQkJCQl2YWx1ZXMuYWRkQWxsKChDb2xsZWN0aW9uKSB2YWx1ZSk7Ci0JCQl9IGVsc2UgewotCQkJCXZhbHVlcy5hZGQodmFsdWUpOwotCQkJfQotCQl9Ci0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBNb3ZlSW5mbyB7Ci0JCUVPYmplY3Qgb2xkT3duZXI7Ci0KLQkJU3RyaW5nIG9sZEZlYXR1cmVOYW1lOwotCi0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBuZXdGZWF0dXJlOwotCi0JCU9iamVjdCB2YWx1ZTsKLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjdG9TdHJpbmcoKQotCQkgKi8KLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiBuZXcgU3RyaW5nQnVmZmVyKCkKLQkJCQkJLmFwcGVuZChnZXRDbGFzcygpLmdldE5hbWUoKSkKLQkJCQkJLmFwcGVuZCgiKFxuIikgLy8kTk9OLU5MUy0xJAotCQkJCQkuYXBwZW5kKCIgIG9sZEZlYXR1cmVOYW1lOiAiKS5hcHBlbmQob2xkRmVhdHVyZU5hbWUpLmFwcGVuZCgnXG4nKSAvLyROT04tTkxTLTEkCi0JCQkJCS5hcHBlbmQoIiAgbmV3RmVhdHVyZTogIikuYXBwZW5kKG5ld0ZlYXR1cmUpLmFwcGVuZCgnXG4nKSAvLyROT04tTkxTLTEkCi0JCQkJCS5hcHBlbmQoIiAgdmFsdWU6ICIpLmFwcGVuZCh2YWx1ZSkuYXBwZW5kKCdcbicpIC8vJE5PTi1OTFMtMSQKLQkJCQkJLmFwcGVuZCgiKSIpLnRvU3RyaW5nKCk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IGdldFNpbmdsZVZhbHVlKEZlYXR1cmVNYXAgZmVhdHVyZU1hcCwKLQkJCVN0cmluZyBmZWF0dXJlTmFtZSkgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBmZWF0dXJlTWFwLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJRmVhdHVyZU1hcC5FbnRyeSBlbnRyeSA9IChFbnRyeSkgaXRlci5uZXh0KCk7Ci0JCQlpZiAoZW50cnkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlKCkuZ2V0TmFtZSgpLmVxdWFscyhmZWF0dXJlTmFtZSkpIHsKLQkJCQlyZXR1cm4gZW50cnkuZ2V0VmFsdWUoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIENvbGxlY3Rpb24gZ2V0VmFsdWUoRmVhdHVyZU1hcCBmZWF0dXJlTWFwLAotCQkJU3RyaW5nIGZlYXR1cmVOYW1lKSB7Ci0JCUNvbGxlY3Rpb24gbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZmVhdHVyZU1hcC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCUZlYXR1cmVNYXAuRW50cnkgZW50cnkgPSAoRW50cnkpIGl0ZXIubmV4dCgpOwotCQkJaWYgKGVudHJ5LmdldEVTdHJ1Y3R1cmFsRmVhdHVyZSgpLmdldE5hbWUoKS5lcXVhbHMoZmVhdHVyZU5hbWUpKSB7Ci0JCQkJbGlzdC5hZGQoZW50cnkuZ2V0VmFsdWUoKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGxpc3Q7Ci0JfQotCi0JcHVibGljIHZvaWQgY2xlYXJNb3ZlSW5mb3MoKSB7Ci0JCW1vdmVJbmZvcy5jbGVhcigpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UubWlncmF0aW9uLk1pZ3JhdGlvblJlc291cmNlSGFuZGxlciNoYW5kbGVVbmtub3duRmVhdHVyZShvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCwgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZSwgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBoYW5kbGVVbmtub3duRmVhdHVyZShFT2JqZWN0IG93bmVyLCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgT2JqZWN0IHZhbHVlKSB7Ci0JCVN0cmluZyBmZWF0dXJlTmFtZSA9IGZlYXR1cmUuZ2V0TmFtZSgpOwotCQlFU3RydWN0dXJhbEZlYXR1cmUgbmV3RmVhdHVyZSA9IGdldE5ld0ZlYXR1cmUob3duZXIsIGZlYXR1cmVOYW1lKTsKLQkJaWYgKG5ld0ZlYXR1cmUgIT0gbnVsbCkgewotCQkJTW92ZUluZm8gbW92ZUluZm8gPSBuZXcgTW92ZUluZm8oKTsKLQkJCW1vdmVJbmZvLm9sZE93bmVyID0gb3duZXI7Ci0JCQltb3ZlSW5mby5vbGRGZWF0dXJlTmFtZSA9IGZlYXR1cmVOYW1lOwotCQkJbW92ZUluZm8ubmV3RmVhdHVyZSA9IG5ld0ZlYXR1cmU7Ci0JCQltb3ZlSW5mby52YWx1ZSA9IHZhbHVlIGluc3RhbmNlb2YgQW55VHlwZSA/IGdldE5ld1ZhbHVlKAotCQkJCQlvd25lciwgZmVhdHVyZU5hbWUsIChBbnlUeXBlKSB2YWx1ZSkKLQkJCQkJOiB2YWx1ZTsKLQkJCW1vdmVJbmZvcy5hZGQobW92ZUluZm8pOwotCQkJaWYgKERFQlVHKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKG1vdmVJbmZvKTsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oKTsKLQkJCX0KLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvbWlncmF0aW9uL1VwZ3JhZGVDYWxsZXJJbmZvLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL21pZ3JhdGlvbi9VcGdyYWRlQ2FsbGVySW5mby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0M2NlNjc1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvbWlncmF0aW9uL1VwZ3JhZGVDYWxsZXJJbmZvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5taWdyYXRpb247Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLS8qKgotICogQ2xhc3MgcmVwcmVzZW50aW5nIGNhbGxlciBpbmZvIGZvciBjYWxsaW5nIGxpYnJhcnkgdXBncmFkZSBjb2RlLgotICogCi0gKiBAYXV0aG9yIFdlaXBpbmcgTHUKLSAqIAotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgVXBncmFkZUNhbGxlckluZm8gewotCQotCXB1YmxpYyBzdGF0aWMgaW50IHVwZ3JhZGVMaWJyYXJ5ID0gMDsKLQlwdWJsaWMgc3RhdGljIGludCB1cGdyYWRlSW1wb3J0UGx1Z2luID0gMTsKLQlwdWJsaWMgc3RhdGljIGludCB1cGdyYWRlSW1wb3J0Q29uZmlnID0gMjsKLQkKLQlwcml2YXRlIGludCBjYWxsZXJUeXBlID0gdXBncmFkZUxpYnJhcnk7Ci0JcHJpdmF0ZSBTdHJpbmcgZXJyb3JNc2c7Ci0JRmlsZSBsaWJGaWxlOwotCUZpbGUgY29waWVkTGliRmlsZTsKLQkKLQlwdWJsaWMgVXBncmFkZUNhbGxlckluZm8oaW50IGNhbGxlclR5cGUsIEZpbGUgbGliRmlsZSkgewotCQl0aGlzLmNhbGxlclR5cGUgPSBjYWxsZXJUeXBlOwotCQl0aGlzLmxpYkZpbGUgPSBsaWJGaWxlOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNVcGdyYWRlTGlicmFyeShVcGdyYWRlQ2FsbGVySW5mbyBpbmZvKSB7Ci0JCXJldHVybiBpbmZvID09IG51bGwgfHwgaW5mby5pc1VwZ3JhZGVMaWJyYXJ5KCk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGlzVXBncmFkZUxpYnJhcnkoKSB7Ci0JCXJldHVybiBjYWxsZXJUeXBlID09IHVwZ3JhZGVMaWJyYXJ5OwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBnZXRJc0V4cG9ydGVkUGx1Z2luTGliKCkgewotCQlyZXR1cm4gY2FsbGVyVHlwZSA9PSB1cGdyYWRlSW1wb3J0UGx1Z2luOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRFcnJvck1zZyhTdHJpbmcgbXNnKSB7Ci0JCWVycm9yTXNnID0gbXNnOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldEVycm9yTXNnKCkgewotCQlyZXR1cm4gZXJyb3JNc2c7Ci0JfQkJCQotCQotCXB1YmxpYyB2b2lkIHNldENvcGllZExpYkZpbGUoRmlsZSBmaWxlKSB7Ci0JCWNvcGllZExpYkZpbGUgPSBmaWxlOwotCX0KLQkKLQlwdWJsaWMgRmlsZSBnZXRDb3BpZWRMaWJGaWxlKCkgewotCQlyZXR1cm4gY29waWVkTGliRmlsZTsKLQl9Ci0JCi0JcHJvdGVjdGVkIEZpbGUgZ2V0TGliRmlsZSgpIHsKLQkJcmV0dXJuIGxpYkZpbGU7Ci0JfQotCi0JcHVibGljIHZvaWQgY29weUxpYnJhcnkoKSB7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJlbW92ZUNvcGllZExpYnJhcnkoKSB7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS9taWdyYXRpb24vaW50ZXJuYWwvTWlncmF0b3IuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvbWlncmF0aW9uL2ludGVybmFsL01pZ3JhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzODVhYTIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS9taWdyYXRpb24vaW50ZXJuYWwvTWlncmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyNSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UubWlncmF0aW9uLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uQ29tbW9uUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzaWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRVBhY2thZ2VSZWdpc3RyeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5VUklDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLmltcGwuUmVzb3VyY2VTZXRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FeHRlbmRlZE1ldGFEYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuSWxsZWdhbFZhbHVlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuWE1MSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuWE1MUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5pbXBsLlhNSVJlc291cmNlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQW55VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYubWFwcGluZy5lY29yZTJ4bWwuRWNvcmUyWE1MUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYubWFwcGluZy5lY29yZTJ4bWwuRWNvcmUyWE1MUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLm1hcHBpbmcuZWNvcmUyeG1sLmltcGwuRWNvcmUyWE1MUmVnaXN0cnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5tYXBwaW5nLmVjb3JlMnhtbC51dGlsLkVjb3JlMlhNTEV4dGVuZGVkTWV0YURhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLk11bHRpRmlsZVJlc291cmNlU2V0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UuTXVsdGlGaWxlVVJJQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5NdWx0aUZpbGVYTUlIZWxwZXJJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5NdWx0aUZpbGVYTUlSZXNvdXJjZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLm1pZ3JhdGlvbi5VTUEyVU1BUmVzb3VyY2VIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS51dGlsLlBlcnNpc3RlbmNlUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS51dGlsLlBlcnNpc3RlbmNlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmVzb3VyY2VtYW5hZ2VyLlJlc291cmNlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmVzb3VyY2VtYW5hZ2VyLlJlc291cmNlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkd1aWRlbGluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkNvbnRlbnREZXNjcmlwdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci0KLS8qKgotICogTWlncmF0ZXMgb25lIHZlcnNpb24gb2YgVU1BIGxpYnJhcnkgdG8gYW5vdGhlciB1c2luZyB0aGUgcHJvdmlkZWQgRWNvcmUyWE1MCi0gKiBtYXBwaW5nIGZpbGVzIGFuZCBVTUEyVU1BUmVzb3VyY2VIYW5kbGVyLiBUaGUgRWNvcmUyWE1MIG1hcHBpbmcgZmlsZXMKLSAqIHNwZWNpZmllcyB0aGUgbmFtZSBjaGFuZ2VzIG9mIGNsYXNzZXMvYXR0cmlidXRlcyB3aGlsZSBVTUEyVU1BUmVzb3VyY2VIYW5kbGVyCi0gKiBoYW5kbGVzIHRoZSBkYXRhIG1vdmluZy4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIE1pZ3JhdG9yIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBOU19VUklzID0geyBNaWdyYXRvci5PTERfVU1BX05TX1VSSSwKLQkJCU1pZ3JhdG9yLk9MRF9VTUFfTlNfVVJJLCBNaWdyYXRvci5VTUFfTlNfVVJJIH07Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBVUklbXSBFQ09SRTJYTUxfVVJJcyA9IHsKLQkJCVVSSQotCQkJCQkuY3JlYXRlVVJJKCJwbGF0Zm9ybTovcGx1Z2luL2NvbS5pYm0ucnBtLmxpYnJhcnkucGVyc2lzdGVuY2UvbWlncmF0aW9uL3VtYS5lY29yZTJ4bWwiKSAvLyROT04tTkxTLTEkCi0JCQksCi0JCQlVUkkKLQkJCQkJLmNyZWF0ZVVSSSgicGxhdGZvcm06L3BsdWdpbi9jb20uaWJtLnJwbS5saWJyYXJ5LnBlcnNpc3RlbmNlL21pZ3JhdGlvbi91bWEyLmVjb3JlMnhtbCIpIC8vJE5PTi1OTFMtMSQKLQkJCSwKLQkJCVVSSQotCQkJCQkuY3JlYXRlVVJJKCJwbGF0Zm9ybTovcGx1Z2luL2NvbS5pYm0ucnBtLmxpYnJhcnkucGVyc2lzdGVuY2UvbWlncmF0aW9uL3VtYTMuZWNvcmUyeG1sIikgLy8kTk9OLU5MUy0xJAotCX07Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPTERfVU1BX05TX1VSSSA9ICJodHRwOi8vL2NvbS9pYm0vdW1hLmVjb3JlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVU1BX05TX1VSSSA9ICJodHRwOi8vd3d3LmlibS5jb20vdW1hLzEuMC4yL3VtYS5lY29yZSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgRXh0ZW5kZWRNZXRhRGF0YVtdIGV4dGVuZGVkTWV0YURhdGFzOwotCi0JcHJpdmF0ZSBVTUEyVU1BUmVzb3VyY2VIYW5kbGVyMCByZXNvdXJjZUhhbmRsZXI7Ci0KLQlwdWJsaWMgSGFzaE1hcCBvbGRQYXRoVG9OZXdVUklNYXAgPSBuZXcgSGFzaE1hcCgpOwotCi0JcHVibGljIENvbGxlY3Rpb24gYW55VHlwZUZlYXR1cmVWYWx1ZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBFeHRlbmRlZE1ldGFEYXRhIGdldEV4dGVuZGVkTWV0YURhdGEoU3RyaW5nIG9sZE5zVVJJLAotCQkJVVJJIGVjb3JlMlhNTFVSSSkgewotCQlFUGFja2FnZS5SZWdpc3RyeSBlUGFja2FnZVJlZ2lzdHJ5ID0gbmV3IEVQYWNrYWdlUmVnaXN0cnlJbXBsKAotCQkJCUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFKTsKLQkJZVBhY2thZ2VSZWdpc3RyeS5wdXQob2xkTnNVUkksIFVtYVBhY2thZ2UuZUlOU1RBTkNFKTsKLQotCQlFY29yZTJYTUxSZWdpc3RyeSBlY29yZTJ4bWxSZWdpc3RyeSA9IG5ldyBFY29yZTJYTUxSZWdpc3RyeUltcGwoCi0JCQkJRWNvcmUyWE1MUmVnaXN0cnkuSU5TVEFOQ0UpOwotCi0JCWVjb3JlMnhtbFJlZ2lzdHJ5Ci0JCQkJLnB1dChvbGROc1VSSSwgRWNvcmVVdGlsLmdldE9iamVjdEJ5VHlwZShuZXcgUmVzb3VyY2VTZXRJbXBsKCkKLQkJCQkJCS5nZXRSZXNvdXJjZShlY29yZTJYTUxVUkksIHRydWUpLmdldENvbnRlbnRzKCksCi0JCQkJCQlFY29yZTJYTUxQYWNrYWdlLmVJTlNUQU5DRS5nZXRYTUxNYXAoKSkpOwotCi0JCXJldHVybiBuZXcgRWNvcmUyWE1MRXh0ZW5kZWRNZXRhRGF0YShlUGFja2FnZVJlZ2lzdHJ5LAotCQkJCWVjb3JlMnhtbFJlZ2lzdHJ5KSB7Ci0JCQlwdWJsaWMgRUNsYXNzaWZpZXIgZ2V0VHlwZShFUGFja2FnZSBlUGFja2FnZSwgU3RyaW5nIG5hbWUpIHsKLQkJCQlFQ2xhc3NpZmllciB0eXBlID0gc3VwZXIuZ2V0VHlwZShlUGFja2FnZSwgbmFtZSk7Ci0KLQkJCQlpZiAodHlwZSA9PSBudWxsKSB7Ci0JCQkJCS8vIHRyeSB0byBnZXQgdHlwZSBmcm9tIHRoZSBwYWNrYWdlIHdpdGggdGhlIGdpdmVuIG5hbWUKLQkJCQkJLy8KLQkJCQkJTGlzdCBlQ2xhc3NpZmllcnMgPSBlUGFja2FnZS5nZXRFQ2xhc3NpZmllcnMoKTsKLQkJCQkJZm9yIChpbnQgaSA9IDAsIHNpemUgPSBlQ2xhc3NpZmllcnMuc2l6ZSgpOyBpIDwgc2l6ZTsgKytpKSB7Ci0JCQkJCQlFQ2xhc3NpZmllciBlQ2xhc3NpZmllciA9IChFQ2xhc3NpZmllcikgZUNsYXNzaWZpZXJzCi0JCQkJCQkJCS5nZXQoaSk7Ci0JCQkJCQlpZiAobmFtZS5lcXVhbHMoZUNsYXNzaWZpZXIuZ2V0TmFtZSgpKSkgewotCQkJCQkJCXJldHVybiBlQ2xhc3NpZmllcjsKLQkJCQkJCX0KLQkJCQkJfQotCi0JCQkJfQotCi0JCQkJcmV0dXJuIHR5cGU7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHVibGljIE1pZ3JhdG9yKCkgewotCQl0aGlzKE5TX1VSSXMsIEVDT1JFMlhNTF9VUklzKTsKLQl9Ci0KLQlwdWJsaWMgTWlncmF0b3IoU3RyaW5nW10gbnNVUklzLCBVUklbXSBlY29yZTJYTUxVUklzKSB7Ci0JCWludCBzaXplID0gZWNvcmUyWE1MVVJJcy5sZW5ndGg7Ci0JCWV4dGVuZGVkTWV0YURhdGFzID0gbmV3IEV4dGVuZGVkTWV0YURhdGFbc2l6ZV07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZWNvcmUyWE1MVVJJcy5sZW5ndGg7IGkrKykgewotCQkJZXh0ZW5kZWRNZXRhRGF0YXNbaV0gPSBnZXRFeHRlbmRlZE1ldGFEYXRhKG5zVVJJc1tpXSwKLQkJCQkJZWNvcmUyWE1MVVJJc1tpXSk7Ci0JCX0KLQkJdGhpcy5yZXNvdXJjZUhhbmRsZXIgPSBuZXcgVU1BMlVNQVJlc291cmNlSGFuZGxlcjAoKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHVwZGF0ZVN0YXR1cyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIFN0cmluZyBtc2cpIHsKLQkJaWYgKG1vbml0b3IgIT0gbnVsbCkgewotCQkJbW9uaXRvci5zZXRUYXNrTmFtZShtc2cpOwotCQl9IGVsc2UgewotCQkJU3lzdGVtLm91dC5wcmludGxuKG1zZyk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBBbnlUeXBlRmVhdHVyZVZhbHVlIHsKLQkJU3RyaW5nIG93bmVySWQ7Ci0KLQkJRU9iamVjdCBvd25lcjsKLQotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZTsKLQotCQlTdHJpbmcgdmFsdWVJZDsKLQotCQlBbnlUeXBlIHZhbHVlOwotCi0JCWludCBpbmRleDsKLQl9Ci0KLQljbGFzcyBNaWdyYXRvclVSSUNvbnZlcnRlciBleHRlbmRzIE11bHRpRmlsZVVSSUNvbnZlcnRlciB7Ci0JCXByaXZhdGUgUmVzb3VyY2VNYW5hZ2VyIG9sZFJlc01ncjsKLQotCQkvKioKLQkJICogQHBhcmFtIHJlc291cmNlU2V0Ci0JCSAqLwotCQlwdWJsaWMgTWlncmF0b3JVUklDb252ZXJ0ZXIoTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsIHJlc291cmNlU2V0KSB7Ci0JCQlzdXBlcihyZXNvdXJjZVNldCk7Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIGNvbS5pYm0udW1hLnBlcnNpc3RlbmNlLk11bHRpRmlsZVVSSUNvbnZlcnRlciNub3JtYWxpemUob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSSkKLQkJICovCi0JCXB1YmxpYyBVUkkgbm9ybWFsaXplKFVSSSB1cmkpIHsKLQkJCVVSSSBub3JtYWxpemVkID0gc3VwZXIubm9ybWFsaXplKHVyaSk7Ci0JCQlpZiAobm9ybWFsaXplZCA9PSBudWxsICYmIFNDSEVNRS5lcXVhbHNJZ25vcmVDYXNlKHVyaS5zY2hlbWUoKSkpIHsKLQkJCQlpZiAob2xkUmVzTWdyICE9IG51bGwpIHsKLQkJCQkJU3RyaW5nIGlkID0gdXJpLmF1dGhvcml0eSgpOwotCQkJCQlub3JtYWxpemVkID0gZ2V0VVJJRnJvbU9sZFJlc291cmNlTWFuYWdlcihpZCk7Ci0JCQkJCWlmIChub3JtYWxpemVkICE9IG51bGwpIHsKLQkJCQkJCWlmICh1cmkuaGFzRnJhZ21lbnQoKSkgewotCQkJCQkJCW5vcm1hbGl6ZWQgPSBub3JtYWxpemVkLmFwcGVuZEZyYWdtZW50KHVyaQotCQkJCQkJCQkJLmZyYWdtZW50KCkpOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlub3JtYWxpemVkID0gbm9ybWFsaXplZC5hcHBlbmRGcmFnbWVudChpZCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCX0KLQkJCXJldHVybiBub3JtYWxpemVkOwotCQl9Ci0KLQkJcHVibGljIFVSSSBnZXRVUklGcm9tT2xkUmVzb3VyY2VNYW5hZ2VyKFN0cmluZyBpZCkgewotCQkJaWYgKG9sZFJlc01nciA9PSBudWxsKQotCQkJCXJldHVybiBudWxsOwotCQkJUmVzb3VyY2VEZXNjcmlwdG9yIGRlc2MgPSBvbGRSZXNNZ3IuZ2V0UmVzb3VyY2VEZXNjcmlwdG9yKGlkKTsKLQkJCWlmIChkZXNjICE9IG51bGwpIHsKLQkJCQlVUkkgbm9ybWFsaXplZCA9IGRlc2MuZ2V0UmVzb2x2ZWRVUkkoKTsKLQkJCQlVUkkgbmV3VVJJID0gKFVSSSkgb2xkUGF0aFRvTmV3VVJJTWFwLmdldChub3JtYWxpemVkCi0JCQkJCQkudG9GaWxlU3RyaW5nKCkpOwotCQkJCWlmIChuZXdVUkkgIT0gbnVsbCkgewotCQkJCQlub3JtYWxpemVkID0gbmV3VVJJOwotCQkJCX0KLQkJCQlyZXR1cm4gbm9ybWFsaXplZDsKLQkJCX0KLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBjb20uaWJtLnVtYS5wZXJzaXN0ZW5jZS5NdWx0aUZpbGVVUklDb252ZXJ0ZXIjZGlzcG9zZSgpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkJaWYgKG9sZFJlc01nciAhPSBudWxsKSB7Ci0JCQkJb2xkUmVzTWdyLmRpc3Bvc2UoKTsKLQkJCQlvbGRSZXNNZ3IgPSBudWxsOwotCQkJfQotCi0JCQlzdXBlci5kaXNwb3NlKCk7Ci0JCX0KLQotCQkvKioKLQkJICogQHBhcmFtIHJlc01ncjIKLQkJICovCi0JCXB1YmxpYyB2b2lkIHNldE9sZFJlc291cmNlTWFuYWdlcihSZXNvdXJjZU1hbmFnZXIgcmVzTWdyKSB7Ci0JCQlvbGRSZXNNZ3IgPSByZXNNZ3I7Ci0JCX0KLQotCQlwdWJsaWMgUmVzb3VyY2VNYW5hZ2VyIGdldE9sZFJlc291cmNlTWFuYWdlcigpIHsKLQkJCXJldHVybiBvbGRSZXNNZ3I7Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIGNvbS5pYm0udW1hLnBlcnNpc3RlbmNlLk11bHRpRmlsZVVSSUNvbnZlcnRlciNzZXRVUklNYXBwaW5nKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0LAotCQkgKiAgICAgIG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkksIGphdmEudXRpbC5TZXQpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBzZXRVUklNYXBwaW5nKEVPYmplY3QgZSwgVVJJIHVyaSwgU2V0IG1vZGlmaWVkUmVzb3VyY2VzKSB7Ci0JCQkvLyBjb2RlIHRvIHN1cHBvcnQgbWlncmF0aW9uIGZyb20gb2xkZXIgdmVyc2lvbgotCQkJLy8KLQkJCWlmIChlIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJCU1pZ3JhdG9yVVJJQ29udmVydGVyIHVyaUNvbnZlcnRlciA9IChNaWdyYXRvclVSSUNvbnZlcnRlcikgKChNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwpIGUKLQkJCQkJCS5lUmVzb3VyY2UoKS5nZXRSZXNvdXJjZVNldCgpKS5nZXRVUklDb252ZXJ0ZXIoKTsKLQkJCQlSZXNvdXJjZU1hbmFnZXIgb2xkUmVzTWdyID0gdXJpQ29udmVydGVyCi0JCQkJCQkuZ2V0T2xkUmVzb3VyY2VNYW5hZ2VyKCk7Ci0JCQkJaWYgKG9sZFJlc01nciAhPSBudWxsKSB7Ci0JCQkJCVJlc291cmNlRGVzY3JpcHRvciBkZXNjID0gb2xkUmVzTWdyCi0JCQkJCQkJLmdldFJlc291cmNlRGVzY3JpcHRvcigoKE1ldGhvZEVsZW1lbnQpIGUpCi0JCQkJCQkJCQkuZ2V0R3VpZCgpKTsKLQkJCQkJaWYgKGRlc2MgIT0gbnVsbCkgewotCQkJCQkJb2xkUGF0aFRvTmV3VVJJTWFwLnB1dChkZXNjLmdldFJlc29sdmVkVVJJKCkKLQkJCQkJCQkJLnRvRmlsZVN0cmluZygpLCB1cmkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQlzdXBlci5zZXRVUklNYXBwaW5nKGUsIHVyaSwgbW9kaWZpZWRSZXNvdXJjZXMpOwotCQl9Ci0JfQotCi0JY2xhc3MgTWlncmF0b3JSZXNvdXJjZVNldCBleHRlbmRzIE11bHRpRmlsZVJlc291cmNlU2V0SW1wbCB7Ci0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgY29tLmlibS51bWEucGVyc2lzdGVuY2UuTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsI2dldFVSSUNvbnZlcnRlcigpCi0JCSAqLwotCQlwdWJsaWMgVVJJQ29udmVydGVyIGdldFVSSUNvbnZlcnRlcigpIHsKLQkJCWlmICh1cmlDb252ZXJ0ZXIgPT0gbnVsbCkgewotCQkJCXVyaUNvbnZlcnRlciA9IG5ldyBNaWdyYXRvclVSSUNvbnZlcnRlcih0aGlzKTsKLQkJCX0KLQkJCXJldHVybiB1cmlDb252ZXJ0ZXI7Ci0JCX0KLQotCQlwcml2YXRlIHZvaWQgbG9hZE9sZFJlc291cmNlTWFuYWdlcihTdHJpbmcgbGliUGF0aCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJCS8vIHRyeWluZyB0byBsb2FkIHRoZSByZXNvdXJjZSBkZXNjcmlwdG9ycyBmaWxlCi0JCQkvLwotCQkJU3RyaW5nIGxpYkRpciA9IG5ldyBGaWxlKGxpYlBhdGgpLmdldFBhcmVudCgpICsgRmlsZS5zZXBhcmF0b3I7Ci0JCQlGaWxlIGZpbGUgPSBuZXcgRmlsZShsaWJEaXIsIFJFU01HUl9YTUkpOwotCQkJUmVzb3VyY2VNYW5hZ2VyIHJlc01nciA9IG51bGw7Ci0JCQlNdWx0aUZpbGVVUklDb252ZXJ0ZXIgbXVsdGlGaWxlVVJJQ29udmVydGVyID0gKE11bHRpRmlsZVVSSUNvbnZlcnRlcikgZ2V0VVJJQ29udmVydGVyKCk7Ci0JCQlpZiAoZmlsZS5leGlzdHMoKSkgewotCQkJCVJlc291cmNlIHJlc01nclJlcyA9IG5ldyBYTUlSZXNvdXJjZUltcGwoVVJJLmNyZWF0ZUZpbGVVUkkoZmlsZQotCQkJCQkJLmdldEFic29sdXRlUGF0aCgpKSk7IC8vIHN1cGVyLmdldFJlc291cmNlKFVSSS5jcmVhdGVGaWxlVVJJKGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpLAotCQkJCS8vIHRydWUpOwotCQkJCXJlc01nclJlcy5sb2FkKG51bGwpOwotCQkJCWlmICghcmVzTWdyUmVzLmdldENvbnRlbnRzKCkuaXNFbXB0eSgpKSB7Ci0JCQkJCU9iamVjdCBvYmogPSByZXNNZ3JSZXMuZ2V0Q29udGVudHMoKS5nZXQoMCk7Ci0JCQkJCWlmIChvYmogaW5zdGFuY2VvZiBSZXNvdXJjZU1hbmFnZXIpIHsKLQkJCQkJCXJlc01nciA9IChSZXNvdXJjZU1hbmFnZXIpIG9iajsKLQkJCQkJCS8vIHJlc01nci5yZXNvbHZlKCk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlTeXN0ZW0uZXJyCi0JCQkJCQkJCS5wcmludGxuKCJJbnZhbGlkIFJlc291cmNlTWFuYWdlciBmaWxlOiAiICsgZmlsZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCSgoTWlncmF0b3JVUklDb252ZXJ0ZXIpIG11bHRpRmlsZVVSSUNvbnZlcnRlcikKLQkJCQkJLnNldE9sZFJlc291cmNlTWFuYWdlcihyZXNNZ3IpOwotCQl9Ci0KLQkJcHVibGljIE1ldGhvZExpYnJhcnkgbG9hZExpYnJhcnkoU3RyaW5nIHBhdGgpIHRocm93cyBFeGNlcHRpb24gewotCQkJbG9hZE9sZFJlc291cmNlTWFuYWdlcihwYXRoKTsKLQotCQkJcmV0dXJuIGxvYWRMaWJyYXJ5V2l0aG91dFJlc2V0KHBhdGgpOwotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBjb20uaWJtLnVtYS5wZXJzaXN0ZW5jZS5NdWx0aUZpbGVSZXNvdXJjZVNldEltcGwjZmluZEVPYmplY3RJblVubG9hZGVkUmVzb3VyY2VzKGphdmEubGFuZy5TdHJpbmcpCi0JCSAqLwotCQlwcm90ZWN0ZWQgRU9iamVjdCBmaW5kRU9iamVjdEluVW5sb2FkZWRSZXNvdXJjZXMoU3RyaW5nIGlkKSB7Ci0JCQlPYmplY3Qgb2JqZWN0ID0gbnVsbDsKLQkJCWlmIChnZXRSZXNvdXJjZU1hbmFnZXIoKSAhPSBudWxsKSB7Ci0JCQkJb2JqZWN0ID0gc3VwZXIuZmluZEVPYmplY3RJblVubG9hZGVkUmVzb3VyY2VzKGlkKTsKLQkJCX0KLQkJCWlmIChvYmplY3QgPT0gbnVsbCkgewotCQkJCVVSSSB1cmkgPSAoKE1pZ3JhdG9yVVJJQ29udmVydGVyKSBnZXRVUklDb252ZXJ0ZXIoKSkKLQkJCQkJCS5nZXRVUklGcm9tT2xkUmVzb3VyY2VNYW5hZ2VyKGlkKTsKLQkJCQlSZXNvdXJjZSByZXNvdXJjZSA9IHN1cGVyLmdldFJlc291cmNlKHVyaSwgdHJ1ZSk7Ci0JCQkJcmV0dXJuIHJlc291cmNlLmdldEVPYmplY3QoaWQpOwotCQkJfQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIGNvbS5pYm0udW1hLnBlcnNpc3RlbmNlLk11bHRpRmlsZVJlc291cmNlU2V0SW1wbCNnZXRFT2JqZWN0KG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkksCi0JCSAqICAgICAgYm9vbGVhbikKLQkJICovCi0JCXB1YmxpYyBFT2JqZWN0IGdldEVPYmplY3QoVVJJIHVyaSwgYm9vbGVhbiBsb2FkT25EZW1hbmQpIHsKLQkJCS8vIEVPYmplY3QgZU9iaiA9IHN1cGVyR2V0RU9iamVjdCh1cmksIGxvYWRPbkRlbWFuZCk7Ci0JCQlFT2JqZWN0IGVPYmogPSBzdXBlci5nZXRFT2JqZWN0KHVyaSwgbG9hZE9uRGVtYW5kKTsKLQkJCWlmIChlT2JqID09IG51bGwKLQkJCQkJJiYgTWlncmF0b3JVUklDb252ZXJ0ZXIuU0NIRU1FLmVxdWFsc0lnbm9yZUNhc2UodXJpCi0JCQkJCQkJLnNjaGVtZSgpKSAmJiAhdXJpLmhhc0ZyYWdtZW50KCkpIHsKLQkJCQllT2JqID0gc3VwZXIuZ2V0RU9iamVjdCh1cmkuYXV0aG9yaXR5KCkpOwotCQkJfQotCQkJLy8gaWYodXJpLmF1dGhvcml0eSgpLmVxdWFscygiezExQjYwQTRCLUEwQzctNEQ1Qy04OTFBLTM0NkU4NjUyQTRFQn0iKSkKLQkJCS8vIHsKLQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiTWlncmF0b3JSZXNvdXJjZVNldC5nZXRFT2JqZWN0KCk6IGVPYmogPSAiICsKLQkJCS8vIGVPYmopOwotCQkJLy8gfQotCQkJaWYgKGVPYmogPT0gbnVsbCB8fCBlT2JqLmVJc1Byb3h5KCkpIHsKLQkJCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigKLQkJCQkJCSJDb3VsZCBub3QgbG9hZCBvYmplY3Qgd2l0aCBVUkkgJyIgKyB1cmkgKyAiJyAobm9ybWFsaXplZCBVUkk6ICciICsgZ2V0VVJJQ29udmVydGVyKCkubm9ybWFsaXplKHVyaSkgKyAiJykuXG5QbGVhc2Ugc2VlIGxvZyBmaWxlIGZvciBtb3JlIGRldGFpbHMuIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQl9Ci0JCQlyZXR1cm4gZU9iajsKLQkJfQotCi0JCXB1YmxpYyBFT2JqZWN0IHN1cGVyR2V0RU9iamVjdChVUkkgdXJpLCBib29sZWFuIGxvYWRPbkRlbWFuZCkgewotCQkJdHJ5IHsKLQkJCQlVUkkgbm9ybWFsaXplZCA9IGdldFVSSUNvbnZlcnRlcigpLm5vcm1hbGl6ZSh1cmkpOwotCQkJCWlmIChub3JtYWxpemVkID09IG51bGwpIHsKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCQkJCVJlc291cmNlIHJlc291cmNlID0gbnVsbDsKLQkJCQlyZXNvdXJjZSA9IGdldFJlc291cmNlKG5vcm1hbGl6ZWQudHJpbUZyYWdtZW50KCksIGxvYWRPbkRlbWFuZCk7Ci0JCQkJaWYgKHJlc291cmNlICE9IG51bGwpIHsKLQkJCQkJU3RyaW5nIGZyYWdtZW50ID0gbm9ybWFsaXplZC5mcmFnbWVudCgpOwotCQkJCQlpZiAoZnJhZ21lbnQgPT0gbnVsbCB8fCBmcmFnbWVudC5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJCQlyZXR1cm4gUGVyc2lzdGVuY2VVdGlsLmdldE1ldGhvZEVsZW1lbnQocmVzb3VyY2UpOwotCQkJCQl9Ci0JCQkJCXRyeSB7Ci0JCQkJCQlyZXR1cm4gcmVzb3VyY2UuZ2V0RU9iamVjdChmcmFnbWVudCk7Ci0JCQkJCX0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKLQkJCQkJCXRocm93IGU7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0JCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCQkvLwotCQkJfQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIGNvbS5pYm0udW1hLnBlcnNpc3RlbmNlLk11bHRpRmlsZVJlc291cmNlU2V0SW1wbCNjcmVhdGVSZXNvdXJjZShvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJKQotCQkgKi8KLQkJcHVibGljIFJlc291cmNlIGNyZWF0ZVJlc291cmNlKFVSSSB1cmkpIHsKLQkJCVJlc291cmNlIHJlc3VsdCA9IG5ldyBNdWx0aUZpbGVYTUlSZXNvdXJjZUltcGwodXJpKSB7Ci0JCQkJcHJvdGVjdGVkIFhNTEhlbHBlciBjcmVhdGVYTUxIZWxwZXIoKSB7Ci0JCQkJCXJldHVybiBuZXcgTXVsdGlGaWxlWE1JSGVscGVySW1wbCh0aGlzKSB7Ci0JCQkJCQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShFT2JqZWN0IG9iamVjdCwKLQkJCQkJCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIE9iamVjdCB2YWx1ZSwKLQkJCQkJCQkJaW50IHBvc2l0aW9uKSB7Ci0JCQkJCQkJYm9vbGVhbiBvbGQgPSBsb2dFcnJvcjsKLQkJCQkJCQl0cnkgewotCQkJCQkJCQlsb2dFcnJvciA9IGZhbHNlOwotCQkJCQkJCQlzdXBlcgotCQkJCQkJCQkJCS5zZXRWYWx1ZShvYmplY3QsIGZlYXR1cmUsIHZhbHVlLAotCQkJCQkJCQkJCQkJcG9zaXRpb24pOwotCQkJCQkJCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkJCQkJCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBBbnlUeXBlCi0JCQkJCQkJCQkJJiYgb2JqZWN0IGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudAotCQkJCQkJCQkvLyAmJiBvYmplY3QgaW5zdGFuY2VvZiBXb3JrQnJlYWtkb3duRWxlbWVudAotCQkJCQkJCQkvLyAmJiBmZWF0dXJlID09Ci0JCQkJCQkJCS8vIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFdvcmtCcmVha2Rvd25FbGVtZW50X0xpbmtUb1ByZWRlY2Vzc29yKCkKLQkJCQkJCQkJKSB7Ci0JCQkJCQkJCQlBbnlUeXBlRmVhdHVyZVZhbHVlIGZ2YWx1ZSA9IG5ldyBBbnlUeXBlRmVhdHVyZVZhbHVlKCk7Ci0JCQkJCQkJCQkvLyBmdmFsdWUub3duZXIgPSBvYmplY3Q7Ci0JCQkJCQkJCQlmdmFsdWUub3duZXJJZCA9ICgoTWV0aG9kRWxlbWVudCkgb2JqZWN0KQotCQkJCQkJCQkJCQkuZ2V0R3VpZCgpOwotCQkJCQkJCQkJZnZhbHVlLmZlYXR1cmUgPSBmZWF0dXJlOwotCQkJCQkJCQkJLy8gZnZhbHVlLnZhbHVlID0gKEFueVR5cGUpIHZhbHVlOwotCQkJCQkJCQkJZnZhbHVlLnZhbHVlSWQgPSAoU3RyaW5nKSBVTUEyVU1BUmVzb3VyY2VIYW5kbGVyCi0JCQkJCQkJCQkJCS5nZXRTaW5nbGVWYWx1ZSgoKEFueVR5cGUpIHZhbHVlKQotCQkJCQkJCQkJCQkJCS5nZXRBbnlBdHRyaWJ1dGUoKSwgImd1aWQiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJZnZhbHVlLmluZGV4ID0gcG9zaXRpb247Ci0JCQkJCQkJCQlhbnlUeXBlRmVhdHVyZVZhbHVlcy5hZGQoZnZhbHVlKTsKLQkJCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJCXRocm93IGU7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9IGZpbmFsbHkgewotCQkJCQkJCQlsb2dFcnJvciA9IG9sZDsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0KLQkJCQkJCXB1YmxpYyBMaXN0IHNldE1hbnlSZWZlcmVuY2UoCi0JCQkJCQkJCW9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuWE1MSGVscGVyLk1hbnlSZWZlcmVuY2UgcmVmZXJlbmNlLAotCQkJCQkJCQlTdHJpbmcgbG9jYXRpb24pIHsKLQkJCQkJCQlMaXN0IGV4Y2VwdGlvbnMgPSBzdXBlci5zZXRNYW55UmVmZXJlbmNlKHJlZmVyZW5jZSwKLQkJCQkJCQkJCWxvY2F0aW9uKTsKLQkJCQkJCQlpZiAoZXhjZXB0aW9ucyA9PSBudWxsKQotCQkJCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBleGNlcHRpb25zLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJCU9iamVjdCBleCA9IGl0ZXIubmV4dCgpOwotCQkJCQkJCQlpZiAoZXggaW5zdGFuY2VvZiBJbGxlZ2FsVmFsdWVFeGNlcHRpb24pIHsKLQkJCQkJCQkJCUlsbGVnYWxWYWx1ZUV4Y2VwdGlvbiBpdmUgPSAoSWxsZWdhbFZhbHVlRXhjZXB0aW9uKSBleDsKLQkJCQkJCQkJCWlmIChpdmUuZ2V0VmFsdWUoKSBpbnN0YW5jZW9mIEFueVR5cGUKLQkJCQkJCQkJCQkJJiYgaXZlLmdldE9iamVjdCgpIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJCQkJCQkJCUFueVR5cGVGZWF0dXJlVmFsdWUgZnZhbHVlID0gbmV3IEFueVR5cGVGZWF0dXJlVmFsdWUoKTsKLQkJCQkJCQkJCQlmdmFsdWUub3duZXJJZCA9ICgoTWV0aG9kRWxlbWVudCkgaXZlCi0JCQkJCQkJCQkJCQkuZ2V0T2JqZWN0KCkpLmdldEd1aWQoKTsKLQkJCQkJCQkJCQlmdmFsdWUuZmVhdHVyZSA9IGl2ZS5nZXRGZWF0dXJlKCk7Ci0JCQkJCQkJCQkJZnZhbHVlLnZhbHVlSWQgPSAoU3RyaW5nKSBVTUEyVU1BUmVzb3VyY2VIYW5kbGVyCi0JCQkJCQkJCQkJCQkuZ2V0U2luZ2xlVmFsdWUoKChBbnlUeXBlKSBpdmUKLQkJCQkJCQkJCQkJCQkJLmdldFZhbHVlKCkpCi0JCQkJCQkJCQkJCQkJCS5nZXRBbnlBdHRyaWJ1dGUoKSwKLQkJCQkJCQkJCQkJCQkJImd1aWQiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJCWZ2YWx1ZS5pbmRleCA9IC0xOwotCQkJCQkJCQkJCWFueVR5cGVGZWF0dXJlVmFsdWVzLmFkZChmdmFsdWUpOwotCQkJCQkJCQkJCWl0ZXIucmVtb3ZlKCk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQkJaWYgKGV4Y2VwdGlvbnMuaXNFbXB0eSgpKSB7Ci0JCQkJCQkJCXJldHVybiBudWxsOwotCQkJCQkJCX0KLQkJCQkJCQlyZXR1cm4gZXhjZXB0aW9uczsKLQkJCQkJCX0KLQkJCQkJfTsKLQkJCQl9Ci0JCQl9OwotCQkJcmVzdWx0LnNldFRyYWNraW5nTW9kaWZpY2F0aW9uKHRydWUpOwotCQkJZ2V0UmVzb3VyY2VzKCkuYWRkKHJlc3VsdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgbWlncmF0ZShTdHJpbmcgbGliUGF0aCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQotCQkJdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNldCBjbGFzc05hbWVzID0gbmV3IEhhc2hTZXQoKTsKLQkJY2xhc3NOYW1lcy5hZGQoIlRlY2huaXF1ZSIpOyAvLyROT04tTkxTLTEkCi0KLQkJTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsIHJlc291cmNlU2V0ID0gbmV3IE1pZ3JhdG9yUmVzb3VyY2VTZXQoKTsKLQkJLy8gUmVzb3VyY2VNYW5hZ2VyIG9sZFJlc01nciA9IG51bGw7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZXh0ZW5kZWRNZXRhRGF0YXMubGVuZ3RoOyBpKyspIHsKLQkJCXJlc291cmNlU2V0LmdldExvYWRPcHRpb25zKCkucHV0KAotCQkJCQlYTUxSZXNvdXJjZS5PUFRJT05fUkVDT1JEX1VOS05PV05fRkVBVFVSRSwgQm9vbGVhbi5UUlVFKTsKLQkJCWlmIChpIDwgMikgewotCQkJCXJlc291cmNlU2V0LmdldExvYWRPcHRpb25zKCkucHV0KAotCQkJCQkJWE1MUmVzb3VyY2UuT1BUSU9OX1JFU09VUkNFX0hBTkRMRVIsIHJlc291cmNlSGFuZGxlcik7Ci0JCQl9Ci0JCQlyZXNvdXJjZVNldC5nZXRMb2FkT3B0aW9ucygpCi0JCQkJCS5wdXQoWE1MUmVzb3VyY2UuT1BUSU9OX0VYVEVOREVEX01FVEFfREFUQSwKLQkJCQkJCQlleHRlbmRlZE1ldGFEYXRhc1tpXSk7Ci0KLQkJCWlmIChpID09IDApIHsKLQkJCQlyZXNvdXJjZUhhbmRsZXIuc2F2ZVByZXNlbnRhdGlvblVSSUZvcihjbGFzc05hbWVzKTsKLQkJCX0gZWxzZSB7Ci0JCQkJcmVzb3VyY2VIYW5kbGVyLnNhdmVQcmVzZW50YXRpb25VUklGb3IobnVsbCk7Ci0JCQl9Ci0KLQkJCXVwZGF0ZVN0YXR1cyhtb25pdG9yLCBQZXJzaXN0ZW5jZVJlc291cmNlcy5sb2FkTGlicmFyeVRhc2tfbmFtZSk7Ci0KLQkJCS8vIGlmKG9sZFJlc01nciAhPSBudWxsKSB7Ci0JCQkvLyAoKE1pZ3JhdG9yVVJJQ29udmVydGVyKXJlc291cmNlU2V0LmdldFVSSUNvbnZlcnRlcigpKS5zZXRPbGRSZXNvdXJjZU1hbmFnZXIob2xkUmVzTWdyKTsKLQkJCS8vIHJlc291cmNlU2V0LmxvYWRMaWJyYXJ5V2l0aG91dFJlc2V0KGxpYlBhdGgpOwotCQkJLy8gfQotCQkJLy8gZWxzZSB7Ci0JCQlyZXNvdXJjZVNldC5sb2FkTGlicmFyeShsaWJQYXRoKTsKLQkJCS8vIH0KLQotCQkJTWV0aG9kTGlicmFyeSBsaWIgPSByZXNvdXJjZVNldC5nZXRNZXRob2RMaWJyYXJ5KCk7Ci0JCQlpZiAobGliID09IG51bGwpCi0JCQkJcmV0dXJuOwotCi0JCQkvLyBsb2FkIGFsbCB0aGUgcmVzb3VyY2VzIGluIG1lbW9yeQotCQkJLy8KLQkJCXVwZGF0ZVN0YXR1cyhtb25pdG9yLCBQZXJzaXN0ZW5jZVJlc291cmNlcy5sb2FkUmVzb3VyY2VzVGFza19uYW1lKTsKLQotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gbGliLmVBbGxDb250ZW50cygpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlFT2JqZWN0IGVsZW1lbnQgPSAoRU9iamVjdCkgaXRlci5uZXh0KCk7Ci0JCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBHdWlkZWxpbmUgJiYgaSA+IDApIHsKLQkJCQkJLy8gaGFjayB0byByZXN0b3JlIHRoZSByaWdodCBwcmVzZW50YXRpb24gZm9yIG9sZCBUZWNobmlxdWUKLQkJCQkJLy8KLQkJCQkJR3VpZGVsaW5lIGd1aWRlbGluZSA9IChHdWlkZWxpbmUpIGVsZW1lbnQ7Ci0JCQkJCVVSSSB1cmkgPSByZXNvdXJjZUhhbmRsZXIuZ2V0UHJlc2VudGF0aW9uVVJJKGd1aWRlbGluZQotCQkJCQkJCS5nZXRHdWlkKCkpOwotCQkJCQlpZiAodXJpICE9IG51bGwpIHsKLQkJCQkJCUNvbnRlbnREZXNjcmlwdGlvbiBwcmVzZW50YXRpb24gPSAoQ29udGVudERlc2NyaXB0aW9uKSByZXNvdXJjZVNldAotCQkJCQkJCQkuZ2V0RU9iamVjdCh1cmksIHRydWUpOwotCQkJCQkJZ3VpZGVsaW5lLnNldFByZXNlbnRhdGlvbihwcmVzZW50YXRpb24pOwotCQkJCQl9Ci0JCQkJfQotCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJCQl0cnkgewotCQkJCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGVsZW1lbnQuZUNyb3NzUmVmZXJlbmNlcygpCi0JCQkJCQkJCS5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJaXRlcmF0b3IubmV4dCgpOwotCQkJCQkJfQotCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJQ29tbW9uUGx1Z2luLklOU1RBTkNFLmxvZyhlKTsKLQkJCQkJCVN5c3RlbS5lcnIKLQkJCQkJCQkJLnByaW50bG4oIkVycm9yIGl0ZXJhdGUgdGhydSBjcm9zcyByZWZlcmVuY2VzIG9mIGVsZW1lbnQ6ICIgKyBlbGVtZW50KTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQlpZiAoaSA9PSAwKSB7Ci0JCQkJLy8gb2xkUmVzTWdyID0KLQkJCQkvLyAoKE1pZ3JhdG9yVVJJQ29udmVydGVyKXJlc291cmNlU2V0LmdldFVSSUNvbnZlcnRlcigpKS5nZXRPbGRSZXNvdXJjZU1hbmFnZXIoKTsKLQotCQkJCW1pZ3JhdGVQcm9jZXNzQ29udGVudERlc2NyaXB0aW9ucyhtb25pdG9yLCBsaWIpOwotCi0JCQkJdXBkYXRlU3RhdHVzKG1vbml0b3IsIFBlcnNpc3RlbmNlUmVzb3VyY2VzLm1vdmVEYXRhVGFza19uYW1lKTsKLQotCQkJfQotCi0JCQlpZiAoaSA8IDIpIHsKLQkJCQlyZXNvdXJjZUhhbmRsZXIubW92ZURhdGEoKTsKLQkJCQlyZXNvdXJjZUhhbmRsZXIuY2xlYXJNb3ZlSW5mb3MoKTsKLQkJCX0KLQotCQkJaWYgKGkgPT0gZXh0ZW5kZWRNZXRhRGF0YXMubGVuZ3RoIC0gMSkgewotCQkJCW1pZ3JhdGVQcm9jZXNzZXMobW9uaXRvciwgbGliKTsKLQotCQkJCXJlc3RvcmVSZWZlcmVuY2VzKHJlc291cmNlU2V0KTsKLQotCQkJfQotCi0JCQl1cGRhdGVTdGF0dXMobW9uaXRvciwgUGVyc2lzdGVuY2VSZXNvdXJjZXMuc2F2ZUxpYnJhcnlUYXNrX25hbWUpOwotCi0JCQlyZXNvdXJjZVNldC5zYXZlKG51bGwsIHRydWUpOwotCQkJcmVzb3VyY2VTZXQucmVzZXQoKTsKLQotCQl9Ci0KLQkJLy8gZGVsZXRlIG9sZCByZXNtZ3IueG1pCi0JCS8vCi0JCXRyeSB7Ci0JCQlGaWxlIHJlc01nckZpbGUgPSBuZXcgRmlsZShuZXcgRmlsZShsaWJQYXRoKS5nZXRQYXJlbnRGaWxlKCksCi0JCQkJCU11bHRpRmlsZVJlc291cmNlU2V0SW1wbC5SRVNNR1JfWE1JKTsKLQkJCWlmIChyZXNNZ3JGaWxlLmV4aXN0cygpKSB7Ci0JCQkJcmVzTWdyRmlsZS5kZWxldGUoKTsKLQkJCX0KLQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCByZXN0b3JlUmVmZXJlbmNlcyhNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwgcmVzb3VyY2VTZXQpIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gYW55VHlwZUZlYXR1cmVWYWx1ZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlBbnlUeXBlRmVhdHVyZVZhbHVlIGVsZW1lbnQgPSAoQW55VHlwZUZlYXR1cmVWYWx1ZSkgaXRlci5uZXh0KCk7Ci0JCQlpZiAoZWxlbWVudC5vd25lcklkICE9IG51bGwgJiYgZWxlbWVudC52YWx1ZUlkICE9IG51bGwpIHsKLQkJCQlFT2JqZWN0IG93bmVyID0gcmVzb3VyY2VTZXQuZ2V0RU9iamVjdChlbGVtZW50Lm93bmVySWQpOwotCQkJCU9iamVjdCB2YWx1ZSA9IHJlc291cmNlU2V0LmdldEVPYmplY3QoZWxlbWVudC52YWx1ZUlkKTsKLQkJCQlVTUEyVU1BUmVzb3VyY2VIYW5kbGVyLnNldFZhbHVlKG93bmVyLCBlbGVtZW50LmZlYXR1cmUsIHZhbHVlKTsKLQkJCX0KLQkJfQotCQlhbnlUeXBlRmVhdHVyZVZhbHVlcy5jbGVhcigpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgbWlncmF0ZVByb2Nlc3NlcyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsCi0JCQlNZXRob2RMaWJyYXJ5IGxpYikgewotCQl1cGRhdGVTdGF0dXMobW9uaXRvciwgUGVyc2lzdGVuY2VSZXNvdXJjZXMuZml4UHJlc2VudGF0aW9uTmFtZVRhc2tfbmFtZSk7Ci0KLQkJU3RyaW5nW11bXSBwcm9jUGtnUGF0aHMgPSBNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwuUFJPQ0VTU19QQUNLQUdFX1BBVEhTOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBsaWIuZ2V0TWV0aG9kUGx1Z2lucygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IChNZXRob2RQbHVnaW4pIGl0ZXIubmV4dCgpOwotCQkJQXJyYXlMaXN0IHByb2NQa2dzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJZm9yIChpbnQgaiA9IDA7IGogPCBwcm9jUGtnUGF0aHMubGVuZ3RoOyBqKyspIHsKLQkJCQlNZXRob2RQYWNrYWdlIHBrZyA9IFVtYVV0aWwuZmluZE1ldGhvZFBhY2thZ2UocGx1Z2luLAotCQkJCQkJcHJvY1BrZ1BhdGhzW2pdKTsKLQkJCQlpZiAocGtnICE9IG51bGwpIHsKLQkJCQkJcHJvY1BrZ3MuYWRkKHBrZyk7Ci0JCQkJfQotCQkJfQotCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IHByb2NQa2dzLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCQlQcm9jZXNzUGFja2FnZSBwa2cgPSAoUHJvY2Vzc1BhY2thZ2UpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yMSA9IHBrZy5nZXRDaGlsZFBhY2thZ2VzKCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IxCi0JCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQlFT2JqZWN0IGNoaWxkUGtnID0gKEVPYmplY3QpIGl0ZXJhdG9yMS5uZXh0KCk7Ci0JCQkJCWlmIChjaGlsZFBrZyBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpIHsKLQkJCQkJCW9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzcyBwcm9jID0gKChQcm9jZXNzQ29tcG9uZW50KSBjaGlsZFBrZykKLQkJCQkJCQkJLmdldFByb2Nlc3MoKTsKLQkJCQkJCWlmIChwcm9jICE9IG51bGwpIHsKLQkJCQkJCQl0cnkgewotCQkJCQkJCQlmaXhQcmVzZW50YXRpb25OYW1lKHByb2MpOwotCQkJCQkJCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkJCQkJCQl0aHJvdyBlOwotCQkJCQkJCX0KLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJU3RyaW5nIG1zZyA9IE1pZ3JhdG9yLmNsYXNzLmdldE5hbWUoKQotCQkJCQkJCQkJKyAiOiBpbnZhbGlkIFByb2Nlc3NDb21wb25lbnQgKHdpdGggbm8gUHJvY2Vzcyk6ICIgKyBjaGlsZFBrZyAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQkrICJcbiAgUHJvY2Vzc0NvbXBvbmVudCdzIHJlc291cmNlIFVSSTogIiArIChjaGlsZFBrZy5lUmVzb3VyY2UoKSAhPSBudWxsID8gY2hpbGRQa2cuZVJlc291cmNlKCkuZ2V0VVJJKCkgOiBudWxsKSAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQkrICJcbiAgUGFyZW50IHBhY2thZ2U6ICIgKyBwa2cgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJKyAiXG4gIFBhcmVudCBwYWNrYWdlJ3MgcmVzb3VyY2UgVVJJOiAiICsgKHBrZy5lUmVzb3VyY2UoKSAhPSBudWxsID8gcGtnLmVSZXNvdXJjZSgpLmdldFVSSSgpIDogbnVsbCkgLy8kTk9OLU5MUy0xJAotCQkJCQkJCTsKLQkJCQkJCQlDb21tb25QbHVnaW4uSU5TVEFOQ0UubG9nKG1zZyk7Ci0JCQkJCQkJU3lzdGVtLmVyci5wcmludGxuKG1zZyk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIG1pZ3JhdGVQcm9jZXNzQ29udGVudERlc2NyaXB0aW9ucygKLQkJCUlQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgTWV0aG9kTGlicmFyeSBsaWIpIHsKLQkJdXBkYXRlU3RhdHVzKG1vbml0b3IsCi0JCQkJUGVyc2lzdGVuY2VSZXNvdXJjZXMubWlncmF0ZUNvbnRlbnREZXNjcmlwdGlvbnNUYXNrX25hbWUpOwotCi0JCVN0cmluZ1tdW10gcHJvY1BrZ1BhdGhzID0gTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsLlBST0NFU1NfUEFDS0FHRV9QQVRIUzsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gbGliLmdldE1ldGhvZFBsdWdpbnMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSAoTWV0aG9kUGx1Z2luKSBpdGVyLm5leHQoKTsKLQkJCUFycmF5TGlzdCBwcm9jUGtncyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWZvciAoaW50IGogPSAwOyBqIDwgcHJvY1BrZ1BhdGhzLmxlbmd0aDsgaisrKSB7Ci0JCQkJTWV0aG9kUGFja2FnZSBwa2cgPSBVbWFVdGlsLmZpbmRNZXRob2RQYWNrYWdlKHBsdWdpbiwKLQkJCQkJCXByb2NQa2dQYXRoc1tqXSk7Ci0JCQkJaWYgKHBrZyAhPSBudWxsKSB7Ci0JCQkJCXByb2NQa2dzLmFkZChwa2cpOwotCQkJCX0KLQkJCX0KLQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBwcm9jUGtncy5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJUHJvY2Vzc1BhY2thZ2UgcGtnID0gKFByb2Nlc3NQYWNrYWdlKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvcjEgPSBwa2cuZ2V0Q2hpbGRQYWNrYWdlcygpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yMQotCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJT2JqZWN0IGNoaWxkUGtnID0gKE9iamVjdCkgaXRlcmF0b3IxLm5leHQoKTsKLQkJCQkJaWYgKGNoaWxkUGtnIGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkgewotCQkJCQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzIHByb2MgPSAoKFByb2Nlc3NDb21wb25lbnQpIGNoaWxkUGtnKQotCQkJCQkJCQkuZ2V0UHJvY2VzcygpOwotCQkJCQkJbWlncmF0ZUNvbnRlbnREZXNjcmlwdGlvbihwcm9jKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgbWlncmF0ZUNvbnRlbnREZXNjcmlwdGlvbihCcmVha2Rvd25FbGVtZW50IGUpIHsKLQkJaWYgKENvbnRlbnREZXNjcmlwdGlvbkZhY3RvcnkuaGFzUHJlc2VudGF0aW9uKGUpKSB7Ci0JCQlDb250ZW50RGVzY3JpcHRpb24gY29udGVudCA9IGUuZ2V0UHJlc2VudGF0aW9uKCk7Ci0JCQlFQ2xhc3MgZUNscyA9IENvbnRlbnREZXNjcmlwdGlvbkZhY3RvcnkKLQkJCQkJLmdldENvbnRlbnREZXNjcmlwdGlvbkVDbGFzcyhlKTsKLQkJCWlmIChlQ2xzICE9IGNvbnRlbnQpIHsKLQkJCQlDb250ZW50RGVzY3JpcHRpb24gbmV3Q29udGVudCA9IENvbnRlbnREZXNjcmlwdGlvbkZhY3RvcnkKLQkJCQkJCS5jcmVhdGVDb250ZW50RGVzY3JpcHRpb24oZSk7Ci0JCQkJbmV3Q29udGVudC5zZXRNYWluRGVzY3JpcHRpb24oY29udGVudC5nZXRNYWluRGVzY3JpcHRpb24oKSk7Ci0JCQkJbmV3Q29udGVudC5zZXRLZXlDb25zaWRlcmF0aW9ucyhjb250ZW50LmdldEtleUNvbnNpZGVyYXRpb25zKCkpOwotCQkJCW5ld0NvbnRlbnQuZ2V0U2VjdGlvbnMoKS5hZGRBbGwoY29udGVudC5nZXRTZWN0aW9ucygpKTsKLQkJCQllLnNldFByZXNlbnRhdGlvbihuZXdDb250ZW50KTsKLQkJCX0KLQkJfQotCQlpZiAoZSBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSAoKEFjdGl2aXR5KSBlKS5nZXRCcmVha2Rvd25FbGVtZW50cygpCi0JCQkJCS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQltaWdyYXRlQ29udGVudERlc2NyaXB0aW9uKChCcmVha2Rvd25FbGVtZW50KSBpdGVyLm5leHQoKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGZpeFByZXNlbnRhdGlvbk5hbWUoQnJlYWtkb3duRWxlbWVudCBlKSB7Ci0JCWlmIChlLmdldFByZXNlbnRhdGlvbk5hbWUoKSA9PSBudWxsCi0JCQkJfHwgZS5nZXRQcmVzZW50YXRpb25OYW1lKCkudHJpbSgpLmxlbmd0aCgpID09IDApIHsKLQkJCWUuc2V0UHJlc2VudGF0aW9uTmFtZShlLmdldE5hbWUoKSk7Ci0JCX0KLQkJaWYgKGUgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gKChBY3Rpdml0eSkgZSkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKQotCQkJCQkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJZml4UHJlc2VudGF0aW9uTmFtZSgoQnJlYWtkb3duRWxlbWVudCkgaXRlci5uZXh0KCkpOwotCQkJfQotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL21pZ3JhdGlvbi9pbnRlcm5hbC9VTUEyVU1BUmVzb3VyY2VIYW5kbGVyMC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS9taWdyYXRpb24vaW50ZXJuYWwvVU1BMlVNQVJlc291cmNlSGFuZGxlcjAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODEyMzE1Yi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL21pZ3JhdGlvbi9pbnRlcm5hbC9VTUEyVU1BUmVzb3VyY2VIYW5kbGVyMC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5taWdyYXRpb24uaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQW55VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UuTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5taWdyYXRpb24uVU1BMlVNQVJlc291cmNlSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmliYWJsZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtPcmRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtPcmRlclR5cGU7Ci0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFVNQTJVTUFSZXNvdXJjZUhhbmRsZXIwIGV4dGVuZHMgVU1BMlVNQVJlc291cmNlSGFuZGxlciB7Ci0KLQlwcml2YXRlIFNldCBwcm9jTW92ZWRGZWF0dXJlTmFtZXM7Ci0KLQlwcml2YXRlIE1hcCBndWlkVG9QcmVzZW50YXRpb25NYXA7Ci0KLQlwcml2YXRlIFNldCBjbGFzc05hbWVzVG9TYXZlUHJlc2VudGF0aW9uVVJJOwotCi0JcHVibGljIFVNQTJVTUFSZXNvdXJjZUhhbmRsZXIwKCkgewotCQlzdXBlcigpOwotCi0JCWd1aWRUb1ByZXNlbnRhdGlvbk1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0KLQkJcHJvY01vdmVkRmVhdHVyZU5hbWVzID0gbmV3IEhhc2hTZXQoQXJyYXlzLmFzTGlzdChuZXcgU3RyaW5nW10gewotCQkJCSJwdXJwb3NlIiAvLyROT04tTkxTLTEkCi0JCQkJLCAia2V5Q29uc2lkZXJhdGlvbnMiIC8vJE5PTi1OTFMtMSQKLQkJCQksICJhbHRlcm5hdGl2ZXMiIC8vJE5PTi1OTFMtMSQKLQkJCQksICJob3d0b1N0YWZmIiAvLyROT04tTkxTLTEkCi0JCQkJLCAidXNhZ2VHdWlkYW5jZSIgLy8kTk9OLU5MUy0xJAotCQkJCSwgImV4dGVybmFsSWQiIC8vJE5PTi1OTFMtMSQKLQkJCQksICJzY29wZSIgLy8kTk9OLU5MUy0xJAotCQkJCSwgInVzYWdlTm90ZXMiIC8vJE5PTi1OTFMtMSQKLQkJCQksICJzY2FsZSIgLy8kTk9OLU5MUy0xJAotCQkJCSwgInByb2plY3RDaGFyYWN0ZXJpc3RpY3MiIC8vJE5PTi1OTFMtMSQKLQkJCQksICJyaXNrTGV2ZWwiIC8vJE5PTi1OTFMtMSQKLQkJCQksICJlc3RpbWF0aW5nVGVjaG5pcXVlIiAvLyROT04tTkxTLTEkCi0JCQkJLCAicHJvamVjdE1lbWJlckV4cGVydGlzZSIgLy8kTk9OLU5MUy0xJAotCQkJCSwgInR5cGVPZkNvbnRyYWN0IiAvLyROT04tTkxTLTEkCi0JCQkJLCAidGVjaG5pcXVlcyIgLy8kTk9OLU5MUy0xJAotCQkJCSwgIm1haW5EZXNjcmlwdGlvbiIgLy8kTk9OLU5MUy0xJAotCQl9KSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UubWlncmF0aW9uLlVNQTJVTUFSZXNvdXJjZUhhbmRsZXIjZ2V0TmV3RmVhdHVyZShvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCwKLQkgKiAgICAgIGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHJvdGVjdGVkIEVTdHJ1Y3R1cmFsRmVhdHVyZSBnZXROZXdGZWF0dXJlKEVPYmplY3Qgb3duZXIsIFN0cmluZyBmZWF0dXJlTmFtZSkgewotCQlpZiAoInByZXNlbnRhdGlvbk5hbWUiLmVxdWFscyhmZWF0dXJlTmFtZSkgJiYgb3duZXIgaW5zdGFuY2VvZiBDb250ZW50RGVzY3JpcHRpb24pIHsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCS5nZXRNZXRob2RFbGVtZW50X1ByZXNlbnRhdGlvbk5hbWUoKTsKLQkJfQotCQlpZiAocHJvY01vdmVkRmVhdHVyZU5hbWVzLmNvbnRhaW5zKGZlYXR1cmVOYW1lKSkgewotCQkJaWYgKG93bmVyIGluc3RhbmNlb2YgUHJvY2Vzc0VsZW1lbnQpIHsKLQkJCQlDb250ZW50RGVzY3JpcHRpb24gY29udGVudCA9ICgoUHJvY2Vzc0VsZW1lbnQpIG93bmVyKQotCQkJCQkJLmdldFByZXNlbnRhdGlvbigpOwotCQkJCUVBdHRyaWJ1dGUgYXR0cmliID0gZ2V0RUF0dHJpYnV0ZShjb250ZW50LmVDbGFzcygpLCBmZWF0dXJlTmFtZSk7Ci0JCQkJaWYgKGF0dHJpYiAhPSBudWxsKSB7Ci0JCQkJCXJldHVybiBhdHRyaWI7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmICgiV29ya09yZGVyIi5lcXVhbHMoZmVhdHVyZU5hbWUpICYmIG93bmVyIGluc3RhbmNlb2YgUHJvY2Vzc1BhY2thZ2UpIHsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFByb2Nlc3NQYWNrYWdlX1Byb2Nlc3NFbGVtZW50cygpOwotCQl9Ci0KLQkJcmV0dXJuIHN1cGVyLmdldE5ld0ZlYXR1cmUob3duZXIsIGZlYXR1cmVOYW1lKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5taWdyYXRpb24uVU1BMlVNQVJlc291cmNlSGFuZGxlciNnZXROZXdPd25lcihvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCwKLQkgKiAgICAgIGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHJvdGVjdGVkIEVPYmplY3QgZ2V0TmV3T3duZXIoRU9iamVjdCBvbGRPd25lciwgU3RyaW5nIGZlYXR1cmVOYW1lKSB7Ci0JCWlmICgicHJlc2VudGF0aW9uTmFtZSIuZXF1YWxzKGZlYXR1cmVOYW1lKSAmJiBvbGRPd25lciBpbnN0YW5jZW9mIENvbnRlbnREZXNjcmlwdGlvbikgeyAvLyROT04tTkxTLTEkCi0JCQlEZXNjcmliYWJsZUVsZW1lbnQgZGUgPSAoKERlc2NyaWJhYmxlRWxlbWVudCkgb2xkT3duZXIuZUNvbnRhaW5lcigpKTsKLQkJCWlmIChkZSBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCQlyZXR1cm4gZGU7Ci0JCX0KLQkJaWYgKHByb2NNb3ZlZEZlYXR1cmVOYW1lcy5jb250YWlucyhmZWF0dXJlTmFtZSkKLQkJCQkmJiBvbGRPd25lciBpbnN0YW5jZW9mIFByb2Nlc3NFbGVtZW50KSB7Ci0JCQlyZXR1cm4gKChQcm9jZXNzRWxlbWVudCkgb2xkT3duZXIpLmdldFByZXNlbnRhdGlvbigpOwotCQl9Ci0JCWlmICgiV29ya09yZGVyIi5lcXVhbHMoZmVhdHVyZU5hbWUpICYmIG9sZE93bmVyIGluc3RhbmNlb2YgUHJvY2Vzc1BhY2thZ2UpIHsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIG9sZE93bmVyOwotCQl9Ci0KLQkJcmV0dXJuIHN1cGVyLmdldE5ld093bmVyKG9sZE93bmVyLCBmZWF0dXJlTmFtZSk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5taWdyYXRpb24uVU1BMlVNQVJlc291cmNlSGFuZGxlciNnZXROZXdWYWx1ZShvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCwgamF2YS5sYW5nLlN0cmluZywgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkFueVR5cGUpCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBnZXROZXdWYWx1ZShFT2JqZWN0IG9sZE93bmVyLCBTdHJpbmcgZmVhdHVyZU5hbWUsIEFueVR5cGUgdmFsdWUpIHsKLQkJaWYgKCJXb3JrT3JkZXIiLmVxdWFscyhmZWF0dXJlTmFtZSkgJiYgb2xkT3duZXIgaW5zdGFuY2VvZiBQcm9jZXNzUGFja2FnZSkgeyAvLyROT04tTkxTLTEkCi0JCQlXb3JrT3JkZXIgd29ya09yZGVyID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlV29ya09yZGVyKCk7Ci0JCQl3b3JrT3JkZXIuc2V0R3VpZCgoU3RyaW5nKSBnZXRTaW5nbGVWYWx1ZSh2YWx1ZS5nZXRBbnlBdHRyaWJ1dGUoKSwKLQkJCQkJImd1aWQiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCVN0cmluZyBwcmVkR3VpZCA9IChTdHJpbmcpIGdldFNpbmdsZVZhbHVlKHZhbHVlLmdldEFueUF0dHJpYnV0ZSgpLAotCQkJCQkicHJlZCIpOyAvLyROT04tTkxTLTEkCi0JCQlpZiAocHJlZEd1aWQgPT0gbnVsbCkgewotCQkJCUludGVybmFsRU9iamVjdCBvYmogPSAoSW50ZXJuYWxFT2JqZWN0KSBnZXRTaW5nbGVWYWx1ZSh2YWx1ZQotCQkJCQkJLmdldE1peGVkKCksICJwcmVkIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlwcmVkR3VpZCA9IG9iai5lUHJveHlVUkkoKS5hdXRob3JpdHkoKTsKLQkJCX0KLQkJCU11bHRpRmlsZVJlc291cmNlU2V0SW1wbCByZXNvdXJjZVNldCA9IChNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwpIG9sZE93bmVyCi0JCQkJCS5lUmVzb3VyY2UoKS5nZXRSZXNvdXJjZVNldCgpOwotCQkJV29ya0JyZWFrZG93bkVsZW1lbnQgcHJlZCA9IChXb3JrQnJlYWtkb3duRWxlbWVudCkgcmVzb3VyY2VTZXQKLQkJCQkJLmdldEVPYmplY3QocHJlZEd1aWQpOwotCQkJd29ya09yZGVyLnNldFByZWQocHJlZCk7Ci0JCQl3b3JrT3JkZXIuc2V0TGlua1R5cGUoV29ya09yZGVyVHlwZS5GSU5JU0hfVE9fRklOSVNIKTsKLQkJCXJldHVybiB3b3JrT3JkZXI7Ci0JCX0KLQkJcmV0dXJuIGdldFRleHQodmFsdWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNhdmVQcmVzZW50YXRpb25VUklGb3IoU2V0IGNsYXNzTmFtZXMpIHsKLQkJY2xhc3NOYW1lc1RvU2F2ZVByZXNlbnRhdGlvblVSSSA9IGNsYXNzTmFtZXM7Ci0JfQotCi0JcHVibGljIFVSSSBnZXRQcmVzZW50YXRpb25VUkkoU3RyaW5nIGd1aWQpIHsKLQkJcmV0dXJuIChVUkkpIGd1aWRUb1ByZXNlbnRhdGlvbk1hcC5nZXQoZ3VpZCk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5taWdyYXRpb24uTWlncmF0aW9uUmVzb3VyY2VIYW5kbGVyI2hhbmRsZVVua25vd25EYXRhKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0LCBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGhhbmRsZVVua25vd25EYXRhKEVPYmplY3QgZSwgQW55VHlwZSB1bmtub3duRGF0YSkgewotCQlzdXBlci5oYW5kbGVVbmtub3duRGF0YShlLCB1bmtub3duRGF0YSk7Ci0JCQotCQlpZiAoY2xhc3NOYW1lc1RvU2F2ZVByZXNlbnRhdGlvblVSSSAhPSBudWxsCi0JCQkJJiYgZSBpbnN0YW5jZW9mIENvbnRlbnRQYWNrYWdlKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBnZXRWYWx1ZSh1bmtub3duRGF0YS5nZXRNaXhlZCgpLCAiY29udGVudEVsZW1lbnRzIikuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7IC8vJE5PTi1OTFMtMSQKLQkJCQlBbnlUeXBlIHZhbHVlID0gKEFueVR5cGUpIGl0ZXIubmV4dCgpOwotCQkJCWlmICh2YWx1ZSAhPSBudWxsCi0JCQkJCQkmJiBjbGFzc05hbWVzVG9TYXZlUHJlc2VudGF0aW9uVVJJLmNvbnRhaW5zKHZhbHVlCi0JCQkJCQkJCS5lQ2xhc3MoKS5nZXROYW1lKCkpKSB7Ci0JCQkJCU9iamVjdCBwcmVzZW50YXRpb24gPSBnZXRTaW5nbGVWYWx1ZSh2YWx1ZS5nZXRNaXhlZCgpLAotCQkJCQkJCSJwcmVzZW50YXRpb24iKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlpZiAocHJlc2VudGF0aW9uICE9IG51bGwpIHsKLQkJCQkJCU9iamVjdCBndWlkID0gZ2V0U2luZ2xlVmFsdWUodmFsdWUuZ2V0QW55QXR0cmlidXRlKCksCi0JCQkJCQkJCSJndWlkIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCVVSSSB1cmkgPSAoKEludGVybmFsRU9iamVjdCkgcHJlc2VudGF0aW9uKS5lUHJveHlVUkkoKTsKLQkJCQkJCWd1aWRUb1ByZXNlbnRhdGlvbk1hcC5wdXQoZ3VpZCwgdXJpKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQkJCi0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL21pZ3JhdGlvbi9pbnRlcm5hbC9wYWNrYWdlLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL21pZ3JhdGlvbi9pbnRlcm5hbC9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmM2UwMWEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS9taWdyYXRpb24vaW50ZXJuYWwvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgdGhlIGltcGxlbW50YXRpb24gZm9yIHVwZ3JhZGluZyBhIG1ldGhvZCBsaWJyYXJ5IHRvIGEgbmV3ZXIgVU1BIHZlcnNpb24uCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS9taWdyYXRpb24vcGFja2FnZS5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS9taWdyYXRpb24vcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYmYwNmQ0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvbWlncmF0aW9uL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIHRoZSBpbnRlcmZhY2VzIGZvciB1cGdyYWRpbmcgYSBtZXRob2QgbGlicmFyeSB0byBhIG5ld2VyIFVNQSB2ZXJzaW9uLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvcGFja2FnZS5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2YjA3ZDcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyB0aGUgaW50ZXJmYWNlcyBhbmQgaW1wbGVtZW50YXRpb24gZm9yIHBlcnNpc3RpbmcgYSBtZXRob2QgbGlicmFyeS4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL3JlZnJlc2gvSVJlZnJlc2hFdmVudC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS9yZWZyZXNoL0lSZWZyZXNoRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGE1NmM4ZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL3JlZnJlc2gvSVJlZnJlc2hFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLnJlZnJlc2g7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLQotLyoqCi0gKiBJbnN0YW5jZSBvZiB0aGlzIGNsYXNzIHByb3ZpZGVzIGRhdGEgYWJvdXQgYSByZWZyZXNoIGV2ZW50LgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElSZWZyZXNoRXZlbnQgewotCi0JLyoqCi0JICogR2V0cyByZXNvdXJjZXMgdGhhdCBoYWQgYmVlbiByZWZyZXNoZWQuCi0JICogCi0JICogQHJldHVybiByZWZyZXNoZWQgcmVzb3VyY2VzCi0JICovCi0JQ29sbGVjdGlvbjxSZXNvdXJjZT4gZ2V0UmVmcmVzaGVkUmVzb3VyY2VzKCk7Ci0JCi0JQ29sbGVjdGlvbjxSZXNvdXJjZT4gZ2V0VW5sb2FkZWRSZXNvdXJjZXMoKTsKLQotCS8qKgotCSAqIEdldHMgb2JqZWN0cyB0aGF0IGhhZCBiZWVuIHVubG9hZGVkIGFuZCBiZWNvbWUgcHJveGllcyBhZnRlciByZWZyZXNoCi0JICogCi0JICogQHJldHVybiB1bmxvYWRlZCBvYmplY3RzCi0JICovCi0JQ29sbGVjdGlvbjxFT2JqZWN0PiBnZXRVbmxvYWRlZE9iamVjdHMoKTsKLQotCS8qKgotCSAqIEdldHMgb2JqZWN0cyB0aGF0IGhhZCBiZWVuIHJlZnJlc2hlZC4KLQkgKiAKLQkgKiBAcmV0dXJuIHJlZnJlc2hlZCBvYmplY3RzCi0JICovCi0JQ29sbGVjdGlvbjxFT2JqZWN0PiBnZXRSZWZyZXNoZWRPYmplY3RzKCk7Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL3JlZnJlc2gvSVJlZnJlc2hIYW5kbGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL3JlZnJlc2gvSVJlZnJlc2hIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0OWJiYjkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS9yZWZyZXNoL0lSZWZyZXNoSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLnJlZnJlc2g7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLQotLyoqCi0gKiBJbnN0YW5jZSBvZiB0aGlzIGNsYXNzIHdpbGwgYmUgbm90aWZ5IGFib3V0IGNoYW5nZXMgaW4gcmVzb3VyY2VzIHNvIGl0IGNhbgotICogcmVhY3QgYWNjb3JkaW5nbHkKLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJUmVmcmVzaEhhbmRsZXIgewotCi0Jdm9pZCByZWZyZXNoKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcik7Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvcmVmcmVzaC9JUmVmcmVzaExpc3RlbmVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL3JlZnJlc2gvSVJlZnJlc2hMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNDEzNDEzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvcmVmcmVzaC9JUmVmcmVzaExpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UucmVmcmVzaDsKLQotLyoqCi0gKiBJbnN0YW5jZSBvZiB0aGlzIGNsYXNzLCBpZiBsaXN0ZW5pbmcgdG8gcmVmcmVzaCBldmVudCwgd2lsbCBnZXQgbm90aWZpZWQuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVJlZnJlc2hMaXN0ZW5lciB7Ci0KLQl2b2lkIG5vdGlmeVJlZnJlc2hlZChJUmVmcmVzaEV2ZW50IGV2ZW50KTsKLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS9yZWZyZXNoL1JlZnJlc2hKb2IuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvcmVmcmVzaC9SZWZyZXNoSm9iLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmOWJiZjQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS9yZWZyZXNoL1JlZnJlc2hKb2IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UucmVmcmVzaDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZURlbHRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZURlbHRhVmlzaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuV29ya3NwYWNlSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5Db21tb25QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVuaXF1ZUVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLkZpbGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5NdWx0aUZpbGVSZXNvdXJjZVNldEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLk11bHRpRmlsZVNhdmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5NdWx0aUZpbGVYTUlSZXNvdXJjZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS51dGlsLkxpYnJhcnlTY2hlZHVsaW5nUnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UudXRpbC5QZXJzaXN0ZW5jZVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UudXRpbC5QZXJzaXN0ZW5jZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLQotLyoqCi0gKiBCYWNrZ3JvdW5kIGpvYiB0aGF0IGtlZXBzIG5vdGlmeWluZyByZWZyZXNoIGhhbmRsZXJzIGFib3V0IGNoYW5nZXMgaW4KLSAqIHJlc291cmNlcwotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUmVmcmVzaEpvYiBleHRlbmRzIFdvcmtzcGFjZUpvYiBpbXBsZW1lbnRzIElSZXNvdXJjZUNoYW5nZUxpc3RlbmVyIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgVVBEQVRFX0RFTEFZID0gMjAwOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyA9IFBlcnNpc3RlbmNlUGx1Z2luLmdldERlZmF1bHQoKS5pc0RlYnVnZ2luZygpOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFQlVHX1BSRUZJWCA9ICJFUEYgQXV0by1yZWZyZXNoOiI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgUmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQ7Ci0KLQlwcml2YXRlIENvbGxlY3Rpb248UmVzb3VyY2U+IGFkZGVkUmVzb3VyY2VzID0gbmV3IFVuaXF1ZUVMaXN0PFJlc291cmNlPigpOwotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uPFJlc291cmNlPiBjaGFuZ2VkUmVzb3VyY2VzID0gbmV3IFVuaXF1ZUVMaXN0PFJlc291cmNlPigpOwotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uPFJlc291cmNlPiByZW1vdmVkUmVzb3VyY2VzID0gbmV3IFVuaXF1ZUVMaXN0PFJlc291cmNlPigpOwotCQotCXByaXZhdGUgQ29sbGVjdGlvbjxSZXNvdXJjZT4gbW92ZWRSZXNvdXJjZXMgPSBuZXcgVW5pcXVlRUxpc3Q8UmVzb3VyY2U+KCk7Ci0KLQlwcml2YXRlIFVuaXF1ZUVMaXN0PFJlc291cmNlPiBzYXZlZFJlc291cmNlcyA9IG5ldyBVbmlxdWVFTGlzdDxSZXNvdXJjZT4oKTsKLQotCXByaXZhdGUgQ29sbGVjdGlvbjxSZXNvdXJjZT4gbG9hZGVkQmVmb3JlUmVmcmVzaFJlc291cmNlcyA9IG5ldyBBcnJheUxpc3Q8UmVzb3VyY2U+KCk7Ci0KLQlwcml2YXRlIElSZWZyZXNoSGFuZGxlciByZWZyZXNoSGFuZGxlcjsKLQotCXByaXZhdGUgYm9vbGVhbiBlbmFibGVkID0gdHJ1ZTsKLQotCXByaXZhdGUgQ29sbGVjdGlvbjxJUmVzb3VyY2U+IGFkZGVkV29ya3NwYWNlUmVzb3VyY2VzID0gbmV3IFVuaXF1ZUVMaXN0PElSZXNvdXJjZT4oKTsKLQotCXByaXZhdGUgUmVmcmVzaEpvYigpIHsKLQkJc3VwZXIoUGVyc2lzdGVuY2VSZXNvdXJjZXMucmVzb3VyY2VBdXRvUmVmcmVzaEpvYl9uYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRFbmFibGVkKGJvb2xlYW4gYikgewotCQllbmFibGVkID0gYjsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWQoKSB7Ci0JCXJldHVybiBlbmFibGVkOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSByZXNvdXJjZVNldAotCSAqICAgICAgICAgICAgVGhlIHJlc291cmNlU2V0IHRvIHNldC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZXNvdXJjZVNldChSZXNvdXJjZVNldCByZXNvdXJjZVNldCkgewotCQl0aGlzLnJlc291cmNlU2V0ID0gcmVzb3VyY2VTZXQ7Ci0JfQotCQotCXB1YmxpYyBSZXNvdXJjZVNldCBnZXRSZXNvdXJjZVNldCgpIHsKLQkJcmV0dXJuIHJlc291cmNlU2V0OwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFJlZnJlc2hIYW5kbGVyKElSZWZyZXNoSGFuZGxlciBoYW5kbGVyKSB7Ci0JCXJlZnJlc2hIYW5kbGVyID0gaGFuZGxlcjsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIGV4aXN0aW5nIHJlc291cmNlcyB0aGF0IHJlYXBwZWFyIGluIHdvcmtzcGFjZXMKLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBhZGRlZFJlc291cmNlcwotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uPFJlc291cmNlPiBnZXRBZGRlZFJlc291cmNlcygpIHsKLQkJcmVtb3ZlUmVzb3VyY2VzKGFkZGVkUmVzb3VyY2VzLCBzYXZlZFJlc291cmNlcyk7Ci0JCXJldHVybiBhZGRlZFJlc291cmNlczsKLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbjxJUmVzb3VyY2U+IGdldEFkZGVkV29ya3NwYWNlUmVzb3VyY2VzKCkgewotCQlyZXR1cm4gYWRkZWRXb3Jrc3BhY2VSZXNvdXJjZXM7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBjaGFuZ2VkUmVzb3VyY2VzLgotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uPFJlc291cmNlPiBnZXRDaGFuZ2VkUmVzb3VyY2VzKCkgewotCQlyZW1vdmVSZXNvdXJjZXMoY2hhbmdlZFJlc291cmNlcywgc2F2ZWRSZXNvdXJjZXMpOwotCQlyZW1vdmVSZXNvdXJjZXMoY2hhbmdlZFJlc291cmNlcywgbG9hZGVkQmVmb3JlUmVmcmVzaFJlc291cmNlcyk7Ci0JCXJldHVybiBjaGFuZ2VkUmVzb3VyY2VzOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZXMgPGNvZGU+cmVzb3VyY2VzVG9SZW1vdmU8L2NvZGU+IGZyb20gPGNvZGU+cmVzb3VyY2VzPC9jb2RlPiBpZgotCSAqIHRoZSByZXNvdXJjZXMgYXJlIHN5bmNocm9uaXplZCB3aXRoIHRoZWlyIHN0b3JhZ2UuCi0JICogCi0JICogQHBhcmFtIHJlc291cmNlc1RvUmVtb3ZlCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCByZW1vdmVSZXNvdXJjZXMoQ29sbGVjdGlvbjxSZXNvdXJjZT4gcmVzb3VyY2VzLAotCQkJQ29sbGVjdGlvbjxSZXNvdXJjZT4gcmVzb3VyY2VzVG9SZW1vdmUpIHsKLQkJc3luY2hyb25pemVkIChyZXNvdXJjZXNUb1JlbW92ZSkgewotCQkJaWYgKCFyZXNvdXJjZXNUb1JlbW92ZS5pc0VtcHR5KCkpIHsKLQkJCQlmb3IgKEl0ZXJhdG9yPFJlc291cmNlPiBpdGVyID0gcmVzb3VyY2VzVG9SZW1vdmUuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJT2JqZWN0IHJlc291cmNlID0gaXRlci5uZXh0KCk7Ci0JCQkJCWJvb2xlYW4gY2FuUmVtb3ZlID0gdHJ1ZTsKLQkJCQkJaWYgKHJlc291cmNlIGluc3RhbmNlb2YgTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsKSB7Ci0JCQkJCQlNdWx0aUZpbGVYTUlSZXNvdXJjZUltcGwgbWZSZXNvdXJjZSA9ICgoTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsKSByZXNvdXJjZSk7Ci0JCQkJCQljYW5SZW1vdmUgPSBtZlJlc291cmNlLmlzU3luY2hyb25pemVkKCk7Ci0JCQkJCX0KLQkJCQkJaWYgKGNhblJlbW92ZSkgewotCQkJCQkJaWYgKHJlc291cmNlcy5yZW1vdmUocmVzb3VyY2UpKSB7Ci0JCQkJCQkJaXRlci5yZW1vdmUoKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgcmVtb3ZlZFJlc291cmNlcy4KLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbjxSZXNvdXJjZT4gZ2V0UmVtb3ZlZFJlc291cmNlcygpIHsKLQkJcmV0dXJuIHJlbW92ZWRSZXNvdXJjZXM7Ci0JfQotCQotCS8qKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgbW92ZWRSZXNvdXJjZXMuIAotCSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCXB1YmxpYyBDb2xsZWN0aW9uPFJlc291cmNlPiBnZXRNb3ZlZFJlc291cmNlcygpIHsKLQkJcmV0dXJuIG1vdmVkUmVzb3VyY2VzOyAgICAgICAgICAgICAKLQl9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotCXB1YmxpYyB2b2lkIHJlc291cmNlU2F2ZWQoUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJaWYocmVzb3VyY2UuZ2V0UmVzb3VyY2VTZXQoKSA9PSByZXNvdXJjZVNldCkgewotCQkJc3luY2hyb25pemVkIChzYXZlZFJlc291cmNlcykgewotCQkJCXNhdmVkUmVzb3VyY2VzLmFkZChyZXNvdXJjZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHRoZSBsb2FkZWRCZWZvcmVSZWZyZXNoUmVzb3VyY2VzCi0JICovCi0JcHVibGljIENvbGxlY3Rpb248UmVzb3VyY2U+IGdldFJlbG9hZGVkQmVmb3JlUmVmcmVzaFJlc291cmNlcygpIHsKLQkJcmV0dXJuIGxvYWRlZEJlZm9yZVJlZnJlc2hSZXNvdXJjZXM7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVzZXQoKSB7Ci0JCWNoYW5nZWRSZXNvdXJjZXMuY2xlYXIoKTsKLQkJcmVtb3ZlZFJlc291cmNlcy5jbGVhcigpOwotCQltb3ZlZFJlc291cmNlcy5jbGVhcigpOwotCQlzYXZlZFJlc291cmNlcy5jbGVhcigpOwotCQlsb2FkZWRCZWZvcmVSZWZyZXNoUmVzb3VyY2VzLmNsZWFyKCk7Ci0JCWFkZGVkUmVzb3VyY2VzLmNsZWFyKCk7Ci0JCWFkZGVkV29ya3NwYWNlUmVzb3VyY2VzLmNsZWFyKCk7Ci0JfQotCQotCXByaXZhdGUgTWV0aG9kTGlicmFyeSBnZXRNZXRob2RMaWJyYXJ5KCkgewotCQlpZihyZXNvdXJjZVNldCBpbnN0YW5jZW9mIE11bHRpRmlsZVJlc291cmNlU2V0SW1wbCkgewotCQkJcmV0dXJuICgoTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsKXJlc291cmNlU2V0KS5nZXRNZXRob2RMaWJyYXJ5KCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNjaGVkdWxlUmVmcmVzaCgpIHsJCQotCQlpZiAoZ2V0U3RhdGUoKSA9PSBKb2IuTk9ORSkgewotCQkJTWV0aG9kTGlicmFyeSBsaWIgPSBnZXRNZXRob2RMaWJyYXJ5KCk7Ci0JCQlpZihsaWIgIT0gbnVsbCkgewotCQkJCXNldFJ1bGUobmV3IExpYnJhcnlTY2hlZHVsaW5nUnVsZShsaWIpKTsKLQkJCQlzY2hlZHVsZShVUERBVEVfREVMQVkpOwotCQkJfQotCQl9Ci0JfQkKLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgV29ya3NwYWNlSm9iI3J1bkluV29ya3NwYWNlCi0JICovCi0JcHVibGljIElTdGF0dXMgcnVuSW5Xb3Jrc3BhY2UoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCWlmIChyZWZyZXNoSGFuZGxlciA9PSBudWxsKQotCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0KLQkJbG9uZyBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQlUaHJvd2FibGUgZXJyb3IgPSBudWxsOwotCQl0cnkgewotCQkJaWYgKERFQlVHKQotCQkJCVN5c3RlbS5vdXQucHJpbnRsbihERUJVR19QUkVGSVggKyAiIHN0YXJ0aW5nIHJlZnJlc2ggam9iIik7IC8vJE5PTi1OTFMtMSQKLQkJCW1vbml0b3IuYmVnaW5UYXNrKCIiLCBJUHJvZ3Jlc3NNb25pdG9yLlVOS05PV04pOyAvLyROT04tTkxTLTEkCi0JCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpCi0JCQkJdGhyb3cgbmV3IE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uKCk7Ci0JCQl0cnkgewotCQkJCXJlZnJlc2hIYW5kbGVyLnJlZnJlc2gobW9uaXRvcik7Ci0JCQl9IGNhdGNoIChUaHJvd2FibGUgZSkgewotCQkJCWVycm9yID0gZTsKLQkJCX0KLQkJfSBmaW5hbGx5IHsKLQkJCW1vbml0b3IuZG9uZSgpOwotCQkJaWYgKERFQlVHKQotCQkJCVN5c3RlbS5vdXQKLQkJCQkJCS5wcmludGxuKERFQlVHX1BSRUZJWAotCQkJCQkJCQkrICIgZmluaXNoZWQgcmVmcmVzaCBqb2IgaW46ICIgKyAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBzdGFydCkgKyAibXMiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQkJaWYgKGVycm9yICE9IG51bGwpCi0JCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBGaWxlTWFuYWdlci5QTFVHSU5fSUQsIDAsCi0JCQkJCSJSZWZyZXNoIGVycm9yIiwgZXJyb3IpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iI3Nob3VsZFJ1bigpCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIHNob3VsZFJ1bigpIHsKLQkJcmV0dXJuIHNob3VsZFJlZnJlc2goKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gc2hvdWxkUmVmcmVzaCgpIHsKLQkJcmV0dXJuICFyZW1vdmVkUmVzb3VyY2VzLmlzRW1wdHkoKSB8fCAhY2hhbmdlZFJlc291cmNlcy5pc0VtcHR5KCkKLQkJCQl8fCAhYWRkZWRSZXNvdXJjZXMuaXNFbXB0eSgpIHx8ICFtb3ZlZFJlc291cmNlcy5pc0VtcHR5KCkKLQkJCQl8fCAhbG9hZGVkQmVmb3JlUmVmcmVzaFJlc291cmNlcy5pc0VtcHR5KCkKLQkJCQl8fCAhYWRkZWRXb3Jrc3BhY2VSZXNvdXJjZXMuaXNFbXB0eSgpOwotCX0KLQotCS8qKgotCSAqIFN0YXJ0cyB0aGUgcmVmcmVzaCBqb2IKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydCgpIHsKLQkJaWYgKERFQlVHKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIlJlZnJlc2hKb2Iuc3RhcnQoKSIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmFkZFJlc291cmNlQ2hhbmdlTGlzdGVuZXIodGhpcyk7Ci0JfQotCi0JLyoqCi0JICogU3RvcHMgdGhlIHJlZnJlc2ggam9iCi0JICovCi0JcHVibGljIHZvaWQgc3RvcCgpIHsKLQkJaWYgKERFQlVHKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIlJlZnJlc2hKb2Iuc3RvcCgpIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkucmVtb3ZlUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKLQkJY2FuY2VsKCk7Ci0JfQotCi0JcHVibGljIFJlc291cmNlIGdldFJlc291cmNlKElSZXNvdXJjZSB3c1JlcykgewotCQlpZihyZXNvdXJjZVNldCBpbnN0YW5jZW9mIE11bHRpRmlsZVJlc291cmNlU2V0SW1wbCkgewotCQkJcmV0dXJuICgoTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsKXJlc291cmNlU2V0KS5nZXRSZXNvdXJjZSh3c1Jlcyk7Ci0JCX0KLQkJSVBhdGggcGF0aCA9IHdzUmVzLmdldExvY2F0aW9uKCk7Ci0JCXJldHVybiBwYXRoICE9IG51bGwgPyBQZXJzaXN0ZW5jZVV0aWwuZ2V0UmVzb3VyY2UocGF0aCwgcmVzb3VyY2VTZXQpIDogbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDaGVja3MgaWYgdGhlIGdpdmVuIHJlc291cmNlIGNhbiBiZSBhY2NlcHRlZCBhcyBhIG5ldyByZXNvdXJjZSBvZgotCSAqIHJlc291cmNlIHNldCBvZiB0aGlzIHJlZnJlc2ggam9iIHRoYXQgbmVlZHMgdG8gYmUgbG9hZGVkLgotCSAqIAotCSAqIEBwYXJhbSByZXNvdXJjZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gYWNjZXB0KElSZXNvdXJjZSByZXNvdXJjZSkgewotCQlpZiAocmVzb3VyY2VTZXQgaW5zdGFuY2VvZiBNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwpIHsKLQkJCXJldHVybiAoKE11bHRpRmlsZVJlc291cmNlU2V0SW1wbCkgcmVzb3VyY2VTZXQpCi0JCQkJCS5pc05ld1Jlc291cmNlVG9Mb2FkKHJlc291cmNlKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciNyZXNvdXJjZUNoYW5nZWQob3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgcmVzb3VyY2VDaGFuZ2VkKElSZXNvdXJjZUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCWlmICghaXNFbmFibGVkKCkgfHwgcmVzb3VyY2VTZXQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJSVJlc291cmNlRGVsdGEgZGVsdGEgPSBldmVudC5nZXREZWx0YSgpOwotCQlpZiAoZGVsdGEgPT0gbnVsbCkKLQkJCXJldHVybjsJCQotCQl0cnkgewotCQkJY2xhc3MgUmVzb3VyY2VEZWx0YVZpc2l0b3IgaW1wbGVtZW50cyBJUmVzb3VyY2VEZWx0YVZpc2l0b3IgewotCQkJCXByaXZhdGUgQ29sbGVjdGlvbjxSZXNvdXJjZT4gY2hhbmdlZFJlc291cmNlcyA9IG5ldyBBcnJheUxpc3Q8UmVzb3VyY2U+KCk7Ci0KLQkJCQlwcml2YXRlIENvbGxlY3Rpb248UmVzb3VyY2U+IHJlbW92ZWRSZXNvdXJjZXMgPSBuZXcgQXJyYXlMaXN0PFJlc291cmNlPigpOwotCQkJCQotCQkJCXByaXZhdGUgQ29sbGVjdGlvbjxSZXNvdXJjZT4gbW92ZWRSZXNvdXJjZXMgPSBuZXcgQXJyYXlMaXN0PFJlc291cmNlPigpOwotCi0JCQkJcHJpdmF0ZSBDb2xsZWN0aW9uPFJlc291cmNlPiBhZGRlZFJlc291cmNlcyA9IG5ldyBBcnJheUxpc3Q8UmVzb3VyY2U+KCk7Ci0KLQkJCQlwcml2YXRlIEFycmF5TGlzdDxJUmVzb3VyY2U+IGFkZGVkV29ya3NwYWNlUmVzb3VyY2VzID0gbmV3IEFycmF5TGlzdDxJUmVzb3VyY2U+KCk7Ci0JCQkJCi0JCQkJcHVibGljIGJvb2xlYW4gdmlzaXQoSVJlc291cmNlRGVsdGEgZGVsdGEpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCQkJUmVzb3VyY2UgcmVzb3VyY2U7Ci0JCQkJCWlmICgoZGVsdGEuZ2V0RmxhZ3MoKSAmIElSZXNvdXJjZURlbHRhLk1BUktFUlMpICE9IElSZXNvdXJjZURlbHRhLk1BUktFUlMKLQkJCQkJCQkmJiBkZWx0YS5nZXRSZXNvdXJjZSgpLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuRklMRSkgewotCQkJCQkJc3dpdGNoIChkZWx0YS5nZXRLaW5kKCkpIHsKLQkJCQkJCWNhc2UgSVJlc291cmNlRGVsdGEuQURERUQ6Ci0JCQkJCQkJLy8gaGFuZGxlIGFkZGVkIHJlc291cmNlCi0JCQkJCQkJLy8KLQkJCQkJCQlyZXNvdXJjZSA9IGdldFJlc291cmNlKGRlbHRhLmdldFJlc291cmNlKCkpOwotCQkJCQkJCWlmIChyZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQkJCQkJCWlmICghcmVzb3VyY2UuaXNMb2FkZWQoKSkgewotCQkJCQkJCQkJLy8gdGhlIHJlc291cmNlIHdhcyBjcmVhdGVkIGJ1dCBub3QKLQkJCQkJCQkJCS8vIGxvYWRlZCBiL2MgdGhlIHdvcmtzcGFjZSByZXNvdXJjZQotCQkJCQkJCQkJLy8gd2FzIG5vdCBhZGRlZCB0byB0aGUgd29ya3NwYWNlIGF0IHRoZQotCQkJCQkJCQkJLy8gdGltZSBvZiBsb2FkaW5nCi0JCQkJCQkJCQkvLwotCQkJCQkJCQkJTWV0aG9kRWxlbWVudCBtZSA9IFBlcnNpc3RlbmNlVXRpbAotCQkJCQkJCQkJLmdldE1ldGhvZEVsZW1lbnQocmVzb3VyY2UpOwotCQkJCQkJCQkJaWYgKCEobWUgaW5zdGFuY2VvZiBDb250ZW50RGVzY3JpcHRpb24pKSB7Ci0JCQkJCQkJCQkJLy8gbm8gYXV0by1yZWxvYWQgZm9yIGNvbnRlbnQKLQkJCQkJCQkJCQkvLyBkZXNjcmlwdGlvbgotCQkJCQkJCQkJCS8vIE1ldGhvZEVsZW1lbnRFZGl0b3Igd2lsbCBkZXRlY3QKLQkJCQkJCQkJCQkvLyB0aGUgY2hhbmdlIGFuZCBsb2FkIGl0Ci0JCQkJCQkJCQkJLy8gd2hlbiBhY3RpdmF0ZWQuCi0JCQkJCQkJCQkJLy8KLQkJCQkJCQkJCQlhZGRlZFJlc291cmNlcy5hZGQocmVzb3VyY2UpOwotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJfSBlbHNlIGlmIChhY2NlcHQoZGVsdGEuZ2V0UmVzb3VyY2UoKSkpIHsKLQkJCQkJCQkJYWRkZWRXb3Jrc3BhY2VSZXNvdXJjZXMuYWRkKGRlbHRhCi0JCQkJCQkJCQkJLmdldFJlc291cmNlKCkpOwotCQkJCQkJCX0KLQkJCQkJCQkKLQkJCQkJCQkvLyBoYW5kbGUgZmlsZSBtb3ZlCi0JCQkJCQkJLy8KLQkJCQkJCQlpZiAoKElSZXNvdXJjZURlbHRhLk1PVkVEX0ZST00gJiBkZWx0YS5nZXRGbGFncygpKSAhPSAwKSB7Ci0vLwkJCQkJCQkJcmVzb3VyY2UgPSBnZXRSZXNvdXJjZShkZWx0YS5nZXRSZXNvdXJjZSgpKTsgICAgICAgICAgCi0vLwkJCQkJCQkJaWYgKHJlc291cmNlICE9IG51bGwpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAKLS8vCQkJCQkJCQkJbW92ZWRSZXNvdXJjZXMuYWRkKHJlc291cmNlKTsgICAgICAgICAgICAgICAgIAotLy8JCQkJCQkJCX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JCQkJCQkJCS8vCi0JCQkJCQkJCWlmIChERUJVRykgewotCQkJCQkJCQkJSVBhdGggbW92ZWRGcm9tUGF0aCA9IGRlbHRhLmdldFJlc291cmNlKCkKLQkJCQkJCQkJCQkJLmdldExvY2F0aW9uKCk7Ci0JCQkJCQkJCQlJUGF0aCBtb3ZlZFRvUGF0aCA9IGRlbHRhLmdldE1vdmVkVG9QYXRoKCk7Ci0JCQkJCQkJCQlTeXN0ZW0ub3V0Ci0JCQkJCQkJCQkJCS5wcmludGxuKCJSZXNvdXJjZSBtb3ZlZCBmcm9tICciICsgbW92ZWRGcm9tUGF0aCArICInIHRvICciICsgbW92ZWRUb1BhdGggKyAiJyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJCQl9Ci0KLQkJCQkJCQl9Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQljYXNlIElSZXNvdXJjZURlbHRhLlJFTU9WRUQ6Ci0JCQkJCQkJcmVzb3VyY2UgPSBnZXRSZXNvdXJjZShkZWx0YS5nZXRSZXNvdXJjZSgpKTsKLQkJCQkJCQlpZiAocmVzb3VyY2UgIT0gbnVsbCkgewotCQkJCQkJCQlyZW1vdmVkUmVzb3VyY2VzLmFkZChyZXNvdXJjZSk7Ci0JCQkJCQkJfQotCQkJCQkJCWJyZWFrOwotCQkJCQkJY2FzZSBJUmVzb3VyY2VEZWx0YS5DSEFOR0VEOgotCQkJCQkJCWJvb2xlYW4gZW5jb2RpbmdDaGFuZ2VkID0gKChJUmVzb3VyY2VEZWx0YS5FTkNPRElORyAmIGRlbHRhCi0JCQkJCQkJCQkuZ2V0RmxhZ3MoKSkgIT0gMCk7Ci0JCQkJCQkJYm9vbGVhbiBjb250ZW50Q2hhbmdlZCA9ICgoSVJlc291cmNlRGVsdGEuQ09OVEVOVCAmIGRlbHRhCi0JCQkJCQkJCQkuZ2V0RmxhZ3MoKSkgIT0gMCk7Ci0JCQkJCQkJaWYgKGVuY29kaW5nQ2hhbmdlZCB8fCBjb250ZW50Q2hhbmdlZCkgewotCQkJCQkJCQlyZXNvdXJjZSA9IGdldFJlc291cmNlKGRlbHRhLmdldFJlc291cmNlKCkpOwotCQkJCQkJCQlpZiAocmVzb3VyY2UgIT0gbnVsbAotCQkJCQkJCQkJCSYmIE11bHRpRmlsZVNhdmVVdGlsCi0JCQkJCQkJCQkJLmNoZWNrU3luY2hyb25pemVkKHJlc291cmNlKSAhPSAxKSB7Ci0JCQkJCQkJCQljaGFuZ2VkUmVzb3VyY2VzLmFkZChyZXNvdXJjZSk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJCi0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQotCQkJfTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotCQkJUmVzb3VyY2VEZWx0YVZpc2l0b3IgdmlzaXRvciA9IG5ldyBSZXNvdXJjZURlbHRhVmlzaXRvcigpOwotCQkJZGVsdGEuYWNjZXB0KHZpc2l0b3IpOwotCi0JCQlyZW1vdmVkUmVzb3VyY2VzLmFkZEFsbCh2aXNpdG9yLnJlbW92ZWRSZXNvdXJjZXMpOwotCQkJbW92ZWRSZXNvdXJjZXMuYWRkQWxsKHZpc2l0b3IubW92ZWRSZXNvdXJjZXMpOwotCQkJY2hhbmdlZFJlc291cmNlcy5hZGRBbGwodmlzaXRvci5jaGFuZ2VkUmVzb3VyY2VzKTsKLQkJCWFkZGVkUmVzb3VyY2VzLmFkZEFsbCh2aXNpdG9yLmFkZGVkUmVzb3VyY2VzKTsKLQkJCWFkZGVkV29ya3NwYWNlUmVzb3VyY2VzLmFkZEFsbCh2aXNpdG9yLmFkZGVkV29ya3NwYWNlUmVzb3VyY2VzKTsKLQotCQkJaWYgKHNob3VsZFJlZnJlc2goKSkgewotCQkJCXNjaGVkdWxlUmVmcmVzaCgpOwotCQkJfQotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCUNvbW1vblBsdWdpbi5JTlNUQU5DRS5sb2coZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXNvbHZlcyB0aGUgcHJveHkgYW5kIGl0cyBjb250YWluZXJzCi0JICogCi0JICogQHBhcmFtIHByb3h5Ci0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBFT2JqZWN0IHJlc29sdmUoRU9iamVjdCBwcm94eSkgewotCQlyZXR1cm4gUGVyc2lzdGVuY2VVdGlsLnJlc29sdmUocHJveHksIHJlc291cmNlU2V0KTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFJlZnJlc2hKb2IgZ2V0SW5zdGFuY2UoKSB7Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBSZWZyZXNoSm9iIGluc3RhbmNlID0gbmV3IFJlZnJlc2hKb2IoKTsKLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvcmVmcmVzaC9pbnRlcm5hbC9SZWZyZXNoRXZlbnQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvcmVmcmVzaC9pbnRlcm5hbC9SZWZyZXNoRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDJkZjYxZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL3JlZnJlc2gvaW50ZXJuYWwvUmVmcmVzaEV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UucmVmcmVzaC5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UucmVmcmVzaC5JUmVmcmVzaEV2ZW50OwotCi0vKioKLSAqIEltcGxlbWVudGF0aW9uIGNsYXNzIG9mIElSZWZyZXNoRXZlbnQKLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFJlZnJlc2hFdmVudCBpbXBsZW1lbnRzIElSZWZyZXNoRXZlbnQgewotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uPFJlc291cmNlPiByZWZyZXNoZWRSZXNvdXJjZXMgPSBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsKLQkKLQlwcml2YXRlIENvbGxlY3Rpb248UmVzb3VyY2U+IHVubG9hZGVkUmVzb3VyY2VzID0gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7Ci0KLQlwcml2YXRlIENvbGxlY3Rpb248RU9iamVjdD4gdW5sb2FkZWRPYmplY3RzID0gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7Ci0JCi0JcHJpdmF0ZSBDb2xsZWN0aW9uPEVPYmplY3Q+IHJlZnJlc2hlZE9iamVjdHMgPSBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsKLQkKLQlwdWJsaWMgUmVmcmVzaEV2ZW50KENvbGxlY3Rpb248UmVzb3VyY2U+IHVubG9hZGVkUmVzb3VyY2VzKSB7Ci0JCXRoaXMudW5sb2FkZWRSZXNvdXJjZXMgPSB1bmxvYWRlZFJlc291cmNlczsKLQl9Ci0KLQlwdWJsaWMgUmVmcmVzaEV2ZW50KENvbGxlY3Rpb248UmVzb3VyY2U+IHJlZnJlc2hlZFJlc291cmNlcywKLQkJCUNvbGxlY3Rpb248RU9iamVjdD4gdW5sb2FkZWRPYmplY3RzKSB7Ci0JCXRoaXMocmVmcmVzaGVkUmVzb3VyY2VzLCB1bmxvYWRlZE9iamVjdHMsIENvbGxlY3Rpb25zLkVNUFRZX0xJU1QpOwotCX0JCi0KLQkvKioKLQkgKiBAcGFyYW0gcmVmcmVzaGVkUmVzb3VyY2VzCi0JICogQHBhcmFtIHVubG9hZGVkT2JqZWN0cwotCSAqIEBwYXJhbSByZWZyZXNoZWRPYmplY3RzCi0JICovCi0JcHVibGljIFJlZnJlc2hFdmVudChDb2xsZWN0aW9uPFJlc291cmNlPiByZWZyZXNoZWRSZXNvdXJjZXMsIENvbGxlY3Rpb248RU9iamVjdD4gdW5sb2FkZWRPYmplY3RzLCBDb2xsZWN0aW9uPEVPYmplY3Q+IHJlZnJlc2hlZE9iamVjdHMpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5yZWZyZXNoZWRSZXNvdXJjZXMgPSByZWZyZXNoZWRSZXNvdXJjZXM7Ci0JCXRoaXMudW5sb2FkZWRPYmplY3RzID0gdW5sb2FkZWRPYmplY3RzOwotCQl0aGlzLnJlZnJlc2hlZE9iamVjdHMgPSByZWZyZXNoZWRPYmplY3RzOwotCX0KLQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UucmVmcmVzaC5JUmVmcmVzaEV2ZW50I2dldFJlZnJlc2hlZFJlc291cmNlcygpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb248UmVzb3VyY2U+IGdldFJlZnJlc2hlZFJlc291cmNlcygpIHsKLQkJcmV0dXJuIHJlZnJlc2hlZFJlc291cmNlczsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5yZWZyZXNoLklSZWZyZXNoRXZlbnQjZ2V0VW5sb2FkZWRPYmplY3RzKCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbjxFT2JqZWN0PiBnZXRVbmxvYWRlZE9iamVjdHMoKSB7Ci0JCXJldHVybiB1bmxvYWRlZE9iamVjdHM7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLnJlZnJlc2guSVJlZnJlc2hFdmVudCNnZXRSZWZyZXNoZWRPYmplY3RzKCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbjxFT2JqZWN0PiBnZXRSZWZyZXNoZWRPYmplY3RzKCkgewotCQlyZXR1cm4gcmVmcmVzaGVkT2JqZWN0czsKLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbjxSZXNvdXJjZT4gZ2V0VW5sb2FkZWRSZXNvdXJjZXMoKSB7Ci0JCXJldHVybiB1bmxvYWRlZFJlc291cmNlczsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL3JlZnJlc2gvaW50ZXJuYWwvcGFja2FnZS5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS9yZWZyZXNoL2ludGVybmFsL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDNkN2I0OC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL3JlZnJlc2gvaW50ZXJuYWwvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgdGhlIGltcGxlbWVudGF0aW9uIGZvciBtYW5hZ2luZyBtZXRob2QgbGlicmFyeSByZWZyZXNoZXMuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS9yZWZyZXNoL3BhY2thZ2UuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvcmVmcmVzaC9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhYjdjNTYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS9yZWZyZXNoL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIHRoZSBpbnRlcmZhY2VzIGZvciBtYW5hZ2luZyBtZXRob2QgbGlicmFyeSByZWZyZXNoZXMuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS91dGlsL0xpYnJhcnlTY2hlZHVsaW5nUnVsZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS91dGlsL0xpYnJhcnlTY2hlZHVsaW5nUnVsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNWJhZDcxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvdXRpbC9MaWJyYXJ5U2NoZWR1bGluZ1J1bGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLklTY2hlZHVsaW5nUnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5NdWx0aVJ1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotCi0vKioKLSAqIFNjaGVkdWxpbmcgcnVsZSB1c2VkIHRvIGxvY2sgYSBsaWJyYXJ5IGR1cmluZyBhIG9wZXJhdGlvbiBhbmQgZGVmZXIgdGhlCi0gKiBicm9hZGNhc3Rpbmcgb2YgcmVzb3VyY2UgY2hhbmdlIGV2ZW50IHVudGlsIHRoZSBvcGVyYXRpb24gaXMgZmluaXNoZWQuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlIC0gQXVnIDE1LCAyMDA2Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBMaWJyYXJ5U2NoZWR1bGluZ1J1bGUgaW1wbGVtZW50cyBJU2NoZWR1bGluZ1J1bGUgewotCXByaXZhdGUgTWV0aG9kTGlicmFyeSBsaWJyYXJ5OwotCi0JLyoqCi0JICogQHBhcmFtIGxpYgotCSAqLwotCXB1YmxpYyBMaWJyYXJ5U2NoZWR1bGluZ1J1bGUoTWV0aG9kTGlicmFyeSBsaWIpIHsKLQkJdGhpcy5saWJyYXJ5ID0gbGliOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSVNjaGVkdWxpbmdSdWxlI2NvbnRhaW5zKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLklTY2hlZHVsaW5nUnVsZSkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjb250YWlucyhJU2NoZWR1bGluZ1J1bGUgcnVsZSkgewotCQlpZiAodGhpcyA9PSBydWxlKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlpZiAocnVsZSBpbnN0YW5jZW9mIExpYnJhcnlTY2hlZHVsaW5nUnVsZSkgewotCQkJcmV0dXJuICgoTGlicmFyeVNjaGVkdWxpbmdSdWxlKSBydWxlKS5saWJyYXJ5ID09IGxpYnJhcnk7Ci0JCX0KLQkJaWYgKHJ1bGUgaW5zdGFuY2VvZiBNdWx0aVJ1bGUpIHsKLQkJCU11bHRpUnVsZSBtcnVsZSA9IChNdWx0aVJ1bGUpIHJ1bGU7Ci0JCQlJU2NoZWR1bGluZ1J1bGVbXSBjaGlsZFJ1bGVzID0gbXJ1bGUuZ2V0Q2hpbGRyZW4oKTsKLQkJCWZvciAoaW50IGk9MDsgaTxjaGlsZFJ1bGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKCEgKGNoaWxkUnVsZXNbaV0gaW5zdGFuY2VvZiBJUmVzb3VyY2UpKSB7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0JCS8vIGFsbG93IGFueSBJUmVzb3VyY2UgcnVsZSB0byBuZXN0IHdpdGhpbiB0aGUgc2FtZSB0aHJlYWQKLQkJLy8KLQkJcmV0dXJuIHJ1bGUgaW5zdGFuY2VvZiBJUmVzb3VyY2U7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5JU2NoZWR1bGluZ1J1bGUjaXNDb25mbGljdGluZyhvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5JU2NoZWR1bGluZ1J1bGUpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNDb25mbGljdGluZyhJU2NoZWR1bGluZ1J1bGUgcnVsZSkgewotCQlyZXR1cm4gZXF1YWxzKHJ1bGUpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCNlcXVhbHMoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotCQlyZXR1cm4gdGhpcyA9PSBvYmoKLQkJCQl8fCAob2JqIGluc3RhbmNlb2YgTGlicmFyeVNjaGVkdWxpbmdSdWxlICYmICgoTGlicmFyeVNjaGVkdWxpbmdSdWxlKSBvYmopLmxpYnJhcnkgPT0gbGlicmFyeSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGludCBoYXNoQ29kZSgpIHsKLQkJcmV0dXJuIGxpYnJhcnkuaGFzaENvZGUoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL3V0aWwvUGF0dGVybkNvbnN0cnVjdG9yLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL3V0aWwvUGF0dGVybkNvbnN0cnVjdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyNDZlNjAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS91dGlsL1BhdHRlcm5Db25zdHJ1Y3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47Ci1pbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm5TeW50YXhFeGNlcHRpb247Ci0KLS8qKgotICogVXRpbGl0eSBjbGFzcyB3aXRoIHN0YXRpYyBtZXRob2RzIHRvIGNyZWF0ZSBzZWFyY2ggcGF0dGVybgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUGF0dGVybkNvbnN0cnVjdG9yIHsKLQotCXByaXZhdGUgUGF0dGVybkNvbnN0cnVjdG9yKCkgewotCQkvLyBkb24ndCBpbnN0YW50aWF0ZQotCX0KLQotCXB1YmxpYyBzdGF0aWMgUGF0dGVybiBjcmVhdGVQYXR0ZXJuKFN0cmluZyBwYXR0ZXJuLAotCQkJYm9vbGVhbiBpc0Nhc2VTZW5zaXRpdmUsIGJvb2xlYW4gaXNSZWdleCkKLQkJCXRocm93cyBQYXR0ZXJuU3ludGF4RXhjZXB0aW9uIHsKLQkJcmV0dXJuIGNyZWF0ZVBhdHRlcm4ocGF0dGVybiwgaXNSZWdleCwgdHJ1ZSwgaXNDYXNlU2Vuc2l0aXZlLCBmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIHBhdHRlcm4gZWxlbWVudCBmcm9tIHRoZSBwYXR0ZXJuIHN0cmluZyB3aGljaCBpcyBlaXRoZXIgYQotCSAqIHJlZy1leCBleHByZXNzaW9uIG9yIGluIG91ciBvbGQgJ1N0cmluZ01hdGNoZXInIGZvcm1hdC4KLQkgKiAKLQkgKiBAcGFyYW0gcGF0dGVybgotCSAqICAgICAgICAgICAgVGhlIHNlYXJjaCBwYXR0ZXJuCi0JICogQHBhcmFtIGlzUmVnZXgKLQkgKiAgICAgICAgICAgIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBwYXNzZWQgc3RyaW5nIGFscmVhZHkgaXMgYSByZWctZXgKLQkgKiAgICAgICAgICAgIHBhdHRlcm4KLQkgKiBAcGFyYW0gaXNTdHJpbmdNYXRjaGVyCi0JICogICAgICAgICAgICA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgcGFzc2VkIHN0cmluZyBpcyBpbiB0aGUKLQkgKiAgICAgICAgICAgIFN0cmluZ01hdGNoZXIgZm9ybWF0LgotCSAqIEBwYXJhbSBpc0Nhc2VTZW5zaXRpdmUKLQkgKiAgICAgICAgICAgIFNldCB0byA8Y29kZT50cnVlPC9jb2RlPiB0byBjcmVhdGUgYSBjYXNlIGluc2Vuc2l0aXZlCi0JICogICAgICAgICAgICBwYXR0ZXJuCi0JICogQHBhcmFtIGlzV2hvbGVXb3JkCi0JICogICAgICAgICAgICA8Y29kZT50cnVlPC9jb2RlPiB0byBjcmVhdGUgYSBwYXR0ZXJuIHRoYXQgcmVxdWlyZXMgYSB3b3JkCi0JICogICAgICAgICAgICBib3VuZGFyeSBhdCB0aGUgYmVnaW5uaW5nIGFuZCB0aGUgZW5kLgotCSAqIEByZXR1cm4gVGhlIGNyZWF0ZWQgcGF0dGVybgotCSAqIEB0aHJvd3MgUGF0dGVyblN5bnRheEV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgUGF0dGVybiBjcmVhdGVQYXR0ZXJuKFN0cmluZyBwYXR0ZXJuLCBib29sZWFuIGlzUmVnZXgsCi0JCQlib29sZWFuIGlzU3RyaW5nTWF0Y2hlciwgYm9vbGVhbiBpc0Nhc2VTZW5zaXRpdmUsCi0JCQlib29sZWFuIGlzV2hvbGVXb3JkKSB0aHJvd3MgUGF0dGVyblN5bnRheEV4Y2VwdGlvbiB7Ci0JCWlmIChpc1JlZ2V4KSB7Ci0JCQlpZiAoaXNXaG9sZVdvcmQpIHsKLQkJCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcihwYXR0ZXJuLmxlbmd0aCgpICsgMTApOwotCQkJCWJ1ZmZlci5hcHBlbmQoIlxcYig/OiIpLmFwcGVuZChwYXR0ZXJuKS5hcHBlbmQoIilcXGIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJcGF0dGVybiA9IGJ1ZmZlci50b1N0cmluZygpOwotCQkJfQotCQl9IGVsc2UgewotCQkJaW50IGxlbiA9IHBhdHRlcm4ubGVuZ3RoKCk7Ci0JCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcihsZW4gKyAxMCk7Ci0JCQkvLyBkb24ndCBhZGQgYSB3b3JkIGJvdW5kYXJ5IGlmIHRoZSBzZWFyY2ggdGV4dCBkb2VzIG5vdCBzdGFydCB3aXRoCi0JCQkvLyBhIHdvcmQgY2hhci4gKHRoaXMgd29ya3MgYXJvdW5kIGEgdXNlciBpbnB1dCBlcnJvcikuCi0JCQlpZiAoaXNXaG9sZVdvcmQgJiYgbGVuID4gMCAmJiBpc1dvcmRDaGFyKHBhdHRlcm4uY2hhckF0KDApKSkgewotCQkJCWJ1ZmZlci5hcHBlbmQoIlxcYiIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlhcHBlbmRBc1JlZ0V4KGlzU3RyaW5nTWF0Y2hlciwgcGF0dGVybiwgYnVmZmVyKTsKLQkJCWlmIChpc1dob2xlV29yZCAmJiBsZW4gPiAwICYmIGlzV29yZENoYXIocGF0dGVybi5jaGFyQXQobGVuIC0gMSkpKSB7Ci0JCQkJYnVmZmVyLmFwcGVuZCgiXFxiIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCXBhdHRlcm4gPSBidWZmZXIudG9TdHJpbmcoKTsKLQkJfQotCi0JCWludCByZWdleE9wdGlvbnMgPSBQYXR0ZXJuLk1VTFRJTElORTsKLQkJaWYgKCFpc0Nhc2VTZW5zaXRpdmUpIHsKLQkJCXJlZ2V4T3B0aW9ucyB8PSBQYXR0ZXJuLkNBU0VfSU5TRU5TSVRJVkUgfCBQYXR0ZXJuLlVOSUNPREVfQ0FTRTsKLQkJfQotCQlyZXR1cm4gUGF0dGVybi5jb21waWxlKHBhdHRlcm4sIHJlZ2V4T3B0aW9ucyk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1dvcmRDaGFyKGNoYXIgYykgewotCQlyZXR1cm4gQ2hhcmFjdGVyLmlzTGV0dGVyT3JEaWdpdChjKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgcGF0dGVybiBlbGVtZW50IGZyb20gYW4gYXJyYXkgb2YgcGF0dGVybnMgaW4gdGhlIG9sZAotCSAqICdTdHJpbmdNYXRjaGVyJyBmb3JtYXQuCi0JICogCi0JICogQHBhcmFtIHBhdHRlcm5zCi0JICogICAgICAgICAgICBUaGUgc2VhcmNoIHBhdHRlcm5zCi0JICogQHBhcmFtIGlzQ2FzZVNlbnNpdGl2ZQotCSAqICAgICAgICAgICAgU2V0IHRvIDxjb2RlPnRydWU8L2NvZGU+IHRvIGNyZWF0ZSBhIGNhc2UgaW5zZW5zaXRpdmUKLQkgKiAgICAgICAgICAgIHBhdHRlcm4KLQkgKiBAcmV0dXJuIFRoZSBjcmVhdGVkIHBhdHRlcm4KLQkgKiBAdGhyb3dzIFBhdHRlcm5TeW50YXhFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFBhdHRlcm4gY3JlYXRlUGF0dGVybihTdHJpbmdbXSBwYXR0ZXJucywKLQkJCWJvb2xlYW4gaXNDYXNlU2Vuc2l0aXZlKSB0aHJvd3MgUGF0dGVyblN5bnRheEV4Y2VwdGlvbiB7Ci0JCVN0cmluZ0J1ZmZlciBwYXR0ZXJuID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHBhdHRlcm5zLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoaSA+IDApIHsKLQkJCQkvLyBub3RlIHRoYXQgdGhpcyB3b3JrcyBvbmx5IGFzIHdlIGtub3cgdGhhdCB0aGUgb3BlcmFuZHMgb2YgdGhlCi0JCQkJLy8gb3IgZXhwcmVzc2lvbiB3aWxsIGJlIHNpbXBsZSBhbmQgbmVlZCBubyBicmFja2V0cy4KLQkJCQlwYXR0ZXJuLmFwcGVuZCgnfCcpOwotCQkJfQotCQkJYXBwZW5kQXNSZWdFeCh0cnVlLCBwYXR0ZXJuc1tpXSwgcGF0dGVybik7Ci0JCX0KLQkJcmV0dXJuIGNyZWF0ZVBhdHRlcm4ocGF0dGVybi50b1N0cmluZygpLCB0cnVlLCB0cnVlLCBpc0Nhc2VTZW5zaXRpdmUsCi0JCQkJZmFsc2UpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nQnVmZmVyIGFwcGVuZEFzUmVnRXgoYm9vbGVhbiBpc1N0cmluZ01hdGNoZXIsCi0JCQlTdHJpbmcgcGF0dGVybiwgU3RyaW5nQnVmZmVyIGJ1ZmZlcikgewotCQlib29sZWFuIGlzRXNjYXBlZCA9IGZhbHNlOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHBhdHRlcm4ubGVuZ3RoKCk7IGkrKykgewotCQkJY2hhciBjID0gcGF0dGVybi5jaGFyQXQoaSk7Ci0JCQlzd2l0Y2ggKGMpIHsKLQkJCS8vIHRoZSBiYWNrc2xhc2gKLQkJCWNhc2UgJ1xcJzoKLQkJCQkvLyB0aGUgYmFja3NsYXNoIGlzIGVzY2FwZSBjaGFyIGluIHN0cmluZyBtYXRjaGVyCi0JCQkJaWYgKGlzU3RyaW5nTWF0Y2hlciAmJiAhaXNFc2NhcGVkKSB7Ci0JCQkJCWlzRXNjYXBlZCA9IHRydWU7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJYnVmZmVyLmFwcGVuZCgiXFxcXCIpOyAvLyROT04tTkxTLTEkCi0JCQkJCWlzRXNjYXBlZCA9IGZhbHNlOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCS8vIGNoYXJhY3RlcnMgdGhhdCBuZWVkIHRvIGJlIGVzY2FwZWQgaW4gdGhlIHJlZ2V4LgotCQkJY2FzZSAnKCc6Ci0JCQljYXNlICcpJzoKLQkJCWNhc2UgJ3snOgotCQkJY2FzZSAnfSc6Ci0JCQljYXNlICcuJzoKLQkJCWNhc2UgJ1snOgotCQkJY2FzZSAnXSc6Ci0JCQljYXNlICckJzoKLQkJCWNhc2UgJ14nOgotCQkJY2FzZSAnKyc6Ci0JCQljYXNlICd8JzoKLQkJCQlpZiAoaXNFc2NhcGVkKSB7Ci0JCQkJCWJ1ZmZlci5hcHBlbmQoIlxcXFwiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlpc0VzY2FwZWQgPSBmYWxzZTsKLQkJCQl9Ci0JCQkJYnVmZmVyLmFwcGVuZCgnXFwnKTsKLQkJCQlidWZmZXIuYXBwZW5kKGMpOwotCQkJCWJyZWFrOwotCQkJY2FzZSAnPyc6Ci0JCQkJaWYgKGlzU3RyaW5nTWF0Y2hlciAmJiAhaXNFc2NhcGVkKSB7Ci0JCQkJCWJ1ZmZlci5hcHBlbmQoJy4nKTsKLQkJCQl9IGVsc2UgewotCQkJCQlidWZmZXIuYXBwZW5kKCdcXCcpOwotCQkJCQlidWZmZXIuYXBwZW5kKGMpOwotCQkJCQlpc0VzY2FwZWQgPSBmYWxzZTsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQljYXNlICcqJzoKLQkJCQlpZiAoaXNTdHJpbmdNYXRjaGVyICYmICFpc0VzY2FwZWQpIHsKLQkJCQkJYnVmZmVyLmFwcGVuZCgiLioiKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0gZWxzZSB7Ci0JCQkJCWJ1ZmZlci5hcHBlbmQoJ1xcJyk7Ci0JCQkJCWJ1ZmZlci5hcHBlbmQoYyk7Ci0JCQkJCWlzRXNjYXBlZCA9IGZhbHNlOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCWRlZmF1bHQ6Ci0JCQkJaWYgKGlzRXNjYXBlZCkgewotCQkJCQlidWZmZXIuYXBwZW5kKCJcXFxcIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJaXNFc2NhcGVkID0gZmFsc2U7Ci0JCQkJfQotCQkJCWJ1ZmZlci5hcHBlbmQoYyk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJaWYgKGlzRXNjYXBlZCkgewotCQkJYnVmZmVyLmFwcGVuZCgiXFxcXCIpOyAvLyROT04tTkxTLTEkCi0JCQlpc0VzY2FwZWQgPSBmYWxzZTsKLQkJfQotCQlyZXR1cm4gYnVmZmVyOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS91dGlsL1BlcnNpc3RlbmNlUmVzb3VyY2VzLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL3V0aWwvUGVyc2lzdGVuY2VSZXNvdXJjZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGM4MGFiNy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL3V0aWwvUGVyc2lzdGVuY2VSZXNvdXJjZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi0vKioKLSAqIE1lc3NhZ2UgYnVuZGxlIGNsYXNzIGZvciBsaWJyYXJ5IHBlcnNpc3RlbmNlCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBQZXJzaXN0ZW5jZVJlc291cmNlcyBleHRlbmRzIE5MUyB7Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgQlVORExFX05BTUUgPSBQZXJzaXN0ZW5jZVJlc291cmNlcy5jbGFzcy5nZXRQYWNrYWdlKCkKLQkJCS5nZXROYW1lKCkKLQkJCSsgIi5SZXNvdXJjZXMiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIFBlcnNpc3RlbmNlUmVzb3VyY2VzKCkgewotCQkvLyBEbyBub3QgaW5zdGFudGlhdGUKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjYW5ub3RfY3JlYXRlX2Rpcl9tc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBpbnZhbGlkTmFtZUVycm9yX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG9iak5vdEZvdW5kRXJyb3JfbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbG9hZExpYnJhcnlFcnJvcl9tc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBsb2FkTGlicmFyeUVycm9yX2RldGFpbHM7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZWZyZXNoTGlicmFyeUZpbGVzVGFza19uYW1lOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVzb3VyY2VBdXRvUmVmcmVzaEpvYl9uYW1lOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVzdG9yZVJlc291cmNlRXJyb3JfbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRmlsZU1hbmFnZXJfZmlsZVJlYWRPbmx5OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRXJyTXNnX0NvdWxkTm90RGVsZXRlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVuYW1lRXJyb3JfbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgYmFja3VwRXJyb3JfbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbWFya2VyX2Vycl9jYW5ub3RSZXNvbHZlUHJveHk7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBtb2RpZnlGaWxlRXJyb3JfbXNnOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGZpbGVQYXRoTmFtZVRvb0xvbmdfbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbG9hZFJlc291cmNlRXJyb3JfbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbG9hZFJlc291cmNlRXJyb3JXaXRoUmVhc29uX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGludmFsaWRMaWJyYXJ5RmlsZUVycm9yX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGZpbGVOb3RGb3VuZEVycm9yX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG5vcm1hbGl6ZVVSSUVycm9yX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG1vdmVFcnJvcl9tc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBtb2RpZnlSZWFkT25seUZpbGVFcnJvcl9tc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBtb3ZlUmVzb3VyY2VFcnJvcl9tc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBtb2RpZnlGaWxlc0Vycm9yX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlc291cmNlT3V0T2ZTeW5jaF9tc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBsb2FkTGlicmFyeVRhc2tfbmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG1vdmVEYXRhVGFza19uYW1lOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2F2ZUxpYnJhcnlUYXNrX25hbWU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBsb2FkUmVzb3VyY2VzVGFza19uYW1lOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG1pZ3JhdGluZ0RpYWdyYW1fbmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG1pZ3JhdGVDb250ZW50RGVzY3JpcHRpb25zVGFza19uYW1lOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZml4UHJlc2VudGF0aW9uTmFtZVRhc2tfbmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHVucmVzb2x2ZWRQcm94eUxvZ2dlckpvYl9uYW1lOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgVW5yZXNvbHZlZFByb3h5TWFya2VyTWFuYWdlcl9jb3VsZE5vdFJlc29sdmVQcm94eTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGxvYWRDb25maWd1cmF0aW9uX2NvdWxkTm90TG9hZF9sb2dNc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBsb2FkQ29uZmlndXJhdGlvbl9ub3RDb25maWdGaWxlX2xvZ01zZzsKLQotCXN0YXRpYyB7Ci0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIFBlcnNpc3RlbmNlUmVzb3VyY2VzLmNsYXNzKTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL3V0aWwvUGVyc2lzdGVuY2VVdGlsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL3V0aWwvUGVyc2lzdGVuY2VVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0NjNjZGQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS91dGlsL1BlcnNpc3RlbmNlVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDE2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS51dGlsOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXI7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyRmFjdG9yeTsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5TQVhQYXJzZXI7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuU0FYUGFyc2VyRmFjdG9yeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uQ29tbW9uUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5zZXJ2aWNlLnZlcnNpb25pbmcuRVBGVmVyc2lvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5zZXJ2aWNlLnZlcnNpb25pbmcuVmVyc2lvblV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UuSUxpYnJhcnlSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS5JTGlicmFyeVJlc291cmNlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5GaWxlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UuTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5NdWx0aUZpbGVTYXZlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLm1pZ3JhdGlvbi5pbnRlcm5hbC5NaWdyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UucmVmcmVzaC5pbnRlcm5hbC5SZWZyZXNoRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmliYWJsZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLlZlcnNpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcueG1sLnNheC5BdHRyaWJ1dGVzOwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcueG1sLnNheC5oZWxwZXJzLkRlZmF1bHRIYW5kbGVyOwotCi0vKioKLSAqIFV0aWxpdHkgY2xhc3Mgd2l0aCBzdGF0aWMgaGVscGVyIG1ldGhvZHMgZm9yIGxpYnJhcnkgcGVyc2lzdGVuY2UKLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFBlcnNpc3RlbmNlVXRpbCB7Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBjdXJyZW50IG5hbWVzcGFjZSBVUkkgb2YgVU1BLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGdldFVNQU5zVVJJKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5lTlNfVVJJOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGdldFVNQU5zVVJJKFN0cmluZyBsaWJQYXRoKSB7Ci0JCXRyeSB7Ci0JCQlEb2N1bWVudEJ1aWxkZXIgYnVpbGRlciA9IERvY3VtZW50QnVpbGRlckZhY3RvcnkubmV3SW5zdGFuY2UoKQotCQkJCQkubmV3RG9jdW1lbnRCdWlsZGVyKCk7Ci0JCQlEb2N1bWVudCBkb2MgPSBidWlsZGVyLnBhcnNlKG5ldyBGaWxlKGxpYlBhdGgpKTsKLQkJCUVsZW1lbnQgcm9vdCA9IGRvYy5nZXREb2N1bWVudEVsZW1lbnQoKTsKLQkJCVN0cmluZyBuc1VSSSA9IHJvb3QuZ2V0QXR0cmlidXRlKCJ4bWxuczpjb20uaWJtLnVtYSIpOyAvLyROT04tTkxTLTEkCi0JCQlpZiAobnNVUkkgPT0gbnVsbCB8fCBuc1VSSS5lcXVhbHMoIiIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQluc1VSSSA9IHJvb3QuZ2V0QXR0cmlidXRlKCJ4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWlmIChuc1VSSSA9PSBudWxsIHx8IG5zVVJJLmVxdWFscygiIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCW5zVVJJID0gcm9vdC5nZXRBdHRyaWJ1dGUoInhtbG5zOnVtYSIpICsgIi91bWEuZWNvcmUiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCX0KLQkJCXJldHVybiBuc1VSSTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIGNvbnZlcnNpb25SZXF1aXJlZChTdHJpbmcgbGliUGF0aCkgewotCQlTdHJpbmcgY3VycmVudE5zVVJJID0gUGVyc2lzdGVuY2VVdGlsLmdldFVNQU5zVVJJKCk7Ci0JCVN0cmluZyBsaWJOc1VSSSA9IFBlcnNpc3RlbmNlVXRpbC5nZXRVTUFOc1VSSShsaWJQYXRoKTsKLQkJaWYgKGN1cnJlbnROc1VSSS5lcXVhbHMobGliTnNVUkkpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAoTWlncmF0b3IuT0xEX1VNQV9OU19VUkkuZXF1YWxzKGxpYk5zVVJJKSkKLQkJCXJldHVybiB0cnVlOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJUmVzb3VyY2UgZ2V0V29ya3NwYWNlUmVzb3VyY2UoT2JqZWN0IG9iaikgewotCQlSZXNvdXJjZSByZXNvdXJjZSA9IG51bGw7Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBEZXNjcmliYWJsZUVsZW1lbnQpIHsKLQkJCURlc2NyaWJhYmxlRWxlbWVudCBlID0gKERlc2NyaWJhYmxlRWxlbWVudCkgb2JqOwotCQkJQ29udGVudERlc2NyaXB0aW9uIGNvbnRlbnQgPSBlLmdldFByZXNlbnRhdGlvbigpOwotCQkJcmVzb3VyY2UgPSBjb250ZW50LmVSZXNvdXJjZSgpOwotCQkJaWYgKHJlc291cmNlID09IG51bGwpIHsKLQkJCQlyZXNvdXJjZSA9IGUuZVJlc291cmNlKCk7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgRU9iamVjdCkgewotCQkJcmVzb3VyY2UgPSAoKEVPYmplY3QpIG9iaikuZVJlc291cmNlKCk7Ci0JCX0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgUmVzb3VyY2UpIHsKLQkJCXJlc291cmNlID0gKFJlc291cmNlKSBvYmo7Ci0JCX0KLQkJaWYgKHJlc291cmNlICE9IG51bGwgJiYgcmVzb3VyY2UuZ2V0VVJJKCkuaXNGaWxlKCkpIHsKLQkJCXJldHVybiBGaWxlTWFuYWdlci5nZXRSZXNvdXJjZUZvckxvY2F0aW9uKHJlc291cmNlLmdldFVSSSgpCi0JCQkJCS50b0ZpbGVTdHJpbmcoKSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDb2xsZWN0aW9uPEVPYmplY3Q+IGdldFByb3hpZXMoRU9iamVjdCBvYmopIHsKLQkJQ29sbGVjdGlvbjxFT2JqZWN0PiBwcm94aWVzID0gbmV3IEFycmF5TGlzdDxFT2JqZWN0PigpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBvYmouZUFsbENvbnRlbnRzKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJRU9iamVjdCBvID0gKEVPYmplY3QpIGl0ZXIubmV4dCgpOwotCQkJaWYgKG8uZUlzUHJveHkoKSkgewotCQkJCXByb3hpZXMuYWRkKG8pOwotCQkJfQotCQl9Ci0JCXJldHVybiBwcm94aWVzOwotCX0KLQotCS8qKgotCSAqIENoZWNrcyB0aGUgcHJpbWFyeSB0b29sIHZlcnNpb24gc3RvcmVkIGluIHRoZSBnaXZlbiByZXNvdXJjZQotCSAqIAotCSAqIEBwYXJhbSByZXNvdXJjZQotCSAqIEByZXR1cm4gPGxpPiA8IDAgaWYgdGhlIHZlcnNpb24gb2YgdGhlIHByaW1hcnkgdG9vbCBzdG9yZWQgaW4gdGhlIGdpdmVuIHJlc291cmNlIGlzIG1pc3Npbmcgb3Igb2xkZXIgdGhhbiBjdXJyZW50Ci0JICogICAgICAgICA8bGk+IDAgaWYgdGhlIHByaW1hcnkgdG9vbCB2ZXJzaW9uIGluIHRoZSBnaXZlbiByZXNvdXJjZSBtYXRjaGVzIHRoZSBjdXJyZW50IHZlcnNpb24KLQkgKiAgICAgICAgIDxsaT4gPiAwIGlmICB0aGUgcHJpbWFyeSB0b29sIHZlcnNpb24gaW4gdGhlIGdpdmVuIHJlc291cmNlIGlzIG5ld2VyIHRoYW4gdGhlIGN1cnJlbnQgdmVyc2lvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGNoZWNrVG9vbFZlcnNpb24oUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJRmlsZSBmaWxlID0gbmV3IEZpbGUocmVzb3VyY2UuZ2V0VVJJKCkudG9GaWxlU3RyaW5nKCkpOwotCQlNYXAgZmlsZVZlcnNpb25NYXAgPSBWZXJzaW9uVXRpbC5yZWFkVmVyc2lvbnNGcm9tRmlsZShmaWxlKTsKLQkJaWYoZmlsZVZlcnNpb25NYXAgIT0gbnVsbCkgewotCQkJU3RyaW5nIHZlcnNpb24gPSAoU3RyaW5nKSBmaWxlVmVyc2lvbk1hcC5nZXQoVmVyc2lvblV0aWwuZ2V0UHJpbWFyeVRvb2xJRCgpKTsKLQkJCWlmKHZlcnNpb24gIT0gbnVsbCkgewotCQkJCUVQRlZlcnNpb25zIHZlcnNpb25zID0gVmVyc2lvblV0aWwuZ2V0VmVyc2lvbnMoVmVyc2lvblV0aWwuZ2V0UHJpbWFyeVRvb2xJRCgpKTsKLQkJCQlyZXR1cm4gdmVyc2lvbnMuZ2V0Q3VycmVudFZlcnNpb24oKS5jb21wYXJlVG9vbFZlcnNpb25UbyhuZXcgVmVyc2lvbih2ZXJzaW9uKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIC0xOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGZpcnN0IG1ldGhvZCBlbGVtZW50IGluIGNvbnRlbnRzIG9mIHRoZSBnaXZlbiByZXNvdXJjZS4KLQkgKiAgCi0JICogQHBhcmFtIHJlc291cmNlCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTWV0aG9kRWxlbWVudCBnZXRNZXRob2RFbGVtZW50KFJlc291cmNlIHJlc291cmNlKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHJlc291cmNlLmdldENvbnRlbnRzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZWxlbWVudCA9IGl0ZXIubmV4dCgpOwotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQkJcmV0dXJuIChNZXRob2RFbGVtZW50KSBlbGVtZW50OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKioKLQkgKiBSZXNvbHZlcyB0aGUgcHJveHkgYW5kIGl0cyBjb250YWluZXJzCi0JICogCi0JICogQHBhcmFtIHByb3h5Ci0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgRU9iamVjdCByZXNvbHZlKEVPYmplY3QgcHJveHksIFJlc291cmNlU2V0IHJlc291cmNlU2V0KSB7Ci0JCUVPYmplY3QgcmVzb2x2ZWQ7Ci0JCXRyeSB7Ci0JCQlyZXNvbHZlZCA9IEVjb3JlVXRpbC5yZXNvbHZlKHByb3h5LCByZXNvdXJjZVNldCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXNvbHZlZCA9IHByb3h5OwotCQl9Ci0JCUVPYmplY3QgY29udGFpbmVyID0gcHJveHkuZUNvbnRhaW5lcigpOwotCQlpZiAocmVzb2x2ZWQuZUNvbnRhaW5lcigpID09IG51bGwgJiYgY29udGFpbmVyICE9IG51bGwpIHsKLQkJCWlmIChjb250YWluZXIuZUlzUHJveHkoKSkgewotCQkJCWNvbnRhaW5lciA9IHJlc29sdmUoY29udGFpbmVyLCByZXNvdXJjZVNldCk7Ci0JCQl9Ci0JCQlFUmVmZXJlbmNlIHJlZiA9IHByb3h5LmVDb250YWlubWVudEZlYXR1cmUoKTsKLQkJCWlmIChyZWYuaXNNYW55KCkpIHsKLQkJCQlMaXN0IHZhbHVlcyA9IChMaXN0KSBjb250YWluZXIuZUdldChyZWYpOwotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHZhbHVlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTsgaXRlcgotCQkJCQkJLm5leHQoKSkKLQkJCQkJOwotCQkJfSBlbHNlIHsKLQkJCQljb250YWluZXIuZUdldChyZWYpOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXNvbHZlZDsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBSZXNvdXJjZSBnZXRSZXNvdXJjZShJUGF0aCBwYXRoLCBSZXNvdXJjZVNldCByZXNvdXJjZVNldCkgewotCQlyZXR1cm4gZ2V0UmVzb3VyY2UocGF0aC50b09TU3RyaW5nKCksIHJlc291cmNlU2V0KTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBSZXNvdXJjZSBnZXRSZXNvdXJjZShTdHJpbmcgcGF0aCwgUmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQpIHsKLQkJVVJJIHVyaSA9IFVSSS5jcmVhdGVGaWxlVVJJKHBhdGgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBuZXcgQXJyYXlMaXN0PFJlc291cmNlPihyZXNvdXJjZVNldC5nZXRSZXNvdXJjZXMoKSkKLQkJCQkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlSZXNvdXJjZSByZXNvdXJjZSA9IChSZXNvdXJjZSkgaXRlci5uZXh0KCk7Ci0JCQlpZiAodXJpLmVxdWFscyhNdWx0aUZpbGVTYXZlVXRpbC5nZXRGaW5hbFVSSShyZXNvdXJjZSkpKSB7Ci0JCQkJcmV0dXJuIHJlc291cmNlOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCi0JfQotCQotCS8qKgotCSAqIFJlc29sdmVzIGNvbnRhaW5lciBvZiB0aGUgTWV0aG9kRWxlbWVudCBpbiB0aGUgZ2l2ZW4gcmVzb3VyY2UuCi0JICogCi0JICogQHBhcmFtIHJlc291cmNlCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlc29sdmVDb250YWluZXIoUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJUmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQgPSByZXNvdXJjZS5nZXRSZXNvdXJjZVNldCgpOwotCQlpZihyZXNvdXJjZVNldCBpbnN0YW5jZW9mIE11bHRpRmlsZVJlc291cmNlU2V0SW1wbCkgewotCQkJKChNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwpcmVzb3VyY2VTZXQpLnJlc29sdmVDb250YWluZXIocmVzb3VyY2UpOwotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyBNZXRob2RFbGVtZW50IGdldE1ldGhvZEVsZW1lbnQoSVJlc291cmNlIGlSZXNvdXJjZSwgUmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQpIHsKLQkJTWV0aG9kRWxlbWVudCBlbGVtZW50ID0gbnVsbDsKLQkJVVJJIHVyaSA9IFVSSS5jcmVhdGVGaWxlVVJJKGlSZXNvdXJjZS5nZXRMb2NhdGlvbigpLnRvT1NTdHJpbmcoKSk7Ci0JCVJlc291cmNlIHJlc291cmNlID0gcmVzb3VyY2VTZXQuZ2V0UmVzb3VyY2UodXJpLCB0cnVlKTsJCQotCQlpZiAocmVzb3VyY2UgIT0gbnVsbCkgeyAKLQkJCWlmKHJlc291cmNlU2V0IGluc3RhbmNlb2YgTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsKSB7Ci0JCQkJKChNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwpcmVzb3VyY2VTZXQpLnJlc29sdmVDb250YWluZXIocmVzb3VyY2UpOwotCQkJfQotCQkJZWxlbWVudCA9IFBlcnNpc3RlbmNlVXRpbC5nZXRNZXRob2RFbGVtZW50KHJlc291cmNlKTsKLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgQ29udGVudERlc2NyaXB0aW9uKSB7Ci0JCQkJRU9iamVjdCBjb250YWluZXIgPSAoKENvbnRlbnREZXNjcmlwdGlvbillbGVtZW50KS5lQ29udGFpbmVyKCk7Ci0JCQkJaWYgKGNvbnRhaW5lciBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCQkJZWxlbWVudCA9IChNZXRob2RFbGVtZW50KWNvbnRhaW5lcjsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVsZW1lbnQ7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2FkQWxsTGlicmFyeVJlc291cmNlcyhNZXRob2RMaWJyYXJ5IGxpYikgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBsaWIuZUFsbENvbnRlbnRzKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJRU9iamVjdCBlbGVtZW50ID0gKEVPYmplY3QpIGl0ZXIubmV4dCgpOwotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQkJdHJ5IHsKLQkJCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGVsZW1lbnQuZUNyb3NzUmVmZXJlbmNlcygpCi0JCQkJCQkJLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCQkJCWl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJfQotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCUNvbW1vblBsdWdpbi5JTlNUQU5DRS5sb2coZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFRvcEF0dHJpYnV0ZShGaWxlIGZpbGUsIGZpbmFsIFN0cmluZyBhdHRyaWJ1dGVOYW1lKSB7Ci0JCS8vIENyZWF0ZSB0aGUgU0FYIHBhcnNlciBmYWN0b3J5LgotCQlTQVhQYXJzZXJGYWN0b3J5IHNwZiA9IFNBWFBhcnNlckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLQotCQkvLyBDcmVhdGUgdGhlIFNBWCBwYXJzZXIuCi0JCXRyeSB7Ci0JCQlTQVhQYXJzZXIgc2F4UGFyc2VyID0gc3BmLm5ld1NBWFBhcnNlcigpOwotCQkJZmluYWwgU3RyaW5nW10gdmFsdWVIb2xkZXIgPSBuZXcgU3RyaW5nWzFdOwotCQkJdHJ5IHsKLQkJCXNheFBhcnNlci5wYXJzZShmaWxlLCBuZXcgRGVmYXVsdEhhbmRsZXIoKSB7CQotCQkJCXByaXZhdGUgYm9vbGVhbiBzdGFydGVkOwotCQkJCUBPdmVycmlkZQotCQkJCXB1YmxpYyB2b2lkIHN0YXJ0RWxlbWVudChTdHJpbmcgdXJpLCBTdHJpbmcgbG9jYWxOYW1lLCBTdHJpbmcgcU5hbWUsIEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0JCQkJCWlmKHN0YXJ0ZWQpIHsKLQkJCQkJCXRocm93IG5ldyBPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbigpOwotCQkJCQl9Ci0vLwkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJ1cmk6ICIgKyB1cmkpOwotLy8JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigibG9jYWxOYW1lOiAiICsgbG9jYWxOYW1lKTsKLS8vCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oInFOYW1lOiAiICsgcU5hbWUpOwotCQkJCQl2YWx1ZUhvbGRlclswXSA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoYXR0cmlidXRlTmFtZSk7Ci0JCQkJCXN0YXJ0ZWQgPSB0cnVlOwotCQkJCX0KLQkJCX0pOwotCQkJfQotCQkJY2F0Y2goT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24gZSkgewotCQkJCS8vCi0JCQl9Ci0JCQlyZXR1cm4gdmFsdWVIb2xkZXJbMF07Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlQZXJzaXN0ZW5jZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgdW5sb2FkKENvbGxlY3Rpb248UmVzb3VyY2U+IHJlbW92ZWRSZXNvdXJjZXMpIHsKLQkJTWFwPE11bHRpRmlsZVJlc291cmNlU2V0SW1wbCwgQ29sbGVjdGlvbjxSZXNvdXJjZT4+IHJlc291cmNlU2V0VG9VbmxvYWRlZFJlc291cmNlc01hcCA9IG5ldyBIYXNoTWFwPE11bHRpRmlsZVJlc291cmNlU2V0SW1wbCwgQ29sbGVjdGlvbjxSZXNvdXJjZT4+KCk7Ci0JCWZvciAoUmVzb3VyY2UgcmVzb3VyY2UgOiByZW1vdmVkUmVzb3VyY2VzKSB7Ci0JCQlSZXNvdXJjZVNldCByZXNvdXJjZVNldCA9IHJlc291cmNlLmdldFJlc291cmNlU2V0KCk7Ci0JCQlib29sZWFuIHVubG9hZGVkID0gZmFsc2U7Ci0JCQl0cnkgewotCQkJCWlmKHJlc291cmNlU2V0IGluc3RhbmNlb2YgSUxpYnJhcnlSZXNvdXJjZVNldCkgewotCQkJCQlpZigoKElMaWJyYXJ5UmVzb3VyY2VTZXQpcmVzb3VyY2VTZXQpLnVubG9hZChyZXNvdXJjZSwgQ29sbGVjdGlvbnMuRU1QVFlfTUFQKSkgewotCQkJCQkJcmVzb3VyY2VTZXQuZ2V0UmVzb3VyY2VzKCkucmVtb3ZlKHJlc291cmNlKTsKLQkJCQkJCXVubG9hZGVkID0gdHJ1ZTsKLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJaWYocmVzb3VyY2UuaXNMb2FkZWQoKSkgewotCQkJCQkJcmVzb3VyY2UudW5sb2FkKCk7Ci0JCQkJCQl1bmxvYWRlZCA9IHRydWU7Ci0JCQkJCX0KLQkJCQkJaWYocmVzb3VyY2VTZXQgIT0gbnVsbCkgewotCQkJCQkJcmVzb3VyY2VTZXQuZ2V0UmVzb3VyY2VzKCkucmVtb3ZlKHJlc291cmNlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJUGVyc2lzdGVuY2VQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJfQkKLQkJCWlmKHVubG9hZGVkICYmIHJlc291cmNlU2V0IGluc3RhbmNlb2YgTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsKSB7Ci0JCQkJQ29sbGVjdGlvbjxSZXNvdXJjZT4gdW5sb2FkZWRSZXNvdXJjZXMgPSByZXNvdXJjZVNldFRvVW5sb2FkZWRSZXNvdXJjZXNNYXAuZ2V0KHJlc291cmNlU2V0KTsKLQkJCQlpZih1bmxvYWRlZFJlc291cmNlcyA9PSBudWxsKSB7Ci0JCQkJCXVubG9hZGVkUmVzb3VyY2VzID0gbmV3IEFycmF5TGlzdDxSZXNvdXJjZT4oKTsKLQkJCQkJcmVzb3VyY2VTZXRUb1VubG9hZGVkUmVzb3VyY2VzTWFwLnB1dCgoTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsKSByZXNvdXJjZVNldCwgdW5sb2FkZWRSZXNvdXJjZXMpOwotCQkJCX0KLQkJCQl1bmxvYWRlZFJlc291cmNlcy5hZGQocmVzb3VyY2UpOwotCQkJfQotCQl9Ci0JCWZvciAoTWFwLkVudHJ5PE11bHRpRmlsZVJlc291cmNlU2V0SW1wbCwgQ29sbGVjdGlvbjxSZXNvdXJjZT4+IGVudHJ5IDogcmVzb3VyY2VTZXRUb1VubG9hZGVkUmVzb3VyY2VzTWFwLmVudHJ5U2V0KCkpIHsKLQkJCWVudHJ5LmdldEtleSgpLm5vdGlmeVJlZnJlc2hMaXN0ZW5lcnMobmV3IFJlZnJlc2hFdmVudChlbnRyeS5nZXRWYWx1ZSgpKSk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQ2hlY2tzIGlmIHRoZSBnaXZlbiBtZXRob2QgZWxlbWVudCBoYXMgYSBHVUlEIHRoYXQgaXMgdGhlIHNhbWUgYXMgR1VJRCBvZgotCSAqIG9uZSBlbGVtZW50IGluIHRoZSBnaXZlbiBlbGVtZW50cyBsaXN0LgotCSAqIAotCSAqIEBwYXJhbSBlCi0JICogQHBhcmFtIGVsZW1lbnRzCi0JICogQHJldHVybiB0cnVlIGlmIHRoZSBnaXZlbiBtZXRob2QgZWxlbWVudCBoYXMgZHVwbGljYXRlIEdVSUQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaGFzRHVwbGljYXRlR1VJRChNZXRob2RFbGVtZW50IGUsIENvbGxlY3Rpb248PyBleHRlbmRzIE1ldGhvZEVsZW1lbnQ+IGVsZW1lbnRzKSB7Ci0JCWZvciAoTWV0aG9kRWxlbWVudCBlbGVtZW50IDogZWxlbWVudHMpIHsKLQkJCWlmKGUuZ2V0R3VpZCgpLmVxdWFscyhlbGVtZW50LmdldEd1aWQoKSkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIFN0cmluZyB0b1ByZWZpeChTdHJpbmcgcGF0aCkgewotCQlyZXR1cm4gcGF0aC5lbmRzV2l0aChGaWxlLnNlcGFyYXRvcikgPyBwYXRoIDogcGF0aCArIEZpbGUuc2VwYXJhdG9yOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVwbGFjZVVSSVByZWZpeChDb2xsZWN0aW9uPFJlc291cmNlPiByZXNvdXJjZXMsIFN0cmluZyBvbGRQcmVmaXgsIFN0cmluZyBuZXdQcmVmaXgpIHsKLQkJVVJJIG9sZFByZWZpeFVSSSA9IFVSSS5jcmVhdGVGaWxlVVJJKHRvUHJlZml4KG9sZFByZWZpeCkpOwotCQlVUkkgbmV3UHJlZml4VVJJID0gVVJJLmNyZWF0ZUZpbGVVUkkodG9QcmVmaXgobmV3UHJlZml4KSk7Ci0JCWZvcihSZXNvdXJjZSByZXNvdXJjZSA6IHJlc291cmNlcykgewotCQkJVVJJIHVyaSA9IHJlc291cmNlLmdldFVSSSgpOwotCQkJVVJJIG5ld1VSSSA9IG51bGw7Ci0JCQl0cnkgewotCQkJCW5ld1VSSSA9IHVyaS5yZXBsYWNlUHJlZml4KG9sZFByZWZpeFVSSSwgbmV3UHJlZml4VVJJKTsKLQkJCX0KLQkJCWNhdGNoKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCi0JCQl9Ci0JCQlpZihuZXdVUkkgIT0gbnVsbCkgewotCQkJCXJlc291cmNlLnNldFVSSShuZXdVUkkpOwotCQkJfQotCQl9Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgVVJJIGdldFByb3h5VVJJKEVPYmplY3Qgb2JqZWN0KSB7Ci0JCVJlc291cmNlIHJlc291cmNlID0gb2JqZWN0LmVSZXNvdXJjZSgpOwotCQlVUkkgdXJpID0gbnVsbDsKLQkJaWYocmVzb3VyY2UgaW5zdGFuY2VvZiBJTGlicmFyeVJlc291cmNlKSB7Ci0JCQlJTGlicmFyeVJlc291cmNlIGxpYlJlc291cmNlID0gKElMaWJyYXJ5UmVzb3VyY2UpIHJlc291cmNlOwotCQkJdXJpID0gbGliUmVzb3VyY2UuZ2V0UHJveHlVUkkob2JqZWN0KTsJCQkKLQkJfQotCQllbHNlIHsKLQkJCXVyaSA9IHJlc291cmNlLmdldFVSSSgpLmFwcGVuZEZyYWdtZW50KHJlc291cmNlLmdldFVSSUZyYWdtZW50KG9iamVjdCkpOwotCQl9Ci0JCXJldHVybiB1cmk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsIGdldEltcG9ydFBsdWdpblJlc291cmNlU2V0KCkgewotCQlNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwgcmVzb3VyY2VTZXQ7Ci0JCXJlc291cmNlU2V0ID0gbmV3IE11bHRpRmlsZVJlc291cmNlU2V0SW1wbChmYWxzZSkgewotCQkJcHJvdGVjdGVkIHZvaWQgZGVtYW5kTG9hZChSZXNvdXJjZSByZXNvdXJjZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJCQlpZiAoISBza2lwRGVtYW5kTG9hZChyZXNvdXJjZSkpIHsKLQkJCQkJc3VwZXIuZGVtYW5kTG9hZChyZXNvdXJjZSk7Ci0JCQkJfQotCQkJfQotCQkJcHJpdmF0ZSBib29sZWFuIHNraXBEZW1hbmRMb2FkKFJlc291cmNlIHJlcykgewotCQkJCUZpbGUgZmlsZSA9IG5ldyBGaWxlKHJlcy5nZXRVUkkoKS50b0ZpbGVTdHJpbmcoKSk7Ci0JCQkJaWYgKCEgZmlsZS5leGlzdHMoKSAmJiBmaWxlLmdldE5hbWUoKS5lcXVhbHMoTXVsdGlGaWxlU2F2ZVV0aWwuREVGQVVMVF9QTFVHSU5fTU9ERUxfRklMRU5BTUUpKSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX07Ci0JCXJldHVybiByZXNvdXJjZVNldDsKLQl9Ci0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JCVN0cmluZyBhdHRyaWIgPSBnZXRUb3BBdHRyaWJ1dGUobmV3IEZpbGUoYXJnc1swXSksIGFyZ3NbMV0pOwotCQlTeXN0ZW0ub3V0LnByaW50bG4oYXR0cmliKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS91dGlsL1Jlc291cmNlcy5wcm9wZXJ0aWVzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS91dGlsL1Jlc291cmNlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OTAzZTBlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvdXRpbC9SZXNvdXJjZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSCi0KLSMgRXJyb3IgTWVzc2FnZXMKLWludmFsaWROYW1lRXJyb3JfbXNnPVRoZSBuYW1lICcnezB9JycgaXMgaW52YWxpZC4gQSBtZXRob2QgZWxlbWVudCBuYW1lIGNhbm5vdCBjb250YWluIHRoZXNlIGNoYXJhY3RlcnM6IFxcIC8gOiAqID8gIiA8ID4gfAotb2JqTm90Rm91bmRFcnJvcl9tc2c9Q291bGQgbm90IGZpbmQgb2JqZWN0IHdpdGggaWQgJyd7MH0nJwotbG9hZExpYnJhcnlFcnJvcl9tc2c9RXJyb3JzIGVuY291bnRlcmVkIHdoaWxlIGxvYWRpbmcgbWV0aG9kIGxpYnJhcnk6Ci1sb2FkTGlicmFyeUVycm9yX2RldGFpbHM9XCBcIGxpbmU6IHswfSwgY29sdW1uOiB7MX0sIG1zZzogezJ9Ci1yZXN0b3JlUmVzb3VyY2VFcnJvcl9tc2c9Q291bGQgbm90IHJlc3RvcmUgcmVzb3VyY2UgJyd7MH0nJwotRmlsZU1hbmFnZXJfZmlsZVJlYWRPbmx5PUZpbGUgJyd7MH0nJyBpcyByZWFkLW9ubHkKLUVyck1zZ19Db3VsZE5vdERlbGV0ZT1Db3VsZCBub3QgZGVsZXRlIHswfS4gezF9Ci1yZW5hbWVFcnJvcl9tc2c9Q291bGQgbm90IHJlbmFtZSAnJ3swfScnIHRvICcnezF9JycKLWJhY2t1cEVycm9yX21zZz1Db3VsZCBub3QgYmFja3VwIHVwIHJlc291cmNlICcnezB9JycKLW1hcmtlcl9lcnJfY2Fubm90UmVzb2x2ZVByb3h5PUNvdWxkIG5vdCByZXNvbHZlIHByb3h5IHswfQotbW9kaWZ5RmlsZUVycm9yX21zZz1DYW5ub3QgbW9kaWZ5IGZpbGUgJyd7MH0nJwotZmlsZVBhdGhOYW1lVG9vTG9uZ19tc2c9Q2Fubm90IHNhdmUgcmVzb3VyY2UuIEZpbGUgcGF0aCBuYW1lIHRvbyBsb25nIChleGNlZWRpbmcgMjU1KSAnJ3swfScnCi1sb2FkUmVzb3VyY2VFcnJvcl9tc2c9Q291bGQgbm90IGxvYWQgcmVzb3VyY2UgJyd7MH0nJwotbG9hZFJlc291cmNlRXJyb3JXaXRoUmVhc29uX21zZz1Db3VsZCBub3QgbG9hZCByZXNvdXJjZSAnJ3swfScnLiBSZWFzb246IHsxfQotaW52YWxpZExpYnJhcnlGaWxlRXJyb3JfbXNnPUludmFsaWQgbWV0aG9kIGxpYnJhcnkgZmlsZToKLWZpbGVOb3RGb3VuZEVycm9yX21zZz1Db3VsZCBub3QgbG9jYXRlIGFueSBtZXRob2QgbGlicmFyeSBmaWxlIGluIHdvcmtzcGFjZSAnJ3swfScnCi1ub3JtYWxpemVVUklFcnJvcl9tc2c9Q291bGQgbm90IGZpbmQgdGhlIG5vcm1hbGl6ZWQgVVJJIGZvciAnJ3swfScnCi1tb3ZlRXJyb3JfbXNnPUNvdWxkIG5vdCBtb3ZlICcnezB9JycgdG8gJyd7MX0nJy4gVGhlIGRlc3RpbmF0aW9uIGFscmVhZHkgZXhpc3RzLgotbW9kaWZ5UmVhZE9ubHlGaWxlRXJyb3JfbXNnPUNhbm5vdCBtb2RpZnkgcmVhZC1vbmx5IGZpbGUocyk6IHswfQotbW92ZVJlc291cmNlRXJyb3JfbXNnPVJlc291cmNlICcnezB9JycgaXMgaW52b2x2ZWQgaW4gYSBwZXJzaXN0ZW5jZSBvcGVyYXRpb24gdGhhdCBoYXMgbm90IGJlZW4gY29tbWl0dGVkLgotbW9kaWZ5RmlsZXNFcnJvcl9tc2c9Q291bGQgbm90IG1vZGlmeSBvbmUgb3IgbW9yZSBmaWxlcwotcmVzb3VyY2VPdXRPZlN5bmNoX21zZz1SZXNvdXJjZSBpcyBvdXQgb2Ygc3luY2ggYW5kIG5lZWRzIHRvIGJlIHJlbG9hZGVkOiB7MH0KLXJlc291cmNlQXV0b1JlZnJlc2hKb2JfbmFtZT1SZXNvdXJjZSBBdXRvLVJlZnJlc2gKLWxvYWRDb25maWd1cmF0aW9uX2NvdWxkTm90TG9hZF9sb2dNc2c9Q291bGQgbm90IGxvYWQgZmlsZTogezB9LiBUaGUgbWV0aG9kIGNvbmZpZ3VyYXRpb24gaW4gdGhpcyBmaWxlIGhhcyBkdXBsaWNhdGUgR1VJRC4KLWxvYWRDb25maWd1cmF0aW9uX25vdENvbmZpZ0ZpbGVfbG9nTXNnPU5vdCBhIG1ldGhvZCBjb25maWd1cmF0aW9uIGZpbGU6IHswfQotCi0jIFByb2dyZXNzIE1lc3NhZ2VzCi1sb2FkTGlicmFyeVRhc2tfbmFtZT1Mb2FkaW5nIG1ldGhvZCBsaWJyYXJ5Li4uCi1tb3ZlRGF0YVRhc2tfbmFtZT1Nb3ZpbmcgdGhlIGRhdGEuLi4KLXNhdmVMaWJyYXJ5VGFza19uYW1lPVNhdmluZyBtZXRob2QgbGlicmFyeS4uLgotbG9hZFJlc291cmNlc1Rhc2tfbmFtZT1Mb2FkaW5nIGFsbCByZXNvdXJjZXMgaW50byBtZW1vcnkuLi4KLW1pZ3JhdGluZ0RpYWdyYW1fbmFtZT1NaWdyYXRpbmcgZGlhZ3JhbXMuLi4KLW1pZ3JhdGVDb250ZW50RGVzY3JpcHRpb25zVGFza19uYW1lPU1pZ3JhdGluZyBwcm9jZXNzIGNvbnRlbnQgZGVzY3JpcHRpb25zLi4uCi1maXhQcmVzZW50YXRpb25OYW1lVGFza19uYW1lPUZpeGluZyBlbXB0eSBwcmVzZW50YXRpb24gbmFtZXMuLi4KLVVucmVzb2x2ZWRQcm94eU1hcmtlck1hbmFnZXJfY291bGROb3RSZXNvbHZlUHJveHk9Q291bGQgbm90IHJlc29sdmUgcHJveHkgJyd7MH0nJwotcmVmcmVzaExpYnJhcnlGaWxlc1Rhc2tfbmFtZT1SZWZyZXNoaW5nIGxpYnJhcnkgZmlsZXMgaW4gd29ya3NwYWNlCi1jYW5ub3RfY3JlYXRlX2Rpcl9tc2c9Q2Fubm90IGNyZWF0ZSBkaXJlY3RvcnkgJyd7MH0nJy4KLXVucmVzb2x2ZWRQcm94eUxvZ2dlckpvYl9uYW1lPVVucmVzb2x2ZWQgUHJveHkgTG9nZ2VyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL3V0aWwvVW5yZXNvbHZlZFByb3h5TWFya2VyTWFuYWdlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS91dGlsL1VucmVzb2x2ZWRQcm94eU1hcmtlck1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmRmZDViMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL3V0aWwvVW5yZXNvbHZlZFByb3h5TWFya2VyTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTU1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmEudXRpbC5yZWdleC5NYXRjaGVyOwotaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5maWxlYnVmZmVycy5GaWxlQnVmZmVyczsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmZpbGVidWZmZXJzLklUZXh0RmlsZUJ1ZmZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmZpbGVidWZmZXJzLklUZXh0RmlsZUJ1ZmZlck1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5maWxlYnVmZmVycy5Mb2NhdGlvbktpbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuV29ya3NwYWNlSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLkNvbW1vblBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VbmlxdWVFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5FeHRlbnNpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5JTWFya2VyQXR0cmlidXRlQ29udHJpYnV0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLkZpbGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5NdWx0aUZpbGVSZXNvdXJjZVNldEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLk11bHRpRmlsZVNhdmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLklQcm94eVJlc29sdXRpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLlJlc29sdmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi0KLS8qKgotICogQmFja2dyb3VuZCBqb2IgdGhhdCBtYW5hZ2UgbWFya2VycyBmb3IgdW5yZXNvbHZlZCBwcm94aWVzCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBVbnJlc29sdmVkUHJveHlNYXJrZXJNYW5hZ2VyIGV4dGVuZHMgV29ya3NwYWNlSm9iIGltcGxlbWVudHMgSVByb3h5UmVzb2x1dGlvbkxpc3RlbmVyIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgREVMQVkgPSAwOwotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1BUktFUl9JRCA9IFBlcnNpc3RlbmNlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJZCgpICsgIi51bnJlc29sdmVkUHJveHlNYXJrZXIiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPWFlfVVJJID0gInByb3h5VVJJIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9XTkVSX0dVSUQgPSAib3duZXJHVUlEIjsgLy8kTk9OLU5MUy0xJAotCQotCXByaXZhdGUgc3RhdGljIGNsYXNzIFZhbGlkT2JqZWN0IHsKLQkJYm9vbGVhbiB2YWxpZDsKLQkJT2JqZWN0IG9iamVjdDsKLQkJCi0JCS8qKgotCQkgKiBAcGFyYW0gdmFsaWQKLQkJICogQHBhcmFtIG9iamVjdAotCQkgKi8KLQkJcHVibGljIFZhbGlkT2JqZWN0KE9iamVjdCBvYmplY3QpIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLm9iamVjdCA9IG9iamVjdDsKLQkJCXZhbGlkID0gdHJ1ZTsJCQkKLQkJfQotCQkJCQotCX0KLQkKLQlwcml2YXRlIE1hcCB1cmlUb0V4Y2VwdGlvbnNNYXA7Ci0JcHJpdmF0ZSBMaXN0IGV4Y2VwdGlvbnM7Ci0JcHJpdmF0ZSBNYXAgcmVzb3VyY2VHVUlUb01hcmtlcnNNYXA7Ci0JcHJpdmF0ZSBNYXAgZWxlbWVudEdVSVRvTWFya2Vyc01hcDsKLQlwcml2YXRlIFJlc291cmNlU2V0IHJlc291cmNlU2V0OwotCXByaXZhdGUgYm9vbGVhbiBlbmFibGVkID0gdHJ1ZTsKLQlwcml2YXRlIExpc3QgcmVzb3VyY2VzVG9WYWxpZGF0ZU1hcmtlcnM7Ci0JcHJpdmF0ZSBib29sZWFuIGF1dG9TY2hlZHVsZWQgPSB0cnVlOwotCi0JcHVibGljIFVucmVzb2x2ZWRQcm94eU1hcmtlck1hbmFnZXIoUmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQpIHsKLQkJc3VwZXIoUGVyc2lzdGVuY2VSZXNvdXJjZXMudW5yZXNvbHZlZFByb3h5TG9nZ2VySm9iX25hbWUpOwkJCi0JCXRoaXMucmVzb3VyY2VTZXQgPSByZXNvdXJjZVNldDsKLS8vCQl1bnJlc29sdmVkUmVzb3VyY2VHVUlEVG9NYXJrZXJzTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJdXJpVG9FeGNlcHRpb25zTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJZXhjZXB0aW9ucyA9IG5ldyBBcnJheUxpc3QoKTsgCi0JCXJlc291cmNlR1VJVG9NYXJrZXJzTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJZWxlbWVudEdVSVRvTWFya2Vyc01hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCXJlc291cmNlc1RvVmFsaWRhdGVNYXJrZXJzID0gbmV3IFVuaXF1ZUVMaXN0KCk7Ci0JfQotCi0JcHVibGljIElNYXJrZXIgZmluZE1hcmtlcihJRmlsZSBmaWxlLCBTdHJpbmcgcHJveHlVUkksIGludCBzdGFydCwgaW50IGVuZCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJTWFya2VyW10gbWFya2VycyA9IGZpbGUuZmluZE1hcmtlcnMoTUFSS0VSX0lELCBmYWxzZSwgSVJlc291cmNlLkRFUFRIX1pFUk8pOwotCQlyZXR1cm4gZmluZE1hcmtlcihtYXJrZXJzLCBwcm94eVVSSSwgc3RhcnQsIGVuZCk7Ci0JfQotCQotCXByaXZhdGUgSU1hcmtlciBmaW5kTWFya2VyKElNYXJrZXJbXSBtYXJrZXJzLCBTdHJpbmcgcHJveHlVUkksIGludCBzdGFydCwgaW50IGVuZCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlmb3IgKGludCBpID0gMDsgaSA8IG1hcmtlcnMubGVuZ3RoOyBpKyspIHsKLQkJCUlNYXJrZXIgbWFya2VyID0gbWFya2Vyc1tpXTsKLQkJCWlmKHByb3h5VVJJLmVxdWFscyhtYXJrZXIuZ2V0QXR0cmlidXRlKFBST1hZX1VSSSkpCi0JCQkJCSYmIG1hcmtlci5nZXRBdHRyaWJ1dGUoSU1hcmtlci5DSEFSX1NUQVJULCAtMSkgPT0gc3RhcnQKLQkJCQkJJiYgbWFya2VyLmdldEF0dHJpYnV0ZShJTWFya2VyLkNIQVJfRU5ELCAtMSkgPT0gZW5kKSAKLQkJCXsKLQkJCQlyZXR1cm4gbWFya2VyOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwcml2YXRlIElNYXJrZXIgZmluZE1hcmtlcihDb2xsZWN0aW9uPElNYXJrZXI+IG1hcmtlcnMsIGludCBzdGFydCwgaW50IGVuZCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlmb3IgKElNYXJrZXIgbWFya2VyIDogbWFya2VycykgewotCQkJaWYobWFya2VyLmdldEF0dHJpYnV0ZShJTWFya2VyLkNIQVJfU1RBUlQsIC0xKSA9PSBzdGFydAotCQkJCQkmJiBtYXJrZXIuZ2V0QXR0cmlidXRlKElNYXJrZXIuQ0hBUl9FTkQsIC0xKSA9PSBlbmQpIAotCQkJewotCQkJCXJldHVybiBtYXJrZXI7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0KLQlwcml2YXRlIGJvb2xlYW4gYWRkRXhjZXB0aW9uKFJlc29sdmVFeGNlcHRpb24gcmUpIHsKLQkJc3luY2hyb25pemVkKGV4Y2VwdGlvbnMpIHsKLQkJCVVSSSB1cmkgPSAoKEludGVybmFsRU9iamVjdClyZS5nZXRQcm94eSgpKS5lUHJveHlVUkkoKTsKLQkJCVNldCBleGNlcHRpb25zID0gKFNldCkgdXJpVG9FeGNlcHRpb25zTWFwLmdldCh1cmkpOwkJCi0JCQlpZihleGNlcHRpb25zID09IG51bGwpIHsKLQkJCQlleGNlcHRpb25zID0gbmV3IEhhc2hTZXQoKTsKLQkJCQl1cmlUb0V4Y2VwdGlvbnNNYXAucHV0KHVyaSwgZXhjZXB0aW9ucyk7Ci0JCQl9Ci0JCQlpZihleGNlcHRpb25zLmFkZChyZSkpIHsKLQkJCQl0aGlzLmV4Y2VwdGlvbnMuYWRkKHJlKTsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBEb2N1bWVudCBiYXNlZCBjaGFyYWN0ZXIgc2VxdWVuY2UuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgRG9jdW1lbnRDaGFyU2VxdWVuY2UgaW1wbGVtZW50cyBDaGFyU2VxdWVuY2UgewotCi0JCS8qKiBEb2N1bWVudCAqLwotCQlwcml2YXRlIElEb2N1bWVudCBmRG9jdW1lbnQ7Ci0KLQkJLyoqCi0JCSAqIEluaXRpYWxpemUgd2l0aCB0aGUgc2VxdWVuY2Ugb2YgY2hhcmFjdGVycyBpbiB0aGUgZ2l2ZW4KLQkJICogZG9jdW1lbnQuCi0JCSAqCi0JCSAqIEBwYXJhbSBkb2N1bWVudCB0aGUgZG9jdW1lbnQKLQkJICovCi0JCXB1YmxpYyBEb2N1bWVudENoYXJTZXF1ZW5jZShJRG9jdW1lbnQgZG9jdW1lbnQpIHsKLQkJCWZEb2N1bWVudD0gZG9jdW1lbnQ7Ci0JCX0KLQotCQkvKgotCQkgKiBAc2VlIGphdmEubGFuZy5DaGFyU2VxdWVuY2UjbGVuZ3RoKCkKLQkJICovCi0JCXB1YmxpYyBpbnQgbGVuZ3RoKCkgewotCQkJcmV0dXJuIGZEb2N1bWVudC5nZXRMZW5ndGgoKTsKLQkJfQotCi0JCS8qCi0JCSAqIEBzZWUgamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSNjaGFyQXQoaW50KQotCQkgKi8KLQkJcHVibGljIGNoYXIgY2hhckF0KGludCBpbmRleCkgewotCQkJdHJ5IHsKLQkJCQlyZXR1cm4gZkRvY3VtZW50LmdldENoYXIoaW5kZXgpOwotCQkJfSBjYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24geCkgewotCQkJCXRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKHguZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLQkJCX0KLQkJfQotCi0JCS8qCi0JCSAqIEBzZWUgamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSNzdWJTZXF1ZW5jZShpbnQsIGludCkKLQkJICovCi0JCXB1YmxpYyBDaGFyU2VxdWVuY2Ugc3ViU2VxdWVuY2UoaW50IHN0YXJ0LCBpbnQgZW5kKSB7Ci0JCQl0cnkgewotCQkJCXJldHVybiBmRG9jdW1lbnQuZ2V0KHN0YXJ0LCBlbmQgLSBzdGFydCk7Ci0JCQl9IGNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiB4KSB7Ci0JCQkJdGhyb3cgbmV3IEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oeC5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotCQkJfQotCQl9Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIGNsYXNzIE1hcmtlcnNBbmRMb2NhdGlvbnMgewotCQlDb2xsZWN0aW9uPElNYXJrZXI+IG1hcmtlcnM7Ci0JCUNvbGxlY3Rpb248aW50W10+IGxvY2F0aW9uczsJCQkJCi0JfQotCQotCXByaXZhdGUgdm9pZCB1cGRhdGVNYXJrZXIoSU1hcmtlcltdIG1hcmtlcnMsIFJlc291cmNlIHJlc291cmNlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJVVJJIGNvbnRhaW5lclVSSSA9IHJlc291cmNlLmdldFVSSSgpOwotCQlJV29ya3NwYWNlIHdvcmtzcGFjZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKTsKLQkJSVBhdGggcGF0aCA9IG5ldyBQYXRoKGNvbnRhaW5lclVSSS50b0ZpbGVTdHJpbmcoKSk7Ci0JCUlGaWxlIGZpbGUgPSB3b3Jrc3BhY2UuZ2V0Um9vdCgpLmdldEZpbGVGb3JMb2NhdGlvbihwYXRoKTsKLQkJaWYgKGZpbGUgIT0gbnVsbCkgewotCQkJU3RyaW5nIGxvY2F0aW9uID0gY29udGFpbmVyVVJJICE9IG51bGwgPyBjb250YWluZXJVUkkKLQkJCQkJLnRvRmlsZVN0cmluZygpIDogIiI7IC8vJE5PTi1OTFMtMSQKLQkJCQotCQkJdHJ5IHsKLQkJCQlmaWxlLnJlZnJlc2hMb2NhbChJUmVzb3VyY2UuREVQVEhfWkVSTywgbnVsbCk7Ci0JCQkJCi0JCQkJTWFwPFN0cmluZywgTWFya2Vyc0FuZExvY2F0aW9ucz4gcHJveHlVUklUb01hcmtlcnNBbmRMb2NhdGlvbnNNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE1hcmtlcnNBbmRMb2NhdGlvbnM+KCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtYXJrZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCUlNYXJrZXIgbWFya2VyID0gbWFya2Vyc1tpXTsKLQkJCQkJT2JqZWN0IHByb3h5VVJJID0gbWFya2VyLmdldEF0dHJpYnV0ZShQUk9YWV9VUkkpOwotCQkJCQlpZihwcm94eVVSSSAhPSBudWxsKSB7Ci0JCQkJCQlTdHJpbmcgcHJveHlVUklTdHIgPSBwcm94eVVSSS50b1N0cmluZygpOwotCQkJCQkJTWFya2Vyc0FuZExvY2F0aW9ucyBtYXJrZXJzQW5kTG9jYXRpb25zID0gcHJveHlVUklUb01hcmtlcnNBbmRMb2NhdGlvbnNNYXAuZ2V0KHByb3h5VVJJU3RyKTsKLQkJCQkJCWlmKG1hcmtlcnNBbmRMb2NhdGlvbnMgPT0gbnVsbCkgewotCQkJCQkJCW1hcmtlcnNBbmRMb2NhdGlvbnMgPSBuZXcgTWFya2Vyc0FuZExvY2F0aW9ucygpOwotCQkJCQkJCW1hcmtlcnNBbmRMb2NhdGlvbnMubWFya2VycyA9IG5ldyBIYXNoU2V0PElNYXJrZXI+KCk7Ci0JCQkJCQkJbWFya2Vyc0FuZExvY2F0aW9ucy5sb2NhdGlvbnMgPSBuZXcgSGFzaFNldDxpbnRbXT4oKTsKLQkJCQkJCQlwcm94eVVSSVRvTWFya2Vyc0FuZExvY2F0aW9uc01hcC5wdXQocHJveHlVUklTdHIsIG1hcmtlcnNBbmRMb2NhdGlvbnMpOwotCQkJCQkJfQotCQkJCQkJbWFya2Vyc0FuZExvY2F0aW9ucy5tYXJrZXJzLmFkZChtYXJrZXIpOwotCQkJCQl9Ci0JCQkJfQotCQkJCQotCQkJCS8vIGxvY2F0ZSB0aGUgdGV4dCBvZiB1bnJlc29sdmVkIFVSSSBpbiBmaWxlCi0JCQkJLy8KLQkJCQlJVGV4dEZpbGVCdWZmZXJNYW5hZ2VyIG1hbmFnZXI9IEZpbGVCdWZmZXJzLmdldFRleHRGaWxlQnVmZmVyTWFuYWdlcigpOwotCQkJCXRyeSB7Ci0JCQkJCW1hbmFnZXIuY29ubmVjdChwYXRoLCBMb2NhdGlvbktpbmQuTE9DQVRJT04sIG1vbml0b3IpOwotCQkJCQlJVGV4dEZpbGVCdWZmZXIgZmlsZUJ1ZmZlcj0gbWFuYWdlci5nZXRUZXh0RmlsZUJ1ZmZlcihwYXRoLCBMb2NhdGlvbktpbmQuTE9DQVRJT04pOwotCQkJCQlmaWxlQnVmZmVyLnJlcXVlc3RTeW5jaHJvbml6YXRpb25Db250ZXh0KCk7Ci0JCQkJCWZpbGVCdWZmZXIuZ2V0RG9jdW1lbnQoKTsKLQkJCQkJSURvY3VtZW50IGRvYyA9IGZpbGVCdWZmZXIuZ2V0RG9jdW1lbnQoKTsKLQkJCQkJaWYoZG9jICE9IG51bGwpIHsKLQkJCQkJCWZvciAoTWFwLkVudHJ5PFN0cmluZywgTWFya2Vyc0FuZExvY2F0aW9ucz4gZW50cnkgOiBwcm94eVVSSVRvTWFya2Vyc0FuZExvY2F0aW9uc01hcC5lbnRyeVNldCgpKSB7Ci0JCQkJCQkJU3RyaW5nIHByb3h5VVJJID0gZW50cnkuZ2V0S2V5KCk7Ci0JCQkJCQkJUGF0dGVybiBwYXR0ZXJuID0gUGF0dGVybkNvbnN0cnVjdG9yLmNyZWF0ZVBhdHRlcm4ocHJveHlVUkksIHRydWUsIGZhbHNlKTsKLQkJCQkJCQlNYXRjaGVyIG1hdGNoZXIgPSBwYXR0ZXJuLm1hdGNoZXIobmV3IERvY3VtZW50Q2hhclNlcXVlbmNlKGRvYykpOwotCQkJCQkJCXdoaWxlKG1hdGNoZXIuZmluZCgpKSB7Ci0JCQkJCQkJCWludCBzdGFydCA9IG1hdGNoZXIuc3RhcnQoKTsKLQkJCQkJCQkJaW50IGVuZCA9IG1hdGNoZXIuZW5kKCk7Ci0JCQkJCQkJCWlmKHN0YXJ0ICE9IGVuZCkgewotCQkJCQkJCQkJZW50cnkuZ2V0VmFsdWUoKS5sb2NhdGlvbnMuYWRkKG5ldyBpbnRbXSB7IHN0YXJ0LCBlbmQgfSk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJZmlsZUJ1ZmZlci5yZWxlYXNlU3luY2hyb25pemF0aW9uQ29udGV4dCgpOwotCQkJCX0KLQkJCQlmaW5hbGx5IHsKLQkJCQkJbWFuYWdlci5kaXNjb25uZWN0KHBhdGgsIExvY2F0aW9uS2luZC5MT0NBVElPTiwgbW9uaXRvcik7Ci0JCQkJfQotCQkJCQotCQkJCS8vIG1ha2Ugc3VyZSB0aGF0IHJlc29sdmVyIGlzIHN0aWxsIGluIHRoZSBvcGVuIGxpYnJhcnkgYnkgY2hlY2tpbmcgd2hldGhlciBpdHMgcmVzb3VyY2UKLQkJCQkvLyBzdGlsbCBiZWxvbmdzIHRvIGEgcmVzb3VyY2Ugc2V0Ci0JCQkJLy8KLQkJCQlpZihyZXNvdXJjZSAhPSBudWxsICYmIHJlc291cmNlLmdldFJlc291cmNlU2V0KCkgIT0gbnVsbCkgewotCQkJCQlmb3IgKE1hcmtlcnNBbmRMb2NhdGlvbnMgbWFya2Vyc0FuZExvY2F0aW9ucyA6IHByb3h5VVJJVG9NYXJrZXJzQW5kTG9jYXRpb25zTWFwLnZhbHVlcygpKSB7Ci0JCQkJCQlwcm9jZXNzX2VudHJ5OgotCQkJCQkJZm9yIChJdGVyYXRvcjxpbnRbXT4gaXRlcmF0b3IgPSBtYXJrZXJzQW5kTG9jYXRpb25zLmxvY2F0aW9ucy5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJaWYobWFya2Vyc0FuZExvY2F0aW9ucy5tYXJrZXJzLmlzRW1wdHkoKSkgewotCQkJCQkJCQlicmVhayBwcm9jZXNzX2VudHJ5OwotCQkJCQkJCX0KLQkJCQkJCQlpbnRbXSBsb2MgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCQkJaW50IHN0YXJ0ID0gbG9jWzBdOwotCQkJCQkJCWludCBlbmQgPSBsb2NbMV07Ci0JCQkJCQkJSU1hcmtlciBtYXJrZXIgPSBmaW5kTWFya2VyKG1hcmtlcnNBbmRMb2NhdGlvbnMubWFya2Vycywgc3RhcnQsIGVuZCk7Ci0JCQkJCQkJaWYobWFya2VyID09IG51bGwpIHsKLQkJCQkJCQkJSXRlcmF0b3I8SU1hcmtlcj4gaXRlciA9IG1hcmtlcnNBbmRMb2NhdGlvbnMubWFya2Vycy5pdGVyYXRvcigpOwotCQkJCQkJCQltYXJrZXIgPSBpdGVyLm5leHQoKTsKLQkJCQkJCQkJaXRlci5yZW1vdmUoKTsKLQkJCQkJCQkJbWFya2VyLnNldEF0dHJpYnV0ZShJTWFya2VyLkNIQVJfU1RBUlQsIHN0YXJ0KTsJCi0JCQkJCQkJCW1hcmtlci5zZXRBdHRyaWJ1dGUoSU1hcmtlci5DSEFSX0VORCwgZW5kKTsKLQkJCQkJCQl9Ci0JCQkJCQkJZWxzZSB7Ci0JCQkJCQkJCW1hcmtlcnNBbmRMb2NhdGlvbnMubWFya2Vycy5yZW1vdmUobWFya2VyKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQlpZighbWFya2Vyc0FuZExvY2F0aW9ucy5tYXJrZXJzLmlzRW1wdHkoKSkgewotCQkJCQkJCS8vIGludmFsaWQgbWFya2VycywgbXVzdCBiZSBkZWxldGVkCi0JCQkJCQkJLy8KLQkJCQkJCQlmb3IgKElNYXJrZXIgbWFya2VyIDogbWFya2Vyc0FuZExvY2F0aW9ucy5tYXJrZXJzKSB7Ci0JCQkJCQkJCWlmKG1hcmtlci5leGlzdHMoKSkgewotCQkJCQkJCQkJdHJ5IHsKLQkJCQkJCQkJCQltYXJrZXIuZGVsZXRlKCk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCQljYXRjaChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQkJCQlQZXJzaXN0ZW5jZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZXgpIHsKLQkJCQlQZXJzaXN0ZW5jZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZXgpOwotCQkJCWlmIChNdWx0aUZpbGVTYXZlVXRpbC5ERUJVRykgewotCQkJCQlleC5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGFkZE1hcmtlcihSZXNvbHZlRXhjZXB0aW9uIHJlLCBSZXNvdXJjZSByZXNvdXJjZSwgVVJJIHByb3h5VVJJLCBTdHJpbmcgZXJyTXNnLCBTdHJpbmcgb3duZXJHVUlELCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJVVJJIGNvbnRhaW5lclVSSSA9IHJlc291cmNlLmdldFVSSSgpOwotCQlJV29ya3NwYWNlIHdvcmtzcGFjZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKTsKLQkJSVBhdGggcGF0aCA9IG5ldyBQYXRoKGNvbnRhaW5lclVSSS50b0ZpbGVTdHJpbmcoKSk7Ci0JCUlGaWxlIGZpbGUgPSB3b3Jrc3BhY2UuZ2V0Um9vdCgpLmdldEZpbGVGb3JMb2NhdGlvbihwYXRoKTsKLQkJaWYgKGZpbGUgIT0gbnVsbCkgewotCQkJU3RyaW5nIGxvY2F0aW9uID0gY29udGFpbmVyVVJJICE9IG51bGwgPyBjb250YWluZXJVUkkKLQkJCQkJLnRvRmlsZVN0cmluZygpIDogIiI7IC8vJE5PTi1OTFMtMSQJCQkJCQotCQkJCi0JCQl0cnkgewotCQkJCWZpbGUucmVmcmVzaExvY2FsKElSZXNvdXJjZS5ERVBUSF9aRVJPLCBudWxsKTsJCQkJCi0JCQkJCUlNYXJrZXIgbWFya2VyID0gZmluZE1hcmtlcihmaWxlLCBwcm94eVVSSS50b1N0cmluZygpLCAwLCAwKTsKLQkJCQkJaWYgKG1hcmtlciAhPSBudWxsKSB7Ci0JCQkJCQltYXJrZXIuc2V0QXR0cmlidXRlKE9XTkVSX0dVSUQsIG93bmVyR1VJRCk7Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCX0KLQkJCQkJY3JlYXRlTWFya2VyKHJlLCBwcm94eVVSSSwKLQkJCQkJCQllcnJNc2csIG93bmVyR1VJRCwgZmlsZSwKLQkJCQkJCQlsb2NhdGlvbiwgcHJveHlVUkkudG9TdHJpbmcoKSwgMCwKLQkJCQkJCQkwKTsKLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZXgpIHsKLQkJCQlDb21tb25QbHVnaW4uSU5TVEFOQ0UubG9nKGV4KTsKLQkJCQlpZiAoTXVsdGlGaWxlU2F2ZVV0aWwuREVCVUcpIHsKLQkJCQkJZXgucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBJTWFya2VyIGNyZWF0ZU1hcmtlcihSZXNvbHZlRXhjZXB0aW9uIHJlLCBVUkkgcHJveHlVUkksCi0JCQlTdHJpbmcgZXJyTXNnLCBTdHJpbmcgb3duZXJHVUlELCBJRmlsZSBmaWxlLCBTdHJpbmcgbG9jYXRpb24sCi0JCQlTdHJpbmcgcHJveHlVUklTdHIsIGludCBzdGFydCwgaW50IGVuZCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJTWFya2VyIG1hcmtlcjsKLQkJbWFya2VyID0gZmlsZS5jcmVhdGVNYXJrZXIoTUFSS0VSX0lEKTsKLQkJbWFya2VyLnNldEF0dHJpYnV0ZShJTWFya2VyLlNFVkVSSVRZLAotCQkJCUlNYXJrZXIuU0VWRVJJVFlfRVJST1IpOwotCQltYXJrZXIuc2V0QXR0cmlidXRlKElNYXJrZXIuTUVTU0FHRSwgZXJyTXNnKTsKLQkJbWFya2VyLnNldEF0dHJpYnV0ZShJTWFya2VyLkxPQ0FUSU9OLCBsb2NhdGlvbik7Ci0JCW1hcmtlci5zZXRBdHRyaWJ1dGUoSU1hcmtlci5UUkFOU0lFTlQsIHRydWUpOwotCQltYXJrZXIuc2V0QXR0cmlidXRlKElNYXJrZXIuQ0hBUl9TVEFSVCwgc3RhcnQpOwkKLQkJbWFya2VyLnNldEF0dHJpYnV0ZShJTWFya2VyLkNIQVJfRU5ELCBlbmQpOwotCQltYXJrZXIuc2V0QXR0cmlidXRlKFBST1hZX1VSSSwgcHJveHlVUklTdHIpOwotCQltYXJrZXIuc2V0QXR0cmlidXRlKE9XTkVSX0dVSUQsIG93bmVyR1VJRCk7Ci0JCQotCQlJTWFya2VyQXR0cmlidXRlQ29udHJpYnV0ZXIgYXR0QWRkZXIgPSBFeHRlbnNpb25IZWxwZXIuZ2V0TWFya2VyQXR0cmlidXRlQ29udHJpYnV0ZXIoKTsKLQkJaWYgKGF0dEFkZGVyICE9IG51bGwpIHsKLQkJCWF0dEFkZGVyLmFkZEFkZHRpb25hbEF0dHJpYnV0ZXMobWFya2VyLCByZSk7Ci0JCX0KLQotCQkvLyBjYWNoZSBtYXJrZXIgdG8gaXQgY2FuIGJlIGZvdW5kIGVhc2lseSBhbmQgZGVsZXRlZAotCQkvLwotCQljYWNoZU1hcmtlcihtYXJrZXIsIHByb3h5VVJJKTsKLQkJcmV0dXJuIG1hcmtlcjsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGFkZE1hcmtlcihSZXNvbHZlRXhjZXB0aW9uIHJlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJSW50ZXJuYWxFT2JqZWN0IHByb3h5ID0gKEludGVybmFsRU9iamVjdCkgcmUuZ2V0UHJveHkoKTsKLQkJVVJJIGNvbnRhaW5lclVSSSA9IG51bGw7Ci0JCVJlc291cmNlIHJlc291cmNlID0gbnVsbDsKLQkJaWYocmUuZ2V0UmVzb2x2ZXIoKSAhPSBudWxsKSB7Ci0JCQlyZXNvdXJjZSA9IHJlLmdldFJlc29sdmVyKCkuZVJlc291cmNlKCk7Ci0JCQkKLQkJCS8vIG1ha2Ugc3VyZSB0aGF0IHJlc29sdmVyIGlzIHN0aWxsIGluIHRoZSBvcGVuIGxpYnJhcnkgYnkgY2hlY2tpbmcgd2hldGhlciBpdHMgcmVzb3VyY2UKLQkJCS8vIHN0aWxsIGJlbG9uZ3MgdG8gYSByZXNvdXJjZSBzZXQKLQkJCS8vCi0vLwkJCVN5c3RlbS5vdXQucHJpbnRsbigiVW5yZXNvbHZlZFByb3h5TWFya2VyTWFuYWdlci5hZGRNYXJrZXIoKTogcmVzb3VyY2VTZXQ9IiArIHJlc291cmNlLmdldFJlc291cmNlU2V0KCkuaGFzaENvZGUoKSk7Ci0JCQlpZihyZXNvdXJjZSAhPSBudWxsICYmIHJlc291cmNlLmdldFJlc291cmNlU2V0KCkgIT0gbnVsbCkgewkJCQkKLQkJCQljb250YWluZXJVUkkgPSByZXNvdXJjZS5nZXRVUkkoKTsKLQkJCX0KLQkJfQkJCQkKLQkJaWYgKGNvbnRhaW5lclVSSSAhPSBudWxsKSB7Ci0JCQlJV29ya3NwYWNlIHdvcmtzcGFjZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKTsKLQkJCUlQYXRoIHBhdGggPSBuZXcgUGF0aChjb250YWluZXJVUkkudG9GaWxlU3RyaW5nKCkpOwotCQkJSUZpbGUgZmlsZSA9IHdvcmtzcGFjZS5nZXRSb290KCkuZ2V0RmlsZUZvckxvY2F0aW9uKHBhdGgpOwotCQkJaWYgKGZpbGUgIT0gbnVsbCkgewotCQkJCVN0cmluZyBlcnJNc2c7Ci0JCQkJaWYgKHJlLmV4Y2VwdGlvbigpICE9IG51bGwgJiYgcmUuZXhjZXB0aW9uKCkuZ2V0TG9jYWxpemVkTWVzc2FnZSgpICE9IG51bGwgJiYgCi0JCQkJCQlyZS5leGNlcHRpb24oKS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkudHJpbSgpLmxlbmd0aCgpID4gMCkgewotCQkJCQllcnJNc2cgPSByZS5leGNlcHRpb24oKS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQllcnJNc2cgPSByZS5nZXRNZXNzYWdlKCkgPT0gbnVsbCA/IE5MUy5iaW5kKFBlcnNpc3RlbmNlUmVzb3VyY2VzLlVucmVzb2x2ZWRQcm94eU1hcmtlck1hbmFnZXJfY291bGROb3RSZXNvbHZlUHJveHksIHByb3h5LmVQcm94eVVSSSgpKSA6IHJlCi0JCQkJCQkJCS5nZXRNZXNzYWdlKCk7Ci0JCQkJfQotCQkJCWFkZE1hcmtlcihyZSwgcmVzb3VyY2UsIHByb3h5LmVQcm94eVVSSSgpLCBlcnJNc2csIE11bHRpRmlsZVNhdmVVdGlsLmdldEd1aWQocmUuZ2V0UmVzb2x2ZXIoKSksIG1vbml0b3IpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIG1hcmtlcgotCSAqIEBwYXJhbSB1cmkgcHJveHkgdXJpIAotCSAqLwotCXByaXZhdGUgdm9pZCBjYWNoZU1hcmtlcihJTWFya2VyIG1hcmtlciwgVVJJIHVyaSkgewotCQlzeW5jaHJvbml6ZWQoZWxlbWVudEdVSVRvTWFya2Vyc01hcCkgewotCQkJU3RyaW5nIHJlc291cmNlR1VJRCA9IHVyaS5hdXRob3JpdHkoKTsKLQkJCWlmKHJlc291cmNlR1VJRCAhPSBudWxsKSB7Ci0JCQkJVmFsaWRPYmplY3Qgdm8gPSAoVmFsaWRPYmplY3QpIHJlc291cmNlR1VJVG9NYXJrZXJzTWFwLmdldChyZXNvdXJjZUdVSUQpOwotCQkJCWlmKHZvID09IG51bGwpIHsKLQkJCQkJdm8gPSBuZXcgVmFsaWRPYmplY3QobmV3IEhhc2hTZXQoKSk7Ci0JCQkJCXJlc291cmNlR1VJVG9NYXJrZXJzTWFwLnB1dChyZXNvdXJjZUdVSUQsIHZvKTsKLQkJCQl9Ci0JCQkJQ29sbGVjdGlvbiBtYXJrZXJzID0gKENvbGxlY3Rpb24pIHZvLm9iamVjdDsKLQkJCQltYXJrZXJzLmFkZChtYXJrZXIpOwotCQkJfQotCQkJU3RyaW5nIGVsZW1lbnRHVUlEID0gdXJpLmZyYWdtZW50KCk7Ci0JCQlDb2xsZWN0aW9uIG1hcmtlcnMgPSAoQ29sbGVjdGlvbikgZWxlbWVudEdVSVRvTWFya2Vyc01hcC5nZXQoZWxlbWVudEdVSUQpOwotCQkJaWYobWFya2VycyA9PSBudWxsKSB7Ci0JCQkJbWFya2VycyA9IG5ldyBIYXNoU2V0KCk7Ci0JCQkJZWxlbWVudEdVSVRvTWFya2Vyc01hcC5wdXQoZWxlbWVudEdVSUQsIG1hcmtlcnMpOwotCQkJfQotCQkJbWFya2Vycy5hZGQobmV3IFZhbGlkT2JqZWN0KG1hcmtlcikpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgY2xlYXJBbGwoKSB7Ci0JCWJvb2xlYW4gb2xkRW5hYmxlZCA9IGVuYWJsZWQ7Ci0JCXRyeSB7Ci0JCQllbmFibGVkID0gZmFsc2U7Ci0JCQljYW5jZWwoKTsKLQotCQkJc3luY2hyb25pemVkIChleGNlcHRpb25zKSB7Ci0JCQkJdXJpVG9FeGNlcHRpb25zTWFwLmNsZWFyKCk7Ci0JCQkJZXhjZXB0aW9ucy5jbGVhcigpOwotCQkJfQotCQkJc3luY2hyb25pemVkKGVsZW1lbnRHVUlUb01hcmtlcnNNYXApIHsKLQkJCQlpZighZWxlbWVudEdVSVRvTWFya2Vyc01hcC5pc0VtcHR5KCkpIHsKLQkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gZWxlbWVudEdVSVRvTWFya2Vyc01hcC52YWx1ZXMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJCUNvbGxlY3Rpb24gbWFya2VycyA9IChDb2xsZWN0aW9uKSBpdGVyLm5leHQoKTsKLQkJCQkJCWZvciAoSXRlcmF0b3IgaXRlcjEgPSBtYXJrZXJzLml0ZXJhdG9yKCk7IGl0ZXIxLmhhc05leHQoKTspIHsKLQkJCQkJCQlWYWxpZE9iamVjdCB2byA9IChWYWxpZE9iamVjdCkgaXRlcjEubmV4dCgpOwotCQkJCQkJCUlNYXJrZXIgbWFya2VyID0gKElNYXJrZXIpIHZvLm9iamVjdDsKLQkJCQkJCQl0cnkgewotCQkJCQkJCQlpZihtYXJrZXIuZXhpc3RzKCkpIHsKLQkJCQkJCQkJCW1hcmtlci5kZWxldGUoKTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCQljYXRjaChFeGNlcHRpb24gZSkgewotCQkJCQkJCQlDb21tb25QbHVnaW4uSU5TVEFOQ0UubG9nKGUpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCW1hcmtlcnMuY2xlYXIoKTsKLQkJCQkJfQotCQkJCQllbGVtZW50R1VJVG9NYXJrZXJzTWFwLmNsZWFyKCk7Ci0JCQkJCXJlc291cmNlR1VJVG9NYXJrZXJzTWFwLmNsZWFyKCk7Ci0JCQkJfQkKLQkJCX0KLQkJCXN5bmNocm9uaXplZChyZXNvdXJjZXNUb1ZhbGlkYXRlTWFya2VycykgewotCQkJCXJlc291cmNlc1RvVmFsaWRhdGVNYXJrZXJzLmNsZWFyKCk7Ci0JCQl9Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQllbmFibGVkID0gb2xkRW5hYmxlZDsKLS8vCQkJU3lzdGVtLm91dC5wcmludGxuKCJVbnJlc29sdmVkUHJveHlNYXJrZXJNYW5hZ2VyLmNsZWFyQWxsKCk6IGVuZCIpOwotCQl9Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaGFzVW5yZXNvbHZlZFByb3h5KCkgewotCQlyZXR1cm4gIWVsZW1lbnRHVUlUb01hcmtlcnNNYXAuaXNFbXB0eSgpOwotCX0KLQkKLQlwcml2YXRlIFJlc29sdmVFeGNlcHRpb24gbmV4dEV4Y2VwdGlvbigpIHsKLQkJc3luY2hyb25pemVkKGV4Y2VwdGlvbnMpIHsJCQkKLQkJCS8vIHN5bmNocm9uaXplZDogaW4gb3JkZXIgdG8gYXRvbWljYWxseSBvYnRhaW4gYW5kIGNsZWFyIHJlcXVlc3RzCi0JCQlpZihleGNlcHRpb25zLmlzRW1wdHkoKSkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJUmVzb2x2ZUV4Y2VwdGlvbiBlID0gKFJlc29sdmVFeGNlcHRpb24pIHRoaXMuZXhjZXB0aW9ucy5yZW1vdmUoMCk7Ci0JCQkJVVJJIHVyaSA9ICgoSW50ZXJuYWxFT2JqZWN0KWUuZ2V0UHJveHkoKSkuZVByb3h5VVJJKCk7Ci0JCQkJQ29sbGVjdGlvbiBleGNlcHRpb25zID0gKENvbGxlY3Rpb24pIHVyaVRvRXhjZXB0aW9uc01hcC5nZXQodXJpKTsKLQkJCQlpZihleGNlcHRpb25zICE9IG51bGwpIHsKLQkJCQkJZXhjZXB0aW9ucy5yZW1vdmUoZSk7Ci0JCQkJCWlmKGV4Y2VwdGlvbnMuaXNFbXB0eSgpKSB7Ci0JCQkJCQl1cmlUb0V4Y2VwdGlvbnNNYXAucmVtb3ZlKHVyaSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJcmV0dXJuIGU7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBSZXNvdXJjZSBuZXh0UmVzb3VyY2VUb1ZhbGlkYXRlTWFya2VycygpIHsKLQkJc3luY2hyb25pemVkKHJlc291cmNlc1RvVmFsaWRhdGVNYXJrZXJzKSB7Ci0JCQlpZihyZXNvdXJjZXNUb1ZhbGlkYXRlTWFya2Vycy5pc0VtcHR5KCkpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXJldHVybiAoUmVzb3VyY2UpIHJlc291cmNlc1RvVmFsaWRhdGVNYXJrZXJzLnJlbW92ZSgwKTsKLQkJCX0KLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgeWllbGQoKSB7Ci0JCXRyeSB7Ci0JCQlUaHJlYWQuc2xlZXAoMTApOwotCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLwotCQl9Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLldvcmtzcGFjZUpvYiNydW5JbldvcmtzcGFjZShvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgSVN0YXR1cyBydW5JbldvcmtzcGFjZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLS8vCQlTeXN0ZW0ub3V0LnByaW50bG4oIlVucmVzb2x2ZWRQcm94eU1hcmtlck1hbmFnZXIucnVuSW5Xb3Jrc3BhY2UoKTogYmVnaW4iKTsKLQkJdHJ5IHsKLQkJaWYoIWVuYWJsZWQpIHJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCi0JCXRyeSB7Ci0JCQkvLyBhZGQgbWFya2VycwotCQkJLy8KLQkJCVJlc29sdmVFeGNlcHRpb24gcmU7Ci0JCQl3aGlsZSghbW9uaXRvci5pc0NhbmNlbGVkKCkgJiYgKHJlID0gbmV4dEV4Y2VwdGlvbigpKSAhPSBudWxsKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJYWRkTWFya2VyKHJlLCBtb25pdG9yKTsKLQkJCQl9Ci0JCQkJY2F0Y2goRXhjZXB0aW9uIGUpIHsKLQkJCQkJUGVyc2lzdGVuY2VQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCX0JCi0JCQkJeWllbGQoKTsKLQkJCX0KLQkJCQotCQkJaWYobW9uaXRvci5pc0NhbmNlbGVkKCkpIHsKLQkJCQl0aHJvdyBuZXcgT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24oKTsKLQkJCX0KLQkJCQotCQkJLy8gcmVtb3ZlIGludmFsaWQgbWFya2VycwotCQkJLy8KLQkJCXJlbW92ZU1hcmtlcnMobW9uaXRvcik7Ci0JCQl5aWVsZCgpOwotCQkJCi0JCQkvLyB2YWxpZGF0ZSByZXNvdXJjZSBtYXJrZXJzCi0JCQkvLwotCQkJUmVzb3VyY2UgcmVzb3VyY2U7Ci0JCQl3aGlsZSghbW9uaXRvci5pc0NhbmNlbGVkKCkgJiYgKHJlc291cmNlID0gbmV4dFJlc291cmNlVG9WYWxpZGF0ZU1hcmtlcnMoKSkgIT0gbnVsbCkgewotCQkJCWRvVmFsaWRhdGVNYXJrZXJzKHJlc291cmNlKTsKLQkJCQl5aWVsZCgpOwotCQkJfQotCQl9Ci0JCWNhdGNoKEV4Y2VwdGlvbiBlKSB7Ci0JCQlpZihlIGluc3RhbmNlb2YgT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24pIHsKLQkJCQl0aHJvdyAoT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24pIGU7Ci0JCQl9Ci0JCQlQZXJzaXN0ZW5jZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCX0KLQkJCi0JCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCQl9Ci0JCWZpbmFsbHkgewotLy8JCQlTeXN0ZW0ub3V0LnByaW50bG4oIlVucmVzb2x2ZWRQcm94eU1hcmtlck1hbmFnZXIucnVuSW5Xb3Jrc3BhY2UoKTogZW5kIik7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBib29sZWFuIHJlbW92ZUZyb21SZXNvdXJjZUdVSURUb01hcmtlcnNNYXAoU3RyaW5nIHByb3h5VVJJLCBJTWFya2VyIG1hcmtlcikgewotCQlVUkkgdXJpID0gVVJJLmNyZWF0ZVVSSShwcm94eVVSSSk7Ci0JCVN0cmluZyByZXNvdXJjZUdVSUQgPSB1cmkuYXV0aG9yaXR5KCk7Ci0JCWlmKHJlc291cmNlR1VJRCAhPSBudWxsKSB7Ci0JCQlWYWxpZE9iamVjdCB2byA9IChWYWxpZE9iamVjdCkgcmVzb3VyY2VHVUlUb01hcmtlcnNNYXAuZ2V0KHJlc291cmNlR1VJRCk7Ci0JCQlpZih2byAhPSBudWxsKSB7Ci0JCQkJQ29sbGVjdGlvbiBtYXJrZXJzID0gKChDb2xsZWN0aW9uKXZvLm9iamVjdCk7Ci0JCQkJYm9vbGVhbiByZXQgPSBtYXJrZXJzLnJlbW92ZShtYXJrZXIpOwotCQkJCWlmKG1hcmtlcnMuaXNFbXB0eSgpKSB7Ci0JCQkJCXJlc291cmNlR1VJVG9NYXJrZXJzTWFwLnJlbW92ZShyZXNvdXJjZUdVSUQpOwotCQkJCX0KLQkJCQlyZXR1cm4gcmV0OwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHJlbW92ZUZyb21FbGVtZW50R1VJRFRvTWFya2Vyc01hcChTdHJpbmcgcHJveHlVUkksIElNYXJrZXIgbWFya2VyKSB7Ci0JCVVSSSB1cmkgPSBVUkkuY3JlYXRlVVJJKHByb3h5VVJJKTsKLQkJU3RyaW5nIGVsZW1lbnRHVUlEID0gdXJpLmZyYWdtZW50KCk7Ci0JCWlmKGVsZW1lbnRHVUlEICE9IG51bGwpIHsKLQkJCUNvbGxlY3Rpb24gdmFsaWRPYmplY3RzID0gKENvbGxlY3Rpb24pIGVsZW1lbnRHVUlUb01hcmtlcnNNYXAuZ2V0KGVsZW1lbnRHVUlEKTsKLQkJCWlmKHZhbGlkT2JqZWN0cyAhPSBudWxsKSB7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvcjEgPSB2YWxpZE9iamVjdHMuaXRlcmF0b3IoKTsgaXRlcmF0b3IxCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCQkJVmFsaWRPYmplY3Qgdm8xID0gKFZhbGlkT2JqZWN0KSBpdGVyYXRvcjEubmV4dCgpOwotCQkJCQlpZih2bzEub2JqZWN0ID09IG1hcmtlcikgewotCQkJCQkJaXRlcmF0b3IxLnJlbW92ZSgpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWlmKHZhbGlkT2JqZWN0cy5pc0VtcHR5KCkpIHsKLQkJCQkJZWxlbWVudEdVSVRvTWFya2Vyc01hcC5yZW1vdmUoZWxlbWVudEdVSUQpOwotCQkJCX0JCi0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHJlbW92ZU1hcmtlcnMoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCXN5bmNocm9uaXplZChlbGVtZW50R1VJVG9NYXJrZXJzTWFwKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGVsZW1lbnRHVUlUb01hcmtlcnNNYXAudmFsdWVzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlDb2xsZWN0aW9uIG1hcmtlcnMgPSAoQ29sbGVjdGlvbikgaXRlci5uZXh0KCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gbWFya2Vycy5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJVmFsaWRPYmplY3Qgdm8gPSAoVmFsaWRPYmplY3QpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQlpZighdm8udmFsaWQpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCUlNYXJrZXIgbWFya2VyID0gKElNYXJrZXIpIHZvLm9iamVjdDsKLQkJCQkJCWlmKG1hcmtlci5leGlzdHMoKSkgewotCQkJCQkJCVN0cmluZyBwcm94eVVSSSA9IChTdHJpbmcpIG1hcmtlci5nZXRBdHRyaWJ1dGUoUFJPWFlfVVJJKTsKLQotCQkJCQkJCW1hcmtlci5kZWxldGUoKTsKLQotCQkJCQkJCS8vIHJlbW92ZSB0aGlzIG1hcmtlciBmcm9tIHJlc291cmNlR1VJVG9NYXJrZXJzTWFwCi0JCQkJCQkJLy8KLQkJCQkJCQlyZW1vdmVGcm9tUmVzb3VyY2VHVUlEVG9NYXJrZXJzTWFwKHByb3h5VVJJLCBtYXJrZXIpOwotCQkJCQkJfQotCQkJCQkJaXRlcmF0b3IucmVtb3ZlKCk7Ci0KLQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCUNvbW1vblBsdWdpbi5JTlNUQU5DRS5sb2coZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZm9yIChJdGVyYXRvciBpdGVyID0gcmVzb3VyY2VHVUlUb01hcmtlcnNNYXAudmFsdWVzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlWYWxpZE9iamVjdCB2byA9IChWYWxpZE9iamVjdCkgaXRlci5uZXh0KCk7Ci0JCQlpZighdm8udmFsaWQpIHsKLQkJCQl2by52YWxpZCA9IHRydWU7Ci0JCQkJQ29sbGVjdGlvbiBtYXJrZXJzID0gKENvbGxlY3Rpb24pIHZvLm9iamVjdDsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gbWFya2Vycy5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJCUlNYXJrZXIgbWFya2VyOwotCQkJCQl0cnkgewotCQkJCQkJbWFya2VyID0gKElNYXJrZXIpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJCWlmKG1hcmtlci5leGlzdHMoKSkgewotCQkJCQkJCVN0cmluZyBwcm94eVVSSVN0ciA9IChTdHJpbmcpIG1hcmtlci5nZXRBdHRyaWJ1dGUoUFJPWFlfVVJJKTsKLQkJCQkJCQlVUkkgcHJveHlVUkkgPSBVUkkuY3JlYXRlVVJJKHByb3h5VVJJU3RyKTsKLQotCQkJCQkJCS8vIHByb3h5IGlzIGluIHRoZSBzYW1lIHJlc291cmNlIHRoYXQgaXMganVzdCBsb2FkZWQgCi0JCQkJCQkJLy8gdHJ5IHRvIGdldCB0aGUgb2JqZWN0IHdpdGggdGhpcyBwcm94eSBVUkkgd2l0aG91dCBsb2FkaW5nIG5ldyByZXNvdXJjZQotCQkJCQkJCS8vCi0vLwkJCQkJCQlFT2JqZWN0IG8gPSByZXNvdXJjZVNldC5nZXRFT2JqZWN0KHByb3h5VVJJLCBmYWxzZSk7Ci0JCQkJCQkJU3RyaW5nIGVsZW1lbnRHVUlEID0gcHJveHlVUkkuZnJhZ21lbnQoKTsJCQkJCQkJCi0JCQkJCQkJRU9iamVjdCBvID0gKEVPYmplY3QpICgoTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsKXJlc291cmNlU2V0KS5nZXRHdWlkVG9NZXRob2RFbGVtZW50TWFwKCkuZ2V0KGVsZW1lbnRHVUlEKTsKLQkJCQkJCQlpZihvICE9IG51bGwgJiYgIW8uZUlzUHJveHkoKSkgewotCQkJCQkJCQltYXJrZXIuZGVsZXRlKCk7Ci0JCQkJCQkJCWl0ZXJhdG9yLnJlbW92ZSgpOwkKLQotCQkJCQkJCQkvLyByZW1vdmUgdGhpcyBtYXJrZXIgZnJvbSBlbGVtZW50R1VJVG9NYXJrZXJzTWFwCi0JCQkJCQkJCS8vCi0JCQkJCQkJCXJlbW92ZUZyb21FbGVtZW50R1VJRFRvTWFya2Vyc01hcChwcm94eVVSSVN0ciwgbWFya2VyKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIHsKLQkJCQkJCQlpdGVyYXRvci5yZW1vdmUoKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQljYXRjaChFeGNlcHRpb24gZSkgewotCQkJCQkJQ29tbW9uUGx1Z2luLklOU1RBTkNFLmxvZyhlKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlpZihtYXJrZXJzLmlzRW1wdHkoKSkgewotCQkJCQlpdGVyLnJlbW92ZSgpOwotCQkJCX0KLQkJCX0KLQkJfQotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldEVuYWJsZWQoYm9vbGVhbiBlbmFibGVkKSB7Ci0JCXRoaXMuZW5hYmxlZCA9IGVuYWJsZWQ7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGlzRW5hYmxlZCgpIHsKLQkJcmV0dXJuIGVuYWJsZWQ7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS5JUHJveHlSZXNvbHV0aW9uTGlzdGVuZXIjbm90aWZ5RXhjZXB0aW9uKGphdmEubGFuZy5FeGNlcHRpb24pCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5RXhjZXB0aW9uKEV4Y2VwdGlvbiBlKSB7Ci0JCWlmKCFlbmFibGVkKSByZXR1cm47Ci0JCQotCQlpZihlIGluc3RhbmNlb2YgUmVzb2x2ZUV4Y2VwdGlvbikgewotCQkJUmVzb2x2ZUV4Y2VwdGlvbiByZSA9IChSZXNvbHZlRXhjZXB0aW9uKSBlOwotCQkJCi0vLwkJCVVSSSB1cmkgPSAoKEludGVybmFsRU9iamVjdClyZS5nZXRQcm94eSgpKS5lUHJveHlVUkkoKTsKLS8vCQkJaWYoIl8ySjRZb1BUREVkbWtwWUFSTk40NjhBIi5lcXVhbHModXJpLmZyYWdtZW50KCkpKSB7Ci0vLwkJCQlTeXN0ZW0ub3V0LnByaW50bG4oKTsKLS8vCQkJfQotCQkJCi0JCQlpZihhZGRFeGNlcHRpb24ocmUpICYmIGF1dG9TY2hlZHVsZWQpIHsJCQkKLQkJCQlzY2hlZHVsZShERUxBWSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0QXV0b1NjaGVkdWxlZChib29sZWFuIGIpIHsKLQkJYXV0b1NjaGVkdWxlZCA9IGI7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGlzQXV0b1NjaGVkdWxlZCgpIHsKLQkJcmV0dXJuIGF1dG9TY2hlZHVsZWQ7Ci0JfQotCQotCS8qKgotCSAqIFNjaGVkdWxlcyB0aGlzIGpvYiBpZiBleGNlcHRpb25zIGFyZSBhdmFpbGFibGUgdG8gbG9nCi0JICovCi0JcHVibGljIGJvb2xlYW4gc3RhcnQoKSB7Ci0JCWlmKCFlbmFibGVkKSByZXR1cm4gZmFsc2U7Ci0JCQotCQlzeW5jaHJvbml6ZWQgKGV4Y2VwdGlvbnMpIHsKLQkJCWlmKCFleGNlcHRpb25zLmlzRW1wdHkoKSkgewotCQkJCXNjaGVkdWxlKERFTEFZKTsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLklQcm94eVJlc29sdXRpb25MaXN0ZW5lciNwcm94eVJlc29sdmVkKGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgcHJveHlSZXNvbHZlZChPYmplY3QgcHJveHksIE9iamVjdCByZXNvbHZlZCkgewotCQlpZighZW5hYmxlZCkgcmV0dXJuOwotCQkKLQkJaWYocHJveHkgaW5zdGFuY2VvZiBJbnRlcm5hbEVPYmplY3QpIHsKLQkJCVVSSSB1cmkgPSAoKEludGVybmFsRU9iamVjdClwcm94eSkuZVByb3h5VVJJKCk7Ci0JCQkKLS8vCQkJaWYoIl8ySjRZb1BUREVkbWtwWUFSTk40NjhBIi5lcXVhbHModXJpLmZyYWdtZW50KCkpKSB7Ci0vLwkJCQlTeXN0ZW0ub3V0LnByaW50bG4oKTsKLS8vCQkJfQotCQkJCi0JCQkvLyByZW1vdmUgYWxsIGV4Y2VwdGlvbnMgZm9yIHRoaXMgVVJJCi0JCQkvLwotCQkJcmVtb3ZlRXhjZXB0aW9ucyh1cmkpOwotCQkJCi0JCQkvLyBpbnZhbGlkYXRlIGFsbCBtYXJrZXJzIGZvciB0aGlzIFVSSQotCQkJLy8KLQkJCWlmKGludmFsaWRhdGVNYXJrZXJzKHVyaSkpIHsKLQkJCQlzY2hlZHVsZShERUxBWSk7Ci0JCQl9CQkJCQkJCi0JCX0JCQotCX0KLQkKLQkvKioKLQkgKiBAcGFyYW0gdXJpCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGludmFsaWRhdGVNYXJrZXJzKFVSSSB1cmkpIHsKLQkJc3luY2hyb25pemVkKGVsZW1lbnRHVUlUb01hcmtlcnNNYXApIHsKLQkJCWJvb2xlYW4gcmV0ID0gZmFsc2U7Ci0JCQlTdHJpbmcgcmVzb3VyY2VHVUlEID0gdXJpLmF1dGhvcml0eSgpOwotCQkJaWYocmVzb3VyY2VHVUlEICE9IG51bGwpIHsKLQkJCQlWYWxpZE9iamVjdCB2byA9IChWYWxpZE9iamVjdCkgcmVzb3VyY2VHVUlUb01hcmtlcnNNYXAuZ2V0KHJlc291cmNlR1VJRCk7Ci0JCQkJaWYodm8gIT0gbnVsbCkgewotCQkJCQl2by52YWxpZCA9IGZhbHNlOwotCQkJCQlyZXQgPSB0cnVlOwotCQkJCX0KLQkJCX0KLQkJCVN0cmluZyBlbGVtZW50R1VJRCA9IHVyaS5mcmFnbWVudCgpOwotCQkJaWYoZWxlbWVudEdVSUQgIT0gbnVsbCkgewotCQkJCUNvbGxlY3Rpb24gbWFya2VycyA9IChDb2xsZWN0aW9uKSBlbGVtZW50R1VJVG9NYXJrZXJzTWFwLmdldChlbGVtZW50R1VJRCk7Ci0JCQkJaWYobWFya2VycyAhPSBudWxsICYmICFtYXJrZXJzLmlzRW1wdHkoKSkgewotCQkJCQlyZXQgPSB0cnVlOwotCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBtYXJrZXJzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQkJVmFsaWRPYmplY3Qgdm8gPSAoVmFsaWRPYmplY3QpIGl0ZXIubmV4dCgpOwotCQkJCQkJdm8udmFsaWQgPSBmYWxzZTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCXJldHVybiByZXQ7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gdXJpCi0JICovCi0JcHJpdmF0ZSB2b2lkIHJlbW92ZUV4Y2VwdGlvbnMoVVJJIHVyaSkgewotCQlzeW5jaHJvbml6ZWQgKGV4Y2VwdGlvbnMpIHsKLQkJCUNvbGxlY3Rpb24gZXhjZXB0aW9ucyA9IChDb2xsZWN0aW9uKSB1cmlUb0V4Y2VwdGlvbnNNYXAuZ2V0KHVyaSk7Ci0JCQlpZihleGNlcHRpb25zID09IG51bGwgfHwgZXhjZXB0aW9ucy5pc0VtcHR5KCkpIHJldHVybjsKLQkJCXRoaXMuZXhjZXB0aW9ucy5yZW1vdmVBbGwoZXhjZXB0aW9ucyk7Ci0JCQl1cmlUb0V4Y2VwdGlvbnNNYXAucmVtb3ZlKHVyaSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDbGVhcnMgbWFya2VycyBmb3IgdW5yZXNvbHZlZCBwcm94aWVzIG9mIHRoZSBnaXZlbiByZXNvdXJjZQotCSAqICAKLQkgKiBAcGFyYW0gcmVzb3VyY2UKLQkgKi8KLQlwdWJsaWMgdm9pZCBjbGVhck1hcmtlcnMoUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJdHJ5IHsKLQkJCUlSZXNvdXJjZSBmaWxlID0gRmlsZU1hbmFnZXIuZ2V0UmVzb3VyY2VGb3JMb2NhdGlvbihyZXNvdXJjZS5nZXRVUkkoKS50b0ZpbGVTdHJpbmcoKSk7Ci0JCQlpZihmaWxlIGluc3RhbmNlb2YgSUZpbGUpIHsKLQkJCQlJTWFya2VyW10gbWFya2VycyA9IGZpbGUuZmluZE1hcmtlcnMoTUFSS0VSX0lELCBmYWxzZSwgSVJlc291cmNlLkRFUFRIX1pFUk8pOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbWFya2Vycy5sZW5ndGg7IGkrKykgewotCQkJCQlJTWFya2VyIG1hcmtlciA9IG1hcmtlcnNbaV07Ci0JCQkJCXJlbW92ZU1hcmtlcihtYXJrZXIpOwotCQkJCX0KLQkJCX0KLQkJfQotCQljYXRjaChFeGNlcHRpb24gZSkgewotCQkJUGVyc2lzdGVuY2VQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJlbW92ZU1hcmtlcihJTWFya2VyIG1hcmtlcikgewotCQlTdHJpbmcgcHJveHlVUkkgPSBudWxsOwotCQl0cnkgewotCQkJaWYobWFya2VyLmV4aXN0cygpKSB7Ci0JCQkJcHJveHlVUkkgPSAoU3RyaW5nKSBtYXJrZXIuZ2V0QXR0cmlidXRlKFBST1hZX1VSSSk7Ci0JCQkJbWFya2VyLmRlbGV0ZSgpOwotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJUGVyc2lzdGVuY2VQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQl9Ci0JCWlmKHByb3h5VVJJICE9IG51bGwpIHsKLQkJCXN5bmNocm9uaXplZChlbGVtZW50R1VJVG9NYXJrZXJzTWFwKSB7Ci0JCQkJcmVtb3ZlRnJvbUVsZW1lbnRHVUlEVG9NYXJrZXJzTWFwKHByb3h5VVJJLCBtYXJrZXIpOwotCQkJCXJlbW92ZUZyb21SZXNvdXJjZUdVSURUb01hcmtlcnNNYXAocHJveHlVUkksIG1hcmtlcik7Ci0JCQl9Ci0JCX0JCQotCX0KLQotCXByaXZhdGUgc3RhdGljIGNsYXNzIE1hcmtlckluZm8gewotCQlTdHJpbmcgcHJveHlVUkk7Ci0JCVN0cmluZyBvd25lckdVSUQ7Ci0JCVN0cmluZyBtZXNzYWdlOwotCQkKLQkJLyogKG5vbi1KYXZhZG9jKQotCQkgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjZXF1YWxzKGphdmEubGFuZy5PYmplY3QpCi0JCSAqLwotCQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotCQkJaWYob2JqIGluc3RhbmNlb2YgTWFya2VySW5mbykgewotCQkJCU1hcmtlckluZm8gaW5mbyA9IChNYXJrZXJJbmZvKSBvYmo7Ci0JCQkJaWYocHJveHlVUkkgIT0gbnVsbCAmJiBvd25lckdVSUQgIT0gbnVsbCAmJiBwcm94eVVSSS5lcXVhbHMoaW5mby5wcm94eVVSSSkgJiYgb3duZXJHVUlELmVxdWFscyhpbmZvLm93bmVyR1VJRCkpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIHN1cGVyLmVxdWFscyhvYmopOwotCQl9Ci0JCQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIGludCBoYXNoQ29kZSgpIHsKLQkJCWludCByZXN1bHQgPSBwcm94eVVSSS5oYXNoQ29kZSgpOwotCQkJcmVzdWx0IF49IG93bmVyR1VJRC5oYXNoQ29kZSgpOwotCQkJcmVzdWx0IF49IG1lc3NhZ2UuaGFzaENvZGUoKTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogVmFsaWRhdGVzIG1hcmtlcnMgZm9yIHVucmVzb2x2ZWQgcHJveGllcyBvZiB0aGUgZ2l2ZW4gcmVzb3VyY2UKLQkgKiAKLQkgKiBAcGFyYW0gcmVzb3VyY2UKLQkgKi8KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZU1hcmtlcnMoUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJYm9vbGVhbiBuZXdseUFkZGVkID0gZmFsc2U7Ci0JCXN5bmNocm9uaXplZChyZXNvdXJjZXNUb1ZhbGlkYXRlTWFya2VycykgewotCQkJbmV3bHlBZGRlZCA9IHJlc291cmNlc1RvVmFsaWRhdGVNYXJrZXJzLmFkZChyZXNvdXJjZSk7Ci0JCX0KLQkJaWYobmV3bHlBZGRlZCkgewotCQkJc2NoZWR1bGUoREVMQVkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdmFsaWRhdGVBbGxNYXJrZXJzKCkgewotCQlib29sZWFuIG5ld2x5QWRkZWQgPSBmYWxzZTsKLQkJc3luY2hyb25pemVkKHJlc291cmNlc1RvVmFsaWRhdGVNYXJrZXJzKSB7Ci0JCQlpZighZWxlbWVudEdVSVRvTWFya2Vyc01hcC5pc0VtcHR5KCkpIHsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBlbGVtZW50R1VJVG9NYXJrZXJzTWFwLnZhbHVlcygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQlDb2xsZWN0aW9uIG1hcmtlcnMgPSAoQ29sbGVjdGlvbikgaXRlci5uZXh0KCk7Ci0JCQkJCWZvciAoSXRlcmF0b3IgaXRlcjEgPSBtYXJrZXJzLml0ZXJhdG9yKCk7IGl0ZXIxLmhhc05leHQoKTspIHsKLQkJCQkJCVZhbGlkT2JqZWN0IHZvID0gKFZhbGlkT2JqZWN0KSBpdGVyMS5uZXh0KCk7Ci0JCQkJCQlJTWFya2VyIG1hcmtlciA9IChJTWFya2VyKSB2by5vYmplY3Q7Ci0JCQkJCQl0cnkgewotCQkJCQkJCVN0cmluZyBsb2NhdGlvbiA9IChTdHJpbmcpbWFya2VyLmdldEF0dHJpYnV0ZShJTWFya2VyLkxPQ0FUSU9OKTsKLQkJCQkJCQlVUkkgdXJpID0gVVJJLmNyZWF0ZUZpbGVVUkkobG9jYXRpb24pOwotCQkJCQkJCVJlc291cmNlIHJlc291cmNlID0gcmVzb3VyY2VTZXQuZ2V0UmVzb3VyY2UodXJpLCB0cnVlKTsKLQkJCQkJCQluZXdseUFkZGVkID0gcmVzb3VyY2VzVG9WYWxpZGF0ZU1hcmtlcnMuYWRkKHJlc291cmNlKSB8IG5ld2x5QWRkZWQ7Ci0JCQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQlQZXJzaXN0ZW5jZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYobmV3bHlBZGRlZCkgewotCQkJc2NoZWR1bGUoREVMQVkpOwotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIGRvVmFsaWRhdGVNYXJrZXJzKFJlc291cmNlIHJlc291cmNlKSB7Ci0JCXRyeSB7Ci0JCQlJUmVzb3VyY2UgZmlsZSA9IEZpbGVNYW5hZ2VyLmdldFJlc291cmNlRm9yTG9jYXRpb24ocmVzb3VyY2UuZ2V0VVJJKCkudG9GaWxlU3RyaW5nKCkpOwotCQkJaWYoZmlsZSBpbnN0YW5jZW9mIElGaWxlKSB7Ci0JCQkJSU1hcmtlcltdIG1hcmtlcnMgPSBmaWxlLmZpbmRNYXJrZXJzKE1BUktFUl9JRCwgZmFsc2UsIElSZXNvdXJjZS5ERVBUSF9aRVJPKTsKLQkJCQlIYXNoU2V0PElNYXJrZXI+IG1hcmtlcnNUb1VwZGF0ZSA9IG5ldyBIYXNoU2V0PElNYXJrZXI+KCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtYXJrZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCUlNYXJrZXIgbWFya2VyID0gbWFya2Vyc1tpXTsKLQkJCQkJU3RyaW5nIHByb3h5VVJJID0gKFN0cmluZykgbWFya2VyLmdldEF0dHJpYnV0ZShQUk9YWV9VUkkpOwotCQkJCQlpZihwcm94eVVSSSAhPSBudWxsKSB7Ci0JCQkJCQlVUkkgdXJpID0gVVJJLmNyZWF0ZVVSSShwcm94eVVSSSk7Ci0JCQkJCQkvLyB0cnkgdG8gZ2V0IHRoZSBvYmplY3Qgd2l0aCB0aGlzIHByb3h5IFVSSSB3aXRob3V0IGxvYWRpbmcgbmV3IHJlc291cmNlCi0JCQkJCQkvLwotCQkJCQkJU3RyaW5nIGVsZW1lbnRHVUlEID0gdXJpLmZyYWdtZW50KCk7CQkJCQkJCQotCQkJCQkJRU9iamVjdCBvID0gKEVPYmplY3QpICgoTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsKXJlc291cmNlU2V0KS5nZXRHdWlkVG9NZXRob2RFbGVtZW50TWFwKCkuZ2V0KGVsZW1lbnRHVUlEKTsKLQkJCQkJCWlmKG8gPT0gbnVsbCB8fCBvLmVJc1Byb3h5KCkpIHsKLQkJCQkJCQkvLyBtYXJrZXIgc3RpbGwgY2FuIGV4aXN0LCBuZWVkIHRvIHVwZGF0ZSBpdAotCQkJCQkJCS8vCi0JCQkJCQkJbWFya2Vyc1RvVXBkYXRlLmFkZChtYXJrZXIpOwotCQkJCQkJfQotCQkJCQkJZWxzZSB7Ci0JCQkJCQkJLy8gb2JqZWN0IGlzIHJlc29sdmVkLCBtdXN0IGRlbGV0ZSBtYXJrZXIKLQkJCQkJCQkvLwotCQkJCQkJCWlmKG1hcmtlci5leGlzdHMoKSkgewotCQkJCQkJCQl0cnkgewotCQkJCQkJCQkJbWFya2VyLmRlbGV0ZSgpOwotCQkJCQkJCQl9Ci0JCQkJCQkJCWNhdGNoKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJCQlQZXJzaXN0ZW5jZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7CQkJCQkJCQkJCi0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQkJc3luY2hyb25pemVkKGVsZW1lbnRHVUlUb01hcmtlcnNNYXApIHsKLQkJCQkJCQkJcmVtb3ZlRnJvbUVsZW1lbnRHVUlEVG9NYXJrZXJzTWFwKHByb3h5VVJJLCBtYXJrZXIpOwotCQkJCQkJCQlyZW1vdmVGcm9tUmVzb3VyY2VHVUlEVG9NYXJrZXJzTWFwKHByb3h5VVJJLCBtYXJrZXIpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQlpZighbWFya2Vyc1RvVXBkYXRlLmlzRW1wdHkoKSkgewotCQkJCQlJTWFya2VyW10gbWFya2VyQXJyYXkgPSBuZXcgSU1hcmtlclttYXJrZXJzVG9VcGRhdGUuc2l6ZSgpXTsKLQkJCQkJbWFya2Vyc1RvVXBkYXRlLnRvQXJyYXkobWFya2VyQXJyYXkpOwotCQkJCQl1cGRhdGVNYXJrZXIobWFya2VyQXJyYXksIHJlc291cmNlLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJY2F0Y2goRXhjZXB0aW9uIGUpIHsKLQkJCVBlcnNpc3RlbmNlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsJCQotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL3V0aWwvcGFja2FnZS5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS91dGlsL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGIzZmEwOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL3V0aWwvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgaW1wbGVtZW50YXRpb24gc3VwcG9ydCBmb3IgcGVyc2lzdGluZyBhIG1ldGhvZCBsaWJyYXJ5LgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmVzb3VyY2VtYW5hZ2VyL1Jlc291cmNlRGVzY3JpcHRvci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9yZXNvdXJjZW1hbmFnZXIvUmVzb3VyY2VEZXNjcmlwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5NGMyMzguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9yZXNvdXJjZW1hbmFnZXIvUmVzb3VyY2VEZXNjcmlwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucmVzb3VyY2VtYW5hZ2VyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuc2RvLkVEYXRhT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5SZXNvdXJjZSBEZXNjcmlwdG9yPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuUmVzb3VyY2VEZXNjcmlwdG9yI2dldElkIDxlbT5JZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlci5SZXNvdXJjZURlc2NyaXB0b3IjZ2V0VXJpIDxlbT5Vcmk8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuUmVzb3VyY2VtYW5hZ2VyUGFja2FnZSNnZXRSZXNvdXJjZURlc2NyaXB0b3IoKQotICogQG1vZGVsCi0gKiBAZXh0ZW5kcyBFRGF0YU9iamVjdAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFJlc291cmNlRGVzY3JpcHRvciBleHRlbmRzIEVEYXRhT2JqZWN0IHsKLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPHA+Ci0gICAgICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotICAgICAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLSAgICAgKiA8L3A+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldElkKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuUmVzb3VyY2VtYW5hZ2VyUGFja2FnZSNnZXRSZXNvdXJjZURlc2NyaXB0b3JfSWQoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBTdHJpbmcgZ2V0SWQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuUmVzb3VyY2VEZXNjcmlwdG9yI2dldElkIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgdm9pZCBzZXRJZChTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VXJpPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8cD4KLSAgICAgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Vcmk8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotICAgICAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLSAgICAgKiA8L3A+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VXJpPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRVcmkoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlci5SZXNvdXJjZW1hbmFnZXJQYWNrYWdlI2dldFJlc291cmNlRGVzY3JpcHRvcl9VcmkoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBTdHJpbmcgZ2V0VXJpKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYucmVzb3VyY2VtYW5hZ2VyLlJlc291cmNlRGVzY3JpcHRvciNnZXRVcmkgPGVtPlVyaTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VXJpPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRVcmkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICB2b2lkIHNldFVyaShTdHJpbmcgdmFsdWUpOwotCi0gICAgVVJJIGdldFJlc29sdmVkVVJJKCk7Ci0gICAgCi0gICAgdm9pZCBzZXRSZXNvbHZlZFVSSShVUkkgdXJpKTsKLQkKLQkvKioKLQkgKiBDbGVhcnMgdGhlIHJlc29sdmVkIFVSSSB0aGF0IGhhcyBiZWVuIGNhY2hlZCBpbiBwcmV2aW91cyBjYWxsZWQgb2YgZ2V0UmVzb2x2ZWRVUkkoKQotCSAqIHNvIHRoZSBuZXh0IGNhbGwgdG8gZ2V0UmVzb2x2ZWRVUkkoKSB3aWxsIHVwZGF0ZSB0aGUgcmVzb2x2ZWRVUkkuCi0JICoKLQkgKi8KLQl2b2lkIGNsZWFyUmVzb2x2ZWRVUkkoKTsKLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9yZXNvdXJjZW1hbmFnZXIvUmVzb3VyY2VNYW5hZ2VyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3Jlc291cmNlbWFuYWdlci9SZXNvdXJjZU1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZThkZjUzNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3Jlc291cmNlbWFuYWdlci9SZXNvdXJjZU1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucmVzb3VyY2VtYW5hZ2VyOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5zZG8uRURhdGFPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlJlc291cmNlIE1hbmFnZXI8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlci5SZXNvdXJjZU1hbmFnZXIjZ2V0R3VpZCA8ZW0+R3VpZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlci5SZXNvdXJjZU1hbmFnZXIjZ2V0VXJpQmFzZSA8ZW0+VXJpIEJhc2U8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuUmVzb3VyY2VNYW5hZ2VyI2dldFN1Yk1hbmFnZXJzIDxlbT5TdWIgTWFuYWdlcnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuUmVzb3VyY2VNYW5hZ2VyI2dldFJlc291cmNlRGVzY3JpcHRvcnMgPGVtPlJlc291cmNlIERlc2NyaXB0b3JzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYucmVzb3VyY2VtYW5hZ2VyLlJlc291cmNlbWFuYWdlclBhY2thZ2UjZ2V0UmVzb3VyY2VNYW5hZ2VyKCkKLSAqIEBtb2RlbAotICogQGV4dGVuZHMgRURhdGFPYmplY3QKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBSZXNvdXJjZU1hbmFnZXIgZXh0ZW5kcyBFRGF0YU9iamVjdCB7Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+R3VpZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+R3VpZDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5HdWlkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRHdWlkKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuUmVzb3VyY2VtYW5hZ2VyUGFja2FnZSNnZXRSZXNvdXJjZU1hbmFnZXJfR3VpZCgpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRHdWlkKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYucmVzb3VyY2VtYW5hZ2VyLlJlc291cmNlTWFuYWdlciNnZXRHdWlkIDxlbT5HdWlkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5HdWlkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRHdWlkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRHdWlkKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5VcmkgQmFzZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VXJpIEJhc2U8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VXJpIEJhc2U8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFVyaUJhc2UoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlci5SZXNvdXJjZW1hbmFnZXJQYWNrYWdlI2dldFJlc291cmNlTWFuYWdlcl9VcmlCYXNlKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFVyaUJhc2UoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuUmVzb3VyY2VNYW5hZ2VyI2dldFVyaUJhc2UgPGVtPlVyaSBCYXNlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5VcmkgQmFzZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0VXJpQmFzZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VXJpQmFzZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U3ViIE1hbmFnZXJzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlci5SZXNvdXJjZU1hbmFnZXJ9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U3ViIE1hbmFnZXJzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U3ViIE1hbmFnZXJzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlci5SZXNvdXJjZW1hbmFnZXJQYWNrYWdlI2dldFJlc291cmNlTWFuYWdlcl9TdWJNYW5hZ2VycygpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuUmVzb3VyY2VNYW5hZ2VyIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3Q8UmVzb3VyY2VNYW5hZ2VyPiBnZXRTdWJNYW5hZ2VycygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmVzb3VyY2UgRGVzY3JpcHRvcnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYucmVzb3VyY2VtYW5hZ2VyLlJlc291cmNlRGVzY3JpcHRvcn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8cD4KLSAgICAgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5SZXNvdXJjZSBEZXNjcmlwdG9yczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLSAgICAgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0gICAgICogPC9wPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJlc291cmNlIERlc2NyaXB0b3JzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlci5SZXNvdXJjZW1hbmFnZXJQYWNrYWdlI2dldFJlc291cmNlTWFuYWdlcl9SZXNvdXJjZURlc2NyaXB0b3JzKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlci5SZXNvdXJjZURlc2NyaXB0b3IiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgTGlzdDxSZXNvdXJjZURlc2NyaXB0b3I+IGdldFJlc291cmNlRGVzY3JpcHRvcnMoKTsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogR2V0cyBkaXJlY3QgUmVzb3VyY2VEZXNjcmlwdG9yIHdob3NlIGlkIGlzIHRoZSBnaXZlbiBndWlkCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlSZXNvdXJjZURlc2NyaXB0b3IgZ2V0UmVzb3VyY2VEZXNjcmlwdG9yKFN0cmluZyBndWlkKTsKLQotICAgIC8qKgotICAgICAqIFJlbW92ZXMgdGhlIFJlc291cmNlRGVzY3JpcHRvciBpZGVudGlmaWVkIGJ5IHRoZSBnaXZlbiB1cmkuIElmIGNsZWFyRm9sZGVyIGlzIHRydWUsIHRoaXMgY2FsbCB3aWxsIHJlbW92ZQotICAgICAqIGFsbCBvdGhlciBSZXNvdXJjZURlc2NyaXB0b3JzIHdob3NlIFVSSSBzaGFyZXMgdGhlIHNhbWUgZm9sZGVyIG9mIHRoZSBnaXZlbiB1cmkuCi0gICAgICogCi0gICAgICogQHBhcmFtIHVyaQotICAgICAqIEBwYXJhbSBjbGVhckZvbGRlcgotICAgICAqIEByZXR1cm4gbGlzdCBvZiBSZXNvdXJjZURlc2NyaXB0b3JzIHRoYXQgaGFkIGJlZW4gcmVtb3ZlZAotICAgICAqLwotICAgIExpc3Q8UmVzb3VyY2VEZXNjcmlwdG9yPiByZW1vdmVSZXNvdXJjZURlc2NyaXB0b3IoVVJJIHVyaSwgYm9vbGVhbiBjbGVhckZvbGRlcik7Ci0KLQl2b2lkIGRpc3Bvc2UoKTsKLQkKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmVzb3VyY2VtYW5hZ2VyL1Jlc291cmNlbWFuYWdlckZhY3RvcnkuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmVzb3VyY2VtYW5hZ2VyL1Jlc291cmNlbWFuYWdlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODg4NmNhYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3Jlc291cmNlbWFuYWdlci9SZXNvdXJjZW1hbmFnZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucmVzb3VyY2VtYW5hZ2VyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVGYWN0b3J5OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBUaGUgPGI+RmFjdG9yeTwvYj4gZm9yIHRoZSBtb2RlbC4KLSAqIEl0IHByb3ZpZGVzIGEgY3JlYXRlIG1ldGhvZCBmb3IgZWFjaCBub24tYWJzdHJhY3QgY2xhc3Mgb2YgdGhlIG1vZGVsLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuUmVzb3VyY2VtYW5hZ2VyUGFja2FnZQotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFJlc291cmNlbWFuYWdlckZhY3RvcnkgZXh0ZW5kcyBFRmFjdG9yeSB7Ci0JCi0JLyoqCi0JICogVGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgZmFjdG9yeS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBSZXNvdXJjZW1hbmFnZXJGYWN0b3J5IGVJTlNUQU5DRSA9IG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuaW1wbC5SZXNvdXJjZW1hbmFnZXJGYWN0b3J5SW1wbC5pbml0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlJlc291cmNlIERlc2NyaXB0b3I8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlJlc291cmNlIERlc2NyaXB0b3I8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIFJlc291cmNlRGVzY3JpcHRvciBjcmVhdGVSZXNvdXJjZURlc2NyaXB0b3IoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UmVzb3VyY2UgTWFuYWdlcjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UmVzb3VyY2UgTWFuYWdlcjwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgUmVzb3VyY2VNYW5hZ2VyIGNyZWF0ZVJlc291cmNlTWFuYWdlcigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcGFja2FnZSBzdXBwb3J0ZWQgYnkgdGhpcyBmYWN0b3J5LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgcGFja2FnZSBzdXBwb3J0ZWQgYnkgdGhpcyBmYWN0b3J5LgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBSZXNvdXJjZW1hbmFnZXJQYWNrYWdlIGdldFJlc291cmNlbWFuYWdlclBhY2thZ2UoKTsKLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9yZXNvdXJjZW1hbmFnZXIvUmVzb3VyY2VtYW5hZ2VyUGFja2FnZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9yZXNvdXJjZW1hbmFnZXIvUmVzb3VyY2VtYW5hZ2VyUGFja2FnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwM2UxOWFlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmVzb3VyY2VtYW5hZ2VyL1Jlc291cmNlbWFuYWdlclBhY2thZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzOCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucmVzb3VyY2VtYW5hZ2VyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIFRoZSA8Yj5QYWNrYWdlPC9iPiBmb3IgdGhlIG1vZGVsLgotICogSXQgY29udGFpbnMgYWNjZXNzb3JzIGZvciB0aGUgbWV0YSBvYmplY3RzIHRvIHJlcHJlc2VudAotICogPHVsPgotICogICA8bGk+ZWFjaCBjbGFzcyw8L2xpPgotICogICA8bGk+ZWFjaCBmZWF0dXJlIG9mIGVhY2ggY2xhc3MsPC9saT4KLSAqICAgPGxpPmVhY2ggZW51bSw8L2xpPgotICogICA8bGk+YW5kIGVhY2ggZGF0YSB0eXBlPC9saT4KLSAqIDwvdWw+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlci5SZXNvdXJjZW1hbmFnZXJGYWN0b3J5Ci0gKiBAbW9kZWwga2luZD0icGFja2FnZSIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBSZXNvdXJjZW1hbmFnZXJQYWNrYWdlIGV4dGVuZHMgRVBhY2thZ2UgewotCQotCS8qKgotCSAqIFRoZSBwYWNrYWdlIG5hbWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgU3RyaW5nIGVOQU1FID0gInJlc291cmNlbWFuYWdlciI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSBwYWNrYWdlIG5hbWVzcGFjZSBVUkkuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgU3RyaW5nIGVOU19VUkkgPSAiaHR0cDovLy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Jlc291cmNlbWFuYWdlci5lY29yZSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSBwYWNrYWdlIG5hbWVzcGFjZSBuYW1lLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIFN0cmluZyBlTlNfUFJFRklYID0gIm9yZy5lY2xpcHNlLmVwZi51bWEucmVzb3VyY2VtYW5hZ2VyIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgcGFja2FnZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBSZXNvdXJjZW1hbmFnZXJQYWNrYWdlIGVJTlNUQU5DRSA9IG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuaW1wbC5SZXNvdXJjZW1hbmFnZXJQYWNrYWdlSW1wbC5pbml0KCk7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuaW1wbC5SZXNvdXJjZURlc2NyaXB0b3JJbXBsIDxlbT5SZXNvdXJjZSBEZXNjcmlwdG9yPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlci5pbXBsLlJlc291cmNlRGVzY3JpcHRvckltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuaW1wbC5SZXNvdXJjZW1hbmFnZXJQYWNrYWdlSW1wbCNnZXRSZXNvdXJjZURlc2NyaXB0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBpbnQgUkVTT1VSQ0VfREVTQ1JJUFRPUiA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICAgIGludCBSRVNPVVJDRV9ERVNDUklQVE9SX19JRCA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VXJpPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgICBpbnQgUkVTT1VSQ0VfREVTQ1JJUFRPUl9fVVJJID0gMTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5SZXNvdXJjZSBEZXNjcmlwdG9yPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gICAgaW50IFJFU09VUkNFX0RFU0NSSVBUT1JfRkVBVFVSRV9DT1VOVCA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuaW1wbC5SZXNvdXJjZU1hbmFnZXJJbXBsIDxlbT5SZXNvdXJjZSBNYW5hZ2VyPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlci5pbXBsLlJlc291cmNlTWFuYWdlckltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuaW1wbC5SZXNvdXJjZW1hbmFnZXJQYWNrYWdlSW1wbCNnZXRSZXNvdXJjZU1hbmFnZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBpbnQgUkVTT1VSQ0VfTUFOQUdFUiA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFU09VUkNFX01BTkFHRVJfX0dVSUQgPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVyaSBCYXNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVTT1VSQ0VfTUFOQUdFUl9fVVJJX0JBU0UgPSAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1YiBNYW5hZ2VyczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVTT1VSQ0VfTUFOQUdFUl9fU1VCX01BTkFHRVJTID0gMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXNvdXJjZSBEZXNjcmlwdG9yczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgICBpbnQgUkVTT1VSQ0VfTUFOQUdFUl9fUkVTT1VSQ0VfREVTQ1JJUFRPUlMgPSAzOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlJlc291cmNlIE1hbmFnZXI8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgICBpbnQgUkVTT1VSQ0VfTUFOQUdFUl9GRUFUVVJFX0NPVU5UID0gNDsKLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlci5SZXNvdXJjZURlc2NyaXB0b3IgPGVtPlJlc291cmNlIERlc2NyaXB0b3I8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+UmVzb3VyY2UgRGVzY3JpcHRvcjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuUmVzb3VyY2VEZXNjcmlwdG9yCi0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIEVDbGFzcyBnZXRSZXNvdXJjZURlc2NyaXB0b3IoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlci5SZXNvdXJjZURlc2NyaXB0b3IjZ2V0SWQgPGVtPklkPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SWQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYucmVzb3VyY2VtYW5hZ2VyLlJlc291cmNlRGVzY3JpcHRvciNnZXRJZCgpCi0JICogQHNlZSAjZ2V0UmVzb3VyY2VEZXNjcmlwdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZURlc2NyaXB0b3JfSWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlci5SZXNvdXJjZURlc2NyaXB0b3IjZ2V0VXJpIDxlbT5Vcmk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Vcmk8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYucmVzb3VyY2VtYW5hZ2VyLlJlc291cmNlRGVzY3JpcHRvciNnZXRVcmkoKQotCSAqIEBzZWUgI2dldFJlc291cmNlRGVzY3JpcHRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIEVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VEZXNjcmlwdG9yX1VyaSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlci5SZXNvdXJjZU1hbmFnZXIgPGVtPlJlc291cmNlIE1hbmFnZXI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+UmVzb3VyY2UgTWFuYWdlcjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuUmVzb3VyY2VNYW5hZ2VyCi0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIEVDbGFzcyBnZXRSZXNvdXJjZU1hbmFnZXIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlci5SZXNvdXJjZU1hbmFnZXIjZ2V0R3VpZCA8ZW0+R3VpZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkd1aWQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYucmVzb3VyY2VtYW5hZ2VyLlJlc291cmNlTWFuYWdlciNnZXRHdWlkKCkKLQkgKiBAc2VlICNnZXRSZXNvdXJjZU1hbmFnZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFJlc291cmNlTWFuYWdlcl9HdWlkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuUmVzb3VyY2VNYW5hZ2VyI2dldFVyaUJhc2UgPGVtPlVyaSBCYXNlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VXJpIEJhc2U8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYucmVzb3VyY2VtYW5hZ2VyLlJlc291cmNlTWFuYWdlciNnZXRVcmlCYXNlKCkKLQkgKiBAc2VlICNnZXRSZXNvdXJjZU1hbmFnZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFJlc291cmNlTWFuYWdlcl9VcmlCYXNlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlci5SZXNvdXJjZU1hbmFnZXIjZ2V0U3ViTWFuYWdlcnMgPGVtPlN1YiBNYW5hZ2VyczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+U3ViIE1hbmFnZXJzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlci5SZXNvdXJjZU1hbmFnZXIjZ2V0U3ViTWFuYWdlcnMoKQotCSAqIEBzZWUgI2dldFJlc291cmNlTWFuYWdlcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0UmVzb3VyY2VNYW5hZ2VyX1N1Yk1hbmFnZXJzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlci5SZXNvdXJjZU1hbmFnZXIjZ2V0UmVzb3VyY2VEZXNjcmlwdG9ycyA8ZW0+UmVzb3VyY2UgRGVzY3JpcHRvcnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPlJlc291cmNlIERlc2NyaXB0b3JzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlci5SZXNvdXJjZU1hbmFnZXIjZ2V0UmVzb3VyY2VEZXNjcmlwdG9ycygpCi0JICogQHNlZSAjZ2V0UmVzb3VyY2VNYW5hZ2VyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgRVJlZmVyZW5jZSBnZXRSZXNvdXJjZU1hbmFnZXJfUmVzb3VyY2VEZXNjcmlwdG9ycygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZmFjdG9yeSB0aGF0IGNyZWF0ZXMgdGhlIGluc3RhbmNlcyBvZiB0aGUgbW9kZWwuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBmYWN0b3J5IHRoYXQgY3JlYXRlcyB0aGUgaW5zdGFuY2VzIG9mIHRoZSBtb2RlbC4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgUmVzb3VyY2VtYW5hZ2VyRmFjdG9yeSBnZXRSZXNvdXJjZW1hbmFnZXJGYWN0b3J5KCk7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIERlZmluZXMgbGl0ZXJhbHMgZm9yIHRoZSBtZXRhIG9iamVjdHMgdGhhdCByZXByZXNlbnQKLQkgKiA8dWw+Ci0JICogICA8bGk+ZWFjaCBjbGFzcyw8L2xpPgotCSAqICAgPGxpPmVhY2ggZmVhdHVyZSBvZiBlYWNoIGNsYXNzLDwvbGk+Ci0JICogICA8bGk+ZWFjaCBlbnVtLDwvbGk+Ci0JICogICA8bGk+YW5kIGVhY2ggZGF0YSB0eXBlPC9saT4KLQkgKiA8L3VsPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnRlcmZhY2UgTGl0ZXJhbHMgIHsKLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYucmVzb3VyY2VtYW5hZ2VyLmltcGwuUmVzb3VyY2VEZXNjcmlwdG9ySW1wbCA8ZW0+UmVzb3VyY2UgRGVzY3JpcHRvcjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuaW1wbC5SZXNvdXJjZURlc2NyaXB0b3JJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlci5pbXBsLlJlc291cmNlbWFuYWdlclBhY2thZ2VJbXBsI2dldFJlc291cmNlRGVzY3JpcHRvcigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBSRVNPVVJDRV9ERVNDUklQVE9SID0gZUlOU1RBTkNFLmdldFJlc291cmNlRGVzY3JpcHRvcigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBSRVNPVVJDRV9ERVNDUklQVE9SX19JRCA9IGVJTlNUQU5DRS5nZXRSZXNvdXJjZURlc2NyaXB0b3JfSWQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlVyaTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFJFU09VUkNFX0RFU0NSSVBUT1JfX1VSSSA9IGVJTlNUQU5DRS5nZXRSZXNvdXJjZURlc2NyaXB0b3JfVXJpKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYucmVzb3VyY2VtYW5hZ2VyLmltcGwuUmVzb3VyY2VNYW5hZ2VySW1wbCA8ZW0+UmVzb3VyY2UgTWFuYWdlcjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuaW1wbC5SZXNvdXJjZU1hbmFnZXJJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlci5pbXBsLlJlc291cmNlbWFuYWdlclBhY2thZ2VJbXBsI2dldFJlc291cmNlTWFuYWdlcigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBSRVNPVVJDRV9NQU5BR0VSID0gZUlOU1RBTkNFLmdldFJlc291cmNlTWFuYWdlcigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+R3VpZDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFJFU09VUkNFX01BTkFHRVJfX0dVSUQgPSBlSU5TVEFOQ0UuZ2V0UmVzb3VyY2VNYW5hZ2VyX0d1aWQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlVyaSBCYXNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgUkVTT1VSQ0VfTUFOQUdFUl9fVVJJX0JBU0UgPSBlSU5TVEFOQ0UuZ2V0UmVzb3VyY2VNYW5hZ2VyX1VyaUJhc2UoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlN1YiBNYW5hZ2VyczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgUkVTT1VSQ0VfTUFOQUdFUl9fU1VCX01BTkFHRVJTID0gZUlOU1RBTkNFLmdldFJlc291cmNlTWFuYWdlcl9TdWJNYW5hZ2VycygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UmVzb3VyY2UgRGVzY3JpcHRvcnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFJFU09VUkNFX01BTkFHRVJfX1JFU09VUkNFX0RFU0NSSVBUT1JTID0gZUlOU1RBTkNFLmdldFJlc291cmNlTWFuYWdlcl9SZXNvdXJjZURlc2NyaXB0b3JzKCk7Ci0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmVzb3VyY2VtYW5hZ2VyL2ltcGwvUmVzb3VyY2VEZXNjcmlwdG9ySW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9yZXNvdXJjZW1hbmFnZXIvaW1wbC9SZXNvdXJjZURlc2NyaXB0b3JJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1N2I4OGMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9yZXNvdXJjZW1hbmFnZXIvaW1wbC9SZXNvdXJjZURlc2NyaXB0b3JJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlci5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UuTXVsdGlGaWxlU2F2ZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlci5SZXNvdXJjZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlci5SZXNvdXJjZW1hbmFnZXJQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUuaW1wbC5NdWx0aVJlc291cmNlRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlJlc291cmNlIERlc2NyaXB0b3I8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuaW1wbC5SZXNvdXJjZURlc2NyaXB0b3JJbXBsI2dldElkIDxlbT5JZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlci5pbXBsLlJlc291cmNlRGVzY3JpcHRvckltcGwjZ2V0VXJpIDxlbT5Vcmk8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBSZXNvdXJjZURlc2NyaXB0b3JJbXBsIGV4dGVuZHMgTXVsdGlSZXNvdXJjZUVPYmplY3QgaW1wbGVtZW50cyBSZXNvdXJjZURlc2NyaXB0b3IgewotCQotCS8qKgotCSAqIENvbW1lbnQgZm9yIDxjb2RlPnNlcmlhbFZlcnNpb25VSUQ8L2NvZGU+Ci0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMzI1NjcyNTA4MjY2MjM4NTQ2Mkw7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SWQoKSA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBJRF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJZCgpIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICAgIHByb3RlY3RlZCBTdHJpbmcgaWQgPSBJRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRVcmkoKSA8ZW0+VXJpPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRVcmkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFVSSV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRVcmkoKSA8ZW0+VXJpPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRVcmkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICAgIHByb3RlY3RlZCBTdHJpbmcgdXJpID0gVVJJX0VERUZBVUxUOwotCi0JcHJvdGVjdGVkIFVSSSByZXNvbHZlZFVSSTsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIHByb3RlY3RlZCBSZXNvdXJjZURlc2NyaXB0b3JJbXBsKCkgewotCQlzdXBlcigpOwotICAKLSAvL1VNQS0tPgotIAkJcmVhc3NpZ25EZWZhdWx0VmFsdWVzKCk7Ci0gLy9VTUE8LS0KLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFJlc291cmNlbWFuYWdlclBhY2thZ2UuTGl0ZXJhbHMuUkVTT1VSQ0VfREVTQ1JJUFRPUjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQlyZXR1cm4gaWQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgcHVibGljIHZvaWQgc2V0SWQoU3RyaW5nIG5ld0lkKSB7Ci0JCVN0cmluZyBvbGRJZCA9IGlkOwotCQlpZCA9IG5ld0lkOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBSZXNvdXJjZW1hbmFnZXJQYWNrYWdlLlJFU09VUkNFX0RFU0NSSVBUT1JfX0lELCBvbGRJZCwgaWQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VXJpKCkgewotCQlpZihyZXNvbHZlZFVSSSAhPSBudWxsICYmICh1cmkgPT0gbnVsbCB8fCB1cmkuc3RhcnRzV2l0aCgiLi4vIikpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXVyaSA9IHJlc29sdmVkVVJJLmRlcmVzb2x2ZShNdWx0aUZpbGVTYXZlVXRpbC5nZXRGaW5hbFVSSShlUmVzb3VyY2UoKSkpLnRvU3RyaW5nKCk7Ci0JCX0KLQkJcmV0dXJuIHVyaTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRVcmkoU3RyaW5nIG5ld1VyaSkgewotCQlTdHJpbmcgb2xkVXJpID0gdXJpOwotCQl1cmkgPSBuZXdVcmk7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFJlc291cmNlbWFuYWdlclBhY2thZ2UuUkVTT1VSQ0VfREVTQ1JJUFRPUl9fVVJJLCBvbGRVcmksIHVyaSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgUmVzb3VyY2VtYW5hZ2VyUGFja2FnZS5SRVNPVVJDRV9ERVNDUklQVE9SX19JRDoKLQkJCQlyZXR1cm4gZ2V0SWQoKTsKLQkJCWNhc2UgUmVzb3VyY2VtYW5hZ2VyUGFja2FnZS5SRVNPVVJDRV9ERVNDUklQVE9SX19VUkk6Ci0JCQkJcmV0dXJuIGdldFVyaSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFJlc291cmNlbWFuYWdlclBhY2thZ2UuUkVTT1VSQ0VfREVTQ1JJUFRPUl9fSUQ6Ci0JCQkJc2V0SWQoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBSZXNvdXJjZW1hbmFnZXJQYWNrYWdlLlJFU09VUkNFX0RFU0NSSVBUT1JfX1VSSToKLQkJCQlzZXRVcmkoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgUmVzb3VyY2VtYW5hZ2VyUGFja2FnZS5SRVNPVVJDRV9ERVNDUklQVE9SX19JRDoKLQkJCQlzZXRJZChJRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBSZXNvdXJjZW1hbmFnZXJQYWNrYWdlLlJFU09VUkNFX0RFU0NSSVBUT1JfX1VSSToKLQkJCQlzZXRVcmkoVVJJX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLS8vVU1BLS0+Ci0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gZ2V0RmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWUoZmVhdHVyZUlEKTsKLQkJaWYoZmVhdHVyZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gaXNGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZVNldChmZWF0dXJlKTsKLQkJfQotLy9VTUE8LS0JCQotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBSZXNvdXJjZW1hbmFnZXJQYWNrYWdlLlJFU09VUkNFX0RFU0NSSVBUT1JfX0lEOgotCQkJCXJldHVybiBJRF9FREVGQVVMVCA9PSBudWxsID8gaWQgIT0gbnVsbCA6ICFJRF9FREVGQVVMVC5lcXVhbHMoaWQpOwotCQkJY2FzZSBSZXNvdXJjZW1hbmFnZXJQYWNrYWdlLlJFU09VUkNFX0RFU0NSSVBUT1JfX1VSSToKLQkJCQlyZXR1cm4gVVJJX0VERUZBVUxUID09IG51bGwgPyB1cmkgIT0gbnVsbCA6ICFVUklfRURFRkFVTFQuZXF1YWxzKHVyaSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChpZDogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChpZCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgdXJpOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKHVyaSk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEucmVzb3VyY2VtYW5hZ2VyLlJlc291cmNlRGVzY3JpcHRvciNnZXRVUkkoKQotCSAqLwotCXB1YmxpYyBVUkkgZ2V0UmVzb2x2ZWRVUkkoKSB7Ci0JCWlmKHJlc29sdmVkVVJJID09IG51bGwpIHsKLQkJCVJlc291cmNlIHJlc291cmNlID0gZVJlc291cmNlKCk7Ci0JCQlpZihyZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQkJVVJJIGJhc2UgPSBNdWx0aUZpbGVTYXZlVXRpbC5nZXRGaW5hbFVSSShlUmVzb3VyY2UoKSk7Ci0JCQkJcmVzb2x2ZWRVUkkgPSBVUkkuY3JlYXRlVVJJKGdldFVyaSgpKS5yZXNvbHZlKGJhc2UpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJcmVzb2x2ZWRVUkkgPSBVUkkuY3JlYXRlVVJJKGdldFVyaSgpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzb2x2ZWRVUkk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5yZXNvdXJjZW1hbmFnZXIuUmVzb3VyY2VEZXNjcmlwdG9yI3NldFVSSShvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlc29sdmVkVVJJKFVSSSB1cmkpIHsJCQotCQlyZXNvbHZlZFVSSSA9IHVyaTsKLQkJU3RyaW5nIG5ld1VyaSA9IG51bGw7Ci0JCWlmKHJlc29sdmVkVVJJICE9IG51bGwpIHsKLQkJCVJlc291cmNlIHJlc291cmNlID0gZVJlc291cmNlKCk7CQotCQkJaWYocmVzb3VyY2UgIT0gbnVsbCkgewotCQkJCVVSSSBiYXNlVVJJID0gTXVsdGlGaWxlU2F2ZVV0aWwuZ2V0RmluYWxVUkkocmVzb3VyY2UpOwotCQkJCW5ld1VyaSA9IHJlc29sdmVkVVJJLmRlcmVzb2x2ZShiYXNlVVJJKS50b1N0cmluZygpOwotCQkJfQotCQl9Ci0JCXNldFVyaShuZXdVcmkpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEucmVzb3VyY2VtYW5hZ2VyLlJlc291cmNlRGVzY3JpcHRvciNjbGVhclJlc29sdmVkVVJJKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjbGVhclJlc29sdmVkVVJJKCkgewotCQlyZXNvbHZlZFVSSSA9IG51bGw7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9yZXNvdXJjZW1hbmFnZXIvaW1wbC9SZXNvdXJjZU1hbmFnZXJJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3Jlc291cmNlbWFuYWdlci9pbXBsL1Jlc291cmNlTWFuYWdlckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGYwNjJmZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3Jlc291cmNlbWFuYWdlci9pbXBsL1Jlc291cmNlTWFuYWdlckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucmVzb3VyY2VtYW5hZ2VyLmltcGw7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLk11bHRpRmlsZVNhdmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuUmVzb3VyY2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuUmVzb3VyY2VNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuUmVzb3VyY2VtYW5hZ2VyUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLmltcGwuTXVsdGlSZXNvdXJjZUVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5SZXNvdXJjZSBNYW5hZ2VyPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYucmVzb3VyY2VtYW5hZ2VyLmltcGwuUmVzb3VyY2VNYW5hZ2VySW1wbCNnZXRHdWlkIDxlbT5HdWlkPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYucmVzb3VyY2VtYW5hZ2VyLmltcGwuUmVzb3VyY2VNYW5hZ2VySW1wbCNnZXRVcmlCYXNlIDxlbT5VcmkgQmFzZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlci5pbXBsLlJlc291cmNlTWFuYWdlckltcGwjZ2V0U3ViTWFuYWdlcnMgPGVtPlN1YiBNYW5hZ2VyczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlci5pbXBsLlJlc291cmNlTWFuYWdlckltcGwjZ2V0UmVzb3VyY2VEZXNjcmlwdG9ycyA8ZW0+UmVzb3VyY2UgRGVzY3JpcHRvcnM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBSZXNvdXJjZU1hbmFnZXJJbXBsIGV4dGVuZHMgTXVsdGlSZXNvdXJjZUVPYmplY3QgaW1wbGVtZW50cyBSZXNvdXJjZU1hbmFnZXIgewotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC01MTY0NDcxNDc1NTA5MTY5MjA0TDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRHdWlkKCkgPGVtPkd1aWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEd1aWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEdVSURfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0R3VpZCgpIDxlbT5HdWlkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRHdWlkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGd1aWQgPSBHVUlEX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFVyaUJhc2UoKSA8ZW0+VXJpIEJhc2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFVyaUJhc2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFVSSV9CQVNFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFVyaUJhc2UoKSA8ZW0+VXJpIEJhc2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFVyaUJhc2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgdXJpQmFzZSA9IFVSSV9CQVNFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U3ViTWFuYWdlcnMoKSA8ZW0+U3ViIE1hbmFnZXJzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFN1Yk1hbmFnZXJzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Qgc3ViTWFuYWdlcnMgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVzb3VyY2VEZXNjcmlwdG9ycygpIDxlbT5SZXNvdXJjZSBEZXNjcmlwdG9yczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZXNvdXJjZURlc2NyaXB0b3JzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgICBwcm90ZWN0ZWQgRUxpc3QgcmVzb3VyY2VEZXNjcmlwdG9ycyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqLwotICAgIHByb3RlY3RlZCBSZXNvdXJjZU1hbmFnZXJJbXBsKCkgewotCQlzdXBlcigpOwotCQkKLQkJZ3VpZCA9IFVtYVV0aWwuZ2VuZXJhdGVHVUlEKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBSZXNvdXJjZW1hbmFnZXJQYWNrYWdlLkxpdGVyYWxzLlJFU09VUkNFX01BTkFHRVI7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRHdWlkKCkgewotCQlyZXR1cm4gZ3VpZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRHdWlkKFN0cmluZyBuZXdHdWlkKSB7Ci0JCVN0cmluZyBvbGRHdWlkID0gZ3VpZDsKLQkJZ3VpZCA9IG5ld0d1aWQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFJlc291cmNlbWFuYWdlclBhY2thZ2UuUkVTT1VSQ0VfTUFOQUdFUl9fR1VJRCwgb2xkR3VpZCwgZ3VpZCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VXJpQmFzZSgpIHsKLQkJcmV0dXJuIHVyaUJhc2U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VXJpQmFzZShTdHJpbmcgbmV3VXJpQmFzZSkgewotCQlTdHJpbmcgb2xkVXJpQmFzZSA9IHVyaUJhc2U7Ci0JCXVyaUJhc2UgPSBuZXdVcmlCYXNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBSZXNvdXJjZW1hbmFnZXJQYWNrYWdlLlJFU09VUkNFX01BTkFHRVJfX1VSSV9CQVNFLCBvbGRVcmlCYXNlLCB1cmlCYXNlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0U3ViTWFuYWdlcnMoKSB7Ci0JCWlmIChzdWJNYW5hZ2VycyA9PSBudWxsKSB7Ci0JCQlzdWJNYW5hZ2VycyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdC5SZXNvbHZpbmcoUmVzb3VyY2VNYW5hZ2VyLmNsYXNzLCB0aGlzLCBSZXNvdXJjZW1hbmFnZXJQYWNrYWdlLlJFU09VUkNFX01BTkFHRVJfX1NVQl9NQU5BR0VSUyk7Ci0JCX0KLQkJcmV0dXJuIHN1Yk1hbmFnZXJzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIHB1YmxpYyBMaXN0IGdldFJlc291cmNlRGVzY3JpcHRvcnMoKSB7Ci0JCWlmIChyZXNvdXJjZURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXJlc291cmNlRGVzY3JpcHRvcnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QuUmVzb2x2aW5nKFJlc291cmNlRGVzY3JpcHRvci5jbGFzcywgdGhpcywgUmVzb3VyY2VtYW5hZ2VyUGFja2FnZS5SRVNPVVJDRV9NQU5BR0VSX19SRVNPVVJDRV9ERVNDUklQVE9SUyk7Ci0JCX0KLQkJcmV0dXJuIHJlc291cmNlRGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGd1aWQ6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoZ3VpZCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgdXJpQmFzZTogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZCh1cmlCYXNlKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi0JLy8KLQkvLyBTdGFydCBjdXN0b20gY29kZQotCS8vCi0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBjb20uaWJtLnVtYWYuZWNvcmUuaW1wbC5NdWx0aVJlc291cmNlRU9iamVjdCNlUmVzb2x2ZVByb3h5KG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3QpCi0JICovCi0JcHVibGljIEVPYmplY3QgZVJlc29sdmVQcm94eShJbnRlcm5hbEVPYmplY3QgcHJveHkpIHsKLQkJcmV0dXJuIHN1cGVyLmVSZXNvbHZlUHJveHkocHJveHkpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnJlc291cmNlbWFuYWdlci5SZXNvdXJjZU1hbmFnZXIjcmVzb2x2ZSgpCi0JICovCi0JcHVibGljIHZvaWQgcmVzb2x2ZSgpIHsKLQkJVVJJIGJhc2UgPSBNdWx0aUZpbGVTYXZlVXRpbC5nZXRGaW5hbFVSSShlUmVzb3VyY2UoKSk7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IGdldFJlc291cmNlRGVzY3JpcHRvcnMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgIFJlc291cmNlRGVzY3JpcHRvckltcGwgZGVzYyA9IChSZXNvdXJjZURlc2NyaXB0b3JJbXBsKSBpdGVyLm5leHQoKTsKLSAgICAgICAgICAgIGRlc2MucmVzb2x2ZWRVUkkgPSBVUkkuY3JlYXRlVVJJKGRlc2MuZ2V0VXJpKCkpLnJlc29sdmUoYmFzZSk7Ci0gICAgICAgIH0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnJlc291cmNlbWFuYWdlci5SZXNvdXJjZU1hbmFnZXIjZGVyZXNvbHZlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkZXJlc29sdmUoKSB7Ci0JCVVSSSBiYXNlID0gTXVsdGlGaWxlU2F2ZVV0aWwuZ2V0RmluYWxVUkkoZVJlc291cmNlKCkpOwotICAgICAgICAvLyBjb252ZXJ0IHBhdGggaW4gYWxsIGRlc2NyaXB0b3JzIHRvIHJlbGF0aXZlCi0gICAgICAgIC8vCi0gICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IGdldFJlc291cmNlRGVzY3JpcHRvcnMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgIFJlc291cmNlRGVzY3JpcHRvciBkZXNjID0gKFJlc291cmNlRGVzY3JpcHRvcikgaXRlci5uZXh0KCk7Ci0gICAgICAgICAgICBkZXNjLnNldFVyaShkZXNjLmdldFJlc29sdmVkVVJJKCkuZGVyZXNvbHZlKGJhc2UpLnRvU3RyaW5nKCkpOwotICAgICAgICB9Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEucmVzb3VyY2VtYW5hZ2VyLlJlc291cmNlTWFuYWdlciNyZW1vdmVSZXNvdXJjZURlc2NyaXB0b3Iob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSSwgYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgTGlzdCByZW1vdmVSZXNvdXJjZURlc2NyaXB0b3IoVVJJIHVyaSwgYm9vbGVhbiBjbGVhckZvbGRlcikgewotCQlBcnJheUxpc3QgcmVtb3ZlZExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0vLwkJUmVzb3VyY2VEZXNjcmlwdG9yIHJlbW92ZWREZXNjcmlwdG9yID0gbnVsbDsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gZ2V0UmVzb3VyY2VEZXNjcmlwdG9ycygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgUmVzb3VyY2VEZXNjcmlwdG9yIGRlc2MgPSAoUmVzb3VyY2VEZXNjcmlwdG9yKSBpdGVyLm5leHQoKTsKLSAgICAgICAgICAgIGlmKHVyaS5lcXVhbHMoZGVzYy5nZXRSZXNvbHZlZFVSSSgpLnRyaW1GcmFnbWVudCgpKSkgewotICAgICAgICAgICAgICAgIGl0ZXIucmVtb3ZlKCk7Ci0vLyAgICAgICAgICAgICAgICByZW1vdmVkRGVzY3JpcHRvciA9IGRlc2M7Ci0gICAgICAgICAgICAgICAgcmVtb3ZlZExpc3QuYWRkKGRlc2MpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0vLyAgICAgICAgaWYocmVtb3ZlZERlc2NyaXB0b3IgIT0gbnVsbCkgeyAgICAgICAgCQotICAgICAgICAJaWYoY2xlYXJGb2xkZXIpIHsKLSAgICAgICAgICAgICAgICAvLyByZW1vdmUgYWxsIGNoaWxkIGRlc2NyaXB0b3JzIG9mIHRoZSByZW1vdmVkIGRlc2NyaXB0b3IKLSAgICAgICAgCQkvLwotICAgICAgICAJCVN0cmluZyBvbGREaXIgPSBuZXcgRmlsZSh1cmkudG9GaWxlU3RyaW5nKCkpLmdldFBhcmVudCgpICsgRmlsZS5zZXBhcmF0b3I7Ci0gICAgICAgIAkJZm9yIChJdGVyYXRvciBpdGVyID0gZ2V0UmVzb3VyY2VEZXNjcmlwdG9ycygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotICAgICAgICAJCQlSZXNvdXJjZURlc2NyaXB0b3IgZGVzYyA9IChSZXNvdXJjZURlc2NyaXB0b3IpIGl0ZXIubmV4dCgpOwotICAgICAgICAJCQlpZihkZXNjLmdldFJlc29sdmVkVVJJKCkudG9GaWxlU3RyaW5nKCkuc3RhcnRzV2l0aChvbGREaXIpKSB7Ci0gICAgICAgIAkJCQlpdGVyLnJlbW92ZSgpOwotICAgICAgICAJCQkJcmVtb3ZlZExpc3QuYWRkKGRlc2MpOwotICAgICAgICAJCQl9Ci0gICAgICAgIAkJfQotICAgICAgICAJfQotLy8gICAgICAgIAllbHNlIHsKLS8vICAgICAgICAJCS8vIHJlbW92ZSBhbGwgdGhlIGRlc2NyaXB0b3JzIG9mIHRoZSBzYW1lIHJlc291cmNlCi0vLyAgICAgICAgCQkvLwotLy8gICAgICAgIAkJVVJJIHJlc1VyaSA9IHJlbW92ZWREZXNjcmlwdG9yLmdldFJlc29sdmVkVVJJKCkudHJpbUZyYWdtZW50KCk7Ci0vLyAgICAgICAgCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBnZXRSZXNvdXJjZURlc2NyaXB0b3JzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0vLyAgICAgICAgCQkJUmVzb3VyY2VEZXNjcmlwdG9yIGRlc2MgPSAoUmVzb3VyY2VEZXNjcmlwdG9yKSBpdGVyLm5leHQoKTsKLS8vICAgICAgICAJCQlpZihkZXNjLmdldFJlc29sdmVkVVJJKCkudHJpbUZyYWdtZW50KCkuZXF1YWxzKHJlc1VyaSkpIHsKLS8vICAgICAgICAJCQkJaXRlci5yZW1vdmUoKTsKLS8vICAgICAgICAJCQkJcmVtb3ZlZExpc3QuYWRkKGRlc2MpOwotLy8gICAgICAgIAkJCX0KLS8vICAgICAgICAJCX0gICAgICAgIAkJCi0vLyAgICAgICAgCX0KLS8vICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZW1vdmVkTGlzdDsKLQl9CQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VEZXNjcmlwdG9yIGdldFJlc291cmNlRGVzY3JpcHRvcihTdHJpbmcgZ3VpZCkgewotCQlpZihpZFRvUmVzb3VyY2VEZXNjcmlwdG9yTWFwID09IG51bGwpIHsKLQkJCWlkVG9SZXNvdXJjZURlc2NyaXB0b3JNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQkJCi0JCQllQWRhcHRlcnMoKS5hZGQobmV3IEFkYXB0ZXJJbXBsKCkgewotCQkgICAgICAgIHB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG1zZykgewotCQkgICAgICAgICAgICBSZXNvdXJjZURlc2NyaXB0b3IgZGVzYzsKLQkJICAgICAgICAgICAgc3dpdGNoKG1zZy5nZXRGZWF0dXJlSUQoUmVzb3VyY2VNYW5hZ2VyLmNsYXNzKSkgewotCQkgICAgICAgICAgICAgICAgY2FzZSBSZXNvdXJjZW1hbmFnZXJQYWNrYWdlLlJFU09VUkNFX01BTkFHRVJfX1JFU09VUkNFX0RFU0NSSVBUT1JTOgotCQkgICAgICAgICAgICAgICAgICAgIHN3aXRjaChtc2cuZ2V0RXZlbnRUeXBlKCkpIHsKLQkJICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBOb3RpZmljYXRpb24uQUREOgotCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzYyA9IChSZXNvdXJjZURlc2NyaXB0b3IpbXNnLmdldE5ld1ZhbHVlKCk7Ci0JCQkJCQkJCQlpZFRvUmVzb3VyY2VEZXNjcmlwdG9yTWFwLnB1dChkZXNjLmdldElkKCksIGRlc2MpOwotCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotCQkgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE5vdGlmaWNhdGlvbi5BRERfTUFOWToKLQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9ICgoQ29sbGVjdGlvbiltc2cuZ2V0TmV3VmFsdWUoKSkuaXRlcmF0b3IoKTsgaXRlcgotCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuaGFzTmV4dCgpOykgewotCQkJCQkJCQkJCWRlc2MgPSAoUmVzb3VyY2VEZXNjcmlwdG9yKSBpdGVyLm5leHQoKTsKLQkJCQkJCQkJCQlpZFRvUmVzb3VyY2VEZXNjcmlwdG9yTWFwLnB1dChkZXNjLmdldElkKCksIGRlc2MpOwotCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotCQkgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE5vdGlmaWNhdGlvbi5SRU1PVkU6Ci0JCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZFRvUmVzb3VyY2VEZXNjcmlwdG9yTWFwLnJlbW92ZSgoKFJlc291cmNlRGVzY3JpcHRvciltc2cuZ2V0T2xkVmFsdWUoKSkuZ2V0SWQoKSk7Ci0JCSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0JCSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTm90aWZpY2F0aW9uLlJFTU9WRV9NQU5ZOgotCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gKChDb2xsZWN0aW9uKW1zZy5nZXRPbGRWYWx1ZSgpKS5pdGVyYXRvcigpOyBpdGVyCi0JCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5oYXNOZXh0KCk7KSB7Ci0JCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRUb1Jlc291cmNlRGVzY3JpcHRvck1hcC5yZW1vdmUoKChSZXNvdXJjZURlc2NyaXB0b3IpIGl0ZXIubmV4dCgpKS5nZXRJZCgpKTsKLQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKLQkJICAgICAgICAgICAgICAgICAgICB9Ci0JCSAgICAgICAgICAgIH0KLQkJICAgICAgICB9Ci0KLQkJCX0pOwotCQkJCi0JCQkvLyBwb3B1bGF0ZSB0aGUgbWFwCi0JCQkvLwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gZ2V0UmVzb3VyY2VEZXNjcmlwdG9ycygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCVJlc291cmNlRGVzY3JpcHRvciBlbGVtZW50ID0gKFJlc291cmNlRGVzY3JpcHRvcikgaXRlci5uZXh0KCk7Ci0JCQkJaWRUb1Jlc291cmNlRGVzY3JpcHRvck1hcC5wdXQoZWxlbWVudC5nZXRJZCgpLCBlbGVtZW50KTsKLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIChSZXNvdXJjZURlc2NyaXB0b3IpIGlkVG9SZXNvdXJjZURlc2NyaXB0b3JNYXAuZ2V0KGd1aWQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgUmVzb3VyY2VtYW5hZ2VyUGFja2FnZS5SRVNPVVJDRV9NQU5BR0VSX19TVUJfTUFOQUdFUlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRTdWJNYW5hZ2VycygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIFJlc291cmNlbWFuYWdlclBhY2thZ2UuUkVTT1VSQ0VfTUFOQUdFUl9fUkVTT1VSQ0VfREVTQ1JJUFRPUlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRSZXNvdXJjZURlc2NyaXB0b3JzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBSZXNvdXJjZW1hbmFnZXJQYWNrYWdlLlJFU09VUkNFX01BTkFHRVJfX0dVSUQ6Ci0JCQkJcmV0dXJuIGdldEd1aWQoKTsKLQkJCWNhc2UgUmVzb3VyY2VtYW5hZ2VyUGFja2FnZS5SRVNPVVJDRV9NQU5BR0VSX19VUklfQkFTRToKLQkJCQlyZXR1cm4gZ2V0VXJpQmFzZSgpOwotCQkJY2FzZSBSZXNvdXJjZW1hbmFnZXJQYWNrYWdlLlJFU09VUkNFX01BTkFHRVJfX1NVQl9NQU5BR0VSUzoKLQkJCQlyZXR1cm4gZ2V0U3ViTWFuYWdlcnMoKTsKLQkJCWNhc2UgUmVzb3VyY2VtYW5hZ2VyUGFja2FnZS5SRVNPVVJDRV9NQU5BR0VSX19SRVNPVVJDRV9ERVNDUklQVE9SUzoKLQkJCQlyZXR1cm4gZ2V0UmVzb3VyY2VEZXNjcmlwdG9ycygpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFJlc291cmNlbWFuYWdlclBhY2thZ2UuUkVTT1VSQ0VfTUFOQUdFUl9fR1VJRDoKLQkJCQlzZXRHdWlkKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgUmVzb3VyY2VtYW5hZ2VyUGFja2FnZS5SRVNPVVJDRV9NQU5BR0VSX19VUklfQkFTRToKLQkJCQlzZXRVcmlCYXNlKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgUmVzb3VyY2VtYW5hZ2VyUGFja2FnZS5SRVNPVVJDRV9NQU5BR0VSX19TVUJfTUFOQUdFUlM6Ci0JCQkJZ2V0U3ViTWFuYWdlcnMoKS5jbGVhcigpOwotCQkJCWdldFN1Yk1hbmFnZXJzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFJlc291cmNlbWFuYWdlclBhY2thZ2UuUkVTT1VSQ0VfTUFOQUdFUl9fUkVTT1VSQ0VfREVTQ1JJUFRPUlM6Ci0JCQkJZ2V0UmVzb3VyY2VEZXNjcmlwdG9ycygpLmNsZWFyKCk7Ci0JCQkJZ2V0UmVzb3VyY2VEZXNjcmlwdG9ycygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgUmVzb3VyY2VtYW5hZ2VyUGFja2FnZS5SRVNPVVJDRV9NQU5BR0VSX19HVUlEOgotCQkJCXNldEd1aWQoR1VJRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBSZXNvdXJjZW1hbmFnZXJQYWNrYWdlLlJFU09VUkNFX01BTkFHRVJfX1VSSV9CQVNFOgotCQkJCXNldFVyaUJhc2UoVVJJX0JBU0VfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgUmVzb3VyY2VtYW5hZ2VyUGFja2FnZS5SRVNPVVJDRV9NQU5BR0VSX19TVUJfTUFOQUdFUlM6Ci0JCQkJZ2V0U3ViTWFuYWdlcnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgUmVzb3VyY2VtYW5hZ2VyUGFja2FnZS5SRVNPVVJDRV9NQU5BR0VSX19SRVNPVVJDRV9ERVNDUklQVE9SUzoKLQkJCQlnZXRSZXNvdXJjZURlc2NyaXB0b3JzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLS8vVU1BLS0+Ci0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gZ2V0RmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWUoZmVhdHVyZUlEKTsKLQkJaWYoZmVhdHVyZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gaXNGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZVNldChmZWF0dXJlKTsKLQkJfQotLy9VTUE8LS0JCQotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBSZXNvdXJjZW1hbmFnZXJQYWNrYWdlLlJFU09VUkNFX01BTkFHRVJfX0dVSUQ6Ci0JCQkJcmV0dXJuIEdVSURfRURFRkFVTFQgPT0gbnVsbCA/IGd1aWQgIT0gbnVsbCA6ICFHVUlEX0VERUZBVUxULmVxdWFscyhndWlkKTsKLQkJCWNhc2UgUmVzb3VyY2VtYW5hZ2VyUGFja2FnZS5SRVNPVVJDRV9NQU5BR0VSX19VUklfQkFTRToKLQkJCQlyZXR1cm4gVVJJX0JBU0VfRURFRkFVTFQgPT0gbnVsbCA/IHVyaUJhc2UgIT0gbnVsbCA6ICFVUklfQkFTRV9FREVGQVVMVC5lcXVhbHModXJpQmFzZSk7Ci0JCQljYXNlIFJlc291cmNlbWFuYWdlclBhY2thZ2UuUkVTT1VSQ0VfTUFOQUdFUl9fU1VCX01BTkFHRVJTOgotCQkJCXJldHVybiBzdWJNYW5hZ2VycyAhPSBudWxsICYmICFzdWJNYW5hZ2Vycy5pc0VtcHR5KCk7Ci0JCQljYXNlIFJlc291cmNlbWFuYWdlclBhY2thZ2UuUkVTT1VSQ0VfTUFOQUdFUl9fUkVTT1VSQ0VfREVTQ1JJUFRPUlM6Ci0JCQkJcmV0dXJuIHJlc291cmNlRGVzY3JpcHRvcnMgIT0gbnVsbCAmJiAhcmVzb3VyY2VEZXNjcmlwdG9ycy5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEucmVzb3VyY2VtYW5hZ2VyLlJlc291cmNlTWFuYWdlciNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlpZihpZFRvUmVzb3VyY2VEZXNjcmlwdG9yTWFwICE9IG51bGwpIHsKLQkJCWlkVG9SZXNvdXJjZURlc2NyaXB0b3JNYXAuY2xlYXIoKTsKLQkJCWlkVG9SZXNvdXJjZURlc2NyaXB0b3JNYXAgPSBudWxsOwotCQl9Ci0JCQotCQllQWRhcHRlcnMoKS5jbGVhcigpOwkJCi0JCQotCQkvLyBkaXNwb3NlIHRoZSBzdWIgbWFuYWdlcnMKLQkJLy8KLQkJZm9yIChJdGVyYXRvciBpdGVyID0gKChJbnRlcm5hbEVMaXN0KWdldFN1Yk1hbmFnZXJzKCkpLmJhc2ljSXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlSZXNvdXJjZU1hbmFnZXIgc3ViTWdyID0gKFJlc291cmNlTWFuYWdlcikgaXRlci5uZXh0KCk7Ci0JCQlpZighKChJbnRlcm5hbEVPYmplY3Qpc3ViTWdyKS5lSXNQcm94eSgpKSB7Ci0JCQkJc3ViTWdyLmRpc3Bvc2UoKTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgTWFwIGlkVG9SZXNvdXJjZURlc2NyaXB0b3JNYXA7Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmVzb3VyY2VtYW5hZ2VyL2ltcGwvUmVzb3VyY2VtYW5hZ2VyRmFjdG9yeUltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmVzb3VyY2VtYW5hZ2VyL2ltcGwvUmVzb3VyY2VtYW5hZ2VyRmFjdG9yeUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTdmNWRhYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3Jlc291cmNlbWFuYWdlci9pbXBsL1Jlc291cmNlbWFuYWdlckZhY3RvcnlJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlci5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRUZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5wbHVnaW4uRWNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlci5SZXNvdXJjZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlci5SZXNvdXJjZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlci5SZXNvdXJjZW1hbmFnZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuUmVzb3VyY2VtYW5hZ2VyUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIDxiPkZhY3Rvcnk8L2I+LgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBSZXNvdXJjZW1hbmFnZXJGYWN0b3J5SW1wbCBleHRlbmRzIEVGYWN0b3J5SW1wbCBpbXBsZW1lbnRzIFJlc291cmNlbWFuYWdlckZhY3RvcnkgewotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIGRlZmF1bHQgZmFjdG9yeSBpbXBsZW1lbnRhdGlvbi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFJlc291cmNlbWFuYWdlckZhY3RvcnkgaW5pdCgpIHsKLQkJdHJ5IHsKLQkJCVJlc291cmNlbWFuYWdlckZhY3RvcnkgdGhlUmVzb3VyY2VtYW5hZ2VyRmFjdG9yeSA9IChSZXNvdXJjZW1hbmFnZXJGYWN0b3J5KUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVGYWN0b3J5KCJodHRwOi8vL29yZy9lY2xpcHNlL2VwZi91bWEvcmVzb3VyY2VtYW5hZ2VyLmVjb3JlIik7IC8vJE5PTi1OTFMtMSQgCi0JCQlpZiAodGhlUmVzb3VyY2VtYW5hZ2VyRmFjdG9yeSAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIHRoZVJlc291cmNlbWFuYWdlckZhY3Rvcnk7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLQkJCUVjb3JlUGx1Z2luLklOU1RBTkNFLmxvZyhleGNlcHRpb24pOwotCQl9Ci0JCXJldHVybiBuZXcgUmVzb3VyY2VtYW5hZ2VyRmFjdG9yeUltcGwoKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBmYWN0b3J5LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIHB1YmxpYyBSZXNvdXJjZW1hbmFnZXJGYWN0b3J5SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBwdWJsaWMgRU9iamVjdCBjcmVhdGUoRUNsYXNzIGVDbGFzcykgewotCQlzd2l0Y2ggKGVDbGFzcy5nZXRDbGFzc2lmaWVySUQoKSkgewotCQkJY2FzZSBSZXNvdXJjZW1hbmFnZXJQYWNrYWdlLlJFU09VUkNFX0RFU0NSSVBUT1I6IHJldHVybiAoRU9iamVjdCljcmVhdGVSZXNvdXJjZURlc2NyaXB0b3IoKTsKLQkJCWNhc2UgUmVzb3VyY2VtYW5hZ2VyUGFja2FnZS5SRVNPVVJDRV9NQU5BR0VSOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlUmVzb3VyY2VNYW5hZ2VyKCk7Ci0JCQlkZWZhdWx0OgotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBjbGFzcyAnIiArIGVDbGFzcy5nZXROYW1lKCkgKyAiJyBpcyBub3QgYSB2YWxpZCBjbGFzc2lmaWVyIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgcHVibGljIFJlc291cmNlRGVzY3JpcHRvciBjcmVhdGVSZXNvdXJjZURlc2NyaXB0b3IoKSB7Ci0JCVJlc291cmNlRGVzY3JpcHRvckltcGwgcmVzb3VyY2VEZXNjcmlwdG9yID0gbmV3IFJlc291cmNlRGVzY3JpcHRvckltcGwoKTsKLQkJcmV0dXJuIHJlc291cmNlRGVzY3JpcHRvcjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBwdWJsaWMgUmVzb3VyY2VNYW5hZ2VyIGNyZWF0ZVJlc291cmNlTWFuYWdlcigpIHsKLQkJUmVzb3VyY2VNYW5hZ2VySW1wbCByZXNvdXJjZU1hbmFnZXIgPSBuZXcgUmVzb3VyY2VNYW5hZ2VySW1wbCgpOwotCQlyZXR1cm4gcmVzb3VyY2VNYW5hZ2VyOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIHB1YmxpYyBSZXNvdXJjZW1hbmFnZXJQYWNrYWdlIGdldFJlc291cmNlbWFuYWdlclBhY2thZ2UoKSB7Ci0JCXJldHVybiAoUmVzb3VyY2VtYW5hZ2VyUGFja2FnZSlnZXRFUGFja2FnZSgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGRlcHJlY2F0ZWQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgcHVibGljIHN0YXRpYyBSZXNvdXJjZW1hbmFnZXJQYWNrYWdlIGdldFBhY2thZ2UoKSB7Ci0JCXJldHVybiBSZXNvdXJjZW1hbmFnZXJQYWNrYWdlLmVJTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmVzb3VyY2VtYW5hZ2VyL2ltcGwvUmVzb3VyY2VtYW5hZ2VyUGFja2FnZUltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmVzb3VyY2VtYW5hZ2VyL2ltcGwvUmVzb3VyY2VtYW5hZ2VyUGFja2FnZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODQ1YjcyOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3Jlc291cmNlbWFuYWdlci9pbXBsL1Jlc291cmNlbWFuYWdlclBhY2thZ2VJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlci5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRVBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuUmVzb3VyY2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuUmVzb3VyY2VNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuUmVzb3VyY2VtYW5hZ2VyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmVzb3VyY2VtYW5hZ2VyLlJlc291cmNlbWFuYWdlclBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCA8Yj5QYWNrYWdlPC9iPi4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUmVzb3VyY2VtYW5hZ2VyUGFja2FnZUltcGwgZXh0ZW5kcyBFUGFja2FnZUltcGwgaW1wbGVtZW50cyBSZXNvdXJjZW1hbmFnZXJQYWNrYWdlIHsKLQkKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBwcml2YXRlIEVDbGFzcyByZXNvdXJjZURlc2NyaXB0b3JFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgcHJpdmF0ZSBFQ2xhc3MgcmVzb3VyY2VNYW5hZ2VyRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIG1vZGVsIDxiPlBhY2thZ2U8L2I+LCByZWdpc3RlcmVkIHdpdGgKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlLlJlZ2lzdHJ5IEVQYWNrYWdlLlJlZ2lzdHJ5fSBieSB0aGUgcGFja2FnZQotCSAqIHBhY2thZ2UgVVJJIHZhbHVlLgotCSAqIDxwPk5vdGU6IHRoZSBjb3JyZWN0IHdheSB0byBjcmVhdGUgdGhlIHBhY2thZ2UgaXMgdmlhIHRoZSBzdGF0aWMKLQkgKiBmYWN0b3J5IG1ldGhvZCB7QGxpbmsgI2luaXQgaW5pdCgpfSwgd2hpY2ggYWxzbyBwZXJmb3JtcwotCSAqIGluaXRpYWxpemF0aW9uIG9mIHRoZSBwYWNrYWdlLCBvciByZXR1cm5zIHRoZSByZWdpc3RlcmVkIHBhY2thZ2UsCi0JICogaWYgb25lIGFscmVhZHkgZXhpc3RzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2UuUmVnaXN0cnkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuUmVzb3VyY2VtYW5hZ2VyUGFja2FnZSNlTlNfVVJJCi0JICogQHNlZSAjaW5pdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIHByaXZhdGUgUmVzb3VyY2VtYW5hZ2VyUGFja2FnZUltcGwoKSB7Ci0JCXN1cGVyKGVOU19VUkksIFJlc291cmNlbWFuYWdlckZhY3RvcnkuZUlOU1RBTkNFKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzSW5pdGVkID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBDcmVhdGVzLCByZWdpc3RlcnMsIGFuZCBpbml0aWFsaXplcyB0aGUgPGI+UGFja2FnZTwvYj4gZm9yIHRoaXMKLQkgKiBtb2RlbCwgYW5kIGZvciBhbnkgb3RoZXJzIHVwb24gd2hpY2ggaXQgZGVwZW5kcy4gIFNpbXBsZQotCSAqIGRlcGVuZGVuY2llcyBhcmUgc2F0aXNmaWVkIGJ5IGNhbGxpbmcgdGhpcyBtZXRob2Qgb24gYWxsCi0JICogZGVwZW5kZW50IHBhY2thZ2VzIGJlZm9yZSBkb2luZyBhbnl0aGluZyBlbHNlLiAgVGhpcyBtZXRob2QgZHJpdmVzCi0JICogaW5pdGlhbGl6YXRpb24gZm9yIGludGVyZGVwZW5kZW50IHBhY2thZ2VzIGRpcmVjdGx5LCBpbiBwYXJhbGxlbAotCSAqIHdpdGggdGhpcyBwYWNrYWdlLCBpdHNlbGYuCi0JICogPHA+T2YgdGhpcyBwYWNrYWdlIGFuZCBpdHMgaW50ZXJkZXBlbmRlbmNpZXMsIGFsbCBwYWNrYWdlcyB3aGljaAotCSAqIGhhdmUgbm90IHlldCBiZWVuIHJlZ2lzdGVyZWQgYnkgdGhlaXIgVVJJIHZhbHVlcyBhcmUgZmlyc3QgY3JlYXRlZAotCSAqIGFuZCByZWdpc3RlcmVkLiAgVGhlIHBhY2thZ2VzIGFyZSB0aGVuIGluaXRpYWxpemVkIGluIHR3byBzdGVwczoKLQkgKiBtZXRhLW1vZGVsIG9iamVjdHMgZm9yIGFsbCBvZiB0aGUgcGFja2FnZXMgYXJlIGNyZWF0ZWQgYmVmb3JlIGFueQotCSAqIGFyZSBpbml0aWFsaXplZCwgc2luY2Ugb25lIHBhY2thZ2UncyBtZXRhLW1vZGVsIG9iamVjdHMgbWF5IHJlZmVyIHRvCi0JICogdGhvc2Ugb2YgYW5vdGhlci4KLQkgKiA8cD5JbnZvY2F0aW9uIG9mIHRoaXMgbWV0aG9kIHdpbGwgbm90IGFmZmVjdCBhbnkgcGFja2FnZXMgdGhhdCBoYXZlCi0JICogYWxyZWFkeSBiZWVuIGluaXRpYWxpemVkLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZU5TX1VSSQotCSAqIEBzZWUgI2NyZWF0ZVBhY2thZ2VDb250ZW50cygpCi0JICogQHNlZSAjaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIHB1YmxpYyBzdGF0aWMgUmVzb3VyY2VtYW5hZ2VyUGFja2FnZSBpbml0KCkgewotCQlpZiAoaXNJbml0ZWQpIHJldHVybiAoUmVzb3VyY2VtYW5hZ2VyUGFja2FnZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShSZXNvdXJjZW1hbmFnZXJQYWNrYWdlLmVOU19VUkkpOwotCi0JCS8vIE9idGFpbiBvciBjcmVhdGUgYW5kIHJlZ2lzdGVyIHBhY2thZ2UKLQkJUmVzb3VyY2VtYW5hZ2VyUGFja2FnZUltcGwgdGhlUmVzb3VyY2VtYW5hZ2VyUGFja2FnZSA9IChSZXNvdXJjZW1hbmFnZXJQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoZU5TX1VSSSkgaW5zdGFuY2VvZiBSZXNvdXJjZW1hbmFnZXJQYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKGVOU19VUkkpIDogbmV3IFJlc291cmNlbWFuYWdlclBhY2thZ2VJbXBsKCkpOwotCi0JCWlzSW5pdGVkID0gdHJ1ZTsKLQotCQkvLyBDcmVhdGUgcGFja2FnZSBtZXRhLWRhdGEgb2JqZWN0cwotCQl0aGVSZXNvdXJjZW1hbmFnZXJQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCi0JCS8vIEluaXRpYWxpemUgY3JlYXRlZCBtZXRhLWRhdGEKLQkJdGhlUmVzb3VyY2VtYW5hZ2VyUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0KLQkJLy8gTWFyayBtZXRhLWRhdGEgdG8gaW5kaWNhdGUgaXQgY2FuJ3QgYmUgY2hhbmdlZAotCQl0aGVSZXNvdXJjZW1hbmFnZXJQYWNrYWdlLmZyZWV6ZSgpOwotCi0JCXJldHVybiB0aGVSZXNvdXJjZW1hbmFnZXJQYWNrYWdlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIHB1YmxpYyBFQ2xhc3MgZ2V0UmVzb3VyY2VEZXNjcmlwdG9yKCkgewotCQlyZXR1cm4gcmVzb3VyY2VEZXNjcmlwdG9yRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIHB1YmxpYyBFQXR0cmlidXRlIGdldFJlc291cmNlRGVzY3JpcHRvcl9JZCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXJlc291cmNlRGVzY3JpcHRvckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIHB1YmxpYyBFQXR0cmlidXRlIGdldFJlc291cmNlRGVzY3JpcHRvcl9VcmkoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlyZXNvdXJjZURlc2NyaXB0b3JFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBwdWJsaWMgRUNsYXNzIGdldFJlc291cmNlTWFuYWdlcigpIHsKLQkJcmV0dXJuIHJlc291cmNlTWFuYWdlckVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZU1hbmFnZXJfR3VpZCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXJlc291cmNlTWFuYWdlckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFJlc291cmNlTWFuYWdlcl9VcmlCYXNlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcmVzb3VyY2VNYW5hZ2VyRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0UmVzb3VyY2VNYW5hZ2VyX1N1Yk1hbmFnZXJzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpcmVzb3VyY2VNYW5hZ2VyRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgcHVibGljIEVSZWZlcmVuY2UgZ2V0UmVzb3VyY2VNYW5hZ2VyX1Jlc291cmNlRGVzY3JpcHRvcnMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlyZXNvdXJjZU1hbmFnZXJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBwdWJsaWMgUmVzb3VyY2VtYW5hZ2VyRmFjdG9yeSBnZXRSZXNvdXJjZW1hbmFnZXJGYWN0b3J5KCkgewotCQlyZXR1cm4gKFJlc291cmNlbWFuYWdlckZhY3RvcnkpZ2V0RUZhY3RvcnlJbnN0YW5jZSgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBpc0NyZWF0ZWQgPSBmYWxzZTsKLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIG1ldGEtbW9kZWwgb2JqZWN0cyBmb3IgdGhlIHBhY2thZ2UuICBUaGlzIG1ldGhvZCBpcwotCSAqIGd1YXJkZWQgdG8gaGF2ZSBubyBhZmZlY3Qgb24gYW55IGludm9jYXRpb24gYnV0IGl0cyBmaXJzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBwdWJsaWMgdm9pZCBjcmVhdGVQYWNrYWdlQ29udGVudHMoKSB7Ci0JCWlmIChpc0NyZWF0ZWQpIHJldHVybjsKLQkJaXNDcmVhdGVkID0gdHJ1ZTsKLQotCQkvLyBDcmVhdGUgY2xhc3NlcyBhbmQgdGhlaXIgZmVhdHVyZXMKLQkJcmVzb3VyY2VEZXNjcmlwdG9yRUNsYXNzID0gY3JlYXRlRUNsYXNzKFJFU09VUkNFX0RFU0NSSVBUT1IpOwotCQljcmVhdGVFQXR0cmlidXRlKHJlc291cmNlRGVzY3JpcHRvckVDbGFzcywgUkVTT1VSQ0VfREVTQ1JJUFRPUl9fSUQpOwotCQljcmVhdGVFQXR0cmlidXRlKHJlc291cmNlRGVzY3JpcHRvckVDbGFzcywgUkVTT1VSQ0VfREVTQ1JJUFRPUl9fVVJJKTsKLQotCQlyZXNvdXJjZU1hbmFnZXJFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUkVTT1VSQ0VfTUFOQUdFUik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocmVzb3VyY2VNYW5hZ2VyRUNsYXNzLCBSRVNPVVJDRV9NQU5BR0VSX19HVUlEKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShyZXNvdXJjZU1hbmFnZXJFQ2xhc3MsIFJFU09VUkNFX01BTkFHRVJfX1VSSV9CQVNFKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShyZXNvdXJjZU1hbmFnZXJFQ2xhc3MsIFJFU09VUkNFX01BTkFHRVJfX1NVQl9NQU5BR0VSUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UocmVzb3VyY2VNYW5hZ2VyRUNsYXNzLCBSRVNPVVJDRV9NQU5BR0VSX19SRVNPVVJDRV9ERVNDUklQVE9SUyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzSW5pdGlhbGl6ZWQgPSBmYWxzZTsKLQotCS8qKgotCSAqIENvbXBsZXRlIHRoZSBpbml0aWFsaXphdGlvbiBvZiB0aGUgcGFja2FnZSBhbmQgaXRzIG1ldGEtbW9kZWwuICBUaGlzCi0JICogbWV0aG9kIGlzIGd1YXJkZWQgdG8gaGF2ZSBubyBhZmZlY3Qgb24gYW55IGludm9jYXRpb24gYnV0IGl0cyBmaXJzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBwdWJsaWMgdm9pZCBpbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCkgewotCQlpZiAoaXNJbml0aWFsaXplZCkgcmV0dXJuOwotCQlpc0luaXRpYWxpemVkID0gdHJ1ZTsKLQotCQkvLyBJbml0aWFsaXplIHBhY2thZ2UKLQkJc2V0TmFtZShlTkFNRSk7Ci0JCXNldE5zUHJlZml4KGVOU19QUkVGSVgpOwotCQlzZXROc1VSSShlTlNfVVJJKTsKLQotCQkvLyBBZGQgc3VwZXJ0eXBlcyB0byBjbGFzc2VzCi0KLQkJLy8gSW5pdGlhbGl6ZSBjbGFzc2VzIGFuZCBmZWF0dXJlczsgYWRkIG9wZXJhdGlvbnMgYW5kIHBhcmFtZXRlcnMKLQkJaW5pdEVDbGFzcyhyZXNvdXJjZURlc2NyaXB0b3JFQ2xhc3MsIFJlc291cmNlRGVzY3JpcHRvci5jbGFzcywgIlJlc291cmNlRGVzY3JpcHRvciIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRSZXNvdXJjZURlc2NyaXB0b3JfSWQoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImlkIiwgbnVsbCwgMCwgMSwgUmVzb3VyY2VEZXNjcmlwdG9yLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldFJlc291cmNlRGVzY3JpcHRvcl9VcmkoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgInVyaSIsIG51bGwsIDAsIDEsIFJlc291cmNlRGVzY3JpcHRvci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MocmVzb3VyY2VNYW5hZ2VyRUNsYXNzLCBSZXNvdXJjZU1hbmFnZXIuY2xhc3MsICJSZXNvdXJjZU1hbmFnZXIiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UmVzb3VyY2VNYW5hZ2VyX0d1aWQoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImd1aWQiLCBudWxsLCAwLCAxLCBSZXNvdXJjZU1hbmFnZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UmVzb3VyY2VNYW5hZ2VyX1VyaUJhc2UoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgInVyaUJhc2UiLCBudWxsLCAwLCAxLCBSZXNvdXJjZU1hbmFnZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0UmVzb3VyY2VNYW5hZ2VyX1N1Yk1hbmFnZXJzKCksIHRoaXMuZ2V0UmVzb3VyY2VNYW5hZ2VyKCksIG51bGwsICJzdWJNYW5hZ2VycyIsIG51bGwsIDAsIC0xLCBSZXNvdXJjZU1hbmFnZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRSZXNvdXJjZU1hbmFnZXJfUmVzb3VyY2VEZXNjcmlwdG9ycygpLCB0aGlzLmdldFJlc291cmNlRGVzY3JpcHRvcigpLCBudWxsLCAicmVzb3VyY2VEZXNjcmlwdG9ycyIsIG51bGwsIDAsIC0xLCBSZXNvdXJjZU1hbmFnZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCi0JCUVPcGVyYXRpb24gb3AgPSBhZGRFT3BlcmF0aW9uKHJlc291cmNlTWFuYWdlckVDbGFzcywgdGhpcy5nZXRSZXNvdXJjZURlc2NyaXB0b3IoKSwgImdldFJlc291cmNlRGVzY3JpcHRvciIsIDAsIDEpOyAvLyROT04tTkxTLTEkCi0JCWFkZEVQYXJhbWV0ZXIob3AsIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJndWlkIiwgMCwgMSk7IC8vJE5PTi1OTFMtMSQKLQotCQkvLyBDcmVhdGUgcmVzb3VyY2UKLQkJY3JlYXRlUmVzb3VyY2UoZU5TX1VSSSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3Jlc291cmNlbWFuYWdlci9pbXBsL3BhY2thZ2UuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmVzb3VyY2VtYW5hZ2VyL2ltcGwvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNGIwZDM2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmVzb3VyY2VtYW5hZ2VyL2ltcGwvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgdGhlIGltcGxlbWVudGF0aW9uIGZvciBtYW5hZ2luZyBYTUkgcmVzb3VyY2VzIGluIGEgbWV0aG9kIGxpYnJhcnkuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9yZXNvdXJjZW1hbmFnZXIvcGFja2FnZS5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9yZXNvdXJjZW1hbmFnZXIvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNGFmYzUzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmVzb3VyY2VtYW5hZ2VyL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIHRoZSBpbnRlcmZhY2VzIGZvciBtYW5hZ2luZyBYTUkgcmVzb3VyY2VzIGluIGEgbWV0aG9kIGxpYnJhcnkuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9yZXNvdXJjZW1hbmFnZXIvcmVzb3VyY2VtYW5hZ2VyLmVjb3JlIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9yZXNvdXJjZW1hbmFnZXIvcmVzb3VyY2VtYW5hZ2VyLmVjb3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNDFjOGI1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmVzb3VyY2VtYW5hZ2VyL3Jlc291cmNlbWFuYWdlci5lY29yZQorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZWNvcmU6RVBhY2thZ2UgeG1pOnZlcnNpb249IjIuMCIKLSAgICB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgeG1sbnM6ZWNvcmU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUiIG5hbWU9InJlc291cmNlbWFuYWdlciIKLSAgICBuc1VSST0iaHR0cDovLy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Jlc291cmNlbWFuYWdlci5lY29yZSIgbnNQcmVmaXg9Im9yZy5lY2xpcHNlLmVwZi51bWEucmVzb3VyY2VtYW5hZ2VyIj4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJSZXNvdXJjZURlc2NyaXB0b3IiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpZCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ1cmkiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUmVzb3VyY2VNYW5hZ2VyIj4KLSAgICA8ZU9wZXJhdGlvbnMgbmFtZT0iZ2V0UmVzb3VyY2VEZXNjcmlwdG9yIiBlVHlwZT0iIy8vUmVzb3VyY2VEZXNjcmlwdG9yIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iR2V0cyBkaXJlY3QgUmVzb3VyY2VEZXNjcmlwdG9yIHdob3NlIGlkIGlzIHRoZSBnaXZlbiBndWlkIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlUGFyYW1ldGVycyBuYW1lPSJndWlkIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgPC9lT3BlcmF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZ3VpZCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ1cmlCYXNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InN1Yk1hbmFnZXJzIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL1Jlc291cmNlTWFuYWdlciIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icmVzb3VyY2VEZXNjcmlwdG9ycyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9SZXNvdXJjZURlc2NyaXB0b3IiIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotPC9lY29yZTpFUGFja2FnZT4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmVzb3VyY2VtYW5hZ2VyL3Jlc291cmNlbWFuYWdlci5nZW5tb2RlbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmVzb3VyY2VtYW5hZ2VyL3Jlc291cmNlbWFuYWdlci5nZW5tb2RlbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWNiNzljNy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3Jlc291cmNlbWFuYWdlci9yZXNvdXJjZW1hbmFnZXIuZ2VubW9kZWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGdlbm1vZGVsOkdlbk1vZGVsIHhtaTp2ZXJzaW9uPSIyLjAiCi0gICAgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczplY29yZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSIKLSAgICB4bWxuczpnZW5tb2RlbD0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCIgbW9kZWxEaXJlY3Rvcnk9Ii9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMiCi0gICAgZWRpdERpcmVjdG9yeT0iL29yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuZWRpdC9zcmMiIGVkaXRvckRpcmVjdG9yeT0iL29yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuZWRpdG9yL3NyYyIKLSAgICBtb2RlbFBsdWdpbklEPSJvcmcuZWNsaXBzZS5lcGYucmVzb3VyY2VtYW5hZ2VyIiB0ZW1wbGF0ZURpcmVjdG9yeT0iL29yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUvdGVtcGxhdGVzIgotICAgIHJ1bnRpbWVKYXI9InRydWUiIGR5bmFtaWNUZW1wbGF0ZXM9InRydWUiIG1vZGVsTmFtZT0iUmVzb3VyY2VtYW5hZ2VyIiBlZGl0UGx1Z2luQ2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIucHJvdmlkZXIuUmVzb3VyY2VtYW5hZ2VyRWRpdFBsdWdpbiIKLSAgICBlZGl0b3JQbHVnaW5DbGFzcz0ib3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlci5wcmVzZW50YXRpb24uUmVzb3VyY2VtYW5hZ2VyRWRpdG9yUGx1Z2luIgotICAgIG5vbk5MU01hcmtlcnM9InRydWUiIHJvb3RFeHRlbmRzSW50ZXJmYWNlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuc2RvLkVEYXRhT2JqZWN0IgotICAgIHJvb3RFeHRlbmRzQ2xhc3M9Im9yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUuaW1wbC5NdWx0aVJlc291cmNlRU9iamVjdCIgcm9vdEltcGxlbWVudHNJbnRlcmZhY2U9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5zZG8uSW50ZXJuYWxFRGF0YU9iamVjdCIKLSAgICBzdXBwcmVzc0VNRlR5cGVzPSJ0cnVlIiBmZWF0dXJlTWFwV3JhcHBlckludGVyZmFjZT0iY29tbW9uai5zZG8uU2VxdWVuY2UiIGZlYXR1cmVNYXBXcmFwcGVySW50ZXJuYWxJbnRlcmZhY2U9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5zZG8udXRpbC5FU2VxdWVuY2UiCi0gICAgZmVhdHVyZU1hcFdyYXBwZXJDbGFzcz0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnNkby51dGlsLkJhc2ljRVNlcXVlbmNlIiBjb250YWlubWVudFByb3hpZXM9InRydWUiPgotICA8Zm9yZWlnbk1vZGVsPkM6XENDX1ZpZXdzXHBsZV9UTkdfQXV0aG9yaW5nXHRuZ19hdXRob3JpbmdcVE5HIFVNTCBNb2RlbHNccmVzb3VyY2VtYW5hZ2VyLm1kbDwvZm9yZWlnbk1vZGVsPgotICA8c3RhdGljUGFja2FnZXM+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9TRE88L3N0YXRpY1BhY2thZ2VzPgotICA8bW9kZWxQbHVnaW5WYXJpYWJsZXM+RU1GX0NPTU1PTkpfU0RPPW9yZy5lY2xpcHNlLmVtZi5jb21tb25qLnNkbzwvbW9kZWxQbHVnaW5WYXJpYWJsZXM+Ci0gIDxtb2RlbFBsdWdpblZhcmlhYmxlcz5FTUZfRUNPUkVfU0RPPW9yZy5lY2xpcHNlLmVtZi5lY29yZS5zZG88L21vZGVsUGx1Z2luVmFyaWFibGVzPgotICA8Z2VuUGFja2FnZXMgcHJlZml4PSJSZXNvdXJjZW1hbmFnZXIiIGJhc2VQYWNrYWdlPSJvcmcuZWNsaXBzZS5lcGYiIGVjb3JlUGFja2FnZT0icmVzb3VyY2VtYW5hZ2VyLmVjb3JlIy8iPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InJlc291cmNlbWFuYWdlci5lY29yZSMvL1Jlc291cmNlRGVzY3JpcHRvciI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgcmVzb3VyY2VtYW5hZ2VyLmVjb3JlIy8vUmVzb3VyY2VEZXNjcmlwdG9yL2lkIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgcmVzb3VyY2VtYW5hZ2VyLmVjb3JlIy8vUmVzb3VyY2VEZXNjcmlwdG9yL3VyaSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJyZXNvdXJjZW1hbmFnZXIuZWNvcmUjLy9SZXNvdXJjZU1hbmFnZXIiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHJlc291cmNlbWFuYWdlci5lY29yZSMvL1Jlc291cmNlTWFuYWdlci9ndWlkIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgcmVzb3VyY2VtYW5hZ2VyLmVjb3JlIy8vUmVzb3VyY2VNYW5hZ2VyL3VyaUJhc2UiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgcmVzb3VyY2VtYW5hZ2VyLmVjb3JlIy8vUmVzb3VyY2VNYW5hZ2VyL3N1Yk1hbmFnZXJzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHJlc291cmNlbWFuYWdlci5lY29yZSMvL1Jlc291cmNlTWFuYWdlci9yZXNvdXJjZURlc2NyaXB0b3JzIi8+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0icmVzb3VyY2VtYW5hZ2VyLmVjb3JlIy8vUmVzb3VyY2VNYW5hZ2VyL2dldFJlc291cmNlRGVzY3JpcHRvciI+Ci0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJyZXNvdXJjZW1hbmFnZXIuZWNvcmUjLy9SZXNvdXJjZU1hbmFnZXIvZ2V0UmVzb3VyY2VEZXNjcmlwdG9yL2d1aWQiLz4KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gIDwvZ2VuUGFja2FnZXM+Ci08L2dlbm1vZGVsOkdlbk1vZGVsPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9yZXNvdXJjZW1hbmFnZXIvdXRpbC9SZXNvdXJjZW1hbmFnZXJBZGFwdGVyRmFjdG9yeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9yZXNvdXJjZW1hbmFnZXIvdXRpbC9SZXNvdXJjZW1hbmFnZXJBZGFwdGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MzMwZDVkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmVzb3VyY2VtYW5hZ2VyL3V0aWwvUmVzb3VyY2VtYW5hZ2VyQWRhcHRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucmVzb3VyY2VtYW5hZ2VyLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuUmVzb3VyY2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuUmVzb3VyY2VNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuUmVzb3VyY2VtYW5hZ2VyUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogVGhlIDxiPkFkYXB0ZXIgRmFjdG9yeTwvYj4gZm9yIHRoZSBtb2RlbC4KLSAqIEl0IHByb3ZpZGVzIGFuIGFkYXB0ZXIgPGNvZGU+Y3JlYXRlWFhYPC9jb2RlPiBtZXRob2QgZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuUmVzb3VyY2VtYW5hZ2VyUGFja2FnZQotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUmVzb3VyY2VtYW5hZ2VyQWRhcHRlckZhY3RvcnkgZXh0ZW5kcyBBZGFwdGVyRmFjdG9yeUltcGwgewotCQotCS8qKgotCSAqIFRoZSBjYWNoZWQgbW9kZWwgcGFja2FnZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIFJlc291cmNlbWFuYWdlclBhY2thZ2UgbW9kZWxQYWNrYWdlOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgYWRhcHRlciBmYWN0b3J5LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIHB1YmxpYyBSZXNvdXJjZW1hbmFnZXJBZGFwdGVyRmFjdG9yeSgpIHsKLQkJaWYgKG1vZGVsUGFja2FnZSA9PSBudWxsKSB7Ci0JCQltb2RlbFBhY2thZ2UgPSBSZXNvdXJjZW1hbmFnZXJQYWNrYWdlLmVJTlNUQU5DRTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGlzIGZhY3RvcnkgaXMgYXBwbGljYWJsZSBmb3IgdGhlIHR5cGUgb2YgdGhlIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgb2JqZWN0IGlzIGVpdGhlciB0aGUgbW9kZWwncyBwYWNrYWdlIG9yIGlzIGFuIGluc3RhbmNlIG9iamVjdCBvZiB0aGUgbW9kZWwuCi0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoaXMgZmFjdG9yeSBpcyBhcHBsaWNhYmxlIGZvciB0aGUgdHlwZSBvZiB0aGUgb2JqZWN0LgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0ZhY3RvcnlGb3JUeXBlKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKG9iamVjdCA9PSBtb2RlbFBhY2thZ2UpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBFT2JqZWN0KSB7Ci0JCQlyZXR1cm4gKChFT2JqZWN0KW9iamVjdCkuZUNsYXNzKCkuZ2V0RVBhY2thZ2UoKSA9PSBtb2RlbFBhY2thZ2U7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFRoZSBzd2l0Y2ggdGhlIGRlbGVnYXRlcyB0byB0aGUgPGNvZGU+Y3JlYXRlWFhYPC9jb2RlPiBtZXRob2RzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIHByb3RlY3RlZCBSZXNvdXJjZW1hbmFnZXJTd2l0Y2ggbW9kZWxTd2l0Y2ggPQotCQluZXcgUmVzb3VyY2VtYW5hZ2VyU3dpdGNoKCkgewotCQkJcHVibGljIE9iamVjdCBjYXNlUmVzb3VyY2VEZXNjcmlwdG9yKFJlc291cmNlRGVzY3JpcHRvciBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlUmVzb3VyY2VEZXNjcmlwdG9yQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlUmVzb3VyY2VNYW5hZ2VyKFJlc291cmNlTWFuYWdlciBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlUmVzb3VyY2VNYW5hZ2VyQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBkZWZhdWx0Q2FzZShFT2JqZWN0IG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVFT2JqZWN0QWRhcHRlcigpOwotCQkJfQotCQl9OwotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBhZGFwdGVyIGZvciB0aGUgPGNvZGU+dGFyZ2V0PC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB0YXJnZXQgdGhlIG9iamVjdCB0byBhZGFwdC4KLQkgKiBAcmV0dXJuIHRoZSBhZGFwdGVyIGZvciB0aGUgPGNvZGU+dGFyZ2V0PC9jb2RlPi4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgcHVibGljIEFkYXB0ZXIgY3JlYXRlQWRhcHRlcihOb3RpZmllciB0YXJnZXQpIHsKLQkJcmV0dXJuIChBZGFwdGVyKW1vZGVsU3dpdGNoLmRvU3dpdGNoKChFT2JqZWN0KXRhcmdldCk7Ci0JfQotCi0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuUmVzb3VyY2VEZXNjcmlwdG9yIDxlbT5SZXNvdXJjZSBEZXNjcmlwdG9yPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLSAgICAgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuUmVzb3VyY2VEZXNjcmlwdG9yCi0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIHB1YmxpYyBBZGFwdGVyIGNyZWF0ZVJlc291cmNlRGVzY3JpcHRvckFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlci5SZXNvdXJjZU1hbmFnZXIgPGVtPlJlc291cmNlIE1hbmFnZXI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotICAgICAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlci5SZXNvdXJjZU1hbmFnZXIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgcHVibGljIEFkYXB0ZXIgY3JlYXRlUmVzb3VyY2VNYW5hZ2VyQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciB0aGUgZGVmYXVsdCBjYXNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbC4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgcHVibGljIEFkYXB0ZXIgY3JlYXRlRU9iamVjdEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9yZXNvdXJjZW1hbmFnZXIvdXRpbC9SZXNvdXJjZW1hbmFnZXJTd2l0Y2guamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmVzb3VyY2VtYW5hZ2VyL3V0aWwvUmVzb3VyY2VtYW5hZ2VyU3dpdGNoLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwYTQ3YzMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9yZXNvdXJjZW1hbmFnZXIvdXRpbC9SZXNvdXJjZW1hbmFnZXJTd2l0Y2guamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucmVzb3VyY2VtYW5hZ2VyLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlci5SZXNvdXJjZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlci5SZXNvdXJjZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlci5SZXNvdXJjZW1hbmFnZXJQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBUaGUgPGI+U3dpdGNoPC9iPiBmb3IgdGhlIG1vZGVsJ3MgaW5oZXJpdGFuY2UgaGllcmFyY2h5LgotICogSXQgc3VwcG9ydHMgdGhlIGNhbGwge0BsaW5rICNkb1N3aXRjaChFT2JqZWN0KSBkb1N3aXRjaChvYmplY3QpfQotICogdG8gaW52b2tlIHRoZSA8Y29kZT5jYXNlWFhYPC9jb2RlPiBtZXRob2QgZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsLAotICogc3RhcnRpbmcgd2l0aCB0aGUgYWN0dWFsIGNsYXNzIG9mIHRoZSBvYmplY3QKLSAqIGFuZCBwcm9jZWVkaW5nIHVwIHRoZSBpbmhlcml0YW5jZSBoaWVyYXJjaHkKLSAqIHVudGlsIGEgbm9uLW51bGwgcmVzdWx0IGlzIHJldHVybmVkLAotICogd2hpY2ggaXMgdGhlIHJlc3VsdCBvZiB0aGUgc3dpdGNoLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuUmVzb3VyY2VtYW5hZ2VyUGFja2FnZQotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUmVzb3VyY2VtYW5hZ2VyU3dpdGNoIHsKLQkKLQkvKioKLQkgKiBUaGUgY2FjaGVkIG1vZGVsIHBhY2thZ2UKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIFJlc291cmNlbWFuYWdlclBhY2thZ2UgbW9kZWxQYWNrYWdlOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgc3dpdGNoLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIHB1YmxpYyBSZXNvdXJjZW1hbmFnZXJTd2l0Y2goKSB7Ci0JCWlmIChtb2RlbFBhY2thZ2UgPT0gbnVsbCkgewotCQkJbW9kZWxQYWNrYWdlID0gUmVzb3VyY2VtYW5hZ2VyUGFja2FnZS5lSU5TVEFOQ0U7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDYWxscyA8Y29kZT5jYXNlWFhYPC9jb2RlPiBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwgdW50aWwgb25lIHJldHVybnMgYSBub24gbnVsbCByZXN1bHQ7IGl0IHlpZWxkcyB0aGF0IHJlc3VsdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIGZpcnN0IG5vbi1udWxsIHJlc3VsdCByZXR1cm5lZCBieSBhIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGNhbGwuCi0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIHB1YmxpYyBPYmplY3QgZG9Td2l0Y2goRU9iamVjdCB0aGVFT2JqZWN0KSB7Ci0JCXJldHVybiBkb1N3aXRjaCh0aGVFT2JqZWN0LmVDbGFzcygpLCB0aGVFT2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBDYWxscyA8Y29kZT5jYXNlWFhYPC9jb2RlPiBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwgdW50aWwgb25lIHJldHVybnMgYSBub24gbnVsbCByZXN1bHQ7IGl0IHlpZWxkcyB0aGF0IHJlc3VsdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIGZpcnN0IG5vbi1udWxsIHJlc3VsdCByZXR1cm5lZCBieSBhIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGNhbGwuCi0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIHByb3RlY3RlZCBPYmplY3QgZG9Td2l0Y2goRUNsYXNzIHRoZUVDbGFzcywgRU9iamVjdCB0aGVFT2JqZWN0KSB7Ci0JCWlmICh0aGVFQ2xhc3MuZUNvbnRhaW5lcigpID09IG1vZGVsUGFja2FnZSkgewotCQkJcmV0dXJuIGRvU3dpdGNoKHRoZUVDbGFzcy5nZXRDbGFzc2lmaWVySUQoKSwgdGhlRU9iamVjdCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlMaXN0IGVTdXBlclR5cGVzID0gdGhlRUNsYXNzLmdldEVTdXBlclR5cGVzKCk7Ci0JCQlyZXR1cm4KLQkJCQllU3VwZXJUeXBlcy5pc0VtcHR5KCkgPwotCQkJCQlkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KSA6Ci0JCQkJCWRvU3dpdGNoKChFQ2xhc3MpZVN1cGVyVHlwZXMuZ2V0KDApLCB0aGVFT2JqZWN0KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENhbGxzIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbCB1bnRpbCBvbmUgcmV0dXJucyBhIG5vbiBudWxsIHJlc3VsdDsgaXQgeWllbGRzIHRoYXQgcmVzdWx0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgZmlyc3Qgbm9uLW51bGwgcmVzdWx0IHJldHVybmVkIGJ5IGEgPGNvZGU+Y2FzZVhYWDwvY29kZT4gY2FsbC4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgcHJvdGVjdGVkIE9iamVjdCBkb1N3aXRjaChpbnQgY2xhc3NpZmllcklELCBFT2JqZWN0IHRoZUVPYmplY3QpIHsKLQkJc3dpdGNoIChjbGFzc2lmaWVySUQpIHsKLQkJCWNhc2UgUmVzb3VyY2VtYW5hZ2VyUGFja2FnZS5SRVNPVVJDRV9ERVNDUklQVE9SOiB7Ci0JCQkJUmVzb3VyY2VEZXNjcmlwdG9yIHJlc291cmNlRGVzY3JpcHRvciA9IChSZXNvdXJjZURlc2NyaXB0b3IpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZVJlc291cmNlRGVzY3JpcHRvcihyZXNvdXJjZURlc2NyaXB0b3IpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgUmVzb3VyY2VtYW5hZ2VyUGFja2FnZS5SRVNPVVJDRV9NQU5BR0VSOiB7Ci0JCQkJUmVzb3VyY2VNYW5hZ2VyIHJlc291cmNlTWFuYWdlciA9IChSZXNvdXJjZU1hbmFnZXIpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZVJlc291cmNlTWFuYWdlcihyZXNvdXJjZU1hbmFnZXIpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWRlZmF1bHQ6IHJldHVybiBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5SZXNvdXJjZSBEZXNjcmlwdG9yPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0gICAgICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlJlc291cmNlIERlc2NyaXB0b3I8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIHB1YmxpYyBPYmplY3QgY2FzZVJlc291cmNlRGVzY3JpcHRvcihSZXNvdXJjZURlc2NyaXB0b3Igb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5SZXNvdXJjZSBNYW5hZ2VyPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0gICAgICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlJlc291cmNlIE1hbmFnZXI8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIHB1YmxpYyBPYmplY3QgY2FzZVJlc291cmNlTWFuYWdlcihSZXNvdXJjZU1hbmFnZXIgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FT2JqZWN0PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0gICAgICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2gsIGJ1dCB0aGlzIGlzIHRoZSBsYXN0IGNhc2UgYW55d2F5LgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FT2JqZWN0PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGRlZmF1bHRDYXNlKEVPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9yZXNvdXJjZW1hbmFnZXIvdXRpbC9wYWNrYWdlLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3Jlc291cmNlbWFuYWdlci91dGlsL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjU4N2Q2Zi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3Jlc291cmNlbWFuYWdlci91dGlsL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIGltcGxlbWVudGF0aW9uIHN1cHBvcnQgZm9yIG1hbmFnaW5nIFhNSSByZXNvdXJjZXMgaW4gYSBtZXRob2QgbGlicmFyeS4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS54bWkvLmNsYXNzcGF0aCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLnhtaS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTFjOGYyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLnhtaS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkueG1pLy5wcm9qZWN0IGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkueG1pLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjY2NiM2RjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLnhtaS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLnhtaTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS54bWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS54bWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxNWFhZmMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkueG1pL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLnhtaTtzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjUuMC5xdWFsaWZpZXIKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLnhtaS5YTUlMaWJyYXJ5VUlQbHVnaW4KLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLAotIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZSwKLSBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLAotIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLAotIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaSwKLSBvcmcuZWNsaXBzZS5lcGYudWksCi0gb3JnLmVjbGlwc2UudWksCi0gb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aSwKLSBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aQotRWNsaXBzZS1MYXp5U3RhcnQ6IHRydWUKLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS54bWkKLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkueG1pL2J1aWxkLnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS54bWkvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzJiYWZkNS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS54bWkvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotc291cmNlLi4gPSBzcmMvCi1vdXRwdXQuLiA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IC4sXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLnhtaS9wbHVnaW4ucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLnhtaS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWEyNmNhOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS54bWkvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUgotCi0jIFBsdWctaW4KLXBsdWdpbk5hbWU9RVBGIFhNSSBMaWJyYXJ5IFVJCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKLW5ld1hNSUxpYnJhcnlXaXphcmRQYWdlVGl0bGU9Q3JlYXRlIGEgbmV3IFhNSSBtZXRob2QgbGlicmFyeS4KLW5ld1hNSUxpYnJhcnlXaXphcmRQYWdlRGVzY3JpcHRpb249U3BlY2lmeSB0aGUgbG9jYXRpb24gZm9yIHRoZSBtZXRob2QgbGlicmFyeS4gVGhlIG1ldGhvZCBsaWJyYXJ5IGNvbnRlbnQgd2lsbCBiZSBzdG9yZWQgaW4gYSBmb2xkZXIsIG5hbWVkIGFmdGVyIHRoZSBsaWJyYXJ5LCBhdCB0aGUgc3BlY2lmaWVkIGxvY2F0aW9uLgotb3BlblhNSUxpYnJhcnlXaXphcmRQYWdlVGl0bGU9T3BlbiBhIFhNSSBtZXRob2QgbGlicmFyeS4KLW9wZW5YTUlMaWJyYXJ5V2l6YXJkUGFnZURlc2NyaXB0aW9uPVNwZWNpZnkgdGhlIGxvY2F0aW9uIGZvciB0aGUgbWV0aG9kIGxpYnJhcnkuClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkueG1pL3BsdWdpbi54bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS54bWkvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDdiZWU5My4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS54bWkvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08cGx1Z2luPgotCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkubmV3TGlicmFyeVdpemFyZFBhZ2VzIj4KLSAgICAgIDxuZXdMaWJyYXJ5V2l6YXJkUGFnZQotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLnhtaS5OZXdYTUlMaWJyYXJ5V2l6YXJkUGFnZSIKLSAgICAgICAgICAgIHR5cGU9InhtaSIKLSAgICAgICAgICAgIHRpdGxlPSIlbmV3WE1JTGlicmFyeVdpemFyZFBhZ2VUaXRsZSIKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uPSIlbmV3WE1JTGlicmFyeVdpemFyZFBhZ2VEZXNjcmlwdGlvbiI+Ci0gICAgICA8L25ld0xpYnJhcnlXaXphcmRQYWdlPgotICAgPC9leHRlbnNpb24+Ci0gICAKLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5vcGVuTGlicmFyeVdpemFyZFBhZ2VzIj4KLSAgICAgIDxvcGVuTGlicmFyeVdpemFyZFBhZ2UKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS54bWkuT3BlblhNSUxpYnJhcnlXaXphcmRQYWdlIgotICAgICAgICAgICAgdHlwZT0ieG1pIgotICAgICAgICAgICAgdGl0bGU9IiVvcGVuWE1JTGlicmFyeVdpemFyZFBhZ2VUaXRsZSIKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uPSIlb3BlblhNSUxpYnJhcnlXaXphcmRQYWdlRGVzY3JpcHRpb24iPgotICAgICAgPC9vcGVuTGlicmFyeVdpemFyZFBhZ2U+Ci0gICA8L2V4dGVuc2lvbj4gICAKLQotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLm1pZ3JhdG9ycyI+Ci0gICAgICA8bWlncmF0b3IKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS54bWkuaW50ZXJuYWwubWlncmF0aW9uLk1pZ3JhdG9yMTAyXzEwMyIKLSAgICAgICAgICAgIGxpYk5zVVJJPSJodHRwOi8vd3d3LmlibS5jb20vdW1hLzEuMC4yL3VtYS5lY29yZSIvPgotICAgICAgPG1pZ3JhdG9yCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkueG1pLmludGVybmFsLm1pZ3JhdGlvbi5NaWdyYXRvcjEwMyIKLSAgICAgICAgICAgIGxpYk5zVVJJPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjMvdW1hLmVjb3JlIi8+Ci0gICA8L2V4dGVuc2lvbj4KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkueG1pL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS94bWkvTmV3WE1JTGlicmFyeVdpemFyZFBhZ2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLnhtaS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkveG1pL05ld1hNSUxpYnJhcnlXaXphcmRQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmNjAwOGUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkueG1pL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS94bWkvTmV3WE1JTGlicmFyeVdpemFyZFBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS54bWk7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLndpemFyZHMuTmV3TGlicmFyeVdpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pLlhNSUxpYnJhcnlNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS5wcmVmZXJlbmNlcy5YTUlMaWJyYXJ5UHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlyZWN0b3J5RGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci0KLS8qKgotICogUHJvbXB0cyB0aGUgdXNlciB0byBzZWxlY3QgYSBwYXRoIGZvciBhIFhNSSBtZXRob2QgbGlicmFyeS4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBOZXdYTUlMaWJyYXJ5V2l6YXJkUGFnZSBleHRlbmRzIE5ld0xpYnJhcnlXaXphcmRQYWdlIHsKLQotCXByaXZhdGUgVGV4dCBuYW1lVGV4dDsKLQotCXByaXZhdGUgQ29tYm8gbG9jYXRpb25Db21ibzsKLQotCXByaXZhdGUgTW9kaWZ5TGlzdGVuZXIgbW9kaWZ5TGlzdGVuZXIgPSBuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotCQkJc2V0UGFnZUNvbXBsZXRlKGlzUGFnZUNvbXBsZXRlKCkpOwotCQkJZ2V0V2l6YXJkKCkuZ2V0Q29udGFpbmVyKCkudXBkYXRlQnV0dG9ucygpOwotCQl9Ci0JfTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIE5ld1hNSUxpYnJhcnlXaXphcmRQYWdlKFN0cmluZyBwYWdlSWQpIHsKLQkJc3VwZXIocGFnZUlkKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ1BhZ2UjY3JlYXRlQ29udHJvbChDb21wb3NpdGUpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDMsIGZhbHNlKSk7Ci0KLQkJTGFiZWwgbmFtZUxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PUk1BTCk7Ci0JCW5hbWVMYWJlbC5zZXRUZXh0KFhNSUxpYnJhcnlVSVJlc291cmNlcy5uYW1lTGFiZWxfdGV4dCk7Ci0KLQkJbmFtZVRleHQgPSBuZXcgVGV4dChjb21wb3NpdGUsIFNXVC5CT1JERVIpOwotCQluYW1lVGV4dC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJbmFtZVRleHQuc2V0RWRpdGFibGUoZmFsc2UpOwotCi0JCW5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT1JNQUwpOwotCi0JCUxhYmVsIGxvY2F0aW9uTGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWxvY2F0aW9uTGFiZWwuc2V0VGV4dChYTUlMaWJyYXJ5VUlSZXNvdXJjZXMubG9jYXRpb25MYWJlbF90ZXh0KTsKLQotCQlsb2NhdGlvbkNvbWJvID0gbmV3IENvbWJvKGNvbXBvc2l0ZSwgU1dULkJPUkRFUik7Ci0JCWxvY2F0aW9uQ29tYm8uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCWxvY2F0aW9uQ29tYm8uYWRkTW9kaWZ5TGlzdGVuZXIobW9kaWZ5TGlzdGVuZXIpOwotCQlsb2NhdGlvbkNvbWJvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlzZXRQYWdlQ29tcGxldGUoaXNQYWdlQ29tcGxldGUoKSk7Ci0JCQkJZ2V0V2l6YXJkKCkuZ2V0Q29udGFpbmVyKCkudXBkYXRlQnV0dG9ucygpOwotCQkJfQotCQl9KTsKLQotCQlmaW5hbCBTaGVsbCBzaGVsbCA9IHBhcmVudC5nZXRTaGVsbCgpOwotCi0JCWZpbmFsIEJ1dHRvbiBicm93c2VCdXR0b24gPSBuZXcgQnV0dG9uKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlicm93c2VCdXR0b24uc2V0VGV4dChYTUlMaWJyYXJ5VUlSZXNvdXJjZXMuYnJvd3NlQnV0dG9uX3RleHQpOwotCQlicm93c2VCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCXRyeSB7Ci0JCQkJCURpcmVjdG9yeURpYWxvZyBkaWFsb2cgPSBuZXcgRGlyZWN0b3J5RGlhbG9nKHNoZWxsLAotCQkJCQkJCVNXVC5OT05FKTsKLQkJCQkJU3RyaW5nIHNlbGVjdGVkRGlyID0gZGlhbG9nLm9wZW4oKTsKLQkJCQkJaWYgKHNlbGVjdGVkRGlyICE9IG51bGwpIHsKLQkJCQkJCWxvY2F0aW9uQ29tYm8uYWRkKHNlbGVjdGVkRGlyLCAwKTsKLQkJCQkJCWxvY2F0aW9uQ29tYm8uc2V0VGV4dChzZWxlY3RlZERpcik7Ci0JCQkJCX0KLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCi0JCWZpbmFsIEJ1dHRvbiBkZWZhdWx0UGF0aENoZWNrYm94ID0gbmV3IEJ1dHRvbihjb21wb3NpdGUsIFNXVC5DSEVDSyk7Ci0JCWRlZmF1bHRQYXRoQ2hlY2tib3gKLQkJCQkuc2V0VGV4dChYTUlMaWJyYXJ5VUlSZXNvdXJjZXMuZGVmYXVsdFBhdGhDaGVja2JveExhYmVsX3RleHQpOwotCQlkZWZhdWx0UGF0aENoZWNrYm94LmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlpZiAoZGVmYXVsdFBhdGhDaGVja2JveC5nZXRTZWxlY3Rpb24oKSkgewotCQkJCQlsb2NhdGlvbkNvbWJvLnJlbW92ZU1vZGlmeUxpc3RlbmVyKG1vZGlmeUxpc3RlbmVyKTsKLQkJCQkJbG9jYXRpb25Db21iby5zZXRUZXh0KFhNSUxpYnJhcnlQcmVmZXJlbmNlcwotCQkJCQkJCS5nZXREZWZhdWx0TGlicmFyeVBhdGgoKSk7Ci0JCQkJCWxvY2F0aW9uQ29tYm8uYWRkTW9kaWZ5TGlzdGVuZXIobW9kaWZ5TGlzdGVuZXIpOwotCQkJCQlsb2NhdGlvbkNvbWJvLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCQlicm93c2VCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJbG9jYXRpb25Db21iby5zZXRFbmFibGVkKHRydWUpOwotCQkJCQlicm93c2VCdXR0b24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JCXNldFBhZ2VDb21wbGV0ZSh0cnVlKTsKLQkJc2V0Q29udHJvbChjb21wb3NpdGUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVpLndpemFyZHMuQmFzZVdpemFyZFBhZ2Ujb25FbnRlclBhZ2UoT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIG9uRW50ZXJQYWdlKE9iamVjdCBvYmopIHsKLQkJaWYgKG9iaiAhPSBudWxsICYmIG9iaiBpbnN0YW5jZW9mIFN0cmluZykgewotCQkJU3RyaW5nIGxpYnJhcnlOYW1lID0gKFN0cmluZykgb2JqOwotCQkJbmFtZVRleHQuc2V0VGV4dChsaWJyYXJ5TmFtZSk7Ci0JCX0KLQotCQlpZiAoZ2V0TGlicmFyeVBhdGgoKS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQlsb2NhdGlvbkNvbWJvLnJlbW92ZU1vZGlmeUxpc3RlbmVyKG1vZGlmeUxpc3RlbmVyKTsKLQkJCWxvY2F0aW9uQ29tYm8KLQkJCQkJLnNldFRleHQoWE1JTGlicmFyeVByZWZlcmVuY2VzLmdldERlZmF1bHRMaWJyYXJ5UGF0aCgpKTsKLQkJCWxvY2F0aW9uQ29tYm8uYWRkTW9kaWZ5TGlzdGVuZXIobW9kaWZ5TGlzdGVuZXIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkUGFnZSNpc0NvbXBsZXRlZCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNQYWdlQ29tcGxldGUoKSB7Ci0JCXJldHVybiBnZXRMaWJyYXJ5UGF0aCgpLmxlbmd0aCgpID4gMCAmJiBnZXRMaWJyYXJ5TmFtZSgpLmxlbmd0aCgpID4gMDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlI2dldE5leHRQYWdlKCkKLQkgKi8KLQlwdWJsaWMgSVdpemFyZFBhZ2UgZ2V0TmV4dFBhZ2UoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGxpYnJhcnkgbmFtZS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExpYnJhcnlOYW1lKCkgewotCQlyZXR1cm4gbmFtZVRleHQuZ2V0VGV4dCgpLnRyaW0oKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBsaWJyYXJ5IHBhdGguCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMaWJyYXJ5UGF0aCgpIHsKLQkJcmV0dXJuIGxvY2F0aW9uQ29tYm8uZ2V0VGV4dCgpLnRyaW0oKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBsaWJyYXJ5IHNwZWNpZmljIHVzZXIgc2VsZWN0aW9ucy4KLQkgKi8KLQlwdWJsaWMgTWFwIGdldFNlbGVjdGlvbnMoKSB7Ci0JCU1hcCBvcHRpb25zID0gbmV3IEhhc2hNYXAoKTsKLQkJRmlsZSBsaWJyYXJ5UGF0aCA9IG5ldyBGaWxlKGdldExpYnJhcnlQYXRoKCksIGdldExpYnJhcnlOYW1lKCkpOwotCQlvcHRpb25zLnB1dChYTUlMaWJyYXJ5TWFuYWdlci5BUkdfTElCUkFSWV9QQVRILCBsaWJyYXJ5UGF0aAotCQkJCS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0JCXJldHVybiBvcHRpb25zOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkueG1pL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS94bWkvT3BlblhNSUxpYnJhcnlXaXphcmRQYWdlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS54bWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL3htaS9PcGVuWE1JTGlicmFyeVdpemFyZFBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjE1NmVjOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS54bWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL3htaS9PcGVuWE1JTGlicmFyeVdpemFyZFBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS54bWk7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLndpemFyZHMuT3BlbkxpYnJhcnlXaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS5YTUlMaWJyYXJ5TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkucHJlZmVyZW5jZXMuWE1JTGlicmFyeVByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXJlY3RvcnlEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci0KLS8qKgotICogUHJvbXB0cyB0aGUgdXNlciB0byBzZWxlY3QgYSBwYXRoIGZvciBhIFhNSSBtZXRob2QgbGlicmFyeS4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBPcGVuWE1JTGlicmFyeVdpemFyZFBhZ2UgZXh0ZW5kcyBPcGVuTGlicmFyeVdpemFyZFBhZ2UgewotCi0JcHJpdmF0ZSBDb21ibyBsb2NhdGlvbkNvbWJvOwotCi0JcHJpdmF0ZSBNb2RpZnlMaXN0ZW5lciBtb2RpZnlMaXN0ZW5lciA9IG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0JCQlzZXRQYWdlQ29tcGxldGUoaXNQYWdlQ29tcGxldGUoKSk7Ci0JCQlnZXRXaXphcmQoKS5nZXRDb250YWluZXIoKS51cGRhdGVCdXR0b25zKCk7Ci0JCX0KLQl9OwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgT3BlblhNSUxpYnJhcnlXaXphcmRQYWdlKFN0cmluZyBwYWdlSWQpIHsKLQkJc3VwZXIocGFnZUlkKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ1BhZ2UjY3JlYXRlQ29udHJvbChDb21wb3NpdGUpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDMsIGZhbHNlKSk7Ci0KLQkJY3JlYXRlTGFiZWwoY29tcG9zaXRlLCBYTUlMaWJyYXJ5VUlSZXNvdXJjZXMubG9jYXRpb25MYWJlbF90ZXh0KTsKLQotCQlsb2NhdGlvbkNvbWJvID0gY3JlYXRlQ29tYm9ib3goY29tcG9zaXRlKTsKLQkJbG9jYXRpb25Db21iby5hZGRNb2RpZnlMaXN0ZW5lcihtb2RpZnlMaXN0ZW5lcik7Ci0JCWxvY2F0aW9uQ29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCXNldFBhZ2VDb21wbGV0ZShpc1BhZ2VDb21wbGV0ZSgpKTsKLQkJCQlnZXRXaXphcmQoKS5nZXRDb250YWluZXIoKS51cGRhdGVCdXR0b25zKCk7Ci0JCQl9Ci0JCX0pOwotCi0JCWZpbmFsIFNoZWxsIHNoZWxsID0gcGFyZW50LmdldFNoZWxsKCk7Ci0KLQkJZmluYWwgQnV0dG9uIGJyb3dzZUJ1dHRvbiA9IGNyZWF0ZUJ1dHRvbihjb21wb3NpdGUsCi0JCQkJWE1JTGlicmFyeVVJUmVzb3VyY2VzLmJyb3dzZUJ1dHRvbl90ZXh0KTsKLQkJYnJvd3NlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQl0cnkgewotCQkJCQlEaXJlY3RvcnlEaWFsb2cgZGlhbG9nID0gbmV3IERpcmVjdG9yeURpYWxvZyhzaGVsbCwKLQkJCQkJCQlTV1QuTk9ORSk7Ci0JCQkJCWRpYWxvZy5zZXRGaWx0ZXJQYXRoKGdldExpYnJhcnlQYXRoKCkpOwotCQkJCQlTdHJpbmcgc2VsZWN0ZWREaXIgPSBkaWFsb2cub3BlbigpOwotCQkJCQlpZiAoc2VsZWN0ZWREaXIgIT0gbnVsbCkgewotCQkJCQkJbG9jYXRpb25Db21iby5hZGQoc2VsZWN0ZWREaXIsIDApOwotCQkJCQkJbG9jYXRpb25Db21iby5zZXRUZXh0KHNlbGVjdGVkRGlyKTsKLQkJCQkJfQotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQotCQlzZXRQYWdlQ29tcGxldGUodHJ1ZSk7Ci0JCXNldENvbnRyb2woY29tcG9zaXRlKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51aS53aXphcmRzLkJhc2VXaXphcmRQYWdlI29uRW50ZXJQYWdlKE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBvbkVudGVyUGFnZShPYmplY3Qgb2JqKSB7Ci0JCWlmIChnZXRMaWJyYXJ5UGF0aCgpLmxlbmd0aCgpID09IDApIHsKLQkJCWxvY2F0aW9uQ29tYm8ucmVtb3ZlTW9kaWZ5TGlzdGVuZXIobW9kaWZ5TGlzdGVuZXIpOwotCQkJbG9jYXRpb25Db21ibwotCQkJCQkuc2V0VGV4dChYTUlMaWJyYXJ5UHJlZmVyZW5jZXMuZ2V0RGVmYXVsdExpYnJhcnlQYXRoKCkpOwotCQkJbG9jYXRpb25Db21iby5hZGRNb2RpZnlMaXN0ZW5lcihtb2RpZnlMaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlI2lzQ29tcGxldGVkKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1BhZ2VDb21wbGV0ZSgpIHsKLQkJcmV0dXJuIGdldExpYnJhcnlQYXRoKCkubGVuZ3RoKCkgPiAwOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2UjZ2V0TmV4dFBhZ2UoKQotCSAqLwotCXB1YmxpYyBJV2l6YXJkUGFnZSBnZXROZXh0UGFnZSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbGlicmFyeSBwYXRoLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TGlicmFyeVBhdGgoKSB7Ci0JCXJldHVybiBsb2NhdGlvbkNvbWJvLmdldFRleHQoKS50cmltKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbGlicmFyeSBzcGVjaWZpYyB1c2VyIHNlbGVjdGlvbnMuCi0JICovCi0JcHVibGljIE1hcCBnZXRTZWxlY3Rpb25zKCkgewotCQlNYXAgb3B0aW9ucyA9IG5ldyBIYXNoTWFwKCk7Ci0JCUZpbGUgbGlicmFyeVBhdGggPSBuZXcgRmlsZShnZXRMaWJyYXJ5UGF0aCgpKTsKLQkJb3B0aW9ucy5wdXQoWE1JTGlicmFyeU1hbmFnZXIuQVJHX0xJQlJBUllfUEFUSCwgbGlicmFyeVBhdGgKLQkJCQkuZ2V0QWJzb2x1dGVQYXRoKCkpOwotCQlyZXR1cm4gb3B0aW9uczsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLnhtaS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkveG1pL1Jlc291cmNlcy5wcm9wZXJ0aWVzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkueG1pL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS94bWkvUmVzb3VyY2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExNzM1YTkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkueG1pL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS94bWkvUmVzb3VyY2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUgotCi0jIE1ldGhvZCBFbGVtZW50IE5hbWVzIChTaW5ndWxhcikKLW5hbWVMYWJlbF90ZXh0PU5hbWU6Ci1sb2NhdGlvbkxhYmVsX3RleHQ9TG9jYXRpb246Ci1icm93c2VCdXR0b25fdGV4dD1Ccm93c2UuLi4KLWRlZmF1bHRQYXRoQ2hlY2tib3hMYWJlbF90ZXh0PVVzZSB0aGUgZGVmYXVsdCBkaXJlY3RvcnkuCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS54bWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL3htaS9YTUlMaWJyYXJ5VUlQbHVnaW4uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLnhtaS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkveG1pL1hNSUxpYnJhcnlVSVBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZWFlMzVkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLnhtaS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkveG1pL1hNSUxpYnJhcnlVSVBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkueG1pOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS5BYnN0cmFjdFBsdWdpbjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotLyoqCi0gKiBUaGUgYWN0aXZhdG9yIGNsYXNzIGZvciB0aGUgPGNvZGU+b3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkueG1pPC9jb2RlPgotICogcGx1Zy1pbi4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBYTUlMaWJyYXJ5VUlQbHVnaW4gZXh0ZW5kcyBBYnN0cmFjdFBsdWdpbiB7Ci0KLQkvKioKLQkgKiBUaGUgcGx1Zy1pbiBJRC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgPSBYTUlMaWJyYXJ5VUlQbHVnaW4uY2xhc3MKLQkJCS5nZXRQYWNrYWdlKCkuZ2V0TmFtZSgpOwotCi0JLy8gVGhlIHNoYXJlZCBpbnN0YW5jZQotCXByaXZhdGUgc3RhdGljIFhNSUxpYnJhcnlVSVBsdWdpbiBwbHVnaW47Ci0KLQkvKioKLQkgKiBUaGUgY29uc3RydWN0b3IKLQkgKi8KLQlwdWJsaWMgWE1JTGlicmFyeVVJUGx1Z2luKCkgewotCQlwbHVnaW4gPSB0aGlzOwotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnBsdWdpbi5BYnN0cmFjdFBsdWdpbiNzdGFydChCdW5kbGVDb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0YXJ0KGNvbnRleHQpOwotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnBsdWdpbi5BYnN0cmFjdFBsdWdpbiNzdG9wKEJ1bmRsZUNvbnRleHQpCi0JICovCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlwbHVnaW4gPSBudWxsOwotCQlzdXBlci5zdG9wKGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNoYXJlZCBpbnN0YW5jZQotCSAqIAotCSAqIEByZXR1cm4gVGhlIHNoYXJlZCBpbnN0YW5jZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgWE1JTGlicmFyeVVJUGx1Z2luIGdldERlZmF1bHQoKSB7Ci0JCXJldHVybiBwbHVnaW47Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS54bWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL3htaS9YTUlMaWJyYXJ5VUlSZXNvdXJjZXMuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLnhtaS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkveG1pL1hNSUxpYnJhcnlVSVJlc291cmNlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MWJmMGZlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLnhtaS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkveG1pL1hNSUxpYnJhcnlVSVJlc291cmNlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkueG1pOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotcHVibGljIGNsYXNzIFhNSUxpYnJhcnlVSVJlc291cmNlcyBleHRlbmRzIE5MUyB7Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgQlVORExFX05BTUUgPSBYTUlMaWJyYXJ5VUlSZXNvdXJjZXMuY2xhc3MKLQkJCS5nZXRQYWNrYWdlKCkuZ2V0TmFtZSgpCi0JCQkrICIuUmVzb3VyY2VzIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbmFtZUxhYmVsX3RleHQ7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbG9jYXRpb25MYWJlbF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgYnJvd3NlQnV0dG9uX3RleHQ7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGVmYXVsdFBhdGhDaGVja2JveExhYmVsX3RleHQ7Ci0KLQlzdGF0aWMgewotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBYTUlMaWJyYXJ5VUlSZXNvdXJjZXMuY2xhc3MpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGxvY2FsaXplZCBzdHJpbmcgYXNzb2NpYXRlZCB3aXRoIGEgcmVzb3VyY2Uga2V5IGFuZCBmb3JtYXR0ZWQKLQkgKiB3aXRoIGEgZ2l2ZW4gb2JqZWN0LgotCSAqIAotCSAqIEBwYXJhbSBrZXkKLQkgKiAgICAgICAgICAgIEEgcmVzb3VyY2Uga2V5LgotCSAqIEBwYXJhbSBkYXRhCi0JICogICAgICAgICAgICBBbiBvYmplY3QuCi0JICogQHJldHVybiBBIGZvcm1hdHRlZCBsb2NhbGl6ZWQgc3RyaW5nLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGJpbmQoU3RyaW5nIGtleSwgT2JqZWN0IGRhdGEpIHsKLQkJcmV0dXJuIE5MUy5iaW5kKGtleSwgbmV3IE9iamVjdFtdIHsgZGF0YSB9KTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS54bWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL3htaS9pbnRlcm5hbC9taWdyYXRpb24vTWlncmF0aW9uVXRpbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkueG1pL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS94bWkvaW50ZXJuYWwvbWlncmF0aW9uL01pZ3JhdGlvblV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTA4NTMzNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS54bWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL3htaS9pbnRlcm5hbC9taWdyYXRpb24vTWlncmF0aW9uVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLnhtaS5pbnRlcm5hbC5taWdyYXRpb247Ci0KLWltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmEudXRpbC5yZWdleC5NYXRjaGVyOwotaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuc2RvLkVQcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLmh0bWwuSFRNTEZvcm1hdHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLlJlc291cmNlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuVGV4dFJlZmVyZW5jZVJlcGxhY2VySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkuWE1JTGlicmFyeVJlc291cmNlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci0KLS8qKgotICogVXRpbGl0eSBjbGFzcyB0byBoZWxwIG1pZ3JhdGUgYW5kIGZvcm1hdCB0aGUgaHRtbCBjb250ZW50LgotICogCi0gKiBAYXV0aG9yIEpJbmh1YSBYaQotICogQGF1dGhvciBXZWlwaW5nIEx1Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBNaWdyYXRpb25VdGlsIHsKLQkKLQlwdWJsaWMgc3RhdGljIFNldDxTdHJpbmc+IGNkYXRhRmVhdHVyZU5hbWVzID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gbG9jYWxEZWJ1ZyA9IGZhbHNlOwotCXN0YXRpYyB7Ci0JCWNkYXRhRmVhdHVyZU5hbWVzLmFkZCgiYWx0ZXJuYXRpdmVzIik7IC8vJE5PTi1OTFMtMSQKLQkJY2RhdGFGZWF0dXJlTmFtZXMuYWRkKCJtYWluRGVzY3JpcHRpb24iKTsgLy8kTk9OLU5MUy0xJAotCQljZGF0YUZlYXR1cmVOYW1lcy5hZGQoImhvd1RvU3RhZmYiKTsgLy8kTk9OLU5MUy0xJAotCQljZGF0YUZlYXR1cmVOYW1lcy5hZGQoImtleUNvbnNpZGVyYXRpb25zIik7IC8vJE5PTi1OTFMtMSQKLQkJY2RhdGFGZWF0dXJlTmFtZXMuYWRkKCJwdXJwb3NlIik7IC8vJE5PTi1OTFMtMSQKLQkJY2RhdGFGZWF0dXJlTmFtZXMuYWRkKCJzY29wZSIpOyAgLy8kTk9OLU5MUy0xJAotCQljZGF0YUZlYXR1cmVOYW1lcy5hZGQoInVzYWdlTm90ZXMiKTsgIC8vJE5PTi1OTFMtMSQKLQkJCi0JCWNkYXRhRmVhdHVyZU5hbWVzLmFkZCgic2tpbGxzIik7ICAvLyROT04tTkxTLTEkCi0JCWNkYXRhRmVhdHVyZU5hbWVzLmFkZCgiYXNzaWdubWVudEFwcHJvYWNoZXMiKTsgIC8vJE5PTi1OTFMtMSQKLQkJY2RhdGFGZWF0dXJlTmFtZXMuYWRkKCJzeW5vbnltcyIpOyAgLy8kTk9OLU5MUy0xJAotCQljZGF0YUZlYXR1cmVOYW1lcy5hZGQoInNlY3Rpb25EZXNjcmlwdGlvbiIpOyAgLy8kTk9OLU5MUy0xJAotCQljZGF0YUZlYXR1cmVOYW1lcy5hZGQoImltcGFjdE9mTm90SGF2aW5nIik7ICAvLyROT04tTkxTLTEkCi0JCWNkYXRhRmVhdHVyZU5hbWVzLmFkZCgicmVhc29uc0Zvck5vdE5lZWRpbmciKTsgIC8vJE5PTi1OTFMtMSQKLQkJY2RhdGFGZWF0dXJlTmFtZXMuYWRkKCJicmllZk91dGxpbmUiKTsgIC8vJE5PTi1OTFMtMSQKLQkJY2RhdGFGZWF0dXJlTmFtZXMuYWRkKCJyZXByZXNlbnRhdGlvbk9wdGlvbnMiKTsgIC8vJE5PTi1OTFMtMSQKLQkJY2RhdGFGZWF0dXJlTmFtZXMuYWRkKCJ1c2FnZUd1aWRhbmNlIik7ICAvLyROT04tTkxTLTEkCi0JCWNkYXRhRmVhdHVyZU5hbWVzLmFkZCgicmVmaW5lZERlc2NyaXB0aW9uIik7ICAvLyROT04tTkxTLTEkCi0JCWNkYXRhRmVhdHVyZU5hbWVzLmFkZCgiYWN0aXZpdHlFbnRyeVN0YXRlIik7ICAvLyROT04tTkxTLTEkCi0JCWNkYXRhRmVhdHVyZU5hbWVzLmFkZCgiYWN0aXZpdHlFeGl0U3RhdGUiKTsgIC8vJE5PTi1OTFMtMSQKLQkJY2RhdGFGZWF0dXJlTmFtZXMuYWRkKCJleHRlcm5hbERlc2NyaXB0aW9uIik7ICAvLyROT04tTkxTLTEkCi0JCWNkYXRhRmVhdHVyZU5hbWVzLmFkZCgicGFja2FnaW5nR3VpZGFuY2UiKTsgIC8vJE5PTi1OTFMtMSQKLQkJY2RhdGFGZWF0dXJlTmFtZXMuYWRkKCJhZGRpdGlvbmFsSW5mbyIpOyAgLy8kTk9OLU5MUy0xJAotCQljZGF0YUZlYXR1cmVOYW1lcy5hZGQoInByb2JsZW0iKTsgIC8vJE5PTi1OTFMtMSQKLQkJY2RhdGFGZWF0dXJlTmFtZXMuYWRkKCJiYWNrZ3JvdW5kIik7ICAvLyROT04tTkxTLTEkCi0JCWNkYXRhRmVhdHVyZU5hbWVzLmFkZCgiZ29hbHMiKTsgIC8vJE5PTi1OTFMtMSQKLQkJY2RhdGFGZWF0dXJlTmFtZXMuYWRkKCJhcHBsaWNhdGlvbiIpOyAgLy8kTk9OLU5MUy0xJAotCQljZGF0YUZlYXR1cmVOYW1lcy5hZGQoImxldmVsc09mQWRvcHRpb24iKTsgIC8vJE5PTi1OTFMtMSQKLQkJY2RhdGFGZWF0dXJlTmFtZXMuYWRkKCJzY2FsZSIpOyAgLy8kTk9OLU5MUy0xJAotCQljZGF0YUZlYXR1cmVOYW1lcy5hZGQoInByb2plY3RDaGFyYWN0ZXJpc3RpY3MiKTsgIC8vJE5PTi1OTFMtMSQKLQkJY2RhdGFGZWF0dXJlTmFtZXMuYWRkKCJyaXNrTGV2ZWwiKTsgIC8vJE5PTi1OTFMtMSQKLQkJY2RhdGFGZWF0dXJlTmFtZXMuYWRkKCJlc3RpbWF0aW5nVGVjaG5pcXVlIik7ICAvLyROT04tTkxTLTEkCi0JCWNkYXRhRmVhdHVyZU5hbWVzLmFkZCgicHJvamVjdE1lbWJlckV4cGVydGlzZSIpOyAgLy8kTk9OLU5MUy0xJAotCQljZGF0YUZlYXR1cmVOYW1lcy5hZGQoInR5cGVPZkNvbnRyYWN0Iik7ICAvLyROT04tTkxTLTEkCi0JCi0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0h0bWxGZWF0dXJlKEVTdHJ1Y3R1cmFsRmVhdHVyZSBmKSB7Ci0JCXJldHVybiBjZGF0YUZlYXR1cmVOYW1lcy5jb250YWlucyhmLmdldE5hbWUoKSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGZvcm1hdFZhbHVlKE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUxpc3QgcHJvcGVydGllcyA9IGVsZW1lbnQuZ2V0SW5zdGFuY2VQcm9wZXJ0aWVzKCk7Ci0JCWlmIChwcm9wZXJ0aWVzICE9IG51bGwpIHsKLQkJCS8vIGdldCBhbGwgc3RyaW5nIHR5cGUgYXR0cmlidXRlcwotCi0JCQlIVE1MRm9ybWF0dGVyIGZvcm1hdGVyID0gbmV3IEhUTUxGb3JtYXR0ZXIoKTsKLQkJCQotCQkJaWYgKFJlc291cmNlSGVscGVyLmdldERlZmF1bHRSZXNvdXJjZU1ncigpID09IG51bGwpIHsKLQkJCQlSZXNvdXJjZUhlbHBlci5zZXREZWZhdWx0UmVzb3VyY2VNZ3IobmV3IFhNSUxpYnJhcnlSZXNvdXJjZU1hbmFnZXIoKSk7Ci0JCQl9Ci0JCQkKLQkJCWJvb2xlYW4gc2VlbiA9IGZhbHNlOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9wZXJ0aWVzLnNpemUoKTsgaSsrKSB7Ci0JCQkJRVByb3BlcnR5IHByb3BlcnR5ID0gKEVQcm9wZXJ0eSkgcHJvcGVydGllcy5nZXQoaSk7Ci0JCQkJaWYgKHByb3BlcnR5ICE9IG51bGwpIHsKLQkJCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBwcm9wZXJ0eQotCQkJCQkJCS5nZXRFU3RydWN0dXJhbEZlYXR1cmUoKTsKLQkJCQkKLS8vCQkJCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IChFU3RydWN0dXJhbEZlYXR1cmUpIHByb3BlcnRpZXMKLS8vCQkJCQkJCS5nZXQoaSk7Ci0vLwkKLQkJCQkJT2JqZWN0IHZhbHVlID0gZWxlbWVudC5lR2V0KGZlYXR1cmUpOwotCQkJCQlPYmplY3QgbmV3VmFsdWUgPSB2YWx1ZTsKLQkJCQkJaWYgKGlzSHRtbEZlYXR1cmUoZmVhdHVyZSkgJiYgdmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpIHsKLQkJCQkJCWlmICghIHNlZW4gJiYgbG9jYWxEZWJ1ZykgewkJCQkJCQkKLQkJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxEPiBlbGVtZW50OiAiICsgZWxlbWVudC5lQ2xhc3MoKS5nZXROYW1lKCkpOy8vJE5PTi1OTFMtMSQKLQkJCQkJCQlzZWVuID0gdHJ1ZTsKLQkJCQkJCX0KLQkJCQkJCQotCQkJCQkJdHJ5IHsKLQkJCQkJCQkKLQkJCQkJCQlTdHJpbmcgc3RyMCA9IHZhbGlkYXRlR3VpZEF0dHJpYnV0ZSgoU3RyaW5nKSB2YWx1ZSk7CQkJCQkJCQotCQkJCQkJCVN0cmluZyBzdHIxID0gUmVzb3VyY2VIZWxwZXIudmFsaWRhdGVDb250ZW50KGVsZW1lbnQsIHN0cjApOwotCQkJCQkJCQotCQkJCQkJCW5ld1ZhbHVlID0gZm9ybWF0ZXIuZm9ybWF0SFRNTCgoU3RyaW5nKSBzdHIxKTsKLQotCQkJCQkJCWlmIChsb2NhbERlYnVnKSB7Ci0JCQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTEQ+IGZlYXR1cmU6ICIgKyBmZWF0dXJlLmdldE5hbWUoKSk7Ly8kTk9OLU5MUy0xJAotCQkJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxEPiBzdHIwOiAiICsgdmFsdWUpOwkJCQkvLyROT04tTkxTLTEkCi0JCQkJCQkJCWlmICghIHN0cjEuZXF1YWxzKHN0cjApKSB7Ci0JCQkJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxEPiBzdHIxOiAiICsgc3RyMSk7CQkJLy8kTk9OLU5MUy0xJAotCQkJCQkJCQl9Ci0JCQkJCQkJCWlmICghIG5ld1ZhbHVlLmVxdWFscyhzdHIxKSkgewotCQkJCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJMRD4gbmV3VmFsdWU6ICIgKyBuZXdWYWx1ZSk7CQkJLy8kTk9OLU5MUy0xJAotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJCQotLy8JCQkJCQkJbmV3VmFsdWUgPSBzdHIyOwotCQkJCQkJCQotCQkJCQkJfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJLy8gTm90IGNoYW5nZSB2YWx1ZSBpZiBpdCBjYW5ub3QgYmUgZm9ybWF0dGVkCi0JCQkJCQkJLy8gU2hvdWxkIGFsc28gd3JpdGUgdG8gbG9nIGZvciB1c2VyIGF0dGVudGlvbgotCQkJCQkJCWNvbnRpbnVlOwotCQkJCQkJfQotCQkJCQkJZWxlbWVudC5lU2V0KGZlYXR1cmUsIG5ld1ZhbHVlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyB2YWxpZGF0ZUd1aWRBdHRyaWJ1dGUoU3RyaW5nIHNvdXJjZSkgewotCQlTdHJpbmcgc3RyID0gdmFsaWRhdGVHdWlkQXR0cmlidXRlKHNvdXJjZSwgIFJlc291cmNlSGVscGVyLnBfbGlua19yZWYpOwotCQlzdHIgPSB2YWxpZGF0ZUd1aWRBdHRyaWJ1dGUoc3RyLCBSZXNvdXJjZUhlbHBlci5wX2FyZWFfcmVmKTsKLQkJcmV0dXJuIHN0cjsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHZhbGlkYXRlR3VpZEF0dHJpYnV0ZShTdHJpbmcgc291cmNlLCBQYXR0ZXJuIHBhdHRlcm4pIHsKLQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlNYXRjaGVyIG0gPSBwYXR0ZXJuLm1hdGNoZXIoc291cmNlKTsKLQotCQl3aGlsZSAobS5maW5kKCkpIHsKLQkJCVN0cmluZyB0ZXh0ID0gbS5ncm91cCgpOwotCQkJU3RyaW5nIHJlcGxhY2VtZW50ID0gdGV4dDsJCQkKLQkJCQotCQkJTWFwIGF0dHJpYnV0ZU1hcCA9IFJlc291cmNlSGVscGVyLmdldEF0dHJpYnV0ZXNGcm9tTGluayhwYXR0ZXJuLCB0ZXh0KTsKLQkJCQotCQkJaWYgKGxvY2FsRGVidWcpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxEPiB0ZXh0OiAgICAgICIgKyB0ZXh0KTsJCQkJCS8vJE5PTi1OTFMtMSQKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxEPiBhdHRyaWJ1dGVNYXA6ICIgKyBhdHRyaWJ1dGVNYXApOwkJLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJCi0JCQlTdHJpbmcgZ3VpZCA9IGF0dHJpYnV0ZU1hcCA9PSBudWxsID8gbnVsbCA6IChTdHJpbmcpIGF0dHJpYnV0ZU1hcC5nZXQoUmVzb3VyY2VIZWxwZXIuVEFHX0FUVFJfR1VJRCk7Ci0JCQlTdHJpbmcgaHJlZiA9IGF0dHJpYnV0ZU1hcCA9PSBudWxsID8gbnVsbCA6IChTdHJpbmcpIGF0dHJpYnV0ZU1hcC5nZXQoUmVzb3VyY2VIZWxwZXIuVEFHX0FUVFJfSFJFRik7Ci0KLQkJCWludCBpeDAgPSAtMTsKLQkJCWludCBpeDEgPSAtMTsKLQkJCWlmIChndWlkID09IG51bGwgJiYgaHJlZiAhPSBudWxsKSB7Ci0JCQkJaXgwID0gaHJlZi5sYXN0SW5kZXhPZigiLCIpOwkJCS8vJE5PTi1OTFMtMSQKLQkJCQlpeDEgPSBocmVmLmxhc3RJbmRleE9mKCIuaHRtbCIpOwkvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQkKLQkJCWlmIChpeDAgPj0gMCAmJiBpeDEgPiBpeDApIHsKLQkJCQkKLQkJCQlndWlkID0gaHJlZi5zdWJzdHJpbmcoaXgwICsgMSwgaXgxKTsKLQkJCQkvL1RvIGRvOiB2YWxpZGF0ZSBpZiBndWlkIGlzIHZhbGlkIGhlcmUsIG90aGVyd2lzZSwgbm8gcmVwbGFjZW1lbnQKLQkJCQkKLQkJCQlTdHJpbmcgcmVwbGFjZWQgPSBocmVmICsgIlwiIjsgIC8vJE5PTi1OTFMtMSQKLQkJCQlTdHJpbmcgcmVwbGFjaW5nID0gaHJlZiArICJcIiBndWlkPVwiIitndWlkICsgIlwiIjsJLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJLy9yZXBsYWNlbWVudCA9IFRleHRSZWZlcmVuY2VSZXBsYWNlckltcGwucmVwbGFjZUFsbCh0ZXh0LCByZXBsYWNlZCwgcmVwbGFjaW5nKTsKLQkJCQlyZXBsYWNlbWVudCA9IHRleHQucmVwbGFjZShyZXBsYWNlZCwgcmVwbGFjaW5nKTsKLQotCQkJCWlmIChsb2NhbERlYnVnKSB7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTEQ+ICByZXBsYWNlZDogIiArIHJlcGxhY2VkKTsJLy8kTk9OLU5MUy0xJAotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxEPiByZXBsYWNpbmc6ICIgKyByZXBsYWNpbmcpOwkvLyROT04tTkxTLTEkCi0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiIik7CQkJCQkJCQkvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfQkJCQotCQkJbS5hcHBlbmRSZXBsYWNlbWVudChzYiwgTWF0Y2hlci5xdW90ZVJlcGxhY2VtZW50KHJlcGxhY2VtZW50KSk7CQkJCQotCQl9Ci0JCW0uYXBwZW5kVGFpbChzYik7Ci0JCXJldHVybiBzYi50b1N0cmluZygpOwotCX0KLQkKLQkKLQkKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLnhtaS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkveG1pL2ludGVybmFsL21pZ3JhdGlvbi9NaWdyYXRvcjEwMi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkueG1pL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS94bWkvaW50ZXJuYWwvbWlncmF0aW9uL01pZ3JhdG9yMTAyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlODVjZWYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkueG1pL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS94bWkvaW50ZXJuYWwvbWlncmF0aW9uL01pZ3JhdG9yMTAyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NzkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkueG1pLmludGVybmFsLm1pZ3JhdGlvbjsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5NdWx0aVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLkNvbW1vblBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5VUklDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRUNvbnRlbnRzRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVDb250ZW50c0VMaXN0LkZlYXR1cmVJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLlhNTFJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpLnV0aWwuTXNnQm94OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLnV0aWwuR3JhcGhpY2FsRGF0YUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC51dGlsLkdyYXBoaWNhbERhdGFNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLk1vZGVsU3RydWN0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5MaW5rSW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLlJlc291cmNlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkuWE1JTGlicmFyeVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkuWE1JTGlicmFyeVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UuTWV0aG9kTGlicmFyeVBlcnNpc3RlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UuTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5NdWx0aUZpbGVTYXZlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UuTXVsdGlGaWxlWE1JU2F2ZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLm1pZ3JhdGlvbi5NaWdyYXRpb25SZXNvdXJjZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLm1pZ3JhdGlvbi5NaWdyYXRvckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLm1pZ3JhdGlvbi5VcGdyYWRlQ2FsbGVySW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UudXRpbC5QZXJzaXN0ZW5jZVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UudXRpbC5QZXJzaXN0ZW5jZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuU2VtYW50aWNNb2RlbEJyaWRnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVU1BU2VtYW50aWNNb2RlbEJyaWRnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS5pbXBsLk11bHRpUmVzb3VyY2VFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5VbWFVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRXJyb3JEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUgLSBKdW4gMTIsIDIwMDYKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIE1pZ3JhdG9yMTAyIGV4dGVuZHMgTWlncmF0b3JJbXBsIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHID0gWE1JTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCS5pc0RlYnVnZ2luZygpOwotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCB1cGRhdGVTdGF0dXMoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBTdHJpbmcgbXNnKSB7Ci0JCWlmIChtb25pdG9yICE9IG51bGwpIHsKLQkJCW1vbml0b3Iuc3ViVGFzayhtc2cpOwotCQkJbW9uaXRvci53b3JrZWQoMSk7Ci0JCQl0cnkgewotCQkJCVRocmVhZC5zbGVlcCgxMCk7Ci0JCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8KLQkJCX0KLQkJfSBlbHNlIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbihtc2cpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uIHByb3hpZXNUb1JlbW92ZSA9IG5ldyBBcnJheUxpc3QoKTsKLQotCXByaXZhdGUgTWFwIHByb3h5VG9GaWxlTWFwID0gbmV3IEhhc2hNYXAoKTsKLQotCXByaXZhdGUgSGFzaE1hcCBwcm94eVRvRmlsZVdpdGhMb2FkRXJyb3JNYXAgPSBuZXcgSGFzaE1hcCgpOwotCi0JcHJpdmF0ZSBBcnJheUxpc3Qgbm90Rm91bmRQcm94aWVzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JcHJpdmF0ZSBBcnJheUxpc3QgcHJveGllc1dpdGhVbm5vcm1hbGl6ZWRVUkkgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQlwcml2YXRlIE1ldGhvZExpYnJhcnkgbGliOwotCi0JcHJpdmF0ZSBNaWdyYXRpb25SZXNvdXJjZUhhbmRsZXIgcmVzb3VyY2VIYW5kbGVyID0gbmV3IE1pZ3JhdGlvblJlc291cmNlSGFuZGxlcigpIHsKLQotCQlwcm90ZWN0ZWQgYm9vbGVhbiBoYW5kbGVVbmtub3duRmVhdHVyZShFT2JqZWN0IG93bmVyLAotCQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBPYmplY3QgdmFsdWUpIHsKLQkJCS8vIE9yZGVyIGdyYXBoIG5vZGVzIG9mIHRhc2sgZGVzY3JpcHRvcnMgaW4gQUREIGJhc2VkIG9uIHRoZWlyIG9yZGVyCi0JCQkvLyBpbiB0aGUgdGFzayBkZXNjcmlwdG9yIGxpc3Qgb2YgdGhlIHJvbGUgZGVzY3JpcHRvcgotCQkJLy8gb2xkIGZlYXR1cmU6IFJvbGVEZXNjcmlwdG9yLnBlcmZvcm1zQXNPd25lcgotCQkJLy8KLQkJCWlmKG93bmVyIGluc3RhbmNlb2YgUm9sZURlc2NyaXB0b3IKLQkJCQkJJiYgInBlcmZvcm1zQXNPd25lciIuZXF1YWxzKGZlYXR1cmUuZ2V0TmFtZSgpKSAvLyROT04tTkxTLTEkCi0JCQkJCSYmIHZhbHVlICE9IG51bGwpCi0JCQl7Ci0JCQkJQXJyYXlMaXN0IEdVSURzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCVN0cmluZ1Rva2VuaXplciB0b2tlbnMgPSBuZXcgU3RyaW5nVG9rZW5pemVyKChTdHJpbmcpIHZhbHVlKTsKLQkJCQl3aGlsZSh0b2tlbnMuaGFzTW9yZVRva2VucygpKSB7Ci0JCQkJCUdVSURzLmFkZCh0b2tlbnMubmV4dFRva2VuKCkpOwotCQkJCX0KLQkJCQlpZihHVUlEcy5zaXplKCkgPiAxKSB7Ci0JCQkJCUFjdGl2aXR5IGFjdCA9ICgoUm9sZURlc2NyaXB0b3Ipb3duZXIpLmdldFN1cGVyQWN0aXZpdGllcygpOwotCQkJCQlEaWFncmFtIGFkZCA9IEdyYXBoaWNhbERhdGFNYW5hZ2VyLmdldEluc3RhbmNlKCkuZ2V0VU1BRGlhZ3JhbShhY3QsIEdyYXBoaWNhbERhdGFIZWxwZXIuQUNUSVZJVFlfREVUQUlMX0RJQUdSQU0sIGZhbHNlKTsKLQkJCQkJaWYoYWRkICE9IG51bGwpIHsKLQkJCQkJCU1hcCB0ZEd1aWRUb0dyYXBoTm9kZU1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCQkJCQlpbnQgc2l6ZSA9IGFkZC5nZXRDb250YWluZWQoKS5zaXplKCk7Ci0JCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCQkJCU9iamVjdCBlbGVtZW50ID0gYWRkLmdldENvbnRhaW5lZCgpLmdldChpKTsKLQkJCQkJCQlpZihlbGVtZW50IGluc3RhbmNlb2YgR3JhcGhOb2RlKSB7Ci0JCQkJCQkJCUdyYXBoTm9kZSBncmFwaE5vZGUgPSAoKEdyYXBoTm9kZSllbGVtZW50KTsKLQkJCQkJCQkJU2VtYW50aWNNb2RlbEJyaWRnZSBicmlkZ2UgPSBncmFwaE5vZGUuZ2V0U2VtYW50aWNNb2RlbCgpOwotCQkJCQkJCQlpZiAoYnJpZGdlIGluc3RhbmNlb2YgVU1BU2VtYW50aWNNb2RlbEJyaWRnZSkgewotCQkJCQkJCQkJTWV0aG9kRWxlbWVudCBtZSA9ICgoVU1BU2VtYW50aWNNb2RlbEJyaWRnZSkgYnJpZGdlKS5nZXRFbGVtZW50KCk7CQkJCQkJCQkKLQkJCQkJCQkJCWlmKG1lIGluc3RhbmNlb2YgVGFza0Rlc2NyaXB0b3IpIHsKLQkJCQkJCQkJCQlMaXN0IGxpc3QgPSBncmFwaE5vZGUuZ2V0TGlzdChVbWFQYWNrYWdlLkdSQVBIX05PREVfX1BST1BFUlRZKTsKLQkJCQkJCQkJCQlQcm9wZXJ0eSBwcm9wZXJ0eSA9IEdyYXBoaWNhbERhdGFIZWxwZXIuZ2V0UHJvcGVydHlCeUtleShsaXN0LAotCQkJCQkJCQkJCQkJR3JhcGhpY2FsRGF0YUhlbHBlci5QUk9QX1dPUktfUFJPRFVDVF9DT01QT1NJVEVfVFlQRSk7Ci0JCQkJCQkJCQkJaWYgKHByb3BlcnR5ID09IG51bGwpIHsKLQkJCQkJCQkJCQkJLy8gdGhpcyBpcyBub3QgYSBHcmFwaE5vZGUgZm9yIFdvcmtQcm9kdWN0Q29tcG9zaXRlCi0JCQkJCQkJCQkJCS8vIGl0IG11c3QgYmUgYSBHcmFwaE5vZGUgZm9yIGEgVGFza0Rlc2NyaXB0b3IKLQkJCQkJCQkJCQkJLy8KLQkJCQkJCQkJCQkJdGRHdWlkVG9HcmFwaE5vZGVNYXAucHV0KG1lLmdldEd1aWQoKSwgZ3JhcGhOb2RlKTsKLQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQkKLQkJCQkJCS8vIHJlb3JkZXIgdGhlIGdyYXBoIG5vZGVzIHRvIG1hdGNoIG9yZGVyIG9mIHRoZWlyIGxpbmtlZCB0YXNrIGRlc2NyaXB0b3JzCi0JCQkJCQkvLwotCQkJCQkJQXJyYXlMaXN0IGdyYXBoTm9kZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCQlmb3IoaW50IGkgPSAwOyBpIDwgR1VJRHMuc2l6ZSgpOyBpKyspIHsKLQkJCQkJCQlPYmplY3QgZ3JhcGhOb2RlID0gdGRHdWlkVG9HcmFwaE5vZGVNYXAuZ2V0KEdVSURzLmdldChpKSk7Ci0JCQkJCQkJaWYoZ3JhcGhOb2RlICE9IG51bGwpIHsKLQkJCQkJCQkJZ3JhcGhOb2Rlcy5hZGQoZ3JhcGhOb2RlKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQlhZGQuZ2V0Q29udGFpbmVkKCkucmVtb3ZlQWxsKGdyYXBoTm9kZXMpOwotCQkJCQkJYWRkLmdldENvbnRhaW5lZCgpLmFkZEFsbChncmFwaE5vZGVzKTsKLQkJCQkJfQkJCQkJCi0JCQkJfQotCQkJfQotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQotCX07Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklMRV9QQVRIID0gWE1JTGlicmFyeVJlc291cmNlcy5maWxlUGF0aDsKLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLm1pZ3JhdGlvbi5JTWlncmF0b3IjbWlncmF0ZShqYXZhLmxhbmcuU3RyaW5nLAotCSAqICAgICAgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHVibGljIHZvaWQgbWlncmF0ZShTdHJpbmcgbGliUGF0aCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQotCQl0aHJvd3MgRXhjZXB0aW9uIHsKLQkJbWlncmF0ZShsaWJQYXRoLCBtb25pdG9yLCBudWxsKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLm1pZ3JhdGlvbi5JTWlncmF0b3IjbWlncmF0ZShqYXZhLmxhbmcuU3RyaW5nLCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvciwgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLm1pZ3JhdGlvbi5VcGdyYWRlQ2FsbGVySW5mbykKLQkgKi8KLQlwdWJsaWMgdm9pZCBtaWdyYXRlKFN0cmluZyBsaWJQYXRoLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIFVwZ3JhZGVDYWxsZXJJbmZvIGluZm8pCi0JCQl0aHJvd3MgRXhjZXB0aW9uIHsKLQkJaW5pdE1pZ3JhdGUoKTsKLQkJCi0JCUZpbGUgbGliRmlsZSA9IG5ldyBGaWxlKGxpYlBhdGgpOwotCi0JCWJvb2xlYW4gdG9WZXJpZnkgPSB0cnVlOwotCQlpZiAoaW5mbyAhPSBudWxsICYmIGluZm8uZ2V0SXNFeHBvcnRlZFBsdWdpbkxpYigpKSB7Ci0JCQl0b1ZlcmlmeSA9IGZhbHNlOwotCQl9Ci0JCQotCQlSZXNvdXJjZVV0aWwub3BlbihsaWJGaWxlLmdldFBhcmVudCgpLCBtb25pdG9yKTsKLQotCQlNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwgcmVzb3VyY2VTZXQgPSBudWxsOwotCQl0cnkgewotCQkJLy8gc2V0IDEuMC4yIGRlZmF1bHQgdmFsdWVzIHNvIGRhdGEgY2FuIGJlIGNvcnJlY3RseSBsb2FkZWQKLQkJCS8vCi0JCQlzZXRPbGREZWZhdWx0VmFsdWVzKCk7Ci0KLQkJCS8vIGxvYWQgdGhlIGxpYnJhcnkKLQkJCS8vCi0JCQl1cGRhdGVTdGF0dXMobW9uaXRvciwgUGVyc2lzdGVuY2VSZXNvdXJjZXMubG9hZExpYnJhcnlUYXNrX25hbWUpOwotCi0JCQlpZiAodG9WZXJpZnkpIHsKLQkJCQlyZXNvdXJjZVNldCA9IG5ldyBNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwoZmFsc2UpOwotCQkJfSBlbHNlIHsKLQkJCQlyZXNvdXJjZVNldCA9IFBlcnNpc3RlbmNlVXRpbC5nZXRJbXBvcnRQbHVnaW5SZXNvdXJjZVNldCgpOwotCQkJfQotCQkJCQkJCi0JCQlyZXNvdXJjZVNldC5nZXRMb2FkT3B0aW9ucygpLnB1dCgKLQkJCQkJWE1MUmVzb3VyY2UuT1BUSU9OX1JFQ09SRF9VTktOT1dOX0ZFQVRVUkUsIEJvb2xlYW4uVFJVRSk7Ci0JCQlyZXNvdXJjZVNldC5nZXRMb2FkT3B0aW9ucygpLnB1dCgKLQkJCQkJWE1MUmVzb3VyY2UuT1BUSU9OX1JFU09VUkNFX0hBTkRMRVIsIHJlc291cmNlSGFuZGxlcik7Ci0JCQlsaWIgPSByZXNvdXJjZVNldC5sb2FkTGlicmFyeShsaWJQYXRoKTsKLQkJCQotCQkJcmVtb3ZlUHJvY2Vzc0NvbnRyaWJ1dGlvbnMobW9uaXRvcik7Ci0KLQkJCS8vIHZlcmlmeSB0aGUgbGlicmFyeQotCQkJLy8KLQkJCS8vIFRPRE86IHVuY29tbWVudCBhZnRlciBleHRlcm5hbGl6ZSB0aGUgdGV4dAotCQkJLy8gdXBkYXRlU3RhdHVzKG1vbml0b3IsICJWZXJpZnlpbmcuLi4iKTsKLQotCQkJaWYgKHRvVmVyaWZ5KSB7Ci0JCQkJRGlzcGxheSBkaXMgPSBEaXNwbGF5LmdldERlZmF1bHQoKTsKLQkJCQlpZiAoZGlzID09IG51bGwgfHwgZGlzLmdldFRocmVhZCgpID09IFRocmVhZC5jdXJyZW50VGhyZWFkKCkpIHsKLQkJCQkJdmVyaWZ5KCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJZGlzLnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQl2ZXJpZnkoKTsKLQkJCQkJCX0KLQkJCQkJfSk7Ci0JCQkJfQotCQkJCXJlbW92ZVVucmVzb2x2ZWRSZWZlcmVuY2VzKG1vbml0b3IpOwotCQkJfQotCQkJCQkJCi0JCQlpZiAodGhpcyBpbnN0YW5jZW9mIE1pZ3JhdG9yMTAyXzEwMykgewotCQkJCUxpbmtJbmZvLnNldExpYnJhcnkobGliKTsKLQkJCX0KLQkJCS8vIGxvYWQgYWxsIGVsZW1lbnRzIGluIG1lbW9yeQotCQkJLy8KLQkJCXVwZGF0ZVN0YXR1cyhtb25pdG9yLCBQZXJzaXN0ZW5jZVJlc291cmNlcy5sb2FkUmVzb3VyY2VzVGFza19uYW1lKTsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGxpYi5lQWxsQ29udGVudHMoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJRU9iamVjdCBlbGVtZW50ID0gKEVPYmplY3QpIGl0ZXIubmV4dCgpOwotCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJCQl0cnkgewotCQkJCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGVsZW1lbnQuZUNyb3NzUmVmZXJlbmNlcygpCi0JCQkJCQkJCS5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJaXRlcmF0b3IubmV4dCgpOwotCQkJCQkJfQotCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJQ29tbW9uUGx1Z2luLklOU1RBTkNFLmxvZyhlKTsKLQkJCQkJCWlmIChERUJVRykgewotCQkJCQkJCVN5c3RlbS5lcnIKLQkJCQkJCQkJCS5wcmludGxuKCJFcnJvciBpdGVyYXRlIHRocnUgY3Jvc3MgcmVmZXJlbmNlcyBvZiBlbGVtZW50OiAiICsgZWxlbWVudCk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQl1cGRhdGUoKE1ldGhvZEVsZW1lbnQpIGVsZW1lbnQsIG1vbml0b3IpOwotCQkJCX0KLQkJCX0KLQotCQkJCi0JCQkKLQkJCXJlbW92ZU9sZERlZmF1bHRWYWx1ZXMoKTsKLQotCQkJLy8gY2hlY2sgbW9kaWZpZWQgcmVzb3VyY2VzIGZvciB3cml0YWJsZSBiZWZvcmUgc2F2aW5nIHRoZW0KLQkJCS8vCi0JCQlEaXNwbGF5IGRpcyA9IERpc3BsYXkuZ2V0RGVmYXVsdCgpOwotCQkJaWYgKGRpcyA9PSBudWxsIHx8IGRpcy5nZXRUaHJlYWQoKSA9PSBUaHJlYWQuY3VycmVudFRocmVhZCgpKSB7Ci0JCQkJY2hlY2tNb2RpZmllZFJlc291cmNlcygpOwotCQkJfSBlbHNlIHsKLQkJCQlkaXMuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQljaGVja01vZGlmaWVkUmVzb3VyY2VzKCk7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCX0KLQotCQkJLy8gc2F2ZSBhbGwgZmlsZXMKLQkJCS8vCi0JCQl1cGRhdGVTdGF0dXMobW9uaXRvciwgUGVyc2lzdGVuY2VSZXNvdXJjZXMuc2F2ZUxpYnJhcnlUYXNrX25hbWUpOwotCQkJTWFwIHNhdmVPcHRpb25zID0gcmVzb3VyY2VTZXQuZ2V0RGVmYXVsdFNhdmVPcHRpb25zKCk7Ci0JCQlpZiAodG9WZXJpZnkpIHsKLQkJCQlzYXZlT3B0aW9ucy5wdXQoTXVsdGlGaWxlWE1JU2F2ZUltcGwuRElTQ0FSRF9VTlJFU09MVkVEX1JFRkVSRU5DRVMsCi0JCQkJCUJvb2xlYW4uVFJVRSk7Ci0JCQl9Ci0JCQlyZXNvdXJjZVNldC5zYXZlKHNhdmVPcHRpb25zLCB0cnVlKTsKLQotCQkJdXBkYXRlU3RhdHVzKG1vbml0b3IsCi0JCQkJCVBlcnNpc3RlbmNlUmVzb3VyY2VzLnJlZnJlc2hMaWJyYXJ5RmlsZXNUYXNrX25hbWUpOwotCQkJUmVzb3VyY2VVdGlsLnJlZnJlc2hSZXNvdXJjZXMobGliLCBtb25pdG9yKTsKLQkJCW1pZ3JhdGVEaWFncmFtKG1vbml0b3IpOwotCQl9IGZpbmFsbHkgewotCQkJaWYgKHRoaXMgaW5zdGFuY2VvZiBNaWdyYXRvcjEwMl8xMDMpIHsKLQkJCQlMaW5rSW5mby5zZXRMaWJyYXJ5KG51bGwpOwotCQkJfQotCQkJaWYgKHJlc291cmNlU2V0ICE9IG51bGwpIHsKLQkJCQlyZXNvdXJjZVNldC5yZXNldCgpOwotCQkJCXJlc291cmNlU2V0ID0gbnVsbDsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFJlbW92ZXMgcHJvY2VzcyBjb250cmlidXRpb25zIGZyb20gYWxsIHBsdWdpbnMKLQkgKi8KLQlwcml2YXRlIHZvaWQgcmVtb3ZlUHJvY2Vzc0NvbnRyaWJ1dGlvbnMoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGxpYi5nZXRNZXRob2RQbHVnaW5zKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gKE1ldGhvZFBsdWdpbikgaXRlci5uZXh0KCk7Ci0JCQlNZXRob2RQYWNrYWdlIHBrZyA9IFVtYVV0aWwuZmluZE1ldGhvZFBhY2thZ2UocGx1Z2luLAotCQkJCQlNb2RlbFN0cnVjdHVyZS5ERUZBVUxULnByb2Nlc3NDb250cmlidXRpb25QYXRoKTsKLQkJCWlmIChwa2cgIT0gbnVsbCkgewotCQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBuZXcgQXJyYXlMaXN0KHBrZy5nZXRDaGlsZFBhY2thZ2VzKCkpCi0JCQkJCQkuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJCQlNZXRob2RQYWNrYWdlIGNoaWxkUGtnID0gKE1ldGhvZFBhY2thZ2UpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSAoKEludGVybmFsRU9iamVjdCkgY2hpbGRQa2cpCi0JCQkJCQkJLmVEaXJlY3RSZXNvdXJjZSgpOwotCQkJCQlpZiAocmVzb3VyY2UgIT0gbnVsbCkgewotCQkJCQkJUmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQgPSByZXNvdXJjZS5nZXRSZXNvdXJjZVNldCgpOwotCQkJCQkJdHJ5IHsKLQkJCQkJCQlNZXRob2RMaWJyYXJ5UGVyc2lzdGVyLklOU1RBTkNFLmRlbGV0ZShwa2cpOwotCQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQlpZiAoREVCVUcpIHsKLQkJCQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQlpZiAocmVzb3VyY2VTZXQgIT0gbnVsbCkgewotCQkJCQkJCXJlc291cmNlU2V0LmdldFJlc291cmNlcygpLnJlbW92ZShyZXNvdXJjZSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJcGtnLmdldENoaWxkUGFja2FnZXMoKS5jbGVhcigpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNoZWNrTW9kaWZpZWRSZXNvdXJjZXMoKSB7Ci0JCWRvIHsKLQkJCVJlc291cmNlU2V0IHJlc291cmNlU2V0ID0gbGliLmVSZXNvdXJjZSgpLmdldFJlc291cmNlU2V0KCk7Ci0JCQlBcnJheUxpc3QgcmVhZE9ubHlSZXNvdXJjZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlTdHJpbmcgcGx1Z2luSWQgPSBYTUlMaWJyYXJ5UGx1Z2luLmdldERlZmF1bHQoKS5nZXRJZCgpOwotCQkJTXVsdGlTdGF0dXMgc3RhdHVzID0gbmV3IE11bHRpU3RhdHVzKHBsdWdpbklkLCAwLAotCQkJCQlYTUlMaWJyYXJ5UmVzb3VyY2VzLmNhbm5vdFdyaXRlVG9GaWxlcywgbnVsbCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSByZXNvdXJjZVNldC5nZXRSZXNvdXJjZXMoKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSAoUmVzb3VyY2UpIGl0ZXIubmV4dCgpOwotCQkJCUZpbGUgZmlsZSA9IG5ldyBGaWxlKHJlc291cmNlLmdldFVSSSgpLnRvRmlsZVN0cmluZygpKTsKLQkJCQlpZiAoZmlsZS5leGlzdHMoKSAmJiAhZmlsZS5jYW5Xcml0ZSgpKSB7Ci0JCQkJCXJlYWRPbmx5UmVzb3VyY2VzLmFkZChyZXNvdXJjZSk7Ci0JCQkJCXN0YXR1cy5hZGQobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBwbHVnaW5JZCwgMCwgZmlsZQotCQkJCQkJCS50b1N0cmluZygpLCBudWxsKSk7Ci0JCQkJfQotCQkJfQotCQkJaWYgKCFzdGF0dXMuaXNPSygpKSB7Ci0JCQkJU3RyaW5nIHRpdGxlID0gWE1JTGlicmFyeVJlc291cmNlcy5yZWFkT25seUZpbGVzX3RpdGxlOwotCQkJCVN0cmluZyBtc2cgPSBYTUlMaWJyYXJ5UmVzb3VyY2VzLnJlYWRPbmx5RmlsZXNfbXNnOwotCQkJCUVycm9yRGlhbG9nIGVyckRsZyA9IG5ldyBFcnJvckRpYWxvZyhNc2dCb3guZ2V0RGVmYXVsdFNoZWxsKCksCi0JCQkJCQl0aXRsZSwgbXNnLCBzdGF0dXMsIElTdGF0dXMuT0sgfCBJU3RhdHVzLklORk8KLQkJCQkJCQkJfCBJU3RhdHVzLldBUk5JTkcgfCBJU3RhdHVzLkVSUk9SKSB7Ci0JCQkJCS8qCi0JCQkJCSAqIChub24tSmF2YWRvYykKLQkJCQkJICogCi0JCQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5FcnJvckRpYWxvZyNjcmVhdGVCdXR0b25zRm9yQnV0dG9uQmFyKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKLQkJCQkJICovCi0JCQkJCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUJ1dHRvbnNGb3JCdXR0b25CYXIoQ29tcG9zaXRlIHBhcmVudCkgewotCQkJCQkJLy8gY3JlYXRlIFJldHJ5LCBDYW5jZWwgYW5kIERldGFpbHMgYnV0dG9ucwotCQkJCQkJY3JlYXRlQnV0dG9uKHBhcmVudCwgSURpYWxvZ0NvbnN0YW50cy5PS19JRCwKLQkJCQkJCQkJSURpYWxvZ0NvbnN0YW50cy5SRVRSWV9MQUJFTCwgdHJ1ZSk7Ci0KLQkJCQkJCWNyZWF0ZUJ1dHRvbihwYXJlbnQsIElEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0lELAotCQkJCQkJCQlJRGlhbG9nQ29uc3RhbnRzLkNBTkNFTF9MQUJFTCwgZmFsc2UpOwotCi0JCQkJCQljcmVhdGVEZXRhaWxzQnV0dG9uKHBhcmVudCk7Ci0JCQkJCX0KLQotCQkJCQkvKgotCQkJCQkgKiAobm9uLUphdmFkb2MpCi0JCQkJCSAqIAotCQkJCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRXJyb3JEaWFsb2cjb3BlbigpCi0JCQkJCSAqLwotCQkJCQlwdWJsaWMgaW50IG9wZW4oKSB7Ci0JCQkJCQlzaG93RGV0YWlsc0FyZWEoKTsKLQkJCQkJCXJldHVybiBzdXBlci5vcGVuKCk7Ci0JCQkJCX0KLQotCQkJCX07Ci0JCQkJaWYgKGVyckRsZy5vcGVuKCkgPT0gSURpYWxvZ0NvbnN0YW50cy5DQU5DRUxfSUQpIHsKLQkJCQkJdGhyb3cgbmV3IE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uKCk7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0gd2hpbGUgKHRydWUpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBtb25pdG9yCi0JICovCi0JcHJpdmF0ZSB2b2lkIHJlbW92ZVVucmVzb2x2ZWRSZWZlcmVuY2VzKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlpZiAocHJveGllc1RvUmVtb3ZlLmlzRW1wdHkoKSkKLQkJCXJldHVybjsKLQkJLy8gVE9ETzogdW5jb21tZW50IGFmdGVyIGV4dGVybmFsaXplIHRoZSB0ZXh0Ci0JCS8vIHVwZGF0ZVN0YXR1cyhtb25pdG9yLCAiUmVtb3ZpbmcgdW5yZXNvbHZlZCByZWZlcmVuY2VzIik7Ci0JCUhhc2hTZXQgR1VJRHMgPSBuZXcgSGFzaFNldCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBwcm94aWVzVG9SZW1vdmUuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlJbnRlcm5hbEVPYmplY3QgcHJveHkgPSAoSW50ZXJuYWxFT2JqZWN0KSBpdGVyLm5leHQoKTsKLQkJCUdVSURzLmFkZChwcm94eS5lUHJveHlVUkkoKS5mcmFnbWVudCgpKTsKLQkJCUVjb3JlVXRpbC5yZW1vdmUocHJveHkpOwotCQl9Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGxpYi5lQWxsQ29udGVudHMoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlFT2JqZWN0IGVsZW1lbnQgPSAoRU9iamVjdCkgaXRlci5uZXh0KCk7Ci0JCQlmb3IgKEVDb250ZW50c0VMaXN0LkZlYXR1cmVJdGVyYXRvciBpdGVyYXRvciA9IChGZWF0dXJlSXRlcmF0b3IpIGVsZW1lbnQKLQkJCQkJLmVDcm9zc1JlZmVyZW5jZXMoKS5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJSW50ZXJuYWxFT2JqZWN0IG9iaiA9IChJbnRlcm5hbEVPYmplY3QpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQlpZiAob2JqLmVJc1Byb3h5KCkKLQkJCQkJCSYmIEdVSURzLmNvbnRhaW5zKG9iai5lUHJveHlVUkkoKS5mcmFnbWVudCgpKSkgewotCQkJCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IGl0ZXJhdG9yLmZlYXR1cmUoKTsKLQkJCQkJaWYgKGZlYXR1cmUuaXNDaGFuZ2VhYmxlKCkgJiYgIWZlYXR1cmUuaXNEZXJpdmVkKCkpIHsKLQkJCQkJCWlmIChmZWF0dXJlLmlzTWFueSgpKSB7Ci0JCQkJCQkJKChMaXN0KSBlbGVtZW50LmVHZXQoZmVhdHVyZSkpLnJlbW92ZShvYmopOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQllbGVtZW50LmVTZXQoZmVhdHVyZSwgbnVsbCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbGliCi0JICovCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeSgpIHsKLQkJbm90Rm91bmRQcm94aWVzLmNsZWFyKCk7Ci0JCXByb3hpZXNUb1JlbW92ZS5jbGVhcigpOwotCQlwcm94eVRvRmlsZU1hcC5jbGVhcigpOwotCQlwcm94eVRvRmlsZVdpdGhMb2FkRXJyb3JNYXAuY2xlYXIoKTsKLQkJcHJveGllc1dpdGhVbm5vcm1hbGl6ZWRVUkkuY2xlYXIoKTsKLQotCQlDb2xsZWN0aW9uPEVPYmplY3Q+IHByb3hpZXMgPSBQZXJzaXN0ZW5jZVV0aWwuZ2V0UHJveGllcyhsaWIpOwotCQlpZiAoIXByb3hpZXMuaXNFbXB0eSgpKSB7Ci0JCQlSZXNvdXJjZVNldCByZXNvdXJjZVNldCA9IGxpYi5lUmVzb3VyY2UoKS5nZXRSZXNvdXJjZVNldCgpOwotCQkJVVJJQ29udmVydGVyIHVyaUNvbnZlcnRlciA9IHJlc291cmNlU2V0LmdldFVSSUNvbnZlcnRlcigpOwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gcHJveGllcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlJbnRlcm5hbEVPYmplY3QgcHJveHkgPSAoSW50ZXJuYWxFT2JqZWN0KSBpdGVyLm5leHQoKTsKLQkJCQlVUkkgdXJpID0gcHJveHkuZVByb3h5VVJJKCk7Ci0JCQkJVVJJIG5vcm1hbGl6ZWRVUkkgPSB1cmlDb252ZXJ0ZXIubm9ybWFsaXplKHVyaSk7Ci0JCQkJaWYgKG5vcm1hbGl6ZWRVUkkgPT0gbnVsbCkgewotCQkJCQlwcm94aWVzV2l0aFVubm9ybWFsaXplZFVSSS5hZGQocHJveHkpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCUZpbGUgZmlsZSA9IG5ldyBGaWxlKG5vcm1hbGl6ZWRVUkkudG9GaWxlU3RyaW5nKCkpOwotCQkJCQlpZiAoIWZpbGUuZXhpc3RzKCkpIHsKLQkJCQkJCXByb3h5VG9GaWxlTWFwLnB1dChwcm94eSwgZmlsZSk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQl0cnkgewotCQkJCQkJCVJlc291cmNlIHJlc291cmNlID0gcmVzb3VyY2VTZXQuZ2V0UmVzb3VyY2UoCi0JCQkJCQkJCQlub3JtYWxpemVkVVJJLnRyaW1GcmFnbWVudCgpLCB0cnVlKTsKLQkJCQkJCQlpZiAocmVzb3VyY2UuZ2V0RU9iamVjdChub3JtYWxpemVkVVJJLmZyYWdtZW50KCkpID09IG51bGwpIHsKLQkJCQkJCQkJbm90Rm91bmRQcm94aWVzLmFkZChwcm94eSk7Ci0JCQkJCQkJfQotCQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQlTdHJpbmcgZXJyTXNnID0gZS5nZXRNZXNzYWdlKCkgIT0gbnVsbCA/IGUKLQkJCQkJCQkJCS5nZXRNZXNzYWdlKCkgOiBlLnRvU3RyaW5nKCk7Ci0JCQkJCQkJcHJveHlUb0ZpbGVXaXRoTG9hZEVycm9yTWFwLnB1dChwcm94eSwKLQkJCQkJCQkJCW5ldyBPYmplY3RbXSB7IGZpbGUsIGVyck1zZyB9KTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWlmICghcHJveHlUb0ZpbGVNYXAuaXNFbXB0eSgpKSB7Ci0JCQkvLyBwcm9tcCB1c2VyIHRvIHJlc29sdmUgbWlzc2luZyBmaWxlcwotCQkJLy8KLQkJCUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QocHJveHlUb0ZpbGVNYXAua2V5U2V0KCkpOwotCQkJZmluYWwgU3RyaW5nIEVMRU1FTlRfUEFUSCA9IFhNSUxpYnJhcnlSZXNvdXJjZXMuZWxlbWVudFBhdGg7Ci0JCQlJTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyID0gbmV3IEFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcigKLQkJCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpIHsKLQotCQkJCS8qCi0JCQkJICogKG5vbi1KYXZhZG9jKQotCQkJCSAqIAotCQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyI2dldFRleHQoamF2YS5sYW5nLk9iamVjdCkKLQkJCQkgKi8KLQkJCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQkJCQlGaWxlIGZpbGUgPSAoRmlsZSkgcHJveHlUb0ZpbGVNYXAuZ2V0KG9iamVjdCk7Ci0JCQkJCXJldHVybiBmaWxlLmdldEFic29sdXRlUGF0aCgpCi0JCQkJCQkJKyAiICgiICsgVG5nVXRpbC5nZXRMYWJlbFdpdGhQYXRoKG9iamVjdCkgKyAnKSc7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0KLQkJCQkvKgotCQkJCSAqIChub24tSmF2YWRvYykKLQkJCQkgKiAKLQkJCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlciNnZXRDb2x1bW5UZXh0KGphdmEubGFuZy5PYmplY3QsCi0JCQkJICogICAgICBpbnQpCi0JCQkJICovCi0JCQkJcHVibGljIFN0cmluZyBnZXRDb2x1bW5UZXh0KE9iamVjdCBvYmplY3QsIGludCBjb2x1bW5JbmRleCkgewotCQkJCQlzd2l0Y2ggKGNvbHVtbkluZGV4KSB7Ci0JCQkJCWNhc2UgMDoKLQkJCQkJCXJldHVybiBwcm94eVRvRmlsZU1hcC5nZXQob2JqZWN0KS50b1N0cmluZygpOwotCQkJCQljYXNlIDE6Ci0JCQkJCQlyZXR1cm4gVG5nVXRpbC5nZXRMYWJlbFdpdGhQYXRoKG9iamVjdCk7Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCi0JCQl9OwotCi0JCQl0cnkgewotCQkJCVN0cmluZyBtc2cgPSBYTUlMaWJyYXJ5UmVzb3VyY2VzLnByb21wdFJlbW92ZVJlZmVyZW5jZXNUb01pc3NpbmdGaWxlc19tc2c7Ci0JCQkJU2VsZWN0aW9uRGlhbG9nIGRsZyA9IG5ldyBTZWxlY3Rpb25EaWFsb2coTXNnQm94Ci0JCQkJCQkuZ2V0RGVmYXVsdFNoZWxsKCksIGxpc3QsIGxhYmVsUHJvdmlkZXIsIG1zZyk7Ci0KLQkJCQlkbGcuc2V0VGl0bGUoWE1JTGlicmFyeVJlc291cmNlcy5taXNzaW5nRmlsZXNfdGl0bGUpOwotCQkJCWRsZy5zZXRCbG9ja09uT3Blbih0cnVlKTsKLQkJCQlkbGcuc2V0SW5pdGlhbEVsZW1lbnRTZWxlY3Rpb25zKGxpc3QpOwotCQkJCWRsZwotCQkJCQkJLnNldENvbHVtblByb3BlcnRpZXMobmV3IFN0cmluZ1tdIHsgRklMRV9QQVRILAotCQkJCQkJCQlFTEVNRU5UX1BBVEggfSk7Ci0JCQkJaWYgKGRsZy5vcGVuKCkgPT0gRGlhbG9nLkNBTkNFTCkgewotCQkJCQl0aHJvdyBuZXcgT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24oKTsKLQkJCQl9Ci0JCQkJT2JqZWN0IG9ianNbXSA9IGRsZy5nZXRSZXN1bHQoKTsKLQkJCQlpZiAob2JqcyA9PSBudWxsKSB7Ci0JCQkJCXRocm93IG5ldyBPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbigpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGxpc3QuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlwcm94aWVzVG9SZW1vdmUuYWRkKGl0ZXIubmV4dCgpKTsKLQotCQkJCQl9Ci0JCQkJfQotCQkJfSBmaW5hbGx5IHsKLQkJCQlsYWJlbFByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJCX0KLQkJfQotCi0JCS8vIHByb21wdCB1c2VyIHRvIHJlc29sdmUgZmlsZXMgdGhhdCBjYW4gbm90IGJlIGxvYWRlZAotCQkvLwotCQlpZiAoIXByb3h5VG9GaWxlV2l0aExvYWRFcnJvck1hcC5pc0VtcHR5KCkpIHsKLQkJCUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QocHJveHlUb0ZpbGVXaXRoTG9hZEVycm9yTWFwLmtleVNldCgpKTsKLQkJCWZpbmFsIFN0cmluZyBMT0FEX0VSUk9SID0gWE1JTGlicmFyeVJlc291cmNlcy5sb2FkRXJyb3I7Ci0JCQlJTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyID0gbmV3IEFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcigKLQkJCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpIHsKLQotCQkJCS8qCi0JCQkJICogKG5vbi1KYXZhZG9jKQotCQkJCSAqIAotCQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyI2dldENvbHVtblRleHQoamF2YS5sYW5nLk9iamVjdCwKLQkJCQkgKiAgICAgIGludCkKLQkJCQkgKi8KLQkJCQlwdWJsaWMgU3RyaW5nIGdldENvbHVtblRleHQoT2JqZWN0IG9iamVjdCwgaW50IGNvbHVtbkluZGV4KSB7Ci0JCQkJCU9iamVjdFtdIGFyciA9IChPYmplY3RbXSkgcHJveHlUb0ZpbGVNYXAuZ2V0KG9iamVjdCk7Ci0JCQkJCWlmIChjb2x1bW5JbmRleCA8IDIpIHsKLQkJCQkJCXJldHVybiBhcnJbY29sdW1uSW5kZXhdLnRvU3RyaW5nKCk7Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCi0JCQl9OwotCi0JCQl0cnkgewotCQkJCVN0cmluZyBtc2cgPSBYTUlMaWJyYXJ5UmVzb3VyY2VzLnByb21wdFJlbW92ZVJlZmVyZW5jZXNUb0ZpbGVzV2l0aExvYWRFcnJvcnNfbXNnOwotCQkJCVNlbGVjdGlvbkRpYWxvZyBkbGcgPSBuZXcgU2VsZWN0aW9uRGlhbG9nKE1zZ0JveAotCQkJCQkJLmdldERlZmF1bHRTaGVsbCgpLCBsaXN0LCBsYWJlbFByb3ZpZGVyLCBtc2cpOwotCi0JCQkJZGxnLnNldFRpdGxlKFhNSUxpYnJhcnlSZXNvdXJjZXMuZmlsZXNXaXRoTG9hZEVycm9yc190aXRsZSk7Ci0JCQkJZGxnLnNldEJsb2NrT25PcGVuKHRydWUpOwotCQkJCWRsZy5zZXRJbml0aWFsRWxlbWVudFNlbGVjdGlvbnMobGlzdCk7Ci0JCQkJZGxnLnNldENvbHVtblByb3BlcnRpZXMobmV3IFN0cmluZ1tdIHsgRklMRV9QQVRILCBMT0FEX0VSUk9SIH0pOwotCQkJCWlmIChkbGcub3BlbigpID09IERpYWxvZy5DQU5DRUwpIHsKLQkJCQkJdGhyb3cgbmV3IE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uKCk7Ci0JCQkJfQotCQkJCU9iamVjdCBvYmpzW10gPSBkbGcuZ2V0UmVzdWx0KCk7Ci0JCQkJaWYgKG9ianMgPT0gbnVsbCkgewotCQkJCQl0aHJvdyBuZXcgT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24oKTsKLQkJCQl9IGVsc2UgewotCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBsaXN0Lml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQkJcHJveGllc1RvUmVtb3ZlLmFkZChpdGVyLm5leHQoKSk7Ci0KLQkJCQkJfQotCQkJCX0KLQkJCX0gZmluYWxseSB7Ci0JCQkJbGFiZWxQcm92aWRlci5kaXNwb3NlKCk7Ci0JCQl9Ci0JCX0KLQotCQlBcnJheUxpc3QgcHJveGllc1RvUmV0YWluID0gbmV3IEFycmF5TGlzdCgpOwotCQlwcm94aWVzLmFkZEFsbChwcm94eVRvRmlsZU1hcC5rZXlTZXQoKSk7Ci0JCXByb3hpZXMuYWRkQWxsKHByb3h5VG9GaWxlV2l0aExvYWRFcnJvck1hcC5rZXlTZXQoKSk7Ci0JCXByb3hpZXMucmVtb3ZlQWxsKHByb3hpZXNUb1JlbW92ZSk7Ci0KLQkJaWYgKHByb3hpZXNUb1JldGFpbi5pc0VtcHR5KCkpIHsKLQkJCXByb3hpZXNUb1JlbW92ZS5hZGRBbGwobm90Rm91bmRQcm94aWVzKTsKLQkJCXByb3hpZXNUb1JlbW92ZS5hZGRBbGwocHJveGllc1dpdGhVbm5vcm1hbGl6ZWRVUkkpOwotCQl9Ci0KLQkJU3RyaW5nIG1zZyA9ICJTdW1tYXJ5IG9mIHVucmVzb2x2ZWQgcHJveGllczoiOyAvLyROT04tTkxTLTEkCi0JCW1zZyArPSAiXG4gIE5vdCBmb3VuZCBwcm94aWVzOiAiICsgbm90Rm91bmRQcm94aWVzOyAvLyROT04tTkxTLTEkCi0JCW1zZyArPSAiXG4gIFByb3hpZXMgd2l0aCB1bm5vcm1hbGl6ZWQgVVJJOiAiICsgcHJveGllc1dpdGhVbm5vcm1hbGl6ZWRVUkk7IC8vJE5PTi1OTFMtMSQKLQkJWE1JTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nSW5mbyhtc2cpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgdm9pZCByZW1vdmVPbGREZWZhdWx0VmFsdWVzKCkgewotCQlNdWx0aVJlc291cmNlRU9iamVjdC5yZW1vdmVEZWZhdWx0VmFsdWUoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0TWV0aG9kUGx1Z2luX1VzZXJDaGFuZ2VhYmxlKCkpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBlCi0JICogCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFkanVzdFRvTmV3RGVmYXVsdFZhbHVlcyhNZXRob2RFbGVtZW50IGUpIHsKLQkJaWYgKGUgaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pIHsKLQkJCSgoTXVsdGlSZXNvdXJjZUVPYmplY3QpIGUpCi0JCQkJCS5yZW1vdmVGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZShVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCS5nZXRNZXRob2RQbHVnaW5fVXNlckNoYW5nZWFibGUoKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHZvaWQgc2V0T2xkRGVmYXVsdFZhbHVlcygpIHsKLQkJTXVsdGlSZXNvdXJjZUVPYmplY3Quc2V0RGVmYXVsdFZhbHVlKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldE1ldGhvZFBsdWdpbl9Vc2VyQ2hhbmdlYWJsZSgpLCBCb29sZWFuLkZBTFNFKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGUoTWV0aG9kRWxlbWVudCBlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCi0JCQl0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYWRqdXN0VG9OZXdEZWZhdWx0VmFsdWVzKGUpOwotCi0JCWlmIChlIGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCUFjdGl2aXR5IGFjdCA9IChBY3Rpdml0eSkgZTsKLQkJCVZhcmlhYmlsaXR5VHlwZSB0eXBlID0gYWN0LmdldFZhcmlhYmlsaXR5VHlwZSgpOwotCQkJaWYgKHR5cGUgPT0gVmFyaWFiaWxpdHlUeXBlLkNPTlRSSUJVVEVTKSB7Ci0JCQkJYWN0Ci0JCQkJCQkuc2V0VmFyaWFiaWxpdHlUeXBlKFZhcmlhYmlsaXR5VHlwZS5MT0NBTF9DT05UUklCVVRJT04pOwotCQkJfSBlbHNlIGlmICh0eXBlID09IFZhcmlhYmlsaXR5VHlwZS5SRVBMQUNFUykgewotCQkJCWFjdAotCQkJCQkJLnNldFZhcmlhYmlsaXR5VHlwZShWYXJpYWJpbGl0eVR5cGUuTE9DQUxfUkVQTEFDRU1FTlQpOwotCQkJfQotCQl9Ci0JCWlmICghICh0aGlzIGluc3RhbmNlb2YgTWlncmF0b3IxMDJfMTAzKSkgewotCQkJTWlncmF0aW9uVXRpbC5mb3JtYXRWYWx1ZShlKTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBpbml0TWlncmF0ZSgpIHsJCQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBtaWdyYXRlRGlhZ3JhbShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBFeGNlcHRpb24gewkKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLnhtaS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkveG1pL2ludGVybmFsL21pZ3JhdGlvbi9NaWdyYXRvcjEwMl8xMDMuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLnhtaS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkveG1pL2ludGVybmFsL21pZ3JhdGlvbi9NaWdyYXRvcjEwMl8xMDMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzRmNzk2YS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS54bWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL3htaS9pbnRlcm5hbC9taWdyYXRpb24vTWlncmF0b3IxMDJfMTAzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS54bWkuaW50ZXJuYWwubWlncmF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkxpbmtlZEhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M7Ci0KLS8qKgotICogQGF1dGhvciBXZWlwaW5nIEx1IC0gTWFyIDIwLCAyMDA3Ci0gKiBAc2luY2UgMS4yCi0gKi8KLXB1YmxpYyBjbGFzcyBNaWdyYXRvcjEwMl8xMDMgZXh0ZW5kcyBNaWdyYXRvcjEwMiB7Ci0KLQlwcml2YXRlIE1hcDxTdHJpbmcsIFByb2Nlc3M+IGRpYWdyYW1FbGVtTWFwOyAKLQkKLQlwcm90ZWN0ZWQgdm9pZCBpbml0TWlncmF0ZSgpIHsKLQkJZGlhZ3JhbUVsZW1NYXAgPSBuZXcgTGlua2VkSGFzaE1hcDxTdHJpbmcsIFByb2Nlc3M+KCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZShNZXRob2RFbGVtZW50IGUsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnVwZGF0ZShlLCBtb25pdG9yKTsKLQkJTWlncmF0b3IxMDMudXBkYXRlRWxlbWVudChlLCBkaWFncmFtRWxlbU1hcCwgbW9uaXRvcik7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgbWlncmF0ZURpYWdyYW0oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJTWlncmF0b3IxMDMuZGlhZ3JhbU1pZ3JhdGUoZGlhZ3JhbUVsZW1NYXAsIG1vbml0b3IpOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLnhtaS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkveG1pL2ludGVybmFsL21pZ3JhdGlvbi9NaWdyYXRvcjEwMy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkueG1pL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS94bWkvaW50ZXJuYWwvbWlncmF0aW9uL01pZ3JhdG9yMTAzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyYzY1YTMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkueG1pL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS94bWkvaW50ZXJuYWwvbWlncmF0aW9uL01pZ3JhdG9yMTAzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkueG1pLmludGVybmFsLm1pZ3JhdGlvbjsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLm5ldC5VUkk7Ci1pbXBvcnQgamF2YS5uZXQuVVJJU3ludGF4RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRIYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlN0YWNrOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5YTUxSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLkZpbGVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuTmV0VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuRXh0ZW5zaW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuTGlua0luZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5MaWJyYXJ5VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLlJlc291cmNlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkuSURpYWdyYW1NaWdyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pLlhNSUxpYnJhcnlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pLlhNSUxpYnJhcnlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLk11bHRpRmlsZVJlc291cmNlU2V0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UubWlncmF0aW9uLlVwZ3JhZGVDYWxsZXJJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS51dGlsLlBlcnNpc3RlbmNlUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS51dGlsLlBlcnNpc3RlbmNlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNhcGFiaWxpdHlQYXR0ZXJuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcnlQcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpYmFibGVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRXhhbXBsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkd1aWRhbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3VpZGFuY2VEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5SZXVzYWJsZUFzc2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldoaXRlcGFwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci0KLS8qKgotICogQGF1dGhvciBXZWlwaW5nIEx1IC0gRmViIDEyLCAyMDA3Ci0gKiBAc2luY2UgMS4yCi0gKi8KLXB1YmxpYyBjbGFzcyBNaWdyYXRvcjEwMyBleHRlbmRzIE1pZ3JhdG9yQmFzZSB7Ci0JCi0JcHJpdmF0ZSBNYXA8U3RyaW5nLCBQcm9jZXNzPiBkaWFncmFtRWxlbU1hcDsKLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIHhtbE1pZ3JhdGUgPSBmYWxzZTsKLQkKLQlwdWJsaWMgdm9pZCBtaWdyYXRlKFN0cmluZyBsaWJQYXRoLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBFeGNlcHRpb24gewotCQltaWdyYXRlKGxpYlBhdGgsIG1vbml0b3IsIG51bGwpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBtaWdyYXRlKFN0cmluZyBsaWJQYXRoLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIFVwZ3JhZGVDYWxsZXJJbmZvIGluZm8pIHRocm93cyBFeGNlcHRpb24gewotCQlGaWxlIGxpYkZpbGUgPSBuZXcgRmlsZShsaWJQYXRoKTsKLQkJCi0JCWJvb2xlYW4gdG9WZXJpZnkgPSB0cnVlOwotCQlpZiAoaW5mbyAhPSBudWxsICYmIGluZm8uZ2V0SXNFeHBvcnRlZFBsdWdpbkxpYigpKSB7Ci0JCQl0b1ZlcmlmeSA9IGZhbHNlOwotCQl9Ci0JCXhtbE1pZ3JhdGUgPSBmYWxzZTsKLQkJUmVzb3VyY2VVdGlsLm9wZW4obGliRmlsZS5nZXRQYXJlbnQoKSwgbW9uaXRvcik7Ci0KLQkJTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsIHJlc291cmNlU2V0ID0gbnVsbDsKLQkJCi0JCWRpYWdyYW1FbGVtTWFwID0gbmV3IExpbmtlZEhhc2hNYXA8U3RyaW5nLCBQcm9jZXNzPigpOwotCQl0cnkgewotCQkJLy8gbG9hZCB0aGUgbGlicmFyeQotCQkJLy8KLQkJCXVwZGF0ZVN0YXR1cyhtb25pdG9yLCBQZXJzaXN0ZW5jZVJlc291cmNlcy5sb2FkTGlicmFyeVRhc2tfbmFtZSk7Ci0KLQkJCWlmICh0b1ZlcmlmeSkgewotCQkJCXJlc291cmNlU2V0ID0gbmV3IE11bHRpRmlsZVJlc291cmNlU2V0SW1wbChmYWxzZSk7Ci0JCQl9IGVsc2UgewotCQkJCXJlc291cmNlU2V0ID0gUGVyc2lzdGVuY2VVdGlsLmdldEltcG9ydFBsdWdpblJlc291cmNlU2V0KCk7Ci0JCQl9Ci0JCQkJCQkKLQkJCXJlc291cmNlU2V0LmdldExvYWRPcHRpb25zKCkucHV0KAotCQkJCQlYTUxSZXNvdXJjZS5PUFRJT05fUkVDT1JEX1VOS05PV05fRkVBVFVSRSwgQm9vbGVhbi5UUlVFKTsKLQotCQkJTWV0aG9kTGlicmFyeSBsaWIgPSByZXNvdXJjZVNldC5sb2FkTGlicmFyeShsaWJQYXRoKTsKLQkJCQkJCQotCQkJTGlua0luZm8uc2V0TGlicmFyeShsaWIpOwotCQkJLy8gbG9hZCBhbGwgZWxlbWVudHMgaW4gbWVtb3J5Ci0JCQkvLwotCQkJdXBkYXRlU3RhdHVzKG1vbml0b3IsIFBlcnNpc3RlbmNlUmVzb3VyY2VzLmxvYWRSZXNvdXJjZXNUYXNrX25hbWUpOwotCQkJCi0JCQl1cGRhdGVBbGxDb250ZW50cyhtb25pdG9yLCBsaWIpOwkJCQkJCi0JCQkKLQkJCS8vIHNhdmUgYWxsIGZpbGVzCi0JCQkvLwotCQkJdXBkYXRlU3RhdHVzKG1vbml0b3IsIFBlcnNpc3RlbmNlUmVzb3VyY2VzLnNhdmVMaWJyYXJ5VGFza19uYW1lKTsKLQkJCU1hcCBzYXZlT3B0aW9ucyA9IHJlc291cmNlU2V0LmdldERlZmF1bHRTYXZlT3B0aW9ucygpOwotCQkJcmVzb3VyY2VTZXQuc2F2ZShzYXZlT3B0aW9ucywgdHJ1ZSk7Ci0KLQkJCXVwZGF0ZVN0YXR1cyhtb25pdG9yLAotCQkJCQlQZXJzaXN0ZW5jZVJlc291cmNlcy5yZWZyZXNoTGlicmFyeUZpbGVzVGFza19uYW1lKTsKLQkJCQotCQkJCi0JCQlSZXNvdXJjZVV0aWwucmVmcmVzaFJlc291cmNlcyhsaWIsIG1vbml0b3IpOwotCQkJCi0JCQlkaWFncmFtTWlncmF0ZShkaWFncmFtRWxlbU1hcCwgbW9uaXRvcik7CQotCQkJCi0JCQlSZXNvdXJjZVV0aWwucmVmcmVzaFJlc291cmNlcyhsaWIsIG1vbml0b3IpOwotCQkJCi0JCX0gZmluYWxseSB7Ci0JCQlMaW5rSW5mby5zZXRMaWJyYXJ5KG51bGwpOwotCQkJCi0JCQlpZiAocmVzb3VyY2VTZXQgIT0gbnVsbCkgewotCQkJCXJlc291cmNlU2V0LnJlc2V0KCk7Ci0JCQkJcmVzb3VyY2VTZXQgPSBudWxsOwotCQkJfQotCQl9Ci0KLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIHZvaWQgZGlhZ3JhbU1pZ3JhdGUoTWFwPFN0cmluZywgUHJvY2Vzcz4gZGlhZ3JhbUVsZW1NYXAsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkvLyBDb252ZXJ0IGRpYWdyYW1zIAotCQl1cGRhdGVTdGF0dXMobW9uaXRvciwgUGVyc2lzdGVuY2VSZXNvdXJjZXMubWlncmF0aW5nRGlhZ3JhbV9uYW1lKTsKLQkJCi0JCUlEaWFncmFtTWlncmF0aW9uIGlkbSA9IChJRGlhZ3JhbU1pZ3JhdGlvbikgRXh0ZW5zaW9uTWFuYWdlci5nZXRFeHRlbnNpb24oIm9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaSIsICJkaWFncmFtTWlncmF0aW9uIik7IAkJCS8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlpZiAoaWRtICE9IG51bGwgJiYgIWRpYWdyYW1FbGVtTWFwLmlzRW1wdHkoKSkgewotCQkJdHJ5IHsKLQkJCQlpZG0ubWlncmF0ZShkaWFncmFtRWxlbU1hcC52YWx1ZXMoKSk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVFbGVtZW50KE1ldGhvZEVsZW1lbnQgZWxlbWVudCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdXBkYXRlRWxlbWVudChlbGVtZW50LCBkaWFncmFtRWxlbU1hcCwgbW9uaXRvcik7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyB2b2lkIHVwZGF0ZUVsZW1lbnQoTWV0aG9kRWxlbWVudCBlbGVtZW50LCBNYXA8U3RyaW5nLCBQcm9jZXNzPiBkaWFncmFtRWxlbU1hcCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJaWYgKGRpYWdyYW1FbGVtTWFwICE9IG51bGwpIHsKLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgQ2FwYWJpbGl0eVBhdHRlcm4gfHwKLQkJCQllbGVtZW50IGluc3RhbmNlb2YgRGVsaXZlcnlQcm9jZXNzKSB7Ci0JCQkJUHJvY2VzcyBwcm9jZXNzID0gKFByb2Nlc3MpIGVsZW1lbnQ7Ci0JCQkJaWYgKHByb2Nlc3MuZUNvbnRhaW5lcigpIGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkgewotCQkJCQlTdHJpbmcgZ3VpZCA9IGVsZW1lbnQuZ2V0R3VpZCgpOwotCQkJCQlQcm9jZXNzIHByb2MgPSBkaWFncmFtRWxlbU1hcC5nZXQoZ3VpZCk7Ci0JCQkJCWlmIChwcm9jID09IG51bGwpIHsKLQkJCQkJCWRpYWdyYW1FbGVtTWFwLnB1dChlbGVtZW50LmdldEd1aWQoKSwgKFByb2Nlc3MpIGVsZW1lbnQpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJYXNzZXJ0KHByb2MgPT0gZWxlbWVudCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJTWlncmF0aW9uVXRpbC5mb3JtYXRWYWx1ZShlbGVtZW50KTsKLQkJaGFuZGxlVHlwZUNvbnZlcnQoZWxlbWVudCk7Ci0JCWlmICghIHhtbE1pZ3JhdGUpIHsKLQkJCWhhbmRsZVNoYXBlQW5kTm9kZUljb25zKGVsZW1lbnQpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIHZvaWQgaGFuZGxlVHlwZUNvbnZlcnQoTWV0aG9kRWxlbWVudCBlbGVtZW50KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJaWYgKAllbGVtZW50IGluc3RhbmNlb2YgRXhhbXBsZSAJCQl8fAotCQkJCWVsZW1lbnQgaW5zdGFuY2VvZiBSZXVzYWJsZUFzc2V0IAl8fAotCQkJCWVsZW1lbnQgaW5zdGFuY2VvZiBXaGl0ZXBhcGVyKSB7CQkJCi0JCQlHdWlkYW5jZSBndWlkYW5jZSA9IChHdWlkYW5jZSkgZWxlbWVudDsKLQkJCUNvbnRlbnREZXNjcmlwdGlvbiBwcmVzID0gY29udmVydChndWlkYW5jZS5nZXRQcmVzZW50YXRpb24oKSk7Ci0JCQlpZiAocHJlcyAhPSBudWxsKSB7Ci0JCQkJZ3VpZGFuY2Uuc2V0UHJlc2VudGF0aW9uKHByZXMpOwotCQkJfQkJCQotCQl9Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIEd1aWRhbmNlRGVzY3JpcHRpb24gY29udmVydChDb250ZW50RGVzY3JpcHRpb24gb2xkT2JqKSB7Ci0JCWlmIChvbGRPYmogPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJR3VpZGFuY2VEZXNjcmlwdGlvbiBuZXdPYmogPSBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVHdWlkYW5jZURlc2NyaXB0aW9uKCk7CQkKLQkJUmVzb3VyY2UgcmVzID0gb2xkT2JqLmVSZXNvdXJjZSgpOwotCQlpZiAocmVzICE9IG51bGwpIHsKLQkJCXJlcy5nZXRDb250ZW50cygpLnJlbW92ZShvbGRPYmopOwotCQkJcmVzLmdldENvbnRlbnRzKCkuYWRkKG5ld09iaik7Ci0JCX0KLQkJTGlzdCBmZWF0dXJlcyA9IExpYnJhcnlVdGlsLmdldFN0cnVjdHVyYWxGZWF0dXJlcyhvbGRPYmopOwotLy8JCUxpc3QgcHJvcGVydGllcyA9IG9sZE9iai5nZXRJbnN0YW5jZVByb3BlcnRpZXMoKTsJCQotCQlpZiAoZmVhdHVyZXMgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmZWF0dXJlcy5zaXplKCk7IGkrKykgewotCQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgZmVhdHVyZXMuZ2V0KGkpOwotCQkJCU9iamVjdCB2YWx1ZSA9IG9sZE9iai5lR2V0KGZlYXR1cmUpOwotCQkJCW5ld09iai5lU2V0KGZlYXR1cmUsIHZhbHVlKTsKLQkJCX0KLQkJfQotCQkJCQotCQlyZXR1cm4gbmV3T2JqOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyB2b2lkIGhhbmRsZVNoYXBlQW5kTm9kZUljb25zKE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgRGVzY3JpYmFibGVFbGVtZW50KSB7CQkJCi0JCQlEZXNjcmliYWJsZUVsZW1lbnQgZGVzY3JpYmFibGVFbGVtZW50ID0gKERlc2NyaWJhYmxlRWxlbWVudCkgZWxlbWVudDsKLQkJCVVSSSBmaXhlZFVSSSA9IGZpeEljb25VUkkoZGVzY3JpYmFibGVFbGVtZW50LCBkZXNjcmliYWJsZUVsZW1lbnQuZ2V0U2hhcGVpY29uKCkpOwotCQkJaWYgKGZpeGVkVVJJICE9IG51bGwpIHsKLQkJCQlkZXNjcmliYWJsZUVsZW1lbnQuc2V0U2hhcGVpY29uKGZpeGVkVVJJKTsKLQkJCX0KLQkJCWZpeGVkVVJJID0gZml4SWNvblVSSShkZXNjcmliYWJsZUVsZW1lbnQsIGRlc2NyaWJhYmxlRWxlbWVudC5nZXROb2RlaWNvbigpKTsKLQkJCWlmIChmaXhlZFVSSSAhPSBudWxsKSB7Ci0JCQkJZGVzY3JpYmFibGVFbGVtZW50LnNldE5vZGVpY29uKGZpeGVkVVJJKTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIFVSSSBmaXhJY29uVVJJKERlc2NyaWJhYmxlRWxlbWVudCBlLCBVUkkgdXJpKSB7Ci0JCWlmICh1cmkgPT0gbnVsbCkgcmV0dXJuIG51bGw7Ci0JCQotCQlGaWxlIHBhdGggPSBuZXcgRmlsZShOZXRVdGlsLmRlY29kZWRGaWxlVXJsKHVyaS50b1N0cmluZygpKSk7Ci0JCVN0YWNrPFN0cmluZz4gc3RhY2sgPSBuZXcgU3RhY2s8U3RyaW5nPigpOwotCQlGaWxlIHRlbXAgPSBwYXRoOwotCQlTdHJpbmcgcmVzdWx0UGF0aCA9ICIiOyAvLyROT04tTkxTLTEkCi0JCXdoaWxlICh0ZW1wICE9IG51bGwpIHsKLQkJCXN0YWNrLnB1c2godGVtcC5nZXROYW1lKCkpOwotCQkJdGVtcCA9IHRlbXAuZ2V0UGFyZW50RmlsZSgpOwotCQl9Ci0JCWlmICghc3RhY2suaXNFbXB0eSgpKSB7Ci0JCQkvLyBub3cgc2tpcCBmaXJzdCBzdGFjayBlbnRyeSBhbmQgcmVjb25zdHJ1Y3QgcGF0aAotCQkJU3RyaW5nIHBsdWdpbk5hbWUgPSBzdGFjay5wb3AoKTsKLQkJCXdoaWxlICghc3RhY2suaXNFbXB0eSgpKSB7Ci0JCQkJaWYgKHJlc3VsdFBhdGgubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJCXJlc3VsdFBhdGggKz0gJy8nOwotCQkJCX0KLQkJCQlyZXN1bHRQYXRoID0gcmVzdWx0UGF0aCArIChTdHJpbmcpc3RhY2sucG9wKCk7Ci0JCQl9Ci0KLQkJCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSBVbWFVdGlsLmdldE1ldGhvZFBsdWdpbihlKTsKLQkJCXRyeSB7Ci0JCQkJVVJJIHJlc3VsdFVSSSA9IG5ldyBVUkkocmVzdWx0UGF0aCk7Ci0JCQkJaWYgKCFwbHVnaW5OYW1lLmVxdWFscyhwbHVnaW4uZ2V0TmFtZSgpKSkgewotCQkJCQkvLyB1cmkgd2FzIHJlZmVyaW5nIGEgZmlsZSBpbiBhbm90aGVyIHBsdWdpbgotCQkJCQlGaWxlIGxpYlJvb3QgPSBUbmdVdGlsLmdldExpYnJhcnlSb290UGF0aChlKTsKLQkJCQkJRmlsZSBvbGRGaWxlID0gbmV3IEZpbGUobGliUm9vdCwgTmV0VXRpbC5kZWNvZGVkRmlsZVVybCh1cmkudG9TdHJpbmcoKSkpOwotCQkJCQlGaWxlIG5ld0ZpbGUgPSBuZXcgRmlsZShsaWJSb290LCBwbHVnaW4uZ2V0TmFtZSgpICsgRmlsZS5zZXBhcmF0b3IgKyBOZXRVdGlsLmRlY29kZWRGaWxlVXJsKHJlc3VsdFVSSS50b1N0cmluZygpKSk7Ci0JCQkJCWlmICghbmV3RmlsZS5leGlzdHMoKSkgewotCSAgICAgIAkJCQkJRmlsZVV0aWwuY29weUZpbGUob2xkRmlsZSwgbmV3RmlsZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJcmV0dXJuIHJlc3VsdFVSSTsKLQkJCX0gY2F0Y2ggKFVSSVN5bnRheEV4Y2VwdGlvbiBleCkgewotCQkJCVhNSUxpYnJhcnlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGV4KTsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JCi0JcHVibGljIHZvaWQgbWlncmF0ZVhtbEltcG9ydGVkTGliKE1ldGhvZExpYnJhcnkgbGliLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBFeGNlcHRpb24gewotCQl4bWxNaWdyYXRlID0gdHJ1ZTsKLQkJdXBkYXRlU3RhdHVzKG1vbml0b3IsIFhNSUxpYnJhcnlSZXNvdXJjZXMubWlncmF0ZVhNTExpYnJhcnlfdGFza05hbWUpOwotCQl1cGRhdGVBbGxDb250ZW50cyhtb25pdG9yLCBsaWIpOwotCQlMaWJyYXJ5VXRpbC5zYXZlTGlicmFyeShsaWIsIGZhbHNlLCBmYWxzZSk7Ci0JCXhtbE1pZ3JhdGUgPSBmYWxzZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLnhtaS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkveG1pL2ludGVybmFsL21pZ3JhdGlvbi9NaWdyYXRvckJhc2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLnhtaS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkveG1pL2ludGVybmFsL21pZ3JhdGlvbi9NaWdyYXRvckJhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjJhMTZjMS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS54bWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL3htaS9pbnRlcm5hbC9taWdyYXRpb24vTWlncmF0b3JCYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS54bWkuaW50ZXJuYWwubWlncmF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5Db21tb25QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pLlhNSUxpYnJhcnlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLm1pZ3JhdGlvbi5NaWdyYXRvckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLm1pZ3JhdGlvbi5VcGdyYWRlQ2FsbGVySW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotCi0vKioKLSAqIEJhc2UgY2xhc3MgaW1wbGVtZW50YXRpb24gZm9yIG1pZ3JhdG9ycwotICogCi0gKiBAYXV0aG9yIFdlaXBpbmcgTHUgLSBGZWIgMTIsIDIwMDcKLSAqIEBzaW5jZSAxLjIKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIE1pZ3JhdG9yQmFzZSBleHRlbmRzIE1pZ3JhdG9ySW1wbCB7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHID0gWE1JTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCS5pc0RlYnVnZ2luZygpOwotCQotCXByb3RlY3RlZCBzdGF0aWMgdm9pZCB1cGRhdGVTdGF0dXMoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBTdHJpbmcgbXNnKSB7Ci0JCWlmIChtb25pdG9yICE9IG51bGwpIHsKLQkJCW1vbml0b3Iuc3ViVGFzayhtc2cpOwotCQkJbW9uaXRvci53b3JrZWQoMSk7Ci0JCQl0cnkgewotCQkJCVRocmVhZC5zbGVlcCgxMCk7Ci0JCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8KLQkJCX0KLQkJfSBlbHNlIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbihtc2cpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZUFsbENvbnRlbnRzKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgTWV0aG9kTGlicmFyeSBsaWIpIHRocm93cyBFeGNlcHRpb24gewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBsaWIuZUFsbENvbnRlbnRzKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJRU9iamVjdCBlbGVtZW50ID0gKEVPYmplY3QpIGl0ZXIubmV4dCgpOwotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQkJdHJ5IHsKLQkJCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGVsZW1lbnQuZUNyb3NzUmVmZXJlbmNlcygpCi0JCQkJCQkJLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCQkJCWl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJfQotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCUNvbW1vblBsdWdpbi5JTlNUQU5DRS5sb2coZSk7Ci0JCQkJCWlmIChERUJVRykgewotCQkJCQkJU3lzdGVtLmVycgotCQkJCQkJCQkucHJpbnRsbigiRXJyb3IgaXRlcmF0ZSB0aHJ1IGNyb3NzIHJlZmVyZW5jZXMgb2YgZWxlbWVudDogIiArIGVsZW1lbnQpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQl9Ci0JCQkJdXBkYXRlRWxlbWVudCgoTWV0aG9kRWxlbWVudCkgZWxlbWVudCwgbW9uaXRvcik7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgdXBkYXRlRWxlbWVudChNZXRob2RFbGVtZW50IGVsZW1lbnQsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEV4Y2VwdGlvbjsJCi0JCi0JcHVibGljIGFic3RyYWN0IHZvaWQgbWlncmF0ZShTdHJpbmcgbGliUGF0aCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgRXhjZXB0aW9uOwotCQotCXB1YmxpYyBhYnN0cmFjdCB2b2lkIG1pZ3JhdGUoU3RyaW5nIGxpYlBhdGgsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgVXBncmFkZUNhbGxlckluZm8gaW5mbykgdGhyb3dzIEV4Y2VwdGlvbjsKLQotCQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkueG1pL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS94bWkvaW50ZXJuYWwvbWlncmF0aW9uL1NlbGVjdGlvbkRpYWxvZy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkueG1pL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS94bWkvaW50ZXJuYWwvbWlncmF0aW9uL1NlbGVjdGlvbkRpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZGI3OGJjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLnhtaS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkveG1pL2ludGVybmFsL21pZ3JhdGlvbi9TZWxlY3Rpb25EaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLnhtaS5pbnRlcm5hbC5taWdyYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuTGlzdFNlbGVjdGlvbkRpYWxvZzsKLQotLyoqCi0gKiBEaXNwbGF5cyBhIGRpYWxvZyB0aGF0IGxpc3RzIG1pc3NpbmcgZmlsZXMgaW4gYSBtZXRob2QgbGlicmFyeSB0byBiZSB1cGdyYWRlZC4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFNlbGVjdGlvbkRpYWxvZyBleHRlbmRzIExpc3RTZWxlY3Rpb25EaWFsb2cgewotCi0JcHJpdmF0ZSBTdHJpbmdbXSBjb2x1bW5Qcm9wZXJ0aWVzOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgU2VsZWN0aW9uRGlhbG9nKFNoZWxsIHBhcmVudFNoZWxsLCBPYmplY3QgaW5wdXQsCi0JCQlJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciBjb250ZW50UHJvdmlkZXIsCi0JCQlJTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyLCBTdHJpbmcgbWVzc2FnZSkgewotCQlzdXBlcihwYXJlbnRTaGVsbCwgaW5wdXQsIGNvbnRlbnRQcm92aWRlciwgbGFiZWxQcm92aWRlciwgbWVzc2FnZSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgU2VsZWN0aW9uRGlhbG9nKFNoZWxsIHBhcmVudFNoZWxsLCBMaXN0IGlucHV0LAotCQkJSUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlciwgU3RyaW5nIG1lc3NhZ2UpIHsKLQkJc3VwZXIocGFyZW50U2hlbGwsIGlucHV0LCBuZXcgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIoKSB7Ci0JCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IG9iamVjdCkgewotCQkJCXJldHVybiAoKExpc3QpIG9iamVjdCkudG9BcnJheSgpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LAotCQkJCQlPYmplY3QgbmV3SW5wdXQpIHsKLQkJCX0KLQkJfSwgbGFiZWxQcm92aWRlciwgbWVzc2FnZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Q29sdW1uUHJvcGVydGllcyhTdHJpbmdbXSBjb2x1bW5Qcm9wZXJ0aWVzKSB7Ci0JCXRoaXMuY29sdW1uUHJvcGVydGllcyA9IGNvbHVtblByb3BlcnRpZXM7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLkxpc3RTZWxlY3Rpb25EaWFsb2cjY3JlYXRlRGlhbG9nQXJlYShvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCi0JICovCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbnRyb2wgY3RybCA9IHN1cGVyLmNyZWF0ZURpYWxvZ0FyZWEocGFyZW50KTsKLQotCQkvLyBjcmVhdGUgdGFibGUgY29sdW1ucwotCQkvLwotCQlUYWJsZSB0YWJsZSA9IGdldFZpZXdlcigpLmdldFRhYmxlKCk7Ci0JCXRhYmxlLnNldEhlYWRlclZpc2libGUodHJ1ZSk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY29sdW1uUHJvcGVydGllcy5sZW5ndGg7IGkrKykgewotCQkJVGFibGVDb2x1bW4gY29sID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTEVGVCk7Ci0JCQljb2wuc2V0VGV4dChjb2x1bW5Qcm9wZXJ0aWVzW2ldKTsKLQkJCWNvbC5zZXRSZXNpemFibGUodHJ1ZSk7Ci0JCQljb2wuc2V0V2lkdGgoMjAwKTsKLQkJfQotCQlnZXRWaWV3ZXIoKS5zZXRDb2x1bW5Qcm9wZXJ0aWVzKGNvbHVtblByb3BlcnRpZXMpOwotCQlnZXRWaWV3ZXIoKS5yZWZyZXNoKCk7Ci0KLQkJcmV0dXJuIGN0cmw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS54bWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL3htaS9pbnRlcm5hbC9taWdyYXRpb24vcGFja2FnZS5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkueG1pL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS94bWkvaW50ZXJuYWwvbWlncmF0aW9uL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzg3YzNkZi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS54bWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL3htaS9pbnRlcm5hbC9taWdyYXRpb24vcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgbWlncmF0aW9uIHN1cHBvcnQgZm9yIHVwZ3JhZGluZyBhIFhNSS1iYXNlZCBtZXRob2QgbGlicmFyeS4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS8uY2xhc3NwYXRoIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDY1YWMwNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvLm9wdGlvbnMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS8ub3B0aW9ucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGUxZGVlNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS8ub3B0aW9ucworKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotIyBUdXJuIG9uIGRlYnVnIHRyYWNlIGZvciB0aGUgTGlicmFyeSBwbHVnLWluCi1vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9kZWJ1Zz10cnVlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS8ucHJvamVjdCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Y2RlMWU5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWk8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjNiOTdiYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aTsgc2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS41LjAucXVhbGlmaWVyCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5MaWJyYXJ5VUlQbHVnaW4KLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5O3Zpc2liaWxpdHk6PXJlZXhwb3J0LAotIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLAotIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZSwKLSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWksCi0gb3JnLmVjbGlwc2UuZXBmLnVpO3Zpc2liaWxpdHk6PXJlZXhwb3J0LAotIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQ7dmlzaWJpbGl0eTo9cmVleHBvcnQsCi0gb3JnLmVjbGlwc2UudWk7dmlzaWJpbGl0eTo9cmVleHBvcnQsCi0gb3JnLmVjbGlwc2UudWkuaWRlO3Zpc2liaWxpdHk6PXJlZXhwb3J0LAotIG9yZy5lY2xpcHNlLmVwZi5jb21tb24udWksCi0gb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkKLUVjbGlwc2UtTGF6eVN0YXJ0OiB0cnVlCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWksCi0gb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuYWN0aW9ucywKLSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5kaWFsb2dzLAotIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLnByZWZlcmVuY2VzLAotIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLnByb3ZpZGVycywKLSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS51dGlsLAotIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLnZpZXdzLAotIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLndpemFyZHMKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNQotCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9idWlsZC5wcm9wZXJ0aWVzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDczMWVkYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1zb3VyY2UuLiA9IHNyYy8KLW91dHB1dC4uID0gYmluLwotYmluLmluY2x1ZGVzID0gLixcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgaWNvbnMvLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgLm9wdGlvbnMKLSAgICAgICAgICAgICAgICAgCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9pY29ucy9PcGVuTGlicmFyeS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9pY29ucy9PcGVuTGlicmFyeS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyNDk4MzEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvaWNvbnMvT3BlbkxpYnJhcnkuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvaWNvbnMvZnVsbC9vYmoxNi9NZXRob2RMaWJyYXJ5LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL2ljb25zL2Z1bGwvb2JqMTYvTWV0aG9kTGlicmFyeS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwYTMxMWUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvaWNvbnMvZnVsbC9vYmoxNi9NZXRob2RMaWJyYXJ5LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL2ljb25zL2Z1bGwvd2l6YmFuL0V4cG9ydFByb2Nlc3MuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvaWNvbnMvZnVsbC93aXpiYW4vRXhwb3J0UHJvY2Vzcy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyNDk4MzEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvaWNvbnMvZnVsbC93aXpiYW4vRXhwb3J0UHJvY2Vzcy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9pY29ucy9mdWxsL3dpemJhbi9PcGVuLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL2ljb25zL2Z1bGwvd2l6YmFuL09wZW4uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMjQ5ODMxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL2ljb25zL2Z1bGwvd2l6YmFuL09wZW4uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvcGx1Z2luLnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGNlZDllNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSCi0KLSMgUGx1Zy1pbgotcGx1Z2luTmFtZT1FUEYgTGlicmFyeSBVSQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCi0KLSMgT3BlbiBNZXRob2QgTGlicmFyeSBBY3Rpb24gCi1hY3Rpb25TZXRMYWJlbD1NZXRob2QgQXV0aG9yaW5nCi1maWxlT3Blbk1lbnVMYWJlbD1PJnBlbgotb3BlbkxpYnJhcnlBY3Rpb25sYWJlbD1NZXRob2QgTGlicmFyeQotb3BlbkxpYnJhcnlBY3Rpb25Ub29sdGlwPU9wZW4gYSBtZXRob2QgbGlicmFyeQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvcGx1Z2luLnhtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlODYxOGMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08cGx1Z2luPiAgICAgICAgICAgCi0KLSAgIDxleHRlbnNpb24tcG9pbnQKLSAgICAgICAgIGlkPSJuZXdMaWJyYXJ5V2l6YXJkUGFnZXMiCi0gICAgICAgICBuYW1lPSJFUEYgTmV3IE1ldGhvZCBMaWJyYXJ5IFdpemFyZCBQYWdlcyIKLSAgICAgICAgIHNjaGVtYT0ic2NoZW1hL05ld0xpYnJhcnlXaXphcmRQYWdlcy5leHNkIi8+Ci0KLSAgIDxleHRlbnNpb24tcG9pbnQKLSAgICAgICAgIGlkPSJvcGVuTGlicmFyeVdpemFyZFBhZ2VzIgotICAgICAgICAgbmFtZT0iRVBGIE9wZW4gTWV0aG9kIExpYnJhcnkgV2l6YXJkIFBhZ2VzIgotICAgICAgICAgc2NoZW1hPSJzY2hlbWEvT3BlbkxpYnJhcnlXaXphcmRQYWdlcy5leHNkIi8+Ci0KLSAgIDxleHRlbnNpb24tcG9pbnQKLSAgICAgICAgIGlkPSJvcGVuTGlicmFyeVdpemFyZCIKLSAgICAgICAgIG5hbWU9Ik9wZW4gTWV0aG9kIExpYnJhcnkgV2l6YXJkIEV4dGVuc2lvbiIKLSAgICAgICAgIHNjaGVtYT0ic2NoZW1hL09wZW5MaWJyYXJ5V2l6YXJkLmV4c2QiIC8+Ci0gICAgICAgICAKLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmFjdGlvblNldHMiPgotICAgICAgPGFjdGlvblNldAotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLmFjdGlvblNldCIKLSAgICAgICAgICAgIGxhYmVsPSIlYWN0aW9uU2V0TGFiZWwiCi0gICAgICAgICAgICB2aXNpYmxlPSJ0cnVlIj4KLSAgICAgICAgIDxtZW51Ci0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkubWVudS5maWxlT3Blbk1lbnUiCi0gICAgICAgICAgICAgICBsYWJlbD0iJWZpbGVPcGVuTWVudUxhYmVsIgotICAgICAgICAgICAgICAgcGF0aD0iZmlsZS9uZXcuZXh0Ij4KLSAgICAgICAgICAgIDxzZXBhcmF0b3IgbmFtZT0iZ3JvdXBtMSIvPgotICAgICAgICAgICAgPHNlcGFyYXRvciBuYW1lPSJncm91cG0yIi8+Ci0gICAgICAgICA8L21lbnU+Ci0gICAgICAgICA8YWN0aW9uCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuYWN0aW9ucy5PcGVuTGlicmFyeUFjdGlvbiIKLSAgICAgICAgICAgICAgIGhlbHBDb250ZXh0SWQ9ImZpbGVfb3Blbl9saWJyYXJ5X2NvbnRleHQiCi0gICAgICAgICAgICAgICBpY29uPSJpY29ucy9mdWxsL29iajE2L01ldGhvZExpYnJhcnkuZ2lmIgotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLmFjdGlvbnMuT3BlbkxpYnJhcnlBY3Rpb24iCi0gICAgICAgICAgICAgICBsYWJlbD0iJW9wZW5MaWJyYXJ5QWN0aW9ubGFiZWwiCi0gICAgICAgICAgICAgICBtZW51YmFyUGF0aD0iZmlsZS9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5tZW51LmZpbGVPcGVuTWVudS9ncm91cG0xIgotICAgICAgICAgICAgICAgdG9vbHRpcD0iJW9wZW5MaWJyYXJ5QWN0aW9uVG9vbHRpcCIvPgotICAgICAgPC9hY3Rpb25TZXQ+Ci0gICA8L2V4dGVuc2lvbj4KLQotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zY2hlbWEvTmV3TGlicmFyeVdpemFyZFBhZ2VzLmV4c2QgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zY2hlbWEvTmV3TGlicmFyeVdpemFyZFBhZ2VzLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzOWM0NmYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc2NoZW1hL05ld0xpYnJhcnlXaXphcmRQYWdlcy5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTM0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpIj4KLTxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aSIgaWQ9Im5ld0xpYnJhcnlXaXphcmRQYWdlcyIgbmFtZT0iRVBGIE5ldyBNZXRob2QgTGlicmFyeSBXaXphcmQgUGFnZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgRW5hYmxlcyBhIHBsdWctaW4gdG8gY29udHJpYnV0ZSBhIG1ldGhvZCBsaWJyYXJ5IHR5cGUgc3BlY2lmaWMgd2l6YXJkIHBhZ2UgdG8gdGhlIE5ldyBNZXRob2QgTGlicmFyeSB3aXphcmQuCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9Im5ld0xpYnJhcnlXaXphcmRQYWdlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBBIGZ1bGx5IHF1YWxpZmllZCBpZGVudGlmaWVyIG9mIHRoZSB0YXJnZXQgZXh0ZW5zaW9uIHBvaW50LgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIEFuIG9wdGlvbmFsIGlkZW50aWZpZXIgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZS4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIEFuIG9wdGlvbmFsIG5hbWUgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZS4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0ibmV3TGlicmFyeVdpemFyZFBhZ2UiPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgSmF2YSBjbGFzcyB0aGF0IGltcGxlbWVudHMgYSB3aXphcmQgcGFnZS4gVGhpcyBjbGFzcyBtdXN0IGV4dGVuZHMgJmx0O2NvZGUmZ3Q7b3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkud2l6YXJkcy5BZGRMaWJyYXJ5V2l6YXJkUGFnZSZsdDsvY29kZSZndDsuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idHlwZSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgaWRlbnRpZmllciBvZiBhIHNwZWNpZmljIG1ldGhvZCBsaWJyYXJ5IHR5cGUgKGRhdGFiYXNlLCB4bWksIGV0Yy4pLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InRpdGxlIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSB0aXRsZSBmb3IgdGhlIHdpemFyZCBwYWdlLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSBkZXNjcmlwdGlvbiBmb3IgdGhlIHdpemFyZCBwYWdlLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAxLjAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgVGhlIGZvbGxvd2luZyBpcyBhbiBleGFtcGxlIG9mIGEgTGlicmFyeSBNYW5hZ2VyIGV4dGVuc2lvbiBwb2ludDogCi0mbHQ7cCZndDsKLSZsdDtwcmUmZ3Q7Ci0gICAmbHQ7ZXh0ZW5zaW9uIHBvaW50PSZxdW90O29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLm5ld0xpYnJhcnlXaXphcmRQYWdlcyZxdW90OyZndDsKLSAgICAgICZsdDthZGRMaWJyYXJ5V2l6YXJkUGFnZQotICAgICAgICAgY2xhc3M9JnF1b3Q7b3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkueG1pLk5ld1hNSUxpYnJhcnlXaXphcmRQYWdlJnF1b3Q7Ci0gICAgICAgICB0eXBlPSZxdW90O3htaSZxdW90OwotICAgICAgICAgdGl0bGU9JnF1b3Q7Q3JlYXRlcyBhIFhNSSBtZXRob2QgbGlicmFyeS4mcXVvdDsKLSAgICAgICAgIGRlc2NyaXB0aW9uPSZxdW90O1NwZWNpZnkgdGhlIGxvY2F0aW9uIGZvciB0aGUgWE1JIG1ldGhvZCBsaWJyYXJ5LiZxdW90OyZndDsKLSAgICAgICZsdDsvYWRkTGlicmFyeVdpemFyZFBhZ2UmZ3Q7Ci0gICAmbHQ7L2V4dGVuc2lvbiZndDsKLSZsdDsvcHJlJmd0OwotJmx0Oy9wJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4mbHQ7YnImZ3Q7Ci1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAmbHQ7YSAKLWhyZWY9JnF1b3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmcXVvdDsmZ3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmbHQ7L2EmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc2NoZW1hL09wZW5MaWJyYXJ5V2l6YXJkLmV4c2QgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zY2hlbWEvT3BlbkxpYnJhcnlXaXphcmQuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGM3ODFhYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zY2hlbWEvT3BlbkxpYnJhcnlXaXphcmQuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDE1NSArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC51aSI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AudWkiIGlkPSJleHBvcnRNU1BXaXphcmQiIG5hbWU9IkV4cG9ydCBNaWNyb3NvZnQgUHJvamVjdCBXaXphcmQgRXh0ZW5zaW9uIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIEVuYWJsZXMgYSBwbHVnLWluIHRvIGV4dGVuZCB0aGUgT3BlbiBNZXRob2QgTGlicmFyeSB3aXphcmQgYnkgcmVwbGFjaW5nIGV4aXN0aW5nIHdpemFyZCBwYWdlcyBvciBhZGRpbmcgbmV3IG9uZXMuCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9IndpemFyZEV4dGVuZGVyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgQSBmdWxseSBxdWFsaWZpZWQgaWRlbnRpZmllciBvZiB0aGUgdGFyZ2V0IGV4dGVuc2lvbiBwb2ludC4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBBbiBvcHRpb25hbCBpZGVudGlmaWVyIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBBbiBvcHRpb25hbCBuYW1lIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9IndpemFyZEV4dGVuZGVyIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0id2l6YXJkUGFnZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhlIEphdmEgY2xhc3MgdGhhdCBpbXBsZW1lbnRzIHRoZSB3aXphcmQgZXh0ZW5kZXIuIFRoaXMgY2xhc3MgbXVzdCBpbXBsZW1lbnRzICZsdDtjb2RlJmd0O29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLndpemFyZHMuSVB1Ymxpc2hDb25maWdXaXphcmRFeHRlbmRlciZsdDsvY29kZSZndDsuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9IndpemFyZFBhZ2UiPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgSmF2YSBjbGFzcyB0aGF0IGltcGxlbWVudHMgdGhlIHdpemFyZCBwYWdlLiBUaGlzIGNsYXNzIG11c3QgaW1wbGVtZW50cyAmbHQ7Y29kZSZndDtvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZFBhZ2UmbHQ7L2NvZGUmZ3Q7LgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InR5cGUiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhlIHR5cGUgb2YgZXh0ZW5zaW9uIC0gJnF1b3Q7cmVwbGFjZSZxdW90OyBvciAmcXVvdDtuZXcmcXVvdDsuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idGFyZ2V0IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSBuYW1lIG9mIHRoZSBiYXNlIHdpemFyZCBwYWdlIHRvIGJlIHJlcGxhY2VkIG9yIHVzZWQgYXMgYSByZWZlcmVuY2UgZm9yIGluc2VydGluZyBhIG5ldyB3aXphcmQgcGFnZS4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpbnNlcnQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhlIGluc2VydGlvbiB0eXBlIGZvciBhIG5ldyB3aXphcmQgcGFnZSAtICZxdW90O2JlZm9yZSZxdW90OyBvciAmcXVvdDthZnRlciZxdW90Oy4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgMS4yCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFRoZSBmb2xsb3dpbmcgaXMgYW4gZXhhbXBsZSBvZiBob3cgdGhlIGV4dGVuc2lvbiBwb2ludCBjYW4gYmUgdXNlZDogCi0mbHQ7cCZndDsKLSZsdDtwcmUmZ3Q7Ci0gICAmbHQ7ZXh0ZW5zaW9uIHBvaW50PSZxdW90O29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLm9wZW5MaWJyYXJ5V2l6YXJkJnF1b3Q7Jmd0OwotICAgICAgJmx0O3dpemFyZAotICAgICAgICAgICAgY2xhc3M9JnF1b3Q7b3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkud2l6YXJkcy5NeU9wZW5MaWJyYXJ5V2l6YXJkJnF1b3Q7Jmd0OwotICAgICAgICAgJmx0O3dpemFyZFBhZ2UKLSAgICAgICAgICAgICAgIGNsYXNzPSZxdW90O29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLndpemFyZHMuTXlPcGVuTGlicmFyeU1haW5QYWdlJnF1b3Q7Ci0gICAgICAgICAgICAgICB0eXBlPSZxdW90O3JlcGxhY2UmcXVvdDsKLSAgICAgICAgICAgICAgIHRhcmdldD0mcXVvdDtvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS53aXphcmRzLk9wZW5MaWJyYXJ5TWFpblBhZ2UmcXVvdDsvJmd0OwotICAgICAgICAgJmx0O3dpemFyZFBhZ2UKLSAgICAgICAgICAgICAgIGNsYXNzPSZxdW90O29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLndpemFyZHMuTXlPcGVuTGlicmFyeU9wdGlvblBhZ2UmcXVvdDsKLSAgICAgICAgICAgICAgIHR5cGU9JnF1b3Q7bmV3JnF1b3Q7Ci0gICAgICAgICAgICAgICB0YXJnZXQ9JnF1b3Q7b3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkud2l6YXJkcy5PcGVuTGlicmFyeU1haW5QYWdlJnF1b3Q7Ci0gICAgICAgICAgICAgICBpbnNlcnQ9JnF1b3Q7YWZ0ZXImcXVvdDsvJmd0OyAgICAgICAgICAgICAgICAgICAgIAotICAgICAgJmx0Oy93aXphcmQmZ3Q7Ci0gICAmbHQ7L2V4dGVuc2lvbiZndDsKLSZsdDsvcHJlJmd0OwotJmx0Oy9wJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4mbHQ7YnImZ3Q7Ci1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAmbHQ7YSAKLWhyZWY9JnF1b3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmcXVvdDsmZ3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmbHQ7L2EmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc2NoZW1hL09wZW5MaWJyYXJ5V2l6YXJkUGFnZXMuZXhzZCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NjaGVtYS9PcGVuTGlicmFyeVdpemFyZFBhZ2VzLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjMGU0MTYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc2NoZW1hL09wZW5MaWJyYXJ5V2l6YXJkUGFnZXMuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDEzNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aSI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkiIGlkPSJvcGVuTGlicmFyeVdpemFyZFBhZ2VzIiBuYW1lPSJFUEYgT3BlbiBNZXRob2QgTGlicmFyeSBXaXphcmQgUGFnZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgRW5hYmxlcyBhIHBsdWctaW4gdG8gY29udHJpYnV0ZSBhIG1ldGhvZCBsaWJyYXJ5IHR5cGUgc3BlY2lmaWMgd2l6YXJkIHBhZ2UgdG8gdGhlIE9wZW4gTWV0aG9kIExpYnJhcnkgd2l6YXJkLgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJvcGVuTGlicmFyeVdpemFyZFBhZ2UiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIEEgZnVsbHkgcXVhbGlmaWVkIGlkZW50aWZpZXIgb2YgdGhlIHRhcmdldCBleHRlbnNpb24gcG9pbnQuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgQW4gb3B0aW9uYWwgaWRlbnRpZmllciBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgQW4gb3B0aW9uYWwgbmFtZSBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJvcGVuTGlicmFyeVdpemFyZFBhZ2UiPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgSmF2YSBjbGFzcyB0aGF0IGltcGxlbWVudHMgYSB3aXphcmQgcGFnZS4gVGhpcyBjbGFzcyBtdXN0IGV4dGVuZHMgJmx0O2NvZGUmZ3Q7b3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkud2l6YXJkcy5BZGRMaWJyYXJ5V2l6YXJkUGFnZSZsdDsvY29kZSZndDsuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idHlwZSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgaWRlbnRpZmllciBvZiBhIHNwZWNpZmljIG1ldGhvZCBsaWJyYXJ5IHR5cGUgKGRhdGFiYXNlLCB4bWksIGV0Yy4pLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InRpdGxlIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSB0aXRsZSBmb3IgdGhlIHdpemFyZCBwYWdlLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSBkZXNjcmlwdGlvbiBmb3IgdGhlIHdpemFyZCBwYWdlLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAxLjAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgVGhlIGZvbGxvd2luZyBpcyBhbiBleGFtcGxlIG9mIGEgTGlicmFyeSBNYW5hZ2VyIGV4dGVuc2lvbiBwb2ludDogCi0mbHQ7cCZndDsKLSZsdDtwcmUmZ3Q7Ci0gICAmbHQ7ZXh0ZW5zaW9uIHBvaW50PSZxdW90O29yZy5lY2xpcHNlLmVwZi5saWJycmF5LnVpLm9wZW5MaWJyYXJ5V2l6YXJkUGFnZXMmcXVvdDsmZ3Q7Ci0gICAgICAmbHQ7b3BlbkxpYnJhcnlXaXphcmRQYWdlCi0gICAgICAgICBjbGFzcz0mcXVvdDtvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS54bWkuT3BlblhNSUxpYnJhcnlXaXphcmRQYWdlJnF1b3Q7Ci0gICAgICAgICB0eXBlPSZxdW90O3htaSZxdW90OwotICAgICAgICAgdGl0bGU9JnF1b3Q7T3BlbnMgYSBYTUkgbWV0aG9kIGxpYnJhcnkuJnF1b3Q7Ci0gICAgICAgICBkZXNjcmlwdGlvbj0mcXVvdDtTcGVjaWZ5IHRoZSBsb2NhdGlvbiBmb3IgdGhlIFhNSSBtZXRob2QgbGlicmFyeS4mcXVvdDsmZ3Q7Ci0gICAgICAmbHQ7L29wZW5MaWJyYXJ5V2l6YXJkUGFnZSZndDsKLSAgICZsdDsvZXh0ZW5zaW9uJmd0OwotJmx0Oy9wcmUmZ3Q7Ci0mbHQ7L3AmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiZsdDticiZndDsKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICZsdDthIAotaHJlZj0mcXVvdDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZxdW90OyZndDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZsdDsvYSZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotPC9zY2hlbWE+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvSU1ldGhvZEVsZW1lbnRQcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL0lNZXRob2RFbGVtZW50UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjhiODQxNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvSU1ldGhvZEVsZW1lbnRQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci0KLS8qKgotICogVGhlIGludGVyZmFjZSBmb3IgYSBtZXRob2QgZWxlbWVudCBwcm92aWRlci4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIAotICogQHNpbmNlIDEuMgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElNZXRob2RFbGVtZW50UHJvdmlkZXIgewotCi0JLyoqCi0JICogR2V0cyB0aGUgbWV0aG9kIGVsZW1lbnQgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcHJvdmlkZXIuCi0JICogCi0JICogQHJldHVybiBhIG1ldGhvZCBlbGVtZW50Ci0JICovCi0JcHVibGljIE1ldGhvZEVsZW1lbnQgZ2V0TWV0aG9kRWxlbWVudCgpOwotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvTGlicmFyeVVJSW1hZ2VzLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvTGlicmFyeVVJSW1hZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1YTExY2EuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL0xpYnJhcnlVSUltYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuRXh0ZW5kZWRJbWFnZVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuVW1hRWRpdFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0KLS8qKgotICogUHJvdmlkZXMgYWNjZXNzIHRvIGNhY2hlZCBjb3B5IG9mIGNvbW1vbmx5IHJlZmVyZW5jZWQgaW1hZ2VzIGluIHRoZSBsaWJyYXJ5IFVJLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIExpYnJhcnlVSUltYWdlcyB7Ci0KLQkvKioKLQkgKiBUaGUgaW1hZ2VzIGFzc29jaWF0ZWQgd2l0aCB0aGUgTWV0aG9kIExpYnJhcnkgZWxlbWVudHMuCi0JICogPHA+Ci0JICogVGhlc2UgaW1hZ2VzIGFyZSBjYWNoZWQgYW5kIHNob3VsZCBub3QgYmUgZGlzcG9zZWQgYnkgdGhlIHVzZXIhCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBJTUdfQUNUSVZJVFkgPSBnZXRFbGVtZW50SW1hZ2UoImZ1bGwvb2JqMTYvQWN0aXZpdHkiKTsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBJTUdfQVJUSUZBQ1QgPSBnZXRFbGVtZW50SW1hZ2UoImZ1bGwvb2JqMTYvQXJ0aWZhY3QiKTsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBJTUdfQ0FQQUJJTElUWV9QQVRURVJOID0gZ2V0RWxlbWVudEltYWdlKCJmdWxsL29iajE2L0NhcGFiaWxpdHlQYXR0ZXJuIik7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgSU1HX0NIRUNLTElTVCA9IGdldEVsZW1lbnRJbWFnZSgiZnVsbC9vYmoxNi9DaGVja2xpc3QiKTsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBJTUdfQ09NUE9TSVRFX1JPTEUgPSBnZXRFbGVtZW50SW1hZ2UoImZ1bGwvb2JqMTYvQ29tcG9zaXRlUm9sZSIpOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIElNR19DT05DRVBUID0gZ2V0RWxlbWVudEltYWdlKCJmdWxsL29iajE2L0NvbmNlcHQiKTsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBJTUdfQ09OVEVOVF9QQUNLQUdFID0gZ2V0RWxlbWVudEltYWdlKCJmdWxsL29iajE2L0NvbnRlbnRQYWNrYWdlIik7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgSU1HX0NVU1RPTV9DQVRFR09SWSA9IGdldEVsZW1lbnRJbWFnZSgiZnVsbC9vYmoxNi9DdXN0b21DYXRlZ29yeSIpOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIElNR19ERUxJVkVSQUJMRSA9IGdldEVsZW1lbnRJbWFnZSgiZnVsbC9vYmoxNi9EZWxpdmVyYWJsZSIpOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIElNR19ERUxJVkVSWV9QUk9DRVNTID0gZ2V0RWxlbWVudEltYWdlKCJmdWxsL29iajE2L0RlbGl2ZXJ5UHJvY2VzcyIpOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIElNR19ESVNDSVBMSU5FID0gZ2V0RWxlbWVudEltYWdlKCJmdWxsL29iajE2L0Rpc2NpcGxpbmUiKTsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBJTUdfRElTQ0lQTElORV9HUk9VUElORyA9IGdldEVsZW1lbnRJbWFnZSgiZnVsbC9vYmoxNi9EaXNjaXBsaW5lR3JvdXBpbmciKTsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBJTUdfRE9NQUlOID0gZ2V0RWxlbWVudEltYWdlKCJmdWxsL29iajE2L0RvbWFpbiIpOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIElNR19FU1RJTUFURSA9IGdldEVsZW1lbnRJbWFnZSgiZnVsbC9vYmoxNi9Fc3RpbWF0ZSIpOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIElNR19FU1RJTUFUSU5HX01FVFJJQyA9IGdldEVsZW1lbnRJbWFnZSgiZnVsbC9vYmoxNi9Fc3RpbWF0aW5nTWV0cmljIik7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgSU1HX0VTVElNQVRJT05fQ09OU0lERVJBVElPTlMgPSBnZXRFbGVtZW50SW1hZ2UoImZ1bGwvb2JqMTYvRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIik7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgSU1HX0VYQU1QTEUgPSBnZXRFbGVtZW50SW1hZ2UoImZ1bGwvb2JqMTYvRXhhbXBsZSIpOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIElNR19HVUlERUxJTkUgPSBnZXRFbGVtZW50SW1hZ2UoImZ1bGwvb2JqMTYvR3VpZGVsaW5lIik7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgSU1HX0lURVJBVElPTiA9IGdldEVsZW1lbnRJbWFnZSgiZnVsbC9vYmoxNi9JdGVyYXRpb24iKTsgLy8kTk9OLU5MUy0xJAkKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgSU1HX01FVEhPRF9DT05GSUdVUkFUT04gPSBnZXRFbGVtZW50SW1hZ2UoImZ1bGwvb2JqMTYvTWV0aG9kQ29uZmlndXJhdGlvbiIpOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIElNR19NRVRIT0RfTElCQVJBUlkgPSBnZXRFbGVtZW50SW1hZ2UoImZ1bGwvb2JqMTYvTWV0aG9kTGlicmFyeSIpOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIElNR19NRVRIT0RfUEFDS0FHRSA9IGdldEVsZW1lbnRJbWFnZSgiZnVsbC9vYmoxNi9NZXRob2RQYWNrYWdlIik7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgSU1HX01FVEhPRF9QTFVHSU4gPSBnZXRFbGVtZW50SW1hZ2UoImZ1bGwvb2JqMTYvTWV0aG9kUGx1Z2luIik7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgSU1HX01JTEVTVE9ORSA9IGdldEVsZW1lbnRJbWFnZSgiZnVsbC9vYmoxNi9NaWxlc3RvbmUiKTsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBJTUdfT1VUQ09NRSA9IGdldEVsZW1lbnRJbWFnZSgiZnVsbC9vYmoxNi9PdXRjb21lIik7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgSU1HX1BIQVNFID0gZ2V0RWxlbWVudEltYWdlKCJmdWxsL29iajE2L1BoYXNlIik7IC8vJE5PTi1OTFMtMSQJCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIElNR19QUkFDVElDRSA9IGdldEVsZW1lbnRJbWFnZSgiZnVsbC9vYmoxNi9QcmFjdGljZSIpOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIElNR19QUk9DRVNTID0gZ2V0RWxlbWVudEltYWdlKCJmdWxsL29iajE2L1Byb2Nlc3MiKTsgLy8kTk9OLU5MUy0xJAkKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgSU1HX1BST0NFU1NfQ09OVFJJQlVUSU9OID0gZ2V0RWxlbWVudEltYWdlKCJmdWxsL29iajE2L1Byb2Nlc3NDb250cmlidXRpb24iKTsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBJTUdfUFJPQ0VTU19GQU1JTFkgPSBnZXRFbGVtZW50SW1hZ2UoImZ1bGwvb2JqMTYvUHJvY2Vzc0ZhbWlseSIpOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIElNR19QUk9DRVNTX1BBQ0tBR0UgPSBnZXRFbGVtZW50SW1hZ2UoImZ1bGwvb2JqMTYvUHJvY2Vzc1BhY2thZ2UiKTsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBJTUdfUkVQT1JUID0gZ2V0RWxlbWVudEltYWdlKCJmdWxsL29iajE2L1JlcG9ydCIpOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIElNR19ST0FETUFQID0gZ2V0RWxlbWVudEltYWdlKCJmdWxsL29iajE2L1JvYWRtYXAiKTsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBJTUdfUk9MRV9ERVNDUklQVE9SID0gZ2V0RWxlbWVudEltYWdlKCJmdWxsL29iajE2L1JvbGVEZXNjcmlwdG9yIik7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgSU1HX1JPTEUgPSBnZXRFbGVtZW50SW1hZ2UoImZ1bGwvb2JqMTYvUm9sZSIpOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIElNR19ST0xFX1NFVCA9IGdldEVsZW1lbnRJbWFnZSgiZnVsbC9vYmoxNi9Sb2xlU2V0Iik7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgSU1HX1JPTEVfU0VUX0dST1VQSU5HID0gZ2V0RWxlbWVudEltYWdlKCJmdWxsL29iajE2L1JvbGVTZXRHcm91cGluZyIpOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIElNR19TVVBQT1JUSU5HX01BVEVSSUFMID0gZ2V0RWxlbWVudEltYWdlKCJmdWxsL29iajE2L1N1cHBvcnRpbmdNYXRlcmlhbCIpOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIElNR19UQVNLID0gZ2V0RWxlbWVudEltYWdlKCJmdWxsL29iajE2L1Rhc2siKTsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBJTUdfVEFTS19ERVNDUklQVE9SID0gZ2V0RWxlbWVudEltYWdlKCJmdWxsL29iajE2L1Rhc2tEZXNjcmlwdG9yIik7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgSU1HX1RFQU1fUFJPRklMRSA9IGdldEVsZW1lbnRJbWFnZSgiZnVsbC9vYmoxNi9UZWFtUHJvZmlsZSIpOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIElNR19URU1QTEFURSA9IGdldEVsZW1lbnRJbWFnZSgiZnVsbC9vYmoxNi9UZW1wbGF0ZSIpOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIElNR19URVJNX0RFRklOSVRJT04gPSBnZXRFbGVtZW50SW1hZ2UoImZ1bGwvb2JqMTYvVGVybURlZmluaXRpb24iKTsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBJTUdfVE9PTCA9IGdldEVsZW1lbnRJbWFnZSgiZnVsbC9vYmoxNi9Ub29sIik7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgSU1HX1RPT0xfTUVOVE9SID0gZ2V0RWxlbWVudEltYWdlKCJmdWxsL29iajE2L1Rvb2xNZW50b3IiKTsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBJTUdfV0hJVEVQQVBFUiA9IGdldEVsZW1lbnRJbWFnZSgiZnVsbC9vYmoxNi9XaGl0ZXBhcGVyIik7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgSU1HX1dPUktfUFJPRFVDVCA9IGdldEVsZW1lbnRJbWFnZSgiZnVsbC9vYmoxNi9Xb3JrUHJvZHVjdCIpOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIElNR19XT1JLX1BST0RVQ1RfVFlQRSA9IGdldEVsZW1lbnRJbWFnZSgiZnVsbC9vYmoxNi9Xb3JrUHJvZHVjdFR5cGUiKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgaW1hZ2UgZ2l2ZW4gdGhlIHJlbGF0aXZlIHBhdGguCi0JICogCi0JICogQHBhcmFtIHBhdGgKLQkgKiAgICAgICAgICAgIGEgcGF0aCByZWxhdGl2ZSB0byAiaWNvbnMiIGZvbGRlciBpbiB0aGUgdGhlIFVNQSBFZGl0IHBsdWctaW4KLQkgKiBAcmV0dXJuIGFuIDxjb2RlPkltYWdlPC9jb2RlPiBvYmplY3QKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIEltYWdlIGdldEVsZW1lbnRJbWFnZShTdHJpbmcgcGF0aCkgewotCQlyZXR1cm4gRXh0ZW5kZWRJbWFnZVJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0SW1hZ2UoCi0JCQkJVW1hRWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRJbWFnZShwYXRoKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvTGlicmFyeVVJTWFuYWdlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL0xpYnJhcnlVSU1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmRiZDk4YS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvTGlicmFyeVVJTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTY0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJJOwotaW1wb3J0IGphdmEubmV0LlVSSVN5bnRheEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5PcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnNlcnZpY2UudXRpbHMuQ29tbWFuZExpbmVSdW5VdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuRmlsZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5JMThuVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLk5ldFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5TdHJVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2VVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudWkuVXNlckludGVyYWN0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5MYXlvdXRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UuSUxpYnJhcnlSZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wcmVmZXJlbmNlcy5MaWJyYXJ5UHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucHJlZnMuUHJlZmVyZW5jZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuc2VydmljZXMuU2FmZVVwZGF0ZUNvbnRyb2xsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuYWN0aW9ucy5Db25maWd1cmF0aW9uQ29udHJpYnV0aW9uSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5kaWFsb2dzLkNvcHlMaWJyYXJ5RGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLnByZWZlcmVuY2VzLkxpYnJhcnlVSVByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLndpemFyZHMuTGlicmFyeUJhY2t1cFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pLlhNSUxpYnJhcnlNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS5YTUlMaWJyYXJ5VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UuTXVsdGlGaWxlU2F2ZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLm1pZ3JhdGlvbi5NYXBwaW5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UubWlncmF0aW9uLlVwZ3JhZGVDYWxsZXJJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLk1lc3NhZ2VFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkNvb2xCYXJNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQ29udHJpYnV0aW9uSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUNvb2xCYXJNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JVG9vbEJhck1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLlRvb2xCYXJDb250cmlidXRpb25JdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5Ub29sQmFyTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5Qcm9ncmVzc01vbml0b3JEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LkFwcGxpY2F0aW9uV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kuc2VydmljZS5kYXRhbG9jYXRpb24uTG9jYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklQYXJ0TGlzdGVuZXIyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklQZXJzcGVjdGl2ZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVBlcnNwZWN0aXZlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydFJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5Xb3Jrc3BhY2VNb2RpZnlPcGVyYXRpb247Ci0KLS8qKgotICogVGhlIGRlZmF1bHQgTGlicmFyeSBVSSBNYW5hZ2VyIGltcGxlbWVudGF0aW9uLgotICogPHA+Ci0gKiBBIExpYnJhcnkgTWFuYWdlciBwcm92aWRlcyB0aGUgdXNlciBpbnRlcmZhY2UgZm9yIGNyZWF0aW5nIGFuZCBvcGVuaW5nIGEKLSAqIG1ldGhvZCBsaWJyYXJ5LgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBMaWJyYXJ5VUlNYW5hZ2VyIHsKLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBERUJVRyA9IExpYnJhcnlVSVBsdWdpbi5nZXREZWZhdWx0KCkuaXNEZWJ1Z2dpbmcoKTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUT09MQkFSX0NPTkZJR19DT05UUklCVVRJT05fSUQgPSAidG9vbGJhci5jb25maWcuY29udHJpYnV0aW9uIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENPTkZJR19WSUVXX0lEID0gIm9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudmlld3MuQ29uZmlndXJhdGlvblZpZXciOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPQ0VTU19FRElUT1JfSUQgPSAib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLlByb2Nlc3NFZGl0b3IiOyAvLyROT04tTkxTLTEkCi0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFUE9SVF9QRVJTX0lEID0gIm9yZy5lY2xpcHNlLmJpcnQucmVwb3J0LmRlc2lnbmVyLnVpLlJlcG9ydFBlcnNwZWN0aXZlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgTGlicmFyeVVJTWFuYWdlciBpbnN0YW5jZSA9IG51bGw7Ci0JCi0JLy8gVGhlIFVSSSBvZiB0aGUgbWV0aG9kIGxpYnJhcnkgdGhhdCB3aWxsIGJlIG9wZW5lZCByZWdhcmRsZXNzIG9mIHRoZQotCS8vIHNhdmVkIGxpYnJhcnkgcHJlZmVyZW5jZXMuCi0JcHJvdGVjdGVkIHN0YXRpYyBVUkkgbGlicmFyeVVSSTsKLQotCS8vIFRoZSBVUkkgb2YgdGhlIG1ldGhvZCBsaWJyYXJ5IHRoYXQgd2lsbCBiZSBvcGVuZWQgb25seSBpZiB0aGVyZSBhcmUKLQkvLyBubyBzYXZlZCBsaWJyYXJ5IHByZWZlcmVuY2VzLgotCXByb3RlY3RlZCBzdGF0aWMgVVJJIGRlZmF1bHRMaWJyYXJ5VVJJOwotCXByb3RlY3RlZCBzdGF0aWMgVVJJIGRlZmF1bHRMaWJyYXJ5VVJJX05MOwotCXByaXZhdGUgYm9vbGVhbiBsaWJyYXJ5SW5pdGlhbGl6ZWQgPSBmYWxzZTsKLQkKLQlwcm90ZWN0ZWQgQ29uZmlndXJhdGlvbkNvbnRyaWJ1dGlvbkl0ZW0gY29uZmlnQ29tYm8gPSBudWxsOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2luZ2xldG9uIGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlicmFyeVVJTWFuYWdlciBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKGluc3RhbmNlID09IG51bGwpIHsKLQkJCXN5bmNocm9uaXplZCAoTGlicmFyeVVJTWFuYWdlci5jbGFzcykgewotCQkJCWlmIChpbnN0YW5jZSA9PSBudWxsKSB7Ci0JCQkJCWluc3RhbmNlID0gbmV3IExpYnJhcnlVSU1hbmFnZXIoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLQotCS8qKgotCSAqIFByaXZhdGUgZGVmYXVsdCBjb25zdHJ1Y3RvciB0byBwcmV2ZW50IHRoaXMgY2xhc3MgZnJvbSBiZWluZwotCSAqIGluc3RhbnRpYXRlZC4KLQkgKi8KLQlwcml2YXRlIExpYnJhcnlVSU1hbmFnZXIoKSB7Ci0JCS8vIE1vbml0b3IgcGVyc3BlY3RpdmUgY2hhbmdlcyB0byBkaXNwbGF5L2hpZGUgdGhlIGNvbmZpZ3VyYXRpb24gY29tYm8uCi0JCUlXb3JrYmVuY2hXaW5kb3cgd2luZG93ID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKQotCQkJCS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKLQkJaWYgKHdpbmRvdyAhPSBudWxsKSB7Ci0JCQl3aW5kb3cuYWRkUGVyc3BlY3RpdmVMaXN0ZW5lcihuZXcgSVBlcnNwZWN0aXZlTGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgcGVyc3BlY3RpdmVBY3RpdmF0ZWQoSVdvcmtiZW5jaFBhZ2UgcGFnZSwKLQkJCQkJCUlQZXJzcGVjdGl2ZURlc2NyaXB0b3IgZGVzYykgewotCQkJCQljaGVja0NvbmZpZ3VyYXRpb25Db250cmlidXRpb24oKTsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgdm9pZCBwZXJzcGVjdGl2ZUNoYW5nZWQoSVdvcmtiZW5jaFBhZ2UgcGFnZSwKLQkJCQkJCUlQZXJzcGVjdGl2ZURlc2NyaXB0b3IgZGVzYywgU3RyaW5nIGlkKSB7Ci0JCQkJCWNoZWNrQ29uZmlndXJhdGlvbkNvbnRyaWJ1dGlvbigpOwotCQkJCX0KLQkJCX0pOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgYW5kIG9wZW5zIGEgbmV3IG1ldGhvZCBsaWJyYXJ5LgotCSAqIAotCSAqIEBwYXJhbSBwYXRoCi0JICogICAgICAgICAgICB0aGUgbWV0aG9kIGxpYnJhcnkgcGF0aAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIG1ldGhvZCBsaWJyYXJ5IGlzIGNyZWF0ZWQgYW5kIG9wZW5lZAotCSAqICAgICAgICAgc3VjY2Vzc2Z1bGx5Ci0JICovCi0JcHVibGljIGJvb2xlYW4gY3JlYXRlTGlicmFyeShTdHJpbmcgcGF0aCkgewotCQl0cnkgewotCQkJRmlsZSBsaWJyYXJ5UGF0aCA9IG5ldyBGaWxlKHBhdGgpOwotCQkJaWYgKCFsaWJyYXJ5UGF0aC5leGlzdHMoKSkgewotCQkJCWxpYnJhcnlQYXRoLm1rZGlycygpOwotCQkJfQotCQkJWE1JTGlicmFyeVV0aWwuY3JlYXRlTWV0aG9kTGlicmFyeShsaWJyYXJ5UGF0aC5nZXROYW1lKCksIHBhdGgpOwotCQkJTGlicmFyeVVJUHJlZmVyZW5jZXMuc2V0U2F2ZWRMaWJyYXJ5UGF0aChwYXRoKTsKLQkJCXJldHVybiB0cnVlOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIE9wZW5zIHRoZSBkZWZhdWx0IG1ldGhvZCBsaWJyYXJ5IGdpdmVuIHRoZSBkZWZhdWx0IGxpYnJhcnkgcGF0aCBVUkkuCi0JICogCi0JICogQHBhcmFtIHBhdGgKLQkgKiAgICAgICAgICAgIFVSSSBwYXRoIHRvIGEgbWV0aG9kIGxpYnJhcnkKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBtZXRob2QgbGlicmFyeSBpcyBvcGVuZWQgc3VjY2Vzc2Z1bGx5Ci0JICovCi0JcHVibGljIGJvb2xlYW4gb3BlbkRlZmF1bHRMaWJyYXJ5KGZpbmFsIFVSSSB1cmkpIHsKLQkJdHJ5IHsKLQkJCUZpbGUgZGVmYXVsdExpYnJhcnlQYXRoRmlsZSA9IG5ldyBGaWxlKHVyaSk7Ci0JCQlGaWxlIGxpYnJhcnlYTUlGaWxlID0gbmV3IEZpbGUoZGVmYXVsdExpYnJhcnlQYXRoRmlsZSwgWE1JTGlicmFyeU1hbmFnZXIuTElCUkFSWV9YTUkpOwotCQkJaWYgKCFsaWJyYXJ5WE1JRmlsZS5leGlzdHMoKSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQotCQkJV29ya3NwYWNlTW9kaWZ5T3BlcmF0aW9uIG9wZXJhdGlvbiA9IG5ldyBXb3Jrc3BhY2VNb2RpZnlPcGVyYXRpb24oKSB7Ci0JCQkJcHVibGljIHZvaWQgZXhlY3V0ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCVVSSSBsaWJVcmkgPSB1cmk7Ci0JCQkJCQlTdHJpbmcgbmV3UGF0aCA9IGhhbmRsZUxpYnJhcnlPblJlYWRPbmx5SW5zdGFsbFBhdGgobGliVXJpKTsKLQkJCQkJCWlmIChuZXdQYXRoICE9IG51bGwpIHsKLQkJCQkJCQlsaWJVcmkgPSBTdHJVdGlsLnRvVVJJKG5ld1BhdGgpOwotCQkJCQkJfQotCQkJCQkJCi0JCQkJCQlTdHJpbmcgdGFza05hbWUgPSBMaWJyYXJ5VUlSZXNvdXJjZXMub3BlbmluZ0xpYnJhcnlUYXNrX25hbWU7Ci0JCQkJCQltb25pdG9yLmJlZ2luVGFzayh0YXNrTmFtZSwgMik7Ci0JCQkJCQltb25pdG9yLnNldFRhc2tOYW1lKHRhc2tOYW1lKTsKLQkJCQkJCW1vbml0b3Iud29ya2VkKDEpOwotCQkJCQkJTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5jbG9zZUN1cnJlbnRNZXRob2RMaWJyYXJ5KCk7Ci0JCQkJCQlMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLm9wZW5NZXRob2RMaWJyYXJ5KCJ4bWkiLCBsaWJVcmkpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlMaWJyYXJ5VUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCQl9IGZpbmFsbHkgewotCQkJCQkJbW9uaXRvci5kb25lKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9OwotCQkJU2hlbGwgc2hlbGwgPSBEaXNwbGF5LmdldEN1cnJlbnQoKS5nZXRBY3RpdmVTaGVsbCgpOwotCQkJUHJvZ3Jlc3NNb25pdG9yRGlhbG9nIGRpYWxvZyA9IG5ldyBQcm9ncmVzc01vbml0b3JEaWFsb2coc2hlbGwpIHsKLQkJCQlwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVTaGVsbChTaGVsbCBzaGVsbCkgewotCQkJCQlzdXBlci5jb25maWd1cmVTaGVsbChzaGVsbCk7Ci0JCQkJCXNoZWxsLnNldFRleHQoTGlicmFyeVVJUmVzb3VyY2VzLm9wZW5MaWJyYXJ5V2l6YXJkX3RpdGxlKTsKLQkJCQl9Ci0JCQl9OwotCQkJZGlhbG9nLnJ1bih0cnVlLCBmYWxzZSwgb3BlcmF0aW9uKTsKLQkJCXJldHVybiBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCkgIT0gbnVsbDsKLQkJCQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLy8gZG9uJ3QgZG8gYW55dGhpbmcKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogT3BlbnMgdGhlIGxhc3Qgb3BlbmVkIG1ldGhvZCBsaWJyYXJ5LgotCSAqIAotCSAqIEBwYXJhbSBwYXRoCi0JICogICAgICAgICAgICBVUkkgcGF0aCB0byBhIG1ldGhvZCBsaWJyYXJ5Ci0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgbWV0aG9kIGxpYnJhcnkgaXMgb3BlbmVkIHN1Y2Nlc3NmdWxseQotCSAqLwotCXB1YmxpYyBib29sZWFuIG9wZW5MYXN0T3BlbmVkTGlicmFyeSgpIHsKLQkJdHJ5IHsKLQkJCQotCQkJLy8gZmlyc3QgY2hlY2sgZm9yIHNhdmVkIGxpYiBpbiBwcmVmZXJlbmNlCi0JCQkvLyBzbyB0aGF0IHdlIGRvbid0IHNob3cgcHJvZ3Jlc3MgbW9uaXRvciBpZiB0aGVyZSdzIG5vIGxpYgotCQkJU3RyaW5nIHNhdmVkTWV0aG9kTGlicmFyeVVSSSA9IExpYnJhcnlQcmVmZXJlbmNlcwotCQkJCS5nZXRTYXZlZE1ldGhvZExpYnJhcnlVUkkoKTsKLQkJCVVSSSB1cmkgPSBuZXcgVVJJKHNhdmVkTWV0aG9kTGlicmFyeVVSSSk7Ci0JCQlpZiAodXJpLmdldFBhdGgoKS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCi0JCQlXb3Jrc3BhY2VNb2RpZnlPcGVyYXRpb24gb3BlcmF0aW9uID0gbmV3IFdvcmtzcGFjZU1vZGlmeU9wZXJhdGlvbigpIHsKLQkJCQlwdWJsaWMgdm9pZCBleGVjdXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkJCQl0cnkgewotCQkJCQkJU3RyaW5nIHRhc2tOYW1lID0gTGlicmFyeVVJUmVzb3VyY2VzLm9wZW5pbmdMaWJyYXJ5VGFza19uYW1lOwotCQkJCQkJbW9uaXRvci5iZWdpblRhc2sodGFza05hbWUsIDIpOwotCQkJCQkJbW9uaXRvci5zZXRUYXNrTmFtZSh0YXNrTmFtZSk7Ci0JCQkJCQltb25pdG9yLndvcmtlZCgxKTsKLQkJCQkJCUxpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuY2xvc2VDdXJyZW50TWV0aG9kTGlicmFyeSgpOwotCQkJCQkJTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5vcGVuTGFzdE9wZW5lZE1ldGhvZExpYnJhcnkoKTsKLQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCUxpYnJhcnlVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkJCX0gZmluYWxseSB7Ci0JCQkJCQltb25pdG9yLmRvbmUoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX07Ci0JCQlTaGVsbCBzaGVsbCA9IERpc3BsYXkuZ2V0Q3VycmVudCgpLmdldEFjdGl2ZVNoZWxsKCk7Ci0JCQlQcm9ncmVzc01vbml0b3JEaWFsb2cgZGlhbG9nID0gbmV3IFByb2dyZXNzTW9uaXRvckRpYWxvZyhzaGVsbCkgewotCQkJCXByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZVNoZWxsKFNoZWxsIHNoZWxsKSB7Ci0JCQkJCXN1cGVyLmNvbmZpZ3VyZVNoZWxsKHNoZWxsKTsKLQkJCQkJc2hlbGwuc2V0VGV4dChMaWJyYXJ5VUlSZXNvdXJjZXMub3BlbkxpYnJhcnlXaXphcmRfdGl0bGUpOwotCQkJCX0KLQkJCX07Ci0JCQlkaWFsb2cucnVuKHRydWUsIGZhbHNlLCBvcGVyYXRpb24pOwkJCQotCQkJcmV0dXJuIExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKSAhPSBudWxsOwotCQkJCi0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBkb24ndCBkbyBhbnl0aGluZwotCQl9CQkKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQkvKioKLQkgKiBPcGVucyBhIG1ldGhvZCBsaWJyYXJ5IGdpdmVuIHRoZSBsaWJyYXJ5IHBhdGggVVJJLgotCSAqIAotCSAqIEBwYXJhbSBwYXRoCi0JICogICAgICAgICAgICBVUkkgcGF0aCB0byBhIG1ldGhvZCBsaWJyYXJ5Ci0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgbWV0aG9kIGxpYnJhcnkgaXMgb3BlbmVkIHN1Y2Nlc3NmdWxseQotCSAqLwotCXB1YmxpYyBib29sZWFuIG9wZW5MaWJyYXJ5KGZpbmFsIFVSSSB1cmkpIHsKLQkJTWFwPFN0cmluZywgT2JqZWN0PiBhcmdzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7Ci0JCWFyZ3MucHV0KFhNSUxpYnJhcnlNYW5hZ2VyLkFSR19MSUJSQVJZX1BBVEgsIG5ldyBGaWxlKHVyaSkuZ2V0QWJzb2x1dGVQYXRoKCkpOwotCQlyZXR1cm4gb3BlbkxpYnJhcnkoWE1JTGlicmFyeU1hbmFnZXIuTElCUkFSWV9UWVBFLCBhcmdzKTsKLQl9Ci0KLQkvKioKLQkgKiBPcGVucyBhIG1ldGhvZCBsaWJyYXJ5IGdpdmVuIHRoZSBsaWJyYXJ5IHBhdGguCi0JICogCi0JICogQHBhcmFtIHBhdGgKLQkgKiAgICAgICAgICAgIHBhdGggdG8gYSBtZXRob2QgbGlicmFyeQotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIG1ldGhvZCBsaWJyYXJ5IGlzIG9wZW5lZCBzdWNjZXNzZnVsbHkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBvcGVuTGlicmFyeShmaW5hbCBTdHJpbmcgcGF0aCkgewotCQlNYXA8U3RyaW5nLCBPYmplY3Q+IGFyZ3MgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKLQkJYXJncy5wdXQoWE1JTGlicmFyeU1hbmFnZXIuQVJHX0xJQlJBUllfUEFUSCwgcGF0aCk7Ci0JCXJldHVybiBvcGVuTGlicmFyeShYTUlMaWJyYXJ5TWFuYWdlci5MSUJSQVJZX1RZUEUsIGFyZ3MpOwotCX0KLQotCS8qKgotCSAqIE9wZW5zIGEgbWV0aG9kIGxpYnJhcnkuCi0JICogCi0JICogQHBhcmFtIHR5cGUKLQkgKiAgICAgICAgICAgIHRoZSBtZXRob2QgbGlicmFyeSB0eXBlCi0JICogQHBhcmFtIHBhcmFtcwotCSAqICAgICAgICAgICAgbWV0aG9kIGxpYnJhcnkgc3BlY2lmaWMgYXJndW1lbnRzCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgbWV0aG9kIGxpYnJhcnkgaXMgb3BlbmVkIHN1Y2Nlc3NmdWxseQotCSAqLwotCXB1YmxpYyBib29sZWFuIG9wZW5MaWJyYXJ5KGZpbmFsIFN0cmluZyB0eXBlLCBmaW5hbCBNYXA8U3RyaW5nLCBPYmplY3Q+IGFyZ3MpIHsKLQkJZmluYWwgU3RyaW5nIHBhdGggPSAoU3RyaW5nKSBhcmdzCi0JCQkJLmdldChYTUlMaWJyYXJ5TWFuYWdlci5BUkdfTElCUkFSWV9QQVRIKTsKLQotCQlTaGVsbCBzaGVsbCA9IERpc3BsYXkuZ2V0Q3VycmVudCgpLmdldEFjdGl2ZVNoZWxsKCk7Ci0KLQkJZmluYWwgTGlzdDxFeGNlcHRpb24+IGVycm9ycyA9IG5ldyBBcnJheUxpc3Q8RXhjZXB0aW9uPigpOwotCi0JCS8vIERvIHRoZSB3b3JrIHdpdGhpbiBhbiBvcGVyYXRpb24gYmVjYXVzZSB0aGlzIGlzIGEgbG9uZyBydW5uaW5nCi0JCS8vIGFjdGl2aXR5IHRoYXQgbW9kaWZpZXMgdGhlIHdvcmtzcGFjZS4KLQkJV29ya3NwYWNlTW9kaWZ5T3BlcmF0aW9uIG9wZXJhdGlvbiA9IG5ldyBXb3Jrc3BhY2VNb2RpZnlPcGVyYXRpb24oKSB7Ci0JCQlwdWJsaWMgdm9pZCBleGVjdXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkJCVN0cmluZyB0YXNrTmFtZSA9IExpYnJhcnlVSVJlc291cmNlcy5vcGVuaW5nTGlicmFyeVRhc2tfbmFtZTsKLQkJCQltb25pdG9yLmJlZ2luVGFzayh0YXNrTmFtZSwgMik7Ci0JCQkJdHJ5IHsKLQkJCQkJbW9uaXRvci5zZXRUYXNrTmFtZSh0YXNrTmFtZSk7Ci0JCQkJCW1vbml0b3Iud29ya2VkKDEpOwotCQkJCQlMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmNsb3NlQ3VycmVudE1ldGhvZExpYnJhcnkoKTsKLQkJCQkJTWV0aG9kTGlicmFyeSBsaWJyYXJ5ID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKQotCQkJCQkJCS5vcGVuTWV0aG9kTGlicmFyeSh0eXBlLCBhcmdzKTsKLQkJCQkJTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5zZXRDdXJyZW50TWV0aG9kTGlicmFyeSgKLQkJCQkJCQlsaWJyYXJ5KTsKLQkJCQkJTGlicmFyeVVJUHJlZmVyZW5jZXMuc2V0U2F2ZWRMaWJyYXJ5UGF0aChwYXRoKTsKLQotCQkJCQkvLyBTaG93IFByb2JsZW1zIFZpZXcgaWYgbmVjZXNzYXJ5LgotCQkJCQlJTGlicmFyeVJlc291cmNlU2V0IHJlc291cmNlU2V0ID0gKChJTGlicmFyeVJlc291cmNlU2V0KSBMaWJyYXJ5U2VydmljZQotCQkJCQkJCS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRMaWJyYXJ5TWFuYWdlcigpCi0JCQkJCQkJLmdldEVkaXRpbmdEb21haW4oKS5nZXRSZXNvdXJjZVNldCgpKTsKLQkJCQkJaWYgKHJlc291cmNlU2V0Lmhhc1VucmVzb2x2ZWRQcm94eSgpKSB7Ci0JCQkJCQlTYWZlVXBkYXRlQ29udHJvbGxlci5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQkJdHJ5IHsKLQkJCQkJCQkJCVBsYXRmb3JtVUkKLQkJCQkJCQkJCQkJLmdldFdvcmtiZW5jaCgpCi0JCQkJCQkJCQkJCS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKQotCQkJCQkJCQkJCQkuZ2V0QWN0aXZlUGFnZSgpCi0JCQkJCQkJCQkJCS5zaG93VmlldygKLQkJCQkJCQkJCQkJCQkib3JnLmVjbGlwc2UudWkudmlld3MuUHJvYmxlbVZpZXciLCBudWxsLCBJV29ya2JlbmNoUGFnZS5WSUVXX1ZJU0lCTEUpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJCQlMaWJyYXJ5VUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpCi0JCQkJCQkJCQkJCS5sb2dFcnJvcihlKTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0pOwotCQkJCQl9Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJaWYgKCEoZSBpbnN0YW5jZW9mIElPRXhjZXB0aW9uICYmIGUuZ2V0TWVzc2FnZSgpCi0JCQkJCQkJLnN0YXJ0c1dpdGgoIiMjIyIpKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCQlMaWJyYXJ5VUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCQl9Ci0JCQkJCWVycm9ycy5hZGQoZSk7Ci0JCQkJfSBmaW5hbGx5IHsKLQkJCQkJbW9uaXRvci5kb25lKCk7Ci0JCQkJfQotCQkJfQotCQl9OwotCi0JCXRyeSB7Ci0JCQlQcm9ncmVzc01vbml0b3JEaWFsb2cgZGlhbG9nID0gbmV3IFByb2dyZXNzTW9uaXRvckRpYWxvZyhzaGVsbCkgewotCQkJCXByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZVNoZWxsKFNoZWxsIHNoZWxsKSB7Ci0JCQkJCXN1cGVyLmNvbmZpZ3VyZVNoZWxsKHNoZWxsKTsKLQkJCQkJc2hlbGwuc2V0VGV4dChMaWJyYXJ5VUlSZXNvdXJjZXMub3BlbkxpYnJhcnlXaXphcmRfdGl0bGUpOwotCQkJCX0KLQkJCX07Ci0JCQlkaWFsb2cucnVuKHRydWUsIGZhbHNlLCBvcGVyYXRpb24pOwotCQkJaWYgKGVycm9ycy5pc0VtcHR5KCkpIHsKLQkJCQlJV29ya2JlbmNoV2luZG93IHdvcmtiZW5jaFdpbmRvdyA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkKLQkJCQkJCS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKLQkJCQlpZiAod29ya2JlbmNoV2luZG93ICE9IG51bGwpIHsKLQkJCQkJSVdvcmtiZW5jaFBhZ2UgYWN0aXZlUGFnZSA9IHdvcmtiZW5jaFdpbmRvdy5nZXRBY3RpdmVQYWdlKCk7Ci0JCQkJCWlmIChhY3RpdmVQYWdlICE9IG51bGwpIHsKLQkJCQkJCWFjdGl2ZVBhZ2UuY2xvc2VBbGxFZGl0b3JzKGZhbHNlKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0gZWxzZSB7Ci0JCQkJSXRlcmF0b3I8RXhjZXB0aW9uPiBpdGVyID0gZXJyb3JzLml0ZXJhdG9yKCk7Ci0JCQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQkJCUV4Y2VwdGlvbiBlID0gaXRlci5uZXh0KCk7Ci0JCQkJCWlmIChlIGluc3RhbmNlb2YgSU9FeGNlcHRpb24pIHsKLQkJCQkJCVN0cmluZyBtZXNzYWdlID0gZS5nZXRNZXNzYWdlKCk7Ci0JCQkJCQlpZiAobWVzc2FnZS5zdGFydHNXaXRoKCIjIyMiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCQkJU3RyaW5nIHByb2plY3RGaWxlTmFtZSA9IG1lc3NhZ2Uuc3Vic3RyaW5nKDMpOwotCi0JCQkJCQkJU3RyaW5nIHByb21wdCA9IExpYnJhcnlVSVJlc291cmNlcwotCQkJCQkJCQkJLmJpbmQoCi0JCQkJCQkJCQkJCUxpYnJhcnlVSVJlc291cmNlcy5yZWFkT25seVByb2plY3RGaWxlX3RleHQsCi0JCQkJCQkJCQkJCXByb2plY3RGaWxlTmFtZSk7Ci0JCQkJCQkJU3RyaW5nW10gYnV0dG9uTGFiZWxzID0gewotCQkJCQkJCQkJTGlicmFyeVVJUmVzb3VyY2VzLnJldHJ5QnV0dG9uX3RleHQsCi0JCQkJCQkJCQlMaWJyYXJ5VUlSZXNvdXJjZXMuY2FuY2VsQnV0dG9uX3RleHQgfTsKLQkJCQkJCQlNZXNzYWdlRGlhbG9nIG1zZ0JveCA9IG5ldyBNZXNzYWdlRGlhbG9nKERpc3BsYXkKLQkJCQkJCQkJCS5nZXRDdXJyZW50KCkuZ2V0QWN0aXZlU2hlbGwoKSwKLQkJCQkJCQkJCUxpYnJhcnlVSVJlc291cmNlcy5vcGVuTGlicmFyeVdpemFyZF90aXRsZSwKLQkJCQkJCQkJCW51bGwsIHByb21wdCwgTWVzc2FnZURpYWxvZy5XQVJOSU5HLAotCQkJCQkJCQkJYnV0dG9uTGFiZWxzLCAwKTsKLQkJCQkJCQlpZiAobXNnQm94Lm9wZW4oKSA9PSAwKSB7Ci0JCQkJCQkJCXJldHVybiBvcGVuTGlicmFyeShwYXRoKTsKLQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlUaHJvd2FibGUgZXggPSBlOwotCQkJCQkJZm9yIChleCA9IGU7IGV4ICE9IG51bGwKLQkJCQkJCQkJJiYgIShleCBpbnN0YW5jZW9mIE1lc3NhZ2VFeGNlcHRpb24pOyBleCA9IGV4Ci0JCQkJCQkJCS5nZXRDYXVzZSgpKQotCQkJCQkJCTsKLQkJCQkJCVN0cmluZyBtc2cgPSBleCAhPSBudWxsICYmIGV4LmdldE1lc3NhZ2UoKSAhPSBudWxsID8gZXgKLQkJCQkJCQkJLmdldE1lc3NhZ2UoKSA6IGUuZ2V0TWVzc2FnZSgpICE9IG51bGwgPyBlCi0JCQkJCQkJCS5nZXRNZXNzYWdlKCkgOiBlLnRvU3RyaW5nKCk7Ci0JCQkJCQlMaWJyYXJ5VUlQbHVnaW4KLQkJCQkJCQkJLmdldERlZmF1bHQoKQotCQkJCQkJCQkuZ2V0TXNnRGlhbG9nKCkKLQkJCQkJCQkJLmRpc3BsYXlFcnJvcigKLQkJCQkJCQkJCQlMaWJyYXJ5VUlSZXNvdXJjZXMub3BlbkxpYnJhcnlXaXphcmRfdGl0bGUsCi0JCQkJCQkJCQkJbXNnLCBlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCUxpYnJhcnlVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCX0KLQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogVXBncmFkZXMgYSBtZXRob2QgbGlicmFyeSB0byBhIG5ldyBtZXRhLW1vZGVsLgotCSAqIAotCSAqIEBwYXJhbSBsaWJQYXRoCi0JICogICAgICAgICAgICBwYXRoIHRvIGEgbWV0aG9kIGxpYnJhcnkgZm9sZGVyCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgZ2l2ZW4gbWV0aG9kIGxpYnJhcnkgaXMgc3VjZXNzZnVsbHkKLQkgKiAgICAgICAgIHVwZ3JhZGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHVwZ3JhZGVMaWJyYXJ5KGZpbmFsIFN0cmluZyBsaWJQYXRoLAotCQkJZmluYWwgVXBncmFkZUNhbGxlckluZm8gY2FsbGVySW5mbykgewotCQlTaGVsbCBzaGVsbCA9IERpc3BsYXkuZ2V0Q3VycmVudCgpLmdldEFjdGl2ZVNoZWxsKCk7Ci0JCWlmICghQ29tbWFuZExpbmVSdW5VdGlsLmdldEluc3RhbmNlKCkuaXNOZWVkVG9SdW4oKSAmJiBVcGdyYWRlQ2FsbGVySW5mby5pc1VwZ3JhZGVMaWJyYXJ5KGNhbGxlckluZm8pKSB7Ci0JCQlMaWJyYXJ5QmFja3VwVXRpbC5wcm9tcHRCYWNrdXBMaWJyYXJ5KHNoZWxsLCBuZXcgRmlsZShsaWJQYXRoKSk7Ci0JCX0KLQotCQlTdHJpbmcgbGliWG1pID0gTXVsdGlGaWxlU2F2ZVV0aWwuREVGQVVMVF9MSUJSQVJZX01PREVMX0ZJTEVOQU1FOwotCQlpZiAoY2FsbGVySW5mbyAhPSBudWxsICYmIGNhbGxlckluZm8uZ2V0SXNFeHBvcnRlZFBsdWdpbkxpYigpKSB7Ci0JCQlsaWJYbWkgPSBYTUlMaWJyYXJ5TWFuYWdlci5leHBvcnRGaWxlOwotCQl9Ci0JCXJldHVybiB1cGdyYWRlTGlicmFyeShuZXcgRmlsZShsaWJQYXRoLCBsaWJYbWkpLCBjYWxsZXJJbmZvKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gdXBncmFkZUxpYnJhcnkoZmluYWwgRmlsZSBsaWJGaWxlLAotCQkJZmluYWwgVXBncmFkZUNhbGxlckluZm8gY2FsbGVySW5mbykgewotCQlmaW5hbCBTdHJpbmdCdWZmZXIgZXJyTXNnID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlmaW5hbCBib29sZWFuW10gY2FuY2VsRmxhZ0hvbGRlciA9IHsgZmFsc2UgfTsKLQotCQkvLyBEbyB0aGUgd29yayB3aXRoaW4gYW4gb3BlcmF0aW9uIGJlY2F1c2UgdGhpcyBpcyBhIGxvbmcgcnVubmluZwotCQkvLyBhY3Rpdml0eSB0aGF0IG1vZGlmaWVzIHRoZSB3b3JrYmVuY2guCi0JCVdvcmtzcGFjZU1vZGlmeU9wZXJhdGlvbiBvcGVyYXRpb24gPSBuZXcgV29ya3NwYWNlTW9kaWZ5T3BlcmF0aW9uKCkgewotCQkJcHVibGljIHZvaWQgZXhlY3V0ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJCQltb25pdG9yLmJlZ2luVGFzayhMaWJyYXJ5VUlSZXNvdXJjZXMudXBncmFkaW5nTGlicmFyeVRhc2tfbmFtZSwKLQkJCQkJCTEwKTsKLQkJCQltb25pdG9yLndvcmtlZCgxKTsKLQkJCQl0cnkgewotCQkJCQlNYXBwaW5nVXRpbC5taWdyYXRlKGxpYkZpbGUuZ2V0QWJzb2x1dGVQYXRoKCksIG1vbml0b3IsCi0JCQkJCQkJY2FsbGVySW5mbyk7Ci0JCQkJfSBjYXRjaCAoT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24gZSkgewotCQkJCQljYW5jZWxGbGFnSG9sZGVyWzBdID0gdHJ1ZTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQlMaWJyYXJ5VUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCQlpZiAoREVCVUcpIHsKLQkJCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJCX0KLQkJCQkJU3RyaW5nIG1zZyA9IGUuZ2V0TWVzc2FnZSgpOwotCQkJCQlpZiAobXNnID09IG51bGwpIHsKLQkJCQkJCW1zZyA9IExpYnJhcnlVSVJlc291cmNlcy51cGdyYWRlTGlicmFyeUVycm9yX21zZzsKLQkJCQkJfQotCQkJCQllcnJNc2cuYXBwZW5kKG1zZyk7Ci0JCQkJfSBmaW5hbGx5IHsKLQkJCQkJbW9uaXRvci5kb25lKCk7Ci0JCQkJfQotCQkJfQotCQl9OwotCi0JCXRyeSB7Ci0JCQkvLyBSdW4gdGhlIG9wZXJhdGlvbiBhbmQgZGlzcGxheSB0aGUgcHJvZ3Jlc3MuCi0JCQlQcm9ncmVzc01vbml0b3JEaWFsb2cgcG1EaWFsb2cgPSBuZXcgUHJvZ3Jlc3NNb25pdG9yRGlhbG9nKERpc3BsYXkKLQkJCQkJLmdldEN1cnJlbnQoKS5nZXRBY3RpdmVTaGVsbCgpKSB7Ci0JCQkJcHJvdGVjdGVkIFBvaW50IGdldEluaXRpYWxTaXplKCkgewotCQkJCQlQb2ludCBjYWxjdWxhdGVkU2l6ZSA9IHN1cGVyLmdldEluaXRpYWxTaXplKCk7Ci0JCQkJCWlmIChjYWxjdWxhdGVkU2l6ZS54IDwgNjc1KSB7Ci0JCQkJCQljYWxjdWxhdGVkU2l6ZS54ID0gNjc1OwotCQkJCQl9Ci0JCQkJCXJldHVybiBjYWxjdWxhdGVkU2l6ZTsKLQkJCQl9Ci0JCQl9OwotCQkJcG1EaWFsb2cucnVuKHRydWUsIGZhbHNlLCBvcGVyYXRpb24pOwotCQkJaWYgKGNhbmNlbEZsYWdIb2xkZXJbMF0pIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9IGVsc2UgaWYgKGVyck1zZy5sZW5ndGgoKSA+IDApIHsKLQkJCQlJU3RhdHVzIHN0YXR1cyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwKLQkJCQkJCUxpYnJhcnlVSVBsdWdpbi5QTFVHSU5fSUQsIDAsICIiLCBudWxsKSB7Ly8kTk9OLU5MUy0xJAotCQkJCQlwdWJsaWMgSVN0YXR1c1tdIGdldENoaWxkcmVuKCkgewotCQkJCQkJSVN0YXR1c1tdIHJldCA9IG5ldyBTdGF0dXNbMV07Ci0JCQkJCQlJU3RhdHVzIGNzID0gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLAotCQkJCQkJCQlMaWJyYXJ5VUlQbHVnaW4uUExVR0lOX0lELCAwLAotCQkJCQkJCQllcnJNc2cudG9TdHJpbmcoKSwgbnVsbCk7Ci0JCQkJCQlyZXRbMF0gPSBjczsKLQkJCQkJCXJldHVybiByZXQ7Ci0JCQkJCX0KLQotCQkJCQlwdWJsaWMgYm9vbGVhbiBpc011bHRpU3RhdHVzKCkgewotCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCX0KLQkJCQl9OwotCi0JCQkJTGlicmFyeVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKS5kaXNwbGF5RXJyb3IoCi0JCQkJCQlMaWJyYXJ5VUlSZXNvdXJjZXMudXBncmFkZUxpYnJhcnlEaWFsb2dfdGl0bGUsCi0JCQkJCQlMaWJyYXJ5VUlSZXNvdXJjZXMudXBncmFkZUxpYnJhcnlFcnJvcl9tc2csIHN0YXR1cyk7Ci0KLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCUxpYnJhcnlVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQlpZiAoREVCVUcpIHsKLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJfQotCQkJTGlicmFyeVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKS5kaXNwbGF5RXJyb3IoCi0JCQkJCUxpYnJhcnlVSVJlc291cmNlcy51cGdyYWRlTGlicmFyeURpYWxvZ190aXRsZSwKLQkJCQkJTGlicmFyeVVJUmVzb3VyY2VzLnVwZ3JhZGVMaWJyYXJ5RXJyb3JfbXNnKTsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JfQotCQotCS8qKgotCSAqIFNldHMgdGhlIHBhdGggb2YgdGhlIG1ldGhvZCBsaWJyYXJ5IHRoYXQgd2lsbCBiZSBvcGVuZWQgb25seSBpZiB0aGVyZSBhcmUKLQkgKiBubyBzYXZlZCBsaWJyYXJ5IHByZWZlcmVuY2VzLgotCSAqIAotCSAqIEBwYXJhbSBsaWJyYXJ5UGF0aAotCSAqICAgICAgICAgICAgcGF0aCB0byBhIG1ldGhvZCBsaWJyYXJ5Ci0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldENvbW1hbmRMaW5lRGVmYXVsdExpYnJhcnkoU3RyaW5nIGxpYnJhcnlQYXRoKSB7Ci0JCWlmIChsaWJyYXJ5UGF0aCAhPSBudWxsICYmIGxpYnJhcnlQYXRoLmxlbmd0aCgpID4gMCkgewotCQkJSVBhdGggcGF0aCA9IFBhdGguZnJvbU9TU3RyaW5nKGxpYnJhcnlQYXRoKTsKLQkJCXRyeSB7Ci0JCQkJZGVmYXVsdExpYnJhcnlVUkkgPSBwYXRoLnRvRmlsZSgpLnRvVVJJKCk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCWRlZmF1bHRMaWJyYXJ5VVJJID0gbnVsbDsKLQkJCQlMaWJyYXJ5UGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHBhdGggb2YgdGhlIG1ldGhvZCBsaWJyYXJ5IHRoYXQgd2lsbCBiZSBvcGVuZWQgcmVnYXJkbGVzcyBvZiB0aGUKLQkgKiBzYXZlZCBsaWJyYXJ5IHByZWZlcmVuY2VzLgotCSAqIAotCSAqIEBwYXJhbSBsaWJyYXJ5UGF0aAotCSAqICAgICAgICAgICAgcGF0aCB0byBhIG1ldGhvZCBsaWJyYXJ5Ci0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldENvbW1hbmRMaW5lTGlicmFyeShTdHJpbmcgbGlicmFyeVBhdGgpIHsKLQkJaWYgKGxpYnJhcnlQYXRoICE9IG51bGwgJiYgbGlicmFyeVBhdGgubGVuZ3RoKCkgPiAwKSB7Ci0JCQlJUGF0aCBwYXRoID0gUGF0aC5mcm9tT1NTdHJpbmcobGlicmFyeVBhdGgpOwotCQkJdHJ5IHsKLQkJCQlsaWJyYXJ5VVJJID0gcGF0aC50b0ZpbGUoKS50b1VSSSgpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlsaWJyYXJ5VVJJID0gbnVsbDsKLQkJCQlMaWJyYXJ5UGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCX0KLQkJfQotCX0KLQkKLQkvKioKLQkgKiBDaGVja3Mgd2hldGhlciB0aGUgbWV0aG9kIGNvbmZpZ3VyYXRpb24gY29tYm9ib3ggc2hvdWxkIGJlIGFkZGVkIHRvIHRoZQotCSAqIHN5c3RlbSB0b29sYmFyLgotCSAqIDxwPgotCSAqIFRoZSBtZXRob2QgY29uZmlndXJhdGlvbiBjb21ib2JveCBsaXN0cyBhbGwgdGhlIG1ldGhvZCBjb25maWd1cmF0aW9ucyBpbgotCSAqIHRoZSBjdXJyZW50IG1ldGhvZCBsaWJyYXJ5LgotCSAqLwotCXB1YmxpYyB2b2lkIGNoZWNrQ29uZmlndXJhdGlvbkNvbnRyaWJ1dGlvbigpIHsKLQkJSVdvcmtiZW5jaCB3b3JrYmVuY2ggPSBMaWJyYXJ5VUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFdvcmtiZW5jaCgpOwotCQlpZiAod29ya2JlbmNoICE9IG51bGwpIHsKLQkJCUlXb3JrYmVuY2hXaW5kb3cgd2luZG93ID0gKElXb3JrYmVuY2hXaW5kb3cpIHdvcmtiZW5jaAotCQkJCQkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0JCQlpZiAod2luZG93ICE9IG51bGwgJiYgd2luZG93IGluc3RhbmNlb2YgQXBwbGljYXRpb25XaW5kb3cpIHsKLQkJCQlJQ29vbEJhck1hbmFnZXIgY29vbEJhck1nciA9ICgoQXBwbGljYXRpb25XaW5kb3cpIHdpbmRvdykKLQkJCQkJCS5nZXRDb29sQmFyTWFuYWdlcigpOwotCQkJCXRyeSB7Ci0JCQkJCUlXb3JrYmVuY2hQYWdlIGFjdGl2ZVBhZ2UgPSB3aW5kb3cuZ2V0QWN0aXZlUGFnZSgpOwotCQkJCQlpZiAoYWN0aXZlUGFnZSAhPSBudWxsKSB7Ci0JCQkJCQlpZiAoZm91bmRDb25maWdWaWV3KGFjdGl2ZVBhZ2UpCi0JCQkJCQkJCXx8IGZvdW5kUHJvY2Vzc0VkaXRvcihhY3RpdmVQYWdlKQotCQkJCQkJCQl8fCBmb3VuZFBlcnNwZWN0aXZlKGFjdGl2ZVBhZ2UsIFJFUE9SVF9QRVJTX0lEKSkgewotCQkJCQkJCXNob3dDb25maWd1cmF0aW9uQ29udHJpYnV0aW9uKGNvb2xCYXJNZ3IpOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQloaWRlQ29uZmlndXJhdGlvbkNvbnRyaWJ1dGlvbihjb29sQmFyTWdyKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCUxpYnJhcnlVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkJCWlmIChERUJVRykgewotCQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIENoZWNrcyBmb3IgdGhlIHByZXNlbmNlIG9mIHRoZSBDb25maWd1cmF0aW9uIHZpZXcgaW4gdGhlIGFjdGl2ZSB3b3JrYmVuY2gKLQkgKiBwYWdlLgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBmb3VuZENvbmZpZ1ZpZXcoSVdvcmtiZW5jaFBhZ2UgYWN0aXZlUGFnZSkgewotCQlpZiAoYWN0aXZlUGFnZSA9PSBudWxsKSByZXR1cm4gZmFsc2U7Ci0JCXJldHVybiBhY3RpdmVQYWdlLmZpbmRWaWV3KENPTkZJR19WSUVXX0lEKSAhPSBudWxsOwotCX0KLQotCS8qKgotCSAqIENoZWNrcyBmb3IgdGhlIHByZXNlbmNlIG9mIGEgUHJvY2VzcyBlZGl0b3IgaW4gdGhlIGFjdGl2ZSB3b3JrYmVuY2guCi0JICogcGFnZS4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gZm91bmRQcm9jZXNzRWRpdG9yKElXb3JrYmVuY2hQYWdlIGFjdGl2ZVBhZ2UpIHsKLQkJaWYgKGFjdGl2ZVBhZ2UgPT0gbnVsbCkgcmV0dXJuIGZhbHNlOwotCQlJRWRpdG9yUmVmZXJlbmNlW10gZWRpdG9yUmVmcyA9IGFjdGl2ZVBhZ2UuZmluZEVkaXRvcnMobnVsbCwKLQkJCQlQUk9DRVNTX0VESVRPUl9JRCwgSVdvcmtiZW5jaFBhZ2UuTUFUQ0hfSUQpOwotCQlyZXR1cm4gZWRpdG9yUmVmcyAhPSBudWxsICYmIGVkaXRvclJlZnMubGVuZ3RoID4gMDsKLQl9Ci0JCi0JLyoqCi0JICogQ2hlY2tzIGZvciB0aGUgcHJlc2VuY2Ugb2YgUmVwb3J0IFBlcnNwZWN0aXZlIGluIHRoZSBhY3RpdmUgd29ya2JlbmNoCi0JICogcGFnZS4gCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGZvdW5kUGVyc3BlY3RpdmUoSVdvcmtiZW5jaFBhZ2UgYWN0aXZlUGFnZSwgU3RyaW5nIHBlcnNJZCkgewotCQlpZiAoYWN0aXZlUGFnZS5nZXRQZXJzcGVjdGl2ZSgpLmdldElkKCkuZXF1YWxzKHBlcnNJZCkpIHsJCQotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBEaXNwbGF5cyB0aGUgbWV0aG9kIGNvbmZpZ3VyYXRpb24gY29tYm9ib3ggaW4gdGhlIHN5c3RlbSB0b29sYmFyLgotCSAqLwotCXByaXZhdGUgdm9pZCBzaG93Q29uZmlndXJhdGlvbkNvbnRyaWJ1dGlvbihJQ29vbEJhck1hbmFnZXIgY29vbEJhck1ncikKLQkJCXRocm93cyBFeGNlcHRpb24gewotCQkvLyBDaGVjayBmb3IgdGhlIG1ldGhvZCBjb25maWd1cmF0aW9uIGNvbWJvYm94IHRvb2xiYXIuCi0JCUlDb250cmlidXRpb25JdGVtIGNvbmZpZ1Rvb2xCYXIgPSBjb29sQmFyTWdyCi0JCQkJLmZpbmQoVE9PTEJBUl9DT05GSUdfQ09OVFJJQlVUSU9OX0lEKTsKLQotCQlpZiAoY29uZmlnVG9vbEJhciAhPSBudWxsKSB7Ci0JCQkvLyBNYWtlIHN1cmUgdGhlIHRvb2xiYXIgaGFzIHRoZSBtZXRob2QgY29uZmlndXJhdGlvbiBjb21ib2JveAotCQkJLy8gY29udHJpYnV0aW9uLgotCQkJaWYgKGNvbmZpZ1Rvb2xCYXIgaW5zdGFuY2VvZiBUb29sQmFyQ29udHJpYnV0aW9uSXRlbSkgewotCQkJCUlUb29sQmFyTWFuYWdlciB0b29sQmFyTWdyID0gKChUb29sQmFyQ29udHJpYnV0aW9uSXRlbSkgY29uZmlnVG9vbEJhcikKLQkJCQkJCS5nZXRUb29sQmFyTWFuYWdlcigpOwotCQkJCWlmICh0b29sQmFyTWdyICE9IG51bGwpIHsKLQkJCQkJSUNvbnRyaWJ1dGlvbkl0ZW1bXSB0b29sQmFySXRlbXMgPSB0b29sQmFyTWdyLmdldEl0ZW1zKCk7Ci0JCQkJCWlmICh0b29sQmFySXRlbXMgIT0gbnVsbCAmJiB0b29sQmFySXRlbXMubGVuZ3RoID4gMCkgewotCQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0b29sQmFySXRlbXMubGVuZ3RoOyBpKyspIHsKLQkJCQkJCQl0b29sQmFySXRlbXNbaV0uc2V0VmlzaWJsZSh0cnVlKTsKLQkJCQkJCX0KLQkJCQkJCWNvbmZpZ1Rvb2xCYXIuc2V0VmlzaWJsZSh0cnVlKTsKLQkJCQkJCXVwZGF0ZVN5c3RlbVRvb2xCYXIoY29vbEJhck1ncik7Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQkvLyBUaGUgbWV0aG9kIGNvbmZpZ3VyYXRpb24gY29tYm9ib3ggdG9vbGJhciBoYXMgYmVlbiByZXN0b3JlZAotCQkJCS8vIHZpYSBhIHNhdmVkIHBlcnNwZWN0aXZlLCBhZGQgdGhlIG1ldGhvZCBjb25maWd1cmF0aW9uCi0JCQkJLy8gY29tYm9ib3ggY29udHJpYnV0aW9uLgotCQkJCWNvbmZpZ0NvbWJvID0gbmV3IENvbmZpZ3VyYXRpb25Db250cmlidXRpb25JdGVtKAotCQkJCQkJbnVsbCk7Ci0JCQkJdG9vbEJhck1nci5hZGQoY29uZmlnQ29tYm8pOwotCQkJCWNvbmZpZ1Rvb2xCYXIuc2V0VmlzaWJsZSh0cnVlKTsKLQkJCQl1cGRhdGVTeXN0ZW1Ub29sQmFyKGNvb2xCYXJNZ3IpOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCi0JCUlUb29sQmFyTWFuYWdlciB0b29sQmFyTWdyID0gbmV3IFRvb2xCYXJNYW5hZ2VyKFNXVC5GTEFUIHwgU1dULkxFRlQpOwotCQljb25maWdDb21ibyA9IG5ldyBDb25maWd1cmF0aW9uQ29udHJpYnV0aW9uSXRlbSgKLQkJCQludWxsKTsKLQkJdG9vbEJhck1nci5hZGQoY29uZmlnQ29tYm8pOwotCQlUb29sQmFyQ29udHJpYnV0aW9uSXRlbSBjb25maWdDb21ib1Rvb2xCYXIgPSBuZXcgVG9vbEJhckNvbnRyaWJ1dGlvbkl0ZW0oCi0JCQkJdG9vbEJhck1nciwgVE9PTEJBUl9DT05GSUdfQ09OVFJJQlVUSU9OX0lEKTsKLQkJY29vbEJhck1nci5hZGQoY29uZmlnQ29tYm9Ub29sQmFyKTsKLQl9Ci0KLQkvKioKLQkgKiBIaWRlcyB0aGUgbWV0aG9kIGNvbmZpZ3VyYXRpb24gY29tYm9ib3ggZnJvbSB0aGUgc3lzdGVtIHRvb2xiYXIuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGhpZGVDb25maWd1cmF0aW9uQ29udHJpYnV0aW9uKElDb29sQmFyTWFuYWdlciBjb29sQmFyTWdyKQotCQkJdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCS8vIENoZWNrIGZvciB0aGUgbWV0aG9kIGNvbmZpZ3VyYXRpb24gY29tYm9ib3ggdG9vbGJhci4KLQkJSUNvbnRyaWJ1dGlvbkl0ZW0gY29uZmlnVG9vbEJhciA9IGNvb2xCYXJNZ3IKLQkJCQkuZmluZChUT09MQkFSX0NPTkZJR19DT05UUklCVVRJT05fSUQpOwotCi0JCWlmIChjb25maWdUb29sQmFyID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCS8vIEhpZGUgdGhlIG1ldGhvZCBjb25maWd1cmF0aW9uIGNvbWJvYm94IGNvbnRyaWJ1dGlvbiBmcm9tIHRoZSB0b29sYmFyLgotCQlpZiAoY29uZmlnVG9vbEJhciBpbnN0YW5jZW9mIFRvb2xCYXJDb250cmlidXRpb25JdGVtKSB7Ci0JCQlJVG9vbEJhck1hbmFnZXIgdG9vbEJhck1nciA9ICgoVG9vbEJhckNvbnRyaWJ1dGlvbkl0ZW0pIGNvbmZpZ1Rvb2xCYXIpCi0JCQkJCS5nZXRUb29sQmFyTWFuYWdlcigpOwotCQkJSUNvbnRyaWJ1dGlvbkl0ZW1bXSB0b29sQmFySXRlbXMgPSB0b29sQmFyTWdyLmdldEl0ZW1zKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHRvb2xCYXJJdGVtcy5sZW5ndGg7IGkrKykgewotCQkJCXRvb2xCYXJJdGVtc1tpXS5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJCX0KLQkJfQotCi0JCS8vIEhpZGUgdGhlIG1ldGhvZCBjb25maWd1cmF0aW9uIGNvbWJvYm94IHRvb2xiYXIgY29udHJpYnV0aW9uLgotCQljb25maWdUb29sQmFyLnNldFZpc2libGUoZmFsc2UpOwotCi0JCS8vIFVwZGF0ZSB0aGUgdGhlIHN5c3RlbSB0b29sIGJhci4KLQkJdXBkYXRlU3lzdGVtVG9vbEJhcihjb29sQmFyTWdyKTsKLQl9Ci0KLQkvKioKLQkgKiBVcGRhdGVzIHRoZSBzeXN0ZW0gdG9vbCBiYXIuCi0JICovCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZVN5c3RlbVRvb2xCYXIoSUNvb2xCYXJNYW5hZ2VyIGNvb2xCYXJNZ3IpIHsKLQkJaWYgKGNvb2xCYXJNZ3IgaW5zdGFuY2VvZiBDb29sQmFyTWFuYWdlcikgewotCQkJKChDb29sQmFyTWFuYWdlcikgY29vbEJhck1ncikudXBkYXRlKHRydWUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQWRkcyBhIHBhcnQgbGlzdGVuZXIgc28gdGhlIGxpYnJhcnkgd2lsbCBvcGVuIHVwb24gInN0YXJ0dXAiCi0JICogInN0YXJ0dXAiIG1lYW5zIHdoZW4gdGhlIHZpZXcgd2l0aCB0aGUgc3BlY2lmaWVkIGlkIGlzIGZpcnN0Ci0JICogdmlzaWJsZQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZE1ldGhvZFZpZXdQYXJ0TGlzdGVuZXIoZmluYWwgU3RyaW5nIGlkKSB7Ci0JCUlXb3JrYmVuY2ggd29ya2JlbmNoID0gTGlicmFyeVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRXb3JrYmVuY2goKTsKLQkJaWYgKHdvcmtiZW5jaCAhPSBudWxsKSB7Ci0JCQlJV29ya2JlbmNoV2luZG93IHdpbmRvdyA9IChJV29ya2JlbmNoV2luZG93KSB3b3JrYmVuY2gKLQkJCQkJLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpOwotCQkJaWYgKHdpbmRvdyAhPSBudWxsICYmIHdpbmRvdyBpbnN0YW5jZW9mIEFwcGxpY2F0aW9uV2luZG93KSB7Ci0JCQkJdHJ5IHsKLQkJCQkJZmluYWwgSVdvcmtiZW5jaFBhZ2UgYWN0aXZlUGFnZSA9IHdpbmRvdy5nZXRBY3RpdmVQYWdlKCk7Ci0JCQkJCWFjdGl2ZVBhZ2UuYWRkUGFydExpc3RlbmVyKG5ldyBJUGFydExpc3RlbmVyMigpIHsKLQotCQkJCQkJcHVibGljIHZvaWQgcGFydEFjdGl2YXRlZCgKLQkJCQkJCQkJSVdvcmtiZW5jaFBhcnRSZWZlcmVuY2UgcGFydFJlZikgewotCQkJCQkJfQotCi0JCQkJCQlwdWJsaWMgdm9pZCBwYXJ0QnJvdWdodFRvVG9wKAotCQkJCQkJCQlJV29ya2JlbmNoUGFydFJlZmVyZW5jZSBwYXJ0UmVmKSB7Ci0JCQkJCQl9Ci0KLQkJCQkJCXB1YmxpYyB2b2lkIHBhcnRDbG9zZWQoSVdvcmtiZW5jaFBhcnRSZWZlcmVuY2UgcGFydFJlZikgewotCQkJCQkJfQotCi0JCQkJCQlwdWJsaWMgdm9pZCBwYXJ0RGVhY3RpdmF0ZWQoCi0JCQkJCQkJCUlXb3JrYmVuY2hQYXJ0UmVmZXJlbmNlIHBhcnRSZWYpIHsKLQkJCQkJCX0KLQotCQkJCQkJcHVibGljIHZvaWQgcGFydEhpZGRlbihJV29ya2JlbmNoUGFydFJlZmVyZW5jZSBwYXJ0UmVmKSB7Ci0JCQkJCQl9Ci0KLQkJCQkJCXB1YmxpYyB2b2lkIHBhcnRJbnB1dENoYW5nZWQoCi0JCQkJCQkJCUlXb3JrYmVuY2hQYXJ0UmVmZXJlbmNlIHBhcnRSZWYpIHsKLQkJCQkJCX0KLQotCQkJCQkJcHVibGljIHZvaWQgcGFydE9wZW5lZChJV29ya2JlbmNoUGFydFJlZmVyZW5jZSBwYXJ0UmVmKSB7Ci0JCQkJCQl9Ci0KLQkJCQkJCXB1YmxpYyB2b2lkIHBhcnRWaXNpYmxlKElXb3JrYmVuY2hQYXJ0UmVmZXJlbmNlIHBhcnRSZWYpIHsKLQkJCQkJCQlpZiAocGFydFJlZi5nZXRJZCgpLmVxdWFscyhpZCkpIHsKLQkJCQkJCQkJYWN0aXZlUGFnZS5yZW1vdmVQYXJ0TGlzdGVuZXIodGhpcyk7Ci0JCQkJCQkJCXN0YXJ0dXBPcGVuTGlicmFyeSgpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCQotCQkJCQl9KTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQlMaWJyYXJ5VUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCQlpZiAoREVCVUcpIHsKLQkJCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCX0KLQkKLQkKLQkvKioKLQkgKiBPcGVucyB0aGUgbGlicmFyeSB1cG9uIHN0YXJ0dXAKLQkgKiAxLiAgRmlyc3QgdHJpZXMgdG8gb3BlbiB0aGUgbGlicmFyeSBzcGVjaWZpZWQgYnkgLWxpYnJhcnkKLQkgKiAyLiAgVGhlbiB0cmllcyB0byBvcGVuIHRoZSBsYXN0IG9wZW5lZCBsaWJyYXJ5Ci0JICogMy4gIEZpbmFsbHksIHRyaWVzIHRvIG9wZW4gdGhlIGxpYnJhcnkgc3BlY2lmaWVkIGJ5IC1kZWZhdWx0bGlicmFyeQotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0dXBPcGVuTGlicmFyeSgpIHsKLQkJaWYgKGxpYnJhcnlJbml0aWFsaXplZCA9PSB0cnVlKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJbGlicmFyeUluaXRpYWxpemVkID0gdHJ1ZTsKLQkJdHJ5IHsKLQkJCVN0cmluZyBzYXZlZE1ldGhvZExpYnJhcnlVUkkgPSBMaWJyYXJ5UHJlZmVyZW5jZXMKLQkJCS5nZXRTYXZlZE1ldGhvZExpYnJhcnlVUkkoKTsKLQkJCWJvb2xlYW4gaGFzU2F2ZWRVcmkgPSBzYXZlZE1ldGhvZExpYnJhcnlVUkkgIT0gbnVsbCAmJiBzYXZlZE1ldGhvZExpYnJhcnlVUkkubGVuZ3RoKCkgPiAwOwotCQkJCi0JCQlTdHJpbmcgbGFzdFNhdmVkQ29uZmlnTmFtZSA9IFByZWZlcmVuY2VVdGlsLmdldFNhdmVkTGFzdENvbmZpZygpOwotCQkJaWYgKGxpYnJhcnlVUkkgIT0gbnVsbCAmJiBvcGVuTGlicmFyeShsaWJyYXJ5VVJJKSkgewotCQkJfSBlbHNlIGlmIChvcGVuTGFzdE9wZW5lZExpYnJhcnkoKSkgewotCQkJfSBlbHNlIGlmIChkZWZhdWx0TGlicmFyeVVSSSAhPSBudWxsICYmICFoYXNTYXZlZFVyaSkgewotCQkJCS8vIFRyeSBsb2FkaW5nIHRoZSBOTCBsaWJyYXJ5IGZpcnN0LgotCQkJCUxvY2FsZSBsb2NhbGUgPSBMb2NhbGUuZ2V0RGVmYXVsdCgpOwotCQkJCVN0cmluZyBkZWZhdWx0TGlicmFyeVN0ciA9IG5ldyBGaWxlKGRlZmF1bHRMaWJyYXJ5VVJJKQotCQkJCQkJLmdldEFic29sdXRlUGF0aCgpOwotCQkJCVN0cmluZyBsb2NhbGl6ZWRMaWJQYXRoID0gSTE4blV0aWwuZ2V0TG9jYWxpemVkRmlsZSgKLQkJCQkJCUZpbGVVdGlsLnJlbW92ZUFsbFNlcGFyYXRvcihkZWZhdWx0TGlicmFyeVN0ciksCi0JCQkJCQlsb2NhbGUpOwotCQkJCWlmIChsb2NhbGl6ZWRMaWJQYXRoICE9IG51bGwpIHsKLQkJCQkJZGVmYXVsdExpYnJhcnlVUklfTkwgPSBTdHJVdGlsLnRvVVJJKGxvY2FsaXplZExpYlBhdGgpOwotCQkJCX0KLQkJCQlpZiAoZGVmYXVsdExpYnJhcnlVUklfTkwgIT0gbnVsbCAmJiBvcGVuRGVmYXVsdExpYnJhcnkoZGVmYXVsdExpYnJhcnlVUklfTkwpKSB7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJb3BlbkRlZmF1bHRMaWJyYXJ5KGRlZmF1bHRMaWJyYXJ5VVJJKTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpICE9IG51bGwpIHsKLQkJCQlNZXRob2RDb25maWd1cmF0aW9uIHNhdmVkQ29uZmlnID0gTGlicmFyeVNlcnZpY2VVdGlsCi0JCQkJCQkuZ2V0TWV0aG9kQ29uZmlndXJhdGlvbihMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJCQkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKSwgbGFzdFNhdmVkQ29uZmlnTmFtZSk7Ci0JCQkJaWYgKHNhdmVkQ29uZmlnICE9IG51bGwpIHsKLQkJCQkJTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5zZXRDdXJyZW50TWV0aG9kQ29uZmlndXJhdGlvbihzYXZlZENvbmZpZyk7Ci0JCQkJfQotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJTGlicmFyeVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gcGF0aAotCSAqIEByZXR1cm4gbnVsbCBpZiBwYXRoIGlzIG5vdCBvbiBpbnN0YWxsIHBhdGggb3Igbm90IHJlYWQtb25seSBvciBpZiB1c2VyIAotCSAqIGRlY2xpbmVzIHRvIGNvcHkgdGhlIGxpYnJhcnkgdG8gYSB3cml0YWJsZSBsb2NhdGlvbi4gUmV0dXJucwotCSAqIGEgbmV3IHBhdGggaWYgdGhlIHVzZXIgd2lzaGVzIHRvIG9wZW4gdGhlIGxpYnJhcnkgaW4gYSBkaWZmZXJlbnQgbG9jYXRpb24KLQkgKiAKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBoYW5kbGVMaWJyYXJ5T25SZWFkT25seUluc3RhbGxQYXRoKFVSSSBsaWJVUkkpIHsKLQkJdHJ5IHsKLQkJCWJvb2xlYW4gcmVhZE9ubHkgPSBmYWxzZTsKLQkJCQotCQkJLy8gZGV0ZXJtaW5lIGlmIHBhdGggaXMgaW4gSW5zdGFsbGF0aW9uIGRpcmVjdG9yeQotCQkJRmlsZSBsaWJQYXRoRmlsZSA9IG5ldyBGaWxlKGxpYlVSSSk7Ci0JCQlpZiAoIWxpYlBhdGhGaWxlLmV4aXN0cygpKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCQlMb2NhdGlvbiBpbnN0YWxsTG9jYXRpb24gPSBQbGF0Zm9ybS5nZXRJbnN0YWxsTG9jYXRpb24oKTsKLQkJCVVSTCBpbnN0YWxsTG9jYXRpb25VUkwgPSBpbnN0YWxsTG9jYXRpb24uZ2V0VVJMKCk7Ci0JCQlVUkkgaW5zdGFsbExvY2F0aW9uVVJJID0gbmV3IFVSSShOZXRVdGlsLmVuY29kZUZpbGVVUkwoaW5zdGFsbExvY2F0aW9uVVJMLnRvRXh0ZXJuYWxGb3JtKCkpKTsKLQkJCUZpbGUgaW5zdGFsbExvY0ZpbGUgPSBuZXcgRmlsZShpbnN0YWxsTG9jYXRpb25VUkkpOwotCQkJU3RyaW5nIGNhbm9uaWNhbExpYlBhdGggPSBsaWJQYXRoRmlsZS5nZXRDYW5vbmljYWxQYXRoKCk7Ci0JCQlTdHJpbmcgY2Fub25pY2FsSW5zdGFsbFBhdGggPSBpbnN0YWxsTG9jRmlsZS5nZXRDYW5vbmljYWxQYXRoKCk7Ci0JCQlpZiAoIWNhbm9uaWNhbExpYlBhdGguc3RhcnRzV2l0aChjYW5vbmljYWxJbnN0YWxsUGF0aCkpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJCQotCQkJLy8gZGV0ZXJtaW5lIGlmIE9TIGlzIG5vdCB2aXN0YSBvciBsaW51eAotCQkJU3RyaW5nIG9zTmFtZSA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgib3MubmFtZSIpOyAvLyROT04tTkxTLTEkCi0JCQlTdHJpbmcgcGxhdGZvcm1PUyA9IFBsYXRmb3JtLmdldE9TKCk7Ci0JCQlpZiAoKG9zTmFtZS5pbmRleE9mKCJWaXN0YSIpID4gLTEpIC8vJE5PTi1OTFMtMSQKLQkJCQkJfHwgcGxhdGZvcm1PUy5lcXVhbHMoUGxhdGZvcm0uT1NfTElOVVgpKSB7Ci0JCQkJcmVhZE9ubHkgPSB0cnVlOwotCQkJfQotCQkJCi0JCQlGaWxlIGxpYnJhcnlYTUlGaWxlID0gbmV3IEZpbGUobGliUGF0aEZpbGUsIFhNSUxpYnJhcnlNYW5hZ2VyLkxJQlJBUllfWE1JKTsKLQotCQkJLy8gZG8gbm90IGFsbG93IGEgcmVhZC1vbmx5IGRlZmF1bHQgbGlicmFyeQotCQkJaWYgKCFsaWJQYXRoRmlsZS5jYW5Xcml0ZSgpIHx8ICFsaWJyYXJ5WE1JRmlsZS5jYW5Xcml0ZSgpKSB7Ci0JCQkJcmVhZE9ubHkgPSB0cnVlOwotCQkJfQotCQkJCi0JCQlpZiAoIXJlYWRPbmx5KSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCQkKLQkJCS8vIHNob3cgZGlhbG9nLCBhbGxvdyBjb3B5IHRvIG5ldyBwYXRoCi0KLQkJCWZpbmFsIFN0cmluZyBkZWZhdWx0Q29weVBhdGggPSBuZXcgRmlsZShuZXcgRmlsZShMaWJyYXJ5VUlQcmVmZXJlbmNlcy5nZXREZWZhdWx0TGlicmFyeVBhdGgoKSkuZ2V0UGFyZW50KCksIGxpYlBhdGhGaWxlLmdldE5hbWUoKSkuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0KLQkJCWZpbmFsIFN0cmluZ0J1ZmZlciBuZXdQYXRoID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJCi0JCQlVc2VySW50ZXJhY3Rpb25IZWxwZXIuZ2V0VUlIZWxwZXIoKS5ydW5TYWZlbHkobmV3IFJ1bm5hYmxlKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJU3RyaW5nIHRpdGxlID0gTGlicmFyeVVJUmVzb3VyY2VzLmNvcHlMaWJyYXJ5RGlhbG9nX3RpdGxlOwotCQkJCQlTdHJpbmcgbWVzc2FnZSA9IExpYnJhcnlVSVJlc291cmNlcy5jb3B5TGlicmFyeURpYWxvZ190ZXh0X3JlYWRPbmx5TGliOwotCQkJCQlDb3B5TGlicmFyeURpYWxvZyBkbGcgPSBuZXcgQ29weUxpYnJhcnlEaWFsb2coRGlzcGxheS5nZXRDdXJyZW50KCkuZ2V0QWN0aXZlU2hlbGwoKSwgdGl0bGUsCi0JCQkJCQkJbWVzc2FnZSwgZGVmYXVsdENvcHlQYXRoKTsKLQotCQkJCQlpZiAoZGxnLm9wZW4oKSA9PSBEaWFsb2cuT0spIHsKLQkJCQkJCW5ld1BhdGguYXBwZW5kKGRsZy5nZXRQYXRoKCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfSwgZmFsc2UpOwotCQkJaWYgKG5ld1BhdGgubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJY29weUxpYnJhcnkobGliUGF0aEZpbGUsIG5ldyBGaWxlKG5ld1BhdGgudG9TdHJpbmcoKSkpOwotCQkJCXJldHVybiBuZXdQYXRoLnRvU3RyaW5nKCk7Ci0JCQl9IGVsc2UgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCi0JCX0gY2F0Y2ggKFVSSVN5bnRheEV4Y2VwdGlvbiB1cmlFeCkgewotCQkJTGlicmFyeVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcih1cmlFeCk7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9FeCkgewotCQkJTGlicmFyeVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihpb0V4KTsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIEJhY2sgdXAgbGlicmFyeSAKLQkgKiAKLQkgKiBAcGFyYW0gc291cmNlCi0JICogQHBhcmFtIGRlc3QKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGNvcHlMaWJyYXJ5KGZpbmFsIEZpbGUgc291cmNlLCBmaW5hbCBGaWxlIGRlc3QpIHsKLQkJUnVubmFibGUgcnVubmFibGUgPSBuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJLy8gZXhjdWRlIHRoZSBub24tbGlicmFyeSBmaWxlcyB0aGF0IG1pZ2h0IGJlIGxvY2tlZCBieSBybWMuCi0JCQkJCS8vIHRoZXNlIGZpbGVzIG1heSBjYXVzZSBiYWNrdXAgdG8gZmFpbCBkdWUgdG8gZmlsZSBsb2NrLgotCQkJCQlTdHJpbmcgZXhjbHVkZXMgPSAiLmxvY2siOyAvLyROT04tTkxTLTEkCi0JCQkJCUxheW91dFJlc291cmNlcy5jb3B5RGlyKHNvdXJjZSwgZGVzdCwgIioqIiwgZXhjbHVkZXMpOyAvLyROT04tTkxTLTEkCi0JCQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJfQotCQkJfQotCQl9OwotCi0JCVVzZXJJbnRlcmFjdGlvbkhlbHBlci5ydW5XaXRoUHJvZ3Jlc3MocnVubmFibGUsCi0JCQkJTGlicmFyeVVJUmVzb3VyY2VzLmNvcHlMaWJyYXJ5VGFza19uYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBjdXJyZW50IE1ldGhvZENvbmZpZ3VyYXRpb24gZHJvcGRvd24gYm94Ci0JICovCi0JcHVibGljIENvbmZpZ3VyYXRpb25Db250cmlidXRpb25JdGVtIGdldENvbmZpZ0NvbWJvKCkgewotCQlyZXR1cm4gY29uZmlnQ29tYm87Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9MaWJyYXJ5VUlQbHVnaW4uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9MaWJyYXJ5VUlQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmVjZmRiNS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvTGlicmFyeVVJUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udWkuQWJzdHJhY3RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LkJyb3dzaW5nTGF5b3V0U2V0dGluZ3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucHJlZmVyZW5jZXMuTGlicmFyeVByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLnByZWZlcmVuY2VzLkxpYnJhcnlVSVByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotCi0vKioKLSAqIFRoZSBMaWJyYXJ5IFVJIHBsdWctaW4gY2xhc3MuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTGlicmFyeVVJUGx1Z2luIGV4dGVuZHMgQWJzdHJhY3RQbHVnaW4gewotCi0JLy8gVGhlIHBsdWctaW4gSUQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgPSBMaWJyYXJ5VUlQbHVnaW4uY2xhc3MuZ2V0TmFtZSgpOwotCi0JLy8gVGhlIHNoYXJlZCBwbHVnLWluIGluc3RhbmNlLgotCXByaXZhdGUgc3RhdGljIExpYnJhcnlVSVBsdWdpbiBwbHVnaW47Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBMaWJyYXJ5VUlQbHVnaW4oKSB7Ci0JCXN1cGVyKCk7Ci0JCXBsdWdpbiA9IHRoaXM7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpLkFic3RyYWN0UGx1Z2luI3N0YXJ0KG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0YXJ0KGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS5BYnN0cmFjdFBsdWdpbiNzdG9wKG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RvcChjb250ZXh0KTsKLQkJcGx1Z2luID0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBzaGFyZWQgcGx1Zy1pbiBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpYnJhcnlVSVBsdWdpbiBnZXREZWZhdWx0KCkgewotCQlyZXR1cm4gcGx1Z2luOwotCX0KLQotCS8qKgotCSAqIHVwZGF0ZSB0aGUgcHVibGlzaGluZy9icm93c2luZyBsYXlvdXQgc2V0dGluZ3MuCi0JICogQ2FsbCB0aGlzIG1ldGhvZCB3aGVuIGV2ZXIgcHVibGlzaGluZy9icm93c2luZyByZWxhdGVkIHByZWZlcmVuY2VzIGFyZSBjaGFuZ2VkLgotCSAqCi0JICovCi0JcHVibGljIHZvaWQgdXBkYXRlTGF5b3V0U2V0dGluZ3MoKSAKLQl7Ci0JCS8vIGdldCB0aGUgc2tpbiBzZXR0aW5nIGZyb20gcHJlZmVyZW5jZQotCQlib29sZWFuIHB1Ymxpc2hVbm9wZW5BY3Rpdml0eWRkID0gTGlicmFyeVVJUHJlZmVyZW5jZXMuZ2V0UHVibGlzaFVub3BlbkFjdGl2aXR5ZGQoKTsJCi0JCWJvb2xlYW4gcHVibGlzaEFERm9yQWN0aXZpdHlFeHRlbnNpb24gPSBMaWJyYXJ5VUlQcmVmZXJlbmNlcy5nZXRQdWJsaXNoQURGb3JBY3Rpdml0eUV4dGVuc2lvbigpOwotCQlib29sZWFuIHVzZU5ld0V4dGVuZHMgPSBMaWJyYXJ5UHJlZmVyZW5jZXMuZ2V0VXNlTmV3RXh0ZW5kc1NlbWFudGljcygpOwotCQkKLQkJQnJvd3NpbmdMYXlvdXRTZXR0aW5ncy5JTlNUQU5DRS5zZXRQdWJsaXNoQURGb3JBY3Rpdml0eUV4dGVuc2lvbihwdWJsaXNoQURGb3JBY3Rpdml0eUV4dGVuc2lvbik7Ci0JCUJyb3dzaW5nTGF5b3V0U2V0dGluZ3MuSU5TVEFOQ0Uuc2V0UHVibGlzaFVub3BlbkFjdGl2aXR5ZGQocHVibGlzaFVub3BlbkFjdGl2aXR5ZGQpOwotCQlCcm93c2luZ0xheW91dFNldHRpbmdzLklOU1RBTkNFLnNldFVzZU5ld0V4dGVuZFNlbWFudGljcyh1c2VOZXdFeHRlbmRzKTsKLQkJCi0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9MaWJyYXJ5VUlSZXNvdXJjZXMuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9MaWJyYXJ5VUlSZXNvdXJjZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzNjNzQzYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvTGlicmFyeVVJUmVzb3VyY2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NjAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi0vKioKLSAqIFRoZSBMaWJyYXJ5IFVJIHJlc291cmNlcy4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKiBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTc3NTAwCi0gKi8KLXB1YmxpYyBjbGFzcyBMaWJyYXJ5VUlSZXNvdXJjZXMgZXh0ZW5kcyBOTFMgewotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIEJVTkRMRV9OQU1FID0gTGlicmFyeVVJUmVzb3VyY2VzLmNsYXNzLmdldFBhY2thZ2UoKQotCQkJLmdldE5hbWUoKQotCQkJKyAiLlJlc291cmNlcyI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGFjdGl2aXR5X3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhcnRpZmFjdF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2FwYWJpbGl0eVBhdHRlcm5fdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNoZWNrbGlzdF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2hlY2tJdGVtX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb21wb3NpdGVSb2xlX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb25jZXB0X3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb250ZW50UGFja2FnZV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY3VzdG9tQ2F0ZWdvcnlfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRlbGl2ZXJhYmxlX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkZWxpdmVyeVByb2Nlc3NfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRlc2NyaXB0b3JfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRpc2NpcGxpbmVfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRpc2NpcGxpbmVHcm91cGluZ190ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZG9tYWluX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlc3RpbWF0ZV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXN0aW1hdGluZ01ldHJpY190ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBleGFtcGxlX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBndWlkYW5jZV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ3VpZGVsaW5lX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBpdGVyYXRpb25fdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG1ldGhvZENvbmZpZ3VyYXRpb25fdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG1ldGhvZENvbnRlbnRfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG1ldGhvZExpYnJhcnlfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG1ldGhvZFBhY2thZ2VfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG1ldGhvZFBsdWdpbl90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbWlsZXN0b25lX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBvdXRjb21lX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBvdmVycmlkZUN1cnJlbnRMaWJyYXJ5RXJyb3JfbXNnMDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHBoYXNlX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwcmFjdGljZV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHJvY2Vzc190ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHJvY2Vzc0NvbnRyaWJ1dGlvbl90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHJvY2Vzc0ZhbWlseV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHJvY2Vzc1BhY2thZ2VfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlcG9ydF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmV1c2FibGVBc3NldF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcm9hZG1hcF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcm9sZURlc2NyaXB0b3JfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJvbGVfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJvbGVTZXRfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJvbGVTZXRHcm91cGluZ190ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc3RhbmRhcmRDYXRlZ29yeV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc3RlcF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc3VwcG9ydGluZ01hdGVyaWFsX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0YXNrX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0YXNrRGVzY3JpcHRvcl90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdGVhbVByb2ZpbGVfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRlbXBsYXRlX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0ZXJtRGVmaW5pdGlvbl90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdG9vbF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdG9vbE1lbnRvcl90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgd2hpdGVwYXBlcl90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgd29ya1Byb2R1Y3RfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdvcmtQcm9kdWN0RGVzY3JpcHRvcl90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgd29ya1Byb2R1Y3RFbGVtZW50X3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3b3JrUHJvZHVjdFR5cGVfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGFjdGl2aXR5X3RleHRfcGx1cmFsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgYXJ0aWZhY3RfdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjYXBhYmlsaXR5UGF0dGVybl90ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNoZWNrbGlzdF90ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNoZWNrSXRlbV90ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbXBvc2l0ZVJvbGVfdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb25jZXB0X3RleHRfcGx1cmFsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29udGVudFBhY2thZ2VfdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjdXN0b21DYXRlZ29yeV90ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRlbGl2ZXJhYmxlX3RleHRfcGx1cmFsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGVsaXZlcnlQcm9jZXNzX3RleHRfcGx1cmFsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGVzY3JpcHRvcl90ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRpc2NpcGxpbmVfdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkaXNjaXBsaW5lR3JvdXBpbmdfdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkb21haW5fdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlc3RpbWF0ZV90ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVzdGltYXRpbmdNZXRyaWNfdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnNfdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBleGFtcGxlX3RleHRfcGx1cmFsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ3VpZGFuY2VfdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBndWlkZWxpbmVfdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBpdGVyYXRpb25fdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBtZXRob2RDb25maWd1cmF0aW9uX3RleHRfcGx1cmFsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbWV0aG9kQ29udGVudF90ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG1ldGhvZExpYnJhcnlfdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBtZXRob2RQYWNrYWdlX3RleHRfcGx1cmFsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbWV0aG9kUGx1Z2luX3RleHRfcGx1cmFsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbWlsZXN0b25lX3RleHRfcGx1cmFsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgb3V0Y29tZV90ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHBoYXNlX3RleHRfcGx1cmFsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHJhY3RpY2VfdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwcm9jZXNzX3RleHRfcGx1cmFsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHJvY2Vzc0NvbnRyaWJ1dGlvbl90ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHByb2Nlc3NGYW1pbHlfdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwcm9jZXNzUGFja2FnZV90ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlcG9ydF90ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJldXNhYmxlQXNzZXRfdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByb2FkbWFwX3RleHRfcGx1cmFsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcm9sZURlc2NyaXB0b3JfdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByb2xlX3RleHRfcGx1cmFsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcm9sZVNldF90ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJvbGVTZXRHcm91cGluZ190ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHN0YW5kYXJkQ2F0ZWdvcnlfdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzdGVwX3RleHRfcGx1cmFsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc3VwcG9ydGluZ01hdGVyaWFsX3RleHRfcGx1cmFsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdGFza190ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRhc2tEZXNjcmlwdG9yX3RleHRfcGx1cmFsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdGVhbVByb2ZpbGVfdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0ZW1wbGF0ZV90ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRlcm1EZWZpbml0aW9uX3RleHRfcGx1cmFsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdG9vbF90ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRvb2xNZW50b3JfdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3aGl0ZXBhcGVyX3RleHRfcGx1cmFsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgd29ya1Byb2R1Y3RfdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3b3JrUHJvZHVjdERlc2NyaXB0b3JfdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3b3JrUHJvZHVjdEVsZW1lbnRfdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3b3JrUHJvZHVjdFR5cGVfdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhcHBsaWNhdGlvbl90aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG9wZW5MaWJyYXJ5V2l6YXJkX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgb3BlbkxpYnJhcnlNYWluV2l6YXJkUGFnZV90aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG9wZW5MaWJyYXJ5TWFpbldpemFyZFBhZ2VfdGl0bGVfMjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG9wZW5MaWJyYXJ5TWFpbldpemFyZFBhZ2VfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHBhdGhMYWJlbF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbmFtZUxhYmVsX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB1cmlMYWJlbF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgb3BlblVubGlzdGVkTGlicmFyeUNoZWNrYm94X3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBsaWJyYXJ5VHlwZUxhYmVsX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBsaWJyYXJ5TGFiZWxfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGJyb3dzZUJ1dHRvbl90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHJvbXB0Rm9yTGlicmFyeUNoZWNrYm94X3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBvcGVuTGlicmFyeURpYWxvZ19uZXdMaWJyYXJ5X3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzZWxlY3RMaWJyYXJ5Rm9sZGVyRGlhbG9nX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VsZWN0TGlicmFyeUZvbGRlckRpYWxvZ190ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgb3BlbmluZ0xpYnJhcnlUYXNrX25hbWU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBvcGVuTGlicmFyeUVycm9yX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG9wZW5MaWJyYXJ5SW50ZXJubEVycm9yX3JlYXNvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG9wZW5MaWJyYXJ5RXJyb3JfcmVhc29uMTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG9wZW5MaWJyYXJ5RXJyb3JfcmVhc29uMjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG9wZW5MaWJyYXJ5RXJyb3JfcmVhc29uMzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG9wZW5MaWJyYXJ5RXJyb3JfcmVhc29uNDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG9wZW5MaWJyYXJ5RXJyb3JfYWR2aWNlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgaW52YWxpZExpYnJhcnlQYXRoX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGludmFsaWRMaWJyYXJ5UGF0aF9yZWFzb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZWFkT25seVByb2plY3RGaWxlX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZXRyeUJ1dHRvbl90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2FuY2VsQnV0dG9uX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB1cGdyYWRlTGlicmFyeURpYWxvZ190aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHVwZ3JhZGVMaWJyYXJ5RGlhbG9nX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB1cGdyYWRpbmdMaWJyYXJ5VGFza19uYW1lOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdXBncmFkZUxpYnJhcnlFcnJvcl9tc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzd2l0Y2hDb25maWdEaWFsb2dfdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzd2l0Y2hDb25maWdEaWFsb2dfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGN1cnJlbnRDb25maWdMYWJlbF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VsZWN0Q29uZmlnTGFiZWxfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRlbGV0ZUZpbGVzQ29uZmlybWF0aW9uX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRlbGV0ZUZpbGVzRXJyb3JfcmVhc29uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY3JlYXRlUGF0aEVycm9yX3JlYXNvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGludmFsaWRQYXRoX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGJhY2t1cExpYnJhcnlEaWFsb2dfdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBiYWNrdXBMaWJyYXJ5RGlhbG9nX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBiYWNraW5nVXBMaWJyYXJ5VGFza19uYW1lOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcGF0aFNlbGVjdGlvbkVycm9yX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG9rQnV0dG9uX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBza2lwQnV0dG9uX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhbHdheXNCdXR0b25fdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG5ldmVyQnV0dG9uX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwcm9tcHRCdXR0b25fdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGxpbmtUb1VSTF9uYW1lOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbGlua1RvRmlsZV9uYW1lOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZWxlbWVudExpbmtfbmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVsZW1lbnRMaW5rV2l0aFR5cGVfbmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVsZW1lbnRMaW5rV2l0aFVzZXJUZXh0X25hbWU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb252ZXJ0QWN0aXZpdHlEaWFsb2dfdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb252ZXJ0QWN0aXZpdHlEaWFsb2dfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHVuc3VwcG9ydGVkQWN0aXZpdHlUeXBlX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHVuc3VwcG9ydGVkQWN0aXZpdHlUeXBlX3JlYXNvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHZlcnNpb25NaXNtYXRjaERpYWxvZ190ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdmVyc2lvbk1pc21hdGNoRGlhbG9nX3RleHRfdW5rbm93bjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlbGVjdFByb2Nlc3NXaXphcmRQYWdlX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VsZWN0UHJvY2Vzc1dpemFyZFBhZ2VfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHByb2Nlc3Nlc0xhYmVsX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBicmllZkRlc2NyaXB0aW9uTGFiZWxfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG5vT3BlbkxpYnJhcnlXYXJuaW5nX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVycm9yRGlhbG9nX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgTWV0aG9kRWxlbWVudERlbGV0ZUFjdGlvbl9kZWxldGVjb25maXJtX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb25maXJtRGVsZXRlRGlhbG9nX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29uZmlybURlbGV0ZURpYWxvZ19tc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb25maXJtRGVsZXRlRGlhbG9nX21zZ1dpdGhSZWZlcmVuY2U7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzRGVsZXRlQWN0aW9uX2RlbGV0ZWNvZmlybV90ZXh0OwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNhdmVMaWJyYXJ5RGlhbG9nX3RpdGxlOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNhdmVMaWJyYXJ5RGlhbG9nX3RleHQ7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2F2ZUxpYnJhcnlFcnJvcl9tc2c7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JfcmVhc29uOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvcHlMaWJyYXJ5RGlhbG9nX3RpdGxlOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvcHlMaWJyYXJ5RGlhbG9nX3RleHRfcmVhZE9ubHlMaWI7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29weUxpYnJhcnlUYXNrX25hbWU7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29weUxpYnJhcnlEaWFsb2dfY29weUJ1dHRvbl90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZWxlbWVudFRDUHJvdmlkZXJfbWV0aG9kQ29udGVudDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVsZW1lbnRUQ1Byb3ZpZGVyX2NvbnRlbnRQYWNrYWdlczsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVsZW1lbnRUQ1Byb3ZpZGVyX3N0YW5kYXJkQ2F0ZWdvcmllczsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVsZW1lbnRUQ1Byb3ZpZGVyX2Rpc2NpcGxpbmVzOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZWxlbWVudFRDUHJvdmlkZXJfZG9tYWluczsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVsZW1lbnRUQ1Byb3ZpZGVyX3dvcmtQcm9kdWN0VHlwZXM7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlbGVtZW50VENQcm92aWRlcl9yb2xlU2V0czsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVsZW1lbnRUQ1Byb3ZpZGVyX3Rvb2xzOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZWxlbWVudFRDUHJvdmlkZXJfY3VzdG9tQ2F0ZWdvcmllczsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVsZW1lbnRUQ1Byb3ZpZGVyX3Byb2Nlc3NlczsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVsZW1lbnRUQ1Byb3ZpZGVyX2NhcGFiaWxpdHlQYXR0ZXJuczsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVsZW1lbnRUQ1Byb3ZpZGVyX2RlbGl2ZXJ5UHJvY2Vzc2VzOwotCi0Jc3RhdGljIHsKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgTGlicmFyeVVJUmVzb3VyY2VzLmNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBsb2NhbGl6ZWQgc3RyaW5nIGFzc29jaWF0ZWQgd2l0aCBhIHJlc291cmNlIGtleSBhbmQgZm9ybWF0dGVkCi0JICogd2l0aCBhIGdpdmVuIG9iamVjdC4KLQkgKiAKLQkgKiBAcGFyYW0ga2V5Ci0JICogICAgICAgICAgICBBIHJlc291cmNlIGtleS4KLQkgKiBAcGFyYW0gZGF0YQotCSAqICAgICAgICAgICAgQW4gb2JqZWN0LgotCSAqIEByZXR1cm4gQSBmb3JtYXR0ZWQgbG9jYWxpemVkIHN0cmluZy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBiaW5kKFN0cmluZyBrZXksIE9iamVjdCBkYXRhKSB7Ci0JCXJldHVybiBOTFMuYmluZChrZXksIG5ldyBPYmplY3RbXSB7IGRhdGEgfSk7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL0xpYnJhcnlVSVRleHQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9MaWJyYXJ5VUlUZXh0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2NWQ4NTcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL0xpYnJhcnlVSVRleHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwMiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aTsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLlN0clV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5BY3Rpdml0eUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkFydGlmYWN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQ2FwYWJpbGl0eVBhdHRlcm5JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5DaGVja2xpc3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Db21wb3NpdGVSb2xlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQ29uY2VwdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkNvbnRlbnRQYWNrYWdlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQ3VzdG9tQ2F0ZWdvcnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5EZWxpdmVyYWJsZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkRlbGl2ZXJ5UHJvY2Vzc0ltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkRpc2NpcGxpbmVHcm91cGluZ0ltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkRpc2NpcGxpbmVJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Eb21haW5JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnNJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5FeGFtcGxlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuR3VpZGVsaW5lSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuSXRlcmF0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuTWV0aG9kQ29uZmlndXJhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLk1ldGhvZExpYnJhcnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5NZXRob2RQYWNrYWdlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuTWV0aG9kUGx1Z2luSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuTWlsZXN0b25lSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuT3V0Y29tZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlBoYXNlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUHJhY3RpY2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Qcm9jZXNzRmFtaWx5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUHJvY2Vzc1BhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5SZXBvcnRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5SZXVzYWJsZUFzc2V0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUm9hZG1hcEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlJvbGVEZXNjcmlwdG9ySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUm9sZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlJvbGVTZXRHcm91cGluZ0ltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlJvbGVTZXRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5TdGVwSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuU3VwcG9ydGluZ01hdGVyaWFsSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVGFza0Rlc2NyaXB0b3JJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5UYXNrSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVGVhbVByb2ZpbGVJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5UZW1wbGF0ZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlRlcm1EZWZpbml0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVG9vbEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlRvb2xNZW50b3JJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5XaGl0ZXBhcGVySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuV29ya1Byb2R1Y3REZXNjcmlwdG9ySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuV29ya1Byb2R1Y3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Xb3JrUHJvZHVjdFR5cGVJbXBsOwotCi0vKioKLSAqIFByb3ZpZGVzIGFjY2VzcyB0byBjYWNoZWQgY29weSBvZiBjb21tb25seSByZWZlcmVuY2VkIHRleHQgaW4gdGhlIGxpYnJhcnkgVUkuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTGlicmFyeVVJVGV4dCB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX0FDVElWSVRZID0gTGlicmFyeVVJUmVzb3VyY2VzLmFjdGl2aXR5X3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX0FSVElGQUNUID0gTGlicmFyeVVJUmVzb3VyY2VzLmFydGlmYWN0X3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX0NBUEFCSUxJVFlfUEFUVEVSTiA9IExpYnJhcnlVSVJlc291cmNlcy5jYXBhYmlsaXR5UGF0dGVybl90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9DSEVDS0xJU1QgPSBMaWJyYXJ5VUlSZXNvdXJjZXMuY2hlY2tsaXN0X3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX0NIRUNLX0lURU0gPSBMaWJyYXJ5VUlSZXNvdXJjZXMuY2hlY2tJdGVtX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX0NPTVBPU0lURV9ST0xFID0gTGlicmFyeVVJUmVzb3VyY2VzLmNvbXBvc2l0ZVJvbGVfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfQ09OQ0VQVCA9IExpYnJhcnlVSVJlc291cmNlcy5jb25jZXB0X3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX0NPTlRFTlRfUEFDS0FHRSA9IExpYnJhcnlVSVJlc291cmNlcy5jb250ZW50UGFja2FnZV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9DVVNUT01fQ0FURUdPUlkgPSBMaWJyYXJ5VUlSZXNvdXJjZXMuY3VzdG9tQ2F0ZWdvcnlfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfREVMSVZFUkFCTEUgPSBMaWJyYXJ5VUlSZXNvdXJjZXMuZGVsaXZlcmFibGVfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfREVMSVZFUllfUFJPQ0VTUyA9IExpYnJhcnlVSVJlc291cmNlcy5kZWxpdmVyeVByb2Nlc3NfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfREVTQ1JJUFRPUiA9IExpYnJhcnlVSVJlc291cmNlcy5kZXNjcmlwdG9yX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX0RJU0NJUExJTkUgPSBMaWJyYXJ5VUlSZXNvdXJjZXMuZGlzY2lwbGluZV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9ESVNDSVBMSU5FX0dST1VQSU5HID0gTGlicmFyeVVJUmVzb3VyY2VzLmRpc2NpcGxpbmVHcm91cGluZ190ZXh0OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9ET01BSU4gPSBMaWJyYXJ5VUlSZXNvdXJjZXMuZG9tYWluX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX0VTVElNQVRFID0gTGlicmFyeVVJUmVzb3VyY2VzLmV4YW1wbGVfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfRVNUSU1BVElOR19NRVRSSUMgPSBMaWJyYXJ5VUlSZXNvdXJjZXMuZXN0aW1hdGluZ01ldHJpY190ZXh0OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9FU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TID0gTGlicmFyeVVJUmVzb3VyY2VzLmVzdGltYXRpb25Db25zaWRlcmF0aW9uc190ZXh0OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9FWEFNUExFID0gTGlicmFyeVVJUmVzb3VyY2VzLmV4YW1wbGVfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfR1VJREFOQ0UgPSBMaWJyYXJ5VUlSZXNvdXJjZXMuZ3VpZGFuY2VfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfR1VJREVMSU5FID0gTGlicmFyeVVJUmVzb3VyY2VzLmd1aWRlbGluZV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9JVEVSQVRJT04gPSBMaWJyYXJ5VUlSZXNvdXJjZXMuaXRlcmF0aW9uX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX01FVEhPRF9DT05GSUdVUkFUT04gPSBMaWJyYXJ5VUlSZXNvdXJjZXMubWV0aG9kQ29uZmlndXJhdGlvbl90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9NRVRIT0RfQ09OVEVOVCA9IExpYnJhcnlVSVJlc291cmNlcy5tZXRob2RDb250ZW50X3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX01FVEhPRF9MSUJBUkFSWSA9IExpYnJhcnlVSVJlc291cmNlcy5tZXRob2RMaWJyYXJ5X3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX01FVEhPRF9QQUNLQUdFID0gTGlicmFyeVVJUmVzb3VyY2VzLm1ldGhvZFBhY2thZ2VfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfTUVUSE9EX1BMVUdJTiA9IExpYnJhcnlVSVJlc291cmNlcy5tZXRob2RQbHVnaW5fdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfTUlMRVNUT05FID0gTGlicmFyeVVJUmVzb3VyY2VzLm1pbGVzdG9uZV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9PVVRDT01FID0gTGlicmFyeVVJUmVzb3VyY2VzLm91dGNvbWVfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfUEhBU0UgPSBMaWJyYXJ5VUlSZXNvdXJjZXMucGhhc2VfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfUFJBQ1RJQ0UgPSBMaWJyYXJ5VUlSZXNvdXJjZXMucHJhY3RpY2VfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfUFJPQ0VTUyA9IExpYnJhcnlVSVJlc291cmNlcy5wcm9jZXNzX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX1BST0NFU1NfQ09OVFJJQlVUSU9OID0gTGlicmFyeVVJUmVzb3VyY2VzLnByb2Nlc3NDb250cmlidXRpb25fdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfUFJPQ0VTU19GQU1JTFkgPSBMaWJyYXJ5VUlSZXNvdXJjZXMucHJvY2Vzc0ZhbWlseV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9QUk9DRVNTX1BBQ0tBR0UgPSBMaWJyYXJ5VUlSZXNvdXJjZXMucHJvY2Vzc1BhY2thZ2VfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfUkVQT1JUID0gTGlicmFyeVVJUmVzb3VyY2VzLnJlcG9ydF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9SRVVTQUJMRV9BU1NFVCA9IExpYnJhcnlVSVJlc291cmNlcy5yZXVzYWJsZUFzc2V0X3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX1JPQURNQVAgPSBMaWJyYXJ5VUlSZXNvdXJjZXMucm9hZG1hcF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9ST0xFID0gTGlicmFyeVVJUmVzb3VyY2VzLnJvbGVfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfUk9MRV9ERVNDUklQVE9SID0gTGlicmFyeVVJUmVzb3VyY2VzLnJvbGVEZXNjcmlwdG9yX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX1JPTEVfU0VUID0gTGlicmFyeVVJUmVzb3VyY2VzLnJvbGVTZXRfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfUk9MRV9TRVRfR1JPVVBJTkcgPSBMaWJyYXJ5VUlSZXNvdXJjZXMucm9sZVNldEdyb3VwaW5nX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX1NUQU5EQVJEX0NBVEVHT1JZID0gTGlicmFyeVVJUmVzb3VyY2VzLnN0YW5kYXJkQ2F0ZWdvcnlfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfU1RFUCA9IExpYnJhcnlVSVJlc291cmNlcy5zdGVwX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX1NVUFBPUlRJTkdfTUFURVJJQUwgPSBMaWJyYXJ5VUlSZXNvdXJjZXMuc3VwcG9ydGluZ01hdGVyaWFsX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX1RBU0sgPSBMaWJyYXJ5VUlSZXNvdXJjZXMudGFza190ZXh0OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9UQVNLX0RFU0NSSVBUT1IgPSBMaWJyYXJ5VUlSZXNvdXJjZXMudGFza0Rlc2NyaXB0b3JfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfVEVBTV9QUk9GSUxFID0gTGlicmFyeVVJUmVzb3VyY2VzLnRlYW1Qcm9maWxlX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX1RFTVBMQVRFID0gTGlicmFyeVVJUmVzb3VyY2VzLnRlbXBsYXRlX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX1RFUk1fREVGSU5JVElPTiA9IExpYnJhcnlVSVJlc291cmNlcy50ZXJtRGVmaW5pdGlvbl90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9UT09MID0gTGlicmFyeVVJUmVzb3VyY2VzLnRvb2xfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfVE9PTF9NRU5UT1IgPSBMaWJyYXJ5VUlSZXNvdXJjZXMudG9vbE1lbnRvcl90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9XSElURVBBUEVSID0gTGlicmFyeVVJUmVzb3VyY2VzLndoaXRlcGFwZXJfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfV09SS19QUk9EVUNUID0gTGlicmFyeVVJUmVzb3VyY2VzLndvcmtQcm9kdWN0X3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX1dPUktfUFJPRFVDVF9ERVNDUklQVE9SID0gTGlicmFyeVVJUmVzb3VyY2VzLndvcmtQcm9kdWN0RGVzY3JpcHRvcl90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9XT1JLX1BST0RVQ1RfRUxFTUVOVCA9IExpYnJhcnlVSVJlc291cmNlcy53b3JrUHJvZHVjdEVsZW1lbnRfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfV09SS19QUk9EVUNUX1RZUEUgPSBMaWJyYXJ5VUlSZXNvdXJjZXMud29ya1Byb2R1Y3RUeXBlX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX0FDVElWSVRZX1BMVVJBTCA9IExpYnJhcnlVSVJlc291cmNlcy5hY3Rpdml0eV90ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfQVJUSUZBQ1RfUExVUkFMID0gTGlicmFyeVVJUmVzb3VyY2VzLmFydGlmYWN0X3RleHRfcGx1cmFsOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9DQVBBQklMSVRZX1BBVFRFUk5fUExVUkFMID0gTGlicmFyeVVJUmVzb3VyY2VzLmNhcGFiaWxpdHlQYXR0ZXJuX3RleHRfcGx1cmFsOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9DSEVDS0xJU1RfUExVUkFMID0gTGlicmFyeVVJUmVzb3VyY2VzLmNoZWNrbGlzdF90ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfQ0hFQ0tfSVRFTV9QTFVSQUwgPSBMaWJyYXJ5VUlSZXNvdXJjZXMuY2hlY2tJdGVtX3RleHRfcGx1cmFsOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9DT01QT1NJVEVfUk9MRV9QTFVSQUwgPSBMaWJyYXJ5VUlSZXNvdXJjZXMuY29tcG9zaXRlUm9sZV90ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfQ09OQ0VQVF9QTFVSQUwgPSBMaWJyYXJ5VUlSZXNvdXJjZXMuY29uY2VwdF90ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfQ09OVEVOVF9QQUNLQUdFX1BMVVJBTCA9IExpYnJhcnlVSVJlc291cmNlcy5jb250ZW50UGFja2FnZV90ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfQ1VTVE9NX0NBVEVHT1JZX1BMVVJBTCA9IExpYnJhcnlVSVJlc291cmNlcy5jdXN0b21DYXRlZ29yeV90ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfREVMSVZFUkFCTEVfUExVUkFMID0gTGlicmFyeVVJUmVzb3VyY2VzLmRlbGl2ZXJhYmxlX3RleHRfcGx1cmFsOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9ERUxJVkVSWV9QUk9DRVNTX1BMVVJBTCA9IExpYnJhcnlVSVJlc291cmNlcy5kZWxpdmVyeVByb2Nlc3NfdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX0RFU0NSSVBUT1JfUExVUkFMID0gTGlicmFyeVVJUmVzb3VyY2VzLmRlc2NyaXB0b3JfdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX0RJU0NJUExJTkVfUExVUkFMID0gTGlicmFyeVVJUmVzb3VyY2VzLmRpc2NpcGxpbmVfdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX0RJU0NJUExJTkVfR1JPVVBJTkdfUExVUkFMID0gTGlicmFyeVVJUmVzb3VyY2VzLmRpc2NpcGxpbmVHcm91cGluZ190ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfRE9NQUlOX1BMVVJBTCA9IExpYnJhcnlVSVJlc291cmNlcy5kb21haW5fdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX0VTVElNQVRFX1BMVVJBTCA9IExpYnJhcnlVSVJlc291cmNlcy5leGFtcGxlX3RleHRfcGx1cmFsOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9FU1RJTUFUSU5HX01FVFJJQ19QTFVSQUwgPSBMaWJyYXJ5VUlSZXNvdXJjZXMuZXN0aW1hdGluZ01ldHJpY190ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfRVNUSU1BVElPTl9DT05TSURFUkFUSU9OU19QTFVSQUwgPSBMaWJyYXJ5VUlSZXNvdXJjZXMuZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zX3RleHRfcGx1cmFsOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9FWEFNUExFX1BMVVJBTCA9IExpYnJhcnlVSVJlc291cmNlcy5leGFtcGxlX3RleHRfcGx1cmFsOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9HVUlEQU5DRV9QTFVSQUwgPSBMaWJyYXJ5VUlSZXNvdXJjZXMuZ3VpZGFuY2VfdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX0dVSURFTElORV9QTFVSQUwgPSBMaWJyYXJ5VUlSZXNvdXJjZXMuZ3VpZGVsaW5lX3RleHRfcGx1cmFsOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9JVEVSQVRJT05fUExVUkFMID0gTGlicmFyeVVJUmVzb3VyY2VzLml0ZXJhdGlvbl90ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfTUVUSE9EX0NPTkZJR1VSQVRPTl9QTFVSQUwgPSBMaWJyYXJ5VUlSZXNvdXJjZXMubWV0aG9kQ29uZmlndXJhdGlvbl90ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfTUVUSE9EX0NPTlRFTlRfUExVUkFMID0gTGlicmFyeVVJUmVzb3VyY2VzLm1ldGhvZENvbnRlbnRfdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX01FVEhPRF9MSUJBUkFSWV9QTFVSQUwgPSBMaWJyYXJ5VUlSZXNvdXJjZXMubWV0aG9kTGlicmFyeV90ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfTUVUSE9EX1BBQ0tBR0VfUExVUkFMID0gTGlicmFyeVVJUmVzb3VyY2VzLm1ldGhvZFBhY2thZ2VfdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX01FVEhPRF9QTFVHSU5fUExVUkFMID0gTGlicmFyeVVJUmVzb3VyY2VzLm1ldGhvZFBsdWdpbl90ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfTUlMRVNUT05FX1BMVVJBTCA9IExpYnJhcnlVSVJlc291cmNlcy5taWxlc3RvbmVfdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX09VVENPTUVfUExVUkFMID0gTGlicmFyeVVJUmVzb3VyY2VzLm91dGNvbWVfdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX1BIQVNFX1BMVVJBTCA9IExpYnJhcnlVSVJlc291cmNlcy5waGFzZV90ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfUFJBQ1RJQ0VfUExVUkFMID0gTGlicmFyeVVJUmVzb3VyY2VzLnByYWN0aWNlX3RleHRfcGx1cmFsOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9QUk9DRVNTX1BMVVJBTCA9IExpYnJhcnlVSVJlc291cmNlcy5wcm9jZXNzX3RleHRfcGx1cmFsOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9QUk9DRVNTX0NPTlRSSUJVVElPTl9QTFVSQUwgPSBMaWJyYXJ5VUlSZXNvdXJjZXMucHJvY2Vzc0NvbnRyaWJ1dGlvbl90ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfUFJPQ0VTU19GQU1JTFlfUExVUkFMID0gTGlicmFyeVVJUmVzb3VyY2VzLnByb2Nlc3NGYW1pbHlfdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX1BST0NFU1NfUEFDS0FHRV9QTFVSQUwgPSBMaWJyYXJ5VUlSZXNvdXJjZXMucHJvY2Vzc1BhY2thZ2VfdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX1JFUE9SVF9QTFVSQUwgPSBMaWJyYXJ5VUlSZXNvdXJjZXMucmVwb3J0X3RleHRfcGx1cmFsOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9SRVVTQUJMRV9BU1NFVF9QTFVSQUwgPSBMaWJyYXJ5VUlSZXNvdXJjZXMucmV1c2FibGVBc3NldF90ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfUk9BRE1BUF9QTFVSQUwgPSBMaWJyYXJ5VUlSZXNvdXJjZXMucm9hZG1hcF90ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfUk9MRV9QTFVSQUwgPSBMaWJyYXJ5VUlSZXNvdXJjZXMucm9sZV90ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfUk9MRV9ERVNDUklQVE9SX1BMVVJBTCA9IExpYnJhcnlVSVJlc291cmNlcy5yb2xlRGVzY3JpcHRvcl90ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfUk9MRV9TRVRfUExVUkFMID0gTGlicmFyeVVJUmVzb3VyY2VzLnJvbGVTZXRfdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX1JPTEVfU0VUX0dST1VQSU5HX1BMVVJBTCA9IExpYnJhcnlVSVJlc291cmNlcy5yb2xlU2V0R3JvdXBpbmdfdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX1NUQU5EQVJEX0NBVEVHT1JZX1BMVVJBTCA9IExpYnJhcnlVSVJlc291cmNlcy5zdGFuZGFyZENhdGVnb3J5X3RleHRfcGx1cmFsOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9TVEVQX1BMVVJBTCA9IExpYnJhcnlVSVJlc291cmNlcy5zdGVwX3RleHRfcGx1cmFsOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9TVVBQT1JUSU5HX01BVEVSSUFMX1BMVVJBTCA9IExpYnJhcnlVSVJlc291cmNlcy5zdXBwb3J0aW5nTWF0ZXJpYWxfdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX1RBU0tfUExVUkFMID0gTGlicmFyeVVJUmVzb3VyY2VzLnRhc2tfdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX1RBU0tfREVTQ1JJUFRPUl9QTFVSQUwgPSBMaWJyYXJ5VUlSZXNvdXJjZXMudGFza0Rlc2NyaXB0b3JfdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX1RFQU1fUFJPRklMRV9QTFVSQUwgPSBMaWJyYXJ5VUlSZXNvdXJjZXMudGVhbVByb2ZpbGVfdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX1RFTVBMQVRFX1BMVVJBTCA9IExpYnJhcnlVSVJlc291cmNlcy50ZW1wbGF0ZV90ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfVEVSTV9ERUZJTklUSU9OX1BMVVJBTCA9IExpYnJhcnlVSVJlc291cmNlcy50ZXJtRGVmaW5pdGlvbl90ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfVE9PTF9QTFVSQUwgPSBMaWJyYXJ5VUlSZXNvdXJjZXMudG9vbF90ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfVE9PTF9NRU5UT1JfUExVUkFMID0gTGlicmFyeVVJUmVzb3VyY2VzLnRvb2xNZW50b3JfdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX1dISVRFUEFQRVJfUExVUkFMID0gTGlicmFyeVVJUmVzb3VyY2VzLndoaXRlcGFwZXJfdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX1dPUktfUFJPRFVDVF9QTFVSQUwgPSBMaWJyYXJ5VUlSZXNvdXJjZXMud29ya1Byb2R1Y3RfdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX1dPUktfUFJPRFVDVF9ERVNDUklQVE9SX1BMVVJBTCA9IExpYnJhcnlVSVJlc291cmNlcy53b3JrUHJvZHVjdERlc2NyaXB0b3JfdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX1dPUktfUFJPRFVDVF9FTEVNRU5UX1BMVVJBTCA9IExpYnJhcnlVSVJlc291cmNlcy53b3JrUHJvZHVjdEVsZW1lbnRfdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX1dPUktfUFJPRFVDVF9UWVBFX1BMVVJBTCA9IExpYnJhcnlVSVJlc291cmNlcy53b3JrUHJvZHVjdFR5cGVfdGV4dF9wbHVyYWw7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXA8Q2xhc3MsIFN0cmluZz4gRUxFTUVOVF9URVhUID0gbmV3IEhhc2hNYXA8Q2xhc3MsIFN0cmluZz4oKTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIE1hcDxDbGFzcywgU3RyaW5nPiBFTEVNRU5UX1RFWFRfUExVUkFMID0gbmV3IEhhc2hNYXA8Q2xhc3MsIFN0cmluZz4oKTsKLQotCXN0YXRpYyB7Ci0JCUVMRU1FTlRfVEVYVC5wdXQoQWN0aXZpdHlJbXBsLmNsYXNzLCBURVhUX0FDVElWSVRZKTsKLQkJRUxFTUVOVF9URVhULnB1dChBcnRpZmFjdEltcGwuY2xhc3MsIFRFWFRfQVJUSUZBQ1QpOwotCQlFTEVNRU5UX1RFWFQucHV0KENhcGFiaWxpdHlQYXR0ZXJuSW1wbC5jbGFzcywgVEVYVF9DQVBBQklMSVRZX1BBVFRFUk4pOwotCQlFTEVNRU5UX1RFWFQucHV0KENoZWNrbGlzdEltcGwuY2xhc3MsIFRFWFRfQ0hFQ0tMSVNUKTsKLQkJRUxFTUVOVF9URVhULnB1dChDb21wb3NpdGVSb2xlSW1wbC5jbGFzcywgVEVYVF9DT01QT1NJVEVfUk9MRSk7Ci0JCUVMRU1FTlRfVEVYVC5wdXQoQ29uY2VwdEltcGwuY2xhc3MsIFRFWFRfQ09OQ0VQVCk7Ci0JCUVMRU1FTlRfVEVYVC5wdXQoQ29udGVudFBhY2thZ2VJbXBsLmNsYXNzLCBURVhUX0NPTlRFTlRfUEFDS0FHRSk7Ci0JCUVMRU1FTlRfVEVYVC5wdXQoQ3VzdG9tQ2F0ZWdvcnlJbXBsLmNsYXNzLCBURVhUX0NVU1RPTV9DQVRFR09SWSk7Ci0JCUVMRU1FTlRfVEVYVC5wdXQoRGVsaXZlcmFibGVJbXBsLmNsYXNzLCBURVhUX0RFTElWRVJBQkxFKTsKLQkJRUxFTUVOVF9URVhULnB1dChEZWxpdmVyeVByb2Nlc3NJbXBsLmNsYXNzLCBURVhUX0RFTElWRVJZX1BST0NFU1MpOwotCQlFTEVNRU5UX1RFWFQucHV0KERpc2NpcGxpbmVJbXBsLmNsYXNzLCBURVhUX0RJU0NJUExJTkUpOwotCQlFTEVNRU5UX1RFWFQKLQkJCQkucHV0KERpc2NpcGxpbmVHcm91cGluZ0ltcGwuY2xhc3MsIFRFWFRfRElTQ0lQTElORV9HUk9VUElORyk7Ci0JCUVMRU1FTlRfVEVYVC5wdXQoRG9tYWluSW1wbC5jbGFzcywgVEVYVF9ET01BSU4pOwotCQlFTEVNRU5UX1RFWFQucHV0KEVzdGltYXRpb25Db25zaWRlcmF0aW9uc0ltcGwuY2xhc3MsCi0JCQkJVEVYVF9FU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TKTsKLQkJRUxFTUVOVF9URVhULnB1dChFeGFtcGxlSW1wbC5jbGFzcywgVEVYVF9FWEFNUExFKTsKLQkJRUxFTUVOVF9URVhULnB1dChHdWlkZWxpbmVJbXBsLmNsYXNzLCBURVhUX0dVSURFTElORSk7Ci0JCUVMRU1FTlRfVEVYVC5wdXQoSXRlcmF0aW9uSW1wbC5jbGFzcywgVEVYVF9JVEVSQVRJT04pOwotCQlFTEVNRU5UX1RFWFQucHV0KE1ldGhvZENvbmZpZ3VyYXRpb25JbXBsLmNsYXNzLAotCQkJCVRFWFRfTUVUSE9EX0NPTkZJR1VSQVRPTik7Ci0JCUVMRU1FTlRfVEVYVC5wdXQoTWV0aG9kTGlicmFyeUltcGwuY2xhc3MsIFRFWFRfTUVUSE9EX0xJQkFSQVJZKTsKLQkJRUxFTUVOVF9URVhULnB1dChNZXRob2RQYWNrYWdlSW1wbC5jbGFzcywgVEVYVF9NRVRIT0RfUEFDS0FHRSk7Ci0JCUVMRU1FTlRfVEVYVC5wdXQoTWV0aG9kUGx1Z2luSW1wbC5jbGFzcywgVEVYVF9NRVRIT0RfUExVR0lOKTsKLQkJRUxFTUVOVF9URVhULnB1dChNaWxlc3RvbmVJbXBsLmNsYXNzLCBURVhUX01JTEVTVE9ORSk7Ci0JCUVMRU1FTlRfVEVYVC5wdXQoT3V0Y29tZUltcGwuY2xhc3MsIFRFWFRfT1VUQ09NRSk7Ci0JCUVMRU1FTlRfVEVYVC5wdXQoUGhhc2VJbXBsLmNsYXNzLCBURVhUX1BIQVNFKTsKLQkJRUxFTUVOVF9URVhULnB1dChQcmFjdGljZUltcGwuY2xhc3MsIFRFWFRfUFJBQ1RJQ0UpOwotCQlFTEVNRU5UX1RFWFQucHV0KFByb2Nlc3NGYW1pbHlJbXBsLmNsYXNzLCBURVhUX1BST0NFU1NfRkFNSUxZKTsKLQkJRUxFTUVOVF9URVhULnB1dChQcm9jZXNzUGFja2FnZUltcGwuY2xhc3MsIFRFWFRfUFJPQ0VTU19QQUNLQUdFKTsKLQkJRUxFTUVOVF9URVhULnB1dChSZXBvcnRJbXBsLmNsYXNzLCBURVhUX1JFUE9SVCk7Ci0JCUVMRU1FTlRfVEVYVC5wdXQoUmV1c2FibGVBc3NldEltcGwuY2xhc3MsIFRFWFRfUkVVU0FCTEVfQVNTRVQpOwotCQlFTEVNRU5UX1RFWFQucHV0KFJvYWRtYXBJbXBsLmNsYXNzLCBURVhUX1JPQURNQVApOwotCQlFTEVNRU5UX1RFWFQucHV0KFJvbGVJbXBsLmNsYXNzLCBURVhUX1JPTEUpOwotCQlFTEVNRU5UX1RFWFQucHV0KFJvbGVEZXNjcmlwdG9ySW1wbC5jbGFzcywgVEVYVF9ST0xFX0RFU0NSSVBUT1IpOwotCQlFTEVNRU5UX1RFWFQucHV0KFJvbGVTZXRJbXBsLmNsYXNzLCBURVhUX1JPTEVfU0VUKTsKLQkJRUxFTUVOVF9URVhULnB1dChSb2xlU2V0R3JvdXBpbmdJbXBsLmNsYXNzLCBURVhUX1JPTEVfU0VUX0dST1VQSU5HKTsKLQkJRUxFTUVOVF9URVhULnB1dChTdGVwSW1wbC5jbGFzcywgVEVYVF9TVEVQKTsKLQkJRUxFTUVOVF9URVhUCi0JCQkJLnB1dChTdXBwb3J0aW5nTWF0ZXJpYWxJbXBsLmNsYXNzLCBURVhUX1NVUFBPUlRJTkdfTUFURVJJQUwpOwotCQlFTEVNRU5UX1RFWFQucHV0KFRhc2tJbXBsLmNsYXNzLCBURVhUX1RBU0spOwotCQlFTEVNRU5UX1RFWFQucHV0KFRhc2tEZXNjcmlwdG9ySW1wbC5jbGFzcywgVEVYVF9UQVNLX0RFU0NSSVBUT1IpOwotCQlFTEVNRU5UX1RFWFQucHV0KFRlYW1Qcm9maWxlSW1wbC5jbGFzcywgVEVYVF9URUFNX1BST0ZJTEUpOwotCQlFTEVNRU5UX1RFWFQucHV0KFRlbXBsYXRlSW1wbC5jbGFzcywgVEVYVF9URU1QTEFURSk7Ci0JCUVMRU1FTlRfVEVYVC5wdXQoVGVybURlZmluaXRpb25JbXBsLmNsYXNzLCBURVhUX1RFUk1fREVGSU5JVElPTik7Ci0JCUVMRU1FTlRfVEVYVC5wdXQoVGVtcGxhdGVJbXBsLmNsYXNzLCBURVhUX1RFTVBMQVRFKTsKLQkJRUxFTUVOVF9URVhULnB1dChUb29sSW1wbC5jbGFzcywgVEVYVF9UT09MKTsKLQkJRUxFTUVOVF9URVhULnB1dChUb29sTWVudG9ySW1wbC5jbGFzcywgVEVYVF9UT09MX01FTlRPUik7Ci0JCUVMRU1FTlRfVEVYVC5wdXQoV2hpdGVwYXBlckltcGwuY2xhc3MsIFRFWFRfV0hJVEVQQVBFUik7Ci0JCUVMRU1FTlRfVEVYVC5wdXQoV29ya1Byb2R1Y3RJbXBsLmNsYXNzLCBURVhUX1dPUktfUFJPRFVDVCk7Ci0JCUVMRU1FTlRfVEVYVC5wdXQoV29ya1Byb2R1Y3REZXNjcmlwdG9ySW1wbC5jbGFzcywKLQkJCQlURVhUX1dPUktfUFJPRFVDVF9ERVNDUklQVE9SKTsKLQkJRUxFTUVOVF9URVhULnB1dChXb3JrUHJvZHVjdFR5cGVJbXBsLmNsYXNzLCBURVhUX1dPUktfUFJPRFVDVF9UWVBFKTsKLQotCQkvLyBwbHVyYWwKLQkJRUxFTUVOVF9URVhUX1BMVVJBTC5wdXQoQWN0aXZpdHlJbXBsLmNsYXNzLCBURVhUX0FDVElWSVRZX1BMVVJBTCk7Ci0JCUVMRU1FTlRfVEVYVF9QTFVSQUwucHV0KEFydGlmYWN0SW1wbC5jbGFzcywgVEVYVF9BUlRJRkFDVF9QTFVSQUwpOwotCQlFTEVNRU5UX1RFWFRfUExVUkFMLnB1dChDYXBhYmlsaXR5UGF0dGVybkltcGwuY2xhc3MsCi0JCQkJVEVYVF9DQVBBQklMSVRZX1BBVFRFUk5fUExVUkFMKTsKLQkJRUxFTUVOVF9URVhUX1BMVVJBTC5wdXQoQ2hlY2tsaXN0SW1wbC5jbGFzcywgVEVYVF9DSEVDS0xJU1RfUExVUkFMKTsKLQkJRUxFTUVOVF9URVhUX1BMVVJBTC5wdXQoQ29tcG9zaXRlUm9sZUltcGwuY2xhc3MsCi0JCQkJVEVYVF9DT01QT1NJVEVfUk9MRV9QTFVSQUwpOwotCQlFTEVNRU5UX1RFWFRfUExVUkFMLnB1dChDb25jZXB0SW1wbC5jbGFzcywgVEVYVF9DT05DRVBUX1BMVVJBTCk7Ci0JCUVMRU1FTlRfVEVYVF9QTFVSQUwucHV0KENvbnRlbnRQYWNrYWdlSW1wbC5jbGFzcywKLQkJCQlURVhUX0NPTlRFTlRfUEFDS0FHRV9QTFVSQUwpOwotCQlFTEVNRU5UX1RFWFRfUExVUkFMLnB1dChDdXN0b21DYXRlZ29yeUltcGwuY2xhc3MsCi0JCQkJVEVYVF9DVVNUT01fQ0FURUdPUllfUExVUkFMKTsKLQkJRUxFTUVOVF9URVhUX1BMVVJBTC5wdXQoRGVsaXZlcmFibGVJbXBsLmNsYXNzLCBURVhUX0RFTElWRVJBQkxFX1BMVVJBTCk7Ci0JCUVMRU1FTlRfVEVYVF9QTFVSQUwucHV0KERlbGl2ZXJ5UHJvY2Vzc0ltcGwuY2xhc3MsCi0JCQkJVEVYVF9ERUxJVkVSWV9QUk9DRVNTX1BMVVJBTCk7Ci0JCUVMRU1FTlRfVEVYVF9QTFVSQUwucHV0KERpc2NpcGxpbmVJbXBsLmNsYXNzLCBURVhUX0RJU0NJUExJTkVfUExVUkFMKTsKLQkJRUxFTUVOVF9URVhUX1BMVVJBTC5wdXQoRGlzY2lwbGluZUdyb3VwaW5nSW1wbC5jbGFzcywKLQkJCQlURVhUX0RJU0NJUExJTkVfR1JPVVBJTkdfUExVUkFMKTsKLQkJRUxFTUVOVF9URVhUX1BMVVJBTC5wdXQoRG9tYWluSW1wbC5jbGFzcywgVEVYVF9ET01BSU5fUExVUkFMKTsKLQkJRUxFTUVOVF9URVhUX1BMVVJBTC5wdXQoRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zSW1wbC5jbGFzcywKLQkJCQlURVhUX0VTVElNQVRJT05fQ09OU0lERVJBVElPTlNfUExVUkFMKTsKLQkJRUxFTUVOVF9URVhUX1BMVVJBTC5wdXQoRXhhbXBsZUltcGwuY2xhc3MsIFRFWFRfRVhBTVBMRV9QTFVSQUwpOwotCQlFTEVNRU5UX1RFWFRfUExVUkFMLnB1dChHdWlkZWxpbmVJbXBsLmNsYXNzLCBURVhUX0dVSURFTElORV9QTFVSQUwpOwotCQlFTEVNRU5UX1RFWFRfUExVUkFMLnB1dChJdGVyYXRpb25JbXBsLmNsYXNzLCBURVhUX0lURVJBVElPTl9QTFVSQUwpOwotCQlFTEVNRU5UX1RFWFRfUExVUkFMLnB1dChNZXRob2RDb25maWd1cmF0aW9uSW1wbC5jbGFzcywKLQkJCQlURVhUX01FVEhPRF9DT05GSUdVUkFUT05fUExVUkFMKTsKLQkJRUxFTUVOVF9URVhUX1BMVVJBTC5wdXQoTWV0aG9kTGlicmFyeUltcGwuY2xhc3MsCi0JCQkJVEVYVF9NRVRIT0RfTElCQVJBUllfUExVUkFMKTsKLQkJRUxFTUVOVF9URVhUX1BMVVJBTC5wdXQoTWV0aG9kUGFja2FnZUltcGwuY2xhc3MsCi0JCQkJVEVYVF9NRVRIT0RfUEFDS0FHRV9QTFVSQUwpOwotCQlFTEVNRU5UX1RFWFRfUExVUkFMLnB1dChNZXRob2RQbHVnaW5JbXBsLmNsYXNzLAotCQkJCVRFWFRfTUVUSE9EX1BMVUdJTl9QTFVSQUwpOwotCQlFTEVNRU5UX1RFWFRfUExVUkFMLnB1dChNaWxlc3RvbmVJbXBsLmNsYXNzLCBURVhUX01JTEVTVE9ORV9QTFVSQUwpOwotCQlFTEVNRU5UX1RFWFRfUExVUkFMLnB1dChPdXRjb21lSW1wbC5jbGFzcywgVEVYVF9PVVRDT01FX1BMVVJBTCk7Ci0JCUVMRU1FTlRfVEVYVF9QTFVSQUwucHV0KFBoYXNlSW1wbC5jbGFzcywgVEVYVF9QSEFTRV9QTFVSQUwpOwotCQlFTEVNRU5UX1RFWFRfUExVUkFMLnB1dChQcmFjdGljZUltcGwuY2xhc3MsIFRFWFRfUFJBQ1RJQ0VfUExVUkFMKTsKLQkJRUxFTUVOVF9URVhUX1BMVVJBTC5wdXQoUHJvY2Vzc0ZhbWlseUltcGwuY2xhc3MsCi0JCQkJVEVYVF9QUk9DRVNTX0ZBTUlMWV9QTFVSQUwpOwotCQlFTEVNRU5UX1RFWFRfUExVUkFMLnB1dChQcm9jZXNzUGFja2FnZUltcGwuY2xhc3MsCi0JCQkJVEVYVF9QUk9DRVNTX1BBQ0tBR0VfUExVUkFMKTsKLQkJRUxFTUVOVF9URVhUX1BMVVJBTC5wdXQoUmVwb3J0SW1wbC5jbGFzcywgVEVYVF9SRVBPUlRfUExVUkFMKTsKLQkJRUxFTUVOVF9URVhUX1BMVVJBTC5wdXQoUmV1c2FibGVBc3NldEltcGwuY2xhc3MsCi0JCQkJVEVYVF9SRVVTQUJMRV9BU1NFVF9QTFVSQUwpOwotCQlFTEVNRU5UX1RFWFRfUExVUkFMLnB1dChSb2FkbWFwSW1wbC5jbGFzcywgVEVYVF9ST0FETUFQX1BMVVJBTCk7Ci0JCUVMRU1FTlRfVEVYVF9QTFVSQUwucHV0KFJvbGVJbXBsLmNsYXNzLCBURVhUX1JPTEVfUExVUkFMKTsKLQkJRUxFTUVOVF9URVhUX1BMVVJBTC5wdXQoUm9sZURlc2NyaXB0b3JJbXBsLmNsYXNzLAotCQkJCVRFWFRfUk9MRV9ERVNDUklQVE9SX1BMVVJBTCk7Ci0JCUVMRU1FTlRfVEVYVF9QTFVSQUwucHV0KFJvbGVTZXRJbXBsLmNsYXNzLCBURVhUX1JPTEVfU0VUX1BMVVJBTCk7Ci0JCUVMRU1FTlRfVEVYVF9QTFVSQUwucHV0KFJvbGVTZXRHcm91cGluZ0ltcGwuY2xhc3MsCi0JCQkJVEVYVF9ST0xFX1NFVF9HUk9VUElOR19QTFVSQUwpOwotCQlFTEVNRU5UX1RFWFRfUExVUkFMLnB1dChTdGVwSW1wbC5jbGFzcywgVEVYVF9TVEVQX1BMVVJBTCk7Ci0JCUVMRU1FTlRfVEVYVF9QTFVSQUwucHV0KFN1cHBvcnRpbmdNYXRlcmlhbEltcGwuY2xhc3MsCi0JCQkJVEVYVF9TVVBQT1JUSU5HX01BVEVSSUFMX1BMVVJBTCk7Ci0JCUVMRU1FTlRfVEVYVF9QTFVSQUwucHV0KFRhc2tJbXBsLmNsYXNzLCBURVhUX1RBU0tfUExVUkFMKTsKLQkJRUxFTUVOVF9URVhUX1BMVVJBTC5wdXQoVGFza0Rlc2NyaXB0b3JJbXBsLmNsYXNzLAotCQkJCVRFWFRfVEFTS19ERVNDUklQVE9SX1BMVVJBTCk7Ci0JCUVMRU1FTlRfVEVYVF9QTFVSQUwKLQkJCQkucHV0KFRlYW1Qcm9maWxlSW1wbC5jbGFzcywgVEVYVF9URUFNX1BST0ZJTEVfUExVUkFMKTsKLQkJRUxFTUVOVF9URVhUX1BMVVJBTC5wdXQoVGVtcGxhdGVJbXBsLmNsYXNzLCBURVhUX1RFTVBMQVRFX1BMVVJBTCk7Ci0JCUVMRU1FTlRfVEVYVF9QTFVSQUwucHV0KFRlcm1EZWZpbml0aW9uSW1wbC5jbGFzcywKLQkJCQlURVhUX1RFUk1fREVGSU5JVElPTl9QTFVSQUwpOwotCQlFTEVNRU5UX1RFWFRfUExVUkFMLnB1dChUZW1wbGF0ZUltcGwuY2xhc3MsIFRFWFRfVEVNUExBVEVfUExVUkFMKTsKLQkJRUxFTUVOVF9URVhUX1BMVVJBTC5wdXQoVG9vbEltcGwuY2xhc3MsIFRFWFRfVE9PTF9QTFVSQUwpOwotCQlFTEVNRU5UX1RFWFRfUExVUkFMLnB1dChUb29sTWVudG9ySW1wbC5jbGFzcywgVEVYVF9UT09MX01FTlRPUl9QTFVSQUwpOwotCQlFTEVNRU5UX1RFWFRfUExVUkFMLnB1dChXaGl0ZXBhcGVySW1wbC5jbGFzcywgVEVYVF9XSElURVBBUEVSX1BMVVJBTCk7Ci0JCUVMRU1FTlRfVEVYVF9QTFVSQUwKLQkJCQkucHV0KFdvcmtQcm9kdWN0SW1wbC5jbGFzcywgVEVYVF9XT1JLX1BST0RVQ1RfUExVUkFMKTsKLQkJRUxFTUVOVF9URVhUX1BMVVJBTC5wdXQoV29ya1Byb2R1Y3REZXNjcmlwdG9ySW1wbC5jbGFzcywKLQkJCQlURVhUX1dPUktfUFJPRFVDVF9ERVNDUklQVE9SX1BMVVJBTCk7Ci0JCUVMRU1FTlRfVEVYVF9QTFVSQUwucHV0KFdvcmtQcm9kdWN0VHlwZUltcGwuY2xhc3MsCi0JCQkJVEVYVF9XT1JLX1BST0RVQ1RfVFlQRV9QTFVSQUwpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGRpc3BsYXkgbmFtZSBmb3IgYSBtZXRob2QgZWxlbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqICAgICAgICAgICAgYSBtZXRob2QgZWxlbWVudAotCSAqIEBwYXJhbSBwbHVyYWwKLQkgKiAgICAgICAgICAgIGlmIDxjb2RlPnRydWU8L2NvZGU+LCByZXR1cm4gdGhlIHBsdXJhbCBmb3JtIG9mIHRoZSBkaXNwbGF5Ci0JICogICAgICAgICAgICBuYW1lCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0VUlUZXh0KE1ldGhvZEVsZW1lbnQgZWxlbWVudCwgYm9vbGVhbiBwbHVyYWwpIHsKLQkJaWYgKHBsdXJhbCkgewotCQkJU3RyaW5nIGxhYmVsID0gKFN0cmluZykgRUxFTUVOVF9URVhUX1BMVVJBTC5nZXQoZWxlbWVudC5nZXRDbGFzcygpKTsKLQkJCXJldHVybiAobGFiZWwgPT0gbnVsbCkgPyBlbGVtZW50LmdldE5hbWUoKSA6IGxhYmVsOwotCQl9IGVsc2UgewotCQkJU3RyaW5nIGxhYmVsID0gKFN0cmluZykgRUxFTUVOVF9URVhULmdldChlbGVtZW50LmdldENsYXNzKCkpOwotCQkJcmV0dXJuIChsYWJlbCA9PSBudWxsKSA/IGVsZW1lbnQuZ2V0TmFtZSgpIDogbGFiZWw7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBkaXNwbGF5IG5hbWUgZm9yIGEgbWV0aG9kIGVsZW1lbnQuCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGVsZW1lbnQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRVSVRleHQoTWV0aG9kRWxlbWVudCBlbGVtZW50KSB7Ci0JCXJldHVybiBnZXRVSVRleHQoZWxlbWVudCwgZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGRpc3BsYXkgbmFtZSBmb3IgYSBtZXRob2QgZWxlbWVudCBpbiBsb3dlciBjYXNlLgotCSAqIDxwPgotCSAqIE5vdGU6IFRoaXMgbWV0aG9kIGRvZXMgbm90IGFwcGxpZXMgdG8gdGhlIEdlcm1hbiBsYW5ndWFnZSBzaW5jZSBpdCBoYXMgbm8KLQkgKiBkaXN0aW5jdGlvbiBiZXR3ZWVuIGEgdXBwZXIgY2FzZSBhbmQgbG93ZXIgY2FzZSBub3VuLgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogICAgICAgICAgICBhIG1ldGhvZCBlbGVtZW50Ci0JICogQHBhcmFtIHBsdXJhbAotCSAqICAgICAgICAgICAgaWYgPGNvZGU+dHJ1ZTwvY29kZT4sIHJldHVybiB0aGUgcGx1cmFsIGZvcm0gb2YgdGhlIGRpc3BsYXkKLQkgKiAgICAgICAgICAgIG5hbWUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRVSVRleHRMb3dlcihNZXRob2RFbGVtZW50IGVsZW1lbnQsIGJvb2xlYW4gcGx1cmFsKSB7Ci0JCVN0cmluZyBsYWJlbDsKLQkJaWYgKHBsdXJhbCkgewotCQkJbGFiZWwgPSAoU3RyaW5nKSBFTEVNRU5UX1RFWFRfUExVUkFMLmdldChlbGVtZW50LmdldENsYXNzKCkpOwotCQkJbGFiZWwgPSAobGFiZWwgPT0gbnVsbCkgPyBlbGVtZW50LmdldE5hbWUoKSA6IGxhYmVsOwotCQl9IGVsc2UgewotCQkJbGFiZWwgPSAoU3RyaW5nKSBFTEVNRU5UX1RFWFQuZ2V0KGVsZW1lbnQuZ2V0Q2xhc3MoKSk7Ci0JCQlsYWJlbCA9IChsYWJlbCA9PSBudWxsKSA/IGVsZW1lbnQuZ2V0TmFtZSgpIDogbGFiZWw7Ci0JCX0KLQotCQlyZXR1cm4gU3RyVXRpbC50b0xvd2VyKGxhYmVsKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBkaXNwbGF5IG5hbWUgZm9yIGEgbWV0aG9kIGVsZW1lbnQgaW4gbG93ZXIgY2FzZS4KLQkgKiA8cD4KLQkgKiBOb3RlOiBUaGlzIG1ldGhvZCBkb2VzIG5vdCBhcHBsaWVzIHRvIHRoZSBHZXJtYW4gbGFuZ3VhZ2Ugc2luY2UgaXQgaGFzIG5vCi0JICogZGlzdGluY3Rpb24gYmV0d2VlbiBhIHVwcGVyIGNhc2UgYW5kIGxvd2VyIGNhc2Ugbm91bi4KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqICAgICAgICAgICAgYSBtZXRob2QgZWxlbWVudAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFVJVGV4dExvd2VyKE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgewotCQlyZXR1cm4gZ2V0VUlUZXh0TG93ZXIoZWxlbWVudCwgZmFsc2UpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL0xpYnJhcnlVSVV0aWwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9MaWJyYXJ5VUlVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhZTRkNDQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL0xpYnJhcnlVSVV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxMiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aTsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpLnV0aWwuTXNnQm94OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udWkudXRpbC5Nc2dEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5GaWxlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5JTGlicmFyeU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5SZXNvdXJjZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UuRmlsZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVpLkVQRlVJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51aS5kaWFsb2dzLlJlbmFtZUZpbGVDb25mbGljdERpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci0KLS8qKgotICogSGVscGVyIHV0aWxpdGllcyBmb3IgaW1wbGVtZW50aW5nIG1ldGhvZCBsaWJyYXJ5IFVJLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIExpYnJhcnlVSVV0aWwgewotCi0JLyoqCi0JICogVXBkYXRlcyB0aGUgYXBwbGljYXRpb24gc2hlbGwgdGl0bGUgdG8gZGlzcGxheSB0aGUgYXBwbGljYXRpb24gbmFtZSBhbmQKLQkgKiB0aGUgZGVmYXVsdCBtZXRob2QgbGlicmFyeSBwYXRoLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCB1cGRhdGVTaGVsbFRpdGxlKCkgewotCQlJV29ya2JlbmNoV2luZG93IHdpbmRvdyA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkKLQkJCQkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0JCWlmICh3aW5kb3cgIT0gbnVsbCkgewotCQkJU2hlbGwgc2hlbGwgPSB3aW5kb3cuZ2V0U2hlbGwoKTsKLQkJCWlmIChzaGVsbCAhPSBudWxsKSB7Ci0JCQkJU3RyaW5nIGxpYlBhdGggPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJCWlmIChMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCkgIT0gbnVsbCkgewotCQkJCQlsaWJQYXRoID0gTGlicmFyeVNlcnZpY2VVdGlsLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5UGF0aCgpOwotCQkJCQlpZiAobGliUGF0aCA9PSBudWxsKSB7Ci0JCQkJCQlsaWJQYXRoID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKQotCQkJCQkJCQkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKS5nZXROYW1lKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJU3RyaW5nIGFwcE5hbWUgPSBQbGF0Zm9ybS5nZXRQcm9kdWN0KCkuZ2V0TmFtZSgpOwotCQkJCVN0cmluZyBhcHBUaXRsZSA9IE5MUy5iaW5kKAotCQkJCQkJTGlicmFyeVVJUmVzb3VyY2VzLmFwcGxpY2F0aW9uX3RpdGxlLCBuZXcgT2JqZWN0W10gewotCQkJCQkJCQlhcHBOYW1lLCBsaWJQYXRoIH0pOwotCQkJCXNoZWxsLnNldFRleHQoYXBwVGl0bGUpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogRGlzcGxheXMgYSBkaWFsb2cgdG8gcHJvbXB0cyB0aGUgdXNlciB0byBzYXZlIHRoZSBvcGVuIGxpYnJhcnkgaWYgaXQgaGFzCi0JICogYmVlbiBtb2RpZmllZC4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPlNXVC5ZRVM8L2NvZGU+LCA8Y29kZT5TV1QuTk88L2NvZGU+IG9yCi0JICogICAgICAgICA8Y29kZT5TV1QuQ0FOQ0VMPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IGRpc3BsYXlTYXZlRGlydHlFZGl0b3JzRGlhbG9nKCkgewotCQlJTGlicmFyeU1hbmFnZXIgbWFuYWdlciA9IChJTGlicmFyeU1hbmFnZXIpIExpYnJhcnlTZXJ2aWNlCi0JCQkJLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudExpYnJhcnlNYW5hZ2VyKCk7Ci0JCWlmIChtYW5hZ2VyICE9IG51bGwgJiYgbWFuYWdlci5pc01ldGhvZExpYnJhcnlNb2RpZmllZCgpKSB7Ci0JCQlpbnQgcmV0ID0gTXNnQm94LnByb21wdChMaWJyYXJ5VUlSZXNvdXJjZXMuc2F2ZUxpYnJhcnlEaWFsb2dfdGl0bGUsCi0JCQkJCUxpYnJhcnlVSVJlc291cmNlcy5zYXZlTGlicmFyeURpYWxvZ190ZXh0LCBTV1QuWUVTIHwgU1dULk5PCi0JCQkJCQkJfCBTV1QuQ0FOQ0VMKTsKLQkJCXN3aXRjaCAocmV0KSB7Ci0JCQljYXNlIFNXVC5ZRVM6Ci0JCQkJdHJ5IHsKLQkJCQkJTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5zYXZlQ3VycmVudE1ldGhvZExpYnJhcnkoKTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQlNc2dEaWFsb2cgZGlhbG9nID0gTGlicmFyeVVJUGx1Z2luLmdldERlZmF1bHQoKQotCQkJCQkJCS5nZXRNc2dEaWFsb2coKTsKLQkJCQkJZGlhbG9nLmRpc3BsYXlFcnJvcigKLQkJCQkJCQlMaWJyYXJ5VUlSZXNvdXJjZXMuc2F2ZUxpYnJhcnlEaWFsb2dfdGl0bGUsCi0JCQkJCQkJTGlicmFyeVVJUmVzb3VyY2VzLnNhdmVMaWJyYXJ5RXJyb3JfbXNnLAotCQkJCQkJCUxpYnJhcnlVSVJlc291cmNlcy5lcnJvcl9yZWFzb24sIGUpOwotCQkJCX0KLQkJCQlyZXR1cm4gU1dULllFUzsKLQkJCWNhc2UgU1dULk5POgotCQkJCS8vIERpc2NhcmQgYWxsIGNoYW5nZXMgYnkgcmVzZXR0aW5nIGFsbCByZXNvdXJjZXMgYXMgdW5jaGFuZ2VkLgotCQkJCW1hbmFnZXIuZGlzY2FyZE1ldGhvZExpYnJhcnlDaGFuZ2VzKCk7Ci0JCQkJcmV0dXJuIFNXVC5OTzsKLQkJCWNhc2UgU1dULkNBTkNFTDoKLQkJCQlyZXR1cm4gU1dULkNBTkNFTDsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBTV1QuQ0FOQ0VMOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgZmlsZSBVUkwgZm9yIGFuIGF0dGFjaG1lbnQKLQkgKiAKLQkgKiBAcGFyYW0gYXR0YWNobWVudAotCSAqICAgICAgICAgICAgdGhlIGZpbGUgdG8gYXR0YWNoCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiAgICAgICAgICAgIHRoZSBNZXRob2RFbGVtZW50IHJlZmVyZW5jaW5nIHRoZSBmaWxlCi0JICogQHBhcmFtIGNvcHlGaWxlCi0JICogICAgICAgICAgICBpZiB0cnVlLCB3aWxsIGNvcHkgdGhlIGZpbGUgKGlmIGl0IGlzbid0IGFscmVhZHkgaW4gdGhlIHBsdWdpbgotCSAqICAgICAgICAgICAgcGF0aCkKLQkgKiBAcmV0dXJuIFVSTCBvZiB0aGUgZm9ybSAuLy4uLyZsdDtyb2xlcyZndDsvcmVzb3VyY2VzLyZsdDtmaWxlbmFtZSBvZgotCSAqICAgICAgICAgYXR0YWNobWVudCZndDsKLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0VVJMRm9yQXR0YWNobWVudChTaGVsbCBzaGVsbCwgRmlsZSBhdHRhY2htZW50LAotCQkJTWV0aG9kRWxlbWVudCBlbGVtZW50LCBib29sZWFuIGNvcHlGaWxlKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlTdHJpbmcgcGx1Z2luRGlyID0gRmlsZVV0aWwuYXBwZW5kU2VwYXJhdG9yKG5ldyBGaWxlKFVtYVV0aWwuZ2V0TWV0aG9kUGx1Z2luKGVsZW1lbnQpCi0JCQkJLmVSZXNvdXJjZSgpLmdldFVSSSgpLnRvRmlsZVN0cmluZygpKS5nZXRQYXJlbnQoKSk7Ci0JCUZpbGUgZm9ybWF0RmlsZSA9IG51bGw7Ci0JCVN0cmluZyByZXNvdXJjZUxvYyA9IFJlc291cmNlSGVscGVyLmdldEFic29sdXRlRWxlbWVudFJlc291cmNlUGF0aChlbGVtZW50KTsKLQkJLy8gRmlsZSByZXNvdXJjZURpciA9IG5ldyBGaWxlKHJlc291cmNlTG9jKTsKLQkJZm9ybWF0RmlsZSA9IG5ldyBGaWxlKHJlc291cmNlTG9jICsgRmlsZS5zZXBhcmF0b3IKLQkJCQkrIGF0dGFjaG1lbnQuZ2V0TmFtZSgpKTsKLQkJaWYgKGNvcHlGaWxlKSB7Ci0JCQlGaWxlIG5ld0ZpbGUgPSBjb3B5UmVzb3VyY2VUb0xpYihzaGVsbCwgYXR0YWNobWVudCwgZWxlbWVudCk7Ci0JCQlpZiAobmV3RmlsZSAhPSBudWxsKSB7Ci0JCQkJZm9ybWF0RmlsZSA9IG5ldyBGaWxlKHJlc291cmNlTG9jICsgRmlsZS5zZXBhcmF0b3IKLQkJCQkJCSsgbmV3RmlsZS5nZXROYW1lKCkpOwotCQkJfSBlbHNlIHsKLQkJCQkvLyB1c2VyIGhpdCBjYW5jZWwKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJCUlSZXNvdXJjZSB3c1Jlc291cmNlID0gRmlsZU1hbmFnZXIuZ2V0UmVzb3VyY2VGb3JMb2NhdGlvbihmb3JtYXRGaWxlLmdldEFic29sdXRlUGF0aCgpKTsKLQkJCWlmKHdzUmVzb3VyY2UgIT0gbnVsbCkgewotCQkJCXRyeSB7Ci0JCQkJCUZpbGVNYW5hZ2VyLnJlZnJlc2god3NSZXNvdXJjZSk7Ci0JCQkJfQotCQkJCWNhdGNoKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCUxpYnJhcnlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiBSZXNvdXJjZUhlbHBlci5nZXRSZWxhdGl2ZVBhdGhUb0ZpbGVGcm9tRWxlbWVudChlbGVtZW50LAotCQkJCWZvcm1hdEZpbGUpOwotCi0JfQotCQotCS8qKgotCSAqIENvcGllcyB0aGUgZ2l2ZW4gZmlsZSBpbnRvIHRoZSBtZXRob2RFbGVtZW50J3MgcmVzb3VyY2UgZm9sZGVyLgotCSAqIFJlc29sdmVzIGZpbGVuYW1lIGNvbmZsaWN0IGJ5IHByb21wdGluZyB1c2VyIHRvIG92ZXJ3cml0ZSBvciByZW5hbWUKLQkgKiBAcGFyYW0gc2hlbGwgaWYgbnVsbCwgd2lsbCBvdmVyd3JpdGUgZmlsZSB3aXRob3V0IHByb21wdGluZwotCSAqIEBwYXJhbSByZXNvdXJjZQotCSAqIEBwYXJhbSBtZXRob2RFbGVtZW50Ci0JICogQHJldHVybiB0aGUgRmlsZSByZXByZXNlbnRpbmcgdGhlIHVzZXIncyBmaW5hbCBjaG9pY2Ugb2YgbGlicmFyeSByZXNvdXJjZSBmaWxlCi0JICovCi0JcHVibGljIHN0YXRpYyBGaWxlIGNvcHlSZXNvdXJjZVRvTGliKFNoZWxsIHNoZWxsLCBGaWxlIHJlc291cmNlLCBNZXRob2RFbGVtZW50IG1ldGhvZEVsZW1lbnQpIHsKLQkJU3RyaW5nIHJlc291cmNlTG9jID0gUmVzb3VyY2VIZWxwZXIuZ2V0QWJzb2x1dGVFbGVtZW50UmVzb3VyY2VQYXRoKG1ldGhvZEVsZW1lbnQpOwotCi0JCUZpbGUgbGliRmlsZSA9IG5ldyBGaWxlKHJlc291cmNlTG9jLCByZXNvdXJjZS5nZXROYW1lKCkpOwotCQotCQlpZiAocmVzb3VyY2UuZXF1YWxzKGxpYkZpbGUpKSB7Ci0JCQkvLyBzb3VyY2UgZmlsZSBpcyBhbHJlYWR5IGluIHJlc291cmNlcyBkaXIKLQkJCXJldHVybiBsaWJGaWxlOwotCQl9Ci0JCQotCQkvLyBpZiBubyBzaGVsbCwgd2lsbCBqdXN0IG92ZXJ3cml0ZQotCQlpZiAobGliRmlsZS5leGlzdHMoKSAmJiBzaGVsbCAhPSBudWxsKSB7Ci0JCQlSZW5hbWVGaWxlQ29uZmxpY3REaWFsb2cgZGlhbG9nID0gbmV3IFJlbmFtZUZpbGVDb25mbGljdERpYWxvZyhzaGVsbCk7Ci0JCQlkaWFsb2cuc2V0TWVzc2FnZVN0cihNZXNzYWdlRm9ybWF0LmZvcm1hdCgKLQkJCQkJCQkJCUVQRlVJUmVzb3VyY2VzLkRpYWxvZ19maWxlTmFtZUNvbmZsaWN0X21zZywgCi0JCQkJCQkJCQluZXcgT2JqZWN0W10geyByZXNvdXJjZS5nZXROYW1lKCksIHJlc291cmNlTG9jIH0pKTsKLQkJCWRpYWxvZy5zZXREZXN0aW5hdGlvbihyZXNvdXJjZUxvYyk7Ci0JCQlkaWFsb2cuc2V0RmlsZVBhdGgocmVzb3VyY2UuZ2V0TmFtZSgpKTsKLQkJCWRpYWxvZy5vcGVuKCk7Ci0KLQkJCWlmIChkaWFsb2cuZ2V0UmV0dXJuQ29kZSgpID09IElEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0lEKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9IGVsc2UgewotCQkJCWxpYkZpbGUgPSBuZXcgRmlsZShyZXNvdXJjZUxvYywgZGlhbG9nLmdldEZpbGVQYXRoKCkpOwotCQkJfQotCQl9Ci0KLQkJRmlsZVV0aWwuY29weUZpbGUocmVzb3VyY2UsIGxpYkZpbGUpOwotCQkKLQkJSVJlc291cmNlIHdzUmVzb3VyY2UgPSBGaWxlTWFuYWdlci5nZXRSZXNvdXJjZUZvckxvY2F0aW9uKGxpYkZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOwotCQlpZih3c1Jlc291cmNlICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJRmlsZU1hbmFnZXIucmVmcmVzaCh3c1Jlc291cmNlKTsKLQkJCX0KLQkJCWNhdGNoKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQl9Ci0JCX0KLQotCi0JCXJldHVybiBsaWJGaWxlOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9SZXNvdXJjZXMucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9SZXNvdXJjZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWYzOWMwOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvUmVzb3VyY2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNzUgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLQotIyBNZXRob2QgRWxlbWVudCBOYW1lcyAoU2luZ3VsYXIpCi1hY3Rpdml0eV90ZXh0PUFjdGl2aXR5Ci1hcnRpZmFjdF90ZXh0PUFydGlmYWN0Ci1jYXBhYmlsaXR5UGF0dGVybl90ZXh0PUNhcGFiaWxpdHkgUGF0dGVybgotY2hlY2tsaXN0X3RleHQ9Q2hlY2tsaXN0Ci1jaGVja0l0ZW1fdGV4dD1DaGVjayBJdGVtCi1jb21wb3NpdGVSb2xlX3RleHQ9Q29tcG9zaXRlIFJvbGUKLWNvbmNlcHRfdGV4dD1Db25jZXB0Ci1jb250ZW50UGFja2FnZV90ZXh0PUNvbnRlbnQgUGFja2FnZQotY3VzdG9tQ2F0ZWdvcnlfdGV4dD1DdXN0b20gQ2F0ZWdvcnkKLWRlbGl2ZXJhYmxlX3RleHQ9RGVsaXZlcmFibGUKLWRlbGl2ZXJ5UHJvY2Vzc190ZXh0PURlbGl2ZXJ5IFByb2Nlc3MKLWRlc2NyaXB0b3JfdGV4dD1EZXNjcmlwdG9yCi1kaXNjaXBsaW5lX3RleHQ9RGlzY2lwbGluZQotZGlzY2lwbGluZUdyb3VwaW5nX3RleHQ9RGlzY2lwbGluZSBHcm91cGluZwotZG9tYWluX3RleHQ9RG9tYWluCi1lc3RpbWF0ZV90ZXh0PUVzdGltYXRlCi1lc3RpbWF0aW5nTWV0cmljX3RleHQ9RXN0aW1hdGluZyBNZXRyaWMKLWVzdGltYXRpb25Db25zaWRlcmF0aW9uc190ZXh0PUVzdGltYXRpb24gQ29uc2lkZXJhdGlvbnMKLWV4YW1wbGVfdGV4dD1FeGFtcGxlCi1ndWlkYW5jZV90ZXh0PUd1aWRhbmNlCi1ndWlkZWxpbmVfdGV4dD1HdWlkZWxpbmUKLWl0ZXJhdGlvbl90ZXh0PUl0ZXJhdGlvbgotbWV0aG9kQ29uZmlndXJhdGlvbl90ZXh0PU1ldGhvZCBDb25maWd1cmF0aW9uCi1tZXRob2RDb250ZW50X3RleHQ9TWV0aG9kIENvbnRlbnQKLW1ldGhvZExpYnJhcnlfdGV4dD1NZXRob2QgTGlicmFyeQotbWV0aG9kUGFja2FnZV90ZXh0PU1ldGhvZCBQYWNrYWdlCi1tZXRob2RQbHVnaW5fdGV4dD1NZXRob2QgUGx1Zy1pbgotbWlsZXN0b25lX3RleHQ9TWlsZXN0b25lCi1vdXRjb21lX3RleHQ9T3V0Y29tZQotcGhhc2VfdGV4dD1QaGFzZQotcHJhY3RpY2VfdGV4dD1QcmFjdGljZQotcHJvY2Vzc190ZXh0PVByb2Nlc3MKLXByb2Nlc3NDb250cmlidXRpb25fdGV4dD1EaWZmZXJlbnRpYWwgUHJvY2VzcwotcHJvY2Vzc0ZhbWlseV90ZXh0PVByb2Nlc3MgRmFtaWx5Ci1wcm9jZXNzUGFja2FnZV90ZXh0PVByb2Nlc3MgUGFja2FnZQotcmVwb3J0X3RleHQ9UmVwb3J0Ci1yZXVzYWJsZUFzc2V0X3RleHQ9UmV1c2FibGUgQXNzZXQKLXJvYWRtYXBfdGV4dD1Sb2FkbWFwCi1yb2xlRGVzY3JpcHRvcl90ZXh0PVJvbGUgRGVzY3JpcHRvcgotcm9sZV90ZXh0PVJvbGUKLXJvbGVTZXRfdGV4dD1Sb2xlIFNldAotcm9sZVNldEdyb3VwaW5nX3RleHQ9Um9sZSBTZXQgR3JvdXBpbmcKLXN0YW5kYXJkQ2F0ZWdvcnlfdGV4dD1TdGFuZGFyZCBDYXRlZ29yeQotc3RlcF90ZXh0PVN0ZXAKLXN1cHBvcnRpbmdNYXRlcmlhbF90ZXh0PVN1cHBvcnRpbmcgTWF0ZXJpYWwKLXRhc2tfdGV4dD1UYXNrCi10YXNrRGVzY3JpcHRvcl90ZXh0PVRhc2sgRGVzY3JpcHRvcgotdGVhbVByb2ZpbGVfdGV4dD1UZWFtIFByb2ZpbGUKLXRlbXBsYXRlX3RleHQ9VGVtcGxhdGUKLXRlcm1EZWZpbml0aW9uX3RleHQ9VGVybSBEZWZpbml0aW9uCi10b29sX3RleHQ9VG9vbAotdG9vbE1lbnRvcl90ZXh0PVRvb2wgTWVudG9yCi13aGl0ZXBhcGVyX3RleHQ9V2hpdGVwYXBlcgotd29ya1Byb2R1Y3RfdGV4dD1Xb3JrIFByb2R1Y3QKLXdvcmtQcm9kdWN0RGVzY3JpcHRvcl90ZXh0PVdvcmsgUHJvZHVjdCBEZXNjcmlwdG9yCi13b3JrUHJvZHVjdEVsZW1lbnRfdGV4dD1Xb3JrIFByb2R1Y3QgRWxlbWVudAotd29ya1Byb2R1Y3RUeXBlX3RleHQ9V29yayBQcm9kdWN0IEtpbmQKLQotIyBNZXRob2QgRWxlbWVudCBOYW1lcyAoUGx1cmFsKQotYWN0aXZpdHlfdGV4dF9wbHVyYWw9QWN0aXZpdGllcwotYXJ0aWZhY3RfdGV4dF9wbHVyYWw9QXJ0aWZhY3RzCi1jYXBhYmlsaXR5UGF0dGVybl90ZXh0X3BsdXJhbD1DYXBhYmlsaXR5IFBhdHRlcm5zCi1jaGVja2xpc3RfdGV4dF9wbHVyYWw9Q2hlY2tsaXN0cwotY2hlY2tJdGVtX3RleHRfcGx1cmFsPUNoZWNrIEl0ZW1zCi1jb21wb3NpdGVSb2xlX3RleHRfcGx1cmFsPUNvbXBvc2l0ZSBSb2xlcwotY29uY2VwdF90ZXh0X3BsdXJhbD1Db25jZXB0cwotY29udGVudFBhY2thZ2VfdGV4dF9wbHVyYWw9Q29udGVudCBQYWNrYWdlcwotY3VzdG9tQ2F0ZWdvcnlfdGV4dF9wbHVyYWw9Q3VzdG9tIENhdGVnb3JpZXMKLWRlbGl2ZXJhYmxlX3RleHRfcGx1cmFsPURlbGl2ZXJhYmxlcwotZGVsaXZlcnlQcm9jZXNzX3RleHRfcGx1cmFsPURlbGl2ZXJ5IFByb2Nlc3NlcwotZGVzY3JpcHRvcl90ZXh0X3BsdXJhbD1EZXNjcmlwdG9ycwotZGlzY2lwbGluZV90ZXh0X3BsdXJhbD1EaXNjaXBsaW5lcwotZGlzY2lwbGluZUdyb3VwaW5nX3RleHRfcGx1cmFsPURpc2NpcGxpbmUgR3JvdXBpbmdzCi1kb21haW5fdGV4dF9wbHVyYWw9RG9tYWlucwotZXN0aW1hdGVfdGV4dF9wbHVyYWw9RXN0aW1hdGVzCi1lc3RpbWF0aW5nTWV0cmljX3RleHRfcGx1cmFsPUVzdGltYXRpbmcgTWV0cmljcwotZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zX3RleHRfcGx1cmFsPUVzdGltYXRpb24gQ29uc2lkZXJhdGlvbnMKLWV4YW1wbGVfdGV4dF9wbHVyYWw9RXhhbXBsZXMKLWd1aWRhbmNlX3RleHRfcGx1cmFsPUd1aWRhbmNlcwotZ3VpZGVsaW5lX3RleHRfcGx1cmFsPUd1aWRlbGluZXMKLWl0ZXJhdGlvbl90ZXh0X3BsdXJhbD1JdGVyYXRpb25zCi1tZXRob2RDb25maWd1cmF0aW9uX3RleHRfcGx1cmFsPU1ldGhvZCBDb25maWd1cmF0aW9ucwotbWV0aG9kQ29udGVudF90ZXh0X3BsdXJhbD1NZXRob2QgQ29udGVudHMKLW1ldGhvZExpYnJhcnlfdGV4dF9wbHVyYWw9TWV0aG9kIExpYnJhcmllcwotbWV0aG9kUGFja2FnZV90ZXh0X3BsdXJhbD1NZXRob2QgUGFja2FnZXMKLW1ldGhvZFBsdWdpbl90ZXh0X3BsdXJhbD1NZXRob2QgUGx1Zy1pbnMKLW1pbGVzdG9uZV90ZXh0X3BsdXJhbD1NaWxlc3RvbmVzCi1vdXRjb21lX3RleHRfcGx1cmFsPU91dGNvbWVzCi1waGFzZV90ZXh0X3BsdXJhbD1QaGFzZXMKLXByYWN0aWNlX3RleHRfcGx1cmFsPVByYWN0aWNlcwotcHJvY2Vzc190ZXh0X3BsdXJhbD1Qcm9jZXNzZXMKLXByb2Nlc3NDb250cmlidXRpb25fdGV4dF9wbHVyYWw9RGlmZmVyZW50aWFsIFByb2Nlc3NlcwotcHJvY2Vzc0ZhbWlseV90ZXh0X3BsdXJhbD1Qcm9jZXNzIEZhbWlsaWVzCi1wcm9jZXNzUGFja2FnZV90ZXh0X3BsdXJhbD1Qcm9jZXNzIFBhY2thZ2VzCi1yZXBvcnRfdGV4dF9wbHVyYWw9UmVwb3J0cwotcmV1c2FibGVBc3NldF90ZXh0X3BsdXJhbD1SZXVzYWJsZSBBc3NldHMKLXJvYWRtYXBfdGV4dF9wbHVyYWw9Um9hZG1hcHMKLXJvbGVEZXNjcmlwdG9yX3RleHRfcGx1cmFsPVJvbGUgRGVzY3JpcHRvcnMKLXJvbGVfdGV4dF9wbHVyYWw9Um9sZXMKLXJvbGVTZXRfdGV4dF9wbHVyYWw9Um9sZSBTZXRzCi1yb2xlU2V0R3JvdXBpbmdfdGV4dF9wbHVyYWw9Um9sZSBTZXQgR3JvdXBpbmdzCi1zdGFuZGFyZENhdGVnb3J5X3RleHRfcGx1cmFsPVN0YW5kYXJkIENhdGVnb3JpZXMKLXN0ZXBfdGV4dF9wbHVyYWw9U3RlcHMKLXN1cHBvcnRpbmdNYXRlcmlhbF90ZXh0X3BsdXJhbD1TdXBwb3J0aW5nIE1hdGVyaWFscwotdGFza190ZXh0X3BsdXJhbD1UYXNrcwotdGFza0Rlc2NyaXB0b3JfdGV4dF9wbHVyYWw9VGFzayBEZXNjcmlwdG9ycwotdGVhbVByb2ZpbGVfdGV4dF9wbHVyYWw9VGVhbSBQcm9maWxlcwotdGVtcGxhdGVfdGV4dF9wbHVyYWw9VGVtcGxhdGVzCi10ZXJtRGVmaW5pdGlvbl90ZXh0X3BsdXJhbD1UZXJtIERlZmluaXRpb25zCi10b29sX3RleHRfcGx1cmFsPVRvb2xzCi10b29sTWVudG9yX3RleHRfcGx1cmFsPVRvb2wgTWVudG9ycwotd2hpdGVwYXBlcl90ZXh0X3BsdXJhbD1XaGl0ZXBhcGVycwotd29ya1Byb2R1Y3RfdGV4dF9wbHVyYWw9V29yayBQcm9kdWN0cwotd29ya1Byb2R1Y3REZXNjcmlwdG9yX3RleHRfcGx1cmFsPVdvcmsgUHJvZHVjdCBEZXNjcmlwdG9ycwotd29ya1Byb2R1Y3RFbGVtZW50X3RleHRfcGx1cmFsPVdvcmsgUHJvZHVjdCBFbGVtZW50cwotd29ya1Byb2R1Y3RUeXBlX3RleHRfcGx1cmFsPVdvcmsgUHJvZHVjdCBLaW5kcwotCi0jIEFwcGxpY2F0aW9uIHRpdGxlLgotYXBwbGljYXRpb25fdGl0bGU9ezB9IC0gezF9Ci0KLSMgT3BlbiBNZXRob2QgTGlicmFyeSBXaXphcmQKLW9wZW5MaWJyYXJ5V2l6YXJkX3RpdGxlPU9wZW4gTWV0aG9kIExpYnJhcnkKLW9wZW5MaWJyYXJ5TWFpbldpemFyZFBhZ2VfdGl0bGU9U3BlY2lmeSBhIHBhdGggY29udGFpbmluZyBhIG1ldGhvZCBsaWJyYXJ5Ci1vcGVuTGlicmFyeU1haW5XaXphcmRQYWdlX3RpdGxlXzI9U2VsZWN0IGEgbWV0aG9kIGxpYnJhcnkKLW9wZW5MaWJyYXJ5TWFpbldpemFyZFBhZ2VfdGV4dD17MH0gc3RvcmVzIG1ldGhvZHMgYW5kIHByb2Nlc3NlcyBpbiBhIGZvbGRlciBjYWxsZWQgXG5hIG1ldGhvZCBsaWJyYXJ5LiBTZWxlY3QgYSBtZXRob2QgbGlicmFyeSBmb2xkZXIgdG8gdXNlIGZvciB0aGlzIHNlc3Npb24uCi1wYXRoTGFiZWxfdGV4dD1QYXRoOgotbmFtZUxhYmVsX3RleHQ9TmFtZToKLXVyaUxhYmVsX3RleHQ9VVJJOgotb3BlblVubGlzdGVkTGlicmFyeUNoZWNrYm94X3RleHQ9T3BlbiBhIG1ldGhvZCBsaWJyYXJ5IHRoYXQgaXMgbm90IGxpc3RlZCBhYm92ZQotbGlicmFyeVR5cGVMYWJlbF90ZXh0PVR5cGU6Ci1saWJyYXJ5TGFiZWxfdGV4dD1MaWJyYXJ5OgotYnJvd3NlQnV0dG9uX3RleHQ9QnJvd3NlLi4uCi1wcm9tcHRGb3JMaWJyYXJ5Q2hlY2tib3hfdGV4dD1Vc2UgdGhpcyBhcyB0aGUgZGVmYXVsdCBhbmQgZG8gbm90IGFzayBhZ2Fpbi4KLW9wZW5MaWJyYXJ5RGlhbG9nX25ld0xpYnJhcnlfdGV4dD1ObyBtZXRob2QgbGlicmFyeSBleGlzdHMgYXQgJyd7MH0nJy5cbkEgbmV3IG1ldGhvZCBsaWJyYXJ5IHdpbGwgYmUgY3JlYXRlZCBhbmQgb3BlbmVkIGZvciB5b3UgYXQgdGhlIHNwZWNpZmllZCBkaXJlY3RvcnkuXG5cbkNsaWNrIE9LIHRvIHByb2NlZWQgb3IgQ2FuY2VsIHRvIHNwZWNpZnkgYW5vdGhlciBtZXRob2QgbGlicmFyeSBwYXRoLgotCi0jIFNlbGVjdCBNZXRob2QgTGlicmFyeSBGb2xkZXIgRGlhbG9nCi1zZWxlY3RMaWJyYXJ5Rm9sZGVyRGlhbG9nX3RpdGxlPVNlbGVjdCBNZXRob2QgTGlicmFyeQotc2VsZWN0TGlicmFyeUZvbGRlckRpYWxvZ190ZXh0PVNlbGVjdCBhIG1ldGhvZCBsaWJyYXJ5IGZvbGRlci4KLQotIyBPcGVuIExpYnJhcnkgUHJvZ3Jlc3MgTWVzc2FnZQotb3BlbmluZ0xpYnJhcnlUYXNrX25hbWU9T3BlbmluZyBtZXRob2QgbGlicmFyeS4uLgotCi0jIE9wZW4gTWV0aG9kIExpYnJhcnkgRXJyb3IgRGlhbG9nCi1vcGVuTGlicmFyeUVycm9yX21zZz1JVVBMMDMwMUU6IFVuYWJsZSB0byBjcmVhdGUgdGhlIG1ldGhvZCBsaWJyYXJ5Lgotb3BlbkxpYnJhcnlJbnRlcm5sRXJyb3JfcmVhc29uPUFuIGludGVybmFsIGVycm9yIGhhcyBvY2N1cnJlZC4KLW9wZW5MaWJyYXJ5RXJyb3JfcmVhc29uMT1UaGUgc3BlY2lmaWVkIG1ldGhvZCBsaWJyYXJ5IHBhdGggJyd7MH0nJyBpcyBpbnZhbGlkLgotb3BlbkxpYnJhcnlFcnJvcl9yZWFzb24yPUEgbWV0aG9kIGxpYnJhcnkgYWxyZWFkeSBleGlzdHMgaW4gJyd7MH0nJy4KLW9wZW5MaWJyYXJ5RXJyb3JfcmVhc29uMz1UaGUgc3BlY2lmaWVkIG1ldGhvZCBsaWJyYXJ5IGZvbGRlciAnJ3swfScnIGNhbm5vdCBiZSBjcmVhdGVkLgotb3BlbkxpYnJhcnlFcnJvcl9yZWFzb240PVRoZSBzcGVjaWZpZWQgbWV0aG9kIGxpYnJhcnkgZm9sZGVyIGlzIGEgcGx1Zy1pbiBvciBjb25maWd1cmF0aW9uIHNwZWNpZmljYXRpb24gZXhwb3J0IGZvbGRlci4KLW9wZW5MaWJyYXJ5RXJyb3JfYWR2aWNlPVNlbGVjdCBPSyB0byBzcGVjaWZ5IGFub3RoZXIgbWV0aG9kIGxpYnJhcnkgcGF0aC4KLQotIyBPcGVuIE1ldGhvZCBMaWJyYXJ5IEVycm9yIE1lc3NhZ2VzCi1pbnZhbGlkTGlicmFyeVBhdGhfbXNnPUlVUEwwMzAyRTogVW5hYmxlIHRvIG9wZW4gdGhlIHNwZWNpZmllZCBtZXRob2QgbGlicmFyeS4KLWludmFsaWRMaWJyYXJ5UGF0aF9yZWFzb249VGhlIHNlbGVjdGVkIG1ldGhvZCBsaWJyYXJ5IGZvbGRlciBpcyBpbnZhbGlkLCBkb2VzIG5vdCBleGlzdCwgb3IgeW91IGRvIG5vdCBoYXZlIHRoZSBwcm9wZXIgcGVybWlzc2lvbiB0byBhY2Nlc3MgaXQuXG5cbkNsaWNrIE9LIHRvIHNlbGVjdCBhbm90aGVyIGxpYnJhcnkgZm9sZGVyLgotCi0jIFJlYWQtb25seSBQcm9qZWN0IEZpbGUgRXJyb3IgRGlhbG9nCi1yZWFkT25seVByb2plY3RGaWxlX3RleHQ9SVVQTDAzMDRFOiAnJ3swfScnIGlzIHJlYWQtb25seS4gTWFrZSBpdCB3cml0YWJsZSBiZWZvcmUgY29udGludWluZy4KLXJldHJ5QnV0dG9uX3RleHQ9UmV0cnkKLWNhbmNlbEJ1dHRvbl90ZXh0PUNhbmNlbAotCi0jIFZlcnNpb24gTWlzbWF0Y2ggRGlhbG9nCi12ZXJzaW9uTWlzbWF0Y2hEaWFsb2dfdGV4dD1JVVBMMzA1RTogVGhlIHNlbGVjdGVkIGxpYnJhcnkgY2Fubm90IGJlIG9wZW5lZC4gWW91IG11c3QgdXBncmFkZSB7MH0gdG8gdmVyc2lvbiB7MX0gb3IgaGlnaGVyIGluIG9yZGVyIHRvIG9wZW4gdGhpcyBsaWJyYXJ5LgotdmVyc2lvbk1pc21hdGNoRGlhbG9nX3RleHRfdW5rbm93bj1JVVBMMzA2RTogVGhlIHNlbGVjdGVkIGxpYnJhcnkgY2Fubm90IGJlIG9wZW5lZC4gWW91IG11c3QgdXBncmFkZSB7MH0gdG8gYSBoaWdoZXIgdmVyc2lvbiBpbiBvcmRlciB0byBvcGVuIHRoaXMgbGlicmFyeS4KLQotIyBVcGdyYWRlIE1ldGhvZCBMaWJyYXJ5IERpYWxvZwotdXBncmFkZUxpYnJhcnlEaWFsb2dfdGl0bGU9VXBncmFkZSBNZXRob2QgTGlicmFyeQotdXBncmFkZUxpYnJhcnlEaWFsb2dfdGV4dD1UaGUgbGlicmFyeSB5b3UgaGF2ZSBzZWxlY3RlZCBuZWVkcyB0byBiZSB1cGdyYWRlZCB0byB0aGUgbmV3IGxpYnJhcnkgc3RydWN0dXJlLlxuXG5EbyB5b3Ugd2FudCB0byBwcm9jZWVkIHdpdGggdGhlIHVwZ3JhZGU/Ci11cGdyYWRpbmdMaWJyYXJ5VGFza19uYW1lPVVwZ3JhZGluZyBtZXRob2QgbGlicmFyeS4uLgotCi0jIFVwZ3JhZGUgTGlicmFyeSBFcnJvciBEaWFsb2cKLXVwZ3JhZGVMaWJyYXJ5RXJyb3JfbXNnPUlVUEwwMzA2RTogRmFpbGVkIHRvIHVwZ3JhZGUgdGhlIG1ldGhvZCBsaWJyYXJ5LiBQbGVhc2Ugc2VlIHRoZSBsb2cgZmlsZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0jIFN3aXRjaCBDb25maWd1cmF0aW9uIERpYWxvZwotc3dpdGNoQ29uZmlnRGlhbG9nX3RpdGxlPVN3aXRjaCBDb25maWd1cmF0aW9uCi1zd2l0Y2hDb25maWdEaWFsb2dfdGV4dD1EbyB5b3Ugd2FudCB0byBzd2l0Y2ggdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbiB0byB0aGUgZGVmYXVsdCBjb25maWd1cmF0aW9uLCAnJ3swfScnLCBhc3NvY2lhdGVkIHdpdGggdGhlIHNlbGVjdGVkIHByb2Nlc3M/Ci0JCi0jIENvbmZpZ3VyYXRpb24gQ29tYm8KLWN1cnJlbnRDb25maWdMYWJlbF90ZXh0PUN1cnJlbnQgY29uZmlndXJhdGlvbjoKLXNlbGVjdENvbmZpZ0xhYmVsX3RleHQ9U2VsZWN0IGEgY29uZmlndXJhdGlvbgotCi0jIERlbGV0ZSBGaWxlcyBDb25maXJtYXRpb24gTWVzc2FnZQotZGVsZXRlRmlsZXNDb25maXJtYXRpb25fbXNnPVRoZSBzcGVjaWZpZWQgcGF0aCAnJ3swfScnIGFscmVhZHkgZXhpc3RzLiBBbGwgZmlsZXMgaW4gdGhlIGZvbGRlciB3aWxsIGJlIGRlbGV0ZWQuIERvIHlvdSB3YW50IHRvIHByb2NlZWQ/Ci0KLSMgUGF0aHMvRmlsZXMgRXJyb3IgTWVzc2FnZXMKLWRlbGV0ZUZpbGVzRXJyb3JfcmVhc29uPVRoZSBwYXRoICcnezB9JycgY29udGFpbnMgb25lIG9yIG1vcmUgZmlsZXMgdGhhdCBjYW5ub3QgYmUgZGVsZXRlZC5cblxuU2VsZWN0IGFub3RoZXIgcGF0aCBhbmQgdHJ5IGFnYWluLgotY3JlYXRlUGF0aEVycm9yX3JlYXNvbj1VbmFibGUgdG8gY3JlYXRlIHBhdGggJyd7MH0nJy5cblxuU2VsZWN0IGFub3RoZXIgcGF0aCBhbmQgdHJ5IGFnYWluLgotaW52YWxpZFBhdGhfbXNnPVRoZSBzcGVjaWZpZWQgcGF0aCBpcyBub3QgdmFsaWQuCi1vdmVycmlkZUN1cnJlbnRMaWJyYXJ5RXJyb3JfbXNnMD1Zb3UgY2Fubm90IGV4cG9ydCB0byBhIHBhdGggY29udGFpbmluZyBjdXJyZW50IG1ldGhvZCBsaWJyYXJ5LCBwbGVhc2Ugc2VsZWN0IGFub3RoZXIgcGF0aCBhbmQgdHJ5IGFnYWluLgotCi0jIEJhY2t1cCBMaWJyYXJ5IERpYWxvZwotYmFja3VwTGlicmFyeURpYWxvZ190aXRsZT1CYWNrdXAgTGlicmFyeQotYmFja3VwTGlicmFyeURpYWxvZ190ZXh0PUl0IGlzIHN0cm9uZ2x5IHJlY29tbWVuZGVkIHRoYXQgeW91IGJhY2sgdXAgdGhlIGN1cnJlbnQgbWV0aG9kIGxpYnJhcnkgYmVmb3JlIHByb2NlZWRpbmcuXG5cbkNsaWNrIE9LIHRvIGNyZWF0ZSBhIGJhY2t1cCBjb3B5IG9mIHRoZSBsaWJyYXJ5IGluIHRoZSBzcGVjaWZpZWQgZGlyZWN0b3J5LiBDbGljayBTa2lwIHRvIGNvbnRpbnVlIHdpdGhvdXQgY3JlYXRpbmcgdGhlIGJhY2t1cC4KLWJhY2tpbmdVcExpYnJhcnlUYXNrX25hbWU9QmFja2luZyB1cCBsaWJyYXJ5IGZpbGVzIC4uLgotCi0jIENvcHkgTGlicmFyeSBEaWFsb2cKLWNvcHlMaWJyYXJ5RGlhbG9nX3RpdGxlPUNvcHkgTGlicmFyeQotY29weUxpYnJhcnlEaWFsb2dfdGV4dF9yZWFkT25seUxpYj1UaGUgbGlicmFyeSBpcyBub3Qgd3JpdGFibGUuIENsaWNrIENvcHkgdG8gY3JlYXRlIGEgd3JpdGFibGUgY29weSBvZiB0aGUgbGlicmFyeSBpbiB0aGUgc3BlY2lmaWVkIGRpcmVjdG9yeS4gQ2xpY2sgU2tpcCB0byBjb250aW51ZSB3aXRob3V0IGNyZWF0aW5nIHRoZSBjb3B5LgotY29weUxpYnJhcnlUYXNrX25hbWU9TWFraW5nIGEgY29weSBvZiB0aGUgbGlicmFyeSBmaWxlcyAuLi4KLWNvcHlMaWJyYXJ5RGlhbG9nX2NvcHlCdXR0b25fdGV4dD1Db3B5Ci0KLSMgUGF0aCBTZWxlY3Rpb24gRGlhbG9nCi1wYXRoU2VsZWN0aW9uRXJyb3JfbXNnPVVuYWJsZSB0byBjcmVhdGUgZGlyZWN0b3J5Ci1va0J1dHRvbl90ZXh0PU9LCi1za2lwQnV0dG9uX3RleHQ9U2tpcAotCi0jIFByb2Nlc3MgRWRpdG9yIHByZWZlcmVuY2VzCi1hbHdheXNCdXR0b25fdGV4dD1BbHdheXMKLW5ldmVyQnV0dG9uX3RleHQ9TmV2ZXIKLXByb21wdEJ1dHRvbl90ZXh0PVByb21wdAotCi0jIEFkZCBMaW5rIERpYWxvZwotbGlua1RvVVJMX25hbWU9VVJMCi1saW5rVG9GaWxlX25hbWU9RmlsZQotZWxlbWVudExpbmtfbmFtZT1NZXRob2QgZWxlbWVudAotZWxlbWVudExpbmtXaXRoVHlwZV9uYW1lPU1ldGhvZCBlbGVtZW50IHdpdGggdHlwZSBwcmVmaXgKLWVsZW1lbnRMaW5rV2l0aFVzZXJUZXh0X25hbWU9TWV0aG9kIGVsZW1lbnQgd2l0aCBjdXN0b20gdGV4dAotCi0jIENvbnZlcnQgQWN0aXZpdHkgVHlwZSBEaWFsb2cKLWNvbnZlcnRBY3Rpdml0eURpYWxvZ190aXRsZT1Db252ZXJ0IEFjdGl2aXR5IFR5cGUKLWNvbnZlcnRBY3Rpdml0eURpYWxvZ190ZXh0PVNlbGVjdCB0aGUgdGFyZ2V0IGFjdGl2aXR5IHR5cGUuCi11bnN1cHBvcnRlZEFjdGl2aXR5VHlwZV9tc2c9SVVQTDAzMDdFOiBUaGlzIGFjdGl2aXR5IGNhbm5vdCBiZSBjb252ZXJ0ZWQgdG8gYW5vdGhlciB0eXBlLgotdW5zdXBwb3J0ZWRBY3Rpdml0eVR5cGVfcmVhc29uPVRoZXJlIGlzIG5vIGNvbXBhdGlibGUgYWN0aXZpdHkgdHlwZSBmb3IgezB9LgotCi0jIFNlbGVjdCBQcm9jZXNzIFdpemFyZCBQYWdlCi1zZWxlY3RQcm9jZXNzV2l6YXJkUGFnZV90aXRsZT1TZWxlY3QgcHJvY2Vzcwotc2VsZWN0UHJvY2Vzc1dpemFyZFBhZ2VfdGV4dD1TZWxlY3QgYSBjYXBhYmlsaXR5IHBhdHRlcm4gb3IgZGVsaXZlcnkgcHJvY2VzcyB0byBleHBvcnQuCi1wcm9jZXNzZXNMYWJlbF90ZXh0PVByb2Nlc3NlczoKLWJyaWVmRGVzY3JpcHRpb25MYWJlbF90ZXh0PUJyaWVmIGRlc2NyaXB0aW9uOgotCi0jIEV4cG9ydCBQcm9jZXNzIFdpemFyZCBFcnJvciBNZXNzYWdlLgotbm9PcGVuTGlicmFyeVdhcm5pbmdfbXNnPUlVUEwwMzA4RTogTm8gbWV0aG9kIGxpYnJhcnkgaXMgY3VycmVudGx5IG9wZW5lZC4gQ2xpY2sgQ2FuY2VsLCBvcGVuIGEgbWV0aG9kIGxpYnJhcnkgb3IgY3JlYXRlIGEgbmV3IG9uZSwgYW5kIHJ1biB0aGlzIHdpemFyZCBhZ2Fpbi4gCi0KLSMgTW92ZWQgZnJvbSBBdXRob3JpbmcgVUkgcGx1Zy1pbiB0byBhdm9pZCBBdXRob3JpbmcgVUkgZGVwZW5kZW5jeQotZXJyb3JEaWFsb2dfdGl0bGU9RXJyb3IKLU1ldGhvZEVsZW1lbnREZWxldGVBY3Rpb25fZGVsZXRlY29uZmlybV90ZXh0PUFyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBkZWxldGUgJyd7MH0nJz8KLWNvbmZpcm1EZWxldGVEaWFsb2dfdGl0bGU9Q29uZmlybSBEZWxldGlvbgotY29uZmlybURlbGV0ZURpYWxvZ19tc2c9QXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGRlbGV0ZSAnJ3swfScnPwotY29uZmlybURlbGV0ZURpYWxvZ19tc2dXaXRoUmVmZXJlbmNlPUFyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBkZWxldGUgJyd7MH0nJz9cblxuVGhlIGZvbGxvd2luZyBlbGVtZW50KHMpIGNvbnRhaW4gcmVmZXJlbmNlcyB0byB0aGUgaXRlbShzKSB0byBiZSBkZWxldGVkOiB7MX0KLVByb2Nlc3NEZWxldGVBY3Rpb25fZGVsZXRlY29maXJtX3RleHQ9VGhpcyB3aWxsIHNhdmUgdGhlIGN1cnJlbnQgZWRpdG9yIGFuZCB0aGUgY2hhbmdlIHdpbGwgYmUgcGVybWFuZW50LiBBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gZGVsZXRlICcnezB9Jyc/Ci0KLSMgU2F2ZSBNZXRob2QgTGlicmFyeSBEaWFsb2cKLXNhdmVMaWJyYXJ5RGlhbG9nX3RpdGxlPVNhdmUgTWV0aG9kIExpYnJhcnkKLXNhdmVMaWJyYXJ5RGlhbG9nX3RleHQ9VGhlIGN1cnJlbnQgbWV0aG9kIGxpYnJhcnkgaGFzIGJlZW4gbW9kaWZpZWQuIERvIHlvdSB3YW50IHRvIHNhdmUgdGhlIGNoYW5nZXM/Ci0KLSMgU2F2ZSBNZXRob2QgTGlicmFyeSBFcnJvciBNZXNzYWdlcwotc2F2ZUxpYnJhcnlFcnJvcl9tc2c9SVVQTDAzMDhFOiBUaGUgbWV0aG9kIGxpYnJhcnkgY2Fubm90IGJlIHNhdmVkLgotZXJyb3JfcmVhc29uPUFuIGVycm9yIGhhcyBvY2N1cnJlZC5cblxuQ2xpY2sgRGV0YWlscyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLQotIyBFbGVtZW50VHJlZUNvbnRlbnRQcm92aWRlciBTdHJpbmdzCi1lbGVtZW50VENQcm92aWRlcl9tZXRob2RDb250ZW50PU1ldGhvZCBDb250ZW50Ci1lbGVtZW50VENQcm92aWRlcl9jb250ZW50UGFja2FnZXM9Q29udGVudCBQYWNrYWdlcwotZWxlbWVudFRDUHJvdmlkZXJfc3RhbmRhcmRDYXRlZ29yaWVzPVN0YW5kYXJkIENhdGVnb3JpZXMKLWVsZW1lbnRUQ1Byb3ZpZGVyX2Rpc2NpcGxpbmVzPURpc2NpcGxpbmVzCi1lbGVtZW50VENQcm92aWRlcl9kb21haW5zPURvbWFpbnMKLWVsZW1lbnRUQ1Byb3ZpZGVyX3dvcmtQcm9kdWN0VHlwZXM9V29yayBQcm9kdWN0IFR5cGVzCi1lbGVtZW50VENQcm92aWRlcl9yb2xlU2V0cz1Sb2xlIFNldHMKLWVsZW1lbnRUQ1Byb3ZpZGVyX3Rvb2xzPVRvb2xzCi1lbGVtZW50VENQcm92aWRlcl9jdXN0b21DYXRlZ29yaWVzPUN1c3RvbSBDYXRlZ29yaWVzCi1lbGVtZW50VENQcm92aWRlcl9wcm9jZXNzZXM9UHJvY2Vzc2VzCi1lbGVtZW50VENQcm92aWRlcl9jYXBhYmlsaXR5UGF0dGVybnM9Q2FwYWJpbGl0eSBQYXR0ZXJucwotZWxlbWVudFRDUHJvdmlkZXJfZGVsaXZlcnlQcm9jZXNzZXM9RGVsaXZlcnkgUHJvY2Vzc2VzCi0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9hY3Rpb25zL0NvbmZpZ3VyYXRpb25Db250cmlidXRpb25JdGVtLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvYWN0aW9ucy9Db25maWd1cmF0aW9uQ29udHJpYnV0aW9uSXRlbS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NzFhZjQzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9hY3Rpb25zL0NvbmZpZ3VyYXRpb25Db250cmlidXRpb25JdGVtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNTkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuYWN0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuSUxpYnJhcnlTZXJ2aWNlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2VVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkNvbXBhcmF0b3JzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnByZWZzLlByZWZlcmVuY2VVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLkxpYnJhcnlVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5Db250cmlidXRpb25JdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ29tYm9WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRGlzcG9zZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRGlzcG9zZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db29sQmFyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvb2xJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRvb2xCYXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVG9vbEl0ZW07Ci0KLS8qKgotICogQ29udHJpYnV0ZXMgYSBtZXRob2QgY29uZmlndXJhdGlvbiBjb21ib3hib3ggdG8gdGhlIHN5c3RlbSB0b29sYmFyLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBhdXRob3IgQmluZ3h1ZSBYdQotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIENvbmZpZ3VyYXRpb25Db250cmlidXRpb25JdGVtIGV4dGVuZHMgQ29udHJpYnV0aW9uSXRlbSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBDb21ibyBjb25maWdDb21ibzsKLQotCXByaXZhdGUgc3RhdGljIENvbWJvVmlld2VyIGNvbmZpZ0NvbWJvVmlld2VyOwotCi0JcHJvdGVjdGVkIFRvb2xJdGVtIGl0ZW07Ci0KLQlwcm90ZWN0ZWQgQ29vbEl0ZW0gY29vbEl0ZW07Ci0KLQlwcm90ZWN0ZWQgSUxpYnJhcnlTZXJ2aWNlTGlzdGVuZXIgbGliU3ZjTGlzdGVuZXI7Ci0KLQkvLyBUaGUgY29udGVudCBwcm92aWRlci4KLQlwcm90ZWN0ZWQgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIgY29udGVudFByb3ZpZGVyOwotCi0JLy8gVGhlIGxhYmVsIHByb3ZpZGVyLgotCXByb3RlY3RlZCBJTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyOwotCQotCXByb3RlY3RlZCBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIHBvc3RTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgPSBuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCXBlcmZvcm1TZWxlY3Rpb25DaGFuZ2VkKCk7Ci0JCX0KLQl9OwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgQ29uZmlndXJhdGlvbkNvbnRyaWJ1dGlvbkl0ZW0oSUFjdGlvbiBhY3Rpb24pIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkNvbnRyaWJ1dGlvbkl0ZW0jZmlsbChvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Ub29sQmFyLAotCSAqICAgICAgaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGZpbGwoVG9vbEJhciBwYXJlbnQsIGludCBpbmRleCkgewotCQlpdGVtID0gbmV3IFRvb2xJdGVtKHBhcmVudCwgU1dULlNFUEFSQVRPUik7Ci0JCUNvbnRyb2wgYm94ID0gY3JlYXRlQ29udHJvbChwYXJlbnQpOwotCQlpdGVtLnNldENvbnRyb2woYm94KTsKLQkJaXRlbS5zZXRXaWR0aCgyNDApOwotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQ29udHJpYnV0aW9uSXRlbSNmaWxsKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvb2xCYXIsCi0JICogICAgICBpbnQpCi0JICovCi0JcHVibGljIHZvaWQgZmlsbChDb29sQmFyIGNvb2xCYXIsIGludCBpbmRleCkgewotCQlDb250cm9sIGJveCA9IGNyZWF0ZUNvbnRyb2woY29vbEJhcik7Ci0KLQkJaWYgKGluZGV4ID49IDApIHsKLQkJCWNvb2xJdGVtID0gbmV3IENvb2xJdGVtKGNvb2xCYXIsIFNXVC5EUk9QX0RPV04sIGluZGV4KTsKLQkJfSBlbHNlIHsKLQkJCWNvb2xJdGVtID0gbmV3IENvb2xJdGVtKGNvb2xCYXIsIFNXVC5EUk9QX0RPV04pOwotCQl9Ci0KLQkJLy8gU2V0IHRoZSBiYWNrIHJlZmVyZW5jZS4KLQkJY29vbEl0ZW0uc2V0RGF0YSh0aGlzKTsKLQotCQkvLyBBZGQgdGhlIHRvb2xiYXIgdG8gdGhlIENvb2xJdGVtIHdpZGdldC4KLQkJY29vbEl0ZW0uc2V0Q29udHJvbChib3gpOwotCi0JCS8vIElmIHRoZSB0b29sYmFyIGl0ZW0gZXhpc3RzIHRoZW4gYWRqdXN0IHRoZSBzaXplIG9mIHRoZSBjb29sIGl0ZW0uCi0JCVBvaW50IHRvb2xCYXJTaXplID0gYm94LmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCk7Ci0KLQkJLy8gU2V0IHRoZSBwcmVmZXJyZWQgc2l6ZSB0byB0aGUgc2l6ZSBvZiB0aGUgdG9vbGJhciBwbHVzIHRyaW0uCi0JCWNvb2xJdGVtLnNldE1pbmltdW1TaXplKHRvb2xCYXJTaXplKTsKLQkJY29vbEl0ZW0uc2V0UHJlZmVycmVkU2l6ZSh0b29sQmFyU2l6ZSk7Ci0JCWNvb2xJdGVtLnNldFNpemUodG9vbEJhclNpemUpOwotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQ29udHJpYnV0aW9uSXRlbSNmaWxsKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBmaWxsKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJY3JlYXRlQ29udHJvbChwYXJlbnQpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIGNvbnRyb2wuCi0JICovCi0JcHJpdmF0ZSBDb250cm9sIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCQljb25maWdDb21ibyA9IG5ldyBDb21ibyhwYXJlbnQsIFNXVC5EUk9QX0RPV04gfCBTV1QuUkVBRF9PTkxZKTsKLQkJY29uZmlnQ29tYm8uc2V0VmlzaWJsZUl0ZW1Db3VudCgxMCk7Ci0JCWNvbmZpZ0NvbWJvLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCWNvbmZpZ0NvbWJvVmlld2VyID0gbmV3IENvbWJvVmlld2VyKGNvbmZpZ0NvbWJvKTsKLQotCQljb250ZW50UHJvdmlkZXIgPSBuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoCi0JCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJCS5nZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSkgewotCQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBvYmplY3QpIHsKLQkJCQlMaXN0PE9iamVjdD4gY29uZmlnc0xpc3QgPSBuZXcgQXJyYXlMaXN0PE9iamVjdD4oKTsKLQkJCQljb25maWdzTGlzdC5hZGRBbGwoQXJyYXlzLmFzTGlzdChMaWJyYXJ5U2VydmljZVV0aWwKLQkJCQkJCS5nZXRNZXRob2RDb25maWd1cmF0aW9ucyhMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJCQkJCS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpKSkpOwotCQkJCUNvbGxlY3Rpb25zLnNvcnQoY29uZmlnc0xpc3QsIENvbXBhcmF0b3JzLkRFRkFVTFRfQ09NUEFSQVRPUik7Ci0JCQkJaWYgKExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLQkJCQkJCS5nZXRDdXJyZW50TWV0aG9kQ29uZmlndXJhdGlvbigpID09IG51bGwpIHsKLQkJCQkJY29uZmlnc0xpc3QuYWRkKDAsCi0JCQkJCQkJTGlicmFyeVVJUmVzb3VyY2VzLnNlbGVjdENvbmZpZ0xhYmVsX3RleHQpOwotCQkJCX0KLQkJCQlyZXR1cm4gY29uZmlnc0xpc3QudG9BcnJheSgpOwotCQkJfQotCQl9OwotCi0JCWxhYmVsUHJvdmlkZXIgPSBuZXcgQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyKAotCQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpIHsKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIFN0cmluZykgewotCQkJCQlyZXR1cm4gKFN0cmluZykgb2JqZWN0OwotCQkJCX0gZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgTWV0aG9kQ29uZmlndXJhdGlvbikgewotCQkJCQlyZXR1cm4gKChNZXRob2RDb25maWd1cmF0aW9uKSBvYmplY3QpLmdldE5hbWUoKTsKLQkJCQl9IGVsc2UKLQkJCQkJcmV0dXJuIG9iamVjdC50b1N0cmluZygpOwotCQkJfQotCQl9OwotCi0JCWNvbmZpZ0NvbWJvVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihjb250ZW50UHJvdmlkZXIpOwotCQljb25maWdDb21ib1ZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKGxhYmVsUHJvdmlkZXIpOwotCQljb25maWdDb21ib1ZpZXdlci5zZXRJbnB1dChMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCkpOwotCi0JCVN0cmluZyBzYXZlZENvbmZpZ05hbWUgPSBQcmVmZXJlbmNlVXRpbC5nZXRTYXZlZExhc3RDb25maWcoKTsKLQkJTWV0aG9kQ29uZmlndXJhdGlvbiBzYXZlZENvbmZpZyA9IExpYnJhcnlTZXJ2aWNlVXRpbAotCQkJCS5nZXRNZXRob2RDb25maWd1cmF0aW9uKExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLQkJCQkJCS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpLCBzYXZlZENvbmZpZ05hbWUpOwotCQkKLQkJaWYgKHNhdmVkQ29uZmlnICE9IG51bGwpIHsKLQkJCWNvbmZpZ0NvbWJvVmlld2VyCi0JCQkJCS5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oc2F2ZWRDb25maWcpKTsKLQkJfSBlbHNlIHsKLQkJCWNvbmZpZ0NvbWJvVmlld2VyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbigKLQkJCQkJTGlicmFyeVVJUmVzb3VyY2VzLnNlbGVjdENvbmZpZ0xhYmVsX3RleHQpKTsKLQkJfQotCi0JCWNvbmZpZ0NvbWJvVmlld2VyCi0JCQkuYWRkUG9zdFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihwb3N0U2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKTsKLQotCQljb25maWdDb21ib1ZpZXdlci5nZXRDb250cm9sKCkuYWRkRGlzcG9zZUxpc3RlbmVyKAotCQkJCW5ldyBEaXNwb3NlTGlzdGVuZXIoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHdpZGdldERpc3Bvc2VkKERpc3Bvc2VFdmVudCBldmVudCkgewotCQkJCQkJZGlzcG9zZSgpOwotCQkJCQl9Ci0JCQkJfSk7Ci0KLQotCQlsaWJTdmNMaXN0ZW5lciA9IG5ldyBJTGlicmFyeVNlcnZpY2VMaXN0ZW5lcigpIHsKLQotCQkJcHVibGljIHZvaWQgY29uZmlndXJhdGlvblNldChNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZykgewotCQkJCWNvbmZpZ0NvbWJvVmlld2VyLnJlbW92ZVBvc3RTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIocG9zdFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcik7Ci0JCQkJdHJ5IHsKLQkJCQkJc2VsZWN0Q29uZmlndXJhdGlvbihjb25maWcpOwotCQkJCX0KLQkJCQlmaW5hbGx5IHsKLQkJCQkJY29uZmlnQ29tYm9WaWV3ZXIKLQkJCQkJLmFkZFBvc3RTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIocG9zdFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcik7Ci0JCQkJfQotCQkJCQotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBsaWJyYXJ5Q2xvc2VkKE1ldGhvZExpYnJhcnkgbGlicmFyeSkgewotCQkJCWNvbmZpZ0NvbWJvVmlld2VyLnNldElucHV0KG51bGwpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBsaWJyYXJ5Q3JlYXRlZChNZXRob2RMaWJyYXJ5IGxpYnJhcnkpIHsKLQkJCQljb25maWdDb21ib1ZpZXdlci5zZXRJbnB1dChsaWJyYXJ5KTsKLQkJCQlzZWxlY3RDb25maWd1cmF0aW9uKG51bGwpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBsaWJyYXJ5T3BlbmVkKE1ldGhvZExpYnJhcnkgbGlicmFyeSkgewotCQkJCWNvbmZpZ0NvbWJvVmlld2VyLnNldElucHV0KGxpYnJhcnkpOwotCQkJCXJlZnJlc2goKTsKLQkJCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudE1ldGhvZENvbmZpZ3VyYXRpb24oKTsJCQkJCQotCQkJCWNvbmZpZ0NvbWJvVmlld2VyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbigKLQkJCQkJCWNvbmZpZyAhPSBudWxsID8gY29uZmlnIDogTGlicmFyeVVJUmVzb3VyY2VzLnNlbGVjdENvbmZpZ0xhYmVsX3RleHQpLCB0cnVlKTsKLQotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBsaWJyYXJ5UmVvcGVuZWQoTWV0aG9kTGlicmFyeSBsaWJyYXJ5KSB7Ci0JCQkJaWYgKGxpYnJhcnkgIT0gY29uZmlnQ29tYm9WaWV3ZXIuZ2V0SW5wdXQoKSkgewotCQkJCQljb25maWdDb21ib1ZpZXdlci5zZXRJbnB1dChsaWJyYXJ5KTsKLQkJCQkJcmVmcmVzaCgpOwotCQkJCX0KLQkJCX0KLQotCQkJcHVibGljIHZvaWQgbGlicmFyeVNldChNZXRob2RMaWJyYXJ5IGxpYnJhcnkpIHsKLQkJCQlpZiAobGlicmFyeSAhPSBjb25maWdDb21ib1ZpZXdlci5nZXRJbnB1dCgpKSB7Ci0JCQkJCWNvbmZpZ0NvbWJvVmlld2VyLnNldElucHV0KGxpYnJhcnkpOwotCQkJCQlpZiAobGlicmFyeSA9PSBudWxsKSB7Ci0JCQkJCQlzZWxlY3RDb25maWd1cmF0aW9uKG51bGwpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJcmVmcmVzaCgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCX07Ci0JCUxpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuYWRkTGlzdGVuZXIobGliU3ZjTGlzdGVuZXIpOwotCi0JCXJldHVybiBjb25maWdDb21ibzsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkNvbnRyaWJ1dGlvbkl0ZW0jdm9pZCBzZXRWaXNpYmlsZShib29sZWFuKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZpc2libGUoYm9vbGVhbiB2aXNpYmxlKSB7Ci0JCWlmICh2aXNpYmxlKSB7Ci0JCQlMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmFkZExpc3RlbmVyKGxpYlN2Y0xpc3RlbmVyKTsKLQkJfSBlbHNlIHsKLQkJCUxpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkucmVtb3ZlTGlzdGVuZXIobGliU3ZjTGlzdGVuZXIpOwotCQl9Ci0JCXN1cGVyLnNldFZpc2libGUodmlzaWJsZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY3VycmVudGx5IHNlbGVjdGVkIG1ldGhvZCBjb25maWd1cmF0aW9uCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgTWV0aG9kQ29uZmlndXJhdGlvbiBnZXRTZWxlY3RlZENvbmZpZygpIHsKLQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBjb25maWdDb21ib1ZpZXdlcgotCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQkJT2JqZWN0IG9iamVjdCA9IHNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIE1ldGhvZENvbmZpZ3VyYXRpb24pIHsKLQkJCXJldHVybiAoTWV0aG9kQ29uZmlndXJhdGlvbikgb2JqZWN0OwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBjdXJyZW50bHkgc2VsZWN0ZWQgbWV0aG9kIGNvbmZpZ3VyYXRpb24gbmFtZQotCSAqLwotCXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRDdXJyZW50U2VsZWN0ZWRDb25maWdOYW1lKCkgewotCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGNvbmZpZ0NvbWJvVmlld2VyCi0JCQkJLmdldFNlbGVjdGlvbigpOwotCQlPYmplY3Qgb2JqZWN0ID0gc2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOwotCQlpZiAob2JqZWN0ICE9IG51bGwgJiYgb2JqZWN0IGluc3RhbmNlb2YgTWV0aG9kQ29uZmlndXJhdGlvbikgewotCQkJcmV0dXJuICgoTWV0aG9kQ29uZmlndXJhdGlvbikgb2JqZWN0KS5nZXROYW1lKCk7Ci0JCX0KLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIFN0cmluZykKLQkJCXJldHVybiAoU3RyaW5nKSBvYmplY3Q7Ci0JCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgcGVyZm9ybVNlbGVjdGlvbkNoYW5nZWQoKSB7Ci0JCWlmIChMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCkgIT0gbnVsbCkgewotCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSBnZXRTZWxlY3RlZENvbmZpZygpOwotCQkJaWYgKGNvbmZpZyAhPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJCS5nZXRDdXJyZW50TWV0aG9kQ29uZmlndXJhdGlvbigpKSB7Ci0JCQkJTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5zZXRDdXJyZW50TWV0aG9kQ29uZmlndXJhdGlvbihjb25maWcpOwotCQkJfQotCQkJUHJlZmVyZW5jZVV0aWwuc2F2ZVNlbGVjdGVkQ29uZmlnSW50b1BlcnNpc3RlbmNlKGdldEN1cnJlbnRTZWxlY3RlZENvbmZpZ05hbWUoKSk7Ci0JCQlyZWZyZXNoKCk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkNvbnRyaWJ1dGlvbkl0ZW0jZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJaWYgKGxpYlN2Y0xpc3RlbmVyICE9IG51bGwpIHsKLQkJCUxpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkucmVtb3ZlTGlzdGVuZXIobGliU3ZjTGlzdGVuZXIpOwotCQl9Ci0JCQotCQlpZiAoY29uZmlnQ29tYm9WaWV3ZXIgIT0gbnVsbCkgewotCQkJY29uZmlnQ29tYm9WaWV3ZXIKLQkJCS5yZW1vdmVQb3N0U2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKHBvc3RTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIpOwotCQl9Ci0JCQotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotCi0JLyoqCi0JICogUmVmcmVzaGVzIHRoZSBjb25maWd1cmF0aW9uIGNvbWJvLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZWZyZXNoKCkgewotCQljb25maWdDb21ib1ZpZXdlci5yZWZyZXNoKCk7Ci0JfQotCi0JLyoqCi0JICogU2VsZWN0IGEgY29uZmlndXJhdGlvbiBpbiBjb25maWd1cmF0aW9uIGNvbWJvIGJveC4KLQkgKiAKLQkgKiBAcGFyYW0gY29uZmlnCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBzZWxlY3RDb25maWd1cmF0aW9uKE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0JCS8vTmFtZUNhY2hlLmdldEluc3RhbmNlKCkuY2xlYXIoKTsKLQkJaWYgKGNvbmZpZyAhPSBudWxsICYmIGNvbmZpZyA9PSBnZXRTZWxlY3RlZENvbmZpZygpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKGNvbmZpZyAhPSBudWxsKSB7Ci0JCQljb25maWdDb21ib1ZpZXdlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oY29uZmlnKSk7Ci0JCX0gZWxzZSB7Ci0JCQkvLyBQZXJmb3JtIGEgcmVmcmVzaCB0byBhZGQgdGhlICJTZWxlY3QgYSBjb25maWd1cmF0aW9uIgotCQkJLy8gc3RyaW5nIHRvIHRoZSBjb21iby4KLQkJCXJlZnJlc2goKTsKLQkJCWNvbmZpZ0NvbWJvVmlld2VyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbigKLQkJCQkJTGlicmFyeVVJUmVzb3VyY2VzLnNlbGVjdENvbmZpZ0xhYmVsX3RleHQpLCB0cnVlKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHNldEVuYWJsZWQoYm9vbGVhbiBlbmFibGVkKSB7Ci0JCWNvbmZpZ0NvbWJvLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9hY3Rpb25zL0lMaWJyYXJ5QWN0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvYWN0aW9ucy9JTGlicmFyeUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZDAzN2FkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9hY3Rpb25zL0lMaWJyYXJ5QWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci0KLS8qKgotICogVGhlIGludGVyZmFjZSBmb3IgYSBMaWJyYXJ5IGFjdGlvbi4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJTGlicmFyeUFjdGlvbiBleHRlbmRzIElBY3Rpb24gewotLy8Jdm9pZCBub3RpZnlQcm9wZXJ0eUNoYW5nZShTdHJpbmcgcHJvcGVydHlOYW1lLCBPYmplY3Qgb2xkVmFsdWUsCi0vLwkJCU9iamVjdCBuZXdWYWx1ZSk7Ci0JCi0Jdm9pZCBzZXRQcm9ncmVzc01vbml0b3IoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKTsKLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL2FjdGlvbnMvTGlicmFyeUxvY2tpbmdPcGVyYXRpb25SdW5uZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9hY3Rpb25zL0xpYnJhcnlMb2NraW5nT3BlcmF0aW9uUnVubmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxNWY4ZDMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL2FjdGlvbnMvTGlicmFyeUxvY2tpbmdPcGVyYXRpb25SdW5uZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzOSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJ1bm5hYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuTGlicmFyeVVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLkxpYnJhcnlVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UudXRpbC5MaWJyYXJ5U2NoZWR1bGluZ1J1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLklSdW5uYWJsZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLklSdW5uYWJsZVdpdGhQcm9ncmVzczsKLQotLyoqCi0gKiBSdW5zIG9wZXJhdGlvbiB0aGF0IGxvY2tzIHRoZSBsaWJyYXJ5IGZvciB0aGUgZHVyYXRpb24gb2YgaXRzIGV4ZWN1dGlvbgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlICAxLjAKLSAqLwotcHVibGljIGNsYXNzIExpYnJhcnlMb2NraW5nT3BlcmF0aW9uUnVubmVyIGltcGxlbWVudHMgSVJ1bm5hYmxlQ29udGV4dCB7Ci0KLQlwcml2YXRlIElQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yOwotCQotCXB1YmxpYyBMaWJyYXJ5TG9ja2luZ09wZXJhdGlvblJ1bm5lcigpIHsKLQl9CQotCQotCXByaXZhdGUgdm9pZCBkb1J1bihmaW5hbCBJUnVubmFibGVXaXRoUHJvZ3Jlc3MgcnVubmFibGUsIGZpbmFsIGJvb2xlYW4gd29ya1Vua25vd24pIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLAotCQkJSW50ZXJydXB0ZWRFeGNlcHRpb24gewotICAgICAgICBmaW5hbCBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uW10gaXRlSG9sZGVyID0gbmV3IEludm9jYXRpb25UYXJnZXRFeGNlcHRpb25bMV07Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBJV29ya3NwYWNlUnVubmFibGUgd29ya3NwYWNlUnVubmFibGUgPSBuZXcgSVdvcmtzcGFjZVJ1bm5hYmxlKCkgewotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIHBtKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZih3b3JrVW5rbm93bikgewotICAgICAgICAJCQkJCXBtLmJlZ2luVGFzaygiIiwgMik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgCQkJCQlwbS53b3JrZWQoMSk7Ci0gICAgICAgIAkJCQkJdHJ5IHsKLSAgICAgICAgCQkJCQkJcnVubmFibGUucnVuKHBtKTsKLSAgICAgICAgCQkJCQkJcG0ud29ya2VkKDIpOwotICAgICAgICAJCQkJCX0KLSAgICAgICAgCQkJCQlmaW5hbGx5IHsKLSAgICAgICAgCQkJCQkJcG0uZG9uZSgpOwotICAgICAgICAJCQkJCX0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgCXJ1bm5hYmxlLnJ1bihwbSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gUGFzcyBpdCBvdXRzaWRlIHRoZSB3b3Jrc3BhY2UgcnVubmFibGUKLSAgICAgICAgICAgICAgICAgICAgICAgIGl0ZUhvbGRlclswXSA9IGU7Ci0gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJlLXRocm93IGFzIE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uLCB3aGljaCB3aWxsIGJlCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBjYXVnaHQgYW5kIHJlLXRocm93biBhcyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBiZWxvdy4KLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgLy8gQ29yZUV4Y2VwdGlvbiBhbmQgT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24gYXJlIHByb3BhZ2F0ZWQKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9OwotICAgICAgICAgICAgUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLnJ1bih3b3Jrc3BhY2VSdW5uYWJsZSwKLSAgICAgICAgICAgIAkJbmV3IExpYnJhcnlTY2hlZHVsaW5nUnVsZShMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCkpLAotICAgICAgICAgICAgCQlJV29ya3NwYWNlLkFWT0lEX1VQREFURSwgZ2V0UHJvZ3Jlc3NNb25pdG9yKCkpOwotICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uKGUpOwotICAgICAgICB9IGNhdGNoIChPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSW50ZXJydXB0ZWRFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICB9Ci0gICAgICAgIC8vIFJlLXRocm93IHRoZSBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLCBpZiBhbnkgb2NjdXJyZWQKLSAgICAgICAgaWYgKGl0ZUhvbGRlclswXSAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBpdGVIb2xkZXJbMF07Ci0gICAgICAgIH0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uSVJ1bm5hYmxlQ29udGV4dCNydW4oYm9vbGVhbiwgYm9vbGVhbiwgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLklSdW5uYWJsZVdpdGhQcm9ncmVzcykKLQkgKi8KLQlwdWJsaWMgdm9pZCBydW4oYm9vbGVhbiBmb3JrLCBib29sZWFuIGNhbmNlbGFibGUsCi0JCQlmaW5hbCBJUnVubmFibGVXaXRoUHJvZ3Jlc3MgcnVubmFibGUpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLAotCQkJSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQlkb1J1bihydW5uYWJsZSwgZmFsc2UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJ1bihJUnVubmFibGVXaXRoUHJvZ3Jlc3MgcnVubmFibGUpIHsKLQkJdHJ5IHsKLQkJCWRvUnVuKHJ1bm5hYmxlLCB0cnVlKTsKLQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0JCQlUaHJvd2FibGUgY2F1c2UgPSBlLmdldENhdXNlKCk7Ci0JCQlpZihjYXVzZSBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsKLQkJCQl0aHJvdyAoUnVudGltZUV4Y2VwdGlvbiljYXVzZTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWlmKGNhdXNlID09IG51bGwpIHsKLQkJCQkJY2F1c2UgPSBlOwotCQkJCX0KLQkJCQlMaWJyYXJ5VUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGNhdXNlKTsKLQkJCQl0cnkgewotCQkJCQlTdHJpbmcgbXNnID0gY2F1c2UuZ2V0TWVzc2FnZSgpICE9IG51bGwgPyBjYXVzZS5nZXRNZXNzYWdlKCkgOiBjYXVzZS50b1N0cmluZygpOyAKLQkJCQkJTGlicmFyeVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKS5kaXNwbGF5RXJyb3IoTGlicmFyeVVJUmVzb3VyY2VzLmVycm9yRGlhbG9nX3RpdGxlLCBtc2csIGNhdXNlKTsKLQkJCQl9Ci0JCQkJY2F0Y2goRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCQotCQkJCX0JCQkJCi0JCQl9Ci0JCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybjsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIElQcm9ncmVzc01vbml0b3IgZ2V0UHJvZ3Jlc3NNb25pdG9yKCkgewotCQlpZihwcm9ncmVzc01vbml0b3IgPT0gbnVsbCkgewotCQkJcHJvZ3Jlc3NNb25pdG9yID0gbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKTsKLQkJfQotCQlyZXR1cm4gcHJvZ3Jlc3NNb25pdG9yOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBwcm9ncmVzc01vbml0b3IgdGhlIHByb2dyZXNzTW9uaXRvciB0byBzZXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQcm9ncmVzc01vbml0b3IoSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzc01vbml0b3IpIHsKLQkJdGhpcy5wcm9ncmVzc01vbml0b3IgPSBwcm9ncmVzc01vbml0b3I7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL2FjdGlvbnMvTWV0aG9kRWxlbWVudERlbGV0ZUFjdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL2FjdGlvbnMvTWV0aG9kRWxlbWVudERlbGV0ZUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZTg3ZjJiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9hY3Rpb25zL01ldGhvZEVsZW1lbnREZWxldGVBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxMCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuRXZlbnRPYmplY3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uRGVsZXRlQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5EZWxldGVNZXRob2RFbGVtZW50Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS5JTGlicmFyeVJlc291cmNlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLkxpYnJhcnlVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5MaWJyYXJ5VUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVXaXRoUHJvZ3Jlc3M7Ci0KLQotLyoqCi0gKiBBY3Rpb24gdG8gZGVsZXRlIG1ldGhvZCBlbGVtZW50Ci0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXRob2RFbGVtZW50RGVsZXRlQWN0aW9uIGV4dGVuZHMgRGVsZXRlQWN0aW9uIGltcGxlbWVudHMgSUxpYnJhcnlBY3Rpb24gewotCXByb3RlY3RlZCBDb2xsZWN0aW9uPD8+IHNlbGVjdGlvbiA9IG51bGw7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBjb25maXJtID0gdHJ1ZTsKLQotCXByaXZhdGUgSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzc01vbml0b3I7Ci0KLQkvKioKLQkgKiBEZWxldGVzIG1ldGhvZCBlbGVtZW50Ci0JICoKLQkgKi8KLQlwdWJsaWMgTWV0aG9kRWxlbWVudERlbGV0ZUFjdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqIAotCSAqIEBwYXJhbSBkb21haW4KLQkgKi8KLQlwdWJsaWMgTWV0aG9kRWxlbWVudERlbGV0ZUFjdGlvbihFZGl0aW5nRG9tYWluIGRvbWFpbikgewotCQlzdXBlcihkb21haW4pOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICogCi0JICogQHBhcmFtIGRvbWFpbgotCSAqIEBwYXJhbSBjb25maXJtCi0JICogICAgICAgICAgICBmbGFnIGluZGljYXRlcyB3aGV0aGVyIHVzZXIgY29uZmlybWF0aW9uIGlzIHJlcXVpcmVkLiBJZgotCSAqICAgICAgICAgICAgPGNvZGU+ZmFsc2U8L2NvZGU+LCBleGVjdXRpbmcgdGhpcyBjb21tYW5kIHdpbGwgbm90Ci0JICogICAgICAgICAgICBpbnRlcmFjdCB3aXRoIHVzZXIgYW5kIHRoZSBkZWZhdWx0IGJlaGF2aW9yIHdpbGwgYXBwbHkuCi0JICovCi0JcHVibGljIE1ldGhvZEVsZW1lbnREZWxldGVBY3Rpb24oRWRpdGluZ0RvbWFpbiBkb21haW4sIGJvb2xlYW4gY29uZmlybSkgewotCQl0aGlzKGRvbWFpbik7Ci0JCXRoaXMuY29uZmlybSA9IGNvbmZpcm07Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uRGVsZXRlQWN0aW9uI2NyZWF0ZUNvbW1hbmQoamF2YS51dGlsLkNvbGxlY3Rpb24pCi0JICovCi0JcHVibGljIENvbW1hbmQgY3JlYXRlQ29tbWFuZChDb2xsZWN0aW9uPD8+IHNlbGVjdGlvbikgewotCQl0aGlzLnNlbGVjdGlvbiA9IHNlbGVjdGlvbjsKLQotCQlEZWxldGVNZXRob2RFbGVtZW50Q29tbWFuZCBjbWQgPSBjcmVhdGVNZXRob2RFbGVtZW50RGVsZXRlQ29tbWFuZCgpOwotCQljbWQKLQkJCQkuYWRkQ29tbWFuZExpc3RlbmVyKG5ldyBEZWxldGVNZXRob2RFbGVtZW50Q29tbWFuZC5Db21tYW5kTGlzdGVuZXIoKSB7Ci0KLQkJCQkJcHVibGljIHZvaWQgbm90aWZ5RXhlY3V0ZWQoRXZlbnRPYmplY3QgZXZlbnRPYmplY3QpIHsKLQkJCQkJCURlbGV0ZU1ldGhvZEVsZW1lbnRDb21tYW5kIGNtZCA9IChEZWxldGVNZXRob2RFbGVtZW50Q29tbWFuZCkgZXZlbnRPYmplY3QKLQkJCQkJCQkJLmdldFNvdXJjZSgpOwotCQkJCQkJZGlkRGVsZXRlKGNtZC5nZXRSZXN1bHQoKSk7Ci0JCQkJCX0KLQotCQkJCQlwdWJsaWMgdm9pZCBub3RpZnlGYWlsdXJlKEV2ZW50T2JqZWN0IGV2ZW50T2JqZWN0KSB7Ci0JCQkJCQlkZWxldGVGYWlsZWQoKTsKLQkJCQkJfQotCi0JCQkJfSk7Ci0JCXJldHVybiBjbWQ7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZGVsZXRlRmFpbGVkKCkgewotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhIGNvbW1hbmQgdG8gZGVsZXRlIG1ldGhvZCBlbGVtZW50Ci0JICogQHJldHVybiBjb21tYW5kCi0JICovCi0JcHVibGljIERlbGV0ZU1ldGhvZEVsZW1lbnRDb21tYW5kIGNyZWF0ZU1ldGhvZEVsZW1lbnREZWxldGVDb21tYW5kKCkgewotCQlyZXR1cm4gbmV3IERlbGV0ZU1ldGhvZEVsZW1lbnRDb21tYW5kKHN1cGVyLmNyZWF0ZUNvbW1hbmQoc2VsZWN0aW9uKSwKLQkJCQlzZWxlY3Rpb24sIGNvbmZpcm0pIHsKLQkJCXByb3RlY3RlZCB2b2lkIGxvYWRPcHBvc2l0ZUZlYXR1cmVzKExpc3Qgb3Bwb3NpdGVGZWF0dXJlcywKLQkJCQkJU2V0IGRlbGV0ZWRHVUlEcykgewotCQkJCUlMaWJyYXJ5UmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQgPSAoSUxpYnJhcnlSZXNvdXJjZVNldCkgTGlicmFyeVNlcnZpY2UKLQkJCQkJCS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCkuZVJlc291cmNlKCkKLQkJCQkJCS5nZXRSZXNvdXJjZVNldCgpOwotCQkJCXJlc291cmNlU2V0Ci0JCQkJCQkubG9hZE9wcG9zaXRlRmVhdHVyZXMob3Bwb3NpdGVGZWF0dXJlcywgZGVsZXRlZEdVSURzKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBkaWREZWxldGUoQ29sbGVjdGlvbjw/PiBkZWxldGVkRWxlbWVudHMpIHsKLQotCX0KLQotCS8qKgotCSAqIEdldCBjb25maXJtYXRpb24gbWVzc2FnZSB0byBkZWxldGUKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREZWxldGVDb25maXJtYXRpb25NZXNzYWdlKCkgewotCQlyZXR1cm4gTGlicmFyeVVJUmVzb3VyY2VzLk1ldGhvZEVsZW1lbnREZWxldGVBY3Rpb25fZGVsZXRlY29uZmlybV90ZXh0OyAKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBjb25maXJtRGVsZXRlKCkgewotCQlpZiAoIWNvbmZpcm0pIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0KLQkJaWYgKHNlbGVjdGlvbiA9PSBudWxsIHx8IHNlbGVjdGlvbi5pc0VtcHR5KCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJaW50IGkgPSAwOwotCQlTdHJpbmdCdWZmZXIgZWxlbWVudFN0ciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQotCQlmb3IgKEl0ZXJhdG9yPD8+IGl0ID0gc2VsZWN0aW9uLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBvYmogPSBUbmdVdGlsLnVud3JhcChpdC5uZXh0KCkpOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCQlpZiAoaSA+IDApIHsKLQkJCQkJZWxlbWVudFN0ci5hcHBlbmQoIiwgIik7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQkJZWxlbWVudFN0ci5hcHBlbmQoZ2V0RGlzcGxheVN0cmluZygoTWV0aG9kRWxlbWVudClvYmopKTsKLQotCQkJCWkrKzsKLQkJCX0KLQkJfQotCi0JCU9iamVjdFtdIGFyZ3MgPSB7IGVsZW1lbnRTdHIudG9TdHJpbmcoKSB9OwotCQlTdHJpbmcgbXNnID0gTGlicmFyeVVJUmVzb3VyY2VzLmJpbmQoTGlicmFyeVVJUmVzb3VyY2VzLmNvbmZpcm1EZWxldGVEaWFsb2dfbXNnLCBhcmdzKTsgLy8gTk9OLU5MUy0xJAotCi0JCVN0cmluZyB0aXRsZSA9IExpYnJhcnlVSVJlc291cmNlcy5jb25maXJtRGVsZXRlRGlhbG9nX3RpdGxlOyAKLQkJYm9vbGVhbiBkZWxldGVPayA9IExpYnJhcnlVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkKLQkJCQkuZGlzcGxheUNvbmZpcm1hdGlvbih0aXRsZSwgbXNnKTsKLQkJcmV0dXJuIGRlbGV0ZU9rOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGlzcGxheVN0cmluZyhNZXRob2RFbGVtZW50IGVsZW1lbnQpewotCQlyZXR1cm4gZWxlbWVudC5nZXROYW1lKCk7Ci0JfQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zLklMaWJyYXJ5QWN0aW9uI3NldFByb2dyZXNzTW9uaXRvcihvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQcm9ncmVzc01vbml0b3IoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCXByb2dyZXNzTW9uaXRvciA9IG1vbml0b3I7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiB0aGUgcHJvZ3Jlc3NNb25pdG9yCi0JICovCi0JcHJvdGVjdGVkIElQcm9ncmVzc01vbml0b3IgZ2V0UHJvZ3Jlc3NNb25pdG9yKCkgewotCQlpZihwcm9ncmVzc01vbml0b3IgPT0gbnVsbCkgewotCQkJcHJvZ3Jlc3NNb25pdG9yID0gbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKTsKLQkJfQotCQlyZXR1cm4gcHJvZ3Jlc3NNb25pdG9yOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5Db21tYW5kQWN0aW9uSGFuZGxlciNydW4oKQotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJTGlicmFyeUxvY2tpbmdPcGVyYXRpb25SdW5uZXIgcnVubmVyID0gbmV3IExpYnJhcnlMb2NraW5nT3BlcmF0aW9uUnVubmVyKCk7Ci0JCXJ1bm5lci5zZXRQcm9ncmVzc01vbml0b3IoZ2V0UHJvZ3Jlc3NNb25pdG9yKCkpOwotCQlydW5uZXIucnVuKG5ldyBJUnVubmFibGVXaXRoUHJvZ3Jlc3MoKSB7Ci0KLQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCQkJcGVyZm9ybURlbGV0ZSgpOwotCQkJfQotCQkJCi0JCX0pOwotCX0KLQkKLQkvKioKLQkgKiBQZXJmb3JtcyBkZWxldGUKLQkgKgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EZWxldGUoKSB7Ci0JCXN1cGVyLnJ1bigpOwkJCi0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9hY3Rpb25zL09wZW5MaWJyYXJ5QWN0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvYWN0aW9ucy9PcGVuTGlicmFyeUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZjE3NTU1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9hY3Rpb25zL09wZW5MaWJyYXJ5QWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuTGlicmFyeVVJVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS53aXphcmRzLk9wZW5MaWJyYXJ5V2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvd0FjdGlvbkRlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci0KLS8qKgotICogSW1wbGVtZW50cyB0aGUgT3BlbiBMaWJyYXJ5IGFjdGlvbi4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBPcGVuTGlicmFyeUFjdGlvbiBpbXBsZW1lbnRzIElXb3JrYmVuY2hXaW5kb3dBY3Rpb25EZWxlZ2F0ZSB7Ci0KLQlwcml2YXRlIElXb3JrYmVuY2hXaW5kb3cgd2luZG93OwotCi0JLyoqCi0JICogQHNlZSBJV29ya2JlbmNoV2luZG93QWN0aW9uRGVsZWdhdGUjaW5pdAotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cpIHsKLQkJdGhpcy53aW5kb3cgPSB3aW5kb3c7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJV29ya2JlbmNoV2luZG93QWN0aW9uRGVsZWdhdGUjc2VsZWN0aW9uQ2hhbmdlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoSUFjdGlvbiBhY3Rpb24sIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJV29ya2JlbmNoV2luZG93QWN0aW9uRGVsZWdhdGUjcnVuCi0JICovCi0JcHVibGljIHZvaWQgcnVuKElBY3Rpb24gYWN0aW9uKSB7Ci0JCWludCBkaXJ0eUNvdW50ID0gMDsKLQkJSUVkaXRvclJlZmVyZW5jZVtdIGxpc3QgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpCi0JCQkJLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKQotCQkJCS5nZXRFZGl0b3JSZWZlcmVuY2VzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7IGkrKykgewotCQkJaWYgKGxpc3RbaV0uaXNEaXJ0eSgpKSB7Ci0JCQkJZGlydHlDb3VudCsrOwotCQkJfQotCQl9Ci0KLQkJaWYgKGRpcnR5Q291bnQgPT0gMSkgewotCQkJYm9vbGVhbiByYyA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkKLQkJCQkJLmdldEFjdGl2ZVBhZ2UoKS5jbG9zZUFsbEVkaXRvcnModHJ1ZSk7Ci0JCQlpZiAoIXJjKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9IGVsc2UgaWYgKGRpcnR5Q291bnQgPiAxKSB7Ci0JCQlzd2l0Y2ggKExpYnJhcnlVSVV0aWwuZGlzcGxheVNhdmVEaXJ0eUVkaXRvcnNEaWFsb2coKSkgewotCQkJY2FzZSBTV1QuWUVTOgotCQkJCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkKLQkJCQkJCS5nZXRBY3RpdmVQYWdlKCkuY2xvc2VBbGxFZGl0b3JzKHRydWUpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBTV1QuTk86Ci0JCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKQotCQkJCQkJLmdldEFjdGl2ZVBhZ2UoKS5jbG9zZUFsbEVkaXRvcnMoZmFsc2UpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBTV1QuQ0FOQ0VMOgotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCi0JCU9wZW5MaWJyYXJ5V2l6YXJkIHdpemFyZCA9IG5ldyBPcGVuTGlicmFyeVdpemFyZCgpOwotCQl3aXphcmQuaW5pdCh3aW5kb3cuZ2V0V29ya2JlbmNoKCksIG51bGwpOwotCQlTaGVsbCBzaGVsbCA9IERpc3BsYXkuZ2V0Q3VycmVudCgpLmdldEFjdGl2ZVNoZWxsKCk7Ci0JCVdpemFyZERpYWxvZyBkaWFsb2cgPSBuZXcgV2l6YXJkRGlhbG9nKHNoZWxsLCB3aXphcmQpOwotCQlkaWFsb2cuY3JlYXRlKCk7Ci0JCWRpYWxvZy5vcGVuKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJV29ya2JlbmNoV2luZG93QWN0aW9uRGVsZWdhdGUjZGlzcG9zZQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL2FjdGlvbnMvUHJvY2Vzc0RlbGV0ZUFjdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL2FjdGlvbnMvUHJvY2Vzc0RlbGV0ZUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MTcxODExLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9hY3Rpb25zL1Byb2Nlc3NEZWxldGVBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzMCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkJhc2ljQ29tbWFuZFN0YWNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuUmVtb3ZlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLkRlbGV0ZU1ldGhvZEVsZW1lbnRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JQWN0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSVJlc291cmNlQXdhcmVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZC5EZWxldGVSb2xlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZC5EZWxldGVUYXNrRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZC5EZWxldGVUZWFtUHJvZmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZC5EZWxldGVVbnVzZWREZXNjcmlwdG9yc0NvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQuRGVsZXRlV29ya1Byb2R1Y3REZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kLlByb2Nlc3NFbGVtZW50RGVsZXRlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZC5SZW1vdmVVbnVzZWREZXNjcmlwdG9yc0NvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuTGlicmFyeVVJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZWFtUHJvZmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQXNzb2NpYXRpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci0KLS8qKgotICogSW1wbGVtZW50cyB0aGUgZGVsZXRlIGFjdGlvbiBmb3IgdGhlIHByb2Nlc3MgZWxlbWVudHMuCi0gKiAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUHJvY2Vzc0RlbGV0ZUFjdGlvbiBleHRlbmRzIE1ldGhvZEVsZW1lbnREZWxldGVBY3Rpb24gewotCi0JcHJpdmF0ZSBib29sZWFuIGRlbGV0aW9uQ29uZmlybWVkID0gZmFsc2U7Ci0KLQlwcml2YXRlIEhhc2hTZXQ8RGVzY3JpcHRvcj4gcmVtb3ZlZERlc2NyaXB0b3JzOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZQotCSAqLwotCXB1YmxpYyBQcm9jZXNzRGVsZXRlQWN0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UKLQkgKiAKLQkgKiBAcGFyYW0gZG9tYWluCi0JICogICAgICAgICAgICB0aGUgZWRpdGluZyBkb21haW4KLQkgKi8KLQlwdWJsaWMgUHJvY2Vzc0RlbGV0ZUFjdGlvbihFZGl0aW5nRG9tYWluIGRvbWFpbikgewotCQlzdXBlcihkb21haW4pOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UKLQkgKiAKLQkgKiBAcGFyYW0gZG9tYWluCi0JICogICAgICAgICAgICB0aGUgZWRpdGluZyBkb21haW4KLQkgKiBAcGFyYW0gY29uZmlybQotCSAqICAgICAgICAgICAgaWYgPGNvZGU+dHJ1ZTwvY29kZT4sIGRpc3BsYXlzIGEgcHJvbXB0IHRvIGFzayBmb3IgdXNlcgotCSAqICAgICAgICAgICAgY29uZmlybWF0aW9uCi0JICovCi0JcHVibGljIFByb2Nlc3NEZWxldGVBY3Rpb24oRWRpdGluZ0RvbWFpbiBkb21haW4sIGJvb2xlYW4gY29uZmlybSkgewotCQlzdXBlcihkb21haW4sIGNvbmZpcm0pOwotCX0KLQotCS8qKgotCSAqIEBzZWUgTWV0aG9kRWxlbWVudERlbGV0ZUFjdGlvbiNjcmVhdGVNZXRob2RFbGVtZW50RGVsZXRlQ29tbWFuZCgpCi0JICovCi0JcHVibGljIERlbGV0ZU1ldGhvZEVsZW1lbnRDb21tYW5kIGNyZWF0ZU1ldGhvZEVsZW1lbnREZWxldGVDb21tYW5kKCkgewotCQlyZXR1cm4gbmV3IFByb2Nlc3NFbGVtZW50RGVsZXRlQ29tbWFuZChSZW1vdmVDb21tYW5kLmNyZWF0ZShkb21haW4sCi0JCQkJc2VsZWN0aW9uKSwgc2VsZWN0aW9uLCBjb25maXJtKTsKLQl9Ci0KLQkvKioKLQkgKiBSdW5zIHRoZSBkZWxldGUgYWN0aW9uIGdpdmVuIHRoZSBhY3Rpb24gbWFuYWdlcgotCSAqIAotCSAqIEBwYXJhbSBhY3Rpb25NZ3IKLQkgKiAgICAgICAgICAgIHRoZSBhY3Rpb24gbWFuYWdlcgotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bihJQWN0aW9uTWFuYWdlciBhY3Rpb25NZ3IpIHsKLQkJaWYgKGNvbmZpcm1EZWxldGUoKSkgewotCQkJZm9yIChJdGVyYXRvciBpdG9yID0gc2VsZWN0aW9uLml0ZXJhdG9yKCk7IGl0b3IuaGFzTmV4dCgpOykgewotCQkJCS8vIHJlbW92ZSByZWZlcmVuY2VzCi0JCQkJcmVtb3ZlUmVmZXJlbmNlcyhhY3Rpb25NZ3IsIGl0b3IubmV4dCgpKTsKLQkJCX0KLQotCQkJLy8gZGVsZXRlIGVsZW1lbnQKLQkJCWRvbWFpbi5nZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKGNvbW1hbmQpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2F2ZUN1cnJlbnRFZGl0b3IoKSB7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBNZXRob2RFbGVtZW50RGVsZXRlQWN0aW9uI2dldERlbGV0ZUNvbmZpcm1hdGlvbk1lc3NhZ2UoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGVsZXRlQ29uZmlybWF0aW9uTWVzc2FnZSgpIHsKLQkJcmV0dXJuIExpYnJhcnlVSVJlc291cmNlcy5Qcm9jZXNzRGVsZXRlQWN0aW9uX2RlbGV0ZWNvZmlybV90ZXh0OyAKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29tbWFuZCBjcmVhdGVEZWxldGVVbnVzZWREZXNjcmlwdG9yc0NvbW1hbmQoQ29sbGVjdGlvbjxEZXNjcmlwdG9yPiBkZXNjcmlwdG9ycywgQ29sbGVjdGlvbjw/PiBkZWxldGVkRWxlbWVudHMpIHsKLQkJcmV0dXJuIG5ldyBEZWxldGVVbnVzZWREZXNjcmlwdG9yc0NvbW1hbmQoCi0JCQkJZGVzY3JpcHRvcnMsIGZhbHNlLCBkZWxldGVkRWxlbWVudHMpIHsKLQotCQkJcHJvdGVjdGVkIENvbW1hbmQgZGVsZXRlKExpc3QgZWxlbWVudHMpIHsKLQkJCQlyZXR1cm4gUHJvY2Vzc0RlbGV0ZUFjdGlvbi5kZWxldGUoZWxlbWVudHMpOwotCQkJfQotCi0JCQkvLyBwcm90ZWN0ZWQgdm9pZCBzZWxlY3REZXNjcmlwdG9yc1RvRGVsZXRlKExpc3QKLQkJCS8vIGRlc2NyaXB0b3JzVG9EZWxldGUpIHsKLQkJCS8vIFN0cmluZyBtc2cgPQotCQkJLy8gQXV0aG9yaW5nVUlSZXNvdXJjZXMuUHJvY2Vzc0RlbGV0ZUFjdGlvbl9zZWxlY3REZXNjcmlwdG9yc1RvRGVsZXRlOwotCQkJLy8gT2JqZWN0W10gZGVzY3JpcHRvcnMgPQotCQkJLy8gUmVmZXJlbmNlU2VsZWN0aW9uLmdldFJlZmVyZW5jZXMoZGVzY3JpcHRvcnNUb0RlbGV0ZSwKLQkJCS8vIG1zZyk7Ci0JCQkvLyBkZXNjcmlwdG9yc1RvRGVsZXRlLnJldGFpbkFsbChBcnJheXMuYXNMaXN0KGRlc2NyaXB0b3JzKSk7Ci0JCQkvLyB9Ci0JCX07Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgTWV0aG9kRWxlbWVudERlbGV0ZUFjdGlvbiNydW4oKQotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJaWYgKGNvbmZpcm1EZWxldGUoKSkgewotCQkJLy8gY29sbGVjdGlvbiB0aGUgcmVsYXRlZCBkZXNjcmlwdG9ycyBiZWZvcmUgdGhlIGVsZW1lbnRzIGdvdAotCQkJLy8gZGVsZXRlZAotCQkJLy8KLQkJCUNvbGxlY3Rpb248RGVzY3JpcHRvcj4gZGVzY3JpcHRvcnMgPSBuZXcgSGFzaFNldDxEZXNjcmlwdG9yPigpOwotCQkJZm9yIChJdGVyYXRvcjw/PiBpdGVyID0gc2VsZWN0aW9uLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBlbGVtZW50ID0gaXRlci5uZXh0KCk7Ci0JCQkJYWRkUmVsYXRlZERlc2NyaXB0b3JzKGRlc2NyaXB0b3JzLCBlbGVtZW50KTsKLQkJCX0KLQotCQkJQ29tbWFuZCBjbWQgPSBjb21tYW5kOwotCi0JCQkvLyBkZWxldGUgZWxlbWVudHMKLQkJCS8vCi0JCQljbWQuZXhlY3V0ZSgpOwotCi0JCQkvLyBDaGVjayByZWZlcmVuY2UgY29uZmlybWF0aW9uIGFuZCBpZiBjb25maXJtZWQgc2V0Ci0JCQkvLyBkZWxldGlvbmNvbmZpcm1lZCB0byB0cnVlCi0JCQkvLyBJZiBhbnkgZGVsZXRpb24gaGFwcGVucyBpbiBzZXF1ZW5jZSwgd2lsbCBjaGVjayBmb3IKLQkJCS8vIGRlbGV0aW9uY29uZmlybWVkIHZhcmlhYmxlCi0JCQkvLyBhbmQgcHJvY2VlZHMgcmVtYWluaW5nIGRlbGV0aW9uIHNlcXVlbmNlLiAoZWc6Ci0JCQkvLyBBYnN0cmFjdERpYWdyYW1FZGl0b3IgLSBEZWxldGVBY3Rpb24oKSkuCi0JCQlpZiAoKChEZWxldGVNZXRob2RFbGVtZW50Q29tbWFuZCkgY21kKS5leGVjdXRlZCkgewotCQkJCWRlbGV0aW9uQ29uZmlybWVkID0gdHJ1ZTsKLQotCQkJCUNvbGxlY3Rpb248Pz4gZGVsZXRlZEVsZW1lbnRzID0gY21kLmdldFJlc3VsdCgpOwotCQkJCUNvbW1hbmQgZGVsZXRlVW51c2VkRGVzY3JpcHRvcnNDb21tYW5kID0gY3JlYXRlRGVsZXRlVW51c2VkRGVzY3JpcHRvcnNDb21tYW5kKGRlc2NyaXB0b3JzLCBkZWxldGVkRWxlbWVudHMpOwotCQkJCXRyeSB7Ci0JCQkJCWRlbGV0ZVVudXNlZERlc2NyaXB0b3JzQ29tbWFuZC5leGVjdXRlKCk7Ci0JCQkJfSBjYXRjaCAoT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24gZSkgewotCQkJCQkvLwotCQkJCX0gZmluYWxseSB7Ci0JCQkJCWRlbGV0ZVVudXNlZERlc2NyaXB0b3JzQ29tbWFuZC5kaXNwb3NlKCk7Ci0JCQkJfQotCQkJfQotCi0JCQkvLyBzYXZlIHRoZSBjdXJyZW50IGVkaXRvcgotCQkJLy8KLQkJCXNhdmVDdXJyZW50RWRpdG9yKCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGFkZFJlbGF0ZWREZXNjcmlwdG9ycygKLQkJCUNvbGxlY3Rpb248RGVzY3JpcHRvcj4gZGVzY3JpcHRvcnMsIE9iamVjdCBlbGVtZW50KSB7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgVGFza0Rlc2NyaXB0b3IpIHsKLQkJCVRhc2tEZXNjcmlwdG9yIHRhc2tEZXNjID0gKFRhc2tEZXNjcmlwdG9yKSBlbGVtZW50OwotCQkJZGVzY3JpcHRvcnMuYWRkQWxsKHRhc2tEZXNjLmdldEFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5KCkpOwotCQkJZGVzY3JpcHRvcnMuYWRkQWxsKHRhc2tEZXNjLmdldEFzc2lzdGVkQnkoKSk7Ci0JCQlkZXNjcmlwdG9ycy5hZGRBbGwodGFza0Rlc2MuZ2V0UGVyZm9ybWVkUHJpbWFyaWx5QnkoKSk7Ci0JCQlkZXNjcmlwdG9ycy5hZGRBbGwodGFza0Rlc2MuZ2V0TWFuZGF0b3J5SW5wdXQoKSk7Ci0JCQlkZXNjcmlwdG9ycy5hZGRBbGwodGFza0Rlc2MuZ2V0RXh0ZXJuYWxJbnB1dCgpKTsKLQkJCWRlc2NyaXB0b3JzLmFkZEFsbCh0YXNrRGVzYy5nZXRPcHRpb25hbElucHV0KCkpOwotCQkJZGVzY3JpcHRvcnMuYWRkQWxsKHRhc2tEZXNjLmdldE91dHB1dCgpKTsKLQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgUm9sZURlc2NyaXB0b3IpIHsKLQkJCVJvbGVEZXNjcmlwdG9yIHJvbGVEZXNjID0gKFJvbGVEZXNjcmlwdG9yKSBlbGVtZW50OwotCQkJZGVzY3JpcHRvcnMuYWRkQWxsKEFzc29jaWF0aW9uSGVscGVyCi0JCQkJCS5nZXRBc3Npc3RlZFRhc2tEZXNjcmlwdG9ycyhyb2xlRGVzYykpOwotCQkJZGVzY3JpcHRvcnMuYWRkQWxsKEFzc29jaWF0aW9uSGVscGVyCi0JCQkJCS5nZXRBZGRpdGlvbmFsVGFza0Rlc2NyaXB0b3JzKHJvbGVEZXNjKSk7Ci0JCQlkZXNjcmlwdG9ycy5hZGRBbGwoQXNzb2NpYXRpb25IZWxwZXIKLQkJCQkJLmdldFByaW1hcnlUYXNrRGVzY3JpcHRvcnMocm9sZURlc2MpKTsKLQkJCWRlc2NyaXB0b3JzLmFkZEFsbChyb2xlRGVzYy5nZXRSZXNwb25zaWJsZUZvcigpKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCByZW1vdmVSZWZlcmVuY2VzKElBY3Rpb25NYW5hZ2VyIGFjdGlvbk1nciwgT2JqZWN0IG9iaikgewotCQlJUmVzb3VyY2VBd2FyZUNvbW1hbmQgY21kID0gbnVsbDsKLQkJYm9vbGVhbiBmb3JjZSA9ICFjb25maXJtOwotCQlpZiAob2JqIGluc3RhbmNlb2YgVGFza0Rlc2NyaXB0b3IpIHsKLQkJCWNtZCA9IG5ldyBEZWxldGVUYXNrRGVzY3JpcHRvcigoVGFza0Rlc2NyaXB0b3IpIG9iaiwgZm9yY2UpOwotCQl9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIFJvbGVEZXNjcmlwdG9yKSB7Ci0JCQljbWQgPSBuZXcgRGVsZXRlUm9sZURlc2NyaXB0b3IoKFJvbGVEZXNjcmlwdG9yKSBvYmosIGZvcmNlKTsKLQkJfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3IpIHsKLQkJCWNtZCA9IG5ldyBEZWxldGVXb3JrUHJvZHVjdERlc2NyaXB0b3IoKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgb2JqLAotCQkJCQlmb3JjZSk7Ci0JCX0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgVGVhbVByb2ZpbGUpIHsKLQkJCWNtZCA9IG5ldyBEZWxldGVUZWFtUHJvZmlsZSgoVGVhbVByb2ZpbGUpIG9iaik7Ci0JCX0KLQkJaWYgKGNtZCAhPSBudWxsKSB7Ci0JCQlpZiAoYWN0aW9uTWdyICE9IG51bGwpIHsKLQkJCQlhY3Rpb25NZ3IuZXhlY3V0ZShjbWQpOwotCi0JCQl9IGVsc2UgewotCQkJCWNtZC5leGVjdXRlKCk7Ci0JCQl9Ci0JCQlpZiAoY21kIGluc3RhbmNlb2YgUmVtb3ZlVW51c2VkRGVzY3JpcHRvcnNDb21tYW5kKSB7Ci0JCQkJcmVtb3ZlZERlc2NyaXB0b3JzCi0JCQkJCQkuYWRkQWxsKCgoUmVtb3ZlVW51c2VkRGVzY3JpcHRvcnNDb21tYW5kKSBjbWQpCi0JCQkJCQkJCS5nZXRSZW1vdmVkRGVzY3JpcHRvcnMoKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5Db21tYW5kQWN0aW9uSGFuZGxlciN1cGRhdGVTZWxlY3Rpb24ob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB1cGRhdGVTZWxlY3Rpb24oSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCWJvb2xlYW4gcmV0ID0gc3VwZXIudXBkYXRlU2VsZWN0aW9uKGZpbHRlclNlbGVjdGlvbihzZWxlY3Rpb24pKTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQkvKioKLQkgKiBGaWx0ZXJzIHNlbGVjdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gc2VsZWN0aW9uCi0JICogQHJldHVybiBOZXcgU2VsZWN0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBJU3RydWN0dXJlZFNlbGVjdGlvbiBmaWx0ZXJTZWxlY3Rpb24oCi0JCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJQXJyYXlMaXN0PE9iamVjdD4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PigpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBzZWxlY3Rpb24uaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZWxlbWVudCA9IGl0ZXIubmV4dCgpOwotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcgotCQkJCQkmJiAoKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSBlbGVtZW50KQotCQkJCQkJCS5pc1JlYWRPbmx5KCkpIHsKLQkJCQljb250aW51ZTsKLQkJCX0gZWxzZSB7Ci0JCQkJbGlzdC5hZGQoZWxlbWVudCk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24obGlzdCk7Ci0JfQotCi0JLyoqCi0JICogSWYgZGVsZXRpb24gY29uZmlybWVkLCBzZXQgY29uZmlybWF0aW9uIGFuZCBjaGlsZCBwcm9jZXNzIGNhbiB1c2UgdGhlCi0JICogY29uZmlybWF0aW9uIHRvIHByb2NlZWQgZm9yIHRoZSBkZWxldGlvbiBvZiByZW1haW5pbmcuCi0JICogCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNEZWxldGlvbkNvbmZpcm1lZCgpIHsKLQkJcmV0dXJuIGRlbGV0aW9uQ29uZmlybWVkOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBjb21tYW5kCi0JICogCi0JICogQHJldHVybiBjbWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDb21tYW5kKCkgewotCQlyZXR1cm4gY29tbWFuZDsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QgdG8gZGVsZXRlIHByb2Nlc3MgZWxlbWVudHMgd2l0aG91dCBVSSBhY3Rpb24KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudHMKLQkgKiBAcmV0dXJuIHRoZSBleGVjdXRlZCBkZWxldGUgY29tbWFuZCBpZiBzb21lIG9mIHRoZSBnaXZlbiBlbGVtZW50cyBoYXZlCi0JICogICAgICAgICBiZWVuIHN1Y2Nlc3NmdWxseSBkZWxldGVkLCA8Y29kZT5udWxsPC9jb2RlPiBvdGhlcndpc2UKLQkgKiBAZXhjZXB0aW9uIE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgaWYgdXNlciBjYW5jZWxlZCB0aGlzIGRlbGV0aW9uIG9wZXJhdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ29tbWFuZCBkZWxldGUoQ29sbGVjdGlvbiBlbGVtZW50cykgewotCQlQcm9jZXNzRGVsZXRlQWN0aW9uIGRlbGV0ZUFjdGlvbiA9IG5ldyBQcm9jZXNzRGVsZXRlQWN0aW9uKG51bGwsIGZhbHNlKSB7Ci0JCQkvKgotCQkJICogKG5vbi1KYXZhZG9jKQotCQkJICogCi0JCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9ucy5NZXRob2RFbGVtZW50RGVsZXRlQWN0aW9uI2NyZWF0ZUNvbW1hbmQoamF2YS51dGlsLkNvbGxlY3Rpb24pCi0JCQkgKi8KLQkJCXB1YmxpYyBDb21tYW5kIGNyZWF0ZUNvbW1hbmQoQ29sbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJCQlkb21haW4gPSBuZXcgQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluKAotCQkJCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJCQkJLmdldFByb2Nlc3NDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQluZXcgQmFzaWNDb21tYW5kU3RhY2soKSk7Ci0KLQkJCQlyZXR1cm4gc3VwZXIuY3JlYXRlQ29tbWFuZChzZWxlY3Rpb24pOwotCQkJfQotCi0JCX07Ci0JCWlmIChkZWxldGVBY3Rpb24udXBkYXRlU2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKG5ldyBBcnJheUxpc3QoCi0JCQkJZWxlbWVudHMpKSkpIHsKLQkJCWRlbGV0ZUFjdGlvbi5ydW4oKTsKLQkJCWlmICghZGVsZXRlQWN0aW9uLmlzRGVsZXRpb25Db25maXJtZWQoKSkgewotCQkJCXRocm93IG5ldyBPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbigpOwotCQkJfQotCQkJcmV0dXJuIGRlbGV0ZUFjdGlvbi5nZXRDb21tYW5kKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL2FjdGlvbnMvcGFja2FnZS5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL2FjdGlvbnMvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZTU0YzlhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9hY3Rpb25zL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIGFjdGlvbnMgZm9yIG1hbmFnaW5nIGEgbWV0aG9kIGxpYnJhcnkuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL2RpYWxvZ3MvQmFzZURpYWxvZy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL2RpYWxvZ3MvQmFzZURpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MmRjZDc4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9kaWFsb2dzL0Jhc2VEaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLmRpYWxvZ3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5UaXRsZUFyZWFEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotCi0vKioKLSAqIFRoZSBiYXNlIGNsYXNzIGZvciBhbGwgTGlicmFyeSBVSSBkaWFsb2dzLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEJhc2VEaWFsb2cgZXh0ZW5kcyBUaXRsZUFyZWFEaWFsb2cgewotCi0JLyoqCi0JICogVGhlIE9LIGJ1dHRvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgQnV0dG9uIG9rQnV0dG9uOwotCi0JLyoqCi0JICogVGhlIENhbmNlbCBidXR0b24uCi0JICovCi0JcHJvdGVjdGVkIEJ1dHRvbiBjYW5jZWxCdXR0b247Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIGdpdmVuIHRoZSBwYXJlbnQgY29udHJvbC4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbnRyb2wuCi0JICovCi0JcHVibGljIEJhc2VEaWFsb2coU2hlbGwgcGFyZW50KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZyNjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpCi0JICovCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXJldHVybiBzdXBlci5jcmVhdGVEaWFsb2dBcmVhKHBhcmVudCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgZGlhbG9nIGJ1dHRvbnMuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQnV0dG9uc0ZvckJ1dHRvbkJhcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCS8vIENyZWF0ZSB0aGUgT0sgYnV0dG9uLgotCQljcmVhdGVCdXR0b24ocGFyZW50LCBJRGlhbG9nQ29uc3RhbnRzLk9LX0lELCBJRGlhbG9nQ29uc3RhbnRzLk9LX0xBQkVMLAotCQkJCXRydWUpOwotCi0JCS8vIENyZWF0ZSB0aGUgQ2FuY2VsIGJ1dHRvbi4KLQkJY3JlYXRlQnV0dG9uKHBhcmVudCwgSURpYWxvZ0NvbnN0YW50cy5DQU5DRUxfSUQsCi0JCQkJSURpYWxvZ0NvbnN0YW50cy5DQU5DRUxfTEFCRUwsIGZhbHNlKTsKLQotCQkvLyBTZXQgaGVscCBjb250ZXh0IGZvciB0aGUgT0sgYnV0dG9uLgotCQlva0J1dHRvbiA9IHN1cGVyLmdldEJ1dHRvbihJRGlhbG9nQ29uc3RhbnRzLk9LX0lEKTsKLQotCQkvLyBTZXQgaGVscCBjb250ZXh0IGZvciB0aGUgQ2FuY2VsIGJ1dHRvbi4KLQkJY2FuY2VsQnV0dG9uID0gc3VwZXIuZ2V0QnV0dG9uKElEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0lEKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9kaWFsb2dzL0NvbnZlcnRBY3Rpdml0eURpYWxvZy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL2RpYWxvZ3MvQ29udmVydEFjdGl2aXR5RGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhMzRmMDcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL2RpYWxvZ3MvQ29udmVydEFjdGl2aXR5RGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuZGlhbG9nczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5TdHJVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLkRlbGV0ZU1ldGhvZEVsZW1lbnRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLkxpYnJhcnlVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5MaWJyYXJ5VUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuTGlicmFyeVVJVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS51dGlsLlR5cGVDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5Db252ZXJ0QWN0aXZpdHlUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQXJyYXlDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5MaXN0RGlhbG9nOwotCi0vKioKLSAqIERpYWxvZyB0byBjb252ZXJ0IGFjdGl2aXR5IHR5cGUgCi0gKiAKLSAqIEBhdXRob3IgSmVmZiBIYXJkeQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQ29udmVydEFjdGl2aXR5RGlhbG9nIHsKLQotCS8qKgotCSAqIFF1ZXJ5IHVzZXIgYW5kIGNvbnZlcnQgdGhlIG9sZCBhY3Rpdml0eSBpbnRvIG5ldyBvbmUKLQkgKiAKLQkgKiBAcGFyYW0gb2xkQWN0aXZpdHkKLQkgKiBAcGFyYW0gc2hlbGwKLQkgKiBAcGFyYW0gY29tbWFuZAotCSAqIAotCSAqIEByZXR1cm4gTmV3bHkgY29udmVydGVkIGFjdGl2aXR5Ci0JICovCi0JcHVibGljIHN0YXRpYyBBY3Rpdml0eSBxdWVyeVVzZXJBbmRDb252ZXJ0KEFjdGl2aXR5IG9sZEFjdGl2aXR5LCBTaGVsbCBzaGVsbCwKLQkJCURlbGV0ZU1ldGhvZEVsZW1lbnRDb21tYW5kIGNvbW1hbmQpIHsKLQkJCi0JCWlmIChzaGVsbCA9PSBudWxsKQotCQkJc2hlbGwgPSBEaXNwbGF5LmdldEN1cnJlbnQoKS5nZXRBY3RpdmVTaGVsbCgpOwotCQlMaXN0RGlhbG9nIGRsZyA9IG5ldyBMaXN0RGlhbG9nKHNoZWxsKTsKLQkJZGxnLnNldEhlaWdodEluQ2hhcnMoNSk7Ci0JCWRsZy5zZXRDb250ZW50UHJvdmlkZXIobmV3IEFycmF5Q29udGVudFByb3ZpZGVyKCkpOwotCQlkbGcuc2V0TGFiZWxQcm92aWRlcihuZXcgTGFiZWxQcm92aWRlcigpIHsKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgewotCQkJCXN3aXRjaCAoKChJbnRlZ2VyKSBlbGVtZW50KS5pbnRWYWx1ZSgpKSB7Ci0JCQkJLy8gVE9ETzogcmVmYWN0b3IgdGhlc2Ugc3RyaW5ncyAoYW5kIHRoaXMgd2hvbGUgZGlhbG9nKSBpbnRvCi0JCQkJLy8gbGlicmFyeS51aQotCQkJCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWToKLQkJCQkJcmV0dXJuIExpYnJhcnlVSVRleHQuVEVYVF9BQ1RJVklUWTsKLQkJCQljYXNlIFVtYVBhY2thZ2UuSVRFUkFUSU9OOgotCQkJCQlyZXR1cm4gTGlicmFyeVVJVGV4dC5URVhUX0lURVJBVElPTjsKLQkJCQljYXNlIFVtYVBhY2thZ2UuUEhBU0U6Ci0JCQkJCXJldHVybiBMaWJyYXJ5VUlUZXh0LlRFWFRfUEhBU0U7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIExpYnJhcnlSZXNvdXJjZXMudW5rbm93bkd1aWRhbmNlX3RleHQ7IAotCQkJCX0KLQotCQkJfQotCQl9KTsKLQkJTGlzdCBuZXdBY3Rpdml0eVR5cGVMaXN0ID0gZ2V0VmFsaWROZXdBY3Rpdml0eVR5cGVzKG9sZEFjdGl2aXR5KTsKLQkJaWYgKG5ld0FjdGl2aXR5VHlwZUxpc3QgPT0gbnVsbCkgewotCQkJTGlicmFyeVVJUGx1Z2luCi0JCQkJCS5nZXREZWZhdWx0KCkKLQkJCQkJLmdldE1zZ0RpYWxvZygpCi0JCQkJCS5kaXNwbGF5RXJyb3IoCi0JCQkJCQkJTGlicmFyeVJlc291cmNlcy5jb252ZXJ0QWN0aXZpdHlFcnJvcl90aXRsZSwgCi0JCQkJCQkJTGlicmFyeVVJUmVzb3VyY2VzLnVuc3VwcG9ydGVkQWN0aXZpdHlUeXBlX21zZywKLQkJCQkJCQlMaWJyYXJ5VUlSZXNvdXJjZXMuYmluZChMaWJyYXJ5VUlSZXNvdXJjZXMudW5zdXBwb3J0ZWRBY3Rpdml0eVR5cGVfcmVhc29uLCBTdHJVdGlsLnRvTG93ZXIoVG5nVXRpbC5nZXRUeXBlVGV4dChvbGRBY3Rpdml0eSkpKSk7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlkbGcuc2V0SW5wdXQobmV3QWN0aXZpdHlUeXBlTGlzdCk7Ci0JCWRsZy5zZXRUaXRsZShMaWJyYXJ5VUlSZXNvdXJjZXMuY29udmVydEFjdGl2aXR5RGlhbG9nX3RpdGxlKTsKLQkJZGxnLnNldE1lc3NhZ2UoTGlicmFyeVVJUmVzb3VyY2VzLmNvbnZlcnRBY3Rpdml0eURpYWxvZ190ZXh0KTsKLQkJaWYgKGRsZy5vcGVuKCkgPT0gRGlhbG9nLkNBTkNFTCkKLQkJCXJldHVybiBudWxsOwotCi0JCU9iamVjdFtdIHNlbGVjdGlvblJlc3VsdCA9IGRsZy5nZXRSZXN1bHQoKTsKLQkJaWYgKHNlbGVjdGlvblJlc3VsdCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWludCBjaG9zZW5BY3Rpdml0eSA9ICgoSW50ZWdlcikgc2VsZWN0aW9uUmVzdWx0WzBdKS5pbnRWYWx1ZSgpOwotCQkKLS8vCQlyZXR1cm4gQ29udmVydEFjdGl2aXR5VHlwZS5jb252ZXJ0QWN0aXZpdHkob2xkQWN0aXZpdHksIGNob3NlbkFjdGl2aXR5LCBjb21tYW5kKTsKLQkJCi0JCXJldHVybiBUeXBlQ29udmVydGVyLmNvbnZlcnRBY3Rpdml0eShvbGRBY3Rpdml0eSwgVHlwZUNvbnZlcnRlci5nZXRBY3Rpdml0eVR5cGUoY2hvc2VuQWN0aXZpdHkpKTsKLQl9Ci0JCi0JLyoqCi0JICogR2V0cyBsaXN0IG9mIHZhbGlkIG5ldyBhY3Rpdml0eSB0eXBlcyBiYXNlZCBvbiBvbGQgYWN0aXZpdHkgdHlwZQotCSAqIAotCSAqIEBwYXJhbSBvbGRBY3Rpdml0eQotCSAqIAotCSAqIEByZXR1cm4gbGlzdCBvZiB2YWxpZCBhY3Rpdml0eSB0eXBlcwotCSAqIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRWYWxpZE5ld0FjdGl2aXR5VHlwZXMoQWN0aXZpdHkgb2xkQWN0aXZpdHkpIHsKLQkJaWYgKG9sZEFjdGl2aXR5ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJSW50ZWdlciBvbGRBY3Rpdml0eUNsYXNzSUQgPSBuZXcgSW50ZWdlcihvbGRBY3Rpdml0eS5lQ2xhc3MoKQotCQkJCS5nZXRDbGFzc2lmaWVySUQoKSk7Ci0JCWlmICghQ29udmVydEFjdGl2aXR5VHlwZS5jb21wYXRpYmxlQWN0aXZpdGllc0xpc3QuY29udGFpbnMob2xkQWN0aXZpdHlDbGFzc0lEKSkKLQkJCXJldHVybiBudWxsOwotCQlMaXN0IGFjdGl2aXR5TGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gQ29udmVydEFjdGl2aXR5VHlwZS5jb21wYXRpYmxlQWN0aXZpdGllc0xpc3QuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlJbnRlZ2VyIGNvbXBhdGlibGVBY3Rpdml0eVR5cGVDbGFzc0lEID0gKEludGVnZXIpaXRlci5uZXh0KCk7Ci0JCQlpZiAoIW9sZEFjdGl2aXR5Q2xhc3NJRC5lcXVhbHMoY29tcGF0aWJsZUFjdGl2aXR5VHlwZUNsYXNzSUQpICYmCi0JCQkJCWNvbXBhdGlibGVBY3Rpdml0eVR5cGVDbGFzc0lELmludFZhbHVlKCkgIT0gVW1hUGFja2FnZS5DQVBBQklMSVRZX1BBVFRFUk4gJiYKLQkJCQkJY29tcGF0aWJsZUFjdGl2aXR5VHlwZUNsYXNzSUQuaW50VmFsdWUoKSAhPSBVbWFQYWNrYWdlLkRFTElWRVJZX1BST0NFU1MpCi0JCQkJYWN0aXZpdHlMaXN0LmFkZChjb21wYXRpYmxlQWN0aXZpdHlUeXBlQ2xhc3NJRCk7Ci0JCX0KLQkJcmV0dXJuIGFjdGl2aXR5TGlzdDsKLQl9Ci0KLQkKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9kaWFsb2dzL0NvcHlMaWJyYXJ5RGlhbG9nLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvZGlhbG9ncy9Db3B5TGlicmFyeURpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMjk0MThlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9kaWFsb2dzL0NvcHlMaWJyYXJ5RGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5kaWFsb2dzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuTGlicmFyeVVJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotCi0vKioKLSAqIERpYWxvZyB0byBwcm9tcHQgdGhlIHVzZXIgdG8gY29weSBhIGxpYnJhcnkgdG8gYW5vdGhlciBsb2NhdGlvbgotICogQGF1dGhvciBKZWZmIEhhcmR5Ci0gKgotICovCi1wdWJsaWMgY2xhc3MgQ29weUxpYnJhcnlEaWFsb2cgZXh0ZW5kcyBQYXRoU2VsZWN0aW9uRGlhbG9nIHsKLQkKLQlwdWJsaWMgQ29weUxpYnJhcnlEaWFsb2coU2hlbGwgcGFyZW50U2hlbGwsIFN0cmluZyBkaWFsb2dUaXRsZSwKLQkJCVN0cmluZyBkaWFsb2dNZXNzYWdlLCBTdHJpbmcgZGVmYXVsdFBhdGgpIHsKLQkJc3VwZXIocGFyZW50U2hlbGwsIGRpYWxvZ1RpdGxlLCBkaWFsb2dNZXNzYWdlLCBkZWZhdWx0UGF0aCk7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2cjY3JlYXRlQnV0dG9uKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSwgaW50LCBqYXZhLmxhbmcuU3RyaW5nLCBib29sZWFuKQotCSAqLwotCXByb3RlY3RlZCBCdXR0b24gY3JlYXRlQnV0dG9uKENvbXBvc2l0ZSBwYXJlbnQsIGludCBpZCwgU3RyaW5nIGxhYmVsLAotCQkJYm9vbGVhbiBkZWZhdWx0QnV0dG9uKSB7Ci0JCUJ1dHRvbiBiID0gc3VwZXIuY3JlYXRlQnV0dG9uKHBhcmVudCwgaWQsIGxhYmVsLCBkZWZhdWx0QnV0dG9uKTsKLQkJaWYgKGlkID09IElEaWFsb2dDb25zdGFudHMuT0tfSUQpIHsKLQkJCWIuc2V0VGV4dChMaWJyYXJ5VUlSZXNvdXJjZXMuY29weUxpYnJhcnlEaWFsb2dfY29weUJ1dHRvbl90ZXh0KTsKLQotCQl9IGVsc2UgaWYgKGlkID09IElEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0lEKSB7Ci0JCQliLnNldFRleHQoTGlicmFyeVVJUmVzb3VyY2VzLnNraXBCdXR0b25fdGV4dCk7Ci0JCX0KLQotCQlyZXR1cm4gYjsKLQl9Ci0JCi0JCi0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9kaWFsb2dzL0xpYnJhcnlCYWNrdXBEaWFsb2cuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9kaWFsb2dzL0xpYnJhcnlCYWNrdXBEaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWViNWJiZi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvZGlhbG9ncy9MaWJyYXJ5QmFja3VwRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5kaWFsb2dzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuTGlicmFyeVVJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotCi0vKioKLSAqIFV0aWxpdHkgY2xhc3MgdG8gYmFjayB1cCBsaWJyYXJ5LgotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTGlicmFyeUJhY2t1cERpYWxvZyBleHRlbmRzIFBhdGhTZWxlY3Rpb25EaWFsb2cgewotCi0JcHVibGljIExpYnJhcnlCYWNrdXBEaWFsb2coU2hlbGwgcGFyZW50U2hlbGwsIFN0cmluZyBkaWFsb2dUaXRsZSwKLQkJCVN0cmluZyBkaWFsb2dNZXNzYWdlLCBTdHJpbmcgZGVmYXVsdFBhdGgpIHsKLQkJc3VwZXIocGFyZW50U2hlbGwsIGRpYWxvZ1RpdGxlLCBkaWFsb2dNZXNzYWdlLCBkZWZhdWx0UGF0aCk7Ci0JfQotCi0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZyNjcmVhdGVCdXR0b24ob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlLCBpbnQsIGphdmEubGFuZy5TdHJpbmcsIGJvb2xlYW4pCi0JICovCi0JcHJvdGVjdGVkIEJ1dHRvbiBjcmVhdGVCdXR0b24oQ29tcG9zaXRlIHBhcmVudCwgaW50IGlkLCBTdHJpbmcgbGFiZWwsCi0JCQlib29sZWFuIGRlZmF1bHRCdXR0b24pIHsKLQkJQnV0dG9uIGIgPSBzdXBlci5jcmVhdGVCdXR0b24ocGFyZW50LCBpZCwgbGFiZWwsIGRlZmF1bHRCdXR0b24pOwotCQlpZiAoaWQgPT0gSURpYWxvZ0NvbnN0YW50cy5PS19JRCkgewotCQkJYi5zZXRUZXh0KExpYnJhcnlVSVJlc291cmNlcy5va0J1dHRvbl90ZXh0KTsKLQotCQl9IGVsc2UgaWYgKGlkID09IElEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0lEKSB7Ci0JCQliLnNldFRleHQoTGlicmFyeVVJUmVzb3VyY2VzLnNraXBCdXR0b25fdGV4dCk7Ci0JCX0KLQotCQlyZXR1cm4gYjsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvZGlhbG9ncy9QYXRoU2VsZWN0aW9uRGlhbG9nLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvZGlhbG9ncy9QYXRoU2VsZWN0aW9uRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxY2FlMmEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL2RpYWxvZ3MvUGF0aFNlbGVjdGlvbkRpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLmRpYWxvZ3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5MaWJyYXJ5VUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkud2l6YXJkcy5EaXJlY3RvcnlWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlyZWN0b3J5RGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci0KLS8qKgotICogCi0gKiBVdGlsaXR5IGNsYXNzIHRvIHNlbGVjdCBhIHBhdGgKLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgUGF0aFNlbGVjdGlvbkRpYWxvZyBleHRlbmRzIERpYWxvZyB7Ci0KLQlwcm90ZWN0ZWQgVGV4dCBjdHJsX3BhdGg7Ci0KLQlwcm90ZWN0ZWQgQnV0dG9uIGN0cmxfYnJvd3NlX2J1dHRvbjsKLQotCXByb3RlY3RlZCBTdHJpbmcgdGl0bGU7Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIG1lc3NhZ2U7Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIHZhbHVlOwotCi0JcHVibGljIFBhdGhTZWxlY3Rpb25EaWFsb2coU2hlbGwgcGFyZW50U2hlbGwsIFN0cmluZyBkaWFsb2dUaXRsZSwKLQkJCVN0cmluZyBkaWFsb2dNZXNzYWdlLCBTdHJpbmcgZGVmYXVsdFBhdGgpIHsKLQkJc3VwZXIocGFyZW50U2hlbGwpOwotCi0JCXRpdGxlID0gZGlhbG9nVGl0bGU7Ci0JCW1lc3NhZ2UgPSBkaWFsb2dNZXNzYWdlOwotCQl2YWx1ZSA9IGRlZmF1bHRQYXRoOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2cjYnV0dG9uUHJlc3NlZChpbnQpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYnV0dG9uUHJlc3NlZChpbnQgYnV0dG9uSWQpIHsKLQkJaWYgKGJ1dHRvbklkID09IElEaWFsb2dDb25zdGFudHMuT0tfSUQpIHsKLQkJCXZhbHVlID0gY3RybF9wYXRoLmdldFRleHQoKTsKLQotCQkJLy8gbWFrZSBzdXJlIHRoZSBwYXRoIGlzIHZhbGlkCi0JCQlTdHJpbmcgbXNnID0gTGlicmFyeVVJUmVzb3VyY2VzLnBhdGhTZWxlY3Rpb25FcnJvcl9tc2c7Ci0JCQlpZiAoRGlyZWN0b3J5VmFsaWRhdG9yLmNoZWNrQW5kQ3JlYXRlRGlyKHZhbHVlLCB0aXRsZSwgbXNnKSA9PSBmYWxzZSkgewotCQkJCXJldHVybjsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXZhbHVlID0gbnVsbDsKLQkJfQotCQlzdXBlci5idXR0b25QcmVzc2VkKGJ1dHRvbklkKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3cjY29uZmlndXJlU2hlbGwob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGwpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlU2hlbGwoU2hlbGwgc2hlbGwpIHsKLQkJc3VwZXIuY29uZmlndXJlU2hlbGwoc2hlbGwpOwotCQlpZiAodGl0bGUgIT0gbnVsbCkKLQkJCXNoZWxsLnNldFRleHQodGl0bGUpOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2cjY3JlYXRlQnV0dG9uc0ZvckJ1dHRvbkJhcihvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQnV0dG9uc0ZvckJ1dHRvbkJhcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCS8vIGNyZWF0ZSBPSyBhbmQgQ2FuY2VsIGJ1dHRvbnMgYnkgZGVmYXVsdAotCQljcmVhdGVCdXR0b24ocGFyZW50LCBJRGlhbG9nQ29uc3RhbnRzLk9LX0lELCBJRGlhbG9nQ29uc3RhbnRzLk9LX0xBQkVMLAotCQkJCXRydWUpOwotCi0JCWNyZWF0ZUJ1dHRvbihwYXJlbnQsIElEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0lELAotCQkJCUlEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0xBQkVMLCBmYWxzZSk7Ci0KLQkJLy8gZG8gdGhpcyBoZXJlIGJlY2F1c2Ugc2V0dGluZyB0aGUgdGV4dCB3aWxsIHNldCBlbmFibGVtZW50IG9uIHRoZSBvawotCQkvLyBidXR0b24KLQkJY3RybF9wYXRoLnNldEZvY3VzKCk7Ci0JCWlmICh2YWx1ZSAhPSBudWxsKSB7Ci0JCQljdHJsX3BhdGguc2V0VGV4dCh2YWx1ZSk7Ci0JCQljdHJsX3BhdGguc2VsZWN0QWxsKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nI2NyZWF0ZURpYWxvZ0FyZWEob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlKQotCSAqLwotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkgewotCQkvLyBjcmVhdGUgY29tcG9zaXRlCi0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSAoQ29tcG9zaXRlKSBzdXBlci5jcmVhdGVEaWFsb2dBcmVhKHBhcmVudCk7Ci0JCS8vIGNyZWF0ZSBtZXNzYWdlCi0JCWlmIChtZXNzYWdlICE9IG51bGwpIHsKLQkJCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULldSQVApOwotCQkJbGFiZWwuc2V0VGV4dChtZXNzYWdlKTsKLQkJCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMCi0JCQkJCXwgR3JpZERhdGEuR1JBQl9WRVJUSUNBTCB8IEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTAotCQkJCQl8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0NFTlRFUik7Ci0JCQlkYXRhLndpZHRoSGludCA9IGNvbnZlcnRIb3Jpem9udGFsRExVc1RvUGl4ZWxzKElEaWFsb2dDb25zdGFudHMuTUlOSU1VTV9NRVNTQUdFX0FSRUFfV0lEVEgpOwotCQkJbGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJCWxhYmVsLnNldEZvbnQocGFyZW50LmdldEZvbnQoKSk7Ci0JCX0KLQkJY3RybF9wYXRoID0gbmV3IFRleHQoY29tcG9zaXRlLCBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUik7Ci0JCWN0cmxfcGF0aC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwKLQkJCQl8IEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCkpOwotCi0JCWN0cmxfYnJvd3NlX2J1dHRvbiA9IG5ldyBCdXR0b24oY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWN0cmxfYnJvd3NlX2J1dHRvbi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YSgKLQkJCQlHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0VORCkpOwotCQljdHJsX2Jyb3dzZV9idXR0b24uc2V0VGV4dChMaWJyYXJ5VUlSZXNvdXJjZXMuYnJvd3NlQnV0dG9uX3RleHQpOwotCQljdHJsX2Jyb3dzZV9idXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJb3BlbkRpcmVjdG9yeURpYWxvZygpOwotCQkJfQotCQl9KTsKLQotCQlhcHBseURpYWxvZ0ZvbnQoY29tcG9zaXRlKTsKLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci0KLQkvKioKLQkgKiBPcGVuIGRpcmVjdG9yeSBkaWFsb2cKLQkgKgotCSAqLwotCXByaXZhdGUgdm9pZCBvcGVuRGlyZWN0b3J5RGlhbG9nKCkgewotCQl0cnkgewotCQkJLy8gVGV4dCBjdHJsX3BhdGggPSBzdXBlci5nZXRUZXh0KCk7Ci0JCQlEaXJlY3RvcnlEaWFsb2cgZGQgPSBuZXcgRGlyZWN0b3J5RGlhbG9nKHRoaXMuZ2V0U2hlbGwoKSwgU1dULk5PTkUpOwotCQkJZGQuc2V0RmlsdGVyUGF0aChjdHJsX3BhdGguZ2V0VGV4dCgpKTsKLQotCQkJU3RyaW5nIGRlc3RpbmF0aW9uID0gZGQub3BlbigpOwotCQkJaWYgKGRlc3RpbmF0aW9uICE9IG51bGwpIHsKLQkJCQljdHJsX3BhdGguc2V0VGV4dChkZXN0aW5hdGlvbik7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJZXgucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwYXRoCi0JICogQHJldHVybiBwYXRoCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQYXRoKCkgewotCQlyZXR1cm4gdmFsdWU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL2RpYWxvZ3MvU2VsZWN0TGlicmFyeURpcmVjdG9yeURpYWxvZy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL2RpYWxvZ3MvU2VsZWN0TGlicmFyeURpcmVjdG9yeURpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOGNhN2ZlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9kaWFsb2dzL1NlbGVjdExpYnJhcnlEaXJlY3RvcnlEaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLmRpYWxvZ3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5MaWJyYXJ5VUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkucHJlZmVyZW5jZXMuTGlicmFyeVVJUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXJlY3RvcnlEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci0KLS8qKgotICogUHJvbXBzIHRoZSB1c2VyIHRvIHNlbGVjdCBhIG1ldGhvZCBsaWJyYXJ5IGZvbGRlci4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBTZWxlY3RMaWJyYXJ5RGlyZWN0b3J5RGlhbG9nIHsKLQotCXByaXZhdGUgRGlyZWN0b3J5RGlhbG9nIGRpYWxvZzsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBzaGVsbC4KLQkgKi8KLQlwdWJsaWMgU2VsZWN0TGlicmFyeURpcmVjdG9yeURpYWxvZyhTaGVsbCBwYXJlbnQpIHsKLQkJdGhpcyhwYXJlbnQsIFNXVC5OT05FKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgc2hlbGwuCi0JICogQHBhcmFtIHN0eWxlCi0JICogICAgICAgICAgICBUaGUgZGlhbG9nIHN0eWxlLgotCSAqLwotCXB1YmxpYyBTZWxlY3RMaWJyYXJ5RGlyZWN0b3J5RGlhbG9nKFNoZWxsIHBhcmVudCwgaW50IHN0eWxlKSB7Ci0JCWRpYWxvZyA9IG5ldyBEaXJlY3RvcnlEaWFsb2cocGFyZW50LCBzdHlsZSk7Ci0JCWRpYWxvZy5zZXRUZXh0KExpYnJhcnlVSVJlc291cmNlcy5zZWxlY3RMaWJyYXJ5Rm9sZGVyRGlhbG9nX3RpdGxlKTsKLQkJZGlhbG9nLnNldE1lc3NhZ2UoTGlicmFyeVVJUmVzb3VyY2VzLnNlbGVjdExpYnJhcnlGb2xkZXJEaWFsb2dfdGV4dCk7Ci0JCWRpYWxvZy5zZXRGaWx0ZXJQYXRoKExpYnJhcnlVSVByZWZlcmVuY2VzLmdldERlZmF1bHRMaWJyYXJ5UGF0aCgpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBmaWx0ZXIgcGF0aC4KLQkgKiAKLQkgKiBAcGFyYW0gcGF0aAotCSAqICAgICAgICAgICAgVGhlIGZpbHRlciBwYXRoLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZpbHRlclBhdGgoU3RyaW5nIHBhdGgpIHsKLQkJZGlhbG9nLnNldEZpbHRlclBhdGgocGF0aCk7Ci0JfQotCi0JLyoqCi0JICogTWFrZXMgdGhlIGRpYWxvZyB2aXNpYmxlIGFuZCBicmluZ3MgaXQgdG8gdGhlIGZyb250IG9mIHRoZSBkaXNwbGF5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgb3BlbigpIHsKLQkJcmV0dXJuIGRpYWxvZy5vcGVuKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvZGlhbG9ncy9VbmNhbmNlbGFibGVMaXN0U2VsZWN0aW9uRGlhbG9nLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvZGlhbG9ncy9VbmNhbmNlbGFibGVMaXN0U2VsZWN0aW9uRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhZjNhYzEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL2RpYWxvZ3MvVW5jYW5jZWxhYmxlTGlzdFNlbGVjdGlvbkRpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24uICBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuZGlhbG9nczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuTGlzdFNlbGVjdGlvbkRpYWxvZzsKLQotLyoqCi0gKiBUaGlzIGRpYWxvZyBleHRlbmRzIGpmYWNlIExpc3RTZWxlY3Rpb25EaWFsb2cgYW5kIHJlbW92ZXMgY2FuY2VsIGJ1dHRvbgotICAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjEKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBVbmNhbmNlbGFibGVMaXN0U2VsZWN0aW9uRGlhbG9nIGV4dGVuZHMgTGlzdFNlbGVjdGlvbkRpYWxvZyB7Ci0KLQlwdWJsaWMgVW5jYW5jZWxhYmxlTGlzdFNlbGVjdGlvbkRpYWxvZyhTaGVsbCBwYXJlbnRTaGVsbCwgT2JqZWN0IGlucHV0LAotICAgICAgICAgICAgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIgY29udGVudFByb3ZpZGVyLAotICAgICAgICAgICAgSUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlciwgU3RyaW5nIG1lc3NhZ2UpCi0JewotCQlzdXBlcihwYXJlbnRTaGVsbCwgaW5wdXQsIGNvbnRlbnRQcm92aWRlciwgbGFiZWxQcm92aWRlciwgbWVzc2FnZSk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUJ1dHRvbnNGb3JCdXR0b25CYXIoQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICBjcmVhdGVCdXR0b24ocGFyZW50LCBJRGlhbG9nQ29uc3RhbnRzLk9LX0lELCBJRGlhbG9nQ29uc3RhbnRzLk9LX0xBQkVMLAotICAgICAgICAgICAgICAgIHRydWUpOwotICAgICAgIAotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9kaWFsb2dzL1VzZXJJbnB1dHNEaWFsb2cuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9kaWFsb2dzL1VzZXJJbnB1dHNEaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWIwZjY1Zi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvZGlhbG9ncy9Vc2VySW5wdXRzRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MDggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuZGlhbG9nczsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5Vc2VySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLklWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkucHJvdmlkZXJzLkRlbGVnYXRlTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkFycmF5Q29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ29tYm9WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRm9jdXNBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRm9jdXNFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SR0I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLQotLyoqCi0gKiBUaGlzIGRpYWxvZyBhY3RzIGFzIGEgaW5wdXQgZGlhbG9nIGR1cmluZyBjb21tYW5kIGV4ZWN1dGlvbiBiYXNlZCBvbiB1c2VyCi0gKiBpbnB1dCBhbmQgaW5wdXRUeXBlIGRpYWxvZyBiZWhhdmlvdXIgY2hhbmdlcy4KLSAqIAotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBVc2VySW5wdXRzRGlhbG9nIGV4dGVuZHMgRGlhbG9nIHsKLQotCUlTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyIGNvbnRlbnRQcm92aWRlcjsKLQotCUlMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXI7Ci0KLQlwcml2YXRlIFN0cmluZyB0aXRsZTsKLQotCXByaXZhdGUgU3RyaW5nIGdsb2JhbEVycm9yVHh0ID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwcml2YXRlIFN0cmluZyBtZXNzYWdlOwotCi0JcHJpdmF0ZSBMaXN0IHVzZXJJbnB1dHM7Ci0KLQlwcml2YXRlIGJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0KLQlMYWJlbCBtZXNzYWdlQXJlYTsKLQotCUxhYmVsIGVycm9yQXJlYTsKLQotCUhhc2hNYXA8T2JqZWN0LE9iamVjdD4gb2xkSW5mb0ZvckNhbmNlbDsKLQkKLQlwcml2YXRlIENvbG9yIHJlZENvbG9yOwotCQotCXB1YmxpYyBVc2VySW5wdXRzRGlhbG9nKFNoZWxsIHBhcmVudFNoZWxsLCBMaXN0IHVzZXJJbnB1dHMsIFN0cmluZyB0aXRsZSwKLQkJCVN0cmluZyBtZXNzYWdlKSB7Ci0JCXN1cGVyKHBhcmVudFNoZWxsKTsKLQkJdGhpcy50aXRsZSA9IHRpdGxlOwotCQl0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlOwotCQl0aGlzLnVzZXJJbnB1dHMgPSB1c2VySW5wdXRzOwotCQlvbGRJbmZvRm9yQ2FuY2VsID0gbmV3IEhhc2hNYXA8T2JqZWN0LE9iamVjdD4oKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gdGl0bGUKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUaXRsZShTdHJpbmcgdGl0bGUpIHsKLQkJdGhpcy50aXRsZSA9IHRpdGxlOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBtc2cKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNZXNzYWdlKFN0cmluZyBtZXNzYWdlKSB7Ci0JCXRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGEgVHJlZSBWaWV3ZXIuCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlVHJlZVZpZXdlcihDb21wb3NpdGUgcGFyZW50LCBVc2VySW5wdXQgdXNlcklucHV0KSB7Ci0JCVRyZWVWaWV3ZXIgdmlld2VyOwotCQlpZiAoIXVzZXJJbnB1dC5pc011bHRpcGxlKCkpIHsKLQkJCXZpZXdlciA9IG5ldyBUcmVlVmlld2VyKHBhcmVudCwgU1dULlNJTkdMRSB8IFNXVC5IX1NDUk9MTAotCQkJCQl8IFNXVC5WX1NDUk9MTCB8IFNXVC5CT1JERVIpOwotCQl9IGVsc2UgewotCQkJdmlld2VyID0gbmV3IFRyZWVWaWV3ZXIocGFyZW50LCBTV1QuTVVMVEkgfCBTV1QuSF9TQ1JPTEwKLQkJCQkJfCBTV1QuVl9TQ1JPTEwgfCBTV1QuQk9SREVSKTsKLQkJfQotCi0JCUdyaWREYXRhIHNwZWMgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJewotCQkJc3BlYy53aWR0aEhpbnQgPSAyMDA7Ci0JCQlzcGVjLmhlaWdodEhpbnQgPSAyMDA7Ci0JCQlzcGVjLmhvcml6b250YWxTcGFuID0gMzsKLQkJCXZpZXdlci5nZXRDb250cm9sKCkuc2V0TGF5b3V0RGF0YShzcGVjKTsKLQkJfQotCQl2aWV3ZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewotCi0JCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQkJCQotCQkJfQotCi0JCX0pOwotCi0JCWlmICh2aWV3ZXIgIT0gbnVsbCkgewotCQkJdmlld2VyLnNldExhYmVsUHJvdmlkZXIobGFiZWxQcm92aWRlcik7Ci0JCQlpZiAoY29udGVudFByb3ZpZGVyICE9IG51bGwpIHsKLQkJCQl2aWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKGNvbnRlbnRQcm92aWRlcik7Ci0JCQl9IGVsc2UgewotCQkJCXZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIobmV3IEFycmF5Q29udGVudFByb3ZpZGVyKCkpOwotCQkJfQotCQkJdmlld2VyLnNldFVzZUhhc2hsb29rdXAodHJ1ZSk7Ci0KLQkJCXZpZXdlci5zZXRJbnB1dCh1c2VySW5wdXQuZ2V0Q2hvaWNlcygpKTsKLQkJCXZpZXdlci5nZXRDb250cm9sKCkuc2V0Rm9udChwYXJlbnQuZ2V0Rm9udCgpKTsKLQkJCS8vIFRPRE86IHRyZWVWaWV3ZXIgU29ydGVyIGFuZCBFeHBhbmQvQ29sbGFwc2UKLQkJfQotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBUYWJsZVZpZXdlcgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZVRhYmxlVmlld2VyKENvbXBvc2l0ZSBwYXJlbnQsIFVzZXJJbnB1dCB1c2VySW5wdXQpIHsKLQkJVGFibGVWaWV3ZXIgdmlld2VyID0gbmV3IFRhYmxlVmlld2VyKHBhcmVudCk7Ci0JCXZpZXdlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0KLQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJCi0JCQl9Ci0JCX0pOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBUZXh0IGNvbnRyb2wKLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogQHBhcmFtIHVzZXJJbnB1dAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZVRleHQoQ29tcG9zaXRlIHBhcmVudCwgVXNlcklucHV0IHVzZXJJbnB1dCkgewotCQlmaW5hbCBVc2VySW5wdXQgbG9jYWxpbnB1dCA9IHVzZXJJbnB1dDsKLQkJZmluYWwgSVZhbGlkYXRvciB2YWxpZGF0b3IgPSB1c2VySW5wdXQuZ2V0VmFsaWRhdG9yKCk7Ci0JCWZpbmFsIFRleHQgdGV4dCA9IG5ldyBUZXh0KHBhcmVudCwgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIpOwotCQl0ZXh0LnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSkpOwotCQlpZiAodXNlcklucHV0LmdldElucHV0KCkgIT0gbnVsbCkgewotCQkJdGV4dC5zZXRUZXh0KChTdHJpbmcpIHVzZXJJbnB1dC5nZXRJbnB1dCgpKTsKLQkJfQotCQl0ZXh0LmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotCQkJCWdldEJ1dHRvbihPSykuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQllcnJvckFyZWEuc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlTdHJpbmcgZXJyb3JUeHQgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJCWlmICh2YWxpZGF0b3IgIT0gbnVsbCkgewotCQkJCQllcnJvclR4dCA9IHZhbGlkYXRvci5pc1ZhbGlkKHRleHQuZ2V0VGV4dCgpKTsKLQkJCQkJaWYgKGVycm9yVHh0ICE9IG51bGwgJiYgZXJyb3JUeHQubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJCQllcnJvckFyZWEuc2V0VGV4dChlcnJvclR4dCk7Ci0JCQkJCQlnZXRCdXR0b24oT0spLnNldEVuYWJsZWQoZmFsc2UpOwkJCQkJCi0JCQkJCX0gZWxzZSB7Ci0JCQkJCQllcnJvckFyZWEuc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCQlnbG9iYWxFcnJvclR4dCA9IGVycm9yVHh0OwotCQkJCX0KLQkJCQlpZiAoZXJyb3JUeHQgPT0gbnVsbCB8fCBlcnJvclR4dC5sZW5ndGgoKSA8PSAwKSB7Ci0JCQkJCWxvY2FsaW5wdXQuc2V0SW5wdXQodGV4dC5nZXRUZXh0KCkpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJdGV4dC5hZGRGb2N1c0xpc3RlbmVyKG5ldyBGb2N1c0FkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBmb2N1c0xvc3QoRm9jdXNFdmVudCBlKSB7Ci0JCQkJU3RyaW5nIGVycm9yVHh0ID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCQlpZiAodmFsaWRhdG9yICE9IG51bGwpIHsKLQkJCQkJZXJyb3JUeHQgPSB2YWxpZGF0b3IuaXNWYWxpZCh0ZXh0LmdldFRleHQoKSk7Ci0JCQkJCWlmIChlcnJvclR4dCAhPSBudWxsICYmIGVycm9yVHh0Lmxlbmd0aCgpID4gMCkgewotCQkJCQkJZXJyb3JBcmVhLnNldFRleHQoZXJyb3JUeHQpOwotCQkJCQkJZ2V0QnV0dG9uKE9LKS5zZXRFbmFibGVkKGZhbHNlKTsJCQkJCQotCQkJCQl9IGVsc2UgewotCQkJCQkJZXJyb3JBcmVhLnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQkJZ2xvYmFsRXJyb3JUeHQgPSBlcnJvclR4dDsKLQkJCQl9Ci0JCQkJaWYgKGVycm9yVHh0ID09IG51bGwgfHwgZXJyb3JUeHQubGVuZ3RoKCkgPD0gMCkgewotCQkJCQlsb2NhbGlucHV0LnNldElucHV0KHRleHQuZ2V0VGV4dCgpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCX0KLQotCS8qKgotCSAqIE1ldGhvZCB0byBzZXRJbnB1dCwgc3ViY2xhc3MgY2FuIG92ZXJyaWRlIGl0LgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldElucHV0KFVzZXJJbnB1dCBpbnB1dCwgT2JqZWN0IG9iaikgewotCQlpbnB1dC5zZXRJbnB1dChvYmopOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBDb21ib3ZpZXdlci4KLQkgKiAKLQkgKiBAcGFyYW0gY29tcG9zaXRlCi0JICogQHBhcmFtIHVzZXJJbnB1dAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUNvbWJvVmlld2VyKENvbXBvc2l0ZSBjb21wb3NpdGUsIFVzZXJJbnB1dCB1c2VySW5wdXQpIHsKLQkJZmluYWwgVXNlcklucHV0IGxvY2FsSW5wdXQgPSB1c2VySW5wdXQ7Ci0JCWZpbmFsIElWYWxpZGF0b3IgdmFsaWRhdG9yID0gdXNlcklucHV0LmdldFZhbGlkYXRvcigpOwotCQlmaW5hbCBDb21ib1ZpZXdlciB2aWV3ZXIgPSBuZXcgQ29tYm9WaWV3ZXIoY29tcG9zaXRlKTsKLQkJdmlld2VyLmdldENvbWJvKCkuc2V0TGF5b3V0RGF0YSgKLQkJCQluZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlKSk7Ci0JCXZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIobmV3IEFycmF5Q29udGVudFByb3ZpZGVyKCkpOwotCQlpZiAodXNlcklucHV0LmdldExhYmVsUHJvdmlkZXIoKSAhPSBudWxsKSB7Ci0JCQl2aWV3ZXIuc2V0TGFiZWxQcm92aWRlcihuZXcgRGVsZWdhdGVMYWJlbFByb3ZpZGVyKHVzZXJJbnB1dC5nZXRMYWJlbFByb3ZpZGVyKCkpKTsKLQkJfQotCQlMaXN0IGNob2ljZXMgPSB1c2VySW5wdXQuZ2V0Q2hvaWNlcygpOwotCQl2aWV3ZXIuc2V0SW5wdXQoY2hvaWNlcyk7Ci0JCWlmIChjaG9pY2VzICE9IG51bGwgJiYgY2hvaWNlcy5zaXplKCkgPiAwKSB7Ci0JCQl2aWV3ZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKGNob2ljZXMuZ2V0KDApKSk7Ci0JCQlsb2NhbElucHV0LnNldElucHV0KGNob2ljZXMuZ2V0KDApKTsKLQkJfQotCQl2aWV3ZXIuZ2V0Q29tYm8oKS5hZGRGb2N1c0xpc3RlbmVyKG5ldyBGb2N1c0FkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBmb2N1c0xvc3QoRm9jdXNFdmVudCBlKSB7Ci0JCQkJU3RyaW5nIGVycm9yVHh0ID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3RlZCA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgdmlld2VyCi0JCQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJaWYgKHZhbGlkYXRvciA9PSBudWxsIHx8IHNlbGVjdGVkID09IG51bGwpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlJU3RhdHVzIHN0YXR1cyA9IHZhbGlkYXRvci5pc1ZhbGlkKHNlbGVjdGVkLmdldEZpcnN0RWxlbWVudCgpKTsKLQkJCQlpZiAoc3RhdHVzLmdldFNldmVyaXR5KCkgPT0gSVN0YXR1cy5FUlJPUikgewotCQkJCQllcnJvclR4dCA9IHN0YXR1cy5nZXRNZXNzYWdlKCk7Ci0JCQkJfQotCQkJCWlmIChlcnJvclR4dCAhPSBudWxsICYmIGVycm9yVHh0Lmxlbmd0aCgpID4gMCkgewotCQkJCQllcnJvckFyZWEuc2V0VGV4dChlcnJvclR4dCk7Ci0JCQkJCWdldEJ1dHRvbihPSykuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJfSBpZiAoZ2xvYmFsRXJyb3JUeHQgIT0gbnVsbCAmJiBnbG9iYWxFcnJvclR4dC5sZW5ndGgoKSA+IDApIHsKLQkJCQkJZXJyb3JBcmVhLnNldFRleHQoZ2xvYmFsRXJyb3JUeHQpOwotCQkJCQlnZXRCdXR0b24oT0spLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCX0KLQkJCQllbHNlCi0JCQkJCWVycm9yQXJlYS5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9KTsKLQkJdmlld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQotCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQlnZXRCdXR0b24oT0spLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJZXJyb3JBcmVhLnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0KLQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGV2ZW50Ci0JCQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJT2JqZWN0IG9iaiA9IHNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCQlTdHJpbmcgZXJyb3JUeHQgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJCWlmICh2YWxpZGF0b3IgIT0gbnVsbCkgewotCQkJCQlJU3RhdHVzIHN0YXR1cyA9IHZhbGlkYXRvci5pc1ZhbGlkKG9iaik7Ci0JCQkJCWlmIChzdGF0dXMuZ2V0Q29kZSgpID09IElTdGF0dXMuRVJST1IpIHsKLQkJCQkJCWVycm9yVHh0ID0gc3RhdHVzLmdldE1lc3NhZ2UoKTsKLQkJCQkJfQotCQkJCQlpZiAoZXJyb3JUeHQgIT0gbnVsbCAmJiBlcnJvclR4dC5sZW5ndGgoKSA+IDApIHsKLQkJCQkJCWVycm9yQXJlYS5zZXRUZXh0KGVycm9yVHh0KTsKLQkJCQkJfQotCQkJCQllbHNlIGlmIChnbG9iYWxFcnJvclR4dCAhPSBudWxsICYmIGdsb2JhbEVycm9yVHh0Lmxlbmd0aCgpID4gMCkgewotCQkJCQkJZXJyb3JBcmVhLnNldFRleHQoZ2xvYmFsRXJyb3JUeHQpOwotCQkJCQkJZ2V0QnV0dG9uKE9LKS5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQkJfQotCQkJCQllbHNlCi0JCQkJCQllcnJvckFyZWEuc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQkJaWYgKGVycm9yVHh0ID09IG51bGwgfHwgZXJyb3JUeHQubGVuZ3RoKCkgPD0gMCkgewotCQkJCQlsb2NhbElucHV0LnNldElucHV0KG9iaik7Ci0JCQkJfQotCQkJfQotCQl9KTsJCi0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGEgTGFiZWwgYW5kIFRleHQgZm9yIG1lc3NhZ2UgYXJlYS4KLQkgKiAKLQkgKiBAcGFyYW0gY29tcG9zaXRlCi0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBMYWJlbCBjcmVhdGVNZXNzYWdlQXJlYShDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JCUNvbXBvc2l0ZSBtZXNzYWdlQXJlYUNvbXAgPSBuZXcgQ29tcG9zaXRlKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlHcmlkTGF5b3V0IGdyaWRMYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlncmlkTGF5b3V0Lm1hcmdpbkxlZnQgPSAwOwotCQltZXNzYWdlQXJlYUNvbXAuc2V0TGF5b3V0KGdyaWRMYXlvdXQpOwotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQltZXNzYWdlQXJlYUNvbXAuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCQotCQltZXNzYWdlQXJlYSA9IG5ldyBMYWJlbChtZXNzYWdlQXJlYUNvbXAsIFNXVC5XUkFQKTsKLQkJaWYgKG1lc3NhZ2UgIT0gbnVsbCkgewotCQkJbWVzc2FnZUFyZWEuc2V0VGV4dChtZXNzYWdlKTsKLQkJfQotCQlnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlnZC5taW5pbXVtV2lkdGggPSA0MDA7Ci0JCW1lc3NhZ2VBcmVhLnNldExheW91dERhdGEoZ2QpOwotCQlhcHBseURpYWxvZ0ZvbnQobWVzc2FnZUFyZWEpOwotCQlMYWJlbCBzZXBhcmF0b3IgPSBuZXcgTGFiZWwobWVzc2FnZUFyZWFDb21wLCBTV1QuSE9SSVpPTlRBTCB8IFNXVC5TRVBBUkFUT1IpOwotCQlHcmlkRGF0YSBnZDEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZ2QxLmhvcml6b250YWxTcGFuID0gMjsKLQkJc2VwYXJhdG9yLnNldExheW91dERhdGEoZ2QxKTsKLQkJcmV0dXJuIG1lc3NhZ2VBcmVhOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2cjY3JlYXRlRGlhbG9nQXJlYShvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCi0JICovCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSAoQ29tcG9zaXRlKSBzdXBlci5jcmVhdGVEaWFsb2dBcmVhKHBhcmVudCk7Ci0JCWNvbXBvc2l0ZS5zZXRGb250KHBhcmVudC5nZXRGb250KCkpOwotCi0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gKEdyaWRMYXlvdXQpIGNvbXBvc2l0ZS5nZXRMYXlvdXQoKTsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMTA7Ci0JCWxheW91dC5tYXJnaW5IZWlnaHQgPSAxMDsKLQkKLQkJLy8gY3JlYXRlIG1lc3NhZ2UgYXJlYQotCQljcmVhdGVNZXNzYWdlQXJlYShjb21wb3NpdGUpOwotCi0JCS8vIGNyZWF0ZSBkaWFsb2cgYXJlYQotCQlDb21wb3NpdGUgZGlhbG9nQXJlYSA9IG5ldyBDb21wb3NpdGUoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCUdyaWRMYXlvdXQgZGlhbG9nTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpOwotCQlkaWFsb2dMYXlvdXQubWFyZ2luTGVmdCA9IDA7Ci0JCWRpYWxvZ0FyZWEuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKSk7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCWRpYWxvZ0FyZWEuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCQotCQkvLyBDcmVhdGUgY29udHJvbHMgYmFzZWQgb24gVXNlcklucHV0cwotCQlpZiAodXNlcklucHV0cyAhPSBudWxsICYmIHVzZXJJbnB1dHMuc2l6ZSgpID4gMCkgewotCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IHVzZXJJbnB1dHMuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBvYmplY3QgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIFVzZXJJbnB1dCkgewotCQkJCQlVc2VySW5wdXQgdXNlcklucHV0ID0gKFVzZXJJbnB1dCkgb2JqZWN0OwotCi0JCQkJCS8vIFN0b3JlIHRoZSB1c2VySW5wdXQgaW4gdGhlIGhhc2htYXAgZm9yIGNhbmNlbCBhY3Rpb24uCi0JCQkJCW9sZEluZm9Gb3JDYW5jZWwucHV0KHVzZXJJbnB1dCwgdXNlcklucHV0LmdldElucHV0KCkpOwotCi0JCQkJCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKGRpYWxvZ0FyZWEsIFNXVC5OT05FKTsKLQkJCQkJbGFiZWwuc2V0VGV4dCh1c2VySW5wdXQuZ2V0TGFiZWwoKSk7Ci0JCQkJCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkJFR0lOTklORyk7Ci0JCQkJCWxhYmVsLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0JCQkJCWlmICh1c2VySW5wdXQuZ2V0VHlwZSgpID09IFVzZXJJbnB1dC5URVhUKSB7Ci0JCQkJCQljcmVhdGVUZXh0KGRpYWxvZ0FyZWEsIHVzZXJJbnB1dCk7Ci0JCQkJCX0gZWxzZSBpZiAodXNlcklucHV0LmdldFR5cGUoKSA9PSBVc2VySW5wdXQuU0VMRUNUSU9OKSB7Ci0JCQkJCQljcmVhdGVDb21ib1ZpZXdlcihkaWFsb2dBcmVhLCB1c2VySW5wdXQpOwotCQkJCQl9Ci0JCQkJCS8vIGNyZWF0ZUVtcHR5TGFiZWwoZGlhbG9nQXJlYSwgMik7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWNyZWF0ZUVycm9yQXJlYShjb21wb3NpdGUpOwotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBFcnJvciBBcmVhLgotCSAqIAotCSAqIEBwYXJhbSBjb21wb3NpdGUKLQkgKi8KLQlwcml2YXRlIHZvaWQgY3JlYXRlRXJyb3JBcmVhKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsJCi0JCUNvbXBvc2l0ZSBlcnJvckFyZWFDb21wID0gbmV3IENvbXBvc2l0ZShjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubWFyZ2luTGVmdCA9IDA7Ci0JCWVycm9yQXJlYUNvbXAuc2V0TGF5b3V0KGxheW91dCk7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCWVycm9yQXJlYUNvbXAuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCQotCQkvLyBjcmVhdGUgYmxhbmsgbGFiZWwKLS8vCQluZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuV1JBUCk7Ci0KLQkJZXJyb3JBcmVhID0gbmV3IExhYmVsKGVycm9yQXJlYUNvbXAsIFNXVC5XUkFQKTsKLQkJcmVkQ29sb3IgPSBuZXcgQ29sb3IobnVsbCwgbmV3IFJHQigyNTUsIDAsIDApKTsKLQkJaWYocmVkQ29sb3IgIT0gbnVsbCl7Ci0JCQllcnJvckFyZWEuc2V0Rm9yZWdyb3VuZChyZWRDb2xvcik7Ci0JCX0KLQkJCi0JCWdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCB8IEdyaWREYXRhLkdSQUJfVkVSVElDQUwpOwotCQlnZC5oZWlnaHRIaW50ID0gODA7Ci0JCWVycm9yQXJlYS5zZXRMYXlvdXREYXRhKGdkKTsKLQkJYXBwbHlEaWFsb2dGb250KGVycm9yQXJlYSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93I2NvbmZpZ3VyZVNoZWxsKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZVNoZWxsKFNoZWxsIG5ld1NoZWxsKSB7Ci0JCXN1cGVyLmNvbmZpZ3VyZVNoZWxsKG5ld1NoZWxsKTsKLQkJaWYgKHRoaXMudGl0bGUgIT0gbnVsbCkgewotCQkJbmV3U2hlbGwuc2V0VGV4dCh0aGlzLnRpdGxlKTsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2cjb2tQcmVzc2VkKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBva1ByZXNzZWQoKSB7Ci0JCXJlc3VsdCA9IHRydWU7CQkKLQkJc3VwZXIub2tQcmVzc2VkKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZyNjYW5jZWxQcmVzc2VkKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjYW5jZWxQcmVzc2VkKCkgewotCQlpZiAodXNlcklucHV0cyAhPSBudWxsICYmIHVzZXJJbnB1dHMuc2l6ZSgpID4gMCkgewotCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IHVzZXJJbnB1dHMuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBvYmplY3QgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIFVzZXJJbnB1dCkgewotCQkJCQlVc2VySW5wdXQgdXNlcklucHV0ID0gKFVzZXJJbnB1dCkgb2JqZWN0OwotCQkJCQl1c2VySW5wdXQuc2V0SW5wdXQob2xkSW5mb0ZvckNhbmNlbC5nZXQodXNlcklucHV0KSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXN1cGVyLmNhbmNlbFByZXNzZWQoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHRzLgotCSAqIAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBnZXRSZXN1bHQoKSB7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gY2xvc2UoKSB7Ci0JCWlmKHJlZENvbG9yICE9IG51bGwpewotCQkJcmVkQ29sb3IuZGlzcG9zZSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5jbG9zZSgpOwotCX0KLQkvKioKLQkgKiBDcmVhdGUgYSBlbXB0eSBsYWJlbC4KLQkgKiAKLQkgKiBAcGFyYW0gY29tcG9zaXRlCi0JICogQHBhcmFtIHNwYW4KLQkgKi8KLQkvLyBwcml2YXRlIHZvaWQgY3JlYXRlRW1wdHlMYWJlbChDb21wb3NpdGUgY29tcG9zaXRlLCBpbnQgc3Bhbil7Ci0JLy8gTGFiZWwgZW1wdHlMYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkvLyBlbXB0eUxhYmVsLnNldEJhY2tncm91bmQoQ29sb3JzLklOSEVSSVRFRF9FTEVNRU5UX0xBQkVMKTsKLQkvLyBHcmlkRGF0YSBlbXB0eURhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkvLyBlbXB0eUxhYmVsLnNldFRleHQoIiIpOwotCS8vIGVtcHR5RGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCS8vIGVtcHR5RGF0YS5ob3Jpem9udGFsU3BhbiA9c3BhbjsKLQkvLyBlbXB0eURhdGEuaGVpZ2h0SGludCA9IDM7Ci0JLy8gZW1wdHlMYWJlbC5zZXRMYXlvdXREYXRhKGVtcHR5RGF0YSk7Ci0JLy8gfQotCS8qKgotCSAqIHZhbGlkYXRlcyB0aGUgaW5wdXQgd2l0aCBnaXZlbiBWYWxpZGF0b3IgaW4gVXNlcklucHV0LgotCSAqLwotCS8vIHByaXZhdGUgYm9vbGVhbiB2YWxpZGF0ZSgpIHsKLQkvLyBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB1c2VySW5wdXRzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCS8vIFVzZXJJbnB1dCBlbGVtZW50ID0gKFVzZXJJbnB1dCkgaXRlci5uZXh0KCk7Ci0JLy8gSVZhbGlkYXRvciB2YWxpZGF0b3IgPSBlbGVtZW50LmdldFZhbGlkYXRvcigpOwotCS8vIGlmICh2YWxpZGF0b3IgIT0gbnVsbCkgewotCS8vIGlmIChlbGVtZW50LmdldFR5cGUoKSA9PSBVc2VySW5wdXQuVEVYVCkgewotCS8vIGVycm9yVHh0ICs9IHZhbGlkYXRvcgotCS8vIC5pc1ZhbGlkKGVsZW1lbnQuZ2V0SW5wdXQoKS50b1N0cmluZygpKTsKLQkvLyB9IGVsc2UgewotCS8vIGVycm9yVHh0ICs9IHZhbGlkYXRvci5pc1ZhbGlkKGVsZW1lbnQuZ2V0SW5wdXQoKSk7Ci0JLy8gfQotCS8vIH0KLQkvLyB9Ci0JLy8gZXJyb3JUeHQgPSAiU3lzdGVtIG91dCB0ZXN0aW5nIjsKLQkvLyBpZiAoZXJyb3JUeHQgIT0gbnVsbCAmJiBlcnJvclR4dC5sZW5ndGgoKSA+IDApIHsKLQkvLyBlcnJvckFyZWEuc2V0VGV4dChlcnJvclR4dCk7Ci0JLy8gZXJyb3JBcmVhLnNldEZvcmVncm91bmQoQ29sb3JDb25zdGFudHMucmVkKTsKLQkvLyByZXR1cm4gZmFsc2U7Ci0JLy8gfQotCS8vIHJldHVybiB0cnVlOwotCS8vIH0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9kaWFsb2dzL3BhY2thZ2UuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9kaWFsb2dzL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTQwMDc2Yy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvZGlhbG9ncy9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyBkaWFsb2dzIGZvciBtYW5hZ2luZyBhIG1ldGhvZCBsaWJyYXJ5LgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9pbnRlcm5hbC93aXphcmRzL05ld0xpYnJhcnlXaXphcmRQYWdlQ29udHJpYnV0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvaW50ZXJuYWwvd2l6YXJkcy9OZXdMaWJyYXJ5V2l6YXJkUGFnZUNvbnRyaWJ1dGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NDEzNmE2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9pbnRlcm5hbC93aXphcmRzL05ld0xpYnJhcnlXaXphcmRQYWdlQ29udHJpYnV0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5pbnRlcm5hbC53aXphcmRzOwotCi1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLQotLyoqCi0gKiBNb2RlbHMgdGhlIDxuZXdMaWJyYXJ5V2l6YXJkUGFnZT4gZWxlbWVudCBpbiB0aGUKLSAqICJvcmcuZWNsaXBzZS5lcGYubGlicnJheS51aS5uZXdMaWJyYXJ5V2l6YXJkUGFnZXMiIGV4dGVuc2lvbiBwb2ludC4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBOZXdMaWJyYXJ5V2l6YXJkUGFnZUNvbnRyaWJ1dGlvbiB7Ci0KLQkvLyBUaGUgcGx1Zy1pbiB0aGF0IGNvbnRyaWJ1dGVkIHRoaXMgcHJvdmlkZXIuCi0JcHJpdmF0ZSBCdW5kbGUgYnVuZGxlOwotCi0JLy8gVGhlIHdpemFyZCBwYWdlIGNsYXNzIG5hbWUuCi0JcHJpdmF0ZSBTdHJpbmcgY2xhc3NOYW1lOwotCi0JLy8gVGhlIGxpYnJhcnkgdHlwZSBpZGVudGlmaWVyLgotCXByaXZhdGUgU3RyaW5nIHR5cGVJZDsKLQotCS8vIFRoZSB3aXphcmQgcGFnZSB0aXRsZS4KLQlwcml2YXRlIFN0cmluZyB0aXRsZTsKLQotCS8vIFRoZSB3aXphcmQgcGFnZSBkZXNjcmlwdGlvbi4KLQlwcml2YXRlIFN0cmluZyBkZXNjcmlwdGlvbjsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIE5ld0xpYnJhcnlXaXphcmRQYWdlQ29udHJpYnV0aW9uKEJ1bmRsZSBidW5kbGUsIFN0cmluZyBjbGFzc05hbWUsCi0JCQlTdHJpbmcgdHlwZUlkLCBTdHJpbmcgdGl0bGUsIFN0cmluZyBkZXNjcmlwdGlvbikgewotCQl0aGlzLmJ1bmRsZSA9IGJ1bmRsZTsKLQkJdGhpcy5jbGFzc05hbWUgPSBjbGFzc05hbWU7Ci0JCXRoaXMudHlwZUlkID0gdHlwZUlkOwotCQl0aGlzLnRpdGxlID0gdGl0bGU7Ci0JCXRoaXMuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwbHVnLWluIHRoYXQgY29udHJpYnV0ZWQgdGhpcyBwcm92aWRlci4KLQkgKi8KLQlwdWJsaWMgQnVuZGxlIGdldEJ1bmRsZSgpIHsKLQkJcmV0dXJuIGJ1bmRsZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB3aXphcmQgcGFnZSBjbGFzcyBuYW1lLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q2xhc3NOYW1lKCkgewotCQlyZXR1cm4gY2xhc3NOYW1lOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGhvZCBsaWJyYXJ5IHR5cGUgaWRlbnRpZmllci4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGVJZCgpIHsKLQkJcmV0dXJuIHR5cGVJZDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB3aXphcmQgcGFnZSB0aXRsZS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRpdGxlKCkgewotCQlyZXR1cm4gdGl0bGU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgd2l6YXJkIHBhZ2UgZGVzY3JpcHRpb24uCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIGRlc2NyaXB0aW9uOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL2ludGVybmFsL3dpemFyZHMvT3BlbkxpYnJhcnlNYWluUGFnZTIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9pbnRlcm5hbC93aXphcmRzL09wZW5MaWJyYXJ5TWFpblBhZ2UyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3ZTlmYmEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL2ludGVybmFsL3dpemFyZHMvT3BlbkxpYnJhcnlNYWluUGFnZTIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5pbnRlcm5hbC53aXphcmRzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlNYW5hZ2VyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5MaWJyYXJ5VUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuTGlicmFyeVVJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLnByZWZlcmVuY2VzLkxpYnJhcnlVSVByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLnByZWZlcmVuY2VzLlJlY2VudGx5T3BlbmVkTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS53aXphcmRzLk9wZW5MaWJyYXJ5V2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudWkud2l6YXJkcy5CYXNlV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLQotLyoqCi0gKiBBIHdpemFyZCBwYWdlIHRoYXQgcHJvbXB0cyB0aGUgdXNlciB0byBlbnRlciB0aGUgbmFtZSwgYnJpZWYgZGVzY3JpcHRpb24gYW5kCi0gKiB0eXBlIGZvciBhIG5ldyBtZXRob2QgbGlicmFyeS4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4yCi0gKiBAZGVwcmVjYXRlZAotICovCi1wdWJsaWMgY2xhc3MgT3BlbkxpYnJhcnlNYWluUGFnZTIgZXh0ZW5kcyBCYXNlV2l6YXJkUGFnZSB7Ci0KLQkvKioKLQkgKiBUaGUgd2l6YXJkIHBhZ2UgbmFtZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQUdFX05BTUUgPSBPcGVuTGlicmFyeU1haW5QYWdlMi5jbGFzcy5nZXROYW1lKCk7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBUWVBFX0lEID0gInR5cGVJZCI7IC8vJE5PTi1OTFMtMSQJCi0KLQlwcm90ZWN0ZWQgQ29tYm8gbmFtZUNvbWJvOwotCi0JcHJvdGVjdGVkIFRleHQgdXJpVGV4dDsKLQotCXByb3RlY3RlZCBCdXR0b24gb3BlblVubGlzdGVkTGlicmFyeUNoZWNrYm94OwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gb3BlblVubGlzdGVkTGlicmFyeSA9IGZhbHNlOwotCi0JcHJvdGVjdGVkIEJ1dHRvbltdIHJhZGlvQnV0dG9uczsKLQotCXByb3RlY3RlZCBNYXA8U3RyaW5nLCBSZWNlbnRseU9wZW5lZExpYnJhcnk+IHJlY2VudGx5T3BlbmVkTGlicmFyaWVzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBSZWNlbnRseU9wZW5lZExpYnJhcnk+KCk7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBPcGVuTGlicmFyeU1haW5QYWdlMigpIHsKLQkJc3VwZXIoUEFHRV9OQU1FKTsKLQkJc2V0VGl0bGUoTGlicmFyeVVJUmVzb3VyY2VzLm9wZW5MaWJyYXJ5V2l6YXJkX3RpdGxlKTsKLQkJc2V0RGVzY3JpcHRpb24oTGlicmFyeVVJUmVzb3VyY2VzLm9wZW5MaWJyYXJ5TWFpbldpemFyZFBhZ2VfdGl0bGVfMik7Ci0JCXNldEltYWdlRGVzY3JpcHRvcihMaWJyYXJ5VUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcigKLQkJCQkiZnVsbC93aXpiYW4vT3Blbi5naWYiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ1BhZ2UjY3JlYXRlQ29udHJvbChDb21wb3NpdGUpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKSk7Ci0KLQkJTGFiZWwgbmFtZUxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PUk1BTCk7Ci0JCW5hbWVMYWJlbC5zZXRUZXh0KExpYnJhcnlVSVJlc291cmNlcy5uYW1lTGFiZWxfdGV4dCk7Ci0KLQkJbmFtZUNvbWJvID0gbmV3IENvbWJvKGNvbXBvc2l0ZSwgU1dULkJPUkRFUiB8IFNXVC5SRUFEX09OTFkpOwotCQluYW1lQ29tYm8uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLQkJLy8gU2V0IHRoZSBjb25maWd1cmF0aW9uIGxpc3QuCi0JCUxpc3QgbGlicmFyeUxpc3QgPSBnZXRSZWNlbnRseU9wZW5lZExpYnJhcmllcygpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gbGlicmFyeUxpc3QuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJUmVjZW50bHlPcGVuZWRMaWJyYXJ5IGxpYnJhcnkgPSAoUmVjZW50bHlPcGVuZWRMaWJyYXJ5KSBpdC5uZXh0KCk7Ci0JCQlyZWNlbnRseU9wZW5lZExpYnJhcmllcy5wdXQobGlicmFyeS5nZXROYW1lKCksIGxpYnJhcnkpOwotCQl9Ci0JCVN0cmluZ1tdIGxpYnJhcnlOYW1lcyA9IG5ldyBTdHJpbmdbcmVjZW50bHlPcGVuZWRMaWJyYXJpZXMuc2l6ZSgpXTsKLQkJcmVjZW50bHlPcGVuZWRMaWJyYXJpZXMua2V5U2V0KCkudG9BcnJheShsaWJyYXJ5TmFtZXMpOwotCQluYW1lQ29tYm8uc2V0SXRlbXMobGlicmFyeU5hbWVzKTsKLQotCQlMYWJlbCB1cmlMYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT1JNQUwpOwotCQl1cmlMYWJlbC5zZXRUZXh0KExpYnJhcnlVSVJlc291cmNlcy51cmlMYWJlbF90ZXh0KTsKLQotCQl1cmlUZXh0ID0gbmV3IFRleHQoY29tcG9zaXRlLCBTV1QuQk9SREVSKTsKLQkJdXJpVGV4dC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJdXJpVGV4dC5zZXRFZGl0YWJsZShmYWxzZSk7Ci0KLQkJb3BlblVubGlzdGVkTGlicmFyeUNoZWNrYm94ID0gbmV3IEJ1dHRvbihjb21wb3NpdGUsIFNXVC5DSEVDSyk7Ci0JCW9wZW5Vbmxpc3RlZExpYnJhcnlDaGVja2JveAotCQkJCS5zZXRUZXh0KExpYnJhcnlVSVJlc291cmNlcy5vcGVuVW5saXN0ZWRMaWJyYXJ5Q2hlY2tib3hfdGV4dCk7Ci0JCW9wZW5Vbmxpc3RlZExpYnJhcnlDaGVja2JveC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YSgKLQkJCQlHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJKChHcmlkRGF0YSkgb3BlblVubGlzdGVkTGlicmFyeUNoZWNrYm94LmdldExheW91dERhdGEoKSkuaG9yaXpvbnRhbFNwYW4gPSAyOwotCi0JCUxhYmVsIGxpYnJhcnlUeXBlTGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9STUFMKTsKLQkJbGlicmFyeVR5cGVMYWJlbC5zZXRUZXh0KExpYnJhcnlVSVJlc291cmNlcy5saWJyYXJ5VHlwZUxhYmVsX3RleHQpOwotCi0JCUNvbXBvc2l0ZSB0eXBlQ29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShjb21wb3NpdGUsIFNXVC5OT1JNQUwpOwotCQl0eXBlQ29tcG9zaXRlLnNldExheW91dChuZXcgR3JpZExheW91dCgyLCBmYWxzZSkpOwotCQl0eXBlQ29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCi0JCU1hcCB0eXBlcyA9IExpYnJhcnlNYW5hZ2VyRmFjdG9yeS5nZXRJbnN0YW5jZSgpLmdldExpYnJhcnlUeXBlcygpOwotCQlyYWRpb0J1dHRvbnMgPSBuZXcgQnV0dG9uW3R5cGVzLnNpemUoKV07Ci0JCWludCByYWRpb0J1dHRvbkluZGV4ID0gMDsKLQkJZm9yIChJdGVyYXRvciBpdCA9IHR5cGVzLmtleVNldCgpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCVN0cmluZyB0eXBlSWQgPSAoU3RyaW5nKSBpdC5uZXh0KCk7Ci0JCQlTdHJpbmcgdHlwZU5hbWUgPSAoU3RyaW5nKSB0eXBlcy5nZXQodHlwZUlkKTsKLQkJCUJ1dHRvbiByYWRpb0J1dHRvbiA9IG5ldyBCdXR0b24odHlwZUNvbXBvc2l0ZSwgU1dULlJBRElPKTsKLQkJCXJhZGlvQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJCXNldFBhZ2VDb21wbGV0ZShpc1BhZ2VDb21wbGV0ZSgpKTsKLQkJCQkJZ2V0V2l6YXJkKCkuZ2V0Q29udGFpbmVyKCkudXBkYXRlQnV0dG9ucygpOwotCQkJCX0KLQkJCX0pOwotCQkJcmFkaW9CdXR0b24uc2V0VGV4dCh0eXBlTmFtZSk7Ci0JCQlyYWRpb0J1dHRvbi5zZXREYXRhKFRZUEVfSUQsIHR5cGVJZCk7Ci0JCQlyYWRpb0J1dHRvbnNbcmFkaW9CdXR0b25JbmRleCsrXSA9IHJhZGlvQnV0dG9uOwotCQl9Ci0KLQkJaWYgKHJhZGlvQnV0dG9ucy5sZW5ndGggPiAwKSB7Ci0JCQlyYWRpb0J1dHRvbnNbMF0uc2V0U2VsZWN0aW9uKHRydWUpOwotCQl9Ci0KLQkJYWRkTGlzdGVuZXJzKCk7Ci0KLQkJc2V0UGFnZUNvbXBsZXRlKGlzUGFnZUNvbXBsZXRlKCkpOwotCi0JCXNldENvbnRyb2woY29tcG9zaXRlKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlI2dldE5leHRQYWdlKCkKLQkgKi8KLQlwdWJsaWMgSVdpemFyZFBhZ2UgZ2V0TmV4dFBhZ2UoKSB7Ci0JCU9wZW5MaWJyYXJ5V2l6YXJkUGFnZSB3aXphcmRQYWdlID0gT3BlbkxpYnJhcnlXaXphcmRQYWdlRmFjdG9yeQotCQkJCS5nZXRJbnN0YW5jZSgpLmdldFdpemFyZFBhZ2UoZ2V0TGlicmFyeVR5cGUoKSk7Ci0JCWlmICh3aXphcmRQYWdlICE9IG51bGwpIHsKLQkJCXdpemFyZFBhZ2Uub25FbnRlclBhZ2UoZ2V0TGlicmFyeU5hbWUoKSk7Ci0JCX0KLQkJaWYgKCFvcGVuVW5saXN0ZWRMaWJyYXJ5KSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gd2l6YXJkUGFnZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlI2lzQ29tcGxldGVkKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1BhZ2VDb21wbGV0ZSgpIHsKLQkJcmV0dXJuIGdldExpYnJhcnlOYW1lKCkubGVuZ3RoKCkgPiAwIHx8IG9wZW5Vbmxpc3RlZExpYnJhcnk7Ci0JfQotCi0JLyoqCi0JICogQWRkcyBsaXN0ZW5lcnMgdG8gdGhlIHdpemFyZCBjb250cm9scy4KLQkgKi8KLQlwcml2YXRlIHZvaWQgYWRkTGlzdGVuZXJzKCkgewotCQluYW1lQ29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlnZXRXaXphcmQoKS5nZXRDb250YWluZXIoKS51cGRhdGVCdXR0b25zKCk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJfQotCQl9KTsKLQotCQlvcGVuVW5saXN0ZWRMaWJyYXJ5Q2hlY2tib3gKLQkJCQkuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJCQlvcGVuVW5saXN0ZWRMaWJyYXJ5ID0gb3BlblVubGlzdGVkTGlicmFyeUNoZWNrYm94Ci0JCQkJCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQkJCQkJCWdldFdpemFyZCgpLmdldENvbnRhaW5lcigpLnVwZGF0ZUJ1dHRvbnMoKTsKLQkJCQkJfQotCQkJCX0pOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHVzZXIgc2VsZWN0ZWQgbWV0aG9kIGxpYnJhcnkgbmFtZS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExpYnJhcnlOYW1lKCkgewotCQlyZXR1cm4gbmFtZUNvbWJvLmdldFRleHQoKS50cmltKCk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgVVJJIG9mIHRoZSB1c2VyIHNlbGVjdGVkIG1ldGhvZCBsaWJyYXJ5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TGlicmFyeVVSSSgpIHsKLQkJUmVjZW50bHlPcGVuZWRMaWJyYXJ5IGxpYnJhcnkgPSAoUmVjZW50bHlPcGVuZWRMaWJyYXJ5KSByZWNlbnRseU9wZW5lZExpYnJhcmllcwotCQkJCS5nZXQoZ2V0TGlicmFyeU5hbWUoKSk7Ci0JCXJldHVybiBsaWJyYXJ5LmdldFVSSSgpLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgcGF0aCBvZiB0aGUgdXNlciBzZWxlY3RlZCBtZXRob2QgbGlicmFyeS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExpYnJhcnlQYXRoKCkgewotCQlSZWNlbnRseU9wZW5lZExpYnJhcnkgbGlicmFyeSA9IChSZWNlbnRseU9wZW5lZExpYnJhcnkpIHJlY2VudGx5T3BlbmVkTGlicmFyaWVzCi0JCQkJLmdldChnZXRMaWJyYXJ5TmFtZSgpKTsKLQkJcmV0dXJuIGxpYnJhcnkuZ2V0UGF0aCgpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIG9wZW4gdW5saXN0ZWQgbWV0aG9kIGxpYnJyYXkgb3B0aW9uLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzT3BlblVubGlzdGVkTGlicmFyeSgpIHsKLQkJcmV0dXJuIG9wZW5Vbmxpc3RlZExpYnJhcnk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdXNlciBzZWxlY3RlZCBtZXRob2QgbGlicmFyeSB0eXBlLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TGlicmFyeVR5cGUoKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmFkaW9CdXR0b25zLmxlbmd0aDsgaSsrKSB7Ci0JCQlCdXR0b24gcmFkaW9CdXR0b24gPSByYWRpb0J1dHRvbnNbaV07Ci0JCQlpZiAocmFkaW9CdXR0b24uZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCQlyZXR1cm4gKFN0cmluZykgcmFkaW9CdXR0b24uZ2V0RGF0YShUWVBFX0lEKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gKFN0cmluZykgcmFkaW9CdXR0b25zWzBdLmdldERhdGEoVFlQRV9JRCk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyBhIGxpc3Qgb2YgcmVjZW50bHkgb3BlbmVkIG1ldGhvZCBsaWJyYXJpZXMuCi0JICogCi0JICogQHJldHVybiBhIGNvbGxlY3Rpb24gb2YgPGNvZGU+UmVjZW50bHlPcGVuZWRMaWJyYXJ5PC9jb2RlPiBvYmplY3RzCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBMaXN0IGdldFJlY2VudGx5T3BlbmVkTGlicmFyaWVzKCkgewotCQlMaXN0IGxpYnJhcnlVUklzID0gTGlicmFyeVVJUHJlZmVyZW5jZXMuZ2V0T3BlbkxpYnJhcnlVUklzTGlzdCgpOwotCQlMaXN0PFJlY2VudGx5T3BlbmVkTGlicmFyeT4gbGlicmFyaWVzID0gbmV3IEFycmF5TGlzdDxSZWNlbnRseU9wZW5lZExpYnJhcnk+KCk7Ci0JCWlmIChsaWJyYXJ5VVJJcy5zaXplKCkgPiAwKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gbGlicmFyeVVSSXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCVN0cmluZyBsaWJyYXJ5VVJJID0gKFN0cmluZykgaXQubmV4dCgpOwotCQkJCWxpYnJhcmllcy5hZGQobmV3IFJlY2VudGx5T3BlbmVkTGlicmFyeShsaWJyYXJ5VVJJKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGxpYnJhcmllczsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9pbnRlcm5hbC93aXphcmRzL09wZW5MaWJyYXJ5V2l6YXJkMi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL2ludGVybmFsL3dpemFyZHMvT3BlbkxpYnJhcnlXaXphcmQyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4M2UxZGUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL2ludGVybmFsL3dpemFyZHMvT3BlbkxpYnJhcnlXaXphcmQyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuaW50ZXJuYWwud2l6YXJkczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24uc2VydmljZS52ZXJzaW9uaW5nLlZlcnNpb25VdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udWkudXRpbC5Nc2dEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeU1hbmFnZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLkxpYnJhcnlVSU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuTGlicmFyeVVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLkxpYnJhcnlVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5wcmVmZXJlbmNlcy5MaWJyYXJ5VUlQcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS53aXphcmRzLk9wZW5MaWJyYXJ5V2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkuWE1JTGlicmFyeU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pLlhNSUxpYnJhcnlVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5taWdyYXRpb24uVXBncmFkZUNhbGxlckluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSU5ld1dpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotCi0vKioKLSAqIEEgd2l6YXJkIHRoYXQgZ3VpZGVzIHRoZSB1c2VyIHRvIG9wZW4gYSBtZXRob2QgbGlicmFyeS4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4yCi0gKiBAZGVwcmVjYXRlZAotICovCi1wdWJsaWMgY2xhc3MgT3BlbkxpYnJhcnlXaXphcmQyIGV4dGVuZHMgV2l6YXJkIGltcGxlbWVudHMgSU5ld1dpemFyZCB7Ci0KLQkvKioKLQkgKiBUaGUgd2l6YXJkIElELgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdJWkFSRF9JRCA9IE9wZW5MaWJyYXJ5V2l6YXJkMi5jbGFzcy5nZXROYW1lKCk7Ci0KLQkvLyBUaGUgbWFpbiB3aXphcmQgcGFnZS4KLQlwcml2YXRlIE9wZW5MaWJyYXJ5TWFpblBhZ2UyIG1haW5QYWdlOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgT3BlbkxpYnJhcnlXaXphcmQyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpemFyZCNpbml0KElXb3JrYmVuY2gsCi0JICogICAgICBJU3RydWN0dXJlZFNlbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2ggd29ya2JlbmNoLCBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJc2V0V2luZG93VGl0bGUoTGlicmFyeVVJUmVzb3VyY2VzLm9wZW5MaWJyYXJ5V2l6YXJkX3RpdGxlKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmQjYWRkUGFnZXMoKQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFBhZ2VzKCkgewotCQltYWluUGFnZSA9IG5ldyBPcGVuTGlicmFyeU1haW5QYWdlMigpOwotCQlhZGRQYWdlKG1haW5QYWdlKTsKLQotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gTGlicmFyeU1hbmFnZXJGYWN0b3J5LmdldEluc3RhbmNlKCkKLQkJCQkuZ2V0TGlicmFyeVR5cGVzKCkua2V5U2V0KCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJU3RyaW5nIHBlcnNpc3RlbmNlSWQgPSAoU3RyaW5nKSBpdC5uZXh0KCk7Ci0JCQlTdHJpbmcgcGFnZUlkID0gcGVyc2lzdGVuY2VJZCArICJQYWdlIjsgLy8kTk9OLU5MUy0xJAotCQkJT3BlbkxpYnJhcnlXaXphcmRQYWdlIHBhZ2UgPSBPcGVuTGlicmFyeVdpemFyZFBhZ2VGYWN0b3J5Ci0JCQkJCS5nZXRJbnN0YW5jZSgpLmNyZWF0ZVdpemFyZFBhZ2UocGFnZUlkLCBwZXJzaXN0ZW5jZUlkKTsKLQkJCWlmIChwYWdlICE9IG51bGwpIHsKLQkJCQlwYWdlLnNldEltYWdlRGVzY3JpcHRvcihMaWJyYXJ5VUlQbHVnaW4uZ2V0RGVmYXVsdCgpCi0JCQkJCQkuZ2V0SW1hZ2VEZXNjcmlwdG9yKCJmdWxsL3dpemJhbi9PcGVuLmdpZiIpKTsgLy8kTk9OLU5MUy0xJAkJCQkJCi0JCQkJYWRkUGFnZShwYWdlKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZCNjcmVhdGVQYWdlQ29udHJvbHMoQ29tcG9zaXRlKQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZVBhZ2VDb250cm9scyhDb21wb3NpdGUgcGFnZUNvbnRhaW5lcikgewotCQlzdXBlci5jcmVhdGVQYWdlQ29udHJvbHMocGFnZUNvbnRhaW5lcik7Ci0JCXBhZ2VDb250YWluZXIuZ2V0U2hlbGwoKS5zZXRJbWFnZSgKLQkJCQlMaWJyYXJ5VUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFNoYXJlZEltYWdlKAotCQkJCQkJImZ1bGwvb2JqMTYvTWV0aG9kTGlicmFyeS5naWYiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmQjY2FuRmluaXNoKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjYW5GaW5pc2goKSB7Ci0JCWlmIChtYWluUGFnZS5pc1BhZ2VDb21wbGV0ZSgpICYmICFtYWluUGFnZS5pc09wZW5Vbmxpc3RlZExpYnJhcnkoKSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJSVdpemFyZFBhZ2VbXSBwYWdlcyA9IGdldFBhZ2VzKCk7Ci0JCWZvciAoaW50IGkgPSAxOyBpIDwgcGFnZXMubGVuZ3RoOyBpKyspIHsKLQkJCWlmICghcGFnZXNbaV0uaXNQYWdlQ29tcGxldGUoKSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZ2V0Q29udGFpbmVyKCkuZ2V0Q3VycmVudFBhZ2UoKSAhPSBtYWluUGFnZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmQjcGVyZm9ybUZpbmlzaCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gcGVyZm9ybUZpbmlzaCgpIHsKLQkJU3RyaW5nIHR5cGUgPSBtYWluUGFnZS5nZXRMaWJyYXJ5VHlwZSgpOwotCQlPcGVuTGlicmFyeVdpemFyZFBhZ2UgcGFnZSA9IE9wZW5MaWJyYXJ5V2l6YXJkUGFnZUZhY3RvcnkuZ2V0SW5zdGFuY2UoKQotCQkJCS5nZXRXaXphcmRQYWdlKHR5cGUpOwotCQl0cnkgewotCQkJU3RyaW5nIHBhdGggPSBudWxsOwotCQkJaWYgKG1haW5QYWdlLmlzT3BlblVubGlzdGVkTGlicmFyeSgpKSB7Ci0JCQkJTWFwIG9wdGlvbnMgPSBwYWdlLmdldFNlbGVjdGlvbnMoKTsKLQkJCQlwYXRoID0gKFN0cmluZykgb3B0aW9ucy5nZXQoWE1JTGlicmFyeU1hbmFnZXIuQVJHX0xJQlJBUllfUEFUSCk7Ci0JCQl9IGVsc2UgewotCQkJCXBhdGggPSBtYWluUGFnZS5nZXRMaWJyYXJ5UGF0aCgpOwotCQkJfQotCQkJaWYgKHBhdGggIT0gbnVsbCkgewotCQkJCWlmIChYTUlMaWJyYXJ5VXRpbC5pc1ZhbGlkTGlicmFyeShwYXRoLCB0cnVlKSA9PSBTdGF0dXMuT0tfU1RBVFVTKSB7Ci0JCQkJCWlmICghaGFuZGxlVG9vbFZlcnNpb24ocGF0aCwgbnVsbCkpIHsKLQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJfQotCQkJCQlpZiAoTGlicmFyeVVJTWFuYWdlci5nZXRJbnN0YW5jZSgpLm9wZW5MaWJyYXJ5KHBhdGgpKSB7Ci0JCQkJCQlhZGRSZWNlbnRseU9wZW5lZExpYnJhcnkoKTsKLQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQl9Ci0JCQkJfSBlbHNlIGlmIChYTUlMaWJyYXJ5VXRpbAotCQkJCQkJLmNvbnRhaW5zUGx1Z2luT3JDb25maWdTcGVjRXhwb3J0RmlsZShwYXRoKSkgewotCQkJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKAotCQkJCQkJCUxpYnJhcnlVSVJlc291cmNlcy5vcGVuTGlicmFyeUVycm9yX3JlYXNvbjQpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCU1zZ0RpYWxvZyBtc2dEaWFsb2cgPSBMaWJyYXJ5VUlQbHVnaW4uZ2V0RGVmYXVsdCgpCi0JCQkJCQkJLmdldE1zZ0RpYWxvZygpOwotCQkJCQlib29sZWFuIHJjID0gbXNnRGlhbG9nCi0JCQkJCQkJLmRpc3BsYXlDb25maXJtYXRpb24oCi0JCQkJCQkJCQlMaWJyYXJ5VUlSZXNvdXJjZXMub3BlbkxpYnJhcnlXaXphcmRfdGl0bGUsCi0JCQkJCQkJCQlOTFMKLQkJCQkJCQkJCQkJLmJpbmQoCi0JCQkJCQkJCQkJCQkJTGlicmFyeVVJUmVzb3VyY2VzLm9wZW5MaWJyYXJ5RGlhbG9nX25ld0xpYnJhcnlfdGV4dCwKLQkJCQkJCQkJCQkJCQluZXcgT2JqZWN0W10geyBwYXRoIH0pKTsKLQkJCQkJaWYgKCFyYykKLQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJaWYgKExpYnJhcnlVSU1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5jcmVhdGVMaWJyYXJ5KHBhdGgpKSB7Ci0JCQkJCQlhZGRSZWNlbnRseU9wZW5lZExpYnJhcnkoKTsKLQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIHRydWU7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlTdHJpbmcgcmVhc29uID0gZS5nZXRNZXNzYWdlKCk7Ci0JCQlpZiAocmVhc29uID09IG51bGwpIHsKLQkJCQlyZWFzb24gPSBMaWJyYXJ5VUlSZXNvdXJjZXMub3BlbkxpYnJhcnlJbnRlcm5sRXJyb3JfcmVhc29uOwotCQkJfQotCQkJcmVhc29uICs9ICJcblxuIiArIExpYnJhcnlVSVJlc291cmNlcy5vcGVuTGlicmFyeUVycm9yX2FkdmljZTsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKGUuZ2V0TWVzc2FnZSgpICE9IG51bGwpIHsKLQkJCQlMaWJyYXJ5VUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpLmRpc3BsYXlFcnJvcigKLQkJCQkJCUxpYnJhcnlVSVJlc291cmNlcy5vcGVuTGlicmFyeVdpemFyZF90aXRsZSwKLQkJCQkJCUxpYnJhcnlVSVJlc291cmNlcy5vcGVuTGlicmFyeUVycm9yX21zZywgcmVhc29uKTsKLQkJCX0gZWxzZSB7Ci0JCQkJTGlicmFyeVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKS5kaXNwbGF5RXJyb3IoCi0JCQkJCQlMaWJyYXJ5VUlSZXNvdXJjZXMub3BlbkxpYnJhcnlXaXphcmRfdGl0bGUsCi0JCQkJCQlMaWJyYXJ5VUlSZXNvdXJjZXMub3BlbkxpYnJhcnlFcnJvcl9tc2csIHJlYXNvbiwgZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEFkZHMgdGhlIG5ld2x5IG9wZW5lZCBvciBjcmVhdGVkIG1ldGhvZCBsaWJyYXJ5IHRvIHRoZSByZWNlbnRseSBvcGVuZWQKLQkgKiBtZXRob2QgbGlicmFyaWVzIHByZWZlcmVuY2UuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkUmVjZW50bHlPcGVuZWRMaWJyYXJ5KCkgewotCQlNZXRob2RMaWJyYXJ5IGxpYnJhcnkgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCk7Ci0JCWlmIChsaWJyYXJ5ICE9IG51bGwpIHsKLQkJCVN0cmluZyBsaWJyYXJ5VVJJID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRMaWJyYXJ5TWFuYWdlcigKLQkJCQkJbGlicmFyeSkuZ2V0TWV0aG9kTGlicmFyeVVSSSgpLnRvU3RyaW5nKCk7Ci0JCQlMaWJyYXJ5VUlQcmVmZXJlbmNlcy5hZGRPcGVuTGlicmFyeVVSSShsaWJyYXJ5VVJJKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENoZWNrIGFuZCBoYW5kbGUgdG9vbCB2ZXJzaW9uIGRpZmZlcmVuY2VzCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGhhbmRsZVRvb2xWZXJzaW9uKFN0cmluZyBwYXRoLAotCQkJVXBncmFkZUNhbGxlckluZm8gY2FsbGVySW5mbykgewotCQlTdHJpbmcgbGliWG1pID0gWE1JTGlicmFyeU1hbmFnZXIuTElCUkFSWV9YTUk7Ci0JCWlmIChjYWxsZXJJbmZvICE9IG51bGwgJiYgY2FsbGVySW5mby5nZXRJc0V4cG9ydGVkUGx1Z2luTGliKCkpIHsKLQkJCWxpYlhtaSA9IFhNSUxpYnJhcnlNYW5hZ2VyLmV4cG9ydEZpbGU7Ci0JCX0KLQkJVmVyc2lvblV0aWwuVmVyc2lvbkNoZWNrSW5mbyBpbmZvID0gVmVyc2lvblV0aWwKLQkJCQkuY2hlY2tMaWJyYXJ5VmVyc2lvbihuZXcgRmlsZShwYXRoLCBsaWJYbWkpKTsKLQkJaWYgKGluZm8gIT0gbnVsbCAmJiBpbmZvLnJlc3VsdCA+IDApIHsKLQkJCVN0cmluZyBtZXNzYWdlID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCWlmIChpbmZvLnRvb2xJRC5lcXVhbHMoVmVyc2lvblV0aWwuZ2V0UHJpbWFyeVRvb2xJRCgpKSkgewotCQkJCW1lc3NhZ2UgPSBOTFMuYmluZCgKLQkJCQkJCUxpYnJhcnlVSVJlc291cmNlcy52ZXJzaW9uTWlzbWF0Y2hEaWFsb2dfdGV4dCwKLQkJCQkJCW5ldyBPYmplY3RbXSB7IFBsYXRmb3JtLmdldFByb2R1Y3QoKS5nZXROYW1lKCksCi0JCQkJCQkJCWluZm8udG9vbFZlcnNpb24gfSk7Ci0JCQl9IGVsc2UgewotCQkJCW1lc3NhZ2UgPSBOTFMuYmluZCgKLQkJCQkJCUxpYnJhcnlVSVJlc291cmNlcy52ZXJzaW9uTWlzbWF0Y2hEaWFsb2dfdGV4dF91bmtub3duLAotCQkJCQkJbmV3IE9iamVjdFtdIHsgUGxhdGZvcm0uZ2V0UHJvZHVjdCgpLmdldE5hbWUoKSB9KTsKLQkJCX0KLQkJCWlmICghaXNVcGdyYWRlTGlicmFyeShjYWxsZXJJbmZvKSkgewotCQkJCWNhbGxlckluZm8uc2V0RXJyb3JNc2cobWVzc2FnZSk7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJTGlicmFyeVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKS5kaXNwbGF5RXJyb3IoCi0JCQkJCUxpYnJhcnlVSVJlc291cmNlcy5vcGVuTGlicmFyeVdpemFyZF90aXRsZSwgbWVzc2FnZSk7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJaWYgKFhNSUxpYnJhcnlVdGlsLmlzTWV0aG9kTGlicmFyeVVwZ3JhZGVSZXF1aXJlZChwYXRoLCBsaWJYbWksIGluZm8pKSB7Ci0JCQlpZiAoaXNVcGdyYWRlTGlicmFyeShjYWxsZXJJbmZvKQotCQkJCQkmJiAhTGlicmFyeVVJUGx1Z2luCi0JCQkJCQkJLmdldERlZmF1bHQoKQotCQkJCQkJCS5nZXRNc2dEaWFsb2coKQotCQkJCQkJCS5kaXNwbGF5Q29uZmlybWF0aW9uKAotCQkJCQkJCQkJTGlicmFyeVVJUmVzb3VyY2VzLm9wZW5MaWJyYXJ5V2l6YXJkX3RpdGxlLAotCQkJCQkJCQkJTGlicmFyeVVJUmVzb3VyY2VzLnVwZ3JhZGVMaWJyYXJ5RGlhbG9nX3RleHQpKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJaWYgKCFpc1VwZ3JhZGVMaWJyYXJ5KGNhbGxlckluZm8pKSB7Ci0JCQkJY2FsbGVySW5mby5jb3B5TGlicmFyeSgpOwotCQkJCWlmIChjYWxsZXJJbmZvLmdldENvcGllZExpYkZpbGUoKSAhPSBudWxsKSB7Ci0JCQkJCXBhdGggPSBjYWxsZXJJbmZvLmdldENvcGllZExpYkZpbGUoKS5nZXRQYXJlbnRGaWxlKCkKLQkJCQkJCQkuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0JCQkJfQotCQkJfQotCQkJaWYgKCFMaWJyYXJ5VUlNYW5hZ2VyLnVwZ3JhZGVMaWJyYXJ5KHBhdGgsIGNhbGxlckluZm8pKSB7Ci0JCQkJaWYgKGNhbGxlckluZm8gIT0gbnVsbCkgewotCQkJCQkvLyBjYWxsZXJJbmZvLnNldEVycm9yTXNnKCJ1cGdyYWRlTGlicmFyeSBGYWlsZWQhIik7IC8vbmVlZAotCQkJCQkvLyBuZXcgcmVzb3VyY2Ugc3RyaW5nCi0JCQkJfQotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiB0cnVlOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNVcGdyYWRlTGlicmFyeShVcGdyYWRlQ2FsbGVySW5mbyBjYWxsZXJJbmZvKSB7Ci0JCXJldHVybiBVcGdyYWRlQ2FsbGVySW5mby5pc1VwZ3JhZGVMaWJyYXJ5KGNhbGxlckluZm8pOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL2ludGVybmFsL3dpemFyZHMvT3BlbkxpYnJhcnlXaXphcmRQYWdlQ29udHJpYnV0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvaW50ZXJuYWwvd2l6YXJkcy9PcGVuTGlicmFyeVdpemFyZFBhZ2VDb250cmlidXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTM5ZmJjNy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvaW50ZXJuYWwvd2l6YXJkcy9PcGVuTGlicmFyeVdpemFyZFBhZ2VDb250cmlidXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLmludGVybmFsLndpemFyZHM7Ci0KLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwotCi0vKioKLSAqIE1vZGVscyB0aGUgPG9wZW5MaWJyYXJ5V2l6YXJkUGFnZT4gZWxlbWVudCBpbiB0aGUKLSAqICJvcmcuZWNsaXBzZS5lcGYubGlicnJheS51aS5vcGVuTGlicmFyeVdpemFyZFBhZ2VzIiBleHRlbnNpb24gcG9pbnQuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMgotICogQGRlcHJlY2F0ZWQKLSAqLwotcHVibGljIGNsYXNzIE9wZW5MaWJyYXJ5V2l6YXJkUGFnZUNvbnRyaWJ1dGlvbiB7Ci0KLQkvLyBUaGUgcGx1Zy1pbiB0aGF0IGNvbnRyaWJ1dGVkIHRoaXMgcHJvdmlkZXIuCi0JcHJpdmF0ZSBCdW5kbGUgYnVuZGxlOwotCi0JLy8gVGhlIHdpemFyZCBwYWdlIGNsYXNzIG5hbWUuCi0JcHJpdmF0ZSBTdHJpbmcgY2xhc3NOYW1lOwotCi0JLy8gVGhlIGxpYnJhcnkgdHlwZSBpZGVudGlmaWVyLgotCXByaXZhdGUgU3RyaW5nIHR5cGVJZDsKLQotCS8vIFRoZSB3aXphcmQgcGFnZSB0aXRsZS4KLQlwcml2YXRlIFN0cmluZyB0aXRsZTsKLQotCS8vIFRoZSB3aXphcmQgcGFnZSBkZXNjcmlwdGlvbi4KLQlwcml2YXRlIFN0cmluZyBkZXNjcmlwdGlvbjsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIE9wZW5MaWJyYXJ5V2l6YXJkUGFnZUNvbnRyaWJ1dGlvbihCdW5kbGUgYnVuZGxlLCBTdHJpbmcgY2xhc3NOYW1lLAotCQkJU3RyaW5nIHR5cGVJZCwgU3RyaW5nIHRpdGxlLCBTdHJpbmcgZGVzY3JpcHRpb24pIHsKLQkJdGhpcy5idW5kbGUgPSBidW5kbGU7Ci0JCXRoaXMuY2xhc3NOYW1lID0gY2xhc3NOYW1lOwotCQl0aGlzLnR5cGVJZCA9IHR5cGVJZDsKLQkJdGhpcy50aXRsZSA9IHRpdGxlOwotCQl0aGlzLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcGx1Zy1pbiB0aGF0IGNvbnRyaWJ1dGVkIHRoaXMgcHJvdmlkZXIuCi0JICovCi0JcHVibGljIEJ1bmRsZSBnZXRCdW5kbGUoKSB7Ci0JCXJldHVybiBidW5kbGU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgd2l6YXJkIHBhZ2UgY2xhc3MgbmFtZS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENsYXNzTmFtZSgpIHsKLQkJcmV0dXJuIGNsYXNzTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRob2QgbGlicmFyeSB0eXBlIGlkZW50aWZpZXIuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUeXBlSWQoKSB7Ci0JCXJldHVybiB0eXBlSWQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgd2l6YXJkIHBhZ2UgdGl0bGUuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUaXRsZSgpIHsKLQkJcmV0dXJuIHRpdGxlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHdpemFyZCBwYWdlIGRlc2NyaXB0aW9uLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBkZXNjcmlwdGlvbjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9pbnRlcm5hbC93aXphcmRzL09wZW5MaWJyYXJ5V2l6YXJkUGFnZUZhY3RvcnkuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9pbnRlcm5hbC93aXphcmRzL09wZW5MaWJyYXJ5V2l6YXJkUGFnZUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTI0NDU0NS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvaW50ZXJuYWwvd2l6YXJkcy9PcGVuTGlicmFyeVdpemFyZFBhZ2VGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuaW50ZXJuYWwud2l6YXJkczsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkNvbnN0cnVjdG9yOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25SZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuTGlicmFyeVVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLndpemFyZHMuT3BlbkxpYnJhcnlXaXphcmRQYWdlOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci0KLS8qKgotICogTWFuYWdlcyB0aGUgT3BlbiBMaWJyYXJ5IHdpemFyZCBwYWdlcyBkZWZpbmVkIHZpYSB0aGUKLSAqICJvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5vcGVuTGlicmFyeVdpemFyZFBhZ2VzIiBleHRlbnNpb24gcG9pbnQuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMgotICogQGRlcHJlY2F0ZWQKLSAqLwotcHVibGljIGNsYXNzIE9wZW5MaWJyYXJ5V2l6YXJkUGFnZUZhY3RvcnkgewotCi0JLyoqCi0JICogVGhlIGV4dGVuc2lvbiBwb2ludCBuYW1lc3BhY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhURU5TSU9OX1BPSU5UX05BTUVTUEFDRSA9ICJvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSBleHRlbnNpb24gcG9pbnQgbmFtZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRFTlNJT05fUE9JTlRfTkFNRSA9ICJvcGVuTGlicmFyeVdpemFyZFBhZ2VzIjsgLy8kTk9OLU5MUy0xJAotCi0JLy8gVGhlIHNoYXJlZCBpbnN0YW5jZS4KLQlwcml2YXRlIHN0YXRpYyBPcGVuTGlicmFyeVdpemFyZFBhZ2VGYWN0b3J5IGluc3RhbmNlID0gbmV3IE9wZW5MaWJyYXJ5V2l6YXJkUGFnZUZhY3RvcnkoKTsKLQotCS8vIEEgbWFwIG9mIHdpemFyZCBwYWdlIHByb3ZpZGVycy4KLQlwcml2YXRlIE1hcDxTdHJpbmcsIE9wZW5MaWJyYXJ5V2l6YXJkUGFnZUNvbnRyaWJ1dGlvbj4gd2l6YXJkUGFnZVByb3ZpZGVycyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT3BlbkxpYnJhcnlXaXphcmRQYWdlQ29udHJpYnV0aW9uPigpOwotCi0JLy8gQSBsaXN0IG9mIHdpemFyZCBwYWdlIGluc3RhbmNlcy4KLQlwcml2YXRlIE1hcDxTdHJpbmcsIE9wZW5MaWJyYXJ5V2l6YXJkUGFnZT4gd2l6YXJkUGFnZXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9wZW5MaWJyYXJ5V2l6YXJkUGFnZT4oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNoYXJlZCBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9wZW5MaWJyYXJ5V2l6YXJkUGFnZUZhY3RvcnkgZ2V0SW5zdGFuY2UoKSB7Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXByaXZhdGUgT3BlbkxpYnJhcnlXaXphcmRQYWdlRmFjdG9yeSgpIHsKLQkJaW5pdCgpOwotCX0KLQotCS8qKgotCSAqIFBlcmZvcm1zIHRoZSBuZWNlc3NhcnkgaW5pdGlhbGl6YXRpb24uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdCgpIHsKLQkJSUV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5ID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKTsKLQkJSUV4dGVuc2lvblBvaW50IGV4dGVuc2lvblBvaW50ID0gZXh0ZW5zaW9uUmVnaXN0cnkuZ2V0RXh0ZW5zaW9uUG9pbnQoCi0JCQkJRVhURU5TSU9OX1BPSU5UX05BTUVTUEFDRSwgRVhURU5TSU9OX1BPSU5UX05BTUUpOwotCQlpZiAoZXh0ZW5zaW9uUG9pbnQgIT0gbnVsbCkgewotCQkJSUV4dGVuc2lvbltdIGV4dGVuc2lvbnMgPSBleHRlbnNpb25Qb2ludC5nZXRFeHRlbnNpb25zKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGV4dGVuc2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCQlJRXh0ZW5zaW9uIGV4dGVuc2lvbiA9IGV4dGVuc2lvbnNbaV07Ci0JCQkJU3RyaW5nIHBsdWdpbklkID0gZXh0ZW5zaW9uLmdldE5hbWVzcGFjZUlkZW50aWZpZXIoKTsKLQkJCQlCdW5kbGUgYnVuZGxlID0gUGxhdGZvcm0uZ2V0QnVuZGxlKHBsdWdpbklkKTsKLQkJCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjb25maWdFbGVtZW50cyA9IGV4dGVuc2lvbgotCQkJCQkJLmdldENvbmZpZ3VyYXRpb25FbGVtZW50cygpOwotCQkJCWZvciAoaW50IGogPSAwOyBqIDwgY29uZmlnRWxlbWVudHMubGVuZ3RoOyBqKyspIHsKLQkJCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNvbmZpZ0VsZW1lbnQgPSBjb25maWdFbGVtZW50c1tqXTsKLQkJCQkJdHJ5IHsKLQkJCQkJCVN0cmluZyBjbGFzc05hbWUgPSBjb25maWdFbGVtZW50LmdldEF0dHJpYnV0ZSgiY2xhc3MiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJU3RyaW5nIHR5cGVJZCA9IGNvbmZpZ0VsZW1lbnQuZ2V0QXR0cmlidXRlKCJ0eXBlIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCVN0cmluZyB0aXRsZSA9IGNvbmZpZ0VsZW1lbnQuZ2V0QXR0cmlidXRlKCJ0aXRsZSIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQlTdHJpbmcgZGVzY3JpcHRpb24gPSBjb25maWdFbGVtZW50Ci0JCQkJCQkJCS5nZXRBdHRyaWJ1dGUoImRlc2NyaXB0aW9uIik7IC8vJE5PTi1OTFMtMSQJCQkJCQkKLQkJCQkJCWlmIChjbGFzc05hbWUgIT0gbnVsbCAmJiBjbGFzc05hbWUudHJpbSgpLmxlbmd0aCgpID4gMAotCQkJCQkJCQkmJiB0eXBlSWQgIT0gbnVsbCAmJiB0eXBlSWQudHJpbSgpLmxlbmd0aCgpID4gMAotCQkJCQkJCQkmJiB0aXRsZSAhPSBudWxsICYmIHRpdGxlLnRyaW0oKS5sZW5ndGgoKSA+IDAKLQkJCQkJCQkJJiYgZGVzY3JpcHRpb24gIT0gbnVsbAotCQkJCQkJCQkmJiBkZXNjcmlwdGlvbi50cmltKCkubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJCQkJaWYgKCF3aXphcmRQYWdlUHJvdmlkZXJzLmNvbnRhaW5zS2V5KHR5cGVJZCkpIHsKLQkJCQkJCQkJT3BlbkxpYnJhcnlXaXphcmRQYWdlQ29udHJpYnV0aW9uIHByb3ZpZGVyID0gbmV3IE9wZW5MaWJyYXJ5V2l6YXJkUGFnZUNvbnRyaWJ1dGlvbigKLQkJCQkJCQkJCQlidW5kbGUsIGNsYXNzTmFtZSwgdHlwZUlkLCB0aXRsZSwKLQkJCQkJCQkJCQlkZXNjcmlwdGlvbik7Ci0JCQkJCQkJCXdpemFyZFBhZ2VQcm92aWRlcnMucHV0KHR5cGVJZCwgcHJvdmlkZXIpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCUxpYnJhcnlVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgd2l6YXJkIHBhZ2UuCi0JICogCi0JICogQHJldHVybiBhIDxjb2RlPk9wZW5MaWJyYXJ5V2l6YXJkUGFnZTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgT3BlbkxpYnJhcnlXaXphcmRQYWdlIGNyZWF0ZVdpemFyZFBhZ2UoU3RyaW5nIHBhZ2VJZCwgU3RyaW5nIHR5cGVJZCkgewotCQlPcGVuTGlicmFyeVdpemFyZFBhZ2Ugd2l6YXJkUGFnZSA9IChPcGVuTGlicmFyeVdpemFyZFBhZ2UpIHdpemFyZFBhZ2VzCi0JCQkJLmdldCh0eXBlSWQpOwotCQlpZiAod2l6YXJkUGFnZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gd2l6YXJkUGFnZTsKLQkJfQotCi0JCU9wZW5MaWJyYXJ5V2l6YXJkUGFnZUNvbnRyaWJ1dGlvbiBwcm92aWRlciA9IChPcGVuTGlicmFyeVdpemFyZFBhZ2VDb250cmlidXRpb24pIHdpemFyZFBhZ2VQcm92aWRlcnMKLQkJCQkuZ2V0KHR5cGVJZCk7Ci0JCWlmIChwcm92aWRlciAhPSBudWxsKSB7Ci0JCQlCdW5kbGUgYnVuZGxlID0gcHJvdmlkZXIuZ2V0QnVuZGxlKCk7Ci0JCQlTdHJpbmcgY2xhc3NOYW1lID0gcHJvdmlkZXIuZ2V0Q2xhc3NOYW1lKCk7Ci0JCQlDbGFzcyB3aXphcmRQYWdlQ2xhc3M7Ci0JCQlDbGFzc1tdIGFyZ0NsYXNzID0gbmV3IENsYXNzW10geyBTdHJpbmcuY2xhc3MgfTsKLQkJCU9iamVjdFtdIGFyZ1ZhbHVlID0gbmV3IE9iamVjdFtdIHsgcGFnZUlkIH07Ci0JCQlDb25zdHJ1Y3RvciBjb25zdHJ1Y3RvcjsKLQkJCXRyeSB7Ci0JCQkJd2l6YXJkUGFnZUNsYXNzID0gYnVuZGxlLmxvYWRDbGFzcyhjbGFzc05hbWUpOwotCQkJCWNvbnN0cnVjdG9yID0gd2l6YXJkUGFnZUNsYXNzLmdldENvbnN0cnVjdG9yKGFyZ0NsYXNzKTsKLQkJCQl3aXphcmRQYWdlID0gKE9wZW5MaWJyYXJ5V2l6YXJkUGFnZSkgY29uc3RydWN0b3IKLQkJCQkJCS5uZXdJbnN0YW5jZShhcmdWYWx1ZSk7Ci0JCQkJd2l6YXJkUGFnZS5zZXRUaXRsZShwcm92aWRlci5nZXRUaXRsZSgpKTsKLQkJCQl3aXphcmRQYWdlLnNldERlc2NyaXB0aW9uKHByb3ZpZGVyLmdldERlc2NyaXB0aW9uKCkpOwotCQkJCXdpemFyZFBhZ2VzLnB1dCh0eXBlSWQsIHdpemFyZFBhZ2UpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlMaWJyYXJ5VUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJfQotCQl9Ci0JCXJldHVybiB3aXphcmRQYWdlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb3IgY2FjaGVkIHdpemFyZCBwYWdlLgotCSAqIAotCSAqIEByZXR1cm4gYSA8Y29kZT5OZXdMaWJyYXJ5V2l6YXJkUGFnZTwvY29kZT4gb2JqZWN0Ci0JICovCi0JcHVibGljIE9wZW5MaWJyYXJ5V2l6YXJkUGFnZSBnZXRXaXphcmRQYWdlKFN0cmluZyB0eXBlSWQpIHsKLQkJcmV0dXJuIChPcGVuTGlicmFyeVdpemFyZFBhZ2UpIHdpemFyZFBhZ2VzLmdldCh0eXBlSWQpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL3BhY2thZ2UuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkMzJkZTMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIHRoZSBVSSBzdXBwcG9ydCBmb3IgbWFuYWdpbmcgYSBtZXRob2QgbGlicmFyeS4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvcHJlZmVyZW5jZXMvTGlicmFyeVVJUHJlZmVyZW5jZXMuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9wcmVmZXJlbmNlcy9MaWJyYXJ5VUlQcmVmZXJlbmNlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNzk1ZTU0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9wcmVmZXJlbmNlcy9MaWJyYXJ5VUlQcmVmZXJlbmNlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjk2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLnByZWZlcmVuY2VzOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS51dGlsLlByZWZlcmVuY2VVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuRmlsZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5TdXBwb3J0aW5nRWxlbWVudERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuTGlicmFyeVVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5NdWx0aUZpbGVTYXZlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS51dGlsLkRlZmF1bHRWYWx1ZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5NZXNzYWdlRGlhbG9nV2l0aFRvZ2dsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci0KLS8qKgotICogTWFuYWdlcyB0aGUgTGlicmFyeSBVSSBwcmVmZXJlbmNlcy4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBMaWJyYXJ5VUlQcmVmZXJlbmNlcyB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9MSUJSQVJZX1BBVEggPSAiZGVmYXVsdExpYnJhcnlQYXRoIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNBVkVEX0xJQlJBUllfUEFUSCA9ICJzYXZlZExpYnJhcnlQYXRoIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBVQkxJU0hfVU5PUEVOX0FDVElWSVRZX0REID0gInB1Ymxpc2hVbm9wZW5BY3Rpdml0eURldGFpbERpYWdyYW0iOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRl9TV0lUQ0hfQ09ORklHID0gInN3aXRjaENvbmZpZ3VyYXRpb25PblByb2Nlc3NBY3RpdmF0ZSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQVUJMSVNIX0FEX0ZPUl9BQ1RJVklUWV9FWFRFTlNJT04gPSAicHVibGlzaEFjdGl2aXR5RGlhZ3JhbWZvckFjdGl2aXR5RXh0ZW5zaW9uIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFQUExJQ0FUSU9OX1NIT1JUX05BTUUgPSAiYXBwbmFtZSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBORVdfTElCUkFSWV9QQVRIUyA9ICJuZXdMaWJyYXJ5UGF0aHMiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1BFTl9MSUJSQVJZX1BBVEhTID0gIm9wZW5MaWJyYXJ5UGF0aHMiOyAvLyROT04tTkxTLTEkCQkKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBPUEVOX0xJQlJBUllfVVJJUyA9ICJvcGVuTGlicmFyeVVSSXMiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgV09SS19CUkVBS0RPV05FTEVNRU5UX09QVElPTkFMID0gIndvcmtfYnJlYWtkb3duZWxlbWVudF9vcHRpb25hbCI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBXT1JLX0JSRUFLRE9XTkVMRU1FTlRfTVVMVElQTEVfT0NDVVJSQU5DRVMgPSAid29ya19icmVha2Rvd25lbGVtZW50X211bHRpcGxlX29jY3VycmFuY2VzIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFdPUktfQlJFQUtET1dORUxFTUVOVF9QTEFOTkVEID0gIndvcmtfYnJlYWtkb3duZWxlbWVudF9wbGFubmVkIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFdPUktfQlJFQUtET1dORUxFTUVOVF9FVkVOVF9EUklWRU4gPSAid29ya19icmVha2Rvd25lbGVtZW50X2V2ZW50X2RyaXZlbiI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBXT1JLX0JSRUFLRE9XTkVMRU1FTlRfT05HT0lORyA9ICJ3b3JrX2JyZWFrZG93bmVsZW1lbnRfbXVsdGlwbGVfb25nb2luZyI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBXT1JLX0JSRUFLRE9XTkVMRU1FTlRfUkVQRUFUQUJMRSA9ICJ3b3JrX2JyZWFrZG93bmVsZW1lbnRfcmVwZWF0YWJsZSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERVNDUklQVE9SX09QVElPTkFMID0gImRlc2NyaXB0b3Jfb3B0aW9uYWwiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVTQ1JJUFRPUl9NVUxUSVBMRV9PQ0NVUlJBTkNFUyA9ICJkZXNjcmlwdG9yX211bHRpcGxlX29jY3VycmFuY2VzIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFU0NSSVBUT1JfUExBTk5FRCA9ICJkZXNjcmlwdG9yX3BsYW5uZWQiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVTQ1JJUFRPUl9FVkVOVF9EUklWRU4gPSAiZGVzY3JpcHRvcl9ldmVudF9kcml2ZW4iOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVTQ1JJUFRPUl9PTkdPSU5HID0gImRlc2NyaXB0b3JfbXVsdGlwbGVfb25nb2luZyI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJTkNMVURFX0RFU0NSSVBUT1JTID0gImluY2x1ZGUgZGVzY3JpcHRvcnMiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVTQ1JJUFRPUl9SRVBFQVRBQkxFID0gImRlc2NyaXB0b3JfcmVwZWF0YWJsZSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0xJQlJBUllfRk9MREVSX05BTUUgPSAiTWV0aG9kIExpYnJhcmllcyI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBkZWZhdWx0TGlicmFyeVBhdGggPSBudWxsOwotCi0JLy8gVGhlIHBsdWctaW4gc3BlY2lmaWMgcHJlZmVyZW5jZSBzdG9yZS4KLQlwcml2YXRlIHN0YXRpYyBJUHJlZmVyZW5jZVN0b3JlIHByZWZTdG9yZSA9IExpYnJhcnlVSVBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQotCXN0YXRpYyB7Ci0JCS8vIEluaXRpYWxpemUgdGhlIGRlZmF1bHQgcHJlZmVyZW5jZSB2YWx1ZXMuCi0JCXByZWZTdG9yZS5zZXREZWZhdWx0KERFRkFVTFRfTElCUkFSWV9QQVRILAotCQkJCWdldEluaXRpYWxEZWZhdWx0TGlicmFyeVBhdGgoKSk7Ci0KLQkJcHJlZlN0b3JlLnNldERlZmF1bHQoU0FWRURfTElCUkFSWV9QQVRILCAiIik7IC8vJE5PTi1OTFMtMSQJCi0JCXByZWZTdG9yZQotCQkJCS5zZXREZWZhdWx0KFBSRUZfU1dJVENIX0NPTkZJRywgTWVzc2FnZURpYWxvZ1dpdGhUb2dnbGUuUFJPTVBUKTsKLQkJcHJlZlN0b3JlLnNldERlZmF1bHQoTkVXX0xJQlJBUllfUEFUSFMsICIiKTsgLy8kTk9OLU5MUy0xJAkKLQkJcHJlZlN0b3JlLnNldERlZmF1bHQoT1BFTl9MSUJSQVJZX1BBVEhTLCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJcHJlZlN0b3JlLnNldERlZmF1bHQoT1BFTl9MSUJSQVJZX1VSSVMsICIiKTsgLy8kTk9OLU5MUy0xJAkKLQotCQlwcmVmU3RvcmUuc2V0RGVmYXVsdChXT1JLX0JSRUFLRE9XTkVMRU1FTlRfT1BUSU9OQUwsIGZhbHNlKTsKLQkJcHJlZlN0b3JlLnNldERlZmF1bHQoV09SS19CUkVBS0RPV05FTEVNRU5UX01VTFRJUExFX09DQ1VSUkFOQ0VTLCBmYWxzZSk7Ci0JCXByZWZTdG9yZS5zZXREZWZhdWx0KFdPUktfQlJFQUtET1dORUxFTUVOVF9QTEFOTkVELCB0cnVlKTsKLQkJcHJlZlN0b3JlLnNldERlZmF1bHQoV09SS19CUkVBS0RPV05FTEVNRU5UX0VWRU5UX0RSSVZFTiwgZmFsc2UpOwotCQlwcmVmU3RvcmUuc2V0RGVmYXVsdChXT1JLX0JSRUFLRE9XTkVMRU1FTlRfT05HT0lORywgZmFsc2UpOwotCQlwcmVmU3RvcmUuc2V0RGVmYXVsdChXT1JLX0JSRUFLRE9XTkVMRU1FTlRfUkVQRUFUQUJMRSwgZmFsc2UpOwotCi0JCXByZWZTdG9yZS5zZXREZWZhdWx0KERFU0NSSVBUT1JfT1BUSU9OQUwsIGZhbHNlKTsKLQkJcHJlZlN0b3JlLnNldERlZmF1bHQoREVTQ1JJUFRPUl9NVUxUSVBMRV9PQ0NVUlJBTkNFUywgZmFsc2UpOwotCQlwcmVmU3RvcmUuc2V0RGVmYXVsdChERVNDUklQVE9SX1BMQU5ORUQsIGZhbHNlKTsKLQkJcHJlZlN0b3JlLnNldERlZmF1bHQoREVTQ1JJUFRPUl9FVkVOVF9EUklWRU4sIGZhbHNlKTsKLQkJcHJlZlN0b3JlLnNldERlZmF1bHQoREVTQ1JJUFRPUl9PTkdPSU5HLCBmYWxzZSk7Ci0JCXByZWZTdG9yZS5zZXREZWZhdWx0KElOQ0xVREVfREVTQ1JJUFRPUlMsICFTdXBwb3J0aW5nRWxlbWVudERhdGEuaXNEZXNjcmlwdG9yRXhjbHVzaXZlT3B0aW9uKCkpOwotCQlwcmVmU3RvcmUuc2V0RGVmYXVsdChERVNDUklQVE9SX1JFUEVBVEFCTEUsIGZhbHNlKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBpbml0aWFsIGRlZmF1bHQgbWV0aG9kIGxpYnJhcnkgcGF0aCBwcmVmZXJlbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEluaXRpYWxEZWZhdWx0TGlicmFyeVBhdGgoKSB7Ci0JCWlmIChkZWZhdWx0TGlicmFyeVBhdGggPT0gbnVsbCkgewotCQkJZGVmYXVsdExpYnJhcnlQYXRoID0gU3lzdGVtLmdldFByb3BlcnR5KCJ1c2VyLmhvbWUiKTsgLy8kTk9OLU5MUy0xJAotCQkJU3RyaW5nIGFwcE5hbWUgPSBMaWJyYXJ5VUlQcmVmZXJlbmNlcy5nZXRBcHBsaWNhdGlvblNob3J0TmFtZSgpOwotCQkJaWYgKGFwcE5hbWUgIT0gbnVsbCAmJiBhcHBOYW1lLmxlbmd0aCgpID4gMCkgewotCQkJCWRlZmF1bHRMaWJyYXJ5UGF0aCA9IGRlZmF1bHRMaWJyYXJ5UGF0aCArIEZpbGVVdGlsLkZJTEVfU0VQCi0JCQkJCQkrIGFwcE5hbWUgKyBGaWxlVXRpbC5GSUxFX1NFUAotCQkJCQkJKyBERUZBVUxUX0xJQlJBUllfRk9MREVSX05BTUU7Ci0JCQl9IGVsc2UgewotCQkJCWRlZmF1bHRMaWJyYXJ5UGF0aCA9IGRlZmF1bHRMaWJyYXJ5UGF0aCArIEZpbGVVdGlsLkZJTEVfU0VQCi0JCQkJCQkrIERFRkFVTFRfTElCUkFSWV9GT0xERVJfTkFNRTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZGVmYXVsdExpYnJhcnlQYXRoOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGRlZmF1bHQgbWV0aG9kIGxpYnJhcnkgcGF0aCBwcmVmZXJlbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldERlZmF1bHRMaWJyYXJ5UGF0aCgpIHsKLQkJcmV0dXJuIHByZWZTdG9yZS5nZXRTdHJpbmcoREVGQVVMVF9MSUJSQVJZX1BBVEgpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGRlZmF1bHQgbWV0aG9kIGxpYnJhcnkgcGF0aCBwcmVmZXJlbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXREZWZhdWx0TGlicmFyeVBhdGgoU3RyaW5nIHZhbHVlKSB7Ci0JCXByZWZTdG9yZS5zZXRWYWx1ZShERUZBVUxUX0xJQlJBUllfUEFUSCwgdmFsdWUpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRQdWJsaXNoVW5vcGVuQWN0aXZpdHlkZChib29sZWFuIGVuYWJsZWQpIHsKLQkJcHJlZlN0b3JlLnNldFZhbHVlKFBVQkxJU0hfVU5PUEVOX0FDVElWSVRZX0RELCBlbmFibGVkKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gZ2V0UHVibGlzaFVub3BlbkFjdGl2aXR5ZGQoKSB7Ci0JCXJldHVybiBwcmVmU3RvcmUuZ2V0Qm9vbGVhbihQVUJMSVNIX1VOT1BFTl9BQ1RJVklUWV9ERCk7Ci0JfQotCi0JLyoqCi0JICogU2V0dGVyIG1ldGhvZCBmb3IgUHVibGlzaCBBY3Rpdml0eSBEaWFncmFtIGZvciBBY3Rpdml0eSBFeHRlbnNpb24sCi0JICogCi0JICogQHBhcmFtIGVuYWJsZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0UHVibGlzaEFERm9yQWN0aXZpdHlFeHRlbnNpb24oYm9vbGVhbiBlbmFibGVkKSB7Ci0JCXByZWZTdG9yZS5zZXRWYWx1ZShQVUJMSVNIX0FEX0ZPUl9BQ1RJVklUWV9FWFRFTlNJT04sIGVuYWJsZWQpOwotCX0KLQotCS8qKgotCSAqIGdldHRlciBtZXRob2QgZm9yIFB1Ymxpc2ggQWN0aXZpdHkgRGlhZ3JhbSBmb3IgQWN0aXZpdHkgRXh0ZW5zaW9uIGZsYWcKLQkgKiBmcm9tIHByZWZlcmVuY2Ugc3RvcmUsCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGdldFB1Ymxpc2hBREZvckFjdGl2aXR5RXh0ZW5zaW9uKCkgewotCQlyZXR1cm4gcHJlZlN0b3JlLmdldEJvb2xlYW4oUFVCTElTSF9BRF9GT1JfQUNUSVZJVFlfRVhURU5TSU9OKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHN3aXRjaCBjb25maWd1cmF0aW9uIHZhbHVlIHN0b3JlIGluIHByZWZlcmVuY2Ugc3RvcmUKLQkgKiAKLQkgKiBAcmV0dXJuIHZhbHVlIC0gY291bGQgYmUgQUxXQVlTLCBORVZFUiwgUFJPTVBUCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U3dpdGNoQ29uZmlnKCkgewotCQlyZXR1cm4gcHJlZlN0b3JlLmdldFN0cmluZyhQUkVGX1NXSVRDSF9DT05GSUcpOwotCX0KLQotCS8qKgotCSAqIFNhdmVzIHN3aXRjaCBjb25maWd1cmF0aW9uIHZhbHVlIGluIHByZWZlcmVuY2Ugc3RvcmUKLQkgKiAKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiAgICAgICAgICAgIFZhbHVlIGNvdWxkIGJlIEFMV0FZUywgTkVWRVIsIFBST01QVAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRTd2l0Y2hDb25maWcoU3RyaW5nIHZhbHVlKSB7Ci0JCXByZWZTdG9yZS5zZXRWYWx1ZShQUkVGX1NXSVRDSF9DT05GSUcsIHZhbHVlKTsKLQl9Ci0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHN3aXRjaCBjb25maWd1cmF0aW9uIHByZWZlcmVuY2Uga2V5Ci0JICogQHJldHVybiAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTd2l0Y2hDb25maWdQcmVmZXJlbmNlS2V5KCkJewotCQlyZXR1cm4gUFJFRl9TV0lUQ0hfQ09ORklHOwkJCi0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIE1ldGhvZCBMaWJyYXJ5IHBhdGggdGhhdCB3YXMgc2F2ZWQgaW4gYSBwcmV2aW91cyBzZXNzaW9uLgotCSAqIAotCSAqIEByZXR1cm4gVGhlIHNhdmVkIGxpYnJhcnkgcGF0aC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTYXZlZExpYnJhcnlQYXRoKCkgewotCQlyZXR1cm4gcHJlZlN0b3JlLmdldFN0cmluZyhTQVZFRF9MSUJSQVJZX1BBVEgpOwotCX0KLQotCS8qKgotCSAqIFNhdmVzIGEgTWV0aG9kIExpYnJhcnkgcGF0aCB0byB0aGUgTGlicmFyeSBVSSBwcmVmZXJlbmNlIHN0b3JlLgotCSAqIAotCSAqIEBwYXJhbSBsaWJQYXRoCi0JICogICAgICAgICAgICBQYXRoIHRvIGEgTWV0aG9kIExpYnJhcnkuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldFNhdmVkTGlicmFyeVBhdGgoU3RyaW5nIGxpYlBhdGgpIHsKLQkJU3RyaW5nIHBhdGggPSBsaWJQYXRoOwotCQlpZiAocGF0aC5lbmRzV2l0aChNdWx0aUZpbGVTYXZlVXRpbC5ERUZBVUxUX0xJQlJBUllfTU9ERUxfRklMRU5BTUUpKSB7Ci0JCQlwYXRoID0gRmlsZVV0aWwuZ2V0UGFyZW50RGlyZWN0b3J5KHBhdGgpOwotCQl9Ci0JCXByZWZTdG9yZS5zZXRWYWx1ZShTQVZFRF9MSUJSQVJZX1BBVEgsIHBhdGgpOwotCQlMaWJyYXJ5VUlQbHVnaW4uZ2V0RGVmYXVsdCgpLnNhdmVQbHVnaW5QcmVmZXJlbmNlcygpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGFwcGxpY2F0aW9uIHNob3J0IG5hbWUgcGFzc2VkIGluIHRoZSBtYWluIGZlYXR1cmUncwotCSAqIHBsdWdpbl9jdXN0b21pemF0aW9uLmluaS4KLQkgKiAKLQkgKiBAcmV0dXJuIFRoZSBwYXNzZWQtaW4gYXBwbGljYXRpb24gc2hvcnQgbmFtZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRBcHBsaWNhdGlvblNob3J0TmFtZSgpIHsKLQkJcmV0dXJuIHByZWZTdG9yZS5nZXRTdHJpbmcoQVBQTElDQVRJT05fU0hPUlRfTkFNRSk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgbmV3IGxpYnJhcnkgcGF0aHMgcHJlZmVyZW5jZS4KLQkgKiAKLQkgKiBAcmV0dXJuIGFuIGFycmF5IG9mIG1ldGhvZCBsaWJyYXJ5IHBhdGhzCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmdbXSBnZXROZXdMaWJyYXJ5UGF0aHMoKSB7Ci0JCXJldHVybiBQcmVmZXJlbmNlVXRpbC5nZXRTdHJpbmdWYWx1ZXMocHJlZlN0b3JlLCBORVdfTElCUkFSWV9QQVRIUyk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgbmV3IGxpYnJhcnkgcGF0aHMgcHJlZmVyZW5jZS4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgY29sbGVjdGlvbiBvZiBtZXRob2QgbGlicmFyeSBwYXRocwotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdDxTdHJpbmc+IGdldE5ld0xpYnJhcnlQYXRoc0xpc3QoKSB7Ci0JCXJldHVybiBQcmVmZXJlbmNlVXRpbC5nZXRMaXN0KHByZWZTdG9yZSwgTkVXX0xJQlJBUllfUEFUSFMpOwotCX0KLQotCS8qKgotCSAqIEFkZHMgYSBtZXRob2QgbGlicmFyeSBwYXRoIHRvIHRoZSBuZXcgbGlicmFyeSBwYXRocyBwcmVmZXJlbmNlLgotCSAqIAotCSAqIEBwYXJhbSBwYXRoCi0JICogICAgICAgICAgICBhIG1ldGhvZCBsaWJyYXJ5IHBhdGgKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgYWRkTmV3TGlicmFyeVBhdGgoU3RyaW5nIHBhdGgpIHsKLQkJUHJlZmVyZW5jZVV0aWwuYWRkVG9MaXN0KHByZWZTdG9yZSwgTkVXX0xJQlJBUllfUEFUSFMsIHBhdGgsCi0JCQkJZ2V0RGVmYXVsdExpYnJhcnlQYXRoKCkpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIG9wZW4gbGlicmFyeSBwYXRocyBwcmVmZXJlbmNlLgotCSAqIAotCSAqIEByZXR1cm4gYW4gYXJyYXkgb2YgbWV0aG9kIGxpYnJhcnkgcGF0aHMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZ1tdIGdldE9wZW5MaWJyYXJ5UGF0aHMoKSB7Ci0JCXJldHVybiBQcmVmZXJlbmNlVXRpbC5nZXRTdHJpbmdWYWx1ZXMocHJlZlN0b3JlLCBPUEVOX0xJQlJBUllfUEFUSFMpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIG9wZW4gbGlicmFyeSBwYXRocyBwcmVmZXJlbmNlLgotCSAqIAotCSAqIEByZXR1cm4gYSBjb2xsZWN0aW9uIG9mIG1ldGhvZCBsaWJyYXJ5IHBhdGhzCi0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0PFN0cmluZz4gZ2V0T3BlbkxpYnJhcnlQYXRoc0xpc3QoKSB7Ci0JCXJldHVybiBQcmVmZXJlbmNlVXRpbC5nZXRMaXN0KHByZWZTdG9yZSwgT1BFTl9MSUJSQVJZX1BBVEhTKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIGEgbWV0aG9kIGxpYnJhcnkgcGF0aCB0byB0aGUgb3BlbiBsaWJyYXJ5IHBhdGhzIHByZWZlcmVuY2UuCi0JICogCi0JICogQHBhcmFtIHBhdGgKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGxpYnJhcnkgcGF0aAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBhZGRPcGVuTGlicmFyeVBhdGgoU3RyaW5nIHBhdGgpIHsKLQkJUHJlZmVyZW5jZVV0aWwuYWRkVG9MaXN0KHByZWZTdG9yZSwgT1BFTl9MSUJSQVJZX1BBVEhTLCBwYXRoLAotCQkJCWdldERlZmF1bHRMaWJyYXJ5UGF0aCgpKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBvcGVuIGxpYnJhcnkgVVJJcyBwcmVmZXJlbmNlLgotCSAqIAotCSAqIEByZXR1cm4gYSBjb2xsZWN0aW9uIG9mIG1ldGhvZCBsaWJyYXJ5IFVSSXMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZ1tdIGdldE9wZW5MaWJyYXJ5VVJJcygpIHsKLQkJcmV0dXJuIFByZWZlcmVuY2VVdGlsLmdldFN0cmluZ1ZhbHVlcyhwcmVmU3RvcmUsIE9QRU5fTElCUkFSWV9VUklTKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBvcGVuIGxpYnJhcnkgVVJJcyBwcmVmZXJlbmNlLgotCSAqIAotCSAqIEByZXR1cm4gYSBjb2xsZWN0aW9uIG9mIG1ldGhvZCBsaWJyYXJ5IFVSSXMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3QgZ2V0T3BlbkxpYnJhcnlVUklzTGlzdCgpIHsKLQkJcmV0dXJuIFByZWZlcmVuY2VVdGlsLmdldExpc3QocHJlZlN0b3JlLCBPUEVOX0xJQlJBUllfVVJJUyk7Ci0JfQotCi0JLyoqCi0JICogQWRkcyBhIG1ldGhvZCBsaWJyYXJ5IFVSSSB0byB0aGUgb3BlbiBsaWJyYXJ5IFVSSXMgcHJlZmVyZW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gdXJpCi0JICogICAgICAgICAgICBhIG1ldGhvZCBsaWJyYXJ5IFVSSQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBhZGRPcGVuTGlicmFyeVVSSShTdHJpbmcgdXJpKSB7Ci0JCVByZWZlcmVuY2VVdGlsLmFkZFRvTGlzdChwcmVmU3RvcmUsIE9QRU5fTElCUkFSWV9VUklTLCB1cmkpOwotCX0KLQotCS8qKgotCSAqIFNhdmUgYWxsIHByZWZlcmVuY2VzCi0JICogCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNhdmVBbGxQcmVmZXJlbmNlcygpIHsKLQkJTGlicmFyeVVJUGx1Z2luLmdldERlZmF1bHQoKS5zYXZlUGx1Z2luUHJlZmVyZW5jZXMoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIG9wdGlvbmFsIGZlYXR1cmUgdmFsdWUgb2Ygd29yayBicmVha2Rvd24gZWxlbWVudCBpbiBwcmVmZXJlbmNlCi0JICogc3RvcmUKLQkgKiAKLQkgKiBAcmV0dXJuIHZhbHVlIC0gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBnZXRXb3JrQnJlYWtEb3duRWxlbWVudE9wdGlvbmFsKCkgewotCQlyZXR1cm4gcHJlZlN0b3JlLmdldEJvb2xlYW4oV09SS19CUkVBS0RPV05FTEVNRU5UX09QVElPTkFMKTsKLQl9Ci0KLQkvKioKLQkgKiBTYXZlcyB2YWx1ZSBmb3IgT3B0aW9uYWwgZmVhdHVyZSBvZiB3b3JrIGJyZWFrZG93biBlbGVtZW50IGluIHByZWZlcmVuY2UKLQkgKiBzdG9yZQotCSAqIAotCSAqIEBwYXJhbSB2YWx1ZSAtCi0JICogICAgICAgICAgICBib29sZWFuIHRydWUvZmFsc2UKLQkgKiAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0V29ya0JyZWFrZG93bkVsZW1lbnRPcHRpb25hbChib29sZWFuIHZhbHVlKSB7Ci0JCXByZWZTdG9yZS5zZXRWYWx1ZShXT1JLX0JSRUFLRE9XTkVMRU1FTlRfT1BUSU9OQUwsIHZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIG11bHRpcGxlIG9jY3VycmFuY2VzIGZlYXR1cmUgdmFsdWUgb2Ygd29yayBicmVha2Rvd24gZWxlbWVudCBpbgotCSAqIHByZWZlcmVuY2Ugc3RvcmUKLQkgKiAKLQkgKiBAcmV0dXJuIHZhbHVlIC0gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBnZXRXb3JrQnJlYWtEb3duRWxlbWVudE11bHRpcGxlT2NjdXJyYW5jZXMoKSB7Ci0JCXJldHVybiBwcmVmU3RvcmUuZ2V0Qm9vbGVhbihXT1JLX0JSRUFLRE9XTkVMRU1FTlRfTVVMVElQTEVfT0NDVVJSQU5DRVMpOwotCX0KLQotCS8qKgotCSAqIFNhdmVzIHZhbHVlIGZvciBNdWx0aXBsZSBPY2N1cnJhbmNlcyBmZWF0dXJlIG9mIHdvcmsgYnJlYWtkb3duIGVsZW1lbnQgaW4KLQkgKiBwcmVmZXJlbmNlIHN0b3JlCi0JICogCi0JICogQHBhcmFtIHZhbHVlIC0KLQkgKiAgICAgICAgICAgIGJvb2xlYW4gdHJ1ZS9mYWxzZQotCSAqIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRXb3JrQnJlYWtkb3duRWxlbWVudE11bHRpcGxlT2NjdXJyYW5jZXMoYm9vbGVhbiB2YWx1ZSkgewotCQlwcmVmU3RvcmUuc2V0VmFsdWUoV09SS19CUkVBS0RPV05FTEVNRU5UX01VTFRJUExFX09DQ1VSUkFOQ0VTLCB2YWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBwbGFubmVkIGZlYXR1cmUgdmFsdWUgb2Ygd29yayBicmVha2Rvd24gZWxlbWVudCBpbiBwcmVmZXJlbmNlCi0JICogc3RvcmUKLQkgKiAKLQkgKiBAcmV0dXJuIHZhbHVlIC0gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBnZXRXb3JrQnJlYWtEb3duRWxlbWVudFBsYW5uZWQoKSB7Ci0JCXJldHVybiBwcmVmU3RvcmUuZ2V0Qm9vbGVhbihXT1JLX0JSRUFLRE9XTkVMRU1FTlRfUExBTk5FRCk7Ci0JfQotCi0JLyoqCi0JICogU2F2ZXMgdmFsdWUgZm9yIFBsYW5uZWQgZmVhdHVyZSBvZiB3b3JrIGJyZWFrZG93biBlbGVtZW50IGluIHByZWZlcmVuY2UKLQkgKiBzdG9yZQotCSAqIAotCSAqIEBwYXJhbSB2YWx1ZSAtCi0JICogICAgICAgICAgICBib29sZWFuIHRydWUvZmFsc2UKLQkgKiAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0V29ya0JyZWFrZG93bkVsZW1lbnRQbGFubmVkKGJvb2xlYW4gdmFsdWUpIHsKLQkJcHJlZlN0b3JlLnNldFZhbHVlKFdPUktfQlJFQUtET1dORUxFTUVOVF9QTEFOTkVELCB2YWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBFdmVudERyaXZlbiBmZWF0dXJlIHZhbHVlIG9mIHdvcmsgYnJlYWtkb3duIGVsZW1lbnQgaW4gcHJlZmVyZW5jZQotCSAqIHN0b3JlCi0JICogCi0JICogQHJldHVybiB2YWx1ZSAtIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gZ2V0V29ya0JyZWFrRG93bkVsZW1lbnRFdmVudERyaXZlbigpIHsKLQkJcmV0dXJuIHByZWZTdG9yZS5nZXRCb29sZWFuKFdPUktfQlJFQUtET1dORUxFTUVOVF9FVkVOVF9EUklWRU4pOwotCX0KLQotCS8qKgotCSAqIFNhdmVzIHZhbHVlIGZvciBFdmVudERyaXZlbiBmZWF0dXJlIG9mIHdvcmsgYnJlYWtkb3duIGVsZW1lbnQgaW4KLQkgKiBwcmVmZXJlbmNlIHN0b3JlCi0JICogCi0JICogQHBhcmFtIHZhbHVlIC0KLQkgKiAgICAgICAgICAgIGJvb2xlYW4gdHJ1ZS9mYWxzZQotCSAqIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRXb3JrQnJlYWtkb3duRWxlbWVudEV2ZW50RHJpdmVuKGJvb2xlYW4gdmFsdWUpIHsKLQkJcHJlZlN0b3JlLnNldFZhbHVlKFdPUktfQlJFQUtET1dORUxFTUVOVF9FVkVOVF9EUklWRU4sIHZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIE9uZ29pbmcgZmVhdHVyZSB2YWx1ZSBvZiB3b3JrIGJyZWFrZG93biBlbGVtZW50IGluIHByZWZlcmVuY2UKLQkgKiBzdG9yZQotCSAqIAotCSAqIEByZXR1cm4gdmFsdWUgLSBib29sZWFuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGdldFdvcmtCcmVha0Rvd25FbGVtZW50T25nb2luZygpIHsKLQkJcmV0dXJuIHByZWZTdG9yZS5nZXRCb29sZWFuKFdPUktfQlJFQUtET1dORUxFTUVOVF9PTkdPSU5HKTsKLQl9Ci0KLQkvKioKLQkgKiBTYXZlcyB2YWx1ZSBmb3IgT25nb2luZyBmZWF0dXJlIG9mIHdvcmsgYnJlYWtkb3duIGVsZW1lbnQgaW4gcHJlZmVyZW5jZQotCSAqIHN0b3JlCi0JICogCi0JICogQHBhcmFtIHZhbHVlIC0KLQkgKiAgICAgICAgICAgIGJvb2xlYW4gdHJ1ZS9mYWxzZQotCSAqIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRXb3JrQnJlYWtkb3duRWxlbWVudE9uZ29pbmcoYm9vbGVhbiB2YWx1ZSkgewotCQlwcmVmU3RvcmUuc2V0VmFsdWUoV09SS19CUkVBS0RPV05FTEVNRU5UX09OR09JTkcsIHZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIFJlcGVhdGFibGUgZmVhdHVyZSB2YWx1ZSBvZiB3b3JrIGJyZWFrZG93biBlbGVtZW50IGluIHByZWZlcmVuY2UKLQkgKiBzdG9yZQotCSAqIAotCSAqIEByZXR1cm4gdmFsdWUgLSBib29sZWFuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGdldFdvcmtCcmVha0Rvd25FbGVtZW50UmVwZWF0YWJsZSgpIHsKLQkJcmV0dXJuIHByZWZTdG9yZS5nZXRCb29sZWFuKFdPUktfQlJFQUtET1dORUxFTUVOVF9SRVBFQVRBQkxFKTsKLQl9Ci0KLQkvKioKLQkgKiBTYXZlcyB2YWx1ZSBmb3IgUmVwZWF0YWJsZSBmZWF0dXJlIG9mIHdvcmsgYnJlYWtkb3duIGVsZW1lbnQgaW4KLQkgKiBwcmVmZXJlbmNlIHN0b3JlCi0JICogCi0JICogQHBhcmFtIHZhbHVlIC0KLQkgKiAgICAgICAgICAgIGJvb2xlYW4gdHJ1ZS9mYWxzZQotCSAqIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRXb3JrQnJlYWtkb3duRWxlbWVudFJlcGVhdGFibGUoYm9vbGVhbiB2YWx1ZSkgewotCQlwcmVmU3RvcmUuc2V0VmFsdWUoV09SS19CUkVBS0RPV05FTEVNRU5UX1JFUEVBVEFCTEUsIHZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIG9wdGlvbmFsIGZlYXR1cmUgdmFsdWUgb2Ygd29yayBicmVha2Rvd24gZWxlbWVudCBpbiBwcmVmZXJlbmNlCi0JICogc3RvcmUKLQkgKiAKLQkgKiBAcmV0dXJuIHZhbHVlIC0gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBnZXREZXNjcmlwdG9yT3B0aW9uYWwoKSB7Ci0JCXJldHVybiBwcmVmU3RvcmUuZ2V0Qm9vbGVhbihERVNDUklQVE9SX09QVElPTkFMKTsKLQl9Ci0KLQkvKioKLQkgKiBTYXZlcyB2YWx1ZSBmb3IgT3B0aW9uYWwgZmVhdHVyZSBvZiBkZXNjcmlwdG9yIGluIHByZWZlcmVuY2Ugc3RvcmUKLQkgKiAKLQkgKiBAcGFyYW0gdmFsdWUgLQotCSAqICAgICAgICAgICAgYm9vbGVhbiB0cnVlL2ZhbHNlCi0JICogCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldERlc2NyaXB0b3JPcHRpb25hbChib29sZWFuIHZhbHVlKSB7Ci0JCXByZWZTdG9yZS5zZXRWYWx1ZShERVNDUklQVE9SX09QVElPTkFMLCB2YWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBtdWx0aXBsZSBvY2N1cnJhbmNlcyBmZWF0dXJlIHZhbHVlIG9mIGRlc2NyaXB0b3IgaW4gcHJlZmVyZW5jZQotCSAqIHN0b3JlCi0JICogCi0JICogQHJldHVybiB2YWx1ZSAtIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gZ2V0RGVzY3JpcHRvck11bHRpcGxlT2NjdXJyYW5jZXMoKSB7Ci0JCXJldHVybiBwcmVmU3RvcmUuZ2V0Qm9vbGVhbihERVNDUklQVE9SX01VTFRJUExFX09DQ1VSUkFOQ0VTKTsKLQl9Ci0KLQkvKioKLQkgKiBTYXZlcyB2YWx1ZSBmb3IgTXVsdGlwbGUgT2NjdXJyYW5jZXMgZmVhdHVyZSBvZiBkZXNjcmlwdG9yIGluIHByZWZlcmVuY2UKLQkgKiBzdG9yZQotCSAqIAotCSAqIEBwYXJhbSB2YWx1ZSAtCi0JICogICAgICAgICAgICBib29sZWFuIHRydWUvZmFsc2UKLQkgKiAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0RGVzY3JpcHRvck11bHRpcGxlT2NjdXJyYW5jZXMoYm9vbGVhbiB2YWx1ZSkgewotCQlwcmVmU3RvcmUuc2V0VmFsdWUoREVTQ1JJUFRPUl9NVUxUSVBMRV9PQ0NVUlJBTkNFUywgdmFsdWUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgcGxhbm5lZCBmZWF0dXJlIHZhbHVlIG9mIGRlc2NyaXB0b3IgaW4gcHJlZmVyZW5jZSBzdG9yZQotCSAqIAotCSAqIEByZXR1cm4gdmFsdWUgLSBib29sZWFuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGdldERlc2NyaXB0b3JQbGFubmVkKCkgewotCQlyZXR1cm4gcHJlZlN0b3JlLmdldEJvb2xlYW4oREVTQ1JJUFRPUl9QTEFOTkVEKTsKLQl9Ci0KLQkvKioKLQkgKiBTYXZlcyB2YWx1ZSBmb3IgUGxhbm5lZCBmZWF0dXJlIG9mIGRlc2NyaXB0b3IgaW4gcHJlZmVyZW5jZSBzdG9yZQotCSAqIAotCSAqIEBwYXJhbSB2YWx1ZSAtCi0JICogICAgICAgICAgICBib29sZWFuIHRydWUvZmFsc2UKLQkgKiAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0RGVzY3JpcHRvclBsYW5uZWQoYm9vbGVhbiB2YWx1ZSkgewotCQlwcmVmU3RvcmUuc2V0VmFsdWUoREVTQ1JJUFRPUl9QTEFOTkVELCB2YWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBFdmVudERyaXZlbiBmZWF0dXJlIHZhbHVlIG9mIGRlc2NyaXB0b3IgaW4gcHJlZmVyZW5jZSBzdG9yZQotCSAqIAotCSAqIEByZXR1cm4gdmFsdWUgLSBib29sZWFuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGdldERlc2NyaXB0b3JFdmVudERyaXZlbigpIHsKLQkJcmV0dXJuIHByZWZTdG9yZS5nZXRCb29sZWFuKERFU0NSSVBUT1JfRVZFTlRfRFJJVkVOKTsKLQl9Ci0KLQkvKioKLQkgKiBTYXZlcyB2YWx1ZSBmb3IgRXZlbnREcml2ZW4gZmVhdHVyZSBvZiBkZXNjcmlwdG9yIGluIHByZWZlcmVuY2Ugc3RvcmUKLQkgKiAKLQkgKiBAcGFyYW0gdmFsdWUgLQotCSAqICAgICAgICAgICAgYm9vbGVhbiB0cnVlL2ZhbHNlCi0JICogCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldERlc2NyaXB0b3JFdmVudERyaXZlbihib29sZWFuIHZhbHVlKSB7Ci0JCXByZWZTdG9yZS5zZXRWYWx1ZShERVNDUklQVE9SX0VWRU5UX0RSSVZFTiwgdmFsdWUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgT25nb2luZyBmZWF0dXJlIHZhbHVlIG9mIGRlc2NyaXB0b3IgaW4gcHJlZmVyZW5jZSBzdG9yZQotCSAqIAotCSAqIEByZXR1cm4gdmFsdWUgLSBib29sZWFuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGdldERlc2NyaXB0b3JPbmdvaW5nKCkgewotCQlyZXR1cm4gcHJlZlN0b3JlLmdldEJvb2xlYW4oREVTQ1JJUFRPUl9PTkdPSU5HKTsKLQl9Ci0KLQkvKioKLQkgKiBTYXZlcyB2YWx1ZSBmb3IgT25nb2luZyBmZWF0dXJlIG9mIGRlc2NyaXB0b3IgaW4gcHJlZmVyZW5jZSBzdG9yZQotCSAqIAotCSAqIEBwYXJhbSB2YWx1ZSAtCi0JICogICAgICAgICAgICBib29sZWFuIHRydWUvZmFsc2UKLQkgKiAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0RGVzY3JpcHRvck9uZ29pbmcoYm9vbGVhbiB2YWx1ZSkgewotCQlwcmVmU3RvcmUuc2V0VmFsdWUoREVTQ1JJUFRPUl9PTkdPSU5HLCB2YWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyAiaW5jbHVkZSBkZXNjcmlwdG9ycyIgZmVhdHVyZSB2YWx1ZSBpbiBwcmVmZXJlbmNlIHN0b3JlCi0JICogCi0JICogQHJldHVybiB2YWx1ZSAtIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gZ2V0SW5jbHVkZURlc2NyaXB0b3JzKCkgewotCQlyZXR1cm4gcHJlZlN0b3JlLmdldEJvb2xlYW4oSU5DTFVERV9ERVNDUklQVE9SUyk7Ci0JfQotCi0JLyoqCi0JICogU2F2ZXMgdmFsdWUgZm9yICJpbmNsdWRlIGRlc2NyaXB0b3JzIiAgZmVhdHVyZSBpbiBwcmVmZXJlbmNlIHN0b3JlCi0JICogCi0JICogQHBhcmFtIHZhbHVlIC0KLQkgKiAgICAgICAgICAgIGJvb2xlYW4gdHJ1ZS9mYWxzZQotCSAqIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRJbmNsdWRlRGVzY3JpcHRvcnMoYm9vbGVhbiB2YWx1ZSkgewotCQlwcmVmU3RvcmUuc2V0VmFsdWUoSU5DTFVERV9ERVNDUklQVE9SUywgdmFsdWUpOwotCQlTdXBwb3J0aW5nRWxlbWVudERhdGEuc2V0RGVzY3JpcHRvckV4Y2x1c2l2ZU9wdGlvbighdmFsdWUpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIFJlcGVhdGFibGUgZmVhdHVyZSB2YWx1ZSBvZiBkZXNjcmlwdG9yIGluIHByZWZlcmVuY2Ugc3RvcmUKLQkgKiAKLQkgKiBAcmV0dXJuIHZhbHVlIC0gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBnZXREZXNjcmlwdG9yUmVwZWF0YWJsZSgpIHsKLQkJcmV0dXJuIHByZWZTdG9yZS5nZXRCb29sZWFuKERFU0NSSVBUT1JfUkVQRUFUQUJMRSk7Ci0JfQotCi0JLyoqCi0JICogU2F2ZXMgdmFsdWUgZm9yIFJlcGVhdGFibGUgZmVhdHVyZSBvZiBkZXNjcmlwdG9yIGluIHByZWZlcmVuY2Ugc3RvcmUKLQkgKiAKLQkgKiBAcGFyYW0gdmFsdWUgLQotCSAqICAgICAgICAgICAgYm9vbGVhbiB0cnVlL2ZhbHNlCi0JICogCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldERlc2NyaXB0b3JSZXBlYXRhYmxlKGJvb2xlYW4gdmFsdWUpIHsKLQkJcHJlZlN0b3JlLnNldFZhbHVlKERFU0NSSVBUT1JfUkVQRUFUQUJMRSwgdmFsdWUpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBhcHBseURlZmF1bHRWYWx1ZXNGb3JCcmVha2Rvd25FbGVtZW50QXR0cmlidXRlcygpIHsKLQkJT2JqZWN0W10gbm9uRGVzY3JpcHRvckRlZmF1bHRWYWx1ZURlZnMgPSB7Ci0JCQkJbmV3IE9iamVjdFtdIHsKLQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCS5nZXRXb3JrQnJlYWtkb3duRWxlbWVudF9Jc0V2ZW50RHJpdmVuKCksCi0JCQkJCQlCb29sZWFuLnZhbHVlT2YoTGlicmFyeVVJUHJlZmVyZW5jZXMKLQkJCQkJCQkJLmdldFdvcmtCcmVha0Rvd25FbGVtZW50RXZlbnREcml2ZW4oKSkgfSwKLQkJCQluZXcgT2JqZWN0W10gewotCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJLmdldEJyZWFrZG93bkVsZW1lbnRfSGFzTXVsdGlwbGVPY2N1cnJlbmNlcygpLAotCQkJCQkJQm9vbGVhbi52YWx1ZU9mKExpYnJhcnlVSVByZWZlcmVuY2VzCi0JCQkJCQkJCS5nZXRXb3JrQnJlYWtEb3duRWxlbWVudE11bHRpcGxlT2NjdXJyYW5jZXMoKSkgfSwKLQkJCQluZXcgT2JqZWN0W10gewotCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJLmdldFdvcmtCcmVha2Rvd25FbGVtZW50X0lzT25nb2luZygpLAotCQkJCQkJQm9vbGVhbi52YWx1ZU9mKExpYnJhcnlVSVByZWZlcmVuY2VzCi0JCQkJCQkJCS5nZXRXb3JrQnJlYWtEb3duRWxlbWVudE9uZ29pbmcoKSkgfSwKLQkJCQluZXcgT2JqZWN0W10gewotCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QnJlYWtkb3duRWxlbWVudF9Jc09wdGlvbmFsKCksCi0JCQkJCQlCb29sZWFuLnZhbHVlT2YoTGlicmFyeVVJUHJlZmVyZW5jZXMKLQkJCQkJCQkJLmdldFdvcmtCcmVha0Rvd25FbGVtZW50T3B0aW9uYWwoKSkgfSwKLQkJCQluZXcgT2JqZWN0W10gewotCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QnJlYWtkb3duRWxlbWVudF9Jc1BsYW5uZWQoKSwKLQkJCQkJCUJvb2xlYW4udmFsdWVPZihMaWJyYXJ5VUlQcmVmZXJlbmNlcwotCQkJCQkJCQkuZ2V0V29ya0JyZWFrRG93bkVsZW1lbnRQbGFubmVkKCkpIH0sCi0JCQkJbmV3IE9iamVjdFtdIHsKLQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCS5nZXRXb3JrQnJlYWtkb3duRWxlbWVudF9Jc1JlcGVhdGFibGUoKSwKLQkJCQkJCUJvb2xlYW4udmFsdWVPZihMaWJyYXJ5VUlQcmVmZXJlbmNlcwotCQkJCQkJCQkuZ2V0V29ya0JyZWFrRG93bkVsZW1lbnRSZXBlYXRhYmxlKCkpIH0gfTsKLQkJRUNsYXNzW10gbm9uRGVzY3JpcHRvclR5cGVzID0geyBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRQaGFzZSgpLAotCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEl0ZXJhdGlvbigpLAotCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEFjdGl2aXR5KCksCi0JCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWlsZXN0b25lKCkgfTsKLQotCQlPYmplY3RbXSBkZXNjcmlwdG9yRGVmYXVsdFZhbHVlRGVmcyA9IHsKLQkJCQluZXcgT2JqZWN0W10gewotCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJLmdldFdvcmtCcmVha2Rvd25FbGVtZW50X0lzRXZlbnREcml2ZW4oKSwKLQkJCQkJCUJvb2xlYW4udmFsdWVPZihMaWJyYXJ5VUlQcmVmZXJlbmNlcwotCQkJCQkJCQkuZ2V0RGVzY3JpcHRvckV2ZW50RHJpdmVuKCkpIH0sCi0JCQkJbmV3IE9iamVjdFtdIHsKLQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCS5nZXRCcmVha2Rvd25FbGVtZW50X0hhc011bHRpcGxlT2NjdXJyZW5jZXMoKSwKLQkJCQkJCUJvb2xlYW4udmFsdWVPZihMaWJyYXJ5VUlQcmVmZXJlbmNlcwotCQkJCQkJCQkuZ2V0RGVzY3JpcHRvck11bHRpcGxlT2NjdXJyYW5jZXMoKSkgfSwKLQkJCQluZXcgT2JqZWN0W10gewotCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJLmdldFdvcmtCcmVha2Rvd25FbGVtZW50X0lzT25nb2luZygpLAotCQkJCQkJQm9vbGVhbi52YWx1ZU9mKExpYnJhcnlVSVByZWZlcmVuY2VzCi0JCQkJCQkJCS5nZXREZXNjcmlwdG9yT25nb2luZygpKSB9LAotCQkJCW5ldyBPYmplY3RbXSB7Ci0JCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRCcmVha2Rvd25FbGVtZW50X0lzT3B0aW9uYWwoKSwKLQkJCQkJCUJvb2xlYW4udmFsdWVPZihMaWJyYXJ5VUlQcmVmZXJlbmNlcwotCQkJCQkJCQkuZ2V0RGVzY3JpcHRvck9wdGlvbmFsKCkpIH0sCi0JCQkJbmV3IE9iamVjdFtdIHsKLQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEJyZWFrZG93bkVsZW1lbnRfSXNQbGFubmVkKCksCi0JCQkJCQlCb29sZWFuLnZhbHVlT2YoTGlicmFyeVVJUHJlZmVyZW5jZXMKLQkJCQkJCQkJLmdldERlc2NyaXB0b3JQbGFubmVkKCkpIH0sCi0JCQkJbmV3IE9iamVjdFtdIHsKLQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCS5nZXRXb3JrQnJlYWtkb3duRWxlbWVudF9Jc1JlcGVhdGFibGUoKSwKLQkJCQkJCUJvb2xlYW4udmFsdWVPZihMaWJyYXJ5VUlQcmVmZXJlbmNlcwotCQkJCQkJCQkuZ2V0RGVzY3JpcHRvclJlcGVhdGFibGUoKSkgfSB9OwotCQlFQ2xhc3NbXSBkZXNjcmlwdG9yVHlwZXMgPSB7IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFJvbGVEZXNjcmlwdG9yKCksCi0JCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza0Rlc2NyaXB0b3IoKSwKLQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRXb3JrUHJvZHVjdERlc2NyaXB0b3IoKSB9OwotCi0JCU9iamVjdFtdIGRlZmF1bHRWYWx1ZURlZnMgPSB7Ci0JCQkJbmV3IE9iamVjdFtdIHsgbm9uRGVzY3JpcHRvclR5cGVzLAotCQkJCQkJbm9uRGVzY3JpcHRvckRlZmF1bHRWYWx1ZURlZnMgfSwKLQkJCQluZXcgT2JqZWN0W10geyBkZXNjcmlwdG9yVHlwZXMsIGRlc2NyaXB0b3JEZWZhdWx0VmFsdWVEZWZzIH0gfTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IGRlZmF1bHRWYWx1ZURlZnMubGVuZ3RoOyBpKyspIHsKLQkJCU9iamVjdFtdIGRlZmF1bHRWYWx1ZURlZiA9IChPYmplY3RbXSkgZGVmYXVsdFZhbHVlRGVmc1tpXTsKLQkJCUVDbGFzc1tdIHR5cGVzID0gKEVDbGFzc1tdKSBkZWZhdWx0VmFsdWVEZWZbMF07Ci0JCQlPYmplY3RbXSBmZWF0dXJlRGVmYXVsdFZhbHVlRGVmcyA9IChPYmplY3RbXSkgZGVmYXVsdFZhbHVlRGVmWzFdOwotCQkJZm9yIChpbnQgayA9IDA7IGsgPCBmZWF0dXJlRGVmYXVsdFZhbHVlRGVmcy5sZW5ndGg7IGsrKykgewotCQkJCU9iamVjdFtdIGZlYXR1cmVEZWZhdWx0VmFsdWUgPSAoT2JqZWN0W10pIGZlYXR1cmVEZWZhdWx0VmFsdWVEZWZzW2tdOwotCQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgZmVhdHVyZURlZmF1bHRWYWx1ZVswXTsKLQkJCQlPYmplY3QgZGVmYXVsdFZhbHVlID0gZmVhdHVyZURlZmF1bHRWYWx1ZVsxXTsKLQkJCQlmb3IgKGludCBqID0gMDsgaiA8IHR5cGVzLmxlbmd0aDsgaisrKSB7Ci0JCQkJCUVDbGFzcyB0eXBlID0gdHlwZXNbal07Ci0JCQkJCURlZmF1bHRWYWx1ZU1hbmFnZXIuSU5TVEFOQ0Uuc2V0RGVmYXVsdFZhbHVlKHR5cGUsIGZlYXR1cmUsCi0JCQkJCQkJZGVmYXVsdFZhbHVlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvcHJlZmVyZW5jZXMvUmVjZW50bHlPcGVuZWRMaWJyYXJ5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvcHJlZmVyZW5jZXMvUmVjZW50bHlPcGVuZWRMaWJyYXJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxZWEzMTcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL3ByZWZlcmVuY2VzL1JlY2VudGx5T3BlbmVkTGlicmFyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkucHJlZmVyZW5jZXM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5uZXQuVVJJOwotaW1wb3J0IGphdmEubmV0LlVSSVN5bnRheEV4Y2VwdGlvbjsKLQotLyoqCi0gKiBNb2RlbHMgYSByZWNlbnRseSBvcGVuZWQgbWV0aG9kIGxpYnJhcnkgcHJlZmVyZW5jZS4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKi8KLXB1YmxpYyBjbGFzcyBSZWNlbnRseU9wZW5lZExpYnJhcnkgewotCi0JcHJpdmF0ZSBVUkkgdXJpOwotCQotCXByaXZhdGUgU3RyaW5nIG5hbWU7Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgcGF0aDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFJlY2VudGx5T3BlbmVkTGlicmFyeShTdHJpbmcgdXJpKSB7Ci0JCXRyeSB7Ci0JCQl0aGlzLnVyaSA9IG5ldyBVUkkodXJpKTsKLQkJCUZpbGUgZmlsZSA9IG5ldyBGaWxlKHRoaXMudXJpKTsKLQkJCXRoaXMubmFtZSA9IGZpbGUuZ2V0TmFtZSgpOwotCQkJdGhpcy5wYXRoID0gZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKTsKLQkJfSBjYXRjaCAoVVJJU3ludGF4RXhjZXB0aW9uIGUpIHsKLQkJfQotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGxpYnJhcnkgbmFtZQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgbGlicmFyeSBVUkkuCi0JICovCi0JcHVibGljIFVSSSBnZXRVUkkoKSB7Ci0JCXJldHVybiB1cmk7Ci0JfQotCQotCS8qKgotCSAqIEdldHMgdGhlIGxpYnJhcnkgcGF0aC4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFBhdGgoKSB7Ci0JCXJldHVybiBwYXRoOwotCX0JCi0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9wcmVmZXJlbmNlcy9wYWNrYWdlLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvcHJlZmVyZW5jZXMvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOTg1OGEwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9wcmVmZXJlbmNlcy9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyBwcmVmZXJlbmNlIHN1cHBvcnQgZm9yIG1hbmFnaW5nIGEgbWV0aG9kIGxpYnJhcnkuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL3Byb3ZpZGVycy9BYnN0cmFjdEVsZW1lbnRUcmVlQ29udGVudFByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvcHJvdmlkZXJzL0Fic3RyYWN0RWxlbWVudFRyZWVDb250ZW50UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTZjNzNjYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvcHJvdmlkZXJzL0Fic3RyYWN0RWxlbWVudFRyZWVDb250ZW50UHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5wcm92aWRlcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5FeHRlbmRlZEltYWdlUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5MaWJyYXJ5VUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFydGlmYWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpc2NpcGxpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Eb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJhY3RpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0VsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVHJlZUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVWaWV3ZXI7Ci0KLS8qKgotICogQW4gYWJzdHJhY3QgdHJlZSBjb250ZW50IHByb3ZpZGVyIGFuIGVsZW1lbnQgdHJlZSB2aWV3ZXIuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgUGllcnJlIFBhZG92YW5pCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEVsZW1lbnRUcmVlQ29udGVudFByb3ZpZGVyIGltcGxlbWVudHMKLQkJSVRyZWVDb250ZW50UHJvdmlkZXIgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBLR19OQU1FX0NPTlRFTlQgPSAiQ29udGVudCI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQS0dfTkFNRV9DT1JFX0NPTlRFTlQgPSAiQ29yZUNvbnRlbnQiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEtHX05BTUVfQ0FURUdPUklFUyA9ICJDYXRlZ29yaWVzIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBLR19OQU1FX0RJU0NJUExJTkVTID0gIkRpc2NpcGxpbmVzIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBLR19OQU1FX0RPTUFJTlMgPSAiRG9tYWlucyI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQS0dfTkFNRV9XT1JLX1BST0RVQ1RfVFlQRVMgPSAiV1AgVHlwZXMiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEtHX05BTUVfUk9MRVNFVFMgPSAiUm9sZVNldHMiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEtHX05BTUVfVE9PTFMgPSAiVG9vbHMiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEtHX05BTUVfQ1VTVE9NX0NBVEVHT1JJRVMgPSAiQ3VzdG9tQ2F0ZWdvcmllcyI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQS0dfTkFNRV9DQVBBQklMSVRZX1BBVFRFUk5TID0gIkNhcGFiaWxpdHlQYXR0ZXJucyI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQS0dfTkFNRV9ERUxJVkVSWV9QUk9DRVNTRVMgPSAiRGVsaXZlcnlQcm9jZXNzZXMiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVUSE9EX0NPTlRFTlQgPSBMaWJyYXJ5VUlSZXNvdXJjZXMuZWxlbWVudFRDUHJvdmlkZXJfbWV0aG9kQ29udGVudDsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT05URU5UX1BBQ0tBR0VTID0gTGlicmFyeVVJUmVzb3VyY2VzLmVsZW1lbnRUQ1Byb3ZpZGVyX2NvbnRlbnRQYWNrYWdlczsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTVEFOREFSRF9DQVRFR09SSUVTID0gTGlicmFyeVVJUmVzb3VyY2VzLmVsZW1lbnRUQ1Byb3ZpZGVyX3N0YW5kYXJkQ2F0ZWdvcmllczsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBESVNDSVBMSU5FUyA9IExpYnJhcnlVSVJlc291cmNlcy5lbGVtZW50VENQcm92aWRlcl9kaXNjaXBsaW5lczsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBET01BSU5TID0gTGlicmFyeVVJUmVzb3VyY2VzLmVsZW1lbnRUQ1Byb3ZpZGVyX2RvbWFpbnM7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgV09SS19QUk9EVUNUX1RZUEVTID0gTGlicmFyeVVJUmVzb3VyY2VzLmVsZW1lbnRUQ1Byb3ZpZGVyX3dvcmtQcm9kdWN0VHlwZXM7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUk9MRVNFVFMgPSBMaWJyYXJ5VUlSZXNvdXJjZXMuZWxlbWVudFRDUHJvdmlkZXJfcm9sZVNldHM7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVE9PTFMgPSBMaWJyYXJ5VUlSZXNvdXJjZXMuZWxlbWVudFRDUHJvdmlkZXJfdG9vbHM7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1VTVE9NX0NBVEVHT1JJRVMgPSBMaWJyYXJ5VUlSZXNvdXJjZXMuZWxlbWVudFRDUHJvdmlkZXJfY3VzdG9tQ2F0ZWdvcmllczsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9DRVNTRVMgPSBMaWJyYXJ5VUlSZXNvdXJjZXMuZWxlbWVudFRDUHJvdmlkZXJfcHJvY2Vzc2VzOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENBUEFCSUxJVFlfUEFUVEVSTlMgPSBMaWJyYXJ5VUlSZXNvdXJjZXMuZWxlbWVudFRDUHJvdmlkZXJfY2FwYWJpbGl0eVBhdHRlcm5zOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFTElWRVJZX1BST0NFU1NFUyA9IExpYnJhcnlVSVJlc291cmNlcy5lbGVtZW50VENQcm92aWRlcl9kZWxpdmVyeVByb2Nlc3NlczsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdFtdIEVNUFRZX0xJU1QgPSBuZXcgT2JqZWN0WzBdOwotCi0JcHJpdmF0ZSBUcmVlVmlld2VyIHRyZWVWaWV3ZXI7Ci0KLQlwcml2YXRlIE1hcDxPYmplY3QsIFNldDxPYmplY3Q+PiBlbGVtZW50TWFwID0gbmV3IEhhc2hNYXA8T2JqZWN0LCBTZXQ8T2JqZWN0Pj4oKTsKLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVHJlZUNvbnRlbnRQcm92aWRlciNnZXRDaGlsZHJlbihPYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdFtdIGdldENoaWxkcmVuKE9iamVjdCBwYXJlbnRFbGVtZW50KSB7Ci0JCWlmIChlbGVtZW50TWFwID09IG51bGwpIHsKLQkJCXJldHVybiBFTVBUWV9MSVNUOwotCQl9Ci0JCVNldDxPYmplY3Q+IGNoaWxkcmVuID0gZWxlbWVudE1hcC5nZXQocGFyZW50RWxlbWVudCk7Ci0JCWlmIChjaGlsZHJlbiA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gRU1QVFlfTElTVDsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW4udG9BcnJheSgpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVHJlZUNvbnRlbnRQcm92aWRlciNnZXRQYXJlbnQoT2JqZWN0KQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBlbGVtZW50KSB7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgRWxlbWVudFRyZWVDb250ZW50UHJvdmlkZXJVSUZvbGRlcikgewotCQkJcmV0dXJuICgoRWxlbWVudFRyZWVDb250ZW50UHJvdmlkZXJVSUZvbGRlcikgZWxlbWVudCkuZ2V0UGFyZW50KCk7Ci0JCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFByb2Nlc3NQYWNrYWdlKSB7Ci0JCQlQcm9jZXNzUGFja2FnZSBwcm9jZXNzUGFja2FnZSA9IChQcm9jZXNzUGFja2FnZSkgZWxlbWVudDsKLQkJCU9iamVjdCBwYXJlbnQgPSBwcm9jZXNzUGFja2FnZS5lQ29udGFpbmVyKCk7Ci0JCQlpZiAocGFyZW50IGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkgewotCQkJCVByb2Nlc3NDb21wb25lbnQgcHJvY2Vzc0NvbXBvbmVudCA9IChQcm9jZXNzQ29tcG9uZW50KSBwYXJlbnQ7Ci0JCQkJcmV0dXJuIHByb2Nlc3NDb21wb25lbnQuZ2V0UHJvY2VzcygpOwotCQkJfSBlbHNlIHsKLQkJCQlyZXR1cm4gcGFyZW50OwotCQkJfQotCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RQYWNrYWdlKSB7Ci0JCQlNZXRob2RQYWNrYWdlIG1ldGhvZFBhY2thZ2UgPSAoTWV0aG9kUGFja2FnZSkgZWxlbWVudDsKLQkJCU9iamVjdCBwYXJlbnQgPSBtZXRob2RQYWNrYWdlLmVDb250YWluZXIoKTsKLQkJCWlmIChwYXJlbnQgaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pIHsKLQkJCQlyZXR1cm4gcGFyZW50OwotCQkJfQotCQkJTWV0aG9kUGFja2FnZSBwYXJlbnRQYWNrYWdlID0gbWV0aG9kUGFja2FnZS5nZXRQYXJlbnRQYWNrYWdlKCk7Ci0JCQlyZXR1cm4gcGFyZW50UGFja2FnZTsKLQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgQXJ0aWZhY3QpIHsKLQkJCUFydGlmYWN0IGFydGlmYWN0ID0gKEFydGlmYWN0KSBlbGVtZW50OwotCQkJQXJ0aWZhY3QgY29udGFpbmVyQXJ0aWZhY3QgPSBhcnRpZmFjdC5nZXRDb250YWluZXJBcnRpZmFjdCgpOwotCQkJaWYgKGNvbnRhaW5lckFydGlmYWN0ICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gY29udGFpbmVyQXJ0aWZhY3Q7Ci0JCQl9IGVsc2UgewotCQkJCXJldHVybiBVbWFVdGlsLmdldENvbnRlbnRQYWNrYWdlKGFydGlmYWN0KTsKLQkJCX0KLQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgUHJhY3RpY2UpIHsKLQkJCVByYWN0aWNlIHByYWN0aWNlID0gKFByYWN0aWNlKSBlbGVtZW50OwotCQkJcmV0dXJuIHByYWN0aWNlLmdldENvbnRhaW5lcigpOwotCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBEaXNjaXBsaW5lKSB7Ci0JCQlEaXNjaXBsaW5lIGRpc2NpcGxpbmUgPSAoRGlzY2lwbGluZSkgZWxlbWVudDsKLQkJCXJldHVybiBkaXNjaXBsaW5lLmdldENvbnRhaW5lcigpOwotCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBEb21haW4pIHsKLQkJCURvbWFpbiBkb21haW4gPSAoRG9tYWluKSBlbGVtZW50OwotCQkJcmV0dXJuIGRvbWFpbi5nZXRDb250YWluZXIoKTsKLQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgQ29udGVudEVsZW1lbnQpIHsKLQkJCXJldHVybiBVbWFVdGlsLmdldENvbnRlbnRQYWNrYWdlKChDb250ZW50RWxlbWVudCkgZWxlbWVudCk7Ci0JCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFByb2Nlc3MpIHsKLQkJCVByb2Nlc3MgcHJvY2VzcyA9IChQcm9jZXNzKSBlbGVtZW50OwotCQkJUHJvY2Vzc1BhY2thZ2UgcGFyZW50ID0gKFByb2Nlc3NQYWNrYWdlKSBwcm9jZXNzLmVDb250YWluZXIoKTsKLQkJCWlmIChwYXJlbnQgIT0gbnVsbCkgewotCQkJCXJldHVybiBwYXJlbnQuZUNvbnRhaW5lcigpOwotCQkJfQotCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJUHJvY2Vzc1BhY2thZ2UgcHJvY2Vzc1BhY2thZ2UgPSBVbWFVdGlsCi0JCQkJCS5nZXRQcm9jZXNzUGFja2FnZSgoUHJvY2Vzc0VsZW1lbnQpIGVsZW1lbnQpOwotCQkJaWYgKHByb2Nlc3NQYWNrYWdlICE9IG51bGwpIHsKLQkJCQlQcm9jZXNzUGFja2FnZSBwYXJlbnRQYWNrYWdlID0gKFByb2Nlc3NQYWNrYWdlKSBwcm9jZXNzUGFja2FnZQotCQkJCQkJLmdldFBhcmVudFBhY2thZ2UoKTsKLQkJCQlpZiAocGFyZW50UGFja2FnZSAhPSBudWxsKSB7Ci0JCQkJCWlmIChwYXJlbnRQYWNrYWdlIGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkgewotCQkJCQkJUHJvY2Vzc0NvbXBvbmVudCBwcm9jZXNzQ29tcG9uZW50ID0gKFByb2Nlc3NDb21wb25lbnQpIHBhcmVudFBhY2thZ2U7Ci0JCQkJCQlyZXR1cm4gcHJvY2Vzc0NvbXBvbmVudC5nZXRQcm9jZXNzKCk7Ci0JCQkJCX0KLQkJCQkJTGlzdDxQcm9jZXNzRWxlbWVudD4gcHJvY2Vzc0VsZW1lbnRzID0gcGFyZW50UGFja2FnZQotCQkJCQkJCS5nZXRQcm9jZXNzRWxlbWVudHMoKTsKLQkJCQkJZm9yIChQcm9jZXNzRWxlbWVudCBwcm9jZXNzRWxlbWVudCA6IHByb2Nlc3NFbGVtZW50cykgewotCQkJCQkJaWYgKHByb2Nlc3NFbGVtZW50IGluc3RhbmNlb2YgQWN0aXZpdHkKLQkJCQkJCQkJJiYgcHJvY2Vzc0VsZW1lbnQuZ2V0TmFtZSgpLmVxdWFscygKLQkJCQkJCQkJCQlwYXJlbnRQYWNrYWdlLmdldE5hbWUoKSkpIHsKLQkJCQkJCQlyZXR1cm4gcHJvY2Vzc0VsZW1lbnQ7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFByb2Nlc3NFbGVtZW50KSB7Ci0JCQlQcm9jZXNzUGFja2FnZSBwcm9jZXNzUGFja2FnZSA9IFVtYVV0aWwKLQkJCQkJLmdldFByb2Nlc3NQYWNrYWdlKChQcm9jZXNzRWxlbWVudCkgZWxlbWVudCk7Ci0JCQlpZiAocHJvY2Vzc1BhY2thZ2UgIT0gbnVsbCkgewotCQkJCWlmIChwcm9jZXNzUGFja2FnZSBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpIHsKLQkJCQkJUHJvY2Vzc0NvbXBvbmVudCBwcm9jZXNzQ29tcG9uZW50ID0gKFByb2Nlc3NDb21wb25lbnQpIHByb2Nlc3NQYWNrYWdlOwotCQkJCQlyZXR1cm4gcHJvY2Vzc0NvbXBvbmVudC5nZXRQcm9jZXNzKCk7Ci0JCQkJfQotCQkJCUxpc3Q8UHJvY2Vzc0VsZW1lbnQ+IHByb2Nlc3NFbGVtZW50cyA9IHByb2Nlc3NQYWNrYWdlCi0JCQkJCQkuZ2V0UHJvY2Vzc0VsZW1lbnRzKCk7Ci0JCQkJZm9yIChQcm9jZXNzRWxlbWVudCBwcm9jZXNzRWxlbWVudCA6IHByb2Nlc3NFbGVtZW50cykgewotCQkJCQlpZiAocHJvY2Vzc0VsZW1lbnQgaW5zdGFuY2VvZiBBY3Rpdml0eQotCQkJCQkJCSYmIHByb2Nlc3NFbGVtZW50LmdldE5hbWUoKS5lcXVhbHMoCi0JCQkJCQkJCQlwcm9jZXNzUGFja2FnZS5nZXROYW1lKCkpKSB7Ci0JCQkJCQlyZXR1cm4gcHJvY2Vzc0VsZW1lbnQ7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJcmV0dXJuIHByb2Nlc3NQYWNrYWdlOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVHJlZUNvbnRlbnRQcm92aWRlciNoYXNDaGlsZHJlbihPYmplY3QpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oT2JqZWN0IGVsZW1lbnQpIHsKLQkJcmV0dXJuIGdldENoaWxkcmVuKGVsZW1lbnQpLmxlbmd0aCA+IDA7Ci0JfQotCi0JcHVibGljIHZvaWQgY2xlYXIoKSB7Ci0JCXRyZWVWaWV3ZXIucmVmcmVzaCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgbXVzdCByZXR1cm4gdGhlIHNvdXJjZSBvZiB0aGUgZGF0YSB0aGF0IGlzIHBvcHVsYXRlZCBpbgotCSAqIHRoaXMgdHJlZS4KLQkgKiAKLQkgKiBJbXBsZW1lbnRvcnMgbXVzdCBpbXBsZW1lbnQgdGhpcyBtZXRob2QuCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBPYmplY3QgZ2V0Q29udGVudFNvdXJjZSgpOwotCi0JcHJvdGVjdGVkIHZvaWQgaW5zZXJ0KE9iamVjdCBjaGlsZCwgYm9vbGVhbiByZWZyZXNoVmlld2VyKSB7Ci0JCU9iamVjdCBwYXJlbnQgPSBnZXRQYXJlbnQoY2hpbGQpOwotCQl3aGlsZSAocGFyZW50ICE9IG51bGwpIHsKLQkJCWlmIChpbnNlcnRDaGlsZChwYXJlbnQsIGNoaWxkKSkgewotCQkJCWlmIChyZWZyZXNoVmlld2VyKSB7Ci0JCQkJCXRyZWVWaWV3ZXIuYWRkKHBhcmVudCwgY2hpbGQpOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKHJlZnJlc2hWaWV3ZXIpIHsKLQkJCQkJdHJlZVZpZXdlci5yZWZyZXNoKHBhcmVudCk7Ci0JCQkJfQotCQkJCXJldHVybjsKLQkJCX0KLQkJCWNoaWxkID0gcGFyZW50OwotCQkJcGFyZW50ID0gZ2V0UGFyZW50KGNoaWxkKTsKLQkJfQotCQlpZiAoaW5zZXJ0Q2hpbGQoZ2V0Q29udGVudFNvdXJjZSgpLCBjaGlsZCkpIHsKLQkJCWlmIChyZWZyZXNoVmlld2VyKSB7Ci0JCQkJdHJlZVZpZXdlci5hZGQoZ2V0Q29udGVudFNvdXJjZSgpLCBjaGlsZCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpbnNlcnRDaGlsZChPYmplY3QgcGFyZW50LCBPYmplY3QgY2hpbGQpIHsKLQkJU2V0PE9iamVjdD4gY2hpbGRyZW4gPSBlbGVtZW50TWFwLmdldChwYXJlbnQpOwotCQlpZiAoY2hpbGRyZW4gPT0gbnVsbCkgewotCQkJY2hpbGRyZW4gPSBuZXcgSGFzaFNldDxPYmplY3Q+KCk7Ci0JCQllbGVtZW50TWFwLnB1dChwYXJlbnQsIGNoaWxkcmVuKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW4uYWRkKGNoaWxkKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZXBsYWNlKE9iamVjdCBwYXJlbnQsIE9iamVjdCBjaGlsZCwgT2JqZWN0IG5ld0NoaWxkKSB7Ci0JCWluc2VydChuZXdDaGlsZCwgZmFsc2UpOwotCQllbGVtZW50TWFwLnB1dChuZXdDaGlsZCwgZWxlbWVudE1hcC5nZXQoY2hpbGQpKTsKLQkJZWxlbWVudE1hcC5yZW1vdmUoY2hpbGQpOwotCQlTZXQ8T2JqZWN0PiBjaGlsZHJlbiA9IGVsZW1lbnRNYXAuZ2V0KHBhcmVudCk7Ci0JCWNoaWxkcmVuLnJlbW92ZShjaGlsZCk7Ci0JfQotCi0JLyoqCi0JICogSW1wbGVtZW50aW5nIGNsYXNzZXMgbXVzdCBvdmVycmlkZSBhbmQgaW1wbGVtZW50IHRoaXMgbWV0aG9kLgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogQHBhcmFtIHJlZnJlc2hWaWV3ZXIKLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCByZW1vdmUoT2JqZWN0IGVsZW1lbnQsIGJvb2xlYW4gcmVmcmVzaFZpZXdlcik7Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVGcm9tU2libGluZ3MoT2JqZWN0IGVsZW1lbnQsIE9iamVjdCBwYXJlbnQpIHsKLQkJU2V0PE9iamVjdD4gc2libGluZ3MgPSBlbGVtZW50TWFwLmdldChwYXJlbnQpOwotCQlpZiAoc2libGluZ3MgIT0gbnVsbCkgewotCQkJc2libGluZ3MucmVtb3ZlKGVsZW1lbnQpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5zZXJ0VUlGb2xkZXJzKE1ldGhvZFBsdWdpbiBlbGVtZW50KSB7Ci0JCUVsZW1lbnRUcmVlQ29udGVudFByb3ZpZGVyVUlGb2xkZXIgbWV0aG9kQ29udGVudEZvbGRlciA9IG5ldyBFbGVtZW50VHJlZUNvbnRlbnRQcm92aWRlclVJRm9sZGVyKAotCQkJCU1FVEhPRF9DT05URU5ULCBFeHRlbmRlZEltYWdlUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZSgKLQkJCQkJCUxpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCQkJCS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9Db250ZW50IikpLCBlbGVtZW50KTsgLy8kTk9OLU5MUy0xJAotCQlFbGVtZW50VHJlZUNvbnRlbnRQcm92aWRlclVJRm9sZGVyIHByb2Nlc3Nlc0ZvbGRlciA9IG5ldyBFbGVtZW50VHJlZUNvbnRlbnRQcm92aWRlclVJRm9sZGVyKAotCQkJCVBST0NFU1NFUywgRXh0ZW5kZWRJbWFnZVJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0SW1hZ2UoCi0JCQkJCQlMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkJCQkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvUHJvY2Vzc2VzIikpLCBlbGVtZW50KTsgLy8kTk9OLU5MUy0xJAotCQlPYmplY3RbXSBtZXRob2RQYWNrYWdlcyA9IGdldENoaWxkcmVuKGVsZW1lbnQpOwotCQlmb3IgKGludCBqID0gMDsgaiA8IG1ldGhvZFBhY2thZ2VzLmxlbmd0aDsgaisrKSB7Ci0JCQlPYmplY3QgbWV0aG9kUGFja2FnZSA9IG1ldGhvZFBhY2thZ2VzW2pdOwotCQkJaWYgKG1ldGhvZFBhY2thZ2UgaW5zdGFuY2VvZiBDb250ZW50UGFja2FnZQotCQkJCQkmJiAoKENvbnRlbnRQYWNrYWdlKSBtZXRob2RQYWNrYWdlKS5nZXROYW1lKCkuZXF1YWxzKAotCQkJCQkJCVBLR19OQU1FX0NPTlRFTlQpKSB7Ci0JCQkJT2JqZWN0W10gcGFja2FnZXMgPSBnZXRDaGlsZHJlbihtZXRob2RQYWNrYWdlKTsKLQkJCQlmb3IgKGludCBrID0gMDsgayA8IHBhY2thZ2VzLmxlbmd0aDsgaysrKSB7Ci0JCQkJCU9iamVjdCBwa2cgPSBwYWNrYWdlc1trXTsKLQkJCQkJaWYgKHBrZyBpbnN0YW5jZW9mIENvbnRlbnRQYWNrYWdlKSB7Ci0JCQkJCQlpZiAoKChDb250ZW50UGFja2FnZSkgcGtnKS5nZXROYW1lKCkuZXF1YWxzKAotCQkJCQkJCQlQS0dfTkFNRV9DT1JFX0NPTlRFTlQpKSB7Ci0JCQkJCQkJcmVwbGFjZSgKLQkJCQkJCQkJCWVsZW1lbnQsCi0JCQkJCQkJCQlwa2csCi0JCQkJCQkJCQluZXcgRWxlbWVudFRyZWVDb250ZW50UHJvdmlkZXJVSUZvbGRlcigKLQkJCQkJCQkJCQkJQ09OVEVOVF9QQUNLQUdFUywKLQkJCQkJCQkJCQkJRXh0ZW5kZWRJbWFnZVJlZ2lzdHJ5Ci0JCQkJCQkJCQkJCQkJLmdldEluc3RhbmNlKCkKLQkJCQkJCQkJCQkJCQkuZ2V0SW1hZ2UoCi0JCQkJCQkJCQkJCQkJCQlMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkJCQkJCQkJCQkJCQkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvTWV0aG9kUGFja2FnZXMiKSksIG1ldGhvZENvbnRlbnRGb2xkZXIpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJfSBlbHNlIGlmICgoKENvbnRlbnRQYWNrYWdlKSBwa2cpLmdldE5hbWUoKS5lcXVhbHMoCi0JCQkJCQkJCVBLR19OQU1FX0NBVEVHT1JJRVMpKSB7Ci0JCQkJCQkJRWxlbWVudFRyZWVDb250ZW50UHJvdmlkZXJVSUZvbGRlciBzdGFuZGFyZENhdGVnb3JpZXNGb2xkZXIgPSBuZXcgRWxlbWVudFRyZWVDb250ZW50UHJvdmlkZXJVSUZvbGRlcigKLQkJCQkJCQkJCVNUQU5EQVJEX0NBVEVHT1JJRVMsCi0JCQkJCQkJCQlFeHRlbmRlZEltYWdlUmVnaXN0cnkKLQkJCQkJCQkJCQkJLmdldEluc3RhbmNlKCkKLQkJCQkJCQkJCQkJLmdldEltYWdlKAotCQkJCQkJCQkJCQkJCUxpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCQkJCQkJCQkJCQkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvU3RhbmRhcmRDYXRlZ29yaWVzIikpLCBtZXRob2RDb250ZW50Rm9sZGVyKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCUVsZW1lbnRUcmVlQ29udGVudFByb3ZpZGVyVUlGb2xkZXIgY3VzdG9tQ2F0ZWdvcmllc0ZvbGRlciA9IG5ldyBFbGVtZW50VHJlZUNvbnRlbnRQcm92aWRlclVJRm9sZGVyKAotCQkJCQkJCQkJQ1VTVE9NX0NBVEVHT1JJRVMsCi0JCQkJCQkJCQlFeHRlbmRlZEltYWdlUmVnaXN0cnkKLQkJCQkJCQkJCQkJLmdldEluc3RhbmNlKCkKLQkJCQkJCQkJCQkJLmdldEltYWdlKAotCQkJCQkJCQkJCQkJCUxpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCQkJCQkJCQkJCQkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvQ3VzdG9tQ2F0ZWdvcmllcyIpKSwgbWV0aG9kQ29udGVudEZvbGRlcik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQlPYmplY3RbXSBjb250ZW50UGFja2FnZXMgPSBnZXRDaGlsZHJlbihwa2cpOwotCQkJCQkJCWZvciAoaW50IGwgPSAwOyBsIDwgY29udGVudFBhY2thZ2VzLmxlbmd0aDsgbCsrKSB7Ci0JCQkJCQkJCU9iamVjdCBjb250ZW50UGFja2FnZSA9IGNvbnRlbnRQYWNrYWdlc1tsXTsKLQkJCQkJCQkJaWYgKGNvbnRlbnRQYWNrYWdlIGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UpIHsKLQkJCQkJCQkJCVN0cmluZyBwa2dOYW1lID0gKChDb250ZW50UGFja2FnZSkgY29udGVudFBhY2thZ2UpCi0JCQkJCQkJCQkJCS5nZXROYW1lKCk7Ci0JCQkJCQkJCQlpZiAocGtnTmFtZQotCQkJCQkJCQkJCQkuZXF1YWxzKFBLR19OQU1FX0NVU1RPTV9DQVRFR09SSUVTKSkgewotCQkJCQkJCQkJCWluc2VydChjdXN0b21DYXRlZ29yaWVzRm9sZGVyLCBmYWxzZSk7Ci0JCQkJCQkJCQkJZWxlbWVudE1hcC5wdXQoY3VzdG9tQ2F0ZWdvcmllc0ZvbGRlciwKLQkJCQkJCQkJCQkJCWVsZW1lbnRNYXAuZ2V0KGNvbnRlbnRQYWNrYWdlKSk7Ci0JCQkJCQkJCQl9IGVsc2UgaWYgKHBrZ05hbWUKLQkJCQkJCQkJCQkJLmVxdWFscyhQS0dfTkFNRV9ESVNDSVBMSU5FUykpIHsKLQkJCQkJCQkJCQlpbnNlcnQoc3RhbmRhcmRDYXRlZ29yaWVzRm9sZGVyLCBmYWxzZSk7Ci0JCQkJCQkJCQkJcmVwbGFjZSgKLQkJCQkJCQkJCQkJCWVsZW1lbnQsCi0JCQkJCQkJCQkJCQljb250ZW50UGFja2FnZSwKLQkJCQkJCQkJCQkJCW5ldyBFbGVtZW50VHJlZUNvbnRlbnRQcm92aWRlclVJRm9sZGVyKAotCQkJCQkJCQkJCQkJCQlESVNDSVBMSU5FUywKLQkJCQkJCQkJCQkJCQkJRXh0ZW5kZWRJbWFnZVJlZ2lzdHJ5Ci0JCQkJCQkJCQkJCQkJCQkJLmdldEluc3RhbmNlKCkKLQkJCQkJCQkJCQkJCQkJCQkuZ2V0SW1hZ2UoCi0JCQkJCQkJCQkJCQkJCQkJCQlMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkJCQkJCQkJCQkJCQkJCQkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvRGlzY2lwbGluZXMiKSksIHN0YW5kYXJkQ2F0ZWdvcmllc0ZvbGRlcikpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQl9IGVsc2UgaWYgKHBrZ05hbWUuZXF1YWxzKFBLR19OQU1FX0RPTUFJTlMpKSB7Ci0JCQkJCQkJCQkJaW5zZXJ0KHN0YW5kYXJkQ2F0ZWdvcmllc0ZvbGRlciwgZmFsc2UpOwotCQkJCQkJCQkJCXJlcGxhY2UoCi0JCQkJCQkJCQkJCQllbGVtZW50LAotCQkJCQkJCQkJCQkJY29udGVudFBhY2thZ2UsCi0JCQkJCQkJCQkJCQluZXcgRWxlbWVudFRyZWVDb250ZW50UHJvdmlkZXJVSUZvbGRlcigKLQkJCQkJCQkJCQkJCQkJRE9NQUlOUywKLQkJCQkJCQkJCQkJCQkJRXh0ZW5kZWRJbWFnZVJlZ2lzdHJ5Ci0JCQkJCQkJCQkJCQkJCQkJLmdldEluc3RhbmNlKCkKLQkJCQkJCQkJCQkJCQkJCQkuZ2V0SW1hZ2UoCi0JCQkJCQkJCQkJCQkJCQkJCQlMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkJCQkJCQkJCQkJCQkJCQkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvRG9tYWlucyIpKSwgc3RhbmRhcmRDYXRlZ29yaWVzRm9sZGVyKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCX0gZWxzZSBpZiAocGtnTmFtZQotCQkJCQkJCQkJCQkuZXF1YWxzKFBLR19OQU1FX1dPUktfUFJPRFVDVF9UWVBFUykpIHsKLQkJCQkJCQkJCQlpbnNlcnQoc3RhbmRhcmRDYXRlZ29yaWVzRm9sZGVyLCBmYWxzZSk7Ci0JCQkJCQkJCQkJcmVwbGFjZSgKLQkJCQkJCQkJCQkJCWVsZW1lbnQsCi0JCQkJCQkJCQkJCQljb250ZW50UGFja2FnZSwKLQkJCQkJCQkJCQkJCW5ldyBFbGVtZW50VHJlZUNvbnRlbnRQcm92aWRlclVJRm9sZGVyKAotCQkJCQkJCQkJCQkJCQlXT1JLX1BST0RVQ1RfVFlQRVMsCi0JCQkJCQkJCQkJCQkJCUV4dGVuZGVkSW1hZ2VSZWdpc3RyeQotCQkJCQkJCQkJCQkJCQkJCS5nZXRJbnN0YW5jZSgpCi0JCQkJCQkJCQkJCQkJCQkJLmdldEltYWdlKAotCQkJCQkJCQkJCQkJCQkJCQkJTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJCQkJCQkJCQkJCQkJCQkJLmdldEltYWdlKCJmdWxsL29iajE2L1dvcmtQcm9kdWN0VHlwZXMiKSksIHN0YW5kYXJkQ2F0ZWdvcmllc0ZvbGRlcikpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQl9IGVsc2UgaWYgKHBrZ05hbWUKLQkJCQkJCQkJCQkJLmVxdWFscyhQS0dfTkFNRV9ST0xFU0VUUykpIHsKLQkJCQkJCQkJCQlpbnNlcnQoc3RhbmRhcmRDYXRlZ29yaWVzRm9sZGVyLCBmYWxzZSk7Ci0JCQkJCQkJCQkJcmVwbGFjZSgKLQkJCQkJCQkJCQkJCWVsZW1lbnQsCi0JCQkJCQkJCQkJCQljb250ZW50UGFja2FnZSwKLQkJCQkJCQkJCQkJCW5ldyBFbGVtZW50VHJlZUNvbnRlbnRQcm92aWRlclVJRm9sZGVyKAotCQkJCQkJCQkJCQkJCQlST0xFU0VUUywKLQkJCQkJCQkJCQkJCQkJRXh0ZW5kZWRJbWFnZVJlZ2lzdHJ5Ci0JCQkJCQkJCQkJCQkJCQkJLmdldEluc3RhbmNlKCkKLQkJCQkJCQkJCQkJCQkJCQkuZ2V0SW1hZ2UoCi0JCQkJCQkJCQkJCQkJCQkJCQlMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkJCQkJCQkJCQkJCQkJCQkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvUm9sZXMiKSksIHN0YW5kYXJkQ2F0ZWdvcmllc0ZvbGRlcikpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQl9IGVsc2UgaWYgKHBrZ05hbWUuZXF1YWxzKFBLR19OQU1FX1RPT0xTKSkgewotCQkJCQkJCQkJCWluc2VydChzdGFuZGFyZENhdGVnb3JpZXNGb2xkZXIsIGZhbHNlKTsKLQkJCQkJCQkJCQlyZXBsYWNlKAotCQkJCQkJCQkJCQkJZWxlbWVudCwKLQkJCQkJCQkJCQkJCWNvbnRlbnRQYWNrYWdlLAotCQkJCQkJCQkJCQkJbmV3IEVsZW1lbnRUcmVlQ29udGVudFByb3ZpZGVyVUlGb2xkZXIoCi0JCQkJCQkJCQkJCQkJCVRPT0xTLAotCQkJCQkJCQkJCQkJCQlFeHRlbmRlZEltYWdlUmVnaXN0cnkKLQkJCQkJCQkJCQkJCQkJCQkuZ2V0SW5zdGFuY2UoKQotCQkJCQkJCQkJCQkJCQkJCS5nZXRJbWFnZSgKLQkJCQkJCQkJCQkJCQkJCQkJCUxpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCQkJCQkJCQkJCQkJCQkJCS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9Ub29scyIpKSwgc3RhbmRhcmRDYXRlZ29yaWVzRm9sZGVyKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCQllbGVtZW50TWFwLnJlbW92ZShwa2cpOwotCQkJCQkJfQotCQkJCQl9IGVsc2UgaWYgKHBrZyBpbnN0YW5jZW9mIFByb2Nlc3NQYWNrYWdlCi0JCQkJCQkJJiYgKChQcm9jZXNzUGFja2FnZSkgcGtnKS5nZXROYW1lKCkuZXF1YWxzKAotCQkJCQkJCQkJUEtHX05BTUVfQ0FQQUJJTElUWV9QQVRURVJOUykpIHsKLQkJCQkJCXJlcGxhY2UoCi0JCQkJCQkJCWVsZW1lbnQsCi0JCQkJCQkJCXBrZywKLQkJCQkJCQkJbmV3IEVsZW1lbnRUcmVlQ29udGVudFByb3ZpZGVyVUlGb2xkZXIoCi0JCQkJCQkJCQkJQ0FQQUJJTElUWV9QQVRURVJOUywKLQkJCQkJCQkJCQlFeHRlbmRlZEltYWdlUmVnaXN0cnkKLQkJCQkJCQkJCQkJCS5nZXRJbnN0YW5jZSgpCi0JCQkJCQkJCQkJCQkuZ2V0SW1hZ2UoCi0JCQkJCQkJCQkJCQkJCUxpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCQkJCQkJCQkJCQkJLmdldEltYWdlKCJmdWxsL29iajE2L0NhcGFiaWxpdHlQYXR0ZXJucyIpKSwgcHJvY2Vzc2VzRm9sZGVyKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCX0KLQkJCQlTZXQ8T2JqZWN0PiBjaGlsZHJlbiA9IChTZXQ8T2JqZWN0PikgZWxlbWVudE1hcC5nZXQoZWxlbWVudCk7Ci0JCQkJY2hpbGRyZW4ucmVtb3ZlKG1ldGhvZFBhY2thZ2UpOwotCQkJfSBlbHNlIGlmIChtZXRob2RQYWNrYWdlIGluc3RhbmNlb2YgUHJvY2Vzc1BhY2thZ2UKLQkJCQkJJiYgKChQcm9jZXNzUGFja2FnZSkgbWV0aG9kUGFja2FnZSkuZ2V0TmFtZSgpLmVxdWFscygKLQkJCQkJCQlQS0dfTkFNRV9ERUxJVkVSWV9QUk9DRVNTRVMpKSB7Ci0JCQkJcmVwbGFjZSgKLQkJCQkJCWVsZW1lbnQsCi0JCQkJCQltZXRob2RQYWNrYWdlLAotCQkJCQkJbmV3IEVsZW1lbnRUcmVlQ29udGVudFByb3ZpZGVyVUlGb2xkZXIoCi0JCQkJCQkJCURFTElWRVJZX1BST0NFU1NFUywKLQkJCQkJCQkJRXh0ZW5kZWRJbWFnZVJlZ2lzdHJ5Ci0JCQkJCQkJCQkJLmdldEluc3RhbmNlKCkKLQkJCQkJCQkJCQkuZ2V0SW1hZ2UoCi0JCQkJCQkJCQkJCQlMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkJCQkJCQkJCQkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvRGVsaXZlcnlQcm9jZXNzZXMiKSksIHByb2Nlc3Nlc0ZvbGRlcikpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnRzIHRoZSBVSSBmb2xkZXJzIGludG8gdGhlIHNlYXJjaCByZXN1bHQgdHJlZS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbnNlcnRVSUZvbGRlcnMoT2JqZWN0IGlucHV0RWxlbWVudCkgewotCQlPYmplY3RbXSBlbGVtZW50cyA9IGdldENoaWxkcmVuKGlucHV0RWxlbWVudCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gZWxlbWVudHNbaV07Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikgewotCQkJCWluc2VydFVJRm9sZGVycygoTWV0aG9kUGx1Z2luKSBlbGVtZW50KTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEdldHRlciBmb3IgdGhlIHRyZWUgdmlld2VyCi0JICogQHJldHVybiBUcmVlVmlld2VyCi0JICovCi0JcHVibGljIFRyZWVWaWV3ZXIgZ2V0VHJlZVZpZXdlcigpIHsKLQkJcmV0dXJuIHRyZWVWaWV3ZXI7Ci0JfQotCi0JLyoqCi0JICogU2V0dGVyIGZvciB0aGUgdHJlZSB2aWV3ZXIuIENsYXNzZXMgdGhhdCBpbXBsZW1lbnQgdGhpcyBhYnN0cmFjdCBjbGFzcyBtdXN0IGNhbGwKLQkgKiB0aGlzIG1ldGhvZCBhbmQgc2V0IHRoZSB0cmVlIHZpZXdlciBmcm9tIHdpdGhpbiB0aGVpciBpbnB1dENoYW5nZWQgbWV0aG9kLgotCSAqIAotCSAqIEBwYXJhbSB0cmVlVmlld2VyCi0JICovCi0JcHVibGljIHZvaWQgc2V0VHJlZVZpZXdlcihUcmVlVmlld2VyIHRyZWVWaWV3ZXIpIHsKLQkJdGhpcy50cmVlVmlld2VyID0gdHJlZVZpZXdlcjsKLQl9Ci0KLQkvKioKLQkgKiBHZXR0ZXIgZm9yIHRoZSBlbGVtZW50TWFwCi0JICogCi0JICogQHJldHVybiBlbGVtZW50TWFwCi0JICovCi0JcHVibGljIE1hcDxPYmplY3QsIFNldDxPYmplY3Q+PiBnZXRFbGVtZW50TWFwKCkgewotCQlyZXR1cm4gZWxlbWVudE1hcDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9wcm92aWRlcnMvRGVsZWdhdGVMYWJlbFByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvcHJvdmlkZXJzL0RlbGVnYXRlTGFiZWxQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNDBmYjE3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9wcm92aWRlcnMvRGVsZWdhdGVMYWJlbFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5wcm92aWRlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuRXh0ZW5kZWRJbWFnZVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjUKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBEZWxlZ2F0ZUxhYmVsUHJvdmlkZXIgZXh0ZW5kcyBMYWJlbFByb3ZpZGVyIHsKLQlwcml2YXRlIElJdGVtTGFiZWxQcm92aWRlciBpdGVtTGFiZWxQcm92aWRlcjsKLQotCXB1YmxpYyBEZWxlZ2F0ZUxhYmVsUHJvdmlkZXIoSUl0ZW1MYWJlbFByb3ZpZGVyIGl0ZW1MYWJlbFByb3ZpZGVyKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuaXRlbUxhYmVsUHJvdmlkZXIgPSBpdGVtTGFiZWxQcm92aWRlcjsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7Ci0JCXJldHVybiBpdGVtTGFiZWxQcm92aWRlci5nZXRUZXh0KGVsZW1lbnQpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IGVsZW1lbnQpIHsKLQkJcmV0dXJuIEV4dGVuZGVkSW1hZ2VSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldEltYWdlKGl0ZW1MYWJlbFByb3ZpZGVyLmdldEltYWdlKGVsZW1lbnQpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvcHJvdmlkZXJzL0VsZW1lbnRUcmVlQ29udGVudFByb3ZpZGVyVUlGb2xkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9wcm92aWRlcnMvRWxlbWVudFRyZWVDb250ZW50UHJvdmlkZXJVSUZvbGRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMjI0MDFiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9wcm92aWRlcnMvRWxlbWVudFRyZWVDb250ZW50UHJvdmlkZXJVSUZvbGRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLnByb3ZpZGVyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkV4dGVuZGVkSW1hZ2VSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotLyoqCi0gKiBNb2RlbHMgYSBVSSBmb2xkZXIgaW4gdGhlIG1ldGhvZCBzZWFyY2ggcmVzdWx0IHRyZWUgdmlldy4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBFbGVtZW50VHJlZUNvbnRlbnRQcm92aWRlclVJRm9sZGVyIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIEltYWdlIERFRkFVTFRfSU1BR0UgPSBFeHRlbmRlZEltYWdlUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZShMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJLmdldEltYWdlKCJmdWxsL29iajE2L0ZvbGRlciIpKTsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLQotCXByaXZhdGUgSW1hZ2UgaW1hZ2U7Ci0KLQlwcml2YXRlIE9iamVjdCBwYXJlbnQ7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqIAotCSAqIEBwYXJhbSBuYW1lCi0JICogICAgICAgICAgICBUaGUgbmFtZSBmb3IgdGhlIGZvbGRlci4KLQkgKi8KLQlwdWJsaWMgRWxlbWVudFRyZWVDb250ZW50UHJvdmlkZXJVSUZvbGRlcihTdHJpbmcgbmFtZSkgewotCQl0aGlzKG5hbWUsIERFRkFVTFRfSU1BR0UsIG51bGwpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICogCi0JICogQHBhcmFtIG5hbWUKLQkgKiAgICAgICAgICAgIGEgbmFtZSBmb3IgdGhlIGZvbGRlcgotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgb2JqZWN0Ci0JICovCi0JcHVibGljIEVsZW1lbnRUcmVlQ29udGVudFByb3ZpZGVyVUlGb2xkZXIoU3RyaW5nIG5hbWUsIE9iamVjdCBwYXJlbnQpIHsKLQkJdGhpcyhuYW1lLCBERUZBVUxUX0lNQUdFLCBwYXJlbnQpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICogCi0JICogQHBhcmFtIG5hbWUKLQkgKiAgICAgICAgICAgIGEgbmFtZSBmb3IgdGhlIGZvbGRlcgotCSAqIEBwYXJhbSBpbWFnZQotCSAqICAgICAgICAgICAgYW4gaW1hZ2UgZm9yIHRoZSBmb2xkZXIKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IG9iamVjdAotCSAqLwotCXB1YmxpYyBFbGVtZW50VHJlZUNvbnRlbnRQcm92aWRlclVJRm9sZGVyKFN0cmluZyBuYW1lLCBJbWFnZSBpbWFnZSwgT2JqZWN0IHBhcmVudCkgewotCQl0aGlzLm5hbWUgPSBuYW1lOwotCQl0aGlzLmltYWdlID0gaW1hZ2U7Ci0JCXRoaXMucGFyZW50ID0gcGFyZW50OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG5hbWUuCi0JICogCi0JICogQHJldHVybiB0aGUgZm9sZGVyIG5hbWUKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBuYW1lOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGltYWdlLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGltYWdlIGZvciBhIFVJIGZvbGRlcgotCSAqLwotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpIHsKLQkJcmV0dXJuIGltYWdlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHBhcmVudCBvYmplY3QuCi0JICogCi0JICogQHJldHVybiB0aGUgcGFyZW50IG9iamVjdCBmb3IgdGhlIGZvbGRlcgotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KCkgewotCQlyZXR1cm4gcGFyZW50OwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHBhcmVudCBvYmplY3QuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBvYmplY3QKLQkgKiBAcmV0dXJuIHRoZSBnaXZlbiBwYXJlbnQgb2JqZWN0Ci0JICovCi0JcHVibGljIE9iamVjdCBzZXRQYXJlbnQoT2JqZWN0IHBhcmVudCkgewotCQlyZXR1cm4gdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgb2JqZWN0LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGZvbGRlciBuYW1lCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvcHJvdmlkZXJzL0VsZW1lbnRUcmVlTGFiZWxQcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL3Byb3ZpZGVycy9FbGVtZW50VHJlZUxhYmVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2NhZmQzNy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvcHJvdmlkZXJzL0VsZW1lbnRUcmVlTGFiZWxQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkucHJvdmlkZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0KLS8qKgotICogVGhlIGxhYmVsIHByb3ZpZGVyIGZvciB0aGUgbWV0aG9kIHNlYXJjaCByZXN1bHQgdHJlZSBhbmQgdGFibGUgdmlld2Vycy4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBFbGVtZW50VHJlZUxhYmVsUHJvdmlkZXIgZXh0ZW5kcyBMYWJlbFByb3ZpZGVyIHsKLQotCXByaXZhdGUgc3RhdGljIElMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIgPSBuZXcgQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyKFRuZ1V0aWwudW1hSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkpOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgRWxlbWVudFRyZWVMYWJlbFByb3ZpZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgTGFiZWxQcm92aWRlciNnZXRUZXh0KE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iaikgewotCQlpZiAob2JqIGluc3RhbmNlb2YgRWxlbWVudFRyZWVDb250ZW50UHJvdmlkZXJVSUZvbGRlcikgewotCQkJcmV0dXJuICgoRWxlbWVudFRyZWVDb250ZW50UHJvdmlkZXJVSUZvbGRlcikgb2JqKS5nZXROYW1lKCk7Ci0JCX0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJcmV0dXJuICgoTWV0aG9kRWxlbWVudCkgb2JqKS5nZXROYW1lKCk7Ci0JCX0KLQkJcmV0dXJuIGxhYmVsUHJvdmlkZXIuZ2V0VGV4dChvYmopOwotCX0KLQotCS8qKgotCSAqIEBzZWUgTGFiZWxQcm92aWRlciNnZXRJbWFnZShPYmplY3QpCi0JICovCi0JcHVibGljIEltYWdlIGdldEltYWdlKE9iamVjdCBvYmopIHsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIEVsZW1lbnRUcmVlQ29udGVudFByb3ZpZGVyVUlGb2xkZXIpIHsKLQkJCXJldHVybiAoKEVsZW1lbnRUcmVlQ29udGVudFByb3ZpZGVyVUlGb2xkZXIpIG9iaikuZ2V0SW1hZ2UoKTsKLQkJfQotCQlyZXR1cm4gbGFiZWxQcm92aWRlci5nZXRJbWFnZShvYmopOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL3V0aWwvQ29udmVydEd1aWRhbmNlVHlwZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL3V0aWwvQ29udmVydEd1aWRhbmNlVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkODZlNjY3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS91dGlsL0NvbnZlcnRHdWlkYW5jZVR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTXVsdGlTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS51dGlsLk1zZ0JveDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLlN0clV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5EZWxldGVNZXRob2RFbGVtZW50Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnVpLlVzZXJJbnRlcmFjdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb24uSVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb24uaW50ZXJuYWwuQ29udGVudEVsZW1lbnROYW1lVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbi5pbnRlcm5hbC5WYWxpZGF0b3JGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLkxpYnJhcnlVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VydmljZXMuSUxpYnJhcnlQZXJzaXN0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkd1aWRhbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5Db250ZW50RGVzY3JpcHRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSUlucHV0VmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSW5wdXREaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5BcnJheUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5MaXN0RGlhbG9nOwotCi0vKioKLSAqIGNsYXNzIHRvIGNvbnZlcnQgZ3VpZGFuY2UgdHlwZXMKLSAqIAotICogQGF1dGhvciA/Pz8KLSAqIEBzaWNuZSAxLjAKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBDb252ZXJ0R3VpZGFuY2VUeXBlIHsKLQotCXN0YXRpYyBJVmFsaWRhdG9yIHZhbGlkYXRvcjsKLQlwcml2YXRlIHN0YXRpYyBpbnRbXSBjb21wYXRpYmxlR3VpZGFuY2VzID0geyBVbWFQYWNrYWdlLkNPTkNFUFQsCi0JLy8gVW1hUGFja2FnZS5DSEVDS0xJU1QsCi0JCQkvLyBVbWFQYWNrYWdlLkVYQU1QTEUsCi0JCQlVbWFQYWNrYWdlLkdVSURFTElORSwKLQkJCS8vIFVtYVBhY2thZ2UuRVNUSU1BVEUsCi0JCQkvLyBVbWFQYWNrYWdlLkVTVElNQVRJTkdfTUVUUklDLAotCQkJLy8gVW1hUGFja2FnZS5FU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TLAotCQkJLy8gVW1hUGFja2FnZS5SRVBPUlQsCi0JCQkvLyBVbWFQYWNrYWdlLlRFTVBMQVRFLAotCQkJVW1hUGFja2FnZS5TVVBQT1JUSU5HX01BVEVSSUFMLAotCS8vIFVtYVBhY2thZ2UuVE9PTF9NRU5UT1IsCi0JLy8gVW1hUGFja2FnZS5XSElURVBBUEVSLAotCS8vIFVtYVBhY2thZ2UuVEVSTV9ERUZJTklUSU9OLAotCS8vIFVtYVBhY2thZ2UuUFJBQ1RJQ0UsCi0JLy8gVW1hUGFja2FnZS5SRVVTQUJMRV9BU1NFVAotCX07Ci0KLQlwcml2YXRlIHN0YXRpYyBMaXN0IGNvbXBhdGlibGVHdWlkYW5jZXNMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCXN0YXRpYyB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY29tcGF0aWJsZUd1aWRhbmNlcy5sZW5ndGg7IGkrKykKLQkJCWNvbXBhdGlibGVHdWlkYW5jZXNMaXN0LmFkZChuZXcgSW50ZWdlcihjb21wYXRpYmxlR3VpZGFuY2VzW2ldKSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBHdWlkYW5jZSBjb252ZXJ0R3VpZGFuY2UoR3VpZGFuY2Ugb2xkR3VpZGFuY2UsIFNoZWxsIHNoZWxsLAotCQkJRGVsZXRlTWV0aG9kRWxlbWVudENvbW1hbmQgY29tbWFuZCkgewotCQlyZXR1cm4gY29udmVydEd1aWRhbmNlKG9sZEd1aWRhbmNlLCBzaGVsbCwgY29tbWFuZCwgbnVsbCk7Ci0JfQotCQkKLQlwdWJsaWMgc3RhdGljIEd1aWRhbmNlIGNvbnZlcnRHdWlkYW5jZShHdWlkYW5jZSBvbGRHdWlkYW5jZSwgU2hlbGwgc2hlbGwsCi0JCQkJRGVsZXRlTWV0aG9kRWxlbWVudENvbW1hbmQgY29tbWFuZCwgRUNsYXNzIG5ld1R5cGUpIHsKLQkJaWYgKG5ld1R5cGUgPT0gbnVsbCkgewotCQlpZiAoc2hlbGwgPT0gbnVsbCkKLQkJCXNoZWxsID0gRGlzcGxheS5nZXRDdXJyZW50KCkuZ2V0QWN0aXZlU2hlbGwoKTsKLQkJTGlzdERpYWxvZyBkbGcgPSBuZXcgTGlzdERpYWxvZyhzaGVsbCk7Ci0JCWRsZy5zZXRIZWlnaHRJbkNoYXJzKDUpOwotCQlkbGcuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBBcnJheUNvbnRlbnRQcm92aWRlcigpKTsKLQkJZGxnLnNldExhYmVsUHJvdmlkZXIobmV3IExhYmVsUHJvdmlkZXIoKSB7Ci0JCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCQlzd2l0Y2ggKCgoSW50ZWdlcikgZWxlbWVudCkuaW50VmFsdWUoKSkgewotCQkJCS8vIFRPRE86IHJlZmFjdG9yIHRoZXNlIHN0cmluZ3MgKGFuZCB0aGlzIHdob2xlIGRpYWxvZykgaW50bwotCQkJCS8vIGxpYnJhcnkudWkKLQkJCQljYXNlIFVtYVBhY2thZ2UuQ09OQ0VQVDoKLQkJCQkJcmV0dXJuIExpYnJhcnlSZXNvdXJjZXMuY29uY2VwdF90ZXh0OyAKLQkJCQljYXNlIFVtYVBhY2thZ2UuQ0hFQ0tMSVNUOgotCQkJCQlyZXR1cm4gTGlicmFyeVJlc291cmNlcy5jaGVja2xpc3RfdGV4dDsgCi0JCQkJY2FzZSBVbWFQYWNrYWdlLkVYQU1QTEU6Ci0JCQkJCXJldHVybiBMaWJyYXJ5UmVzb3VyY2VzLmV4YW1wbGVfdGV4dDsgCi0JCQkJY2FzZSBVbWFQYWNrYWdlLkdVSURFTElORToKLQkJCQkJcmV0dXJuIExpYnJhcnlSZXNvdXJjZXMuZ3VpZGVsaW5lX3RleHQ7IAotCQkJCWNhc2UgVW1hUGFja2FnZS5FU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TOgotCQkJCQlyZXR1cm4gTGlicmFyeVJlc291cmNlcy5lc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnNfdGV4dDsKLQkJCQljYXNlIFVtYVBhY2thZ2UuUkVQT1JUOgotCQkJCQlyZXR1cm4gTGlicmFyeVJlc291cmNlcy5yZXBvcnRfdGV4dDsgCi0JCQkJY2FzZSBVbWFQYWNrYWdlLlRFTVBMQVRFOgotCQkJCQlyZXR1cm4gTGlicmFyeVJlc291cmNlcy50ZW1wbGF0ZV90ZXh0OyAKLQkJCQljYXNlIFVtYVBhY2thZ2UuU1VQUE9SVElOR19NQVRFUklBTDoKLQkJCQkJcmV0dXJuIExpYnJhcnlSZXNvdXJjZXMuc3VwcG9ydGluZ01hdGVyaWFsX3RleHQ7Ci0JCQkJY2FzZSBVbWFQYWNrYWdlLlRPT0xfTUVOVE9SOgotCQkJCQlyZXR1cm4gTGlicmFyeVJlc291cmNlcy50b29sTWVudG9yX3RleHQ7Ci0JCQkJY2FzZSBVbWFQYWNrYWdlLldISVRFUEFQRVI6Ci0JCQkJCXJldHVybiBMaWJyYXJ5UmVzb3VyY2VzLndoaXRlcGFwZXJfdGV4dDsKLQkJCQljYXNlIFVtYVBhY2thZ2UuVEVSTV9ERUZJTklUSU9OOgotCQkJCQlyZXR1cm4gTGlicmFyeVJlc291cmNlcy50ZXJtRGVmaW5pdGlvbl90ZXh0OwotCQkJCWNhc2UgVW1hUGFja2FnZS5QUkFDVElDRToKLQkJCQkJcmV0dXJuIExpYnJhcnlSZXNvdXJjZXMucHJhY3RpY2VfdGV4dDsgCi0JCQkJY2FzZSBVbWFQYWNrYWdlLlJFVVNBQkxFX0FTU0VUOgotCQkJCQlyZXR1cm4gTGlicmFyeVJlc291cmNlcy5yZXVzYWJsZUFzc2V0X3RleHQ7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIExpYnJhcnlSZXNvdXJjZXMudW5rbm93bkd1aWRhbmNlX3RleHQ7Ci0JCQkJfQotCi0JCQl9Ci0JCX0pOwotCQlMaXN0IG5ld0d1aWRhbmNlVHlwZUxpc3QgPSBnZXRWYWxpZE5ld0d1aWRhbmNlVHlwZXMob2xkR3VpZGFuY2UpOwotCQlpZiAobmV3R3VpZGFuY2VUeXBlTGlzdCA9PSBudWxsKSB7Ci0JCQlMaWJyYXJ5VUlQbHVnaW4KLQkJCQkJLmdldERlZmF1bHQoKQotCQkJCQkuZ2V0TXNnRGlhbG9nKCkKLQkJCQkJLmRpc3BsYXlFcnJvcigKLQkJCQkJCQlMaWJyYXJ5UmVzb3VyY2VzLmNvbnZlcnRHdWlkYW5jZUVycm9yX3RpdGxlLAotCQkJCQkJCUxpYnJhcnlSZXNvdXJjZXMudW5zdXBwb3J0ZWRHdWlkYW5jZVR5cGVFcnJvcl9tc2csCi0JCQkJCQkJTkxTLmJpbmQoTGlicmFyeVJlc291cmNlcy51bnN1cHBvcnRlZEd1aWRhbmNlVHlwZUVycm9yX3JlYXNvbiwgU3RyVXRpbC50b0xvd2VyKFRuZ1V0aWwuZ2V0VHlwZVRleHQob2xkR3VpZGFuY2UpKSkpOyAKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCWRsZy5zZXRJbnB1dChuZXdHdWlkYW5jZVR5cGVMaXN0KTsKLQkJZGxnLnNldFRpdGxlKExpYnJhcnlSZXNvdXJjZXMuY29udmVydEd1aWRhbmNlRGlhbG9nX3RpdGxlKTsKLQkJZGxnLnNldE1lc3NhZ2UoTGlicmFyeVJlc291cmNlcy5jb252ZXJ0R3VpZGFuY2VEaWFsb2dfdGV4dCk7Ci0JCWlmIChkbGcub3BlbigpID09IERpYWxvZy5DQU5DRUwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlPYmplY3RbXSBzZWxlY3Rpb25SZXN1bHQgPSBkbGcuZ2V0UmVzdWx0KCk7Ci0JCWlmIChzZWxlY3Rpb25SZXN1bHQgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlpbnQgY2hvc2VuR3VpZGFuY2UgPSAoKEludGVnZXIpIHNlbGVjdGlvblJlc3VsdFswXSkuaW50VmFsdWUoKTsKLQkJCi0vLwkJR3VpZGFuY2UgbmV3R3VpZGFuY2UgPSBkb0NvbnZlcnQob2xkR3VpZGFuY2UsIGNob3Nlbkd1aWRhbmNlLCBjb21tYW5kKTsKLQkJCi0JCW5ld1R5cGUgPSBnZXRHdWlkYW5jZVR5cGUoY2hvc2VuR3VpZGFuY2UpOwotCQl9Ci0JCQotCQlpZihuZXdUeXBlID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCVR5cGVDb252ZXJ0ZXIuVHlwZUNvbnZlcnNpb25Db21tYW5kIGNtZCA9IFR5cGVDb252ZXJ0ZXIuY3JlYXRlVHlwZUNvbnZlcnNpb25Db21tYW5kKG9sZEd1aWRhbmNlLCBuZXdUeXBlLCBudWxsLCBudWxsLCB0cnVlLCB0cnVlKTsKLQkJdHJ5IHsKLQkJCWlmKCFjbWQuZ2V0SWxsZWdhbFJlZmVyZW5jZXJzKCkuaXNFbXB0eSgpKSB7Ci0JCQkJLy8gdHlwZSBjb252ZXJzaW9uIHdpbGwgcmVtb3ZlIHNvbWUgaWxsZWdhbCByZWZlcmVuY2VzCi0JCQkJLy8gY29uZmlybSB3aXRoIHVzZXIgYmVmb3JlIGNvbnRpbnVlCi0JCQkJLy8KLQkJCQlNdWx0aVN0YXR1cyBtdWx0aVN0YXR1cyA9IG5ldyBNdWx0aVN0YXR1cygKLQkJCQkJCUxpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldFN5bWJvbGljTmFtZSgpLCAwLCAiIiwgbnVsbCk7IC8vJE5PTi1OTFMtMSQKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjbWQuZ2V0SWxsZWdhbFJlZmVyZW5jZXJzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCU1ldGhvZEVsZW1lbnQgZSA9IChNZXRob2RFbGVtZW50KSBpdGVyLm5leHQoKTsKLQkJCQkJLy8gZG9uJ3Qgc2hvdyBwcmVkZWZpbmVkIGVsZW1lbnQKLQkJCQkJLy8KLQkJCQkJaWYoIVRuZ1V0aWwuaXNQcmVkZWZpbmVkKGUpKSB7Ci0JCQkJCQlTdHJpbmcgbXNnID0gTkxTLmJpbmQoTGlicmFyeUVkaXRSZXNvdXJjZXMuZWxlbWVudFR5cGVfdGV4dCwgZS5lQ2xhc3MoKS5nZXROYW1lKCksIFRuZ1V0aWwuZ2V0TGFiZWxXaXRoUGF0aChlKSk7IAotCQkJCQkJSVN0YXR1cyBzdGF0dXMgPSBuZXcgU3RhdHVzKElTdGF0dXMuSU5GTywKLQkJCQkJCQkJTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0U3ltYm9saWNOYW1lKCksIDAsIG1zZywKLQkJCQkJCQkJbnVsbCk7Ci0JCQkJCQltdWx0aVN0YXR1cy5hZGQoc3RhdHVzKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAobXVsdGlTdGF0dXMuZ2V0Q2hpbGRyZW4oKS5sZW5ndGggPiAwICYmCi0JCQkJCQlMaWJyYXJ5VUlQbHVnaW4KLQkJCQkJCS5nZXREZWZhdWx0KCkKLQkJCQkJCS5nZXRNc2dEaWFsb2coKQotCQkJCQkJLmRpc3BsYXlDb25maXJtYXRpb24oCi0JCQkJCQkJCUxpYnJhcnlSZXNvdXJjZXMuY29udmVydEd1aWRhbmNlRGlhbG9nX3RpdGxlLAotCQkJCQkJCQlMaWJyYXJ5RWRpdFJlc291cmNlcy5jb25maXJtX3JlbW92ZV9yZWZlcmVuY2VzX3RleHQsCi0JCQkJCQkJCW11bHRpU3RhdHVzKSA9PSBEaWFsb2cuQ0FOQ0VMKSB7Ci0JCQkJCXJldHVybiBudWxsOwotCQkJCX0KLQkJCX0KLQotCQkJSVN0YXR1cyBzdGF0dXMgPSBVc2VySW50ZXJhY3Rpb25IZWxwZXIuY2hlY2tNb2RpZnkoY21kLmdldE1vZGlmaWVkUmVzb3VyY2VzKCksIHNoZWxsKTsKLQkJCWlmKCFzdGF0dXMuaXNPSygpKSB7Ci0JCQkJTGlicmFyeVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKS5kaXNwbGF5KExpYnJhcnlSZXNvdXJjZXMuY29udmVydEd1aWRhbmNlRGlhbG9nX3RpdGxlLCBzdGF0dXMpOwotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQkJY21kLmV4ZWN1dGUoKTsKLQkJCUd1aWRhbmNlIG5ld0d1aWRhbmNlID0gKEd1aWRhbmNlKSBjbWQuZ2V0UmVzdWx0KCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0KLQkJCS8vIHNhdmUgbW9kaWZpZWQgcmVzb3VyY2VzCi0JCQkvLwotCQkJSUxpYnJhcnlQZXJzaXN0ZXIuRmFpbFNhZmVNZXRob2RMaWJyYXJ5UGVyc2lzdGVyIHBlcnNpc3RlciA9IExpYnJhcnlTZXJ2aWNlVXRpbC5nZXRDdXJyZW50UGVyc2lzdGVyKCkuZ2V0RmFpbFNhZmVQZXJzaXN0ZXIoKTsKLQkJCXRyeSB7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gY21kLmdldE1vZGlmaWVkUmVzb3VyY2VzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCVJlc291cmNlIHJlc291cmNlID0gKFJlc291cmNlKSBpdGVyLm5leHQoKTsKLQkJCQkJcGVyc2lzdGVyLnNhdmUocmVzb3VyY2UpOwotCQkJCX0KLQkJCQlwZXJzaXN0ZXIuY29tbWl0KCk7Ci0JCQkJCi0JCQkJaWYoQ29udGVudERlc2NyaXB0aW9uRmFjdG9yeS5oYXNQcmVzZW50YXRpb24obmV3R3VpZGFuY2UpKSB7Ci0JCQkJCXBlcnNpc3Rlci5hZGp1c3RMb2NhdGlvbihuZXdHdWlkYW5jZS5nZXRQcmVzZW50YXRpb24oKS5lUmVzb3VyY2UoKSk7Ci0JCQkJfQkJCQkKLQotCQkJCWNtZC5jb3B5UmVzb3VyY2VzKCk7Ci0KLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJcGVyc2lzdGVyLnJvbGxiYWNrKCk7Ci0JCQkJTGlicmFyeVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKS5kaXNwbGF5RXJyb3IoCi0JCQkJCQlMaWJyYXJ5UmVzb3VyY2VzLmNvbnZlcnRHdWlkYW5jZUVycm9yX3RpdGxlLAotCQkJCQkJTkxTLmJpbmQoTGlicmFyeVJlc291cmNlcy5zYXZlQ29udmVydGVkR3VpZGFuY2VFcnJvcl9tc2csCi0JCQkJCQkJCW5ld0d1aWRhbmNlLmdldE5hbWUoKSksCi0JCQkJCQkJCUxpYnJhcnlSZXNvdXJjZXMuZXJyb3JfcmVhc29uLCBlKTsKLQkJCX0KLQotCQkJcmV0dXJuIG5ld0d1aWRhbmNlOwotCQl9Ci0JCWZpbmFsbHkgewotCQkJaWYoY21kICE9IG51bGwpIHsKLQkJCQl0cnkgeyBjbWQuZGlzcG9zZSgpOyB9IGNhdGNoKEV4Y2VwdGlvbiBlKSB7fQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIG9sZEd1aWRhbmNlCi0JICogQHBhcmFtIG5ld0d1aWRhbmNlCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgc3RhdGljIFN0cmluZyBjaGVja05hbWUoR3VpZGFuY2Ugb2xkR3VpZGFuY2UsIEd1aWRhbmNlIG5ld0d1aWRhbmNlKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJCi0JCQotCQl2YWxpZGF0b3IgPSBuZXcgQ29udGVudEVsZW1lbnROYW1lVmFsaWRhdG9yKG9sZEd1aWRhbmNlLmVDb250YWluZXIoKQotCQkJCSwgVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29udGVudFBhY2thZ2VfQ29udGVudEVsZW1lbnRzKCksCi0JCQkJKENvbnRlbnRFbGVtZW50KSBuZXdHdWlkYW5jZSwgbmV3IFZhbGlkYXRvckZhY3RvcnkuVHlwZUZpbHRlcihuZXdHdWlkYW5jZSkpOwotCQkKLQkJU3RyaW5nIG1zZyA9IHZhbGlkYXRvci5pc1ZhbGlkKG5ld0d1aWRhbmNlLmdldE5hbWUoKSk7Ci0JCQotCQlpZiAobXNnICE9IG51bGwpIHsKLQkJCVN0cmluZyBmZWF0dXJlVHh0ID0gVG5nVXRpbC5nZXRGZWF0dXJlVGV4dChVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkuZ2V0TmFtZWRFbGVtZW50X05hbWUoKSk7Ci0JCQlTdHJpbmcgdGl0bGUgPSBMaWJyYXJ5RWRpdFJlc291cmNlcy5yZXNvbHZlTmFtZUNvbmZsaWN0RGlhbG9nX3RpdGxlOyAKLQkJCVN0cmluZyBkbGdNc2cgPSBOTFMuYmluZCgKLQkJCQkJTGlicmFyeUVkaXRSZXNvdXJjZXMucmVzb2x2ZU5hbWVDb25mbGljdERpYWxvZ190ZXh0LAotCQkJCQlTdHJVdGlsLnRvTG93ZXIoZmVhdHVyZVR4dCksIG5ld0d1aWRhbmNlLmdldE5hbWUoKSk7Ci0JCQlTdHJpbmcgY3VycmVudFZhbHVlID0gKFN0cmluZykgbmV3R3VpZGFuY2UuZUdldChVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkuZ2V0TmFtZWRFbGVtZW50X05hbWUoKSk7Ci0KLQkJCUlJbnB1dFZhbGlkYXRvciBpbnB1dFZhbGlkYXRvciA9IG5ldyBJSW5wdXRWYWxpZGF0b3IoKSB7Ci0JCQkJcHVibGljIFN0cmluZyBpc1ZhbGlkKFN0cmluZyBuZXdUZXh0KSB7Ci0JCQkJCXJldHVybiB2YWxpZGF0b3IuaXNWYWxpZChuZXdUZXh0KTsKLQkJCQl9Ci0JCQl9OwotCi0JCQlJbnB1dERpYWxvZyBpbnB1dERsZyA9IG5ldyBJbnB1dERpYWxvZygKLQkJCQkJTXNnQm94LmdldERlZmF1bHRTaGVsbCgpLCB0aXRsZSwgZGxnTXNnLCBjdXJyZW50VmFsdWUsCi0JCQkJCWlucHV0VmFsaWRhdG9yKTsKLQkJCWlmIChpbnB1dERsZy5vcGVuKCkgPT0gV2luZG93LkNBTkNFTCkgewotCQkJCXRocm93IG5ldyBPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbigpOwotCQkJfQotCQkJcmV0dXJuIGlucHV0RGxnLmdldFZhbHVlKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIEVDbGFzcyBnZXRHdWlkYW5jZVR5cGUoaW50IG5ld0d1aWRhbmNlVHlwZSkgewotCQlzd2l0Y2ggKG5ld0d1aWRhbmNlVHlwZSkgewotCQljYXNlIFVtYVBhY2thZ2UuQ09OQ0VQVDoKLQkJCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLkNPTkNFUFQ7Ci0JCWNhc2UgVW1hUGFja2FnZS5DSEVDS0xJU1Q6Ci0JCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5DSEVDS0xJU1Q7Ci0JCWNhc2UgVW1hUGFja2FnZS5FWEFNUExFOgotCQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuRVhBTVBMRTsKLQkJY2FzZSBVbWFQYWNrYWdlLkdVSURFTElORToKLQkJCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLkdVSURFTElORTsKLQkJY2FzZSBVbWFQYWNrYWdlLkVTVElNQVRJT05fQ09OU0lERVJBVElPTlM6Ci0JCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5FU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TOwotCQljYXNlIFVtYVBhY2thZ2UuUkVQT1JUOgotCQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuUkVQT1JUOwotCQljYXNlIFVtYVBhY2thZ2UuVEVNUExBVEU6Ci0JCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5URU1QTEFURTsKLQkJY2FzZSBVbWFQYWNrYWdlLlNVUFBPUlRJTkdfTUFURVJJQUw6Ci0JCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5TVVBQT1JUSU5HX01BVEVSSUFMOwotCQljYXNlIFVtYVBhY2thZ2UuVE9PTF9NRU5UT1I6Ci0JCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5UT09MX01FTlRPUjsKLQkJY2FzZSBVbWFQYWNrYWdlLldISVRFUEFQRVI6Ci0JCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5XSElURVBBUEVSOwotCQljYXNlIFVtYVBhY2thZ2UuVEVSTV9ERUZJTklUSU9OOgotCQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuVEVSTV9ERUZJTklUSU9OOwotCQljYXNlIFVtYVBhY2thZ2UuUFJBQ1RJQ0U6Ci0JCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5QUkFDVElDRTsKLQkJY2FzZSBVbWFQYWNrYWdlLlJFVVNBQkxFX0FTU0VUOgotCQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuUkVVU0FCTEVfQVNTRVQ7Ci0JCWRlZmF1bHQ6Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIEd1aWRhbmNlIGNyZWF0ZU5ld0d1aWRhbmNlKGludCBuZXdHdWlkYW5jZVR5cGUpIHsKLQkJc3dpdGNoIChuZXdHdWlkYW5jZVR5cGUpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkNPTkNFUFQ6Ci0JCQlyZXR1cm4gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQ29uY2VwdCgpOwotCQljYXNlIFVtYVBhY2thZ2UuQ0hFQ0tMSVNUOgotCQkJcmV0dXJuIFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUNoZWNrbGlzdCgpOwotCQljYXNlIFVtYVBhY2thZ2UuRVhBTVBMRToKLQkJCXJldHVybiBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVFeGFtcGxlKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5HVUlERUxJTkU6Ci0JCQlyZXR1cm4gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlR3VpZGVsaW5lKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5FU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TOgotCQkJcmV0dXJuIFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUVzdGltYXRpb25Db25zaWRlcmF0aW9ucygpOwotCQljYXNlIFVtYVBhY2thZ2UuUkVQT1JUOgotCQkJcmV0dXJuIFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVJlcG9ydCgpOwotCQljYXNlIFVtYVBhY2thZ2UuVEVNUExBVEU6Ci0JCQlyZXR1cm4gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlVGVtcGxhdGUoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlNVUFBPUlRJTkdfTUFURVJJQUw6Ci0JCQlyZXR1cm4gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlU3VwcG9ydGluZ01hdGVyaWFsKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5UT09MX01FTlRPUjoKLQkJCXJldHVybiBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVUb29sTWVudG9yKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5XSElURVBBUEVSOgotCQkJcmV0dXJuIFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVdoaXRlcGFwZXIoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlRFUk1fREVGSU5JVElPTjoKLQkJCXJldHVybiBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVUZXJtRGVmaW5pdGlvbigpOwotCQljYXNlIFVtYVBhY2thZ2UuUFJBQ1RJQ0U6Ci0JCQlyZXR1cm4gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUHJhY3RpY2UoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlJFVVNBQkxFX0FTU0VUOgotCQkJcmV0dXJuIFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVJldXNhYmxlQXNzZXQoKTsKLQkJZGVmYXVsdDoKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyBMaXN0IGdldFZhbGlkTmV3R3VpZGFuY2VUeXBlcyhHdWlkYW5jZSBvbGRHdWlkYW5jZSkgewotCQlpZiAob2xkR3VpZGFuY2UgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlJbnRlZ2VyIG9sZEd1aWRhbmNlQ2xhc3NJRCA9IG5ldyBJbnRlZ2VyKG9sZEd1aWRhbmNlLmVDbGFzcygpCi0JCQkJLmdldENsYXNzaWZpZXJJRCgpKTsKLQkJaWYgKCFjb21wYXRpYmxlR3VpZGFuY2VzTGlzdC5jb250YWlucyhvbGRHdWlkYW5jZUNsYXNzSUQpKQotCQkJcmV0dXJuIG51bGw7Ci0JCUxpc3QgZ3VpZGFuY2VMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbXBhdGlibGVHdWlkYW5jZXMubGVuZ3RoOyBpKyspIHsKLQkJCUludGVnZXIgY29tcGF0aWJsZUd1aWRhbmNlVHlwZUNsYXNzSUQgPSBuZXcgSW50ZWdlcigKLQkJCQkJY29tcGF0aWJsZUd1aWRhbmNlc1tpXSk7Ci0JCQlpZiAoIW9sZEd1aWRhbmNlQ2xhc3NJRC5lcXVhbHMoY29tcGF0aWJsZUd1aWRhbmNlVHlwZUNsYXNzSUQpKQotCQkJCWd1aWRhbmNlTGlzdC5hZGQoY29tcGF0aWJsZUd1aWRhbmNlVHlwZUNsYXNzSUQpOwotCQl9Ci0JCXJldHVybiBndWlkYW5jZUxpc3Q7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL3V0aWwvVHlwZUNvbnZlcnRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL3V0aWwvVHlwZUNvbnZlcnRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNGU0YWJjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS91dGlsL1R5cGVDb252ZXJ0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzNyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS51dGlsOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbXBvdW5kQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLlJlbW92ZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5TZXRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udWkudXRpbC5Nc2dCb3g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5TdHJVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2VVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklSZXNvdXJjZUF3YXJlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuTmVzdGVkQ29tbWFuZEV4Y2VjdXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuRXh0ZW5zaW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuSU9wcG9zaXRlRmVhdHVyZUxvYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuTWVzc2VuZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbi5JVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbi5JVmFsaWRhdG9yRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5MaWJyYXJ5VUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5Db250ZW50UmVzb3VyY2VTY2FubmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuUmVzb3VyY2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLnV0aWwuUGVyc2lzdGVuY2VVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy5JTGlicmFyeVBlcnNpc3RlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VydmljZXMuU2VydmljZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5OYW1lZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQXNzb2NpYXRpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkNvbnRlbnREZXNjcmlwdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JSW5wdXRWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JbnB1dERpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBUeXBlQ29udmVydGVyIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBDb21wYXJhdG9yIGFjdGl2aXR5RmVhdHVyZUNvbXBhcmF0b3IgPSBuZXcgQ29tcGFyYXRvcigpIHsKLQotCQlwdWJsaWMgaW50IGNvbXBhcmUoT2JqZWN0IGFyZzAsIE9iamVjdCBhcmcxKSB7Ci0JCQlpZihhcmcwID09IFVtYVBhY2thZ2UuTGl0ZXJhbHMuQlJFQUtET1dOX0VMRU1FTlRfX1NVUEVSX0FDVElWSVRJRVMpIHsKLQkJCQlyZXR1cm4gLTE7Ci0JCQl9Ci0JCQlyZXR1cm4gMDsKLQkJfQotCQkKLQl9OwotCQotCS8qKgotCSAqIENvbnZlcnRzIHRoZSBzcGVjaWZpZWQgb2JqZWN0IHRvIGEgb2JqZWN0IG9mIG5ldyB0eXBlIHNwZWNpZmllZCBieSA8Y29kZT5uZXdUeXBlPC9jb2RlPiB3aGlsZSBzdGlsbAotCSAqIHByZXNlcnZpbmcgYXMgbWFueSBhdHRyaWJ1dGVzIGFuZCByZWxhdGlvbnNoaXBzIGFzIHBvc3NpYmxlCi0JICogCi0JICogQHBhcmFtIG9iamVjdAotCSAqIEBwYXJhbSBuZXdUeXBlCi0JICogQHBhcmFtIG9sZEZlYXR1cmVUb05ld0ZlYXR1cmVNYXAgbWFwIG9mIGZlYXR1cmUgb2YgPGNvZGU+b2JqZWN0PC9jb2RlPiB0byBmZWF0dXJlIG9mIDxjb2RlPm5ld1R5cGU8L2NvZGU+Ci0JICogQHJldHVybiBuZXcgb2JqZWN0IG9mIHR5cGUgPGNvZGU+bmV3VHlwZTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEVPYmplY3QgY29udmVydChFT2JqZWN0IG9iamVjdCwgRUNsYXNzIG5ld1R5cGUsCi0JCQlNYXAgb2xkRmVhdHVyZVRvTmV3RmVhdHVyZU1hcCwgQ29tcGFyYXRvciBmZWF0dXJlQ29tcGFyYXRvciwgU2V0IG1vZGlmaWVkUmVzb3VyY2VzKSAKLQl7Ci0JCVR5cGVDb252ZXJzaW9uQ29tbWFuZCBjbWQgPSBjcmVhdGVUeXBlQ29udmVyc2lvbkNvbW1hbmQob2JqZWN0LCBuZXdUeXBlLCBvbGRGZWF0dXJlVG9OZXdGZWF0dXJlTWFwLCBmZWF0dXJlQ29tcGFyYXRvcik7Ci0JCUNvbGxlY3Rpb248UmVzb3VyY2U+IHJlc291cmNlcyA9IGNtZC5nZXRNb2RpZmllZFJlc291cmNlcygpOwotCQlpZighcmVzb3VyY2VzLmlzRW1wdHkoKSkgewotCQkJUmVzb3VyY2VbXSByZXNvdXJjZUFycmF5ID0gbmV3IFJlc291cmNlW3Jlc291cmNlcy5zaXplKCldOwotCQkJcmVzb3VyY2VzLnRvQXJyYXkocmVzb3VyY2VBcnJheSk7Ci0JCQlJU3RhdHVzIHN0YXR1cyA9IFNlcnZpY2VzLmdldEFjY2Vzc0NvbnRyb2xsZXIoKS5jaGVja01vZGlmeShyZXNvdXJjZUFycmF5LCBFeHRlbnNpb25NYW5hZ2VyLmdldERlZmF1bHRVc2VySW50ZXJhY3Rpb25IYW5kbGVyKCkuZ2V0VUlDb250ZXh0KCkpOwotCQkJaWYoIXN0YXR1cy5pc09LKCkpIHsKLQkJCQlNZXNzZW5nZXIuSU5TVEFOQ0Uuc2hvd0Vycm9yKExpYnJhcnlSZXNvdXJjZXMuY29udmVydEFjdGl2aXR5RXJyb3JfdGl0bGUsIG51bGwsIHN0YXR1cyk7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCX0KLQkJdHJ5IHsKLQkJCWNtZC5leGVjdXRlKCk7Ci0JCQltb2RpZmllZFJlc291cmNlcy5hZGRBbGwoY21kLmdldE1vZGlmaWVkUmVzb3VyY2VzKCkpOwotCQkJcmV0dXJuIChFT2JqZWN0KSBjbWQuZ2V0UmVzdWx0KCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQljbWQuZGlzcG9zZSgpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIGNsYXNzIFJlc291cmNlQ29weVRhc2sgewotCQlDb250ZW50UmVzb3VyY2VTY2FubmVyIHNjYW5uZXI7Ci0JCU1ldGhvZEVsZW1lbnQgb3duZXI7Ci0JCVN0cmluZyBjb250ZW50OwotCQlTdHJpbmcgY29udGVudFBhdGg7Ci0JCQotCQkvKioKLQkJICogQHBhcmFtIHNjYW5uZXIKLQkJICogQHBhcmFtIG93bmVyCi0JCSAqIEBwYXJhbSBjb250ZW50Ci0JCSAqIEBwYXJhbSBjb250ZW50UGF0aAotCQkgKi8KLQkJcHVibGljIFJlc291cmNlQ29weVRhc2soQ29udGVudFJlc291cmNlU2Nhbm5lciBzY2FubmVyLCBNZXRob2RFbGVtZW50IG93bmVyLCBTdHJpbmcgY29udGVudCwgU3RyaW5nIGNvbnRlbnRQYXRoKSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5zY2FubmVyID0gc2Nhbm5lcjsKLQkJCXRoaXMub3duZXIgPSBvd25lcjsKLQkJCXRoaXMuY29udGVudCA9IGNvbnRlbnQ7Ci0JCQl0aGlzLmNvbnRlbnRQYXRoID0gY29udGVudFBhdGg7Ci0JCX0JCi0JCQkJCi0JfQotCQotCXB1YmxpYyBzdGF0aWMgY2xhc3MgVHlwZUNvbnZlcnNpb25Db21tYW5kIGV4dGVuZHMgQ29tcG91bmRDb21tYW5kIGltcGxlbWVudHMgSVJlc291cmNlQXdhcmVDb21tYW5kIHsKLQotCQlwcml2YXRlIENvbGxlY3Rpb248Pz4gcmVzdWx0OwotCQlwcml2YXRlIEVPYmplY3Qgb2JqZWN0OwotCQlwcml2YXRlIEhhc2hTZXQ8UmVzb3VyY2U+IG1vZGlmaWVkUmVzb3VyY2VzOwotCQlwcml2YXRlIGJvb2xlYW4gZ290TW9kaWZpZWRSZXNvdXJjZXM7Ci0JCXByaXZhdGUgTGlzdDxSZXNvdXJjZUNvcHlUYXNrPiByZXNvdXJjZUNvcHlUYXNrczsKLQkJcHJpdmF0ZSBSZXNvdXJjZSByZXNvdXJjZTsKLQkJcHJpdmF0ZSBDb2xsZWN0aW9uIGlsbGVnYWxSZWZlcmVuY2VyczsKLQkJcHJpdmF0ZSBOZXN0ZWRDb21tYW5kRXhjZWN1dG9yIG5lc3RlZENvbW1hbmRFeGNlY3V0b3I7Ci0KLQkJLyoqCi0JCSAqIEBwYXJhbSBvYmplY3QKLQkJICovCi0JCXB1YmxpYyBUeXBlQ29udmVyc2lvbkNvbW1hbmQoRU9iamVjdCBvYmplY3QpIHsKLQkJCXRoaXMub2JqZWN0ID0gb2JqZWN0OwotCQkJbW9kaWZpZWRSZXNvdXJjZXMgPSBuZXcgSGFzaFNldDxSZXNvdXJjZT4oKTsKLQkJCXJlc291cmNlID0gb2JqZWN0LmVSZXNvdXJjZSgpOwotCQkJaWYocmVzb3VyY2UgIT0gbnVsbCkgewotCQkJCW1vZGlmaWVkUmVzb3VyY2VzLmFkZChyZXNvdXJjZSk7Ci0JCQl9Ci0JCQlyZXNvdXJjZUNvcHlUYXNrcyA9IG5ldyBBcnJheUxpc3Q8UmVzb3VyY2VDb3B5VGFzaz4oKTsKLQkJCW5lc3RlZENvbW1hbmRFeGNlY3V0b3IgPSBuZXcgTmVzdGVkQ29tbWFuZEV4Y2VjdXRvcih0aGlzKTsKLQkJfQotCQkKLQkJLyogKG5vbi1KYXZhZG9jKQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21wb3VuZENvbW1hbmQjZGlzcG9zZSgpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkJaWYoaWxsZWdhbFJlZmVyZW5jZXJzICE9IG51bGwpIHsKLQkJCQlpbGxlZ2FsUmVmZXJlbmNlcnMuY2xlYXIoKTsKLQkJCX0KLQkJCWlmKG1vZGlmaWVkUmVzb3VyY2VzICE9IG51bGwpIHsKLQkJCQltb2RpZmllZFJlc291cmNlcy5jbGVhcigpOwotCQkJfQotCQkJaWYocmVzb3VyY2VDb3B5VGFza3MgIT0gbnVsbCkgewotCQkJCXJlc291cmNlQ29weVRhc2tzLmNsZWFyKCk7Ci0JCQl9Ci0JCQlpZihuZXN0ZWRDb21tYW5kRXhjZWN1dG9yICE9IG51bGwpIHsKLQkJCQluZXN0ZWRDb21tYW5kRXhjZWN1dG9yLmRpc3Bvc2UoKTsKLQkJCX0KLQkJCXN1cGVyLmRpc3Bvc2UoKTsKLQkJfQotCQkJCQotCQkvKioKLQkJICogR2V0cyByZWZlcmVuY2VycyB0aGF0IGJlY29tZSBpbGxlZ2FsIGFmdGVyIHRoZSB0eXBlIGNvbnZlcnNpb24KLQkJICogCi0JCSAqIEByZXR1cm4KLQkJICovCi0JCXB1YmxpYyBDb2xsZWN0aW9uIGdldElsbGVnYWxSZWZlcmVuY2VycygpIHsKLQkJCWlmKGlsbGVnYWxSZWZlcmVuY2VycyA9PSBudWxsKSB7Ci0JCQkJZ2V0TW9kaWZpZWRSZXNvdXJjZXMoKTsKLQkJCX0KLQkJCXJldHVybiBpbGxlZ2FsUmVmZXJlbmNlcnM7Ci0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIGNvcHlSZXNvdXJjZXMoKSB7Ci0JCQlpZighcmVzb3VyY2VDb3B5VGFza3MuaXNFbXB0eSgpKSB7Ci0JCQkJZm9yIChSZXNvdXJjZUNvcHlUYXNrIHQgOiByZXNvdXJjZUNvcHlUYXNrcykgewotCQkJCQlGaWxlIG5ld1Jlc291cmNlUGF0aCA9IG5ldyBGaWxlKFJlc291cmNlSGVscGVyLmdldEFic29sdXRlRWxlbWVudFJlc291cmNlUGF0aCh0Lm93bmVyKSk7Ci0JCQkJCXQuc2Nhbm5lci5zZXRUYXJnZXRSb290UGF0aChuZXdSZXNvdXJjZVBhdGgpOwotCQkJCQlpZih0LmNvbnRlbnQgIT0gbnVsbCkgewotCQkJCQkJdC5zY2FubmVyLnJlc29sdmVSZXNvdXJjZXModC5vd25lciwgdC5jb250ZW50LCB0LmNvbnRlbnRQYXRoKTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCWZvciAoRUF0dHJpYnV0ZSBhdHRyaWJ1dGUgOiB0Lm93bmVyLmVDbGFzcygpLmdldEVBbGxBdHRyaWJ1dGVzKCkpIHsKLQkJCQkJCQlPYmplY3QgdmFsdWUgPSB0Lm93bmVyLmVHZXQoYXR0cmlidXRlKTsKLQkJCQkJCQlpZih2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykgewotCQkJCQkJCQl0LnNjYW5uZXIucmVzb2x2ZVJlc291cmNlcyh0Lm93bmVyLCAoU3RyaW5nKSB2YWx1ZSwgdC5jb250ZW50UGF0aCk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQkvKiAobm9uLUphdmFkb2MpCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklSZXNvdXJjZUF3YXJlQ29tbWFuZCNnZXRNb2RpZmllZFJlc291cmNlcygpCi0JCSAqLwotCQlwdWJsaWMgQ29sbGVjdGlvbjxSZXNvdXJjZT4gZ2V0TW9kaWZpZWRSZXNvdXJjZXMoKSB7Ci0JCQlpZighZ290TW9kaWZpZWRSZXNvdXJjZXMpIHsKLQkJCQlpbGxlZ2FsUmVmZXJlbmNlcnMgPSBuZXcgSGFzaFNldCgpOwotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGNvbW1hbmRMaXN0Lml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQlDb21tYW5kIGNtZCA9IChDb21tYW5kKSBpdGVyLm5leHQoKTsKLQkJCQkJaWYoY21kIGluc3RhbmNlb2YgUmVtb3ZlQ29tbWFuZCkgewotCQkJCQkJUmVtb3ZlQ29tbWFuZCByZW1vdmVDb21tYW5kID0gKFJlbW92ZUNvbW1hbmQpIGNtZDsKLQkJCQkJCUVPYmplY3Qgb3duZXIgPSByZW1vdmVDb21tYW5kLmdldE93bmVyKCk7Ci0JCQkJCQlSZXNvdXJjZSBvd25lclJlc291cmNlID0gb3duZXIuZVJlc291cmNlKCk7Ci0JCQkJCQlpZihvd25lclJlc291cmNlICE9IG51bGwgJiYgb3duZXJSZXNvdXJjZSAhPSByZXNvdXJjZSkgewotCQkJCQkJCW1vZGlmaWVkUmVzb3VyY2VzLmFkZChvd25lclJlc291cmNlKTsKLQkJCQkJCX0KLQkJCQkJCWlmKG93bmVyUmVzb3VyY2UgIT0gbnVsbCAmJiBvd25lciAhPSBvYmplY3QgJiYgIVVtYVV0aWwuaXNDb250YWluZWRCeShvd25lciwgb2JqZWN0KSkgewotCQkJCQkJCWlsbGVnYWxSZWZlcmVuY2Vycy5hZGQob3duZXIpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWVsc2UgaWYoY21kIGluc3RhbmNlb2YgU2V0Q29tbWFuZCkgewotCQkJCQkJU2V0Q29tbWFuZCBzZXRDb21tYW5kID0gKFNldENvbW1hbmQpIGNtZDsKLQkJCQkJCUVPYmplY3Qgb3duZXIgPSBzZXRDb21tYW5kLmdldE93bmVyKCk7Ci0JCQkJCQlSZXNvdXJjZSBvd25lclJlc291cmNlID0gb3duZXIuZVJlc291cmNlKCk7Ci0JCQkJCQlpZihvd25lclJlc291cmNlICE9IG51bGwgJiYgb3duZXJSZXNvdXJjZSAhPSByZXNvdXJjZSAmJiBzZXRDb21tYW5kLmdldFZhbHVlKCkgaW5zdGFuY2VvZiBFT2JqZWN0KSB7Ci0JCQkJCQkJRU9iamVjdCB2YWx1ZSA9IChFT2JqZWN0KSBzZXRDb21tYW5kLmdldFZhbHVlKCk7Ci0JCQkJCQkJaWYodmFsdWUgIT0gb2JqZWN0IHx8ICFVbWFVdGlsLmlzQ29udGFpbmVkQnkodmFsdWUsIG9iamVjdCkpIHsKLQkJCQkJCQkJbW9kaWZpZWRSZXNvdXJjZXMuYWRkKG93bmVyUmVzb3VyY2UpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCWlmKG93bmVyUmVzb3VyY2UgIT0gbnVsbCAmJiBvd25lciAhPSBvYmplY3QgJiYgIVVtYVV0aWwuaXNDb250YWluZWRCeShvd25lciwgb2JqZWN0KQotCQkJCQkJCQkmJiBzZXRDb21tYW5kLmdldFZhbHVlKCkgPT0gc2V0Q29tbWFuZC5nZXRGZWF0dXJlKCkuZ2V0RGVmYXVsdFZhbHVlKCkpIHsKLQkJCQkJCQlpbGxlZ2FsUmVmZXJlbmNlcnMuYWRkKG93bmVyKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQkKLQkJCQlnb3RNb2RpZmllZFJlc291cmNlcyA9IHRydWU7Ci0JCQl9Ci0JCQltb2RpZmllZFJlc291cmNlcy5hZGRBbGwobmVzdGVkQ29tbWFuZEV4Y2VjdXRvci5nZXRNb2RpZmllZFJlc291cmNlcygpKTsJCQotCQkJcmV0dXJuIG1vZGlmaWVkUmVzb3VyY2VzOwotCQl9Ci0JCQotCQlwcml2YXRlIHZvaWQgc2V0UmVzdWx0KENvbGxlY3Rpb248Pz4gcmVzdWx0KSB7Ci0JCQl0aGlzLnJlc3VsdCA9IHJlc3VsdDsKLQkJfQotCQkKLQkJLyogKG5vbi1KYXZhZG9jKQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21wb3VuZENvbW1hbmQjZ2V0UmVzdWx0KCkKLQkJICovCi0JCXB1YmxpYyBDb2xsZWN0aW9uPD8+IGdldFJlc3VsdCgpIHsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQkJc3VwZXIuZXhlY3V0ZSgpOwkJCQotCQkJbmVzdGVkQ29tbWFuZEV4Y2VjdXRvci5leGVjdXRlTmVzdGVkQ29tbWFuZHMoKTsKLQkJfQotCQkKLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyB2b2lkIHVuZG8oKSB7Ci0JCQluZXN0ZWRDb21tYW5kRXhjZWN1dG9yLnVuZG9OZXN0ZWRDb21tYW5kcygpOwotCQkJc3VwZXIudW5kbygpOwotCQl9Ci0JCQotCQlwcml2YXRlIExpc3Q8Q29tbWFuZD4gY29tbWFuZExpc3QoKSB7Ci0JCQlyZXR1cm4gY29tbWFuZExpc3Q7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogCi0JICogQHBhcmFtIG9iamVjdCBFT2JqZWN0Ci0JICogQHBhcmFtIG5ld1R5cGUgRUNsYXNzCi0JICogQHBhcmFtIG9sZEZlYXR1cmVUb05ld0ZlYXR1cmVNYXAgTWFwCi0JICogQHBhcmFtIGZlYXR1cmVDb21wYXJhdG9yIENvbXBhcmF0b3IKLQkgKiBAcmV0dXJuIFR5cGVDb252ZXJzaW9uQ29tbWFuZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgVHlwZUNvbnZlcnNpb25Db21tYW5kIGNyZWF0ZVR5cGVDb252ZXJzaW9uQ29tbWFuZChFT2JqZWN0IG9iamVjdCwgRUNsYXNzIG5ld1R5cGUsIAotCQkJTWFwIG9sZEZlYXR1cmVUb05ld0ZlYXR1cmVNYXAsIENvbXBhcmF0b3IgZmVhdHVyZUNvbXBhcmF0b3IpIHsKLQkJcmV0dXJuIGNyZWF0ZVR5cGVDb252ZXJzaW9uQ29tbWFuZChvYmplY3QsIG5ld1R5cGUsIG9sZEZlYXR1cmVUb05ld0ZlYXR1cmVNYXAsIGZlYXR1cmVDb21wYXJhdG9yLCBmYWxzZSwgZmFsc2UpOwotCX0KLQkKLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gb2JqZWN0IEVPYmplY3QKLQkgKiBAcGFyYW0gbmV3VHlwZSBFQ2xhc3MKLQkgKiBAcGFyYW0gb2xkRmVhdHVyZVRvTmV3RmVhdHVyZU1hcCBNYXAKLQkgKiBAcGFyYW0gZmVhdHVyZUNvbXBhcmF0b3IgQ29tcGFyYXRvcgotCSAqIEBwYXJhbSByZW1vdmVJbmNvbWluZ1JlZmVyZW5jZXMgYm9vbGVhbgotCSAqIEBwYXJhbSByZW1vdmVWYXJpYWJpbGl0eSBib29sZWFuCi0JICogQHJldHVybiBUeXBlQ29udmVyc2lvbkNvbW1hbmQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFR5cGVDb252ZXJzaW9uQ29tbWFuZCBjcmVhdGVUeXBlQ29udmVyc2lvbkNvbW1hbmQoRU9iamVjdCBvYmplY3QsIEVDbGFzcyBuZXdUeXBlLCAKLQkJCU1hcCBvbGRGZWF0dXJlVG9OZXdGZWF0dXJlTWFwLCBDb21wYXJhdG9yIGZlYXR1cmVDb21wYXJhdG9yLCAKLQkJCWJvb2xlYW4gcmVtb3ZlSW5jb21pbmdSZWZlcmVuY2VzLCBib29sZWFuIHJlbW92ZVZhcmlhYmlsaXR5KSB7Ci0JCVR5cGVDb252ZXJzaW9uQ29tbWFuZCBjbWQgPSBuZXcgVHlwZUNvbnZlcnNpb25Db21tYW5kKG9iamVjdCk7Ci0JCUVPYmplY3QgbmV3T2JqZWN0ID0gcHJlcGFyZUNvbnZlcnQob2JqZWN0LCBuZXdUeXBlLCBvbGRGZWF0dXJlVG9OZXdGZWF0dXJlTWFwLCBmZWF0dXJlQ29tcGFyYXRvciwgcmVtb3ZlSW5jb21pbmdSZWZlcmVuY2VzLCByZW1vdmVWYXJpYWJpbGl0eSwgY21kKTsKLQkJCi0JCS8vIHJlcGxhY2Ugb2JqZWN0IHdpdGggbmV3T2JqZWN0IGluIHRoZSBvYmplY3QncyBjb250YWluZXIKLQkJLy8KLQkJRU9iamVjdCBjb250YWluZXIgPSBvYmplY3QuZUNvbnRhaW5lcigpOwotCQlpZihjb250YWluZXIgIT0gbnVsbCkgewotCQkJRVJlZmVyZW5jZSByZWYgPSBvYmplY3QuZUNvbnRhaW5tZW50RmVhdHVyZSgpOwotCQkJaWYocmVmLmlzTWFueSgpKSB7Ci0JCQkJTGlzdCBsaXN0ID0gKExpc3QpIGNvbnRhaW5lci5lR2V0KHJlZik7Ci0JCQkJaW50IGluZGV4ID0gbGlzdC5pbmRleE9mKG9iamVjdCk7Ci0JCQkJY21kLmNvbW1hbmRMaXN0KCkuYWRkKDAsIG5ldyBTZXRDb21tYW5kKG51bGwsIGNvbnRhaW5lciwgcmVmLCBuZXdPYmplY3QsIGluZGV4KSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQljbWQuY29tbWFuZExpc3QoKS5hZGQoMCwgbmV3IFNldENvbW1hbmQobnVsbCwgY29udGFpbmVyLCByZWYsIG5ld09iamVjdCkpOwotCQkJfQotCQl9Ci0JCQotCQljbWQuc2V0UmVzdWx0KENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QobmV3T2JqZWN0KSk7Ci0JCQotCQlyZXR1cm4gY21kOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBDb250ZW50UmVzb3VyY2VTY2FubmVyIGNyZWF0ZVNjYW5uZXIoRU9iamVjdCBvYmplY3QpIHsKLQkJaWYob2JqZWN0IGluc3RhbmNlb2YgQ29udGVudERlc2NyaXB0aW9uICYmICEob2JqZWN0IGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uKSkgewkJCQotCQkJRmlsZSBvbGRSZXNvdXJjZVBhdGggPSBuZXcgRmlsZShSZXNvdXJjZUhlbHBlci5nZXRGb2xkZXJBYnNvbHV0ZVBhdGgoKE1ldGhvZEVsZW1lbnQpIG9iamVjdCkpOwotCQkJU3RyaW5nIHJvb3RDb250ZW50cGF0aCA9IFJlc291cmNlSGVscGVyLmdldEVsZW1lbnRQYXRoKChNZXRob2RFbGVtZW50KW9iamVjdCk7Ci0JCQlDb250ZW50UmVzb3VyY2VTY2FubmVyIHNjYW5uZXIgPSBuZXcgQ29udGVudFJlc291cmNlU2Nhbm5lcihvbGRSZXNvdXJjZVBhdGgsIG51bGwsIHJvb3RDb250ZW50cGF0aCwgbnVsbCk7Ci0JCQlyZXR1cm4gc2Nhbm5lcjsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9CQotCQotCS8qKgotCSAqIFByZXBhcmVzIGEgY29tcG91bmQgY29tbWFuZCB0byBkbyBhIHR5cGUgY29udmVyc2lvbgotCSAqIAotCSAqIEBwYXJhbSBvYmplY3QKLQkgKiBAcGFyYW0gbmV3VHlwZQotCSAqIEBwYXJhbSBvbGRGZWF0dXJlVG9OZXdGZWF0dXJlTWFwCi0JICogQHBhcmFtIGZlYXR1cmVDb21wYXJhdG9yIHVzZWQgdG8gc29ydCB0aGUgZmVhdHVyZSBsaXN0IG9mIG9iamVjdCB0byBjb252ZXJ0IGJlZm9yZSBjb3B5aW5nL21vdmluZwotCSAqICAgICAgICBmZWF0dXJlIHZhbHVlcyB0byBuZXcgb2JqZWN0LgotCSAqIEBwYXJhbSByZW1vdmVJbmNvbWluZ1JlZmVyZW5jZXMgaWYgdHJ1ZSB3aWxsIHJlbW92ZSBhbGwgaW5jb21pbmcgcmVmZXJlbmNlcyAKLQkgKiBAcGFyYW0gY29tcG91bmRDb21tYW5kCi0JICogQHJldHVybiBFT2JqZWN0Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBFT2JqZWN0IHByZXBhcmVDb252ZXJ0KEVPYmplY3Qgb2JqZWN0LCBFQ2xhc3MgbmV3VHlwZSwgTWFwIG9sZEZlYXR1cmVUb05ld0ZlYXR1cmVNYXAsCi0JCQlDb21wYXJhdG9yIGZlYXR1cmVDb21wYXJhdG9yLCBib29sZWFuIHJlbW92ZUluY29taW5nUmVmZXJlbmNlcywgYm9vbGVhbiByZW1vdmVWYXJpYWJpbGl0eSwKLQkJCVR5cGVDb252ZXJzaW9uQ29tbWFuZCBjb21wb3VuZENvbW1hbmQpIHsKLQkJRU9iamVjdCBuZXdPYmplY3QgPSBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGUobmV3VHlwZSk7Ci0JCQotCQlpZihvYmplY3QgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQkvLyBIYW5kbGUgaW5jb21pbmcgcmVmZXJlbmNlcy4KLQkJCS8vIElmIHJlbW92ZUluY29tbWluZ1JlZmVyZW5jZXMgaXMgZmFsc2UsIHJlZGlyZWN0IGFsbCBpbmNvbWluZyByZWZlcmVuY2VzIG9mIG9iamVjdCB0byBuZXdPYmplY3QKLQkJCS8vIElmIHJlbW92ZUluY29tbWluZ1JlZmVyZW5jZXMgaXMgdHJ1ZSwgcmVtb3ZlIGFsbCBvZiB0aGVtLgotCQkJLy8JCQkKLQotCQkJTWV0aG9kRWxlbWVudCBtZSA9IChNZXRob2RFbGVtZW50KSBvYmplY3Q7Ci0JCQlDb2xsZWN0aW9uIG9wcG9zaXRlRmVhdHVyZXMgPSBtZS5nZXRPcHBvc2l0ZUZlYXR1cmVzKCk7Ci0JCQlpZighb3Bwb3NpdGVGZWF0dXJlcy5pc0VtcHR5KCkpIHsJCQkJCi0JCQkJCi0JCQkJLy8gbG9hZCBvcHBvc2l0ZSBmZWF0dXJlcwotCQkJCS8vCi0JCQkJQ29sbGVjdGlvbiBjb2xsZWN0aW9uID0gQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChvYmplY3QpOwotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IEV4dGVuc2lvbk1hbmFnZXIuZ2V0T3Bwb3NpdGVGZWF0dXJlTG9hZGVycygpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCUlPcHBvc2l0ZUZlYXR1cmVMb2FkZXIgbG9hZGVyID0gKElPcHBvc2l0ZUZlYXR1cmVMb2FkZXIpIGl0ZXIubmV4dCgpOwotCQkJCQlsb2FkZXIubG9hZE9wcG9zaXRlRmVhdHVyZXMoY29sbGVjdGlvbik7Ci0JCQkJfQotCQkJCQotCQkJCU1hcCByZWZlcmVuY2VyVG9GZWF0dXJlTGlzdE1hcCA9IEFzc29jaWF0aW9uSGVscGVyLmdldFJlZmVyZW5jZU1hcChtZSk7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gcmVmZXJlbmNlclRvRmVhdHVyZUxpc3RNYXAuZW50cnlTZXQoKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQlNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBpdGVyLm5leHQoKTsKLQkJCQkJRU9iamVjdCByZWZlcmVuY2VyID0gKEVPYmplY3QpIGVudHJ5LmdldEtleSgpOwotCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gKChDb2xsZWN0aW9uKWVudHJ5LmdldFZhbHVlKCkpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yCi0JCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCUVSZWZlcmVuY2UgZmVhdHVyZSA9IChFUmVmZXJlbmNlKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCQlpZighcmVtb3ZlSW5jb21pbmdSZWZlcmVuY2VzICYmIGZlYXR1cmUuZ2V0RVR5cGUoKS5pc0luc3RhbmNlKG5ld09iamVjdCkpIHsKLQkJCQkJCQkvLyBuZXcgdHlwZSBpcyBjb21wYXRpYmxlLCByZWZlcmVuY2UgY2FuIGJlIHByZXNlcnZlZAotCQkJCQkJCS8vCi0JCQkJCQkJaWYoZmVhdHVyZS5pc01hbnkoKSkgewotCQkJCQkJCQlMaXN0IGxpc3QgPSAoTGlzdCkgcmVmZXJlbmNlci5lR2V0KGZlYXR1cmUpOwotCQkJCQkJCQlpbnQgaW5kZXggPSBsaXN0LmluZGV4T2Yob2JqZWN0KTsKLQkJCQkJCQkJY29tcG91bmRDb21tYW5kLmFwcGVuZChuZXcgU2V0Q29tbWFuZChudWxsLCByZWZlcmVuY2VyLCBmZWF0dXJlLCBuZXdPYmplY3QsIGluZGV4KSk7Ci0JCQkJCQkJfQotCQkJCQkJCWVsc2UgewotCQkJCQkJCQljb21wb3VuZENvbW1hbmQuYXBwZW5kKG5ldyBTZXRDb21tYW5kKG51bGwsIHJlZmVyZW5jZXIsIGZlYXR1cmUsIG5ld09iamVjdCkpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCWVsc2UgewotCQkJCQkJCS8vIG5ldyB0eXBlIGlzIG5vdCBjb21wYXRpYmxlLCByZWZlcmVuY2UgbXVzdCBiZSByZW1vdmVkCi0JCQkJCQkJLy8KLQkJCQkJCQlpZihmZWF0dXJlLmlzTWFueSgpKSB7Ci0JCQkJCQkJCWNvbXBvdW5kQ29tbWFuZC5hcHBlbmQobmV3IFJlbW92ZUNvbW1hbmQobnVsbCwgcmVmZXJlbmNlciwgZmVhdHVyZSwgb2JqZWN0KSk7Ci0JCQkJCQkJfQotCQkJCQkJCWVsc2UgewotCQkJCQkJCQljb21wb3VuZENvbW1hbmQuYXBwZW5kKG5ldyBTZXRDb21tYW5kKG51bGwsIHJlZmVyZW5jZXIsIGZlYXR1cmUsIGZlYXR1cmUuZ2V0RGVmYXVsdFZhbHVlKCkpKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCS8vIGNvcHkgYWxsIHRoZSBmZWF0dXJlcwotCQkvLwotCQlMaXN0IG5ld09iamVjdEZlYXR1cmVzID0gbmV3VHlwZS5nZXRFQWxsU3RydWN0dXJhbEZlYXR1cmVzKCk7Ci0JCUxpc3Qgb2JqZWN0RmVhdHVyZXMgPSBuZXcgQXJyYXlMaXN0KG9iamVjdC5lQ2xhc3MoKS5nZXRFQWxsU3RydWN0dXJhbEZlYXR1cmVzKCkpOwotCQlpZihyZW1vdmVWYXJpYWJpbGl0eSkgewotCQkJb2JqZWN0RmVhdHVyZXMucmVtb3ZlKFVtYVBhY2thZ2UuTGl0ZXJhbHMuVkFSSUFCSUxJVFlfRUxFTUVOVF9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVCk7Ci0JCQlvYmplY3RGZWF0dXJlcy5yZW1vdmUoVW1hUGFja2FnZS5MaXRlcmFscy5WQVJJQUJJTElUWV9FTEVNRU5UX19WQVJJQUJJTElUWV9UWVBFKTsKLQkJfQotCQlpZihmZWF0dXJlQ29tcGFyYXRvciAhPSBudWxsKSB7Ci0JCQlDb2xsZWN0aW9ucy5zb3J0KG9iamVjdEZlYXR1cmVzLCBmZWF0dXJlQ29tcGFyYXRvcik7Ci0JCX0KLQkJQ29udGVudFJlc291cmNlU2Nhbm5lciBzY2FubmVyID0gY3JlYXRlU2Nhbm5lcihvYmplY3QpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBvYmplY3RGZWF0dXJlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgaXRlci5uZXh0KCk7Ci0JCQlpZighbmV3T2JqZWN0RmVhdHVyZXMuY29udGFpbnMoZmVhdHVyZSkpIHsKLQkJCQlpZihvbGRGZWF0dXJlVG9OZXdGZWF0dXJlTWFwICE9IG51bGwpIHsKLQkJCQkJT2JqZWN0IGYgPSBvbGRGZWF0dXJlVG9OZXdGZWF0dXJlTWFwLmdldChmZWF0dXJlKTsKLQkJCQkJaWYoZiAhPSBudWxsICYmIG5ld09iamVjdEZlYXR1cmVzLmNvbnRhaW5zKGYpKSB7Ci0JCQkJCQlmZWF0dXJlID0gKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgZjsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCWZlYXR1cmUgPSBudWxsOwotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlmZWF0dXJlID0gbnVsbDsKLQkJCQl9Ci0JCQl9Ci0JCQlpZihmZWF0dXJlICE9IG51bGwgJiYgZmVhdHVyZS5pc0NoYW5nZWFibGUoKSkgewkJCQkKLQkJCQlib29sZWFuIGZlYXR1cmVIYW5kbGVkID0gZmFsc2U7Ci0JCQkJaWYoZmVhdHVyZSBpbnN0YW5jZW9mIEVSZWZlcmVuY2UpIHsKLQkJCQkJRVJlZmVyZW5jZSByZWYgPSAoRVJlZmVyZW5jZSkgZmVhdHVyZTsKLQkJCQkJaWYocmVmID09IFVtYVBhY2thZ2UuTGl0ZXJhbHMuREVTQ1JJQkFCTEVfRUxFTUVOVF9fUFJFU0VOVEFUSU9OKSB7Ci0JCQkJCQlpZihDb250ZW50RGVzY3JpcHRpb25GYWN0b3J5Lmhhc1ByZXNlbnRhdGlvbigoTWV0aG9kRWxlbWVudCkgb2JqZWN0KSkgewotCQkJCQkJCUNvbnRlbnREZXNjcmlwdGlvbiBjb250ZW50ID0gKENvbnRlbnREZXNjcmlwdGlvbikgb2JqZWN0LmVHZXQocmVmKTsKLQkJCQkJCQlFQ2xhc3MgY29udGVudERlc2NUeXBlID0gQ29udGVudERlc2NyaXB0aW9uRmFjdG9yeS5nZXRDb250ZW50RGVzY3JpcHRpb25UeXBlKG5ld1R5cGUpOwotCQkJCQkJCWlmKGNvbnRlbnREZXNjVHlwZSAhPSBudWxsICYmIGNvbnRlbnREZXNjVHlwZSAhPSBjb250ZW50LmVDbGFzcygpKSB7Ci0JCQkJCQkJCUVPYmplY3QgbmV3Q29udGVudCA9IHByZXBhcmVDb252ZXJ0KGNvbnRlbnQsIGNvbnRlbnREZXNjVHlwZSwgbnVsbCwgbnVsbCwgcmVtb3ZlSW5jb21pbmdSZWZlcmVuY2VzLCByZW1vdmVWYXJpYWJpbGl0eSwgY29tcG91bmRDb21tYW5kKTsKLQkJCQkJCQkJCi0JCQkJCQkJCS8vIHJlbW92ZSBvbGQgY29udGVudAotCQkJCQkJCQkvLwotCQkJCQkJCQlFT2JqZWN0IGNvbnRhaW5lciA9IGNvbnRlbnQuZUNvbnRhaW5lcigpOwotCQkJCQkJCQlpZihjb250YWluZXIgIT0gbnVsbCkgewotCQkJCQkJCQkJY29tcG91bmRDb21tYW5kLmFwcGVuZChuZXcgU2V0Q29tbWFuZChudWxsLCBvYmplY3QsIHJlZiwgbnVsbCkpOwotCQkJCQkJCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSBjb250ZW50LmVSZXNvdXJjZSgpOwotCQkJCQkJCQkJaWYocmVzb3VyY2UgIT0gbnVsbCkgewotCQkJCQkJCQkJCWNvbXBvdW5kQ29tbWFuZC5tb2RpZmllZFJlc291cmNlcy5hZGQoY29udGVudC5lUmVzb3VyY2UoKSk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQkJCQkJCQkJCi0JCQkJCQkJCWNvbnRlbnQgPSAoQ29udGVudERlc2NyaXB0aW9uKSBuZXdDb250ZW50OwotCQkJCQkJCX0KLQkJCQkJCQllbHNlIHsKLQkJCQkJCQkJY29tcG91bmRDb21tYW5kLnJlc291cmNlQ29weVRhc2tzLmFkZChuZXcgUmVzb3VyY2VDb3B5VGFzayhjcmVhdGVTY2FubmVyKGNvbnRlbnQpLCBjb250ZW50LCBudWxsLCAiIikpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJfQotCQkJCQkJCWNvbXBvdW5kQ29tbWFuZC5hcHBlbmQobmV3IFNldENvbW1hbmQobnVsbCwgbmV3T2JqZWN0LCByZWYsIGNvbnRlbnQpKTsKLQkJCQkJCX0KLQkJCQkJCWZlYXR1cmVIYW5kbGVkID0gdHJ1ZTsKLQkJCQkJfQkJCQkJCi0JCQkJCWVsc2UgaWYoIXJlZi5pc0NvbnRhaW5tZW50KCkgJiYgcmVmLmdldEVPcHBvc2l0ZSgpICE9IG51bGwpIHsKLQkJCQkJCS8vIFJlZmVyZW5jZSBpcyBiaS1kaXJlY3Rpb25hbC4gSWYgb3Bwb3NpdGUgcmVmZXJlbmNlIGlzIGEgbGlzdCwgcmVwbGFjZSBvYmplY3QKLQkJCQkJCS8vIHdpdGggbmV3IG9iamVjdCBhdCB0aGUgc2FtZSBwb3NpdGlvbiBpbiB0aGUgbGlzdC4KLQkJCQkJCS8vCi0JCQkJCQlFUmVmZXJlbmNlIG9wcG9zaXRlUmVmID0gcmVmLmdldEVPcHBvc2l0ZSgpOwkJCQkJCQotCQkJCQkJaWYob3Bwb3NpdGVSZWYuaXNNYW55KCkpIHsKLQkJCQkJCQlPYmplY3QgdmFsdWUgPSBvYmplY3QuZUdldChyZWYpOwotCQkJCQkJCWlmKHZhbHVlICE9IG51bGwpIHsKLQkJCQkJCQkJaWYocmVmLmlzTWFueSgpKSB7Ci0JCQkJCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gKChDb2xsZWN0aW9uKXZhbHVlKQotCQkJCQkJCQkJCQkuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJCQkJCQkJCUVPYmplY3Qgb3RoZXJFbmQgPSAoRU9iamVjdCkgaXRlcmF0b3IubmV4dCgpOwotCQkJCQkJCQkJCUxpc3QgbGlzdCA9IChMaXN0KSBvdGhlckVuZC5lR2V0KG9wcG9zaXRlUmVmKTsKLQkJCQkJCQkJCQlpbnQgaW5kZXggPSBsaXN0LmluZGV4T2Yob2JqZWN0KTsKLQkJCQkJCQkJCQljb21wb3VuZENvbW1hbmQuYXBwZW5kKG5ldyBTZXRDb21tYW5kKG51bGwsIG90aGVyRW5kLCBvcHBvc2l0ZVJlZiwgbmV3T2JqZWN0LCBpbmRleCkpOwotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJCWVsc2UgewotCQkJCQkJCQkJRU9iamVjdCBvdGhlckVuZCA9IChFT2JqZWN0KSB2YWx1ZTsKLQkJCQkJCQkJCUxpc3QgbGlzdCA9IChMaXN0KSBvdGhlckVuZC5lR2V0KG9wcG9zaXRlUmVmKTsKLQkJCQkJCQkJCWludCBpbmRleCA9IGxpc3QuaW5kZXhPZihvYmplY3QpOwotCQkJCQkJCQkJY29tcG91bmRDb21tYW5kLmFwcGVuZChuZXcgU2V0Q29tbWFuZChudWxsLCBvdGhlckVuZCwgb3Bwb3NpdGVSZWYsIG5ld09iamVjdCwgaW5kZXgpKTsJCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQkJZmVhdHVyZUhhbmRsZWQgPSB0cnVlOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCWlmKCFmZWF0dXJlSGFuZGxlZCkgewotCQkJCQlPYmplY3QgdmFsdWUgPSBvYmplY3QuZUdldChmZWF0dXJlKTsKLQkJCQkJaWYgKGZlYXR1cmUgPT0gVW1hUGFja2FnZS5MaXRlcmFscy5OQU1FRF9FTEVNRU5UX19OQU1FKSB7Ci0JCQkJCQkvLyB2YWxpZGF0ZSBuYW1lCi0JCQkJCQlTdHJpbmcgbmV3TmFtZSA9IGNoZWNrTmFtZShvYmplY3QsIG5ld1R5cGUpOwotCQkJCQkJaWYgKG5ld05hbWUgIT0gbnVsbCkgewotCQkJCQkJCXZhbHVlID0gbmV3TmFtZTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlpZihzY2FubmVyICE9IG51bGwgJiYgdmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcgJiYgb2JqZWN0IGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJCQkJU3RyaW5nIHN0ciA9IChTdHJpbmcpIHZhbHVlOwotCQkJCQkJaWYoIVN0clV0aWwuaXNCbGFuayhzdHIpKSB7Ci0JCQkJCQkJY29tcG91bmRDb21tYW5kLnJlc291cmNlQ29weVRhc2tzLmFkZChuZXcgUmVzb3VyY2VDb3B5VGFzayhzY2FubmVyLCAoTWV0aG9kRWxlbWVudClvYmplY3QsIHN0ciwgIiIpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWNvbXBvdW5kQ29tbWFuZC5hcHBlbmQobmV3IFNldENvbW1hbmQobnVsbCwgbmV3T2JqZWN0LCBmZWF0dXJlLCB2YWx1ZSkpOwotCQkJCX0KLQkJCX0KLQkJfQotCQkJCQkJCi0JCXJldHVybiBuZXdPYmplY3Q7Ci0JfQotCi0JLyoqCi0JICogQ29udmVydHMgYW4gYWN0aXZpdHkgdG8gbmV3IHR5cGUuCi0JICogCi0JICogQHBhcmFtIG9sZEFjdGl2aXR5IEFjdGl2aXR5Ci0JICogQHBhcmFtIG5ld1R5cGUgRUNsYXNzCi0JICogQHJldHVybiBBY3Rpdml0eQotCSAqLwotCXB1YmxpYyBzdGF0aWMgQWN0aXZpdHkgY29udmVydEFjdGl2aXR5KEFjdGl2aXR5IG9sZEFjdGl2aXR5LCBFQ2xhc3MgbmV3VHlwZSkgewotCQkvLyBhY3Rpdml0eSBpcyBhbHJlYWR5IHRoaXMgdHlwZQotCQkvLwotCQlpZiAobmV3VHlwZSA9PSBvbGRBY3Rpdml0eS5lQ2xhc3MoKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJCi0JCUhhc2hTZXQ8UmVzb3VyY2U+IG1vZGlmaWVkUmVzb3VyY2VzID0gbmV3IEhhc2hTZXQ8UmVzb3VyY2U+KCk7Ci0JCUFjdGl2aXR5IG5ld0FjdGl2aXR5ID0gKEFjdGl2aXR5KSBUeXBlQ29udmVydGVyLmNvbnZlcnQob2xkQWN0aXZpdHksIG5ld1R5cGUsIG51bGwsIGFjdGl2aXR5RmVhdHVyZUNvbXBhcmF0b3IsIG1vZGlmaWVkUmVzb3VyY2VzKTsKLQotCQkvLyBtYWtlIG9sZEFjdGl2aXR5IGEgcHJveHkgc28gcmVmZXJlbmNlIHRvIGl0IGNhbiBiZSByZXNvbHZlZCB0byBuZXdBY3Rpdml0eQotCQkvLwotCQlVUkkgdXJpID0gUGVyc2lzdGVuY2VVdGlsLmdldFByb3h5VVJJKG5ld0FjdGl2aXR5KTsKLQkJKChJbnRlcm5hbEVPYmplY3Qpb2xkQWN0aXZpdHkpLmVTZXRQcm94eVVSSSh1cmkpOwotCQkJCQotCQkvLyBzYXZlIG1vZGlmaWVkIHJlc291cmNlcwotCQkvLwotCQlpZiAoIW1vZGlmaWVkUmVzb3VyY2VzLmlzRW1wdHkoKSkgewotCQkJSUxpYnJhcnlQZXJzaXN0ZXIuRmFpbFNhZmVNZXRob2RMaWJyYXJ5UGVyc2lzdGVyIHBlcnNpc3RlciA9IExpYnJhcnlTZXJ2aWNlVXRpbC5nZXRDdXJyZW50UGVyc2lzdGVyKCkuZ2V0RmFpbFNhZmVQZXJzaXN0ZXIoKTsKLQkJCXRyeSB7Ci0JCQkJZm9yIChSZXNvdXJjZSByZXMgOiBtb2RpZmllZFJlc291cmNlcykgewotCQkJCQlwZXJzaXN0ZXIuc2F2ZShyZXMpOwotCQkJCX0KLQkJCQlwZXJzaXN0ZXIuY29tbWl0KCk7Ci0KLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJTGlicmFyeVVJUGx1Z2luCi0JCQkJCQkuZ2V0RGVmYXVsdCgpCi0JCQkJCQkuZ2V0TXNnRGlhbG9nKCkKLQkJCQkJCS5kaXNwbGF5RXJyb3IoCi0JCQkJCQkJCUxpYnJhcnlSZXNvdXJjZXMuY29udmVydEFjdGl2aXR5RXJyb3JfdGl0bGUsCi0JCQkJCQkJCU5MUwotCQkJCQkJCQkJCS5iaW5kKAotCQkJCQkJCQkJCQkJTGlicmFyeVJlc291cmNlcy5zYXZlQ29udmVydGVkQWN0aXZpdHlFcnJvcl9tc2csCi0JCQkJCQkJCQkJCQluZXdBY3Rpdml0eS5nZXROYW1lKCkpLAotCQkJCQkJCQlMaWJyYXJ5UmVzb3VyY2VzLmVycm9yX3JlYXNvbiwgZSk7Ci0KLQkJCQlwZXJzaXN0ZXIucm9sbGJhY2soKTsKLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIG5ld0FjdGl2aXR5OwotCX0JCQotCQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSB0eXBlSUQgaW50Ci0JICogQHJldHVybiBFQ2xhc3MKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEVDbGFzcyBnZXRBY3Rpdml0eVR5cGUoaW50IHR5cGVJRCkgewotCQlzd2l0Y2ggKHR5cGVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFk6Ci0JCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5BQ1RJVklUWTsKLQkJY2FzZSBVbWFQYWNrYWdlLklURVJBVElPTjoKLQkJCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLklURVJBVElPTjsKLQkJY2FzZSBVbWFQYWNrYWdlLlBIQVNFOgotCQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuUEhBU0U7Ci0JCWRlZmF1bHQ6Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCQotCS8qKgotCSAqIEBwYXJhbSBvbGRHdWlkYW5jZQotCSAqIEBwYXJhbSBuZXdHdWlkYW5jZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgY2hlY2tOYW1lKEVPYmplY3Qgb2JqZWN0LCBFQ2xhc3MgbmV3VHlwZSkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBOYW1lZEVsZW1lbnQpIHsKLQkJCU5hbWVkRWxlbWVudCBlID0gKE5hbWVkRWxlbWVudClvYmplY3Q7Ci0JCQlmaW5hbCBJVmFsaWRhdG9yIHZhbGlkYXRvciA9IElWYWxpZGF0b3JGYWN0b3J5LklOU1RBTkNFLmNyZWF0ZU5hbWVWYWxpZGF0b3IoZS5lQ29udGFpbmVyKCksIGUsIG5ld1R5cGUpOwotCQkJU3RyaW5nIG1zZyA9IHZhbGlkYXRvci5pc1ZhbGlkKGUuZ2V0TmFtZSgpKTsKLQkJCWlmKG1zZyAhPSBudWxsKSB7Ci0JCQkJU3RyaW5nIGZlYXR1cmVUeHQgPSBUbmdVdGlsLmdldEZlYXR1cmVUZXh0KFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkuZ2V0TmFtZWRFbGVtZW50X05hbWUoKSk7Ci0JCQkJU3RyaW5nIHRpdGxlID0gTGlicmFyeUVkaXRSZXNvdXJjZXMucmVzb2x2ZU5hbWVDb25mbGljdERpYWxvZ190aXRsZTsgCi0JCQkJU3RyaW5nIGRsZ01zZyA9IE5MUy5iaW5kKAotCQkJCQkJTGlicmFyeUVkaXRSZXNvdXJjZXMucmVzb2x2ZU5hbWVDb25mbGljdERpYWxvZ190ZXh0LAotCQkJCQkJU3RyVXRpbC50b0xvd2VyKGZlYXR1cmVUeHQpLCBlLmdldE5hbWUoKSk7Ci0JCQkJU3RyaW5nIGN1cnJlbnRWYWx1ZSA9IChTdHJpbmcpIGUuZUdldChVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJLmdldE5hbWVkRWxlbWVudF9OYW1lKCkpOwotCQotCQkJCUlJbnB1dFZhbGlkYXRvciBpbnB1dFZhbGlkYXRvciA9IG5ldyBJSW5wdXRWYWxpZGF0b3IoKSB7Ci0JCQkJCXB1YmxpYyBTdHJpbmcgaXNWYWxpZChTdHJpbmcgbmV3VGV4dCkgewotCQkJCQkJcmV0dXJuIHZhbGlkYXRvci5pc1ZhbGlkKG5ld1RleHQpOwotCQkJCQl9Ci0JCQkJfTsKLQkKLQkJCQlJbnB1dERpYWxvZyBpbnB1dERsZyA9IG5ldyBJbnB1dERpYWxvZygKLQkJCQkJCU1zZ0JveC5nZXREZWZhdWx0U2hlbGwoKSwgdGl0bGUsIGRsZ01zZywgY3VycmVudFZhbHVlLAotCQkJCQkJaW5wdXRWYWxpZGF0b3IpOwotCQkJCWlmIChpbnB1dERsZy5vcGVuKCkgPT0gV2luZG93LkNBTkNFTCkgewotCQkJCQl0aHJvdyBuZXcgT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24oKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIGlucHV0RGxnLmdldFZhbHVlKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL3ZpZXdzL1Byb2Nlc3NUcmVlQ29udGVudFByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvdmlld3MvUHJvY2Vzc1RyZWVDb250ZW50UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTFhNzJlMS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvdmlld3MvUHJvY2Vzc1RyZWVDb250ZW50UHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS52aWV3czsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5FeHRlbmRlZEltYWdlUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2VVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuTGlicmFyeVVJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ2FwYWJpbGl0eVBhdHRlcm47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyeVByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUcmVlQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotCi0vKioKLSAqIFRoZSBjb250ZW50IHByb3ZpZGVyIGZvciBhIHByb2Nlc3MgdHJlZS4KLSAqIDxwPgotICogRGlzcGxheXMgdGhlIHRyZWUgaW4gdGhlIGZvbGxvd2luZyBoaWVyYXJjaHk6Ci0gKiA8dWw+Ci0gKiA8bGk+bWV0aG9kX3BsdWdpbl8xPC9saT4KLSAqIDx1bD4KLSAqIDxsaT4iQ2FwYWJpbGl0eSBQYXR0ZXJucyIgVUkgZm9sZGVyPC9saT4KLSAqIDx1bD4KLSAqIDxsaT5jYXBhYmlsaXR5X3BhdHRlcm5fMTwvbGk+Ci0gKiA8bGk+Y2FwYWJpbGl0eV9wYXR0ZXJuXzI8L2xpPgotICogPC91bD4KLSAqIDwvbGk+Ci0gKiA8bGk+IkRlbGl2ZXJ5IFByb2Nlc3NlcyIgVUkgZm9sZGVyPC9saT4KLSAqIDx1bD4KLSAqIDxsaT5kZWxpdmVyeV9wcm9jZXNzXzE8L2xpPgotICogPGxpPmRlbGl2ZXJ5X3Byb2Nlc3NfMjwvbGk+Ci0gKiA8L3VsPgotICogPC9saT4KLSAqIDwvdWw+Ci0gKiA8L2xpPgotICogPGxpPm1ldGhvZF9wbHVnaW5fMjwvbGk+Ci0gKiA8dWw+Ci0gKiA8bGk+IkNhcGFiaWxpdHkgUGF0dGVybnMiIFVJIGZvbGRlcjwvbGk+Ci0gKiA8L2xpPgotICogPGxpPiJEZWxpdmVyeSBQcm9jZXNzZXMiIFVJIGZvbGRlcjwvbGk+Ci0gKiA8L2xpPgotICogPC91bD4KLSAqIDwvbGk+Ci0gKiA8L3VsPgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjIKLSAqLwotcHVibGljIGNsYXNzIFByb2Nlc3NUcmVlQ29udGVudFByb3ZpZGVyIGltcGxlbWVudHMgSVRyZWVDb250ZW50UHJvdmlkZXIgewotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0FQQUJJTElUWV9QQVRURVJOUyA9IExpYnJhcnlVSVJlc291cmNlcy5jYXBhYmlsaXR5UGF0dGVybl90ZXh0X3BsdXJhbDsKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIERFTElWRVJZX1BST0NFU1NFUyA9IExpYnJhcnlVSVJlc291cmNlcy5kZWxpdmVyeVByb2Nlc3NfdGV4dF9wbHVyYWw7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIE9iamVjdFtdIEVNUFRZX0xJU1QgPSBuZXcgT2JqZWN0WzBdOwotCi0JcHJvdGVjdGVkIE1hcDxNZXRob2RQbHVnaW4sIFByb2Nlc3NUcmVlVUlGb2xkZXI+IGNhcGFiaWxpdHlQYXR0ZXJuVUlGb2xkZXJzID0gbmV3IEhhc2hNYXA8TWV0aG9kUGx1Z2luLCBQcm9jZXNzVHJlZVVJRm9sZGVyPigpOwotCi0JcHJvdGVjdGVkIE1hcDxNZXRob2RQbHVnaW4sIFByb2Nlc3NUcmVlVUlGb2xkZXI+IGRlbGl2ZXJ5UHJvY2Vzc1VJRm9sZGVycyA9IG5ldyBIYXNoTWFwPE1ldGhvZFBsdWdpbiwgUHJvY2Vzc1RyZWVVSUZvbGRlcj4oKTsKLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVHJlZUNvbnRlbnRQcm92aWRlciNnZXRDaGlsZHJlbihPYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdFtdIGdldENoaWxkcmVuKE9iamVjdCBwYXJlbnRFbGVtZW50KSB7Ci0JCWlmIChwYXJlbnRFbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kTGlicmFyeSkgewotCQkJTGlzdDxPYmplY3Q+IGNoaWxkcmVuID0gbmV3IEFycmF5TGlzdDxPYmplY3Q+KCk7Ci0JCQlMaXN0PE1ldGhvZFBsdWdpbj4gcGx1Z2lucyA9ICgoTWV0aG9kTGlicmFyeSkgcGFyZW50RWxlbWVudCkKLQkJCQkJLmdldE1ldGhvZFBsdWdpbnMoKTsKLQkJCWZvciAoSXRlcmF0b3I8TWV0aG9kUGx1Z2luPiBpdCA9IHBsdWdpbnMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSBpdC5uZXh0KCk7Ci0JCQkJTGlzdDxQcm9jZXNzPiBwcm9jZXNzZXMgPSBUbmdVdGlsLmdldEFsbFByb2Nlc3NlcyhwbHVnaW4pOwotCQkJCWlmIChwcm9jZXNzZXMuc2l6ZSgpID4gMCkgewotCQkJCQljaGlsZHJlbi5hZGQocGx1Z2luKTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gY2hpbGRyZW4udG9BcnJheSgpOwotCQl9IGVsc2UgaWYgKHBhcmVudEVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pIHsKLQkJCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSAoTWV0aG9kUGx1Z2luKSBwYXJlbnRFbGVtZW50OwotCi0JCQlQcm9jZXNzVHJlZVVJRm9sZGVyIGNhcGFiaWxpdHlQYXR0ZXJuVUlGb2xkZXIgPSBjYXBhYmlsaXR5UGF0dGVyblVJRm9sZGVycwotCQkJCQkuZ2V0KHBsdWdpbik7Ci0JCQlpZiAoY2FwYWJpbGl0eVBhdHRlcm5VSUZvbGRlciA9PSBudWxsKSB7Ci0JCQkJY2FwYWJpbGl0eVBhdHRlcm5VSUZvbGRlciA9IG5ldyBQcm9jZXNzVHJlZVVJRm9sZGVyKAotCQkJCQkJQ0FQQUJJTElUWV9QQVRURVJOUywKLQkJCQkJCUV4dGVuZGVkSW1hZ2VSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldEltYWdlKExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCQkJCS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9DYXBhYmlsaXR5UGF0dGVybnMiKSksIHBhcmVudEVsZW1lbnQpOyAvLyROT04tTkxTLTEkCi0JCQkJY2FwYWJpbGl0eVBhdHRlcm5VSUZvbGRlcnMucHV0KHBsdWdpbiwKLQkJCQkJCWNhcGFiaWxpdHlQYXR0ZXJuVUlGb2xkZXIpOwotCQkJfQotCi0JCQlQcm9jZXNzVHJlZVVJRm9sZGVyIGRlbGl2ZXJ5UHJvY2Vzc1VJRm9sZGVyID0gZGVsaXZlcnlQcm9jZXNzVUlGb2xkZXJzCi0JCQkJCS5nZXQocGx1Z2luKTsKLQkJCWlmIChkZWxpdmVyeVByb2Nlc3NVSUZvbGRlciA9PSBudWxsKSB7Ci0JCQkJZGVsaXZlcnlQcm9jZXNzVUlGb2xkZXIgPSBuZXcgUHJvY2Vzc1RyZWVVSUZvbGRlcigKLQkJCQkJCURFTElWRVJZX1BST0NFU1NFUywKLQkJCQkJCUV4dGVuZGVkSW1hZ2VSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldEltYWdlKExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCQkJCS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9EZWxpdmVyeVByb2Nlc3NlcyIpKSwgcGFyZW50RWxlbWVudCk7IC8vJE5PTi1OTFMtMSQKLQkJCQlkZWxpdmVyeVByb2Nlc3NVSUZvbGRlcnMucHV0KHBsdWdpbiwgZGVsaXZlcnlQcm9jZXNzVUlGb2xkZXIpOwotCQkJfQotCi0JCQlyZXR1cm4gbmV3IE9iamVjdFtdIHsgY2FwYWJpbGl0eVBhdHRlcm5VSUZvbGRlciwKLQkJCQkJZGVsaXZlcnlQcm9jZXNzVUlGb2xkZXIgfTsKLQkJfSBlbHNlIGlmIChwYXJlbnRFbGVtZW50IGluc3RhbmNlb2YgUHJvY2Vzc1RyZWVVSUZvbGRlcikgewotCQkJUHJvY2Vzc1RyZWVVSUZvbGRlciB1aUZvbGRlciA9IChQcm9jZXNzVHJlZVVJRm9sZGVyKSBwYXJlbnRFbGVtZW50OwotCQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IChNZXRob2RQbHVnaW4pIHVpRm9sZGVyLmdldFBhcmVudCgpOwotCQkJaWYgKHVpRm9sZGVyLmdldE5hbWUoKSA9PSBDQVBBQklMSVRZX1BBVFRFUk5TKSB7Ci0JCQkJcmV0dXJuIExpYnJhcnlTZXJ2aWNlVXRpbC5nZXRDYXBhYmlsaXR5UGF0dGVybnMocGx1Z2luKQotCQkJCQkJLnRvQXJyYXkoKTsKLQkJCX0gZWxzZSB7Ci0JCQkJcmV0dXJuIExpYnJhcnlTZXJ2aWNlVXRpbC5nZXREZWxpdmVyeVByb2Nlc3NlcyhwbHVnaW4pCi0JCQkJCQkudG9BcnJheSgpOwotCQkJfQotCQl9Ci0JCXJldHVybiBFTVBUWV9MSVNUOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVHJlZUNvbnRlbnRQcm92aWRlciNnZXRQYXJlbnQoT2JqZWN0KQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBlbGVtZW50KSB7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgUHJvY2Vzc1RyZWVVSUZvbGRlcikgewotCQkJcmV0dXJuICgoUHJvY2Vzc1RyZWVVSUZvbGRlcikgZWxlbWVudCkuZ2V0UGFyZW50KCk7Ci0JCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIENhcGFiaWxpdHlQYXR0ZXJuKSB7Ci0JCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gVW1hVXRpbAotCQkJCQkuZ2V0TWV0aG9kUGx1Z2luKChDYXBhYmlsaXR5UGF0dGVybikgZWxlbWVudCk7Ci0JCQlyZXR1cm4gY2FwYWJpbGl0eVBhdHRlcm5VSUZvbGRlcnMuZ2V0KHBsdWdpbik7Ci0JCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIERlbGl2ZXJ5UHJvY2VzcykgewotCQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IFVtYVV0aWwKLQkJCQkJLmdldE1ldGhvZFBsdWdpbigoRGVsaXZlcnlQcm9jZXNzKSBlbGVtZW50KTsKLQkJCXJldHVybiBkZWxpdmVyeVByb2Nlc3NVSUZvbGRlcnMuZ2V0KHBsdWdpbik7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUcmVlQ29udGVudFByb3ZpZGVyI2hhc0NoaWxkcmVuKE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbihPYmplY3QgZWxlbWVudCkgewotCQlyZXR1cm4gZ2V0Q2hpbGRyZW4oZWxlbWVudCkubGVuZ3RoID4gMDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIjZ2V0RWxlbWVudHMoT2JqZWN0KQotCSAqLwotCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgaW5wdXRFbGVtZW50KSB7Ci0JCXJldHVybiBnZXRDaGlsZHJlbihpbnB1dEVsZW1lbnQpOwotCX0KLQotCXB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkgewotCQljYXBhYmlsaXR5UGF0dGVyblVJRm9sZGVycy5jbGVhcigpOwotCQlkZWxpdmVyeVByb2Nlc3NVSUZvbGRlcnMuY2xlYXIoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS92aWV3cy9Qcm9jZXNzVHJlZUxhYmVsUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS92aWV3cy9Qcm9jZXNzVHJlZUxhYmVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGVhMTY1YS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvdmlld3MvUHJvY2Vzc1RyZWVMYWJlbFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS52aWV3czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5VbWFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0KLS8qKgotICogVGhlIGxhYmVsIHByb3ZpZGVyIGZvciB0aGUgcHJvY2VzcyB0cmVlIHZpZXdlci4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4yCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9jZXNzVHJlZUxhYmVsUHJvdmlkZXIgZXh0ZW5kcyBMYWJlbFByb3ZpZGVyIHsKLQotCXByaXZhdGUgc3RhdGljIElMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIgPSBuZXcgQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyKAotCQkJbmV3IFVtYUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkpOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgUHJvY2Vzc1RyZWVMYWJlbFByb3ZpZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgTGFiZWxQcm92aWRlciNnZXRUZXh0KE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iaikgewotCQlpZiAob2JqIGluc3RhbmNlb2YgUHJvY2Vzc1RyZWVVSUZvbGRlcikgewotCQkJcmV0dXJuICgoUHJvY2Vzc1RyZWVVSUZvbGRlcikgb2JqKS5nZXROYW1lKCk7Ci0JCX0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJcmV0dXJuICgoTWV0aG9kRWxlbWVudCkgb2JqKS5nZXROYW1lKCk7Ci0JCX0KLQkJcmV0dXJuIGxhYmVsUHJvdmlkZXIuZ2V0VGV4dChvYmopOwotCX0KLQotCS8qKgotCSAqIEBzZWUgTGFiZWxQcm92aWRlciNnZXRJbWFnZShPYmplY3QpCi0JICovCi0JcHVibGljIEltYWdlIGdldEltYWdlKE9iamVjdCBvYmopIHsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIFByb2Nlc3NUcmVlVUlGb2xkZXIpIHsKLQkJCXJldHVybiAoKFByb2Nlc3NUcmVlVUlGb2xkZXIpIG9iaikuZ2V0SW1hZ2UoKTsKLQkJfQotCQlyZXR1cm4gbGFiZWxQcm92aWRlci5nZXRJbWFnZShvYmopOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL3ZpZXdzL1Byb2Nlc3NUcmVlVUlGb2xkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS92aWV3cy9Qcm9jZXNzVHJlZVVJRm9sZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkOTJlNGMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL3ZpZXdzL1Byb2Nlc3NUcmVlVUlGb2xkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExOSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS52aWV3czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkV4dGVuZGVkSW1hZ2VSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotLyoqCi0gKiBNb2RlbHMgYSBVSSBmb2xkZXIgaW4gdGhlIHByb2Nlc3MgdHJlZSB2aWV3ZXIuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMgotICovCi1wdWJsaWMgY2xhc3MgUHJvY2Vzc1RyZWVVSUZvbGRlciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBJbWFnZSBERUZBVUxUX0lNQUdFID0gRXh0ZW5kZWRJbWFnZVJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0SW1hZ2UoIAotCQlMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9Gb2xkZXIiKSk7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgU3RyaW5nIG5hbWU7Ci0KLQlwcml2YXRlIEltYWdlIGltYWdlOwotCi0JcHJpdmF0ZSBPYmplY3QgcGFyZW50OwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gbmFtZQotCSAqICAgICAgICAgICAgYSBuYW1lIGZvciB0aGUgZm9sZGVyCi0JICovCi0JcHVibGljIFByb2Nlc3NUcmVlVUlGb2xkZXIoU3RyaW5nIG5hbWUpIHsKLQkJdGhpcyhuYW1lLCBERUZBVUxUX0lNQUdFLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqIAotCSAqIEBwYXJhbSBuYW1lCi0JICogICAgICAgICAgICBhIG5hbWUgZm9yIHRoZSBmb2xkZXIKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IG9iamVjdAotCSAqLwotCXB1YmxpYyBQcm9jZXNzVHJlZVVJRm9sZGVyKFN0cmluZyBuYW1lLCBPYmplY3QgcGFyZW50KSB7Ci0JCXRoaXMobmFtZSwgREVGQVVMVF9JTUFHRSwgcGFyZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqIAotCSAqIEBwYXJhbSBuYW1lCi0JICogICAgICAgICAgICBhIG5hbWUgZm9yIHRoZSBmb2xkZXIKLQkgKiBAcGFyYW0gaW1hZ2UKLQkgKiAgICAgICAgICAgIGFuIGltYWdlIGZvciB0aGUgZm9sZGVyCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBvYmplY3QKLQkgKi8KLQlwdWJsaWMgUHJvY2Vzc1RyZWVVSUZvbGRlcihTdHJpbmcgbmFtZSwgSW1hZ2UgaW1hZ2UsIE9iamVjdCBwYXJlbnQpIHsKLQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJdGhpcy5pbWFnZSA9IGltYWdlOwotCQl0aGlzLnBhcmVudCA9IHBhcmVudDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBuYW1lLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGZvbGRlciBuYW1lCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBpbWFnZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBpbWFnZSBmb3IgYSBVSSBmb2xkZXIKLQkgKi8KLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoKSB7Ci0JCXJldHVybiBpbWFnZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwYXJlbnQgb2JqZWN0LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHBhcmVudCBvYmplY3QgZm9yIHRoZSBmb2xkZXIKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudCgpIHsKLQkJcmV0dXJuIHBhcmVudDsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBwYXJlbnQgb2JqZWN0LgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgb2JqZWN0Ci0JICogQHJldHVybiB0aGUgZ2l2ZW4gcGFyZW50IG9iamVjdAotCSAqLwotCXB1YmxpYyBPYmplY3Qgc2V0UGFyZW50KE9iamVjdCBwYXJlbnQpIHsKLQkJcmV0dXJuIHRoaXMucGFyZW50ID0gcGFyZW50OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIG9iamVjdC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBmb2xkZXIgbmFtZQotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBuYW1lOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL3ZpZXdzL1Byb2Nlc3NUcmVlVmlld2VyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvdmlld3MvUHJvY2Vzc1RyZWVWaWV3ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmJhMDIzNS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvdmlld3MvUHJvY2Vzc1RyZWVWaWV3ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLnZpZXdzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIERpc3BsYXlzIGEgdHJlZSB2aWV3IHRoYXQgYWxsb3dzIGEgdXNlciB0byBzZWxlY3QgYSBjYXBhYmlsaXR5IHBhdHRlcm4gb3IKLSAqIGRlbGl2ZXJ5IHByb2Nlc3MuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMgotICovCi1wdWJsaWMgY2xhc3MgUHJvY2Vzc1RyZWVWaWV3ZXIgZXh0ZW5kcyBUcmVlVmlld2VyIHsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBjb21wb3NpdGUKLQkgKi8KLQlwdWJsaWMgUHJvY2Vzc1RyZWVWaWV3ZXIoQ29tcG9zaXRlIHBhcmVudCkgewotCQlzdXBlcihwYXJlbnQsIFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCB8IFNXVC5CT1JERVIpOwotCQlzZXRDb250ZW50UHJvdmlkZXIobmV3IFByb2Nlc3NUcmVlQ29udGVudFByb3ZpZGVyKCkpOwotCQlzZXRMYWJlbFByb3ZpZGVyKG5ldyBQcm9jZXNzVHJlZUxhYmVsUHJvdmlkZXIoKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvdmlld3MvUHJvY2Vzc1ZpZXcuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS92aWV3cy9Qcm9jZXNzVmlldy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOTU0NjJmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS92aWV3cy9Qcm9jZXNzVmlldy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLnZpZXdzOwotCi1wdWJsaWMgY2xhc3MgUHJvY2Vzc1ZpZXcgewotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvd2l6YXJkcy9EaXJlY3RvcnlWYWxpZGF0b3IuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS93aXphcmRzL0RpcmVjdG9yeVZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MjZjY2FlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS93aXphcmRzL0RpcmVjdG9yeVZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLndpemFyZHM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLkZpbGVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLkxpYnJhcnlVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5MaWJyYXJ5VUlSZXNvdXJjZXM7Ci0KLS8qKgotICogVXRpbGl0eSBjbGFzcyBmb3IgdmFsaWRhdGluZyBhbmQgY3JlYXRpbmcgYSBkaXJlY3RvcnkuCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNjIxNTMKLSAqIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNzc1MDAKLSAqIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xODIwNTYKLSAqLwotcHVibGljIGNsYXNzIERpcmVjdG9yeVZhbGlkYXRvciB7Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZXMgYW5kIGNyZWF0ZXMgYSBnaXZlbiBkaXJlY3RvcnkuCi0JICogPHA+Ci0JICogRGlzcGxheXMgYW4gZXJyb3IgZGlhbG9nIGlmIHRoZSBkaXJlY3RvcnkgcGF0aCBpcyBub3QgdmFsaWQuCi0JICogCi0JICogQHBhcmFtIGRpcgotCSAqICAgICAgICAgICAgVGhlIHBhdGggdG8gYmUgdmFsaWRhdGVkIGFuZCBjcmVhdGVkLgotCSAqIEBwYXJhbSB0aXRsZQotCSAqICAgICAgICAgICAgVGhlIGRpYWxvZyB0aXRsZS4KLQkgKiBAcGFyYW0gZXJyb3JNc2cKLQkgKiAgICAgICAgICAgIFRoZSBlcnJvciBtZXNzYWdlIHRvIGJlIGRpc3BsYXllZCBpbiB0aGUgZXJyb3IgZGlhbG9nLgotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgcGF0aCBpcyB2YWxpZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY2hlY2tBbmRDcmVhdGVEaXIoU3RyaW5nIGRpciwgU3RyaW5nIHRpdGxlLAotCQkJU3RyaW5nIGVycm9yTXNnKSB7CQkKLQkJYm9vbGVhbiBhbnN3ZXIgPSBmYWxzZTsKLQkJRmlsZSBmaWxlID0gbmV3IEZpbGUoZGlyKTsKLQkJaWYgKGZpbGUuZXhpc3RzKCkpIHsKLQkJCUZpbGVbXSBmaWxlcyA9IGZpbGUubGlzdEZpbGVzKCk7Ci0JCQlpZiAoZmlsZXMgIT0gbnVsbCAmJiBmaWxlcy5sZW5ndGggPiAwKSB7Ci0JCQkJYW5zd2VyID0gTGlicmFyeVVJUGx1Z2luCi0JCQkJCQkuZ2V0RGVmYXVsdCgpCi0JCQkJCQkuZ2V0TXNnRGlhbG9nKCkKLQkJCQkJCS5kaXNwbGF5Q29uZmlybWF0aW9uKAotCQkJCQkJCQl0aXRsZSwKLQkJCQkJCQkJTGlicmFyeVVJUmVzb3VyY2VzCi0JCQkJCQkJCQkJLmJpbmQoCi0JCQkJCQkJCQkJCQlMaWJyYXJ5VUlSZXNvdXJjZXMuZGVsZXRlRmlsZXNDb25maXJtYXRpb25fbXNnLAotCQkJCQkJCQkJCQkJZGlyKSk7Ci0JCQkJaWYgKGFuc3dlciA9PSB0cnVlKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlhbnN3ZXIgPSBGaWxlVXRpbAotCQkJCQkJCQkuZGVsZXRlQWxsRmlsZXMoZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0JCQkJCQlpZiAoYW5zd2VyID09IGZhbHNlKSB7Ci0JCQkJCQkJTGlicmFyeVVJUGx1Z2luCi0JCQkJCQkJCQkuZ2V0RGVmYXVsdCgpCi0JCQkJCQkJCQkuZ2V0TXNnRGlhbG9nKCkKLQkJCQkJCQkJCS5kaXNwbGF5RXJyb3IoCi0JCQkJCQkJCQkJCXRpdGxlLAotCQkJCQkJCQkJCQllcnJvck1zZywKLQkJCQkJCQkJCQkJTGlicmFyeVVJUmVzb3VyY2VzCi0JCQkJCQkJCQkJCQkJLmJpbmQoCi0JCQkJCQkJCQkJCQkJCQlMaWJyYXJ5VUlSZXNvdXJjZXMuZGVsZXRlRmlsZXNFcnJvcl9yZWFzb24sCi0JCQkJCQkJCQkJCQkJCQlkaXIpKTsKLQkJCQkJCX0KLQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCUxpYnJhcnlVSVBsdWdpbgotCQkJCQkJCQkuZ2V0RGVmYXVsdCgpCi0JCQkJCQkJCS5nZXRNc2dEaWFsb2coKQotCQkJCQkJCQkuZGlzcGxheUVycm9yKAotCQkJCQkJCQkJCXRpdGxlLAotCQkJCQkJCQkJCWVycm9yTXNnLAotCQkJCQkJCQkJCUxpYnJhcnlVSVJlc291cmNlcwotCQkJCQkJCQkJCQkJLmJpbmQoCi0JCQkJCQkJCQkJCQkJCUxpYnJhcnlVSVJlc291cmNlcy5kZWxldGVGaWxlc0Vycm9yX3JlYXNvbiwKLQkJCQkJCQkJCQkJCQkJZGlyKSwgZSk7Ci0JCQkJCQlhbnN3ZXIgPSBmYWxzZTsKLQkJCQkJfQotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJYW5zd2VyID0gdHJ1ZTsKLQkJCX0KLQkJfSBlbHNlIHsKLS8vCQkJaWYgKCFmaWxlLmlzQWJzb2x1dGUoKSkgewotLy8JCQkJTGlicmFyeVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKS5kaXNwbGF5RXJyb3IodGl0bGUsCi0vLwkJCQkJCUxpYnJhcnlVSVJlc291cmNlcy5pbnZhbGlkUGF0aF9tc2cpOwotLy8JCQkJYW5zd2VyID0gZmFsc2U7Ci0vLwkJCX0gZWxzZSB7Ci0KLQkJCQl0cnkgewotCQkJCQlpZiAoZmlsZS5ta2RpcnMoKSA9PSBmYWxzZSkgewotCQkJCQkJTGlicmFyeVVJUGx1Z2luCi0JCQkJCQkJCS5nZXREZWZhdWx0KCkKLQkJCQkJCQkJLmdldE1zZ0RpYWxvZygpCi0JCQkJCQkJCS5kaXNwbGF5RXJyb3IoCi0JCQkJCQkJCQkJdGl0bGUsCi0JCQkJCQkJCQkJZXJyb3JNc2csCi0JCQkJCQkJCQkJTGlicmFyeVVJUmVzb3VyY2VzCi0JCQkJCQkJCQkJCQkuYmluZCgKLQkJCQkJCQkJCQkJCQkJTGlicmFyeVVJUmVzb3VyY2VzLmNyZWF0ZVBhdGhFcnJvcl9yZWFzb24sCi0JCQkJCQkJCQkJCQkJCWRpcikpOwotCQkJCQkJYW5zd2VyID0gZmFsc2U7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlhbnN3ZXIgPSB0cnVlOwotCQkJCQl9Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJTGlicmFyeVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKS5kaXNwbGF5RXJyb3IoCi0JCQkJCQkJdGl0bGUsCi0JCQkJCQkJZXJyb3JNc2csCi0JCQkJCQkJTGlicmFyeVVJUmVzb3VyY2VzLmJpbmQoCi0JCQkJCQkJCQlMaWJyYXJ5VUlSZXNvdXJjZXMuY3JlYXRlUGF0aEVycm9yX3JlYXNvbiwKLQkJCQkJCQkJCWRpciksIGUpOwotCQkJCQlhbnN3ZXIgPSBmYWxzZTsKLQkJCQl9Ci0JCQl9Ci0vLwkJfQotCi0JCXJldHVybiBhbnN3ZXI7Ci0JfQotCQotCS8qKgotCSAqIFZhbGlkYXRlcyBhbmQgY3JlYXRlcyBhIGdpdmVuIGRpcmVjdG9yeS4KLQkgKiA8cD4KLQkgKiBEaXNwbGF5cyBhbiBlcnJvciBkaWFsb2cgaWYgdGhlIGRpcmVjdG9yeSBwYXRoIGlzIG5vdCB2YWxpZC4KLQkgKiAKLQkgKiBAcGFyYW0gZGlyCi0JICogICAgICAgICAgICBUaGUgcGF0aCB0byBiZSB2YWxpZGF0ZWQgYW5kIGNyZWF0ZWQuCi0JICogQHBhcmFtIHRpdGxlCi0JICogICAgICAgICAgICBUaGUgZGlhbG9nIHRpdGxlLgotCSAqIEBwYXJhbSBlcnJvck1zZwotCSAqICAgICAgICAgICAgVGhlIGVycm9yIG1lc3NhZ2UgdG8gYmUgZGlzcGxheWVkIGluIHRoZSBlcnJvciBkaWFsb2cuCi0JICogQHBhcmFtIGFsbG93Q3VycmVudExpYlBhdGgKLQkgKiAJCQkgIEFsbG93IHBhdGhzIGNvbnRhaW5pbmcgY3VycmVudCBsaWJyYXJ5IG9yIG5vdAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgcGF0aCBpcyB2YWxpZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY2hlY2tBbmRDcmVhdGVEaXIoU3RyaW5nIGRpciwgU3RyaW5nIHRpdGxlLAotCQkJU3RyaW5nIGVycm9yTXNnLCBib29sZWFuIGFsbG93Q3VycmVudExpYlBhdGgpIHsKLQkJaWYoIWFsbG93Q3VycmVudExpYlBhdGgpewotCQkJU3RyaW5nIGN1cnJlbnRMaWJQYXRoID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeUxvY2F0aW9uKCk7Ci0JCQlpZiAoY3VycmVudExpYlBhdGggIT0gbnVsbCkgewotCQkJCVN0cmluZyB0YXJnZXRQYXRoRmlsZVN0ciA9IG5ldyBGaWxlKGRpcikuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0JCQkJU3RyaW5nIGxpYlBhdGhGaWxlU3RyID0gbmV3IEZpbGUoY3VycmVudExpYlBhdGgpLmdldEFic29sdXRlUGF0aCgpOwotCQkJCWlmIChsaWJQYXRoRmlsZVN0ci5lcXVhbHModGFyZ2V0UGF0aEZpbGVTdHIpKSB7Ci0vLwkJCQlpZihkaXIuc3RhcnRzV2l0aChjdXJyZW50TGliUGF0aCkgfHwgY3VycmVudExpYlBhdGguc3RhcnRzV2l0aChkaXIpKXsKLQkJCQkJTGlicmFyeVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKS4KLQkJCQkJZGlzcGxheUVycm9yKHRpdGxlLCBMaWJyYXJ5VUlSZXNvdXJjZXMub3ZlcnJpZGVDdXJyZW50TGlicmFyeUVycm9yX21zZzApOwotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBjaGVja0FuZENyZWF0ZURpcihkaXIsIHRpdGxlLCBlcnJvck1zZyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL3dpemFyZHMvTGlicmFyeUJhY2t1cFV0aWwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS93aXphcmRzL0xpYnJhcnlCYWNrdXBVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzZmUwZmMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL3dpemFyZHMvTGlicmFyeUJhY2t1cFV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS53aXphcmRzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpLnV0aWwuTXNnQm94OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LklMaWJyYXJ5U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnVpLlVzZXJJbnRlcmFjdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuTGF5b3V0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnNlcnZpY2VzLlNhZmVVcGRhdGVDb250cm9sbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLkxpYnJhcnlVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5MaWJyYXJ5VUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuZGlhbG9ncy5MaWJyYXJ5QmFja3VwRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLlByb2dyZXNzTW9uaXRvckRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uSVJ1bm5hYmxlV2l0aFByb2dyZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotCi0vKioKLSAqIFV0aWxpdHkgY2xhc3MgdG8gYmFjayB1cCBsaWJyYXJ5LgotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQGF1dGhvciBXZWlwaW5nIEx1Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBMaWJyYXJ5QmFja3VwVXRpbCB7Ci0KLQlwcml2YXRlIFN0cmluZyBwYXRoID0gbnVsbDsKLQotCS8qKgotCSAqIFByb21wdHMgdG8gYmFja3VwIHRoZSBjdXJyZW50IGxpYnJhcnkKLQkgKiAKLQkgKiBAcGFyYW0gc2hlbGwKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcHJvbXB0QmFja3VwQ3VycmVudExpYnJhcnkoU2hlbGwgc2hlbGwsIElMaWJyYXJ5U2VydmljZSBzZXJ2aWNlKSB7Ci0JCU1ldGhvZExpYnJhcnkgbGliID0gc2VydmljZS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpOwotCQlpZiAobGliICE9IG51bGwgJiYgbGliLmdldE1ldGhvZFBsdWdpbnMoKS5pc0VtcHR5KCkgJiYKLQkJCQlsaWIuZ2V0UHJlZGVmaW5lZENvbmZpZ3VyYXRpb25zKCkuaXNFbXB0eSgpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCQkKLQkJU3RyaW5nIGxpYlBhdGhTdHIgPSBzZXJ2aWNlLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5TG9jYXRpb24oKTsKLQkJRmlsZSBsaWJQYXRoID0gbmV3IEZpbGUobGliUGF0aFN0cik7Ci0JCW5ldyBMaWJyYXJ5QmFja3VwVXRpbCgpLmRvQmFja3VwKHNoZWxsLCBsaWJQYXRoLCBzZXJ2aWNlKTsKLQl9Ci0JCi0JLyoqCi0JICogUHJvbXB0cyB0byBiYWNrdXAgbGlicmFyeQotCSAqIAotCSAqIEBwYXJhbSBzaGVsbAotCSAqIEBwYXJhbSBsaWJQYXRoCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHByb21wdEJhY2t1cExpYnJhcnkoU2hlbGwgc2hlbGwsIEZpbGUgbGliUGF0aCkgewotCQluZXcgTGlicmFyeUJhY2t1cFV0aWwoKS5kb0JhY2t1cChzaGVsbCwgbGliUGF0aCwgbnVsbCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGRvQmFja3VwKGZpbmFsIFNoZWxsIHNoZWxsLCBmaW5hbCBGaWxlIGxpYlBhdGgsIElMaWJyYXJ5U2VydmljZSBzZXJ2aWNlKSB7Ci0JCXBhdGggPSBudWxsOwotCQlmaW5hbCBJTGlicmFyeVNlcnZpY2UgZnNlcnZpY2UgPSBzZXJ2aWNlOwotCQkKLQkJU2FmZVVwZGF0ZUNvbnRyb2xsZXIuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCVNoZWxsIHMgPSBzaGVsbDsKLQkJCQlpZiAocyA9PSBudWxsKSB7Ci0JCQkJCXMgPSBNc2dCb3guZ2V0RGVmYXVsdFNoZWxsKCk7Ci0JCQkJfQotCi0JCQkJaWYgKHMgPT0gbnVsbCkgewotCQkJCQlzID0gbmV3IFNoZWxsKE1zZ0JveC5nZXREaXNwbGF5KCkpOwotCQkJCX0KLQotCQkJCVN0cmluZyB0aXRsZSA9IExpYnJhcnlVSVJlc291cmNlcy5iYWNrdXBMaWJyYXJ5RGlhbG9nX3RpdGxlOwotCQkJCVN0cmluZyBtZXNzYWdlID0gTGlicmFyeVVJUmVzb3VyY2VzLmJhY2t1cExpYnJhcnlEaWFsb2dfdGV4dDsKLQkJCQlTdHJpbmcgYmFja3VwUGF0aCA9IGxpYlBhdGguZ2V0QWJzb2x1dGVQYXRoKCkgKyAiLmJhY2t1cCI7IC8vJE5PTi1OTFMtMSQJCi0KLQkJCQlMaWJyYXJ5QmFja3VwRGlhbG9nIGRsZyA9IG5ldyBMaWJyYXJ5QmFja3VwRGlhbG9nKHMsIHRpdGxlLAotCQkJCQkJbWVzc2FnZSwgYmFja3VwUGF0aCk7Ci0KLQkJCQlpZiAoZGxnLm9wZW4oKSA9PSBEaWFsb2cuT0spIHsKLQkJCQkJcGF0aCA9IGRsZy5nZXRQYXRoKCk7Ci0JCQkJfQotCQkJCQotCQkJCVByb2dyZXNzTW9uaXRvckRpYWxvZyBwbURpYWxvZyA9IG5ldyBQcm9ncmVzc01vbml0b3JEaWFsb2cocyk7Ci0JCQkJSVJ1bm5hYmxlV2l0aFByb2dyZXNzIG9wID0gbmV3IElSdW5uYWJsZVdpdGhQcm9ncmVzcygpIHsKLQkJCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLQkJCQkJCQl0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB7Ci0JCQkJCQltb25pdG9yLmJlZ2luVGFzaygKLQkJCQkJCQkJTGlicmFyeVVJUmVzb3VyY2VzLmJhY2tpbmdVcExpYnJhcnlUYXNrX25hbWUsCi0JCQkJCQkJCUlQcm9ncmVzc01vbml0b3IuVU5LTk9XTik7Ci0JCQkJCQlpZiAocGF0aCAhPSBudWxsKSB7Ci0JCQkJCQkJaWYgKGZzZXJ2aWNlID09IG51bGwpIHsKLQkJCQkJCQkJYmFja3VwKGxpYlBhdGgsIG5ldyBGaWxlKHBhdGgpKTsKLQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQlmc2VydmljZS5nZXRDdXJyZW50TGlicmFyeU1hbmFnZXIoKS5iYWNrdXBNZXRob2RMaWJyYXJ5KHBhdGgpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX07Ci0JCQkJCi0JCQkJdHJ5IHsKLQkJCQkJcG1EaWFsb2cucnVuKHRydWUsIGZhbHNlLCBvcCk7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpewotCQkJCQlMaWJyYXJ5VUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQl9Ci0KLQkvKioKLQkgKiBCYWNrIHVwIGxpYnJhcnkgCi0JICogCi0JICogQHBhcmFtIHNvdXJjZQotCSAqIEBwYXJhbSBkZXN0Ci0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGJhY2t1cChmaW5hbCBGaWxlIHNvdXJjZSwgZmluYWwgRmlsZSBkZXN0KSB7Ci0JCVJ1bm5hYmxlIHJ1bm5hYmxlID0gbmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCXRyeSB7Ci0JCQkJCS8vIGV4Y3VkZSB0aGUgbm9uLWxpYnJhcnkgZmlsZXMgdGhhdCBtaWdodCBiZSBsb2NrZWQgYnkgcm1jLgotCQkJCQkvLyB0aGVzZSBmaWxlcyBtYXkgY2F1c2UgYmFja3VwIHRvIGZhaWwgZHVlIHRvIGZpbGUgbG9jay4KLQkJCQkJU3RyaW5nIGV4Y2x1ZGVzID0gIi5sb2NrIjsgLy8kTk9OLU5MUy0xJAotCQkJCQlMYXlvdXRSZXNvdXJjZXMuY29weURpcihzb3VyY2UsIGRlc3QsICIqKiIsIGV4Y2x1ZGVzKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkJCQlMaWJyYXJ5VUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQotCQlVc2VySW50ZXJhY3Rpb25IZWxwZXIucnVuV2l0aFByb2dyZXNzKHJ1bm5hYmxlLAotCQkJCUxpYnJhcnlVSVJlc291cmNlcy5iYWNraW5nVXBMaWJyYXJ5VGFza19uYW1lKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS93aXphcmRzL05ld0xpYnJhcnlXaXphcmRQYWdlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvd2l6YXJkcy9OZXdMaWJyYXJ5V2l6YXJkUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYWEwNjA0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS93aXphcmRzL05ld0xpYnJhcnlXaXphcmRQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS53aXphcmRzOwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51aS53aXphcmRzLkJhc2VXaXphcmRQYWdlOwotCi0vKioKLSAqIFRoZSBhYnN0cmFjdCBjbGFzcyBmb3IgYSBOZXcgTWV0aG9kIExpYnJhcnkgd2l6YXJkIHBhZ2UuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgTmV3TGlicmFyeVdpemFyZFBhZ2UgZXh0ZW5kcyBCYXNlV2l6YXJkUGFnZSB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBOZXdMaWJyYXJ5V2l6YXJkUGFnZShTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBsaWJyYXJ5IHNwZWNpZmljIHVzZXIgc2VsZWN0aW9ucy4KLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgTWFwIGdldFNlbGVjdGlvbnMoKTsKLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL3dpemFyZHMvTmV3TGlicmFyeVdpemFyZFBhZ2VGYWN0b3J5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvd2l6YXJkcy9OZXdMaWJyYXJ5V2l6YXJkUGFnZUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjM5MDk5MS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvd2l6YXJkcy9OZXdMaWJyYXJ5V2l6YXJkUGFnZUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS53aXphcmRzOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQ29uc3RydWN0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnNlcnZpY2VhYmlsaXR5LkRlYnVnVHJhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuTGlicmFyeVVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLmludGVybmFsLndpemFyZHMuTmV3TGlicmFyeVdpemFyZFBhZ2VDb250cmlidXRpb247Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLQotLyoqCi0gKiBNYW5hZ2VzIHRoZSBOZXcgTGlicmFyeSB3aXphcmQgcGFnZXMgZGVmaW5lZCB2aWEgdGhlCi0gKiAib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkubmV3TGlicmFyeVdpemFyZFBhZ2VzIiBleHRlbnNpb24gcG9pbnQuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTmV3TGlicmFyeVdpemFyZFBhZ2VGYWN0b3J5IHsKLQotCS8qKgotCSAqIFRoZSBleHRlbnNpb24gcG9pbnQgbmFtZXNwYWNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVEVOU0lPTl9QT0lOVF9OQU1FU1BBQ0UgPSAib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgZXh0ZW5zaW9uIHBvaW50IG5hbWUuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhURU5TSU9OX1BPSU5UX05BTUUgPSAibmV3TGlicmFyeVdpemFyZFBhZ2VzIjsgLy8kTk9OLU5MUy0xJAotCi0JLy8gSWYgdHJ1ZSwgZGVidWcgdHJhY2luZyBpcyBlbmFibGVkLgotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gZGVidWcgPSBMaWJyYXJ5VUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmlzRGVidWdnaW5nKCk7Ci0KLQkvLyBUaGUgc2hhcmVkIGluc3RhbmNlLgotCXByaXZhdGUgc3RhdGljIE5ld0xpYnJhcnlXaXphcmRQYWdlRmFjdG9yeSBpbnN0YW5jZSA9IG51bGw7Ci0KLQkvLyBBIG1hcCBvZiB3aXphcmQgcGFnZSBwcm92aWRlcnMuCi0JcHJpdmF0ZSBNYXA8U3RyaW5nLCBOZXdMaWJyYXJ5V2l6YXJkUGFnZUNvbnRyaWJ1dGlvbj4gd2l6YXJkUGFnZVByb3ZpZGVycyA9IG5ldyBIYXNoTWFwPFN0cmluZywgTmV3TGlicmFyeVdpemFyZFBhZ2VDb250cmlidXRpb24+KCk7Ci0KLQkvLyBBIGxpc3Qgb2Ygd2l6YXJkIHBhZ2UgaW5zdGFuY2VzLgotCXByaXZhdGUgTWFwPFN0cmluZywgTmV3TGlicmFyeVdpemFyZFBhZ2U+IHdpemFyZFBhZ2VzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBOZXdMaWJyYXJ5V2l6YXJkUGFnZT4oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNoYXJlZCBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE5ld0xpYnJhcnlXaXphcmRQYWdlRmFjdG9yeSBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKGluc3RhbmNlID09IG51bGwpIHsKLQkJCXN5bmNocm9uaXplZCAoTmV3TGlicmFyeVdpemFyZFBhZ2VGYWN0b3J5LmNsYXNzKSB7Ci0JCQkJaWYgKGluc3RhbmNlID09IG51bGwpIHsKLQkJCQkJaW5zdGFuY2UgPSBuZXcgTmV3TGlicmFyeVdpemFyZFBhZ2VGYWN0b3J5KCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXByaXZhdGUgTmV3TGlicmFyeVdpemFyZFBhZ2VGYWN0b3J5KCkgewotCQlpbml0KCk7Ci0JfQotCi0JLyoqCi0JICogUGVyZm9ybXMgdGhlIG5lY2Vzc2FyeSBpbml0aWFsaXphdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0KCkgewotCQlpZiAoZGVidWcpIHsKLQkJCURlYnVnVHJhY2UucHJpbnQodGhpcywgImluaXQiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCUlFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCk7Ci0JCUlFeHRlbnNpb25Qb2ludCBleHRlbnNpb25Qb2ludCA9IGV4dGVuc2lvblJlZ2lzdHJ5LmdldEV4dGVuc2lvblBvaW50KAotCQkJCUVYVEVOU0lPTl9QT0lOVF9OQU1FU1BBQ0UsIEVYVEVOU0lPTl9QT0lOVF9OQU1FKTsKLQkJaWYgKGV4dGVuc2lvblBvaW50ICE9IG51bGwpIHsKLQkJCUlFeHRlbnNpb25bXSBleHRlbnNpb25zID0gZXh0ZW5zaW9uUG9pbnQuZ2V0RXh0ZW5zaW9ucygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBleHRlbnNpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJSUV4dGVuc2lvbiBleHRlbnNpb24gPSBleHRlbnNpb25zW2ldOwotCQkJCVN0cmluZyBwbHVnaW5JZCA9IGV4dGVuc2lvbi5nZXROYW1lc3BhY2VJZGVudGlmaWVyKCk7Ci0JCQkJQnVuZGxlIGJ1bmRsZSA9IFBsYXRmb3JtLmdldEJ1bmRsZShwbHVnaW5JZCk7Ci0JCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gY29uZmlnRWxlbWVudHMgPSBleHRlbnNpb24KLQkJCQkJCS5nZXRDb25maWd1cmF0aW9uRWxlbWVudHMoKTsKLQkJCQlmb3IgKGludCBqID0gMDsgaiA8IGNvbmZpZ0VsZW1lbnRzLmxlbmd0aDsgaisrKSB7Ci0JCQkJCUlDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWdFbGVtZW50ID0gY29uZmlnRWxlbWVudHNbal07Ci0JCQkJCXRyeSB7Ci0JCQkJCQlTdHJpbmcgY2xhc3NOYW1lID0gY29uZmlnRWxlbWVudC5nZXRBdHRyaWJ1dGUoImNsYXNzIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCVN0cmluZyB0eXBlSWQgPSBjb25maWdFbGVtZW50LmdldEF0dHJpYnV0ZSgidHlwZSIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQlTdHJpbmcgdGl0bGUgPSBjb25maWdFbGVtZW50LmdldEF0dHJpYnV0ZSgidGl0bGUiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJU3RyaW5nIGRlc2NyaXB0aW9uID0gY29uZmlnRWxlbWVudAotCQkJCQkJCQkuZ2V0QXR0cmlidXRlKCJkZXNjcmlwdGlvbiIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQlpZiAoZGVidWcpIHsKLQkJCQkJCQlEZWJ1Z1RyYWNlLnByaW50KHRoaXMsICJpbml0IiwgLy8kTk9OLU5MUy0xJCAKLQkJCQkJCQkJCSJjb25maWdFbGVtZW50LCBjbGFzcz0iICsgY2xhc3NOYW1lICsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJCQkiLCB0eXBlPSIgKyB0eXBlSWQgKyAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQkJCSIsIHRpdGxlPSIgKyB0aXRsZSArIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCQkJIiwgZGVzY3JpcHRpb249IiArIGRlc2NyaXB0aW9uKTsgLy8kTk9OLU5MUy0xJAkJCQkJCQkKLQkJCQkJCX0KLQkJCQkJCWlmIChjbGFzc05hbWUgIT0gbnVsbCAmJiBjbGFzc05hbWUudHJpbSgpLmxlbmd0aCgpID4gMAotCQkJCQkJCQkmJiB0eXBlSWQgIT0gbnVsbCAmJiB0eXBlSWQudHJpbSgpLmxlbmd0aCgpID4gMAotCQkJCQkJCQkmJiB0aXRsZSAhPSBudWxsICYmIHRpdGxlLnRyaW0oKS5sZW5ndGgoKSA+IDAKLQkJCQkJCQkJJiYgZGVzY3JpcHRpb24gIT0gbnVsbAotCQkJCQkJCQkmJiBkZXNjcmlwdGlvbi50cmltKCkubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJCQkJaWYgKCF3aXphcmRQYWdlUHJvdmlkZXJzLmNvbnRhaW5zS2V5KHR5cGVJZCkpIHsKLQkJCQkJCQkJTmV3TGlicmFyeVdpemFyZFBhZ2VDb250cmlidXRpb24gcHJvdmlkZXIgPSBuZXcgTmV3TGlicmFyeVdpemFyZFBhZ2VDb250cmlidXRpb24oCi0JCQkJCQkJCQkJYnVuZGxlLCBjbGFzc05hbWUsIHR5cGVJZCwgdGl0bGUsCi0JCQkJCQkJCQkJZGVzY3JpcHRpb24pOwotCQkJCQkJCQl3aXphcmRQYWdlUHJvdmlkZXJzLnB1dCh0eXBlSWQsIHByb3ZpZGVyKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlMaWJyYXJ5VUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIHdpemFyZCBwYWdlLgotCSAqIAotCSAqIEByZXR1cm4gYSA8Y29kZT5OZXdMaWJyYXJ5V2l6YXJkUGFnZTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgTmV3TGlicmFyeVdpemFyZFBhZ2UgY3JlYXRlV2l6YXJkUGFnZShTdHJpbmcgcGFnZUlkLCBTdHJpbmcgdHlwZUlkKSB7Ci0JCU5ld0xpYnJhcnlXaXphcmRQYWdlIHdpemFyZFBhZ2UgPSAoTmV3TGlicmFyeVdpemFyZFBhZ2UpIHdpemFyZFBhZ2VzCi0JCQkJLmdldCh0eXBlSWQpOwotCQlpZiAod2l6YXJkUGFnZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gd2l6YXJkUGFnZTsKLQkJfQotCi0JCU5ld0xpYnJhcnlXaXphcmRQYWdlQ29udHJpYnV0aW9uIHByb3ZpZGVyID0gKE5ld0xpYnJhcnlXaXphcmRQYWdlQ29udHJpYnV0aW9uKSB3aXphcmRQYWdlUHJvdmlkZXJzCi0JCQkJLmdldCh0eXBlSWQpOwotCQlpZiAocHJvdmlkZXIgIT0gbnVsbCkgewotCQkJQnVuZGxlIGJ1bmRsZSA9IHByb3ZpZGVyLmdldEJ1bmRsZSgpOwotCQkJU3RyaW5nIGNsYXNzTmFtZSA9IHByb3ZpZGVyLmdldENsYXNzTmFtZSgpOwotCQkJQ2xhc3Mgd2l6YXJkUGFnZUNsYXNzOwotCQkJQ2xhc3NbXSBhcmdDbGFzcyA9IG5ldyBDbGFzc1tdIHsgU3RyaW5nLmNsYXNzIH07Ci0JCQlPYmplY3RbXSBhcmdWYWx1ZSA9IG5ldyBPYmplY3RbXSB7IHBhZ2VJZCB9OwotCQkJQ29uc3RydWN0b3IgY29uc3RydWN0b3I7Ci0JCQl0cnkgewotCQkJCXdpemFyZFBhZ2VDbGFzcyA9IGJ1bmRsZS5sb2FkQ2xhc3MoY2xhc3NOYW1lKTsKLQkJCQljb25zdHJ1Y3RvciA9IHdpemFyZFBhZ2VDbGFzcy5nZXRDb25zdHJ1Y3RvcihhcmdDbGFzcyk7Ci0JCQkJd2l6YXJkUGFnZSA9IChOZXdMaWJyYXJ5V2l6YXJkUGFnZSkgY29uc3RydWN0b3IKLQkJCQkJCS5uZXdJbnN0YW5jZShhcmdWYWx1ZSk7Ci0JCQkJd2l6YXJkUGFnZS5zZXRUaXRsZShwcm92aWRlci5nZXRUaXRsZSgpKTsKLQkJCQl3aXphcmRQYWdlLnNldERlc2NyaXB0aW9uKHByb3ZpZGVyLmdldERlc2NyaXB0aW9uKCkpOwotCQkJCXdpemFyZFBhZ2VzLnB1dCh0eXBlSWQsIHdpemFyZFBhZ2UpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlMaWJyYXJ5VUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJfQotCQl9Ci0JCXJldHVybiB3aXphcmRQYWdlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb3IgY2FjaGVkIHdpemFyZCBwYWdlLgotCSAqIAotCSAqIEByZXR1cm4gYSA8Y29kZT5OZXdMaWJyYXJ5V2l6YXJkUGFnZTwvY29kZT4gb2JqZWN0Ci0JICovCi0JcHVibGljIE5ld0xpYnJhcnlXaXphcmRQYWdlIGdldFdpemFyZFBhZ2UoU3RyaW5nIHR5cGVJZCkgewotCQlyZXR1cm4gKE5ld0xpYnJhcnlXaXphcmRQYWdlKSB3aXphcmRQYWdlcy5nZXQodHlwZUlkKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS93aXphcmRzL09wZW5MaWJyYXJ5TWFpblBhZ2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS93aXphcmRzL09wZW5MaWJyYXJ5TWFpblBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWI1YjMyNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvd2l6YXJkcy9PcGVuTGlicmFyeU1haW5QYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkud2l6YXJkczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuRmlsZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuTGlicmFyeVVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLkxpYnJhcnlVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5wcmVmZXJlbmNlcy5MaWJyYXJ5VUlQcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudWkud2l6YXJkcy5CYXNlV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpcmVjdG9yeURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLQotLyoqCi0gKiBBIHdpemFyZCBwYWdlIHRoYXQgcHJvbXB0cyB0aGUgdXNlciB0byBzZWxlY3QgYSBwYXRoIHRvIG9wZW4gYSBtZXRob2QKLSAqIGxpYnJhcnkuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMgotICovCi1wdWJsaWMgY2xhc3MgT3BlbkxpYnJhcnlNYWluUGFnZSBleHRlbmRzIEJhc2VXaXphcmRQYWdlIHsKLQotCS8qKgotCSAqIFRoZSB3aXphcmQgcGFnZSBuYW1lLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBR0VfTkFNRSA9IE9wZW5MaWJyYXJ5TWFpblBhZ2UuY2xhc3MuZ2V0TmFtZSgpOwotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQRV9JRCA9ICJ0eXBlSWQiOyAvLyROT04tTkxTLTEkCQotCi0JcHJvdGVjdGVkIFNoZWxsIHNoZWxsOwotCi0JcHJvdGVjdGVkIENvbXBvc2l0ZSBjb21wb3NpdGU7Ci0KLQlwcm90ZWN0ZWQgTGFiZWwgcGF0aExhYmVsOwotCi0JcHJvdGVjdGVkIENvbWJvIGxpYnJhcnlQYXRoQ29tYm87Ci0KLQlwcm90ZWN0ZWQgQnV0dG9uIGJyb3dzZUJ1dHRvbjsKLQotCXByb3RlY3RlZCBTdHJpbmcgbGlicmFyeVR5cGU7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqIAotCSAqIEBwYXJhbSBwYWdlTmFtZQotCSAqICAgICAgICAgICAgdGhlIHdpemFyZCBwYWdlIG5hbWUKLQkgKi8KLQlwdWJsaWMgT3BlbkxpYnJhcnlNYWluUGFnZShTdHJpbmcgcGFnZU5hbWUpIHsKLQkJc3VwZXIocGFnZU5hbWUpOwotCQlzZXRUaXRsZShMaWJyYXJ5VUlSZXNvdXJjZXMub3BlbkxpYnJhcnlXaXphcmRfdGl0bGUpOwotCQlzZXREZXNjcmlwdGlvbihMaWJyYXJ5VUlSZXNvdXJjZXMub3BlbkxpYnJhcnlNYWluV2l6YXJkUGFnZV90aXRsZSk7Ci0JCXNldEltYWdlRGVzY3JpcHRvcihMaWJyYXJ5VUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcigKLQkJCQkiZnVsbC93aXpiYW4vT3Blbi5naWYiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBPcGVuTGlicmFyeU1haW5QYWdlKCkgewotCQl0aGlzKFBBR0VfTkFNRSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dQYWdlI2NyZWF0ZUNvbnRyb2woQ29tcG9zaXRlKQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCQlzaGVsbCA9IHBhcmVudC5nZXRTaGVsbCgpOwotCi0JCWNvbXBvc2l0ZSA9IGNyZWF0ZUdyaWRMYXlvdXRDb21wb3NpdGUocGFyZW50LCAzKTsKLQotCQlwYXRoTGFiZWwgPSBjcmVhdGVMYWJlbChjb21wb3NpdGUsIExpYnJhcnlVSVJlc291cmNlcy5wYXRoTGFiZWxfdGV4dCk7Ci0KLQkJbGlicmFyeVBhdGhDb21ibyA9IGNyZWF0ZUNvbWJvYm94KGNvbXBvc2l0ZSk7Ci0KLQkJYnJvd3NlQnV0dG9uID0gY3JlYXRlQnV0dG9uKGNvbXBvc2l0ZSwKLQkJCQlMaWJyYXJ5VUlSZXNvdXJjZXMuYnJvd3NlQnV0dG9uX3RleHQpOwotCi0JCWluaXRDb250cm9scygpOwotCi0JCWFkZExpc3RlbmVycygpOwotCi0JCXNldENvbnRyb2woY29tcG9zaXRlKTsKLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplcyB0aGUgd2l6YXJkIHBhZ2UgY29udHJvbHMgd2l0aCBkYXRhLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRDb250cm9scygpIHsKLQkJTGlzdDxTdHJpbmc+IG9wZW5MaWJyYXJ5UGF0aHNMaXN0ID0gTGlicmFyeVVJUHJlZmVyZW5jZXMKLQkJCQkuZ2V0T3BlbkxpYnJhcnlQYXRoc0xpc3QoKTsJCQotCQlpZiAob3BlbkxpYnJhcnlQYXRoc0xpc3Quc2l6ZSgpID4gMCkgewotCQkJU3RyaW5nW10gb3BlbkxpYnJhcnlQYXRocyA9IExpYnJhcnlVSVByZWZlcmVuY2VzCi0JCQkJCS5nZXRPcGVuTGlicmFyeVBhdGhzKCk7Ci0JCQlsaWJyYXJ5UGF0aENvbWJvLnNldEl0ZW1zKG9wZW5MaWJyYXJ5UGF0aHMpOwotCQkJaWYgKG9wZW5MaWJyYXJ5UGF0aHMubGVuZ3RoID4gMCkgewotCQkJCWxpYnJhcnlQYXRoQ29tYm8uc2V0VGV4dChvcGVuTGlicmFyeVBhdGhzWzBdKTsKLQkJCX0JCQkKLQkJfSBlbHNlIHsKLQkJCVN0cmluZyBsaWJyYXJ5UGF0aCA9IExpYnJhcnlVSVByZWZlcmVuY2VzCi0JCQkJCS5nZXREZWZhdWx0TGlicmFyeVBhdGgoKSArIEZpbGVVdGlsLkZJTEVfU0VQICsgIkxpYnJhcnkxIjsgLy8kTk9OLU5MUy0xJAotCQkJb3BlbkxpYnJhcnlQYXRoc0xpc3QuYWRkKDAsIGxpYnJhcnlQYXRoKTsKLQkJCVN0cmluZ1tdIG9wZW5MaWJyYXJ5UGF0aHMgPSBuZXcgU3RyaW5nW29wZW5MaWJyYXJ5UGF0aHNMaXN0LnNpemUoKV07Ci0JCQlvcGVuTGlicmFyeVBhdGhzTGlzdC50b0FycmF5KG9wZW5MaWJyYXJ5UGF0aHMpOwotCQkJbGlicmFyeVBhdGhDb21iby5zZXRJdGVtcyhvcGVuTGlicmFyeVBhdGhzKTsKLQkJCWxpYnJhcnlQYXRoQ29tYm8uc2V0VGV4dChvcGVuTGlicmFyeVBhdGhzWzBdKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEFkZHMgZXZlbnQgbGlzdGVuZXJzIHRvIHRoZSB3aXphcmQgcGFnZSBjb250cm9scy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRMaXN0ZW5lcnMoKSB7Ci0JCWxpYnJhcnlQYXRoQ29tYm8uYWRkTW9kaWZ5TGlzdGVuZXIobmV3IE1vZGlmeUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0JCQkJc2V0UGFnZUNvbXBsZXRlKGlzUGFnZUNvbXBsZXRlKCkpOwotCQkJCWdldFdpemFyZCgpLmdldENvbnRhaW5lcigpLnVwZGF0ZUJ1dHRvbnMoKTsKLQkJCX0KLQkJfSk7Ci0KLQkJbGlicmFyeVBhdGhDb21iby5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJc2V0UGFnZUNvbXBsZXRlKGlzUGFnZUNvbXBsZXRlKCkpOwotCQkJCWdldFdpemFyZCgpLmdldENvbnRhaW5lcigpLnVwZGF0ZUJ1dHRvbnMoKTsKLQkJCX0KLQkJfSk7Ci0KLQkJYnJvd3NlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlEaXJlY3RvcnlEaWFsb2cgZGlhbG9nID0gbmV3IERpcmVjdG9yeURpYWxvZyhzaGVsbCwgU1dULk5PTkUpOwotCQkJCWRpYWxvZy5zZXRGaWx0ZXJQYXRoKGdldExpYnJhcnlQYXRoKCkpOwotCQkJCVN0cmluZyBzZWxlY3RlZERpciA9IGRpYWxvZy5vcGVuKCk7Ci0JCQkJaWYgKHNlbGVjdGVkRGlyICE9IG51bGwpIHsKLQkJCQkJbGlicmFyeVBhdGhDb21iby5hZGQoc2VsZWN0ZWREaXIsIDApOwotCQkJCQlsaWJyYXJ5UGF0aENvbWJvLnNldFRleHQoc2VsZWN0ZWREaXIpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkUGFnZSNpc0NvbXBsZXRlZCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNQYWdlQ29tcGxldGUoKSB7Ci0JCXJldHVybiBnZXRMaWJyYXJ5TmFtZSgpLmxlbmd0aCgpID4gMDsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBsaWJyYXJ5IG5hbWUuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMaWJyYXJ5TmFtZSgpIHsKLQkJU3RyaW5nIGxpYlBhdGggPSBnZXRMaWJyYXJ5UGF0aCgpOwotCQlTdHJpbmcgbGliTmFtZSA9IG5ldyBGaWxlKGxpYlBhdGgpLmdldE5hbWUoKTsKLQkJaWYgKCFsaWJQYXRoLmVxdWFscyhsaWJOYW1lKSkgewotCQkJcmV0dXJuIGxpYk5hbWU7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHVzZXIgc3BlY2lmaWVkIGxpYnJhcnkgcGF0aC4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExpYnJhcnlQYXRoKCkgewotCQlyZXR1cm4gbGlicmFyeVBhdGhDb21iby5nZXRUZXh0KCkudHJpbSgpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHVzZXIgc3BlY2lmaWVkIG1ldGhvZCBsaWJyYXJ5IHR5cGUuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMaWJyYXJ5VHlwZSgpIHsKLQkJcmV0dXJuIGxpYnJhcnlUeXBlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL3dpemFyZHMvT3BlbkxpYnJhcnlXaXphcmQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS93aXphcmRzL09wZW5MaWJyYXJ5V2l6YXJkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwYTk0NWEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL3dpemFyZHMvT3BlbkxpYnJhcnlXaXphcmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS53aXphcmRzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnNlcnZpY2UudXRpbHMuQ29tbWFuZExpbmVSdW5VdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24uc2VydmljZS52ZXJzaW9uaW5nLlZlcnNpb25VdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udWkudXRpbC5Nc2dEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuTGlicmFyeVVJTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5MaWJyYXJ5VUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuTGlicmFyeVVJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLnByZWZlcmVuY2VzLkxpYnJhcnlVSVByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS5YTUlMaWJyYXJ5TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkuWE1JTGlicmFyeVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLm1pZ3JhdGlvbi5VcGdyYWRlQ2FsbGVySW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudWkud2l6YXJkcy5CYXNlV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklOZXdXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLQotLyoqCi0gKiBBIHdpemFyZCB0aGF0IGd1aWRlcyB0aGUgdXNlciB0byBvcGVuIGEgbWV0aG9kIGxpYnJhcnkuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIE9wZW5MaWJyYXJ5V2l6YXJkIGV4dGVuZHMgQmFzZVdpemFyZCBpbXBsZW1lbnRzIElOZXdXaXphcmQgewotCi0JLyoqCi0JICogVGhlIHdpemFyZCBJRC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXSVpBUkRfSUQgPSBPcGVuTGlicmFyeVdpemFyZC5jbGFzcy5nZXROYW1lKCk7Ci0KLQkvKioKLQkgKiBUaGUgT3BlbiBMaWJyYXJ5IHdpemFyZCBleHRlbnNpb24gcG9pbnQgSUQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0laQVJEX0VYVEVOU0lPTl9QT0lOVF9JRCA9ICJvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5vcGVuTGlicmFyeVdpemFyZCI7IC8vJE5PTi1OTFMtMSQJCi0KLQkvLyBUaGUgbWFpbiB3aXphcmQgcGFnZS4KLQlwcm90ZWN0ZWQgT3BlbkxpYnJhcnlNYWluUGFnZSBtYWluUGFnZTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIE9wZW5MaWJyYXJ5V2l6YXJkKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVpLndpemFyZHMuQmFzZVdpemFyZCNpbml0KElXb3JrYmVuY2gsCi0JICogICAgICBJU3RydWN0dXJlZFNlbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2ggd29ya2JlbmNoLCBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJc3VwZXIuaW5pdCh3b3JrYmVuY2gsIHNlbGVjdGlvbik7Ci0JCXNldFdpbmRvd1RpdGxlKExpYnJhcnlVSVJlc291cmNlcy5vcGVuTGlicmFyeVdpemFyZF90aXRsZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudWkud2l6YXJkcy5CYXNlV2l6YXJkI2dldFdpemFyZEV4dGVuZGVyRXh0ZW5zaW9uUG9pbnRJZCgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRXaXphcmRFeHRlbmRlckV4dGVuc2lvblBvaW50SWQoKSB7Ci0JCXJldHVybiBXSVpBUkRfRVhURU5TSU9OX1BPSU5UX0lEOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZCNhZGRQYWdlcygpCi0JICovCi0JcHVibGljIHZvaWQgYWRkUGFnZXMoKSB7Ci0JCWlmICh3aXphcmRFeHRlbmRlciA9PSBudWxsKSB7Ci0JCQltYWluUGFnZSA9IGNyZWF0ZU1haW5QYWdlKCk7Ci0JCQlzdXBlci5hZGRQYWdlKG1haW5QYWdlKTsKLQkJfSBlbHNlIHsKLQkJCUxpc3Q8SVdpemFyZFBhZ2U+IHdpemFyZFBhZ2VzID0gbmV3IEFycmF5TGlzdDxJV2l6YXJkUGFnZT4oKTsKLQotCQkJSVdpemFyZFBhZ2UgcGFnZSA9IHdpemFyZEV4dGVuZGVyCi0JCQkJCS5nZXRSZXBsYWNlV2l6YXJkUGFnZShPcGVuTGlicmFyeU1haW5QYWdlLlBBR0VfTkFNRSk7Ci0JCQlpZiAocGFnZSAhPSBudWxsKSB7Ci0JCQkJd2l6YXJkUGFnZXMuYWRkKHBhZ2UpOwotCQkJfSBlbHNlIHsKLQkJCQltYWluUGFnZSA9IGNyZWF0ZU1haW5QYWdlKCk7Ci0JCQkJd2l6YXJkUGFnZXMuYWRkKG1haW5QYWdlKTsKLQkJCX0KLQotCQkJc3VwZXIuZ2V0TmV3V2l6YXJkUGFnZXMod2l6YXJkUGFnZXMpOwotCi0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gd2l6YXJkUGFnZXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCUlXaXphcmRQYWdlIHdpemFyZFBhZ2UgPSAoSVdpemFyZFBhZ2UpIGl0Lm5leHQoKTsKLQkJCQlzdXBlci5hZGRQYWdlKHdpemFyZFBhZ2UpOwotCQkJfQotCi0JCQl3aXphcmRFeHRlbmRlci5pbml0V2l6YXJkUGFnZXMod2l6YXJkUGFnZXMpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgbWFpbiB3aXphcmQgcGFnZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBtYWluIHdpemFyZCBwYWdlCi0JICovCi0JcHJvdGVjdGVkIE9wZW5MaWJyYXJ5TWFpblBhZ2UgY3JlYXRlTWFpblBhZ2UoKSB7Ci0JCXJldHVybiBuZXcgT3BlbkxpYnJhcnlNYWluUGFnZSgpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZCNjcmVhdGVQYWdlQ29udHJvbHMoQ29tcG9zaXRlKQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZVBhZ2VDb250cm9scyhDb21wb3NpdGUgcGFnZUNvbnRhaW5lcikgewotCQlzdXBlci5jcmVhdGVQYWdlQ29udHJvbHMocGFnZUNvbnRhaW5lcik7Ci0JCXBhZ2VDb250YWluZXIuZ2V0U2hlbGwoKS5zZXRJbWFnZSgKLQkJCQlMaWJyYXJ5VUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFNoYXJlZEltYWdlKAotCQkJCQkJImZ1bGwvb2JqMTYvTWV0aG9kTGlicmFyeS5naWYiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmQjcGVyZm9ybUZpbmlzaCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gcGVyZm9ybUZpbmlzaCgpIHsKLQkJaWYgKHdpemFyZEV4dGVuZGVyICE9IG51bGwpIHsKLQkJCXJldHVybiB3aXphcmRFeHRlbmRlci5kb0ZpbmlzaCgpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIG9wZW5NZXRob2RMaWJyYXJ5KG1haW5QYWdlLmdldExpYnJhcnlQYXRoKCksICJ4bWkiKTsgLy8kTk9OLU5MUy0xJAkKLQkJfQotCX0KLQotCS8qKgotCSAqIE9wZW5zIHRoZSBtZXRob2QgbGlicmFyeSBhdCB0aGUgdXNlciBzcGVjaWZpZWQgcGF0aC4KLQkgKiAKLQkgKiBAcGFyYW0gcGF0aAotCSAqICAgICAgICAgICAgdGhlIG1ldGhvZCBsaWJyYXJ5IHBhdGgKLQkgKiBAcGFyYW0gdHlwZQotCSAqICAgICAgICAgICAgdGhlIG1ldGhvZCBsaWJyYXJ5IHR5cGUKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBvcGVuTWV0aG9kTGlicmFyeShTdHJpbmcgcGF0aCwgU3RyaW5nIHR5cGUpIHsKLQkJdHJ5IHsKLQkJCU1hcDxTdHJpbmcsIFN0cmluZz4gb3B0aW9ucyA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOwotCQkJRmlsZSBsaWJyYXJ5UGF0aCA9IG5ldyBGaWxlKHBhdGgpOwotCQkJb3B0aW9ucy5wdXQoWE1JTGlicmFyeU1hbmFnZXIuQVJHX0xJQlJBUllfUEFUSCwgbGlicmFyeVBhdGgKLQkJCQkJLmdldEFic29sdXRlUGF0aCgpKTsKLQotCQkJaWYgKFhNSUxpYnJhcnlVdGlsLmlzVmFsaWRMaWJyYXJ5KHBhdGgsIHRydWUpID09IFN0YXR1cy5PS19TVEFUVVMpIHsKLQkJCQlpZiAoIWhhbmRsZVRvb2xWZXJzaW9uKHBhdGgsIG51bGwpKSB7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQkJaWYgKExpYnJhcnlVSU1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5vcGVuTGlicmFyeShwYXRoKSkgewotCQkJCQlMaWJyYXJ5VUlQcmVmZXJlbmNlcy5hZGRPcGVuTGlicmFyeVBhdGgobGlicmFyeVBhdGgKLQkJCQkJCQkuZ2V0QWJzb2x1dGVQYXRoKCkpOwotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKFhNSUxpYnJhcnlVdGlsCi0JCQkJCS5jb250YWluc1BsdWdpbk9yQ29uZmlnU3BlY0V4cG9ydEZpbGUocGF0aCkpIHsKLQkJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKExpYnJhcnlVSVJlc291cmNlcy5vcGVuTGlicmFyeUVycm9yX3JlYXNvbjQpOwotCQkJfSBlbHNlIHsKLQkJCQlNc2dEaWFsb2cgbXNnRGlhbG9nID0gTGlicmFyeVVJUGx1Z2luLmdldERlZmF1bHQoKQotCQkJCQkJLmdldE1zZ0RpYWxvZygpOwotCQkJCWJvb2xlYW4gcmMgPSBtc2dEaWFsb2cKLQkJCQkJCS5kaXNwbGF5Q29uZmlybWF0aW9uKAotCQkJCQkJCQlMaWJyYXJ5VUlSZXNvdXJjZXMub3BlbkxpYnJhcnlXaXphcmRfdGl0bGUsCi0JCQkJCQkJCU5MUwotCQkJCQkJCQkJCS5iaW5kKAotCQkJCQkJCQkJCQkJTGlicmFyeVVJUmVzb3VyY2VzLm9wZW5MaWJyYXJ5RGlhbG9nX25ld0xpYnJhcnlfdGV4dCwKLQkJCQkJCQkJCQkJCW5ldyBPYmplY3RbXSB7IHBhdGggfSkpOwotCQkJCWlmICghcmMpCi0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQlpZiAoTGlicmFyeVVJTWFuYWdlci5nZXRJbnN0YW5jZSgpLmNyZWF0ZUxpYnJhcnkocGF0aCkpIHsKLQkJCQkJTGlicmFyeVVJUHJlZmVyZW5jZXMuYWRkT3BlbkxpYnJhcnlQYXRoKGxpYnJhcnlQYXRoCi0JCQkJCQkJLmdldEFic29sdXRlUGF0aCgpKTsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQotCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVN0cmluZyByZWFzb24gPSBlLmdldE1lc3NhZ2UoKTsKLQkJCWlmIChyZWFzb24gPT0gbnVsbCkgewotCQkJCXJlYXNvbiA9IExpYnJhcnlVSVJlc291cmNlcy5vcGVuTGlicmFyeUludGVybmxFcnJvcl9yZWFzb247Ci0JCQl9Ci0JCQlyZWFzb24gKz0gIlxuXG4iICsgTGlicmFyeVVJUmVzb3VyY2VzLm9wZW5MaWJyYXJ5RXJyb3JfYWR2aWNlOyAvLyROT04tTkxTLTEkCi0JCQlpZiAoZS5nZXRNZXNzYWdlKCkgIT0gbnVsbCkgewotCQkJCUxpYnJhcnlVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkuZGlzcGxheUVycm9yKAotCQkJCQkJTGlicmFyeVVJUmVzb3VyY2VzLm9wZW5MaWJyYXJ5V2l6YXJkX3RpdGxlLAotCQkJCQkJTGlicmFyeVVJUmVzb3VyY2VzLm9wZW5MaWJyYXJ5RXJyb3JfbXNnLCByZWFzb24pOwotCQkJfSBlbHNlIHsKLQkJCQlMaWJyYXJ5VUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpLmRpc3BsYXlFcnJvcigKLQkJCQkJCUxpYnJhcnlVSVJlc291cmNlcy5vcGVuTGlicmFyeVdpemFyZF90aXRsZSwKLQkJCQkJCUxpYnJhcnlVSVJlc291cmNlcy5vcGVuTGlicmFyeUVycm9yX21zZywgcmVhc29uLCBlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQ2hlY2sgYW5kIGhhbmRsZSB0b29sIHZlcnNpb24gZGlmZmVyZW5jZXMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaGFuZGxlVG9vbFZlcnNpb24oU3RyaW5nIHBhdGgsCi0JCQlVcGdyYWRlQ2FsbGVySW5mbyBjYWxsZXJJbmZvKSB7Ci0JCVN0cmluZyBsaWJYbWkgPSBYTUlMaWJyYXJ5TWFuYWdlci5MSUJSQVJZX1hNSTsKLQkJaWYgKGNhbGxlckluZm8gIT0gbnVsbCAmJiBjYWxsZXJJbmZvLmdldElzRXhwb3J0ZWRQbHVnaW5MaWIoKSkgewotCQkJbGliWG1pID0gWE1JTGlicmFyeU1hbmFnZXIuZXhwb3J0RmlsZTsKLQkJfQotCQlWZXJzaW9uVXRpbC5WZXJzaW9uQ2hlY2tJbmZvIGluZm8gPSBWZXJzaW9uVXRpbAotCQkJCS5jaGVja0xpYnJhcnlWZXJzaW9uKG5ldyBGaWxlKHBhdGgsIGxpYlhtaSkpOwotCQlpZiAoaW5mbyAhPSBudWxsICYmIGluZm8ucmVzdWx0ID4gMCkgewotCQkJU3RyaW5nIG1lc3NhZ2UgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKGluZm8udG9vbElELmVxdWFscyhWZXJzaW9uVXRpbC5nZXRQcmltYXJ5VG9vbElEKCkpKSB7Ci0JCQkJbWVzc2FnZSA9IE5MUy5iaW5kKAotCQkJCQkJTGlicmFyeVVJUmVzb3VyY2VzLnZlcnNpb25NaXNtYXRjaERpYWxvZ190ZXh0LAotCQkJCQkJbmV3IE9iamVjdFtdIHsgUGxhdGZvcm0uZ2V0UHJvZHVjdCgpLmdldE5hbWUoKSwKLQkJCQkJCQkJaW5mby50b29sVmVyc2lvbiB9KTsKLQkJCX0gZWxzZSB7Ci0JCQkJbWVzc2FnZSA9IE5MUy5iaW5kKAotCQkJCQkJTGlicmFyeVVJUmVzb3VyY2VzLnZlcnNpb25NaXNtYXRjaERpYWxvZ190ZXh0X3Vua25vd24sCi0JCQkJCQluZXcgT2JqZWN0W10geyBQbGF0Zm9ybS5nZXRQcm9kdWN0KCkuZ2V0TmFtZSgpIH0pOwotCQkJfQotCQkJaWYgKCFpc1VwZ3JhZGVMaWJyYXJ5KGNhbGxlckluZm8pKSB7Ci0JCQkJY2FsbGVySW5mby5zZXRFcnJvck1zZyhtZXNzYWdlKTsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQlMaWJyYXJ5VUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpLmRpc3BsYXlFcnJvcigKLQkJCQkJTGlicmFyeVVJUmVzb3VyY2VzLm9wZW5MaWJyYXJ5V2l6YXJkX3RpdGxlLCBtZXNzYWdlKTsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlpZiAoWE1JTGlicmFyeVV0aWwuaXNNZXRob2RMaWJyYXJ5VXBncmFkZVJlcXVpcmVkKHBhdGgsIGxpYlhtaSwgaW5mbykpIHsKLQkJCWlmICghQ29tbWFuZExpbmVSdW5VdGlsLmdldEluc3RhbmNlKCkuaXNOZWVkVG9SdW4oKSAKLQkJCQkJJiYgaXNVcGdyYWRlTGlicmFyeShjYWxsZXJJbmZvKQotCQkJCQkmJiAhTGlicmFyeVVJUGx1Z2luCi0JCQkJCQkJLmdldERlZmF1bHQoKQotCQkJCQkJCS5nZXRNc2dEaWFsb2coKQotCQkJCQkJCS5kaXNwbGF5Q29uZmlybWF0aW9uKAotCQkJCQkJCQkJTGlicmFyeVVJUmVzb3VyY2VzLm9wZW5MaWJyYXJ5V2l6YXJkX3RpdGxlLAotCQkJCQkJCQkJTGlicmFyeVVJUmVzb3VyY2VzLnVwZ3JhZGVMaWJyYXJ5RGlhbG9nX3RleHQpKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJaWYgKCFpc1VwZ3JhZGVMaWJyYXJ5KGNhbGxlckluZm8pKSB7Ci0JCQkJY2FsbGVySW5mby5jb3B5TGlicmFyeSgpOwotCQkJCWlmIChjYWxsZXJJbmZvLmdldENvcGllZExpYkZpbGUoKSAhPSBudWxsKSB7Ci0JCQkJCXBhdGggPSBjYWxsZXJJbmZvLmdldENvcGllZExpYkZpbGUoKS5nZXRQYXJlbnRGaWxlKCkKLQkJCQkJCQkuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0JCQkJfQotCQkJfQotCQkJaWYgKCFMaWJyYXJ5VUlNYW5hZ2VyLnVwZ3JhZGVMaWJyYXJ5KHBhdGgsIGNhbGxlckluZm8pKSB7Ci0JCQkJaWYgKGNhbGxlckluZm8gIT0gbnVsbCkgewotCQkJCQkvLyBjYWxsZXJJbmZvLnNldEVycm9yTXNnKCJ1cGdyYWRlTGlicmFyeSBGYWlsZWQhIik7IC8vbmVlZAotCQkJCQkvLyBuZXcgcmVzb3VyY2Ugc3RyaW5nCi0JCQkJfQotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiB0cnVlOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNVcGdyYWRlTGlicmFyeShVcGdyYWRlQ2FsbGVySW5mbyBjYWxsZXJJbmZvKSB7Ci0JCXJldHVybiBVcGdyYWRlQ2FsbGVySW5mby5pc1VwZ3JhZGVMaWJyYXJ5KGNhbGxlckluZm8pOwotCX0KLQkKLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL3dpemFyZHMvT3BlbkxpYnJhcnlXaXphcmRQYWdlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvd2l6YXJkcy9PcGVuTGlicmFyeVdpemFyZFBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWJhMjkwMS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvd2l6YXJkcy9PcGVuTGlicmFyeVdpemFyZFBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLndpemFyZHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVpLndpemFyZHMuQmFzZVdpemFyZFBhZ2U7Ci0KLS8qKgotICogVGhlIGFic3RyYWN0IGNsYXNzIGZvciBhIE9wZW4gTWV0aG9kIExpYnJhcnkgd2l6YXJkIHBhZ2UuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgT3BlbkxpYnJhcnlXaXphcmRQYWdlIGV4dGVuZHMgQmFzZVdpemFyZFBhZ2UgewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgT3BlbkxpYnJhcnlXaXphcmRQYWdlKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGxpYnJhcnkgc3BlY2lmaWMgdXNlciBzZWxlY3Rpb25zLgotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBNYXAgZ2V0U2VsZWN0aW9ucygpOwotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvd2l6YXJkcy9TZWxlY3RQcm9jZXNzUGFnZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL3dpemFyZHMvU2VsZWN0UHJvY2Vzc1BhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTM2YWViMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvd2l6YXJkcy9TZWxlY3RQcm9jZXNzUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLndpemFyZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5MaWJyYXJ5VUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuTGlicmFyeVVJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLnZpZXdzLlByb2Nlc3NUcmVlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51aS53aXphcmRzLkJhc2VXaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci0KLS8qKgotICogQSB3aXphcmQgcGFnZSB0aGF0IHByb21wdHMgdGhlIHVzZXIgdG8gc2VsZWN0IGEgcHJvY2VzcyB0byBleHBvcnQuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDcuMAotICovCi1wdWJsaWMgY2xhc3MgU2VsZWN0UHJvY2Vzc1BhZ2UgZXh0ZW5kcyBCYXNlV2l6YXJkUGFnZSB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQUdFX05BTUUgPSBTZWxlY3RQcm9jZXNzUGFnZS5jbGFzcy5nZXROYW1lKCk7Ci0KLQlwcml2YXRlIFByb2Nlc3NUcmVlVmlld2VyIHByb2Nlc3NUcmVlVmlld2VyOwotCi0JcHJpdmF0ZSBUZXh0IGJyaWVmRGVzY1RleHQ7Ci0KLQlwcml2YXRlIFByb2Nlc3MgcHJvY2VzczsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFNlbGVjdFByb2Nlc3NQYWdlKCkgewotCQlzdXBlcihQQUdFX05BTUUpOwotCQlzZXRUaXRsZShMaWJyYXJ5VUlSZXNvdXJjZXMuc2VsZWN0UHJvY2Vzc1dpemFyZFBhZ2VfdGl0bGUpOwotCQlzZXREZXNjcmlwdGlvbihMaWJyYXJ5VUlSZXNvdXJjZXMuc2VsZWN0UHJvY2Vzc1dpemFyZFBhZ2VfdGV4dCk7Ci0JCXNldEltYWdlRGVzY3JpcHRvcihMaWJyYXJ5VUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcigKLQkJCQkiZnVsbC93aXpiYW4vRXhwb3J0UHJvY2Vzcy5naWYiKSk7IC8vJE5PTi1OTFMtMSQJCQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nUGFnZSNjcmVhdGVDb250cm9sKENvbXBvc2l0ZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IGNyZWF0ZUdyaWRMYXlvdXRDb21wb3NpdGUocGFyZW50LCAxKTsKLQotCQljcmVhdGVMYWJlbChjb21wb3NpdGUsIExpYnJhcnlVSVJlc291cmNlcy5wcm9jZXNzZXNMYWJlbF90ZXh0KTsKLQotCQlwcm9jZXNzVHJlZVZpZXdlciA9IG5ldyBQcm9jZXNzVHJlZVZpZXdlcihjb21wb3NpdGUpOwotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgKLQkJCQl8IEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTCk7Ci0JCWdyaWREYXRhLmhlaWdodEhpbnQgPSAyNTA7Ci0JCXByb2Nlc3NUcmVlVmlld2VyLmdldFRyZWUoKS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotCQljcmVhdGVMYWJlbChjb21wb3NpdGUsIExpYnJhcnlVSVJlc291cmNlcy5icmllZkRlc2NyaXB0aW9uTGFiZWxfdGV4dCk7Ci0KLQkJYnJpZWZEZXNjVGV4dCA9IGNyZWF0ZU11bHRpTGluZVRleHQoY29tcG9zaXRlLCAiIiwgMTAwLCA3MCwgMSk7IC8vJE5PTi1OTFMtMSQJCi0KLQkJaW5pdENvbnRyb2xzKCk7Ci0KLQkJc2V0Q29udHJvbChjb21wb3NpdGUpOwotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemVzIHRoZSB3aXphcmQgcGFnZSBjb250cm9scyB3aXRoIGRhdGEuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdENvbnRyb2xzKCkgewotCQlwcm9jZXNzVHJlZVZpZXdlci5zZXRJbnB1dChMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCkpOwotCQlwcm9jZXNzVHJlZVZpZXdlci5leHBhbmRBbGwoKTsKLQotCQlhZGRMaXN0ZW5lcnMoKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIGV2ZW50IGhhbmRsZXJzIHRvIHRoZSB3aXphcmQgcGFnZSBjb250cm9scy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRMaXN0ZW5lcnMoKSB7Ci0JCXByb2Nlc3NUcmVlVmlld2VyCi0JCQkJLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQkJCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQkJCU9iamVjdCBzZWxlY3Rpb24gPSBldmVudC5nZXRTZWxlY3Rpb24oKTsKLQkJCQkJCWlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBUcmVlU2VsZWN0aW9uKSB7Ci0JCQkJCQkJT2JqZWN0IGVsZW1lbnQgPSAoKFRyZWVTZWxlY3Rpb24pIHNlbGVjdGlvbikKLQkJCQkJCQkJCS5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFByb2Nlc3MpIHsKLQkJCQkJCQkJcHJvY2VzcyA9IChQcm9jZXNzKSBlbGVtZW50OwotCQkJCQkJCQlicmllZkRlc2NUZXh0LnNldFRleHQocHJvY2VzcwotCQkJCQkJCQkJCS5nZXRCcmllZkRlc2NyaXB0aW9uKCkpOwotCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCXByb2Nlc3MgPSBudWxsOwotCQkJCQkJCQlicmllZkRlc2NUZXh0LnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJc2V0UGFnZUNvbXBsZXRlKGlzUGFnZUNvbXBsZXRlKCkpOwotCQkJCQkJZ2V0V2l6YXJkKCkuZ2V0Q29udGFpbmVyKCkudXBkYXRlQnV0dG9ucygpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkUGFnZSNpc1BhZ2VDb21wbGV0ZSgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNQYWdlQ29tcGxldGUoKSB7Ci0JCWlmIChMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCkgPT0gbnVsbCkgewotCQkJc2V0RXJyb3JNZXNzYWdlKExpYnJhcnlVSVJlc291cmNlcy5ub09wZW5MaWJyYXJ5V2FybmluZ19tc2cpOwotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJaWYgKGdldEVycm9yTWVzc2FnZSgpICE9IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCXJldHVybiBnZXRQcm9jZXNzKCkgIT0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51aS53aXphcmRzLkJhc2VXaXphcmRQYWdlI2dldE5leHRQYWdlRGF0YSgpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXROZXh0UGFnZURhdGEoKSB7Ci0JCXJldHVybiBnZXRQcm9jZXNzKCk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgdXNlciBzZWxlY3RlZCBwcm9jZXNzLgotCSAqLwotCXB1YmxpYyBQcm9jZXNzIGdldFByb2Nlc3MoKSB7Ci0JCXJldHVybiBwcm9jZXNzOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS93aXphcmRzL3BhY2thZ2UuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS93aXphcmRzL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Y2NjAwZi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvd2l6YXJkcy9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyB3aXphcmRzIGZvciBtYW5hZ2luZyBhIG1ldGhvZCBsaWJyYXJ5LgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS8uY2xhc3NwYXRoIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1MWM4ZjIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkvLm9wdGlvbnMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkvLm9wdGlvbnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxYjc3OGEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pLy5vcHRpb25zCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi0jIFR1cm4gb24gZGVidWcgdHJhY2UgZm9yIHRoZSBYTUkgTGlicmFyeSBwbHVnLWluCi1vcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkvZGVidWc9dHJ1ZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pLy5wcm9qZWN0IGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZjMyNTNkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGVmMDM5Ny4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jTW9uIFNlcCAxMSAxMjozMTo1NyBQRFQgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWVuY29kaW5nLy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkveG1pL1Jlc291cmNlcy5wcm9wZXJ0aWVzPTg4NTlfMQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pL01FVEEtSU5GL01BTklGRVNULk1GIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZDZmNWM3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWk7IHNpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuNS4wLnF1YWxpZmllcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pLlhNSUxpYnJhcnlQbHVnaW4KLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZSwKLSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeSwKLSBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aQotRWNsaXBzZS1MYXp5U3RhcnQ6IHRydWUKLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWksCi0gb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pLnByZWZlcmVuY2VzCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS9idWlsZC5wcm9wZXJ0aWVzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwYjJmYzQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLXNvdXJjZS4uID0gc3JjLwotb3V0cHV0Li4gPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgLixcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkvcGx1Z2luLnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmMmVjN2YuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLQotIyBQbHVnLWluCi1wbHVnaW5OYW1lPUVQRiBYTUkgTGlicmFyeQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkvcGx1Z2luLnhtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkM2U2OTg5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTxwbHVnaW4+Ci0gICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJkaWFncmFtTWlncmF0aW9uIiBuYW1lPSJEaWFncmFtIE1pZ3JhdGlvbiIgc2NoZW1hPSJzY2hlbWEvSURpYWdyYW1NaWdyYXRpb24uZXhzZCIvPgotCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGlicmFyeU1hbmFnZXJzIj4KLSAgICAgIDxsaWJyYXJ5TWFuYWdlcgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS5YTUlMaWJyYXJ5TWFuYWdlciIgICAgICAgCQkKLSAgICAgICAgICAgIHR5cGU9InhtaSIKLSAgICAgICAgICAgIHR5cGVOYW1lPSJYTUkiPgotICAgICAgPC9saWJyYXJ5TWFuYWdlcj4gICAgIAotICAgPC9leHRlbnNpb24+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5vcHBvc2l0ZUZlYXR1cmVMb2FkZXJzIj4KLSAgICAgIDxvcHBvc2l0ZUZlYXR1cmVMb2FkZXIgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS5pbnRlcm5hbC5YTUlPcHBvc2l0ZUZlYXR1cmVMb2FkZXIiLz4KLSAgIDwvZXh0ZW5zaW9uPgotCi08L3BsdWdpbj4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS9zY2hlbWEvSURpYWdyYW1NaWdyYXRpb24uZXhzZCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS9zY2hlbWEvSURpYWdyYW1NaWdyYXRpb24uZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzE1YmU1Yy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkvc2NoZW1hL0lEaWFncmFtTWlncmF0aW9uLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pIj4KLTxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkiIGlkPSJJRGlhZ3JhbU1pZ3JhdGlvbiIgbmFtZT0iRGlhZ3JhbSBNaWdyYXRpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgUHJvdmlkZSBkaWFncmFtIG1pZ3JhdGlvbiBBUEkuCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8Y2hvaWNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJkaWFncmFtTWlncmF0aW9uIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgICAgICAgPC9jaG9pY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSB0cmFuc2xhdGFibGU9InRydWUiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0iZGlhZ3JhbU1pZ3JhdGlvbiI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAxLjIKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIGV4dGVuc2lvbiBwb2ludCB1c2FnZSBleGFtcGxlIGhlcmUuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS5JRGlhZ3JhbU1pZ3JhdGlvbgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgaW5mb3JtYXRpb24gYWJvdXQgc3VwcGxpZWQgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBleHRlbnNpb24gcG9pbnQuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotPC9zY2hlbWE+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3htaS9JRGlhZ3JhbU1pZ3JhdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS94bWkvSURpYWdyYW1NaWdyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTJmYzcwNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3htaS9JRGlhZ3JhbU1pZ3JhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M7Ci0KLS8qKgotICogSW50ZXJmYWNlIGZvciBkaWdyYW0gbWlncmF0aW9uIAotICogCi0gKiBAYXV0aG9yIFdlaXBpbmcgTHUgLSBNYXJjaCAxOSwgMjAwNwotICogQHNpbmNlICAxLjIKLSAqLwotcHVibGljIGludGVyZmFjZSBJRGlhZ3JhbU1pZ3JhdGlvbiB7Ci0KLQl2b2lkIG1pZ3JhdGUoQ29sbGVjdGlvbjxQcm9jZXNzPiBwcm9jZXNzZXMpIHRocm93cyBFeGNlcHRpb247Ci0JCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS94bWkvUmVzb3VyY2VzLnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3htaS9SZXNvdXJjZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzgwY2Y2Yy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3htaS9SZXNvdXJjZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSCi0KLWZpbGVQYXRoPUZpbGUgcGF0aAotY2Fubm90V3JpdGVUb0ZpbGVzPUNhbm5vdCB3cml0ZSB0byBmaWxlKHMpCi1yZWFkT25seUZpbGVzX3RpdGxlPVJlYWQtb25seSBmaWxlKHMpCi1yZWFkT25seUZpbGVzX21zZz1UaGUgZmlsZXMgbGlzdGVkIGluIERldGFpbHMgYXJlIHJlYWQtb25seS4gTWFrZSB0aGVtIHdyaXRhYmxlIGFuZCBjbGljayBvbiBSZXRyeSB0byBjb250aW51ZS4KLWVsZW1lbnRQYXRoPUVsZW1lbnQgcGF0aAotcHJvbXB0UmVtb3ZlUmVmZXJlbmNlc1RvTWlzc2luZ0ZpbGVzX21zZz1UaGUgZm9sbG93aW5nIGZpbGVzIGFyZSBtaXNzaW5nLiBDbGljayBPSyBpZiB5b3Ugd2FudCB0byByZW1vdmUgZXZlcnkgcmVmZXJlbmNlIHRvIHRoZSBzZWxlY3RlZCBmaWxlcyBpbiB0aGUgbGlicmFyeQotbWlzc2luZ0ZpbGVzX3RpdGxlPU1pc3NpbmcgZmlsZShzKQotbG9hZEVycm9yPUxvYWQgZXJyb3IKLXByb21wdFJlbW92ZVJlZmVyZW5jZXNUb0ZpbGVzV2l0aExvYWRFcnJvcnNfbXNnPVRoZSBmb2xsb3dpbmcgZmlsZShzKSBjb3VsZCBub3QgYmUgbG9hZGVkLiBDbGljayBPSyBpZiB5b3Ugd2FudCB0byByZW1vdmUgZXZlcnkgcmVmZXJlbmNlIHRvIHRoZSBzZWxlY3RlZCBmaWxlcyBpbiB0aGUgbGlicmFyeQotZmlsZXNXaXRoTG9hZEVycm9yc190aXRsZT1GaWxlKHMpIHdpdGggbG9hZCBlcnJvcgotbWlncmF0ZVhNTExpYnJhcnlfdGFza05hbWU9TWlncmF0aW5nIFhNTCBpbXBvcnRlZCBsaWJyYXJ5Ci0KLSMgRXJyb3IgTWVzc2FnZXMKLWxpYnJhcnlBbHJlYWR5RXhpc3RzRXJyb3JfbXNnPUEgbWV0aG9kIGxpYnJhcnkgYWxyZWFkeSBleGlzdHMgaW4gJyd7MH0nJy4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3htaS9YTUlMaWJyYXJ5TWFuYWdlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS94bWkvWE1JTGlicmFyeU1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGIwZmUwYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3htaS9YTUlMaWJyYXJ5TWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDk0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaTsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUnVubmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24uc2VydmljZS52ZXJzaW9uaW5nLlZlcnNpb25VdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24uc2VydmljZWFiaWxpdHkuRGVidWdUcmFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5BYnN0cmFjdExpYnJhcnlNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LklMaWJyYXJ5UmVzb3VyY2VNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlBbHJlYWR5RXhpc3RzRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlOb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5MYXlvdXRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UuSUxpYnJhcnlSZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucHJvamVjdC5NZXRob2RMaWJyYXJ5UHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLk1vZGVsU3RvcmFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UuTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5NdWx0aUZpbGVTYXZlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UubWlncmF0aW9uLk1hcHBpbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS51dGlsLlBlcnNpc3RlbmNlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VydmljZXMuU2VydmljZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLWltcG9ydCBjb20uaWJtLmljdS51dGlsLkNhbGVuZGFyOwotCi0vKioKLSAqIFRoZSBkZWZhdWx0IFhNSSBMaWJyYXJ5IE1hbmFnZXIgaW1wbGVtZW50YXRpb24uCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiAKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFhNSUxpYnJhcnlNYW5hZ2VyIGV4dGVuZHMgQWJzdHJhY3RMaWJyYXJ5TWFuYWdlciB7Ci0JLyoqCi0JICogVGhlIHN1cHBvcnRlZCBsaWJyYXJ5IHR5cGUuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTElCUkFSWV9UWVBFID0gU2VydmljZXMuWE1JX1BFUlNJU1RFTkNFX1RZUEU7Ci0KLQkvKioKLQkgKiBUaGUgbGlicmFyeSBYTUkgZmlsZSBuYW1lLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExJQlJBUllfWE1JID0gTXVsdGlGaWxlU2F2ZVV0aWwuREVGQVVMVF9MSUJSQVJZX01PREVMX0ZJTEVOQU1FOwotCi0JLyoqCi0JICogVGhlIHBsdWdpbiBhbmQgY29uZmlnIHNwZWMgZXhwb3J0IGZpbGUgbmFtZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBleHBvcnRGaWxlID0gTXVsdGlGaWxlU2F2ZVV0aWwuREVGQVVMVF9QTFVHSU5fRVhQT1JUX0ZJTEVOQU1FOwotCi0JLyoqCi0JICogVGhlIGxpYnJhcnkgcGF0aC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBUkdfTElCUkFSWV9QQVRIID0gImxpYnJhcnkucGF0aCI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvLyBUaGUgYWJzb2x1dGUgcGF0aCB0byB0aGUgbWFuYWdlZCBsaWJyYXJ5LgotCXByb3RlY3RlZCBTdHJpbmcgcGF0aDsKLQkKLQlwcml2YXRlIElMaWJyYXJ5UmVzb3VyY2VNYW5hZ2VyIHJlc291cmNlTWdyOwotCi0JcHJpdmF0ZSBJUHJvamVjdCBwcm9qZWN0OwotCQotCXByaXZhdGUgU3RyaW5nIHJlZ2lzdGVyVHlwZSA9ICJEZWZhdWx0IjsJCS8vJE5PTi1OTFMtMSQgCi0JCi0JcHVibGljIFhNSUxpYnJhcnlNYW5hZ2VyKCkgewotCQlzdXBlcigpOwotCQlyZXNvdXJjZU1nciA9IG5ldyBYTUlMaWJyYXJ5UmVzb3VyY2VNYW5hZ2VyKCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBtZXRob2QgbGlicmFyeS4KLQkgKiAKLQkgKiBAcGFyYW0gbmFtZQotCSAqICAgICAgICAgICAgYSBuYW1lIGZvciB0aGUgbmV3IG1ldGhvZCBsaWJyYXJ5Ci0JICogQHBhcmFtIGFyZ3MKLQkgKiAgICAgICAgICAgIG1ldGhvZCBsaWJyYXJ5IHNwZWNpZmljIGFyZ3VtZW50cwotCSAqIEByZXR1cm4gYSBtZXRob2QgbGlicmFyeQotCSAqIEB0aHJvdyA8Y29kZT5MaWJyYXJ5U2VydmljZUV4Y2VwdGlvbjwvY29kZT4gaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlCi0JICogICAgICAgIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgotCSAqLwotCXB1YmxpYyBNZXRob2RMaWJyYXJ5IGNyZWF0ZU1ldGhvZExpYnJhcnkoZmluYWwgU3RyaW5nIG5hbWUsIGZpbmFsIE1hcDxTdHJpbmcsIE9iamVjdD4gYXJncykKLQkJCXRocm93cyBMaWJyYXJ5U2VydmljZUV4Y2VwdGlvbiB7Ci0JCWZpbmFsIE1ldGhvZExpYnJhcnlbXSByZXN1bHRIb2xkZXIgPSBuZXcgTWV0aG9kTGlicmFyeVsxXTsKLQkJZmluYWwgTGlicmFyeVNlcnZpY2VFeGNlcHRpb25bXSBleGNlcHRpb25Ib2xkZXIgPSBuZXcgTGlicmFyeVNlcnZpY2VFeGNlcHRpb25bMV07Ci0JCUlXb3Jrc3BhY2VSdW5uYWJsZSBhY3Rpb24gPSBuZXcgSVdvcmtzcGFjZVJ1bm5hYmxlKCkgewotCi0JCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCQkJdHJ5IHsKLQkJCQkJcmVzdWx0SG9sZGVyWzBdID0gZG9DcmVhdGVNZXRob2RMaWJyYXJ5KG5hbWUsIGFyZ3MpOwotCQkJCX0KLQkJCQljYXRjaChMaWJyYXJ5U2VydmljZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCWV4Y2VwdGlvbkhvbGRlclswXSA9IGU7Ci0JCQkJfQotCQkJfQotCQkJCi0JCX07Ci0JCXRyeSB7Ci0JCQlJV29ya3NwYWNlIHdvcmtzcGFjZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKTsKLQkJCXdvcmtzcGFjZS5ydW4oYWN0aW9uLCB3b3Jrc3BhY2UuZ2V0UnVsZUZhY3RvcnkoKS5jcmVhdGVSdWxlKHdvcmtzcGFjZS5nZXRSb290KCkpLCBJV29ya3NwYWNlLkFWT0lEX1VQREFURSwgbnVsbCk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJWE1JTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQl0aHJvdyBuZXcgTGlicmFyeVNlcnZpY2VFeGNlcHRpb24oZSk7Ci0JCX0KLQkJCi0JCWlmKGV4Y2VwdGlvbkhvbGRlclswXSAhPSBudWxsKSB7Ci0JCQl0aHJvdyBleGNlcHRpb25Ib2xkZXJbMF07Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdEhvbGRlclswXTsKLQl9Ci0JCQotCXByaXZhdGUgTWV0aG9kTGlicmFyeSBkb0NyZWF0ZU1ldGhvZExpYnJhcnkoU3RyaW5nIG5hbWUsIE1hcDxTdHJpbmcsIE9iamVjdD4gYXJncykKLQl0aHJvd3MgTGlicmFyeVNlcnZpY2VFeGNlcHRpb24gewotCQlpZiAoZGVidWcpIHsKLQkJCURlYnVnVHJhY2UucHJpbnQodGhpcywgImNyZWF0ZU1ldGhvZExpYnJhcnkiLCAibmFtZT0iICsgbmFtZSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0KLQkJaWYgKG5hbWUgPT0gbnVsbCB8fCBuYW1lLmxlbmd0aCgpID09IDAgfHwgYXJncyA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0JCX0KLQotCQlTdHJpbmcgcGF0aCA9IChTdHJpbmcpIGFyZ3MuZ2V0KEFSR19MSUJSQVJZX1BBVEgpOwotCQlpZiAocGF0aCA9PSBudWxsIHx8IHBhdGgubGVuZ3RoKCkgPT0gMCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotCQl9Ci0KLQkJRmlsZSBsaWJyYXJ5UGF0aCA9IG5ldyBGaWxlKHBhdGgpOwotCQlGaWxlIGxpYnJhcnlYTUlGaWxlID0gbmV3IEZpbGUobGlicmFyeVBhdGgsIExJQlJBUllfWE1JKTsKLQkJaWYgKGxpYnJhcnlYTUlGaWxlLmV4aXN0cygpKSB7Ci0JCQlTdHJpbmcgbXNnID0gTkxTLmJpbmQoCi0JCQkJCVhNSUxpYnJhcnlSZXNvdXJjZXMubGlicmFyeUFscmVhZHlFeGlzdHNFcnJvcl9tc2csCi0JCQkJCWxpYnJhcnlQYXRoLmdldEFic29sdXRlUGF0aCgpKTsKLQkJCXRocm93IG5ldyBMaWJyYXJ5QWxyZWFkeUV4aXN0c0V4Y2VwdGlvbihtc2cpOwotCQl9Ci0KLQkJaWYgKCFsaWJyYXJ5UGF0aC5leGlzdHMoKSkgewotCQkJbGlicmFyeVBhdGgubWtkaXJzKCk7Ci0JCX0KLQotCQl0cnkgewotCQkJc2tpcEV2ZW50UHJvY2Vzc2luZyA9IHRydWU7Ci0JCQlTdHJpbmcgcmVnVHlwZSA9IChTdHJpbmcpIGFyZ3MuZ2V0KEFSR19MSUJSQVJZX1JFR0lTVEVSX1RZUEUpOwotCQkJaWYgKHJlZ1R5cGUgIT0gbnVsbCAmJiByZWdUeXBlLmVxdWFscygiQ29uZmlnRXhwb3J0IikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCVN0cmluZyB0aW1lID0gTG9uZy50b0hleFN0cmluZyhDYWxlbmRhci5nZXRJbnN0YW5jZSgpLmdldFRpbWVJbk1pbGxpcygpKTsKLQkJCQlNZXRob2RMaWJyYXJ5UHJvamVjdC5vcGVuUHJvamVjdChsaWJyYXJ5UGF0aC5nZXRBYnNvbHV0ZVBhdGgoKSwgIkV4cG9ydExpYiIgKyB0aW1lLCAvLyROT04tTkxTLTEkCi0JCQkJCQludWxsKTsJCQotCQkJfSBlbHNlIHsgCQkJCQotCQkJCS8vIE9wZW4gdGhlIG1ldGhvZCBsaWJyYXJ5IHByb2plY3QgZmlsZS4KLQkJCQlwcm9qZWN0ID0gTWV0aG9kTGlicmFyeVByb2plY3Qub3BlblByb2plY3QobGlicmFyeVBhdGguZ2V0QWJzb2x1dGVQYXRoKCksCi0JCQkJCQludWxsKTsKLQkJCX0KLQkJCS8vIENyZWF0ZSB0aGUgcmVzb3VyY2Ugc2V0LgotCQkJSUxpYnJhcnlSZXNvdXJjZVNldCByZXNvdXJjZVNldCA9IChJTGlicmFyeVJlc291cmNlU2V0KSBlZGl0aW5nRG9tYWluCi0JCQkJCS5nZXRSZXNvdXJjZVNldCgpOwotCi0JCQkvLyBDcmVhdGUgYSBuZXcgbWV0aG9kIGxpYnJhcnkuCi0JCQlNb2RlbFN0b3JhZ2UubmV3TGlicmFyeShyZXNvdXJjZVNldCwgbmFtZSwgbGlicmFyeVBhdGgKLQkJCQkJLmdldEFic29sdXRlUGF0aCgpLCB0cnVlKTsKLQkJCWxpYnJhcnkgPSByZXNvdXJjZVNldC5nZXRGaXJzdE1ldGhvZExpYnJhcnkoKTsKLQotCQkJLy8gQWRkIGEgbGlzdGVuZXIgdG8gbW9uaXRvciBsaWJyYXJ5IHJlc291cmNlIGNoYW5nZXMuCi0JCQlhZGRSZXNvdXJjZUNoYW5nZWRMaXN0ZW5lcnMoKTsKLQotCQkJaWYgKGRlYnVnKSB7Ci0JCQkJRGVidWdUcmFjZS5wcmludCh0aGlzLAotCQkJCQkJImNyZWF0ZU1ldGhvZExpYnJhcnkiLCAibGlicmFyeT0iICsgbGlicmFyeSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJfQotCi0JCQlyZXR1cm4gbGlicmFyeTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBMaWJyYXJ5U2VydmljZUV4Y2VwdGlvbihlKTsKLQkJfSBmaW5hbGx5IHsKLQkJCXNraXBFdmVudFByb2Nlc3NpbmcgPSBmYWxzZTsKLQotCQkJLy8gLy8gZXZlbnQgcHJvY2Vzc2VkIGluIExpYnJhcnlTZXJ2aWNlCi0JCQkvLyBub3RpZnlMaXN0ZW5lcnMoSUxpYnJhcnlDaGFuZ2VMaXN0ZW5lci5PUFRJT05fQ1JFQVRFRCwgbnVsbCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBPcGVucyBhIG1ldGhvZCBsaWJyYXJ5LgotCSAqIAotCSAqIEBwYXJhbSB1cmkKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGxpYnJhcnkgVVJJCi0JICogQHJldHVybiBhIG1ldGhvZCBsaWJyYXJ5Ci0JICogQHRocm93IDxjb2RlPkxpYnJhcnlTZXJ2aWNlRXhjZXB0aW9uPC9jb2RlPiBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUKLQkgKiAgICAgICAgcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCi0JICovCi0JcHVibGljIE1ldGhvZExpYnJhcnkgb3Blbk1ldGhvZExpYnJhcnkoamF2YS5uZXQuVVJJIHVyaSkKLQkJCXRocm93cyBMaWJyYXJ5U2VydmljZUV4Y2VwdGlvbiB7Ci0JCWlmIChkZWJ1ZykgewotCQkJRGVidWdUcmFjZS5wcmludCh0aGlzLCAib3Blbk1ldGhvZExpYnJhcnkiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJaWYgKHVyaSA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0JCX0KLQotCQl0cnkgewotCQkJRmlsZSBmaWxlID0gbmV3IEZpbGUodXJpKTsKLQkJCWxpYnJhcnkgPSBvcGVuTWV0aG9kTGlicmFyeShmaWxlKTsKLQkJfSAKLQkJY2F0Y2goTGlicmFyeVNlcnZpY2VFeGNlcHRpb24gZSkgewotCQkJdGhyb3cgZTsKLQkJfQotCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWxpYnJhcnkgPSBudWxsOwotCQl9Ci0KLQkJaWYgKGRlYnVnKSB7Ci0JCQlEZWJ1Z1RyYWNlLnByaW50KHRoaXMsICJvcGVuTWV0aG9kTGlicmFyeSIsICJsaWJyYXJ5PSIgKyBsaWJyYXJ5KTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQotCQlyZXR1cm4gbGlicmFyeTsKLQl9Ci0KLQkvKioKLQkgKiBPcGVucyBhIG1ldGhvZCBsaWJyYXJ5LgotCSAqIAotCSAqIEBwYXJhbSBwYXRoCi0JICogICAgICAgICAgICBhIDxjb2RlPkZpbGU8L2NvZGU+IG9iamVjdCB0aGF0IGNvbnRhaW5zIHRoZSBwYXRoIHRvIHRoZQotCSAqICAgICAgICAgICAgbWV0aG9kIGxpYnJhcnkuCi0JICogQHJldHVybiBhIDxjb2RlPk1ldGhvZExpYnJhcnk8L2NvZGU+LgotCSAqIEB0aHJvdyA8Y29kZT5MaWJyYXJ5U2VydmljZUV4Y2VwdGlvbjwvY29kZT4gaWYgYW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUKLQkgKiAgICAgICAgcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBNZXRob2RMaWJyYXJ5IG9wZW5NZXRob2RMaWJyYXJ5KEZpbGUgcGF0aCkKLQkJCXRocm93cyBMaWJyYXJ5U2VydmljZUV4Y2VwdGlvbiB7Ci0JCUZpbGUgbGlicmFyeVhNSUZpbGUgPSBuZXcgRmlsZShwYXRoLCBMSUJSQVJZX1hNSSk7Ci0JCWlmICghbGlicmFyeVhNSUZpbGUuZXhpc3RzKCkpIHsKLQkJCXRocm93IG5ldyBMaWJyYXJ5Tm90Rm91bmRFeGNlcHRpb24oKTsKLQkJfQotCi0JCVZlcnNpb25VdGlsLlZlcnNpb25DaGVja0luZm8gaW5mbyA9IFZlcnNpb25VdGlsLmNoZWNrTGlicmFyeVZlcnNpb24obGlicmFyeVhNSUZpbGUpOwotCQlJU3RhdHVzIHN0YXR1cyA9IFhNSUxpYnJhcnlVdGlsLmNoZWNrVmVyc2lvbihsaWJyYXJ5WE1JRmlsZSwgaW5mbyk7Ci0JCWlmKCFzdGF0dXMuaXNPSygpKSB7Ci0JCQl0aHJvdyBuZXcgTGlicmFyeVNlcnZpY2VFeGNlcHRpb24oc3RhdHVzLmdldE1lc3NhZ2UoKSk7Ci0JCX0KLQkJZWxzZSBpZihNYXBwaW5nVXRpbC5jb252ZXJzaW9uUmVxdWlyZWQobGlicmFyeVhNSUZpbGUuZ2V0QWJzb2x1dGVQYXRoKCksIGluZm8pKSB7Ci0JCQl0aHJvdyBuZXcgTGlicmFyeVNlcnZpY2VFeGNlcHRpb24oTGlicmFyeVJlc291cmNlcy5saWJVcGdyYWRlUmVxdWlyZWRfZXJyX21zZyk7Ci0JCX0KLQkJCi0JCXRyeSB7Ci0JCQlza2lwRXZlbnRQcm9jZXNzaW5nID0gdHJ1ZTsKLQotCQkJLy8gT3BlbiB0aGUgbWV0aG9kIGxpYnJhcnkgcHJvamVjdCBmaWxlLgotCQkJcHJvamVjdCA9IE1ldGhvZExpYnJhcnlQcm9qZWN0Lm9wZW5Qcm9qZWN0KHBhdGguZ2V0QWJzb2x1dGVQYXRoKCksIG51bGwpOwotCi0JCQkvLyBDcmVhdGUgdGhlIHJlc291cmNlIHNldC4KLQkJCUlMaWJyYXJ5UmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQgPSAoKElMaWJyYXJ5UmVzb3VyY2VTZXQpIGVkaXRpbmdEb21haW4KLQkJCQkJLmdldFJlc291cmNlU2V0KCkpOwotCi0JCQkvLyBMb2FkIHRoZSBtZXRob2QgbGlicmFyeS4KLQkJCXJlc291cmNlU2V0LmxvYWRNZXRob2RMaWJyYXJpZXMoVVJJLmNyZWF0ZUZpbGVVUkkobGlicmFyeVhNSUZpbGUKLQkJCQkJLmdldEFic29sdXRlUGF0aCgpKSwgQ29sbGVjdGlvbnMuRU1QVFlfTUFQKTsKLQkJCWxpYnJhcnkgPSByZXNvdXJjZVNldC5nZXRGaXJzdE1ldGhvZExpYnJhcnkoKTsKLQotCQkJLy8gQWRkIGEgbGlzdGVuZXIgdG8gbW9uaXRvciBsaWJyYXJ5IHJlc291cmNlIGNoYW5nZXMuCi0JCQlhZGRSZXNvdXJjZUNoYW5nZWRMaXN0ZW5lcnMoKTsKLQotCQkJU3lzdGVtLmdjKCk7Ci0JCQkKLQkJCXJldHVybiBsaWJyYXJ5OwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJaWYgKGRlYnVnKSB7Ci0JCQkJRGVidWdUcmFjZS5wcmludChlKTsKLQkJCX0KLQkJCXRocm93IG5ldyBMaWJyYXJ5U2VydmljZUV4Y2VwdGlvbihlKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWZpcmVQcm9wZXJ0eUNoYW5nZShsaWJyYXJ5LCBQUk9QX0RJUlRZKTsKLQkJCXNraXBFdmVudFByb2Nlc3NpbmcgPSBmYWxzZTsKLQkJfQotCX0KLQotCS8qKgotCSAqIE9wZW5zIGEgbWV0aG9kIGxpYnJhcnkuCi0JICogCi0JICogQHBhcmFtIGFyZ3MKLQkgKiAgICAgICAgICAgIG1ldGhvZCBsaWJyYXJ5IHNwZWNpZmljIGFyZ3VtZW50cwotCSAqIEByZXR1cm4gYSBtZXRob2QgbGlicmFyeQotCSAqIEB0aHJvdyA8Y29kZT5MaWJyYXJ5U2VydmljZUV4Y2VwdGlvbjwvY29kZT4gaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlCi0JICogICAgICAgIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgotCSAqLwotCXB1YmxpYyBNZXRob2RMaWJyYXJ5IG9wZW5NZXRob2RMaWJyYXJ5KE1hcCBhcmdzKQotCQkJdGhyb3dzIExpYnJhcnlTZXJ2aWNlRXhjZXB0aW9uIHsKLQkJaWYgKGRlYnVnKSB7Ci0JCQlEZWJ1Z1RyYWNlLnByaW50KHRoaXMsICJvcGVuTWV0aG9kTGlicmFyeSIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlpZiAoYXJncyA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0JCX0KLQotCQlTdHJpbmcgcGF0aCA9IChTdHJpbmcpIGFyZ3MuZ2V0KEFSR19MSUJSQVJZX1BBVEgpOwotCQlpZiAocGF0aCA9PSBudWxsIHx8IHBhdGgubGVuZ3RoKCkgPT0gMCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotCQl9Ci0KLQkJbGlicmFyeSA9IG9wZW5NZXRob2RMaWJyYXJ5KG5ldyBGaWxlKHBhdGgpKTsKLQotCQlpZiAoZGVidWcpIHsKLQkJCURlYnVnVHJhY2UucHJpbnQodGhpcywgIm9wZW5NZXRob2RMaWJyYXJ5IiwgImxpYnJhcnk9IiArIGxpYnJhcnkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCi0JCXJldHVybiBsaWJyYXJ5OwotCX0KLQotCS8qKgotCSAqIFJlb3BlbnMgdGhlIG1hbmFnZWQgbWV0aG9kIGxpYnJhcnkuCi0JICogCi0JICogQHJldHVybiBhIG1ldGhvZCBsaWJyYXJ5Ci0JICogQHRocm93IDxjb2RlPkxpYnJhcnlTZXJ2aWNlRXhjZXB0aW9uPC9jb2RlPiBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUKLQkgKiAgICAgICAgcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCi0JICovCi0JcHVibGljIE1ldGhvZExpYnJhcnkgcmVvcGVuTWV0aG9kTGlicmFyeSgpIHRocm93cyBMaWJyYXJ5U2VydmljZUV4Y2VwdGlvbiB7Ci0JCWlmIChkZWJ1ZykgewotCQkJRGVidWdUcmFjZS5wcmludCh0aGlzLCAicmVvcGVuTWV0aG9kTGlicmFyeSIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlsaWJyYXJ5ID0gb3Blbk1ldGhvZExpYnJhcnkobmV3IEZpbGUoZ2V0TWV0aG9kTGlicmFyeUxvY2F0aW9uKCkpKTsKLQotCQlpZiAoZGVidWcpIHsKLQkJCURlYnVnVHJhY2UucHJpbnQodGhpcywgInJlb3Blbk1ldGhvZExpYnJhcnkiLCAibGlicmFyeT0iICsgbGlicmFyeSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0KLQkJcmV0dXJuIGxpYnJhcnk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5BYnN0cmFjdExpYnJhcnlNYW5hZ2VyI2dldExpYnJhcnlQZXJzaXN0ZXJUeXBlKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldExpYnJhcnlQZXJzaXN0ZXJUeXBlKCkgewotCQlyZXR1cm4gU2VydmljZXMuWE1JX1BFUlNJU1RFTkNFX1RZUEU7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5BYnN0cmFjdExpYnJhcnlNYW5hZ2VyI2NyZWF0ZVJlc291cmNlU2V0KCkKLQkgKi8KLQlwcm90ZWN0ZWQgSUxpYnJhcnlSZXNvdXJjZVNldCBjcmVhdGVSZXNvdXJjZVNldCgpIHsKLQkJcmV0dXJuIFBlcnNpc3RlbmNlU2VydmljZS5JTlNUQU5DRQotCQkJCS5jcmVhdGVSZXNvdXJjZVNldChTZXJ2aWNlcy5YTUlfUEVSU0lTVEVOQ0VfVFlQRSk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgYWJzb2x1dGUgcGF0aCB0byB0aGUgbWFuYWdlZCBtZXRob2QgbGlicmFyeS4KLQkgKiBGb3IgZGlzdHJpYnV0ZWQgbGlicmFyeSwgdGhpcyBpcyB0aGUgbGlicmFyeSdzIHdvcmtzcGFjZSBwYXRoLgotCSAqIAotCSAqIEByZXR1cm4gYW4gYWJzb2x1dGUgcGF0aCB0byB0aGUgbWV0aG9kIGxpYnJhcnkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE1ldGhvZExpYnJhcnlMb2NhdGlvbigpIHsKLQkJaWYgKGRlYnVnKSB7Ci0JCQlEZWJ1Z1RyYWNlLnByaW50KHRoaXMsICJnZXRNZXRob2RMaWJyYXJ5UGF0aCIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlqYXZhLm5ldC5VUkkgbGlicmFyeVVSSSA9IGdldE1ldGhvZExpYnJhcnlVUkkoKTsKLQkJaWYgKGxpYnJhcnlVUkkgIT0gbnVsbCkgewotCQkJRmlsZSBsaWJyYXJ5WE1JRmlsZSA9IG5ldyBGaWxlKGxpYnJhcnlVUkkpOwotCQkJaWYgKGxpYnJhcnlYTUlGaWxlLmdldE5hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKExJQlJBUllfWE1JKSkgewotCQkJCWxpYnJhcnlYTUlGaWxlID0gbGlicmFyeVhNSUZpbGUuZ2V0UGFyZW50RmlsZSgpOwotCQkJfQotCQkJcmV0dXJuIGxpYnJhcnlYTUlGaWxlLmdldEFic29sdXRlUGF0aCgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKioKLQkgKiBHZXRzIHRoZSBwcm9qZWN0IG9mIHRoZSBtZXRob2QgbGlicmFyeSBtYW5hZ2VkIGJ5IHRoaXMgbWFuYWdlci4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBtZXRob2QgbGlicmFyeSBwcm9qZWN0Ci0JICovCi0JcHVibGljIElQcm9qZWN0IGdldE1ldGhvZExpYnJhcnlQcm9qZWN0KCkgewotCQlyZXR1cm4gcHJvamVjdDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgaGFuZGxlTGlicmFyeU1vdmVkKCkgewotCQlpZihsaWJyYXJ5ID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQlTdHJpbmcgbG9jYXRpb24gPSBnZXRNZXRob2RMaWJyYXJ5TG9jYXRpb24oKTsKLQkJaWYoIXByb2plY3QuaXNPcGVuKCkgfHwgcHJvamVjdC5nZXRMb2NhdGlvbigpLmVxdWFscyhuZXcgUGF0aChsb2NhdGlvbikpKSB7Ci0JCQkvLyBub3QgbW92ZWQKLQkJCS8vCi0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCS8vIHVwZGF0ZSBVUkkgb2YgYWxsIGxpYnJhcnkgcmVzb3VyY2VzCi0JCS8vCi0JCVJlc291cmNlIGxpYlJlc291cmNlID0gbGlicmFyeS5lUmVzb3VyY2UoKTsKLQkJaWYobGliUmVzb3VyY2UgPT0gbnVsbCB8fCBsaWJSZXNvdXJjZS5nZXRSZXNvdXJjZVNldCgpID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQlTdHJpbmcgbmV3TG9jYXRpb24gPSBwcm9qZWN0LmdldExvY2F0aW9uKCkudG9PU1N0cmluZygpOwotCQlpZihsaWJSZXNvdXJjZS5nZXRSZXNvdXJjZVNldCgpIGluc3RhbmNlb2YgTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsKSB7Ci0JCQkoKE11bHRpRmlsZVJlc291cmNlU2V0SW1wbClsaWJSZXNvdXJjZS5nZXRSZXNvdXJjZVNldCgpKS5oYW5kbGVMaWJyYXJ5TW92ZWQobmV3TG9jYXRpb24pOwotCQl9Ci0JCWVsc2UgewotCQkJUGVyc2lzdGVuY2VVdGlsLnJlcGxhY2VVUklQcmVmaXgobmV3IEFycmF5TGlzdDxSZXNvdXJjZT4obGliUmVzb3VyY2UuZ2V0UmVzb3VyY2VTZXQoKS5nZXRSZXNvdXJjZXMoKSksIAotCQkJCQlsb2NhdGlvbiwgbmV3TG9jYXRpb24pOwotCQl9Ci0JfQotCQotCi0JLyoqCi0JICogZ2V0IHRoZSByZXNvdXJjZSBtYW5hZ2VyIGZvciB0aGUgbGlicmFyeQotCSAqIEByZXR1cm4gSUxpYnJhcnlSZXNvdXJjZU1hbmFnZXIKLQkgKi8KLQlwdWJsaWMgSUxpYnJhcnlSZXNvdXJjZU1hbmFnZXIgZ2V0UmVzb3VyY2VNYW5hZ2VyKCkgewotCQlyZXR1cm4gcmVzb3VyY2VNZ3I7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LklMaWJyYXJ5TWFuYWdlciNiYWNrdXBNZXRob2RMaWJyYXJ5KGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgYmFja3VwTWV0aG9kTGlicmFyeShTdHJpbmcgcGF0aCkgewotCQlTdHJpbmcgbGliUGF0aFN0ciA9IGdldE1ldGhvZExpYnJhcnlMb2NhdGlvbigpOwotCQlGaWxlIGxpYlBhdGggPSBuZXcgRmlsZShsaWJQYXRoU3RyKTsKLQkJLy8gZXhjdWRlIHRoZSBub24tbGlicmFyeSBmaWxlcyB0aGF0IG1pZ2h0IGJlIGxvY2tlZCBieSBybWMuCi0JCS8vIHRoZXNlIGZpbGVzIG1heSBjYXVzZSBiYWNrdXAgdG8gZmFpbCBkdWUgdG8gZmlsZSBsb2NrLgotCQlTdHJpbmcgZXhjbHVkZXMgPSAiLmxvY2siOyAvLyROT04tTkxTLTEkCi0JCUxheW91dFJlc291cmNlcy5jb3B5RGlyKGxpYlBhdGgsIG5ldyBGaWxlKHBhdGgpLCAiKioiLCBleGNsdWRlcyk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBnZXRSZWdpc3RlclR5cGUoKSB7Ci0JCXJldHVybiByZWdpc3RlclR5cGU7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldFJlZ2lzdGVyVHlwZShTdHJpbmcgcmVnaXN0ZXJUeXBlKSB7Ci0JCXRoaXMucmVnaXN0ZXJUeXBlID0gcmVnaXN0ZXJUeXBlOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5JTGlicmFyeU1hbmFnZXIjcmVnaXN0ZXJNZXRob2RMaWJyYXJ5KG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeSwgamF2YS51dGlsLk1hcCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWdpc3Rlck1ldGhvZExpYnJhcnkoTWV0aG9kTGlicmFyeSBsaWIsIAotCQkJTWFwPFN0cmluZywgT2JqZWN0PiBwYXJhbXMpIHRocm93cyBMaWJyYXJ5U2VydmljZUV4Y2VwdGlvbiB7Ci0JCVN0cmluZyByZWdUeXBlID0gKFN0cmluZykgcGFyYW1zLmdldChBUkdfTElCUkFSWV9SRUdJU1RFUl9UWVBFKTsKLQkJaWYgKHJlZ1R5cGUgIT0gbnVsbCkgewotCQkJc2V0UmVnaXN0ZXJUeXBlKHJlZ1R5cGUpOwotCQl9Ci0JCXJlZ1R5cGUgPSBnZXRSZWdpc3RlclR5cGUoKTsKLQkJaWYgKHJlZ1R5cGUuZXF1YWxzKCJDb25maWdFeHBvcnQiKSkgey8vJE5PTi1OTFMtMSQgCi0JCQkvL0ZvciBub3csIHN0aWxsIHNpbXBseSB3cmFwaW5nIHVwIG9sZCBpbXBsZW1lbnRhdGlvbiAoY29waWVkIGZyb20gQ29uZmlndXJhdGlvbkV4cG9ydFNlcnZpY2UpIGZvciBzbW9vdGhlciBjaGFuZ2U7IHdpbGwgZGVmaW5ldGx5IGNoYW5nZSBsYXRlcgotCQkJLy9zbyB0aGF0IGNyZWF0aW5nIGEgbmV3IGxpYiB3b3VsZCBub3QgYmUgbmVlZGVkCQkKLQkJCVN0cmluZyBuYW1lID0gImxpYnJhcnkueG1pIjsJLy8kTk9OLU5MUy0xJDsJCi0JCQljcmVhdGVNZXRob2RMaWJyYXJ5KG5hbWUsIHBhcmFtcyk7Ci0JCQlzZXRNZXRob2RMaWJyYXJ5KGxpYik7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCS8vTWluaW11bSBpbXBsZW1lbnRhdGlvbiBmb3IgZGVmYXVsIHJlZ2lzdGVyIHR5cGUsIHRvIG1pbmltaXplIGNhbGxlciBjb2RlIGNoYW5nZQotCQl0aGlzLmxpYnJhcnkgPSBsaWI7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LklMaWJyYXJ5TWFuYWdlciN1blJlZ2lzdGVyTWV0aG9kTGlicmFyeSgpCi0JICovCi0JcHVibGljIHZvaWQgdW5SZWdpc3Rlck1ldGhvZExpYnJhcnkoKSB0aHJvd3MgTGlicmFyeVNlcnZpY2VFeGNlcHRpb24gewotCQlpZiAoZ2V0UmVnaXN0ZXJUeXBlKCkuZXF1YWxzKCJDb25maWdFeHBvcnQiKSkgey8vJE5PTi1OTFMtMSQgCi0JCQljbG9zZU1ldGhvZExpYnJhcnkoKTsKLQkJCXJldHVybjsKLQkJfQotCQkvL01pbmltdW0gaW1wbGVtZW50YXRpb24gZm9yIGRlZmF1bCByZWdpc3RlciB0eXBlLCB0byBtaW5pbWl6ZSBjYWxsZXIgY29kZSBjaGFuZ2UKLQkJdGhpcy5saWJyYXJ5ID0gbnVsbDsKLQl9Ci0JCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS94bWkvWE1JTGlicmFyeVBsdWdpbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS94bWkvWE1JTGlicmFyeVBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MjE2YjljLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkveG1pL1hNSUxpYnJhcnlQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5BYnN0cmFjdEFjdGl2YXRvcjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotLyoqCi0gKiBUaGUgWE1JIExpYnJhcnkgcGx1Zy1pbiBhY3RpdmF0b3IuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgWE1JTGlicmFyeVBsdWdpbiBleHRlbmRzIEFic3RyYWN0QWN0aXZhdG9yIHsKLQotCS8vIFRoZSBzaGFyZWQgcGx1Zy1pbiBpbnN0YW5jZS4KLQlwcml2YXRlIHN0YXRpYyBYTUlMaWJyYXJ5UGx1Z2luIHBsdWdpbjsKLQotCS8qKgotCSAqIERlZmF1bHQgY29uc3RydWN0b3IuCi0JICovCi0JcHVibGljIFhNSUxpYnJhcnlQbHVnaW4oKSB7Ci0JCXN1cGVyKCk7Ci0JCXBsdWdpbiA9IHRoaXM7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmNvcmUucGx1Z2luLkFic3RyYWN0UGx1Z2luI3N0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdGFydChjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuY29yZS5wbHVnaW4uQWJzdHJhY3RQbHVnaW4jc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RvcChjb250ZXh0KTsKLQkJcGx1Z2luID0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaGFyZWQgcGx1Zy1pbiBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFhNSUxpYnJhcnlQbHVnaW4gZ2V0RGVmYXVsdCgpIHsKLQkJcmV0dXJuIHBsdWdpbjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkveG1pL1hNSUxpYnJhcnlSZXNvdXJjZU1hbmFnZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkveG1pL1hNSUxpYnJhcnlSZXNvdXJjZU1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2I2NGUyOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3htaS9YTUlMaWJyYXJ5UmVzb3VyY2VNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5JTGlicmFyeVJlc291cmNlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5MaWJyYXJ5VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UuTWV0aG9kTGlicmFyeVBlcnNpc3RlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VydmljZXMuSUZpbGVCYXNlZExpYnJhcnlQZXJzaXN0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzLklMaWJyYXJ5UGVyc2lzdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci0KLQotLyoqCi0gKiBYTUkgbGlicmFyeSByZXNvdXJjZSBtYW1hZ2VyCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKgotICovCi1wdWJsaWMgY2xhc3MgWE1JTGlicmFyeVJlc291cmNlTWFuYWdlciBpbXBsZW1lbnRzIElMaWJyYXJ5UmVzb3VyY2VNYW5hZ2VyIHsKLQotCXB1YmxpYyBYTUlMaWJyYXJ5UmVzb3VyY2VNYW5hZ2VyKCkgewotCX0KLQotCQotCS8qKgotCSAqIGdldCB0aGUgbG9naWNhbCBwYXRoIG9mIHRoZSBlbGVtZW50IGluIHRoZSBsaWJyYXJ5LAotCSAqIHRoZSBwYXRoIHNob3VsZCBzdGFydCB3aXRoIHRoZSBwbHVnaW4gbmFtZS4gCi0JICogaS5lLiA8cGx1Z2luIG5hbWU+L3BhdGgvdG8vZWxlbWVudAotCSAqIAotCSAqIFRoZSBpbXBsZW1lbnRhdGlvbiBjbGFzcyBzaG91bGQgZW5jYXBzdWxhdGUgdGhlIHBoeXNpY2FsIHN0b3JhZ2UgCi0JICogb2YgdGhlIHJlc291cmNlIGFuZCByZXR1cm4gdGhlIHBhdGggb2YgdGhlIGVsZW1lbnQgc3RhcnQgd2l0aCBpdCdzIHBsdWdpbiBuYW1lCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQgTWV0aG9kRWxlbWVudAotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMb2dpY2FsUGF0aChNZXRob2RFbGVtZW50IGVsZW1lbnQpIHsKLQkJdHJ5IHsKLQkJCVN0cmluZyBwYXRoID0gTWV0aG9kTGlicmFyeVBlcnNpc3Rlci5JTlNUQU5DRS5nZXRFbGVtZW50VmlydHVhbFBhdGgoZWxlbWVudCk7Ci0JCQlpZiAocGF0aCA9PSBudWxsIHx8IHBhdGguZXF1YWxzKCIiKSkgLy8kTk9OLU5MUy0xJAotCQkJewotCQkJCVN5c3RlbS5vdXQKLQkJCQkJCS5wcmludGxuKCJXYXJuaW5nISBObyBQYXRoIGZvciBFbGVtZW50IFsiICsgZWxlbWVudC5nZXRUeXBlKCkuZ2V0TmFtZSgpICsgIjogIiArIGVsZW1lbnQuZ2V0TmFtZSgpICsgIl0iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCXJldHVybiBmaXhQYXRoKHBhdGgpOwotCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQotCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JLyoqCi0JICogZ2V0IHRoZSBlbGVtZW50J3MgYmFjayBwYXRoIG9mIHRoZSBlbGVtZW50IGJhc2VkIG9uIHRoZSBsb2dpY2FsIHBhdGgsIGZvciBleGFtcGxlLAotCSAqICJPcGVuVVBcZ3VpZGFuY2VcY29uY2VwdFxjMS54bWwiLCB0aGUgYmFjayBwYXRoIGlzICIuLy4uLy4uLy4uLyIKLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudCBNZXRob2RFbGVtZW50Ci0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEJhY2tQYXRoKE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgewotCQkvLyBMaW51eDogQnJvd3NpbmcgYW5kIHByZXZpZXcgc2hvd3Mgb25seSBwbGFpbiB0ZXh0LgotCQkvLyBUaGVyZSBhcmUgbm8gaW1hZ2VzL3NlY3Rpb25zCi0JCS8vIGVsZW1lbnQgcGF0aCBzaG91bGQgY2hlY2sgRmlsZS5zZXBhcmF0b3JDaGFyIGluc3RlYWQgb2YgIlwiCi0JCVN0cmluZyBiYWNrUGF0aCA9ICIiOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyBwYXRoID0gZ2V0TG9naWNhbFBhdGgoZWxlbWVudCk7Ci0JCWlmIChwYXRoICE9IG51bGwgJiYgcGF0aC5sZW5ndGgoKSA+IDApIHsKLQkJCWJhY2tQYXRoID0gcGF0aC5yZXBsYWNlKEZpbGUuc2VwYXJhdG9yQ2hhciwgJy8nKS5yZXBsYWNlQWxsKAotCQkJCQkiLio/LyIsICJcXC5cXC4vIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JCXJldHVybiAiLi8iICsgYmFja1BhdGg7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JLyoqCi0JICogZml4IHRoZSBwYXRoIGJ5IGFwcGVuZGluZyBhIEZpbGUuc2VwZXJhdG9yIHRvIHRoZSBlbmQgb2YgaXQKLQkgKiBAcGFyYW0gcGF0aCBTdHJpbmcKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXByaXZhdGUgU3RyaW5nIGZpeFBhdGgoU3RyaW5nIHBhdGgpIHsKLQkJaWYgKHBhdGggPT0gbnVsbCB8fCBwYXRoLmVxdWFscygiIikpIC8vJE5PTi1OTFMtMSQKLQkJewotCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCX0gZWxzZSBpZiAoIXBhdGguZW5kc1dpdGgoRmlsZS5zZXBhcmF0b3IpKSB7Ci0JCQlyZXR1cm4gcGF0aCArIEZpbGUuc2VwYXJhdG9yOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIHBhdGg7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBnZXQgdGhlIGxvZ2ljYWwgcmVzb3VyY2UgcGF0aCBvZiB0aGUgZWxlbWVudCBpbiB0aGUKLQkgKiBsaWJyYXJ5LiB0aGUgcGF0aCBzaG91bGQgc3RhcnQgd2l0aCB0aGUgcGx1Z2luIG5hbWUuIAotCSAqIGkuZS4gPHBsdWdpbiBuYW1lPi9wYXRoL3RvL2VsZW1lbnQvcmVzb3VyY2VzCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQgTWV0aG9kRWxlbWVudAotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMb2dpY2FsUmVzb3VyY2VQYXRoKE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgewotCQlTdHJpbmcgcGF0aCA9IE1ldGhvZExpYnJhcnlQZXJzaXN0ZXIuSU5TVEFOQ0UuZ2VSZXNvdXJjZVZpcnR1YWxQYXRoKGVsZW1lbnQpOwotCQlyZXR1cm4gZml4UGF0aChwYXRoKTsKLQl9Ci0JCi0JLyoqCi0JICogR2V0cyB0aGUgcGh5c2ljYWwgcGF0aCBvZiBhIG1ldGhvZCBlbGVtZW50Ci0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiBAcmV0dXJuIHRoZSBwaHlzaWNhbCBwYXRoIG9mIHRoZSBlbGVtZW50Ci0JICovCi0JcHVibGljIFN0cmluZyBnZXRQaHlzaWNhbFBhdGgoTWV0aG9kRWxlbWVudCBlbGVtZW50KSB7Ci0JCWlmICggZWxlbWVudCA9PSBudWxsICkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJCi0JCUlGaWxlQmFzZWRMaWJyYXJ5UGVyc2lzdGVyIHBlcnNpc3RlciA9IGdldEZpbGVCYXNlZExpYnJhcnlQZXJzaXN0ZXIoZWxlbWVudCk7Ci0JCXJldHVybiBwZXJzaXN0ZXIgIT0gbnVsbCA/IGZpeFBhdGgocGVyc2lzdGVyLmdldEZvbGRlckFic29sdXRlUGF0aChlbGVtZW50KSkgOiBudWxsOwotCX0KLQkKLQkvKioKLQkgKiBHZXRzIHRoZSBhYnNvbHV0ZSBwYXRoIG9mIHRoZSByZXNvdXJjZSBmb2xkZXIgb2YgdGhlIGVsZW1lbnQgaW4gdGhlIGxpYnJhcnkuCi0JICogCi0JICogQHBhcmFtIGUKLQkgKiBAcmV0dXJuIHRoZSBwaHlzaWNhbCByZXNvdXJjZSBwYXRoIG9mIHRoZSBlbGVtZW50Ci0JICovCi0JcHVibGljIFN0cmluZyBnZXRQaHlzaWNhbFJlc291cmNlUGF0aChNZXRob2RFbGVtZW50IGVsZW1lbnQpIHsKLQkJSUZpbGVCYXNlZExpYnJhcnlQZXJzaXN0ZXIgcGVyc2lzdGVyID0gZ2V0RmlsZUJhc2VkTGlicmFyeVBlcnNpc3RlcihlbGVtZW50KTsKLQkJcmV0dXJuIHBlcnNpc3RlciAhPSBudWxsID8gZml4UGF0aChwZXJzaXN0ZXIuZ2V0UmVzb3VyY2VGb2xkZXJQYXRoKGVsZW1lbnQpKSA6IG51bGw7Ci0JfQotCQotCXByaXZhdGUgSUZpbGVCYXNlZExpYnJhcnlQZXJzaXN0ZXIgZ2V0RmlsZUJhc2VkTGlicmFyeVBlcnNpc3RlcihNZXRob2RFbGVtZW50IGVsZW1lbnQpIHsKLQkJUmVzb3VyY2UgcmVzb3VyY2UgPSBlbGVtZW50LmVSZXNvdXJjZSgpOwotCQlpZihyZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQlJTGlicmFyeVBlcnNpc3RlciBwZXJzaXN0ZXIgPSBMaWJyYXJ5U2VydmljZVV0aWwuZ2V0UGVyc2lzdGVyRm9yKHJlc291cmNlKTsKLQkJCWlmKHBlcnNpc3RlciBpbnN0YW5jZW9mIElGaWxlQmFzZWRMaWJyYXJ5UGVyc2lzdGVyKSB7Ci0JCQkJcmV0dXJuICgoSUZpbGVCYXNlZExpYnJhcnlQZXJzaXN0ZXIpcGVyc2lzdGVyKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogZ2V0IHRoZSBsb2dpY2FsIHBhdGggb2YgdGhlIHBsdWdpbiAKLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMb2dpY2FsUGx1Z2luUGF0aChNZXRob2RFbGVtZW50IGVsZW1lbnQpIHsKLQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IFVtYVV0aWwuZ2V0TWV0aG9kUGx1Z2luKGVsZW1lbnQpOwotCQlpZiAocGx1Z2luICE9IG51bGwpIHsKLQkJCXJldHVybiBwbHVnaW4uZ2V0TmFtZSgpICsgRmlsZS5zZXBhcmF0b3I7Ci0JCX0gCi0JCQotCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JLyoqCi0JICogZ2V0IHRoZSBwaHlzaWNhbCBwYXRoIG9mIHRoZSBwbHVnaW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBlbGVtZW50Ci0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UGh5c2ljYWxQbHVnaW5QYXRoKE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgewotCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4oZWxlbWVudCk7Ci0JCWlmIChwbHVnaW4gIT0gbnVsbCkgewotCQkJcmV0dXJuIGdldFBoeXNpY2FsUGF0aChwbHVnaW4pOwotCQl9IAotCQkKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JCi0JLyoqCi0JICogZ2V0IHRoZSBwaHlzaWNhbCBwYXRoIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gbG9naWNhbCBwYXRoCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQgTWV0aG9kRWxlbWVudCBhbiBlbGVtZW50IGluIHRoZSBsaWJyYXJ5IHRvIGFjY2VzcyB0aGUgbGlicmFyeSByZXNvdXJjZQotCSAqIHVzdWFsbHkgdGhpcyBpcyB0aGUgb3duZXIgZWxlbWVudCB0aGF0IHJlZmVyZW5jZXMgdGhlIGxvZ2ljYWxQYXRoCi0JICogQHBhcmFtIGxvZ2ljYWxQYXRoIFN0cmluZwotCSAqIEByZXR1cm4gU3RyaW5nIHRoZSBwaHlzaWNhbCBwYXRoIHJlc29sdmVkIGZyb20gdGhlIGxvZ2ljYWwgcGF0aAotCSAqCi0JICogZm9yIGV4YW1wbGUsIGVsZW1lbnQgdGFzazEsIGxvZ2ljYWwgcGF0aCBpcyAicGx1Z2luIDEvdGFza3MvdGFzazEuaHRtbCIKLQkgKiB0aGUgcmV0dXJuZWQgcGh5c2ljYWwgcGF0aCBpcyA8cGx1Z2luIGxvY2F0aW9uPi9wYXRoL3RvL2VsZW1lbnQKLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudCAKLQkgKiBAcGFyYW0gbG9naWNhbFBhdGggdGhlIGxvZ2ljYWwgcGF0aCBvZiB0aGUgZWxlbWVudAotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyByZXNvbHZlKE1ldGhvZEVsZW1lbnQgZWxlbWVudCwgU3RyaW5nIGxvZ2ljYWxQYXRoKSB7Ci0KLQkJLy8gdXNlIHRoZSBwbHVnaW4gbmFtZSBpbiB0aGUgbG9naWNhbCBwYXRoCi0JCS8vIGZpbmQgdGhlIE1ldGhvZFBsdWdpbiBvYmplY3QKLQkJLy8gZmluZCB0aGUgcGx1Z2luUGF0aAotCQkJCQotCQkvLyBzdHJpcCBvZmYgdGhlIGZpcnN0IGZvbGRlciBpbiB0aGUgcmVscGF0aCBzaW5jZSB0aGlzIGlzIHRoZSBwbHVnaW4gbmFtZQotCQlsb2dpY2FsUGF0aCA9IGxvZ2ljYWxQYXRoLnJlcGxhY2UoJy8nLCBGaWxlLnNlcGFyYXRvckNoYXIpOwotCQlpbnQgaSA9IGxvZ2ljYWxQYXRoLmluZGV4T2YoRmlsZS5zZXBhcmF0b3JDaGFyKTsKLQkJaWYgKCBpID4gMCApIHsKLQkJCVN0cmluZyBwbHVnaW5OYW1lID0gbG9naWNhbFBhdGguc3Vic3RyaW5nKDAsIGkpOwotCQkJU3RyaW5nIHBsdWdpblBhdGggPSBudWxsOyAKLQotCQkJTWV0aG9kTGlicmFyeSBsaWIgPSBVbWFVdGlsLmdldE1ldGhvZExpYnJhcnkoZWxlbWVudCk7Ci0JCQlMaXN0IHBsdWdpbnMgPSBMaWJyYXJ5VXRpbC5nZXRNZXRob2RQbHVnaW5zKGxpYik7Ci0JCQkKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBwbHVnaW5zLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTsgKSB7Ci0JCQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IChNZXRob2RQbHVnaW4paXQubmV4dCgpOwotCQkJCWlmICggcGx1Z2luLmdldE5hbWUoKS5lcXVhbHMocGx1Z2luTmFtZSkgKSB7Ci0JCQkJCXBsdWdpblBhdGggPSBnZXRQaHlzaWNhbFBsdWdpblBhdGgocGx1Z2luKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQkJCi0JCQlpZiAoIHBsdWdpblBhdGggIT0gbnVsbCApIHsKLQkJCQlyZXR1cm4gcGx1Z2luUGF0aCArIGxvZ2ljYWxQYXRoLnN1YnN0cmluZyhpKzEpOwotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gbnVsbDsKLQkJCi0JfQotCQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS94bWkvWE1JTGlicmFyeVJlc291cmNlcy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS94bWkvWE1JTGlicmFyeVJlc291cmNlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNTFkYjFhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkveG1pL1hNSUxpYnJhcnlSZXNvdXJjZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLS8qKgotICogVGhlIFhNSSBMaWJyYXJ5IHJlc291cmNlIGJ1bmRsZS4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgWE1JTGlicmFyeVJlc291cmNlcyBleHRlbmRzIE5MUyB7Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgQlVORExFX05BTUUgPSBYTUlMaWJyYXJ5UmVzb3VyY2VzLmNsYXNzLmdldFBhY2thZ2UoKQotCQkJLmdldE5hbWUoKQotCQkJKyAiLlJlc291cmNlcyI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNhbm5vdFdyaXRlVG9GaWxlczsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVsZW1lbnRQYXRoOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZmlsZVBhdGg7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBmaWxlc1dpdGhMb2FkRXJyb3JzX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbG9hZEVycm9yOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbWlzc2luZ0ZpbGVzX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHJvbXB0UmVtb3ZlUmVmZXJlbmNlc1RvRmlsZXNXaXRoTG9hZEVycm9yc19tc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwcm9tcHRSZW1vdmVSZWZlcmVuY2VzVG9NaXNzaW5nRmlsZXNfbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVhZE9ubHlGaWxlc19tc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZWFkT25seUZpbGVzX3RpdGxlOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGxpYnJhcnlBbHJlYWR5RXhpc3RzRXJyb3JfbXNnOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG1pZ3JhdGVYTUxMaWJyYXJ5X3Rhc2tOYW1lOwotCi0Jc3RhdGljIHsKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgWE1JTGlicmFyeVJlc291cmNlcy5jbGFzcyk7Ci0JfQotCi0JcHJpdmF0ZSBYTUlMaWJyYXJ5UmVzb3VyY2VzKCkgewotCQkvLyBEbyBub3QgaW5zdGFudGlhdGUKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkveG1pL1hNSUxpYnJhcnlVdGlsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3htaS9YTUlMaWJyYXJ5VXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMjE2OWFmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkveG1pL1hNSUxpYnJhcnlVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNDkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5zZXJ2aWNlLnZlcnNpb25pbmcuVmVyc2lvblV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5TdHJVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLlJlc291cmNlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UuTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5NdWx0aUZpbGVTYXZlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotLyoqCi0gKiBIZWxwZXIgdXRpbGl0aWVzIGZvciBhY2Nlc3NpbmcgYSBYTUkgbWV0aG9kIGxpYnJhcnkuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFhNSUxpYnJhcnlVdGlsIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFTVBUWV9NRVRIT0RfTElCUkFSWV9QQVRIX01TRyA9IExpYnJhcnlSZXNvdXJjZXMuZW1wdHlMaWJyYXJ5UGF0aEVycm9yX3JlYXNvbjsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNSVNTSU5HX0xJQlJBUllfRklMRV9NU0cgPSBMaWJyYXJ5UmVzb3VyY2VzLm1pc3NpbmdMaWJyYXJ5RmlsZUVycm9yX3JlYXNvbjsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT1VMRF9OT1RfTE9DS19MSUJSQVJZX01TRyA9IExpYnJhcnlSZXNvdXJjZXMuY291bGROb3RMb2NrTGlicmFyeV9yZWFzb247Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIElTdGF0dXMgRU1QVFlfTUVUSE9EX0xJQlJBUllfUEFUSF9TVEFUVVMgPSBuZXcgU3RhdHVzKAotCQkJU3RhdHVzLkVSUk9SLCBMaWJyYXJ5UGx1Z2luLmdldERlZmF1bHQoKS5nZXRJZCgpLCAxLAotCQkJRU1QVFlfTUVUSE9EX0xJQlJBUllfUEFUSF9NU0csIG51bGwpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJU3RhdHVzIE1JU1NJTkdfTElCUkFSWV9GSUxFX1NUQVRVUyA9IG5ldyBTdGF0dXMoCi0JCQlTdGF0dXMuRVJST1IsIExpYnJhcnlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldElkKCksIDEsCi0JCQlNSVNTSU5HX0xJQlJBUllfRklMRV9NU0csIG51bGwpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJU3RhdHVzIENPVUxEX05PVF9MT0NLX0xJQlJBUllfU1RBVFVTID0gbmV3IFN0YXR1cygKLQkJCVN0YXR1cy5FUlJPUiwgTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SWQoKSwgMSwKLQkJCUNPVUxEX05PVF9MT0NLX0xJQlJBUllfTVNHLCBudWxsKTsKLQotCXN0YXRpYyB7Ci0JCXRyeSB7Ci0JCQkvLyBUT0RPOiBUaGlzIGNhbGwgaXMgbmVlZGVkIHRvIGluaXRpYWxpemUgdGhlIHBlcnNpc3RlbmNlIGxheWVyCi0JCQkvLyB0byBhdm9pZCBhIG51bGwgcG9pbnRlciBleGNlcHRpb24gaW4KLQkJCS8vIFBlcnNpc3RlbmNlVXRpbC5jb252ZXJzaW9uUmVxdWlyZWQoKS4gQSBiZXR0ZXIgc29sdXRpb24gaXMKLQkJCS8vIG5lZWRlZC4KLQkJCW5ldyBNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwoKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDaGVja3Mgd2hldGhlciBhIG1ldGhvZCBsaWJyYXJ5IGV4aXN0cyBvbiBhIGdpdmVuIHBhdGguCi0JICogCi0JICogQHBhcmFtIHBhdGgKLQkgKiAgICAgICAgICAgIGFuIGFic29sdXRlIHBhdGggdG8gYSBtZXRob2QgbGlicmFyeQotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGdpdmVuIHBhdGggY29udGFpbnMgYSB2YWxpZCBtZXRob2QKLQkgKiAgICAgICAgIGxpYnJhcnkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaGFzTWV0aG9kTGlicmFyeShTdHJpbmcgcGF0aCkgewotCQlpZiAocGF0aCA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0JCX0KLQotCQlGaWxlIGxpYnJhcnlEaXIgPSBuZXcgRmlsZShwYXRoKTsKLQkJaWYgKCFsaWJyYXJ5RGlyLmV4aXN0cygpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlGaWxlIGxpYnJhcnlGaWxlID0gbmV3IEZpbGUobGlicmFyeURpciwgWE1JTGlicmFyeU1hbmFnZXIuTElCUkFSWV9YTUkpOwotCQlpZiAoIWxpYnJhcnlGaWxlLmV4aXN0cygpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBhYnNvbHV0ZSBwYXRoIHRvIGEgbWV0aG9kIGxpYnJhcnkgbW9kZWwgKGxpYnJhcnkueG1pKSBmaWxlLgotCSAqIAotCSAqIEBwYXJhbSBwYXRoCi0JICogICAgICAgICAgICBhbiBhYnNvbHV0ZSBwYXRoIHRvIGEgbWV0aG9kIGxpYnJhcnkKLQkgKiBAcmV0dXJudCBhbiBhYnNvbHV0ZSBwYXRoIHRvIGEgbWV0aG9kIGxpYnJhcnkgbW9kZWwgZmlsZSAoaWYgb25lIGV4aXN0cykKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRMaWJyYXJ5TW9kZWxGaWxlKFN0cmluZyBwYXRoKSB7Ci0JCWlmICghU3RyVXRpbC5pc0JsYW5rKHBhdGgpKSB7Ci0JCQlTdHJpbmcgbGliUGF0aCA9IG5ldyBGaWxlKHBhdGgpLmdldEFic29sdXRlUGF0aCgpOwotCQkJU3RyaW5nIHN1ZmZpeCA9IEZpbGUuc2VwYXJhdG9yCi0JCQkJCSsgTXVsdGlGaWxlU2F2ZVV0aWwuREVGQVVMVF9MSUJSQVJZX01PREVMX0ZJTEVOQU1FOwotCQkJaWYgKGxpYlBhdGguZW5kc1dpdGgoc3VmZml4KSkgewotCQkJCXJldHVybiBsaWJQYXRoOwotCQkJfSBlbHNlIHsKLQkJCQlyZXR1cm4gbGliUGF0aCArIHN1ZmZpeDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcGF0aDsKLQl9Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZXMgYSBtZXRob2QgbGlicmFyeSBwYXRoLgotCSAqIAotCSAqIEBwYXJhbSBwYXRoCi0JICogICAgICAgICAgICBhbiBhYnNvbHV0ZSBwYXRoIHRvIGEgbWV0aG9kIGxpYnJhcnkKLQkgKiBAcGFyYW0gdmFsaWRhdGVNb2RlbEZpbGUKLQkgKiAgICAgICAgICAgIGlmIDxjb2RlPnRydWU8L2NvZGU+LCB2YWxpZGF0ZSB0aGF0IHRoZSBsaWJyYXJ5LnhtaSBmaWxlCi0JICogICAgICAgICAgICBhbHNvIGV4aXN0cy4KLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBnaXZlbiBwYXRoIGlzIGEgdmFsaWQgbWV0aG9kIGxpYnJhcnkKLQkgKiAgICAgICAgIGZvbGRlcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVN0YXR1cyBpc1ZhbGlkTGlicmFyeShTdHJpbmcgcGF0aCwgYm9vbGVhbiB2YWxpZGF0ZU1vZGVsRmlsZSkgewotCQlpZiAocGF0aCA9PSBudWxsIHx8IHBhdGgudHJpbSgpLmxlbmd0aCgpID09IDApIHsKLQkJCXJldHVybiBFTVBUWV9NRVRIT0RfTElCUkFSWV9QQVRIX1NUQVRVUzsKLQkJfQotCi0JCWlmICh2YWxpZGF0ZU1vZGVsRmlsZSkgewotCQkJRmlsZSBsaWJGaWxlID0gbmV3IEZpbGUoZ2V0TGlicmFyeU1vZGVsRmlsZShwYXRoKSk7Ci0JCQlpZiAoIWxpYkZpbGUuZXhpc3RzKCkpIHsKLQkJCQlyZXR1cm4gTUlTU0lOR19MSUJSQVJZX0ZJTEVfU1RBVFVTOwotCQkJfQotCQl9Ci0KLQkJRmlsZSBsaWJQYXRoID0gbmV3IEZpbGUocGF0aCk7Ci0JCWlmIChwYXRoLmVuZHNXaXRoKE11bHRpRmlsZVNhdmVVdGlsLkRFRkFVTFRfTElCUkFSWV9NT0RFTF9GSUxFTkFNRSkpIHsKLQkJCWxpYlBhdGggPSBsaWJQYXRoLmdldFBhcmVudEZpbGUoKTsKLQkJfQotCi0JCVN0cmluZyBsaWJGdWxsUGF0aCA9IGxpYlBhdGguZ2V0QWJzb2x1dGVQYXRoKCk7Ci0KLQkJaWYgKGxpYkZ1bGxQYXRoLnN0YXJ0c1dpdGgoIlxcIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJLy8gdGhlIGZpcnN0IHBhcnQgbXVzdCBiZSBhIG1hY2hpbmUgbmFtZSwgYW5kIHlvdSBtdXN0IHNwZWNpZnkgYQotCQkJLy8gZm9sZGVyCi0KLQkJCWJvb2xlYW4gaXNWYWxpZCA9IHRydWU7Ci0JCQlTdHJpbmcgdW5jUGF0aDsKLQkJCWludCBpbmRleCA9IGxpYkZ1bGxQYXRoLmluZGV4T2YoRmlsZS5zZXBhcmF0b3JDaGFyLCAyKTsKLQkJCWlmIChpbmRleCA8IDApIHsKLQkJCQlpc1ZhbGlkID0gZmFsc2U7Ci0JCQl9IGVsc2UgewotCQkJCXVuY1BhdGggPSBsaWJGdWxsUGF0aC5zdWJzdHJpbmcoaW5kZXggKyAxKTsKLQkJCQlpZiAodW5jUGF0aC5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJCS8vIG11c3Qgc3BlY2lmeSBhIHZhbGlkIHBhdGgKLQkJCQkJaXNWYWxpZCA9IGZhbHNlOwotCQkJCX0gZWxzZSB7Ci0JCQkJCS8vIHRoZSB0b3AgbGV2ZWwgcGF0aCBtdXN0IGJlIHZhbGlkCi0JCQkJCWluZGV4ID0gbGliRnVsbFBhdGguaW5kZXhPZihGaWxlLnNlcGFyYXRvckNoYXIsIGluZGV4ICsgMSk7Ci0JCQkJCWlmIChpbmRleCA8IDApIHsKLQkJCQkJCXVuY1BhdGggPSBsaWJGdWxsUGF0aDsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCXVuY1BhdGggPSBsaWJGdWxsUGF0aC5zdWJzdHJpbmcoMCwgaW5kZXgpOwotCQkJCQl9Ci0KLQkJCQkJRmlsZSBmID0gbmV3IEZpbGUodW5jUGF0aCk7Ci0JCQkJCWlmICghZi5leGlzdHMoKSkgewotCQkJCQkJaXNWYWxpZCA9IGZhbHNlOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQlpZiAoIWlzVmFsaWQpIHsKLQkJCQkvLyBubyBuZXcgcmVzb3VyY2Ugc3RyaW5nLCB3YWl0IGxhdGVyCi0JCQkJLy8gcmV0dXJuIG5ldyBTdGF0dXMoU3RhdHVzLkVSUk9SLAotCQkJCS8vIExpYnJhcnlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldElkKCksIDEsICJJbnZhbGlkIHBhdGgiLCBudWxsKTsKLQkJCQlyZXR1cm4gRU1QVFlfTUVUSE9EX0xJQlJBUllfUEFUSF9TVEFUVVM7Ci0JCQl9Ci0JCX0KLQotCQkvLyBDaGVjayBmb3IgcHJlc2VuY2Ugb2YgYSAucHJvamVjdCBmaWxlLgotCQlJUHJvamVjdERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWRlc2NyaXB0aW9uID0gUmVzb3VyY2VzUGx1Z2luCi0JCQkJCS5nZXRXb3Jrc3BhY2UoKQotCQkJCQkubG9hZFByb2plY3REZXNjcmlwdGlvbigKLQkJCQkJCQluZXcgUGF0aChsaWJGdWxsUGF0aCArIEZpbGUuc2VwYXJhdG9yCi0JCQkJCQkJCQkrIElQcm9qZWN0RGVzY3JpcHRpb24uREVTQ1JJUFRJT05fRklMRV9OQU1FKSk7Ci0JCQlpZiAoZGVzY3JpcHRpb24gIT0gbnVsbCkgewotCQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCQkJfQotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJfQotCi0JCS8vIElmIGEgLnByb2plY3QgZmlsZSBkb2VzIG5vdCBleGlzdHMsIHVzZSBpdCB0byB2YWxpZGF0ZSB0aGUgcGF0aC4KLQkJLy8gb25seSBjYWxsIHZhbGlkYXRlUHJvamVjdExvY2F0aW9uIGlmIHBhdGggaXMgbm90IG9uIHdvcmtzcGFjZQotCQkvLyBmb3Igc29tZSByZWFzb24sIHZhbGlkYXRlUHJvamVjdExvY2F0aW9uIG9ubHkgd29ya3Mgb24gcGF0aHMgbm90IG9uCi0JCS8vIHRoZSB3b3Jrc3BhY2UKLQkJaWYgKFBsYXRmb3JtLmdldExvY2F0aW9uKCkuaXNQcmVmaXhPZihuZXcgUGF0aChsaWJGdWxsUGF0aCkpKSB7Ci0JCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQkJfQotCQlJUHJvamVjdCBwcm9qZWN0ID0gUmVzb3VyY2VVdGlsLmZpbmRQcm9qZWN0KGxpYkZ1bGxQYXRoKTsKLQkJaWYgKHByb2plY3QgPT0gbnVsbCkgewotCQkJcHJvamVjdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdCgKLQkJCQkJbGliUGF0aC5nZXROYW1lKCkpOwotCQl9Ci0KLQkJcmV0dXJuIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS52YWxpZGF0ZVByb2plY3RMb2NhdGlvbihwcm9qZWN0LAotCQkJCW5ldyBQYXRoKGxpYkZ1bGxQYXRoKSk7Ci0JfQotCi0JLyoqCi0JICogVmFsaWRhdGVzIGEgbWV0aG9kIGxpYnJhcnkgcGF0aC4KLQkgKiAKLQkgKiBAcGFyYW0gcGF0aAotCSAqICAgICAgICAgICAgYW4gYWJzb2x1dGUgcGF0aCB0byBhIG1ldGhvZCBsaWJyYXJ5Ci0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgZ2l2ZW4gcGF0aCBpcyBhIHZhbGlkIG1ldGhvZCBsaWJyYXJ5Ci0JICogICAgICAgICBmb2xkZXIKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElTdGF0dXMgaXNWYWxpZExpYnJhcnkoU3RyaW5nIHBhdGgpIHsKLQkJcmV0dXJuIGlzVmFsaWRMaWJyYXJ5KHBhdGgsIGZhbHNlKTsKLQl9Ci0KLQkvKioKLQkgKiBDaGVja3Mgd2hldGhlciBhIG1ldGhvZCBsaWJyYXJ5IG5lZWRzIHRvIGJlIHVwZ3JhZGVkIHRvIGEgbmV3IGZvcm1hdC4KLQkgKiAKLQkgKiBAcGFyYW0gcGF0aAotCSAqICAgICAgICAgICAgQW4gYWJzb2x1dGUgcGF0aCB0byBhIG1ldGhvZCBsaWJyYXJ5Ci0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgbWV0aG9kIGxpYnJhcnkgbmVlZHMgdG8gYmUgdXBncmFkZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNNZXRob2RMaWJyYXJ5VXBncmFkZVJlcXVpcmVkKFN0cmluZyBwYXRoLAotCQkJVmVyc2lvblV0aWwuVmVyc2lvbkNoZWNrSW5mbyBpbmZvKSB7Ci0JCXJldHVybiBpc01ldGhvZExpYnJhcnlVcGdyYWRlUmVxdWlyZWQocGF0aCwKLQkJCQlYTUlMaWJyYXJ5TWFuYWdlci5MSUJSQVJZX1hNSSwgaW5mbyk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzTWV0aG9kTGlicmFyeVVwZ3JhZGVSZXF1aXJlZChTdHJpbmcgcGF0aCwKLQkJCVN0cmluZyBsaWJYbWksIFZlcnNpb25VdGlsLlZlcnNpb25DaGVja0luZm8gaW5mbykgewotCQlyZXR1cm4gb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLm1pZ3JhdGlvbi5NYXBwaW5nVXRpbAotCQkJCS5jb252ZXJzaW9uUmVxdWlyZWQocGF0aCArIEZpbGUuc2VwYXJhdG9yICsgbGliWG1pLCBpbmZvKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IFhNSSBtZXRob2QgbGlicmFyeS4KLQkgKiAKLQkgKiBAcGFyYW0gbmFtZQotCSAqICAgICAgICAgICAgYSBuYW1lIGZvciB0aGUgbmV3IG1ldGhvZCBsaWJyYXJ5Ci0JICogQHBhcmFtIHBhdGgKLQkgKiAgICAgICAgICAgIGFuIGFic29sdXRlIHBhdGggdG8gYSBtZXRob2QgbGlicmFyeQotCSAqIEByZXR1cm4gYSBtZXRob2QgbGlicmFyeQotCSAqIEB0aHJvdyA8Y29kZT5MaWJyYXJ5U2VydmljZUV4Y2VwdGlvbjwvY29kZT4gaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlCi0JICogICAgICAgIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTWV0aG9kTGlicmFyeSBjcmVhdGVNZXRob2RMaWJyYXJ5KFN0cmluZyBuYW1lLCBTdHJpbmcgcGF0aCkKLQkJCXRocm93cyBMaWJyYXJ5U2VydmljZUV4Y2VwdGlvbiB7Ci0JCU1hcDxTdHJpbmcsIE9iamVjdD4gYXJncyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOwotCQlhcmdzLnB1dChYTUlMaWJyYXJ5TWFuYWdlci5BUkdfTElCUkFSWV9QQVRILCBwYXRoKTsKLQkJcmV0dXJuIExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuY3JlYXRlTWV0aG9kTGlicmFyeShuYW1lLAotCQkJCVhNSUxpYnJhcnlNYW5hZ2VyLkxJQlJBUllfVFlQRSwgYXJncyk7Ci0JfQotCi0JLyoqCi0JICogT3BlbnMgYW4gZXhpc3RpbmcgbWV0aG9kIGxpYnJhcnkuCi0JICogCi0JICogQHBhcmFtIHBhdGgKLQkgKiAgICAgICAgICAgIGFuIGFic29sdXRlIHBhdGggdG8gYSBtZXRob2QgbGlicmFyeQotCSAqIEByZXR1cm4gYSBtZXRob2QgbGlicmFyeQotCSAqIEB0aHJvdyA8Y29kZT5MaWJyYXJ5U2VydmljZUV4Y2VwdGlvbjwvY29kZT4gaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlCi0JICogICAgICAgIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTWV0aG9kTGlicmFyeSBvcGVuTWV0aG9kTGlicmFyeShTdHJpbmcgcGF0aCkKLQkJCXRocm93cyBMaWJyYXJ5U2VydmljZUV4Y2VwdGlvbiB7Ci0JCU1hcDxTdHJpbmcsIE9iamVjdD4gYXJncyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOwotCQlhcmdzLnB1dChYTUlMaWJyYXJ5TWFuYWdlci5BUkdfTElCUkFSWV9QQVRILCBwYXRoKTsKLQkJcmV0dXJuIExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkub3Blbk1ldGhvZExpYnJhcnkoCi0JCQkJWE1JTGlicmFyeU1hbmFnZXIuTElCUkFSWV9UWVBFLCBhcmdzKTsKLQl9Ci0KLQkvKioKLQkgKiBPcGVucyB0aGUgbWV0aG9kIGxpYnJhcnkgcHJvamVjdCBhc3NvY2lhdGVkIHdpdGggYSBtZXRob2QgbGlicmFyeS4KLQkgKiAKLQkgKiBAcGFyYW0gbGlicmFyeQotCSAqICAgICAgICAgICAgYSBtZXRob2QgbGlicmFyeQotCSAqIEBwYXJhbSBtb25pdG9yCi0JICogICAgICAgICAgICBhIHByb2dyZXNzIG1vbml0b3IKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgb3Blbk1ldGhvZExpYnJhcnlQcm9qZWN0KE1ldGhvZExpYnJhcnkgbGlicmFyeSwKLQkJCUlQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlpZiAobGlicmFyeSAhPSBudWxsICYmIGxpYnJhcnkuZVJlc291cmNlKCkgIT0gbnVsbAotCQkJCSYmIGxpYnJhcnkuZVJlc291cmNlKCkuZ2V0VVJJKCkuaXNGaWxlKCkpIHsKLQkJCUlQcm9qZWN0IHByb2plY3QgPSBSZXNvdXJjZVV0aWwuZmluZFByb2plY3QobGlicmFyeSk7Ci0JCQlpZiAocHJvamVjdCAhPSBudWxsICYmICFwcm9qZWN0LmlzT3BlbigpKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJcHJvamVjdC5vcGVuKElSZXNvdXJjZS5CQUNLR1JPVU5EX1JFRlJFU0gsIG1vbml0b3IpOwotCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQlYTUlMaWJyYXJ5UGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDaGVjayBpZiB0aGUgZGlyZWN0b3J5IGdpdmVuIGJ5IHNwZWNpZmllZCBwYXRoIGNvbnRhaW5zIGEgcGx1Z2luIG9yCi0JICogY29uZmlnIHNwZWMgZXhwb3J0IGZpbGUuCi0JICogCi0JICogQHBhcmFtIHBhdGgKLQkgKiAgICAgICAgICAgIGFuIGFic29sdXRlIHBhdGggdG8gYSBtZXRob2QgbGlicmFyeQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjb250YWluc1BsdWdpbk9yQ29uZmlnU3BlY0V4cG9ydEZpbGUoU3RyaW5nIHBhdGgpIHsKLQkJaWYgKHBhdGggPT0gbnVsbCB8fCBwYXRoLnRyaW0oKS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcGF0aCA9IG5ldyBGaWxlKHBhdGgpLmdldEFic29sdXRlUGF0aCgpOwotCQlwYXRoICs9IEZpbGUuc2VwYXJhdG9yICsgWE1JTGlicmFyeU1hbmFnZXIuZXhwb3J0RmlsZTsKLQkJRmlsZSBleHBvcnRGaWxlID0gbmV3IEZpbGUocGF0aCk7Ci0JCXJldHVybiBleHBvcnRGaWxlLmV4aXN0cygpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSVN0YXR1cyBjaGVja1ZlcnNpb24oRmlsZSBmaWxlLAotCQkJVmVyc2lvblV0aWwuVmVyc2lvbkNoZWNrSW5mbyBpbmZvKSB7Ci0JCWlmIChpbmZvICE9IG51bGwgJiYgaW5mby5yZXN1bHQgPiAwKSB7Ci0JCQlTdHJpbmcgbWVzc2FnZTsKLQkJCWlmIChpbmZvLnRvb2xJRC5lcXVhbHMoVmVyc2lvblV0aWwuZ2V0UHJpbWFyeVRvb2xJRCgpKSkgewotCQkJCW1lc3NhZ2UgPSBOTFMuYmluZChMaWJyYXJ5UmVzb3VyY2VzLm9sZFRvb2xWZXJzaW9uX2Vycl9tc2csCi0JCQkJCQluZXcgT2JqZWN0W10geyBQbGF0Zm9ybS5nZXRQcm9kdWN0KCkuZ2V0TmFtZSgpLAotCQkJCQkJCQlpbmZvLnRvb2xWZXJzaW9uLCBmaWxlIH0pOwotCQkJfSBlbHNlIHsKLQkJCQltZXNzYWdlID0gTkxTLmJpbmQoCi0JCQkJCQlMaWJyYXJ5UmVzb3VyY2VzLnRvb2xWZXJzaW9uTWlzbWF0Y2hfZXJyX21zZywKLQkJCQkJCW5ldyBPYmplY3RbXSB7IFBsYXRmb3JtLmdldFByb2R1Y3QoKS5nZXROYW1lKCkgfSk7Ci0JCQl9Ci0JCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBYTUlMaWJyYXJ5UGx1Z2luLmdldERlZmF1bHQoKQotCQkJCQkuZ2V0SWQoKSwgMCwgbWVzc2FnZSwgbnVsbCk7Ci0JCX0KLQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS94bWkvaW50ZXJuYWwvTGlicmFyeVByb2Nlc3Nvci50eHQgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3htaS9pbnRlcm5hbC9MaWJyYXJ5UHJvY2Vzc29yLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmFiNDFhOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3htaS9pbnRlcm5hbC9MaWJyYXJ5UHJvY2Vzc29yLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDEyNDIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEubmlvLmNoYW5uZWxzLkZpbGVMb2NrOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkV2ZW50T2JqZWN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQmFzaWNDb21tYW5kU3RhY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmRTdGFjazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZFN0YWNrTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5XcmFwcGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkFkZENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5DcmVhdGVDaGlsZENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5QYXN0ZUZyb21DbGlwYm9hcmRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5BZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWRBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JTm90aWZ5Q2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlJlZmxlY3RpdmVJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5yZXNvdXJjZS5SZXNvdXJjZUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuRmlsZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklBY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuRmlsdGVyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmV2ZW50cy5JTGlicmFyeUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5FbGVtZW50TGF5b3V0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuTGF5b3V0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnByZWZzLlByZWZlcmVuY2VDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuc2VydmljZXMuTGlicmFyeU1vZGlmaWNhdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5zZXJ2aWNlcy5TYWZlVXBkYXRlQ29udHJvbGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5zZXJ2aWNlcy5WZXJzaW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLkNvcHlBdHRhY2htZW50c1RvTmV3TG9jYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5MaWJyYXJ5VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLkxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLk1vZGVsU3RvcmFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLlJlc291cmNlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UuRmlsZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLk1ldGhvZExpYnJhcnlQZXJzaXN0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLk11bHRpRmlsZVJlc291cmNlU2V0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UuTXVsdGlGaWxlWE1JU2F2ZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLnJlZnJlc2guSVJlZnJlc2hFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UucmVmcmVzaC5JUmVmcmVzaExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5yZWZyZXNoLlJlZnJlc2hKb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0ZhbWlseTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS5pbXBsLk11bHRpUmVzb3VyY2VFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5Bc3NvY2lhdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VydmljZXMudXRpbC5Db250ZW50RGVzY3JpcHRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5JTWV0aG9kTGlicmFyeVBlcnNpc3RlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLklQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuTGlzdGVuZXJMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JUHJvcGVydHlMaXN0ZW5lcjsKLQotLyoqCi0gKiBNYW5hZ2VzIGEgTWV0aG9kIExpYnJhcnkuCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBMaWJyYXJ5UHJvY2Vzc29yIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BfRElSVFkgPSAxOwotCi0JcHVibGljIHN0YXRpYyBMaWJyYXJ5UHJvY2Vzc29yIGluc3RhbmNlID0gbnVsbDsKLQotCXByb3RlY3RlZCBBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW4gZWRpdGluZ0RvbWFpbjsKLQotCS8vIG1haW50YWluIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgY29uZmlndXJhdGlvbgotCS8vIHVzZXIgc2hvdWxkIGNhbGwgc2V0L2dldEN1cnJlbnRDb25maWd1cmF0aW9uKCkgbWV0aG9kcwotCS8vIHByb3RlY3RlZCBTdHJpbmcgY3VycmVudENvbmZpZ05hbWUgPSBudWxsOwotCi0JcHJpdmF0ZSBNYXAgc2F2ZU9wdGlvbnM7Ci0KLQkvLyBwcml2YXRlIE1hcCBzYXZlQXNPcHRpb25zOwotCS8vIHByaXZhdGUgU2V0IGVDbGFzc2VzOwotCi0JcHJpdmF0ZSBMaXN0IGxpc3RlbmVycyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCS8vIGtlZXAgdGhlIGxpc3RlbmVycyB0byBiZSBkZWxldGVkLCBkbyB0aGUgZGVsZXRlIGJlZm9yZSBlYWNoIG5vdGlmaWNhdGlvbgotCS8vIGFuZCBlbXB0eSB0aGlzIGxpc3QuCi0JLy8gZG9uJ3QgZGVsZXRlIGluIHRoZSBtaWRkbGUgb2YgdGhlIG5vdGlmaWNhdGlvbiBzaW5jZSB3ZSBkb24ndCB3YW50IHRvCi0JLy8gY2hhbmdlIHRoZSBsaXN0ZW5lciBsaXN0IGF0IHRoaXMgdGltZQotCXByaXZhdGUgTGlzdCB0bXBfbGlzdGVuZXJzX3RvYmVfZGVsZXRlZCA9IG5ldyBBcnJheUxpc3QoKTsKLQotCS8vIHByaXZhdGUgYm9vbGVhbiBpc011bHRpcGxlRmlsZXMgPSBmYWxzZTsKLQotCS8vIHByaXZhdGUgYm9vbGVhbiBkaXJ0eSA9IGZhbHNlOwotCi0JYm9vbGVhbiBsb2FkZWQgPSBmYWxzZTsKLQotCXByaXZhdGUgYm9vbGVhbiBpbk9wZXJhdGlvbiA9IGZhbHNlOwotCi0JcHJpdmF0ZSBWZXJzaW9uTWFuYWdlciB2ZXJzaW9uTWdyID0gbnVsbDsKLQotCXByaXZhdGUgRWxlbWVudExheW91dE1hbmFnZXIgbGF5b3V0TWdyID0gbnVsbDs7Ci0KLQkvLyBSQVRMQzAwMzg0NTk4IC0gRXhwb3J0OiBJbmZpbml0ZSBsb29wIE51bGxwb2ludGVyRXhjZXB0aW9uIGFmdGVyCi0JLy8gZXhwb3J0aW5nIGFuZCB1bmNoZWNraW5nIHJ1cCBwbHVnaW4gaW4gY29uZmlndXJhdGlvbgotCS8vIGFkZCB0aGlzIGZsYWcgdG8gdHJlYXQgdGhlIGluc3RhbmNlIGFzIHNpbmdsZXRvbiBpbnN0YWNuZSBvciBub3QKLQkvLyBvbmx5IHRoZSBzaW5nbGV0b24gaW5zdGFuY2UgY2FuIGRpc3Bvc2Ugc2hhcmVkIG9iamVjdHMuCi0JcHJpdmF0ZSBib29sZWFuIGlzU2luZ2xldG9uSW5zdGFuY2UgPSBmYWxzZTsKLQotCS8vIHRoZSBsb2NrIG9uIHRoZSBsaWJyYXJ5J3MgLnByb2plY3QgZmlsZQotCXByaXZhdGUgRmlsZUxvY2sgbG9jazsKLQotCS8vVE9ETzogZmluZCBhIGJldHRlciB3YXkgdG8gbm90aWZ5IHRoZSBjaGFuZ2UgaW4gbGlicmFyeSBpbnN0ZWFkIG9mIHJlbHlpbmcgb24gdGhlIGNvbW1hbmQgc3RhY2sgbGlzdGVuZXIKLQlwcml2YXRlIENvbW1hbmRTdGFja0xpc3RlbmVyIGNvbW1hbmRTdGFja0xpc3RlbmVyID0gbmV3IENvbW1hbmRTdGFja0xpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBjb21tYW5kU3RhY2tDaGFuZ2VkKGZpbmFsIEV2ZW50T2JqZWN0IGV2ZW50KSB7Ci0JCQlpZiAoIWluT3BlcmF0aW9uKSB7Ci0JCQkJU2FmZVVwZGF0ZUNvbnRyb2xsZXIuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJLy8gVHJ5IHRvIHNlbGVjdCB0aGUgYWZmZWN0ZWQgb2JqZWN0cy4KLQkJCQkJCS8vCi0JCQkJCQlDb21tYW5kIG1vc3RSZWNlbnRDb21tYW5kID0gTGlicmFyeVV0aWwKLQkJCQkJCQkJLnVud3JhcCgoKENvbW1hbmRTdGFjaykgZXZlbnQuZ2V0U291cmNlKCkpCi0JCQkJCQkJCQkJLmdldE1vc3RSZWNlbnRDb21tYW5kKCkpOwotCi0JCQkJCQlpZiAobW9zdFJlY2VudENvbW1hbmQgIT0gbnVsbCkgewotCQkJCQkJCWlmIChtb3N0UmVjZW50Q29tbWFuZCBpbnN0YW5jZW9mIEFkZENvbW1hbmQpIHsKLQkJCQkJCQkJQWRkQ29tbWFuZCBjbWQgPSAoQWRkQ29tbWFuZCkgbW9zdFJlY2VudENvbW1hbmQ7Ci0JCQkJCQkJCUVPYmplY3Qgb3duZXIgPSBjbWQuZ2V0T3duZXIoKTsKLQkJCQkJCQkJaWYgKG93bmVyIGluc3RhbmNlb2YgTWV0aG9kQ29uZmlndXJhdGlvbikgewotCQkJCQkJCQkJQ29sbGVjdGlvbiBvYmpzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQkJCQkJb2Jqcy5hZGQob3duZXIpOwotCQkJCQkJCQkJbm90aWZ5TGlzdGVuZXJzKAotCQkJCQkJCQkJCQlJTGlicmFyeUNoYW5nZUxpc3RlbmVyLk9QVElPTl9DSEFOR0VELAotCQkJCQkJCQkJCQlvYmpzKTsKLQkJCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJCUNvbGxlY3Rpb24gb2JqcyA9IG1vc3RSZWNlbnRDb21tYW5kLmdldFJlc3VsdCgpOwotCQkJCQkJCQkJbm90aWZ5TGlzdGVuZXJzKAotCQkJCQkJCQkJCQlJTGlicmFyeUNoYW5nZUxpc3RlbmVyLk9QVElPTl9ORVdDSElMRCwKLQkJCQkJCQkJCQkJb2Jqcyk7Ci0JCQkJCQkJCQkKLQkJCQkJCQkJCS8vIHVwZGF0ZSB0aGUgY29uZmlndXJhdGlvbiBzZWxlY3Rpb24gaWYgdGhlCi0JCQkJCQkJCQkvLyBvYmplY3QgaXMgYSBuZXdseSBhZGRlZCBtZXRob2QgcGFja2FnZQotCQkJCQkJCQkJLy8KLQkJCQkJCQkJCWlmIChvd25lciBpbnN0YW5jZW9mIE1ldGhvZFBhY2thZ2UpIHsKLQkJCQkJCQkJCQlvYmpzID0gTGlicmFyeVV0aWwuZ2V0Q29udGFpbmVkRWxlbWVudHMob3duZXIsIG9ianMpOwotCQkJCQkJCQkJCWlmKCFvYmpzLmlzRW1wdHkoKSkgewotCQkJCQkJCQkJCQlhZGROZXdQYWNrYWdlc1RvQ29uZmlndXJhdGlvbihvYmpzKTsKLQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQotCQkJCQkJCX0gCi0JCQkJCQkJZWxzZSBpZihtb3N0UmVjZW50Q29tbWFuZCBpbnN0YW5jZW9mIFBhc3RlRnJvbUNsaXBib2FyZENvbW1hbmQpIHsKLQkJCQkJCQkJQ29sbGVjdGlvbiBvYmpzID0gbW9zdFJlY2VudENvbW1hbmQuZ2V0UmVzdWx0KCk7Ci0JCQkJCQkJCW5vdGlmeUxpc3RlbmVycyhJTGlicmFyeUNoYW5nZUxpc3RlbmVyLk9QVElPTl9ORVdDSElMRCwgb2Jqcyk7CQotCQkJCQkJCQlQYXN0ZUZyb21DbGlwYm9hcmRDb21tYW5kIGNtZCA9ICgoUGFzdGVGcm9tQ2xpcGJvYXJkQ29tbWFuZCltb3N0UmVjZW50Q29tbWFuZCk7Ci0JCQkJCQkJCQotCQkJCQkJCQkvLyB1cGRhdGUgdGhlIGNvbmZpZ3VyYXRpb24gc2VsZWN0aW9uIGlmIHRoZQotCQkJCQkJCQkvLyBvYmplY3QgaXMgYSBuZXdseSBhZGRlZCBtZXRob2QgcGFja2FnZQotCQkJCQkJCQkvLwotCQkJCQkJCQlpZiAoY21kLmdldE93bmVyKCkgaW5zdGFuY2VvZiBNZXRob2RQYWNrYWdlKSB7Ci0JCQkJCQkJCQlvYmpzID0gTGlicmFyeVV0aWwuZ2V0Q29udGFpbmVkRWxlbWVudHMoY21kLmdldE93bmVyKCksIG9ianMpOwotCQkJCQkJCQkJaWYoIW9ianMuaXNFbXB0eSgpKSB7Ci0JCQkJCQkJCQkJYWRkTmV3UGFja2FnZXNUb0NvbmZpZ3VyYXRpb24ob2Jqcyk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQkJZWxzZSBpZiAobW9zdFJlY2VudENvbW1hbmQgaW5zdGFuY2VvZiBDcmVhdGVDaGlsZENvbW1hbmQpIHsKLQkJCQkJCQkJbm90aWZ5TGlzdGVuZXJzKAotCQkJCQkJCQkJCUlMaWJyYXJ5Q2hhbmdlTGlzdGVuZXIuT1BUSU9OX05FV0NISUxELAotCQkJCQkJCQkJCW1vc3RSZWNlbnRDb21tYW5kLmdldEFmZmVjdGVkT2JqZWN0cygpKTsKLQkJCQkJCQl9IGVsc2UgaWYgKG1vc3RSZWNlbnRDb21tYW5kICE9IG51bGwpIHsKLQkJCQkJCQkJbm90aWZ5TGlzdGVuZXJzKAotCQkJCQkJCQkJCUlMaWJyYXJ5Q2hhbmdlTGlzdGVuZXIuT1BUSU9OX0NIQU5HRUQsCi0JCQkJCQkJCQkJbW9zdFJlY2VudENvbW1hbmQuZ2V0QWZmZWN0ZWRPYmplY3RzKCkpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0pOwotCQkJfQotCQl9Ci0JfTsKLQotCS8qKgotCSAqIGFkZCB0aGUgbmV3IHBhY2thZ2VzIGludG8gdGhlIGNvbmZpZ3VyYXRpb25zIGlmIHRoZSBwYXJlbnQgaXMgaW4gdGhlCi0JICogY29uZmlndXJhdGlvbgotCSAqIAotCSAqIEBwYXJhbSBuZXdvYmpzCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZE5ld1BhY2thZ2VzVG9Db25maWd1cmF0aW9uKENvbGxlY3Rpb24gbmV3b2JqcykgewotCQlpZiAobmV3b2JqcyA9PSBudWxsIHx8IG5ld29ianMuc2l6ZSgpID09IDApIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCUxpYnJhcnlNb2RpZmljYXRpb25IZWxwZXIgaGVscGVyID0gbmV3IExpYnJhcnlNb2RpZmljYXRpb25IZWxwZXIoKTsKLQotCQl0cnkgewotCQkJRU9iamVjdCBlLCBwYXJlbnQ7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gbmV3b2Jqcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJZSA9IChFT2JqZWN0KSBpdC5uZXh0KCk7Ci0JCQkJaWYgKChlIGluc3RhbmNlb2YgTWV0aG9kUGFja2FnZSkKLQkJCQkJCSYmICgocGFyZW50ID0gZS5lQ29udGFpbmVyKCkpICE9IG51bGwpCi0JCQkJCQkmJiAocGFyZW50IGluc3RhbmNlb2YgTWV0aG9kUGFja2FnZSkpIHsKLQkJCQkJT2JqZWN0IGNvbmZpZ3MgPSAoKE11bHRpUmVzb3VyY2VFT2JqZWN0KSBwYXJlbnQpCi0JCQkJCQkJLmdldE9wcG9zaXRlRmVhdHVyZVZhbHVlKEFzc29jaWF0aW9uSGVscGVyLk1ldGhvZFBhY2thZ2VfTWV0aG9kQ29uZmlndXJhdGlvbnMpOwotCQkJCQlpZiAoY29uZmlncyBpbnN0YW5jZW9mIExpc3QpIHsKLQkJCQkJCWZvciAoSXRlcmF0b3IgaXRjb25maWcgPSAoKExpc3QpIGNvbmZpZ3MpLml0ZXJhdG9yKCk7IGl0Y29uZmlnCi0JCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSAoTWV0aG9kQ29uZmlndXJhdGlvbikgaXRjb25maWcKLQkJCQkJCQkJCS5uZXh0KCk7Ci0JCQkJCQkJTGlzdCBwa2dzID0gY29uZmlnLmdldE1ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKTsKLQkJCQkJCQlpZiAoIXBrZ3MuY29udGFpbnMoZSkpIHsKLQkJCQkJCQkJLy8gcGtncy5hZGQoZSk7Ci0JCQkJCQkJCWhlbHBlcgotCQkJCQkJCQkJCS5nZXRBY3Rpb25NYW5hZ2VyKCkKLQkJCQkJCQkJCQkuZG9BY3Rpb24oCi0JCQkJCQkJCQkJCQlJQWN0aW9uTWFuYWdlci5BREQsCi0JCQkJCQkJCQkJCQljb25maWcsCi0JCQkJCQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJCQkJCQkuZ2V0TWV0aG9kQ29uZmlndXJhdGlvbl9NZXRob2RQYWNrYWdlU2VsZWN0aW9uKCksCi0JCQkJCQkJCQkJCQllLCAtMSk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQloZWxwZXIuc2F2ZSgpOwotCi0JCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkJTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCX0gZmluYWxseSB7Ci0JCQloZWxwZXIuZGlzcG9zZSgpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBJTm90aWZ5Q2hhbmdlZExpc3RlbmVyIG5vdGlmeUNoYW5nZWRMaXN0ZW5lciA9IG5ldyBJTm90aWZ5Q2hhbmdlZExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJCWlmICghaW5PcGVyYXRpb24pIHsKLQkJCQlpbnQgZXZlbnRUeXBlID0gbm90aWZpY2F0aW9uLmdldEV2ZW50VHlwZSgpOwotCQkJCXN3aXRjaCAoZXZlbnRUeXBlKSB7Ci0JCQkJY2FzZSBOb3RpZmljYXRpb24uQUREOiB7Ci0JCQkJCS8vIG9ubHkgZm9yIGFkZCBNZXRob2RQbHVnaW4sIG9yIG1heWJlIHNvbWUgb3RoZXIgbWlzc2luZwotCQkJCQkvLyBzdHVmZiAoaWYgYW55KSB0aGF0IGFyZSBub3QgY3JlYXRlZCBieSBhIGNvbW1hbmQuCi0JCQkJCS8vIGFueXRoaW5nIGNyZWF0ZWQgYnkgYSBjb21tYW5kIGFyZSBoYW5kbGVkIGJ5IHRoZQotCQkJCQkvLyBjb21tYW5kU3RhY2tMaXN0ZW5lcgotCQkJCQlPYmplY3Qgbm90aWZpZXIgPSBub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKTsKLQkJCQkJT2JqZWN0IHYgPSBub3RpZmljYXRpb24uZ2V0TmV3VmFsdWUoKTsKLQkJCQkJaWYgKChub3RpZmllciBpbnN0YW5jZW9mIE1ldGhvZExpYnJhcnkpCi0JCQkJCQkJJiYgKHYgaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pKSB7Ci0JCQkJCQlDb2xsZWN0aW9uIGFmZmVjdGVkT2JqZWN0cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJCWFmZmVjdGVkT2JqZWN0cy5hZGQodik7Ci0JCQkJCQlub3RpZnlMaXN0ZW5lcnMoSUxpYnJhcnlDaGFuZ2VMaXN0ZW5lci5PUFRJT05fTkVXQ0hJTEQsCi0JCQkJCQkJCWFmZmVjdGVkT2JqZWN0cyk7Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJfQotCi0JCQkJY2FzZSBOb3RpZmljYXRpb24uU0VUOiB7Ci0JCQkJCU9iamVjdCBub3RpZmllciA9IG5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpOwotCQkJCQlpZiAobm90aWZpZXIgIT0gbnVsbCkgewotCQkJCQkJQ29sbGVjdGlvbiBhZmZlY3RlZE9iamVjdHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCQlhZmZlY3RlZE9iamVjdHMuYWRkKG5vdGlmaWVyKTsKLQkJCQkJCW5vdGlmeUxpc3RlbmVycyhJTGlicmFyeUNoYW5nZUxpc3RlbmVyLk9QVElPTl9DSEFOR0VELAotCQkJCQkJCQlhZmZlY3RlZE9iamVjdHMpOwotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQotCQkJCS8vIG5vdGU6IHRoaXMgaXMgdGhlIHJlbW92ZSBvZiBlbGVtZW50cyBmcm9tIHRoZSBwYXJlbnQsCi0JCQkJLy8gaXQgbWlnaHQgYmUgYSBkZWxldGUgYWN0aW9uLCBvciBtaWdodCBiZSBqdXN0IGEgcmVtb3ZlIG9mCi0JCQkJLy8gcmVmZXJlbmNlcwotCQkJCS8vIGZvciBkZWxldGUgYWN0aW9uLCB0aGUgZGVsZXRlZCBlbGVtZW50IGhhcyBubyBjb250YWluZXIKLQkJCQkvLyBmb3IgcmVtb3ZlZCByZWZlcmVuY2UsIHRoZSByZW1vdmVkIGVsZW1lbnQgc3RpbGwgaGF2ZSBpdCdzCi0JCQkJLy8gcGFyZW50Ci0JCQkJY2FzZSBOb3RpZmljYXRpb24uUkVNT1ZFOiB7Ci0JCQkJCU9iamVjdCBub3RpZmllciA9IG5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpOwotCQkJCQlPYmplY3Qgb2xkVmFsdWUgPSBub3RpZmljYXRpb24uZ2V0T2xkVmFsdWUoKTsKLQkJCQkJQ29sbGVjdGlvbiBhZmZlY3RlZE9iamVjdHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCWlmIChvbGRWYWx1ZSBpbnN0YW5jZW9mIEVPYmplY3QKLQkJCQkJCQkmJiAoKEVPYmplY3QpIG9sZFZhbHVlKS5lQ29udGFpbmVyKCkgPT0gbnVsbCkgewotCQkJCQkJLy8gdGhlIGVsZW1lbnQgaXMgZGVsZXRlZCwgc2VudCBhIGRlbGV0ZSBldmVudAotCQkJCQkJYWZmZWN0ZWRPYmplY3RzLmFkZChvbGRWYWx1ZSk7Ci0JCQkJCQlub3RpZnlMaXN0ZW5lcnMoSUxpYnJhcnlDaGFuZ2VMaXN0ZW5lci5PUFRJT05fREVMRVRFRCwKLQkJCQkJCQkJYWZmZWN0ZWRPYmplY3RzKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCS8vIG90aGVyd2lzZSwgaXQncyBqdXN0IGEgcmVtb3ZlIG9mIHJlZmVyZW5jZXMsIHRoZQotCQkJCQkJLy8gbm90aWZpZXIgaXMgdGhlIGNoYW5nZWQgZWxlbWVudAotCQkJCQkJYWZmZWN0ZWRPYmplY3RzLmFkZChub3RpZmllcik7Ci0JCQkJCQlub3RpZnlMaXN0ZW5lcnMoSUxpYnJhcnlDaGFuZ2VMaXN0ZW5lci5PUFRJT05fQ0hBTkdFRCwKLQkJCQkJCQkJYWZmZWN0ZWRPYmplY3RzKTsKLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSBOb3RpZmljYXRpb24uUkVNT1ZFX01BTlk6IHsKLQkJCQkJTGlzdCBvbGRWYWx1ZSA9IG5ldyBBcnJheUxpc3QoKENvbGxlY3Rpb24pIG5vdGlmaWNhdGlvbgotCQkJCQkJCS5nZXRPbGRWYWx1ZSgpKTsKLQkJCQkJQXJyYXlMaXN0IGRlbGV0ZWRFbGVtZW50cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJQXJyYXlMaXN0IHJlbW92ZWRSZWZlcmVuY2VzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQlpZiAoIW9sZFZhbHVlLmlzRW1wdHkoKSkgewotCQkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gb2xkVmFsdWUuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJCU9iamVjdCBlbGVtZW50ID0gaXRlci5uZXh0KCk7Ci0JCQkJCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBFT2JqZWN0KSB7Ci0JCQkJCQkJCWlmICgoKEVPYmplY3QpIGVsZW1lbnQpLmVDb250YWluZXIoKSA9PSBudWxsKSB7Ci0JCQkJCQkJCQlkZWxldGVkRWxlbWVudHMuYWRkKGVsZW1lbnQpOwotCQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQkJcmVtb3ZlZFJlZmVyZW5jZXMuYWRkKGVsZW1lbnQpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWlmICghZGVsZXRlZEVsZW1lbnRzLmlzRW1wdHkoKSkgewotCQkJCQkJLy8gdGhlIGVsZW1lbnQgaXMgZGVsZXRlZCwgc2VudCBhIGRlbGV0ZSBldmVudAotCQkJCQkJbm90aWZ5TGlzdGVuZXJzKElMaWJyYXJ5Q2hhbmdlTGlzdGVuZXIuT1BUSU9OX0RFTEVURUQsCi0JCQkJCQkJCWRlbGV0ZWRFbGVtZW50cyk7Ci0JCQkJCX0KLQkJCQkJaWYgKCFyZW1vdmVkUmVmZXJlbmNlcy5pc0VtcHR5KCkpIHsKLQkJCQkJCS8vIG90aGVyd2lzZSwgaXQncyBqdXN0IGEgcmVtb3ZlIG9mIHJlZmVyZW5jZXMsIHRoZQotCQkJCQkJLy8gbm90aWZpZXIgaXMgdGhlIGNoYW5nZWQgZWxlbWVudAotCQkJCQkJbm90aWZ5TGlzdGVuZXJzKElMaWJyYXJ5Q2hhbmdlTGlzdGVuZXIuT1BUSU9OX0NIQU5HRUQsCi0JCQkJCQkJCXJlbW92ZWRSZWZlcmVuY2VzKTsKLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfTsKLQotCXByaXZhdGUgYm9vbGVhbiBsaXN0ZW5lckFkZGVkID0gZmFsc2U7Ci0KLQlwcml2YXRlIEFkYXB0ZXIgbGliQ2hhbmdlZExpc3RlbmVyID0gbmV3IEFkYXB0ZXJJbXBsKCkgewotCQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBtc2cpIHsKLQkJCXN3aXRjaCAobXNnLmdldEZlYXR1cmVJRChNZXRob2RMaWJyYXJ5LmNsYXNzKSkgewotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9MSUJSQVJZX19NRVRIT0RfUExVR0lOUzoKLQkJCQlNZXRob2RQbHVnaW4gcGx1Z2luOwotCQkJCXN3aXRjaCAobXNnLmdldEV2ZW50VHlwZSgpKSB7Ci0JCQkJY2FzZSBOb3RpZmljYXRpb24uQUREOgotCQkJCQlwbHVnaW4gPSAoTWV0aG9kUGx1Z2luKSBtc2cuZ2V0TmV3VmFsdWUoKTsKLQkJCQkJcGx1Z2luLmVSZXNvdXJjZSgpLmVBZGFwdGVycygpLmFkZChyZXNvdXJjZUNoYW5nZWRMaXN0ZW5lcik7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgTm90aWZpY2F0aW9uLkFERF9NQU5ZOgotCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSAoKENvbGxlY3Rpb24pIG1zZy5nZXROZXdWYWx1ZSgpKQotCQkJCQkJCS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJCXBsdWdpbiA9IChNZXRob2RQbHVnaW4pIGl0ZXIubmV4dCgpOwotCQkJCQkJcGx1Z2luLmVSZXNvdXJjZSgpLmVBZGFwdGVycygpLmFkZCgKLQkJCQkJCQkJcmVzb3VyY2VDaGFuZ2VkTGlzdGVuZXIpOwotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgTm90aWZpY2F0aW9uLlJFTU9WRToKLQkJCQkJcGx1Z2luID0gKE1ldGhvZFBsdWdpbikgbXNnLmdldE9sZFZhbHVlKCk7Ci0JCQkJCXBsdWdpbi5lUmVzb3VyY2UoKS5lQWRhcHRlcnMoKS5yZW1vdmUoCi0JCQkJCQkJcmVzb3VyY2VDaGFuZ2VkTGlzdGVuZXIpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIE5vdGlmaWNhdGlvbi5SRU1PVkVfTUFOWToKLQkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gKChDb2xsZWN0aW9uKSBtc2cuZ2V0T2xkVmFsdWUoKSkKLQkJCQkJCQkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlwbHVnaW4gPSAoTWV0aG9kUGx1Z2luKSBpdGVyLm5leHQoKTsKLQkJCQkJCXBsdWdpbi5lUmVzb3VyY2UoKS5lQWRhcHRlcnMoKS5yZW1vdmUoCi0JCQkJCQkJCXJlc291cmNlQ2hhbmdlZExpc3RlbmVyKTsKLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9OwotCi0JcHJpdmF0ZSBBZGFwdGVyIHJlc291cmNlQ2hhbmdlZExpc3RlbmVyID0gbmV3IEFkYXB0ZXJJbXBsKCkgewotCQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbiBtc2cpIHsKLQkJCWlmIChtc2cuZ2V0RmVhdHVyZUlEKG51bGwpID09IFJlc291cmNlLlJFU09VUkNFX19JU19NT0RJRklFRAotCQkJCQkmJiBtc2cuZ2V0RXZlbnRUeXBlKCkgPT0gb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uLlNFVCkgewotCQkJCS8vIGRpcnR5ID0gdHJ1ZTsKLQkJCQlmaXJlUHJvcGVydHlDaGFuZ2UobXNnLmdldE5vdGlmaWVyKCksIFBST1BfRElSVFkpOwotCQkJfQotCQl9Ci0JfTsKLQotCXByaXZhdGUgTGlzdGVuZXJMaXN0IHByb3BDaGFuZ2VMaXN0ZW5lcnMgPSBuZXcgTGlzdGVuZXJMaXN0KCk7Ci0KLQlwcml2YXRlIElSZWZyZXNoTGlzdGVuZXIgcmVmcmVzaExpc3RlbmVyID0gbmV3IElSZWZyZXNoTGlzdGVuZXIoKSB7Ci0KLQkJcHVibGljIHZvaWQgbm90aWZ5UmVmcmVzaGVkKElSZWZyZXNoRXZlbnQgZXZlbnQpIHsKLQkJCWhhbmRsZVJlZnJlc2hFdmVudChldmVudCk7Ci0JCX0KLQkJCi0JfTsKLQotCXB1YmxpYyBzdGF0aWMgTGlicmFyeVByb2Nlc3NvciBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKGluc3RhbmNlID09IG51bGwpIHsKLQkJCXN5bmNocm9uaXplZCAoTGlicmFyeVByb2Nlc3Nvci5jbGFzcykgewotCQkJCWlmIChpbnN0YW5jZSA9PSBudWxsKSB7Ci0JCQkJCWluc3RhbmNlID0gbmV3IExpYnJhcnlQcm9jZXNzb3IoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGV2ZW50Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlUmVmcmVzaEV2ZW50KElSZWZyZXNoRXZlbnQgZXZlbnQpIHsKLQkJaWYoTG9nLkRFQlVHKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxpYnJhcnlQcm9jZXNzb3IuaGFuZGxlUmVmcmVzaEV2ZW50KCkiKTsgLy8kTk9OLU5MUy1OJAotCQkJU3lzdGVtLm91dC5wcmludGxuKCIgIHJlZnJlc2hlZCByZXNvdXJjZXM6ICIgKyBldmVudC5nZXRSZWZyZXNoZWRSZXNvdXJjZXMoKSk7Ci0JCX0KLQkJaWYoIWV2ZW50LmdldFVubG9hZGVkT2JqZWN0cygpLmlzRW1wdHkoKSkgewotCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UuY2xlYW5VcCgpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBMaWJyYXJ5UHJvY2Vzc29yKCkgewotCQlpbml0KCk7Ci0KLQkJLy8gdGhpcyBpcyB0aGUgbWFpbiBpbnN0YW5jZSwgd2lsbCBiZSB0cmVhdGVkIGFzIHNpbmdsZXRvbgotCQlpc1NpbmdsZXRvbkluc3RhbmNlID0gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgTGlicmFyeVByb2Nlc3NvcihSZXNvdXJjZSByZXMpIHsKLQkJdGhpcygpOwotCQlpZiAocmVzICE9IG51bGwpIHsKLQkJCXNldFJlc291cmNlKHJlcyk7Ci0JCX0KLQotCQlpc1NpbmdsZXRvbkluc3RhbmNlID0gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogdGhpcyBjb25zdHJ1Y3Qgc2hvdWxkIGJlIGNhbGxlZCBvbmx5IGlmIHlvdSB3YW50IHRvIG1haW50YWluIHlvdXIgb3duCi0JICogTGlicmFyeVByb2Nlc3Nvciwgc3VjaCBhcyB3aGVuIGZvciBsaWJyYXJ5IGltcG9ydGluZyBvciBleHBvcnRpbmcuCi0JICogT3RoZXJ3aXNlLCBjYWxsIHRoZSBzdGF0aWMgZ2V0SW5zdGFuY2UoKSBtZXRob2QgdG8gcmV0cmlldmUgdGhlIHNpbmdsZXRvbgotCSAqIAotCSAqIEBwYXJhbSBsaWJyYXJ5UGF0aAotCSAqLwotCXB1YmxpYyBMaWJyYXJ5UHJvY2Vzc29yKFN0cmluZyBsaWJyYXJ5UGF0aCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMoKTsKLQkJb3BlbkxpYnJhcnkobGlicmFyeVBhdGgpOwotCi0JCWlzU2luZ2xldG9uSW5zdGFuY2UgPSBmYWxzZTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgYWRkUHJvcGVydHlMaXN0ZW5lcihJUHJvcGVydHlMaXN0ZW5lciBsKSB7Ci0JCXByb3BDaGFuZ2VMaXN0ZW5lcnMuYWRkKGwpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZVByb3BlcnR5TGlzdGVuZXIoSVByb3BlcnR5TGlzdGVuZXIgbCkgewotCQlwcm9wQ2hhbmdlTGlzdGVuZXJzLnJlbW92ZShsKTsKLQl9Ci0KLQkvKioKLQkgKiBGaXJlcyBhIHByb3BlcnR5IGNoYW5nZWQgZXZlbnQuCi0JICogCi0JICogQHBhcmFtIHByb3BlcnR5SWQKLQkgKiAgICAgICAgICAgIHRoZSBpZCBvZiB0aGUgcHJvcGVydHkgdGhhdCBjaGFuZ2VkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZmlyZVByb3BlcnR5Q2hhbmdlKGZpbmFsIE9iamVjdCBzb3VyY2UsIGZpbmFsIGludCBwcm9wZXJ0eUlkKSB7Ci0JCU9iamVjdFtdIGFycmF5ID0gcHJvcENoYW5nZUxpc3RlbmVycy5nZXRMaXN0ZW5lcnMoKTsKLQkJZm9yIChpbnQgblggPSAwOyBuWCA8IGFycmF5Lmxlbmd0aDsgblgrKykgewotCQkJZmluYWwgSVByb3BlcnR5TGlzdGVuZXIgbCA9IChJUHJvcGVydHlMaXN0ZW5lcikgYXJyYXlbblhdOwotCi0JCQkvLyBzaW5jZSB0aGlzIHdpbGwgY2F1c2UgVUkgdXBkYXRlLCB3aGljaCBtdXN0IGJlIGV4ZWN1dGVkIGluIHRoZSBVSQotCQkJLy8gdGhyZWFkCi0JCQkvLyBvdGhlcndpc2UsIHdpbGwgY2F1c2UgSW52YWxpZCBUaHJlYWQgQWNjZXNzIGV4Y2VwdGlvbgotCQkJU2FmZVVwZGF0ZUNvbnRyb2xsZXIuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCWwucHJvcGVydHlDaGFuZ2VkKHNvdXJjZSwgcHJvcGVydHlJZCk7Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkTGlicmFyeUxpc3RlbmVycygpIHsKLQkJTWV0aG9kTGlicmFyeSBsaWJyYXJ5ID0gZ2V0TGlicmFyeSgpOwotCi0JCWlmIChsaWJyYXJ5ID09IG51bGwgfHwgbGlicmFyeS5lUmVzb3VyY2UoKSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQkvLyBpZighbGlicmFyeS5lQWRhcHRlcnMoKS5jb250YWlucyhsaWJDaGFuZ2VkTGlzdGVuZXIpKSB7Ci0JCS8vIGxpYnJhcnkuZUFkYXB0ZXJzKCkuYWRkKGxpYkNoYW5nZWRMaXN0ZW5lcik7Ci0JCS8vIH0KLQkJaWYgKCFsaWJyYXJ5LmVSZXNvdXJjZSgpLmVBZGFwdGVycygpLmNvbnRhaW5zKHJlc291cmNlQ2hhbmdlZExpc3RlbmVyKSkgewotCQkJbGlicmFyeS5lUmVzb3VyY2UoKS5lQWRhcHRlcnMoKS5hZGQocmVzb3VyY2VDaGFuZ2VkTGlzdGVuZXIpOwotCQl9Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGxpYnJhcnkuZ2V0TWV0aG9kUGx1Z2lucygpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkuaGFzTmV4dCgpOykgewotCQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IChNZXRob2RQbHVnaW4pIGl0ZXIubmV4dCgpOwotCQkJaWYgKCFwbHVnaW4uZVJlc291cmNlKCkuZUFkYXB0ZXJzKCkuY29udGFpbnMoCi0JCQkJCXJlc291cmNlQ2hhbmdlZExpc3RlbmVyKSkgewotCQkJCXBsdWdpbi5lUmVzb3VyY2UoKS5lQWRhcHRlcnMoKS5hZGQocmVzb3VyY2VDaGFuZ2VkTGlzdGVuZXIpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHJlbW92ZUxpYnJhcnlMaXN0ZW5lcnMoKSB7Ci0JCU1ldGhvZExpYnJhcnkgbGlicmFyeSA9IGdldExpYnJhcnkoKTsKLQotCQlpZiAobGlicmFyeSA9PSBudWxsIHx8IGxpYnJhcnkuZVJlc291cmNlKCkgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJLy8gbGlicmFyeS5lQWRhcHRlcnMoKS5yZW1vdmUobGliQ2hhbmdlZExpc3RlbmVyKTsKLQkJbGlicmFyeS5lUmVzb3VyY2UoKS5lQWRhcHRlcnMoKS5yZW1vdmUocmVzb3VyY2VDaGFuZ2VkTGlzdGVuZXIpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBsaWJyYXJ5LmdldE1ldGhvZFBsdWdpbnMoKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSAoTWV0aG9kUGx1Z2luKSBpdGVyLm5leHQoKTsKLQkJCXBsdWdpbi5lUmVzb3VyY2UoKS5lQWRhcHRlcnMoKS5yZW1vdmUocmVzb3VyY2VDaGFuZ2VkTGlzdGVuZXIpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoSUxpYnJhcnlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlzeW5jaHJvbml6ZWQgKGxpc3RlbmVycykgewotCQkJaWYgKCFsaXN0ZW5lcnMuY29udGFpbnMobGlzdGVuZXIpKSB7Ci0JCQkJbGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVMaXN0ZW5lcihJTGlicmFyeUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXN5bmNocm9uaXplZCAodG1wX2xpc3RlbmVyc190b2JlX2RlbGV0ZWQpIHsKLQkJCS8vIGRlbGF5IHRoZSByZW1vdmUgdGlsbCBhIG5vdGlmaWNhdGlvbiBpcyByZXF1ZXN0ZWQKLQkJCWlmICghdG1wX2xpc3RlbmVyc190b2JlX2RlbGV0ZWQuY29udGFpbnMobGlzdGVuZXIpKSB7Ci0JCQkJdG1wX2xpc3RlbmVyc190b2JlX2RlbGV0ZWQuYWRkKGxpc3RlbmVyKTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgbm90aWZ5TGlzdGVuZXJzKGZpbmFsIGludCBvcHRpb24sCi0JCQlmaW5hbCBDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJbG9hZGVkID0gdHJ1ZTsKLQotCQl0cnkgewotCQkJLy8gcmVtb3ZlIHRoZSBsaXN0ZW5lcnMgdG8gYmUgZGVsZXRlZAotCQkJaWYgKHRtcF9saXN0ZW5lcnNfdG9iZV9kZWxldGVkLnNpemUoKSA+IDApIHsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ID0gdG1wX2xpc3RlbmVyc190b2JlX2RlbGV0ZWQuaXRlcmF0b3IoKTsgaXQKLQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCU9iamVjdCBsID0gaXQubmV4dCgpOwotCQkJCQlpZiAobGlzdGVuZXJzLmNvbnRhaW5zKGwpKSB7Ci0JCQkJCQlsaXN0ZW5lcnMucmVtb3ZlKGwpOwotCQkJCQl9Ci0JCQkJfQotCQkJCXRtcF9saXN0ZW5lcnNfdG9iZV9kZWxldGVkLmNsZWFyKCk7Ci0JCQl9Ci0KLQkJCS8vIG5vdGlmeSBsaXN0ZW5lcnMsCi0JCQkvLyBub3RlLCB0aGUgc2l6ZSBtYXkgY2hhbmdlIHNpbmNlIG5vdGlmeSBhIGxpc3RlbmVyIG1heSBjYXVzZWQgbmV3Ci0JCQkvLyBsaXN0ZW5lcnMgYmVpbmcgYWRkZWQKLQkJCS8vIHRob3NlIG5ldyBsaXN0ZW5lcnMgd2lsbCBiZSBhZGRlZCB0byB0aGUgZW5kIG9mIHRoZSBsaXN0IHNvIHdlCi0JCQkvLyBhcmUgb2sKLQkJCWludCBpID0gMDsKLQkJCXdoaWxlIChpIDwgbGlzdGVuZXJzLnNpemUoKSkgewotCQkJCWZpbmFsIElMaWJyYXJ5Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgPSAoSUxpYnJhcnlDaGFuZ2VMaXN0ZW5lcikgbGlzdGVuZXJzCi0JCQkJCQkuZ2V0KGkpOwotCQkJCWlmIChsaXN0ZW5lciAhPSBudWxsKSB7Ci0JCQkJCS8vIHNpbmNlIHRoaXMgd2lsbCBjYXVzZSBVSSB1cGRhdGUsIHdoaWNoIG11c3QgYmUgZXhlY3V0ZWQKLQkJCQkJLy8gaW4gdGhlIFVJIHRocmVhZAotCQkJCQkvLyBvdGhlcndpc2UsIHdpbGwgY2F1c2UgSW52YWxpZCBUaHJlYWQgQWNjZXNzIGV4Y2VwdGlvbgotCi0JCQkJCS8vIGV4ZWN1dGUgaXQgaW4gc3luYyBtb2RlLCBvdGhlcndpc2UgbWF5IGNhdXNlIHByb2JsZW0KLQkJCQkJLy8gc2luY2UgdGhlIG5vdGlmaWNhdGlvbiBtaWdodCBiZSBleGVjdXRlZCB0b28gbGF0ZS4KLQkJCQkJLy8gZm9yIGV4YW1wbGUsIGFmdGVyIHRoZSBsaXN0ZW5lciBvYmplY3QgaXMgZGlzcG9zZWQKLQkJCQkJU2FmZVVwZGF0ZUNvbnRyb2xsZXIuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCWxpc3RlbmVyLmxpYnJhcnlDaGFuZ2VkKG9wdGlvbiwgY29sbGVjdGlvbik7Ci0JCQkJCQl9Ci0JCQkJCX0pOwotCQkJCX0KLQotCQkJCWkrKzsKLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQlleC5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBiZWdpbk9wZXJhdGlvbigpIHsKLQkJaW5PcGVyYXRpb24gPSB0cnVlOwotCX0KLQotCXByaXZhdGUgdm9pZCBlbmRPcGVyYXRpb24oKSB7Ci0JCWluT3BlcmF0aW9uID0gZmFsc2U7Ci0JfQotCQotCS8qKgotCSAqIENoZWNrcyBpZiB0aGUgZ2l2ZW4gb2JqZWN0IGlzIHZhbGlkIGluIHRoZSBjdXJyZW50IHJlc291cmNlIHNldAotCSAqIAotCSAqIEBwYXJhbSBvYmplY3QKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNWYWxpZChFT2JqZWN0IG9iamVjdCkgewotCQlpZihvYmplY3QgIT0gbnVsbCAmJiBvYmplY3QuZUlzUHJveHkoKSkgewotCQkJRU9iamVjdCBlID0gUmVmcmVzaEpvYi5nZXRJbnN0YW5jZSgpLnJlc29sdmUob2JqZWN0KTsKLQkJCXJldHVybiAoZSBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQKLQkJCQkJJiYgIWUuZUlzUHJveHkoKQotCQkJCQkmJiBVbWFVdGlsLmdldE1ldGhvZExpYnJhcnkoZSkgPT0gZ2V0TGlicmFyeSgpKTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQotCX0KLQkKLQkvKioKLQkgKiBDaGVja3MgaWYgdGhlIGxpYnJhcnkncyBwcm9qZWN0IGlzIHN0aWxsIG9wZW4uIElmIG5vdCwgb3BlbiBpdAotCSAqLwotCS8qCi0JcHVibGljIGJvb2xlYW4gZW5zdXJlTGlicmFyeVByb2plY3RPcGVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlNZXRob2RMaWJyYXJ5IGxpYiA9IGdldExpYnJhcnkoKTsKLQkJaWYobGliICE9IG51bGwpIHsKLQkJCUlQcm9qZWN0IHByaiA9IFJlc291cmNlVXRpbC5maW5kUHJvamVjdChsaWIpOwotCQkJaWYocHJqICE9IG51bGwgJiYgIXByai5pc09wZW4oKSkgewotCQkJCXRyeSB7Ci0JCQkJCXByai5vcGVuKElSZXNvdXJjZS5CQUNLR1JPVU5EX1JFRlJFU0gsIG1vbml0b3IpOwotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JKi8KLQkKLQlwdWJsaWMgdm9pZCBvcGVuTGlicmFyeSgpIHRocm93cyBFeGNlcHRpb24gewotCQlTdHJpbmcgb3BlbkxpYnJhcnkgPSBnZXRMaWJyYXJ5Um9vdFBhdGgoKS5nZXRBYnNvbHV0ZVBhdGgoKQotCQkJCSsgRmlsZS5zZXBhcmF0b3IgKyAibGlicmFyeS54bWkiOyAvLyROT04tTkxTLTEkCi0JCWlmIChvcGVuTGlicmFyeSAhPSBudWxsICYmICFvcGVuTGlicmFyeS5lcXVhbHMoIiIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCW9wZW5MaWJyYXJ5KG9wZW5MaWJyYXJ5KTsKLQkJfQotCX0KLQotCXB1YmxpYyBJU3RhdHVzIG9wZW5MaWJyYXJ5KFN0cmluZyBsaWJyYXJ5UGF0aCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQliZWdpbk9wZXJhdGlvbigpOwotCQkJCi0JCQkvLyBvcGVuIHRoZSBtZXRob2QgbGlicmFyeSBhcyBhIHByb2plY3QgaW4gdGhlIHdvcmtzcGFjZSBzbyBpdCB3aWxsCi0JCQkvLyBzaG93IHVwIGluIHRoZSBSZXNvdXJjZSB2aWV3LgotCQkJLy8KLQkJCUZpbGUgbGliRGlyID0gbmV3IEZpbGUobGlicmFyeVBhdGgpLmdldFBhcmVudEZpbGUoKTsKLQkJCQotCQkJLy8gb25seSBjbG9zZSBwcmV2aW91cyBsaWJyYXJ5IGlmIHRoZSBuZXcgbGlicmFyeSdzIHByb2plY3Qgd2FzCi0JCQkvLyBvcGVuZWQgc3VjY2Vzc2Z1bGx5Ci0JCQkvLyBjbG9zZSBwcmV2aW91cyBsaWJyYXJ5J3MgcHJvamVjdCBvbmx5IGlmIGl0IGlzIGRpZmZlcmVudCB0aGFuIHRoZQotCQkJLy8gbmV3IG9uZQotCQkJY2xvc2VPcGVuZWRMaWJyYXJ5KCk7Ci0KLQkJCS8vIGxvY2sgdGhlIGxpYnJhcnkKLQkJCS8vCi0JCQlsb2NrTGlicmFyeShsaWJEaXIpOwotCi0JCQlSZXNvdXJjZVV0aWwub3BlbihsaWJEaXIuZ2V0QWJzb2x1dGVQYXRoKCksIG51bGwpOwotCi0JCQlNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwgcmVzb3VyY2VTZXQgPSAoKE11bHRpRmlsZVJlc291cmNlU2V0SW1wbCkgZWRpdGluZ0RvbWFpbgotCQkJCQkuZ2V0UmVzb3VyY2VTZXQoKSk7Ci0JCQlhc3NpZ25MaWJyYXJ5KHJlc291cmNlU2V0LmxvYWRMaWJyYXJ5KGxpYnJhcnlQYXRoKSk7Ci0KLQkJCUlTdGF0dXMgc3RhdHVzOwotCQkJaWYgKCFyZXNvdXJjZVNldC5oYXNVbnJlc29sdmVkUHJveHkoKSkgewotCQkJCVN0cmluZyBtc2cgPSBMaWJyYXJ5UmVzb3VyY2VzCi0JCQkJCQkuZ2V0U3RyaW5nKCJMaWJyYXJ5LnVucmVzb2x2ZWRQcm94eUVycm9yLnJlYXNvbiIpOyAvLyROT04tTkxTLTEkCi0JCQkJc3RhdHVzID0gbmV3IFN0YXR1cyhJU3RhdHVzLldBUk5JTkcsIExpYnJhcnlQbHVnaW4uZ2V0RGVmYXVsdCgpCi0JCQkJCQkuZ2V0SWQoKSwgMCwgbXNnLCBudWxsKTsKLQkJCX0gZWxzZSB7Ci0JCQkJc3RhdHVzID0gU3RhdHVzLk9LX1NUQVRVUzsKLQkJCX0KLQotCQkJbm90aWZ5TGlzdGVuZXJzKElMaWJyYXJ5Q2hhbmdlTGlzdGVuZXIuT1BUSU9OX0xPQURFRCwgbnVsbCk7Ci0JCQlyZXR1cm4gc3RhdHVzOwotCQl9IGZpbmFsbHkgewotCQkJZW5kT3BlcmF0aW9uKCk7Ci0KLQkJCS8vIGRpcnR5ID0gZmFsc2U7Ci0JCQlmaXJlUHJvcGVydHlDaGFuZ2UoZ2V0TGlicmFyeSgpLCBQUk9QX0RJUlRZKTsKLQotCQkJLy8gc2V0Q3VycmVudENvbmZpZ3VyYXRpb24obnVsbCk7Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIEFzc2lnbnMgbGlicmFyeSB0byBhIG5ldyB2YWx1ZSBhbmQgYXR0YWNoIHRoZSBjaGFuZ2UgbGlzdGVuZXJzIHRvIGl0LgotCSAqIAotCSAqIEBwYXJhbSBsaWIKLQkgKi8KLQlwcml2YXRlIHZvaWQgYXNzaWduTGlicmFyeShNZXRob2RMaWJyYXJ5IGxpYikgewotCQlyZW1vdmVMaWJyYXJ5TGlzdGVuZXJzKCk7Ci0JCWFkZExpYnJhcnlMaXN0ZW5lcnMoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBuZXdMaWJyYXJ5KFN0cmluZyBsaWJyYXJ5TmFtZSwgU3RyaW5nIGxpYnJhcnlQYXRoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCWNsb3NlT3BlbmVkTGlicmFyeSgpOwotCi0JCQkvLyBpc011bHRpcGxlRmlsZXMgPSBiTXVsdGlwbGU7Ci0JCQliZWdpbk9wZXJhdGlvbigpOwotCi0JCQlGaWxlIGxpYl9wYXRoID0gbmV3IEZpbGUobGlicmFyeVBhdGgpOwotCQkJbGlicmFyeVBhdGggPSBsaWJfcGF0aC5nZXRBYnNvbHV0ZVBhdGgoKTsKLQotCQkJLy8gb3BlbiB0aGUgbWV0aG9kIGxpYnJhcnkgYXMgYSBwcm9qZWN0IGluIHRoZSB3b3Jrc3BhY2Ugc28gaXQgd2lsbAotCQkJLy8gc2hvdyB1cCBpbiB0aGUgUmVzb3VyY2Ugdmlldy4KLQkJCVJlc291cmNlVXRpbC5vcGVuKGxpYnJhcnlQYXRoLCBudWxsKTsKLQotCQkJTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsIHJlc291cmNlU2V0ID0gKE11bHRpRmlsZVJlc291cmNlU2V0SW1wbCkgZWRpdGluZ0RvbWFpbgotCQkJCQkuZ2V0UmVzb3VyY2VTZXQoKTsKLQkJCU1vZGVsU3RvcmFnZS5uZXdMaWJyYXJ5KHJlc291cmNlU2V0LCBsaWJyYXJ5TmFtZSwgbGlicmFyeVBhdGgsIHRydWUpOwotCQkJYXNzaWduTGlicmFyeShyZXNvdXJjZVNldC5nZXRNZXRob2RMaWJyYXJ5KCkpOwotCi0JCQkvLyBsb2NrIHRoZSBsaWJyYXJ5Ci0JCQlsb2NrTGlicmFyeShsaWJfcGF0aCk7Ci0JCX0gZmluYWxseSB7Ci0JCQllbmRPcGVyYXRpb24oKTsKLQkJCS8vIHNldERpcnR5KHRydWUpOwotCQkJLy8gc2V0Q3VycmVudENvbmZpZ3VyYXRpb24obnVsbCk7Ci0JCQlub3RpZnlMaXN0ZW5lcnMoSUxpYnJhcnlDaGFuZ2VMaXN0ZW5lci5PUFRJT05fQ1JFQVRFRCwgbnVsbCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTYXZlcyB0aGUgZ2l2ZW4gcmVzb3VyY2UgaWYgaXQgYmVsb25nIHRvIHRoZSBjdXJyZW50bHkgb3BlbiBsaWJyYXJ5Ci0JICogCi0JICogQHBhcmFtIHJlc291cmNlCi0JICogQHRocm93cyBFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBzYXZlKFJlc291cmNlIHJlc291cmNlKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsIHJlc291cmNlU2V0ID0gKChNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwpIGVkaXRpbmdEb21haW4KLQkJCQkuZ2V0UmVzb3VyY2VTZXQoKSk7Ci0JCWlmIChyZXNvdXJjZVNldC5nZXRSZXNvdXJjZXMoKS5jb250YWlucyhyZXNvdXJjZSkpIHsKLQkJCXJlc291cmNlU2V0LnNhdmUocmVzb3VyY2UsIHNhdmVPcHRpb25zKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHNhdmVMaWJyYXJ5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU1ldGhvZExpYnJhcnkgbGlicmFyeSA9IGdldExpYnJhcnkoKTsKLQkJaWYgKGxpYnJhcnkgIT0gbnVsbCkgewotCQkJZG9TYXZlKHNhdmVPcHRpb25zKTsKLQkJCWZpcmVQcm9wZXJ0eUNoYW5nZShsaWJyYXJ5LCBQUk9QX0RJUlRZKTsKLQotCQkJbm90aWZ5TGlzdGVuZXJzKElMaWJyYXJ5Q2hhbmdlTGlzdGVuZXIuT1BUSU9OX1NBVkVELCBudWxsKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNhdmVzIHRoZSBvcGVuIGxpYnJhcnkgdW5kZXIgYSBuZXcgbG9jYXRpb24KLQkgKiAKLQkgKiBAcGFyYW0gbmV3RGlyCi0JICogICAgICAgICAgICBkaXJlY3RvcnkgdG8gc2F2ZSB0aGUgb3BlbiBsaWJyYXJ5IHRvCi0JICogQHBhcmFtIHJlZ2VuZXJhdGVHVUlECi0JICogICAgICAgICAgICBpZiB0cnVlLCByZWdlbmVyYXRlIEdVSUQgZm9yIGFsbCBNZXRob2RFbGVtZW50cyBpbiB0aGUgb3BlbgotCSAqICAgICAgICAgICAgbGlicmFyeQotCSAqLwotCXB1YmxpYyB2b2lkIHNhdmVMaWJyYXJ5QXMoU3RyaW5nIG5ld0RpciwgYm9vbGVhbiByZWdlbmVyYXRlR1VJRCwKLQkJCUlQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVN0cmluZyBvbGRMaWJEaXIgPSBnZXRMaWJyYXJ5Um9vdFBhdGgoKQotCQkJCS5nZXRBYnNvbHV0ZVBhdGgoKTsKLQotCQkvLyBjcmVhdGUgbmV3IElQcm9qZWN0Ci0JCVJlc291cmNlVXRpbC5vcGVuKG5ld0RpciwgbW9uaXRvcik7Ci0KLQkJTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsIHJlc291cmNlU2V0ID0gKE11bHRpRmlsZVJlc291cmNlU2V0SW1wbCkgZ2V0TGlicmFyeSgpCi0JCQkJLmVSZXNvdXJjZSgpLmdldFJlc291cmNlU2V0KCk7Ci0JCXJlc291cmNlU2V0LnNhdmVBcyhuZXdEaXIsIHJlZ2VuZXJhdGVHVUlELCBtb25pdG9yKTsKLQotCQkvLyBoYW5kbGUgYXR0YWNobWVudHMgaGVyZQotCQlDb3B5QXR0YWNobWVudHNUb05ld0xvY2F0aW9uLmNvcHlBdHRhY2htZW50c0xpYnJhcnkob2xkTGliRGlyLCBuZXdEaXIsCi0JCQkJbnVsbCwgbW9uaXRvcik7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIGxpYnJhcnlQYXRoCi0JICogQHBhcmFtIGJNdWx0aXBsZQotCSAqIEB0aHJvd3MgRXhjZXB0aW9uCi0JICogQGRlcHJlY2F0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzYXZlTGlicmFyeUFzKFN0cmluZyBsaWJyYXJ5UGF0aCwgYm9vbGVhbiBiTXVsdGlwbGUpCi0JCQl0aHJvd3MgRXhjZXB0aW9uIHsKLQkJLy8gUmVzb3VyY2UgcmVzID0KLQkJLy8gKChSZXNvdXJjZSllZGl0aW5nRG9tYWluLmdldFJlc291cmNlU2V0KCkuZ2V0UmVzb3VyY2VzKCkuZ2V0KDApKTsKLQkJLy8gcmVzLnNldFVSSShVUkkuY3JlYXRlRmlsZVVSSShsaWJyYXJ5UGF0aCkpOwotCQkvLyByZXMuc2V0TW9kaWZpZWQodHJ1ZSk7Ci0JCS8vCi0JCS8vIHNldFNhdmVBc011bHRpcGxlRm9sZGVyKGJNdWx0aXBsZSk7Ci0JCS8vICAgICAgICAJCi0JCS8vIGRvU2F2ZShzYXZlQXNPcHRpb25zKTsKLQkJLy8gc2V0RGlydHkoZmFsc2UpOwotCQkvLyBpc011bHRpcGxlRmlsZXMgPSBiTXVsdGlwbGU7Ci0JCS8vICAgICAgICAKLQkJLy8gbm90aWZ5TGlzdGVuZXJzKElMaWJyYXJ5Q2hhbmdlTGlzdGVuZXIuT1BUSU9OX1NBVkVELCBudWxsKTsKLQotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0UmVzb3VyY2UoUmVzb3VyY2UgcmVzKSB7Ci0JCWlmIChyZXMgIT0gbnVsbCkgewotCQkJTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsIHJlc291cmNlU2V0ID0gKE11bHRpRmlsZVJlc291cmNlU2V0SW1wbCkgZWRpdGluZ0RvbWFpbgotCQkJCQkuZ2V0UmVzb3VyY2VTZXQoKTsKLQkJCXJlc291cmNlU2V0LnJlc2V0KCk7Ci0JCQlyZXNvdXJjZVNldC5nZXRSZXNvdXJjZXMoKS5hZGQocmVzKTsKLQkJCWFzc2lnbkxpYnJhcnkocmVzb3VyY2VTZXQuZ2V0TWV0aG9kTGlicmFyeSgpKTsKLQkJCW5vdGlmeUxpc3RlbmVycyhJTGlicmFyeUNoYW5nZUxpc3RlbmVyLk9QVElPTl9DSEFOR0VELCBudWxsKTsKLQkJfQotCX0KLQotCXByaXZhdGUgUmVzb3VyY2UgZ2V0TGlicmFyeVJlc291cmNlKCkgewotCQlMaXN0IHJlcyA9IGdldEVkaXRpbmdEb21haW4oKS5nZXRSZXNvdXJjZVNldCgpLmdldFJlc291cmNlcygpOwotCQlpZiAocmVzLnNpemUoKSA+IDApIHsKLQkJCXJldHVybiAoUmVzb3VyY2UpIHJlcy5nZXQoMCk7Ci0JCX0KLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgTWV0aG9kTGlicmFyeSBnZXRMaWJyYXJ5KCkgewotCQlSZXNvdXJjZSByZXNvdXJjZSA9IGdldExpYnJhcnlSZXNvdXJjZSgpOwotCQlpZiAocmVzb3VyY2UgIT0gbnVsbCAmJiByZXNvdXJjZS5nZXRDb250ZW50cygpLnNpemUoKSA+IDApIHsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSByZXNvdXJjZS5nZXRDb250ZW50cygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlPYmplY3QgbyA9IGl0Lm5leHQoKTsKLQkJCQlpZiAobyBpbnN0YW5jZW9mIE1ldGhvZExpYnJhcnkpIHsKLQkJCQkJcmV0dXJuIChNZXRob2RMaWJyYXJ5KSBvOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBVUkkgZ2V0TGlicmFyeVVSSSgpIHsKLQkJUmVzb3VyY2Ugc2F2ZWRSZXNvdXJjZSA9IGdldExpYnJhcnlSZXNvdXJjZSgpOwotCQlpZiAoc2F2ZWRSZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gc2F2ZWRSZXNvdXJjZS5nZXRVUkkoKTsKLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBVUkkgZ2V0UmVsYXRpdmVVUkkoTWV0aG9kRWxlbWVudCBlbGVtZW50KSB7Ci0JCVVSSSBsaWJVUkkgPSBnZXRMaWJyYXJ5VVJJKCk7Ci0JCVVSSSBlbGVtZXRuVVJJID0gZWxlbWVudC5lUmVzb3VyY2UoKS5nZXRVUkkoKTsKLQkJVVJJIHJlbFVyaSA9IGVsZW1ldG5VUkkuZGVyZXNvbHZlKGxpYlVSSSk7Ci0KLQkJcmV0dXJuIHJlbFVyaTsKLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIEVsZW1lbnRMYXlvdXRNYW5hZ2VyIGdldExheW91dE1hbmFnZXIoKSB7Ci0JCS8vIG5vIEVsZW1lbnRMYXlvdXRNYW5hZ2VyIGlkIGxpYnJhcnkgaXMgbm90IGxvYWRlZAotCQlpZiAobGF5b3V0TWdyID09IG51bGwpIHsKLQkJCWlmIChnZXRMaWJyYXJ5KCkgIT0gbnVsbCkgewotCQkJCWxheW91dE1nciA9IG5ldyBFbGVtZW50TGF5b3V0TWFuYWdlcigpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGxheW91dE1ncjsKLQl9Ci0KLQkvKgotCXB1YmxpYyBWZXJzaW9uTWFuYWdlciBnZXRWZXJzaW9uTWFuYWdlcigpIHsKLQkJaWYgKHZlcnNpb25NZ3IgPT0gbnVsbCkgewotCQkJc3luY2hyb25pemVkICh0aGlzKSB7Ci0JCQkJaWYgKHZlcnNpb25NZ3IgPT0gbnVsbCkgewotCQkJCQl2ZXJzaW9uTWdyID0gbmV3IFZlcnNpb25NYW5hZ2VyKHRoaXMpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiB2ZXJzaW9uTWdyOwotCX0KLQkqLwotCi0JcHVibGljIHZvaWQgc2V0TGlicmFyeShNZXRob2RMaWJyYXJ5IG5ld0xpYikgewotCQlhc3NpZ25MaWJyYXJ5KG5ld0xpYik7Ci0JCVJlc291cmNlIHJlcyA9IChSZXNvdXJjZSkgZ2V0RWRpdGluZ0RvbWFpbigpLmdldFJlc291cmNlU2V0KCkKLQkJCQkuZ2V0UmVzb3VyY2VzKCkuZ2V0KDApOwotCQlyZXMuZ2V0Q29udGVudHMoKS5jbGVhcigpOwotCQlyZXMuZ2V0Q29udGVudHMoKS5hZGQobmV3TGliKTsKLQkJbm90aWZ5TGlzdGVuZXJzKElMaWJyYXJ5Q2hhbmdlTGlzdGVuZXIuT1BUSU9OX0xPQURFRCwgbnVsbCk7Ci0JfQotCi0JcHVibGljIEFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbiBnZXRFZGl0aW5nRG9tYWluKCkgewotCQlyZXR1cm4gZWRpdGluZ0RvbWFpbjsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5pdCgpIHsKLQkJTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkKLQkJCQkuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihuZXcgSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0KLQkJCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2UoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCQkJaWYgKGV2ZW50LmdldFByb3BlcnR5KCkuZXF1YWxzKAotCQkJCQkJCQlQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfQkFDS19VUF9CRUZPUkVfU0FWRSkpIHsKLQkJCQkJCQlzYXZlT3B0aW9ucy5wdXQoCi0JCQkJCQkJCQlNdWx0aUZpbGVYTUlTYXZlSW1wbC5CQUNLX1VQX0JFRk9SRV9TQVZFLAotCQkJCQkJCQkJZXZlbnQuZ2V0TmV3VmFsdWUoKSk7Ci0JCQkJCQl9IGVsc2UgaWYgKGV2ZW50Ci0JCQkJCQkJCS5nZXRQcm9wZXJ0eSgpCi0JCQkJCQkJCS5lcXVhbHMoCi0JCQkJCQkJCQkJUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX0RJU0NBUkRfVU5SRVNPTFZFRF9SRUZFUkVOQ0VTKSkgewotCQkJCQkJCXNhdmVPcHRpb25zCi0JCQkJCQkJCQkucHV0KAotCQkJCQkJCQkJCQlNdWx0aUZpbGVYTUlTYXZlSW1wbC5ESVNDQVJEX1VOUkVTT0xWRURfUkVGRVJFTkNFUywKLQkJCQkJCQkJCQkJZXZlbnQuZ2V0TmV3VmFsdWUoKSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQotCQkJCX0pOwotCi0JCS8vIGNyZWF0ZSB0aGUgZGVmYXVsdCBlZGl0aW5nIGRvbWFpbiBmb3IgbGlicmFyeSBvcGVyYXRpb24KLQkJTGlzdCBmYWN0b3JpZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZhY3Rvcmllcy5hZGQobmV3IFJlc291cmNlSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSk7Ci0JCWZhY3Rvcmllcy5hZGQobmV3IFJlZmxlY3RpdmVJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpKTsKLQotCQlDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5ID0gbmV3IENvbXBvc2VkQWRhcHRlckZhY3RvcnkoCi0JCQkJZmFjdG9yaWVzKTsKLQotCQkvLyBDcmVhdGUgdGhlIGNvbW1hbmQgc3RhY2sgdGhhdCB3aWxsIG5vdGlmeSB0aGlzIGVkaXRvciBhcyBjb21tYW5kcyBhcmUKLQkJLy8gZXhlY3V0ZWQuCi0JCUJhc2ljQ29tbWFuZFN0YWNrIGNvbW1hbmRTdGFjayA9IG5ldyBCYXNpY0NvbW1hbmRTdGFjaygpOwotCi0JCS8vIENyZWF0ZSB0aGUgZWRpdGluZyBkb21haW4gd2l0aCBhIHNwZWNpYWwgY29tbWFuZCBzdGFjay4KLQkJTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsIHJlc291cmNlU2V0ID0gbmV3IE11bHRpRmlsZVJlc291cmNlU2V0SW1wbCgpOwotCQkKLQkJcmVzb3VyY2VTZXQuYWRkUmVmcmVzaExpc3RlbmVyKHJlZnJlc2hMaXN0ZW5lcik7Ci0JCVJlZnJlc2hKb2IuZ2V0SW5zdGFuY2UoKS5zZXRSZXNvdXJjZVNldChyZXNvdXJjZVNldCk7Ci0KLQkJc2F2ZU9wdGlvbnMgPSByZXNvdXJjZVNldC5nZXREZWZhdWx0U2F2ZU9wdGlvbnMoKTsKLQkJYm9vbGVhbiBiID0gTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkuZ2V0Qm9vbGVhbigKLQkJCQlQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfQkFDS19VUF9CRUZPUkVfU0FWRSk7Ci0JCXNhdmVPcHRpb25zLnB1dChNdWx0aUZpbGVYTUlTYXZlSW1wbC5CQUNLX1VQX0JFRk9SRV9TQVZFLCBCb29sZWFuCi0JCQkJLnZhbHVlT2YoYikpOwotCQliID0gTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkuZ2V0Qm9vbGVhbigKLQkJCQlQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfRElTQ0FSRF9VTlJFU09MVkVEX1JFRkVSRU5DRVMpOwotCQlzYXZlT3B0aW9ucy5wdXQoTXVsdGlGaWxlWE1JU2F2ZUltcGwuRElTQ0FSRF9VTlJFU09MVkVEX1JFRkVSRU5DRVMsCi0JCQkJQm9vbGVhbi52YWx1ZU9mKGIpKTsKLQotCQllZGl0aW5nRG9tYWluID0gbmV3IEFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbihhZGFwdGVyRmFjdG9yeSwKLQkJCQljb21tYW5kU3RhY2ssIHJlc291cmNlU2V0KTsKLQotCQkvLyBDcmVhdGUgbmV3IElDb250ZW50RGVzY3JpcHRpb25QZXJzaXN0ZXIgYW5kIHNldCBpdCB0byB0aGUKLQkJLy8gQ29udGVudERlc2NyaXB0aW9uRmFjdG9yeSBmb3IgdXNlLgotCQkvLwotCQlJTWV0aG9kTGlicmFyeVBlcnNpc3RlciBjb250ZW50RGVzY1BlcnNpc3RlciA9IG5ldyBNZXRob2RMaWJyYXJ5UGVyc2lzdGVyKCk7Ci0JCUNvbnRlbnREZXNjcmlwdGlvbkZhY3RvcnkKLQkJCQkuc2V0TWV0aG9kTGlicmFyeVBlcnNpc3Rlcihjb250ZW50RGVzY1BlcnNpc3Rlcik7Ci0KLQkJQ29udGVudERlc2NyaXB0aW9uRmFjdG9yeS5zZXRGaWxlTWFuYWdlcihGaWxlTWFuYWdlci5nZXRJbnN0YW5jZSgpKTsKLQotCQlyZWdpc3RlckVkaXRpbmdEb21haW4oZWRpdGluZ0RvbWFpbik7Ci0JfQotCi0JcHVibGljIHZvaWQgZG9TYXZlKE1hcCBvcHRpb25zKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJaWYgKExvZy5ERUJVRykgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJTYXZlIG9wdGlvbnM6ICIgKyBvcHRpb25zKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJLy8gTGlzdCByZW1vdmVkUmVzb3VyY2VzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCS8vIEZpbGUgbGliRGlyID0gbmV3Ci0JCS8vIEZpbGUoKChSZXNvdXJjZSllZGl0aW5nRG9tYWluLmdldFJlc291cmNlU2V0KCkuZ2V0UmVzb3VyY2VzKCkuZ2V0KDApKS5nZXRVUkkoKS50b0ZpbGVTdHJpbmcoKSkuZ2V0UGFyZW50RmlsZSgpOwotCi0JCXRyeSB7Ci0JCQliZWdpbk9wZXJhdGlvbigpOwotCQkJTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsIHJlc291cmNlU2V0ID0gKChNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwpIGVkaXRpbmdEb21haW4KLQkJCQkJLmdldFJlc291cmNlU2V0KCkpOwotCQkJLy8gU2F2ZSB0aGUgcmVzb3VyY2UocykKLQkJCS8vCi0JCQlyZXNvdXJjZVNldC5zYXZlKG9wdGlvbnMpOwotCi0JCQkoKEJhc2ljQ29tbWFuZFN0YWNrKSBlZGl0aW5nRG9tYWluLmdldENvbW1hbmRTdGFjaygpKS5zYXZlSXNEb25lKCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLQkJCWV4Y2VwdGlvbi5wcmludFN0YWNrVHJhY2UoKTsKLQkJCXRocm93IGV4Y2VwdGlvbjsKLQkJfSBmaW5hbGx5IHsKLQkJCWVuZE9wZXJhdGlvbigpOwotCi0JCX0KLQl9Ci0KLQkvKgotCXB1YmxpYyB2b2lkIGRpc2NhcmRDaGFuZ2VzKCkgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBlZGl0aW5nRG9tYWluLmdldFJlc291cmNlU2V0KCkuZ2V0UmVzb3VyY2VzKCkKLQkJCQkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlSZXNvdXJjZSByZXNvdXJjZSA9IChSZXNvdXJjZSkgaXRlci5uZXh0KCk7Ci0JCQlyZXNvdXJjZS5zZXRNb2RpZmllZChmYWxzZSk7Ci0JCX0KLQl9Ci0JKi8KLQotCXB1YmxpYyBib29sZWFuIGlzTGlicmFyeUxvYWRlZCgpIHsKLQkJcmV0dXJuIGxvYWRlZDsKLQl9Ci0KLQlwdWJsaWMgQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBnZXRBZGFwdGVyRmFjdG9yeSgpIHsKLQkJcmV0dXJuIChDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KSBnZXRFZGl0aW5nRG9tYWluKCkuZ2V0QWRhcHRlckZhY3RvcnkoKTsKLQl9Ci0KLQlwcml2YXRlIExpc3QgZ2V0TWV0aG9kTW9kZWxzKCkgewotCQlNZXRob2RMaWJyYXJ5IGxpYnJhcnkgPSBnZXRMaWJyYXJ5KCk7Ci0JCXJldHVybiAobGlicmFyeSA9PSBudWxsKSA/IG5ldyBBcnJheUxpc3QoKSA6IGxpYnJhcnkuZ2V0TWV0aG9kUGx1Z2lucygpOwotCX0KLQotCXB1YmxpYyBNZXRob2RQbHVnaW4gZ2V0TWV0aG9kUGx1Z2luKFN0cmluZyBndWlkKSB7Ci0JCWlmIChndWlkICE9IG51bGwpIHsJCi0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gZ2V0TWV0aG9kTW9kZWxzKCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCU1ldGhvZFBsdWdpbiBwID0gKE1ldGhvZFBsdWdpbikgaXQubmV4dCgpOwotCQkJCWlmIChndWlkLmVxdWFscyhwLmdldEd1aWQoKSkpIHsKLQkJCQkJcmV0dXJuIHA7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogZ2V0IHByb2Nlc3MgZmFtaWx5IGJ5IG5hbWUKLQkgKiAKLQkgKiBAcGFyYW0gbmFtZQotCSAqIEByZXR1cm4gUHJvY2Vzc0ZhbWlseQotCSAqLwotCXB1YmxpYyBQcm9jZXNzRmFtaWx5IGdldFByb2Nlc3NGYW1pbHkoU3RyaW5nIG5hbWUpIHsKLQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWc7Ci0JCU1ldGhvZExpYnJhcnkgbGlicmFyeSA9IGdldExpYnJhcnkoKTsKLQkJaWYgKGxpYnJhcnkgIT0gbnVsbCkgewotCQkJTGlzdCBjb25maWdzID0gbGlicmFyeS5nZXRQcmVkZWZpbmVkQ29uZmlndXJhdGlvbnMoKTsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBjb25maWdzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQljb25maWcgPSAoTWV0aG9kQ29uZmlndXJhdGlvbikgaXQubmV4dCgpOwotCQkJCWlmICgoY29uZmlnIGluc3RhbmNlb2YgUHJvY2Vzc0ZhbWlseSkKLQkJCQkJCSYmIGNvbmZpZy5nZXROYW1lKCkuZXF1YWxzKG5hbWUpKSB7Ci0JCQkJCXJldHVybiAoUHJvY2Vzc0ZhbWlseSkgY29uZmlnOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIHJlZ2lzdGVyIGVkdGluZyBkb21haW4gd2l0aCB0aGlzIGxpYnJhcnkKLQkgKiAKLQkgKiBAcGFyYW0gZG9tYWluCi0JICovCi0JcHVibGljIHZvaWQgcmVnaXN0ZXJFZGl0aW5nRG9tYWluKEFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbiBkb21haW4pIHsKLQkJLyoqCi0JCSAqIHRoaXMgbm90aWZ5cyBhbGwgY2hhbmdlcywgbm90IGp1c3QgdGhlIGNvbnRlbnQgY2hhbmdlLCBvbmx5IHBpY2sgdGhlCi0JCSAqIG9uZXMgZm9yIGVsZW1lbnQgdXBkYXRlcy4gVGhlIG90aGVyIG9wZXJhdGlvbnMgYXJlIGNvbHZlcmVkIGJ5IHRoZQotCQkgKiBDb21tYW5kIGV2ZW50cwotCQkgKi8KLQkJKChDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KSBkb21haW4uZ2V0QWRhcHRlckZhY3RvcnkoKSkKLQkJCQkuYWRkTGlzdGVuZXIobm90aWZ5Q2hhbmdlZExpc3RlbmVyKTsKLQotCQkvLyBBZGQgYSBsaXN0ZW5lciB0byBzZXQgdGhlIG1vc3QgcmVjZW50IGNvbW1hbmQncyBhZmZlY3RlZCBvYmplY3RzIHRvCi0JCS8vIGJlIHRoZSBzZWxlY3Rpb24gb2YgdGhlIHZpZXdlciB3aXRoIGZvY3VzLgotCQlkb21haW4uZ2V0Q29tbWFuZFN0YWNrKCkuYWRkQ29tbWFuZFN0YWNrTGlzdGVuZXIoY29tbWFuZFN0YWNrTGlzdGVuZXIpOwotCi0JfQotCi0JcHVibGljIHZvaWQgbGlzdGVuVG8oQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlhZGFwdGVyRmFjdG9yeS5hZGRMaXN0ZW5lcihub3RpZnlDaGFuZ2VkTGlzdGVuZXIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHN0b3BMaXN0ZW5pbmdUbyhDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCWFkYXB0ZXJGYWN0b3J5LnJlbW92ZUxpc3RlbmVyKG5vdGlmeUNoYW5nZWRMaXN0ZW5lcik7Ci0JfQotCi0JcHVibGljIHZvaWQgbGlzdGVuVG8oQ29tbWFuZFN0YWNrIGNvbW1hbmRTdGFjaykgewotCQljb21tYW5kU3RhY2suYWRkQ29tbWFuZFN0YWNrTGlzdGVuZXIoY29tbWFuZFN0YWNrTGlzdGVuZXIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHN0b3BMaXN0ZW5pbmdUbyhDb21tYW5kU3RhY2sgY29tbWFuZFN0YWNrKSB7Ci0JCWNvbW1hbmRTdGFjay5yZW1vdmVDb21tYW5kU3RhY2tMaXN0ZW5lcihjb21tYW5kU3RhY2tMaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBzYXZlT3B0aW9ucy4KLQkgKi8KLQlwdWJsaWMgTWFwIGdldFNhdmVPcHRpb25zKCkgewotCQlyZXR1cm4gc2F2ZU9wdGlvbnM7Ci0JfQotCi0JcHVibGljIEZpbGUgZ2V0TGlicmFyeVJvb3RQYXRoKCkgewotCQlVUkkgdXJpID0gdGhpcy5nZXRMaWJyYXJ5VVJJKCk7Ci0JCWlmICh1cmkgIT0gbnVsbCkgewotCQkJU3RyaW5nIHBhdGggPSB1cmkudG9GaWxlU3RyaW5nKCk7Ci0JCQlGaWxlIGYgPSBuZXcgRmlsZShwYXRoKTsKLQkJCXJldHVybiBmLmdldFBhcmVudEZpbGUoKTsKLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZE1ldGhvZFBsdWdpbihmaW5hbCBNZXRob2RQbHVnaW4gbW9kZWwpIHsKLQotCQkvLyBzaW5jZSB0aGlzIHdpbGwgY2F1c2UgVUkgdXBkYXRlLCB3aGljaCBtdXN0IGJlIGV4ZWN1dGVkIGluIHRoZSBVSQotCQkvLyB0aHJlYWQKLQkJLy8gb3RoZXJ3aXNlLCB3aWxsIGNhdXNlIEludmFsaWQgVGhyZWFkIEFjY2VzcyBleGNlcHRpb24KLQkJZmluYWwgRXhjZXB0aW9uW10gZXhjZXB0aW9ucyA9IG5ldyBFeGNlcHRpb25bMV07Ci0KLQkJU2FmZVVwZGF0ZUNvbnRyb2xsZXIuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCWdldExpYnJhcnkoKS5nZXRNZXRob2RQbHVnaW5zKCkuYWRkKG1vZGVsKTsKLQotCQkJCUlNZXRob2RMaWJyYXJ5UGVyc2lzdGVyLkZhaWxTYWZlTWV0aG9kTGlicmFyeVBlcnNpc3RlciBwZXJzaXN0ZXIgPSBDb250ZW50RGVzY3JpcHRpb25GYWN0b3J5Ci0JCQkJCQkuZ2V0TWV0aG9kTGlicmFyeVBlcnNpc3RlcigpLmdldEZhaWxTYWZlUGVyc2lzdGVyKCk7Ci0JCQkJdHJ5IHsKLQkJCQkJcGVyc2lzdGVyLnNhdmUoZ2V0TGlicmFyeSgpLmVSZXNvdXJjZSgpKTsKLQkJCQkJcGVyc2lzdGVyLmNvbW1pdCgpOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCXBlcnNpc3Rlci5yb2xsYmFjaygpOwotCQkJCQlleGNlcHRpb25zWzBdID0gZTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQotCQkJCW1vZGVsLmVSZXNvdXJjZSgpLmVBZGFwdGVycygpLmFkZChyZXNvdXJjZUNoYW5nZWRMaXN0ZW5lcik7Ci0JCQl9Ci0JCX0pOwotCi0JCWlmIChleGNlcHRpb25zWzBdICE9IG51bGwpIHsKLQkJCXRocm93IG5ldyBXcmFwcGVkRXhjZXB0aW9uKGV4Y2VwdGlvbnNbMF0pOwotCQl9Ci0JfQotCi0JLyoqCi0JICogRW5hYmxlcy9kaXNhYmxlcyBub3RpZmljYXRpb24gZW50aXJlbHkuCi0JICogCi0JICogQHBhcmFtIGIKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXROb3RpZmljYXRpb25FbmFibGVkKGJvb2xlYW4gYikgewotCQllZGl0aW5nRG9tYWluLmdldFJlc291cmNlU2V0KCkuZVNldERlbGl2ZXIoYik7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNOb3RpZmljYXRpb25FbmFibGVkKCkgewotCQlyZXR1cm4gZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpLmVEZWxpdmVyKCk7Ci0JfQotCi0JLyoqCi0JICogY2FsbCB0aGlzIG1ldGhvZCB3aGVuIHRoZSBjdXJyZW50IGxpYnJhcnkgaXMgdG8gYmUgY2xvc2VkLiBmb3IgZXhhbXBsZSwKLQkgKiB3aGVuIHlvdSB0cnkgdG8gb3BlbiBhIG5vdGhlciBsaWJyYXJ5IGZvciBjcmVhdGUgYSBuZXcgbGlicmFyeQotCSAqLwotCXB1YmxpYyB2b2lkIGNsb3NlT3BlbmVkTGlicmFyeSgpIHsKLQkJbm90aWZ5TGlzdGVuZXJzKElMaWJyYXJ5Q2hhbmdlTGlzdGVuZXIuT1BUSU9OX0xJQlJBUllfQ0xPU0VELCBudWxsKTsKLQotCQlpZiAoTG9nLkRFQlVHKSB7Ci0JCQlTeXN0ZW0ub3V0Ci0JCQkJCS5wcmludGxuKCJVc2VkIG1lbW9yeSBiZWZvcmUgY2xvc2luZyBsaWJyYXJ5OiAiICsgKFJ1bnRpbWUuZ2V0UnVudGltZSgpLnRvdGFsTWVtb3J5KCkgLSBSdW50aW1lLmdldFJ1bnRpbWUoKS5mcmVlTWVtb3J5KCkpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCS8vIFJBVExDMDAzODQ1OTggLSBFeHBvcnQ6IEluZmluaXRlIGxvb3AgTnVsbHBvaW50ZXJFeGNlcHRpb24gYWZ0ZXIKLQkJLy8gZXhwb3J0aW5nIGFuZCB1bmNoZWNraW5nIHJ1cCBwbHVnaW4gaW4gY29uZmlndXJhdGlvbgotCQkvLyBzbyBkb24ndCBkaXNwb3NlIGl0IGlmIG5vdCB0aGUgbWFpbiBzaW5nbGV0b24gaW5zdGFuY2UKLQkJaWYgKGlzU2luZ2xldG9uSW5zdGFuY2UpIHsKLQkJCS8vIGRpc3Bvc2UgYWxsIGl0ZW0gcHJvdmlkZXJzCi0JCQkvLwotCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UucmVzZXQoKTsKLQotCQkJLy8gY2xlYXIgZmlsdGVyIGNvbnN0YW50cyBoYXNoTWFwCi0JCQlpZiAoRmlsdGVyQ29uc3RhbnRzLmhhc2hNYXAgIT0gbnVsbCkgewotCQkJCUZpbHRlckNvbnN0YW50cy5oYXNoTWFwLmNsZWFyKCk7Ci0JCQl9Ci0JCX0KLQotCQlpZiAodGhpcy5sYXlvdXRNZ3IgIT0gbnVsbCkgewotCQkJdGhpcy5sYXlvdXRNZ3IuY2xlYXIoKTsKLQkJfQotCi0KLQkJLy8gY2xlYXIgdGhlIHRlbXAgbGF5b3V0IAotCQlMYXlvdXRSZXNvdXJjZXMuY2xlYXIoKTsKLQotCQkvKgotCQkgKiBpZiAoIHRoaXMuZGVwTWdyICE9IG51bGwgKSB7IHRoaXMuZGVwTWdyLmNsZWFyKCk7IH0gdGhpcy5kZXBNZ3IgPQotCQkgKiBudWxsOwotCQkgKi8KLQotCQl0aGlzLmxheW91dE1nciA9IG51bGw7Ci0KLQkJLy8gdGhpcy5pbnZhbGlkR3VpZHMuY2xlYXIoKTsKLQotCQlNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwgcmVzb3VyY2VTZXQgPSAoTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsKSBlZGl0aW5nRG9tYWluCi0JCQkJLmdldFJlc291cmNlU2V0KCk7Ci0KLQkJcmVzb3VyY2VTZXQuY2xlYXJFcnJvcnMoKTsKLQkJTWV0aG9kTGlicmFyeSBsaWJyYXJ5ID0gZ2V0TGlicmFyeSgpOwotCi0JCXVubG9ja0xpYnJhcnkoKTsKLQotCQlyZXNvdXJjZVNldC5yZXNldCgpOwotCQlSZWZyZXNoSm9iLmdldEluc3RhbmNlKCkucmVzZXQoKTsKLQotCQlSdW50aW1lLmdldFJ1bnRpbWUoKS5nYygpOwotCQlpZiAoTG9nLkRFQlVHKSB7Ci0JCQlTeXN0ZW0ub3V0Ci0JCQkJCS5wcmludGxuKCJVc2VkIG1lbW9yeSBhZnRlciBjbG9zaW5nIGxpYnJhcnk6ICIgKyAoUnVudGltZS5nZXRSdW50aW1lKCkudG90YWxNZW1vcnkoKSAtIFJ1bnRpbWUuZ2V0UnVudGltZSgpLmZyZWVNZW1vcnkoKSkpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCX0KLQotCXByaXZhdGUgdm9pZCB1bmxvY2tMaWJyYXJ5KCkgewotCQkvLyByZWxlYXNlIGxvY2sgb24gb2xkIGxpYidzIHByb2plY3QKLQkJdHJ5IHsKLQkJCWlmIChsb2NrICE9IG51bGwpIHsKLQkJCQlsb2NrLnJlbGVhc2UoKTsKLQkJCQlsb2NrLmNoYW5uZWwoKS5jbG9zZSgpOwotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBMb2NrcyB0aGUgLmxvY2sgZmlsZSBpbiB0aGUgZ2l2ZW4gcGF0aC4gQ3JlYXRlcyBhIC5sb2NrIGZpbGUgaWYgb25lIGRvZXMKLQkgKiBub3QgZXhpc3QKLQkgKiAKLQkgKiBAcGFyYW0gZmlsZQotCSAqICAgICAgICAgICAgcGF0aCB0byBsaWJyYXJ5Ci0JICovCi0JcHVibGljIHZvaWQgbG9ja0xpYnJhcnkoRmlsZSBsaWJEaXJGaWxlKSB7Ci0JCUZpbGUgbG9ja0ZpbGUgPSBuZXcgRmlsZShsaWJEaXJGaWxlLCBSZXNvdXJjZVV0aWwuTE9DS19GSUxFTkFNRSk7Ci0JCWxvY2sgPSBGaWxlVXRpbC5sb2NrRmlsZShsb2NrRmlsZSk7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS94bWkvaW50ZXJuYWwvWE1JT3Bwb3NpdGVGZWF0dXJlTG9hZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3htaS9pbnRlcm5hbC9YTUlPcHBvc2l0ZUZlYXR1cmVMb2FkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTNiN2I1MC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3htaS9pbnRlcm5hbC9YTUlPcHBvc2l0ZUZlYXR1cmVMb2FkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuSU9wcG9zaXRlRmVhdHVyZUxvYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UuTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLQotLyoqCi0gKiBNYW5hZ2VzIHRoZSBsb2FkaW5nIG9mIG9wcG9zaXRlIGZlYXR1cmVzIGZvciBhIFhNSS1iYXNlZCBtZXRob2QgbGlicmFyeS4KLSAqICAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgIDEuMAotICovCi1wdWJsaWMgY2xhc3MgWE1JT3Bwb3NpdGVGZWF0dXJlTG9hZGVyIGltcGxlbWVudHMgSU9wcG9zaXRlRmVhdHVyZUxvYWRlciB7Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuSU9wcG9zaXRlRmVhdHVyZUxvYWRlciNsb2FkT3Bwb3NpdGVGZWF0dXJlcyhqYXZhLnV0aWwuQ29sbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBsb2FkT3Bwb3NpdGVGZWF0dXJlcyhDb2xsZWN0aW9uIGVsZW1lbnRzKSB7Ci0JCUhhc2hTZXQgb3Bwb3NpdGVGZWF0dXJlcyA9IG5ldyBIYXNoU2V0KCk7Ci0JCUhhc2hTZXQgZGVsZXRlZEdVSURzID0gbmV3IEhhc2hTZXQoKTsKLQkJTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsIHJlc291cmNlU2V0ID0gbnVsbDsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZWxlbWVudHMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgbyA9IChPYmplY3QpIGl0ZXIubmV4dCgpOwotCQkJaWYobyBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCQlNZXRob2RFbGVtZW50IGUgPSAoTWV0aG9kRWxlbWVudCkgbzsKLQkJCQlpZihyZXNvdXJjZVNldCA9PSBudWxsKSB7Ci0JCQkJCVJlc291cmNlIHJlc291cmNlID0gZS5lUmVzb3VyY2UoKTsKLQkJCQkJUmVzb3VyY2VTZXQgcnNldDsKLQkJCQkJaWYocmVzb3VyY2UgPT0gbnVsbCB8fCAhKChyc2V0ID0gcmVzb3VyY2UuZ2V0UmVzb3VyY2VTZXQoKSkgaW5zdGFuY2VvZiBNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwpKSB7Ci0JCQkJCQljb250aW51ZTsKLQkJCQkJfQotCQkJCQlyZXNvdXJjZVNldCA9IChNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwpIHJzZXQ7Ci0JCQkJfQotCQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBlLmVBbGxDb250ZW50cygpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJCU9iamVjdCBlbGVtZW50ID0gaXRlcmF0b3IubmV4dCgpOwotCQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCQkJCUNvbGxlY3Rpb24gZmVhdHVyZXMgPSAoKE1ldGhvZEVsZW1lbnQpIGVsZW1lbnQpCi0JCQkJCQkJCS5nZXRPcHBvc2l0ZUZlYXR1cmVzKCk7Ci0JCQkJCQlpZiAoZmVhdHVyZXMgIT0gbnVsbAotCQkJCQkJCQkmJiAhZmVhdHVyZXMuaXNFbXB0eSgpKSB7Ci0JCQkJCQkJb3Bwb3NpdGVGZWF0dXJlcwotCQkJCQkJCQkJLmFkZEFsbChmZWF0dXJlcyk7Ci0JCQkJCQkJZGVsZXRlZEdVSURzLmFkZCgoKE1ldGhvZEVsZW1lbnQpIGVsZW1lbnQpCi0JCQkJCQkJCQkuZ2V0R3VpZCgpKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQlDb2xsZWN0aW9uIGZlYXR1cmVzID0gZS5nZXRPcHBvc2l0ZUZlYXR1cmVzKCk7Ci0JCQkJaWYgKGZlYXR1cmVzICE9IG51bGwgJiYgIWZlYXR1cmVzLmlzRW1wdHkoKSkgewotCQkJCQlvcHBvc2l0ZUZlYXR1cmVzLmFkZEFsbChmZWF0dXJlcyk7Ci0JCQkJCWRlbGV0ZWRHVUlEcy5hZGQoZS5nZXRHdWlkKCkpOwotCQkJCX0JCQkJCi0JCQl9Ci0JCX0KLQkJCi0JCXJlc291cmNlU2V0LmxvYWRPcHBvc2l0ZUZlYXR1cmVzKG5ldyBBcnJheUxpc3Qob3Bwb3NpdGVGZWF0dXJlcyksIGRlbGV0ZWRHVUlEcyk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3htaS9pbnRlcm5hbC9wYWNrYWdlLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3htaS9pbnRlcm5hbC9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlNzc2OGUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS94bWkvaW50ZXJuYWwvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgaW1wbGVtZW50YXRpb24gc3VwcG9ydCBmb3IgbWFuYWdpbmcgYSBYTUktYmFzZWQgbWV0aG9kIGxpYnJhcnkuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS94bWkvcGFja2FnZS5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS94bWkvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYTVkZTJhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkveG1pL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIHRoZSBpbXBsZW1lbnRhdGlvbiBmb3IgbWFuYWdpbmcgYSBYTUktYmFzZWQgbWV0aG9kIGxpYnJhcnkuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS94bWkvcHJlZmVyZW5jZXMvWE1JTGlicmFyeVByZWZlcmVuY2VzLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3htaS9wcmVmZXJlbmNlcy9YTUlMaWJyYXJ5UHJlZmVyZW5jZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGI3NjVkZi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3htaS9wcmVmZXJlbmNlcy9YTUlMaWJyYXJ5UHJlZmVyZW5jZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS5wcmVmZXJlbmNlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24ucHJlZmVyZW5jZXMuSVByZWZlcmVuY2VTdG9yZVdyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5GaWxlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkuWE1JTGlicmFyeVBsdWdpbjsKLQotLyoqCi0gKiBUaGUgWE1MIE1ldGhvZCBMaWJyYXJ5IHByZWZlcmVuY2VzLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFhNSUxpYnJhcnlQcmVmZXJlbmNlcyB7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCBsaWJyYXJ5IHBhdGggcHJlZmVyZW5jZSBrZXkuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9MSUJSQVJZX1BBVEggPSAiZGVmYXVsdExpYnJhcnlQYXRoIjsgLy8kTk9OLU5MUy0xJAotCi0Jc3RhdGljIHsKLQkJLy8gSW5pdGlhbGl6ZSB0aGUgZGVmYXVsdCBwcmVmZXJlbmNlIHZhbHVlcy4KLQkJSVByZWZlcmVuY2VTdG9yZVdyYXBwZXIgc3RvcmUgPSBYTUlMaWJyYXJ5UGx1Z2luLmdldERlZmF1bHQoKQotCQkJCS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQkJU3RyaW5nIGRlZmF1bHRMaWJyYXJ5UGF0aCA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgidXNlci5ob21lIikgLy8kTk9OLU5MUy0xJAotCQkJCS8vIEZJWE1FISBBdm9pZCB1c2luZyBoYXJkIGNvZGVkIGNvbnN0YW50Ci0JCQkJKyBGaWxlVXRpbC5GSUxFX1NFUCArICJFUEYiIC8vJE5PTi1OTFMtMSQKLQkJCQkrIEZpbGVVdGlsLkZJTEVfU0VQICsgIk1ldGhvZCBMaWJyYXJpZXMiOyAvLyROT04tTkxTLTEkCi0JCXN0b3JlLnNldERlZmF1bHQoREVGQVVMVF9MSUJSQVJZX1BBVEgsIGRlZmF1bHRMaWJyYXJ5UGF0aCk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgZGVmYXVsdCBsaWJyYXJ5IHBhdGggcHJlZmVyZW5jZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXREZWZhdWx0TGlicmFyeVBhdGgoKSB7Ci0JCXJldHVybiBYTUlMaWJyYXJ5UGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKS5nZXRTdHJpbmcoCi0JCQkJREVGQVVMVF9MSUJSQVJZX1BBVEgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvLmNsYXNzcGF0aCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5Ly5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2NWFjMDYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5Ly5vcHRpb25zIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvLm9wdGlvbnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjNjlkM2UuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvLm9wdGlvbnMKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLSMgVHVybiBvbiBkZWJ1ZyB0cmFjZSBmb3IgdGhlIExpYnJhcnkgcGx1Zy1pbgotb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvZGVidWc9dHJ1ZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvLnByb2plY3QgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjUwMDM4ZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5PC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L01FVEEtSU5GL01BTklGRVNULk1GIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3MzNmMzguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnk7IHNpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuNS4wLnF1YWxpZmllcgotQnVuZGxlLUNsYXNzUGF0aDogbGlicmFyeS5qYXIKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlQbHVnaW4KLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotRWNsaXBzZS1MYXp5U3RhcnQ6IHRydWUKLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5lcGYubGlicmFyeSwKLSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLAotIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uY2xvc3VyZSwKLSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5ldmVudHMsCi0gb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LAotIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5kaWFncmFtLAotIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5lbGVtZW50cywKLSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQudXRpbCwKLSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wcmVmZXJlbmNlcywKLSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wcmVmcywKLSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wcm9qZWN0LAotIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnNlcnZpY2VzLAotIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwKLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDt2aXNpYmlsaXR5Oj1yZWV4cG9ydCwKLSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0O3Zpc2liaWxpdHk6PXJlZXhwb3J0LAotIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlO3Zpc2liaWxpdHk6PXJlZXhwb3J0LAotIG9yZy5hcGFjaGUuYW50LAotIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZSwKLSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcywKLSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pO3Zpc2liaWxpdHk6PXJlZXhwb3J0LAotIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2J1aWxkLnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxY2ZlNDI5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi1zb3VyY2UubGlicmFyeS5qYXIgPSBzcmMvCi1vdXRwdXQubGlicmFyeS5qYXIgPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSBsaWJyYXJ5LmphcixcCi0gICAgICAgICAgICAgICAub3B0aW9ucyxcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgaWNvbnMvLFwKLSAgICAgICAgICAgICAgIGxheW91dC8sXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBzY2hlbWEvCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9pY29ucy9Sb2xlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2ljb25zL1JvbGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NmU4ODk2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2ljb25zL1JvbGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2Nzcy9kZWZhdWx0LmNzcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9jc3MvZGVmYXVsdC5jc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2NjhjMDAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2Nzcy9kZWZhdWx0LmNzcworKysgL2Rldi9udWxsCkBAIC0xLDUyNiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICovCi1ib2R5IHsKLQliYWNrZ3JvdW5kLWltYWdlOiBub25lOwotCWJhY2tncm91bmQtY29sb3I6ICNmZmZmZmY7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWYsIGthbmppMjsKLQlmb250LXNpemU6IDEwcHQ7Ci19Ci0KLXAgewotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmLCBrYW5qaTI7Ci0JZm9udC1zaXplOiAxMHB0OwotfQotCi1oMSB7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWYsIGthbmppMjsKLQlmb250LXNpemU6IGxhcmdlOwotfQotCi1oMiB7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWYsIGthbmppMjsKLQlmb250LXNpemU6IDE1MCU7Ci19Ci0KLWgzIHsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZiwga2FuamkyOwotfQotCi1oNCwgaDUsIGg2IHsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZiwga2FuamkyOwotCWZvbnQtc2l6ZTogMTAwJTsKLX0KLQotYTpsaW5rIHsKLQljb2xvcjogIzAwMzM5OTsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZiwga2FuamkyOwotCWZvbnQtc2l6ZTogMTBwdDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLWE6YWN0aXZlIHsKLQljb2xvcjogIzAwMzM5OTsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZiwga2FuamkyOwotCWZvbnQtc2l6ZTogMTBwdDsKLQl0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKLX0KLQotYTp2aXNpdGVkIHsKLQljb2xvcjogIzAwMzM5OTsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZiwga2FuamkyOwotCWZvbnQtc2l6ZTogMTBwdDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLWFbaHJlZl06aG92ZXIgewotCWNvbG9yOiAjZmYwMDAwOwotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmLCBrYW5qaTI7Ci0JZm9udC1zaXplOiAxMHB0OwotCXRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOwotfQotCi1vbCB7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWYsIGthbmppMjsKLQlmb250LXNpemU6IDEwcHQ7Ci0JbGlzdC1zdHlsZS10eXBlOiBkZWNpbWFsOwotCW1hcmdpbi1sZWZ0OiAzMHB4OwotfQotCi1vbCBsaSB7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWYsIGthbmppMjsKLQlmb250LXNpemU6IDEwcHQ7Ci0JdGV4dC1hbGlnbjogbGVmdDsKLX0KLQotdWwgewotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmLCBrYW5qaTI7Ci0JZm9udC1zaXplOiAxMHB0OwotCWxpc3Qtc3R5bGUtdHlwZTogZGlzYzsKLQltYXJnaW4tbGVmdDogMzBweDsKLQltYXJnaW4tdG9wOiAwcHg7Ci0JcGFkZGluZy1sZWZ0OiAwcHg7Ci19Ci0KLXVsIGxpIHsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZiwga2FuamkyOwotCWZvbnQtc2l6ZTogMTBwdDsKLQl0ZXh0LWFsaWduOiBsZWZ0OwotfQotCi10YWJsZSB7Ci0JYmFja2dyb3VuZC1pbWFnZTogbm9uZTsKLQliYWNrZ3JvdW5kOiAjZmZmZmZmOwotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmLCBrYW5qaTI7Ci0JZm9udC1zaXplOiAxMHB0OwkKLX0KLQotdGJvZHkgewotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmLCBrYW5qaTI7Ci0JZm9udC1zaXplOiAxMHB0OwotCXZhbGlnbjogYmFzZWxpbmU7Ci19Ci0KLXRoIHsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZiwga2FuamkyOwotCWZvbnQtc2l6ZTogMTBwdDsKLQl0ZXh0LWFsaWduOiBsZWZ0OwotfQotCi10ZCB7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWYsIGthbmppMjsKLQlmb250LXNpemU6IDEwcHQ7Ci19Ci0KLXRkIHVsIHsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZiwga2FuamkyOwotCWZvbnQtc2l6ZTogMTBwdDsKLQltYXJnaW4tYm90dG9tOiAwcHg7Ci0JbWFyZ2luLWxlZnQ6IDMwcHg7Ci19Ci0KLS5wYWdlVGl0bGUgewotCWJhY2tncm91bmQ6ICM5OTk5Y2M7Ci0JY29sb3I6ICNmZmZmZmY7Ci0JZm9udC1zaXplOiAxMnB0OwotCWZvbnQtd2VpZ2h0OiBib2xkOwotCXBhZGRpbmctYm90dG9tOiA1cHg7Ci0JcGFkZGluZy1sZWZ0OiAxMHB4OwotCXBhZGRpbmctcmlnaHQ6IDEwcHg7Ci0JcGFkZGluZy10b3A6IDVweDsKLQl0ZXh0LWFsaWduOiBsZWZ0OwotfQotCi0ucGFnZVRpdGxlU2VwYXJhdG9yIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjMDAwMDAwOwotCXBhZGRpbmc6IDBweDsKLX0KLQotLnRhYiB7Ci0JYmFja2dyb3VuZC1jb2xvcjogIzVjODFhNzsKLQljb2xvcjogI2ZmZmZmZjsKLQlmb250LWZhbWlseTogdmVyZGFuYSwgYXJpYWwsIHNhbnMtc2VyaWY7IAotCWZvbnQtc2l6ZTogMTFweDsKLQlmb250LXdlaWdodDogYm9sZDsKLX0KLQotLmFjdGl2ZVRhYiB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI2M4ZDdlMzsKLQljb2xvcjogIzI5M2Q2YjsJCi0JZm9udC1mYW1pbHk6IHZlcmRhbmEsIGFyaWFsLCBzYW5zLXNlcmlmOyAKLQlmb250LXNpemU6IDExcHg7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci19Ci0KLWEudGFiOmxpbmssIGEudGFiOmFjdGl2ZSwgYS50YWI6dmlzaXRlZCB7Ci0JY29sb3I6ICNmZmZmZmY7Ci0JZm9udC1mYW1pbHk6IHZlcmRhbmEsIGFyaWFsLCBzYW5zLXNlcmlmOyAKLQlmb250LXNpemU6IDExcHg7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci19Ci0KLWEudGFiOmhvdmVyIHsKLQl0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsJCi19Ci0KLS5vdmVydmlldyB7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWYsIGthbmppMjsKLQlmb250LXNpemU6IDEwcHQ7Ci0JZm9udC13ZWlnaHQ6IG5vcm1hbDsKLQlwYWRkaW5nLWJvdHRvbTogMTBweDsKLQlwYWRkaW5nLWxlZnQ6IDIwcHg7Ci0JcGFkZGluZy1yaWdodDogMHB4OwotCXBhZGRpbmctdG9wOiAxMHB4OwotfQotCi0ub3ZlcnZpZXdUYWJsZSB7Ci0JYmFja2dyb3VuZDogI2ZmZmZmZjsKLQl3aWR0aDogMTAwJTsJCi19Ci0KLS5vdmVydmlld1RhYmxlIHRkIHsKLQlwYWRkaW5nOiA1cHggNXB4IDVweCA1cHg7Ci19Ci0KLS5vdmVydmlld1NlcGFyYXRvciB7Ci0JYmFja2dyb3VuZC1jb2xvcjogIzAwMDAwMDsKLQlwYWRkaW5nOiAwcHg7Ci19Ci0KLS5leHBhbmRDb2xsYXBzZVRleHQgewotCWZvbnQtZmFtaWx5OiB2ZXJkYW5hLCBhcmlhbCwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDhwdDsKLQlwYWRkaW5nLWxlZnQ6IDVweDsKLQlwYWRkaW5nLXJpZ2h0OiA1cHg7Ci19Ci0KLS5leHBhbmRDb2xsYXBzZUxpbmsgewotCWNvbG9yOiAjMzMzMzMzOwotCXBhZGRpbmctYm90dG9tOiA1cHg7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi0uZXhwYW5kQ29sbGFwc2VMaW5rOmhvdmVyIHsKLQljb2xvcjogIzAwMDBmZjsKLQl0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKLX0KLQotLmV4cGFuZENvbGxhcHNlTGluazp2aXNpdGVkIHsKLQljb2xvcjogIzMzMzMzMzsKLX0KLQotLnNlY3Rpb25IZWFkaW5nIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjOThiMWM0OwotCWNvbG9yOiAjZmZmZmZmOwotCWN1cnNvcjogaGFuZDsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZiwga2FuamkyOwotCWZvbnQtc2l6ZTogMTBwdDsKLQlmb250LXdlaWdodDogYm9sZDsKLQlwYWRkaW5nLWJvdHRvbTogMnB4OwotCXBhZGRpbmctbGVmdDogMnB4OwotCXBhZGRpbmctdG9wOiAycHg7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi0uc2VjdGlvbkNvbnRlbnQgewotCXBhZGRpbmctYm90dG9tOiAwcHg7Ci0JcGFkZGluZy1sZWZ0OiAwcHg7Ci0JcGFkZGluZy1yaWdodDogMHB4OwotCXBhZGRpbmctdG9wOiAwcHg7Ci0JdGV4dC1hbGlnbjogbGVmdDsKLX0KLQotLnNlY3Rpb25UYWJsZSB7Ci0JYm9yZGVyLWJvdHRvbTogI2NjYyBzb2xpZCAwcHg7Ci0JYm9yZGVyLWxlZnQ6ICNjY2Mgc29saWQgMXB4OwotCWJvcmRlci1yaWdodDogI2NjYyBzb2xpZCAwcHg7Ci0JYm9yZGVyLXRvcDogI2NjYyBzb2xpZCAxcHg7Ci0JYm9yZGVyLXRvcC1jb2xvcjogI2NjYzsKLQkKLQkvKmRvbid0IGRlZmluZSBwYWRkaW5nIGluIHRhYmxlLCB0aGUgYmVoYXZpb3IgaXMgZGlmZmVyZW50IGluIElFIGFuZCBmaXJlZm94LiAKLQkgSW4gSUUsIHRoZSBwYWRkaW5nIGlzIGFwcGxpZWQgYmVmb3JlIHRoZSBjZWxsJ3MgYmFja2dyb3VuZCBjb2xvciBpcyBlbmZvcmNlZC4KLQkgaW4gZmlyZWZveCwgdGhlIHBhZGRpbmcgaXMgYXBwbGllZCBmaXJzdCwgc28gbGVhdmUgdGhlIHRhYmxlJ3MgYmFja2dyb3VuZCBpbnRoZSBwYWRkaW5nIGFyZWEuCi0JIERlZmluZSB0aGUgcGFkZGluZyBpbiB0aGUgdGFibGUgY2VsbCBpbnN0ZWFkLCB0aGlzIHdvcmtzIGluIGJvdGggSUUgYW5kIG1vemlsbGEKLQkgKi8KLQlwYWRkaW5nOiAwcHggMHB4IDBweCAwcHg7CQotCXdpZHRoOiAxMDAlOwotfQotCi0uc2VjdGlvblRhYmxlSGVhZGluZyB7Ci0JYmFja2dyb3VuZDogI2VlZTsKLQlib3JkZXItYm90dG9tOiAjY2NjIHNvbGlkIDFweDsKLQlib3JkZXItbGVmdDogI2NjYyBzb2xpZCAwcHg7Ci0JYm9yZGVyLXJpZ2h0OiAjY2NjIHNvbGlkIDFweDsKLQlib3JkZXItdG9wOiAjY2NjIHNvbGlkIDBweDsKLQljb2xvcjogIzMzMzMzMzsKLQloZWlnaHQ6IDIwOwotCXRleHQtYWxpZ246IGxlZnQ7Ci0Jd2lkdGg6IDIwJTsKLQlwYWRkaW5nOiAxMHB4IDEwcHggMTBweCAxMHB4OwkKLQotfQotCi0uc2VjdGlvblRhYmxlQ2VsbEhlYWRpbmcgewotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmLCBrYW5qaTI7Ci0JZm9udC1zaXplOiA4cHQ7Ci0JZm9udC13ZWlnaHQ6IG5vcm1hbDsKLQlmb250LWNvbG9yOiAjNjY2NjY2OwotCXBhZGRpbmc6IDEwcHggMTBweCAxMHB4IDEwcHg7Ci0KLX0KLQotLnNlY3Rpb25UYWJsZUNlbGwgewotCWJvcmRlci1ib3R0b206ICNjY2Mgc29saWQgMXB4OwotCWJvcmRlci1sZWZ0OiAjY2NjIHNvbGlkIDBweDsKLQlib3JkZXItcmlnaHQ6ICNjY2Mgc29saWQgMXB4OwotCWJvcmRlci10b3A6ICNjY2Mgc29saWQgMHB4OwotCXBhZGRpbmc6IDEwcHggMTBweCAxMHB4IDEwcHg7Ci0KLX0KLQotLnNlY3Rpb25UYWJsZVNpbmdsZUNlbGwgewotCWJvcmRlci1ib3R0b206ICNjY2Mgc29saWQgMXB4OwotCWJvcmRlci1sZWZ0OiAjY2NjIHNvbGlkIDBweDsKLQlib3JkZXItcmlnaHQ6ICNjY2Mgc29saWQgMXB4OwotCWJvcmRlci10b3A6ICNjY2Mgc29saWQgMHB4OwotCXBhZGRpbmc6IDEwcHggMTBweCAxMHB4IDEwcHg7Ci19Ci0KLS5icmVha2Rvd25UYWJsZSB7Ci0JYm9yZGVyLWJvdHRvbTogI2NjYyBzb2xpZCAwcHg7Ci0JYm9yZGVyLWxlZnQ6ICNjY2Mgc29saWQgMXB4OwotCWJvcmRlci1yaWdodDogI2NjYyBzb2xpZCAwcHg7Ci0JYm9yZGVyLXRvcDogI2NjYyBzb2xpZCAxcHg7Ci0JcGFkZGluZzogMHB4IDBweCAwcHggMHB4OwotCXdpZHRoOiAxMDAlOwotfQotCi0uYnJlYWtkb3duVGFibGUgdGggewotCWJhY2tncm91bmQ6ICNlZWU7Ci0JYm9yZGVyLWJvdHRvbTogI2NjYyBzb2xpZCAxcHg7Ci0JYm9yZGVyLWxlZnQ6ICNjY2Mgc29saWQgMHB4OwotCWJvcmRlci1yaWdodDogI2NjYyBzb2xpZCAxcHg7Ci0JYm9yZGVyLXRvcDogI2NjYyBzb2xpZCAwcHg7Ci0JY29sb3I6ICMzMzMzMzM7Ci0JaGVpZ2h0OiAyMDsKLQl0ZXh0LWFsaWduOiBsZWZ0OwotfQotCi0uYnJlYWtkb3duVGFibGUgdGQgewotCWJvcmRlci1ib3R0b206ICNjY2Mgc29saWQgMXB4OwotCWJvcmRlci1sZWZ0OiAjY2NjIHNvbGlkIDBweDsKLQlib3JkZXItcmlnaHQ6ICNjY2Mgc29saWQgMXB4OwotCWJvcmRlci10b3A6ICNjY2Mgc29saWQgMHB4OwotfQotCi0uZGVmYXVsdFRhYmxlIHsKLQlib3JkZXItYm90dG9tOiAjY2NjIHNvbGlkIDBweDsKLQlib3JkZXItbGVmdDogI2NjYyBzb2xpZCAwcHg7Ci0JYm9yZGVyLXJpZ2h0OiAjY2NjIHNvbGlkIDBweDsKLQlib3JkZXItdG9wOiAjY2NjIHNvbGlkIDBweDsKLQlwYWRkaW5nOiAwcHggMHB4IDBweCAwcHg7Ci0Jd2lkdGg6IDEwMCU7Ci19Ci0KLS5kZWZhdWx0VGFibGUgdGQgewotCWJvcmRlci1ib3R0b206ICNjY2Mgc29saWQgMHB4OwotCWJvcmRlci1sZWZ0OiAjY2NjIHNvbGlkIDBweDsKLQlib3JkZXItcmlnaHQ6ICNjY2Mgc29saWQgMHB4OwotCWJvcmRlci10b3A6ICNjY2Mgc29saWQgMHB4OwotCXRleHQtYWxpZ246IGxlZnQ7Ci19Ci0KLS5zdWJTZWN0aW9uSGVhZGluZyB7Ci0JY29sb3I6ICMzMzMzMzM7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWYsIGthbmppMjsKLQlmb250LXNpemU6IDEwcHQ7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi0uc3ViU2VjdGlvbkNvbnRlbnQgewotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmLCBrYW5qaTI7Ci0JZm9udC1zaXplOiAxMHB0OwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsJCi19Ci0KLS5zdGVwSGVhZGluZyB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI2ZmZmZmZjsKLQljb2xvcjogIzI5M2Q2YjsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZiwga2FuamkyOwotCWZvbnQtc2l6ZTogMTBwdDsKLQlmb250LXdlaWdodDogYm9sZDsKLQlwYWRkaW5nLWJvdHRvbTogMnB4OwotCXBhZGRpbmctbGVmdDogMnB4OwotCXBhZGRpbmctdG9wOiAycHg7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi0uc3RlcENvbnRlbnQgewotCWJvcmRlci1ib3R0b206ICNjY2Mgc29saWQgMHB4OwotCWJvcmRlci1sZWZ0OiAjY2NjIHNvbGlkIDBweDsKLQlib3JkZXItcmlnaHQ6ICNjY2Mgc29saWQgMHB4OwotCWJvcmRlci10b3A6ICNjY2Mgc29saWQgMHB4OwotCXBhZGRpbmctYm90dG9tOiA1cHg7Ci0JcGFkZGluZy1sZWZ0OiAwcHg7Ci0JcGFkZGluZy1yaWdodDogMHB4OwotCXBhZGRpbmctdG9wOiAwcHg7Ci0JdGV4dC1hbGlnbjogbGVmdDsKLX0KLQotLnN0ZXBUYWJsZSB7Ci0JYm9yZGVyLWJvdHRvbTogIzk5OTk5OSBzb2xpZCAxcHg7Ci0JYm9yZGVyLWxlZnQ6ICM5OTk5OTkgc29saWQgMHB4OwotCWJvcmRlci1yaWdodDogIzk5OTk5OSBzb2xpZCAwcHg7Ci0JYm9yZGVyLXRvcDogIzk5OTk5OSBzb2xpZCAwcHg7Ci0JcGFkZGluZy1ib3R0b206IDIwcHg7Ci0JcGFkZGluZy1sZWZ0OiAxMHB4OwotCXBhZGRpbmctcmlnaHQ6IDEwcHg7Ci0JcGFkZGluZy10b3A6IDEwcHg7Ci0Jd2lkdGg6IDEwMCU7Ci19Ci0KLS5zdGVwVGFibGUgdGQgewotCWJvcmRlcjogI2NjYyBzb2xpZCAwcHg7Ci19Ci0KLS5zdGVwU2VwYXJhdG9yIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjY2NjY2NjOwotCXBhZGRpbmc6IDBweDsKLX0KLQotLmJhY2tUb1RvcExpbmsgewotCWNvbG9yOiAjZmZmZmY7Ci0JZm9udC1mYW1pbHk6IHZlcmRhbmEsIGFyaWFsLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogOHB0OwotCWZvbnQtd2VpZ2h0OiBub3JtYWw7CQotCW1hcmdpbjogMHB4OwotCXBhZGRpbmctYm90dG9tOiAxMHB4OwotCXRleHQtYWxpZ246IG1pZGRsZTsJCi0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi0uYmFja1RvVG9wTGluazpob3ZlciB7Ci0JY29sb3I6ICM5Njk7Ci0JdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7Ci19Ci0KLS5iYWNrVG9Ub3BMaW5rOnZpc2l0ZWQgewotCWNvbG9yOiAjNWM4MWE3OwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsJCi19Ci0KLS5jb3B5cmlnaHQgewotCWNvbG9yOiAjNzA4MGIwOwotCWZvbnQtZmFtaWx5OiB2ZXJkYW5hLCBhcmlhbCwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDhwdDsKLQlmb250LXdlaWdodDogbm9ybWFsOwotCXBhZGRpbmctbGVmdDogMHB4OwotCXBhZGRpbmctcmlnaHQ6IDEwcHg7Ci0JcGFkZGluZy10b3A6IDI1cHg7Ci0JdGV4dC1hbGlnbjogbGVmdDsKLQl3aWR0aDogMTAwJTsKLX0KLQotLnZlcnNpb25JbmZvIHsKLQljb2xvcjogIzcwODBiMDsKLQlmb250LWZhbWlseTogdmVyZGFuYSwgYXJpYWwsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiA4cHQ7Ci0JZm9udC13ZWlnaHQ6IG5vcm1hbDsKLQlwYWRkaW5nLWxlZnQ6IDEwcHg7Ci0JcGFkZGluZy1yaWdodDogMHB4OwotCXBhZGRpbmctdG9wOiAyNXB4OwotCXRleHQtYWxpZ246IGxlZnQ7Ci19Ci0KLS5xdW90ZSB7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWYsIGthbmppMjsKLQlmb250LXNpemU6IDEwcHQ7Ci0JZm9udC1zdHlsZTogaXRhbGljOwotfQotCi0uY29kZVNhbXBsZSB7Ci0JZm9udC1mYW1pbHk6IGNvdXJpZXI7Ci0JZm9udC1zaXplOiAxMHB0OwkJCi19Ci0KLS5lbGVtZW50TGluayB7Ci0JY29sb3I6ICMwMDAwZmY7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWYsIGthbmppMjsKLQlmb250LXNpemU6IDEwcHQ7Ci19Ci0KLS5lbGVtZW50TGlua1dpdGhUeXBlIHsKLQljb2xvcjogIzAwMDBmZjsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZiwga2FuamkyOwotCWZvbnQtc2l6ZTogMTBwdDsKLX0KLQotLmVsZW1lbnRMaW5rV2l0aFVzZXJUZXh0IHsKLQljb2xvcjogIzAwMDBmZjsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZiwga2FuamkyOwotCWZvbnQtc2l6ZTogMTBwdDsKLX0KLQotI3Jlc3VsdHMgewotIAlib3JkZXItdG9wOiB0aGluIHNvbGlkIGJsYWNrOwotCW1hcmdpbjogMTBweCBhdXRvIDEwcHggYXV0bzsKLQltYXgtd2lkdGg6IDU5MHB4OwotCXBhZGRpbmc6IDEwcHg7Ci0gIAlwb3NpdGlvbjogcmVsYXRpdmU7Ci0JdGV4dC1hbGlnbjogbGVmdDsKLQl3aWR0aDogZXhwcmVzc2lvbigoZG9jdW1lbnQuYm9keS5jbGllbnRXaWR0aC0zMCkrJ3B4Jyk7Ci19Ci0KLS8qCi0uY29udGVudFRvb2xiYXJJY29uIHsKLQljb2xvcjogI2ZmZmZmZjsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci0JbWFyZ2luOiAwcHg7Ci0JcGFkZGluZzogMHB4OwkKLX0KLQotLmNvbnRlbnRUb29sYmFySWNvbiBpbWcgewotCWN1cnNvcjogcG9pbnRlcjsKLQltYXJnaW46IDBweDsKLQlwYWRkaW5nOiAwcHg7Ci0JYm9yZGVyOiAwcHg7Ci19Ci0KLQotLmNvbnRlbnRUb29sYmFySWNvbiBhOmxpbmsgewotCWNvbG9yOiAjZmZmZmZmOwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotCi0uY29udGVudFRvb2xiYXJJY29uIGE6YWN0aXZlIHsKLQljb2xvcjogI2ZmZmZmZjsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLQotLmNvbnRlbnRUb29sYmFySWNvbiBhOnZpc2l0ZWQgewotCWNvbG9yOiAjZmZmZmZmOwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotCi0uY29udGVudFRvb2xiYXJJY29uIGE6aG92ZXIgewotCWNvbG9yOiAjZmZmZmZmOwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotLmNvbnRlbnRUb29sYmFySWNvbiBhW2hyZWZdOmhvdmVyIHsKLQljb2xvcjogI2ZmZmZmZjsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0qLwpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ljb25zL0FydGlmYWN0LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pY29ucy9BcnRpZmFjdC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhMWU0ZmUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ljb25zL0FydGlmYWN0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pY29ucy9BcnRpZmFjdC5qcGcgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaWNvbnMvQXJ0aWZhY3QuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NzM5MTI3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pY29ucy9BcnRpZmFjdC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaWNvbnMvRGVsaXZlcmFibGUuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ljb25zL0RlbGl2ZXJhYmxlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2RmZTYyZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaWNvbnMvRGVsaXZlcmFibGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ljb25zL091dGNvbWUuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ljb25zL091dGNvbWUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjczODgyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pY29ucy9PdXRjb21lLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pY29ucy9Sb2xlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pY29ucy9Sb2xlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWJmYTRjNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaWNvbnMvUm9sZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaWNvbnMvUm9sZS5qcGcgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaWNvbnMvUm9sZS5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmMTgzYTIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ljb25zL1JvbGUuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ljb25zL1Rhc2suZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ljb25zL1Rhc2suZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZmM0NjEzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pY29ucy9UYXNrLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pY29ucy9UYXNrLmpwZyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pY29ucy9UYXNrLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjVhYzJjNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaWNvbnMvVGFzay5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaWNvbnMvcHJvY2Vzcy5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaWNvbnMvcHJvY2Vzcy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmOWEwODUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ljb25zL3Byb2Nlc3MuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9hY3Rpdml0eS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2FjdGl2aXR5LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzczOTNlNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2FjdGl2aXR5LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvYWN0aXZpdHlfbWVkaXVtLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvYWN0aXZpdHlfbWVkaXVtLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzczOTNlNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2FjdGl2aXR5X21lZGl1bS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2FyX2FjbHMuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9hcl9hY2xzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTMwYjU5Ny4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2FyX2FjbHMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9hcl9hbmFtZC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2FyX2FuYW1kLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTY2NjZlNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2FyX2FuYW1kLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvYXJfY2xhc3MuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9hcl9jbGFzcy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmODM1MmUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9hcl9jbGFzcy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2FyX2Rlc21kLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvYXJfZGVzbWQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNDBjYzkyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvYXJfZGVzbWQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9hcl9kb2MuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9hcl9kb2MuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZmI5ZDVmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvYXJfZG9jLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvYXJfZHBrZy5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2FyX2Rwa2cuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNzI2YWE4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvYXJfZHBrZy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2FyX2RwbG1vZC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2FyX2RwbG1vZC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhZjU4ZWUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9hcl9kcGxtb2QuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9hcl9kc3N1Yi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2FyX2Rzc3ViLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzc3YTZiOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2FyX2Rzc3ViLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvYXJfZXZlbnQuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9hcl9ldmVudC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViOWY2NWUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9hcl9ldmVudC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2FyX2ltcG1kLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvYXJfaW1wbWQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZmQwNmFiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvYXJfaW1wbWQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9hcl9pbnRmYy5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2FyX2ludGZjLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTgzMWJhMS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2FyX2ludGZjLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvYXJfcG9jLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvYXJfcG9jLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTgwN2ZkMy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2FyX3BvYy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2FyX3NpZ25hLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvYXJfc2lnbmEuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OGIwMzFiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvYXJfc2lnbmEuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9hcnRpZmFjdC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2FydGlmYWN0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmExZTRmZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2FydGlmYWN0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvYXJ0aWZhY3RfbWVkaXVtLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvYXJ0aWZhY3RfbWVkaXVtLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmExZTRmZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2FydGlmYWN0X21lZGl1bS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2JhY2suZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9iYWNrLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGNjZGZhZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2JhY2suZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9iYWNrX3RvX3RvcC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2JhY2tfdG9fdG9wLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzU2ZDk1NC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2JhY2tfdG9fdG9wLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvYm9va21hcmsuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9ib29rbWFyay5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmZDUzNWQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9ib29rbWFyay5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2NhcGFiaWxpdHlwYXR0ZXJuLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvY2FwYWJpbGl0eXBhdHRlcm4uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkODBiMWFjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvY2FwYWJpbGl0eXBhdHRlcm4uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9jaGVja2xpc3QuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9jaGVja2xpc3QuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMzNhYTNiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvY2hlY2tsaXN0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvY2lyY2xlX2Nsb3NlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvY2lyY2xlX2Nsb3NlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWRkZDk3Mi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2NpcmNsZV9jbG9zZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2NpcmNsZV9vcGVuLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvY2lyY2xlX29wZW4uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMjE4ZTI1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvY2lyY2xlX29wZW4uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9jb2xsYXBzZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2NvbGxhcHNlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2Y2NTQxZi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2NvbGxhcHNlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvY29sbGFwc2VfYWxsLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvY29sbGFwc2VfYWxsLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzhmNzAxOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2NvbGxhcHNlX2FsbC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2NvbXBvc2l0ZXJvbGUuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9jb21wb3NpdGVyb2xlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWJmYTRjNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2NvbXBvc2l0ZXJvbGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9jb25jZXB0LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvY29uY2VwdC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwZTk1Y2QuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9jb25jZXB0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvY29udGVudF9wYWNrYWdlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvY29udGVudF9wYWNrYWdlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmZjMDgxZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2NvbnRlbnRfcGFja2FnZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2NvbnRlbnRfcGFja2FnZV9tZWRpdW0uZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9jb250ZW50X3BhY2thZ2VfbWVkaXVtLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmZjMDgxZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2NvbnRlbnRfcGFja2FnZV9tZWRpdW0uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9jdXN0b21jYXQuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9jdXN0b21jYXQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YmIyZDhmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvY3VzdG9tY2F0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvZGVsaXZlcnlwcm9jZXNzLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvZGVsaXZlcnlwcm9jZXNzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzJiYTc4OC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2RlbGl2ZXJ5cHJvY2Vzcy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2Rpc2NpcGxpbmUuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9kaXNjaXBsaW5lLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzcxNWE5Yi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2Rpc2NpcGxpbmUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9kaXNjaXBsaW5lZ3JvdXAuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9kaXNjaXBsaW5lZ3JvdXAuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YjQzMDY5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvZGlzY2lwbGluZWdyb3VwLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvZGlzcGxheV92aWV3cy5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2Rpc3BsYXlfdmlld3MuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNjI0MDIxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvZGlzcGxheV92aWV3cy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2Rpc3BsYXlfdmlld3NfYS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2Rpc3BsYXlfdmlld3NfYS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2MjQwMjEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9kaXNwbGF5X3ZpZXdzX2EuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9kaXZpZGVyLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvZGl2aWRlci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhOWU3ZGQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9kaXZpZGVyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvZG9jX2VsZW1fY2xvc2UuanBnIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9kb2NfZWxlbV9jbG9zZS5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2ZDIwMjQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9kb2NfZWxlbV9jbG9zZS5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2RvY19lbGVtX2Nsb3NlX3NtYWxsLmpwZyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvZG9jX2VsZW1fY2xvc2Vfc21hbGwuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNjZiODE0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvZG9jX2VsZW1fY2xvc2Vfc21hbGwuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9kb2NfZWxlbV9jbG9zZV9zbWFsbF9yaWdodC5qcGcgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2RvY19lbGVtX2Nsb3NlX3NtYWxsX3JpZ2h0LmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTcwNmM5MS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2RvY19lbGVtX2Nsb3NlX3NtYWxsX3JpZ2h0LmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvZG9jX2VsZW1fb3Blbi5qcGcgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2RvY19lbGVtX29wZW4uanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NjkwNGVlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvZG9jX2VsZW1fb3Blbi5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2RvY19lbGVtX29wZW5fc21hbGwuanBnIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9kb2NfZWxlbV9vcGVuX3NtYWxsLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2E2MzViMS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2RvY19lbGVtX29wZW5fc21hbGwuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9kb2NfZWxlbV9vcGVuX3NtYWxsX3JpZ2h0LmpwZyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvZG9jX2VsZW1fb3Blbl9zbWFsbF9yaWdodC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1YjdkNGQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9kb2NfZWxlbV9vcGVuX3NtYWxsX3JpZ2h0LmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvZG93bl9hcnJvdy5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2Rvd25fYXJyb3cuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNjhjNDJlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvZG93bl9hcnJvdy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2VzdGltYXRpb25jb25zaWRlcmF0aW9ucy5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2VzdGltYXRpb25jb25zaWRlcmF0aW9ucy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlZDRjM2EuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9lc3RpbWF0aW9uY29uc2lkZXJhdGlvbnMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9leGFtcGxlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvZXhhbXBsZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1MzEwYjEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9leGFtcGxlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvZXhwYW5kLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvZXhwYW5kLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmMwZmU4Zi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2V4cGFuZC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2V4cGFuZF9hbGwuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9leHBhbmRfYWxsLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGExOGEzOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2V4cGFuZF9hbGwuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9mYWxzZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2ZhbHNlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2I2NjVkNy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2ZhbHNlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvZm9yd2FyZC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2ZvcndhcmQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NDVhMWFlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvZm9yd2FyZC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2d1aWRhbmNlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvZ3VpZGFuY2UuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZTkxZTViLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvZ3VpZGFuY2UuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9ndWlkYW5jZV9tZWRpdW0uZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9ndWlkYW5jZV9tZWRpdW0uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZTkxZTViLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvZ3VpZGFuY2VfbWVkaXVtLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvZ3VpZGxpbmUuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9ndWlkbGluZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllOTFlNWIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9ndWlkbGluZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2luZGVudC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2luZGVudC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkMDAzYTUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9pbmRlbnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9pdGVyYXRpb24uZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9pdGVyYXRpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNWM4YTE0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvaXRlcmF0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvbGVmdG5hdl9tb2NrdXAuanBnIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9sZWZ0bmF2X21vY2t1cC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliMTY1NGIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9sZWZ0bmF2X21vY2t1cC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL21ldGhvZF9wbHVnaW4uZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9tZXRob2RfcGx1Z2luLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTA2YzI3Ni4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL21ldGhvZF9wbHVnaW4uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9tZXRob2RfcGx1Z2luX21lZGl1bS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL21ldGhvZF9wbHVnaW5fbWVkaXVtLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTA2YzI3Ni4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL21ldGhvZF9wbHVnaW5fbWVkaXVtLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvbWlsZXN0b25lLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvbWlsZXN0b25lLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTc2ZmY5NC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL21pbGVzdG9uZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL25lZWRfaWNvbi5qcGcgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL25lZWRfaWNvbi5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhZDExYzIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9uZWVkX2ljb24uanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9ub19ydXAuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9ub19ydXAuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMjZjNDA4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvbm9fcnVwLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvcGhhc2UuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9waGFzZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1Y2IzY2QuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9waGFzZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL3ByYWN0aWNlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvcHJhY3RpY2UuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOGM0MzZiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvcHJhY3RpY2UuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9wcmludC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL3ByaW50LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWNkMjA4YS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL3ByaW50LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvcHJvY2Vzcy5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL3Byb2Nlc3MuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZjlhMDg1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvcHJvY2Vzcy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL3Byb2Nlc3NfbWVkaXVtLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvcHJvY2Vzc19tZWRpdW0uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZjlhMDg1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvcHJvY2Vzc19tZWRpdW0uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9yZXBvcnQuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9yZXBvcnQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZWEyMzEwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvcmVwb3J0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvcmV1c2FibGVhc3NldC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL3JldXNhYmxlYXNzZXQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Yjk3ODhjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvcmV1c2FibGVhc3NldC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL3JvYWRtYXAuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9yb2FkbWFwLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmZjNTEzYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL3JvYWRtYXAuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9yb2xlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvcm9sZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiZmE0YzYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9yb2xlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvcm9sZV9tZWRpdW0uZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9yb2xlX21lZGl1bS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiZmE0YzYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9yb2xlX21lZGl1bS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL3JvbGVkZXNfbGdfZGdtMzIuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9yb2xlZGVzX2xnX2RnbTMyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGFmMjJlMy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL3JvbGVkZXNfbGdfZGdtMzIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9yb2xlc2V0LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvcm9sZXNldC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmYjY3YzYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9yb2xlc2V0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvcnVwMS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL3J1cDEuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNjI0MDIxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvcnVwMS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL3J1cDFfYS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL3J1cDFfYS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2MjQwMjEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9ydXAxX2EuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9zYW1wbGVfc2VjdGlvbmhlYWQuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9zYW1wbGVfc2VjdGlvbmhlYWQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NTJlODIxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvc2FtcGxlX3NlY3Rpb25oZWFkLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvc2hpbS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL3NoaW0uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYWJhNzkwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvc2hpbS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL3N0ZXBfc2FtcGxlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvc3RlcF9zYW1wbGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4M2Y0MDk4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvc3RlcF9zYW1wbGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9zdXBwb3J0aW5nbWF0ZXJpYWwuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9zdXBwb3J0aW5nbWF0ZXJpYWwuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYTFlNGZlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvc3VwcG9ydGluZ21hdGVyaWFsLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvdGFiX2VuZC1hLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvdGFiX2VuZC1hLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDhjYzVlNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL3RhYl9lbmQtYS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL3RhYl9lbmQtaS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL3RhYl9lbmQtaS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3NTQ0N2YuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy90YWJfZW5kLWkuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy90YWJfbWlkZGxlLWFfaS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL3RhYl9taWRkbGUtYV9pLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDA3OTU1Ny4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL3RhYl9taWRkbGUtYV9pLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvdGFiX21pZGRsZS1pX2EuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy90YWJfbWlkZGxlLWlfYS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0OTg2N2YuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy90YWJfbWlkZGxlLWlfYS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL3RhYl9taWRkbGUtaV9pLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvdGFiX21pZGRsZS1pX2kuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZTg3YjBkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvdGFiX21pZGRsZS1pX2kuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy90YWJfc3BhY2UuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy90YWJfc3BhY2UuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NGE5OGRiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvdGFiX3NwYWNlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvdGFiX3NwYWNlX21pZGRsZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL3RhYl9zcGFjZV9taWRkbGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YmE5YmE5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvdGFiX3NwYWNlX21pZGRsZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL3Rhc2suZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy90YXNrLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWZjNDYxMy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL3Rhc2suZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy90YXNrX21lZGl1bS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL3Rhc2tfbWVkaXVtLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWZjNDYxMy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL3Rhc2tfbWVkaXVtLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvdGFza2Rlc19sZ19kZ20zMi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL3Rhc2tkZXNfbGdfZGdtMzIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNmVkNDcyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvdGFza2Rlc19sZ19kZ20zMi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL3RlYW1wcm9maWxlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvdGVhbXByb2ZpbGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NmJkN2Q2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvdGVhbXByb2ZpbGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy90ZWNobmlxdWUuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy90ZWNobmlxdWUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZTkxZTViLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvdGVjaG5pcXVlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvdGVtcGxhdGUuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy90ZW1wbGF0ZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1N2E3ZTAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy90ZW1wbGF0ZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL3Rlcm1kZWZpbml0aW9uLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvdGVybWRlZmluaXRpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZGM5ZjI0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvdGVybWRlZmluaXRpb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy90aXRsZWJhY2tfbGVmdC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL3RpdGxlYmFja19sZWZ0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzBlY2EwYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL3RpdGxlYmFja19sZWZ0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvdGl0bGViYWNrX3JpZ2h0LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvdGl0bGViYWNrX3JpZ2h0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOThiODljMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL3RpdGxlYmFja19yaWdodC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL3Rvb2wuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy90b29sLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGM1NWEyYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL3Rvb2wuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy90b29sbWVudG9yLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvdG9vbG1lbnRvci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjNTVhMmMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy90b29sbWVudG9yLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvdG9wLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvdG9wLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjE1YWNmNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL3RvcC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL3RvcF9zbS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL3RvcF9zbS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlN2ZiYTIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy90b3Bfc20uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy90b3BiYXJfbW9ja3VwLmpwZyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvdG9wYmFyX21vY2t1cC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5NjY2NDIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy90b3BiYXJfbW9ja3VwLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvdHJ1ZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL3RydWUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NTRkYTA5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvdHJ1ZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL3VfYm9sZC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL3VfYm9sZC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmY2Q1YTMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy91X2JvbGQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy91cF9hcnJvdy5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL3VwX2Fycm93LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTFlNWNjYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL3VwX2Fycm93LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvd2hpdGVwYXBlci5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL3doaXRlcGFwZXIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MmU0OGVmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvd2hpdGVwYXBlci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL3dvcmtkZXNfbGdfZGdtMzIuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy93b3JrZGVzX2xnX2RnbTMyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjQ0ZTVkZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL3dvcmtkZXNfbGdfZGdtMzIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L3NjcmlwdHMvQWN0aXZpdHlUcmVlVGFibGUuanMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvc2NyaXB0cy9BY3Rpdml0eVRyZWVUYWJsZS5qcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGU5MDhjOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvc2NyaXB0cy9BY3Rpdml0eVRyZWVUYWJsZS5qcworKysgL2Rldi9udWxsCkBAIC0xLDg2NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vIAotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotZnVuY3Rpb24gQWN0aXZpdHlUcmVlVGFibGUoLypQcm9jZXNzRWxlbWVudFBhZ2UqL3BhcmVudCkgewotdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci10aGlzLnRyZWVfbm9kZV9jbGFzcyAgPSAidHJlZU5vZGUiOwkvLyAhISEgZG9uJ3QgdHJhbnNsYXRlIHRoaXMgISEhCi10aGlzLmV4cGFuZEltYWdlID0gbnVsbDsKLXRoaXMuY29sbGFwc2VJbWFnZSA9IG51bGw7Ci10aGlzLnNoaW1JbWFnZSA9IG51bGw7Ci10aGlzLndic0l0ZW1IdG1sID0gbnVsbDsKLXRoaXMuaW1hZ2VQYXRoID0gbnVsbDsKLXRoaXMuTk9ERV9DT0xMQVBTRUQgPSAwOwotdGhpcy5OT0RFX0VYUEFOREVEID0gMTsKLXRoaXMuREVGQVVMVF9FWFBBTkRfTEVWRUwgPSAwOyAvLyAwIC0gY29sbGFwc2UgYWxsLCAxIC0gZXhwYW5kIHRoZSBmaXJzdCBsZXZlbCwgLi4uLCA5OTk5IC0gaWYgeW91IGhhdmUgdGhpcyBtYW55Ci0KLX07Ci0KLS8vIENyZWF0ZXMgdGhlIGNvbGxhcHNpYmxlIHRyZWUgdGFibGUKLS8vIHRoZSBleHBlY3RlZCBmb3JtYXQgb2YgdGhlIGh0bWwgc291cmNlIGFyZSBhcyBmb2xsb3dzOgotLy8gZWFjaCA8VFIgdGFnIGhhcyBhIHVpbnF1ZSBpZCBhbmQgYSBwYXJlbnRJZC4KLS8qCi08aGVhZD4KLTxNRVRBIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04Ij4KLTxsaW5rIHR5cGU9InRleHQvY3NzIiBocmVmPSIuL2Nzcy9kZWZhdWx0LmNzcyIgcmVsPSJTdHlsZVNoZWV0Ij4KLTxzY3JpcHQgc3JjPSIuL3RyZWV0YWJsZS5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PC9zY3JpcHQ+Ci08L2hlYWQ+Ci08Ym9keSBvbmxvYWQ9ImNyZWF0ZVRyZWUoJ3RkJywgJ3RyZWVOb2RlJywgJy4vaW1hZ2VzLycpOyIgPgotPHRhYmxlIGJvcmRlcj0iMSI+Ci08dHIgaWQ9IjEiIHBhcmVudElkPSIwIj4KLTx0ZCBjbGFzcz0idHJlZU5vZGUiPmNvbCAxLTE8L3RkPjx0ZD5jb2wgMS0yPC90ZD4KLTwvdHI+Ci0KLTx0ciBpZD0iMiIgcGFyZW50SWQ9IjEiPgotPHRkIGNsYXNzPSJ0cmVlTm9kZSI+Y29sIDEtMTwvdGQ+PHRkPmNvbCAyLTI8L3RkPgotPC90cj4KLQotPHRyIGlkPSIzIiBwYXJlbnRJZD0iMSI+Ci08dGQgY2xhc3M9InRyZWVOb2RlIj5jb2wgMS0xPC90ZD48dGQ+Y29sIDItMjwvdGQ+Ci08L3RyPgotCi08dHIgaWQ9IjQiIHBhcmVudElkPSIwIj4KLTx0ZCBjbGFzcz0idHJlZU5vZGUiPmNvbCAyLTE8L3RkPjx0ZD5jb2wgMi0yPC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9ib2R5PgotKi8KLUFUVFJfUk9XX0RBVEFfSU5ERVggPSAiZGF0YUluZGV4IjsKLUFUVFJfQ0hJTERfTE9BREVEID0gImNoaWxkTG9hZGVkIjsKLUFUVFJfSU5ERU5UX1NJWkUgPSAiaW5kZW50U2l6ZSI7Ci1BVFRSX0VYUEFOREVEID0gImV4cGFuZGVkIjsKLQotQWN0aXZpdHlUcmVlVGFibGUucHJvdG90eXBlLmluaXRpYWxpemUgPSBmdW5jdGlvbihpbWdQYXRoKQotewotCXRoaXMuaW1hZ2VQYXRoID0gY29udGVudFBhZ2UucmVzb2x2ZVVybChpbWdQYXRoKTsKLQl0aGlzLmV4cGFuZEltYWdlID0gdGhpcy5pbWFnZVBhdGggKyAnZXhwYW5kLmdpZic7CQotCXRoaXMuY29sbGFwc2VJbWFnZSA9IHRoaXMuaW1hZ2VQYXRoICsgJ2NvbGxhcHNlLmdpZic7Ci0JLy9leHBhbmRBbGxJbWFnZSA9IHRoaXMuaW1hZ2VQYXRoICsgJ2V4cGFuZF9hbGwuZ2lmJzsJCi0JLy9jb2xsYXBzZUFsbEltYWdlID0gdGhpcy5pbWFnZVBhdGggKyAnY29sbGFwc2VfYWxsLmdpZic7Ci0JLy9iYWNrVG9Ub3BJbWFnZSA9IHRoaXMuaW1hZ2VQYXRoICsgJ2JhY2tfdG9fdG9wLmdpZic7Ci0JdGhpcy5zaGltSW1hZ2UgPSB0aGlzLmltYWdlUGF0aCArICdpbmRlbnQuZ2lmJzsKLQl0aGlzLndic0l0ZW1IdG1sID0gbmV3IFdCU0l0ZW1IdG1sKHRoaXMsIHRoaXMuaW1hZ2VQYXRoKTsKLX07Ci0KLUFjdGl2aXR5VHJlZVRhYmxlLnByb3RvdHlwZS5jcmVhdGVUcmVlID0gZnVuY3Rpb24odGFnTmFtZSwgY2xhc3NTZWxlY3RvcikgewotCi0JLy8gY3JlYXRlIHRoZSB0cmVlIHRhYmxlIGZpcnN0Ci0JdGhpcy5jcmVhdGVUYWJsZSgpOwotfTsKLQotCi1BY3Rpdml0eVRyZWVUYWJsZS5wcm90b3R5cGUuY3JlYXRlVGFibGUgPSBmdW5jdGlvbigpIHsKLQotCXZhciBkaXYgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgidHJlZUNvbnRlbnQiKTsKLQlpZiAoIGRpdiA9PSBudWxsICkgcmV0dXJuOwotCQotCS8vIGNyZWF0ZSB0YWJsZQotCXZhciB0YWJsZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIlRBQkxFIik7Ci0JdGFibGUuaWQgPSAiQWN0aXZpdHlUcmVlVGFibGUiOwotCXRhYmxlLnRpdGxlID0gdGhpcy5kYXRhLnRpdGxlOwotCXRhYmxlLnN1bW1hcnkgPSB0aGlzLmRhdGEuc3VtbWFyeTsKLQl0YWJsZS5jZWxsc3BhY2luZyA9ICIwcHgiOwotCXRhYmxlLmNlbGxwYWRkaW5nID0gIjBweCI7Ci0JdGFibGUuYm9yZGVyPSIwcHgiOwotCXRhYmxlLndpZHRoPSIxMDAlIjsKLQl0YWJsZS5ib3JkZXJjb2xvciA9ICIjOTk5OTk5IjsKLQl0YWJsZS5jbGFzc05hbWUgPSAiYnJlYWtkb3duVGFibGUiOwotCQotCS8vIGNyZWF0ZSB0YWJsZSBoZWFkCi0JLy92YXIgdHIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJUUiIpOwotCXZhciB0ciA9IHRhYmxlLmluc2VydFJvdyh0YWJsZS5yb3dzLmxlbmd0aCk7Ci0JCi0JdHIuc2V0QXR0cmlidXRlKCJ2YWxpZ24iLCAidG9wIik7Ci0JCi0JdmFyIGxlbiA9IHRoaXMuZGF0YS5jb2x1bW5zLmxlbmd0aDsKLQlmb3IgKCBpID0gMDsgaSA8IGxlbjsgaSsrICkgewotCQl2YXIgY29sID0gdGhpcy5kYXRhLmNvbHVtbnNbaV07Ci0JCXZhciBpZCA9IEJTX0lEX1BSRUZJWCArIGNvbFswXTsKLQkJdmFyIGFiYnIgPSBjb2xbMV07Ci0JCQotCQl2YXIgdGggPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJUSCIpOwkJCi0JCXRoLmlkID0gaWQ7Ci0JCXRoLmFiYnIgPSBhYmJyOwotCQl0aC5pbm5lckhUTUwgPSAiPHNwYW4gc3R5bGU9J3doaXRlLXNwYWNlOm5vd3JhcDsnPiIgKyBjb2xbMV0gKyAiPC9zcGFuPiI7Ci0JCXRyLmFwcGVuZENoaWxkKHRoKTsKLQl9CQkJCi0JCi0JCi0JLy90YWJsZS5hcHBlbmRDaGlsZCh0cik7Ci0JZGl2LmFwcGVuZENoaWxkKHRhYmxlKTsKLQkKLQkvLyBjcmVhdGUgdGhlIHRvcCByb3dzCi0JdGhpcy5jcmVhdGVUb3BsZXZlbFJvd3MoKTsKLQkJCi0JLy8gZm9yIElFIG5lZWQgdG8gcmVzZXQgdG8gZnJlc2ggdGhlIGxheW91dAotCS8vZGl2LmlubmVySFRNTCA9ICIiICsgZGl2LmlubmVySFRNTCArICIiOwotfTsKLQotQWN0aXZpdHlUcmVlVGFibGUucHJvdG90eXBlLnByb2Nlc3NUUiA9IGZ1bmN0aW9uKHRyRWxlbWVudCkgewotCi0JdmFyIGluZGVudFNpemUgPSAwOwotCXZhciBwYXJlbnRJZCA9IHRyRWxlbWVudC5nZXRBdHRyaWJ1dGUoInBhcmVudElkIik7Ci0JdmFyIHBhcmVudFRSICA9IG51bGw7Ci0JaWYgKCBwYXJlbnRJZCAhPSAiIikKLQl7Ci0KLQkJLy8gY2FjaGUgaXQgdG8gYmUgZmFzdGVyCi0JCXBhcmVudFRSID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQocGFyZW50SWQpOwotCQkvL3BhcmVudFRSID0gY3JlYXRlZE5vZGVzW3BhcmVudElkXTsKLQkJaWYgKCBwYXJlbnRUUiAhPSBudWxsICYmIHBhcmVudFRSICE9IHVuZGVmaW5lZCApCi0JCXsKLQkJCWluZGVudFNpemUgPSBwYXJzZUludChwYXJlbnRUUi5nZXRBdHRyaWJ1dGUoQVRUUl9JTkRFTlRfU0laRSkpICsgMTsKLQkJfQotCX0KLQotCXZhciBleHBhbmRlZCA9IHRoaXMuZ2V0RGVmYXVsdEV4cGFuZFN0YXRlKGluZGVudFNpemUpOwotCi0JdHJFbGVtZW50LnNldEF0dHJpYnV0ZShBVFRSX0lOREVOVF9TSVpFLCBpbmRlbnRTaXplKTsKLQl0ckVsZW1lbnQuc2V0QXR0cmlidXRlKEFUVFJfRVhQQU5ERUQsIGV4cGFuZGVkKTsKLQotCS8vYWxlcnQoImNyZWF0ZVRyZWVOb2RlIGZvciBpZCwgcGFyZW50SWQsIGluZGVudCA9IiArIHRyRWxlbWVudC5pZCArICIsICIgKyBwYXJlbnRJZCArICIsICBpbmRlbnRTaXplPSIgKyBpbmRlbnRTaXplKTsKLQkvL2NyZWF0ZVRyZWVOb2RlKGVsZW1lbnQsIGluZGVudFNpemUpOwotCi0JLy9zYXZlIHRoZSBjcmVhdGVkIG9uZXMgc28gd2UgY2FuIHJlZmVyZWNuZSBpdAotCS8vY3JlYXRlZE5vZGVzW3RyRWxlbWVudC5pZF0gPSB0ckVsZW1lbnQ7Ci0KLQotCWlmICggKHBhcmVudFRSICE9IG51bGwpICYmIHRoaXMuaXNOb2RlU3VwcHJlc3NlZChwYXJlbnRUUikgKQotCXsKLQkJdGhpcy5zZXROb2RlU3VwcHJlc3NlZCh0ckVsZW1lbnQsIHRydWUpOwotCQkvL2FsZXJ0KCJwYXJlbnQgc3VwcHJlc3NlZCIpOwotCX0KLQotCWlmICggdGhpcy5pc05vZGVTdXBwcmVzc2VkKHRyRWxlbWVudCkgPT0gdHJ1ZSB8fCAocGFyZW50VFIgIT0gbnVsbCAmJiBwYXJlbnRUUi5nZXRBdHRyaWJ1dGUoQVRUUl9FWFBBTkRFRCkgPT0gdGhpcy5OT0RFX0NPTExBUFNFRCkgKQotCXsKLQkJdHJFbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7Ci0JCS8vYWxlcnQoInN1cHByZXNzZWQiKTsKLQl9Ci0JCQkJCi19OwotCi1BY3Rpdml0eVRyZWVUYWJsZS5wcm90b3R5cGUuZ2V0VHJlZVRhYmxlID0gZnVuY3Rpb24oKSB7Ci0JcmV0dXJuIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJBY3Rpdml0eVRyZWVUYWJsZSIpOwotfTsKLQotQWN0aXZpdHlUcmVlVGFibGUucHJvdG90eXBlLmNyZWF0ZVRvcGxldmVsUm93cyA9IGZ1bmN0aW9uKCkgewotCi0JdmFyIHRhYmxlID0gdGhpcy5nZXRUcmVlVGFibGUoKTsKLQlpZiAoIHRhYmxlID09IG51bGwgKSByZXR1cm47Ci0KLQl2YXIgcm93cyA9IHRoaXMuZGF0YS5yb3dzOwotCXZhciBsZW4gPSByb3dzLmxlbmd0aDsKLQl2YXIgc3VwcHJlc3NlZFJvd3MgPSBuZXcgQXJyYXkoKTsKLQkvL3ZhciBwYXJlbnRJZCA9ICIiOwotCQotCWZvciAoIHZhciBpID0gMDsgaSA8IGxlbjsgaSsrICkgewotCQotCQl2YXIgcm93ID0gcm93c1tpXTsKLQkJaWYgKCByb3cgPT0gbnVsbCApIGNvbnRpbnVlOwotCQkKLQkJLy9wYXJlbnRJZCA9ICIiOwotCQkKLQkJLy8gZG9uJ3QgY3JlYXRlIHRoZSByb3cgaWYgdGhlIHJvdyBpcyBzdXBwcmVzc2VkIG9yIGlmIHRoZSBwYXJlbnQgaXMgc3VwcHJlc3NlZAotCQlpZiAoIHRoaXMuaXNSb3dTdXBwcmVzc2VkKHJvdykgKSB7Ci0JCQkvL3N1cHByZXNzZWRSb3dzLnB1c2gocm93LmlkKTsKLQkJCS8vcGFyZW50SWQgPSByb3cuaWQ7Ci0JCQkKLQkJCS8vIGNsZWFyIHRoZSBzdXBwcmVzc2VkIHJvd3MKLQkJCXJvd3NbaV0gPSBudWxsOwotCQkJCi0JCQkvL2FsZXJ0KCJzdXBwcmVzc2VkICIgKyBpKTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCQotCQkvKgkJCi0JCXdoaWxlICggKHJvdy5wYXJlbnRJZCAhPSBwYXJlbnRJZCkgJiYgKHN1cHByZXNzZWRSb3dzLmxlbmd0aCA+IDApICkgewotCQkJcGFyZW50SWQgPSBzdXBwcmVzc2VkUm93cy5wb3AoKTsKLQkJfQotCQkKLQkJaWYgKCAocm93LnBhcmVudElkICE9ICIiKSAmJiAocm93LnBhcmVudElkID09IHBhcmVudElkKSApIHsKLQkJCXN1cHByZXNzZWRSb3dzLnB1c2gocm93LmlkKTsKLQkJCQotCQkJLy8gY2xlYXIgdGhlIHN1cHByZXNzZWQgcm93cwotCQkJcm93c1tpXSA9IG51bGw7Ci0KLQkJCS8vYWxlcnQoInN1cHByZXNzZWQgIiArIGkpOwotCQkJY29udGludWU7Ci0JCX0KLQkJKi8KLQkJCi0JCQotCQlpZiAoIHJvdy5wYXJlbnRJZCA9PSBudWxsIHx8IHJvdy5wYXJlbnRJZCA9PSAiIikgewotCQkJdGhpcy53YnNJdGVtSHRtbC5wYXJzZVJvdyhyb3cpOwotCQkJCi0JCQl2YXIgdHIgPSB0YWJsZS5pbnNlcnRSb3codGFibGUucm93cy5sZW5ndGgpOwotCQkJdHIuc2V0QXR0cmlidXRlKEFUVFJfUk9XX0RBVEFfSU5ERVgsIGkpOwotCQkJdGhpcy53YnNJdGVtSHRtbC5sb2FkUm93KHRyKTsKLQkJCQotCQkJLy90YWJsZS5hcHBlbmRDaGlsZCh0cik7Ci0JCQkKLQkJCXRoaXMucHJvY2Vzc1RSKHRyKTsKLQkJfQotCX0KLX07Ci0KLQotQWN0aXZpdHlUcmVlVGFibGUucHJvdG90eXBlLmNyZWF0ZUNoaWxkUm93cyA9IGZ1bmN0aW9uKHRyRWxlbWVudCkgewotCi0JdmFyIGxvYWRlZCA9IHRyRWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUUl9DSElMRF9MT0FERUQpOwotCWlmICggbG9hZGVkID09ICJ0cnVlIiApIHsKLQkJcmV0dXJuOwotCX0KLQotCi0JdmFyIHRhYmxlID0gdGhpcy5nZXRUcmVlVGFibGUoKTsKLQkvL3ZhciBpbnNlcnRCZWZvcmUgPSB0ckVsZW1lbnQuZ2V0TmV4dFNpYmxpbmc7Ci0JdmFyIHJvd0luZGV4ID0gIHBhcnNlSW50KHRyRWxlbWVudC5yb3dJbmRleCk7Ci0JCi0JLy8gbWFrZSBzdXJlIHRoZSB2YWx1ZSBpcyBhIG51bWJlciBvdGhlcndpc2UgRmlyZSBmb3ggd2lsbCB0cmVhdCBpdCBhcyBhIHN0cmluZwotCXZhciBkYXRhSW5kZXggPSAgcGFyc2VJbnQodHJFbGVtZW50LmdldEF0dHJpYnV0ZShBVFRSX1JPV19EQVRBX0lOREVYKSk7Ci0JCi0JZm9yICggdmFyIGkgPSBkYXRhSW5kZXgrMTsgaSA8IHRoaXMuZGF0YS5yb3dzLmxlbmd0aDsgaSsrICkgewotCQl2YXIgcm93ID0gdGhpcy5kYXRhLnJvd3NbaV07Ci0JCWlmICggcm93ID09IG51bGwgKSBjb250aW51ZTsKLQkJaWYgKCByb3cucGFyZW50SWQgIT0gdHJFbGVtZW50LmlkICkgewotCQkJY29udGludWU7Ci0JCX0KLQkJCi0JCXRoaXMud2JzSXRlbUh0bWwucGFyc2VSb3cocm93KTsKLQotCQlyb3dJbmRleCsrOwotCQl2YXIgdHIgPSB0YWJsZS5pbnNlcnRSb3cocm93SW5kZXgpOwotCQl0ci5zZXRBdHRyaWJ1dGUoQVRUUl9ST1dfREFUQV9JTkRFWCwgaSk7Ci0JCXRoaXMud2JzSXRlbUh0bWwubG9hZFJvdyh0cik7Ci0KLQkJdGhpcy5wcm9jZXNzVFIodHIpOwotCQkKLQl9CQotCQotCXRyRWxlbWVudC5zZXRBdHRyaWJ1dGUoQVRUUl9DSElMRF9MT0FERUQsICJ0cnVlIik7Ci0JCi19OwotCi0KLQotQWN0aXZpdHlUcmVlVGFibGUucHJvdG90eXBlLmdldERlZmF1bHRFeHBhbmRTdGF0ZSA9IGZ1bmN0aW9uKGxldmVsKQotewotCi0JaWYgKGxldmVsID49IHRoaXMuREVGQVVMVF9FWFBBTkRfTEVWRUwgKSB7Ci0JCXJldHVybiB0aGlzLk5PREVfQ09MTEFQU0VEOwotCX0gZWxzZSB7Ci0JCXJldHVybiB0aGlzLk5PREVfRVhQQU5ERUQ7Ci0JfQotCi19OwotCi1BY3Rpdml0eVRyZWVUYWJsZS5wcm90b3R5cGUuZ2V0VHJlZU5vZGVTcmMgPSBmdW5jdGlvbihsZXZlbCkKLXsKLQlpZiAoIHRoaXMuZ2V0RGVmYXVsdEV4cGFuZFN0YXRlKGxldmVsKSA9PSB0aGlzLk5PREVfQ09MTEFQU0VEICkgewotCQlyZXR1cm4gdGhpcy5leHBhbmRJbWFnZTsKLQl9Ci0JZWxzZSB7Ci0JCXJldHVybiB0aGlzLmNvbGxhcHNlSW1hZ2U7Ci0JfQotfTsKLQotCi1BY3Rpdml0eVRyZWVUYWJsZS5wcm90b3R5cGUuZ2V0VFIgPSBmdW5jdGlvbihlbGVtZW50KQotewotCS8vIHRoZSBoZW1sIHN0cnVjdHVyZSBpcwotCS8vIDx0ciBpZD0iMiIgcGFyZW50SWQ9IjEiPgotCS8vIDx0ZCBjbGFzcz0idHJlZU5vZGUiPmNvbCAxLTE8L3RkPjx0ZD5jb2wgMi0yPC90ZD4KLQkvLyA8L3RyPgotCXZhciBlID0gZWxlbWVudDsKLQl3aGlsZSAoIGUgIT0gbnVsbCAmJiBlLnRhZ05hbWUgIT0gIlRSIiB8fCBlLmNsYXNzTmFtZSAhPSB0aGlzLnRyZWVfbm9kZV9jbGFzcykKLQl7CQotCQllID0gZS5wYXJlbnROb2RlOwotCQkvL2FsZXJ0KGUudGFnTmFtZSk7Ci0JfQotCQotCXJldHVybiBlOwotfTsKLQotCi0vLyBFeHBhbmRzIG9yIGNvbGxhcHNlcyBhIHNlY3Rpb24gYmFzZWQgb24gdGhlIHJlY2VpdmVkIGV2ZW50LgotQWN0aXZpdHlUcmVlVGFibGUucHJvdG90eXBlLmV4cGFuZENvbGxhcHNlVHJlZU5vZGUgPSBmdW5jdGlvbihldnRFbGVtZW50KSB7Ci0KLQkvL2FsZXJ0KGV2dEVsZW1lbnQudGFnTmFtZSk7Ci0KLQl2YXIgdHJFbGVtZW50ID0gdGhpcy5nZXRUUihldnRFbGVtZW50KTsKLQkKLQkvLyBtYWtlIHN1cmUgdGhlIGNoaWxkIHJvd3MgYXJlIGNyZWF0ZWQKLQl0aGlzLmNyZWF0ZUNoaWxkUm93cyh0ckVsZW1lbnQpOwotCQotCS8vIGlmIHRoZXJlIGlzIG5vIGNoaWxkLCByZW1vdmUgdGhlIHRyZWUgbm9kZSBpbWFnZQotCWlmICggIXRoaXMuX2hhc0NoaWxkcmVuKHRyRWxlbWVudCkgKQotCXsKLQkJZXZ0RWxlbWVudC5zcmMgPSB0aGlzLnNoaW1JbWFnZTsKLQkJZXZ0RWxlbWVudC5vbmNsaWNrID0gbnVsbDsKLQkJZXZ0RWxlbWVudC5zdHlsZS5jdXJzb3IgPSAiZGVmYXVsdCI7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JdmFyIGV4cGFuZGVkID0gdHJFbGVtZW50LmdldEF0dHJpYnV0ZShBVFRSX0VYUEFOREVEKTsKLQotCWlmIChleHBhbmRlZCA9PSB0aGlzLk5PREVfRVhQQU5ERUQpIHsKLQkJdGhpcy5oaWRlQ2hpbGRyZW4odHJFbGVtZW50KTsKLQkJZXZ0RWxlbWVudC5zcmMgPSB0aGlzLmV4cGFuZEltYWdlOwotCQlleHBhbmRlZCA9IHRoaXMuTk9ERV9DT0xMQVBTRUQ7Ci0JCWV2dEVsZW1lbnQuYWx0ID0gY29udGVudFBhZ2UucmVzLmV4cGFuZFRleHQ7Ci0JCWV2dEVsZW1lbnQudGl0bGUgPSBjb250ZW50UGFnZS5yZXMuZXhwYW5kVGV4dDsKLQl9Ci0JZWxzZSB7Ci0JCXRoaXMuc2hvd0hpZGVDaGlsZHJlbih0ckVsZW1lbnQsIHRydWUpOwotCQlldnRFbGVtZW50LnNyYyA9IHRoaXMuY29sbGFwc2VJbWFnZTsKLQkJZXhwYW5kZWQgPSB0aGlzLk5PREVfRVhQQU5ERUQ7Ci0JCWV2dEVsZW1lbnQuYWx0ID0gY29udGVudFBhZ2UucmVzLmNvbGxhcHNlVGV4dDsKLQkJZXZ0RWxlbWVudC50aXRsZSA9IGNvbnRlbnRQYWdlLnJlcy5jb2xsYXBzZVRleHQ7CQkKLQl9Ci0JCi0JdHJFbGVtZW50LnNldEF0dHJpYnV0ZShBVFRSX0VYUEFOREVELCBleHBhbmRlZCk7Ci0JCi0JLyoKLQlpZiAoZXZ0ICYmIGV2dC5wcmV2ZW50RGVmYXVsdCkgewotCQlldnQucHJldmVudERlZmF1bHQoKTsKLQl9Ci0JKi8KLQkKLQlyZXR1cm4gZmFsc2U7Ci19OwotCi0KLUFjdGl2aXR5VHJlZVRhYmxlLnByb3RvdHlwZS5oaWRlQ2hpbGRyZW4gPSBmdW5jdGlvbihwYXJlbnQpCi17CQotCS8vIG1ha2Ugc3VyZSBpdCdzIHRoZSBUUiBlbGVtZW50Ci0JcGFyZW50ID0gdGhpcy5nZXRUUihwYXJlbnQpOwotCS8vdmFyIHBhcmVudElkID0gcGFyZW50LmlkOwotCXZhciBpbmRlbnRTaXplID0gcGFyc2VJbnQocGFyZW50LmdldEF0dHJpYnV0ZShBVFRSX0lOREVOVF9TSVpFKSk7Ci0JCi0JdmFyIG5leHRUUiA9IHBhcmVudDsKLQl3aGlsZSAoIChuZXh0VFI9dGhpcy5nZXROZXh0U2libGluZyhuZXh0VFIpKSAhPSBudWxsICYmIG5leHRUUi5nZXRBdHRyaWJ1dGUoQVRUUl9JTkRFTlRfU0laRSkgPiBpbmRlbnRTaXplICkKLQl7CQkKLQkJbmV4dFRSLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7CQkKLQl9Ci0JCQotfTsKLQotCi1BY3Rpdml0eVRyZWVUYWJsZS5wcm90b3R5cGUuc2hvd0hpZGVDaGlsZHJlbiA9IGZ1bmN0aW9uKHBhcmVudCwgc2hvdykKLXsJCQotCS8vIG1ha2Ugc3VyZSBpdCdzIHRoZSBUUiBlbGVtZW50Ci0JcGFyZW50ID0gdGhpcy5nZXRUUihwYXJlbnQpOwotCQotCS8vdmFyIGluZGVudFNpemUgPSBwYXJlbnQuaW5kZW50U2l6ZTsKLQl2YXIgbmV4dFRSID0gdGhpcy5nZXROZXh0U2libGluZyhwYXJlbnQpOwotCXdoaWxlICggbmV4dFRSICE9IG51bGwgJiYgbmV4dFRSLmdldEF0dHJpYnV0ZSgicGFyZW50SWQiKSA9PSBwYXJlbnQuaWQgKQotCXsKLQkJaWYgKCBzaG93ICYmICh0aGlzLmlzTm9kZVN1cHByZXNzZWQobmV4dFRSKSA9PSBmYWxzZSkgKQotCQl7Ci0JCQluZXh0VFIuc3R5bGUuZGlzcGxheSA9ICcnOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJCi0JCQluZXh0VFIuc3R5bGUuZGlzcGxheSA9ICdub25lJzsKLQkJfQotCQkKLQkJbmV4dFRSID0gdGhpcy5zaG93SGlkZUNoaWxkcmVuKG5leHRUUiwgKHNob3c9PXRydWUpJiYobmV4dFRSLmdldEF0dHJpYnV0ZShBVFRSX0VYUEFOREVEKT09dGhpcy5OT0RFX0VYUEFOREVEKSApOwotCX0KLQkKLQlyZXR1cm4gbmV4dFRSOwotCQotfTsKLQotCi1BY3Rpdml0eVRyZWVUYWJsZS5wcm90b3R5cGUuX2hhc0NoaWxkcmVuID0gZnVuY3Rpb24ocGFyZW50KQotewotCi0JLy8gbWFrZSBzdXJlIGl0J3MgdGhlIFRSIGVsZW1lbnQKLQlwYXJlbnQgPSB0aGlzLmdldFRSKHBhcmVudCk7Ci0KLQl2YXIgbmV4dFRSID0gdGhpcy5nZXROZXh0U2libGluZyhwYXJlbnQpOwotCQotLy9hbGVydCgicGFyZW50LmlkPSIgKyBwYXJlbnQuaWQgKyAiLCBuZXh0VFIucGFyZW50SWQ9IiArIG5leHRUUi5nZXRBdHRyaWJ1dGUoInBhcmVudElkIikgKyAiLCBpc1N1cHByZXNzZWQ9IiArIGlzTm9kZVN1cHByZXNzZWQobmV4dFRSKSk7Ci0KLQlpZiAoIG5leHRUUiAhPSBudWxsICYmIG5leHRUUi5nZXRBdHRyaWJ1dGUoInBhcmVudElkIikgPT0gcGFyZW50LmlkKSAKLQl7Ci0JCWlmICh0aGlzLmlzTm9kZVN1cHByZXNzZWQobmV4dFRSKSA9PSBmYWxzZSkKLQkJewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQluZXh0VFIubmV4dFNpYmxpbmc7Ci0JCQl3aGlsZSAobmV4dFRSICE9IG51bGwpCi0JCQl7Ci0JCQkJaWYgKHRoaXMuaXNOb2RlU3VwcHJlc3NlZChuZXh0VFIpID09IGZhbHNlKQotCQkJCXsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJCW5leHRUUiA9IG5leHRUUi5uZXh0U2libGluZzsKLQkJCX0KLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCX0KLQkKLQlyZXR1cm4gZmFsc2U7Ci19OwotCi0KLUFjdGl2aXR5VHJlZVRhYmxlLnByb3RvdHlwZS5nZXROZXh0U2libGluZyA9IGZ1bmN0aW9uKGVsZW1lbnQpCi17Ci0KLQl2YXIgbmV4dEVsZW1lbnQgPSBlbGVtZW50Lm5leHRTaWJsaW5nOwotCXdoaWxlIChuZXh0RWxlbWVudCAhPSBudWxsICYmIG5leHRFbGVtZW50LnRhZ05hbWUgIT0gZWxlbWVudC50YWdOYW1lICkKLQl7Ci0JCW5leHRFbGVtZW50ID0gbmV4dEVsZW1lbnQubmV4dFNpYmxpbmc7Ci0JfQotCQotCXJldHVybiBuZXh0RWxlbWVudDsKLX07Ci0KLUFjdGl2aXR5VHJlZVRhYmxlLnByb3RvdHlwZS5nZXRGaXJzdENoaWxkID0gZnVuY3Rpb24odHJFbGVtZW50LCB0YWdOYW1lLCBjbGFzc05hbWUpCi17Ci0JdmFyIGUgPSB0ckVsZW1lbnQuZmlyc3RDaGlsZDsKLQl3aGlsZSAoZSAhPSBudWxsKQotCXsKLQkJLy9hbGVydChlLnRhZ05hbWUpOwotCQlpZiAoICh0YWdOYW1lID09IG51bGwgfHwgZS50YWdOYW1lID09IHRhZ05hbWUpICYmIChjbGFzc05hbWUgPT0gbnVsbCB8fCBlLmNsYXNzTmFtZSA9PSBjbGFzc05hbWUpICkKLQkJewotCQkJcmV0dXJuIGU7Ci0JCX0KLQkJCi0JCWUgPSBlLm5leHRTaWJsaW5nOwotCX0KLQkKLQlyZXR1cm4gbnVsbDsKLQkJCi19OwotCi1BY3Rpdml0eVRyZWVUYWJsZS5wcm90b3R5cGUuaXNOb2RlU3VwcHJlc3NlZCA9IGZ1bmN0aW9uKHRyRWxlbWVudCkKLXsKLQkvLyBpZiBpc1N1cHJlc3NlZCBhdHRyaWJ1dGUgaXMgZGVmaW5lZCwgYWx3YXlzIHVzZSBpdAotCS8vIG9ubHkgYnJvd3NpZ24gbW9kZWwgc2V0IHRoaXMgYXR0cmlidXRlCi0JLy8gaWYgbm90IGRlZmluZWQsIGl0J3MgaW4gcHVibGlzaGVkIHNpdGUsIGxvb2sgdXAgdGhlIGZsYWcgZnJvbSB0aGUgZ2VuZXJhdGVkIG1hcAotCXZhciBhdHRyX3N1cHByZXNzZWQgPSB0ckVsZW1lbnQuZ2V0QXR0cmlidXRlKCJpc1N1cHJlc3NlZCIpOwotCXZhciByZWxQYXRoID0gdHJFbGVtZW50LmdldEF0dHJpYnV0ZSgicmVsUHJvY2Vzc1BhdGgiKTsKLQkKLQl2YXIgZmxhZyA9IHRoaXMuaXNTdXBwcmVzc2VkKGF0dHJfc3VwcHJlc3NlZCwgcmVsUGF0aCk7Ci0JCi0JaWYgKCBhdHRyX3N1cHByZXNzZWQgPT0gbnVsbCB8fCBhdHRyX3N1cHByZXNzZWQgPT0gIiIgfHwgYXR0cl9zdXBwcmVzc2VkID09IHVuZGVmaW5lZCApCi0JewkJCi0JCXRoaXMuc2V0Tm9kZVN1cHByZXNzZWQodHJFbGVtZW50LCBmbGFnKTsKLQl9Ci0JCi0JcmV0dXJuIGZsYWc7Ci19OwotCi1BY3Rpdml0eVRyZWVUYWJsZS5wcm90b3R5cGUuaXNSb3dTdXBwcmVzc2VkID0gZnVuY3Rpb24ocm93KQotewotCWlmICggcm93ID09IG51bGwgKSByZXR1cm4gdHJ1ZTsKLQkKLQlyZXR1cm4gdGhpcy5pc1N1cHByZXNzZWQocm93LmlzU3VwcHJlc3NlZCwgcm93LnJlbFBhdGgpOwotCQotfTsKLQotQWN0aXZpdHlUcmVlVGFibGUucHJvdG90eXBlLmlzU3VwcHJlc3NlZCA9IGZ1bmN0aW9uKGF0dHJfc3VwcHJlc3NlZCwgcmVsUGF0aCkKLXsJCi0JLy8gaWYgaXNTdXByZXNzZWQgYXR0cmlidXRlIGlzIGRlZmluZWQsIGFsd2F5cyB1c2UgaXQKLQkvLyBvbmx5IGJyb3dzaWduIG1vZGVsIHNldCB0aGlzIGF0dHJpYnV0ZQotCS8vIGlmIG5vdCBkZWZpbmVkLCBpdCdzIGluIHB1Ymxpc2hlZCBzaXRlLCBsb29rIHVwIHRoZSBmbGFnIGZyb20gdGhlIGdlbmVyYXRlZCBtYXAKLQkKLQkvL2FsZXJ0KGF0dHJfc3VwcHJlc3NlZCArICI9IiArIHJlbFBhdGgpOwotCXZhciBmbGFnID0gZmFsc2U7Ci0JCi0JaWYgKCBhdHRyX3N1cHByZXNzZWQgPT0gbnVsbCB8fCBhdHRyX3N1cHByZXNzZWQgPT0gIiIgfHwgYXR0cl9zdXBwcmVzc2VkID09ICJ1bmRlZmluZWQiICkKLQl7Ci0JCS8vIHRoaXMgbWV0aG9kIGlzIGRlZmluZWQgaW4gYWN0aXZpdHlsYXlvdXQuanMKLQkJaWYgKCByZWxQYXRoICE9IG51bGwgJiYgcmVsUGF0aCAhPSAiIiAmJiByZWxQYXRoICE9ICJ1bmRlZmluZWQiICkKLQkJewotCQkJZmxhZyA9IHRoaXMucGFyZW50LmlzU3VwcHJlc3NlZChjb250ZW50UGFnZS5wcm9jZXNzUGFnZS5wYXJfcHJvYywgY29udGVudFBhZ2UucHJvY2Vzc1BhZ2UucGFyX3BhdGggKyByZWxQYXRoKTsKLQkJfQotCQkvL2FsZXJ0KCJ4MSwgZmxhZz0iICsgZmxhZyk7Ci0JfQotCWVsc2UKLQl7Ci0JCWZsYWcgPSAoYXR0cl9zdXBwcmVzc2VkID09ICJ0cnVlIik7Ci0JfQotCQotCS8vYWxlcnQoZmxhZyArICIgPSAiICsgYXR0cl9zdXBwcmVzc2VkICsgcmVsUGF0aCk7Ci0JcmV0dXJuIGZsYWc7Ci0KLX07Ci0KLQotQWN0aXZpdHlUcmVlVGFibGUucHJvdG90eXBlLnNldE5vZGVTdXBwcmVzc2VkID0gZnVuY3Rpb24odHJFbGVtZW50LCBmbGFnKQotewotCXRyRWxlbWVudC5zZXRBdHRyaWJ1dGUoImlzU3VwcmVzc2VkIiwgZmxhZyA/ICJ0cnVlIiA6ICJmYWxzZSIpOwotCQkKLX07Ci0KLQotCi0KLS8vIGRlZmluZSB0aGUgYnJlYWsgZG93biBzdHJ1Y3R1cmUgY29sdW1ucyBpZHMgaGVyZQotQlNfQ09MX0lOREVYID0gImlkIjsKLUJTX0NPTF9OQU1FID0gIm5hbWUiOwotQlNfQ09MX1BSRUZJWCA9ICJwcmVmaXgiOwotQlNfQ09MX1BSRURFQ0VTU09SUyA9ICJwcmVkZWNlc3NvcnMiOwotQlNfQ09MX0lTX1JFUEVBVEFCTEUgPSAiaXNfcmVwZWF0YWJsZSI7Ci1CU19DT0xfSVNfT05HT0lORyA9ICJpc19vbmdvaW5nIjsKLUJTX0NPTF9JU19FVkVOVF9EUklWRU4gPSAiaXNfZXZlbnRfZHJpdmVuIjsKLUJTX0NPTF9FTlRSWV9TVEFURSA9ICJlbnRyeV9zdGF0ZSI7Ci1CU19DT0xfRVhJVF9TVEFURSA9ICJleGl0X3N0YXRlIjsKLUJTX0NPTF9URUFNUyA9ICJ0ZWFtcyI7Ci1CU19DT0xfVFlQRSA9ICJ0eXBlIjsKLUJTX0NPTF9NT0RFTF9JTkZPID0gIm1vZGVsX2luZm8iOwotQlNfQ09MX1BSRVNFTlRBVElPTl9OQU1FID0gInByZXNlbnRhdGlvbl9uYW1lIjsgCi1CU19DT0xfU1RFUFMgPSAic3RlcHMiOwotQlNfQ09MX0RFTElWRVJBQkxFID0gImRlbGl2ZXJhYmxlIjsgCi1CU19DT0xfSVNfT1BUSU9OQUwgPSAiaXNfb3B0aW9uYWwiOyAKLUJTX0NPTF9JU19QTEFOTkVEID0gImlzX3BsYW5uZWQiOwotQlNfQ09MX0hBU19NVUxUSVBMRV9PQ0NVUlJFTkNFUyA9ICJoYXNfbXVsdGlwbGVfb2NjdXJyZW5jZXMiOwotCi0vLyBpZCBwcmVmaXgKLUJTX0lEX1BSRUZJWCA9ICJCU19DT0xfIjsKLVNURVBfR1JPVVBfU0laRSA9IDU7Ci0KLWZ1bmN0aW9uIFdCU0l0ZW1IdG1sKC8qQWN0aXZpdHlUcmVlVGFibGUqL3BhcmVudCkKLXsKLXRoaXMucGFyZW50ID0gcGFyZW50OwotLy90aGlzLmltYWdlUGF0aCA9IGltZ1BhdGg7Ci0KLXRoaXMuZXh0ZW5kVmFyaWFiaWxpdHkgPSAiZXh0ZW5kIjsgLy8gISEhIGRvbid0IHRyYW5zbGF0ZSB0aGlzICEhIQotdGhpcy5sb2NhbENvbnRyaWJ1dGlvblZhcmlhYmlsaXR5ID0gImxvY2FsQ29udHJpYnV0aW9uIjsJLy8gISEhIGRvbid0IHRyYW5zbGF0ZSB0aGlzICEhIQotdGhpcy5sb2NhbFJlcGxhY2VtZW50VmFyaWFiaWxpdHkgPSAibG9jYWxSZXBsYWNlbWVudCI7CS8vICEhISBkb24ndCB0cmFuc2xhdGUgdGhpcyAhISEKLQotLy90aGlzLnNvdXJjZV9odG1sID0gbmV3IEFycmF5KCk7Ci0vL3RoaXMuY29sdW1ucyA9IFtdOwotdGhpcy5maWVsZHMgPSBbXTsKLXRoaXMuaW5kZW50U2l6ZSA9IDA7Ci10aGlzLmhhc0NoaWxkcmVuID0gZmFsc2U7Ci10aGlzLmlkID0gIiI7Ci10aGlzLnBhcmVudElkID0gIiI7Ci10aGlzLnJlbFBhdGggPSBudWxsOwotdGhpcy5pc1N1cHJlc3NlZCA9IGZhbHNlOwotdGhpcy51cmwgPSAiIjsKLQotCi19OwotCi0KLQotV0JTSXRlbUh0bWwucHJvdG90eXBlLmdldFRyZWVOb2RlVGFibGVIdG1sID0gZnVuY3Rpb24oaW5kZW50U2l6ZSwgaGFzQ2hpbGRyZW4sIHRpdGxlLCB1cmwsIHJlbFBhdGgpCi17Ci0KLS8vIHRlc3QKLS8vIHRoZSB1cmwgaXMgcGFzc2VkIGluIHRvIGEgc3RyaW5nIHRvIGNvbnN0cnVjdCBhIHN0cmluZyBsaXRlcmFsCi0vLyBuZWVkIHRvIGVzY2FwZSB0aGUgcXVvdGVzCi11cmwgPSB1cmwucmVwbGFjZSgvKFwnfFwiKS9nLCAiXFwkMSIpOwotCi11cmwgPSBjb250ZW50UGFnZS5wcm9jZXNzUGFnZS5nZXRBY3Rpdml0eUl0ZW1VcmwodXJsLCBjb250ZW50UGFnZS5wcm9jZXNzUGFnZS5wYXJfcHJvYywgY29udGVudFBhZ2UucHJvY2Vzc1BhZ2UucGFyX3BhdGgsIHJlbFBhdGgpOwotCi12YXIgc3JjID0gWwotIjx0YWJsZSBiZ2NvbG9yPVwiIzAwMDAwMFwiIGNlbGxwYWRkaW5nPVwiMFwiIGNlbGxzcGFjaW5nPVwiMFwiIGJvcmRlcj1cIjBcIiBjbGFzcz1cImRlZmF1bHRUYWJsZVwiPjx0cj48dGQgbm93cmFwPVwibm93cmFwXCI+IiBdOwotc3JjID0gc3JjLmNvbmNhdCh0aGlzLmdldFRyZWVOb2RlSHRtbChpbmRlbnRTaXplLCBoYXNDaGlsZHJlbikpOyAKLXNyYyA9IHNyYy5jb25jYXQoWwotIjwvdGQ+PHRkIHdpZHRoPVwiMTAwJVwiIG5vd3JhcD1cIm5vd3JhcFwiPiIgLCAKLSI8YSBocmVmPVwiIiAsIHVybCAsICJcIj4iICwgdGl0bGUgLCAiPC9hPiIgLCAKLSI8L3RkPjwvdHI+PC90YWJsZT4iXSk7Ci0KLQlyZXR1cm4gc3JjOwotfTsKLQotCi1XQlNJdGVtSHRtbC5wcm90b3R5cGUuZ2V0VHJlZU5vZGVIdG1sID0gZnVuY3Rpb24oaW5kZW50U2l6ZSwgaGFzQ2hpbGRyZW4pCi17Ci0JdmFyIHdpZHRoID0gMTcqaW5kZW50U2l6ZTsKLQotCXZhciBzdHIgPSBbIjxkaXYgY2xhc3M9XCJ0cmVlTm9kZVwiPjxzcGFuPiJdOwotCXZhciBzbGVuID0gMTsKLQlpZiAoIGluZGVudFNpemUgPiAwICkKLQl7Ci0JCXN0cltzbGVuXSA9ICI8aW1nIGFsdD1cIlwiIHdpZHRoPVwiIiA7Ci0JCXN0cltzbGVuICsgMV0gPSB3aWR0aCA7Ci0JCXN0cltzbGVuICsgMl0gPSAiXCIgaGVpZ2h0PVwiMTVcIiBib3JkZXI9XCIwXCIgc3JjPVwiIiA7Ci0JCXN0cltzbGVuICsgM10gPSB0aGlzLnBhcmVudC5zaGltSW1hZ2UgOwotCQlzdHJbc2xlbiArIDRdID0gIlwiLz4iOwotCQlzbGVuICs9IDU7Ci0JfQotCi0KLQl2YXIgaW1nU3JjOwotCQotCWlmICggIWhhc0NoaWxkcmVuICkKLQl7Ci0JCXN0cltzbGVuXT0gIjxpbWcgYWx0PVwiXCIgd2lkdGg9XCIxN1wiIGhlaWdodD1cIjE1XCIgYm9yZGVyPVwiMFwiIGFsaWduPVwiYWJzbWlkZGxlXCIgc3JjPVwiIiA7Ci0JCXN0cltzbGVuICsgMV0gPSB0aGlzLnBhcmVudC5zaGltSW1hZ2UgOwotCQlzdHJbc2xlbiArIDJdID0gIlwiPiI7Ci0JCXNsZW4gKz0gMzsKLQotCX0KLQllbHNlIAotCXsKLQkJdmFyIGltYWdlU3JjID0gdGhpcy5wYXJlbnQuZ2V0VHJlZU5vZGVTcmMoaW5kZW50U2l6ZSk7Ci0JCXN0cltzbGVuXSA9ICI8aW1nIGFsdD1cIiIgOwotCQlzdHJbc2xlbiArIDFdID0gIGNvbnRlbnRQYWdlLnJlcy5leHBhbmRUZXh0IDsKLQkJc3RyW3NsZW4gKyAyXSA9ICAiXCIgdGl0bGU9XCIiIDsKLQkJc3RyW3NsZW4gKyAzXSA9ICBjb250ZW50UGFnZS5yZXMuZXhwYW5kVGV4dCA7Ci0JCXN0cltzbGVuICsgNF0gPSAgIlwiIHdpZHRoPVwiMTdcIiBoZWlnaHQ9XCIxNVwiIGJvcmRlcj1cIjBcIiBhbGlnbj1cImFic21pZGRsZVwiIHNyYz1cIiIgOwotCQlzdHJbc2xlbiArIDVdID0gIGltYWdlU3JjIDsKLQkJc3RyW3NsZW4gKyA2XSA9ICAiXCIiIDsKLQkJc3RyW3NsZW4gKyA3XSA9ICAiIHN0eWxlPVwiY3Vyc29yOmhhbmRcIiBvbmNsaWNrPVwiY29udGVudFBhZ2UucHJvY2Vzc1BhZ2UudHJlZVRhYmxlLmV4cGFuZENvbGxhcHNlVHJlZU5vZGUodGhpcyk7cmV0dXJuIGZhbHNlO1wiIC8+IjsKLQkJc2xlbiArPSA4OwotCX0KLQkKLQkKLQlzdHJbc2xlbl0gPSAiPC9zcGFuPiYjMTYwOyYjMTYwOzwvZGl2PiI7Ci0KLQlyZXR1cm4gc3RyOwkKLX07Ci0KLQotV0JTSXRlbUh0bWwucHJvdG90eXBlLnBhcnNlUm93ID0gZnVuY3Rpb24ocm93KSB7Ci0JLyoKLQl2YXIgX2lkID0gcm93LmlkOwotCXZhciBfcGFyZW50SWQgPSByb3cucGFyZW50SWQ7Ci0JdmFyIF9yZWxQYXRoID0gcm93LnJlbFBhdGg7Ci0JdmFyIF9pc1N1cHJlc3NlZCA9IHJvdy5pc1N1cHByZXNzZWQ7Ci0JdmFyIF9pbmRlbnRTaXplID0gcm93LmluZGVudFNpemU7Ci0JdmFyIF9oYXNDaGlsZHJlbiA9IHJvdy5oYXNDaGlsZHJlbjsgCi0JdmFyIF9pbmRleCA9IHJvdy5pbmRleDsKLQl2YXIgX3ByZWZpeD0gcm93LnByZWZpeDsKLQluYW1lLCB0aXRsZSwgdXJsLCBzdGVwcywgcHJlZGVjZXNzb3JzLCBpbmZvLCB0eXBlLCAKLQlyZXBlYXRhYmxlLCBtdWx0aU9jY3VyZW5jZXMsIG9wdGlvbmFsLCBwbGFubmVkLCBvbmdvaW5nLCBldmVudERyaXZlbiwgCi0JdGVhbSwgZW50cnlTdGF0ZSwgZXhpdFN0YXRlLCBkZWxpdmVyYWJsZSwgdmFyaWFiaWxpdHlUeXBlOwotCSovCi0JCi0JdGhpcy5pbml0Um93KHJvdy5pZCwgcm93LnBhcmVudElkLCByb3cucmVsUGF0aCwgcm93LmlzU3VwcmVzc2VkLCByb3cuaW5kZW50U2l6ZSwgcm93Lmhhc0NoaWxkcmVuLCAKLQkJcm93LmluZGV4LCByb3cucHJlZml4LCByb3cubmFtZSwgcm93LnRpdGxlLCByb3cudXJsLCAiIiwgcm93LnByZWRlY2Vzc29ycywgcm93LmluZm8sIHJvdy50eXBlLCAKLQkJcm93LnJlcGVhdGFibGUsIHJvdy5tdWx0aU9jY3VyZW5jZXMsIHJvdy5vcHRpb25hbCwgcm93LnBsYW5uZWQsIHJvdy5vbmdvaW5nLCByb3cuZXZlbnREcml2ZW4sIAotCQlyb3cudGVhbSwgcm93LmVudHJ5U3RhdGUsIHJvdy5leGl0U3RhdGUsIHJvdy5kZWxpdmVyYWJsZSwgcm93LnZhcmlhYmlsaXR5VHlwZSk7Ci0JCi0JaWYgKCByb3cuc3RlcHMgIT0gbnVsbCApIHsKLQkJdmFyIGxlbiA9IHJvdy5zdGVwcy5sZW5ndGg7Ci0JCXZhciBicmsgPSBmYWxzZTsKLQkJZm9yICggdmFyIGkgPSAwOyBpIDwgbGVuOyBpKysgKSB7Ci0JCQlicmsgPSAoKGkrMSklU1RFUF9HUk9VUF9TSVpFID09IDAgKTsKLQkJCXRoaXMuYWRkU3RlcChyb3cuc3RlcHNbaV0sIGJyayk7Ci0JCX0KLQl9Ci19OwotCi1XQlNJdGVtSHRtbC5wcm90b3R5cGUubG9hZFJvdyA9IGZ1bmN0aW9uKC8qRE9NKi90cikKLXsKLQkvL3ZhciB0ciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIlRSIik7Ci0JdHIuaWQgPSB0aGlzLmlkOwotCXRyLmNsYXNzTmFtZSA9ICJ0cmVlTm9kZSI7Ci0JdHIuc2V0QXR0cmlidXRlKCJwYXJlbnRJZCIsIHRoaXMucGFyZW50SWQpOwotCXRyLnNldEF0dHJpYnV0ZSgicmVsUHJvY2Vzc1BhdGgiLCB0aGlzLnJlbFBhdGgpOwotCi0JLy8gaXMgc3VwcHJlc3NlZCBmbGFnIGlzIHNldCBvbmx5IHdoZW4gaW4gYnJvd3NpbmcgbW9kZWwsIGl0J3Mgbm90IHNldCBpbiBwdWJsaXNoaW5nIG1vZGVsCi0JaWYgKCB0aGlzLmlzU3VwcmVzc2VkICE9IG51bGwgJiYgdGhpcy5pc1N1cHJlc3NlZCAhPSAiIiAmJiB0aGlzLmlzU3VwcmVzc2VkICE9IHVuZGVmaW5lZCkgewotCQl0ci5zZXRBdHRyaWJ1dGUoImlzU3VwcmVzc2VkIiwgdGhpcy5pc1N1cHJlc3NlZCk7Ci0JfQotCQotCS8vIGdldCB0aGUgY2VsbCBzb3VyY2UKLQl2YXIgc3JjID0gW107Ci0JdmFyIGxlbiA9IHRoaXMucGFyZW50LmRhdGEuY29sdW1ucy5sZW5ndGg7Ci0JZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkrKyApIHsKLQkJdmFyIHRkID0gdHIuaW5zZXJ0Q2VsbCh0ci5jZWxscy5sZW5ndGgpOwotCQl0aGlzLmxvYWRDZWxsKHRkLCBpKTsKLQkJLy90ci5hcHBlbmRDaGlsZCh0ZCk7Ci0JCQotCX0KLQkKLQlyZXR1cm4gdHI7CQkJCQotfTsKLQotCi0KLVdCU0l0ZW1IdG1sLnByb3RvdHlwZS5pbml0Um93ID0gZnVuY3Rpb24oaWQsIHBhcmVudElkLCByZWxQYXRoLCBpc1N1cHJlc3NlZCwgaW5kZW50U2l6ZSwgaGFzQ2hpbGRyZW4sIAotCWluZGV4LCBwcmVmaXgsIG5hbWUsIHRpdGxlLCB1cmwsIHN0ZXBzLCBwcmVkZWNlc3NvcnMsIGluZm8sIHR5cGUsIAotCXJlcGVhdGFibGUsIG11bHRpT2NjdXJlbmNlcywgb3B0aW9uYWwsIHBsYW5uZWQsIG9uZ29pbmcsIGV2ZW50RHJpdmVuLCAKLQl0ZWFtLCBlbnRyeVN0YXRlLCBleGl0U3RhdGUsIGRlbGl2ZXJhYmxlLCB2YXJpYWJpbGl0eVR5cGUpCi17Ci0JdGhpcy5pbmRlbnRTaXplID0gaW5kZW50U2l6ZTsKLQl0aGlzLmhhc0NoaWxkcmVuID0gaGFzQ2hpbGRyZW47Ci0JdGhpcy5pZCA9IGlkOwotCXRoaXMucGFyZW50SWQgPSBwYXJlbnRJZDsKLQl0aGlzLnJlbFBhdGggPSByZWxQYXRoOwotCXRoaXMuaXNTdXByZXNzZWQgPSBpc1N1cHJlc3NlZDsKLQkKLQl0aGlzLmZpZWxkc1tCU19DT0xfSU5ERVhdID0gaW5kZXg7Ci0JdGhpcy5maWVsZHNbQlNfQ09MX1BSRUZJWF0gPSBwcmVmaXg7Ci0JdGhpcy5maWVsZHNbQlNfQ09MX05BTUVdID0gbmFtZTsKLQl0aGlzLmZpZWxkc1tCU19DT0xfUFJFU0VOVEFUSU9OX05BTUVdID0gdGl0bGU7Ci0JdGhpcy51cmwgPSB1cmw7Ci0JdGhpcy5maWVsZHNbQlNfQ09MX1NURVBTXSA9IHN0ZXBzOwotCXRoaXMuZmllbGRzW0JTX0NPTF9QUkVERUNFU1NPUlNdID0gcHJlZGVjZXNzb3JzOwotCWlmICh2YXJpYWJpbGl0eVR5cGUuaW5kZXhPZih0aGlzLmV4dGVuZFZhcmlhYmlsaXR5KSAhPSAtMSB8fCAKLQkJdmFyaWFiaWxpdHlUeXBlLmluZGV4T2YodGhpcy5sb2NhbENvbnRyaWJ1dGlvblZhcmlhYmlsaXR5KSAhPSAtMSB8fCAKLQkJdmFyaWFiaWxpdHlUeXBlLmluZGV4T2YodGhpcy5sb2NhbFJlcGxhY2VtZW50VmFyaWFiaWxpdHkpICE9IC0xICkKLQl7Ci0JCXRoaXMuZmllbGRzW0JTX0NPTF9NT0RFTF9JTkZPXSA9ICIiOwotCX0KLQllbHNlCi0JewotCQl0aGlzLmZpZWxkc1tCU19DT0xfTU9ERUxfSU5GT10gPSBpbmZvOwotCX0JCi0JdGhpcy5maWVsZHNbQlNfQ09MX1RZUEVdID0gdHlwZTsKLQotCXRoaXMuZmllbGRzW0JTX0NPTF9URUFNU10gPSB0ZWFtOwotCi0JdGhpcy5maWVsZHNbQlNfQ09MX0VOVFJZX1NUQVRFXSA9IGVudHJ5U3RhdGU7Ci0JdGhpcy5maWVsZHNbQlNfQ09MX0VYSVRfU1RBVEVdID0gZXhpdFN0YXRlOwotCXRoaXMuZmllbGRzW0JTX0NPTF9ERUxJVkVSQUJMRV0gPSBkZWxpdmVyYWJsZTsKLQkKLQl0aGlzLnNldFN0YXRlcyhyZXBlYXRhYmxlLCBtdWx0aU9jY3VyZW5jZXMsIG9wdGlvbmFsLCBwbGFubmVkLCBvbmdvaW5nLCBldmVudERyaXZlbik7Ci0JCi0JCi19OwotCi1XQlNJdGVtSHRtbC5wcm90b3R5cGUuYWRkU3RlcCA9IGZ1bmN0aW9uKHNlbGVjdGVkLCBsaW5lQnJlYWspCi17Ci0JdmFyIGltZ19zcmM7Ci0JaWYgKCBzZWxlY3RlZCApIHsKLQkJaW1nX3NyYyA9IHRoaXMucGFyZW50LmltYWdlUGF0aCArICJjaXJjbGVfY2xvc2UuZ2lmIjsKLQl9IGVsc2UgewotCQlpbWdfc3JjID0gdGhpcy5wYXJlbnQuaW1hZ2VQYXRoICsgImNpcmNsZV9vcGVuLmdpZiI7CQotCX0KLQkKLQl2YXIgc3RlcHMgPSB0aGlzLmZpZWxkc1tCU19DT0xfU1RFUFNdOwotCXN0ZXBzICs9ICI8aW1nIHdpZHRoPVwiMTBcIiBoZWlnaHQ9XCI5XCIgYWx0PVwiXCIgc3JjPVwiIiArIGltZ19zcmMgKyAiXCIgLz4iOwotCWlmIChsaW5lQnJlYWspCi0JewotCQlzdGVwcyArPSAiPGJyLz4iOwotCX0KLQkKLQl0aGlzLmZpZWxkc1tCU19DT0xfU1RFUFNdID0gc3RlcHM7Ci19OwotCi0KLVdCU0l0ZW1IdG1sLnByb3RvdHlwZS5zZXRTdGF0ZXMgPSBmdW5jdGlvbihyZXBlYXRhYmxlLCBtdWx0aU9jY3VyZW5jZXMsIG9wdGlvbmFsLCBwbGFubmVkLCBvbmdvaW5nLCBldmVudERyaXZlbikKLXsKLQlpZiAoIHJlcGVhdGFibGUgPT0gInRydWUiKSB7Ci0JCXJlcGVhdGFibGUgPSAiPGltZyBhbHQ9XCIiICsgY29udGVudFBhZ2UucmVzLmNoZWNrZWRBbHRUZXh0ICsgIlwiIGhlaWdodD1cIjE1XCIgd2lkdGg9XCIyMFwiIHNyYz1cIiIgKyB0aGlzLnBhcmVudC5pbWFnZVBhdGggKyAidHJ1ZS5naWZcIj4iOwotCX0gZWxzZSB7Ci0JCXJlcGVhdGFibGUgPSAiJm5ic3A7IjsKLQl9Ci0JCi0JaWYgKCBtdWx0aU9jY3VyZW5jZXMgPT0gInRydWUiKSB7Ci0JCW11bHRpT2NjdXJlbmNlcyA9ICI8aW1nIGFsdD1cIiIgKyBjb250ZW50UGFnZS5yZXMuY2hlY2tlZEFsdFRleHQgKyAiXCIgdGl0bGU9XCIiICsgY29udGVudFBhZ2UucmVzLmNoZWNrZWRBbHRUZXh0ICsgIlwiIGhlaWdodD1cIjE1XCIgd2lkdGg9XCIyMFwiIHNyYz1cIiIgKyB0aGlzLnBhcmVudC5pbWFnZVBhdGggKyAidHJ1ZS5naWZcIj4iOwotCX0gZWxzZSB7Ci0JCW11bHRpT2NjdXJlbmNlcyA9ICImbmJzcDsiOwotCX0KLQkKLQlpZiAoIG9wdGlvbmFsID09ICJ0cnVlIikgewotCQlvcHRpb25hbCA9ICI8aW1nIGFsdD1cIiIgKyBjb250ZW50UGFnZS5yZXMuY2hlY2tlZEFsdFRleHQgKyAiXCIgdGl0bGU9XCIiICsgY29udGVudFBhZ2UucmVzLmNoZWNrZWRBbHRUZXh0ICsgIlwiIGhlaWdodD1cIjE1XCIgd2lkdGg9XCIyMFwiIHNyYz1cIiIgKyB0aGlzLnBhcmVudC5pbWFnZVBhdGggKyAidHJ1ZS5naWZcIj4iOwotCX0gZWxzZSB7Ci0JCW9wdGlvbmFsID0gIiZuYnNwOyI7Ci0JfQotCi0JaWYgKCBwbGFubmVkID09InRydWUiKSB7Ci0JCXBsYW5uZWQgPSAiPGltZyBhbHQ9XCIiICsgY29udGVudFBhZ2UucmVzLmNoZWNrZWRBbHRUZXh0ICsgIlwiIHRpdGxlPVwiIiArIGNvbnRlbnRQYWdlLnJlcy5jaGVja2VkQWx0VGV4dCArICJcIiBoZWlnaHQ9XCIxNVwiIHdpZHRoPVwiMjBcIiBzcmM9XCIiICsgdGhpcy5wYXJlbnQuaW1hZ2VQYXRoICsgInRydWUuZ2lmXCI+IjsKLQl9IGVsc2UgewotCQlwbGFubmVkID0gIiZuYnNwOyI7Ci0JfQotCi0JaWYgKCBvbmdvaW5nID09InRydWUiKSB7Ci0JCW9uZ29pbmcgPSAiPGltZyBhbHQ9XCIiICsgY29udGVudFBhZ2UucmVzLmNoZWNrZWRBbHRUZXh0ICsgIlwiIHRpdGxlPVwiIiArIGNvbnRlbnRQYWdlLnJlcy5jaGVja2VkQWx0VGV4dCArICJcIiBoZWlnaHQ9XCIxNVwiIHdpZHRoPVwiMjBcIiBzcmM9XCIiICsgdGhpcy5wYXJlbnQuaW1hZ2VQYXRoICsgInRydWUuZ2lmXCI+IjsKLQl9IGVsc2UgewotCQlvbmdvaW5nID0gIiZuYnNwOyI7Ci0JfQotCQotCWlmICggZXZlbnREcml2ZW4gPT0idHJ1ZSIpIHsKLQkJZXZlbnREcml2ZW4gPSAiPGltZyBhbHQ9XCIiICsgY29udGVudFBhZ2UucmVzLmNoZWNrZWRBbHRUZXh0ICsgIlwiIHRpdGxlPVwiIiArIGNvbnRlbnRQYWdlLnJlcy5jaGVja2VkQWx0VGV4dCArICJcIiBoZWlnaHQ9XCIxNVwiIHdpZHRoPVwiMjBcIiBzcmM9XCIiICsgdGhpcy5wYXJlbnQuaW1hZ2VQYXRoICsgInRydWUuZ2lmXCI+IjsKLQl9IGVsc2UgewotCQlldmVudERyaXZlbiA9ICImbmJzcDsiOwotCX0KLQkKLQkKLQl0aGlzLmZpZWxkc1tCU19DT0xfSVNfUkVQRUFUQUJMRV0gPSByZXBlYXRhYmxlOwotCXRoaXMuZmllbGRzW0JTX0NPTF9IQVNfTVVMVElQTEVfT0NDVVJSRU5DRVNdID0gbXVsdGlPY2N1cmVuY2VzOwotCXRoaXMuZmllbGRzW0JTX0NPTF9JU19PUFRJT05BTF0gPSBvcHRpb25hbDsKLQl0aGlzLmZpZWxkc1tCU19DT0xfSVNfUExBTk5FRF0gPSBwbGFubmVkOwotCXRoaXMuZmllbGRzW0JTX0NPTF9JU19PTkdPSU5HXSA9IG9uZ29pbmc7Ci0JdGhpcy5maWVsZHNbQlNfQ09MX0lTX0VWRU5UX0RSSVZFTl0gPSBldmVudERyaXZlbjsKLQotfTsKLQotCi0KLVdCU0l0ZW1IdG1sLnByb3RvdHlwZS5sb2FkQ2VsbCA9IGZ1bmN0aW9uKC8qRE9NKi90ZEVsLCBjb2x1bW5Db3VudCkgewotCi0JdmFyIGNvbCA9IHRoaXMucGFyZW50LmRhdGEuY29sdW1uc1tjb2x1bW5Db3VudF07Ci0JdmFyIGNvbF9pZCA9IGNvbFswXTsKLQl2YXIgdGV4dCA9IHRoaXMuZmllbGRzW2NvbF9pZF07Ci0JaWYgKCB0ZXh0ID09ICIiICkgewotCQl0ZXh0ID0gIiZuYnNwOyI7Ci0JfQotCQotCXZhciBpZCA9IEJTX0lEX1BSRUZJWCArIGNvbF9pZDsKLQkKLQkvL3ZhciB0ZEVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiVEQiKTsJCi0JdGRFbC5pZCA9IGlkOwotCXRkRWwuaGVhZGVycyA9ICIiOwotCQotCXZhciBzdHIgPSAiIjsKLQl2YXIgc2xlbiA9IDM7Ci0JaWYgKCBjb2x1bW5Db3VudCAlIDIgIT0gMCApIHsKLQkJdGRFbC5zdHlsZS5iYWNrZ3JvdW5kID0gIiNjY2NjY2MiOwotCX0KLQkKLQlpZiAoIGNvbF9pZC5pbmRleE9mKCJpc18iKSA+PTAgfHwgY29sX2lkLmluZGV4T2YoImhhc18iKSA+PTAgKSB7CQotCQl0ZEVsLmFsaWduID0gImNlbnRlciI7Ci0JfQotCQotCWlmICggY29sX2lkID09IEJTX0NPTF9UWVBFIHx8IGNvbF9pZCA9PSBCU19DT0xfU1RFUFMgKSB7Ci0JCS8vdGRFbC5ub3dyYXAgPSB0cnVlOwotCQl0ZXh0ID0gIjxzcGFuIHN0eWxlPSd3aGl0ZS1zcGFjZTpub3dyYXA7Jz4iICsgdGV4dCArICI8L3NwYW4+IjsKLQl9Ci0JCi0JaWYgKCBjb2xfaWQgPT0gQlNfQ09MX1BSRVNFTlRBVElPTl9OQU1FICkgewotCQl0ZEVsLndpZHRoPSIxMDAlIjsKLQkJdGV4dCA9IHRoaXMuZ2V0VHJlZU5vZGVUYWJsZUh0bWwoCi0JCQl0aGlzLmluZGVudFNpemUsIHRoaXMuaGFzQ2hpbGRyZW4sIAotCQkJdGV4dCwgdGhpcy51cmwsIHRoaXMucmVsUGF0aCkuam9pbigiIik7Ci0JCQotCX0gCi0JCi0KLQl0ZEVsLmlubmVySFRNTCA9IHRleHQ7Ci0JcmV0dXJuIHRkRWw7Ci0KLX07Ci0KLQotCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvc2NyaXB0cy9Db250ZW50UGFnZVJlc291cmNlLmpzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L3NjcmlwdHMvQ29udGVudFBhZ2VSZXNvdXJjZS5qcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODFkMGFlYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvc2NyaXB0cy9Db250ZW50UGFnZVJlc291cmNlLmpzCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLyAKLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS8qIHJlc291cmNlIGZpbGVzIGZvciBjb250ZW50IHBhZ2UgamF2YXNjcmlwdCAKLSAqIHRoaXMgZmlsZSBzaG91bGQgYmUgbG9jYWxpemVkCi0qLwotQ29udGVudFBhZ2VSZXNvdXJjZSA9IGZ1bmN0aW9uKCkgewotCi0KLXRoaXMuZXhwYW5kQWxsVGV4dCA9ICJFeHBhbmQgQWxsIFNlY3Rpb25zIjsKLXRoaXMuY29sbGFwc2VBbGxUZXh0ID0gIkNvbGxhcHNlIEFsbCBTZWN0aW9ucyI7Ci10aGlzLmJhY2tUb1RvcFRleHQgPSAiQmFjayB0byB0b3AiOwotCi10aGlzLmV4cGFuZEFsbFN1YlNlY3Rpb25zVGV4dCA9ICJFeHBhbmQgQWxsIFN0ZXBzIjsKLXRoaXMuY29sbGFwc2VBbGxTdWJTZWN0aW9uc1RleHQgPSAiQ29sbGFwc2UgQWxsIFN0ZXBzIjsKLQotdGhpcy50b29sYmFyX2Jvb2ttYXJrID0gIkJvb2ttYXJrIHRoaXMgcGFnZSI7Ci10aGlzLnRvb2xiYXJfYmFjayA9ICJCYWNrIjsKLXRoaXMudG9vbGJhcl9mb3J3YXJkID0gIkZvcndhcmQiOwotdGhpcy50b29sYmFyX2V4cGFuZF9hbGwgPSAiRXhwYW5kIGFsbCI7Ci10aGlzLnRvb2xiYXJfY29sbGFwc2VfYWxsID0gIkNvbGxhcHNlIGFsbCI7Ci10aGlzLnRvb2xiYXJfcHJpbnQgPSAiUHJpbnQiOwotCi10aGlzLmV4cGFuZFRleHQgPSAiRXhwYW5kIgotdGhpcy5jb2xsYXBzZVRleHQgPSAiQ29sbGFwc2UiCi10aGlzLmNoZWNrZWRBbHRUZXh0ID0gIlllcyIJCi0KLX07CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvc2NyaXB0cy9Db250ZW50UGFnZVNlY3Rpb24uanMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvc2NyaXB0cy9Db250ZW50UGFnZVNlY3Rpb24uanMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3NTU5MTkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L3NjcmlwdHMvQ29udGVudFBhZ2VTZWN0aW9uLmpzCisrKyAvZGV2L251bGwKQEAgLTEsMjk1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8gCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1Db250ZW50UGFnZVNlY3Rpb24gPSBmdW5jdGlvbigpewotCi10aGlzLmNvbGxhcHNlU2VjdGlvbnNCeURlZmF1bHQgPSBmYWxzZTsKLXRoaXMuZmlyc3RTZWN0aW9uID0gbnVsbDsKLXRoaXMuZXhwYW5kSW1hZ2UgPSBudWxsOwotdGhpcy5jb2xsYXBzZUltYWdlID0gbnVsbDsKLXRoaXMuZXhwYW5kQWxsSW1hZ2UgPSBudWxsOwotdGhpcy5jb2xsYXBzZUFsbEltYWdlID0gbnVsbDsKLXRoaXMuYmFja1RvVG9wSW1hZ2UgPSBudWxsOwotdGhpcy5zaGltSW1hZ2UgPSBudWxsOwotdGhpcy5zZWN0aW9uQ29sbGFwc2VEaXZzID0gbnVsbDsKLXRoaXMuc2VjdGlvbkNvbGxhcHNlTGlua3MgPSBudWxsOwotCi0vLyB0ZXN0IG1lc3NhZ2UsIAotdGhpcy5iYWNrVG9Ub3BUZXh0ID0gbnVsbDsKLXRoaXMuZXhwYW5kQWxsVGV4dCA9IG51bGw7Ci10aGlzLmNvbGxhcHNlQWxsVGV4dCA9IG51bGw7Ci19OwotCi1Db250ZW50UGFnZVNlY3Rpb24ucHJvdG90eXBlLmluaXQgPSBmdW5jdGlvbihpbWdQYXRoKSB7Ci0KLQl0aGlzLmJhY2tUb1RvcFRleHQgPSBjb250ZW50UGFnZS5yZXMuYmFja1RvVG9wVGV4dDsKLQl0aGlzLmV4cGFuZEFsbFRleHQgPSBjb250ZW50UGFnZS5yZXMuZXhwYW5kQWxsVGV4dDsKLQl0aGlzLmNvbGxhcHNlQWxsVGV4dCA9IGNvbnRlbnRQYWdlLnJlcy5jb2xsYXBzZUFsbFRleHQ7Ci0KLQl0aGlzLmV4cGFuZEltYWdlID0gY29udGVudFBhZ2UucmVzb2x2ZVVybChpbWdQYXRoICsgJ2V4cGFuZC5naWYnKTsJCQotCXRoaXMuY29sbGFwc2VJbWFnZSA9IGNvbnRlbnRQYWdlLnJlc29sdmVVcmwoaW1nUGF0aCArICdjb2xsYXBzZS5naWYnKTsKLQl0aGlzLmV4cGFuZEFsbEltYWdlID0gY29udGVudFBhZ2UucmVzb2x2ZVVybChpbWdQYXRoICsgJ2V4cGFuZF9hbGwuZ2lmJyk7CQotCXRoaXMuY29sbGFwc2VBbGxJbWFnZSA9IGNvbnRlbnRQYWdlLnJlc29sdmVVcmwoaW1nUGF0aCArICdjb2xsYXBzZV9hbGwuZ2lmJyk7Ci0JdGhpcy5iYWNrVG9Ub3BJbWFnZSA9IGNvbnRlbnRQYWdlLnJlc29sdmVVcmwoaW1nUGF0aCArICdiYWNrX3RvX3RvcC5naWYnKTsKLQl0aGlzLnNoaW1JbWFnZSA9IGNvbnRlbnRQYWdlLnJlc29sdmVVcmwoaW1nUGF0aCArICdzaGltLmdpZicpOwotfTsKLQotLy8gQ3JlYXRlcyB0aGUgY29sbGFwc2libGUgc2VjdGlvbiBsaW5rcy4KLUNvbnRlbnRQYWdlU2VjdGlvbi5wcm90b3R5cGUuY3JlYXRlU2VjdGlvbkxpbmtzID0gZnVuY3Rpb24odGFnTmFtZSwgY2xhc3NTZWxlY3RvcikgewotCi0JaWYgKGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKSB7Ci0JCXZhciBlbGVtZW50cyA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKHRhZ05hbWUpOwotCQl2YXIgc2VjdGlvbkVsZW1lbnRzID0gbmV3IEFycmF5KGVsZW1lbnRzLmxlbmd0aCk7Ci0JCXZhciB0b3RhbExpbmtzID0gMDsKLQkJZm9yICh2YXIgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykgewotCQkJdmFyIGVsZW1lbnQgPSBlbGVtZW50c1tpXTsKLQkJCQotCQkJLy8gc2F2ZSB0aGUgZWxlbWVudCBmb3IgYXV0byB3cmFwCi0JCQlpZiAoIGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJhdXRvV3JhcCIpID09ICJ0cnVlIiApIHsKLQkJCQljb250ZW50UGFnZS5hZGRBdXRvV3JhcEVsZW1lbnQoZWxlbWVudCk7Ci0JCQl9Ci0JCQkKLQkJCWlmIChlbGVtZW50LmNsYXNzTmFtZSA9PSBjbGFzc1NlbGVjdG9yKSB7Ci0JCQkJc2VjdGlvbkVsZW1lbnRzW3RvdGFsTGlua3MrK10gPSBlbGVtZW50OwkJCQkKLQkJCX0KLQkJfQotCQlzZWN0aW9uRWxlbWVudHMubGVuZ3RoID0gdG90YWxMaW5rczsKLQkJdGhpcy5zZWN0aW9uQ29sbGFwc2VEaXZzID0gbmV3IEFycmF5KHRvdGFsTGlua3MpOwotCQl0aGlzLnNlY3Rpb25Db2xsYXBzZUxpbmtzID0gbmV3IEFycmF5KHRvdGFsTGlua3MpOwotCQl0aGlzLmZpcnN0U2VjdGlvbiA9IHNlY3Rpb25FbGVtZW50c1swXTsKLQkJZm9yICh2YXIgaSA9IDA7IGkgPCBzZWN0aW9uRWxlbWVudHMubGVuZ3RoOyBpKyspIHsKLQkJCXZhciBlbGVtZW50ID0gc2VjdGlvbkVsZW1lbnRzW2ldOwotCQkJdmFyIHNpYmxpbmdDb250YWluZXI7Ci0JCQlpZiAoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCAmJiAoc2libGluZ0NvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpKSAmJiBzaWJsaW5nQ29udGFpbmVyLnN0eWxlKSB7CQotCQkJCXZhciBuZXh0U2libGluZyA9IGVsZW1lbnQubmV4dFNpYmxpbmc7Ci0JCQkJZWxlbWVudC5wYXJlbnROb2RlLmluc2VydEJlZm9yZShzaWJsaW5nQ29udGFpbmVyLCBuZXh0U2libGluZyk7Ci0JCQkJdmFyIG5leHRFbGVtZW50ID0gc2VjdGlvbkVsZW1lbnRzW2kgKyAxXTsKLQkJCQl3aGlsZSAobmV4dFNpYmxpbmcgIT0gbmV4dEVsZW1lbnQgJiYgbmV4dFNpYmxpbmcgIT0gbnVsbCAmJiBuZXh0U2libGluZy5jbGFzc05hbWUgIT0gJ2NvcHlyaWdodCcpIHsKLQkJCQkJdmFyIHRvTW92ZSA9IG5leHRTaWJsaW5nOwotCQkJCQluZXh0U2libGluZyA9IG5leHRTaWJsaW5nLm5leHRTaWJsaW5nOwotCQkJCQlzaWJsaW5nQ29udGFpbmVyLmFwcGVuZENoaWxkKHRvTW92ZSk7Ci0JCQkJfQotCQkJCWlmICh0aGlzLmNvbGxhcHNlU2VjdGlvbnNCeURlZmF1bHQpIHsKLSAgICAJCQkJc2libGluZ0NvbnRhaW5lci5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOwotICAgIAkJCX0KLSAgICAJCQl0aGlzLnNlY3Rpb25Db2xsYXBzZURpdnNbaV0gPSBzaWJsaW5nQ29udGFpbmVyOwotICAgIAkJCXRoaXMuY3JlYXRlQ29sbGFwc2libGVTZWN0aW9uKGVsZW1lbnQsIHNpYmxpbmdDb250YWluZXIsIGkpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCQotCQl0aGlzLmNyZWF0ZUV4cGFuZENvbGxhcHNlQWxsU2VjdGlvbnNMaW5rcyhzZWN0aW9uRWxlbWVudHNbMF0pOwotCX0KLX07Ci0KLS8vIENyZWF0ZXMgYSBjb2xsYXBzaWJsZSBzZWN0aW9uLgotQ29udGVudFBhZ2VTZWN0aW9uLnByb3RvdHlwZS5jcmVhdGVDb2xsYXBzaWJsZVNlY3Rpb24gPSBmdW5jdGlvbihlbGVtZW50LCBzaWJsaW5nQ29udGFpbmVyLCBpbmRleCkgewotCWlmIChkb2N1bWVudC5jcmVhdGVFbGVtZW50KSB7Ci0JCS8vIEFkZCBhIHNwYWNpbmcgYmV0d2VlbiB0aGUgc2VjdGlvbnMuCi0JCXZhciBzZWN0aW9uU2VwYXJhdG9yID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW1nJyk7Ci0JCXNlY3Rpb25TZXBhcmF0b3Iuc3JjID0gdGhpcy5zaGltSW1hZ2U7Ci0JCXNlY3Rpb25TZXBhcmF0b3IuYWx0ID0gJyc7Ci0JCXNlY3Rpb25TZXBhcmF0b3IudGl0bGUgPSAnJzsKLQkJc2VjdGlvblNlcGFyYXRvci5oZWlnaHQgPSAnMyc7Ci0JCXNlY3Rpb25TZXBhcmF0b3IuYm9yZGVyID0gJzAnOwotCQlzZWN0aW9uU2VwYXJhdG9yLmFsaWduID0gJ2Fic21pZGRsZSc7Ci0JCWVsZW1lbnQucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoc2VjdGlvblNlcGFyYXRvciwgZWxlbWVudCk7Ci0JCQotCQkvLyBBZGQgYSBleHBhbmQvY29sbGFwc2UgbGluayB0byB0aGUgc2VjdGlvbiBoZWFkaW5nLgotCQl2YXIgc3BhbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTsKLQkJdmFyIGxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7Ci0JCWxpbmsuY29sbGFwc2VEaXYgPSBzaWJsaW5nQ29udGFpbmVyOwotCQlsaW5rLmhyZWYgPSAnJzsKLQkJdmFyIGltYWdlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW1nJyk7Ci0JCWlmICh0aGlzLmNvbGxhcHNlU2VjdGlvbnNCeURlZmF1bHQpIHsKLQkJCWltYWdlLnNyYyA9IHRoaXMuZXhwYW5kSW1hZ2U7Ci0JCQlpbWFnZS5hbHQgPSBjb250ZW50UGFnZS5yZXMuZXhwYW5kVGV4dDsKLQkJCWltYWdlLnRpdGxlID0gY29udGVudFBhZ2UucmVzLmV4cGFuZFRleHQ7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpbWFnZS5zcmMgPSB0aGlzLmNvbGxhcHNlSW1hZ2U7Ci0JCQlpbWFnZS5hbHQgPSBjb250ZW50UGFnZS5yZXMuY29sbGFwc2VUZXh0OwotCQkJaW1hZ2UudGl0bGUgPSBjb250ZW50UGFnZS5yZXMuY29sbGFwc2VUZXh0OwkJCQotCQl9Ci0JCQkJCi0JCWltYWdlLndpZHRoID0gJzE3JzsKLQkJaW1hZ2UuaGVpZ2h0ID0gJzE1JzsKLQkJaW1hZ2UuYm9yZGVyID0gJzAnOwotCQlpbWFnZS5hbGlnbiA9ICdhYnNtaWRkbGUnOwotCQlsaW5rLmFwcGVuZENoaWxkKGltYWdlKTsKLQkJdmFyIHNlbGYgPSB0aGlzOwotCQlsaW5rLm9uY2xpY2sgPSBmdW5jdGlvbihldnQpIHsKLQkJCS8vIGhlcmUgInRoaXMiIGlzIHRoZSB0YXJoZXQgZWxlbWVudCwgaS5lLiB0aGUgSU1HCi0JCQkvLyBFeHBhbmRzIG9yIGNvbGxhcHNlcyBhIHNlY3Rpb24gYmFzZWQgb24gdGhlIHJlY2VpdmVkIGV2ZW50LgotCQkJaWYgKHRoaXMuY29sbGFwc2VEaXYuc3R5bGUuZGlzcGxheSA9PSAnJykgewotCQkJCXRoaXMucGFyZW50Tm9kZS5wYXJlbnROb2RlLm5leHRTaWJsaW5nLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7Ci0JCQkJdGhpcy5maXJzdENoaWxkLnNyYyA9IHNlbGYuZXhwYW5kSW1hZ2U7Ci0JCQkJdGhpcy5maXJzdENoaWxkLmFsdCA9IGNvbnRlbnRQYWdlLnJlcy5leHBhbmRUZXh0OwotCQkJCXRoaXMuZmlyc3RDaGlsZC50aXRsZSA9IGNvbnRlbnRQYWdlLnJlcy5leHBhbmRUZXh0OwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJdGhpcy5wYXJlbnROb2RlLnBhcmVudE5vZGUubmV4dFNpYmxpbmcuc3R5bGUuZGlzcGxheSA9ICcnOwotCQkJCXRoaXMuZmlyc3RDaGlsZC5zcmMgPSBzZWxmLmNvbGxhcHNlSW1hZ2U7Ci0JCQkJdGhpcy5maXJzdENoaWxkLmFsdCA9IGNvbnRlbnRQYWdlLnJlcy5jb2xsYXBzZVRleHQ7Ci0JCQkJdGhpcy5maXJzdENoaWxkLnRpdGxlID0gY29udGVudFBhZ2UucmVzLmNvbGxhcHNlVGV4dDsJCQkJCi0JCQl9Ci0JCQlpZiAoZXZ0ICYmIGV2dC5wcmV2ZW50RGVmYXVsdCkgewotCQkJCWV2dC5wcmV2ZW50RGVmYXVsdCgpOwotCQkJfQotCQkJcmV0dXJuIGZhbHNlOwotCQl9OwotCi0JCXRoaXMuc2VjdGlvbkNvbGxhcHNlTGlua3NbaW5kZXhdID0gbGluazsKLQkJc3Bhbi5hcHBlbmRDaGlsZChsaW5rKTsKLQkJZWxlbWVudC5pbnNlcnRCZWZvcmUoc3BhbiwgZWxlbWVudC5maXJzdENoaWxkKTsKLQkJZWxlbWVudC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShTdHJpbmcuZnJvbUNoYXJDb2RlKDE2MCkpKTsKLQkJZWxlbWVudC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShTdHJpbmcuZnJvbUNoYXJDb2RlKDE2MCkpKTsKLSAgICAJCi0JCS8vIEFkZCBhIEJhY2sgVG8gVG9wIGxpbmsgaW4gdGhlIHNlY3Rpb24gaGVhZGluZy4KLQkJdGhpcy5jcmVhdGVCYWNrVG9Ub3BMaW5rKHNpYmxpbmdDb250YWluZXIpOwotCX0KLX07Ci0KLS8vIENyZWF0ZXMgYSBCYWNrIHRvIHRvcCBsaW5rLgotQ29udGVudFBhZ2VTZWN0aW9uLnByb3RvdHlwZS5jcmVhdGVCYWNrVG9Ub3BMaW5rID0gZnVuY3Rpb24oZWxlbWVudCkgewotCXZhciBkaXY7Ci0JCi0JaWYgKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQgJiYgKGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpKSkgewotCQlkaXYuY2xhc3NOYW1lID0gJ2JhY2tUb1RvcExpbmsnOwotCQlkaXYuYWxpZ24gPSAncmlnaHQnOwotCQl2YXIgaW1hZ2UgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbWcnKTsKLQkJaW1hZ2UuYWx0ID0gdGhpcy5iYWNrVG9Ub3BUZXh0OwotCQlpbWFnZS50aXRsZSA9IHRoaXMuYmFja1RvVG9wVGV4dDsKLQkJaW1hZ2Uuc3JjID0gdGhpcy5iYWNrVG9Ub3BJbWFnZTsKLQkJaW1hZ2Uud2lkdGggPSAnMTYnOwotCQlpbWFnZS5oZWlnaHQgPSAnMTYnOwotCQlpbWFnZS5ib3JkZXIgPSAnMCc7Ci0JCWltYWdlLmFsaWduID0gJ2Fic21pZGRsZSc7CQkKLQkJdmFyIGxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7Ci0JCWxpbmsuY2xhc3NOYW1lID0gJ2JhY2tUb1RvcExpbmsnOwotCQlsaW5rLmhyZWYgPSAnIyc7Ci0JCWxpbmsuYXBwZW5kQ2hpbGQoaW1hZ2UpOwotCQl2YXIgc3BhbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTsKLQkJc3Bhbi5jbGFzc05hbWUgPSAnYmFja1RvVG9wTGluayc7Ci0JCXNwYW4uYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUodGhpcy5iYWNrVG9Ub3BUZXh0KSk7CQkKLQkJbGluay5hcHBlbmRDaGlsZChzcGFuKTsKLQkJZGl2LmFwcGVuZENoaWxkKGxpbmspOwotCQllbGVtZW50LmFwcGVuZENoaWxkKGRpdik7Ci0JfQotfTsKLQotCi0vLyBDcmVhdGVzIHRoZSBFeHBhbmQgQWxsIGFuZCBDb2xsYXBzZSBBbGwgU2VjdGlvbnMgbGlua3MuCi1Db250ZW50UGFnZVNlY3Rpb24ucHJvdG90eXBlLmNyZWF0ZUV4cGFuZENvbGxhcHNlQWxsU2VjdGlvbnNMaW5rcyA9IGZ1bmN0aW9uKGZpcnN0RWxlbWVudCkgewotCi0JdmFyIGRpdjsKLQl2YXIgc2VsZiA9IHRoaXM7Ci0JCi0JaWYgKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQgJiYgKGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpKSkgewotCQlkaXYuY2xhc3NOYW1lID0gJ2V4cGFuZENvbGxhcHNlTGluayc7Ci0JCWRpdi5hbGlnbiA9ICdyaWdodCc7Ci0JCXZhciBpbWFnZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2ltZycpOwotCQlpbWFnZS5zcmMgPSB0aGlzLmV4cGFuZEFsbEltYWdlOwotCQlpbWFnZS5hbHQgPSB0aGlzLmV4cGFuZEFsbFRleHQ7Ci0JCWltYWdlLnRpdGxlID0gdGhpcy5leHBhbmRBbGxUZXh0OwotCQlpbWFnZS53aWR0aCA9ICcxNic7Ci0JCWltYWdlLmhlaWdodCA9ICcxNic7Ci0JCWltYWdlLmJvcmRlciA9ICcwJzsKLQkJaW1hZ2UuYWxpZ24gPSAnYWJzbWlkZGxlJzsJCQotCQl2YXIgbGluayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTsKLQkJbGluay5jbGFzc05hbWUgPSAnZXhwYW5kQ29sbGFwc2VMaW5rJzsKLQkJbGluay5ocmVmID0gJyc7Ci0JCWxpbmsuYXBwZW5kQ2hpbGQoaW1hZ2UpOwotCQlsaW5rLm9uY2xpY2sgPSAvKnRoaXMuZXhwYW5kQWxsOyovIGZ1bmN0aW9uKGV2dCkgewotCQkJLyoKLQkJCSBmb3IgKHZhciBpID0gMDsgaSA8IHNlbGYuc2VjdGlvbkNvbGxhcHNlRGl2cy5sZW5ndGg7IGkrKykgewotCQkJIAlzZWxmLnNlY3Rpb25Db2xsYXBzZURpdnNbaV0uc3R5bGUuZGlzcGxheSA9ICcnOwotCQkJIAlzZWxmLnNlY3Rpb25Db2xsYXBzZUxpbmtzW2ldLmZpcnN0Q2hpbGQuc3JjID0gc2VsZi5jb2xsYXBzZUltYWdlOwotCQkJIH0KLQkJCSAqLwotCQkJIHNlbGYuZXhwYW5kQWxsKCk7Ci0JCQkgaWYgKGV2dCAmJiBldnQucHJldmVudERlZmF1bHQpIHsKLQkJCSAJZXZ0LnByZXZlbnREZWZhdWx0KCk7Ci0JCQkgfQotCQkJIHJldHVybiBmYWxzZTsKLQkJfTsKLQkJdmFyIHNwYW4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7Ci0JCXNwYW4uY2xhc3NOYW1lID0gJ2V4cGFuZENvbGxhcHNlVGV4dCc7Ci0JCXNwYW4uYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUodGhpcy5leHBhbmRBbGxUZXh0KSk7Ci0JCWxpbmsuYXBwZW5kQ2hpbGQoc3Bhbik7Ci0JCWRpdi5hcHBlbmRDaGlsZChsaW5rKTsKLQkJZGl2LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKFN0cmluZy5mcm9tQ2hhckNvZGUoMTYwKSkpOwotCQlkaXYuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoU3RyaW5nLmZyb21DaGFyQ29kZSgxNjApKSk7Ci0JCWRpdi5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShTdHJpbmcuZnJvbUNoYXJDb2RlKDE2MCkpKTsKLQkJZGl2LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKFN0cmluZy5mcm9tQ2hhckNvZGUoMTYwKSkpOwkJCQkJCQotCQkKLQkJaW1hZ2UgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbWcnKTsKLQkJaW1hZ2Uuc3JjID0gdGhpcy5jb2xsYXBzZUFsbEltYWdlOwotCQlpbWFnZS5hbHQgPSB0aGlzLmNvbGxhcHNlQWxsVGV4dDsKLQkJaW1hZ2UudGl0bGUgPSB0aGlzLmNvbGxhcHNlQWxsVGV4dDsKLQkJaW1hZ2Uud2lkdGggPSAnMTYnOwotCQlpbWFnZS5oZWlnaHQgPSAnMTYnOwotCQlpbWFnZS5ib3JkZXIgPSAnMCc7Ci0JCWltYWdlLmFsaWduID0gJ2Fic21pZGRsZSc7Ci0JCWxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7Ci0JCWxpbmsuY2xhc3NOYW1lID0gJ2V4cGFuZENvbGxhcHNlTGluayc7Ci0JCWxpbmsuaHJlZiA9ICcjJzsKLQkJbGluay5hcHBlbmRDaGlsZChpbWFnZSk7Ci0JCWxpbmsub25jbGljayA9IC8qdGhpcy5jb2xsYXBzZUFsbDsqL2Z1bmN0aW9uKGV2dCkgewotCQkJLyoKLQkJCWZvciAodmFyIGkgPSAwOyBpIDwgc2VsZi5zZWN0aW9uQ29sbGFwc2VEaXZzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJc2VsZi5zZWN0aW9uQ29sbGFwc2VEaXZzW2ldLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7Ci0JCQkJc2VsZi5zZWN0aW9uQ29sbGFwc2VMaW5rc1tpXS5maXJzdENoaWxkLnNyYyA9IHNlbGYuZXhwYW5kSW1hZ2U7Ci0JCQl9Ci0JCQkqLwotCQkJc2VsZi5jb2xsYXBzZUFsbCgpOwotCQkJCi0JCQlpZiAoZXZ0ICYmIGV2dC5wcmV2ZW50RGVmYXVsdCkgewotCQkJCWV2dC5wcmV2ZW50RGVmYXVsdCgpOwotCQkJfQotCQkJcmV0dXJuIGZhbHNlOwotCQl9OwotCQlzcGFuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpOwotCQlzcGFuLmNsYXNzTmFtZSA9ICdleHBhbmRDb2xsYXBzZVRleHQnOwotCQlzcGFuLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKHRoaXMuY29sbGFwc2VBbGxUZXh0KSk7CQkJCQotCQlsaW5rLmFwcGVuZENoaWxkKHNwYW4pOwotCQlkaXYuYXBwZW5kQ2hpbGQobGluayk7Ci0JCQotCQkvKgotCQl2YXIgb3ZlcnZpZXdTZXBhcmF0b3IgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgib3ZlcnZpZXdTZXBhcmF0b3IiKTsKLQkJb3ZlcnZpZXdTZXBhcmF0b3IucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZGl2LCBvdmVydmlld1NlcGFyYXRvcik7Ci0JCSovCi0JCWlmICh0aGlzLmZpcnN0U2VjdGlvbiAhPSBudWxsKSB7Ci0JCQl0aGlzLmZpcnN0U2VjdGlvbi5wYXJlbnROb2RlLmluc2VydEJlZm9yZShkaXYsIHRoaXMuZmlyc3RTZWN0aW9uKTsKLQkJfQotCQkKLQkJaWYgKCBjb250ZW50UGFnZS5nZXRBcHAoKSAhPSBudWxsICkgewotCQkJZGl2LnN0eWxlLmRpc3BsYXkgPSAibm9uZSI7Ci0JCX0KLQl9OwotCQotCUNvbnRlbnRQYWdlU2VjdGlvbi5wcm90b3R5cGUuZXhwYW5kQWxsID0gZnVuY3Rpb24oKSB7Ci0JCQlmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuc2VjdGlvbkNvbGxhcHNlRGl2cy5sZW5ndGg7IGkrKykgewotCQkJIAl0aGlzLnNlY3Rpb25Db2xsYXBzZURpdnNbaV0uc3R5bGUuZGlzcGxheSA9ICcnOwotCQkJIAl0aGlzLnNlY3Rpb25Db2xsYXBzZUxpbmtzW2ldLmZpcnN0Q2hpbGQuc3JjID0gdGhpcy5jb2xsYXBzZUltYWdlOwotCQkJIH0KLQl9OwotCQotCUNvbnRlbnRQYWdlU2VjdGlvbi5wcm90b3R5cGUuY29sbGFwc2VBbGwgPSBmdW5jdGlvbigpIHsKLQkJCWZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5zZWN0aW9uQ29sbGFwc2VEaXZzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJdGhpcy5zZWN0aW9uQ29sbGFwc2VEaXZzW2ldLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7Ci0JCQkJdGhpcy5zZWN0aW9uQ29sbGFwc2VMaW5rc1tpXS5maXJzdENoaWxkLnNyYyA9IHRoaXMuZXhwYW5kSW1hZ2U7Ci0JCQl9Ci0JfTsKLX07Ci0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9zY3JpcHRzL0NvbnRlbnRQYWdlU3ViU2VjdGlvbi5qcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9zY3JpcHRzL0NvbnRlbnRQYWdlU3ViU2VjdGlvbi5qcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGI2OTBlMS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvc2NyaXB0cy9Db250ZW50UGFnZVN1YlNlY3Rpb24uanMKKysrIC9kZXYvbnVsbApAQCAtMSwyNTAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLyAKLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vIENocmlzIEFsZGVydG9uLCBJQk0gU29mdHdhcmUgU2VydmljZXMgQXVzdHJhbGlhLCBNYXJjaCAyMDA4Ci0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0vLyBkZWZpbmUgdGhlIGNsYXNzIGhlcmUgc28gd2UgZG9uJ3QgbmVlZCB0byBsb2FkIHRoZSBkZXRhaWwgaW1wbGVtZW50YXRpb25zIAotQ29udGVudFBhZ2VTdWJTZWN0aW9uID0gZnVuY3Rpb24oKSB7Ci0KLQl0aGlzLnBhcmVudCA9IGNvbnRlbnRQYWdlOwotCS8vIGJ5IGRlZmF1bHQsIHdlIHJldXNlIHRoZSBpbWFnZXMgZnJvbSBzZWN0aW9uCi0JdGhpcy5leHBhbmRJbWFnZSA9IHRoaXMucGFyZW50LnNlY3Rpb24uZXhwYW5kSW1hZ2U7CQkKLQl0aGlzLmNvbGxhcHNlSW1hZ2UgPSB0aGlzLnBhcmVudC5zZWN0aW9uLmNvbGxhcHNlSW1hZ2U7Ci0JdGhpcy5leHBhbmRBbGxJbWFnZSA9IHRoaXMucGFyZW50LnNlY3Rpb24uZXhwYW5kQWxsSW1hZ2U7CQotCXRoaXMuY29sbGFwc2VBbGxJbWFnZSA9IHRoaXMucGFyZW50LnNlY3Rpb24uY29sbGFwc2VBbGxJbWFnZTsKLQotCXRoaXMuaW5kZW50SW1hZ2UgPSB0aGlzLnBhcmVudC5zZWN0aW9uLnNoaW1JbWFnZTsJCS8vIGFkZGVkIGJ5IENocmlzIEFsZGVydG9uCi0KLQkvLyBhbmQgdXNlIHRoZSBkZWZhdWx0IHRlc3QsIG92ZXJyaWRlIHRoaXMgYXMgbmVlZGVkCi0JdGhpcy5leHBhbmRBbGxUZXh0ID0gY29udGVudFBhZ2UucmVzLmV4cGFuZEFsbFN1YlNlY3Rpb25zVGV4dDsKLQl0aGlzLmNvbGxhcHNlQWxsVGV4dCA9IGNvbnRlbnRQYWdlLnJlcy5jb2xsYXBzZUFsbFN1YlNlY3Rpb25zVGV4dDsJCi0KLQkvLyBlbnN1cmVzIHRoYXQgc3RlcHMgYXJlIGV4cGFuZGVkIG9uIGRpc3BsYXkKLQl0aGlzLmNvbGxhcHNlU3RlcHNCeURlZmF1bHQgPSB0cnVlOwotCXRoaXMuZmlyc3RTdGVwU2VjdGlvbiA9IG51bGw7Ci0KLQl0aGlzLnN0ZXBDb2xsYXBzZURpdnMgPSBudWxsOwotCXRoaXMuc3RlcENvbGxhcHNlTGlua3MgPSBudWxsOwotCQkKLX07Ci0KLS8vIENyZWF0ZXMgdGhlIGNvbGxhcHNpYmxlIHN0ZXAgc2VjdGlvbiBsaW5rcy4KLUNvbnRlbnRQYWdlU3ViU2VjdGlvbi5wcm90b3R5cGUuY3JlYXRlU3RlcExpbmtzID0gZnVuY3Rpb24odGFnTmFtZSwgY2xhc3NTZWxlY3RvcikgewotCQotCWlmIChkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSkgewotCQl2YXIgZWxlbWVudHMgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSh0YWdOYW1lKTsKLQkJaWYgKGVsZW1lbnRzLmxlbmd0aCA9PSAwKSByZXR1cm47Ci0JCXZhciBzdGVwRWxlbWVudHMgPSBuZXcgQXJyYXkoZWxlbWVudHMubGVuZ3RoKTsKLQotCQl2YXIgZXhpc3RTdGVwQ29udGVudHMgPSBuZXcgQXJyYXkoZWxlbWVudHMubGVuZ3RoKTsJLy8gYWRkZWQgYnkgQ2hyaXMgQWxkZXJ0b24KLQkJdmFyIHRvdGFsTGlua3MgPSAwOwotCQl2YXIgaywgbCwgbTsKLQkJZm9yICh2YXIgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykgewotCQkJdmFyIGVsZW1lbnQgPSBlbGVtZW50c1tpXTsKLQkJCWlmIChlbGVtZW50LmNsYXNzTmFtZSA9PSBjbGFzc1NlbGVjdG9yKSB7Ci0JCQkJCi0JCQkJaz10b3RhbExpbmtzOwkJCQkvLyBhZGRlZCBieSBDaHJpcyBBbGRlcnRvbgotCi0JCQkJc3RlcEVsZW1lbnRzW3RvdGFsTGlua3MrK10gPSBlbGVtZW50OwotCQkJfQotCQkJLy8gbG9va2luZyBmb3IgZW1wdHkgc3RlcHMKLQkJCWlmKGVsZW1lbnQuY2xhc3NOYW1lID09ICJzdGVwQ29udGVudCIpIHsKLQkJCQl2YXIgZXhpc3QgPSBmYWxzZTsKLQkJCQl2YXIgbmV4dEluZGV4OwotCQkJCWRvIHsKLQkJCQkJbCA9IGVsZW1lbnQuaW5uZXJIVE1MLnRvVXBwZXJDYXNlKCkuaW5kZXhPZigiPFREPiIpKzQ7Ci0JCQkJCW0gPSBlbGVtZW50LmlubmVySFRNTC50b1VwcGVyQ2FzZSgpLmluZGV4T2YoIjwvVEQ+Iik7Ci0JCQkJCWlmIChlbGVtZW50LmlubmVySFRNTC5zdWJzdHIobCxtLWwpIT0nJz90cnVlOmZhbHNlKQotCQkJCQl7Ci0JCQkJCQlleGlzdCA9IHRydWU7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCQluZXh0SW5kZXggPSBlbGVtZW50LmlubmVySFRNTC50b1VwcGVyQ2FzZSgpLmluZGV4T2YoIjxURD4iLGwpOwotCQkJCX13aGlsZSAobmV4dEluZGV4Pi0xKTsKLQkJCQlleGlzdFN0ZXBDb250ZW50c1trXSA9IGV4aXN0OwotCQkJfQotCQl9Ci0JCWlmICh0b3RhbExpbmtzID09IDApIHJldHVybjsKLQkJc3RlcEVsZW1lbnRzLmxlbmd0aCA9IHRvdGFsTGlua3M7Ci0JCXRoaXMuc3RlcENvbGxhcHNlRGl2cyA9IG5ldyBBcnJheSh0b3RhbExpbmtzKTsKLQkJdGhpcy5zdGVwQ29sbGFwc2VMaW5rcyA9IG5ldyBBcnJheSh0b3RhbExpbmtzKTsKLQkJdGhpcy5maXJzdFN0ZXBTZWN0aW9uID0gc3RlcEVsZW1lbnRzWzBdOwotCQlmb3IgKHZhciBpID0gMDsgaSA8IHN0ZXBFbGVtZW50cy5sZW5ndGg7IGkrKykgewotCQkJdmFyIGVsZW1lbnQgPSBzdGVwRWxlbWVudHNbaV07Ci0JCQl2YXIgc2libGluZ0NvbnRhaW5lcjsKLQkJCWlmIChkb2N1bWVudC5jcmVhdGVFbGVtZW50ICYmIChzaWJsaW5nQ29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JykpICYmIHNpYmxpbmdDb250YWluZXIuc3R5bGUpIHsKLQkJCQl2YXIgbmV4dFNpYmxpbmcgPSBlbGVtZW50Lm5leHRTaWJsaW5nOwotCQkJCWVsZW1lbnQucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoc2libGluZ0NvbnRhaW5lciwgbmV4dFNpYmxpbmcpOwotCQkJCXZhciBuZXh0RWxlbWVudCA9IHN0ZXBFbGVtZW50c1tpICsgMV07Ci0JCQkJd2hpbGUgKG5leHRTaWJsaW5nICE9IG5leHRFbGVtZW50ICYmIG5leHRTaWJsaW5nICE9IG51bGwpIHsKLQkJCQkJdmFyIHRvTW92ZSA9IG5leHRTaWJsaW5nOwotCQkJCQluZXh0U2libGluZyA9IG5leHRTaWJsaW5nLm5leHRTaWJsaW5nOwotCQkJCQlzaWJsaW5nQ29udGFpbmVyLmFwcGVuZENoaWxkKHRvTW92ZSk7Ci0JCQkJfQotCQkJCWlmICh0aGlzLmNvbGxhcHNlU3RlcHNCeURlZmF1bHQpIHsKLSAgICAJCQkJc2libGluZ0NvbnRhaW5lci5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOwotICAgIAkJCX0KLSAgICAJCQl0aGlzLnN0ZXBDb2xsYXBzZURpdnNbaV0gPSBzaWJsaW5nQ29udGFpbmVyOwotCQkJCS8vIGV4dHJhIHBhcmFtZXRlciBhZGRlZCAtIGV4aXN0U3RlcENvbnRlbnRzW2ldCi0gICAgCQkJdGhpcy5jcmVhdGVDb2xsYXBzaWJsZVN0ZXBTZWN0aW9uKGVsZW1lbnQsIHNpYmxpbmdDb250YWluZXIsIGksIGV4aXN0U3RlcENvbnRlbnRzW2ldKTsKLQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCXRoaXMuY3JlYXRlRXhwYW5kQ29sbGFwc2VBbGxTdGVwc0xpbmtzKHN0ZXBFbGVtZW50c1swXSk7Ci0JfQotfTsKLQotLy8gQ3JlYXRlcyBhIGNvbGxhcHNpYmxlIHN0ZXAgc2VjdGlvbi4KLS8vIGV4dHJhIHBhcmFtZXRlciBhZGRlZCAtIGNvbnRlbnQKLUNvbnRlbnRQYWdlU3ViU2VjdGlvbi5wcm90b3R5cGUuY3JlYXRlQ29sbGFwc2libGVTdGVwU2VjdGlvbiA9IGZ1bmN0aW9uKGVsZW1lbnQsIHNpYmxpbmdDb250YWluZXIsIGluZGV4LCBleGlzdENvbnRlbnQpIHsKLQotCWlmIChkb2N1bWVudC5jcmVhdGVFbGVtZW50KSB7Ci0JCXZhciBzcGFuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpOwotCQlpZihleGlzdENvbnRlbnQpIHsKLQkJCXZhciBsaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpOwotCQkJbGluay5jb2xsYXBzZURpdiA9IHNpYmxpbmdDb250YWluZXI7Ci0JCQlsaW5rLmhyZWYgPSAnJzsKLQkJCXZhciBpbWFnZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2ltZycpOwotCQkJaWYgKHRoaXMuY29sbGFwc2VTdGVwc0J5RGVmYXVsdCkgewotCQkJCWltYWdlLnNyYyA9IHRoaXMuZXhwYW5kSW1hZ2U7Ci0JCQkJaW1hZ2UuYWx0ID0gY29udGVudFBhZ2UucmVzLmV4cGFuZFRleHQ7Ci0JCQkJaW1hZ2UudGl0bGUgPSBjb250ZW50UGFnZS5yZXMuZXhwYW5kVGV4dDsJCi0JCQl9Ci0JCQllbHNlIHsKLQkJCQlpbWFnZS5zcmMgPSB0aGlzLmNvbGxhcHNlSW1hZ2U7Ci0JCQkJaW1hZ2UuYWx0ID0gY29udGVudFBhZ2UucmVzLmNvbGxhcHNlVGV4dDsKLQkJCQlpbWFnZS50aXRsZSA9IGNvbnRlbnRQYWdlLnJlcy5jb2xsYXBzZVRleHQ7CQotCQkJfQotCQkJaW1hZ2Uud2lkdGggPSAnMTcnOwotCQkJaW1hZ2UuaGVpZ2h0ID0gJzE1JzsKLQkJCWltYWdlLmJvcmRlciA9ICcwJzsKLQkJCWltYWdlLmFsaWduID0gJ2Fic21pZGRsZSc7Ci0JCQlsaW5rLmFwcGVuZENoaWxkKGltYWdlKTsKLQkJCi0JCQl2YXIgc2VsZiA9IHRoaXM7Ci0JCQlsaW5rLm9uY2xpY2sgPSAvKnRoaXMuZXhwYW5kQ29sbGFwc2VTdGVwU2VjdGlvbjsqL2Z1bmN0aW9uKGV2dCkgewotCQkJCWlmICh0aGlzLmNvbGxhcHNlRGl2LnN0eWxlLmRpc3BsYXkgPT0gJycpIHsKLQkJCQkJdGhpcy5wYXJlbnROb2RlLnBhcmVudE5vZGUubmV4dFNpYmxpbmcuc3R5bGUuZGlzcGxheSA9ICdub25lJzsKLQkJCQkJdGhpcy5maXJzdENoaWxkLnNyYyA9IHNlbGYuZXhwYW5kSW1hZ2U7Ci0JCQkJCXRoaXMuZmlyc3RDaGlsZC5hbHQgPSBjb250ZW50UGFnZS5yZXMuZXhwYW5kVGV4dDsKLQkJCQkJdGhpcy5maXJzdENoaWxkLnRpdGxlID0gY29udGVudFBhZ2UucmVzLmV4cGFuZFRleHQ7CQotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJdGhpcy5wYXJlbnROb2RlLnBhcmVudE5vZGUubmV4dFNpYmxpbmcuc3R5bGUuZGlzcGxheSA9ICcnOwotCQkJCQl0aGlzLmZpcnN0Q2hpbGQuc3JjID0gc2VsZi5jb2xsYXBzZUltYWdlOwotCQkJCQl0aGlzLmZpcnN0Q2hpbGQuYWx0ID0gY29udGVudFBhZ2UucmVzLmNvbGxhcHNlVGV4dDsKLQkJCQkJdGhpcy5maXJzdENoaWxkLnRpdGxlID0gY29udGVudFBhZ2UucmVzLmNvbGxhcHNlVGV4dDsJCQkJCQotCQkJCX0KLQkJCQlpZiAoZXZ0ICYmIGV2dC5wcmV2ZW50RGVmYXVsdCkgewotCQkJCQlldnQucHJldmVudERlZmF1bHQoKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfTsKLQkgICAgfQotCSAgICBlbHNlIHsvLyByZW1vdmVzIGV4cGFuZC9jb2xsYXBzZSBidXR0b24gd2hlcmUgc3RlcCBoYXMgbm90IGNvbnRlbnQKLQkJCXZhciBsaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpOwotCQkJdmFyIGltYWdlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW1nJyk7Ci0JCQlpbWFnZS5zcmMgPSB0aGlzLmluZGVudEltYWdlOwotCQkJaW1hZ2UuYWx0ID0gJyc7Ci0JCQlpbWFnZS50aXRsZSA9ICcnOwotCQkJaW1hZ2Uud2lkdGggPSAnMTcnOwotCQkJaW1hZ2UuaGVpZ2h0ID0gJzE1JzsKLQkJCWltYWdlLmJvcmRlciA9ICcwJzsKLQkJCWltYWdlLmFsaWduID0gJ2Fic21pZGRsZSc7Ci0JCQlsaW5rLmFwcGVuZENoaWxkKGltYWdlKTsKLQkgICAgfQotCSAgICB0aGlzLnN0ZXBDb2xsYXBzZUxpbmtzW2luZGV4XSA9IGxpbms7Ci0JICAgIHNwYW4uYXBwZW5kQ2hpbGQobGluayk7Ci0JICAgIGVsZW1lbnQuaW5zZXJ0QmVmb3JlKHNwYW4sIGVsZW1lbnQuZmlyc3RDaGlsZCk7Ci0JICAgIGVsZW1lbnQuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoU3RyaW5nLmZyb21DaGFyQ29kZSgxNjApKSk7Ci0JICAgIGVsZW1lbnQuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoU3RyaW5nLmZyb21DaGFyQ29kZSgxNjApKSk7Ci0JfQotfTsKLQotCQkJCQkKLS8vIENyZWF0ZXMgdGhlIEV4cGFuZCBBbGwgYW5kIENvbGxhcHNlIEFsbCBTdGVwcyBsaW5rcy4KLUNvbnRlbnRQYWdlU3ViU2VjdGlvbi5wcm90b3R5cGUuY3JlYXRlRXhwYW5kQ29sbGFwc2VBbGxTdGVwc0xpbmtzID0gZnVuY3Rpb24oZmlyc3RFbGVtZW50KSB7Ci0JdmFyIGRpdjsKLQl2YXIgc2VsZiA9IHRoaXM7Ci0JCi0JaWYgKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQgJiYgKGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpKSkgewotCQlkaXYuY2xhc3NOYW1lID0gJ2V4cGFuZENvbGxhcHNlTGluayc7Ci0JCWRpdi5hbGlnbiA9ICdyaWdodCc7CQkKLQkJdmFyIGltYWdlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW1nJyk7Ci0JCWltYWdlLnNyYyA9IHRoaXMuZXhwYW5kQWxsSW1hZ2U7Ci0JCWltYWdlLmFsdCA9IHRoaXMuZXhwYW5kQWxsVGV4dAotCQlpbWFnZS50aXRsZSA9IHRoaXMuZXhwYW5kQWxsVGV4dAotCQlpbWFnZS53aWR0aCA9ICcxNic7Ci0JCWltYWdlLmhlaWdodCA9ICcxNic7Ci0JCWltYWdlLmJvcmRlciA9ICcwJzsKLQkJaW1hZ2UuYWxpZ24gPSAnYWJzbWlkZGxlJzsKLQkJdmFyIGxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7Ci0JCWxpbmsuY2xhc3NOYW1lID0gJ2V4cGFuZENvbGxhcHNlTGluayc7Ci0JCWxpbmsuaHJlZiA9ICcnOwotCQlsaW5rLmFwcGVuZENoaWxkKGltYWdlKTsKLQkJbGluay5vbmNsaWNrID0gLyp0aGlzLmV4cGFuZEFsbFN0ZXBzOyovZnVuY3Rpb24oZXZ0KSB7Ci0JCQkgZm9yICh2YXIgaSA9IDA7IGkgPCBzZWxmLnN0ZXBDb2xsYXBzZURpdnMubGVuZ3RoOyBpKyspIHsKLQkJCSAJc2VsZi5zdGVwQ29sbGFwc2VEaXZzW2ldLnN0eWxlLmRpc3BsYXkgPSAnJzsKLQkJCQkJLy9zdG9wcyBjb2xsYXBzZSBidXR0b24gYmVpbmcgYWRkZWQgd2hlcmUgc3RlcCBoYXMgbm8gY29udGVudCBleHBhbmRBbGwgYnV0dG9uIGlzIGNsaWNrZWQKLQkJCSAgICAgCWlmIChzZWxmLnN0ZXBDb2xsYXBzZUxpbmtzW2ldLmZpcnN0Q2hpbGQudGl0bGUgIT0gJycpIHsKLQkJCQkJc2VsZi5zdGVwQ29sbGFwc2VMaW5rc1tpXS5maXJzdENoaWxkLnNyYyA9IHNlbGYuY29sbGFwc2VJbWFnZTsKLQkJCSAgICAgCX0KLQkJCSB9Ci0JCQkgaWYgKGV2dCAmJiBldnQucHJldmVudERlZmF1bHQpIHsKLQkJCSAJZXZ0LnByZXZlbnREZWZhdWx0KCk7Ci0JCQkgfQotCQkJIHJldHVybiBmYWxzZTsKLQkJfTsKLQkJdmFyIHNwYW4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7Ci0JCXNwYW4uY2xhc3NOYW1lID0gJ2V4cGFuZENvbGxhcHNlVGV4dCc7Ci0JCXNwYW4uYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUodGhpcy5leHBhbmRBbGxUZXh0KSk7Ci0JCWxpbmsuYXBwZW5kQ2hpbGQoc3Bhbik7Ci0JCWRpdi5hcHBlbmRDaGlsZChsaW5rKTsKLQkJZGl2LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKFN0cmluZy5mcm9tQ2hhckNvZGUoMTYwKSkpOwotCQkKLQkJaW1hZ2UgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbWcnKTsKLQkJaW1hZ2Uuc3JjID0gdGhpcy5jb2xsYXBzZUFsbEltYWdlOwotCQlpbWFnZS5hbHQgPSB0aGlzLmNvbGxhcHNlQWxsVGV4dAotCQlpbWFnZS50aXRsZSA9IHRoaXMuY29sbGFwc2VBbGxUZXh0Ci0JCWltYWdlLndpZHRoID0gJzE2JzsKLQkJaW1hZ2UuaGVpZ2h0ID0gJzE2JzsKLQkJaW1hZ2UuYm9yZGVyID0gJzAnOwotCQlpbWFnZS5hbGlnbiA9ICdhYnNtaWRkbGUnOwotCQlsaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpOwotCQlsaW5rLmNsYXNzTmFtZSA9ICdleHBhbmRDb2xsYXBzZUxpbmsnOwotCQlsaW5rLmhyZWYgPSAnJzsKLQkJbGluay5hcHBlbmRDaGlsZChpbWFnZSk7Ci0JCWxpbmsub25jbGljayA9IC8qdGhpcy5jb2xsYXBzZUFsbFN0ZXBzOyovZnVuY3Rpb24oZXZ0KSB7Ci0JCQlmb3IgKHZhciBpID0gMDsgaSA8IHNlbGYuc3RlcENvbGxhcHNlRGl2cy5sZW5ndGg7IGkrKykgewotCQkJCXNlbGYuc3RlcENvbGxhcHNlRGl2c1tpXS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOwotCQkJCS8vc3RvcHMgZXhwYW5kIGJ1dHRvbiBiZWluZyBhZGRlZCB3aGVyZSBzdGVwIGhhcyBubyBjb250ZW50IHdoZW4gY29sbGFwc2VBbGwgYnV0dG9uIGlzIGNsaWNrZWQKLQkJCQlpZiAoc2VsZi5zdGVwQ29sbGFwc2VMaW5rc1tpXS5maXJzdENoaWxkLnRpdGxlICE9ICcnKSB7Ci0JCQkJCXNlbGYuc3RlcENvbGxhcHNlTGlua3NbaV0uZmlyc3RDaGlsZC5zcmMgPSBzZWxmLmV4cGFuZEltYWdlOwotCQkJCX0KLQkJCX0KLQkJCWlmIChldnQgJiYgZXZ0LnByZXZlbnREZWZhdWx0KSB7Ci0JCQkJZXZ0LnByZXZlbnREZWZhdWx0KCk7Ci0JCQl9Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX07Ci0JCXNwYW4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7Ci0JCXNwYW4uY2xhc3NOYW1lID0gJ2V4cGFuZENvbGxhcHNlVGV4dCc7Ci0JCXNwYW4uYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUodGhpcy5jb2xsYXBzZUFsbFRleHQpKTsKLQkJbGluay5hcHBlbmRDaGlsZChzcGFuKTsKLQkJZGl2LmFwcGVuZENoaWxkKGxpbmspOwotCQkKLQkJaWYgKHRoaXMuZmlyc3RTdGVwU2VjdGlvbikgewotCQkJdGhpcy5maXJzdFN0ZXBTZWN0aW9uLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGRpdiwgdGhpcy5maXJzdFN0ZXBTZWN0aW9uKTsKLQkJfQotCX0KLX07ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L3NjcmlwdHMvQ29udGVudFBhZ2VUb29sYmFyLmpzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L3NjcmlwdHMvQ29udGVudFBhZ2VUb29sYmFyLmpzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZTE0N2U3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9zY3JpcHRzL0NvbnRlbnRQYWdlVG9vbGJhci5qcworKysgL2Rldi9udWxsCkBAIC0xLDE2OSArMCwwIEBACi1Db250ZW50UGFnZVRvb2xiYXIgPSBmdW5jdGlvbigpewotCi10aGlzLmV4cGFuZEFsbEltYWdlID0gbnVsbDsKLXRoaXMuY29sbGFwc2VBbGxJbWFnZSA9IG51bGw7Ci10aGlzLmJvb2ttYXJrSW1hZ2UgPSBudWxsOwotdGhpcy5wcmludEltYWdlID0gbnVsbDsKLXRoaXMuYmFja0ltYWdlID0gbnVsbDsKLXRoaXMuZm9yd2FyZEltYWdlID0gbnVsbDsKLXRoaXMuZGl2aWRlckltYWdlID0gbnVsbDsKLQotLy8gaG9sZCB0aGUgdG9vbGJhciBpdGVtIGlkcwotdGhpcy50b29sYmFySXRlbXMgPSBbXTsKLQotdGhpcy5iYXJJdGVtSWRQcmVmaXggPSAiY29udGVudGJhcl8iOwotCi19Ci0KLUNvbnRlbnRQYWdlVG9vbGJhci5wcm90b3R5cGUuaW5pdCA9IGZ1bmN0aW9uKGltZ1BhdGgpIHsKLQotCXRoaXMuZXhwYW5kQWxsSW1hZ2UgPSBjb250ZW50UGFnZS5yZXNvbHZlVXJsKGltZ1BhdGggKyAnZXhwYW5kX2FsbC5naWYnKTsJCi0JdGhpcy5jb2xsYXBzZUFsbEltYWdlID0gY29udGVudFBhZ2UucmVzb2x2ZVVybChpbWdQYXRoICsgJ2NvbGxhcHNlX2FsbC5naWYnKTsKLQl0aGlzLmJvb2ttYXJrSW1hZ2UgPSBjb250ZW50UGFnZS5yZXNvbHZlVXJsKGltZ1BhdGggKyAnYm9va21hcmsuZ2lmJyk7Ci0JdGhpcy5wcmludEltYWdlID0gY29udGVudFBhZ2UucmVzb2x2ZVVybChpbWdQYXRoICsgJ3ByaW50LmdpZicpOwotCXRoaXMuYmFja0ltYWdlID0gY29udGVudFBhZ2UucmVzb2x2ZVVybChpbWdQYXRoICsgJ2JhY2suZ2lmJyk7Ci0JdGhpcy5mb3J3YXJkSW1hZ2UgPSBjb250ZW50UGFnZS5yZXNvbHZlVXJsKGltZ1BhdGggKyAnZm9yd2FyZC5naWYnKTsKLQl0aGlzLmRpdmlkZXJJbWFnZSA9IGNvbnRlbnRQYWdlLnJlc29sdmVVcmwoaW1nUGF0aCArICdkaXZpZGVyLmdpZicpOwotCS8vdGhpcy5zaGltSW1hZ2UgPSBjb250ZW50UGFnZS5yZXNvbHZlVXJsKGltZ1BhdGggKyAnc2hpbS5naWYnKTsKLQkKLQl0aGlzLl9jcmVhdGVUb29sYmFyKCk7Ci19OwotCi1Db250ZW50UGFnZVRvb2xiYXIucHJvdG90eXBlLl9jcmVhdGVUb29sYmFyID0gZnVuY3Rpb24oKSB7Ci0JdmFyIGNvbnRhaW5lciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjb250ZW50UGFnZVRvb2xiYXIiKTsKLQkJCi0JaWYgKCBjb250YWluZXIgPT0gbnVsbCApIHsKLQkJcmV0dXJuOwotCX0KLQkKLQl2YXIgaHRtbCA9IFsiPHRhYmxlIGJvcmRlcj0nMCcgY2VsbHNwYWNpbmc9JzAnIGNlbGxwYWRkaW5nPScwJyA+IiwgIjx0cj4iXTsKLQkJCi0JCS8vIGxvY2FsIGZpbGUgY2FuJ3QgYmUgYWRkZWQgYXMgYm9va21hcmsKLQkJaWYgKCAhY29udGVudFBhZ2UuaXNGaWxlVXJsKGxvY2F0aW9uLmhyZWYpICkgewotCQkJaHRtbCA9IGh0bWwuY29uY2F0KHRoaXMuX2dldFRvb2xiYXJJdGVtSHRtbCh0aGlzLmJvb2ttYXJrSW1hZ2UsIGNvbnRlbnRQYWdlLnJlcy50b29sYmFyX2Jvb2ttYXJrKSk7Ci0JCX0KLQkJCi0JCWh0bWwgPSBodG1sLmNvbmNhdCh0aGlzLl9nZXRUb29sYmFySXRlbUh0bWwodGhpcy5iYWNrSW1hZ2UsIGNvbnRlbnRQYWdlLnJlcy50b29sYmFyX2JhY2spKTsKLQkJaHRtbCA9IGh0bWwuY29uY2F0KHRoaXMuX2dldFRvb2xiYXJJdGVtSHRtbCh0aGlzLmZvcndhcmRJbWFnZSwgY29udGVudFBhZ2UucmVzLnRvb2xiYXJfZm9yd2FyZCkpOwotCQlodG1sID0gaHRtbC5jb25jYXQodGhpcy5fZ2V0VG9vbGJhckl0ZW1IdG1sKHRoaXMuZXhwYW5kQWxsSW1hZ2UgLCBjb250ZW50UGFnZS5yZXMudG9vbGJhcl9leHBhbmRfYWxsKSk7Ci0JCWh0bWwgPSBodG1sLmNvbmNhdCh0aGlzLl9nZXRUb29sYmFySXRlbUh0bWwodGhpcy5jb2xsYXBzZUFsbEltYWdlLCBjb250ZW50UGFnZS5yZXMudG9vbGJhcl9jb2xsYXBzZV9hbGwpKTsKLQkJaHRtbCA9IGh0bWwuY29uY2F0KFsiPHRkIHdpZHRoPScxMHB4Jz48aW1nIGFsdD0nJyBzcmM9JyIsIHRoaXMuZGl2aWRlckltYWdlLCAiJyB0aXRsZT0nJy8+PC90ZD4iXSk7Ci0JCWh0bWwgPSBodG1sLmNvbmNhdCh0aGlzLl9nZXRUb29sYmFySXRlbUh0bWwodGhpcy5wcmludEltYWdlLCBjb250ZW50UGFnZS5yZXMudG9vbGJhcl9wcmludCkpOwotCQlodG1sID0gaHRtbC5jb25jYXQoWyI8L3RyPiIsICI8L3RhYmxlPiJdKTsKLQkJCi0JY29udGFpbmVyLmlubmVySFRNTCA9IGh0bWwuam9pbigiIik7Ci0KLQkvLyBhdHRhY2ggZXZlbnRzCi0JZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnRvb2xiYXJJdGVtcy5sZW5ndGg7IGkrKyApIHsKLQkJdmFyIGlkID0gdGhpcy50b29sYmFySXRlbXNbaV07Ci0JCXZhciBiYXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCk7Ci0JCS8vYWxlcnQoYmFyLnRhZ05hbWUpOwotCQkKLQkJLy8gbm90ZTogYWxsIGhhbmRsZXIgZnVuY3Rpb25zIHNob3VsZCByZXR1cm4gZmFsc2UgdG8gYXZvaWQgdGhlIHVybCBhY3Rpb24KLQkJdmFyIGhhbmRsZXIgPSBudWxsOwotCQlpZiAoIGlkLmluZGV4T2YodGhpcy5ib29rbWFya0ltYWdlKSA+PSAwICkgewotCQkJaGFuZGxlciA9ICBmdW5jdGlvbigpIHsgCi0JCQkJY29udGVudFBhZ2Uuc2F2ZUFzQm9va21hcmsoKTsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9OwotCQl9IGVsc2UgaWYgKCBpZC5pbmRleE9mKHRoaXMuYmFja0ltYWdlKSA+PSAwICkgewotCQkJaGFuZGxlciA9ICBmdW5jdGlvbigpIHsgCi0JCQkJLy9hbGVydCgiYmFjayIpOwotCQkJCXZhciBhcHAgPSBjb250ZW50UGFnZS5nZXRBcHAoKTsKLQkJCQlpZiAoIGFwcCAhPSBudWxsICkgewotCQkJCQlhcHAuYnJvd3Nlci5iYWNrKCk7Ci0JCQkJfQotCQkJCXJldHVybiBmYWxzZTsKLQkJCX07Ci0JCX0gZWxzZSBpZiAoIGlkLmluZGV4T2YodGhpcy5mb3J3YXJkSW1hZ2UpID49IDAgKSB7Ci0JCQloYW5kbGVyID0gIGZ1bmN0aW9uKCkgeyAKLQkJCQl2YXIgYXBwID0gY29udGVudFBhZ2UuZ2V0QXBwKCk7Ci0JCQkJaWYgKCBhcHAgIT0gbnVsbCApIHsKLQkJCQkJYXBwLmJyb3dzZXIuZm9yd2FyZCgpOwotCQkJCX0KLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9OwotCQl9IGVsc2UgaWYgKCBpZC5pbmRleE9mKHRoaXMuZXhwYW5kQWxsSW1hZ2UpID49IDAgKSB7Ci0JCQloYW5kbGVyID0gIGZ1bmN0aW9uKCkgeyAKLQkJCQljb250ZW50UGFnZS5zZWN0aW9uLmV4cGFuZEFsbCgpOwotCQkJCXJldHVybiBmYWxzZTsKLQkJCX07Ci0JCX0gZWxzZSBpZiAoIGlkLmluZGV4T2YodGhpcy5jb2xsYXBzZUFsbEltYWdlKSA+PSAwICkgewotCQkJaGFuZGxlciA9ICBmdW5jdGlvbigpIHsgCi0JCQkJY29udGVudFBhZ2Uuc2VjdGlvbi5jb2xsYXBzZUFsbCgpOwotCQkJCXJldHVybiBmYWxzZTsKLQkJCX07Ci0JCX0gZWxzZSBpZiAoIGlkLmluZGV4T2YodGhpcy5wcmludEltYWdlKSA+PSAwICkgewotCQkJaGFuZGxlciA9ICBmdW5jdGlvbigpIHsgCi0JCQkJd2luZG93LnByaW50KCk7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfTsKLQkJfSAKLQkJCi0JCWlmICggaGFuZGxlciAhPSBudWxsICkgewotCQkJYmFyLm9uY2xpY2sgPSBoYW5kbGVyOwkJCQotCQl9Ci0JCQotCQkvLyBoYW5kbGUgdGhlIGtleSBzdHJva2UKLQkJCi0JfQotCi0JCi0JLyoKLQl2YXIgdGFibGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0YWJsZSIpOwotCXRhYmxlLmJvcmRlciA9ICIyIjsKLQl0YWJsZS5jZWxsc3BhY2luZyA9ICIwIjsKLQl0YWJsZS5jZWxscGFkZGluZyA9ICIwIjsKLQljb250YWluZXIuYXBwZW5kQ2hpbGQodGFibGUpOwotCQotCXZhciB0ciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRyIik7Ci0JdGFibGUuYXBwZW5kQ2hpbGQodHIpOwotCSovCi0JLy8gY3JlYXRlIHRoZSBiYXIgaXRlbXMKLQkvL3RyLmFwcGVuZENoaWxkKHRoaXMuX2NyZWF0ZVRvb2xiYXJJdGVtKHRoaXMuYm9va21hcmtJbWFnZSwgIkJvb2ttYXJrIHRoaXMgcGFnZSIsICIyMHB4IikpOwotCS8qCi0JdHIuYXBwZW5kQ2hpbGQodGhpcy5jcmVhdGVUb29sYmFySXRlbSh0aGlzLmJhY2tJbWFnZSwgImJhY2siLCAiMjBweCIpKTsKLQl0ci5hcHBlbmRDaGlsZCh0aGlzLmNyZWF0ZVRvb2xiYXJJdGVtKHRoaXMuZm9yd2FyZEltYWdlLCAiZm9yd2FyZCIsICIyMHB4IikpOwotCXRyLmFwcGVuZENoaWxkKHRoaXMuY3JlYXRlVG9vbGJhckl0ZW0odGhpcy5leHBhbmRBbGxJbWFnZSwgImV4cGFuZCBBbGwiLCAiMjBweCIpKTsKLQl0ci5hcHBlbmRDaGlsZCh0aGlzLmNyZWF0ZVRvb2xiYXJJdGVtKHRoaXMuY29sbGFwc2VBbGxJbWFnZSwgImNvbGxhcHNlIEFsbCIsICIyMHB4IikpOwotCXRyLmFwcGVuZENoaWxkKHRoaXMuY3JlYXRlVG9vbGJhckl0ZW0odGhpcy5kaXZpZGVySW1hZ2UsICIiLCAiMTBweCIpKTsKLQl0ci5hcHBlbmRDaGlsZCh0aGlzLmNyZWF0ZVRvb2xiYXJJdGVtKHRoaXMucHJpbnRJbWFnZSwgIlByaW50IiwgIjIwcHgiKSk7Ci0JKi8KLQkKLX07Ci0KLUNvbnRlbnRQYWdlVG9vbGJhci5wcm90b3R5cGUuX2dldFRvb2xiYXJJdGVtSHRtbCA9IGZ1bmN0aW9uKGltZ1NyYywgdGV4dCkgewotCQotCXZhciBpbmRleCA9IHRoaXMudG9vbGJhckl0ZW1zLmxlbmd0aDsKLQl2YXIgaWQgPSB0aGlzLmJhckl0ZW1JZFByZWZpeCArIGltZ1NyYzsKLQl0aGlzLnRvb2xiYXJJdGVtc1tpbmRleF0gPSBpZDsKLQkKLQl2YXIgaHRtbCA9IFsiPHRkIHdpZHRoPScyMHB4JyBjbGFzcz0nY29udGVudFRvb2xiYXJJY29uJz48YSBocmVmPScnIGlkPSciLCBpZCwgIic+IiwgIAotCQkiPGltZyBhbHQ9JyIsIHRleHQsICInIHNyYz0nIiwgaW1nU3JjLCAiJyB0aXRsZT0nIiwgdGV4dCwgIicvPjwvYT4iLCAiPC90ZD4iXTsKLQotCXJldHVybiBodG1sOwkKLX07Ci0KLUNvbnRlbnRQYWdlVG9vbGJhci5wcm90b3R5cGUuX2NyZWF0ZVRvb2xiYXJJdGVtID0gZnVuY3Rpb24oaW1nU3JjLCB0ZXh0LCB3aWR0aCkgewotCXZhciB0ZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRkIik7Ci0JdGQud2lkdGggPSB3aWR0aDsKLQkKLQl2YXIgaW1nID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaW1nIik7Ci0JaW1nLmlkID0gdGhpcy5iYXJJdGVtSWRQcmVmaXggKyBpbWdTcmM7Ci0JCi0JaW1nLnNyYyA9IGltZ1NyYzsKLQlpbWcudGl0bGUgPSB0ZXh0OwotCWltZy5hbHQgPSB0ZXh0OwotCWltZy53aWR0aCA9ICcxNic7Ci0JaW1nLmhlaWdodCA9ICcxNic7Ci0JaW1nLmJvcmRlciA9ICcwJzsKLQkvL2ltZy5hbGlnbiA9ICdhYnNtaWRkbGUnOwotCQotCXRkLmFwcGVuZENoaWxkKGltZyk7Ci0JCi0JLy9hbGVydCgidGQ6ICIgKyB0ZCk7Ci0JCi0JcmV0dXJuIHRkOwotfTsKLQotCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvc2NyaXB0cy9Qcm9jZXNzRWxlbWVudFBhZ2UuanMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvc2NyaXB0cy9Qcm9jZXNzRWxlbWVudFBhZ2UuanMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5YjhkYTYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L3NjcmlwdHMvUHJvY2Vzc0VsZW1lbnRQYWdlLmpzCisrKyAvZGV2L251bGwKQEAgLTEsNDM5ICswLDAgQEAKLQotLy8gZGVmaW5lIHRoZSBjbGFzcyBoZXJlIHNvIHdlIGRvbid0IG5lZWQgdG8gbG9hZCB0aGUgZGV0YWlsIGltcGxlbWVudGF0aW9ucyAKLWZ1bmN0aW9uIFByb2Nlc3NFbGVtZW50UGFnZSgpIHsKLQotCXRoaXMucGFyX3Byb2MgPSBudWxsOwotCXRoaXMucGFyX3BhdGggPSBudWxsOwotCi0JLy8gaW1hZ2VzIGZvciB0aGUgYWN0aXZpdHksIGdlbmVyYXRlZCBkeW5hbWljYWxseSB3aGVuIHB1Ymxpc2hpbmcKLQl0aGlzLmltYWdlRmlsZXMgPSBbXTsKLQkKLQkvLyBzdXBwcmVzc2VkIGl0ZW1zIGZvciB0aGUgYWN0aXZpdHksIGdlbmVyYXRlZCBkeW5hbWljYWxseSB3aGVuIHB1Ymxpc2hpbmcKLQl0aGlzLnN1cHByZXNzZWRJdGVtcyA9IFtdOwotCQotCS8vIGVsZW1lbnQgdXJscyBmb3IgdGhlIGFjdGl2aXR5LCBnZW5lcmF0ZWQgZHluYW1pY2FsbHkgd2hlbiBwdWJsaXNoaW5nCi0JdGhpcy5lbGVtZW50VXJscyA9IFtdOwotCQkKLQl0aGlzLnRyZWVUYWJsZSA9IG51bGw7Ci0JCi19OwotCi1Qcm9jZXNzRWxlbWVudFBhZ2UucHJvdG90eXBlLmluaXQgPSBmdW5jdGlvbihoYXNUcmVlKSB7Ci0KLQl2YXIgcGFyYW1ldGVycyA9IGNvbnRlbnRQYWdlLmdldFVybFBhcmFtZXRlcnMoY29udGVudFBhZ2UucXVlcnlTdHIuc3Vic3RyaW5nKDEpKTsKLQl0aGlzLnBhcl9wcm9jID0gcGFyYW1ldGVyc1sicHJvYyJdOwotCXRoaXMucGFyX3BhdGggPSBwYXJhbWV0ZXJzWyJwYXRoIl07Ci0JCi0JaWYgKCB0aGlzLnBhcl9wcm9jID09IG51bGwgfHwgdGhpcy5wYXJfcGF0aCA9PSBudWxsICkgewotCQlwYXJhbWV0ZXJzID0gY29udGVudFBhZ2UuZ2V0VXJsUGFyYW1ldGVycyhjb250ZW50UGFnZS5kZWZhdWx0UXVlcnlTdHIuc3Vic3RyaW5nKDEpKTsKLQkJdGhpcy5wYXJfcHJvYyA9IHBhcmFtZXRlcnNbInByb2MiXTsKLQkJdGhpcy5wYXJfcGF0aCA9IHBhcmFtZXRlcnNbInBhdGgiXTsKLQl9CQotCQotCWlmICggaGFzVHJlZSkgewotCQl0aGlzLmNyZWF0ZVRyZWUoY29udGVudFBhZ2UuaW1nUGF0aCk7Ci0JfQotfTsKLQotUHJvY2Vzc0VsZW1lbnRQYWdlLnByb3RvdHlwZS5vbmxvYWQgPSBmdW5jdGlvbigpIHsKLQl0aGlzLmZpeE1hcFVybHMoKTsKLQl0aGlzLmZpeFRhYlVybHMoKTsKLQlpZiAoIHRoaXMudHJlZVRhYmxlICE9IG51bGwgJiYgdGhpcy50cmVlVGFibGUuY3JlYXRlVHJlZSkgewotCQl0aGlzLnRyZWVUYWJsZS5jcmVhdGVUcmVlKCdkaXYnLCAndHJlZU5vZGUnKTsKLQl9Ci0JCi19OwotCi0KLVByb2Nlc3NFbGVtZW50UGFnZS5wcm90b3R5cGUuY3JlYXRlVHJlZSA9IGZ1bmN0aW9uKGltZ1BhdGgpIHsKLQl0aGlzLnRyZWVUYWJsZSA9IG5ldyBBY3Rpdml0eVRyZWVUYWJsZSh0aGlzKTsKLQl0aGlzLnRyZWVUYWJsZS5pbml0aWFsaXplKGltZ1BhdGgpOwotfTsKLQotUHJvY2Vzc0VsZW1lbnRQYWdlLnByb3RvdHlwZS5maXhUYWJVcmxzID0gZnVuY3Rpb24oKSB7Ci0KLQl2YXIgYSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJUQUJfRGVzY3JpcHRpb24iKTsKLQlpZiAoIGEgIT0gbnVsbCApIHsKLQkJdGhpcy5maXhUYWJVcmwoYSk7Ci0JfQotCQotCWEgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiVEFCX1dCUyIpOwotCWlmICggYSAhPSBudWxsICkgewotCQl0aGlzLmZpeFRhYlVybChhKTsKLQl9Ci0KLQlhID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIlRBQl9XUEJTIik7Ci0JaWYgKCBhICE9IG51bGwgKSB7Ci0JCXRoaXMuZml4VGFiVXJsKGEpOwotCX0KLQotCWEgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiVEFCX1RCUyIpOwotCWlmICggYSAhPSBudWxsICkgewotCQl0aGlzLmZpeFRhYlVybChhKTsKLQl9Ci19OwotCi0KLVByb2Nlc3NFbGVtZW50UGFnZS5wcm90b3R5cGUuZml4VGFiVXJsID0gZnVuY3Rpb24oYSkgewotCWlmIChhID09IG51bGwgfHwgIGNvbnRlbnRQYWdlLnF1ZXJ5U3RyID09IG51bGwgKSByZXR1cm47Ci0JdmFyIHVybCA9IGEuZ2V0QXR0cmlidXRlKCJocmVmIik7Ci0JaWYgKCB1cmwgIT0gbnVsbCApIHsKLQkJYS5zZXRBdHRyaWJ1dGUoImhyZWYiLCB1cmwgKyBjb250ZW50UGFnZS5xdWVyeVN0cik7Ci0JfQotfQotCi1Qcm9jZXNzRWxlbWVudFBhZ2UucHJvdG90eXBlLmZpeE1hcFVybHMgPSBmdW5jdGlvbigpIHsKLQotCS8vIGZpeCB0aGUgbWFwIGFyZWEgdXJsCi0JaWYgKGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKSB7Ci0JCXZhciBlbGVtZW50cyA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBUkVBIik7Ci0JCWlmICggZWxlbWVudHMgIT0gbnVsbCApIHsKLQkJCWZvciAodmFyIGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHsKLQkJCQl2YXIgZWxlbWVudCA9IGVsZW1lbnRzW2ldOwotCQkJCXZhciB1cmwgPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgiaHJlZiIpOwotCQkJCXZhciByZWxQYXRoID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoInJlbFBhdGgiKTsKLQkJCQlpZiAoIHVybCAhPSBudWxsICYmIHJlbFBhdGggIT0gbnVsbCApIHsKLQkJCQkJdXJsID0gdGhpcy5nZXRBY3Rpdml0eUl0ZW1VcmwodXJsLCB0aGlzLnBhcl9wcm9jLCB0aGlzLnBhcl9wYXRoLCByZWxQYXRoKTsKLQkJCQkJZWxlbWVudC5zZXRBdHRyaWJ1dGUoImhyZWYiLCB1cmwpOwotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQl9Ci0JCi0JLy8gZml4IHRoZSBkaWFncmFtIGltZyB1cmxzCi0JdmFyIGRpYWdyYW1UeXBlID0gIkFjdGl2aXR5IjsgLy8gbm8gdHJhbnN0YXRpb24hCi0JdmFyIGUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZGlhZ3JhbV8iICsgZGlhZ3JhbVR5cGUpOwotCWlmICggZSAhPSBudWxsICkgewotCQl2YXIgdXJsID0gdGhpcy5nZXREaWFncmFtSW1hZ2VVcmwodGhpcy5wYXJfcHJvYywgdGhpcy5wYXJfcGF0aCwgZGlhZ3JhbVR5cGUpOwotCQlpZiAoIHVybCAhPSBudWxsICkgewotCQkJZS5zcmMgPSB1cmw7Ci0JCX0KLQl9Ci0JCi0JZGlhZ3JhbVR5cGUgPSAiQWN0aXZpdHlEZXRhaWwiOyAvLyBubyB0cmFuc3RhdGlvbiEKLQllID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImRpYWdyYW1fIiArIGRpYWdyYW1UeXBlKTsKLQkJaWYgKCBlICE9IG51bGwgKSB7Ci0JCQl2YXIgdXJsID0gdGhpcy5nZXREaWFncmFtSW1hZ2VVcmwodGhpcy5wYXJfcHJvYywgdGhpcy5wYXJfcGF0aCwgZGlhZ3JhbVR5cGUpOwotCQkJaWYgKCB1cmwgIT0gbnVsbCApIHsKLQkJCQllLnNyYyA9IHVybDsKLQkJCX0KLQl9Ci19Ci0KLQotCi1Qcm9jZXNzRWxlbWVudFBhZ2UucHJvdG90eXBlLmdldEFjdGl2aXR5SXRlbVVybCA9IGZ1bmN0aW9uKHVybCwgcHJvY2VzcywgZWxlbWVudFByb2Nlc3NQYXRoLCByZWxQcm9jZXNzUGF0aCkKLXsKLQl2YXIgcXVlcnlTdHJpbmcgPSAiP3Byb2M9IiArIHByb2Nlc3MgKyAiJnBhdGg9IiArIGVsZW1lbnRQcm9jZXNzUGF0aCArIHJlbFByb2Nlc3NQYXRoOwotCXJldHVybiBjb250ZW50UGFnZS5yZXNvbHZlVXJsKHVybCkgKyBxdWVyeVN0cmluZzsKLQkKLX07Ci0KLVByb2Nlc3NFbGVtZW50UGFnZS5wcm90b3R5cGUuZ2V0RGlhZ3JhbUltYWdlVXJsID0gZnVuY3Rpb24ocHJvY2VzcywgZWxlbWVudFByb2Nlc3NQYXRoLCBkaWFncmFtVHlwZSkKLXsKLQkvLyBnZXQgdGhlIGRpYWdyYW0gaW1hZ2UgZmlsZSBmb3IgdGhlIHNwZWNpZmllZCBlbGVtZW50IHBhdGggYW5kIHByb2Nlc3MKLQkvLyByZXR1dG5zIG51bGwgaWYgbm90aW5nCi0JLy8gZGlhZ3JhbSB0eXBlIGlzIEFjdGl2aXR5LCBBY3Rpdml0eURldGFpbCwgCi0JdmFyIGltZ1VybCA9IHRoaXMuaW1hZ2VGaWxlc1tlbGVtZW50UHJvY2Vzc1BhdGgrZGlhZ3JhbVR5cGVdOwotCS8vYWxlcnQoImdldCAiICsgZGlhZ3JhbVR5cGUgKyAiIGRpYWdyYW0gZm9yICIgKyBlbGVtZW50UHJvY2Vzc1BhdGggKyAiID0gIiArIGltZ1VybCk7Ci0KLQlpZiAoIGltZ1VybCAhPSBudWxsICYmIGltZ1VybCAhPSAidW5kZWZpbmVkIiApIHsKLQkJcmV0dXJuIGNvbnRlbnRQYWdlLnJlc29sdmVVcmwoaW1nVXJsKTsKLQl9IAotCQotCXJldHVybiBudWxsOwotfTsKLQotLyp0aGlzIG1ldGhvZCBmaXggdGhlIHVybCBmb3IgZGVzY3JpcHRvciBsaW5rcyB3aXRoaW4gZGVzY3JpcHRvciovCi1Qcm9jZXNzRWxlbWVudFBhZ2UucHJvdG90eXBlLmdldERlc2NyaXB0b3JJdGVtVXJsID0gZnVuY3Rpb24odXJsLCByZWxQcm9jZXNzUGF0aCkKLXsKLQl2YXIgcGF0aCA9ICIiOwotCXZhciBpID0gIHRoaXMucGFyX3BhdGguaW5kZXhPZihyZWxQcm9jZXNzUGF0aCk7Ci0JaWYgKCBpID4gMCApIHsKLQkJcGF0aCA9IHRoaXMucGFyX3BhdGguc3Vic3RyaW5nKDAsIGkgKyByZWxQcm9jZXNzUGF0aC5sZW5ndGgpOwotCX0gZWxzZSB7Ci0JCS8vIHJlbW92ZSB0aGUgbGFzdCBndWlkCi0JCWkgPSB0aGlzLnBhcl9wYXRoLmxhc3RJbmRleE9mKCIsIik7Ci0JCXBhdGggPSB0aGlzLnBhcl9wYXRoLnN1YnN0cmluZygwLCBpKzEpICsgcmVsUHJvY2Vzc1BhdGg7Ci0JfQotCQotCXZhciBxdWVyeVN0cmluZyA9ICI/cHJvYz0iICsgdGhpcy5wYXJfcHJvYyArICImcGF0aD0iICsgcGF0aDsKLQl1cmwgPSBjb250ZW50UGFnZS5yZXNvbHZlVXJsKHVybCkgKyBxdWVyeVN0cmluZzsKLQkJCi0JcmV0dXJuIHVybDsKLQkKLX07Ci0KLQotUHJvY2Vzc0VsZW1lbnRQYWdlLnByb3RvdHlwZS5maXhEZXNjcmlwdG9yTGlua3MgPSBmdW5jdGlvbigpCi17Ci0JdmFyIGVsZW1lbnRzID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkEiKTsKLQlmb3IgKHZhciBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCXZhciBlbGVtZW50ID0gZWxlbWVudHNbaV07Ci0KLQkJdmFyIGd1aWQgPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgiZ3VpZCIpOwotCQl2YXIgdXJsID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoImhyZWYiKTsKLQotCQlpZiAoIGd1aWQgIT0gbnVsbCAmJiBndWlkICE9ICIiICkgewotCQkJdXJsID0gdGhpcy5nZXREZXNjcmlwdG9ySXRlbVVybCh1cmwsIGd1aWQpOwotCQkJZWxlbWVudC5zZXRBdHRyaWJ1dGUoImhyZWYiLCB1cmwpOwotCQl9Ci0JfQotfTsKLQotUHJvY2Vzc0VsZW1lbnRQYWdlLnByb3RvdHlwZS5pc1N1cHByZXNzZWQgPSBmdW5jdGlvbihwcm9jZXNzLCBlbGVtZW50UHJvY2Vzc1BhdGgpCi17Ci0JdmFyIGZsYWcgPSAodGhpcy5zdXBwcmVzc2VkSXRlbXNbZWxlbWVudFByb2Nlc3NQYXRoXSA9PSB0cnVlKTsKLQkvL2lmICggZmxhZyApIGFsZXJ0KCJnb3Qgb25lOiAiICsgZWxlbWVudFByb2Nlc3NQYXRoKTsKLQkJCi0JcmV0dXJuIGZsYWc7Ci19OwotCi1Qcm9jZXNzRWxlbWVudFBhZ2UucHJvdG90eXBlLmJ1aWxkVGVhbVRyZWUgPSBmdW5jdGlvbih0ZWFtVHJlZSkgewkKLQkKLQl2YXIgZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgidGVhbVRyZWUiKTsKLQlpZiAoIGVsID09IG51bGwgKSByZXR1cm47Ci0JCi0JaWYgKCB0ZWFtVHJlZSA9PSBudWxsIHx8IHRlYW1UcmVlLmxlbmd0aCA9PSAwICkgewotCQlyZXR1cm47Ci0JfQotCQotCXRlYW1UcmVlWzBdWzBdID0gdGVhbVRyZWVbMF1bMF0ucmVwbGFjZSgvKFwnfFwiKS9nLCAiXFwkMSIpOwotCi0JdmFyIHRlYW1CdWZmZXIgPSBbXTsKLQl2YXIgbGVuID0gdGVhbVRyZWUubGVuZ3RoOwotCWZvciAoIHZhciBpID0gMDsgaSA8IGxlbjsgaSsrICkgewotCi0JCWlmICggIXRoaXMuaXNUZWFtU3VwcHJlc3NlZCh0ZWFtVHJlZVtpXSkgKSB7Ci0JCQl0ZWFtQnVmZmVyW3RlYW1CdWZmZXIubGVuZ3RoXSA9ICI8ZGl2IGNsYXNzPVwidGVhbVN0cnVjdHVyZVwiIGFsaWduPVwibGVmdFwiPiI7Ci0JCQl0ZWFtQnVmZmVyID0gdGVhbUJ1ZmZlci5jb25jYXQodGhpcy5nZXRUZWFtVHJlZUh0bWwodGVhbVRyZWVbaV0pKTsKLQkJCXRlYW1CdWZmZXJbdGVhbUJ1ZmZlci5sZW5ndGhdID0gIjwvZGl2Pjxici8+IjsKLQkJfQotCi0JfQotCQotCS8vYWxlcnQodGVhbUJ1ZmZlcik7Ci0JLy9kb2N1bWVudC53cml0ZSh0ZWFtQnVmZmVyKTsKLQllbC5pbm5lckhUTUwgPSB0ZWFtQnVmZmVyLmpvaW4oIiIpOwotfTsKLQotCi0vLyBmb3JtYXQgaXMgW3VybCwgdGl0bGUsIHJlbFBhdGgsIHN1cHByZXNzZWRdCi1Qcm9jZXNzRWxlbWVudFBhZ2UucHJvdG90eXBlLmdldFRlYW1UcmVlSHRtbCA9IGZ1bmN0aW9uKHRlYW1UcmVlKSB7Ci0KLQlpZiAoIHRlYW1UcmVlID09IG51bGwgfHwgdGVhbVRyZWUubGVuZ3RoIDwgNCkgewotCQlyZXR1cm4gW107Ci0JfQotCi0JdmFyIHVybCA9IHRlYW1UcmVlWzBdOwotCXZhciB0aXRsZSA9IHRlYW1UcmVlWzFdOwotCXZhciByZWxQYXRoID0gdGVhbVRyZWVbMl07Ci0JCi0JdXJsID0gdGhpcy5nZXRBY3Rpdml0eUl0ZW1VcmwodXJsLCB0aGlzLnBhcl9wcm9jLCB0aGlzLnBhcl9wYXRoLCByZWxQYXRoKTsKLQkKLQl2YXIgdGVhbUJ1ZmZlciA9IFsiPGEgaHJlZj1cIiIsIHVybCwgIlwiPiIsIHRpdGxlLCAiPC9hPiJdOwotCXZhciBzbGVuID0gNTsKLQkKLQlpZiAoIHRlYW1UcmVlLmxlbmd0aCA+IDQgJiYgdGVhbVRyZWVbNF0gIT0gbnVsbCAmJiB0ZWFtVHJlZVs0XSAhPSAiIiAmJiB0ZWFtVHJlZVs0XSAhPSB1bmRlZmluZWQgKSB7Ci0JCXRlYW1CdWZmZXJbc2xlbisrXSA9ICI8dWw+IjsKLQkJZm9yICggdmFyIGkgPSA0OyBpIDwgdGVhbVRyZWUubGVuZ3RoOyBpKysgKSB7Ci0JCQlpZiAodHlwZW9mIHRlYW1UcmVlW2ldID09ICJvYmplY3QiICYmICF0aGlzLmlzVGVhbVN1cHByZXNzZWQodGVhbVRyZWVbaV0pICkgewotCi0JCQkJdGVhbUJ1ZmZlcltzbGVuKytdID0gIjxsaT4iOwotCQkJCXRlYW1CdWZmZXIgPSB0ZWFtQnVmZmVyLmNvbmNhdCh0aGlzLmdldFRlYW1UcmVlSHRtbCh0ZWFtVHJlZVtpXSkpOwotCQkJCXNsZW4gPSB0ZWFtQnVmZmVyLmxlbmd0aDsKLQkJCQl0ZWFtQnVmZmVyW3NsZW4rK10gPSAiPC9saT4iOwotCQkJfQotCQl9Ci0JCXRlYW1CdWZmZXJbc2xlbisrXSA9ICI8L3VsPiI7Ci0JfQotCi0JcmV0dXJuIHRlYW1CdWZmZXI7Ci19OwotCi1Qcm9jZXNzRWxlbWVudFBhZ2UucHJvdG90eXBlLmlzVGVhbVN1cHByZXNzZWQgPSBmdW5jdGlvbih0ZWFtVHJlZSkgewotCi0JaWYgKCB0ZWFtVHJlZSA9PSBudWxsIHx8IHRlYW1UcmVlLmxlbmd0aCA8IDQpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCXZhciByZWxQYXRoID0gdGVhbVRyZWVbMl07Ci0JdmFyIHN1cCA9IHRlYW1UcmVlWzNdOwotCi0JaWYgKCBzdXAgPT0gIiIgKSB7Ci0JCXJldHVybiB0aGlzLmlzU3VwcHJlc3NlZCh0aGlzLnBhcl9wcm9jLCB0aGlzLnBhcl9wYXRoICsgcmVsUGF0aCk7Ci0JfSBlbHNlIHsKLQkJcmV0dXJuIChzdXAgPT0gInRydWUiKTsKLQl9Ci0JCi19OwotCi1Qcm9jZXNzRWxlbWVudFBhZ2UucHJvdG90eXBlLmJ1aWxkUHJvY2Vzc0VsZW1lbnRCcmVhZENydW1iID0gZnVuY3Rpb24odXJsKSB7Ci0KLQl2YXIgZGl2ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImJyZWFkY3J1bWJzIik7Ci0JaWYgKCBkaXYgPT0gbnVsbCApIHJldHVybjsKLQotCXZhciB2aWV3RnJhbWUgPSBjb250ZW50UGFnZS5nZXRWaWV3RnJhbWUoKTsKLQlpZiAoIHZpZXdGcmFtZSA9PSBudWxsICkgewotCQlyZXR1cm47Ci0JfQotCQkKLQl2YXIgcGF0aHMgPSB0aGlzLnBhcl9wYXRoLnNwbGl0KCIsIik7Ci0JCi0JdmFyIGhhc0FwcCA9IChjb250ZW50UGFnZS5nZXRBcHAoKSAhPSBudWxsKTsJCi0JdmFyIG5vZGVJbmZvID0gbnVsbDsKLQkKLQlpZiAoIGhhc0FwcCApIHsKLQkJLy8gdGhlIGZpcnN0IHBhdGggaXMgdGhlIHByb2Nlc3MgZ3VpZAotCQkvLyBob3dldmVyLCB0aGUgdHJlZSBub2RlIG1pZ2h0IGJlIGFuIGFjdGl2aXR5IHdpdGhvdXQgaGF2aW5nIGEgcHJvY2VzcyBub2RlCi0JCS8vIGZvciBleGFtcGxlLCBhIGRpc2NpcGxpbmUgY2FuIGhhdmUgYW4gYWN0aXZpdHkgYXMgYSByZWZlcmVuY2VkIHdvcmsgZmxvdwotCQkvLyBzbyBjaGVjayBhbGwgCi0JCWZvciAodmFyIHggPSAwOyB4IDwgcGF0aHMubGVuZ3RoOyB4KysgKSB7Ci0JCQl2YXIgaWQgPSBwYXRoc1t4XTsKLQkJCW5vZGVJbmZvID0gdmlld0ZyYW1lLmdldE5vZGVJbmZvKGlkKTsKLQkJCWlmICggbm9kZUluZm8gIT0gbnVsbCApIHsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQkKLQkJLy8gaWYgdGhlIHByb2Nlc3MgaXMgbm90IGluIHRoZSB0cmVlLCB0aGVyZSBpcyBubyBub2RlaW5mbwotCQkvLyBpbiBzdWNoIGNhc2UsIHVzZSB0aGUgbm9kZSBpbmZvIG9mIHRoZSBlbGVtZW50Ci0JCWlmICggbm9kZUluZm8gPT0gbnVsbCApIHsKLQkJCW5vZGVJbmZvID0gY29udGVudFBhZ2Uubm9kZUluZm87Ci0JCX0KLQkJCi0JCWlmICggbm9kZUluZm8gIT0gbnVsbCApIHsKLQkJCS8vIHJlbW92ZSB0aGUgZmlyc3QgZWxlbWVudCBzaW5jZSBpdCdzIHRoZSB2aWV3IG5vZGUKLQkJCXBhdGhzLnNoaWZ0KCk7Ci0JCi0JCQl2YXIgc2VsZiA9IHRoaXM7Ci0JCQl2YXIgY2FsbGJhY2sgPSBmdW5jdGlvbihiY3MpIHsKLQkJCQlzZWxmLl9zaG93UHJvY2Vzc0VsZW1lbnRCcmVhZENydW1iKGRpdiwgYmNzLCB1cmwpOwotCQkJfTsKLQkJCXZpZXdGcmFtZS5nZXRCcmVhZGNydW1ic0J5UGF0aChub2RlSW5mbywgcGF0aHMsIGNhbGxiYWNrKTsKLQkJfSBlbHNlIHsKLQkJCS8vIGlmIGNhbid0IGZpbmQgdGhlIHRyZWUgbm9kZSwganVzdCBzaG93IHRoZSBwcm9jZXNzIGJyZWFkY3J1bWJzCi0JCQl2YXIgYmNzID0gW107Ci0JCQl0aGlzLl9zaG93UHJvY2Vzc0VsZW1lbnRCcmVhZENydW1iKGRpdiwgYmNzLCB1cmwpOwotCQl9Ci0JfSBlbHNlIHsKLQkJdmFyIGJjcyA9IG51bGw7Ci0JCXdoaWxlIChwYXRocy5sZW5ndGggPiAwICkgewotCQkJYmNzID0gdmlld0ZyYW1lLmdldEJyZWFkY3J1bWJzQnlQYXRoKHBhdGhzKTsKLQkJCWlmICggYmNzICE9IG51bGwgJiYgYmNzLmxlbmd0aCA+IDAgKSB7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQkKLQkJCXBhdGhzLnNoaWZ0KCk7Ci0JCX0KLQkJCi0JCWlmICggYmNzID09IG51bGwgfHwgYmNzLmxlbmd0aCA9PSAwICkgewotCQkJYmNzICA9IHZpZXdGcmFtZS5nZXRCcmVhZGNydW1icyh1cmwpOwotCQl9Ci0JCQotCQkvL2FsZXJ0KGJjcyk7Ci0JCXRoaXMuX3Nob3dQcm9jZXNzRWxlbWVudEJyZWFkQ3J1bWIoZGl2LCBiY3MsIHVybCk7Ci0JfQotCQotCi19OwotCi1Qcm9jZXNzRWxlbWVudFBhZ2UucHJvdG90eXBlLl9zaG93UHJvY2Vzc0VsZW1lbnRCcmVhZENydW1iID0gZnVuY3Rpb24oZGl2LCBiY3MsIHVybCkgewotCXZhciB2aWV3RnJhbWUgPSBjb250ZW50UGFnZS5nZXRWaWV3RnJhbWUoKTsKLQlpZiAodmlld0ZyYW1lID09IG51bGwgfHwgIXZpZXdGcmFtZS5nZXRCcmVhZGNydW1icyApIHsKLQkJcmV0dXJuOwotCX0KLQkKLQl2YXIgbG9jYWxCY3MgPSBbXTsKLQl2YXIgY291bnQgPSAwOwotCXZhciBsaW5rc1RleHQgPSAiIjsKLQl2YXIgcGF0aHMgPSB0aGlzLnBhcl9wYXRoLnNwbGl0KCIsIik7Ci0JdmFyIHBhdGggPSB0aGlzLnBhcl9wYXRoOwotCQotCXZhciBoYXNBcHAgPSAoY29udGVudFBhZ2UuZ2V0QXBwKCkgIT0gbnVsbCk7Ci0JLy9hbGVydCgiYXBwOiIgKyBoYXNBcHApOwotCXZhciBiYXNlVXJsID0gbnVsbDsKLQlpZiAoIGhhc0FwcCApIHsKLQkJYmFzZVVybCA9IGNvbnRlbnRQYWdlLmdldEFwcCgpLmdldEJhc2VVcmwoKTsKLQl9IGVsc2UgewkKLQkJYmFzZVVybCA9IHZpZXdGcmFtZS5nZXRCYXNlVXJsKCk7Ci0JfQotCQotCXZhciBsYXN0QmNzSWQgPSBudWxsOwotCWlmICggYmNzID09IG51bGwgKSB7Ci0JCWJjcyA9IFtdOwotCX0gZWxzZSBpZiAoIGJjcy5sZW5ndGggPiAwICkgewotCQlsYXN0QmNzSWQgPSBiY3NbYmNzLmxlbmd0aC0xXS5pZDsKLQl9Ci0JCi0JCi0JZm9yICh2YXIgaSA9IHBhdGhzLmxlbmd0aC0xOyBpID49MDsgaS0tKSB7Ci0JCXZhciBndWlkID0gcGF0aHNbaV07Ci0KLQkJdmFyIGl0ZW1fdGV4dCA9ICIiOwotCQl2YXIgaXRlbV91cmwgPSAiIjsKLQkJCi0JCXZhciBpdGVtID0gdGhpcy5lbGVtZW50VXJsc1tndWlkXTsKLQkJaWYgKCBpdGVtICE9IG51bGwgKSB7Ci0JCQlpdGVtX3RleHQgPSBpdGVtWzBdOwotCQkJaXRlbV91cmwgPSBiYXNlVXJsICsgaXRlbVsxXTsKLQotCQkJLy8gZ2V0IHRoZSB1cmwgd2l0aCBubyBiYWNrIHBhdGgsIHRoZW4gY29udmVyIHRvIGEgZnVsbCB1cmwJCQkKLQkJCWl0ZW1fdXJsID0gdGhpcy5nZXRBY3Rpdml0eUl0ZW1VcmwoaXRlbV91cmwsIHRoaXMucGFyX3Byb2MsIHBhdGgsICcnKTsKLQkJCS8vIGdldCB0aGUgbGFzdCB0cmVlLW5vZGUgYnJlYWRjcnVtYnMKLQkJCS8vIHByb2Nlc3MgdGhpcyBiZWZvcmUgdGhlIGl0ZW1fdXJsIGlzIHNldAotCQkJLy9hbGVydCgidmlld0ZyYW1lLmdldEJyZWFkY3J1bWJzOiAiICsgdmlld0ZyYW1lLmdldEJyZWFkY3J1bWJzKTsKLQkJCWlmICggZ3VpZCA9PSBsYXN0QmNzSWQgKSB7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQkKLQkJCWxvY2FsQmNzW2NvdW50KytdID0ge2lkOiBndWlkLCB1cmw6IGl0ZW1fdXJsLCB0aXRsZTogaXRlbV90ZXh0fTsJCQkKLQkJfQotCQkKLQkJLy8gdHJpbSB0aGUgcGF0aAotCQl2YXIgeCA9IHBhdGguaW5kZXhPZigiLCIgKyBndWlkKTsKLQkJaWYgKCB4ID4gMCApIHsKLQkJCXBhdGggPSBwYXRoLnN1YnN0cmluZygwLCB4KTsKLQkJfQotCX0KLQotCWlmICggbG9jYWxCY3MubGVuZ3RoID4gMCApIHsKLQkJLy8gb3JkZXIgaXQgcmlnaHQKLQkJbG9jYWxCY3MgPSBsb2NhbEJjcy5yZXZlcnNlKCk7Ci0JCWlmICggYmNzID09IG51bGwgKSAgYmNzID0gW107CQkKLQkJdmFyIGNvdW50ID0gYmNzLmxlbmd0aDsKLQkJZm9yICh2YXIgaSA9IDA7IGkgPCBsb2NhbEJjcy5sZW5ndGg7IGkrKykgewotCQkJYmNzW2NvdW50K2ldID0gbG9jYWxCY3NbaV07Ci0JCX0KLQl9Ci0JCi0JaWYgKCBiY3MgIT0gbnVsbCAmJiBiY3MubGVuZ3RoID4gMCApIHsKLQkJY29udGVudFBhZ2Uuc2hvd0JyZWFkY3J1bW5zKGRpdiwgYmNzKTsKLQl9Ci0JCi19OwotCi0KLQotUHJvY2Vzc0VsZW1lbnRQYWdlLnByb3RvdHlwZS5nZXRQcm9jZXNzRWxlbWVudExpbmtIdG1sRnJvbUlkID0gZnVuY3Rpb24oZ3VpZCwgZWxlbWVudFBhdGgsIGJhY2tQYXRoKSB7Ci0KLQl2YXIgc3RyID0gW107Ci0JdmFyIGl0ZW0gPSB0aGlzLmVsZW1lbnRVcmxzW2d1aWRdOwotCWlmICggaXRlbSAhPSBudWxsICkgewotCQl2YXIgdGV4dCA9IGl0ZW1bMF07Ci0JCXZhciB1cmwgPSBiYWNrUGF0aCArIGl0ZW1bMV07Ci0JCXVybCA9IHRoaXMuZ2V0QWN0aXZpdHlJdGVtVXJsKHVybCwgdGhpcy5wYXJfcHJvYywgZWxlbWVudFBhdGgsICcnKTsKLQkJCi0JCS8vIGVzY2FwZSB0aGUgcXVvdGVzCi0JCXVybCA9IHVybC5yZXBsYWNlKC8nL2csICJcXCciKTsKLQkJdXJsID0gdXJsLnJlcGxhY2UoL1wiL2csICJcXFwiIik7Ci0JCQkKLQkJCQotCQlzdHIgPSBbIjxhIGhyZWY9XCIiLCB1cmwsICJcIj4iLCB0ZXh0LCAiPC9hPiJdOwotCX0KLQotCQotCXJldHVybiBzdHIuam9pbigiIik7Ci19OwotCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvc2NyaXB0cy9jb250ZW50UGFnZS5qcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9zY3JpcHRzL2NvbnRlbnRQYWdlLmpzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MzdkODYzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9zY3JpcHRzL2NvbnRlbnRQYWdlLmpzCisrKyAvZGV2L251bGwKQEAgLTEsMzM0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8gCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0vLyBUaGlzIHRlbXBvcmFyeSBmdW5jdGlvbiBoZWxwcyB0byByZXNvbHZlIEphdmFzY3JpcHQgZXJyb3JzIGluIHRoZSBtaWdyYXRlZCBSVVAKLS8vIGNvbnRlbnQgcGFnZXMuIEl0IHdpbGwgYmUgcmVtb3ZlZCBvbmNlIHRoZSBjb3JyZXNwb25kaW5nIC5qcyBmaWxlcyBhcmUgYmVpbmcKLS8vIG1pZ3JhdGVkIGFsb25nIHdpdGggdGhlIEhUTUwgY29udGVudCBwYWdlcy4KLWZ1bmN0aW9uIFJlZmVyZW5jZUhlbHBUb3BpYyAodG9waWNOYW1lLCBib29rICwgZmlsZU5hbWUpIHsKLSAgIC8vZG9jdW1lbnQud3JpdGUoIjxpPiIrIHRvcGljTmFtZSArICI8XC9pPiIpOwotfTsKLQotCi12YXIgY29udGVudFBhZ2UgPSB7Ci0KLQliYWNrUGF0aDogbnVsbCwKLQlpbWdQYXRoOiBudWxsLAotCWRlZmF1bHRRdWVyeVN0cjogbnVsbCwKLQlxdWVyeVN0cjogbnVsbCwKLQlpc1Byb2Nlc3NQYWdlOiBmYWxzZSwKLQlub2RlSW5mbzogbnVsbCwKLQkKLQkvLyBkZWZpbmUgcmVzb3VyY2UgZmlsZQotCXJlcyA6IG5ldyBDb250ZW50UGFnZVJlc291cmNlKCksCi0JCi0JLy8gZGVmaW5lIGFjdGl2aXR5IGxheW91dCwgbmVlZCB0byBjcmVhdGUgdGhpcyBhcyBhIHBsYWNlIGhvbGRlciAKLQkvLyBzbyB0aGF0IHRoZSBkeW5hbWljYWxseSBnZW5lcmF0ZWQgZGF0YSBjYW4gYmUgbG9hZGVkCi0JcHJvY2Vzc1BhZ2U6ICggdHlwZW9mIFByb2Nlc3NFbGVtZW50UGFnZSA9PSAidW5kZWZpbmVkIiApID8gbnVsbCA6IG5ldyBQcm9jZXNzRWxlbWVudFBhZ2UoKSwKLQkKLQkvLyBkZWZpbmUgc2VjdGlvbgotCXNlY3Rpb246IG5ldyBDb250ZW50UGFnZVNlY3Rpb24oKSwKLQkKLQkvLyBkZWZpbmUgc3ViLXNlY3Rpb24KLQlzdWJTZWN0aW9uOiBudWxsLAotCQotCXRvb2xiYXI6IG51bGwsCi0JCi0JLy8gYXV0byB3cmFwIGVsZW1lbnRzCi0JYXV0b1dyYXBFbGVtZW50czogW10sCi0JCi0JLy8gY2FsbCB0aGlzIG1ldGhvZCBiZWZvcmUgdGhlIHBhZ2UgaXMgbG9hZGVkCi0JLy8gdGhpcyBpcyB1c2VkIHRvIGluaXRpYWxpemUgc29tZSBwYXJhbWV0ZXJzIGJlZm9yZSB0aGUgcGFnZSBjb250ZW50IGlzIHByb2Nlc3NlZAotCS8vIGZvciBleGFtcGxlLCBpZiB0aGUgY29udGVudCBuZWVkcyB0byB1c2Ugc29tZSBwYXJhbWV0ZXJzIGluc2lkZSB0aGUgY29udGVudAotCS8vIHRoaXMgYXBwcm9hY2ggaXMgbm90IHJlY29tbWVudGVkIGJ1dCBrZWVwIGhlcmUgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkKLQlwcmVsb2FkOiBmdW5jdGlvbihpbWdQYXRoLCBiYWNrUGF0aCwgbm9kZUluZm8sIGRlZmF1bHRRdWVyeVN0ciwgaGFzU3ViU2VjdGlvbiwgaXNQcm9jZXNzUGFnZSwgaGFzVHJlZSkgewotCi0JCXRoaXMuaXNQcm9jZXNzUGFnZSA9IGlzUHJvY2Vzc1BhZ2UgfHwgaGFzVHJlZTsKLQkJdGhpcy5pbWdQYXRoID0gaW1nUGF0aDsKLQkJdGhpcy5iYWNrUGF0aCA9IGJhY2tQYXRoOwotCQl0aGlzLm5vZGVJbmZvID0gbm9kZUluZm87Ci0JCXRoaXMuZGVmYXVsdFF1ZXJ5U3RyID0gZGVmYXVsdFF1ZXJ5U3RyOwotCQl0aGlzLnF1ZXJ5U3RyID0gbG9jYXRpb24uc2VhcmNoOwotCQkKLQkJLy8gY29udmVydCB0aGUgaW1hZ2UgcGF0aCB0byBhYnNvbHV0ZSBwYXRoCi0JCS8vIG90aGVyd2lzZSB0aGUgcGFnZSB3aWxsIHJlc29sdmUgdG8gd3JvbmcgYWJzb2x1dGUgcGF0aCBpZiB0aGUgYnJvd3NlciBjYXNoZWQgdGhlIHBhZ2VzCi0JCXZhciBiYXNlID0gd2luZG93LmxvY2F0aW9uLmhyZWY7Ci0JCXZhciBpID0gYmFzZS5sYXN0SW5kZXhPZigiLyIpOwotCQl0aGlzLmltZ1BhdGggPSBiYXNlLnN1YnN0cmluZygwLCBpKzEpICsgdGhpcy5pbWdQYXRoOwotCQkvL2FsZXJ0KHRoaXMuaW1nUGF0aCk7Ci0KLQotCQlpZiAoIHRoaXMucXVlcnlTdHIgPT0gbnVsbCB8fCB0aGlzLnF1ZXJ5U3RyID09ICIiICkKLQkJewotCQkJdGhpcy5xdWVyeVN0ciA9IHRoaXMuZGVmYXVsdFF1ZXJ5U3RyOwotCQl9Ci0JCQkJCi0JCXRoaXMuc2VjdGlvbi5pbml0KHRoaXMuaW1nUGF0aCk7Ci0JCQkJCi0JCWlmICggaGFzU3ViU2VjdGlvbiApIHsKLQkJCXRoaXMuc3ViU2VjdGlvbiA9IG5ldyBDb250ZW50UGFnZVN1YlNlY3Rpb24oKTsKLQkJfQotCQkKLQkJaWYgKCB0aGlzLnByb2Nlc3NQYWdlICYmIChpc1Byb2Nlc3NQYWdlIHx8IGhhc1RyZWUpICkgewotCQkJdGhpcy5wcm9jZXNzUGFnZS5pbml0KGhhc1RyZWUpOwotCQl9Ci0JCQkJCi0JfSwKLQkKLQkKLQkvLyBjYWxsIHRoaXMgbWV0aG9kIHdoZW4gcGFnZSBpcyBsb2FkZWQKLQlvbmxvYWQ6IGZ1bmN0aW9uKCkgewotCQl0aGlzLnNlY3Rpb24uY3JlYXRlU2VjdGlvbkxpbmtzKCdkaXYnLCAnc2VjdGlvbkhlYWRpbmcnLCB0aGlzLmltZ1BhdGgpOwotCQlpZiAoIHRoaXMuc3ViU2VjdGlvbiAhPSBudWxsICkgewotCQkJdGhpcy5zdWJTZWN0aW9uLmNyZWF0ZVN0ZXBMaW5rcygnZGl2JywgJ3N0ZXBIZWFkaW5nJyk7Ci0JCX0KLQkJCQotCQl2YXIgc2VsZiA9IHRoaXM7Ci0JCXZhciBhcHAgPSB0aGlzLmdldEFwcCgpOwotCQkKLQkJaWYgKCBhcHAgIT0gbnVsbCApIHsKLQkJCXRoaXMudG9vbGJhciA9IG5ldyBDb250ZW50UGFnZVRvb2xiYXIoKTsKLQkJCXRoaXMudG9vbGJhci5pbml0KHRoaXMuaW1nUGF0aCk7Ci0JCX0JCQotCQkKLQkJLy8gcmVnaXN0ZXIgYXV0byB3cmFwIGVsZW1lbnQKLQkJaWYgKCB0aGlzLmF1dG9XcmFwRWxlbWVudHMubGVuZ3RoID4gMCApIHsKLQkJCXdpbmRvdy5vbnJlc2l6ZSA9IGZ1bmN0aW9uKGUpIHsKLQkJCQljb250ZW50UGFnZS5yZXNpemVCbG9ja1RleHQoKTsKLQkJCX0JCQotCQkJdGhpcy5yZXNpemVCbG9ja1RleHQoKTsKLQkJfQotCQkKLQkJLy9hbGVydCgiY29udGVudCBvbiBsb2FkOiAiICsgbG9jYXRpb24uaHJlZik7Ci0JCQotCQlpZiAoIHRoaXMucHJvY2Vzc1BhZ2UgKSB7Ci0JCQl0aGlzLnByb2Nlc3NQYWdlLm9ubG9hZCgpOwotCQl9IAotCQkKLQkJaWYgKCBhcHAgIT0gbnVsbCApIHsKLQkJCWlmICggIWFwcC5pc0luaXRpYWxpemVkKCkgKSB7Ci0JCQkJdmFyIGNhbGxiYWNrID0gZnVuY3Rpb24oKSB7Ci0JCQkJLy9hbGVydCgiY29udGVudCBvbiBsb2FkOiBpbiBjYWxsYmFjayIpOwotCQkJCQlhcHAub25Db250ZW50TG9hZGVkKGxvY2F0aW9uLmhyZWYpOwotCQkJCQlzZWxmLmJ1aWxkQnJlYWRjcnVtbnMoKTsKLQkJCQl9OwotCQkJCWFwcC5hZGRQb3N0SW5pdENhbGxiYWNrKGNhbGxiYWNrKTsKLQkJCQkKLQkJCX0gZWxzZSB7Ci0JCQkJLy9hbGVydCgiY29udGVudCBvbiBsb2FkOiBjYWxsaW5nIGJyZWFkQnJlYWRjcnVtYnMiKTsJCi0JCQkJYXBwLm9uQ29udGVudExvYWRlZChsb2NhdGlvbi5ocmVmKTsKLQkJCQlzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsgc2VsZi5idWlsZEJyZWFkY3J1bW5zKCk7IH0sIDEwKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXRoaXMuYnVpbGRCcmVhZGNydW1ucygpOwotCQl9Ci0JCQotCQkvL2FsZXJ0KCJjb250ZW50IHBhZ2UgbG9hZGVkIik7Ci0JCQotCQkvLyB1c2VyIGNhbiBhZGQgY3VzdG9taXphdGlvbiBjb2RlIGhlcmUKLQkJLy8gdGhpcyBtZXRob2Qgd2lsbCBiZSBjYWxsZWQgd2hlbiB0aGUgcGFnZSBpcyBsb2FkZWQKLQkJLy8gdGhpcyBpcyBlcXVpdmFsZW50IHRvIGluc2VydGluZyBqYXZhc2NyaXB0IGltbWVkaWF0ZWx5IGJlZm9yZSB0aGUgPC9odG1sPiB0YWcKLQkJCi0JfSwKLQkKLQlidWlsZEJyZWFkY3J1bW5zIDogZnVuY3Rpb24oKSB7Ci0JCWlmICggdGhpcy5wcm9jZXNzUGFnZSApIHsKLQkJCXRoaXMucHJvY2Vzc1BhZ2UuYnVpbGRQcm9jZXNzRWxlbWVudEJyZWFkQ3J1bWIobG9jYXRpb24uaHJlZik7Ci0JCX0gZWxzZSB7Ci0JCQl0aGlzLl9idWlsZEJyZWFkY3J1bW5zKGxvY2F0aW9uLmhyZWYpOwotCQl9IAotCX0sCi0JCi0JcmVzaXplQmxvY2tUZXh0OiBmdW5jdGlvbigpIHsKLQkJdmFyIG5ld1dpZHRoID0gd2luZG93LmRvY3VtZW50LmJvZHkub2Zmc2V0V2lkdGggLSAyMDsKLQkJZm9yICggdmFyIGkgPSAwOyBpIDwgdGhpcy5hdXRvV3JhcEVsZW1lbnRzLmxlbmd0aDsgaSsrICkgewotCQkJdmFyIGVsZW0gPSB0aGlzLmF1dG9XcmFwRWxlbWVudHNbaV07Ci0JCQllbGVtLnN0eWxlLndpZHRoPW5ld1dpZHRoICsgInB4IjsgLy8gZmlyZWZveCBkb2VzIG5vdCB3b3JrIHdpdGhvdXQgc3BlY2lmeWluZyB0aGUgdW5pdAotCQl9Ci0JfSwKLQkKLQkKLQlhZGRBdXRvV3JhcEVsZW1lbnQ6IGZ1bmN0aW9uKGVsZW0pIHsKLQkJdGhpcy5hdXRvV3JhcEVsZW1lbnRzLnB1c2goZWxlbSk7Ci0JfSwKLQkKLQkvLyB1dGlsaXR5IG1ldGhvZHMKLQlnZXRVcmxQYXJhbWV0ZXJzOiBmdW5jdGlvbihxdWVyeVN0cikKLQl7Ci0JCXZhciBhcnIgPSBuZXcgQXJyYXkoKTsJCi0JCXZhciBwYWlycyA9IHF1ZXJ5U3RyLnNwbGl0KCImIik7Ci0JICAgCWZvciAodmFyIGkgPSAwOyBpIDwgcGFpcnMubGVuZ3RoOyBpKyspIHsKLQkgICAgIAkJdmFyIHBvcyA9IHBhaXJzW2ldLmluZGV4T2YoJz0nKTsKLQkgICAgIAkJaWYgKHBvcyA9PSAtMSkgY29udGludWU7Ci0JICAgICAJCXZhciBhcmduYW1lID0gcGFpcnNbaV0uc3Vic3RyaW5nKDAscG9zKTsKLQkgICAgIAkJdmFyIHZhbHVlID0gcGFpcnNbaV0uc3Vic3RyaW5nKHBvcysxKTsgICAgCQotCSAgICAgCQlhcnJbYXJnbmFtZV0gPSB2YWx1ZTsKLQkJfQotCQkKLQkJcmV0dXJuIGFycjsKLQl9LAotCi0JZ2V0QXBwIDogZnVuY3Rpb24oKSB7Ci0JCWlmKCB0eXBlb2YgdGhlQXBwICE9ICJ1bmRlZmluZWQiKSB7Ci0JCQlyZXR1cm4gdGhlQXBwOwotCQl9IGVsc2UgaWYgKCB3aW5kb3cucGFyZW50ICYmIHR5cGVvZiB3aW5kb3cucGFyZW50LnRoZUFwcCAhPSAidW5kZWZpbmVkIikgewotCQkJcmV0dXJuIHdpbmRvdy5wYXJlbnQudGhlQXBwOwotCQl9Ci0JCi0JCXJldHVybiBudWxsOwotCX0sCi0JCi0JZ2V0Vmlld0ZyYW1lOiBmdW5jdGlvbigpIHsKLQkKLQkJdmFyIGFwcCA9IHRoaXMuZ2V0QXBwKCk7Ci0JCWlmICggYXBwICE9IG51bGwgKSB7Ci0JCQotCQkJLy8gbWFrZSBzdXJlIHRoZSBhcHAgaXMgaW5pdGlhbGl6ZWQKLQkJCWlmICggYXBwLmlzSW5pdGlhbGl6ZWQoKSApIHsKLQkJCQlyZXR1cm4gYXBwLm5hdjsKLQkJCX0gZWxzZSB7IAotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9Ci0JCQkJCi0JCXZhciB2aWV3RnJhbWUgPSBudWxsOwotCQlmb3IgKCB2YXIgaSA9IDA7IGkgPCB3aW5kb3cucGFyZW50LmZyYW1lcy5sZW5ndGg7IGkrKyApIHsKLQkJCWlmICggd2luZG93LnBhcmVudC5mcmFtZXNbaV0ubmFtZSA9PSAnb3J5X3RvY19mcmFtZScgKSB7Ci0JCQkJdmFyIHRvY0ZyYW1lID0gd2luZG93LnBhcmVudC5mcmFtZXNbaV07Ci0JCQkJLy9hbGVydCh0b2NGcmFtZSk7Ci0JCQkJaWYgKHRvY0ZyYW1lLmZyYW1lcy5sZW5ndGggPiAwICkgewotCQkJCQlmb3IgKCB2YXIgeCA9IDA7IHggPCB0b2NGcmFtZS5mcmFtZXMubGVuZ3RoOyB4KysgKSB7Ci0JCQkJCQlpZiAodG9jRnJhbWUuZnJhbWVzW3hdLm5hbWUgPT0gJ29yeV90b2MnICkgewotCQkJCQkJCXZpZXdGcmFtZSA9IHRvY0ZyYW1lLmZyYW1lc1t4XTsKLQkJCQkJCQlicmVhazsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQotCQlyZXR1cm4gdmlld0ZyYW1lOwotCX0sCi0KLQlfYnVpbGRCcmVhZGNydW1uczogZnVuY3Rpb24odXJsKSB7Ci0JCXZhciB2aWV3RnJhbWUgPSB0aGlzLmdldFZpZXdGcmFtZSgpOwotCQlpZiAoIHZpZXdGcmFtZSA9PSBudWxsICkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJdmFyIGRpdiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJicmVhZGNydW1icyIpOwotCQlpZiAoZGl2ICE9IG51bGwgJiYgdmlld0ZyYW1lICE9IG51bGwgJiYgdmlld0ZyYW1lLmdldEJyZWFkY3J1bWJzICkgewotCQkJaWYgKCB0aGlzLmdldEFwcCgpID09IG51bGwgKSB7Ci0JCQkJLy8gZG9uJ3QgYnJlYWsgb2xkIGNvZGUKLQkJCQl2YXIgYmNzID0gdmlld0ZyYW1lLmdldEJyZWFkY3J1bWJzKHVybCk7Ci0JCQkJaWYgKCBiY3MgIT0gbnVsbCAmJiBiY3MubGVuZ3RoID4gMCApIHsKLQkJCQkJdGhpcy5zaG93QnJlYWRjcnVtbnMoZGl2LCBiY3MpOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJdmFyIHNlbGYgPSB0aGlzOwotCQkJCXZhciBjYWxsYmFjayA9IGZ1bmN0aW9uKGJjcykgewotCQkJCQlpZiAoIGJjcyAhPSBudWxsICYmIGJjcy5sZW5ndGggPiAwICkgewotCQkJCQkJc2VsZi5zaG93QnJlYWRjcnVtbnMoZGl2LCBiY3MpOwotCQkJCQl9Ci0JCQkJfTsKLQkJCQkJCi0JCQkJaWYgKGNvbnRlbnRQYWdlLm5vZGVJbmZvICE9IG51bGwgJiYgY29udGVudFBhZ2Uubm9kZUluZm8ubGVuZ3RoID4gMCApIHsKLQkJCQkJdmlld0ZyYW1lLmdldEJyZWFkY3J1bWJzQnlQYXRoKGNvbnRlbnRQYWdlLm5vZGVJbmZvLCBudWxsLCBjYWxsYmFjayk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJLy8gZG8gbm90aGluZwotCQkJCQkvL3ZpZXdGcmFtZS5nZXRCcmVhZGNydW1icyh1cmwsIGNhbGxiYWNrKTsKLQkJCQl9Ci0JCQkJCi0JCQl9Ci0JCQkKLQkJfQotCQotCX0sCi0KLQotCXNob3dCcmVhZGNydW1uczogZnVuY3Rpb24oZGl2LCAvKmFycmF5Ki9iY3MpIHsKLQkJaWYgKGRpdiA9PSBudWxsIHx8IGJjcyA9PSBudWxsIHx8IGJjcy5sZW5ndGggPT0gMCAgKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCXZhciBodG1sID0gW107Ci0JCXZhciBzbGVuID0gMDsKLQkJZm9yICh2YXIgaSA9IDA7IGkgPCBiY3MubGVuZ3RoOyBpKysgKSB7Ci0JCQl2YXIgYmMgPSBiY3NbaV07IC8vIHt1cmw6dXJsLCB0aXRsZTp0aXRsZX0KLQkJCWlmICggaSA+IDAgKSB7Ci0JCQkJaHRtbFtzbGVuKytdID0gIjxzcGFuPiZuYnNwOz4mbmJzcDs8L3NwYW4+IjsKLQkJCX0KLQotCQkJLy8gZXNjYXBlIHRoZSBxdW90ZXMKLQkJCXZhciB1cmwgPSBiYy51cmw7Ci0JCQl1cmwgPSB1cmwucmVwbGFjZSgvJy9nLCAiXFwnIik7Ci0JCQl1cmwgPSB1cmwucmVwbGFjZSgvXCIvZywgIlxcXCIiKTsKLQotCQkJaHRtbCA9IGh0bWwuY29uY2F0KFsiPGEgaHJlZj1cIiIsIHVybCwgIlwiPiIsIGJjLnRpdGxlLCAiPC9hPiJdKSA7Ci0JCQlzbGVuID0gaHRtbC5sZW5ndGg7Ci0JCX0KLQotCQl2YXIgc3RyID0gWyI8dGFibGUgYm9yZGVyPVwiMFwiIGNlbGxwYWRkaW5nPVwiMFwiIGNlbGxzcGFjaW5nPVwiMFwiIHdpZHRoPVwiMTAwJVwiPiIsCi0JCQkiPHRyPjx0ZCBhbGlnbj1cImxlZnRcIj4iXTsKLQkJc3RyID0gc3RyLmNvbmNhdChodG1sKTsKLQkJc3RyID0gc3RyLmNvbmNhdChbIjwvdGQ+PHRyPiIsICI8L3RhYmxlPiJdKTsKLQkJZGl2LmlubmVySFRNTCA9IHN0ci5qb2luKCIiKTsKLQl9LAotCQotCQotCXJlc29sdmVVcmw6IGZ1bmN0aW9uKHVybCkgewotCi0JCS8vIG5vdGU6IGRvbid0IGNhbGwgdGhlIGFwcC5yZXNvbHZlQ29udGVudHVybCgpIHNpbmNlIHRoZSBjb250ZW50IHVybCBtaWdodCBub3QgYmUgc2V0IHlldAotCQkvLyB1c2UgdGhlIHdpbmRvdydzIHVybCBkaXJlY3RseQotCQlpZiAoIHVybC5pbmRleE9mKCIuLyIpID09IDAgKSB7CQkJCi0JCQkJdmFyIGJhc2UgPSB3aW5kb3cubG9jYXRpb24uaHJlZjsKLQkJCQkvL2FsZXJ0KCJiYXNlOiIgKyBiYXNlKTsKLQkJCQl2YXIgaSA9IGJhc2UubGFzdEluZGV4T2YoIi8iKTsKLQkJCQl1cmwgPSBiYXNlLnN1YnN0cmluZygwLCBpKSArIHVybC5zdWJzdHJpbmcoMSk7Ci0JCX0gCi0JCQotCQlyZXR1cm4gdXJsOwotCX0sCi0JCi0JLyogZ2V0IHRoZSBwYWdlIGd1aWQsIGl0J3MgdGhlIGd1aWQgb2YgdGhlIGVsZW1lbnQgb3IgcGFnZSovCi0JZ2V0UGFnZUlkIDogZnVuY3Rpb24oKSB7Ci0JCXZhciBlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInBhZ2UtZ3VpZCIpOwotCQlpZiAoIGUgIT0gbnVsbCApIHsKLQkJCXJldHVybiBlLmdldEF0dHJpYnV0ZSgidmFsdWUiKTsKLQkJfQotCQkKLQkJcmV0dXJuIG51bGw7Ci0JfSwKLQkKLQlzYXZlQXNCb29rbWFyazogZnVuY3Rpb24oKSB7Ci0JCi0gICAgICAgICAvLyBmb3IgSUUsIGRvZXMgbm90IHdvcmsgZm9yIGxvY2FsIGZpbGUgYnJvd3NpbmcKLSAgICAgICAgIC8vIG9ubHkgb24gc2VydmVyCi0KLQkJLy92YXIgYXBwID0gdGhpcy5nZXRBcHAoKTsKLQkJdmFyIHVybCA9IGxvY2F0aW9uLmhyZWY7Ci0JCXZhciB0aXRsZSA9IGRvY3VtZW50LnRpdGxlOwkJCQotIAkJaWYgKHdpbmRvdy5zaWRlYmFyKSB7IAotICAgICAgICAgICAgLy8gZm9yIE1vemlsbGEgRmlyZWZveAotICAgICAgICAgICAgd2luZG93LnNpZGViYXIuYWRkUGFuZWwodGl0bGUsIHVybCwgIiIpOwotICAgICAgICB9IGVsc2UgaWYoIHdpbmRvdy5leHRlcm5hbCApIHsgCi0gICAgICAgICAgICB3aW5kb3cuZXh0ZXJuYWwuQWRkRmF2b3JpdGUodXJsLCB0aXRsZSk7Ci0gICAgICAgIH0gZWxzZSBpZih3aW5kb3cub3BlcmEgJiYgd2luZG93LnByaW50KSB7IAotICAgICAgICAgICAgIAotICAgICAgICB9Ci0gICAgICAgIAotIAl9LAotCQotCWlzRmlsZVVybDogZnVuY3Rpb24odXJsKSB7Ci0JCXJldHVybiAodXJsICE9IG51bGwpICYmICh1cmwudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJmaWxlOi8vIikgPT0gMCk7Ci0JfQotCS8vIGhlbHBlciBtZXRob2RzCi0KLX07CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvc2NyaXB0cy9wcm9jZXNzRWxlbWVudERhdGEuanMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvc2NyaXB0cy9wcm9jZXNzRWxlbWVudERhdGEuanMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5ZmZiNmEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L3NjcmlwdHMvcHJvY2Vzc0VsZW1lbnREYXRhLmpzCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLyAKLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS8vIGR5bmFtaWNhbGx5IGdlbmVyYXRlZCBwcm9jZXNzIGxheW91dCByZWxhdGVkIGRhdGEgZnJvbSBSTUMgcHVibGlzaGluZyBzZXJ2aWNlIApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L3hzbC9hY3Rpdml0eS54c2wgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQveHNsL2FjdGl2aXR5LnhzbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTViNjZkYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQveHNsL2FjdGl2aXR5LnhzbAorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLQotPHhzbDpzdHlsZXNoZWV0IHZlcnNpb249IjEuMCIKLQl4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIKLQl4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIj4KLQotPHhzbDpvdXRwdXQgbWV0aG9kPSJodG1sIiB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgCi0JZG9jdHlwZS1wdWJsaWM9Ii0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAKLQlkb2N0eXBlLXN5c3RlbT0iaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCIgCi0JaW5kZW50PSJ5ZXMiLz4KLQkKLQk8eHNsOmluY2x1ZGUgaHJlZj0icmVzb3VyY2VzLnhzbCIvPgotCTx4c2w6aW5jbHVkZSBocmVmPSJjb21tb24ueHNsIi8+Ci0JPHhzbDppbmNsdWRlIGhyZWY9Im1hcHBpbmcueHNsIi8+Ci0KLQk8eHNsOnRlbXBsYXRlIG1hdGNoPSIvRWxlbWVudCI+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iZWxlbWVudFR5cGUiIHNlbGVjdD0iQFR5cGUiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJlbGVtZW50VHlwZU5hbWUiIHNlbGVjdD0iQFR5cGVOYW1lIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iZWxlbWVudE5hbWUiIHNlbGVjdD0iQE5hbWUiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJlbGVtZW50UHJlc2VudGF0aW9uTmFtZSIgc2VsZWN0PSJARGlzcGxheU5hbWUiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJiYWNrUGF0aCIgc2VsZWN0PSJAQmFja1BhdGgiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJpbWFnZVBhdGgiIHNlbGVjdD0iY29uY2F0KCRiYWNrUGF0aCwgJ2ltYWdlcy8nKSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InNoYXBlSW1hZ2UiIHNlbGVjdD0iY29uY2F0KCRiYWNrUGF0aCxAU2hhcGVpY29uVXJsKSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InByZXNlbnRhdGlvbiIgc2VsZWN0PSJyZWZlcmVuY2VbQG5hbWU9J3ByZXNlbnRhdGlvbiddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iY29udGVudERlc2NyaXB0aW9uIiBzZWxlY3Q9IiRwcmVzZW50YXRpb24vRWxlbWVudCIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImNvcHlyaWdodCIgc2VsZWN0PSJjb3B5cmlnaHQiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJzaG93VHJlZUJyb3dzZXIiIHNlbGVjdD0iQHNob3dUcmVlQnJvd3NlciIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InJlc3BvbnNpYmxlUm9sZSIgc2VsZWN0PSJyZWZlcmVuY2VbQG5hbWU9J3Jlc3BvbnNpYmxlUm9sZSddL0VsZW1lbnRbQFR5cGU9J1JvbGUnXSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InF1ZXJ5U3RyaW5nIiBzZWxlY3Q9IkBxdWVyeVN0cmluZyIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InJlbFByb2Nlc3NQYXRoIiBzZWxlY3Q9IkByZWxQcm9jZXNzUGF0aCIvPgotCQk8aHRtbD4KLQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9ImxhbmciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbGFuZyIvPjwveHNsOmF0dHJpYnV0ZT4KLQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9InhtbDpsYW5nIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGxhbmciLz48L3hzbDphdHRyaWJ1dGU+Ci0JCQk8aGVhZD4KLQkJCQk8dGl0bGU+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50VHlwZU5hbWUiLz46IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudFByZXNlbnRhdGlvbk5hbWUiLz48L3RpdGxlPgotCQkJCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+Ci0JCQkJCXZhciBxdWVyeVN0ciA9IGxvY2F0aW9uLnNlYXJjaDsKLQkJCQkJZG9jdW1lbnQud3JpdGUoIiZsdDttZXRhIGh0dHAtZXF1aXY9XCJyZWZyZXNoXCIgY29udGVudD1cIjA7dXJsPTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAZGVmYXVsdFRhYlVybCIvPiIgKyBxdWVyeVN0ciArICJcIiZndDsiKTsKLQkJCQk8L3NjcmlwdD4KLQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0idW1hTWV0YVRhZ3MiPgotCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudFR5cGUiIHNlbGVjdD0iJGVsZW1lbnRUeXBlIi8+Ci0JCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50TmFtZSIgc2VsZWN0PSIkZWxlbWVudE5hbWUiLz4KLQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnRQcmVzZW50YXRpb25OYW1lIiBzZWxlY3Q9IiRlbGVtZW50UHJlc2VudGF0aW9uTmFtZSIvPgotCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJPG1ldGEgbmFtZT0iZWxlbWVudF90eXBlIj4gCi0JCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJtYXBwaW5nIj4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50VHlwZSIgc2VsZWN0PSIkZWxlbWVudFR5cGUiLz4KLQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQk8L21ldGE+Ci0JCQkJPG1ldGEgbmFtZT0iZmlsZXR5cGUiIGNvbnRlbnQ9ImRlc2NyaXB0aW9uIi8+Ci0JCQkJPG1ldGEgbmFtZT0icm9sZSI+Ci0JCQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9ImNvbnRlbnQiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcmVzcG9uc2libGVSb2xlL0BEaXNwbGF5TmFtZSIvPjwveHNsOmF0dHJpYnV0ZT4KLQkJCQk8L21ldGE+Ci0JCQk8L2hlYWQ+CQkJCi0JCTwvaHRtbD4KLQk8L3hzbDp0ZW1wbGF0ZT4KLQotPC94c2w6c3R5bGVzaGVldD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC94c2wvYWN0aXZpdHlfZGVzYy54c2wgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQveHNsL2FjdGl2aXR5X2Rlc2MueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZWNlOTE4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC94c2wvYWN0aXZpdHlfZGVzYy54c2wKKysrIC9kZXYvbnVsbApAQCAtMSw0ODQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotCi08eHNsOnN0eWxlc2hlZXQgdmVyc2lvbj0iMS4wIgotCXhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIgotCXhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiPgotCi08eHNsOm91dHB1dCBtZXRob2Q9Imh0bWwiIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiAKLQlkb2N0eXBlLXB1YmxpYz0iLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iIAotCWRvY3R5cGUtc3lzdGVtPSJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIiAKLQlpbmRlbnQ9InllcyIvPgotCQotCTx4c2w6aW5jbHVkZSBocmVmPSJhY3Rpdml0eV9oZWxwZXIueHNsIi8+CQotCTx4c2w6aW5jbHVkZSBocmVmPSJwcm9wZXJ0eS54c2wiLz4KLQotCTx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii9FbGVtZW50Ij4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJlbGVtZW50VHlwZSIgc2VsZWN0PSJAVHlwZSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImVsZW1lbnRUeXBlTmFtZSIgc2VsZWN0PSJAVHlwZU5hbWUiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJlbGVtZW50TmFtZSIgc2VsZWN0PSJATmFtZSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImVsZW1lbnRQcmVzZW50YXRpb25OYW1lIiBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImJhY2tQYXRoIiBzZWxlY3Q9IkBCYWNrUGF0aCIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImltYWdlUGF0aCIgc2VsZWN0PSJjb25jYXQoJGJhY2tQYXRoLCAnaW1hZ2VzLycpIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0ic2hhcGVJbWFnZSIgc2VsZWN0PSJjb25jYXQoJGJhY2tQYXRoLEBTaGFwZWljb25VcmwpIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0icHJlc2VudGF0aW9uIiBzZWxlY3Q9InJlZmVyZW5jZVtAbmFtZT0ncHJlc2VudGF0aW9uJ10iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJjb250ZW50RGVzY3JpcHRpb24iIHNlbGVjdD0iJHByZXNlbnRhdGlvbi9FbGVtZW50Ii8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iY29weXJpZ2h0IiBzZWxlY3Q9ImNvcHlyaWdodCIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InNob3dUcmVlQnJvd3NlciIgc2VsZWN0PSJAc2hvd1RyZWVCcm93c2VyIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0icmVzcG9uc2libGVSb2xlIiBzZWxlY3Q9InJlZmVyZW5jZVtAbmFtZT0ncmVzcG9uc2libGVSb2xlJ10vRWxlbWVudFtAVHlwZT0nUm9sZSddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0icXVlcnlTdHJpbmciIHNlbGVjdD0iQHF1ZXJ5U3RyaW5nIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0icmVsUHJvY2Vzc1BhdGgiIHNlbGVjdD0iQHJlbFByb2Nlc3NQYXRoIi8+Ci0JCTxodG1sPgotCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0ibGFuZyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBsYW5nIi8+PC94c2w6YXR0cmlidXRlPgotCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0ieG1sOmxhbmciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbGFuZyIvPjwveHNsOmF0dHJpYnV0ZT4KLQkJCTxoZWFkPgotCQkJCTx0aXRsZT4KLQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50VHlwZU5hbWUiLz46IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudFByZXNlbnRhdGlvbk5hbWUiLz4KLQkJCQk8L3RpdGxlPgotCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJ1bWFNZXRhVGFncyI+Ci0JCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50VHlwZSIgc2VsZWN0PSIkZWxlbWVudFR5cGUiLz4KLQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnROYW1lIiBzZWxlY3Q9IiRlbGVtZW50TmFtZSIvPgotCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudFByZXNlbnRhdGlvbk5hbWUiIHNlbGVjdD0iJGVsZW1lbnRQcmVzZW50YXRpb25OYW1lIi8+Ci0JCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQk8bWV0YSBuYW1lPSJlbGVtZW50X3R5cGUiPgotCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0ibWFwcGluZyI+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudFR5cGUiIHNlbGVjdD0iJGVsZW1lbnRUeXBlIi8+Ci0JCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJPC9tZXRhPgotCQkJCTxtZXRhIG5hbWU9ImZpbGV0eXBlIiBjb250ZW50PSJkZXNjcmlwdGlvbiIvPgotCQkJCTxtZXRhIG5hbWU9InJvbGUiPgotCQkJCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJjb250ZW50Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHJlc3BvbnNpYmxlUm9sZS9ARGlzcGxheU5hbWUiLz48L3hzbDphdHRyaWJ1dGU+Ci0JCQkJPC9tZXRhPgotCQkJCTxsaW5rIHJlbD0iU3R5bGVTaGVldCIgaHJlZj0ieyRiYWNrUGF0aH1jc3MvZGVmYXVsdC5jc3MiIHR5cGU9InRleHQvY3NzIi8+Ci0JCQkJPHNjcmlwdCBzcmM9InskYmFja1BhdGh9c2NyaXB0cy9Db250ZW50UGFnZVJlc291cmNlLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ii8+Ci0JCQkJPHNjcmlwdCBzcmM9InskYmFja1BhdGh9c2NyaXB0cy9Db250ZW50UGFnZVNlY3Rpb24uanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiLz4KLQkJCQk8c2NyaXB0IHNyYz0ieyRiYWNrUGF0aH1zY3JpcHRzL0NvbnRlbnRQYWdlU3ViU2VjdGlvbi5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCIvPgotCQkJCTxzY3JpcHQgc3JjPSJ7JGJhY2tQYXRofXNjcmlwdHMvQWN0aXZpdHlUcmVlVGFibGUuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiLz4KLQkJCQk8c2NyaXB0IHNyYz0ieyRiYWNrUGF0aH1zY3JpcHRzL1Byb2Nlc3NFbGVtZW50UGFnZS5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCIvPgotCQkJCTxzY3JpcHQgc3JjPSJ7JGJhY2tQYXRofXNjcmlwdHMvQ29udGVudFBhZ2VUb29sYmFyLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ii8+Ci0JCQkJPHNjcmlwdCBzcmM9InskYmFja1BhdGh9c2NyaXB0cy9jb250ZW50UGFnZS5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCIvPgotCQkJCTxzY3JpcHQgc3JjPSJ7JGJhY2tQYXRofXNjcmlwdHMvcHJvY2Vzc0VsZW1lbnREYXRhLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ii8+Ci0JCQkJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij4KLQkJCQkJdmFyIGRlZmF1bHRRdWVyeVN0ciA9ICc8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHF1ZXJ5U3RyaW5nIi8+JzsKLQkJCQkJdmFyIGJhY2tQYXRoID0gJzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkYmFja1BhdGgiLz4nOwotCQkJCQl2YXIgaW1nUGF0aCA9ICc8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGltYWdlUGF0aCIvPic7Ci0JCQkJCXZhciBub2RlSW5mbz1udWxsOwotCQkJCQljb250ZW50UGFnZS5wcmVsb2FkKGltZ1BhdGgsIGJhY2tQYXRoLCBub2RlSW5mbywgZGVmYXVsdFF1ZXJ5U3RyLCBmYWxzZSwgdHJ1ZSwgZmFsc2UpOwotCQkJCTwvc2NyaXB0PgotCQkJPC9oZWFkPgotCQkJPGJvZHk+Ci0JCQkJPGRpdiBpZD0iYnJlYWRjcnVtYnMiLz4KLQkJCQk8dGFibGUgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLQkJCQkJPHRyPgotCQkJCQkJPHRkIHZhbGlnbj0idG9wIj4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0ib3ZlcnZpZXciPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudFR5cGUiIHNlbGVjdD0iJGVsZW1lbnRUeXBlIi8+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50VHlwZU5hbWUiIHNlbGVjdD0iJGVsZW1lbnRUeXBlTmFtZSIvPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudFByZXNlbnRhdGlvbk5hbWUiIHNlbGVjdD0iJGVsZW1lbnRQcmVzZW50YXRpb25OYW1lIi8+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50SWNvbiIgc2VsZWN0PSIkc2hhcGVJbWFnZSIvPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iYmFja1BhdGgiIHNlbGVjdD0iJGJhY2tQYXRoIi8+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJzaG93VHJlZUJyb3dzZXIiIHNlbGVjdD0iJHNob3dUcmVlQnJvd3NlciIvPgotCQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFjdGl2aXR5VGFicyIvPgotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJnZW5lcmFsVGV4dEZpZWxkU2VjdGlvbiI+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJmaWVsZExhYmVsIiBzZWxlY3Q9IiRzY29wZVRleHQiLz4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImZpZWxkVGV4dCIgc2VsZWN0PSIkY29udGVudERlc2NyaXB0aW9uL2F0dHJpYnV0ZVtAbmFtZT0nc2NvcGUnXSIvPgotCQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImdlbmVyYWxUZXh0RmllbGRTZWN0aW9uIj4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImZpZWxkTGFiZWwiIHNlbGVjdD0iJHB1cnBvc2VUZXh0Ii8+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJmaWVsZFRleHQiIHNlbGVjdD0iJGNvbnRlbnREZXNjcmlwdGlvbi9hdHRyaWJ1dGVbQG5hbWU9J3B1cnBvc2UnXSIvPgotCQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQkJPHhzbDppZiB0ZXN0PSIkZWxlbWVudFR5cGUgPSAnRGVsaXZlcnlQcm9jZXNzJyAiPgotCQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icHJvamVjdFNwZWNpZmljc1NlY3Rpb24iPgotCQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImNvbnRlbnREZXNjcmlwdGlvbiIgc2VsZWN0PSIkY29udGVudERlc2NyaXB0aW9uIi8+Ci0JCQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQkJPC94c2w6aWY+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InJlbGF0aW9uc2hpcHNTZWN0aW9uIi8+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImdlbmVyYWxUZXh0RmllbGRTZWN0aW9uIj4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImZpZWxkTGFiZWwiIHNlbGVjdD0iJGRlc2NyaXB0aW9uVGV4dCIvPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZmllbGRUZXh0IiBzZWxlY3Q9IiRjb250ZW50RGVzY3JpcHRpb24vYXR0cmlidXRlW0BuYW1lPSdtYWluRGVzY3JpcHRpb24nXSIvPgotCQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InByb3BlcnRpZXNTZWN0aW9uIj4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImNvbnRlbnREZXNjcmlwdGlvbiIgc2VsZWN0PSIkY29udGVudERlc2NyaXB0aW9uIi8+Ci0JCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iSWxsdXN0cmF0aW9uc1NlY3Rpb24iLz4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iZ2VuZXJhbFRleHRGaWVsZFNlY3Rpb24iPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZmllbGRMYWJlbCIgc2VsZWN0PSIkc3RhZmZpbmdUZXh0Ii8+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJmaWVsZFRleHQiIHNlbGVjdD0iJGNvbnRlbnREZXNjcmlwdGlvbi9hdHRyaWJ1dGVbQG5hbWU9J2hvd3RvU3RhZmYnXSIvPgotCQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InVzYWdlU2VjdGlvbiI+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJjb250ZW50RGVzY3JpcHRpb24iIHNlbGVjdD0iJGNvbnRlbnREZXNjcmlwdGlvbiIvPgotCQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImdlbmVyYWxUZXh0RmllbGRTZWN0aW9uIj4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImZpZWxkTGFiZWwiIHNlbGVjdD0iJGtleUNvbnNpZGVyYXRpb25zVGV4dCIvPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZmllbGRUZXh0IiBzZWxlY3Q9IiRjb250ZW50RGVzY3JpcHRpb24vYXR0cmlidXRlW0BuYW1lPSdrZXlDb25zaWRlcmF0aW9ucyddIi8+Ci0JCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iZ2VuZXJhbFRleHRGaWVsZFNlY3Rpb24iPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZmllbGRMYWJlbCIgc2VsZWN0PSIkYWx0ZXJuYXRpdmVzVGV4dCIvPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZmllbGRUZXh0IiBzZWxlY3Q9IiRjb250ZW50RGVzY3JpcHRpb24vYXR0cmlidXRlW0BuYW1lPSdhbHRlcm5hdGl2ZXMnXSIvPgotCQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9Im1vcmVJbmZvU2VjdGlvbiI+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJjb250ZW50RGVzY3JpcHRpb24iIHNlbGVjdD0iJGNvbnRlbnREZXNjcmlwdGlvbiIvPgotCQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImNvcHlyaWdodCI+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJjb3B5cmlnaHQiIHNlbGVjdD0iJGNvcHlyaWdodCIvPgotCQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQk8L3RkPgotCQkJCQk8L3RyPgotCQkJCTwvdGFibGU+Ci0JCQk8L2JvZHk+Ci0JCQk8c2NyaXB0IGxhbmd1YWdlPSJKYXZhU2NyaXB0IiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotCQkJCWNvbnRlbnRQYWdlLm9ubG9hZCgpOwotCQkJPC9zY3JpcHQ+Ci0JCTwvaHRtbD4KLQk8L3hzbDp0ZW1wbGF0ZT4KLQotCTx4c2w6dGVtcGxhdGUgbmFtZT0iYWN0aXZpdHlUYWJzIj4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJpbWFnZVBhdGgiIHNlbGVjdD0iY29uY2F0KC9FbGVtZW50L0BCYWNrUGF0aCwgJ2ltYWdlcy8nKSIvPgotCQk8dGFibGUgd2lkdGg9IjEwMCUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4KLQkJCTx0ciB2YWxpZ249Im1pZGRsZSI+Ci0JCQkJPHRkIHdpZHRoPSIxMCIgY2xhc3M9ImFjdGl2ZVRhYiI+Ci0JCQkJCTxpbWcgc3JjPSJ7JGltYWdlUGF0aH1zaGltLmdpZiIgd2lkdGg9IjEwIiBoZWlnaHQ9IjE3IiBhbHQ9IiIgdGl0bGU9IiIvPgotCQkJCTwvdGQ+Ci0JCQkJPHRkIG5vd3JhcD0ibm93cmFwIiBjbGFzcz0iYWN0aXZlVGFiIj4KLQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRkZXNjcmlwdGlvblRleHQiLz4KLQkJCQk8L3RkPgotCQkJCTx0ZCB3aWR0aD0iMjEiPgotCQkJCQk8aW1nIHNyYz0ieyRpbWFnZVBhdGh9dGFiX21pZGRsZS1hX2kuZ2lmIiB3aWR0aD0iMjEiIGhlaWdodD0iMTciIGFsaWduPSJhYnNtaWRkbGUiIGFsdD0iIiB0aXRsZT0iIi8+Ci0JCQkJPC90ZD4KLQkJCQk8dGQgbm93cmFwPSJub3dyYXAiIGNsYXNzPSJ0YWIiPgotCQkJCQk8YSBjbGFzcz0idGFiIiBpZD0iVEFCX1dCUyI+Ci0JCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0idGFiVXJsQXR0cmlidXRlIj4KLQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0idXJsIiBzZWxlY3Q9ImNvbmNhdCgvRWxlbWVudC9AQmFja1BhdGgsIHRhYnMvdGFiW0BuYW1lPSdXQlMnXS9AdXJsKSIvPgotCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCTxzcGFuIHN0eWxlPSJ3aGl0ZS1zcGFjZTpub3dyYXA7Ij4KLQkJCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHdic1RleHQiLz4KLQkJCQkJCTwvc3Bhbj4KLQkJCQkJPC9hPgotCQkJCTwvdGQ+Ci0JCQkJPHRkIHdpZHRoPSIxIj4KLQkJCQkJPGltZyBzcmM9InskaW1hZ2VQYXRofXRhYl9taWRkbGUtaV9pLmdpZiIgd2lkdGg9IjIxIiBoZWlnaHQ9IjE3IiBhbGlnbj0iYWJzbWlkZGxlIiBhbHQ9IiIgdGl0bGU9IiIvPgotCQkJCTwvdGQ+Ci0JCQkJPHRkIG5vd3JhcD0ibm93cmFwIiBjbGFzcz0idGFiIj4KLQkJCQkJPGEgY2xhc3M9InRhYiIgaWQ9IlRBQl9UQlMiPgotCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InRhYlVybEF0dHJpYnV0ZSI+Ci0JCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9InVybCIgc2VsZWN0PSJjb25jYXQoL0VsZW1lbnQvQEJhY2tQYXRoLCB0YWJzL3RhYltAbmFtZT0nVEJTJ10vQHVybCkiLz4KLQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQk8c3BhbiBzdHlsZT0id2hpdGUtc3BhY2U6bm93cmFwOyI+Ci0JCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR0YnNUZXh0Ii8+Ci0JCQkJCQk8L3NwYW4+Ci0JCQkJCTwvYT4KLQkJCQk8L3RkPgotCQkJCTx0ZCB3aWR0aD0iMjEiPgotCQkJCQk8aW1nIHNyYz0ieyRpbWFnZVBhdGh9dGFiX21pZGRsZS1pX2kuZ2lmIiB3aWR0aD0iMjEiIGhlaWdodD0iMTciIGFsaWduPSJhYnNtaWRkbGUiIGFsdD0iIiB0aXRsZT0iIi8+Ci0JCQkJPC90ZD4KLQkJCQk8dGQgbm93cmFwPSJub3dyYXAiIGNsYXNzPSJ0YWIiPgotCQkJCQk8YSBjbGFzcz0idGFiIiBpZD0iVEFCX1dQQlMiPgotCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InRhYlVybEF0dHJpYnV0ZSI+Ci0JCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9InVybCIgc2VsZWN0PSJjb25jYXQoL0VsZW1lbnQvQEJhY2tQYXRoLCB0YWJzL3RhYltAbmFtZT0nV1BCUyddL0B1cmwpIi8+Ci0JCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQkJPHNwYW4gc3R5bGU9IndoaXRlLXNwYWNlOm5vd3JhcDsiPgotCQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkd3Bic1RleHQiLz4KLQkJCQkJCTwvc3Bhbj4KLQkJCQkJPC9hPgotCQkJCTwvdGQ+Ci0JCQkJPHRkIHdpZHRoPSIyMSI+Ci0JCQkJCTxpbWcgc3JjPSJ7JGltYWdlUGF0aH10YWJfZW5kLWkuZ2lmIiB3aWR0aD0iMjEiIGhlaWdodD0iMTciIGFsdD0iIiB0aXRsZT0iIi8+Ci0JCQkJPC90ZD4KLQkJCQk8dGQgd2lkdGg9IjUwJSI+Ci0JCQkJCTxpbWcgc3JjPSJ7JGltYWdlUGF0aH1zaGltLmdpZiIgd2lkdGg9IjEwIiBoZWlnaHQ9IjE3IiBhbHQ9IiIgdGl0bGU9IiIvPgotCQkJCTwvdGQ+Ci0JCQk8L3RyPgotCQkJPHRyPgotCQkJCTx0ZCBjb2xzcGFuPSIyIiBjbGFzcz0iYWN0aXZlVGFiIj4KLQkJCQkJPGltZyBzcmM9InskaW1hZ2VQYXRofXNoaW0uZ2lmIiBoZWlnaHQ9IjIiIGFsdD0iIiB0aXRsZT0iIi8+Ci0JCQkJPC90ZD4KLQkJCQk8dGQgY2xhc3M9ImFjdGl2ZVRhYiI+Ci0JCQkJCTxpbWcgc3JjPSJ7JGltYWdlUGF0aH10YWJfc3BhY2UuZ2lmIiB3aWR0aD0iMjEiIGhlaWdodD0iMiIgYWx0PSIiIHRpdGxlPSIiLz4KLQkJCQk8L3RkPgotCQkJCTx0ZCBjb2xzcGFuPSIyIj4KLQkJCQkJPGltZyBzcmM9InskaW1hZ2VQYXRofXNoaW0uZ2lmIiBoZWlnaHQ9IjIiIGFsdD0iIiB0aXRsZT0iIi8+Ci0JCQkJPC90ZD4KLQkJCTwvdHI+Ci0JCQk8dHI+Ci0JCQkJPHRkIGNvbHNwYW49IjEwIiBjbGFzcz0iYWN0aXZlVGFiIj4KLQkJCQkJPGltZyBzcmM9InskaW1hZ2VQYXRofXNoaW0uZ2lmIiBoZWlnaHQ9IjUiIGFsdD0iIiB0aXRsZT0iIi8+Ci0JCQkJPC90ZD4KLQkJCTwvdHI+Ci0JCTwvdGFibGU+Ci0JPC94c2w6dGVtcGxhdGU+Ci0KLQk8eHNsOnRlbXBsYXRlIG5hbWU9IklsbHVzdHJhdGlvbnNTZWN0aW9uIj4KLQkJPHhzbDppZiB0ZXN0PSJjb3VudChyZWZlcmVuY2VMaXN0W0BuYW1lPSdyb2FkbWFwcyddL0VsZW1lbnQpICsgY291bnQocmVmZXJlbmNlTGlzdFtAbmFtZT0nZXhhbXBsZXMnXS9FbGVtZW50KSA+IDAiPgotCQkJPGRpdiBjbGFzcz0ic2VjdGlvbkhlYWRpbmciPgotCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkaWxsdXN0cmF0aW9uc1RleHQiLz4KLQkJCTwvZGl2PgotCQkJPGRpdiBjbGFzcz0ic2VjdGlvbkNvbnRlbnQiPgotCQkJCTx0YWJsZSBjbGFzcz0ic2VjdGlvblRhYmxlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+Ci0JCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhZGRSZWZlcmVuY2VzIj4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJyZWZOYW1lIiBzZWxlY3Q9IiRyb2FkbWFwVGV4dCIvPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9InJlZkVsZW1lbnQiIHNlbGVjdD0icmVmZXJlbmNlTGlzdFtAbmFtZT0ncm9hZG1hcHMnXS9FbGVtZW50Ii8+Ci0JCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhZGRSZWZlcmVuY2VzIj4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJyZWZOYW1lIiBzZWxlY3Q9IiRleGFtcGxlc1RleHQiLz4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJyZWZFbGVtZW50IiBzZWxlY3Q9InJlZmVyZW5jZUxpc3RbQG5hbWU9J2V4YW1wbGVzJ10vRWxlbWVudCIvPgotCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCTwvdGFibGU+Ci0JCQk8L2Rpdj4KLQkJPC94c2w6aWY+Ci0JPC94c2w6dGVtcGxhdGU+Ci0KLQk8eHNsOnRlbXBsYXRlIG5hbWU9InByb2plY3RTcGVjaWZpY3NTZWN0aW9uIj4KLQkJPHhzbDpwYXJhbSBuYW1lPSJjb250ZW50RGVzY3JpcHRpb24iLz4KLQkJPHhzbDppZiB0ZXN0PSIkY29udGVudERlc2NyaXB0aW9uL2F0dHJpYnV0ZVtAbmFtZT0ndHlwZU9mQ29udHJhY3QnXSAhPSAnJyBvciAkY29udGVudERlc2NyaXB0aW9uL2F0dHJpYnV0ZVtAbmFtZT0ncHJvamVjdENoYXJhY3RlcmlzdGljcyddICE9ICcnIG9yICRjb250ZW50RGVzY3JpcHRpb24vYXR0cmlidXRlW0BuYW1lPSdwcm9qZWN0TWVtYmVyRXhwZXJ0aXNlJ10gIT0gJycgb3IgJGNvbnRlbnREZXNjcmlwdGlvbi9hdHRyaWJ1dGVbQG5hbWU9J3Jpc2tMZXZlbCddICE9ICcnIG9yICRjb250ZW50RGVzY3JpcHRpb24vYXR0cmlidXRlW0BuYW1lPSdzY2FsZSddICE9ICcnIj4KLQkJCTxkaXYgY2xhc3M9InNlY3Rpb25IZWFkaW5nIj4KLQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb2plY3RTcGVjaWZpY3NUZXh0Ii8+Ci0JCQk8L2Rpdj4KLQkJCTxkaXYgY2xhc3M9InNlY3Rpb25Db250ZW50Ij4KLQkJCQk8dGFibGUgY2xhc3M9InNlY3Rpb25UYWJsZSIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiPgotCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icHJvcGVydHkiPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImZpZWxkTGFiZWwiIHNlbGVjdD0iJHR5cGVvZkNvbnRyYWN0VGV4dCIvPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImZpZWxkVGV4dCIgc2VsZWN0PSIkY29udGVudERlc2NyaXB0aW9uL2F0dHJpYnV0ZVtAbmFtZT0ndHlwZU9mQ29udHJhY3QnXSIvPgotCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icHJvcGVydHkiPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImZpZWxkTGFiZWwiIHNlbGVjdD0iJHByb2plY3RDaGFyYWN0ZXJpc3RpY3NUZXh0Ii8+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZmllbGRUZXh0IiBzZWxlY3Q9IiRjb250ZW50RGVzY3JpcHRpb24vYXR0cmlidXRlW0BuYW1lPSdwcm9qZWN0Q2hhcmFjdGVyaXN0aWNzJ10iLz4KLQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InByb3BlcnR5Ij4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJmaWVsZExhYmVsIiBzZWxlY3Q9IiRwcm9qZWN0TWVtYmVyRXhwZXJ0aXNlVGV4dCIvPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImZpZWxkVGV4dCIgc2VsZWN0PSIkY29udGVudERlc2NyaXB0aW9uL2F0dHJpYnV0ZVtAbmFtZT0ncHJvamVjdE1lbWJlckV4cGVydGlzZSddIi8+Ci0JCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJwcm9wZXJ0eSI+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZmllbGRMYWJlbCIgc2VsZWN0PSIkZXN0aW1hdGluZ1RlY2huaXF1ZVRleHQiLz4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJmaWVsZFRleHQiIHNlbGVjdD0iJGNvbnRlbnREZXNjcmlwdGlvbi9hdHRyaWJ1dGVbQG5hbWU9J2VzdGltYXRpbmdUZWNobmlxdWUnXSIvPgotCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icHJvcGVydHkiPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImZpZWxkTGFiZWwiIHNlbGVjdD0iJHJpc2tMZXZlbFRleHQiLz4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJmaWVsZFRleHQiIHNlbGVjdD0iJGNvbnRlbnREZXNjcmlwdGlvbi9hdHRyaWJ1dGVbQG5hbWU9J3Jpc2tMZXZlbCddIi8+Ci0JCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJwcm9wZXJ0eSI+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZmllbGRMYWJlbCIgc2VsZWN0PSIkc2NhbGVUZXh0Ii8+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZmllbGRUZXh0IiBzZWxlY3Q9IiRjb250ZW50RGVzY3JpcHRpb24vYXR0cmlidXRlW0BuYW1lPSdzY2FsZSddIi8+Ci0JCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJPC90YWJsZT4KLQkJCTwvZGl2PgotCQk8L3hzbDppZj4KLQk8L3hzbDp0ZW1wbGF0ZT4KLQotCTx4c2w6dGVtcGxhdGUgbmFtZT0idXNhZ2VTZWN0aW9uIj4KLQkJPHhzbDpwYXJhbSBuYW1lPSJjb250ZW50RGVzY3JpcHRpb24iLz4KLQkJPHhzbDppZiB0ZXN0PSIkY29udGVudERlc2NyaXB0aW9uL2F0dHJpYnV0ZVtAbmFtZT0ndXNhZ2VHdWlkYW5jZSddICE9ICcnIG9yICRjb250ZW50RGVzY3JpcHRpb24vYXR0cmlidXRlW0BuYW1lPSd1c2FnZU5vdGVzJ10gIT0gJyciPgotCQkJPGRpdiBjbGFzcz0ic2VjdGlvbkhlYWRpbmciPgotCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdXNhZ2VUZXh0Ii8+Ci0JCQk8L2Rpdj4KLQkJCTxkaXYgY2xhc3M9InNlY3Rpb25Db250ZW50Ij4KLQkJCQk8dGFibGUgY2xhc3M9InNlY3Rpb25UYWJsZSIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiPgotCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icHJvcGVydHkiPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImZpZWxkTGFiZWwiIHNlbGVjdD0iJHVzYWdlR3VpZGFuY2VUZXh0Ii8+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZmllbGRUZXh0IiBzZWxlY3Q9IiRjb250ZW50RGVzY3JpcHRpb24vYXR0cmlidXRlW0BuYW1lPSd1c2FnZUd1aWRhbmNlJ10iLz4KLQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InByb3BlcnR5Ij4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJmaWVsZExhYmVsIiBzZWxlY3Q9IiR1c2FnZU5vdGVzVGV4dCIvPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImZpZWxkVGV4dCIgc2VsZWN0PSIkY29udGVudERlc2NyaXB0aW9uL2F0dHJpYnV0ZVtAbmFtZT0ndXNhZ2VOb3RlcyddIi8+Ci0JCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJPC90YWJsZT4KLQkJCTwvZGl2PgotCQk8L3hzbDppZj4KLQk8L3hzbDp0ZW1wbGF0ZT4KLQotCTx4c2w6dGVtcGxhdGUgbmFtZT0icmVsYXRpb25zaGlwc1NlY3Rpb24iPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImNhdGVnb3JpZXMiIHNlbGVjdD0icmVmZXJlbmNlTGlzdFtAbmFtZT0nQ29udGVudEVsZW1lbnRfQ3VzdG9tQ2F0ZWdvcmllcyddL0VsZW1lbnQiLz4KLQkJPHhzbDppZiB0ZXN0PSJjb3VudChyZWZlcmVuY2VMaXN0W0BuYW1lPSd2YWxpZENvbnRleHQnXS9FbGVtZW50KSArIGNvdW50KHJlZmVyZW5jZVtAbmFtZT0nc3VwZXJBY3Rpdml0aWVzJ10vRWxlbWVudCkgKyBjb3VudChyZWZlcmVuY2VMaXN0W0BuYW1lPSdpbmNsdWRlc1BhdHRlcm5zJ10vRWxlbWVudCkgPiAwIj4KLQkJCTxkaXYgY2xhc3M9InNlY3Rpb25IZWFkaW5nIj4KLQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHJlbGF0aW9uc2hpcHNUZXh0Ii8+Ci0JCQk8L2Rpdj4KLQkJCTxkaXYgY2xhc3M9InNlY3Rpb25Db250ZW50Ij4KLQkJCQk8dGFibGUgY2xhc3M9InNlY3Rpb25UYWJsZSIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiPgotCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWRkUmVmZXJlbmNlcyI+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0icmVmTmFtZSIgc2VsZWN0PSIkY2F0ZWdvcmllc1RleHQiLz4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJyZWZFbGVtZW50IiBzZWxlY3Q9IiRjYXRlZ29yaWVzIi8+Ci0JCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCTx4c2w6Y2hvb3NlPgotCQkJCQkJPHhzbDp3aGVuIHRlc3Q9ImNvdW50KHJlZmVyZW5jZUxpc3RbQG5hbWU9J3ZhbGlkQ29udGV4dCddL0VsZW1lbnQpID4gMCI+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFkZGNvbnRleHRzIj4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9InJlZk5hbWUiIHNlbGVjdD0iJGNvbnRleHRUZXh0Ii8+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJyZWZFbGVtZW50IiBzZWxlY3Q9InJlZmVyZW5jZUxpc3RbQG5hbWU9J3ZhbGlkQ29udGV4dCddL0VsZW1lbnQiLz4KLQkJCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQkJPC94c2w6d2hlbj4KLQkJCQkJCTx4c2w6b3RoZXJ3aXNlPgotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhZGRjb250ZXh0cyI+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJyZWZOYW1lIiBzZWxlY3Q9IiRjb250ZXh0VGV4dCIvPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0icmVmRWxlbWVudCIgc2VsZWN0PSJyZWZlcmVuY2VbQG5hbWU9J2RlZmF1bHRDb250ZXh0J10vRWxlbWVudCIvPgotCQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQk8L3hzbDpvdGhlcndpc2U+Ci0JCQkJCTwveHNsOmNob29zZT4KLQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFkZFJlZmVyZW5jZXMiPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9InJlZk5hbWUiIHNlbGVjdD0iJHBhcmVudEFjdGl2aXRpZXNUZXh0Ii8+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0icmVmRWxlbWVudCIgc2VsZWN0PSJyZWZlcmVuY2VbQG5hbWU9J3N1cGVyQWN0aXZpdGllcyddL0VsZW1lbnQiLz4KLQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJPCEtLSAKLQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFkZFJlZmVyZW5jZXMiPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9InJlZk5hbWUiIHNlbGVjdD0iJGluY2x1ZGVkUGF0dGVybnNUZXh0Ii8+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0icmVmRWxlbWVudCIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0W0BuYW1lPSdpbmNsdWRlc1BhdHRlcm5zJ10vRWxlbWVudCIvPgotCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQkgLS0+Ci0JCQkJPC90YWJsZT4KLQkJCTwvZGl2PgotCQk8L3hzbDppZj4KLQk8L3hzbDp0ZW1wbGF0ZT4KLQotCTx4c2w6dGVtcGxhdGUgbmFtZT0icHJvcGVydGllc1NlY3Rpb24iPgotCQk8eHNsOnBhcmFtIG5hbWU9ImNvbnRlbnREZXNjcmlwdGlvbiIvPgotCQk8ZGl2IGNsYXNzPSJzZWN0aW9uSGVhZGluZyI+Ci0JCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb3BlcnRpZXNUZXh0Ii8+Ci0JCTwvZGl2PgotCQk8ZGl2IGNsYXNzPSJzZWN0aW9uQ29udGVudCI+Ci0JCQk8dGFibGUgY2xhc3M9InNlY3Rpb25UYWJsZSIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiID4KLQkJCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJ0aXRsZSI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9wZXJ0aWVzVGV4dCIvPjwveHNsOmF0dHJpYnV0ZT4KLQkJCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJzdW1tYXJ5Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb3BlcnRpZXNUZXh0Ii8+PC94c2w6YXR0cmlidXRlPgotCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJwcm9wZXJ0eSI+Ci0JCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJmaWVsZExhYmVsIiBzZWxlY3Q9IiRldmVudERyaXZlblRleHQiLz4KLQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImZpZWxkVGV4dCIgc2VsZWN0PSJhdHRyaWJ1dGVbQG5hbWU9J2lzRXZlbnREcml2ZW4nXSIvPgotCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InByb3BlcnR5Ij4KLQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImZpZWxkTGFiZWwiIHNlbGVjdD0iJG11bHRpcGxlT2NjdXJyZW5jZXNUZXh0Ii8+Ci0JCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJmaWVsZFRleHQiIHNlbGVjdD0iYXR0cmlidXRlW0BuYW1lPSdoYXNNdWx0aXBsZU9jY3VycmVuY2VzJ10iLz4KLQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCTx4c2w6aWYgdGVzdD0iYXR0cmlidXRlW0BuYW1lPSdpc09uZ29pbmcnXSI+Ci0JCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJwcm9wZXJ0eSI+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZmllbGRMYWJlbCIgc2VsZWN0PSIkb25nb2luZ1RleHQiLz4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJmaWVsZFRleHQiIHNlbGVjdD0iYXR0cmlidXRlW0BuYW1lPSdpc09uZ29pbmcnXSIvPgotCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCTwveHNsOmlmPgotCQkJCTx4c2w6aWYgdGVzdD0iYXR0cmlidXRlW0BuYW1lPSdpc09wdGlvbmFsJ10iPgotCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icHJvcGVydHkiPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImZpZWxkTGFiZWwiIHNlbGVjdD0iJG9wdGlvbmFsVGV4dCIvPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImZpZWxkVGV4dCIgc2VsZWN0PSJhdHRyaWJ1dGVbQG5hbWU9J2lzT3B0aW9uYWwnXSIvPgotCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCTwveHNsOmlmPgotCQkJCTx4c2w6aWYgdGVzdD0iYXR0cmlidXRlW0BuYW1lPSdpc1BsYW5uZWQnXSI+Ci0JCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJwcm9wZXJ0eSI+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZmllbGRMYWJlbCIgc2VsZWN0PSIkcGxhbm5lZFRleHQiLz4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJmaWVsZFRleHQiIHNlbGVjdD0iYXR0cmlidXRlW0BuYW1lPSdpc1BsYW5uZWQnXSIvPgotCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCTwveHNsOmlmPgotCQkJCTx4c2w6aWYgdGVzdD0iYXR0cmlidXRlW0BuYW1lPSdQbGFubmluZ0RhdGEnXSI+Ci0JCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJwcm9wZXJ0eSI+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZmllbGRMYWJlbCIgc2VsZWN0PSIkcGxhbm5pbmdEYXRhVGV4dCIvPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImZpZWxkVGV4dCIgc2VsZWN0PSJhdHRyaWJ1dGVbQG5hbWU9J1BsYW5uaW5nRGF0YSddIi8+Ci0JCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJPC94c2w6aWY+Ci0JCQkJPHhzbDppZiB0ZXN0PSJyZWZlcmVuY2VMaXN0W0BuYW1lPSdsaW5rVG9QcmVkZWNlc3NvciddL0VsZW1lbnQiPgotCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWRkUmVmZXJlbmNlcyI+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZmllbGRMYWJlbCIgc2VsZWN0PSIkcHJlZGVjZXNzb3JUZXh0Ii8+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudHMiIHNlbGVjdD0icmVmZXJlbmNlTGlzdFtAbmFtZT0nbGlua1RvUHJlZGVjZXNzb3InXS9FbGVtZW50Ii8+Ci0JCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJPC94c2w6aWY+Ci0JCQkJPHhzbDppZiB0ZXN0PSJhdHRyaWJ1dGVbQG5hbWU9J2lzUmVwZWF0YWJsZSddIj4KLQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InByb3BlcnR5Ij4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJmaWVsZExhYmVsIiBzZWxlY3Q9IiRyZXBlYXRhYmxlVGV4dCIvPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImZpZWxkVGV4dCIgc2VsZWN0PSJhdHRyaWJ1dGVbQG5hbWU9J2lzUmVwZWF0YWJsZSddIi8+Ci0JCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJPC94c2w6aWY+Ci0JCQk8L3RhYmxlPgotCQk8L2Rpdj4KLQk8L3hzbDp0ZW1wbGF0ZT4KLQotCTx4c2w6dGVtcGxhdGUgbmFtZT0iZ2VuZXJhbFRleHRGaWVsZFNlY3Rpb24iPgotCQk8eHNsOnBhcmFtIG5hbWU9ImZpZWxkTGFiZWwiLz4KLQkJPHhzbDpwYXJhbSBuYW1lPSJmaWVsZFRleHQiLz4KLQkJPHhzbDppZiB0ZXN0PSIkZmllbGRUZXh0ICE9ICcnIj4KLQkJCTxkaXYgY2xhc3M9InNlY3Rpb25IZWFkaW5nIj4KLQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGZpZWxkTGFiZWwiLz4KLQkJCTwvZGl2PgotCQkJPGRpdiBjbGFzcz0ic2VjdGlvbkNvbnRlbnQiPgotCQkJCTx0YWJsZSBjbGFzcz0ic2VjdGlvblRhYmxlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+Ci0JCQkJCTx0ciB2YWxpZ249InRvcCI+Ci0JCQkJCQk8dGQgY2xhc3M9InNlY3Rpb25UYWJsZVNpbmdsZUNlbGwiPgotCQkJCQkJCTx4c2w6dmFsdWUtb2YgZGlzYWJsZS1vdXRwdXQtZXNjYXBpbmc9InllcyIgc2VsZWN0PSIkZmllbGRUZXh0Ii8+Ci0JCQkJCQk8L3RkPgotCQkJCQk8L3RyPgotCQkJCTwvdGFibGU+Ci0JCQk8L2Rpdj4KLQkJPC94c2w6aWY+Ci0JPC94c2w6dGVtcGxhdGU+Ci0KLQk8eHNsOnRlbXBsYXRlIG5hbWU9Im1vcmVJbmZvU2VjdGlvbiI+Ci0JCTx4c2w6cGFyYW0gbmFtZT0iY29udGVudERlc2NyaXB0aW9uIi8+Ci0JCTx4c2w6aWYgdGVzdD0iY291bnQocmVmZXJlbmNlTGlzdFtAbmFtZT0nY29uY2VwdHMnXS9FbGVtZW50KSArIGNvdW50KHJlZmVyZW5jZUxpc3RbQG5hbWU9J2NoZWNrbGlzdHMnXS9FbGVtZW50KSArIGNvdW50KHJlZmVyZW5jZUxpc3RbQG5hbWU9J2NvbW11bmljYXRpb25zTWF0ZXJpYWxzJ10vRWxlbWVudCkgKyBjb3VudChyZWZlcmVuY2VMaXN0W0BuYW1lPSdndWlkZWxpbmVzJ10vRWxlbWVudCkgKyBjb3VudChyZWZlcmVuY2VMaXN0W0BuYW1lPSdzdXBwb3J0aW5nTWF0ZXJpYWxzJ10vRWxlbWVudCkgKyBjb3VudChyZWZlcmVuY2VMaXN0W0BuYW1lPSdyZXVzYWJsZUFzc2V0cyddL0VsZW1lbnQpID4gMCI+Ci0JCQk8ZGl2IGNsYXNzPSJzZWN0aW9uSGVhZGluZyI+Ci0JCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRtb3JlSW5mb1RleHQiLz4KLQkJCTwvZGl2PgotCQkJPGRpdiBjbGFzcz0ic2VjdGlvbkNvbnRlbnQiPgotCQkJCTx0YWJsZSBjbGFzcz0ic2VjdGlvblRhYmxlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+Ci0JCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhZGRDaGVja2xpc3RzIj4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJjaGVja2xpc3RzIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3RbQG5hbWU9J2NoZWNrbGlzdHMnXS9FbGVtZW50Ii8+Ci0JCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCTx4c2w6aWYgdGVzdD0icmVmZXJlbmNlTGlzdFtAbmFtZT0nY29tbXVuaWNhdGlvbnNNYXRlcmlhbHMnXSI+Ci0JCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWRkUmVmZXJlbmNlcyI+Ci0JCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9InJlZk5hbWUiIHNlbGVjdD0iJGNvbW11bmljYXRpb25zTWF0ZXJpYWxzVGV4dCIvPgotCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJyZWZFbGVtZW50IiBzZWxlY3Q9InJlZmVyZW5jZUxpc3RbQG5hbWU9J2NvbW11bmljYXRpb25zTWF0ZXJpYWxzJ10vRWxlbWVudCIvPgotCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJPC94c2w6aWY+Ci0JCQkJCTx4c2w6aWYgdGVzdD0icmVmZXJlbmNlTGlzdFtAbmFtZT0nZWR1Y2F0aW9uTWF0ZXJpYWxzJ10iPgotCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFkZFJlZmVyZW5jZXMiPgotCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJyZWZOYW1lIiBzZWxlY3Q9IiRlZHVjYXRpb25NYXRlcmlhbHNUZXh0Ii8+Ci0JCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9InJlZkVsZW1lbnQiIHNlbGVjdD0icmVmZXJlbmNlTGlzdFtAbmFtZT0nZWR1Y2F0aW9uTWF0ZXJpYWxzJ10vRWxlbWVudCIvPgotCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJPC94c2w6aWY+Ci0JCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhZGRHdWlkZWxpbmVzIj4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJndWlkZWxpbmVzIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3RbQG5hbWU9J2d1aWRlbGluZXMnXS9FbGVtZW50Ii8+Ci0JCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhZGRDb25jZXB0cyI+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iY29uY2VwdHMiIHNlbGVjdD0icmVmZXJlbmNlTGlzdC9FbGVtZW50W0BUeXBlPSdDb25jZXB0J10iLz4KLQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFkZFJldXNhYmxlQXNzZXRzIj4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJyZXVzYWJsZUFzc2V0cyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0W0BuYW1lPSdyZXVzYWJsZUFzc2V0cyddL0VsZW1lbnQiLz4KLQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFkZFJlZmVyZW5jZXMiPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9InJlZk5hbWUiIHNlbGVjdD0iJHN1cHBvcnRpbmdNYXRlcmlhbHNUZXh0Ii8+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0icmVmRWxlbWVudCIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0W0BuYW1lPSdzdXBwb3J0aW5nTWF0ZXJpYWxzJ10vRWxlbWVudCIvPgotCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWRkV2hpdGVQYXBlcnMiPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9IndoaXRlUGFwZXJzIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3QvRWxlbWVudFtAVHlwZT0nV2hpdGVwYXBlciddIi8+Ci0JCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJPC90YWJsZT4KLQkJCTwvZGl2PgotCQk8L3hzbDppZj4KLQk8L3hzbDp0ZW1wbGF0ZT4KLQotCTx4c2w6dGVtcGxhdGUgbmFtZT0iYWRkY29udGV4dHMiPgotCQk8eHNsOnBhcmFtIG5hbWU9InJlZk5hbWUiLz4KLQkJPHhzbDpwYXJhbSBuYW1lPSJyZWZFbGVtZW50Ii8+Ci0JCTx4c2w6aWYgdGVzdD0iJHJlZkVsZW1lbnQiPgotCQkJPHhzbDppZiB0ZXN0PSJjb3VudCgkcmVmRWxlbWVudCk+MCI+Ci0JCQkJPHRyIHZhbGlnbj0idG9wIj4KLQkJCQkJPHRoIGNsYXNzPSJzZWN0aW9uVGFibGVIZWFkaW5nIiBzY29wZT0icm93Ij4KLQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcmVmTmFtZSIvPgotCQkJCQk8L3RoPgotCQkJCQk8dGQgY2xhc3M9InNlY3Rpb25UYWJsZUNlbGwiPgotCQkJCQkJPHVsPgotCQkJCQkJCTx4c2w6Zm9yLWVhY2ggc2VsZWN0PSIkcmVmRWxlbWVudCI+Ci0JCQkJCQkJPHhzbDpzb3J0IHNlbGVjdD0iQERpc3BsYXlOYW1lIi8+Ci0JCQkJCQkJCTxsaT4KLQkJCQkJCQkJCTxhPgotCQkJCQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJARGlzcGxheU5hbWUiLz4KLQkJCQkJCQkJCTwvYT4KLQkJCQkJCQkJPC9saT4KLQkJCQkJCQk8L3hzbDpmb3ItZWFjaD4KLQkJCQkJCTwvdWw+Ci0JCQkJCTwvdGQ+Ci0JCQkJPC90cj4KLQkJCTwveHNsOmlmPgotCQk8L3hzbDppZj4KLQk8L3hzbDp0ZW1wbGF0ZT4KLQotPC94c2w6c3R5bGVzaGVldD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC94c2wvYWN0aXZpdHlfaGVscGVyLnhzbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC94c2wvYWN0aXZpdHlfaGVscGVyLnhzbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDk1NjkwNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQveHNsL2FjdGl2aXR5X2hlbHBlci54c2wKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci0KLTx4c2w6c3R5bGVzaGVldCB2ZXJzaW9uPSIxLjAiCi0JeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iCi0JeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSI+Ci0KLQk8eHNsOmluY2x1ZGUgaHJlZj0icmVzb3VyY2VzLnhzbCIvPgotCTx4c2w6aW5jbHVkZSBocmVmPSJjb21tb24ueHNsIi8+Ci0JPHhzbDppbmNsdWRlIGhyZWY9Im1hcHBpbmcueHNsIi8+Ci0JPHhzbDppbmNsdWRlIGhyZWY9Im92ZXJ2aWV3LnhzbCIvPgotCTx4c2w6aW5jbHVkZSBocmVmPSJndWlkYW5jZV9oZWxwZXIueHNsIi8+Ci0KLQk8eHNsOnRlbXBsYXRlIG5hbWU9InRhYlVybEF0dHJpYnV0ZSI+Ci0JCTx4c2w6cGFyYW0gbmFtZT0idXJsIi8+Ci0JCTx4c2w6YXR0cmlidXRlIG5hbWU9ImhyZWYiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdXJsIi8+PC94c2w6YXR0cmlidXRlPgotCTwveHNsOnRlbXBsYXRlPgotCi0JPHhzbDp0ZW1wbGF0ZSBuYW1lPSJkaXNwbGF5RGlhZ3JhbSI+Ci0JCTx4c2w6cGFyYW0gbmFtZT0iZGlhZ3JhbSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InNpbmdsZS1xdW90ZSI+JzwveHNsOnZhcmlhYmxlPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InNwZWNpYWwtcXVvdGUiPmA8L3hzbDp2YXJpYWJsZT4KLQkJPHAvPgotCQk8aW1nIGJvcmRlcj0iMCIgZGlhZ3JhbVR5cGU9InskZGlhZ3JhbS9AbmFtZX0iPgotCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0iaWQiPmRpYWdyYW1fPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRkaWFncmFtL0BuYW1lIi8+PC94c2w6YXR0cmlidXRlPgotCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0ic3JjIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGRpYWdyYW0vbWFwL0BzcmMiLz48L3hzbDphdHRyaWJ1dGU+Ci0JCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJhbHQiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJ0cmFuc2xhdGUoJGRpYWdyYW0vQGFsdCwkc2luZ2xlLXF1b3RlLCRzcGVjaWFsLXF1b3RlKSIvPjwveHNsOmF0dHJpYnV0ZT4KLQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9InRpdGxlIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0idHJhbnNsYXRlKCRkaWFncmFtL0BhbHQsJHNpbmdsZS1xdW90ZSwkc3BlY2lhbC1xdW90ZSkiLz48L3hzbDphdHRyaWJ1dGU+Ci0JCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJ1c2VtYXAiPiM8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGRpYWdyYW0vbWFwL0BuYW1lIi8+PC94c2w6YXR0cmlidXRlPgotCQk8L2ltZz4KLQkJPG1hcCBuYW1lPSJ7JGRpYWdyYW0vbWFwL0BuYW1lfSI+Ci0JCQk8eHNsOmZvci1lYWNoIHNlbGVjdD0iJGRpYWdyYW0vbWFwL2FyZWEiPgotCQkJCTxhcmVhPgotCQkJCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJocmVmIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGhyZWYiLz48L3hzbDphdHRyaWJ1dGU+Ci0JCQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9InJlbFBhdGgiPiw8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGd1aWQiLz48L3hzbDphdHRyaWJ1dGU+Ci0JCQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9ImFsdCI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBhbHQiLz48L3hzbDphdHRyaWJ1dGU+Ci0JCQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9InRpdGxlIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGFsdCIvPjwveHNsOmF0dHJpYnV0ZT4KLQkJCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0iY29vcmRzIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGNvb3JkcyIvPjwveHNsOmF0dHJpYnV0ZT4KLQkJCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0ic2hhcGUiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAc2hhcGUiLz48L3hzbDphdHRyaWJ1dGU+Ci0JCQkJPC9hcmVhPgotCQkJPC94c2w6Zm9yLWVhY2g+Ci0JCTwvbWFwPgotCTwveHNsOnRlbXBsYXRlPgotCi08L3hzbDpzdHlsZXNoZWV0PgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L3hzbC9hY3Rpdml0eV90YnMueHNsIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L3hzbC9hY3Rpdml0eV90YnMueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYmFmYTI5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC94c2wvYWN0aXZpdHlfdGJzLnhzbAorKysgL2Rldi9udWxsCkBAIC0xLDMyNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci0KLTx4c2w6c3R5bGVzaGVldCB2ZXJzaW9uPSIxLjAiCi0JeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iCi0JeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSI+Ci0KLTx4c2w6b3V0cHV0IG1ldGhvZD0iaHRtbCIgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIAotCWRvY3R5cGUtcHVibGljPSItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgCi0JZG9jdHlwZS1zeXN0ZW09Imh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiIAotCWluZGVudD0ieWVzIi8+Ci0JCi0JPHhzbDppbmNsdWRlIGhyZWY9ImFjdGl2aXR5X2hlbHBlci54c2wiLz4KLQk8eHNsOmluY2x1ZGUgaHJlZj0iZXNjYXBlLnhzbCIvPgkKLQotCTx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii9FbGVtZW50Ij4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJlbGVtZW50VHlwZSIgc2VsZWN0PSJAVHlwZSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImVsZW1lbnRUeXBlTmFtZSIgc2VsZWN0PSJAVHlwZU5hbWUiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJlbGVtZW50TmFtZSIgc2VsZWN0PSJATmFtZSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImVsZW1lbnRQcmVzZW50YXRpb25OYW1lIiBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImJhY2tQYXRoIiBzZWxlY3Q9IkBCYWNrUGF0aCIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImltYWdlUGF0aCIgc2VsZWN0PSJjb25jYXQoJGJhY2tQYXRoLCAnaW1hZ2VzLycpIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0ic2hhcGVJbWFnZSIgc2VsZWN0PSJjb25jYXQoJGJhY2tQYXRoLEBTaGFwZWljb25VcmwpIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0icHJlc2VudGF0aW9uIiBzZWxlY3Q9InJlZmVyZW5jZVtAbmFtZT0ncHJlc2VudGF0aW9uJ10iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJjb250ZW50RGVzY3JpcHRpb24iIHNlbGVjdD0iJHByZXNlbnRhdGlvbi9FbGVtZW50Ii8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iY29weXJpZ2h0IiBzZWxlY3Q9ImNvcHlyaWdodCIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InNob3dUcmVlQnJvd3NlciIgc2VsZWN0PSJAc2hvd1RyZWVCcm93c2VyIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0icmVzcG9uc2libGVSb2xlIiBzZWxlY3Q9InJlZmVyZW5jZVtAbmFtZT0ncmVzcG9uc2libGVSb2xlJ10vRWxlbWVudFtAVHlwZT0nUm9sZSddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0icXVlcnlTdHJpbmciIHNlbGVjdD0iQHF1ZXJ5U3RyaW5nIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0icmVsUHJvY2Vzc1BhdGgiIHNlbGVjdD0iQHJlbFByb2Nlc3NQYXRoIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0ic2hvd0Z1bGxNZXRob2RDb250ZW50IiBzZWxlY3Q9IkBTaG93RnVsbE1ldGhvZENvbnRlbnQiLz4KLQkJPGh0bWw+Ci0JCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJsYW5nIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGxhbmciLz48L3hzbDphdHRyaWJ1dGU+Ci0JCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJ4bWw6bGFuZyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBsYW5nIi8+PC94c2w6YXR0cmlidXRlPgotCQkJPGhlYWQ+Ci0JCQkJPHRpdGxlPgotCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVsZW1lbnRUeXBlTmFtZSIvPjogPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50UHJlc2VudGF0aW9uTmFtZSIvPgotCQkJCTwvdGl0bGU+Ci0JCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InVtYU1ldGFUYWdzIj4KLQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnRUeXBlIiBzZWxlY3Q9IiRlbGVtZW50VHlwZSIvPgotCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudE5hbWUiIHNlbGVjdD0iJGVsZW1lbnROYW1lIi8+Ci0JCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50UHJlc2VudGF0aW9uTmFtZSIgc2VsZWN0PSIkZWxlbWVudFByZXNlbnRhdGlvbk5hbWUiLz4KLQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCTxtZXRhIG5hbWU9ImVsZW1lbnRfdHlwZSI+Ci0JCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJtYXBwaW5nIj4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50VHlwZSIgc2VsZWN0PSIkZWxlbWVudFR5cGUiLz4KLQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQk8L21ldGE+Ci0JCQkJPG1ldGEgbmFtZT0iZmlsZXR5cGUiIGNvbnRlbnQ9ImRlc2NyaXB0aW9uIi8+Ci0JCQkJPG1ldGEgbmFtZT0icm9sZSI+Ci0JCQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9ImNvbnRlbnQiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcmVzcG9uc2libGVSb2xlL0BEaXNwbGF5TmFtZSIvPjwveHNsOmF0dHJpYnV0ZT4KLQkJCQk8L21ldGE+Ci0JCQkJPGxpbmsgcmVsPSJTdHlsZVNoZWV0IiBocmVmPSJ7JGJhY2tQYXRofWNzcy9kZWZhdWx0LmNzcyIgdHlwZT0idGV4dC9jc3MiLz4KLQkJCQk8c2NyaXB0IHNyYz0ieyRiYWNrUGF0aH1zY3JpcHRzL0NvbnRlbnRQYWdlUmVzb3VyY2UuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPjwvc2NyaXB0PgotCQkJCTxzY3JpcHQgc3JjPSJ7JGJhY2tQYXRofXNjcmlwdHMvQ29udGVudFBhZ2VTZWN0aW9uLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij48L3NjcmlwdD4KLQkJCQk8c2NyaXB0IHNyYz0ieyRiYWNrUGF0aH1zY3JpcHRzL0NvbnRlbnRQYWdlU3ViU2VjdGlvbi5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PC9zY3JpcHQ+Ci0JCQkJPHNjcmlwdCBzcmM9InskYmFja1BhdGh9c2NyaXB0cy9BY3Rpdml0eVRyZWVUYWJsZS5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PC9zY3JpcHQ+Ci0JCQkJPHNjcmlwdCBzcmM9InskYmFja1BhdGh9c2NyaXB0cy9Qcm9jZXNzRWxlbWVudFBhZ2UuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPjwvc2NyaXB0PgotCQkJCTxzY3JpcHQgc3JjPSJ7JGJhY2tQYXRofXNjcmlwdHMvQ29udGVudFBhZ2VUb29sYmFyLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij48L3NjcmlwdD4KLQkJCQk8c2NyaXB0IHNyYz0ieyRiYWNrUGF0aH1zY3JpcHRzL2NvbnRlbnRQYWdlLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij48L3NjcmlwdD4KLQkJCQk8c2NyaXB0IHNyYz0ieyRiYWNrUGF0aH1zY3JpcHRzL3Byb2Nlc3NFbGVtZW50RGF0YS5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PC9zY3JpcHQ+Ci0JCQkJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij4KLQkJCQkJdmFyIGRlZmF1bHRRdWVyeVN0ciA9ICc8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHF1ZXJ5U3RyaW5nIi8+JzsKLQkJCQkJdmFyIGJhY2tQYXRoID0gJzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkYmFja1BhdGgiLz4nOwotCQkJCQl2YXIgaW1nUGF0aCA9ICc8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGltYWdlUGF0aCIvPic7Ci0JCQkJCXZhciBub2RlSW5mbz1udWxsOwotCQkJCQljb250ZW50UGFnZS5wcmVsb2FkKGltZ1BhdGgsIGJhY2tQYXRoLCBub2RlSW5mbywgIGRlZmF1bHRRdWVyeVN0ciwgZmFsc2UsIHRydWUsIHRydWUpOwotCQkJCTwvc2NyaXB0PgotCQkJPC9oZWFkPgotCQkJPGJvZHk+Ci0JCQk8ZGl2IGlkPSJicmVhZGNydW1icyI+PC9kaXY+Ci0JCQkJPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci0JCQkJCTx0cj4KLQkJCQkJCTx0ZCB2YWxpZ249InRvcCI+Ci0JCQkJCQk8ZGl2IGF1dG9XcmFwPSJ0cnVlIj4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0ib3ZlcnZpZXciPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudFR5cGUiIHNlbGVjdD0iJGVsZW1lbnRUeXBlIi8+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50VHlwZU5hbWUiIHNlbGVjdD0iJGVsZW1lbnRUeXBlTmFtZSIvPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudFByZXNlbnRhdGlvbk5hbWUiIHNlbGVjdD0iJGVsZW1lbnRQcmVzZW50YXRpb25OYW1lIi8+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50SWNvbiIgc2VsZWN0PSIkc2hhcGVJbWFnZSIvPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iYmFja1BhdGgiIHNlbGVjdD0iJGJhY2tQYXRoIi8+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJzaG93VHJlZUJyb3dzZXIiIHNlbGVjdD0iJHNob3dUcmVlQnJvd3NlciIvPgotCQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQk8L2Rpdj4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWN0aXZpdHlUYWJzIi8+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9IndvcmtmbG93U2VjdGlvbiIvPgotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJ0YnNTZWN0aW9uIj4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9InNob3dGdWxsTWV0aG9kQ29udGVudCIgc2VsZWN0PSIkc2hvd0Z1bGxNZXRob2RDb250ZW50Ii8+Ci0JCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iY29weXJpZ2h0Ij4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImNvcHlyaWdodCIgc2VsZWN0PSIkY29weXJpZ2h0Ii8+Ci0JCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCTwvdGQ+Ci0JCQkJCTwvdHI+Ci0JCQkJPC90YWJsZT4KLQkJCTwvYm9keT4KLQkJCTxzY3JpcHQgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0JCQkJY29udGVudFBhZ2Uub25sb2FkKCk7Ci0JCQk8L3NjcmlwdD4KLQkJPC9odG1sPgotCTwveHNsOnRlbXBsYXRlPgotCi0JPHhzbDp0ZW1wbGF0ZSBuYW1lPSJhY3Rpdml0eVRhYnMiPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImltYWdlUGF0aCIgc2VsZWN0PSJjb25jYXQoL0VsZW1lbnQvQEJhY2tQYXRoLCAnaW1hZ2VzLycpIi8+Ci0JCTx0YWJsZSB3aWR0aD0iMTAwJSIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiPgotCQkJPHRyIHZhbGlnbj0ibWlkZGxlIj4KLQkJCQk8dGQgY2xhc3M9InRhYiI+Ci0JCQkJCTxpbWcgc3JjPSJ7JGltYWdlUGF0aH1zaGltLmdpZiIgd2lkdGg9IjEwIiBoZWlnaHQ9IjE3IiBhbHQ9IiIgdGl0bGU9IiIvPgotCQkJCTwvdGQ+Ci0JCQkJPHRkIG5vd3JhcD0ibm93cmFwIiBjbGFzcz0idGFiIj4KLQkJCQkJPGEgY2xhc3M9InRhYiIgaWQ9IlRBQl9EZXNjcmlwdGlvbiI+Ci0JCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0idGFiVXJsQXR0cmlidXRlIj4KLQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0idXJsIiBzZWxlY3Q9ImNvbmNhdCgvRWxlbWVudC9AQmFja1BhdGgsIHRhYnMvdGFiW0BuYW1lPSdEZXNjcmlwdGlvbiddL0B1cmwpIi8+Ci0JCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRkZXNjcmlwdGlvblRleHQiLz4KLQkJCQkJPC9hPgotCQkJCTwvdGQ+Ci0JCQkJPHRkIHdpZHRoPSIyMSI+Ci0JCQkJCTxpbWcgc3JjPSJ7JGltYWdlUGF0aH10YWJfbWlkZGxlLWlfaS5naWYiIHdpZHRoPSIyMSIgaGVpZ2h0PSIxNyIgYWxpZ249ImFic21pZGRsZSIgYWx0PSIiIHRpdGxlPSIiLz4KLQkJCQk8L3RkPgotCQkJCTx0ZCBub3dyYXA9Im5vd3JhcCIgY2xhc3M9InRhYiI+Ci0JCQkJCTxhIGNsYXNzPSJ0YWIiIGlkPSJUQUJfV0JTIj4KLQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJ0YWJVcmxBdHRyaWJ1dGUiPgotCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJ1cmwiIHNlbGVjdD0iY29uY2F0KC9FbGVtZW50L0BCYWNrUGF0aCwgdGFicy90YWJbQG5hbWU9J1dCUyddL0B1cmwpIi8+Ci0JCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQkJPHNwYW4gc3R5bGU9IndoaXRlLXNwYWNlOm5vd3JhcDsiPgotCQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkd2JzVGV4dCIvPgotCQkJCQkJPC9zcGFuPgotCQkJCQk8L2E+Ci0JCQkJPC90ZD4KLQkJCQk8dGQgd2lkdGg9IjEiPgotCQkJCQk8aW1nIHNyYz0ieyRpbWFnZVBhdGh9dGFiX21pZGRsZS1pX2EuZ2lmIiB3aWR0aD0iMjEiIGhlaWdodD0iMTciIGFsaWduPSJhYnNtaWRkbGUiIGFsdD0iIiB0aXRsZT0iIi8+Ci0JCQkJPC90ZD4KLQkJCQk8dGQgbm93cmFwPSJub3dyYXAiIGNsYXNzPSJhY3RpdmVUYWIiPgotCQkJCQk8c3BhbiBzdHlsZT0id2hpdGUtc3BhY2U6bm93cmFwOyI+Ci0JCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHRic1RleHQiLz4KLQkJCQkJPC9zcGFuPgotCQkJCTwvdGQ+Ci0JCQkJPHRkIHdpZHRoPSIyMSI+Ci0JCQkJCTxpbWcgc3JjPSJ7JGltYWdlUGF0aH10YWJfbWlkZGxlLWFfaS5naWYiIHdpZHRoPSIyMSIgaGVpZ2h0PSIxNyIgYWxpZ249ImFic21pZGRsZSIgYWx0PSIiIHRpdGxlPSIiLz4KLQkJCQk8L3RkPgotCQkJCTx0ZCBub3dyYXA9Im5vd3JhcCIgY2xhc3M9InRhYiI+Ci0JCQkJCTxhIGNsYXNzPSJ0YWIiIGlkPSJUQUJfV1BCUyI+Ci0JCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0idGFiVXJsQXR0cmlidXRlIj4KLQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0idXJsIiBzZWxlY3Q9ImNvbmNhdCgvRWxlbWVudC9AQmFja1BhdGgsIHRhYnMvdGFiW0BuYW1lPSdXUEJTJ10vQHVybCkiLz4KLQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQk8c3BhbiBzdHlsZT0id2hpdGUtc3BhY2U6bm93cmFwOyI+Ci0JCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR3cGJzVGV4dCIvPgotCQkJCQkJPC9zcGFuPgotCQkJCQk8L2E+Ci0JCQkJPC90ZD4KLQkJCQk8dGQgd2lkdGg9IjIxIj4KLQkJCQkJPGltZyBzcmM9InskaW1hZ2VQYXRofXRhYl9lbmQtaS5naWYiIHdpZHRoPSIyMSIgaGVpZ2h0PSIxNyIgYWx0PSIiIHRpdGxlPSIiLz4KLQkJCQk8L3RkPgotCQkJCTx0ZCB3aWR0aD0iNTAlIj4KLQkJCQkJPGltZyBzcmM9InskaW1hZ2VQYXRofXNoaW0uZ2lmIiB3aWR0aD0iMTAiIGhlaWdodD0iMTciIGFsdD0iIiB0aXRsZT0iIi8+Ci0JCQkJPC90ZD4KLQkJCTwvdHI+Ci0JCQk8dHI+Ci0JCQkJPHRkIGNvbHNwYW49IjQiPgotCQkJCQk8aW1nIHNyYz0ieyRpbWFnZVBhdGh9c2hpbS5naWYiIGFsdD0iIiB0aXRsZT0iIiBoZWlnaHQ9IjIiLz4KLQkJCQk8L3RkPgotCQkJCTx0ZD4KLQkJCQkJPGltZyBzcmM9InskaW1hZ2VQYXRofXRhYl9zcGFjZV9taWRkbGUuZ2lmIiB3aWR0aD0iMjEiIGhlaWdodD0iMiIgYWx0PSIiIHRpdGxlPSIiLz4KLQkJCQk8L3RkPgotCQkJCTx0ZCBjbGFzcz0iYWN0aXZlVGFiIj4KLQkJCQkJPGltZyBzcmM9InskaW1hZ2VQYXRofXNoaW0uZ2lmIiB3aWR0aD0iMTAiIGhlaWdodD0iMiIgYWx0PSIiIHRpdGxlPSIiLz4KLQkJCQk8L3RkPgotCQkJCTx0ZD4KLQkJCQkJPGltZyBzcmM9InskaW1hZ2VQYXRofXRhYl9zcGFjZS5naWYiIHdpZHRoPSIyMSIgaGVpZ2h0PSIyIiBhbHQ9IiIgdGl0bGU9IiIvPgotCQkJCTwvdGQ+Ci0JCQkJPHRkIGNvbHNwYW49IjMiPgotCQkJCQk8aW1nIHNyYz0ieyRpbWFnZVBhdGh9c2hpbS5naWYiIGhlaWdodD0iMiIgYWx0PSIiIHRpdGxlPSIiLz4KLQkJCQk8L3RkPgotCQkJPC90cj4KLQkJCTx0cj4KLQkJCQk8dGQgY29sc3Bhbj0iMTAiIGNsYXNzPSJhY3RpdmVUYWIiPgotCQkJCQk8aW1nIHNyYz0ieyRpbWFnZVBhdGh9c2hpbS5naWYiIGhlaWdodD0iNSIgYWx0PSIiIHRpdGxlPSIiLz4KLQkJCQk8L3RkPgotCQkJPC90cj4KLQkJPC90YWJsZT4KLQk8L3hzbDp0ZW1wbGF0ZT4KLQotCTx4c2w6dGVtcGxhdGUgbmFtZT0id29ya2Zsb3dTZWN0aW9uIj4KLQkJPHhzbDppZiB0ZXN0PSJjb3VudChicmVha2Rvd25bQG5hbWU9J1RlYW0gQnJlYWtkb3duIFN0cnVjdHVyZSddL0VsZW1lbnRbQFR5cGU9J1RlYW1Qcm9maWxlJ10pID4gMCI+Ci0JCQk8ZGl2IGNsYXNzPSJzZWN0aW9uSGVhZGluZyI+Ci0JCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR0ZWFtU3RydWN0dXJlVGV4dCIvPgotCQkJPC9kaXY+Ci0JCQk8ZGl2IGNsYXNzPSJzZWN0aW9uQ29udGVudCI+Ci0JCQk8cCBhbGlnbj0ibGVmdCI+Ci0JCQk8ZGl2IGlkPSJ0ZWFtVHJlZSIgPjwvZGl2PgotCQkJPC9wPgotCQkJCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+Ci0JCXZhciB0ZWFtVHJlZSA9IFsKLQkJCQk8eHNsOmZvci1lYWNoIHNlbGVjdD0iYnJlYWtkb3duW0BuYW1lPSdUZWFtIEJyZWFrZG93biBTdHJ1Y3R1cmUnXS9FbGVtZW50W0BUeXBlPSdUZWFtUHJvZmlsZScgYW5kIEBoYXNTdXBlclRlYW0gPSAnZmFsc2UnIF0iPgotCQkJCTx4c2w6c29ydCBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPgotCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InRlYW1TdHJ1Y3R1cmUiPgotCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50IiBzZWxlY3Q9Ii4iLz4KLQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCTwveHNsOmZvci1lYWNoPgotCV07Ci0JY29udGVudFBhZ2UucHJvY2Vzc1BhZ2UuYnVpbGRUZWFtVHJlZSh0ZWFtVHJlZSk7Ci0JCQkJCTwvc2NyaXB0PgotCQkJPC9kaXY+Ci0JCTwveHNsOmlmPgotCTwveHNsOnRlbXBsYXRlPgotCi0JPHhzbDp0ZW1wbGF0ZSBuYW1lPSJ0ZWFtU3RydWN0dXJlIj4KLQkJPHhzbDpwYXJhbSBuYW1lPSJlbGVtZW50Ii8+Ci0JWyI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iY29uY2F0KC9FbGVtZW50L0BCYWNrUGF0aCwgJGVsZW1lbnQvQFVybCkiLz4iLCAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50L0BEaXNwbGF5TmFtZSIvPiIsICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVsZW1lbnQvQHJlbFByb2Nlc3NQYXRoIi8+IiwgIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudC9AaXNTdXByZXNzZWQiLz4iLCAKLQkJPHhzbDppZiB0ZXN0PSJjb3VudCgkZWxlbWVudC9FbGVtZW50W0BUeXBlPSdUZWFtUHJvZmlsZSddKSA+IDAiPgotCQkJPHhzbDpmb3ItZWFjaCBzZWxlY3Q9IiRlbGVtZW50L0VsZW1lbnRbQFR5cGU9J1RlYW1Qcm9maWxlJ10iPgotCQkJPHhzbDpzb3J0IHNlbGVjdD0iQERpc3BsYXlOYW1lIi8+Ci0JCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InRlYW1TdHJ1Y3R1cmUiPgotCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudCIgc2VsZWN0PSIuIi8+Ci0JCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCTwveHNsOmZvci1lYWNoPgotCQk8L3hzbDppZj4KLQkJXSwKLQk8L3hzbDp0ZW1wbGF0ZT4KLQotCTx4c2w6dGVtcGxhdGUgbmFtZT0idGJzU2VjdGlvbiI+Ci0JCTx4c2w6cGFyYW0gbmFtZT0ic2hvd0Z1bGxNZXRob2RDb250ZW50Ii8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iaW1hZ2VQYXRoIiBzZWxlY3Q9ImNvbmNhdCgvRWxlbWVudC9AQmFja1BhdGgsICdpbWFnZXMvJykiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJjb2xTaXplIiBzZWxlY3Q9ImNvdW50KGJyZWFrZG93bltAbmFtZT0nVGVhbSBCcmVha2Rvd24gU3RydWN0dXJlJ10vY29sdW1ucy9jb2x1bW4pIi8+Ci0JCTxkaXYgY2xhc3M9InNlY3Rpb25IZWFkaW5nIj4KLQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdGVhbVByb2ZpbGVCcmVha2Rvd25UZXh0Ii8+Ci0JCTwvZGl2PgotCQk8ZGl2IGNsYXNzPSJzZWN0aW9uQ29udGVudCI+Ci0JCTxkaXYgaWQ9InRyZWVDb250ZW50Ij48L2Rpdj4KLTxzY3JpcHQgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPgotY29udGVudFBhZ2UucHJvY2Vzc1BhZ2UudHJlZVRhYmxlLmRhdGEgPSB7Ci10aXRsZTogIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdGVhbVByb2ZpbGVCcmVha2Rvd25UZXh0Ii8+Iiwgc3VtbWFyeTogIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdGVhbVByb2ZpbGVCcmVha2Rvd25UZXh0Ii8+IiwgCi1jb2x1bW5zOiBbPHhzbDpmb3ItZWFjaCBzZWxlY3Q9ImJyZWFrZG93bltAbmFtZT0nVGVhbSBCcmVha2Rvd24gU3RydWN0dXJlJ10vY29sdW1ucy9jb2x1bW4iPgotWyI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGlkIi8+IiwgIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbGFiZWwiLz4iXTx4c2w6aWYgdGVzdD0icG9zaXRpb24oKSAhPSAkY29sU2l6ZSI+LDwveHNsOmlmPgotCQkJCQk8L3hzbDpmb3ItZWFjaD5dLAotcm93czogWzx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJicmVha2Rvd25bQG5hbWU9J1RlYW0gQnJlYWtkb3duIFN0cnVjdHVyZSddL0VsZW1lbnQiPgotCQkJCQkJPHhzbDpzb3J0IHNlbGVjdD0iQERpc3BsYXlOYW1lIi8+Ci0JCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0id2JzSXRlbSI+Ci0JCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnQiIHNlbGVjdD0iLiIvPgotCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJpbmRlbnQiIHNlbGVjdD0iMCIvPgotCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJzaG93RnVsbE1ldGhvZENvbnRlbnQiIHNlbGVjdD0iJHNob3dGdWxsTWV0aG9kQ29udGVudCIvPgotCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJwYXJlbnROb2RlSWQiIHNlbGVjdD0iICcnICIvPgotCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJPC94c2w6Zm9yLWVhY2g+Ci1dfTsKLQkJCQk8L3NjcmlwdD4KLQkJPC9kaXY+Ci0JPC94c2w6dGVtcGxhdGU+Ci0KLQk8eHNsOnRlbXBsYXRlIG5hbWU9Indic0l0ZW0iPgotCQk8eHNsOnBhcmFtIG5hbWU9ImVsZW1lbnQiLz4KLQkJPHhzbDpwYXJhbSBuYW1lPSJwYXJlbnROb2RlSWQiLz4KLQkJPHhzbDpwYXJhbSBuYW1lPSJpbmRlbnQiLz4KLQkJPHhzbDpwYXJhbSBuYW1lPSJzaG93RnVsbE1ldGhvZENvbnRlbnQiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJlbGVtZW50VHlwZSIgc2VsZWN0PSIkZWxlbWVudC9AVHlwZSIvPgkKLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJpbWFnZVBhdGgiIHNlbGVjdD0iY29uY2F0KC9FbGVtZW50L0BCYWNrUGF0aCwgJ2ltYWdlcy8nKSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9Imhhc0NoaWxkcmVuIj4KLQkJCTx4c2w6Y2hvb3NlPgotCQkJCTx4c2w6d2hlbiB0ZXN0PSJjb3VudCgkZWxlbWVudC9FbGVtZW50KSA+IDAiPnRydWU8L3hzbDp3aGVuPgotCQkJCTx4c2w6b3RoZXJ3aXNlPmZhbHNlPC94c2w6b3RoZXJ3aXNlPgotCQkJPC94c2w6Y2hvb3NlPgotCQk8L3hzbDp2YXJpYWJsZT4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJ0eXBlTmFtZSI+Ci0JCQk8eHNsOmNob29zZT4KLQkJCQk8eHNsOndoZW4gdGVzdD0iJHNob3dGdWxsTWV0aG9kQ29udGVudCA9ICd0cnVlJyI+Ci0JCQkJCTx4c2w6Y2hvb3NlPgkJCQkJCQkJCQkKLQkJCQkJCTx4c2w6d2hlbiB0ZXN0PSIkZWxlbWVudFR5cGUgPSAnVGFza0Rlc2NyaXB0b3InIj4KLQkJCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHRhc2tUZXh0Ii8+Ci0JCQkJCQk8L3hzbDp3aGVuPgotCQkJCQkJPHhzbDp3aGVuIHRlc3Q9IiRlbGVtZW50VHlwZSA9ICdSb2xlRGVzY3JpcHRvciciPgotCQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcm9sZVRleHQiLz4KLQkJCQkJCTwveHNsOndoZW4+Ci0JCQkJCQk8eHNsOndoZW4gdGVzdD0iJGVsZW1lbnRUeXBlID0gJ1dvcmtQcm9kdWN0RGVzY3JpcHRvciciPgotCQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkd29ya1Byb2R1Y3RUZXh0Ii8+Ci0JCQkJCQk8L3hzbDp3aGVuPgotCQkJCQkJPHhzbDpvdGhlcndpc2U+Ci0JCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50L0BUeXBlTmFtZSIvPgotCQkJCQkJPC94c2w6b3RoZXJ3aXNlPgotCQkJCQk8L3hzbDpjaG9vc2U+CQkJCQkJCQkJCi0JCQkJPC94c2w6d2hlbj4KLQkJCQk8eHNsOm90aGVyd2lzZT4KLQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50L0BUeXBlTmFtZSIvPgotCQkJCTwveHNsOm90aGVyd2lzZT4KLQkJCTwveHNsOmNob29zZT4KLQkJPC94c2w6dmFyaWFibGU+CQkKLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJlc2NhcGVkRGlzcGxheU5hbWUiPgotICAgICAgICAJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImVzY2FwZSI+Ci0JCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9InN0cmluZyIgc2VsZWN0PSIkZWxlbWVudC9ARGlzcGxheU5hbWUiLz4KLQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0ic2VhcmNoIiBzZWxlY3Q9IicmcXVvdDsnIi8+Ci0JCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9InJlcGxhY2UiIHNlbGVjdD0iJyZhbXA7cXVvdDsnIi8+Ci0JCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotICAgIAk8L3hzbDp2YXJpYWJsZT4KLQote2lkOiAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50L0Bub2RlSWQiLz4iLCBwYXJlbnRJZDogIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcGFyZW50Tm9kZUlkIi8+IiwgcmVsUGF0aDogIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudC9AcmVsUHJvY2Vzc1BhdGgiLz4iLCBpc1N1cHByZXNzZWQ6ICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVsZW1lbnQvQGlzU3VwcmVzc2VkIi8+IiwgaW5kZW50U2l6ZTogPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRpbmRlbnQiLz4sIGhhc0NoaWxkcmVuOjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkaGFzQ2hpbGRyZW4iLz4sIAotCWluZGV4OiAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50L0BJbmRleCIvPiIsIHByZWZpeDogIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudC9hdHRyaWJ1dGVbQG5hbWU9J3ByZWZpeCddIi8+IiwgbmFtZTogIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudC9ATmFtZSIvPiIsIHRpdGxlOiAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50L0BEaXNwbGF5TmFtZSIvPiIsIHVybDogIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJjb25jYXQoL0VsZW1lbnQvQEJhY2tQYXRoLCAkZWxlbWVudC9AVXJsKSIvPiIsIAotCXByZWRlY2Vzc29yczogIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudC9AUHJlZGVjZXNzb3JzIi8+IiwgaW5mbzogIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudC9ATW9kZWxJbmZvIi8+IiwgdHlwZTogIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdHlwZU5hbWUiLz4iLCAKLQlyZXBlYXRhYmxlOiAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50L2F0dHJpYnV0ZVtAbmFtZT0naXNSZXBlYXRhYmxlJ10iLz4iLCBtdWx0aU9jY3VyZW5jZXM6ICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVsZW1lbnQvYXR0cmlidXRlW0BuYW1lPSdoYXNNdWx0aXBsZU9jY3VycmVuY2VzJ10iLz4iLCBvcHRpb25hbDogIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudC9hdHRyaWJ1dGVbQG5hbWU9J2lzT3B0aW9uYWwnXSIvPiIsIHBsYW5uZWQ6ICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVsZW1lbnQvYXR0cmlidXRlW0BuYW1lPSdpc1BsYW5uZWQnXSIvPiIsICBvbmdvaW5nOiAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50L2F0dHJpYnV0ZVtAbmFtZT0naXNPbmdvaW5nJ10iLz4iLCBldmVudERyaXZlbjogIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudC9hdHRyaWJ1dGVbQG5hbWU9J2lzRXZlbnREcml2ZW4nXSIvPiIsIAotCXRlYW06ICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVsZW1lbnQvQFRlYW0iLz4iLCBlbnRyeVN0YXRlOiAiIiwgZXhpdFN0YXRlOiAiIiwgZGVsaXZlcmFibGU6ICIiLCB2YXJpYWJpbGl0eVR5cGU6ICIifSwKLQkKLTwhLS0KLWNvbnRlbnRQYWdlLnByb2Nlc3NQYWdlLnRyZWVUYWJsZS53YnNJdGVtSHRtbC5pbml0Um93KCI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVsZW1lbnQvQG5vZGVJZCIvPiIsICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHBhcmVudE5vZGVJZCIvPiIsICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVsZW1lbnQvQHJlbFByb2Nlc3NQYXRoIi8+IiwgIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudC9AaXNTdXByZXNzZWQiLz4iLCA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGluZGVudCIvPiwgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRoYXNDaGlsZHJlbiIvPiwgIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudC9ASW5kZXgiLz4iLCAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50L2F0dHJpYnV0ZVtAbmFtZT0ncHJlZml4J10iLz4iLCAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50L0BOYW1lIi8+IiwgIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZXNjYXBlZERpc3BsYXlOYW1lIi8+IiwgIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJjb25jYXQoL0VsZW1lbnQvQEJhY2tQYXRoLCAkZWxlbWVudC9AVXJsKSIvPiIsICIiLCAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50L0BQcmVkZWNlc3NvcnMiLz4iLCAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50L0BNb2RlbEluZm8iLz4iLCAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR0eXBlTmFtZSIvPiIsICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVsZW1lbnQvYXR0cmlidXRlW0BuYW1lPSdpc1JlcGVhdGFibGUnXSIvPiIsICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVsZW1lbnQvYXR0cmlidXRlW0BuYW1lPSdoYXNNdWx0aXBsZU9jY3VycmVuY2VzJ10iLz4iLCAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50L2F0dHJpYnV0ZVtAbmFtZT0naXNPcHRpb25hbCddIi8+IiwgIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudC9hdHRyaWJ1dGVbQG5hbWU9J2lzUGxhbm5lZCddIi8+IiwgICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVsZW1lbnQvYXR0cmlidXRlW0BuYW1lPSdpc09uZ29pbmcnXSIvPiIsICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVsZW1lbnQvYXR0cmlidXRlW0BuYW1lPSdpc0V2ZW50RHJpdmVuJ10iLz4iLCAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50L0BUZWFtIi8+IiwgIiIsICIiLCAiIiwgIiIsICIiKTsKLWNvbnRlbnRQYWdlLnByb2Nlc3NQYWdlLnRyZWVUYWJsZS53YnNJdGVtSHRtbC53cml0ZVJvdygpOwkKLS0tPgotCQk8eHNsOmlmIHRlc3Q9ImNvdW50KCRlbGVtZW50L0VsZW1lbnQpID4gMCI+Ci0JCQk8eHNsOmZvci1lYWNoIHNlbGVjdD0iJGVsZW1lbnQvRWxlbWVudCI+Ci0JCQk8eHNsOnNvcnQgc2VsZWN0PSJARGlzcGxheU5hbWUiLz4KLQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0id2JzSXRlbSI+Ci0JCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50IiBzZWxlY3Q9Ii4iLz4KLQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImluZGVudCIgc2VsZWN0PSIkaW5kZW50KzEiLz4KLQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9InNob3dGdWxsTWV0aG9kQ29udGVudCIgc2VsZWN0PSIkc2hvd0Z1bGxNZXRob2RDb250ZW50Ii8+Ci0JCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJwYXJlbnROb2RlSWQiIHNlbGVjdD0iJGVsZW1lbnQvQG5vZGVJZCIvPgotCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQk8L3hzbDpmb3ItZWFjaD4KLQkJPC94c2w6aWY+Ci0JPC94c2w6dGVtcGxhdGU+Ci0KLTwveHNsOnN0eWxlc2hlZXQ+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQveHNsL2FjdGl2aXR5X3dicy54c2wgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQveHNsL2FjdGl2aXR5X3dicy54c2wKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5YzU0N2YuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L3hzbC9hY3Rpdml0eV93YnMueHNsCisrKyAvZGV2L251bGwKQEAgLTEsMzQ0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLQotPHhzbDpzdHlsZXNoZWV0IHZlcnNpb249IjEuMCIKLQl4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIKLQl4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIj4KLQotPHhzbDpvdXRwdXQgbWV0aG9kPSJodG1sIiB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgCi0JZG9jdHlwZS1wdWJsaWM9Ii0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAKLQlkb2N0eXBlLXN5c3RlbT0iaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCIgCi0JaW5kZW50PSJ5ZXMiLz4KLQkKLQk8eHNsOmluY2x1ZGUgaHJlZj0iYWN0aXZpdHlfaGVscGVyLnhzbCIvPgotCi0JPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iL0VsZW1lbnQiPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImVsZW1lbnRUeXBlIiBzZWxlY3Q9IkBUeXBlIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iZWxlbWVudFR5cGVOYW1lIiBzZWxlY3Q9IkBUeXBlTmFtZSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImVsZW1lbnROYW1lIiBzZWxlY3Q9IkBOYW1lIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iZWxlbWVudFByZXNlbnRhdGlvbk5hbWUiIHNlbGVjdD0iQERpc3BsYXlOYW1lIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iYmFja1BhdGgiIHNlbGVjdD0iQEJhY2tQYXRoIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iaW1hZ2VQYXRoIiBzZWxlY3Q9ImNvbmNhdCgkYmFja1BhdGgsICdpbWFnZXMvJykiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJzaGFwZUltYWdlIiBzZWxlY3Q9ImNvbmNhdCgkYmFja1BhdGgsQFNoYXBlaWNvblVybCkiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJwcmVzZW50YXRpb24iIHNlbGVjdD0icmVmZXJlbmNlW0BuYW1lPSdwcmVzZW50YXRpb24nXSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImNvbnRlbnREZXNjcmlwdGlvbiIgc2VsZWN0PSIkcHJlc2VudGF0aW9uL0VsZW1lbnQiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJjb3B5cmlnaHQiIHNlbGVjdD0iY29weXJpZ2h0Ii8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0ic2hvd1RyZWVCcm93c2VyIiBzZWxlY3Q9IkBzaG93VHJlZUJyb3dzZXIiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJyZXNwb25zaWJsZVJvbGUiIHNlbGVjdD0icmVmZXJlbmNlW0BuYW1lPSdyZXNwb25zaWJsZVJvbGUnXS9FbGVtZW50W0BUeXBlPSdSb2xlJ10iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJxdWVyeVN0cmluZyIgc2VsZWN0PSJAcXVlcnlTdHJpbmciLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJyZWxQcm9jZXNzUGF0aCIgc2VsZWN0PSJAcmVsUHJvY2Vzc1BhdGgiLz4JCQotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InNob3dGdWxsTWV0aG9kQ29udGVudCIgc2VsZWN0PSJAU2hvd0Z1bGxNZXRob2RDb250ZW50Ii8+Ci0JCTxodG1sPgotCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0ibGFuZyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBsYW5nIi8+PC94c2w6YXR0cmlidXRlPgotCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0ieG1sOmxhbmciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbGFuZyIvPjwveHNsOmF0dHJpYnV0ZT4KLQkJCTxoZWFkPgotCQkJCTx0aXRsZT4KLQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50VHlwZU5hbWUiLz46IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudFByZXNlbnRhdGlvbk5hbWUiLz4KLQkJCQk8L3RpdGxlPgotCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJ1bWFNZXRhVGFncyI+Ci0JCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50VHlwZSIgc2VsZWN0PSIkZWxlbWVudFR5cGUiLz4KLQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnROYW1lIiBzZWxlY3Q9IiRlbGVtZW50TmFtZSIvPgotCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudFByZXNlbnRhdGlvbk5hbWUiIHNlbGVjdD0iJGVsZW1lbnRQcmVzZW50YXRpb25OYW1lIi8+Ci0JCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQk8bWV0YSBuYW1lPSJlbGVtZW50X3R5cGUiPgotCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0ibWFwcGluZyI+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudFR5cGUiIHNlbGVjdD0iJGVsZW1lbnRUeXBlIi8+Ci0JCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJPC9tZXRhPgotCQkJCTxtZXRhIG5hbWU9ImZpbGV0eXBlIiBjb250ZW50PSJkZXNjcmlwdGlvbiIvPgotCQkJCTxtZXRhIG5hbWU9InJvbGUiPgotCQkJCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJjb250ZW50Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHJlc3BvbnNpYmxlUm9sZS9ARGlzcGxheU5hbWUiLz48L3hzbDphdHRyaWJ1dGU+Ci0JCQkJPC9tZXRhPgotCQkJCTxsaW5rIHJlbD0iU3R5bGVTaGVldCIgaHJlZj0ieyRiYWNrUGF0aH1jc3MvZGVmYXVsdC5jc3MiIHR5cGU9InRleHQvY3NzIi8+Ci0JCQkJPHNjcmlwdCBzcmM9InskYmFja1BhdGh9c2NyaXB0cy9Db250ZW50UGFnZVJlc291cmNlLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij48L3NjcmlwdD4KLQkJCQk8c2NyaXB0IHNyYz0ieyRiYWNrUGF0aH1zY3JpcHRzL0NvbnRlbnRQYWdlU2VjdGlvbi5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PC9zY3JpcHQ+Ci0JCQkJPHNjcmlwdCBzcmM9InskYmFja1BhdGh9c2NyaXB0cy9Db250ZW50UGFnZVN1YlNlY3Rpb24uanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPjwvc2NyaXB0PgotCQkJCTxzY3JpcHQgc3JjPSJ7JGJhY2tQYXRofXNjcmlwdHMvQWN0aXZpdHlUcmVlVGFibGUuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPjwvc2NyaXB0PgotCQkJCTxzY3JpcHQgc3JjPSJ7JGJhY2tQYXRofXNjcmlwdHMvUHJvY2Vzc0VsZW1lbnRQYWdlLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij48L3NjcmlwdD4KLQkJCQk8c2NyaXB0IHNyYz0ieyRiYWNrUGF0aH1zY3JpcHRzL0NvbnRlbnRQYWdlVG9vbGJhci5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PC9zY3JpcHQ+Ci0JCQkJPHNjcmlwdCBzcmM9InskYmFja1BhdGh9c2NyaXB0cy9jb250ZW50UGFnZS5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PC9zY3JpcHQ+Ci0JCQkJPHNjcmlwdCBzcmM9InskYmFja1BhdGh9c2NyaXB0cy9wcm9jZXNzRWxlbWVudERhdGEuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPjwvc2NyaXB0PgotCQkJCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+Ci0JCQkJCXZhciBkZWZhdWx0UXVlcnlTdHIgPSAnPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRxdWVyeVN0cmluZyIvPic7Ci0JCQkJCXZhciBiYWNrUGF0aCA9ICc8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGJhY2tQYXRoIi8+JzsKLQkJCQkJdmFyIGltZ1BhdGggPSAnPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRpbWFnZVBhdGgiLz4nOwotCQkJCQl2YXIgbm9kZUluZm89bnVsbDsKLQkJCQkJY29udGVudFBhZ2UucHJlbG9hZChpbWdQYXRoLCBiYWNrUGF0aCwgbm9kZUluZm8sICBkZWZhdWx0UXVlcnlTdHIsIGZhbHNlLCB0cnVlLCB0cnVlKTsKLQkJCQk8L3NjcmlwdD4KLQkJCTwvaGVhZD4KLQkJCTxib2R5PgotCQkJPGRpdiBpZD0iYnJlYWRjcnVtYnMiPjwvZGl2PgotCQkJCTx0YWJsZSBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgd2lkdGg9IjEwMCUiPgotCQkJCQk8dHI+Ci0JCQkJCQk8dGQgdmFsaWduPSJ0b3AiPgotCQkJCQkJPGRpdiBhdXRvV3JhcD0idHJ1ZSI+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9Im92ZXJ2aWV3Ij4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnRUeXBlIiBzZWxlY3Q9IiRlbGVtZW50VHlwZSIvPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudFR5cGVOYW1lIiBzZWxlY3Q9IiRlbGVtZW50VHlwZU5hbWUiLz4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnRQcmVzZW50YXRpb25OYW1lIiBzZWxlY3Q9IiRlbGVtZW50UHJlc2VudGF0aW9uTmFtZSIvPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudEljb24iIHNlbGVjdD0iJHNoYXBlSW1hZ2UiLz4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImJhY2tQYXRoIiBzZWxlY3Q9IiRiYWNrUGF0aCIvPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0ic2hvd1RyZWVCcm93c2VyIiBzZWxlY3Q9IiRzaG93VHJlZUJyb3dzZXIiLz4KLQkJCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQkJPC9kaXY+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFjdGl2aXR5VGFicyIvPgotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJ3b3JrZmxvd1NlY3Rpb24iLz4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0id2JzU2VjdGlvbiI+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJzaG93RnVsbE1ldGhvZENvbnRlbnQiIHNlbGVjdD0iJHNob3dGdWxsTWV0aG9kQ29udGVudCIvPgotCQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImNvcHlyaWdodCI+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJjb3B5cmlnaHQiIHNlbGVjdD0iJGNvcHlyaWdodCIvPgotCQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQk8L3RkPgotCQkJCQk8L3RyPgotCQkJCTwvdGFibGU+Ci0JCQk8L2JvZHk+Ci0JCQk8c2NyaXB0IGxhbmd1YWdlPSJKYXZhU2NyaXB0IiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotCQkJCWNvbnRlbnRQYWdlLm9ubG9hZCgpOwotCQkJPC9zY3JpcHQ+Ci0JCTwvaHRtbD4KLQk8L3hzbDp0ZW1wbGF0ZT4KLQotCTx4c2w6dGVtcGxhdGUgbmFtZT0iYWN0aXZpdHlUYWJzIj4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJpbWFnZVBhdGgiIHNlbGVjdD0iY29uY2F0KC9FbGVtZW50L0BCYWNrUGF0aCwgJ2ltYWdlcy8nKSIvPgotCQk8dGFibGUgd2lkdGg9IjEwMCUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4KLQkJCTx0ciB2YWxpZ249Im1pZGRsZSI+Ci0JCQkJPHRkIHdpZHRoPSIxMCIgY2xhc3M9InRhYiI+Ci0JCQkJCTxpbWcgc3JjPSJ7JGltYWdlUGF0aH1zaGltLmdpZiIgd2lkdGg9IjEwIiBoZWlnaHQ9IjE3IiBhbHQ9IiIgdGl0bGU9IiIvPgotCQkJCTwvdGQ+Ci0JCQkJPHRkIG5vd3JhcD0ibm93cmFwIiBjbGFzcz0idGFiIj4KLQkJCQkJPGEgY2xhc3M9InRhYiIgaWQ9IlRBQl9EZXNjcmlwdGlvbiI+Ci0JCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0idGFiVXJsQXR0cmlidXRlIj4KLQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0idXJsIiBzZWxlY3Q9ImNvbmNhdCgvRWxlbWVudC9AQmFja1BhdGgsIHRhYnMvdGFiW0BuYW1lPSdEZXNjcmlwdGlvbiddL0B1cmwpIi8+Ci0JCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRkZXNjcmlwdGlvblRleHQiLz4KLQkJCQkJPC9hPgotCQkJCTwvdGQ+Ci0JCQkJPHRkIHdpZHRoPSIyMSI+Ci0JCQkJCTxpbWcgc3JjPSJ7JGltYWdlUGF0aH10YWJfbWlkZGxlLWlfYS5naWYiIHdpZHRoPSIyMSIgaGVpZ2h0PSIxNyIgYWxpZ249ImFic21pZGRsZSIgYWx0PSIiIHRpdGxlPSIiLz4KLQkJCQk8L3RkPgotCQkJCTx0ZCBub3dyYXA9Im5vd3JhcCIgY2xhc3M9ImFjdGl2ZVRhYiI+Ci0JCQkJCTxzcGFuIHN0eWxlPSJ3aGl0ZS1zcGFjZTpub3dyYXA7Ij4KLQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkd2JzVGV4dCIvPgotCQkJCQk8L3NwYW4+Ci0JCQkJPC90ZD4KLQkJCQk8dGQgd2lkdGg9IjEiPgotCQkJCQk8aW1nIHNyYz0ieyRpbWFnZVBhdGh9dGFiX21pZGRsZS1hX2kuZ2lmIiB3aWR0aD0iMjEiIGhlaWdodD0iMTciIGFsaWduPSJhYnNtaWRkbGUiIGFsdD0iIiB0aXRsZT0iIi8+Ci0JCQkJPC90ZD4KLQkJCQk8dGQgbm93cmFwPSJub3dyYXAiIGNsYXNzPSJ0YWIiPgotCQkJCQk8YSBjbGFzcz0idGFiIiBpZD0iVEFCX1RCUyI+Ci0JCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0idGFiVXJsQXR0cmlidXRlIj4KLQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0idXJsIiBzZWxlY3Q9ImNvbmNhdCgvRWxlbWVudC9AQmFja1BhdGgsIHRhYnMvdGFiW0BuYW1lPSdUQlMnXS9AdXJsKSIvPgotCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCTxzcGFuIHN0eWxlPSJ3aGl0ZS1zcGFjZTpub3dyYXA7Ij4KLQkJCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHRic1RleHQiLz4KLQkJCQkJCTwvc3Bhbj4KLQkJCQkJPC9hPgotCQkJCTwvdGQ+Ci0JCQkJPHRkIHdpZHRoPSIyMSI+Ci0JCQkJCTxpbWcgc3JjPSJ7JGltYWdlUGF0aH10YWJfbWlkZGxlLWlfaS5naWYiIHdpZHRoPSIyMSIgaGVpZ2h0PSIxNyIgYWxpZ249ImFic21pZGRsZSIgYWx0PSIiIHRpdGxlPSIiLz4KLQkJCQk8L3RkPgotCQkJCTx0ZCBub3dyYXA9Im5vd3JhcCIgY2xhc3M9InRhYiI+Ci0JCQkJCTxhIGNsYXNzPSJ0YWIiIGlkPSJUQUJfV1BCUyI+Ci0JCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0idGFiVXJsQXR0cmlidXRlIj4KLQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0idXJsIiBzZWxlY3Q9ImNvbmNhdCgvRWxlbWVudC9AQmFja1BhdGgsIHRhYnMvdGFiW0BuYW1lPSdXUEJTJ10vQHVybCkiLz4KLQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQk8c3BhbiBzdHlsZT0id2hpdGUtc3BhY2U6bm93cmFwOyI+Ci0JCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR3cGJzVGV4dCIvPgotCQkJCQkJPC9zcGFuPgotCQkJCQk8L2E+Ci0JCQkJPC90ZD4KLQkJCQk8dGQgd2lkdGg9IjIxIj4KLQkJCQkJPGltZyBzcmM9InskaW1hZ2VQYXRofXRhYl9lbmQtaS5naWYiIHdpZHRoPSIyMSIgaGVpZ2h0PSIxNyIgYWx0PSIiIHRpdGxlPSIiLz4KLQkJCQk8L3RkPgotCQkJCTx0ZCB3aWR0aD0iNTAlIj4KLQkJCQkJPGltZyBzcmM9InskaW1hZ2VQYXRofXNoaW0uZ2lmIiB3aWR0aD0iMTAiIGhlaWdodD0iMTciIGFsdD0iIiB0aXRsZT0iIi8+Ci0JCQkJPC90ZD4KLQkJCTwvdHI+Ci0JCQk8dHI+Ci0JCQkJPHRkIGNvbHNwYW49IjIiPgotCQkJCQk8aW1nIHNyYz0ieyRpbWFnZVBhdGh9c2hpbS5naWYiIGhlaWdodD0iMiIgYWx0PSIiIHRpdGxlPSIiLz4KLQkJCQk8L3RkPgotCQkJCTx0ZD4KLQkJCQkJPGltZyBzcmM9InskaW1hZ2VQYXRofXRhYl9zcGFjZV9taWRkbGUuZ2lmIiB3aWR0aD0iMjEiIGhlaWdodD0iMiIgYWx0PSIiIHRpdGxlPSIiLz4KLQkJCQk8L3RkPgotCQkJCTx0ZCBjbGFzcz0iYWN0aXZlVGFiIj4KLQkJCQkJPGltZyBzcmM9InskaW1hZ2VQYXRofXNoaW0uZ2lmIiB3aWR0aD0iMTAiIGhlaWdodD0iMiIgYWx0PSIiIHRpdGxlPSIiLz4KLQkJCQk8L3RkPgotCQkJCTx0ZD4KLQkJCQkJPGltZyBzcmM9InskaW1hZ2VQYXRofXRhYl9zcGFjZS5naWYiIHdpZHRoPSIyMSIgaGVpZ2h0PSIyIiBhbHQ9IiIgdGl0bGU9IiIvPgotCQkJCTwvdGQ+Ci0JCQkJPHRkIGNvbHNwYW49IjUiPgotCQkJCQk8aW1nIHNyYz0ieyRpbWFnZVBhdGh9c2hpbS5naWYiIGhlaWdodD0iMiIgYWx0PSIiIHRpdGxlPSIiLz4KLQkJCQk8L3RkPgotCQkJPC90cj4KLQkJCTx0cj4KLQkJCQk8dGQgY29sc3Bhbj0iMTAiIGNsYXNzPSJhY3RpdmVUYWIiPgotCQkJCQk8aW1nIHNyYz0ieyRpbWFnZVBhdGh9c2hpbS5naWYiIGhlaWdodD0iNSIgYWx0PSIiIHRpdGxlPSIiLz4KLQkJCQk8L3RkPgotCQkJPC90cj4KLQkJPC90YWJsZT4KLQk8L3hzbDp0ZW1wbGF0ZT4KLQotCTx4c2w6dGVtcGxhdGUgbmFtZT0id29ya2Zsb3dTZWN0aW9uIj4KLQkJPHhzbDppZiB0ZXN0PSJkaWFncmFtcy9kaWFncmFtW0BuYW1lPSdBY3Rpdml0eSddIG9yIGRpYWdyYW1zL2RpYWdyYW1bQG5hbWU9J0FjdGl2aXR5RGV0YWlsJ10gb3IgZGlhZ3JhbXMvdXNlcmRpYWdyYW1bQG5hbWU9J0FjdGl2aXR5J10gb3IgZGlhZ3JhbXMvdXNlcmRpYWdyYW1bQG5hbWU9J0FjdGl2aXR5RGV0YWlsJ10iPgotCQkJPGRpdiBjbGFzcz0ic2VjdGlvbkhlYWRpbmciPgotCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkd29ya2Zsb3dUZXh0Ii8+Ci0JCQk8L2Rpdj4KLQkJCTxkaXYgY2xhc3M9InNlY3Rpb25Db250ZW50Ij4KLQkJCQk8dGFibGUgY2xhc3M9InNlY3Rpb25UYWJsZSIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiPgotCQkJCQk8eHNsOmNob29zZT4KLQkJCQkJCTx4c2w6d2hlbiB0ZXN0PSJkaWFncmFtcy91c2VyZGlhZ3JhbVtAbmFtZT0nQWN0aXZpdHknXSI+Ci0JCQkJCQkJPHRyPgotCQkJCQkJCQk8dGQgY2xhc3M9InNlY3Rpb25UYWJsZVNpbmdsZUNlbGwiIGNvbHNwYW49IjIiIGFsaWduPSJsZWZ0Ij4KLQkJCQkJCQkJCTx4c2w6dmFsdWUtb2YgZGlzYWJsZS1vdXRwdXQtZXNjYXBpbmc9InllcyIgc2VsZWN0PSJkaWFncmFtcy91c2VyZGlhZ3JhbVtAbmFtZT0nQWN0aXZpdHknXSIvPgotCQkJCQkJCQk8L3RkPgotCQkJCQkJCTwvdHI+Ci0JCQkJCQk8L3hzbDp3aGVuPgotCQkJCQkJPHhzbDpvdGhlcndpc2U+Ci0JCQkJCQkJPHhzbDppZiB0ZXN0PSJkaWFncmFtcy9kaWFncmFtW0BuYW1lPSdBY3Rpdml0eSddIj4KLQkJCQkJCQkJPHRyPgotCQkJCQkJCQkJPHRkIGNsYXNzPSJzZWN0aW9uVGFibGVTaW5nbGVDZWxsIiBjb2xzcGFuPSIyIiBhbGlnbj0ibGVmdCI+Ci0JCQkJCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImRpc3BsYXlEaWFncmFtIj4KLQkJCQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImRpYWdyYW0iIHNlbGVjdD0iZGlhZ3JhbXMvZGlhZ3JhbVtAbmFtZT0nQWN0aXZpdHknXSIvPgotCQkJCQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQkJCQk8L3RkPgotCQkJCQkJCQk8L3RyPgotCQkJCQkJCTwveHNsOmlmPgotCQkJCQkJPC94c2w6b3RoZXJ3aXNlPgotCQkJCQk8L3hzbDpjaG9vc2U+Ci0JCQkJCTx4c2w6Y2hvb3NlPgotCQkJCQkJPHhzbDp3aGVuIHRlc3Q9ImRpYWdyYW1zL3VzZXJkaWFncmFtW0BuYW1lPSdBY3Rpdml0eURldGFpbCddIj4KLQkJCQkJCQk8dHI+Ci0JCQkJCQkJCTx0ZCBjbGFzcz0ic2VjdGlvblRhYmxlU2luZ2xlQ2VsbCIgY29sc3Bhbj0iMiIgYWxpZ249ImxlZnQiPgotCQkJCQkJCQkJPHhzbDp2YWx1ZS1vZiBkaXNhYmxlLW91dHB1dC1lc2NhcGluZz0ieWVzIiBzZWxlY3Q9ImRpYWdyYW1zL3VzZXJkaWFncmFtW0BuYW1lPSdBY3Rpdml0eURldGFpbCddIi8+Ci0JCQkJCQkJCTwvdGQ+Ci0JCQkJCQkJPC90cj4KLQkJCQkJCTwveHNsOndoZW4+Ci0JCQkJCQk8eHNsOm90aGVyd2lzZT4KLQkJCQkJCQk8eHNsOmlmIHRlc3Q9ImRpYWdyYW1zL2RpYWdyYW1bQG5hbWU9J0FjdGl2aXR5RGV0YWlsJ10iPgotCQkJCQkJCQk8dHI+Ci0JCQkJCQkJCQk8dGQgY2xhc3M9InNlY3Rpb25UYWJsZVNpbmdsZUNlbGwiIGNvbHNwYW49IjIiIGFsaWduPSJsZWZ0Ij4KLQkJCQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iZGlzcGxheURpYWdyYW0iPgotCQkJCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZGlhZ3JhbSIgc2VsZWN0PSJkaWFncmFtcy9kaWFncmFtW0BuYW1lPSdBY3Rpdml0eURldGFpbCddIi8+Ci0JCQkJCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCQkJCTwvdGQ+Ci0JCQkJCQkJCTwvdHI+Ci0JCQkJCQkJPC94c2w6aWY+Ci0JCQkJCQk8L3hzbDpvdGhlcndpc2U+Ci0JCQkJCTwveHNsOmNob29zZT4KLQkJCQk8L3RhYmxlPgotCQkJPC9kaXY+Ci0JCTwveHNsOmlmPgotCTwveHNsOnRlbXBsYXRlPgotCi0JPHhzbDp0ZW1wbGF0ZSBuYW1lPSJ3YnNTZWN0aW9uIj4KLQkJPHhzbDpwYXJhbSBuYW1lPSJzaG93RnVsbE1ldGhvZENvbnRlbnQiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJpbWFnZVBhdGgiIHNlbGVjdD0iY29uY2F0KC9FbGVtZW50L0BCYWNrUGF0aCwgJ2ltYWdlcy8nKSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImNvbFNpemUiIHNlbGVjdD0iY291bnQoYnJlYWtkb3duW0BuYW1lPSdXb3JrIEJyZWFrZG93biBTdHJ1Y3R1cmUnXS9jb2x1bW5zL2NvbHVtbikiLz4KLQkJPGRpdiBjbGFzcz0ic2VjdGlvbkhlYWRpbmciPgotCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR3b3JrQnJlYWtkb3duVGV4dCIvPgotCQk8L2Rpdj4KLQkJPGRpdiBjbGFzcz0ic2VjdGlvbkNvbnRlbnQiPgotCQk8ZGl2IGlkPSJ0cmVlQ29udGVudCI+PC9kaXY+Ci08c2NyaXB0IGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij4KLWNvbnRlbnRQYWdlLnByb2Nlc3NQYWdlLnRyZWVUYWJsZS5kYXRhID0gewotdGl0bGU6ICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHdvcmtCcmVha2Rvd25UZXh0Ii8+Iiwgc3VtbWFyeTogIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkd29ya0JyZWFrZG93blRleHQiLz4iLCAKLWNvbHVtbnM6IFs8eHNsOmZvci1lYWNoIHNlbGVjdD0iYnJlYWtkb3duW0BuYW1lPSdXb3JrIEJyZWFrZG93biBTdHJ1Y3R1cmUnXS9jb2x1bW5zL2NvbHVtbiI+Ci1bIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAaWQiLz4iLCAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBsYWJlbCIvPiJdPHhzbDppZiB0ZXN0PSJwb3NpdGlvbigpICE9ICRjb2xTaXplIj4sPC94c2w6aWY+Ci0JCQkJCTwveHNsOmZvci1lYWNoPl0sCi1yb3dzOiBbPHhzbDpmb3ItZWFjaCBzZWxlY3Q9ImJyZWFrZG93bltAbmFtZT0nV29yayBCcmVha2Rvd24gU3RydWN0dXJlJ10vRWxlbWVudCI+Ci0JCQkJCQk8eHNsOnNvcnQgc2VsZWN0PSJARGlzcGxheU5hbWUiLz4KLQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJ3YnNJdGVtIj4KLQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudCIgc2VsZWN0PSIuIi8+Ci0JCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImluZGVudCIgc2VsZWN0PSIwIi8+Ci0JCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9InBhcmVudE5vZGVJZCIgc2VsZWN0PSIgJycgIi8+Ci0JCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9InNob3dGdWxsTWV0aG9kQ29udGVudCIgc2VsZWN0PSIkc2hvd0Z1bGxNZXRob2RDb250ZW50Ii8+Ci0JCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQk8L3hzbDpmb3ItZWFjaD4KLV19OwotCQkJCTwvc2NyaXB0PgotCQotCQk8L2Rpdj4KLQk8L3hzbDp0ZW1wbGF0ZT4KLQotCTwhLS0gd3JpdGUgdGhlIHdicyB0ciBodG1sIC0tPgotCTwhLS0gaW5pdChpZCwgcGFyZW50SWQsIHJlbFBhdGgsIGlzU3VwcmVzc2VkLCBpbmRlbnRTaXplLCBoYXNDaGlsZHJlbiwgaW5kZXgsIHByZWZpeCwgdGl0bGUsIHVybCwgc3RlcHMsIHByZWRlY2Vzc29ycywgaW5mbywgcmVwZWF0YWJsZSwgbXVsdGlPY2N1cmVuY2VzLCBvcHRpb25hbCwgcGxhbm5lZCwgdHlwZSkgLS0+Ci0JPHhzbDp0ZW1wbGF0ZSBuYW1lPSJ3YnNJdGVtIj4KLQkJPHhzbDpwYXJhbSBuYW1lPSJlbGVtZW50Ii8+Ci0JCTx4c2w6cGFyYW0gbmFtZT0icGFyZW50Tm9kZUlkIi8+Ci0JCTx4c2w6cGFyYW0gbmFtZT0iaW5kZW50Ii8+Ci0JCTx4c2w6cGFyYW0gbmFtZT0ic2hvd0Z1bGxNZXRob2RDb250ZW50Ii8+CQkKLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJlbGVtZW50VHlwZSIgc2VsZWN0PSIkZWxlbWVudC9AVHlwZSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImltYWdlUGF0aCIgc2VsZWN0PSJjb25jYXQoL0VsZW1lbnQvQEJhY2tQYXRoLCAnaW1hZ2VzLycpIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iaGFzQ2hpbGRyZW4iPgotCQkJPHhzbDpjaG9vc2U+Ci0JCQkJPHhzbDp3aGVuIHRlc3Q9ImNvdW50KCRlbGVtZW50L0VsZW1lbnQpID4gMCI+dHJ1ZTwveHNsOndoZW4+Ci0JCQkJPHhzbDpvdGhlcndpc2U+ZmFsc2U8L3hzbDpvdGhlcndpc2U+Ci0JCQk8L3hzbDpjaG9vc2U+Ci0JCTwveHNsOnZhcmlhYmxlPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InR5cGVOYW1lIj4KLQkJCTx4c2w6Y2hvb3NlPgotCQkJCTx4c2w6d2hlbiB0ZXN0PSIkc2hvd0Z1bGxNZXRob2RDb250ZW50ID0gJ3RydWUnIj4KLQkJCQkJPHhzbDpjaG9vc2U+CQkJCQkJCQkJCQotCQkJCQkJPHhzbDp3aGVuIHRlc3Q9IiRlbGVtZW50VHlwZSA9ICdUYXNrRGVzY3JpcHRvciciPgotCQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdGFza1RleHQiLz4KLQkJCQkJCTwveHNsOndoZW4+Ci0JCQkJCQk8eHNsOndoZW4gdGVzdD0iJGVsZW1lbnRUeXBlID0gJ1JvbGVEZXNjcmlwdG9yJyI+Ci0JCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRyb2xlVGV4dCIvPgotCQkJCQkJPC94c2w6d2hlbj4KLQkJCQkJCTx4c2w6d2hlbiB0ZXN0PSIkZWxlbWVudFR5cGUgPSAnV29ya1Byb2R1Y3REZXNjcmlwdG9yJyI+Ci0JCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR3b3JrUHJvZHVjdFRleHQiLz4KLQkJCQkJCTwveHNsOndoZW4+Ci0JCQkJCQk8eHNsOm90aGVyd2lzZT4KLQkJCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVsZW1lbnQvQFR5cGVOYW1lIi8+Ci0JCQkJCQk8L3hzbDpvdGhlcndpc2U+Ci0JCQkJCTwveHNsOmNob29zZT4JCQkJCQkJCQkKLQkJCQk8L3hzbDp3aGVuPgotCQkJCTx4c2w6b3RoZXJ3aXNlPgotCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVsZW1lbnQvQFR5cGVOYW1lIi8+Ci0JCQkJPC94c2w6b3RoZXJ3aXNlPgotCQkJPC94c2w6Y2hvb3NlPgotCQk8L3hzbDp2YXJpYWJsZT4JCQotCQk8eHNsOnZhcmlhYmxlIG5hbWU9Im1vZGVsSW5mbyIgc2VsZWN0PSIkZWxlbWVudC9ATW9kZWxJbmZvIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0ibW9kZWxJbmZvUmVzdWx0Ij4KLQkJCTx4c2w6Y2hvb3NlPgkJCi0JCQkJPHhzbDp3aGVuIHRlc3Q9InN0YXJ0cy13aXRoKCRtb2RlbEluZm8sICdyZXBsYWNlcycpIj4JCQotCQkJCTwveHNsOndoZW4+Ci0JCQkJPHhzbDpvdGhlcndpc2U+Ci0JCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbW9kZWxJbmZvIi8+Ci0JCQkJPC94c2w6b3RoZXJ3aXNlPgkJCQotCQkJPC94c2w6Y2hvb3NlPgotCQk8L3hzbDp2YXJpYWJsZT4KLQkJCi17aWQ6ICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVsZW1lbnQvQG5vZGVJZCIvPiIsIHBhcmVudElkOiAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwYXJlbnROb2RlSWQiLz4iLCByZWxQYXRoOiAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50L0ByZWxQcm9jZXNzUGF0aCIvPiIsIGlzU3VwcHJlc3NlZDogIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudC9AaXNTdXByZXNzZWQiLz4iLCBpbmRlbnRTaXplOiA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGluZGVudCIvPiwgaGFzQ2hpbGRyZW46PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRoYXNDaGlsZHJlbiIvPiwgCi0JaW5kZXg6ICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVsZW1lbnQvQEluZGV4Ii8+IiwgcHJlZml4OiAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50L2F0dHJpYnV0ZVtAbmFtZT0ncHJlZml4J10iLz4iLCBuYW1lOiAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50L0BOYW1lIi8+IiwgdGl0bGU6ICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVsZW1lbnQvQERpc3BsYXlOYW1lIi8+IiwgdXJsOiAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9ImNvbmNhdCgvRWxlbWVudC9AQmFja1BhdGgsICRlbGVtZW50L0BVcmwpIi8+IiwgCi0JcHJlZGVjZXNzb3JzOiAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50L0BQcmVkZWNlc3NvcnMiLz4iLCBpbmZvOiAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRtb2RlbEluZm9SZXN1bHQiLz4iLCB0eXBlOiAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR0eXBlTmFtZSIvPiIsIAotCXJlcGVhdGFibGU6ICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVsZW1lbnQvYXR0cmlidXRlW0BuYW1lPSdpc1JlcGVhdGFibGUnXSIvPiIsIG11bHRpT2NjdXJlbmNlczogIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudC9hdHRyaWJ1dGVbQG5hbWU9J2hhc011bHRpcGxlT2NjdXJyZW5jZXMnXSIvPiIsIG9wdGlvbmFsOiAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50L2F0dHJpYnV0ZVtAbmFtZT0naXNPcHRpb25hbCddIi8+IiwgcGxhbm5lZDogIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudC9hdHRyaWJ1dGVbQG5hbWU9J2lzUGxhbm5lZCddIi8+IiwgIG9uZ29pbmc6ICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVsZW1lbnQvYXR0cmlidXRlW0BuYW1lPSdpc09uZ29pbmcnXSIvPiIsIGV2ZW50RHJpdmVuOiAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50L2F0dHJpYnV0ZVtAbmFtZT0naXNFdmVudERyaXZlbiddIi8+IiwgCi0JdGVhbTogIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudC9AVGVhbSIvPiIsIGVudHJ5U3RhdGU6ICIiLCBleGl0U3RhdGU6ICIiLCBkZWxpdmVyYWJsZTogIiIsIHZhcmlhYmlsaXR5VHlwZTogIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudC9hdHRyaWJ1dGVbQG5hbWU9J3ZhcmlhYmlsaXR5VHlwZSddIi8+IiwKLQlzdGVwczogWzx4c2w6dmFyaWFibGUgbmFtZT0ic3RlcFNpemUiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJjb3VudCgkZWxlbWVudC9TdGVwcy9TdGVwKSIvPjwveHNsOnZhcmlhYmxlPgotCTx4c2w6Zm9yLWVhY2ggc2VsZWN0PSIkZWxlbWVudC9TdGVwcy9TdGVwIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHNlbGVjdGVkIi8+Ci0JPHhzbDppZiB0ZXN0PSJwb3NpdGlvbigpICE9ICRzdGVwU2l6ZSI+LDwveHNsOmlmPjwveHNsOmZvci1lYWNoPl19LAotCQotCQk8eHNsOmlmIHRlc3Q9ImNvdW50KCRlbGVtZW50L0VsZW1lbnQpID4gMCI+Ci0JCQk8eHNsOmZvci1lYWNoIHNlbGVjdD0iJGVsZW1lbnQvRWxlbWVudCI+Ci0JCQk8eHNsOnNvcnQgc2VsZWN0PSJARGlzcGxheU5hbWUiLz4KLQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0id2JzSXRlbSI+Ci0JCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50IiBzZWxlY3Q9Ii4iLz4KLQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImluZGVudCIgc2VsZWN0PSIkaW5kZW50KzEiLz4KLQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9InBhcmVudE5vZGVJZCIgc2VsZWN0PSIkZWxlbWVudC9Abm9kZUlkIi8+Ci0JCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJzaG93RnVsbE1ldGhvZENvbnRlbnQiIHNlbGVjdD0iJHNob3dGdWxsTWV0aG9kQ29udGVudCIvPgkJCQkJCi0JCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCTwveHNsOmZvci1lYWNoPgotCQk8L3hzbDppZj4KLQk8L3hzbDp0ZW1wbGF0ZT4KLQotPC94c2w6c3R5bGVzaGVldD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC94c2wvYWN0aXZpdHlfd3Bicy54c2wgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQveHNsL2FjdGl2aXR5X3dwYnMueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZGU2NmM0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC94c2wvYWN0aXZpdHlfd3Bicy54c2wKKysrIC9kZXYvbnVsbApAQCAtMSwzMTkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotCi08eHNsOnN0eWxlc2hlZXQgdmVyc2lvbj0iMS4wIgotCXhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIgotCXhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiPgotCi08eHNsOm91dHB1dCBtZXRob2Q9Imh0bWwiIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiAKLQlkb2N0eXBlLXB1YmxpYz0iLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iIAotCWRvY3R5cGUtc3lzdGVtPSJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIiAKLQlpbmRlbnQ9InllcyIvPgotCQotCTx4c2w6aW5jbHVkZSBocmVmPSJhY3Rpdml0eV9oZWxwZXIueHNsIi8+Ci0KLQk8eHNsOnRlbXBsYXRlIG1hdGNoPSIvRWxlbWVudCI+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iZWxlbWVudFR5cGUiIHNlbGVjdD0iQFR5cGUiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJlbGVtZW50VHlwZU5hbWUiIHNlbGVjdD0iQFR5cGVOYW1lIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iZWxlbWVudE5hbWUiIHNlbGVjdD0iQE5hbWUiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJlbGVtZW50UHJlc2VudGF0aW9uTmFtZSIgc2VsZWN0PSJARGlzcGxheU5hbWUiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJiYWNrUGF0aCIgc2VsZWN0PSJAQmFja1BhdGgiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJpbWFnZVBhdGgiIHNlbGVjdD0iY29uY2F0KCRiYWNrUGF0aCwgJ2ltYWdlcy8nKSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InNoYXBlSW1hZ2UiIHNlbGVjdD0iY29uY2F0KCRiYWNrUGF0aCxAU2hhcGVpY29uVXJsKSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InByZXNlbnRhdGlvbiIgc2VsZWN0PSJyZWZlcmVuY2VbQG5hbWU9J3ByZXNlbnRhdGlvbiddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iY29udGVudERlc2NyaXB0aW9uIiBzZWxlY3Q9IiRwcmVzZW50YXRpb24vRWxlbWVudCIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImNvcHlyaWdodCIgc2VsZWN0PSJjb3B5cmlnaHQiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJzaG93VHJlZUJyb3dzZXIiIHNlbGVjdD0iQHNob3dUcmVlQnJvd3NlciIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InJlc3BvbnNpYmxlUm9sZSIgc2VsZWN0PSJyZWZlcmVuY2VbQG5hbWU9J3Jlc3BvbnNpYmxlUm9sZSddL0VsZW1lbnRbQFR5cGU9J1JvbGUnXSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InF1ZXJ5U3RyaW5nIiBzZWxlY3Q9IkBxdWVyeVN0cmluZyIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InJlbFByb2Nlc3NQYXRoIiBzZWxlY3Q9IkByZWxQcm9jZXNzUGF0aCIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InNob3dGdWxsTWV0aG9kQ29udGVudCIgc2VsZWN0PSJAU2hvd0Z1bGxNZXRob2RDb250ZW50Ii8+Ci0JCTxodG1sPgotCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0ibGFuZyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBsYW5nIi8+PC94c2w6YXR0cmlidXRlPgotCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0ieG1sOmxhbmciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbGFuZyIvPjwveHNsOmF0dHJpYnV0ZT4KLQkJCTxoZWFkPgotCQkJCTx0aXRsZT4KLQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50VHlwZU5hbWUiLz46IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudFByZXNlbnRhdGlvbk5hbWUiLz4KLQkJCQk8L3RpdGxlPgotCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJ1bWFNZXRhVGFncyI+Ci0JCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50VHlwZSIgc2VsZWN0PSIkZWxlbWVudFR5cGUiLz4KLQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnROYW1lIiBzZWxlY3Q9IiRlbGVtZW50TmFtZSIvPgotCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudFByZXNlbnRhdGlvbk5hbWUiIHNlbGVjdD0iJGVsZW1lbnRQcmVzZW50YXRpb25OYW1lIi8+Ci0JCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQk8bWV0YSBuYW1lPSJlbGVtZW50X3R5cGUiPgotCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0ibWFwcGluZyI+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudFR5cGUiIHNlbGVjdD0iJGVsZW1lbnRUeXBlIi8+Ci0JCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJPC9tZXRhPgotCQkJCTxtZXRhIG5hbWU9ImZpbGV0eXBlIiBjb250ZW50PSJkZXNjcmlwdGlvbiIvPgotCQkJCTxtZXRhIG5hbWU9InJvbGUiPgotCQkJCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJjb250ZW50Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHJlc3BvbnNpYmxlUm9sZS9ARGlzcGxheU5hbWUiLz48L3hzbDphdHRyaWJ1dGU+Ci0JCQkJPC9tZXRhPgotCQkJCTxsaW5rIHJlbD0iU3R5bGVTaGVldCIgaHJlZj0ieyRiYWNrUGF0aH1jc3MvZGVmYXVsdC5jc3MiIHR5cGU9InRleHQvY3NzIi8+Ci0JCQkJPHNjcmlwdCBzcmM9InskYmFja1BhdGh9c2NyaXB0cy9Db250ZW50UGFnZVJlc291cmNlLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij48L3NjcmlwdD4KLQkJCQk8c2NyaXB0IHNyYz0ieyRiYWNrUGF0aH1zY3JpcHRzL0NvbnRlbnRQYWdlU2VjdGlvbi5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PC9zY3JpcHQ+Ci0JCQkJPHNjcmlwdCBzcmM9InskYmFja1BhdGh9c2NyaXB0cy9Db250ZW50UGFnZVN1YlNlY3Rpb24uanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPjwvc2NyaXB0PgotCQkJCTxzY3JpcHQgc3JjPSJ7JGJhY2tQYXRofXNjcmlwdHMvQWN0aXZpdHlUcmVlVGFibGUuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPjwvc2NyaXB0PgotCQkJCTxzY3JpcHQgc3JjPSJ7JGJhY2tQYXRofXNjcmlwdHMvUHJvY2Vzc0VsZW1lbnRQYWdlLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij48L3NjcmlwdD4KLQkJCQk8c2NyaXB0IHNyYz0ieyRiYWNrUGF0aH1zY3JpcHRzL0NvbnRlbnRQYWdlVG9vbGJhci5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PC9zY3JpcHQ+Ci0JCQkJPHNjcmlwdCBzcmM9InskYmFja1BhdGh9c2NyaXB0cy9jb250ZW50UGFnZS5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PC9zY3JpcHQ+Ci0JCQkJPHNjcmlwdCBzcmM9InskYmFja1BhdGh9c2NyaXB0cy9wcm9jZXNzRWxlbWVudERhdGEuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPjwvc2NyaXB0PgotCQkJCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+Ci0JCQkJCXZhciBkZWZhdWx0UXVlcnlTdHIgPSAnPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRxdWVyeVN0cmluZyIvPic7Ci0JCQkJCXZhciBiYWNrUGF0aCA9ICc8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGJhY2tQYXRoIi8+JzsKLQkJCQkJdmFyIGltZ1BhdGggPSAnPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRpbWFnZVBhdGgiLz4nOwotCQkJCQl2YXIgbm9kZUluZm89bnVsbDsKLQkJCQkJY29udGVudFBhZ2UucHJlbG9hZChpbWdQYXRoLCBiYWNrUGF0aCwgbm9kZUluZm8sIGRlZmF1bHRRdWVyeVN0ciwgZmFsc2UsIHRydWUsIHRydWUpOwotCQkJCTwvc2NyaXB0PgotCQkJPC9oZWFkPgotCQkJPGJvZHk+Ci0JCQk8ZGl2IGlkPSJicmVhZGNydW1icyI+PC9kaXY+Ci0JCQkJPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci0JCQkJCTx0cj4KLQkJCQkJCTx0ZCB2YWxpZ249InRvcCI+Ci0JCQkJCQk8ZGl2IGF1dG9XcmFwPSJ0cnVlIj4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0ib3ZlcnZpZXciPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudFR5cGUiIHNlbGVjdD0iJGVsZW1lbnRUeXBlIi8+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50VHlwZU5hbWUiIHNlbGVjdD0iJGVsZW1lbnRUeXBlTmFtZSIvPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudFByZXNlbnRhdGlvbk5hbWUiIHNlbGVjdD0iJGVsZW1lbnRQcmVzZW50YXRpb25OYW1lIi8+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50SWNvbiIgc2VsZWN0PSIkc2hhcGVJbWFnZSIvPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iYmFja1BhdGgiIHNlbGVjdD0iJGJhY2tQYXRoIi8+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJzaG93VHJlZUJyb3dzZXIiIHNlbGVjdD0iJHNob3dUcmVlQnJvd3NlciIvPgotCQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQkJPC9kaXY+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFjdGl2aXR5VGFicyIvPgotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJ3b3JrZmxvd1NlY3Rpb24iLz4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0id3Bic1NlY3Rpb24iPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0ic2hvd0Z1bGxNZXRob2RDb250ZW50IiBzZWxlY3Q9IiRzaG93RnVsbE1ldGhvZENvbnRlbnQiLz4KLQkJCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJjb3B5cmlnaHQiPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iY29weXJpZ2h0IiBzZWxlY3Q9IiRjb3B5cmlnaHQiLz4KLQkJCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQkJPC90ZD4KLQkJCQkJPC90cj4KLQkJCQk8L3RhYmxlPgotCQkJPC9ib2R5PgotCQkJPHNjcmlwdCBsYW5ndWFnZT0iSmF2YVNjcmlwdCIgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLQkJCQljb250ZW50UGFnZS5vbmxvYWQoKTsKLQkJCTwvc2NyaXB0PgotCQk8L2h0bWw+Ci0JPC94c2w6dGVtcGxhdGU+Ci0KLQk8eHNsOnRlbXBsYXRlIG5hbWU9ImFjdGl2aXR5VGFicyI+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iaW1hZ2VQYXRoIiBzZWxlY3Q9ImNvbmNhdCgvRWxlbWVudC9AQmFja1BhdGgsICdpbWFnZXMvJykiLz4KLQkJPHRhYmxlIHdpZHRoPSIxMDAlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+Ci0JCQk8dHIgdmFsaWduPSJtaWRkbGUiPgotCQkJCTx0ZCB3aWR0aD0iMTAiIGNsYXNzPSJ0YWIiPgotCQkJCQk8aW1nIHNyYz0ieyRpbWFnZVBhdGh9c2hpbS5naWYiIHdpZHRoPSIxMCIgaGVpZ2h0PSIxNyIgYWx0PSIiIHRpdGxlPSIiLz4KLQkJCQk8L3RkPgotCQkJCTx0ZCBub3dyYXA9Im5vd3JhcCIgY2xhc3M9InRhYiI+Ci0JCQkJCTxhIGNsYXNzPSJ0YWIiIGlkPSJUQUJfRGVzY3JpcHRpb24iPgotCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InRhYlVybEF0dHJpYnV0ZSI+Ci0JCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9InVybCIgc2VsZWN0PSJjb25jYXQoL0VsZW1lbnQvQEJhY2tQYXRoLCB0YWJzL3RhYltAbmFtZT0nRGVzY3JpcHRpb24nXS9AdXJsKSIvPgotCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZGVzY3JpcHRpb25UZXh0Ii8+Ci0JCQkJCTwvYT4KLQkJCQk8L3RkPgotCQkJCTx0ZCB3aWR0aD0iMjEiPgotCQkJCQk8aW1nIHNyYz0ieyRpbWFnZVBhdGh9dGFiX21pZGRsZS1pX2kuZ2lmIiB3aWR0aD0iMjEiIGhlaWdodD0iMTciIGFsaWduPSJhYnNtaWRkbGUiIGFsdD0iIiB0aXRsZT0iIi8+Ci0JCQkJPC90ZD4KLQkJCQk8dGQgbm93cmFwPSJub3dyYXAiIGNsYXNzPSJ0YWIiPgotCQkJCQk8YSBjbGFzcz0idGFiIiBpZD0iVEFCX1dCUyI+Ci0JCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0idGFiVXJsQXR0cmlidXRlIj4KLQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0idXJsIiBzZWxlY3Q9ImNvbmNhdCgvRWxlbWVudC9AQmFja1BhdGgsIHRhYnMvdGFiW0BuYW1lPSdXQlMnXS9AdXJsKSIvPgotCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCTxzcGFuIHN0eWxlPSJ3aGl0ZS1zcGFjZTpub3dyYXA7Ij4KLQkJCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHdic1RleHQiLz4KLQkJCQkJCTwvc3Bhbj4KLQkJCQkJPC9hPgotCQkJCTwvdGQ+Ci0JCQkJPHRkIHdpZHRoPSIxIj4KLQkJCQkJPGltZyBzcmM9InskaW1hZ2VQYXRofXRhYl9taWRkbGUtaV9pLmdpZiIgd2lkdGg9IjIxIiBoZWlnaHQ9IjE3IiBhbGlnbj0iYWJzbWlkZGxlIiBhbHQ9IiIgdGl0bGU9IiIvPgotCQkJCTwvdGQ+Ci0JCQkJPHRkIG5vd3JhcD0ibm93cmFwIiBjbGFzcz0idGFiIj4KLQkJCQkJPGEgY2xhc3M9InRhYiIgaWQ9IlRBQl9UQlMiPgotCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InRhYlVybEF0dHJpYnV0ZSI+Ci0JCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9InVybCIgc2VsZWN0PSJjb25jYXQoL0VsZW1lbnQvQEJhY2tQYXRoLCB0YWJzL3RhYltAbmFtZT0nVEJTJ10vQHVybCkiLz4KLQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQk8c3BhbiBzdHlsZT0id2hpdGUtc3BhY2U6bm93cmFwOyI+Ci0JCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR0YnNUZXh0Ii8+Ci0JCQkJCQk8L3NwYW4+Ci0JCQkJCTwvYT4KLQkJCQk8L3RkPgotCQkJCTx0ZCB3aWR0aD0iMjEiPgotCQkJCQk8aW1nIHNyYz0ieyRpbWFnZVBhdGh9dGFiX21pZGRsZS1pX2EuZ2lmIiB3aWR0aD0iMjEiIGhlaWdodD0iMTciIGFsaWduPSJhYnNtaWRkbGUiIGFsdD0iIiB0aXRsZT0iIi8+Ci0JCQkJPC90ZD4KLQkJCQk8dGQgbm93cmFwPSJub3dyYXAiIGNsYXNzPSJhY3RpdmVUYWIiPgotCQkJCQk8c3BhbiBzdHlsZT0id2hpdGUtc3BhY2U6bm93cmFwOyI+Ci0JCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHdwYnNUZXh0Ii8+Ci0JCQkJCTwvc3Bhbj4KLQkJCQk8L3RkPgotCQkJCTx0ZCB3aWR0aD0iMjEiPgotCQkJCQk8aW1nIHNyYz0ieyRpbWFnZVBhdGh9dGFiX2VuZC1hLmdpZiIgd2lkdGg9IjIxIiBoZWlnaHQ9IjE3IiBhbHQ9IiIgdGl0bGU9IiIvPgotCQkJCTwvdGQ+Ci0JCQkJPHRkIHdpZHRoPSI1MCUiPgotCQkJCQk8aW1nIHNyYz0ieyRpbWFnZVBhdGh9c2hpbS5naWYiIHdpZHRoPSIxMCIgaGVpZ2h0PSIxNyIgYWx0PSIiIHRpdGxlPSIiLz4KLQkJCQk8L3RkPgotCQkJPC90cj4KLQkJCTx0cj4KLQkJCQk8dGQgY29sc3Bhbj0iNiI+Ci0JCQkJCTxpbWcgc3JjPSJ7JGltYWdlUGF0aH1zaGltLmdpZiIgaGVpZ2h0PSIyIiBhbHQ9IiIgdGl0bGU9IiIvPgotCQkJCTwvdGQ+Ci0JCQkJPHRkPgotCQkJCQk8aW1nIHNyYz0ieyRpbWFnZVBhdGh9dGFiX3NwYWNlX21pZGRsZS5naWYiIHdpZHRoPSIyMSIgaGVpZ2h0PSIyIiBhbHQ9IiIgdGl0bGU9IiIvPgotCQkJCTwvdGQ+Ci0JCQkJPHRkIGNsYXNzPSJhY3RpdmVUYWIiPgotCQkJCQk8aW1nIHNyYz0ieyRpbWFnZVBhdGh9c2hpbS5naWYiIHdpZHRoPSIxMCIgaGVpZ2h0PSIyIiBhbHQ9IiIgdGl0bGU9IiIvPgotCQkJCTwvdGQ+Ci0JCQkJPHRkPgotCQkJCQk8aW1nIHNyYz0ieyRpbWFnZVBhdGh9dGFiX3NwYWNlLmdpZiIgd2lkdGg9IjIxIiBoZWlnaHQ9IjIiIGFsdD0iIiB0aXRsZT0iIi8+Ci0JCQkJPC90ZD4KLQkJCQk8dGQgY29sc3Bhbj0iMSI+Ci0JCQkJCTxpbWcgc3JjPSJ7JGltYWdlUGF0aH1zaGltLmdpZiIgaGVpZ2h0PSIyIiBhbHQ9IiIgdGl0bGU9IiIvPgotCQkJCTwvdGQ+Ci0JCQk8L3RyPgotCQkJPHRyPgotCQkJCTx0ZCBjb2xzcGFuPSIxMCIgY2xhc3M9ImFjdGl2ZVRhYiI+Ci0JCQkJCTxpbWcgc3JjPSJ7JGltYWdlUGF0aH1zaGltLmdpZiIgaGVpZ2h0PSI1IiBhbHQ9IiIgdGl0bGU9IiIvPgotCQkJCTwvdGQ+Ci0JCQk8L3RyPgotCQk8L3RhYmxlPgotCTwveHNsOnRlbXBsYXRlPgotCi0JPHhzbDp0ZW1wbGF0ZSBuYW1lPSJ3b3JrZmxvd1NlY3Rpb24iPgotCQk8eHNsOmlmIHRlc3Q9ImRpYWdyYW1zL2RpYWdyYW1bQG5hbWU9J1dQRGVwZW5kZW5jeSddIG9yIGRpYWdyYW1zL3VzZXJkaWFncmFtW0BuYW1lPSdXUERlcGVuZGVuY3knXSAiPgotCQkJPGRpdiBjbGFzcz0ic2VjdGlvbkhlYWRpbmciPgotCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkd29ya1Byb2R1Y3REZXBlbmRlbmNpZXNUZXh0Ii8+Ci0JCQk8L2Rpdj4KLQkJCTxkaXYgY2xhc3M9InNlY3Rpb25Db250ZW50Ij4KLQkJCQk8IS0tCi0JCQk8cCBhbGlnbj0iY2VudGVyIj4KLQkJCQk8eHNsOnZhbHVlLW9mIGRpc2FibGUtb3V0cHV0LWVzY2FwaW5nPSJ5ZXMiIHNlbGVjdD0iZGlhZ3JhbXMvZGlhZ3JhbVtAbmFtZT0nV1BEZXBlbmRlbmN5J10iLz4KLQkJCTwvcD4KLQotCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJkaXNwbGF5RGlhZ3JhbSI+Ci0JCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJkaWFncmFtIiBzZWxlY3Q9ImRpYWdyYW1zL2RpYWdyYW1bQG5hbWU9J1dQRGVwZW5kZW5jeSddIi8+Ci0JCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCQktLT4KLQkJCQk8dGFibGUgY2xhc3M9InNlY3Rpb25UYWJsZSIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiPgkJCQotCQkJCQk8eHNsOmNob29zZT4KLQkJCQkJCTx4c2w6d2hlbiB0ZXN0PSJkaWFncmFtcy91c2VyZGlhZ3JhbVtAbmFtZT0nV1BEZXBlbmRlbmN5J10iPgotCQkJCQkJCTx0cj4KLQkJCQkJCQkJPHRkIGNsYXNzPSJzZWN0aW9uVGFibGVTaW5nbGVDZWxsIiBjb2xzcGFuPSIyIiBhbGlnbj0ibGVmdCI+Ci0JCQkJCQkJCQk8eHNsOnZhbHVlLW9mIGRpc2FibGUtb3V0cHV0LWVzY2FwaW5nPSJ5ZXMiIHNlbGVjdD0iZGlhZ3JhbXMvdXNlcmRpYWdyYW1bQG5hbWU9J1dQRGVwZW5kZW5jeSddIi8+Ci0JCQkJCQkJCTwvdGQ+Ci0JCQkJCQkJPC90cj4KLQkJCQkJCTwveHNsOndoZW4+Ci0JCQkJCQk8eHNsOm90aGVyd2lzZT4KLQkJCQkJCQk8eHNsOmlmIHRlc3Q9ImRpYWdyYW1zL2RpYWdyYW1bQG5hbWU9J1dQRGVwZW5kZW5jeSddIj4KLQkJCQkJCQkJPHRyPgotCQkJCQkJCQkJPHRkIGNsYXNzPSJzZWN0aW9uVGFibGVTaW5nbGVDZWxsIiBjb2xzcGFuPSIyIiBhbGlnbj0ibGVmdCI+Ci0JCQkJCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImRpc3BsYXlEaWFncmFtIj4KLQkJCQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImRpYWdyYW0iIHNlbGVjdD0iZGlhZ3JhbXMvZGlhZ3JhbVtAbmFtZT0nV1BEZXBlbmRlbmN5J10iLz4KLQkJCQkJCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQkJCQkJPC90ZD4KLQkJCQkJCQkJPC90cj4KLQkJCQkJCQk8L3hzbDppZj4KLQkJCQkJCTwveHNsOm90aGVyd2lzZT4KLQkJCQkJPC94c2w6Y2hvb3NlPgotCQkJCTwvdGFibGU+CQotCQkJPC9kaXY+Ci0JCTwveHNsOmlmPgotCTwveHNsOnRlbXBsYXRlPgotCi0JPHhzbDp0ZW1wbGF0ZSBuYW1lPSJ3cGJzU2VjdGlvbiI+Ci0JCTx4c2w6cGFyYW0gbmFtZT0ic2hvd0Z1bGxNZXRob2RDb250ZW50Ii8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iaW1hZ2VQYXRoIiBzZWxlY3Q9ImNvbmNhdCgvRWxlbWVudC9AQmFja1BhdGgsICdpbWFnZXMvJykiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJjb2xTaXplIiBzZWxlY3Q9ImNvdW50KGJyZWFrZG93bltAbmFtZT0nV29yayBQcm9kdWN0IEJyZWFrZG93biBTdHJ1Y3R1cmUnXS9jb2x1bW5zL2NvbHVtbikiLz4KLQkJPGRpdiBjbGFzcz0ic2VjdGlvbkhlYWRpbmciPgotCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR3b3JrUHJvZHVjdEJyZWFrZG93blRleHQiLz4KLQkJPC9kaXY+Ci0JCTxkaXYgY2xhc3M9InNlY3Rpb25Db250ZW50Ij4KLQkJPGRpdiBpZD0idHJlZUNvbnRlbnQiPjwvZGl2PgotPHNjcmlwdCBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+Ci1jb250ZW50UGFnZS5wcm9jZXNzUGFnZS50cmVlVGFibGUuZGF0YSA9IHsKLXRpdGxlOiAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR3b3JrUHJvZHVjdEJyZWFrZG93blRleHQiLz4iLCBzdW1tYXJ5OiAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR3b3JrUHJvZHVjdEJyZWFrZG93blRleHQiLz4iLCAKLWNvbHVtbnM6IFs8eHNsOmZvci1lYWNoIHNlbGVjdD0iYnJlYWtkb3duW0BuYW1lPSdXb3JrIFByb2R1Y3QgQnJlYWtkb3duIFN0cnVjdHVyZSddL2NvbHVtbnMvY29sdW1uIj4KLVsiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBpZCIvPiIsICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGxhYmVsIi8+Il08eHNsOmlmIHRlc3Q9InBvc2l0aW9uKCkgIT0gJGNvbFNpemUiPiw8L3hzbDppZj4KLQkJCQkJPC94c2w6Zm9yLWVhY2g+XSwKLXJvd3M6IFs8eHNsOmZvci1lYWNoIHNlbGVjdD0iYnJlYWtkb3duW0BuYW1lPSdXb3JrIFByb2R1Y3QgQnJlYWtkb3duIFN0cnVjdHVyZSddL0VsZW1lbnQiPgotCQkJCQkJPHhzbDpzb3J0IGRhdGEtdHlwZT0idGV4dCIgc2VsZWN0PSJARGlzcGxheU5hbWUiIG9yZGVyPSJhc2NlbmRpbmciLz4KLQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJ3YnNJdGVtIj4KLQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudCIgc2VsZWN0PSIuIi8+Ci0JCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImluZGVudCIgc2VsZWN0PSIwIi8+Ci0JCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9InNob3dGdWxsTWV0aG9kQ29udGVudCIgc2VsZWN0PSIkc2hvd0Z1bGxNZXRob2RDb250ZW50Ii8+Ci0JCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9InBhcmVudE5vZGVJZCIgc2VsZWN0PSIgJycgIi8+Ci0JCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQk8L3hzbDpmb3ItZWFjaD4KLV19OwotCQkJCTwvc2NyaXB0PgotCQk8L2Rpdj4KLQk8L3hzbDp0ZW1wbGF0ZT4KLQotCTx4c2w6dGVtcGxhdGUgbmFtZT0id2JzSXRlbSI+Ci0JCTx4c2w6cGFyYW0gbmFtZT0iZWxlbWVudCIvPgotCQk8eHNsOnBhcmFtIG5hbWU9InBhcmVudE5vZGVJZCIvPgotCQk8eHNsOnBhcmFtIG5hbWU9ImluZGVudCIvPgotCQk8eHNsOnBhcmFtIG5hbWU9InNob3dGdWxsTWV0aG9kQ29udGVudCIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImVsZW1lbnRUeXBlIiBzZWxlY3Q9IiRlbGVtZW50L0BUeXBlIi8+CQkJCi0JCTx4c2w6dmFyaWFibGUgbmFtZT0iaW1hZ2VQYXRoIiBzZWxlY3Q9ImNvbmNhdCgvRWxlbWVudC9AQmFja1BhdGgsICdpbWFnZXMvJykiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJoYXNDaGlsZHJlbiI+Ci0JCQk8eHNsOmNob29zZT4KLQkJCQk8eHNsOndoZW4gdGVzdD0iY291bnQoJGVsZW1lbnQvRWxlbWVudCkgPiAwIj50cnVlPC94c2w6d2hlbj4KLQkJCQk8eHNsOm90aGVyd2lzZT5mYWxzZTwveHNsOm90aGVyd2lzZT4KLQkJCTwveHNsOmNob29zZT4KLQkJPC94c2w6dmFyaWFibGU+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0idHlwZU5hbWUiPgotCQkJPHhzbDpjaG9vc2U+Ci0JCQkJPHhzbDp3aGVuIHRlc3Q9IiRzaG93RnVsbE1ldGhvZENvbnRlbnQgPSAndHJ1ZSciPgotCQkJCQk8eHNsOmNob29zZT4JCQkJCQkJCQkJCi0JCQkJCQk8eHNsOndoZW4gdGVzdD0iJGVsZW1lbnRUeXBlID0gJ1Rhc2tEZXNjcmlwdG9yJyI+Ci0JCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR0YXNrVGV4dCIvPgotCQkJCQkJPC94c2w6d2hlbj4KLQkJCQkJCTx4c2w6d2hlbiB0ZXN0PSIkZWxlbWVudFR5cGUgPSAnUm9sZURlc2NyaXB0b3InIj4KLQkJCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHJvbGVUZXh0Ii8+Ci0JCQkJCQk8L3hzbDp3aGVuPgotCQkJCQkJPHhzbDp3aGVuIHRlc3Q9IiRlbGVtZW50VHlwZSA9ICdXb3JrUHJvZHVjdERlc2NyaXB0b3InIj4KLQkJCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHdvcmtQcm9kdWN0VGV4dCIvPgotCQkJCQkJPC94c2w6d2hlbj4KLQkJCQkJCTx4c2w6b3RoZXJ3aXNlPgotCQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudC9AVHlwZU5hbWUiLz4KLQkJCQkJCTwveHNsOm90aGVyd2lzZT4KLQkJCQkJPC94c2w6Y2hvb3NlPgkJCQkJCQkJCQotCQkJCTwveHNsOndoZW4+Ci0JCQkJPHhzbDpvdGhlcndpc2U+Ci0JCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudC9AVHlwZU5hbWUiLz4KLQkJCQk8L3hzbDpvdGhlcndpc2U+Ci0JCQk8L3hzbDpjaG9vc2U+Ci0JCTwveHNsOnZhcmlhYmxlPgkJCi17aWQ6ICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVsZW1lbnQvQG5vZGVJZCIvPiIsIHBhcmVudElkOiAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwYXJlbnROb2RlSWQiLz4iLCByZWxQYXRoOiAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50L0ByZWxQcm9jZXNzUGF0aCIvPiIsIGlzU3VwcHJlc3NlZDogIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudC9AaXNTdXByZXNzZWQiLz4iLCBpbmRlbnRTaXplOiA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGluZGVudCIvPiwgaGFzQ2hpbGRyZW46PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRoYXNDaGlsZHJlbiIvPiwgCi0JaW5kZXg6ICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVsZW1lbnQvQEluZGV4Ii8+IiwgcHJlZml4OiAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50L2F0dHJpYnV0ZVtAbmFtZT0ncHJlZml4J10iLz4iLCBuYW1lOiAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50L0BOYW1lIi8+IiwgdGl0bGU6ICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVsZW1lbnQvQERpc3BsYXlOYW1lIi8+IiwgdXJsOiAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9ImNvbmNhdCgvRWxlbWVudC9AQmFja1BhdGgsICRlbGVtZW50L0BVcmwpIi8+IiwgCi0JcHJlZGVjZXNzb3JzOiAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50L0BQcmVkZWNlc3NvcnMiLz4iLCBpbmZvOiAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50L0BNb2RlbEluZm8iLz4iLCB0eXBlOiAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR0eXBlTmFtZSIvPiIsIAotCXJlcGVhdGFibGU6ICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVsZW1lbnQvYXR0cmlidXRlW0BuYW1lPSdpc1JlcGVhdGFibGUnXSIvPiIsIG11bHRpT2NjdXJlbmNlczogIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudC9hdHRyaWJ1dGVbQG5hbWU9J2hhc011bHRpcGxlT2NjdXJyZW5jZXMnXSIvPiIsIG9wdGlvbmFsOiAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50L2F0dHJpYnV0ZVtAbmFtZT0naXNPcHRpb25hbCddIi8+IiwgcGxhbm5lZDogIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudC9hdHRyaWJ1dGVbQG5hbWU9J2lzUGxhbm5lZCddIi8+IiwgIG9uZ29pbmc6ICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVsZW1lbnQvYXR0cmlidXRlW0BuYW1lPSdpc09uZ29pbmcnXSIvPiIsIGV2ZW50RHJpdmVuOiAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50L2F0dHJpYnV0ZVtAbmFtZT0naXNFdmVudERyaXZlbiddIi8+IiwgCi0JdGVhbTogIiIsIGVudHJ5U3RhdGU6ICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVsZW1lbnQvQEVudHJ5U3RhdGUiLz4iLCBleGl0U3RhdGU6ICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVsZW1lbnQvQEV4aXRTdGF0ZSIvPiIsIGRlbGl2ZXJhYmxlOiAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50L0BEZWxpdmVyYWJsZSIvPiIsIHZhcmlhYmlsaXR5VHlwZTogIiJ9LAotPCEtLQotY29udGVudFBhZ2UucHJvY2Vzc1BhZ2UudHJlZVRhYmxlLndic0l0ZW1IdG1sLmluaXRSb3coIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudC9Abm9kZUlkIi8+IiwgIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcGFyZW50Tm9kZUlkIi8+IiwgIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudC9AcmVsUHJvY2Vzc1BhdGgiLz4iLCAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50L0Bpc1N1cHJlc3NlZCIvPiIsIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkaW5kZW50Ii8+LCA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGhhc0NoaWxkcmVuIi8+LCAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50L0BJbmRleCIvPiIsICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVsZW1lbnQvYXR0cmlidXRlW0BuYW1lPSdwcmVmaXgnXSIvPiIsICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVsZW1lbnQvQE5hbWUiLz4iLCAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50L0BEaXNwbGF5TmFtZSIvPiIsICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iY29uY2F0KC9FbGVtZW50L0BCYWNrUGF0aCwgJGVsZW1lbnQvQFVybCkiLz4iLCAiIiwgIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudC9AUHJlZGVjZXNzb3JzIi8+IiwgIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudC9ATW9kZWxJbmZvIi8+IiwgIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdHlwZU5hbWUiLz4iLCAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50L2F0dHJpYnV0ZVtAbmFtZT0naXNSZXBlYXRhYmxlJ10iLz4iLCAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50L2F0dHJpYnV0ZVtAbmFtZT0naGFzTXVsdGlwbGVPY2N1cnJlbmNlcyddIi8+IiwgIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudC9hdHRyaWJ1dGVbQG5hbWU9J2lzT3B0aW9uYWwnXSIvPiIsICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVsZW1lbnQvYXR0cmlidXRlW0BuYW1lPSdpc1BsYW5uZWQnXSIvPiIsICAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50L2F0dHJpYnV0ZVtAbmFtZT0naXNPbmdvaW5nJ10iLz4iLCAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50L2F0dHJpYnV0ZVtAbmFtZT0naXNFdmVudERyaXZlbiddIi8+IiwgIiIsICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVsZW1lbnQvQEVudHJ5U3RhdGUiLz4iLCAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50L0BFeGl0U3RhdGUiLz4iLCAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50L0BEZWxpdmVyYWJsZSIvPiIsICIiLCAiIik7Ci1jb250ZW50UGFnZS5wcm9jZXNzUGFnZS50cmVlVGFibGUud2JzSXRlbUh0bWwud3JpdGVSb3coKTsJCi0tLT4KLQkJPHhzbDppZiB0ZXN0PSJjb3VudCgkZWxlbWVudC9FbGVtZW50KSA+IDAiPgotCQkJPHhzbDpmb3ItZWFjaCBzZWxlY3Q9IiRlbGVtZW50L0VsZW1lbnQiPgotCQkJPHhzbDpzb3J0IHNlbGVjdD0iQERpc3BsYXlOYW1lIi8+Ci0JCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9Indic0l0ZW0iPgotCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudCIgc2VsZWN0PSIuIi8+Ci0JCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJpbmRlbnQiIHNlbGVjdD0iJGluZGVudCsxIi8+Ci0JCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJzaG93RnVsbE1ldGhvZENvbnRlbnQiIHNlbGVjdD0iJHNob3dGdWxsTWV0aG9kQ29udGVudCIvPgotCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0icGFyZW50Tm9kZUlkIiBzZWxlY3Q9IiRlbGVtZW50L0Bub2RlSWQiLz4KLQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJPC94c2w6Zm9yLWVhY2g+Ci0JCTwveHNsOmlmPgotCTwveHNsOnRlbXBsYXRlPgotCi08L3hzbDpzdHlsZXNoZWV0PgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L3hzbC9hcnRpZmFjdC54c2wgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQveHNsL2FydGlmYWN0LnhzbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWMxY2ExMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQveHNsL2FydGlmYWN0LnhzbAorKysgL2Rldi9udWxsCkBAIC0xLDE1NCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci0KLTx4c2w6c3R5bGVzaGVldCB2ZXJzaW9uPSIxLjAiCi0JeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iCi0JeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSI+Ci0KLTx4c2w6b3V0cHV0IG1ldGhvZD0iaHRtbCIgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIAotCWRvY3R5cGUtcHVibGljPSItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgCi0JZG9jdHlwZS1zeXN0ZW09Imh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiIAotCWluZGVudD0ieWVzIi8+Ci0JCi0JPHhzbDppbmNsdWRlIGhyZWY9Indvcmtwcm9kdWN0LnhzbCIvPgotCi0JPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iL0VsZW1lbnQiPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImVsZW1lbnRUeXBlIiBzZWxlY3Q9IkBUeXBlIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iZWxlbWVudFR5cGVOYW1lIiBzZWxlY3Q9IkBUeXBlTmFtZSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImVsZW1lbnROYW1lIiBzZWxlY3Q9IkBOYW1lIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iZWxlbWVudFByZXNlbnRhdGlvbk5hbWUiIHNlbGVjdD0iQERpc3BsYXlOYW1lIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iYmFja1BhdGgiIHNlbGVjdD0iQEJhY2tQYXRoIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0ic2hhcGVJbWFnZSIgc2VsZWN0PSJjb25jYXQoJGJhY2tQYXRoLEBTaGFwZWljb25VcmwpIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iaW1hZ2VQYXRoIiBzZWxlY3Q9ImNvbmNhdCgkYmFja1BhdGgsICdpbWFnZXMvJykiLz4JCQotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InByZXNlbnRhdGlvbiIgc2VsZWN0PSJyZWZlcmVuY2VbQG5hbWU9J3ByZXNlbnRhdGlvbiddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iYXJ0aWZhY3REZXNjcmlwdGlvbiIgc2VsZWN0PSIkcHJlc2VudGF0aW9uL0VsZW1lbnRbQFR5cGU9J0FydGlmYWN0RGVzY3JpcHRpb24nXSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImNvcHlyaWdodCIgc2VsZWN0PSJjb3B5cmlnaHQiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJzaG93VHJlZUJyb3dzZXIiIHNlbGVjdD0iQHNob3dUcmVlQnJvd3NlciIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InJlc3BvbnNpYmxlUm9sZSIgc2VsZWN0PSJyZWZlcmVuY2VbQG5hbWU9J3Jlc3BvbnNpYmxlUm9sZSddL0VsZW1lbnRbQFR5cGU9J1JvbGUnXSIvPgotCi0JCTxodG1sPgotCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0ibGFuZyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBsYW5nIi8+PC94c2w6YXR0cmlidXRlPgotCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0ieG1sOmxhbmciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbGFuZyIvPjwveHNsOmF0dHJpYnV0ZT4KLQkJCTxoZWFkPgotCQkJCTx0aXRsZT48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVsZW1lbnRUeXBlTmFtZSIvPjogPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50UHJlc2VudGF0aW9uTmFtZSIvPjwvdGl0bGU+Ci0JCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InVtYU1ldGFUYWdzIj4KLQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnRUeXBlIiBzZWxlY3Q9IiRlbGVtZW50VHlwZSIvPgotCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudE5hbWUiIHNlbGVjdD0iJGVsZW1lbnROYW1lIi8+Ci0JCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50UHJlc2VudGF0aW9uTmFtZSIgc2VsZWN0PSIkZWxlbWVudFByZXNlbnRhdGlvbk5hbWUiLz4KLQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCTxtZXRhIG5hbWU9ImVsZW1lbnRfdHlwZSIgY29udGVudD0ieyRlbGVtZW50VHlwZX0iLz4KLQkJCQk8bWV0YSBuYW1lPSJmaWxldHlwZSIgY29udGVudD0iZGVzY3JpcHRpb24iLz4KLQkJCQk8bWV0YSBuYW1lPSJyb2xlIj4KLQkJCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0iY29udGVudCI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRyZXNwb25zaWJsZVJvbGUvQERpc3BsYXlOYW1lIi8+PC94c2w6YXR0cmlidXRlPgotCQkJCTwvbWV0YT4KLQkJCQk8bGluayByZWw9IlN0eWxlU2hlZXQiIGhyZWY9InskYmFja1BhdGh9Y3NzL2RlZmF1bHQuY3NzIiB0eXBlPSJ0ZXh0L2NzcyIvPgotCQkJCTxzY3JpcHQgc3JjPSJ7JGJhY2tQYXRofXNjcmlwdHMvQ29udGVudFBhZ2VSZXNvdXJjZS5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PC9zY3JpcHQ+Ci0JCQkJPHNjcmlwdCBzcmM9InskYmFja1BhdGh9c2NyaXB0cy9Db250ZW50UGFnZVNlY3Rpb24uanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPjwvc2NyaXB0PgotCQkJCTxzY3JpcHQgc3JjPSJ7JGJhY2tQYXRofXNjcmlwdHMvQ29udGVudFBhZ2VTdWJTZWN0aW9uLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij48L3NjcmlwdD4KLQkJCQk8c2NyaXB0IHNyYz0ieyRiYWNrUGF0aH1zY3JpcHRzL0NvbnRlbnRQYWdlVG9vbGJhci5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PC9zY3JpcHQ+Ci0JCQkJPHNjcmlwdCBzcmM9InskYmFja1BhdGh9c2NyaXB0cy9jb250ZW50UGFnZS5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PC9zY3JpcHQ+Ci0JCQkJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij4KLQkJCQkJdmFyIGJhY2tQYXRoID0gJzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkYmFja1BhdGgiLz4nOwotCQkJCQl2YXIgaW1nUGF0aCA9ICc8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGltYWdlUGF0aCIvPic7Ci0JCQkJCXZhciBub2RlSW5mbz1udWxsOwotCQkJCQljb250ZW50UGFnZS5wcmVsb2FkKGltZ1BhdGgsIGJhY2tQYXRoLCBub2RlSW5mbywgJycsIGZhbHNlLCBmYWxzZSwgZmFsc2UpOwotCQkJCTwvc2NyaXB0PgotCQkJPC9oZWFkPgotCQkJPGJvZHk+Ci0JCQk8ZGl2IGlkPSJicmVhZGNydW1icyI+PC9kaXY+Ci0JCQkJPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci0JCQkJCTx0cj4KLQkJCQkJCTx0ZCB2YWxpZ249InRvcCI+Ci0JCQkJCQkJPGEgbmFtZT0iVG9wIi8+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9Im92ZXJ2aWV3Ij4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnRUeXBlIiBzZWxlY3Q9IiRlbGVtZW50VHlwZSIvPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudFR5cGVOYW1lIiBzZWxlY3Q9IiRlbGVtZW50VHlwZU5hbWUiLz4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnRQcmVzZW50YXRpb25OYW1lIiBzZWxlY3Q9IiRlbGVtZW50UHJlc2VudGF0aW9uTmFtZSIvPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudEljb24iIHNlbGVjdD0iJHNoYXBlSW1hZ2UiLz4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImJhY2tQYXRoIiBzZWxlY3Q9IiRiYWNrUGF0aCIvPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0ic2hvd1RyZWVCcm93c2VyIiBzZWxlY3Q9IiRzaG93VHJlZUJyb3dzZXIiLz4KLQkJCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJwdXJwb3NlU2VjdGlvbiI+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJkZXNjcmlwdGlvbiIgc2VsZWN0PSIkYXJ0aWZhY3REZXNjcmlwdGlvbiIvPgotCQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InJlbGF0aW9uc2hpcHNTZWN0aW9uIi8+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImRlc2NyaXB0aW9uU2VjdGlvbiI+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJkZXNjcmlwdGlvbiIgc2VsZWN0PSIkYXJ0aWZhY3REZXNjcmlwdGlvbiIvPgotCQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9IndvcmtQcm9kdWN0SWxsdXN0cmF0aW9uc1NlY3Rpb24iLz4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0ia2V5Q29uc2lkZXJhdGlvbnNTZWN0aW9uIj4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImRlc2NyaXB0aW9uIiBzZWxlY3Q9IiRhcnRpZmFjdERlc2NyaXB0aW9uIi8+Ci0JCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0idGFpbG9yaW5nU2VjdGlvbiI+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJkZXNjcmlwdGlvbiIgc2VsZWN0PSIkYXJ0aWZhY3REZXNjcmlwdGlvbiIvPgotCQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9Im1vcmVJbmZvU2VjdGlvbiIvPgotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJjb3B5cmlnaHQiPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iY29weXJpZ2h0IiBzZWxlY3Q9IiRjb3B5cmlnaHQiLz4KLQkJCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQkJPC90ZD4KLQkJCQkJPC90cj4KLQkJCQk8L3RhYmxlPgotCQkJPC9ib2R5PgotCQkJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij4KLQkJCQljb250ZW50UGFnZS5vbmxvYWQoKTsKLQkJCTwvc2NyaXB0PgotCQk8L2h0bWw+Ci0JPC94c2w6dGVtcGxhdGU+Ci0JCi0JPHhzbDp0ZW1wbGF0ZSBuYW1lPSJkZXNjcmlwdGlvblNlY3Rpb24iPgotCQk8eHNsOnBhcmFtIG5hbWU9ImRlc2NyaXB0aW9uIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iYnJpZWZPdXRsaW5lIiBzZWxlY3Q9IiRkZXNjcmlwdGlvbi9hdHRyaWJ1dGVbQG5hbWU9J2JyaWVmT3V0bGluZSddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0ibWFpbkRlc2NyaXB0aW9uIiBzZWxlY3Q9IiRkZXNjcmlwdGlvbi9hdHRyaWJ1dGVbQG5hbWU9J21haW5EZXNjcmlwdGlvbiddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0icmVwcmVzZW50YXRpb24iIHNlbGVjdD0iJGRlc2NyaXB0aW9uL2F0dHJpYnV0ZVtAbmFtZT0ncmVwcmVzZW50YXRpb24nXSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9Im5vdGF0aW9uIiBzZWxlY3Q9IiRkZXNjcmlwdGlvbi9hdHRyaWJ1dGVbQG5hbWU9J25vdGF0aW9uJ10iLz4KLQkJPHhzbDppZiB0ZXN0PSIkYnJpZWZPdXRsaW5lICE9ICcnIG9yICRtYWluRGVzY3JpcHRpb24gIT0gJycgb3IgJHJlcHJlc2VudGF0aW9uICE9ICcnIG9yICRub3RhdGlvbiAhPSAnJyI+Ci0JCQk8ZGl2IGNsYXNzPSJzZWN0aW9uSGVhZGluZyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRkZXNjcmlwdGlvblRleHQiLz48L2Rpdj4KLQkJCTxkaXYgY2xhc3M9InNlY3Rpb25Db250ZW50Ij4JCQkKLQkJCQk8dGFibGUgY2xhc3M9InNlY3Rpb25UYWJsZSIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiPgkJCQkJCi0JCQkJCTx4c2w6aWYgdGVzdD0iJG1haW5EZXNjcmlwdGlvbiAhPSAnJyI+Ci0JCQkJCQk8dHIgdmFsaWduPSJ0b3AiPgotCQkJCQkJCTx0aCBjbGFzcz0ic2VjdGlvblRhYmxlSGVhZGluZyIgc2NvcGU9InJvdyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRtYWluRGVzY3JpcHRpb25UZXh0Ii8+PC90aD4KLQkJCQkJCQk8dGQgY2xhc3M9InNlY3Rpb25UYWJsZUNlbGwiPgotCQkJCQkJCQk8eHNsOnZhbHVlLW9mIGRpc2FibGUtb3V0cHV0LWVzY2FwaW5nPSJ5ZXMiIHNlbGVjdD0iJG1haW5EZXNjcmlwdGlvbiIvPgotCQkJCQkJCTwvdGQ+Ci0JCQkJCQk8L3RyPgotCQkJCQk8L3hzbDppZj4KLQkJCQkJPHhzbDppZiB0ZXN0PSIkYnJpZWZPdXRsaW5lICE9ICcnIj4KLQkJCQkJCTx0ciB2YWxpZ249InRvcCI+Ci0JCQkJCQkJPHRoIGNsYXNzPSJzZWN0aW9uVGFibGVIZWFkaW5nIiBzY29wZT0icm93Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGJyaWVmT3V0bGluZVRleHQiLz48L3RoPgotCQkJCQkJCTx0ZCBjbGFzcz0ic2VjdGlvblRhYmxlQ2VsbCI+Ci0JCQkJCQkJCTx4c2w6dmFsdWUtb2YgZGlzYWJsZS1vdXRwdXQtZXNjYXBpbmc9InllcyIgc2VsZWN0PSIkYnJpZWZPdXRsaW5lIi8+Ci0JCQkJCQkJPC90ZD4KLQkJCQkJCTwvdHI+Ci0JCQkJCTwveHNsOmlmPgkJCQkJCi0JCQkJCTx4c2w6aWYgdGVzdD0iJG5vdGF0aW9uICE9ICcnIj4KLQkJCQkJCTx0ciB2YWxpZ249InRvcCI+Ci0JCQkJCQkJPHRoIGNsYXNzPSJzZWN0aW9uVGFibGVIZWFkaW5nIiBzY29wZT0icm93Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5vdGF0aW9uVGV4dCIvPjwvdGg+Ci0JCQkJCQkJPHRkIGNsYXNzPSJzZWN0aW9uVGFibGVDZWxsIj4KLQkJCQkJCQkJPHhzbDp2YWx1ZS1vZiBkaXNhYmxlLW91dHB1dC1lc2NhcGluZz0ieWVzIiBzZWxlY3Q9IiRub3RhdGlvbiIvPgotCQkJCQkJCTwvdGQ+Ci0JCQkJCQk8L3RyPgotCQkJCQk8L3hzbDppZj4KLQkJCQkJPHhzbDppZiB0ZXN0PSIkcmVwcmVzZW50YXRpb24gIT0gJyciPgotCQkJCQkJPHRyIHZhbGlnbj0idG9wIj4KLQkJCQkJCQk8dGggY2xhc3M9InNlY3Rpb25UYWJsZUhlYWRpbmciIHNjb3BlPSJyb3ciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcmVwcmVzZW50YXRpb25UZXh0Ii8+PC90aD4KLQkJCQkJCQk8dGQgY2xhc3M9InNlY3Rpb25UYWJsZUNlbGwiPgotCQkJCQkJCQk8eHNsOnZhbHVlLW9mIGRpc2FibGUtb3V0cHV0LWVzY2FwaW5nPSJ5ZXMiIHNlbGVjdD0iJHJlcHJlc2VudGF0aW9uIi8+Ci0JCQkJCQkJPC90ZD4KLQkJCQkJCTwvdHI+Ci0JCQkJCTwveHNsOmlmPgotCQkJCTwvdGFibGU+Ci0JCQk8L2Rpdj4KLQkJPC94c2w6aWY+Ci0JPC94c2w6dGVtcGxhdGU+CQotCQotPC94c2w6c3R5bGVzaGVldD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC94c2wvYXJ0aWZhY3RfZGVzY3JpcHRvci54c2wgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQveHNsL2FydGlmYWN0X2Rlc2NyaXB0b3IueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MDM4ZDdlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC94c2wvYXJ0aWZhY3RfZGVzY3JpcHRvci54c2wKKysrIC9kZXYvbnVsbApAQCAtMSw1ODcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotCi08eHNsOnN0eWxlc2hlZXQgdmVyc2lvbj0iMS4wIgotCXhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIgotCXhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiPgotCi08eHNsOm91dHB1dCBtZXRob2Q9Imh0bWwiIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiAKLQlkb2N0eXBlLXB1YmxpYz0iLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iIAotCWRvY3R5cGUtc3lzdGVtPSJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIiAKLQlpbmRlbnQ9InllcyIvPgotCQotCTx4c2w6aW5jbHVkZSBocmVmPSJkZXNjcmlwdG9yLnhzbCIvPgotCTx4c2w6aW5jbHVkZSBocmVmPSJwdXJwb3NlLnhzbCIvPgotCTx4c2w6aW5jbHVkZSBocmVmPSJ0YWlsb3JpbmcueHNsIi8+Ci0JPHhzbDppbmNsdWRlIGhyZWY9Indvcmtwcm9kdWN0X2hlbHBlci54c2wiLz4KLQotCTx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii9FbGVtZW50Ij4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJlbGVtZW50VHlwZSIgc2VsZWN0PSJAVHlwZSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImVsZW1lbnRUeXBlTmFtZSIgc2VsZWN0PSJAVHlwZU5hbWUiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJlbGVtZW50TmFtZSIgc2VsZWN0PSJATmFtZSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImVsZW1lbnRQcmVzZW50YXRpb25OYW1lIiBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImJhY2tQYXRoIiBzZWxlY3Q9IkBCYWNrUGF0aCIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InNoYXBlSW1hZ2UiIHNlbGVjdD0iY29uY2F0KCRiYWNrUGF0aCxAU2hhcGVpY29uVXJsKSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImltYWdlUGF0aCIgc2VsZWN0PSJjb25jYXQoJGJhY2tQYXRoLCAnaW1hZ2VzLycpIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0id29ya1Byb2R1Y3QiIHNlbGVjdD0icmVmZXJlbmNlW0BuYW1lPSdXb3JrUHJvZHVjdCddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0id29ya1Byb2R1Y3RUeXBlIiBzZWxlY3Q9IiR3b3JrUHJvZHVjdC9FbGVtZW50L0BUeXBlTmFtZSIvPgkJCQkKLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJwcmVzZW50YXRpb24iIHNlbGVjdD0icmVmZXJlbmNlW0BuYW1lPSdwcmVzZW50YXRpb24nXSIvPgkJCQkKLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJjb250ZW50RGVzY3JpcHRpb24iIHNlbGVjdD0iJHByZXNlbnRhdGlvbi9FbGVtZW50W0BUeXBlPSdXb3JrUHJvZHVjdERlc2NyaXB0b3InXSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9IndvcmtQcm9kdWN0RGVzY3JpcHRvciIgc2VsZWN0PSIkcHJlc2VudGF0aW9uL0VsZW1lbnRbQFR5cGU9J1dvcmtQcm9kdWN0RGVzY3JpcHRvciddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iZGVzY3JpcHRvckRlc2NyaXB0aW9uIiBzZWxlY3Q9IiRwcmVzZW50YXRpb24vRWxlbWVudFtAVHlwZT0nRGVzY3JpcHRvckRlc2NyaXB0aW9uJ10iLz4JCQotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InJlc3BvbnNpYmxlUm9sZSIgc2VsZWN0PSJyZWZlcmVuY2VbQG5hbWU9J3Jlc3BvbnNpYmxlUm9sZSddL0VsZW1lbnRbQFR5cGU9J1JvbGVEZXNjcmlwdG9yJ10iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJjb3B5cmlnaHQiIHNlbGVjdD0iY29weXJpZ2h0Ii8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0ic2hvd1RyZWVCcm93c2VyIiBzZWxlY3Q9IkBzaG93VHJlZUJyb3dzZXIiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJxdWVyeVN0cmluZyIgc2VsZWN0PSJAcXVlcnlTdHJpbmciLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJyZWxQcm9jZXNzUGF0aCIgc2VsZWN0PSJAcmVsUHJvY2Vzc1BhdGgiLz4KLQotCQk8aHRtbD4KLQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9ImxhbmciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbGFuZyIvPjwveHNsOmF0dHJpYnV0ZT4KLQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9InhtbDpsYW5nIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGxhbmciLz48L3hzbDphdHRyaWJ1dGU+Ci0JCQk8aGVhZD4KLQkJCQk8dGl0bGU+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50VHlwZU5hbWUiLz46IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudFByZXNlbnRhdGlvbk5hbWUiLz48L3RpdGxlPgotCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJ1bWFNZXRhVGFncyI+Ci0JCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50VHlwZSIgc2VsZWN0PSIkZWxlbWVudFR5cGUiLz4KLQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnROYW1lIiBzZWxlY3Q9IiRlbGVtZW50TmFtZSIvPgotCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudFByZXNlbnRhdGlvbk5hbWUiIHNlbGVjdD0iJGVsZW1lbnRQcmVzZW50YXRpb25OYW1lIi8+Ci0JCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQk8bWV0YSBuYW1lPSJlbGVtZW50X3R5cGUiIGNvbnRlbnQ9InskZWxlbWVudFR5cGV9Ii8+Ci0JCQkJPG1ldGEgbmFtZT0iZmlsZXR5cGUiIGNvbnRlbnQ9ImRlc2NyaXB0aW9uIi8+Ci0JCQkJPG1ldGEgbmFtZT0icm9sZSI+Ci0JCQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9ImNvbnRlbnQiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcmVzcG9uc2libGVSb2xlL0BEaXNwbGF5TmFtZSIvPjwveHNsOmF0dHJpYnV0ZT4KLQkJCQk8L21ldGE+Ci0JCQkJPGxpbmsgcmVsPSJTdHlsZVNoZWV0IiBocmVmPSJ7JGJhY2tQYXRofWNzcy9kZWZhdWx0LmNzcyIgdHlwZT0idGV4dC9jc3MiLz4KLQkJCQk8c2NyaXB0IHNyYz0ieyRiYWNrUGF0aH1zY3JpcHRzL0NvbnRlbnRQYWdlUmVzb3VyY2UuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPjwvc2NyaXB0PgotCQkJCTxzY3JpcHQgc3JjPSJ7JGJhY2tQYXRofXNjcmlwdHMvQ29udGVudFBhZ2VTZWN0aW9uLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij48L3NjcmlwdD4KLQkJCQk8c2NyaXB0IHNyYz0ieyRiYWNrUGF0aH1zY3JpcHRzL0NvbnRlbnRQYWdlU3ViU2VjdGlvbi5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PC9zY3JpcHQ+Ci0JCQkJPHNjcmlwdCBzcmM9InskYmFja1BhdGh9c2NyaXB0cy9BY3Rpdml0eVRyZWVUYWJsZS5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PC9zY3JpcHQ+Ci0JCQkJPHNjcmlwdCBzcmM9InskYmFja1BhdGh9c2NyaXB0cy9Qcm9jZXNzRWxlbWVudFBhZ2UuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPjwvc2NyaXB0PgotCQkJCTxzY3JpcHQgc3JjPSJ7JGJhY2tQYXRofXNjcmlwdHMvQ29udGVudFBhZ2VUb29sYmFyLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij48L3NjcmlwdD4KLQkJCQk8c2NyaXB0IHNyYz0ieyRiYWNrUGF0aH1zY3JpcHRzL2NvbnRlbnRQYWdlLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij48L3NjcmlwdD4KLQkJCQk8c2NyaXB0IHNyYz0ieyRiYWNrUGF0aH1zY3JpcHRzL3Byb2Nlc3NFbGVtZW50RGF0YS5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PC9zY3JpcHQ+Ci0JCQkJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij4KLQkJCQkJdmFyIGRlZmF1bHRRdWVyeVN0ciA9ICc8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHF1ZXJ5U3RyaW5nIi8+JzsKLQkJCQkJdmFyIGJhY2tQYXRoID0gJzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkYmFja1BhdGgiLz4nOwotCQkJCQl2YXIgaW1nUGF0aCA9ICc8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGltYWdlUGF0aCIvPic7Ci0JCQkJCXZhciBub2RlSW5mbz1udWxsOwotCQkJCQljb250ZW50UGFnZS5wcmVsb2FkKGltZ1BhdGgsIGJhY2tQYXRoLCBub2RlSW5mbywgZGVmYXVsdFF1ZXJ5U3RyLCBmYWxzZSwgdHJ1ZSwgZmFsc2UpOwotCQkJCTwvc2NyaXB0PgotCQkJPC9oZWFkPgotCQkJPGJvZHk+Ci0JCQk8ZGl2IGlkPSJicmVhZGNydW1icyI+PC9kaXY+Ci0JCQkJPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci0JCQkJCTx0cj4KLQkJCQkJCTx0ZCB2YWxpZ249InRvcCI+Ci0JCQkJCQkJPGEgbmFtZT0iVG9wIi8+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9Im92ZXJ2aWV3Ij4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnRUeXBlIiBzZWxlY3Q9IiRlbGVtZW50VHlwZSIvPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudFR5cGVOYW1lIiBzZWxlY3Q9IiRlbGVtZW50VHlwZU5hbWUiLz4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnRQcmVzZW50YXRpb25OYW1lIiBzZWxlY3Q9IiRlbGVtZW50UHJlc2VudGF0aW9uTmFtZSIvPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudEljb24iIHNlbGVjdD0iJHNoYXBlSW1hZ2UiLz4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImJhY2tQYXRoIiBzZWxlY3Q9IiRiYWNrUGF0aCIvPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0ic2hvd1RyZWVCcm93c2VyIiBzZWxlY3Q9IiRzaG93VHJlZUJyb3dzZXIiLz4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9IndvcmtQcm9kdWN0VHlwZSIgc2VsZWN0PSIkd29ya1Byb2R1Y3RUeXBlIi8+Ci0JCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icHVycG9zZVNlY3Rpb24iPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZGVzY3JpcHRpb24iIHNlbGVjdD0iJGRlc2NyaXB0b3JEZXNjcmlwdGlvbiIvPgotCQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImRlc2NyaXB0b3JSZWxhdGlvbnNoaXBzU2VjdGlvbiIvPgotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJkZWxpdmVyYWJsZVNlY3Rpb24iPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZGVzY3JpcHRpb24iIHNlbGVjdD0iJGRlc2NyaXB0b3JEZXNjcmlwdGlvbiIvPgotCQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0KLQkJCQkJCQk8eHNsOmNob29zZT4KLQkJCQkJCQkJPHhzbDp3aGVuIHRlc3Q9IiRkZXNjcmlwdG9yRGVzY3JpcHRpb24vYXR0cmlidXRlW0BuYW1lPSdicmllZk91dGxpbmUnXSAhPScnICI+Ci0JCQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iZGVzY3JpcHRpb25TZWN0aW9uIj4KLQkJCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZGVzY3JpcHRpb24iIHNlbGVjdD0iJGRlc2NyaXB0b3JEZXNjcmlwdGlvbiIvPgotCQkJCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4JCi0JCQkJCQkJCTwveHNsOndoZW4+Ci0JCQkJCQkJCTx4c2w6b3RoZXJ3aXNlPgotCQkJCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InJlZmluZWREZXNjcmlwdGlvblNlY3Rpb24iPgotCQkJCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJkZXNjcmlwdGlvbiIgc2VsZWN0PSIkZGVzY3JpcHRvckRlc2NyaXB0aW9uIi8+Ci0JCQkJCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgkKLQkJCQkJCQkJPC94c2w6b3RoZXJ3aXNlPgotCQkJCQkJCTwveHNsOmNob29zZT4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icHJvcGVydGllc1NlY3Rpb24iPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iY29udGVudERlc2NyaXB0aW9uIiBzZWxlY3Q9IiRjb250ZW50RGVzY3JpcHRpb24iLz4KLQkJCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJ1c2FnZVNlY3Rpb24iPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iY29udGVudERlc2NyaXB0aW9uIiBzZWxlY3Q9IiRkZXNjcmlwdG9yRGVzY3JpcHRpb24iLz4KLQkJCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJ3b3JrUHJvZHVjdElsbHVzdHJhdGlvbnNTZWN0aW9uIi8+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImtleUNvbnNpZGVyYXRpb25zU2VjdGlvbiI+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJkZXNjcmlwdGlvbiIgc2VsZWN0PSIkZGVzY3JpcHRvckRlc2NyaXB0aW9uIi8+Ci0JCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0idGFpbG9yaW5nU2VjdGlvbiI+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJkZXNjcmlwdGlvbiIgc2VsZWN0PSIkZGVzY3JpcHRvckRlc2NyaXB0aW9uIi8+Ci0JCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0ibW9yZUluZm9TZWN0aW9uIi8+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImNvcHlyaWdodCI+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJjb3B5cmlnaHQiIHNlbGVjdD0iJGNvcHlyaWdodCIvPgotCQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQk8L3RkPgkJCQkJCQotCQkJCQk8L3RyPgotCQkJCTwvdGFibGU+Ci0JCQk8L2JvZHk+Ci0JCQkJPHNjcmlwdCBsYW5ndWFnZT0iSmF2YVNjcmlwdCIgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLQkJCQkJY29udGVudFBhZ2Uub25sb2FkKCk7Ci0JCQkJCWNvbnRlbnRQYWdlLnByb2Nlc3NQYWdlLmZpeERlc2NyaXB0b3JMaW5rcygpOwotCQkJCTwvc2NyaXB0PgotCQk8L2h0bWw+Ci0JPC94c2w6dGVtcGxhdGU+CQotCi0JPHhzbDp0ZW1wbGF0ZSBuYW1lPSJkZXNjcmlwdGlvblNlY3Rpb24iPgotCQk8eHNsOnBhcmFtIG5hbWU9ImRlc2NyaXB0aW9uIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iYnJpZWZPdXRsaW5lIiBzZWxlY3Q9IiRkZXNjcmlwdGlvbi9hdHRyaWJ1dGVbQG5hbWU9J2JyaWVmT3V0bGluZSddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0ibm90YXRpb24iIHNlbGVjdD0iJGRlc2NyaXB0aW9uL2F0dHJpYnV0ZVtAbmFtZT0nbm90YXRpb24nXSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InJlcHJlc2VudGF0aW9uIiBzZWxlY3Q9IiRkZXNjcmlwdGlvbi9hdHRyaWJ1dGVbQG5hbWU9J3JlcHJlc2VudGF0aW9uJ10iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJtYWluRGVzY3JpcHRpb24iIHNlbGVjdD0iJGRlc2NyaXB0aW9uL2F0dHJpYnV0ZVtAbmFtZT0ncmVmaW5lZERlc2NyaXB0aW9uJ10iLz4KLQkJPHhzbDppZiB0ZXN0PSIkYnJpZWZPdXRsaW5lICE9ICcnIG9yICRtYWluRGVzY3JpcHRpb24gIT0gJyciPgotCQkJPGRpdiBjbGFzcz0ic2VjdGlvbkhlYWRpbmciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZGVzY3JpcHRpb25UZXh0Ii8+PC9kaXY+Ci0JCQk8ZGl2IGNsYXNzPSJzZWN0aW9uQ29udGVudCI+CQkJCi0JCQkJPHRhYmxlIGNsYXNzPSJzZWN0aW9uVGFibGUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4KLQkJCQkJPHhzbDppZiB0ZXN0PSIkbWFpbkRlc2NyaXB0aW9uICE9ICcnIj4KLQkJCQkJCTx0ciB2YWxpZ249InRvcCI+Ci0JCQkJCQkJPHRoIGNsYXNzPSJzZWN0aW9uVGFibGVIZWFkaW5nIiBzY29wZT0icm93Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG1haW5EZXNjcmlwdGlvblRleHQiLz48L3RoPgotCQkJCQkJCTx0ZCBjbGFzcz0ic2VjdGlvblRhYmxlQ2VsbCI+Ci0JCQkJCQkJCTx4c2w6dmFsdWUtb2YgZGlzYWJsZS1vdXRwdXQtZXNjYXBpbmc9InllcyIgc2VsZWN0PSIkbWFpbkRlc2NyaXB0aW9uIi8+Ci0JCQkJCQkJPC90ZD4KLQkJCQkJCTwvdHI+Ci0JCQkJCTwveHNsOmlmPgkKLQkJCQkJPHhzbDppZiB0ZXN0PSIkYnJpZWZPdXRsaW5lICE9ICcnIj4KLQkJCQkJCTx0ciB2YWxpZ249InRvcCI+Ci0JCQkJCQkJPHRoIGNsYXNzPSJzZWN0aW9uVGFibGVIZWFkaW5nIiBzY29wZT0icm93Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGJyaWVmT3V0bGluZVRleHQiLz48L3RoPgotCQkJCQkJCTx0ZCBjbGFzcz0ic2VjdGlvblRhYmxlQ2VsbCI+Ci0JCQkJCQkJCTx4c2w6dmFsdWUtb2YgZGlzYWJsZS1vdXRwdXQtZXNjYXBpbmc9InllcyIgc2VsZWN0PSIkYnJpZWZPdXRsaW5lIi8+Ci0JCQkJCQkJPC90ZD4KLQkJCQkJCTwvdHI+Ci0JCQkJCTwveHNsOmlmPgotCQkJCQk8eHNsOmlmIHRlc3Q9IiRub3RhdGlvbiAhPSAnJyI+Ci0JCQkJCQk8dHIgdmFsaWduPSJ0b3AiPgotCQkJCQkJCTx0aCBjbGFzcz0ic2VjdGlvblRhYmxlSGVhZGluZyIgc2NvcGU9InJvdyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRub3RhdGlvblRleHQiLz48L3RoPgotCQkJCQkJCTx0ZCBjbGFzcz0ic2VjdGlvblRhYmxlQ2VsbCI+Ci0JCQkJCQkJCTx4c2w6dmFsdWUtb2YgZGlzYWJsZS1vdXRwdXQtZXNjYXBpbmc9InllcyIgc2VsZWN0PSIkbm90YXRpb24iLz4KLQkJCQkJCQk8L3RkPgotCQkJCQkJPC90cj4KLQkJCQkJPC94c2w6aWY+Ci0JCQkJCTx4c2w6aWYgdGVzdD0iJHJlcHJlc2VudGF0aW9uICE9ICcnIj4KLQkJCQkJCTx0ciB2YWxpZ249InRvcCI+Ci0JCQkJCQkJPHRoIGNsYXNzPSJzZWN0aW9uVGFibGVIZWFkaW5nIiBzY29wZT0icm93Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHJlcHJlc2VudGF0aW9uVGV4dCIvPjwvdGg+Ci0JCQkJCQkJPHRkIGNsYXNzPSJzZWN0aW9uVGFibGVDZWxsIj4KLQkJCQkJCQkJPHhzbDp2YWx1ZS1vZiBkaXNhYmxlLW91dHB1dC1lc2NhcGluZz0ieWVzIiBzZWxlY3Q9IiRyZXByZXNlbnRhdGlvbiIvPgotCQkJCQkJCTwvdGQ+Ci0JCQkJCQk8L3RyPgotCQkJCQk8L3hzbDppZj4JCQkJCQotCQkJCTwvdGFibGU+Ci0JCQk8L2Rpdj4KLQkJPC94c2w6aWY+Ci0JPC94c2w6dGVtcGxhdGU+CQotCi0JPHhzbDp0ZW1wbGF0ZSBuYW1lPSJwcm9wZXJ0aWVzU2VjdGlvbiI+Ci0JCTx4c2w6cGFyYW0gbmFtZT0iY29udGVudERlc2NyaXB0aW9uIi8+Ci0JCTxkaXYgY2xhc3M9InNlY3Rpb25IZWFkaW5nIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb3BlcnRpZXNUZXh0Ii8+PC9kaXY+Ci0JCTxkaXYgY2xhc3M9InNlY3Rpb25Db250ZW50Ij4KLQkJCTx0YWJsZSBjbGFzcz0ic2VjdGlvblRhYmxlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+Ci0JCQkgICAgPHhzbDppZiB0ZXN0PSJhdHRyaWJ1dGVbQG5hbWU9J2FjdGl2aXR5RW50cnlTdGF0ZSddIj4KLQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InByb3BlcnR5Ij4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJmaWVsZExhYmVsIiBzZWxlY3Q9IiRhY3Rpdml0eUVudHJ5U3RhdGVUZXh0Ii8+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZmllbGRUZXh0IiBzZWxlY3Q9ImF0dHJpYnV0ZVtAbmFtZT0nYWN0aXZpdHlFbnRyeVN0YXRlJ10iLz4KLQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQk8L3hzbDppZj4KLQkJCQk8eHNsOmlmIHRlc3Q9ImF0dHJpYnV0ZVtAbmFtZT0nYWN0aXZpdHlFeGl0U3RhdGUnXSI+Ci0JCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJwcm9wZXJ0eSI+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZmllbGRMYWJlbCIgc2VsZWN0PSIkYWN0aXZpdHlFeGl0U3RhdGVUZXh0Ii8+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZmllbGRUZXh0IiBzZWxlY3Q9ImF0dHJpYnV0ZVtAbmFtZT0nYWN0aXZpdHlFeGl0U3RhdGUnXSIvPgotCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCTwveHNsOmlmPgkJCQotCQkJCTx4c2w6aWYgdGVzdD0iYXR0cmlidXRlW0BuYW1lPSdpc09wdGlvbmFsJ10iPgotCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icHJvcGVydHkiPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImZpZWxkTGFiZWwiIHNlbGVjdD0iJG9wdGlvbmFsVGV4dCIvPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImZpZWxkVGV4dCIgc2VsZWN0PSJhdHRyaWJ1dGVbQG5hbWU9J2lzT3B0aW9uYWwnXSIvPgotCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCTwveHNsOmlmPgkJCQkKLQkJCQk8eHNsOmlmIHRlc3Q9ImF0dHJpYnV0ZVtAbmFtZT0naXNQbGFubmVkJ10iPgotCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icHJvcGVydHkiPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImZpZWxkTGFiZWwiIHNlbGVjdD0iJHBsYW5uZWRUZXh0Ii8+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZmllbGRUZXh0IiBzZWxlY3Q9ImF0dHJpYnV0ZVtAbmFtZT0naXNQbGFubmVkJ10iLz4KLQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQk8L3hzbDppZj4JCQotCQkJCTx4c2w6aWYgdGVzdD0iYXR0cmlidXRlW0BuYW1lPSdQbGFubmluZ0RhdGEnXSI+Ci0JCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJwcm9wZXJ0eSI+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZmllbGRMYWJlbCIgc2VsZWN0PSIkcGxhbm5pbmdEYXRhVGV4dCIvPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImZpZWxkVGV4dCIgc2VsZWN0PSJhdHRyaWJ1dGVbQG5hbWU9J1BsYW5uaW5nRGF0YSddIi8+Ci0JCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJPC94c2w6aWY+Ci0JCQk8L3RhYmxlPgotCQk8L2Rpdj4KLQk8L3hzbDp0ZW1wbGF0ZT4KLQotCTx4c2w6dGVtcGxhdGUgbmFtZT0idXNhZ2VTZWN0aW9uIj4KLQkJPHhzbDpwYXJhbSBuYW1lPSJjb250ZW50RGVzY3JpcHRpb24iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJ1c2FnZUd1aWRhbmNlIiBzZWxlY3Q9IiRjb250ZW50RGVzY3JpcHRpb24vYXR0cmlidXRlW0BuYW1lPSd1c2FnZUd1aWRhbmNlJ10iLz4KLQkJPHhzbDppZiB0ZXN0PSIkdXNhZ2VHdWlkYW5jZSAhPSAnJyI+Ci0JCQk8ZGl2IGNsYXNzPSJzZWN0aW9uSGVhZGluZyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR1c2FnZUd1aWRhbmNlVGV4dCIvPjwvZGl2PgotCQkJPGRpdiBjbGFzcz0ic2VjdGlvbkNvbnRlbnQiPgotCQkJCTx0YWJsZSBjbGFzcz0ic2VjdGlvblRhYmxlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+Ci0JCQkJCTx0ciB2YWxpZ249InRvcCI+Ci0JCQkJCQk8dGQgY2xhc3M9InNlY3Rpb25UYWJsZUNlbGwiPgotCQkJCQkJCTx4c2w6dmFsdWUtb2YgZGlzYWJsZS1vdXRwdXQtZXNjYXBpbmc9InllcyIgc2VsZWN0PSIkdXNhZ2VHdWlkYW5jZSIvPgotCQkJCQkJPC90ZD4KLQkJCQkJPC90cj4KLQkJCQk8L3RhYmxlPgotCQkJPC9kaXY+Ci0JCTwveHNsOmlmPgotCTwveHNsOnRlbXBsYXRlPgotCi0JPHhzbDp0ZW1wbGF0ZSBuYW1lPSJkZXNjcmlwdG9yUmVsYXRpb25zaGlwc1NlY3Rpb24iPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImZ1bGZpbGxpbmdXb3JrUHJvZHVjdHMiIHNlbGVjdD0icmVmZXJlbmNlTGlzdFtAbmFtZT0nRnVsRmlsbHNfRnVsbEZpbGxhYmxlRWxlbWVudHMnXS9FbGVtZW50Ij48L3hzbDp2YXJpYWJsZT4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJmdWxmaWxsZWRTbG90cyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0W0BuYW1lPSdmdWxmaWxscyddL0VsZW1lbnQiPjwveHNsOnZhcmlhYmxlPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9IndvcmtQcm9kdWN0IiBzZWxlY3Q9InJlZmVyZW5jZVtAbmFtZT0nV29ya1Byb2R1Y3QnXS9FbGVtZW50W0BUeXBlPSdBcnRpZmFjdCddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iZGVsaXZlcmFibGVQYXJ0cyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0W0BuYW1lPSdkZWxpdmVyYWJsZVBhcnRzJ10vRWxlbWVudCIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImltcGFjdHMiIHNlbGVjdD0icmVmZXJlbmNlTGlzdFtAbmFtZT0naW1wYWN0cyddL0VsZW1lbnRbQFR5cGU9J1dvcmtQcm9kdWN0RGVzY3JpcHRvciddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iaW1wYWN0ZWRCeSIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0W0BuYW1lPSdpbXBhY3RlZEJ5J10vRWxlbWVudFtAVHlwZT0nV29ya1Byb2R1Y3REZXNjcmlwdG9yJ10iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJtYW5kYXRvcnlJbnB1dFRvIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3RbQG5hbWU9J1dvcmtQcm9kdWN0RGVzY3JpcHRvcl9NYW5kYXRvcnlJbnB1dFRvX1Rhc2tEZXNjcmlwdG9ycyddL0VsZW1lbnRbQFR5cGU9J1Rhc2tEZXNjcmlwdG9yJ10iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJvcHRpb25hbElucHV0VG8iIHNlbGVjdD0icmVmZXJlbmNlTGlzdFtAbmFtZT0nV29ya1Byb2R1Y3REZXNjcmlwdG9yX09wdGlvbmFsSW5wdXRUb19UYXNrRGVzY3JpcHRvcnMnXS9FbGVtZW50W0BUeXBlPSdUYXNrRGVzY3JpcHRvciddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iZXh0ZXJuYWxJbnB1dFRvIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3RbQG5hbWU9J1dvcmtQcm9kdWN0RGVzY3JpcHRvcl9FeHRlcm5hbElucHV0VG9fVGFza0Rlc2NyaXB0b3JzJ10vRWxlbWVudFtAVHlwZT0nVGFza0Rlc2NyaXB0b3InXSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9Im91dHB1dEZyb20iIHNlbGVjdD0icmVmZXJlbmNlTGlzdFtAbmFtZT0nV29ya1Byb2R1Y3REZXNjcmlwdG9yX091dHB1dEZyb21fVGFza0Rlc2NyaXB0b3JzJ10vRWxlbWVudFtAVHlwZT0nVGFza0Rlc2NyaXB0b3InXSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9Im1hbmRhdG9yeUlucHV0VG9UYXNrRGVzY3JpcHRvcnNfZnJvbVNsb3RzIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3RbQG5hbWU9J21hbmRhdG9yeUlucHV0VG9UYXNrRGVzY3JpcHRvcnNfZnJvbVNsb3RzJ10vRWxlbWVudFtAVHlwZT0nVGFza0Rlc2NyaXB0b3InXSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9Im9wdGlvbmFsSW5wdXRUb1Rhc2tEZXNjcmlwdG9yc19mcm9tU2xvdHMiIHNlbGVjdD0icmVmZXJlbmNlTGlzdFtAbmFtZT0nb3B0aW9uYWxJbnB1dFRvVGFza0Rlc2NyaXB0b3JzX2Zyb21TbG90cyddL0VsZW1lbnRbQFR5cGU9J1Rhc2tEZXNjcmlwdG9yJ10iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJvdXRwdXRGcm9tVGFza0Rlc2NyaXB0b3JzX2Zyb21TbG90cyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0W0BuYW1lPSdvdXRwdXRGcm9tVGFza0Rlc2NyaXB0b3JzX2Zyb21TbG90cyddL0VsZW1lbnRbQFR5cGU9J1Rhc2tEZXNjcmlwdG9yJ10iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJzdXBlckFjdGl2aXRpZXMiIHNlbGVjdD0icmVmZXJlbmNlTGlzdFtAbmFtZT0nc3VwZXJBY3Rpdml0aWVzJ10vRWxlbWVudFtAVHlwZT0nQWN0aXZpdHknXSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InJlc3BvbnNpYmxlUm9sZSIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0W0BuYW1lPSdXb3JrUHJvZHVjdERlc2NyaXB0b3JfUmVzcG9uc2libGVSb2xlRGVzY3JpcHRvcnMnXS9FbGVtZW50W0BUeXBlPSdSb2xlRGVzY3JpcHRvciddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0id29ya2VkT25CeSIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0W0BuYW1lPSd3b3JrZWRPbkJ5J10vRWxlbWVudCIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InNob3dGdWxsTWV0aG9kQ29udGVudCIgc2VsZWN0PSJAU2hvd0Z1bGxNZXRob2RDb250ZW50Ii8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iY29udGFpbmVyQXJ0aWZhY3QiIHNlbGVjdD0icmVmZXJlbmNlW0BuYW1lPSdjb250YWluZXJBcnRpZmFjdCddL0VsZW1lbnQiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJjb250YWluZWRBcnRpZmFjdHMiIHNlbGVjdD0icmVmZXJlbmNlTGlzdFtAbmFtZT0nY29udGFpbmVkQXJ0aWZhY3RzJ10vRWxlbWVudFtAVHlwZT0nV29ya1Byb2R1Y3REZXNjcmlwdG9yJ10iLz4KLQotCQk8eHNsOmlmIHRlc3Q9ImNvdW50KCRmdWxmaWxsaW5nV29ya1Byb2R1Y3RzKSArIGNvdW50KCRmdWxmaWxsZWRTbG90cykgKyBjb3VudCgkcmVzcG9uc2libGVSb2xlKSArIGNvdW50KCR3b3JrZWRPbkJ5KSArIGNvdW50KCRtYW5kYXRvcnlJbnB1dFRvKSArIGNvdW50KCRvcHRpb25hbElucHV0VG8pICsgY291bnQoJGV4dGVybmFsSW5wdXRUbykgKyBjb3VudCgkb3V0cHV0RnJvbSkgKyBjb3VudCgkbWFuZGF0b3J5SW5wdXRUb1Rhc2tEZXNjcmlwdG9yc19mcm9tU2xvdHMpICsgY291bnQoJG9wdGlvbmFsSW5wdXRUb1Rhc2tEZXNjcmlwdG9yc19mcm9tU2xvdHMpICsgY291bnQoJG91dHB1dEZyb21UYXNrRGVzY3JpcHRvcnNfZnJvbVNsb3RzKSArIGNvdW50KCRpbXBhY3RzKSArIGNvdW50KCRpbXBhY3RlZEJ5KT4gMCBvciAoY291bnQoJGNvbnRhaW5lckFydGlmYWN0KSArIGNvdW50KCRjb250YWluZWRBcnRpZmFjdHMpID4gMCBhbmQgJHNob3dGdWxsTWV0aG9kQ29udGVudCA9ICd0cnVlJykiPgotCQkJPGRpdiBjbGFzcz0ic2VjdGlvbkhlYWRpbmciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcmVsYXRpb25zaGlwc1RleHQiLz48L2Rpdj4KLQkJCTxkaXYgY2xhc3M9InNlY3Rpb25Db250ZW50Ij4KLQkJCQk8dGFibGUgY2xhc3M9InNlY3Rpb25UYWJsZSIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiPgotCi0JCQkJCTx4c2w6aWYgdGVzdD0iJHNob3dGdWxsTWV0aG9kQ29udGVudCA9ICd0cnVlJyBhbmQgY291bnQoJGNvbnRhaW5lckFydGlmYWN0KSA+IDAiPgotCQkJCQkJPHRyIHZhbGlnbj0idG9wIj4KLQkJCQkJCQk8dGggY2xhc3M9InNlY3Rpb25UYWJsZUhlYWRpbmciIHNjb3BlPSJyb3ciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkY29udGFpbmVyQXJ0aWZhY3RUZXh0Ii8+PC90aD4KLQkJCQkJCQk8dGQgY2xhc3M9InNlY3Rpb25UYWJsZUNlbGwiIGNvbHNwYW49IjIiPgotCQkJCQkJCTx1bD4KLQkJCQkJCQkJPHhzbDpmb3ItZWFjaCBzZWxlY3Q9IiRjb250YWluZXJBcnRpZmFjdCI+Ci0JCQkJCQkJCTx4c2w6c29ydCBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPgotCQkJCQkJCQkJPGxpPgotCQkJCQkJCQkJCTxhPgotCQkJCQkJCQkJCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJocmVmIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iL0VsZW1lbnQvQEJhY2tQYXRoIi8+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBVcmwiLz48L3hzbDphdHRyaWJ1dGU+Ci0JCQkJCQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJARGlzcGxheU5hbWUiLz4KLQkJCQkJCQkJCQk8L2E+Ci0JCQkJCQkJCQk8L2xpPgotCQkJCQkJCQk8L3hzbDpmb3ItZWFjaD4KLQkJCQkJCQk8L3VsPgotCQkJCQkJCTwvdGQ+Ci0JCQkJCQk8L3RyPgotCQkJCQk8L3hzbDppZj4JCQotCQkJCQkJCQotCQkJCQk8eHNsOmlmIHRlc3Q9IiRzaG93RnVsbE1ldGhvZENvbnRlbnQgPSAndHJ1ZScgYW5kIGNvdW50KCRjb250YWluZWRBcnRpZmFjdHMpID4gMCI+Ci0JCQkJCQk8dHIgdmFsaWduPSJ0b3AiPgotCQkJCQkJCTx0aCBjbGFzcz0ic2VjdGlvblRhYmxlSGVhZGluZyIgc2NvcGU9InJvdyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRjb250YWluZWRBcnRpZmFjdHNUZXh0Ii8+PC90aD4KLQkJCQkJCQk8dGQgY2xhc3M9InNlY3Rpb25UYWJsZUNlbGwiIGNvbHNwYW49IjIiPgotCQkJCQkJCTx1bD4KLQkJCQkJCQkJPHhzbDpmb3ItZWFjaCBzZWxlY3Q9IiRjb250YWluZWRBcnRpZmFjdHMiPgotCQkJCQkJCQkJPHhzbDpzb3J0IGRhdGEtdHlwZT0idGV4dCIgc2VsZWN0PSJARGlzcGxheU5hbWUiIG9yZGVyPSJhc2NlbmRpbmciIC8+Ci0JCQkJCQkJCQk8bGk+Ci0JCQkJCQkJCQkJPGE+Ci0JCQkJCQkJCQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9ImhyZWYiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIvRWxlbWVudC9AQmFja1BhdGgiLz48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQFVybCIvPjwveHNsOmF0dHJpYnV0ZT4JCQkJCQkJCQkJCQotCQkJCQkJCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQERpc3BsYXlOYW1lIi8+Ci0JCQkJCQkJCQkJPC9hPgotCQkJCQkJCQkJPC9saT4KLQkJCQkJCQkJPC94c2w6Zm9yLWVhY2g+Ci0JCQkJCQkJPC91bD4KLQkJCQkJCQk8L3RkPgotCQkJCQkJPC90cj4KLQkJCQkJPC94c2w6aWY+Ci0JCQkJCQotCQkJCQk8eHNsOmlmIHRlc3Q9ImNvdW50KCRmdWxmaWxsaW5nV29ya1Byb2R1Y3RzKSA+IDAiPgotCQkJCQkJPHRyIHZhbGlnbj0idG9wIj4KLQkJCQkJCQk8dGggY2xhc3M9InNlY3Rpb25UYWJsZUhlYWRpbmciIHNjb3BlPSJyb3ciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZnVsZmlsbGluZ1dvcmtQcm9kdWN0c1RleHQiLz48L3RoPgotCQkJCQkJCTx0ZCBjbGFzcz0ic2VjdGlvblRhYmxlQ2VsbCIgY29sc3Bhbj0iMiI+Ci0JCQkJCQkJPHVsPgotCQkJCQkJCQk8eHNsOmZvci1lYWNoIHNlbGVjdD0iJGZ1bGZpbGxpbmdXb3JrUHJvZHVjdHMiPgotCQkJCQkJCQk8eHNsOnNvcnQgc2VsZWN0PSJARGlzcGxheU5hbWUiLz4KLQkJCQkJCQkJCTxsaT4KLQkJCQkJCQkJCQk8YT4KLQkJCQkJCQkJCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0iaHJlZiI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii9FbGVtZW50L0BCYWNrUGF0aCIvPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAVXJsIi8+PC94c2w6YXR0cmlidXRlPgotCQkJCQkJCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQERpc3BsYXlOYW1lIi8+Ci0JCQkJCQkJCQkJPC9hPgotCQkJCQkJCQkJPC9saT4KLQkJCQkJCQkJPC94c2w6Zm9yLWVhY2g+Ci0JCQkJCQkJPC91bD4KLQkJCQkJCQk8L3RkPgotCQkJCQkJPC90cj4KLQkJCQkJPC94c2w6aWY+CQkKLQkJCQkJCi0JCQkJCTx4c2w6aWYgdGVzdD0iY291bnQoJGZ1bGZpbGxlZFNsb3RzKSA+IDAiPgotCQkJCQkJPHRyIHZhbGlnbj0idG9wIj4KLQkJCQkJCQk8dGggY2xhc3M9InNlY3Rpb25UYWJsZUhlYWRpbmciIHNjb3BlPSJyb3ciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZnVsZmlsbGVkU2xvdHNUZXh0Ii8+PC90aD4KLQkJCQkJCQk8dGQgY2xhc3M9InNlY3Rpb25UYWJsZUNlbGwiIGNvbHNwYW49IjIiPgotCQkJCQkJCTx1bD4KLQkJCQkJCQkJPHhzbDpmb3ItZWFjaCBzZWxlY3Q9IiRmdWxmaWxsZWRTbG90cyI+Ci0JCQkJCQkJCTx4c2w6c29ydCBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPgotCQkJCQkJCQkJPGxpPgotCQkJCQkJCQkJCTxhPgotCQkJCQkJCQkJCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJocmVmIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iL0VsZW1lbnQvQEJhY2tQYXRoIi8+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBVcmwiLz48L3hzbDphdHRyaWJ1dGU+Ci0JCQkJCQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJARGlzcGxheU5hbWUiLz4KLQkJCQkJCQkJCQk8L2E+Ci0JCQkJCQkJCQk8L2xpPgotCQkJCQkJCQk8L3hzbDpmb3ItZWFjaD4KLQkJCQkJCQk8L3VsPgotCQkJCQkJCTwvdGQ+Ci0JCQkJCQk8L3RyPgotCQkJCQk8L3hzbDppZj4JCQotCQkJCQkKLQkJCQkJPHhzbDppZiB0ZXN0PSJjb3VudCgkaW1wYWN0cykgPiAwIj4KLQkJCQkJCTx0ciB2YWxpZ249InRvcCI+Ci0JCQkJCQkJPHRoIGNsYXNzPSJzZWN0aW9uVGFibGVIZWFkaW5nIiBzY29wZT0icm93Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGRlcGVuZGVudFRleHQiLz48L3RoPgotCQkJCQkJCTx0ZCBjbGFzcz0ic2VjdGlvblRhYmxlQ2VsbCIgY29sc3Bhbj0iMyI+Ci0JCQkJCQkJPHVsPgotCQkJCQkJCQk8eHNsOmZvci1lYWNoIHNlbGVjdD0iJGltcGFjdHMiPgotCQkJCQkJCQk8eHNsOnNvcnQgc2VsZWN0PSJARGlzcGxheU5hbWUiLz4KLQkJCQkJCQkJCTxsaT4KLQkJCQkJCQkJCQk8YT4KLQkJCQkJCQkJCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0iaHJlZiI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii9FbGVtZW50L0BCYWNrUGF0aCIvPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAVXJsIi8+PC94c2w6YXR0cmlidXRlPgotCQkJCQkJCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQERpc3BsYXlOYW1lIi8+Ci0JCQkJCQkJCQkJPC9hPgotCQkJCQkJCQkJPC9saT4KLQkJCQkJCQkJPC94c2w6Zm9yLWVhY2g+Ci0JCQkJCQkJPC91bD4KLQkJCQkJCQk8L3RkPgotCQkJCQkJPC90cj4KLQkJCQkJPC94c2w6aWY+CQkJCQotCQkJCQk8eHNsOmlmIHRlc3Q9ImNvdW50KCRpbXBhY3RlZEJ5KSA+IDAiPgotCQkJCQkJPHRyIHZhbGlnbj0idG9wIj4KLQkJCQkJCQk8dGggY2xhc3M9InNlY3Rpb25UYWJsZUhlYWRpbmciIHNjb3BlPSJyb3ciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkaW1wYWN0aW5nVGV4dCIvPjwvdGg+Ci0JCQkJCQkJPHRkIGNsYXNzPSJzZWN0aW9uVGFibGVDZWxsIiBjb2xzcGFuPSIzIj4KLQkJCQkJCQk8dWw+Ci0JCQkJCQkJCTx4c2w6Zm9yLWVhY2ggc2VsZWN0PSIkaW1wYWN0ZWRCeSI+Ci0JCQkJCQkJCTx4c2w6c29ydCBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPgotCQkJCQkJCQkJPGxpPgotCQkJCQkJCQkJCTxhPgotCQkJCQkJCQkJCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJocmVmIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iL0VsZW1lbnQvQEJhY2tQYXRoIi8+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBVcmwiLz48L3hzbDphdHRyaWJ1dGU+Ci0JCQkJCQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJARGlzcGxheU5hbWUiLz4KLQkJCQkJCQkJCQk8L2E+Ci0JCQkJCQkJCQk8L2xpPgotCQkJCQkJCQk8L3hzbDpmb3ItZWFjaD4KLQkJCQkJCQk8L3VsPgotCQkJCQkJCTwvdGQ+Ci0JCQkJCQk8L3RyPgotCQkJCQk8L3hzbDppZj4KLQkJCQkJPHhzbDppZiB0ZXN0PSJjb3VudCgkcmVzcG9uc2libGVSb2xlKSArIGNvdW50KCR3b3JrZWRPbkJ5KSA+IDAiPgotCQkJCQkJPHRyIHZhbGlnbj0idG9wIj4KLQkJCQkJCQk8dGggY2xhc3M9InNlY3Rpb25UYWJsZUhlYWRpbmciIHNjb3BlPSJyb3ciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcm9sZXNUZXh0Ii8+PC90aD4KLQkJCQkJCQk8dGQgY2xhc3M9InNlY3Rpb25UYWJsZUNlbGwiIHdpZHRoPSIzMCUiPgotCQkJCQkJCQk8c3BhbiBjbGFzcz0ic2VjdGlvblRhYmxlQ2VsbEhlYWRpbmciPgotCQkJCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRyZXNwb25zaWJsZVRleHQiLz46Ci0JCQkJCQkJCTwvc3Bhbj4KLQkJCQkJCQkJPHhzbDppZiB0ZXN0PSJjb3VudCgkcmVzcG9uc2libGVSb2xlKSA+IDAiPgotCQkJCQkJCQkJPHVsPgotCQkJCQkJCQkJPHhzbDpmb3ItZWFjaCBzZWxlY3Q9IiRyZXNwb25zaWJsZVJvbGUiPgotCQkJCQkJCQkJPHhzbDpzb3J0IHNlbGVjdD0iQERpc3BsYXlOYW1lIi8+Ci0JCQkJCQkJCQkJPGxpPgotCQkJCQkJCQkJCQk8YT48eHNsOmF0dHJpYnV0ZSBuYW1lPSJocmVmIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iL0VsZW1lbnQvQEJhY2tQYXRoIi8+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBVcmwiLz48L3hzbDphdHRyaWJ1dGU+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPjwvYT4KLQkJCQkJCQkJCQk8L2xpPgotCQkJCQkJCQkJPC94c2w6Zm9yLWVhY2g+Ci0JCQkJCQkJCQk8L3VsPgotCQkJCQkJCQk8L3hzbDppZj4JCQkJCQkJCQkKLQkJCQkJCQk8L3RkPgotCQkJCQkJCTx0ZCBjbGFzcz0ic2VjdGlvblRhYmxlQ2VsbCIgY29sc3Bhbj0iMiI+Ci0JCQkJCQkJCTxzcGFuIGNsYXNzPSJzZWN0aW9uVGFibGVDZWxsSGVhZGluZyI+Ci0JCQkJCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG1vZGlmaWVkQnlUZXh0Ii8+OgotCQkJCQkJCQk8L3NwYW4+Ci0JCQkJCQkJCTx4c2w6aWYgdGVzdD0iY291bnQoJHdvcmtlZE9uQnkpID4gMCI+CQkJCQkJCQkKLQkJCQkJCQkJCTx1bD4KLQkJCQkJCQkJCQk8eHNsOmZvci1lYWNoIHNlbGVjdD0iJHdvcmtlZE9uQnkiPgotCQkJCQkJCQkJCTx4c2w6c29ydCBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPgotCQkJCQkJCQkJCQk8bGk+Ci0JCQkJCQkJCQkJCQk8YT48eHNsOmF0dHJpYnV0ZSBuYW1lPSJocmVmIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iL0VsZW1lbnQvQEJhY2tQYXRoIi8+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBVcmwiLz48L3hzbDphdHRyaWJ1dGU+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPjwvYT4KLQkJCQkJCQkJCQkJPC9saT4KLQkJCQkJCQkJCQk8L3hzbDpmb3ItZWFjaD4KLQkJCQkJCQkJCTwvdWw+Ci0JCQkJCQkJCTwveHNsOmlmPgkJCQkJCQkJCQkKLQkJCQkJCQk8L3RkPgotCQkJCQkJPC90cj4KLQkJCQkJPC94c2w6aWY+Ci0JCQkJCTx4c2w6aWYgdGVzdD0iY291bnQoJG1hbmRhdG9yeUlucHV0VG8pICsgY291bnQoJG9wdGlvbmFsSW5wdXRUbykgKyBjb3VudCgkZXh0ZXJuYWxJbnB1dFRvKSArIGNvdW50KCRtYW5kYXRvcnlJbnB1dFRvVGFza0Rlc2NyaXB0b3JzX2Zyb21TbG90cykgKyBjb3VudCgkb3B0aW9uYWxJbnB1dFRvVGFza0Rlc2NyaXB0b3JzX2Zyb21TbG90cykgPiAwIj4KLQkJCQkJCTx0ciB2YWxpZ249InRvcCI+Ci0JCQkJCQkJPHRoIGNsYXNzPSJzZWN0aW9uVGFibGVIZWFkaW5nIiBzY29wZT0icm93Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGlucHV0VG9UZXh0Ii8+PC90aD4KLQkJCQkJCQk8dGQgY2xhc3M9InNlY3Rpb25UYWJsZUNlbGwiIHdpZHRoPSIzMCUiPgotCQkJCQkJCQk8c3BhbiBjbGFzcz0ic2VjdGlvblRhYmxlQ2VsbEhlYWRpbmciPgotCQkJCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRtYW5kYXRvcnlUZXh0Ii8+OgotCQkJCQkJCQk8L3NwYW4+Ci0JCQkJCQkJCTx4c2w6Y2hvb3NlPgotCQkJCQkJCQkJPHhzbDp3aGVuIHRlc3Q9ImNvdW50KCRtYW5kYXRvcnlJbnB1dFRvKSArIGNvdW50KCRtYW5kYXRvcnlJbnB1dFRvVGFza0Rlc2NyaXB0b3JzX2Zyb21TbG90cykgPiAwIj4KLQkJCQkJCQkJCQk8dWw+Ci0JCQkJCQkJCQkJPHhzbDpmb3ItZWFjaCBzZWxlY3Q9IiRtYW5kYXRvcnlJbnB1dFRvIj4JCQotCQkJCQkJCQkJCTx4c2w6c29ydCBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPgkJCQkJCQkJCi0JCQkJCQkJCQkJCTxsaT4KLQkJCQkJCQkJCQkJCTxhPjx4c2w6YXR0cmlidXRlIG5hbWU9ImhyZWYiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIvRWxlbWVudC9AQmFja1BhdGgiLz48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQFVybCIvPjwveHNsOmF0dHJpYnV0ZT48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQERpc3BsYXlOYW1lIi8+PC9hPgotCQkJCQkJCQkJCQk8L2xpPgotCQkJCQkJCQkJCTwveHNsOmZvci1lYWNoPgkKLQkJCQkJCQkJCQk8eHNsOmZvci1lYWNoIHNlbGVjdD0iJG1hbmRhdG9yeUlucHV0VG9UYXNrRGVzY3JpcHRvcnNfZnJvbVNsb3RzIj4JCQotCQkJCQkJCQkJCTx4c2w6c29ydCBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPgkJCQkJCQkJCi0JCQkJCQkJCQkJCTxsaT4KLQkJCQkJCQkJCQkJCTxhPjx4c2w6YXR0cmlidXRlIG5hbWU9ImhyZWYiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIvRWxlbWVudC9AQmFja1BhdGgiLz48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQFVybCIvPjwveHNsOmF0dHJpYnV0ZT48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQERpc3BsYXlOYW1lIi8+PC9hPgotCQkJCQkJCQkJCQk8L2xpPgotCQkJCQkJCQkJCTwveHNsOmZvci1lYWNoPgkJCQkJCQkKLQkJCQkJCQkJCQk8L3VsPgotCQkJCQkJCQkJPC94c2w6d2hlbj4JCQkJCi0JCQkJCQkJCQk8eHNsOm90aGVyd2lzZT4KLQkJCQkJCQkJCTx1bD4KLQkJCQkJCQkJCQk8bGk+Ci0JCQkJCQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbm9uZVRleHQiLz4KLQkJCQkJCQkJCQk8L2xpPgkJCQkJCQkJCQotCQkJCQkJCQkJPC91bD4KLQkJCQkJCQkJCTwveHNsOm90aGVyd2lzZT4KLQkJCQkJCQkJPC94c2w6Y2hvb3NlPgotCQkJCQkJCTwvdGQ+Ci0JCQkJCQkJPHRkIGNsYXNzPSJzZWN0aW9uVGFibGVDZWxsIiB3aWR0aD0iMzAlIj4KLQkJCQkJCQkJPHNwYW4gY2xhc3M9InNlY3Rpb25UYWJsZUNlbGxIZWFkaW5nIj4KLQkJCQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkb3B0aW9uYWxUZXh0Ii8+OgotCQkJCQkJCQk8L3NwYW4+Ci0JCQkJCQkJCTx4c2w6Y2hvb3NlPgotCQkJCQkJCQkJPHhzbDp3aGVuIHRlc3Q9ImNvdW50KCRvcHRpb25hbElucHV0VG8pICsgY291bnQoJG9wdGlvbmFsSW5wdXRUb1Rhc2tEZXNjcmlwdG9yc19mcm9tU2xvdHMpID4gMCI+Ci0JCQkJCQkJCQk8dWw+Ci0JCQkJCQkJCQkJPHhzbDpmb3ItZWFjaCBzZWxlY3Q9IiRvcHRpb25hbElucHV0VG8iPgotCQkJCQkJCQkJCTx4c2w6c29ydCBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPgotCQkJCQkJCQkJCQk8bGk+Ci0JCQkJCQkJCQkJCQk8YT48eHNsOmF0dHJpYnV0ZSBuYW1lPSJocmVmIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iL0VsZW1lbnQvQEJhY2tQYXRoIi8+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBVcmwiLz48L3hzbDphdHRyaWJ1dGU+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPjwvYT4KLQkJCQkJCQkJCQkJPC9saT4KLQkJCQkJCQkJCQk8L3hzbDpmb3ItZWFjaD4JCi0JCQkJCQkJCQkJPHhzbDpmb3ItZWFjaCBzZWxlY3Q9IiRvcHRpb25hbElucHV0VG9UYXNrRGVzY3JpcHRvcnNfZnJvbVNsb3RzIj4KLQkJCQkJCQkJCQk8eHNsOnNvcnQgc2VsZWN0PSJARGlzcGxheU5hbWUiLz4KLQkJCQkJCQkJCQkJPGxpPgotCQkJCQkJCQkJCQkJPGE+PHhzbDphdHRyaWJ1dGUgbmFtZT0iaHJlZiI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii9FbGVtZW50L0BCYWNrUGF0aCIvPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAVXJsIi8+PC94c2w6YXR0cmlidXRlPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJARGlzcGxheU5hbWUiLz48L2E+Ci0JCQkJCQkJCQkJCTwvbGk+Ci0JCQkJCQkJCQkJPC94c2w6Zm9yLWVhY2g+CQkJCQkJCQotCQkJCQkJCQkJPC91bD4KLQkJCQkJCQkJCTwveHNsOndoZW4+CQkJCQotCQkJCQkJCQkJPHhzbDpvdGhlcndpc2U+Ci0JCQkJCQkJCQk8dWw+Ci0JCQkJCQkJCQkJPGxpPgotCQkJCQkJCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5vbmVUZXh0Ii8+Ci0JCQkJCQkJCQkJPC9saT4KLQkJCQkJCQkJCTwvdWw+CQkJCQkJCQkJCi0JCQkJCQkJCQk8L3hzbDpvdGhlcndpc2U+CQkJCQkJCQkJCi0JCQkJCQkJCTwveHNsOmNob29zZT4KLQkJCQkJCQk8L3RkPgotCQkJCQkJCTx0ZCBjbGFzcz0ic2VjdGlvblRhYmxlQ2VsbCI+Ci0JCQkJCQkJCTxzcGFuIGNsYXNzPSJzZWN0aW9uVGFibGVDZWxsSGVhZGluZyI+Ci0JCQkJCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGV4dGVybmFsVGV4dCIvPjoKLQkJCQkJCQkJPC9zcGFuPgotCQkJCQkJCQk8eHNsOmNob29zZT4KLQkJCQkJCQkJCTx4c2w6d2hlbiB0ZXN0PSJjb3VudCgkZXh0ZXJuYWxJbnB1dFRvKSA+IDAiPgotCQkJCQkJCQkJPHVsPgotCQkJCQkJCQkJCTx4c2w6Zm9yLWVhY2ggc2VsZWN0PSIkZXh0ZXJuYWxJbnB1dFRvIj4KLQkJCQkJCQkJCQk8eHNsOnNvcnQgc2VsZWN0PSJARGlzcGxheU5hbWUiLz4KLQkJCQkJCQkJCQkJPGxpPgotCQkJCQkJCQkJCQkJPGE+PHhzbDphdHRyaWJ1dGUgbmFtZT0iaHJlZiI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii9FbGVtZW50L0BCYWNrUGF0aCIvPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAVXJsIi8+PC94c2w6YXR0cmlidXRlPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJARGlzcGxheU5hbWUiLz48L2E+Ci0JCQkJCQkJCQkJCTwvbGk+Ci0JCQkJCQkJCQkJPC94c2w6Zm9yLWVhY2g+CQkJCQkJCQotCQkJCQkJCQkJPC91bD4KLQkJCQkJCQkJCTwveHNsOndoZW4+CQkJCQotCQkJCQkJCQkJPHhzbDpvdGhlcndpc2U+Ci0JCQkJCQkJCQk8dWw+Ci0JCQkJCQkJCQkJPGxpPgotCQkJCQkJCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5vbmVUZXh0Ii8+Ci0JCQkJCQkJCQkJPC9saT4KLQkJCQkJCQkJCTwvdWw+CQkJCQkJCQkJCi0JCQkJCQkJCQk8L3hzbDpvdGhlcndpc2U+CQkJCQkJCQkJCi0JCQkJCQkJCTwveHNsOmNob29zZT4KLQkJCQkJCQk8L3RkPgkJCQkJCi0JCQkJCQk8L3RyPgotCQkJCQk8L3hzbDppZj4JCQkJCQotCQkJCQk8eHNsOmlmIHRlc3Q9ImNvdW50KCRvdXRwdXRGcm9tKSAgKyBjb3VudCgkb3V0cHV0RnJvbVRhc2tEZXNjcmlwdG9yc19mcm9tU2xvdHMpPiAwIj4KLQkJCQkJCTx0ciB2YWxpZ249InRvcCI+Ci0JCQkJCQkJPHRoIGNsYXNzPSJzZWN0aW9uVGFibGVIZWFkaW5nIiBzY29wZT0icm93Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG91dHB1dEZyb21UZXh0Ii8+PC90aD4JCQkJCQkJCi0JCQkJCQkJPHRkIGNsYXNzPSJzZWN0aW9uVGFibGVDZWxsIiBjb2xzcGFuPSIzIj4KLQkJCQkJCQk8eHNsOmlmIHRlc3Q9ImNvdW50KCRvdXRwdXRGcm9tKSA+IDAiPgkJCQkJCQkJCQotCQkJCQkJCQk8dWw+Ci0JCQkJCQkJCQk8eHNsOmZvci1lYWNoIHNlbGVjdD0iJG91dHB1dEZyb20iPgotCQkJCQkJCQkJPHhzbDpzb3J0IHNlbGVjdD0iQERpc3BsYXlOYW1lIi8+Ci0JCQkJCQkJCQkJPGxpPgotCQkJCQkJCQkJCQk8YT48eHNsOmF0dHJpYnV0ZSBuYW1lPSJocmVmIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iL0VsZW1lbnQvQEJhY2tQYXRoIi8+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBVcmwiLz48L3hzbDphdHRyaWJ1dGU+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPjwvYT4KLQkJCQkJCQkJCQk8L2xpPgotCQkJCQkJCQkJPC94c2w6Zm9yLWVhY2g+Ci0JCQkJCQkJCTwvdWw+Ci0JCQkJCQkJPC94c2w6aWY+Ci0JCQkJCQkJPHhzbDppZiB0ZXN0PSJjb3VudCgkb3V0cHV0RnJvbVRhc2tEZXNjcmlwdG9yc19mcm9tU2xvdHMpID4gMCI+CQkJCQkJCQkJCi0JCQkJCQkJCTx1bD4KLQkJCQkJCQkJCTx4c2w6Zm9yLWVhY2ggc2VsZWN0PSIkb3V0cHV0RnJvbVRhc2tEZXNjcmlwdG9yc19mcm9tU2xvdHMiPgotCQkJCQkJCQkJPHhzbDpzb3J0IHNlbGVjdD0iQERpc3BsYXlOYW1lIi8+Ci0JCQkJCQkJCQkJPGxpPgotCQkJCQkJCQkJCQk8YT48eHNsOmF0dHJpYnV0ZSBuYW1lPSJocmVmIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iL0VsZW1lbnQvQEJhY2tQYXRoIi8+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBVcmwiLz48L3hzbDphdHRyaWJ1dGU+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPjwvYT4KLQkJCQkJCQkJCQk8L2xpPgotCQkJCQkJCQkJPC94c2w6Zm9yLWVhY2g+Ci0JCQkJCQkJCTwvdWw+Ci0JCQkJCQkJPC94c2w6aWY+Ci0JCQkJCQkJPC90ZD4JCQkJCQkJCi0JCQkJCQk8L3RyPgotCQkJCQk8L3hzbDppZj4KLQkJCQk8L3RhYmxlPgotCQkJPC9kaXY+Ci0JCTwveHNsOmlmPgotCTwveHNsOnRlbXBsYXRlPgotCi0JPHhzbDp0ZW1wbGF0ZSBuYW1lPSJkZWxpdmVyYWJsZVNlY3Rpb24iPgotCQk8eHNsOnBhcmFtIG5hbWU9ImRlc2NyaXB0aW9uIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iZXh0ZXJuYWxEZXNjcmlwdGlvbiIgc2VsZWN0PSIkZGVzY3JpcHRpb24vYXR0cmlidXRlW0BuYW1lPSdleHRlcm5hbERlc2NyaXB0aW9uJ10iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJkZWxpdmVyZWRXb3JrUHJvZHVjdHMiIHNlbGVjdD0icmVmZXJlbmNlTGlzdFtAbmFtZT0nZGVsaXZlcmFibGVQYXJ0cyddL0VsZW1lbnQiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJwYWNrYWdpbmdHdWlkYW5jZSIgc2VsZWN0PSIkZGVzY3JpcHRpb24vYXR0cmlidXRlW0BuYW1lPSdwYWNrYWdpbmdHdWlkYW5jZSddIi8+Ci0JCQotCQk8eHNsOmlmIHRlc3Q9IiRleHRlcm5hbERlc2NyaXB0aW9uICE9ICcnIG9yIGNvdW50KCRkZWxpdmVyZWRXb3JrUHJvZHVjdHMpID4gMCBvciAkcGFja2FnaW5nR3VpZGFuY2UgIT0gJyciPgotCQkJPGRpdiBjbGFzcz0ic2VjdGlvbkhlYWRpbmciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZGVsaXZlcmFibGVQcm9wZXJ0aWVzVGV4dCIvPjwvZGl2PgotCQkJPGRpdiBjbGFzcz0ic2VjdGlvbkNvbnRlbnQiPgotCQkJCTx0YWJsZSBjbGFzcz0ic2VjdGlvblRhYmxlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+Ci0JCQkJCTx4c2w6aWYgdGVzdD0iJGV4dGVybmFsRGVzY3JpcHRpb24gIT0gJyciPgotCQkJCQkJPHRyIHZhbGlnbj0idG9wIj4KLQkJCQkJCQk8dGggY2xhc3M9InNlY3Rpb25UYWJsZUhlYWRpbmciIHNjb3BlPSJyb3ciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZXh0ZXJuYWxEZXNjcmlwdGlvblRleHQiLz48L3RoPgotCQkJCQkJCTx0ZCBjbGFzcz0ic2VjdGlvblRhYmxlQ2VsbCI+Ci0JCQkJCQkJCTx4c2w6dmFsdWUtb2YgZGlzYWJsZS1vdXRwdXQtZXNjYXBpbmc9InllcyIgc2VsZWN0PSIkZXh0ZXJuYWxEZXNjcmlwdGlvbiIvPgotCQkJCQkJCTwvdGQ+Ci0JCQkJCQk8L3RyPgotCQkJCQk8L3hzbDppZj4KLQkJCQkJPHhzbDppZiB0ZXN0PSJjb3VudCgkZGVsaXZlcmVkV29ya1Byb2R1Y3RzKSA+IDAiPgotCQkJCQkJPHRyIHZhbGlnbj0idG9wIj4KLQkJCQkJCQk8dGggY2xhc3M9InNlY3Rpb25UYWJsZUhlYWRpbmciIHNjb3BlPSJyb3ciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZGVsaXZlcmVkUGFydHNUZXh0Ii8+PC90aD4KLQkJCQkJCQk8dGQgY2xhc3M9InNlY3Rpb25UYWJsZUNlbGwiPgotCQkJCQkJCTx1bD4KLQkJCQkJCQkJPHhzbDpmb3ItZWFjaCBzZWxlY3Q9IiRkZWxpdmVyZWRXb3JrUHJvZHVjdHMiPgotCQkJCQkJCQk8eHNsOnNvcnQgc2VsZWN0PSJARGlzcGxheU5hbWUiLz4KLQkJCQkJCQkJCTxsaT4KLQkJCQkJCQkJCQk8YT4KLQkJCQkJCQkJCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0iaHJlZiI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii9FbGVtZW50L0BCYWNrUGF0aCIvPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAVXJsIi8+PC94c2w6YXR0cmlidXRlPgotCQkJCQkJCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQERpc3BsYXlOYW1lIi8+Ci0JCQkJCQkJCQkJPC9hPgotCQkJCQkJCQkJPC9saT4KLQkJCQkJCQkJPC94c2w6Zm9yLWVhY2g+Ci0JCQkJCQkJPC91bD4KLQkJCQkJCQk8L3RkPgotCQkJCQkJPC90cj4KLQkJCQkJPC94c2w6aWY+Ci0JCQkJCTx4c2w6aWYgdGVzdD0iJHBhY2thZ2luZ0d1aWRhbmNlICE9ICcnIj4KLQkJCQkJCTx0ciB2YWxpZ249InRvcCI+Ci0JCQkJCQkJPHRoIGNsYXNzPSJzZWN0aW9uVGFibGVIZWFkaW5nIiBzY29wZT0icm93Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHBhY2thZ2luZ0luc3RydWN0aW9uc1RleHQiLz48L3RoPgotCQkJCQkJCTx0ZCBjbGFzcz0ic2VjdGlvblRhYmxlQ2VsbCI+Ci0JCQkJCQkJCTx4c2w6dmFsdWUtb2YgZGlzYWJsZS1vdXRwdXQtZXNjYXBpbmc9InllcyIgc2VsZWN0PSIkcGFja2FnaW5nR3VpZGFuY2UiLz4KLQkJCQkJCQk8L3RkPgotCQkJCQkJPC90cj4KLQkJCQkJPC94c2w6aWY+Ci0JCQkJPC90YWJsZT4KLQkJCTwvZGl2PgotCQk8L3hzbDppZj4KLQk8L3hzbDp0ZW1wbGF0ZT4KLQkKLTwveHNsOnN0eWxlc2hlZXQ+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQveHNsL2NoZWNrbGlzdC54c2wgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQveHNsL2NoZWNrbGlzdC54c2wKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjMWY1ODYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L3hzbC9jaGVja2xpc3QueHNsCisrKyAvZGV2L251bGwKQEAgLTEsMTMzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLQotPHhzbDpzdHlsZXNoZWV0IHZlcnNpb249IjEuMCIKLQl4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIKLQl4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIj4KLQotPHhzbDpvdXRwdXQgbWV0aG9kPSJodG1sIiB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgCi0JZG9jdHlwZS1wdWJsaWM9Ii0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAKLQlkb2N0eXBlLXN5c3RlbT0iaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCIgCi0JaW5kZW50PSJ5ZXMiLz4KLQkKLQk8eHNsOmluY2x1ZGUgaHJlZj0iZ3VpZGFuY2UueHNsIi8+Ci0KLQk8eHNsOnRlbXBsYXRlIG1hdGNoPSIvRWxlbWVudCI+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iZWxlbWVudFR5cGUiIHNlbGVjdD0iQFR5cGUiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJlbGVtZW50VHlwZU5hbWUiIHNlbGVjdD0iQFR5cGVOYW1lIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iZWxlbWVudE5hbWUiIHNlbGVjdD0iQE5hbWUiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJlbGVtZW50UHJlc2VudGF0aW9uTmFtZSIgc2VsZWN0PSJARGlzcGxheU5hbWUiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJiYWNrUGF0aCIgc2VsZWN0PSJAQmFja1BhdGgiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJpbWFnZVBhdGgiIHNlbGVjdD0iY29uY2F0KCRiYWNrUGF0aCwgJ2ltYWdlcy8nKSIvPgkJCi0JICAgIDx4c2w6dmFyaWFibGUgbmFtZT0ic2hhcGVJbWFnZSIgc2VsZWN0PSJjb25jYXQoJGJhY2tQYXRoLEBTaGFwZWljb25VcmwpIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0icHJlc2VudGF0aW9uIiBzZWxlY3Q9InJlZmVyZW5jZVtAbmFtZT0ncHJlc2VudGF0aW9uJ10iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJjb250ZW50RGVzY3JpcHRpb24iIHNlbGVjdD0iJHByZXNlbnRhdGlvbi9FbGVtZW50Ii8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iY29weXJpZ2h0IiBzZWxlY3Q9ImNvcHlyaWdodCIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InNob3dUcmVlQnJvd3NlciIgc2VsZWN0PSJAc2hvd1RyZWVCcm93c2VyIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0icmVzcG9uc2libGVSb2xlIiBzZWxlY3Q9InJlZmVyZW5jZVtAbmFtZT0ncmVzcG9uc2libGVSb2xlJ10vRWxlbWVudFtAVHlwZT0nUm9sZSddIi8+Ci0KLSAgICAJPGh0bWw+Ci0JCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJsYW5nIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGxhbmciLz48L3hzbDphdHRyaWJ1dGU+Ci0JCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJ4bWw6bGFuZyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBsYW5nIi8+PC94c2w6YXR0cmlidXRlPgotCQkJPGhlYWQ+Ci0JCQkJPHRpdGxlPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudFR5cGVOYW1lIi8+OiA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVsZW1lbnRQcmVzZW50YXRpb25OYW1lIi8+PC90aXRsZT4KLQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0idW1hTWV0YVRhZ3MiPgotCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudFR5cGUiIHNlbGVjdD0iJGVsZW1lbnRUeXBlIi8+Ci0JCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50TmFtZSIgc2VsZWN0PSIkZWxlbWVudE5hbWUiLz4KLQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnRQcmVzZW50YXRpb25OYW1lIiBzZWxlY3Q9IiRlbGVtZW50UHJlc2VudGF0aW9uTmFtZSIvPgotCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJPG1ldGEgbmFtZT0iZWxlbWVudF90eXBlIiBjb250ZW50PSJ7JGVsZW1lbnRUeXBlfSIvPgotCQkJCTxtZXRhIG5hbWU9ImZpbGV0eXBlIiBjb250ZW50PSJkZXNjcmlwdGlvbiIvPgotCQkJCTxtZXRhIG5hbWU9InJvbGUiPgotCQkJCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJjb250ZW50Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHJlc3BvbnNpYmxlUm9sZS9ARGlzcGxheU5hbWUiLz48L3hzbDphdHRyaWJ1dGU+Ci0JCQkJPC9tZXRhPgotCQkJCTxsaW5rIHJlbD0iU3R5bGVTaGVldCIgaHJlZj0ieyRiYWNrUGF0aH1jc3MvZGVmYXVsdC5jc3MiIHR5cGU9InRleHQvY3NzIi8+Ci0JCQkJPHNjcmlwdCBzcmM9InskYmFja1BhdGh9c2NyaXB0cy9Db250ZW50UGFnZVJlc291cmNlLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij48L3NjcmlwdD4KLQkJCQk8c2NyaXB0IHNyYz0ieyRiYWNrUGF0aH1zY3JpcHRzL0NvbnRlbnRQYWdlU2VjdGlvbi5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PC9zY3JpcHQ+Ci0JCQkJPHNjcmlwdCBzcmM9InskYmFja1BhdGh9c2NyaXB0cy9Db250ZW50UGFnZVN1YlNlY3Rpb24uanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPjwvc2NyaXB0PgotCQkJCTxzY3JpcHQgc3JjPSJ7JGJhY2tQYXRofXNjcmlwdHMvQ29udGVudFBhZ2VUb29sYmFyLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij48L3NjcmlwdD4KLQkJCQk8c2NyaXB0IHNyYz0ieyRiYWNrUGF0aH1zY3JpcHRzL2NvbnRlbnRQYWdlLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij48L3NjcmlwdD4KLQkJCQk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPgotCQkJCQl2YXIgYmFja1BhdGggPSAnPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRiYWNrUGF0aCIvPic7Ci0JCQkJCXZhciBpbWdQYXRoID0gJzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkaW1hZ2VQYXRoIi8+JzsKLQkJCQkJdmFyIG5vZGVJbmZvPW51bGw7Ci0JCQkJCWNvbnRlbnRQYWdlLnByZWxvYWQoaW1nUGF0aCwgYmFja1BhdGgsIG5vZGVJbmZvLCAgJycsIHRydWUsIGZhbHNlLCBmYWxzZSk7Ci0JCQkJCQotCQkJCQkvL292ZXJyaWRlIHRoZSBzdWJzZWN0aW9uIHRleHQKLQkJCQkJY29udGVudFBhZ2Uuc3ViU2VjdGlvbi5leHBhbmRBbGxUZXh0ID0gJzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZXhwYW5kQWxsVGV4dCIvPic7Ci0JCQkJCWNvbnRlbnRQYWdlLnN1YlNlY3Rpb24uY29sbGFwc2VBbGxUZXh0ID0gJzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkY29sbGFwc2VBbGxUZXh0Ii8+JzsJCQkJCQotCQkJCTwvc2NyaXB0PgotCQkJPC9oZWFkPgotCQkJPGJvZHk+Ci0JCQk8ZGl2IGlkPSJicmVhZGNydW1icyI+PC9kaXY+Ci0JCQkJPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci0JCQkJCTx0cj4KLQkJCQkJCTx0ZCB2YWxpZ249InRvcCI+Ci0JCQkJCQkJPGEgbmFtZT0iVG9wIi8+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9Im92ZXJ2aWV3Ij4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnRUeXBlIiBzZWxlY3Q9IiRlbGVtZW50VHlwZSIvPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudFR5cGVOYW1lIiBzZWxlY3Q9IiRlbGVtZW50VHlwZU5hbWUiLz4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnRQcmVzZW50YXRpb25OYW1lIiBzZWxlY3Q9IiRlbGVtZW50UHJlc2VudGF0aW9uTmFtZSIvPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudEljb24iIHNlbGVjdD0iJHNoYXBlSW1hZ2UiLz4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImJhY2tQYXRoIiBzZWxlY3Q9IiRiYWNrUGF0aCIvPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0ic2hvd1RyZWVCcm93c2VyIiBzZWxlY3Q9IiRzaG93VHJlZUJyb3dzZXIiLz4KLQkJCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJyZWxhdGlvbnNoaXBzU2VjdGlvbiIvPgotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJtYWluRGVzY3JpcHRpb25TZWN0aW9uIj4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImRlc2NyaXB0aW9uIiBzZWxlY3Q9IiRjb250ZW50RGVzY3JpcHRpb24iLz4KLQkJCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJjaGVja0l0ZW1zU2VjdGlvbiI+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJkZXNjcmlwdGlvbiIgc2VsZWN0PSIkY29udGVudERlc2NyaXB0aW9uIi8+Ci0JCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0ibW9yZUluZm9TZWN0aW9uIj4KLQkJCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJjb3B5cmlnaHQiPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iY29weXJpZ2h0IiBzZWxlY3Q9IiRjb3B5cmlnaHQiLz4KLQkJCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQkJPC90ZD4JCQkJCQkKLQkJCQkJPC90cj4KLQkJCQk8L3RhYmxlPgotCQkJPC9ib2R5PgotCQkJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij4KLQkJCQljb250ZW50UGFnZS5vbmxvYWQoKTsKLQkJCTwvc2NyaXB0PgotCQk8L2h0bWw+Ci0JPC94c2w6dGVtcGxhdGU+Ci0KLQk8eHNsOnRlbXBsYXRlIG5hbWU9ImNoZWNrSXRlbXNTZWN0aW9uIj4KLQkJPHhzbDpwYXJhbSBuYW1lPSJkZXNjcmlwdGlvbiIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InNlY3Rpb25zIiBzZWxlY3Q9IiRkZXNjcmlwdGlvbi9yZWZlcmVuY2VMaXN0W0BuYW1lPSdzZWN0aW9ucyddL0VsZW1lbnRbQFR5cGU9J1NlY3Rpb24nXSIvPgotCQk8eHNsOmlmIHRlc3Q9ImNvdW50KCRzZWN0aW9ucykgPiAwIj4KLQkJCTxkaXYgY2xhc3M9InNlY3Rpb25IZWFkaW5nIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGNoZWNrSXRlbXNUZXh0Ii8+PC9kaXY+Ci0JCQk8ZGl2IGNsYXNzPSJzZWN0aW9uQ29udGVudCI+Ci0JCQkJPHRhYmxlIGNsYXNzPSJzZWN0aW9uVGFibGUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4KLQkJCQkJPHRyPgotCQkJCQkJPHRkIGNsYXNzPSJzZWN0aW9uVGFibGVDZWxsIj4KLQkJCQkJCQk8eHNsOmZvci1lYWNoIHNlbGVjdD0iJHNlY3Rpb25zIj4KLQkJCQkJCQkJPGRpdiBjbGFzcz0ic3RlcEhlYWRpbmciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJhdHRyaWJ1dGVbQG5hbWU9J25hbWUnXSIvPjwvZGl2PgotCQkJCQkJCQk8ZGl2IGNsYXNzPSJzdGVwQ29udGVudCI+Ci0JCQkJCQkJCQk8dGFibGUgY2xhc3M9InN0ZXBUYWJsZSIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiPgotCQkJCQkJCQkJCTx0ciB2YWxpZ249InRvcCI+Ci0JCQkJCQkJCQkJCTx0ZD4KLQkJCQkJCQkJCQkJCTx4c2w6dmFsdWUtb2YgZGlzYWJsZS1vdXRwdXQtZXNjYXBpbmc9InllcyIgc2VsZWN0PSJhdHRyaWJ1dGVbQG5hbWU9J3NlY3Rpb25EZXNjcmlwdGlvbiddIi8+Ci0JCQkJCQkJCQkJCTwvdGQ+Ci0JCQkJCQkJCQkJPC90cj4KLQkJCQkJCQkJCTwvdGFibGU+Ci0JCQkJCQkJCTwvZGl2PgkJCQkJCQotCQkJCQkJCTwveHNsOmZvci1lYWNoPgotCQkJCQkJPC90ZD4KLQkJCQkJPC90cj4KLQkJCQk8L3RhYmxlPgotCQkJPC9kaXY+Ci0JCTwveHNsOmlmPgotCTwveHNsOnRlbXBsYXRlPgotCi08L3hzbDpzdHlsZXNoZWV0PgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L3hzbC9jb21tb24ueHNsIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L3hzbC9jb21tb24ueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTVlZWNhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC94c2wvY29tbW9uLnhzbAorKysgL2Rldi9udWxsCkBAIC0xLDEyNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci0KLTx4c2w6c3R5bGVzaGVldCB2ZXJzaW9uPSIxLjAiCi0JeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iCi0JeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSI+Ci0KLQk8eHNsOnRlbXBsYXRlIG5hbWU9InVtYU1ldGFUYWdzIj4KLQkJPHhzbDpwYXJhbSBuYW1lPSJlbGVtZW50VHlwZSIvPgotCQk8eHNsOnBhcmFtIG5hbWU9ImVsZW1lbnROYW1lIi8+Ci0JCTx4c2w6cGFyYW0gbmFtZT0iZWxlbWVudFByZXNlbnRhdGlvbk5hbWUiLz4KLQkJPG1ldGEgbmFtZT0idW1hLnR5cGUiIGNvbnRlbnQ9InskZWxlbWVudFR5cGV9Ii8+Ci0JCTxtZXRhIG5hbWU9InVtYS5uYW1lIiBjb250ZW50PSJ7JGVsZW1lbnROYW1lfSIvPgotCQk8bWV0YSBuYW1lPSJ1bWEucHJlc2VudGF0aW9uTmFtZSIgY29udGVudD0ieyRlbGVtZW50UHJlc2VudGF0aW9uTmFtZX0iLz4KLQkJPHhzbDppZiB0ZXN0PSIkZWxlbWVudFR5cGUgPSAnUm9sZSciPgotCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InJvbGVNZXRhSW5mbyIvPgotCQk8L3hzbDppZj4KLQkJPHhzbDppZiB0ZXN0PSIkZWxlbWVudFR5cGUgPSAnVGFzayciPgotCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InRhc2tNZXRhSW5mbyIvPgotCQk8L3hzbDppZj4KLQkJPHhzbDppZiB0ZXN0PSIkZWxlbWVudFR5cGUgPSAnQXJ0aWZhY3QnIG9yICRlbGVtZW50VHlwZSA9ICdEZWxpdmVyYWJsZScgb3IgJGVsZW1lbnRUeXBlID0gJ091dGNvbWUnIj4KLQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJ3b3JrUHJvZHVjdE1ldGFJbmZvIi8+Ci0JCTwveHNsOmlmPgotCQk8eHNsOmlmIHRlc3Q9IiRlbGVtZW50VHlwZSA9ICdUb29sTWVudG9yJyI+Ci0JCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0idG9vbE1lbnRvck1ldGFJbmZvIi8+Ci0JCTwveHNsOmlmPgotCTwveHNsOnRlbXBsYXRlPgotCi0JPHhzbDp0ZW1wbGF0ZSBuYW1lPSJ3b3JrUHJvZHVjdE1ldGFJbmZvIj4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJkb21haW5zIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3RbQG5hbWU9J2RvbWFpbnMnXS9FbGVtZW50Ii8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0id29ya1Byb2R1Y3RUeXBlcyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0W0BuYW1lPSd3b3JrUHJvZHVjdFR5cGVzJ10vRWxlbWVudFtAVHlwZT0nV29ya1Byb2R1Y3RUeXBlJ10iLz4KLQkJPHhzbDppZiB0ZXN0PSJjb3VudCgkZG9tYWlucykgPiAwIj4KLQkJCTx4c2w6Zm9yLWVhY2ggc2VsZWN0PSIkZG9tYWlucyI+Ci0JCQkJPG1ldGEgbmFtZT0idW1hLmNhdGVnb3J5IiBjb250ZW50PSJAVHlwZTpATmFtZTpARGlzcGxheU5hbWUiLz4KLQkJCTwveHNsOmZvci1lYWNoPgotCQk8L3hzbDppZj4KLQkJPHhzbDppZiB0ZXN0PSJjb3VudCgkd29ya1Byb2R1Y3RUeXBlcykgPiAwIj4KLQkJCTx4c2w6Zm9yLWVhY2ggc2VsZWN0PSIkd29ya1Byb2R1Y3RUeXBlcyI+Ci0JCQkJPG1ldGEgbmFtZT0idW1hLmNhdGVnb3J5IiBjb250ZW50PSJ7JHdvcmtQcm9kdWN0VHlwZXMvQFR5cGV9Onskd29ya1Byb2R1Y3RUeXBlcy9ATmFtZX06eyR3b3JrUHJvZHVjdFR5cGVzL0BEaXNwbGF5TmFtZX0iLz4KLQkJCTwveHNsOmZvci1lYWNoPgotCQk8L3hzbDppZj4KLQk8L3hzbDp0ZW1wbGF0ZT4KLQotCTx4c2w6dGVtcGxhdGUgbmFtZT0idGFza01ldGFJbmZvIj4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJkaXNjaXBsaW5lcyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0W0BuYW1lPSdkaXNjaXBsaW5lcyddL0VsZW1lbnRbQFR5cGU9J0Rpc2NpcGxpbmUnXSIvPgotCQk8eHNsOmlmIHRlc3Q9ImNvdW50KCRkaXNjaXBsaW5lcykgPiAwIj4KLQkJCTx4c2w6Zm9yLWVhY2ggc2VsZWN0PSIkZGlzY2lwbGluZXMiPgotCQkJCTxtZXRhIG5hbWU9InVtYS5jYXRlZ29yeSIgY29udGVudD0ieyRkaXNjaXBsaW5lcy9AVHlwZX06eyRkaXNjaXBsaW5lcy9ATmFtZX06eyRkaXNjaXBsaW5lcy9ARGlzcGxheU5hbWV9Ii8+Ci0JCQk8L3hzbDpmb3ItZWFjaD4KLQkJPC94c2w6aWY+Ci0JPC94c2w6dGVtcGxhdGU+Ci0KLQk8eHNsOnRlbXBsYXRlIG5hbWU9InJvbGVNZXRhSW5mbyI+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0icm9sZVNldHMiIHNlbGVjdD0icmVmZXJlbmNlTGlzdFtAbmFtZT0ncm9sZVNldHMnXS9FbGVtZW50W0BUeXBlPSdSb2xlU2V0J10iLz4KLQkJPHhzbDppZiB0ZXN0PSIkcm9sZVNldHMvQE5hbWUgIT0gJyciPgotCQkJPG1ldGEgbmFtZT0idW1hLmNhdGVnb3J5IiBjb250ZW50PSJ7JHJvbGVTZXRzL0BUeXBlfTp7JHJvbGVTZXRzL0BOYW1lfTp7JHJvbGVTZXRzL0BEaXNwbGF5TmFtZX0iLz4KLQkJPC94c2w6aWY+Ci0JPC94c2w6dGVtcGxhdGU+Ci0KLQk8eHNsOnRlbXBsYXRlIG5hbWU9InRvb2xNZW50b3JNZXRhSW5mbyI+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0idG9vbCIgc2VsZWN0PSJyZWZlcmVuY2VbQG5hbWU9J3Rvb2wnXS9FbGVtZW50Ii8+Ci0JCTx4c2w6aWYgdGVzdD0iJHRvb2wvQE5hbWUgIT0gJyciPgotCQkJPG1ldGEgbmFtZT0idW1hLmNhdGVnb3J5IiBjb250ZW50PSJ7JHRvb2wvQFR5cGV9OnskdG9vbC9ATmFtZX06eyR0b29sL0BEaXNwbGF5TmFtZX0iLz4KLQkJPC94c2w6aWY+Ci0JPC94c2w6dGVtcGxhdGU+Ci0KLQk8eHNsOnRlbXBsYXRlIG5hbWU9ImFkZFJlZmVyZW5jZXMiPgotCQk8eHNsOnBhcmFtIG5hbWU9InJlZk5hbWUiLz4KLQkJPHhzbDpwYXJhbSBuYW1lPSJyZWZFbGVtZW50Ii8+Ci0JCTx4c2w6aWYgdGVzdD0iJHJlZkVsZW1lbnQiPgotCQkJPHhzbDppZiB0ZXN0PSJjb3VudCgkcmVmRWxlbWVudCk+MCI+Ci0JCQkJPHRyIHZhbGlnbj0idG9wIj4KLQkJCQkJPHRoIGNsYXNzPSJzZWN0aW9uVGFibGVIZWFkaW5nIiBzY29wZT0icm93Ij4KLQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcmVmTmFtZSIvPgotCQkJCQk8L3RoPgotCQkJCQk8dGQgY2xhc3M9InNlY3Rpb25UYWJsZUNlbGwiPgotCQkJCQkJPHVsPgotCQkJCQkJCTx4c2w6Zm9yLWVhY2ggc2VsZWN0PSIkcmVmRWxlbWVudC8uLi8qIj4KLQkJCQkJCQk8eHNsOnNvcnQgc2VsZWN0PSJARGlzcGxheU5hbWUiLz4KLQkJCQkJCQkJPGxpPgotCQkJCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFkZEVsZW1lbnRXaXRoTGluayI+Ci0JCQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnQiIHNlbGVjdD0iLiIvPgotCQkJCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCQkJPC9saT4KLQkJCQkJCQk8L3hzbDpmb3ItZWFjaD4KLQkJCQkJCTwvdWw+Ci0JCQkJCTwvdGQ+Ci0JCQkJPC90cj4KLQkJCTwveHNsOmlmPgotCQk8L3hzbDppZj4KLQk8L3hzbDp0ZW1wbGF0ZT4KLQotCTx4c2w6dGVtcGxhdGUgbmFtZT0iYWRkRWxlbWVudFdpdGhMaW5rIj4KLQkJPHhzbDpwYXJhbSBuYW1lPSJlbGVtZW50Ii8+Ci0JCTx4c2w6Y2hvb3NlPgotCQkJPHhzbDp3aGVuIHRlc3Q9IiRlbGVtZW50L0BVcmwgIT0gJycgIj4KLQkJCQk8YT4KLQkJCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0iaHJlZiI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii9FbGVtZW50L0BCYWNrUGF0aCIvPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudC9AVXJsIi8+PC94c2w6YXR0cmlidXRlPgotCQkJCQk8eHNsOnZhbHVlLW9mIGRpc2FibGUtb3V0cHV0LWVzY2FwaW5nPSJ5ZXMiIHNlbGVjdD0iJGVsZW1lbnQvQERpc3BsYXlOYW1lIi8+Ci0JCQkJPC9hPgotCQkJPC94c2w6d2hlbj4KLQkJCTx4c2w6b3RoZXJ3aXNlPgotCQkJCTx4c2w6dmFsdWUtb2YgZGlzYWJsZS1vdXRwdXQtZXNjYXBpbmc9InllcyIgc2VsZWN0PSIkZWxlbWVudC9ARGlzcGxheU5hbWUiLz4KLQkJCTwveHNsOm90aGVyd2lzZT4KLQkJPC94c2w6Y2hvb3NlPgotCTwveHNsOnRlbXBsYXRlPgkKLQotCTx4c2w6dGVtcGxhdGUgbmFtZT0iY29weXJpZ2h0Ij4KLQkJPHhzbDpwYXJhbSBuYW1lPSJjb3B5cmlnaHQiLz4KLQkJPHRhYmxlIGNsYXNzPSJjb3B5cmlnaHQiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4KLQkJCTx0cj4KLQkJCQk8dGQgY2xhc3M9ImNvcHlyaWdodCI+Ci0JCQkJCTx4c2w6dmFsdWUtb2YgZGlzYWJsZS1vdXRwdXQtZXNjYXBpbmc9InllcyIgc2VsZWN0PSIkY29weXJpZ2h0Ii8+Ci0JCQkJPC90ZD4KLQkJCTwvdHI+Ci0JCTwvdGFibGU+Ci0JPC94c2w6dGVtcGxhdGU+Ci08L3hzbDpzdHlsZXNoZWV0PgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L3hzbC9jb21wb3NpdGVyb2xlLnhzbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC94c2wvY29tcG9zaXRlcm9sZS54c2wKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhMGQxYWEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L3hzbC9jb21wb3NpdGVyb2xlLnhzbAorKysgL2Rldi9udWxsCkBAIC0xLDE5OCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci0KLTx4c2w6c3R5bGVzaGVldCB2ZXJzaW9uPSIxLjAiCi0JeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iCi0JeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSI+Ci0KLTx4c2w6b3V0cHV0IG1ldGhvZD0iaHRtbCIgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIAotCWRvY3R5cGUtcHVibGljPSItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgCi0JZG9jdHlwZS1zeXN0ZW09Imh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiIAotCWluZGVudD0ieWVzIi8+Ci0JCi0JPHhzbDppbmNsdWRlIGhyZWY9InJlc291cmNlcy54c2wiLz4KLQk8eHNsOmluY2x1ZGUgaHJlZj0iY29tbW9uLnhzbCIvPgotCTx4c2w6aW5jbHVkZSBocmVmPSJvdmVydmlldy54c2wiLz4KLQk8eHNsOmluY2x1ZGUgaHJlZj0ibWFpbl9kZXNjcmlwdGlvbi54c2wiLz4KLQk8eHNsOmluY2x1ZGUgaHJlZj0ia2V5X2NvbnNpZGVyYXRpb24ueHNsIi8+Ci0JPHhzbDppbmNsdWRlIGhyZWY9InByb3BlcnR5LnhzbCIvPgotCi0JPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iL0VsZW1lbnQiPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImVsZW1lbnRUeXBlIiBzZWxlY3Q9IkBUeXBlIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iZWxlbWVudFR5cGVOYW1lIiBzZWxlY3Q9IkBUeXBlTmFtZSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImVsZW1lbnROYW1lIiBzZWxlY3Q9IkBOYW1lIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iZWxlbWVudFByZXNlbnRhdGlvbk5hbWUiIHNlbGVjdD0iQERpc3BsYXlOYW1lIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iYmFja1BhdGgiIHNlbGVjdD0iQEJhY2tQYXRoIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iaW1hZ2VQYXRoIiBzZWxlY3Q9ImNvbmNhdCgkYmFja1BhdGgsICdpbWFnZXMvJykiLz4KLQkgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJzaGFwZUltYWdlIiBzZWxlY3Q9ImNvbmNhdCgkYmFja1BhdGgsQFNoYXBlaWNvblVybCkiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJwcmVzZW50YXRpb24iIHNlbGVjdD0icmVmZXJlbmNlW0BuYW1lPSdwcmVzZW50YXRpb24nXSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImNvbnRlbnREZXNjcmlwdGlvbiIgc2VsZWN0PSIkcHJlc2VudGF0aW9uL0VsZW1lbnRbQFR5cGU9J0Rlc2NyaXB0b3JEZXNjcmlwdGlvbiddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iZGVzY3JpcHRvckRlc2NyaXB0aW9uIiBzZWxlY3Q9IiRwcmVzZW50YXRpb24vRWxlbWVudFtAVHlwZT0nRGVzY3JpcHRvckRlc2NyaXB0aW9uJ10iLz4JCQotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImNvcHlyaWdodCIgc2VsZWN0PSJjb3B5cmlnaHQiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJzaG93VHJlZUJyb3dzZXIiIHNlbGVjdD0iQHNob3dUcmVlQnJvd3NlciIvPgotCi0JCTxodG1sPgkKLQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9ImxhbmciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbGFuZyIvPjwveHNsOmF0dHJpYnV0ZT4KLQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9InhtbDpsYW5nIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGxhbmciLz48L3hzbDphdHRyaWJ1dGU+Ci0JCQk8aGVhZD4KLQkJCQk8dGl0bGU+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50VHlwZU5hbWUiLz46IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudFByZXNlbnRhdGlvbk5hbWUiLz48L3RpdGxlPgotCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJ1bWFNZXRhVGFncyI+Ci0JCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50VHlwZSIgc2VsZWN0PSIkZWxlbWVudFR5cGUiLz4KLQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnROYW1lIiBzZWxlY3Q9IiRlbGVtZW50TmFtZSIvPgotCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudFByZXNlbnRhdGlvbk5hbWUiIHNlbGVjdD0iJGVsZW1lbnRQcmVzZW50YXRpb25OYW1lIi8+Ci0JCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQk8bWV0YSBuYW1lPSJlbGVtZW50X3R5cGUiIGNvbnRlbnQ9InskZWxlbWVudFR5cGV9Ii8+Ci0JCQkJPG1ldGEgbmFtZT0iZmlsZXR5cGUiIGNvbnRlbnQ9ImRlc2NyaXB0aW9uIi8+Ci0JCQkJPGxpbmsgcmVsPSJTdHlsZVNoZWV0IiBocmVmPSJ7JGJhY2tQYXRofWNzcy9kZWZhdWx0LmNzcyIgdHlwZT0idGV4dC9jc3MiLz4KLQkJCQk8c2NyaXB0IHNyYz0ieyRiYWNrUGF0aH1zY3JpcHRzL0NvbnRlbnRQYWdlUmVzb3VyY2UuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPjwvc2NyaXB0PgotCQkJCTxzY3JpcHQgc3JjPSJ7JGJhY2tQYXRofXNjcmlwdHMvQ29udGVudFBhZ2VTZWN0aW9uLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij48L3NjcmlwdD4KLQkJCQk8c2NyaXB0IHNyYz0ieyRiYWNrUGF0aH1zY3JpcHRzL0NvbnRlbnRQYWdlU3ViU2VjdGlvbi5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PC9zY3JpcHQ+Ci0JCQkJPHNjcmlwdCBzcmM9InskYmFja1BhdGh9c2NyaXB0cy9BY3Rpdml0eVRyZWVUYWJsZS5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PC9zY3JpcHQ+Ci0JCQkJPHNjcmlwdCBzcmM9InskYmFja1BhdGh9c2NyaXB0cy9Qcm9jZXNzRWxlbWVudFBhZ2UuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPjwvc2NyaXB0PgotCQkJCTxzY3JpcHQgc3JjPSJ7JGJhY2tQYXRofXNjcmlwdHMvQ29udGVudFBhZ2VUb29sYmFyLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij48L3NjcmlwdD4KLQkJCQk8c2NyaXB0IHNyYz0ieyRiYWNrUGF0aH1zY3JpcHRzL2NvbnRlbnRQYWdlLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij48L3NjcmlwdD4KLQkJCQk8c2NyaXB0IHNyYz0ieyRiYWNrUGF0aH1zY3JpcHRzL3Byb2Nlc3NFbGVtZW50RGF0YS5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PC9zY3JpcHQ+Ci0JCQkJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij4KLQkJCQkJdmFyIGJhY2tQYXRoID0gJzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkYmFja1BhdGgiLz4nOwotCQkJCQl2YXIgaW1nUGF0aCA9ICc8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGltYWdlUGF0aCIvPic7Ci0JCQkJCXZhciBub2RlSW5mbz1udWxsOwotCQkJCQljb250ZW50UGFnZS5wcmVsb2FkKGltZ1BhdGgsIGJhY2tQYXRoLCBub2RlSW5mbywgJycsIGZhbHNlLCB0cnVlLCBmYWxzZSk7Ci0JCQkJPC9zY3JpcHQ+Ci0JCQk8L2hlYWQ+Ci0JCQk8Ym9keT4KLQkJCTxkaXYgaWQ9ImJyZWFkY3J1bWJzIj48L2Rpdj4KLQkJCQk8dGFibGUgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLQkJCQkJPHRyPgotCQkJCQkJPHRkIHZhbGlnbj0idG9wIj4JCi0JCQkJCQkJPGEgbmFtZT0iVG9wIi8+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9Im92ZXJ2aWV3Ij4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnRUeXBlIiBzZWxlY3Q9IiRlbGVtZW50VHlwZSIvPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudFR5cGVOYW1lIiBzZWxlY3Q9IiRlbGVtZW50VHlwZU5hbWUiLz4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnRQcmVzZW50YXRpb25OYW1lIiBzZWxlY3Q9IiRlbGVtZW50UHJlc2VudGF0aW9uTmFtZSIvPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudEljb24iIHNlbGVjdD0iJHNoYXBlSW1hZ2UiLz4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImJhY2tQYXRoIiBzZWxlY3Q9IiRiYWNrUGF0aCIvPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0ic2hvd1RyZWVCcm93c2VyIiBzZWxlY3Q9IiRzaG93VHJlZUJyb3dzZXIiLz4KLQkJCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgkJCQkJCQkKLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icmVsYXRpb25zaGlwc1NlY3Rpb24iLz4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0ibWFpbkRlc2NyaXB0aW9uU2VjdGlvbiI+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJkZXNjcmlwdGlvbiIgc2VsZWN0PSIkZGVzY3JpcHRvckRlc2NyaXB0aW9uIi8+Ci0JCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icHJvcGVydGllc1NlY3Rpb24iPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iY29udGVudERlc2NyaXB0aW9uIiBzZWxlY3Q9IiRjb250ZW50RGVzY3JpcHRpb24iLz4KLQkJCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJ1c2FnZVNlY3Rpb24iPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iY29udGVudERlc2NyaXB0aW9uIiBzZWxlY3Q9IiRkZXNjcmlwdG9yRGVzY3JpcHRpb24iLz4KLQkJCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgkJCQkJCQkKLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0ia2V5Q29uc2lkZXJhdGlvbnNTZWN0aW9uIj4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImRlc2NyaXB0aW9uIiBzZWxlY3Q9IiRkZXNjcmlwdG9yRGVzY3JpcHRpb24iLz4KLQkJCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgkJCQkJCQkKLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iY29weXJpZ2h0Ij4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImNvcHlyaWdodCIgc2VsZWN0PSIkY29weXJpZ2h0Ii8+Ci0JCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCTwvdGQ+CQkJCQkJCi0JCQkJCTwvdHI+Ci0JCQkJPC90YWJsZT4KLQkJCTwvYm9keT4KLQkJCQk8c2NyaXB0IGxhbmd1YWdlPSJKYXZhU2NyaXB0IiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotCQkJCQljb250ZW50UGFnZS5vbmxvYWQoKTsKLQkJCQk8L3NjcmlwdD4KLQkJPC9odG1sPgotCTwveHNsOnRlbXBsYXRlPgotCi0JPHhzbDp0ZW1wbGF0ZSBuYW1lPSJwcm9wZXJ0aWVzU2VjdGlvbiI+Ci0JCTx4c2w6cGFyYW0gbmFtZT0iY29udGVudERlc2NyaXB0aW9uIi8+Ci0JCTxkaXYgY2xhc3M9InNlY3Rpb25IZWFkaW5nIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb3BlcnRpZXNUZXh0Ii8+PC9kaXY+Ci0JCTxkaXYgY2xhc3M9InNlY3Rpb25Db250ZW50Ij4KLQkJCTx0YWJsZSBjbGFzcz0ic2VjdGlvblRhYmxlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+Ci0JCQkgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InByb3BlcnR5Ij4KLQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImZpZWxkTGFiZWwiIHNlbGVjdD0iJG11bHRpcGxlT2NjdXJyZW5jZXNUZXh0Ii8+Ci0JCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJmaWVsZFRleHQiIHNlbGVjdD0iYXR0cmlidXRlW0BuYW1lPSdoYXNNdWx0aXBsZU9jY3VycmVuY2VzJ10iLz4KLQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCTx4c2w6aWYgdGVzdD0iYXR0cmlidXRlW0BuYW1lPSdpc09wdGlvbmFsJ10iPgotCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icHJvcGVydHkiPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImZpZWxkTGFiZWwiIHNlbGVjdD0iJG9wdGlvbmFsVGV4dCIvPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImZpZWxkVGV4dCIgc2VsZWN0PSJhdHRyaWJ1dGVbQG5hbWU9J2lzT3B0aW9uYWwnXSIvPgotCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCTwveHNsOmlmPgotCQkJCTx4c2w6aWYgdGVzdD0iYXR0cmlidXRlW0BuYW1lPSdpc1BsYW5uZWQnXSI+Ci0JCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJwcm9wZXJ0eSI+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZmllbGRMYWJlbCIgc2VsZWN0PSIkcGxhbm5lZFRleHQiLz4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJmaWVsZFRleHQiIHNlbGVjdD0iYXR0cmlidXRlW0BuYW1lPSdpc1BsYW5uZWQnXSIvPgotCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCTwveHNsOmlmPgotCQkJPC90YWJsZT4KLQkJPC9kaXY+Ci0JPC94c2w6dGVtcGxhdGU+Ci0KLQk8eHNsOnRlbXBsYXRlIG5hbWU9InJlbGF0aW9uc2hpcHNTZWN0aW9uIj4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJhZ2dyZWdhdGVkUm9sZXMiIHNlbGVjdD0icmVmZXJlbmNlTGlzdFtAbmFtZT0nYWdncmVnYXRlZFJvbGVzJ10vRWxlbWVudCIvPgkJCi0JCTx4c2w6dmFyaWFibGUgbmFtZT0icmVzcG9uc2libGVGb3IiIHNlbGVjdD0icmVmZXJlbmNlTGlzdFtAbmFtZT0ncmVzcG9uc2libGVGb3InXS9FbGVtZW50Ii8+CQkJCi0JCTx4c2w6aWYgdGVzdD0iY291bnQoJGFnZ3JlZ2F0ZWRSb2xlcykgKyBjb3VudCgkcmVzcG9uc2libGVGb3IpID4gMCI+Ci0JCQk8ZGl2IGNsYXNzPSJzZWN0aW9uSGVhZGluZyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRyZWxhdGlvbnNoaXBzVGV4dCIvPjwvZGl2PgotCQkJPGRpdiBjbGFzcz0ic2VjdGlvbkNvbnRlbnQiPgotCQkJCTx0YWJsZSBjbGFzcz0ic2VjdGlvblRhYmxlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+Ci0JCQkJCTx4c2w6aWYgdGVzdD0iY291bnQoJGFnZ3JlZ2F0ZWRSb2xlcykgPiAwIj4KLQkJCQkJCTx0ciB2YWxpZ249InRvcCI+Ci0JCQkJCQkJPHRoIGNsYXNzPSJzZWN0aW9uVGFibGVIZWFkaW5nIiBzY29wZT0icm93Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGFnZ3JlZ2F0ZXNUZXh0Ii8+PC90aD4KLQkJCQkJCQk8dGQgY2xhc3M9InNlY3Rpb25UYWJsZUNlbGwiIGNvbHNwYW49IjMiPgotCQkJCQkJCTx1bD4KLQkJCQkJCQkJPHhzbDpmb3ItZWFjaCBzZWxlY3Q9IiRhZ2dyZWdhdGVkUm9sZXMiPgotCQkJCQkJCQk8eHNsOnNvcnQgc2VsZWN0PSJARGlzcGxheU5hbWUiLz4KLQkJCQkJCQkJCTxsaT4KLQkJCQkJCQkJCQk8YT4KLQkJCQkJCQkJCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0iaHJlZiI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii9FbGVtZW50L0BCYWNrUGF0aCIvPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAVXJsIi8+PC94c2w6YXR0cmlidXRlPgotCQkJCQkJCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQERpc3BsYXlOYW1lIi8+Ci0JCQkJCQkJCQkJPC9hPgotCQkJCQkJCQkJPC9saT4KLQkJCQkJCQkJPC94c2w6Zm9yLWVhY2g+Ci0JCQkJCQkJPC91bD4KLQkJCQkJCQk8L3RkPgotCQkJCQkJPC90cj4KLQkJCQkJPC94c2w6aWY+Ci0JCQkJCTx4c2w6aWYgdGVzdD0iY291bnQoJHJlc3BvbnNpYmxlRm9yKSA+IDAiPgotCQkJCQkJPHRyIHZhbGlnbj0idG9wIj4KLQkJCQkJCQk8dGggY2xhc3M9InNlY3Rpb25UYWJsZUhlYWRpbmciIHNjb3BlPSJyb3ciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcmVzcG9uc2libGVGb3JUZXh0Ii8+PC90aD4KLQkJCQkJCQk8dGQgY2xhc3M9InNlY3Rpb25UYWJsZUNlbGwiIGNvbHNwYW49IjMiPgotCQkJCQkJCTx1bD4KLQkJCQkJCQkJPHhzbDpmb3ItZWFjaCBzZWxlY3Q9IiRyZXNwb25zaWJsZUZvciI+Ci0JCQkJCQkJCTx4c2w6c29ydCBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPgotCQkJCQkJCQkJPGxpPgotCQkJCQkJCQkJCTxhPgotCQkJCQkJCQkJCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJocmVmIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iL0VsZW1lbnQvQEJhY2tQYXRoIi8+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBVcmwiLz48L3hzbDphdHRyaWJ1dGU+Ci0JCQkJCQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJARGlzcGxheU5hbWUiLz4KLQkJCQkJCQkJCQk8L2E+Ci0JCQkJCQkJCQk8L2xpPgotCQkJCQkJCQk8L3hzbDpmb3ItZWFjaD4KLQkJCQkJCQk8L3VsPgotCQkJCQkJCTwvdGQ+Ci0JCQkJCQk8L3RyPgotCQkJCQk8L3hzbDppZj4KLQkJCQk8L3RhYmxlPgotCQkJPC9kaXY+Ci0JCTwveHNsOmlmPgotCTwveHNsOnRlbXBsYXRlPgotCi0JPHhzbDp0ZW1wbGF0ZSBuYW1lPSJ1c2FnZVNlY3Rpb24iPgotCQk8eHNsOnBhcmFtIG5hbWU9ImNvbnRlbnREZXNjcmlwdGlvbiIvPgotCQk8eHNsOmlmIHRlc3Q9IiRjb250ZW50RGVzY3JpcHRpb24vYXR0cmlidXRlW0BuYW1lPSd1c2FnZUd1aWRhbmNlJ10gIT0gJyciPgotCQkJPGRpdiBjbGFzcz0ic2VjdGlvbkhlYWRpbmciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdXNhZ2VUZXh0Ii8+PC9kaXY+Ci0JCQk8ZGl2IGNsYXNzPSJzZWN0aW9uQ29udGVudCI+Ci0JCQkJPHRhYmxlIGNsYXNzPSJzZWN0aW9uVGFibGUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4KLQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InByb3BlcnR5Ij4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJmaWVsZExhYmVsIiBzZWxlY3Q9IidVc2FnZSBHdWlkYW5jZSciLz4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJmaWVsZFRleHQiIHNlbGVjdD0iJGNvbnRlbnREZXNjcmlwdGlvbi9hdHRyaWJ1dGVbQG5hbWU9J3VzYWdlR3VpZGFuY2UnXSIvPgotCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCTwvdGFibGU+Ci0JCQk8L2Rpdj4KLQkJPC94c2w6aWY+Ci0JPC94c2w6dGVtcGxhdGU+Ci0KLTwveHNsOnN0eWxlc2hlZXQ+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQveHNsL2NvbnRlbnRjYXRlZ29yeS54c2wgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQveHNsL2NvbnRlbnRjYXRlZ29yeS54c2wKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjYjAxYTEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L3hzbC9jb250ZW50Y2F0ZWdvcnkueHNsCisrKyAvZGV2L251bGwKQEAgLTEsNTE1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLQotPHhzbDpzdHlsZXNoZWV0IHZlcnNpb249IjEuMCIKLQl4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIKLQl4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIj4KLQotPHhzbDpvdXRwdXQgbWV0aG9kPSJodG1sIiB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgCi0JZG9jdHlwZS1wdWJsaWM9Ii0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAKLQlkb2N0eXBlLXN5c3RlbT0iaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCIgCi0JaW5kZW50PSJ5ZXMiLz4KLQkKLQk8eHNsOmluY2x1ZGUgaHJlZj0icmVzb3VyY2VzLnhzbCIvPgotCTx4c2w6aW5jbHVkZSBocmVmPSJjb21tb24ueHNsIi8+Ci0JPHhzbDppbmNsdWRlIGhyZWY9Im1hcHBpbmcueHNsIi8+Ci0JPHhzbDppbmNsdWRlIGhyZWY9Im92ZXJ2aWV3LnhzbCIvPgotCTx4c2w6aW5jbHVkZSBocmVmPSJtYWluX2Rlc2NyaXB0aW9uLnhzbCIvPgotCTx4c2w6aW5jbHVkZSBocmVmPSJpbGx1c3RyYXRpb24ueHNsIi8+Ci0JPHhzbDppbmNsdWRlIGhyZWY9ImtleV9jb25zaWRlcmF0aW9uLnhzbCIvPgotCTx4c2w6aW5jbHVkZSBocmVmPSJndWlkYW5jZV9oZWxwZXIueHNsIi8+Ci0JCi0JPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iL0VsZW1lbnQiPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9Ik5hbWUiIHNlbGVjdD0iQE5hbWUiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJlbGVtZW50VHlwZSIgc2VsZWN0PSJAVHlwZSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImVsZW1lbnRUeXBlTmFtZSIgc2VsZWN0PSJAVHlwZU5hbWUiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJlbGVtZW50TmFtZSIgc2VsZWN0PSJATmFtZSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImVsZW1lbnRQcmVzZW50YXRpb25OYW1lIiBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImJhY2tQYXRoIiBzZWxlY3Q9IkBCYWNrUGF0aCIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InNoYXBlSW1hZ2UiIHNlbGVjdD0iY29uY2F0KCRiYWNrUGF0aCxAU2hhcGVpY29uVXJsKSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImltYWdlUGF0aCIgc2VsZWN0PSJjb25jYXQoJGJhY2tQYXRoLCAnaW1hZ2VzLycpIi8+CQotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InByZXNlbnRhdGlvbk5hbWVfdGVtcCIgc2VsZWN0PSJyZWZlcmVuY2VbQG5hbWU9J3ByZXNlbnRhdGlvbiddL0VsZW1lbnQvYXR0cmlidXRlW0BuYW1lPSdwcmVzZW50YXRpb25OYW1lJ10iIC8+Ci0gICAgCTx4c2w6dmFyaWFibGUgbmFtZT0icHJlc2VudGF0aW9uTmFtZSI+Ci0JCQk8eHNsOmNob29zZT4KLQkJCQk8eHNsOndoZW4gdGVzdD0iJHByZXNlbnRhdGlvbk5hbWVfdGVtcCAhPSAnJyAiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJlc2VudGF0aW9uTmFtZV90ZW1wIi8+PC94c2w6d2hlbj4KLQkJCQk8eHNsOm90aGVyd2lzZT48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJE5hbWUiLz48L3hzbDpvdGhlcndpc2U+CQkJCQotCQkJPC94c2w6Y2hvb3NlPgotICAgIAk8L3hzbDp2YXJpYWJsZT4KLQkgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJwcmVzZW50YXRpb24iIHNlbGVjdD0icmVmZXJlbmNlW0BuYW1lPSdwcmVzZW50YXRpb24nXSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImRlc2NyaXB0aW9uIiBzZWxlY3Q9IiRwcmVzZW50YXRpb24vRWxlbWVudCIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImNvcHlyaWdodCIgc2VsZWN0PSJjb3B5cmlnaHQiLz4KLQkgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJzaG93VHJlZUJyb3dzZXIiIHNlbGVjdD0iQHNob3dUcmVlQnJvd3NlciIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImJyaWVmRGVzY3JpcHRpb24iIHNlbGVjdD0iYXR0cmlidXRlW0BuYW1lPSdicmllZkRlc2NyaXB0aW9uJ10iLz4JICAgIAotCQk8aHRtbD4KLQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9ImxhbmciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbGFuZyIvPjwveHNsOmF0dHJpYnV0ZT4KLQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9InhtbDpsYW5nIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGxhbmciLz48L3hzbDphdHRyaWJ1dGU+Ci0JCQk8aGVhZD4KLQkJCQk8eHNsOmNob29zZT4KLQkJCQkJPHhzbDp3aGVuIHRlc3Q9IiRlbGVtZW50VHlwZSA9ICdDdXN0b21DYXRlZ29yeSciPgkJCQkKLQkJCQkJCTx0aXRsZT48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVsZW1lbnRUeXBlTmFtZSIvPjwvdGl0bGU+Ci0JCQkJCTwveHNsOndoZW4+CQkJCQotCQkJCQk8eHNsOm90aGVyd2lzZT4KLQkJCQkJCTx0aXRsZT48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVsZW1lbnRUeXBlTmFtZSIvPjogPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50UHJlc2VudGF0aW9uTmFtZSIvPjwvdGl0bGU+Ci0JCQkJCTwveHNsOm90aGVyd2lzZT4KLQkJCQk8L3hzbDpjaG9vc2U+Ci0JCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InVtYU1ldGFUYWdzIj4KLQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnRUeXBlIiBzZWxlY3Q9IiRlbGVtZW50VHlwZSIvPgotCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudE5hbWUiIHNlbGVjdD0iJGVsZW1lbnROYW1lIi8+Ci0JCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50UHJlc2VudGF0aW9uTmFtZSIgc2VsZWN0PSIkZWxlbWVudFByZXNlbnRhdGlvbk5hbWUiLz4KLQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCTxtZXRhIG5hbWU9ImVsZW1lbnRfdHlwZSI+IAotCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0ibWFwcGluZyI+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudFR5cGUiIHNlbGVjdD0iJGVsZW1lbnRUeXBlIi8+Ci0JCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJPC9tZXRhPgotCQkJCTxtZXRhIG5hbWU9ImZpbGV0eXBlIiBjb250ZW50PSJkZXNjcmlwdGlvbiIvPgotCQkJCTxsaW5rIHJlbD0iU3R5bGVTaGVldCIgaHJlZj0ieyRiYWNrUGF0aH1jc3MvZGVmYXVsdC5jc3MiIHR5cGU9InRleHQvY3NzIi8+Ci0JCQkJPHNjcmlwdCBzcmM9InskYmFja1BhdGh9c2NyaXB0cy9Db250ZW50UGFnZVJlc291cmNlLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij48L3NjcmlwdD4KLQkJCQk8c2NyaXB0IHNyYz0ieyRiYWNrUGF0aH1zY3JpcHRzL0NvbnRlbnRQYWdlU2VjdGlvbi5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PC9zY3JpcHQ+Ci0JCQkJPHNjcmlwdCBzcmM9InskYmFja1BhdGh9c2NyaXB0cy9Db250ZW50UGFnZVN1YlNlY3Rpb24uanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPjwvc2NyaXB0PgotCQkJCTxzY3JpcHQgc3JjPSJ7JGJhY2tQYXRofXNjcmlwdHMvQ29udGVudFBhZ2VUb29sYmFyLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij48L3NjcmlwdD4KLQkJCQk8c2NyaXB0IHNyYz0ieyRiYWNrUGF0aH1zY3JpcHRzL2NvbnRlbnRQYWdlLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij48L3NjcmlwdD4KLQkJCQk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPgotCQkJCQl2YXIgYmFja1BhdGggPSAnPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRiYWNrUGF0aCIvPic7Ci0JCQkJCXZhciBpbWdQYXRoID0gJzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkaW1hZ2VQYXRoIi8+JzsKLQkJCQkJdmFyIG5vZGVJbmZvPW51bGw7Ci0JCQkJCWNvbnRlbnRQYWdlLnByZWxvYWQoaW1nUGF0aCwgYmFja1BhdGgsIG5vZGVJbmZvLCAnJywgZmFsc2UsIGZhbHNlLCBmYWxzZSk7Ci0JCQkJPC9zY3JpcHQ+Ci0JCQk8L2hlYWQ+Ci0JCQk8Ym9keT4KLQkJCTxkaXYgaWQ9ImJyZWFkY3J1bWJzIj48L2Rpdj4KLQkJCQk8dGFibGUgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLQkJCQkJPHRyPgotCQkJCQkJPHRkIHZhbGlnbj0idG9wIj4KLQkJCQkJCQk8YSBuYW1lPSJUb3AiLz4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0ib3ZlcnZpZXciPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudFR5cGUiIHNlbGVjdD0iJGVsZW1lbnRUeXBlIi8+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50VHlwZU5hbWUiIHNlbGVjdD0iJGVsZW1lbnRUeXBlTmFtZSIvPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudFByZXNlbnRhdGlvbk5hbWUiIHNlbGVjdD0iJGVsZW1lbnRQcmVzZW50YXRpb25OYW1lIi8+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50SWNvbiIgc2VsZWN0PSIkc2hhcGVJbWFnZSIvPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iYmFja1BhdGgiIHNlbGVjdD0iJGJhY2tQYXRoIi8+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJzaG93VHJlZUJyb3dzZXIiIHNlbGVjdD0iJHNob3dUcmVlQnJvd3NlciIvPgotCQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InJlbGF0aW9uc2hpcHNTZWN0aW9uIj4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnRUeXBlIiBzZWxlY3Q9IiRlbGVtZW50VHlwZSIvPgotCQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9Im1haW5EZXNjcmlwdGlvblNlY3Rpb24iPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZGVzY3JpcHRpb24iIHNlbGVjdD0iJGRlc2NyaXB0aW9uIi8+Ci0JCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCQk8eHNsOmlmIHRlc3Q9IiRlbGVtZW50VHlwZSAhPSAnQ3VzdG9tQ2F0ZWdvcnknIj4KLQkJCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImlsbHVzdHJhdGlvbnNTZWN0aW9uIi8+Ci0JCQkJCQkJPC94c2w6aWY+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImtleUNvbnNpZGVyYXRpb25zU2VjdGlvbiI+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJkZXNjcmlwdGlvbiIgc2VsZWN0PSIkZGVzY3JpcHRpb24iLz4KLQkJCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJtb3JlSW5mb1NlY3Rpb24iPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudFR5cGUiIHNlbGVjdD0iJGVsZW1lbnRUeXBlIi8+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJicmllZkRlc2NyaXB0aW9uIiBzZWxlY3Q9IiRicmllZkRlc2NyaXB0aW9uIi8+Ci0JCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iY29weXJpZ2h0Ij4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImNvcHlyaWdodCIgc2VsZWN0PSIkY29weXJpZ2h0Ii8+Ci0JCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCTwvdGQ+CQkJCQkJCi0JCQkJCTwvdHI+Ci0JCQkJPC90YWJsZT4KLQkJCTwvYm9keT4KLQkJCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+Ci0JCQkJY29udGVudFBhZ2Uub25sb2FkKCk7Ci0JCQk8L3NjcmlwdD4KLQkJPC9odG1sPgotICAgIDwveHNsOnRlbXBsYXRlPgotCi0JPHhzbDp0ZW1wbGF0ZSBuYW1lPSJtb3JlSW5mb1NlY3Rpb24iPgotCQk8eHNsOnBhcmFtIG5hbWU9ImVsZW1lbnRUeXBlIi8+Ci0JCTx4c2w6cGFyYW0gbmFtZT0iYnJpZWZEZXNjcmlwdGlvbiIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImNoZWNrbGlzdHMiIHNlbGVjdD0icmVmZXJlbmNlTGlzdC9FbGVtZW50W0BUeXBlPSdDaGVja2xpc3QnXSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImNvbmNlcHRzIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3QvRWxlbWVudFtAVHlwZT0nQ29uY2VwdCddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iZ3VpZGVsaW5lcyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0L0VsZW1lbnRbQFR5cGU9J0d1aWRlbGluZSddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0ic3VwcG9ydGluZ01hdGVyaWFscyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0L0VsZW1lbnRbQFR5cGU9J1N1cHBvcnRpbmdNYXRlcmlhbCddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0id2hpdGVQYXBlcnMiIHNlbGVjdD0icmVmZXJlbmNlTGlzdC9FbGVtZW50W0BUeXBlPSdXaGl0ZXBhcGVyJ10iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJjb25jZXB0c0FuZFBhcGVycyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0L0VsZW1lbnRbQFR5cGU9J2NvbmNlcHRzQW5kUGFwZXJzJ10iLz4KLQotCQk8eHNsOmNob29zZT4KLQkJCTx4c2w6d2hlbiB0ZXN0PSIkZWxlbWVudFR5cGUgPSAnQ3VzdG9tQ2F0ZWdvcnknIj4KLQkJCTwveHNsOndoZW4+Ci0JCQk8eHNsOm90aGVyd2lzZT4KLQkJCQk8eHNsOmlmIHRlc3Q9ImNvdW50KCRjaGVja2xpc3RzKSArIGNvdW50KCRjb25jZXB0cykgKyBjb3VudCgkZ3VpZGVsaW5lcykgKyBjb3VudCgkc3VwcG9ydGluZ01hdGVyaWFscykgKyBjb3VudCgkd2hpdGVQYXBlcnMpID4gMCI+Ci0JCQkJCTxkaXYgY2xhc3M9InNlY3Rpb25IZWFkaW5nIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG1vcmVJbmZvVGV4dCIvPjwvZGl2PgotCQkJCQk8ZGl2IGNsYXNzPSJzZWN0aW9uQ29udGVudCI+Ci0JCQkJCQk8dGFibGUgY2xhc3M9InNlY3Rpb25UYWJsZSIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiPgotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhZGRDaGVja2xpc3RzIj4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImNoZWNrbGlzdHMiIHNlbGVjdD0iJGNoZWNrbGlzdHMiLz4KLQkJCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhZGRDb25jZXB0cyI+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJjb25jZXB0cyIgc2VsZWN0PSIkY29uY2VwdHMiLz4KLQkJCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhZGRHdWlkZWxpbmVzIj4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9Imd1aWRlbGluZXMiIHNlbGVjdD0iJGd1aWRlbGluZXMiLz4KLQkJCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhZGRTdXBwb3J0aW5nTWF0ZXJpYWxzIj4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9InN1cHBvcnRpbmdNYXRlcmlhbHMiIHNlbGVjdD0iJHN1cHBvcnRpbmdNYXRlcmlhbHMiLz4KLQkJCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhZGRXaGl0ZVBhcGVycyI+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJ3aGl0ZVBhcGVycyIgc2VsZWN0PSIkd2hpdGVQYXBlcnMiLz4KLQkJCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQkJPC90YWJsZT4KLQkJCQkJPC9kaXY+Ci0JCQkJPC94c2w6aWY+Ci0JCQk8L3hzbDpvdGhlcndpc2U+Ci0JCTwveHNsOmNob29zZT4KLQk8L3hzbDp0ZW1wbGF0ZT4KLQotICAgIDx4c2w6dGVtcGxhdGUgbmFtZT0icmVsYXRpb25zaGlwc1NlY3Rpb24iPgotCQk8eHNsOnBhcmFtIG5hbWU9ImVsZW1lbnRUeXBlIi8+Ci0JCTx4c2w6aWYgdGVzdD0iJGVsZW1lbnRUeXBlID0gJ0Rpc2NpcGxpbmUnIj4KLQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJzaG93RGlzY2lwbGUiLz4KLQkJPC94c2w6aWY+Ci0JCTx4c2w6aWYgdGVzdD0iJGVsZW1lbnRUeXBlID0gJ0Rpc2NpcGxpbmVHcm91cGluZyciPgotCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InNob3dEaXNjaXBsZUdyb3VwaW5nIi8+Ci0JCTwveHNsOmlmPgotCQk8eHNsOmlmIHRlc3Q9IiRlbGVtZW50VHlwZSA9ICdEb21haW4nIj4KLQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJzaG93RG9tYWluIi8+Ci0JCTwveHNsOmlmPgotCQk8eHNsOmlmIHRlc3Q9IiRlbGVtZW50VHlwZSA9ICdXb3JrUHJvZHVjdFR5cGUnIj4KLQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJzaG93V29ya1Byb2R1Y3RUeXBlIi8+Ci0JCTwveHNsOmlmPgkJCi0JCTx4c2w6aWYgdGVzdD0iJGVsZW1lbnRUeXBlID0gJ1JvbGVTZXRHcm91cGluZyciPgotCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InNob3dSb2xlU2V0R3JvdXBpbmciLz4KLQkJPC94c2w6aWY+Ci0JCTx4c2w6aWYgdGVzdD0iJGVsZW1lbnRUeXBlID0gJ1JvbGVTZXQnIj4KLQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJzaG93Um9sZVNldCIvPgotCQk8L3hzbDppZj4KLQkJPHhzbDppZiB0ZXN0PSIkZWxlbWVudFR5cGUgPSAnVG9vbCciPgotCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InNob3dUb29sIi8+Ci0JCTwveHNsOmlmPgotCQk8eHNsOmlmIHRlc3Q9IiRlbGVtZW50VHlwZSA9ICdDdXN0b21DYXRlZ29yeSciPgotCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InNob3dDdXN0b21DYXRlZ29yeSIvPgotCQk8L3hzbDppZj4JCQotICAgIDwveHNsOnRlbXBsYXRlPgotCi0gICAgPHhzbDp0ZW1wbGF0ZSBuYW1lPSJzaG93RGlzY2lwbGUiPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InJlZmVyZW5jZVdvcmtmbG93cyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0W0BuYW1lPSdyZWZlcmVuY2VXb3JrZmxvd3MnXS9FbGVtZW50Ii8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0idGFza3MiIHNlbGVjdD0icmVmZXJlbmNlTGlzdFtAbmFtZT0ndGFza3MnXS9FbGVtZW50Ii8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0ic3ViZGlzY2lwbGluZXMiIHNlbGVjdD0icmVmZXJlbmNlTGlzdFtAbmFtZT0nc3ViZGlzY2lwbGluZSddL0VsZW1lbnQiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJjYXRlZ29yaWVzIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3RbQG5hbWU9J0NvbnRlbnRFbGVtZW50X0N1c3RvbUNhdGVnb3JpZXMnXS9FbGVtZW50Ii8+Ci0JCTx4c2w6aWYgdGVzdD0iY291bnQoJHJlZmVyZW5jZVdvcmtmbG93cykgKyBjb3VudCgkdGFza3MpICsgY291bnQoJHN1YmRpc2NpcGxpbmVzKT4gMCI+Ci0JCQk8ZGl2IGNsYXNzPSJzZWN0aW9uSGVhZGluZyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRyZWxhdGlvbnNoaXBzVGV4dCIvPjwvZGl2PgotCQkJPGRpdiBjbGFzcz0ic2VjdGlvbkNvbnRlbnQiPgotCQkJCTx0YWJsZSBjbGFzcz0ic2VjdGlvblRhYmxlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+Ci0JCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhZGRSZWZlcmVuY2VzIj4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJyZWZOYW1lIiBzZWxlY3Q9IiRjYXRlZ29yaWVzVGV4dCIvPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9InJlZkVsZW1lbnQiIHNlbGVjdD0iJGNhdGVnb3JpZXMiLz4KLQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJPHhzbDppZiB0ZXN0PSJjb3VudCgkcmVmZXJlbmNlV29ya2Zsb3dzKSA+IDAiPgotCQkJCQkJPHRyIHZhbGlnbj0idG9wIj4KLQkJCQkJCQk8dGggY2xhc3M9InNlY3Rpb25UYWJsZUhlYWRpbmciIHNjb3BlPSJyb3ciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcmVmZXJlbmNlV29ya2Zsb3dzVGV4dCIvPjwvdGg+Ci0JCQkJCQkJPHRkIGNsYXNzPSJzZWN0aW9uVGFibGVDZWxsIj4KLQkJCQkJCQkJPHVsPgotCQkJCQkJCQkJPHhzbDpmb3ItZWFjaCBzZWxlY3Q9IiRyZWZlcmVuY2VXb3JrZmxvd3MiPgotCQkJCQkJCQkJPHhzbDpzb3J0IGRhdGEtdHlwZT0idGV4dCIgc2VsZWN0PSJARGlzcGxheU5hbWUiIG9yZGVyPSJhc2NlbmRpbmciIC8+Ci0JCQkJCQkJCQkJPGxpPgotCQkJCQkJCQkJCQk8YT4KLQkJCQkJCQkJCQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9ImhyZWYiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIvRWxlbWVudC9AQmFja1BhdGgiLz48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQFVybCIvPjwveHNsOmF0dHJpYnV0ZT4KLQkJCQkJCQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJARGlzcGxheU5hbWUiLz4KLQkJCQkJCQkJCQkJPC9hPgotCQkJCQkJCQkJCTwvbGk+Ci0JCQkJCQkJCQk8L3hzbDpmb3ItZWFjaD4KLQkJCQkJCQkJPC91bD4KLQkJCQkJCQk8L3RkPgotCQkJCQkJPC90cj4KLQkJCQkJPC94c2w6aWY+Ci0JCQkJCTx4c2w6aWYgdGVzdD0iY291bnQoJHRhc2tzKSA+IDAiPgotCQkJCQkJPHRyIHZhbGlnbj0idG9wIj4KLQkJCQkJCQk8dGggY2xhc3M9InNlY3Rpb25UYWJsZUhlYWRpbmciIHNjb3BlPSJyb3ciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdGFza3NUZXh0Ii8+PC90aD4KLQkJCQkJCQk8dGQgY2xhc3M9InNlY3Rpb25UYWJsZUNlbGwiPgotCQkJCQkJCQk8dWw+Ci0JCQkJCQkJCQk8eHNsOmZvci1lYWNoIHNlbGVjdD0iJHRhc2tzIj4KLQkJCQkJCQkJCTx4c2w6c29ydCBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPgotCQkJCQkJCQkJCTxsaT4KLQkJCQkJCQkJCQkJPGE+Ci0JCQkJCQkJCQkJCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJocmVmIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iL0VsZW1lbnQvQEJhY2tQYXRoIi8+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBVcmwiLz48L3hzbDphdHRyaWJ1dGU+Ci0JCQkJCQkJCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQERpc3BsYXlOYW1lIi8+Ci0JCQkJCQkJCQkJCTwvYT4KLQkJCQkJCQkJCQk8L2xpPgotCQkJCQkJCQkJPC94c2w6Zm9yLWVhY2g+Ci0JCQkJCQkJCTwvdWw+Ci0JCQkJCQkJPC90ZD4KLQkJCQkJCTwvdHI+Ci0JCQkJCTwveHNsOmlmPgotCQkJCQk8eHNsOmlmIHRlc3Q9ImNvdW50KCRzdWJkaXNjaXBsaW5lcykgPiAwIj4KLQkJCQkJCTx0ciB2YWxpZ249InRvcCI+Ci0JCQkJCQkJPHRoIGNsYXNzPSJzZWN0aW9uVGFibGVIZWFkaW5nIiBzY29wZT0icm93Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHN1YmRpc2NpcGxpbmVzVGV4dCIvPjwvdGg+Ci0JCQkJCQkJPHRkIGNsYXNzPSJzZWN0aW9uVGFibGVDZWxsIj4KLQkJCQkJCQkJPHVsPgotCQkJCQkJCQkJPHhzbDpmb3ItZWFjaCBzZWxlY3Q9IiRzdWJkaXNjaXBsaW5lcyI+Ci0JCQkJCQkJCQkJPHhzbDpzb3J0IGRhdGEtdHlwZT0idGV4dCIgc2VsZWN0PSJARGlzcGxheU5hbWUiIG9yZGVyPSJhc2NlbmRpbmciIC8+Ci0JCQkJCQkJCQkJPGxpPgotCQkJCQkJCQkJCQk8YT4KLQkJCQkJCQkJCQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9ImhyZWYiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIvRWxlbWVudC9AQmFja1BhdGgiLz48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQFVybCIvPjwveHNsOmF0dHJpYnV0ZT4KLQkJCQkJCQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJARGlzcGxheU5hbWUiLz4KLQkJCQkJCQkJCQkJPC9hPgotCQkJCQkJCQkJCTwvbGk+Ci0JCQkJCQkJCQk8L3hzbDpmb3ItZWFjaD4KLQkJCQkJCQkJPC91bD4KLQkJCQkJCQk8L3RkPgotCQkJCQkJPC90cj4KLQkJCQkJPC94c2w6aWY+CQkJCQkJCQkJCQotCQkJCTwvdGFibGU+Ci0JCQk8L2Rpdj4KLQkJPC94c2w6aWY+Ci0gICAgPC94c2w6dGVtcGxhdGU+Ci0KLSAgICA8eHNsOnRlbXBsYXRlIG5hbWU9InNob3dEaXNjaXBsZUdyb3VwaW5nIj4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJkaXNjaXBsaW5lcyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0W0BuYW1lPSdkaXNjaXBsaW5lcyddL0VsZW1lbnQiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJjYXRlZ29yaWVzIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3RbQG5hbWU9J0NvbnRlbnRFbGVtZW50X0N1c3RvbUNhdGVnb3JpZXMnXS9FbGVtZW50Ii8+Ci0JCTx4c2w6aWYgdGVzdD0iY291bnQoJGRpc2NpcGxpbmVzKSA+IDAiPgotCQkJPGRpdiBjbGFzcz0ic2VjdGlvbkhlYWRpbmciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcmVsYXRpb25zaGlwc1RleHQiLz48L2Rpdj4KLQkJCTxkaXYgY2xhc3M9InNlY3Rpb25Db250ZW50Ij4KLQkJCQk8dGFibGUgY2xhc3M9InNlY3Rpb25UYWJsZSIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiPgotCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWRkUmVmZXJlbmNlcyI+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0icmVmTmFtZSIgc2VsZWN0PSIkY2F0ZWdvcmllc1RleHQiLz4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJyZWZFbGVtZW50IiBzZWxlY3Q9IiRjYXRlZ29yaWVzIi8+Ci0JCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCTx0ciB2YWxpZ249InRvcCI+Ci0JCQkJCQk8dGggY2xhc3M9InNlY3Rpb25UYWJsZUhlYWRpbmciIHNjb3BlPSJyb3ciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZGlzY2lwbGluZXNUZXh0Ii8+PC90aD4KLQkJCQkJCTx0ZCBjbGFzcz0ic2VjdGlvblRhYmxlQ2VsbCI+Ci0JCQkJCQkJPHVsPgotCQkJCQkJCQk8eHNsOmZvci1lYWNoIHNlbGVjdD0iJGRpc2NpcGxpbmVzIj4KLQkJCQkJCQkJPHhzbDpzb3J0IGRhdGEtdHlwZT0idGV4dCIgc2VsZWN0PSJARGlzcGxheU5hbWUiIG9yZGVyPSJhc2NlbmRpbmciIC8+Ci0JCQkJCQkJCQk8bGk+Ci0JCQkJCQkJCQkJPGE+Ci0JCQkJCQkJCQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9ImhyZWYiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIvRWxlbWVudC9AQmFja1BhdGgiLz48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQFVybCIvPjwveHNsOmF0dHJpYnV0ZT4KLQkJCQkJCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPgotCQkJCQkJCQkJCTwvYT4KLQkJCQkJCQkJCTwvbGk+Ci0JCQkJCQkJCTwveHNsOmZvci1lYWNoPgotCQkJCQkJCTwvdWw+Ci0JCQkJCQk8L3RkPgotCQkJCQk8L3RyPgotCQkJCTwvdGFibGU+Ci0JCQk8L2Rpdj4KLQkJPC94c2w6aWY+Ci0gICAgPC94c2w6dGVtcGxhdGU+Ci0KLSAgICA8eHNsOnRlbXBsYXRlIG5hbWU9InNob3dEb21haW4iPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InN1YmRvbWFpbnMiIHNlbGVjdD0icmVmZXJlbmNlTGlzdFtAbmFtZT0nc3ViZG9tYWlucyddL0VsZW1lbnQiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJ3b3JrUHJvZHVjdHMiIHNlbGVjdD0icmVmZXJlbmNlTGlzdFtAbmFtZT0nd29ya1Byb2R1Y3RzJ10vRWxlbWVudCIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImNhdGVnb3JpZXMiIHNlbGVjdD0icmVmZXJlbmNlTGlzdFtAbmFtZT0nQ29udGVudEVsZW1lbnRfQ3VzdG9tQ2F0ZWdvcmllcyddL0VsZW1lbnQiLz4JCQkJCQkKLQkJPHhzbDppZiB0ZXN0PSJjb3VudCgkc3ViZG9tYWlucykgKyBjb3VudCgkd29ya1Byb2R1Y3RzKSA+IDAiPgotCQkJPGRpdiBjbGFzcz0ic2VjdGlvbkhlYWRpbmciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcmVsYXRpb25zaGlwc1RleHQiLz48L2Rpdj4KLQkJCTxkaXYgY2xhc3M9InNlY3Rpb25Db250ZW50Ij4KLQkJCQk8dGFibGUgY2xhc3M9InNlY3Rpb25UYWJsZSIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiPgotCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWRkUmVmZXJlbmNlcyI+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0icmVmTmFtZSIgc2VsZWN0PSIkY2F0ZWdvcmllc1RleHQiLz4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJyZWZFbGVtZW50IiBzZWxlY3Q9IiRjYXRlZ29yaWVzIi8+Ci0JCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCTx4c2w6aWYgdGVzdD0iY291bnQoJHN1YmRvbWFpbnMpID4gMCI+Ci0JCQkJCQk8dHIgdmFsaWduPSJ0b3AiPgotCQkJCQkJCTx0aCBjbGFzcz0ic2VjdGlvblRhYmxlSGVhZGluZyIgc2NvcGU9InJvdyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRzdWJkb21haW5zVGV4dCIvPjwvdGg+Ci0JCQkJCQkJPHRkIGNsYXNzPSJzZWN0aW9uVGFibGVDZWxsIj4KLQkJCQkJCQkJPHVsPgotCQkJCQkJCQkJPHhzbDpmb3ItZWFjaCBzZWxlY3Q9IiRzdWJkb21haW5zIj4KLQkJCQkJCQkJCQk8eHNsOnNvcnQgZGF0YS10eXBlPSJ0ZXh0IiBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIgb3JkZXI9ImFzY2VuZGluZyIgLz4KLQkJCQkJCQkJCQk8bGk+Ci0JCQkJCQkJCQkJCTxhPgotCQkJCQkJCQkJCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0iaHJlZiI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii9FbGVtZW50L0BCYWNrUGF0aCIvPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAVXJsIi8+PC94c2w6YXR0cmlidXRlPgotCQkJCQkJCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPgotCQkJCQkJCQkJCQk8L2E+Ci0JCQkJCQkJCQkJPC9saT4KLQkJCQkJCQkJCTwveHNsOmZvci1lYWNoPgotCQkJCQkJCQk8L3VsPgotCQkJCQkJCTwvdGQ+Ci0JCQkJCQk8L3RyPgotCQkJCQk8L3hzbDppZj4KLQkJCQkJPHhzbDppZiB0ZXN0PSJjb3VudCgkd29ya1Byb2R1Y3RzKSA+IDAiPgotCQkJCQkJPHRyIHZhbGlnbj0idG9wIj4KLQkJCQkJCQk8dGggY2xhc3M9InNlY3Rpb25UYWJsZUhlYWRpbmciIHNjb3BlPSJyb3ciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkd29ya1Byb2R1Y3RzVGV4dCIvPjwvdGg+Ci0JCQkJCQkJPHRkIGNsYXNzPSJzZWN0aW9uVGFibGVDZWxsIj4KLQkJCQkJCQkJPHVsPgotCQkJCQkJCQkJPHhzbDpmb3ItZWFjaCBzZWxlY3Q9IiR3b3JrUHJvZHVjdHMiPgotCQkJCQkJCQkJPHhzbDpzb3J0IHNlbGVjdD0iQERpc3BsYXlOYW1lIi8+Ci0JCQkJCQkJCQkJPGxpPgotCQkJCQkJCQkJCQk8YT4KLQkJCQkJCQkJCQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9ImhyZWYiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIvRWxlbWVudC9AQmFja1BhdGgiLz48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQFVybCIvPjwveHNsOmF0dHJpYnV0ZT4KLQkJCQkJCQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJARGlzcGxheU5hbWUiLz4KLQkJCQkJCQkJCQkJPC9hPgotCQkJCQkJCQkJCTwvbGk+Ci0JCQkJCQkJCQk8L3hzbDpmb3ItZWFjaD4KLQkJCQkJCQkJPC91bD4KLQkJCQkJCQk8L3RkPgotCQkJCQkJPC90cj4KLQkJCQkJPC94c2w6aWY+CQkJCQkJCQkJCQkJCQkKLQkJCQk8L3RhYmxlPgotCQkJPC9kaXY+Ci0JCTwveHNsOmlmPgotICAgIDwveHNsOnRlbXBsYXRlPgotCi0gICAgPHhzbDp0ZW1wbGF0ZSBuYW1lPSJzaG93V29ya1Byb2R1Y3RUeXBlIj4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJ3b3JrUHJvZHVjdHMiIHNlbGVjdD0icmVmZXJlbmNlTGlzdFtAbmFtZT0nd29ya1Byb2R1Y3RzJ10vRWxlbWVudCIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImNhdGVnb3JpZXMiIHNlbGVjdD0icmVmZXJlbmNlTGlzdFtAbmFtZT0nQ29udGVudEVsZW1lbnRfQ3VzdG9tQ2F0ZWdvcmllcyddL0VsZW1lbnQiLz4KLQkJPHhzbDppZiB0ZXN0PSJjb3VudCgkd29ya1Byb2R1Y3RzKSA+IDAiPgotCQkJPGRpdiBjbGFzcz0ic2VjdGlvbkhlYWRpbmciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcmVsYXRpb25zaGlwc1RleHQiLz48L2Rpdj4KLQkJCTxkaXYgY2xhc3M9InNlY3Rpb25Db250ZW50Ij4KLQkJCQk8dGFibGUgY2xhc3M9InNlY3Rpb25UYWJsZSIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiPgotCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWRkUmVmZXJlbmNlcyI+Ci0JCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9InJlZk5hbWUiIHNlbGVjdD0iJGNhdGVnb3JpZXNUZXh0Ii8+Ci0JCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9InJlZkVsZW1lbnQiIHNlbGVjdD0iJGNhdGVnb3JpZXMiLz4KLQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJPHRyIHZhbGlnbj0idG9wIj4KLQkJCQkJCTx0aCBjbGFzcz0ic2VjdGlvblRhYmxlSGVhZGluZyIgc2NvcGU9InJvdyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR3b3JrUHJvZHVjdHNUZXh0Ii8+PC90aD4KLQkJCQkJCTx0ZCBjbGFzcz0ic2VjdGlvblRhYmxlQ2VsbCI+Ci0JCQkJCQkJPHVsPgotCQkJCQkJCQk8eHNsOmZvci1lYWNoIHNlbGVjdD0iJHdvcmtQcm9kdWN0cyI+Ci0JCQkJCQkJCTx4c2w6c29ydCBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPgotCQkJCQkJCQkJPGxpPgotCQkJCQkJCQkJCTxhPgotCQkJCQkJCQkJCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJocmVmIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iL0VsZW1lbnQvQEJhY2tQYXRoIi8+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBVcmwiLz48L3hzbDphdHRyaWJ1dGU+Ci0JCQkJCQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJARGlzcGxheU5hbWUiLz4KLQkJCQkJCQkJCQk8L2E+Ci0JCQkJCQkJCQk8L2xpPgotCQkJCQkJCQk8L3hzbDpmb3ItZWFjaD4KLQkJCQkJCQk8L3VsPgotCQkJCQkJPC90ZD4KLQkJCQkJPC90cj4KLQkJCQk8L3RhYmxlPgotCQkJPC9kaXY+Ci0JCTwveHNsOmlmPgotICAgIDwveHNsOnRlbXBsYXRlPgotCi0gICAgPHhzbDp0ZW1wbGF0ZSBuYW1lPSJzaG93Um9sZVNldEdyb3VwaW5nIj4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJyb2xlU2V0cyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0W0BuYW1lPSdyb2xlU2V0cyddL0VsZW1lbnQiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJjYXRlZ29yaWVzIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3RbQG5hbWU9J0NvbnRlbnRFbGVtZW50X0N1c3RvbUNhdGVnb3JpZXMnXS9FbGVtZW50Ii8+Ci0JCTx4c2w6aWYgdGVzdD0iY291bnQoJHJvbGVTZXRzKSA+IDAiPgotCQkJPGRpdiBjbGFzcz0ic2VjdGlvbkhlYWRpbmciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcmVsYXRpb25zaGlwc1RleHQiLz48L2Rpdj4KLQkJCTxkaXYgY2xhc3M9InNlY3Rpb25Db250ZW50Ij4KLQkJCQk8dGFibGUgY2xhc3M9InNlY3Rpb25UYWJsZSIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiPgotCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWRkUmVmZXJlbmNlcyI+Ci0JCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9InJlZk5hbWUiIHNlbGVjdD0iJGNhdGVnb3JpZXNUZXh0Ii8+Ci0JCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9InJlZkVsZW1lbnQiIHNlbGVjdD0iJGNhdGVnb3JpZXMiLz4KLQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJPHRyIHZhbGlnbj0idG9wIj4KLQkJCQkJCTx0aCBjbGFzcz0ic2VjdGlvblRhYmxlSGVhZGluZyIgc2NvcGU9InJvdyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRyb2xlU2V0c1RleHQiLz48L3RoPgotCQkJCQkJPHRkIGNsYXNzPSJzZWN0aW9uVGFibGVDZWxsIj4KLQkJCQkJCQk8dWw+Ci0JCQkJCQkJCTx4c2w6Zm9yLWVhY2ggc2VsZWN0PSIkcm9sZVNldHMiPgotCQkJCQkJCQk8eHNsOnNvcnQgZGF0YS10eXBlPSJ0ZXh0IiBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIgb3JkZXI9ImFzY2VuZGluZyIgLz4KLQkJCQkJCQkJCTxsaT4KLQkJCQkJCQkJCQk8YT4KLQkJCQkJCQkJCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0iaHJlZiI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii9FbGVtZW50L0BCYWNrUGF0aCIvPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAVXJsIi8+PC94c2w6YXR0cmlidXRlPgotCQkJCQkJCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQERpc3BsYXlOYW1lIi8+Ci0JCQkJCQkJCQkJPC9hPgotCQkJCQkJCQkJPC9saT4KLQkJCQkJCQkJPC94c2w6Zm9yLWVhY2g+Ci0JCQkJCQkJPC91bD4KLQkJCQkJCTwvdGQ+Ci0JCQkJCTwvdHI+Ci0JCQkJPC90YWJsZT4KLQkJCTwvZGl2PgotCQk8L3hzbDppZj4KLSAgICA8L3hzbDp0ZW1wbGF0ZT4KLQotICAgIDx4c2w6dGVtcGxhdGUgbmFtZT0ic2hvd1JvbGVTZXQiPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InJvbGVzIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3RbQG5hbWU9J3JvbGVzJ10vRWxlbWVudCIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImNhdGVnb3JpZXMiIHNlbGVjdD0icmVmZXJlbmNlTGlzdFtAbmFtZT0nQ29udGVudEVsZW1lbnRfQ3VzdG9tQ2F0ZWdvcmllcyddL0VsZW1lbnQiLz4KLQkJPHhzbDppZiB0ZXN0PSJjb3VudCgkcm9sZXMpID4gMCI+Ci0JCQk8ZGl2IGNsYXNzPSJzZWN0aW9uSGVhZGluZyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRyZWxhdGlvbnNoaXBzVGV4dCIvPjwvZGl2PgotCQkJPGRpdiBjbGFzcz0ic2VjdGlvbkNvbnRlbnQiPgotCQkJCTx0YWJsZSBjbGFzcz0ic2VjdGlvblRhYmxlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+Ci0JCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhZGRSZWZlcmVuY2VzIj4KLQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0icmVmTmFtZSIgc2VsZWN0PSIkY2F0ZWdvcmllc1RleHQiLz4KLQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0icmVmRWxlbWVudCIgc2VsZWN0PSIkY2F0ZWdvcmllcyIvPgotCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQk8dHIgdmFsaWduPSJ0b3AiPgotCQkJCQkJPHRoIGNsYXNzPSJzZWN0aW9uVGFibGVIZWFkaW5nIiBzY29wZT0icm93Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHJvbGVzVGV4dCIvPjwvdGg+Ci0JCQkJCQk8dGQgY2xhc3M9InNlY3Rpb25UYWJsZUNlbGwiPgotCQkJCQkJCTx1bD4KLQkJCQkJCQkJPHhzbDpmb3ItZWFjaCBzZWxlY3Q9IiRyb2xlcyI+Ci0JCQkJCQkJCTx4c2w6c29ydCBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPgotCQkJCQkJCQkJPGxpPgotCQkJCQkJCQkJCTxhPgotCQkJCQkJCQkJCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJocmVmIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iL0VsZW1lbnQvQEJhY2tQYXRoIi8+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBVcmwiLz48L3hzbDphdHRyaWJ1dGU+Ci0JCQkJCQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJARGlzcGxheU5hbWUiLz4KLQkJCQkJCQkJCQk8L2E+Ci0JCQkJCQkJCQk8L2xpPgotCQkJCQkJCQk8L3hzbDpmb3ItZWFjaD4KLQkJCQkJCQk8L3VsPgotCQkJCQkJPC90ZD4KLQkJCQkJPC90cj4KLQkJCQk8L3RhYmxlPgotCQkJPC9kaXY+Ci0JCTwveHNsOmlmPgotICAgIDwveHNsOnRlbXBsYXRlPgotCi0gICAgPHhzbDp0ZW1wbGF0ZSBuYW1lPSJzaG93VG9vbCI+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0idG9vbE1lbnRvcnMiIHNlbGVjdD0icmVmZXJlbmNlTGlzdFtAbmFtZT0ndG9vbE1lbnRvcnMnXS9FbGVtZW50Ii8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iY2F0ZWdvcmllcyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0W0BuYW1lPSdDb250ZW50RWxlbWVudF9DdXN0b21DYXRlZ29yaWVzJ10vRWxlbWVudCIvPgotCQk8eHNsOmlmIHRlc3Q9ImNvdW50KCR0b29sTWVudG9ycykgPiAwIj4KLQkJCTxkaXYgY2xhc3M9InNlY3Rpb25IZWFkaW5nIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHJlbGF0aW9uc2hpcHNUZXh0Ii8+PC9kaXY+Ci0JCQk8ZGl2IGNsYXNzPSJzZWN0aW9uQ29udGVudCI+Ci0JCQkJPHRhYmxlIGNsYXNzPSJzZWN0aW9uVGFibGUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4KLQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFkZFJlZmVyZW5jZXMiPgotCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJyZWZOYW1lIiBzZWxlY3Q9IiRjYXRlZ29yaWVzVGV4dCIvPgotCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJyZWZFbGVtZW50IiBzZWxlY3Q9IiRjYXRlZ29yaWVzIi8+Ci0JCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCTx0ciB2YWxpZ249InRvcCI+Ci0JCQkJCQk8dGggY2xhc3M9InNlY3Rpb25UYWJsZUhlYWRpbmciIHNjb3BlPSJyb3ciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdG9vbE1lbnRvcnNUZXh0Ii8+PC90aD4KLQkJCQkJCTx0ZCBjbGFzcz0ic2VjdGlvblRhYmxlQ2VsbCI+Ci0JCQkJCQkJPHVsPgotCQkJCQkJCQk8eHNsOmZvci1lYWNoIHNlbGVjdD0iJHRvb2xNZW50b3JzIj4KLQkJCQkJCQkJPHhzbDpzb3J0IHNlbGVjdD0iQERpc3BsYXlOYW1lIi8+Ci0JCQkJCQkJCQk8bGk+Ci0JCQkJCQkJCQkJPGE+Ci0JCQkJCQkJCQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9ImhyZWYiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIvRWxlbWVudC9AQmFja1BhdGgiLz48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQFVybCIvPjwveHNsOmF0dHJpYnV0ZT4KLQkJCQkJCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPgotCQkJCQkJCQkJCTwvYT4KLQkJCQkJCQkJCTwvbGk+Ci0JCQkJCQkJCTwveHNsOmZvci1lYWNoPgotCQkJCQkJCTwvdWw+Ci0JCQkJCQk8L3RkPgotCQkJCQk8L3RyPgotCQkJCTwvdGFibGU+Ci0JCQk8L2Rpdj4KLQkJPC94c2w6aWY+Ci0gICAgPC94c2w6dGVtcGxhdGU+Ci0KLSAgICA8eHNsOnRlbXBsYXRlIG5hbWU9InNob3dDdXN0b21DYXRlZ29yeSI+Ci0gIAkJPHhzbDp2YXJpYWJsZSBuYW1lPSJjYXRlZ29yaXplZEVsZW1lbnRzIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3RbQG5hbWU9J2NhdGVnb3JpemVkRWxlbWVudHMnXS9FbGVtZW50Ii8+Ci0gICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iY2F0ZWdvcmllcyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0W0BuYW1lPSdDb250ZW50RWxlbWVudF9DdXN0b21DYXRlZ29yaWVzJ10vRWxlbWVudCIvPgotICAgICAgICA8eHNsOmlmIHRlc3Q9ImNvdW50KCRjYXRlZ29yaXplZEVsZW1lbnRzKSA+IDAiPgotICAgICAgICAJPGRpdiBjbGFzcz0ic2VjdGlvbkhlYWRpbmciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcmVsYXRpb25zaGlwc1RleHQiLz48L2Rpdj4KLSAgICAgICAgICAgIDxkaXYgY2xhc3M9InNlY3Rpb25Db250ZW50Ij4KLSAgICAgICAgICAgIAk8dGFibGUgY2xhc3M9InNlY3Rpb25UYWJsZSIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWRkUmVmZXJlbmNlcyI+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0icmVmTmFtZSIgc2VsZWN0PSIkY2F0ZWdvcmllc1RleHQiLz4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJyZWZFbGVtZW50IiBzZWxlY3Q9IiRjYXRlZ29yaWVzIi8+Ci0JCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0gICAgICAgICAgICAgICAJCTx0ciB2YWxpZ249InRvcCI+Ci0gICAgICAgICAgICAgICAgICAgCQk8dGggY2xhc3M9InNlY3Rpb25UYWJsZUhlYWRpbmciIHNjb3BlPSJyb3ciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkY29udGVudHNUZXh0Ii8+PC90aD4KLSAgICAgICAgICAgICAgICAgICAJCTx0ZCBjbGFzcz0ic2VjdGlvblRhYmxlQ2VsbCI+Ci0gICAgICAgICAgICAgICAgICAgICAgIAkJPHVsPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgCQk8eHNsOmZvci1lYWNoIHNlbGVjdD0iJGNhdGVnb3JpemVkRWxlbWVudHMiPgotCQkJCQkJCQk8eHNsOnNvcnQgc2VsZWN0PSJARGlzcGxheU5hbWUiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJCTxsaT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCQk8YT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkJPHhzbDphdHRyaWJ1dGUgbmFtZT0iaHJlZiI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii9FbGVtZW50L0BCYWNrUGF0aCIvPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAVXJsIi8+PC94c2w6YXR0cmlidXRlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJARGlzcGxheU5hbWUiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAk8L2E+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCTwvbGk+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCTwveHNsOmZvci1lYWNoPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgCTwvdWw+Ci0gICAgICAgICAgICAgICAgICAgICAJPC90ZD4KLSAgICAgICAgICAgICAgICAgICAJPC90cj4KLSAgICAgICAgICAgIAk8L3RhYmxlPgotICAgICAgICAgCTwvZGl2PgotICAgIAk8L3hzbDppZj4KLSAgICA8L3hzbDp0ZW1wbGF0ZT4KLQotPC94c2w6c3R5bGVzaGVldD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC94c2wvZGVsaXZlcmFibGUueHNsIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L3hzbC9kZWxpdmVyYWJsZS54c2wKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwN2YwYTYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L3hzbC9kZWxpdmVyYWJsZS54c2wKKysrIC9kZXYvbnVsbApAQCAtMSwxNjYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotCi08eHNsOnN0eWxlc2hlZXQgdmVyc2lvbj0iMS4wIgotCXhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIgotCXhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiPgotCi08eHNsOm91dHB1dCBtZXRob2Q9Imh0bWwiIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiAKLQlkb2N0eXBlLXB1YmxpYz0iLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iIAotCWRvY3R5cGUtc3lzdGVtPSJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIiAKLQlpbmRlbnQ9InllcyIvPgotCQotCTx4c2w6aW5jbHVkZSBocmVmPSJ3b3JrcHJvZHVjdC54c2wiLz4KLQk8eHNsOmluY2x1ZGUgaHJlZj0ibWFwcGluZy54c2wiLz4KLQk8eHNsOmluY2x1ZGUgaHJlZj0ibWFpbl9kZXNjcmlwdGlvbi54c2wiLz4JCi0KLQk8eHNsOnRlbXBsYXRlIG1hdGNoPSIvRWxlbWVudCI+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iZWxlbWVudFR5cGUiIHNlbGVjdD0iQFR5cGUiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJlbGVtZW50VHlwZU5hbWUiIHNlbGVjdD0iQFR5cGVOYW1lIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iZWxlbWVudE5hbWUiIHNlbGVjdD0iQE5hbWUiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJlbGVtZW50UHJlc2VudGF0aW9uTmFtZSIgc2VsZWN0PSJARGlzcGxheU5hbWUiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJiYWNrUGF0aCIgc2VsZWN0PSJAQmFja1BhdGgiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJpbWFnZVBhdGgiIHNlbGVjdD0iY29uY2F0KCRiYWNrUGF0aCwgJ2ltYWdlcy8nKSIvPgotCSAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InNoYXBlSW1hZ2UiIHNlbGVjdD0iY29uY2F0KCRiYWNrUGF0aCxAU2hhcGVpY29uVXJsKSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InByZXNlbnRhdGlvbiIgc2VsZWN0PSJyZWZlcmVuY2VbQG5hbWU9J3ByZXNlbnRhdGlvbiddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iZGVsaXZlcmFibGVEZXNjcmlwdGlvbiIgc2VsZWN0PSIkcHJlc2VudGF0aW9uL0VsZW1lbnRbQFR5cGU9J0RlbGl2ZXJhYmxlRGVzY3JpcHRpb24nXSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImNvcHlyaWdodCIgc2VsZWN0PSJjb3B5cmlnaHQiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJzaG93VHJlZUJyb3dzZXIiIHNlbGVjdD0iQHNob3dUcmVlQnJvd3NlciIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InJlc3BvbnNpYmxlUm9sZSIgc2VsZWN0PSJyZWZlcmVuY2VbQG5hbWU9J3Jlc3BvbnNpYmxlUm9sZSddL0VsZW1lbnRbQFR5cGU9J1JvbGUnXSIvPgotCi0JCTxodG1sPgotCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0ibGFuZyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBsYW5nIi8+PC94c2w6YXR0cmlidXRlPgotCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0ieG1sOmxhbmciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbGFuZyIvPjwveHNsOmF0dHJpYnV0ZT4KLQkJCTxoZWFkPgotCQkJCTx0aXRsZT48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVsZW1lbnRUeXBlTmFtZSIvPjogPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50UHJlc2VudGF0aW9uTmFtZSIvPjwvdGl0bGU+Ci0JCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InVtYU1ldGFUYWdzIj4KLQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnRUeXBlIiBzZWxlY3Q9IiRlbGVtZW50VHlwZSIvPgotCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudE5hbWUiIHNlbGVjdD0iJGVsZW1lbnROYW1lIi8+Ci0JCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50UHJlc2VudGF0aW9uTmFtZSIgc2VsZWN0PSIkZWxlbWVudFByZXNlbnRhdGlvbk5hbWUiLz4KLQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCTxtZXRhIG5hbWU9ImVsZW1lbnRfdHlwZSI+IAotCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0ibWFwcGluZyI+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudFR5cGUiIHNlbGVjdD0iJGVsZW1lbnRUeXBlIi8+Ci0JCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJPC9tZXRhPgotCQkJCTwhLS0gPG1ldGEgbmFtZT0iZWxlbWVudF90eXBlIiBjb250ZW50PSJ7JGVsZW1lbnRUeXBlfSIvPiAtLT4KLQkJCQk8bWV0YSBuYW1lPSJmaWxldHlwZSIgY29udGVudD0iZGVzY3JpcHRpb24iLz4KLQkJCQk8bWV0YSBuYW1lPSJyb2xlIj4KLQkJCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0iY29udGVudCI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRyZXNwb25zaWJsZVJvbGUvQERpc3BsYXlOYW1lIi8+PC94c2w6YXR0cmlidXRlPgotCQkJCTwvbWV0YT4KLQkJCQk8bGluayByZWw9IlN0eWxlU2hlZXQiIGhyZWY9InskYmFja1BhdGh9Y3NzL2RlZmF1bHQuY3NzIiB0eXBlPSJ0ZXh0L2NzcyIvPgotCQkJCTxzY3JpcHQgc3JjPSJ7JGJhY2tQYXRofXNjcmlwdHMvQ29udGVudFBhZ2VSZXNvdXJjZS5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PC9zY3JpcHQ+Ci0JCQkJPHNjcmlwdCBzcmM9InskYmFja1BhdGh9c2NyaXB0cy9Db250ZW50UGFnZVNlY3Rpb24uanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPjwvc2NyaXB0PgotCQkJCTxzY3JpcHQgc3JjPSJ7JGJhY2tQYXRofXNjcmlwdHMvQ29udGVudFBhZ2VTdWJTZWN0aW9uLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij48L3NjcmlwdD4KLQkJCQk8c2NyaXB0IHNyYz0ieyRiYWNrUGF0aH1zY3JpcHRzL0NvbnRlbnRQYWdlVG9vbGJhci5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PC9zY3JpcHQ+Ci0JCQkJPHNjcmlwdCBzcmM9InskYmFja1BhdGh9c2NyaXB0cy9jb250ZW50UGFnZS5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PC9zY3JpcHQ+Ci0JCQkJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij4KLQkJCQkJdmFyIGJhY2tQYXRoID0gJzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkYmFja1BhdGgiLz4nOwotCQkJCQl2YXIgaW1nUGF0aCA9ICc8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGltYWdlUGF0aCIvPic7Ci0JCQkJCXZhciBub2RlSW5mbz1udWxsOwotCQkJCQljb250ZW50UGFnZS5wcmVsb2FkKGltZ1BhdGgsIGJhY2tQYXRoLCBub2RlSW5mbywgJycsIGZhbHNlLCBmYWxzZSwgZmFsc2UpOwotCQkJCTwvc2NyaXB0PgotCQkJPC9oZWFkPgotCQkJPGJvZHk+Ci0JCQk8ZGl2IGlkPSJicmVhZGNydW1icyI+PC9kaXY+Ci0JCQkJPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci0JCQkJCTx0cj4KLQkJCQkJCTx0ZCB2YWxpZ249InRvcCI+Ci0JCQkJCQkJPGEgbmFtZT0iVG9wIi8+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9Im92ZXJ2aWV3Ij4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnRUeXBlIiBzZWxlY3Q9IiRlbGVtZW50VHlwZSIvPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudFR5cGVOYW1lIiBzZWxlY3Q9IiRlbGVtZW50VHlwZU5hbWUiLz4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnRQcmVzZW50YXRpb25OYW1lIiBzZWxlY3Q9IiRlbGVtZW50UHJlc2VudGF0aW9uTmFtZSIvPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudEljb24iIHNlbGVjdD0iJHNoYXBlSW1hZ2UiLz4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImJhY2tQYXRoIiBzZWxlY3Q9IiRiYWNrUGF0aCIvPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0ic2hvd1RyZWVCcm93c2VyIiBzZWxlY3Q9IiRzaG93VHJlZUJyb3dzZXIiLz4KLQkJCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJwdXJwb3NlU2VjdGlvbiI+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJkZXNjcmlwdGlvbiIgc2VsZWN0PSIkZGVsaXZlcmFibGVEZXNjcmlwdGlvbiIvPgotCQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InJlbGF0aW9uc2hpcHNTZWN0aW9uIi8+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9Im1haW5EZXNjcmlwdGlvblNlY3Rpb24iPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZGVzY3JpcHRpb24iIHNlbGVjdD0iJGRlbGl2ZXJhYmxlRGVzY3JpcHRpb24iLz4KLQkJCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJ3b3JrUHJvZHVjdElsbHVzdHJhdGlvbnNTZWN0aW9uIi8+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImRlbGl2ZXJhYmxlU2VjdGlvbiI+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJkZXNjcmlwdGlvbiIgc2VsZWN0PSIkZGVsaXZlcmFibGVEZXNjcmlwdGlvbiIvPgotCQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImtleUNvbnNpZGVyYXRpb25zU2VjdGlvbiI+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJkZXNjcmlwdGlvbiIgc2VsZWN0PSIkZGVsaXZlcmFibGVEZXNjcmlwdGlvbiIvPgotCQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InRhaWxvcmluZ1NlY3Rpb24iPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZGVzY3JpcHRpb24iIHNlbGVjdD0iJGRlbGl2ZXJhYmxlRGVzY3JpcHRpb24iLz4KLQkJCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJtb3JlSW5mb1NlY3Rpb24iLz4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iY29weXJpZ2h0Ij4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImNvcHlyaWdodCIgc2VsZWN0PSIkY29weXJpZ2h0Ii8+Ci0JCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCTwvdGQ+Ci0JCQkJCTwvdHI+Ci0JCQkJPC90YWJsZT4KLQkJCTwvYm9keT4KLQkJCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+Ci0JCQkJY29udGVudFBhZ2Uub25sb2FkKCk7Ci0JCQk8L3NjcmlwdD4KLQkJPC9odG1sPgotCTwveHNsOnRlbXBsYXRlPgotCi0JPHhzbDp0ZW1wbGF0ZSBuYW1lPSJkZWxpdmVyYWJsZVNlY3Rpb24iPgotCQk8eHNsOnBhcmFtIG5hbWU9ImRlc2NyaXB0aW9uIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iZXh0ZXJuYWxEZXNjcmlwdGlvbiIgc2VsZWN0PSIkZGVzY3JpcHRpb24vYXR0cmlidXRlW0BuYW1lPSdleHRlcm5hbERlc2NyaXB0aW9uJ10iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJkZWxpdmVyZWRXb3JrUHJvZHVjdHMiIHNlbGVjdD0icmVmZXJlbmNlTGlzdFtAbmFtZT0nZGVsaXZlcmVkV29ya1Byb2R1Y3RzJ10vRWxlbWVudCIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InBhY2thZ2luZ0d1aWRhbmNlIiBzZWxlY3Q9IiRkZXNjcmlwdGlvbi9hdHRyaWJ1dGVbQG5hbWU9J3BhY2thZ2luZ0d1aWRhbmNlJ10iLz4KLQkJCi0JCTx4c2w6aWYgdGVzdD0iJGV4dGVybmFsRGVzY3JpcHRpb24gIT0gJycgb3IgY291bnQoJGRlbGl2ZXJlZFdvcmtQcm9kdWN0cykgPiAwIG9yICRwYWNrYWdpbmdHdWlkYW5jZSAhPSAnJyI+Ci0JCQk8ZGl2IGNsYXNzPSJzZWN0aW9uSGVhZGluZyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRkZWxpdmVyYWJsZVByb3BlcnRpZXNUZXh0Ii8+PC9kaXY+Ci0JCQk8ZGl2IGNsYXNzPSJzZWN0aW9uQ29udGVudCI+Ci0JCQkJPHRhYmxlIGNsYXNzPSJzZWN0aW9uVGFibGUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4KLQkJCQkJPHhzbDppZiB0ZXN0PSIkZXh0ZXJuYWxEZXNjcmlwdGlvbiAhPSAnJyI+Ci0JCQkJCQk8dHIgdmFsaWduPSJ0b3AiPgotCQkJCQkJCTx0aCBjbGFzcz0ic2VjdGlvblRhYmxlSGVhZGluZyIgc2NvcGU9InJvdyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRleHRlcm5hbERlc2NyaXB0aW9uVGV4dCIvPjwvdGg+Ci0JCQkJCQkJPHRkIGNsYXNzPSJzZWN0aW9uVGFibGVDZWxsIj4KLQkJCQkJCQkJPHhzbDp2YWx1ZS1vZiBkaXNhYmxlLW91dHB1dC1lc2NhcGluZz0ieWVzIiBzZWxlY3Q9IiRleHRlcm5hbERlc2NyaXB0aW9uIi8+Ci0JCQkJCQkJPC90ZD4KLQkJCQkJCTwvdHI+Ci0JCQkJCTwveHNsOmlmPgotCQkJCQk8eHNsOmlmIHRlc3Q9ImNvdW50KCRkZWxpdmVyZWRXb3JrUHJvZHVjdHMpID4gMCI+Ci0JCQkJCQk8dHIgdmFsaWduPSJ0b3AiPgotCQkJCQkJCTx0aCBjbGFzcz0ic2VjdGlvblRhYmxlSGVhZGluZyIgc2NvcGU9InJvdyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRkZWxpdmVyZWRQYXJ0c1RleHQiLz48L3RoPgotCQkJCQkJCTx0ZCBjbGFzcz0ic2VjdGlvblRhYmxlQ2VsbCI+Ci0JCQkJCQkJPHVsPgotCQkJCQkJCQk8eHNsOmZvci1lYWNoIHNlbGVjdD0iJGRlbGl2ZXJlZFdvcmtQcm9kdWN0cyI+Ci0JCQkJCQkJCTx4c2w6c29ydCBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPgotCQkJCQkJCQkJPGxpPgotCQkJCQkJCQkJCTxhPgotCQkJCQkJCQkJCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJocmVmIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iL0VsZW1lbnQvQEJhY2tQYXRoIi8+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBVcmwiLz48L3hzbDphdHRyaWJ1dGU+Ci0JCQkJCQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJARGlzcGxheU5hbWUiLz4KLQkJCQkJCQkJCQk8L2E+Ci0JCQkJCQkJCQk8L2xpPgotCQkJCQkJCQk8L3hzbDpmb3ItZWFjaD4KLQkJCQkJCQk8L3VsPgotCQkJCQkJCTwvdGQ+Ci0JCQkJCQk8L3RyPgotCQkJCQk8L3hzbDppZj4KLQkJCQkJPHhzbDppZiB0ZXN0PSIkcGFja2FnaW5nR3VpZGFuY2UgIT0gJyciPgotCQkJCQkJPHRyIHZhbGlnbj0idG9wIj4KLQkJCQkJCQk8dGggY2xhc3M9InNlY3Rpb25UYWJsZUhlYWRpbmciIHNjb3BlPSJyb3ciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcGFja2FnaW5nSW5zdHJ1Y3Rpb25zVGV4dCIvPjwvdGg+Ci0JCQkJCQkJPHRkIGNsYXNzPSJzZWN0aW9uVGFibGVDZWxsIj4KLQkJCQkJCQkJPHhzbDp2YWx1ZS1vZiBkaXNhYmxlLW91dHB1dC1lc2NhcGluZz0ieWVzIiBzZWxlY3Q9IiRwYWNrYWdpbmdHdWlkYW5jZSIvPgotCQkJCQkJCTwvdGQ+Ci0JCQkJCQk8L3RyPgotCQkJCQk8L3hzbDppZj4KLQkJCQk8L3RhYmxlPgotCQkJPC9kaXY+Ci0JCTwveHNsOmlmPgotCTwveHNsOnRlbXBsYXRlPgotCi08L3hzbDpzdHlsZXNoZWV0PgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L3hzbC9kZXNjcmlwdG9yLnhzbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC94c2wvZGVzY3JpcHRvci54c2wKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhY2Q3ZDAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L3hzbC9kZXNjcmlwdG9yLnhzbAorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLQotPHhzbDpzdHlsZXNoZWV0IHZlcnNpb249IjEuMCIKLQl4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIKLQl4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIj4KLQotCTx4c2w6aW5jbHVkZSBocmVmPSJyZXNvdXJjZXMueHNsIi8+Ci0JPHhzbDppbmNsdWRlIGhyZWY9ImNvbW1vbi54c2wiLz4KLQk8eHNsOmluY2x1ZGUgaHJlZj0ib3ZlcnZpZXcueHNsIi8+Ci0JPHhzbDppbmNsdWRlIGhyZWY9Im1haW5fZGVzY3JpcHRpb24ueHNsIi8+Ci0JPHhzbDppbmNsdWRlIGhyZWY9ImlsbHVzdHJhdGlvbi54c2wiLz4KLQk8eHNsOmluY2x1ZGUgaHJlZj0ia2V5X2NvbnNpZGVyYXRpb24ueHNsIi8+Ci0JPHhzbDppbmNsdWRlIGhyZWY9InByb3BlcnR5LnhzbCIvPgotCi0JPHhzbDp0ZW1wbGF0ZSBuYW1lPSJyZWZpbmVkRGVzY3JpcHRpb25TZWN0aW9uIj4KLQkJPHhzbDpwYXJhbSBuYW1lPSJkZXNjcmlwdGlvbiIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InJlZmluZWREZXNjcmlwdGlvbiIgc2VsZWN0PSIkZGVzY3JpcHRpb24vYXR0cmlidXRlW0BuYW1lPSdyZWZpbmVkRGVzY3JpcHRpb24nXSIvPgotCQk8eHNsOmlmIHRlc3Q9IiRyZWZpbmVkRGVzY3JpcHRpb24gIT0gJyciPgotCQkJPGRpdiBjbGFzcz0ic2VjdGlvbkhlYWRpbmciPgotCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbWFpbkRlc2NyaXB0aW9uVGV4dCIvPgotCQkJPC9kaXY+Ci0JCQk8ZGl2IGNsYXNzPSJzZWN0aW9uQ29udGVudCI+Ci0JCQkJPHRhYmxlIGNsYXNzPSJzZWN0aW9uVGFibGUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4KLQkJCQkJPHRyIHZhbGlnbj0idG9wIj4KLQkJCQkJCTx0ZCBjbGFzcz0ic2VjdGlvblRhYmxlU2luZ2xlQ2VsbCI+Ci0JCQkJCQkJPHhzbDp2YWx1ZS1vZiBkaXNhYmxlLW91dHB1dC1lc2NhcGluZz0ieWVzIiBzZWxlY3Q9IiRyZWZpbmVkRGVzY3JpcHRpb24iLz4KLQkJCQkJCTwvdGQ+Ci0JCQkJCTwvdHI+Ci0JCQkJPC90YWJsZT4KLQkJCTwvZGl2PgotCQk8L3hzbDppZj4KLQk8L3hzbDp0ZW1wbGF0ZT4JCi0KLTwveHNsOnN0eWxlc2hlZXQ+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQveHNsL2Rlc2NyaXB0b3JfaGVscGVyLnhzbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC94c2wvZGVzY3JpcHRvcl9oZWxwZXIueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZjM1NGIwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC94c2wvZGVzY3JpcHRvcl9oZWxwZXIueHNsCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotCi08eHNsOnN0eWxlc2hlZXQgdmVyc2lvbj0iMS4wIgotCXhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIgotCXhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiPgotCi0JPHhzbDp0ZW1wbGF0ZSBuYW1lPSJhZGREZXNjcmlwdG9ycyI+Ci0JCTx4c2w6cGFyYW0gbmFtZT0iZGVzY3JpcHRvcnMiLz4KLQkJPHhzbDpwYXJhbSBuYW1lPSJjb2xzcGFuIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0ic2hvd0Z1bGxNZXRob2RDb250ZW50IiBzZWxlY3Q9IkBTaG93RnVsbE1ldGhvZENvbnRlbnQiLz4JCQotCQk8eHNsOmlmIHRlc3Q9ImNvdW50KCRkZXNjcmlwdG9ycykgPiAwIj4KLQkJCTx0ciB2YWxpZ249InRvcCI+Ci0JCQkJPHRoIGNsYXNzPSJzZWN0aW9uVGFibGVIZWFkaW5nIiBzY29wZT0icm93Ij4KLQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9jZXNzVXNhZ2VUZXh0Ii8+CQkJCi0JCQkJPC90aD4KLQkJCQk8dGQgY2xhc3M9InNlY3Rpb25UYWJsZUNlbGwiPgotCQkJCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJjb2xzcGFuIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGNvbHNwYW4iLz48L3hzbDphdHRyaWJ1dGU+Ci0JCQkJCTx1bD4KLQkJCQkJCTx4c2w6Zm9yLWVhY2ggc2VsZWN0PSIkZGVzY3JpcHRvcnMiPgotCQkJCQkJPHhzbDpzb3J0IHNlbGVjdD0iRWxlbWVudFsxXS9ARGlzcGxheU5hbWUiLz4KLQkJCQkJCQk8bGk+Ci0JCQkJCQkJCTwhLS0gYWRkIHRoZSBwYXJlbnQgbGluayAtLT4KLQkJCQkJCQkJPHhzbDpmb3ItZWFjaCBzZWxlY3Q9IkVsZW1lbnQiPgotCQkJCQkJCQk8eHNsOnNvcnQgc2VsZWN0PSJARGlzcGxheU5hbWUiLz4KLQkJCQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWRkRWxlbWVudFdpdGhMaW5rIj4KLQkJCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudCIgc2VsZWN0PSIuIi8+Ci0JCQkJCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQkJCQkJJiMxNjA7Jmd0OyYjMTYwOwotCQkJCQkJCQk8L3hzbDpmb3ItZWFjaD4KLQkJCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFkZEVsZW1lbnRXaXRoTGluayI+Ci0JCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudCIgc2VsZWN0PSIuIi8+Ci0JCQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQkJCTx4c2w6dmFyaWFibGUgbmFtZT0iRW50cnlWYWx1ZSIgc2VsZWN0PSJhdHRyaWJ1dGUvQGFjdGl2aXR5RW50cnlTdGF0ZSIvPgotCQkJCQkJCQk8eHNsOnZhcmlhYmxlIG5hbWU9IkV4aXRWYWx1ZSIgc2VsZWN0PSJhdHRyaWJ1dGUvQGFjdGl2aXR5RXhpdFN0YXRlIi8+CQkJCQkJCQkJCQkJCQkJCSAKLQkJCQkJCQkJPHhzbDppZiB0ZXN0PSIkRW50cnlWYWx1ZSAhPSAnJyI+Ci0JCQkJCQkJCQlbPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRFbnRyeVZhbHVlIi8+XQkKLQkJCQkJCQkJPC94c2w6aWY+CQkJCQkJCQkKLQkJCQkJCQkJPHhzbDppZiB0ZXN0PSIkRXhpdFZhbHVlICE9ICcnIj4KLQkJCQkJCQkJCVs8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJEV4aXRWYWx1ZSIvPl0KLQkJCQkJCQkJPC94c2w6aWY+CQkJCQkJCQkJCQkJCQkJCQotCQkJCQkJCTwvbGk+Ci0JCQkJCQk8L3hzbDpmb3ItZWFjaD4KLQkJCQkJPC91bD4KLQkJCQk8L3RkPgotCQkJPC90cj4KLQkJPC94c2w6aWY+Ci0JPC94c2w6dGVtcGxhdGU+Ci0KLTwveHNsOnN0eWxlc2hlZXQ+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQveHNsL2VzY2FwZS54c2wgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQveHNsL2VzY2FwZS54c2wKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwY2ExNGQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L3hzbC9lc2NhcGUueHNsCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotCi08eHNsOnN0eWxlc2hlZXQgdmVyc2lvbj0iMS4wIgotCXhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIgotCXhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiPgotCi0JPHhzbDp0ZW1wbGF0ZSBuYW1lPSJlc2NhcGUiPgotCQk8eHNsOnBhcmFtIG5hbWU9InN0cmluZyIvPgotCQk8eHNsOnBhcmFtIG5hbWU9InNlYXJjaCIvPgotCQk8eHNsOnBhcmFtIG5hbWU9InJlcGxhY2UiLz4KLQkJPHhzbDpjaG9vc2U+Ci0JCQk8eHNsOndoZW4gdGVzdD0iY29udGFpbnMoJHN0cmluZywgJHNlYXJjaCkiPgotCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJjb25jYXQoc3Vic3RyaW5nLWJlZm9yZSgkc3RyaW5nLCAkc2VhcmNoKSwgJHJlcGxhY2UpIi8+Ci0JCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImVzY2FwZSI+Ci0JCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJzdHJpbmciIHNlbGVjdD0ic3Vic3RyaW5nLWFmdGVyKCRzdHJpbmcsICRzZWFyY2gpIi8+Ci0JCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJzZWFyY2giIHNlbGVjdD0iJHNlYXJjaCIvPgotCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0icmVwbGFjZSIgc2VsZWN0PSIkcmVwbGFjZSIvPgotCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQk8L3hzbDp3aGVuPgotCQkJPHhzbDpvdGhlcndpc2U+Ci0JCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRzdHJpbmciLz4KLQkJCTwveHNsOm90aGVyd2lzZT4KLQkJPC94c2w6Y2hvb3NlPgotCTwveHNsOnRlbXBsYXRlPgotCi08L3hzbDpzdHlsZXNoZWV0PgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L3hzbC9ndWlkYW5jZS54c2wgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQveHNsL2d1aWRhbmNlLnhzbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjgzYzA4OC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQveHNsL2d1aWRhbmNlLnhzbAorKysgL2Rldi9udWxsCkBAIC0xLDE4MSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci0KLTx4c2w6c3R5bGVzaGVldCB2ZXJzaW9uPSIxLjAiCi0JeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iCi0JeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSI+Ci0KLTx4c2w6b3V0cHV0IG1ldGhvZD0iaHRtbCIgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIAotCWRvY3R5cGUtcHVibGljPSItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgCi0JZG9jdHlwZS1zeXN0ZW09Imh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiIAotCWluZGVudD0ieWVzIi8+Ci0JCi0JPHhzbDppbmNsdWRlIGhyZWY9InJlc291cmNlcy54c2wiLz4KLQk8eHNsOmluY2x1ZGUgaHJlZj0iY29tbW9uLnhzbCIvPgotCTx4c2w6aW5jbHVkZSBocmVmPSJtYXBwaW5nLnhzbCIvPgotCTx4c2w6aW5jbHVkZSBocmVmPSJvdmVydmlldy54c2wiLz4KLQk8eHNsOmluY2x1ZGUgaHJlZj0ibWFpbl9kZXNjcmlwdGlvbi54c2wiLz4KLQk8eHNsOmluY2x1ZGUgaHJlZj0iZ3VpZGFuY2VfaGVscGVyLnhzbCIvPgotCi0JPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iL0VsZW1lbnQiPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImVsZW1lbnRUeXBlIiBzZWxlY3Q9IkBUeXBlIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iZWxlbWVudFR5cGVOYW1lIiBzZWxlY3Q9IkBUeXBlTmFtZSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImVsZW1lbnROYW1lIiBzZWxlY3Q9IkBOYW1lIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iZWxlbWVudFByZXNlbnRhdGlvbk5hbWUiIHNlbGVjdD0iQERpc3BsYXlOYW1lIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iYmFja1BhdGgiIHNlbGVjdD0iQEJhY2tQYXRoIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iaW1hZ2VQYXRoIiBzZWxlY3Q9ImNvbmNhdCgkYmFja1BhdGgsICdpbWFnZXMvJykiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJzaGFwZUltYWdlIiBzZWxlY3Q9ImNvbmNhdCgkYmFja1BhdGgsQFNoYXBlaWNvblVybCkiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJwcmVzZW50YXRpb24iIHNlbGVjdD0icmVmZXJlbmNlW0BuYW1lPSdwcmVzZW50YXRpb24nXSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImNvbnRlbnREZXNjcmlwdGlvbiIgc2VsZWN0PSIkcHJlc2VudGF0aW9uL0VsZW1lbnQiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJjb3B5cmlnaHQiIHNlbGVjdD0iY29weXJpZ2h0Ii8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0ic2hvd1RyZWVCcm93c2VyIiBzZWxlY3Q9IkBzaG93VHJlZUJyb3dzZXIiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJyZXNwb25zaWJsZVJvbGUiIHNlbGVjdD0icmVmZXJlbmNlW0BuYW1lPSdyZXNwb25zaWJsZVJvbGUnXS9FbGVtZW50W0BUeXBlPSdSb2xlJ10iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJ0b29sIiBzZWxlY3Q9InJlZmVyZW5jZVtAbmFtZT0ndG9vbCddL0VsZW1lbnRbQFR5cGU9J1Rvb2wnXSIvPgotCi0JCTxodG1sPgotCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0ibGFuZyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBsYW5nIi8+PC94c2w6YXR0cmlidXRlPgotCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0ieG1sOmxhbmciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbGFuZyIvPjwveHNsOmF0dHJpYnV0ZT4KLQkJCTxoZWFkPgotCQkJCTx0aXRsZT4KLQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50VHlwZU5hbWUiLz46IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudFByZXNlbnRhdGlvbk5hbWUiLz4KLQkJCQk8L3RpdGxlPgotCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJ1bWFNZXRhVGFncyI+Ci0JCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50VHlwZSIgc2VsZWN0PSIkZWxlbWVudFR5cGUiLz4KLQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnROYW1lIiBzZWxlY3Q9IiRlbGVtZW50TmFtZSIvPgotCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudFByZXNlbnRhdGlvbk5hbWUiIHNlbGVjdD0iJGVsZW1lbnRQcmVzZW50YXRpb25OYW1lIi8+Ci0JCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQk8bWV0YSBuYW1lPSJlbGVtZW50X3R5cGUiPgotCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0ibWFwcGluZyI+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudFR5cGUiIHNlbGVjdD0iJGVsZW1lbnRUeXBlIi8+Ci0JCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJPC9tZXRhPgotCQkJCTx4c2w6aWYgdGVzdD0iJGVsZW1lbnRUeXBlID0gJ1Rvb2xNZW50b3InIj4KLQkJCQkJPG1ldGEgbmFtZT0idG9vbCIgY29udGVudD0ieyR0b29sL0BEaXNwbGF5TmFtZX0iLz4KLQkJCQk8L3hzbDppZj4KLQkJCQk8bWV0YSBuYW1lPSJmaWxldHlwZSIgY29udGVudD0iZGVzY3JpcHRpb24iLz4KLQkJCQk8bWV0YSBuYW1lPSJyb2xlIj4KLQkJCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0iY29udGVudCI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRyZXNwb25zaWJsZVJvbGUvQERpc3BsYXlOYW1lIi8+PC94c2w6YXR0cmlidXRlPgotCQkJCTwvbWV0YT4KLQkJCQk8bGluayByZWw9IlN0eWxlU2hlZXQiIGhyZWY9InskYmFja1BhdGh9Y3NzL2RlZmF1bHQuY3NzIiB0eXBlPSJ0ZXh0L2NzcyIvPgotCQkJCTxzY3JpcHQgc3JjPSJ7JGJhY2tQYXRofXNjcmlwdHMvQ29udGVudFBhZ2VSZXNvdXJjZS5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PC9zY3JpcHQ+Ci0JCQkJPHNjcmlwdCBzcmM9InskYmFja1BhdGh9c2NyaXB0cy9Db250ZW50UGFnZVNlY3Rpb24uanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPjwvc2NyaXB0PgotCQkJCTxzY3JpcHQgc3JjPSJ7JGJhY2tQYXRofXNjcmlwdHMvQ29udGVudFBhZ2VTdWJTZWN0aW9uLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij48L3NjcmlwdD4KLQkJCQk8c2NyaXB0IHNyYz0ieyRiYWNrUGF0aH1zY3JpcHRzL0NvbnRlbnRQYWdlVG9vbGJhci5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PC9zY3JpcHQ+Ci0JCQkJPHNjcmlwdCBzcmM9InskYmFja1BhdGh9c2NyaXB0cy9jb250ZW50UGFnZS5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PC9zY3JpcHQ+Ci0JCQkJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij4KLQkJCQkJdmFyIGJhY2tQYXRoID0gJzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkYmFja1BhdGgiLz4nOwotCQkJCQl2YXIgaW1nUGF0aCA9ICc8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGltYWdlUGF0aCIvPic7Ci0JCQkJCXZhciBub2RlSW5mbz1udWxsOwotCQkJCQljb250ZW50UGFnZS5wcmVsb2FkKGltZ1BhdGgsIGJhY2tQYXRoLCBub2RlSW5mbywgICcnLCBmYWxzZSwgZmFsc2UsIGZhbHNlKTsKLQkJCQk8L3NjcmlwdD4KLQkJCTwvaGVhZD4KLQkJCTxib2R5PgotCQkJPGRpdiBpZD0iYnJlYWRjcnVtYnMiPjwvZGl2PgotCQkJCTx0YWJsZSBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgd2lkdGg9IjEwMCUiPgotCQkJCQk8dHI+Ci0JCQkJCQk8dGQgdmFsaWduPSJ0b3AiPgotCQkJCQkJCTxhIG5hbWU9IlRvcCIvPgotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJvdmVydmlldyI+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50VHlwZSIgc2VsZWN0PSIkZWxlbWVudFR5cGUiLz4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnRUeXBlTmFtZSIgc2VsZWN0PSIkZWxlbWVudFR5cGVOYW1lIi8+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50UHJlc2VudGF0aW9uTmFtZSIgc2VsZWN0PSIkZWxlbWVudFByZXNlbnRhdGlvbk5hbWUiLz4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnRJY29uIiBzZWxlY3Q9IiRzaGFwZUltYWdlIi8+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJiYWNrUGF0aCIgc2VsZWN0PSIkYmFja1BhdGgiLz4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9InNob3dUcmVlQnJvd3NlciIgc2VsZWN0PSIkc2hvd1RyZWVCcm93c2VyIi8+Ci0JCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icmVsYXRpb25zaGlwc1NlY3Rpb24iLz4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0ibWFpbkRlc2NyaXB0aW9uU2VjdGlvbiI+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJkZXNjcmlwdGlvbiIgc2VsZWN0PSIkY29udGVudERlc2NyaXB0aW9uIi8+Ci0JCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0ibW9yZUluZm9TZWN0aW9uIj4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9InJlZmVyZW5jZUxpc3QiIHNlbGVjdD0icmVmZXJlbmNlTGlzdCIvPgotCQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImNvcHlyaWdodCI+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJjb3B5cmlnaHQiIHNlbGVjdD0iJGNvcHlyaWdodCIvPgotCQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQk8L3RkPgotCQkJCQk8L3RyPgotCQkJCTwvdGFibGU+Ci0JCQk8L2JvZHk+Ci0JCQk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPgotCQkJCWNvbnRlbnRQYWdlLm9ubG9hZCgpOwotCQkJPC9zY3JpcHQ+Ci0JCTwvaHRtbD4KLQk8L3hzbDp0ZW1wbGF0ZT4KLQotCTx4c2w6dGVtcGxhdGUgbmFtZT0icmVsYXRpb25zaGlwc1NlY3Rpb24iPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImNvbnRlbnRFbGVtZW50cyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0W0BuYW1lPSdjb250ZW50RWxlbWVudHMnXS9FbGVtZW50Ii8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iY2F0ZWdvcmllcyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0W0BuYW1lPSdDb250ZW50RWxlbWVudF9DdXN0b21DYXRlZ29yaWVzJ10vRWxlbWVudCIvPgotCQk8eHNsOmlmIHRlc3Q9ImNvdW50KCRjb250ZW50RWxlbWVudHMpICsgY291bnQoJGNhdGVnb3JpZXMpID4gMCI+Ci0JCQk8ZGl2IGNsYXNzPSJzZWN0aW9uSGVhZGluZyI+Ci0JCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRyZWxhdGlvbnNoaXBzVGV4dCIvPgotCQkJPC9kaXY+Ci0JCQk8ZGl2IGNsYXNzPSJzZWN0aW9uQ29udGVudCI+Ci0JCQkJPHRhYmxlIGNsYXNzPSJzZWN0aW9uVGFibGUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4KLQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhZGRSZWZlcmVuY2VzIj4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9InJlZk5hbWUiIHNlbGVjdD0iJGNhdGVnb3JpZXNUZXh0Ii8+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJyZWZFbGVtZW50IiBzZWxlY3Q9IiRjYXRlZ29yaWVzIi8+Ci0JCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFkZFJlZmVyZW5jZXMiPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0icmVmTmFtZSIgc2VsZWN0PSIkcmVsYXRlZEVsZW1lbnRzVGV4dCIvPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0icmVmRWxlbWVudCIgc2VsZWN0PSIkY29udGVudEVsZW1lbnRzIi8+Ci0JCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCTwvdGFibGU+Ci0JCQk8L2Rpdj4KLQkJPC94c2w6aWY+Ci0JPC94c2w6dGVtcGxhdGU+Ci0KLQk8eHNsOnRlbXBsYXRlIG5hbWU9Im1vcmVJbmZvU2VjdGlvbiI+Ci0JCTwhLS0gdXNlIHRoZSBzcGVjaWZpYyBuYW1lZCBsaXN0LCAgb3RoZXJ3aXNlLCB0aGUgdmFyaWFiaWxpdHkgYmFzZSBlbGVtZW50IHdpbGwgYmUgaW5jbHVkZWQsIGJ1ZyAxNjM4ODUgLS0+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iY2hlY2tsaXN0cyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0W0BuYW1lID0nY2hlY2tsaXN0cyddL0VsZW1lbnRbQFR5cGU9J0NoZWNrbGlzdCddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iY29uY2VwdHMiIHNlbGVjdD0icmVmZXJlbmNlTGlzdFtAbmFtZSA9J2NvbmNlcHRzQW5kUGFwZXJzJ10vRWxlbWVudFtAVHlwZT0nQ29uY2VwdCddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iZ3VpZGVsaW5lcyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0W0BuYW1lID0nZ3VpZGVsaW5lcyddL0VsZW1lbnRbQFR5cGU9J0d1aWRlbGluZSddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0ic3VwcG9ydGluZ01hdGVyaWFscyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0W0BuYW1lID0nc3VwcG9ydGluZ01hdGVyaWFscyddL0VsZW1lbnQiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJ0b29sTWVudG9ycyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0W0BuYW1lICE9J2NvbnRlbnRFbGVtZW50cyddL0VsZW1lbnRbQFR5cGU9J1Rvb2xNZW50b3InXSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9IndoaXRlUGFwZXJzIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3RbQG5hbWUgPSdjb25jZXB0c0FuZFBhcGVycyddL0VsZW1lbnRbQFR5cGU9J1doaXRlcGFwZXInXSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImV4YW1wbGVzIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3RbQG5hbWUgPSdleGFtcGxlcyddL0VsZW1lbnRbQFR5cGU9J0V4YW1wbGUnXSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InJldXNhYmxlQXNzZXRzIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3RbQG5hbWUgPSdhc3NldHMnXS9FbGVtZW50W0BUeXBlPSdSZXVzYWJsZUFzc2V0J10iLz4KLQkJPHhzbDppZiB0ZXN0PSJjb3VudCgkY2hlY2tsaXN0cykgKyBjb3VudCgkY29uY2VwdHMpICsgY291bnQoJGd1aWRlbGluZXMpICsgY291bnQoJHN1cHBvcnRpbmdNYXRlcmlhbHMpICsgY291bnQoJHRvb2xNZW50b3JzKSArIGNvdW50KCR3aGl0ZVBhcGVycykgKyBjb3VudCgkcmV1c2FibGVBc3NldHMpICsgY291bnQoJGV4YW1wbGVzKSA+IDAiPgotCQkJPGRpdiBjbGFzcz0ic2VjdGlvbkhlYWRpbmciPgotCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbW9yZUluZm9UZXh0Ii8+Ci0JCQk8L2Rpdj4KLQkJCTxkaXYgY2xhc3M9InNlY3Rpb25Db250ZW50Ij4KLQkJCQk8dGFibGUgY2xhc3M9InNlY3Rpb25UYWJsZSIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiPgotCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWRkQ2hlY2tsaXN0cyI+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iY2hlY2tsaXN0cyIgc2VsZWN0PSIkY2hlY2tsaXN0cyIvPgotCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWRkQ29uY2VwdHMiPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImNvbmNlcHRzIiBzZWxlY3Q9IiRjb25jZXB0cyIvPgotCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWRkRXhhbXBsZXMiPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImV4YW1wbGVzIiBzZWxlY3Q9IiRleGFtcGxlcyIvPgotCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWRkR3VpZGVsaW5lcyI+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZ3VpZGVsaW5lcyIgc2VsZWN0PSIkZ3VpZGVsaW5lcyIvPgotCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWRkUmV1c2FibGVBc3NldHMiPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9InJldXNhYmxlQXNzZXRzIiBzZWxlY3Q9IiRyZXVzYWJsZUFzc2V0cyIvPgotCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWRkU3VwcG9ydGluZ01hdGVyaWFscyI+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0ic3VwcG9ydGluZ01hdGVyaWFscyIgc2VsZWN0PSIkc3VwcG9ydGluZ01hdGVyaWFscyIvPgotCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWRkVG9vbE1lbnRvcnMiPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9InRvb2xNZW50b3JzIiBzZWxlY3Q9IiR0b29sTWVudG9ycyIvPgotCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWRkV2hpdGVQYXBlcnMiPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9IndoaXRlUGFwZXJzIiBzZWxlY3Q9IiR3aGl0ZVBhcGVycyIvPgotCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCTwvdGFibGU+Ci0JCQk8L2Rpdj4KLQkJPC94c2w6aWY+Ci0JPC94c2w6dGVtcGxhdGU+Ci0KLTwveHNsOnN0eWxlc2hlZXQ+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQveHNsL2d1aWRhbmNlX2hlbHBlci54c2wgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQveHNsL2d1aWRhbmNlX2hlbHBlci54c2wKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwNjM5NDguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L3hzbC9ndWlkYW5jZV9oZWxwZXIueHNsCisrKyAvZGV2L251bGwKQEAgLTEsMjkxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLQotPHhzbDpzdHlsZXNoZWV0IHZlcnNpb249IjEuMCIKLQl4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIKLQl4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIj4KLQotCTx4c2w6dGVtcGxhdGUgbmFtZT0iYWRkQ2hlY2tsaXN0cyI+Ci0JCTx4c2w6cGFyYW0gbmFtZT0iY2hlY2tsaXN0cyIvPgotCQk8eHNsOmlmIHRlc3Q9ImNvdW50KCRjaGVja2xpc3RzKSA+IDAiPgotCQkJPHRyIHZhbGlnbj0idG9wIj4KLQkJCQk8dGggY2xhc3M9InNlY3Rpb25UYWJsZUhlYWRpbmciIHNjb3BlPSJyb3ciPgotCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGNoZWNrbGlzdHNUZXh0Ii8+Ci0JCQkJPC90aD4KLQkJCQk8dGQgY2xhc3M9InNlY3Rpb25UYWJsZUNlbGwiPgotCQkJCQk8dWw+Ci0JCQkJCQk8eHNsOmZvci1lYWNoIHNlbGVjdD0iJGNoZWNrbGlzdHMiPgotCQkJCQkJPHhzbDpzb3J0IHNlbGVjdD0iQERpc3BsYXlOYW1lIi8+Ci0JCQkJCQkJPGxpPgotCQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWRkRWxlbWVudFdpdGhMaW5rIj4KLQkJCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50IiBzZWxlY3Q9Ii4iLz4KLQkJCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCQk8L2xpPgotCQkJCQkJPC94c2w6Zm9yLWVhY2g+Ci0JCQkJCTwvdWw+Ci0JCQkJPC90ZD4KLQkJCTwvdHI+Ci0JCTwveHNsOmlmPgotCTwveHNsOnRlbXBsYXRlPgotCi0JPHhzbDp0ZW1wbGF0ZSBuYW1lPSJhZGRDb25jZXB0cyI+Ci0JCTx4c2w6cGFyYW0gbmFtZT0iY29uY2VwdHMiLz4KLQkJPHhzbDppZiB0ZXN0PSJjb3VudCgkY29uY2VwdHMpID4gMCI+Ci0JCQk8dHIgdmFsaWduPSJ0b3AiPgotCQkJCTx0aCBjbGFzcz0ic2VjdGlvblRhYmxlSGVhZGluZyIgc2NvcGU9InJvdyI+Ci0JCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkY29uY2VwdHNUZXh0Ii8+Ci0JCQkJPC90aD4KLQkJCQk8dGQgY2xhc3M9InNlY3Rpb25UYWJsZUNlbGwiPgotCQkJCQk8dWw+Ci0JCQkJCQk8eHNsOmZvci1lYWNoIHNlbGVjdD0iJGNvbmNlcHRzIj4KLQkJCQkJCTx4c2w6c29ydCBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPgotCQkJCQkJCTxsaT4KLQkJCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFkZEVsZW1lbnRXaXRoTGluayI+Ci0JCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudCIgc2VsZWN0PSIuIi8+Ci0JCQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQkJPC9saT4KLQkJCQkJCTwveHNsOmZvci1lYWNoPgotCQkJCQk8L3VsPgotCQkJCTwvdGQ+Ci0JCQk8L3RyPgotCQk8L3hzbDppZj4KLQk8L3hzbDp0ZW1wbGF0ZT4KLQotCTx4c2w6dGVtcGxhdGUgbmFtZT0iYWRkRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIj4KLQkJPHhzbDpwYXJhbSBuYW1lPSJlc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMiLz4KLQkJPHhzbDppZiB0ZXN0PSJjb3VudCgkZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKSA+IDAiPgotCQkJPHRyIHZhbGlnbj0idG9wIj4KLQkJCQk8dGggY2xhc3M9InNlY3Rpb25UYWJsZUhlYWRpbmciIHNjb3BlPSJyb3ciPgotCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVzdGltYXRpb25Db25zaWRlcmF0aW9uc1RleHQiLz4KLQkJCQk8L3RoPgotCQkJCTx0ZCBjbGFzcz0ic2VjdGlvblRhYmxlQ2VsbCI+Ci0JCQkJCTx1bD4KLQkJCQkJCTx4c2w6Zm9yLWVhY2ggc2VsZWN0PSIkZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIj4KLQkJCQkJCTx4c2w6c29ydCBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPgotCQkJCQkJCTxsaT4KLQkJCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFkZEVsZW1lbnRXaXRoTGluayI+Ci0JCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudCIgc2VsZWN0PSIuIi8+Ci0JCQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQkJPC9saT4KLQkJCQkJCTwveHNsOmZvci1lYWNoPgotCQkJCQk8L3VsPgotCQkJCTwvdGQ+Ci0JCQk8L3RyPgotCQk8L3hzbDppZj4KLQk8L3hzbDp0ZW1wbGF0ZT4KLQotCTx4c2w6dGVtcGxhdGUgbmFtZT0iYWRkRXhhbXBsZXMiPgotCQk8eHNsOnBhcmFtIG5hbWU9ImV4YW1wbGVzIi8+Ci0JCTx4c2w6aWYgdGVzdD0iY291bnQoJGV4YW1wbGVzKSA+IDAiPgotCQkJPHRyIHZhbGlnbj0idG9wIj4KLQkJCQk8dGggY2xhc3M9InNlY3Rpb25UYWJsZUhlYWRpbmciIHNjb3BlPSJyb3ciPgotCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGV4YW1wbGVzVGV4dCIvPgotCQkJCTwvdGg+Ci0JCQkJPHRkIGNsYXNzPSJzZWN0aW9uVGFibGVDZWxsIj4KLQkJCQkJPHVsPgotCQkJCQkJPHhzbDpmb3ItZWFjaCBzZWxlY3Q9IiRleGFtcGxlcyI+Ci0JCQkJCQk8eHNsOnNvcnQgc2VsZWN0PSJARGlzcGxheU5hbWUiLz4KLQkJCQkJCQk8bGk+Ci0JCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhZGRFbGVtZW50V2l0aExpbmsiPgotCQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnQiIHNlbGVjdD0iLiIvPgotCQkJCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQkJCTwvbGk+Ci0JCQkJCQk8L3hzbDpmb3ItZWFjaD4KLQkJCQkJPC91bD4KLQkJCQk8L3RkPgotCQkJPC90cj4KLQkJPC94c2w6aWY+Ci0JPC94c2w6dGVtcGxhdGU+Ci0KLQk8eHNsOnRlbXBsYXRlIG5hbWU9ImFkZEd1aWRlbGluZXMiPgotCQk8eHNsOnBhcmFtIG5hbWU9Imd1aWRlbGluZXMiLz4KLQkJPHhzbDppZiB0ZXN0PSJjb3VudCgkZ3VpZGVsaW5lcykgPiAwIj4KLQkJCTx0ciB2YWxpZ249InRvcCI+Ci0JCQkJPHRoIGNsYXNzPSJzZWN0aW9uVGFibGVIZWFkaW5nIiBzY29wZT0icm93Ij4KLQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRndWlkZWxpbmVzVGV4dCIvPgotCQkJCTwvdGg+Ci0JCQkJPHRkIGNsYXNzPSJzZWN0aW9uVGFibGVDZWxsIj4KLQkJCQkJPHVsPgotCQkJCQkJPHhzbDpmb3ItZWFjaCBzZWxlY3Q9IiRndWlkZWxpbmVzIj4KLQkJCQkJCTx4c2w6c29ydCBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPgotCQkJCQkJCTxsaT4KLQkJCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFkZEVsZW1lbnRXaXRoTGluayI+Ci0JCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudCIgc2VsZWN0PSIuIi8+Ci0JCQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQkJPC9saT4KLQkJCQkJCTwveHNsOmZvci1lYWNoPgotCQkJCQk8L3VsPgotCQkJCTwvdGQ+Ci0JCQk8L3RyPgotCQk8L3hzbDppZj4KLQk8L3hzbDp0ZW1wbGF0ZT4KLQotCTx4c2w6dGVtcGxhdGUgbmFtZT0iYWRkUmVwb3J0cyI+Ci0JCTx4c2w6cGFyYW0gbmFtZT0icmVwb3J0cyIvPgotCQk8eHNsOmlmIHRlc3Q9ImNvdW50KCRyZXBvcnRzKSA+IDAiPgotCQkJPHRyIHZhbGlnbj0idG9wIj4KLQkJCQk8dGggY2xhc3M9InNlY3Rpb25UYWJsZUhlYWRpbmciIHNjb3BlPSJyb3ciPgotCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHJlcG9ydHNUZXh0Ii8+Ci0JCQkJPC90aD4KLQkJCQk8dGQgY2xhc3M9InNlY3Rpb25UYWJsZUNlbGwiPgotCQkJCQk8dWw+Ci0JCQkJCQk8eHNsOmZvci1lYWNoIHNlbGVjdD0iJHJlcG9ydHMiPgotCQkJCQkJPHhzbDpzb3J0IHNlbGVjdD0iQERpc3BsYXlOYW1lIi8+Ci0JCQkJCQkJPGxpPgotCQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWRkRWxlbWVudFdpdGhMaW5rIj4KLQkJCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50IiBzZWxlY3Q9Ii4iLz4KLQkJCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCQk8L2xpPgotCQkJCQkJPC94c2w6Zm9yLWVhY2g+Ci0JCQkJCTwvdWw+Ci0JCQkJPC90ZD4KLQkJCTwvdHI+Ci0JCTwveHNsOmlmPgotCTwveHNsOnRlbXBsYXRlPgotCi0JPHhzbDp0ZW1wbGF0ZSBuYW1lPSJhZGRSZXVzYWJsZUFzc2V0cyI+Ci0JCTx4c2w6cGFyYW0gbmFtZT0icmV1c2FibGVBc3NldHMiLz4KLQkJPHhzbDppZiB0ZXN0PSJjb3VudCgkcmV1c2FibGVBc3NldHMpID4gMCI+Ci0JCQk8dHIgdmFsaWduPSJ0b3AiPgotCQkJCTx0aCBjbGFzcz0ic2VjdGlvblRhYmxlSGVhZGluZyIgc2NvcGU9InJvdyI+Ci0JCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcmV1c2FibGVBc3NldHNUZXh0Ii8+Ci0JCQkJPC90aD4KLQkJCQk8dGQgY2xhc3M9InNlY3Rpb25UYWJsZUNlbGwiPgotCQkJCQk8dWw+Ci0JCQkJCQk8eHNsOmZvci1lYWNoIHNlbGVjdD0iJHJldXNhYmxlQXNzZXRzIj4KLQkJCQkJCTx4c2w6c29ydCBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPgotCQkJCQkJCTxsaT4KLQkJCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFkZEVsZW1lbnRXaXRoTGluayI+Ci0JCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudCIgc2VsZWN0PSIuIi8+Ci0JCQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQkJPC9saT4KLQkJCQkJCTwveHNsOmZvci1lYWNoPgotCQkJCQk8L3VsPgotCQkJCTwvdGQ+Ci0JCQk8L3RyPgotCQk8L3hzbDppZj4KLQk8L3hzbDp0ZW1wbGF0ZT4KLQotCTx4c2w6dGVtcGxhdGUgbmFtZT0iYWRkU3VwcG9ydGluZ01hdGVyaWFscyI+Ci0JCTx4c2w6cGFyYW0gbmFtZT0ic3VwcG9ydGluZ01hdGVyaWFscyIvPgotCQk8eHNsOmlmIHRlc3Q9ImNvdW50KCRzdXBwb3J0aW5nTWF0ZXJpYWxzKSA+IDAiPgotCQkJPHRyIHZhbGlnbj0idG9wIj4KLQkJCQk8dGggY2xhc3M9InNlY3Rpb25UYWJsZUhlYWRpbmciIHNjb3BlPSJyb3ciPgotCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHN1cHBvcnRpbmdNYXRlcmlhbHNUZXh0Ii8+Ci0JCQkJPC90aD4KLQkJCQk8dGQgY2xhc3M9InNlY3Rpb25UYWJsZUNlbGwiPgotCQkJCQk8dWw+Ci0JCQkJCQk8eHNsOmZvci1lYWNoIHNlbGVjdD0iJHN1cHBvcnRpbmdNYXRlcmlhbHMiPgotCQkJCQkJPHhzbDpzb3J0IHNlbGVjdD0iQERpc3BsYXlOYW1lIi8+Ci0JCQkJCQkJPGxpPgotCQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWRkRWxlbWVudFdpdGhMaW5rIj4KLQkJCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50IiBzZWxlY3Q9Ii4iLz4KLQkJCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCQk8L2xpPgotCQkJCQkJPC94c2w6Zm9yLWVhY2g+Ci0JCQkJCTwvdWw+Ci0JCQkJPC90ZD4KLQkJCTwvdHI+Ci0JCTwveHNsOmlmPgotCTwveHNsOnRlbXBsYXRlPgotCi0JPHhzbDp0ZW1wbGF0ZSBuYW1lPSJhZGRUZWNobmlxdWVzIj4KLQkJPHhzbDpwYXJhbSBuYW1lPSJ0ZWNobmlxdWVzIi8+Ci0JCTx4c2w6aWYgdGVzdD0iY291bnQoJHRlY2huaXF1ZXMpID4gMCI+Ci0JCQk8dHIgdmFsaWduPSJ0b3AiPgotCQkJCTx0aCBjbGFzcz0ic2VjdGlvblRhYmxlSGVhZGluZyIgc2NvcGU9InJvdyI+Ci0JCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdGVjaG5pcXVlc1RleHQiLz4KLQkJCQk8L3RoPgotCQkJCTx0ZCBjbGFzcz0ic2VjdGlvblRhYmxlQ2VsbCI+Ci0JCQkJCTx1bD4KLQkJCQkJCTx4c2w6Zm9yLWVhY2ggc2VsZWN0PSIkdGVjaG5pcXVlcyI+Ci0JCQkJCQk8eHNsOnNvcnQgc2VsZWN0PSJARGlzcGxheU5hbWUiLz4KLQkJCQkJCQk8bGk+Ci0JCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhZGRFbGVtZW50V2l0aExpbmsiPgotCQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnQiIHNlbGVjdD0iLiIvPgotCQkJCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQkJCTwvbGk+Ci0JCQkJCQk8L3hzbDpmb3ItZWFjaD4KLQkJCQkJPC91bD4KLQkJCQk8L3RkPgotCQkJPC90cj4KLQkJPC94c2w6aWY+Ci0JPC94c2w6dGVtcGxhdGU+Ci0KLQk8eHNsOnRlbXBsYXRlIG5hbWU9ImFkZFRlbXBsYXRlcyI+Ci0JCTx4c2w6cGFyYW0gbmFtZT0idGVtcGxhdGVzIi8+Ci0JCTx4c2w6aWYgdGVzdD0iY291bnQoJHRlbXBsYXRlcykgPiAwIj4KLQkJCTx0ciB2YWxpZ249InRvcCI+Ci0JCQkJPHRoIGNsYXNzPSJzZWN0aW9uVGFibGVIZWFkaW5nIiBzY29wZT0icm93Ij4KLQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR0ZW1wbGF0ZXNUZXh0Ii8+Ci0JCQkJPC90aD4KLQkJCQk8dGQgY2xhc3M9InNlY3Rpb25UYWJsZUNlbGwiPgotCQkJCQk8dWw+Ci0JCQkJCQk8eHNsOmZvci1lYWNoIHNlbGVjdD0iJHRlbXBsYXRlcyI+Ci0JCQkJCQk8eHNsOnNvcnQgc2VsZWN0PSJARGlzcGxheU5hbWUiLz4KLQkJCQkJCQk8bGk+Ci0JCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhZGRFbGVtZW50V2l0aExpbmsiPgotCQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnQiIHNlbGVjdD0iLiIvPgotCQkJCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQkJCTwvbGk+Ci0JCQkJCQk8L3hzbDpmb3ItZWFjaD4KLQkJCQkJPC91bD4KLQkJCQk8L3RkPgotCQkJPC90cj4KLQkJPC94c2w6aWY+Ci0JPC94c2w6dGVtcGxhdGU+Ci0KLQk8eHNsOnRlbXBsYXRlIG5hbWU9ImFkZFdoaXRlUGFwZXJzIj4KLQkJPHhzbDpwYXJhbSBuYW1lPSJ3aGl0ZVBhcGVycyIvPgotCQk8eHNsOmlmIHRlc3Q9ImNvdW50KCR3aGl0ZVBhcGVycykgPiAwIj4KLQkJCTx0ciB2YWxpZ249InRvcCI+Ci0JCQkJPHRoIGNsYXNzPSJzZWN0aW9uVGFibGVIZWFkaW5nIiBzY29wZT0icm93Ij4KLQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR3aGl0ZXBhcGVyc1RleHQiLz4KLQkJCQk8L3RoPgotCQkJCTx0ZCBjbGFzcz0ic2VjdGlvblRhYmxlQ2VsbCI+Ci0JCQkJCTx1bD4KLQkJCQkJCTx4c2w6Zm9yLWVhY2ggc2VsZWN0PSIkd2hpdGVQYXBlcnMiPgotCQkJCQkJPHhzbDpzb3J0IHNlbGVjdD0iQERpc3BsYXlOYW1lIi8+Ci0JCQkJCQkJPGxpPgotCQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWRkRWxlbWVudFdpdGhMaW5rIj4KLQkJCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50IiBzZWxlY3Q9Ii4iLz4KLQkJCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCQk8L2xpPgotCQkJCQkJPC94c2w6Zm9yLWVhY2g+Ci0JCQkJCTwvdWw+Ci0JCQkJPC90ZD4KLQkJCTwvdHI+Ci0JCTwveHNsOmlmPgotCTwveHNsOnRlbXBsYXRlPgotCi0JPHhzbDp0ZW1wbGF0ZSBuYW1lPSJhZGRUb29sTWVudG9ycyI+Ci0JCTx4c2w6cGFyYW0gbmFtZT0idG9vbE1lbnRvcnMiLz4KLQkJPHhzbDppZiB0ZXN0PSJjb3VudCgkdG9vbE1lbnRvcnMpID4gMCI+Ci0JCQk8dHIgdmFsaWduPSJ0b3AiPgotCQkJCTx0aCBjbGFzcz0ic2VjdGlvblRhYmxlSGVhZGluZyIgc2NvcGU9InJvdyI+Ci0JCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdG9vbE1lbnRvcnNUZXh0Ii8+Ci0JCQkJPC90aD4KLQkJCQk8dGQgY2xhc3M9InNlY3Rpb25UYWJsZUNlbGwiPgotCQkJCQk8dWw+Ci0JCQkJCQk8eHNsOmZvci1lYWNoIHNlbGVjdD0iJHRvb2xNZW50b3JzIj4KLQkJCQkJCQk8bGk+Ci0JCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhZGRFbGVtZW50V2l0aExpbmsiPgotCQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnQiIHNlbGVjdD0iLiIvPgotCQkJCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQkJCTwvbGk+Ci0JCQkJCQk8L3hzbDpmb3ItZWFjaD4KLQkJCQkJPC91bD4KLQkJCQk8L3RkPgotCQkJPC90cj4KLQkJPC94c2w6aWY+Ci0JPC94c2w6dGVtcGxhdGU+Ci0KLTwveHNsOnN0eWxlc2hlZXQ+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQveHNsL2d1aWRhbmNlX3dpdGhfYXR0YWNobWVudC54c2wgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQveHNsL2d1aWRhbmNlX3dpdGhfYXR0YWNobWVudC54c2wKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4MDk5NzQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L3hzbC9ndWlkYW5jZV93aXRoX2F0dGFjaG1lbnQueHNsCisrKyAvZGV2L251bGwKQEAgLTEsMjMyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLQotPHhzbDpzdHlsZXNoZWV0IHZlcnNpb249IjEuMCIKLQl4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIKLQl4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIj4KLQotPHhzbDpvdXRwdXQgbWV0aG9kPSJodG1sIiB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgCi0JZG9jdHlwZS1wdWJsaWM9Ii0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAKLQlkb2N0eXBlLXN5c3RlbT0iaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCIgCi0JaW5kZW50PSJ5ZXMiLz4KLQkKLQk8eHNsOmluY2x1ZGUgaHJlZj0icmVzb3VyY2VzLnhzbCIvPgotCTx4c2w6aW5jbHVkZSBocmVmPSJjb21tb24ueHNsIi8+Ci0JPHhzbDppbmNsdWRlIGhyZWY9Im1hcHBpbmcueHNsIi8+CQotCTx4c2w6aW5jbHVkZSBocmVmPSJvdmVydmlldy54c2wiLz4KLQk8eHNsOmluY2x1ZGUgaHJlZj0iZ3VpZGFuY2VfaGVscGVyLnhzbCIvPgotCTx4c2w6aW5jbHVkZSBocmVmPSJlc2NhcGUueHNsIi8+CQotCi0JPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iL0VsZW1lbnQiPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImVsZW1lbnRUeXBlIiBzZWxlY3Q9IkBUeXBlIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iZWxlbWVudFR5cGVOYW1lIiBzZWxlY3Q9IkBUeXBlTmFtZSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImVsZW1lbnROYW1lIiBzZWxlY3Q9IkBOYW1lIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iZWxlbWVudFByZXNlbnRhdGlvbk5hbWUiIHNlbGVjdD0iQERpc3BsYXlOYW1lIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iYmFja1BhdGgiIHNlbGVjdD0iQEJhY2tQYXRoIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iaW1hZ2VQYXRoIiBzZWxlY3Q9ImNvbmNhdCgkYmFja1BhdGgsICdpbWFnZXMvJykiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJzaGFwZUltYWdlIiBzZWxlY3Q9ImNvbmNhdCgkYmFja1BhdGgsQFNoYXBlaWNvblVybCkiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJwcmVzZW50YXRpb24iIHNlbGVjdD0icmVmZXJlbmNlW0BuYW1lPSdwcmVzZW50YXRpb24nXSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImNvbnRlbnREZXNjcmlwdGlvbiIgc2VsZWN0PSIkcHJlc2VudGF0aW9uL0VsZW1lbnQiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJjb3B5cmlnaHQiIHNlbGVjdD0iY29weXJpZ2h0Ii8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0ic2hvd1RyZWVCcm93c2VyIiBzZWxlY3Q9IkBzaG93VHJlZUJyb3dzZXIiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJyZXNwb25zaWJsZVJvbGUiIHNlbGVjdD0icmVmZXJlbmNlW0BuYW1lPSdyZXNwb25zaWJsZVJvbGUnXS9FbGVtZW50W0BUeXBlPSdSb2xlJ10iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJ0b29sIiBzZWxlY3Q9InJlZmVyZW5jZVtAbmFtZT0ndG9vbCddL0VsZW1lbnRbQFR5cGU9J1Rvb2wnXSIvPgotCi0JCTxodG1sPgotCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0ibGFuZyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBsYW5nIi8+PC94c2w6YXR0cmlidXRlPgotCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0ieG1sOmxhbmciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbGFuZyIvPjwveHNsOmF0dHJpYnV0ZT4KLQkJCTxoZWFkPgotCQkJCTx0aXRsZT4KLQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50VHlwZU5hbWUiLz46IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudFByZXNlbnRhdGlvbk5hbWUiLz4KLQkJCQk8L3RpdGxlPgotCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJ1bWFNZXRhVGFncyI+Ci0JCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50VHlwZSIgc2VsZWN0PSIkZWxlbWVudFR5cGUiLz4KLQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnROYW1lIiBzZWxlY3Q9IiRlbGVtZW50TmFtZSIvPgotCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudFByZXNlbnRhdGlvbk5hbWUiIHNlbGVjdD0iJGVsZW1lbnRQcmVzZW50YXRpb25OYW1lIi8+Ci0JCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQk8bWV0YSBuYW1lPSJlbGVtZW50X3R5cGUiPgotCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0ibWFwcGluZyI+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudFR5cGUiIHNlbGVjdD0iJGVsZW1lbnRUeXBlIi8+Ci0JCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJPC9tZXRhPgotCQkJCTx4c2w6aWYgdGVzdD0iJGVsZW1lbnRUeXBlID0gJ1Rvb2xNZW50b3InIj4KLQkJCQkJPG1ldGEgbmFtZT0idG9vbCIgY29udGVudD0ieyR0b29sL0BEaXNwbGF5TmFtZX0iLz4KLQkJCQk8L3hzbDppZj4KLQkJCQk8bWV0YSBuYW1lPSJmaWxldHlwZSIgY29udGVudD0iZGVzY3JpcHRpb24iLz4KLQkJCQk8bWV0YSBuYW1lPSJyb2xlIj4KLQkJCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0iY29udGVudCI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRyZXNwb25zaWJsZVJvbGUvQERpc3BsYXlOYW1lIi8+PC94c2w6YXR0cmlidXRlPgotCQkJCTwvbWV0YT4KLQkJCQk8bGluayByZWw9IlN0eWxlU2hlZXQiIGhyZWY9InskYmFja1BhdGh9Y3NzL2RlZmF1bHQuY3NzIiB0eXBlPSJ0ZXh0L2NzcyIvPgotCQkJCTxzY3JpcHQgc3JjPSJ7JGJhY2tQYXRofXNjcmlwdHMvQ29udGVudFBhZ2VSZXNvdXJjZS5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PC9zY3JpcHQ+Ci0JCQkJPHNjcmlwdCBzcmM9InskYmFja1BhdGh9c2NyaXB0cy9Db250ZW50UGFnZVNlY3Rpb24uanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPjwvc2NyaXB0PgotCQkJCTxzY3JpcHQgc3JjPSJ7JGJhY2tQYXRofXNjcmlwdHMvQ29udGVudFBhZ2VTdWJTZWN0aW9uLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij48L3NjcmlwdD4KLQkJCQk8c2NyaXB0IHNyYz0ieyRiYWNrUGF0aH1zY3JpcHRzL0NvbnRlbnRQYWdlVG9vbGJhci5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PC9zY3JpcHQ+Ci0JCQkJPHNjcmlwdCBzcmM9InskYmFja1BhdGh9c2NyaXB0cy9jb250ZW50UGFnZS5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PC9zY3JpcHQ+Ci0JCQkJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij4KLQkJCQkJdmFyIGJhY2tQYXRoID0gJzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkYmFja1BhdGgiLz4nOwotCQkJCQl2YXIgaW1nUGF0aCA9ICc8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGltYWdlUGF0aCIvPic7Ci0JCQkJCXZhciBub2RlSW5mbz1udWxsOwotCQkJCQljb250ZW50UGFnZS5wcmVsb2FkKGltZ1BhdGgsIGJhY2tQYXRoLCBub2RlSW5mbywgICcnLCBmYWxzZSwgZmFsc2UsIGZhbHNlKTsKLQkJCQk8L3NjcmlwdD4KLQkJCTwvaGVhZD4KLQkJCTxib2R5PgotCQkJPGRpdiBpZD0iYnJlYWRjcnVtYnMiPjwvZGl2PgotCQkJCTx0YWJsZSBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgd2lkdGg9IjEwMCUiPgotCQkJCQk8dHI+Ci0JCQkJCQk8dGQgdmFsaWduPSJ0b3AiPgotCQkJCQkJCTxhIG5hbWU9IlRvcCIvPgotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJvdmVydmlldyI+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50VHlwZSIgc2VsZWN0PSIkZWxlbWVudFR5cGUiLz4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnRUeXBlTmFtZSIgc2VsZWN0PSIkZWxlbWVudFR5cGVOYW1lIi8+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50UHJlc2VudGF0aW9uTmFtZSIgc2VsZWN0PSIkZWxlbWVudFByZXNlbnRhdGlvbk5hbWUiLz4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnRJY29uIiBzZWxlY3Q9IiRzaGFwZUltYWdlIi8+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJiYWNrUGF0aCIgc2VsZWN0PSIkYmFja1BhdGgiLz4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9InNob3dUcmVlQnJvd3NlciIgc2VsZWN0PSIkc2hvd1RyZWVCcm93c2VyIi8+Ci0JCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icmVsYXRpb25zaGlwc1NlY3Rpb24iLz4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iZGVzY3JpcHRpb25TZWN0aW9uIj4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImRlc2NyaXB0aW9uIiBzZWxlY3Q9IiRjb250ZW50RGVzY3JpcHRpb24iLz4KLQkJCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJtb3JlSW5mb1NlY3Rpb24iPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0icmVmZXJlbmNlTGlzdCIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0Ii8+Ci0JCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iY29weXJpZ2h0Ij4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImNvcHlyaWdodCIgc2VsZWN0PSIkY29weXJpZ2h0Ii8+Ci0JCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCTwvdGQ+Ci0JCQkJCTwvdHI+Ci0JCQkJPC90YWJsZT4KLQkJCTwvYm9keT4KLQkJCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+Ci0JCQkJY29udGVudFBhZ2Uub25sb2FkKCk7Ci0JCQk8L3NjcmlwdD4KLQkJPC9odG1sPgotCTwveHNsOnRlbXBsYXRlPgotCi0JPHhzbDp0ZW1wbGF0ZSBuYW1lPSJyZWxhdGlvbnNoaXBzU2VjdGlvbiI+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iY29udGVudEVsZW1lbnRzIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3RbQG5hbWU9J2NvbnRlbnRFbGVtZW50cyddL0VsZW1lbnQiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJjYXRlZ29yaWVzIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3RbQG5hbWU9J0NvbnRlbnRFbGVtZW50X0N1c3RvbUNhdGVnb3JpZXMnXS9FbGVtZW50Ii8+Ci0JCTx4c2w6aWYgdGVzdD0iY291bnQoJGNvbnRlbnRFbGVtZW50cykgPiAwIj4KLQkJCTxkaXYgY2xhc3M9InNlY3Rpb25IZWFkaW5nIj4KLQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHJlbGF0aW9uc2hpcHNUZXh0Ii8+Ci0JCQk8L2Rpdj4KLQkJCTxkaXYgY2xhc3M9InNlY3Rpb25Db250ZW50Ij4KLQkJCQk8dGFibGUgY2xhc3M9InNlY3Rpb25UYWJsZSIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiPgotCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWRkUmVmZXJlbmNlcyI+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0icmVmTmFtZSIgc2VsZWN0PSIkY2F0ZWdvcmllc1RleHQiLz4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJyZWZFbGVtZW50IiBzZWxlY3Q9IiRjYXRlZ29yaWVzIi8+Ci0JCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCTx0ciB2YWxpZ249InRvcCI+Ci0JCQkJCQk8dGggY2xhc3M9InNlY3Rpb25UYWJsZUhlYWRpbmciIHNjb3BlPSJyb3ciPgotCQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcmVsYXRlZEVsZW1lbnRzVGV4dCIvPgotCQkJCQkJPC90aD4KLQkJCQkJCTx0ZCBjbGFzcz0ic2VjdGlvblRhYmxlQ2VsbCI+Ci0JCQkJCQkJPHVsPgotCQkJCQkJCQk8eHNsOmZvci1lYWNoIHNlbGVjdD0iJGNvbnRlbnRFbGVtZW50cyI+Ci0JCQkJCQkJCTx4c2w6c29ydCBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPgotCQkJCQkJCQkJPGxpPgotCQkJCQkJCQkJCTxhPgotCQkJCQkJCQkJCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJocmVmIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iL0VsZW1lbnQvQEJhY2tQYXRoIi8+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBVcmwiLz48L3hzbDphdHRyaWJ1dGU+Ci0JCQkJCQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJARGlzcGxheU5hbWUiLz4KLQkJCQkJCQkJCQk8L2E+Ci0JCQkJCQkJCQk8L2xpPgotCQkJCQkJCQk8L3hzbDpmb3ItZWFjaD4KLQkJCQkJCQk8L3VsPgotCQkJCQkJPC90ZD4KLQkJCQkJPC90cj4KLQkJCQk8L3RhYmxlPgotCQkJPC9kaXY+Ci0JCTwveHNsOmlmPgotCTwveHNsOnRlbXBsYXRlPgotCi0JPHhzbDp0ZW1wbGF0ZSBuYW1lPSJkZXNjcmlwdGlvblNlY3Rpb24iPgotCQk8eHNsOnBhcmFtIG5hbWU9ImRlc2NyaXB0aW9uIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0ibWFpbkRlc2NyaXB0aW9uIiBzZWxlY3Q9IiRkZXNjcmlwdGlvbi9hdHRyaWJ1dGVbQG5hbWU9J21haW5EZXNjcmlwdGlvbiddIi8+CQkKLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJhdHRhY2htZW50cyIgc2VsZWN0PSIkZGVzY3JpcHRpb24vYXR0cmlidXRlW0BuYW1lPSdhdHRhY2htZW50cyddIi8+CQkJCQotCi0JCTx4c2w6aWYgdGVzdD0iJG1haW5EZXNjcmlwdGlvbiAhPSAnJyBvciAkYXR0YWNobWVudHMgIT0gJyciPgotCQkJPGRpdiBjbGFzcz0ic2VjdGlvbkhlYWRpbmciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZGVzY3JpcHRpb25UZXh0Ii8+PC9kaXY+Ci0JCQk8ZGl2IGNsYXNzPSJzZWN0aW9uQ29udGVudCI+CQkJCi0JCQkJPHRhYmxlIGNsYXNzPSJzZWN0aW9uVGFibGUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4KLQkJCQkJPHhzbDppZiB0ZXN0PSIkbWFpbkRlc2NyaXB0aW9uICE9ICcnIj4KLQkJCQkJCTx0ciB2YWxpZ249InRvcCI+Ci0JCQkJCQkJPHRoIGNsYXNzPSJzZWN0aW9uVGFibGVIZWFkaW5nIiBzY29wZT0icm93Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG1haW5EZXNjcmlwdGlvblRleHQiLz48L3RoPgotCQkJCQkJCTx0ZCBjbGFzcz0ic2VjdGlvblRhYmxlQ2VsbCI+Ci0JCQkJCQkJCTx4c2w6dmFsdWUtb2YgZGlzYWJsZS1vdXRwdXQtZXNjYXBpbmc9InllcyIgc2VsZWN0PSIkbWFpbkRlc2NyaXB0aW9uIi8+Ci0JCQkJCQkJPC90ZD4KLQkJCQkJCTwvdHI+Ci0JCQkJCTwveHNsOmlmPgkJCQkKLQkJCQkJPHhzbDppZiB0ZXN0PSIkYXR0YWNobWVudHMgIT0gJyciPgotCQkJCQkJPHRyIHZhbGlnbj0idG9wIj4KLQkJCQkJCQk8dGggY2xhc3M9InNlY3Rpb25UYWJsZUhlYWRpbmciIHNjb3BlPSJyb3ciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkYXR0YWNoZWRGaWxlc1RleHQiLz48L3RoPgotCQkJCQkJCTx0ZCBjbGFzcz0ic2VjdGlvblRhYmxlQ2VsbCI+Ci0JCQkJCQkJPFVMPgotCQkJCQkJCQk8eHNsOmZvci1lYWNoIHNlbGVjdD0iYXR0cmlidXRlW0BuYW1lPSdhdHRhY2hlZEZpbGUnXSI+Ci0JCQkJCQkJCTx4c2w6c29ydCBzZWxlY3Q9IkBmaWxlTmFtZSIvPgotCQkJCQkJCQk8bGk+Ci0JCQkJCQkJCQk8YSBocmVmPSJ7QHVybH0iIHRhcmdldD0iX2JsYW5rIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGZpbGVOYW1lIi8+PC9hPgotCQkJCQkJCQk8L2xpPgotCQkJCQkJCQk8L3hzbDpmb3ItZWFjaD4KLQkJCQkJCQk8L1VMPgotCQkJCQkJCTwvdGQ+Ci0JCQkJCQk8L3RyPgotCQkJCQk8L3hzbDppZj4JCQkJCi0JCQkJPC90YWJsZT4KLQkJCTwvZGl2PgotCQk8L3hzbDppZj4KLQk8L3hzbDp0ZW1wbGF0ZT4KLQotCTx4c2w6dGVtcGxhdGUgbmFtZT0ibW9yZUluZm9TZWN0aW9uIj4KLQkJPCEtLSB1c2UgdGhlIHNwZWNpZmljIG5hbWVkIGxpc3QsICBvdGhlcndpc2UsIHRoZSB2YXJpYWJpbGl0eSBiYXNlIGVsZW1lbnQgd2lsbCBiZSBpbmNsdWRlZCwgYnVnIDE2Mzg4NSAtLT4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJjaGVja2xpc3RzIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3RbQG5hbWUgPSdjaGVja2xpc3RzJ10vRWxlbWVudFtAVHlwZT0nQ2hlY2tsaXN0J10iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJjb25jZXB0cyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0W0BuYW1lID0nY29uY2VwdHNBbmRQYXBlcnMnXS9FbGVtZW50W0BUeXBlPSdDb25jZXB0J10iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJndWlkZWxpbmVzIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3RbQG5hbWUgPSdndWlkZWxpbmVzJ10vRWxlbWVudFtAVHlwZT0nR3VpZGVsaW5lJ10iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJzdXBwb3J0aW5nTWF0ZXJpYWxzIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3RbQG5hbWUgPSdzdXBwb3J0aW5nTWF0ZXJpYWxzJ10vRWxlbWVudCIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InRvb2xNZW50b3JzIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3RbQG5hbWUgIT0nY29udGVudEVsZW1lbnRzJ10vRWxlbWVudFtAVHlwZT0nVG9vbE1lbnRvciddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0id2hpdGVQYXBlcnMiIHNlbGVjdD0icmVmZXJlbmNlTGlzdFtAbmFtZSA9J2NvbmNlcHRzQW5kUGFwZXJzJ10vRWxlbWVudFtAVHlwZT0nV2hpdGVwYXBlciddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iZXhhbXBsZXMiIHNlbGVjdD0icmVmZXJlbmNlTGlzdFtAbmFtZSA9J2V4YW1wbGVzJ10vRWxlbWVudFtAVHlwZT0nRXhhbXBsZSddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0icmV1c2FibGVBc3NldHMiIHNlbGVjdD0icmVmZXJlbmNlTGlzdFtAbmFtZSA9J2Fzc2V0cyddL0VsZW1lbnRbQFR5cGU9J1JldXNhYmxlQXNzZXQnXSIvPgotCQk8eHNsOmlmIHRlc3Q9ImNvdW50KCRjaGVja2xpc3RzKSArIGNvdW50KCRjb25jZXB0cykgKyBjb3VudCgkZ3VpZGVsaW5lcykgKyBjb3VudCgkc3VwcG9ydGluZ01hdGVyaWFscykgKyBjb3VudCgkdG9vbE1lbnRvcnMpICsgY291bnQoJHdoaXRlUGFwZXJzKSArIGNvdW50KCRyZXVzYWJsZUFzc2V0cykgKyBjb3VudCgkZXhhbXBsZXMpID4gMCI+Ci0JCQk8ZGl2IGNsYXNzPSJzZWN0aW9uSGVhZGluZyI+Ci0JCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRtb3JlSW5mb1RleHQiLz4KLQkJCTwvZGl2PgotCQkJPGRpdiBjbGFzcz0ic2VjdGlvbkNvbnRlbnQiPgotCQkJCTx0YWJsZSBjbGFzcz0ic2VjdGlvblRhYmxlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+Ci0JCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhZGRDaGVja2xpc3RzIj4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJjaGVja2xpc3RzIiBzZWxlY3Q9IiRjaGVja2xpc3RzIi8+Ci0JCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhZGRDb25jZXB0cyI+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iY29uY2VwdHMiIHNlbGVjdD0iJGNvbmNlcHRzIi8+Ci0JCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhZGRFeGFtcGxlcyI+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZXhhbXBsZXMiIHNlbGVjdD0iJGV4YW1wbGVzIi8+Ci0JCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhZGRHdWlkZWxpbmVzIj4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJndWlkZWxpbmVzIiBzZWxlY3Q9IiRndWlkZWxpbmVzIi8+Ci0JCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhZGRSZXVzYWJsZUFzc2V0cyI+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0icmV1c2FibGVBc3NldHMiIHNlbGVjdD0iJHJldXNhYmxlQXNzZXRzIi8+Ci0JCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhZGRTdXBwb3J0aW5nTWF0ZXJpYWxzIj4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJzdXBwb3J0aW5nTWF0ZXJpYWxzIiBzZWxlY3Q9IiRzdXBwb3J0aW5nTWF0ZXJpYWxzIi8+Ci0JCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhZGRUb29sTWVudG9ycyI+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0idG9vbE1lbnRvcnMiIHNlbGVjdD0iJHRvb2xNZW50b3JzIi8+Ci0JCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhZGRXaGl0ZVBhcGVycyI+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0id2hpdGVQYXBlcnMiIHNlbGVjdD0iJHdoaXRlUGFwZXJzIi8+Ci0JCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJPC90YWJsZT4KLQkJCTwvZGl2PgotCQk8L3hzbDppZj4KLQk8L3hzbDp0ZW1wbGF0ZT4KLQotPC94c2w6c3R5bGVzaGVldD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC94c2wvaWxsdXN0cmF0aW9uLnhzbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC94c2wvaWxsdXN0cmF0aW9uLnhzbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTRkOGY4MC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQveHNsL2lsbHVzdHJhdGlvbi54c2wKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci0KLTx4c2w6c3R5bGVzaGVldCB2ZXJzaW9uPSIxLjAiCi0JeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iCi0JeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSI+Ci0KLQk8eHNsOnRlbXBsYXRlIG5hbWU9ImlsbHVzdHJhdGlvbnNTZWN0aW9uIj4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJleGFtcGxlcyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0L0VsZW1lbnRbQFR5cGU9J0V4YW1wbGUnXSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InJldXNhYmxlQXNzZXRzIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3QvRWxlbWVudFtAVHlwZT0nUmV1c2FibGVBc3NldCddIi8+Ci0JCTx4c2w6aWYgdGVzdD0iY291bnQoJGV4YW1wbGVzKSArIGNvdW50KCRyZXVzYWJsZUFzc2V0cykgPiAwIj4KLQkJCTxkaXYgY2xhc3M9InNlY3Rpb25IZWFkaW5nIj4KLQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGlsbHVzdHJhdGlvbnNUZXh0Ii8+Ci0JCQk8L2Rpdj4KLQkJCTxkaXYgY2xhc3M9InNlY3Rpb25Db250ZW50Ij4KLQkJCQk8dGFibGUgY2xhc3M9InNlY3Rpb25UYWJsZSIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiPgotCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWRkRXhhbXBsZXMiPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImV4YW1wbGVzIiBzZWxlY3Q9IiRleGFtcGxlcyIvPgotCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWRkUmV1c2FibGVBc3NldHMiPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9InJldXNhYmxlQXNzZXRzIiBzZWxlY3Q9IiRyZXVzYWJsZUFzc2V0cyIvPgotCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCTwvdGFibGU+Ci0JCQk8L2Rpdj4KLQkJPC94c2w6aWY+Ci0JPC94c2w6dGVtcGxhdGU+Ci0KLTwveHNsOnN0eWxlc2hlZXQ+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQveHNsL2tleV9jb25zaWRlcmF0aW9uLnhzbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC94c2wva2V5X2NvbnNpZGVyYXRpb24ueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MGMyZjM1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC94c2wva2V5X2NvbnNpZGVyYXRpb24ueHNsCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotCi08eHNsOnN0eWxlc2hlZXQgdmVyc2lvbj0iMS4wIgotCXhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIgotCXhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiPgotCi0JPHhzbDp0ZW1wbGF0ZSBuYW1lPSJrZXlDb25zaWRlcmF0aW9uc1NlY3Rpb24iPgotCQk8eHNsOnBhcmFtIG5hbWU9ImRlc2NyaXB0aW9uIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0ia2V5Q29uc2lkZXJhdGlvbnMiIHNlbGVjdD0iJGRlc2NyaXB0aW9uL2F0dHJpYnV0ZVtAbmFtZT0na2V5Q29uc2lkZXJhdGlvbnMnXSIvPgotCQk8eHNsOmlmIHRlc3Q9IiRrZXlDb25zaWRlcmF0aW9ucyAhPSAnJyI+Ci0JCQk8ZGl2IGNsYXNzPSJzZWN0aW9uSGVhZGluZyI+Ci0JCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRrZXlDb25zaWRlcmF0aW9uc1RleHQiLz4KLQkJCTwvZGl2PgotCQkJPGRpdiBjbGFzcz0ic2VjdGlvbkNvbnRlbnQiPgotCQkJCTx0YWJsZSBjbGFzcz0ic2VjdGlvblRhYmxlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+Ci0JCQkJCTx0ciB2YWxpZ249InRvcCI+Ci0JCQkJCQk8dGQgY2xhc3M9InNlY3Rpb25UYWJsZVNpbmdsZUNlbGwiPgotCQkJCQkJCTx4c2w6dmFsdWUtb2YgZGlzYWJsZS1vdXRwdXQtZXNjYXBpbmc9InllcyIgc2VsZWN0PSIka2V5Q29uc2lkZXJhdGlvbnMiLz4KLQkJCQkJCTwvdGQ+Ci0JCQkJCTwvdHI+Ci0JCQkJPC90YWJsZT4KLQkJCTwvZGl2PgotCQk8L3hzbDppZj4KLQk8L3hzbDp0ZW1wbGF0ZT4KLQotPC94c2w6c3R5bGVzaGVldD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC94c2wvbWFpbl9kZXNjcmlwdGlvbi54c2wgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQveHNsL21haW5fZGVzY3JpcHRpb24ueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYWEwNzY4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC94c2wvbWFpbl9kZXNjcmlwdGlvbi54c2wKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci0KLTx4c2w6c3R5bGVzaGVldCB2ZXJzaW9uPSIxLjAiCi0JeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iCi0JeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSI+Ci0KLQk8eHNsOnRlbXBsYXRlIG5hbWU9Im1haW5EZXNjcmlwdGlvblNlY3Rpb24iPgotCQk8eHNsOnBhcmFtIG5hbWU9ImRlc2NyaXB0aW9uIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0ibWFpbkRlc2NyaXB0aW9uIiBzZWxlY3Q9IiRkZXNjcmlwdGlvbi9hdHRyaWJ1dGVbQG5hbWU9J21haW5EZXNjcmlwdGlvbiddIi8+Ci0JCTx4c2w6aWYgdGVzdD0iJG1haW5EZXNjcmlwdGlvbiAhPSAnJyI+Ci0JCQk8ZGl2IGNsYXNzPSJzZWN0aW9uSGVhZGluZyI+Ci0JCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRtYWluRGVzY3JpcHRpb25UZXh0Ii8+Ci0JCQk8L2Rpdj4KLQkJCTxkaXYgY2xhc3M9InNlY3Rpb25Db250ZW50Ij4KLQkJCQk8dGFibGUgY2xhc3M9InNlY3Rpb25UYWJsZSIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiPgotCQkJCQk8dHIgdmFsaWduPSJ0b3AiPgotCQkJCQkJPHRkIGNsYXNzPSJzZWN0aW9uVGFibGVTaW5nbGVDZWxsIj4KLQkJCQkJCQk8eHNsOnZhbHVlLW9mIGRpc2FibGUtb3V0cHV0LWVzY2FwaW5nPSJ5ZXMiIHNlbGVjdD0iJG1haW5EZXNjcmlwdGlvbiIvPgotCQkJCQkJPC90ZD4KLQkJCQkJPC90cj4KLQkJCQk8L3RhYmxlPgotCQkJPC9kaXY+Ci0JCTwveHNsOmlmPgotCTwveHNsOnRlbXBsYXRlPgotCi08L3hzbDpzdHlsZXNoZWV0PgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L3hzbC9tYXBwaW5nLnhzbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC94c2wvbWFwcGluZy54c2wKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4MDY0MGIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L3hzbC9tYXBwaW5nLnhzbAorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLQotPHhzbDpzdHlsZXNoZWV0IHZlcnNpb249IjEuMCIKLQl4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIKLQl4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIj4KLQotCTx4c2w6dGVtcGxhdGUgbmFtZT0ibWFwcGluZyI+Ci0JCTx4c2w6cGFyYW0gbmFtZT0iZWxlbWVudFR5cGUiLz4KLQkJPHhzbDpjaG9vc2U+Ci0JCQk8eHNsOndoZW4gdGVzdD0iJGVsZW1lbnRUeXBlID0gJ1Rhc2snIj4KLQkJCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJjb250ZW50Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJ2FjdGl2aXR5JyIvPjwveHNsOmF0dHJpYnV0ZT4KLQkJCTwveHNsOndoZW4+Ci0JCQk8eHNsOndoZW4gdGVzdD0iJGVsZW1lbnRUeXBlID0gJ1Rvb2xNZW50b3InIj4KLQkJCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJjb250ZW50Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJ3Rvb2xfbWVudG9yJyIvPjwveHNsOmF0dHJpYnV0ZT4KLQkJCTwveHNsOndoZW4+Ci0JCQk8eHNsOndoZW4gdGVzdD0iJGVsZW1lbnRUeXBlID0gJ091dGNvbWUnIj4KLQkJCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJjb250ZW50Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJ2FydGlmYWN0JyIvPjwveHNsOmF0dHJpYnV0ZT4KLQkJCTwveHNsOndoZW4+Ci0JCQk8eHNsOndoZW4gdGVzdD0iJGVsZW1lbnRUeXBlID0gJ0RlbGl2ZXJhYmxlJyI+Ci0JCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0iY29udGVudCI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IidhcnRpZmFjdCciLz48L3hzbDphdHRyaWJ1dGU+Ci0JCQk8L3hzbDp3aGVuPgotCQkJPHhzbDp3aGVuIHRlc3Q9IiRlbGVtZW50VHlwZSA9ICdBY3Rpdml0eSciPgotCQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9ImNvbnRlbnQiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSInd29ya2Zsb3dfZGV0YWlsJyIvPjwveHNsOmF0dHJpYnV0ZT4KLQkJCTwveHNsOndoZW4+Ci0JCQk8eHNsOndoZW4gdGVzdD0iJGVsZW1lbnRUeXBlID0gJ0NvbmNlcHQnIj4KLQkJCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJjb250ZW50Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJ2NvbmNlcHQnIi8+PC94c2w6YXR0cmlidXRlPgotCQkJPC94c2w6d2hlbj4KLQkJCTx4c2w6d2hlbiB0ZXN0PSIkZWxlbWVudFR5cGUgPSAnRXhhbXBsZSciPgotCQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9ImNvbnRlbnQiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSInZXhhbXBsZSciLz48L3hzbDphdHRyaWJ1dGU+Ci0JCQk8L3hzbDp3aGVuPgotCQkJPHhzbDpvdGhlcndpc2U+Ci0JCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0iY29udGVudCI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IidvdGhlciciLz48L3hzbDphdHRyaWJ1dGU+Ci0JCQk8L3hzbDpvdGhlcndpc2U+Ci0JCTwveHNsOmNob29zZT4KLQk8L3hzbDp0ZW1wbGF0ZT4KLQotPC94c2w6c3R5bGVzaGVldD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC94c2wvbWlsZXN0b25lLnhzbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC94c2wvbWlsZXN0b25lLnhzbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDhhYWJmZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQveHNsL21pbGVzdG9uZS54c2wKKysrIC9kZXYvbnVsbApAQCAtMSwyMTQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotCi08eHNsOnN0eWxlc2hlZXQgdmVyc2lvbj0iMS4wIgotCXhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIgotCXhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiPgotCi08eHNsOm91dHB1dCBtZXRob2Q9Imh0bWwiIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiAKLQlkb2N0eXBlLXB1YmxpYz0iLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iIAotCWRvY3R5cGUtc3lzdGVtPSJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIiAKLQlpbmRlbnQ9InllcyIvPgotCQotCTx4c2w6aW5jbHVkZSBocmVmPSJyZXNvdXJjZXMueHNsIi8+Ci0JPHhzbDppbmNsdWRlIGhyZWY9ImNvbW1vbi54c2wiLz4KLQk8eHNsOmluY2x1ZGUgaHJlZj0ib3ZlcnZpZXcueHNsIi8+Ci0JPHhzbDppbmNsdWRlIGhyZWY9Im1haW5fZGVzY3JpcHRpb24ueHNsIi8+Ci0JPHhzbDppbmNsdWRlIGhyZWY9ImtleV9jb25zaWRlcmF0aW9uLnhzbCIvPgotCTx4c2w6aW5jbHVkZSBocmVmPSJwcm9wZXJ0eS54c2wiLz4KLQk8eHNsOmluY2x1ZGUgaHJlZj0iZ3VpZGFuY2VfaGVscGVyLnhzbCIvPgotCTx4c2w6aW5jbHVkZSBocmVmPSJpbGx1c3RyYXRpb24ueHNsIi8+Ci0KLQk8eHNsOnRlbXBsYXRlIG1hdGNoPSIvRWxlbWVudCI+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iZWxlbWVudFR5cGUiIHNlbGVjdD0iQFR5cGUiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJlbGVtZW50VHlwZU5hbWUiIHNlbGVjdD0iQFR5cGVOYW1lIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iZWxlbWVudE5hbWUiIHNlbGVjdD0iQE5hbWUiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJlbGVtZW50UHJlc2VudGF0aW9uTmFtZSIgc2VsZWN0PSJARGlzcGxheU5hbWUiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJiYWNrUGF0aCIgc2VsZWN0PSJAQmFja1BhdGgiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJpbWFnZVBhdGgiIHNlbGVjdD0iY29uY2F0KCRiYWNrUGF0aCwgJ2ltYWdlcy8nKSIvPgotCSAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InNoYXBlSW1hZ2UiIHNlbGVjdD0iY29uY2F0KCRiYWNrUGF0aCxAU2hhcGVpY29uVXJsKSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InByZXNlbnRhdGlvbiIgc2VsZWN0PSJyZWZlcmVuY2VbQG5hbWU9J3ByZXNlbnRhdGlvbiddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iY29udGVudERlc2NyaXB0aW9uIiBzZWxlY3Q9IiRwcmVzZW50YXRpb24vRWxlbWVudFtAVHlwZT0nTWlsZXN0b25lJ10iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJtaWxlc3RvbmVEZXNjcmlwdGlvbiIgc2VsZWN0PSIkcHJlc2VudGF0aW9uL0VsZW1lbnRbQFR5cGU9J01pbGVzdG9uZSddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iZGVzY3JpcHRvckRlc2NyaXB0aW9uIiBzZWxlY3Q9IiRwcmVzZW50YXRpb24vRWxlbWVudFtAVHlwZT0nQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uJ10iLz4JCQotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImNvcHlyaWdodCIgc2VsZWN0PSJjb3B5cmlnaHQiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJzaG93VHJlZUJyb3dzZXIiIHNlbGVjdD0iQHNob3dUcmVlQnJvd3NlciIvPgotCi0JCTxodG1sPgotCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0ibGFuZyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBsYW5nIi8+PC94c2w6YXR0cmlidXRlPgotCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0ieG1sOmxhbmciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbGFuZyIvPjwveHNsOmF0dHJpYnV0ZT4KLQkJCTxoZWFkPgotCQkJCTx0aXRsZT48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVsZW1lbnRUeXBlTmFtZSIvPjogPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50UHJlc2VudGF0aW9uTmFtZSIvPjwvdGl0bGU+Ci0JCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InVtYU1ldGFUYWdzIj4KLQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnRUeXBlIiBzZWxlY3Q9IiRlbGVtZW50VHlwZSIvPgotCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudE5hbWUiIHNlbGVjdD0iJGVsZW1lbnROYW1lIi8+Ci0JCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50UHJlc2VudGF0aW9uTmFtZSIgc2VsZWN0PSIkZWxlbWVudFByZXNlbnRhdGlvbk5hbWUiLz4KLQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCTxtZXRhIG5hbWU9ImVsZW1lbnRfdHlwZSIgY29udGVudD0ieyRlbGVtZW50VHlwZX0iLz4KLQkJCQk8bWV0YSBuYW1lPSJmaWxldHlwZSIgY29udGVudD0iZGVzY3JpcHRpb24iLz4JCQkJCi0JCQkJPGxpbmsgcmVsPSJTdHlsZVNoZWV0IiBocmVmPSJ7JGJhY2tQYXRofWNzcy9kZWZhdWx0LmNzcyIgdHlwZT0idGV4dC9jc3MiLz4KLQkJCQk8c2NyaXB0IHNyYz0ieyRiYWNrUGF0aH1zY3JpcHRzL0NvbnRlbnRQYWdlUmVzb3VyY2UuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPjwvc2NyaXB0PgotCQkJCTxzY3JpcHQgc3JjPSJ7JGJhY2tQYXRofXNjcmlwdHMvQ29udGVudFBhZ2VTZWN0aW9uLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij48L3NjcmlwdD4KLQkJCQk8c2NyaXB0IHNyYz0ieyRiYWNrUGF0aH1zY3JpcHRzL0NvbnRlbnRQYWdlU3ViU2VjdGlvbi5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PC9zY3JpcHQ+Ci0JCQkJPHNjcmlwdCBzcmM9InskYmFja1BhdGh9c2NyaXB0cy9BY3Rpdml0eVRyZWVUYWJsZS5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PC9zY3JpcHQ+Ci0JCQkJPHNjcmlwdCBzcmM9InskYmFja1BhdGh9c2NyaXB0cy9Qcm9jZXNzRWxlbWVudFBhZ2UuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPjwvc2NyaXB0PgotCQkJCTxzY3JpcHQgc3JjPSJ7JGJhY2tQYXRofXNjcmlwdHMvQ29udGVudFBhZ2VUb29sYmFyLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij48L3NjcmlwdD4KLQkJCQk8c2NyaXB0IHNyYz0ieyRiYWNrUGF0aH1zY3JpcHRzL2NvbnRlbnRQYWdlLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij48L3NjcmlwdD4KLQkJCQk8c2NyaXB0IHNyYz0ieyRiYWNrUGF0aH1zY3JpcHRzL3Byb2Nlc3NFbGVtZW50RGF0YS5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PC9zY3JpcHQ+Ci0JCQkJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij4KLQkJCQkJdmFyIGJhY2tQYXRoID0gJzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkYmFja1BhdGgiLz4nOwotCQkJCQl2YXIgaW1nUGF0aCA9ICc8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGltYWdlUGF0aCIvPic7Ci0JCQkJCXZhciBub2RlSW5mbz1udWxsOwotCQkJCQljb250ZW50UGFnZS5wcmVsb2FkKGltZ1BhdGgsIGJhY2tQYXRoLCBub2RlSW5mbywgICcnLCBmYWxzZSwgdHJ1ZSwgZmFsc2UpOwotCQkJCTwvc2NyaXB0PgotCQkJPC9oZWFkPgotCQkJPGJvZHk+Ci0JCQk8ZGl2IGlkPSJicmVhZGNydW1icyI+PC9kaXY+Ci0JCQkJPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci0JCQkJCTx0cj4KLQkJCQkJCTx0ZCB2YWxpZ249InRvcCI+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9Im92ZXJ2aWV3Ij4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnRUeXBlIiBzZWxlY3Q9IiRlbGVtZW50VHlwZSIvPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudFR5cGVOYW1lIiBzZWxlY3Q9IiRlbGVtZW50VHlwZU5hbWUiLz4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnRQcmVzZW50YXRpb25OYW1lIiBzZWxlY3Q9IiRlbGVtZW50UHJlc2VudGF0aW9uTmFtZSIvPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudEljb24iIHNlbGVjdD0iJHNoYXBlSW1hZ2UiLz4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImJhY2tQYXRoIiBzZWxlY3Q9IiRiYWNrUGF0aCIvPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0ic2hvd1RyZWVCcm93c2VyIiBzZWxlY3Q9IiRzaG93VHJlZUJyb3dzZXIiLz4KLQkJCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJtYWluRGVzY3JpcHRpb25TZWN0aW9uIj4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImRlc2NyaXB0aW9uIiBzZWxlY3Q9IiRkZXNjcmlwdG9yRGVzY3JpcHRpb24iLz4KLQkJCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJwcm9wZXJ0aWVzU2VjdGlvbiI+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJjb250ZW50RGVzY3JpcHRpb24iIHNlbGVjdD0iJGNvbnRlbnREZXNjcmlwdGlvbiIvPgotCQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InVzYWdlU2VjdGlvbiI+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJjb250ZW50RGVzY3JpcHRpb24iIHNlbGVjdD0iJGRlc2NyaXB0b3JEZXNjcmlwdGlvbiIvPgotCQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+CQkJCQkJCQotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJpbGx1c3RyYXRpb25zU2VjdGlvbiIvPgotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJrZXlDb25zaWRlcmF0aW9uc1NlY3Rpb24iPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZGVzY3JpcHRpb24iIHNlbGVjdD0iJGRlc2NyaXB0b3JEZXNjcmlwdGlvbiIvPgotCQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+CQkJCQkKLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0ibW9yZUluZm9TZWN0aW9uIi8+CQkKLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iY29weXJpZ2h0Ij4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImNvcHlyaWdodCIgc2VsZWN0PSIkY29weXJpZ2h0Ii8+Ci0JCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCTwvdGQ+CQkJCQkJCi0JCQkJCTwvdHI+Ci0JCQkJPC90YWJsZT4KLQkJCTwvYm9keT4KLQkJCQk8c2NyaXB0IGxhbmd1YWdlPSJKYXZhU2NyaXB0IiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotCQkJCQljb250ZW50UGFnZS5vbmxvYWQoKTsKLQkJCQk8L3NjcmlwdD4KLQkJPC9odG1sPgotCTwveHNsOnRlbXBsYXRlPgotCi0JPHhzbDp0ZW1wbGF0ZSBuYW1lPSJwcm9wZXJ0aWVzU2VjdGlvbiI+Ci0JCTx4c2w6cGFyYW0gbmFtZT0iY29udGVudERlc2NyaXB0aW9uIi8+Ci0JCTxkaXYgY2xhc3M9InNlY3Rpb25IZWFkaW5nIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb3BlcnRpZXNUZXh0Ii8+PC9kaXY+Ci0JCTxkaXYgY2xhc3M9InNlY3Rpb25Db250ZW50Ij4KLQkJCTx0YWJsZSBjbGFzcz0ic2VjdGlvblRhYmxlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+Ci0JCQkgICAgPHhzbDppZiB0ZXN0PSJyZWZlcmVuY2VMaXN0W0BuYW1lPSdsaW5rVG9QcmVkZWNlc3NvciddL0VsZW1lbnQiPgotCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWRkUmVmZXJlbmNlcyI+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0icmVmTmFtZSIgc2VsZWN0PSIkcHJlZGVjZXNzb3JUZXh0Ii8+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0icmVmRWxlbWVudCIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0W0BuYW1lPSdsaW5rVG9QcmVkZWNlc3NvciddL0VsZW1lbnQiLz4KLQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQk8L3hzbDppZj4KLQkJCQk8eHNsOmlmIHRlc3Q9ImF0dHJpYnV0ZVtAbmFtZT0nUGxhbm5pbmdEYXRhJ10iPgotCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icHJvcGVydHkiPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImZpZWxkTGFiZWwiIHNlbGVjdD0iJHBsYW5uaW5nRGF0YVRleHQiLz4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJmaWVsZFRleHQiIHNlbGVjdD0iYXR0cmlidXRlW0BuYW1lPSdQbGFubmluZ0RhdGEnXSIvPgotCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCTwveHNsOmlmPgotCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJwcm9wZXJ0eSI+Ci0JCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJmaWVsZExhYmVsIiBzZWxlY3Q9IiRtdWx0aXBsZU9jY3VycmVuY2VzVGV4dCIvPgotCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZmllbGRUZXh0IiBzZWxlY3Q9ImF0dHJpYnV0ZVtAbmFtZT0naGFzTXVsdGlwbGVPY2N1cnJlbmNlcyddIi8+Ci0JCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icHJvcGVydHkiPgotCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZmllbGRMYWJlbCIgc2VsZWN0PSIkZXZlbnREcml2ZW5UZXh0Ii8+Ci0JCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJmaWVsZFRleHQiIHNlbGVjdD0iYXR0cmlidXRlW0BuYW1lPSdpc0V2ZW50RHJpdmVuJ10iLz4KLQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCTx4c2w6aWYgdGVzdD0iYXR0cmlidXRlW0BuYW1lPSdpc09uZ29pbmcnXSI+Ci0JCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJwcm9wZXJ0eSI+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZmllbGRMYWJlbCIgc2VsZWN0PSIkb25nb2luZ1RleHQiLz4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJmaWVsZFRleHQiIHNlbGVjdD0iYXR0cmlidXRlW0BuYW1lPSdpc09uZ29pbmcnXSIvPgotCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCTwveHNsOmlmPgotCQkJCTx4c2w6aWYgdGVzdD0iYXR0cmlidXRlW0BuYW1lPSdpc09wdGlvbmFsJ10iPgotCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icHJvcGVydHkiPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImZpZWxkTGFiZWwiIHNlbGVjdD0iJG9wdGlvbmFsVGV4dCIvPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImZpZWxkVGV4dCIgc2VsZWN0PSJhdHRyaWJ1dGVbQG5hbWU9J2lzT3B0aW9uYWwnXSIvPgotCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCTwveHNsOmlmPgotCQkJCTx4c2w6aWYgdGVzdD0iYXR0cmlidXRlW0BuYW1lPSdpc1BsYW5uZWQnXSI+Ci0JCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJwcm9wZXJ0eSI+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZmllbGRMYWJlbCIgc2VsZWN0PSIkcGxhbm5lZFRleHQiLz4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJmaWVsZFRleHQiIHNlbGVjdD0iYXR0cmlidXRlW0BuYW1lPSdpc1BsYW5uZWQnXSIvPgotCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCTwveHNsOmlmPgkJCQkKLQkJCQk8eHNsOmlmIHRlc3Q9ImF0dHJpYnV0ZVtAbmFtZT0naXNSZXBlYXRhYmxlJ10iPgotCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icHJvcGVydHkiPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImZpZWxkTGFiZWwiIHNlbGVjdD0iJHJlcGVhdGFibGVUZXh0Ii8+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZmllbGRUZXh0IiBzZWxlY3Q9ImF0dHJpYnV0ZVtAbmFtZT0naXNSZXBlYXRhYmxlJ10iLz4KLQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQk8L3hzbDppZj4JCQkJCi0JCQk8L3RhYmxlPgotCQk8L2Rpdj4KLQk8L3hzbDp0ZW1wbGF0ZT4KLQotCTx4c2w6dGVtcGxhdGUgbmFtZT0idXNhZ2VTZWN0aW9uIj4KLQkJPHhzbDpwYXJhbSBuYW1lPSJjb250ZW50RGVzY3JpcHRpb24iLz4KLQkJPHhzbDppZiB0ZXN0PSIkY29udGVudERlc2NyaXB0aW9uL2F0dHJpYnV0ZVtAbmFtZT0ndXNhZ2VHdWlkYW5jZSddICE9ICcnIj4KLQkJCTxkaXYgY2xhc3M9InNlY3Rpb25IZWFkaW5nIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHVzYWdlVGV4dCIvPjwvZGl2PgotCQkJPGRpdiBjbGFzcz0ic2VjdGlvbkNvbnRlbnQiPgotCQkJCTx0YWJsZSBjbGFzcz0ic2VjdGlvblRhYmxlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+Ci0JCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJwcm9wZXJ0eSI+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZmllbGRMYWJlbCIgc2VsZWN0PSIkdXNhZ2VHdWlkYW5jZVRleHQiLz4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJmaWVsZFRleHQiIHNlbGVjdD0iJGNvbnRlbnREZXNjcmlwdGlvbi9hdHRyaWJ1dGVbQG5hbWU9J3VzYWdlR3VpZGFuY2UnXSIvPgotCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgkJCQkJCi0JCQkJPC90YWJsZT4KLQkJCTwvZGl2PgotCQk8L3hzbDppZj4KLQk8L3hzbDp0ZW1wbGF0ZT4KLQkKLQk8eHNsOnRlbXBsYXRlIG5hbWU9Im1vcmVJbmZvU2VjdGlvbiI+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iY2hlY2tsaXN0cyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0L0VsZW1lbnRbQFR5cGU9J0NoZWNrbGlzdCddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iY29uY2VwdHMiIHNlbGVjdD0icmVmZXJlbmNlTGlzdC9FbGVtZW50W0BUeXBlPSdDb25jZXB0J10iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJndWlkZWxpbmVzIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3QvRWxlbWVudFtAVHlwZT0nR3VpZGVsaW5lJ10iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJzdXBwb3J0aW5nTWF0ZXJpYWxzIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3QvRWxlbWVudFtAVHlwZT0nU3VwcG9ydGluZ01hdGVyaWFsJ10iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJ3aGl0ZVBhcGVycyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0L0VsZW1lbnRbQFR5cGU9J1doaXRlcGFwZXInXSIvPgotCQk8eHNsOmlmIHRlc3Q9ImNvdW50KCRjaGVja2xpc3RzKSArIGNvdW50KCRjb25jZXB0cykgKyBjb3VudCgkZ3VpZGVsaW5lcykgKyBjb3VudCgkc3VwcG9ydGluZ01hdGVyaWFscykgKyBjb3VudCgkd2hpdGVQYXBlcnMpID4gMCI+Ci0JCQk8ZGl2IGNsYXNzPSJzZWN0aW9uSGVhZGluZyI+Ci0JCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRtb3JlSW5mb1RleHQiLz4KLQkJCTwvZGl2PgotCQkJPGRpdiBjbGFzcz0ic2VjdGlvbkNvbnRlbnQiPgotCQkJCTx0YWJsZSBjbGFzcz0ic2VjdGlvblRhYmxlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+Ci0JCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhZGRDaGVja2xpc3RzIj4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJjaGVja2xpc3RzIiBzZWxlY3Q9IiRjaGVja2xpc3RzIi8+Ci0JCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhZGRDb25jZXB0cyI+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iY29uY2VwdHMiIHNlbGVjdD0iJGNvbmNlcHRzIi8+Ci0JCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhZGRHdWlkZWxpbmVzIj4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJndWlkZWxpbmVzIiBzZWxlY3Q9IiRndWlkZWxpbmVzIi8+Ci0JCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhZGRTdXBwb3J0aW5nTWF0ZXJpYWxzIj4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJzdXBwb3J0aW5nTWF0ZXJpYWxzIiBzZWxlY3Q9IiRzdXBwb3J0aW5nTWF0ZXJpYWxzIi8+Ci0JCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhZGRXaGl0ZVBhcGVycyI+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0id2hpdGVQYXBlcnMiIHNlbGVjdD0iJHdoaXRlUGFwZXJzIi8+Ci0JCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJPC90YWJsZT4KLQkJCTwvZGl2PgotCQk8L3hzbDppZj4KLQk8L3hzbDp0ZW1wbGF0ZT4KLQotCi08L3hzbDpzdHlsZXNoZWV0PgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L3hzbC9vdXRjb21lLnhzbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC94c2wvb3V0Y29tZS54c2wKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkM2EzMGEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L3hzbC9vdXRjb21lLnhzbAorKysgL2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci0KLTx4c2w6c3R5bGVzaGVldCB2ZXJzaW9uPSIxLjAiCi0JeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iCi0JeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSI+Ci0KLTx4c2w6b3V0cHV0IG1ldGhvZD0iaHRtbCIgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIAotCWRvY3R5cGUtcHVibGljPSItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgCi0JZG9jdHlwZS1zeXN0ZW09Imh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiIAotCWluZGVudD0ieWVzIi8+Ci0JCi0JPHhzbDppbmNsdWRlIGhyZWY9Indvcmtwcm9kdWN0LnhzbCIvPgotCTx4c2w6aW5jbHVkZSBocmVmPSJtYXBwaW5nLnhzbCIvPgotCTx4c2w6aW5jbHVkZSBocmVmPSJtYWluX2Rlc2NyaXB0aW9uLnhzbCIvPgkKLQotCTx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii9FbGVtZW50Ij4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJlbGVtZW50VHlwZSIgc2VsZWN0PSJAVHlwZSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImVsZW1lbnRUeXBlTmFtZSIgc2VsZWN0PSJAVHlwZU5hbWUiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJlbGVtZW50TmFtZSIgc2VsZWN0PSJATmFtZSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImVsZW1lbnRQcmVzZW50YXRpb25OYW1lIiBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImJhY2tQYXRoIiBzZWxlY3Q9IkBCYWNrUGF0aCIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImltYWdlUGF0aCIgc2VsZWN0PSJjb25jYXQoJGJhY2tQYXRoLCAnaW1hZ2VzLycpIi8+Ci0JICAgIDx4c2w6dmFyaWFibGUgbmFtZT0ic2hhcGVJbWFnZSIgc2VsZWN0PSJjb25jYXQoJGJhY2tQYXRoLEBTaGFwZWljb25VcmwpIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0icHJlc2VudGF0aW9uIiBzZWxlY3Q9InJlZmVyZW5jZVtAbmFtZT0ncHJlc2VudGF0aW9uJ10iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJvdXRjb21lRGVzY3JpcHRpb24iIHNlbGVjdD0iJHByZXNlbnRhdGlvbi9FbGVtZW50W0BUeXBlPSdXb3JrUHJvZHVjdERlc2NyaXB0aW9uJ10iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJjb3B5cmlnaHQiIHNlbGVjdD0iY29weXJpZ2h0Ii8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0ic2hvd1RyZWVCcm93c2VyIiBzZWxlY3Q9IkBzaG93VHJlZUJyb3dzZXIiLz4KLQotCQk8aHRtbD4JCi0JCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJsYW5nIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGxhbmciLz48L3hzbDphdHRyaWJ1dGU+Ci0JCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJ4bWw6bGFuZyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBsYW5nIi8+PC94c2w6YXR0cmlidXRlPgotCQkJPGhlYWQ+Ci0JCQkJPHRpdGxlPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudFR5cGVOYW1lIi8+OiA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVsZW1lbnRQcmVzZW50YXRpb25OYW1lIi8+PC90aXRsZT4KLQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0idW1hTWV0YVRhZ3MiPgotCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudFR5cGUiIHNlbGVjdD0iJGVsZW1lbnRUeXBlIi8+Ci0JCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50TmFtZSIgc2VsZWN0PSIkZWxlbWVudE5hbWUiLz4KLQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnRQcmVzZW50YXRpb25OYW1lIiBzZWxlY3Q9IiRlbGVtZW50UHJlc2VudGF0aW9uTmFtZSIvPgotCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJPG1ldGEgbmFtZT0iZWxlbWVudF90eXBlIj4gCi0JCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJtYXBwaW5nIj4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50VHlwZSIgc2VsZWN0PSIkZWxlbWVudFR5cGUiLz4KLQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQk8L21ldGE+Ci0JCQkJPG1ldGEgbmFtZT0iZmlsZXR5cGUiIGNvbnRlbnQ9ImRlc2NyaXB0aW9uIi8+Ci0JCQkJPGxpbmsgcmVsPSJTdHlsZVNoZWV0IiBocmVmPSJ7JGJhY2tQYXRofWNzcy9kZWZhdWx0LmNzcyIgdHlwZT0idGV4dC9jc3MiLz4KLQkJCQk8c2NyaXB0IHNyYz0ieyRiYWNrUGF0aH1zY3JpcHRzL0NvbnRlbnRQYWdlUmVzb3VyY2UuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPjwvc2NyaXB0PgotCQkJCTxzY3JpcHQgc3JjPSJ7JGJhY2tQYXRofXNjcmlwdHMvQ29udGVudFBhZ2VTZWN0aW9uLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij48L3NjcmlwdD4KLQkJCQk8c2NyaXB0IHNyYz0ieyRiYWNrUGF0aH1zY3JpcHRzL0NvbnRlbnRQYWdlU3ViU2VjdGlvbi5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PC9zY3JpcHQ+Ci0JCQkJPHNjcmlwdCBzcmM9InskYmFja1BhdGh9c2NyaXB0cy9Db250ZW50UGFnZVRvb2xiYXIuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPjwvc2NyaXB0PgotCQkJCTxzY3JpcHQgc3JjPSJ7JGJhY2tQYXRofXNjcmlwdHMvY29udGVudFBhZ2UuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPjwvc2NyaXB0PgotCQkJCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+Ci0JCQkJCXZhciBiYWNrUGF0aCA9ICc8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGJhY2tQYXRoIi8+JzsKLQkJCQkJdmFyIGltZ1BhdGggPSAnPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRpbWFnZVBhdGgiLz4nOwotCQkJCQl2YXIgbm9kZUluZm89bnVsbDsKLQkJCQkJY29udGVudFBhZ2UucHJlbG9hZChpbWdQYXRoLCBiYWNrUGF0aCwgbm9kZUluZm8sICAnJywgZmFsc2UsIGZhbHNlLCBmYWxzZSk7Ci0JCQkJPC9zY3JpcHQ+Ci0JCQk8L2hlYWQ+Ci0JCQk8Ym9keT4KLQkJCTxkaXYgaWQ9ImJyZWFkY3J1bWJzIj48L2Rpdj4KLQkJCQk8dGFibGUgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLQkJCQkJPHRyPgotCQkJCQkJPHRkIHZhbGlnbj0idG9wIj4KLQkJCQkJCQk8YSBuYW1lPSJUb3AiLz4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0ib3ZlcnZpZXciPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudFR5cGUiIHNlbGVjdD0iJGVsZW1lbnRUeXBlIi8+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50VHlwZU5hbWUiIHNlbGVjdD0iJGVsZW1lbnRUeXBlTmFtZSIvPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudFByZXNlbnRhdGlvbk5hbWUiIHNlbGVjdD0iJGVsZW1lbnRQcmVzZW50YXRpb25OYW1lIi8+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50SWNvbiIgc2VsZWN0PSIkc2hhcGVJbWFnZSIvPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iYmFja1BhdGgiIHNlbGVjdD0iJGJhY2tQYXRoIi8+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJzaG93VHJlZUJyb3dzZXIiIHNlbGVjdD0iJHNob3dUcmVlQnJvd3NlciIvPgotCQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InB1cnBvc2VTZWN0aW9uIj4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImRlc2NyaXB0aW9uIiBzZWxlY3Q9IiRvdXRjb21lRGVzY3JpcHRpb24iLz4KLQkJCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJyZWxhdGlvbnNoaXBzU2VjdGlvbiIvPgotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJtYWluRGVzY3JpcHRpb25TZWN0aW9uIj4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImRlc2NyaXB0aW9uIiBzZWxlY3Q9IiRvdXRjb21lRGVzY3JpcHRpb24iLz4KLQkJCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJ3b3JrUHJvZHVjdElsbHVzdHJhdGlvbnNTZWN0aW9uIi8+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImtleUNvbnNpZGVyYXRpb25zU2VjdGlvbiI+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJkZXNjcmlwdGlvbiIgc2VsZWN0PSIkb3V0Y29tZURlc2NyaXB0aW9uIi8+Ci0JCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0idGFpbG9yaW5nU2VjdGlvbiI+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJkZXNjcmlwdGlvbiIgc2VsZWN0PSIkb3V0Y29tZURlc2NyaXB0aW9uIi8+Ci0JCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0ibW9yZUluZm9TZWN0aW9uIi8+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImNvcHlyaWdodCI+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJjb3B5cmlnaHQiIHNlbGVjdD0iJGNvcHlyaWdodCIvPgotCQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQk8L3RkPgkJCQkJCQotCQkJCQk8L3RyPgotCQkJCTwvdGFibGU+Ci0JCQk8L2JvZHk+Ci0JCQk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPgotCQkJCWNvbnRlbnRQYWdlLm9ubG9hZCgpOwotCQkJPC9zY3JpcHQ+Ci0JCTwvaHRtbD4KLQk8L3hzbDp0ZW1wbGF0ZT4KLQotPC94c2w6c3R5bGVzaGVldD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC94c2wvb3ZlcnZpZXcueHNsIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L3hzbC9vdmVydmlldy54c2wKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjZWE3ODguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L3hzbC9vdmVydmlldy54c2wKKysrIC9kZXYvbnVsbApAQCAtMSw2MjUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotCi08eHNsOnN0eWxlc2hlZXQgdmVyc2lvbj0iMS4wIgotCXhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIgotCXhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiPgotCi0JPHhzbDp0ZW1wbGF0ZSBuYW1lPSJvdmVydmlldyI+Ci0JCTx4c2w6cGFyYW0gbmFtZT0iZWxlbWVudFR5cGUiLz4KLQkJPHhzbDpwYXJhbSBuYW1lPSJlbGVtZW50VHlwZU5hbWUiLz4KLQkJPHhzbDpwYXJhbSBuYW1lPSJlbGVtZW50UHJlc2VudGF0aW9uTmFtZSIvPgotCQk8eHNsOnBhcmFtIG5hbWU9ImVsZW1lbnRJY29uIi8+Ci0JCTx4c2w6cGFyYW0gbmFtZT0iYmFja1BhdGgiLz4KLQkJPHhzbDpwYXJhbSBuYW1lPSJzaG93VHJlZUJyb3dzZXIiLz4KLQkJPHhzbDpwYXJhbSBuYW1lPSJ3b3JrUHJvZHVjdFR5cGUiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJwcmVmaXgiIHNlbGVjdD0iYXR0cmlidXRlW0BuYW1lPSdwcmVmaXgnXSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImJyaWVmRGVzY3JpcHRpb24iIHNlbGVjdD0iYXR0cmlidXRlW0BuYW1lPSdicmllZkRlc2NyaXB0aW9uJ10iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJzeW5vbnltcyIgc2VsZWN0PSJyZWZlcmVuY2UvRWxlbWVudC9hdHRyaWJ1dGVbQG5hbWU9J3N5bm9ueW1zJ10iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJleHRlcm5hbElkIiBzZWxlY3Q9InJlZmVyZW5jZS9FbGVtZW50L2F0dHJpYnV0ZVtAbmFtZT0nZXh0ZXJuYWxJZCddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iaW1hZ2VQYXRoIiBzZWxlY3Q9ImNvbmNhdCgvRWxlbWVudC9AQmFja1BhdGgsICdpbWFnZXMvJykiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJzaG93RnVsbE1ldGhvZENvbnRlbnQiIHNlbGVjdD0iQFNob3dGdWxsTWV0aG9kQ29udGVudCIvPgotCQk8ZGl2IGlkPSJwYWdlLWd1aWQiPgotCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0idmFsdWUiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJhdHRyaWJ1dGVbQG5hbWU9J2d1aWQnXSIvPjwveHNsOmF0dHJpYnV0ZT4KLQkJPC9kaXY+Ci0JCTx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotCQkJPHRyPgotCQkJCTx0ZCBjbGFzcz0icGFnZVRpdGxlIiBub3dyYXA9InRydWUiPgotCQkJCQk8eHNsOmNob29zZT4KLQkJCQkJCTx4c2w6d2hlbiB0ZXN0PSIkZWxlbWVudFR5cGUgPSAnQ3VzdG9tQ2F0ZWdvcnknIG9yICRlbGVtZW50VHlwZSA9ICdTdXBwb3J0aW5nTWF0ZXJpYWwnIG9yICRlbGVtZW50VHlwZSA9ICdTdW1tYXJ5JyI+Ci0JCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50UHJlc2VudGF0aW9uTmFtZSIvPgotCQkJCQkJPC94c2w6d2hlbj4KLQkJCQkJCTx4c2w6b3RoZXJ3aXNlPgkJCQkJCQkKLQkJCQkJCQk8eHNsOmNob29zZT4KLQkJCQkJCQkJPHhzbDp3aGVuIHRlc3Q9IiRzaG93RnVsbE1ldGhvZENvbnRlbnQgPSAndHJ1ZSciPgotCQkJCQkJCQkJPHhzbDpjaG9vc2U+CQkJCQkJCQkJCQotCQkJCQkJCQkJCTx4c2w6d2hlbiB0ZXN0PSIkZWxlbWVudFR5cGUgPSAnVGFza0Rlc2NyaXB0b3InIj4KLQkJCQkJCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR0YXNrVGV4dCIvPgotCQkJCQkJCQkJCTwveHNsOndoZW4+Ci0JCQkJCQkJCQkJPHhzbDp3aGVuIHRlc3Q9IiRlbGVtZW50VHlwZSA9ICdSb2xlRGVzY3JpcHRvciciPgotCQkJCQkJCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHJvbGVUZXh0Ii8+Ci0JCQkJCQkJCQkJPC94c2w6d2hlbj4KLQkJCQkJCQkJCQk8eHNsOndoZW4gdGVzdD0iJGVsZW1lbnRUeXBlID0gJ1dvcmtQcm9kdWN0RGVzY3JpcHRvciciPgotCQkJCQkJCQkJCQk8eHNsOmNob29zZT4KLQkJCQkJCQkJCQkJCTx4c2w6d2hlbiB0ZXN0PSIkd29ya1Byb2R1Y3RUeXBlICE9ICcnIj4KLQkJCQkJCQkJCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iY29uY2F0KCR3b3JrUHJvZHVjdFRleHQsICcgKCcsICR3b3JrUHJvZHVjdFR5cGUsICcpJykiLz4KLQkJCQkJCQkJCQkJCTwveHNsOndoZW4+Ci0JCQkJCQkJCQkJCQk8eHNsOm90aGVyd2lzZT4KLQkJCQkJCQkJCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHdvcmtQcm9kdWN0VGV4dCIvPgotCQkJCQkJCQkJCQkJPC94c2w6b3RoZXJ3aXNlPgkKLQkJCQkJCQkJCQkJPC94c2w6Y2hvb3NlPgkJCQkJCQkJCQkJCi0JCQkJCQkJCQkJPC94c2w6d2hlbj4KLQkJCQkJCQkJCQk8eHNsOm90aGVyd2lzZT4KLQkJCQkJCQkJCQk8IS0tCi0JCQkJCQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudFR5cGVOYW1lIi8+Ci0JCQkJCQkJCQkJLS0+Ci0JCQkJCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJlbGVtZW50VHlwZVRleHQiPgotCQkJCQkJCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudFR5cGUiIHNlbGVjdD0iJGVsZW1lbnRUeXBlIi8+Ci0JCQkJCQkJCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50VHlwZU5hbWUiIHNlbGVjdD0iJGVsZW1lbnRUeXBlTmFtZSIvPgotCQkJCQkJCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQkJCQkJCTwveHNsOm90aGVyd2lzZT4KLQkJCQkJCQkJCTwveHNsOmNob29zZT4JCQkJCQkJCQkKLQkJCQkJCQkJPC94c2w6d2hlbj4KLQkJCQkJCQkJPHhzbDpvdGhlcndpc2U+Ci0JCQkJCQkJCQkJPCEtLQotCQkJCQkJCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVsZW1lbnRUeXBlTmFtZSIvPgotCQkJCQkJCQkJCS0tPgotCQkJCQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iZWxlbWVudFR5cGVUZXh0Ij4KLQkJCQkJCQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnRUeXBlIiBzZWxlY3Q9IiRlbGVtZW50VHlwZSIvPgotCQkJCQkJCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudFR5cGVOYW1lIiBzZWxlY3Q9IiRlbGVtZW50VHlwZU5hbWUiLz4KLQkJCQkJCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCQkJPC94c2w6b3RoZXJ3aXNlPgotCQkJCQkJCTwveHNsOmNob29zZT4KLQkJCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGNvbG9uX3dpdGhfc3BhY2UiLz4KLQkJCQkJCQk8eHNsOmNob29zZT4KLQkJCQkJCQkJPHhzbDp3aGVuIHRlc3Q9IiRwcmVmaXggIT0gJyciPgotCQkJCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcmVmaXgiLz4gLSA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVsZW1lbnRQcmVzZW50YXRpb25OYW1lIi8+Ci0JCQkJCQkJCTwveHNsOndoZW4+Ci0JCQkJCQkJCTx4c2w6b3RoZXJ3aXNlPgotCQkJCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50UHJlc2VudGF0aW9uTmFtZSIvPgotCQkJCQkJCQk8L3hzbDpvdGhlcndpc2U+Ci0JCQkJCQkJPC94c2w6Y2hvb3NlPgotCQkJCQkJPC94c2w6b3RoZXJ3aXNlPgkJCQkJCQotCQkJCQk8L3hzbDpjaG9vc2U+Ci0JCQkJCTx4c2w6aWYgdGVzdD0iJGV4dGVybmFsSWQgIT0gJyciPgotCQkJCQkJKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZXh0ZXJuYWxJZCIvPikKLQkJCQkJPC94c2w6aWY+Ci0JCQkJPC90ZD4KLQkJCQk8dGQgd2lkdGg9IjEwMCUiPgotCQkJCQk8ZGl2IGFsaWduPSJyaWdodCIgaWQ9ImNvbnRlbnRQYWdlVG9vbGJhciIvPgotCQkJCTwvdGQ+Ci0JCQkJPHhzbDppZiB0ZXN0PSIkc2hvd1RyZWVCcm93c2VyIj4KLQkJCQkJPHRkIHdpZHRoPSIxMDAlIiBjbGFzcz0iZXhwYW5kQ29sbGFwc2VMaW5rIiBhbGlnbj0icmlnaHQiPgotCQkJCQkJPGEgbmFtZT0ibWFpbkluZGV4IiBocmVmPSJ7JGJhY2tQYXRofWluZGV4Lmh0bSIvPgotCQkJCQkJPHNjcmlwdCBsYW5ndWFnZT0iSmF2YVNjcmlwdCIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9InskYmFja1BhdGh9c2NyaXB0cy90cmVlYnJvd3Nlci5qcyIvPgotCQkJCQk8L3RkPgotCQkJCTwveHNsOmlmPgotCQkJPC90cj4KLQkJPC90YWJsZT4KLQkJPHRhYmxlIHdpZHRoPSIxMDAlIiBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCI+Ci0JCQk8dHI+Ci0JCQkJPHRkIGNsYXNzPSJwYWdlVGl0bGVTZXBhcmF0b3IiPgotCQkJCQk8aW1nIHNyYz0ieyRpbWFnZVBhdGh9c2hpbS5naWYiIGFsdD0iIiB0aXRsZT0iIiBoZWlnaHQ9IjEiLz4KLQkJCQk8L3RkPgotCQkJPC90cj4KLQkJPC90YWJsZT4KLQkJPHhzbDpjaG9vc2U+Ci0JCQk8eHNsOndoZW4gdGVzdD0iJGVsZW1lbnRUeXBlID0gJ0N1c3RvbUNhdGVnb3J5JyBhbmQgJGJyaWVmRGVzY3JpcHRpb24gPSAnJyI+Ci0JCQkJPGJyLz4KLQkJCTwveHNsOndoZW4+Ci0JCQk8eHNsOm90aGVyd2lzZT4KLQkJCQk8ZGl2IGNsYXNzPSJvdmVydmlldyI+Ci0JCQkJCTx0YWJsZSB3aWR0aD0iOTclIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+Ci0JCQkJCQk8dHI+Ci0JCQkJCQkJPHhzbDppZiB0ZXN0PSIkYnJpZWZEZXNjcmlwdGlvbiAhPSAnJyI+Ci0JCQkJCQkJCTx0ZCB3aWR0aD0iNTAiPgotCQkJCQkJCQkJPGltZyBzcmM9InskZWxlbWVudEljb259IiBhbHQ9IiIgdGl0bGU9IiIvPgotCQkJCQkJCQk8L3RkPgotCQkJCQkJCTwveHNsOmlmPgotCQkJCQkJCTx0ZD4KLQkJCQkJCQkJPHRhYmxlIGNsYXNzPSJvdmVydmlld1RhYmxlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+Ci0JCQkJCQkJCQk8dHI+Ci0JCQkJCQkJCQkJPHRkIHZhbGlnbj0idG9wIj4KLQkJCQkJCQkJCQkJPHhzbDp2YWx1ZS1vZiBkaXNhYmxlLW91dHB1dC1lc2NhcGluZz0ieWVzIiBzZWxlY3Q9IiRicmllZkRlc2NyaXB0aW9uIi8+Ci0JCQkJCQkJCQkJPC90ZD4KLQkJCQkJCQkJCTwvdHI+Ci0JCQkJCQkJCQk8eHNsOmNob29zZT4KLQkJCQkJCQkJCQk8eHNsOndoZW4gdGVzdD0iJGVsZW1lbnRUeXBlID0gJ1JvbGUnIj4KLQkJCQkJCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InJvbGVLZXlJbmZvIi8+Ci0JCQkJCQkJCQkJPC94c2w6d2hlbj4KLQkJCQkJCQkJCQk8eHNsOndoZW4gdGVzdD0iJGVsZW1lbnRUeXBlID0gJ1Rhc2snIj4KLQkJCQkJCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InRhc2tLZXlJbmZvIi8+Ci0JCQkJCQkJCQkJPC94c2w6d2hlbj4KLQkJCQkJCQkJCQk8eHNsOndoZW4gdGVzdD0iJGVsZW1lbnRUeXBlID0gJ0FydGlmYWN0JyBvciAkZWxlbWVudFR5cGUgPSAnRGVsaXZlcmFibGUnIG9yICRlbGVtZW50VHlwZSA9ICdPdXRjb21lJyI+Ci0JCQkJCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJ3b3JrUHJvZHVjdEtleUluZm8iLz4KLQkJCQkJCQkJCQk8L3hzbDp3aGVuPgotCQkJCQkJCQkJCTx4c2w6d2hlbiB0ZXN0PSIkZWxlbWVudFR5cGUgPSAnVG9vbE1lbnRvciciPgotCQkJCQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0idG9vbE1lbnRvcktleUluZm8iLz4KLQkJCQkJCQkJCQk8L3hzbDp3aGVuPgotCQkJCQkJCQkJCTx4c2w6d2hlbiB0ZXN0PSIkZWxlbWVudFR5cGUgPSAnVGFza0Rlc2NyaXB0b3InIj4KLQkJCQkJCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InRhc2tEZXNjcmlwdG9yS2V5SW5mbyI+Ci0JCQkJCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0ic2hvd0Z1bGxNZXRob2RDb250ZW50IiBzZWxlY3Q9IiRzaG93RnVsbE1ldGhvZENvbnRlbnQiLz4KLQkJCQkJCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCQkJCQk8L3hzbDp3aGVuPgotCQkJCQkJCQkJCTx4c2w6d2hlbiB0ZXN0PSIkZWxlbWVudFR5cGUgPSAnUm9sZURlc2NyaXB0b3InIj4KLQkJCQkJCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InJvbGVEZXNjcmlwdG9yS2V5SW5mbyI+Ci0JCQkJCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0ic2hvd0Z1bGxNZXRob2RDb250ZW50IiBzZWxlY3Q9IiRzaG93RnVsbE1ldGhvZENvbnRlbnQiLz4KLQkJCQkJCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCQkJCQk8L3hzbDp3aGVuPgotCQkJCQkJCQkJCTx4c2w6d2hlbiB0ZXN0PSIkZWxlbWVudFR5cGUgPSAnV29ya1Byb2R1Y3REZXNjcmlwdG9yJyI+Ci0JCQkJCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJ3b3JrUHJvZHVjdERlc2NyaXB0b3JLZXlJbmZvIj4KLQkJCQkJCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJzaG93RnVsbE1ldGhvZENvbnRlbnQiIHNlbGVjdD0iJHNob3dGdWxsTWV0aG9kQ29udGVudCIvPgotCQkJCQkJCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQkJCQkJCTwveHNsOndoZW4+Ci0JCQkJCQkJCQkJPHhzbDpvdGhlcndpc2U+Ci0JCQkJCQkJCQkJCTx4c2w6dmFyaWFibGUgbmFtZT0iYmFzZUVsZW1lbnQiIHNlbGVjdD0icmVmZXJlbmNlW0BuYW1lPSd2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50J10vRWxlbWVudCIvPgotCQkJCQkJCQkJCQk8eHNsOnZhcmlhYmxlIG5hbWU9InZhcmlhYmlsaXR5VHlwZSIgc2VsZWN0PSJhdHRyaWJ1dGVbQG5hbWU9J3ZhcmlhYmlsaXR5VHlwZSddIi8+Ci0JCQkJCQkJCQkJCTx4c2w6aWYgdGVzdD0iY291bnQoJGJhc2VFbGVtZW50KSA+IDAiPgotCQkJCQkJCQkJCQkJPHRyPgotCQkJCQkJCQkJCQkJCTx0ZCB2YWxpZ249InRvcCI+Ci0JCQkJCQkJCQkJCQkJCTx4c2w6aWYgdGVzdD0iJHZhcmlhYmlsaXR5VHlwZSA9ICdyZXBsYWNlcyciPgotCQkJCQkJCQkJCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRyZXBsYWNlc1RleHQiLz4KLQkJCQkJCQkJCQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkY29sb25fd2l0aF9zcGFjZSIvPgotCQkJCQkJCQkJCQkJCQk8L3hzbDppZj4KLQkJCQkJCQkJCQkJCQkJPHhzbDppZiB0ZXN0PSIkdmFyaWFiaWxpdHlUeXBlID0gJ2NvbnRyaWJ1dGVzJyAiPgotCQkJCQkJCQkJCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRjb250cmlidXRlc1RleHQiLz4KLQkJCQkJCQkJCQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkY29sb25fd2l0aF9zcGFjZSIvPgotCQkJCQkJCQkJCQkJCQk8L3hzbDppZj4KLQkJCQkJCQkJCQkJCQkJPHhzbDppZiB0ZXN0PSIkdmFyaWFiaWxpdHlUeXBlID0gJ2V4dGVuZHNSZXBsYWNlcycgIj4KLQkJCQkJCQkJCQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZXh0ZW5kc1JlcGxhY2VzVGV4dCIvPgotCQkJCQkJCQkJCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRjb2xvbl93aXRoX3NwYWNlIi8+Ci0JCQkJCQkJCQkJCQkJCTwveHNsOmlmPgotCQkJCQkJCQkJCQkJCQk8IS0tIGRpc3BsYXkgbG9jYWxDT250cmlidXRpb24gYW5kIGxvY2FsUmVwbGFjZW1lbnQgYXMgZXh0ZW5kcyBmb3Igbm93IC0tPgotCQkJCQkJCQkJCQkJCQk8eHNsOmlmIHRlc3Q9IiR2YXJpYWJpbGl0eVR5cGUgPSAnZXh0ZW5kcycgb3IgJHZhcmlhYmlsaXR5VHlwZSA9ICdsb2NhbENvbnRyaWJ1dGlvbicgb3IgJHZhcmlhYmlsaXR5VHlwZSA9ICdsb2NhbFJlcGxhY2VtZW50JyAiPgotCQkJCQkJCQkJCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRleHRlbmRzVGV4dCIvPgotCQkJCQkJCQkJCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRjb2xvbl93aXRoX3NwYWNlIi8+Ci0JCQkJCQkJCQkJCQkJCTwveHNsOmlmPgotCQkJCQkJCQkJCQkJCQk8eHNsOmZvci1lYWNoIHNlbGVjdD0iJGJhc2VFbGVtZW50Ij4KLQkJCQkJCQkJCQkJCQkJPHhzbDpzb3J0IHNlbGVjdD0iQERpc3BsYXlOYW1lIi8+Ci0JCQkJCQkJCQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWRkRWxlbWVudFdpdGhMaW5rIj4KLQkJCQkJCQkJCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudCIgc2VsZWN0PSIuIi8+Ci0JCQkJCQkJCQkJCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQkJCQkJCQkJCQk8L3hzbDpmb3ItZWFjaD4KLQkJCQkJCQkJCQkJCQk8L3RkPgotCQkJCQkJCQkJCQkJPC90cj4KLQkJCQkJCQkJCQkJPC94c2w6aWY+Ci0JCQkJCQkJCQkJPC94c2w6b3RoZXJ3aXNlPgotCQkJCQkJCQkJPC94c2w6Y2hvb3NlPgotCQkJCQkJCQk8L3RhYmxlPgotCQkJCQkJCTwvdGQ+Ci0JCQkJCQk8L3RyPgotCQkJCQk8L3RhYmxlPgotCQkJCTwvZGl2PgotCQkJPC94c2w6b3RoZXJ3aXNlPgotCQk8L3hzbDpjaG9vc2U+Ci0JPC94c2w6dGVtcGxhdGU+Ci0KLQk8eHNsOnRlbXBsYXRlIG5hbWU9ImVsZW1lbnRUeXBlVGV4dCI+Ci0JCTx4c2w6cGFyYW0gbmFtZT0iZWxlbWVudFR5cGUiLz4KLQkJPHhzbDpwYXJhbSBuYW1lPSJlbGVtZW50VHlwZU5hbWUiLz4KLQkJPHhzbDpjaG9vc2U+CQkJCQkJCQkJCQotCQkJPHhzbDp3aGVuIHRlc3Q9IiRlbGVtZW50VHlwZSA9ICdBY3Rpdml0eSciPgotCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGFjdGl2aXR5VGV4dCIvPgotCQkJPC94c2w6d2hlbj4KLQkJCTx4c2w6d2hlbiB0ZXN0PSIkZWxlbWVudFR5cGUgPSAnQXJ0aWZhY3QnIj4KLQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRhcnRpZmFjdFRleHQiLz4KLQkJCTwveHNsOndoZW4+Ci0JCQk8eHNsOndoZW4gdGVzdD0iJGVsZW1lbnRUeXBlID0gJ0NhcGFiaWxpdHlQYXR0ZXJuJyI+Ci0JCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkY2FwYWJpbGl0eVBhdHRlcm5UZXh0Ii8+Ci0JCQk8L3hzbDp3aGVuPgotCQkJPHhzbDp3aGVuIHRlc3Q9IiRlbGVtZW50VHlwZSA9ICdDaGVja2xpc3QnIj4KLQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRjaGVja2xpc3RUZXh0Ii8+Ci0JCQk8L3hzbDp3aGVuPgotCQkJPHhzbDp3aGVuIHRlc3Q9IiRlbGVtZW50VHlwZSA9ICdDb21wb3NpdGVSb2xlJyI+Ci0JCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkY29tcG9zaXRlUm9sZVRleHQiLz4KLQkJCTwveHNsOndoZW4+Ci0JCQk8eHNsOndoZW4gdGVzdD0iJGVsZW1lbnRUeXBlID0gJ0NvbmNlcHQnIj4KLQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRjb25jZXB0VGV4dCIvPgotCQkJPC94c2w6d2hlbj4KLQkJCTx4c2w6d2hlbiB0ZXN0PSIkZWxlbWVudFR5cGUgPSAnQ3VzdG9tQ2F0ZWdvcnknIj4KLQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRjdXN0b21DYXRlZ29yeVRleHQiLz4KLQkJCTwveHNsOndoZW4+Ci0JCQk8eHNsOndoZW4gdGVzdD0iJGVsZW1lbnRUeXBlID0gJ0RlbGl2ZXJhYmxlJyI+Ci0JCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZGVsaXZlcmFibGVUZXh0Ii8+Ci0JCQk8L3hzbDp3aGVuPgotCQkJPHhzbDp3aGVuIHRlc3Q9IiRlbGVtZW50VHlwZSA9ICdEZWxpdmVyeVByb2Nlc3MnIj4KLQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRkZWxpdmVyeVByb2Nlc3NUZXh0Ii8+Ci0JCQk8L3hzbDp3aGVuPgotCQkJPHhzbDp3aGVuIHRlc3Q9IiRlbGVtZW50VHlwZSA9ICdEaXNjaXBsaW5lJyI+Ci0JCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZGlzY2lwbGluZVRleHQiLz4KLQkJCTwveHNsOndoZW4+Ci0JCQk8eHNsOndoZW4gdGVzdD0iJGVsZW1lbnRUeXBlID0gJ0Rpc2NpcGxpbmVHcm91cGluZyciPgotCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGRpc2NpcGxpbmVHcm91cGluZ1RleHQiLz4KLQkJCTwveHNsOndoZW4+Ci0JCQk8eHNsOndoZW4gdGVzdD0iJGVsZW1lbnRUeXBlID0gJ0RvbWFpbiciPgotCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGRvbWFpblRleHQiLz4KLQkJCTwveHNsOndoZW4+Ci0JCQkKLQkJCTx4c2w6d2hlbiB0ZXN0PSIkZWxlbWVudFR5cGUgPSAnRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zJyI+Ci0JCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zVGV4dCIvPgotCQkJPC94c2w6d2hlbj4KLQkJCTx4c2w6d2hlbiB0ZXN0PSIkZWxlbWVudFR5cGUgPSAnRXhhbXBsZSciPgotCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGV4YW1wbGVUZXh0Ii8+Ci0JCQk8L3hzbDp3aGVuPgotCQkJPHhzbDp3aGVuIHRlc3Q9IiRlbGVtZW50VHlwZSA9ICdHdWlkZWxpbmUnIj4KLQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRndWlkZWxpbmVUZXh0Ii8+Ci0JCQk8L3hzbDp3aGVuPgotCQkJPHhzbDp3aGVuIHRlc3Q9IiRlbGVtZW50VHlwZSA9ICdJdGVyYXRpb24nIj4KLQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRpdGVyYXRpb25UZXh0Ii8+Ci0JCQk8L3hzbDp3aGVuPgotCQkJPHhzbDp3aGVuIHRlc3Q9IiRlbGVtZW50VHlwZSA9ICdNaWxlc3RvbmUnIj4KLQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRtaWxlc3RvbmVUZXh0Ii8+Ci0JCQk8L3hzbDp3aGVuPgotCQkJPHhzbDp3aGVuIHRlc3Q9IiRlbGVtZW50VHlwZSA9ICdPdXRjb21lJyI+Ci0JCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkb3V0Y29tZVRleHQiLz4KLQkJCTwveHNsOndoZW4+Ci0JCQk8eHNsOndoZW4gdGVzdD0iJGVsZW1lbnRUeXBlID0gJ1BoYXNlJyI+Ci0JCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcGhhc2VUZXh0Ii8+Ci0JCQk8L3hzbDp3aGVuPgotCQkJPHhzbDp3aGVuIHRlc3Q9IiRlbGVtZW50VHlwZSA9ICdQcmFjdGljZSciPgotCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByYWN0aWNlVGV4dCIvPgotCQkJPC94c2w6d2hlbj4KLQkJCTx4c2w6d2hlbiB0ZXN0PSIkZWxlbWVudFR5cGUgPSAnUmVwb3J0JyI+Ci0JCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcmVwb3J0VGV4dCIvPgotCQkJPC94c2w6d2hlbj4KLQkJCTx4c2w6d2hlbiB0ZXN0PSIkZWxlbWVudFR5cGUgPSAnUmV1c2FibGVBc3NldCciPgotCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHJldXNhYmxlQXNzZXRUZXh0Ii8+Ci0JCQk8L3hzbDp3aGVuPgotCQkJPHhzbDp3aGVuIHRlc3Q9IiRlbGVtZW50VHlwZSA9ICdSb2FkbWFwJyI+Ci0JCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcm9hZG1hcFRleHQiLz4KLQkJCTwveHNsOndoZW4+Ci0JCQk8eHNsOndoZW4gdGVzdD0iJGVsZW1lbnRUeXBlID0gJ1JvbGUnIj4KLQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRyb2xlVGV4dCIvPgotCQkJPC94c2w6d2hlbj4KLQkJCTx4c2w6d2hlbiB0ZXN0PSIkZWxlbWVudFR5cGUgPSAnUm9sZURlc2NyaXB0b3InIj4KLQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRyb2xlRGVzY3JpcHRvclRleHQiLz4KLQkJCTwveHNsOndoZW4+Ci0JCQk8eHNsOndoZW4gdGVzdD0iJGVsZW1lbnRUeXBlID0gJ1JvbGVTZXQnIj4KLQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRyb2xlU2V0VGV4dCIvPgotCQkJPC94c2w6d2hlbj4KLQkJCTx4c2w6d2hlbiB0ZXN0PSIkZWxlbWVudFR5cGUgPSAnUm9sZVNldEdyb3VwaW5nJyI+Ci0JCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcm9sZVNldEdyb3VwaW5nVGV4dCIvPgotCQkJPC94c2w6d2hlbj4KLQkJCTx4c2w6d2hlbiB0ZXN0PSIkZWxlbWVudFR5cGUgPSAnU3VwcG9ydGluZ01hdGVyaWFsJyI+Ci0JCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkc3VwcG9ydGluZ01hdGVyaWFsVGV4dCIvPgotCQkJPC94c2w6d2hlbj4KLQkJCTx4c2w6d2hlbiB0ZXN0PSIkZWxlbWVudFR5cGUgPSAnVGFzayciPgotCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHRhc2tUZXh0Ii8+Ci0JCQk8L3hzbDp3aGVuPgotCQkJPHhzbDp3aGVuIHRlc3Q9IiRlbGVtZW50VHlwZSA9ICdUYXNrRGVzY3JpcHRvciciPgotCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHRhc2tEZXNjcmlwdG9yVGV4dCIvPgotCQkJPC94c2w6d2hlbj4KLQkJCTx4c2w6d2hlbiB0ZXN0PSIkZWxlbWVudFR5cGUgPSAnVGVhbVByb2ZpbGUnIj4KLQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR0ZWFtUHJvZmlsZVRleHQiLz4KLQkJCTwveHNsOndoZW4+Ci0JCQk8eHNsOndoZW4gdGVzdD0iJGVsZW1lbnRUeXBlID0gJ1RlbXBsYXRlJyI+Ci0JCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdGVtcGxhdGVUZXh0Ii8+Ci0JCQk8L3hzbDp3aGVuPgotCQkJPHhzbDp3aGVuIHRlc3Q9IiRlbGVtZW50VHlwZSA9ICdUZXJtRGVmaW5pdGlvbiciPgotCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHRlcm1EZWZpbml0aW9uVGV4dCIvPgotCQkJPC94c2w6d2hlbj4KLQkJCTx4c2w6d2hlbiB0ZXN0PSIkZWxlbWVudFR5cGUgPSAnVG9vbCciPgotCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHRvb2xUZXh0Ii8+Ci0JCQk8L3hzbDp3aGVuPgotCQkJPHhzbDp3aGVuIHRlc3Q9IiRlbGVtZW50VHlwZSA9ICdUb29sTWVudG9yJyI+Ci0JCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdG9vbE1lbnRvclRleHQiLz4KLQkJCTwveHNsOndoZW4+Ci0JCQk8eHNsOndoZW4gdGVzdD0iJGVsZW1lbnRUeXBlID0gJ1doaXRlcGFwZXInIj4KLQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR3aGl0ZXBhcGVyVGV4dCIvPgotCQkJPC94c2w6d2hlbj4KLQkJCTx4c2w6d2hlbiB0ZXN0PSIkZWxlbWVudFR5cGUgPSAnV29ya1Byb2R1Y3REZXNjcmlwdG9yJyI+Ci0JCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkd29ya1Byb2R1Y3REZXNjcmlwdG9yVGV4dCIvPgotCQkJPC94c2w6d2hlbj4KLQkJCTx4c2w6d2hlbiB0ZXN0PSIkZWxlbWVudFR5cGUgPSAnV29ya1Byb2R1Y3RUeXBlJyI+Ci0JCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkd29ya1Byb2R1Y3RUeXBlVGV4dCIvPgotCQkJPC94c2w6d2hlbj4KLQkJCTx4c2w6d2hlbiB0ZXN0PSIkZWxlbWVudFR5cGUgPSAnV29ya1Byb2R1Y3RTbG90JyI+Ci0JCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkd29ya1Byb2R1Y3RTbG90VGV4dCIvPgotCQkJPC94c2w6d2hlbj4KLQkJCTx4c2w6b3RoZXJ3aXNlPgotCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVsZW1lbnRUeXBlTmFtZSIvPgotCQkJPC94c2w6b3RoZXJ3aXNlPgotCQk8L3hzbDpjaG9vc2U+CQotCTwveHNsOnRlbXBsYXRlPgotCQotCTx4c2w6dGVtcGxhdGUgbmFtZT0icm9sZUtleUluZm8iPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InN5bm9ueW1zIiBzZWxlY3Q9InJlZmVyZW5jZS9FbGVtZW50L2F0dHJpYnV0ZVtAbmFtZT0nc3lub255bXMnXSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImJhc2VSb2xlIiBzZWxlY3Q9InJlZmVyZW5jZVtAbmFtZT0ndmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCddL0VsZW1lbnRbQFR5cGU9J1JvbGUnXSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InJvbGVTZXRzIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3RbQG5hbWU9J3JvbGVTZXRzJ10vRWxlbWVudFtAVHlwZT0nUm9sZVNldCddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0idmFyaWFiaWxpdHlUeXBlIiBzZWxlY3Q9ImF0dHJpYnV0ZVtAbmFtZT0ndmFyaWFiaWxpdHlUeXBlJ10iLz4KLQkJPHhzbDppZiB0ZXN0PSIkc3lub255bXMgIT0gJyciPgotCQkJPHRyPgotCQkJCTx0ZD4KLQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRzeW5vbnltc1RleHQiLz4KLQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRjb2xvbl93aXRoX3NwYWNlIi8+Ci0JCQkJCTx4c2w6dmFsdWUtb2YgZGlzYWJsZS1vdXRwdXQtZXNjYXBpbmc9InllcyIgc2VsZWN0PSIkc3lub255bXMiLz4KLQkJCQk8L3RkPgotCQkJPC90cj4KLQkJPC94c2w6aWY+Ci0JCTx4c2w6aWYgdGVzdD0iY291bnQoJGJhc2VSb2xlKSA+IDAiPgotCQkJPHRyPgotCQkJCTx0ZD4KLQkJCQkJPHhzbDppZiB0ZXN0PSIkdmFyaWFiaWxpdHlUeXBlID0gJ3JlcGxhY2VzJyI+Ci0JCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHJlcGxhY2VzVGV4dCIvPgotCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRjb2xvbl93aXRoX3NwYWNlIi8+Ci0JCQkJCTwveHNsOmlmPgotCQkJCQk8eHNsOmlmIHRlc3Q9IiR2YXJpYWJpbGl0eVR5cGUgPSAnY29udHJpYnV0ZXMnIj4KLQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkY29udHJpYnV0ZXNUZXh0Ii8+Ci0JCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGNvbG9uX3dpdGhfc3BhY2UiLz4KLQkJCQkJPC94c2w6aWY+Ci0JCQkJCTx4c2w6aWYgdGVzdD0iJHZhcmlhYmlsaXR5VHlwZSA9ICdleHRlbmRzUmVwbGFjZXMnIj4KLQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZXh0ZW5kc1JlcGxhY2VzVGV4dCIvPgotCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRjb2xvbl93aXRoX3NwYWNlIi8+CQkJCQkJCi0JCQkJCTwveHNsOmlmPgotCQkJCQk8eHNsOmlmIHRlc3Q9IiR2YXJpYWJpbGl0eVR5cGUgPSAnZXh0ZW5kcyciPgotCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRleHRlbmRzVGV4dCIvPgotCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRjb2xvbl93aXRoX3NwYWNlIi8+Ci0JCQkJCTwveHNsOmlmPgotCQkJCQk8eHNsOmZvci1lYWNoIHNlbGVjdD0iJGJhc2VSb2xlIj4KLQkJCQkJPHhzbDpzb3J0IHNlbGVjdD0iQERpc3BsYXlOYW1lIi8+Ci0JCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWRkRWxlbWVudFdpdGhMaW5rIj4KLQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudCIgc2VsZWN0PSIuIi8+Ci0JCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQk8L3hzbDpmb3ItZWFjaD4KLQkJCQk8L3RkPgotCQkJPC90cj4KLQkJPC94c2w6aWY+Ci0JCTx4c2w6aWYgdGVzdD0iY291bnQoJHJvbGVTZXRzKSA+IDAiPgotCQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJzaXplIiBzZWxlY3Q9ImNvdW50KCRyb2xlU2V0cykiLz4KLQkJCTx0cj4KLQkJCQk8dGQ+Ci0JCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcm9sZVNldHNUZXh0Ii8+Ci0JCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkY29sb25fd2l0aF9zcGFjZSIvPgotCQkJCQk8eHNsOmZvci1lYWNoIHNlbGVjdD0iJHJvbGVTZXRzIj4KLQkJCQkJPHhzbDpzb3J0IHNlbGVjdD0iQERpc3BsYXlOYW1lIi8+Ci0JCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWRkRWxlbWVudFdpdGhMaW5rIj4KLQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudCIgc2VsZWN0PSIuIi8+Ci0JCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQkJPHhzbDppZiB0ZXN0PSJwb3NpdGlvbigpICE9ICRzaXplIj4sJiMxNjA7PC94c2w6aWY+Ci0JCQkJCTwveHNsOmZvci1lYWNoPgotCQkJCTwvdGQ+Ci0JCQk8L3RyPgotCQk8L3hzbDppZj4KLQk8L3hzbDp0ZW1wbGF0ZT4KLQotCTx4c2w6dGVtcGxhdGUgbmFtZT0icm9sZURlc2NyaXB0b3JLZXlJbmZvIj4KLQkJPHhzbDpwYXJhbSBuYW1lPSJzaG93RnVsbE1ldGhvZENvbnRlbnQiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJzb3VyY2VSb2xlIiBzZWxlY3Q9InJlZmVyZW5jZVtAbmFtZT0nUm9sZSddL0VsZW1lbnRbQFR5cGU9J1JvbGUnXSIvPgotCQk8eHNsOmlmIHRlc3Q9IiRzaG93RnVsbE1ldGhvZENvbnRlbnQgPSAnZmFsc2UnIGFuZCBjb3VudCgkc291cmNlUm9sZSkgPiAwIj4KLQkJCTx0cj4KLQkJCQk8dGQ+Ci0JCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkYmFzZWRPbk1ldGhvZFJvbGVUZXh0Ii8+Ci0JCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkY29sb25fd2l0aF9zcGFjZSIvPgotCQkJCQk8eHNsOmZvci1lYWNoIHNlbGVjdD0iJHNvdXJjZVJvbGUiPgotCQkJCQk8eHNsOnNvcnQgc2VsZWN0PSJARGlzcGxheU5hbWUiLz4KLQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhZGRFbGVtZW50V2l0aExpbmsiPgotCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50IiBzZWxlY3Q9Ii4iLz4KLQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCTwveHNsOmZvci1lYWNoPgotCQkJCTwvdGQ+Ci0JCQk8L3RyPgotCQk8L3hzbDppZj4KLQk8L3hzbDp0ZW1wbGF0ZT4KLQotCTx4c2w6dGVtcGxhdGUgbmFtZT0idGFza0tleUluZm8iPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImRpc2NpcGxpbmVzIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3RbQG5hbWU9J2Rpc2NpcGxpbmVzJ10vRWxlbWVudFtAVHlwZT0nRGlzY2lwbGluZSddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iYmFzZVRhc2siIHNlbGVjdD0icmVmZXJlbmNlW0BuYW1lPSd2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50J10vRWxlbWVudCIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InZhcmlhYmlsaXR5VHlwZSIgc2VsZWN0PSJhdHRyaWJ1dGVbQG5hbWU9J3ZhcmlhYmlsaXR5VHlwZSddIi8+Ci0JCTx4c2w6aWYgdGVzdD0iY291bnQoJGRpc2NpcGxpbmVzKSA+IDAiPgotCQkJPHRyPgotCQkJCTx0ZD4KLQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRkaXNjaXBsaW5lc1RleHQiLz4KLQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRjb2xvbl93aXRoX3NwYWNlIi8+Ci0JCQkJCTx4c2w6Zm9yLWVhY2ggc2VsZWN0PSIkZGlzY2lwbGluZXMiPgotCQkJCQk8eHNsOnNvcnQgc2VsZWN0PSJARGlzcGxheU5hbWUiLz4KLQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhZGRFbGVtZW50V2l0aExpbmsiPgotCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50IiBzZWxlY3Q9Ii4iLz4KLQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQk8eHNsOmlmIHRlc3Q9ImNvdW50KCRkaXNjaXBsaW5lcykgPiBwb3NpdGlvbigpIj4sJiMxNjA7PC94c2w6aWY+Ci0JCQkJCTwveHNsOmZvci1lYWNoPgotCQkJCQk8eHNsOmlmIHRlc3Q9ImNvdW50KCRiYXNlVGFzaykgPiAwIj4KLQkJCQkJCTx4c2w6aWYgdGVzdD0iY291bnQoJGRpc2NpcGxpbmVzKSA+IDAiPgotCQkJCQkJCTxici8+Ci0JCQkJCQk8L3hzbDppZj4KLQkJCQkJCTx4c2w6aWYgdGVzdD0iJHZhcmlhYmlsaXR5VHlwZSA9ICdyZXBsYWNlcyciPgotCQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcmVwbGFjZXNUZXh0Ii8+Ci0JCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRjb2xvbl93aXRoX3NwYWNlIi8+Ci0JCQkJCQk8L3hzbDppZj4KLQkJCQkJCTx4c2w6aWYgdGVzdD0iJHZhcmlhYmlsaXR5VHlwZSA9ICdjb250cmlidXRlcyciPgotCQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkY29udHJpYnV0ZXNUZXh0Ii8+Ci0JCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRjb2xvbl93aXRoX3NwYWNlIi8+Ci0JCQkJCQk8L3hzbDppZj4KLQkJCQkJCTx4c2w6aWYgdGVzdD0iJHZhcmlhYmlsaXR5VHlwZSA9ICdleHRlbmRzUmVwbGFjZXMnIj4KLQkJCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGV4dGVuZHNSZXBsYWNlc1RleHQiLz4KLQkJCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGNvbG9uX3dpdGhfc3BhY2UiLz4KLQkJCQkJCTwveHNsOmlmPgotCQkJCQkJPHhzbDppZiB0ZXN0PSIkdmFyaWFiaWxpdHlUeXBlID0gJ2V4dGVuZHMnIj4KLQkJCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGV4dGVuZHNUZXh0Ii8+Ci0JCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRjb2xvbl93aXRoX3NwYWNlIi8+Ci0JCQkJCQk8L3hzbDppZj4KLQkJCQkJCTx4c2w6Zm9yLWVhY2ggc2VsZWN0PSIkYmFzZVRhc2siPgotCQkJCQkJPHhzbDpzb3J0IHNlbGVjdD0iQERpc3BsYXlOYW1lIi8+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFkZEVsZW1lbnRXaXRoTGluayI+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50IiBzZWxlY3Q9Ii4iLz4KLQkJCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQkJPC94c2w6Zm9yLWVhY2g+Ci0JCQkJCTwveHNsOmlmPgotCQkJCTwvdGQ+Ci0JCQk8L3RyPgotCQk8L3hzbDppZj4KLQk8L3hzbDp0ZW1wbGF0ZT4KLQotCTx4c2w6dGVtcGxhdGUgbmFtZT0idGFza0Rlc2NyaXB0b3JLZXlJbmZvIj4KLQkJPHhzbDpwYXJhbSBuYW1lPSJzaG93RnVsbE1ldGhvZENvbnRlbnQiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJzb3VyY2VUYXNrIiBzZWxlY3Q9InJlZmVyZW5jZVtAbmFtZT0nVGFzayddL0VsZW1lbnRbQFR5cGU9J1Rhc2snXSIvPgkJCi0JCTx4c2w6aWYgdGVzdD0iJHNob3dGdWxsTWV0aG9kQ29udGVudCA9ICdmYWxzZScgYW5kIGNvdW50KCRzb3VyY2VUYXNrKSA+IDAiPgotCQkJPHRyPgotCQkJCTx0ZD4KLQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRiYXNlZE9uTWV0aG9kVGFza1RleHQiLz4KLQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRjb2xvbl93aXRoX3NwYWNlIi8+Ci0JCQkJCTx4c2w6Zm9yLWVhY2ggc2VsZWN0PSIkc291cmNlVGFzayI+Ci0JCQkJCTx4c2w6c29ydCBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPgotCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFkZEVsZW1lbnRXaXRoTGluayI+Ci0JCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnQiIHNlbGVjdD0iLiIvPgotCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJPC94c2w6Zm9yLWVhY2g+Ci0JCQkJPC90ZD4KLQkJCTwvdHI+Ci0JCTwveHNsOmlmPgotCTwveHNsOnRlbXBsYXRlPgotCi0JPHhzbDp0ZW1wbGF0ZSBuYW1lPSJ3b3JrUHJvZHVjdERlc2NyaXB0b3JLZXlJbmZvIj4KLQkJPHhzbDpwYXJhbSBuYW1lPSJzaG93RnVsbE1ldGhvZENvbnRlbnQiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJzb3VyY2VXb3JrUHJvZHVjdCIgc2VsZWN0PSJyZWZlcmVuY2VbQG5hbWU9J1dvcmtQcm9kdWN0J10vRWxlbWVudCIvPgotCQk8eHNsOmlmIHRlc3Q9IiRzaG93RnVsbE1ldGhvZENvbnRlbnQgPSAnZmFsc2UnIGFuZCBjb3VudCgkc291cmNlV29ya1Byb2R1Y3QpID4gMCI+Ci0JCQk8dHI+Ci0JCQkJPHRkPgotCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGJhc2VkT25NZXRob2RXb3JrUHJvZHVjdFRleHQiLz4KLQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRjb2xvbl93aXRoX3NwYWNlIi8+Ci0JCQkJCTx4c2w6Zm9yLWVhY2ggc2VsZWN0PSIkc291cmNlV29ya1Byb2R1Y3QiPgotCQkJCQk8eHNsOnNvcnQgc2VsZWN0PSJARGlzcGxheU5hbWUiLz4KLQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhZGRFbGVtZW50V2l0aExpbmsiPgotCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50IiBzZWxlY3Q9Ii4iLz4KLQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCTwveHNsOmZvci1lYWNoPgotCQkJCTwvdGQ+Ci0JCQk8L3RyPgotCQk8L3hzbDppZj4KLQk8L3hzbDp0ZW1wbGF0ZT4KLQotCTx4c2w6dGVtcGxhdGUgbmFtZT0id29ya1Byb2R1Y3RLZXlJbmZvIj4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJkb21haW5zIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3RbQG5hbWU9J2RvbWFpbnMnXS9FbGVtZW50Ii8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iYmFzZVdvcmtQcm9kdWN0IiBzZWxlY3Q9InJlZmVyZW5jZVtAbmFtZT0ndmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCddL0VsZW1lbnQiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJ3b3JrUHJvZHVjdFR5cGVzIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3RbQG5hbWU9J3dvcmtQcm9kdWN0VHlwZXMnXS9FbGVtZW50W0BUeXBlPSdXb3JrUHJvZHVjdFR5cGUnXSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InZhcmlhYmlsaXR5VHlwZSIgc2VsZWN0PSJhdHRyaWJ1dGVbQG5hbWU9J3ZhcmlhYmlsaXR5VHlwZSddIi8+Ci0JCTx0cj4KLQkJCTx0ZD4KLQkJCQk8eHNsOmlmIHRlc3Q9ImNvdW50KCRkb21haW5zKSA+IDAiPgotCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGRvbWFpbnNUZXh0Ii8+Ci0JCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkY29sb25fd2l0aF9zcGFjZSIvPgotCQkJCQk8eHNsOmZvci1lYWNoIHNlbGVjdD0iJGRvbWFpbnMiPgotCQkJCQk8eHNsOnNvcnQgc2VsZWN0PSJARGlzcGxheU5hbWUiLz4KLQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhZGRFbGVtZW50V2l0aExpbmsiPgotCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50IiBzZWxlY3Q9Ii4iLz4KLQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQk8eHNsOmlmIHRlc3Q9ImNvdW50KCRkb21haW5zKSA+IHBvc2l0aW9uKCkiPiwmIzE2MDs8L3hzbDppZj4KLQkJCQkJPC94c2w6Zm9yLWVhY2g+Ci0JCQkJPC94c2w6aWY+Ci0JCQkJPHhzbDppZiB0ZXN0PSJjb3VudCgkd29ya1Byb2R1Y3RUeXBlcykgPiAwIj4KLQkJCQkJPHhzbDppZiB0ZXN0PSJjb3VudCgkZG9tYWlucykgPiAwIj4KLQkJCQkJCTxici8+Ci0JCQkJCTwveHNsOmlmPgotCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHdvcmtQcm9kdWN0VHlwZXNUZXh0Ii8+Ci0JCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkY29sb25fd2l0aF9zcGFjZSIvPgotCQkJCQk8eHNsOmZvci1lYWNoIHNlbGVjdD0iJHdvcmtQcm9kdWN0VHlwZXMiPgotCQkJCQk8eHNsOnNvcnQgc2VsZWN0PSJARGlzcGxheU5hbWUiLz4KLQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhZGRFbGVtZW50V2l0aExpbmsiPgotCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50IiBzZWxlY3Q9Ii4iLz4KLQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQk8eHNsOmlmIHRlc3Q9ImNvdW50KCR3b3JrUHJvZHVjdFR5cGVzKSA+IHBvc2l0aW9uKCkiPiwmIzE2MDs8L3hzbDppZj4KLQkJCQkJPC94c2w6Zm9yLWVhY2g+Ci0JCQkJPC94c2w6aWY+Ci0JCQkJPHhzbDppZiB0ZXN0PSJjb3VudCgkYmFzZVdvcmtQcm9kdWN0KSA+IDAiPgotCQkJCQk8eHNsOmlmIHRlc3Q9ImNvdW50KCRkb21haW5zKSArIGNvdW50KCR3b3JrUHJvZHVjdFR5cGVzKSA+IDAiPgotCQkJCQkJPGJyLz4KLQkJCQkJPC94c2w6aWY+Ci0JCQkJCTx4c2w6aWYgdGVzdD0iJHZhcmlhYmlsaXR5VHlwZSA9ICdyZXBsYWNlcyciPgotCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRyZXBsYWNlc1RleHQiLz4KLQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkY29sb25fd2l0aF9zcGFjZSIvPgotCQkJCQk8L3hzbDppZj4KLQkJCQkJPHhzbDppZiB0ZXN0PSIkdmFyaWFiaWxpdHlUeXBlID0gJ2NvbnRyaWJ1dGVzJyI+Ci0JCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGNvbnRyaWJ1dGVzVGV4dCIvPgotCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRjb2xvbl93aXRoX3NwYWNlIi8+Ci0JCQkJCTwveHNsOmlmPgotCQkJCQk8eHNsOmlmIHRlc3Q9IiR2YXJpYWJpbGl0eVR5cGUgPSAnZXh0ZW5kc1JlcGxhY2VzJyI+Ci0JCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGV4dGVuZHNSZXBsYWNlc1RleHQiLz4KLQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkY29sb25fd2l0aF9zcGFjZSIvPgotCQkJCQk8L3hzbDppZj4KLQkJCQkJPHhzbDppZiB0ZXN0PSIkdmFyaWFiaWxpdHlUeXBlID0gJ2V4dGVuZHMnIj4KLQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZXh0ZW5kc1RleHQiLz4KLQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkY29sb25fd2l0aF9zcGFjZSIvPgotCQkJCQk8L3hzbDppZj4KLQkJCQkJPHhzbDpmb3ItZWFjaCBzZWxlY3Q9IiRiYXNlV29ya1Byb2R1Y3QiPgotCQkJCQk8eHNsOnNvcnQgc2VsZWN0PSJARGlzcGxheU5hbWUiLz4KLQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhZGRFbGVtZW50V2l0aExpbmsiPgotCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50IiBzZWxlY3Q9Ii4iLz4KLQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCTwveHNsOmZvci1lYWNoPgotCQkJCTwveHNsOmlmPgotCQkJPC90ZD4KLQkJPC90cj4KLQk8L3hzbDp0ZW1wbGF0ZT4KLQotCTx4c2w6dGVtcGxhdGUgbmFtZT0idG9vbE1lbnRvcktleUluZm8iPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InRvb2wiIHNlbGVjdD0icmVmZXJlbmNlW0BuYW1lPSd0b29sJ10vRWxlbWVudCIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImJhc2VFbGVtZW50IiBzZWxlY3Q9InJlZmVyZW5jZVtAbmFtZT0ndmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCddL0VsZW1lbnQiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJ2YXJpYWJpbGl0eVR5cGUiIHNlbGVjdD0iYXR0cmlidXRlW0BuYW1lPSd2YXJpYWJpbGl0eVR5cGUnXSIvPgotCQk8dHI+Ci0JCQk8dGQ+Ci0JCQkJPHhzbDppZiB0ZXN0PSJjb3VudCgkdG9vbCkgPiAwIj4KLQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR0b29sVGV4dCIvPgotCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGNvbG9uX3dpdGhfc3BhY2UiLz4KLQkJCQkJPHhzbDpmb3ItZWFjaCBzZWxlY3Q9IiR0b29sIj4KLQkJCQkJPHhzbDpzb3J0IHNlbGVjdD0iQERpc3BsYXlOYW1lIi8+Ci0JCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWRkRWxlbWVudFdpdGhMaW5rIj4KLQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudCIgc2VsZWN0PSIuIi8+Ci0JCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQkJPHhzbDp0ZXh0PiA8L3hzbDp0ZXh0PgotCQkJCQk8L3hzbDpmb3ItZWFjaD4KLQkJCQk8L3hzbDppZj4KLQkJCQk8eHNsOmlmIHRlc3Q9ImNvdW50KCRiYXNlRWxlbWVudCkgPiAwIj4KLQkJCQkJPHhzbDppZiB0ZXN0PSJjb3VudCgkdG9vbCkgID4gMCI+Ci0JCQkJCQk8YnIvPgotCQkJCQk8L3hzbDppZj4KLQkJCQkJPHhzbDppZiB0ZXN0PSIkdmFyaWFiaWxpdHlUeXBlID0gJ3JlcGxhY2VzJyI+Ci0JCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHJlcGxhY2VzVGV4dCIvPgotCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRjb2xvbl93aXRoX3NwYWNlIi8+Ci0JCQkJCTwveHNsOmlmPgotCQkJCQk8eHNsOmlmIHRlc3Q9IiR2YXJpYWJpbGl0eVR5cGUgPSAnY29udHJpYnV0ZXMnIj4KLQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkY29udHJpYnV0ZXNUZXh0Ii8+Ci0JCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGNvbG9uX3dpdGhfc3BhY2UiLz4KLQkJCQkJPC94c2w6aWY+Ci0JCQkJCTx4c2w6aWYgdGVzdD0iJHZhcmlhYmlsaXR5VHlwZSA9ICdleHRlbmRzUmVwbGFjZXMnIj4KLQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZXh0ZW5kc1JlcGxhY2VzVGV4dCIvPgotCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRjb2xvbl93aXRoX3NwYWNlIi8+Ci0JCQkJCTwveHNsOmlmPgotCQkJCQk8eHNsOmlmIHRlc3Q9IiR2YXJpYWJpbGl0eVR5cGUgPSAnZXh0ZW5kcyciPgotCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRleHRlbmRzVGV4dCIvPgotCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRjb2xvbl93aXRoX3NwYWNlIi8+Ci0JCQkJCTwveHNsOmlmPgotCQkJCQk8eHNsOmZvci1lYWNoIHNlbGVjdD0iJGJhc2VFbGVtZW50Ij4KLQkJCQkJPHhzbDpzb3J0IHNlbGVjdD0iQERpc3BsYXlOYW1lIi8+Ci0JCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWRkRWxlbWVudFdpdGhMaW5rIj4KLQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudCIgc2VsZWN0PSIuIi8+Ci0JCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQk8L3hzbDpmb3ItZWFjaD4KLQkJCQk8L3hzbDppZj4KLQkJCTwvdGQ+Ci0JCTwvdHI+Ci0JPC94c2w6dGVtcGxhdGU+Ci0KLQk8eHNsOnRlbXBsYXRlIG5hbWU9Im92ZXJ2aWV3U2VwYXJhdG9yIj4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJpbWFnZVBhdGgiIHNlbGVjdD0iY29uY2F0KC9FbGVtZW50L0BCYWNrUGF0aCwgJ2ltYWdlcy8nKSIvPgotCQk8dGFibGUgaWQ9Im92ZXJ2aWV3U2VwYXJhdG9yIiB3aWR0aD0iMTAwJSIgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiPgotCQkJPHRyPgotCQkJCTx0ZCBjbGFzcz0ib3ZlcnZpZXdTZXBhcmF0b3IiPgotCQkJCQk8aW1nIHNyYz0ieyRpbWFnZVBhdGh9c2hpbS5naWYiIGFsdD0iIiB0aXRsZT0iIiBoZWlnaHQ9IjEiLz4KLQkJCQk8L3RkPgotCQkJPC90cj4KLQkJCTx0cj4KLQkJCQk8dGQ+Ci0JCQkJCTxpbWcgc3JjPSJ7JGltYWdlUGF0aH1zaGltLmdpZiIgYWx0PSIiIHRpdGxlPSIiIGhlaWdodD0iNSIvPgotCQkJCTwvdGQ+Ci0JCQk8L3RyPgotCQk8L3RhYmxlPgotCTwveHNsOnRlbXBsYXRlPgotCi08L3hzbDpzdHlsZXNoZWV0PgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L3hzbC9wYWdlX25vdF9pbnN0YWxsZWQueHNsIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L3hzbC9wYWdlX25vdF9pbnN0YWxsZWQueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYmE5MzlmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC94c2wvcGFnZV9ub3RfaW5zdGFsbGVkLnhzbAorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLQotPHhzbDpzdHlsZXNoZWV0IHZlcnNpb249IjEuMCIKLQl4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIKLQl4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIj4KLQotPHhzbDpvdXRwdXQgbWV0aG9kPSJodG1sIiB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgCi0JZG9jdHlwZS1wdWJsaWM9Ii0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAKLQlkb2N0eXBlLXN5c3RlbT0iaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCIgCi0JaW5kZW50PSJ5ZXMiLz4KLQkKLQk8eHNsOmluY2x1ZGUgaHJlZj0icmVzb3VyY2VzLnhzbCIvPgotCi0JPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iL0VsZW1lbnQiPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImNvcHlyaWdodCIgc2VsZWN0PSJjb3B5cmlnaHQiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJzaG93VHJlZUJyb3dzZXIiIHNlbGVjdD0iQHNob3dUcmVlQnJvd3NlciIvPgkJCi0JCTxodG1sPgkKLQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9ImxhbmciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbGFuZyIvPjwveHNsOmF0dHJpYnV0ZT4KLQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9InhtbDpsYW5nIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGxhbmciLz48L3hzbDphdHRyaWJ1dGU+Ci0JCQk8aGVhZD4KLQkJCQk8dGl0bGU+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwYWdlTm90SW5zdGFsbGVkVGV4dCIvPjwvdGl0bGU+Ci0JCQk8L2hlYWQ+CQkKLQkJCTxib2R5PgotCQkJPHhzbDpjaG9vc2U+Ci0JCQkJPHhzbDp3aGVuIHRlc3Q9IkBpbnZhbGlkTGluayI+Ci0JCQkJCTxiPjxoMz48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVsZW1lbnREb2VzTm90RXhpc3RUZXh0Ii8+PC9oMz48L2I+Ci0JCQkJCTxwLz4KLQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRpc05vdFZhbGlkVGV4dCIvPgotCQkJCQk8YnIvPgkKLQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50TWlnaHRCZURlbGV0ZWRUZXh0Ii8+Ci0JCQkJCTxwLz4KLQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwbGVhc2VGaXhMaW5rVGV4dCIvPgkJCQkJCQkJCQkKLQkJCQk8L3hzbDp3aGVuPgotCQkJPHhzbDpvdGhlcndpc2U+Ci0JCQkJPGI+PGgzPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbWlzc2luZ0VsZW1lbnRUZXh0Ii8+PC9oMz48L2I+Ci0JCQkJPHAvPgotCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbm90QXZhaWxhYmxlVGV4dCIvPgkJCQkJCQkJCi0JCQk8L3hzbDpvdGhlcndpc2U+Ci0JCQk8L3hzbDpjaG9vc2U+Ci0JCQk8L2JvZHk+Ci0JCTwvaHRtbD4KLQk8L3hzbDp0ZW1wbGF0ZT4KLQotPC94c2w6c3R5bGVzaGVldD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC94c2wvcHJhY3RpY2UueHNsIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L3hzbC9wcmFjdGljZS54c2wKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3Njc5Y2QuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L3hzbC9wcmFjdGljZS54c2wKKysrIC9kZXYvbnVsbApAQCAtMSwyNjMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotCi08eHNsOnN0eWxlc2hlZXQgdmVyc2lvbj0iMS4wIgotCXhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIgotCXhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiPgotCi08eHNsOm91dHB1dCBtZXRob2Q9Imh0bWwiIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiAKLQlkb2N0eXBlLXB1YmxpYz0iLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iIAotCWRvY3R5cGUtc3lzdGVtPSJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIiAKLQlpbmRlbnQ9InllcyIvPgotCQotCTx4c2w6aW5jbHVkZSBocmVmPSJndWlkYW5jZS54c2wiLz4JCi0KLQk8eHNsOnRlbXBsYXRlIG1hdGNoPSIvRWxlbWVudCI+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iZWxlbWVudFR5cGUiIHNlbGVjdD0iQFR5cGUiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJlbGVtZW50VHlwZU5hbWUiIHNlbGVjdD0iQFR5cGVOYW1lIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iZWxlbWVudE5hbWUiIHNlbGVjdD0iQE5hbWUiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJlbGVtZW50UHJlc2VudGF0aW9uTmFtZSIgc2VsZWN0PSJARGlzcGxheU5hbWUiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJiYWNrUGF0aCIgc2VsZWN0PSJAQmFja1BhdGgiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJpbWFnZVBhdGgiIHNlbGVjdD0iY29uY2F0KCRiYWNrUGF0aCwgJ2ltYWdlcy8nKSIvPgkJCi0JICAgIDx4c2w6dmFyaWFibGUgbmFtZT0ic2hhcGVJbWFnZSIgc2VsZWN0PSJjb25jYXQoJGJhY2tQYXRoLEBTaGFwZWljb25VcmwpIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0icHJlc2VudGF0aW9uIiBzZWxlY3Q9InJlZmVyZW5jZVtAbmFtZT0ncHJlc2VudGF0aW9uJ10iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJjb250ZW50RGVzY3JpcHRpb24iIHNlbGVjdD0iJHByZXNlbnRhdGlvbi9FbGVtZW50Ii8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iY29weXJpZ2h0IiBzZWxlY3Q9ImNvcHlyaWdodCIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InNob3dUcmVlQnJvd3NlciIgc2VsZWN0PSJAc2hvd1RyZWVCcm93c2VyIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0icmVzcG9uc2libGVSb2xlIiBzZWxlY3Q9InJlZmVyZW5jZVtAbmFtZT0ncmVzcG9uc2libGVSb2xlJ10vRWxlbWVudFtAVHlwZT0nUm9sZSddIi8+Ci0KLSAgICAJPGh0bWw+Ci0JCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJsYW5nIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGxhbmciLz48L3hzbDphdHRyaWJ1dGU+Ci0JCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJ4bWw6bGFuZyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBsYW5nIi8+PC94c2w6YXR0cmlidXRlPgotCQkJPGhlYWQ+Ci0JCQkJPHRpdGxlPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudFR5cGVOYW1lIi8+OiA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVsZW1lbnRQcmVzZW50YXRpb25OYW1lIi8+PC90aXRsZT4KLQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0idW1hTWV0YVRhZ3MiPgotCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudFR5cGUiIHNlbGVjdD0iJGVsZW1lbnRUeXBlIi8+Ci0JCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50TmFtZSIgc2VsZWN0PSIkZWxlbWVudE5hbWUiLz4KLQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnRQcmVzZW50YXRpb25OYW1lIiBzZWxlY3Q9IiRlbGVtZW50UHJlc2VudGF0aW9uTmFtZSIvPgotCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJPG1ldGEgbmFtZT0iZWxlbWVudF90eXBlIiBjb250ZW50PSJ7JGVsZW1lbnRUeXBlfSIvPgotCQkJCTxtZXRhIG5hbWU9ImZpbGV0eXBlIiBjb250ZW50PSJkZXNjcmlwdGlvbiIvPgotCQkJCTxtZXRhIG5hbWU9InJvbGUiPgotCQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9ImNvbnRlbnQiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcmVzcG9uc2libGVSb2xlL0BEaXNwbGF5TmFtZSIvPjwveHNsOmF0dHJpYnV0ZT4KLQkJCQk8L21ldGE+Ci0JCQkJPGxpbmsgcmVsPSJTdHlsZVNoZWV0IiBocmVmPSJ7JGJhY2tQYXRofWNzcy9kZWZhdWx0LmNzcyIgdHlwZT0idGV4dC9jc3MiLz4KLQkJCQk8c2NyaXB0IHNyYz0ieyRiYWNrUGF0aH1zY3JpcHRzL0NvbnRlbnRQYWdlUmVzb3VyY2UuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPjwvc2NyaXB0PgotCQkJCTxzY3JpcHQgc3JjPSJ7JGJhY2tQYXRofXNjcmlwdHMvQ29udGVudFBhZ2VTZWN0aW9uLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij48L3NjcmlwdD4KLQkJCQk8c2NyaXB0IHNyYz0ieyRiYWNrUGF0aH1zY3JpcHRzL0NvbnRlbnRQYWdlU3ViU2VjdGlvbi5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PC9zY3JpcHQ+Ci0JCQkJPHNjcmlwdCBzcmM9InskYmFja1BhdGh9c2NyaXB0cy9Db250ZW50UGFnZVRvb2xiYXIuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPjwvc2NyaXB0PgotCQkJCTxzY3JpcHQgc3JjPSJ7JGJhY2tQYXRofXNjcmlwdHMvY29udGVudFBhZ2UuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPjwvc2NyaXB0PgotCQkJCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+Ci0JCQkJCXZhciBiYWNrUGF0aCA9ICc8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGJhY2tQYXRoIi8+JzsKLQkJCQkJdmFyIGltZ1BhdGggPSAnPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRpbWFnZVBhdGgiLz4nOwotCQkJCQl2YXIgbm9kZUluZm89bnVsbDsKLQkJCQkJY29udGVudFBhZ2UucHJlbG9hZChpbWdQYXRoLCBiYWNrUGF0aCwgbm9kZUluZm8sICAnJywgZmFsc2UsIGZhbHNlLCBmYWxzZSk7Ci0JCQkJPC9zY3JpcHQ+Ci0JCQk8L2hlYWQ+Ci0JCQk8Ym9keT4KLQkJCTxkaXYgaWQ9ImJyZWFkY3J1bWJzIj48L2Rpdj4KLQkJCQk8dGFibGUgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLQkJCQkJPHRyPgotCQkJCQkJPHRkIHZhbGlnbj0idG9wIj4KLQkJCQkJCQk8YSBuYW1lPSJUb3AiLz4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0ib3ZlcnZpZXciPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudFR5cGUiIHNlbGVjdD0iJGVsZW1lbnRUeXBlIi8+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50VHlwZU5hbWUiIHNlbGVjdD0iJGVsZW1lbnRUeXBlTmFtZSIvPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudFByZXNlbnRhdGlvbk5hbWUiIHNlbGVjdD0iJGVsZW1lbnRQcmVzZW50YXRpb25OYW1lIi8+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50SWNvbiIgc2VsZWN0PSIkc2hhcGVJbWFnZSIvPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iYmFja1BhdGgiIHNlbGVjdD0iJGJhY2tQYXRoIi8+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJzaG93VHJlZUJyb3dzZXIiIHNlbGVjdD0iJHNob3dUcmVlQnJvd3NlciIvPgotCQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InJlbGF0aW9uc2hpcHNTZWN0aW9uMiIvPgotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJkZXNjcmlwdGlvblNlY3Rpb24iPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZGVzY3JpcHRpb24iIHNlbGVjdD0iJGNvbnRlbnREZXNjcmlwdGlvbiIvPgotCQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImNvcHlyaWdodCI+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJjb3B5cmlnaHQiIHNlbGVjdD0iJGNvcHlyaWdodCIvPgotCQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQk8L3RkPgkJCQkJCQotCQkJCQk8L3RyPgotCQkJCTwvdGFibGU+Ci0JCQk8L2JvZHk+Ci0JCQk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPgotCQkJCWNvbnRlbnRQYWdlLm9ubG9hZCgpOwotCQkJPC9zY3JpcHQ+Ci0JCTwvaHRtbD4KLQk8L3hzbDp0ZW1wbGF0ZT4KLQotCTx4c2w6dGVtcGxhdGUgbmFtZT0icmVsYXRpb25zaGlwc1NlY3Rpb24yIj4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJzdWJQcmFjdGljZXMiIHNlbGVjdD0icmVmZXJlbmNlTGlzdFtAbmFtZT0nc3ViUHJhY3RpY2VzJ10vRWxlbWVudCIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImlucHV0U2xvdHMiIHNlbGVjdD0icmVmZXJlbmNlTGlzdFtAbmFtZT0nSW5wdXQgd29yayBwcm9kdWN0IHNsb3RzJ10vRWxlbWVudCIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImNvbnRlbnRSZWZlcmVuY2VzIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3RbQG5hbWU9J2NvbnRlbnRSZWZlcmVuY2VzJ10vRWxlbWVudCIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImFjdGl2aXR5UmVmZXJlbmNlcyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0W0BuYW1lPSdhY3Rpdml0eVJlZmVyZW5jZXMnXS9FbGVtZW50Ii8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iY2F0ZWdvcmllcyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0W0BuYW1lPSdDb250ZW50RWxlbWVudF9DdXN0b21DYXRlZ29yaWVzJ10vRWxlbWVudCIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InByYWN0aWNlVHJlZSIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0W0BuYW1lPSdQcmFjdGljZSBndWlkYW5jZSB0cmVlJ10iLz4KLQkJPHhzbDppZiB0ZXN0PSJjb3VudCgkY29udGVudFJlZmVyZW5jZXMpICsgY291bnQoJHN1YlByYWN0aWNlcykgKyBjb3VudCgkYWN0aXZpdHlSZWZlcmVuY2VzKSArIGNvdW50KCRjYXRlZ29yaWVzKSArIGNvdW50KCRpbnB1dFNsb3RzKSA+IDAiPgotCQkJPGRpdiBjbGFzcz0ic2VjdGlvbkhlYWRpbmciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcmVsYXRpb25zaGlwc1RleHQiLz48L2Rpdj4KLQkJCTxkaXYgY2xhc3M9InNlY3Rpb25Db250ZW50Ij4KLQkJCQk8dGFibGUgY2xhc3M9InNlY3Rpb25UYWJsZSIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiPgotCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWRkUmVmZXJlbmNlcyI+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0icmVmTmFtZSIgc2VsZWN0PSIkY2F0ZWdvcmllc1RleHQiLz4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJyZWZFbGVtZW50IiBzZWxlY3Q9IiRjYXRlZ29yaWVzIi8+Ci0JCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCTx0ciB2YWxpZ249InRvcCI+Ci0JCQkJCQk8dGggY2xhc3M9InNlY3Rpb25UYWJsZUhlYWRpbmciIHNjb3BlPSJyb3ciPgotCQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcmVsYXRpb25zaGlwc1RleHQiLz4KLQkJCQkJCTwvdGg+Ci0JCQkJCQk8dGQgY2xhc3M9InNlY3Rpb25UYWJsZUNlbGwiPgotCQkJCQkJCTx4c2w6Zm9yLWVhY2ggc2VsZWN0PSIkcHJhY3RpY2VUcmVlLyoiPgotCQkJCQkJCTx1bD4KLQkJCQkJCQkJPHhzbDppZiB0ZXN0PSJuYW1lKCk9J0VsZW1lbnQnIj4KLQkJCQkJCQkJPGxpPgotCQkJCQkJCQkJPGltZz4KLQkJCQkJCQkJCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJzcmMiPi4vLi4vLi4vLi4vPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBTaGFwZWljb25VcmwiLz48L3hzbDphdHRyaWJ1dGU+Ci0JCQkJCQkJCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0iaGVpZ2h0Ij4xNjwveHNsOmF0dHJpYnV0ZT4KLQkJCQkJCQkJCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJ3aWR0aCI+MTY8L3hzbDphdHRyaWJ1dGU+Ci0JCQkJCQkJCSAgCTwvaW1nPgotCQkJCQkJCQkgIAk8YT4KLQkJCQkJCQkJCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJocmVmIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQEJhY2tQYXRoIi8+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBVcmwiLz48L3hzbDphdHRyaWJ1dGU+Ci0JCQkJCQkJCQkJPHhzbDp2YWx1ZS1vZiBkaXNhYmxlLW91dHB1dC1lc2NhcGluZz0ieWVzIiBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPgotCQkJCQkJCQkgIAk8L2E+Ci0JCQkJCQkJCTwvbGk+Ci0JCQkJCQkJCTwveHNsOmlmPgotCQkJCQkJCQk8eHNsOmlmIHRlc3Q9Im5hbWUoKT0ncmVmZXJlbmNlTGlzdCciPgotCQkJCQkJCQk8bGk+Ci0JCQkJCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4KLQkJCQkJCQkJPC9saT4KLQkJCQkJCQkJPHVsPgotCQkJCQkJCQkJPHhzbDpmb3ItZWFjaCBzZWxlY3Q9Ii4vKiI+Ci0JCQkJCQkJCQk8eHNsOmlmIHRlc3Q9Im5hbWUoKT0ncmVmZXJlbmNlTGlzdCciPgotCQkJCQkJCQkJPGxpPgotCQkJCQkJCQkJICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4KLQkJCQkJCQkJCTwvbGk+Ci0JCQkJCQkJCQk8dWw+Ci0JCQkJCQkJCQkJPHhzbDpmb3ItZWFjaCBzZWxlY3Q9Ii4vKiI+Ci0JCQkJCQkJCQkJCTxsaT4KLQkJCQkJCQkJCQkJCTxpbWc+Ci0JCQkJCQkJCQkJCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0ic3JjIj4uLy4uLy4uLy4uLzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAU2hhcGVpY29uVXJsIi8+PC94c2w6YXR0cmlidXRlPgotCQkJCQkJCQkJCQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9ImhlaWdodCI+MTY8L3hzbDphdHRyaWJ1dGU+Ci0JCQkJCQkJCQkJCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0id2lkdGgiPjE2PC94c2w6YXR0cmlidXRlPgotCQkJCQkJCQkJCQkgIAk8L2ltZz4KLQkJCQkJCQkJCQkJICAJPGE+Ci0JCQkJCQkJCQkJCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0iaHJlZiI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBCYWNrUGF0aCIvPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAVXJsIi8+PC94c2w6YXR0cmlidXRlPgotCQkJCQkJCQkJCQkJCTx4c2w6dmFsdWUtb2YgZGlzYWJsZS1vdXRwdXQtZXNjYXBpbmc9InllcyIgc2VsZWN0PSJARGlzcGxheU5hbWUiLz4KLQkJCQkJCQkJCQkJICAJPC9hPgotCQkJCQkJCQkJCQk8L2xpPgotCQkJCQkJCQkJCTwveHNsOmZvci1lYWNoPgotCQkJCQkJCQkJPC91bD4KLQkJCQkJCQkJCTwveHNsOmlmPgotCQkJCQkJCQkJPHhzbDppZiB0ZXN0PSJuYW1lKCk9J0VsZW1lbnQnIj4KLQkJCQkJCQkJCTxsaT4KLQkJCQkJCQkJCQk8aW1nPgotCQkJCQkJCQkJCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJzcmMiPi4vLi4vLi4vLi4vPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBTaGFwZWljb25VcmwiLz48L3hzbDphdHRyaWJ1dGU+Ci0JCQkJCQkJCQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9ImhlaWdodCI+MTY8L3hzbDphdHRyaWJ1dGU+Ci0JCQkJCQkJCQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9IndpZHRoIj4xNjwveHNsOmF0dHJpYnV0ZT4KLQkJCQkJCQkJCSAgCTwvaW1nPgotCQkJCQkJCQkJICAJPGE+Ci0JCQkJCQkJCQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9ImhyZWYiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAQmFja1BhdGgiLz48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQFVybCIvPjwveHNsOmF0dHJpYnV0ZT4KLQkJCQkJCQkJCQkJPHhzbDp2YWx1ZS1vZiBkaXNhYmxlLW91dHB1dC1lc2NhcGluZz0ieWVzIiBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPgotCQkJCQkJCQkJICAJPC9hPgotCQkJCQkJCQkJPC9saT4KLQkJCQkJCQkJCTwveHNsOmlmPgotCQkJCQkJCQkJPC94c2w6Zm9yLWVhY2g+Ci0JCQkJCQkJCTwvdWw+Ci0JCQkJCQkJCTwveHNsOmlmPgotCQkJCQkJICA8L3VsPiAJCQotCQkJCQkJICA8L3hzbDpmb3ItZWFjaD4KLQkJCQkgIAk8L3RkPgotCQkJCQk8L3RyPgkKLQkJCQkJCi0JCQkJCQotCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWRkUmVmZXJlbmNlcyI+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0icmVmTmFtZSIgc2VsZWN0PSIkaW5wdXRzVGV4dCIvPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9InJlZkVsZW1lbnQiIHNlbGVjdD0iJGlucHV0U2xvdHMiLz4KLQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4JCQkJCQotCQkJCTwvdGFibGU+Ci0JCQk8L2Rpdj4KLQkJPC94c2w6aWY+Ci0gICAgPC94c2w6dGVtcGxhdGU+Ci0KLQk8eHNsOnRlbXBsYXRlIG5hbWU9ImRlc2NyaXB0aW9uU2VjdGlvbiI+Ci0JCTx4c2w6cGFyYW0gbmFtZT0iZGVzY3JpcHRpb24iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJtYWluRGVzY3JpcHRpb24iIHNlbGVjdD0iJGRlc2NyaXB0aW9uL2F0dHJpYnV0ZVtAbmFtZT0nbWFpbkRlc2NyaXB0aW9uJ10iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJwcm9ibGVtIiBzZWxlY3Q9IiRkZXNjcmlwdGlvbi9hdHRyaWJ1dGVbQG5hbWU9J3Byb2JsZW0nXSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImJhY2tncm91bmQiIHNlbGVjdD0iJGRlc2NyaXB0aW9uL2F0dHJpYnV0ZVtAbmFtZT0nYmFja2dyb3VuZCddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iZ29hbHMiIHNlbGVjdD0iJGRlc2NyaXB0aW9uL2F0dHJpYnV0ZVtAbmFtZT0nZ29hbHMnXSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImFwcGxpY2F0aW9uIiBzZWxlY3Q9IiRkZXNjcmlwdGlvbi9hdHRyaWJ1dGVbQG5hbWU9J2FwcGxpY2F0aW9uJ10iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJsZXZlbHNPZkFkb3B0aW9uIiBzZWxlY3Q9IiRkZXNjcmlwdGlvbi9hdHRyaWJ1dGVbQG5hbWU9J2xldmVsc09mQWRvcHRpb24nXSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImFkZGl0aW9uYWxJbmZvIiBzZWxlY3Q9IiRkZXNjcmlwdGlvbi9hdHRyaWJ1dGVbQG5hbWU9J2FkZGl0aW9uYWxJbmZvJ10iLz4KLQkJCi0JCTx4c2w6aWYgdGVzdD0iJG1haW5EZXNjcmlwdGlvbiAhPSAnJyBvciAkcHJvYmxlbSAhPSAnJyBvciAkYmFja2dyb3VuZCAhPSAnJyBvciAkZ29hbHMgIT0gJycgb3IgJGFwcGxpY2F0aW9uICE9ICcnIG9yICRsZXZlbHNPZkFkb3B0aW9uICE9ICcnIG9yICRhZGRpdGlvbmFsSW5mbyAhPSAnJyI+Ci0JCQk8ZGl2IGNsYXNzPSJzZWN0aW9uSGVhZGluZyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRkZXNjcmlwdGlvblRleHQiLz48L2Rpdj4KLQkJCTxkaXYgY2xhc3M9InNlY3Rpb25Db250ZW50Ij4JCQkKLQkJCQk8dGFibGUgY2xhc3M9InNlY3Rpb25UYWJsZSIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiPgotCQkJCQk8eHNsOmlmIHRlc3Q9IiRwcm9ibGVtICE9ICcnIj4KLQkJCQkJCTx0ciB2YWxpZ249InRvcCI+Ci0JCQkJCQkJPHRoIGNsYXNzPSJzZWN0aW9uVGFibGVIZWFkaW5nIiBzY29wZT0icm93Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb2JsZW1UZXh0Ii8+PC90aD4KLQkJCQkJCQk8dGQgY2xhc3M9InNlY3Rpb25UYWJsZUNlbGwiPgotCQkJCQkJCQk8eHNsOnZhbHVlLW9mIGRpc2FibGUtb3V0cHV0LWVzY2FwaW5nPSJ5ZXMiIHNlbGVjdD0iJHByb2JsZW0iLz4KLQkJCQkJCQk8L3RkPgotCQkJCQkJPC90cj4KLQkJCQkJPC94c2w6aWY+Ci0JCQkJCTx4c2w6aWYgdGVzdD0iJGdvYWxzICE9ICcnIj4KLQkJCQkJCTx0ciB2YWxpZ249InRvcCI+Ci0JCQkJCQkJPHRoIGNsYXNzPSJzZWN0aW9uVGFibGVIZWFkaW5nIiBzY29wZT0icm93Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGdvYWxzVGV4dCIvPjwvdGg+Ci0JCQkJCQkJPHRkIGNsYXNzPSJzZWN0aW9uVGFibGVDZWxsIj4KLQkJCQkJCQkJPHhzbDp2YWx1ZS1vZiBkaXNhYmxlLW91dHB1dC1lc2NhcGluZz0ieWVzIiBzZWxlY3Q9IiRnb2FscyIvPgotCQkJCQkJCTwvdGQ+Ci0JCQkJCQk8L3RyPgotCQkJCQk8L3hzbDppZj4KLQkJCQkJPHhzbDppZiB0ZXN0PSIkYmFja2dyb3VuZCAhPSAnJyI+Ci0JCQkJCQk8dHIgdmFsaWduPSJ0b3AiPgotCQkJCQkJCTx0aCBjbGFzcz0ic2VjdGlvblRhYmxlSGVhZGluZyIgc2NvcGU9InJvdyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRiYWNrZ3JvdW5kVGV4dCIvPjwvdGg+Ci0JCQkJCQkJPHRkIGNsYXNzPSJzZWN0aW9uVGFibGVDZWxsIj4KLQkJCQkJCQkJPHhzbDp2YWx1ZS1vZiBkaXNhYmxlLW91dHB1dC1lc2NhcGluZz0ieWVzIiBzZWxlY3Q9IiRiYWNrZ3JvdW5kIi8+Ci0JCQkJCQkJPC90ZD4KLQkJCQkJCTwvdHI+Ci0JCQkJCTwveHNsOmlmPgotCQkJCQk8eHNsOmlmIHRlc3Q9IiRtYWluRGVzY3JpcHRpb24gIT0gJyciPgotCQkJCQkJPHRyIHZhbGlnbj0idG9wIj4KLQkJCQkJCQk8dGggY2xhc3M9InNlY3Rpb25UYWJsZUhlYWRpbmciIHNjb3BlPSJyb3ciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbWFpbkRlc2NyaXB0aW9uVGV4dCIvPjwvdGg+Ci0JCQkJCQkJPHRkIGNsYXNzPSJzZWN0aW9uVGFibGVDZWxsIj4KLQkJCQkJCQkJPHhzbDp2YWx1ZS1vZiBkaXNhYmxlLW91dHB1dC1lc2NhcGluZz0ieWVzIiBzZWxlY3Q9IiRtYWluRGVzY3JpcHRpb24iLz4KLQkJCQkJCQk8L3RkPgotCQkJCQkJPC90cj4KLQkJCQkJPC94c2w6aWY+Ci0JCQkJCTx4c2w6aWYgdGVzdD0iJGFwcGxpY2F0aW9uICE9ICcnIj4KLQkJCQkJCTx0ciB2YWxpZ249InRvcCI+Ci0JCQkJCQkJPHRoIGNsYXNzPSJzZWN0aW9uVGFibGVIZWFkaW5nIiBzY29wZT0icm93Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGFwcGxpY2F0aW9uVGV4dCIvPjwvdGg+Ci0JCQkJCQkJPHRkIGNsYXNzPSJzZWN0aW9uVGFibGVDZWxsIj4KLQkJCQkJCQkJPHhzbDp2YWx1ZS1vZiBkaXNhYmxlLW91dHB1dC1lc2NhcGluZz0ieWVzIiBzZWxlY3Q9IiRhcHBsaWNhdGlvbiIvPgotCQkJCQkJCTwvdGQ+Ci0JCQkJCQk8L3RyPgotCQkJCQk8L3hzbDppZj4KLQkJCQkJPHhzbDppZiB0ZXN0PSIkbGV2ZWxzT2ZBZG9wdGlvbiAhPSAnJyI+Ci0JCQkJCQk8dHIgdmFsaWduPSJ0b3AiPgotCQkJCQkJCTx0aCBjbGFzcz0ic2VjdGlvblRhYmxlSGVhZGluZyIgc2NvcGU9InJvdyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRsZXZlbHNPZkFkb3B0aW9uVGV4dCIvPjwvdGg+Ci0JCQkJCQkJPHRkIGNsYXNzPSJzZWN0aW9uVGFibGVDZWxsIj4KLQkJCQkJCQkJPHhzbDp2YWx1ZS1vZiBkaXNhYmxlLW91dHB1dC1lc2NhcGluZz0ieWVzIiBzZWxlY3Q9IiRsZXZlbHNPZkFkb3B0aW9uIi8+Ci0JCQkJCQkJPC90ZD4KLQkJCQkJCTwvdHI+Ci0JCQkJCTwveHNsOmlmPgotCQkJCQk8eHNsOmlmIHRlc3Q9IiRhZGRpdGlvbmFsSW5mbyAhPSAnJyI+Ci0JCQkJCQk8dHIgdmFsaWduPSJ0b3AiPgotCQkJCQkJCTx0aCBjbGFzcz0ic2VjdGlvblRhYmxlSGVhZGluZyIgc2NvcGU9InJvdyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRhZGRpdGlvbmFsSW5mb1RleHQiLz48L3RoPgotCQkJCQkJCTx0ZCBjbGFzcz0ic2VjdGlvblRhYmxlQ2VsbCI+Ci0JCQkJCQkJCTx4c2w6dmFsdWUtb2YgZGlzYWJsZS1vdXRwdXQtZXNjYXBpbmc9InllcyIgc2VsZWN0PSIkYWRkaXRpb25hbEluZm8iLz4KLQkJCQkJCQk8L3RkPgotCQkJCQkJPC90cj4KLQkJCQkJPC94c2w6aWY+Ci0JCQkJPC90YWJsZT4KLQkJCTwvZGl2PgotCQk8L3hzbDppZj4KLQk8L3hzbDp0ZW1wbGF0ZT4gICAgCi0KLTwveHNsOnN0eWxlc2hlZXQ+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQveHNsL3Byb3BlcnR5LnhzbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC94c2wvcHJvcGVydHkueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNTE1NWViLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC94c2wvcHJvcGVydHkueHNsCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotCi08eHNsOnN0eWxlc2hlZXQgdmVyc2lvbj0iMS4wIgotCXhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIgotCXhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiPgotCi0JPHhzbDp0ZW1wbGF0ZSBuYW1lPSJwcm9wZXJ0eSI+Ci0JCTx4c2w6cGFyYW0gbmFtZT0iZmllbGRMYWJlbCIvPgotCQk8eHNsOnBhcmFtIG5hbWU9ImZpZWxkVGV4dCIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImltYWdlUGF0aCIgc2VsZWN0PSJjb25jYXQoL0VsZW1lbnQvQEJhY2tQYXRoLCAnaW1hZ2VzLycpIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iaWQiPnByb3BlcnR5Xzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZmllbGRMYWJlbCIvPjwveHNsOnZhcmlhYmxlPgotCQk8eHNsOmlmIHRlc3Q9IiRmaWVsZFRleHQgIT0gJycgIj4KLQkJCTx0ciB2YWxpZ249InRvcCI+Ci0JCQkJPHRoIGNsYXNzPSJzZWN0aW9uVGFibGVIZWFkaW5nIiBzY29wZT0icm93Ij4KLQkJCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0iaWQiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkaWQiLz48L3hzbDphdHRyaWJ1dGU+Ci0JCQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9ImFiYnIiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZmllbGRMYWJlbCIvPjwveHNsOmF0dHJpYnV0ZT4KLQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRmaWVsZExhYmVsIi8+Ci0JCQkJPC90aD4KLQkJCQk8eHNsOmNob29zZT4KLQkJCQkJPHhzbDp3aGVuIHRlc3Q9IiRmaWVsZFRleHQgPSAndHJ1ZScgb3IgJGZpZWxkVGV4dCA9ICdmYWxzZSciPgotCQkJCQkJPHRkIGNsYXNzPSJzZWN0aW9uVGFibGVDZWxsIiBhbGlnbj0ibGVmdCI+Ci0JCQkJCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0iaGVhZGVycyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRpZCIvPjwveHNsOmF0dHJpYnV0ZT4KLQkJCQkJCQk8eHNsOmNob29zZT4KLQkJCQkJCQkJPHhzbDp3aGVuIHRlc3Q9IiRmaWVsZFRleHQgPSAndHJ1ZSciPgotCQkJCQkJCQkJPGltZyB3aWR0aD0iMjAiIGhlaWdodD0iMTUiIGFsdD0iWWVzIiB0aXRsZT0iWWVzIj4KLQkJCQkJCQkJCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJzcmMiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkaW1hZ2VQYXRoIi8+dHJ1ZS5naWY8L3hzbDphdHRyaWJ1dGU+Ci0JCQkJCQkJCQk8L2ltZz4KLQkJCQkJCQkJPC94c2w6d2hlbj4KLQkJCQkJCQkJPHhzbDpvdGhlcndpc2U+Ci0JCQkJCQkJCQk8aW1nIHdpZHRoPSIyMCIgaGVpZ2h0PSIxNSIgYWx0PSIiIHRpdGxlPSIiPgotCQkJCQkJCQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9InNyYyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRpbWFnZVBhdGgiLz5pbmRlbnQuZ2lmPC94c2w6YXR0cmlidXRlPgotCQkJCQkJCQkJPC9pbWc+Ci0JCQkJCQkJCTwveHNsOm90aGVyd2lzZT4KLQkJCQkJCQk8L3hzbDpjaG9vc2U+Ci0JCQkJCQkJPCEtLQotCQkJCQkJCTxsYWJlbCBmb3I9ImNib3gxIi8+Ci0JCQkJCQkJPGlucHV0IHR5cGU9ImNoZWNrYm94IiBuYW1lPSJwcm9wZXJ0eSI+Ci0JCQkJCQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9InJlYWRvbmx5Ij50cnVlPC94c2w6YXR0cmlidXRlPgotCQkJCQkJCQk8eHNsOmlmIHRlc3Q9IiRmaWVsZFRleHQgPSAndHJ1ZSciPgotCQkJCQkJCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0iY2hlY2tlZCI+Y2hlY2tlZDwveHNsOmF0dHJpYnV0ZT4KLQkJCQkJCQkJPC94c2w6aWY+Ci0JCQkJCQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9ImlkIj5jYm94MTwveHNsOmF0dHJpYnV0ZT4KLQkJCQkJCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0idmFsdWUiPmNib3gxPC94c2w6YXR0cmlidXRlPgotCQkJCQkJCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJvbmNsaWNrIj48eHNsOmNob29zZT48eHNsOndoZW4gdGVzdD0iJGZpZWxkVGV4dCA9ICd0cnVlJyI+Ci0JIAkJCQkJCQkJdGhpcy5jaGVja2VkPXRydWU7Ci0gCQkJCQkJCQk8L3hzbDp3aGVuPjx4c2w6b3RoZXJ3aXNlPgotIAkJCQkJCQkJCXRoaXMuY2hlY2tlZD1mYWxzZTsKLSAJCQkJCQkJCTwveHNsOm90aGVyd2lzZT48L3hzbDpjaG9vc2U+PC94c2w6YXR0cmlidXRlPgotCQkJCQkJCTwvaW5wdXQ+Ci0JCQkJCQkJLS0+Ci0JCQkJCQk8L3RkPgotCQkJCQk8L3hzbDp3aGVuPgotCQkJCQk8eHNsOm90aGVyd2lzZT4KLQkJCQkJCTx0ZCBjbGFzcz0ic2VjdGlvblRhYmxlQ2VsbCI+Ci0JCQkJCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0iaGVhZGVycyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRpZCIvPjwveHNsOmF0dHJpYnV0ZT4KLQkJCQkJCQk8eHNsOnZhbHVlLW9mIGRpc2FibGUtb3V0cHV0LWVzY2FwaW5nPSJ5ZXMiIHNlbGVjdD0iJGZpZWxkVGV4dCIvPgotCQkJCQkJPC90ZD4KLQkJCQkJPC94c2w6b3RoZXJ3aXNlPgotCQkJCTwveHNsOmNob29zZT4KLQkJCTwvdHI+Ci0JCTwveHNsOmlmPgotCTwveHNsOnRlbXBsYXRlPgotCi08L3hzbDpzdHlsZXNoZWV0PgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L3hzbC9wdXJwb3NlLnhzbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC94c2wvcHVycG9zZS54c2wKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwYmE2YzcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L3hzbC9wdXJwb3NlLnhzbAorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLQotPHhzbDpzdHlsZXNoZWV0IHZlcnNpb249IjEuMCIKLQl4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIKLQl4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIj4KLQotCTx4c2w6dGVtcGxhdGUgbmFtZT0icHVycG9zZVNlY3Rpb24iPgotCQk8eHNsOnBhcmFtIG5hbWU9ImRlc2NyaXB0aW9uIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0icHVycG9zZSIgc2VsZWN0PSIkZGVzY3JpcHRpb24vYXR0cmlidXRlW0BuYW1lPSdwdXJwb3NlJ10iLz4KLQkJPHhzbDppZiB0ZXN0PSIkcHVycG9zZSAhPSAnJyI+Ci0JCQk8ZGl2IGNsYXNzPSJzZWN0aW9uSGVhZGluZyI+Ci0JCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwdXJwb3NlVGV4dCIvPgotCQkJPC9kaXY+Ci0JCQk8ZGl2IGNsYXNzPSJzZWN0aW9uQ29udGVudCI+Ci0JCQkJPHRhYmxlIGNsYXNzPSJzZWN0aW9uVGFibGUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4KLQkJCQkJPHRyIHZhbGlnbj0idG9wIj4KLQkJCQkJCTx0ZCBjbGFzcz0ic2VjdGlvblRhYmxlU2luZ2xlQ2VsbCI+Ci0JCQkJCQkJPHhzbDp2YWx1ZS1vZiBkaXNhYmxlLW91dHB1dC1lc2NhcGluZz0ieWVzIiBzZWxlY3Q9IiRwdXJwb3NlIi8+Ci0JCQkJCQk8L3RkPgotCQkJCQk8L3RyPgotCQkJCTwvdGFibGU+Ci0JCQk8L2Rpdj4KLQkJPC94c2w6aWY+Ci0JPC94c2w6dGVtcGxhdGU+Ci0KLTwveHNsOnN0eWxlc2hlZXQ+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQveHNsL3Jlc291cmNlcy5wcm9wZXJ0aWVzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L3hzbC9yZXNvdXJjZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWI3NzU4My4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQveHNsL3Jlc291cmNlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjUwICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSCi0jIFRoZSBVSSB0ZXh0IGluIHRoZSBYU0wgc3R5bGVzaGVldHMuCi0KLSMKLSMgYmVnaW4gZWxlbWVudCB0eXBlIHRleHQgc2VjdGlvbgotIyB1c2VyIGNhbiBjdXN0b21pemUgdGhlIHR5cGUgdGV4dCBiZWZvcmUgcHVibGlzaGluZwotIwotYWN0aXZpdHlUZXh0PUFjdGl2aXR5Ci1hcnRpZmFjdFRleHQ9QXJ0aWZhY3QKLWNhcGFiaWxpdHlQYXR0ZXJuVGV4dD1DYXBhYmlsaXR5IFBhdHRlcm4KLWNoZWNrbGlzdFRleHQ9Q2hlY2tsaXN0Ci1jb21wb3NpdGVSb2xlVGV4dD1Db21wb3NpdGUgUm9sZQotY29uY2VwdFRleHQ9Q29uY2VwdAotY3VzdG9tQ2F0ZWdvcnlUZXh0PUN1c3RvbSBDYXRlZ29yeQotZGVsaXZlcmFibGVUZXh0PURlbGl2ZXJhYmxlCi1kZWxpdmVyeVByb2Nlc3NUZXh0PURlbGl2ZXJ5IFByb2Nlc3MKLWRpc2NpcGxpbmVUZXh0PURpc2NpcGxpbmUKLWRpc2NpcGxpbmVHcm91cGluZ1RleHQ9RGlzY2lwbGluZSBHcm91cGluZwotZG9tYWluVGV4dD1Eb21haW4KLWVzdGltYXRpb25Db25zaWRlcmF0aW9uc1RleHQ9RXN0aW1hdGlvbiBDb25zaWRlcmF0aW9ucwotZXhhbXBsZVRleHQ9RXhhbXBsZQotZ3VpZGVsaW5lVGV4dD1HdWlkZWxpbmUKLWl0ZXJhdGlvblRleHQ9SXRlcmF0aW9uCi1taWxlc3RvbmVUZXh0PU1pbGVzdG9uZQotb3V0Y29tZVRleHQ9T3V0Y29tZQotcGhhc2VUZXh0PVBoYXNlCi1wcmFjdGljZVRleHQ9UHJhY3RpY2UKLXJlcG9ydFRleHQ9UmVwb3J0Ci1yZXVzYWJsZUFzc2V0VGV4dD1SZXVzYWJsZSBBc3NldAotcm9hZG1hcFRleHQ9Um9hZG1hcAotcm9sZVRleHQ9Um9sZQotcm9sZURlc2NyaXB0b3JUZXh0PVJvbGUgRGVzY3JpcHRvcgotcm9sZVNldFRleHQ9Um9sZSBTZXQKLXJvbGVTZXRHcm91cGluZ1RleHQ9Um9sZSBTZXQgR3JvdXBpbmcKLXN1cHBvcnRpbmdNYXRlcmlhbFRleHQ9U3VwcG9ydGluZyBNYXRlcmlhbAotdGFza1RleHQ9VGFzawotdGFza0Rlc2NyaXB0b3JUZXh0PVRhc2sgRGVzY3JpcHRvcgotdGVhbVByb2ZpbGVUZXh0PVRlYW0gUHJvZmlsZQotdGVtcGxhdGVUZXh0PVRlbXBsYXRlCi10ZXJtRGVmaW5pdGlvblRleHQ9VGVybSBEZWZpbml0aW9uCi10b29sVGV4dD1Ub29sCi10b29sTWVudG9yVGV4dD1Ub29sIE1lbnRvcgotd2hpdGVwYXBlclRleHQ9V2hpdGVwYXBlcgotd29ya1Byb2R1Y3REZXNjcmlwdG9yVGV4dD1Xb3JrIFByb2R1Y3QgRGVzY3JpcHRvcgotd29ya1Byb2R1Y3RUeXBlVGV4dD1Xb3JrIFByb2R1Y3QgS2luZAotd29ya1Byb2R1Y3RTbG90VGV4dD1Xb3JrIFByb2R1Y3QgU2xvdAotCi0jCi0jIGVuZCBlbGVtZW50IHR5cGUgdGV4dCBzZWN0aW9uCi0jCi0KLSMKLSMgb3RoZXIgbGF5b3V0IHRleHQgYmVsb3cKLSMKLWFkZGl0aW9uYWxJbmZvVGV4dD1BZGRpdGlvbmFsIEluZm9ybWF0aW9uCi1hZGRpdGlvbmFsUGVyZm9ybWVyVGV4dD1BZGRpdGlvbmFsIFBlcmZvcm1lcnMKLWFnZ3JlZ2F0ZXNUZXh0PUFnZ3JlZ2F0ZXMKLWFsdGVybmF0aXZlc1RleHQ9QWx0ZXJuYXRpdmVzCi1hcHBsaWNhdGlvblRleHQ9QXBwbGljYXRpb24KLQotYXNzZXRzVGV4dD1Bc3NldHMKLWFzc2lnbm1lbnRBcHByb2FjaGVzVGV4dD1Bc3NpZ25tZW50IEFwcHJvYWNoZXMKLWFzc2lzdGluZ1RleHQ9QXNzaXN0aW5nCi1hdHRhY2hlZEZpbGVzVGV4dD1BdHRhY2hlZCBGaWxlcwotYmFja2dyb3VuZFRleHQ9QmFja2dyb3VuZAotYnJpZWZPdXRsaW5lVGV4dD1CcmllZiBPdXRsaW5lCi1jYXRlZ29yaWVzVGV4dD1DYXRlZ29yaWVzCi1jaGVja0l0ZW1zVGV4dD1DaGVjayBJdGVtcwotY2hlY2tsaXN0c1RleHQ9Q2hlY2tsaXN0cwotY29sbGFwc2VBbGxUZXh0PUNvbGxhcHNlIEFsbCBDaGVjayBJdGVtcwotCi1jb25jZXB0c1RleHQ9Q29uY2VwdHMKLWNvbnRhaW5lZEFydGlmYWN0c1RleHQ9Q29udGFpbmVkIEFydGlmYWN0cwotY29udGFpbmVyQXJ0aWZhY3RUZXh0PUNvbnRhaW5lciBBcnRpZmFjdAotY29udGVudEVsZW1lbnRzVGV4dD1DYXRlZ29yaXplZCBFbGVtZW50cwotY29udGVudFJlZmVyZW5jZXNUZXh0PUNvbnRlbnQgUmVmZXJlbmNlcwotCi1kZWxpdmVyYWJsZVByb3BlcnRpZXNUZXh0PURlbGl2ZXJhYmxlIFByb3BlcnRpZXMKLWRlbGl2ZXJlZFBhcnRzVGV4dD1EZWxpdmVyYWJsZSBQYXJ0cwotZGVsaXZlcmVkV29ya1Byb2R1Y3RzVGV4dD1EZWxpdmVyZWQgV29yayBQcm9kdWN0cwotZGVwZW5kZW50VGV4dD1EZXBlbmRlbnQgV29yayBQcm9kdWN0cwotZGVzY3JpcHRpb25UZXh0PURlc2NyaXB0aW9uCi1kZXNjcmlwdG9yc1RleHQ9RGVzY3JpcHRvcnMKLQotZGlzY2lwbGluZXNUZXh0PURpc2NpcGxpbmVzCi1zdWJkaXNjaXBsaW5lc1RleHQ9U3ViZGlzY2lwbGluZXMKLQotZG9tYWluc1RleHQ9RG9tYWlucwotZXhhbXBsZXNUZXh0PUV4YW1wbGVzCi1leHBhbmRBbGxUZXh0PUV4cGFuZCBBbGwgQ2hlY2sgSXRlbXMKLWV4dGVuZHNUZXh0PUV4dGVuZHMKLWV4dGVybmFsVGV4dD1FeHRlcm5hbAotZXh0ZXJuYWxEZXNjcmlwdGlvblRleHQ9RXh0ZXJuYWwgRGVzY3JpcHRpb24KLWdvYWxzVGV4dD1Hb2FscwotZ3VpZGVsaW5lc1RleHQ9R3VpZGVsaW5lcwotaWxsdXN0cmF0aW9uc1RleHQ9SWxsdXN0cmF0aW9ucwkKLWltcGFjdE9mTm90SGF2aW5nVGV4dD1JbXBhY3Qgb2Ygbm90IGhhdmluZwotaW1wYWN0aW5nVGV4dD1JbXBhY3RpbmcgV29yayBQcm9kdWN0cwotaW5wdXRzVGV4dD1JbnB1dHMKLWlucHV0VG9UZXh0PUlucHV0IFRvCi1pdGVtc1RleHQ9SXRlbXMKLWtleUNvbnNpZGVyYXRpb25zVGV4dD1LZXkgQ29uc2lkZXJhdGlvbnMKLWxldmVsc09mQWRvcHRpb25UZXh0PUxldmVscyBvZiBBZG9wdGlvbgotbWFuZGF0b3J5VGV4dD1NYW5kYXRvcnkKLW1haW5UZXh0PU1haW4KLW1haW5EZXNjcmlwdGlvblRleHQ9TWFpbiBEZXNjcmlwdGlvbgotbWFpblJlc3BvbnNpYmxlVGV4dD1NYWluIFJlc3BvbnNpYmxlCi1tZXRob2RUZXh0PU1ldGhvZCBXb3JrIFByb2R1Y3QKLW1vZGlmaWVkQnlUZXh0PU1vZGlmaWVkIEJ5Ci1tb3JlSW5mb1RleHQ9TW9yZSBJbmZvcm1hdGlvbgotbm90YXRpb25UZXh0PU5vdGF0aW9uCi1vcHRpb25hbFRleHQ9T3B0aW9uYWwKLQotb3V0cHV0RnJvbVRleHQ9T3V0cHV0IEZyb20KLW91dHB1dHNUZXh0PU91dHB1dHMKLXBhY2thZ2luZ0luc3RydWN0aW9uc1RleHQ9UGFja2FnaW5nIEluc3RydWN0aW9ucwotcGFja2FnaW5nR3VpZGFuY2VUZXh0PVBhY2thZ2luZyBHdWlkYW5jZQotcGVyZm9ybWluZ1JvbGVzVGV4dD1QZXJmb3JtaW5nIFJvbGVzCi1wcmltYXJ5UGVyZm9ybWVyVGV4dD1QcmltYXJ5IFBlcmZvcm1lcgotcHJvYmxlbVRleHQ9V2h5IGFkb3B0IHRoaXMgcHJhY3RpY2UKLXByb3BlcnRpZXNUZXh0PVByb3BlcnRpZXMKLXB1cnBvc2VUZXh0PVB1cnBvc2UKLXJlYXNvbnNGb3JOb3ROZWVkaW5nVGV4dD1SZWFzb25zIGZvciBub3QgbmVlZGluZwotcmVmZXJlbmNlV29ya2Zsb3dzVGV4dD1SZWZlcmVuY2UgV29ya2Zsb3dzCi1yZWxhdGVkRWxlbWVudHNUZXh0PVJlbGF0ZWQgRWxlbWVudHMKLXJlbGF0aW9uc2hpcHNUZXh0PVJlbGF0aW9uc2hpcHMKLXJlcG9ydHNUZXh0PVJlcG9ydHMKLXJlcHJlc2VudGF0aW9uT3B0aW9uc1RleHQ9UmVwcmVzZW50YXRpb24gT3B0aW9ucwotcmVzcG9uc2libGVUZXh0PVJlc3BvbnNpYmxlCi1yZXNwb25zaWJsZUZvclRleHQ9UmVzcG9uc2libGUgZm9yCi1yZXVzYWJsZUFzc2V0c1RleHQ9UmV1c2FibGUgQXNzZXRzCi0KLXJvbGVzVGV4dD1Sb2xlcwotcm9sZVNldHNUZXh0PVJvbGUgU2V0cwotc2tpbGxzVGV4dD1Ta2lsbHMKLXN0YWZmaW5nVGV4dD1TdGFmZmluZwotc3RlcHNUZXh0PVN0ZXBzCi1zdWJjYXRlZ29yaWVzVGV4dD1TdWItQ2F0ZWdvcmllcwkKLXN1YmRvbWFpbnNUZXh0PVN1YmRvbWFpbnMKLXN1YlByYWN0aWNlc1RleHQ9U3ViLVByYWN0aWNlcwotc3VwZXJUZWFtVGV4dD1TdXBlci1UZWFtIFByb2ZpbGUKLXN1cHBvcnRpbmdNYXRlcmlhbHNUZXh0PVN1cHBvcnRpbmcgTWF0ZXJpYWxzCi1zdWJ0ZWFtc1RleHQ9U3ViLVRlYW1zIFByb2ZpbGVzCi1zeW5vbnltc1RleHQ9U3lub255bXMKLXRhaWxvcmluZ1RleHQ9VGFpbG9yaW5nCi0KLXRhc2tzVGV4dD1UYXNrcwotdGJzVGV4dD1UZWFtIEFsbG9jYXRpb24KLQotdGVhbVJvbGVzVGV4dD1UZWFtIFByb2ZpbGUgUm9sZXMKLXRlY2huaXF1ZXNUZXh0PUd1aWRlbGluZXMKLXRlbXBsYXRlc1RleHQ9VGVtcGxhdGVzCi10b29sTWVudG9yc1RleHQ9VG9vbCBNZW50b3JzCi0KLXVzYWdlVGV4dD1Vc2FnZQotd2JzVGV4dD1Xb3JrIEJyZWFrZG93biBTdHJ1Y3R1cmUKLXdoaXRlcGFwZXJzVGV4dD1XaGl0ZXBhcGVycwotd29ya1Byb2R1Y3RzVGV4dD1Xb3JrIFByb2R1Y3RzCi13b3JrUHJvZHVjdFR5cGVzVGV4dD1Xb3JrIFByb2R1Y3QgS2luZHMKLXdwYnNUZXh0PVdvcmsgUHJvZHVjdCBVc2FnZQotd29ya0JyZWFrZG93blRleHQ9V29yayBCcmVha2Rvd24KLXdvcmtmbG93VGV4dD1Xb3JrZmxvdwotd29ya1Byb2R1Y3RCcmVha2Rvd25UZXh0PVdvcmsgUHJvZHVjdCBCcmVha2Rvd24KLXdvcmtQcm9kdWN0RGVwZW5kZW5jaWVzVGV4dD1Xb3JrIFByb2R1Y3QgRGVwZW5kZW5jaWVzCi10ZWFtUHJvZmlsZUJyZWFrZG93blRleHQ9VGVhbSBCcmVha2Rvd24KLXRlYW1TdHJ1Y3R1cmVUZXh0PVRlYW0gU3RydWN0dXJlCi1wYWdlTm90SW5zdGFsbGVkVGV4dD1QYWdlIE5vdCBJbnN0YWxsZWQKLWVsZW1lbnREb2VzTm90RXhpc3RUZXh0PUVsZW1lbnQgRG9lcyBOb3QgRXhpc3QKLWlzTm90VmFsaWRUZXh0PVRoZSByZWZlcmVuY2VkIGVsZW1lbnQgaXMgbm90IGEgdmFsaWQgZWxlbWVudCBpbiB0aGUgY3VycmVudCBsaWJyYXJ5LgotZWxlbWVudE1pZ2h0QmVEZWxldGVkVGV4dD1UaGUgZWxlbWVudCBtYXkgaGF2ZSBiZWVuIGRlbGV0ZWQgZnJvbSB0aGUgbGlicmFyeS4KLXBsZWFzZUZpeExpbmtUZXh0PVBsZWFzZSBjaGVjayB5b3VyIGNvbnRlbnQgbGlicmFyeSBhbmQgZml4IHRoZSBsaW5rLgotaW5mb0Fib3V0TWlzc2luZ0VsZW1lbnRUZXh0PUluZm9ybWF0aW9uIGFib3V0IHRoZSBtaXNzaW5nIGVsZW1lbnQ6Ci1lbGVtZW50TmFtZVRleHQ9RWxlbWVudCBOYW1lOgotZ3VpZFRleHQ9R1VJRDoKLW1pc3NpbmdFbGVtZW50VGV4dD1SZWZlcmVuY2VkIHBhZ2UgaXMgbm90IGluIHRoaXMgY29uZmlndXJhdGlvbgotbm90QXZhaWxhYmxlVGV4dD1UaGUgcmVmZXJlbmNlZCBwYWdlIGlzIG5vdCBhdmFpbGFibGUgaW4gdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbi4gVGhpcyBwYWdlIG1heSBiZSBhdmFpbGFibGUgaW4gYW5vdGhlciBwcm9jZXNzIGNvbmZpZ3VyYXRpb24uCi1lbGVtZW50VHlwZVRleHQ9RWxlbWVudCBUeXBlOgotcGx1Z2luTmFtZVRleHQ9UGx1Zy1pbiBOYW1lOgotcHJlZGVjZXNzb3JUZXh0PVByZWRlY2Vzc29yCi1wbGFubmluZ0RhdGFUZXh0PVBsYW5uaW5nIERhdGEKLW11bHRpcGxlT2NjdXJyZW5jZXNUZXh0PU11bHRpcGxlIE9jY3VycmVuY2VzCi1ldmVudERyaXZlblRleHQ9RXZlbnQgRHJpdmVuCi1vbmdvaW5nVGV4dD1PbmdvaW5nCi1wbGFubmVkVGV4dD1QbGFubmVkCi1yZXBlYXRhYmxlVGV4dD1SZXBlYXRhYmxlCi11c2FnZUd1aWRhbmNlVGV4dD1Vc2FnZSBHdWlkYW5jZQotYWN0aXZpdHlFbnRyeVN0YXRlVGV4dD1BY3Rpdml0eSBFbnRyeSBTdGF0ZQotYWN0aXZpdHlFeGl0U3RhdGVUZXh0PUFjdGl2aXR5IEV4aXQgU3RhdGUKLXByZWZpeFRleHQ9UHJlZml4Ci1leHRlcm5hbElkVGV4dD1FeHRlcm5hbCBJZAotc2NvcGVUZXh0PVNjb3BlCi0KLXR5cGVvZkNvbnRyYWN0VGV4dD1UeXBlIG9mIENvbnRyYWN0Ci1wcm9qZWN0Q2hhcmFjdGVyaXN0aWNzVGV4dD1Qcm9qZWN0IENoYXJhY3RlcmlzdGljcwotcHJvamVjdE1lbWJlckV4cGVydGlzZVRleHQ9UHJvamVjdCBNZW1iZXIgRXhwZXJ0aXNlCi1yaXNrTGV2ZWxUZXh0PVJpc2sgTGV2ZWwKLXNjYWxlVGV4dD1TY2FsZQotdXNhZ2VOb3Rlc1RleHQ9VXNhZ2UgTm90ZXMKLWNvbnRleHRUZXh0PUNvbnRleHQKLXBhcmVudEFjdGl2aXRpZXNUZXh0PVBhcmVudCBBY3Rpdml0aWVzCi1pbmNsdWRlZFBhdHRlcm5zVGV4dD1JbmNsdWRlZCBQYXR0ZXJucwotCi1jb21tdW5pY2F0aW9uc01hdGVyaWFsc1RleHQ9Q29tbXVuaWNhdGlvbnMgTWF0ZXJpYWxzCi1lZHVjYXRpb25NYXRlcmlhbHNUZXh0PUVkdWNhdGlvbiBNYXRlcmlhbHMKLWVzdGltYXRpbmdUZWNobmlxdWVUZXh0PUVzdGltYXRpbmcgVGVjaG5pcXVlCi1hZGRpdGlvbmFsVGV4dD1BZGRpdGlvbmFsCi1tb2RpZmllc1RleHQ9TW9kaWZpZXMKLWFkZGl0aW9uYWxseVBlcmZvcm1zVGV4dD1BZGRpdGlvbmFsbHkgUGVyZm9ybXMKLWluZGV4VGV4dD1JbmRleAotYnJlYWtkb3duRWxlbWVudFRleHQ9QnJlYWtkb3duIEVsZW1lbnQKLXByZWRlY2Vzc29yc1RleHQ9UHJlZGVjZXNzb3JzCi10eXBlVGV4dD1UeXBlCi0KLW1vZGVsSW5mb1RleHQ9TW9kZWwgSW5mbwotZW50cnlTdGF0ZVRleHQ9RW50cnkgU3RhdGUKLWV4aXRTdGF0ZVRleHQ9RXhpdCBTdGF0ZQotdGVhbVRleHQ9VGVhbQotcGFyZW50UGFja2FnZVRleHQ9UGFyZW50IFBhY2thZ2UKLWNvbnRhaW5lZFBhY2thZ2VzVGV4dD1Db250YWluZWQgUGFja2FnZXMKLWNvbnRlbnRzVGV4dD1Db250ZW50cwotYmFzZWRPbk1ldGhvZFJvbGVUZXh0PUJhc2VkIG9uIE1ldGhvZCBSb2xlCi1iYXNlZE9uTWV0aG9kVGFza1RleHQ9QmFzZWQgb24gTWV0aG9kIFRhc2sKLWJhc2VkT25NZXRob2RXb3JrUHJvZHVjdFRleHQ9QmFzZWQgb24gTWV0aG9kIFdvcmsgUHJvZHVjdAotc3VtbWFyeVRleHQ9U3VtbWFyeQotcGVyZm9ybXNUZXh0PVBlcmZvcm1zCi1yZXBsYWNlc1RleHQ9UmVwbGFjZXMKLWNvbnRyaWJ1dGVzVGV4dD1Db250cmlidXRlcwotbm9uZVRleHQ9Tm9uZQotCi1hY3Rpdml0eVJlZmVyZW5jZXNUZXh0PUFjdGl2aXR5IFJlZmVyZW5jZXMKLW5hbWVUZXh0PU5hbWUKLXByZXNlbnRhdGlvbk5hbWVUZXh0PVByZXNlbnRhdGlvbiBOYW1lCi1yZXByZXNlbnRhdGlvblRleHQ9U2VsZWN0ZWQgUmVwcmVzZW50YXRpb24KLXByb2plY3RTcGVjaWZpY3NUZXh0PVByb2plY3QgU3BlY2lmaWNzCi1leHRlbmRzUmVwbGFjZXNUZXh0PUV4dGVuZHMgYW5kIFJlcGxhY2VzCi13b3JrUHJvZHVjdFRleHQ9V29yayBQcm9kdWN0Ci1wcm9jZXNzVXNhZ2VUZXh0PVByb2Nlc3MgVXNhZ2UKLQotZnVsZmlsbGVkU2xvdHNUZXh0PUZ1bGZpbGxlZCBTbG90cwotZnVsZmlsbGluZ1dvcmtQcm9kdWN0c1RleHQ9RnVsZmlsbGluZyBXb3JrIFByb2R1Y3RzClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L3hzbC9yZXNvdXJjZXMueHNsIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L3hzbC9yZXNvdXJjZXMueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYzgyMjhmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC94c2wvcmVzb3VyY2VzLnhzbAorKysgL2Rldi9udWxsCkBAIC0xLDIzMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci0KLTx4c2w6c3R5bGVzaGVldCB2ZXJzaW9uPSIxLjAiCi0JeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iCi0JeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSI+Ci0JCi0JCi08IS0tIHRoZSBlbGVtZW50IHR5cGUgdGV4dCAtLT4KLTx4c2w6cGFyYW0gbmFtZT0iYWN0aXZpdHlUZXh0Ii8+Ci08eHNsOnBhcmFtIG5hbWU9ImFydGlmYWN0VGV4dCIvPgotPHhzbDpwYXJhbSBuYW1lPSJjYXBhYmlsaXR5UGF0dGVyblRleHQiLz4KLTx4c2w6cGFyYW0gbmFtZT0iY2hlY2tsaXN0VGV4dCIvPgotPHhzbDpwYXJhbSBuYW1lPSJjb21wb3NpdGVSb2xlVGV4dCIvPgotPHhzbDpwYXJhbSBuYW1lPSJjb25jZXB0VGV4dCIvPgotPHhzbDpwYXJhbSBuYW1lPSJjdXN0b21DYXRlZ29yeVRleHQiLz4KLTx4c2w6cGFyYW0gbmFtZT0iZGVsaXZlcmFibGVUZXh0Ii8+Ci08eHNsOnBhcmFtIG5hbWU9ImRlbGl2ZXJ5UHJvY2Vzc1RleHQiLz4KLTx4c2w6cGFyYW0gbmFtZT0iZGlzY2lwbGluZVRleHQiLz4KLTx4c2w6cGFyYW0gbmFtZT0iZGlzY2lwbGluZUdyb3VwaW5nVGV4dCIvPgotPHhzbDpwYXJhbSBuYW1lPSJkb21haW5UZXh0Ii8+Ci08eHNsOnBhcmFtIG5hbWU9ImVzdGltYXRpb25Db25zaWRlcmF0aW9uc1RleHQiLz4KLTx4c2w6cGFyYW0gbmFtZT0iZXhhbXBsZVRleHQiLz4KLTx4c2w6cGFyYW0gbmFtZT0iZ3VpZGVsaW5lVGV4dCIvPgotPHhzbDpwYXJhbSBuYW1lPSJpdGVyYXRpb25UZXh0Ii8+Ci08eHNsOnBhcmFtIG5hbWU9Im1pbGVzdG9uZVRleHQiLz4KLTx4c2w6cGFyYW0gbmFtZT0ib3V0Y29tZVRleHQiLz4KLTx4c2w6cGFyYW0gbmFtZT0icGhhc2VUZXh0Ii8+Ci08eHNsOnBhcmFtIG5hbWU9InByYWN0aWNlVGV4dCIvPgotPHhzbDpwYXJhbSBuYW1lPSJyZXBvcnRUZXh0Ii8+Ci08eHNsOnBhcmFtIG5hbWU9InJldXNhYmxlQXNzZXRUZXh0Ii8+Ci08eHNsOnBhcmFtIG5hbWU9InJvYWRtYXBUZXh0Ii8+Ci08eHNsOnBhcmFtIG5hbWU9InJvbGVUZXh0Ii8+Ci08eHNsOnBhcmFtIG5hbWU9InJvbGVEZXNjcmlwdG9yVGV4dCIvPgotPHhzbDpwYXJhbSBuYW1lPSJyb2xlU2V0VGV4dCIvPgotPHhzbDpwYXJhbSBuYW1lPSJyb2xlU2V0R3JvdXBpbmdUZXh0Ii8+Ci08eHNsOnBhcmFtIG5hbWU9InN1cHBvcnRpbmdNYXRlcmlhbFRleHQiLz4KLTx4c2w6cGFyYW0gbmFtZT0idGFza1RleHQiLz4KLTx4c2w6cGFyYW0gbmFtZT0idGFza0Rlc2NyaXB0b3JUZXh0Ii8+Ci08eHNsOnBhcmFtIG5hbWU9InRlYW1Qcm9maWxlVGV4dCIvPgotPHhzbDpwYXJhbSBuYW1lPSJ0ZW1wbGF0ZVRleHQiLz4KLTx4c2w6cGFyYW0gbmFtZT0idGVybURlZmluaXRpb25UZXh0Ii8+Ci08eHNsOnBhcmFtIG5hbWU9InRvb2xUZXh0Ii8+Ci08eHNsOnBhcmFtIG5hbWU9InRvb2xNZW50b3JUZXh0Ii8+Ci08eHNsOnBhcmFtIG5hbWU9IndoaXRlcGFwZXJUZXh0Ii8+Ci08eHNsOnBhcmFtIG5hbWU9IndvcmtQcm9kdWN0RGVzY3JpcHRvclRleHQiLz4KLTx4c2w6cGFyYW0gbmFtZT0id29ya1Byb2R1Y3RUeXBlVGV4dCIvPgotPHhzbDpwYXJhbSBuYW1lPSJ3b3JrUHJvZHVjdFNsb3RUZXh0Ii8+Ci0KLTwhLS0gb3RoZXIgdGV4dCB2YXJpYWJsZXMgLS0+Ci0JPHhzbDpwYXJhbSBuYW1lPSJhY3Rpdml0eUVudHJ5U3RhdGVUZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJhY3Rpdml0eUV4aXRTdGF0ZVRleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9ImFkZGl0aW9uYWxJbmZvVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0iYWRkaXRpb25hbGx5UGVyZm9ybXNUZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJhZGRpdGlvbmFsUGVyZm9ybWVyVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0iYWRkaXRpb25hbFRleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9ImFnZ3JlZ2F0ZXNUZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJhbHRlcm5hdGl2ZXNUZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJhcHBsaWNhdGlvblRleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9ImFzc2V0c1RleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9ImFzc2lnbm1lbnRBcHByb2FjaGVzVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0iYXNzaXN0aW5nVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0iYXR0YWNoZWRGaWxlc1RleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9ImJhY2tncm91bmRUZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJiYXNlZE9uTWV0aG9kUm9sZVRleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9ImJhc2VkT25NZXRob2RUYXNrVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0iYmFzZWRPbk1ldGhvZFdvcmtQcm9kdWN0VGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0iYnJlYWtkb3duRWxlbWVudFRleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9ImJyaWVmT3V0bGluZVRleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9ImNhdGVnb3JpZXNUZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJjaGVja0l0ZW1zVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0iY2hlY2tsaXN0c1RleHQiLz4KLQotCTx4c2w6cGFyYW0gbmFtZT0iY29sbGFwc2VBbGxUZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJjb21tdW5pY2F0aW9uc01hdGVyaWFsc1RleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9ImNvbmNlcHRzVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0iY29udGFpbmVkQXJ0aWZhY3RzVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0iY29udGFpbmVyQXJ0aWZhY3RUZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJjb250ZW50RWxlbWVudHNUZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJjb250ZW50UmVmZXJlbmNlc1RleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9ImNvbnRlbnRzVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0iY29udGV4dFRleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9ImNvbnRyaWJ1dGVzVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0iZGVsaXZlcmFibGVQcm9wZXJ0aWVzVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0iZGVsaXZlcmVkUGFydHNUZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJkZXBlbmRlbnRUZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJkZXNjcmlwdGlvblRleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9ImRlc2NyaXB0b3JzVGV4dCIvPgkKLQk8eHNsOnBhcmFtIG5hbWU9ImRpc2NpcGxpbmVzVGV4dCIvPgotCi0JPHhzbDpwYXJhbSBuYW1lPSJkb21haW5zVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0iZWR1Y2F0aW9uTWF0ZXJpYWxzVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0iZWxlbWVudERvZXNOb3RFeGlzdFRleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9ImVsZW1lbnRNaWdodEJlRGVsZXRlZFRleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9ImVsZW1lbnROYW1lVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0iZWxlbWVudFR5cGVUZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJlbnRyeVN0YXRlVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0iZXN0aW1hdGluZ1RlY2huaXF1ZVRleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9ImV2ZW50RHJpdmVuVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0iZXhhbXBsZXNUZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJleGl0U3RhdGVUZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJleHBhbmRBbGxUZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJleHRlbmRzVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0iZXh0ZXJuYWxEZXNjcmlwdGlvblRleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9ImV4dGVybmFsSWRUZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJleHRlcm5hbFRleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9ImdvYWxzVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0iZ3VpZGVsaW5lc1RleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9Imd1aWRUZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJpbGx1c3RyYXRpb25zVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0iaW1wYWN0aW5nVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0iaW1wYWN0T2ZOb3RIYXZpbmdUZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJpbmNsdWRlZFBhdHRlcm5zVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0iaW5kZXhUZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJpbmZvQWJvdXRNaXNzaW5nRWxlbWVudFRleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9ImlucHV0c1RleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9ImlucHV0VG9UZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJpc05vdFZhbGlkVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0ia2V5Q29uc2lkZXJhdGlvbnNUZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJsZXZlbHNPZkFkb3B0aW9uVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0ibWFpbkRlc2NyaXB0aW9uVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0ibWFpblJlc3BvbnNpYmxlVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0ibWFpblRleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9Im1hbmRhdG9yeVRleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9Im1pc3NpbmdFbGVtZW50VGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0ibW9kZWxJbmZvVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0ibW9kaWZpZWRCeVRleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9Im1vZGlmaWVzVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0ibW9yZUluZm9UZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJtdWx0aXBsZU9jY3VycmVuY2VzVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0ibm9uZVRleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9Im5vdGF0aW9uVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0ibm90QXZhaWxhYmxlVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0ib25nb2luZ1RleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9Im9wdGlvbmFsVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0ib3V0cHV0RnJvbVRleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9Im91dHB1dHNUZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJwYWNrYWdpbmdHdWlkYW5jZVRleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9InBhY2thZ2luZ0luc3RydWN0aW9uc1RleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9InBhZ2VOb3RJbnN0YWxsZWRUZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJwYXJlbnRBY3Rpdml0aWVzVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0icGVyZm9ybWluZ1JvbGVzVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0icGVyZm9ybXNUZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJwbGFubmVkVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0icGxhbm5pbmdEYXRhVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0icGxlYXNlRml4TGlua1RleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9InBsdWdpbk5hbWVUZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJwcmVkZWNlc3NvcnNUZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJwcmVkZWNlc3NvclRleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9InByZWZpeFRleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9InByaW1hcnlQZXJmb3JtZXJUZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJwcm9ibGVtVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0icHJvamVjdENoYXJhY3RlcmlzdGljc1RleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9InByb2plY3RNZW1iZXJFeHBlcnRpc2VUZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJwcm9qZWN0U3BlY2lmaWNzVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0icHJvcGVydGllc1RleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9InB1cnBvc2VUZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJyZWFzb25zRm9yTm90TmVlZGluZ1RleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9InJlZmVyZW5jZVdvcmtmbG93c1RleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9InJlbGF0ZWRFbGVtZW50c1RleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9InJlbGF0aW9uc2hpcHNUZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJyZXBlYXRhYmxlVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0icmVwbGFjZXNUZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJyZXBvcnRzVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0icmVwcmVzZW50YXRpb25PcHRpb25zVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0icmVzcG9uc2libGVGb3JUZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJyZXNwb25zaWJsZVRleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9InJldXNhYmxlQXNzZXRzVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0icmlza0xldmVsVGV4dCIvPgotCi0JPHhzbDpwYXJhbSBuYW1lPSJyb2xlU2V0c1RleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9InJvbGVzVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0ic2NhbGVUZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJzY29wZVRleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9InNraWxsc1RleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9InN0YWZmaW5nVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0ic3RlcHNUZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJzdWJjYXRlZ29yaWVzVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0ic3ViZG9tYWluc1RleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9InN1YlByYWN0aWNlc1RleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9InN1YlRlYW1zVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0ic3VtbWFyeVRleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9InN1cHBvcnRpbmdNYXRlcmlhbHNUZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJzeW5vbnltc1RleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9InRhaWxvcmluZ1RleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9InRhc2tzVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0idGJzVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0idGVhbVByb2ZpbGVCcmVha2Rvd25UZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJ0ZWFtUm9sZXNUZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJ0ZWFtU3RydWN0dXJlVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0idGVhbVRleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9InRlY2huaXF1ZXNUZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJ0ZW1wbGF0ZXNUZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJ0b29sTWVudG9yc1RleHQiLz4KLQotCTx4c2w6cGFyYW0gbmFtZT0idHlwZW9mQ29udHJhY3RUZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJ0eXBlVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0idXNhZ2VHdWlkYW5jZVRleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9InVzYWdlTm90ZXNUZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJ1c2FnZVRleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9Indic1RleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9IndoaXRlcGFwZXJzVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0id29ya0JyZWFrZG93blRleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9IndvcmtmbG93VGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0id29ya1Byb2R1Y3RCcmVha2Rvd25UZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJ3b3JrUHJvZHVjdERlcGVuZGVuY2llc1RleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9IndvcmtQcm9kdWN0c1RleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9IndvcmtQcm9kdWN0VHlwZXNUZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJ3cGJzVGV4dCIvPgotCi0JPHhzbDpwYXJhbSBuYW1lPSJhY3Rpdml0eVJlZmVyZW5jZXNUZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJjb2xvbl93aXRoX3NwYWNlIi8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJzdWJkaXNjaXBsaW5lc1RleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9InJlcHJlc2VudGF0aW9uVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0iZXh0ZW5kc1JlcGxhY2VzVGV4dCIvPgotCi0JPHhzbDpwYXJhbSBuYW1lPSJ3b3JrUHJvZHVjdFRleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9InByb2Nlc3NVc2FnZVRleHQiLz4KLQkKLQk8eHNsOnBhcmFtIG5hbWU9ImZ1bGZpbGxlZFNsb3RzVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0iZnVsZmlsbGluZ1dvcmtQcm9kdWN0c1RleHQiLz4KLQotPC94c2w6c3R5bGVzaGVldD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC94c2wvcm9sZS54c2wgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQveHNsL3JvbGUueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNjg3NmU1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC94c2wvcm9sZS54c2wKKysrIC9kZXYvbnVsbApAQCAtMSwyNDUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotCi08eHNsOnN0eWxlc2hlZXQgdmVyc2lvbj0iMS4wIgotCXhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIgotCXhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiPgotCi08eHNsOm91dHB1dCBtZXRob2Q9Imh0bWwiIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiAKLQlkb2N0eXBlLXB1YmxpYz0iLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iIAotCWRvY3R5cGUtc3lzdGVtPSJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIiAKLQlpbmRlbnQ9InllcyIvPgotCQotCTx4c2w6aW5jbHVkZSBocmVmPSJyZXNvdXJjZXMueHNsIi8+Ci0JPHhzbDppbmNsdWRlIGhyZWY9ImNvbW1vbi54c2wiLz4KLQk8eHNsOmluY2x1ZGUgaHJlZj0ib3ZlcnZpZXcueHNsIi8+Ci0JPHhzbDppbmNsdWRlIGhyZWY9Im1haW5fZGVzY3JpcHRpb24ueHNsIi8+Ci0JPHhzbDppbmNsdWRlIGhyZWY9ImlsbHVzdHJhdGlvbi54c2wiLz4KLQk8eHNsOmluY2x1ZGUgaHJlZj0ia2V5X2NvbnNpZGVyYXRpb24ueHNsIi8+Ci0JPHhzbDppbmNsdWRlIGhyZWY9Imd1aWRhbmNlX2hlbHBlci54c2wiLz4KLQk8eHNsOmluY2x1ZGUgaHJlZj0iZGVzY3JpcHRvcl9oZWxwZXIueHNsIi8+Ci0KLQk8eHNsOnRlbXBsYXRlIG1hdGNoPSIvRWxlbWVudCI+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iZWxlbWVudFR5cGUiIHNlbGVjdD0iQFR5cGUiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJlbGVtZW50VHlwZU5hbWUiIHNlbGVjdD0iQFR5cGVOYW1lIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iZWxlbWVudE5hbWUiIHNlbGVjdD0iQE5hbWUiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJlbGVtZW50UHJlc2VudGF0aW9uTmFtZSIgc2VsZWN0PSJARGlzcGxheU5hbWUiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJiYWNrUGF0aCIgc2VsZWN0PSJAQmFja1BhdGgiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJpbWFnZVBhdGgiIHNlbGVjdD0iY29uY2F0KCRiYWNrUGF0aCwgJ2ltYWdlcy8nKSIvPgotCSAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InNoYXBlSW1hZ2UiIHNlbGVjdD0iY29uY2F0KCRiYWNrUGF0aCxAU2hhcGVpY29uVXJsKSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InByZXNlbnRhdGlvbiIgc2VsZWN0PSJyZWZlcmVuY2VbQG5hbWU9J3ByZXNlbnRhdGlvbiddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0icm9sZURlc2NyaXB0aW9uIiBzZWxlY3Q9IiRwcmVzZW50YXRpb24vRWxlbWVudFtAVHlwZT0nUm9sZURlc2NyaXB0aW9uJ10iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJyb2xlU2V0cyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0W0BuYW1lPSdyb2xlU2V0cyddL0VsZW1lbnRbQFR5cGU9J1JvbGVTZXQnXSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImNvcHlyaWdodCIgc2VsZWN0PSJjb3B5cmlnaHQiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJzaG93VHJlZUJyb3dzZXIiIHNlbGVjdD0iQHNob3dUcmVlQnJvd3NlciIvPgotCi0JCTxodG1sPgkKLQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9ImxhbmciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbGFuZyIvPjwveHNsOmF0dHJpYnV0ZT4KLQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9InhtbDpsYW5nIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGxhbmciLz48L3hzbDphdHRyaWJ1dGU+Ci0JCQk8aGVhZD4KLQkJCQk8dGl0bGU+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50VHlwZU5hbWUiLz46IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudFByZXNlbnRhdGlvbk5hbWUiLz48L3RpdGxlPgotCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJ1bWFNZXRhVGFncyI+Ci0JCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50VHlwZSIgc2VsZWN0PSIkZWxlbWVudFR5cGUiLz4KLQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnROYW1lIiBzZWxlY3Q9IiRlbGVtZW50TmFtZSIvPgotCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudFByZXNlbnRhdGlvbk5hbWUiIHNlbGVjdD0iJGVsZW1lbnRQcmVzZW50YXRpb25OYW1lIi8+Ci0JCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQk8bWV0YSBuYW1lPSJlbGVtZW50X3R5cGUiIGNvbnRlbnQ9InskZWxlbWVudFR5cGV9Ii8+Ci0JCQkJPG1ldGEgbmFtZT0iZmlsZXR5cGUiIGNvbnRlbnQ9ImRlc2NyaXB0aW9uIi8+Ci0JCQkJPG1ldGEgbmFtZT0icm9sZSIgY29udGVudD0ieyRlbGVtZW50UHJlc2VudGF0aW9uTmFtZX0iLz4KLQkJCQk8bGluayByZWw9IlN0eWxlU2hlZXQiIGhyZWY9InskYmFja1BhdGh9Y3NzL2RlZmF1bHQuY3NzIiB0eXBlPSJ0ZXh0L2NzcyIvPgotCQkJCTxzY3JpcHQgc3JjPSJ7JGJhY2tQYXRofXNjcmlwdHMvQ29udGVudFBhZ2VSZXNvdXJjZS5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PC9zY3JpcHQ+Ci0JCQkJPHNjcmlwdCBzcmM9InskYmFja1BhdGh9c2NyaXB0cy9Db250ZW50UGFnZVNlY3Rpb24uanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPjwvc2NyaXB0PgotCQkJCTxzY3JpcHQgc3JjPSJ7JGJhY2tQYXRofXNjcmlwdHMvQ29udGVudFBhZ2VTdWJTZWN0aW9uLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij48L3NjcmlwdD4KLQkJCQk8c2NyaXB0IHNyYz0ieyRiYWNrUGF0aH1zY3JpcHRzL0NvbnRlbnRQYWdlVG9vbGJhci5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PC9zY3JpcHQ+Ci0JCQkJPHNjcmlwdCBzcmM9InskYmFja1BhdGh9c2NyaXB0cy9jb250ZW50UGFnZS5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PC9zY3JpcHQ+Ci0JCQkJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij4KLQkJCQkJdmFyIGJhY2tQYXRoID0gJzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkYmFja1BhdGgiLz4nOwotCQkJCQl2YXIgaW1nUGF0aCA9ICc8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGltYWdlUGF0aCIvPic7Ci0JCQkJCXZhciBub2RlSW5mbz1udWxsOwotCQkJCQljb250ZW50UGFnZS5wcmVsb2FkKGltZ1BhdGgsIGJhY2tQYXRoLCBub2RlSW5mbywgICcnLCBmYWxzZSwgZmFsc2UsIGZhbHNlKTsKLQkJCQk8L3NjcmlwdD4KLQkJCTwvaGVhZD4KLQkJCTxib2R5PgotCQkJPGRpdiBpZD0iYnJlYWRjcnVtYnMiPjwvZGl2PgotCQkJCTx0YWJsZSBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgd2lkdGg9IjEwMCUiPgotCQkJCQk8dHI+Ci0JCQkJCQk8dGQgdmFsaWduPSJ0b3AiPgkKLQkJCQkJCQk8YSBuYW1lPSJUb3AiLz4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0ib3ZlcnZpZXciPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudFR5cGUiIHNlbGVjdD0iJGVsZW1lbnRUeXBlIi8+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50VHlwZU5hbWUiIHNlbGVjdD0iJGVsZW1lbnRUeXBlTmFtZSIvPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudFByZXNlbnRhdGlvbk5hbWUiIHNlbGVjdD0iJGVsZW1lbnRQcmVzZW50YXRpb25OYW1lIi8+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50SWNvbiIgc2VsZWN0PSIkc2hhcGVJbWFnZSIvPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iYmFja1BhdGgiIHNlbGVjdD0iJGJhY2tQYXRoIi8+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJzaG93VHJlZUJyb3dzZXIiIHNlbGVjdD0iJHNob3dUcmVlQnJvd3NlciIvPgotCQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InJlbGF0aW9uc2hpcHNTZWN0aW9uIi8+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9Im1haW5EZXNjcmlwdGlvblNlY3Rpb24iPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZGVzY3JpcHRpb24iIHNlbGVjdD0iJHJvbGVEZXNjcmlwdGlvbiIvPgotCQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImlsbHVzdHJhdGlvbnNTZWN0aW9uIi8+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InN0YWZmaW5nU2VjdGlvbiIvPgotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJrZXlDb25zaWRlcmF0aW9uc1NlY3Rpb24iPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZGVzY3JpcHRpb24iIHNlbGVjdD0iJHJvbGVEZXNjcmlwdGlvbiIvPgotCQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9Im1vcmVJbmZvU2VjdGlvbiIvPgotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJjb3B5cmlnaHQiPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iY29weXJpZ2h0IiBzZWxlY3Q9IiRjb3B5cmlnaHQiLz4KLQkJCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQkJPC90ZD4JCQkJCQkKLQkJCQkJPC90cj4KLQkJCQk8L3RhYmxlPgotCQkJPC9ib2R5PgotCQkJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij4KLQkJCQljb250ZW50UGFnZS5vbmxvYWQoKTsKLQkJCTwvc2NyaXB0PgotCQk8L2h0bWw+Ci0JPC94c2w6dGVtcGxhdGU+Ci0KLQk8eHNsOnRlbXBsYXRlIG5hbWU9InJlbGF0aW9uc2hpcHNTZWN0aW9uIj4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJhZGRpdGlvbmFsbHlQZXJmb3JtcyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0W0BuYW1lPSdhZGRpdGlvbmFsbHlQZXJmb3JtcyddL0VsZW1lbnQiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJ3b3JrUHJvZHVjdE1vZGlmaWVzIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3RbQG5hbWU9J21vZGlmaWVzJ10vRWxlbWVudFtAVHlwZSE9J1dvcmtQcm9kdWN0U2xvdCddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0id29ya1Byb2R1Y3RTbG90TW9kaWZpZXMiIHNlbGVjdD0icmVmZXJlbmNlTGlzdFtAbmFtZT0nbW9kaWZpZXMnXS9FbGVtZW50W0BUeXBlPSdXb3JrUHJvZHVjdFNsb3QnXSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImNhdGVnb3JpZXMiIHNlbGVjdD0icmVmZXJlbmNlTGlzdFtAbmFtZT0nQ29udGVudEVsZW1lbnRfQ3VzdG9tQ2F0ZWdvcmllcyddL0VsZW1lbnQiLz4KLQkJPGRpdiBjbGFzcz0ic2VjdGlvbkhlYWRpbmciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcmVsYXRpb25zaGlwc1RleHQiLz48L2Rpdj4KLQkJPGRpdiBjbGFzcz0ic2VjdGlvbkNvbnRlbnQiPgotCQkJPHRhYmxlIGNsYXNzPSJzZWN0aW9uVGFibGUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4KLQkJCQk8dHI+Ci0JCQkJCTx0ZCBjbGFzcz0ic2VjdGlvblRhYmxlU2luZ2xlQ2VsbCIgY29sc3Bhbj0iMiIgYWxpZ249ImNlbnRlciI+CQotCQkJCQkJPHhzbDp2YWx1ZS1vZiBkaXNhYmxlLW91dHB1dC1lc2NhcGluZz0ieWVzIiBzZWxlY3Q9ImRpYWdyYW0iLz4KLQkJCQkJPC90ZD4KLQkJCQk8L3RyPgotCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhZGRSZWZlcmVuY2VzIj4KLQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9InJlZk5hbWUiIHNlbGVjdD0iJGNhdGVnb3JpZXNUZXh0Ii8+Ci0JCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJyZWZFbGVtZW50IiBzZWxlY3Q9IiRjYXRlZ29yaWVzIi8+Ci0JCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWRkUmVmZXJlbmNlcyI+Ci0JCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJyZWZOYW1lIiBzZWxlY3Q9IiRhZGRpdGlvbmFsbHlQZXJmb3Jtc1RleHQiLz4KLQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9InJlZkVsZW1lbnQiIHNlbGVjdD0iJGFkZGl0aW9uYWxseVBlcmZvcm1zIi8+Ci0JCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQk8eHNsOmlmIHRlc3Q9ImNvdW50KCR3b3JrUHJvZHVjdE1vZGlmaWVzKSArIGNvdW50KCR3b3JrUHJvZHVjdFNsb3RNb2RpZmllcykgPiAwIj4KLQkJCQkJPHRyIHZhbGlnbj0idG9wIj4KLQkJCQkJCTx0aCBjbGFzcz0ic2VjdGlvblRhYmxlSGVhZGluZyIgc2NvcGU9InJvdyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRtb2RpZmllc1RleHQiLz48L3RoPgotCQkJCQkJPHRkIGNsYXNzPSJzZWN0aW9uVGFibGVDZWxsIiBjb2xzcGFuPSIyIj4KLQkJCQkJCQk8dWw+Ci0JCQkJCQkJPHhzbDpmb3ItZWFjaCBzZWxlY3Q9IiR3b3JrUHJvZHVjdE1vZGlmaWVzIj4KLQkJCQkJCQk8eHNsOnNvcnQgc2VsZWN0PSJARGlzcGxheU5hbWUiLz4KLQkJCQkJCQkJPGxpPgotCQkJCQkJCQkJPGE+Ci0JCQkJCQkJCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0iaHJlZiI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii9FbGVtZW50L0BCYWNrUGF0aCIvPgotCQkJCQkJCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQFVybCIvPjwveHNsOmF0dHJpYnV0ZT48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQERpc3BsYXlOYW1lIi8+Ci0JCQkJCQkJCQk8L2E+Ci0JCQkJCQkJCTwvbGk+Ci0JCQkJCQkJPC94c2w6Zm9yLWVhY2g+Ci0JCQkJCQkJPC91bD4KLQkJCQkJCQk8dWw+Ci0JCQkJCQkJPHhzbDpmb3ItZWFjaCBzZWxlY3Q9IiR3b3JrUHJvZHVjdFNsb3RNb2RpZmllcyI+Ci0JCQkJCQkJPHhzbDpzb3J0IHNlbGVjdD0iQERpc3BsYXlOYW1lIi8+Ci0JCQkJCQkJCTxsaT4KLQkJCQkJCQkJCTxhPgotCQkJCQkJCQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9ImhyZWYiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIvRWxlbWVudC9AQmFja1BhdGgiLz4KLQkJCQkJCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBVcmwiLz48L3hzbDphdHRyaWJ1dGU+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPgotCQkJCQkJCQkJPC9hPgotCQkJCQkJCQkJPHVsPgotCQkJCQkJCQkJPHhzbDpmb3ItZWFjaCBzZWxlY3Q9InJlZmVyZW5jZUxpc3RbQG5hbWU9J0Z1bEZpbGxzX0Z1bGxGaWxsYWJsZUVsZW1lbnRzJ10vRWxlbWVudCI+Ci0JCQkJCQkJCQk8eHNsOnNvcnQgc2VsZWN0PSJARGlzcGxheU5hbWUiLz4KLQkJCQkJCQkJCTxsaT4KLQkJCQkJCQkJCQk8YT4KLQkJCQkJCQkJCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0iaHJlZiI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii9FbGVtZW50L0BCYWNrUGF0aCIvPgotCQkJCQkJCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBVcmwiLz48L3hzbDphdHRyaWJ1dGU+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPgotCQkJCQkJCQkJCTwvYT4KLQkJCQkJCQkJCTwvbGk+Ci0JCQkJCQkJCQk8L3hzbDpmb3ItZWFjaD4KLQkJCQkJCQkJCTwvdWw+Ci0JCQkJCQkJCTwvbGk+Ci0JCQkJCQkJPC94c2w6Zm9yLWVhY2g+Ci0JCQkJCQkJPC91bD4KLQkJCQkJCTwvdGQ+Ci0JCQkJCTwvdHI+Ci0JCQkJPC94c2w6aWY+Ci0JCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFkZERlc2NyaXB0b3JzIj4KLQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImRlc2NyaXB0b3JzIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3RbQG5hbWU9J2Rlc2NyaXB0b3JzJ10vRWxlbWVudCIvPgotCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iY29sc3BhbiIgc2VsZWN0PSInMSciLz4KLQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJPC90YWJsZT4KLQkJPC9kaXY+Ci0JPC94c2w6dGVtcGxhdGU+Ci0KLQk8eHNsOnRlbXBsYXRlIG5hbWU9Im1vcmVJbmZvU2VjdGlvbiI+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iY2hlY2tsaXN0cyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0L0VsZW1lbnRbQFR5cGU9J0NoZWNrbGlzdCddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iY29uY2VwdHMiIHNlbGVjdD0icmVmZXJlbmNlTGlzdC9FbGVtZW50W0BUeXBlPSdDb25jZXB0J10iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJndWlkZWxpbmVzIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3QvRWxlbWVudFtAVHlwZT0nR3VpZGVsaW5lJ10iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJzdXBwb3J0aW5nTWF0ZXJpYWxzIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3QvRWxlbWVudFtAVHlwZT0nU3VwcG9ydGluZ01hdGVyaWFsJ10iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJ3aGl0ZVBhcGVycyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0L0VsZW1lbnRbQFR5cGU9J1doaXRlcGFwZXInXSIvPgotCQkKLQkJPHhzbDppZiB0ZXN0PSJjb3VudCgkY2hlY2tsaXN0cykgKyBjb3VudCgkY29uY2VwdHMpICsgY291bnQoJGd1aWRlbGluZXMpICsgY291bnQoJHN1cHBvcnRpbmdNYXRlcmlhbHMpICsgY291bnQoJHdoaXRlUGFwZXJzKSA+IDAiPgotCQkJPGRpdiBjbGFzcz0ic2VjdGlvbkhlYWRpbmciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbW9yZUluZm9UZXh0Ii8+PC9kaXY+Ci0JCQk8ZGl2IGNsYXNzPSJzZWN0aW9uQ29udGVudCI+Ci0JCQkJPHRhYmxlIGNsYXNzPSJzZWN0aW9uVGFibGUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4KLQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFkZENoZWNrbGlzdHMiPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImNoZWNrbGlzdHMiIHNlbGVjdD0iJGNoZWNrbGlzdHMiLz4KLQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFkZENvbmNlcHRzIj4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJjb25jZXB0cyIgc2VsZWN0PSIkY29uY2VwdHMiLz4KLQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFkZEd1aWRlbGluZXMiPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9Imd1aWRlbGluZXMiIHNlbGVjdD0iJGd1aWRlbGluZXMiLz4KLQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFkZFN1cHBvcnRpbmdNYXRlcmlhbHMiPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9InN1cHBvcnRpbmdNYXRlcmlhbHMiIHNlbGVjdD0iJHN1cHBvcnRpbmdNYXRlcmlhbHMiLz4KLQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFkZFdoaXRlUGFwZXJzIj4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJ3aGl0ZVBhcGVycyIgc2VsZWN0PSIkd2hpdGVQYXBlcnMiLz4KLQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQk8L3RhYmxlPgotCQkJPC9kaXY+Ci0JCTwveHNsOmlmPgotCTwveHNsOnRlbXBsYXRlPgotCi0JPHhzbDp0ZW1wbGF0ZSBuYW1lPSJzdGFmZmluZ1NlY3Rpb24iPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InNraWxscyIgc2VsZWN0PSJyZWZlcmVuY2UvRWxlbWVudC9hdHRyaWJ1dGVbQG5hbWU9J3NraWxscyddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iYXNzaWdubWVudEFwcHJvYWNoZXMiIHNlbGVjdD0icmVmZXJlbmNlL0VsZW1lbnQvYXR0cmlidXRlW0BuYW1lPSdhc3NpZ25tZW50QXBwcm9hY2hlcyddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0ic3lub255bXMiIHNlbGVjdD0icmVmZXJlbmNlL0VsZW1lbnQvYXR0cmlidXRlW0BuYW1lPSdzeW5vbnltcyddIi8+Ci0JCQotCQk8eHNsOmlmIHRlc3Q9IiRza2lsbHMgIT0gJycgb3IgJGFzc2lnbm1lbnRBcHByb2FjaGVzICE9ICcnIG9yICRzeW5vbnltcyAhPSAnJyAiID4KLQkJCTxkaXYgY2xhc3M9InNlY3Rpb25IZWFkaW5nIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHN0YWZmaW5nVGV4dCIvPjwvZGl2PgotCQkJPGRpdiBjbGFzcz0ic2VjdGlvbkNvbnRlbnQiPgotCQkJCTx0YWJsZSBjbGFzcz0ic2VjdGlvblRhYmxlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+Ci0JCQkJCTx4c2w6aWYgdGVzdD0iJHNraWxscyAhPSAnJyI+Ci0JCQkJCQk8dHIgdmFsaWduPSJ0b3AiPgotCQkJCQkJCTx0aCBjbGFzcz0ic2VjdGlvblRhYmxlSGVhZGluZyIgc2NvcGU9InJvdyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRza2lsbHNUZXh0Ii8+PC90aD4KLQkJCQkJCQk8dGQgY2xhc3M9InNlY3Rpb25UYWJsZUNlbGwiPgotCQkJCQkJCQk8eHNsOnZhbHVlLW9mIGRpc2FibGUtb3V0cHV0LWVzY2FwaW5nPSJ5ZXMiIHNlbGVjdD0iJHNraWxscyIvPgotCQkJCQkJCTwvdGQ+Ci0JCQkJCQk8L3RyPgotCQkJCQk8L3hzbDppZj4KLQkJCQkJPHhzbDppZiB0ZXN0PSIkYXNzaWdubWVudEFwcHJvYWNoZXMgIT0gJyciPgotCQkJCQkJPHRyIHZhbGlnbj0idG9wIj4KLQkJCQkJCQk8dGggY2xhc3M9InNlY3Rpb25UYWJsZUhlYWRpbmciIHNjb3BlPSJyb3ciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkYXNzaWdubWVudEFwcHJvYWNoZXNUZXh0Ii8+PC90aD4KLQkJCQkJCQk8dGQgY2xhc3M9InNlY3Rpb25UYWJsZUNlbGwiPgotCQkJCQkJCQk8eHNsOnZhbHVlLW9mIGRpc2FibGUtb3V0cHV0LWVzY2FwaW5nPSJ5ZXMiIHNlbGVjdD0iJGFzc2lnbm1lbnRBcHByb2FjaGVzIi8+Ci0JCQkJCQkJPC90ZD4KLQkJCQkJCTwvdHI+Ci0JCQkJCTwveHNsOmlmPgkJCQotCQkJCQk8eHNsOmlmIHRlc3Q9IiRzeW5vbnltcyAhPSAnJyI+Ci0JCQkJCQk8dHIgdmFsaWduPSJ0b3AiPgotCQkJCQkJCTx0aCBjbGFzcz0ic2VjdGlvblRhYmxlSGVhZGluZyIgc2NvcGU9InJvdyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRzeW5vbnltc1RleHQiLz48L3RoPgotCQkJCQkJCTx0ZCBjbGFzcz0ic2VjdGlvblRhYmxlQ2VsbCI+Ci0JCQkJCQkJCTx4c2w6dmFsdWUtb2YgZGlzYWJsZS1vdXRwdXQtZXNjYXBpbmc9InllcyIgc2VsZWN0PSIkc3lub255bXMiLz4KLQkJCQkJCQk8L3RkPgotCQkJCQkJPC90cj4KLQkJCQkJPC94c2w6aWY+CQkKLQkJCQk8L3RhYmxlPgotCQkJPC9kaXY+Ci0JCTwveHNsOmlmPgotCTwveHNsOnRlbXBsYXRlPgotCi08L3hzbDpzdHlsZXNoZWV0PgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L3hzbC9yb2xlX2Rlc2NyaXB0b3IueHNsIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L3hzbC9yb2xlX2Rlc2NyaXB0b3IueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZWY4OGIyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC94c2wvcm9sZV9kZXNjcmlwdG9yLnhzbAorKysgL2Rldi9udWxsCkBAIC0xLDMzNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci0KLTx4c2w6c3R5bGVzaGVldCB2ZXJzaW9uPSIxLjAiCi0JeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iCi0JeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSI+Ci0KLTx4c2w6b3V0cHV0IG1ldGhvZD0iaHRtbCIgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIAotCWRvY3R5cGUtcHVibGljPSItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgCi0JZG9jdHlwZS1zeXN0ZW09Imh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiIAotCWluZGVudD0ieWVzIi8+Ci0JCi0JPHhzbDppbmNsdWRlIGhyZWY9ImRlc2NyaXB0b3IueHNsIi8+Ci0JPHhzbDppbmNsdWRlIGhyZWY9Imd1aWRhbmNlX2hlbHBlci54c2wiLz4KLQotCTx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii9FbGVtZW50Ij4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJlbGVtZW50VHlwZSIgc2VsZWN0PSJAVHlwZSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImVsZW1lbnRUeXBlTmFtZSIgc2VsZWN0PSJAVHlwZU5hbWUiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJlbGVtZW50TmFtZSIgc2VsZWN0PSJATmFtZSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImVsZW1lbnRQcmVzZW50YXRpb25OYW1lIiBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImJhY2tQYXRoIiBzZWxlY3Q9IkBCYWNrUGF0aCIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImltYWdlUGF0aCIgc2VsZWN0PSJjb25jYXQoJGJhY2tQYXRoLCAnaW1hZ2VzLycpIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0ic2hhcGVJbWFnZSIgc2VsZWN0PSJjb25jYXQoJGJhY2tQYXRoLEBTaGFwZWljb25VcmwpIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0icHJlc2VudGF0aW9uIiBzZWxlY3Q9InJlZmVyZW5jZVtAbmFtZT0ncHJlc2VudGF0aW9uJ10iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJjb250ZW50RGVzY3JpcHRpb24iIHNlbGVjdD0iJHByZXNlbnRhdGlvbi9FbGVtZW50W0BUeXBlPSdSb2xlRGVzY3JpcHRvciddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0icm9sZURlc2NyaXB0aW9uIiBzZWxlY3Q9IiRwcmVzZW50YXRpb24vRWxlbWVudFtAVHlwZT0nUm9sZURlc2NyaXB0aW9uJ10iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJkZXNjcmlwdG9yRGVzY3JpcHRpb24iIHNlbGVjdD0iJHByZXNlbnRhdGlvbi9FbGVtZW50W0BUeXBlPSdEZXNjcmlwdG9yRGVzY3JpcHRpb24nXSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImNvcHlyaWdodCIgc2VsZWN0PSJjb3B5cmlnaHQiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJzaG93VHJlZUJyb3dzZXIiIHNlbGVjdD0iQHNob3dUcmVlQnJvd3NlciIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InF1ZXJ5U3RyaW5nIiBzZWxlY3Q9IkBxdWVyeVN0cmluZyIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InJlbFByb2Nlc3NQYXRoIiBzZWxlY3Q9IkByZWxQcm9jZXNzUGF0aCIvPgotCQk8aHRtbD4KLQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9ImxhbmciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbGFuZyIvPjwveHNsOmF0dHJpYnV0ZT4KLQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9InhtbDpsYW5nIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGxhbmciLz48L3hzbDphdHRyaWJ1dGU+Ci0JCQk8aGVhZD4KLQkJCQk8dGl0bGU+Ci0JCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudFR5cGVOYW1lIi8+OiA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVsZW1lbnRQcmVzZW50YXRpb25OYW1lIi8+Ci0JCQkJPC90aXRsZT4KLQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0idW1hTWV0YVRhZ3MiPgotCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudFR5cGUiIHNlbGVjdD0iJGVsZW1lbnRUeXBlIi8+Ci0JCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50TmFtZSIgc2VsZWN0PSIkZWxlbWVudE5hbWUiLz4KLQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnRQcmVzZW50YXRpb25OYW1lIiBzZWxlY3Q9IiRlbGVtZW50UHJlc2VudGF0aW9uTmFtZSIvPgotCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJPG1ldGEgbmFtZT0iZWxlbWVudF90eXBlIiBjb250ZW50PSJ7JGVsZW1lbnRUeXBlfSIvPgotCQkJCTxtZXRhIG5hbWU9ImZpbGV0eXBlIiBjb250ZW50PSJkZXNjcmlwdGlvbiIvPgotCQkJCTxsaW5rIHJlbD0iU3R5bGVTaGVldCIgaHJlZj0ieyRiYWNrUGF0aH1jc3MvZGVmYXVsdC5jc3MiIHR5cGU9InRleHQvY3NzIi8+Ci0JCQkJPHNjcmlwdCBzcmM9InskYmFja1BhdGh9c2NyaXB0cy9Db250ZW50UGFnZVJlc291cmNlLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij48L3NjcmlwdD4KLQkJCQk8c2NyaXB0IHNyYz0ieyRiYWNrUGF0aH1zY3JpcHRzL0NvbnRlbnRQYWdlU2VjdGlvbi5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PC9zY3JpcHQ+Ci0JCQkJPHNjcmlwdCBzcmM9InskYmFja1BhdGh9c2NyaXB0cy9Db250ZW50UGFnZVN1YlNlY3Rpb24uanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPjwvc2NyaXB0PgotCQkJCTxzY3JpcHQgc3JjPSJ7JGJhY2tQYXRofXNjcmlwdHMvQWN0aXZpdHlUcmVlVGFibGUuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPjwvc2NyaXB0PgotCQkJCTxzY3JpcHQgc3JjPSJ7JGJhY2tQYXRofXNjcmlwdHMvUHJvY2Vzc0VsZW1lbnRQYWdlLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij48L3NjcmlwdD4KLQkJCQk8c2NyaXB0IHNyYz0ieyRiYWNrUGF0aH1zY3JpcHRzL0NvbnRlbnRQYWdlVG9vbGJhci5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PC9zY3JpcHQ+Ci0JCQkJPHNjcmlwdCBzcmM9InskYmFja1BhdGh9c2NyaXB0cy9jb250ZW50UGFnZS5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PC9zY3JpcHQ+Ci0JCQkJPHNjcmlwdCBzcmM9InskYmFja1BhdGh9c2NyaXB0cy9wcm9jZXNzRWxlbWVudERhdGEuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPjwvc2NyaXB0PgotCQkJCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+Ci0JCQkJCXZhciBkZWZhdWx0UXVlcnlTdHIgPSAnPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRxdWVyeVN0cmluZyIvPic7Ci0JCQkJCXZhciBiYWNrUGF0aCA9ICc8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGJhY2tQYXRoIi8+JzsKLQkJCQkJdmFyIGltZ1BhdGggPSAnPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRpbWFnZVBhdGgiLz4nOwotCQkJCQl2YXIgbm9kZUluZm89bnVsbDsKLQkJCQkJY29udGVudFBhZ2UucHJlbG9hZChpbWdQYXRoLCBiYWNrUGF0aCwgbm9kZUluZm8sIGRlZmF1bHRRdWVyeVN0ciwgZmFsc2UsIHRydWUsIGZhbHNlKTsKLQkJCQk8L3NjcmlwdD4KLQkJCTwvaGVhZD4KLQkJCTxib2R5PgotCQkJPGRpdiBpZD0iYnJlYWRjcnVtYnMiPjwvZGl2PgotCQkJCTx0YWJsZSBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgd2lkdGg9IjEwMCUiPgotCQkJCQk8dHI+Ci0JCQkJCQk8dGQgdmFsaWduPSJ0b3AiPgotCQkJCQkJCTxhIG5hbWU9IlRvcCIvPgotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJvdmVydmlldyI+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50VHlwZSIgc2VsZWN0PSIkZWxlbWVudFR5cGUiLz4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnRUeXBlTmFtZSIgc2VsZWN0PSIkZWxlbWVudFR5cGVOYW1lIi8+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50UHJlc2VudGF0aW9uTmFtZSIgc2VsZWN0PSIkZWxlbWVudFByZXNlbnRhdGlvbk5hbWUiLz4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnRJY29uIiBzZWxlY3Q9IiRzaGFwZUltYWdlIi8+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJiYWNrUGF0aCIgc2VsZWN0PSIkYmFja1BhdGgiLz4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9InNob3dUcmVlQnJvd3NlciIgc2VsZWN0PSIkc2hvd1RyZWVCcm93c2VyIi8+Ci0JCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icmVsYXRpb25zaGlwc1NlY3Rpb24iLz4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icmVmaW5lZERlc2NyaXB0aW9uU2VjdGlvbiI+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJkZXNjcmlwdGlvbiIgc2VsZWN0PSIkZGVzY3JpcHRvckRlc2NyaXB0aW9uIi8+Ci0JCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icHJvcGVydGllc1NlY3Rpb24iPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iY29udGVudERlc2NyaXB0aW9uIiBzZWxlY3Q9IiRjb250ZW50RGVzY3JpcHRpb24iLz4KLQkJCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJ1c2FnZVNlY3Rpb24iPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iY29udGVudERlc2NyaXB0aW9uIiBzZWxlY3Q9IiRkZXNjcmlwdG9yRGVzY3JpcHRpb24iLz4KLQkJCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJpbGx1c3RyYXRpb25zU2VjdGlvbiIvPgotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJzdGFmZmluZ1NlY3Rpb24iLz4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0ia2V5Q29uc2lkZXJhdGlvbnNTZWN0aW9uIj4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImRlc2NyaXB0aW9uIiBzZWxlY3Q9IiRkZXNjcmlwdG9yRGVzY3JpcHRpb24iLz4KLQkJCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJtb3JlSW5mb1NlY3Rpb24iLz4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iY29weXJpZ2h0Ij4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImNvcHlyaWdodCIgc2VsZWN0PSIkY29weXJpZ2h0Ii8+Ci0JCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCTwvdGQ+Ci0JCQkJCTwvdHI+Ci0JCQkJPC90YWJsZT4KLQkJCTwvYm9keT4KLQkJCTxzY3JpcHQgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0JCQkJY29udGVudFBhZ2Uub25sb2FkKCk7Ci0JCQkJY29udGVudFBhZ2UucHJvY2Vzc1BhZ2UuZml4RGVzY3JpcHRvckxpbmtzKCk7Ci0JCQk8L3NjcmlwdD4KLQkJPC9odG1sPgotCTwveHNsOnRlbXBsYXRlPgotCi0JPHhzbDp0ZW1wbGF0ZSBuYW1lPSJwcm9wZXJ0aWVzU2VjdGlvbiI+Ci0JCTx4c2w6cGFyYW0gbmFtZT0iY29udGVudERlc2NyaXB0aW9uIi8+Ci0JCTxkaXYgY2xhc3M9InNlY3Rpb25IZWFkaW5nIj4KLQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydGllc1RleHQiLz4KLQkJPC9kaXY+Ci0JCTxkaXYgY2xhc3M9InNlY3Rpb25Db250ZW50Ij4KLQkJCTx0YWJsZSBjbGFzcz0ic2VjdGlvblRhYmxlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+Ci0JCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InByb3BlcnR5Ij4KLQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImZpZWxkTGFiZWwiIHNlbGVjdD0iJG11bHRpcGxlT2NjdXJyZW5jZXNUZXh0Ii8+Ci0JCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJmaWVsZFRleHQiIHNlbGVjdD0iYXR0cmlidXRlW0BuYW1lPSdoYXNNdWx0aXBsZU9jY3VycmVuY2VzJ10iLz4KLQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCTx4c2w6aWYgdGVzdD0iYXR0cmlidXRlW0BuYW1lPSdpc09wdGlvbmFsJ10iPgotCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icHJvcGVydHkiPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImZpZWxkTGFiZWwiIHNlbGVjdD0iJG9wdGlvbmFsVGV4dCIvPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImZpZWxkVGV4dCIgc2VsZWN0PSJhdHRyaWJ1dGVbQG5hbWU9J2lzT3B0aW9uYWwnXSIvPgotCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCTwveHNsOmlmPgotCQkJCTx4c2w6aWYgdGVzdD0iYXR0cmlidXRlW0BuYW1lPSdpc1BsYW5uZWQnXSI+Ci0JCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJwcm9wZXJ0eSI+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZmllbGRMYWJlbCIgc2VsZWN0PSIkcGxhbm5lZFRleHQiLz4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJmaWVsZFRleHQiIHNlbGVjdD0iYXR0cmlidXRlW0BuYW1lPSdpc1BsYW5uZWQnXSIvPgotCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCTwveHNsOmlmPgotCQkJCTx4c2w6aWYgdGVzdD0iYXR0cmlidXRlW0BuYW1lPSdQbGFubmluZ0RhdGEnXSI+Ci0JCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJwcm9wZXJ0eSI+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZmllbGRMYWJlbCIgc2VsZWN0PSIkcGxhbm5pbmdEYXRhVGV4dCIvPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImZpZWxkVGV4dCIgc2VsZWN0PSJhdHRyaWJ1dGVbQG5hbWU9J1BsYW5uaW5nRGF0YSddIi8+Ci0JCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJPC94c2w6aWY+Ci0JCQkJPHhzbDppZiB0ZXN0PSJyZWZlcmVuY2VMaXN0W0BuYW1lPSdsaW5rVG9QcmVkZWNlc3NvciddL0VsZW1lbnQiPgotCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWRkUmVmZXJlbmNlcyI+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0icmVmTmFtZSIgc2VsZWN0PSIkcHJlZGVjZXNzb3JUZXh0Ii8+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0icmVmRWxlbWVudCIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0W0BuYW1lPSdsaW5rVG9QcmVkZWNlc3NvciddL0VsZW1lbnQiLz4KLQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQk8L3hzbDppZj4KLQkJCTwvdGFibGU+Ci0JCTwvZGl2PgotCTwveHNsOnRlbXBsYXRlPgotCi0JPHhzbDp0ZW1wbGF0ZSBuYW1lPSJ1c2FnZVNlY3Rpb24iPgotCQk8eHNsOnBhcmFtIG5hbWU9ImNvbnRlbnREZXNjcmlwdGlvbiIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InVzYWdlR3VpZGFuY2UiIHNlbGVjdD0iJGNvbnRlbnREZXNjcmlwdGlvbi9hdHRyaWJ1dGVbQG5hbWU9J3VzYWdlR3VpZGFuY2UnXSIvPgotCQk8eHNsOmlmIHRlc3Q9IiR1c2FnZUd1aWRhbmNlICE9ICcnIj4KLQkJCTxkaXYgY2xhc3M9InNlY3Rpb25IZWFkaW5nIj4KLQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHVzYWdlR3VpZGFuY2VUZXh0Ii8+Ci0JCQk8L2Rpdj4KLQkJCTxkaXYgY2xhc3M9InNlY3Rpb25Db250ZW50Ij4KLQkJCQk8dGFibGUgY2xhc3M9InNlY3Rpb25UYWJsZSIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiPgotCQkJCQk8dHIgdmFsaWduPSJ0b3AiPgotCQkJCQkJPHRkIGNsYXNzPSJzZWN0aW9uVGFibGVDZWxsIj4KLQkJCQkJCQk8eHNsOnZhbHVlLW9mIGRpc2FibGUtb3V0cHV0LWVzY2FwaW5nPSJ5ZXMiIHNlbGVjdD0iJHVzYWdlR3VpZGFuY2UiLz4KLQkJCQkJCTwvdGQ+Ci0JCQkJCTwvdHI+Ci0JCQkJPC90YWJsZT4KLQkJCTwvZGl2PgotCQk8L3hzbDppZj4KLQk8L3hzbDp0ZW1wbGF0ZT4KLQotCTx4c2w6dGVtcGxhdGUgbmFtZT0icmVsYXRpb25zaGlwc1NlY3Rpb24iPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InBlcmZvcm1zIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3RbQG5hbWU9J1JvbGVEZXNjcmlwdG9yX1ByaW1hcnlUYXNrRGVzY3JpcHRvcnMnXS9FbGVtZW50Ii8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0icmVzcG9uc2libGVGb3IiIHNlbGVjdD0icmVmZXJlbmNlTGlzdFtAbmFtZT0ncmVzcG9uc2libGVGb3InXS9FbGVtZW50Ii8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iYWRkaXRpb25hbGx5UGVyZm9ybXMiIHNlbGVjdD0icmVmZXJlbmNlTGlzdFtAbmFtZT0nUm9sZURlc2NyaXB0b3JfQWRkaXRpb25hbFRhc2tEZXNjcmlwdG9ycyddL0VsZW1lbnQiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJtb2RpZmllcyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0W0BuYW1lPSdtb2RpZmllcyddL0VsZW1lbnQiLz4KLQkJPGRpdiBjbGFzcz0ic2VjdGlvbkhlYWRpbmciPgotCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRyZWxhdGlvbnNoaXBzVGV4dCIvPgotCQk8L2Rpdj4KLQkJPGRpdiBjbGFzcz0ic2VjdGlvbkNvbnRlbnQiPgotCQkJPHRhYmxlIGNsYXNzPSJzZWN0aW9uVGFibGUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4KLQkJCQk8dHI+Ci0JCQkJCTx0ZCBjbGFzcz0ic2VjdGlvblRhYmxlQ2VsbCIgdmFsaWduPSJ0b3AiPgotCQkJCQkJPGI+PHNwYW4gY2xhc3M9InNlY3Rpb25UYWJsZUNlbGxIZWFkaW5nIj4KLQkJCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHBlcmZvcm1zVGV4dCIvPjo8L3NwYW4+PC9iPgotCQkJCQkJPHhzbDppZiB0ZXN0PSJjb3VudCgkcGVyZm9ybXMpID4gMCI+Ci0JCQkJCQkJPHVsPgotCQkJCQkJCQk8eHNsOmZvci1lYWNoIHNlbGVjdD0iJHBlcmZvcm1zIj4KLQkJCQkJCQkJPHhzbDpzb3J0IHNlbGVjdD0iQERpc3BsYXlOYW1lIi8+Ci0JCQkJCQkJCQk8bGk+Ci0JCQkJCQkJCQkJPGE+Ci0JCQkJCQkJCQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9ImhyZWYiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIvRWxlbWVudC9AQmFja1BhdGgiLz48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQFVybCIvPjwveHNsOmF0dHJpYnV0ZT4KLQkJCQkJCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPgotCQkJCQkJCQkJCTwvYT4KLQkJCQkJCQkJCTwvbGk+Ci0JCQkJCQkJCTwveHNsOmZvci1lYWNoPgotCQkJCQkJCTwvdWw+Ci0JCQkJCQk8L3hzbDppZj4KLQkJCQkJPC90ZD4KLQkJCQkJPHRkIGNsYXNzPSJzZWN0aW9uVGFibGVDZWxsIiB2YWxpZ249InRvcCI+Ci0JCQkJCQk8Yj48c3BhbiBjbGFzcz0ic2VjdGlvblRhYmxlQ2VsbEhlYWRpbmciPgotCQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcmVzcG9uc2libGVGb3JUZXh0Ii8+Ojwvc3Bhbj48L2I+Ci0JCQkJCQk8eHNsOmlmIHRlc3Q9ImNvdW50KCRyZXNwb25zaWJsZUZvcikgPiAwIj4KLQkJCQkJCQk8dWw+Ci0JCQkJCQkJCTx4c2w6Zm9yLWVhY2ggc2VsZWN0PSIkcmVzcG9uc2libGVGb3IiPgotCQkJCQkJCQk8eHNsOnNvcnQgc2VsZWN0PSJARGlzcGxheU5hbWUiLz4KLQkJCQkJCQkJCTxsaT4KLQkJCQkJCQkJCQk8YT4KLQkJCQkJCQkJCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0iaHJlZiI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii9FbGVtZW50L0BCYWNrUGF0aCIvPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAVXJsIi8+PC94c2w6YXR0cmlidXRlPgotCQkJCQkJCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQERpc3BsYXlOYW1lIi8+Ci0JCQkJCQkJCQkJPC9hPgotCQkJCQkJCQkJPC9saT4KLQkJCQkJCQkJPC94c2w6Zm9yLWVhY2g+Ci0JCQkJCQkJPC91bD4KLQkJCQkJCTwveHNsOmlmPgotCQkJCQk8L3RkPgotCQkJCTwvdHI+Ci0JCQkJPHRyPgotCQkJCQk8dGQgY2xhc3M9InNlY3Rpb25UYWJsZUNlbGwiIHZhbGlnbj0idG9wIj4KLQkJCQkJCTxiPjxzcGFuIGNsYXNzPSJzZWN0aW9uVGFibGVDZWxsSGVhZGluZyI+Ci0JCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRhZGRpdGlvbmFsbHlQZXJmb3Jtc1RleHQiLz46PC9zcGFuPjwvYj4KLQkJCQkJCTx4c2w6aWYgdGVzdD0iY291bnQoJGFkZGl0aW9uYWxseVBlcmZvcm1zKSA+IDAiPgotCQkJCQkJCTx1bD4KLQkJCQkJCQkJPHhzbDpmb3ItZWFjaCBzZWxlY3Q9IiRhZGRpdGlvbmFsbHlQZXJmb3JtcyI+Ci0JCQkJCQkJCTx4c2w6c29ydCBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPgotCQkJCQkJCQkJPGxpPgotCQkJCQkJCQkJCTxhPgotCQkJCQkJCQkJCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJocmVmIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iL0VsZW1lbnQvQEJhY2tQYXRoIi8+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBVcmwiLz48L3hzbDphdHRyaWJ1dGU+Ci0JCQkJCQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJARGlzcGxheU5hbWUiLz4KLQkJCQkJCQkJCQk8L2E+Ci0JCQkJCQkJCQk8L2xpPgotCQkJCQkJCQk8L3hzbDpmb3ItZWFjaD4KLQkJCQkJCQk8L3VsPgotCQkJCQkJPC94c2w6aWY+Ci0JCQkJCTwvdGQ+Ci0JCQkJCTx0ZCBjbGFzcz0ic2VjdGlvblRhYmxlQ2VsbCIgdmFsaWduPSJ0b3AiPgotCQkJCQkJPGI+PHNwYW4gY2xhc3M9InNlY3Rpb25UYWJsZUNlbGxIZWFkaW5nIj4KLQkJCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG1vZGlmaWVzVGV4dCIvPjo8L3NwYW4+PC9iPgotCQkJCQkJPHhzbDppZiB0ZXN0PSJjb3VudCgkbW9kaWZpZXMpID4gMCI+Ci0JCQkJCQkJPHVsPgotCQkJCQkJCQk8eHNsOmZvci1lYWNoIHNlbGVjdD0iJG1vZGlmaWVzIj4KLQkJCQkJCQkJPHhzbDpzb3J0IHNlbGVjdD0iQERpc3BsYXlOYW1lIi8+Ci0JCQkJCQkJCQk8bGk+Ci0JCQkJCQkJCQkJPGE+Ci0JCQkJCQkJCQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9ImhyZWYiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIvRWxlbWVudC9AQmFja1BhdGgiLz48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQFVybCIvPjwveHNsOmF0dHJpYnV0ZT4KLQkJCQkJCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPgotCQkJCQkJCQkJCTwvYT4KLQkJCQkJCQkJCTwvbGk+Ci0JCQkJCQkJCTwveHNsOmZvci1lYWNoPgotCQkJCQkJCTwvdWw+Ci0JCQkJCQk8L3hzbDppZj4KLQkJCQkJPC90ZD4KLQkJCQk8L3RyPgotCQkJPC90YWJsZT4KLQkJPC9kaXY+Ci0JPC94c2w6dGVtcGxhdGU+Ci0KLQk8eHNsOnRlbXBsYXRlIG5hbWU9Im1vcmVJbmZvU2VjdGlvbiI+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iY2hlY2tsaXN0cyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0L0VsZW1lbnRbQFR5cGU9J0NoZWNrbGlzdCddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iY29uY2VwdHMiIHNlbGVjdD0icmVmZXJlbmNlTGlzdC9FbGVtZW50W0BUeXBlPSdDb25jZXB0J10iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJndWlkZWxpbmVzIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3QvRWxlbWVudFtAVHlwZT0nR3VpZGVsaW5lJ10iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJzdXBwb3J0aW5nTWF0ZXJpYWxzIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3QvRWxlbWVudFtAVHlwZT0nU3VwcG9ydGluZ01hdGVyaWFsJ10iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJ3aGl0ZVBhcGVycyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0L0VsZW1lbnRbQFR5cGU9J1doaXRlcGFwZXInXSIvPgotCQk8eHNsOmlmIHRlc3Q9ImNvdW50KCRjaGVja2xpc3RzKSArIGNvdW50KCRjb25jZXB0cykgKyBjb3VudCgkZ3VpZGVsaW5lcykgKyBjb3VudCgkc3VwcG9ydGluZ01hdGVyaWFscykgKyBjb3VudCgkd2hpdGVQYXBlcnMpID4gMCI+Ci0JCQk8ZGl2IGNsYXNzPSJzZWN0aW9uSGVhZGluZyI+Ci0JCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRtb3JlSW5mb1RleHQiLz4KLQkJCTwvZGl2PgotCQkJPGRpdiBjbGFzcz0ic2VjdGlvbkNvbnRlbnQiPgotCQkJCTx0YWJsZSBjbGFzcz0ic2VjdGlvblRhYmxlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+Ci0JCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhZGRDaGVja2xpc3RzIj4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJjaGVja2xpc3RzIiBzZWxlY3Q9IiRjaGVja2xpc3RzIi8+Ci0JCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhZGRDb25jZXB0cyI+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iY29uY2VwdHMiIHNlbGVjdD0iJGNvbmNlcHRzIi8+Ci0JCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhZGRHdWlkZWxpbmVzIj4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJndWlkZWxpbmVzIiBzZWxlY3Q9IiRndWlkZWxpbmVzIi8+Ci0JCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhZGRTdXBwb3J0aW5nTWF0ZXJpYWxzIj4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJzdXBwb3J0aW5nTWF0ZXJpYWxzIiBzZWxlY3Q9IiRzdXBwb3J0aW5nTWF0ZXJpYWxzIi8+Ci0JCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhZGRXaGl0ZVBhcGVycyI+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0id2hpdGVQYXBlcnMiIHNlbGVjdD0iJHdoaXRlUGFwZXJzIi8+Ci0JCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJPC90YWJsZT4KLQkJCTwvZGl2PgotCQk8L3hzbDppZj4KLQk8L3hzbDp0ZW1wbGF0ZT4KLQotCTx4c2w6dGVtcGxhdGUgbmFtZT0ic3RhZmZpbmdTZWN0aW9uIj4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJza2lsbHMiIHNlbGVjdD0icmVmZXJlbmNlL0VsZW1lbnQvYXR0cmlidXRlW0BuYW1lPSdza2lsbHMnXSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImFzc2lnbm1lbnRBcHByb2FjaGVzIiBzZWxlY3Q9InJlZmVyZW5jZS9FbGVtZW50L2F0dHJpYnV0ZVtAbmFtZT0nYXNzaWdubWVudEFwcHJvYWNoZXMnXSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InN5bm9ueW1zIiBzZWxlY3Q9InJlZmVyZW5jZS9FbGVtZW50L2F0dHJpYnV0ZVtAbmFtZT0nc3lub255bXMnXSIvPgotCQk8eHNsOmlmIHRlc3Q9IiRza2lsbHMgIT0gJycgb3IgJGFzc2lnbm1lbnRBcHByb2FjaGVzICE9ICcnIG9yICRzeW5vbnltcyAhPSAnJyAiPgotCQkJPGRpdiBjbGFzcz0ic2VjdGlvbkhlYWRpbmciPgotCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkc3RhZmZpbmdUZXh0Ii8+Ci0JCQk8L2Rpdj4KLQkJCTxkaXYgY2xhc3M9InNlY3Rpb25Db250ZW50Ij4KLQkJCQk8dGFibGUgY2xhc3M9InNlY3Rpb25UYWJsZSIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiPgotCQkJCQk8eHNsOmlmIHRlc3Q9IiRza2lsbHMgIT0gJyciPgotCQkJCQkJPHRyIHZhbGlnbj0idG9wIj4KLQkJCQkJCQk8dGggY2xhc3M9InNlY3Rpb25UYWJsZUhlYWRpbmciIHNjb3BlPSJyb3ciPgotCQkJCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHNraWxsc1RleHQiLz4KLQkJCQkJCQk8L3RoPgotCQkJCQkJCTx0ZCBjbGFzcz0ic2VjdGlvblRhYmxlQ2VsbCI+Ci0JCQkJCQkJCTx4c2w6dmFsdWUtb2YgZGlzYWJsZS1vdXRwdXQtZXNjYXBpbmc9InllcyIgc2VsZWN0PSIkc2tpbGxzIi8+Ci0JCQkJCQkJPC90ZD4KLQkJCQkJCTwvdHI+Ci0JCQkJCTwveHNsOmlmPgotCQkJCQk8eHNsOmlmIHRlc3Q9IiRhc3NpZ25tZW50QXBwcm9hY2hlcyAhPSAnJyI+Ci0JCQkJCQk8dHIgdmFsaWduPSJ0b3AiPgotCQkJCQkJCTx0aCBjbGFzcz0ic2VjdGlvblRhYmxlSGVhZGluZyIgc2NvcGU9InJvdyI+Ci0JCQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkYXNzaWdubWVudEFwcHJvYWNoZXNUZXh0Ii8+Ci0JCQkJCQkJPC90aD4KLQkJCQkJCQk8dGQgY2xhc3M9InNlY3Rpb25UYWJsZUNlbGwiPgotCQkJCQkJCQk8eHNsOnZhbHVlLW9mIGRpc2FibGUtb3V0cHV0LWVzY2FwaW5nPSJ5ZXMiIHNlbGVjdD0iJGFzc2lnbm1lbnRBcHByb2FjaGVzIi8+Ci0JCQkJCQkJPC90ZD4KLQkJCQkJCTwvdHI+Ci0JCQkJCTwveHNsOmlmPgotCQkJCQk8eHNsOmlmIHRlc3Q9IiRzeW5vbnltcyAhPSAnJyI+Ci0JCQkJCQk8dHIgdmFsaWduPSJ0b3AiPgotCQkJCQkJCTx0aCBjbGFzcz0ic2VjdGlvblRhYmxlSGVhZGluZyIgc2NvcGU9InJvdyI+Ci0JCQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkc3lub255bXNUZXh0Ii8+Ci0JCQkJCQkJPC90aD4KLQkJCQkJCQk8dGQgY2xhc3M9InNlY3Rpb25UYWJsZUNlbGwiPgotCQkJCQkJCQk8eHNsOnZhbHVlLW9mIGRpc2FibGUtb3V0cHV0LWVzY2FwaW5nPSJ5ZXMiIHNlbGVjdD0iJHN5bm9ueW1zIi8+Ci0JCQkJCQkJPC90ZD4KLQkJCQkJCTwvdHI+Ci0JCQkJCTwveHNsOmlmPgotCQkJCTwvdGFibGU+Ci0JCQk8L2Rpdj4KLQkJPC94c2w6aWY+Ci0JPC94c2w6dGVtcGxhdGU+Ci0KLTwveHNsOnN0eWxlc2hlZXQ+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQveHNsL3N1bW1hcnkueHNsIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L3hzbC9zdW1tYXJ5LnhzbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDJiMTc1Zi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQveHNsL3N1bW1hcnkueHNsCisrKyAvZGV2L251bGwKQEAgLTEsMTMyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLQotPHhzbDpzdHlsZXNoZWV0IHZlcnNpb249IjEuMCIKLQl4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIKLQl4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIj4KLQotPHhzbDpvdXRwdXQgbWV0aG9kPSJodG1sIiB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgCi0JZG9jdHlwZS1wdWJsaWM9Ii0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAKLQlkb2N0eXBlLXN5c3RlbT0iaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCIgCi0JaW5kZW50PSJ5ZXMiLz4KLQkKLQk8eHNsOmluY2x1ZGUgaHJlZj0icmVzb3VyY2VzLnhzbCIvPgotCTx4c2w6aW5jbHVkZSBocmVmPSJjb21tb24ueHNsIi8+Ci0KLQk8eHNsOnRlbXBsYXRlIG1hdGNoPSIvRWxlbWVudCI+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iZWxlbWVudFR5cGUiIHNlbGVjdD0iQFR5cGUiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJlbGVtZW50VHlwZU5hbWUiIHNlbGVjdD0iQFR5cGVOYW1lIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iZWxlbWVudE5hbWUiIHNlbGVjdD0iQE5hbWUiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJlbGVtZW50UHJlc2VudGF0aW9uTmFtZSIgc2VsZWN0PSJARGlzcGxheU5hbWUiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJiYWNrUGF0aCIgc2VsZWN0PSJAQmFja1BhdGgiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJzaGFwZUltYWdlIiBzZWxlY3Q9ImNvbmNhdCgkYmFja1BhdGgsQFNoYXBlaWNvblVybCkiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJpbWFnZVBhdGgiIHNlbGVjdD0iY29uY2F0KCRiYWNrUGF0aCwgJ2ltYWdlcy8nKSIvPgkJCi0JCTx4c2w6dmFyaWFibGUgbmFtZT0icHJlc2VudGF0aW9uIiBzZWxlY3Q9InJlZmVyZW5jZVtAbmFtZT0ncHJlc2VudGF0aW9uJ10iLz48eHNsOnZhcmlhYmxlIG5hbWU9InByZXNlbnRhdGlvbk5hbWUiIHNlbGVjdD0iQERpc3BsYXlOYW1lIi8+CQotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImNvcHlyaWdodCIgc2VsZWN0PSJjb3B5cmlnaHQiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJzaG93VHJlZUJyb3dzZXIiIHNlbGVjdD0iQHNob3dUcmVlQnJvd3NlciIvPgotCQkKLQkJPGh0bWw+Ci0JCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJsYW5nIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGxhbmciLz48L3hzbDphdHRyaWJ1dGU+Ci0JCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJ4bWw6bGFuZyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBsYW5nIi8+PC94c2w6YXR0cmlidXRlPgotCQkJPGhlYWQ+Ci0JCQkJPHRpdGxlPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudFR5cGUiLz46IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudFByZXNlbnRhdGlvbk5hbWUiLz48L3RpdGxlPgotCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJ1bWFNZXRhVGFncyI+Ci0JCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50VHlwZSIgc2VsZWN0PSIkZWxlbWVudFR5cGUiLz4KLQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnROYW1lIiBzZWxlY3Q9IiRlbGVtZW50TmFtZSIvPgotCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudFByZXNlbnRhdGlvbk5hbWUiIHNlbGVjdD0iJGVsZW1lbnRQcmVzZW50YXRpb25OYW1lIi8+Ci0JCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQk8bWV0YSBuYW1lPSJlbGVtZW50X3R5cGUiIGNvbnRlbnQ9InskZWxlbWVudFR5cGV9Ii8+Ci0JCQkJPG1ldGEgbmFtZT0iZmlsZXR5cGUiIGNvbnRlbnQ9ImRlc2NyaXB0aW9uIi8+CQkJCQotCQkJCTxsaW5rIHJlbD0iU3R5bGVTaGVldCIgaHJlZj0ieyRiYWNrUGF0aH1jc3MvZGVmYXVsdC5jc3MiIHR5cGU9InRleHQvY3NzIi8+Ci0JCQkJPHNjcmlwdCBzcmM9InskYmFja1BhdGh9c2NyaXB0cy9Db250ZW50UGFnZVJlc291cmNlLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij48L3NjcmlwdD4KLQkJCQk8c2NyaXB0IHNyYz0ieyRiYWNrUGF0aH1zY3JpcHRzL0NvbnRlbnRQYWdlU2VjdGlvbi5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PC9zY3JpcHQ+Ci0JCQkJPHNjcmlwdCBzcmM9InskYmFja1BhdGh9c2NyaXB0cy9Db250ZW50UGFnZVN1YlNlY3Rpb24uanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPjwvc2NyaXB0PgotCQkJCTxzY3JpcHQgc3JjPSJ7JGJhY2tQYXRofXNjcmlwdHMvQ29udGVudFBhZ2VUb29sYmFyLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij48L3NjcmlwdD4KLQkJCQk8c2NyaXB0IHNyYz0ieyRiYWNrUGF0aH1zY3JpcHRzL2NvbnRlbnRQYWdlLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij48L3NjcmlwdD4KLQkJCQk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPgotCQkJCQl2YXIgYmFja1BhdGggPSAnPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRiYWNrUGF0aCIvPic7Ci0JCQkJCXZhciBpbWdQYXRoID0gJzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkaW1hZ2VQYXRoIi8+JzsKLQkJCQkJdmFyIG5vZGVJbmZvPW51bGw7Ci0JCQkJCWNvbnRlbnRQYWdlLnByZWxvYWQoaW1nUGF0aCwgYmFja1BhdGgsIG5vZGVJbmZvLCAgJycsIGZhbHNlLCBmYWxzZSwgZmFsc2UpOwotCQkJCTwvc2NyaXB0PgotCQkJPC9oZWFkPgotCQkJPGJvZHk+Ci0JCQk8ZGl2IGlkPSJicmVhZGNydW1icyI+PC9kaXY+Ci0JCQk8dGFibGUgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLQkJCQkJPHRyPgotCQkJCQkJPHRkIHZhbGlnbj0idG9wIj4KLQkJCQkJCQk8YSBuYW1lPSJUb3AiLz4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0ic3VtbWFyeU92ZXJ2aWV3Ij4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnRUeXBlIiBzZWxlY3Q9IiRlbGVtZW50VHlwZSIvPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudFR5cGVOYW1lIiBzZWxlY3Q9IiRlbGVtZW50VHlwZU5hbWUiLz4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnRQcmVzZW50YXRpb25OYW1lIiBzZWxlY3Q9IiRlbGVtZW50UHJlc2VudGF0aW9uTmFtZSIvPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudEljb24iIHNlbGVjdD0iJHNoYXBlSW1hZ2UiLz4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImJhY2tQYXRoIiBzZWxlY3Q9IiRiYWNrUGF0aCIvPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0ic2hvd1RyZWVCcm93c2VyIiBzZWxlY3Q9IiRzaG93VHJlZUJyb3dzZXIiLz4KLQkJCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgkJCQkJCQkKLQkJCQkJCQk8eHNsOmZvci1lYWNoIHNlbGVjdD0icmVmZXJlbmNlTGlzdCI+Ci0JCQkJCQkJCTx4c2w6aWYgdGVzdD0iY291bnQoRWxlbWVudCkgPiAwIj4KLQkJCQkJCQkJCTxoMiBjbGFzcz0iYmFubmVyIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz48L2gyPgotCQkJCQkJCQkJPHVsPgotCQkJCQkJCQkJCTx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJFbGVtZW50Ij4KLQkJCQkJCQkJCQk8eHNsOnNvcnQgc2VsZWN0PSJAVHlwZU5hbWUiLz4KLQkJCQkJCQkJCQk8eHNsOnNvcnQgc2VsZWN0PSJARGlzcGxheU5hbWUiLz4KLQkJCQkJCQkJCQkJPGxpPgotCQkJCQkJCQkJCQkJPGE+PHhzbDphdHRyaWJ1dGUgbmFtZT0iaHJlZiI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRiYWNrUGF0aCIvPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAVXJsIi8+PC94c2w6YXR0cmlidXRlPiA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQFR5cGVOYW1lIi8+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRjb2xvbl93aXRoX3NwYWNlIi8+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPjwvYT4KLQkJCQkJCQkJCQkJPC9saT4KLQkJCQkJCQkJCQk8L3hzbDpmb3ItZWFjaD4KLQkJCQkJCQkJCTwvdWw+Ci0JCQkJCQkJCQk8cC8+Ci0JCQkJCQkJCTwveHNsOmlmPgotCQkJCQkJCTwveHNsOmZvci1lYWNoPgkJCQkJCQkJCQkJCQkKLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iY29weXJpZ2h0Ij4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImNvcHlyaWdodCIgc2VsZWN0PSIkY29weXJpZ2h0Ii8+Ci0JCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCTwvdGQ+CQkJCQkJCi0JCQkJCTwvdHI+Ci0JCQkJPC90YWJsZT4KLQkJCTwvYm9keT4KLQkJCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+Ci0JCQkJY29udGVudFBhZ2Uub25sb2FkKCk7Ci0JCQk8L3NjcmlwdD4KLQkJPC9odG1sPgotCTwveHNsOnRlbXBsYXRlPgotCi0JPHhzbDp0ZW1wbGF0ZSBuYW1lPSJzdW1tYXJ5T3ZlcnZpZXciPgotCQk8eHNsOnBhcmFtIG5hbWU9ImVsZW1lbnRUeXBlIi8+Ci0JCTx4c2w6cGFyYW0gbmFtZT0iZWxlbWVudFR5cGVOYW1lIi8+Ci0JCTx4c2w6cGFyYW0gbmFtZT0iZWxlbWVudFByZXNlbnRhdGlvbk5hbWUiLz4KLQkJPHhzbDpwYXJhbSBuYW1lPSJlbGVtZW50SWNvbiIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImJyaWVmRGVzY3JpcHRpb24iIHNlbGVjdD0iYXR0cmlidXRlW0BuYW1lPSdicmllZkRlc2NyaXB0aW9uJ10iLz4JCQotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InN5bm9ueW1zIiBzZWxlY3Q9InJlZmVyZW5jZS9FbGVtZW50L2F0dHJpYnV0ZVtAbmFtZT0nc3lub255bXMnXSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImV4dGVybmFsSWQiIHNlbGVjdD0icmVmZXJlbmNlL0VsZW1lbnQvYXR0cmlidXRlW0BuYW1lPSdleHRlcm5hbElkJ10iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJpbWFnZVBhdGgiIHNlbGVjdD0iY29uY2F0KC9FbGVtZW50L0BCYWNrUGF0aCwgJ2ltYWdlcy8nKSIvPgotCQkKLQkJPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4KLQkJCTx0cj4KLQkJCQk8dGQgY2xhc3M9InBhZ2VUaXRsZSI+Ci0JCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkc3VtbWFyeVRleHQiLz48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGNvbG9uX3dpdGhfc3BhY2UiLz48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVsZW1lbnRQcmVzZW50YXRpb25OYW1lIi8+Ci0JCQkJCTx4c2w6aWYgdGVzdD0iJGV4dGVybmFsSWQgIT0gJyciPgotCQkJCQkJKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZXh0ZXJuYWxJZCIvPikKLQkJCQkJPC94c2w6aWY+Ci0JCQkJPC90ZD4KLQkJCTwvdHI+Ci0JCTwvdGFibGU+Ci0JCTx0YWJsZSB3aWR0aD0iMTAwJSIgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiPgotCQkJPHRyPgotCQkJCTx0ZCBjbGFzcz0icGFnZVRpdGxlU2VwYXJhdG9yIj4KLQkJCQkJPGltZyBzcmM9InskaW1hZ2VQYXRofXNoaW0uZ2lmIiBhbHQ9IiIgdGl0bGU9IiIgaGVpZ2h0PSIxIi8+Ci0JCQkJPC90ZD4KLQkJCTwvdHI+Ci0JCTwvdGFibGU+CQkKLQk8L3hzbDp0ZW1wbGF0ZT4KLQotPC94c2w6c3R5bGVzaGVldD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQveHNsL3RhaWxvcmluZy54c2wgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQveHNsL3RhaWxvcmluZy54c2wKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4NzFjZjkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L3hzbC90YWlsb3JpbmcueHNsCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotCi08eHNsOnN0eWxlc2hlZXQgdmVyc2lvbj0iMS4wIgotCXhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIgotCXhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiPgotCi0JPHhzbDp0ZW1wbGF0ZSBuYW1lPSJ0YWlsb3JpbmdTZWN0aW9uIj4KLQkJPHhzbDpwYXJhbSBuYW1lPSJkZXNjcmlwdGlvbiIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImltcGFjdE9mTm90SGF2aW5nIiBzZWxlY3Q9IiRkZXNjcmlwdGlvbi9hdHRyaWJ1dGVbQG5hbWU9J2ltcGFjdE9mTm90SGF2aW5nJ10iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJyZWFzb25zRm9yTm90TmVlZGluZyIgc2VsZWN0PSIkZGVzY3JpcHRpb24vYXR0cmlidXRlW0BuYW1lPSdyZWFzb25zRm9yTm90TmVlZGluZyddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0icmVwcmVzZW50YXRpb25PcHRpb25zIiBzZWxlY3Q9IiRkZXNjcmlwdGlvbi9hdHRyaWJ1dGVbQG5hbWU9J3JlcHJlc2VudGF0aW9uT3B0aW9ucyddIi8+Ci0JCTx4c2w6aWYgdGVzdD0iJGltcGFjdE9mTm90SGF2aW5nICE9ICcnIG9yICRyZWFzb25zRm9yTm90TmVlZGluZyAhPSAnJyBvciAkcmVwcmVzZW50YXRpb25PcHRpb25zICE9ICcnIj4KLQkJCTxkaXYgY2xhc3M9InNlY3Rpb25IZWFkaW5nIj4KLQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHRhaWxvcmluZ1RleHQiLz4KLQkJCTwvZGl2PgotCQkJPGRpdiBjbGFzcz0ic2VjdGlvbkNvbnRlbnQiPgotCQkJCTx0YWJsZSBjbGFzcz0ic2VjdGlvblRhYmxlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+Ci0JCQkJCTx4c2w6aWYgdGVzdD0iJGltcGFjdE9mTm90SGF2aW5nICE9ICcnIj4KLQkJCQkJCTx0ciB2YWxpZ249InRvcCI+Ci0JCQkJCQkJPHRoIGNsYXNzPSJzZWN0aW9uVGFibGVIZWFkaW5nIiBzY29wZT0icm93Ij4KLQkJCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRpbXBhY3RPZk5vdEhhdmluZ1RleHQiLz4KLQkJCQkJCQk8L3RoPgotCQkJCQkJCTx0ZCBjbGFzcz0ic2VjdGlvblRhYmxlQ2VsbCI+Ci0JCQkJCQkJCTx4c2w6dmFsdWUtb2YgZGlzYWJsZS1vdXRwdXQtZXNjYXBpbmc9InllcyIgc2VsZWN0PSIkaW1wYWN0T2ZOb3RIYXZpbmciLz4KLQkJCQkJCQk8L3RkPgotCQkJCQkJPC90cj4KLQkJCQkJPC94c2w6aWY+Ci0JCQkJCTx4c2w6aWYgdGVzdD0iJHJlYXNvbnNGb3JOb3ROZWVkaW5nICE9ICcnIj4KLQkJCQkJCTx0ciB2YWxpZ249InRvcCI+Ci0JCQkJCQkJPHRoIGNsYXNzPSJzZWN0aW9uVGFibGVIZWFkaW5nIiBzY29wZT0icm93Ij4KLQkJCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRyZWFzb25zRm9yTm90TmVlZGluZ1RleHQiLz4KLQkJCQkJCQk8L3RoPgotCQkJCQkJCTx0ZCBjbGFzcz0ic2VjdGlvblRhYmxlQ2VsbCI+Ci0JCQkJCQkJCTx4c2w6dmFsdWUtb2YgZGlzYWJsZS1vdXRwdXQtZXNjYXBpbmc9InllcyIgc2VsZWN0PSIkcmVhc29uc0Zvck5vdE5lZWRpbmciLz4KLQkJCQkJCQk8L3RkPgotCQkJCQkJPC90cj4KLQkJCQkJPC94c2w6aWY+Ci0JCQkJCTx4c2w6aWYgdGVzdD0iJHJlcHJlc2VudGF0aW9uT3B0aW9ucyAhPSAnJyI+Ci0JCQkJCQk8dHIgdmFsaWduPSJ0b3AiPgotCQkJCQkJCTx0aCBjbGFzcz0ic2VjdGlvblRhYmxlSGVhZGluZyIgc2NvcGU9InJvdyI+Ci0JCQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcmVwcmVzZW50YXRpb25PcHRpb25zVGV4dCIvPgotCQkJCQkJCTwvdGg+Ci0JCQkJCQkJPHRkIGNsYXNzPSJzZWN0aW9uVGFibGVDZWxsIj4KLQkJCQkJCQkJPHhzbDp2YWx1ZS1vZiBkaXNhYmxlLW91dHB1dC1lc2NhcGluZz0ieWVzIiBzZWxlY3Q9IiRyZXByZXNlbnRhdGlvbk9wdGlvbnMiLz4KLQkJCQkJCQk8L3RkPgotCQkJCQkJPC90cj4KLQkJCQkJPC94c2w6aWY+Ci0JCQkJPC90YWJsZT4KLQkJCTwvZGl2PgotCQk8L3hzbDppZj4KLQk8L3hzbDp0ZW1wbGF0ZT4KLQotPC94c2w6c3R5bGVzaGVldD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC94c2wvdGFzay54c2wgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQveHNsL3Rhc2sueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMjgyMWViLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC94c2wvdGFzay54c2wKKysrIC9kZXYvbnVsbApAQCAtMSw0MjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotCi08eHNsOnN0eWxlc2hlZXQgdmVyc2lvbj0iMS4wIgotCXhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIgotCXhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiPgotCi08eHNsOm91dHB1dCBtZXRob2Q9Imh0bWwiIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiAKLQlkb2N0eXBlLXB1YmxpYz0iLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iIAotCWRvY3R5cGUtc3lzdGVtPSJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIiAKLQlpbmRlbnQ9InllcyIvPgotCQkKLQkJCQkKLQk8eHNsOmluY2x1ZGUgaHJlZj0icmVzb3VyY2VzLnhzbCIvPgotCTx4c2w6aW5jbHVkZSBocmVmPSJjb21tb24ueHNsIi8+Ci0JPHhzbDppbmNsdWRlIGhyZWY9Im1hcHBpbmcueHNsIi8+Ci0JPHhzbDppbmNsdWRlIGhyZWY9Im92ZXJ2aWV3LnhzbCIvPgotCTx4c2w6aW5jbHVkZSBocmVmPSJwdXJwb3NlLnhzbCIvPgotCTx4c2w6aW5jbHVkZSBocmVmPSJtYWluX2Rlc2NyaXB0aW9uLnhzbCIvPgotCTx4c2w6aW5jbHVkZSBocmVmPSJpbGx1c3RyYXRpb24ueHNsIi8+Ci0JPHhzbDppbmNsdWRlIGhyZWY9ImtleV9jb25zaWRlcmF0aW9uLnhzbCIvPgotCTx4c2w6aW5jbHVkZSBocmVmPSJndWlkYW5jZV9oZWxwZXIueHNsIi8+Ci0JPHhzbDppbmNsdWRlIGhyZWY9ImRlc2NyaXB0b3JfaGVscGVyLnhzbCIvPgotCQotCQkKLQk8eHNsOnRlbXBsYXRlIG1hdGNoPSIvRWxlbWVudCI+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iZWxlbWVudFR5cGUiIHNlbGVjdD0iQFR5cGUiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJlbGVtZW50VHlwZU5hbWUiIHNlbGVjdD0iQFR5cGVOYW1lIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iZWxlbWVudE5hbWUiIHNlbGVjdD0iQE5hbWUiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJlbGVtZW50UHJlc2VudGF0aW9uTmFtZSIgc2VsZWN0PSJARGlzcGxheU5hbWUiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJiYWNrUGF0aCIgc2VsZWN0PSJAQmFja1BhdGgiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJpbWFnZVBhdGgiIHNlbGVjdD0iY29uY2F0KCRiYWNrUGF0aCwgJ2ltYWdlcy8nKSIvPgotCSAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InNoYXBlSW1hZ2UiIHNlbGVjdD0iY29uY2F0KCRiYWNrUGF0aCxAU2hhcGVpY29uVXJsKSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InByZXNlbnRhdGlvbiIgc2VsZWN0PSJyZWZlcmVuY2VbQG5hbWU9J3ByZXNlbnRhdGlvbiddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0idGFza0Rlc2NyaXB0aW9uIiBzZWxlY3Q9IiRwcmVzZW50YXRpb24vRWxlbWVudFtAVHlwZT0nVGFza0Rlc2NyaXB0aW9uJ10iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJjb3B5cmlnaHQiIHNlbGVjdD0iY29weXJpZ2h0Ii8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0ic2hvd1RyZWVCcm93c2VyIiBzZWxlY3Q9IkBzaG93VHJlZUJyb3dzZXIiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJwZXJmb3JtaW5nUm9sZSIgc2VsZWN0PSJyZWZlcmVuY2VbQG5hbWU9J3BlcmZvcm1lZEJ5J10vRWxlbWVudFtAVHlwZT0nUm9sZSddIi8+Ci0JCQkKLQkJPGh0bWw+Ci0JCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJsYW5nIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGxhbmciLz48L3hzbDphdHRyaWJ1dGU+Ci0JCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJ4bWw6bGFuZyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBsYW5nIi8+PC94c2w6YXR0cmlidXRlPgotCQkJPGhlYWQ+Ci0JCQkJPHRpdGxlPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudFR5cGVOYW1lIi8+OiA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVsZW1lbnRQcmVzZW50YXRpb25OYW1lIi8+PC90aXRsZT4KLQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0idW1hTWV0YVRhZ3MiPgotCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudFR5cGUiIHNlbGVjdD0iJGVsZW1lbnRUeXBlIi8+Ci0JCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50TmFtZSIgc2VsZWN0PSIkZWxlbWVudE5hbWUiLz4KLQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnRQcmVzZW50YXRpb25OYW1lIiBzZWxlY3Q9IiRlbGVtZW50UHJlc2VudGF0aW9uTmFtZSIvPgotCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJPG1ldGEgbmFtZT0iZWxlbWVudF90eXBlIj4gCi0JCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJtYXBwaW5nIj4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50VHlwZSIgc2VsZWN0PSIkZWxlbWVudFR5cGUiLz4KLQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQk8L21ldGE+Ci0JCQkJPG1ldGEgbmFtZT0iZmlsZXR5cGUiIGNvbnRlbnQ9ImRlc2NyaXB0aW9uIi8+Ci0JCQkJPG1ldGEgbmFtZT0icm9sZSI+Ci0JCQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9ImNvbnRlbnQiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcGVyZm9ybWluZ1JvbGUvQERpc3BsYXlOYW1lIi8+PC94c2w6YXR0cmlidXRlPgotCQkJCTwvbWV0YT4KLQkJCQk8bGluayByZWw9IlN0eWxlU2hlZXQiIGhyZWY9InskYmFja1BhdGh9Y3NzL2RlZmF1bHQuY3NzIiB0eXBlPSJ0ZXh0L2NzcyIvPgotCQkJCTxzY3JpcHQgc3JjPSJ7JGJhY2tQYXRofXNjcmlwdHMvQ29udGVudFBhZ2VSZXNvdXJjZS5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PC9zY3JpcHQ+Ci0JCQkJPHNjcmlwdCBzcmM9InskYmFja1BhdGh9c2NyaXB0cy9Db250ZW50UGFnZVNlY3Rpb24uanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPjwvc2NyaXB0PgotCQkJCTxzY3JpcHQgc3JjPSJ7JGJhY2tQYXRofXNjcmlwdHMvQ29udGVudFBhZ2VTdWJTZWN0aW9uLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij48L3NjcmlwdD4KLQkJCQk8c2NyaXB0IHNyYz0ieyRiYWNrUGF0aH1zY3JpcHRzL0NvbnRlbnRQYWdlVG9vbGJhci5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PC9zY3JpcHQ+Ci0JCQkJPHNjcmlwdCBzcmM9InskYmFja1BhdGh9c2NyaXB0cy9jb250ZW50UGFnZS5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PC9zY3JpcHQ+Ci0JCQkJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij4KLQkJCQkJdmFyIGJhY2tQYXRoID0gJzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkYmFja1BhdGgiLz4nOwotCQkJCQl2YXIgaW1nUGF0aCA9ICc8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGltYWdlUGF0aCIvPic7Ci0JCQkJCXZhciBub2RlSW5mbz1udWxsOwotCQkJCQljb250ZW50UGFnZS5wcmVsb2FkKGltZ1BhdGgsIGJhY2tQYXRoLCBub2RlSW5mbywgJycsIHRydWUsIGZhbHNlLCBmYWxzZSk7Ci0JCQkJPC9zY3JpcHQ+Ci0JCQk8L2hlYWQ+Ci0JCQk8Ym9keT4KLQkJCTxkaXYgaWQ9ImJyZWFkY3J1bWJzIj48L2Rpdj4KLQkJCQk8dGFibGUgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLQkJCQkJPHRyPgotCQkJCQkJPHRkIHZhbGlnbj0idG9wIj4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0ib3ZlcnZpZXciPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudFR5cGUiIHNlbGVjdD0iJGVsZW1lbnRUeXBlIi8+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50VHlwZU5hbWUiIHNlbGVjdD0iJGVsZW1lbnRUeXBlTmFtZSIvPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudFByZXNlbnRhdGlvbk5hbWUiIHNlbGVjdD0iJGVsZW1lbnRQcmVzZW50YXRpb25OYW1lIi8+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50SWNvbiIgc2VsZWN0PSIkc2hhcGVJbWFnZSIvPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iYmFja1BhdGgiIHNlbGVjdD0iJGJhY2tQYXRoIi8+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJzaG93VHJlZUJyb3dzZXIiIHNlbGVjdD0iJHNob3dUcmVlQnJvd3NlciIvPgotCQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InB1cnBvc2VTZWN0aW9uIj4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImRlc2NyaXB0aW9uIiBzZWxlY3Q9IiR0YXNrRGVzY3JpcHRpb24iLz4KLQkJCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJyZWxhdGlvbnNoaXBzU2VjdGlvbiIvPgotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJtYWluRGVzY3JpcHRpb25TZWN0aW9uIj4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImRlc2NyaXB0aW9uIiBzZWxlY3Q9IiR0YXNrRGVzY3JpcHRpb24iLz4KLQkJCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJzdGVwc1NlY3Rpb24iPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZGVzY3JpcHRpb24iIHNlbGVjdD0iJHRhc2tEZXNjcmlwdGlvbiIvPgotCQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+CQotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJpbGx1c3RyYXRpb25zU2VjdGlvbiIvPgotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJrZXlDb25zaWRlcmF0aW9uc1NlY3Rpb24iPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZGVzY3JpcHRpb24iIHNlbGVjdD0iJHRhc2tEZXNjcmlwdGlvbiIvPgotCQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFsdGVybmF0aXZlc1NlY3Rpb24iPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZGVzY3JpcHRpb24iIHNlbGVjdD0iJHRhc2tEZXNjcmlwdGlvbiIvPgotCQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9Im1vcmVJbmZvU2VjdGlvbiIvPgotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJjb3B5cmlnaHQiPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iY29weXJpZ2h0IiBzZWxlY3Q9IiRjb3B5cmlnaHQiLz4KLQkJCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQkJPC90ZD4JCQkJCQkKLQkJCQkJPC90cj4KLQkJCQk8L3RhYmxlPgotCQkJPC9ib2R5PgotCQkJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij4KLQkJCQljb250ZW50UGFnZS5vbmxvYWQoKTsKLQkJCTwvc2NyaXB0PgotCi0JCTwvaHRtbD4KLQk8L3hzbDp0ZW1wbGF0ZT4KLQotCTx4c2w6dGVtcGxhdGUgbmFtZT0icmVsYXRpb25zaGlwc1NlY3Rpb24iPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InBlcmZvcm1lZEJ5IiBzZWxlY3Q9InJlZmVyZW5jZUxpc3RbQG5hbWU9J3BlcmZvcm1lZEJ5J10vRWxlbWVudCIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5IiBzZWxlY3Q9InJlZmVyZW5jZUxpc3RbQG5hbWU9J2FkZGl0aW9uYWxseVBlcmZvcm1lZEJ5J10vRWxlbWVudCIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9IndvcmtQcm9kdWN0TWFuZGF0b3J5SW5wdXRzIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3RbQG5hbWU9J21hbmRhdG9yeUlucHV0J10vRWxlbWVudFtAVHlwZSE9J1dvcmtQcm9kdWN0U2xvdCddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0id29ya1Byb2R1Y3RTbG90TWFuZGF0b3J5SW5wdXRzIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3RbQG5hbWU9J21hbmRhdG9yeUlucHV0J10vRWxlbWVudFtAVHlwZT0nV29ya1Byb2R1Y3RTbG90J10iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJ3b3JrUHJvZHVjdE9wdGlvbmFsSW5wdXRzIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3RbQG5hbWU9J29wdGlvbmFsSW5wdXQnXS9FbGVtZW50W0BUeXBlIT0nV29ya1Byb2R1Y3RTbG90J10iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJ3b3JrUHJvZHVjdFNsb3RPcHRpb25hbElucHV0cyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0W0BuYW1lPSdvcHRpb25hbElucHV0J10vRWxlbWVudFtAVHlwZT0nV29ya1Byb2R1Y3RTbG90J10iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJ3b3JrUHJvZHVjdE91dHB1dHMiIHNlbGVjdD0icmVmZXJlbmNlTGlzdFtAbmFtZT0nb3V0cHV0J10vRWxlbWVudFtAVHlwZSE9J1dvcmtQcm9kdWN0U2xvdCddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0id29ya1Byb2R1Y3RTbG90T3V0cHV0cyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0W0BuYW1lPSdvdXRwdXQnXS9FbGVtZW50W0BUeXBlPSdXb3JrUHJvZHVjdFNsb3QnXSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImltYWdlUGF0aCIgc2VsZWN0PSJjb25jYXQoL0VsZW1lbnQvQEJhY2tQYXRoLCAnaW1hZ2VzLycpIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iY2F0ZWdvcmllcyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0W0BuYW1lPSdDb250ZW50RWxlbWVudF9DdXN0b21DYXRlZ29yaWVzJ10vRWxlbWVudCIvPgotCi0JCTx4c2w6aWYgdGVzdD0iY291bnQoJHBlcmZvcm1lZEJ5KSArIGNvdW50KCRjYXRlZ29yaWVzKSArIGNvdW50KCRhZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSkgKyBjb3VudCgkd29ya1Byb2R1Y3RNYW5kYXRvcnlJbnB1dHMpICsgY291bnQoJHdvcmtQcm9kdWN0U2xvdE1hbmRhdG9yeUlucHV0cykgKyBjb3VudCgkd29ya1Byb2R1Y3RPcHRpb25hbElucHV0cykgKyBjb3VudCgkd29ya1Byb2R1Y3RTbG90T3B0aW9uYWxJbnB1dHMpICsgY291bnQoJHdvcmtQcm9kdWN0T3V0cHV0cykgKyBjb3VudCgkd29ya1Byb2R1Y3RTbG90T3V0cHV0cykgPiAwIj4KLQkJCTxkaXYgY2xhc3M9InNlY3Rpb25IZWFkaW5nIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHJlbGF0aW9uc2hpcHNUZXh0Ii8+PC9kaXY+Ci0JCQk8ZGl2IGNsYXNzPSJzZWN0aW9uQ29udGVudCI+Ci0JCQkJPHRhYmxlIGNsYXNzPSJzZWN0aW9uVGFibGUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4KLQkJCQkJPHhzbDppZiB0ZXN0PSJjb3VudCgkY2F0ZWdvcmllcykgPiAwIj4KLQkJCQkJCTx0ciB2YWxpZ249InRvcCI+Ci0JCQkJCQkJPHRoIGNsYXNzPSJzZWN0aW9uVGFibGVIZWFkaW5nIiBzY29wZT0icm93Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGNhdGVnb3JpZXNUZXh0Ii8+PC90aD4KLQkJCQkJCQk8dGQgY2xhc3M9InNlY3Rpb25UYWJsZUNlbGwiIGNvbHNwYW49IjIiPgotCQkJCQkJCTx1bD4KLQkJCQkJCQkJPHhzbDpmb3ItZWFjaCBzZWxlY3Q9IiRjYXRlZ29yaWVzIj4KLQkJCQkJCQkJPHhzbDpzb3J0IHNlbGVjdD0iQERpc3BsYXlOYW1lIi8+Ci0JCQkJCQkJCQk8bGk+Ci0JCQkJCQkJCQkJPGE+Ci0JCQkJCQkJCQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9ImhyZWYiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIvRWxlbWVudC9AQmFja1BhdGgiLz48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQFVybCIvPjwveHNsOmF0dHJpYnV0ZT4KLQkJCQkJCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPgotCQkJCQkJCQkJCTwvYT4KLQkJCQkJCQkJCTwvbGk+Ci0JCQkJCQkJCTwveHNsOmZvci1lYWNoPgotCQkJCQkJCTwvdWw+Ci0JCQkJCQkJPC90ZD4KLQkJCQkJCTwvdHI+Ci0JCQkJCTwveHNsOmlmPgkJCQkKLQkJCQkJCi0JCQkJCTx4c2w6aWYgdGVzdD0iY291bnQoJHBlcmZvcm1lZEJ5KSArIGNvdW50KCRhZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSkgPiAwIj4KLQkJCQkJCTx0ciB2YWxpZ249InRvcCI+Ci0JCQkJCQkJPHRoIGNsYXNzPSJzZWN0aW9uVGFibGVIZWFkaW5nIiBzY29wZT0icm93Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHJvbGVzVGV4dCIvPjwvdGg+Ci0JCQkJCQkJPHRkIGNsYXNzPSJzZWN0aW9uVGFibGVDZWxsIiB3aWR0aD0iNDIlIj4KLQkJCQkJCQkJPHNwYW4gY2xhc3M9InNlY3Rpb25UYWJsZUNlbGxIZWFkaW5nIj4KLQkJCQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJpbWFyeVBlcmZvcm1lclRleHQiLz46Ci0JCQkJCQkJCTwvc3Bhbj4KLQkJCQkJCQkJPHhzbDppZiB0ZXN0PSJjb3VudCgkcGVyZm9ybWVkQnkpID4gMCI+CQkJCQkJCQkJCi0JCQkJCQkJCTx1bD4KLQkJCQkJCQkJCTx4c2w6Zm9yLWVhY2ggc2VsZWN0PSIkcGVyZm9ybWVkQnkiPgotCQkJCQkJCQkJPHhzbDpzb3J0IHNlbGVjdD0iQERpc3BsYXlOYW1lIi8+Ci0JCQkJCQkJCQkJPGxpPgotCQkJCQkJCQkJCQk8YT48eHNsOmF0dHJpYnV0ZSBuYW1lPSJocmVmIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iL0VsZW1lbnQvQEJhY2tQYXRoIi8+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBVcmwiLz48L3hzbDphdHRyaWJ1dGU+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPjwvYT4KLQkJCQkJCQkJCQk8L2xpPgotCQkJCQkJCQkJPC94c2w6Zm9yLWVhY2g+Ci0JCQkJCQkJCTwvdWw+Ci0JCQkJCQkJCTwveHNsOmlmPgotCQkJCQkJCTwvdGQ+Ci0JCQkJCQkJPHRkIGNsYXNzPSJzZWN0aW9uVGFibGVDZWxsIj4KLQkJCQkJCQkJPHNwYW4gY2xhc3M9InNlY3Rpb25UYWJsZUNlbGxIZWFkaW5nIj4KLQkJCQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkYWRkaXRpb25hbFBlcmZvcm1lclRleHQiLz46Ci0JCQkJCQkJCTwvc3Bhbj4KLQkJCQkJCQkJPHhzbDppZiB0ZXN0PSJjb3VudCgkYWRkaXRpb25hbGx5UGVyZm9ybWVkQnkpID4gMCI+CQkJCQkJCQkJCi0JCQkJCQkJCTx1bD4KLQkJCQkJCQkJCTx4c2w6Zm9yLWVhY2ggc2VsZWN0PSIkYWRkaXRpb25hbGx5UGVyZm9ybWVkQnkiPgotCQkJCQkJCQkJPHhzbDpzb3J0IHNlbGVjdD0iQERpc3BsYXlOYW1lIi8+Ci0JCQkJCQkJCQkJPGxpPgotCQkJCQkJCQkJCQk8YT48eHNsOmF0dHJpYnV0ZSBuYW1lPSJocmVmIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iL0VsZW1lbnQvQEJhY2tQYXRoIi8+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBVcmwiLz48L3hzbDphdHRyaWJ1dGU+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPjwvYT4KLQkJCQkJCQkJCQk8L2xpPgotCQkJCQkJCQkJPC94c2w6Zm9yLWVhY2g+Ci0JCQkJCQkJCTwvdWw+Ci0JCQkJCQkJCTwveHNsOmlmPgotCQkJCQkJCTwvdGQ+Ci0JCQkJCQk8L3RyPgotCQkJCQk8L3hzbDppZj4KLQkJCQkJPHhzbDppZiB0ZXN0PSJjb3VudCgkd29ya1Byb2R1Y3RNYW5kYXRvcnlJbnB1dHMpICsgY291bnQoJHdvcmtQcm9kdWN0U2xvdE1hbmRhdG9yeUlucHV0cykgKyBjb3VudCgkd29ya1Byb2R1Y3RPcHRpb25hbElucHV0cykgKyBjb3VudCgkd29ya1Byb2R1Y3RTbG90T3B0aW9uYWxJbnB1dHMpID4gMCI+Ci0JCQkJCQk8dHIgdmFsaWduPSJ0b3AiPgotCQkJCQkJCTx0aCBjbGFzcz0ic2VjdGlvblRhYmxlSGVhZGluZyIgc2NvcGU9InJvdyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRpbnB1dHNUZXh0Ii8+PC90aD4KLQkJCQkJCQk8dGQgY2xhc3M9InNlY3Rpb25UYWJsZUNlbGwiIHdpZHRoPSI0MiUiPgotCQkJCQkJCQk8c3BhbiBjbGFzcz0ic2VjdGlvblRhYmxlQ2VsbEhlYWRpbmciPgotCQkJCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRtYW5kYXRvcnlUZXh0Ii8+OgotCQkJCQkJCQk8L3NwYW4+Ci0JCQkJCQkJCTx4c2w6Y2hvb3NlPgotCQkJCQkJCQkJPHhzbDp3aGVuIHRlc3Q9ImNvdW50KCR3b3JrUHJvZHVjdE1hbmRhdG9yeUlucHV0cykgKyBjb3VudCgkd29ya1Byb2R1Y3RTbG90TWFuZGF0b3J5SW5wdXRzKSA+IDAiPgotCQkJCQkJCQkJCTx1bD4KLQkJCQkJCQkJCQk8eHNsOmZvci1lYWNoIHNlbGVjdD0iJHdvcmtQcm9kdWN0TWFuZGF0b3J5SW5wdXRzIj4JCQotCQkJCQkJCQkJCTx4c2w6c29ydCBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPgkJCQkJCQkJCi0JCQkJCQkJCQkJCTxsaT4KLQkJCQkJCQkJCQkJCTxhPjx4c2w6YXR0cmlidXRlIG5hbWU9ImhyZWYiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIvRWxlbWVudC9AQmFja1BhdGgiLz48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQFVybCIvPjwveHNsOmF0dHJpYnV0ZT48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQERpc3BsYXlOYW1lIi8+PC9hPgotCQkJCQkJCQkJCQk8L2xpPgotCQkJCQkJCQkJCTwveHNsOmZvci1lYWNoPgkJCQkJCQkKLQkJCQkJCQkJCQk8L3VsPgotCQkJCQkJCQkJCTx1bD4KLQkJCQkJCQkJCQk8eHNsOmZvci1lYWNoIHNlbGVjdD0iJHdvcmtQcm9kdWN0U2xvdE1hbmRhdG9yeUlucHV0cyI+Ci0JCQkJCQkJCQkJPHhzbDpzb3J0IHNlbGVjdD0iQERpc3BsYXlOYW1lIi8+Ci0JCQkJCQkJCQkJCTxsaT4KLQkJCQkJCQkJCQkJCTxhPgotCQkJCQkJCQkJCQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9ImhyZWYiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIvRWxlbWVudC9AQmFja1BhdGgiLz4KLQkJCQkJCQkJCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBVcmwiLz48L3hzbDphdHRyaWJ1dGU+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPgotCQkJCQkJCQkJCQkJPC9hPgotCQkJCQkJCQkJCQkJPHVsPgotCQkJCQkJCQkJCQkJPHhzbDpmb3ItZWFjaCBzZWxlY3Q9InJlZmVyZW5jZUxpc3RbQG5hbWU9J0Z1bEZpbGxzX0Z1bGxGaWxsYWJsZUVsZW1lbnRzJ10vRWxlbWVudCI+Ci0JCQkJCQkJCQkJCQk8eHNsOnNvcnQgc2VsZWN0PSJARGlzcGxheU5hbWUiLz4KLQkJCQkJCQkJCQkJCTxsaT4KLQkJCQkJCQkJCQkJCQk8YT4KLQkJCQkJCQkJCQkJCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0iaHJlZiI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii9FbGVtZW50L0BCYWNrUGF0aCIvPgotCQkJCQkJCQkJCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBVcmwiLz48L3hzbDphdHRyaWJ1dGU+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPgotCQkJCQkJCQkJCQkJCTwvYT4KLQkJCQkJCQkJCQkJCTwvbGk+Ci0JCQkJCQkJCQkJCQk8L3hzbDpmb3ItZWFjaD4KLQkJCQkJCQkJCQkJCTwvdWw+Ci0JCQkJCQkJCQkJCTwvbGk+Ci0JCQkJCQkJCQkJPC94c2w6Zm9yLWVhY2g+Ci0JCQkJCQkJCQkJPC91bD4KLQkJCQkJCQkJCTwveHNsOndoZW4+CQkJCQotCQkJCQkJCQkJPHhzbDpvdGhlcndpc2U+Ci0JCQkJCQkJCQk8dWw+Ci0JCQkJCQkJCQkJPGxpPgotCQkJCQkJCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5vbmVUZXh0Ii8+Ci0JCQkJCQkJCQkJPC9saT4JCQkJCQkJCQkKLQkJCQkJCQkJCTwvdWw+Ci0JCQkJCQkJCQk8L3hzbDpvdGhlcndpc2U+Ci0JCQkJCQkJCTwveHNsOmNob29zZT4KLQkJCQkJCQk8L3RkPgotCQkJCQkJCTx0ZCBjbGFzcz0ic2VjdGlvblRhYmxlQ2VsbCI+Ci0JCQkJCQkJCTxzcGFuIGNsYXNzPSJzZWN0aW9uVGFibGVDZWxsSGVhZGluZyI+Ci0JCQkJCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG9wdGlvbmFsVGV4dCIvPjoKLQkJCQkJCQkJPC9zcGFuPgotCQkJCQkJCQk8eHNsOmNob29zZT4KLQkJCQkJCQkJCTx4c2w6d2hlbiB0ZXN0PSJjb3VudCgkd29ya1Byb2R1Y3RPcHRpb25hbElucHV0cykgKyBjb3VudCgkd29ya1Byb2R1Y3RTbG90T3B0aW9uYWxJbnB1dHMpID4gMCI+Ci0JCQkJCQkJCQkJPHVsPgotCQkJCQkJCQkJCTx4c2w6Zm9yLWVhY2ggc2VsZWN0PSIkd29ya1Byb2R1Y3RPcHRpb25hbElucHV0cyI+CQkJCQotCQkJCQkJCQkJCTx4c2w6c29ydCBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPgkJCQkJCQotCQkJCQkJCQkJCQk8bGk+Ci0JCQkJCQkJCQkJCQk8YT48eHNsOmF0dHJpYnV0ZSBuYW1lPSJocmVmIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iL0VsZW1lbnQvQEJhY2tQYXRoIi8+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBVcmwiLz48L3hzbDphdHRyaWJ1dGU+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPjwvYT4KLQkJCQkJCQkJCQkJPC9saT4KLQkJCQkJCQkJCQk8L3hzbDpmb3ItZWFjaD4JCQkJCQkJCi0JCQkJCQkJCQkJPC91bD4KLQkJCQkJCQkJCQk8dWw+Ci0JCQkJCQkJCQkJPHhzbDpmb3ItZWFjaCBzZWxlY3Q9IiR3b3JrUHJvZHVjdFNsb3RPcHRpb25hbElucHV0cyI+Ci0JCQkJCQkJCQkJPHhzbDpzb3J0IHNlbGVjdD0iQERpc3BsYXlOYW1lIi8+Ci0JCQkJCQkJCQkJCTxsaT4KLQkJCQkJCQkJCQkJCTxhPgotCQkJCQkJCQkJCQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9ImhyZWYiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIvRWxlbWVudC9AQmFja1BhdGgiLz4KLQkJCQkJCQkJCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBVcmwiLz48L3hzbDphdHRyaWJ1dGU+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPgotCQkJCQkJCQkJCQkJPC9hPgotCQkJCQkJCQkJCQkJPHVsPgotCQkJCQkJCQkJCQkJPHhzbDpmb3ItZWFjaCBzZWxlY3Q9InJlZmVyZW5jZUxpc3RbQG5hbWU9J0Z1bEZpbGxzX0Z1bGxGaWxsYWJsZUVsZW1lbnRzJ10vRWxlbWVudCI+Ci0JCQkJCQkJCQkJCQk8eHNsOnNvcnQgc2VsZWN0PSJARGlzcGxheU5hbWUiLz4KLQkJCQkJCQkJCQkJCTxsaT4KLQkJCQkJCQkJCQkJCQk8YT4KLQkJCQkJCQkJCQkJCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0iaHJlZiI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii9FbGVtZW50L0BCYWNrUGF0aCIvPgotCQkJCQkJCQkJCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBVcmwiLz48L3hzbDphdHRyaWJ1dGU+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPgotCQkJCQkJCQkJCQkJCTwvYT4KLQkJCQkJCQkJCQkJCTwvbGk+Ci0JCQkJCQkJCQkJCQk8L3hzbDpmb3ItZWFjaD4KLQkJCQkJCQkJCQkJCTwvdWw+Ci0JCQkJCQkJCQkJCTwvbGk+Ci0JCQkJCQkJCQkJPC94c2w6Zm9yLWVhY2g+Ci0JCQkJCQkJCQkJPC91bD4KLQkJCQkJCQkJCTwveHNsOndoZW4+CQkJCQotCQkJCQkJCQkJPHhzbDpvdGhlcndpc2U+Ci0JCQkJCQkJCQk8dWw+Ci0JCQkJCQkJCQkJPGxpPgotCQkJCQkJCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5vbmVUZXh0Ii8+Ci0JCQkJCQkJCQkJPC9saT4JCQkJCQkJCQkKLQkJCQkJCQkJCTwvdWw+Ci0JCQkJCQkJCQk8L3hzbDpvdGhlcndpc2U+Ci0JCQkJCQkJCTwveHNsOmNob29zZT4KLQkJCQkJCQk8L3RkPgkJCQkJCi0JCQkJCQk8L3RyPgotCQkJCQk8L3hzbDppZj4KLQkJCQkJPHhzbDppZiB0ZXN0PSJjb3VudCgkd29ya1Byb2R1Y3RPdXRwdXRzKSArIGNvdW50KCR3b3JrUHJvZHVjdFNsb3RPdXRwdXRzKSA+IDAiPgotCQkJCQkJPHRyIHZhbGlnbj0idG9wIj4KLQkJCQkJCQk8dGggY2xhc3M9InNlY3Rpb25UYWJsZUhlYWRpbmciIHNjb3BlPSJyb3ciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkb3V0cHV0c1RleHQiLz48L3RoPgotCQkJCQkJCTx0ZCBjbGFzcz0ic2VjdGlvblRhYmxlQ2VsbCIgY29sc3Bhbj0iMiI+Ci0JCQkJCQkJCTx1bD4KLQkJCQkJCQkJPHhzbDpmb3ItZWFjaCBzZWxlY3Q9IiR3b3JrUHJvZHVjdE91dHB1dHMiPgotCQkJCQkJCQk8eHNsOnNvcnQgc2VsZWN0PSJARGlzcGxheU5hbWUiLz4KLQkJCQkJCQkJCTxsaT4KLQkJCQkJCQkJCQk8YT4KLQkJCQkJCQkJCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0iaHJlZiI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii9FbGVtZW50L0BCYWNrUGF0aCIvPgotCQkJCQkJCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBVcmwiLz48L3hzbDphdHRyaWJ1dGU+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPgotCQkJCQkJCQkJCTwvYT4KLQkJCQkJCQkJCTwvbGk+Ci0JCQkJCQkJCTwveHNsOmZvci1lYWNoPgotCQkJCQkJCQk8L3VsPgotCQkJCQkJCQk8dWw+Ci0JCQkJCQkJCTx4c2w6Zm9yLWVhY2ggc2VsZWN0PSIkd29ya1Byb2R1Y3RTbG90T3V0cHV0cyI+Ci0JCQkJCQkJCTx4c2w6c29ydCBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPgotCQkJCQkJCQkJPGxpPgotCQkJCQkJCQkJCTxhPgotCQkJCQkJCQkJCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJocmVmIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iL0VsZW1lbnQvQEJhY2tQYXRoIi8+Ci0JCQkJCQkJCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQFVybCIvPjwveHNsOmF0dHJpYnV0ZT48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQERpc3BsYXlOYW1lIi8+Ci0JCQkJCQkJCQkJPC9hPgotCQkJCQkJCQkJCTx1bD4KLQkJCQkJCQkJCQk8eHNsOmZvci1lYWNoIHNlbGVjdD0icmVmZXJlbmNlTGlzdFtAbmFtZT0nRnVsRmlsbHNfRnVsbEZpbGxhYmxlRWxlbWVudHMnXS9FbGVtZW50Ij4KLQkJCQkJCQkJCQk8eHNsOnNvcnQgc2VsZWN0PSJARGlzcGxheU5hbWUiLz4KLQkJCQkJCQkJCQk8bGk+Ci0JCQkJCQkJCQkJCTxhPgotCQkJCQkJCQkJCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0iaHJlZiI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii9FbGVtZW50L0BCYWNrUGF0aCIvPgotCQkJCQkJCQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAVXJsIi8+PC94c2w6YXR0cmlidXRlPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJARGlzcGxheU5hbWUiLz4KLQkJCQkJCQkJCQkJPC9hPgotCQkJCQkJCQkJCTwvbGk+Ci0JCQkJCQkJCQkJPC94c2w6Zm9yLWVhY2g+Ci0JCQkJCQkJCQkJPC91bD4KLQkJCQkJCQkJCTwvbGk+Ci0JCQkJCQkJCTwveHNsOmZvci1lYWNoPgotCQkJCQkJCQk8L3VsPgotCQkJCQkJCTwvdGQ+Ci0JCQkJCQk8L3RyPgotCQkJCQk8L3hzbDppZj4KLQkJCQkJCi0JCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhZGREZXNjcmlwdG9ycyI+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZGVzY3JpcHRvcnMiIHNlbGVjdD0icmVmZXJlbmNlTGlzdFtAbmFtZT0nZGVzY3JpcHRvcnMnXS9FbGVtZW50Ii8+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iY29sc3BhbiIgc2VsZWN0PSInMiciLz4KLQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCi0JCQkJPC90YWJsZT4KLQkJCTwvZGl2PgotCQk8L3hzbDppZj4KLQk8L3hzbDp0ZW1wbGF0ZT4KLQotCTx4c2w6dGVtcGxhdGUgbmFtZT0ibW9yZUluZm9TZWN0aW9uIj4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJjaGVja2xpc3RzIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3QvRWxlbWVudFtAVHlwZT0nQ2hlY2tsaXN0J10iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJjb25jZXB0cyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0L0VsZW1lbnRbQFR5cGU9J0NvbmNlcHQnXSIvPgkKLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJndWlkZWxpbmVzIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3QvRWxlbWVudFtAVHlwZT0nR3VpZGVsaW5lJ10iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJzdXBwb3J0aW5nTWF0ZXJpYWxzIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3QvRWxlbWVudFtAVHlwZT0nU3VwcG9ydGluZ01hdGVyaWFsJ10iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJ0b29sTWVudG9ycyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0L0VsZW1lbnRbQFR5cGU9J1Rvb2xNZW50b3InXSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9IndoaXRlUGFwZXJzIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3QvRWxlbWVudFtAVHlwZT0nV2hpdGVwYXBlciddIi8+CQkKLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJpbWFnZVBhdGgiIHNlbGVjdD0iY29uY2F0KC9FbGVtZW50L0BCYWNrUGF0aCwgJ2ltYWdlcy8nKSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImVzdGltYXRpb25Db25zaWRlcmF0aW9ucyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0L0VsZW1lbnRbQFR5cGU9J0VzdGltYXRpb25Db25zaWRlcmF0aW9ucyddIi8+Ci0KLQkJPHhzbDppZiB0ZXN0PSJjb3VudCgkY2hlY2tsaXN0cykgKyBjb3VudCgkY29uY2VwdHMpICsgY291bnQoJGd1aWRlbGluZXMpICsgY291bnQoJHN1cHBvcnRpbmdNYXRlcmlhbHMpICsgY291bnQoJHRvb2xNZW50b3JzKSArIGNvdW50KCR3aGl0ZVBhcGVycykgKyBjb3VudCgkZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKSA+IDAiPgotCQkJPGRpdiBjbGFzcz0ic2VjdGlvbkhlYWRpbmciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbW9yZUluZm9UZXh0Ii8+PC9kaXY+Ci0JCQk8ZGl2IGNsYXNzPSJzZWN0aW9uQ29udGVudCI+Ci0JCQkJPHRhYmxlIGNsYXNzPSJzZWN0aW9uVGFibGUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4KLQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFkZENoZWNrbGlzdHMiPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImNoZWNrbGlzdHMiIHNlbGVjdD0iJGNoZWNrbGlzdHMiLz4KLQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFkZENvbmNlcHRzIj4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJjb25jZXB0cyIgc2VsZWN0PSIkY29uY2VwdHMiLz4KLQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFkZEd1aWRlbGluZXMiPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9Imd1aWRlbGluZXMiIHNlbGVjdD0iJGd1aWRlbGluZXMiLz4KLQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFkZFN1cHBvcnRpbmdNYXRlcmlhbHMiPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9InN1cHBvcnRpbmdNYXRlcmlhbHMiIHNlbGVjdD0iJHN1cHBvcnRpbmdNYXRlcmlhbHMiLz4KLQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFkZFRvb2xNZW50b3JzIj4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJ0b29sTWVudG9ycyIgc2VsZWN0PSIkdG9vbE1lbnRvcnMiLz4KLQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFkZFdoaXRlUGFwZXJzIj4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJ3aGl0ZVBhcGVycyIgc2VsZWN0PSIkd2hpdGVQYXBlcnMiLz4KLQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFkZEVzdGltYXRpb25Db25zaWRlcmF0aW9ucyI+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIiBzZWxlY3Q9IiRlc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMiLz4KLQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQk8L3RhYmxlPgotCQkJPC9kaXY+Ci0JCTwveHNsOmlmPgotCTwveHNsOnRlbXBsYXRlPgotCi0JPHhzbDp0ZW1wbGF0ZSBuYW1lPSJzdGVwc1NlY3Rpb24iPgotCQk8eHNsOnBhcmFtIG5hbWU9ImRlc2NyaXB0aW9uIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0ic2VjdGlvbnMiIHNlbGVjdD0iJGRlc2NyaXB0aW9uL3JlZmVyZW5jZUxpc3RbQG5hbWU9J3NlY3Rpb25zJ10vRWxlbWVudFtAVHlwZT0nU2VjdGlvbiddIi8+Ci0JCTx4c2w6aWYgdGVzdD0iY291bnQoJHNlY3Rpb25zKSA+IDAiPgotCQkJPGRpdiBjbGFzcz0ic2VjdGlvbkhlYWRpbmciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkc3RlcHNUZXh0Ii8+PC9kaXY+Ci0JCQk8ZGl2IGNsYXNzPSJzZWN0aW9uQ29udGVudCI+Ci0JCQkJPHRhYmxlIGNsYXNzPSJzZWN0aW9uVGFibGUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4KLQkJCQkJPHRyPgotCQkJCQkJPHRkIGNsYXNzPSJzZWN0aW9uVGFibGVTaW5nbGVDZWxsIj4KLQkJCQkJCQk8eHNsOmZvci1lYWNoIHNlbGVjdD0iJHNlY3Rpb25zIj4KLQkJCQkJCQkJPGRpdiBjbGFzcz0ic3RlcEhlYWRpbmciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJhdHRyaWJ1dGVbQG5hbWU9J25hbWUnXSIvPjwvZGl2PgotCQkJCQkJCQk8ZGl2IGNsYXNzPSJzdGVwQ29udGVudCI+Ci0JCQkJCQkJCQk8dGFibGUgY2xhc3M9InN0ZXBUYWJsZSIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiPgotCQkJCQkJCQkJCTx0ciB2YWxpZ249InRvcCI+Ci0JCQkJCQkJCQkJCTx0ZD4KLQkJCQkJCQkJCQkJCTx4c2w6dmFsdWUtb2YgZGlzYWJsZS1vdXRwdXQtZXNjYXBpbmc9InllcyIgc2VsZWN0PSJhdHRyaWJ1dGVbQG5hbWU9J3NlY3Rpb25EZXNjcmlwdGlvbiddIi8+Ci0JCQkJCQkJCQkJCTwvdGQ+Ci0JCQkJCQkJCQkJPC90cj4KLQkJCQkJCQkJCTwvdGFibGU+Ci0JCQkJCQkJCTwvZGl2PgkJCQkJCQotCQkJCQkJCTwveHNsOmZvci1lYWNoPgotCQkJCQkJPC90ZD4KLQkJCQkJPC90cj4KLQkJCQk8L3RhYmxlPgotCQkJPC9kaXY+Ci0JCTwveHNsOmlmPgotCTwveHNsOnRlbXBsYXRlPgotCi0JPHhzbDp0ZW1wbGF0ZSBuYW1lPSJhbHRlcm5hdGl2ZXNTZWN0aW9uIj4KLQkJPHhzbDpwYXJhbSBuYW1lPSJkZXNjcmlwdGlvbiIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImFsdGVybmF0aXZlcyIgc2VsZWN0PSIkZGVzY3JpcHRpb24vYXR0cmlidXRlW0BuYW1lPSdhbHRlcm5hdGl2ZXMnXSIvPgotCQk8eHNsOmlmIHRlc3Q9IiRhbHRlcm5hdGl2ZXMgIT0gJycgIj4KLQkJCTxkaXYgY2xhc3M9InNlY3Rpb25IZWFkaW5nIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGFsdGVybmF0aXZlc1RleHQiLz48L2Rpdj4KLQkJCTxkaXYgY2xhc3M9InNlY3Rpb25Db250ZW50Ij4KLQkJCQk8dGFibGUgY2xhc3M9InNlY3Rpb25UYWJsZSIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiPgotCQkJCQk8dHIgdmFsaWduPSJ0b3AiPgotCQkJCQkJPHRkIGNsYXNzPSJzZWN0aW9uVGFibGVTaW5nbGVDZWxsIj4KLQkJCQkJCQk8eHNsOnZhbHVlLW9mIGRpc2FibGUtb3V0cHV0LWVzY2FwaW5nPSJ5ZXMiIHNlbGVjdD0iJGFsdGVybmF0aXZlcyIvPgotCQkJCQkJPC90ZD4KLQkJCQkJPC90cj4KLQkJCQk8L3RhYmxlPgotCQkJPC9kaXY+Ci0JCTwveHNsOmlmPgotCTwveHNsOnRlbXBsYXRlPgotCi08L3hzbDpzdHlsZXNoZWV0PgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L3hzbC90YXNrX2Rlc2NyaXB0b3IueHNsIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L3hzbC90YXNrX2Rlc2NyaXB0b3IueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYjViNWVhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC94c2wvdGFza19kZXNjcmlwdG9yLnhzbAorKysgL2Rldi9udWxsCkBAIC0xLDQzNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci0KLTx4c2w6c3R5bGVzaGVldCB2ZXJzaW9uPSIxLjAiCi0JeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iCi0JeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSI+Ci0KLTx4c2w6b3V0cHV0IG1ldGhvZD0iaHRtbCIgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIAotCWRvY3R5cGUtcHVibGljPSItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgCi0JZG9jdHlwZS1zeXN0ZW09Imh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiIAotCWluZGVudD0ieWVzIi8+Ci0JCi0JPHhzbDppbmNsdWRlIGhyZWY9ImRlc2NyaXB0b3IueHNsIi8+Ci0JPHhzbDppbmNsdWRlIGhyZWY9InB1cnBvc2UueHNsIi8+Ci0JPHhzbDppbmNsdWRlIGhyZWY9Imd1aWRhbmNlX2hlbHBlci54c2wiLz4KLQotCTx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii9FbGVtZW50Ij4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJlbGVtZW50SWQiIHNlbGVjdD0iQElkIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iZWxlbWVudFR5cGUiIHNlbGVjdD0iQFR5cGUiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJlbGVtZW50VHlwZU5hbWUiIHNlbGVjdD0iQFR5cGVOYW1lIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iZWxlbWVudE5hbWUiIHNlbGVjdD0iQE5hbWUiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJlbGVtZW50UHJlc2VudGF0aW9uTmFtZSIgc2VsZWN0PSJARGlzcGxheU5hbWUiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJiYWNrUGF0aCIgc2VsZWN0PSJAQmFja1BhdGgiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJpbWFnZVBhdGgiIHNlbGVjdD0iY29uY2F0KCRiYWNrUGF0aCwgJ2ltYWdlcy8nKSIvPgotCSAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InNoYXBlSW1hZ2UiIHNlbGVjdD0iY29uY2F0KCRiYWNrUGF0aCxAU2hhcGVpY29uVXJsKSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InByZXNlbnRhdGlvbiIgc2VsZWN0PSJyZWZlcmVuY2VbQG5hbWU9J3ByZXNlbnRhdGlvbiddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iZGVzY3JpcHRvckRlc2NyaXB0aW9uIiBzZWxlY3Q9IiRwcmVzZW50YXRpb24vRWxlbWVudFtAVHlwZT0nRGVzY3JpcHRvckRlc2NyaXB0aW9uJ10iLz4JCQotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImNvcHlyaWdodCIgc2VsZWN0PSJjb3B5cmlnaHQiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJzaG93VHJlZUJyb3dzZXIiIHNlbGVjdD0iQHNob3dUcmVlQnJvd3NlciIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InBlcmZvcm1pbmdSb2xlIiBzZWxlY3Q9InJlZmVyZW5jZVtAbmFtZT0ncGVyZm9ybWVkUHJpbWFyaWx5QnknXS9FbGVtZW50W0BUeXBlPSdSb2xlRGVzY3JpcHRvciddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0icXVlcnlTdHJpbmciIHNlbGVjdD0iQHF1ZXJ5U3RyaW5nIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0icmVsUHJvY2Vzc1BhdGgiIHNlbGVjdD0iQHJlbFByb2Nlc3NQYXRoIi8+CQkKLQkJPGh0bWw+Ci0JCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJsYW5nIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGxhbmciLz48L3hzbDphdHRyaWJ1dGU+Ci0JCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJ4bWw6bGFuZyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBsYW5nIi8+PC94c2w6YXR0cmlidXRlPgotCQkJPGhlYWQ+Ci0JCQkJPHRpdGxlPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudFR5cGVOYW1lIi8+OiA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVsZW1lbnRQcmVzZW50YXRpb25OYW1lIi8+PC90aXRsZT4KLQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0idW1hTWV0YVRhZ3MiPgotCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudFR5cGUiIHNlbGVjdD0iJGVsZW1lbnRUeXBlIi8+Ci0JCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50TmFtZSIgc2VsZWN0PSIkZWxlbWVudE5hbWUiLz4KLQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnRQcmVzZW50YXRpb25OYW1lIiBzZWxlY3Q9IiRlbGVtZW50UHJlc2VudGF0aW9uTmFtZSIvPgotCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJPG1ldGEgbmFtZT0idW1hLmd1aWQiIGNvbnRlbnQ9InskZWxlbWVudElkfSIvPgotCQkJCTxtZXRhIG5hbWU9ImVsZW1lbnRfdHlwZSIgY29udGVudD0ieyRlbGVtZW50VHlwZX0iLz4KLQkJCQk8bWV0YSBuYW1lPSJmaWxldHlwZSIgY29udGVudD0iZGVzY3JpcHRpb24iLz4KLQkJCQk8bWV0YSBuYW1lPSJyb2xlIj4KLQkJCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0iY29udGVudCI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwZXJmb3JtaW5nUm9sZS9ARGlzcGxheU5hbWUiLz48L3hzbDphdHRyaWJ1dGU+Ci0JCQkJPC9tZXRhPgotCQkJCTxsaW5rIHJlbD0iU3R5bGVTaGVldCIgaHJlZj0ieyRiYWNrUGF0aH1jc3MvZGVmYXVsdC5jc3MiIHR5cGU9InRleHQvY3NzIi8+Ci0JCQkJPHNjcmlwdCBzcmM9InskYmFja1BhdGh9c2NyaXB0cy9Db250ZW50UGFnZVJlc291cmNlLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij48L3NjcmlwdD4KLQkJCQk8c2NyaXB0IHNyYz0ieyRiYWNrUGF0aH1zY3JpcHRzL0NvbnRlbnRQYWdlU2VjdGlvbi5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PC9zY3JpcHQ+Ci0JCQkJPHNjcmlwdCBzcmM9InskYmFja1BhdGh9c2NyaXB0cy9Db250ZW50UGFnZVN1YlNlY3Rpb24uanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPjwvc2NyaXB0PgotCQkJCTxzY3JpcHQgc3JjPSJ7JGJhY2tQYXRofXNjcmlwdHMvQWN0aXZpdHlUcmVlVGFibGUuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPjwvc2NyaXB0PgotCQkJCTxzY3JpcHQgc3JjPSJ7JGJhY2tQYXRofXNjcmlwdHMvUHJvY2Vzc0VsZW1lbnRQYWdlLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij48L3NjcmlwdD4KLQkJCQk8c2NyaXB0IHNyYz0ieyRiYWNrUGF0aH1zY3JpcHRzL0NvbnRlbnRQYWdlVG9vbGJhci5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PC9zY3JpcHQ+Ci0JCQkJPHNjcmlwdCBzcmM9InskYmFja1BhdGh9c2NyaXB0cy9jb250ZW50UGFnZS5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PC9zY3JpcHQ+Ci0JCQkJPHNjcmlwdCBzcmM9InskYmFja1BhdGh9c2NyaXB0cy9wcm9jZXNzRWxlbWVudERhdGEuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPjwvc2NyaXB0PgotCQkJCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+Ci0JCQkJCXZhciBkZWZhdWx0UXVlcnlTdHIgPSAnPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRxdWVyeVN0cmluZyIvPic7Ci0JCQkJCXZhciBiYWNrUGF0aCA9ICc8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGJhY2tQYXRoIi8+JzsKLQkJCQkJdmFyIGltZ1BhdGggPSAnPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRpbWFnZVBhdGgiLz4nOwotCQkJCQl2YXIgbm9kZUluZm89bnVsbDsKLQkJCQkJY29udGVudFBhZ2UucHJlbG9hZChpbWdQYXRoLCBiYWNrUGF0aCwgbm9kZUluZm8sIGRlZmF1bHRRdWVyeVN0ciwgdHJ1ZSwgdHJ1ZSwgZmFsc2UpOwotCQkJCTwvc2NyaXB0PgotCQkJPC9oZWFkPgotCQkJPGJvZHk+Ci0JCQk8ZGl2IGlkPSJicmVhZGNydW1icyI+PC9kaXY+Ci0JCQkJPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci0JCQkJCTx0cj4KLQkJCQkJCTx0ZCB2YWxpZ249InRvcCI+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9Im92ZXJ2aWV3Ij4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnRUeXBlIiBzZWxlY3Q9IiRlbGVtZW50VHlwZSIvPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudFR5cGVOYW1lIiBzZWxlY3Q9IiRlbGVtZW50VHlwZU5hbWUiLz4JCQkJCQkJCQotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudFByZXNlbnRhdGlvbk5hbWUiIHNlbGVjdD0iJGVsZW1lbnRQcmVzZW50YXRpb25OYW1lIi8+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50SWNvbiIgc2VsZWN0PSIkc2hhcGVJbWFnZSIvPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iYmFja1BhdGgiIHNlbGVjdD0iJGJhY2tQYXRoIi8+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJzaG93VHJlZUJyb3dzZXIiIHNlbGVjdD0iJHNob3dUcmVlQnJvd3NlciIvPgotCQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+CQkKLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icHVycG9zZVNlY3Rpb24iPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZGVzY3JpcHRpb24iIHNlbGVjdD0iJGRlc2NyaXB0b3JEZXNjcmlwdGlvbiIvPgotCQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InJlbGF0aW9uc2hpcHNTZWN0aW9uIi8+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InJlZmluZWREZXNjcmlwdGlvblNlY3Rpb24iPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZGVzY3JpcHRpb24iIHNlbGVjdD0iJGRlc2NyaXB0b3JEZXNjcmlwdGlvbiIvPgotCQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InN0ZXBzU2VjdGlvbiIvPgotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJwcm9wZXJ0aWVzU2VjdGlvbiIvPgotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJ1c2FnZVNlY3Rpb24iPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZGVzY3JpcHRpb24iIHNlbGVjdD0iJGRlc2NyaXB0b3JEZXNjcmlwdGlvbiIvPgotCQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImlsbHVzdHJhdGlvbnNTZWN0aW9uIi8+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImtleUNvbnNpZGVyYXRpb25zU2VjdGlvbiI+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJkZXNjcmlwdGlvbiIgc2VsZWN0PSIkZGVzY3JpcHRvckRlc2NyaXB0aW9uIi8+Ci0JCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWx0ZXJuYXRpdmVzU2VjdGlvbiI+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJkZXNjcmlwdGlvbiIgc2VsZWN0PSIkZGVzY3JpcHRvckRlc2NyaXB0aW9uIi8+Ci0JCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0ibW9yZUluZm9TZWN0aW9uIi8+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImNvcHlyaWdodCI+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJjb3B5cmlnaHQiIHNlbGVjdD0iJGNvcHlyaWdodCIvPgotCQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQk8L3RkPgkJCQkJCQotCQkJCQk8L3RyPgotCQkJCTwvdGFibGU+Ci0JCQk8L2JvZHk+Ci0JCQkJPHNjcmlwdCBsYW5ndWFnZT0iSmF2YVNjcmlwdCIgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLQkJCQkJY29udGVudFBhZ2Uub25sb2FkKCk7Ci0JCQkJCWNvbnRlbnRQYWdlLnByb2Nlc3NQYWdlLmZpeERlc2NyaXB0b3JMaW5rcygpOwotCQkJCTwvc2NyaXB0PgotCQk8L2h0bWw+Ci0JPC94c2w6dGVtcGxhdGU+Ci0KLQk8eHNsOnRlbXBsYXRlIG5hbWU9InByb3BlcnRpZXNTZWN0aW9uIj4KLQkJPHhzbDpwYXJhbSBuYW1lPSJjb250ZW50RGVzY3JpcHRpb24iLz4KLQkJPGRpdiBjbGFzcz0ic2VjdGlvbkhlYWRpbmciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydGllc1RleHQiLz48L2Rpdj4KLQkJPGRpdiBjbGFzcz0ic2VjdGlvbkNvbnRlbnQiPgotCQkJPHRhYmxlIGNsYXNzPSJzZWN0aW9uVGFibGUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4KLQkJCSAgICA8eHNsOmlmIHRlc3Q9InJlZmVyZW5jZUxpc3RbQG5hbWU9J2xpbmtUb1ByZWRlY2Vzc29yJ10vRWxlbWVudCI+Ci0JCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhZGRSZWZlcmVuY2VzIj4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJyZWZOYW1lIiBzZWxlY3Q9IiRwcmVkZWNlc3NvclRleHQiLz4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJyZWZFbGVtZW50IiBzZWxlY3Q9InJlZmVyZW5jZUxpc3RbQG5hbWU9J2xpbmtUb1ByZWRlY2Vzc29yJ10vRWxlbWVudCIvPgotCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCTwveHNsOmlmPgotCQkJCTx4c2w6aWYgdGVzdD0iYXR0cmlidXRlW0BuYW1lPSdQbGFubmluZ0RhdGEnXSI+Ci0JCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJwcm9wZXJ0eSI+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZmllbGRMYWJlbCIgc2VsZWN0PSIkcGxhbm5pbmdEYXRhVGV4dCIvPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImZpZWxkVGV4dCIgc2VsZWN0PSJhdHRyaWJ1dGVbQG5hbWU9J1BsYW5uaW5nRGF0YSddIi8+Ci0JCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJPC94c2w6aWY+Ci0JCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InByb3BlcnR5Ij4KLQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImZpZWxkTGFiZWwiIHNlbGVjdD0iJG11bHRpcGxlT2NjdXJyZW5jZXNUZXh0Ii8+Ci0JCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJmaWVsZFRleHQiIHNlbGVjdD0iYXR0cmlidXRlW0BuYW1lPSdoYXNNdWx0aXBsZU9jY3VycmVuY2VzJ10iLz4KLQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJwcm9wZXJ0eSI+Ci0JCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJmaWVsZExhYmVsIiBzZWxlY3Q9IiRldmVudERyaXZlblRleHQiLz4KLQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImZpZWxkVGV4dCIgc2VsZWN0PSJhdHRyaWJ1dGVbQG5hbWU9J2lzRXZlbnREcml2ZW4nXSIvPgotCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJPHhzbDppZiB0ZXN0PSJhdHRyaWJ1dGVbQG5hbWU9J2lzT25nb2luZyddIj4KLQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InByb3BlcnR5Ij4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJmaWVsZExhYmVsIiBzZWxlY3Q9IiRvbmdvaW5nVGV4dCIvPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImZpZWxkVGV4dCIgc2VsZWN0PSJhdHRyaWJ1dGVbQG5hbWU9J2lzT25nb2luZyddIi8+Ci0JCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJPC94c2w6aWY+Ci0JCQkJPHhzbDppZiB0ZXN0PSJhdHRyaWJ1dGVbQG5hbWU9J2lzT3B0aW9uYWwnXSI+Ci0JCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJwcm9wZXJ0eSI+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZmllbGRMYWJlbCIgc2VsZWN0PSIkb3B0aW9uYWxUZXh0Ii8+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZmllbGRUZXh0IiBzZWxlY3Q9ImF0dHJpYnV0ZVtAbmFtZT0naXNPcHRpb25hbCddIi8+Ci0JCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJPC94c2w6aWY+Ci0JCQkJPHhzbDppZiB0ZXN0PSJhdHRyaWJ1dGVbQG5hbWU9J2lzUGxhbm5lZCddIj4KLQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InByb3BlcnR5Ij4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJmaWVsZExhYmVsIiBzZWxlY3Q9IiRwbGFubmVkVGV4dCIvPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImZpZWxkVGV4dCIgc2VsZWN0PSJhdHRyaWJ1dGVbQG5hbWU9J2lzUGxhbm5lZCddIi8+Ci0JCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJPC94c2w6aWY+CQkJCQotCQkJCTx4c2w6aWYgdGVzdD0iYXR0cmlidXRlW0BuYW1lPSdpc1JlcGVhdGFibGUnXSI+Ci0JCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJwcm9wZXJ0eSI+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZmllbGRMYWJlbCIgc2VsZWN0PSIkcmVwZWF0YWJsZVRleHQiLz4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJmaWVsZFRleHQiIHNlbGVjdD0iYXR0cmlidXRlW0BuYW1lPSdpc1JlcGVhdGFibGUnXSIvPgotCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCTwveHNsOmlmPgkJCQkKLQkJCTwvdGFibGU+Ci0JCTwvZGl2PgotCTwveHNsOnRlbXBsYXRlPgotCi0JPHhzbDp0ZW1wbGF0ZSBuYW1lPSJ1c2FnZVNlY3Rpb24iPgotCQk8eHNsOnBhcmFtIG5hbWU9ImRlc2NyaXB0aW9uIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0idXNhZ2VHdWlkYW5jZSIgc2VsZWN0PSIkZGVzY3JpcHRpb24vYXR0cmlidXRlW0BuYW1lPSd1c2FnZUd1aWRhbmNlJ10iLz4KLQkJPHhzbDppZiB0ZXN0PSIkdXNhZ2VHdWlkYW5jZSAhPSAnJyI+Ci0JCQk8ZGl2IGNsYXNzPSJzZWN0aW9uSGVhZGluZyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR1c2FnZUd1aWRhbmNlVGV4dCIvPjwvZGl2PgotCQkJPGRpdiBjbGFzcz0ic2VjdGlvbkNvbnRlbnQiPgotCQkJCTx0YWJsZSBjbGFzcz0ic2VjdGlvblRhYmxlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+Ci0JCQkJCTx0ciB2YWxpZ249InRvcCI+Ci0JCQkJCQk8dGQgY2xhc3M9InNlY3Rpb25UYWJsZVNpbmdsZUNlbGwiPgotCQkJCQkJCTx4c2w6dmFsdWUtb2YgZGlzYWJsZS1vdXRwdXQtZXNjYXBpbmc9InllcyIgc2VsZWN0PSIkdXNhZ2VHdWlkYW5jZSIvPgotCQkJCQkJPC90ZD4KLQkJCQkJPC90cj4KLQkJCQk8L3RhYmxlPgotCQkJPC9kaXY+Ci0JCTwveHNsOmlmPgotCTwveHNsOnRlbXBsYXRlPgkKLQotCTx4c2w6dGVtcGxhdGUgbmFtZT0icmVsYXRpb25zaGlwc1NlY3Rpb24iPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InBlcmZvcm1lZFByaW1hcmlseUJ5IiBzZWxlY3Q9InJlZmVyZW5jZUxpc3RbQG5hbWU9J3BlcmZvcm1lZFByaW1hcmlseUJ5J10vRWxlbWVudCIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5IiBzZWxlY3Q9InJlZmVyZW5jZUxpc3RbQG5hbWU9J2FkZGl0aW9uYWxseVBlcmZvcm1lZEJ5J10vRWxlbWVudCIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImFzc2lzdGVkQnkiIHNlbGVjdD0icmVmZXJlbmNlTGlzdFtAbmFtZT0nYXNzaXN0ZWRCeSddL0VsZW1lbnQiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJtYW5kYXRvcnlJbnB1dHMiIHNlbGVjdD0icmVmZXJlbmNlTGlzdFtAbmFtZT0nbWFuZGF0b3J5SW5wdXQnXS9FbGVtZW50Ii8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0ib3B0aW9uYWxJbnB1dHMiIHNlbGVjdD0icmVmZXJlbmNlTGlzdFtAbmFtZT0nb3B0aW9uYWxJbnB1dCddL0VsZW1lbnQiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJleHRlcm5hbElucHV0IiBzZWxlY3Q9InJlZmVyZW5jZUxpc3RbQG5hbWU9J2V4dGVybmFsSW5wdXQnXS9FbGVtZW50Ii8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0ib3V0cHV0cyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0W0BuYW1lPSdvdXRwdXQnXS9FbGVtZW50Ii8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iaW1hZ2VQYXRoIiBzZWxlY3Q9ImNvbmNhdCgvRWxlbWVudC9AQmFja1BhdGgsICdpbWFnZXMvJykiLz4KLQotCQk8eHNsOmlmIHRlc3Q9ImNvdW50KCRwZXJmb3JtZWRQcmltYXJpbHlCeSkgKyBjb3VudCgkYWRkaXRpb25hbGx5UGVyZm9ybWVkQnkpICsgY291bnQoJGFzc2lzdGVkQnkpICsgY291bnQoJG1hbmRhdG9yeUlucHV0cykgKyBjb3VudCgkb3B0aW9uYWxJbnB1dHMpICsgY291bnQoJGV4dGVybmFsSW5wdXQpKyBjb3VudCgkb3V0cHV0cykgPiAwIj4KLQkJCTxkaXYgY2xhc3M9InNlY3Rpb25IZWFkaW5nIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHJlbGF0aW9uc2hpcHNUZXh0Ii8+PC9kaXY+Ci0JCQk8ZGl2IGNsYXNzPSJzZWN0aW9uQ29udGVudCI+Ci0JCQkJPHRhYmxlIGNsYXNzPSJzZWN0aW9uVGFibGUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4JCQotCQkJCQk8eHNsOmlmIHRlc3Q9ImNvdW50KCRwZXJmb3JtZWRQcmltYXJpbHlCeSkgKyBjb3VudCgkYWRkaXRpb25hbGx5UGVyZm9ybWVkQnkpICsgY291bnQoJGFzc2lzdGVkQnkpID4gMCI+CQkJCi0JCQkJCQk8dHIgdmFsaWduPSJ0b3AiPgotCQkJCQkJCTx0aCBjbGFzcz0ic2VjdGlvblRhYmxlSGVhZGluZyIgc2NvcGU9InJvdyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRyb2xlc1RleHQiLz48L3RoPgotCQkJCQkJCTx0ZCBjbGFzcz0ic2VjdGlvblRhYmxlQ2VsbCIgd2lkdGg9IjMwJSI+Ci0JCQkJCQkJCTxzcGFuIGNsYXNzPSJzZWN0aW9uVGFibGVDZWxsSGVhZGluZyI+Ci0JCQkJCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG1haW5UZXh0Ii8+OgotCQkJCQkJCQk8L3NwYW4+Ci0JCQkJCQkJCTx4c2w6aWYgdGVzdD0iY291bnQoJHBlcmZvcm1lZFByaW1hcmlseUJ5KSA+IDAiPgotCQkJCQkJCQk8dWw+Ci0JCQkJCQkJCQk8eHNsOmZvci1lYWNoIHNlbGVjdD0iJHBlcmZvcm1lZFByaW1hcmlseUJ5Ij4KLQkJCQkJCQkJCTx4c2w6c29ydCBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPgotCQkJCQkJCQkJCTxsaT4KLQkJCQkJCQkJCQkJPGE+PHhzbDphdHRyaWJ1dGUgbmFtZT0iaHJlZiI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii9FbGVtZW50L0BCYWNrUGF0aCIvPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAVXJsIi8+PC94c2w6YXR0cmlidXRlPjx4c2w6dmFsdWUtb2YgCXNlbGVjdD0iQERpc3BsYXlOYW1lIi8+PC9hPgotCQkJCQkJCQkJCTwvbGk+Ci0JCQkJCQkJCQk8L3hzbDpmb3ItZWFjaD4KLQkJCQkJCQkJPC91bD4KLQkJCQkJCQkJPC94c2w6aWY+Ci0JCQkJCQkJPC90ZD4KLQkJCQkJCQk8dGQgY2xhc3M9InNlY3Rpb25UYWJsZUNlbGwiIHdpZHRoPSIzMCUiPgkKLQkJCQkJCQkJPHNwYW4gY2xhc3M9InNlY3Rpb25UYWJsZUNlbGxIZWFkaW5nIj4JCQkJCQkJCi0JCQkJCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGFkZGl0aW9uYWxUZXh0Ii8+OgotCQkJCQkJCQk8L3NwYW4+Ci0JCQkJCQkJCTx4c2w6aWYgdGVzdD0iY291bnQoJGFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5KSA+IDAiPgotCQkJCQkJCQk8dWw+Ci0JCQkJCQkJCQk8eHNsOmZvci1lYWNoIHNlbGVjdD0iJGFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5Ij4KLQkJCQkJCQkJCTx4c2w6c29ydCBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPgotCQkJCQkJCQkJCTxsaT4KLQkJCQkJCQkJCQkJPGE+PHhzbDphdHRyaWJ1dGUgbmFtZT0iaHJlZiI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii9FbGVtZW50L0BCYWNrUGF0aCIvPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAVXJsIi8+PC94c2w6YXR0cmlidXRlPjx4c2w6dmFsdWUtb2YgCXNlbGVjdD0iQERpc3BsYXlOYW1lIi8+PC9hPgotCQkJCQkJCQkJCTwvbGk+Ci0JCQkJCQkJCQk8L3hzbDpmb3ItZWFjaD4KLQkJCQkJCQkJPC91bD4KLQkJCQkJCQkJPC94c2w6aWY+Ci0JCQkJCQkJPC90ZD4KLQkJCQkJCQk8dGQgY2xhc3M9InNlY3Rpb25UYWJsZUNlbGwiPgotCQkJCQkJCQk8c3BhbiBjbGFzcz0ic2VjdGlvblRhYmxlQ2VsbEhlYWRpbmciPgotCQkJCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRhc3Npc3RpbmdUZXh0Ii8+OgotCQkJCQkJCQk8L3NwYW4+Ci0JCQkJCQkJCTx4c2w6aWYgdGVzdD0iY291bnQoJGFzc2lzdGVkQnkpID4gMCI+CQkJCQkJCQkJCi0JCQkJCQkJCTx1bD4KLQkJCQkJCQkJCTx4c2w6Zm9yLWVhY2ggc2VsZWN0PSIkYXNzaXN0ZWRCeSI+Ci0JCQkJCQkJCQk8eHNsOnNvcnQgc2VsZWN0PSJARGlzcGxheU5hbWUiLz4KLQkJCQkJCQkJCQk8bGk+Ci0JCQkJCQkJCQkJCTxhPjx4c2w6YXR0cmlidXRlIG5hbWU9ImhyZWYiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIvRWxlbWVudC9AQmFja1BhdGgiLz48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQFVybCIvPjwveHNsOmF0dHJpYnV0ZT48eHNsOnZhbHVlLW9mIAlzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPjwvYT4KLQkJCQkJCQkJCQk8L2xpPgotCQkJCQkJCQkJPC94c2w6Zm9yLWVhY2g+Ci0JCQkJCQkJCTwvdWw+Ci0JCQkJCQkJCTwveHNsOmlmPgotCQkJCQkJCTwvdGQ+Ci0JCQkJCQk8L3RyPgkJCQotCQkJCQk8L3hzbDppZj4JCQotCQkJCQk8eHNsOmlmIHRlc3Q9ImNvdW50KCRtYW5kYXRvcnlJbnB1dHMpICsgY291bnQoJGV4dGVybmFsSW5wdXQpICsgY291bnQoJG9wdGlvbmFsSW5wdXRzKSA+IDAiPgotCQkJCQkJPHRyIHZhbGlnbj0idG9wIj4KLQkJCQkJCQk8dGggY2xhc3M9InNlY3Rpb25UYWJsZUhlYWRpbmciIHNjb3BlPSJyb3ciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkaW5wdXRzVGV4dCIvPjwvdGg+Ci0JCQkJCQkJPHRkIGNsYXNzPSJzZWN0aW9uVGFibGVDZWxsIiB3aWR0aD0iMzAlIj4KLQkJCQkJCQkJPHNwYW4gY2xhc3M9InNlY3Rpb25UYWJsZUNlbGxIZWFkaW5nIj4KLQkJCQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbWFuZGF0b3J5VGV4dCIvPjoKLQkJCQkJCQkJPC9zcGFuPgotCQkJCQkJCQk8eHNsOmNob29zZT4KLQkJCQkJCQkJCTx4c2w6d2hlbiB0ZXN0PSJjb3VudCgkbWFuZGF0b3J5SW5wdXRzKSA+IDAiPgotCQkJCQkJCQkJPHVsPgotCQkJCQkJCQkJCTx4c2w6Zm9yLWVhY2ggc2VsZWN0PSIkbWFuZGF0b3J5SW5wdXRzIj4KLQkJCQkJCQkJCQk8eHNsOnNvcnQgc2VsZWN0PSJARGlzcGxheU5hbWUiLz4KLQkJCQkJCQkJCQkJPGxpPgotCQkJCQkJCQkJCQkJPGE+PHhzbDphdHRyaWJ1dGUgbmFtZT0iaHJlZiI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii9FbGVtZW50L0BCYWNrUGF0aCIvPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAVXJsIi8+PC94c2w6YXR0cmlidXRlPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJARGlzcGxheU5hbWUiLz48L2E+Ci0JCQkJCQkJCQkJCTwvbGk+Ci0JCQkJCQkJCQkJPC94c2w6Zm9yLWVhY2g+CQkJCQkJCQotCQkJCQkJCQkJPC91bD4KLQkJCQkJCQkJCTwveHNsOndoZW4+CQkJCQotCQkJCQkJCQkJPHhzbDpvdGhlcndpc2U+Ci0JCQkJCQkJCQk8dWw+Ci0JCQkJCQkJCQkJPGxpPgotCQkJCQkJCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5vbmVUZXh0Ii8+Ci0JCQkJCQkJCQkJPC9saT4KLQkJCQkJCQkJCTwvdWw+CQkJCQkJCQkJCi0JCQkJCQkJCQk8L3hzbDpvdGhlcndpc2U+CQkJCQkJCQkJCi0JCQkJCQkJCTwveHNsOmNob29zZT4KLQkJCQkJCQk8L3RkPgotCQkJCQkJCTx0ZCBjbGFzcz0ic2VjdGlvblRhYmxlQ2VsbCIgd2lkdGg9IjMwJSI+Ci0JCQkJCQkJCTxzcGFuIGNsYXNzPSJzZWN0aW9uVGFibGVDZWxsSGVhZGluZyI+Ci0JCQkJCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG9wdGlvbmFsVGV4dCIvPjoKLQkJCQkJCQkJPC9zcGFuPgotCQkJCQkJCQk8eHNsOmNob29zZT4KLQkJCQkJCQkJCTx4c2w6d2hlbiB0ZXN0PSJjb3VudCgkb3B0aW9uYWxJbnB1dHMpID4gMCI+Ci0JCQkJCQkJCQk8dWw+Ci0JCQkJCQkJCQkJPHhzbDpmb3ItZWFjaCBzZWxlY3Q9IiRvcHRpb25hbElucHV0cyI+Ci0JCQkJCQkJCQkJPHhzbDpzb3J0IHNlbGVjdD0iQERpc3BsYXlOYW1lIi8+Ci0JCQkJCQkJCQkJCTxsaT4KLQkJCQkJCQkJCQkJCTxhPjx4c2w6YXR0cmlidXRlIG5hbWU9ImhyZWYiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIvRWxlbWVudC9AQmFja1BhdGgiLz48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQFVybCIvPjwveHNsOmF0dHJpYnV0ZT48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQERpc3BsYXlOYW1lIi8+PC9hPgotCQkJCQkJCQkJCQk8L2xpPgotCQkJCQkJCQkJCTwveHNsOmZvci1lYWNoPgkJCQkJCQkKLQkJCQkJCQkJCTwvdWw+Ci0JCQkJCQkJCQk8L3hzbDp3aGVuPgkJCQkKLQkJCQkJCQkJCTx4c2w6b3RoZXJ3aXNlPgotCQkJCQkJCQkJPHVsPgotCQkJCQkJCQkJCTxsaT4KLQkJCQkJCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRub25lVGV4dCIvPgotCQkJCQkJCQkJCTwvbGk+Ci0JCQkJCQkJCQk8L3VsPgkJCQkJCQkJCQotCQkJCQkJCQkJPC94c2w6b3RoZXJ3aXNlPgkJCQkJCQkJCQotCQkJCQkJCQk8L3hzbDpjaG9vc2U+Ci0JCQkJCQkJPC90ZD4KLQkJCQkJCQk8dGQgY2xhc3M9InNlY3Rpb25UYWJsZUNlbGwiPgotCQkJCQkJCQk8c3BhbiBjbGFzcz0ic2VjdGlvblRhYmxlQ2VsbEhlYWRpbmciPgotCQkJCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRleHRlcm5hbFRleHQiLz46Ci0JCQkJCQkJCTwvc3Bhbj4KLQkJCQkJCQkJPHhzbDpjaG9vc2U+Ci0JCQkJCQkJCQk8eHNsOndoZW4gdGVzdD0iY291bnQoJGV4dGVybmFsSW5wdXQpID4gMCI+Ci0JCQkJCQkJCQk8dWw+Ci0JCQkJCQkJCQkJPHhzbDpmb3ItZWFjaCBzZWxlY3Q9IiRleHRlcm5hbElucHV0Ij4KLQkJCQkJCQkJCQk8eHNsOnNvcnQgc2VsZWN0PSJARGlzcGxheU5hbWUiLz4KLQkJCQkJCQkJCQkJPGxpPgotCQkJCQkJCQkJCQkJPGE+PHhzbDphdHRyaWJ1dGUgbmFtZT0iaHJlZiI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii9FbGVtZW50L0BCYWNrUGF0aCIvPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAVXJsIi8+PC94c2w6YXR0cmlidXRlPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJARGlzcGxheU5hbWUiLz48L2E+Ci0JCQkJCQkJCQkJCTwvbGk+Ci0JCQkJCQkJCQkJPC94c2w6Zm9yLWVhY2g+CQkJCQkJCQotCQkJCQkJCQkJPC91bD4KLQkJCQkJCQkJCTwveHNsOndoZW4+CQkJCQotCQkJCQkJCQkJPHhzbDpvdGhlcndpc2U+Ci0JCQkJCQkJCQk8dWw+Ci0JCQkJCQkJCQkJPGxpPgotCQkJCQkJCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5vbmVUZXh0Ii8+Ci0JCQkJCQkJCQkJPC9saT4KLQkJCQkJCQkJCTwvdWw+CQkJCQkJCQkJCi0JCQkJCQkJCQk8L3hzbDpvdGhlcndpc2U+CQkJCQkJCQkJCi0JCQkJCQkJCTwveHNsOmNob29zZT4KLQkJCQkJCQk8L3RkPgkJCQkJCi0JCQkJCQk8L3RyPgotCQkJCQk8L3hzbDppZj4KLQkJCQkJPHhzbDppZiB0ZXN0PSJjb3VudCgkb3V0cHV0cykgPiAwIj4KLQkJCQkJCTx0ciB2YWxpZ249InRvcCI+Ci0JCQkJCQkJPHRoIGNsYXNzPSJzZWN0aW9uVGFibGVIZWFkaW5nIiBzY29wZT0icm93Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG91dHB1dHNUZXh0Ii8+PC90aD4KLQkJCQkJCQk8dGQgY2xhc3M9InNlY3Rpb25UYWJsZUNlbGwiIGNvbHNwYW49IjMiPgotCQkJCQkJCQk8dWw+Ci0JCQkJCQkJCTx4c2w6Zm9yLWVhY2ggc2VsZWN0PSIkb3V0cHV0cyI+Ci0JCQkJCQkJCTx4c2w6c29ydCBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPgotCQkJCQkJCQkJPGxpPgotCQkJCQkJCQkJCTxhPgotCQkJCQkJCQkJCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJocmVmIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iL0VsZW1lbnQvQEJhY2tQYXRoIi8+Ci0JCQkJCQkJCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQFVybCIvPjwveHNsOmF0dHJpYnV0ZT48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQERpc3BsYXlOYW1lIi8+Ci0JCQkJCQkJCQkJPC9hPgotCQkJCQkJCQkJPC9saT4KLQkJCQkJCQkJPC94c2w6Zm9yLWVhY2g+Ci0JCQkJCQkJCTwvdWw+Ci0JCQkJCQkJPC90ZD4KLQkJCQkJCTwvdHI+Ci0JCQkJCTwveHNsOmlmPgotCQkJCTwvdGFibGU+Ci0JCQk8L2Rpdj4KLQkJPC94c2w6aWY+Ci0JPC94c2w6dGVtcGxhdGU+Ci0KLQk8eHNsOnRlbXBsYXRlIG5hbWU9InN0ZXBzU2VjdGlvbiI+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0ic2VjdGlvbnMiIHNlbGVjdD0icmVmZXJlbmNlTGlzdFtAbmFtZT0nc2VsZWN0ZWRTdGVwcyddL0VsZW1lbnRbQFR5cGU9J1NlY3Rpb24nXSIvPgotCQk8eHNsOmlmIHRlc3Q9ImNvdW50KCRzZWN0aW9ucykgPiAwIj4KLQkJCTxkaXYgY2xhc3M9InNlY3Rpb25IZWFkaW5nIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHN0ZXBzVGV4dCIvPjwvZGl2PgotCQkJPGRpdiBjbGFzcz0ic2VjdGlvbkNvbnRlbnQiPgotCQkJCTx0YWJsZSBjbGFzcz0ic2VjdGlvblRhYmxlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+Ci0JCQkJCTx0cj4KLQkJCQkJCTx0ZCBjbGFzcz0ic2VjdGlvblRhYmxlQ2VsbCI+Ci0JCQkJCQkJPHhzbDpmb3ItZWFjaCBzZWxlY3Q9IiRzZWN0aW9ucyI+Ci0JCQkJCQkJCTxkaXYgY2xhc3M9InN0ZXBIZWFkaW5nIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iYXR0cmlidXRlW0BuYW1lPSduYW1lJ10iLz48L2Rpdj4KLQkJCQkJCQkJPGRpdiBjbGFzcz0ic3RlcENvbnRlbnQiPgotCQkJCQkJCQkJPHRhYmxlIGNsYXNzPSJzdGVwVGFibGUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4KLQkJCQkJCQkJCQk8dHIgdmFsaWduPSJ0b3AiPgotCQkJCQkJCQkJCQk8dGQ+Ci0JCQkJCQkJCQkJCQk8eHNsOnZhbHVlLW9mIGRpc2FibGUtb3V0cHV0LWVzY2FwaW5nPSJ5ZXMiIHNlbGVjdD0iYXR0cmlidXRlW0BuYW1lPSdzZWN0aW9uRGVzY3JpcHRpb24nXSIvPgotCQkJCQkJCQkJCQk8L3RkPgotCQkJCQkJCQkJCTwvdHI+Ci0JCQkJCQkJCQk8L3RhYmxlPgotCQkJCQkJCQk8L2Rpdj4JCQkJCQkKLQkJCQkJCQk8L3hzbDpmb3ItZWFjaD4KLQkJCQkJCTwvdGQ+Ci0JCQkJCTwvdHI+Ci0JCQkJPC90YWJsZT4KLQkJCTwvZGl2PgotCQk8L3hzbDppZj4KLQk8L3hzbDp0ZW1wbGF0ZT4KLQotCTx4c2w6dGVtcGxhdGUgbmFtZT0ibW9yZUluZm9TZWN0aW9uIj4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJjaGVja2xpc3RzIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3QvRWxlbWVudFtAVHlwZT0nQ2hlY2tsaXN0J10iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJjb25jZXB0cyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0L0VsZW1lbnRbQFR5cGU9J0NvbmNlcHQnXSIvPgkKLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJndWlkZWxpbmVzIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3QvRWxlbWVudFtAVHlwZT0nR3VpZGVsaW5lJ10iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJzdXBwb3J0aW5nTWF0ZXJpYWxzIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3QvRWxlbWVudFtAVHlwZT0nU3VwcG9ydGluZ01hdGVyaWFsJ10iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJ0b29sTWVudG9ycyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0L0VsZW1lbnRbQFR5cGU9J1Rvb2xNZW50b3InXSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9IndoaXRlUGFwZXJzIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3QvRWxlbWVudFtAVHlwZT0nV2hpdGVwYXBlciddIi8+CQkKLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJpbWFnZVBhdGgiIHNlbGVjdD0iY29uY2F0KC9FbGVtZW50L0BCYWNrUGF0aCwgJ2ltYWdlcy8nKSIvPgotCi0JCTx4c2w6aWYgdGVzdD0iY291bnQoJGNoZWNrbGlzdHMpICsgY291bnQoJGNvbmNlcHRzKSArIGNvdW50KCRndWlkZWxpbmVzKSArIGNvdW50KCRzdXBwb3J0aW5nTWF0ZXJpYWxzKSArIGNvdW50KCR0b29sTWVudG9ycykgKyBjb3VudCgkd2hpdGVQYXBlcnMpID4gMCI+Ci0JCQk8ZGl2IGNsYXNzPSJzZWN0aW9uSGVhZGluZyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRtb3JlSW5mb1RleHQiLz48L2Rpdj4KLQkJCTxkaXYgY2xhc3M9InNlY3Rpb25Db250ZW50Ij4KLQkJCQk8dGFibGUgY2xhc3M9InNlY3Rpb25UYWJsZSIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiPgotCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWRkQ2hlY2tsaXN0cyI+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iY2hlY2tsaXN0cyIgc2VsZWN0PSIkY2hlY2tsaXN0cyIvPgotCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWRkQ29uY2VwdHMiPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImNvbmNlcHRzIiBzZWxlY3Q9IiRjb25jZXB0cyIvPgotCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWRkR3VpZGVsaW5lcyI+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZ3VpZGVsaW5lcyIgc2VsZWN0PSIkZ3VpZGVsaW5lcyIvPgotCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWRkU3VwcG9ydGluZ01hdGVyaWFscyI+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0ic3VwcG9ydGluZ01hdGVyaWFscyIgc2VsZWN0PSIkc3VwcG9ydGluZ01hdGVyaWFscyIvPgotCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWRkVG9vbE1lbnRvcnMiPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9InRvb2xNZW50b3JzIiBzZWxlY3Q9IiR0b29sTWVudG9ycyIvPgotCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWRkV2hpdGVQYXBlcnMiPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9IndoaXRlUGFwZXJzIiBzZWxlY3Q9IiR3aGl0ZVBhcGVycyIvPgotCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCTwvdGFibGU+Ci0JCQk8L2Rpdj4KLQkJPC94c2w6aWY+Ci0JPC94c2w6dGVtcGxhdGU+Ci0KLQk8eHNsOnRlbXBsYXRlIG5hbWU9ImFsdGVybmF0aXZlc1NlY3Rpb24iPgotCQk8eHNsOnBhcmFtIG5hbWU9ImRlc2NyaXB0aW9uIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iYWx0ZXJuYXRpdmVzIiBzZWxlY3Q9IiRkZXNjcmlwdGlvbi9hdHRyaWJ1dGVbQG5hbWU9J2FsdGVybmF0aXZlcyddIi8+Ci0JCTx4c2w6aWYgdGVzdD0iJGFsdGVybmF0aXZlcyAhPSAnJyAiPgotCQkJPGRpdiBjbGFzcz0ic2VjdGlvbkhlYWRpbmciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkYWx0ZXJuYXRpdmVzVGV4dCIvPjwvZGl2PgotCQkJPGRpdiBjbGFzcz0ic2VjdGlvbkNvbnRlbnQiPgotCQkJCTx0YWJsZSBjbGFzcz0ic2VjdGlvblRhYmxlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+Ci0JCQkJCTx0ciB2YWxpZ249InRvcCI+Ci0JCQkJCQk8dGQgY2xhc3M9InNlY3Rpb25UYWJsZVNpbmdsZUNlbGwiPgotCQkJCQkJCTx4c2w6dmFsdWUtb2YgZGlzYWJsZS1vdXRwdXQtZXNjYXBpbmc9InllcyIgc2VsZWN0PSIkYWx0ZXJuYXRpdmVzIi8+Ci0JCQkJCQk8L3RkPgotCQkJCQk8L3RyPgotCQkJCTwvdGFibGU+Ci0JCQk8L2Rpdj4KLQkJPC94c2w6aWY+Ci0JPC94c2w6dGVtcGxhdGU+Ci0KLTwveHNsOnN0eWxlc2hlZXQ+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQveHNsL3RlYW1wcm9maWxlLnhzbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC94c2wvdGVhbXByb2ZpbGUueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NDc1NjZjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC94c2wvdGVhbXByb2ZpbGUueHNsCisrKyAvZGV2L251bGwKQEAgLTEsMjQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLQotPHhzbDpzdHlsZXNoZWV0IHZlcnNpb249IjEuMCIKLQl4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIKLQl4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIj4KLQotPHhzbDpvdXRwdXQgbWV0aG9kPSJodG1sIiB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgCi0JZG9jdHlwZS1wdWJsaWM9Ii0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAKLQlkb2N0eXBlLXN5c3RlbT0iaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCIgCi0JaW5kZW50PSJ5ZXMiLz4KLQkKLQk8eHNsOmluY2x1ZGUgaHJlZj0icmVzb3VyY2VzLnhzbCIvPgotCTx4c2w6aW5jbHVkZSBocmVmPSJjb21tb24ueHNsIi8+Ci0JPHhzbDppbmNsdWRlIGhyZWY9Im92ZXJ2aWV3LnhzbCIvPgotCTx4c2w6aW5jbHVkZSBocmVmPSJtYWluX2Rlc2NyaXB0aW9uLnhzbCIvPgotCTx4c2w6aW5jbHVkZSBocmVmPSJrZXlfY29uc2lkZXJhdGlvbi54c2wiLz4KLQk8eHNsOmluY2x1ZGUgaHJlZj0icHJvcGVydHkueHNsIi8+Ci0JPHhzbDppbmNsdWRlIGhyZWY9Imd1aWRhbmNlX2hlbHBlci54c2wiLz4KLQk8eHNsOmluY2x1ZGUgaHJlZj0iaWxsdXN0cmF0aW9uLnhzbCIvPgotCi0JPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iL0VsZW1lbnQiPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImVsZW1lbnRUeXBlIiBzZWxlY3Q9IkBUeXBlIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iZWxlbWVudFR5cGVOYW1lIiBzZWxlY3Q9IkBUeXBlTmFtZSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImVsZW1lbnROYW1lIiBzZWxlY3Q9IkBOYW1lIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iZWxlbWVudFByZXNlbnRhdGlvbk5hbWUiIHNlbGVjdD0iQERpc3BsYXlOYW1lIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iYmFja1BhdGgiIHNlbGVjdD0iQEJhY2tQYXRoIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iaW1hZ2VQYXRoIiBzZWxlY3Q9ImNvbmNhdCgkYmFja1BhdGgsICdpbWFnZXMvJykiLz4KLQkgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJzaGFwZUltYWdlIiBzZWxlY3Q9ImNvbmNhdCgkYmFja1BhdGgsQFNoYXBlaWNvblVybCkiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJwcmVzZW50YXRpb24iIHNlbGVjdD0icmVmZXJlbmNlW0BuYW1lPSdwcmVzZW50YXRpb24nXSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImNvbnRlbnREZXNjcmlwdGlvbiIgc2VsZWN0PSIkcHJlc2VudGF0aW9uL0VsZW1lbnRbQFR5cGU9J0JyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbiddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iYnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uIiBzZWxlY3Q9IiRwcmVzZW50YXRpb24vRWxlbWVudFtAVHlwZT0nQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uJ10iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJkZXNjcmlwdG9yRGVzY3JpcHRpb24iIHNlbGVjdD0iJHByZXNlbnRhdGlvbi9FbGVtZW50W0BUeXBlPSdEZXNjcmlwdG9yRGVzY3JpcHRpb24nXSIvPgkJCi0JCTx4c2w6dmFyaWFibGUgbmFtZT0iY29weXJpZ2h0IiBzZWxlY3Q9ImNvcHlyaWdodCIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InNob3dUcmVlQnJvd3NlciIgc2VsZWN0PSJAc2hvd1RyZWVCcm93c2VyIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0icXVlcnlTdHJpbmciIHNlbGVjdD0iQHF1ZXJ5U3RyaW5nIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0icmVsUHJvY2Vzc1BhdGgiIHNlbGVjdD0iQHJlbFByb2Nlc3NQYXRoIi8+Ci0KLQkJPGh0bWw+CQotCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0ibGFuZyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBsYW5nIi8+PC94c2w6YXR0cmlidXRlPgotCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0ieG1sOmxhbmciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbGFuZyIvPjwveHNsOmF0dHJpYnV0ZT4KLQkJCTxoZWFkPgotCQkJCTx0aXRsZT48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVsZW1lbnRUeXBlTmFtZSIvPjogPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50UHJlc2VudGF0aW9uTmFtZSIvPjwvdGl0bGU+Ci0JCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InVtYU1ldGFUYWdzIj4KLQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnRUeXBlIiBzZWxlY3Q9IiRlbGVtZW50VHlwZSIvPgotCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudE5hbWUiIHNlbGVjdD0iJGVsZW1lbnROYW1lIi8+Ci0JCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50UHJlc2VudGF0aW9uTmFtZSIgc2VsZWN0PSIkZWxlbWVudFByZXNlbnRhdGlvbk5hbWUiLz4KLQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCTxtZXRhIG5hbWU9ImVsZW1lbnRfdHlwZSIgY29udGVudD0ieyRlbGVtZW50VHlwZX0iLz4KLQkJCQk8bWV0YSBuYW1lPSJmaWxldHlwZSIgY29udGVudD0iZGVzY3JpcHRpb24iLz4KLQkJCQk8bGluayByZWw9IlN0eWxlU2hlZXQiIGhyZWY9InskYmFja1BhdGh9Y3NzL2RlZmF1bHQuY3NzIiB0eXBlPSJ0ZXh0L2NzcyIvPgotCQkJCTxzY3JpcHQgc3JjPSJ7JGJhY2tQYXRofXNjcmlwdHMvQ29udGVudFBhZ2VSZXNvdXJjZS5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PC9zY3JpcHQ+Ci0JCQkJPHNjcmlwdCBzcmM9InskYmFja1BhdGh9c2NyaXB0cy9Db250ZW50UGFnZVNlY3Rpb24uanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPjwvc2NyaXB0PgotCQkJCTxzY3JpcHQgc3JjPSJ7JGJhY2tQYXRofXNjcmlwdHMvQ29udGVudFBhZ2VTdWJTZWN0aW9uLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij48L3NjcmlwdD4KLQkJCQk8c2NyaXB0IHNyYz0ieyRiYWNrUGF0aH1zY3JpcHRzL0FjdGl2aXR5VHJlZVRhYmxlLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij48L3NjcmlwdD4KLQkJCQk8c2NyaXB0IHNyYz0ieyRiYWNrUGF0aH1zY3JpcHRzL1Byb2Nlc3NFbGVtZW50UGFnZS5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PC9zY3JpcHQ+Ci0JCQkJPHNjcmlwdCBzcmM9InskYmFja1BhdGh9c2NyaXB0cy9Db250ZW50UGFnZVRvb2xiYXIuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPjwvc2NyaXB0PgotCQkJCTxzY3JpcHQgc3JjPSJ7JGJhY2tQYXRofXNjcmlwdHMvY29udGVudFBhZ2UuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPjwvc2NyaXB0PgotCQkJCTxzY3JpcHQgc3JjPSJ7JGJhY2tQYXRofXNjcmlwdHMvcHJvY2Vzc0VsZW1lbnREYXRhLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij48L3NjcmlwdD4KLQkJCQk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPgotCQkJCQl2YXIgZGVmYXVsdFF1ZXJ5U3RyID0gJzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcXVlcnlTdHJpbmciLz4nOwotCQkJCQl2YXIgYmFja1BhdGggPSAnPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRiYWNrUGF0aCIvPic7Ci0JCQkJCXZhciBpbWdQYXRoID0gJzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkaW1hZ2VQYXRoIi8+JzsKLQkJCQkJdmFyIG5vZGVJbmZvPW51bGw7Ci0JCQkJCWNvbnRlbnRQYWdlLnByZWxvYWQoaW1nUGF0aCwgYmFja1BhdGgsIG5vZGVJbmZvLCBkZWZhdWx0UXVlcnlTdHIsIGZhbHNlLCB0cnVlLCBmYWxzZSk7Ci0JCQkJPC9zY3JpcHQ+Ci0JCQk8L2hlYWQ+Ci0JCQk8Ym9keT4KLQkJCTxkaXYgaWQ9ImJyZWFkY3J1bWJzIj48L2Rpdj4KLQkJCQk8dGFibGUgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLQkJCQkJPHRyPgotCQkJCQkJPHRkIHZhbGlnbj0idG9wIj4JCi0JCQkJCQkJPGEgbmFtZT0iVG9wIi8+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9Im92ZXJ2aWV3Ij4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnRUeXBlIiBzZWxlY3Q9IiRlbGVtZW50VHlwZSIvPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudFR5cGVOYW1lIiBzZWxlY3Q9IiRlbGVtZW50VHlwZU5hbWUiLz4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnRQcmVzZW50YXRpb25OYW1lIiBzZWxlY3Q9IiRlbGVtZW50UHJlc2VudGF0aW9uTmFtZSIvPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudEljb24iIHNlbGVjdD0iJHNoYXBlSW1hZ2UiLz4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImJhY2tQYXRoIiBzZWxlY3Q9IiRiYWNrUGF0aCIvPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0ic2hvd1RyZWVCcm93c2VyIiBzZWxlY3Q9IiRzaG93VHJlZUJyb3dzZXIiLz4KLQkJCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgkJCQkJCQkKLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icmVsYXRpb25zaGlwc1NlY3Rpb24iLz4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0ibWFpbkRlc2NyaXB0aW9uU2VjdGlvbiI+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJkZXNjcmlwdGlvbiIgc2VsZWN0PSIkYnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uIi8+Ci0JCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icHJvcGVydGllc1NlY3Rpb24iPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iY29udGVudERlc2NyaXB0aW9uIiBzZWxlY3Q9IiRjb250ZW50RGVzY3JpcHRpb24iLz4KLQkJCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJ1c2FnZVNlY3Rpb24iPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iY29udGVudERlc2NyaXB0aW9uIiBzZWxlY3Q9IiRicmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24iLz4KLQkJCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgkJCQkJCQotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJpbGx1c3RyYXRpb25zU2VjdGlvbiIvPgkKLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0ia2V5Q29uc2lkZXJhdGlvbnNTZWN0aW9uIj4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImRlc2NyaXB0aW9uIiBzZWxlY3Q9IiRicmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24iLz4KLQkJCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgkJCQkJCQkKLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0ibW9yZUluZm9TZWN0aW9uIi8+CQkKLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iY29weXJpZ2h0Ij4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImNvcHlyaWdodCIgc2VsZWN0PSIkY29weXJpZ2h0Ii8+Ci0JCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCTwvdGQ+CQkJCQkJCi0JCQkJCTwvdHI+Ci0JCQkJPC90YWJsZT4KLQkJCTwvYm9keT4KLQkJCTxzY3JpcHQgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0JCQkJY29udGVudFBhZ2Uub25sb2FkKCk7Ci0JCQk8L3NjcmlwdD4KLQkJPC9odG1sPgotCTwveHNsOnRlbXBsYXRlPgotCi0JPHhzbDp0ZW1wbGF0ZSBuYW1lPSJwcm9wZXJ0aWVzU2VjdGlvbiI+Ci0JCTx4c2w6cGFyYW0gbmFtZT0iY29udGVudERlc2NyaXB0aW9uIi8+Ci0JCTxkaXYgY2xhc3M9InNlY3Rpb25IZWFkaW5nIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb3BlcnRpZXNUZXh0Ii8+PC9kaXY+Ci0JCTxkaXYgY2xhc3M9InNlY3Rpb25Db250ZW50Ij4KLQkJCTx0YWJsZSBjbGFzcz0ic2VjdGlvblRhYmxlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+Ci0JCQkgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InByb3BlcnR5Ij4KLQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImZpZWxkTGFiZWwiIHNlbGVjdD0iJG11bHRpcGxlT2NjdXJyZW5jZXNUZXh0Ii8+Ci0JCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJmaWVsZFRleHQiIHNlbGVjdD0iYXR0cmlidXRlW0BuYW1lPSdoYXNNdWx0aXBsZU9jY3VycmVuY2VzJ10iLz4KLQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCTx4c2w6aWYgdGVzdD0iYXR0cmlidXRlW0BuYW1lPSdpc09wdGlvbmFsJ10iPgotCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icHJvcGVydHkiPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImZpZWxkTGFiZWwiIHNlbGVjdD0iJG9wdGlvbmFsVGV4dCIvPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImZpZWxkVGV4dCIgc2VsZWN0PSJhdHRyaWJ1dGVbQG5hbWU9J2lzT3B0aW9uYWwnXSIvPgotCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCTwveHNsOmlmPgotCQkJCTx4c2w6aWYgdGVzdD0iYXR0cmlidXRlW0BuYW1lPSdpc1BsYW5uZWQnXSI+Ci0JCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJwcm9wZXJ0eSI+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZmllbGRMYWJlbCIgc2VsZWN0PSIkcGxhbm5lZFRleHQiLz4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJmaWVsZFRleHQiIHNlbGVjdD0iYXR0cmlidXRlW0BuYW1lPSdpc1BsYW5uZWQnXSIvPgotCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCTwveHNsOmlmPgotCQkJPC90YWJsZT4KLQkJPC9kaXY+Ci0JPC94c2w6dGVtcGxhdGU+Ci0KLQk8eHNsOnRlbXBsYXRlIG5hbWU9InJlbGF0aW9uc2hpcHNTZWN0aW9uIj4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJzdWJUZWFtcyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0W0BuYW1lPSdzdWJUZWFtJ10vRWxlbWVudCIvPgkJCi0JCTx4c2w6dmFyaWFibGUgbmFtZT0idGVhbVJvbGVzIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3RbQG5hbWU9J3RlYW1Sb2xlcyddL0VsZW1lbnQiLz4KLQkJCQotCQk8eHNsOmlmIHRlc3Q9ImNvdW50KCRzdWJUZWFtcykgKyBjb3VudCgkdGVhbVJvbGVzKSA+IDAiPgotCQkJPGRpdiBjbGFzcz0ic2VjdGlvbkhlYWRpbmciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcmVsYXRpb25zaGlwc1RleHQiLz48L2Rpdj4KLQkJCTxkaXYgY2xhc3M9InNlY3Rpb25Db250ZW50Ij4KLQkJCQk8dGFibGUgY2xhc3M9InNlY3Rpb25UYWJsZSIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiPgotCQkJCQk8eHNsOmlmIHRlc3Q9ImNvdW50KCRzdWJUZWFtcykgPiAwIj4KLQkJCQkJCTx0ciB2YWxpZ249InRvcCI+Ci0JCQkJCQkJPHRoIGNsYXNzPSJzZWN0aW9uVGFibGVIZWFkaW5nIiBzY29wZT0icm93Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHN1YlRlYW1zVGV4dCIvPjwvdGg+Ci0JCQkJCQkJPHRkIGNsYXNzPSJzZWN0aW9uVGFibGVDZWxsIiBjb2xzcGFuPSIzIj4KLQkJCQkJCQk8dWw+Ci0JCQkJCQkJCTx4c2w6Zm9yLWVhY2ggc2VsZWN0PSIkc3ViVGVhbXMiPgotCQkJCQkJCQkJPHhzbDpzb3J0IGRhdGEtdHlwZT0idGV4dCIgc2VsZWN0PSJARGlzcGxheU5hbWUiIG9yZGVyPSJhc2NlbmRpbmciIC8+Ci0JCQkJCQkJCQk8bGk+Ci0JCQkJCQkJCQkJPGE+Ci0JCQkJCQkJCQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9ImhyZWYiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIvRWxlbWVudC9AQmFja1BhdGgiLz48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQFVybCIvPjwveHNsOmF0dHJpYnV0ZT4KLQkJCQkJCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPgotCQkJCQkJCQkJCTwvYT4KLQkJCQkJCQkJCTwvbGk+Ci0JCQkJCQkJCTwveHNsOmZvci1lYWNoPgotCQkJCQkJCTwvdWw+Ci0JCQkJCQkJPC90ZD4KLQkJCQkJCTwvdHI+Ci0JCQkJCTwveHNsOmlmPgotCQkJCQk8eHNsOmlmIHRlc3Q9ImNvdW50KCR0ZWFtUm9sZXMpID4gMCI+Ci0JCQkJCQk8dHIgdmFsaWduPSJ0b3AiPgotCQkJCQkJCTx0aCBjbGFzcz0ic2VjdGlvblRhYmxlSGVhZGluZyIgc2NvcGU9InJvdyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR0ZWFtUm9sZXNUZXh0Ii8+PC90aD4KLQkJCQkJCQk8dGQgY2xhc3M9InNlY3Rpb25UYWJsZUNlbGwiIGNvbHNwYW49IjMiPgotCQkJCQkJCTx1bD4KLQkJCQkJCQkJPHhzbDpmb3ItZWFjaCBzZWxlY3Q9IiR0ZWFtUm9sZXMiPgotCQkJCQkJCQk8eHNsOnNvcnQgc2VsZWN0PSJARGlzcGxheU5hbWUiLz4KLQkJCQkJCQkJCTxsaT4KLQkJCQkJCQkJCQk8YT4KLQkJCQkJCQkJCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0iaHJlZiI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii9FbGVtZW50L0BCYWNrUGF0aCIvPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAVXJsIi8+PC94c2w6YXR0cmlidXRlPgotCQkJCQkJCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQERpc3BsYXlOYW1lIi8+Ci0JCQkJCQkJCQkJPC9hPgotCQkJCQkJCQkJPC9saT4KLQkJCQkJCQkJPC94c2w6Zm9yLWVhY2g+Ci0JCQkJCQkJPC91bD4KLQkJCQkJCQk8L3RkPgotCQkJCQkJPC90cj4KLQkJCQkJPC94c2w6aWY+Ci0JCQkJPC90YWJsZT4KLQkJCTwvZGl2PgotCQk8L3hzbDppZj4KLQk8L3hzbDp0ZW1wbGF0ZT4KLQotCTx4c2w6dGVtcGxhdGUgbmFtZT0idXNhZ2VTZWN0aW9uIj4KLQkJPHhzbDpwYXJhbSBuYW1lPSJjb250ZW50RGVzY3JpcHRpb24iLz4KLQkJPHhzbDppZiB0ZXN0PSIkY29udGVudERlc2NyaXB0aW9uL2F0dHJpYnV0ZVtAbmFtZT0ndXNhZ2VHdWlkYW5jZSddICE9ICcnIj4KLQkJCTxkaXYgY2xhc3M9InNlY3Rpb25IZWFkaW5nIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHVzYWdlVGV4dCIvPjwvZGl2PgotCQkJPGRpdiBjbGFzcz0ic2VjdGlvbkNvbnRlbnQiPgotCQkJCTx0YWJsZSBjbGFzcz0ic2VjdGlvblRhYmxlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+Ci0JCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJwcm9wZXJ0eSI+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZmllbGRMYWJlbCIgc2VsZWN0PSInVXNhZ2UgR3VpZGFuY2UnIi8+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZmllbGRUZXh0IiBzZWxlY3Q9IiRjb250ZW50RGVzY3JpcHRpb24vYXR0cmlidXRlW0BuYW1lPSd1c2FnZUd1aWRhbmNlJ10iLz4KLQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQk8L3RhYmxlPgotCQkJPC9kaXY+Ci0JCTwveHNsOmlmPgotCTwveHNsOnRlbXBsYXRlPgotCQotCTx4c2w6dGVtcGxhdGUgbmFtZT0ibW9yZUluZm9TZWN0aW9uIj4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJjaGVja2xpc3RzIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3QvRWxlbWVudFtAVHlwZT0nQ2hlY2tsaXN0J10iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJjb25jZXB0cyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0L0VsZW1lbnRbQFR5cGU9J0NvbmNlcHQnXSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9Imd1aWRlbGluZXMiIHNlbGVjdD0icmVmZXJlbmNlTGlzdC9FbGVtZW50W0BUeXBlPSdHdWlkZWxpbmUnXSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InN1cHBvcnRpbmdNYXRlcmlhbHMiIHNlbGVjdD0icmVmZXJlbmNlTGlzdC9FbGVtZW50W0BUeXBlPSdTdXBwb3J0aW5nTWF0ZXJpYWwnXSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9IndoaXRlUGFwZXJzIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3QvRWxlbWVudFtAVHlwZT0nV2hpdGVwYXBlciddIi8+Ci0JCTx4c2w6aWYgdGVzdD0iY291bnQoJGNoZWNrbGlzdHMpICsgY291bnQoJGNvbmNlcHRzKSArIGNvdW50KCRndWlkZWxpbmVzKSArIGNvdW50KCRzdXBwb3J0aW5nTWF0ZXJpYWxzKSArIGNvdW50KCR3aGl0ZVBhcGVycykgPiAwIj4KLQkJCTxkaXYgY2xhc3M9InNlY3Rpb25IZWFkaW5nIj4KLQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG1vcmVJbmZvVGV4dCIvPgotCQkJPC9kaXY+Ci0JCQk8ZGl2IGNsYXNzPSJzZWN0aW9uQ29udGVudCI+Ci0JCQkJPHRhYmxlIGNsYXNzPSJzZWN0aW9uVGFibGUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4KLQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFkZENoZWNrbGlzdHMiPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImNoZWNrbGlzdHMiIHNlbGVjdD0iJGNoZWNrbGlzdHMiLz4KLQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFkZENvbmNlcHRzIj4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJjb25jZXB0cyIgc2VsZWN0PSIkY29uY2VwdHMiLz4KLQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFkZEd1aWRlbGluZXMiPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9Imd1aWRlbGluZXMiIHNlbGVjdD0iJGd1aWRlbGluZXMiLz4KLQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFkZFN1cHBvcnRpbmdNYXRlcmlhbHMiPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9InN1cHBvcnRpbmdNYXRlcmlhbHMiIHNlbGVjdD0iJHN1cHBvcnRpbmdNYXRlcmlhbHMiLz4KLQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFkZFdoaXRlUGFwZXJzIj4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJ3aGl0ZVBhcGVycyIgc2VsZWN0PSIkd2hpdGVQYXBlcnMiLz4KLQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQk8L3RhYmxlPgotCQkJPC9kaXY+Ci0JCTwveHNsOmlmPgotCTwveHNsOnRlbXBsYXRlPgotCi0KLTwveHNsOnN0eWxlc2hlZXQ+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQveHNsL3dvcmtwcm9kdWN0LnhzbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC94c2wvd29ya3Byb2R1Y3QueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOGEwNTJlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC94c2wvd29ya3Byb2R1Y3QueHNsCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotCi08eHNsOnN0eWxlc2hlZXQgdmVyc2lvbj0iMS4wIgotCXhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIgotCXhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiPgotCi0JPHhzbDppbmNsdWRlIGhyZWY9InJlc291cmNlcy54c2wiLz4KLQk8eHNsOmluY2x1ZGUgaHJlZj0iY29tbW9uLnhzbCIvPgotCTx4c2w6aW5jbHVkZSBocmVmPSJvdmVydmlldy54c2wiLz4KLQk8eHNsOmluY2x1ZGUgaHJlZj0icHVycG9zZS54c2wiLz4KLQk8eHNsOmluY2x1ZGUgaHJlZj0ia2V5X2NvbnNpZGVyYXRpb24ueHNsIi8+Ci0JPHhzbDppbmNsdWRlIGhyZWY9InRhaWxvcmluZy54c2wiLz4KLQk8eHNsOmluY2x1ZGUgaHJlZj0id29ya3Byb2R1Y3RfaGVscGVyLnhzbCIvPgotCi08L3hzbDpzdHlsZXNoZWV0PgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L3hzbC93b3JrcHJvZHVjdF9oZWxwZXIueHNsIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L3hzbC93b3JrcHJvZHVjdF9oZWxwZXIueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Zjg4ZDIzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC94c2wvd29ya3Byb2R1Y3RfaGVscGVyLnhzbAorKysgL2Rldi9udWxsCkBAIC0xLDMyNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci0KLTx4c2w6c3R5bGVzaGVldCB2ZXJzaW9uPSIxLjAiCi0JeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iCi0JeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSI+Ci0KLQk8eHNsOmluY2x1ZGUgaHJlZj0iZ3VpZGFuY2VfaGVscGVyLnhzbCIvPgotCTx4c2w6aW5jbHVkZSBocmVmPSJkZXNjcmlwdG9yX2hlbHBlci54c2wiLz4KLQotCTx4c2w6dGVtcGxhdGUgbmFtZT0id29ya1Byb2R1Y3RJbGx1c3RyYXRpb25zU2VjdGlvbiI+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0idGVtcGxhdGVzIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3QvRWxlbWVudFtAVHlwZT0nVGVtcGxhdGUnXSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InJlcG9ydHMiIHNlbGVjdD0icmVmZXJlbmNlTGlzdC9FbGVtZW50W0BUeXBlPSdSZXBvcnQnXSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImV4YW1wbGVzIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3QvRWxlbWVudFtAVHlwZT0nRXhhbXBsZSddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0icmV1c2FibGVBc3NldHMiIHNlbGVjdD0icmVmZXJlbmNlTGlzdC9FbGVtZW50W0BUeXBlPSdSZXVzYWJsZUFzc2V0J10iLz4JCi0JCTx4c2w6aWYgdGVzdD0iY291bnQoJHRlbXBsYXRlcykgKyBjb3VudCgkcmVwb3J0cykgKyBjb3VudCgkZXhhbXBsZXMpICsgY291bnQoJHJldXNhYmxlQXNzZXRzKSA+IDAiPgotCQkJPGRpdiBjbGFzcz0ic2VjdGlvbkhlYWRpbmciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkaWxsdXN0cmF0aW9uc1RleHQiLz48L2Rpdj4KLQkJCTxkaXYgY2xhc3M9InNlY3Rpb25Db250ZW50Ij4KLQkJCQk8dGFibGUgY2xhc3M9InNlY3Rpb25UYWJsZSIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiPgotCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWRkVGVtcGxhdGVzIj4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJ0ZW1wbGF0ZXMiIHNlbGVjdD0iJHRlbXBsYXRlcyIvPgotCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWRkUmVwb3J0cyI+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0icmVwb3J0cyIgc2VsZWN0PSIkcmVwb3J0cyIvPgotCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWRkRXhhbXBsZXMiPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImV4YW1wbGVzIiBzZWxlY3Q9IiRleGFtcGxlcyIvPgotCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWRkUmV1c2FibGVBc3NldHMiPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9InJldXNhYmxlQXNzZXRzIiBzZWxlY3Q9IiRyZXVzYWJsZUFzc2V0cyIvPgotCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCTwvdGFibGU+Ci0JCQk8L2Rpdj4KLQkJPC94c2w6aWY+Ci0JPC94c2w6dGVtcGxhdGU+Ci0KLQk8eHNsOnRlbXBsYXRlIG5hbWU9InJlbGF0aW9uc2hpcHNTZWN0aW9uIj4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJmdWxmaWxsaW5nV29ya1Byb2R1Y3RzIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3RbQG5hbWU9J0Z1bEZpbGxzX0Z1bGxGaWxsYWJsZUVsZW1lbnRzJ10vRWxlbWVudCI+PC94c2w6dmFyaWFibGU+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iZnVsZmlsbGVkU2xvdHMiIHNlbGVjdD0icmVmZXJlbmNlTGlzdFtAbmFtZT0nZnVsZmlsbHMnXS9FbGVtZW50Ij48L3hzbDp2YXJpYWJsZT4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJjb250YWluZXJBcnRpZmFjdCIgc2VsZWN0PSJyZWZlcmVuY2VbQG5hbWU9J2NvbnRhaW5lckFydGlmYWN0J10vRWxlbWVudCIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImNvbnRhaW5lZEFydGlmYWN0cyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0W0BuYW1lPSdjb250YWluZWRBcnRpZmFjdHMnXS9FbGVtZW50W0BUeXBlPSdBcnRpZmFjdCddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0icmVzcG9uc2libGVSb2xlcyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0W0BuYW1lPSdyZXNwb25zaWJsZVJvbGVzJ10vRWxlbWVudFtAVHlwZT0nUm9sZSddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0ibW9kaWZ5Um9sZXMiIHNlbGVjdD0icmVmZXJlbmNlTGlzdFtAbmFtZT0nbW9kaWZ5Um9sZXMnXS9FbGVtZW50Ii8+CQkKLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJtYW5kYXRvcnlJbnB1dFRvVGFza3MiIHNlbGVjdD0icmVmZXJlbmNlTGlzdFtAbmFtZT0nbWFuZGF0b3J5SW5wdXRUb1Rhc2tzJ10vRWxlbWVudFtAVHlwZT0nVGFzayddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0ib3B0aW9uYWxJbnB1dFRvVGFza3MiIHNlbGVjdD0icmVmZXJlbmNlTGlzdFtAbmFtZT0nb3B0aW9uYWxJbnB1dFRvVGFza3MnXS9FbGVtZW50W0BUeXBlPSdUYXNrJ10iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJvdXRwdXRGcm9tVGFza3MiIHNlbGVjdD0icmVmZXJlbmNlTGlzdFtAbmFtZT0nb3V0cHV0RnJvbVRhc2tzJ10vRWxlbWVudFtAVHlwZT0nVGFzayddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0ibWFuZGF0b3J5SW5wdXRUb1Rhc2tzX2Zyb21TbG90cyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0W0BuYW1lPSdtYW5kYXRvcnlJbnB1dFRvVGFza3NfZnJvbVNsb3RzJ10vRWxlbWVudFtAVHlwZT0nVGFzayddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0ib3B0aW9uYWxJbnB1dFRvVGFza3NfZnJvbVNsb3RzIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3RbQG5hbWU9J29wdGlvbmFsSW5wdXRUb1Rhc2tzX2Zyb21TbG90cyddL0VsZW1lbnRbQFR5cGU9J1Rhc2snXSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9Im91dHB1dEZyb21UYXNrc19mcm9tU2xvdHMiIHNlbGVjdD0icmVmZXJlbmNlTGlzdFtAbmFtZT0nb3V0cHV0RnJvbVRhc2tzX2Zyb21TbG90cyddL0VsZW1lbnRbQFR5cGU9J1Rhc2snXSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImNhdGVnb3JpZXMiIHNlbGVjdD0icmVmZXJlbmNlTGlzdFtAbmFtZT0nQ29udGVudEVsZW1lbnRfQ3VzdG9tQ2F0ZWdvcmllcyddL0VsZW1lbnQiLz4KLQkJCi0JCTx4c2w6aWYgdGVzdD0iY291bnQoJGZ1bGZpbGxpbmdXb3JrUHJvZHVjdHMpICsgY291bnQoJGZ1bGZpbGxlZFNsb3RzKSArIGNvdW50KCRjYXRlZ29yaWVzKSArIGNvdW50KCRyZXNwb25zaWJsZVJvbGVzKSArIGNvdW50KCRjb250YWluZXJBcnRpZmFjdCkgKyBjb3VudCgkY29udGFpbmVkQXJ0aWZhY3RzKSArIGNvdW50KCRtYW5kYXRvcnlJbnB1dFRvVGFza3MpICsgY291bnQoJG9wdGlvbmFsSW5wdXRUb1Rhc2tzKSArIGNvdW50KCRvdXRwdXRGcm9tVGFza3MpICsgY291bnQoJG1hbmRhdG9yeUlucHV0VG9UYXNrc19mcm9tU2xvdHMpICsgY291bnQoJG9wdGlvbmFsSW5wdXRUb1Rhc2tzX2Zyb21TbG90cykgKyBjb3VudCgkb3V0cHV0RnJvbVRhc2tzX2Zyb21TbG90cykgPiAwIj4KLQkJCTxkaXYgY2xhc3M9InNlY3Rpb25IZWFkaW5nIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHJlbGF0aW9uc2hpcHNUZXh0Ii8+PC9kaXY+Ci0JCQk8ZGl2IGNsYXNzPSJzZWN0aW9uQ29udGVudCI+Ci0JCQkJPHRhYmxlIGNsYXNzPSJzZWN0aW9uVGFibGUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4KLQotCQkJCQk8eHNsOmlmIHRlc3Q9ImNvdW50KCRmdWxmaWxsaW5nV29ya1Byb2R1Y3RzKSA+IDAiPgotCQkJCQkJPHRyIHZhbGlnbj0idG9wIj4KLQkJCQkJCQk8dGggY2xhc3M9InNlY3Rpb25UYWJsZUhlYWRpbmciIHNjb3BlPSJyb3ciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZnVsZmlsbGluZ1dvcmtQcm9kdWN0c1RleHQiLz48L3RoPgotCQkJCQkJCTx0ZCBjbGFzcz0ic2VjdGlvblRhYmxlQ2VsbCIgY29sc3Bhbj0iMiI+Ci0JCQkJCQkJPHVsPgotCQkJCQkJCQk8eHNsOmZvci1lYWNoIHNlbGVjdD0iJGZ1bGZpbGxpbmdXb3JrUHJvZHVjdHMiPgotCQkJCQkJCQk8eHNsOnNvcnQgc2VsZWN0PSJARGlzcGxheU5hbWUiLz4KLQkJCQkJCQkJCTxsaT4KLQkJCQkJCQkJCQk8YT4KLQkJCQkJCQkJCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0iaHJlZiI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii9FbGVtZW50L0BCYWNrUGF0aCIvPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAVXJsIi8+PC94c2w6YXR0cmlidXRlPgotCQkJCQkJCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQERpc3BsYXlOYW1lIi8+Ci0JCQkJCQkJCQkJPC9hPgotCQkJCQkJCQkJPC9saT4KLQkJCQkJCQkJPC94c2w6Zm9yLWVhY2g+Ci0JCQkJCQkJPC91bD4KLQkJCQkJCQk8L3RkPgotCQkJCQkJPC90cj4KLQkJCQkJPC94c2w6aWY+CQkKLQkJCQkJCi0JCQkJCTx4c2w6aWYgdGVzdD0iY291bnQoJGZ1bGZpbGxlZFNsb3RzKSA+IDAiPgotCQkJCQkJPHRyIHZhbGlnbj0idG9wIj4KLQkJCQkJCQk8dGggY2xhc3M9InNlY3Rpb25UYWJsZUhlYWRpbmciIHNjb3BlPSJyb3ciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZnVsZmlsbGVkU2xvdHNUZXh0Ii8+PC90aD4KLQkJCQkJCQk8dGQgY2xhc3M9InNlY3Rpb25UYWJsZUNlbGwiIGNvbHNwYW49IjIiPgotCQkJCQkJCTx1bD4KLQkJCQkJCQkJPHhzbDpmb3ItZWFjaCBzZWxlY3Q9IiRmdWxmaWxsZWRTbG90cyI+Ci0JCQkJCQkJCTx4c2w6c29ydCBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPgotCQkJCQkJCQkJPGxpPgotCQkJCQkJCQkJCTxhPgotCQkJCQkJCQkJCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJocmVmIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iL0VsZW1lbnQvQEJhY2tQYXRoIi8+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBVcmwiLz48L3hzbDphdHRyaWJ1dGU+Ci0JCQkJCQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJARGlzcGxheU5hbWUiLz4KLQkJCQkJCQkJCQk8L2E+Ci0JCQkJCQkJCQk8L2xpPgotCQkJCQkJCQk8L3hzbDpmb3ItZWFjaD4KLQkJCQkJCQk8L3VsPgotCQkJCQkJCTwvdGQ+Ci0JCQkJCQk8L3RyPgotCQkJCQk8L3hzbDppZj4JCQotCQkJCQkKLQkJCQkJPHhzbDppZiB0ZXN0PSJjb3VudCgkY2F0ZWdvcmllcykgPiAwIj4KLQkJCQkJCTx0ciB2YWxpZ249InRvcCI+Ci0JCQkJCQkJPHRoIGNsYXNzPSJzZWN0aW9uVGFibGVIZWFkaW5nIiBzY29wZT0icm93Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGNhdGVnb3JpZXNUZXh0Ii8+PC90aD4KLQkJCQkJCQk8dGQgY2xhc3M9InNlY3Rpb25UYWJsZUNlbGwiIGNvbHNwYW49IjIiPgotCQkJCQkJCTx1bD4KLQkJCQkJCQkJPHhzbDpmb3ItZWFjaCBzZWxlY3Q9IiRjYXRlZ29yaWVzIj4KLQkJCQkJCQkJPHhzbDpzb3J0IHNlbGVjdD0iQERpc3BsYXlOYW1lIi8+Ci0JCQkJCQkJCQk8bGk+Ci0JCQkJCQkJCQkJPGE+Ci0JCQkJCQkJCQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9ImhyZWYiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIvRWxlbWVudC9AQmFja1BhdGgiLz48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQFVybCIvPjwveHNsOmF0dHJpYnV0ZT4KLQkJCQkJCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPgotCQkJCQkJCQkJCTwvYT4KLQkJCQkJCQkJCTwvbGk+Ci0JCQkJCQkJCTwveHNsOmZvci1lYWNoPgotCQkJCQkJCTwvdWw+Ci0JCQkJCQkJPC90ZD4KLQkJCQkJCTwvdHI+Ci0JCQkJCTwveHNsOmlmPgkJCQkKLQkJCQkJCi0JCQkJCTx4c2w6aWYgdGVzdD0iY291bnQoJGNvbnRhaW5lckFydGlmYWN0KSA+IDAiPgotCQkJCQkJPHRyIHZhbGlnbj0idG9wIj4KLQkJCQkJCQk8dGggY2xhc3M9InNlY3Rpb25UYWJsZUhlYWRpbmciIHNjb3BlPSJyb3ciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkY29udGFpbmVyQXJ0aWZhY3RUZXh0Ii8+PC90aD4KLQkJCQkJCQk8dGQgY2xhc3M9InNlY3Rpb25UYWJsZUNlbGwiIGNvbHNwYW49IjIiPgotCQkJCQkJCTx1bD4KLQkJCQkJCQkJPHhzbDpmb3ItZWFjaCBzZWxlY3Q9IiRjb250YWluZXJBcnRpZmFjdCI+Ci0JCQkJCQkJCTx4c2w6c29ydCBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPgotCQkJCQkJCQkJPGxpPgotCQkJCQkJCQkJCTxhPgotCQkJCQkJCQkJCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJocmVmIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iL0VsZW1lbnQvQEJhY2tQYXRoIi8+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBVcmwiLz48L3hzbDphdHRyaWJ1dGU+Ci0JCQkJCQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJARGlzcGxheU5hbWUiLz4KLQkJCQkJCQkJCQk8L2E+Ci0JCQkJCQkJCQk8L2xpPgotCQkJCQkJCQk8L3hzbDpmb3ItZWFjaD4KLQkJCQkJCQk8L3VsPgotCQkJCQkJCTwvdGQ+Ci0JCQkJCQk8L3RyPgotCQkJCQk8L3hzbDppZj4JCQkJCi0JCQkJCTx4c2w6aWYgdGVzdD0iY291bnQoJGNvbnRhaW5lZEFydGlmYWN0cykgPiAwIj4KLQkJCQkJCTx0ciB2YWxpZ249InRvcCI+Ci0JCQkJCQkJPHRoIGNsYXNzPSJzZWN0aW9uVGFibGVIZWFkaW5nIiBzY29wZT0icm93Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGNvbnRhaW5lZEFydGlmYWN0c1RleHQiLz48L3RoPgotCQkJCQkJCTx0ZCBjbGFzcz0ic2VjdGlvblRhYmxlQ2VsbCIgY29sc3Bhbj0iMiI+Ci0JCQkJCQkJPHVsPgotCQkJCQkJCQk8eHNsOmZvci1lYWNoIHNlbGVjdD0iJGNvbnRhaW5lZEFydGlmYWN0cyI+Ci0JCQkJCQkJCQk8eHNsOnNvcnQgZGF0YS10eXBlPSJ0ZXh0IiBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIgb3JkZXI9ImFzY2VuZGluZyIgLz4KLQkJCQkJCQkJCTxsaT4KLQkJCQkJCQkJCQk8YT4KLQkJCQkJCQkJCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0iaHJlZiI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii9FbGVtZW50L0BCYWNrUGF0aCIvPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAVXJsIi8+PC94c2w6YXR0cmlidXRlPgkJCQkJCQkJCQkJCi0JCQkJCQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJARGlzcGxheU5hbWUiLz4KLQkJCQkJCQkJCQk8L2E+Ci0JCQkJCQkJCQk8L2xpPgotCQkJCQkJCQk8L3hzbDpmb3ItZWFjaD4KLQkJCQkJCQk8L3VsPgotCQkJCQkJCTwvdGQ+Ci0JCQkJCQk8L3RyPgotCQkJCQk8L3hzbDppZj4KLQkJCQkJPHhzbDppZiB0ZXN0PSJjb3VudCgkcmVzcG9uc2libGVSb2xlcykgKyBjb3VudCgkbW9kaWZ5Um9sZXMpID4gMCI+Ci0JCQkJCQk8dHIgdmFsaWduPSJ0b3AiPgotCQkJCQkJCTx0aCBjbGFzcz0ic2VjdGlvblRhYmxlSGVhZGluZyIgc2NvcGU9InJvdyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRyb2xlc1RleHQiLz48L3RoPgotCQkJCQkJCTx0ZCBjbGFzcz0ic2VjdGlvblRhYmxlQ2VsbCIgd2lkdGg9IjQyJSI+Ci0JCQkJCQkJCTxzcGFuIGNsYXNzPSJzZWN0aW9uVGFibGVDZWxsSGVhZGluZyI+Ci0JCQkJCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHJlc3BvbnNpYmxlVGV4dCIvPjoKLQkJCQkJCQkJPC9zcGFuPgotCQkJCQkJCQk8eHNsOmlmIHRlc3Q9ImNvdW50KCRyZXNwb25zaWJsZVJvbGVzKSA+IDAiPgotCQkJCQkJCQk8dWw+Ci0JCQkJCQkJCQk8eHNsOmZvci1lYWNoIHNlbGVjdD0iJHJlc3BvbnNpYmxlUm9sZXMiPgotCQkJCQkJCQkJPHhzbDpzb3J0IHNlbGVjdD0iQERpc3BsYXlOYW1lIi8+Ci0JCQkJCQkJCQkJPGxpPgotCQkJCQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWRkRWxlbWVudFdpdGhMaW5rIj4KLQkJCQkJCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50IiBzZWxlY3Q9Ii4iLz4KLQkJCQkJCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCQkJCQk8L2xpPgotCQkJCQkJCQkJPC94c2w6Zm9yLWVhY2g+Ci0JCQkJCQkJCTwvdWw+Ci0JCQkJCQkJCTwveHNsOmlmPgotCQkJCQkJCTwvdGQ+Ci0JCQkJCQkJPHRkIGNsYXNzPSJzZWN0aW9uVGFibGVDZWxsIj4KLQkJCQkJCQkJPHNwYW4gY2xhc3M9InNlY3Rpb25UYWJsZUNlbGxIZWFkaW5nIj4KLQkJCQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbW9kaWZpZWRCeVRleHQiLz46Ci0JCQkJCQkJCTwvc3Bhbj4KLQkJCQkJCQkJPHhzbDppZiB0ZXN0PSJjb3VudCgkbW9kaWZ5Um9sZXMpID4gMCI+CQkJCQkJCQkJCi0JCQkJCQkJCTx1bD4KLQkJCQkJCQkJCTx4c2w6Zm9yLWVhY2ggc2VsZWN0PSIkbW9kaWZ5Um9sZXMiPgotCQkJCQkJCQkJPHhzbDpzb3J0IHNlbGVjdD0iQERpc3BsYXlOYW1lIi8+Ci0JCQkJCQkJCQkJPGxpPgotCQkJCQkJCQkJCQk8YT48eHNsOmF0dHJpYnV0ZSBuYW1lPSJocmVmIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iL0VsZW1lbnQvQEJhY2tQYXRoIi8+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBVcmwiLz48L3hzbDphdHRyaWJ1dGU+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPjwvYT4KLQkJCQkJCQkJCQk8L2xpPgotCQkJCQkJCQkJPC94c2w6Zm9yLWVhY2g+Ci0JCQkJCQkJCTwvdWw+Ci0JCQkJCQkJCTwveHNsOmlmPgotCQkJCQkJCTwvdGQ+CQkJCQkJCQotCQkJCQkJPC90cj4KLQkJCQkJPC94c2w6aWY+Ci0JCQkJCTx4c2w6aWYgdGVzdD0iY291bnQoJG1hbmRhdG9yeUlucHV0VG9UYXNrcykgKyBjb3VudCgkb3B0aW9uYWxJbnB1dFRvVGFza3MpICsgY291bnQoJG91dHB1dEZyb21UYXNrcykgKyBjb3VudCgkbWFuZGF0b3J5SW5wdXRUb1Rhc2tzX2Zyb21TbG90cykgKyBjb3VudCgkb3B0aW9uYWxJbnB1dFRvVGFza3NfZnJvbVNsb3RzKSArIGNvdW50KCRvdXRwdXRGcm9tVGFza3NfZnJvbVNsb3RzKSA+IDAiPgotCQkJCQkJPHRyIHZhbGlnbj0idG9wIj4KLQkJCQkJCQk8dGggY2xhc3M9InNlY3Rpb25UYWJsZUhlYWRpbmciIHNjb3BlPSJyb3ciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdGFza3NUZXh0Ii8+PC90aD4KLQkJCQkJCQk8dGQgY2xhc3M9InNlY3Rpb25UYWJsZUNlbGwiIHdpZHRoPSI0MiUiPgotCQkJCQkJCQk8c3BhbiBjbGFzcz0ic2VjdGlvblRhYmxlQ2VsbEhlYWRpbmciPgotCQkJCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRpbnB1dFRvVGV4dCIvPjoKLQkJCQkJCQkJPC9zcGFuPgotCQkJCQkJCQk8eHNsOmlmIHRlc3Q9ImNvdW50KCRtYW5kYXRvcnlJbnB1dFRvVGFza3MpICsgY291bnQoJG9wdGlvbmFsSW5wdXRUb1Rhc2tzKSArIGNvdW50KCRtYW5kYXRvcnlJbnB1dFRvVGFza3NfZnJvbVNsb3RzKSArIGNvdW50KCRvcHRpb25hbElucHV0VG9UYXNrc19mcm9tU2xvdHMpID4gMCI+Ci0JCQkJCQkJCSAgICA8eHNsOmlmIHRlc3Q9ImNvdW50KCRtYW5kYXRvcnlJbnB1dFRvVGFza3MpID4gMCI+Ci0JCQkJCQkJCQk8dWw+Ci0JCQkJCQkJCQkJPHhzbDpmb3ItZWFjaCBzZWxlY3Q9IiRtYW5kYXRvcnlJbnB1dFRvVGFza3MiPgotCQkJCQkJCQkJCTx4c2w6c29ydCBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPgotCQkJCQkJCQkJCQk8bGk+Ci0JCQkJCQkJCQkJCQk8YT48eHNsOmF0dHJpYnV0ZSBuYW1lPSJocmVmIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iL0VsZW1lbnQvQEJhY2tQYXRoIi8+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBVcmwiLz48L3hzbDphdHRyaWJ1dGU+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPjwvYT4KLQkJCQkJCQkJCQkJPC9saT4KLQkJCQkJCQkJCQk8L3hzbDpmb3ItZWFjaD4KLQkJCQkJCQkJCTwvdWw+Ci0JCQkJCQkJCQk8L3hzbDppZj4KLQkJCQkJCQkJCTx4c2w6aWYgdGVzdD0iY291bnQoJG9wdGlvbmFsSW5wdXRUb1Rhc2tzKSA+IDAiPgotCQkJCQkJCQkJICA8eHNsOmlmIHRlc3Q9ImNvdW50KCRtYW5kYXRvcnlJbnB1dFRvVGFza3MpID4gMCI+PGJyLz48L3hzbDppZj4KLQkJCQkJCQkJCTx1bD4JCQotCQkJCQkJCQkJCTx4c2w6Zm9yLWVhY2ggc2VsZWN0PSIkb3B0aW9uYWxJbnB1dFRvVGFza3MiPgotCQkJCQkJCQkJCTx4c2w6c29ydCBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPgotCQkJCQkJCQkJCQk8bGk+Ci0JCQkJCQkJCQkJCQk8YT48eHNsOmF0dHJpYnV0ZSBuYW1lPSJocmVmIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iL0VsZW1lbnQvQEJhY2tQYXRoIi8+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBVcmwiLz48L3hzbDphdHRyaWJ1dGU+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPjwvYT4KLQkJCQkJCQkJCQkJPC9saT4KLQkJCQkJCQkJCQk8L3hzbDpmb3ItZWFjaD4JCQkJCQkJCQkJCi0JCQkJCQkJCQk8L3VsPgotCQkJCQkJCQkJPC94c2w6aWY+Ci0JCQkJCQkJCQk8eHNsOmlmIHRlc3Q9ImNvdW50KCRtYW5kYXRvcnlJbnB1dFRvVGFza3NfZnJvbVNsb3RzKSA+IDAiPgotCQkJCQkJCQkJCTx4c2w6aWYgdGVzdD0iY291bnQoJG1hbmRhdG9yeUlucHV0VG9UYXNrcykgKyBjb3VudCgkb3B0aW9uYWxJbnB1dFRvVGFza3MpID4gMCI+PGJyLz48L3hzbDppZj4KLQkJCQkJCQkJCTx1bD4KLQkJCQkJCQkJCQk8eHNsOmZvci1lYWNoIHNlbGVjdD0iJG1hbmRhdG9yeUlucHV0VG9UYXNrc19mcm9tU2xvdHMiPgotCQkJCQkJCQkJCTx4c2w6c29ydCBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPgotCQkJCQkJCQkJCQk8bGk+Ci0JCQkJCQkJCQkJCQk8YT48eHNsOmF0dHJpYnV0ZSBuYW1lPSJocmVmIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iL0VsZW1lbnQvQEJhY2tQYXRoIi8+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBVcmwiLz48L3hzbDphdHRyaWJ1dGU+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPjwvYT4KLQkJCQkJCQkJCQkJPC9saT4KLQkJCQkJCQkJCQk8L3hzbDpmb3ItZWFjaD4KLQkJCQkJCQkJCTwvdWw+Ci0JCQkJCQkJCQk8L3hzbDppZj4KLQkJCQkJCQkJCTx4c2w6aWYgdGVzdD0iY291bnQoJG9wdGlvbmFsSW5wdXRUb1Rhc2tzX2Zyb21TbG90cykgPiAwIj4KLQkJCQkJCQkJCSAgPHhzbDppZiB0ZXN0PSJjb3VudCgkbWFuZGF0b3J5SW5wdXRUb1Rhc2tzKSArIGNvdW50KCRvcHRpb25hbElucHV0VG9UYXNrcykgKyBjb3VudCgkbWFuZGF0b3J5SW5wdXRUb1Rhc2tzX2Zyb21TbG90cyk+IDAiPjxici8+PC94c2w6aWY+Ci0JCQkJCQkJCQk8dWw+CQkKLQkJCQkJCQkJCQk8eHNsOmZvci1lYWNoIHNlbGVjdD0iJG9wdGlvbmFsSW5wdXRUb1Rhc2tzX2Zyb21TbG90cyI+Ci0JCQkJCQkJCQkJPHhzbDpzb3J0IHNlbGVjdD0iQERpc3BsYXlOYW1lIi8+Ci0JCQkJCQkJCQkJCTxsaT4KLQkJCQkJCQkJCQkJCTxhPjx4c2w6YXR0cmlidXRlIG5hbWU9ImhyZWYiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIvRWxlbWVudC9AQmFja1BhdGgiLz48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQFVybCIvPjwveHNsOmF0dHJpYnV0ZT48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQERpc3BsYXlOYW1lIi8+PC9hPgotCQkJCQkJCQkJCQk8L2xpPgotCQkJCQkJCQkJCTwveHNsOmZvci1lYWNoPgkJCQkJCQkJCQkKLQkJCQkJCQkJCTwvdWw+Ci0JCQkJCQkJCQk8L3hzbDppZj4KLQkJCQkJCQkJPC94c2w6aWY+Ci0JCQkJCQkJPC90ZD4KLQkJCQkJCQk8dGQgY2xhc3M9InNlY3Rpb25UYWJsZUNlbGwiPgotCQkJCQkJCQk8c3BhbiBjbGFzcz0ic2VjdGlvblRhYmxlQ2VsbEhlYWRpbmciPgotCQkJCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRvdXRwdXRGcm9tVGV4dCIvPjoKLQkJCQkJCQkJPC9zcGFuPgotCQkJCQkJCQk8eHNsOmlmIHRlc3Q9ImNvdW50KCRvdXRwdXRGcm9tVGFza3MpID4gMCI+CQkJCQkJCQkJCi0JCQkJCQkJCQk8dWw+Ci0JCQkJCQkJCQkJPHhzbDpmb3ItZWFjaCBzZWxlY3Q9IiRvdXRwdXRGcm9tVGFza3MiPgotCQkJCQkJCQkJCTx4c2w6c29ydCBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPgotCQkJCQkJCQkJCQk8bGk+Ci0JCQkJCQkJCQkJCQk8YT48eHNsOmF0dHJpYnV0ZSBuYW1lPSJocmVmIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iL0VsZW1lbnQvQEJhY2tQYXRoIi8+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBVcmwiLz48L3hzbDphdHRyaWJ1dGU+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPjwvYT4KLQkJCQkJCQkJCQkJPC9saT4KLQkJCQkJCQkJCQk8L3hzbDpmb3ItZWFjaD4KLQkJCQkJCQkJCTwvdWw+Ci0JCQkJCQkJCTwveHNsOmlmPgotCQkJCQkJCQk8eHNsOmlmIHRlc3Q9ImNvdW50KCRvdXRwdXRGcm9tVGFza3NfZnJvbVNsb3RzKSA+IDAiPgkKLQkJCQkJCQkJCTx4c2w6aWYgdGVzdD0iY291bnQoJG91dHB1dEZyb21UYXNrcykgPiAwIj48YnIvPjwveHNsOmlmPgkJCQkJCQkJCi0JCQkJCQkJCQk8dWw+Ci0JCQkJCQkJCQkJPHhzbDpmb3ItZWFjaCBzZWxlY3Q9IiRvdXRwdXRGcm9tVGFza3NfZnJvbVNsb3RzIj4KLQkJCQkJCQkJCQk8eHNsOnNvcnQgc2VsZWN0PSJARGlzcGxheU5hbWUiLz4KLQkJCQkJCQkJCQkJPGxpPgotCQkJCQkJCQkJCQkJPGE+PHhzbDphdHRyaWJ1dGUgbmFtZT0iaHJlZiI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii9FbGVtZW50L0BCYWNrUGF0aCIvPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAVXJsIi8+PC94c2w6YXR0cmlidXRlPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJARGlzcGxheU5hbWUiLz48L2E+Ci0JCQkJCQkJCQkJCTwvbGk+Ci0JCQkJCQkJCQkJPC94c2w6Zm9yLWVhY2g+Ci0JCQkJCQkJCQk8L3VsPgotCQkJCQkJCQk8L3hzbDppZj4KLQkJCQkJCQk8L3RkPgkJCQkJCQkKLQkJCQkJCTwvdHI+Ci0JCQkJCTwveHNsOmlmPgotCQkJCQkKLQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFkZERlc2NyaXB0b3JzIj4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJkZXNjcmlwdG9ycyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0W0BuYW1lPSdkZXNjcmlwdG9ycyddL0VsZW1lbnQiLz4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJjb2xzcGFuIiBzZWxlY3Q9IicyJyIvPgotCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCi0JCQkJPC90YWJsZT4KLQkJCTwvZGl2PgotCQk8L3hzbDppZj4KLQk8L3hzbDp0ZW1wbGF0ZT4KLQotCTx4c2w6dGVtcGxhdGUgbmFtZT0ibW9yZUluZm9TZWN0aW9uIj4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJjaGVja2xpc3RzIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3QvRWxlbWVudFtAVHlwZT0nQ2hlY2tsaXN0J10iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJjb25jZXB0cyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0L0VsZW1lbnRbQFR5cGU9J0NvbmNlcHQnXSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9Imd1aWRlbGluZXMiIHNlbGVjdD0icmVmZXJlbmNlTGlzdC9FbGVtZW50W0BUeXBlPSdHdWlkZWxpbmUnXSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InN1cHBvcnRpbmdNYXRlcmlhbHMiIHNlbGVjdD0icmVmZXJlbmNlTGlzdC9FbGVtZW50W0BUeXBlPSdTdXBwb3J0aW5nTWF0ZXJpYWwnXSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InRvb2xNZW50b3JzIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3QvRWxlbWVudFtAVHlwZT0nVG9vbE1lbnRvciddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0id2hpdGVQYXBlcnMiIHNlbGVjdD0icmVmZXJlbmNlTGlzdC9FbGVtZW50W0BUeXBlPSdXaGl0ZXBhcGVyJ10iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJlc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMiIHNlbGVjdD0icmVmZXJlbmNlTGlzdC9FbGVtZW50W0BUeXBlPSdFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMnXSIvPgotCQkKLQkJPHhzbDppZiB0ZXN0PSJjb3VudCgkY2hlY2tsaXN0cykgKyBjb3VudCgkY29uY2VwdHMpICsgY291bnQoJGd1aWRlbGluZXMpICsgY291bnQoJHN1cHBvcnRpbmdNYXRlcmlhbHMpICsgY291bnQoJHRvb2xNZW50b3JzKSArIGNvdW50KCR3aGl0ZVBhcGVycykgKyBjb3VudCgkZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKSA+IDAiPgotCQkJPGRpdiBjbGFzcz0ic2VjdGlvbkhlYWRpbmciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbW9yZUluZm9UZXh0Ii8+PC9kaXY+Ci0JCQk8ZGl2IGNsYXNzPSJzZWN0aW9uQ29udGVudCI+Ci0JCQkJPHRhYmxlIGNsYXNzPSJzZWN0aW9uVGFibGUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4KLQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFkZENoZWNrbGlzdHMiPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImNoZWNrbGlzdHMiIHNlbGVjdD0iJGNoZWNrbGlzdHMiLz4KLQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFkZENvbmNlcHRzIj4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJjb25jZXB0cyIgc2VsZWN0PSIkY29uY2VwdHMiLz4KLQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFkZEd1aWRlbGluZXMiPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9Imd1aWRlbGluZXMiIHNlbGVjdD0iJGd1aWRlbGluZXMiLz4KLQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFkZFN1cHBvcnRpbmdNYXRlcmlhbHMiPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9InN1cHBvcnRpbmdNYXRlcmlhbHMiIHNlbGVjdD0iJHN1cHBvcnRpbmdNYXRlcmlhbHMiLz4KLQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFkZFRvb2xNZW50b3JzIj4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJ0b29sTWVudG9ycyIgc2VsZWN0PSIkdG9vbE1lbnRvcnMiLz4KLQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFkZFdoaXRlUGFwZXJzIj4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJ3aGl0ZVBhcGVycyIgc2VsZWN0PSIkd2hpdGVQYXBlcnMiLz4KLQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFkZEVzdGltYXRpb25Db25zaWRlcmF0aW9ucyI+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIiBzZWxlY3Q9IiRlc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMiLz4KLQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQk8L3RhYmxlPgotCQkJPC9kaXY+Ci0JCTwveHNsOmlmPgotCTwveHNsOnRlbXBsYXRlPgotCi08L3hzbDpzdHlsZXNoZWV0PgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvcGx1Z2luLnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWE0ZGRjYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSCi0KLSMgUGx1Zy1pbgotcGx1Z2luTmFtZT1FUEYgTGlicmFyeQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCi0KLSMgdG8gYW5hYmxlIHRoZSBleHRlZC1yZXBsYWNlIGZlYXR1cmUKLSNFbmFibGVFeHRlbmRSZXBsYWNlPXRydWUKLQotVW5yZXNvbHZlZEJhc2VQbHVnaW5zVHlwZU5hbWU9VW5yZXNvbHZlZCBiYXNlIHBsdWdpbiByZWZlcmVuY2VzCi1NdWx0aXBsZVJlcGxhY2Vyc1R5cGVOYW1lPUNvbmZpZ3VyYXRpb24gUHJvYmxlbXMgKE11bHRpcGxlIFJlcGxhY2VycykKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9wbHVnaW4ueG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmM0NmNhOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTxwbHVnaW4+Ci0KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5uYXR1cmVzIgotICAgICAgICAgaWQ9InByb2plY3QuTWV0aG9kTGlicmFyeVByb2plY3ROYXR1cmUiCi0gICAgICAgICBuYW1lPSJNZXRob2QgTGlicmFyeSBQcm9qZWN0IE5hdHVyZSI+Ci0gICAgICA8cnVudGltZT4KLSAgICAgICAgIDxydW4gY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnByb2plY3QuTWV0aG9kTGlicmFyeVByb2plY3ROYXR1cmUiPgotICAgICAgICAgPC9ydW4+Ci0gICAgICA8L3J1bnRpbWU+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIAotICAgPGV4dGVuc2lvbi1wb2ludAotICAgICAgICAgaWQ9ImxpYnJhcnlNYW5hZ2VycyIKLSAgICAgICAgIG5hbWU9Ik1ldGhvZCBMaWJyYXJ5IE1hbmFnZXJzIgotICAgICAgICAgc2NoZW1hPSJzY2hlbWEvTGlicmFyeU1hbmFnZXJzLmV4c2QiLz4KLSAgIDxleHRlbnNpb24tcG9pbnQgaWQ9ImVsZW1lbnRMYXlvdXRFeHRlbnNpb25zIiBuYW1lPSJFbGVtZW50IGxheW91dCBFeHRlbnNpb25zIiBzY2hlbWE9InNjaGVtYS9lbGVtZW50TGF5b3V0RXh0ZW5zaW9ucy5leHNkIi8+Ci0gICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJlbGVtZW50UmVhbGl6ZXJGYWN0b3J5IiBuYW1lPSJFbGVtZW50UmVhbGl6ZXIgRmFjdG9yeSIgc2NoZW1hPSJzY2hlbWEvZWxlbWVudFJlYWxpemVyRmFjdG9yeS5leHNkIi8+Ci0gICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJjb25maWdIZWxwZXJEZWxlZ2F0ZUV4dCIgbmFtZT0iQ29uZmlnSGVscGVyRGVsZWdhdGVFeHQiIHNjaGVtYT0ic2NoZW1hL2NvbmZpZ0hlbHBlckRlbGVnYXRlRXh0LmV4c2QiLz4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnRleHRSZWZlcmVuY2VSZXBsYWNlciI+Ci0gICAgICA8dGV4dFJlZmVyZW5jZVJlcGxhY2VyIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLlRleHRSZWZlcmVuY2VSZXBsYWNlckltcGwiLz4KLSAgIDwvZXh0ZW5zaW9uPgotICAgPGV4dGVuc2lvbiBpZD0idW5yZXNvbHZlZEJhc2VQbHVnaW5zIiBwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMubWFya2VycyIgbmFtZT0iJVVucmVzb2x2ZWRCYXNlUGx1Z2luc1R5cGVOYW1lIj4gCi0gICAgICA8cGVyc2lzdGVudCB2YWx1ZT0iZmFsc2UiLz4gCi0gICAgICA8c3VwZXIgdHlwZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJvYmxlbW1hcmtlciIvPiAKLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIvPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJndWlkIi8+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9InVucmVzb2x2ZWRCYXNlR3VpZHMiLz4KLSAgIDwvZXh0ZW5zaW9uPiAgCi0gICAgICA8ZXh0ZW5zaW9uIGlkPSJtdWx0aXBsZVJlcGxhY2VycyIgcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLm1hcmtlcnMiIG5hbWU9IiVNdWx0aXBsZVJlcGxhY2Vyc1R5cGVOYW1lIj4gCi0gICAgICA8cGVyc2lzdGVudCB2YWx1ZT0iZmFsc2UiLz4gCi0gICAgICA8c3VwZXIgdHlwZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJvYmxlbW1hcmtlciIvPiAKLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZ3VpZCIvPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJyZXBsYWNlckd1aWRzIi8+Ci0gICA8L2V4dGVuc2lvbj4gIAotICAgCi08L3BsdWdpbj4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NjaGVtYS9MaWJyYXJ5TWFuYWdlcnMuZXhzZCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NjaGVtYS9MaWJyYXJ5TWFuYWdlcnMuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzgzMGZhNS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zY2hlbWEvTGlicmFyeU1hbmFnZXJzLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMzYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkiPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5IiBpZD0ibGlicmFyeU1hbmFnZXJzIiBuYW1lPSJNZXRob2QgTGlicmFyeSBNYW5hZ2VyIENvbnRyaWJ1dG9ycyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBFbmFibGVzIGEgcGx1Zy1pbiB0byByZWdpc3RlciBhIHNwZWNpZmljIExpYnJhcnkgTWFuYWdlciBpbXBsZW1lbnRhdGlvbiB3aXRoIHRoZSBMaWJyYXJ5IFNlcnZpY2UuCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImxpYnJhcnlNYW5hZ2VyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBBIGZ1bGx5IHF1YWxpZmllZCBpZGVudGlmaWVyIG9mIHRoZSB0YXJnZXQgZXh0ZW5zaW9uIHBvaW50LgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIEFuIG9wdGlvbmFsIGlkZW50aWZpZXIgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZS4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIEFuIG9wdGlvbmFsIG5hbWUgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZS4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0ibGlicmFyeU1hbmFnZXIiPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgSmF2YSBjbGFzcyB0aGF0IGltcGxlbWVudHMgYSBMaWJyYXJ5IE1hbmFnZXIuIFRoaXMgY2xhc3MgbXVzdCBiZSBhIHB1YmxpYyBpbXBsZW1lbnRhdGlvbiBvZiAmbHQ7Y29kZSZndDtvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5JTGlicmFyeU1hbmFnZXImbHQ7L2NvZGUmZ3Q7IHdpdGggYSBwdWJsaWMgMC1hcmd1bWVudCBjb25zdHJ1Y3Rvci4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ0eXBlIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSBpZGVudGlmaWVyIG9mIGEgc3BlY2lmaWMgbWV0aG9kIGxpYnJhcnkgdHlwZSAoZGF0YWJhc2UsIHhtaSwgZXRjLikuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idHlwZU5hbWUiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgQSB0cmFuc2xhdGFibGUgZGlzcGxheSBuYW1lIGZvciB0aGUgbGlicmFyeSB0eXBlLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idmVyc2lvbiIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgdmVyc2lvbiBudW1iZXIgb2YgdGhpcyBsaWJyYXJ5IG1hbmFnZXIuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIDEuMAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBUaGUgZm9sbG93aW5nIGlzIGFuIGV4YW1wbGUgb2YgYSBMaWJyYXJ5IE1hbmFnZXIgZXh0ZW5zaW9uIHBvaW50OiAKLSZsdDtwJmd0OwotJmx0O3ByZSZndDsKLSAgICZsdDtleHRlbnNpb24gcG9pbnQ9JnF1b3Q7b3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGlicmFyeU1hbmFnZXJzJnF1b3Q7Jmd0OwotICAgICAgJmx0O2xpYnJhcnlNYW5hZ2VyCi0gICAgICAgICBjbGFzcz0mcXVvdDtvcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkuWE1JTGlicmFyeU1hbmFnZXImcXVvdDsKLSAgICAgICAgIHR5cGU9JnF1b3Q7eG1pJnF1b3Q7Ci0gICAgICAgICB0eXBlTmFtZT0mcXVvdDtYTUkmcXVvdDsmZ3Q7Ci0gICAgICAmbHQ7L2xpYnJhcnlNYW5hZ2VyJmd0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICZsdDsvZXh0ZW5zaW9uJmd0OyAKLSZsdDsvcHJlJmd0OwotJmx0Oy9wJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4mbHQ7YnImZ3Q7Ci1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAmbHQ7YSAKLWhyZWY9JnF1b3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmcXVvdDsmZ3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmbHQ7L2EmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc2NoZW1hL2NvbmZpZ0hlbHBlckRlbGVnYXRlRXh0LmV4c2QgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zY2hlbWEvY29uZmlnSGVscGVyRGVsZWdhdGVFeHQuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDgzOTgwMy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zY2hlbWEvY29uZmlnSGVscGVyRGVsZWdhdGVFeHQuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDExMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS5lcGYubGlicmFyeSI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkiIGlkPSJjb25maWdIZWxwZXJEZWxlZ2F0ZUV4dCIgbmFtZT0iQ29uZmlnSGVscGVyRGVsZWdhdGVFeHQiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgRXh0ZW50aW9uIHBvaW50IGZvciBwcm92aWRpbmcgZXh0ZW5kZWQgaW1wbGVtZW50YXRpb24gZm9yIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkNvbmZpZ0hlbHBlckRlbGVnYXRlCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImNvbmZpZ0hlbHBlckRlbGVnYXRlRXh0Ii8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImNvbmZpZ0hlbHBlckRlbGVnYXRlRXh0Ij4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIDEuNQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgZXh0ZW5zaW9uIHBvaW50IHVzYWdlIGV4YW1wbGUgaGVyZS5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuQ29uZmlnSGVscGVyRGVsZWdhdGUKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIGluZm9ybWF0aW9uIGFib3V0IHN1cHBsaWVkIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgZXh0ZW5zaW9uIHBvaW50Ll0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc2NoZW1hL2VsZW1lbnRMYXlvdXRFeHRlbnNpb25zLmV4c2QgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zY2hlbWEvZWxlbWVudExheW91dEV4dGVuc2lvbnMuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDkxZjg1Zi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zY2hlbWEvZWxlbWVudExheW91dEV4dGVuc2lvbnMuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDExOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS5lcGYubGlicmFyeSI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkiIGlkPSJlbGVtZW50TGF5b3V0RXh0ZW5zaW9ucyIgbmFtZT0iRWxlbWVudCBsYXlvdXQgRXh0ZW5zaW9ucyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBhbGxvdyBtb2RpZnkgdGhlIGVsZW1lbnQgbGF5b3V0IGJlaGF2aW9yIGJ5IHByb3ZpZGluZyBsYXlvdXQgZXh0ZW5zaW9ucy4gCi0KLVRoZSBsYXlvdXQgZXh0ZW5zaW9uIGlzIENvbmZpZ3VyYXRpb24gc3BlY2lmaWMgYnkgc3BlY2lmeWluZyBhIGFuIE1ldGhvZEVsZW1lbnRQcm9wZXJ0eSBrZXkgb2YgdGhlIGNvbmZpZ3VyYXRpb24gdGhhdCBtYXRjaGVzIHdpdGggdGhlIGlkIGF0dHJpYnV0ZSBvZiBlYWNoIExheW91dEV4dGVuc2lvbi4KLQotaS5lLiwgaWYgdGhlIGNvbmZpZ3VyYXRpb24gaGFzIGEgTWV0aG9kRWxlbWVudFByb3BlcnR5IGtleSB0aGF0IG1hdGNoZXMgd2l0aCBhbiBMYXlvdXRFeHRlbnNpb24sIHRoYXQgZXh0ZW5zaW9uIHdpbGwgYmUgdXNlZC4KLQotSXQgaXMgdGhlIHVzZXImYXBvcztzIHJlc3BvbnNpYmlsaXR5IHRvIG1ha2Ugc3VyZSB0aGUga2V5IGlzIHVuaXF1ZS4KLQotdGhlIGV4dGVuc2lvbiBjbGFzcyBzaG91bGQgZXh0ZW5kcyB0aGUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LkxheW91dEV4dGVuc2lvbiBjbGFzcwotCi0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iTGF5b3V0RXh0ZW5zaW9uIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9IkxheW91dEV4dGVuc2lvbiI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAxLjAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIGV4dGVuc2lvbiBwb2ludCB1c2FnZSBleGFtcGxlIGhlcmUuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBBUEkgaW5mb3JtYXRpb24gaGVyZS5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBpbmZvcm1hdGlvbiBhYm91dCBzdXBwbGllZCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGV4dGVuc2lvbiBwb2ludC5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotPC9zY2hlbWE+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zY2hlbWEvZWxlbWVudFJlYWxpemVyRmFjdG9yeS5leHNkIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc2NoZW1hL2VsZW1lbnRSZWFsaXplckZhY3RvcnkuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2Y3MmMzYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zY2hlbWEvZWxlbWVudFJlYWxpemVyRmFjdG9yeS5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTA1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5Ij4KLTxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS5lcGYubGlicmFyeSIgaWQ9ImVsZW1lbnRSZWFsaXplckZhY3RvcnkiIG5hbWU9IkVsZW1lbnRSZWFsaXplciBGYWN0b3J5Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBkZXNjcmlwdGlvbiBvZiB0aGlzIGV4dGVuc2lvbiBwb2ludC5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8Y2hvaWNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJmYWN0b3J5Ii8+Ci0gICAgICAgICA8L2Nob2ljZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJmYWN0b3J5Ij4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJqYXZhIiBiYXNlZE9uPSI6b3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5JRWxlbWVudFJlYWxpemVyRmFjdG9yeSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgdGhlIGZpcnN0IHJlbGVhc2UgaW4gd2hpY2ggdGhpcyBleHRlbnNpb24gcG9pbnQgYXBwZWFycy5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBleHRlbnNpb24gcG9pbnQgdXNhZ2UgZXhhbXBsZSBoZXJlLl0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgQVBJIGluZm9ybWF0aW9uIGhlcmUuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgaW5mb3JtYXRpb24gYWJvdXQgc3VwcGxpZWQgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBleHRlbnNpb24gcG9pbnQuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L0Fic3RyYWN0TGlicmFyeU1hbmFnZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9BYnN0cmFjdExpYnJhcnlNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlZDE4OGYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L0Fic3RyYWN0TGlicmFyeU1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNTYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnk7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkV2ZW50T2JqZWN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUnVubmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5MaXN0ZW5lckxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkJhc2ljQ29tbWFuZFN0YWNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kU3RhY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmRTdGFja0xpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5BZGRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ3JlYXRlQ2hpbGRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuUGFzdGVGcm9tQ2xpcGJvYXJkQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VkQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSU5vdGlmeUNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5SZWZsZWN0aXZlSXRlbVByb3ZpZGVyQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIucmVzb3VyY2UuUmVzb3VyY2VJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnByZWZlcmVuY2VzLklQcmVmZXJlbmNlU3RvcmVXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24ucHJlZmVyZW5jZXMuSVByb3BlcnR5Q2hhbmdlRXZlbnRXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24ucHJlZmVyZW5jZXMuSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24uc2VydmljZWFiaWxpdHkuRGVidWdUcmFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JQWN0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuU3VwcHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZXZlbnRzLklMaWJyYXJ5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LkxheW91dFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS5JTGlicmFyeVJlc291cmNlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnByZWZlcmVuY2VzLkxpYnJhcnlQcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wcm9qZWN0Lk1ldGhvZExpYnJhcnlQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnNlcnZpY2VzLkxpYnJhcnlNb2RpZmljYXRpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuc2VydmljZXMuU2FmZVVwZGF0ZUNvbnRyb2xsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5MaWJyYXJ5UHJvYmxlbU1vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5MaWJyYXJ5VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UuTXVsdGlGaWxlWE1JU2F2ZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLnJlZnJlc2guSVJlZnJlc2hFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UucmVmcmVzaC5JUmVmcmVzaExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5yZWZyZXNoLlJlZnJlc2hKb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLnV0aWwuTGlicmFyeVNjaGVkdWxpbmdSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS51dGlsLlBlcnNpc3RlbmNlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VydmljZXMuSUxpYnJhcnlQZXJzaXN0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzLlNlcnZpY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS5pbXBsLk11bHRpUmVzb3VyY2VFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5Bc3NvY2lhdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JUHJvcGVydHlMaXN0ZW5lcjsKLQotLyoqCi0gKiBUaGUgYWJzdHJhY3QgYmFzZSBjbGFzcyBmb3IgYSBMaWJyYXJ5IE1hbmFnZXIuIENvbmNyZXRlIGltcGxlbWVudGF0aW9uIG9mCi0gKiBJTGlicmFyeU1hbmFnZXIgbXVzdCBiZSBhIHN1YmNsYXNzIG9mIHRoaXMgY2xhc3MuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiAKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0TGlicmFyeU1hbmFnZXIgaW1wbGVtZW50cyBJTGlicmFyeU1hbmFnZXIgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUF9ESVJUWSA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgbGlicmFyeSBuYW1lLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFSR19MSUJSQVJZX05BTUUgPSAibGlicmFyeS5uYW1lIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVJHX0xJQlJBUllfUkVHSVNURVJfVFlQRSA9ICJsaWJyYXJ5UmVnaXN0ZXJUeXBlIjsgCS8vJE5PTi1OTFMtMSQKLQkKLQkvLyBJZiB0cnVlLCBnZW5lcmF0ZSBkZWJ1ZyB0cmFjZXMuCi0JcHJvdGVjdGVkIHN0YXRpYyBib29sZWFuIGRlYnVnID0gTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkuaXNEZWJ1Z2dpbmcoKTsKLQotCS8vIFRoZSBtYW5hZ2VkIGxpYnJhcnkuCi0JcHJvdGVjdGVkIE1ldGhvZExpYnJhcnkgbGlicmFyeTsJCi0KLQkvLyBUaGUgZGVmYXVsdCBlZGl0aW5nIGRvbWFpbiBmb3IgdGhlIG1hbmFnZWQgbGlicmFyeS4KLQlwcm90ZWN0ZWQgQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluIGVkaXRpbmdEb21haW47Ci0KLQkvLyBBIGxpc3Qgb2YgbGlzdGVuZXJzIHRoYXQgbW9uaXRvciBjaGFuZ2VzIHRvIHRoZSBtYW5hZ2VkIGxpYnJhcnkuCi0JcHJpdmF0ZSBMaXN0IGxpYnJhcnlDaGFuZ2VkTGlzdGVuZXJzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JLy8gcmVtb3ZlIHRoaXMgb25lIHNpbmNlIHRoaXMgbWF5IGNhdXNlIHBvdGVudGlhbCBtZW1vcnkgbGVhawotCS8vIEEgbGlzdCBvZiBsaXN0ZW5lcnMgdGhhdCBoYXZlIGJlZW4gZGV0YWNoZWQgZnJvbSB0aGUgbWFuYWdlZCBsaWJyYXJ5LgotCS8vcHJpdmF0ZSBMaXN0IGRldGFjaGVkTGlicmFyeUNoYW5nZWRMaXN0ZW5lcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkvLyBBIGxpc3Qgb2YgbGlzdGVuZXJzIHRoYXQgbW9uaXRvciByZXNvdXJjZSBjaGFuZ2VzIGluIHRoZSBtYW5hZ2VkIGxpYnJhcnkuCi0JcHJpdmF0ZSBMaXN0ZW5lckxpc3QgcmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcnMgPSBuZXcgTGlzdGVuZXJMaXN0KCk7Ci0KLQkvLyBUaGUgc2F2ZSBsaWJyYXJ5IG9wdGlvbnMuCi0JcHJpdmF0ZSBNYXAgc2F2ZU9wdGlvbnM7Ci0KLQkvLyBJZiB0cnVlLCBza2lwIGFsbCBldmVudCBwcm9jZXNzaW5nLgotCXByb3RlY3RlZCBib29sZWFuIHNraXBFdmVudFByb2Nlc3NpbmcgPSBmYWxzZTsKLQotCS8vIFRPRE86IGZpbmQgYSBiZXR0ZXIgd2F5IHRvIG5vdGlmeSB0aGUgY2hhbmdlIGluIGxpYnJhcnkgaW5zdGVhZCBvZgotCS8vIHJlbHlpbmcgb24gdGhlIGNvbW1hbmQgc3RhY2sgbGlzdGVuZXIKLQlwcml2YXRlIENvbW1hbmRTdGFja0xpc3RlbmVyIGNvbW1hbmRTdGFja0xpc3RlbmVyID0gbmV3IENvbW1hbmRTdGFja0xpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBjb21tYW5kU3RhY2tDaGFuZ2VkKGZpbmFsIEV2ZW50T2JqZWN0IGV2ZW50KSB7Ci0JCQlpZiAoZGVidWcpIHsKLQkJCQlEZWJ1Z1RyYWNlLnByaW50KHRoaXMsICJjb21tYW5kU3RhY2tDaGFuZ2VkIiwgImV2ZW50PSIgKyBldmVudCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJfQotCQkJaWYgKCFza2lwRXZlbnRQcm9jZXNzaW5nKSB7Ci0JCQkJU2FmZVVwZGF0ZUNvbnRyb2xsZXIuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJLy8gVHJ5IHRvIHNlbGVjdCB0aGUgYWZmZWN0ZWQgb2JqZWN0cy4KLQkJCQkJCUNvbW1hbmQgbW9zdFJlY2VudENvbW1hbmQgPSBMaWJyYXJ5VXRpbAotCQkJCQkJCQkudW53cmFwKCgoQ29tbWFuZFN0YWNrKSBldmVudC5nZXRTb3VyY2UoKSkKLQkJCQkJCQkJCQkuZ2V0TW9zdFJlY2VudENvbW1hbmQoKSk7Ci0JCQkJCQlpZiAobW9zdFJlY2VudENvbW1hbmQgIT0gbnVsbCkgewotCQkJCQkJCWlmIChtb3N0UmVjZW50Q29tbWFuZCBpbnN0YW5jZW9mIEFkZENvbW1hbmQpIHsKLQkJCQkJCQkJQWRkQ29tbWFuZCBjbWQgPSAoQWRkQ29tbWFuZCkgbW9zdFJlY2VudENvbW1hbmQ7Ci0JCQkJCQkJCUVPYmplY3Qgb3duZXIgPSBjbWQuZ2V0T3duZXIoKTsKLQotCQkJCQkJCQkvLyBuZWVkIHRvIHNlbmQgb3duZXIgY2hhbmdlZCBub3RpZmljYXRpb24gZm9yCi0JCQkJCQkJCS8vIGFsbCBlbGVtZW50IHR5cGVzCi0JCQkJCQkJCS8vIAotCQkJCQkJCQkvLyAxNTYwMjggLSBSZWZlcmVuY2UgZnJvbSBXUCBhbmQgR3VpZGVuY2Ugd2FzCi0JCQkJCQkJCS8vIG5vdCBkZXRlY3RlZAotCQkJCQkJCQkvLyB3aGVuIGRlc2VsZWN0IHRoZSByZWxhdGVkIGVsZW1lbnQgZnJvbQotCQkJCQkJCQkvLyBjb25maWd1cmF0aW9uCi0KLQkJCQkJCQkJQ29sbGVjdGlvbiBvYmpzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQkJCQlvYmpzLmFkZChvd25lcik7Ci0JCQkJCQkJCW5vdGlmeUxpc3RlbmVycygKLQkJCQkJCQkJCQlJTGlicmFyeUNoYW5nZUxpc3RlbmVyLk9QVElPTl9DSEFOR0VELAotCQkJCQkJCQkJCW9ianMpOwotCi0JCQkJCQkJCWlmICghKG93bmVyIGluc3RhbmNlb2YgTWV0aG9kQ29uZmlndXJhdGlvbikpIHsKLQotCQkJCQkJCQkJb2JqcyA9IG1vc3RSZWNlbnRDb21tYW5kLmdldFJlc3VsdCgpOwotCi0JCQkJCQkJCQkvLyBVcGRhdGUgdGhlIGNvbmZpZ3VyYXRpb24gc2VsZWN0aW9uIGlmIHRoZQotCQkJCQkJCQkJLy8gb2JqZWN0IGlzIGEgbmV3bHkgYWRkZWQgbWV0aG9kIHBhY2thZ2UuCi0JCQkJCQkJCQlpZiAob3duZXIgaW5zdGFuY2VvZiBNZXRob2RQYWNrYWdlKSB7Ci0JCQkJCQkJCQkJb2JqcyA9IExpYnJhcnlVdGlsCi0JCQkJCQkJCQkJCQkuZ2V0Q29udGFpbmVkRWxlbWVudHMob3duZXIsCi0JCQkJCQkJCQkJCQkJCW9ianMpOwotCQkJCQkJCQkJCWlmICghb2Jqcy5pc0VtcHR5KCkpIHsKLQkJCQkJCQkJCQkJYWRkTmV3UGFja2FnZXNUb0NvbmZpZ3VyYXRpb24ob2Jqcyk7Ci0JCQkJCQkJCQkJfQotCQkJCQkJCQkJfQotCQkJCQkJCQkJbm90aWZ5TGlzdGVuZXJzKAotCQkJCQkJCQkJCQlJTGlicmFyeUNoYW5nZUxpc3RlbmVyLk9QVElPTl9ORVdDSElMRCwKLQkJCQkJCQkJCQkJb2Jqcyk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9IGVsc2UgaWYgKG1vc3RSZWNlbnRDb21tYW5kIGluc3RhbmNlb2YgUGFzdGVGcm9tQ2xpcGJvYXJkQ29tbWFuZCkgewotCQkJCQkJCQlDb2xsZWN0aW9uIG9ianMgPSBtb3N0UmVjZW50Q29tbWFuZC5nZXRSZXN1bHQoKTsKLQkJCQkJCQkJbm90aWZ5TGlzdGVuZXJzKAotCQkJCQkJCQkJCUlMaWJyYXJ5Q2hhbmdlTGlzdGVuZXIuT1BUSU9OX05FV0NISUxELAotCQkJCQkJCQkJCW9ianMpOwotCQkJCQkJCQlQYXN0ZUZyb21DbGlwYm9hcmRDb21tYW5kIGNtZCA9ICgoUGFzdGVGcm9tQ2xpcGJvYXJkQ29tbWFuZCkgbW9zdFJlY2VudENvbW1hbmQpOwotCi0JCQkJCQkJCS8vIFVwZGF0ZSB0aGUgY29uZmlndXJhdGlvbiBzZWxlY3Rpb24gaWYgdGhlCi0JCQkJCQkJCS8vIG9iamVjdCBpcyBhIG5ld2x5IGFkZGVkIG1ldGhvZCBwYWNrYWdlLgotCQkJCQkJCQlpZiAoY21kLmdldE93bmVyKCkgaW5zdGFuY2VvZiBNZXRob2RQYWNrYWdlKSB7Ci0JCQkJCQkJCQlvYmpzID0gTGlicmFyeVV0aWwuZ2V0Q29udGFpbmVkRWxlbWVudHMoY21kCi0JCQkJCQkJCQkJCS5nZXRPd25lcigpLCBvYmpzKTsKLQkJCQkJCQkJCWlmICghb2Jqcy5pc0VtcHR5KCkpIHsKLQkJCQkJCQkJCQlhZGROZXdQYWNrYWdlc1RvQ29uZmlndXJhdGlvbihvYmpzKTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCQkJCQkJCX0gZWxzZSBpZiAobW9zdFJlY2VudENvbW1hbmQgaW5zdGFuY2VvZiBDcmVhdGVDaGlsZENvbW1hbmQpIHsKLQkJCQkJCQkJbm90aWZ5TGlzdGVuZXJzKAotCQkJCQkJCQkJCUlMaWJyYXJ5Q2hhbmdlTGlzdGVuZXIuT1BUSU9OX05FV0NISUxELAotCQkJCQkJCQkJCW1vc3RSZWNlbnRDb21tYW5kLmdldEFmZmVjdGVkT2JqZWN0cygpKTsKLQkJCQkJCQl9IGVsc2UgaWYgKG1vc3RSZWNlbnRDb21tYW5kICE9IG51bGwpIHsKLQkJCQkJCQkJbm90aWZ5TGlzdGVuZXJzKAotCQkJCQkJCQkJCUlMaWJyYXJ5Q2hhbmdlTGlzdGVuZXIuT1BUSU9OX0NIQU5HRUQsCi0JCQkJCQkJCQkJbW9zdFJlY2VudENvbW1hbmQuZ2V0QWZmZWN0ZWRPYmplY3RzKCkpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0pOwotCQkJfQotCQl9Ci0JfTsKLQotCS8vIExpc3RlbiB0byBjaGFuZ2VzIHRvIHRoZSBtYW5hZ2VkIG1ldGhvZCBsaWJyYXJ5LgotCXByaXZhdGUgSU5vdGlmeUNoYW5nZWRMaXN0ZW5lciBub3RpZnlDaGFuZ2VkTGlzdGVuZXIgPSBuZXcgSU5vdGlmeUNoYW5nZWRMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCQlpZiAoZGVidWcpIHsKLQkJCQlEZWJ1Z1RyYWNlLnByaW50KHRoaXMsCi0JCQkJCQkibm90aWZ5Q2hhbmdlZCIsICJub3RpZmljYXRpb249IiArIG5vdGlmaWNhdGlvbik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJfQotCQkJaWYgKCFza2lwRXZlbnRQcm9jZXNzaW5nKSB7Ci0JCQkJaW50IGV2ZW50VHlwZSA9IG5vdGlmaWNhdGlvbi5nZXRFdmVudFR5cGUoKTsKLQkJCQlzd2l0Y2ggKGV2ZW50VHlwZSkgewotCQkJCWNhc2UgTm90aWZpY2F0aW9uLkFERDogewotCQkJCQkvLyBBIG1ldGhvZCBlbGVtZW50LCB0eXBpY2FsbHkgYSBtZXRob2QgcGx1Zy1pbiwgaGFzIGJlZW4KLQkJCQkJLy8gYWRkZWQgdG8gdGhlIG1hbmFnZWQgbGlicmFyeSB3aXRob3V0IHVzaW5nIGFuIGVkaXRpbmcKLQkJCQkJLy8gY29tbWFuZC4KLQkJCQkJT2JqZWN0IG5vdGlmaWVyID0gbm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCk7Ci0JCQkJCU9iamVjdCB2YWx1ZSA9IG5vdGlmaWNhdGlvbi5nZXROZXdWYWx1ZSgpOwotCQkJCQlpZiAoKG5vdGlmaWVyIGluc3RhbmNlb2YgTWV0aG9kTGlicmFyeSkKLQkJCQkJCQkmJiAodmFsdWUgaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pKSB7Ci0JCQkJCQlDb2xsZWN0aW9uIGFmZmVjdGVkT2JqZWN0cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJCWFmZmVjdGVkT2JqZWN0cy5hZGQodmFsdWUpOwotCQkJCQkJbm90aWZ5TGlzdGVuZXJzKElMaWJyYXJ5Q2hhbmdlTGlzdGVuZXIuT1BUSU9OX05FV0NISUxELAotCQkJCQkJCQlhZmZlY3RlZE9iamVjdHMpOwotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQotCQkJCWNhc2UgTm90aWZpY2F0aW9uLlNFVDogewotCQkJCQlPYmplY3Qgbm90aWZpZXIgPSBub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKTsKLQkJCQkJaWYgKG5vdGlmaWVyICE9IG51bGwpIHsKLQkJCQkJCUNvbGxlY3Rpb24gYWZmZWN0ZWRPYmplY3RzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQkJYWZmZWN0ZWRPYmplY3RzLmFkZChub3RpZmllcik7Ci0JCQkJCQlub3RpZnlMaXN0ZW5lcnMoSUxpYnJhcnlDaGFuZ2VMaXN0ZW5lci5PUFRJT05fQ0hBTkdFRCwKLQkJCQkJCQkJYWZmZWN0ZWRPYmplY3RzKTsKLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQl9Ci0KLQkJCQljYXNlIE5vdGlmaWNhdGlvbi5SRU1PVkU6IHsKLQkJCQkJLy8gRWl0aGVyIGEgbWV0aG9kIGVsZW1lbnQgaGFzIGJlZW4gcmVtb3ZlZCBmcm9tIHRoZQotCQkJCQkvLyBjb250YWluaW5nIGVsZW1lbnQsIG9yIGEgbWV0aG9kIGVsZW1lbnQgcmVmZXJlbmNlIGhhcwotCQkJCQkvLyBiZWVuIGRlbGV0ZWQuCi0JCQkJCU9iamVjdCBub3RpZmllciA9IG5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpOwotCQkJCQlPYmplY3Qgb2xkVmFsdWUgPSBub3RpZmljYXRpb24uZ2V0T2xkVmFsdWUoKTsKLQkJCQkJQ29sbGVjdGlvbiBhZmZlY3RlZE9iamVjdHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCWlmIChvbGRWYWx1ZSBpbnN0YW5jZW9mIEVPYmplY3QKLQkJCQkJCQkmJiAoKEVPYmplY3QpIG9sZFZhbHVlKS5lQ29udGFpbmVyKCkgPT0gbnVsbCkgewotCQkJCQkJLy8gQSBtZXRob2QgZWxlbWVudCBoYXMgYmVlbiBkZWxldGVkLgotCQkJCQkJYWZmZWN0ZWRPYmplY3RzLmFkZChvbGRWYWx1ZSk7Ci0JCQkJCQlub3RpZnlMaXN0ZW5lcnMoSUxpYnJhcnlDaGFuZ2VMaXN0ZW5lci5PUFRJT05fREVMRVRFRCwKLQkJCQkJCQkJYWZmZWN0ZWRPYmplY3RzKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCS8vIEEgbWV0aG9kIGVsZW1lbnQgcmVmZXJlbmNlIGhhcyBiZWVuIGRlbGV0ZWQsIG5vdGlmeQotCQkJCQkJLy8gdGhlIGxpc3RlbmVycyB0aGF0IHRoZSBjb250YWluaW5nIG1ldGhvZCBlbGVtZW50IGhhcwotCQkJCQkJLy8gY2hhbmdlZC4KLQkJCQkJCWFmZmVjdGVkT2JqZWN0cy5hZGQobm90aWZpZXIpOwotCQkJCQkJbm90aWZ5TGlzdGVuZXJzKElMaWJyYXJ5Q2hhbmdlTGlzdGVuZXIuT1BUSU9OX0NIQU5HRUQsCi0JCQkJCQkJCWFmZmVjdGVkT2JqZWN0cyk7Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJfQotCi0JCQkJY2FzZSBOb3RpZmljYXRpb24uUkVNT1ZFX01BTlk6IHsKLQkJCQkJLy8gVHdvIG9yIG1vcmUgbWV0aG9kIGVsZW1lbnRzIGhhdmUgYmVlbiByZW1vdmVkIGZyb20KLQkJCQkJLy8gdGhlIGNvbnRhaW5pbmcgZWxlbWVudCwgb3IgdHcgb3IgbW9yZSBtZXRob2QgZWxlbWVudAotCQkJCQkvLyByZWZlcmVuY2UgaGF2ZSBiZWVuIGRlbGV0ZWQuCi0JCQkJCUxpc3Qgb2xkVmFsdWUgPSBuZXcgQXJyYXlMaXN0KChDb2xsZWN0aW9uKSBub3RpZmljYXRpb24KLQkJCQkJCQkuZ2V0T2xkVmFsdWUoKSk7Ci0JCQkJCUFycmF5TGlzdCBkZWxldGVkRWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCUFycmF5TGlzdCByZW1vdmVkUmVmZXJlbmNlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJaWYgKCFvbGRWYWx1ZS5pc0VtcHR5KCkpIHsKLQkJCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IG9sZFZhbHVlLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCQlPYmplY3QgZWxlbWVudCA9IGl0ZXIubmV4dCgpOwotCQkJCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgRU9iamVjdCkgewotCQkJCQkJCQlpZiAoKChFT2JqZWN0KSBlbGVtZW50KS5lQ29udGFpbmVyKCkgPT0gbnVsbCkgewotCQkJCQkJCQkJZGVsZXRlZEVsZW1lbnRzLmFkZChlbGVtZW50KTsKLQkJCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJCXJlbW92ZWRSZWZlcmVuY2VzLmFkZChlbGVtZW50KTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlpZiAoIWRlbGV0ZWRFbGVtZW50cy5pc0VtcHR5KCkpIHsKLQkJCQkJCS8vIFR3byBvciBtb3JlIG1ldGhvZCBlbGVtZW50cyBoYXZlIGJlZW4gZGVsZXRlZC4KLQkJCQkJCW5vdGlmeUxpc3RlbmVycyhJTGlicmFyeUNoYW5nZUxpc3RlbmVyLk9QVElPTl9ERUxFVEVELAotCQkJCQkJCQlkZWxldGVkRWxlbWVudHMpOwotCQkJCQl9Ci0JCQkJCWlmICghcmVtb3ZlZFJlZmVyZW5jZXMuaXNFbXB0eSgpKSB7Ci0JCQkJCQkvLyBUd28gb3IgbW9yZSBtZXRob2QgZWxlbWVudCByZWZlcmVuY2UgaGFzIGJlZW4KLQkJCQkJCS8vIGRlbGV0ZWQuCi0JCQkJCQlub3RpZnlMaXN0ZW5lcnMoSUxpYnJhcnlDaGFuZ2VMaXN0ZW5lci5PUFRJT05fQ0hBTkdFRCwKLQkJCQkJCQkJcmVtb3ZlZFJlZmVyZW5jZXMpOwotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9OwotCi0JLy8gTGlzdGVuIHRvIG1hbmFnZWQgbWV0aG9kIGxpYnJhcnkgcmVzb3VyY2UgY2hhbmdlcy4KLQlwcml2YXRlIEFkYXB0ZXIgcmVzb3VyY2VDaGFuZ2VkTGlzdGVuZXIgPSBuZXcgQWRhcHRlckltcGwoKSB7Ci0JCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG1zZykgewotCQkJaWYgKGRlYnVnKSB7Ci0JCQkJRGVidWdUcmFjZS5wcmludCh0aGlzLCAibm90aWZ5Q2hhbmdlZCIsICJtc2c9IiArIG1zZyk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJfQotCQkJaWYgKG1zZy5nZXRGZWF0dXJlSUQobnVsbCkgPT0gUmVzb3VyY2UuUkVTT1VSQ0VfX0lTX01PRElGSUVECi0JCQkJCSYmIG1zZy5nZXRFdmVudFR5cGUoKSA9PSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb24uU0VUKSB7Ci0JCQkJZmlyZVByb3BlcnR5Q2hhbmdlKG1zZy5nZXROb3RpZmllcigpLCBQUk9QX0RJUlRZKTsKLQkJCX0KLQkJfQotCX07Ci0KLQkvLyBMaXN0ZW4gdG8gcGVyc2lzdGVuY2UgcmVmcmVzaCBldmVudHMuCi0JcHJpdmF0ZSBJUmVmcmVzaExpc3RlbmVyIHJlZnJlc2hMaXN0ZW5lciA9IG5ldyBJUmVmcmVzaExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBub3RpZnlSZWZyZXNoZWQoSVJlZnJlc2hFdmVudCBldmVudCkgewotCQkJaWYgKGRlYnVnKSB7Ci0JCQkJRGVidWdUcmFjZS5wcmludCh0aGlzLCAibm90aWZ5UmVmcmVzaGVkIiwgImV2ZW50PSIgKyBldmVudCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJfQotCQkJaGFuZGxlUmVmcmVzaEV2ZW50KGV2ZW50KTsKLQkJfQotCX07Ci0KLQkvLyBMaXN0ZW4gdG8gcHJlZmVyZW5jZSBzdG9yZSBjaGFuZ2VzLgotCXByaXZhdGUgSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJXcmFwcGVyIHByZWZlcmVuY2VTdG9yZUNoYW5nZUxpc3RlbmVyID0gbmV3IElQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyV3JhcHBlcigpIHsKLQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2UoSVByb3BlcnR5Q2hhbmdlRXZlbnRXcmFwcGVyIGV2ZW50KSB7Ci0JCQlpZiAoZXZlbnQuZ2V0UHJvcGVydHkoKS5lcXVhbHMoCi0JCQkJCUxpYnJhcnlQcmVmZXJlbmNlcy5ESVNDQVJEX1VOUkVTT0xWRURfUkVGRVJFTkNFUykpIHsKLQkJCQlzYXZlT3B0aW9ucy5wdXQoCi0JCQkJCQlNdWx0aUZpbGVYTUlTYXZlSW1wbC5ESVNDQVJEX1VOUkVTT0xWRURfUkVGRVJFTkNFUywKLQkJCQkJCWV2ZW50LmdldE5ld1ZhbHVlKCkpOwotCQkJfQotCQl9Ci0JfTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIEFic3RyYWN0TGlicmFyeU1hbmFnZXIoKSB7Ci0JCWluaXQoKTsKLQl9Ci0KLQkvKioKLQkgKiBQZXJmb3JtcyB0aGUgbmVjZXNzYXJ5IGluaXRpYWxpemF0aW9uLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXQoKSB7Ci0JCWlmIChkZWJ1ZykgewotCQkJRGVidWdUcmFjZS5wcmludCh0aGlzLCAiaW5pdCIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlMaWJyYXJ5UGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKQotCQkJCS5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKHByZWZlcmVuY2VTdG9yZUNoYW5nZUxpc3RlbmVyKTsKLQotCQkvLyBDcmVhdGUgdGhlIGFkYXB0ZXIgZmFjdG9yeS4KLQkJTGlzdCBmYWN0b3JpZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZhY3Rvcmllcy5hZGQobmV3IFJlc291cmNlSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSk7Ci0JCWZhY3Rvcmllcy5hZGQobmV3IFJlZmxlY3RpdmVJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpKTsKLQkJQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSA9IG5ldyBDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KAotCQkJCWZhY3Rvcmllcyk7Ci0KLQkJLy8gQ3JlYXRlIHRoZSBjb21tYW5kIHN0YWNrLgotCQlCYXNpY0NvbW1hbmRTdGFjayBjb21tYW5kU3RhY2sgPSBuZXcgQmFzaWNDb21tYW5kU3RhY2soKTsKLQotCQkvLyBDcmVhdGUgdGhlIHJlc291cmNlIHNldC4KLQkJSUxpYnJhcnlSZXNvdXJjZVNldCByZXNvdXJjZVNldCA9IGNyZWF0ZVJlc291cmNlU2V0KCk7Ci0JCXJlc291cmNlU2V0LmFkZFJlZnJlc2hMaXN0ZW5lcihyZWZyZXNoTGlzdGVuZXIpOwotCQlSZWZyZXNoSm9iLmdldEluc3RhbmNlKCkuc2V0UmVzb3VyY2VTZXQocmVzb3VyY2VTZXQpOwotCi0JCS8vIEluaXRpYWxpemUgdGhlIGxpYnJhcnkgc2F2ZSBvcHRpb25zLgotCQlzYXZlT3B0aW9ucyA9IHJlc291cmNlU2V0LmdldERlZmF1bHRTYXZlT3B0aW9ucygpOwotCQlzYXZlT3B0aW9ucy5wdXQoTXVsdGlGaWxlWE1JU2F2ZUltcGwuRElTQ0FSRF9VTlJFU09MVkVEX1JFRkVSRU5DRVMsCi0JCQkJTGlicmFyeVByZWZlcmVuY2VzLmdldERpc2NhcmRVbnJlc29sdmVkUmVmZXJlbmNlcygpKTsKLQotCQkvLyBDcmVhdGUgdGhlIGVkaXRpbmcgZG9tYWluLgotCQllZGl0aW5nRG9tYWluID0gbmV3IEFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbihhZGFwdGVyRmFjdG9yeSwKLQkJCQljb21tYW5kU3RhY2ssIHJlc291cmNlU2V0KTsKLQotCQkvLyBSZWdpc3RlciB0aGUgZWRpdGluZyBkb21haW4uCi0JCXJlZ2lzdGVyRWRpdGluZ0RvbWFpbihlZGl0aW5nRG9tYWluKTsKLQotCX0KLQotCS8qKgotCSAqIFNhdmVzIHRoZSBtYW5hZ2VkIG1ldGhvZCBsaWJyYXJ5LgotCSAqIAotCSAqIEB0aHJvdyA8Y29kZT5MaWJyYXJ5U2VydmljZUV4Y2VwdGlvbjwvY29kZT4gaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlCi0JICogICAgICAgIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHNhdmVNZXRob2RMaWJyYXJ5KCkgdGhyb3dzIExpYnJhcnlTZXJ2aWNlRXhjZXB0aW9uIHsKLQkJaWYgKGRlYnVnKSB7Ci0JCQlEZWJ1Z1RyYWNlLnByaW50KHRoaXMsICJzYXZlTWV0aG9kTGlicmFyeSIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQl0cnkgewotCQkJaWYgKGxpYnJhcnkgIT0gbnVsbCkgewotCQkJCXNraXBFdmVudFByb2Nlc3NpbmcgPSB0cnVlOwotCi0JCQkJSUxpYnJhcnlSZXNvdXJjZVNldCByZXNvdXJjZVNldCA9ICgoSUxpYnJhcnlSZXNvdXJjZVNldCkgZWRpdGluZ0RvbWFpbgotCQkJCQkJLmdldFJlc291cmNlU2V0KCkpOwotCQkJCXJlc291cmNlU2V0LnNhdmUoc2F2ZU9wdGlvbnMpOwotCi0JCQkJKChCYXNpY0NvbW1hbmRTdGFjaykgZWRpdGluZ0RvbWFpbi5nZXRDb21tYW5kU3RhY2soKSkKLQkJCQkJCS5zYXZlSXNEb25lKCk7Ci0KLQkJCQlza2lwRXZlbnRQcm9jZXNzaW5nID0gZmFsc2U7Ci0KLQkJCQlmaXJlUHJvcGVydHlDaGFuZ2UobGlicmFyeSwgUFJPUF9ESVJUWSk7Ci0KLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBMaWJyYXJ5U2VydmljZUV4Y2VwdGlvbihlKTsKLQkJfSBmaW5hbGx5IHsKLQkJCXNraXBFdmVudFByb2Nlc3NpbmcgPSBmYWxzZTsKLQkJfQotCX0KLQotCS8qKgotCSAqIERpc2NhcmRzIGFsbCBjaGFuZ2VzIG1hZGUgdG8gdGhlIG1hbmFnZWQgbWV0aG9kIGxpYnJhcnkuCi0JICovCi0JcHVibGljIHZvaWQgZGlzY2FyZE1ldGhvZExpYnJhcnlDaGFuZ2VzKCkgewotCQlpZiAoZGVidWcpIHsKLQkJCURlYnVnVHJhY2UucHJpbnQodGhpcywgImRpc2NhcmRNZXRob2RMaWJyYXJ5Q2hhbmdlcyIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gZ2V0RWRpdGluZ0RvbWFpbigpLmdldFJlc291cmNlU2V0KCkuZ2V0UmVzb3VyY2VzKCkKLQkJCQkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSAoUmVzb3VyY2UpIGl0Lm5leHQoKTsKLQkJCXJlc291cmNlLnNldE1vZGlmaWVkKGZhbHNlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENsb3NlcyB0aGUgbWFuYWdlZCBtZXRob2QgbGlicmFyeS4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgbWV0aG9kIGxpYnJhcnkKLQkgKiBAdGhyb3cgPGNvZGU+TGlicmFyeVNlcnZpY2VFeGNlcHRpb248L2NvZGU+IGlmIGFuIGVycm9yIG9jY3VycyB3aGlsZQotCSAqICAgICAgICBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBjbG9zZU1ldGhvZExpYnJhcnkoKSB0aHJvd3MgTGlicmFyeVNlcnZpY2VFeGNlcHRpb24gewotCQlpZiAoZGVidWcpIHsKLQkJCVN0cmluZyBtc2cgPSAibGlicmFyeT0iICsgbGlicmFyeSArICIsIG1lbW9yeSBvbiBlbnRyeT0iIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkrIChSdW50aW1lLmdldFJ1bnRpbWUoKS50b3RhbE1lbW9yeSgpIC0gUnVudGltZQotCQkJCQkJCS5nZXRSdW50aW1lKCkuZnJlZU1lbW9yeSgpKTsKLQkJCURlYnVnVHJhY2UucHJpbnQodGhpcywgImNsb3NlTWV0aG9kTGlicmFyeSIsIG1zZyk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCS8vIFN0cmluZyBsaWJQYXRoID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKQotCQkvLyAuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnlQYXRoKCk7Ci0JCUZpbGUgbGliRmlsZSA9IG5ldyBGaWxlKGxpYnJhcnkuZVJlc291cmNlKCkuZ2V0VVJJKCkudG9GaWxlU3RyaW5nKCkpOwotCQlTdHJpbmcgbGliUGF0aCA9IGxpYkZpbGUuZ2V0UGFyZW50RmlsZSgpLmdldEFic29sdXRlUGF0aCgpOwotCi0JCS8vIHJlbW92ZSB0aGUgY29uZmlndXJhdGlvbiBtYW5hZ2VycyBhc3NvY2lhdGVkIHdpdGggdGhpcyBsaWJyYXJ5Ci0JCUxpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkucmVtb3ZlQ29uZmlndXJhdGlvbk1hbmFnZXJzKGxpYnJhcnkpOwotCi0JCXJlbW92ZVJlc291cmNlQ2hhbmdlZExpc3RlbmVycygpOwotCi0JCS8vIENsZWFyIHRoZSB0ZW1wIGxheW91dCByZXNvdXJjZXMuCi0JCUxheW91dFJlc291cmNlcy5jbGVhcigpOwotCQkKLQkJU3VwcHJlc3Npb24uY2xlYXJDYWNoZWRTdXBwcmVzc2lvbnMoKTsKLQotCQlUbmdVdGlsLnVtYUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LmRpc3Bvc2UoKTsKLQotCQlJTGlicmFyeVJlc291cmNlU2V0IHJlc291cmNlU2V0ID0gKElMaWJyYXJ5UmVzb3VyY2VTZXQpIGVkaXRpbmdEb21haW4KLQkJCQkuZ2V0UmVzb3VyY2VTZXQoKTsKLQkJcmVzb3VyY2VTZXQudW5sb2FkKCk7Ci0KLQkJdHJ5IHsKLQkJCS8vIENsb3NlIHRoZSBtZXRob2QgbGlicmFyeSBwcm9qZWN0IGZpbGUuCi0JCQlNZXRob2RMaWJyYXJ5UHJvamVjdC5jbG9zZVByb2plY3QobGliUGF0aCwgbnVsbCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgTGlicmFyeVNlcnZpY2VFeGNlcHRpb24oZSk7Ci0JCX0gCi0KLQkJUmVmcmVzaEpvYi5nZXRJbnN0YW5jZSgpLnJlc2V0KCk7Ci0KLQkJLy8gQWN0aXZhdGVzIHRoZSBnYXJiYWdlIGNvbGxlY3Rvci4KLQkJUnVudGltZS5nZXRSdW50aW1lKCkuZ2MoKTsKLQotCQlpZiAoZGVidWcpIHsKLQkJCVN0cmluZyBtc2cgPSAibGlicmFyeT0iICsgbGlicmFyeSArICIsIG1lbW9yeSBvbiBleGl0PSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCSsgKFJ1bnRpbWUuZ2V0UnVudGltZSgpLnRvdGFsTWVtb3J5KCkgLSBSdW50aW1lCi0JCQkJCQkJLmdldFJ1bnRpbWUoKS5mcmVlTWVtb3J5KCkpOwotCQkJRGVidWdUcmFjZS5wcmludCh0aGlzLCAiY2xvc2VNZXRob2RMaWJyYXJ5IiwgbXNnKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgbWFuYWdlZCBtZXRob2QgbGlicmFyeS4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgbWV0aG9kIGxpYnJhcnkKLQkgKi8KLQlwdWJsaWMgTWV0aG9kTGlicmFyeSBnZXRNZXRob2RMaWJyYXJ5KCkgewotCQlpZiAoZGVidWcpIHsKLQkJCURlYnVnVHJhY2UucHJpbnQodGhpcywgImdldE1ldGhvZExpYnJhcnkiLCAibGlicmFyeT0iICsgbGlicmFyeSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0KLQkJcmV0dXJuIGxpYnJhcnk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgbWFuYWdlZCBtZXRob2QgbGlicmFyeS4KLQkgKiAKLQkgKiBAcGFyYW0gbGlicmFyeQotCSAqICAgICAgICAgICAgYSBtZXRob2QgbGlicmFyeQotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1ldGhvZExpYnJhcnkoTWV0aG9kTGlicmFyeSBsaWJyYXJ5KSB7Ci0JCWlmIChkZWJ1ZykgewotCQkJRGVidWdUcmFjZS5wcmludCh0aGlzLCAic2V0TWV0aG9kTGlicmFyeSIsICJsaWJyYXJ5PSIgKyBsaWJyYXJ5KTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQotCQlpZiAodGhpcy5saWJyYXJ5ICE9IG51bGwpIHsKLQkJCVJlc291cmNlIHJlc291cmNlID0gKFJlc291cmNlKSB0aGlzLmxpYnJhcnkuZVJlc291cmNlKCk7Ci0JCQlpZiAocmVzb3VyY2UgIT0gbnVsbCkgewotCQkJCXJlc291cmNlLmdldENvbnRlbnRzKCkuY2xlYXIoKTsKLQkJCQlyZXNvdXJjZS5nZXRDb250ZW50cygpLmFkZChsaWJyYXJ5KTsKLQkJCX0KLQkJfQotCi0JCXRoaXMubGlicmFyeSA9IGxpYnJhcnk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgYWRhcHRlciBmYWN0b3J5IGZvciB0aGUgbWFuYWdlZCBtZXRob2QgbGlicmFyeS4KLQkgKiAKLQkgKiBAcmV0dXJuIGFuIGFkYXB0ZXIgZmFjdG9yeQotCSAqLwotCXB1YmxpYyBDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IGdldEFkYXB0ZXJGYWN0b3J5KCkgewotCQlpZiAoZGVidWcpIHsKLQkJCURlYnVnVHJhY2UucHJpbnQodGhpcywgImdldEFkYXB0ZXJGYWN0b3J5Iik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCXJldHVybiAoQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSkgZ2V0RWRpdGluZ0RvbWFpbigpLmdldEFkYXB0ZXJGYWN0b3J5KCk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgZWRpdGluZyBkb21haW4gZm9yIHRoZSBtYW5hZ2VkIG1ldGhvZCBsaWJyYXJ5LgotCSAqIAotCSAqIEByZXR1cm4gYW4gZWRpdGluZyBkb21haW4KLQkgKi8KLQlwdWJsaWMgQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluIGdldEVkaXRpbmdEb21haW4oKSB7Ci0JCWlmIChkZWJ1ZykgewotCQkJRGVidWdUcmFjZS5wcmludCh0aGlzLAotCQkJCQkiZ2V0RWRpdGluZ0RvbWFpbiIsICJlZGl0aW5nRG9tYWluPSIgKyBlZGl0aW5nRG9tYWluKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQotCQlyZXR1cm4gZWRpdGluZ0RvbWFpbjsKLQl9Ci0KLQkvKioKLQkgKiBSZWdpc3RlcnMgYW4gZWRpdGluZyBkb21haW4gd2l0aCB0aGUgbWFuYWdlZCBtZXRob2QgbGlicmFyeS4KLQkgKiAKLQkgKiBAcGFyYW0gZG9tYWluCi0JICogICAgICAgICAgICBhbiBlZGl0aW5nIGRvbWFpbgotCSAqLwotCXB1YmxpYyB2b2lkIHJlZ2lzdGVyRWRpdGluZ0RvbWFpbihBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW4gZG9tYWluKSB7Ci0JCWlmIChkZWJ1ZykgewotCQkJRGVidWdUcmFjZS5wcmludCh0aGlzLCAicmVnaXN0ZXJFZGl0aW5nRG9tYWluIiwgImRvbWFpbj0iICsgZG9tYWluKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQotCQkvLyBBZGQgYSBsaXN0ZW5lciB0byBtb25pdG9yIGxpYnJhcnkgY2hhbmdlcyBtYWRlIGluIHRoZSBnaXZlbiBlZGl0aW5nCi0JCS8vIGRvbWFpbi4KLQkJKChDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KSBkb21haW4uZ2V0QWRhcHRlckZhY3RvcnkoKSkKLQkJCQkuYWRkTGlzdGVuZXIobm90aWZ5Q2hhbmdlZExpc3RlbmVyKTsKLQotCQkvLyBBZGQgYSBsaXN0ZW5lciB0byBtb25pdG9yIGNoYW5nZXMgbWFkZSB0byB0aGUgY29tbWFuZCBzdGFjay4KLQkJLy8gVGhpcyBpcyB1c2VkIHRvIHNlbGVjdCB0aGUgbW9zdCByZWNlbnRseSBhZmZlY3RlZCBvYmplY3RzIGluIHRoZQotCQkvLyB2aWV3ZXIuCi0JCWRvbWFpbi5nZXRDb21tYW5kU3RhY2soKS5hZGRDb21tYW5kU3RhY2tMaXN0ZW5lcihjb21tYW5kU3RhY2tMaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogQWRkcyBhIGxpc3RlbmVyIHRvIG1vbml0b3IgY2hhbmdlcyB0byB0aGUgbWFuYWdlZCBtZXRob2QgbGlicmFyeS4KLQkgKiAKLQkgKiBAcGFyYW0gbGlzdGVuZXIKLQkgKiAgICAgICAgICAgIGEgbGlicmFyeSBjaGFuZ2UgbGlzdGVuZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcihJTGlicmFyeUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXN5bmNocm9uaXplZCAobGlicmFyeUNoYW5nZWRMaXN0ZW5lcnMpIHsKLQkJCWlmIChkZWJ1ZykgewotCQkJCURlYnVnVHJhY2UucHJpbnQodGhpcywgImFkZExpc3RlbmVyIiwgImxpc3RlbmVyPSIgKyBsaXN0ZW5lcik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJfQotCi0JCQlpZiAoIWxpYnJhcnlDaGFuZ2VkTGlzdGVuZXJzLmNvbnRhaW5zKGxpc3RlbmVyKSkgewotCQkJCWxpYnJhcnlDaGFuZ2VkTGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmVzIGEgbGlzdGVuZXIgdGhhdCB3YXMgYWRkZWQgdG8gbW9uaXRvciBjaGFuZ2VzIHRvIHRoZSBtYW5hZ2VkCi0JICogbWV0aG9kIGxpYnJhcnkuCi0JICogCi0JICogQHBhcmFtIGxpc3RlbmVyCi0JICogICAgICAgICAgICBhIGxpYnJhcnkgY2hhbmdlIGxpc3RlbmVyCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHJlbW92ZUxpc3RlbmVyKElMaWJyYXJ5Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJaWYgKGRlYnVnKSB7Ci0JCQlEZWJ1Z1RyYWNlCi0JCQkJCS5wcmludCh0aGlzLCAicmVtb3ZlTGlzdGVuZXIiLCAibGlzdGVuZXI9IiArIGxpc3RlbmVyKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQotLy8JCQkvLyBDYWNoZSB0aGUgbGlzdGVuZXIgYW5kIHJlbW92ZSBpdCBqdXN0IGJlZm9yZSBkaXNwYXRjaGluZyB0aGUKLS8vCQkJLy8gbGlicmFyeSBjaGFuZ2VkIGV2ZW50cy4KLS8vCQkJaWYgKCFkZXRhY2hlZExpYnJhcnlDaGFuZ2VkTGlzdGVuZXJzLmNvbnRhaW5zKGxpc3RlbmVyKSkgewotLy8JCQkJZGV0YWNoZWRMaWJyYXJ5Q2hhbmdlZExpc3RlbmVycy5hZGQobGlzdGVuZXIpOwotLy8JCQl9Ci0JCQotCQlpZihsaXN0ZW5lciAhPSBudWxsKSB7Ci0JCQlzeW5jaHJvbml6ZWQgKGxpYnJhcnlDaGFuZ2VkTGlzdGVuZXJzKSB7Ci0JCQkJbGlicmFyeUNoYW5nZWRMaXN0ZW5lcnMucmVtb3ZlKGxpc3RlbmVyKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEFkZHMgYSBsaXN0ZW5lciB0byBtb25pdG9yIHJlc291cmNlIGNoYW5nZXMgaW4gdGhlIG1hbmFnZWQgbWV0aG9kCi0JICogbGlicmFyeS4KLQkgKiAKLQkgKiBAcGFyYW0gbGlzdGVuZXIKLQkgKiAgICAgICAgICAgIGEgcHJvcGVydHkgY2hhbmdlIGxpc3RlbmVyCi0JICovCi0JcHVibGljIHZvaWQgYWRkUHJvcGVydHlMaXN0ZW5lcihJUHJvcGVydHlMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlpZiAoZGVidWcpIHsKLQkJCURlYnVnVHJhY2UucHJpbnQodGhpcywKLQkJCQkJImFkZFByb3BlcnR5TGlzdGVuZXIiLCAibGlzdGVuZXI9IiArIGxpc3RlbmVyKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQotCQlyZXNvdXJjZUNoYW5nZUxpc3RlbmVycy5hZGQobGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZXMgYSBsaXN0ZW5lciB0aGF0IHdhcyBhZGRlZCB0byBtb25pdG9yIHJlc291cmNlIGNoYW5nZXMgaW4gdGhlCi0JICogbWFuYWdlZCBtZXRob2QgbGlicmFyeS4KLQkgKiAKLQkgKiBAcGFyYW0gbGlzdGVuZXIKLQkgKiAgICAgICAgICAgIGEgcHJvcGVydHkgY2hhbmdlIGxpc3RlbmVyCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlUHJvcGVydHlMaXN0ZW5lcihJUHJvcGVydHlMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlpZiAoZGVidWcpIHsKLQkJCURlYnVnVHJhY2UucHJpbnQodGhpcywKLQkJCQkJInJlbW92ZVByb3BlcnR5TGlzdGVuZXIiLCAibGlzdGVuZXI9IiArIGxpc3RlbmVyKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQotCQlyZXNvdXJjZUNoYW5nZUxpc3RlbmVycy5yZW1vdmUobGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIFN0YXJ0cyBsaXN0ZW5pbmcgdG8gY29tbWFuZCBwcm9jZXNzaW5nIG9uIGEgY29tbWFuZCBzdGFjay4KLQkgKiAKLQkgKiBAcGFyYW0gY29tbWFuZFN0YWNrCi0JICogICAgICAgICAgICBhIGNvbW1hbmQgc3RhY2sKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydExpc3RlbmluZ1RvKENvbW1hbmRTdGFjayBjb21tYW5kU3RhY2spIHsKLQkJaWYgKGRlYnVnKSB7Ci0JCQlEZWJ1Z1RyYWNlLnByaW50KHRoaXMsCi0JCQkJCSJzdGFydExpc3RlbmluZ1RvIiwgImNvbW1hbmRTdGFjaz0iICsgY29tbWFuZFN0YWNrKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQotCQljb21tYW5kU3RhY2suYWRkQ29tbWFuZFN0YWNrTGlzdGVuZXIoY29tbWFuZFN0YWNrTGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIFN0b3BzIGxpc3RlbmluZyB0byBjb21tYW5kIHByb2Nlc3Npbmcgb24gYSBjb21tYW5kIHN0YWNrLgotCSAqIAotCSAqIEBwYXJhbSBjb21tYW5kU3RhY2sKLQkgKiAgICAgICAgICAgIGEgY29tbWFuZCBzdGFjawotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3BMaXN0ZW5pbmdUbyhDb21tYW5kU3RhY2sgY29tbWFuZFN0YWNrKSB7Ci0JCWlmIChkZWJ1ZykgewotCQkJRGVidWdUcmFjZS5wcmludCh0aGlzLAotCQkJCQkic3RvcExpc3RlbmluZ1RvIiwgImNvbW1hbmRTdGFjaz0iICsgY29tbWFuZFN0YWNrKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQotCQljb21tYW5kU3RhY2sucmVtb3ZlQ29tbWFuZFN0YWNrTGlzdGVuZXIoY29tbWFuZFN0YWNrTGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIFN0YXJ0cyBsaXN0ZW5pbmcgdG8gY2hhbmdlIG5vdGlmaWNhdGlvbnMgc2VudCBmcm9tIGFuIGFkYXB0ZXIgZmFjdG9yeS4KLQkgKiAKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKiAgICAgICAgICAgIGFuIGFkYXB0ZXIgZmFjdG9yeQotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0TGlzdGVuaW5nVG8oQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlpZiAoZGVidWcpIHsKLQkJCURlYnVnVHJhY2UucHJpbnQodGhpcywKLQkJCQkJInN0YXJ0TGlzdGVuaW5nVG8iLCAiYWRhcHRlckZhY3Rvcnk9IiArIGFkYXB0ZXJGYWN0b3J5KTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQotCQlhZGFwdGVyRmFjdG9yeS5hZGRMaXN0ZW5lcihub3RpZnlDaGFuZ2VkTGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIFN0b3BzIGxpc3RlbmluZyB0byBjaGFuZ2Ugbm90aWZpY2F0aW9ucyBzZW50IGZyb20gYW4gYWRhcHRlciBmYWN0b3J5LgotCSAqIAotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqICAgICAgICAgICAgYW4gYWRhcHRlciBmYWN0b3J5Ci0JICovCi0JcHVibGljIHZvaWQgc3RvcExpc3RlbmluZ1RvKENvbXBvc2VkQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJaWYgKGRlYnVnKSB7Ci0JCQlEZWJ1Z1RyYWNlLnByaW50KHRoaXMsCi0JCQkJCSJzdG9wTGlzdGVuaW5nVG8iLCAiYWRhcHRlckZhY3Rvcnk9IiArIGFkYXB0ZXJGYWN0b3J5KTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQotCQlhZGFwdGVyRmFjdG9yeS5yZW1vdmVMaXN0ZW5lcihub3RpZnlDaGFuZ2VkTGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIEdldHMgYSBtZXRob2QgZWxlbWVudCBmcm9tIHRoZSBtYW5hZ2VkIG1ldGhvZCBsaWJyYXJ5LgotCSAqIAotCSAqIEBwYXJhbSBndWlkCi0JICogICAgICAgICAgICB0aGUgbWV0aG9kIGVsZW1lbnQncyBHVUlELgotCSAqIAotCSAqIEByZXR1cm4gYSBtZXRob2QgZWxlbWVudCBvZiA8Y29kZT5udWxsPC9jb2RlPgotCSAqLwotCXB1YmxpYyBNZXRob2RFbGVtZW50IGdldE1ldGhvZEVsZW1lbnQoU3RyaW5nIGd1aWQpIHsKLS8vIHRoaXMgcHJpbnRlZCBvdXQgdG9vIG11Y2ggdXNlbGVzcyBpbmZvcm1hdGlvbiwgY29tbWVudCBvdXQKLS8vCQlpZiAoZGVidWcpIHsKLS8vCQkJRGVidWdUcmFjZS5wcmludCh0aGlzLCAiZ2V0TWV0aG9kRWxlbWVudCIsICJndWlkPSIgKyBndWlkKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0vLwkJfQotCi0JCXRyeSB7Ci0JCQlJTGlicmFyeVJlc291cmNlU2V0IHJlc291cmNlU2V0ID0gKElMaWJyYXJ5UmVzb3VyY2VTZXQpIGxpYnJhcnkKLQkJCQkJLmVSZXNvdXJjZSgpLmdldFJlc291cmNlU2V0KCk7Ci0JCQlpZiAocmVzb3VyY2VTZXQgIT0gbnVsbCkgewotCQkJCXJldHVybiAoTWV0aG9kRWxlbWVudCkgcmVzb3VyY2VTZXQuZ2V0RU9iamVjdChndWlkKTsKLQkJCX0KLQkJfSBjYXRjaCAoVGhyb3dhYmxlIHRoKSB7Ci0JCQkvLyBMb2cgZXJyb3IgaGVyZQotCQkJdGgucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgcmVsYXRpdmUgVVJJIG9mIGEgbWV0aG9kIGVsZW1lbnQgaW4gdGhlIG1hbmFnZWQgbWV0aG9kIGxpYnJhcnkuCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGVsZW1lbnQKLQkgKiBAcmV0dXJuIGEgcmVsYXRpdmUgVVJJCi0JICovCi0JcHVibGljIFVSSSBnZXRFbGVtZW50UmVsYXRpdmVVUkkoTWV0aG9kRWxlbWVudCBlbGVtZW50KSB7Ci0JCWlmIChkZWJ1ZykgewotCQkJRGVidWdUcmFjZS5wcmludCh0aGlzLAotCQkJCQkiZ2V0RWxlbWVudFJlbGF0aXZlVVJJIiwgImVsZW1lbnQ9IiArIGVsZW1lbnQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCi0JCWlmIChlbGVtZW50ICE9IG51bGwpIHsKLQkJCVJlc291cmNlIHJlc291cmNlID0gbGlicmFyeS5lUmVzb3VyY2UoKTsKLQkJCWlmIChyZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQkJVVJJIGxpYnJhcnlVUkkgPSByZXNvdXJjZS5nZXRVUkkoKTsKLQkJCQlVUkkgZWxlbWVudFVSSSA9IGVsZW1lbnQuZVJlc291cmNlKCkuZ2V0VVJJKCk7Ci0JCQkJcmV0dXJuIGVsZW1lbnRVUkkuZGVyZXNvbHZlKGxpYnJhcnlVUkkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENoZWNrcyB3aGV0aGVyIHRoZSBtYW5hZ2VkIG1ldGhvZCBsaWJyYXJ5IGlzIHJlYWQgb25seS4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBtZXRob2QgbGlicmFyeSBpcyByZWFkIG9ubHkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc01ldGhvZExpYnJhcnlSZWFkT25seSgpIHsKLQkJaWYgKGRlYnVnKSB7Ci0JCQlEZWJ1Z1RyYWNlLnByaW50KHRoaXMsICJpc01ldGhvZExpYnJhcnlSZWFkT25seSIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlVUkkgbGlicmFyeVVSSSA9IGxpYnJhcnkuZVJlc291cmNlKCkuZ2V0VVJJKCk7Ci0JCWlmIChsaWJyYXJ5VVJJLmlzRmlsZSgpKSB7Ci0JCQlGaWxlIGxpYnJhcnlYTUlGaWxlID0gbmV3IEZpbGUobGlicmFyeVVSSS50b0ZpbGVTdHJpbmcoKSk7Ci0JCQlyZXR1cm4gbGlicmFyeVhNSUZpbGUuZXhpc3RzKCkgJiYgIWxpYnJhcnlYTUlGaWxlLmNhbldyaXRlKCk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIENoZWNrcyB3aGV0aGVyIHRoZSBtYW5hZ2VkIG1ldGhvZCBsaWJyYXJ5IGNvbnRlbnQgaGFzIGJlZW4gbW9kaWZpZWQuCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgbWFuYWdlZCBtZXRob2QgbGlicmFyeSBjb250ZW50IGhhcwotCSAqICAgICAgICAgYmVlbiBtb2RpZmllZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzTWV0aG9kTGlicmFyeU1vZGlmaWVkKCkgewotCQlpZiAoZGVidWcpIHsKLQkJCURlYnVnVHJhY2UucHJpbnQodGhpcywgImlzTWV0aG9kTGlicmFyeU1vZGlmaWVkIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCWZvciAoSXRlcmF0b3IgaXQgPSBnZXRFZGl0aW5nRG9tYWluKCkuZ2V0UmVzb3VyY2VTZXQoKS5nZXRSZXNvdXJjZXMoKQotCQkJCS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlSZXNvdXJjZSByZXNvdXJjZSA9IChSZXNvdXJjZSkgaXQubmV4dCgpOwotCQkJaWYgKHJlc291cmNlLmlzTW9kaWZpZWQoKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBDaGVja3Mgd2hldGhlciB0aGUgbWFuYWdlZCBtZXRob2QgbGlicmFyeSBoYXMgYW55IHVucmVzb2x2ZWQgcHJveHkuCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgbWFuYWdlZCBtZXRob2QgbGlicmFyeSBoYXMgYW4KLQkgKiAgICAgICAgIHVucmVzb2x2ZWQgcHJveHkuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzVW5yZXNvbHZlZFByb3h5KCkgewotCQlpZiAoZGVidWcpIHsKLQkJCURlYnVnVHJhY2UucHJpbnQodGhpcywgImhhc1VucmVzb2x2ZWRQcm94eSIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlJTGlicmFyeVJlc291cmNlU2V0IHJlc291cmNlU2V0ID0gKChJTGlicmFyeVJlc291cmNlU2V0KSBlZGl0aW5nRG9tYWluCi0JCQkJLmdldFJlc291cmNlU2V0KCkpOwotCQlyZXR1cm4gcmVzb3VyY2VTZXQuaGFzVW5yZXNvbHZlZFByb3h5KCk7Ci0JfQotCi0JLyoqCi0JICogUmVsb2FkcyB0aGUgZ2l2ZW4gcmVzb3VyY2VzLgotCSAqIAotCSAqIEBwYXJhbSByZXNvdXJjZXMKLQkgKiAgICAgICAgICAgIGEgY29sbGVjdGlvbiBvZiByZXNvdXJjZXMKLQkgKiBAcmV0dXJuIGEgY29sbGVjdGlvbiBvZiByZXNvdXJjZXMgdGhhdCBoYXZlIHJlbG9hZGVkCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gcmVsb2FkUmVzb3VyY2VzKGZpbmFsIENvbGxlY3Rpb24gcmVzb3VyY2VzKSB7Ci0JCWlmIChkZWJ1ZykgewotCQkJU3lzdGVtLm91dAotCQkJCQkucHJpbnRsbigiQWJzdHJhY3RMaWJyYXJ5TWFuYWdlci5yZWxvYWRSZXNvdXJjZXMoKTogU1RBUlQiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXRyeSB7Ci0JCQlmaW5hbCBBcnJheUxpc3QgcmVsb2FkZWRSZXNvdXJjZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlJV29ya3NwYWNlUnVubmFibGUgcnVubmFibGUgPSBuZXcgSVdvcmtzcGFjZVJ1bm5hYmxlKCkgewotCi0JCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkJCQlyZWxvYWRlZFJlc291cmNlcy5hZGRBbGwoZG9SZWxvYWRSZXNvdXJjZXMocmVzb3VyY2VzKSk7Ci0KLQkJCQl9Ci0KLQkJCX07Ci0JCQl0cnkgewotCQkJCVJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5ydW4ocnVubmFibGUsCi0JCQkJCQluZXcgTGlicmFyeVNjaGVkdWxpbmdSdWxlKGxpYnJhcnkpLAotCQkJCQkJSVdvcmtzcGFjZS5BVk9JRF9VUERBVEUsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlMaWJyYXJ5UGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCX0KLQkJCXJldHVybiByZWxvYWRlZFJlc291cmNlczsKLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChkZWJ1ZykgewotCQkJCVN5c3RlbS5vdXQKLQkJCQkJCS5wcmludGxuKCJBYnN0cmFjdExpYnJhcnlNYW5hZ2VyLmRvUmVsb2FkUmVzb3VyY2VzKCk6IEVORCIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIENvbGxlY3Rpb24gZG9SZWxvYWRSZXNvdXJjZXMoQ29sbGVjdGlvbiByZXNvdXJjZXMpIHsKLQkJaWYgKGRlYnVnKSB7Ci0JCQlEZWJ1Z1RyYWNlLnByaW50KHRoaXMsICJyZWxvYWRSZXNvdXJjZXMiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWlmIChsaWJyYXJ5ID09IG51bGwpIHsKLQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCQl9Ci0KLQkJLy8gY2hlY2sgaWYgcmVzb3VyY2VzIHRvIHJlbG9hZCBjb250YWlucyBhbnkgZWxlbWVudHMgY2FjaGVkIGluCi0JCS8vIExpYnJhcnlTZXJ2aWNlCi0JCS8vIHRvIHVwZGF0ZSB0aGVtCi0JCS8vCi0JCUxpYnJhcnlTZXJ2aWNlIGxpYlN2YyA9IChMaWJyYXJ5U2VydmljZSkgTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKTsKLQkJUmVzb3VyY2UgY3VycmVudExpYlJlc291cmNlID0gbnVsbDsKLQkJSUxpYnJhcnlNYW5hZ2VyIGN1cnJlbnRMaWJNZ3IgPSBudWxsOwotCQlSZXNvdXJjZSBjdXJyZW50Q29uZmlnUmVzb3VyY2UgPSBudWxsOwotCQlNZXRob2RDb25maWd1cmF0aW9uIGN1cnJlbnRDb25maWcgPSBudWxsOwotCQlMaXN0IGNvbmZpZ1Jlc291cmNlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJTGlzdCBjb25maWdzID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSByZXNvdXJjZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlSZXNvdXJjZSByZXNvdXJjZSA9IChSZXNvdXJjZSkgaXRlci5uZXh0KCk7Ci0JCQlNZXRob2RFbGVtZW50IGUgPSBQZXJzaXN0ZW5jZVV0aWwuZ2V0TWV0aG9kRWxlbWVudChyZXNvdXJjZSk7Ci0JCQlpZiAoZSA9PSBsaWJTdmMuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKSkgewotCQkJCWN1cnJlbnRMaWJNZ3IgPSBsaWJTdmMuZ2V0Q3VycmVudExpYnJhcnlNYW5hZ2VyKCk7Ci0JCQkJY3VycmVudExpYlJlc291cmNlID0gcmVzb3VyY2U7Ci0JCQl9IGVsc2UgaWYgKGUgPT0gbGliU3ZjLmdldEN1cnJlbnRNZXRob2RDb25maWd1cmF0aW9uKCkpIHsKLQkJCQljdXJyZW50Q29uZmlnUmVzb3VyY2UgPSByZXNvdXJjZTsKLQkJCQljdXJyZW50Q29uZmlnID0gbGliU3ZjLmdldEN1cnJlbnRNZXRob2RDb25maWd1cmF0aW9uKCk7Ci0JCQl9IGVsc2UgaWYgKGUgaW5zdGFuY2VvZiBNZXRob2RDb25maWd1cmF0aW9uKSB7Ci0JCQkJY29uZmlnUmVzb3VyY2VzLmFkZChyZXNvdXJjZSk7Ci0JCQkJY29uZmlncy5hZGQoZSk7Ci0JCQl9Ci0JCX0KLQotCQlJTGlicmFyeVJlc291cmNlU2V0IHJlc291cmNlU2V0ID0gKElMaWJyYXJ5UmVzb3VyY2VTZXQpIGxpYnJhcnkKLQkJCQkuZVJlc291cmNlKCkuZ2V0UmVzb3VyY2VTZXQoKTsKLQkJQ29sbGVjdGlvbiByZWxvYWRlZFJlc291cmNlcyA9IHJlc291cmNlU2V0LnJlbG9hZFJlc291cmNlcyhyZXNvdXJjZXMpOwotCQlpZiAoIXJlbG9hZGVkUmVzb3VyY2VzLmlzRW1wdHkoKSkgewotCQkJaWYgKGN1cnJlbnRMaWJSZXNvdXJjZSAhPSBudWxsIHx8IGN1cnJlbnRDb25maWdSZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQkJLy8gdXBkYXRlIGNhY2hlZCBlbGVtZW50cyBpbiBMaWJyYXJ5U2VydmljZSBhbmQgdGhpcyBsaWJyYXJ5Ci0JCQkJLy8gbWFuYWdlcgotCQkJCS8vCi0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gcmVsb2FkZWRSZXNvdXJjZXMuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSAoUmVzb3VyY2UpIGl0ZXIubmV4dCgpOwotCQkJCQlpZiAocmVzb3VyY2UgPT0gY3VycmVudExpYlJlc291cmNlKSB7Ci0JCQkJCQlNZXRob2RFbGVtZW50IGUgPSBQZXJzaXN0ZW5jZVV0aWwKLQkJCQkJCQkJLmdldE1ldGhvZEVsZW1lbnQocmVzb3VyY2UpOwotCQkJCQkJaWYgKGUgaW5zdGFuY2VvZiBNZXRob2RMaWJyYXJ5KSB7Ci0JCQkJCQkJTWV0aG9kTGlicmFyeSBuZXdMaWIgPSAoTWV0aG9kTGlicmFyeSkgZTsKLQkJCQkJCQlsaWJTdmMuc2V0Q3VycmVudE1ldGhvZExpYnJhcnkobmV3TGliKTsKLQkJCQkJCQlpZiAoY3VycmVudExpYk1nciBpbnN0YW5jZW9mIEFic3RyYWN0TGlicmFyeU1hbmFnZXIpIHsKLQkJCQkJCQkJbGliU3ZjLnJlbW92ZUxpYnJhcnlNYW5hZ2VyKGN1cnJlbnRMaWJNZ3IpOwotCQkJCQkJCQkoKEFic3RyYWN0TGlicmFyeU1hbmFnZXIpIGN1cnJlbnRMaWJNZ3IpCi0JCQkJCQkJCQkJLnVwZGF0ZU1ldGhvZExpYnJhcnkobmV3TGliKTsKLQkJCQkJCQkJbGliU3ZjLnNldExpYnJhcnlNYW5hZ2VyKGN1cnJlbnRMaWJNZ3IpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlpZiAocmVzb3VyY2UgPT0gY3VycmVudENvbmZpZ1Jlc291cmNlKSB7Ci0JCQkJCQlNZXRob2RFbGVtZW50IGUgPSBQZXJzaXN0ZW5jZVV0aWwKLQkJCQkJCQkJLmdldE1ldGhvZEVsZW1lbnQocmVzb3VyY2UpOwotCQkJCQkJaWYgKGUgaW5zdGFuY2VvZiBNZXRob2RDb25maWd1cmF0aW9uKSB7Ci0JCQkJCQkJLy8gcmVtb3ZlIGNvbmZpZyBtYW5hZ2VyIG9mIG9sZCBjdXJyZW50IGNvbmZpZwotCQkJCQkJCS8vCi0JCQkJCQkJbGliU3ZjLnJlbW92ZUNvbmZpZ3VyYXRpb25NYW5hZ2VyKGN1cnJlbnRDb25maWcpOwotCQkJCQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gKE1ldGhvZENvbmZpZ3VyYXRpb24pIGU7Ci0JCQkJCQkJbGliU3ZjLnNldEN1cnJlbnRNZXRob2RDb25maWd1cmF0aW9uKGNvbmZpZyk7Ci0JCQkJCQl9Ci0JCQkJCX0gZWxzZSBpZiAoIWNvbmZpZ1Jlc291cmNlcy5pc0VtcHR5KCkpIHsKLQkJCQkJCWludCBpZCA9IGNvbmZpZ1Jlc291cmNlcy5pbmRleE9mKHJlc291cmNlKTsKLQkJCQkJCWlmIChpZCAhPSAtMSkgewotCQkJCQkJCS8vIHJlbW92ZSBjb25maWcgbWFuYWdlciBvZiBvbGQgY29uZmlnCi0JCQkJCQkJLy8KLQkJCQkJCQlsaWJTdmMKLQkJCQkJCQkJCS5yZW1vdmVDb25maWd1cmF0aW9uTWFuYWdlcigoTWV0aG9kQ29uZmlndXJhdGlvbikgY29uZmlncwotCQkJCQkJCQkJCQkuZ2V0KGlkKSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCS8vIFRPRE86IFJldmlldyBpbXBsZW1lbnRhdGlvbi4KLQkJCVN1cHByZXNzaW9uLmNsZWFuVXAoKTsKLQkJfQotCQlyZXR1cm4gcmVsb2FkZWRSZXNvdXJjZXM7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIG5ld0xpYgotCSAqLwotCXByaXZhdGUgdm9pZCB1cGRhdGVNZXRob2RMaWJyYXJ5KE1ldGhvZExpYnJhcnkgbmV3TGliKSB7Ci0JCWxpYnJhcnkgPSBuZXdMaWI7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgb3B0aW9ucyB1c2VkIGZvciBzYXZpbmcgdGhlIG1hbmFnZWQgbWV0aG9kIGxpYnJhcnkuCi0JICogCi0JICogQHJldHVybiBhIG1hcCBvZiBtZXRob2QgbGlicmFyeSBzcGVjaWZpYyBzYXZlIG9wdGlvbnMKLQkgKi8KLQlwdWJsaWMgTWFwIGdldFNhdmVPcHRpb25zKCkgewotCQlpZiAoZGVidWcpIHsKLQkJCURlYnVnVHJhY2UucHJpbnQodGhpcywgImdldFNhdmVPcHRpb25zIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCXJldHVybiBzYXZlT3B0aW9uczsKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIGEgbmV3IG1ldGhvZCBwbHVnLWluIHRvIHRoZSBtYW5hZ2VkIG1ldGhvZCBsaWJyYXJ5LgotCSAqIAotCSAqIEBwYXJhbSBwbHVnaW4KLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIHBsdWctaW4KLQkgKiBAdGhyb3cgPGNvZGU+TGlicmFyeVNlcnZpY2VFeGNlcHRpb248L2NvZGU+IGlmIGFuIGVycm9yIG9jY3VycyB3aGlsZQotCSAqICAgICAgICBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRNZXRob2RQbHVnaW4oZmluYWwgTWV0aG9kUGx1Z2luIHBsdWdpbikKLQkJCXRocm93cyBMaWJyYXJ5U2VydmljZUV4Y2VwdGlvbiB7Ci0JCWlmIChkZWJ1ZykgewotCQkJRGVidWdUcmFjZS5wcmludCh0aGlzLCAiYWRkTWV0aG9kUGx1Z2luIiwgInBsdWdpbj0iICsgcGx1Z2luKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQotCQkvLyBUaGlzIG9wZXJhdGlvbiB3aWxsIGNhdXNlIGFuIFVJIHVwZGF0ZS4gSXQgbXVzdCBiZSBleGVjdXRlZCBpbgotCQkvLyB0aGUgbWFpbiBVSSB0byBhb2lkIGFuIEludmFsaWQgVGhyZWFkIEFjY2VzcyBleGNlcHRpb24uCi0JCWZpbmFsIEV4Y2VwdGlvbltdIGV4Y2VwdGlvbnMgPSBuZXcgRXhjZXB0aW9uWzFdOwotCi0JCXRyeSB7Ci0JCQlTYWZlVXBkYXRlQ29udHJvbGxlci5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQlsaWJyYXJ5LmdldE1ldGhvZFBsdWdpbnMoKS5hZGQocGx1Z2luKTsKLQotCQkJCQlJTGlicmFyeVBlcnNpc3Rlci5GYWlsU2FmZU1ldGhvZExpYnJhcnlQZXJzaXN0ZXIgcGVyc2lzdGVyID0gU2VydmljZXMKLQkJCQkJCQkuZ2V0TGlicmFyeVBlcnNpc3RlcihnZXRMaWJyYXJ5UGVyc2lzdGVyVHlwZSgpKQotCQkJCQkJCS5nZXRGYWlsU2FmZVBlcnNpc3RlcigpOwotCQkJCQl0cnkgewotCQkJCQkJcGVyc2lzdGVyLnNhdmUobGlicmFyeS5lUmVzb3VyY2UoKSk7Ci0JCQkJCQlwZXJzaXN0ZXIuY29tbWl0KCk7Ci0JCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlwZXJzaXN0ZXIucm9sbGJhY2soKTsKLQkJCQkJCWV4Y2VwdGlvbnNbMF0gPSBlOwotCQkJCQkJcmV0dXJuOwotCQkJCQl9Ci0KLQkJCQkJcGx1Z2luLmVSZXNvdXJjZSgpLmVBZGFwdGVycygpLmFkZChyZXNvdXJjZUNoYW5nZWRMaXN0ZW5lcik7Ci0JCQkJfQotCQkJfSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgTGlicmFyeVNlcnZpY2VFeGNlcHRpb24oZSk7Ci0JCX0KLQotCQlpZiAoZXhjZXB0aW9uc1swXSAhPSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgTGlicmFyeVNlcnZpY2VFeGNlcHRpb24oZXhjZXB0aW9uc1swXSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBEaXNwb3NlcyBhbGwgcmVzb3VyY2VzIGFsbG9jYXRlZCBieSB0aGlzIGxpYnJhcnkgbWFuYWdlci4KLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlpZiAocHJlZmVyZW5jZVN0b3JlQ2hhbmdlTGlzdGVuZXIgIT0gbnVsbCkgewotCQkJSVByZWZlcmVuY2VTdG9yZVdyYXBwZXIgcHJlZlN0b3JlV3JhcHBlciA9IExpYnJhcnlQbHVnaW4KLQkJCQkJLmdldERlZmF1bHQoKQotCQkJCQkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JCQkKLQkJCWlmKHByZWZTdG9yZVdyYXBwZXIgIT0gbnVsbCkgewotCQkJCXByZWZTdG9yZVdyYXBwZXIucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihwcmVmZXJlbmNlU3RvcmVDaGFuZ2VMaXN0ZW5lcik7Ci0JCQl9Ci0JCX0KLQotCQlpZiAobGlicmFyeUNoYW5nZWRMaXN0ZW5lcnMuc2l6ZSgpID4gMCkgewotCQkJbGlicmFyeUNoYW5nZWRMaXN0ZW5lcnMuY2xlYXIoKTsKLQkJfQotCi0vLwkJaWYgKGRldGFjaGVkTGlicmFyeUNoYW5nZWRMaXN0ZW5lcnMuc2l6ZSgpID4gMCkgewotLy8JCQlkZXRhY2hlZExpYnJhcnlDaGFuZ2VkTGlzdGVuZXJzLmNsZWFyKCk7Ci0vLwkJfQotCi0JCWlmIChyZXNvdXJjZUNoYW5nZUxpc3RlbmVycy5zaXplKCkgPiAwKSB7Ci0JCQlyZXNvdXJjZUNoYW5nZUxpc3RlbmVycy5jbGVhcigpOwotCQl9Ci0KLQkJZWRpdGluZ0RvbWFpbiA9IG51bGw7Ci0JCWxpYnJhcnkgPSBudWxsOwotCi0JfQotCi0JLyoqCi0JICogQ2hlY2tzIHRoZSBhcmd1bWVudHMgdXNlZCBmb3IgY3JlYXRpbmcgYSBuZXcgbWV0aG9kIGVsZW1lbnQuCi0JICogCi0JICogQHBhcmFtIGNvbnRhaW5pbmdFbGVtZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50L2NvbnRhaW5pbmcgbWV0aG9kIGVsZW1lbnQKLQkgKiBAcGFyYW0gbmFtZQotCSAqICAgICAgICAgICAgYSBuYW1lIGZvciB0aGUgbmV3IG1ldGhvZCBlbGVtZW50Ci0JICogQHRocm93IDxjb2RlPkxpYnJhcnlTZXJ2aWNlRXhjZXB0aW9uPC9jb2RlPiBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUKLQkgKiAgICAgICAgcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNoZWNrRWxlbWVudENyZWF0aW9uQXJndW1lbnRzKAotCQkJTWV0aG9kRWxlbWVudCBjb250YWluaW5nRWxlbWVudCwgU3RyaW5nIG5hbWUpCi0JCQl0aHJvd3MgTGlicmFyeVNlcnZpY2VFeGNlcHRpb24gewotCQlpZiAoY29udGFpbmluZ0VsZW1lbnQgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotCQl9Ci0JCWlmIChuYW1lID09IG51bGwgfHwgbmFtZS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQl0aHJvdyBuZXcgSW52YWxpZE1ldGhvZEVsZW1lbnROYW1lRXhjZXB0aW9uKCk7Ci0JCX0KLQkJLy8gVE9ETzogQ2hlY2sgZm9yIGlsbGVnYWwgY2hhcmFjdGVycy4KLQl9Ci0KLQkvKioKLQkgKiBIYW5kbGVzIGEgcGVyc2lzdGVuY2UgcmVmcmVzaCBldmVudC4KLQkgKiAKLQkgKiBAcGFyYW0gZXZlbnQKLQkgKiAgICAgICAgICAgIGEgcmVmcmVzaCBldmVudAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGhhbmRsZVJlZnJlc2hFdmVudChJUmVmcmVzaEV2ZW50IGV2ZW50KSB7Ci0JCWlmIChkZWJ1ZykgewotCQkJRGVidWdUcmFjZS5wcmludCh0aGlzLCAiaGFuZGxlUmVmcmVzaEV2ZW50IiwgInJlZnJlc2hlZFJlc291cmNlcz0iIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkrIGV2ZW50LmdldFJlZnJlc2hlZFJlc291cmNlcygpKTsKLQkJfQotCi0JCWlmICghZXZlbnQuZ2V0VW5sb2FkZWRPYmplY3RzKCkuaXNFbXB0eSgpKSB7Ci0JCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRS5jbGVhblVwKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBOb3RpZmllcyBhbGwgbGlicmFyeSBjaGFuZ2VkIGxpc3RlbmVycyBhdHRhY2hlZCB0byB0aGUgbWFuYWdlZCBsaWJyYXJ5LgotCSAqIAotCSAqIEBwYXJhbSB0eXBlCi0JICogICAgICAgICAgICB0aGUgdHlwZSBvZiBjaGFuZ2UgdGhhdCBoYXMgb2NjdXJyZWQKLQkgKiBAcGFyYW0gY2hhbmdlZEVsZW1lbnRzCi0JICogICAgICAgICAgICBhIGNvbGxlY3Rpb24gb2YgbWV0aG9kIGVsZW1lbnRzIHRoYXQgaGF2ZSBjaGFuZ2VkCi0JICovCi0JcHJvdGVjdGVkIHN5bmNocm9uaXplZCB2b2lkIG5vdGlmeUxpc3RlbmVycyhmaW5hbCBpbnQgb3B0aW9uLAotCQkJZmluYWwgQ29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0KLQkJLy8gc2VuZCBub3RpZmljYXRpb24gbWlnaHQgYmUgY2F1c2luZyBsaXN0ZW5lcnMgYWRkZWQgb3IgcmVtb3ZlZAotCQkvLyB0byBhdm9pZCBjb25jdXJyZW50IHVwZGF0ZSBvZiB0aGUgbGlzdGVuZXIgbGlzdCwgCi0JCS8vIHdlIGtlZXAgdGhlIGxpc3Qgb2YgbGlzdGVuZXJzIHByb2Nlc3NlZAotCQkvLyBhbmQgY2hlY2sgdGhlIGxpc3RlbmVyIGxpc3QgcmVwZWF0ZWRseQotCQlIYXNoU2V0IHByb2Nlc3NlZCA9IG5ldyBIYXNoU2V0KCk7CQotCQl3aGlsZSAoX2RvTm90aWZ5TGlzdGVuZXJzKG9wdGlvbiwgY29sbGVjdGlvbiwgcHJvY2Vzc2VkKSApIHsKLQkJCTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBOb3RpZmllcyBhbGwgbGlicmFyeSBjaGFuZ2VkIGxpc3RlbmVycyBhdHRhY2hlZCB0byB0aGUgbWFuYWdlZCBsaWJyYXJ5LgotCSAqIAotCSAqIEBwYXJhbSB0eXBlCi0JICogICAgICAgICAgICB0aGUgdHlwZSBvZiBjaGFuZ2UgdGhhdCBoYXMgb2NjdXJyZWQKLQkgKiBAcGFyYW0gY2hhbmdlZEVsZW1lbnRzCi0JICogICAgICAgICAgICBhIGNvbGxlY3Rpb24gb2YgbWV0aG9kIGVsZW1lbnRzIHRoYXQgaGF2ZSBjaGFuZ2VkCi0JICogQHJldHVybiBib29sZWFuIHRydWUgaWYgYW55IGxpc3RlbmVyIGlzIHByb2Nlc3NlZAotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBfZG9Ob3RpZnlMaXN0ZW5lcnMoZmluYWwgaW50IG9wdGlvbiwKLQkJCWZpbmFsIENvbGxlY3Rpb24gY29sbGVjdGlvbiwgZmluYWwgQ29sbGVjdGlvbiBwcm9jZXNzZWQpIHsKLQkJaWYgKGRlYnVnKSB7Ci0JCQlEZWJ1Z1RyYWNlLnByaW50KHRoaXMsICJub3RpZnlMaXN0ZW5lcnMiLCAib3B0aW9uPSIgKyBvcHRpb24pOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCi0JCWJvb2xlYW4gY2hhbmdlZCA9IGZhbHNlOwotCQkKLQkJdHJ5IHsKLS8vCQkJLy8gUmVtb3ZlIHRoZSBjaGFuZ2VkIGxpc3RlbmVycyB0aGF0IGhhdmUgYmVlbiBkZXR0YWNoZWQuCi0vLwkJCWlmIChkZXRhY2hlZExpYnJhcnlDaGFuZ2VkTGlzdGVuZXJzLnNpemUoKSA+IDApIHsKLS8vCQkJCWZvciAoSXRlcmF0b3IgaXQgPSBkZXRhY2hlZExpYnJhcnlDaGFuZ2VkTGlzdGVuZXJzLml0ZXJhdG9yKCk7IGl0Ci0vLwkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0vLwkJCQkJT2JqZWN0IGwgPSBpdC5uZXh0KCk7Ci0vLwkJCQkJaWYgKGxpYnJhcnlDaGFuZ2VkTGlzdGVuZXJzLmNvbnRhaW5zKGwpKSB7Ci0vLwkJCQkJCWxpYnJhcnlDaGFuZ2VkTGlzdGVuZXJzLnJlbW92ZShsKTsKLS8vCQkJCQl9Ci0vLwkJCQl9Ci0vLwkJCQlkZXRhY2hlZExpYnJhcnlDaGFuZ2VkTGlzdGVuZXJzLmNsZWFyKCk7Ci0vLwkJCX0KLQotCQkJLy8gTm90aWZ5IHRoZSBjaGFuZ2VkIGxpc3RlbmVycy4KLQkJCS8vIE5vdGU6IG1vcmUgY2hhbmdlZCBsaXN0ZW5lcnMgbWF5IGJlIGFkZGVkIHdoaWxlIGVhY2ggbGlzdGVuZXIgaXMKLQkJCS8vIGJlaW5nIG5vdGlmaWVkLiBIb3dldmVyLAotCQkJLy8gdGhleSB3aWxsIGJlIGFkZGVkIHRvIHRoZSBlbmQgb2YgdGhlIGxpc3Qgd2hpY2ggZG9lcyBubyBoYXJtLgotCQkJCi0JCQkKLQkJCWZvciAoIEl0ZXJhdG9yIGl0ID0gbmV3IEFycmF5TGlzdChsaWJyYXJ5Q2hhbmdlZExpc3RlbmVycykuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOyApIHsKLQkJCQlmaW5hbCBJTGlicmFyeUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyID0gKElMaWJyYXJ5Q2hhbmdlTGlzdGVuZXIpIGl0Lm5leHQoKTsKLQotCQkJCWlmICggKGxpc3RlbmVyICE9IG51bGwpICYmICFwcm9jZXNzZWQuY29udGFpbnMobGlzdGVuZXIpICkgewotCQotCQkJCQkvLyBrZWVwIHRoZSBwcm9jZXNzZWQgb25lcwotCQkJCQlwcm9jZXNzZWQuYWRkKGxpc3RlbmVyKTsKLQkJCQkJY2hhbmdlZCA9IHRydWU7Ci0JCQkJCQotCQkJCQkvLyBTaW5jZSB0aGlzIG1heSB0cmlnZ2VyIGFuIHVwZGF0ZSB0byB0aGUgVUksIHRoZQotCQkJCQkvLyBub3RpZmljYXRpb24gbXVzdCBiZSBleGVjdXRlZCBpbiB0aGUgVUkgdGhyZWFkIHRvIGF2b2lkCi0JCQkJCS8vIGdldHRpbmcgYW4gSW52YWxpZCBUaHJlYWQgQWNjZXNzIGV4Y2VwdGlvbi4gVGhlCi0JCQkJCS8vIG5vdGlmaWNhdGlvbiBtdXN0IGFsc28gYmUgZXhlY3V0ZWQgaW4gc3luYyBtb2RlIHRvCi0JCQkJCS8vIGd1cmFudGVlIGRlbGl2ZXJ5IG9mIHRoZSBldmVudCBiZWZvcmUgYSBsaXN0ZW5lciBpcwotCQkJCQkvLyBkaXNwb3NlZC4KLQkJCQkJU2FmZVVwZGF0ZUNvbnRyb2xsZXIuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCWlmIChkZWJ1ZykgewotCQkJCQkJCQlEZWJ1Z1RyYWNlCi0JCQkJCQkJCQkJLnByaW50KAotCQkJCQkJCQkJCQkJdGhpcywKLQkJCQkJCQkJCQkJCSJub3RpZnlMaXN0ZW5lcnMiLCAibGlzdGVuZXI9IiArIGxpc3RlbmVyKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQkJfQotCQkJCQkJCWxpc3RlbmVyLmxpYnJhcnlDaGFuZ2VkKG9wdGlvbiwgY29sbGVjdGlvbik7Ci0JCQkJCQl9Ci0JCQkJCX0pOwotCQkJCX0KLQkJCQotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJaWYgKGRlYnVnKSB7Ci0JCQkJRGVidWdUcmFjZS5wcmludCh0aGlzLCAibm90aWZ5TGlzdGVuZXJzIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIGNoYW5nZWQ7Ci0JCQotCX0KLQotCS8qKgotCSAqIEZpcmVzIGEgcHJvcGVydHkgY2hhbmdlZCBldmVudC4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvcGVydHlJZAotCSAqICAgICAgICAgICAgdGhlIGlkIG9mIHRoZSBjaGFuZ2VkIHByb3BlcnR5Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgZmlyZVByb3BlcnR5Q2hhbmdlKGZpbmFsIE9iamVjdCBzb3VyY2UsIGZpbmFsIGludCBwcm9wZXJ0eUlkKSB7Ci0JCWlmIChkZWJ1ZykgewotCQkJRGVidWdUcmFjZS5wcmludCh0aGlzLCAiZmlyZVByb3BlcnR5Q2hhbmdlIiwgInNvdXJjZT0iICsgc291cmNlKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQotCQlPYmplY3RbXSBhcnJheSA9IHJlc291cmNlQ2hhbmdlTGlzdGVuZXJzLmdldExpc3RlbmVycygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGFycmF5Lmxlbmd0aDsgaSsrKSB7Ci0JCQlmaW5hbCBJUHJvcGVydHlMaXN0ZW5lciBsaXN0ZW5lciA9IChJUHJvcGVydHlMaXN0ZW5lcikgYXJyYXlbaV07Ci0KLQkJCS8vIFRoaXMgb3BlcmF0aW9uIHdpbGwgY2F1c2UgYW4gVUkgdXBkYXRlLiBJdCBtdXN0IGJlIGV4ZWN1dGVkIGluCi0JCQkvLyB0aGUgbWFpbiBVSSB0byBhb2lkIGFuIEludmFsaWQgVGhyZWFkIEFjY2VzcyBleGNlcHRpb24uCi0JCQlTYWZlVXBkYXRlQ29udHJvbGxlci5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJaWYgKGRlYnVnKSB7Ci0JCQkJCQlEZWJ1Z1RyYWNlLnByaW50KHRoaXMsCi0JCQkJCQkJCSJmaXJlUHJvcGVydHlDaGFuZ2UiLCAibGlzdGVuZXI9IiArIGxpc3RlbmVyKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCX0KLQkJCQkJbGlzdGVuZXIucHJvcGVydHlDaGFuZ2VkKHNvdXJjZSwgcHJvcGVydHlJZCk7Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBZGRzIGEgcmVzb3VyY2UgY2hhbmdlZCBsaXN0ZW5lciB0byB0aGUgbWFuYWdlZCBtZXRob2QgbGlicmFyeSByZXNvdXJjZXMuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkUmVzb3VyY2VDaGFuZ2VkTGlzdGVuZXJzKCkgewotCQlpZiAobGlicmFyeSA9PSBudWxsIHx8IGxpYnJhcnkuZVJlc291cmNlKCkgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJaWYgKCFsaWJyYXJ5LmVSZXNvdXJjZSgpLmVBZGFwdGVycygpLmNvbnRhaW5zKHJlc291cmNlQ2hhbmdlZExpc3RlbmVyKSkgewotCQkJbGlicmFyeS5lUmVzb3VyY2UoKS5lQWRhcHRlcnMoKS5hZGQocmVzb3VyY2VDaGFuZ2VkTGlzdGVuZXIpOwotCQl9Ci0KLQkJZm9yIChJdGVyYXRvciBpdCA9IGxpYnJhcnkuZ2V0TWV0aG9kUGx1Z2lucygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSAoTWV0aG9kUGx1Z2luKSBpdC5uZXh0KCk7Ci0JCQlpZiAoIXBsdWdpbi5lUmVzb3VyY2UoKS5lQWRhcHRlcnMoKS5jb250YWlucygKLQkJCQkJcmVzb3VyY2VDaGFuZ2VkTGlzdGVuZXIpKSB7Ci0JCQkJcGx1Z2luLmVSZXNvdXJjZSgpLmVBZGFwdGVycygpLmFkZChyZXNvdXJjZUNoYW5nZWRMaXN0ZW5lcik7Ci0JCQl9Ci0JCX0KLQotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gbGlicmFyeS5nZXRQcmVkZWZpbmVkQ29uZmlndXJhdGlvbnMoKS5pdGVyYXRvcigpOyBpdAotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IChNZXRob2RDb25maWd1cmF0aW9uKSBpdC5uZXh0KCk7Ci0JCQlpZiAoIWNvbmZpZy5lUmVzb3VyY2UoKS5lQWRhcHRlcnMoKS5jb250YWlucygKLQkJCQkJcmVzb3VyY2VDaGFuZ2VkTGlzdGVuZXIpKSB7Ci0JCQkJY29uZmlnLmVSZXNvdXJjZSgpLmVBZGFwdGVycygpLmFkZChyZXNvdXJjZUNoYW5nZWRMaXN0ZW5lcik7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmVzIHRoZSByZXNvdXJjZSBjaGFuZ2VkIGxpc3RlbmVyIHRvIHRoZSBtYW5hZ2VkIG1ldGhvZCBsaWJyYXJ5Ci0JICogcmVzb3VyY2UgYW5kIG1ldGhvZCBwbHVnLWlucy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVSZXNvdXJjZUNoYW5nZWRMaXN0ZW5lcnMoKSB7Ci0JCWlmIChsaWJyYXJ5ID09IG51bGwgfHwgbGlicmFyeS5lUmVzb3VyY2UoKSA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlsaWJyYXJ5LmVSZXNvdXJjZSgpLmVBZGFwdGVycygpLnJlbW92ZShyZXNvdXJjZUNoYW5nZWRMaXN0ZW5lcik7Ci0KLQkJZm9yIChJdGVyYXRvciBpdGVyID0gbGlicmFyeS5nZXRNZXRob2RQbHVnaW5zKCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gKE1ldGhvZFBsdWdpbikgaXRlci5uZXh0KCk7Ci0JCQlwbHVnaW4uZVJlc291cmNlKCkuZUFkYXB0ZXJzKCkucmVtb3ZlKHJlc291cmNlQ2hhbmdlZExpc3RlbmVyKTsKLQkJfQotCi0JCWZvciAoSXRlcmF0b3IgaXQgPSBsaWJyYXJ5LmdldFByZWRlZmluZWRDb25maWd1cmF0aW9ucygpLml0ZXJhdG9yKCk7IGl0Ci0JCQkJLmhhc05leHQoKTspIHsKLQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gKE1ldGhvZENvbmZpZ3VyYXRpb24pIGl0Lm5leHQoKTsKLQkJCWNvbmZpZy5lUmVzb3VyY2UoKS5lQWRhcHRlcnMoKS5yZW1vdmUocmVzb3VyY2VDaGFuZ2VkTGlzdGVuZXIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgbWFuYWdlZCBtZXRob2QgbGlicmFyeSByZXNvdXJjZS4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgbWV0aG9kIGxpYnJhcnkgcmVzb3VyY2UuCi0JICovCi0JcHJvdGVjdGVkIFJlc291cmNlIGdldE1ldGhvZExpYnJhcnlSZXNvdXJjZSgpIHsKLQkJcmV0dXJuIGxpYnJhcnkgIT0gbnVsbCA/IGxpYnJhcnkuZVJlc291cmNlKCkgOiBudWxsOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIFVSSSBvZiB0aGUgbWFuYWdlZCBtZXRob2QgbGlicmFyeS4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgPGNvZGU+amF2YS5uZXQuVVJJPC9jb2RlPgotCSAqLwotCXB1YmxpYyBqYXZhLm5ldC5VUkkgZ2V0TWV0aG9kTGlicmFyeVVSSSgpIHsKLQkJUmVzb3VyY2Ugc2F2ZWRSZXNvdXJjZSA9IGdldE1ldGhvZExpYnJhcnlSZXNvdXJjZSgpOwotCQlpZiAoc2F2ZWRSZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQlVUkkgcmVzb3VyY2VVUkkgPSBzYXZlZFJlc291cmNlLmdldFVSSSgpOwotCQkJdHJ5IHsKLQkJCQlGaWxlIGZpbGUgPSBuZXcgRmlsZShyZXNvdXJjZVVSSS50b0ZpbGVTdHJpbmcoKSk7Ci0JCQkJcmV0dXJuIGZpbGUuZ2V0UGFyZW50RmlsZSgpLnRvVVJJKCk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCUxpYnJhcnlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEFkZHMgdGhlIG5ldyBwYWNrYWdlcyBpbnRvIHRoZSBjb25maWd1cmF0aW9ucyBpZiB0aGUgcGFyZW50IGlzIGluIHRoZQotCSAqIGNvbmZpZ3VyYXRpb24uCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZE5ld1BhY2thZ2VzVG9Db25maWd1cmF0aW9uKENvbGxlY3Rpb24gbmV3b2JqcykgewotCQlpZiAobmV3b2JqcyA9PSBudWxsIHx8IG5ld29ianMuc2l6ZSgpID09IDApIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCUxpYnJhcnlNb2RpZmljYXRpb25IZWxwZXIgaGVscGVyID0gbmV3IExpYnJhcnlNb2RpZmljYXRpb25IZWxwZXIoKTsKLQotCQl0cnkgewotCQkJRU9iamVjdCBlLCBwYXJlbnQ7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gbmV3b2Jqcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJZSA9IChFT2JqZWN0KSBpdC5uZXh0KCk7Ci0JCQkJaWYgKChlIGluc3RhbmNlb2YgTWV0aG9kUGFja2FnZSkKLQkJCQkJCSYmICgocGFyZW50ID0gZS5lQ29udGFpbmVyKCkpICE9IG51bGwpCi0JCQkJCQkmJiAocGFyZW50IGluc3RhbmNlb2YgTWV0aG9kUGFja2FnZSkpIHsKLQkJCQkJT2JqZWN0IGNvbmZpZ3MgPSAoKE11bHRpUmVzb3VyY2VFT2JqZWN0KSBwYXJlbnQpCi0JCQkJCQkJLmdldE9wcG9zaXRlRmVhdHVyZVZhbHVlKEFzc29jaWF0aW9uSGVscGVyLk1ldGhvZFBhY2thZ2VfTWV0aG9kQ29uZmlndXJhdGlvbnMpOwotCQkJCQlpZiAoY29uZmlncyBpbnN0YW5jZW9mIExpc3QpIHsKLQkJCQkJCWZvciAoSXRlcmF0b3IgaXRjb25maWcgPSAoKExpc3QpIGNvbmZpZ3MpLml0ZXJhdG9yKCk7IGl0Y29uZmlnCi0JCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSAoTWV0aG9kQ29uZmlndXJhdGlvbikgaXRjb25maWcKLQkJCQkJCQkJCS5uZXh0KCk7Ci0JCQkJCQkJTGlzdCBwa2dzID0gY29uZmlnLmdldE1ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKTsKLQkJCQkJCQlpZiAoIXBrZ3MuY29udGFpbnMoZSkpIHsKLQkJCQkJCQkJLy8gcGtncy5hZGQoZSk7Ci0JCQkJCQkJCWhlbHBlcgotCQkJCQkJCQkJCS5nZXRBY3Rpb25NYW5hZ2VyKCkKLQkJCQkJCQkJCQkuZG9BY3Rpb24oCi0JCQkJCQkJCQkJCQlJQWN0aW9uTWFuYWdlci5BREQsCi0JCQkJCQkJCQkJCQljb25maWcsCi0JCQkJCQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJCQkJCQkuZ2V0TWV0aG9kQ29uZmlndXJhdGlvbl9NZXRob2RQYWNrYWdlU2VsZWN0aW9uKCksCi0JCQkJCQkJCQkJCQllLCAtMSk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQloZWxwZXIuc2F2ZSgpOwotCi0JCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkJTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCX0gZmluYWxseSB7Ci0JCQloZWxwZXIuZGlzcG9zZSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgdHlwZSBvZiBsaWJyYXJ5IHBlcnNpc3RlciB0byBiZSB1c2VkIGluIHRoaXMgbGlicmFyeSBtYW5hZ2VyCi0JICogCi0JICogQHJldHVybiB0aGUgbGlicmFyeSBwZXJzaXN0ZXIgdHlwZQotCSAqIEBzZWUgU2VydmljZXMjWE1JX1BFUlNJU1RFTkNFX1RZUEUKLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldExpYnJhcnlQZXJzaXN0ZXJUeXBlKCk7Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgSUxpYnJhcnlSZXNvdXJjZVNldCBjcmVhdGVSZXNvdXJjZVNldCgpOwotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L0NvbmZpZ0hlbHBlckRlbGVnYXRlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvQ29uZmlnSGVscGVyRGVsZWdhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTgxZTljZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvQ29uZmlnSGVscGVyRGVsZWdhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyNiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeTsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb25maWd1cmF0aW9uLlByYWN0aWNlU3ViZ3JvdXBJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkFjdGl2aXR5V3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuSHRtbEJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LklFbGVtZW50TGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5lbGVtZW50cy5BYnN0cmFjdEVsZW1lbnRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LmVsZW1lbnRzLkFic3RyYWN0UHJvY2Vzc0VsZW1lbnRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LmVsZW1lbnRzLkVsZW1lbnRMYXlvdXRFeHRlbmRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuZWxlbWVudHMuU3VtbWFyeVBhZ2VMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UuSUxpYnJhcnlSZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLkxpYnJhcnlVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50Q2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DdXN0b21DYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc1BhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS5pbXBsLk11bHRpUmVzb3VyY2VFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUudXRpbC5PcHBvc2l0ZUZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLQotLyoqCi0gKiBEZWxlZ2F0ZSBjbGFzcyB1c2VkIGluIENvbmZpZ3VyYXRpb25IZWxwZXIKLSAqIAotICogQGF1dGhvciBXZWlwaW5nIEx1IAotICogQHNpbmNlIDEuNQotICovCi1wdWJsaWMgY2xhc3MgQ29uZmlnSGVscGVyRGVsZWdhdGUgewotCi0JCi0JLyoqCi0JICogVGVzdCBpZiBwa2cgaXMgYSBzeXN0ZW0gcGFja2FnZSBvZiBwbHVnaW4KLQkgKiBAcGFyYW0gcGx1Z2luCi0JICogQHBhcmFtIHBrZwotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1N5c3RlbVBhY2thZ2UoTWV0aG9kUGx1Z2luIHBsdWdpbiwgTWV0aG9kUGFja2FnZSBwa2cpIHsKLQkJcmV0dXJuIFRuZ1V0aWwuZ2V0QWxsU3lzdGVtUGFja2FnZXMocGx1Z2luKS5jb250YWlucyhwa2cpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBsb2FkT3Bwb3NpdGVGZWF0dXJlcyhJTGlicmFyeVJlc291cmNlU2V0IHJlc291Y2VTZXQsCi0JCQlMaXN0PE9wcG9zaXRlRmVhdHVyZT4gb3Bwb3NpdGVGZWF0dXJlcywgIE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgewotCQlTZXQ8U3RyaW5nPiBHVUlEcyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKLQkJR1VJRHMuYWRkKGVsZW1lbnQuZ2V0R3VpZCgpKTsKLQkJcmVzb3VjZVNldC5sb2FkT3Bwb3NpdGVGZWF0dXJlcyhvcHBvc2l0ZUZlYXR1cmVzLCBHVUlEcyk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGlzT3duZXJTZWxlY3RlZChNZXRob2RFbGVtZW50IGVsZW1lbnQsCi0JCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZywgYm9vbGVhbiBjaGVja1N1YnRyYWN0ZWQpIHsKLQkJTWV0aG9kTGlicmFyeSBsaWJyYXJ5ID0gTGlicmFyeVNlcnZpY2VVdGlsLmdldE1ldGhvZExpYnJhcnkoY29uZmlnKTsKLQkJSUxpYnJhcnlNYW5hZ2VyIGxpYnJhcnlNYW5hZ2VyID0gbGlicmFyeSA9PSBudWxsPyBudWxsIDogTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRMaWJyYXJ5TWFuYWdlcihsaWJyYXJ5KTsKLQkJaWYgKGxpYnJhcnlNYW5hZ2VyICE9IG51bGwpIHsKLQkJCXJldHVybiBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJCQkuZ2V0Q29uZmlndXJhdGlvbk1hbmFnZXIoY29uZmlnKQotCQkJCQkJCS5nZXRDb25maWd1cmF0aW9uRGF0YSgpCi0JCQkJCQkJCS5pc093bmVyU2VsZWN0ZWQoZWxlbWVudCwgY2hlY2tTdWJ0cmFjdGVkKTsKLQkJfQotCQkJCQotCQlpZiAoZWxlbWVudCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlpZiAoY29uZmlnID09IG51bGwgfHwgQ29uZmlndXJhdGlvbkhlbHBlci5pc0Rlc2NyaXB0aW9uRWxlbWVudChlbGVtZW50KSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQotCQkvLyBzaW5jZSBVTUEgMS4wLjQsIGNvbmZpZ3VyYXRpb24gY2FuIGhhdmUgYWRkZWQgY2F0ZWdvcmllcyAKLQkJLy8gYW5kIHN1YnRyYWN0ZWQgY2F0ZWdvcmllcy4gVGhlIG9yZGVyIG9mIGZpbHRlcmluZyBpczoKLQkJLy8gMS4gYW55IGVsZW1lbnQgaW4gdGhlIHN1YnRyYWN0ZWQgY2F0ZWdvcmllcyBzaG91bGQgYmUgZXhjbHVkZWQKLQkJLy8gMi4gYW55IGVsZW1lbnQgaW4gdGhlIGFkZGVkIGNhdGVnb3JpZXMgc2hvdWxkIGJlIGluY2x1ZGVkCi0JCS8vIDMuIGFueSBlbGVtZW50IG5vdCBpbiB0aGUgc2VsZWN0ZWQgcGFja2FnZSBvciBwbHVnaW4gc2hvdWxkIGJlIGV4Y2x1ZGVkLgotCQkKLQkJaWYgKCBjaGVja1N1YnRyYWN0ZWQgKSB7Ci0JCQkvLyBmaXJzdCBjaGVjayBzdWJ0cmFjdGVkIGVsZW1lbnRzCi0JCQlMaXN0IHN1YnRyYWN0ZWRDYXRlZ29yaWVzID0gY29uZmlnLmdldFN1YnRyYWN0ZWRDYXRlZ29yeSgpOwotCQkJaWYgKCBzdWJ0cmFjdGVkQ2F0ZWdvcmllcy5zaXplKCkgPiAwICkgewotCQkJCWZvciAoIEl0ZXJhdG9yIGl0ID0gc3VidHJhY3RlZENhdGVnb3JpZXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOyApIHsKLQkJCQkJQ29udGVudENhdGVnb3J5IGNjID0gKENvbnRlbnRDYXRlZ29yeSlpdC5uZXh0KCk7Ci0JCQkJCWlmICggY2MgPT0gZWxlbWVudCApIHsKLQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJfQotCQkJCQkKLQkJCQkJLy8gbmVlZCB0byBjaGVjayBhbGwgY29udGVudCBjYXRlZ29yeSB0eXBlcyBhbmQgc3ViLWNhdGVnb3JpZXMKLQkJCQkJLy8gd2UgbmVlZCB0byBoYXZlIGFuIGVmZmljaWVudCBhbGdvcml0aG0gZm9yIHRoaXMgY2hlY2tpbmcuCi0JCQkJCS8vIGZvciBub3csIG9ubHkgY2hlY2sgdGhlIGN1c3RvbSBjYXRlZ29yeSdzIGNhdGVnb3Jpc2VkIGVsZW1lbnRzCi0JCQkJCS8vIFRPRE8uIEppbmh1YSBYaSwgMTEvMjcvMjAwNgotCQkJCQlpZiAoIGNjIGluc3RhbmNlb2YgQ3VzdG9tQ2F0ZWdvcnkgKSB7Ci0JCQkJCQlpZiAoICgoQ3VzdG9tQ2F0ZWdvcnkpY2MpLmdldENhdGVnb3JpemVkRWxlbWVudHMoKS5jb250YWlucyhlbGVtZW50KSApIHsKLQkJCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCQl9Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQkvLyBUT0RPLCBub3QgaW1wbGVtZW50ZWQgeWV0Ci0JCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlRPRE8sIGlzT3duZXJTZWxlY3RlZDogbm90IGltcGxlbWVudGVkIHlldCIpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCS8vIHRoZW4gY2hlY2sgYWRkZWQgY2F0ZWdvcmllcwotCQkvLyBUT0RPCi0JCQotCQkvLyBlbGVtZW50cyBiZXlvbmQgY29uZmlndXJhdGlvbiBzY29wZSBzaG91bGQgYmUgYWx3YXlzIHZpc2libGUKLQkJaWYgKChlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kTGlicmFyeSkKLQkJCQl8fCAoZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZENvbmZpZ3VyYXRpb24pKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luKSB7Ci0JCQlMaXN0IHBsdWdpbnMgPSBjb25maWcuZ2V0TWV0aG9kUGx1Z2luU2VsZWN0aW9uKCk7Ci0JCQlyZXR1cm4gKHBsdWdpbnMgIT0gbnVsbCkgJiYgcGx1Z2lucy5jb250YWlucyhlbGVtZW50KTsKLQkJfSBlbHNlIHsKLQkJCS8vIGlmIHRoZSBvd25lcnByb2Nlc3MgY2FuJ3Qgc2hvdywgY2FuJ3QgYWNjZXB0Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJQWN0aXZpdHkgYmFzZSA9IChBY3Rpdml0eSkgKChBY3Rpdml0eSkgZWxlbWVudCkKLQkJCQkJCS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCk7Ci0JCQkJaWYgKGJhc2UgIT0gbnVsbCAmJiBiYXNlICE9IGVsZW1lbnQpIHsKLQkJCQkJTWV0aG9kRWxlbWVudCBvd25pbmdQcm9jID0gVG5nVXRpbC5nZXRPd25pbmdQcm9jZXNzKGJhc2UpOwotCQkJCQlpZiAoIG93bmluZ1Byb2MgIT0gbnVsbCAmJiBvd25pbmdQcm9jICE9IGVsZW1lbnQgCi0JCQkJCQkJJiYgIUNvbmZpZ3VyYXRpb25IZWxwZXIuaW5Db25maWcob3duaW5nUHJvYywgY29uZmlnLCBjaGVja1N1YnRyYWN0ZWQpKSB7Ci0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCUVPYmplY3QgcGtnID0gTGlicmFyeVV0aWwuZ2V0U2VsZWN0YWJsZShlbGVtZW50KTsKLQotCQkJLy8gYWNjZXB0IGdsb2JhbCBwYWNrYWdlIGlmIHRoZSBwbHVnaW4gaXMgaW4gdGhlIGNvbmZpZ3VyYXRpb24KLQkJCWlmIChwa2cgaW5zdGFuY2VvZiBNZXRob2RQYWNrYWdlCi0JCQkJCSYmIENvbmZpZ3VyYXRpb25IZWxwZXIuaXNHbG9iYWxQYWNrYWdlKChNZXRob2RQYWNrYWdlKSBwa2cpKSB7Ci0JCQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IExpYnJhcnlVdGlsLmdldE1ldGhvZFBsdWdpbihwa2cpOwotCQkJCXJldHVybiBDb25maWd1cmF0aW9uSGVscGVyLmluQ29uZmlnKHBsdWdpbiwgY29uZmlnLCBjaGVja1N1YnRyYWN0ZWQpOwotCQkJfQotCi0JCQlMaXN0IHBrZ3MgPSBjb25maWcuZ2V0TWV0aG9kUGFja2FnZVNlbGVjdGlvbigpOwotCQkJaWYgKHBrZ3MgPT0gbnVsbCkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQotCQkJLy8gcGVyIFBob25nJ3MgcmVxdWVzdCwgZm9yIFByb2Nlc3NQYWNrYWdlLCBjaGVjayB0aGUKLQkJCS8vIFByb2Nlc3NDb21wb25lbnQgcGFyZW50IGluc3RlYWQKLQkJCWlmIChwa2cgaW5zdGFuY2VvZiBQcm9jZXNzUGFja2FnZSkgewotCQkJCXdoaWxlICgocGtnICE9IG51bGwpICYmICEocGtnIGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkKLQkJCQkJCSYmICFwa2dzLmNvbnRhaW5zKHBrZykpIHsKLQkJCQkJcGtnID0gcGtnLmVDb250YWluZXIoKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCS8vIGlmIHBhY2thZ2Ugbm90IHNlbGVjdGVkLCByZXR1cm4gZmFsc2UKLQkJCWlmICgocGtnID09IG51bGwpIHx8ICFwa2dzLmNvbnRhaW5zKHBrZykpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0KLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIGxvYWRPcHBvc2l0ZUZlYXR1cmVzKE1hcCBtYXAsIExpc3Qgb3Bwb3NpdGVGZWF0dXJlcywgU2V0IGRlbGV0ZWRHVUlEcykgewotCQlpbnQgbWF4ID0gb3Bwb3NpdGVGZWF0dXJlcy5zaXplKCkgLSAxOwotCQlpZiAobWF4IDwgMCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCUNvbGxlY3Rpb24gZWxlbWVudHMgPSBuZXcgSGFzaFNldChtYXAudmFsdWVzKCkpOwotCQlIYXNoU2V0IGxvYWRlZEVsZW1lbnRzID0gbmV3IEhhc2hTZXQoKTsKLQkJd2hpbGUgKCFlbGVtZW50cy5pc0VtcHR5KCkpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGVsZW1lbnRzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBvYmogPSBpdGVyLm5leHQoKTsKLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJCQlNZXRob2RFbGVtZW50IGVsZW1lbnQgPSAoTWV0aG9kRWxlbWVudCkgb2JqOwotCQkJCQlNdWx0aVJlc291cmNlRU9iamVjdCBtckVPYmplY3QgPSAoKE11bHRpUmVzb3VyY2VFT2JqZWN0KSBlbGVtZW50KTsKLQkJCQkJZm9yIChpbnQgaSA9IG1heDsgaSA+IC0xOyBpLS0pIHsKLQkJCQkJCU9wcG9zaXRlRmVhdHVyZSBvcHBvc2l0ZUZlYXR1cmUgPSAoKE9wcG9zaXRlRmVhdHVyZSkgb3Bwb3NpdGVGZWF0dXJlcwotCQkJCQkJCQkuZ2V0KGkpKTsKLQkJCQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSA9IG9wcG9zaXRlRmVhdHVyZS5nZXRUYXJnZXRGZWF0dXJlKCk7Ci0JCQkJCQlpZiAoZUZlYXR1cmUuZ2V0Q29udGFpbmVyQ2xhc3MoKS5pc0luc3RhbmNlKGVsZW1lbnQpKSB7Ci0JCQkJCQkJaWYgKGVGZWF0dXJlLmlzTWFueSgpKSB7Ci0JCQkJCQkJCUludGVybmFsRUxpc3QgbGlzdCA9IChJbnRlcm5hbEVMaXN0KSBlbGVtZW50Ci0JCQkJCQkJCQkJLmVHZXQoZUZlYXR1cmUpOwotCQkJCQkJCQlpZiAoIWxpc3QuaXNFbXB0eSgpKSB7Ci0JCQkJCQkJCQlib29sZWFuIHJlc29sdmUgPSBmYWxzZTsKLQkJCQkJCQkJCWNoZWNrX3Jlc29sdmU6IGZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBsaXN0Ci0JCQkJCQkJCQkJCS5iYXNpY0l0ZXJhdG9yKCk7IGl0ZXJhdG9yCi0JCQkJCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJCQkJSW50ZXJuYWxFT2JqZWN0IGUgPSAoSW50ZXJuYWxFT2JqZWN0KSBpdGVyYXRvcgotCQkJCQkJCQkJCQkJLm5leHQoKTsKLQkJCQkJCQkJCQlpZiAoZS5lSXNQcm94eSgpKSB7Ci0JCQkJCQkJCQkJCVN0cmluZyBndWlkID0gZS5lUHJveHlVUkkoKQotCQkJCQkJCQkJCQkJCS5mcmFnbWVudCgpOwotCQkJCQkJCQkJCQlpZiAoZGVsZXRlZEdVSURzLmNvbnRhaW5zKGd1aWQpKSB7Ci0JCQkJCQkJCQkJCQlyZXNvbHZlID0gdHJ1ZTsKLQkJCQkJCQkJCQkJCWJyZWFrIGNoZWNrX3Jlc29sdmU7Ci0JCQkJCQkJCQkJCX0KLQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCQlpZiAocmVzb2x2ZSkgewotCQkJCQkJCQkJCUNvbGxlY3Rpb248T2JqZWN0PiBkZWxldGVkRWxlbWVudHMgPSBuZXcgSGFzaFNldDxPYmplY3Q+KCk7Ci0JCQkJCQkJCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGxpc3QKLQkJCQkJCQkJCQkJCS5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJCQkJCU9iamVjdCBvID0gaXRlcmF0b3IubmV4dCgpOwotCQkJCQkJCQkJCQlpZihvIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCAmJiBkZWxldGVkR1VJRHMuY29udGFpbnMoKChNZXRob2RFbGVtZW50KSBvKS5nZXRHdWlkKCkpKSB7Ci0JCQkJCQkJCQkJCQlkZWxldGVkRWxlbWVudHMuYWRkKG8pOwotCQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQkJfQotCQkJCQkJCQkJCWZvciAoT2JqZWN0IGUgOiBkZWxldGVkRWxlbWVudHMpIHsKLQkJCQkJCQkJCQkJaWYob3Bwb3NpdGVGZWF0dXJlLmlzTWFueSgpKSB7Ci0JCQkJCQkJCQkJCQltckVPYmplY3Qub3Bwb3NpdGVBZGQob3Bwb3NpdGVGZWF0dXJlLCBlKTsKLQkJCQkJCQkJCQkJfQotCQkJCQkJCQkJCQllbHNlIHsKLQkJCQkJCQkJCQkJCW1yRU9iamVjdC5nZXRPcHBvc2l0ZUZlYXR1cmVNYXAoKS5wdXQob3Bwb3NpdGVGZWF0dXJlLCBlKTsKLQkJCQkJCQkJCQkJfQotCQkJCQkJCQkJCX0JCQkJCQkJCQkJCi0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQlPYmplY3QgdmFsdWUgPSBlbGVtZW50LmVHZXQoZUZlYXR1cmUsIGZhbHNlKTsKLQkJCQkJCQkJaWYgKHZhbHVlIGluc3RhbmNlb2YgSW50ZXJuYWxFT2JqZWN0KSB7Ci0JCQkJCQkJCQlJbnRlcm5hbEVPYmplY3QgZSA9IChJbnRlcm5hbEVPYmplY3QpIHZhbHVlOwotCQkJCQkJCQkJaWYgKGUuZUlzUHJveHkoKSkgewotCQkJCQkJCQkJCVN0cmluZyBndWlkID0gZS5lUHJveHlVUkkoKS5mcmFnbWVudCgpOwotCQkJCQkJCQkJCWlmIChkZWxldGVkR1VJRHMuY29udGFpbnMoZ3VpZCkpIHsKLQkJCQkJCQkJCQkJT2JqZWN0IG8gPSBlbGVtZW50LmVHZXQoZUZlYXR1cmUpOwotCQkJCQkJCQkJCQlpZihvcHBvc2l0ZUZlYXR1cmUuaXNNYW55KCkpIHsKLQkJCQkJCQkJCQkJCW1yRU9iamVjdC5vcHBvc2l0ZUFkZChvcHBvc2l0ZUZlYXR1cmUsIG8pOwotCQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQkJCWVsc2UgewotCQkJCQkJCQkJCQkJbXJFT2JqZWN0LmdldE9wcG9zaXRlRmVhdHVyZU1hcCgpLnB1dChvcHBvc2l0ZUZlYXR1cmUsIG8pOwotCQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQkJfQotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJLy8gZ2V0cyB0aGUgbmV3bHkgbG9hZGVkIGVsZW1lbnRzIHRvIGxvYWQgdGhlaXIgb3Bwb3NpdGUgZmVhdHVyZXMKLQkJCS8vCi0JCQlsb2FkZWRFbGVtZW50cy5hZGRBbGwoZWxlbWVudHMpOwotCQkJZWxlbWVudHMgPSBuZXcgSGFzaFNldChtYXAudmFsdWVzKCkpOwotCQkJZWxlbWVudHMucmVtb3ZlQWxsKGxvYWRlZEVsZW1lbnRzKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdlbmVyYXRlSHRtbChPYmplY3QgcmF3X2VsZW1lbnQsIEh0bWxCdWlsZGVyIGh0bWxCdWlsZGVyKSB7Ci0JCUlFbGVtZW50TGF5b3V0IGxheW91dCA9IG51bGw7Ci0JCVN0cmluZyBmaWxlX3VybCA9ICJhYm91dDpibGFuayI7IC8vJE5PTi1OTFMtMSQKLQkJT2JqZWN0IGVsZW1lbnQgPSBMaWJyYXJ5VXRpbC51bndyYXAocmF3X2VsZW1lbnQpOwotCQlpZiAoIHJhd19lbGVtZW50IGluc3RhbmNlb2YgQWN0aXZpdHlXcmFwcGVySXRlbVByb3ZpZGVyICkgewotCQkJQWN0aXZpdHlXcmFwcGVySXRlbVByb3ZpZGVyIHdyYXBwZXIgPSAoQWN0aXZpdHlXcmFwcGVySXRlbVByb3ZpZGVyKXJhd19lbGVtZW50OwotCQkJT2JqZWN0IHByb2MgPSB3cmFwcGVyLmdldFRvcEl0ZW0oKTsKLQkJCWlmICggZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQgJiYgcHJvYyBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzcyApIHsKLQkJCQlTdHJpbmcgcGF0aCA9IEFic3RyYWN0UHJvY2Vzc0VsZW1lbnRMYXlvdXQuZ2V0UGF0aCh3cmFwcGVyKTsKLQkJCQkvL1N5c3RlbS5vdXQucHJpbnRsbih0b3BJdGVtKTsKLQkJCQlsYXlvdXQgPSBodG1sQnVpbGRlci5nZXRMYXlvdXRNYW5hZ2VyKCkKLQkJCQkJLmNyZWF0ZUxheW91dCgoTWV0aG9kRWxlbWVudCllbGVtZW50LCAKLQkJCQkJCQkob3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzKXByb2MsIHBhdGgpOwotCQkJCWZpbGVfdXJsID0gaHRtbEJ1aWxkZXIuZ2VuZXJhdGVIdG1sKGxheW91dCk7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAocmF3X2VsZW1lbnQgaW5zdGFuY2VvZiBQcmFjdGljZVN1Ymdyb3VwSXRlbVByb3ZpZGVyKSB7Ci0JCQlQcmFjdGljZVN1Ymdyb3VwSXRlbVByb3ZpZGVyIHByb3ZpZGVyID0gKFByYWN0aWNlU3ViZ3JvdXBJdGVtUHJvdmlkZXIpIHJhd19lbGVtZW50OwotCQkJbGF5b3V0ID0gbmV3IFN1bW1hcnlQYWdlTGF5b3V0KGh0bWxCdWlsZGVyLmdldExheW91dE1hbmFnZXIoKSwKLQkJCQkJcHJvdmlkZXIuZ2V0UHJhY3RpY2UoKSwgcHJvdmlkZXIuZ2V0VGV4dChudWxsKSwKLQkJCQkJcHJvdmlkZXIuZ2V0VGV4dChudWxsKSwgKExpc3QpIHByb3ZpZGVyLmdldENoaWxkcmVuKG51bGwpLAotCQkJCQlwcm92aWRlci5nZXRUZXh0KG51bGwpKTsKLQkJCSgoU3VtbWFyeVBhZ2VMYXlvdXQpIGxheW91dCkuc2V0SHRtbEJ1aWxkZXIoaHRtbEJ1aWxkZXIpOwotCQkJZmlsZV91cmwgPSBodG1sQnVpbGRlci5nZW5lcmF0ZUh0bWwobGF5b3V0KTsKLQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJCWZpbGVfdXJsID0gaHRtbEJ1aWxkZXIuZ2VuZXJhdGVIdG1sKChNZXRob2RFbGVtZW50KWVsZW1lbnQpOwotCQl9Ci0JCQotCQlpZiAoIGZpbGVfdXJsID09IG51bGwgKSB7Ci0JCQlmaWxlX3VybCA9ICJhYm91dDpibGFuayI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQkvLyBvbiBsaW51eCwgdGhlIGZpbGUgcGF0aCBuZWVkIHRvIGJlIHNwZWNpZmllZCBhcyBmaWxlLCBvdGhlcndpc2UgaXQgd2lsbCBiZSB0cmVhdGVkIGFzIHVybAotCQkvLyBhbmQgY2FzdWlnbiBlbmNvZGluZy9kZWNvZGluZyBpc3N1ZQotCQkvLyBMaW51eDogQ29uZmlndXJhdGlvbiBuYW1lcyBjb250YWluaW5nIGFjY2VudGVkIGNoYXJhY3RlcnMgY2Fubm90IGJlIGJyb3dzZWQuCi0JCWVsc2UgewkJCQotCQkJaWYgKCFTV1QuZ2V0UGxhdGZvcm0oKS5lcXVhbHMoIndpbjMyIikgJiYgIWZpbGVfdXJsLnN0YXJ0c1dpdGgoImZpbGU6Ly8iKSAmJiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkhZmlsZV91cmwuZXF1YWxzKCJhYm91dDpibGFuayIpKSAvLyROT04tTkxTLTEkCi0JCQl7Ci0JCQkJZmlsZV91cmwgPSAiZmlsZTovLyIgKyBmaWxlX3VybDsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJCi0JCQkvLyBCdWcgMjAxMzM1IC0gUmVmcmVzaCBkb2VzIG5vdCB3b3JrIGNvcnJlY3RseSBmb3IgcHJvY2VzcyBwYWdlcyBpbiBicm93c2luZyBtb2RlCi0JCQkvLyBuZWVkIHRvIGFwcGVuZCB0aGUgcXVlcnkgc3RyaW5nCi0JCQlpZiAoIGxheW91dCBpbnN0YW5jZW9mIEFic3RyYWN0UHJvY2Vzc0VsZW1lbnRMYXlvdXQgKSB7Ci0JCQkJZmlsZV91cmwgKz0gKChBYnN0cmFjdFByb2Nlc3NFbGVtZW50TGF5b3V0KWxheW91dCkuZ2V0UXVlcnlTdHJpbmcoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmlsZV91cmw7Ci0JfQotCQotCS8vU2hvdWxkIGJlIG92ZXJyaWRlbiBieSBzdWIgY2xhc3NlcwotCXB1YmxpYyBFbGVtZW50TGF5b3V0RXh0ZW5kZXIgbmV3RWxlbWVudExheW91dEV4dGVuZGVyKEFic3RyYWN0RWxlbWVudExheW91dCBsYXlvdXQpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGRlYnVnRHVtcChTdHJpbmcgbXNnKSB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiTEQ+ICIgKyBnZXRDbGFzcygpICsgIi5kZWJ1Z0R1bXA6ICIgKyBtc2cpOwkvLyROT04tTkxTLTEkLy8kTk9OLU5MUy0yJAotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9Db25maWd1cmF0aW9uQWxyZWFkeUV4aXN0c0V4Y2VwdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L0NvbmZpZ3VyYXRpb25BbHJlYWR5RXhpc3RzRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3ZGJkNDIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L0NvbmZpZ3VyYXRpb25BbHJlYWR5RXhpc3RzRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeTsKLQotLyoqCi0gKiBTaWduYWxzIHRoYXQgYSBNZXRob2QgQ29uZmlndXJhdGlvbiBhbHJlYWR5IGV4aXN0cy4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBDb25maWd1cmF0aW9uQWxyZWFkeUV4aXN0c0V4Y2VwdGlvbiBleHRlbmRzCi0JCUxpYnJhcnlTZXJ2aWNlRXhjZXB0aW9uIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgQ29uZmlndXJhdGlvbkFscmVhZHlFeGlzdHNFeGNlcHRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBnaXZlbiB0aGUgcm9vdCBjYXVzZSBvZiB0aGUgZXhjZXB0aW9uLgotCSAqIAotCSAqIEBwYXJhbSByb290Q2F1c2UKLQkgKiAgICAgICAgICAgIHRoZSByb290IGNhdXNlIG9mIHRoZSBleGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgQ29uZmlndXJhdGlvbkFscmVhZHlFeGlzdHNFeGNlcHRpb24oVGhyb3dhYmxlIHJvb3RDYXVzZSkgewotCQlzdXBlcihyb290Q2F1c2UpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UgZ2l2ZW4gdGhlIGVycm9yIG1lc3NhZ2UuCi0JICogCi0JICogQHBhcmFtIGVycm9yTXNnCi0JICogICAgICAgICAgICB0aGUgZXJyb3IgbWVzc2FnZQotCSAqLwotCXB1YmxpYyBDb25maWd1cmF0aW9uQWxyZWFkeUV4aXN0c0V4Y2VwdGlvbihTdHJpbmcgZXJyb3JNc2cpIHsKLQkJc3VwZXIoZXJyb3JNc2cpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UgZ2l2ZW4gdGhlIGVycm9yIG1lc3NhZ2UgYW5kIHRoZSByb290IGNhdXNlIG9mIHRoZQotCSAqIGV4Y2VwdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gZXJyb3JNc2cKLQkgKiAgICAgICAgICAgIHRoZSBlcnJvciBtZXNzYWdlCi0JICogQHBhcmFtIHJvb3RDYXVzZQotCSAqICAgICAgICAgICAgdGhlIHJvb3QgY2F1c2Ugb2YgdGhlIGV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBDb25maWd1cmF0aW9uQWxyZWFkeUV4aXN0c0V4Y2VwdGlvbihTdHJpbmcgZXJyb3JNc2csCi0JCQlUaHJvd2FibGUgcm9vdENhdXNlKSB7Ci0JCXN1cGVyKGVycm9yTXNnLCByb290Q2F1c2UpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L0NvbmZpZ3VyYXRpb25NYW5hZ2VyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvQ29uZmlndXJhdGlvbk1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzU5ZDg4NS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvQ29uZmlndXJhdGlvbk1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwOSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb25Qcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uU3VwcG9ydGluZ0VsZW1lbnREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uY2xvc3VyZS5Db25maWd1cmF0aW9uQ2xvc3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLmNsb3N1cmUuRGVwZW5kZW5jeU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLk1ldGhvZEVsZW1lbnRQcm9wZXJ0eU1ncjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuRWxlbWVudExheW91dE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLQotLyoqCi0gKiBNYW5hZ2VzIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24uCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQ29uZmlndXJhdGlvbk1hbmFnZXIgaW1wbGVtZW50cyBJQ29uZmlndXJhdGlvbk1hbmFnZXIgewotCi0JLy8gSWYgdHJ1ZSwgZ2VuZXJhdGUgZGVidWcgdHJhY2VzLgotCXByb3RlY3RlZCBzdGF0aWMgYm9vbGVhbiBkZWJ1ZyA9IExpYnJhcnlQbHVnaW4uZ2V0RGVmYXVsdCgpLmlzRGVidWdnaW5nKCk7Ci0KLQkvLyBUaGUgbWFuYWdlZCBtZXRob2QgY29uZmlndXJhaXRvbi4KLQlwcm90ZWN0ZWQgTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWc7Ci0JCi0JLy8gVGhlIG1hbmFnZWQgY29uZmlndXJhaXRvbiBkYXRhLgotCXByaXZhdGUgQ29uZmlndXJhdGlvbkRhdGEgY29uZmlnRGF0YTsKLQkKLQlwcml2YXRlIFN1cHBvcnRpbmdFbGVtZW50RGF0YSBzdXBwb3J0aW5nRWxlbWVudERhdGE7Ci0JCi0JcHJpdmF0ZSBDb25maWd1cmF0aW9uUHJvcGVydGllcyBjb25maWdQcm9wczsKLQotCS8vIFRoZSBjb250YWluaW5nIG1ldGhvZCBsaWJyYXJ5IGZvciB0aGUgbWFuYWdlZCBtZXRob2QgY29uZmlndXJhdGlvbi4KLQlwcm90ZWN0ZWQgTWV0aG9kTGlicmFyeSBsaWJyYXJ5OwotCi0JLy8gVGhlIGxpYnJhcnkgbWFuYWdlciBmb3IgdGhlIGNvbnRhaW5pbmcgbWV0aG9kIGxpYnJhcnkuCi0JcHJvdGVjdGVkIElMaWJyYXJ5TWFuYWdlciBsaWJyYXJ5TWFuYWdlcjsKLQotCS8vIFRoZSBkZXBlbmRlbmN5IG1hbmFnZXIuCi0JcHJvdGVjdGVkIERlcGVuZGVuY3lNYW5hZ2VyIGRlcGVuZGVuY3lNYW5hZ2VyOwotCi0JLy8gVGhlIGxheW91dCBtYW5hZ2VyLgotCXByb3RlY3RlZCBFbGVtZW50TGF5b3V0TWFuYWdlciBsYXlvdXRNYW5hZ2VyOwotCi0JLy8gVGhlIGNvbmZpZ3VyYXRpb24gY2xvc3VyZS4KLQlwcm90ZWN0ZWQgQ29uZmlndXJhdGlvbkNsb3N1cmUgY2xvc3VyZTsKLQotCXByb3RlY3RlZCBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlciBhZmNwOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gY29uZmlnCi0JICogICAgICAgICAgICBhIG1ldGhvZCBjb25maWd1cmF0aW9uCi0JICovCi0JcHVibGljIENvbmZpZ3VyYXRpb25NYW5hZ2VyKE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0JCXRoaXMuY29uZmlnID0gY29uZmlnOwotCQkKLQkJc3VwcG9ydGluZ0VsZW1lbnREYXRhID0gbmV3IFN1cHBvcnRpbmdFbGVtZW50RGF0YShjb25maWcpOwotCQljb25maWdEYXRhID0gQ29uZmlndXJhdGlvbkRhdGEubmV3Q29uZmlndXJhdGlvbkRhdGEoY29uZmlnKTsKLQkJCQkKLQkJY29uZmlnUHJvcHMgPSBuZXcgQ29uZmlndXJhdGlvblByb3BlcnRpZXMoY29uZmlnKTsKLQkJTWV0aG9kRWxlbWVudFByb3BlcnR5TWdyLmdldEluc3RhbmNlKCkucmVnaXN0ZXIoY29uZmlnLCBjb25maWdQcm9wcyk7Ci0KLQkJbGlicmFyeSA9IExpYnJhcnlTZXJ2aWNlVXRpbC5nZXRNZXRob2RMaWJyYXJ5KGNvbmZpZyk7Ci0KLQkJbGlicmFyeU1hbmFnZXIgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJLmdldExpYnJhcnlNYW5hZ2VyKGxpYnJhcnkpOwotCQlhZmNwID0gbmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKGxpYnJhcnlNYW5hZ2VyCi0JCQkJLmdldEFkYXB0ZXJGYWN0b3J5KCkpOwotCi0JCWRlcGVuZGVuY3lNYW5hZ2VyID0gbmV3IERlcGVuZGVuY3lNYW5hZ2VyKGxpYnJhcnkpOwotCi0JCWlmIChjb25maWcgPT0gbnVsbCkgewotCQkJbGF5b3V0TWFuYWdlciA9IG5ldyBFbGVtZW50TGF5b3V0TWFuYWdlcigpOwotCQl9IGVsc2UgewotCQkJbGF5b3V0TWFuYWdlciA9IG5ldyBFbGVtZW50TGF5b3V0TWFuYWdlcihjb25maWcpOwotCQkJLy8gY2xvc3VyZSA9IG5ldyBDb25maWd1cmF0aW9uQ2xvc3VyZSh0aGlzLCBjb25maWcpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgbWV0aG9kIGNvbmZpZ3VyYXRpb24gbWFuYWdlZCBieSB0aGlzIGNvbmZpZ3VyYXRpb24gbWFuYWdlci4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24KLQkgKi8KLQlwdWJsaWMgTWV0aG9kQ29uZmlndXJhdGlvbiBnZXRNZXRob2RDb25maWd1cmF0aW9uKCkgewotCQlyZXR1cm4gY29uZmlnOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LklDb25maWd1cmF0aW9uTWFuYWdlciNnZXRDb25maWd1cmF0aW9uRGF0YSgpCi0JICovCi0JcHVibGljIENvbmZpZ3VyYXRpb25EYXRhIGdldENvbmZpZ3VyYXRpb25EYXRhKCkgewotCQlyZXR1cm4gY29uZmlnRGF0YTsKLQl9Ci0JCi0JcHVibGljIFN1cHBvcnRpbmdFbGVtZW50RGF0YSBnZXRTdXBwb3J0aW5nRWxlbWVudERhdGEoKSB7Ci0JCXJldHVybiBzdXBwb3J0aW5nRWxlbWVudERhdGE7Ci0JfQotCQotCS8qKgotCSAqIEdldHMgdGhlIGNvbnRhaW5pbmcgbWV0aG9kIGxpYnJhcnkgZm9yIHRoZSBtYW5hZ2VkIG1ldGhvZCBjb25maWd1cmF0aW9uLgotCSAqIAotCSAqIEByZXR1cm4gYSBtZXRob2QgbGlicmFyeQotCSAqLwotCXB1YmxpYyBNZXRob2RMaWJyYXJ5IGdldE1ldGhvZExpYnJhcnkoKSB7Ci0JCXJldHVybiBsaWJyYXJ5OwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGFkYXB0ZXIgZmFjdG9yeS4KLQkgKiAKLQkgKiBAcmV0dXJuIGFuIGFkYXB0ZXIgZmFjdG9yeQotCSAqLwotCXB1YmxpYyBBZGFwdGVyRmFjdG9yeSBnZXRBZGFwdGVyRmFjdG9yeSgpIHsKLQkJcmV0dXJuIGxpYnJhcnlNYW5hZ2VyLmdldEFkYXB0ZXJGYWN0b3J5KCk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgYWRhcHRlciBmYWN0b3J5IGNvbnRlbnQgcHJvdmlkZXIuCi0JICogCi0JICogQHJldHVybiBhbiBhZGFwdGVyIGZhY3RvcnkgY29udGVudCBwcm92aWRlcgotCSAqLwotCXB1YmxpYyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlciBnZXRDb250ZW50UHJvdmlkZXIoKSB7Ci0JCXJldHVybiBhZmNwOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGRlcGVuZGVuY3kgbWFuYWdlci4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgZGVwZW5kZW5jeSBtYW5hZ2VyCi0JICovCi0JcHVibGljIERlcGVuZGVuY3lNYW5hZ2VyIGdldERlcGVuZGVuY3lNYW5hZ2VyKCkgewotCQlyZXR1cm4gZGVwZW5kZW5jeU1hbmFnZXI7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZWxlbWVudCBsYXlvdXQgbWFuYWdlci4KLQkgKiAKLQkgKiBAcmV0dXJuIGFuIGVsZW1lbnQgbGF5b3V0IG1hbmFnZXIKLQkgKi8KLQlwdWJsaWMgRWxlbWVudExheW91dE1hbmFnZXIgZ2V0RWxlbWVudExheW91dE1hbmFnZXIoKSB7Ci0JCXJldHVybiBsYXlvdXRNYW5hZ2VyOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGNvbmZpZ3VyYXRpb24gY2xvc3VyZS4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgY29uZmlndXJhdGlvbiBjbG9zdXJlCi0JICovCi0JcHVibGljIENvbmZpZ3VyYXRpb25DbG9zdXJlIGdldENvbmZpZ3VyYXRpb25DbG9zdXJlKCkgewotCQlyZXR1cm4gY2xvc3VyZTsKLQl9Ci0KLQkvKioKLQkgKiBNYWtlcyBhIGNvbmZpZ3VyYXRpb24gY2xvc3VyZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBtYWtlQ29uZmlndXJhdGlvbkNsb3N1cmUoKSB7Ci0JCWlmIChjbG9zdXJlICE9IG51bGwpIHsKLQkJCWNsb3N1cmUuZml4RXJyb3JzKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbGlzdCBvZiBtZXRob2QgcGx1Zy1pbnMgaW4gdGhlIGNvbnRhaW5pbmcgbWV0aG9kIGxpYnJhcnkuCi0JICogCi0JICogQHJldHVybiBhIGxpc3Qgb2YgbWV0aG9kIHBsdWctaW5zCi0JICovCi0JcHVibGljIExpc3QgZ2V0TWV0aG9kUGx1Z2lucygpIHsKLQkJcmV0dXJuIGxpYnJhcnkuZ2V0TWV0aG9kUGx1Z2lucygpOwotCX0KLQotCS8qKgotCSAqIERpc3Bvc2VzIGFsbCByZXNvdXJjZXMgYWxsb2NhdGVkIGJ5IHRoaXMgY29uZmlndXJhdGlvbiBtYW5hZ2VyLgotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWNvbmZpZ0RhdGEuZGlzcG9zZSgpOwotCQljb25maWdEYXRhID0gbnVsbDsKLQkJY29uZmlnID0gbnVsbDsKLQkJbGlicmFyeSA9IG51bGw7Ci0JCWxpYnJhcnlNYW5hZ2VyID0gbnVsbDsKLQkJZGVwZW5kZW5jeU1hbmFnZXIgPSBudWxsOwotCQlsYXlvdXRNYW5hZ2VyID0gbnVsbDsKLQkJY2xvc3VyZSA9IG51bGw7Ci0JCU1ldGhvZEVsZW1lbnRQcm9wZXJ0eU1nci5nZXRJbnN0YW5jZSgpLnVucmVnaXN0ZXIoY29uZmlnKTsKLQkJY29uZmlnUHJvcHMgPSBudWxsOwotCX0KLQotCXB1YmxpYyBDb25maWd1cmF0aW9uUHJvcGVydGllcyBnZXRDb25maWd1cmF0aW9uUHJvcGVydGllcygpIHsKLQkJcmV0dXJuIGNvbmZpZ1Byb3BzOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L0NyZWF0ZUxpYnJhcnlNYW5hZ2VyRXhjZXB0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvQ3JlYXRlTGlicmFyeU1hbmFnZXJFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmZhMGQxZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvQ3JlYXRlTGlicmFyeU1hbmFnZXJFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5OwotCi0vKioKLSAqIFNpZ25hbHMgdGhhdCBhIExpYnJhcnkgTWFuYWdlciBpbnN0YW5jZSBjYW5ub3QgYmUgY3JlYXRlZC4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBDcmVhdGVMaWJyYXJ5TWFuYWdlckV4Y2VwdGlvbiBleHRlbmRzIExpYnJhcnlTZXJ2aWNlRXhjZXB0aW9uIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgQ3JlYXRlTGlicmFyeU1hbmFnZXJFeGNlcHRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBnaXZlbiB0aGUgcm9vdCBjYXVzZSBvZiB0aGUgZXhjZXB0aW9uLgotCSAqIAotCSAqIEBwYXJhbSByb290Q2F1c2UKLQkgKiAgICAgICAgICAgIHRoZSByb290IGNhdXNlIG9mIHRoZSBleGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgQ3JlYXRlTGlicmFyeU1hbmFnZXJFeGNlcHRpb24oVGhyb3dhYmxlIHJvb3RDYXVzZSkgewotCQlzdXBlcihyb290Q2F1c2UpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UgZ2l2ZW4gdGhlIGVycm9yIG1lc3NhZ2UuCi0JICogCi0JICogQHBhcmFtIGVycm9yTXNnCi0JICogICAgICAgICAgICB0aGUgZXJyb3IgbWVzc2FnZQotCSAqLwotCXB1YmxpYyBDcmVhdGVMaWJyYXJ5TWFuYWdlckV4Y2VwdGlvbihTdHJpbmcgZXJyb3JNc2cpIHsKLQkJc3VwZXIoZXJyb3JNc2cpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UgZ2l2ZW4gdGhlIGVycm9yIG1lc3NhZ2UgYW5kIHRoZSByb290IGNhdXNlIG9mIHRoZQotCSAqIGV4Y2VwdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gZXJyb3JNc2cKLQkgKiAgICAgICAgICAgIHRoZSBlcnJvciBtZXNzYWdlCi0JICogQHBhcmFtIHJvb3RDYXVzZQotCSAqICAgICAgICAgICAgdGhlIHJvb3QgY2F1c2Ugb2YgdGhlIGV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBDcmVhdGVMaWJyYXJ5TWFuYWdlckV4Y2VwdGlvbihTdHJpbmcgZXJyb3JNc2csIFRocm93YWJsZSByb290Q2F1c2UpIHsKLQkJc3VwZXIoZXJyb3JNc2csIHJvb3RDYXVzZSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvSUNvbmZpZ3VyYXRpb25DbG9zdXJlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvSUNvbmZpZ3VyYXRpb25DbG9zdXJlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlNzMxZmQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L0lDb25maWd1cmF0aW9uQ2xvc3VyZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5OwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLmNsb3N1cmUuRWxlbWVudERlcGVuZGVuY3lFcnJvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotCi0vKioKLSAqIFRoZSBpbnRlcmZhY2UgZm9yIGEgTWV0aG9kIENvbmZpZ3VyYXRpb24gQ2xvc3VyZS4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUNvbmZpZ3VyYXRpb25DbG9zdXJlIHsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGhvZCBjb25maWd1cmF0aW9uIG1hbmFnZXIuCi0JICogCi0JICogQHJldHVybiBhIGNvbmZpZ3VyYXRpb24gbWFuYWdlcgotCSAqLwotCXB1YmxpYyBJQ29uZmlndXJhdGlvbk1hbmFnZXIgZ2V0Q29uZmlndXJhdGlvbk1hbmFnZXIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGhvZCBjb25maWd1cmF0aW9uLgotCSAqIAotCSAqIEByZXR1cm4gYSBtZXRob2QgY29uZmlndXJhdGlvbgotCSAqLwotCXB1YmxpYyBNZXRob2RDb25maWd1cmF0aW9uIGdldENvbmZpZ3VyYXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGNvbnRhaW5pbmluZyBtZXRob2QgbGlicmFyeS4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgbWV0aG9kIGxpYnJhcnkKLQkgKi8KLQlwdWJsaWMgTWV0aG9kTGlicmFyeSBnZXRMaWJyYXJ5KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBtZXRob2QgcGx1Zy1pbnMgYW5kIHBhY2thZ2VzIHNlbGVjdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudHMKLQkgKiAgICAgICAgICAgIGFuIGFycmF5IG9mIG1ldGhvZCBwbHVnLWlucyBhbmQgcGFja2FnZXMKLQkgKi8KLQkvL3B1YmxpYyB2b2lkIHNldFNlbGVjdGlvbnMoT2JqZWN0W10gZWxlbWVudHMpOwotCi0JLyoqCi0JICogQ2hlY2tzIHdoZXRoZXIgYSBtZXRob2QgcGx1Zy1pbiBvciBwYWNrYWdlIGlzIHNlbGVjdGVkLgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGdpdmVuIGVsZW1lbnQgaXMgc2VsZWN0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NlbGVjdGVkKE9iamVjdCBpbnB1dCk7Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBlbGVtZW50IGRlcGVuZGVuY3kgZXJyb3IgZm9yIGEgbWV0aG9kIGVsZW1lbnQuCi0JICogCi0JICogQGVsZW1lbnQgQSBtZXRob2QgZWxlbWVudC4KLQkgKiAKLQkgKiBAcmV0dXJuIGFuIGFycmF5IG9mIDxjb2RlPkVsZW1lbnREZXBlbmRlbmN5RXJyb3I8L2NvZGU+Ci0JICovCi0JcHVibGljIEVsZW1lbnREZXBlbmRlbmN5RXJyb3IgZ2V0RXJyb3IoT2JqZWN0IGVsZW1lbnQpOwotCi0JLyoqCi0JICogQ2hlY2tzIHdoZXRoZXIgdGhlIGNsb3N1cmUgaGFzIGFueSBlcnJvci4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBjbG9zdXJlIGhhcyBvbmUgb3IgbW9yZSBlcnJvcnMKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNFcnJvcigpOwotCi0JLyoqCi0JICogQ2hlY2tzIHdoZXRoZXIgdGhlIGNsb3N1cmUgaGFzIGFueSBwcm9ibGVtLgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGNsb3N1cmUgaGFzIG9uZSBvciBtb3JlIHByb2JsZW1zLlwKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNQcm9ibGVtKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFsbCB0aGUgZXJyb3JzLgotCSAqIAotCSAqIEByZXR1cm4gYSBsaXN0IG9mIDxjb2RlPkVycm9ySW5mbzwvY29kZT4KLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRBbGxFcnJvcnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYWxsIHRoZSBkZXBlbmRlbmN5IGVycm9ycy4KLQkgKiAKLQkgKiBAcmV0dXJuIGFuIGFycmF5IG9mIDxjb2RlPkVsZW1lbnREZXBlbmRlbmN5RXJyb3I8L2NvZGU+Ci0JICovCi0JcHVibGljIE9iamVjdFtdIGdldERlcGVuZGVuY3lFcnJvcnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYWxsIHRoZSBpbnZhbGlkIGVsZW1lbnRzLgotCSAqIAotCSAqIEByZXR1cm4gYSBsaXN0IG9mIGludmFsaWQgZWxlbWVudHMKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRJbnZhbGlkRWxlbWVudHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYWxsIHRoZSBjaGFuZ2VkIGVsZW1lbnRzLiBUaGVzZSBhcmUgZWxlbWVudHMgd2hvc2UgY2hlY2sgc3RhdGVzCi0JICogaGF2ZSBjaGFuZ2VkIG9yIHdob3NlIGltYWdlIGhhdmUgY2hhbmdlZCBkdWUgdG8gZXJyb3IuCi0JICogCi0JICogQHJldHVybiBhIGxpc3Qgb2YgY2hhbmdlZCBtZXRob2QgZWxlbWVudHMKLQkgKi8KLQkvL3B1YmxpYyBMaXN0IGdldENoYW5nZWRFbGVtZW50cygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0aG9kIHBsdWctaW5zIGFuZCBwYWNrYWdlcyBzZWxlY3Rpb24uCi0JICogCi0JICogQHJldHVybiBhbiBhcnJheSBvZiBtZXRob2QgcGx1Zy1pbnMgYW5kIHBhY2thZ2VzCi0JICovCi0JcHVibGljIE9iamVjdFtdIGdldFNlbGVjdGlvbigpOwotCi0JLyoqCi0JICogZml4IHRoZSBlcnJvcnMgaW4gdGhlIGNvbmZpZ3VyYXRpb25zCi0JICovCi0JcHVibGljIHZvaWQgZml4RXJyb3JzKCk7Ci0KLQkvKioKLQkgKiBGaXhlcyBhbGwgZXJyb3JzIGFuZCB3YXJuaW5ncyBpbiB0aGUgY2xvc3VyZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBmaXhQcm9ibGVtcygpOwotCi0JLyoqCi0JICogU2F2ZXMgdGhlIG1ldGhvZCBjb25maWd1cmF0aW9uLgotCSAqLwotCS8vcHVibGljIHZvaWQgc2F2ZU1ldGhvZENvbmZpZ3VyYXRpb24oKTsKLQotCS8qKgotCSAqIFBhY2thZ2VzIHRoZSBsaWJyYXJ5IGJhc2VkIG9uIHRoZSBzZWxlY3Rpb24uCi0JICogPHA+Ci0JICogTm90ZTogVGhpcyB3aWxsIGNoYW5nZSB0aGUgY3VycmVudCBsaWJyYXJ5LiBCZWZvcmUgY2FsbGluZyB0aGlzIG1ldGhvZCwgYQotCSAqIGNvcHkgb2YgdGhlIGN1cnJlbnQgbGlicmFyeSBzaG91bGQgYmUgY3JlYXRlZCB3aXRoIHRoZSBmb2xsb3dpbmcgc3RlcHM6Ci0JICogMS4gQ3JlYXRlIGEgbmV3IDxjb2RlPkNvbmZpZ3VyYXRpb25NYW5hZ2VyPC9jb2RlPiB3aXRoIGEgY29weSBvZiB0aGUKLQkgKiBvcmlnaW5hbCBsaWJyYXJ5LCAyLiBSZWJ1aWxkIHRoZSBkZXBlbmRlbmN5LCAzLiBDcmVhdGUgYQotCSAqIDxjb2RlPkNvbmZpZ3VyYXRpb25DbG9zdXJlPC9jb2RlPiB3aXRoIHRoZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24uCi0JICogCi0JICogQHBhcmFtIHJlbW92ZUJyb2tlblJlZmVyZW5jZXMKLQkgKiAgICAgICAgICAgIGlmIDxjb2RlPnRydWU8L2NvZGU+LCByZW1vdmUgYWxsIGJyb2tlbiByZWZlcmVuY2VzCi0JICogQHJldHVybiBhIG1ldGhvZCBsaWJyYXJ5Ci0JICovCi0JcHVibGljIE1ldGhvZExpYnJhcnkgcGFja2FnZUxpYnJhcnkoYm9vbGVhbiByZW1vdmVCcm9rZW5SZWZlcmVuY2VzKTsKLQotCS8qKgotCSAqIERpc3Bvc2VzIHJlc291cmNlcyBhbGxvY2F0ZWQgYnkgdGhpcyBjbG9zdXJlLgotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKTsKLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L0lDb25maWd1cmF0aW9uTWFuYWdlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L0lDb25maWd1cmF0aW9uTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NzkyMTc0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9JQ29uZmlndXJhdGlvbk1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb25Qcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uU3VwcG9ydGluZ0VsZW1lbnREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uY2xvc3VyZS5Db25maWd1cmF0aW9uQ2xvc3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLmNsb3N1cmUuRGVwZW5kZW5jeU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LkVsZW1lbnRMYXlvdXRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci0KLS8qKgotICogVGhlIGludGVyZmFjZSBmb3IgYSBNZXRob2QgQ29uZmlndXJhdGlvbiBNYW5hZ2VyLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJQ29uZmlndXJhdGlvbk1hbmFnZXIgewotCi0JLyoqCi0JICogR2V0cyB0aGUgbWV0aG9kIGNvbmZpZ3VyYXRpb24gbWFuYWdlZCBieSB0aGlzIGNvbmZpZ3VyYXRpb24gbWFuYWdlci4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24KLQkgKi8KLQlwdWJsaWMgTWV0aG9kQ29uZmlndXJhdGlvbiBnZXRNZXRob2RDb25maWd1cmF0aW9uKCk7Ci0JCi0JLyoqCi0JICogR2V0cyBDb25maWd1cmF0aW9uRGF0YSBvYmplY3QgbWFuYWdlZCBieSB0aGlzIGNvbmZpZ3VyYXRpb24gbWFuYWdlci4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgQ29uZmlndXJhdGlvbkRhdGEgb2JqZWN0Ci0JICovCi0JcHVibGljIENvbmZpZ3VyYXRpb25EYXRhIGdldENvbmZpZ3VyYXRpb25EYXRhKCk7Ci0JCi0JLyoqCi0JICogR2V0cyBTdXBwb3J0aW5nRWxlbWVudERhdGEgb2JqZWN0IG1hbmFnZWQgYnkgdGhpcyBjb25maWd1cmF0aW9uIG1hbmFnZXIuCi0JICogCi0JICogQHJldHVybiBhIFN1cHBvcnRpbmdFbGVtZW50RGF0YSBvYmplY3QKLQkgKi8KLQlwdWJsaWMgU3VwcG9ydGluZ0VsZW1lbnREYXRhIGdldFN1cHBvcnRpbmdFbGVtZW50RGF0YSgpOwotCQotCS8qKgotCSAqIEdldHMgQ29uZmlndXJhdGlvblByb3BlcnRpZXMgb2JqZWN0IG1hbmFnZWQgYnkgdGhpcyBjb25maWd1cmF0aW9uIG1hbmFnZXIuCi0JICogCi0JICogQHJldHVybiBhIENvbmZpZ3VyYXRpb25Qcm9wZXJ0aWVzIG9iamVjdAotCSAqLwotCXB1YmxpYyBDb25maWd1cmF0aW9uUHJvcGVydGllcyBnZXRDb25maWd1cmF0aW9uUHJvcGVydGllcygpOwotCi0JLyoqCi0JICogR2V0cyB0aGUgY29udGFpbmluZyBtZXRob2QgbGlicmFyeSBmb3IgdGhlIG1hbmFnZWQgbWV0aG9kIGNvbmZpZ3VyYXRpb24uCi0JICogCi0JICogQHJldHVybiBhIG1ldGhvZCBsaWJyYXJ5Ci0JICovCi0JcHVibGljIE1ldGhvZExpYnJhcnkgZ2V0TWV0aG9kTGlicmFyeSgpOwotCi0JLyoqCi0JICogR2V0cyB0aGUgYWRhcHRlciBmYWN0b3J5LgotCSAqIAotCSAqIEByZXR1cm4gYW4gYWRhcHRlciBmYWN0b3J5Ci0JICovCi0JcHVibGljIEFkYXB0ZXJGYWN0b3J5IGdldEFkYXB0ZXJGYWN0b3J5KCk7Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBhZGFwdGVyIGZhY3RvcnkgY29udGVudCBwcm92aWRlci4KLQkgKiAKLQkgKiBAcmV0dXJuIGFuIGFkYXB0ZXIgZmFjdG9yeSBjb250ZW50IHByb3ZpZGVyCi0JICovCi0JcHVibGljIEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyIGdldENvbnRlbnRQcm92aWRlcigpOwotCi0JLyoqCi0JICogR2V0cyB0aGUgZGVwZW5kZW5jeSBtYW5hZ2VyLgotCSAqIAotCSAqIEByZXR1cm4gYSBkZXBlbmRlbmN5IG1hbmFnZXIKLQkgKi8KLQlwdWJsaWMgRGVwZW5kZW5jeU1hbmFnZXIgZ2V0RGVwZW5kZW5jeU1hbmFnZXIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGVsZW1lbnQgbGF5b3V0IG1hbmFnZXIuCi0JICogCi0JICogQHJldHVybiBhbiBlbGVtZW50IGxheW91dCBtYW5hZ2VyCi0JICovCi0JcHVibGljIEVsZW1lbnRMYXlvdXRNYW5hZ2VyIGdldEVsZW1lbnRMYXlvdXRNYW5hZ2VyKCk7Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBjb25maWd1cmF0aW9uIGNsb3N1cmUuCi0JICogCi0JICogQHJldHVybiBhIGNvbmZpZ3VyYXRpb24gY2xvc3VyZQotCSAqLwotCXB1YmxpYyBDb25maWd1cmF0aW9uQ2xvc3VyZSBnZXRDb25maWd1cmF0aW9uQ2xvc3VyZSgpOwotCi0JLyoqCi0JICogTWFrZXMgYSBjb25maWd1cmF0aW9uIGNsb3N1cmUuCi0JICovCi0JcHVibGljIHZvaWQgbWFrZUNvbmZpZ3VyYXRpb25DbG9zdXJlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbGlzdCBvZiBtZXRob2QgcGx1Zy1pbnMgaW4gdGhlIGNvbnRhaW5pbmcgbWV0aG9kIGxpYnJhcnkuCi0JICogCi0JICogQHJldHVybiBhIGxpc3Qgb2YgbWV0aG9kIHBsdWctaW5zCi0JICovCi0JcHVibGljIExpc3QgZ2V0TWV0aG9kUGx1Z2lucygpOwotCQotCS8qKgotCSAqIERpc3Bvc2VzIGFsbCByZXNvdXJjZXMgYWxsb2NhdGVkIGJ5IHRoaXMgY29uZmlndXJhdGlvbiBtYW5hZ2VyLgotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKTsKLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L0lMaWJyYXJ5TWFuYWdlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L0lMaWJyYXJ5TWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZTFhOTRiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9JTGlicmFyeU1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyNCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeTsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZFN0YWNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VkQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZXZlbnRzLklMaWJyYXJ5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5MaWJyYXJ5UHJvYmxlbU1vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JUHJvcGVydHlMaXN0ZW5lcjsKLQotLyoqCi0gKiBUaGUgaW50ZXJmYWNlIGZvciBhIExpYnJhcnkgTWFuYWdlci4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUxpYnJhcnlNYW5hZ2VyIHsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgbWV0aG9kIGxpYnJhcnkuCi0JICogCi0JICogQHBhcmFtIG5hbWUKLQkgKiAgICAgICAgICAgIGEgbmFtZSBmb3IgdGhlIG5ldyBtZXRob2QgbGlicmFyeQotCSAqIEBwYXJhbSBhcmdzCi0JICogICAgICAgICAgICBtZXRob2QgbGlicmFyeSBzcGVjaWZpYyBhcmd1bWVudHMKLQkgKiBAcmV0dXJuIGEgbWV0aG9kIGxpYnJhcnkKLQkgKiBAdGhyb3cgPGNvZGU+TGlicmFyeVNlcnZpY2VFeGNlcHRpb248L2NvZGU+IGlmIGFuIGVycm9yIG9jY3VycyB3aGlsZQotCSAqICAgICAgICBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KLQkgKi8KLQlwdWJsaWMgTWV0aG9kTGlicmFyeSBjcmVhdGVNZXRob2RMaWJyYXJ5KFN0cmluZyBuYW1lLAotCQkJTWFwPFN0cmluZywgT2JqZWN0PiBhcmdzKSB0aHJvd3MgTGlicmFyeVNlcnZpY2VFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBPcGVucyBhIG1ldGhvZCBsaWJyYXJ5LgotCSAqIAotCSAqIEBwYXJhbSB1cmkKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGxpYnJhcnkgVVJJCi0JICogQHJldHVybiBhIG1ldGhvZCBsaWJyYXJ5Ci0JICogQHRocm93IDxjb2RlPkxpYnJhcnlTZXJ2aWNlRXhjZXB0aW9uPC9jb2RlPiBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUKLQkgKiAgICAgICAgcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCi0JICovCi0JcHVibGljIE1ldGhvZExpYnJhcnkgb3Blbk1ldGhvZExpYnJhcnkoamF2YS5uZXQuVVJJIHVyaSkKLQkJCXRocm93cyBMaWJyYXJ5U2VydmljZUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIE9wZW5zIGEgbWV0aG9kIGxpYnJhcnkuCi0JICogCi0JICogQHBhcmFtIGFyZ3MKLQkgKiAgICAgICAgICAgIG1ldGhvZCBsaWJyYXJ5IHNwZWNpZmljIGFyZ3VtZW50cwotCSAqIEByZXR1cm4gYSBtZXRob2QgbGlicmFyeQotCSAqIEB0aHJvdyA8Y29kZT5MaWJyYXJ5U2VydmljZUV4Y2VwdGlvbjwvY29kZT4gaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlCi0JICogICAgICAgIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgotCSAqLwotCXB1YmxpYyBNZXRob2RMaWJyYXJ5IG9wZW5NZXRob2RMaWJyYXJ5KE1hcDxTdHJpbmcsIE9iamVjdD4gYXJncykKLQkJCXRocm93cyBMaWJyYXJ5U2VydmljZUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFJlb3BlbnMgdGhlIG1hbmFnZWQgbWV0aG9kIGxpYnJhcnkuCi0JICogCi0JICogQHJldHVybiBhIG1ldGhvZCBsaWJyYXJ5Ci0JICogQHRocm93IDxjb2RlPkxpYnJhcnlTZXJ2aWNlRXhjZXB0aW9uPC9jb2RlPiBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUKLQkgKiAgICAgICAgcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCi0JICovCi0JcHVibGljIE1ldGhvZExpYnJhcnkgcmVvcGVuTWV0aG9kTGlicmFyeSgpIHRocm93cyBMaWJyYXJ5U2VydmljZUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFNhdmVzIHRoZSBtYW5hZ2VkIG1ldGhvZCBsaWJyYXJ5LgotCSAqIAotCSAqIEB0aHJvdyA8Y29kZT5MaWJyYXJ5U2VydmljZUV4Y2VwdGlvbjwvY29kZT4gaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlCi0JICogICAgICAgIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHNhdmVNZXRob2RMaWJyYXJ5KCkgdGhyb3dzIExpYnJhcnlTZXJ2aWNlRXhjZXB0aW9uOwotCi0JLyoqCi0JICogRGlzY2FyZHMgYWxsIGNoYW5nZXMgbWFkZSB0byB0aGUgbWFuYWdlZCBtZXRob2QgbGlicmFyeS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNjYXJkTWV0aG9kTGlicmFyeUNoYW5nZXMoKTsKLQotCS8qKgotCSAqIENsb3NlcyB0aGUgbWFuYWdlZCBtZXRob2QgbGlicmFyeS4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgbWV0aG9kIGxpYnJhcnkKLQkgKiBAdGhyb3cgPGNvZGU+TGlicmFyeVNlcnZpY2VFeGNlcHRpb248L2NvZGU+IGlmIGFuIGVycm9yIG9jY3VycyB3aGlsZQotCSAqICAgICAgICBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBjbG9zZU1ldGhvZExpYnJhcnkoKSB0aHJvd3MgTGlicmFyeVNlcnZpY2VFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBtYW5hZ2VkIG1ldGhvZCBsaWJyYXJ5LgotCSAqIAotCSAqIEByZXR1cm4gYSBtZXRob2QgbGlicmFyeQotCSAqLwotCXB1YmxpYyBNZXRob2RMaWJyYXJ5IGdldE1ldGhvZExpYnJhcnkoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIG1hbmFnZWQgbWV0aG9kIGxpYnJhcnkuCi0JICogCi0JICogQHBhcmFtIGxpYnJhcnkKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGxpYnJhcnkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNZXRob2RMaWJyYXJ5KE1ldGhvZExpYnJhcnkgbGlicmFyeSk7Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBVUkkgb2YgdGhlIG1hbmFnZWQgbWV0aG9kIGxpYnJhcnkuCi0JICogCi0JICogQHJldHVybiBhIDxjb2RlPm9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk8L2NvZGU+Ci0JICovCi0JcHVibGljIGphdmEubmV0LlVSSSBnZXRNZXRob2RMaWJyYXJ5VVJJKCk7Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBhYnNvbHV0ZSBwYXRoIHRvIHRoZSBtYW5hZ2VkIG1ldGhvZCBsaWJyYXJ5LiBGb3IgZGlzdHJpYnV0ZWQKLQkgKiBsaWJyYXJ5LCB0aGlzIGlzIHRoZSBsaWJyYXJ5J3Mgd29ya3NwYWNlIHBhdGguCi0JICogCi0JICogQHJldHVybiBhbiBhYnNvbHV0ZSBwYXRoIHRvIHRoZSBtZXRob2QgbGlicmFyeQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TWV0aG9kTGlicmFyeUxvY2F0aW9uKCk7Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBhZGFwdGVyIGZhY3RvcnkgZm9yIHRoZSBtYW5hZ2VkIG1ldGhvZCBsaWJyYXJ5LgotCSAqIAotCSAqIEByZXR1cm4gYW4gYWRhcHRlciBmYWN0b3J5Ci0JICovCi0JcHVibGljIENvbXBvc2VkQWRhcHRlckZhY3RvcnkgZ2V0QWRhcHRlckZhY3RvcnkoKTsKLQotCS8qKgotCSAqIEdldHMgdGhlIGVkaXRpbmcgZG9tYWluIGZvciB0aGUgbWFuYWdlZCBtZXRob2QgbGlicmFyeS4KLQkgKiAKLQkgKiBAcmV0dXJuIGFuIGVkaXRpbmcgZG9tYWluCi0JICovCi0JcHVibGljIEFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbiBnZXRFZGl0aW5nRG9tYWluKCk7Ci0KLQkvKioKLQkgKiBSZWdpc3RlcnMgYW4gZWRpdGluZyBkb21haW4gd2l0aCB0aGUgbWFuYWdlZCBtZXRob2QgbGlicmFyeS4KLQkgKiAKLQkgKiBAcGFyYW0gZG9tYWluCi0JICogICAgICAgICAgICBhbiBlZGl0aW5nIGRvbWFpbgotCSAqLwotCXB1YmxpYyB2b2lkIHJlZ2lzdGVyRWRpdGluZ0RvbWFpbihBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW4gZG9tYWluKTsKLQotCS8qKgotCSAqIEFkZHMgYSBsaXN0ZW5lciB0byBtb25pdG9yIGNoYW5nZXMgdG8gdGhlIG1hbmFnZWQgbWV0aG9kIGxpYnJhcnkuCi0JICogCi0JICogQHBhcmFtIGxpc3RlbmVyCi0JICogICAgICAgICAgICBhIGxpYnJhcnkgY2hhbmdlIGxpc3RlbmVyCi0JICovCi0JcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoSUxpYnJhcnlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcik7Ci0KLQkvKioKLQkgKiBSZW1vdmVzIGEgbGlzdGVuZXIgdGhhdCB3YXMgYWRkZWQgdG8gbW9uaXRvciBjaGFuZ2VzIHRvIHRoZSBtYW5hZ2VkCi0JICogbWV0aG9kIGxpYnJhcnkuCi0JICogCi0JICogQHBhcmFtIGxpc3RlbmVyCi0JICogICAgICAgICAgICBhIGxpYnJhcnkgY2hhbmdlIGxpc3RlbmVyCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoSUxpYnJhcnlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcik7Ci0KLQkvKioKLQkgKiBBZGRzIGEgbGlzdGVuZXIgdG8gbW9uaXRvciByZXNvdXJjZSBjaGFuZ2VzIGluIHRoZSBtYW5hZ2VkIG1ldGhvZAotCSAqIGxpYnJhcnkuCi0JICogCi0JICogQHBhcmFtIGxpc3RlbmVyCi0JICogICAgICAgICAgICBhIHByb3BlcnR5IGNoYW5nZSBsaXN0ZW5lcgotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFByb3BlcnR5TGlzdGVuZXIoSVByb3BlcnR5TGlzdGVuZXIgbGlzdGVuZXIpOwotCi0JLyoqCi0JICogQWRkcyBhIGxpc3RlbmVyIHRvIG1vbml0b3IgcmVzb3VyY2UgY2hhbmdlcyBpbiB0aGUgbWFuYWdlZCBtZXRob2QKLQkgKiBsaWJyYXJ5LgotCSAqIAotCSAqIEBwYXJhbSBsaXN0ZW5lcgotCSAqICAgICAgICAgICAgYSBwcm9wZXJ0eSBjaGFuZ2UgbGlzdGVuZXIuCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlUHJvcGVydHlMaXN0ZW5lcihJUHJvcGVydHlMaXN0ZW5lciBsaXN0ZW5lcik7Ci0KLQkvKioKLQkgKiBTdGFydHMgbGlzdGVuaW5nIHRvIGNvbW1hbmQgcHJvY2Vzc2luZyBvbiBhIGNvbW1hbmQgc3RhY2suCi0JICogCi0JICogQHBhcmFtIGNvbW1hbmRTdGFjawotCSAqICAgICAgICAgICAgYSBjb21tYW5kIHN0YWNrCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnRMaXN0ZW5pbmdUbyhDb21tYW5kU3RhY2sgY29tbWFuZFN0YWNrKTsKLQotCS8qKgotCSAqIFN0b3BzIGxpc3RlbmluZyB0byBjb21tYW5kIHByb2Nlc3Npbmcgb24gYSBjb21tYW5kIHN0YWNrLgotCSAqIAotCSAqIEBwYXJhbSBjb21tYW5kU3RhY2sKLQkgKiAgICAgICAgICAgIGEgY29tbWFuZCBzdGFjawotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3BMaXN0ZW5pbmdUbyhDb21tYW5kU3RhY2sgY29tbWFuZFN0YWNrKTsKLQotCS8qKgotCSAqIFN0YXJ0cyBsaXN0ZW5pbmcgdG8gY2hhbmdlIG5vdGlmaWNhdGlvbnMgc2VudCBmcm9tIGFuIGFkYXB0ZXIgZmFjdG9yeS4KLQkgKiAKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKiAgICAgICAgICAgIGFuIGFkYXB0ZXIgZmFjdG9yeQotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0TGlzdGVuaW5nVG8oQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSk7Ci0KLQkvKioKLQkgKiBTdG9wcyBsaXN0ZW5pbmcgdG8gY2hhbmdlIG5vdGlmaWNhdGlvbnMgc2VudCBmcm9tIGFuIGFkYXB0ZXIgZmFjdG9yeS4KLQkgKiAKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKiAgICAgICAgICAgIGFuIGFkYXB0ZXIgZmFjdG9yeQotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3BMaXN0ZW5pbmdUbyhDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KTsKLQotCS8qKgotCSAqIEdldHMgYSBtZXRob2QgZWxlbWVudCBmcm9tIHRoZSBtYW5hZ2VkIG1ldGhvZCBsaWJyYXJ5LgotCSAqIAotCSAqIEBwYXJhbSBndWlkCi0JICogICAgICAgICAgICB0aGUgbWV0aG9kIGVsZW1lbnQncyBHVUlELgotCSAqIAotCSAqIEByZXR1cm4gYSBtZXRob2QgZWxlbWVudCBvZiA8Y29kZT5udWxsPC9jb2RlPgotCSAqLwotCXB1YmxpYyBNZXRob2RFbGVtZW50IGdldE1ldGhvZEVsZW1lbnQoU3RyaW5nIGd1aWQpOwotCi0JLyoqCi0JICogQ2hlY2tzIHdoZXRoZXIgdGhlIG1hbmFnZWQgbWV0aG9kIGxpYnJhcnkgaXMgcmVhZCBvbmx5LgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIG1ldGhvZCBsaWJyYXJ5IGlzIHJlYWQgb25seQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzTWV0aG9kTGlicmFyeVJlYWRPbmx5KCk7Ci0KLQkvKioKLQkgKiBDaGVja3Mgd2hldGhlciB0aGUgbWFuYWdlZCBtZXRob2QgbGlicmFyeSBjb250ZW50IGhhcyBiZWVuIG1vZGlmaWVkLgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIG1hbmFnZWQgbWV0aG9kIGxpYnJhcnkgY29udGVudCBoYXMKLQkgKiAgICAgICAgIGJlZW4gbW9kaWZpZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc01ldGhvZExpYnJhcnlNb2RpZmllZCgpOwotCi0JLyoqCi0JICogQ2hlY2tzIHdoZXRoZXIgdGhlIG1hbmFnZWQgbWV0aG9kIGxpYnJhcnkgaGFzIGFueSB1bnJlc29sdmVkIHByb3h5LgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIG1hbmFnZWQgbWV0aG9kIGxpYnJhcnkgaGFzIGFuCi0JICogICAgICAgICB1bnJlc29sdmVkIHByb3h5LgotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc1VucmVzb2x2ZWRQcm94eSgpOwotCi0JLyoqCi0JICogUmVsb2FkcyB0aGUgZ2l2ZW4gcmVzb3VyY2VzLgotCSAqIAotCSAqIEBwYXJhbSByZXNvdXJjZXMKLQkgKiAgICAgICAgICAgIGEgY29sbGVjdGlvbiBvZiByZXNvdXJjZXMKLQkgKiBAcmV0dXJuIGEgY29sbGVjdGlvbiBvZiByZXNvdXJjZXMgdGhhdCBoYXZlIHJlbG9hZGVkCi0JICovCi0JcHVibGljIENvbGxlY3Rpb248UmVzb3VyY2U+IHJlbG9hZFJlc291cmNlcyhDb2xsZWN0aW9uPFJlc291cmNlPiByZXNvdXJjZXMpOwotCi0JLyoqCi0JICogR2V0cyB0aGUgb3B0aW9ucyB1c2VkIGZvciBzYXZpbmcgdGhlIG1hbmFnZWQgbWV0aG9kIGxpYnJhcnkuCi0JICogCi0JICogQHJldHVybiBhIG1hcCBvZiBtZXRob2QgbGlicmFyeSBzcGVjaWZpYyBzYXZlIG9wdGlvbnMKLQkgKi8KLQlwdWJsaWMgTWFwPFN0cmluZywgT2JqZWN0PiBnZXRTYXZlT3B0aW9ucygpOwotCi0JLyoqCi0JICogQWRkcyBhIG5ldyBtZXRob2QgcGx1Zy1pbiB0byB0aGUgbWFuYWdlZCBtZXRob2QgbGlicmFyeS4KLQkgKiAKLQkgKiBAcGFyYW0gcGx1Z2luCi0JICogICAgICAgICAgICBhIG1ldGhvZCBwbHVnLWluCi0JICogQHRocm93IDxjb2RlPkxpYnJhcnlTZXJ2aWNlRXhjZXB0aW9uPC9jb2RlPiBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUKLQkgKiAgICAgICAgcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCi0JICovCi0JcHVibGljIHZvaWQgYWRkTWV0aG9kUGx1Z2luKE1ldGhvZFBsdWdpbiBwbHVnaW4pCi0JCQl0aHJvd3MgTGlicmFyeVNlcnZpY2VFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBEaXNwb3NlcyBhbGwgcmVzb3VyY2VzIGFsbG9jYXRlZCBieSB0aGlzIGxpYnJhcnkgbWFuYWdlci4KLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCk7Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSByZXNvdXJjZSBtYW5hZ2VyIGZvciB0aGUgbWV0aG9kIGxpYnJhcnkuCi0JICogCi0JICogQHJldHVybiB0aGUgcmVzb3VyY2UgbWFuYWdlciBmb3IgdGhlIG1ldGhvZCBsaWJyYXJ5Ci0JICovCi0JcHVibGljIElMaWJyYXJ5UmVzb3VyY2VNYW5hZ2VyIGdldFJlc291cmNlTWFuYWdlcigpOwotCQotCS8qKgotCSAqIEJhY2t1cCBtZXRob2QgbGlicmFyeQotCSAqIAotCSAqIEBwYXJhbSBwYXRoCi0JICogCQliYWNrdXAgZm9sZXIgZmlsZSBwYXRoCQotCSAqLwotCXB1YmxpYyB2b2lkIGJhY2t1cE1ldGhvZExpYnJhcnkoU3RyaW5nIHBhdGgpOwotCQotCS8qKgotCSAqIFJlZ2lzdGVyIGEgbG9hZGVkIG1ldGhvZCBsaWJyYXJ5LgotCSAqIAotCSAqIEBwYXJhbSB0eXBlCi0JICogICAgICAgICAgICB0aGUgZ2l2ZW4gbG9hZGVkIG1ldGhvZCBsaWJyYXJ5Ci0JICogQHBhcmFtIHBhcmFtcwotCSAqICAgICAgICAgICAgbWV0aG9kIGxpYnJhcnkgc3BlY2lmaWMgYXJndW1lbnRzCi0JICogQHRocm93IDxjb2RlPkxpYnJhcnlTZXJ2aWNlRXhjZXB0aW9uPC9jb2RlPiBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUKLQkgKiAgICAgICAgcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCi0JICovCi0JcHVibGljIHZvaWQgcmVnaXN0ZXJNZXRob2RMaWJyYXJ5KE1ldGhvZExpYnJhcnkgbGliLCAKLQkJCU1hcDxTdHJpbmcsIE9iamVjdD4gcGFyYW1zKSB0aHJvd3MgTGlicmFyeVNlcnZpY2VFeGNlcHRpb247Ci0JCi0JLyoqCi0JICogVW5yZWdpc3RlciBhIHJlZ2lzdGVyZWQgbWV0aG9kIGxpYnJhcnkuCi0JICogCi0JICogQHRocm93IDxjb2RlPkxpYnJhcnlTZXJ2aWNlRXhjZXB0aW9uPC9jb2RlPiBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUKLQkgKiAgICAgICAgcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCi0JICovCi0JcHVibGljIHZvaWQgdW5SZWdpc3Rlck1ldGhvZExpYnJhcnkoKSB0aHJvd3MgTGlicmFyeVNlcnZpY2VFeGNlcHRpb247Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9JTGlicmFyeVJlc291cmNlTWFuYWdlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L0lMaWJyYXJ5UmVzb3VyY2VNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0MTIyNzkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L0lMaWJyYXJ5UmVzb3VyY2VNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLQotLyoqCi0gKiBpbnRlcmZhY2UgdG8gbWFuYWdlIGxpYnJhcnkgcmVzb3VyY2VzCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElMaWJyYXJ5UmVzb3VyY2VNYW5hZ2VyIHsKLQotCS8qKgotCSAqIGdldCB0aGUgbG9naWNhbCBwYXRoIG9mIHRoZSBlbGVtZW50IGluIHRoZSBsaWJyYXJ5LAotCSAqIHRoZSBwYXRoIHNob3VsZCBzdGFydCB3aXRoIHRoZSBwbHVnaW4gbmFtZS4gCi0JICogaS5lLiA8cGx1Z2luIG5hbWU+L3BhdGgvdG8vZWxlbWVudAotCSAqIAotCSAqIFRoZSBpbXBsZW1lbnRhdGlvbiBjbGFzcyBzaG91bGQgZW5jYXBzdWxhdGUgdGhlIHBoeXNpY2FsIHN0b3JhZ2UgCi0JICogb2YgdGhlIHJlc291cmNlIGFuZCByZXR1cm4gdGhlIHBhdGggb2YgdGhlIGVsZW1lbnQgc3RhcnQgd2l0aCBpdCdzIHBsdWdpbiBuYW1lCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQgTWV0aG9kRWxlbWVudAotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMb2dpY2FsUGF0aChNZXRob2RFbGVtZW50IGVsZW1lbnQpOwotCi0JLyoqCi0JICogZ2V0IHRoZSBlbGVtZW50J3MgYmFjayBwYXRoIG9mIHRoZSBlbGVtZW50IGJhc2VkIG9uIHRoZSBsb2dpY2FsIHBhdGgsIGZvciBleGFtcGxlLAotCSAqICJPcGVuVVBcZ3VpZGFuY2VcY29uY2VwdFxjMS54bWwiLCB0aGUgYmFjayBwYXRoIGlzICIuLy4uLy4uLy4uLyIKLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudCBNZXRob2RFbGVtZW50Ci0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEJhY2tQYXRoKE1ldGhvZEVsZW1lbnQgZWxlbWVudCk7Ci0JCi0JLyoqCi0JICogZ2V0IHRoZSBsb2dpY2FsIHJlc291cmNlIHBhdGggb2YgdGhlIGVsZW1lbnQgaW4gdGhlCi0JICogbGlicmFyeS4gdGhlIHBhdGggc2hvdWxkIHN0YXJ0IHdpdGggdGhlIHBsdWdpbiBuYW1lLiAKLQkgKiBpLmUuIDxwbHVnaW4gbmFtZT4vcGF0aC90by9lbGVtZW50L3Jlc291cmNlcwotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50IE1ldGhvZEVsZW1lbnQKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TG9naWNhbFJlc291cmNlUGF0aChNZXRob2RFbGVtZW50IGVsZW1lbnQpOwotCQotCS8qKgotCSAqIEdldHMgdGhlIHBoeXNpY2FsIHBhdGggb2YgYSBtZXRob2QgZWxlbWVudAotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogQHJldHVybiB0aGUgcGh5c2ljYWwgcGF0aCBvZiB0aGUgZWxlbWVudAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UGh5c2ljYWxQYXRoKE1ldGhvZEVsZW1lbnQgZWxlbWVudCk7Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBhYnNvbHV0ZSBwYXRoIG9mIHRoZSByZXNvdXJjZSBmb2xkZXIgb2YgdGhlIGVsZW1lbnQgaW4gdGhlIGxpYnJhcnkuCi0JICogCi0JICogQHBhcmFtIGUKLQkgKiBAcmV0dXJuIHRoZSBwaHlzaWNhbCByZXNvdXJjZSBwYXRoIG9mIHRoZSBlbGVtZW50Ci0JICovCi0JcHVibGljIFN0cmluZyBnZXRQaHlzaWNhbFJlc291cmNlUGF0aChNZXRob2RFbGVtZW50IGVsZW1lbnQpOwotCi0JLyoqCi0JICogZ2V0IHRoZSBwaHlzaWNhbCBwYXRoIG9mIHRoZSBwbHVnaW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBlbGVtZW50Ci0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UGh5c2ljYWxQbHVnaW5QYXRoKE1ldGhvZEVsZW1lbnQgZWxlbWVudCk7Ci0KLQkvKioKLQkgKiBnZXQgdGhlIGxvZ2ljYWwgcGF0aCBvZiB0aGUgcGx1Z2luIAotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExvZ2ljYWxQbHVnaW5QYXRoKE1ldGhvZEVsZW1lbnQgZWxlbWVudCk7Ci0KLQkKLQkvKioKLQkgKiBnZXQgdGhlIHBoeXNpY2FsIHBhdGggYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBsb2dpY2FsIHBhdGgKLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudCBNZXRob2RFbGVtZW50IGFuIGVsZW1lbnQgaW4gdGhlIGxpYnJhcnkgdG8gYWNjZXNzIHRoZSBsaWJyYXJ5IHJlc291cmNlCi0JICogdXN1YWxseSB0aGlzIGlzIHRoZSBvd25lciBlbGVtZW50IHRoYXQgcmVmZXJlbmNlcyB0aGUgbG9naWNhbFBhdGgKLQkgKiBAcGFyYW0gbG9naWNhbFBhdGggU3RyaW5nCi0JICogQHJldHVybiBTdHJpbmcgdGhlIHBoeXNpY2FsIHBhdGggcmVzb2x2ZWQgZnJvbSB0aGUgbG9naWNhbCBwYXRoCi0JICovCi0JcHVibGljIFN0cmluZyByZXNvbHZlKE1ldGhvZEVsZW1lbnQgZWxlbWVudCwgU3RyaW5nIGxvZ2ljYWxQYXRoKTsKLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L0lMaWJyYXJ5U2VydmljZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L0lMaWJyYXJ5U2VydmljZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YTJjN2FlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9JTGlicmFyeVNlcnZpY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeTsKLQotaW1wb3J0IGphdmEubmV0LlVSSTsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5MaWJyYXJ5UHJvYmxlbU1vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLQotLyoqCi0gKiBUaGUgTGlicmFyeSBTZXJ2aWNlIEFQSS4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElMaWJyYXJ5U2VydmljZSB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IG1ldGhvZCBsaWJyYXJ5LgotCSAqIAotCSAqIEBwYXJhbSBuYW1lCi0JICogICAgICAgICAgICBhIG5hbWUgZm9yIHRoZSBuZXcgbWV0aG9kIGxpYnJhcnkKLQkgKiBAcGFyYW0gdHlwZQotCSAqICAgICAgICAgICAgdGhlIG1ldGhvZCBsaWJyYXJ5IHR5cGUKLQkgKiBAcGFyYW0gYXJncwotCSAqICAgICAgICAgICAgbWV0aG9kIGxpYnJhcnkgc3BlY2lmaWMgYXJndW1lbnRzCi0JICogQHJldHVybiBhIG1ldGhvZCBsaWJyYXJ5Ci0JICogQHRocm93IDxjb2RlPkxpYnJhcnlTZXJ2aWNlRXhjZXB0aW9uPC9jb2RlPiBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUKLQkgKiAgICAgICAgcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCi0JICovCi0JcHVibGljIE1ldGhvZExpYnJhcnkgY3JlYXRlTWV0aG9kTGlicmFyeShTdHJpbmcgbmFtZSwgU3RyaW5nIHR5cGUsCi0JCQlNYXA8U3RyaW5nLCBPYmplY3Q+IHBhcmFtcykgdGhyb3dzIExpYnJhcnlTZXJ2aWNlRXhjZXB0aW9uOwotCi0JLyoqCi0JICogT3BlbnMgYW4gZXhpc3RpbmcgbWV0aG9kIGxpYnJhcnkuCi0JICogCi0JICogQHBhcmFtIHR5cGUKLQkgKiAgICAgICAgICAgIHRoZSBtZXRob2QgbGlicmFyeSB0eXBlCi0JICogQHBhcmFtIHVyaQotCSAqICAgICAgICAgICAgdGhlIG1ldGhvZCBsaWJyYXJ5IFVSSQotCSAqIEByZXR1cm4gYSBtZXRob2QgbGlicmFyeQotCSAqIEB0aHJvdyA8Y29kZT5MaWJyYXJ5U2VydmljZUV4Y2VwdGlvbjwvY29kZT4gaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlCi0JICogICAgICAgIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgotCSAqLwotCXB1YmxpYyBNZXRob2RMaWJyYXJ5IG9wZW5NZXRob2RMaWJyYXJ5KFN0cmluZyB0eXBlLAotCQkJVVJJIHVyaSkgdGhyb3dzIExpYnJhcnlTZXJ2aWNlRXhjZXB0aW9uOwotCi0JLyoqCi0JICogT3BlbnMgYW4gZXhpc3RpbmcgbWV0aG9kIGxpYnJhcnkuCi0JICogCi0JICogQHBhcmFtIHR5cGUKLQkgKiAgICAgICAgICAgIHRoZSBtZXRob2QgbGlicmFyeSB0eXBlCi0JICogQHBhcmFtIHBhcmFtcwotCSAqICAgICAgICAgICAgbWV0aG9kIGxpYnJhcnkgc3BlY2lmaWMgYXJndW1lbnRzCi0JICogQHJldHVybiBhIG1ldGhvZCBsaWJyYXJ5Ci0JICogQHRocm93IDxjb2RlPkxpYnJhcnlTZXJ2aWNlRXhjZXB0aW9uPC9jb2RlPiBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUKLQkgKiAgICAgICAgcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCi0JICovCi0JcHVibGljIE1ldGhvZExpYnJhcnkgb3Blbk1ldGhvZExpYnJhcnkoU3RyaW5nIHR5cGUsCi0JCQlNYXA8U3RyaW5nLCBPYmplY3Q+IHBhcmFtcykgdGhyb3dzIExpYnJhcnlTZXJ2aWNlRXhjZXB0aW9uOwotCi0JLyoqCi0JICogT3BlbnMgdGhlIGxhc3Qgb3BlbmVkIG1ldGhvZCBsaWJyYXJ5LgotCSAqIAotCSAqIEByZXR1cm4gYSBtZXRob2QgbGlicmFyeSBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqLwotCXB1YmxpYyBNZXRob2RMaWJyYXJ5IG9wZW5MYXN0T3BlbmVkTWV0aG9kTGlicmFyeSgpOwotCi0JLyoqCi0JICogUmVvcGVucyBhIG1ldGhvZCBsaWJyYXJ5LgotCSAqIAotCSAqIEBwYXJhbSBsaWJyYXJ5Ci0JICogICAgICAgICAgICBhIG1ldGhvZCBsaWJyYXJ5Ci0JICogQHJldHVybiBhIG1ldGhvZCBsaWJyYXJ5Ci0JICogQHRocm93IDxjb2RlPkxpYnJhcnlTZXJ2aWNlRXhjZXB0aW9uPC9jb2RlPiBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUKLQkgKiAgICAgICAgcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCi0JICovCi0JcHVibGljIE1ldGhvZExpYnJhcnkgcmVvcGVuTWV0aG9kTGlicmFyeShNZXRob2RMaWJyYXJ5IGxpYnJhcnkpCi0JCQl0aHJvd3MgTGlicmFyeVNlcnZpY2VFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBSZW9wZW5zIHRoZSBjdXJyZW50IG1ldGhvZCBsaWJyYXJ5LgotCSAqIAotCSAqIEByZXR1cm4gYSBtZXRob2QgbGlicmFyeQotCSAqIEB0aHJvdyA8Y29kZT5MaWJyYXJ5U2VydmljZUV4Y2VwdGlvbjwvY29kZT4gaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlCi0JICogICAgICAgIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgotCSAqLwotCXB1YmxpYyBNZXRob2RMaWJyYXJ5IHJlb3BlbkN1cnJlbnRNZXRob2RMaWJyYXJ5KCkKLQkJCXRocm93cyBMaWJyYXJ5U2VydmljZUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFNhdmVzIGEgbWV0aG9kIGxpYnJhcnkuCi0JICogCi0JICogQHBhcmFtIGxpYnJhcnkKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGxpYnJhcnkKLQkgKiBAdGhyb3cgPGNvZGU+TGlicmFyeVNlcnZpY2VFeGNlcHRpb248L2NvZGU+IGlmIGFuIGVycm9yIG9jY3VycyB3aGlsZQotCSAqICAgICAgICBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBzYXZlTWV0aG9kTGlicmFyeShNZXRob2RMaWJyYXJ5IGxpYnJhcnkpCi0JCQl0aHJvd3MgTGlicmFyeVNlcnZpY2VFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBTYXZlcyB0aGUgY3VycmVudCBtZXRob2QgbGlicmFyeS4KLQkgKiAKLQkgKiBAdGhyb3cgPGNvZGU+TGlicmFyeVNlcnZpY2VFeGNlcHRpb248L2NvZGU+IGlmIGFuIGVycm9yIG9jY3VycyB3aGlsZQotCSAqICAgICAgICBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBzYXZlQ3VycmVudE1ldGhvZExpYnJhcnkoKSB0aHJvd3MgTGlicmFyeVNlcnZpY2VFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBDbG9zZXMgYSBtZXRob2QgbGlicmFyeS4KLQkgKiA8cD4KLQkgKiBUaGlzIGF1dG9tYXRpY2FsbHkgZGlzcG9zZXMgaXRzIGxpYnJhcnkgbWFuYWdlciBhbmQgdGhlIGNvbmZpZ3VyYXRpb24KLQkgKiBtYW5hZ2VycyB0aGF0IG1hbmFnZSB0aGUgbWV0aG9kIGNvbmZpZ3VyYXRpb25zIGluIHRoZSBtZXRob2QgbGlicmFyeS4KLQkgKiAKLQkgKiBAcGFyYW0gbGlicmFyeQotCSAqICAgICAgICAgICAgYSBtZXRob2QgbGlicmFyeQotCSAqIEB0aHJvdyA8Y29kZT5MaWJyYXJ5U2VydmljZUV4Y2VwdGlvbjwvY29kZT4gaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlCi0JICogICAgICAgIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIGNsb3NlTWV0aG9kTGlicmFyeShNZXRob2RMaWJyYXJ5IGxpYnJhcnkpCi0JCQl0aHJvd3MgTGlicmFyeVNlcnZpY2VFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBDbG9zZXMgdGhlIGN1cnJlbnQgbWV0aG9kIGxpYnJhcnkuCi0JICogCi0JICogQHRocm93IDxjb2RlPkxpYnJhcnlTZXJ2aWNlRXhjZXB0aW9uPC9jb2RlPiBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUKLQkgKiAgICAgICAgcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCi0JICovCi0JcHVibGljIHZvaWQgY2xvc2VDdXJyZW50TWV0aG9kTGlicmFyeSgpIHRocm93cyBMaWJyYXJ5U2VydmljZUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFJlcGxhY2VzIGEgdGhlIG1ldGhvZCBsaWJyYXJ5LgotCSAqIAotCSAqIEBwYXJhbSBvbGRMaWJyYXJ5Ci0JICogICAgICAgICAgICB0aGUgb2xkIG1ldGhvZCBsaWJyYXJ5Ci0JICogQHBhcmFtIG5ld0xpYnJhcnkKLQkgKiAgICAgICAgICAgIHRoZSBuZXcgbWV0aG9kIGxpYnJhcnkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZXBsYWNlTWV0aG9kTGlicmFyeShNZXRob2RMaWJyYXJ5IG9sZExpYnJhcnksCi0JCQlNZXRob2RMaWJyYXJ5IG5ld0xpYnJhcnkpOwotCi0JLyoqCi0JICogQWRkcyBhIGxpc3RlbmVyIHRvIG1vbml0b3IgTGlicmFyeSBTZXJ2aWNlIGV2ZW50cy4KLQkgKiAKLQkgKiBAcGFyYW0gbGlzdGVuZXIKLQkgKiAgICAgICAgICAgIGEgbGlicmFyeSBzZXJ2aWNlIGxpc3RlbmVyCi0JICovCi0JcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoSUxpYnJhcnlTZXJ2aWNlTGlzdGVuZXIgbGlzdGVuZXIpOwotCi0JLyoqCi0JICogUmVtb3ZlcyBhIGxpc3RlbmVyIHRoYXQgd2FzIGFkZGVkIHRvIG1vbml0b3IgTGlicmFyeSBTZXJ2aWNlIGV2ZW50cy4KLQkgKiAKLQkgKiBAcGFyYW0gbGlzdGVuZXIKLQkgKiAgICAgICAgICAgIGEgbGlicmFyeSBzZXJ2aWNlIGxpc3RlbmVyCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoSUxpYnJhcnlTZXJ2aWNlTGlzdGVuZXIgbGlzdGVuZXIpOwotCi0JLyoqCi0JICogR2V0cyB0aGUgY3VycmVudCBtZXRob2QgbGlicmFyeS4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgbWV0aG9kIGxpYnJhcnkKLQkgKi8KLQlwdWJsaWMgTWV0aG9kTGlicmFyeSBnZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgY3VycmVudCBtZXRob2QgbGlicmFyeS4KLQkgKiAKLQkgKiBAcGFyYW0gbGlicmFyeQotCSAqICAgICAgICAgICAgYSBtZXRob2QgbGlicmFyeQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEN1cnJlbnRNZXRob2RMaWJyYXJ5KE1ldGhvZExpYnJhcnkgbGlicmFyeSk7Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBjdXJyZW50IG1ldGhvZCBsaWJyYXJ5IGxvY2F0aW9uIHBhdGguCi0JICogPHA+Ci0JICogTm90ZTogQSBmaWxlLWJhc2VkIG1ldGhvZCBsaWJyYXJ5IG1heSByZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4uCi0JICogCi0JICogQHJldHVybiBhbiBhYnNvbHV0ZSBwYXRoIHRvIHRoZSBjdXJyZW50IG1ldGhvZCBsaWJyYXJ5Ci0JICovCi0JcHVibGljIFN0cmluZyBnZXRDdXJyZW50TWV0aG9kTGlicmFyeUxvY2F0aW9uKCk7Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBsaWJyYXJ5IG1hbmFnZXIgZm9yIGEgbWV0aG9kIGxpYnJhcnkuCi0JICogCi0JICogQHBhcmFtIGxpYnJhcnkKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGxpYnJhcnkKLQkgKiBAcmV0dXJuIGEgbGlicmFyeSBtYW5hZ2VyCi0JICovCi0JcHVibGljIElMaWJyYXJ5TWFuYWdlciBnZXRMaWJyYXJ5TWFuYWdlcihNZXRob2RMaWJyYXJ5IGxpYnJhcnkpOwotCi0JcHVibGljIHZvaWQgc2V0TGlicmFyeU1hbmFnZXIoSUxpYnJhcnlNYW5hZ2VyIGxpYk1ncik7Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVMaWJyYXJ5TWFuYWdlcihJTGlicmFyeU1hbmFnZXIgbGliTWdyKTsKLQotCS8qKgotCSAqIEdldHMgdGhlIGxpYnJhcnkgbWFuYWdlciBmb3IgdGhlIGN1cnJlbnQgbWV0aG9kIGxpYnJhcnkuCi0JICogCi0JICogQHJldHVybiBhIGxpYnJhcnkgbWFuYWdlcgotCSAqLwotCXB1YmxpYyBJTGlicmFyeU1hbmFnZXIgZ2V0Q3VycmVudExpYnJhcnlNYW5hZ2VyKCk7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IG1ldGhvZCBjb25maWd1cmF0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBuYW1lCi0JICogICAgICAgICAgICBhIG5hbWUgZm9yIHRoZSBuZXcgbWV0aG9kIGNvbmZpZ3VyYXRpb24KLQkgKiBAcGFyYW0gbGlicmFyeQotCSAqICAgICAgICAgICAgdGhlIGNvbnRhaW5pbmcgbWV0aG9kIGxpYnJhcnkKLQkgKiBAcmV0dXJuIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24KLQkgKiBAdGhyb3cgPGNvZGU+TGlicmFyeVNlcnZpY2VFeGNlcHRpb248L2NvZGU+IGlmIGFuIGVycm9yIG9jY3VycyB3aGlsZQotCSAqICAgICAgICBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KLQkgKi8KLQlwdWJsaWMgTWV0aG9kQ29uZmlndXJhdGlvbiBjcmVhdGVNZXRob2RDb25maWd1cmF0aW9uKFN0cmluZyBuYW1lLAotCQkJTWV0aG9kTGlicmFyeSBsaWJyYXJ5KSB0aHJvd3MgTGlicmFyeVNlcnZpY2VFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBjdXJyZW50IG1ldGhvZCBjb25maWd1cmF0aW9uLgotCSAqIAotCSAqIEByZXR1cm4gYSBtZXRob2QgY29uZmlndXJhdGlvbgotCSAqLwotCXB1YmxpYyBNZXRob2RDb25maWd1cmF0aW9uIGdldEN1cnJlbnRNZXRob2RDb25maWd1cmF0aW9uKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBjdXJyZW50IG1ldGhvZCBjb25maWd1cmF0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBjb25maWcKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDdXJyZW50TWV0aG9kQ29uZmlndXJhdGlvbihNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyk7Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBjb25maWd1cmF0aW9uIG1hbmFnZXIgZm9yIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24uCi0JICogCi0JICogQHBhcmFtIGNvbmZpZwotCSAqICAgICAgICAgICAgYSBtZXRob2QgY29uZmlndXJhdGlvbgotCSAqIEByZXR1cm4gYSBjb25maWd1cmF0aW9uIG1hbmFnZXIKLQkgKi8KLQlwdWJsaWMgSUNvbmZpZ3VyYXRpb25NYW5hZ2VyIGdldENvbmZpZ3VyYXRpb25NYW5hZ2VyKAotCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcpOwotCi0JcHVibGljIHZvaWQgcmVtb3ZlQ29uZmlndXJhdGlvbk1hbmFnZXIoTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcpOwotCi0JcHVibGljIHZvaWQgcmVtb3ZlQ29uZmlndXJhdGlvbk1hbmFnZXJzKE1ldGhvZExpYnJhcnkgbGlicmFyeSk7Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBjb25maWd1cmF0aW9uIG1hbmFnZXIgZm9yIHRoZSBjdXJyZW50IG1ldGhvZCBjb25maWd1cmF0aW9uLgotCSAqIAotCSAqIEByZXR1cm4gYSBjb25maWd1cmF0aW9uIG1hbmFnZXIKLQkgKi8KLQlwdWJsaWMgSUNvbmZpZ3VyYXRpb25NYW5hZ2VyIGdldEN1cnJlbnRDb25maWd1cmF0aW9uTWFuYWdlcigpOwotCQotCS8qKgotCSAqIFJlZ2lzdGVyIGEgbG9hZGVkIG1ldGhvZCBsaWJyYXJ5LgotCSAqIAotCSAqIEBwYXJhbSB0eXBlCi0JICogICAgICAgICAgICB0aGUgZ2l2ZW4gbG9hZGVkIG1ldGhvZCBsaWJyYXJ5Ci0JICogQHBhcmFtIHR5cGUKLQkgKiAgICAgICAgICAgIHRoZSBtZXRob2QgbGlicmFyeSB0eXBlCi0JICogQHBhcmFtIHBhcmFtcwotCSAqICAgICAgICAgICAgbWV0aG9kIGxpYnJhcnkgc3BlY2lmaWMgYXJndW1lbnRzCi0JICogQHRocm93IDxjb2RlPkxpYnJhcnlTZXJ2aWNlRXhjZXB0aW9uPC9jb2RlPiBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUKLQkgKiAgICAgICAgcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCi0JICovCi0JcHVibGljIHZvaWQgIHJlZ2lzdGVyTWV0aG9kTGlicmFyeShNZXRob2RMaWJyYXJ5IGxpYiwgU3RyaW5nIHR5cGUsCi0JCQlNYXA8U3RyaW5nLCBPYmplY3Q+IHBhcmFtcykgdGhyb3dzIExpYnJhcnlTZXJ2aWNlRXhjZXB0aW9uOwotCQotCS8qKgotCSAqIFVucmVnaXN0ZXIgYSByZWdpc3RlcmVkIG1ldGhvZCBsaWJyYXJ5LgotCSAqIAotCSAqIEBwYXJhbSB0eXBlCi0JICogICAgICAgICAgICB0aGUgZ2l2ZW4gcmVnaXN0ZXJlZCBtZXRob2QgbGlicmFyeQotCSAqIEB0aHJvdyA8Y29kZT5MaWJyYXJ5U2VydmljZUV4Y2VwdGlvbjwvY29kZT4gaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlCi0JICogICAgICAgIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHVuUmVnaXN0ZXJNZXRob2RMaWJyYXJ5KE1ldGhvZExpYnJhcnkgbGliKSB0aHJvd3MgTGlicmFyeVNlcnZpY2VFeGNlcHRpb247Ci0JCi0JLyoqCi0JICogQHJldHVybiB0aGUgbGliYXJ5IHByb2JsZW0gbW9uaXRvciBvYmplY3QgYXNzb2NhdGVkIHdpdGggdGhpcyBtYW5hZ2VyCi0JICovCi0JcHVibGljIExpYnJhcnlQcm9ibGVtTW9uaXRvciBnZXRMaWJyYXJ5UHJvYmxlbU1vbml0b3IoKTsKLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L0lMaWJyYXJ5U2VydmljZUxpc3RlbmVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvSUxpYnJhcnlTZXJ2aWNlTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWFiZmVjOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvSUxpYnJhcnlTZXJ2aWNlTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5OwotCi1pbXBvcnQgamF2YS51dGlsLkV2ZW50TGlzdGVuZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotCi0vKioKLSAqIFRoZSBpbnRlcmZhY2UgZm9yIGEgTGlicmFyeSBTZXJ2aWNlIGxpc3RlbmVyLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJTGlicmFyeVNlcnZpY2VMaXN0ZW5lciBleHRlbmRzIEV2ZW50TGlzdGVuZXIgewotCi0JLyoqCi0JICogUmVjZWl2ZXMgbm90aWZpY2F0aW9uIHdoZW4gYSBtZXRob2QgbGlicmFyeSBoYXMgYmVlbiBjcmVhdGVkLgotCSAqIAotCSAqIEBwYXJhbSBsaWJyYXJ5Ci0JICogICAgICAgICAgICBhIG1ldGhvZCBsaWJyYXJ5Ci0JICovCi0JcHVibGljIHZvaWQgbGlicmFyeUNyZWF0ZWQoTWV0aG9kTGlicmFyeSBsaWJyYXJ5KTsKLQotCS8qKgotCSAqIFJlY2VpdmVzIG5vdGlmaWNhdGlvbiB3aGVuIGEgbWV0aG9kIGxpYnJhcnkgaGFzIGJlZW4gb3BlbmVkLgotCSAqIAotCSAqIEBwYXJhbSBsaWJyYXJ5Ci0JICogICAgICAgICAgICBhIG1ldGhvZCBsaWJyYXJ5Ci0JICovCi0JcHVibGljIHZvaWQgbGlicmFyeU9wZW5lZChNZXRob2RMaWJyYXJ5IGxpYnJhcnkpOwotCi0JLyoqCi0JICogUmVjZWl2ZXMgbm90aWZpY2F0aW9uIHdoZW4gYSBtZXRob2QgbGlicmFyeSBoYXMgYmVlbiByZW9wZW5lZC4KLQkgKiAKLQkgKiBAcGFyYW0gbGlicmFyeQotCSAqICAgICAgICAgICAgYSBtZXRob2QgbGlicmFyeQotCSAqLwotCXB1YmxpYyB2b2lkIGxpYnJhcnlSZW9wZW5lZChNZXRob2RMaWJyYXJ5IGxpYnJhcnkpOwotCi0JLyoqCi0JICogUmVjZWl2ZXMgbm90aWZpY2F0aW9uIHdoZW4gYSBtZXRob2QgbGlicmFyeSBoYXMgYmVlbiBjbG9zZWQuCi0JICogCi0JICogQHBhcmFtIGxpYnJhcnkKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGxpYnJhcnkKLQkgKi8KLQlwdWJsaWMgdm9pZCBsaWJyYXJ5Q2xvc2VkKE1ldGhvZExpYnJhcnkgbGlicmFyeSk7Ci0KLQkvKioKLQkgKiBSZWNlaXZlcyBub3RpZmljYXRpb24gd2hlbiBhIG1ldGhvZCBsaWJyYXJ5IGhhcyBiZWVuIHNldCBhcyB0aGUgY3VycmVudAotCSAqIG1ldGhvZCBsaWJyYXJ5LgotCSAqIAotCSAqIEBwYXJhbSBsaWJyYXJ5Ci0JICogICAgICAgICAgICBhIG1ldGhvZCBsaWJyYXJ5Ci0JICovCi0JcHVibGljIHZvaWQgbGlicmFyeVNldChNZXRob2RMaWJyYXJ5IGxpYnJhcnkpOwotCi0JLyoqCi0JICogUmVjZWl2ZXMgbm90aWZpY2F0aW9uIHdoZW4gYSBtZXRob2QgY29uZmlndXJhdGlvbiBoYXMgYmVlbiBzZXQgYXMgdGhlCi0JICogY3VycmVudCBtZXRob2QgY29uZmlndXJhdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gY29uZmlnCi0JICogICAgICAgICAgICBhIG1ldGhvZCBjb25maWd1cmF0aW9uCi0JICovCi0JcHVibGljIHZvaWQgY29uZmlndXJhdGlvblNldChNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyk7Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9JbnZhbGlkTWV0aG9kRWxlbWVudE5hbWVFeGNlcHRpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9JbnZhbGlkTWV0aG9kRWxlbWVudE5hbWVFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzczZjZhZi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvSW52YWxpZE1ldGhvZEVsZW1lbnROYW1lRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeTsKLQotLyoqCi0gKiBTaWduYWxzIHRoYXQgYSBtZXRob2QgZWxlbWVudCBuYW1lIGlzIGludmFsaWQuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgSW52YWxpZE1ldGhvZEVsZW1lbnROYW1lRXhjZXB0aW9uIGV4dGVuZHMgTGlicmFyeVNlcnZpY2VFeGNlcHRpb24gewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBJbnZhbGlkTWV0aG9kRWxlbWVudE5hbWVFeGNlcHRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBnaXZlbiB0aGUgcm9vdCBjYXVzZSBvZiB0aGUgZXhjZXB0aW9uLgotCSAqIAotCSAqIEBwYXJhbSByb290Q2F1c2UKLQkgKiAgICAgICAgICAgIHRoZSByb290IGNhdXNlIG9mIHRoZSBleGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgSW52YWxpZE1ldGhvZEVsZW1lbnROYW1lRXhjZXB0aW9uKFRocm93YWJsZSByb290Q2F1c2UpIHsKLQkJc3VwZXIocm9vdENhdXNlKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIGdpdmVuIHRoZSBlcnJvciBtZXNzYWdlLgotCSAqIAotCSAqIEBwYXJhbSBlcnJvck1zZwotCSAqICAgICAgICAgICAgdGhlIGVycm9yIG1lc3NhZ2UKLQkgKi8KLQlwdWJsaWMgSW52YWxpZE1ldGhvZEVsZW1lbnROYW1lRXhjZXB0aW9uKFN0cmluZyBlcnJvck1zZykgewotCQlzdXBlcihlcnJvck1zZyk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBnaXZlbiB0aGUgZXJyb3IgbWVzc2FnZSBhbmQgdGhlIHJvb3QgY2F1c2Ugb2YgdGhlCi0JICogZXhjZXB0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBlcnJvck1zZwotCSAqICAgICAgICAgICAgdGhlIGVycm9yIG1lc3NhZ2UKLQkgKiBAcGFyYW0gcm9vdENhdXNlCi0JICogICAgICAgICAgICB0aGUgcm9vdCBjYXVzZSBvZiB0aGUgZXhjZXB0aW9uCi0JICovCi0JcHVibGljIEludmFsaWRNZXRob2RFbGVtZW50TmFtZUV4Y2VwdGlvbihTdHJpbmcgZXJyb3JNc2csCi0JCQlUaHJvd2FibGUgcm9vdENhdXNlKSB7Ci0JCXN1cGVyKGVycm9yTXNnLCByb290Q2F1c2UpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L0xpYnJhcnlBbHJlYWR5RXhpc3RzRXhjZXB0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvTGlicmFyeUFscmVhZHlFeGlzdHNFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWU3MTE1Yy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvTGlicmFyeUFscmVhZHlFeGlzdHNFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5OwotCi0vKioKLSAqIFNpZ25hbHMgdGhhdCBhIE1ldGhvZCBMaWJyYXJ5IGFscmVhZHkgZXhpc3RzLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIExpYnJhcnlBbHJlYWR5RXhpc3RzRXhjZXB0aW9uIGV4dGVuZHMgTGlicmFyeVNlcnZpY2VFeGNlcHRpb24gewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBMaWJyYXJ5QWxyZWFkeUV4aXN0c0V4Y2VwdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIGdpdmVuIHRoZSByb290IGNhdXNlIG9mIHRoZSBleGNlcHRpb24uCi0JICogCi0JICogQHBhcmFtIHJvb3RDYXVzZQotCSAqICAgICAgICAgICAgdGhlIHJvb3QgY2F1c2Ugb2YgdGhlIGV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBMaWJyYXJ5QWxyZWFkeUV4aXN0c0V4Y2VwdGlvbihUaHJvd2FibGUgcm9vdENhdXNlKSB7Ci0JCXN1cGVyKHJvb3RDYXVzZSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBnaXZlbiB0aGUgZXJyb3IgbWVzc2FnZS4KLQkgKiAKLQkgKiBAcGFyYW0gZXJyb3JNc2cKLQkgKiAgICAgICAgICAgIHRoZSBlcnJvciBtZXNzYWdlCi0JICovCi0JcHVibGljIExpYnJhcnlBbHJlYWR5RXhpc3RzRXhjZXB0aW9uKFN0cmluZyBlcnJvck1zZykgewotCQlzdXBlcihlcnJvck1zZyk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBnaXZlbiB0aGUgZXJyb3IgbWVzc2FnZSBhbmQgdGhlIHJvb3QgY2F1c2Ugb2YgdGhlCi0JICogZXhjZXB0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBlcnJvck1zZwotCSAqICAgICAgICAgICAgdGhlIGVycm9yIG1lc3NhZ2UKLQkgKiBAcGFyYW0gcm9vdENhdXNlCi0JICogICAgICAgICAgICB0aGUgcm9vdCBjYXVzZSBvZiB0aGUgZXhjZXB0aW9uCi0JICovCi0JcHVibGljIExpYnJhcnlBbHJlYWR5RXhpc3RzRXhjZXB0aW9uKFN0cmluZyBlcnJvck1zZywgVGhyb3dhYmxlIHJvb3RDYXVzZSkgewotCQlzdXBlcihlcnJvck1zZywgcm9vdENhdXNlKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9MaWJyYXJ5TWFuYWdlckZhY3RvcnkuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9MaWJyYXJ5TWFuYWdlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmJkZTA3My4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvTGlicmFyeU1hbmFnZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5pbnRlcm5hbC5MaWJyYXJ5TWFuYWdlckVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzLlNlcnZpY2VzOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci0KLS8qKgotICogTWFuYWdlcyB0aGUgY3JlYXRpb24gb2YgTGlicmFyeSBNYW5hZ2VyIGluc3RhbmNlcy4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBMaWJyYXJ5TWFuYWdlckZhY3RvcnkgewotCi0JLyoqCi0JICogVGhlIGV4dGVuc2lvbiBwb2ludCBuYW1lc3BhY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhURU5TSU9OX1BPSU5UX05BTUVTUEFDRSA9ICJvcmcuZWNsaXBzZS5lcGYubGlicmFyeSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSBleHRlbnNpb24gcG9pbnQgbmFtZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRFTlNJT05fUE9JTlRfTkFNRSA9ICJsaWJyYXJ5TWFuYWdlcnMiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgImNsYXNzIiBhdHRyaWJ1dGUgbmFtZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDTEFTU19BVFRSSUJfTkFNRSA9ICJjbGFzcyI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSAidHlwZSIgYXR0cmlidXRlIG5hbWUuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQRV9BVFRSSUJfTkFNRSA9ICJ0eXBlIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlICJ0eXBlTmFtZSIgYXR0cmlidXRlIG5hbWUuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQRV9OQU1FX0FUVFJJQl9OQU1FID0gInR5cGVOYW1lIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFZFUlNJT05fQVRUUklCX05BTUUgPSAidmVyc2lvbiI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIFRoZSBzaGFyZWQgaW5zdGFuY2UuCi0JcHJpdmF0ZSBzdGF0aWMgTGlicmFyeU1hbmFnZXJGYWN0b3J5IGluc3RhbmNlID0gbnVsbDsKLQotCS8vIEEgbWFwIG9mIGxpYnJhcnkgbWFuYWdlciBjb25maWd1cmF0aW9uIGVsZW1lbnRzLgotCXByaXZhdGUgTWFwPFN0cmluZywgTGlicmFyeU1hbmFnZXJFbGVtZW50PiBsaWJyYXJ5TWFuYWdlckVsZW1lbnRzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBMaWJyYXJ5TWFuYWdlckVsZW1lbnQ+KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaGFyZWQgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBMaWJyYXJ5TWFuYWdlckZhY3RvcnkgZ2V0SW5zdGFuY2UoKSB7Ci0JCWlmIChpbnN0YW5jZSA9PSBudWxsKSB7Ci0JCQlzeW5jaHJvbml6ZWQgKExpYnJhcnlNYW5hZ2VyRmFjdG9yeS5jbGFzcykgewotCQkJCWlmIChpbnN0YW5jZSA9PSBudWxsKSB7Ci0JCQkJCWluc3RhbmNlID0gbmV3IExpYnJhcnlNYW5hZ2VyRmFjdG9yeSgpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwcml2YXRlIExpYnJhcnlNYW5hZ2VyRmFjdG9yeSgpIHsKLQkJaW5pdCgpOwotCX0KLQotCS8qKgotCSAqIFBlcmZvcm1zIHRoZSBuZWNlc3NhcnkgaW5pdGlhbGl6YXRpb24uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdCgpIHsKLQkJLy8gUHJvY2VzcyB0aGUgIm9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxpYnJhcnlNYW5hZ2VycyIgZXh0ZW5zaW9uIHBvaW50Ci0JCS8vIGNvbnRyaWJ1dG9ycy4KLQkJSUV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5ID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKTsKLQkJSUV4dGVuc2lvblBvaW50IGV4dGVuc2lvblBvaW50ID0gZXh0ZW5zaW9uUmVnaXN0cnkuZ2V0RXh0ZW5zaW9uUG9pbnQoCi0JCQkJRVhURU5TSU9OX1BPSU5UX05BTUVTUEFDRSwgRVhURU5TSU9OX1BPSU5UX05BTUUpOwotCQlpZiAoZXh0ZW5zaW9uUG9pbnQgIT0gbnVsbCkgewotCQkJSUV4dGVuc2lvbltdIGV4dGVuc2lvbnMgPSBleHRlbnNpb25Qb2ludC5nZXRFeHRlbnNpb25zKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGV4dGVuc2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCQlJRXh0ZW5zaW9uIGV4dGVuc2lvbiA9IGV4dGVuc2lvbnNbaV07Ci0JCQkJU3RyaW5nIHBsdWdpbklkID0gZXh0ZW5zaW9uLmdldE5hbWVzcGFjZUlkZW50aWZpZXIoKTsKLQkJCQlCdW5kbGUgYnVuZGxlID0gUGxhdGZvcm0uZ2V0QnVuZGxlKHBsdWdpbklkKTsKLQkJCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjb25maWdFbGVtZW50cyA9IGV4dGVuc2lvbgotCQkJCQkJLmdldENvbmZpZ3VyYXRpb25FbGVtZW50cygpOwotCQkJCWZvciAoaW50IGogPSAwOyBqIDwgY29uZmlnRWxlbWVudHMubGVuZ3RoOyBqKyspIHsKLQkJCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNvbmZpZ0VsZW1lbnQgPSBjb25maWdFbGVtZW50c1tqXTsKLQkJCQkJdHJ5IHsKLQkJCQkJCVN0cmluZyBjbGFzc05hbWUgPSBjb25maWdFbGVtZW50Ci0JCQkJCQkJCS5nZXRBdHRyaWJ1dGUoQ0xBU1NfQVRUUklCX05BTUUpOwotCQkJCQkJU3RyaW5nIHR5cGVJZCA9IGNvbmZpZ0VsZW1lbnQKLQkJCQkJCQkJLmdldEF0dHJpYnV0ZShUWVBFX0FUVFJJQl9OQU1FKTsKLQkJCQkJCVN0cmluZyB0eXBlTmFtZSA9IGNvbmZpZ0VsZW1lbnQKLQkJCQkJCQkJLmdldEF0dHJpYnV0ZShUWVBFX05BTUVfQVRUUklCX05BTUUpOwotCQkJCQkJaWYgKGNsYXNzTmFtZSAhPSBudWxsICYmIGNsYXNzTmFtZS50cmltKCkubGVuZ3RoKCkgPiAwCi0JCQkJCQkJCSYmIHR5cGVJZCAhPSBudWxsICYmIHR5cGVJZC50cmltKCkubGVuZ3RoKCkgPiAwCi0JCQkJCQkJCSYmIHR5cGVOYW1lICE9IG51bGwKLQkJCQkJCQkJJiYgdHlwZU5hbWUudHJpbSgpLmxlbmd0aCgpID4gMCkgewkJCQkJCQkKLQkJCQkJCQlpbnQgdmVyc2lvbiA9IFNlcnZpY2VzLnBhcnNlVmVyc2lvbihjb25maWdFbGVtZW50LmdldEF0dHJpYnV0ZShWRVJTSU9OX0FUVFJJQl9OQU1FKSk7Ci0JCQkJCQkJTGlicmFyeU1hbmFnZXJFbGVtZW50IHByb3ZpZGVyID0gbGlicmFyeU1hbmFnZXJFbGVtZW50cy5nZXQodHlwZUlkKTsKLQkJCQkJCQlpZihwcm92aWRlciA9PSBudWxsIHx8IHByb3ZpZGVyLmdldFZlcnNpb24oKSA8IHZlcnNpb24pIHsKLQkJCQkJCQkJcHJvdmlkZXIgPSBuZXcgTGlicmFyeU1hbmFnZXJFbGVtZW50KAotCQkJCQkJCQkJCWJ1bmRsZSwgY2xhc3NOYW1lLCB0eXBlSWQsIHR5cGVOYW1lLCB2ZXJzaW9uKTsKLQkJCQkJCQkJbGlicmFyeU1hbmFnZXJFbGVtZW50cy5wdXQodHlwZUlkLCBwcm92aWRlcik7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGxpYnJhcnkgbWFuYWdlciBpbnN0YW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gdHlwZQotCSAqICAgICAgICAgICAgdGhlIG1ldGhvZCBsaWJyYXJ5IHR5cGUKLQkgKiBAcmV0dXJuIGEgbGlicmFyeSBtYW5hZ2VyCi0JICogQHRocm93IDxjb2RlPkNyZWF0ZUxpYnJhcnlNYW5hZ2VyRXhjZXB0aW9uPC9jb2RlPiBpZiBhbiBlcnJvciBvY2N1cnMKLQkgKiAgICAgICAgd2hpbGUgcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCi0JICovCi0JcHVibGljIElMaWJyYXJ5TWFuYWdlciBjcmVhdGVMaWJyYXJ5TWFuYWdlcihTdHJpbmcgdHlwZSkKLQkJCXRocm93cyBDcmVhdGVMaWJyYXJ5TWFuYWdlckV4Y2VwdGlvbiB7Ci0JCUxpYnJhcnlNYW5hZ2VyRWxlbWVudCBwcm92aWRlciA9IChMaWJyYXJ5TWFuYWdlckVsZW1lbnQpIGxpYnJhcnlNYW5hZ2VyRWxlbWVudHMKLQkJCQkuZ2V0KHR5cGUpOwotCQlpZiAocHJvdmlkZXIgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IENyZWF0ZUxpYnJhcnlNYW5hZ2VyRXhjZXB0aW9uKCk7Ci0JCX0KLQkJdHJ5IHsKLQkJCUNsYXNzIGNsYXp6ID0gcHJvdmlkZXIuZ2V0QnVuZGxlKCkubG9hZENsYXNzKAotCQkJCQlwcm92aWRlci5nZXRDbGFzc05hbWUoKSk7Ci0JCQlyZXR1cm4gKElMaWJyYXJ5TWFuYWdlcikgY2xhenoubmV3SW5zdGFuY2UoKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCUxpYnJhcnlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJdGhyb3cgbmV3IENyZWF0ZUxpYnJhcnlNYW5hZ2VyRXhjZXB0aW9uKGUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhbGwgdGhlIGxpYnJhcnkgdHlwZXMgcmVnaXN0ZXJlZCB2aWEgdGhlCi0JICogIm9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxpYnJhcnlNYW5hZ2VycyIgZXh0ZW5zaW9uIHBvaW50LgotCSAqIAotCSAqIEByZXR1cm4gYSBtYXAgb2YgbGlicmFyeSB0eXBlcwotCSAqLwotCXB1YmxpYyBNYXAgZ2V0TGlicmFyeVR5cGVzKCkgewotCQlNYXA8U3RyaW5nLCBTdHJpbmc+IHR5cGVzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSBsaWJyYXJ5TWFuYWdlckVsZW1lbnRzLmtleVNldCgpLml0ZXJhdG9yKCk7IGl0Ci0JCQkJLmhhc05leHQoKTspIHsKLQkJCVN0cmluZyB0eXBlSWQgPSAoU3RyaW5nKSBpdC5uZXh0KCk7Ci0JCQlTdHJpbmcgdHlwZU5hbWUgPSAoKExpYnJhcnlNYW5hZ2VyRWxlbWVudCkgbGlicmFyeU1hbmFnZXJFbGVtZW50cwotCQkJCQkuZ2V0KHR5cGVJZCkpLmdldFR5cGVOYW1lKCk7Ci0JCQl0eXBlcy5wdXQodHlwZUlkLCB0eXBlTmFtZSk7Ci0JCX0KLQkJcmV0dXJuIHR5cGVzOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L0xpYnJhcnlOb3RGb3VuZEV4Y2VwdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L0xpYnJhcnlOb3RGb3VuZEV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YTg5ZjIyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9MaWJyYXJ5Tm90Rm91bmRFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5OwotCi0vKioKLSAqIFNpZ25hbHMgdGhhdCBhIE1ldGhvZCBMaWJyYXJ5IGNhbm5vdCBiZSBsb2NhdGVkLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIExpYnJhcnlOb3RGb3VuZEV4Y2VwdGlvbiBleHRlbmRzIExpYnJhcnlTZXJ2aWNlRXhjZXB0aW9uIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgTGlicmFyeU5vdEZvdW5kRXhjZXB0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UgZ2l2ZW4gdGhlIHJvb3QgY2F1c2Ugb2YgdGhlIGV4Y2VwdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gcm9vdENhdXNlCi0JICogICAgICAgICAgICB0aGUgcm9vdCBjYXVzZSBvZiB0aGUgZXhjZXB0aW9uCi0JICovCi0JcHVibGljIExpYnJhcnlOb3RGb3VuZEV4Y2VwdGlvbihUaHJvd2FibGUgcm9vdENhdXNlKSB7Ci0JCXN1cGVyKHJvb3RDYXVzZSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBnaXZlbiB0aGUgZXJyb3IgbWVzc2FnZS4KLQkgKiAKLQkgKiBAcGFyYW0gZXJyb3JNc2cKLQkgKiAgICAgICAgICAgIHRoZSBlcnJvciBtZXNzYWdlCi0JICovCi0JcHVibGljIExpYnJhcnlOb3RGb3VuZEV4Y2VwdGlvbihTdHJpbmcgZXJyb3JNc2cpIHsKLQkJc3VwZXIoZXJyb3JNc2cpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UgZ2l2ZW4gdGhlIGVycm9yIG1lc3NhZ2UgYW5kIHRoZSByb290IGNhdXNlIG9mIHRoZQotCSAqIGV4Y2VwdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gZXJyb3JNc2cKLQkgKiAgICAgICAgICAgIHRoZSBlcnJvciBtZXNzYWdlCi0JICogQHBhcmFtIHJvb3RDYXVzZQotCSAqICAgICAgICAgICAgdGhlIHJvb3QgY2F1c2Ugb2YgdGhlIGV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBMaWJyYXJ5Tm90Rm91bmRFeGNlcHRpb24oU3RyaW5nIGVycm9yTXNnLCBUaHJvd2FibGUgcm9vdENhdXNlKSB7Ci0JCXN1cGVyKGVycm9yTXNnLCByb290Q2F1c2UpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L0xpYnJhcnlQbHVnaW4uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9MaWJyYXJ5UGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkY2Q0N2YuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L0xpYnJhcnlQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeTsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkZpbGVMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24uQWJzdHJhY3RBY3RpdmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LkxheW91dFJlc291cmNlczsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotLyoqCi0gKiBUaGUgTGlicmFyeSBwbHVnLWluIGNsYXNzLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIExpYnJhcnlQbHVnaW4gZXh0ZW5kcyBBYnN0cmFjdEFjdGl2YXRvciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEFZT1VUX1BBVEggPSAibGF5b3V0LyI7IC8vJE5PTi1OTFMtMSQ7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMQVlPVVRfWFNMX1BBVEggPSAibGF5b3V0L3hzbC8iOyAvLyROT04tTkxTLTEkOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMQVlPVVRfQ1NTX1BBVEggPSAibGF5b3V0L2Nzcy8iOyAvLyROT04tTkxTLTEkOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEFZT1VUX1NDUklQVFNfRk9MREVSID0gInNjcmlwdHMiOyAvLyROT04tTkxTLTEkOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEFZT1VUX1NDUklQVFNfUEFUSCA9ICJsYXlvdXQvc2NyaXB0cy8iOyAvLyROT04tTkxTLTEkOwotCi0JLy8gVGhlIHNoYXJlZCBwbHVnLWluIGluc3RhbmNlLgotCXByaXZhdGUgc3RhdGljIExpYnJhcnlQbHVnaW4gcGx1Z2luOwotCi0JcHJpdmF0ZSBTdHJpbmcgbGF5b3V0UGF0aCwgbGF5b3V0WHNsUGF0aCwgbGF5b3V0Q3NzUGF0aDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIExpYnJhcnlQbHVnaW4oKSB7Ci0JCXN1cGVyKCk7Ci0JCXBsdWdpbiA9IHRoaXM7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpLkFic3RyYWN0UGx1Z2luI3N0YXJ0KEJ1bmRsZUNvbnRleHQpCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RhcnQoY29udGV4dCk7Ci0JCXRyeSB7Ci0JCQlVUkwgdXJsID0gbmV3IFVSTChzdXBlci5nZXRJbnN0YWxsVVJMKCksIExBWU9VVF9QQVRIKTsKLQkJCWxheW91dFBhdGggPSBGaWxlTG9jYXRvci5yZXNvbHZlKHVybCkuZ2V0UGF0aCgpOwotCi0JCQl1cmwgPSBuZXcgVVJMKHN1cGVyLmdldEluc3RhbGxVUkwoKSwgTEFZT1VUX1hTTF9QQVRIKTsKLQkJCWxheW91dFhzbFBhdGggPSBGaWxlTG9jYXRvci5yZXNvbHZlKHVybCkuZ2V0UGF0aCgpOwotCi0JCQl1cmwgPSBuZXcgVVJMKHN1cGVyLmdldEluc3RhbGxVUkwoKSwgTEFZT1VUX0NTU19QQVRIKTsKLQkJCWxheW91dENzc1BhdGggPSBGaWxlTG9jYXRvci5yZXNvbHZlKHVybCkuZ2V0UGF0aCgpOwotCi0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQkJCi0JCUxpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0TGlicmFyeVByb2JsZW1Nb25pdG9yKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpLkFic3RyYWN0UGx1Z2luI3N0YXJ0KEJ1bmRsZUNvbnRleHQpCi0JICovCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdG9wKGNvbnRleHQpOwotCQlwbHVnaW4gPSBudWxsOwotCi0JCUxheW91dFJlc291cmNlcy5jbGVhcigpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNoYXJlZCBwbHVnLWluIGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlicmFyeVBsdWdpbiBnZXREZWZhdWx0KCkgewotCQlyZXR1cm4gcGx1Z2luOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TGF5b3V0UGF0aCgpIHsKLQkJcmV0dXJuIGxheW91dFBhdGg7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRMYXlvdXRYc2xQYXRoKCkgewotCQlyZXR1cm4gbGF5b3V0WHNsUGF0aDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldExheW91dENzc1BhdGgoKSB7Ci0JCXJldHVybiBsYXlvdXRDc3NQYXRoOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvTGlicmFyeVJlc291cmNlcy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L0xpYnJhcnlSZXNvdXJjZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGRmOWRlZi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvTGlicmFyeVJlc291cmNlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLXB1YmxpYyBmaW5hbCBjbGFzcyBMaWJyYXJ5UmVzb3VyY2VzIGV4dGVuZHMgTkxTIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5SZXNvdXJjZXMiOy8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgTGlicmFyeVJlc291cmNlcygpIHsKLQkJLy8gRG8gbm90IGluc3RhbnRpYXRlCi0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbGlicmFyeVByb2JsZW1Nb25pdG9yOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGxpYlVwZ3JhZGVSZXF1aXJlZF9lcnJfbXNnOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG9sZFRvb2xWZXJzaW9uX2Vycl9tc2c7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgdG9vbFZlcnNpb25NaXNtYXRjaF9lcnJfbXNnOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHVua25vd25fdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlbXB0eUxpYnJhcnlQYXRoRXJyb3JfcmVhc29uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG1pc3NpbmdMaWJyYXJ5RmlsZUVycm9yX3JlYXNvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyB1bnJlc29sdmVkUHJveHlFcnJvcl9yZWFzb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29uZmlnQ2xvc3VyZVdhcm5pbmdfbXNnMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb25maWdDbG9zdXJlV2FybmluZ19tc2cyOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbmZpZ0Nsb3N1cmVXYXJuaW5nX21zZzM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgbG9hZFJlc291cmNlc0Vycm9yX21zZzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyB1bnN1cHBvcnRlZEd1aWRhbmNlVHlwZUVycm9yX21zZzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb252ZXJ0R3VpZGFuY2VFcnJvcl9tc2c7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2F2ZUNvbnZlcnRlZEd1aWRhbmNlRXJyb3JfbXNnOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbnZlcnRBY3Rpdml0eUVycm9yX3RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbnZlcnRBY3Rpdml0eUVycm9yX21zZzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzYXZlQ29udmVydGVkQWN0aXZpdHlFcnJvcl9tc2c7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JfcmVhc29uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHVuc3VwcG9ydGVkR3VpZGFuY2VUeXBlRXJyb3JfcmVhc29uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGludmFsaWRMaWJyYXJ5UGF0aEVycm9yX3JlYXNvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb3VsZE5vdExvY2tMaWJyYXJ5X3JlYXNvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb3B5aW5nQXR0YWNobWVudHNUYXNrX25hbWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29udmVydEd1aWRhbmNlRGlhbG9nX3RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbnZlcnRHdWlkYW5jZURpYWxvZ190ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNoZWNrbGlzdF90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbmNlcHRfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBleGFtcGxlX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ3VpZGVsaW5lX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXN0aW1hdGVfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlc3RpbWF0aW5nTWV0cmljX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVwb3J0X3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgdGVtcGxhdGVfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzdXBwb3J0aW5nTWF0ZXJpYWxfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0b29sTWVudG9yX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgd2hpdGVwYXBlcl90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRlcm1EZWZpbml0aW9uX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHJhY3RpY2VfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZXVzYWJsZUFzc2V0X3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWN0aXZpdHlMYXlvdXRfcHJpbWFyeVRhc2tzX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWN0aXZpdHlMYXlvdXRfYWRkaXRpb25hbFRhc2tzX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29udmVydEd1aWRhbmNlRXJyb3JfdGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgbG9hZFJlc291cmNlc0Vycm9yX3RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGxvYWRSZXNvdXJjZXNFcnJvcl9yZWFzb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgcm9sZURpYWdyYW1QZXJmb3Jtc190ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJvbGVEaWFncmFtUmVzcG9uc2libGVGb3JfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEZWZhdWx0Q29udGVudFZhbGlkYXRvcl9NU0cwOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERlZmF1bHRDb250ZW50VmFsaWRhdG9yX01TRzE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGVmYXVsdENvbnRlbnRWYWxpZGF0b3JfTVNHNDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEZWZhdWx0Q29udGVudFZhbGlkYXRvcl9NU0c3OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERlZmF1bHRDb250ZW50VmFsaWRhdG9yX01TRzEwOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERlZmF1bHRDb250ZW50VmFsaWRhdG9yX01TRzExOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERlZmF1bHRDb250ZW50VmFsaWRhdG9yX01TRzEyOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERlZmF1bHRDb250ZW50VmFsaWRhdG9yX01TRzE1OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERlZmF1bHRDb250ZW50VmFsaWRhdG9yX01TRzE3OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERlZmF1bHRDb250ZW50VmFsaWRhdG9yX01TRzE5OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEltcG9ydEV4cG9ydFV0aWxfTVNHODsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJbXBvcnRFeHBvcnRVdGlsX01TRzk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgdW5rbm93bkd1aWRhbmNlX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29weUF0dGFjaG1lbnRzVG9OZXdMb2NhdGlvbl9sb2dfbm9Db250ZW50UGF0aDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBMaWJyYXJ5TW9kaWZpY2F0aW9uSGVscGVyX2Nhbm5vdFVwZGF0ZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3YXJuaW5nRGxnX3RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVycm9yRGxnX3RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVycm9yRGxnX3NhdmVFcnJvcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyByb2xlRGlhZ3JhbUZvbnRfbmFtZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyByb2xlRGlhZ3JhbUZvbnRfbmFtZV93aW4zMjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyByb2xlRGlhZ3JhbUZvbnRfbmFtZV9qYTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyByb2xlRGlhZ3JhbUZvbnRfbmFtZV93aW4zMl9qYTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyByb2xlRGlhZ3JhbUZvbnRfbmFtZV9rbzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyByb2xlRGlhZ3JhbUZvbnRfbmFtZV93aW4zMl9rbzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyByb2xlRGlhZ3JhbUZvbnRfbmFtZV96aDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyByb2xlRGlhZ3JhbUZvbnRfbmFtZV93aW4zMl96aDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyByb2xlRGlhZ3JhbUZvbnRfbmFtZV96aF9UVzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyByb2xlRGlhZ3JhbUZvbnRfbmFtZV93aW4zMl96aF9UVzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyByb2xlRGlhZ3JhbUZvbnRfc2l6ZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyByb2xlRGlhZ3JhbUZvbnRfc2l6ZV93aW4zMjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyByb2xlRGlhZ3JhbV94TWFyZ2luOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJvbGVEaWFncmFtX3hTcGFjaW5nOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJvbGVEaWFncmFtX3lTcGFjaW5nOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGFjdGl2aXR5RGlhZ3JhbU5hbWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgYWN0aXZpdHlEZXRhaWxEaWFncmFtTmFtZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3cERlcGVuZGVuY3lEaWFncmFtTmFtZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb2xvbl93aXRoX3NwYWNlOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVsZW1lbnRFcnJvcl9taXNzaW5nX2VsZW1lbnQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWxlbWVudEVycm9yX2NvbnRyaWJ1dG9yX21pc3NpbmdfYmFzZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFbGVtZW50RXJyb3JfZXh0ZW5kZXJfbWlzc2luZ19iYXNlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVsZW1lbnRFcnJvcl9yZXBsYWNlcl9taXNzaW5nX2Jhc2U7CQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVsZW1lbnRFcnJvcl9taXNzaW5nX3ByaW1hcnlfcGVyZm9ybWVyOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVsZW1lbnRFcnJvcl9taXNzaW5nX21hbmRhdG9yeV9pbnB1dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFbGVtZW50RXJyb3JfbWlzc2luZ19vdXRwdXQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWxlbWVudEVycm9yX21pc3NpbmdfcmVzcG9uc2libGVfZm9yX3dvcmtQcm9kdWN0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVsZW1lbnRFcnJvcl9oYXZpbmdfbXVsdGlwbGVfcmVwbGFjZXJzOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdvcmtQcm9kdWN0U2xvdF90ZXh0OwotCQotCXN0YXRpYyB7Ci0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIExpYnJhcnlSZXNvdXJjZXMuY2xhc3MpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvTGlicmFyeVNlcnZpY2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9MaWJyYXJ5U2VydmljZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNmY4Y2RhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9MaWJyYXJ5U2VydmljZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzM5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5OwotCi1pbXBvcnQgamF2YS5uZXQuVVJJOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnNlcnZpY2UudXRpbHMuQ29tbWFuZExpbmVSdW5VdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnByZWZlcmVuY2VzLkxpYnJhcnlQcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5zZXJ2aWNlcy5TYWZlVXBkYXRlQ29udHJvbGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLkxpYnJhcnlQcm9ibGVtTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hRmFjdG9yeTsKLQotLyoqCi0gKiBUaGUgZGVmYXVsdCBMaWJyYXJ5IFNlcnZpY2UgaW1wbGVtZW50YXRpb24uCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIExpYnJhcnlTZXJ2aWNlIGltcGxlbWVudHMgSUxpYnJhcnlTZXJ2aWNlIHsKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IEVWRU5UX0NSRUFURV9MSUJSQVJZID0gMTsKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IEVWRU5UX09QRU5fTElCUkFSWSA9IDI7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBFVkVOVF9SRU9QRU5fTElCUkFSWSA9IDM7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBFVkVOVF9DTE9TRV9MSUJSQVJZID0gNDsKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IEVWRU5UX1NFVF9DVVJSRU5UX0xJQlJBUlkgPSA1OwotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgRVZFTlRfU0VUX0NVUlJFTlRfQ09ORklHVVJBVElPTiA9IDY7Ci0KLQkvLyBUaGUgc2hhcmVkIGluc3RhbmNlLgotCXByb3RlY3RlZCBzdGF0aWMgSUxpYnJhcnlTZXJ2aWNlIGluc3RhbmNlOwotCi0JLy8gQSBtYXAgb2YgbWV0aG9kIGxpYnJhcmllcyB0byBsaWJyYXJ5IG1hbmFnZXJzLgotCXByb3RlY3RlZCBNYXA8TWV0aG9kTGlicmFyeSwgSUxpYnJhcnlNYW5hZ2VyPiBsaWJyYXJ5TWFuYWdlcnMgPSBuZXcgSGFzaE1hcDxNZXRob2RMaWJyYXJ5LCBJTGlicmFyeU1hbmFnZXI+KCk7Ci0KLQkvLyBBIG1hcCBvZiBtZXRob2QgY29uZmlndXJhdGlvbnMgdG8gY29uZmlndXJhdGlvbiBtYW5hZ2Vycy4KLQlwcm90ZWN0ZWQgTWFwPE1ldGhvZENvbmZpZ3VyYXRpb24sIElDb25maWd1cmF0aW9uTWFuYWdlcj4gY29uZmlnTWFuYWdlcnMgPSBuZXcgSGFzaE1hcDxNZXRob2RDb25maWd1cmF0aW9uLCBJQ29uZmlndXJhdGlvbk1hbmFnZXI+KCk7Ci0KLQkvLyBUaGUgbGlicmFyeSBzZXJ2aWNlIGxpc3RlbmVycy4KLQlwcm90ZWN0ZWQgTGlzdDxJTGlicmFyeVNlcnZpY2VMaXN0ZW5lcj4gbGlzdGVuZXJzID0gbmV3IEFycmF5TGlzdDxJTGlicmFyeVNlcnZpY2VMaXN0ZW5lcj4oKTsKLQotCS8vIFRoZSBjdXJyZW50IG1ldGhvZCBsaWJyYXJ5LgotCXByb3RlY3RlZCBNZXRob2RMaWJyYXJ5IGN1cnJlbnRMaWJyYXJ5OwotCi0JLy8gVGhlIGN1cnJlbnQgbWV0aG9kIGNvbmZpZ3VyYXRpb24uCi0JcHJvdGVjdGVkIE1ldGhvZENvbmZpZ3VyYXRpb24gY3VycmVudENvbmZpZzsKLQotCS8vIElmIHRydWUsIHRoZSBjdXJyZW50IG1ldGhvZCBsaWJyYXJ5IGlzIGJlaW5nIGNsb3NlZC4KLQlwcml2YXRlIGJvb2xlYW4gY2xvc2luZ0N1cnJlbnRMaWJyYXJ5OwotCi0JcHJpdmF0ZSBMaWJyYXJ5UHJvYmxlbU1vbml0b3IgbGlicmFyeVByb2JsZW1Nb25pdG9yOwotCS8qKgotCSAqIFJldHVybnMgdGhlIHNoYXJlZCBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElMaWJyYXJ5U2VydmljZSBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKGluc3RhbmNlID09IG51bGwpIHsKLQkJCXN5bmNocm9uaXplZCAoTGlicmFyeVNlcnZpY2UuY2xhc3MpIHsKLQkJCQlpZiAoaW5zdGFuY2UgPT0gbnVsbCkgewotCQkJCQlpbnN0YW5jZSA9IG5ldyBMaWJyYXJ5U2VydmljZSgpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwcml2YXRlIExpYnJhcnlTZXJ2aWNlKCkgewotCQlpbml0KCk7Ci0JfQotCi0JLyoqCi0JICogUGVyZm9ybXMgdGhlIG5lY2Vzc2FyeSBpbml0aWFsaXphdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0KCkgewotCQkvLyBJbml0aWFsaXplIHRoZSBsaWJyYXJ5IG1hbmFnZXIgZmFjdG9yeSB0byBwcmUtcHJvY2VzcyB0aGUKLQkJLy8gIm9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxpYnJhcnlNYW5hZ2VycyIgZXh0ZW5zaW9uIHBvaW50LgotCQlMaWJyYXJ5TWFuYWdlckZhY3RvcnkuZ2V0SW5zdGFuY2UoKTsKLQotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgbWV0aG9kIGxpYnJhcnkuCi0JICogCi0JICogQHBhcmFtIG5hbWUKLQkgKiAgICAgICAgICAgIGEgbmFtZSBmb3IgdGhlIG5ldyBtZXRob2QgbGlicmFyeQotCSAqIEBwYXJhbSB0eXBlCi0JICogICAgICAgICAgICB0aGUgbWV0aG9kIGxpYnJhcnkgdHlwZQotCSAqIEBwYXJhbSBhcmdzCi0JICogICAgICAgICAgICBtZXRob2QgbGlicmFyeSBzcGVjaWZpYyBhcmd1bWVudHMKLQkgKiBAcmV0dXJuIGEgbWV0aG9kIGxpYnJhcnkKLQkgKiBAdGhyb3cgPGNvZGU+TGlicmFyeVNlcnZpY2VFeGNlcHRpb248L2NvZGU+IGlmIGFuIGVycm9yIG9jY3VycyB3aGlsZQotCSAqICAgICAgICBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KLQkgKi8KLQlwdWJsaWMgTWV0aG9kTGlicmFyeSBjcmVhdGVNZXRob2RMaWJyYXJ5KFN0cmluZyBuYW1lLCBTdHJpbmcgdHlwZSwKLQkJCU1hcDxTdHJpbmcsIE9iamVjdD4gcGFyYW1zKSB0aHJvd3MgTGlicmFyeVNlcnZpY2VFeGNlcHRpb24gewotCQlpZiAobmFtZSA9PSBudWxsIHx8IHR5cGUgPT0gbnVsbCB8fCBwYXJhbXMgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotCQl9Ci0KLQkJYm9vbGVhbiByZW9wZW5MaWJyYXJ5ID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKQotCQkJCS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpICE9IG51bGw7Ci0KLQkJdHJ5IHsKLQkJCUxpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuY2xvc2VDdXJyZW50TWV0aG9kTGlicmFyeSgpOwotCi0JCQlJTGlicmFyeU1hbmFnZXIgbWFuYWdlciA9IExpYnJhcnlNYW5hZ2VyRmFjdG9yeS5nZXRJbnN0YW5jZSgpCi0JCQkJCS5jcmVhdGVMaWJyYXJ5TWFuYWdlcih0eXBlKTsKLQkJCU1ldGhvZExpYnJhcnkgbGlicmFyeSA9IG1hbmFnZXIuY3JlYXRlTWV0aG9kTGlicmFyeShuYW1lLCBwYXJhbXMpOwotCQkJaWYgKGxpYnJhcnkgIT0gbnVsbCkgewotCQkJCS8vIG9wZW4gbmV3bHkgY3JlYXRlZCBtZXRob2QgbGlicmFyeSB3aXRob3V0IHNlbmRpbmcgb3V0IG5vdGlmaWNhdGlvbgotCQkJCS8vCi0JCQkJbGlicmFyeSA9IG1hbmFnZXIub3Blbk1ldGhvZExpYnJhcnkobWFuYWdlci5nZXRNZXRob2RMaWJyYXJ5VVJJKCkpOwotCi0JCQkJc2V0TGlicmFyeU1hbmFnZXIobWFuYWdlcik7Ci0KLQkJCQkvLyBTZXQgdGhlIGN1cnJlbnQgbGlicmFyeSwgZG8gdGhpcyBiZWZvcmUgbm90aWZ5aW5nIHRoZSBsaWJyYXJ5Ci0JCQkJLy8gbGlzdGVuZXJzLgotCQkJCXNldEN1cnJlbnRNZXRob2RMaWJyYXJ5KGxpYnJhcnkpOwotCi0JCQkJLy8gU2F2ZSB0aGUgbGlicmFyeSBVUkkgYW5kIHR5cGUgdG8gcHJlZmVyZW5jZSBzdG9yZS4KLQkJCQlzYXZlTWV0aG9kTGlicmFyeVByZWZlcmVuY2VzKG1hbmFnZXIuZ2V0TWV0aG9kTGlicmFyeVVSSSgpLAotCQkJCQkJdHlwZSk7Ci0KLQkJCQlub3RpZnlMaXN0ZW5lcnMobGlicmFyeSwgRVZFTlRfQ1JFQVRFX0xJQlJBUlkpOwkJCQkJCQkJCi0JCQl9Ci0KLQkJCXJlb3BlbkxpYnJhcnkgPSBmYWxzZTsKLQotCQkJcmV0dXJuIGxpYnJhcnk7Ci0JCX0gY2F0Y2ggKExpYnJhcnlTZXJ2aWNlRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IGU7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgTGlicmFyeVNlcnZpY2VFeGNlcHRpb24oZSk7Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAocmVvcGVuTGlicmFyeSkgewotCQkJCW9wZW5MYXN0T3BlbmVkTWV0aG9kTGlicmFyeSgpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogT3BlbnMgYW4gZXhpc3RpbmcgbWV0aG9kIGxpYnJhcnkuCi0JICogCi0JICogQHBhcmFtIHR5cGUKLQkgKiAgICAgICAgICAgIHRoZSBtZXRob2QgbGlicmFyeSB0eXBlCi0JICogQHBhcmFtIHVyaQotCSAqICAgICAgICAgICAgdGhlIG1ldGhvZCBsaWJyYXJ5IFVSSQotCSAqIEByZXR1cm4gYSBtZXRob2QgbGlicmFyeQotCSAqIEB0aHJvdyA8Y29kZT5MaWJyYXJ5U2VydmljZUV4Y2VwdGlvbjwvY29kZT4gaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlCi0JICogICAgICAgIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgotCSAqLwotCXB1YmxpYyBNZXRob2RMaWJyYXJ5IG9wZW5NZXRob2RMaWJyYXJ5KFN0cmluZyB0eXBlLCBVUkkgdXJpKQotCQkJdGhyb3dzIExpYnJhcnlTZXJ2aWNlRXhjZXB0aW9uIHsKLQkJaWYgKHVyaSA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0JCX0KLQotCQl0cnkgewotCQkJSUxpYnJhcnlNYW5hZ2VyIG1hbmFnZXIgPSBMaWJyYXJ5TWFuYWdlckZhY3RvcnkuZ2V0SW5zdGFuY2UoKQotCQkJCQkuY3JlYXRlTGlicmFyeU1hbmFnZXIodHlwZSk7Ci0JCQlNZXRob2RMaWJyYXJ5IGxpYnJhcnkgPSBtYW5hZ2VyLm9wZW5NZXRob2RMaWJyYXJ5KHVyaSk7Ci0JCQlpZiAobGlicmFyeSAhPSBudWxsKSB7Ci0JCQkJc2V0TGlicmFyeU1hbmFnZXIobWFuYWdlcik7Ci0KLQkJCQkvLyBTZXQgdGhlIGN1cnJlbnQgbGlicmFyeSwgZG8gdGhpcyBiZWZvcmUgbm90aWZ5aW5nIHRoZSBsaWJyYXJ5Ci0JCQkJLy8gbGlzdGVuZXJzLgotCQkJCXNldEN1cnJlbnRNZXRob2RMaWJyYXJ5KGxpYnJhcnkpOwotCi0JCQkJLy8gU2F2ZSB0aGUgbGlicmFyeSBVUkkgYW5kIHR5cGUgdG8gcHJlZmVyZW5jZSBzdG9yZS4KLQkJCQlzYXZlTWV0aG9kTGlicmFyeVByZWZlcmVuY2VzKG1hbmFnZXIuZ2V0TWV0aG9kTGlicmFyeVVSSSgpLAotCQkJCQkJdHlwZSk7Ci0KLQkJCQlub3RpZnlMaXN0ZW5lcnMobGlicmFyeSwgRVZFTlRfT1BFTl9MSUJSQVJZKTsKLQkJCX0KLQkJCXJldHVybiBsaWJyYXJ5OwotCQl9IGNhdGNoIChDcmVhdGVMaWJyYXJ5TWFuYWdlckV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBlOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJdGhyb3cgbmV3IExpYnJhcnlTZXJ2aWNlRXhjZXB0aW9uKGUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogT3BlbnMgYW4gZXhpc3RpbmcgbWV0aG9kIGxpYnJhcnkuCi0JICogCi0JICogQHBhcmFtIHR5cGUKLQkgKiAgICAgICAgICAgIHRoZSBtZXRob2QgbGlicmFyeSB0eXBlCi0JICogQHBhcmFtIHBhcmFtcwotCSAqICAgICAgICAgICAgbWV0aG9kIGxpYnJhcnkgc3BlY2lmaWMgYXJndW1lbnRzCi0JICogQHJldHVybiBhIG1ldGhvZCBsaWJyYXJ5Ci0JICogQHRocm93IDxjb2RlPkxpYnJhcnlTZXJ2aWNlRXhjZXB0aW9uPC9jb2RlPiBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUKLQkgKiAgICAgICAgcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCi0JICovCi0JcHVibGljIE1ldGhvZExpYnJhcnkgb3Blbk1ldGhvZExpYnJhcnkoU3RyaW5nIHR5cGUsCi0JCQlNYXA8U3RyaW5nLCBPYmplY3Q+IHBhcmFtcykgdGhyb3dzIExpYnJhcnlTZXJ2aWNlRXhjZXB0aW9uIHsKLQkJaWYgKHBhcmFtcyA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0JCX0KLQotCQl0cnkgewotCQkJSUxpYnJhcnlNYW5hZ2VyIG1hbmFnZXIgPSBMaWJyYXJ5TWFuYWdlckZhY3RvcnkuZ2V0SW5zdGFuY2UoKQotCQkJCQkuY3JlYXRlTGlicmFyeU1hbmFnZXIodHlwZSk7Ci0JCQlNZXRob2RMaWJyYXJ5IGxpYnJhcnkgPSBtYW5hZ2VyLm9wZW5NZXRob2RMaWJyYXJ5KHBhcmFtcyk7Ci0JCQlpZiAobGlicmFyeSAhPSBudWxsKSB7Ci0JCQkJc2V0TGlicmFyeU1hbmFnZXIobWFuYWdlcik7Ci0KLQkJCQkvLyBTZXQgdGhlIGN1cnJlbnQgbGlicmFyeSwgZG8gdGhpcyBiZWZvcmUgbm90aWZ5aW5nIHRoZSBsaWJyYXJ5Ci0JCQkJLy8gbGlzdGVuZXJzLgotCQkJCXNldEN1cnJlbnRNZXRob2RMaWJyYXJ5KGxpYnJhcnkpOwotCi0JCQkJLy8gU2F2ZSB0aGUgbGlicmFyeSBVUkkgYW5kIHR5cGUgdG8gcHJlZmVyZW5jZSBzdG9yZS4KLQkJCQlzYXZlTWV0aG9kTGlicmFyeVByZWZlcmVuY2VzKG1hbmFnZXIuZ2V0TWV0aG9kTGlicmFyeVVSSSgpLAotCQkJCQkJdHlwZSk7Ci0KLQkJCQlub3RpZnlMaXN0ZW5lcnMobGlicmFyeSwgRVZFTlRfT1BFTl9MSUJSQVJZKTsKLQkJCX0KLQkJCXJldHVybiBsaWJyYXJ5OwotCQl9IGNhdGNoIChDcmVhdGVMaWJyYXJ5TWFuYWdlckV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBlOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJdGhyb3cgbmV3IExpYnJhcnlTZXJ2aWNlRXhjZXB0aW9uKGUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogT3BlbnMgdGhlIGxhc3Qgb3BlbmVkIG1ldGhvZCBsaWJyYXJ5LgotCSAqIAotCSAqIEByZXR1cm4gYSBtZXRob2QgbGlicmFyeSBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqLwotCXB1YmxpYyBNZXRob2RMaWJyYXJ5IG9wZW5MYXN0T3BlbmVkTWV0aG9kTGlicmFyeSgpIHsKLQkJaWYgKENvbW1hbmRMaW5lUnVuVXRpbC5nZXRJbnN0YW5jZSgpLmlzTmVlZFRvUnVuKCkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCQotCQlTdHJpbmcgc2F2ZWRNZXRob2RMaWJyYXJ5VVJJID0gTGlicmFyeVByZWZlcmVuY2VzCi0JCQkJLmdldFNhdmVkTWV0aG9kTGlicmFyeVVSSSgpOwotCQl0cnkgewotCQkJVVJJIHVyaSA9IG5ldyBVUkkoc2F2ZWRNZXRob2RMaWJyYXJ5VVJJKTsKLQkJCWlmICh1cmkuZ2V0UGF0aCgpLmxlbmd0aCgpID09IDApIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQotCQkJU3RyaW5nIHR5cGUgPSBMaWJyYXJ5UHJlZmVyZW5jZXMuZ2V0U2F2ZWRNZXRob2RMaWJyYXJ5VHlwZSgpOwotCQkJaWYgKHR5cGUgPT0gbnVsbCB8fCB0eXBlLmxlbmd0aCgpID09IDApIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQotCQkJcmV0dXJuIG9wZW5NZXRob2RMaWJyYXJ5KHR5cGUsIHVyaSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlMaWJyYXJ5UGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dXYXJuaW5nKAotCQkJCQkiVW5hYmxlIHRvIG9wZW4gdGhlIGxhc3Qgb3BlbmVkIG1ldGhvZCBsaWJyYXJ5ICciIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkrIHNhdmVkTWV0aG9kTGlicmFyeVVSSSArICInLiIpOyAvLyROT04tTkxTLTEkCi0JCQlMaWJyYXJ5UHJlZmVyZW5jZXMuc2V0U2F2ZWRNZXRob2RMaWJyYXJ5VVJJKCIiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJlb3BlbnMgYSBtZXRob2QgbGlicmFyeS4KLQkgKiAKLQkgKiBAcGFyYW0gbGlicmFyeQotCSAqICAgICAgICAgICAgYSBtZXRob2QgbGlicmFyeQotCSAqIEByZXR1cm4gYSBtZXRob2QgbGlicmFyeQotCSAqIEB0aHJvdyA8Y29kZT5MaWJyYXJ5U2VydmljZUV4Y2VwdGlvbjwvY29kZT4gaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlCi0JICogICAgICAgIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgotCSAqLwotCXB1YmxpYyBNZXRob2RMaWJyYXJ5IHJlb3Blbk1ldGhvZExpYnJhcnkoTWV0aG9kTGlicmFyeSBsaWJyYXJ5KQotCQkJdGhyb3dzIExpYnJhcnlTZXJ2aWNlRXhjZXB0aW9uIHsKLQkJSUxpYnJhcnlNYW5hZ2VyIG1hbmFnZXIgPSBnZXRMaWJyYXJ5TWFuYWdlcihsaWJyYXJ5KTsKLQkJaWYgKG1hbmFnZXIgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlyZW1vdmVMaWJyYXJ5TWFuYWdlcihtYW5hZ2VyKTsKLQkJCQlsaWJyYXJ5ID0gbWFuYWdlci5yZW9wZW5NZXRob2RMaWJyYXJ5KCk7Ci0KLQkJCQkvLyBSZS1yZWdpc3RlciB0aGUgbGlicmFyeSBtYW5hZ2VyIHNpbmNlIHRoZSBsaWJyYXJ5IGluc3RhbmNlCi0JCQkJLy8gd2lsbCBiZSBjaGFuZ2VkLgotCQkJCXNldExpYnJhcnlNYW5hZ2VyKG1hbmFnZXIpOwotCi0JCQkJLy8gU2V0IHRoZSBjdXJyZW50IGxpYnJhcnksIGRvIHRoaXMgYmVmb3JlIG5vdGlmeWluZyB0aGUgbGlicmFyeQotCQkJCS8vIGxpc3RlbmVycy4KLQkJCQlzZXRDdXJyZW50TWV0aG9kTGlicmFyeShsaWJyYXJ5KTsKLQotCQkJCW5vdGlmeUxpc3RlbmVycyhsaWJyYXJ5LCBFVkVOVF9SRU9QRU5fTElCUkFSWSk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCXRocm93IG5ldyBMaWJyYXJ5U2VydmljZUV4Y2VwdGlvbihlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZW9wZW5zIHRoZSBjdXJyZW50IG1ldGhvZCBsaWJyYXJ5LgotCSAqIAotCSAqIEByZXR1cm4gYSBtZXRob2QgbGlicmFyeQotCSAqIEB0aHJvdyA8Y29kZT5MaWJyYXJ5U2VydmljZUV4Y2VwdGlvbjwvY29kZT4gaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlCi0JICogICAgICAgIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgotCSAqLwotCXB1YmxpYyBNZXRob2RMaWJyYXJ5IHJlb3BlbkN1cnJlbnRNZXRob2RMaWJyYXJ5KCkKLQkJCXRocm93cyBMaWJyYXJ5U2VydmljZUV4Y2VwdGlvbiB7Ci0JCXJldHVybiByZW9wZW5NZXRob2RMaWJyYXJ5KGN1cnJlbnRMaWJyYXJ5KTsKLQl9Ci0KLQkvKioKLQkgKiBTYXZlcyBhIG1ldGhvZCBsaWJyYXJ5LgotCSAqIAotCSAqIEBwYXJhbSBsaWJyYXJ5Ci0JICogICAgICAgICAgICBhIG1ldGhvZCBsaWJyYXJ5Ci0JICogQHRocm93IDxjb2RlPkxpYnJhcnlTZXJ2aWNlRXhjZXB0aW9uPC9jb2RlPiBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUKLQkgKiAgICAgICAgcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCi0JICovCi0JcHVibGljIHZvaWQgc2F2ZU1ldGhvZExpYnJhcnkoTWV0aG9kTGlicmFyeSBsaWJyYXJ5KQotCQkJdGhyb3dzIExpYnJhcnlTZXJ2aWNlRXhjZXB0aW9uIHsKLQkJSUxpYnJhcnlNYW5hZ2VyIG1hbmFnZXIgPSBnZXRMaWJyYXJ5TWFuYWdlcihsaWJyYXJ5KTsKLQkJaWYgKG1hbmFnZXIgIT0gbnVsbCkgewotCQkJbWFuYWdlci5zYXZlTWV0aG9kTGlicmFyeSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU2F2ZXMgdGhlIGN1cnJlbnQgbWV0aG9kIGxpYnJhcnkuCi0JICogCi0JICogQHRocm93IDxjb2RlPkxpYnJhcnlTZXJ2aWNlRXhjZXB0aW9uPC9jb2RlPiBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUKLQkgKiAgICAgICAgcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCi0JICovCi0JcHVibGljIHZvaWQgc2F2ZUN1cnJlbnRNZXRob2RMaWJyYXJ5KCkgdGhyb3dzIExpYnJhcnlTZXJ2aWNlRXhjZXB0aW9uIHsKLQkJc2F2ZU1ldGhvZExpYnJhcnkoY3VycmVudExpYnJhcnkpOwotCX0KLQotCS8qKgotCSAqIENsb3NlcyBhIG1ldGhvZCBsaWJyYXJ5LgotCSAqIDxwPgotCSAqIFRoaXMgYXV0b21hdGljYWxseSBkaXNwb3NlcyBpdHMgbGlicmFyeSBtYW5hZ2VyIGFuZCB0aGUgY29uZmlndXJhdGlvbgotCSAqIG1hbmFnZXJzIHRoYXQgbWFuYWdlIHRoZSBtZXRob2QgY29uZmlndXJhdGlvbnMgaW4gdGhlIG1ldGhvZCBsaWJyYXJ5LgotCSAqIAotCSAqIEBwYXJhbSBsaWJyYXJ5Ci0JICogICAgICAgICAgICBhIG1ldGhvZCBsaWJyYXJ5Ci0JICogQHRocm93IDxjb2RlPkxpYnJhcnlTZXJ2aWNlRXhjZXB0aW9uPC9jb2RlPiBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUKLQkgKiAgICAgICAgcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCi0JICovCi0JcHVibGljIHZvaWQgY2xvc2VNZXRob2RMaWJyYXJ5KE1ldGhvZExpYnJhcnkgbGlicmFyeSkKLQkJCXRocm93cyBMaWJyYXJ5U2VydmljZUV4Y2VwdGlvbiB7Ci0JCUlMaWJyYXJ5TWFuYWdlciBtYW5hZ2VyID0gZ2V0TGlicmFyeU1hbmFnZXIobGlicmFyeSk7Ci0JCWlmIChtYW5hZ2VyICE9IG51bGwpIHsKLQkJCW5vdGlmeUxpc3RlbmVycyhsaWJyYXJ5LCBFVkVOVF9DTE9TRV9MSUJSQVJZKTsKLQkJCW1hbmFnZXIuY2xvc2VNZXRob2RMaWJyYXJ5KCk7Ci0JCQlpZiAoY3VycmVudExpYnJhcnkgPT0gbGlicmFyeSkgewotCQkJCXNldEN1cnJlbnRNZXRob2RMaWJyYXJ5KG51bGwpOwotCQkJCXNldEN1cnJlbnRNZXRob2RDb25maWd1cmF0aW9uKG51bGwpOwotCQkJfQotCQkJcmVtb3ZlTGlicmFyeU1hbmFnZXIobWFuYWdlcik7Ci0JCQltYW5hZ2VyLmRpc3Bvc2UoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENsb3NlcyB0aGUgY3VycmVudCBtZXRob2QgbGlicmFyeS4KLQkgKiAKLQkgKiBAdGhyb3cgPGNvZGU+TGlicmFyeVNlcnZpY2VFeGNlcHRpb248L2NvZGU+IGlmIGFuIGVycm9yIG9jY3VycyB3aGlsZQotCSAqICAgICAgICBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgY2xvc2VDdXJyZW50TWV0aG9kTGlicmFyeSgpCi0JCQl0aHJvd3MgTGlicmFyeVNlcnZpY2VFeGNlcHRpb24gewotCQlpZiAoY2xvc2luZ0N1cnJlbnRMaWJyYXJ5KQotCQkJcmV0dXJuOwotCQl0cnkgewotCQkJY2xvc2luZ0N1cnJlbnRMaWJyYXJ5ID0gdHJ1ZTsKLQkJCWlmIChjdXJyZW50TGlicmFyeSAhPSBudWxsKSB7Ci0JCQkJY2xvc2VNZXRob2RMaWJyYXJ5KGN1cnJlbnRMaWJyYXJ5KTsKLQkJCX0KLQkJfSBmaW5hbGx5IHsKLQkJCWNsb3NpbmdDdXJyZW50TGlicmFyeSA9IGZhbHNlOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVwbGFjZXMgYSB0aGUgbWV0aG9kIGxpYnJhcnkuCi0JICogCi0JICogQHBhcmFtIG9sZExpYnJhcnkKLQkgKiAgICAgICAgICAgIHRoZSBvbGQgbWV0aG9kIGxpYnJhcnkKLQkgKiBAcGFyYW0gbmV3TGlicmFyeQotCSAqICAgICAgICAgICAgdGhlIG5ldyBtZXRob2QgbGlicmFyeQotCSAqLwotCXB1YmxpYyB2b2lkIHJlcGxhY2VNZXRob2RMaWJyYXJ5KE1ldGhvZExpYnJhcnkgb2xkTGlicmFyeSwKLQkJCU1ldGhvZExpYnJhcnkgbmV3TGlicmFyeSkgewotCQlJTGlicmFyeU1hbmFnZXIgbWFuYWdlciA9IGdldExpYnJhcnlNYW5hZ2VyKG9sZExpYnJhcnkpOwotCQlpZiAobWFuYWdlciAhPSBudWxsKSB7Ci0JCQlyZW1vdmVMaWJyYXJ5TWFuYWdlcihtYW5hZ2VyKTsKLQotCQkJLy8gU2V0IHRoZSBuZXcgbGlicmFyeSBpbnN0YW5jZSB0byBwcmV2ZW50IHRoZSBsaWJyYXJ5IG1hbmFnZXIgZnJvbQotCQkJLy8gcmVmZXJlbmNpbmcgdGhlIG9sZCBsaWJyYXJ5IGluc3RhbmNlLgotCQkJbWFuYWdlci5zZXRNZXRob2RMaWJyYXJ5KG5ld0xpYnJhcnkpOwotCi0JCQlzZXRMaWJyYXJ5TWFuYWdlcihtYW5hZ2VyKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEFkZHMgYSBsaXN0ZW5lciB0byBtb25pdG9yIExpYnJhcnkgU2VydmljZSBldmVudHMuCi0JICogCi0JICogQHBhcmFtIGxpc3RlbmVyCi0JICogICAgICAgICAgICBhIGxpYnJhcnkgc2VydmljZSBsaXN0ZW5lcgotCSAqLwotCXB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKElMaWJyYXJ5U2VydmljZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWxpc3RlbmVycy5hZGQobGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZXMgYSBsaXN0ZW5lciB0aGF0IHdhcyBhZGRlZCB0byBtb25pdG9yIExpYnJhcnkgU2VydmljZSBldmVudHMuCi0JICogCi0JICogQHBhcmFtIGxpc3RlbmVyCi0JICogICAgICAgICAgICBhIGxpYnJhcnkgc2VydmljZSBsaXN0ZW5lcgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKElMaWJyYXJ5U2VydmljZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWxpc3RlbmVycy5yZW1vdmUobGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGN1cnJlbnQgbWV0aG9kIGxpYnJhcnkuCi0JICogCi0JICogQHJldHVybiBhIG1ldGhvZCBsaWJyYXJ5Ci0JICovCi0JcHVibGljIE1ldGhvZExpYnJhcnkgZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKSB7Ci0JCXJldHVybiBjdXJyZW50TGlicmFyeTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBjdXJyZW50IG1ldGhvZCBsaWJyYXJ5LgotCSAqIAotCSAqIEBwYXJhbSBsaWJyYXJ5Ci0JICogICAgICAgICAgICBhIG1ldGhvZCBsaWJyYXJ5Ci0JICovCi0JcHVibGljIHZvaWQgc2V0Q3VycmVudE1ldGhvZExpYnJhcnkoTWV0aG9kTGlicmFyeSBsaWJyYXJ5KSB7Ci0JCWN1cnJlbnRMaWJyYXJ5ID0gbGlicmFyeTsKLQkJbm90aWZ5TGlzdGVuZXJzKGxpYnJhcnksIEVWRU5UX1NFVF9DVVJSRU5UX0xJQlJBUlkpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGN1cnJlbnQgbWV0aG9kIGxpYnJhcnkgbG9jYXRpb24gcGF0aC4KLQkgKiA8cD4KLQkgKiBOb3RlOiBBIGZpbGUtYmFzZWQgbWV0aG9kIGxpYnJhcnkgbWF5IHJldHVybiA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKiAKLQkgKiBAcmV0dXJuIGFuIGFic29sdXRlIHBhdGggdG8gdGhlIGN1cnJlbnQgbWV0aG9kIGxpYnJhcnkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEN1cnJlbnRNZXRob2RMaWJyYXJ5TG9jYXRpb24oKSB7Ci0JCUlMaWJyYXJ5TWFuYWdlciBtYW5hZ2VyID0gZ2V0TGlicmFyeU1hbmFnZXIoY3VycmVudExpYnJhcnkpOwotCQlpZiAobWFuYWdlciAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gbWFuYWdlci5nZXRNZXRob2RMaWJyYXJ5TG9jYXRpb24oKTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgbGlicmFyeSBtYW5hZ2VyIGZvciBhIG1ldGhvZCBsaWJyYXJ5LgotCSAqIAotCSAqIEBwYXJhbSBsaWJyYXJ5Ci0JICogICAgICAgICAgICBhIG1ldGhvZCBsaWJyYXJ5Ci0JICogQHJldHVybiBhIGxpYnJhcnkgbWFuYWdlcgotCSAqLwotCXB1YmxpYyBJTGlicmFyeU1hbmFnZXIgZ2V0TGlicmFyeU1hbmFnZXIoTWV0aG9kTGlicmFyeSBsaWJyYXJ5KSB7Ci0JCXJldHVybiAoSUxpYnJhcnlNYW5hZ2VyKSBsaWJyYXJ5TWFuYWdlcnMuZ2V0KGxpYnJhcnkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZUxpYnJhcnlNYW5hZ2VyKElMaWJyYXJ5TWFuYWdlciBsaWJNZ3IpIHsKLQkJaWYgKGxpYk1nciAhPSBudWxsKSB7Ci0JCQlNZXRob2RMaWJyYXJ5IGxpYiA9IGxpYk1nci5nZXRNZXRob2RMaWJyYXJ5KCk7Ci0JCQlpZiAobGliICE9IG51bGwpIHsKLQkJCQlyZW1vdmVDb25maWd1cmF0aW9uTWFuYWdlcnMobGliKTsKLQkJCQlsaWJyYXJ5TWFuYWdlcnMucmVtb3ZlKGxpYik7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRMaWJyYXJ5TWFuYWdlcihJTGlicmFyeU1hbmFnZXIgbGliTWdyKSB7Ci0JCU1ldGhvZExpYnJhcnkgbGliID0gbGliTWdyLmdldE1ldGhvZExpYnJhcnkoKTsKLQkJaWYgKGxpYiAhPSBudWxsKSB7Ci0JCQlsaWJyYXJ5TWFuYWdlcnMucHV0KGxpYiwgbGliTWdyKTsKLQkJfQotCi0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgbGlicmFyeSBtYW5hZ2VyIGZvciB0aGUgY3VycmVudCBtZXRob2QgbGlicmFyeS4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgbGlicmFyeSBtYW5hZ2VyCi0JICovCi0JcHVibGljIElMaWJyYXJ5TWFuYWdlciBnZXRDdXJyZW50TGlicmFyeU1hbmFnZXIoKSB7Ci0JCXJldHVybiBnZXRMaWJyYXJ5TWFuYWdlcihjdXJyZW50TGlicmFyeSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBtZXRob2QgY29uZmlndXJhdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gbmFtZQotCSAqICAgICAgICAgICAgYSBuYW1lIGZvciB0aGUgbmV3IG1ldGhvZCBjb25maWd1cmF0aW9uCi0JICogQHBhcmFtIGxpYnJhcnkKLQkgKiAgICAgICAgICAgIHRoZSBjb250YWluaW5nIG1ldGhvZCBsaWJyYXJ5Ci0JICogQHJldHVybiBhIG1ldGhvZCBjb25maWd1cmF0aW9uCi0JICogQHRocm93IDxjb2RlPkxpYnJhcnlTZXJ2aWNlRXhjZXB0aW9uPC9jb2RlPiBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUKLQkgKiAgICAgICAgcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCi0JICovCi0JcHVibGljIE1ldGhvZENvbmZpZ3VyYXRpb24gY3JlYXRlTWV0aG9kQ29uZmlndXJhdGlvbihTdHJpbmcgbmFtZSwKLQkJCU1ldGhvZExpYnJhcnkgbGlicmFyeSkgdGhyb3dzIExpYnJhcnlTZXJ2aWNlRXhjZXB0aW9uIHsKLQkJaWYgKG5hbWUgPT0gbnVsbCB8fCBsaWJyYXJ5ID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLQkJfQotCi0JCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnOwotCQlMaXN0IGNvbmZpZ3MgPSBsaWJyYXJ5LmdldFByZWRlZmluZWRDb25maWd1cmF0aW9ucygpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gY29uZmlncy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQljb25maWcgPSAoTWV0aG9kQ29uZmlndXJhdGlvbikgaXQubmV4dCgpOwotCQkJaWYgKG5hbWUuZXF1YWxzKGNvbmZpZy5nZXROYW1lKCkpKSB7Ci0JCQkJdGhyb3cgbmV3IENvbmZpZ3VyYXRpb25BbHJlYWR5RXhpc3RzRXhjZXB0aW9uKCk7Ci0JCQl9Ci0JCX0KLQotCQljb25maWcgPSBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVNZXRob2RDb25maWd1cmF0aW9uKCk7Ci0JCWNvbmZpZy5zZXROYW1lKG5hbWUpOwotCQljb25maWdzLmFkZChjb25maWcpOwotCQlyZXR1cm4gY29uZmlnOwotCX0KLQkKLQkKLQkvKioKLQkgKiBHZXRzIHRoZSBjdXJyZW50IG1ldGhvZCBjb25maWd1cmF0aW9uLgotCSAqIAotCSAqIEByZXR1cm4gYSBtZXRob2QgY29uZmlndXJhdGlvbgotCSAqLwotCXB1YmxpYyBNZXRob2RDb25maWd1cmF0aW9uIGdldEN1cnJlbnRNZXRob2RDb25maWd1cmF0aW9uKCkgewotCQlyZXR1cm4gY3VycmVudENvbmZpZzsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBjdXJyZW50IG1ldGhvZCBjb25maWd1cmF0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBjb25maWcKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDdXJyZW50TWV0aG9kQ29uZmlndXJhdGlvbihNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZykgewotCQljdXJyZW50Q29uZmlnID0gY29uZmlnOwotCQlub3RpZnlMaXN0ZW5lcnMoY29uZmlnLCBFVkVOVF9TRVRfQ1VSUkVOVF9DT05GSUdVUkFUSU9OKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBjb25maWd1cmF0aW9uIG1hbmFnZXIgZm9yIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24uCi0JICogCi0JICogQHBhcmFtIGNvbmZpZwotCSAqICAgICAgICAgICAgYSBtZXRob2QgY29uZmlndXJhdGlvbgotCSAqIEByZXR1cm4gYSBjb25maWd1cmF0aW9uIG1hbmFnZXIKLQkgKi8KLQlwdWJsaWMgSUNvbmZpZ3VyYXRpb25NYW5hZ2VyIGdldENvbmZpZ3VyYXRpb25NYW5hZ2VyKAotCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLQkJaWYgKGNvbmZpZyA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0JCX0KLQkJSUNvbmZpZ3VyYXRpb25NYW5hZ2VyIG1hbmFnZXIgPSAoSUNvbmZpZ3VyYXRpb25NYW5hZ2VyKSBjb25maWdNYW5hZ2VycwotCQkJCS5nZXQoY29uZmlnKTsKLQkJaWYgKG1hbmFnZXIgPT0gbnVsbCkgewotCQkJbWFuYWdlciA9IG5ldyBDb25maWd1cmF0aW9uTWFuYWdlcihjb25maWcpOwotCQkJY29uZmlnTWFuYWdlcnMucHV0KGNvbmZpZywgbWFuYWdlcik7Ci0JCX0KLQkJcmV0dXJuIG1hbmFnZXI7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlQ29uZmlndXJhdGlvbk1hbmFnZXIoTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLQkJaWYgKGNvbmZpZyA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0JCX0KLQotCQlJQ29uZmlndXJhdGlvbk1hbmFnZXIgbWdyID0gKElDb25maWd1cmF0aW9uTWFuYWdlcikgY29uZmlnTWFuYWdlcnMKLQkJCQkucmVtb3ZlKGNvbmZpZyk7Ci0JCWlmIChtZ3IgIT0gbnVsbCkgewotCQkJbWdyLmRpc3Bvc2UoKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZUNvbmZpZ3VyYXRpb25NYW5hZ2VycyhNZXRob2RMaWJyYXJ5IGxpYnJhcnkpIHsKLQkJaWYgKGxpYnJhcnkgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotCQl9Ci0KLQkJTWV0aG9kQ29uZmlndXJhdGlvbltdIGNvbmZpZ3MgPSBMaWJyYXJ5U2VydmljZVV0aWwKLQkJCQkuZ2V0TWV0aG9kQ29uZmlndXJhdGlvbnMobGlicmFyeSk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY29uZmlncy5sZW5ndGg7IGkrKykgewotCQkJcmVtb3ZlQ29uZmlndXJhdGlvbk1hbmFnZXIoY29uZmlnc1tpXSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBjb25maWd1cmF0aW9uIG1hbmFnZXIgZm9yIHRoZSBjdXJyZW50IG1ldGhvZCBjb25maWd1cmF0aW9uLgotCSAqIAotCSAqIEByZXR1cm4gYSBjb25maWd1cmF0aW9uIG1hbmFnZXIKLQkgKi8KLQlwdWJsaWMgSUNvbmZpZ3VyYXRpb25NYW5hZ2VyIGdldEN1cnJlbnRDb25maWd1cmF0aW9uTWFuYWdlcigpIHsKLQkJaWYgKGN1cnJlbnRDb25maWcgIT0gbnVsbCkgewotCQkJcmV0dXJuIGdldENvbmZpZ3VyYXRpb25NYW5hZ2VyKGN1cnJlbnRDb25maWcpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFNlbmRzIGEgbWV0aG9kIGxpYnJhcnkgcmVsYXRlZCBldmVudCB0byBhbGwgbGlicmFyeSBzZXJ2aWNlIGxpc3RlbmVycy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBub3RpZnlMaXN0ZW5lcnMoZmluYWwgTWV0aG9kTGlicmFyeSBsaWJyYXJ5LCBpbnQgZXZlbnRJZCkgewotCQlmb3IgKEl0ZXJhdG9yPElMaWJyYXJ5U2VydmljZUxpc3RlbmVyPiBpdCA9IG5ldyBBcnJheUxpc3Q8SUxpYnJhcnlTZXJ2aWNlTGlzdGVuZXI+KAotCQkJCWxpc3RlbmVycykuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJZmluYWwgSUxpYnJhcnlTZXJ2aWNlTGlzdGVuZXIgbGlzdGVuZXIgPSBpdC5uZXh0KCk7Ci0JCQlzd2l0Y2ggKGV2ZW50SWQpIHsKLQkJCWNhc2UgRVZFTlRfQ1JFQVRFX0xJQlJBUlk6Ci0JCQkJU2FmZVVwZGF0ZUNvbnRyb2xsZXIuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJbGlzdGVuZXIubGlicmFyeUNyZWF0ZWQobGlicmFyeSk7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCQlicmVhazsKLQkJCWNhc2UgRVZFTlRfT1BFTl9MSUJSQVJZOgotCQkJCVNhZmVVcGRhdGVDb250cm9sbGVyLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCWxpc3RlbmVyLmxpYnJhcnlPcGVuZWQobGlicmFyeSk7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCQlicmVhazsKLQkJCWNhc2UgRVZFTlRfUkVPUEVOX0xJQlJBUlk6Ci0JCQkJU2FmZVVwZGF0ZUNvbnRyb2xsZXIuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJbGlzdGVuZXIubGlicmFyeVJlb3BlbmVkKGxpYnJhcnkpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEVWRU5UX0NMT1NFX0xJQlJBUlk6Ci0JCQkJU2FmZVVwZGF0ZUNvbnRyb2xsZXIuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJbGlzdGVuZXIubGlicmFyeUNsb3NlZChsaWJyYXJ5KTsKLQkJCQkJfQotCQkJCX0pOwotCQkJCWJyZWFrOwotCQkJY2FzZSBFVkVOVF9TRVRfQ1VSUkVOVF9MSUJSQVJZOgotCQkJCVNhZmVVcGRhdGVDb250cm9sbGVyLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCWxpc3RlbmVyLmxpYnJhcnlTZXQobGlicmFyeSk7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFNlbmRzIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24gcmVsYXRlZCBldmVudCB0byBhbGwgbGlicmFyeSBzZXJ2aWNlCi0JICogbGlzdGVuZXJzLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIG5vdGlmeUxpc3RlbmVycyhmaW5hbCBNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZywgaW50IGV2ZW50SWQpIHsKLQkJZm9yIChJdGVyYXRvcjxJTGlicmFyeVNlcnZpY2VMaXN0ZW5lcj4gaXQgPSBuZXcgQXJyYXlMaXN0PElMaWJyYXJ5U2VydmljZUxpc3RlbmVyPigKLQkJCQlsaXN0ZW5lcnMpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCWZpbmFsIElMaWJyYXJ5U2VydmljZUxpc3RlbmVyIGxpc3RlbmVyID0gaXQubmV4dCgpOwotCQkJc3dpdGNoIChldmVudElkKSB7Ci0JCQljYXNlIEVWRU5UX1NFVF9DVVJSRU5UX0NPTkZJR1VSQVRJT046Ci0JCQkJU2FmZVVwZGF0ZUNvbnRyb2xsZXIuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQlsaXN0ZW5lci5jb25maWd1cmF0aW9uU2V0KGNvbmZpZyk7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFNhdmVzIHRoZSBtZXRob2QgbGlicmFyeSBVUkkgYW5kIHR5cGUgdG8gcHJlZmVyZW5jZSBzdG9yZS4KLQkgKiAKLQkgKiBAcGFyYW0gdXJpCi0JICogICAgICAgICAgICB0aGUgbWV0aG9kIGxpYnJhcnkgVVJJCi0JICogQHBhcmFtIHR5cGUKLQkgKiAgICAgICAgICAgIHRoZSBtZW50aG9kIGxpYnJhcnkgdHlwZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNhdmVNZXRob2RMaWJyYXJ5UHJlZmVyZW5jZXMoVVJJIHVyaSwgU3RyaW5nIHR5cGUpIHsKLQkJTGlicmFyeVByZWZlcmVuY2VzLnNldFNhdmVkTWV0aG9kTGlicmFyeVVSSSh1cmkudG9TdHJpbmcoKSk7Ci0JCUxpYnJhcnlQcmVmZXJlbmNlcy5zZXRTYXZlZE1ldGhvZExpYnJhcnlUeXBlKHR5cGUpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5JTGlicmFyeVNlcnZpY2UjcmVnaXN0ZXJNZXRob2RMaWJyYXJ5KG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeSwgamF2YS5sYW5nLlN0cmluZywgamF2YS51dGlsLk1hcCkKLQkgKi8KLQlwdWJsaWMgdm9pZCAgcmVnaXN0ZXJNZXRob2RMaWJyYXJ5KE1ldGhvZExpYnJhcnkgbGliLCBTdHJpbmcgdHlwZSwKLQkJCU1hcDxTdHJpbmcsIE9iamVjdD4gcGFyYW1zKSB0aHJvd3MgTGlicmFyeVNlcnZpY2VFeGNlcHRpb24gewotCQkvL0ZvciBub3csIHN0aWxsIHNpbXBseSB3cmFwaW5nIHVwIG9sZCBpbXBsZW1lbnRhdGlvbiAoY29waWVkIGZyb20gQ29uZmlndXJhdGlvbkV4cG9ydFNlcnZpY2UpIGZvciBzbW9vdGhlciBjaGFuZ2U7IHdpbGwgZGVmaW5ldGx5IGNoYW5nZSBsYXRlcgotCQkvL3NvIHRoYXQgY3JlYXRpbmcgYSBuZXcgbGliIHdvdWxkIG5vdCBiZSBuZWVkZWQJCQotCQlJTGlicmFyeU1hbmFnZXIgbGliTWdyID0gTGlicmFyeU1hbmFnZXJGYWN0b3J5LmdldEluc3RhbmNlKCkKLQkJCS5jcmVhdGVMaWJyYXJ5TWFuYWdlcih0eXBlKTsKLQkJbGliTWdyLnJlZ2lzdGVyTWV0aG9kTGlicmFyeShsaWIsIHBhcmFtcyk7Ci0JCS8vbGliTWdyLmNyZWF0ZU1ldGhvZExpYnJhcnkobmFtZSwgcGFyYW1zKTsKLQkJLy9saWJNZ3Iuc2V0TWV0aG9kTGlicmFyeShsaWIpOwotCQlMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLnNldExpYnJhcnlNYW5hZ2VyKGxpYk1ncik7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LklMaWJyYXJ5U2VydmljZSN1blJlZ2lzdGVyTWV0aG9kTGlicmFyeShvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnkpCi0JICovCi0JcHVibGljIHZvaWQgdW5SZWdpc3Rlck1ldGhvZExpYnJhcnkoTWV0aG9kTGlicmFyeSBsaWIpIHRocm93cyBMaWJyYXJ5U2VydmljZUV4Y2VwdGlvbiB7Ci0JCS8vRm9yIG5vdywgc3RpbGwgc2ltcGx5IHdyYXBpbmcgdXAgb2xkIGltcGxlbWVudGF0aW9uIChjb3BpZWQgZnJvbSBDb25maWd1cmF0aW9uRXhwb3J0U2VydmljZSkgZm9yIHNtb290aGVyIGNoYW5nZQotCQlJTGlicmFyeU1hbmFnZXIgbGliTWdyID0gZ2V0TGlicmFyeU1hbmFnZXIobGliKTsKLQkJaWYgKGxpYk1nciA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJcmVtb3ZlTGlicmFyeU1hbmFnZXIobGliTWdyKTsKLQkJLy9saWJNZ3IuY2xvc2VNZXRob2RMaWJyYXJ5KCk7Ci0JCWxpYk1nci51blJlZ2lzdGVyTWV0aG9kTGlicmFyeSgpOwotCQlsaWJNZ3IuZGlzcG9zZSgpOwotCX0KLQkKLQlwdWJsaWMgTGlicmFyeVByb2JsZW1Nb25pdG9yIGdldExpYnJhcnlQcm9ibGVtTW9uaXRvcigpIHsKLQkJaWYgKGxpYnJhcnlQcm9ibGVtTW9uaXRvciA9PSBudWxsKSB7Ci0JCQlsaWJyYXJ5UHJvYmxlbU1vbml0b3IgPSBuZXcgTGlicmFyeVByb2JsZW1Nb25pdG9yKCk7Ci0JCX0KLQkJcmV0dXJuIAlsaWJyYXJ5UHJvYmxlbU1vbml0b3I7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvTGlicmFyeVNlcnZpY2VFeGNlcHRpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9MaWJyYXJ5U2VydmljZUV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YTkzMjMxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9MaWJyYXJ5U2VydmljZUV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnk7Ci0KLS8qKgotICogU2lnbmFscyB0aGF0IGEgTGlicmFyeSBTZXJ2aWNlIG9wZXJhdGlvbiBoYXMgZmFpbGVkLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIExpYnJhcnlTZXJ2aWNlRXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgTGlicmFyeVNlcnZpY2VFeGNlcHRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBnaXZlbiB0aGUgcm9vdCBjYXVzZSBvZiB0aGUgZXhjZXB0aW9uLgotCSAqIAotCSAqIEBwYXJhbSByb290Q2F1c2UKLQkgKiAgICAgICAgICAgIHRoZSByb290IGNhdXNlIG9mIHRoZSBleGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgTGlicmFyeVNlcnZpY2VFeGNlcHRpb24oVGhyb3dhYmxlIHJvb3RDYXVzZSkgewotCQlzdXBlcihyb290Q2F1c2UpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UgZ2l2ZW4gdGhlIGVycm9yIG1lc3NhZ2UuCi0JICogCi0JICogQHBhcmFtIGVycm9yTXNnCi0JICogICAgICAgICAgICB0aGUgZXJyb3IgbWVzc2FnZQotCSAqLwotCXB1YmxpYyBMaWJyYXJ5U2VydmljZUV4Y2VwdGlvbihTdHJpbmcgZXJyb3JNc2cpIHsKLQkJc3VwZXIoZXJyb3JNc2cpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UgZ2l2ZW4gdGhlIGVycm9yIG1lc3NhZ2UgYW5kIHRoZSByb290IGNhdXNlIG9mIHRoZQotCSAqIGV4Y2VwdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gZXJyb3JNc2cKLQkgKiAgICAgICAgICAgIHRoZSBlcnJvciBtZXNzYWdlCi0JICogQHBhcmFtIHJvb3RDYXVzZQotCSAqICAgICAgICAgICAgdGhlIHJvb3QgY2F1c2Ugb2YgdGhlIGV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBMaWJyYXJ5U2VydmljZUV4Y2VwdGlvbihTdHJpbmcgZXJyb3JNc2csIFRocm93YWJsZSByb290Q2F1c2UpIHsKLQkJc3VwZXIoZXJyb3JNc2csIHJvb3RDYXVzZSk7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L0xpYnJhcnlTZXJ2aWNlTGlzdGVuZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9MaWJyYXJ5U2VydmljZUxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3ZDIyYmMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L0xpYnJhcnlTZXJ2aWNlTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLQotLyoqCi0gKiBBIGRlZmF1bHQgbGlicmFyeSBzZXJ2aWNlIGxpc3RlbmVyLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBMaWJyYXJ5U2VydmljZUxpc3RlbmVyIGltcGxlbWVudHMgSUxpYnJhcnlTZXJ2aWNlTGlzdGVuZXIgewotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5JTGlicmFyeVNlcnZpY2VMaXN0ZW5lciNjb25maWd1cmF0aW9uU2V0KG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBjb25maWd1cmF0aW9uU2V0KE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5JTGlicmFyeVNlcnZpY2VMaXN0ZW5lciNsaWJyYXJ5Q2xvc2VkKG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBsaWJyYXJ5Q2xvc2VkKE1ldGhvZExpYnJhcnkgbGlicmFyeSkgewotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuSUxpYnJhcnlTZXJ2aWNlTGlzdGVuZXIjbGlicmFyeUNyZWF0ZWQob3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5KQotCSAqLwotCXB1YmxpYyB2b2lkIGxpYnJhcnlDcmVhdGVkKE1ldGhvZExpYnJhcnkgbGlicmFyeSkgewotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuSUxpYnJhcnlTZXJ2aWNlTGlzdGVuZXIjbGlicmFyeU9wZW5lZChvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnkpCi0JICovCi0JcHVibGljIHZvaWQgbGlicmFyeU9wZW5lZChNZXRob2RMaWJyYXJ5IGxpYnJhcnkpIHsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LklMaWJyYXJ5U2VydmljZUxpc3RlbmVyI2xpYnJhcnlSZW9wZW5lZChvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnkpCi0JICovCi0JcHVibGljIHZvaWQgbGlicmFyeVJlb3BlbmVkKE1ldGhvZExpYnJhcnkgbGlicmFyeSkgewotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuSUxpYnJhcnlTZXJ2aWNlTGlzdGVuZXIjbGlicmFyeVNldChvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnkpCi0JICovCi0JcHVibGljIHZvaWQgbGlicmFyeVNldChNZXRob2RMaWJyYXJ5IGxpYnJhcnkpIHsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9MaWJyYXJ5U2VydmljZVV0aWwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9MaWJyYXJ5U2VydmljZVV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2M0Y2M2NC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvTGlicmFyeVNlcnZpY2VVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MTQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnk7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlRyZWVNYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuU3RyVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb25maWd1cmF0aW9uLk1ldGhvZENvbmZpZ3VyYXRpb25FbGVtZW50TGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuTW9kZWxTdHJ1Y3R1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UuSUxpYnJhcnlSZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLkxpYnJhcnlVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuTW9kZWxTdG9yYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy5JTGlicmFyeVBlcnNpc3RlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNhcGFiaWxpdHlQYXR0ZXJuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ2hlY2tsaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcnlQcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0ZhbWlseTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLQotLyoqCi0gKiBIZWxwZXIgdXRpbGl0aWVzIGZvciBhY2Nlc3NpbmcgYW5kIG1hbmFnaW5nIGEgbWV0aG9kIGxpYnJhcnkuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTGlicmFyeVNlcnZpY2VVdGlsIHsKLQotCS8vIEEgY2hlY2tsaXN0IGZpbHRlci4KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBJRmlsdGVyIENIRUNLTElTVF9GSUxURVIgPSBuZXcgSUZpbHRlcigpIHsKLQkJcHVibGljIGJvb2xlYW4gYWNjZXB0KE9iamVjdCBvYmopIHsKLQkJCXJldHVybiBvYmogaW5zdGFuY2VvZiBDaGVja2xpc3Q7Ci0JCX0KLQl9OwotCi0JLyoqCi0JICogR2V0cyB0aGUgYWJzb2x1dGUgcGF0aCB0byBhIG1ldGhvZCBsaWJyYXJ5LgotCSAqIAotCSAqIEBwYXJhbSBsaWJyYXJ5Ci0JICogICAgICAgICAgICBhIG1ldGhvZCBsaWJyYXJ5Ci0JICogQHJldHVybiBhbiBhYnNvbHV0ZSBwYXRoIHRvIHRoZSBtZXRob2QgbGlicmFyeQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE1ldGhvZExpYnJhcnlQYXRoKE1ldGhvZExpYnJhcnkgbGlicmFyeSkgewotCQlpZiAobGlicmFyeSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlSZXNvdXJjZSByZXNvdXJjZSA9IGxpYnJhcnkuZVJlc291cmNlKCk7Ci0JCWlmIChyZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQlVUkkgcmVzb3VyY2VVUkkgPSByZXNvdXJjZS5nZXRVUkkoKTsKLQkJCWlmIChyZXNvdXJjZVVSSSAhPSBudWxsICYmIHJlc291cmNlVVJJLmlzRmlsZSgpKSB7Ci0JCQkJU3RyaW5nIHBhdGggPSByZXNvdXJjZVVSSS50b0ZpbGVTdHJpbmcoKTsKLQkJCQlyZXR1cm4gbmV3IEZpbGUocGF0aCkuZ2V0UGFyZW50RmlsZSgpLmdldEFic29sdXRlUGF0aCgpOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGFic29sdXRlIHBhdGggdG8gdGhlIGN1cnJlbnQgbWV0aG9kIGxpYnJhcnkuCi0JICogCi0JICogQHBhcmFtIGxpYnJhcnkKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGxpYnJhcnkKLQkgKiBAcmV0dXJuIGFuIGFic29sdXRlIHBhdGggdG8gdGhlIG1ldGhvZCBsaWJyYXJ5Ci0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0Q3VycmVudE1ldGhvZExpYnJhcnlQYXRoKCkgewotCQlyZXR1cm4gZ2V0TWV0aG9kTGlicmFyeVBhdGgoTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKQotCQkJCS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBwYXJlbnQgbWV0aG9kIGxpYnJhcnkgb2YgYSBtZXRob2QgZWxlbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqICAgICAgICAgICAgYSBtZXRob2QgZWxlbWVudAotCSAqIEByZXR1cm4gYSBtZXRob2QgbGlicmFyeQotCSAqLwotCXB1YmxpYyBzdGF0aWMgTWV0aG9kTGlicmFyeSBnZXRNZXRob2RMaWJyYXJ5KE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgewotCQlmb3IgKEVPYmplY3Qgb2JqID0gZWxlbWVudDsgb2JqICE9IG51bGw7IG9iaiA9IG9iai5lQ29udGFpbmVyKCkpIHsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBNZXRob2RMaWJyYXJ5KSB7Ci0JCQkJcmV0dXJuIChNZXRob2RMaWJyYXJ5KSBvYmo7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogR2V0cyBhIHNwZWNpZmljIG1ldGhvZCBjb25maWd1cmF0aW9uIGluIGEgbWV0aG9kIGxpYnJhcnkuCi0JICogCi0JICogQHBhcmFtIGxpYnJhcnkKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGxpYnJhcnkKLQkgKiBAcGFyYW0gbmFtZQotCSAqICAgICAgICAgICAgdGhlIG1ldGhvZCBjb25maWd1cmF0aW9uIG5hbWUKLQkgKiBAcmV0dXJuIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1ldGhvZENvbmZpZ3VyYXRpb24gZ2V0TWV0aG9kQ29uZmlndXJhdGlvbigKLQkJCU1ldGhvZExpYnJhcnkgbGlicmFyeSwgU3RyaW5nIG5hbWUpIHsKLQkJaWYgKGxpYnJhcnkgIT0gbnVsbCkgewotCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWc7Ci0JCQlMaXN0PE1ldGhvZENvbmZpZ3VyYXRpb24+IGNvbmZpZ3MgPSBsaWJyYXJ5Ci0JCQkJCS5nZXRQcmVkZWZpbmVkQ29uZmlndXJhdGlvbnMoKTsKLQkJCWZvciAoSXRlcmF0b3I8TWV0aG9kQ29uZmlndXJhdGlvbj4gaXQgPSBjb25maWdzLml0ZXJhdG9yKCk7IGl0Ci0JCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJY29uZmlnID0gaXQubmV4dCgpOwotCQkJCWlmICghKGNvbmZpZyBpbnN0YW5jZW9mIFByb2Nlc3NGYW1pbHkpCi0JCQkJCQkmJiBjb25maWcuZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSkgewotCQkJCQlyZXR1cm4gY29uZmlnOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIGFsbCB0aGUgbWV0aG9kIGNvbmZpZ3VyYXRpb25zIGluIGEgbWV0aG9kIGxpYnJhcnkuCi0JICogCi0JICogQHBhcmFtIGxpYnJhcnkKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGxpYnJhcnkKLQkgKiBAcmV0dXJuIGFuIGFycmF5IG9mIG1ldGhvZCBjb25maWd1cmF0aW9ucwotCSAqLwotCXB1YmxpYyBzdGF0aWMgTWV0aG9kQ29uZmlndXJhdGlvbltdIGdldE1ldGhvZENvbmZpZ3VyYXRpb25zKAotCQkJTWV0aG9kTGlicmFyeSBsaWJyYXJ5KSB7Ci0JCUxpc3Q8TWV0aG9kQ29uZmlndXJhdGlvbj4gY29uZmlnczsKLQkJaWYgKGxpYnJhcnkgIT0gbnVsbCkgewotCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWc7Ci0JCQljb25maWdzID0gbmV3IEFycmF5TGlzdDxNZXRob2RDb25maWd1cmF0aW9uPihsaWJyYXJ5Ci0JCQkJCS5nZXRQcmVkZWZpbmVkQ29uZmlndXJhdGlvbnMoKSk7Ci0JCQlmb3IgKEl0ZXJhdG9yPE1ldGhvZENvbmZpZ3VyYXRpb24+IGkgPSBjb25maWdzLml0ZXJhdG9yKCk7IGkKLQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQljb25maWcgPSBpLm5leHQoKTsKLQkJCQlpZiAoY29uZmlnID09IG51bGwgfHwgY29uZmlnIGluc3RhbmNlb2YgUHJvY2Vzc0ZhbWlseSkgewotCQkJCQlpLnJlbW92ZSgpOwotCQkJCX0KLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWNvbmZpZ3MgPSBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCQl9Ci0JCU1ldGhvZENvbmZpZ3VyYXRpb25bXSByZXN1bHQgPSBuZXcgTWV0aG9kQ29uZmlndXJhdGlvbltjb25maWdzLnNpemUoKV07Ci0JCWNvbmZpZ3MudG9BcnJheShyZXN1bHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIG5hbWVzIG9mIGFsbCBtZXRob2QgY29uZmlndXJhdGlvbnMgaW4gYSBtZXRob2QgbGlicmFyeS4KLQkgKiAKLQkgKiBAcGFyYW0gbGlicmFyeQotCSAqICAgICAgICAgICAgYSBtZXRob2QgbGlicmFyeQotCSAqIEBwYXJhbSBuYW1lCi0JICogICAgICAgICAgICB0aGUgbWV0aG9kIGNvbmZpZ3VyYXRpb24gbmFtZQotCSAqIEByZXR1cm4gYW4gYXJyYXkgb2YgbWV0aG9kIGNvbmZpZ3VyYXRpb24gbmFtZXMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZ1tdIGdldE1ldGhvZENvbmZpZ3VyYXRpb25OYW1lcyhNZXRob2RMaWJyYXJ5IGxpYnJhcnkpIHsKLQkJTGlzdDxTdHJpbmc+IGNvbmZpZ05hbWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWlmIChsaWJyYXJ5ICE9IG51bGwpIHsKLQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnOwotCQkJTGlzdDxNZXRob2RDb25maWd1cmF0aW9uPiBjb25maWdzID0gbGlicmFyeQotCQkJCQkuZ2V0UHJlZGVmaW5lZENvbmZpZ3VyYXRpb25zKCk7Ci0JCQlmb3IgKEl0ZXJhdG9yPE1ldGhvZENvbmZpZ3VyYXRpb24+IGkgPSBjb25maWdzLml0ZXJhdG9yKCk7IGkKLQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQljb25maWcgPSAoTWV0aG9kQ29uZmlndXJhdGlvbikgaS5uZXh0KCk7Ci0JCQkJaWYgKCEoY29uZmlnIGluc3RhbmNlb2YgUHJvY2Vzc0ZhbWlseSkpIHsKLQkJCQkJY29uZmlnTmFtZXMuYWRkKGNvbmZpZy5nZXROYW1lKCkpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlTdHJpbmdbXSByZXN1bHQgPSBuZXcgU3RyaW5nW2NvbmZpZ05hbWVzLnNpemUoKV07Ci0JCWNvbmZpZ05hbWVzLnRvQXJyYXkocmVzdWx0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIGFsbCB0aGUgcHJvY2Vzc2VzIGluIHRoZSBjdXJyZW50IG1ldGhvZCBsaWJyYXJ5LgotCSAqIAotCSAqIEByZXR1biBhIGNvbGxlY3Rpb24gb2YgPGNvZGU+Q2FwYWJpbGl0eVBhdHRlcm48L2NvZGU+IGFuZAotCSAqICAgICAgICA8Y29kZT5EZWxpdmVyeVByb2Nlc3M8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBNYXA8U3RyaW5nLCBQcm9jZXNzPiBnZXRQcm9jZXNzZXMoKSB7Ci0JCU1ldGhvZExpYnJhcnkgbGlicmFyeSA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLQkJCQkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKTsKLQkJaWYgKGxpYnJhcnkgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlNYXA8U3RyaW5nLCBQcm9jZXNzPiByZXN1bHQgPSBuZXcgVHJlZU1hcDxTdHJpbmcsIFByb2Nlc3M+KCk7Ci0JCUxpc3Q8TWV0aG9kUGx1Z2luPiBtZXRob2RQbHVnaW5zID0gTGlicmFyeVV0aWwKLQkJCQkuZ2V0TWV0aG9kUGx1Z2lucyhsaWJyYXJ5KTsKLQkJZm9yIChJdGVyYXRvcjxNZXRob2RQbHVnaW4+IGkgPSBtZXRob2RQbHVnaW5zLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgewotCQkJTWV0aG9kUGx1Z2luIG1ldGhvZFBsdWdpbiA9IGkubmV4dCgpOwotCQkJU3RyaW5nIGNhcGFiaWxpdHlQYXR0ZXJuUGF0aHNbXSA9IE1vZGVsU3RydWN0dXJlLkRFRkFVTFQuY2FwYWJpbGl0eVBhdHRlcm5QYXRoOwotCQkJTWV0aG9kUGFja2FnZSBtZXRob2RQYWNrYWdlID0gVW1hVXRpbC5maW5kTWV0aG9kUGFja2FnZSgKLQkJCQkJbWV0aG9kUGx1Z2luLCBjYXBhYmlsaXR5UGF0dGVyblBhdGhzKTsKLQkJCWlmIChtZXRob2RQYWNrYWdlIGluc3RhbmNlb2YgUHJvY2Vzc1BhY2thZ2UpIHsKLQkJCQlpZiAobWV0aG9kUGFja2FnZSBpbnN0YW5jZW9mIFByb2Nlc3NQYWNrYWdlKSB7Ci0JCQkJCWdldENhcGFiaWxpdHlQYXR0ZXJucygoUHJvY2Vzc1BhY2thZ2UpIG1ldGhvZFBhY2thZ2UsCi0JCQkJCQkJcmVzdWx0KTsKLQkJCQl9Ci0JCQl9Ci0JCQlTdHJpbmcgZGVsaXZlcnlQcm9jZXNzUGF0aHNbXSA9IE1vZGVsU3RydWN0dXJlLkRFRkFVTFQuZGVsaXZlcnlQcm9jZXNzUGF0aDsKLQkJCW1ldGhvZFBhY2thZ2UgPSBVbWFVdGlsLmZpbmRNZXRob2RQYWNrYWdlKG1ldGhvZFBsdWdpbiwKLQkJCQkJZGVsaXZlcnlQcm9jZXNzUGF0aHMpOwotCQkJaWYgKG1ldGhvZFBhY2thZ2UgaW5zdGFuY2VvZiBQcm9jZXNzUGFja2FnZSkgewotCQkJCWlmIChtZXRob2RQYWNrYWdlIGluc3RhbmNlb2YgUHJvY2Vzc1BhY2thZ2UpIHsKLQkJCQkJZ2V0RGVsaXZlcnlQcm9jZXNzZXMoKFByb2Nlc3NQYWNrYWdlKSBtZXRob2RQYWNrYWdlLCByZXN1bHQpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIEdldHMgYWxsIHRoZSBjYXBhYmlsaXR5IHBhdHRlcm5zIGluIHRoZSBjdXJyZW50IG1ldGhvZCBsaWJyYXJ5LgotCSAqIAotCSAqIEByZXR1biBhIGNvbGxlY3Rpb24gb2YgPGNvZGU+Q2FwYWJpbGl0eVBhdHRlcm48L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBNYXA8U3RyaW5nLCBQcm9jZXNzPiBnZXRDYXBhYmlsaXR5UGF0dGVybnMoKSB7Ci0JCU1ldGhvZExpYnJhcnkgbGlicmFyeSA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLQkJCQkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKTsKLQkJaWYgKGxpYnJhcnkgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlNYXA8U3RyaW5nLCBQcm9jZXNzPiByZXN1bHQgPSBuZXcgVHJlZU1hcDxTdHJpbmcsIFByb2Nlc3M+KCk7Ci0JCUxpc3Q8TWV0aG9kUGx1Z2luPiBtZXRob2RQbHVnaW5zID0gTGlicmFyeVV0aWwuZ2V0TWV0aG9kUGx1Z2lucyhsaWJyYXJ5KTsKLQkJZm9yIChJdGVyYXRvcjxNZXRob2RQbHVnaW4+IGkgPSBtZXRob2RQbHVnaW5zLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgewotCQkJTWV0aG9kUGx1Z2luIG1ldGhvZFBsdWdpbiA9IGkubmV4dCgpOwotCQkJU3RyaW5nIGNhcGFiaWxpdHlQYXR0ZXJuUGF0aHNbXSA9IE1vZGVsU3RydWN0dXJlLkRFRkFVTFQuY2FwYWJpbGl0eVBhdHRlcm5QYXRoOwotCQkJTWV0aG9kUGFja2FnZSBtZXRob2RQYWNrYWdlID0gVW1hVXRpbC5maW5kTWV0aG9kUGFja2FnZSgKLQkJCQkJbWV0aG9kUGx1Z2luLCBjYXBhYmlsaXR5UGF0dGVyblBhdGhzKTsKLQkJCWlmIChtZXRob2RQYWNrYWdlIGluc3RhbmNlb2YgUHJvY2Vzc1BhY2thZ2UpIHsKLQkJCQlnZXRDYXBhYmlsaXR5UGF0dGVybnMoKFByb2Nlc3NQYWNrYWdlKSBtZXRob2RQYWNrYWdlLCByZXN1bHQpOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogR2V0cyBhbGwgdGhlIGNhcGFiaWxpdHkgcGF0dGVybnMgaW4gYSBtZXRob2QgcGx1Zy1pbi4KLQkgKiAKLQkgKiBAcGFyYW0gcGx1Z2luCi0JICogICAgICAgICAgICBhIG1ldGhvZCBwbHVnLWluCi0JICogQHJldHVuIGEgY29sbGVjdGlvbiBvZiA8Y29kZT5DYXBhYmlsaXR5UGF0dGVybjwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3Q8Q2FwYWJpbGl0eVBhdHRlcm4+IGdldENhcGFiaWxpdHlQYXR0ZXJucygKLQkJCU1ldGhvZFBsdWdpbiBwbHVnaW4pIHsKLQkJTGlzdDxDYXBhYmlsaXR5UGF0dGVybj4gY2FwYWJpbGl0eVBhdHRlcm5zID0gbmV3IEFycmF5TGlzdDxDYXBhYmlsaXR5UGF0dGVybj4oKTsKLQkJTGlzdDxQcm9jZXNzPiBpdGVtcyA9IFRuZ1V0aWwuZ2V0QWxsUHJvY2Vzc2VzKHBsdWdpbik7Ci0JCWZvciAoSXRlcmF0b3I8UHJvY2Vzcz4gaXQgPSBpdGVtcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlQcm9jZXNzIHByb2Nlc3MgPSBpdC5uZXh0KCk7Ci0JCQlpZiAocHJvY2VzcyBpbnN0YW5jZW9mIENhcGFiaWxpdHlQYXR0ZXJuKSB7Ci0JCQkJY2FwYWJpbGl0eVBhdHRlcm5zLmFkZCgoQ2FwYWJpbGl0eVBhdHRlcm4pIHByb2Nlc3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBjYXBhYmlsaXR5UGF0dGVybnM7Ci0JfQotCi0JLyoqCi0JICogR2V0cyBhbGwgdGhlIGRlbGl2ZXJ5IHByb2Nlc3NlcyBpbiB0aGUgY3VycmVudCBtZXRob2QgbGlicmFyeS4KLQkgKiAKLQkgKiBAcmV0dW4gYSBjb2xsZWN0aW9uIG9mIDxjb2RlPkRlbGl2ZXJ5UHJvY2VzczwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1hcDxTdHJpbmcsIFByb2Nlc3M+IGdldERlbGl2ZXJ5UHJvY2Vzc2VzKCkgewotCQlNZXRob2RMaWJyYXJ5IGxpYnJhcnkgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCk7Ci0JCWlmIChsaWJyYXJ5ID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJTWFwPFN0cmluZywgUHJvY2Vzcz4gcmVzdWx0ID0gbmV3IFRyZWVNYXA8U3RyaW5nLCBQcm9jZXNzPigpOwotCQlMaXN0PE1ldGhvZFBsdWdpbj4gbWV0aG9kUGx1Z2lucyA9IExpYnJhcnlVdGlsLmdldE1ldGhvZFBsdWdpbnMobGlicmFyeSk7Ci0JCWZvciAoSXRlcmF0b3I8TWV0aG9kUGx1Z2luPiBpID0gbWV0aG9kUGx1Z2lucy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLQkJCU1ldGhvZFBsdWdpbiBtZXRob2RQbHVnaW4gPSBpLm5leHQoKTsKLQkJCVN0cmluZyBkZWxpdmVyeVByb2Nlc3NQYXRoc1tdID0gTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC5kZWxpdmVyeVByb2Nlc3NQYXRoOwotCQkJTWV0aG9kUGFja2FnZSBtZXRob2RQYWNrYWdlID0gVW1hVXRpbC5maW5kTWV0aG9kUGFja2FnZSgKLQkJCQkJbWV0aG9kUGx1Z2luLCBkZWxpdmVyeVByb2Nlc3NQYXRocyk7Ci0JCQlpZiAobWV0aG9kUGFja2FnZSBpbnN0YW5jZW9mIFByb2Nlc3NQYWNrYWdlKSB7Ci0JCQkJZ2V0RGVsaXZlcnlQcm9jZXNzZXMoKFByb2Nlc3NQYWNrYWdlKSBtZXRob2RQYWNrYWdlLCByZXN1bHQpOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogR2V0cyBhbGwgdGhlIGRlbGl2ZXJ5IHByb2Nlc3NlcyBpbiBhIG1ldGhvZCBwbHVnLWluLgotCSAqIAotCSAqIEBwYXJhbSBwbHVnaW4KLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIHBsdWctaW4KLQkgKiBAcmV0dW4gYSBjb2xsZWN0aW9uIG9mIDxjb2RlPkRlbGl2ZXJ5UHJvY2VzczwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3Q8RGVsaXZlcnlQcm9jZXNzPiBnZXREZWxpdmVyeVByb2Nlc3NlcyhNZXRob2RQbHVnaW4gcGx1Z2luKSB7Ci0JCUxpc3Q8RGVsaXZlcnlQcm9jZXNzPiBkZWxpdmVyeVByb2Nlc3NlcyA9IG5ldyBBcnJheUxpc3Q8RGVsaXZlcnlQcm9jZXNzPigpOwotCQlMaXN0PFByb2Nlc3M+IGl0ZW1zID0gVG5nVXRpbC5nZXRBbGxQcm9jZXNzZXMocGx1Z2luKTsKLQkJZm9yIChJdGVyYXRvcjxQcm9jZXNzPiBpdCA9IGl0ZW1zLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCVByb2Nlc3MgcHJvY2VzcyA9IGl0Lm5leHQoKTsKLQkJCWlmIChwcm9jZXNzIGluc3RhbmNlb2YgRGVsaXZlcnlQcm9jZXNzKSB7Ci0JCQkJZGVsaXZlcnlQcm9jZXNzZXMuYWRkKChEZWxpdmVyeVByb2Nlc3MpIHByb2Nlc3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBkZWxpdmVyeVByb2Nlc3NlczsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIGFsbCB0aGUgY2FwYWJpbGl0eSBwYXR0ZXJucyBpbiBhIHByb2Nlc3MgcGFja2FnZS4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvY2Vzc1BhY2thZ2UKLQkgKiAgICAgICAgICAgIGEgcHJvY2VzcyBwYWNrYWdlCi0JICogQHBhcmFtIHJlc3VsdAotCSAqICAgICAgICAgICAgYSBtYXAKLQkgKiBAcmV0dXJuIGFuIHVwZGF0ZWQgbWFwIGNvbnRhaW5pbmcgYSBjb2xsZWN0aW9uIG9mCi0JICogICAgICAgICA8Y29kZT5DYXBhYmlsaXR5UGF0dGVybjwvY29kZT4KLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIHZvaWQgZ2V0Q2FwYWJpbGl0eVBhdHRlcm5zKFByb2Nlc3NQYWNrYWdlIHByb2Nlc3NQYWNrYWdlLAotCQkJTWFwPFN0cmluZywgUHJvY2Vzcz4gcmVzdWx0KSB7Ci0JCUxpc3Q8TWV0aG9kUGFja2FnZT4gY2hpbGRQYWNrYWdlcyA9IHByb2Nlc3NQYWNrYWdlLmdldENoaWxkUGFja2FnZXMoKTsKLQkJZm9yIChJdGVyYXRvcjxNZXRob2RQYWNrYWdlPiBpID0gY2hpbGRQYWNrYWdlcy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLQkJCU1ldGhvZFBhY2thZ2UgcGtnID0gaS5uZXh0KCk7Ci0JCQlpZiAocGtnIGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkgewotCQkJCVByb2Nlc3NDb21wb25lbnQgcHJvY2Vzc0NvbXBvbmVudCA9IChQcm9jZXNzQ29tcG9uZW50KSBwa2c7Ci0JCQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzIHByb2Nlc3MgPSBwcm9jZXNzQ29tcG9uZW50Ci0JCQkJCQkuZ2V0UHJvY2VzcygpOwotCQkJCWlmIChwcm9jZXNzIGluc3RhbmNlb2YgQ2FwYWJpbGl0eVBhdHRlcm4pIHsKLQkJCQkJU3RyaW5nIG5hbWUgPSBwcm9jZXNzLmdldE5hbWUoKTsKLQkJCQkJcmVzdWx0LnB1dChuYW1lLCBwcm9jZXNzKTsKLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKHBrZyBpbnN0YW5jZW9mIFByb2Nlc3NQYWNrYWdlKSB7Ci0JCQkJZ2V0Q2FwYWJpbGl0eVBhdHRlcm5zKChQcm9jZXNzUGFja2FnZSkgcGtnLCByZXN1bHQpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogR2V0cyBhbGwgdGhlIGRlbGl2ZXJ5IHByb2Nlc3NlcyBpbiBhIHByb2Nlc3MgcGFja2FnZS4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvY2Vzc1BhY2thZ2UKLQkgKiAgICAgICAgICAgIGEgcHJvY2VzcyBwYWNrYWdlCi0JICogQHBhcmFtIHJlc3VsdAotCSAqICAgICAgICAgICAgYSBtYXAKLQkgKiBAcmV0dXJuIGFuIHVwZGF0ZWQgbWFwIGNvbnRhaW5pbmcgYSBjb2xsZWN0aW9uIG9mCi0JICogICAgICAgICA8Y29kZT5EZWxpdmVyeVByb2Nlc3M8L2NvZGU+Ci0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyB2b2lkIGdldERlbGl2ZXJ5UHJvY2Vzc2VzKFByb2Nlc3NQYWNrYWdlIHByb2Nlc3NQYWNrYWdlLAotCQkJTWFwPFN0cmluZywgUHJvY2Vzcz4gcmVzdWx0KSB7Ci0JCUxpc3Q8TWV0aG9kUGFja2FnZT4gY2hpbGRQYWNrYWdlcyA9IHByb2Nlc3NQYWNrYWdlLmdldENoaWxkUGFja2FnZXMoKTsKLQkJZm9yIChJdGVyYXRvcjxNZXRob2RQYWNrYWdlPiBpID0gY2hpbGRQYWNrYWdlcy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLQkJCU1ldGhvZFBhY2thZ2UgcGtnID0gaS5uZXh0KCk7Ci0JCQlpZiAocGtnIGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkgewotCQkJCVByb2Nlc3NDb21wb25lbnQgcHJvY2Vzc0NvbXBvbmVudCA9IChQcm9jZXNzQ29tcG9uZW50KSBwa2c7Ci0JCQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzIHByb2Nlc3MgPSBwcm9jZXNzQ29tcG9uZW50Ci0JCQkJCQkuZ2V0UHJvY2VzcygpOwotCQkJCWlmIChwcm9jZXNzIGluc3RhbmNlb2YgRGVsaXZlcnlQcm9jZXNzKSB7Ci0JCQkJCVN0cmluZyBuYW1lID0gcHJvY2Vzcy5nZXROYW1lKCk7Ci0JCQkJCXJlc3VsdC5wdXQobmFtZSwgcHJvY2Vzcyk7Ci0JCQkJfQotCQkJfSBlbHNlIGlmIChwa2cgaW5zdGFuY2VvZiBQcm9jZXNzUGFja2FnZSkgewotCQkJCWdldERlbGl2ZXJ5UHJvY2Vzc2VzKChQcm9jZXNzUGFja2FnZSkgcGtnLCByZXN1bHQpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgbmFtZXMgb2YgYWxsIHByb2Nlc3MgZmFtaWxpZXMgaW4gYSBtZXRob2QgbGlicmFyeS4KLQkgKiAKLQkgKiBAcGFyYW0gbGlicmFyeQotCSAqICAgICAgICAgICAgYSBtZXRob2QgbGlicmFyeQotCSAqIEByZXR1cm4gYW4gYXJyYXkgb2YgcHJvY2VzcyBmYW1pbHkgbmFtZXMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZ1tdIGdldFByb2Nlc3NGYW1pbHlOYW1lcyhNZXRob2RMaWJyYXJ5IGxpYnJhcnkpIHsKLQkJTGlzdDxTdHJpbmc+IHByb2Nlc3NGYW1pbHlOYW1lcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlpZiAobGlicmFyeSAhPSBudWxsKSB7Ci0JCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZzsKLQkJCUxpc3Q8TWV0aG9kQ29uZmlndXJhdGlvbj4gY29uZmlncyA9IGxpYnJhcnkuZ2V0UHJlZGVmaW5lZENvbmZpZ3VyYXRpb25zKCk7Ci0JCQlmb3IgKEl0ZXJhdG9yPE1ldGhvZENvbmZpZ3VyYXRpb24+IGkgPSBjb25maWdzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgewotCQkJCWNvbmZpZyA9IChNZXRob2RDb25maWd1cmF0aW9uKSBpLm5leHQoKTsKLQkJCQlpZiAoY29uZmlnIGluc3RhbmNlb2YgUHJvY2Vzc0ZhbWlseSkgewotCQkJCQlwcm9jZXNzRmFtaWx5TmFtZXMuYWRkKGNvbmZpZy5nZXROYW1lKCkpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCVN0cmluZ1tdIHJlc3VsdCA9IG5ldyBTdHJpbmdbcHJvY2Vzc0ZhbWlseU5hbWVzLnNpemUoKV07Ci0JCXByb2Nlc3NGYW1pbHlOYW1lcy50b0FycmF5KHJlc3VsdCk7Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBuYW1lcyBvZiBhbGwgY29udGV4dHMgKG1ldGhvZCBjb25maWd1cmF0aW9ucykgYXNzaWduZWQgdG8gYQotCSAqIHByb2Nlc3MuCi0JICogCi0JICogQHBhcmFtIHByb2Nlc3MKLQkgKiAgICAgICAgICAgIGEgY2FwYWJpbGl0eSBwYXR0ZXJuIG9yIGRlbGl2ZXJ5IHByb2Nlc3MKLQkgKiBAcmV0dXJuIGFuIGFycmF5IG9mIGNvbnRleHQgKG1ldGhvZCBjb25maWd1cmF0aW9uKSBuYW1lcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nW10gZ2V0Q29udGV4dHMoUHJvY2VzcyBwcm9jZXNzKSB7Ci0JCUxpc3Q8U3RyaW5nPiBjb250ZXh0TmFtZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJaWYgKHByb2Nlc3MgIT0gbnVsbCkgewotCQkJTGlzdDxNZXRob2RDb25maWd1cmF0aW9uPiBjb250ZXh0cyA9IHByb2Nlc3MuZ2V0VmFsaWRDb250ZXh0KCk7Ci0JCQlmb3IgKEl0ZXJhdG9yPE1ldGhvZENvbmZpZ3VyYXRpb24+IGl0ID0gY29udGV4dHMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY29udGV4dCA9IGl0Lm5leHQoKTsKLQkJCQljb250ZXh0TmFtZXMuYWRkKGNvbnRleHQuZ2V0TmFtZSgpKTsKLQkJCX0KLQkJfQotCQlTdHJpbmdbXSByZXN1bHQgPSBuZXcgU3RyaW5nW2NvbnRleHROYW1lcy5zaXplKCldOwotCQljb250ZXh0TmFtZXMudG9BcnJheShyZXN1bHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIEdldHMgYWxsIHRoZSBtZXRob2QgY29uZmlndXJhdGlvbnMgYXNzaWduZWQgdG8gYSBwcm9jZXNzLgotCSAqIAotCSAqIEBwYXJhbSBwcm9jZXNzCi0JICogICAgICAgICAgICBhIGNhcGFiaWxpdHkgcGF0dGVybiBvciBkZWxpdmVyeSBwcm9jZXNzCi0JICogQHJldHVybiBhIGNvbGxlY3Rpb24gb2YgPGNvZGU+TWV0aG9kQ29uZmlndXJhdGlvbjwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1hcDxTdHJpbmcsIE1ldGhvZENvbmZpZ3VyYXRpb24+IGdldE1ldGhvZENvbmZpZ3VyYXRpb25zKFByb2Nlc3MgcHJvY2VzcykgewotCQlpZiAocHJvY2VzcyA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCU1hcDxTdHJpbmcsIE1ldGhvZENvbmZpZ3VyYXRpb24+IHJlc3VsdCA9IG5ldyBUcmVlTWFwPFN0cmluZywgTWV0aG9kQ29uZmlndXJhdGlvbj4oKTsKLQkJTWV0aG9kQ29uZmlndXJhdGlvbiBkZWZhdWx0Q29udGV4dCA9IHByb2Nlc3MuZ2V0RGVmYXVsdENvbnRleHQoKTsKLQkJaWYgKGRlZmF1bHRDb250ZXh0ICE9IG51bGwpIHsKLQkJCXJlc3VsdC5wdXQoZGVmYXVsdENvbnRleHQuZ2V0TmFtZSgpLCBkZWZhdWx0Q29udGV4dCk7Ci0JCX0KLQotCQlMaXN0PE1ldGhvZENvbmZpZ3VyYXRpb24+IGNvbnRleHRzID0gcHJvY2Vzcy5nZXRWYWxpZENvbnRleHQoKTsKLQkJZm9yIChJdGVyYXRvcjxNZXRob2RDb25maWd1cmF0aW9uPiBpID0gY29udGV4dHMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbnRleHQgPSBpLm5leHQoKTsKLQkJCWlmIChjb250ZXh0ICE9IG51bGwpIHsKLQkJCQlyZXN1bHQucHV0KGNvbnRleHQuZ2V0TmFtZSgpLCBjb250ZXh0KTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogR2V0cyBhbGwgdGhlIGNoZWNrbGlzdHMgaW4gYSBtZXRob2QgY29uZmlndXJhdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gY29uZmlnCi0JICogICAgICAgICAgICBhIG1ldGhvZCBjb25maWd1cmF0aW9uCi0JICogQHJldHVybiBhIGNvbGxlY3Rpb24gb2YgPGNvZGU+Q2hlY2tsaXN0PC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTWFwPFN0cmluZywgQ2hlY2tsaXN0PiBnZXRDaGVja2xpc3RzKAotCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLQkJaWYgKGNvbmZpZyA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCU1hcDxTdHJpbmcsIENoZWNrbGlzdD4gcmVzdWx0ID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBDaGVja2xpc3Q+KCk7Ci0KLQkJQXJyYXlMaXN0PElGaWx0ZXI+IGZpbHRlckxpc3QgPSBuZXcgQXJyYXlMaXN0PElGaWx0ZXI+KCk7Ci0JCWZpbHRlckxpc3QuYWRkKENIRUNLTElTVF9GSUxURVIpOwotCQlNZXRob2RDb25maWd1cmF0aW9uRWxlbWVudExpc3QgZWxlbWVudExpc3QgPSBuZXcgTWV0aG9kQ29uZmlndXJhdGlvbkVsZW1lbnRMaXN0KAotCQkJCWNvbmZpZywgZmlsdGVyTGlzdCk7Ci0JCUxpc3QgZWxlbWVudHMgPSBlbGVtZW50TGlzdC5nZXRMaXN0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSBlbGVtZW50cy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3Qgb2JqID0gaXQubmV4dCgpOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIENoZWNrbGlzdCkgewotCQkJCUNoZWNrbGlzdCBjaGVja2xpc3QgPSAoQ2hlY2tsaXN0KSBvYmo7Ci0JCQkJcmVzdWx0LnB1dChjaGVja2xpc3QuZ2V0TmFtZSgpLCBjaGVja2xpc3QpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBHVUlEIGZvciBhIG1ldGhvZCBlbGVtZW50LgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogICAgICAgICAgICBhIG1ldGhvZCBlbGVtZW50Ci0JICovCi0JcHVibGljIHZvaWQgc2V0R1VJRChNZXRob2RFbGVtZW50IGVsZW1lbnQpIHsKLQkJU3RyaW5nIGd1aWQgPSBlbGVtZW50LmdldEd1aWQoKTsKLQkJaWYgKGd1aWQgPT0gbnVsbCB8fCBndWlkLmxlbmd0aCgpID09IDApIHsKLQkJCWd1aWQgPSBFY29yZVV0aWwuZ2VuZXJhdGVVVUlEKCk7Ci0JCQlib29sZWFuIG9sZE5vdGlmeSA9IGVsZW1lbnQuZURlbGl2ZXIoKTsKLQkJCXRyeSB7Ci0JCQkJZWxlbWVudC5lU2V0RGVsaXZlcihmYWxzZSk7Ci0JCQkJZWxlbWVudC5zZXRHdWlkKGd1aWQpOwotCQkJfSBmaW5hbGx5IHsKLQkJCQllbGVtZW50LmVTZXREZWxpdmVyKG9sZE5vdGlmeSk7Ci0JCQl9Ci0JCX0KLQotCQlMaXN0IGNoaWxkcmVuID0gZWxlbWVudC5lQ29udGVudHMoKTsKLQkJaWYgKGNoaWxkcmVuICE9IG51bGwgJiYgY2hpbGRyZW4uc2l6ZSgpID4gMCkgewotCQkJZm9yIChJdGVyYXRvciBpdCA9IGNoaWxkcmVuLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlPYmplY3QgY2hpbGQgPSBpdC5uZXh0KCk7Ci0JCQkJaWYgKGNoaWxkIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJCQlzZXRHVUlEKChNZXRob2RFbGVtZW50KSBjaGlsZCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgZGVidWcgc3RyaW5nIGZvciBhIG1ldGhvZCBlbGVtZW50LgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogICAgICAgICAgICBhIG1ldGhvZCBlbGVtZW50Ci0JICogQHJldHVybiBhIHN0cmluZyBjb250YWluaW5nIHRoZSBtZXRob2QgZWxlbWVudCBjbGFzcyBuYW1lLCBuYW1lIGFuZCBHVUlECi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RGVidWdTdHJpbmcoTWV0aG9kRWxlbWVudCBlbGVtZW50KSB7Ci0JCWlmIChlbGVtZW50ID09IG51bGwpIHsKLQkJCXJldHVybiAibnVsbCI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gZWxlbWVudC5nZXRDbGFzcygpLmdldE5hbWUoKSArICJbbmFtZTogIiArIGVsZW1lbnQuZ2V0TmFtZSgpIC8vJE5PTi1OTFMtMSQKLQkJCQkrICIsIGd1aWQ9IiArIGVsZW1lbnQuZ2V0R3VpZCgpICsgIl0iOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBjdXJyZW50IG1ldGhvZCBsaWJyYXJ5IHBlcnNpc3Rlci4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBjdXJyZW50IG1ldGhvZCBsaWJyYXJ5IHBlcnNpc3RlcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSUxpYnJhcnlQZXJzaXN0ZXIgZ2V0Q3VycmVudFBlcnNpc3RlcigpIHsKLQkJdHJ5IHsKLQkJCVJlc291cmNlU2V0IHJlc291cmNlU2V0ID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKQotCQkJCQkuZ2V0Q3VycmVudExpYnJhcnlNYW5hZ2VyKCkuZ2V0RWRpdGluZ0RvbWFpbigpCi0JCQkJCS5nZXRSZXNvdXJjZVNldCgpOwotCQkJaWYgKHJlc291cmNlU2V0IGluc3RhbmNlb2YgSUxpYnJhcnlSZXNvdXJjZVNldCkgewotCQkJCXJldHVybiAoKElMaWJyYXJ5UmVzb3VyY2VTZXQpIHJlc291cmNlU2V0KS5nZXRQZXJzaXN0ZXIoKTsKLQkJCX0KLQkJfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgewotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIG1ldGhvZCBsaWJyYXJ5IHBlcnNpc3RlciBmb3IgYSBnaXZlbiByZXNvdXJjZS4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgbWV0aG9kIGxpYnJhcnkgcGVyc2lzdGVyCi0JICovCi0JcHVibGljIHN0YXRpYyBJTGlicmFyeVBlcnNpc3RlciBnZXRQZXJzaXN0ZXJGb3IoUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJUmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQgPSByZXNvdXJjZS5nZXRSZXNvdXJjZVNldCgpOwotCQlpZiAocmVzb3VyY2VTZXQgaW5zdGFuY2VvZiBJTGlicmFyeVJlc291cmNlU2V0KSB7Ci0JCQlyZXR1cm4gKChJTGlicmFyeVJlc291cmNlU2V0KSByZXNvdXJjZVNldCkuZ2V0UGVyc2lzdGVyKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBtZXRob2QgcGx1Zy1pbi4KLQkgKiAKLQkgKiBAcGFyYW0gbmFtZQotCSAqICAgICAgICAgICAgYSBuYW1lIGZvciB0aGUgbmV3IHBsdWctaW4KLQkgKiBAcGFyYW0gYnJpZWZEZXNjCi0JICogICAgICAgICAgICBhIGJyaWVmIGRlc2NyaXB0aW9uIGZvciB0aGUgbmV3IHBsdWctaW4KLQkgKiBAcGFyYW0gYXV0aG9ycwotCSAqICAgICAgICAgICAgdGhlIGF1dGhvcnMgb2YgdGhlIG5ldyBwbHVnLWluCi0JICogQHBhcmFtIHJlZmVyZW5jZWRQbHVnaW5zCi0JICogICAgICAgICAgICB0aGUgcGx1Zy1pbnMgcmVmZXJlbmNlZCBieSB0aGUgbmV3IHBsdWctaW4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1ldGhvZFBsdWdpbiBjcmVhdGVNZXRob2RQbHVnaW4oU3RyaW5nIG5hbWUsCi0JCQlTdHJpbmcgYnJpZWZEZXNjLCBTdHJpbmcgYXV0aG9ycywgT2JqZWN0W10gcmVmZXJlbmNlZFBsdWdpbnMpCi0JCQl0aHJvd3MgRXhjZXB0aW9uIHsKLQkJaWYgKG5hbWUgPT0gbnVsbCB8fCBuYW1lLmxlbmd0aCgpID09IDApIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLQkJfQotCi0JCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVNZXRob2RQbHVnaW4oKTsKLQotCQlwbHVnaW4uc2V0TmFtZShTdHJVdGlsLm1ha2VWYWxpZEZpbGVOYW1lKG5hbWUpKTsKLQkJaWYgKGJyaWVmRGVzYyAhPSBudWxsKSB7Ci0JCQlwbHVnaW4uc2V0QnJpZWZEZXNjcmlwdGlvbihicmllZkRlc2MpOwotCQl9Ci0JCWlmIChhdXRob3JzICE9IG51bGwpIHsKLQkJCXBsdWdpbi5zZXRBdXRob3JzKGF1dGhvcnMpOwotCQl9Ci0JCWlmIChyZWZlcmVuY2VkUGx1Z2lucyAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZmVyZW5jZWRQbHVnaW5zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJTWV0aG9kUGx1Z2luIHJlZmVyZW5jZWRQbHVnaW4gPSAoTWV0aG9kUGx1Z2luKSByZWZlcmVuY2VkUGx1Z2luc1tpXTsKLQkJCQlpZiAocGx1Z2luICE9IG51bGwpIHsKLQkJCQkJcGx1Z2luLmdldEJhc2VzKCkuYWRkKHJlZmVyZW5jZWRQbHVnaW4pOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCU1vZGVsU3RvcmFnZS5pbml0aWFsaXplKHBsdWdpbik7Ci0KLQkJcmV0dXJuIHBsdWdpbjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9SZXNvdXJjZXMucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9SZXNvdXJjZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTZlMTdiZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvUmVzb3VyY2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNzEgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQkVHSU4gTk8gVFJBTlNMQVRJT04KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgUm9sZSBkaWFncmFtIGZvbnRzIGFuZCBsYXlvdXQKLSMgISEgRE8gTk9UIFRSQU5TTEFURSBUSEUgRk9MTE9XSU5HIExJTkUgISEKLXJvbGVEaWFncmFtRm9udF9uYW1lPUFyaWFsCi0jICEhIERPIE5PVCBUUkFOU0xBVEUgVEhFIEZPTExPV0lORyBMSU5FICEhCi1yb2xlRGlhZ3JhbUZvbnRfbmFtZV9qYT1cdTMwYzBcdTMwYTRcdTMwYTJcdTMwZWRcdTMwYjAKLSMgISEgRE8gTk9UIFRSQU5TTEFURSBUSEUgRk9MTE9XSU5HIExJTkUgISEKLXJvbGVEaWFncmFtRm9udF9uYW1lX2tvPVx1YjMwMFx1ZDY1NCBcdWMwYzFcdWM3OTAKLSMgISEgRE8gTk9UIFRSQU5TTEFURSBUSEUgRk9MTE9XSU5HIExJTkUgISEKLXJvbGVEaWFncmFtRm9udF9uYW1lX3poPVx1NWJmOVx1OGJkZFx1Njg0NgotIyAhISBETyBOT1QgVFJBTlNMQVRFIFRIRSBGT0xMT1dJTkcgTElORSAhIQotcm9sZURpYWdyYW1Gb250X25hbWVfemhfVFc9RGlhbG9nCi0jICEhIERPIE5PVCBUUkFOU0xBVEUgVEhFIEZPTExPV0lORyBMSU5FICEhCi1yb2xlRGlhZ3JhbUZvbnRfbmFtZV93aW4zMj1BcmlhbAotIyAhISBETyBOT1QgVFJBTlNMQVRFIFRIRSBGT0xMT1dJTkcgTElORSAhIQotcm9sZURpYWdyYW1Gb250X25hbWVfd2luMzJfamE9TVMgR290aGljCi0jICEhIERPIE5PVCBUUkFOU0xBVEUgVEhFIEZPTExPV0lORyBMSU5FICEhCi1yb2xlRGlhZ3JhbUZvbnRfbmFtZV93aW4zMl9rbz1cdWFkNzRcdWI5YmNcdWNjYjQKLSMgISEgRE8gTk9UIFRSQU5TTEFURSBUSEUgRk9MTE9XSU5HIExJTkUgISEKLXJvbGVEaWFncmFtRm9udF9uYW1lX3dpbjMyX3poPVx1OWVkMVx1NGY1MwotIyAhISBETyBOT1QgVFJBTlNMQVRFIFRIRSBGT0xMT1dJTkcgTElORSAhIQotcm9sZURpYWdyYW1Gb250X25hbWVfd2luMzJfemhfVFc9XHU3ZDMwXHU2NjBlXHU5YWQ0Ci0jICEhIERPIE5PVCBUUkFOU0xBVEUgVEhFIEZPTExPV0lORyBMSU5FICEhCi1yb2xlRGlhZ3JhbUZvbnRfc2l6ZT0xMAotIyAhISBETyBOT1QgVFJBTlNMQVRFIFRIRSBGT0xMT1dJTkcgTElORSAhIQotcm9sZURpYWdyYW1Gb250X3NpemVfd2luMzI9MTAKLSMgISEgRE8gTk9UIFRSQU5TTEFURSBUSEUgRk9MTE9XSU5HIExJTkUgISEKLXJvbGVEaWFncmFtX3hNYXJnaW49MjAwCi0jICEhIERPIE5PVCBUUkFOU0xBVEUgVEhFIEZPTExPV0lORyBMSU5FICEhCi1yb2xlRGlhZ3JhbV94U3BhY2luZz03MAotIyAhISBETyBOT1QgVFJBTlNMQVRFIFRIRSBGT0xMT1dJTkcgTElORSAhIQotcm9sZURpYWdyYW1feVNwYWNpbmc9MzAKLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgRU5EIE5PIFRSQU5TTEFUSU9OCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi11bmtub3duX3RleHQ9VW5rbm93bgotCi0jIEVycm9yIFJlYXNvbnMKLWVtcHR5TGlicmFyeVBhdGhFcnJvcl9yZWFzb249VGhlIG1ldGhvZCBsaWJyYXJ5IHBhdGggaXMgZW1wdHkuCi1taXNzaW5nTGlicmFyeUZpbGVFcnJvcl9yZWFzb249VGhlIG1ldGhvZCBsaWJyYXJ5IG1vZGVsIGZpbGUgaXMgbWlzc2luZy4KLXVucmVzb2x2ZWRQcm94eUVycm9yX3JlYXNvbj1UaGUgc2VsZWN0ZWQgbWV0aG9kIGxpYnJhcnkgY29udGFpbnMgdW5yZXNvbHZlZCBlbGVtZW50IHJlZmVyZW5jZXMuIFRoaXMgaXMgdXN1YWxseSBjYXVzZWQgYnkgbWlzc2luZyBvciBkaXNwbGFjZWQgWE1JIGZpbGVzIGluIHRoZSBsaWJyYXJ5IGZvbGRlci5cblxuQ2xvc2UgdGhpcyBkaWFsb2cgYW5kIGJyaW5nIHVwIHRoZSBQcm9ibGVtcyB2aWV3IHRvIGhlbHAgaWRlbnRpZnkgdGhlIHVucmVzb2x2ZWQgcmVmZXJlbmNlcy4gVG8gYXZvaWQgY29ycnVwdGluZyB0aGUgbGlicmFyeSwgaXQgaXMgaGlnaGx5IHJlY29tbWVuZGVkIHRoYXQgeW91IHJlc29sdmUgdGhlc2UgcmVmZXJlbmNlcyBmaXJzdCBiZWZvcmUgYWRkaW5nIG1vcmUgY2hhbmdlcyB0byB0aGUgbGlicmFyeS4KLQotIyBXYXJuaW5nIE1lc3NhZ2VzCi1jb25maWdDbG9zdXJlV2FybmluZ19tc2cxPUlVUEwwMDA3VzogT25lIG9yIG1vcmUgY2hpbGQgZWxlbWVudHMgY29udGFpbiBtaXNzaW5nIHJlZmVyZW5jZXMKLWNvbmZpZ0Nsb3N1cmVXYXJuaW5nX21zZzI9SVVQTDAwMDhXOiBUaGlzIGVsZW1lbnQgc2hvdWxkIGJlIHNlbGVjdGVkIHRvIHJlc29sdmUgb25lIG9yIG1vcmUgbWlzc2luZyByZWZlcmVuY2VzCi1jb25maWdDbG9zdXJlV2FybmluZ19tc2czPUlVUEwwMDA5VzogVGhpcyBlbGVtZW50IHJlZmVyZW5jZXMgb25lIG9yIG1vcmUgZWxlbWVudHMgaW4gYW4gdW5zZWxlY3RlZCBwYWNrYWdlCi0KLUVsZW1lbnRFcnJvcl9taXNzaW5nX2VsZW1lbnQ9Jyd7MH0nJyByZWZlcmVuY2VzIG1pc3NpbmcgZWxlbWVudCAnJ3sxfScnCi1FbGVtZW50RXJyb3JfY29udHJpYnV0b3JfbWlzc2luZ19iYXNlPScnezB9JycgY29udHJpYnV0ZXMgdG8gbWlzc2luZyBiYXNlIGVsZW1lbnQgJyd7MX0nJwotRWxlbWVudEVycm9yX2V4dGVuZGVyX21pc3NpbmdfYmFzZT0nJ3swfScnIGV4dGVuZHMgbWlzc2luZyBiYXNlIGVsZW1lbnQgJyd7MX0nJwotRWxlbWVudEVycm9yX3JlcGxhY2VyX21pc3NpbmdfYmFzZT0nJ3swfScnIHJlcGxhY2VzIG1pc3NpbmcgYmFzZSBlbGVtZW50ICcnezF9JycKLUVsZW1lbnRFcnJvcl9taXNzaW5nX3ByaW1hcnlfcGVyZm9ybWVyPScnezB9JycgcmVmZXJlbmNlcyBtaXNzaW5nIHByaW1hcnkgcGVyZm9ybWVyICcnezF9JycKLUVsZW1lbnRFcnJvcl9taXNzaW5nX21hbmRhdG9yeV9pbnB1dD0nJ3swfScnIHJlZmVyZW5jZXMgbWlzc2luZyBtYW5kYXRvcnkgaW5wdXQgJyd7MX0nJwotRWxlbWVudEVycm9yX21pc3Npbmdfb3V0cHV0PScnezB9JycgcmVmZXJlbmNlcyBtaXNzaW5nIG91dHB1dCAnJ3sxfScnCi1FbGVtZW50RXJyb3JfbWlzc2luZ19yZXNwb25zaWJsZV9mb3Jfd29ya1Byb2R1Y3Q9Jyd7MH0nJyByZWZlcmVuY2VzIG1pc3NpbmcgcmVzcG9uc2libGUgZm9yIHdvcmsgcHJvZHVjdCAnJ3sxfScnCi1FbGVtZW50RXJyb3JfaGF2aW5nX211bHRpcGxlX3JlcGxhY2Vycz0nJ3swfScnIGhhcyBtdWx0aXBsZSByZXBsYWNlcnM6ICcnezF9JycKLQotIyBFcnJvciBNZXNzYWdlcwotbG9hZFJlc291cmNlc0Vycm9yX21zZz1JVVBMMDAwMEU6IFRoZSBtZXRob2QgbGlicmFyeSBoYXMgYmVlbiBsb2FkZWQgYnV0IHNvbWUgZXJyb3JzIGhhdmUgYmVlbiBkZXRlY3RlZC4KLXVuc3VwcG9ydGVkR3VpZGFuY2VUeXBlRXJyb3JfbXNnPUlVUEwwMDAxRTogVGhpcyBndWlkYW5jZSBjYW5ub3QgYmUgY29udmVydGVkIHRvIGFub3RoZXIgdHlwZS4KLWNvbnZlcnRHdWlkYW5jZUVycm9yX21zZz1JVVBMMDAwMkU6IFRoaXMgZ3VpZGFuY2UgY2Fubm90IGJlIGNvbnZlcnRlZCB0byB0aGUgdGFyZ2V0IHR5cGUuCi1zYXZlQ29udmVydGVkR3VpZGFuY2VFcnJvcl9tc2c9SVVQTDAwMDNFOiBUaGUgY29udmVydGVkIGd1aWRhbmNlICcnezB9JycgY2Fubm90IGJlIHNhdmVkLgotCi0jIENvbnZlcnQgYWN0aXZpdHkKLWNvbnZlcnRBY3Rpdml0eUVycm9yX3RpdGxlPUNvbnZlcnQgQWN0aXZpdHkgVHlwZSBFcnJvcgotY29udmVydEFjdGl2aXR5RXJyb3JfbXNnPUlVUEwwMDA2RTogVGhpcyBhY3Rpdml0eSBjYW5ub3QgYmUgY29udmVydGVkIHRvIHRoZSB0YXJnZXQgdHlwZS4KLXNhdmVDb252ZXJ0ZWRBY3Rpdml0eUVycm9yX21zZz1JVVBMMDAwN0U6IFRoZSBjb252ZXJ0ZWQgYWN0aXZpdHkgJyd7MH0nJyBjYW5ub3QgYmUgc2F2ZWQuCi0KLSMgRXJyb3IgUmVhc29ucwotZXJyb3JfcmVhc29uPUlVUEwwMDA0RTogQW4gZXJyb3IgaGFzIG9jY3VycmVkLiBDbGljayBPSyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLXVuc3VwcG9ydGVkR3VpZGFuY2VUeXBlRXJyb3JfcmVhc29uPVRoZXJlIGlzIG5vIGNvbXBhdGlibGUgZ3VpZGFuY2UgdHlwZSBmb3IgezB9LgotaW52YWxpZExpYnJhcnlQYXRoRXJyb3JfcmVhc29uPUludmFsaWQgbGlicmFyeSBwYXRoLiBUaGUgLnByb2plY3QgZmlsZSBjb3VsZCBub3QgYmUgY3JlYXRlZC4KLWNvdWxkTm90TG9ja0xpYnJhcnlfcmVhc29uPUNvdWxkIG5vdCBsb2NrIGxpYnJhcnkuCi0KLSMgUHJvZ3Jlc3MgTWVzc2FnZXMKLWNvcHlpbmdBdHRhY2htZW50c1Rhc2tfbmFtZT1Db3B5aW5nIGF0dGFjaG1lbnRzLi4uCi0KLSMgQ29udmVydCBHdWlkYW5jZSBEaWFsb2cKLWNvbnZlcnRHdWlkYW5jZURpYWxvZ190aXRsZT1Db252ZXJ0IEd1aWRhbmNlIFR5cGUKLWNvbnZlcnRHdWlkYW5jZURpYWxvZ190ZXh0PVNlbGVjdCB0aGUgdGFyZ2V0IGd1aWRhbmNlIHR5cGUuCi0KLSMgR3VpZGFuY2UgdHlwZSBuYW1lcyBmb3IgQ29udmVydCBHdWlkYW5jZSBEaWFsb2cKLWNoZWNrbGlzdF90ZXh0PUNoZWNrbGlzdAotY29uY2VwdF90ZXh0PUNvbmNlcHQKLWV4YW1wbGVfdGV4dD1FeGFtcGxlCi1ndWlkZWxpbmVfdGV4dD1HdWlkZWxpbmUKLWVzdGltYXRlX3RleHQ9RXN0aW1hdGUKLWVzdGltYXRpbmdNZXRyaWNfdGV4dD1Fc3RpbWF0aW5nIE1ldHJpYwotZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zX3RleHQ9RXN0aW1hdGlvbiBDb25zaWRlcmF0aW9ucwotcmVwb3J0X3RleHQ9UmVwb3J0Ci10ZW1wbGF0ZV90ZXh0PVRlbXBsYXRlCi1zdXBwb3J0aW5nTWF0ZXJpYWxfdGV4dD1TdXBwb3J0aW5nIE1hdGVyaWFsCi10b29sTWVudG9yX3RleHQ9VG9vbCBNZW50b3IKLXdoaXRlcGFwZXJfdGV4dD1XaGl0ZXBhcGVyCi10ZXJtRGVmaW5pdGlvbl90ZXh0PVRlcm0gRGVmaW5pdGlvbgotcHJhY3RpY2VfdGV4dD1QcmFjdGljZQotcmV1c2FibGVBc3NldF90ZXh0PVJldXNhYmxlIEFzc2V0Ci0KLSNhY3Rpdml0eSBicmVha2Rvd24gaW5mbyBzdHJpbmdzCi1BY3Rpdml0eUxheW91dF9wcmltYXJ5VGFza3NfdGV4dD1QZXJmb3JtcyBhcyBPd25lcgotQWN0aXZpdHlMYXlvdXRfYWRkaXRpb25hbFRhc2tzX3RleHQ9UGVyZm9ybXMgYXMgQWRkaXRpb25hbAotCi0jIENvbnZlcnQgR3VpZGFuY2UgRXJyb3IgTWVzc2FnZXMKLWNvbnZlcnRHdWlkYW5jZUVycm9yX3RpdGxlPUNvbnZlcnQgR3VpZGFuY2UgVHlwZSBFcnJvcgotCi0jIExvYWQgUmVzb3VyY2VzIEVycm9yIERpYWxvZwotbG9hZFJlc291cmNlc0Vycm9yX3RpdGxlPU9wZW4gTWV0aG9kIExpYnJhcnkgRXJyb3IKLWxvYWRSZXNvdXJjZXNFcnJvcl9yZWFzb249U29tZSBsaWJyYXJ5IHJlc291cmNlcyBjb3VsZCBub3QgYmUgbG9hZGVkLlxuXG5DbGljayBEZXRhaWxzIHRvIHJldmlldyB0aGUgZXJyb3JzIGFuZCByZXNvbHZlIHRoZW0gYmVmb3JlIGFkZGluZyBtb3JlIGNoYW5nZXMgdG8gdGhlIGxpYnJhcnkuCi0KLSMgUm9sZSBEaWFncmFtcwotcm9sZURpYWdyYW1QZXJmb3Jtc190ZXh0PXBlcmZvcm1zCi1yb2xlRGlhZ3JhbVJlc3BvbnNpYmxlRm9yX3RleHQ9cmVzcG9uc2libGUgZm9yCi0KLURlZmF1bHRDb250ZW50VmFsaWRhdG9yX01TRzA9UmVmZXJlbmNlZCBlbGVtZW50OiB7MH0KLURlZmF1bHRDb250ZW50VmFsaWRhdG9yX01TRzE9SW5mbzogezB9Ci1EZWZhdWx0Q29udGVudFZhbGlkYXRvcl9NU0c0PVdhcm5pbmc6IHswfQotRGVmYXVsdENvbnRlbnRWYWxpZGF0b3JfTVNHNz1FcnJvcjogezB9Ci1EZWZhdWx0Q29udGVudFZhbGlkYXRvcl9NU0cxMD1NaXNzaW5nIHJlZmVyZW5jZWQgZWxlbWVudCB7MH0KLURlZmF1bHRDb250ZW50VmFsaWRhdG9yX01TRzExPVVuYWJsZSB0byBmaW5kIGVsZW1lbnQgZm9yIGd1aWQgezB9Ci1EZWZhdWx0Q29udGVudFZhbGlkYXRvcl9NU0cxMj1GaWxlICcnezB9JycgcmVmZXJlbmNlcyBtaXNzaW5nIHJlc291cmNlICcnezF9JycKLURlZmF1bHRDb250ZW50VmFsaWRhdG9yX01TRzE1PW1pc3NpbmcgcmVzb3VyY2UgZmlsZSAnJ3swfScnCi1EZWZhdWx0Q29udGVudFZhbGlkYXRvcl9NU0cxNz1VbmFibGUgdG8gY29ubmVjdCB0byBVUkwgJyd7MH0nJwotRGVmYXVsdENvbnRlbnRWYWxpZGF0b3JfTVNHMTk9VW5hYmxlIHRvIGNvbm5lY3QgdG8gVVJMICcnezB9Jyc6IHsxfQotSW1wb3J0RXhwb3J0VXRpbF9NU0c4PUNvdWxkIG5vdCBmaW5kIGZpbGUgJyd7MH0nJy4KLUltcG9ydEV4cG9ydFV0aWxfTVNHOT1Db3VsZCBub3QgY3JlYXRlIHRlbXBvcmFyeSBkaXJlY3RvcnkgJyd7MH0nJy4KLXVua25vd25HdWlkYW5jZV90ZXh0PVVua25vd24KLQotQ29weUF0dGFjaG1lbnRzVG9OZXdMb2NhdGlvbl9sb2dfbm9Db250ZW50UGF0aD1Db3B5QXR0YWNobWVudHNUb05ld0xvY2F0aW9uLkhhbmRsZUF0dGFjaG1lbnRzUGx1Z2luOiBubyBjb250ZW50UGF0aCBmb3IgezB9Ci1MaWJyYXJ5TW9kaWZpY2F0aW9uSGVscGVyX2Nhbm5vdFVwZGF0ZT1JVVBMMDAwNlc6IENhbm5vdCB1cGRhdGUgezB9IHsxfQotd2FybmluZ0RsZ190aXRsZT1XYXJuaW5nCi1lcnJvckRsZ190aXRsZT1FcnJvcgotZXJyb3JEbGdfc2F2ZUVycm9yPUlVUEwwMDA1RTogRXJyb3Igc2F2aW5nIGNoYW5nZXMgdG8gZmlsZSAnJ3swfScnCi0KLSMgYWN0aXZpdHkgZGlhZ3JhbSBuYW1lcwotYWN0aXZpdHlEaWFncmFtTmFtZT1BY3Rpdml0eSBkaWFncmFtOiB7MH0KLWFjdGl2aXR5RGV0YWlsRGlhZ3JhbU5hbWU9QWN0aXZpdHkgZGV0YWlsIGRpYWdyYW06IHswfQotd3BEZXBlbmRlbmN5RGlhZ3JhbU5hbWU9V29yayBwcm9kdWN0IGRlcGVuZGVuY3kgZGlhZ3JhbTogezB9Ci0KLSMgbG9jYWxpemUgdGhlIHZhbHVlIGJhc2VkIG9uIGxvY2FsZS4gIGZvciBleGFtcGxlLCAKLSMgZm9yIEVuZ2xpc2gsIHRoZSB2YWx1ZSBpcyAiLiAiCi0jY29sb25fd2l0aF9zcGFjZT06IAotIyBmb3IgRnJlbmNoLCB0aGUgdmFsdWUgaXMgIiAuICIsIHlvdSBuZWVkIHRvIHVzZSBhIFwgdG8gcHJlc2VydmUgdGhlIGxlYWRpbmcgc3BhY2UKLSNjb2xvbl93aXRoX3NwYWNlPVwgOiAKLSMgZm9yIENoaW5lc2UsIHRoZSBjb2xvbiBzaG91bGQgYmUgZG91YmxlIGJ5dGVzCi0jIERvbid0IHRyaW0gdGhlIHNwYWNlcyBhZnRlciB0aGUgY29sb24uCi1jb2xvbl93aXRoX3NwYWNlPTogCi0KLW9sZFRvb2xWZXJzaW9uX2Vycl9tc2c9VGhpcyB2ZXJzaW9uIG9mIHswfSBpcyBub3QgY29tcGF0aWJsZSB3aXRoIHlvdXIgbGlicmFyeSBmaWxlICcnezJ9JycuIFlvdSBtdXN0IHVwZ3JhZGUgezB9IHRvIHZlcnNpb24gezF9IG9yIGhpZ2hlciBpbiBvcmRlciB0byBvcGVuIGl0LgotdG9vbFZlcnNpb25NaXNtYXRjaF9lcnJfbXNnPVRoaXMgdmVyc2lvbiBvZiB7MH0gaXMgbm90IGNvbXBhdGlibGUgd2l0aCB5b3VyIGxpYnJhcnkgZmlsZSAnJ3syfScnLiBZb3UgbXVzdCB1cGdyYWRlIHswfSB0byBhIGhpZ2hlciB2ZXJzaW9uIGluIG9yZGVyIHRvIG9wZW4gaXQuCi1saWJVcGdyYWRlUmVxdWlyZWRfZXJyX21zZz1UaGUgc3BlY2lmaWVkIGxpYnJhcnkgbmVlZHMgdG8gYmUgdXBncmFkZWQgdG8gdGhlIG5ldyBsaWJyYXJ5IHN0cnVjdHVyZS4gT3BlbiB0aGUgbGlicmFyeSB0byB1cGdyYWRlIGl0IGFuZCB0cnkgYWdhaW4uCi0KLVdvcmtQcm9kdWN0U2xvdF90ZXh0PVdvcmsgUHJvZHVjdCBTbG90Ci0KLWxpYnJhcnlQcm9ibGVtTW9uaXRvcj1MaWJyYXJ5IFByb2JsZW0gTW9uaXRvcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2NvbmZpZ3VyYXRpb24vQWN0aXZpdHlEZWVwQ29weUNvbmZpZ3VyYXRvci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2NvbmZpZ3VyYXRpb24vQWN0aXZpdHlEZWVwQ29weUNvbmZpZ3VyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMWZkMGEzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9jb25maWd1cmF0aW9uL0FjdGl2aXR5RGVlcENvcHlDb25maWd1cmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVmFyaWFiaWxpdHlJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQ7Ci0KLS8qKgotICogQSBjb25maWd1cmF0b3IgdXNlZCBieSBhY3Rpdml0eSBkZWVwIGNvcHkgY29tbWFuZCB0byByZXNvdmxlIGFuZCBkZWVwIGNvcHkgY29udHJpYnV0b3JzIGFuZAotICogcmVwbGFjZXJzIG9mIGFjdGl2aXR5IGluIGEgbWV0b2hkIGNvbmZpZ3VyYXRpb24uCi0gKgotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZpdHlEZWVwQ29weUNvbmZpZ3VyYXRvciBleHRlbmRzIENvbmZpZ3VyYXRpb25GaWx0ZXJ7Ci0KLQkKLQkvKioKLQkgKiBjb25zdHJ1Y3RvcgotCSAqIEBwYXJhbSBtZXRob2RDb25maWcgYSA8Y29kZT5NZXRob2RDb25maWd1cmF0aW9uPC9jb2RlPgotCSAqIEBwYXJhbSB2aWV3ZXIgYSA8Y29kZT5WaWV3ZXI8L2NvZGU+Ci0JICovCi0JcHVibGljIEFjdGl2aXR5RGVlcENvcHlDb25maWd1cmF0b3IoTWV0aG9kQ29uZmlndXJhdGlvbiBtZXRob2RDb25maWcpIHsKLQkJc3VwZXIobWV0aG9kQ29uZmlnKTsKLQl9Ci0JCi0JCi0JLyoqCi0JICogQ29uc3RydWN0cyB3aXRoIG51bGwgbWV0aG9kQ29uZmlnIHdoaWNoIGNvdWxkIGJlIHNldCBsYXRlci4KLQkgKi8KLQlwdWJsaWMgQWN0aXZpdHlEZWVwQ29weUNvbmZpZ3VyYXRvcigpIHsKLQkJdGhpcyhudWxsKTsKLQl9Ci0JCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgVmFyaWFiaWxpdHlJbmZvIGdldFZhcmlhYmlsaXR5SW5mbyhWYXJpYWJpbGl0eUVsZW1lbnQgdmUpIHsKLQotCQkvLyBjYWxjdWxhdGUgdGhlIGVsZW1lbnQgZmlyc3QKLQkJRWxlbWVudFJlYWxpemVyIHJlYWxpemVyID0gbmV3IERlZmF1bHRFbGVtZW50UmVhbGl6ZXIobWV0aG9kQ29uZmlnLCBmYWxzZSwgdHJ1ZSl7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBib29sZWFuIGNhblNob3coTWV0aG9kRWxlbWVudCBlbGVtZW50KSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9CQkJCi0JCX07Ci0JCXJldHVybiBnZXRWYXJpYWJpbGl0eUluZm8odmUsIHJlYWxpemVyKTsKLQl9Ci0JCi0JLyoqCi0JICogT3ZlcnJpZGVzIHRoZSBzdXBlciBtZXRob2QgZm9yIG5vdCByZXNvbHZpbmcgdGhlIGJhc2UgdG8gaW5jbHVkZSBhZGRpdGlvbmFsIGNvbnRyaWJ1dG9ycy4gCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgcmVzb2x2ZUVsZW1lbnRWYXJpYWJpbGl0eUxpc3QoVmFyaWFiaWxpdHlFbGVtZW50IGVsZW1lbnQsCi0JCQlWYXJpYWJpbGl0eUluZm8gaW5mbywgYm9vbGVhbiBpbmNsdWRlQmFzZSwgRWxlbWVudFJlYWxpemVyIHJlYWxpemVyKSB7Ci0KLQkJaWYgKG1ldGhvZENvbmZpZyA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0JCQotCQkvL3Jlc29sdmUgdG8gaW5jbHVkZSBjb250cmlidXRvcnMKLQkJcmVzb2x2ZUVsZW1lbnRDb250cmlidXRvcnMoZWxlbWVudCxpbmZvLHJlYWxpemVyKTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvY29uZmlndXJhdGlvbi9BdHRyaWJ1dGVGZWF0dXJlVmFsdWUuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9jb25maWd1cmF0aW9uL0F0dHJpYnV0ZUZlYXR1cmVWYWx1ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNTBlZGFjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9jb25maWd1cmF0aW9uL0F0dHJpYnV0ZUZlYXR1cmVWYWx1ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZEhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuU3RyVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLkxpYnJhcnlVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuUmVzb3VyY2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuU2VjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQ7Ci0KLS8qKgotICogZm9yIGEgZ2l2ZW4gbWV0aG9kIGVsZW1lbnQgYW5kIGF0dHJpYnV0ZSBmZWF0dXJlLCAKLSAqIHJlYWxpemVkIHRoZSBmZWF0dXJlIHZhbHVlIGJhc2VkIG9uIHRoZSBnaXZlbiByZWFsaXplci4KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBBdHRyaWJ1dGVGZWF0dXJlVmFsdWUgZXh0ZW5kcyBGZWF0dXJlVmFsdWUgewotCi0JLy8gbWFwIG9mIGVsZW1lbnQgYW5kIHRoZSB2YWx1ZQotCUxpbmtlZEhhc2hNYXAgdmFsdWVNYXAgPSBuZXcgTGlua2VkSGFzaE1hcCgpOwotCi0JLyoqCi0JICogY29uc3RyY3RvcgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50IE1ldGhvZEVsZW1lbnQgdGhlIGVsZW1lbnQgd2hvc2UgZmVhdHVyZSB2YWx1ZSBpcyB0byBiZSByZWFsaXplZAotCSAqIEBwYXJhbSBvd25lckVsZW1lbnQgTWV0aG9kRWxlbWVudCB0aGUgb3duZXIgZWxlbWVudCBvZiB0aGlzIGVsZW1lbnQsIHRoaXMgaXMgbmVlZGVkIGZvciBoYW5kbGUgdGhlIHNwYWNpYWwgY2FzZXMgCi0JICogd2hlcmUgdGhlIGVsZW1lbnQncyBlQ29udGFpbmVyIGlzIG5vdCBwcm9wZXJseSBzZXQgeWV0LiBGb3IgZXhhbXBsZSwgd2hlbiBhIG5ldyBDb250ZW50RGVzY3JpdGlvbiBvYmplY3QgaXMgY3JlYXRlZCwgCi0JICogaXQncyBvd25lciBpcyBub3Qgc2V0IHVudGlsIHRoZSBjb250ZW50IGlzIHNhdmVkLgotCSAqIEBwYXJhbSBmZWF0dXJlIE9iamVjdCBUaGUgZmVhdHVlIG9yIG9wcG9zaXRlIGZlYXR1cmUgd2hvc2UgdmFsdWUgaXMgdG8gYmUgcmVhbGl6ZWQKLQkgKiBAcGFyYW0gcmVhbGl6ZXIgRWxlbWVudFJlYWxpemVyIHRoZSByZWFsaXplciB1c2VkIHRvIHJlYWxpemUgdGhlIGZlYXR1cmUgdmFsdWUuCi0JICovCi0JcHVibGljIEF0dHJpYnV0ZUZlYXR1cmVWYWx1ZShNZXRob2RFbGVtZW50IGVsZW1lbnQsIE1ldGhvZEVsZW1lbnQgb3duZXJFbGVtZW50LCBPYmplY3QgZmVhdHVyZSwgRWxlbWVudFJlYWxpemVyIHJlYWxpemVyKSB7Ci0JCXN1cGVyKGVsZW1lbnQsIG93bmVyRWxlbWVudCwgZmVhdHVyZSwgcmVhbGl6ZXIpOwotCX0KLQkKLQkvKioKLQkgKiBtZXRob2QgdG8gYWRkIGEgZmVhdHVyZSB2YWx1ZSB0byB0aGUgdmFsdWUgbGlzdC4gVGhpcyB2YWx1ZSBjb3VsZCBiZSB0aGUgZWxlbWVudCdzIG93biBmZWF0dXJlIHZhbHVlLCAKLQkgKiBvciB0aGUgZmVhdHVyZSB2YWx1ZSBvZiBhbm90aGVyIHZhcmlhYmlsaXR5IGVsZW1lbnQsIHN1Y2ggYXMgYSBjb250cmlidXRvci4gCi0JICogU28gdGhlIG93bmVyIGlzIHBhc3NlZCBpbiB0byBpbmRpY2F0ZSB0aGUgb3JpZ2luYXRpb24gb2YgdGhlIHZhbHVlLgotCSAqIAotCSAqIEBwYXJhbSBvd25lciBWYXJpYWJpbGl0eUVsZW1lbnQgdGhlIGVsZW1lbnQgdGhhdCBwcm92aWRlIHRoZSB2YWx1ZSBkdWUgdG8gdmFyaWFiaWxpdHkgcmVhbGl6YXRpb24KLQkgKiBAcGFyYW0gdmFsdWUgT2JqZWN0IHRoZSBmZWF0dXJlIHZhbHVlIGZyb20gdGhlIG93bmVyIGVsZW1lbnQKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGQoVmFyaWFiaWxpdHlFbGVtZW50IG93bmVyLCBPYmplY3QgdmFsdWUpIHsKLQkJaWYgKCAodmFsdWUgPT0gbnVsbCkgfHwgKHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKQotCQkJCSYmIHZhbHVlLnRvU3RyaW5nKCkudHJpbSgpLmxlbmd0aCgpID09IDApIHsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJLy8gbm90ZTogb3duZXIgY2FuIGJlIG51bGwsIHRoaXMgaXMgZmluZQotCQl2YWx1ZU1hcC5wdXQob3duZXIsIHZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiByZXR1cm4gdGhlIHNpemUgb2YgdGhlIGZlYXR1cmUgdmFsdWUgbGlzdC4KLQkgKiBAcmV0dXJuIGludAotCSAqLwotCXB1YmxpYyBpbnQgc2l6ZSgpIHsKLQkJcmV0dXJuIHZhbHVlTWFwLnNpemUoKTsKLQl9Ci0JCi0JLyoqCi0JICogZ2V0IHRoZSByZWFsaXplZCBmZWF0dXJlIHZhbHVlLgotCSAqIEByZXR1cm4gT2JqZWN0IHRoZSByZWFsaXplZCBmZWF0dXJlIHZhbHVlLgotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0VmFsdWUoKSB7Ci0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSB2YWx1ZU1hcC5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCU1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIGl0Lm5leHQoKTsKLQkJCU1ldGhvZEVsZW1lbnQgZSA9IChNZXRob2RFbGVtZW50KWVudHJ5LmdldEtleSgpOwotCQkJT2JqZWN0IHYgPSBlbnRyeS5nZXRWYWx1ZSgpOwotCQkJCi0JCQlpZiAodiA9PSBudWxsIHx8IHYudG9TdHJpbmcoKS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0KLQkJCWlmICggaXNFeHRlbmRSZXBsYWNlRW5hYmxlZCgpICkgewotCQkJCVN0cmluZyBzdHIgPSBTdHJVdGlsLmdldFBsYWluVGV4dCh2LnRvU3RyaW5nKCkpLnRyaW0oKTsKLQkJCQlpZiAoIGlzQmxhbmtJbmRpY2F0b3Ioc3RyKSApIHsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJfQotCQkJCi0JCQlpZiAoZmVhdHVyZSA9PSBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkuZ2V0TWV0aG9kRWxlbWVudF9QcmVzZW50YXRpb25OYW1lKCkpIHsKLQkJCQlpZiAoc2l6ZSgpID4gMSkgewotCQkJCQkvLyBzb21ldGhpbmcgd3JvbmcgaGVyZSwgd2lsbCBub3QgaGFwcGVuIGJ1dCBwdXQgdGVzdAotCQkJCQkvLyBtZXNzYWdlIGhlcmUganVzdCBpbiBjYXNlCi0JCQkJCWlmIChkZWJ1ZykgewotCQkJCQkJU3lzdGVtLm91dAotCQkJCQkJCQkucHJpbnRsbigiQXR0cmlidXRlRmVhdHVyZVZhbHVlOiBQcmVzZW50YXRpb24gTmFtZSBnZXQgbW9yZSB0aGVuIG9uZSBlbnRyeTogIiArIExpYnJhcnlVdGlsLmdldFR5cGVOYW1lKGVsZW1lbnQpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJfQotCQkJCXJldHVybiB2OwotCQkJfQotCi0JCQlpZiAoYnVmZmVyLmxlbmd0aCgpID4gMCkgewotCQkJCWJ1ZmZlci5hcHBlbmQoQ29uZmlndXJhdGlvbkhlbHBlci5BVFRSSUJVVEVfVkFMVUVfU0VQRVJBVE9SKTsgCi0JCQl9Ci0KLQkJCWlmICgoZSA9PSBlbGVtZW50KSAmJiAhKGUgaW5zdGFuY2VvZiBTZWN0aW9uKSB8fCBlID09IG51bGwgKSB7Ci0JCQkJYnVmZmVyLmFwcGVuZCh2KTsKLQkJCX0gZWxzZSB7Ci0JCQkJU3RyaW5nIGNvbnRlbnRQYXRoID0gUmVzb3VyY2VIZWxwZXIKLQkJCQkJCS5nZXRFbGVtZW50UGF0aCgoZSBpbnN0YW5jZW9mIENvbnRlbnREZXNjcmlwdGlvbikgCi0JCQkJCQkJCT8gKE1ldGhvZEVsZW1lbnQpIGUuZUNvbnRhaW5lcigpCi0JCQkJCQkJCTogZSk7Ci0KLQkJCQlTdHJpbmcgYmFja1BhdGggPSBSZXNvdXJjZUhlbHBlcgotCQkJCQkJLmdldEJhY2tQYXRoKChlbGVtZW50IGluc3RhbmNlb2YgQ29udGVudERlc2NyaXB0aW9uKSAKLQkJCQkJCQkJPyAoKG93bmVyRWxlbWVudCAhPSBudWxsKSA/IG93bmVyRWxlbWVudAotCQkJCQkJCQk6IChNZXRob2RFbGVtZW50KSBlbGVtZW50LmVDb250YWluZXIoKSkKLQkJCQkJCQkJOiBlbGVtZW50KTsKLQotCQkJCWJ1ZmZlci5hcHBlbmQoUmVzb3VyY2VIZWxwZXIuZml4Q29udGVudFVybFBhdGgodi50b1N0cmluZygpLAotCQkJCQkJY29udGVudFBhdGgsIGJhY2tQYXRoKSk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JfQotCi0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9jb25maWd1cmF0aW9uL0NvbmZpZ0RhdGFCYXNlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvY29uZmlndXJhdGlvbi9Db25maWdEYXRhQmFzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTg5NmJhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9jb25maWd1cmF0aW9uL0NvbmZpZ0RhdGFCYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuSUxpYnJhcnlNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5ldmVudHMuSUxpYnJhcnlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRDYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotCi0vKioKLSAqICBCYXNlIGNsYXNzIG1hbmFnaW5nIGNvbmZpZ3VyYXRpb24gZGF0YQotICogIEN1cnJlbnQgc3ViIGNsYXNzOiBTdXBwcG9ydGluZ0VsZW1lbnREYXRhCi0gKiAgVG8gZG86IHJlZmFjdG9yIENvbmZpZ3VyYXRpb25EYXRhIHRvIGJlIGEgc3ViIGNsYXNzIG9mIGl0IHRvby4KLSAqIAotICogQGF1dGhvciBXZWlwaW5nIEx1IC0gTWFyIDI0LCAyMDA4Ci0gKiBAc2luY2UgMS41Ci0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBDb25maWdEYXRhQmFzZSB7Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gbG9jYWxEZWJ1ZyA9IGZhbHNlOwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gcHJvZmlsaW5nID0gZmFsc2U7Ci0JCi0JcHJpdmF0ZSBNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZzsKLQkKLQlwcml2YXRlIGJvb2xlYW4gbmVlZFVwZGF0ZUNoYW5nZXMgPSB0cnVlOwotCXByaXZhdGUgSUxpYnJhcnlNYW5hZ2VyIGxpYnJhcnlNYW5hZ2VyOyAKLQlwcml2YXRlIEFkYXB0ZXIgY29uZmlnTGlzdGVuZXI7Ci0JcHJpdmF0ZSBJTGlicmFyeUNoYW5nZUxpc3RlbmVyIGxpYkxpc3RlbmVyOwotCXByaXZhdGUgYm9vbGVhbiBlbmFibGVVcGRhdGUgPSB0cnVlOwotCXByaXZhdGUgYm9vbGVhbiB1cGRhdGluZ0NoYW5nZXMgPSBmYWxzZTsJCQotCQotCXB1YmxpYyBDb25maWdEYXRhQmFzZShNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZykgewotCQl0aGlzLmNvbmZpZyA9IGNvbmZpZzsKLQkJCi0JCWNvbmZpZ0xpc3RlbmVyID0gbmV3IEFkYXB0ZXJJbXBsKCkgewotCQkJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbXNnKSB7Ci0JCQkJaWYgKGlzTmVlZFVwZGF0ZUNoYW5nZXMoKSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCWludCB0eXBlID0gbXNnLmdldEV2ZW50VHlwZSgpOwotCQkJCWlmICgJCXR5cGUgPT0gTm90aWZpY2F0aW9uLkFERAotCQkJCQkJfHwgCXR5cGUgPT0gTm90aWZpY2F0aW9uLkFERF9NQU5ZCi0JCQkJCQl8fCAJdHlwZSA9PSBOb3RpZmljYXRpb24uUkVNT1ZFCi0JCQkJCQl8fCAgdHlwZSA9PSBOb3RpZmljYXRpb24uUkVNT1ZFX01BTlkpIHsJCQkJCQotCQkJCQlzZXROZWVkVXBkYXRlQ2hhbmdlcyh0cnVlKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JCWNvbmZpZy5lQWRhcHRlcnMoKS5hZGQoY29uZmlnTGlzdGVuZXIpOwotCQkJCQotCQlsaWJMaXN0ZW5lciA9IG5ldyBJTGlicmFyeUNoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgbGlicmFyeUNoYW5nZWQoaW50IG9wdGlvbiwgQ29sbGVjdGlvbiBjaGFuZ2VkSXRlbXMpIHsKLQkJCQlpZiAobG9jYWxEZWJ1ZykgewotCQkJCQkvL1N5c3RlbS5vdXQucHJpbnRsbigiTEQ+IGxpYnJhcnlDaGFuZ2VkLCBvcHRpb246ICIgKyBvcHRpb24gKyAiLCAiICsgY2hhbmdlZEl0ZW1zKTsvLyROT04tTkxTLTEkLy8kTk9OLU5MUy0yJAotCQkJCX0JCQkJCi0JCQkJaGFuZGxlTGlicmFyeUNoYW5nZShvcHRpb24sIGNoYW5nZWRJdGVtcyk7Ci0JCQl9Ci0JCX07Ci0JCQotCQlNZXRob2RMaWJyYXJ5IGxpYnJhcnkgPSBMaWJyYXJ5U2VydmljZVV0aWwuZ2V0TWV0aG9kTGlicmFyeShjb25maWcpOwotCQlsaWJyYXJ5TWFuYWdlciA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0TGlicmFyeU1hbmFnZXIobGlicmFyeSk7Ci0JCWlmKGxpYnJhcnlNYW5hZ2VyICE9IG51bGwpIHsKLQkJCWxpYnJhcnlNYW5hZ2VyLmFkZExpc3RlbmVyKGxpYkxpc3RlbmVyKTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVMaWJyYXJ5Q2hhbmdlKGludCBvcHRpb24sIENvbGxlY3Rpb24gY2hhbmdlZEl0ZW1zKSB7Ci0JCWlmIChpc05lZWRVcGRhdGVDaGFuZ2VzKCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gY2hhbmdlZEl0ZW1zLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBpdGVtID0gaXQubmV4dCgpOwotCQkJaWYgKGl0ZW0gaW5zdGFuY2VvZiBDb250ZW50Q2F0ZWdvcnkpIHsKLQkJCQlzZXROZWVkVXBkYXRlQ2hhbmdlcyh0cnVlKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJY29uZmlnLmVBZGFwdGVycygpLnJlbW92ZShjb25maWdMaXN0ZW5lcik7Ci0JCWxpYnJhcnlNYW5hZ2VyLnJlbW92ZUxpc3RlbmVyKGxpYkxpc3RlbmVyKTsJCQotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzTmVlZFVwZGF0ZUNoYW5nZXMoKSB7Ci0JCXJldHVybiBuZWVkVXBkYXRlQ2hhbmdlczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXROZWVkVXBkYXRlQ2hhbmdlcyhib29sZWFuIG5lZWRVcGRhdGVDaGFuZ2VzKSB7Ci0JCXRoaXMubmVlZFVwZGF0ZUNoYW5nZXMgPSBuZWVkVXBkYXRlQ2hhbmdlczsKLQkJaWYgKGxvY2FsRGVidWcpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTEQ+IHNldE5lZWRVcGRhdGVDaGFuZ2VzOiAiICsgbmVlZFVwZGF0ZUNoYW5nZXMpOwkvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0VuYWJsZVVwZGF0ZSgpIHsKLQkJcmV0dXJuIGVuYWJsZVVwZGF0ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRFbmFibGVVcGRhdGUoYm9vbGVhbiBlbmFibGVVcGRhdGUpIHsKLQkJdGhpcy5lbmFibGVVcGRhdGUgPSBlbmFibGVVcGRhdGU7Ci0JCWlmIChsb2NhbERlYnVnKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxEPiBzZXRFbmFibGVVcGRhdGU6ICIgKyBlbmFibGVVcGRhdGUpOwkvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQlwdWJsaWMgTWV0aG9kQ29uZmlndXJhdGlvbiBnZXRDb25maWcoKSB7Ci0JCXJldHVybiBjb25maWc7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Q29uZmlnKE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0JCXRoaXMuY29uZmlnID0gY29uZmlnOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVDaGFuZ2VzKCkgewotCQlpZiAoISBpc0VuYWJsZVVwZGF0ZSgpKSB7Ci0JCQlyZXR1cm47Ci0JCX0JCQotCQlpZiAoISBpc05lZWRVcGRhdGVDaGFuZ2VzKCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAoaXNVcGRhdGluZ0NoYW5nZXMoKSkgewotCQkJcmV0dXJuOwkJCQotCQl9Ci0JCQotCQlsb25nIHQgPSAwOwotCQlpZiAocHJvZmlsaW5nKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxEPiB1cGRhdGVDaGFuZ2VzXygpIC0+ICIgKyBnZXRUeXBlKCkpOwkvLyROT04tTkxTLTEkCi0JCQl0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCX0KLQkJaWYgKGxvY2FsRGVidWcpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTEQ+IHVwZGF0ZUNoYW5nZXMoKTogIiArIGdldFR5cGUoKSk7CS8vJE5PTi1OTFMtMSQKLQkJfQotCQl1cGRhdGVDaGFuZ2VJbXBsKCk7Ci0JCWlmIChwcm9maWxpbmcpIHsKLQkJCXQgPSAgU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSB0OwotCQkJU3lzdGVtLm91dC5wcmludGxuKCJMRD4gdXBkYXRlQ2hhbmdlc18oKSA8LSB0aW1lOiAiICsgdCArICIsICIgKyBnZXRUeXBlKCkpOwkvLyROT04tTkxTLTEkLy8kTk9OLU5MUy0yJAotCQkJU3lzdGVtLm91dC5wcmludGxuKCIiKTsJCQkJCQkJCQkJLy8kTk9OLU5MUy0xJAotCQl9Ci0JCQotCX0KLQkKLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCB1cGRhdGVDaGFuZ2VJbXBsKCk7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1VwZGF0aW5nQ2hhbmdlcygpIHsKLQkJcmV0dXJuIHVwZGF0aW5nQ2hhbmdlczsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcGRhdGluZ0NoYW5nZXMoYm9vbGVhbiB1cGRhdGluZ0NoYW5nZXMpIHsKLQkJdGhpcy51cGRhdGluZ0NoYW5nZXMgPSB1cGRhdGluZ0NoYW5nZXM7Ci0JCWlmIChsb2NhbERlYnVnKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxEPiBzZXRVcGRhdGluZ0NoYW5nZXM6ICIgKyB1cGRhdGluZ0NoYW5nZXMgKyAiLCAiICsgZ2V0VHlwZSgpKTsvLyROT04tTkxTLTEkCS8vJE5PTi1OTFMtMiQJCQkJCQkJCQkKLQkJfQotCX0KLQkKLQlwcml2YXRlIFN0cmluZyBnZXRUeXBlKCkgewotCQlpZiAodGhpcyBpbnN0YW5jZW9mIFN1cHBvcnRpbmdFbGVtZW50RGF0YSkgewotCQkJcmV0dXJuICJTdXBwb3J0aW5nRWxlbWVudERhdGEiOyAvLyROT04tTkxTLTEkCi0JCX0gCi0KLQkJcmV0dXJuICIiOwkvLyROT04tTkxTLTEkCi0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvY29uZmlndXJhdGlvbi9Db25maWd1cmF0aW9uQXBwbGljYXRvci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2NvbmZpZ3VyYXRpb24vQ29uZmlndXJhdGlvbkFwcGxpY2F0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDMwYmE5Yi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvY29uZmlndXJhdGlvbi9Db25maWd1cmF0aW9uQXBwbGljYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYXRpb25BcHBsaWNhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Qcm9jZXNzVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmliYWJsZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS51dGlsLk9wcG9zaXRlRmVhdHVyZTsKLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMQotICovCi1wdWJsaWMgY2xhc3MgQ29uZmlndXJhdGlvbkFwcGxpY2F0b3IgaW1wbGVtZW50cyBJQ29uZmlndXJhdGlvbkFwcGxpY2F0b3IgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgSUNvbmZpZ3VyYXRpb25BcHBsaWNhdG9yIElOU1RBTkNFID0gbmV3IENvbmZpZ3VyYXRpb25BcHBsaWNhdG9yKCk7Ci0KLQlwdWJsaWMgT2JqZWN0IGdldEF0dHJpYnV0ZShWYXJpYWJpbGl0eUVsZW1lbnQgZSwgRUF0dHJpYnV0ZSBhdHRyaWJ1dGUsCi0JCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZykgewotCQkvLyBzcGVjaWFsIGhhbmRsaW5nIGZvciBwcmVzZW50YXRpb24gbmFtZSBvZiBicmVha2Rvd24gZWxlbWVudAotCQkvLwotCQlpZihhdHRyaWJ1dGUgPT0gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWV0aG9kRWxlbWVudF9QcmVzZW50YXRpb25OYW1lKCkpIHsKLQkJCWlmKGUgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50KSB7Ci0JCQkJcmV0dXJuIFByb2Nlc3NVdGlsLmdldFByZXNlbnRhdGlvbk5hbWUoKEJyZWFrZG93bkVsZW1lbnQpIGUpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJcmV0dXJuIENvbmZpZ3VyYXRpb25IZWxwZXIuZ2V0UHJlc2VudGF0aW9uTmFtZShlLCBjb25maWcpOwotCQkJfQotCQl9Ci0JCXJldHVybiBDb25maWd1cmF0aW9uSGVscGVyLmNhbGNBdHRyaWJ1dGVGZWF0dXJlVmFsdWUoZSwgYXR0cmlidXRlLAotCQkJCWNvbmZpZyk7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRSZWZlcmVuY2UoVmFyaWFiaWxpdHlFbGVtZW50IGUsIEVSZWZlcmVuY2UgcmVmLAotCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLQkJaWYgKENvbmZpZ3VyYXRpb25IZWxwZXIuaXMwbkZlYXR1cmUocmVmKSkgewotCQkJcmV0dXJuIENvbmZpZ3VyYXRpb25IZWxwZXIuY2FsYzBuRmVhdHVyZVZhbHVlKGUsIHJlZiwKLQkJCQkJRGVmYXVsdEVsZW1lbnRSZWFsaXplci5uZXdFbGVtZW50UmVhbGl6ZXIoY29uZmlnKSk7Ci0JCX0gZWxzZSBpZiAoQ29uZmlndXJhdGlvbkhlbHBlci5pczAxRmVhdHVyZShyZWYpKSB7Ci0JCQlyZXR1cm4gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMDFGZWF0dXJlVmFsdWUoZSwgcmVmLAotCQkJCQlEZWZhdWx0RWxlbWVudFJlYWxpemVyLm5ld0VsZW1lbnRSZWFsaXplcihjb25maWcpKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldFJlZmVyZW5jZShDb250ZW50RGVzY3JpcHRpb24gZGVzYywKLQkJCURlc2NyaWJhYmxlRWxlbWVudCBvd25lciwgRVJlZmVyZW5jZSByZWYsIE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0KLQkJTGlzdCB2YWx1ZXMgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwbkZlYXR1cmVWYWx1ZShkZXNjLCBvd25lciwgcmVmLAotCQkJCURlZmF1bHRFbGVtZW50UmVhbGl6ZXIubmV3RWxlbWVudFJlYWxpemVyKGNvbmZpZykpOwotCQlpZiAocmVmLmlzTWFueSgpKSB7Ci0JCQlyZXR1cm4gdmFsdWVzOwotCQl9Ci0JCWlmICh2YWx1ZXMuaXNFbXB0eSgpKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiB2YWx1ZXM7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRSZWZlcmVuY2UoTWV0aG9kRWxlbWVudCBlbGVtZW50LCBPcHBvc2l0ZUZlYXR1cmUgZmVhdHVyZSwKLQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0JCUxpc3QgdmFsdWVzID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMG5GZWF0dXJlVmFsdWUoZWxlbWVudCwgZmVhdHVyZSwKLQkJCQlEZWZhdWx0RWxlbWVudFJlYWxpemVyLm5ld0VsZW1lbnRSZWFsaXplcihjb25maWcpKTsKLQotCQlyZXR1cm4gdmFsdWVzOwotCX0KLQotCXB1YmxpYyBPYmplY3QgcmVzb2x2ZShPYmplY3Qgb2JqZWN0LCBNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZykgewotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJT2JqZWN0IHJlc29sdmVkID0gQ29uZmlndXJhdGlvbkhlbHBlci5nZXRDYWxjdWxhdGVkRWxlbWVudCgKLQkJCQkJKE1ldGhvZEVsZW1lbnQpIG9iamVjdCwgY29uZmlnKTsKLQkJCWlmIChyZXNvbHZlZCA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIG9iamVjdDsKLQkJCX0gZWxzZSB7Ci0JCQkJcmV0dXJuIHJlc29sdmVkOwotCQkJfQotCQl9IGVsc2UgewotCQkJcmV0dXJuIG9iamVjdDsKLQkJfQotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0QXR0cmlidXRlKENvbnRlbnREZXNjcmlwdGlvbiBkZXNjLAotCQkJRGVzY3JpYmFibGVFbGVtZW50IG93bmVyLCBFQXR0cmlidXRlIGF0dHIsCi0JCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZykgewotCQlyZXR1cm4gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjQXR0cmlidXRlRmVhdHVyZVZhbHVlKGRlc2MsIG93bmVyLCBhdHRyLAotCQkJCWNvbmZpZyk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvY29uZmlndXJhdGlvbi9Db25maWd1cmF0aW9uRGF0YS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2NvbmZpZ3VyYXRpb24vQ29uZmlndXJhdGlvbkRhdGEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTQ0N2U4MC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvY29uZmlndXJhdGlvbi9Db25maWd1cmF0aW9uRGF0YS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjM4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuRXh0ZW5zaW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LklMaWJyYXJ5TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkRlYnVnVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5ldmVudHMuSUxpYnJhcnlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLkxpYnJhcnlVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50Q2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DdXN0b21DYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpc2NpcGxpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaXNjaXBsaW5lR3JvdXBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Eb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVTZXRHcm91cGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRvb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci0KLS8qKgotICogIENsYXNzIG1hbmFnaW5nIGNvbmZpZ3VyYXRpb24gYWRkL3N1YnRyYWN0ZWQgZGF0YSBjYWxjdWxhdGlvbiBhbmQgY2FjaGUKLSAqIAotICogQGF1dGhvciBXZWlwaW5nIEx1IC0gTWFyIDIwLCAyMDA3Ci0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMgotICovCi1wdWJsaWMgY2xhc3MgQ29uZmlndXJhdGlvbkRhdGEgewotCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBsb2NhbERlYnVnID0gZmFsc2U7Ci0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBwcm9maWxpbmcgPSBmYWxzZTsKLQkKLQlwcml2YXRlIE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnOwotCQotCS8vIG1ha2Ugc3VyZSB0aGUgbWFwIGlzIGNyZWF0ZWQuCi0JcHJpdmF0ZSBNYXA8U3RyaW5nLCBNZXRob2RFbGVtZW50PiBzdWJzdHJhY3RlZEVsZW1NYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE1ldGhvZEVsZW1lbnQ+KCk7Ci0JcHJpdmF0ZSBNYXA8U3RyaW5nLCBNZXRob2RFbGVtZW50PiBhZGRlZEVsZW1NYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE1ldGhvZEVsZW1lbnQ+KCk7Ci0KLQlwcml2YXRlIGJvb2xlYW4gbmVlZFVwZGF0ZUNoYW5nZXMgPSB0cnVlOwotCXByaXZhdGUgTWFwPFN0cmluZywgQ29udGVudENhdGVnb3J5PiBvcmlnaW5hbFN1YnN0cmFjdGVkOwotCXByaXZhdGUgTWFwPFN0cmluZywgQ29udGVudENhdGVnb3J5PiBvcmlnbmFsQWRkZWQ7Ci0JcHJpdmF0ZSBJTGlicmFyeU1hbmFnZXIgbGlicmFyeU1hbmFnZXI7IAotCXByaXZhdGUgQWRhcHRlciBjb25maWdMaXN0ZW5lcjsKLQlwcml2YXRlIElMaWJyYXJ5Q2hhbmdlTGlzdGVuZXIgbGliTGlzdGVuZXI7Ci0JcHJpdmF0ZSBib29sZWFuIGVuYWJsZVVwZGF0ZSA9IHRydWU7Ci0JcHJpdmF0ZSBTdXBwb3J0aW5nRWxlbWVudERhdGEgc3VwcG9ydGluZ0VsZW1lbnREYXRhOwotCQotCXB1YmxpYyBzdGF0aWMgQ29uZmlndXJhdGlvbkRhdGEgbmV3Q29uZmlndXJhdGlvbkRhdGEoTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLQkJT2JqZWN0IG9iaiA9IEV4dGVuc2lvbkhlbHBlci5jcmVhdGUoQ29uZmlndXJhdGlvbkRhdGEuY2xhc3MsIGNvbmZpZyk7Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBDb25maWd1cmF0aW9uRGF0YSkgewotCQkJcmV0dXJuIChDb25maWd1cmF0aW9uRGF0YSkgb2JqOwotCQl9CQkKLQkJcmV0dXJuIG5ldyBDb25maWd1cmF0aW9uRGF0YShjb25maWcpOwotCX0KLQkKLQlwdWJsaWMgQ29uZmlndXJhdGlvbkRhdGEoTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLQkJdGhpcy5jb25maWcgPSBjb25maWc7Ci0JCQotCQljb25maWdMaXN0ZW5lciA9IG5ldyBBZGFwdGVySW1wbCgpIHsKLQkJCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG1zZykgewotCQkJCWlmIChpc05lZWRVcGRhdGVDaGFuZ2VzKCkpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlpbnQgdHlwZSA9IG1zZy5nZXRFdmVudFR5cGUoKTsKLQkJCQlpZiAoCQl0eXBlID09IE5vdGlmaWNhdGlvbi5BREQKLQkJCQkJCXx8IAl0eXBlID09IE5vdGlmaWNhdGlvbi5BRERfTUFOWQotCQkJCQkJfHwgCXR5cGUgPT0gTm90aWZpY2F0aW9uLlJFTU9WRQotCQkJCQkJfHwgIHR5cGUgPT0gTm90aWZpY2F0aW9uLlJFTU9WRV9NQU5ZKSB7CQkJCQkKLQkJCQkJc2V0TmVlZFVwZGF0ZUNoYW5nZXModHJ1ZSk7Ci0JCQkJfQotCQkJfQotCQl9OwotCQljb25maWcuZUFkYXB0ZXJzKCkuYWRkKGNvbmZpZ0xpc3RlbmVyKTsKLQkJCQkKLQkJbGliTGlzdGVuZXIgPSBuZXcgSUxpYnJhcnlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGxpYnJhcnlDaGFuZ2VkKGludCBvcHRpb24sIENvbGxlY3Rpb24gY2hhbmdlZEl0ZW1zKSB7Ci0JCQkJaWYgKGxvY2FsRGVidWcpIHsKLQkJCQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oIkxEPiBsaWJyYXJ5Q2hhbmdlZCwgb3B0aW9uOiAiICsgb3B0aW9uICsgIiwgIiArIGNoYW5nZWRJdGVtcyk7Ly8kTk9OLU5MUy0xJC8vJE5PTi1OTFMtMiQKLQkJCQl9CQkJCQotCQkJCWhhbmRsZUxpYnJhcnlDaGFuZ2Uob3B0aW9uLCBjaGFuZ2VkSXRlbXMpOwotCQkJfQotCQl9OwotCQkKLQkJTWV0aG9kTGlicmFyeSBsaWJyYXJ5ID0gTGlicmFyeVNlcnZpY2VVdGlsLmdldE1ldGhvZExpYnJhcnkoY29uZmlnKTsKLQkJbGlicmFyeU1hbmFnZXIgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmdldExpYnJhcnlNYW5hZ2VyKGxpYnJhcnkpOwotCQlpZihsaWJyYXJ5TWFuYWdlciAhPSBudWxsKSB7Ci0JCQlsaWJyYXJ5TWFuYWdlci5hZGRMaXN0ZW5lcihsaWJMaXN0ZW5lcik7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlTGlicmFyeUNoYW5nZShpbnQgb3B0aW9uLCBDb2xsZWN0aW9uIGNoYW5nZWRJdGVtcykgewotCQlpZiAoaXNOZWVkVXBkYXRlQ2hhbmdlcygpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJZm9yIChJdGVyYXRvciBpdCA9IGNoYW5nZWRJdGVtcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgaXRlbSA9IGl0Lm5leHQoKTsKLQkJCWlmIChpdGVtIGluc3RhbmNlb2YgQ29udGVudENhdGVnb3J5KSB7Ci0JCQkJc2V0TmVlZFVwZGF0ZUNoYW5nZXModHJ1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JfQotCQotCXByb3RlY3RlZCBib29sZWFuIGdldFVwZGF0aW5nQ2hhbmdlcygpIHsKLQkJcmV0dXJuIG9yaWdpbmFsU3Vic3RyYWN0ZWQgIT0gbnVsbCAmJiBvcmlnbmFsQWRkZWQgIT0gbnVsbDsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZUNoYW5nZXMoKSB7Ci0JCWlmICghIGlzRW5hYmxlVXBkYXRlKCkpIHsKLQkJCXJldHVybjsKLQkJfQkJCi0JCWlmICghIGlzTmVlZFVwZGF0ZUNoYW5nZXMoKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWlmIChnZXRVcGRhdGluZ0NoYW5nZXMoKSkgewotCQkJcmV0dXJuOwkJCQotCQl9Ci0JCQotCQlsb25nIHQgPSAwOwotCQlpZiAocHJvZmlsaW5nKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxEPiB1cGRhdGVDaGFuZ2VzXygpIC0+ICIpOwkvLyROT04tTkxTLTEkCi0JCQl0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCX0KLQkJdXBkYXRlQ2hhbmdlc18oKTsKLQkJaWYgKHByb2ZpbGluZykgewotCQkJdCA9ICBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHQ7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxEPiB1cGRhdGVDaGFuZ2VzXygpIDwtIHRpbWU6ICIgKyB0KTsJLy8kTk9OLU5MUy0xJAotCQkJU3lzdGVtLm91dC5wcmludGxuKCIiKTsJCQkJCQkJCQkJLy8kTk9OLU5MUy0xJAotCQl9Ci0JCQotCX0KLQkKLQlwcml2YXRlIHZvaWQgdXBkYXRlQ2hhbmdlc18oKSB7Ci0JCXN1YnN0cmFjdGVkRWxlbU1hcC5jbGVhcigpOwotCQlhZGRlZEVsZW1NYXAuY2xlYXIoKTsKLQkJCi0JCUxpc3Qgc3ViTGlzdCA9IGNvbmZpZy5nZXRTdWJ0cmFjdGVkQ2F0ZWdvcnkoKTsKLQkJTGlzdCBhZGRMaXN0ID0gY29uZmlnLmdldEFkZGVkQ2F0ZWdvcnkoKTsKLQkJaWYgKHN1Ykxpc3QuaXNFbXB0eSgpICYmIGFkZExpc3QuaXNFbXB0eSgpKSB7Ci0JCQlpZiAobG9jYWxEZWJ1ZykgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTEQ+IHN1Ykxpc3QvYWRkTGlzdCBhcmUgZW1wdHkuIik7CS8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCXJldHVybjsKLQkJfQotCQkKLQkJb3JpZ2luYWxTdWJzdHJhY3RlZCA9IGNvbnZlcnRUb01hcChzdWJMaXN0KTsKLQkJb3JpZ25hbEFkZGVkID0gY29udmVydFRvTWFwKGFkZExpc3QpOwotCQkKLQkJaWYgKGxvY2FsRGVidWcpIHsKLQkJCURlYnVnVXRpbC5wcmludCgib3JpZ2luYWxTdWJzdHJhY3RlZDogIiwgbnVsbCwgb3JpZ2luYWxTdWJzdHJhY3RlZC52YWx1ZXMoKSwgMik7CS8vJE5PTi1OTFMtMSQKLQkJCURlYnVnVXRpbC5wcmludCgib3JpZ25hbEFkZGVkOiAiLCBudWxsLCBvcmlnbmFsQWRkZWQudmFsdWVzKCksIDIpOwkJCQkJLy8kTk9OLU5MUy0xJAotCQl9Ci0JCQotCQlib29sZWFuIGNoYW5nZWQgPSByZW1vdmUob3JpZ2luYWxTdWJzdHJhY3RlZCwgb3JpZ25hbEFkZGVkKTsKLQkJaWYgKGNoYW5nZWQgJiYgbG9jYWxEZWJ1ZykgewotCQkJRGVidWdVdGlsLnByaW50KCJvcmlnbmFsQWRkZWQgYWZ0ZXIgcmVtb3ZlOiAiLCBudWxsLCBvcmlnbmFsQWRkZWQudmFsdWVzKCksIDIpOwkJLy8kTk9OLU5MUy0xJAotCQl9Ci0JCQotCQlNYXA8U3RyaW5nLCBDb250ZW50Q2F0ZWdvcnk+IGNhbFN1YnN0cmFjdGVkID0gKE1hcDxTdHJpbmcsIENvbnRlbnRDYXRlZ29yeT4pIAotCQkJCQkJCSgoSGFzaE1hcDxTdHJpbmcsIENvbnRlbnRDYXRlZ29yeT4pb3JpZ2luYWxTdWJzdHJhY3RlZCkuY2xvbmUoKTsKLQkJTWFwPFN0cmluZywgQ29udGVudENhdGVnb3J5PiBjYWxBZGRlZCA9IChNYXA8U3RyaW5nLCBDb250ZW50Q2F0ZWdvcnk+KSAKLQkJCQkJCQkoKEhhc2hNYXA8U3RyaW5nLCBDb250ZW50Q2F0ZWdvcnk+KW9yaWduYWxBZGRlZCkuY2xvbmUoKTsKLQkJCQkJCi0JCWNoYW5nZWQgPSBoYW5kbGVDb250cmlidXRvcnMoY2FsU3Vic3RyYWN0ZWQsIHRydWUpOwotCQlpZiAoY2hhbmdlZCAmJiBsb2NhbERlYnVnKSB7Ci0JCQlEZWJ1Z1V0aWwucHJpbnQoImNhbFN1YnN0cmFjdGVkIGFmdGVyIGhhbmRsZUNvbnRyaWJ1dG9yczogIiwgbnVsbCwgY2FsU3Vic3RyYWN0ZWQudmFsdWVzKCksIDIpOy8vJE5PTi1OTFMtMSQKLQkJfQkJCi0JCQotCQljYWxTdWJzdHJhY3RlZCA9IGhhbmRsZVJlcGxhY2VycyhjYWxTdWJzdHJhY3RlZCwgdHJ1ZSk7Ci0JCWNhbEFkZGVkID0gaGFuZGxlUmVwbGFjZXJzKGNhbEFkZGVkLCBmYWxzZSk7Ci0JCQotCQlpZiAobG9jYWxEZWJ1ZykgewotCQkJRGVidWdVdGlsLnByaW50KCJjYWxTdWJzdHJhY3RlZDogIiwgbnVsbCwgY2FsU3Vic3RyYWN0ZWQudmFsdWVzKCksIDIpOy8vJE5PTi1OTFMtMSQKLQkJCURlYnVnVXRpbC5wcmludCgiY2FsQWRkZWQ6ICIsIG51bGwsIGNhbEFkZGVkLnZhbHVlcygpLCAyKTsvLyROT04tTkxTLTEkCi0JCX0KLQkJCi0JCWNoYW5nZWQgPSByZW1vdmUoY2FsU3Vic3RyYWN0ZWQsIGNhbEFkZGVkKTsKLQkJaWYgKGNoYW5nZWQgJiYgbG9jYWxEZWJ1ZykgewotCQkJRGVidWdVdGlsLnByaW50KCJjYWxBZGRlZCBhZnRlciByZW1vdmU6ICIsIG51bGwsIG9yaWduYWxBZGRlZC52YWx1ZXMoKSwgMik7Ly8kTk9OLU5MUy0xJAotCQl9CQkJCQotCQkKLQkJaWYgKGNhbFN1YnN0cmFjdGVkICE9IG51bGwpIHsKLQkJCXVwZGF0ZUVsZW1lbnRNYXAoY2FsU3Vic3RyYWN0ZWQudmFsdWVzKCksIHN1YnN0cmFjdGVkRWxlbU1hcCk7Ci0JCX0KLQkJaWYgKGNhbEFkZGVkICE9IG51bGwpIHsKLQkJCXVwZGF0ZUVsZW1lbnRNYXAoY2FsQWRkZWQudmFsdWVzKCksIGFkZGVkRWxlbU1hcCk7Ci0JCX0KLQkJCi0JCWlmIChsb2NhbERlYnVnKSB7Ci0JCQlEZWJ1Z1V0aWwucHJpbnQoInN1YnN0cmFjdGVkRWxlbU1hcDogIiwgbnVsbCwgc3Vic3RyYWN0ZWRFbGVtTWFwLnZhbHVlcygpLCAyKTsJLy8kTk9OLU5MUy0xJAotCQkJRGVidWdVdGlsLnByaW50KCJhZGRlZEVsZW1NYXA6ICIsIG51bGwsIGFkZGVkRWxlbU1hcC52YWx1ZXMoKSwgMik7CQkJCQkvLyROT04tTkxTLTEkCi0JCX0KLQkJCi0JCXNldE5lZWRVcGRhdGVDaGFuZ2VzKGZhbHNlKTsJCQotCQkKLQkJb3JpZ2luYWxTdWJzdHJhY3RlZCA9IG51bGw7CQkvL25vdCBuZWVkZWQgYWZ0ZXIgdXBkYXRlCi0JCW9yaWduYWxBZGRlZCA9IG51bGw7CQkJLy9ub3QgbmVlZGVkIGFmdGVyIHVwZGF0ZQotCX0KLQkKLQkvL3JldHVybiB0cnVlIGlmIHNvbWV0aGluZyBnZXRzIHJlbW92ZWQsIG90aGVyd2lzZSBmYWxzZQotCXByaXZhdGUgYm9vbGVhbiByZW1vdmUoTWFwPFN0cmluZywgQ29udGVudENhdGVnb3J5PiBzb3VyY2VNYXAsIE1hcDxTdHJpbmcsIENvbnRlbnRDYXRlZ29yeT4gdGFyZ2V0TWFwKSB7Ci0JCWlmIChzb3VyY2VNYXAgPT0gbnVsbCB8fCBzb3VyY2VNYXAuaXNFbXB0eSgpIHx8Ci0JCQl0YXJnZXRNYXAgPT0gbnVsbCB8fCB0YXJnZXRNYXAuaXNFbXB0eSgpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJCi0JCWJvb2xlYW4gcmV0ID0gZmFsc2U7CQkJCQotCQlmb3IgKEl0ZXJhdG9yPFN0cmluZz4gaXQgPSBzb3VyY2VNYXAua2V5U2V0KCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJQ29udGVudENhdGVnb3J5IGNjID0gdGFyZ2V0TWFwLnJlbW92ZShpdC5uZXh0KCkpOwotCQkJaWYgKGNjICE9IG51bGwpIHsKLQkJCQlyZXQgPSB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXQ7Ci0JfQotCQkKLQkvL3JldHVybiB0cnVlIGlmIGFueSBjaGFuZ2UKLQlwcml2YXRlIGJvb2xlYW4gaGFuZGxlQ29udHJpYnV0b3JzKE1hcDxTdHJpbmcsIENvbnRlbnRDYXRlZ29yeT4gbWFwLCAgYm9vbGVhbiBzdWJzdHJhY3RlZCkgewotCQlpZiAobWFwID09IG51bGwgfHwgISBzdWJzdHJhY3RlZCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCUxpc3Q8Q29udGVudENhdGVnb3J5PiBhZGRlZExpc3QgPSBuZXcgQXJyYXlMaXN0PENvbnRlbnRDYXRlZ29yeT4oKTsKLQkJCQkKLQkJZm9yIChJdGVyYXRvcjxDb250ZW50Q2F0ZWdvcnk+IGl0ID0gbWFwLnZhbHVlcygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCUNvbnRlbnRDYXRlZ29yeSBjYyA9IGl0Lm5leHQoKTsKLQkJCUxpc3Q8Q29udGVudENhdGVnb3J5PiBjb250cmlidXRlcnMgPSBDb25maWd1cmF0aW9uSGVscGVyLmdldENvbnRyaWJ1dG9ycyhjYywgY29uZmlnKTsKLQkJCWFkZGVkTGlzdC5hZGRBbGwoY29udHJpYnV0ZXJzKTsKLQkJfQotCQlmb3IgKEl0ZXJhdG9yPENvbnRlbnRDYXRlZ29yeT4gaXQgPSBhZGRlZExpc3QuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJQ29udGVudENhdGVnb3J5IGNjID0gaXQubmV4dCgpOwotCQkJbWFwLnB1dChjYy5nZXRHdWlkKCksIGNjKTsKLQkJfQotCQkKLQkJcmV0dXJuICEgYWRkZWRMaXN0LmlzRW1wdHkoKTsKLQl9Ci0JCi0JcHJpdmF0ZSBNYXA8U3RyaW5nLCBDb250ZW50Q2F0ZWdvcnk+IGhhbmRsZVJlcGxhY2VycyhNYXA8U3RyaW5nLCBDb250ZW50Q2F0ZWdvcnk+IG9yaWdpbmFscywgYm9vbGVhbiBzdWJzdHJhY3RlZCkgewotCQlpZiAob3JpZ2luYWxzID09IG51bGwgfHwgb3JpZ2luYWxzLmlzRW1wdHkoKSkgewotCQkJcmV0dXJuIG9yaWdpbmFsczsKLQkJfQotCQkKLQkJTWFwPFN0cmluZywgQ29udGVudENhdGVnb3J5PiByZXQgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIENvbnRlbnRDYXRlZ29yeT4oKTsKLQkJCi0JCWZvciAoSXRlcmF0b3I8Q29udGVudENhdGVnb3J5PiBpdCA9IG9yaWdpbmFscy52YWx1ZXMoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlDb250ZW50Q2F0ZWdvcnkgY2MgPSBpdC5uZXh0KCk7Ci0JCQlWYXJpYWJpbGl0eUVsZW1lbnQgcmVwbGFjZXIgPSBDb25maWd1cmF0aW9uSGVscGVyLmdldFJlcGxhY2VyKGNjLCBjb25maWcpOwotCQkJYm9vbGVhbiB0b0tlZXAgPSB0cnVlOwotCQkJaWYgKHJlcGxhY2VyICE9IG51bGwpIHsKLQkJCQl0b0tlZXAgPSBmYWxzZTsKLQkJCQkKLQkJCQlWYXJpYWJpbGl0eUVsZW1lbnQgbmVzdGVkUmVwbGFjZXIgPSByZXBsYWNlcjsKLQkJCQl3aGlsZSAobmVzdGVkUmVwbGFjZXIgIT0gbnVsbCkgewotCQkJCQlyZXBsYWNlciA9IG5lc3RlZFJlcGxhY2VyOwotCQkJCQluZXN0ZWRSZXBsYWNlciA9IENvbmZpZ3VyYXRpb25IZWxwZXIuZ2V0UmVwbGFjZXIobmVzdGVkUmVwbGFjZXIsIGNvbmZpZyk7Ci0JCQkJfQotCQkJCWlmIChzdWJzdHJhY3RlZCkgewotCQkJCQlpZiAob3JpZ2luYWxTdWJzdHJhY3RlZC5jb250YWluc0tleShyZXBsYWNlci5nZXRHdWlkKCkpKSB7Ci0JCQkJCQl0b0tlZXAgPSB0cnVlOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJaWYgKHRvS2VlcCkgewotCQkJCXJldC5wdXQoY2MuZ2V0R3VpZCgpLCBjYyk7Ci0JCQl9CQkJCi0KLQkJfQotCQlyZXR1cm4gcmV0OwotCX0JCQkKLQkKLQlwcml2YXRlIE1hcDxTdHJpbmcsIENvbnRlbnRDYXRlZ29yeT4gY29udmVydFRvTWFwKENvbGxlY3Rpb248Q29udGVudENhdGVnb3J5PiBjb2xsZWN0aW9uKSB7Ci0JCWlmIChjb2xsZWN0aW9uID09IG51bGwgfHwgY29sbGVjdGlvbi5pc0VtcHR5KCkpIHsKLQkJCXJldHVybiBuZXcgSGFzaE1hcDxTdHJpbmcsIENvbnRlbnRDYXRlZ29yeT4oKTsKLQkJfQotCQlNYXA8U3RyaW5nLCBDb250ZW50Q2F0ZWdvcnk+IG1hcCA9IG5ldyBMaW5rZWRIYXNoTWFwPFN0cmluZywgQ29udGVudENhdGVnb3J5PigpOwkJCi0JCWZpbGxNYXAoY29sbGVjdGlvbiwgbWFwKTsKLQkJcmV0dXJuIG1hcDsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGZpbGxNYXAoQ29sbGVjdGlvbjxDb250ZW50Q2F0ZWdvcnk+IGNvbGxlY3Rpb24sIE1hcDxTdHJpbmcsIENvbnRlbnRDYXRlZ29yeT4gbWFwKSB7Ci0JCWZvciAoSXRlcmF0b3I8Q29udGVudENhdGVnb3J5PiBpdCA9IGNvbGxlY3Rpb24uaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJQ29udGVudENhdGVnb3J5IGNjID0gaXQubmV4dCgpOwotCQkJaWYgKCEgbWFwLmNvbnRhaW5zS2V5KGNjLmdldEd1aWQoKSkpIHsKLQkJCQltYXAucHV0KGNjLmdldEd1aWQoKSwgY2MpOwotCQkJfQotCQl9Ci0JfQkKLQkKLQlwcml2YXRlIENvbGxlY3Rpb248PyBleHRlbmRzIENvbnRlbnRDYXRlZ29yeT4gZ2V0Q2hpbGRDQyhDb250ZW50Q2F0ZWdvcnkgY2MpIHsKLQkJaWYgKGNjIGluc3RhbmNlb2YgQ3VzdG9tQ2F0ZWdvcnkpIHsKLQkJCXJldHVybiAoKEN1c3RvbUNhdGVnb3J5KSBjYykuZ2V0U3ViQ2F0ZWdvcmllcygpOwotCQl9Ci0JCWlmIChjYyBpbnN0YW5jZW9mIERpc2NpcGxpbmUpIHsKLQkJCXJldHVybiAoKERpc2NpcGxpbmUpIGNjKS5nZXRTdWJkaXNjaXBsaW5lKCk7Ci0JCX0KLQkJaWYgKGNjIGluc3RhbmNlb2YgRGlzY2lwbGluZUdyb3VwaW5nKSB7Ci0JCQlyZXR1cm4gKChEaXNjaXBsaW5lR3JvdXBpbmcpIGNjKS5nZXREaXNjaXBsaW5lcygpOwotCQl9Ci0JCWlmIChjYyBpbnN0YW5jZW9mIERvbWFpbikgewotCQkJcmV0dXJuICgoRG9tYWluKSBjYykuZ2V0U3ViZG9tYWlucygpOwotCQl9Ci0JCWlmIChjYyBpbnN0YW5jZW9mIFJvbGVTZXQpIHsKLQkJfQotCQlpZiAoY2MgaW5zdGFuY2VvZiBSb2xlU2V0R3JvdXBpbmcpIHsKLQkJCXJldHVybiAoKFJvbGVTZXRHcm91cGluZykgY2MpLmdldFJvbGVTZXRzKCk7Ci0JCX0KLQkJaWYgKGNjIGluc3RhbmNlb2YgV29ya1Byb2R1Y3RUeXBlKSB7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQkKLQkKLQlwcml2YXRlIHZvaWQgdXBkYXRlRWxlbWVudE1hcCgJQ29sbGVjdGlvbjxDb250ZW50Q2F0ZWdvcnk+IGNjTGlzdCwKLQkJCQkJCQkJCU1hcDxTdHJpbmcsIE1ldGhvZEVsZW1lbnQ+IGVsZW1lbnRNYXApIHsKLQkJaWYgKGNjTGlzdCA9PSBudWxsIHx8IGNjTGlzdC5pc0VtcHR5KCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJU2V0PFN0cmluZz4gc2VlbnMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7Ci0JCWZvciAoSXRlcmF0b3I8Q29udGVudENhdGVnb3J5PiBpdCA9IGNjTGlzdC5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlDb250ZW50Q2F0ZWdvcnkgY2MgPSBpdC5uZXh0KCk7Ci0JCQlpZiAoISBzZWVucy5jb250YWlucyhjYy5nZXRHdWlkKCkpKSB7Ci0JCQkJYWRkVG9FbGVtZW50TWFwKGNjLCBlbGVtZW50TWFwKTsKLQkJCQkvL2VsZW1lbnRNYXAucHV0KGNjLmdldEd1aWQoKSwgY2MpOwotCQkJfQotCQkJc2VlbnMuYWRkKGNjLmdldEd1aWQoKSk7Ci0JCX0KLQl9CQkJCi0KLQkvL05vIGR1cGxpY2F0ZXMgaW4gdGhlIHJldHVybmVkIGVsZW1lbnRzCi0JcHJpdmF0ZSBDb2xsZWN0aW9uPE1ldGhvZEVsZW1lbnQ+IGdldEVsZW1lbnRzKENvbnRlbnRDYXRlZ29yeSBjYykgewotCQlDb2xsZWN0aW9uPE1ldGhvZEVsZW1lbnQ+IGVsZW1lbnRzID0gbmV3IEFycmF5TGlzdDxNZXRob2RFbGVtZW50PigpOwotCQllbGVtZW50cy5hZGRBbGwoY2MuZ2V0QXNzZXRzKCkpOwotCQllbGVtZW50cy5hZGRBbGwoY2MuZ2V0Q2hlY2tsaXN0cygpKTsKLQkJZWxlbWVudHMuYWRkQWxsKGNjLmdldENvbmNlcHRzQW5kUGFwZXJzKCkpOwotCQllbGVtZW50cy5hZGRBbGwoY2MuZ2V0RXhhbXBsZXMoKSk7Ci0JCWVsZW1lbnRzLmFkZEFsbChjYy5nZXRHdWlkZWxpbmVzKCkpOwotCQllbGVtZW50cy5hZGRBbGwoY2MuZ2V0U3VwcG9ydGluZ01hdGVyaWFscygpKTsJCQotCQkKLQkJaWYgKGNjIGluc3RhbmNlb2YgQ3VzdG9tQ2F0ZWdvcnkpIHsKLQkJCWVsZW1lbnRzLmFkZEFsbCgoKEN1c3RvbUNhdGVnb3J5KSBjYykuZ2V0U3ViQ2F0ZWdvcmllcygpKTsKLQkJCWVsZW1lbnRzLmFkZEFsbCgoKEN1c3RvbUNhdGVnb3J5KSBjYykuZ2V0Q2F0ZWdvcml6ZWRFbGVtZW50cygpKTsKLQkJfQotCQllbHNlIGlmIChjYyBpbnN0YW5jZW9mIERpc2NpcGxpbmUpIHsKLQkJCWVsZW1lbnRzLmFkZEFsbCgoKERpc2NpcGxpbmUpIGNjKS5nZXRSZWZlcmVuY2VXb3JrZmxvd3MoKSk7Ci0JCQllbGVtZW50cy5hZGRBbGwoKChEaXNjaXBsaW5lKSBjYykuZ2V0U3ViZGlzY2lwbGluZSgpKTsKLQkJCWVsZW1lbnRzLmFkZEFsbCgoKERpc2NpcGxpbmUpIGNjKS5nZXRUYXNrcygpKTsKLQkJfQotCQllbHNlIGlmIChjYyBpbnN0YW5jZW9mIERpc2NpcGxpbmVHcm91cGluZykgewotCQkJZWxlbWVudHMuYWRkQWxsKCgoRGlzY2lwbGluZUdyb3VwaW5nKSBjYykuZ2V0RGlzY2lwbGluZXMoKSk7Ci0JCX0KLQkJZWxzZSBpZiAoY2MgaW5zdGFuY2VvZiBEb21haW4pIHsKLQkJCWVsZW1lbnRzLmFkZEFsbCgoKERvbWFpbikgY2MpLmdldFN1YmRvbWFpbnMoKSk7Ci0JCQllbGVtZW50cy5hZGRBbGwoKChEb21haW4pIGNjKS5nZXRXb3JrUHJvZHVjdHMoKSk7Ci0JCX0KLQkJZWxzZSBpZiAoY2MgaW5zdGFuY2VvZiBSb2xlU2V0KSB7Ci0JCQllbGVtZW50cy5hZGRBbGwoKChSb2xlU2V0KSBjYykuZ2V0Um9sZXMoKSk7Ci0JCX0KLQkJZWxzZSBpZiAoY2MgaW5zdGFuY2VvZiBSb2xlU2V0R3JvdXBpbmcpIHsKLQkJCWVsZW1lbnRzLmFkZEFsbCgoKFJvbGVTZXRHcm91cGluZykgY2MpLmdldFJvbGVTZXRzKCkpOwotCQl9Ci0JCWVsc2UgaWYgKGNjIGluc3RhbmNlb2YgVG9vbCkgewotCQkJZWxlbWVudHMuYWRkQWxsKCgoVG9vbCkgY2MpLmdldFRvb2xNZW50b3JzKCkpOwotCQl9Ci0JCWVsc2UgaWYgKGNjIGluc3RhbmNlb2YgV29ya1Byb2R1Y3RUeXBlKSB7Ci0JCQllbGVtZW50cy5hZGRBbGwoKChXb3JrUHJvZHVjdFR5cGUpIGNjKS5nZXRXb3JrUHJvZHVjdHMoKSk7Ci0JCX0KLQotCQlyZXR1cm4gZ2V0VW5pcXVlQ29sbGVjdGlvbihlbGVtZW50cyk7Ci0JfQotCQotCXByaXZhdGUgQ29sbGVjdGlvbjxNZXRob2RFbGVtZW50PiBnZXRVbmlxdWVDb2xsZWN0aW9uKENvbGxlY3Rpb248TWV0aG9kRWxlbWVudD4gZWxlbWVudHMpIHsKLQkJQ29sbGVjdGlvbjxNZXRob2RFbGVtZW50PiByZXQgPSBuZXcgTGlua2VkSGFzaFNldDxNZXRob2RFbGVtZW50PigpOwotCQlmb3IgKEl0ZXJhdG9yPE1ldGhvZEVsZW1lbnQ+IGl0ID0gZWxlbWVudHMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJTWV0aG9kRWxlbWVudCBlbGVtZW50ID0gaXQubmV4dCgpOwotCQkJaWYgKCEgcmV0LmNvbnRhaW5zKGVsZW1lbnQpKSB7Ci0JCQkJcmV0LmFkZChlbGVtZW50KTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmV0OwotCX0JCi0JCi0JcHVibGljIGJvb2xlYW4gaXNPd25lclNlbGVjdGVkKE1ldGhvZEVsZW1lbnQgZWxlbWVudCwgYm9vbGVhbiBjaGVja1N1YnRyYWN0ZWQpIHsKLQkJYm9vbGVhbiByZXQgPSBpc093bmVyU2VsZWN0ZWRfKGVsZW1lbnQsIGNoZWNrU3VidHJhY3RlZCk7Ci0JCWlmIChsb2NhbERlYnVnKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxEPiBpc093bmVyU2VsZWN0ZWQ6ICIgKyByZXQgKyAiLCAiICsgIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQlEZWJ1Z1V0aWwudG9TdHJpbmcoZWxlbWVudCwgMikpOwkKLQkJfQkJCQkKLQkJcmV0dXJuIHJldDsKLQl9Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNPd25lclNlbGVjdGVkXyhNZXRob2RFbGVtZW50IGVsZW1lbnQsIGJvb2xlYW4gY2hlY2tTdWJ0cmFjdGVkKSB7Ci0JCWlmIChlbGVtZW50ID09IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCWlmIChDb25maWd1cmF0aW9uSGVscGVyLmlzRGVzY3JpcHRpb25FbGVtZW50KGVsZW1lbnQpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQkKLQkJaWYgKGdldFVwZGF0aW5nQ2hhbmdlcygpKSB7Ci0JCQlpZiAob3JpZ2luYWxTdWJzdHJhY3RlZC5jb250YWluc0tleShlbGVtZW50LmdldEd1aWQoKSkgfHwgCi0JCQkJb3JpZ25hbEFkZGVkLmNvbnRhaW5zS2V5KGVsZW1lbnQuZ2V0R3VpZCgpKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQkJCQotCQl9IGVsc2UgewotCQkJdXBkYXRlQ2hhbmdlcygpOwotCQkJCQkJCi0JCQkvLzE4MjgzMQotLyoJCQlpZiAoYWN0aXZlICYmIGVsZW1lbnQgaW5zdGFuY2VvZiBDb250ZW50Q2F0ZWdvcnkpIHsKLQkJCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4oZWxlbWVudCk7Ci0JCQkJaWYgKGNvbmZpZy5nZXRNZXRob2RQbHVnaW5TZWxlY3Rpb24oKS5jb250YWlucyhwbHVnaW4pKSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0qLwotCQkJCi0JCQkvLyBzaW5jZSBVTUEgMS4wLjQsIGNvbmZpZ3VyYXRpb24gY2FuIGhhdmUgYWRkZWQgY2F0ZWdvcmllcyAKLQkJCS8vIGFuZCBzdWJ0cmFjdGVkIGNhdGVnb3JpZXMuIFRoZSBvcmRlciBvZiBmaWx0ZXJpbmcgaXM6Ci0JCQkvLyAxLiBhbnkgZWxlbWVudCBpbiB0aGUgc3VidHJhY3RlZCBjYXRlZ29yaWVzIHNob3VsZCBiZSBleGNsdWRlZAotCQkJLy8gMi4gYW55IGVsZW1lbnQgaW4gdGhlIGFkZGVkIGNhdGVnb3JpZXMgc2hvdWxkIGJlIGluY2x1ZGVkCi0JCQkvLyAzLiBhbnkgZWxlbWVudCBub3QgaW4gdGhlIHNlbGVjdGVkIHBhY2thZ2Ugb3IgcGx1Z2luIHNob3VsZCBiZSBleGNsdWRlZC4JCQotCQkJaWYgKCBjaGVja1N1YnRyYWN0ZWQpIHsKLQkJCQlpZiAoc3Vic3RyYWN0ZWRFbGVtTWFwLmNvbnRhaW5zS2V5KGVsZW1lbnQuZ2V0R3VpZCgpKSkgewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgVmFyaWFiaWxpdHlFbGVtZW50KXsKLQkJCQkJaWYgKGNvbnRyaWJ1dGVkQmFzZUluU3Vic3RyYWN0ZWQoKFZhcmlhYmlsaXR5RWxlbWVudCkgZWxlbWVudCkpIHsKLQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCQotCQkJaWYgKGFkZGVkRWxlbU1hcC5jb250YWluc0tleShlbGVtZW50LmdldEd1aWQoKSkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQotCQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IFVtYVV0aWwuZ2V0TWV0aG9kUGx1Z2luKGVsZW1lbnQpOwotCQkJaWYgKHBsdWdpbiAhPSBudWxsICYmIHBsdWdpbi5pc1N1cHBvcnRpbmcoKSkgewotCQkJCVN1cHBvcnRpbmdFbGVtZW50RGF0YSBzZURhdGEgPSBnZXRTdXBwb3J0aW5nRWxlbWVudERhdGEoKTsKLQkJCQlpZiAoc2VEYXRhLmlzRW5hYmxlZCgpKSB7Ci0JCQkJCWlmIChzZURhdGEuaXNVcGRhdGluZ0NoYW5nZXMoKSkgewotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQl9Ci0JCQkJCXJldHVybiBzZURhdGEuaXNTdXBwb3J0aW5nRWxlbWVudChlbGVtZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0gCi0JCQotCQkvLyBlbGVtZW50cyBiZXlvbmQgY29uZmlndXJhdGlvbiBzY29wZSBzaG91bGQgYmUgYWx3YXlzIHZpc2libGUKLQkJaWYgKChlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kTGlicmFyeSkKLQkJCQl8fCAoZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZENvbmZpZ3VyYXRpb24pKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luKSB7Ci0JCQlMaXN0IHBsdWdpbnMgPSBjb25maWcuZ2V0TWV0aG9kUGx1Z2luU2VsZWN0aW9uKCk7Ci0JCQlyZXR1cm4gKHBsdWdpbnMgIT0gbnVsbCkgJiYgcGx1Z2lucy5jb250YWlucyhlbGVtZW50KTsKLQkJfSBlbHNlIHsKLQkJCS8vIGlmIHRoZSBvd25lcnByb2Nlc3MgY2FuJ3Qgc2hvdywgY2FuJ3QgYWNjZXB0Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJQWN0aXZpdHkgYmFzZSA9IChBY3Rpdml0eSkgKChBY3Rpdml0eSkgZWxlbWVudCkKLQkJCQkJCS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCk7Ci0JCQkJaWYgKGJhc2UgIT0gbnVsbCAmJiBiYXNlICE9IGVsZW1lbnQpIHsKLQkJCQkJTWV0aG9kRWxlbWVudCBvd25pbmdQcm9jID0gVG5nVXRpbC5nZXRPd25pbmdQcm9jZXNzKGJhc2UpOwotCQkJCQlpZiAoIG93bmluZ1Byb2MgIT0gbnVsbCAmJiBvd25pbmdQcm9jICE9IGVsZW1lbnQgCi0JCQkJCQkJJiYgIUNvbmZpZ3VyYXRpb25IZWxwZXIuaW5Db25maWcob3duaW5nUHJvYywgY29uZmlnLCBjaGVja1N1YnRyYWN0ZWQpKSB7Ci0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCUVPYmplY3QgcGtnID0gTGlicmFyeVV0aWwuZ2V0U2VsZWN0YWJsZShlbGVtZW50KTsKLQotCQkJLy8gYWNjZXB0IGdsb2JhbCBwYWNrYWdlIGlmIHRoZSBwbHVnaW4gaXMgaW4gdGhlIGNvbmZpZ3VyYXRpb24KLQkJCWlmIChwa2cgaW5zdGFuY2VvZiBNZXRob2RQYWNrYWdlCi0JCQkJCSYmIENvbmZpZ3VyYXRpb25IZWxwZXIuaXNHbG9iYWxQYWNrYWdlKChNZXRob2RQYWNrYWdlKSBwa2cpKSB7Ci0JCQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IExpYnJhcnlVdGlsLmdldE1ldGhvZFBsdWdpbihwa2cpOwotCQkJCXJldHVybiBDb25maWd1cmF0aW9uSGVscGVyLmluQ29uZmlnKHBsdWdpbiwgY29uZmlnLCBjaGVja1N1YnRyYWN0ZWQpOwotCQkJfQotCi0JCQlMaXN0IHBrZ3MgPSBjb25maWcuZ2V0TWV0aG9kUGFja2FnZVNlbGVjdGlvbigpOwotCQkJaWYgKHBrZ3MgPT0gbnVsbCkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQotCQkJLy8gcGVyIFBob25nJ3MgcmVxdWVzdCwgZm9yIFByb2Nlc3NQYWNrYWdlLCBjaGVjayB0aGUKLQkJCS8vIFByb2Nlc3NDb21wb25lbnQgcGFyZW50IGluc3RlYWQKLQkJCWlmIChwa2cgaW5zdGFuY2VvZiBQcm9jZXNzUGFja2FnZSkgewotCQkJCUVPYmplY3QgcGtnX29sZCA9IHBrZzsKLQkJCQl3aGlsZSAoKHBrZyAhPSBudWxsKSAmJiAhKHBrZyBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpCi0JCQkJCQkmJiAhcGtncy5jb250YWlucyhwa2cpKSB7Ci0JCQkJCXBrZyA9IHBrZy5lQ29udGFpbmVyKCk7Ci0JCQkJfQotCQkJCQotCQkJCS8vIGlmIG5vIFByb2Nlc3NDb21wb25lbnQsIHRoaXMgaXMgYSByZWFsIHBhY2thZ2UsIHVzZSBpdAotCQkJCWlmICggcGtnID09IG51bGwgKSB7Ci0JCQkJCXBrZyA9IHBrZ19vbGQ7Ci0JCQkJfQotCQkJfQotCi0JCQkvLyBpZiBwYWNrYWdlIG5vdCBzZWxlY3RlZCwgcmV0dXJuIGZhbHNlCi0JCQlpZiAoKHBrZyA9PSBudWxsKSB8fCAhcGtncy5jb250YWlucyhwa2cpKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBjb250cmlidXRlZEJhc2VJblN1YnN0cmFjdGVkKFZhcmlhYmlsaXR5RWxlbWVudCB2ZSkgewotCQlpZiAodmUuZ2V0VmFyaWFiaWxpdHlUeXBlKCkgIT0gVmFyaWFiaWxpdHlUeXBlLkNPTlRSSUJVVEVTKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJCi0JCVZhcmlhYmlsaXR5RWxlbWVudCBiYXNlID0gdmUuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpOwotCQlpZiAoYmFzZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJCi0JCWlmIChzdWJzdHJhY3RlZEVsZW1NYXAuY29udGFpbnNLZXkoYmFzZS5nZXRHdWlkKCkpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQkKLQkJaWYgKENvbmZpZ3VyYXRpb25IZWxwZXIuaW5Db25maWcoYmFzZSwgY29uZmlnLCB0cnVlKSkgewotCQkJcmV0dXJuIGNvbnRyaWJ1dGVkQmFzZUluU3Vic3RyYWN0ZWQoYmFzZSk7Ci0JCX0KLQotCQlyZXR1cm4gZmFsc2U7Ci0JfQkKLQkKLQlwcml2YXRlIHZvaWQgYWRkVG9FbGVtZW50TWFwKENvbnRlbnRDYXRlZ29yeSBjYywgTWFwPFN0cmluZywgTWV0aG9kRWxlbWVudD4gZWxlbWVudE1hcCkgewotCQlDb2xsZWN0aW9uPE1ldGhvZEVsZW1lbnQ+IGVsZW1lbnRMaXN0ID0gZ2V0RWxlbWVudHMoY2MpOwkJCi0JCWZvciAoSXRlcmF0b3I8TWV0aG9kRWxlbWVudD4gaXQgPSBlbGVtZW50TGlzdC5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlNZXRob2RFbGVtZW50IGVsZW1lbnQgPSBpdC5uZXh0KCk7Ci0JCQllbGVtZW50TWFwLnB1dChlbGVtZW50LmdldEd1aWQoKSwgZWxlbWVudCk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJY29uZmlnLmVBZGFwdGVycygpLnJlbW92ZShjb25maWdMaXN0ZW5lcik7Ci0JCWxpYnJhcnlNYW5hZ2VyLnJlbW92ZUxpc3RlbmVyKGxpYkxpc3RlbmVyKTsJCQotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzTmVlZFVwZGF0ZUNoYW5nZXMoKSB7Ci0JCXJldHVybiBuZWVkVXBkYXRlQ2hhbmdlczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXROZWVkVXBkYXRlQ2hhbmdlcyhib29sZWFuIG5lZWRVcGRhdGVDaGFuZ2VzKSB7Ci0JCXRoaXMubmVlZFVwZGF0ZUNoYW5nZXMgPSBuZWVkVXBkYXRlQ2hhbmdlczsKLQkJaWYgKGxvY2FsRGVidWcpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTEQ+IHNldE5lZWRVcGRhdGVDaGFuZ2VzOiAiICsgbmVlZFVwZGF0ZUNoYW5nZXMpOwkvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNFbmFibGVVcGRhdGUoKSB7Ci0JCXJldHVybiBlbmFibGVVcGRhdGU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RW5hYmxlVXBkYXRlKGJvb2xlYW4gZW5hYmxlVXBkYXRlKSB7Ci0JCXRoaXMuZW5hYmxlVXBkYXRlID0gZW5hYmxlVXBkYXRlOwotCQlpZiAobG9jYWxEZWJ1ZykgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJMRD4gc2V0RW5hYmxlVXBkYXRlOiAiICsgZW5hYmxlVXBkYXRlKTsJLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCQotCXB1YmxpYyBDb2xsZWN0aW9uPE1ldGhvZEVsZW1lbnQ+IGdldEFkZGVkRWxlbWVudHMoKSB7Ci0JCXJldHVybiBhZGRlZEVsZW1NYXAudmFsdWVzKCk7Ci0JfQotCQotCXB1YmxpYyBDb2xsZWN0aW9uPE1ldGhvZEVsZW1lbnQ+IGdldFN1YnRyYWN0ZWRFbGVtZW50cygpIHsKLQkJcmV0dXJuIHN1YnN0cmFjdGVkRWxlbU1hcC52YWx1ZXMoKTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNFbGVtZW50SW5TdWJ0cmFjdGVkQ2F0ZWdvcnkoTWV0aG9kRWxlbWVudCBlbGVtZW50KSB7Ci0JCXJldHVybiBzdWJzdHJhY3RlZEVsZW1NYXAuY29udGFpbnNLZXkoZWxlbWVudC5nZXRHdWlkKCkpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc0VsZW1lbnRJbkFkZGVkQ2F0ZWdvcnkoTWV0aG9kRWxlbWVudCBlbGVtZW50KSB7Ci0JCXJldHVybiBhZGRlZEVsZW1NYXAuY29udGFpbnNLZXkoZWxlbWVudC5nZXRHdWlkKCkpOwotCX0KLQotCXByaXZhdGUgU3VwcG9ydGluZ0VsZW1lbnREYXRhIGdldFN1cHBvcnRpbmdFbGVtZW50RGF0YSgpIHsKLQkJaWYgKHN1cHBvcnRpbmdFbGVtZW50RGF0YSA9PSBudWxsKSB7Ci0JCQlzdXBwb3J0aW5nRWxlbWVudERhdGEgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkuZ2V0Q29uZmlndXJhdGlvbk1hbmFnZXIoY29uZmlnKS5nZXRTdXBwb3J0aW5nRWxlbWVudERhdGEoKTsKLQkJfQotCQlyZXR1cm4gc3VwcG9ydGluZ0VsZW1lbnREYXRhOwotCX0KLQkKLQkKLQlwdWJsaWMgYm9vbGVhbiBpc1N1YnN0cmFjdGVkKE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgewotCQlpZiAoZ2V0VXBkYXRpbmdDaGFuZ2VzKCkpIHsKLQkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCQl9Ci0JCXVwZGF0ZUNoYW5nZXMoKTsKLQotCQlpZiAoc3Vic3RyYWN0ZWRFbGVtTWFwLmNvbnRhaW5zS2V5KGVsZW1lbnQuZ2V0R3VpZCgpKSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFZhcmlhYmlsaXR5RWxlbWVudCkgewotCQkJaWYgKGNvbnRyaWJ1dGVkQmFzZUluU3Vic3RyYWN0ZWQoKFZhcmlhYmlsaXR5RWxlbWVudCkgZWxlbWVudCkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2NvbmZpZ3VyYXRpb24vQ29uZmlndXJhdGlvbkZhY3RvcnkudHh0IGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2NvbmZpZ3VyYXRpb24vQ29uZmlndXJhdGlvbkZhY3RvcnkudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZjdiOGVkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9jb25maWd1cmF0aW9uL0NvbmZpZ3VyYXRpb25GYWN0b3J5LnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDE5MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmV2ZW50cy5JTGlicmFyeUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5FbGVtZW50TGF5b3V0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5zZXJ2aWNlcy5EZXBlbmRlbmN5TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5zZXJ2aWNlcy5MaWJyYXJ5UHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci0KLQotLyoqCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBDb25maWd1cmF0aW9uRmFjdG9yeSB7Ci0KLQlwcm90ZWN0ZWQgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIgYWZjcCA9IG51bGw7Ci0KLQkvLyBtYXAgb2YgTWV0aG9kQ29uZmlndXJhdGlvbiBuYW1lIHRvIENvbmlndXJhdGlvbiBvYmplY3QKLQlwcml2YXRlIE1hcCBjb25maWdNYXAgPSBuZXcgSGFzaE1hcCgpOwotCi0JcHJpdmF0ZSBMaWJyYXJ5UHJvY2Vzc29yIGxpYnJhcnlQcm9jID0gbnVsbDsKLQotCXByaXZhdGUgU3RyaW5nIGN1cnJlbnRDb25maWdOYW1lID0gbnVsbDsKLQotCS8vIG1hcCBvZiBjb25maWcgbmFtZSB0byBsYXlvdXQgbWFuYWdlcgotCS8vIGVhY2ggY29uZmlnIGhhcyBpdCdzIG93biBsYXlvdXQgbWFuYWdlcgotCXByaXZhdGUgTWFwIGxheW91dE1nck1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0KLQlwcml2YXRlIERlcGVuZGVuY3lNYW5hZ2VyIGRlcE1nciA9IG51bGw7Ci0KLQlwdWJsaWMgQ29uZmlndXJhdGlvbkZhY3RvcnkoTGlicmFyeVByb2Nlc3NvciBsaWJyYXJ5UHJvYykgewotCi0JCXRoaXMubGlicmFyeVByb2MgPSBsaWJyYXJ5UHJvYzsKLQotCQlhZmNwID0gbmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKGxpYnJhcnlQcm9jCi0JCQkJLmdldEFkYXB0ZXJGYWN0b3J5KCkpOwotCi0JCWxpYnJhcnlQcm9jLmFkZExpc3RlbmVyKG5ldyBJTGlicmFyeUNoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgbGlicmFyeUNoYW5nZWQoaW50IG9wdGlvbiwgQ29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCQkJaWYgKG9wdGlvbiA9PSBJTGlicmFyeUNoYW5nZUxpc3RlbmVyLk9QVElPTl9DUkVBVEVECi0JCQkJCQl8fCBvcHRpb24gPT0gSUxpYnJhcnlDaGFuZ2VMaXN0ZW5lci5PUFRJT05fTE9BREVEKSB7Ci0JCQkJCWNsZWFyKCk7Ci0JCQkJfQotCQkJfQotCi0JCX0pOwotCi0JCWNsZWFyKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgY2xlYXIoKSB7Ci0JCWN1cnJlbnRDb25maWdOYW1lID0gbnVsbDsKLQkJaWYgKGNvbmZpZ01hcC5zaXplKCkgPiAwKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gY29uZmlnTWFwLnZhbHVlcygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQkoKENvbmZpZ3VyYXRpb25DbG9zdXJlKSBpdC5uZXh0KCkpLmRpc3Bvc2UoKTsKLQkJCX0KLQkJfQotCQljb25maWdNYXAuY2xlYXIoKTsKLQotCQlpZiAobGF5b3V0TWdyTWFwLnNpemUoKSA+IDApIHsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBsYXlvdXRNZ3JNYXAudmFsdWVzKCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCSgoRWxlbWVudExheW91dE1hbmFnZXIpIGl0Lm5leHQoKSkuY2xlYXIoKTsKLQkJCX0KLQkJfQotCi0JCWxheW91dE1nck1hcC5jbGVhcigpOwotCi0JCWlmIChkZXBNZ3IgIT0gbnVsbCkgewotCQkJZGVwTWdyLmNsZWFyKCk7Ci0JCQlkZXBNZ3IgPSBudWxsOwotCQl9Ci0JfQotCi0JcHVibGljIE1ldGhvZExpYnJhcnkgZ2V0TGlicmFyeSgpIHsKLQkJcmV0dXJuIGxpYnJhcnlQcm9jLmdldExpYnJhcnkoKTsKLQl9Ci0KLQlwdWJsaWMgVVJJIGdldExpYnJhcnlVcmkoKSB7Ci0JCXJldHVybiBsaWJyYXJ5UHJvYy5nZXRMaWJyYXJ5VVJJKCk7Ci0JfQotCi0JcHVibGljIEFkYXB0ZXJGYWN0b3J5IGdldEFkYXB0ZXJGYWN0b3J5KCkgewotCQlyZXR1cm4gbGlicmFyeVByb2MuZ2V0QWRhcHRlckZhY3RvcnkoKTsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIgZ2V0Q29udGVudFByb3ZpZGVyKCkgewotCQlyZXR1cm4gYWZjcDsKLQl9Ci0KLQlwdWJsaWMgRGVwZW5kZW5jeU1hbmFnZXIgZ2V0RGVwZW5kZW5jeU1hbmFnZXIoKSB7Ci0JCS8vIHJldHVybiBsaWJyYXJ5UHJvYy5nZXREZXBlbmRlbmN5TWFuYWdlcigpOwotCQlpZiAodGhpcy5kZXBNZ3IgPT0gbnVsbCkgewotCQkJZGVwTWdyID0gbmV3IERlcGVuZGVuY3lNYW5hZ2VyKGxpYnJhcnlQcm9jKTsKLQkJfQotCi0JCXJldHVybiBkZXBNZ3I7Ci0JfQotCi0JcHVibGljIExpc3QgZ2V0TWV0aG9kUGx1Z2lucygpIHsKLQkJTGlzdCBpdGVtcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJRUxpc3QgZWxlbWVudHMgPSBsaWJyYXJ5UHJvYy5nZXRMaWJyYXJ5KCkuZUNvbnRlbnRzKCk7Ci0JCWlmIChlbGVtZW50cyAhPSBudWxsKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gZWxlbWVudHMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCUVPYmplY3QgZWxlbWVudCA9IChFT2JqZWN0KSBpdC5uZXh0KCk7Ci0JCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pIHsKLQkJCQkJaXRlbXMuYWRkKGVsZW1lbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiBpdGVtczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDdXJyZW50Q29uZmlndXJhdGlvbihTdHJpbmcgY29uZmlnTmFtZSkgewotCQl0aGlzLmN1cnJlbnRDb25maWdOYW1lID0gY29uZmlnTmFtZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEN1cnJlbnRDb25maWd1cmF0aW9uKCkgewotCQlyZXR1cm4gY3VycmVudENvbmZpZ05hbWU7Ci0JfQotCi0JcHVibGljIEVsZW1lbnRMYXlvdXRNYW5hZ2VyIGdldExheW91dE1hbmFnZXIoKSB7Ci0JCXJldHVybiBnZXRMYXlvdXRNYW5hZ2VyKHRoaXMuY3VycmVudENvbmZpZ05hbWUpOwotCX0KLQotCXB1YmxpYyBFbGVtZW50TGF5b3V0TWFuYWdlciBnZXRMYXlvdXRNYW5hZ2VyKFN0cmluZyBjb25maWdOYW1lKSB7Ci0JCUVsZW1lbnRMYXlvdXRNYW5hZ2VyIG1nciA9IG51bGw7Ci0JCWlmIChjb25maWdOYW1lID09IG51bGwpIHsKLQkJCW1nciA9IGxpYnJhcnlQcm9jLmdldExheW91dE1hbmFnZXIoKTsKLQkJfSBlbHNlIHsKLQkJCW1nciA9IChFbGVtZW50TGF5b3V0TWFuYWdlcikgbGF5b3V0TWdyTWFwLmdldChjb25maWdOYW1lKTsKLQkJCWlmIChtZ3IgPT0gbnVsbCkgewotCQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gbGlicmFyeVByb2MKLQkJCQkJCS5nZXRDb25maWd1cmF0aW9uKGNvbmZpZ05hbWUpOwotCQkJCW1nciA9IG5ldyBFbGVtZW50TGF5b3V0TWFuYWdlcihjb25maWcpOwotCQkJCWxheW91dE1nck1hcC5wdXQoY29uZmlnTmFtZSwgbWdyKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBtZ3I7Ci0JfQotCi0JcHVibGljIENvbmZpZ3VyYXRpb25DbG9zdXJlIGdldENsb3N1cmUoKSB7Ci0JCXJldHVybiBnZXRDbG9zdXJlKGN1cnJlbnRDb25maWdOYW1lKTsKLQl9Ci0KLQlwdWJsaWMgQ29uZmlndXJhdGlvbkNsb3N1cmUgZ2V0Q2xvc3VyZShTdHJpbmcgY29uZmlnTmFtZSkgewotCQlDb25maWd1cmF0aW9uQ2xvc3VyZSBjb25maWcgPSBudWxsOwotCQlpZiAoY29uZmlnTmFtZSAhPSBudWxsKSB7Ci0JCQljb25maWcgPSAoQ29uZmlndXJhdGlvbkNsb3N1cmUpIGNvbmZpZ01hcC5nZXQoY29uZmlnTmFtZSk7Ci0JCQlpZiAoY29uZmlnID09IG51bGwpIHsKLQkJCQlNZXRob2RDb25maWd1cmF0aW9uIG1vZGVsQ29uZmlnID0gbGlicmFyeVByb2MKLQkJCQkJCS5nZXRDb25maWd1cmF0aW9uKGNvbmZpZ05hbWUpOwotCQkJCWNvbmZpZyA9IG5ldyBDb25maWd1cmF0aW9uQ2xvc3VyZSh0aGlzLCBtb2RlbENvbmZpZyk7Ci0JCQkJY29uZmlnTWFwLnB1dChjb25maWdOYW1lLCBjb25maWcpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGNvbmZpZzsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBtYWtlQ2xvc3VyZSgpIHsKLQkJQ29uZmlndXJhdGlvbkNsb3N1cmUgYyA9IGdldENsb3N1cmUoY3VycmVudENvbmZpZ05hbWUpOwotCQlpZiAoYyAhPSBudWxsKSB7Ci0JCQljLm1ha2VDbG9zdXJlKCk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9jb25maWd1cmF0aW9uL0NvbmZpZ3VyYXRpb25GaWx0ZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9jb25maWd1cmF0aW9uL0NvbmZpZ3VyYXRpb25GaWx0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDNmZjIwZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvY29uZmlndXJhdGlvbi9Db25maWd1cmF0aW9uRmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MTQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5WYXJpYWJpbGl0eUluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5MaWJyYXJ5VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLkxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpc2NpcGxpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaXNjaXBsaW5lR3JvdXBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVTZXRHcm91cGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Ub29sTWVudG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkFzc29jaWF0aW9uSGVscGVyOwotCi0vKioKLSAqIEEgbWV0aG9kIGNvbmZpZ3VyYXRpb24gZmlsdGVyIHRvIGFsbG93IGZpbHRlcmluZyBlbGVtZW50IAotICogYW5kIHJlYWxpemUgdGhlIGVsZW1lbnQgZmVhdHVyZSB2YWx1ZXMgd2l0aGluIGEgY29uZmlndXJhdGlvbi4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBDb25maWd1cmF0aW9uRmlsdGVyIGV4dGVuZHMgQWRhcHRlckltcGwgaW1wbGVtZW50cyBJQ29uZmlndXJhdG9yIHsKLQotCXByb3RlY3RlZCBNZXRob2RDb25maWd1cmF0aW9uIG1ldGhvZENvbmZpZzsJCi0JLy9wcml2YXRlIFZpZXdlciB2aWV3ZXI7Ci0JCi0JLy8gc2V0IHRoZSBkZWZhdWx0IGJlaGF2aW9yIGZvciBjb25maWd1cmF0aW9uIHZpZXcgdG8gdHJ1ZSwgaS5lLiBjb250cmlidXRvcnMgYXJlIGRpc2NhcmRlZC4KLQlwcml2YXRlIGJvb2xlYW4gZGlzY2FyZENvbnRyaWJ1dG9ycyA9IHRydWU7Ci0JCi0KLQkvKioKLQkgKiBjb25zdHJ1Y3RvcgotCSAqIEBwYXJhbSBtZXRob2RDb25maWcgYSA8Y29kZT5NZXRob2RDb25maWd1cmF0aW9uPC9jb2RlPgotCSAqIEBwYXJhbSB2aWV3ZXIgYSA8Y29kZT5WaWV3ZXI8L2NvZGU+Ci0JICovCi0JcHVibGljIENvbmZpZ3VyYXRpb25GaWx0ZXIoTWV0aG9kQ29uZmlndXJhdGlvbiBtZXRob2RDb25maWcpIHsKLQkJdGhpcy5tZXRob2RDb25maWcgPSBtZXRob2RDb25maWc7Ci0JCS8vdGhpcy52aWV3ZXIgPSB2aWV3ZXI7Ci0JfQotCi0JcHVibGljIENvbmZpZ3VyYXRpb25GaWx0ZXIoTWV0aG9kQ29uZmlndXJhdGlvbiBtZXRob2RDb25maWcsIGJvb2xlYW4gZGlzY2FyZENvbnRyaWJ1dG9ycykgewotCQl0aGlzKG1ldGhvZENvbmZpZyk7Ci0JCXRoaXMuZGlzY2FyZENvbnRyaWJ1dG9ycyA9IGRpc2NhcmRDb250cmlidXRvcnM7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyI2FjY2VwdChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBib29sZWFuIGFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCWlmIChtZXRob2RDb25maWcgPT0gbnVsbCkKLQkJCXJldHVybiB0cnVlOwotCi0JCW9iaiA9IExpYnJhcnlVdGlsLnVud3JhcChvYmopOwotCi0JCWlmICggKEVsZW1lbnRSZWFsaXplci5pc0V4dGVuZFJlcGxhY2VFbmFibGVkKCkgfHwgIAotCQkJCShvYmogaW5zdGFuY2VvZiBWYXJpYWJpbGl0eUVsZW1lbnQpICYmIENvbmZpZ3VyYXRpb25IZWxwZXIuaXNFeHRlbmRSZXBsYWNlcigoVmFyaWFiaWxpdHlFbGVtZW50KW9iaikgKQotCQkJCSYmIEZlYXR1cmVWYWx1ZS5pc0JsYW5rSW5kaWNhdG9yKG9iaikgKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJCi0JCWlmIChvYmogaW5zdGFuY2VvZiBNZXRob2RQYWNrYWdlKSB7Ci0JCQlyZXR1cm4gbWV0aG9kQ29uZmlnLmdldE1ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKS5jb250YWlucyhvYmopOwotCQl9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCXJldHVybiBDb25maWd1cmF0aW9uSGVscGVyLmNhblNob3coKE1ldGhvZEVsZW1lbnQpIG9iaiwKLQkJCQkJbWV0aG9kQ29uZmlnKTsKLQkJfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBJdGVtUHJvdmlkZXJBZGFwdGVyKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfSBlbHNlIHsKLQkJCWlmIChMb2cuREVCVUcpIHsKLQkJCQlTeXN0ZW0ub3V0Ci0JCQkJCQkucHJpbnRsbigiT2JqZWN0IGZpbHRlcmVkOiAiICsgKG9iaiA9PSBudWxsID8gbnVsbCA6IG9iai50b1N0cmluZygpKSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCi0JLyoqCi0JICogZ2V0IHRoZSByZWFsaXplZCBjaGlsZHJlbiBmb3IgdGhlIGdpdmVuIG9iamVjdCBhbmQgZmVhdHVyZQotCSAqIAotCSAqIEBwYXJhbSBvYmogT2JqZWN0Ci0JICogQHBhcmFtIGNoaWxkRmVhdHVyZSBFU3RydWN0dXJhbEZlYXR1cmUKLQkgKiAKLQkgKiBAcmV0dXJuIENvbGxlY3Rpb24KLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqLCBFU3RydWN0dXJhbEZlYXR1cmUgY2hpbGRGZWF0dXJlKSB7Ci0JCWlmIChtZXRob2RDb25maWcgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCUVsZW1lbnRSZWFsaXplciByZWFsaXplciA9IERlZmF1bHRFbGVtZW50UmVhbGl6ZXIubmV3RWxlbWVudFJlYWxpemVyKG1ldGhvZENvbmZpZyk7Ci0JCS8vIGRpc2NhcmQgdGhlIGNvbnRyaWJ1dG9ycwotCQlyZWFsaXplci5zZXREaXNjYXJkQ29udHJpYnV0b3IodGhpcy5kaXNjYXJkQ29udHJpYnV0b3JzKTsKLQotCQlpZiAoY2hpbGRGZWF0dXJlICE9IG51bGwgJiYgY2hpbGRGZWF0dXJlLmlzTWFueSgpKSB7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJCUxpc3QgdmFsdWUgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwbkZlYXR1cmVWYWx1ZSgKLQkJCQkJCShNZXRob2RFbGVtZW50KSBvYmosIGNoaWxkRmVhdHVyZSwgcmVhbGl6ZXIpOwotCQkJCXJldHVybiB2YWx1ZTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVySW1wbCNub3RpZnlDaGFuZ2VkKG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbikKLQkgKi8KLS8vCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoZmluYWwgTm90aWZpY2F0aW9uIG1zZykgewotLy8JCWlmICh2aWV3ZXIgPT0gbnVsbCkgewotLy8JCQlyZXR1cm47Ci0vLwkJfQotLy8KLS8vCQlTYWZlVXBkYXRlQ29udHJvbGxlci5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0vLwkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLS8vCQkJCXN3aXRjaCAobXNnLmdldEV2ZW50VHlwZSgpKSB7Ci0vLwkJCQljYXNlIE5vdGlmaWNhdGlvbi5BREQ6Ci0vLwkJCQljYXNlIE5vdGlmaWNhdGlvbi5BRERfTUFOWToKLS8vCQkJCWNhc2UgTm90aWZpY2F0aW9uLlJFTU9WRToKLS8vCQkJCWNhc2UgTm90aWZpY2F0aW9uLlJFTU9WRV9NQU5ZOgotLy8JCQkJCXZpZXdlci5yZWZyZXNoKCk7Ci0vLwkJCQl9Ci0vLwkJCX0KLS8vCQl9KTsKLS8vCi0vLwl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYXRvciNnZXRNZXRob2RDb25maWd1cmF0aW9uKCkKLQkgKi8KLQlwdWJsaWMgTWV0aG9kQ29uZmlndXJhdGlvbiBnZXRNZXRob2RDb25maWd1cmF0aW9uKCkgewotCQlyZXR1cm4gbWV0aG9kQ29uZmlnOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhdG9yI3NldE1ldGhvZENvbmZpZ3VyYXRpb24ob3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1ldGhvZENvbmZpZ3VyYXRpb24oTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLQkJbWV0aG9kQ29uZmlnID0gY29uZmlnOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlc29sdmVFbGVtZW50VmFyaWFiaWxpdHlMaXN0KFZhcmlhYmlsaXR5RWxlbWVudCBlbGVtZW50LAotCQkJVmFyaWFiaWxpdHlJbmZvIGluZm8sIGJvb2xlYW4gaW5jbHVkZUJhc2UsIEVsZW1lbnRSZWFsaXplciByZWFsaXplcikgewotCi0JCWlmIChtZXRob2RDb25maWcgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQkvL3Jlc29sdmUgdG8gaW5jbHVkZSBjb250cmlidXRvcnMKLQkJcmVzb2x2ZUVsZW1lbnRDb250cmlidXRvcnMoZWxlbWVudCxpbmZvLHJlYWxpemVyKTsKLQotCQkvLyBpZiB0aGUgZWxlbWVudCBpcyBhbiBleHRlbmRlZCBlbGVtZW50LCBnZXQgdGhlIGJhc2UgZWxlbWVudCdzCi0JCS8vIGNvbnRyaWJ1dG9ycwotCQkvLyBOT1RFOiB0aGUgYmFzZSBlbGVtZW50IGl0c2VsZiBzaG91bGQgbm90IGJlIGluY2x1ZGVkIHNpbmNlIGl0J3MKLQkJLy8gYWxyZWFkeSBoYW5kbGVkCi0JCS8vIGluIHRoZSBhY3Rpdml0eSByZWFsaXp0aW9uIGluIEl0ZW1Qcm92aWRlcnMuCi0JCWlmIChDb25maWd1cmF0aW9uSGVscGVyLmlzRXh0ZW5kZXIoZWxlbWVudCkpIHsKLQkJCU1ldGhvZEVsZW1lbnQgYmFzZSA9IGVsZW1lbnQuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpOwotCQkJVmFyaWFiaWxpdHlFbGVtZW50IGUgPSAoVmFyaWFiaWxpdHlFbGVtZW50KSBDb25maWd1cmF0aW9uSGVscGVyCi0JCQkJCS5nZXRDYWxjdWxhdGVkRWxlbWVudChiYXNlLCByZWFsaXplcik7Ci0KLQkJCS8vIGlmIGluY2x1ZGViYXNlIGlzIHRydWUsIGFkZCB0aGUgZWxlbWVudCB0byB0aGUgaW5oZXJpdGFuY2UgbGlzdAotCQkJaWYgKGluY2x1ZGVCYXNlKSB7Ci0JCQkJTGlzdCB2YWx1ZXMgPSBpbmZvLmdldEluaGVyaXRhbmNlTGlzdCgpOwotCQkJCWlmICghdmFsdWVzLmNvbnRhaW5zKGUpKSB7Ci0JCQkJCXZhbHVlcy5hZGQoZSk7Ci0JCQkJfQotCQkJfQotCi0JCQkvLyByZXNvbHZlIHRoZSBiYXNlIHRvIGluY2x1ZGUgYWRkaXRpb25hbCBjb250cmlidXRvcnMgYW5kL29yIGJhc2UKLQkJCXJlc29sdmVFbGVtZW50VmFyaWFiaWxpdHlMaXN0KGUsIGluZm8sIGluY2x1ZGVCYXNlLCByZWFsaXplcik7Ci0KLQkJfQotCi0JfQotCQotCXByb3RlY3RlZCB2b2lkIHJlc29sdmVFbGVtZW50Q29udHJpYnV0b3JzKFZhcmlhYmlsaXR5RWxlbWVudCBlbGVtZW50LAotCQkJVmFyaWFiaWxpdHlJbmZvIGluZm8sIEVsZW1lbnRSZWFsaXplciByZWFsaXplcil7Ci0JCS8vIGlmIHRoZSBlbGVtZW50IGhhcyBjb250cmlidXRvcnMgaW4gdGhlIGNvbmZpZ3VyYXRpb24sIGdldCB0aGUKLQkJLy8gcmVmZXJlbmNlIHByb3BlcnRpZXMKLQkJLy8gaWYgYSBjb250cmlidXRvciBoYXMgcmVwbGFjZXIsIGl0J3MgcmVwbGFjZXIgaXMgdXNlZAotCQlMaXN0IGl0ZW1zID0gQ29uZmlndXJhdGlvbkhlbHBlci5nZXRDb250cmlidXRvcnMoZWxlbWVudCwgbWV0aG9kQ29uZmlnKTsKLQkJaWYgKGl0ZW1zICE9IG51bGwgJiYgaXRlbXMuc2l6ZSgpID4gMCkgewotCQkJZm9yIChJdGVyYXRvciBpdCA9IGl0ZW1zLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlWYXJpYWJpbGl0eUVsZW1lbnQgZSA9IChWYXJpYWJpbGl0eUVsZW1lbnQpIGl0Lm5leHQoKTsKLQkJCQlMaXN0IHZhbHVlcyA9IGluZm8uZ2V0Q29udHJpYnV0b3JzKCk7Ci0JCQkJaWYgKCF2YWx1ZXMuY29udGFpbnMoZSkpIHsKLQkJCQkJdmFsdWVzLmFkZChlKTsKLQkJCQl9Ci0JCQkJcmVzb2x2ZUVsZW1lbnRWYXJpYWJpbGl0eUxpc3QoZSwgaW5mbywgZmFsc2UsIHJlYWxpemVyKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qCi0JICogcmVzb2x2ZSB0aGUgdmFyaWFiaWxpdHkgb2YgdGhlIGVsZW1lbnQgYW5kIGdldCBhIGxpc3Qgb2YgY29udHJpYnV0b3JzLgotCSAqIAotCSAqIFRoaXMgbWV0aG9kIGlzIHVzZWQgZm9yIHJlYWxpemluZyBhY3RpdGl2eSBicmVha2Rvd24gZWxlbWVudHMgaW4gdGhlCi0JICogaXRlbVByb3ZpZGVycy4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYXRvciNnZXRWYXJpYWJpbGl0eUluZm8ob3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQpCi0JICovCi0JcHVibGljIFZhcmlhYmlsaXR5SW5mbyBnZXRWYXJpYWJpbGl0eUluZm8oVmFyaWFiaWxpdHlFbGVtZW50IHZlKSB7Ci0KLQkJLy8gY2FsY3VsYXRlIHRoZSBlbGVtZW50IGZpcnN0Ci0JCUVsZW1lbnRSZWFsaXplciByZWFsaXplciA9IERlZmF1bHRFbGVtZW50UmVhbGl6ZXIubmV3RWxlbWVudFJlYWxpemVyKG1ldGhvZENvbmZpZywgdHJ1ZSwgdHJ1ZSk7Ci0JCXJldHVybiBnZXRWYXJpYWJpbGl0eUluZm8odmUsIHJlYWxpemVyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgVmFyaWFiaWxpdHlJbmZvIGdldFZhcmlhYmlsaXR5SW5mbyhWYXJpYWJpbGl0eUVsZW1lbnQgdmUsIEVsZW1lbnRSZWFsaXplciByZWFsaXplcikgewotCi0JCS8vIGNhbGN1bGF0ZSB0aGUgZWxlbWVudCBmaXJzdAotCQlWYXJpYWJpbGl0eUVsZW1lbnQgZSA9IChWYXJpYWJpbGl0eUVsZW1lbnQpIENvbmZpZ3VyYXRpb25IZWxwZXIKLQkJCQkuZ2V0Q2FsY3VsYXRlZEVsZW1lbnQodmUsIHJlYWxpemVyKTsKLQotCQlpZiAoZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCVZhcmlhYmlsaXR5SW5mbyBpbmZvID0gbmV3IFZhcmlhYmlsaXR5SW5mbyh2ZSk7Ci0JCWluZm8uZ2V0SW5oZXJpdGFuY2VMaXN0KCkuYWRkKGUpOwotCi0JCXJlc29sdmVFbGVtZW50VmFyaWFiaWxpdHlMaXN0KGUsIGluZm8sIHRydWUsIHJlYWxpemVyKTsKLQotCQlyZXR1cm4gaW5mbzsKLQl9Ci0JCi0JcHVibGljIE9iamVjdCByZXNvbHZlKE9iamVjdCBlbGVtZW50KSB7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgVmFyaWFiaWxpdHlFbGVtZW50KSB7Ci0JCQlFbGVtZW50UmVhbGl6ZXIgcmVhbGl6ZXIgPSBEZWZhdWx0RWxlbWVudFJlYWxpemVyLm5ld0VsZW1lbnRSZWFsaXplcihtZXRob2RDb25maWcsIHRydWUsIHRydWUpOwotCQkJcmV0dXJuIENvbmZpZ3VyYXRpb25IZWxwZXIuZ2V0Q2FsY3VsYXRlZEVsZW1lbnQoCi0JCQkJCShNZXRob2RFbGVtZW50KSBlbGVtZW50LCByZWFsaXplcik7Ci0JCX0KLQkJcmV0dXJuIGVsZW1lbnQ7Ci0JfQotCQotCQotCS8qKgotCSAqIGdldCBmaWx0ZXIgZm9yIHVuY2F0ZWdvcml6ZWQgdGFza3MKLQkgKiAKLQkgKiBAcmV0dXJuIElGaWx0ZXIKLQkgKi8KLQlwdWJsaWMgSUZpbHRlciBnZXRVbmNhdGVnb3JpemVkVGFza0ZpbHRlcigpIHsKLQkJcmV0dXJuIG5ldyBJRmlsdGVyKCkgewotCQkJcHVibGljIGJvb2xlYW4gYWNjZXB0KE9iamVjdCBvYmopIHsKLQkJCQkvLyAxNTg5MjQgLSB3cm9uZyBjYXRlZ29yaWVzIGluIGNvbmZpZ3VyYXRpb24gdmlldwotCQkJCS8vIHNob3VsZCB1c2UgdGhlIGRlZmF1bHQgcmVhbGl6ZXIKLQkJCQkvLyB3ZSBzaG91bGQgbm90IGRpc2NhcmQgdGhlIGRpc2NpcGxpbmUgY29udHJpYnV0b3JzIAotCQkJCS8vIGluc3RlYWQgc2hvdWxkIHJlYWxpemUgdG8gdGhlIGJhc2UgZGlzY2lwbGluZQotCQkJCXJldHVybiAoIG9iaiBpbnN0YW5jZW9mIFRhc2sgKSAmJiAKLQkJCQkJQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMG5GZWF0dXJlVmFsdWUoCi0JCQkJCQkJKFRhc2spb2JqLCAKLQkJCQkJCQlBc3NvY2lhdGlvbkhlbHBlci5UYXNrX0Rpc2NpcGxpbmVzLCAKLQkJCQkJCQlEZWZhdWx0RWxlbWVudFJlYWxpemVyLm5ld0VsZW1lbnRSZWFsaXplcihtZXRob2RDb25maWcpKS5pc0VtcHR5KCk7CQkJCQkKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JLyoqCi0JICogZ2V0IGZpbHRlciBmb3Igd29ya3Byb2R1Y3RzIHdpdGhvdXQgYSBkb21haW4KLQkgKiAKLQkgKiBAcmV0dXJuIElGaWx0ZXIKLQkgKi8KLQlwdWJsaWMgSUZpbHRlciBnZXREb21haW5VbmNhdGVnb3JpemVkV29ya1Byb2R1Y3RGaWx0ZXIoKXsKLQkJcmV0dXJuIG5ldyBJRmlsdGVyKCkgewotCQkJcHVibGljIGJvb2xlYW4gYWNjZXB0KE9iamVjdCBvYmopIHsKLQkJCQkvLyAxNTg5MjQgLSB3cm9uZyBjYXRlZ29yaWVzIGluIGNvbmZpZ3VyYXRpb24gdmlldwotCQkJCS8vIHNob3VsZCB1c2UgdGhlIGRlZmF1bHQgcmVhbGl6ZXIKLQkJCQkvLyB3ZSBzaG91bGQgbm90IGRpc2NhcmQgdGhlIGRvbWFpbiBjb250cmlidXRvcnMgCi0JCQkJLy8gaW5zdGVhZCBzaG91bGQgcmVhbGl6ZSB0byB0aGUgYmFzZSBkb21haW4KLQkJCQlyZXR1cm4gKCBvYmogaW5zdGFuY2VvZiBXb3JrUHJvZHVjdCApICYmIAotCQkJCQlDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwbkZlYXR1cmVWYWx1ZSgKLQkJCQkJCQkoV29ya1Byb2R1Y3Qpb2JqLCAKLQkJCQkJCQlBc3NvY2lhdGlvbkhlbHBlci5Xb3JrUHJvZHVjdF9Eb21haW5zLCAKLQkJCQkJCQlEZWZhdWx0RWxlbWVudFJlYWxpemVyLm5ld0VsZW1lbnRSZWFsaXplcihtZXRob2RDb25maWcpKS5pc0VtcHR5KCk7CQkJCQkKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JLyoqCi0JICogZ2V0IGZpbHRlciBmb3Igd29ya3Byb2R1Y3RzIHdpdGhvdXQgYSBXUCBUeXBlCi0JICogCi0JICogQHJldHVybiBJRmlsdGVyCi0JICovCi0JcHVibGljIElGaWx0ZXIgZ2V0V3BUeXBlVW5jYXRlZ29yaXplZFdvcmtQcm9kdWN0RmlsdGVyKCl7Ci0JCXJldHVybiBuZXcgSUZpbHRlcigpIHsKLQkJCXB1YmxpYyBib29sZWFuIGFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCQkJLy8gMTU4OTI0IC0gd3JvbmcgY2F0ZWdvcmllcyBpbiBjb25maWd1cmF0aW9uIHZpZXcKLQkJCQkvLyBzaG91bGQgdXNlIHRoZSBkZWZhdWx0IHJlYWxpemVyCi0JCQkJLy8gd2Ugc2hvdWxkIG5vdCBkaXNjYXJkIHRoZSBXUFR5cGUgY29udHJpYnV0b3JzIAotCQkJCS8vIGluc3RlYWQgc2hvdWxkIHJlYWxpemUgdG8gdGhlIGJhc2UgCi0JCQkJcmV0dXJuICggb2JqIGluc3RhbmNlb2YgV29ya1Byb2R1Y3QgKSAmJiAKLQkJCQkJQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMG5GZWF0dXJlVmFsdWUoCi0JCQkJCQkJKFdvcmtQcm9kdWN0KW9iaiwgCi0JCQkJCQkJQXNzb2NpYXRpb25IZWxwZXIuV29ya1Byb2R1Y3RfV29ya1Byb2R1Y3RUeXBlcywgCi0JCQkJCQkJRGVmYXVsdEVsZW1lbnRSZWFsaXplci5uZXdFbGVtZW50UmVhbGl6ZXIobWV0aG9kQ29uZmlnKSkuaXNFbXB0eSgpOwkJCQkJCi0JCQl9Ci0JCX07Ci0JfQotCQotCS8qKgotCSAqIGdldCBmaWx0ZXIgZm9yIHVuY2F0ZWdvcml6ZWQgcm9sZXMKLQkgKiAKLQkgKiBAcmV0dXJuIElGaWx0ZXIKLQkgKi8KLQlwdWJsaWMgSUZpbHRlciBnZXRVbmNhdGVnb3JpemVkUm9sZUZpbHRlcigpewotCQlyZXR1cm4gbmV3IElGaWx0ZXIoKSB7Ci0JCQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoT2JqZWN0IG9iaikgewotCQkJCS8vIDE1ODkyNCAtIHdyb25nIGNhdGVnb3JpZXMgaW4gY29uZmlndXJhdGlvbiB2aWV3Ci0JCQkJLy8gc2hvdWxkIHVzZSB0aGUgZGVmYXVsdCByZWFsaXplcgotCQkJCS8vIHdlIHNob3VsZCBub3QgZGlzY2FyZCB0aGUgcm9sZXNldCBjb250cmlidXRvcnMgCi0JCQkJLy8gaW5zdGVhZCBzaG91bGQgcmVhbGl6ZSB0byB0aGUgYmFzZSAKLQkJCQlyZXR1cm4gKCBvYmogaW5zdGFuY2VvZiBSb2xlICkgJiYgCi0JCQkJCUNvbmZpZ3VyYXRpb25IZWxwZXIuY2FsYzBuRmVhdHVyZVZhbHVlKAotCQkJCQkJCShSb2xlKW9iaiwgCi0JCQkJCQkJQXNzb2NpYXRpb25IZWxwZXIuUm9sZV9Sb2xlU2V0cywgCi0JCQkJCQkJRGVmYXVsdEVsZW1lbnRSZWFsaXplci5uZXdFbGVtZW50UmVhbGl6ZXIobWV0aG9kQ29uZmlnKSkuaXNFbXB0eSgpOwkJCQkJCi0JCQl9Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogZ2V0IGZpbHRlciBmb3IgdW5jYXRlZ29yaXplZCB0b29sIG1lbnRvcnMKLQkgKiAKLQkgKiBAcmV0dXJuIElGaWx0ZXIKLQkgKi8KLQlwdWJsaWMgSUZpbHRlciBnZXRVbmNhdGVnb3JpemVkVG9vbE1lbnRvckZpbHRlcigpIHsKLQkJcmV0dXJuIG5ldyBJRmlsdGVyKCkgewotCQkJcHVibGljIGJvb2xlYW4gYWNjZXB0KE9iamVjdCBvYmopIHsKLQkJCQkvLyAxNTg5MjQgLSB3cm9uZyBjYXRlZ29yaWVzIGluIGNvbmZpZ3VyYXRpb24gdmlldwotCQkJCS8vIHNob3VsZCB1c2UgdGhlIGRlZmF1bHQgcmVhbGl6ZXIKLQkJCQkvLyB3ZSBzaG91bGQgbm90IGRpc2NhcmQgdGhlIHRvb2wgY29udHJpYnV0b3JzIAotCQkJCS8vIGluc3RlYWQgc2hvdWxkIHJlYWxpemUgdG8gdGhlIGJhc2UgCi0JCQkJcmV0dXJuICggb2JqIGluc3RhbmNlb2YgVG9vbE1lbnRvciApICYmIAotCQkJCQlDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwbkZlYXR1cmVWYWx1ZSgKLQkJCQkJCQkoVG9vbE1lbnRvcilvYmosIAotCQkJCQkJCUFzc29jaWF0aW9uSGVscGVyLlRvb2xNZW50b3JfVG9vbHMsIAotCQkJCQkJCURlZmF1bHRFbGVtZW50UmVhbGl6ZXIubmV3RWxlbWVudFJlYWxpemVyKG1ldGhvZENvbmZpZykpLmlzRW1wdHkoKTsJCQkJCQotCQkJfQotCQl9OwotCX0KLQkKLQkvKioKLQkgKiBnZXQgZmlsdGVyIGZvciBkaXNjaXBsaW5lcyBhbmQgZGlzcGxpbmUgZ3JvdXBpbmdzCi0JICogCi0JICogQHJldHVybiBJRmlsdGVyCi0JICovCi0JcHVibGljIElGaWx0ZXIgZ2V0RGlzY2lwbGluZXNGaWx0ZXIoKSB7Ci0JCXJldHVybiBuZXcgSUZpbHRlcigpIHsKLQkJCXB1YmxpYyBib29sZWFuIGFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCQkJLy8gW0J1ZyAxNjI2MDNdIE5ldzogUmVwbGFjaW5nIGRpc2NpcGxpbmVzIGRvIGFwcGVhciBpbnNpZGUgdGhlaXIgcmVwbGFjZWQgZWxlbWVudHMgZGlzY2lwbGluZSBncm91cGluZ3MgCi0JCQkJLy8gYXMgd2VsbCBhcyBvdXRzaWRlIG9mIHRoZSBkaXNjaXBsaW5lIGdyb3VwaW5nCi0JCQkJaWYgKCBvYmogaW5zdGFuY2VvZiBEaXNjaXBsaW5lR3JvdXBpbmcgKSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCQkKLQkJCQlyZXR1cm4gKCBvYmogaW5zdGFuY2VvZiBEaXNjaXBsaW5lICkgJiYgCi0JCQkJQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMG5GZWF0dXJlVmFsdWUoCi0JCQkJCQkoTWV0aG9kRWxlbWVudClvYmosIAotCQkJCQkJQXNzb2NpYXRpb25IZWxwZXIuRGlzY2lwbGluZV9EaXNjaXBsaW5lR3JvdXBpbmdzLCAKLQkJCQkJCURlZmF1bHRFbGVtZW50UmVhbGl6ZXIubmV3RWxlbWVudFJlYWxpemVyKG1ldGhvZENvbmZpZykpLmlzRW1wdHkoKTsJCQkJCQotCQkJfQotCQl9OwotCX0KLQkKLQkvKioKLQkgKiBnZXQgZmlsdGVyIGZvciByb2xlc2V0cyBhbmQgcm9sZXNldCBncm91cGluZ3MKLQkgKiAKLQkgKiBAcmV0dXJuIElGaWx0ZXIKLQkgKi8KLQlwdWJsaWMgSUZpbHRlciBnZXRSb2xlU2V0c0ZpbHRlcigpIHsKLQkJcmV0dXJuIG5ldyBJRmlsdGVyKCkgewotCQkJcHVibGljIGJvb2xlYW4gYWNjZXB0KE9iamVjdCBvYmopIHsKLQkJCQkvLyBbQnVnIDE2MjYwM10gTmV3OiBSZXBsYWNpbmcgZGlzY2lwbGluZXMgZG8gYXBwZWFyIGluc2lkZSB0aGVpciByZXBsYWNlZCBlbGVtZW50cyBkaXNjaXBsaW5lIGdyb3VwaW5ncyAKLQkJCQkvLyBhcyB3ZWxsIGFzIG91dHNpZGUgb2YgdGhlIGRpc2NpcGxpbmUgZ3JvdXBpbmcKLQkJCQkvLyBzYW1lIGZvciByb2xlc2V0IGdyb3VwaW5nCi0JCQkJaWYgKCBvYmogaW5zdGFuY2VvZiBSb2xlU2V0R3JvdXBpbmcgKSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCQkKLQkJCQlyZXR1cm4gKCBvYmogaW5zdGFuY2VvZiBSb2xlU2V0ICkgJiYgCi0JCQkJCUNvbmZpZ3VyYXRpb25IZWxwZXIuY2FsYzBuRmVhdHVyZVZhbHVlKAotCQkJCQkJCShNZXRob2RFbGVtZW50KW9iaiwgCi0JCQkJCQkJQXNzb2NpYXRpb25IZWxwZXIuUm9sZVNldF9Sb2xlU2V0R3JvdXBwaW5ncywgCi0JCQkJCQkJRGVmYXVsdEVsZW1lbnRSZWFsaXplci5uZXdFbGVtZW50UmVhbGl6ZXIobWV0aG9kQ29uZmlnKSkuaXNFbXB0eSgpOwkJCQkJCi0JCQl9Ci0JCX07Ci0JfQotCQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9jb25maWd1cmF0aW9uL0NvbmZpZ3VyYXRpb25IZWxwZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9jb25maWd1cmF0aW9uL0NvbmZpZ3VyYXRpb25IZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDg1MWUxZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvY29uZmlndXJhdGlvbi9Db25maWd1cmF0aW9uSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjcxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb247Ci0KLWltcG9ydCBqYXZhLm5ldC5VUkk7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlRyZWVTZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5FeHRlbnNpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5TdHJVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkNvbmZpZ0hlbHBlckRlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5QcmVzZW50YXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5DYXRlZ29yeVNvcnRIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlNlY3Rpb25MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuTGlicmFyeVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5SZXNvdXJjZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQXJ0aWZhY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DYXBhYmlsaXR5UGF0dGVybjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcnlQcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpYmFibGVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRnVsZmlsbGFibGVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJhY3RpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5TdXBwb3J0aW5nTWF0ZXJpYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS5pbXBsLk11bHRpUmVzb3VyY2VFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUudXRpbC5PcHBvc2l0ZUZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkFzc29jaWF0aW9uSGVscGVyOwotCi0KLS8qKgotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIFdlaXBpbmcgTHUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIENvbmZpZ3VyYXRpb25IZWxwZXIgewotCQotCXByaXZhdGUgc3RhdGljIENvbmZpZ0hlbHBlckRlbGVnYXRlIGRlbGVnYXRlOwotCi0Jc3RhdGljIHsKLQkJQ29uZmlnSGVscGVyRGVsZWdhdGUgZXh0ZW5kZWREZWxlZ2F0ZSA9IChDb25maWdIZWxwZXJEZWxlZ2F0ZSkgRXh0ZW5zaW9uSGVscGVyCi0JCQkJLmdldEV4dGVuc2lvbihMaWJyYXJ5UGx1Z2luLmdldERlZmF1bHQoKS5nZXRJZCgpLAotCQkJCQkJImNvbmZpZ0hlbHBlckRlbGVnYXRlRXh0Iik7Ly8kTk9OLU5MUy0xJAotCQlpZiAoZXh0ZW5kZWREZWxlZ2F0ZSA9PSBudWxsKSB7Ci0JCQlkZWxlZ2F0ZSA9IG5ldyBDb25maWdIZWxwZXJEZWxlZ2F0ZSgpOwotCQl9IGVsc2UgewotCQkJZGVsZWdhdGUgPSBleHRlbmRlZERlbGVnYXRlOwotCQl9Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgQ29uZmlnSGVscGVyRGVsZWdhdGUgZ2V0RGVsZWdhdGUoKSB7Ci0JCXJldHVybiBkZWxlZ2F0ZTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpbmhlcml0aW5nU2xvdEZlYXR1cmVzID0gZmFsc2U7IAotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJJQlVURV9WQUxVRV9TRVBFUkFUT1IgPSAiPHAvPiI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gZGVidWcgPSBMaWJyYXJ5UGx1Z2luLmdldERlZmF1bHQoKS5pc0RlYnVnZ2luZygpOwotCi0JLyoqCi0JICogY2hlY2sgaWYgdGhlIGVsZW1lbnQgaXMgYSBDb250ZW50RGVzY3JpcHRpb24KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudCB7QGxpbmsgTWV0aG9kRWxlbWVudH0KLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNEZXNjcmlwdGlvbkVsZW1lbnQoTWV0aG9kRWxlbWVudCBlbGVtZW50KSB7Ci0JCWlmICggZWxlbWVudCA9PSBudWxsICkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCQotCQlyZXR1cm4gKGVsZW1lbnQgaW5zdGFuY2VvZiBDb250ZW50RGVzY3JpcHRpb24gfHwgZWxlbWVudC5lQ29udGFpbmVyKCkgaW5zdGFuY2VvZiBDb250ZW50RGVzY3JpcHRpb24pOwotCi0JfQotCi0JLyoqCi0JICogY2hlY2sgaWYgdGhlIG1ldGhvZCBwYWNqPWthZ2UgaXMgYSBnbG9iYWwgcGFja2FnZQotCSAqIAotCSAqIEBwYXJhbSBwa2cge0BsaW5rIE1ldGhvZFBhY2thZ2V9Ci0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzR2xvYmFsUGFja2FnZShNZXRob2RQYWNrYWdlIHBrZykgewotCQlpZiAocGtnID09IG51bGwpIHsKLQkJCWlmIChkZWJ1ZykgewotCQkJCVN5c3RlbS5vdXQKLQkJCQkJCS5wcmludGxuKCJDb25maWd1cmF0aW9uSGVscGVyLmlzR2xvYmFsUGFja2FnZTogbWV0aG9kIHBhY2thZ2UgaXMgbnVsbCIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlNZXRob2RQbHVnaW4gcCA9IExpYnJhcnlVdGlsLmdldE1ldGhvZFBsdWdpbihwa2cpOwotCQlpZiAocCA9PSBudWxsKSB7Ci0JCQlpZiAoZGVidWcpIHsKLQkJCQlTeXN0ZW0ub3V0Ci0JCQkJCQkucHJpbnRsbigiQ29uZmlndXJhdGlvbkhlbHBlci5pc0dsb2JhbFBhY2thZ2U6IFVuYWJsZSB0byBmaW5kIG1ldGhvZCBwbHVnLWluIGZvciAiICsgcGtnLmdldE5hbWUoKSArICI6ICIgKyBwa2cuZ2V0R3VpZCgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQl9Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlyZXR1cm4gZ2V0RGVsZWdhdGUoKS5pc1N5c3RlbVBhY2thZ2UocCwgcGtnKTsKLQl9Ci0KLQkvKioKLQkgKiBjaGVjayBpZiB0aGUgZWxlbWVudCBpcyBpbiB0aGUgY29uZmlndXJhdGlvbgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogQHBhcmFtIGNvbmZpZwotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaW5Db25maWcoTWV0aG9kRWxlbWVudCBlbGVtZW50LAotCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLQkJcmV0dXJuIGluQ29uZmlnKGVsZW1lbnQsIGNvbmZpZywgdHJ1ZSk7Ci0JfQotCQotCQotCS8qKgotCSAqIGNoZWNrIGlmIHRoZSBlbGVtZW50IGlzIGluIHRoZSBjb25maWd1cmF0aW9uCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiBAcGFyYW0gY29uZmlnCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpbkNvbmZpZyhNZXRob2RFbGVtZW50IGVsZW1lbnQsCi0JCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZywgYm9vbGVhbiBjaGVja1N1YnRyYWN0ZWQpIHsKLQkJcmV0dXJuIGluQ29uZmlnKGVsZW1lbnQsIGNvbmZpZywgY2hlY2tTdWJ0cmFjdGVkLCB0cnVlKTsKLQl9Ci0JCi0JLyoqCi0JICogY2hlY2sgaWYgdGhlIGVsZW1lbnQgaXMgaW4gdGhlIGNvbmZpZ3VyYXRpb24KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqIEBwYXJhbSBjb25maWcKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGluQ29uZmlnKE1ldGhvZEVsZW1lbnQgZWxlbWVudCwKLQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnLCBib29sZWFuIGNoZWNrU3VidHJhY3RlZCwgYm9vbGVhbiBjaGVja0Jhc2UpIHsKLQkJaWYgKCFpc093bmVyU2VsZWN0ZWQoZWxlbWVudCwgY29uZmlnLCBjaGVja1N1YnRyYWN0ZWQpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQkvL0J1ZyAyMDc0MjkgLSBDb25maWdyYXRpb246IFdhcnJpbmcgaW5mbyBzaG91bGQgc2hvd24gd2hlbiBkZXNlbGVjdCB0aGUgcmVwbGFjZWQgZWxlbWVudAotCQkvLyBmb3IgY29uZmlndXJhdGlvbiBjbG9zdXJlIGNoZWNraW5nLCB0aGUgbWlzc2luZyBiYXNlIHNob3VsZCBiZSByZXBvcnRlZCAKLQkJLy8gc28gdGhlIGVsZW1lbnQgYmVlbiBjaGVja2VkIHN0aWxsIHRyZWF0ZWQgYXMgaW4gY29uZmlnCi0JCS8vIGFkZGVkIHRoZSBjaGVja0Jhc2UgZmxhZyB0byBpZ25vcmUgdGhlIGJhc2UgY2hlY2tpbmcKLQkJLy8gZm9yIGNvbmZpZ3VyYXRpb24gcmVhbGl6YXRpb24sIHRoaXMgZmxhZyBzaG91bGQgYmUgc2V0IHRvIHRydWUKLQkJLy8gc28gdGhlIHJlcGxhY2VyIG1pc3NpbmcgYmFzZSBpcyBub3QgaW5jbHVkZWQgaW4gdGhlIGNvbmZpZy4KLQkJCi0JCS8vIGlmIHRoZSBlbGVtZW50IGlzIGEgcmVwYWxjZXIsIGFuZCBpdCdzIGJhc2UgZWxlbWVudCBoYXMgbW9yZSB0aGFuIG9uZQotCQkvLyByZXBsYWNlcgotCQkvLyBub25lIG9mIHRoZSByZXBsYWNlcnMgc2hvdWxkIGJlIGluY2x1ZGVkIGludG8gdGhlIGNvbmZpZ3VyYXRpb24KLQkJaWYgKGNoZWNrQmFzZSAmJiAoZWxlbWVudCBpbnN0YW5jZW9mIFZhcmlhYmlsaXR5RWxlbWVudCkgKSB7Ci0JCQlWYXJpYWJpbGl0eUVsZW1lbnQgdmUgPSAoVmFyaWFiaWxpdHlFbGVtZW50KSBlbGVtZW50OwotCQkJaWYgKGlzUmVwbGFjZXIodmUpKSB7Ci0JCQkJVmFyaWFiaWxpdHlFbGVtZW50IGJhc2UgPSB2ZS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCk7Ci0JCQkJaWYgKGluQ29uZmlnKGJhc2UsIGNvbmZpZykpIHsKLQkJCQkJCi0vLwkJCQkJLy8gSW52YWxpZCBob3RzcG90IGNyZWF0ZWQgZm9yIGxvY2FsbHkgcmVwbGFjZWQgYWN0aXZpdHkgaW4gYWN0aXZpdHkgZGlhZ3JhbQotLy8JCQkJCS8vIHRoaXMgaXMgYmVjYXVzZSB0aGUgYWN0aXZpdHkgaGFzIG1vcmUgdGhhbiBvbmUgbG9jYWwgcmVwbGFjZXJzCi0vLwkJCQkJLy8gaW4gdmVyc2lvbiA3LjAsIGxvY2FsIHJlcGxhY2VtZW50IGlzIG1vZGVsZWQgdGhlIHNhbWUgd2F5IGFzIG5vbWFsIHJlcGxhY2VtZW50Ci0vLwkJCQkJLy8gd2UgbmVlZCB0byBpZ25vcmUgdGhpcyBjaGVja2luZyBmb3IgYWN0aXZpdHkKLS8vCQkJCQlpZiAoIGVsZW1lbnQgaW5zdGFuY2VvZiBBY3Rpdml0eSApIHsKLS8vCQkJCQkJcmV0dXJuIHRydWU7Ci0vLwkJCQkJfQotCQkJCQkKLQkJCQkJZm9yIChJdGVyYXRvciBpdCA9IEFzc29jaWF0aW9uSGVscGVyLmdldEltbWVkaWF0ZVZhcmlldGllcygKLQkJCQkJCQliYXNlKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlWYXJpYWJpbGl0eUVsZW1lbnQgZSA9IChWYXJpYWJpbGl0eUVsZW1lbnQpIGl0Lm5leHQoKTsKLQkJCQkJCWlmICgoZSAhPSBlbGVtZW50KQotCQkJCQkJCQkmJiAoZS5nZXRWYXJpYWJpbGl0eVR5cGUoKSA9PSBWYXJpYWJpbGl0eVR5cGUuUkVQTEFDRVMpCi0JCQkJCQkJCSYmIGlzT3duZXJTZWxlY3RlZChlLCBjb25maWcsIGNoZWNrU3VidHJhY3RlZCkpIHsKLQkJCQkJCQlpZiAoZGVidWcpIHsKLQkJCQkJCQkJU3lzdGVtLm91dAotCQkJCQkJCQkJCS5wcmludGxuKCJDb25maWd1cmF0aW9uSGVscGVyLmluQ29uZmlnOiBJZ25vcmluZyByZXBsYWNpbmcgZWxlbWVudCAnIiArIExpYnJhcnlVdGlsLmdldFR5cGVOYW1lKGVsZW1lbnQpICsgIicgc2luY2UgaXRzIGJhc2UgZWxlbWVudCBoYXMgbW9yZSB0aGFuIG9uZSByZXBsYWNlciBpbiB0aGUgY29uZmlndXJhdGlvbiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCQl9Ci0JCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJcmV0dXJuIGZhbHNlOyAgLy8gYmFzZSBtdXN0IGJlIGluIHRoZSBjb25maWd1cmF0aW9uCi0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc093bmVyU2VsZWN0ZWQoTWV0aG9kRWxlbWVudCBlbGVtZW50LAotCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcsIGJvb2xlYW4gY2hlY2tTdWJ0cmFjdGVkKSB7Ci0JCXJldHVybiBnZXREZWxlZ2F0ZSgpLmlzT3duZXJTZWxlY3RlZChlbGVtZW50LCBjb25maWcsIGNoZWNrU3VidHJhY3RlZCk7Ci0JfQotCi0JLyoqCi0JICogaXMgdGhlIGVsZW1lbnQgYSBjb250cmlidXRvcj8KLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0NvbnRyaWJ1dG9yKFZhcmlhYmlsaXR5RWxlbWVudCBlbGVtZW50KSB7Ci0JCWlmIChlbGVtZW50ID09IG51bGwgfHwgZWxlbWVudC5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlyZXR1cm4gZWxlbWVudC5nZXRWYXJpYWJpbGl0eVR5cGUoKSA9PSBWYXJpYWJpbGl0eVR5cGUuQ09OVFJJQlVURVM7Ci0JfQotCi0JLyoqCi0JICogaXMgdGhlIGVsZW1lbnQgYSByZXBsYWNlcj8KLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1JlcGxhY2VyKFZhcmlhYmlsaXR5RWxlbWVudCBlbGVtZW50KSB7Ci0JCWlmIChlbGVtZW50ID09IG51bGwgfHwgZWxlbWVudC5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlyZXR1cm4gZWxlbWVudC5nZXRWYXJpYWJpbGl0eVR5cGUoKSA9PSBWYXJpYWJpbGl0eVR5cGUuUkVQTEFDRVM7Ci0JfQotCQotCS8qKgotCSAqIGlzICJiIiBhbiBhbmNlc3RvciBvZiAiYSIgdGhyb3VnaCBhICJjb250cmlidXRlIGNoYWluIiByZWxhdGlvbnNoaXAKLQkgKiBAcGFyYW0gYQotCSAqIEBwYXJhbSBiCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjb250cnVidXRlQ2hhaW4oVmFyaWFiaWxpdHlFbGVtZW50IGEsIFZhcmlhYmlsaXR5RWxlbWVudCBiKSB7CQotCQlWYXJpYWJpbGl0eUVsZW1lbnQgZWxlbWVudCA9IGE7Ci0JCXdoaWxlIChlbGVtZW50ICE9IG51bGwpIHsKLQkJCWlmIChlbGVtZW50LmdldFZhcmlhYmlsaXR5VHlwZSgpICE9IFZhcmlhYmlsaXR5VHlwZS5DT05UUklCVVRFUykgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCWVsZW1lbnQgPSBlbGVtZW50LmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsKLQkJCWlmIChlbGVtZW50ID09IG51bGwpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQlpZiAoZWxlbWVudCA9PSBiKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBpcyB0aGUgZWxlbWVudCBhIGV4dGVuZC1yZXBsYWNlcj8KLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0V4dGVuZFJlcGxhY2VyKFZhcmlhYmlsaXR5RWxlbWVudCBlbGVtZW50KSB7Ci0JCWlmIChlbGVtZW50ID09IG51bGwgfHwgZWxlbWVudC5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlyZXR1cm4gZWxlbWVudC5nZXRWYXJpYWJpbGl0eVR5cGUoKSA9PSBWYXJpYWJpbGl0eVR5cGUuRVhURU5EU19SRVBMQUNFUzsKLQl9Ci0JCi0JLyoqCi0JICogaXMgdGhlIGVsZW1lbnQgYW4gZXh0ZW5kZXI/Ci0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNFeHRlbmRlcihWYXJpYWJpbGl0eUVsZW1lbnQgZWxlbWVudCkgewotCQlpZiAoZWxlbWVudCA9PSBudWxsIHx8IGVsZW1lbnQuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJcmV0dXJuIGVsZW1lbnQuZ2V0VmFyaWFiaWxpdHlUeXBlKCkgPT0gVmFyaWFiaWxpdHlUeXBlLkVYVEVORFM7Ci0JfQotCi0JLyoqCi0JICogZ2V0IHRoZSByZXBsYWNlciBvZiB0aGUgZWxlbWVudCBpbiB0aGUgY29uZmlndXJhdGlvbi4gT25seSBvbmUgcmVwbGFjZXIKLQkgKiBpcyBhbGxvd2VkLiBJZiBtb3JlIHRoYW4gb25lIHJlcGxhY2VyIGlzIGZvdW5kLCB0aGVuIG5vbmUgb2YgdGhlbSB3aWxsIGJlCi0JICogcmV0dXJuZWQuCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiAgICAgICAgICAgIFZhcmlhYmlsaXR5RWxlbWVudCB0aGUgZWxlbWVudAotCSAqIEBwYXJhbSBjb25maWcKLQkgKiAgICAgICAgICAgIE1ldGhvZENvbmZpZ3VyYXRpb24KLQkgKiBAcmV0dXJuIFZhcmlhYmlsaXR5RWxlbWVudCB0aGUgcmVwbGFjZXIgaWYgdGhlcmUgaXMgb25lIGFuZCBPTkxZIG9uZSwKLQkgKiAgICAgICAgIG51bGwgb3RoZXJ3aXNlCi0JICovCi0JcHVibGljIHN0YXRpYyBWYXJpYWJpbGl0eUVsZW1lbnQgZ2V0UmVwbGFjZXIoVmFyaWFiaWxpdHlFbGVtZW50IGVsZW1lbnQsCi0JCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZykgewotCQlWYXJpYWJpbGl0eUVsZW1lbnQgdmUgPSBudWxsOwotCi0JCS8vIHRoaXMgd2lsbCBnZXQgYWxsIHJlcGxhY2VycyByZWN1cnNpdmVseS4gd2Ugb25seSBuZWVkIHRoZSBpbW1lZGlhdGUKLQkJLy8gb25lcwotCQkvLyBmb3IoSXRlcmF0b3IgaXRlcmF0b3IgPSBUbmdVdGlsLmdldEdlbmVyYWxpemVycyhlbGVtZW50LAotCQkvLyBWYXJpYWJpbGl0eVR5cGUuUkVQTEFDRVNfTElURVJBTCk7IGl0ZXJhdG9yLmhhc05leHQoKTspCi0JCWZvciAoSXRlcmF0b3IgaXQgPSBBc3NvY2lhdGlvbkhlbHBlci5nZXRJbW1lZGlhdGVWYXJpZXRpZXMoZWxlbWVudCkKLQkJCQkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJVmFyaWFiaWxpdHlFbGVtZW50IGUgPSAoVmFyaWFiaWxpdHlFbGVtZW50KSBpdC5uZXh0KCk7Ci0JCQlpZiAoIGUgPT0gbnVsbCB8fCAhaW5Db25maWcoZSwgY29uZmlnKSApIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQotCQkJVmFyaWFiaWxpdHlUeXBlIHR5cGUgPSBlLmdldFZhcmlhYmlsaXR5VHlwZSgpOwotCQkJaWYgKCB0eXBlID09IFZhcmlhYmlsaXR5VHlwZS5SRVBMQUNFUyAKLQkJCQkJfHwgdHlwZSA9PSBWYXJpYWJpbGl0eVR5cGUuRVhURU5EU19SRVBMQUNFUykgewotCQkJCWlmICh2ZSAhPSBudWxsKSB7Ci0JCQkJCWlmIChkZWJ1ZykgewotCQkJCQkJU3lzdGVtLm91dAotCQkJCQkJCQkucHJpbnRsbigiQ29uZmlndXJhdGlvbkhlbHBlci5nZXRSZXBsYWNlcjogUmVwbGFjZXIgaWdub3JlZCBmb3IgZWxlbWVudCAnIiArIExpYnJhcnlVdGlsLmdldFR5cGVOYW1lKGVsZW1lbnQpICsgIicgc2luY2UgaXQgaGFzIG1vcmUgdGhhbiBvbmUgcmVwbGFjZXJpbiB0aGUgY29uZmlndXJhdGlvbiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJfQotCQkJCQlyZXR1cm4gbnVsbDsgLy8gaWYgbW9yZSB0aGFuIG9uZSByZXBsYWNlciwgcmV0dXJuIG51bGwKLQkJCQl9Ci0KLQkJCQl2ZSA9IGU7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gdmU7Ci0JfQotCi0JLyoqCi0JICogZ2V0IHRoZSBpbW1lZGlhdGUgY29udHJpYnV0b3JzIG9mIHRoZSBlbGVtZW50IHdpdGhpbiB0aGUgY29uZmlndXJhdGlvbi4KLQkgKiBJZiBhIGNvbnRyaWJ1dG9yIGhhcyBpbW1lZGlhdGUgcmVwbGFjZXIsIGl0IGlzIHJlcGFsY2VkIHdpdGggdGhlIHJlcGxhY2VyCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiBAcGFyYW0gY29uZmlnCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRDb250cmlidXRvcnMoVmFyaWFiaWxpdHlFbGVtZW50IGVsZW1lbnQsCi0JCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZykgewotCQlMaXN0IGl0ZW1zID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCWlmICggZWxlbWVudCA9PSBudWxsICkgewotCQkJcmV0dXJuIGl0ZW1zOwotCQl9Ci0JCQotCQkvLyBUaGlzIG1ldGhvZCBnZXQgYWxsIGNvbnRyaWJ1dG9ycyByZWN1cnNpdmVseSwKLQkJLy8gd2Ugb25seSBuZWVkIHRoZSBmaXJzdCBsZXZlbAotCQkvLyBmb3IgKEl0ZXJhdG9yIGl0ID0gVG5nVXRpbC5nZXRDb250cmlidXRvcnMoZWxlbWVudCk7IGl0Lmhhc05leHQoKTsgKQotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gQXNzb2NpYXRpb25IZWxwZXIuZ2V0SW1tZWRpYXRlVmFyaWV0aWVzKGVsZW1lbnQpCi0JCQkJLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCVZhcmlhYmlsaXR5RWxlbWVudCBlID0gKFZhcmlhYmlsaXR5RWxlbWVudCkgaXQubmV4dCgpOwotCQkJaWYgKChlICE9IG51bGwpCi0JCQkJCSYmIChlLmdldFZhcmlhYmlsaXR5VHlwZSgpID09IFZhcmlhYmlsaXR5VHlwZS5DT05UUklCVVRFUykKLQkJCQkJJiYgaW5Db25maWcoZSwgY29uZmlnKSkgewotCQkJCVZhcmlhYmlsaXR5RWxlbWVudCByZXBsYWNlciA9IGdldFJlcGxhY2VyKGUsIGNvbmZpZyk7Ci0JCQkJaWYgKHJlcGxhY2VyICE9IG51bGwpIHsKLQkJCQkJaXRlbXMuYWRkKHJlcGxhY2VyKTsKLQkJCQl9IGVsc2UgewotCQkJCQlpdGVtcy5hZGQoZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGl0ZW1zOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRFeHRlbmRlcnMoVmFyaWFiaWxpdHlFbGVtZW50IGVsZW1lbnQsCi0JCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZykgewotCQlMaXN0IGl0ZW1zID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCWlmICggZWxlbWVudCA9PSBudWxsICkgewotCQkJcmV0dXJuIGl0ZW1zOwotCQl9Ci0JCQotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gQXNzb2NpYXRpb25IZWxwZXIuZ2V0SW1tZWRpYXRlVmFyaWV0aWVzKGVsZW1lbnQpCi0JCQkJLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCVZhcmlhYmlsaXR5RWxlbWVudCBlID0gKFZhcmlhYmlsaXR5RWxlbWVudCkgaXQubmV4dCgpOwotCQkJaWYgKChlICE9IG51bGwpCi0JCQkJCSYmIChlLmdldFZhcmlhYmlsaXR5VHlwZSgpID09IFZhcmlhYmlsaXR5VHlwZS5FWFRFTkRTKQotCQkJCQkmJiBpbkNvbmZpZyhlLCBjb25maWcpKSB7Ci0JCQkJCWl0ZW1zLmFkZChlKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBpdGVtczsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBTZXQ8VmFyaWFiaWxpdHlFbGVtZW50PiBnZXRMb2NhbENvbnRyaWJ1dGVyc0FuZFJlcGxhY2VycyhWYXJpYWJpbGl0eUVsZW1lbnQgZWxlbWVudCwKLQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0JCVNldDxWYXJpYWJpbGl0eUVsZW1lbnQ+IGl0ZW1zID0gbmV3IEhhc2hTZXQ8VmFyaWFiaWxpdHlFbGVtZW50PigpOwotCi0JCWlmICggZWxlbWVudCA9PSBudWxsICkgewotCQkJcmV0dXJuIGl0ZW1zOwotCQl9Ci0JCQotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gQXNzb2NpYXRpb25IZWxwZXIuZ2V0SW1tZWRpYXRlVmFyaWV0aWVzKGVsZW1lbnQpCi0JCQkJLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCVZhcmlhYmlsaXR5RWxlbWVudCBlID0gKFZhcmlhYmlsaXR5RWxlbWVudCkgaXQubmV4dCgpOwotCQkJaWYgKChlICE9IG51bGwpCi0JCQkJCSYmIChpc0xvY2FsQ29udHJpYnV0ZXJPclJlcGxhY2VyKGUpKQotCQkJCQkmJiBpbkNvbmZpZyhlLCBjb25maWcpKSB7Ci0JCQkJCWl0ZW1zLmFkZChlKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBpdGVtczsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0xvY2FsQ29udHJpYnV0ZXJPclJlcGxhY2VyKAotCQkJVmFyaWFiaWxpdHlFbGVtZW50IHZlKSB7Ci0JCVZhcmlhYmlsaXR5VHlwZSB0eXBlID0gdmUuZ2V0VmFyaWFiaWxpdHlUeXBlKCk7Ci0JCXJldHVybiB0eXBlID09IFZhcmlhYmlsaXR5VHlwZS5MT0NBTF9DT05UUklCVVRJT04KLQkJCQl8fCB0eXBlID09IFZhcmlhYmlsaXR5VHlwZS5MT0NBTF9SRVBMQUNFTUVOVDsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNhblNob3coTWV0aG9kRWxlbWVudCBlbGVtZW50LAotCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLQkJcmV0dXJuIGNhblNob3coZWxlbWVudCxjb25maWcsIHRydWUpOwotCX0KLQkKLQotCS8qKgotCSAqIGVsZW1lbnQgY2FuJ3Qgc2hvdyBpbiB0aGUgY29uZmlndXJhdGlvbiB0cmVlIGlmIDEuIHRoZSBlbGVtZW50IGlzIG5vdCBpbgotCSAqIHRoZSBjb25maWd1cmF0aW9uIDIuIHRoZSBlbGVtZW50IGlzIGEgY29udHJpYnV0aW9uIHRvIGFub3RoZXIgZWxlbWVudCAzLgotCSAqIGlmIHRoZSBlbGVtZW50IGlzIGEgcmVwbGFjZXIgdG8gYSAzLiB0aGUgZWxlbWVudCBoYXMgYSByZXBsYWNlbWVudAotCSAqIGVsZW1lbnQgaW4gdGhlIGNvbmZpZ3VyYXRpb24KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqIEBwYXJhbSBjb25maWcKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY2FuU2hvdyhNZXRob2RFbGVtZW50IGVsZW1lbnQsCi0JCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZywgYm9vbGVhbiBjaGVja1N1YnRyYWN0ZWQpIHsKLQkJaWYgKGVsZW1lbnQgPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJaWYgKCFpbkNvbmZpZyhlbGVtZW50LCBjb25maWcsIGNoZWNrU3VidHJhY3RlZCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0vLwkJLy8gaWYgaXQ7cyBhbiBhY3Rpdml0eSwgcmV0dXJuIHNpbmNlIGNvbnRyaWJ1dG9ycyBhcmUgbG9jYWwgY29udHJpYnV0aW9uIGFuZCBuZWVkcyB0byBiZSBzaG93bgotLy8JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLS8vCQkJcmV0dXJuIHRydWU7Ci0vLwkJfQotCi0vLwkJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8JCS8vIHRoaXMgaXMgbm90IG5lZWRlZCBhbnkgbW9yZSBzaW5jZSB0aGUgc3VwcHJlc3Npb24gc3RhdGUgaXMgZGV0ZXJtaW5lZCBieSB0aGUgYWN0aXZpdHkgYWRhcHRvciBmYWN0b3J5Ci0vLwkJLy8ganVzdCBsZWF2ZSBpdCBoZXJlIGZvciBub3cgc2luY2UgaXQgZG9lcyBub3QgaHVydC4gdGFrZSBpdCBhd2F5IGluIG5leHQgcmVsZWFzZQotCQkvLyAKLQkJLy8gTk8sIHdlIHN0aWxsIG5lZWQgdG8ga2VlcCB0aGlzIHRvIGNoZWNrIHRoZSBzdXBwcmVzc2lvbiBvZiBkZXNjcmlwdG9ycyByZWZlcmVuY2VkIGJ5IGFub3RoZXIgZGVzY3JpcHRvci4gCi0JCS8vIGZvciBleGFtcGxlLCB3aGVuIGRpc3BsYXlpbmcgYSBURCBwYWdlLCB3ZSBuZWVkIHRvIGhhbmRsZSB0aGUgc3VwcHJlc3Npb24gb2YgdGhlIHJlZmVyZW5jZWQgV1BEcyBhbmQgUkRzLiAKLQkJLy8gMDAzOTUyNzggLSBCcm93c2luZyBURCB3aXRoIHN1cHByZXNzZWQgUkQvV1BEIHVuZGVyIGl0ICAtLSBzdXBwcmVzc2VkIG9uZXMgc3RpbGwgc2hvd2luZwotCQkvLyBOb3RlOiB0aGlzIGRvZXMgbm90IGhhbmRsZSB0aGUgY2FzZSB3aGVuIHRoZSBkZXNjcmlwdG9yIGlzIHdpdGggYW4gaW5oZXJpdGVkIGFjdGl2aXR5LiAKLQkJLy8gaW4gdGhhdCBjYXNlLCB0aGUgc3VwcHJlc3Npb24gbmVlZCB0byBiZSBkZXRlcm1pbmVkIGJ5IHRoZSBhY3Rpdml0eSBwYXRoLiBUT0RPCi0JCUJvb2xlYW4gc3VwcmVzc2VkID0gZWxlbWVudC5nZXRTdXBwcmVzc2VkKCk7Ci0JCWlmIChzdXByZXNzZWQgIT0gbnVsbCAmJiBzdXByZXNzZWQuYm9vbGVhblZhbHVlKCkgPT0gdHJ1ZSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0vLwkJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCQkKLQkJaWYgKCBlbGVtZW50IGluc3RhbmNlb2YgVmFyaWFiaWxpdHlFbGVtZW50KSB7Ci0JCQlpZiAoICFjYW5TaG93QnlDaGVja2luZ1ZFKChWYXJpYWJpbGl0eUVsZW1lbnQpIGVsZW1lbnQsY29uZmlnKSApIHsKLQkJCQlyZXR1cm4gIGZhbHNlOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBlCi0JICogQHBhcmFtIGNvbmZpZwotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY2FuU2hvd0J5Q2hlY2tpbmdWRShWYXJpYWJpbGl0eUVsZW1lbnQgZSwgTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcpewkJCi0KLQkJLy8gaWYgdGhpcyBpcyBhbiBleHRlbmRlciwgYWx3YXlzIHNob3csIGV2ZW4gdGhvdWdoIGl0IGV4dGVuZHMgYQotCQkvLyBjb250cmlidXRvcgotCQlpZiAoaXNFeHRlbmRlcihlKSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQotCQlpZiAoaXNDb250cmlidXRvcihlKSB8fCBnZXRSZXBsYWNlcihlLCBjb25maWcpICE9IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCS8vIGZvciBhY3Rpdml0eSwgZG9uJ3Qgc2hvdyB0aGUgb25lcyB0aGF0IGNvbnRhaW5zIGNvbnRyaWJ1dG9ycyAKLQkJLy8gdGhlIHJlc2FvbiBmb3IgdGhpcyBpcyB0byBzaW1wbGlmeSB0aGUgbG9naWMuCi0JCS8vIGFzc3VtaW5nIHRoYXQgdXNlciB1c2VzIHRoaXMgYWN0aXZpdHkgdG8gY29udHJpYnV0ZSB0byBvdGhlciBhY3Rpdml0aWVzCi0JCS8vIHNvIHRoYXQgcGFydCBzaG91bGQgbm90IGJlIGludm9sdmVkIGluIHRoZSBuYXZpZ2F0aW9uCi0JCS8vIAotCQkvLyBKaW5odWEgWGksIDA3LzE0LzA2LCAKLQkJaWYgKCAoZSBpbnN0YW5jZW9mIEFjdGl2aXR5KSAmJiBoYXNDb250cmlidXRvcigoQWN0aXZpdHkpZSkgKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQl3aGlsZSAoKGUgIT0gbnVsbCkgJiYgaXNSZXBsYWNlcihlKSkgewotCQkJZSA9IChWYXJpYWJpbGl0eUVsZW1lbnQpIGUuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpOwotCQkJaWYgKGlzQ29udHJpYnV0b3IoZSkpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIGdldCB0aGUgbmFtZSBvZiB0aGUgZWxlbWVudCBpbiB0aGUgY29uZmlndXJhdGlvbi4gMS4gaWYgaXQncyBhCi0JICogY29udHJpYnV0b3IsIHNob3cgdGhlIG5hbWUgb2YgdGhlIGJhc2UgZWxlbWVudCAyLiBpZiBpdCBoYXMgYQotCSAqIHJlcGxhY2VtZW5ldCwgc2hvdyB0aGUgbmFtZSBvZiB0aGUgcmVwbGFjZW1lbnQgZWxlbWVudAotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogQHBhcmFtIGNvbmZpZwotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TmFtZShNZXRob2RFbGVtZW50IGVsZW1lbnQsCi0JCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZykgewotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFZhcmlhYmlsaXR5RWxlbWVudCkgewotCQkJVmFyaWFiaWxpdHlFbGVtZW50IGUgPSAoVmFyaWFiaWxpdHlFbGVtZW50KSBlbGVtZW50OwotCQkJaWYgKGlzQ29udHJpYnV0b3IoZSkpIHsKLQkJCQlyZXR1cm4gZ2V0TmFtZShlLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSwgY29uZmlnKTsKLQkJCX0gZWxzZSB7Ci0JCQkJVmFyaWFiaWxpdHlFbGVtZW50IHJlcCA9IGdldFJlcGxhY2VyKGUsIGNvbmZpZyk7Ci0JCQkJaWYgKHJlcCAhPSBudWxsKSB7Ci0JCQkJCXJldHVybiBnZXROYW1lKHJlcCwgY29uZmlnKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gZWxlbWVudC5nZXROYW1lKCk7Ci0JfQotCi0JLyoqCi0JICogZ2V0IHRoZSBwcmVzZW50YXRpb24gbmFtZSBmb3IgYW4gZWxlbWVudCBpbiB0aGUgY29uZmlndXJhdGlvbgotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogQHBhcmFtIGNvbmZpZwotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UHJlc2VudGF0aW9uTmFtZShNZXRob2RFbGVtZW50IGVsZW1lbnQsCi0JCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZykgewotCQkKLQkJLy8gW0J1ZyAxOTYzOTldIFAtbmFtZSBpcyBub3QgaW5oZXJpdGVkIGZyb20gaXRzIGJhc2UgZWxlbWVudCBpbiBhbiBleHRlbmRpbmcgZWxlbWVudAotCQlTdHJpbmcgbmFtZSA9IG51bGw7Ci0KLQkJbmFtZSA9IGVsZW1lbnQuZ2V0UHJlc2VudGF0aW9uTmFtZSgpOwotCQlpZiAoIFN0clV0aWwuaXNCbGFuayhuYW1lKSAmJiAoZWxlbWVudCBpbnN0YW5jZW9mIFZhcmlhYmlsaXR5RWxlbWVudCkgKSB7Ci0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZiA9IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFZhcmlhYmlsaXR5RWxlbWVudF9WYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCk7Ci0JCQlFbGVtZW50UmVhbGl6ZXIgciA9IERlZmF1bHRFbGVtZW50UmVhbGl6ZXIubmV3RWxlbWVudFJlYWxpemVyKGNvbmZpZyk7CQotCQkJTWV0aG9kRWxlbWVudCBtZSA9IGVsZW1lbnQ7Ci0KLQkJCVNldDxNZXRob2RFbGVtZW50PiBzZWVucyA9IG5ldyBIYXNoU2V0PE1ldGhvZEVsZW1lbnQ+KCk7Ci0JCQlkbyB7Ci0JCQkJVmFyaWFiaWxpdHlFbGVtZW50IG9sZE1lID0gKFZhcmlhYmlsaXR5RWxlbWVudCkgbWU7Ci0JCQkJbWUgPSAoRGVzY3JpYmFibGVFbGVtZW50KUNvbmZpZ3VyYXRpb25IZWxwZXIuY2FsYzAxRmVhdHVyZVZhbHVlKG1lLCBmLCByKTsKLQkJCQlpZiAoIG1lID09IG51bGwgKSB7Ci0JCQkJCWJyZWFrOwotCQkJCX0gZWxzZSBpZiAob2xkTWUgPT0gbWUpIHsKLQkJCQkJbWUgPSBvbGRNZS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCk7Ci0JCQkJCWlmIChtZSA9PSBudWxsKSB7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0JCQkJCQotCQkJCW5hbWUgPSAoKERlc2NyaWJhYmxlRWxlbWVudCltZSkuZ2V0UHJlc2VudGF0aW9uTmFtZSgpOwotCQkJCWlmIChzZWVucy5jb250YWlucyhtZSkpIHsJLy90byBwcmV2ZW50IGxvb3AgaW4gY2FzZSBzdWNoIGFzCQkJCQkJCQkJCQkKLQkJCQkJYnJlYWs7CQkJCQkvL2JvdGggZXh0ZW5kLXJlcGxhY2VyIGFuZCBiYXNlIGhhdmUgZW1wdHkgcHJlcyBuYW1lCi0JCQkJfQotCQkJCXNlZW5zLmFkZChtZSk7Ci0JCQl9IHdoaWxlICggU3RyVXRpbC5pc0JsYW5rKG5hbWUpICk7Ci0JCX0KLQkJCi0JCWlmICggU3RyVXRpbC5pc0JsYW5rKG5hbWUpICkgewotCQkJbmFtZSA9IFRuZ1V0aWwuZ2V0UHJlc2VudGF0aW9uTmFtZShlbGVtZW50KTsKLQkJfQotCi0JCXJldHVybiBuYW1lOwotCX0KLQotCS8qKgotCSAqIGdldCB0aGUgdmFyaWFiaWxpdHkgZWxlbWVudCBvd25lci4gSWYgdGhlIGVsZW1lbnQgaXMgYQotCSAqIFZhcmlhYmlsaXR5RWxlbWVudCwgcmV0dXJuIGl0c2VsZiBvdGhlcndpc2UsIGZpbmQgaXQncyBvd25lci4gRm9yCi0JICogZXhhbXBsZSwgYSBDb250ZW50RGVzY3Jpb3Rpb24gb2JqZWN0IGlzIG93bmVyZWQgYnkgYSBWYXJpYWJpbGl0eUVsZW1lbnQKLQkgKiAKLQkgKiBAcGFyYW0gZQotCSAqICAgICAgICAgICAgTWV0aG9kRWxlbWVudAotCSAqIEByZXR1cm4gVmFyaWFiaWxpdHlFbGVtZW50Ci0JICovCi0JcHVibGljIHN0YXRpYyBWYXJpYWJpbGl0eUVsZW1lbnQgZ2V0VmFyaWFibGVPd25lcihNZXRob2RFbGVtZW50IGUpIHsKLQkJaWYgKGUgaW5zdGFuY2VvZiBWYXJpYWJpbGl0eUVsZW1lbnQpIHsKLQkJCXJldHVybiAoVmFyaWFiaWxpdHlFbGVtZW50KSBlOwotCQl9IGVsc2UgaWYgKGUgaW5zdGFuY2VvZiBDb250ZW50RGVzY3JpcHRpb24pIHsKLQkJCS8vIHJldHVybiBBc3NvY2lhdGlvbkhlbHBlci5nZXRPd25lciggKENvbnRlbnREZXNjcmlwdGlvbillICk7Ci0JCQlFT2JqZWN0IGVPYmogPSBlLmVDb250YWluZXIoKTsKLQkJCWlmIChlT2JqIGluc3RhbmNlb2YgVmFyaWFiaWxpdHlFbGVtZW50KSB7Ci0JCQkJcmV0dXJuIChWYXJpYWJpbGl0eUVsZW1lbnQpIGVPYmo7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBjaGVjayBpZiB0aGUgZmVhdHVyZSB2YWx1ZSBpcyBtZXJnYWJsZSBvciBub3QKLQkgKiBAcGFyYW0gZmVhdHVyZQotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc01lcmdhYmxlQXR0cmlidXRlKEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKSB7Ci0JCWlmICghZmVhdHVyZS5nZXRFVHlwZSgpLmdldEluc3RhbmNlQ2xhc3NOYW1lKCkuZXF1YWxzKAotCQkJCSJqYXZhLmxhbmcuU3RyaW5nIikpIC8vJE5PTi1OTFMtMSQKLQkJewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJLy8gZmVhdHVyZSBpZCBpcyBub3QgZ2xvYmFsbHkgdW5pcXVlLCBjYW4ndCBkbyBhIHN3aXRjaCBoZXJlCi0JCS8vIGNvbXBhcmUgdGhlIGFjdHVyZSBmZWF0cnVlIGluc3RlYWQKLQkJLyoKLQkJICogc3dpdGNoICggZmVhdHVyZS5nZXRGZWF0dXJlSUQoKSApIHsgY2FzZQotCQkgKiBVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19HVUlEOiBjYXNlCi0JCSAqIFVtYVBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfX05BTUU6Ci0JCSAqIENvbnRyaWJ1dGluZyBhIFVuaXF1ZSBJRCBmb3Igd29yayBwcm9kdWN0IHJlbmRlcnMKLQkJICogYmFkIGh0bWwgLy8gZG9uJ3QgbWVyZ2UgVW5pcXVlIElEOiBjYXNlCi0JCSAqIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19FWFRFUk5BTF9JRDogcmV0dXJuIGZhbHNlOyB9Ci0JCSAqLwotCi0JCWlmIChmZWF0dXJlID09IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE1ldGhvZEVsZW1lbnRfR3VpZCgpCi0JCQkJfHwgZmVhdHVyZSA9PSBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXROYW1lZEVsZW1lbnRfTmFtZSgpCi0JCQkJfHwgZmVhdHVyZSA9PSBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJLmdldENvbnRlbnREZXNjcmlwdGlvbl9FeHRlcm5hbElkKCkgCi0JCQkJfHwgZmVhdHVyZSA9PSBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRNZXRob2RFbGVtZW50X1ByZXNlbnRhdGlvbk5hbWUoKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogaXMgYXR0cmlidXRlIGZlYXR1cmUgdmFsdWU/Ci0JICogQHBhcmFtIGZlYXR1cmUKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNBdHRyaWJ1dGVGZWF0dXJlKEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKSB7Ci0JCXJldHVybiAoZmVhdHVyZS5nZXRFVHlwZSgpIGluc3RhbmNlb2YgRUF0dHJpYnV0ZSk7Ci0JfQotCQotCS8qKgotCSAqIGlzIHRoaXMgYSB0by1vbmUgZmVhdHVyZT8KLQkgKiBAcGFyYW0gZmVhdHVyZQotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpczAxRmVhdHVyZShFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSkgewotCQlyZXR1cm4gKGZlYXR1cmUuZ2V0RVR5cGUoKSBpbnN0YW5jZW9mIEVDbGFzcykgJiYgIWZlYXR1cmUuaXNNYW55KCk7Ci0JfQotCi0JLyoqCi0JICogaXMgdGhpcyBhIHRvLW1hbnkgZmVhdHVyZT8KLQkgKiBAcGFyYW0gZmVhdHVyZQotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpczBuRmVhdHVyZShFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSkgewotCQlyZXR1cm4gKGZlYXR1cmUuZ2V0RVR5cGUoKSBpbnN0YW5jZW9mIEVDbGFzcykgJiYgZmVhdHVyZS5pc01hbnkoKTsKLQl9Ci0KLQkKLQkvKioKLQkgKiBjYWxjdWxhdGUgdGhlIHZhbHVlIG9mIHRoZSBzcGVjaWZpZWQgZWxlbWVudCBhbmQgZmVhdHVyZQotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogQHBhcmFtIGZlYXR1cmUKLQkgKiBAcGFyYW0gY29uZmlnCi0JICogQHBhcmFtIHZhbHVlcwotCSAqICAgICAgICAgICAgVGhlIExpc3Qgb2YgdmFsdWVzIG9mIHRoZSBmZWF0dXJlLiBpZiB0aGUgZmVhdHVyZSBpcyBhIDAuLjEKLQkgKiAgICAgICAgICAgIGFzc29jaWF0aW9uLCB0aGUgTGlzdCBob2xkcyBhIHNpbmdsZSB2YWx1ZSBpZiBhbnkgZm9yCi0JICogICAgICAgICAgICByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLCBpdCdzIGEgbGlzdCBvZiByZWZlcmVuY2VzIGZvcgotCSAqICAgICAgICAgICAgYXR0cmlidXRlIGZlYXR1cmUsIGl0J3MgYSBsaXN0IG9mIGF0dHJpYnV0ZSB2YWx1ZXMgdG8gYmUKLQkgKiAgICAgICAgICAgIG1lcmdlcmVkIGZvciAwLi4xIGFzc29jaWF0aW9uLCB0aGUgbGlzdCBtYXkgY29udGFpbiAxIHZhbHVlLgotCSAqLwotLy8JcHJpdmF0ZSBzdGF0aWMgdm9pZCBjYWxjdWxhdGVGZWF0dXJlKE1ldGhvZEVsZW1lbnQgZWxlbWVudCwKLS8vCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnLAotLy8JCQlMaXN0IHZhbHVlcywgRWxlbWVudFJlYWxpemVyIHJlYWxpemVyKSB7Ci0vLwkJY2FsY3VsYXRlRmVhdHVyZShlbGVtZW50LCBudWxsLCBmZWF0dXJlLCBjb25maWcsIHZhbHVlcywgcmVhbGl6ZXIpOwotLy8JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBjYWxjdWxhdGVGZWF0dXJlKE1ldGhvZEVsZW1lbnQgZWxlbWVudCwKLQkJCU1ldGhvZEVsZW1lbnQgT3duZXJFbGVtZW50LCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwKLQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnLCBGZWF0dXJlVmFsdWUgdmFsdWVzLCBFbGVtZW50UmVhbGl6ZXIgcmVhbGl6ZXIpIHsKLQkJCi0JCS8vIG1ha2Ugc3VyZSB0aGlzIGlzIGEgdmFsaWQgZmVhdHVyZSAKLQkJLy8gZm9yIGV4YW1wbGUsIGlmIGFuIGFjdGl2aXR5IGNvbnRyaWJ1dGVzIHRvIGEgQ2FwYWJpbGl0eSBQYXR0ZXJuLAotCQkvLyBzb21lIENhcGFiaWxpdHlQYXR0ZXJuIHNwZWNpZmljIGZlYXR1cmUgbWF5IG5vdCBiZSBhIHZhbGlkIGZlYXR1cmUgZm9yIHRoZSBBY3Rpdml0eQotLy8JCUxpc3QgZmVhdHVyZXMgPSBlbGVtZW50LmdldEluc3RhbmNlUHJvcGVydGllcygpOwotCQlMaXN0IGZlYXR1cmVzID0gTGlicmFyeVV0aWwuZ2V0U3RydWN0dXJhbEZlYXR1cmVzKGVsZW1lbnQpOwotCQlpZiAoICFmZWF0dXJlcy5jb250YWlucyhmZWF0dXJlKSApIHsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJLy8gRUNsYXNzaWZpZXIgdHlwZSA9IGZlYXR1cmUuZ2V0RVR5cGUoKTsKLQkJVmFyaWFiaWxpdHlFbGVtZW50IHZlID0gZ2V0VmFyaWFibGVPd25lcigoT3duZXJFbGVtZW50ID09IG51bGwpID8gZWxlbWVudAotCQkJCTogT3duZXJFbGVtZW50KTsKLQotCQlPYmplY3QgdmFsdWUgPSBlbGVtZW50LmVHZXQoZmVhdHVyZSk7Ci0KLQkJdmFsdWVzLmFkZCh2ZSwgdmFsdWUpOwotCi0JCWlmIChjb25maWcgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJLy8gcmVhbGl6ZSB0aGUgdmFyaWFiaWxpdHkgcmVsYXRpb25zaGlwCi0JCWlmICh2ZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCS8vIGFjY29yZGluZyB0byBQZXRlciwgdGhlIHJlYWxpemF0aW9uIHNob3VsZCBiZSBhbHdheXMgdG9wIGRvd24uCi0JCS8vIGkuZSByZWFsaXplIHRoZSBiYXNlIGZpcnN0LCB0aGVuIGluY2x1ZGUgdGhlIGNvbnRyaWJ1dGlvbnMKLQkJX19tZXJnZUJhc2UoZWxlbWVudCwgdmUsIGZlYXR1cmUsIGNvbmZpZywgdmFsdWVzLCByZWFsaXplcik7Ci0JCQotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEZ1bGZpbGxhYmxlRWxlbWVudCkgewotCQkJaWYgKGZlYXR1cmUgIT0gVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJLmdldEZ1bGZpbGxhYmxlRWxlbWVudF9GdWxmaWxscygpKSB7Ci0JCQkJbWVyZ2VTbG90RmVhdHVyZVZhbHVlcygoRnVsZmlsbGFibGVFbGVtZW50KSBlbGVtZW50LCBmZWF0dXJlLAotCQkJCQkJY29uZmlnLCB2YWx1ZXMsIHJlYWxpemVyKTsKLQkJCX0KLQkJfSBlbHNlIGlmIChPd25lckVsZW1lbnQgaW5zdGFuY2VvZiBGdWxmaWxsYWJsZUVsZW1lbnQpIHsKLQkJCW1lcmdlU2xvdEZlYXR1cmVWYWx1ZXMoZWxlbWVudCwgKEZ1bGZpbGxhYmxlRWxlbWVudCkgT3duZXJFbGVtZW50LAotCQkJCQlmZWF0dXJlLCBjb25maWcsIHZhbHVlcywgcmVhbGl6ZXIpOwkKLQkJfQotCQkKLQkJaWYgKHJlYWxpemVyICE9IG51bGwpIHsKLQkJCXJlYWxpemVyLmFkZEV4dHJhRmVhdHVyZVZhbHVlcyhlbGVtZW50LCBmZWF0dXJlLCB2YWx1ZXMpOwotCQl9Ci0JCQotCQlpZiAoIWlzMDFGZWF0dXJlKGZlYXR1cmUpIHx8ICh2YWx1ZXMuc2l6ZSgpID09IDApICkgewotCQkJX19tZXJnZUNvbnRyaWJ1dG9ycyhlbGVtZW50LCB2ZSwgZmVhdHVyZSwgY29uZmlnLCB2YWx1ZXMsIHJlYWxpemVyKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIExpc3Q8RnVsZmlsbGFibGVFbGVtZW50PiBjYWxjRnVsZmlsbGFibGVFbGVtZW50X0Z1bGZpbGxzKEZ1bGZpbGxhYmxlRWxlbWVudCBlbGVtZW50LAotCQkJCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZykgewotCQlMaXN0PEZ1bGZpbGxhYmxlRWxlbWVudD4gcmVzdWx0TGlzdCA9IG5ldyBBcnJheUxpc3Q8RnVsZmlsbGFibGVFbGVtZW50PigpOwotCQkKLQkJRWxlbWVudFJlYWxpemVyIHJlYWxpemVyID0gRGVmYXVsdEVsZW1lbnRSZWFsaXplci5uZXdFbGVtZW50UmVhbGl6ZXIoY29uZmlnKTsKLQkJT2JqZWN0IGZ1bGxmaWxsc09iaiA9IGNhbGMwbkZlYXR1cmVWYWx1ZShlbGVtZW50LAotCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEZ1bGZpbGxhYmxlRWxlbWVudF9GdWxmaWxscygpLAotCQkJCXJlYWxpemVyKTsJCi0JCQotCQlpZiAoISAoZnVsbGZpbGxzT2JqIGluc3RhbmNlb2YgTGlzdCkpIHsKLQkJCXJldHVybiByZXN1bHRMaXN0OwotCQl9Ci0KLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRGdWxmaWxsYWJsZUVsZW1lbnRfRnVsZmlsbHMoKTsKLQkJZm9yIChGdWxmaWxsYWJsZUVsZW1lbnQgc2xvdCA6IChMaXN0PEZ1bGZpbGxhYmxlRWxlbWVudD4pIGZ1bGxmaWxsc09iaikgewotCQkJc2xvdCA9IChGdWxmaWxsYWJsZUVsZW1lbnQpIGdldENhbGN1bGF0ZWRFbGVtZW50KHNsb3QsIGNvbmZpZyk7Ci0JCQlpZiAoc2xvdE1hdGNoaW5nKHNsb3QsIGVsZW1lbnQsIHJlYWxpemVyKSkgewotCQkJCXJlc3VsdExpc3QuYWRkKHNsb3QpOwotCQkJfQotCQl9Ci0JCQotCQlpZiAocmVzdWx0TGlzdC5zaXplKCkgPiAxKSB7Ci0JCQlDb21wYXJhdG9yIGNvbXBhcmF0b3IgPSBQcmVzZW50YXRpb25Db250ZXh0LklOU1RBTkNFLmdldFByZXNOYW1lQ29tcGFyYXRvcigpOwotCQkJQ29sbGVjdGlvbnMuPEZ1bGZpbGxhYmxlRWxlbWVudD5zb3J0KHJlc3VsdExpc3QsIGNvbXBhcmF0b3IpOwotCQl9Ci0JCQotCQlyZXR1cm4gcmVzdWx0TGlzdDsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBtZXJnZVNsb3RGZWF0dXJlVmFsdWVzKEZ1bGZpbGxhYmxlRWxlbWVudCBlbGVtZW50LAotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnLAotCQkJRmVhdHVyZVZhbHVlIHZhbHVlcywgRWxlbWVudFJlYWxpemVyIHJlYWxpemVyKSB7Ci0JCWlmICghaW5oZXJpdGluZ1Nsb3RGZWF0dXJlcykgewotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlpZiAoZmVhdHVyZSA9PSBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRGdWxmaWxsYWJsZUVsZW1lbnRfRnVsZmlsbHMoKSkgewkJCQotCQkJcmV0dXJuOwotCQl9Ci0JCWlmICghKGVsZW1lbnQgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAodmFsdWVzLnNpemUoKSA+IDApIHsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJTGlzdDxGdWxmaWxsYWJsZUVsZW1lbnQ+IHNsb3RzID0gY2FsY0Z1bGZpbGxhYmxlRWxlbWVudF9GdWxmaWxscyhlbGVtZW50LCBjb25maWcpOwotCi0JCWZvciAoRnVsZmlsbGFibGVFbGVtZW50IHNsb3QgOiBzbG90cykgewotCQkJaWYgKHNsb3QgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdCkgewotCQkJCXNsb3QgPSAoRnVsZmlsbGFibGVFbGVtZW50KSBnZXRDYWxjdWxhdGVkRWxlbWVudChzbG90LCBjb25maWcpOwotCQkJCWNhbGN1bGF0ZUZlYXR1cmUoc2xvdCwgbnVsbCwgZmVhdHVyZSwgY29uZmlnLCB2YWx1ZXMsCi0JCQkJCQlyZWFsaXplcik7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBtZXJnZVNsb3RGZWF0dXJlVmFsdWVzKE1ldGhvZEVsZW1lbnQgZWxlbWVudCwgRnVsZmlsbGFibGVFbGVtZW50IE93bmVyRWxlbWVudCwKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZywKLQkJCUZlYXR1cmVWYWx1ZSB2YWx1ZXMsIEVsZW1lbnRSZWFsaXplciByZWFsaXplcikgewotCQlpZiAoIWluaGVyaXRpbmdTbG90RmVhdHVyZXMpIHsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJaWYgKCEgKGVsZW1lbnQgaW5zdGFuY2VvZiBDb250ZW50RGVzY3JpcHRpb24pKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCWlmICghKE93bmVyRWxlbWVudCBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0KSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWlmICh2YWx1ZXMuc2l6ZSgpID4gMCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlMaXN0PEZ1bGZpbGxhYmxlRWxlbWVudD4gc2xvdHMgPSBjYWxjRnVsZmlsbGFibGVFbGVtZW50X0Z1bGZpbGxzKE93bmVyRWxlbWVudCwgY29uZmlnKTsKLQotCQlmb3IgKEZ1bGZpbGxhYmxlRWxlbWVudCBzbG90IDogc2xvdHMpIHsKLQkJCWlmIChzbG90IGluc3RhbmNlb2YgV29ya1Byb2R1Y3QpIHsKLQkJCQlzbG90ID0gKEZ1bGZpbGxhYmxlRWxlbWVudCkgZ2V0Q2FsY3VsYXRlZEVsZW1lbnQoc2xvdCwgY29uZmlnKTsKLQkJCQlDb250ZW50RGVzY3JpcHRpb24gc2xvdE93bmVkRWxlbWVudCA9IHNsb3QuZ2V0UHJlc2VudGF0aW9uKCk7CQkJCQotCQkJCWNhbGN1bGF0ZUZlYXR1cmUoc2xvdE93bmVkRWxlbWVudCwgc2xvdCwgZmVhdHVyZSwgY29uZmlnLCB2YWx1ZXMsCi0JCQkJCQlyZWFsaXplcik7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBtZXJnZVNsb3RPcHBvc2l0ZUZlYXR1cmVWYWx1ZXMoRnVsZmlsbGFibGVFbGVtZW50IGVsZW1lbnQsCi0JCQlPcHBvc2l0ZUZlYXR1cmUgZmVhdHVyZSwgTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcsCi0JCQlGZWF0dXJlVmFsdWUgdmFsdWVzLCBFbGVtZW50UmVhbGl6ZXIgcmVhbGl6ZXIpIHsKLQkJaWYgKCFpbmhlcml0aW5nU2xvdEZlYXR1cmVzKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCWlmIChmZWF0dXJlID09IEFzc29jaWF0aW9uSGVscGVyLkZ1bEZpbGxzX0Z1bGxGaWxsYWJsZUVsZW1lbnRzKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCWlmICghKGVsZW1lbnQgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAodmFsdWVzLnNpemUoKSA+IDApIHsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJTGlzdDxGdWxmaWxsYWJsZUVsZW1lbnQ+IHNsb3RzID0gY2FsY0Z1bGZpbGxhYmxlRWxlbWVudF9GdWxmaWxscyhlbGVtZW50LCBjb25maWcpOwotCi0JCWZvciAoRnVsZmlsbGFibGVFbGVtZW50IHNsb3QgOiBzbG90cykgewotCQkJc2xvdCA9IChGdWxmaWxsYWJsZUVsZW1lbnQpIGdldENhbGN1bGF0ZWRFbGVtZW50KHNsb3QsIGNvbmZpZyk7Ci0JCQljYWxjdWxhdGVPcHBvc2l0ZUZlYXR1cmUoc2xvdCwgZmVhdHVyZSwgcmVhbGl6ZXIsIHZhbHVlcyk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBMaXN0PEZ1bGZpbGxhYmxlRWxlbWVudD4gY2FsY0Z1bGZpbGxzX0Z1bGZpbGxhYmxlRWxlbWVudCgKLQkJCUZ1bGZpbGxhYmxlRWxlbWVudCBzbG90LCBNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZykgewotCQlMaXN0PEZ1bGZpbGxhYmxlRWxlbWVudD4gcmVzdWx0TGlzdCA9IG5ldyBBcnJheUxpc3Q8RnVsZmlsbGFibGVFbGVtZW50PigpOwotCi0JCUVsZW1lbnRSZWFsaXplciByZWFsaXplciA9IERlZmF1bHRFbGVtZW50UmVhbGl6ZXIKLQkJCQkubmV3RWxlbWVudFJlYWxpemVyKGNvbmZpZyk7Ci0KLQkJTGlzdCBmdWxmaWxsaW5nTGlzdCA9IGNhbGMwbkZlYXR1cmVWYWx1ZShzbG90LCBBc3NvY2lhdGlvbkhlbHBlci5GdWxGaWxsc19GdWxsRmlsbGFibGVFbGVtZW50cywgcmVhbGl6ZXIpOwotCi0JCWZvciAoRnVsZmlsbGFibGVFbGVtZW50IGVsZW1lbnQgOiAoTGlzdDxGdWxmaWxsYWJsZUVsZW1lbnQ+KSBmdWxmaWxsaW5nTGlzdCkgewotCQkJZWxlbWVudCA9IChGdWxmaWxsYWJsZUVsZW1lbnQpIGdldENhbGN1bGF0ZWRFbGVtZW50KGVsZW1lbnQsIGNvbmZpZyk7Ci0JCQlpZiAoc2xvdE1hdGNoaW5nKHNsb3QsIGVsZW1lbnQsIHJlYWxpemVyKSkgewotCQkJCXJlc3VsdExpc3QuYWRkKGVsZW1lbnQpOwotCQkJfQotCQl9Ci0JCQotCQlpZiAocmVzdWx0TGlzdC5zaXplKCkgPiAxKSB7Ci0JCQlDb21wYXJhdG9yIGNvbXBhcmF0b3IgPSBQcmVzZW50YXRpb25Db250ZXh0LklOU1RBTkNFLmdldFByZXNOYW1lQ29tcGFyYXRvcigpOwotCQkJQ29sbGVjdGlvbnMuPEZ1bGZpbGxhYmxlRWxlbWVudD5zb3J0KHJlc3VsdExpc3QsIGNvbXBhcmF0b3IpOwotCQl9Ci0JCQotCQlyZXR1cm4gcmVzdWx0TGlzdDsKLQl9CQkKLQkKLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIHNsb3RNYXRjaGluZyhGdWxmaWxsYWJsZUVsZW1lbnQgc2xvdCwKLQkJCUZ1bGZpbGxhYmxlRWxlbWVudCBlbGVtZW50LCBFbGVtZW50UmVhbGl6ZXIgcmVhbGl6ZXIpIHsKLQkJaWYgKHNsb3QgPT0gbnVsbCB8fCAhc2xvdC5nZXRJc0Fic3RyYWN0KCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQkJCi0KLQkJaWYgKHJlYWxpemVyICE9IG51bGwpIHsJCi0JCQlyZXR1cm4gcmVhbGl6ZXIuc2xvdE1hdGNoaW5nKHNsb3QsIGVsZW1lbnQpOwotCQl9Ci0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIHZvaWQgX19tZXJnZUJhc2UoTWV0aG9kRWxlbWVudCBlbGVtZW50LAotCQkJVmFyaWFiaWxpdHlFbGVtZW50IHZlLCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwKLQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnLCBGZWF0dXJlVmFsdWUgdmFsdWVzLCBFbGVtZW50UmVhbGl6ZXIgcmVhbGl6ZXIpIHsKLQkKLQkJLy8gaWYgdGhlIGVsZW1lbnQgaXMgYW4gZXh0ZW5kZWQgZWxlbWVudCwgZ2V0IHRoZSBiYXNlIGVsZW1lbnQncwotCQkvLyBwcm9wZXJ0aWVzIGlmIG5lZWRlZAotCQlib29sZWFuIGV4dGVuZFJlcGxhY2UgPSBpc0V4dGVuZFJlcGxhY2VyKHZlKSB8fCAKLQkJCQlFbGVtZW50UmVhbGl6ZXIuaXNFeHRlbmRSZXBsYWNlRW5hYmxlZCgpICYmIGlzUmVwbGFjZXIodmUpOwotCQlib29sZWFuIGlzRXh0ZW5kZXIgPSBpc0V4dGVuZGVyKHZlKTsKLQkJCi0JCWlmIChpc0V4dGVuZGVyIHx8IGV4dGVuZFJlcGxhY2UpIHsKLQkJCWJvb2xlYW4gbWVyZ2ViYXNlID0gZmFsc2U7Ci0JCQlpZiAoaXMwbkZlYXR1cmUoZmVhdHVyZSkpIHsKLQkJCQltZXJnZWJhc2UgPSB0cnVlOwotCQkJCWlmICggZXh0ZW5kUmVwbGFjZSAKLQkJCQkJCXx8IGlzRXh0ZW5kZXIgJiYgRWxlbWVudFJlYWxpemVyLmlnbm9yZUJhc2VUb01hbnlBc3NvY2lhdGlvbnMoKSkgewotCQkJCQltZXJnZWJhc2UgPSAodmFsdWVzLnNpemUoKSA9PSAwKTsKLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKGlzMDFGZWF0dXJlKGZlYXR1cmUpKSB7Ci0JCQkJbWVyZ2ViYXNlID0gKHZhbHVlcy5zaXplKCkgPT0gMCk7Ci0JCQl9IGVsc2UgewotCQkJCW1lcmdlYmFzZSA9IChpc01lcmdhYmxlQXR0cmlidXRlKGZlYXR1cmUpICYmICh2YWx1ZXMuc2l6ZSgpID09IDApKTsKLQkJCX0KLQotCQkJaWYgKG1lcmdlYmFzZSkgewotCQkJCS8vIEF1dGhvcmluZzogRXh0ZW5kaW5nIGEgYmFzZSB0aGF0IGhhcyBiZWVuCi0JCQkJLy8gcmVwbGFjZWQsIGRvZXMgbm90IGV4dGVuZCB0aGUgcmVwbGFjZW1lbnQKLQkJCQkvLyBuZWVkIHRvIGdldCB0aGUgcmVhbGl6ZWQgZWxlbWVudCwKLQkJCQkvLyB0aGUgYmFzZSBlbGVtZW50IG1pZ2h0IGJlIHJlcGxhY2VkIGJ5IGFub3RoZXIgb25lLAotCQkJCS8vIG9yIG1pZ2h0IGJlIGEgY29udHJpYnV0b3IgdG8gYW5vdGhlciBiYXNlCi0JCQkJTWV0aG9kRWxlbWVudCBlID0gdmUuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpOwotCQkJCWlmICggIWV4dGVuZFJlcGxhY2UgKSB7Ci0JCQkJCWU9IGdldENhbGN1bGF0ZWRFbGVtZW50KGUsIGNvbmZpZyk7Ci0JCQkJfQkJCQkJCi0JCQkJTWV0aG9kRWxlbWVudCBvID0gZTsKLQotCQkJCS8vIGlmIGl0J3MgYSBjb250YWlubWVudCBmZWF0dXJlLCBzdWNoIGFzIHN1Yi1hcnRpZmFjdHMKLQkJCQkvLyB0aGUgYmFzZSBzaG91bGQgbm90IGJlIHRoZSBjb250YWluZXIKLQkJCQkvLyAxNjIxNTQgLSBDaGVjayBjaXJjdWxhciByZWZlcmVuY2VzIHdpdGggcGFyZW50LS9zdWItYXJ0aWZhY3RzIGFuZCBwcmFjdGljZXMvc3ViLXByYWN0aWNlcwkJCQkKLQkJCQlpZiAoIGlzQ29udGFpbm1lbnRGZWF0dXJlKGZlYXR1cmUpICkgewotCQkJCQlMaXN0IGNvbnRhaW5lcnMgPSBnZXRDb250YWluZXJzKHZlLCBjb25maWcpOwotCQkJCQlpZiAoY29udGFpbmVycy5jb250YWlucyhlKSApIHsKLQkJCQkJCW1lcmdlYmFzZSA9IGZhbHNlOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJaWYgKG1lcmdlYmFzZSAmJiAodmUgIT0gZSkgJiYgaW5Db25maWcoZSwgY29uZmlnKSkgewotCQkJCQkvLyBpZiB0aGUgY3VycmVudCBlbGVtZW50IGlzIGEgZGVzY3JpcHRpb24sCi0JCQkJCS8vIGdldCB0aGUgdGhlIGRlc2NyaXB0aW9uIG9iamVjdCBvZiB0aGUgYmFzZQotCQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIENvbnRlbnREZXNjcmlwdGlvbikgewotCQkJCQkJdHJ5IHsKLQkJCQkJCQllID0gKChEZXNjcmliYWJsZUVsZW1lbnQpIGUpLmdldFByZXNlbnRhdGlvbigpOwotCQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUxKSB7Ci0JCQkJCQkJZTEucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQotCQkJCQljYWxjdWxhdGVGZWF0dXJlKGUsIG8sIGZlYXR1cmUsIGNvbmZpZywgdmFsdWVzLCByZWFsaXplcik7Ci0KLQkJCQkJLy8gZm9yIGV4dGVuZGVyLCB3ZSBuZWVkIHRvIHJlLXNvcnQgdGhlIHN0ZXBzIGJhc2VkIG9uIHRoZQotCQkJCQkvLyBleHRlbmRlciBkZWZpbmVkIG9yZGVyCi0JCQkJCWlmICgodmUgaW5zdGFuY2VvZiBDb250ZW50RWxlbWVudCkKLQkJCQkJCQkmJiAoZmVhdHVyZSA9PSBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJLmdldENvbnRlbnREZXNjcmlwdGlvbl9TZWN0aW9ucygpKSkgewotCQkJCQkJb3JkZXJTZWN0aW9ucygoQ29udGVudEVsZW1lbnQpIHZlLCAoTGlzdCl2YWx1ZXMuZ2V0VmFsdWUoKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIF9fbWVyZ2VDb250cmlidXRvcnMoTWV0aG9kRWxlbWVudCBlbGVtZW50LAotCQkJVmFyaWFiaWxpdHlFbGVtZW50IHZlLCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwKLQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnLCBGZWF0dXJlVmFsdWUgdmFsdWVzLCBFbGVtZW50UmVhbGl6ZXIgcmVhbGl6ZXIpIHsKLQkJYm9vbGVhbiBtZXJnZWFibGUgPSB0cnVlOwotCQlpZiAoIGlzQXR0cmlidXRlRmVhdHVyZShmZWF0dXJlKSAmJiAhaXNNZXJnYWJsZUF0dHJpYnV0ZShmZWF0dXJlKSApIHsKLQkJCW1lcmdlYWJsZSA9IGZhbHNlOwotCQl9IAotCQkKLQkJaWYgKCBtZXJnZWFibGUgKSB7Ci0JCQkvLyBpZiB0aGUgZWxlbWVudCBoYXMgY29udHJpYnV0b3JzIGluIHRoZSBjb25maWd1cmF0aW9uLCBnZXQgdGhlCi0JCQkvLyByZWZlcmVuY2UgcHJvcGVydGllcwotCQkJLy8gaWYgYSBjb250cmlidXRvciBoYXMgcmVwbGFjZXIsIGl0J3MgcmVwbGFjZXIgaXMgdXNlZAotCQkJTGlzdCBpdGVtcyA9IGdldENvbnRyaWJ1dG9ycyh2ZSwgY29uZmlnKTsKLQkJCWlmIChpdGVtcyAhPSBudWxsICYmIGl0ZW1zLnNpemUoKSA+IDApIHsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ID0gaXRlbXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCQlNZXRob2RFbGVtZW50IGUgPSAoTWV0aG9kRWxlbWVudCkgaXQubmV4dCgpOwotCQkJCQlNZXRob2RFbGVtZW50IG8gPSBlOyAgLy8gdGhlIG93bmVyCi0KLQkJCQkJLy8gaWYgdGhlIGN1cnJlbnQgZWxlbWVudCBpcyBhIGRlc2NyaXB0aW9uLAotCQkJCQkvLyBnZXQgdGhlIHRoZSBkZXNjcmlwdGlvbiBvYmplY3Qgb2YgdGhlIGNvbnRyaWJ1dG9yCi0JCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgQ29udGVudERlc2NyaXB0aW9uKSB7Ci0JCQkJCQllID0gKChEZXNjcmliYWJsZUVsZW1lbnQpIGUpLmdldFByZXNlbnRhdGlvbigpOwotCQkJCQl9Ci0JCQkJCWNhbGN1bGF0ZUZlYXR1cmUoZSwgbywgZmVhdHVyZSwgY29uZmlnLCB2YWx1ZXMsIHJlYWxpemVyKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JfQotCQotCS8qKgotCSAqIGNhbGN1bGF0ZSB0aGUgcmVmbGlzdCBmb3IgdGhlIHNwZWNpZmllZCBlbGVtZW50IGFuZCBPcHBvc2l0ZUZlYXR1cmUKLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqIEBwYXJhbSBmZWF0dXJlCi0JICogICAgICAgICAgICBPcHBvc2l0ZUZlYXR1cmUKLQkgKiBAcGFyYW0gcmVhbGl6ZXIgRWxlbWVudFJlYWxpemVyCi0JICogQHBhcmFtIHZhbHVlcwotCSAqICAgICAgICAgICAgVGhlIExpc3Qgb2YgdmFsdWVzIG9mIHRoZSBmZWF0dXJlLiBmb3IgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZSwKLQkgKiAgICAgICAgICAgIGl0J3MgYSBsaXN0IG9mIHJlZmVyZW5jZXMgZm9yIGF0dHJpYnV0ZSBmZWF0dXJlLCBpdCdzIGEgbGlzdAotCSAqICAgICAgICAgICAgb2YgYXR0cmlidXRlIHZhbHVlcyB0byBiZSBtZXJnZXJlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgY2FsY3VsYXRlT3Bwb3NpdGVGZWF0dXJlKE1ldGhvZEVsZW1lbnQgZWxlbWVudCwKLQkJCU9wcG9zaXRlRmVhdHVyZSBmZWF0dXJlLCBFbGVtZW50UmVhbGl6ZXIgcmVhbGl6ZXIsIEZlYXR1cmVWYWx1ZSB2YWx1ZXMpIHsKLQkJY2FsY3VsYXRlT3Bwb3NpdGVGZWF0dXJlKGVsZW1lbnQsIGZlYXR1cmUsIHRydWUsIGZhbHNlLCByZWFsaXplciwgdmFsdWVzKTsKLQl9Ci0JCi0JCi0JLyoqCi0JICogY2FsY3VsYXRlIHRoZSByZWZsaXN0IGZvciB0aGUgc3BlY2lmaWVkIGVsZW1lbnQgYW5kIE9wcG9zaXRlRmVhdHVyZQotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogQHBhcmFtIGZlYXR1cmUKLQkgKiAgICAgICAgICAgIE9wcG9zaXRlRmVhdHVyZQotCSAqIEBwYXJhbSByZWFsaXplciBFbGVtZW50UmVhbGl6ZXIKLQkgKiBAcGFyYW0gdmFsdWVzCi0JICogICAgICAgICAgICBUaGUgTGlzdCBvZiB2YWx1ZXMgb2YgdGhlIGZlYXR1cmUuIGZvciByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLAotCSAqICAgICAgICAgICAgaXQncyBhIGxpc3Qgb2YgcmVmZXJlbmNlcyBmb3IgYXR0cmlidXRlIGZlYXR1cmUsIGl0J3MgYSBsaXN0Ci0JICogICAgICAgICAgICBvZiBhdHRyaWJ1dGUgdmFsdWVzIHRvIGJlIG1lcmdlcmVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBjYWxjdWxhdGVPcHBvc2l0ZUZlYXR1cmUoTWV0aG9kRWxlbWVudCBlbGVtZW50LAotCQkJT3Bwb3NpdGVGZWF0dXJlIGZlYXR1cmUsIGJvb2xlYW4gbWVyZ2VSZXBsYWNlckJhc2UsIGJvb2xlYW4gbWVyZ2VFeHRlbmRlckJhc2UsIAotCQkJRWxlbWVudFJlYWxpemVyIHJlYWxpemVyLCBGZWF0dXJlVmFsdWUgdmFsdWVzKSB7Ci0JCS8vIG11c3QgYmUgYSBNdWx0aVJlc291cmNlRU9iamVjdAotCQlpZiAoIShlbGVtZW50IGluc3RhbmNlb2YgTXVsdGlSZXNvdXJjZUVPYmplY3QpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IHJlYWxpemVyLmdldENvbmZpZ3VyYXRpb24oKTsKLQotCQlWYXJpYWJpbGl0eUVsZW1lbnQgdmUgPSBnZXRWYXJpYWJsZU93bmVyKGVsZW1lbnQpOwotCi0JCU9iamVjdCB2YWx1ZSA9ICgoTXVsdGlSZXNvdXJjZUVPYmplY3QpIGVsZW1lbnQpCi0JCQkJLmdldE9wcG9zaXRlRmVhdHVyZVZhbHVlKGZlYXR1cmUpOwotCQl2YWx1ZXMuYWRkKHZlLCB2YWx1ZSk7Ci0KLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBWYXJpYWJpbGl0eUVsZW1lbnQgJiYgY29uZmlnICE9IG51bGwpIHsKLQkJCVZhcmlhYmlsaXR5RWxlbWVudCBjZSA9IChWYXJpYWJpbGl0eUVsZW1lbnQpIGVsZW1lbnQ7Ci0KLQkJCS8vIGlmIHRoZSBlbGVtZW50IGhhcyBjb250cmlidXRvcnMgaW4gdGhlIGNvbmZpZ3VyYXRpb24sIGdldCB0aGUKLQkJCS8vIHJlZmVyZW5jZSBwcm9wZXJ0aWVzCi0JCQlMaXN0IGl0ZW1zID0gZ2V0Q29udHJpYnV0b3JzKGNlLCBjb25maWcpOwotCQkJaWYgKGl0ZW1zICE9IG51bGwgJiYgaXRlbXMuc2l6ZSgpID4gMCkgewotCQkJCWZvciAoSXRlcmF0b3IgaXQgPSBpdGVtcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJCU1ldGhvZEVsZW1lbnQgZSA9IChNZXRob2RFbGVtZW50KSBpdC5uZXh0KCk7Ci0JCQkJCWNhbGN1bGF0ZU9wcG9zaXRlRmVhdHVyZShlLCBmZWF0dXJlLCBtZXJnZVJlcGxhY2VyQmFzZSwgbWVyZ2VFeHRlbmRlckJhc2UsIHJlYWxpemVyLCB2YWx1ZXMpOwotCQkJCX0KLQkJCX0KLQotCQkJLy8gaWYgdGhlIGVsZW1lbnQgaXMgYSByZXBsYWNlciBvZiBhIGJhc2UgZWxlbWVudCwgCi0JCQkvLyBnZXQgdGhlIGJhc2UgZWxlbWVudCdzIHByb3BlcnRpZXMKLQkJCS8vIG9ubHkgY292ZXIgMDEgb3IgMG0gcmVmZXJlbmNlcwotCQkJLy8gYXR0cmlidXRlcyBjYW4ndCBiZSBvcHBvc2l0ZSBmZWF0dXJlCi0KLQkJCS8vIHJlcGxhY2VkIGVsZW1lbnQgZG9lcyBub3Qgc2hvdyBpbmNvbWluZwotCQkJLy8gcmVsYXRpb25zaGlwcwotCQkJLy8gaW1jb21pbmcgcmVsYXRpb25zaGlwcyBhcmUgcmVwcmVzZW50ZWQgYnkgb3Bwb3NpdGUgZmVhdHVyZQotCQkJLy8gc28ga2VlcCB0aGUgcmVmZXJlbmNlcyB0byB0aGUgYmFzZSBlbGVtZW50Ci0JCQkKLQkJCS8vIEluY29uc2lzdGVuY3kgYmV0d2VlbiBQdWJsaXNoZWQgV29yayBQcm9kdWN0OiBXb3JrbG9hZCBBbmFseXNpcyBQYWdlIGFuZCBSZWZlcmVuY2VkIFBhZ2VzCi0JCQkvLyB0aGlzIGlzIGZyb20gdGhlIGJhc2Ugb2YgdGhlIGV4dGVuZGVyLiAKLQkJCS8vIGluY29taW5nIGFzc29jaWF0aW9ucyBmcm9tIHRoZSBiYXNlIHNob3VsZCBiZSBkaXNjYXJkZWQgZm9yIGV4dGVuZGVycwotCQkJYm9vbGVhbiBtZXJnZWJhc2UgPSBmYWxzZTsKLQkJCWJvb2xlYW4gaXNFeHRlbmRlciA9IGlzRXh0ZW5kZXIoY2UpOwotCQkJYm9vbGVhbiBpc1JlcGxhY2VyID0gaXNSZXBsYWNlcihjZSk7Ci0JCQlib29sZWFuIGlzRXh0ZW5kUmVwbGFjZXIgPSBpc0V4dGVuZFJlcGxhY2VyKGNlKSB8fCAKLQkJCQlFbGVtZW50UmVhbGl6ZXIuaXNFeHRlbmRSZXBsYWNlRW5hYmxlZCgpICYmIGlzUmVwbGFjZXI7Ci0JCQkKLS8vCQkJLy9UaGlzIGlzIGEgY29uc2VydmF0aXZlIGZpeCBmb3IgIkV4dGVuZHMtcmVwbGFjZSBkaXNwbGluZSByZW5kZXJlZCB3cm9uZyBpbiBjb25mIHRyZWUgdmlldyIKLS8vCQkJaWYgKGlzRXh0ZW5kUmVwbGFjZXIoY2UpICYmICByZWFsaXplci5nZXRDbGFzcygpID09IERlZmF1bHRFbGVtZW50UmVhbGl6ZXIuY2xhc3MpIHsKLS8vCQkJCWlmIChmZWF0dXJlID09IEFzc29jaWF0aW9uSGVscGVyLkRpc2NpcGxpbmVfRGlzY2lwbGluZUdyb3VwaW5ncykgewotLy8JCQkJCWlzUmVwbGFjZXIgPSB0cnVlOwotLy8JCQkJfQotLy8JCQkJaWYgKGZlYXR1cmUgPT0gQXNzb2NpYXRpb25IZWxwZXIuUm9sZVNldF9Sb2xlU2V0R3JvdXBwaW5ncykgewotLy8JCQkJCWlzUmVwbGFjZXIgPSB0cnVlOwotLy8JCQkJfQkJCQkKLS8vCQkJfQotCQkJCi0JCQkvLyBleHRlbmRlclJlcGxhY2VyIGJlaGF2ZXMgbGlrZSByZXBsYWNlciB3aGVuIHJlYWxpemluZyBpbmNvbWluZyBhc3NvY2lhdGlvbnMKLQkJCS8vIEJ1ZyAxOTk2OTQgLSBFeHRlbmRzLVJlcGxhY2UgaWdub3JlcyBpbmNvbWluZyByZWxhdGlvbnNoaXBzIG9mIGNvbnRyaWJ1dGVyCi0JCQlpZiAoIGlzRXh0ZW5kUmVwbGFjZXIgKSB7Ci0JCQkJaXNSZXBsYWNlciA9IHRydWU7Ci0JCQl9Ci0JCQkKLQkJCWlmIChpc1JlcGxhY2VyKSB7Ci0JCQkJbWVyZ2ViYXNlID0gbWVyZ2VSZXBsYWNlckJhc2UgJiYgKCh2YWx1ZSBpbnN0YW5jZW9mIExpc3QpIHx8ICh2YWx1ZXMuc2l6ZSgpID09IDApKTsKLQkJCX0gZWxzZSBpZiAoaXNFeHRlbmRlcikgewotCQkJCW1lcmdlYmFzZSA9IG1lcmdlRXh0ZW5kZXJCYXNlOwotCQkJfQotCi0JCQlpZiAobWVyZ2ViYXNlKSB7Ci0JCQkJLy8gcmVzb2x2ZSB0aGUgYmFzZSBjb250cmlidXRvciB0byB0aGUgYmFzZSBpZiBpIGFtIG5vdCBhCi0JCQkJLy8gcmVwbGFjZXIKLQkJCQkvLyBkb24ndCByZXNvbHZlIHRoZSBjb250cmlidXRvcnMgdG8gdGhlIGJhc2UgaWYgaSBhbSBhCi0JCQkJLy8gcmVwbGFjZXIsCi0JCQkJLy8gdGhlIGNhbGwgaXMgY29taW5nIGZyb20gdGhlIGJhc2UuIFNvIGlmIHJlc29sdmUgdG8gYmFzZSBhZ2FpbgotCQkJCS8vIHdpbGwgY2F1c2UgZGVhZGxvY2suCi0JCQkJLy8gZG9uJ3QgcmVzb2x2ZSB0byB0aGUgcmVwbGFjZXIgc2luY2Ugd2UgbmVlZCB0byBjYXJyeSBkb3duIGFsbAotCQkJCS8vIHRoZSBpbmNvbWluZyAwbiBhc3NvY2lhdGlvbnMgZnJvbSBiYXNlCi0JCQkJLy8gYWN0dWFsbHkgc2hvdWxkIHJlc29sdmUgdG8gcmVwbGFjZXIgaWYgaSBhbSBub3QgYSByZXBsYWNlcgotCQkJCS8vIChpLmUuIGkgYW0gYW4gZW50ZW5kZXIpCi0JCQkJLy8gdGhpcyBoYW5kbGVzIHRoZSBzZW5hcmlvOiBHMiByZXBsYWNlcyBHMSBhbmQgRzMgZXh0ZW5kcyBHMQotCQkJCUVsZW1lbnRSZWFsaXplciByZWFsaXplcjIgPSAKLQkJCQkJRGVmYXVsdEVsZW1lbnRSZWFsaXplci5uZXdFbGVtZW50UmVhbGl6ZXIoY29uZmlnLCAoIWlzUmVwbGFjZXIpLCAoIWlzUmVwbGFjZXIpKTsKLQotCQkJCU1ldGhvZEVsZW1lbnQgZSA9IGdldENhbGN1bGF0ZWRFbGVtZW50KGNlCi0JCQkJCQkuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpLCByZWFsaXplcjIpOwotCQkJCQotCQkJCS8vIGlmIHRoZSBiYXNlIGVsZW1lbnQgcmVzb2x2ZWQgdG8gbnVsbCwgCi0JCQkJLy8gdGhpcyBpcyBiZWNhdXNlIGNhblNob3coKSBkb24ndCBhbGxvdyByZXBsYWNlZCBlbGVtZW50IHRvIHNob3cuCi0JCQkJLy8gd2UgZG9uJ3Qgd2FudCB0byB0YWtlIHRoZSByaXNrIHRvIGZpeCBFbGVtZW50UmVhbGl6ZXIKLQkJCQkvLyBzbyBmaXggaGVyZSBzaW5jZSA3LjAuMV9pZml4MSwgCi0JCQkJLy8gSmluaHVhIFhpLCA0LzE3LzA2Ci0JCQkJaWYgKCBlID09IG51bGwgKSB7Ci0JCQkJCWUgPSBjZS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCk7Ci0JCQkJfQotCQkJCQotCQkJCWlmICgoZSAhPSBjZSkgJiYgaW5Db25maWcoZSwgY29uZmlnKSkgewotCQkJCQljYWxjdWxhdGVPcHBvc2l0ZUZlYXR1cmUoZSwgZmVhdHVyZSwgbWVyZ2VSZXBsYWNlckJhc2UsIG1lcmdlRXh0ZW5kZXJCYXNlLCByZWFsaXplciwgdmFsdWVzKTsKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgRnVsZmlsbGFibGVFbGVtZW50KSB7Ci0JCQkJbWVyZ2VTbG90T3Bwb3NpdGVGZWF0dXJlVmFsdWVzKChGdWxmaWxsYWJsZUVsZW1lbnQpIGVsZW1lbnQsIGZlYXR1cmUsIGNvbmZpZywgdmFsdWVzLCByZWFsaXplcik7Ci0JCQl9Ci0JCQkKLQkJfQotCX0KLQotCS8qKgotCSAqIGNhbGN1bGF0ZSB0aGUgZWxlbWVudHMgaW4gdGhlIGxpc3QsIGFuZCByZXR1cm5zIGEgbmV3IGxpc3Qgb2YgdW5pcXVlCi0JICogZWxlbWVudHMKLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudHMKLQkgKiBAcGFyYW0gY29uZmlnCi0JICogQHJldHVybiBMaXN0Ci0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0IGdldENhbGN1bGF0ZWRFbGVtZW50cyhMaXN0IGVsZW1lbnRzLAotCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLQkJcmV0dXJuIGdldENhbGN1bGF0ZWRFbGVtZW50cyhlbGVtZW50cywgRGVmYXVsdEVsZW1lbnRSZWFsaXplci5uZXdFbGVtZW50UmVhbGl6ZXIoY29uZmlnKSApOwotCX0KLQkKLQkvKioKLQkgKiBjYWxjdWxhdGUgdGhlIGVsZW1lbnRzIGluIHRoZSBsaXN0LCBhbmQgcmV0dXJucyBhIG5ldyBsaXN0IG9mIHVuaXF1ZQotCSAqIGVsZW1lbnRzCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnRzCi0JICogQHBhcmFtIHJlYWxpemVyIEVsZW1lbnRSZWFsaXplcgotCSAqIEByZXR1cm4gTGlzdAotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRDYWxjdWxhdGVkRWxlbWVudHMoTGlzdCBlbGVtZW50cywgRWxlbWVudFJlYWxpemVyIHJlYWxpemVyICkgewotCQkvLyBjYWxjdWxhdGUgZWFjaCBlbGVtZW50IGluIHRoZSBsaXN0IGFuZCByZXR1cm4gYSBuZXcgbGlzdCBvZiBlbGVtZW50cwotCQlMaXN0IHZhbHVlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChJdGVyYXRvciBpdCA9IGVsZW1lbnRzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCU1ldGhvZEVsZW1lbnQgZSA9IChNZXRob2RFbGVtZW50KSBpdC5uZXh0KCk7Ci0JCQllID0gQ29uZmlndXJhdGlvbkhlbHBlci5nZXRDYWxjdWxhdGVkRWxlbWVudChlLCByZWFsaXplcik7Ci0JCQlpZiAoKGUgIT0gbnVsbCkgJiYgKCF2YWx1ZXMuY29udGFpbnMoZSkpKSB7Ci0JCQkJdmFsdWVzLmFkZChlKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiB2YWx1ZXM7Ci0JfQotCi0JLyoqCi0JICogY2FsY3VsYXRlIHRoZSBlbGVtZW50IGJhc2VkIG9uIHRsZSBjb25maWd1cmF0aW9uLiBJZiBub3RoaW5nIGNhbiBiZQotCSAqIHNob3duLCByZXR1cm4gbnVsbC4KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqIEBwYXJhbSBjb25maWcKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBNZXRob2RFbGVtZW50IGdldENhbGN1bGF0ZWRFbGVtZW50KE1ldGhvZEVsZW1lbnQgZWxlbWVudCwKLQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0JCUVsZW1lbnRSZWFsaXplciByZWFsaXplciA9IERlZmF1bHRFbGVtZW50UmVhbGl6ZXIubmV3RWxlbWVudFJlYWxpemVyKGNvbmZpZywgdHJ1ZSwgdHJ1ZSk7Ci0KLQkJcmV0dXJuIGdldENhbGN1bGF0ZWRFbGVtZW50KGVsZW1lbnQsIHJlYWxpemVyKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBNZXRob2RFbGVtZW50IGdldENhbGN1bGF0ZWRFbGVtZW50KE1ldGhvZEVsZW1lbnQgZWxlbWVudCwKLQkJCUVsZW1lbnRSZWFsaXplciByZWFsaXplcikgewotCi0JCU1ldGhvZEVsZW1lbnQgZSA9IGVsZW1lbnQ7Ci0JCU1ldGhvZEVsZW1lbnQgZTI7Ci0JCXdoaWxlICgoZTIgPSByZWFsaXplci5yZWFsaXplKGUpKSAhPSBlKSB7Ci0JCQllID0gZTI7Ci0JCX0KLQkJcmV0dXJuIGU7Ci0JfQotCi0JLyoqCi0JICogZ2V0IHRoZSBjYWxjdWxhdGVkIDAuLjEgZmVhdHVyZSB2YWx1ZSBvZiB0aGUgc3BlY2lwaWVkIGVsZW1lbnQgYW5kCi0JICogZmVhdHVyZQotCSAqIAotCSAqIEByZXR1cm4gTWV0aG9kRWxlbWVudAotCSAqLwotCXB1YmxpYyBzdGF0aWMgTWV0aG9kRWxlbWVudCBjYWxjMDFGZWF0dXJlVmFsdWUoTWV0aG9kRWxlbWVudCBlbGVtZW50LAotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIEVsZW1lbnRSZWFsaXplciByZWFsaXplcikgewotCQlyZXR1cm4gY2FsYzAxRmVhdHVyZVZhbHVlKGVsZW1lbnQsIG51bGwsIGZlYXR1cmUsIHJlYWxpemVyKTsKLQl9Ci0JCi0JLyoqCi0JICogZ2V0IHRoZSBjYWxjdWxhdGVkIDAuLjEgZmVhdHVyZSB2YWx1ZSBvZiB0aGUgc3BlY2lwaWVkIGVsZW1lbnQgYW5kCi0JICogZmVhdHVyZQotCSAqIAotCSAqIEByZXR1cm4gTWV0aG9kRWxlbWVudAotCSAqLwotCXB1YmxpYyBzdGF0aWMgTWV0aG9kRWxlbWVudCBjYWxjMDFGZWF0dXJlVmFsdWUoTWV0aG9kRWxlbWVudCBlbGVtZW50LCBNZXRob2RFbGVtZW50IG93bmVyRWxlbWVudCwgCi0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgRWxlbWVudFJlYWxpemVyIHJlYWxpemVyKSB7Ci0JCS8vIHByZXNlbnRhdGlvbiBvYmplY3QgZmVhdHVyZSBzaG91bGQgbmV2ZXIgYmUgcmVhbGl6ZWQuIGFsd2F5cyBrZWVwCi0JCS8vIGl0J3Mgb3duIHZhbHVlCi0JCU9iamVjdCB2ID0gZWxlbWVudC5lR2V0KGZlYXR1cmUpOwotCQlpZiAodiBpbnN0YW5jZW9mIENvbnRlbnREZXNjcmlwdGlvbikgewotCQkJcmV0dXJuIChNZXRob2RFbGVtZW50KSB2OwotCQl9Ci0KLQkJVG9PbmVGZWF0dXJlVmFsdWUgdmFsdWVzID0gbmV3IFRvT25lRmVhdHVyZVZhbHVlKGVsZW1lbnQsIG93bmVyRWxlbWVudCwgZmVhdHVyZSwgcmVhbGl6ZXIpOwotCQljYWxjdWxhdGVGZWF0dXJlKGVsZW1lbnQsIG93bmVyRWxlbWVudCwgZmVhdHVyZSwgcmVhbGl6ZXIuZ2V0Q29uZmlndXJhdGlvbigpLCB2YWx1ZXMsIHJlYWxpemVyKTsKLS8vCQlpZiAodmFsdWVzLnNpemUoKSA+IDApIHsKLS8vCQkJdiA9IChNZXRob2RFbGVtZW50KSB2YWx1ZXMuZ2V0KDApOwotLy8JCQlpZiAodiBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLS8vCQkJCXJldHVybiBnZXRDYWxjdWxhdGVkRWxlbWVudCgoTWV0aG9kRWxlbWVudCkgdiwgcmVhbGl6ZXIuZ2V0Q29uZmlndXJhdGlvbigpKTsKLS8vCQkJfQotLy8JCX0KLQotCQlyZXR1cm4gKE1ldGhvZEVsZW1lbnQpdmFsdWVzLmdldFZhbHVlKCk7Ci0JfQotCi0KLQkvKioKLQkgKiBpcyB0aGlzIGZlYXR1cmUgZm9yIGNvbnRhaW5kIGNoaWxkcmVuPyBzdWNoIGFzIGFydGlmYWN0J3MgY29udGFpbmVkIGFydGlmYWN0LgotCSAqIEBwYXJhbSBmZWF0dXJlIAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0NvbnRhaW5tZW50RmVhdHVyZShFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSkgewotCQlyZXR1cm4gZmVhdHVyZSA9PSBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRBcnRpZmFjdF9Db250YWluZWRBcnRpZmFjdHMoKQotCQkJCXx8IGZlYXR1cmUgPT0gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UHJhY3RpY2VfU3ViUHJhY3RpY2VzKCk7Ci0JfQotCi0JLyoqCi0JICogY2hlY2sgaWYgdGhlIGVsZW1lbnQgYWxsb3cgY29udGFpbmVkIGVsZW1lbnQKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0NvbnRhaW5tZW50RWxlbWVudChPYmplY3QgZWxlbWVudCkgewotCQlyZXR1cm4gZWxlbWVudCBpbnN0YW5jZW9mIEFydGlmYWN0IHx8IGVsZW1lbnQgaW5zdGFuY2VvZiBQcmFjdGljZTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBMaXN0IGdldENvbnRhaW5lcnMoTWV0aG9kRWxlbWVudCBlbGVtZW50LAotCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLQkJTGlzdCBpdGVtcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQlFT2JqZWN0IG8gPSBlbGVtZW50OwotCQl3aGlsZSAoKG8gIT0gbnVsbCkgJiYgKChvID0gby5lQ29udGFpbmVyKCkpICE9IG51bGwpCi0JCQkJJiYgby5nZXRDbGFzcygpLmlzSW5zdGFuY2UoZWxlbWVudCkpIHsKLQkJCWlmIChvIGluc3RhbmNlb2YgVmFyaWFiaWxpdHlFbGVtZW50KSB7Ci0JCQkJbyA9IGdldENhbGN1bGF0ZWRFbGVtZW50KChWYXJpYWJpbGl0eUVsZW1lbnQpIG8sIGNvbmZpZyk7Ci0JCQl9Ci0KLQkJCWlmICgobyAhPSBudWxsKSAmJiAhaXRlbXMuY29udGFpbnMobykpIHsKLQkJCQlpdGVtcy5hZGQobyk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gaXRlbXM7Ci0JfQotCi0JLyoqCi0JICogZ2V0IHRoZSAwMSBvcHBvc2l0ZSBmZWF0dXJlIChpZiBhbnkpIGZvciB0aGUgZ2l2ZW4gZmVhdHVyZS4gcmV0dXJucyBudWxsCi0JICogaWYgbm8gc3VjaCBmZWF0dXJlCi0JICogCi0JICogQHBhcmFtIGZlYXR1cmUKLQkgKiAgICAgICAgICAgIEVTdHJ1Y3R1cmFsRmVhdHVyZQotCSAqIEByZXR1cm4gT3Bwb3NpdGVGZWF0dXJlIHRoZSAwMSBvcHBvc2l0ZSBmZWF0dXJlIG9mIHRoZSBnaXZlbiBmZWF0dXJlLAotCSAqICAgICAgICAgbnVsbCBpZiBubyBzdWNoIHRoaW5nCi0JICovCi0JcHVibGljIHN0YXRpYyBPcHBvc2l0ZUZlYXR1cmUgZ2V0MDFPcHBvc2l0ZUZlYXR1cmUoCi0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSkgewotCQkKLQkJLy8gc2luY2UgMS4wbTQsIHRoZXNlIGFyZSBub3QgMDEgZmVhdHVyZSBhbnkgbW9yZQotLy8JCWlmIChmZWF0dXJlID09IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldERpc2NpcGxpbmVfVGFza3MoKSkgewotLy8JCQlyZXR1cm4gQXNzb2NpYXRpb25IZWxwZXIuVGFza19EaXNjaXBsaW5lOwotLy8JCX0gZWxzZSBpZiAoZmVhdHVyZSA9PSBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRSb2xlX1Jlc3BvbnNpYmxlRm9yKCkpIHsKLS8vCQkJcmV0dXJuIEFzc29jaWF0aW9uSGVscGVyLldvcmtQcm9kdWN0X1Jlc3BvbnNpYmxlUm9sZTsKLS8vCQl9Ci0JCQotLy8JCWlmICggZmVhdHVyZSA9PSBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXREb21haW5fV29ya1Byb2R1Y3RzKCkgKSB7Ci0vLwkJCXJldHVybiBBc3NvY2lhdGlvbkhlbHBlci5Xb3JrUHJvZHVjdF9Eb21haW5zOwotLy8JCX0gCi0JCQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQotCS8qKgotCSAqIGdldCB0aGUgdGFyZ2V0IGZlYXR1cmUgZm9yIHRoZSBvcHBvc2l0ZSBmZWF0dXJlIGlmIHRoZSB0YXJnZXQgZmVhdHVyZSBpcyBhIHRvLU9uZSBmZWF0dXJlLCAKLQkgKiBvdGhlcndpc2UsIHJldHVybiBudWxsLgotCSAqIEBwYXJhbSBvRmVhdHVyZQotCSAqIEByZXR1cm4gRVN0cnVjdHVyYWxGZWF0dXJlCi0JICovCi0JcHVibGljIHN0YXRpYyBFU3RydWN0dXJhbEZlYXR1cmUgZ2V0MDFGZWF0dXJlKE9wcG9zaXRlRmVhdHVyZSBvRmVhdHVyZSkgewkJCi0vKgkJaWYgKCBvRmVhdHVyZSA9PSBBc3NvY2lhdGlvbkhlbHBlci5Sb2xlX1ByaW1hcnlfVGFza3MgCi0JCQkJfHwgb0ZlYXR1cmUgPT0gQXNzb2NpYXRpb25IZWxwZXIuUm9sZURlc2NyaXB0b3JfUHJpbWFyeVRhc2tEZXNjcmlwdG9ycyApIHsKLQkJCXJldHVybiBvRmVhdHVyZS5nZXRUYXJnZXRGZWF0dXJlKCk7Ci0JCX0qLwotCQkKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qKgotCSAqIGdldCB0aGUgY2FsY3VsYXRlZCAwLi5uIGZlYXR1cmUgdmFsdWUgb2YgdGhlIHNwZWNpcGllZCBlbGVtZW50LCBpdCdzCi0JICogb3duZXIgZWxlbWVudCBhbmQgZmVhdHVyZQotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50IHtAbGluayBNZXRob2RFbGVtZW50fQotCSAqIEBwYXJhbSBmZWF0dXJlIHtAbGluayBFU3RydWN0dXJhbEZlYXR1cmV9Ci0JICogQHBhcmFtIHJlYWxpemVyIHtAbGluayBFbGVtZW50UmVhbGl6ZXJ9Ci0JICogQHJldHVybiBMaXN0IGEgbGlzdCBvZiB7QGxpbmsgTWV0aG9kRWxlbWVudH0KLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3QgY2FsYzBuRmVhdHVyZVZhbHVlKE1ldGhvZEVsZW1lbnQgZWxlbWVudCwKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBFbGVtZW50UmVhbGl6ZXIgcmVhbGl6ZXIpIAotCXsKLQkJcmV0dXJuIGNhbGMwbkZlYXR1cmVWYWx1ZShlbGVtZW50LCBudWxsLCBmZWF0dXJlLCByZWFsaXplcik7Ci0JfQotCQotCS8qKgotCSAqIGdldCB0aGUgY2FsY3VsYXRlZCAwLi5uIGZlYXR1cmUgdmFsdWUgb2YgdGhlIHNwZWNpcGllZCBlbGVtZW50IGFuZAotCSAqIGZlYXR1cmUuIGlmIHRoZSBvcHBvc2l0ZSBmZWF0dXJlIG9uIHRoZSBvdGhlciBlbmQgaXMgYSB0by1vbmUgZmVhdHVyZSwKLQkgKiB0aGUgZmVhdHVyZSB2YWx1ZSBpdGVtIGNhbid0IGJlIGluIHRoZSB2YWx1ZSBsaXN0IHVubGVzcyBpdCdzIG9wcG9zaXRlCi0JICogZmVhdHVyZSB2YWx1ZSBpcyB0aGUgY3VycmVudCBlbGVtZW50LiBGb3IgZXhhbXBsZSwgZm9yIGRpc2NpcGxpbmVfdGFza3MsCi0JICogdGhlIHRhc2tzIGNhbiBiZSBzZWxlY3RlZCBpZiBhbmQgT05MWSBpZiB0aGUgdGFzaydzIHRhc2tfZGlzY2lwbGluZQotCSAqIG9wcG9zaXRlIGZlYXR1cmUgdmFsdWUgaXMgdGhlIGN1cnJlbnQgZGlzY2lwbGluZQotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50IE1ldGhvZEVsZW1lbnQKLQkgKiBAcGFyYW0gb3duZXJFbGVtZW50IHtAbGluayBNZXRob2RFbGVtZW50fQotCSAqIEBwYXJhbSBmZWF0dXJlIHtAbGluayBFU3RydWN0dXJhbEZlYXR1cmV9Ci0JICogQHBhcmFtIHJlYWxpemVyIHtAbGluayBFbGVtZW50UmVhbGl6ZXJ9Ci0JICogQHJldHVybiBMaXN0IGEgbGlzdCBvZiB7QGxpbmsgTWV0aG9kRWxlbWVudH0KLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3QgY2FsYzBuRmVhdHVyZVZhbHVlKE1ldGhvZEVsZW1lbnQgZWxlbWVudCwgTWV0aG9kRWxlbWVudCBvd25lckVsZW1lbnQsIAotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIEVsZW1lbnRSZWFsaXplciByZWFsaXplcikgewotCQkJCQotCQlMaXN0IHYgPSBudWxsOwotCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IHJlYWxpemVyLmdldENvbmZpZ3VyYXRpb24oKTsKLQkJCi0JCS8vIFdyb25nICJtb2RpZmllcyIgaW5mb3JtYXRpb24gcHVibGlzaGVkIGluIHRlYW0gYWxsb2NhdGlvbiB2aWV3IGZvciBzbWFsbCBjb25maWd1cmF0aW9uCi0JCS8vIG5lZWQgdG8gbWFudWFsbHkgY2FsY3VsYXRlIHRoZSBtb2RpZnkgZmVhdHVyZXMKLQkJLy8gY2FuJ3QgcmVseSBvbiB0aGUgdW1hIG1vZGVsIHNpbmNlIHRoYXQgaXMgbm90IGNvbmZpZ3VyYXRpb24gc3BlY2lmaWMuCi0JCS8vIHJvbGUgbW9kaWZpZXMgcHJvZHVjdCBtZWFuczoKLQkJLy8gcm9sZSBwZXJmb3JtcyBvbiB0YXNrcywgYW5kIHRhc2tzIHByb2R1Y2Ugd29ya3Byb2R1Y3RzIGFzIG91dHB1dAotCQkvLyBzbyBoYW5kbGUgdGhlc2Ugc2NlbmFyaW9zIGFzIHNwZWNpYWwgY2FzZXMKLQkJaWYgKCBlbGVtZW50IGluc3RhbmNlb2YgUm9sZSAmJiBmZWF0dXJlID09IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFJvbGVfTW9kaWZpZXMoKSApIHsKLS8vCQkJTGlzdCB2MiA9IG5ldyBBcnJheUxpc3QoKTsKLS8vCQkJY2FsY3VsYXRlT3Bwb3NpdGVGZWF0dXJlKGVsZW1lbnQsIEFzc29jaWF0aW9uSGVscGVyLlJvbGVfUHJpbWFyeV9UYXNrcywgcmVhbGl6ZXIsIHYyKTsKLS8vCQkJaWYgKCB2Mi5zaXplKCkgPiAwICkgewotLy8JCQkJZm9yIChJdGVyYXRvciBpdCA9IHYyLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTsgKSB7Ci0vLwkJCQkJTWV0aG9kRWxlbWVudCBlID0gKE1ldGhvZEVsZW1lbnQpaXQubmV4dCgpOwotLy8JCQkJCWNhbGN1bGF0ZUZlYXR1cmUoZSwgb3duZXJFbGVtZW50LCBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrX091dHB1dCgpLCBjb25maWcsIHYsIHJlYWxpemVyKTsJCQkJCQotLy8JCQkJfQotLy8JCQl9CQotCQkJdiA9IGNhbGNNb2RpZmllZFdvcmtQcm9kdWN0cygoUm9sZSllbGVtZW50LCBvd25lckVsZW1lbnQsIHJlYWxpemVyKTsKLQkJfWVsc2UgaWYgKCBlbGVtZW50IGluc3RhbmNlb2YgUm9sZURlc2NyaXB0b3IgJiYgZmVhdHVyZSA9PSBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRSb2xlRGVzY3JpcHRvcl9Nb2RpZmllcygpICkgewotLy8JCQlMaXN0IHYyID0gbmV3IEFycmF5TGlzdCgpOwotLy8JCQljYWxjdWxhdGVPcHBvc2l0ZUZlYXR1cmUoZWxlbWVudCwgQXNzb2NpYXRpb25IZWxwZXIuUm9sZURlc2NyaXB0b3JfUHJpbWFyeVRhc2tEZXNjcmlwdG9ycywgcmVhbGl6ZXIsIHYyKTsKLS8vCQkJaWYgKCB2Mi5zaXplKCkgPiAwICkgewotLy8JCQkJZm9yIChJdGVyYXRvciBpdCA9IHYyLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTsgKSB7Ci0vLwkJCQkJTWV0aG9kRWxlbWVudCBlID0gKE1ldGhvZEVsZW1lbnQpaXQubmV4dCgpOwotLy8JCQkJCWNhbGN1bGF0ZUZlYXR1cmUoZSwgb3duZXJFbGVtZW50LCBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrRGVzY3JpcHRvcl9PdXRwdXQoKSwgY29uZmlnLCB2LCByZWFsaXplcik7CQkJCQkKLS8vCQkJCX0KLS8vCQkJfQotCQkJdiA9IGNhbGNNb2RpZmllZFdvcmtQcm9kdWN0RGVzY3JpcHRvcnMoKFJvbGVEZXNjcmlwdG9yKWVsZW1lbnQsIG93bmVyRWxlbWVudCwgcmVhbGl6ZXIpOwotCQl9IGVsc2UgewotCQkJVG9NYW55RmVhdHVyZVZhbHVlIGZ2ID0gbmV3IFRvTWFueUZlYXR1cmVWYWx1ZShlbGVtZW50LCBvd25lckVsZW1lbnQsIGZlYXR1cmUsIHJlYWxpemVyKTsKLQkJCWNhbGN1bGF0ZUZlYXR1cmUoZWxlbWVudCwgb3duZXJFbGVtZW50LCBmZWF0dXJlLCBjb25maWcsIGZ2LCByZWFsaXplcik7Ci0JCQl2ID0gKExpc3QpZnYuZ2V0VmFsdWUoKTsKLQkJfQotCQkKLQkJTGlzdCB2YWx1ZXMgPSBnZXRDYWxjdWxhdGVkRWxlbWVudHModiwgcmVhbGl6ZXIpOwotCQlpZiAodmFsdWVzLmNvbnRhaW5zKGVsZW1lbnQpKSB7Ci0JCQl2YWx1ZXMucmVtb3ZlKGVsZW1lbnQpOwotCQl9Ci0KLQkJLy8gKiBpZiB0aGUgb3Bwb3NpdGUgZmVhdHVyZSBvbiB0aGUgb3RoZXIgZW5kIGlzIGEgdG8tb25lIGZlYXR1cmUsCi0JCS8vICogdGhlIGZlYXR1cmUgdmFsdWUgaXRlbSBjYW4ndCBiZSBpbiB0aGUgdmFsdWUgbGlzdCB1bmxlc3MgaXQncwotCQkvLyBvcHBvc2l0ZSBmZWF0dXJlIHZhbHVlIGlzIHRoZSBjdXJyZW50IGVsZW1lbnQuCi0JCS8vICogRm9yIGV4YW1wbGUsIGZvciBkaXNjaXBsaW5lX3Rhc2tzLCB0aGUgdGFza3MgY2FuIGJlIHNlbGVjdGVkCi0JCS8vICogaWYgYW5kIE9OTFkgaWYgdGhlIHRhc2sncyB0YXNrX2Rpc2NpcGxpbmUgb3Bwb3NpdGUgZmVhdHVyZSB2YWx1ZSBpcwotCQkvLyB0aGUgY3VycmVudCBkaXNjaXBsaW5lCi0JCU9wcG9zaXRlRmVhdHVyZSBvZiA9IGdldDAxT3Bwb3NpdGVGZWF0dXJlKGZlYXR1cmUpOwotCQlpZiAob2YgIT0gbnVsbCkgewotCQkJaW50IGkgPSAwOwotCQkJd2hpbGUgKGkgPCB2YWx1ZXMuc2l6ZSgpKSB7Ci0JCQkJTWV0aG9kRWxlbWVudCBvID0gKE1ldGhvZEVsZW1lbnQpIHZhbHVlcy5nZXQoaSk7Ci0KLQkJCQkvLyBjYWxjdWxhdGUgaXQncyBvcHBvc2l0ZSBmZWF0dXJlIHZhbHVlLCB0aGUgdmFsdWUgbXVzdCBiZSB0aGUKLQkJCQkvLyBnaXZlbiBlbGVtZW50Ci0JCQkJLy8gb3RoZXJ3aXNlLCByZW1vdmUgaXQKLQkJCQkvLyBub3RlOiBkb24ndCB1c2UgdGhlIGN1cnJlbnQgcmVhbGl6ZXIKLQkJCQkvLyB1c2UgdGhlIGRlZmF1bHQgcmVhbGl6ZXIgc2luY2Ugd2UgbmVlZCB0byByZWFsaXplIHRoZSBlbGVtZW50IGluIHRoZSBkZWZhdWx0IHdheQotCQkJCS8vIDE1ODkyNCAtIHdyb25nIGNhdGVnb3JpZXMgaW4gY29uZmlndXJhdGlvbiB2aWV3Ci0KLQkJCQkKLQkJCQkvLyB3b3JrYXJvdW5kIHRvIGFsbG93IHNob3cvaGlkZSBzdWJ0cmFjdGVkIGVsZW1lbnRzCi0JCQkJRWxlbWVudFJlYWxpemVyIHIgPSBEZWZhdWx0RWxlbWVudFJlYWxpemVyLm5ld0VsZW1lbnRSZWFsaXplcihjb25maWcpOwotCQkJCXIuc2V0U2hvd1N1YnRyYWN0ZWQocmVhbGl6ZXIuc2hvd1N1YnRyYWN0ZWQoKSk7Ci0JCQkJCi0JCQkJTWV0aG9kRWxlbWVudCBvbyA9IGNhbGMwMUZlYXR1cmVWYWx1ZShvLCBvZiwgcik7Ci0JCQkJaWYgKG9vICE9IGVsZW1lbnQpIHsKLQkJCQkJdmFsdWVzLnJlbW92ZShpKTsKLQkJCQl9IGVsc2UgewotCQkJCQlpKys7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJLy8gY29udGFpbm1lbnQgZmVhdHVyZSB2YWx1ZSBzaG91bGQgbm90IGNvbnRhaW4gdGhlIG93bmVyIGVsZW1lbnQgb3IgaXRzCi0JCS8vIHBhcmVudHMKLQkJLy8gZm9yIGV4YW1wbGUsIGFydGlmYWN0X2NvbnRhaW5lZEFydGlmYWN0cyBzaG91bGQgbm90IGJlIHRoZSBhcnRpZmFjdAotCQkvLyBpdHNlbGYgb3IgaXRzIHBhcmVudHMKLQkJaWYgKGlzQ29udGFpbm1lbnRGZWF0dXJlKGZlYXR1cmUpKSB7Ci0JCQlMaXN0IGNvbnRhaW5lcnMgPSBnZXRDb250YWluZXJzKGVsZW1lbnQsIGNvbmZpZyk7Ci0JCQlpbnQgaSA9IDA7Ci0JCQl3aGlsZSAoaSA8IHZhbHVlcy5zaXplKCkpIHsKLQkJCQlPYmplY3QgbyA9IChPYmplY3QpIHZhbHVlcy5nZXQoaSk7Ci0JCQkJaWYgKG8gPT0gZWxlbWVudCB8fCBjb250YWluZXJzLmNvbnRhaW5zKG8pKSB7Ci0JCQkJCXZhbHVlcy5yZW1vdmUoaSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJaSsrOwotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQkJTGlzdCByZXR1cm5MaXN0ID0gcmVhbGl6ZXIucmVhbGl6ZShlbGVtZW50LCBmZWF0dXJlLCB2YWx1ZXMpOwotCQlpZiAoQ2F0ZWdvcnlTb3J0SGVscGVyLm5lZWRUb1NvcnQoZWxlbWVudCwgZmVhdHVyZSkpIHsKLQkJCXJldHVybkxpc3QgPSBDYXRlZ29yeVNvcnRIZWxwZXIuc29ydENhdGVnb3J5RWxlbWVudHMoZWxlbWVudCwgcmV0dXJuTGlzdC50b0FycmF5KCksIHRydWUpOwotCQl9Ci0KLQkJLy8gdGhlIGZvbGxvd2luZyBwYXJ0IG1pZ2h0IG5vdCBiZSBnZW5lcmFsIHRvIGFsbCBjYXNlcwotCQkvLyBzbyBwdXQgaXQgaW50byB0aGUgcmVhbGl6ZXIKLQkJcmV0dXJuIHJldHVybkxpc3Q7Ci0JCQotLy8JCS8vIGlmIHRoZSBmZWF0dXJlIHZhbHVlIGlzIGNvbnRhaW5tZW50IGVsZW1lbnQgc3VjaCBhcyBhcnRpZmFjdAotLy8JCS8vIHRoZSBjaGlsZCBlbGVtZW50IGNhbid0IHNob3cgaWYgYW55IG9mIHRoZSBwYXJlbnQocykgYXJlIGluIHRoZSBsaXN0Ci0vLwkJLy8gUHVibGlzaGVkIHNpdGU6IERpc3BsYXkgb2YgV1BzIHVuZGVyIHJlc3BvbnNpYmxlIHJvbGUKLS8vCQlpZiAoZmVhdHVyZS5pc01hbnkoKSAmJiB2YWx1ZXMuc2l6ZSgpID4gMAotLy8JCQkJJiYgaXNDb250YWlubWVudEVsZW1lbnQodmFsdWVzLmdldCgwKSkpIHsKLS8vCQkJaW50IGkgPSAwOwotLy8JCQl3aGlsZSAoaSA8IHZhbHVlcy5zaXplKCkpIHsKLS8vCQkJCU1ldGhvZEVsZW1lbnQgbyA9IChNZXRob2RFbGVtZW50KSB2YWx1ZXMuZ2V0KGkpOwotLy8KLS8vCQkJCS8vIGlmIHRoZSBjb250YWluZXIgb2YgdGhlIGVsZW1lbnQgaXMgaW4gdGhlIGxpc3QsIHJlbW92ZSB0aGlzCi0vLwkJCQkvLyBlbGVtZW50IGZyb20gdGhlIGxpc3QKLS8vCQkJCWlmIChpc0NvbnRhaW5lckluTGlzdChvLCB2YWx1ZXMsIGNvbmZpZykpIHsKLS8vCQkJCQl2YWx1ZXMucmVtb3ZlKGkpOwotLy8JCQkJfSBlbHNlIHsKLS8vCQkJCQlpKys7Ci0vLwkJCQl9Ci0vLwkJCX0KLS8vCQl9Ci0vLwotLy8JCS8vIG5lZWQgdG8gc29ydCB0aGUgY29uY2VwdCBhbmQgcGFwZXJzIGJ5IHR5cGUKLS8vCQlpZiAoKGZlYXR1cmUgPT0gVW1hUGFja2FnZS5lSU5TVEFOQ0UKLS8vCQkJCS5nZXRDb250ZW50RWxlbWVudF9Db25jZXB0c0FuZFBhcGVycygpKQotLy8JCQkJJiYgKHZhbHVlcy5zaXplKCkgPiAwKSkgewotLy8JCQlMaXN0IHBhcGVycyA9IG5ldyBBcnJheUxpc3QoKTsKLS8vCQkJaW50IGkgPSAwOwotLy8JCQl3aGlsZSAoaSA8IHZhbHVlcy5zaXplKCkpIHsKLS8vCQkJCU9iamVjdCBvID0gdmFsdWVzLmdldChpKTsKLS8vCQkJCWlmIChvIGluc3RhbmNlb2YgV2hpdGVwYXBlcikgewotLy8JCQkJCXBhcGVycy5hZGQobyk7Ci0vLwkJCQkJdmFsdWVzLnJlbW92ZShpKTsKLS8vCQkJCX0gZWxzZSB7Ci0vLwkJCQkJaSsrOwotLy8JCQkJfQotLy8JCQl9Ci0vLwotLy8JCQlpZiAocGFwZXJzLnNpemUoKSA+IDApIHsKLS8vCQkJCXZhbHVlcy5hZGRBbGwocGFwZXJzKTsKLS8vCQkJfQotLy8JCX0KLS8vCi0vLwkJcmV0dXJuIHZhbHVlczsKLQl9Ci0KLQkvKioKLQkgKiBjaGVjayBpZiB0aGUgY29udGFpbmVyIG9mIHRoZSBlbGVtZW50IGlzIGluIHRoZSBsaXN0IG9yIG5vdAotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogQHBhcmFtIGl0ZW1zCi0JICogQHBhcmFtIGNvbmZpZwotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNDb250YWluZXJJbkxpc3QoTWV0aG9kRWxlbWVudCBlbGVtZW50LCBMaXN0IGl0ZW1zLAotCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLQkJRU9iamVjdCBvID0gZWxlbWVudDsKLQkJd2hpbGUgKChvICE9IG51bGwpICYmICgobyA9IG8uZUNvbnRhaW5lcigpKSAhPSBudWxsKQotCQkJCSYmIG8uZ2V0Q2xhc3MoKS5pc0luc3RhbmNlKGVsZW1lbnQpKSB7Ci0JCQlpZiAoaXRlbXMuY29udGFpbnMobykpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQotCQkJaWYgKG8gaW5zdGFuY2VvZiBWYXJpYWJpbGl0eUVsZW1lbnQpIHsKLQkJCQlvID0gZ2V0Q2FsY3VsYXRlZEVsZW1lbnQoKFZhcmlhYmlsaXR5RWxlbWVudCkgbywgY29uZmlnKTsKLQkJCX0KLQotCQkJaWYgKChvICE9IG51bGwpICYmIGl0ZW1zLmNvbnRhaW5zKG8pKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogZ2V0IHRoZSBjYWxjdWxhdGVkIGF0dHJpYnV0ZSBmZWF0dXJlIHZhbHVlIG9mIHRoZSBzcGVjaXBpZWQgZWxlbWVudCBhbmQKLQkgKiBmZWF0dXJlCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQge0BsaW5rIE1ldGhvZEVsZW1lbnR9Ci0JICogQHBhcmFtIGZlYXR1cmUge0BsaW5rIEVTdHJ1Y3R1cmFsRmVhdHVyZX0KLQkgKiBAcGFyYW0gY29uZmlnIHtAbGluayBNZXRob2RDb25maWd1cmF0aW9ufQotCSAqIEByZXR1cm4gT2JqZWN0Ci0JICovCi0JcHVibGljIHN0YXRpYyBPYmplY3QgY2FsY0F0dHJpYnV0ZUZlYXR1cmVWYWx1ZShNZXRob2RFbGVtZW50IGVsZW1lbnQsCi0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLQkJcmV0dXJuIGNhbGNBdHRyaWJ1dGVGZWF0dXJlVmFsdWUoZWxlbWVudCwgbnVsbCwgZmVhdHVyZSwgY29uZmlnKTsKLQl9Ci0KLQkvKioKLQkgKiBnZXQgdGhlIGNhbGN1bGF0ZWQgYXR0cmlidXRlIGZlYXR1cmUgdmFsdWUgb2YgdGhlIHNwZWNpcGllZCBlbGVtZW50IGFuZAotCSAqIGZlYXR1cmUKLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudCBNZXRob2RFbGVtZW50Ci0JICogQHBhcmFtIG93bmVyRWxlbWVudCB7QGxpbmsgTWV0aG9kRWxlbWVudH0KLQkgKiBAcGFyYW0gZmVhdHVyZSB7QGxpbmsgRVN0cnVjdHVyYWxGZWF0dXJlfQotCSAqIEBwYXJhbSBjb25maWcge0BsaW5rIE1ldGhvZENvbmZpZ3VyYXRpb259Ci0JICogQHJldHVybiBPYmplY3QKLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9iamVjdCBjYWxjQXR0cmlidXRlRmVhdHVyZVZhbHVlKE1ldGhvZEVsZW1lbnQgZWxlbWVudCwKLQkJCU1ldGhvZEVsZW1lbnQgb3duZXJFbGVtZW50LCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwKLQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0JCWlmIChpc01lcmdhYmxlQXR0cmlidXRlKGZlYXR1cmUpKSB7Ci0JCQkvLyBtZXJnZSB0aGUgYXR0cmlidXRlIHZhbHVlcwotCQkJRWxlbWVudFJlYWxpemVyIHJlYWxpemVyID0gRGVmYXVsdEVsZW1lbnRSZWFsaXplci5uZXdFbGVtZW50UmVhbGl6ZXIoY29uZmlnKTsKLQkJCUF0dHJpYnV0ZUZlYXR1cmVWYWx1ZSB2YWx1ZXMgPSBuZXcgQXR0cmlidXRlRmVhdHVyZVZhbHVlKGVsZW1lbnQsIG93bmVyRWxlbWVudCwgZmVhdHVyZSwgcmVhbGl6ZXIpOwotCQkJY2FsY3VsYXRlRmVhdHVyZShlbGVtZW50LCBvd25lckVsZW1lbnQsIGZlYXR1cmUsIGNvbmZpZywgdmFsdWVzLAotCQkJCQkJcmVhbGl6ZXIpOwotCi0vLwkJCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0vLwkJCWZvciAoSXRlcmF0b3IgaXQgPSB2YWx1ZXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotLy8JCQkJRmVhdHVyZVZhbHVlIGF2ID0gKEZlYXR1cmVWYWx1ZSkgaXQubmV4dCgpOwotLy8JCQkJaWYgKGF2LnRleHQgPT0gbnVsbCB8fCBhdi50ZXh0LnRvU3RyaW5nKCkubGVuZ3RoKCkgPT0gMCkgewotLy8JCQkJCWNvbnRpbnVlOwotLy8JCQkJfQotLy8KLS8vCQkJCWlmIChmZWF0dXJlID09IFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0vLwkJCQkJCS5nZXRNZXRob2RFbGVtZW50X1ByZXNlbnRhdGlvbk5hbWUoKSkgewotLy8JCQkJCWlmICh2YWx1ZXMuc2l6ZSgpID4gMSkgewotLy8JCQkJCQkvLyBzb21ldGhpbmcgd3JvbmcgaGVyZSwgd2lsbCBub3QgaGFwcGVuIGJ1dCBwdXQgdGVzdAotLy8JCQkJCQkvLyBtZXNzYWdlIGhlcmUganVzdCBpbiBjYXNlCi0vLwkJCQkJCWlmIChkZWJ1ZykgewotLy8JCQkJCQkJU3lzdGVtLm91dAotLy8JCQkJCQkJCQkucHJpbnRsbigiQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjQXR0cmlidXRlRmVhdHVyZVZhbHVlOiBQcmVzZW50YXRpb24gTmFtZSBnZXQgbW9yZSB0aGVuIG9uZSBlbnRyeTogIiArIExpYnJhcnlVdGlsLmdldFR5cGVOYW1lKGVsZW1lbnQpKTsgLy8kTk9OLU5MUy0xJAotLy8JCQkJCQl9Ci0vLwkJCQkJfQotLy8JCQkJCXJldHVybiBhdi50ZXh0OwotLy8JCQkJfQotLy8KLS8vCQkJCWlmIChidWZmZXIubGVuZ3RoKCkgPiAwKSB7Ci0vLwkJCQkJYnVmZmVyLmFwcGVuZChBVFRSSUJVVEVfVkFMVUVfU0VQRVJBVE9SKTsgCi0vLwkJCQl9Ci0vLwotLy8JCQkJaWYgKGF2LmVsZW1lbnQgPT0gZWxlbWVudCkgewotLy8JCQkJCWJ1ZmZlci5hcHBlbmQoYXYudGV4dCk7Ci0vLwkJCQl9IGVsc2UgewotLy8JCQkJCVN0cmluZyBjb250ZW50UGF0aCA9IFJlc291cmNlSGVscGVyCi0vLwkJCQkJCQkuZ2V0RWxlbWVudFBhdGgoKGF2LmVsZW1lbnQgaW5zdGFuY2VvZiBDb250ZW50RGVzY3JpcHRpb24pID8gKE1ldGhvZEVsZW1lbnQpIGF2LmVsZW1lbnQKLS8vCQkJCQkJCQkJLmVDb250YWluZXIoKQotLy8JCQkJCQkJCQk6IGF2LmVsZW1lbnQpOwotLy8KLS8vCQkJCQlTdHJpbmcgYmFja1BhdGggPSBSZXNvdXJjZUhlbHBlcgotLy8JCQkJCQkJLmdldEJhY2tQYXRoKChlbGVtZW50IGluc3RhbmNlb2YgQ29udGVudERlc2NyaXB0aW9uKSA/ICgob3duZXJFbGVtZW50ICE9IG51bGwpID8gb3duZXJFbGVtZW50Ci0vLwkJCQkJCQkJCTogKE1ldGhvZEVsZW1lbnQpIGVsZW1lbnQuZUNvbnRhaW5lcigpKQotLy8JCQkJCQkJCQk6IGVsZW1lbnQpOwotLy8KLS8vCQkJCQlidWZmZXIuYXBwZW5kKFJlc291cmNlSGVscGVyLmZpeENvbnRlbnRVcmxQYXRoKGF2LnRleHQsCi0vLwkJCQkJCQljb250ZW50UGF0aCwgYmFja1BhdGgpKTsKLS8vCQkJCX0KLS8vCQkJfQotLy8KLS8vCQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCQkJCi0JCQlyZXR1cm4gdmFsdWVzLmdldFZhbHVlKCk7Ci0JCX0KLQotCQlyZXR1cm4gZWxlbWVudC5lR2V0KGZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIGdldCB0aGUgY2FsY3VsYXRlZCAwLi5uIG9wcG9zaXRlIGZlYXR1cmUgdmFsdWUgb2YgdGhlIHNwZWNpcGllZCBlbGVtZW50Ci0JICogYW5kIG9wcG9zaXRlIGZlYXR1cmUKLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudCBNZXRob2RFbGVtZW50Ci0JICogQHBhcmFtIGZlYXR1cmUge0BsaW5rIEVTdHJ1Y3R1cmFsRmVhdHVyZX0KLQkgKiBAcGFyYW0gcmVhbGl6ZXIge0BsaW5rIEVsZW1lbnRSZWFsaXplcn0KLQkgKiBAcmV0dXJuIExpc3QgYSBsaXN0IG9mIHtAbGluayBNZXRob2RFbGVtZW50fQotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCBjYWxjMG5GZWF0dXJlVmFsdWUoTWV0aG9kRWxlbWVudCBlbGVtZW50LAotCQkJT3Bwb3NpdGVGZWF0dXJlIGZlYXR1cmUsIEVsZW1lbnRSZWFsaXplciByZWFsaXplcikgewotCQlyZXR1cm4gY2FsYzBuRmVhdHVyZVZhbHVlKGVsZW1lbnQsIGZlYXR1cmUsIHRydWUsIGZhbHNlLCByZWFsaXplcik7Ci0JfQotCi0JLyoqCi0JICogZ2V0IHRoZSBjYWxjdWxhdGVkIDAuLm4gb3Bwb3NpdGUgZmVhdHVyZSB2YWx1ZSBvZiB0aGUgc3BlY2lwaWVkIGVsZW1lbnQKLQkgKiBhbmQgb3Bwb3NpdGUgZmVhdHVyZQotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50IE1ldGhvZEVsZW1lbnQKLQkgKiBAcGFyYW0gb3duZXJFbGVtZW50IHtAbGluayBNZXRob2RFbGVtZW50fQotCSAqIEBwYXJhbSBmZWF0dXJlIHtAbGluayBPcHBvc2l0ZUZlYXR1cmV9Ci0JICogQHBhcmFtIG1lcmdlUmVwbGFjZXJCYXNlIGJvb2xlYW4KLQkgKiBAcGFyYW0gbWVyZ2VFeHRlbmRlckJhc2UgYm9vbGVhbgotCSAqIEBwYXJhbSByZWFsaXplciB7QGxpbmsgRWxlbWVudFJlYWxpemVyfQotCSAqIEByZXR1cm4gTGlzdCBhIGxpc3Qgb2Yge0BsaW5rIE1ldGhvZEVsZW1lbnR9Ci0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0IGNhbGMwbkZlYXR1cmVWYWx1ZShNZXRob2RFbGVtZW50IGVsZW1lbnQsCi0JCQlPcHBvc2l0ZUZlYXR1cmUgZmVhdHVyZSwgYm9vbGVhbiBtZXJnZVJlcGxhY2VyQmFzZSwgYm9vbGVhbiBtZXJnZUV4dGVuZGVyQmFzZSwgRWxlbWVudFJlYWxpemVyIHJlYWxpemVyKSB7Ci0JCVRvTWFueU9wcG9zaXRlRmVhdHVyZVZhbHVlIHZhbHVlcyA9IG5ldyBUb01hbnlPcHBvc2l0ZUZlYXR1cmVWYWx1ZShlbGVtZW50LCBmZWF0dXJlLCByZWFsaXplcik7Ci0JCWNhbGN1bGF0ZU9wcG9zaXRlRmVhdHVyZShlbGVtZW50LCBmZWF0dXJlLCBtZXJnZVJlcGxhY2VyQmFzZSwgbWVyZ2VFeHRlbmRlckJhc2UsIHJlYWxpemVyLCB2YWx1ZXMpOwotCQlyZXR1cm4gKExpc3QpdmFsdWVzLmdldFZhbHVlKCk7Ci0JfQotCQotCQotCQotCS8qKgotCSAqIGdldCB0aGUgY2FsY3VsYXRlZCAwLi4xIGZlYXR1cmUgdmFsdWUgb2YgdGhlIHNwZWNpcGllZCBlbGVtZW50IGFuZAotCSAqIG9wcG9zaXRlIGZlYXR1cmUKLQkgKiBAcGFyYW0gZWxlbWVudCB7QGxpbmsgTWV0aG9kRWxlbWVudH0KLQkgKiBAcGFyYW0gZmVhdHVyZSB7QGxpbmsgT3Bwb3NpdGVGZWF0dXJlfQotCSAqIEBwYXJhbSByZWFsaXplciB7QGxpbmsgRWxlbWVudFJlYWxpemVyfQotCSAqIAotCSAqIEByZXR1cm4gTWV0aG9kRWxlbWVudAotCSAqLwotCXB1YmxpYyBzdGF0aWMgTWV0aG9kRWxlbWVudCBjYWxjMDFGZWF0dXJlVmFsdWUoTWV0aG9kRWxlbWVudCBlbGVtZW50LAotCQkJT3Bwb3NpdGVGZWF0dXJlIGZlYXR1cmUsIEVsZW1lbnRSZWFsaXplciByZWFsaXplcikgewotCQlUb09uZU9wcG9zaXRlRmVhdHVyZVZhbHVlIHZhbHVlcyA9IG5ldyBUb09uZU9wcG9zaXRlRmVhdHVyZVZhbHVlKGVsZW1lbnQsIGZlYXR1cmUsIHJlYWxpemVyKTsKLQkJY2FsY3VsYXRlT3Bwb3NpdGVGZWF0dXJlKGVsZW1lbnQsIGZlYXR1cmUsIHJlYWxpemVyLCB2YWx1ZXMpOwotLy8JCWlmICh2YWx1ZXMuc2l6ZSgpID4gMCkgewotLy8JCQlyZXR1cm4gZ2V0Q2FsY3VsYXRlZEVsZW1lbnQoKE1ldGhvZEVsZW1lbnQpIHZhbHVlcy5nZXQoMCksIHJlYWxpemVyKTsKLS8vCQl9Ci0vLwotLy8JCXJldHVybiBudWxsOwotCQkKLQkJcmV0dXJuIChNZXRob2RFbGVtZW50KXZhbHVlcy5nZXRWYWx1ZSgpOwotCQkKLQl9Ci0KLQkvKioKLQkgKiBvcmRlciB0aGUgc2VjdGlvbnMKLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudCB7QGxpbmsgQ29udGVudEVsZW1lbnR9Ci0JICogQHBhcmFtIHZhbHVlcyB7QGxpbmsgTGlzdH0gCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIG9yZGVyU2VjdGlvbnMoQ29udGVudEVsZW1lbnQgZWxlbWVudCwgTGlzdCB2YWx1ZXMpIHsKLQkJU3RyaW5nIG9yZGVyaW5nR3VpZGUgPSBlbGVtZW50LmdldE9yZGVyaW5nR3VpZGUoKTsKLQkJaWYgKG9yZGVyaW5nR3VpZGUgPT0gbnVsbCB8fCBvcmRlcmluZ0d1aWRlLnRyaW0oKS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJU2VjdGlvbkxpc3Qgc2xpc3QgPSBuZXcgU2VjdGlvbkxpc3QoZWxlbWVudCwKLQkJCQlTZWN0aW9uTGlzdC5TVEVQU19GT1JfRUxFTUVOVF9BTkRfUEFSRU5UUyk7Ci0KLQkJaWYgKGlzU2FtZUxpc3QodmFsdWVzLCBzbGlzdCkpIHsKLQkJCXZhbHVlcy5jbGVhcigpOwotCQkJdmFsdWVzLmFkZEFsbChzbGlzdCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQkvLyBvdGhlcndpc2UsIG5lZWQgdG8gcmVvcmRlciB0aGUgbGlzdAotCQlPcmRlcmVkTGlzdENvbXBhcmF0b3IgY29tcCA9IG5ldyBPcmRlcmVkTGlzdENvbXBhcmF0b3IobmV3IEFycmF5TGlzdCgKLQkJCQl2YWx1ZXMpLCBzbGlzdCk7Ci0JCVRyZWVTZXQgcyA9IG5ldyBUcmVlU2V0KGNvbXApOwotCQlzLmFkZEFsbCh2YWx1ZXMpOwotCi0JCXZhbHVlcy5jbGVhcigpOwotCQl2YWx1ZXMuYWRkQWxsKHMpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNTYW1lTGlzdChMaXN0IGwxLCBMaXN0IGwyKSB7Ci0JCWlmIChsMS5zaXplKCkgIT0gbDIuc2l6ZSgpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gbDEuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IG8gPSBpdC5uZXh0KCk7Ci0JCQlpZiAoIWwyLmNvbnRhaW5zKG8pKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogY2FsY3VsYXRlIHRoZSBjb3B5cmlnaHQgb2YgdGhlIGVsZW1lbnQgaW50IGhlIGNvbmZpZ3VyYXRpb24uIFJ1bGU6IDEuCi0JICogY29udHJpYnV0b3JzJyBjb3B5cmlnaHQgc3RhdG1lbnQgc2hvdWxkIGJlIG1lcmdlZCB0byB0aGUgYmFzZSAyLiBleHRlbmRlZAotCSAqIGVsZW1lbnQgaW5oZXJpdGVzIHRoZSBjb3B5cmlnaHRzIGZyb20gdGhlIGJhc2UgMy4gcmVwbGFjZXIgZG9uJ3QgaW5oZXJpdGUKLQkgKiB0aGUgY29weXJpZ2h0cyBmcm9tIHRoZSBiYXNlIDQuIGNvcHlyaWdodCBlbGVtZW50cyBzaG91bGQgYmUgdW5pcXVlLCBubwotCSAqIGR1cGxpY2F0ZSBlbnRyeQotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogQHBhcmFtIGNvbmZpZwotCSAqIEBwYXJhbSB2YWx1ZXMKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGNhbGN1bGF0ZUNvcHlyaWdodChNZXRob2RFbGVtZW50IGVsZW1lbnQsCi0JCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZywgTGlzdCB2YWx1ZXMpIHsKLQkJU3VwcG9ydGluZ01hdGVyaWFsIGNvcHlyaWdodCA9IChTdXBwb3J0aW5nTWF0ZXJpYWwpIGdldENhbGN1bGF0ZWRFbGVtZW50KAotCQkJCUxpYnJhcnlVdGlsLmdldENvcHlyaWdodChlbGVtZW50KSwgY29uZmlnKTsKLQkJaWYgKGNvcHlyaWdodCAhPSBudWxsICYmICF2YWx1ZXMuY29udGFpbnMoY29weXJpZ2h0KSkgewotCQkJdmFsdWVzLmFkZChjb3B5cmlnaHQpOwotCQl9Ci0KLQkJVmFyaWFiaWxpdHlFbGVtZW50IHZlID0gZ2V0VmFyaWFibGVPd25lcihlbGVtZW50KTsKLQkJaWYgKHZlID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCWlmIChjb25maWcgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJLy8gbWVyZ2UgY29weXJpZ2h0cyBvZiBjb250cmlidXRvcnMKLQkJTGlzdCBpdGVtcyA9IGdldENvbnRyaWJ1dG9ycyh2ZSwgY29uZmlnKTsKLQkJaWYgKGl0ZW1zICE9IG51bGwgJiYgaXRlbXMuc2l6ZSgpID4gMCkgewotCQkJZm9yIChJdGVyYXRvciBpdCA9IGl0ZW1zLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlNZXRob2RFbGVtZW50IGUgPSAoTWV0aG9kRWxlbWVudCkgaXQubmV4dCgpOwotCQkJCWNhbGN1bGF0ZUNvcHlyaWdodChlLCBjb25maWcsIHZhbHVlcyk7Ci0JCQl9Ci0JCX0KLQotCQkvLyBpZiB0aGUgZWxlbWVudCBpcyBhbiBleHRlbmRlZCBlbGVtZW50LCBnZXQgdGhlIGJhc2UgZWxlbWVudCdzCi0JCS8vIGNvcHlyaWdodAotCQkvLyB0aGUgYmFzZSBlbGVtZW50J3MgY29weXJpZ2h0IHNob3VsZCBhcHBlYXIgZmlyc3QKLQkJaWYgKGlzRXh0ZW5kZXIodmUpKSB7Ci0JCQkvLyByZWFsaXplIHRoZSBiYXNlIGVsZW1lbnQgZmlyc3QuCi0JCQlNZXRob2RFbGVtZW50IGUgPSBnZXRDYWxjdWxhdGVkRWxlbWVudCh2ZQotCQkJCQkuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpLCBjb25maWcpOwotCQkJaWYgKCh2ZSAhPSBlKSAmJiBpbkNvbmZpZyhlLCBjb25maWcpKSB7Ci0JCQkJTGlzdCBiYXNlSXRlbXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJY2FsY3VsYXRlQ29weXJpZ2h0KGUsIGNvbmZpZywgYmFzZUl0ZW1zKTsKLQotCQkJCS8vIGFkZCB0aGUgYmFzZSBpdGVtcyB0byB0aGUgYmVnaW5pbmcKLQkJCQlpZiAoYmFzZUl0ZW1zLnNpemUoKSA+IDApIHsKLQkJCQkJLy8gQXV0aG9yaW5nOiBEdXBsaWNhdGUgY29weXJpZ2h0cyB3aGVuIDIKLQkJCQkJLy8gZWxlbWVudHMgd2l0aCB0aGUgc2FtZSBjb3lyaWdodCBhcmUgZXh0ZW5kaW5nIGVhY2ggb3RoZXIKLQkJCQkJLy8gcmVtb3ZlIHRoZSBkdXBsaWNhdGUgb25lcwotCQkJCQlpbnQgaSA9IDA7Ci0JCQkJCXdoaWxlIChpIDwgdmFsdWVzLnNpemUoKSkgewotCQkJCQkJaWYgKGJhc2VJdGVtcy5jb250YWlucyh2YWx1ZXMuZ2V0KGkpKSkgewotCQkJCQkJCXZhbHVlcy5yZW1vdmUoaSk7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCWkrKzsKLQkJCQkJCX0KLQkJCQkJfQotCi0JCQkJCXZhbHVlcy5hZGRBbGwoMCwgYmFzZUl0ZW1zKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIGdldCB0aGUgY29weXJpZ2h0IHRleHQKLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudCB7QGxpbmsgTWV0aG9kRWxlbWVudH0KLQkgKiBAcGFyYW0gY29uZmlnIHtAbGluayBNZXRob2RDb25maWd1cmF0aW9ufQotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0Q29weXJpZ2h0VGV4dChNZXRob2RFbGVtZW50IGVsZW1lbnQsCi0JCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZykgewotCQlTdHJpbmdCdWZmZXIgY29weXJpZ2h0cyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJTGlzdCBpdGVtcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjdWxhdGVDb3B5cmlnaHQoZWxlbWVudCwgY29uZmlnLCBpdGVtcyk7Ci0JCWlmIChpdGVtcy5zaXplKCkgPiAwKSB7Ci0JCQlTdXBwb3J0aW5nTWF0ZXJpYWwgY29weXJpZ2h0OwotCQkJZm9yIChJdGVyYXRvciBpdCA9IGl0ZW1zLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQljb3B5cmlnaHQgPSAoU3VwcG9ydGluZ01hdGVyaWFsKSBpdC5uZXh0KCk7Ci0KLQkJCQkvLyBDb250cmlidXRpbmcgc3VwcG9ydCBtYXRlcmlhbCBkb2VzIG5vdCBzaG93Ci0JCQkJLy8gdXAgaW4gY29weSByaWdodAotCQkJCS8vIG5lZWQgdG8gcmVzb2x2ZSB0aGUgZmVhdHVyZSB2YWx1ZS4gY2FuJ3QganVzdCBnZXQgdGhlIHZhbHVlLAotCQkJCS8vIGl0IG1heSBoYXZlIGNvbnRyaWJ1dG9ycwotCQkJCS8vIFN0cmluZyBzdGF0ZW1lbnQgPQotCQkJCS8vIGNvcHlyaWdodC5nZXRQcmVzZW50YXRpb24oKS5nZXRNYWluRGVzY3JpcHRpb24oKTsKLQkJCQkvLwkJCQkJCQkJCQkJCi0JCQkJU3RyaW5nIHN0YXRlbWVudCA9IChTdHJpbmcpIGNhbGNBdHRyaWJ1dGVGZWF0dXJlVmFsdWUoY29weXJpZ2h0Ci0JCQkJCQkuZ2V0UHJlc2VudGF0aW9uKCksIGNvcHlyaWdodCwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCS5nZXRDb250ZW50RGVzY3JpcHRpb25fTWFpbkRlc2NyaXB0aW9uKCksIGNvbmZpZyk7Ci0JCQkJaWYgKHN0YXRlbWVudCAhPSBudWxsICYmIHN0YXRlbWVudC5sZW5ndGgoKSA+IDApIHsKLQkJCQkJLy8gbmVlZCB0byBmaXggdGhlIGNvbnRlbnQgZm9yIHJlbGF0aXZlIGxpbmtzLgotCQkJCQkvLyBzaW5jZSB0aGUgbGluayBpcyBhIHJlbGF0aXZlIHBhdGggdG8gdGhlCi0JCQkJCS8vIFN1cHBvcnRpbmdNYXRlcmlhbCBsb2NhdGlvbiwKLQkJCQkJLy8gbmVlZCB0byBjb252ZXJ0IHRvIHJlbGF0aXZlIHRvIHRoZSBjdXJyZW50IGVsZW1lbnQKLQkJCQkJLy8gc28gcmUtY2FsY3VhdGUgdGhlIGJhY2sgcGF0aAotCQkJCQkvLyBqeGksIDA2LzI4LzA1Ci0JCQkJCVN0cmluZyBjb250ZW50UGF0aCA9IFJlc291cmNlSGVscGVyCi0JCQkJCQkJLmdldEVsZW1lbnRQYXRoKGNvcHlyaWdodCk7Ci0JCQkJCVN0cmluZyBiYWNrUGF0aCA9IFJlc291cmNlSGVscGVyLmdldEJhY2tQYXRoKGVsZW1lbnQpOwotCQkJCQlzdGF0ZW1lbnQgPSBSZXNvdXJjZUhlbHBlci5maXhDb250ZW50VXJsUGF0aChzdGF0ZW1lbnQsCi0JCQkJCQkJY29udGVudFBhdGgsIGJhY2tQYXRoKTsKLQotCQkJCQlpZiAoY29weXJpZ2h0cy5sZW5ndGgoKSA+IDApIHsKLQkJCQkJCWNvcHlyaWdodHMuYXBwZW5kKCI8cC8+Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCQljb3B5cmlnaHRzLmFwcGVuZChzdGF0ZW1lbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiBjb3B5cmlnaHRzLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyBTdHJpbmcgYXR0cmlidXRlIHZhbHVlcyBvZiBhbiBhY3Rpdml0eQotCSAqIAotCSAqIEBwYXJhbSBlIEFjdGl2aXR5IG9yIGl0J3MgQ29udGVudERlc2NyaXB0aW9uCi0JICogQHBhcmFtIGF0dHJpYgotCSAqIEBwYXJhbSBjb25maWcKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEFjdGl2aXR5U3RyaW5nQXR0cmlidXRlKE1ldGhvZEVsZW1lbnQgZSwgTWV0aG9kRWxlbWVudCBvd25lckVsZW1lbnQsIAotCQkJRUF0dHJpYnV0ZSBhdHRyaWIsIE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0JCWlmKCFTdHJpbmcuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShhdHRyaWIuZ2V0RUF0dHJpYnV0ZVR5cGUoKS5nZXRJbnN0YW5jZUNsYXNzKCkpKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgc3BlY2lmaWVkIGF0dHJpYnV0ZSBpcyBub3Qgb2YgdHlwZSBTdHJpbmc6ICIgKyBhdHRyaWIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJCi0JCU9iamVjdCBzdHIgPSBudWxsOwotCQlib29sZWFuIGlzRGVzYzsKLQkJVmFyaWFiaWxpdHlFbGVtZW50IHZlOwotCQlpZiAoIGUgaW5zdGFuY2VvZiBDb250ZW50RGVzY3JpcHRpb24gKQotCQl7Ci0JCQl2ZSA9IChWYXJpYWJpbGl0eUVsZW1lbnQpIGUuZUNvbnRhaW5lcigpOwotCQkJaWYgKCB2ZSA9PSBudWxsICkgewotCQkJCXZlID0gKFZhcmlhYmlsaXR5RWxlbWVudClvd25lckVsZW1lbnQ7Ci0JCQl9Ci0JCQlpc0Rlc2MgPSB0cnVlOwotCQl9Ci0JCWVsc2UgaWYgKCBlIGluc3RhbmNlb2YgVmFyaWFiaWxpdHlFbGVtZW50KQotCQl7Ci0JCQl2ZSA9IChWYXJpYWJpbGl0eUVsZW1lbnQpZTsKLQkJCWlzRGVzYyA9IGZhbHNlOwotCQl9IGVsc2UgewotCQkJc3RyID0gZS5lR2V0KGF0dHJpYik7Ci0JCQlyZXR1cm4gKHN0cj09bnVsbCkgPyAiIiA6IHN0ci50b1N0cmluZygpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJCi0JCQotCQlpZihhdHRyaWIgPT0gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWV0aG9kRWxlbWVudF9HdWlkKCkgfHwgYXR0cmliID09IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE5hbWVkRWxlbWVudF9OYW1lKCkpIHsKLQkJCXJldHVybiAoU3RyaW5nKWUuZUdldChhdHRyaWIpOwotCQl9CQkKLQkJCQkJCi0JCVZhcmlhYmlsaXR5RWxlbWVudCBiYXNlID0gdmUuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpOwotCQlWYXJpYWJpbGl0eVR5cGUgdmFyaWFiaWxpdHlUeXBlID0gdmUuZ2V0VmFyaWFiaWxpdHlUeXBlKCk7Ci0JCWlmKCBiYXNlICE9IG51bGwgJiYgdmFyaWFiaWxpdHlUeXBlID09IFZhcmlhYmlsaXR5VHlwZS5MT0NBTF9DT05UUklCVVRJT04pIHsKLQkJCS8vIGZvciBsb2NhbCBjb250cmlidXRpb24sIGFwcGVuZCB0aGUgdGV4dCB0byB0aGUgYmFzZQotCQkJT2JqZWN0IHN0ckJhc2U7Ci0JCQlpZiAoIGlzRGVzYyApIHsKLQkJCQlzdHIgPSAoKERlc2NyaWJhYmxlRWxlbWVudCl2ZSkuZ2V0UHJlc2VudGF0aW9uKCkuZUdldChhdHRyaWIpOwotCQkJCXN0ckJhc2UgPSBjYWxjQXR0cmlidXRlRmVhdHVyZVZhbHVlKCAoKERlc2NyaWJhYmxlRWxlbWVudCliYXNlKS5nZXRQcmVzZW50YXRpb24oKSwgYmFzZSwgYXR0cmliLCBjb25maWcpOwotCQkJfSBlbHNlIHsKLQkJCQlzdHIgPSB2ZS5lR2V0KGF0dHJpYik7Ci0JCQkJc3RyQmFzZSA9IGNhbGNBdHRyaWJ1dGVGZWF0dXJlVmFsdWUoYmFzZSwgbnVsbCwgYXR0cmliLCBjb25maWcpOwkJCQkKLQkJCX0KLQkJCQotCQkJaWYgKCBzdHJCYXNlICE9IG51bGwgJiYgc3RyQmFzZS50b1N0cmluZygpLmxlbmd0aCgpID4gMCApIHsKLQkJCQlpZiAoIHN0ciAhPSBudWxsICYmIHN0ci50b1N0cmluZygpLmxlbmd0aCgpID4gMCApIHsKLQkJCQkJc3RyID0gc3RyQmFzZSArIEFUVFJJQlVURV9WQUxVRV9TRVBFUkFUT1IgKyBzdHI7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJc3RyID0gc3RyQmFzZTsKLQkJCQl9Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlzdHIgPSBjYWxjQXR0cmlidXRlRmVhdHVyZVZhbHVlKGUsIHZlLCBhdHRyaWIsIGNvbmZpZyk7Ci0JCX0KLQotCQlyZXR1cm4gKHN0cj09bnVsbCkgPyAiIiA6IHN0ci50b1N0cmluZygpOyAvLyROT04tTkxTLTEkCi0JCQotLy8JCUxpc3QgdmFsdWVzID0gbmV3IEFycmF5TGlzdCgpOwotLy8JCVZhcmlhYmlsaXR5RWxlbWVudCBiYXNlOwotLy8JCVZhcmlhYmlsaXR5VHlwZSB2YXJpYWJpbGl0eVR5cGU7CQotLy8JCWJvb2xlYW4gY29uY2F0ID0gYXR0cmliICE9IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE1ldGhvZEVsZW1lbnRfUHJlc2VudGF0aW9uTmFtZSgpOwotLy8JCXdoaWxlKHRydWUpIHsKLS8vCQkJYmFzZSA9IHZlLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsKLS8vCQkJaWYoYmFzZSA9PSBudWxsKSB7Ci0vLwkJCQlPYmplY3Qgc3RyOwotLy8JCQkJaWYgKCBpc0Rlc2MgKSB7Ci0vLwkJCQkJc3RyID0gKChEZXNjcmliYWJsZUVsZW1lbnQpdmUpLmdldFByZXNlbnRhdGlvbigpLmVHZXQoYXR0cmliKTsgCi0vLwkJCQl9IGVsc2UgewotLy8JCQkJCXN0ciA9ICB2ZS5lR2V0KGF0dHJpYik7IAotLy8JCQkJfQotLy8JCQkJaWYoc3RyID09IG51bGwgfHwgc3RyLnRvU3RyaW5nKCkubGVuZ3RoKCkgPT0gMCkgewotLy8JCQkJCWlmKHZhbHVlcy5pc0VtcHR5KCkpIHsKLS8vCQkJCQkJdmFsdWVzLmFkZChzdHIpOwotLy8JCQkJCX0KLS8vCQkJCX0KLS8vCQkJCWVsc2UgewotLy8JCQkJCXZhbHVlcy5hZGQoMCwgc3RyKTsKLS8vCQkJCX0KLS8vCQkJCWJyZWFrOwotLy8JCQl9Ci0vLwkJCWVsc2UgaWYoYmFzZSBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0vLwkJCQlPYmplY3Qgc3RyOwotLy8JCQkJaWYgKCBpc0Rlc2MgKSB7Ci0vLwkJCQkJc3RyID0gKChEZXNjcmliYWJsZUVsZW1lbnQpdmUpLmdldFByZXNlbnRhdGlvbigpLmVHZXQoYXR0cmliKTsgCi0vLwkJCQl9IGVsc2UgewotLy8JCQkJCXN0ciA9IHZlLmVHZXQoYXR0cmliKTsgCi0vLwkJCQl9Ci0vLwotLy8JCQkJdmFyaWFiaWxpdHlUeXBlID0gdmUuZ2V0VmFyaWFiaWxpdHlUeXBlKCk7Ci0vLwkJCQlpZih2YXJpYWJpbGl0eVR5cGUgPT0gVmFyaWFiaWxpdHlUeXBlLkVYVEVORFNfTElURVJBTCkgewotLy8JCQkJCWlmKHN0ciA9PSBudWxsIHx8IHN0ci50b1N0cmluZygpLmxlbmd0aCgpID09IDApIHsKLS8vCQkJCQkJLy8gdXNlIHRoZSB2YWx1ZSBvZiB0aGUgYmFzZQotLy8JCQkJCQkvLwotLy8JCQkJCQl2ZSA9IGJhc2U7Ci0vLwkJCQkJfQotLy8JCQkJCWVsc2UgewotLy8JCQkJCQl2YWx1ZXMuYWRkKDAsIHN0cik7Ci0vLwkJCQkJCWJyZWFrOwotLy8JCQkJCX0KLS8vCQkJCX0KLS8vCQkJCWVsc2UgaWYodmFyaWFiaWxpdHlUeXBlID09IFZhcmlhYmlsaXR5VHlwZS5MT0NBTF9DT05UUklCVVRJT05fTElURVJBTCkgewkJCQkJCi0vLwkJCQkJaWYoc3RyICE9IG51bGwgJiYgc3RyLnRvU3RyaW5nKCkubGVuZ3RoKCkgPiAwKSB7Ci0vLwkJCQkJCS8vIGFkZCB0byB0aGUgbGlzdAotLy8JCQkJCQkvLwotLy8JCQkJCQl2YWx1ZXMuYWRkKDAsIHN0cik7Ci0vLwkJCQkJCWlmKCFjb25jYXQpIHsKLS8vCQkJCQkJCWJyZWFrOwotLy8JCQkJCQl9Ci0vLwkJCQkJfQotLy8JCQkJCS8vIGdvIHRvIHRoZSBiYXNlCi0vLwkJCQkJdmUgPSBiYXNlOwotLy8JCQkJfQotLy8JCQkJZWxzZSBpZih2YXJpYWJpbGl0eVR5cGUgPT0gVmFyaWFiaWxpdHlUeXBlLkxPQ0FMX1JFUExBQ0VNRU5UX0xJVEVSQUwpIHsKLS8vCQkJCQl2YWx1ZXMuYWRkKDAsIHN0cik7Ci0vLwkJCQkJYnJlYWs7Ci0vLwkJCQl9Ci0vLwkJCQkvL1RPRE86IGhhbmRsZSBDT05UUklCVVRFUyBBTkQgUkVQTEFDRVMKLS8vCQkJfQotLy8JCX0KLS8vCQkKLS8vCQlpZiAoIHZhbHVlcy5zaXplKCkgPT0gMCApIHsKLS8vCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0vLwkJfQotLy8JCWVsc2UgaWYgKCB2YWx1ZXMuc2l6ZSgpID09MSApIHsKLS8vCQkJcmV0dXJuIChTdHJpbmcpdmFsdWVzLmdldCgwKTsKLS8vCQl9Ci0vLwkJZWxzZSB7Ci0vLwkJCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0vLwkJCWZvciAoSXRlcmF0b3IgaXQgPSB2YWx1ZXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOyApIHsKLS8vCQkJCWlmICggYnVmZmVyLmxlbmd0aCgpID4gMCApIHsKLS8vCQkJCQlidWZmZXIuYXBwZW5kKEFUVFJJQlVURV9WQUxVRV9TRVBFUkFUT1IpOwotLy8JCQkJfQotLy8JCQkJYnVmZmVyLmFwcGVuZChpdC5uZXh0KCkpOwotLy8JCQl9Ci0vLwkJCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsJCQkKLS8vCQl9Ci0JfQotCQotCS8qKgotCSAqIGdldCBhbGwgcHJvY2Vzc2VzIGluIHRoZSBjb25maWd1cmF0aW9uCi0JICogCi0JICogQHBhcmFtIGNvbmZpZwotCSAqIEByZXR1cm4gTGlzdAotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRBbGxQcm9jZXNzZXMoTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLQkJTGlzdCBwcm9jZXNzZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUxpc3QgcGx1Z2lucyA9IGNvbmZpZy5nZXRNZXRob2RQbHVnaW5TZWxlY3Rpb24oKTsKLQkJZm9yIChJdGVyYXRvciBpdCA9IHBsdWdpbnMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOyApIHsKLQkJCUxpc3QgaXRlbXMgPSBUbmdVdGlsLmdldEFsbFByb2Nlc3NlcygoTWV0aG9kUGx1Z2luKWl0Lm5leHQoKSk7Ci0JCQlmb3IgKCBJdGVyYXRvciBpdHAgPSBpdGVtcy5pdGVyYXRvcigpOyBpdHAuaGFzTmV4dCgpOyApIHsKLQkJCQlvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3MgcCA9IChvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3MpaXRwLm5leHQoKTsKLQkJCQlpZiAoIGNhblNob3cocCwgY29uZmlnKSAmJiAhcHJvY2Vzc2VzLmNvbnRhaW5zKHApICkgewotCQkJCQlwcm9jZXNzZXMuYWRkKHApOwotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIHByb2Nlc3NlczsKLQl9Ci0JCi0JLyoqCi0JICogZ2V0IGFsbCBwcm9jZXNzZXMgaW4gdGhlIHBsdWdpbiBhbmQgdGhlIGNvbmZpZ3VyYXRpb24KLQkgKiAKLQkgKiBAcGFyYW0gcGx1Z2luCi0JICogQHBhcmFtIGNvbmZpZwotCSAqIEByZXR1cm4gTGlzdAotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRBbGxQcm9jZXNzZXMoTWV0aG9kUGx1Z2luIHBsdWdpbiwgTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLQkJTGlzdCBwcm9jZXNzZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUxpc3QgaXRlbXMgPSBUbmdVdGlsLmdldEFsbFByb2Nlc3NlcyhwbHVnaW4pOwotCQlmb3IgKCBJdGVyYXRvciBpdHAgPSBpdGVtcy5pdGVyYXRvcigpOyBpdHAuaGFzTmV4dCgpOyApIHsKLQkJCW9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzcyBwID0gKG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzcylpdHAubmV4dCgpOwotCQkJaWYgKCBjYW5TaG93KHAsIGNvbmZpZykgJiYgIXByb2Nlc3Nlcy5jb250YWlucyhwKSApIHsKLQkJCQlwcm9jZXNzZXMuYWRkKHApOwotCQkJfQotCQl9Ci0JCi0JCXJldHVybiBwcm9jZXNzZXM7Ci0JfQotCQotCS8qKgotCSAqIGdldCBhbGwgZGVsaXZlcnkgcHJvY2Vzc2VzIGluIHRoZSBwbHVnaW4gYW5kIGNvbmZpZ3VyYXRpb24KLQkgKiBAcGFyYW0gcGx1Z2luCi0JICogQHBhcmFtIGNvbmZpZwotCSAqIEByZXR1cm4gTGlzdAotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRBbGxEZWxpdmVyeVByb2Nlc3NlcyhNZXRob2RQbHVnaW4gcGx1Z2luLCBNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZykgewotCQlMaXN0IHByb2Nlc3NlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJTGlzdCBpdGVtcyA9IFRuZ1V0aWwuZ2V0QWxsUHJvY2Vzc2VzKHBsdWdpbik7Ci0JCWZvciAoIEl0ZXJhdG9yIGl0cCA9IGl0ZW1zLml0ZXJhdG9yKCk7IGl0cC5oYXNOZXh0KCk7ICkgewotCQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzIHAgPSAob3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzKWl0cC5uZXh0KCk7Ci0JCQlpZiAoIHAgaW5zdGFuY2VvZiBEZWxpdmVyeVByb2Nlc3MgKSB7Ci0JCQkJaWYgKCBjYW5TaG93KHAsIGNvbmZpZykgJiYgIXByb2Nlc3Nlcy5jb250YWlucyhwKSApIHsKLQkJCQkJcHJvY2Vzc2VzLmFkZChwKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkKLQkJcmV0dXJuIHByb2Nlc3NlczsKLQl9Ci0JCi0JLyoqCi0JICogZ2V0IGFsbCBDYXBhYmlsaXR5UGF0dGVybnMgaW4gdGhlIHBsdWdpbiBhbmQgY29uZmlndXJhdGlvbgotCSAqIAotCSAqIEBwYXJhbSBwbHVnaW4KLQkgKiBAcGFyYW0gY29uZmlnCi0JICogQHJldHVybiBMaXN0Ci0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0IGdldEFsbENhcGFiaWxpdHlQYXR0ZXJucyhNZXRob2RQbHVnaW4gcGx1Z2luLCBNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZykgewotCQlMaXN0IHByb2Nlc3NlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJTGlzdCBpdGVtcyA9IFRuZ1V0aWwuZ2V0QWxsUHJvY2Vzc2VzKHBsdWdpbik7Ci0JCWZvciAoIEl0ZXJhdG9yIGl0cCA9IGl0ZW1zLml0ZXJhdG9yKCk7IGl0cC5oYXNOZXh0KCk7ICkgewotCQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzIHAgPSAob3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzKWl0cC5uZXh0KCk7Ci0JCQlpZiAoIHAgaW5zdGFuY2VvZiBDYXBhYmlsaXR5UGF0dGVybiApIHsKLQkJCQlpZiAoIGNhblNob3cocCwgY29uZmlnKSAmJiAhcHJvY2Vzc2VzLmNvbnRhaW5zKHApICkgewotCQkJCQlwcm9jZXNzZXMuYWRkKHApOwotCQkJCX0KLQkJCX0KLQkJfQotCQotCQlyZXR1cm4gcHJvY2Vzc2VzOwotCX0KLQkKLQkvKioKLQkgKiBjYWxjdWxhdGUgdGhlIHdvcmsgcHJvZHVjdHMgbW9kaWZpZWQgYnkgdGhlIHNwZWNpZmllZCByb2xlLCBpbiB0aGUgY29uZmlndXJhdGlvbgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50IFJvbGUKLQkgKiBAcGFyYW0gb3duZXJFbGVtZW50IE1ldGhvZEVsZW1lbnQgdGhlIG93bmVyIHRvIGFjY2VwdCB0aGUgY2FsY3VsYXRlZCB2YWx1ZQotCSAqIEBwYXJhbSByZWFsaXplcgotCSAqIEByZXR1cm4gTGlzdCBsaXN0IG9mIHdvcmsgcHJvZHVjdHMgYmVpbmcgbW9kaWZpZWQgYnkgdGhlIHJvbGUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3QgY2FsY01vZGlmaWVkV29ya1Byb2R1Y3RzKFJvbGUgZWxlbWVudCwgTWV0aG9kRWxlbWVudCBvd25lckVsZW1lbnQsIEVsZW1lbnRSZWFsaXplciByZWFsaXplcikgewotCQlMaXN0IHYgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCU9wcG9zaXRlRmVhdHVyZSBvZmVhdHVyZSA9IEFzc29jaWF0aW9uSGVscGVyLlJvbGVfUHJpbWFyeV9UYXNrczsKLQkJVG9NYW55T3Bwb3NpdGVGZWF0dXJlVmFsdWUgZnYyID0gbmV3IFRvTWFueU9wcG9zaXRlRmVhdHVyZVZhbHVlKGVsZW1lbnQsIG9mZWF0dXJlLCByZWFsaXplcik7Ci0JCWNhbGN1bGF0ZU9wcG9zaXRlRmVhdHVyZShlbGVtZW50LCBvZmVhdHVyZSwgcmVhbGl6ZXIsIGZ2Mik7Ci0JCWlmICggZnYyLnNpemUoKSA+IDAgKSB7Ci0JCQlMaXN0IHYyID0gKExpc3QpZnYyLmdldFZhbHVlKCk7Ci0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tfT3V0cHV0KCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gdjIuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOyApIHsKLQkJCQlNZXRob2RFbGVtZW50IGUgPSAoTWV0aG9kRWxlbWVudClpdC5uZXh0KCk7Ci0JCQkJVG9NYW55RmVhdHVyZVZhbHVlIGZ2ID0gbmV3IFRvTWFueUZlYXR1cmVWYWx1ZShlbGVtZW50LCBvd25lckVsZW1lbnQsIGZlYXR1cmUsIHJlYWxpemVyKTsKLQkJCQkoKExpc3QpZnYuZ2V0VmFsdWUoKSkuYWRkQWxsKHYpOwotCQkJCQotCQkJCWNhbGN1bGF0ZUZlYXR1cmUoZSwgb3duZXJFbGVtZW50LCAKLQkJCQkJCWZlYXR1cmUsIAotCQkJCQkJcmVhbGl6ZXIuZ2V0Q29uZmlndXJhdGlvbigpLCBmdiwgcmVhbGl6ZXIpOwkKLQkJCQl2ID0gKExpc3QpZnYuZ2V0VmFsdWUoKTsKLQkJCX0KLQkJfQkKLQkJCi0JCXJldHVybiB2OwotCX0KLQkJCi0JLyoqCi0JICogY2FsY3VsYXRlIHRoZSB3b3JrIHByb2R1Y3QgZGVzY3JpcHRvcnMgbW9kaWZpZWQgYnkgdGhlIHNwZWNpZmllZCByb2xlIGRlc2NyaXB0b3IsIGluIHRoZSBjb25maWd1cmF0aW9uCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQgUm9sZURlc2NyaXB0b3IKLQkgKiBAcGFyYW0gb3duZXJFbGVtZW50IE1ldGhvZEVsZW1lbnQgdGhlIG93bmVyIHRvIGFjY2VwdCB0aGUgY2FsY3VsYXRlZCB2YWx1ZQotCSAqIEBwYXJhbSByZWFsaXplcgotCSAqIEByZXR1cm4gTGlzdCBsaXN0IG9mIHdvcmsgcHJvZHVjdCBkZXNjcmlwdG9ycyBiZWluZyBtb2RpZmllZCBieSB0aGUgcm9sZSBkZXNjcmlwdG9yCi0JICogQGRlcHJlY2F0ZWQgdXNlIHRoZSBSb2xlRGVzY3JpcHRvckxheW91dCB0byBjYWxjdWxhdGUgdGhlIGZlYXR1cmUgdmFsdWUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3QgY2FsY01vZGlmaWVkV29ya1Byb2R1Y3REZXNjcmlwdG9ycyhSb2xlRGVzY3JpcHRvciBlbGVtZW50LCBNZXRob2RFbGVtZW50IG93bmVyRWxlbWVudCwgRWxlbWVudFJlYWxpemVyIHJlYWxpemVyKSB7Ci0JCUxpc3QgdiA9IG5ldyBBcnJheUxpc3QoKTsKLQkJT3Bwb3NpdGVGZWF0dXJlIG9mZWF0dXJlID0gQXNzb2NpYXRpb25IZWxwZXIuUm9sZURlc2NyaXB0b3JfUHJpbWFyeVRhc2tEZXNjcmlwdG9yczsKLQkJVG9NYW55T3Bwb3NpdGVGZWF0dXJlVmFsdWUgZnYyID0gbmV3IFRvTWFueU9wcG9zaXRlRmVhdHVyZVZhbHVlKGVsZW1lbnQsIG9mZWF0dXJlLCByZWFsaXplcik7Ci0JCWNhbGN1bGF0ZU9wcG9zaXRlRmVhdHVyZShlbGVtZW50LCBvZmVhdHVyZSwgcmVhbGl6ZXIsIGZ2Mik7Ci0JCWlmICggZnYyLnNpemUoKSA+IDAgKSB7Ci0JCQlMaXN0IHYyID0gKExpc3QpZnYyLmdldFZhbHVlKCk7Ci0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tEZXNjcmlwdG9yX091dHB1dCgpOwotCQkJZm9yIChJdGVyYXRvciBpdCA9IHYyLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTsgKSB7Ci0JCQkJTWV0aG9kRWxlbWVudCBlID0gKE1ldGhvZEVsZW1lbnQpaXQubmV4dCgpOwotCQkJCQotCQkJCVRvTWFueUZlYXR1cmVWYWx1ZSBmdiA9IG5ldyBUb01hbnlGZWF0dXJlVmFsdWUoZWxlbWVudCwgb3duZXJFbGVtZW50LCBmZWF0dXJlLCByZWFsaXplcik7Ci0JCQkJKChMaXN0KWZ2LmdldFZhbHVlKCkpLmFkZEFsbCh2KTsKLQkJCQkKLQkJCQljYWxjdWxhdGVGZWF0dXJlKGUsIG93bmVyRWxlbWVudCwgCi0JCQkJCQlmZWF0dXJlLCAKLQkJCQkJCXJlYWxpemVyLmdldENvbmZpZ3VyYXRpb24oKSwgZnYsIHJlYWxpemVyKTsJCi0JCQkJdiA9IChMaXN0KWZ2LmdldFZhbHVlKCk7Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiB2OwotCX0KLQkKLQkvKioKLQkgKiBjYWxjdWxhdGUgdGhlIHJvbGVzIHRoYXQgbW9kaWZpZXMgdGhlIHNwZWNpZmllZCB3b3JrIHByb2R1Y3QgaW4gdGhlIGNvbmZpZ3VyYXRpb24KLQkgKiBAcGFyYW0gZWxlbWVudCBXb3JrUHJvZHVjdAotCSAqIEBwYXJhbSByZWFsaXplcgotCSAqIEByZXR1cm4gTGlzdCB0aGUgcm9sZXMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3QgY2FsY01vZGlmeVJvbGVzKFdvcmtQcm9kdWN0IGVsZW1lbnQsIEVsZW1lbnRSZWFsaXplciByZWFsaXplcikgewotCQlMaXN0IHRhc2tzID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMG5GZWF0dXJlVmFsdWUoCi0JCQkJZWxlbWVudCwgCi0JCQkJQXNzb2NpYXRpb25IZWxwZXIuV29ya1Byb2R1Y3RfT3V0cHV0RnJvbV9UYXNrcywgCi0JCQkJcmVhbGl6ZXIpOwotCQlMaXN0IG1vZGlmeVJvbGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gdGFza3MuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOyApIHsKLQkJCVRhc2sgdCA9IChUYXNrKWl0Lm5leHQoKTsKLQkJCUxpc3Q8Um9sZT4gckxpc3QgPSAoTGlzdDxSb2xlPilDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwbkZlYXR1cmVWYWx1ZSgKLQkJCQkJdCwgCi0JCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tfUGVyZm9ybWVkQnkoKSwgCi0JCQkJCXJlYWxpemVyKTsKLQkJCWZvciAoUm9sZSByOiByTGlzdCkgewotCQkJCWlmICggKHIgIT0gbnVsbCkgJiYgIW1vZGlmeVJvbGVzLmNvbnRhaW5zKHIpICkgewotCQkJCQltb2RpZnlSb2xlcy5hZGQocik7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gbW9kaWZ5Um9sZXM7Ci0JfQotCQotCS8qKgotCSAqIGNhbGN1bGF0ZSB0aGUgcm9sZSBkZXNjcmlwdG9ycyB0aGF0IG1vZGlmaWVzIHRoZSBzcGVjaWZpZWQgd29yayBwcm9kdWN0IGRlc2NyaXB0b3IgaW4gdGhlIGNvbmZpZ3VyYXRpb24KLQkgKiBAcGFyYW0gZWxlbWVudCBXb3JrUHJvZHVjdERlc2NyaXB0b3IKLQkgKiBAcGFyYW0gcmVhbGl6ZXIKLQkgKiBAcmV0dXJuIExpc3QgdGhlIHJvbGUgZGVzY3JpcHRvcnMKLQkgKiBAZGVwcmVjYXRlZCB1c2UgdGhlIFdvcmtQcm9kdWN0RGVzY3JpcHRvcmxheW91dCB0byBjYWxjdWxhdGUgdGhlIGZlYXR1cmUgdmFsdWUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3QgY2FsY01vZGlmeVJvbGVEZXNjcmlwdG9ycyhXb3JrUHJvZHVjdERlc2NyaXB0b3IgZWxlbWVudCwgRWxlbWVudFJlYWxpemVyIHJlYWxpemVyKSB7Ci0JCUxpc3QgdGFza0Rlc2NyaXB0b3JzID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMG5GZWF0dXJlVmFsdWUoCi0JCQkJZWxlbWVudCwgCi0JCQkJQXNzb2NpYXRpb25IZWxwZXIuV29ya1Byb2R1Y3REZXNjcmlwdG9yX091dHB1dEZyb21fVGFza0Rlc2NyaXB0b3JzLCAKLQkJCQlyZWFsaXplcik7Ci0JCUxpc3QgbW9kaWZ5Um9sZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSB0YXNrRGVzY3JpcHRvcnMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOyApIHsKLQkJCVRhc2tEZXNjcmlwdG9yIHQgPSAoVGFza0Rlc2NyaXB0b3IpaXQubmV4dCgpOwotCQkJUm9sZURlc2NyaXB0b3IgciA9IChSb2xlRGVzY3JpcHRvcilDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwMUZlYXR1cmVWYWx1ZSgKLQkJCQkJdCwgCi0JCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tEZXNjcmlwdG9yX1BlcmZvcm1lZFByaW1hcmlseUJ5KCksIAotCQkJCQlyZWFsaXplcik7Ci0JCQlpZiAoIChyICE9IG51bGwpICYmICFtb2RpZnlSb2xlcy5jb250YWlucyhyKSApIHsKLQkJCQltb2RpZnlSb2xlcy5hZGQocik7Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiBtb2RpZnlSb2xlczsKLQl9Ci0JCi0JLyoqCi0JICogY2hlY2sgaWYgdGhlIGFjdGl2aXR5IGlzIGEgY29udHJpYnV0b3IgCi0JICogb3IgY29udGFpbnMgYW55IHN1Yi1hY3Rpdml0aWVzIHRoYXQgYXJlIGNvbnRyaWJ1dG9ycwotCSAqIEBwYXJhbSBlbGVtZW50IEFjdGl2aXR5Ci0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGhhc0NvbnRyaWJ1dG9yKEFjdGl2aXR5IGVsZW1lbnQpIHsKLQkJaWYgKCBpc0NvbnRyaWJ1dG9yKGVsZW1lbnQpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0JCWZvciAoIEl0ZXJhdG9yIGl0ID0gZWxlbWVudC5nZXRCcmVha2Rvd25FbGVtZW50cygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTsgKSB7Ci0JCQlPYmplY3QgbyA9IGl0Lm5leHQoKTsKLQkJCWlmICggIShvIGluc3RhbmNlb2YgQWN0aXZpdHkpICkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJCi0JCQlpZiAoIGhhc0NvbnRyaWJ1dG9yKCAoQWN0aXZpdHkpbyApICkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCS8qKgotCSAqIGdldCB0aGUgYmFzZSBwcm9jZXNzZXMgZm9yIGFuIHtAbGluayBBY3Rpdml0eX0gaW4gdGhlIENvbmZpZ3VyYXRpb24KLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqIEBwYXJhbSBjb25maWcKLQkgKiBAcmV0dXJuIExpc3QKLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3QgZ2V0QmFzZVByb2Nlc3NlcyhBY3Rpdml0eSBlbGVtZW50LCBNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZykgewotCQlMaXN0IHZhbHVlID0gbmV3IEFycmF5TGlzdCgpOwotCQlnZXRCYXNlUHJvY2Vzc2VzKGVsZW1lbnQsIGNvbmZpZywgdmFsdWUpOwotCQlyZXR1cm4gdmFsdWU7Ci0JfQotCQotCS8qKgotCSAqIGdldCBhbGwgYmFzZSBwcm9jZXNzZXMgZm9yIGFuIGFjdGl2aXR5IGluIHRoZSBjb25maWd1cmF0aW9uCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiBAcGFyYW0gY29uZmlnCi0JICogQHBhcmFtIHZhbHVlIExpc3QgdGhlIGJhc2VzIHByb2Nlc3NlcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBnZXRCYXNlUHJvY2Vzc2VzKEFjdGl2aXR5IGVsZW1lbnQsIE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnLCBMaXN0IHZhbHVlKSB7Ci0JCQotCQkvLyBnZXQgaXQncyBvd24gYmFzZQotCQlpZiAoIENvbmZpZ3VyYXRpb25IZWxwZXIuaXNFeHRlbmRlcihlbGVtZW50KSApIHsKLQkJCUFjdGl2aXR5IGJhc2UgPSAoQWN0aXZpdHkpZWxlbWVudC5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCk7Ci0JCQlpZiAoIGJhc2UgIT0gbnVsbCAKLQkJCQkJJiYgIXZhbHVlLmNvbnRhaW5zKGJhc2UpIAotCQkJCQkmJiAoYmFzZSBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzcykgKSB7Ci0JCQkJaWYgKCBjYW5TaG93KGJhc2UsIGNvbmZpZykgKSB7Ci0JCQkJCXZhbHVlLmFkZChiYXNlKTsKLQkJCQl9Ci0JCQkJZ2V0QmFzZVByb2Nlc3NlcyhiYXNlLCBjb25maWcsIHZhbHVlKTsKLQkJCX0KLQkJfQotCQkKLQkJLy8gaWYgdGhlIHN1Yi1hY3Rpdml0aWVzIGhhdmUgYmFzZSwgcHJvY2VzcyBpdAotCQlmb3IgKCBJdGVyYXRvciBpdCA9IGVsZW1lbnQuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7ICkgewotCQkJT2JqZWN0IG8gPSBpdC5uZXh0KCk7Ci0JCQlpZiAoIG8gaW5zdGFuY2VvZiBBY3Rpdml0eSApIHsKLQkJCQlnZXRCYXNlUHJvY2Vzc2VzKChBY3Rpdml0eSlvLCBjb25maWcsIHZhbHVlKTsKLQkJCX0KLQkJfQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFVSSSBnZXRJbmhlcml0aW5nVXJpKERlc2NyaWJhYmxlRWxlbWVudCBvYmosIFVSSSB1cmksCi0JCQlWYXJpYWJpbGl0eUVsZW1lbnRbXSB1cmlJbmhlcml0aW5nQmFzZXMsIE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnLCBpbnQgdXJpVHlwZSkgewotCQlWYXJpYWJpbGl0eUVsZW1lbnQgdmUgPSAoVmFyaWFiaWxpdHlFbGVtZW50KSBvYmo7Ci0JCVZhcmlhYmlsaXR5RWxlbWVudCBiYXNlID0gdmUuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpOwotCQlpZiAoYmFzZSAhPSBudWxsCi0JCQkJJiYgKHZlLmdldFZhcmlhYmlsaXR5VHlwZSgpID09IFZhcmlhYmlsaXR5VHlwZS5FWFRFTkRTIHx8IHZlCi0JCQkJCQkuZ2V0VmFyaWFiaWxpdHlUeXBlKCkgPT0gVmFyaWFiaWxpdHlUeXBlLkVYVEVORFNfUkVQTEFDRVMpKSB7Ci0JCQliYXNlID0gKFZhcmlhYmlsaXR5RWxlbWVudCkgQ29uZmlndXJhdGlvbkhlbHBlci5nZXRDYWxjdWxhdGVkRWxlbWVudChiYXNlLCBjb25maWcpOwotCQkJaWYgKGJhc2UgIT0gbnVsbCkgewotCQkJCWlmICh1cmlUeXBlID09IDApIHsKLQkJCQkJdXJpID0gKChEZXNjcmliYWJsZUVsZW1lbnQpIGJhc2UpLmdldE5vZGVpY29uKCk7Ci0JCQkJfSBlbHNlIGlmICh1cmlUeXBlID09IDEpIHsKLQkJCQkJdXJpID0gKChEZXNjcmliYWJsZUVsZW1lbnQpIGJhc2UpLmdldFNoYXBlaWNvbigpOwotCQkJCX0KLQkJCQlpZiAodXJpICE9IG51bGwpIHsKLQkJCQkJdXJpSW5oZXJpdGluZ0Jhc2VzWzBdID0gYmFzZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHVyaTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2NvbmZpZ3VyYXRpb24vQ29uZmlndXJhdGlvblByb3BlcnRpZXMuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9jb25maWd1cmF0aW9uL0NvbmZpZ3VyYXRpb25Qcm9wZXJ0aWVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3ZGYzZTEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2NvbmZpZ3VyYXRpb24vQ29uZmlndXJhdGlvblByb3BlcnRpZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDg3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5jbG9zdXJlLklDb25maWd1cmF0aW9uRXJyb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLk1ldGhvZEVsZW1lbnRQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5NZXRob2RFbGVtZW50UHJvcGVydHlIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotCi0vKioKLSAqICBDbGFzcyBtYW5hZ2luZyBjYWNoZWQgY29uZmlndXJhdGlvbiBwcm9wZXJ0aWVzCi0gKiAKLSAqIEBhdXRob3IgV2VpcGluZyBMdSAtIE1hciAxOSwgMjAwOAotICogQHNpbmNlIDEuNQotICovCi1wdWJsaWMgY2xhc3MgQ29uZmlndXJhdGlvblByb3BlcnRpZXMgZXh0ZW5kcyBNZXRob2RFbGVtZW50UHJvcGVydGllcyB7Ci0JCi0JcHVibGljIENvbmZpZ3VyYXRpb25Qcm9wZXJ0aWVzKE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0JCXN1cGVyKGNvbmZpZywgZ2V0UHJvcFN0cmluZ3MoKSk7CQkKLQl9Ci0JCQkKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmdbXSBnZXRQcm9wU3RyaW5ncygpIHsKLQkJU3RyaW5nW10gaGlkZVByb3BzID0geyBNZXRob2RFbGVtZW50UHJvcGVydHlIZWxwZXIuQ09ORklHX1BST1BCTEVNX0hJREVfRVJST1JTLAotCQkJCU1ldGhvZEVsZW1lbnRQcm9wZXJ0eUhlbHBlci5DT05GSUdfUFJPUEJMRU1fSElERV9XQVJOSU5HUywKLQkJCQlNZXRob2RFbGVtZW50UHJvcGVydHlIZWxwZXIuQ09ORklHX1BST1BCTEVNX0hJREVfSU5GT1N9OwotCQlyZXR1cm4gaGlkZVByb3BzOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiB0b0hpZGUoSUNvbmZpZ3VyYXRpb25FcnJvciBlcnJvcikgewotCQlpZiAoZXJyb3IuaXNFcnJvcigpKSB7Ci0JCQlyZXR1cm4gaXNIaWRlRXJyb3JzKCk7Ci0JCX0gZWxzZSBpZiAoZXJyb3IuaXNXYXJuaW5nKCkpIHsKLQkJCXJldHVybiBpc0hpZGVXYXJuaW5ncygpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIGlzSGlkZUluZm9zKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0hpZGVXYXJuaW5ncygpIHsKLQkJcmV0dXJuIGdldEJvb2xlYW5WYWx1ZShNZXRob2RFbGVtZW50UHJvcGVydHlIZWxwZXIuQ09ORklHX1BST1BCTEVNX0hJREVfV0FSTklOR1MpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc0hpZGVFcnJvcnMoKSB7Ci0JCXJldHVybiBnZXRCb29sZWFuVmFsdWUoTWV0aG9kRWxlbWVudFByb3BlcnR5SGVscGVyLkNPTkZJR19QUk9QQkxFTV9ISURFX0VSUk9SUyk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNIaWRlSW5mb3MoKSB7Ci0JCXJldHVybiBnZXRCb29sZWFuVmFsdWUoTWV0aG9kRWxlbWVudFByb3BlcnR5SGVscGVyLkNPTkZJR19QUk9QQkxFTV9ISURFX0lORk9TKTsKLQl9Ci0JCQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2NvbmZpZ3VyYXRpb24vRGVmYXVsdEVsZW1lbnRSZWFsaXplci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2NvbmZpZ3VyYXRpb24vRGVmYXVsdEVsZW1lbnRSZWFsaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMmU5MmI2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9jb25maWd1cmF0aW9uL0RlZmF1bHRFbGVtZW50UmVhbGl6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuRXh0ZW5zaW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldoaXRlcGFwZXI7Ci0KLS8qKgotICogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgcmVhbGl6ZXIuCi0gKiBSZWFsaXplcyB0aGUgZWxlbWVudCBiYXNlZCBvbiB0aGUgY29uZmlndXJhdGlvbiBhbmQgcmVhbGl6ZSBvcHRpb25zLgotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgV2VpcGluZyBMdQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRGVmYXVsdEVsZW1lbnRSZWFsaXplciBleHRlbmRzIEVsZW1lbnRSZWFsaXplciB7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRGVmYXVsdEVsZW1lbnRSZWFsaXplcl9UeXBlID0gIkRlZmF1bHRFbGVtZW50UmVhbGl6ZXIiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUHVibGlzaGluZ0VsZW1lbnRSZWFsaXplcl9UeXBlID0gIlB1Ymxpc2hpbmdFbGVtZW50UmVhbGl6ZXIiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUHJvY2Vzc1B1Ymxpc2hpbmdFbGVtZW50UmVhbGl6ZXJfVHlwZSA9ICJQcm9jZXNzUHVibGlzaGluZ0VsZW1lbnRSZWFsaXplciI7IC8vJE5PTi1OTFMtMSQKLQkJCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBFbGVtZW50UmVhbGl6ZXIgY3JlYXRlRWxlbWVudFJlYWxpemVyRXh0ZW5zaW9uKE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnLCBTdHJpbmcgdHlwZSkgewotCQlPYmplY3QgZXh0ID0gRXh0ZW5zaW9uTWFuYWdlci5jcmVhdGVFeHRlbnNpb24oTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SWQoKSwgImVsZW1lbnRSZWFsaXplckZhY3RvcnkiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gZXh0IGluc3RhbmNlb2YgSUVsZW1lbnRSZWFsaXplckZhY3RvcnkgPwotCQkJKChJRWxlbWVudFJlYWxpemVyRmFjdG9yeSkgZXh0KS5jcmVhdGVSZWFsaXplcihjb25maWcsIHR5cGUpIDogbnVsbDsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBFbGVtZW50UmVhbGl6ZXIgbmV3RWxlbWVudFJlYWxpemVyKAotCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcsIGJvb2xlYW4gcmVzb2x2ZUNvbnRyaWJ1dG9yLAotCQkJYm9vbGVhbiByZXNvbHZlUmVwbGFjZXIpIHsKLQkJRWxlbWVudFJlYWxpemVyIHJlYWxpemVyID0gY3JlYXRlRWxlbWVudFJlYWxpemVyRXh0ZW5zaW9uKGNvbmZpZywgRGVmYXVsdEVsZW1lbnRSZWFsaXplcl9UeXBlKTsKLQkJaWYgKHJlYWxpemVyID09IG51bGwpIHsKLQkJCXJlYWxpemVyID0gbmV3IERlZmF1bHRFbGVtZW50UmVhbGl6ZXIoY29uZmlnKTsKLQkJfQotCQlyZWFsaXplci5zZXRSZXNvbHZlQ29udHJpYnV0b3IocmVzb2x2ZUNvbnRyaWJ1dG9yKTsKLQkJcmVhbGl6ZXIuc2V0UmVzb2x2ZVJlcGxhY2VyKHJlc29sdmVSZXBsYWNlcik7Ci0JCXJldHVybiByZWFsaXplcjsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBFbGVtZW50UmVhbGl6ZXIgbmV3RWxlbWVudFJlYWxpemVyKE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0JCXJldHVybiBuZXdFbGVtZW50UmVhbGl6ZXIoY29uZmlnLCB0cnVlLCB0cnVlKTsKLQl9Ci0JCi0JLyoqCi0JICogY29uc3RydWN0IGFuIGluc3RhbmNlIHdpdGggdGhlIGdpdmUgY29uZmlndXJhdGlvbgotCSAqIEBwYXJhbSBjb25maWcgTWV0aG9kQ29uZmlndXJhdGlvbgotCSAqLwotCXByb3RlY3RlZCBEZWZhdWx0RWxlbWVudFJlYWxpemVyKE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0JCXN1cGVyKGNvbmZpZyk7Ci0JfQotCi0JLyoqCi0JICogY29uc3RydWN0IGFuIGluc3RhbmNlIHdpdGggdGhlIGdpdmVuIGNvbmZpZ3VyYXRpb24gYW5kIGFkZGl0aW9uYWwgcmVhbGl6YXRpb24gb3B0aW9ucy4KLQkgKiAKLQkgKiBAcGFyYW0gY29uZmlnIE1ldGhvZENvbmZpZ3VyYXRpb24KLQkgKiBAcGFyYW0gcmVzb2x2ZUNvbnRyaWJ1dG9yIGJvb2xlYW4gaWYgdHJ1ZSwgY29udHJ1YnV0b3JzIGZyb20gZmVhdHVyZSB2YWx1ZSBsaXN0IHdpbGwgYmUgcmVzb2x2ZWQuIGRlZmF1bHQgdG8gZmFsc2UuCi0JICogQHBhcmFtIHJlc29sdmVSZXBsYWNlciBib29sZWFuIGlmIHR1cmUsIGVsZW1lbnQgd2l0aCBhIHJlcGxhY2VyIHdpbGwgYmUgcmVzb2x2ZWQgdG8gdGhlIHJlcGxhY2VyLiBkZWZhdWx0IHRvIHRydWUuCi0JICovCi0JcHJvdGVjdGVkIERlZmF1bHRFbGVtZW50UmVhbGl6ZXIoTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcsCi0JCQlib29sZWFuIHJlc29sdmVDb250cmlidXRvciwgYm9vbGVhbiByZXNvbHZlUmVwbGFjZXIpIHsKLQkJc3VwZXIoY29uZmlnLCByZXNvbHZlQ29udHJpYnV0b3IsIHJlc29sdmVSZXBsYWNlcik7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgRWxlbWVudFJlYWxpemVyLnJlYWxpemUKLQkgKi8KLQlwdWJsaWMgTWV0aG9kRWxlbWVudCByZWFsaXplKE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgewotCQlyZXR1cm4gc3VwZXIucmVhbGl6ZShlbGVtZW50KTsKLQl9Ci0JCi0JLyoqCi0JICogcmVhbGl6ZSB0aGUgbGlzdCBvZiBmZWF0dXJlIHZhbHVlcyBhbmQgcmV0dXJucyBhIG5ldyBsaXN0IG9mIHZhbHVlcwotCSAqIFRoZSBuZXcgbWlnaHQgYmUgYSByZS1zb3J0aW5nIG9mIHRoZSBvcmlnaW5hbCBsaXN0IAotCSAqIG9yIHNvbWUgb2YgdGhlIHZhbHVlcyBjYW4gYmUgZmlsdGVyZWQgb3V0LCBkZXBlbmRpbmcgb24gdGhlIGRldGFpbCBpbXBsZW1lbnRhdGlvbgotCSAqIE5vdGU6IHRoZSBsaXN0IHZhbHVlIHBhc3NlZCBpbiBtaWdodCBiZSB1cGRhdGVkIGFzIHdlbGwuCi0JICogQHBhcmFtIGVsZW1lbnQgTWV0aG9kRWxlbWVudAotCSAqIEBwYXJhbSBmZWF0dXJlIEVTdHJ1Y3R1cmFsRmVhdHVyZQotCSAqIEBwYXJhbSB2YWx1ZXMgTGlzdAotCSAqIEByZXR1cm4gTGlzdAotCSAqLwotCXB1YmxpYyBMaXN0IHJlYWxpemUoTWV0aG9kRWxlbWVudCBlbGVtZW50LCAKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBMaXN0IHZhbHVlcykKLQl7Ci0JCWlmICggdmFsdWVzID09IG51bGwgfHwgdmFsdWVzLnNpemUoKSA9PSAwICkgewotCQkJcmV0dXJuIHZhbHVlczsKLQkJfQotCQkKLQkJLy8gV3JvbmcgIm1vZGlmaWVzIiBpbmZvcm1hdGlvbiBwdWJsaXNoZWQgaW4gdGVhbSBhbGxvY2F0aW9uIHZpZXcgZm9yIHNtYWxsIGNvbmZpZ3VyYXRpb24KLQkJLy8gYWRkZWQgZmlsdGVyIHRvIGNsZWFuIHVwIHVuLXdhbnRlZCBpdGVtcwotCQlpZiAoIHN1cGVyLmZpbHRlciAhPSBudWxsICkgewotCQkJaW50IGkgPSAwOwotCQkJd2hpbGUgKGkgPCB2YWx1ZXMuc2l6ZSgpKSB7Ci0JCQkJTWV0aG9kRWxlbWVudCBvID0gKE1ldGhvZEVsZW1lbnQpIHZhbHVlcy5nZXQoaSk7Ci0KLQkJCQlpZiAoICFmaWx0ZXIuYWNjZXB0KG8pICkgewotCQkJCQl2YWx1ZXMucmVtb3ZlKGkpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWkrKzsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCQkKLQkJLy8gaWYgdGhlIGZlYXR1cmUgdmFsdWUgaXMgY29udGFpbm1lbnQgZWxlbWVudCBzdWNoIGFzIGFydGlmYWN0Ci0JCS8vIHRoZSBjaGlsZCBlbGVtZW50IGNhbid0IHNob3cgaWYgYW55IG9mIHRoZSBwYXJlbnQocykgYXJlIGluIHRoZSBsaXN0Ci0JCS8vIDAwMzg0NjE5IC0gUHVibGlzaGVkIHNpdGU6IERpc3BsYXkgb2YgV1BzIHVuZGVyIHJlc3BvbnNpYmxlIHJvbGUKLQkJCi0JCS8vIHRoaXMgaXMgbm90IGEgZ2VuZXJhbCBydWxlLiBvbmx5IGFwcGx5IHRvIHRoZSBwdWJsaXNoZWQgbmF2aWdhdGlvbiB0cmVlLgotCQkvLyBzbyBtb3ZlIHRoaXMgbG9naWMgdG8gdGhlIHRyZWUgZ2VuZXJhdGlvbiBjb2RlIGluIHB1Ymxpc2hpbmcKLQkJLy8gZ2VlbnJhbGx5LCBzaG93IGFsbCBlbGVtZW50cywgc2VlIGJ1ZwotCQkvLyAwMDM4Njc2NSAtIFJvbGUgcmVzcG9uc2liaWxpdGllcyBuZWVkIHRvIHNob3cgKGNvbnRyaWJ1dGVkKSBzdWItYXJ0aWZhY3RzCQotLy8JCWlmIChmZWF0dXJlLmlzTWFueSgpICYmIHZhbHVlcy5zaXplKCkgPiAwCi0vLwkJCQkmJiBDb25maWd1cmF0aW9uSGVscGVyLmlzQ29udGFpbm1lbnRFbGVtZW50KHZhbHVlcy5nZXQoMCkpKSB7Ci0vLwkJCWludCBpID0gMDsKLS8vCQkJd2hpbGUgKGkgPCB2YWx1ZXMuc2l6ZSgpKSB7Ci0vLwkJCQlNZXRob2RFbGVtZW50IG8gPSAoTWV0aG9kRWxlbWVudCkgdmFsdWVzLmdldChpKTsKLS8vCi0vLwkJCQkvLyBpZiB0aGUgY29udGFpbmVyIG9mIHRoZSBlbGVtZW50IGlzIGluIHRoZSBsaXN0LCByZW1vdmUgdGhpcwotLy8JCQkJLy8gZWxlbWVudCBmcm9tIHRoZSBsaXN0Ci0vLwkJCQlpZiAoQ29uZmlndXJhdGlvbkhlbHBlci5pc0NvbnRhaW5lckluTGlzdChvLCB2YWx1ZXMsIGNvbmZpZykpIHsKLS8vCQkJCQl2YWx1ZXMucmVtb3ZlKGkpOwotLy8JCQkJfSBlbHNlIHsKLS8vCQkJCQlpKys7Ci0vLwkJCQl9Ci0vLwkJCX0KLS8vCQl9Ci0KLQkJLy8gbmVlZCB0byBzb3J0IHRoZSBjb25jZXB0IGFuZCBwYXBlcnMgYnkgdHlwZQotCQlpZiAoKGZlYXR1cmUgPT0gVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0Q29udGVudEVsZW1lbnRfQ29uY2VwdHNBbmRQYXBlcnMoKSkKLQkJCQkmJiAodmFsdWVzLnNpemUoKSA+IDApKSB7Ci0JCQlMaXN0IHBhcGVycyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWludCBpID0gMDsKLQkJCXdoaWxlIChpIDwgdmFsdWVzLnNpemUoKSkgewotCQkJCU9iamVjdCBvID0gdmFsdWVzLmdldChpKTsKLQkJCQlpZiAobyBpbnN0YW5jZW9mIFdoaXRlcGFwZXIpIHsKLQkJCQkJcGFwZXJzLmFkZChvKTsKLQkJCQkJdmFsdWVzLnJlbW92ZShpKTsKLQkJCQl9IGVsc2UgewotCQkJCQlpKys7Ci0JCQkJfQotCQkJfQotCi0JCQlpZiAocGFwZXJzLnNpemUoKSA+IDApIHsKLQkJCQl2YWx1ZXMuYWRkQWxsKHBhcGVycyk7Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiB2YWx1ZXM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2NvbmZpZ3VyYXRpb24vRWxlbWVudFJlYWxpemVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvY29uZmlndXJhdGlvbi9FbGVtZW50UmVhbGl6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzhjMmY5Yi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvY29uZmlndXJhdGlvbi9FbGVtZW50UmVhbGl6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuUHJlc2VudGF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuQnJvd3NpbmdMYXlvdXRTZXR0aW5nczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLkxpYnJhcnlVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ3VzdG9tQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmliYWJsZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5GdWxmaWxsYWJsZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5Bc3NvY2lhdGlvbkhlbHBlcjsKLQotLyoqCi0gKiBSZWFsaXplcyB0aGUgZWxlbWVudCBiYXNlZCBvbiB0aGUgY29uZmlndXJhdGlvbiBhbmQgcmVhbGl6ZSBvcHRpb25zLgotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQGF1dGhvciBXZWlwaW5nIEx1Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBFbGVtZW50UmVhbGl6ZXIgewotCi0JcHJvdGVjdGVkIE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnOwotCi0JLy8gbm90ZTogZGlzY2FyZCBjb250cmlidXRvciB0YWtlcyBoaWdoZXIgcHJpb3JpdHksIGlmIHNldCB0byB0cnVlLAotCS8vIHJlc29sdmVDb250cmlidXRvciB3aWxsIGJlIGlnbm9yZWQKLQlwcml2YXRlIGJvb2xlYW4gZGlzY2FyZENvbnRyaWJ1dG9yID0gZmFsc2U7Ci0KLQlwcml2YXRlIGJvb2xlYW4gcmVzb2x2ZUNvbnRyaWJ1dG9yID0gdHJ1ZTsKLQotCXByaXZhdGUgYm9vbGVhbiByZXNvbHZlUmVwbGFjZXIgPSB0cnVlOwotCi0JcHJpdmF0ZSBib29sZWFuIHNob3dTdWJ0cmFjdGVkID0gZmFsc2U7Ci0JCi0JcHJvdGVjdGVkIElGaWx0ZXIgZmlsdGVyID0gbnVsbDsKLQkKLQkvLyB0aGlzIGlzIHRoZSBkZWZhdWx0IHNldHRpbmcgYmFzZWQgb24gdGhlIHByZWZlcmVuY2Ugc2V0dGluZwotCS8vIHN1YmNsYXNzIHNob3VsZCBpbXBsZW1lbnQgdGhlaXIgb3duIG1ldGhvZCB0aGUgZ2V0IHRoZSB2YWx1ZQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gZGVmYXVsdEVuYWJsZUV4dGVuZFJlcGxhY2UgPSBmYWxzZTsKLQkKLQkKLQkvL3ByaXZhdGUgc3RhdGljIGJvb2xlYW4gZGVmYXVsdElnbm9yZUJhc2VUb01hbnlBc3NvY2lhdGlvbnMgPSBmYWxzZTsKLQotCXN0YXRpYyB7Ci0JCVN0cmluZyBzdHIgPSBMaWJyYXJ5UGx1Z2luLmdldERlZmF1bHQoKS5nZXRTdHJpbmcoIkVuYWJsZUV4dGVuZFJlcGxhY2UiKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAoIHN0ciAhPSBudWxsICYmIHN0ci50cmltKCkuZXF1YWxzKCJ0cnVlIikgKSB7IC8vJE5PTi1OTFMtMSQKLQkJCWRlZmF1bHRFbmFibGVFeHRlbmRSZXBsYWNlID0gdHJ1ZTsKLQkJfQotCQkKLQkJLy8gMTcxODgyIC0gRXh0ZW5kcy1SZXBsYWNlIFZhcmlhYmlsaXR5Ci0JCS8vZGVmYXVsdElnbm9yZUJhc2VUb01hbnlBc3NvY2lhdGlvbnMgPSBMaWJyYXJ5UHJlZmVyZW5jZXMuZ2V0VXNlTmV3RXh0ZW5kc1NlbWFudGljcygpOwkJCi0JfQotCQotCS8qKgotCSAqIGNvbnN0cnVjdCBhbiBpbnN0YW5jZSB3aXRoIHRoZSBnaXZlIGNvbmZpZ3VyYXRpb24KLQkgKiBAcGFyYW0gY29uZmlnIE1ldGhvZENvbmZpZ3VyYXRpb24KLQkgKi8KLQlwdWJsaWMgRWxlbWVudFJlYWxpemVyKE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0JCXRoaXMoY29uZmlnLCB0cnVlLCB0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiBjb25zdHJ1Y3QgYW4gaW5zdGFuY2Ugd2l0aCB0aGUgZ2l2ZW4gY29uZmlndXJhdGlvbiBhbmQgYWRkaXRpb25hbCByZWFsaXphdGlvbiBvcHRpb25zLgotCSAqIAotCSAqIEBwYXJhbSBjb25maWcgTWV0aG9kQ29uZmlndXJhdGlvbgotCSAqIEBwYXJhbSByZXNvbHZlQ29udHJpYnV0b3IgYm9vbGVhbiBpZiB0cnVlLCBjb250cnVidXRvcnMgZnJvbSBmZWF0dXJlIHZhbHVlIGxpc3Qgd2lsbCBiZSByZXNvbHZlZC4gZGVmYXVsdCB0byBmYWxzZS4KLQkgKiBAcGFyYW0gcmVzb2x2ZVJlcGxhY2VyIGJvb2xlYW4gaWYgdHVyZSwgZWxlbWVudCB3aXRoIGEgcmVwbGFjZXIgd2lsbCBiZSByZXNvbHZlZCB0byB0aGUgcmVwbGFjZXIuIGRlZmF1bHQgdG8gdHJ1ZS4KLQkgKi8KLQlwdWJsaWMgRWxlbWVudFJlYWxpemVyKE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnLAotCQkJYm9vbGVhbiByZXNvbHZlQ29udHJpYnV0b3IsIGJvb2xlYW4gcmVzb2x2ZVJlcGxhY2VyKSB7Ci0JCXRoaXMuY29uZmlnID0gY29uZmlnOwotCQl0aGlzLnJlc29sdmVDb250cmlidXRvciA9IHJlc29sdmVDb250cmlidXRvcjsKLQkJdGhpcy5yZXNvbHZlUmVwbGFjZXIgPSByZXNvbHZlUmVwbGFjZXI7Ci0JCQotCX0KLQotCS8qKgotCSAqIGlzIGV4dGVuZC1yZXBsYWNlIGVuYWJsZWQgZm9yIHJlcGxhY2VtZW50Ci0JICogCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzRXh0ZW5kUmVwbGFjZUVuYWJsZWQoKSB7Ci0JCXJldHVybiBkZWZhdWx0RW5hYmxlRXh0ZW5kUmVwbGFjZTsKLQl9Ci0JCi0JLyoqCi0JICogZ2V0IHRoZSBnbG9iYWwgc2V0dGluZyBmb3IgdGhlIGV4dGVuZCBzZW1hbnRpY3MKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlnbm9yZUJhc2VUb01hbnlBc3NvY2lhdGlvbnMoKSB7Ci0JCXJldHVybiBCcm93c2luZ0xheW91dFNldHRpbmdzLklOU1RBTkNFLmlzVXNlTmV3RXh0ZW5kU2VtYW50aWNzKCk7Ci0JfQotCQotCQotCS8qKgotCSAqIHNldCB0aGUgZmxhZy4gaWYgdHJ1ZSwgdGhlIGNvbnRyaWJ1dG9ycyBmcm9tIGEgcmVhbGl6ZWQgZmVhdHVyZSBsaXN0IHdpbGwgYmUgZGlzY2FyZGVkCi0JICogCi0JICogQHBhcmFtIGRpc2NhcmRDb250cmlidXRvciBib29sZWFuCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGlzY2FyZENvbnRyaWJ1dG9yKGJvb2xlYW4gZGlzY2FyZENvbnRyaWJ1dG9yKSB7Ci0JCXRoaXMuZGlzY2FyZENvbnRyaWJ1dG9yID0gZGlzY2FyZENvbnRyaWJ1dG9yOwotCX0KLQotCS8qKgotCSAqIHNldCB0aGUgZmxhZy4gaWYgdHJ1ZSB0aGUgY29udHJpYnV0b3JzIHdpbGwgYmUgcmVzb2x2ZWQuCi0JICogQHBhcmFtIHJlc29sdmVDb250cmlidXRvciBib29sZWFuCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmVzb2x2ZUNvbnRyaWJ1dG9yKGJvb2xlYW4gcmVzb2x2ZUNvbnRyaWJ1dG9yKSB7Ci0JCXRoaXMucmVzb2x2ZUNvbnRyaWJ1dG9yID0gcmVzb2x2ZUNvbnRyaWJ1dG9yOwotCX0KLQotCS8qKgotCSAqIHNldCB0aGUgZmxhZy4gaWYgdHJ1ZSB0aGUgZWxlbWVudCB3aXRoIGEgcmVwbGFjZXIgd2lsbCBiZSByZXNvbHZlZCB0byB0aGUgcmVwbGFjZXIuCi0JICogCi0JICogQHBhcmFtIHJlc29sdmVSZXBsYWNlciBib29sZWFuCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmVzb2x2ZVJlcGxhY2VyKGJvb2xlYW4gcmVzb2x2ZVJlcGxhY2VyKSB7Ci0JCXRoaXMucmVzb2x2ZVJlcGxhY2VyID0gcmVzb2x2ZVJlcGxhY2VyOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHNob3dTdWJ0cmFjdGVkKCkgewotCQlyZXR1cm4gc2hvd1N1YnRyYWN0ZWQ7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFNob3dTdWJ0cmFjdGVkKGJvb2xlYW4gZmxhZykgewotCQl0aGlzLnNob3dTdWJ0cmFjdGVkID0gZmxhZzsKLQl9Ci0JCi0KLQkvKioKLQkgKiBzZXQgYSBmaWx0ZXIgZm9yIHRoaXMgcmVhbGl6ZXIKLQkgKiBAcGFyYW0gZmlsdGVyIElGaWx0ZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGaWx0ZXIoSUZpbHRlciBmaWx0ZXIpIHsKLQkJdGhpcy5maWx0ZXIgPSBmaWx0ZXI7Ci0JfQotCQotCS8qKgotCSAqIGdldCB0eWhlIGNvbmZpZ3VyYXRpb24KLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIE1ldGhvZENvbmZpZ3VyYXRpb24gZ2V0Q29uZmlndXJhdGlvbigpIHsKLQkJcmV0dXJuIGNvbmZpZzsKLQl9Ci0JCi0JLyoqCi0JICogcmVhbGl6ZSB0aGUgZWxlbWVudAotCSAqIEBwYXJhbSBlbGVtZW50IE1ldGhvZEVsZW1lbnQKLQkgKiBAcmV0dXJuIE1ldGhvZEVsZW1lbnQKLQkgKi8KLQlwdWJsaWMgTWV0aG9kRWxlbWVudCByZWFsaXplKE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgewotCQkKLQkJaWYgKGVsZW1lbnQgPT0gbnVsbCB8fCAhaW5Db25maWcoZWxlbWVudCkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJLy8gV29yayBwcm9kdWN0IGRlc2NyaXB0b3JzIHRoYXQgcG9pbnQgdG8gd29yayBwcm9kdWN0cwotCQkvLyBvdXRzaWRlIHRoZSBjb25maWd1cmF0aW9uIGFyZSBzdGlsbCBwdWJsaXNoZWQKLQkJLy8gbGlua2VkIGVsZW1lbnQgbXVzdCBiZSBpbiBjb25maWcgYXMgd2VsbAotCQlNZXRob2RFbGVtZW50IGxpbmtlZEVsZW1lbnQgPSBudWxsOwotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFRhc2tEZXNjcmlwdG9yKSB7Ci0JCQlsaW5rZWRFbGVtZW50ID0gKChUYXNrRGVzY3JpcHRvcikgZWxlbWVudCkuZ2V0VGFzaygpOwotCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3IpIHsKLQkJCWxpbmtlZEVsZW1lbnQgPSAoKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgZWxlbWVudCkuZ2V0V29ya1Byb2R1Y3QoKTsKLQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgUm9sZURlc2NyaXB0b3IpIHsKLQkJCWxpbmtlZEVsZW1lbnQgPSAoKFJvbGVEZXNjcmlwdG9yKSBlbGVtZW50KS5nZXRSb2xlKCk7Ci0JCX0KLQotCQlpZiAoKGxpbmtlZEVsZW1lbnQgIT0gbnVsbCkKLQkJCQkmJiAhaW5Db25maWcobGlua2VkRWxlbWVudCkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJLy8gaWYgbm8gY29uZmlndXJhdGlvbiBpcyBzcGVjaWZpZWQsIGRvbid0IGNhbGN1bGF0ZQotCQlpZiAoY29uZmlnID09IG51bGwpIHsKLQkJCXJldHVybiBlbGVtZW50OwotCQl9Ci0KLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBWYXJpYWJpbGl0eUVsZW1lbnQpIHsKLQkJCVZhcmlhYmlsaXR5RWxlbWVudCB2ZSA9IChWYXJpYWJpbGl0eUVsZW1lbnQpIGVsZW1lbnQ7Ci0JCQlWYXJpYWJpbGl0eUVsZW1lbnQgZTsKLQotCQkJLy8gaWYgZGlzY2FyZENvbnRyaWJ1dG9yIHNldCB0byB0cnVlLCBkaXNjYXJkIHRoZSBjb250cmlidXRvciBhbmQKLQkJCS8vIHJldHVybiBudWxsCi0JCQlpZiAoZGlzY2FyZENvbnRyaWJ1dG9yICYmIENvbmZpZ3VyYXRpb25IZWxwZXIuaXNDb250cmlidXRvcih2ZSkpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQotCQkJaWYgKHJlc29sdmVDb250cmlidXRvcikgewotCQkJCS8vIGlmIHRoZSBlbGVtZW50IGlzIGEgY29udHJpYnV0b3IsIHJlc292bGUgdG8gaXQncyBiYXNlCi0JCQkJd2hpbGUgKENvbmZpZ3VyYXRpb25IZWxwZXIuaXNDb250cmlidXRvcih2ZSkpIHsKLQkJCQkJZSA9IHZlLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsKLQkJCQkJaWYgKGluQ29uZmlnKGUpKSB7Ci0JCQkJCQl2ZSA9IGU7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQkvLyBpZiB0aGUgYmFzZSBpcyBub3QgaW4gdGhlIGNvbmZpZ3VyYXRpb24sIGl0J3MgYW4KLQkJCQkJCS8vIGVycm9yCi0JCQkJCQlTeXN0ZW0ub3V0Ci0JCQkJCQkJCS5wcmludGxuKCJDb25maWd1cmF0aW9uIGNsb3N1cmUgZXJyb3I6IEJhc2UgZWxlbWVudCAnIiArIExpYnJhcnlVdGlsLmdldFR5cGVOYW1lKHZlKSArICInIG5vdCBpbiBjb25maWd1cmF0aW9uIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmIChyZXNvbHZlUmVwbGFjZXIpIHsKLQkJCQllID0gQ29uZmlndXJhdGlvbkhlbHBlci5nZXRSZXBsYWNlcih2ZSwgY29uZmlnKTsKLQkJCQlpZiAoZSAhPSBudWxsKSB7Ci0JCQkJCXJldHVybiBlOwotCQkJCX0KLQkJCX0gZWxzZSBpZiAoIWluQ29uZmlnKHZlKSkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQkJCi0JCQkvLyBpZiB0aGUgZWxlbWVudCBpcyBhIHJlcGxhY2VyLCBhbmQgdGhlIGJhc2UgaXMgYSBjb250cmlidXRvciwgCi0JCQkvLyBuZWVkIHRvIHJlc29sdmUgdGhlIGVsZW1lbnQgdG8gdGhlIGJhc2UgaWYgcmVzb2x2ZUNvbnRyaWJ1dG9yIGlzIHRydWUKLQkJCS8vIDE1MjIzMCAtIEJyb3dzaW5nOiBSb2xlPC0tPldQIHJlbGF0aW9uc2hpcCBzaG93cyBpbmNvbnNpc3RhbmN5Ci0JCQllID0gdmU7Ci0JCQl3aGlsZSAoKGUgIT0gbnVsbCkgJiYgQ29uZmlndXJhdGlvbkhlbHBlci5pc1JlcGxhY2VyKGUpKSB7Ci0JCQkJZSA9IChWYXJpYWJpbGl0eUVsZW1lbnQpIGUuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpOwotCQkJCWlmIChDb25maWd1cmF0aW9uSGVscGVyLmlzQ29udHJpYnV0b3IoZSkpIHsKLQkJCQkJcmV0dXJuIHJlYWxpemUoZSk7Ci0JCQkJfQotCQkJfQotCQkJCi0JCQkvLyBjYW4ndCByZXR1cm4gaGVyZSwgbmVlZCB0byBjaGVjayBjYW5TaG93Ci0JCQkvLyByZXR1cm4gdmU7Ci0JCQlpZiAoY2FuU2hvdyh2ZSkpIHsKLQkJCQlyZXR1cm4gdmU7Ci0JCQl9Ci0KLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJaWYgKGNhblNob3coZWxlbWVudCkpIHsKLQkJCXJldHVybiBlbGVtZW50OwotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogcmVhbGl6ZSB0aGUgbGlzdCBvZiBmZWF0dXJlIHZhbHVlcyBhbmQgcmV0dXJucyBhIG5ldyBsaXN0IG9mIHZhbHVlcwotCSAqIFRoZSBuZXcgbWlnaHQgYmUgYSByZS1zb3J0aW5nIG9mIHRoZSBvcmlnaW5hbCBsaXN0IAotCSAqIG9yIHNvbWUgb2YgdGhlIHZhbHVlcyBjYW4gYmUgZmlsdGVyZWQgb3V0LCBkZXBlbmRpbmcgb24gdGhlIGRldGFpbCBpbXBsZW1lbnRhdGlvbgotCSAqIE5vdGU6IHRoZSBsaXN0IHZhbHVlIHBhc3NlZCBpbiBtaWdodCBiZSB1cGRhdGVkIGFzIHdlbGwuCi0JICogQHBhcmFtIGVsZW1lbnQgTWV0aG9kRWxlbWVudAotCSAqIEBwYXJhbSBmZWF0dXJlIEVTdHJ1Y3R1cmFsRmVhdHVyZQotCSAqIEBwYXJhbSB2YWx1ZXMgTGlzdAotCSAqIEByZXR1cm4gTGlzdAotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBMaXN0IHJlYWxpemUoTWV0aG9kRWxlbWVudCBlbGVtZW50LAotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIExpc3QgdmFsdWVzKTsKLQkKLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGluQ29uZmlnKE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgewotCQlyZXR1cm4gQ29uZmlndXJhdGlvbkhlbHBlci5pbkNvbmZpZyhlbGVtZW50LCBjb25maWcsICFzaG93U3VidHJhY3RlZCgpKTsKLQl9Ci0JCi0JLyoqCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjYW5TaG93KE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgewotCQlyZXR1cm4gQ29uZmlndXJhdGlvbkhlbHBlci5jYW5TaG93KGVsZW1lbnQsIGNvbmZpZywgIXNob3dTdWJ0cmFjdGVkKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQl0aGlzLmZpbHRlciA9IG51bGw7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGFkZEV4dHJhRmVhdHVyZVZhbHVlcyhNZXRob2RFbGVtZW50IGVsZW1lbnQsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLAotCQkJRmVhdHVyZVZhbHVlIHZhbHVlcykgewotCQlpZiAoIUVsZW1lbnRSZWFsaXplci50b0FkZEV4dHJhRmVhdHVyZVZhbHVlcyhlbGVtZW50LCBmZWF0dXJlLCB2YWx1ZXMsCi0JCQkJZ2V0Q29uZmlndXJhdGlvbigpKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlDdXN0b21DYXRlZ29yeSBjYyA9IChDdXN0b21DYXRlZ29yeSkgZWxlbWVudDsKLQotCQlDb2xsZWN0aW9uPD8+IHJlc3VsdCA9IExpYnJhcnlVdGlsLmdldEluY2x1ZGVkRWxlbWVudHMoY2MsIGdldENvbmZpZ3VyYXRpb24oKSk7Ci0KLQkJaWYgKHJlc3VsdCA9PSBudWxsIHx8IHJlc3VsdC5pc0VtcHR5KCkpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCVRvTWFueUZlYXR1cmVWYWx1ZSBtYW55VmFsdWVzID0gdmFsdWVzIGluc3RhbmNlb2YgVG9NYW55RmVhdHVyZVZhbHVlID8KLQkJCQkoVG9NYW55RmVhdHVyZVZhbHVlKSB2YWx1ZXMgOiBudWxsOwotCQkJCQotCQlMaXN0IG9sZFZhbHVlcyA9IG1hbnlWYWx1ZXMgPT0gbnVsbCA/IG51bGwgOiAoTGlzdCkgbWFueVZhbHVlcy5nZXRWYWx1ZSgpOwotCi0JCUhhc2hTZXQ8RGVzY3JpYmFibGVFbGVtZW50PiBzZWVuU2V0ID0gbWFueVZhbHVlcyA9PSBudWxsID8KLQkJCQluZXcgSGFzaFNldDxEZXNjcmliYWJsZUVsZW1lbnQ+KCkgOiBuZXcgSGFzaFNldDxEZXNjcmliYWJsZUVsZW1lbnQ+KG9sZFZhbHVlcyk7CQotCQlzZWVuU2V0LmFkZChjYyk7Ci0JCUxpc3QgY2NMaXN0ID0gQXNzb2NpYXRpb25IZWxwZXIuZ2V0Q3VzdG9tQ2F0ZWdvcmllcyhjYyk7Ci0JCXNlZW5TZXQuYWRkQWxsKGNjTGlzdCk7CQkJCQkKLQkJCQkKLQkJTGlzdDxEZXNjcmliYWJsZUVsZW1lbnQ+IGxpc3QgPSBjYWxjdWxhdGVMaXN0KHJlc3VsdCwgc2VlblNldCk7Ci0JCXZhbHVlcy5hZGQoY2MsIGxpc3QpOwotCQkKLQl9Ci0KLQlwdWJsaWMgTGlzdDxEZXNjcmliYWJsZUVsZW1lbnQ+IGNhbGN1bGF0ZUxpc3QoQ29sbGVjdGlvbjw/PiByZXN1bHQsCi0JCQlTZXQ8RGVzY3JpYmFibGVFbGVtZW50PiBzZWVuU2V0KSB7Ci0JCUxpc3Q8RGVzY3JpYmFibGVFbGVtZW50PiBsaXN0ID0gbmV3IEFycmF5TGlzdDxEZXNjcmliYWJsZUVsZW1lbnQ+KCk7Ci0JCWZvciAoSXRlcmF0b3I8Pz4gaXRlciA9IHJlc3VsdC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBvID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAobyBpbnN0YW5jZW9mIERlc2NyaWJhYmxlRWxlbWVudCkgewotCQkJCURlc2NyaWJhYmxlRWxlbWVudCBjb250RWxlbSA9IChEZXNjcmliYWJsZUVsZW1lbnQpIG87Ci0JCQkJY29udEVsZW0gPSAoRGVzY3JpYmFibGVFbGVtZW50KSBDb25maWd1cmF0aW9uSGVscGVyCi0JCQkJCQkuZ2V0Q2FsY3VsYXRlZEVsZW1lbnQoY29udEVsZW0sIHRoaXMpOwotCQkJCWlmIChjb250RWxlbSAhPSBudWxsKSB7Ci0JCQkJCWlmIChzZWVuU2V0LmFkZChjb250RWxlbSkpIHsKLQkJCQkJCWxpc3QuYWRkKGNvbnRFbGVtKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQkJaWYgKGxpc3Quc2l6ZSgpID4gMSkgewotCQkJQ29tcGFyYXRvciBjb21wYXJhdG9yID0gUHJlc2VudGF0aW9uQ29udGV4dC5JTlNUQU5DRS5nZXRQcmVzTmFtZUNvbXBhcmF0b3IoKTsKLQkJCUNvbGxlY3Rpb25zLjxEZXNjcmliYWJsZUVsZW1lbnQ+c29ydChsaXN0LCBjb21wYXJhdG9yKTsKLQkJfQotCQkKLQkJcmV0dXJuIGxpc3Q7Ci0JfQotCQotCXByb3RlY3RlZCBib29sZWFuIHNsb3RNYXRjaGluZyhGdWxmaWxsYWJsZUVsZW1lbnQgc2xvdCwgRnVsZmlsbGFibGVFbGVtZW50IGVsZW1lbnQpIHsJCQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGJvb2xlYW4gdG9BZGRFeHRyYUZlYXR1cmVWYWx1ZXMoTWV0aG9kRWxlbWVudCBlbGVtZW50LAotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIEZlYXR1cmVWYWx1ZSB2YWx1ZXMsCi0JCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZykgewotCQlpZiAoY29uZmlnID09IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCWlmICghKHZhbHVlcyBpbnN0YW5jZW9mIFRvTWFueUZlYXR1cmVWYWx1ZSkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCWlmICghKGVsZW1lbnQgaW5zdGFuY2VvZiBDdXN0b21DYXRlZ29yeSkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCWlmIChmZWF0dXJlICE9IFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldEN1c3RvbUNhdGVnb3J5X0NhdGVnb3JpemVkRWxlbWVudHMoKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2NvbmZpZ3VyYXRpb24vRmVhdHVyZVZhbHVlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvY29uZmlndXJhdGlvbi9GZWF0dXJlVmFsdWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzhhMzZmMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvY29uZmlndXJhdGlvbi9GZWF0dXJlVmFsdWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLnV0aWwuT3Bwb3NpdGVGZWF0dXJlOwotCi0vKioKLSAqIEhlbHBlciBjbGFzcyB0byBpZGVudGlmeSB0aGUgZmVhdHVyZSB2YWx1ZSBhbmQgdGhlIG93bmluZyBlbGVtZW50LiAKLSAqIHRoaXMgaGVscHMgdG8gaWRlbnRpZnkgd2hlcmUgdGhlIHZhbHVlIGlzIGNvbWluZyBmcm9tLiAKLSAqIEZvciBleGFtcGxlLCB0aGUgcmVhbGl6ZWQgdmFsdWUgY2FuIGJlIGZyb20gdGhlIGJhc2UgZWxlbWVudCBhcyB3ZWxsIGFzIGNvbnRyaWJ1dG9ycwotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICoKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEZlYXR1cmVWYWx1ZSB7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIF9OVUxMXyA9ICJfTlVMTF8iOyAvLyROT04tTkxTLTEkCi0KLQlwcm90ZWN0ZWQgTWV0aG9kRWxlbWVudCBlbGVtZW50OyAgLy8gdGhlIGVsZW1lbnQKLQlwcm90ZWN0ZWQgTWV0aG9kRWxlbWVudCBvd25lckVsZW1lbnQ7ICAvLyB0aGUgY29udGFpbmVyIG9mIHRoZSBlbGVtZW50Ci0JcHJvdGVjdGVkIE9iamVjdCBmZWF0dXJlOyAvLyBFU3RydWN0cnVhbEZlYXR1cmUgb3IgT3Bwb3NpdGVmZWF0dXJlCi0JcHJvdGVjdGVkIEVsZW1lbnRSZWFsaXplciByZWFsaXplciA9IG51bGw7Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBib29sZWFuIGRlYnVnID0gTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkuaXNEZWJ1Z2dpbmcoKTsKLQotCS8qKgotCSAqIGNvbnN0cnVjdCBhbiBpbnN0YW5jZSBvZiB0aGUgb2JqZWN0Ci0JICogQHBhcmFtIGVsZW1lbnQgTWV0aG9kRWxlbWVudCB0aGUgZWxlbWVudCB0aGF0IHRoZSB2YWx1ZSBpcyBjYWxjdWF0ZWQgZm9yLiAKLQkgKiBAcGFyYW0gb3duZXJFbGVtZW50IE1ldGhvZEVsZW1lbnQgdGhlIGVsZW1lbnQgdGhhdCBvd25zIHRoZSB2YWx1ZQotCSAqIEBwYXJhbSBmZWF0dXJlIE9iamVjdCBlaXRoZXIgRVN0cnVjdHVyYWxGZWF0dXJlIG9yIE9wcG9zaXRlRmVhdHVyZS4KLQkgKiBAcGFyYW0gcmVhbGl6ZXIgRWxlbWVudFJlYWxpemVyCi0JICovCi0JcHVibGljIEZlYXR1cmVWYWx1ZShNZXRob2RFbGVtZW50IGVsZW1lbnQsIE1ldGhvZEVsZW1lbnQgb3duZXJFbGVtZW50LCBPYmplY3QgZmVhdHVyZSwgRWxlbWVudFJlYWxpemVyIHJlYWxpemVyKSB7Ci0JCXRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7Ci0JCXRoaXMub3duZXJFbGVtZW50ID0gb3duZXJFbGVtZW50OwotCQl0aGlzLmZlYXR1cmUgPSBmZWF0dXJlOwotCQl0aGlzLnJlYWxpemVyID0gcmVhbGl6ZXI7Ci0JfQotCi0JYWJzdHJhY3QgcHVibGljIHZvaWQgYWRkKFZhcmlhYmlsaXR5RWxlbWVudCBvd25lciwgT2JqZWN0IHZhbHVlKTsKLQlhYnN0cmFjdCBwdWJsaWMgaW50IHNpemUoKTsKLQlhYnN0cmFjdCBwdWJsaWMgT2JqZWN0IGdldFZhbHVlKCk7Ci0JCi0JLyoqCi0JICogZ2V0IHRoZSBlbGVtZW50Ci0JICogQHJldHVybiBNZXRob2RFbGVtZW50Ci0JICovCi0JcHVibGljIE1ldGhvZEVsZW1lbnQgZ2V0RWxlbWVudCgpIHsKLQkJcmV0dXJuIGVsZW1lbnQ7Ci0JfQotCQotCS8qKgotCSAqIGdldCB0aGUgb3duZXIgZWxlbWVudAotCSAqIEByZXR1cm4gTWV0aG9kRWxlbWVudAotCSAqLwotCXB1YmxpYyBNZXRob2RFbGVtZW50IGdldE93bmVyRWxlbWVudCgpIHsKLQkJcmV0dXJuIG93bmVyRWxlbWVudDsKLQl9Ci0JCi0JLyoqCi0JICogZ2V0IHRoZSBFU3RydWN0dXJhbEZlYXR1cmUuIHJldHVybiBudWxsIGlmIGl0J3Mgbm90IGEgRVN0cnVjdHVyYWxGZWF0dXJlCi0JICogQHJldHVybiBNZXRob2RFbGVtZW50Ci0JICovCi0JcHVibGljIEVTdHJ1Y3R1cmFsRmVhdHVyZSBnZXRGZWF0dXJlKCkgewotCQlpZiAoIGZlYXR1cmUgaW5zdGFuY2VvZiBFU3RydWN0dXJhbEZlYXR1cmUgKSB7Ci0JCQlyZXR1cm4gKEVTdHJ1Y3R1cmFsRmVhdHVyZSlmZWF0dXJlOwotCQl9Ci0JCQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogZ2V0IHRoZSBPcHBvc2l0ZUZlYXR1cmUsIHJldHVybiBudWxsIGlmIHRoaXMgaXMgbm90IGFuIE9wcG9zaXRlRmVhdHVyZQotCSAqIEByZXR1cm4gT3Bwb3NpdGVGZWF0dXJlCi0JICovCi0JcHVibGljIE9wcG9zaXRlRmVhdHVyZSBnZXRPcHBvc2l0ZUZlYXR1cmUoKSB7Ci0JCWlmICggZmVhdHVyZSBpbnN0YW5jZW9mIE9wcG9zaXRlRmVhdHVyZSApIHsKLQkJCXJldHVybiAoT3Bwb3NpdGVGZWF0dXJlKWZlYXR1cmU7Ci0JCX0KLQkJCi0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKioKLQkgKiBnZXQgdGhlIHJlYWxpemVyCi0JICogQHJldHVybiBFbGVtZW50UmVhbGl6ZXIKLQkgKi8KLQlwdWJsaWMgRWxlbWVudFJlYWxpemVyIGdldFJlYWxpemVyKCkgewotCQlyZXR1cm4gcmVhbGl6ZXI7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGlzRXh0ZW5kUmVwbGFjZUVuYWJsZWQoKSB7Ci0JCWlmICggRWxlbWVudFJlYWxpemVyLmlzRXh0ZW5kUmVwbGFjZUVuYWJsZWQoKSApIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0KLQkJTWV0aG9kRWxlbWVudCBlID0gZWxlbWVudDsKLQkJaWYgKCBlbGVtZW50IGluc3RhbmNlb2YgQ29udGVudERlc2NyaXB0aW9uKSB7Ci0JCQllID0gKE1ldGhvZEVsZW1lbnQpKChDb250ZW50RGVzY3JpcHRpb24pZWxlbWVudCkuZUNvbnRhaW5lcigpOwotCQkJaWYgKCBlID09IG51bGwgKSB7Ci0JCQkJZSA9IG93bmVyRWxlbWVudDsKLQkJCX0KLQkJfQotCi0JCWlmICggKGUgaW5zdGFuY2VvZiBWYXJpYWJpbGl0eUVsZW1lbnQpICYmIENvbmZpZ3VyYXRpb25IZWxwZXIuaXNFeHRlbmRSZXBsYWNlcigoVmFyaWFiaWxpdHlFbGVtZW50KWUpICkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJCQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0JsYW5rSW5kaWNhdG9yKE9iamVjdCB2YWx1ZSkgewotCQlpZiAoIHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0JCQlyZXR1cm4gX05VTExfLmVxdWFscyh2YWx1ZS50b1N0cmluZygpKTsKLQkJfSBlbHNlIGlmICggdmFsdWUgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQlyZXR1cm4gX05VTExfLmVxdWFscygoKE1ldGhvZEVsZW1lbnQpdmFsdWUpLmdldE5hbWUoKSk7Ci0JCX0KLQkJCi0JCXJldHVybiBmYWxzZTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvY29uZmlndXJhdGlvbi9JRWxlbWVudFJlYWxpemVyRmFjdG9yeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2NvbmZpZ3VyYXRpb24vSUVsZW1lbnRSZWFsaXplckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDk4ZTBlYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvY29uZmlndXJhdGlvbi9JRWxlbWVudFJlYWxpemVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBXZWlwaW5nIEx1Ci0gKiBAc2luY2UgMS41Ci0gKgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElFbGVtZW50UmVhbGl6ZXJGYWN0b3J5IHsKLQlFbGVtZW50UmVhbGl6ZXIgY3JlYXRlUmVhbGl6ZXIoTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcsIFN0cmluZyB0eXBlKTsKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9jb25maWd1cmF0aW9uL09yZGVyZWRMaXN0Q29tcGFyYXRvci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2NvbmZpZ3VyYXRpb24vT3JkZXJlZExpc3RDb21wYXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiYzlkNzkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2NvbmZpZ3VyYXRpb24vT3JkZXJlZExpc3RDb21wYXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogYSBjb21wYXJhdG9yIHRvIHNvcnQgYW4gZWxlbWVudCBsaXN0LgotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICoKLSAqLwotcHVibGljIGNsYXNzIE9yZGVyZWRMaXN0Q29tcGFyYXRvciBpbXBsZW1lbnRzIENvbXBhcmF0b3IgewotCi0JLy8gc29ydCB0aGUgYmFzZWxpc3QgYWNjb3JkaW5nIHRvIHRoZSBzb3J0ZWQgbGlzdAotCS8vIGFueSBpdGVtIGluIHNvcnRlZCBsaXN0IGJ1dCBub3QgaW4gYmFzZSBsaXN0IGFyZSBpZ25vcmVkCi0JLy8gYW55IGl0ZW0gaW4gYmFzZSBsaXN0IGJ1dCBub3QgaW4gc29ydGVkIGxpc3Qga2VlcHMgdGhlIG9yaWdpbmFsIG9yZGVyCi0JTGlzdCBiYXNlTGlzdDsKLQotCUxpc3Qgc29ydGVkTGlzdDsKLQotCU9yZGVyZWRMaXN0Q29tcGFyYXRvcihMaXN0IGJhc2VMaXN0LCBMaXN0IHNvcnRlZExpc3QpIHsKLQkJdGhpcy5iYXNlTGlzdCA9IGJhc2VMaXN0OwotCQl0aGlzLnNvcnRlZExpc3QgPSBzb3J0ZWRMaXN0OwotCX0KLQotCS8qKgotCSAqIGNvbXBhcmUgdG8gb2JqZWN0cy4KLQkgKi8KLQlwdWJsaWMgaW50IGNvbXBhcmUoT2JqZWN0IGUxLCBPYmplY3QgZTIpIHsKLQkJaW50IGkxLCBpMjsKLQkJaWYgKHNvcnRlZExpc3QgIT0gbnVsbCkgewotCQkJaTEgPSBzb3J0ZWRMaXN0Lmxhc3RJbmRleE9mKGUxKTsKLQkJCWkyID0gc29ydGVkTGlzdC5sYXN0SW5kZXhPZihlMik7Ci0JCQlpZiAoaTEgPj0gMCB8fCBpMiA+PSAwKSB7Ci0JCQkJLy8gaWYgbm90IGluIHRoZSBzb3J0ZWQgbGlzdCwgZmluZCB0aGUgaW1tZWRpYXRlIHByZWRpY2Vzc29yCi0JCQkJLy8gdGhhdCBpcyBpbiB0aGUgbGlzdCBhbmQgY29tcGFyZSB0byBpdC4KLQkJCQkvLyBpZiBubyBzdWNoIGVsZW1lbnQsIGNvbXBhcmUgdG8gdGhlIG9yaWdpbmFsIGxpc3QKLQkJCQlpZiAoaTEgPCAwKSB7Ci0JCQkJCWkxID0gZmluZENvbXBhcmFibGVJbmRleChlMSk7Ci0JCQkJfQotCi0JCQkJaWYgKGkyIDwgMCkgewotCQkJCQlpMiA9IGZpbmRDb21wYXJhYmxlSW5kZXgoZTIpOwotCQkJCX0KLQotCQkJCWlmIChpMSA+PSAwICYmIGkyID49IDAgJiYgaTEgIT0gaTIpIHsKLQkJCQkJcmV0dXJuIGkxIC0gaTI7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIG9yaWdpbmFsT3JkZXIoZTEsIGUyKTsKLQl9Ci0KLQlwcml2YXRlIGludCBmaW5kQ29tcGFyYWJsZUluZGV4KE9iamVjdCBlKSB7Ci0JCWludCBpMiA9IC0xOwotCQlmb3IgKGludCBpID0gYmFzZUxpc3QubGFzdEluZGV4T2YoZSk7IGkgPj0gMDsgaS0tKSB7Ci0JCQlPYmplY3QgbyA9IGJhc2VMaXN0LmdldChpKTsKLQkJCWkyID0gc29ydGVkTGlzdC5sYXN0SW5kZXhPZihvKTsKLQkJCWlmIChpMiA+PSAwKSB7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gaTI7Ci0JfQotCi0JcHJpdmF0ZSBpbnQgb3JpZ2luYWxPcmRlcihPYmplY3QgZTEsIE9iamVjdCBlMikgewotCQlpbnQgaTEsIGkyOwotCQlpZiAoYmFzZUxpc3QgIT0gbnVsbCkgewotCQkJaTEgPSBiYXNlTGlzdC5sYXN0SW5kZXhPZihlMSk7Ci0JCQlpMiA9IGJhc2VMaXN0Lmxhc3RJbmRleE9mKGUyKTsKLQotCQkJcmV0dXJuIGkxIC0gaTI7Ci0JCX0KLQotCQlyZXR1cm4gMDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9jb25maWd1cmF0aW9uL1Byb2Nlc3NBdXRob3JpbmdDb25maWd1cmF0b3IuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9jb25maWd1cmF0aW9uL1Byb2Nlc3NBdXRob3JpbmdDb25maWd1cmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODRhODg3Yy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvY29uZmlndXJhdGlvbi9Qcm9jZXNzQXV0aG9yaW5nQ29uZmlndXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24uICBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuSUxpYnJhcnlTZXJ2aWNlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5WYXJpYWJpbGl0eUluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudDsKLQotCi0vKioKLSAqIENvbmZpZ3VyYXRpb24gZmlsdGVyIHRoYXQgc3RpbGwgc2hvd3MgY2VydGFpbiBlbGVtZW50cyBkdXJpbmcgcHJvY2VzcyBhdXRob3JpbmcgdGhhdAotICogUHJvY2Vzc0NvbmZpZ3VyYXRvciBkb2VzIG5vdCBzaG93LgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZSAtIEphbiAxMSwgMjAwNgotICogQHNpbmNlICAxLjAKLSAqLwotcHVibGljIGNsYXNzIFByb2Nlc3NBdXRob3JpbmdDb25maWd1cmF0b3IgZXh0ZW5kcyBQcm9jZXNzQ29uZmlndXJhdG9yIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFByb2Nlc3NBdXRob3JpbmdDb25maWd1cmF0b3IgSU5TVEFOQ0UgPSBuZXcgUHJvY2Vzc0F1dGhvcmluZ0NvbmZpZ3VyYXRvcigpOwotCi0JcHJpdmF0ZSBQcm9jZXNzQXV0aG9yaW5nQ29uZmlndXJhdG9yKCkgewotCQlzdXBlcihudWxsKTsKLQkJTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5hZGRMaXN0ZW5lcihuZXcgSUxpYnJhcnlTZXJ2aWNlTGlzdGVuZXIoKSB7Ci0KLQkJCXB1YmxpYyB2b2lkIGNvbmZpZ3VyYXRpb25TZXQoTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLQkJCQlzZXRNZXRob2RDb25maWd1cmF0aW9uKGNvbmZpZyk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGxpYnJhcnlDbG9zZWQoTWV0aG9kTGlicmFyeSBsaWJyYXJ5KSB7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGxpYnJhcnlDcmVhdGVkKE1ldGhvZExpYnJhcnkgbGlicmFyeSkgewotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBsaWJyYXJ5T3BlbmVkKE1ldGhvZExpYnJhcnkgbGlicmFyeSkgewotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBsaWJyYXJ5UmVvcGVuZWQoTWV0aG9kTGlicmFyeSBsaWJyYXJ5KSB7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGxpYnJhcnlTZXQoTWV0aG9kTGlicmFyeSBsaWJyYXJ5KSB7Ci0JCQl9Ci0JCQkKLQkJfSk7Ci0JfQotCQotCS8qKgotCSAqIEBwYXJhbSBtZXRob2RDb25maWcKLQkgKiBAcGFyYW0gdmlld2VyCi0JICovCi0JcHVibGljIFByb2Nlc3NBdXRob3JpbmdDb25maWd1cmF0b3IoTWV0aG9kQ29uZmlndXJhdGlvbiBtZXRob2RDb25maWcpIHsKLQkJc3VwZXIobWV0aG9kQ29uZmlnKTsKLQl9Ci0JCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb25GaWx0ZXIjZ2V0Q2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCwgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZSkKLQkgKiBvdmVycmlkZSB0aGlzLCAgZm9yIHByb2Nlc3MgYXV0aG9yaW5nIGVkaXQsIHNob3VsZCBnZXQgZGlyZWN0IGNoaWxkcmVuIG5vIHJlYWxpemF0aW9uLgotCSAqICAKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqLCBFU3RydWN0dXJhbEZlYXR1cmUgY2hpbGRGZWF0dXJlKSB7Ci0JCUVPYmplY3QgZU9iamVjdCA9IChFT2JqZWN0KSBvYmo7Ci0JCXJldHVybiAoTGlzdCllT2JqZWN0LmVHZXQoY2hpbGRGZWF0dXJlKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uRmlsdGVyI3Jlc29sdmUoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IHJlc29sdmUoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gb2JqZWN0OwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb25GaWx0ZXIjZ2V0VmFyaWFiaWxpdHlJbmZvKG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50KQotCSAqLwotCXB1YmxpYyBWYXJpYWJpbGl0eUluZm8gZ2V0VmFyaWFiaWxpdHlJbmZvKFZhcmlhYmlsaXR5RWxlbWVudCB2ZSkgewotCQlyZXR1cm4gbmV3IFZhcmlhYmlsaXR5SW5mbyh2ZSkgewotCQkJLyogKG5vbi1KYXZhZG9jKQotCQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlZhcmlhYmlsaXR5SW5mbyNnZXRJbmhlcmlyYW5jZUxpc3QoKQotCQkJICovCi0JCQlwdWJsaWMgTGlzdCBnZXRJbmhlcml0YW5jZUxpc3QoKSB7Ci0JCQkJcmV0dXJuIENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QoZ2V0T3duZXIoKSk7Ci0JCQl9Ci0JCQkKLQkJCS8qIChub24tSmF2YWRvYykKLQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5WYXJpYWJpbGl0eUluZm8jZ2V0Q29udHJpYnV0b3JzKCkKLQkJCSAqLwotCQkJcHVibGljIExpc3QgZ2V0Q29udHJpYnV0b3JzKCkgewotCQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCQkJfQotCQl9OwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvY29uZmlndXJhdGlvbi9Qcm9jZXNzQ29uZmlndXJhdG9yLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvY29uZmlndXJhdGlvbi9Qcm9jZXNzQ29uZmlndXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiZTRjMTkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2NvbmZpZ3VyYXRpb24vUHJvY2Vzc0NvbmZpZ3VyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlByb2Nlc3NVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWlsZXN0b25lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGVhbVByb2ZpbGU7Ci0KLQotLyoqCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTGUKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4wCi0gKgotICovCi1wdWJsaWMgY2xhc3MgUHJvY2Vzc0NvbmZpZ3VyYXRvciBleHRlbmRzIENvbmZpZ3VyYXRpb25GaWx0ZXIgewotCi0JcHJpdmF0ZSBib29sZWFuIGNoZWNrT3duaW5nUHJvY2VzczsKLQotCS8qKgotCSAqIEBwYXJhbSBtZXRob2RDb25maWcKLQkgKiBAcGFyYW0gdmlld2VyCi0JICovCi0JcHVibGljIFByb2Nlc3NDb25maWd1cmF0b3IoTWV0aG9kQ29uZmlndXJhdGlvbiBtZXRob2RDb25maWcpIHsKLQkJc3VwZXIobWV0aG9kQ29uZmlnKTsKLQl9Ci0JCi0JLyoqCi0JICogQHBhcmFtIG1ldGhvZENvbmZpZwotCSAqIEBwYXJhbSB2aWV3ZXIKLQkgKiBAcGFyYW0gY2hlY2tPd25pbmdQcm9jZXNzIGlmIHRydWUgd2lsbCBjaGVjayBvbiBvd25pbmcgcHJvY2VzcyBvZiBhY3Rpdml0aWVzIHdoZXRoZXIgaXQgaXMgaW4gdGhlIGNvbmZpZ3VyYXRpb24uCi0JICogICAgICAgICAgVGhpcyBjaGVjayBpcyBub3QgcmVxdWlyZWQgaW4gcHJvY2VzcyBlZGl0b3IgYW5kIHNraXBwaW5nIGl0IGhlbHBzIHRoZSBwZXJmb3JtYW5jZS4KLQkgKi8KLQlwdWJsaWMgUHJvY2Vzc0NvbmZpZ3VyYXRvcihNZXRob2RDb25maWd1cmF0aW9uIG1ldGhvZENvbmZpZywgYm9vbGVhbiBjaGVja093bmluZ1Byb2Nlc3MpIHsKLQkJdGhpcyhtZXRob2RDb25maWcpOwotCQl0aGlzLmNoZWNrT3duaW5nUHJvY2VzcyA9IGNoZWNrT3duaW5nUHJvY2VzczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRNZXRob2RDb25maWd1cmF0aW9uKE1ldGhvZENvbmZpZ3VyYXRpb24gbmV3Q29uZmlnKSB7Ci0JCW1ldGhvZENvbmZpZyA9IG5ld0NvbmZpZzsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoT2JqZWN0IG9iaikgewotCQlpZiAobWV0aG9kQ29uZmlnID09IG51bGwpCi0JCQlyZXR1cm4gdHJ1ZTsKLQotCQlpZiAob2JqIGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudCkgewotCQkJRWxlbWVudFJlYWxpemVyIHJlYWxpemVyID0gRGVmYXVsdEVsZW1lbnRSZWFsaXplci5uZXdFbGVtZW50UmVhbGl6ZXIoc3VwZXIubWV0aG9kQ29uZmlnKTsKLQkJCXJldHVybiBhY2NlcHQoKEJyZWFrZG93bkVsZW1lbnQpb2JqLCByZWFsaXplcik7Ci0JCX0KLQkJCi0JCXJldHVybiBzdXBlci5hY2NlcHQob2JqKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLlByb2Nlc3NDb25maWd1cmF0b3IjYWNjZXB0KG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpcHRvcikKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHQoQnJlYWtkb3duRWxlbWVudCBlLCBmaW5hbCBFbGVtZW50UmVhbGl6ZXIgcmVhbGl6ZXIpIHsKLQkJaWYgKGUgaW5zdGFuY2VvZiBNaWxlc3RvbmUgfHwgZSBpbnN0YW5jZW9mIFRlYW1Qcm9maWxlKSB7Ci0JCQkvLyBhY2NlcHQgYWxsIHByb2Nlc3MgZWxlbWVudHMgdGhhdCBhcmUgbm90IGFzc29jaWF0ZWQgd2l0aCBhbnkgY29udGVudAotCQkJLy8gZWxlbWVudAotCQkJLy8KLQkJCXJldHVybiB0cnVlOwotCQl9IGVsc2UgaWYgKGUgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJcmV0dXJuIFByb2Nlc3NVdGlsLmFjY2VwdCgoQWN0aXZpdHkpIGUsIG5ldyBJRmlsdGVyKCkgewotCi0JCQkJcHVibGljIGJvb2xlYW4gYWNjZXB0KE9iamVjdCBvYmopIHsKLQkJCQkJcmV0dXJuIG9iaiBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQgPyByZWFsaXplci5pbkNvbmZpZygoTWV0aG9kRWxlbWVudCkgb2JqKSA6IHRydWU7Ci0JCQkJfQotCQkJCQotCQkJfSwgY2hlY2tPd25pbmdQcm9jZXNzKTsKLQkJfQotCQllbHNlIGlmKGUgaW5zdGFuY2VvZiBEZXNjcmlwdG9yKSB7Ci0JCQkvLyBUT0RPOiBuZWVkIHRvIGNvbnNpZGVyIGNoZWNraW5nIG9uIG93bmluZyBwcm9jZXNzIG9mIHRoZSBkZXNjcmlwdG9yIHdoZXRoZXIgaXQgaXMgaW4gdGhlIGNvbmZpZ3VyYXRpb24uCi0JCQkvLyBDdXJyZW50bHksIHRoaXMgY2hlY2sgaXMgbm90IHJlcXVpcmVkIGFuZCBza2lwcGluZyBpdCBoZWxwcyB0aGUgcGVyZm9ybWFuY2UuCi0JCQkvLyBCdXQgdGhpcyBjaGVjayBtaWdodCBhZmZlY3QgdGhlIGN1cnJlbnQgY29kZSwgZS5nLjogcHJvY2VzcyBwcm9wZXJ0aWVzIHZpZXcuCi0JCQkvLwotCQkJTWV0aG9kRWxlbWVudCBsaW5rZWRfb2JqID0gUHJvY2Vzc1V0aWwuZ2V0QXNzb2NpYXRlZEVsZW1lbnQoKERlc2NyaXB0b3IpIGUpOwotCQkJaWYgKGxpbmtlZF9vYmogPT0gbnVsbCB8fCBsaW5rZWRfb2JqLmVJc1Byb3h5KCkpIHsKLQkJCQkvLyB0aGlzIGlzIHRoZSBwcm9jZXNzZXMgb3duIGRlc2NyaXB0b3IgKGluZGVwZW5kZW50IGZyb20gdGhlIGNvbnRlbnQpCi0JCQkJLy8gYWx3YXlzIGFjY2VwdCBpdAotCQkJCXJldHVybiB0cnVlOwotCQkJfSBlbHNlIHsKLQkJCQkvLyBtYWtlIHN1cmUgdGhhdCBlbGVtZW50IHdpdGggcmVwbGFjZXIgbWlnaHQgc3RpbGwgYmUgYWNjZXB0ZWQKLQkJCQkvLwotCQkJCWxpbmtlZF9vYmogPSBDb25maWd1cmF0aW9uSGVscGVyLmdldENhbGN1bGF0ZWRFbGVtZW50KGxpbmtlZF9vYmosIHJlYWxpemVyKTsKLQotCQkJCS8vIGlmIHRoZSBsaW5rZWQgZWxlbWVudCBpcyBub3QgaW4gY29uZmlnLCBkb24ndCBhY2NlcHQgaXQKLQkJCQlyZXR1cm4gcmVhbGl6ZXIuaW5Db25maWcobGlua2VkX29iaik7Ci0JCQl9CQkKLQkJfQotCQkKLQkJcmV0dXJuIHN1cGVyLmFjY2VwdChlKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2NvbmZpZ3VyYXRpb24vUHJvY2Vzc1ZhcmlhYmlsaXR5Q29uZmlndXJhdG9yLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvY29uZmlndXJhdGlvbi9Qcm9jZXNzVmFyaWFiaWxpdHlDb25maWd1cmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2U5Mzk1Yy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvY29uZmlndXJhdGlvbi9Qcm9jZXNzVmFyaWFiaWxpdHlDb25maWd1cmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci0KLS8qKgotICogCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMAotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9jZXNzVmFyaWFiaWxpdHlDb25maWd1cmF0b3IgZXh0ZW5kcyBQcm9jZXNzQ29uZmlndXJhdG9yIHsKLQotCS8qKgotCSAqIEBwYXJhbSBtZXRob2RDb25maWcKLQkgKiBAcGFyYW0gdmlld2VyCi0JICovCi0JcHVibGljIFByb2Nlc3NWYXJpYWJpbGl0eUNvbmZpZ3VyYXRvcihNZXRob2RDb25maWd1cmF0aW9uIG1ldGhvZENvbmZpZykgewotCQlzdXBlcihtZXRob2RDb25maWcpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE1ldGhvZENvbmZpZ3VyYXRpb24oTWV0aG9kQ29uZmlndXJhdGlvbiBuZXdDb25maWcpIHsKLQkJbWV0aG9kQ29uZmlnID0gbmV3Q29uZmlnOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5Qcm9jZXNzQ29uZmlndXJhdG9yI2FjY2VwdChvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaXB0b3IpCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0KEJyZWFrZG93bkVsZW1lbnQgZSkgewotCQlpZiAoZSBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQlBY3Rpdml0eSBiYXNlID0gKEFjdGl2aXR5KSAoKEFjdGl2aXR5KSBlKQotCQkJCQkuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpOwotCQkJaWYgKGJhc2UgPT0gbnVsbCkgewotCQkJCXJldHVybiBDb25maWd1cmF0aW9uSGVscGVyLmluQ29uZmlnKAotCQkJCQkJVG5nVXRpbC5nZXRPd25pbmdQcm9jZXNzKGUpLCBtZXRob2RDb25maWcpOwotCQkJfSBlbHNlIHsKLQkJCQlyZXR1cm4gQ29uZmlndXJhdGlvbkhlbHBlci5pbkNvbmZpZyhUbmdVdGlsCi0JCQkJCQkuZ2V0T3duaW5nUHJvY2VzcyhiYXNlKSwgbWV0aG9kQ29uZmlnKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBzdXBlci5hY2NlcHQoZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2NvbmZpZ3VyYXRpb24vU3VwcG9ydGluZ0VsZW1lbnREYXRhLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvY29uZmlndXJhdGlvbi9TdXBwb3J0aW5nRWxlbWVudERhdGEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDE4ZDg2Yi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvY29uZmlndXJhdGlvbi9TdXBwb3J0aW5nRWxlbWVudERhdGEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LklDb25maWd1cmF0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLmNsb3N1cmUuQ29uZmlndXJhdGlvbkNsb3N1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5jbG9zdXJlLkVsZW1lbnRSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkRlYnVnVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLkxpYnJhcnlVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFzazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLQotLyoqCi0gKiAgQ2xhc3MgbWFuYWdpbmcgc3VwcG9ydGluZyBlbGVtZW50cwotICogCi0gKiBAYXV0aG9yIFdlaXBpbmcgTHUgLSBNYXIgMjIsIDIwMDgKLSAqIEBzaW5jZSAxLjUKLSAqLwotcHVibGljIGNsYXNzIFN1cHBvcnRpbmdFbGVtZW50RGF0YSBleHRlbmRzIENvbmZpZ0RhdGFCYXNlIHsKLQkKLQlwcml2YXRlIFNldDxNZXRob2RFbGVtZW50PiBzdXBwb3J0aW5nRWxlbWVudHM7Ci0JcHJpdmF0ZSBib29sZWFuIGR1cmluZ1VwZGF0ZVN1cHBvcml0bmdFbGVtZW50cyA9IGZhbHNlOwotCXByaXZhdGUgU2V0PE1ldGhvZFBsdWdpbj4gc3VwcG9ydGluZ1BsdWdpbnM7Ci0JcHJpdmF0ZSBTZXQ8TWV0aG9kUGFja2FnZT4gc2VsZWN0ZWRQYWNrYWdlczsKLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGxvY2FsRGVidWcgPSBmYWxzZTsKLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGxvY2FsRGVidWcxID0gZmFsc2U7Ci0JcHJpdmF0ZSBib29sZWFuIGVuYWJsZWQgPSB0cnVlOwotCQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gZGVzY3JpcHRvckV4Y2x1c2l2ZU9wdGlvbiA9IHRydWU7CQotCQotCXB1YmxpYyBTdXBwb3J0aW5nRWxlbWVudERhdGEoTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLQkJc3VwZXIoY29uZmlnKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgYmVnaW5VcGRhdGVTdXBwb3J0aW5nRWxlbWVudHMoKSB7Ci0JCXNldFVwZGF0aW5nQ2hhbmdlcyh0cnVlKTsKLQkJaWYgKGxvY2FsRGVidWcpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTEQ+IGJlZ2luVXBkYXRlU3VwcG9ydGluZ0VsZW1lbnRzIC0+ICIpOyAvLyROT04tTkxTLTEkIAotCQl9Ci0JCQotCQlzdXBwb3J0aW5nRWxlbWVudHMgPSBuZXcgSGFzaFNldDxNZXRob2RFbGVtZW50PigpOwotCQkKLQkJc3VwcG9ydGluZ1BsdWdpbnMgPSBuZXcgSGFzaFNldDxNZXRob2RQbHVnaW4+KCk7Ci0JCVNldDxNZXRob2RQbHVnaW4+IHBsdWdpbnMgPSBuZXcgSGFzaFNldDxNZXRob2RQbHVnaW4+KGdldENvbmZpZygpCi0JCQkJLmdldE1ldGhvZFBsdWdpblNlbGVjdGlvbigpKTsKLQkJZm9yIChNZXRob2RQbHVnaW4gcGx1Z2luIDogcGx1Z2lucykgewotCQkJaWYgKHBsdWdpbi5pc1N1cHBvcnRpbmcoKSkgewotCQkJCXN1cHBvcnRpbmdQbHVnaW5zLmFkZChwbHVnaW4pOwotCQkJfQotCQl9Ci0JCQotCQlzZXRFbmFibGVkKHN1cHBvcnRpbmdQbHVnaW5zLnNpemUoKSA8IHBsdWdpbnMuc2l6ZSgpKTsKLQotCQlzZWxlY3RlZFBhY2thZ2VzID0gbmV3IEhhc2hTZXQ8TWV0aG9kUGFja2FnZT4oKTsKLQkJCi0JCWlmIChpc0VuYWJsZWQoKSAmJiAhIHN1cHBvcnRpbmdQbHVnaW5zLmlzRW1wdHkoKSkgewotCQkJTGlzdDxNZXRob2RQYWNrYWdlPiBwYWNrYWdlcyA9IGdldENvbmZpZygpLmdldE1ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKTsKLQkJCWZvciAoTWV0aG9kUGFja2FnZSBwa2cgOiBwYWNrYWdlcykgewotCQkJCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSBVbWFVdGlsLmdldE1ldGhvZFBsdWdpbihwa2cpOwotCQkJCWlmIChzdXBwb3J0aW5nUGx1Z2lucy5jb250YWlucyhwbHVnaW4pKSB7Ci0JCQkJCXNlbGVjdGVkUGFja2FnZXMuYWRkKHBrZyk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJaWYgKGxvY2FsRGVidWcpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTEQ+IGlzRW5hYmxlZCgpOiAiICsgaXNFbmFibGVkKCkpOyAvLyROT04tTkxTLTEkCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxEPiBzdXBwb3J0aW5nUGx1Z2luczogIiArIHN1cHBvcnRpbmdQbHVnaW5zLnNpemUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTEQ+IHNlbGVjdGVkUGFja2FnZXM6ICIgKyBzZWxlY3RlZFBhY2thZ2VzLnNpemUoKSk7IC8vJE5PTi1OTFMtMSQgCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxEPiBiZWdpblVwZGF0ZVN1cHBvcnRpbmdFbGVtZW50cyA8LSAiKTsgLy8kTk9OLU5MUy0xJCAKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiIik7IC8vJE5PTi1OTFMtMSQgCi0JCX0JCQotCX0KLQkKLQkvLyBDb2xsZWN0IG1hcCBvZiByZWZlcnJlZCByZWZlcmVuY2VzIG91dHNpZGUgdGhlIGNvbmZpZwotCXB1YmxpYyB2b2lkIGVuZFVwZGF0ZVN1cHBvcnRpbmdFbGVtZW50cygKLQkJCU1hcDxTdHJpbmcsIEVsZW1lbnRSZWZlcmVuY2U+IG91dENvbmZpZ1JlZk1hcCkgewotCQlpZiAobG9jYWxEZWJ1ZykgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJMRD4gZW5kVXBkYXRlU3VwcG9ydGluZ0VsZW1lbnRzIC0+ICIpOyAvLyROT04tTkxTLTEkIAotCQl9Ci0JCWlmIChpc0VuYWJsZWQoKSkgewotCQkJU2V0PE1ldGhvZEVsZW1lbnQ+IHN1cHBvcnRpbmdFbGVtZW50c1RvQ29sbGVjdCA9IG5ldyBIYXNoU2V0PE1ldGhvZEVsZW1lbnQ+KHN1cHBvcnRpbmdFbGVtZW50cyk7Ci0JCQl3aGlsZSAoIXN1cHBvcnRpbmdFbGVtZW50c1RvQ29sbGVjdC5pc0VtcHR5KCkpIHsKLQkJCQlTZXQ8TWV0aG9kRWxlbWVudD4gbmV3U3VwcG9ydGluZ0VsZW1lbnRzID0gbmV3IEhhc2hTZXQ8TWV0aG9kRWxlbWVudD4oKTsJCQotCQkJCXByb2Nlc3NSZWZlcmVuY2VzT3V0c2lkZUNvbmZpZyhzdXBwb3J0aW5nRWxlbWVudHNUb0NvbGxlY3QsIG91dENvbmZpZ1JlZk1hcCwgbmV3U3VwcG9ydGluZ0VsZW1lbnRzKTsKLQkJCQlpZiAobG9jYWxEZWJ1ZykgewotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxEPiBuZXdTdXBwb3J0aW5nRWxlbWVudHM6ICIgKyBuZXdTdXBwb3J0aW5nRWxlbWVudHMuc2l6ZSgpKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0JCi0JCQkJc3VwcG9ydGluZ0VsZW1lbnRzVG9Db2xsZWN0ID0gbmV3U3VwcG9ydGluZ0VsZW1lbnRzOwotCQkJfQotCQl9Ci0JCQotCQlzZXRVcGRhdGluZ0NoYW5nZXMoZmFsc2UpOwotCQlzZXROZWVkVXBkYXRlQ2hhbmdlcyhmYWxzZSk7Ci0JCQotCQlpZiAobG9jYWxEZWJ1ZykgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJMRD4gc3VwcG9ydGluZ0VsZW1lbnRzOiAiICsgc3VwcG9ydGluZ0VsZW1lbnRzLnNpemUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTEQ+IG91dENvbmZpZ1JlZk1hcDogIiArIG91dENvbmZpZ1JlZk1hcC5zaXplKCkpOyAvLyROT04tTkxTLTEkIAotCQkJU3lzdGVtLm91dC5wcmludGxuKCJMRD4gZW5kVXBkYXRlU3VwcG9ydGluZ0VsZW1lbnRzIDwtICIpOyAvLyROT04tTkxTLTEkIAotCQkJU3lzdGVtLm91dC5wcmludGxuKCIiKTsgLy8kTk9OLU5MUy0xJCAKLQkJfQkKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHByb2Nlc3NSZWZlcmVuY2VzT3V0c2lkZUNvbmZpZygKLQkJCUNvbGxlY3Rpb248TWV0aG9kRWxlbWVudD4gZWxlbWVudHMsCi0JCQlNYXA8U3RyaW5nLCBFbGVtZW50UmVmZXJlbmNlPiBvdXRDb25maWdSZWZNYXAsIFNldDxNZXRob2RFbGVtZW50PiBuZXdTdXBwb3J0aW5nRWxlbWVudHMpIHsKLQkJZm9yIChNZXRob2RFbGVtZW50IGVsZW1lbnQgOiBlbGVtZW50cykgewotCQkJcHJvY2Vzc1JlZmVyZW5jZXNPdXRzaWRlQ29uZmlnKGVsZW1lbnQsIG91dENvbmZpZ1JlZk1hcCwgbmV3U3VwcG9ydGluZ0VsZW1lbnRzKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgcHJvY2Vzc1JlZmVyZW5jZXNPdXRzaWRlQ29uZmlnKE1ldGhvZEVsZW1lbnQgZWxlbWVudCwKLQkJCU1hcDxTdHJpbmcsIEVsZW1lbnRSZWZlcmVuY2U+IG91dENvbmZpZ1JlZk1hcCwgU2V0PE1ldGhvZEVsZW1lbnQ+IG5ld1N1cHBvcnRpbmdFbGVtZW50cykgewotCQlJQ29uZmlndXJhdGlvbk1hbmFnZXIgY29uZmlnTWFuYWdlciA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0Q29uZmlndXJhdGlvbk1hbmFnZXIoCi0JCQkJZ2V0Q29uZmlnKCkpOwotCQlTZXQ8VmFyaWFiaWxpdHlFbGVtZW50PiByZXBsYWNlclNldCA9IG51bGw7Ci0JCWlmIChjb25maWdNYW5hZ2VyICE9IG51bGwpIHsKLQkJCXJlcGxhY2VyU2V0ID0gY29uZmlnTWFuYWdlci5nZXREZXBlbmRlbmN5TWFuYWdlcigpLmdldFJlcGxhY2VyU2V0KCk7Ci0JCX0JCQotCQkKLQkJTGlzdCBwcm9wZXJ0aWVzID0gTGlicmFyeVV0aWwuZ2V0U3RydWN0dXJhbEZlYXR1cmVzKGVsZW1lbnQpOwotCQlmb3IgKEVTdHJ1Y3R1cmFsRmVhdHVyZSBmOiAoTGlzdDxFU3RydWN0dXJhbEZlYXR1cmU+KSBwcm9wZXJ0aWVzKSB7CQkJCi0JCQlpZiAoIShmIGluc3RhbmNlb2YgRVJlZmVyZW5jZSkpIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQotCQkJRVJlZmVyZW5jZSBmZWF0dXJlID0gKEVSZWZlcmVuY2UpIGY7Ci0JCQlpZiAoZmVhdHVyZS5pc0NvbnRhaW5lcigpIHx8IGZlYXR1cmUuaXNDb250YWlubWVudCgpKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0KLQkJCU9iamVjdCB2YWx1ZSA9IGVsZW1lbnQuZUdldChmZWF0dXJlKTsKLQkJCWlmICh2YWx1ZSA9PSBudWxsKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQkKLQkJCUxpc3QgdmFsdWVzID0gbnVsbDsJCQkKLQkJCWlmICggZmVhdHVyZS5pc01hbnkoKSApIHsKLQkJCQl2YWx1ZXMgPSAoTGlzdCkgdmFsdWU7Ci0JCQl9IGVsc2UgaWYgKCB2YWx1ZSBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQgKSB7Ci0JCQkJaWYgKGRlc2NyaXB0b3JFeGNsdXNpdmVDaGVjaygoTWV0aG9kRWxlbWVudCkgdmFsdWUsIGVsZW1lbnQsIGZlYXR1cmUpKSB7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0JCQkJCi0JCQkJdmFsdWVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCXZhbHVlcy5hZGQodmFsdWUpOwotCQkJCQotCQkJCWlmIChyZXBsYWNlclNldCAhPSBudWxsKSB7Ci0JCQkJCWlmIChmZWF0dXJlID09IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFZhcmlhYmlsaXR5RWxlbWVudF9WYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkpIHsKLQkJCQkJCVZhcmlhYmlsaXR5RWxlbWVudCB2ZSA9IGVsZW1lbnQgaW5zdGFuY2VvZiBWYXJpYWJpbGl0eUVsZW1lbnQgPwotCQkJCQkJCQkoVmFyaWFiaWxpdHlFbGVtZW50KSBlbGVtZW50IDogbnVsbDsKLQkJCQkJCVZhcmlhYmlsaXR5VHlwZSB0eXBlID0gdmUgPT0gbnVsbCA/IG51bGwgOiB2ZS5nZXRWYXJpYWJpbGl0eVR5cGUoKTsKLQkJCQkJCWlmICh0eXBlID09IFZhcmlhYmlsaXR5VHlwZS5FWFRFTkRTX1JFUExBQ0VTIHx8Ci0JCQkJCQkJCXR5cGUgPT0gVmFyaWFiaWxpdHlUeXBlLlJFUExBQ0VTKSB7Ci0JCQkJCQkJcmVwbGFjZXJTZXQuYWRkKHZlKTsKLQkJCQkJCX0KLQkJCQkJfQkJCQkKLQkJCQl9Ci0JCQkJCi0JCQl9Ci0JCQkKLQkJCVN0cmluZyBndWlkID0gZWxlbWVudC5nZXRHdWlkKCk7Ci0JCQlmb3IgKE9iamVjdCByZWZlcnJlZFZhbHVlOiB2YWx1ZXMpIHsKLQkJCQlpZiAoISAocmVmZXJyZWRWYWx1ZSBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpKSB7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCQlNZXRob2RFbGVtZW50IHJlZmVycmVkRWxlbWVudCA9IChNZXRob2RFbGVtZW50KQlyZWZlcnJlZFZhbHVlOwotCQkJCWJvb2xlYW4gaXNPdXRDb25maWcgPSBjaGVja091dENvbmZpZ0VsZW1lbnQocmVmZXJyZWRFbGVtZW50LCBlbGVtZW50LCBuZXdTdXBwb3J0aW5nRWxlbWVudHMpOwotCQkJCWlmIChpc091dENvbmZpZyAmJiBvdXRDb25maWdSZWZNYXAgIT0gbnVsbCl7CQkJCQotCQkJCQlTdHJpbmcga2V5ID0gZ3VpZCArIHJlZmVycmVkRWxlbWVudC5nZXRHdWlkKCk7Ci0JCQkJCUVsZW1lbnRSZWZlcmVuY2UgZWxlbWVudFJlZmVyZW5jZSA9IG91dENvbmZpZ1JlZk1hcC5nZXQoa2V5KTsKLQkJCQkJaWYgKGVsZW1lbnRSZWZlcmVuY2UgPT0gbnVsbCkgewotCQkJCQkJZWxlbWVudFJlZmVyZW5jZSA9IG5ldyBFbGVtZW50UmVmZXJlbmNlKGVsZW1lbnQsIHJlZmVycmVkRWxlbWVudCk7Ci0JCQkJCQlvdXRDb25maWdSZWZNYXAucHV0KGtleSwgZWxlbWVudFJlZmVyZW5jZSk7Ci0JCQkJCX0KLQkJCQkJZWxlbWVudFJlZmVyZW5jZS5hZGRGZWF0dXJlKGZlYXR1cmUpOwotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQl9Ci0JCi0JcHJpdmF0ZSBib29sZWFuIGRlc2NyaXB0b3JFeGNsdXNpdmVDaGVjayhNZXRob2RFbGVtZW50IHJlZmVycmVkRWxlbWVudCwgTWV0aG9kRWxlbWVudCByZWZlcnJpbmdFbGVtZW50LCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSkgewotCQlpZiAoISBkZXNjcmlwdG9yRXhjbHVzaXZlT3B0aW9uKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJCi0JCWlmICghIChyZWZlcnJpbmdFbGVtZW50IGluc3RhbmNlb2YgRGVzY3JpcHRvcikpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQkKLQkJaWYgKGZlYXR1cmUgPT0gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza0Rlc2NyaXB0b3JfVGFzaygpKSB7Ci0JCQlyZXR1cm4gcmVmZXJyZWRFbGVtZW50IGluc3RhbmNlb2YgVGFzazsKLQkJfQotCQlpZiAoZmVhdHVyZSA9PSBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRSb2xlRGVzY3JpcHRvcl9Sb2xlKCkpIHsKLQkJCXJldHVybiByZWZlcnJlZEVsZW1lbnQgaW5zdGFuY2VvZiBSb2xlOwkJCi0JCX0KLQkJaWYgKGZlYXR1cmUgPT0gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX1dvcmtQcm9kdWN0KCkpIHsKLQkJCXJldHVybiByZWZlcnJlZEVsZW1lbnQgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdDsJCQotCQl9Ci0JCQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGNoZWNrT3V0Q29uZmlnRWxlbWVudChNZXRob2RFbGVtZW50IHJlZmVycmVkRWxlbWVudCwgTWV0aG9kRWxlbWVudCByZWZlcmluZ0VsZW1lbnQsIFNldDxNZXRob2RFbGVtZW50PiBuZXdTdXBwb3J0aW5nRWxlbWVudHMpIHsKLQkJaWYgKHJlZmVycmVkRWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZFBhY2thZ2UKLQkJCQl8fCByZWZlcnJlZEVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RDb25maWd1cmF0aW9uKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlpZiAocmVmZXJyZWRFbGVtZW50IGluc3RhbmNlb2YgVmFyaWFiaWxpdHlFbGVtZW50KSB7Ci0JCQlWYXJpYWJpbGl0eUVsZW1lbnQgcmVwbGFjZXIgPSBDb25maWd1cmF0aW9uSGVscGVyLmdldFJlcGxhY2VyKAotCQkJCQkoVmFyaWFiaWxpdHlFbGVtZW50KSByZWZlcnJlZEVsZW1lbnQsIGdldENvbmZpZygpKTsKLQkJCWlmIChyZXBsYWNlciAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0KLQkJLy8gdGhlIGVsZW1lbnQgbWlnaHQgYmUgc3VidHJhY3RlZCwgc28gaWdub3JlIGl0Ci0JCWlmICghc3VwcG9ydGluZ0VsZW1lbnRzLmNvbnRhaW5zKHJlZmVyaW5nRWxlbWVudCkgJiYgIUNvbmZpZ3VyYXRpb25IZWxwZXIuaW5Db25maWcocmVmZXJpbmdFbGVtZW50LCBnZXRDb25maWcoKSwgdHJ1ZSwgZmFsc2UpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlpZiAoIUNvbmZpZ3VyYXRpb25IZWxwZXIuaW5Db25maWcocmVmZXJyZWRFbGVtZW50LCBnZXRDb25maWcoKSkKLQkJCQkmJiAhaXNPd25lclNlbGVjdGVkKHJlZmVycmVkRWxlbWVudCwgbmV3U3VwcG9ydGluZ0VsZW1lbnRzKSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNTdXBwb3J0aW5nRWxlbWVudChNZXRob2RFbGVtZW50IGVsZW1lbnQpIHsKLQkJYm9vbGVhbiByZXQgPSBpc1N1cHBvcnRpbmdFbGVtZW50XyhlbGVtZW50KTsKLQkJaWYgKGxvY2FsRGVidWcxKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxEPiBpc1NFOiAiICsgcmV0ICsgIC8vJE5PTi1OTFMtMSQKLQkJCQkJIiwgZWxlbWVudDogIiArIERlYnVnVXRpbC50b1N0cmluZyhlbGVtZW50LCAyKSk7Ly8kTk9OLU5MUy0xJCAKLQkJfQotCQlyZXR1cm4gcmV0OwotCX0KLQkKLQkKLQlwcml2YXRlIGJvb2xlYW4gaXNTdXBwb3J0aW5nRWxlbWVudF8oTWV0aG9kRWxlbWVudCBlbGVtZW50KSB7Ci0JCWlmIChpc1VwZGF0aW5nQ2hhbmdlcygpKSB7CQkJCQotCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CQkKLQkJfSBlbHNlIGlmIChpc05lZWRVcGRhdGVDaGFuZ2VzKCkpIHsKLQkJCXVwZGF0ZUNoYW5nZXMoKTsKLQkJfQotCQlyZXR1cm4gc3VwcG9ydGluZ0VsZW1lbnRzLmNvbnRhaW5zKGVsZW1lbnQpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVDaGFuZ2VJbXBsKCkgewotCQlDb25maWd1cmF0aW9uQ2xvc3VyZSBjbG9zdXJlID0gbmV3IENvbmZpZ3VyYXRpb25DbG9zdXJlKG51bGwsIGdldENvbmZpZygpKTsKLQl9Ci0JCi0JLy9pc1N1cHBvcnRpbmdFbGVtZW50IGNoZWNrIGR1cmluZyB1cGRhdGluZyBtb2RlCi0JcHVibGljIGJvb2xlYW4gaXNTdXBwb3J0aW5nRWxlbWVudENhbGxEdXJpbmdVcGRhdGluZyhFbGVtZW50UmVmZXJlbmNlIHJlZikgewotCQlpZiAoISBpc0VuYWJsZWQoKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCU1ldGhvZEVsZW1lbnQgcmVmZXJyaW5nRWxlbWVudCA9IHJlZi5nZXRFbGVtZW50KCk7Ci0JCU1ldGhvZEVsZW1lbnQgcmVmZXJyZWRFbGVtZW50ID0gcmVmLmdldFJlZkVsZW1lbnQoKTsKLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSByZWYuZ2V0U2luZ2xlRmVhdHVyZSgpOwotCQlpZiAoZGVzY3JpcHRvckV4Y2x1c2l2ZUNoZWNrKHJlZmVycmVkRWxlbWVudCwgcmVmZXJyaW5nRWxlbWVudCwgZmVhdHVyZSkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gaXNPd25lclNlbGVjdGVkKHJlZmVycmVkRWxlbWVudCwgbnVsbCk7Ci0JfQotCQotCXByaXZhdGUgYm9vbGVhbiBpc093bmVyU2VsZWN0ZWQoTWV0aG9kRWxlbWVudCBlbGVtZW50LAotCQkJU2V0PE1ldGhvZEVsZW1lbnQ+IG5ld1N1cHBvcnRpbmdFbGVtZW50cykgewotCQlpZiAoISBpc1VwZGF0aW5nQ2hhbmdlcygpKSB7Ci0JCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsJCi0JCX0KLQkJCi0JCWlmIChzdXBwb3J0aW5nRWxlbWVudHMuY29udGFpbnMoZWxlbWVudCkpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0KLQkJYm9vbGVhbiByZXQgPSBmYWxzZTsKLQkJRU9iamVjdCBzZWxlY3RhYmxlID0gTGlicmFyeVV0aWwuZ2V0U2VsZWN0YWJsZShlbGVtZW50KTsKLQkJaWYgKHNlbGVjdGFibGUgaW5zdGFuY2VvZiBNZXRob2RQYWNrYWdlKSB7Ci0JCQlyZXQgPSBzZWxlY3RlZFBhY2thZ2VzLmNvbnRhaW5zKHNlbGVjdGFibGUpOwotCQl9IGVsc2UgaWYgKHNlbGVjdGFibGUgaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pIHsKLQkJCXJldCA9IHN1cHBvcnRpbmdQbHVnaW5zLmNvbnRhaW5zKHNlbGVjdGFibGUpOwotCQl9IGVsc2UgaWYgKHNlbGVjdGFibGUgaW5zdGFuY2VvZiBNZXRob2RMaWJyYXJ5KSB7Ci0JCQlyZXQgPSB0cnVlOwotCQl9Ci0JCWlmIChyZXQpIHsKLQkJCXN1cHBvcnRpbmdFbGVtZW50cy5hZGQoZWxlbWVudCk7Ci0JCQlpZiAobG9jYWxEZWJ1ZzEpIHsKLQkJCQlTeXN0ZW0ub3V0Ci0JCQkJCQkucHJpbnRsbigiTEQ+IHN1cHBvcnRpbmdFbGVtZW50cyBhZGRlZDogIiArIERlYnVnVXRpbC50b1N0cmluZyhlbGVtZW50LCAyKSk7Ly8kTk9OLU5MUy0xJCAKLQkJCX0KLQkJCWlmIChuZXdTdXBwb3J0aW5nRWxlbWVudHMgIT0gbnVsbCkgewotCQkJCW5ld1N1cHBvcnRpbmdFbGVtZW50cy5hZGQoZWxlbWVudCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJldDsKLQl9Ci0JCQotCXB1YmxpYyBib29sZWFuIGlzU3VwcG9ydGluZ1NlbGVjdGFibGUoTWV0aG9kRWxlbWVudCBlbGVtZW50KSB7Ci0JCWlmICghIGlzRW5hYmxlZCgpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHNlbGVjdGVkUGFja2FnZXMuY29udGFpbnMoZWxlbWVudCkgfHwgc3VwcG9ydGluZ1BsdWdpbnMuY29udGFpbnMoZWxlbWVudCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNFbmFibGVkKCkgewotCQlyZXR1cm4gZW5hYmxlZDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0RW5hYmxlZChib29sZWFuIGVuYWJsZWQpIHsKLQkJdGhpcy5lbmFibGVkID0gZW5hYmxlZDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHN5bmNocm9uaXplZCBib29sZWFuIGlzRGVzY3JpcHRvckV4Y2x1c2l2ZU9wdGlvbigpIHsKLQkJcmV0dXJuIGRlc2NyaXB0b3JFeGNsdXNpdmVPcHRpb247Ci0JfQotCi0JcHVibGljIHN0YXRpYyBzeW5jaHJvbml6ZWQgdm9pZCBzZXREZXNjcmlwdG9yRXhjbHVzaXZlT3B0aW9uKAotCQkJYm9vbGVhbiBkZXNjcmlwdG9yRXhjbHVzaXZlT3B0aW9uKSB7Ci0JCVN1cHBvcnRpbmdFbGVtZW50RGF0YS5kZXNjcmlwdG9yRXhjbHVzaXZlT3B0aW9uID0gZGVzY3JpcHRvckV4Y2x1c2l2ZU9wdGlvbjsKLQl9Ci0KLQkKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9jb25maWd1cmF0aW9uL1RvTWFueUZlYXR1cmVWYWx1ZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2NvbmZpZ3VyYXRpb24vVG9NYW55RmVhdHVyZVZhbHVlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5N2E0OTUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2NvbmZpZ3VyYXRpb24vVG9NYW55RmVhdHVyZVZhbHVlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50OwotCi0vKioKLSAqIHJlYWxpemVkIGZlYXR1cmUgdmFsdWUgZm9yIGEgdG9NYW55IGZlYXR1cmUKLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBUb01hbnlGZWF0dXJlVmFsdWUgZXh0ZW5kcyBGZWF0dXJlVmFsdWUgewotCi0JTGlzdCB2YWx1ZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLkZlYXR1cmVWYWx1ZSNGZWF0dXJlVmFsdWUoTWV0aG9kRWxlbWVudCwgTWV0aG9kRWxlbWVudCwgT2JqZWN0LCBFbGVtZW50UmVhbGl6ZXIpCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiBAcGFyYW0gb3duZXJFbGVtZW50Ci0JICogQHBhcmFtIGZlYXR1cmUKLQkgKiBAcGFyYW0gcmVhbGl6ZXIKLQkgKi8KLQlwdWJsaWMgVG9NYW55RmVhdHVyZVZhbHVlKE1ldGhvZEVsZW1lbnQgZWxlbWVudCwgTWV0aG9kRWxlbWVudCBvd25lckVsZW1lbnQsIE9iamVjdCBmZWF0dXJlLCBFbGVtZW50UmVhbGl6ZXIgcmVhbGl6ZXIpIHsKLQkJc3VwZXIoZWxlbWVudCwgb3duZXJFbGVtZW50LCBmZWF0dXJlLCByZWFsaXplcik7Ci0JfQotCi0JLyoqCi0JICogYWRkIGEgZmVhdHVyZSB2YWx1ZSB0byB0aGUgdmFsdWUgbGlzdAotCSAqIEBwYXJhbSBvd25lciBWYXJpYWJpbGl0eUVsZW1lbnQKLQkgKiBAcGFyYW0gdmFsdWUgT2JqZWN0Ci0JICovCi0JcHVibGljIHZvaWQgYWRkKFZhcmlhYmlsaXR5RWxlbWVudCBvd25lciwgT2JqZWN0IHZhbHVlKSB7Ci0JCWlmICggISh2YWx1ZSBpbnN0YW5jZW9mIExpc3QpICkgewkKLQkJCXJldHVybjsKLQkJfQotCQkJCi0JCUhhc2hTZXQgc2VlblZhbHVlcyA9IG5ldyBIYXNoU2V0KHZhbHVlcyk7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSAoKExpc3QpIHZhbHVlKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3Qgb2JqID0gaXQubmV4dCgpOwotCQkJaWYgKCBvYmogaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50ICkgewotCQkJCU1ldGhvZEVsZW1lbnQgZSA9IChNZXRob2RFbGVtZW50KSBvYmo7Ci0JCQkJLy9NZXRob2RFbGVtZW50IGNlID0gcmVhbGl6ZXIucmVhbGl6ZShlKTsKLQkJCQlNZXRob2RFbGVtZW50IGNlID0gQ29uZmlndXJhdGlvbkhlbHBlci5nZXRDYWxjdWxhdGVkRWxlbWVudChlLCByZWFsaXplcik7Ci0JCQkJCi0JCQkJLy8gY2FsY3VsYXRlZCBlbGVtZW50IGNhbiBiZSBudWxsIGlmIGl0IGNhbid0IHNob3cKLQkJCQlpZiAoY2UgIT0gbnVsbCAmJiAhc2VlblZhbHVlcy5jb250YWlucyhjZSkpIHsKLQkJCQkJdmFsdWVzLmFkZChjZSk7Ci0JCQkJCXNlZW5WYWx1ZXMuYWRkKGNlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCWlmICggKG93bmVyIGluc3RhbmNlb2YgQ29udGVudEVsZW1lbnQpCi0JCQkJJiYgKGZlYXR1cmUgPT0gVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCS5nZXRDb250ZW50RGVzY3JpcHRpb25fU2VjdGlvbnMoKSkpIHsKLQkJCUNvbmZpZ3VyYXRpb25IZWxwZXIub3JkZXJTZWN0aW9ucygoQ29udGVudEVsZW1lbnQpIG93bmVyLCB2YWx1ZXMpOwotCQl9Ci0JCQkJCQkKLQl9Ci0JCi0KLQkvKioKLQkgKiBnZXQgdGhlIHJlYWxpemVkIHZhbHVlCi0JICogQHJldHVybiBPYmplY3QKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFZhbHVlKCkgewkJCi0JCWlmICggaXNFeHRlbmRSZXBsYWNlRW5hYmxlZCgpICkgewotCQkJTGlzdCBpdGVtcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQotCQkJLy8gcmVtb3ZlIHRoZSBfTlVMTF8gaXRlbS4gdGhhdCBpcyB1c2VkIGFzIGFuIGluZGljYXRvciB0byBibGFuayBvdXQgdGhlIGJhc2UgCi0JCQkvLyBmb3IgdGhlIGV4dGVuZC1yZXBsYWNlCi0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gdmFsdWVzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTsgKSB7Ci0JCQkJT2JqZWN0IG8gPSAoT2JqZWN0KSBpdC5uZXh0KCk7Ci0JCQkJaWYgKCBpc0JsYW5rSW5kaWNhdG9yKG8pICkgewotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJaXRlbXMuYWRkKG8pOwotCQkJfQotCQkJCi0JCQlyZXR1cm4gaXRlbXM7Ci0JCX0KLQkJCi0JCXJldHVybiB2YWx1ZXM7Ci0KLQl9Ci0KLQkvKioKLQkgKiBnZXQgdGhlIHNpemUgb2YgdGhlIHZhbHVlIGxpc3QuCi0JICovCi0JcHVibGljIGludCBzaXplKCkgewotCQlyZXR1cm4gdmFsdWVzLnNpemUoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvY29uZmlndXJhdGlvbi9Ub01hbnlPcHBvc2l0ZUZlYXR1cmVWYWx1ZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2NvbmZpZ3VyYXRpb24vVG9NYW55T3Bwb3NpdGVGZWF0dXJlVmFsdWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjc4NTIzZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvY29uZmlndXJhdGlvbi9Ub01hbnlPcHBvc2l0ZUZlYXR1cmVWYWx1ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlByb2Nlc3NVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUudXRpbC5PcHBvc2l0ZUZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkFzc29jaWF0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzczsKLQotLyoqCi0gKiByZWFsaXplZCBmZWF0dXJlIHZhbHVlIGZvciBhIHRvTWFueSBvcHBvc2l0ZSBmZWF0dXJlCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKgotICovCi1wdWJsaWMgY2xhc3MgVG9NYW55T3Bwb3NpdGVGZWF0dXJlVmFsdWUgZXh0ZW5kcyBUb01hbnlGZWF0dXJlVmFsdWUgewotCQotCS8qKgotCSAqIEBzZWUgY29uc3RydWN0IGEgZmVhdHVyZSB2YWx1ZSBvYmplY3QgZm9yIHRvLW1hbnkgb3Bwb3NpdGUgZmVhdHVyZQotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogQHBhcmFtIGZlYXR1cmUKLQkgKiBAcGFyYW0gcmVhbGl6ZXIKLQkgKi8KLQlwdWJsaWMgVG9NYW55T3Bwb3NpdGVGZWF0dXJlVmFsdWUoTWV0aG9kRWxlbWVudCBlbGVtZW50LCBPcHBvc2l0ZUZlYXR1cmUgZmVhdHVyZSwgRWxlbWVudFJlYWxpemVyIHJlYWxpemVyKSB7Ci0JCXN1cGVyKGVsZW1lbnQsIG51bGwsIGZlYXR1cmUsIHJlYWxpemVyKTsKLQl9Ci0KLQkKLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5Ub01hbnlGZWF0dXJlVmFsdWUjYWRkKFZhcmlhYmlsaXR5RWxlbWVudCwgT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZChWYXJpYWJpbGl0eUVsZW1lbnQgb3duZXIsIE9iamVjdCB2YWx1ZSkgewotCQkKLQkJLy8gd29yayBhcm91bmQgZm9yIG9wcG9zaXRlIGZlYXR1cmUgdmFsdWUgdGhhdCBzdGlsbCByZXR1cm4gYSBzaW5nbGUgdmFsdWUgaW5zdGVhZCBvZiBhIGxpc3QKLQkJaWYgKCB2YWx1ZSBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQgKSB7Ci0JCQlBcnJheUxpc3QgdiA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCXYuYWRkKHZhbHVlKTsKLQkJCXZhbHVlID0gdjsKLQkJfQotCQkKLQkJaWYgKCAhKHZhbHVlIGluc3RhbmNlb2YgTGlzdCkgKSB7CQotCQkJcmV0dXJuOwotCQl9Ci0JCQkKLQkJT3Bwb3NpdGVGZWF0dXJlIG9mID0gKE9wcG9zaXRlRmVhdHVyZSlmZWF0dXJlOwotCQlFU3RydWN0dXJhbEZlYXR1cmUgZiA9IG9mLmdldFRhcmdldEZlYXR1cmUoKTsKLQotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gKChMaXN0KSB2YWx1ZSkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJTWV0aG9kRWxlbWVudCBlID0gKE1ldGhvZEVsZW1lbnQpIGl0Lm5leHQoKTsKLQkJCQotCQkJLy9BIHJlcGxhY2VkIHByb2Nlc3Mgc2hvdWxkIG5vdCBiZSBzaG93biBhcyBhIHByb2Nlc3MgdXNhZ2UgCi0JCQlpZiAob2YgPT0gQXNzb2NpYXRpb25IZWxwZXIuVGFza19UYXNrRGVzY3JpcHRvcnMgJiYgZSBpbnN0YW5jZW9mIFRhc2tEZXNjcmlwdG9yKSB7Ci0JCQkJVGFza0Rlc2NyaXB0b3IgdGQgPSAoVGFza0Rlc2NyaXB0b3IpIGU7CQkJCQotCQkJCVByb2Nlc3MgcHJvYyA9IFByb2Nlc3NVdGlsLmdldFByb2Nlc3ModGQuZ2V0U3VwZXJBY3Rpdml0aWVzKCkpOwotCQkJCU1ldGhvZEVsZW1lbnQgcmVhbGl6ZWQgPSBDb25maWd1cmF0aW9uSGVscGVyLmdldENhbGN1bGF0ZWRFbGVtZW50KHByb2MsIGdldFJlYWxpemVyKCkpOwotCQkJCWlmIChyZWFsaXplZCAhPSBwcm9jKSB7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCX0KLQotCQkJLy8gUmVwbGFjZSBkb2VzIG5vdCBjb21wbGV0ZWx5IHJlbW92ZQotCQkJLy8gb3V0Z29pbmcgYXNzb2NpYXRpb25zCi0JCQkvLyBpZiB0aGUgb3Bwb3NpdGUgZmVhdHVyZSB2YWx1ZSBoYXMgcmVwbGFjZXIgaW4gdGhlCi0JCQkvLyBjb25maWd1cmF0aW9uCi0JCQkvLyBpdCdzIG91dGdvaW5nIGFzc29jaWF0aW9ucyAoaS5lLiwgdGhpcyBlbGVtZW50KSB3aWxsIGJlCi0JCQkvLyByZXBsYWNlZCBieSB0aGUgcmVwbGFjaW5nIGVsZW1lbnQKLQkJCS8vIGFzIGEgcmVzdWx0LCB0aGUgb3Bwb3NpdGUgZmVhdHVyZSB2YWx1ZSBzaG91bGQgZHJvcCB0aGUKLQkJCS8vIHJlcGxhY2VkIGVsZW1lbnQKLQkJCS8vCi0JCQkvLyBmb3IgZXhhbXBsZSwgUjEgLT4gcmVzcG9uc2libGUgZm9yIEExLCBSMiByZXNwb25zaWJsZSBmb3IKLQkJCS8vIEEyCi0JCQkvLyBpZiBSMiByZXBsYWNlcyBSMSwgdGhlbiBSMiBzdGlsbCByZXNwb25zaWJsZSBmb3IgQTIKLQkJCS8vIGJ1dCBBMSBkb2VzIG5vdCBoYXZlIGEgcmVzcG9uc2libGUgcm9sZSAobm90IFIyKQotCQkJLy8gc28gZm9yIEExJ3MgcmVzcG9uc2libGUgcm9sZSBvcHBvc2l0ZSBmZWF0dXJlLAotCQkJLy8gdGhlIHZhbHVlIFIxIHNob3VsZCBiZSBkcm9wcGVkIGluc3RlYWQgb2YgcmVhbGl6ZSB0byBSMgotCQkJLy8gSmluaHVhIFhpLCAxMC8yNy8yMDA1Ci0JCQkKLQkJCS8vIGNoZWNrIHRoZSByZXBsYWNlciBpcyBub3QgZW5vdWdoLiBJZiB0aGUgYmFzZSBlbGVtZW50IGlzIHJlcGxhY2VkLCAKLQkJCS8vIGFsbCB0aGUgY29udHJpYnV0b3JzIHRvIHRoZSBiYXNlIHNob3VsZCBhbHNvIGJlIGNvbnNpZGVyZWQgYXMgcmVwbGFjZWQuCi0JCQkvLyBzbyByZWFsaXplIHRoZSBlbGVtZW50LCBzZWUgaWYgaXQgaXMgYSByZXBsYWNlcgotCQkJLy8gQnVnIDE5OTY4NiAtIFJlcGxhY2luZyByb2xlcyBkb2VzIG5vdCB1cGRhdGUgcmVzcG9uc2libGUgd29yayBwcm9kdWN0J3MgcGFnZXMKLQkJCVZhcmlhYmlsaXR5RWxlbWVudCByZXBsYWNlciA9IG51bGw7Ci0JCQlpZiAoIGUgaW5zdGFuY2VvZiBWYXJpYWJpbGl0eUVsZW1lbnQgKSB7Ci0JCQkJLy9yZXBsYWNlciA9IENvbmZpZ3VyYXRpb25IZWxwZXIuZ2V0UmVwbGFjZXIoKFZhcmlhYmlsaXR5RWxlbWVudCkgZSwgcmVhbGl6ZXIuZ2V0Q29uZmlndXJhdGlvbigpKTsKLQkJCQlyZXBsYWNlciA9IChWYXJpYWJpbGl0eUVsZW1lbnQpQ29uZmlndXJhdGlvbkhlbHBlci5nZXRDYWxjdWxhdGVkRWxlbWVudChlLCByZWFsaXplcik7Ci0JCQkJaWYgKCAocmVwbGFjZXIgPT0gZSkgfHwgIUNvbmZpZ3VyYXRpb25IZWxwZXIuaXNSZXBsYWNlcihyZXBsYWNlcikgfHwgCi0JCQkJCQlDb25maWd1cmF0aW9uSGVscGVyLmNvbnRydWJ1dGVDaGFpbigoVmFyaWFiaWxpdHlFbGVtZW50KSBlLCAoVmFyaWFiaWxpdHlFbGVtZW50KXJlcGxhY2VyKSkgewkJCQkJCi0JCQkJCXJlcGxhY2VyID0gbnVsbDsKLQkJCQl9Ci0JCQkJCi0JCQl9Ci0JCQlib29sZWFuIGlzVmFsdWVSZXBsYWNlZCA9IChyZXBsYWNlciAhPSBudWxsKTsKLQotCQkJYm9vbGVhbiBrZWVwID0gIWlzVmFsdWVSZXBsYWNlZDsKLQkJCWlmICggaXNWYWx1ZVJlcGxhY2VkICYmIAotCQkJCQkoQ29uZmlndXJhdGlvbkhlbHBlci5pc0V4dGVuZFJlcGxhY2VyKHJlcGxhY2VyKSAKLQkJCQkJfHwgRWxlbWVudFJlYWxpemVyLmlzRXh0ZW5kUmVwbGFjZUVuYWJsZWQoKSkgKSB7Ci0JCQkJLy8gaWYgdGhlIHZhbHVlIGlzIHJlcGxhY2VkLCBidXQgdGhlIG91dCBnb2luZyBmZWF0dXJlIGlzIGluaGVyaXRlZCBieSB0aGUgcmVwbGFjZXIKLQkJCQkvLyB0aGVuIHdlIHNob3VsZCBrZWVwIHRoaXMgdmFsdWUsIHNvIHdlIG5lZWQgdG8gY2FsY3VsYXRlIHRoZSBmZWF0dXJlIHZhbHVlIAotCQkJCS8vIG9mIHRoZSByZXBsYWNlcgotCQkJCWlmICggZi5pc01hbnkoKSApIHsKLQkJCQkJTGlzdCBpdGVtcyA9IENvbmZpZ3VyYXRpb25IZWxwZXIuY2FsYzBuRmVhdHVyZVZhbHVlKHJlcGxhY2VyLCBmLCByZWFsaXplcik7Ci0JCQkJCWtlZXAgPSBpdGVtcy5jb250YWlucyhvd25lcik7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJTWV0aG9kRWxlbWVudCBpdGVtID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMDFGZWF0dXJlVmFsdWUocmVwbGFjZXIsIGYsIHJlYWxpemVyKTsKLQkJCQkJa2VlcCA9IChpdGVtID09IG93bmVyKTsKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCS8vIGlmIHRoZSB2YWx1ZSdzIGZlYXR1cmUgdG8gdGhpcyBlbGVtZW50IGlzIHRvLW9uZSwgCi0JCQkvLyB0aGVuIHRoaXMgdmFsdWUncyBmZWF0dXJlIHZhbHVlIHNob3VsZCBiZSB0aGUgZWxlbWVudCwKLQkJCS8vIG90aGVyd2lzZSBkcm9wIHRoZSB2YWx1ZQotCQkJLy8gZm9yIGV4YW1wbGUsIAotCQkJLy8gVDEgLT4gUjEgKHByaW1hcnkgcGVyZm9ybWFlcikKLQkJCS8vIFQyIC0+IFIyCi0JCQkvLyBUMiBjb250cmlidXRlcyB0byBUMQotCQkJLy8gc2luY2UgVDEgYWxyZWFkeSBoYXMgUjEsIHNvIFIyIGlzIGRyb3BlZAotCQkJLy8gc28gd2hlbiBjYWxjdWxhdGluZyBSMidzIHBlcmZvcm1pbmcgdGFza3MsIFQxIHNob3VsZCBub3QgYmUgaW5jbHVkZWQKLQkJCWlmICgga2VlcCApIHsKLQkJCQlNZXRob2RFbGVtZW50IHZlID0gQ29uZmlndXJhdGlvbkhlbHBlci5nZXRDYWxjdWxhdGVkRWxlbWVudChlLCByZWFsaXplcik7Ci0JCQkJaWYgKCB2ZSAhPSBudWxsICkgewotCQkJCQkKLQkJCQkJLy8gY2hlY2sgaWYgdGhpcyBpcyBhIHRvLW9uZSBmZWF0dXJlLCBjdXJyZW50bHkgb25seSBUYXNrLT5QcmltYXJ5IFJvbGUgYW5kIFREIC0+IFByaW1hcnkgUkQKLQkJCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGYxID0gQ29uZmlndXJhdGlvbkhlbHBlci5nZXQwMUZlYXR1cmUob2YpOwotCQkJCQlpZiAoIGYxICE9IG51bGwgKSB7Ci0JCQkJCQlNZXRob2RFbGVtZW50IGl0ZW0gPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwMUZlYXR1cmVWYWx1ZSh2ZSwgZjEsIHJlYWxpemVyKTsKLQkJCQkJCQotCQkJCQkJLy8gaWYgdGhlIHZhbHVlIGVsZW1lbnQncyB0by1vbmUgZmVhdHVyZSB2YWx1ZSBpdGVtIGlzIG5vdCB0aGUgY3VycmVudCBlbGVtZW50LCAKLQkJCQkJCS8vIHRoZW4gdGhlIGVsZW1lbnQncyBvcHBvc2l0ZSBmZWF0dXJlIHZhbHVlIHNob3VsZCBub3QgY29udGFpbiB0aGlzIHZhbHVlLgotCQkJCQkJLy8gc2F5LCB0aGUgdmFsdWUgZWxlbWVudCBpcyBhIHRhc2sgYW5kIHRoZSBjdXJyZW50IGVsZW1lbnQgaXMgYSByb2xlLAotCQkJCQkJLy8gdGhlbiBpZiB0aGUgdGFzaydzIHByaW1hcnkgcGVyZm9ybWVyIChpdGVtIGFib3ZlKSBpcyBub3QgdGhpcyByb2xlICh0aGUgY3VycmVudCBlbGVtZW50KSwgCi0JCQkJCQkvLyB0aGVuIHRoZSByb2xlJ3MgcGVyZm9ybWluZyB0YXNrcyAodGhlIG9wcG9zaXRlIGZlYXR1cmUgdmFsdWUpIAotCQkJCQkJLy8gc2hvdWxkIG5vdCBjb250YWluIHRoaXMgdGFzayAodGhlIHZhbHVlLCB2ZSBhYm92ZSkKLQkJCQkJCWlmICggaXRlbSAhPSBlbGVtZW50KSB7Ci0JCQkJCQkJa2VlcCA9IGZhbHNlOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJCi0JCQkKLQkJCWlmICgga2VlcCApIHsKLQkJCQkJCi0JCQkJTWV0aG9kRWxlbWVudCBjZSA9IENvbmZpZ3VyYXRpb25IZWxwZXIuZ2V0Q2FsY3VsYXRlZEVsZW1lbnQoZSwgcmVhbGl6ZXIpOwotCi0JCQkJLy8gY2FsY3VsYXRlZCBlbGVtZW50IGNhbiBiZSBudWxsIGlmIGl0IGNhbid0IHNob3cKLQkJCQlpZiAoY2UgIT0gbnVsbCAmJiAhdmFsdWVzLmNvbnRhaW5zKGNlKSkgewotCQkJCQl2YWx1ZXMuYWRkKGNlKTsKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCQotCQkJLy8gaWYgdGhlIGVsZW1lbnQgZSBoYXMgZXh0ZW5kZXJzIGFuZCB0aGUgZXh0ZW5kZXIncyBmZWF0dXJlIGlzIHRoZSBvd25lciBlbGVtZW50LCAKLQkJCS8vIHRoZW4gd2UgYWxzbyBuZWVkIHRvIGluY2x1ZGUgdGhlIGV4dGVuZGVyCi0JCQlwcm9jZXNzRXh0ZW5kZXJzKGUsIGYpOwotCQl9CQotCX0KLQkKLQlwcml2YXRlIHZvaWQgcHJvY2Vzc0V4dGVuZGVycyhNZXRob2RFbGVtZW50IGUsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmKSB7Ci0JCWlmICggIShlIGluc3RhbmNlb2YgVmFyaWFiaWxpdHlFbGVtZW50KSApIHsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJVmFyaWFiaWxpdHlFbGVtZW50IHZlID0gKFZhcmlhYmlsaXR5RWxlbWVudCllOwotCQkKLQkJTGlzdCBpdGVtcyA9IENvbmZpZ3VyYXRpb25IZWxwZXIuZ2V0RXh0ZW5kZXJzKCB2ZSwgcmVhbGl6ZXIuZ2V0Q29uZmlndXJhdGlvbigpKTsKLQkJaWYgKCBpdGVtcy5zaXplKCkgPiAwICkgewkJCi0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gaXRlbXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCU1ldGhvZEVsZW1lbnQgbWUgPSAoTWV0aG9kRWxlbWVudCkgaXQubmV4dCgpOwotCQkJCWJvb2xlYW4ga2VlcCA9IGZhbHNlOwotCQkJCWlmICggZi5pc01hbnkoKSApIHsKLQkJCQkJTGlzdCB2eCA9IENvbmZpZ3VyYXRpb25IZWxwZXIuY2FsYzBuRmVhdHVyZVZhbHVlKG1lLCBmLCByZWFsaXplcik7Ci0JCQkJCS8vIGlmIHRoZSB2YWx1ZSBjb250YWlucyB0aGUgb3duZXIgZWxlbWVudCwgdGhlbiBpbmNsdWRlIGl0Ci0JCQkJCWtlZXAgPSAodnggIT0gbnVsbCkgJiYgdnguY29udGFpbnMoc3VwZXIuZWxlbWVudCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJTWV0aG9kRWxlbWVudCB2ID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMDFGZWF0dXJlVmFsdWUobWUsIGYsIHJlYWxpemVyKTsKLQkJCQkJCi0JCQkJCS8vIGlmIHRoZSBmZWF0dXJlIHZhbHVlIGlzIHRoZSBvd25lciBlbGVtZW50LCB0aGVuIHRoaXMgdmFsdWUgc2hvdWxkIGJlIGluY2x1ZGVkCi0JCQkJCWtlZXAgPSAodiA9PSBzdXBlci5lbGVtZW50KTsKLQkJCQl9Ci0JCQkJCi0JCQkJaWYgKGtlZXAgJiYgIXN1cGVyLnZhbHVlcy5jb250YWlucyhtZSkgKSB7Ci0JCQkJCXN1cGVyLnZhbHVlcy5hZGQobWUpOwotCQkJCQlwcm9jZXNzRXh0ZW5kZXJzKG1lLCBmKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCS8vIGlmIHRoZSBlbGVtZW50IGlzIGEgY29udHJpYnV0b3Igb3IgcmVwbGFjZXIsIGFsc28gbmVlZCB0byBjaGVjayB0aGUgZXh0ZW5kZXJzIG9mIHRoZSBiYXNlIGVsZW1lbnQKLQkJaWYgKCBDb25maWd1cmF0aW9uSGVscGVyLmlzQ29udHJpYnV0b3IodmUpIHx8IENvbmZpZ3VyYXRpb25IZWxwZXIuaXNSZXBsYWNlcih2ZSkgKSB7Ci0JCQlwcm9jZXNzRXh0ZW5kZXJzKHZlLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSwgZik7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvY29uZmlndXJhdGlvbi9Ub09uZUZlYXR1cmVWYWx1ZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2NvbmZpZ3VyYXRpb24vVG9PbmVGZWF0dXJlVmFsdWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2RhY2YwOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvY29uZmlndXJhdGlvbi9Ub09uZUZlYXR1cmVWYWx1ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50OwotCi0vKioKLSAqIHJlYWxpemVkIGZlYXR1cmUgdmFsdWUgZm9yIGEgdG8tb25lIGZlYXR1cmUKLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBUb09uZUZlYXR1cmVWYWx1ZSBleHRlbmRzIEZlYXR1cmVWYWx1ZSB7Ci0KLQkvLyBtYXAgb2YgZWxlbWVudCBhbmQgdGhlIHZhbHVlCi0JTGlua2VkSGFzaE1hcCB2YWx1ZU1hcCA9IG5ldyBMaW5rZWRIYXNoTWFwKCk7Ci0KLQkvKioKLQkgKiBjb25zdHJ1Y3QgdGhlIG9iamVjdCBmb3IgYSB0by1vbmUgZmVhdHVyZSB2YWx1ZQotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogQHBhcmFtIG93bmVyRWxlbWVudAotCSAqIEBwYXJhbSBmZWF0dXJlCi0JICogQHBhcmFtIHJlYWxpemVyCi0JICovCi0JcHVibGljIFRvT25lRmVhdHVyZVZhbHVlKE1ldGhvZEVsZW1lbnQgZWxlbWVudCwgTWV0aG9kRWxlbWVudCBvd25lckVsZW1lbnQsIE9iamVjdCBmZWF0dXJlLCBFbGVtZW50UmVhbGl6ZXIgcmVhbGl6ZXIpIHsKLQkJc3VwZXIoZWxlbWVudCwgb3duZXJFbGVtZW50LCBmZWF0dXJlLCByZWFsaXplcik7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5GZWF0dXJlVmFsdWUjYWRkKFZhcmlhYmlsaXR5RWxlbWVudCwgT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZChWYXJpYWJpbGl0eUVsZW1lbnQgb3duZXIsIE9iamVjdCB2YWx1ZSkgewotCQlpZiAoICh2YWx1ZSA9PSBudWxsKSB8fCAhKHZhbHVlIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgKSB7CQotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQkvLyBzaW5jZSB0aGlzIGlzIGEgdG8gb25lIGFzc29jaWF0aW9uLCBpZiB0aGUgYmFzZSBvZiB0aGUgb3duZXIgYWxyZWFkeSBoYXMgb25lLCAKLQkJLy8gbm8gY29udHJpYnV0aW5nIHZhbHVlIHNob3VsZCBiZSBhZGRlZAotCQkvLyAxNzI2MDIgLSBWYXJpYWJpbGl0eTogUHJpbWFyeSByb2xlIG1pc3NpbmcgaW4gdGhlIHRyYW5zaXRpdmUgY2FzZSBvZiBjb250cmlidXRpbmcgdGFza3MKLQkJaWYgKCBDb25maWd1cmF0aW9uSGVscGVyLmlzQ29udHJpYnV0b3Iob3duZXIpICkgewotCQkJVmFyaWFiaWxpdHlFbGVtZW50IGJhc2UgPSBvd25lci5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCk7Ci0JCQlpZiAoIGJhc2UgIT0gbnVsbCAmJiB2YWx1ZU1hcC5jb250YWluc0tleShiYXNlKSApIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJCi0JCS8vTWV0aG9kRWxlbWVudCBlID0gc3VwZXIucmVhbGl6ZXIucmVhbGl6ZSgoTWV0aG9kRWxlbWVudCl2YWx1ZSk7Ci0JCU1ldGhvZEVsZW1lbnQgZSA9IENvbmZpZ3VyYXRpb25IZWxwZXIuZ2V0Q2FsY3VsYXRlZEVsZW1lbnQoKE1ldGhvZEVsZW1lbnQpdmFsdWUsIHN1cGVyLnJlYWxpemVyKTsKLQkJCi0JCWlmICggZSAhPSBudWxsICkgewotCQkJT2JqZWN0IGtleSA9IChvd25lcj09bnVsbCkgPyBlbGVtZW50IDogb3duZXI7Ci0JCQlpZiAoICF2YWx1ZU1hcC5jb250YWluc0tleShrZXkpICkgewotCQkJCXZhbHVlTWFwLnB1dChrZXksIGUpOwotCQkJfQotCQl9CQkJCi0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLkZlYXR1cmVWYWx1ZSNnZXRWYWx1ZSgpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRWYWx1ZSgpIHsKLQkJCi0JCU9iamVjdCB2ID0gbnVsbDsKLQkJaWYgKCBzaXplKCkgPT0gMCApIHsKLQkJCXJldHVybiB2OwotCQl9Ci0JCQotCQlPYmplY3RbXSBlbnRyaWVzID0gdmFsdWVNYXAuZW50cnlTZXQoKS50b0FycmF5KCk7Ci0JCWlmICggc2l6ZSgpID09IDEgKSB7Ci0JCQkvLyBpZiBqdXN0IG9uZSBlbnRyeSwgcmV0dXJuIGl0Ci0JCQl2ID0gKChNYXAuRW50cnkpZW50cmllc1swXSkuZ2V0VmFsdWUoKTsKLQkJfSBlbHNlIHsKLQkJCS8vIGlmIG1vcmUgdGhhbiBvbmUgZW50cnksIGlmIHRoZSBmaXJzdCBlbnRyeSBpcyBmcm9tIHRoZSBlbGVtZW50IGl0c2VsZiwgdGhlbiByZXR1cm4gdGhlIHZhbHVlCi0JCQkvLyBvdGhlcndpc2UsIHJldHVybiBudWxsCi0JCQlNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KWVudHJpZXNbMF07Ci0JCQlpZiAoIGVudHJ5LmdldEtleSgpID09IHN1cGVyLmVsZW1lbnQgKSB7Ci0JCQkJdiA9ICBlbnRyeS5nZXRWYWx1ZSgpOwotCQkJfQotCQl9Ci0JCQotCQlpZiAoIGlzRXh0ZW5kUmVwbGFjZUVuYWJsZWQoKSApIHsKLQkJCWlmICggaXNCbGFua0luZGljYXRvcih2KSApIHsKLQkJCQkvLyByZW1vdmUgdGhlIF9OVUxMXyBpdGVtLiB0aGF0IGlzIHVzZWQgYXMgYW4gaW5kaWNhdG9yIHRvIGJsYW5rIG91dCB0aGUgYmFzZSAKLQkJCQkvLyBmb3IgdGhlIGV4dGVuZC1yZXBsYWNlCi0JCQkJdiA9IG51bGw7Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiB2OwotCX0KLQotCXB1YmxpYyBpbnQgc2l6ZSgpIHsKLQkJcmV0dXJuIHZhbHVlTWFwLnNpemUoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9jb25maWd1cmF0aW9uL1RvT25lT3Bwb3NpdGVGZWF0dXJlVmFsdWUuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9jb25maWd1cmF0aW9uL1RvT25lT3Bwb3NpdGVGZWF0dXJlVmFsdWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmY5NjUzMy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvY29uZmlndXJhdGlvbi9Ub09uZU9wcG9zaXRlRmVhdHVyZVZhbHVlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS51dGlsLk9wcG9zaXRlRmVhdHVyZTsKLQotLyoqCi0gKiByZWFsaXplZCBmZWF0dXJlIHZhbHVlIGZvciBhIHRvLW9uZSBvcHBvc2l0ZSBmZWF0dXJlCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKgotICovCi1wdWJsaWMgY2xhc3MgVG9PbmVPcHBvc2l0ZUZlYXR1cmVWYWx1ZSBleHRlbmRzIFRvT25lRmVhdHVyZVZhbHVlIHsKLQotCS8qKgotCSAqIGNvbnN0cnVjdG9yCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiBAcGFyYW0gZmVhdHVyZQotCSAqIEBwYXJhbSByZWFsaXplcgotCSAqLwotCXB1YmxpYyBUb09uZU9wcG9zaXRlRmVhdHVyZVZhbHVlKE1ldGhvZEVsZW1lbnQgZWxlbWVudCwgT3Bwb3NpdGVGZWF0dXJlIGZlYXR1cmUsIEVsZW1lbnRSZWFsaXplciByZWFsaXplcikgewotCQlzdXBlcihlbGVtZW50LCBudWxsLCBmZWF0dXJlLCByZWFsaXplcik7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5Ub09uZUZlYXR1cmVWYWx1ZSNhZGQoVmFyaWFiaWxpdHlFbGVtZW50LCBPYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgYWRkKFZhcmlhYmlsaXR5RWxlbWVudCBvd25lciwgT2JqZWN0IHZhbHVlKSB7Ci0JCWlmICggKHZhbHVlID09IG51bGwpIHx8ICEodmFsdWUgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSApIHsJCi0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCS8vIFJlcGxhY2UgZG9lcyBub3QgY29tcGxldGVseSByZW1vdmUgb3V0Z29pbmcKLQkJLy8gYXNzb2NpYXRpb25zCi0JCS8vIGlmIHRoZSBvcHBvc2l0ZSBmZWF0dXJlIHZhbHVlIGhhcyByZXBsYWNlciBpbiB0aGUKLQkJLy8gY29uZmlndXJhdGlvbgotCQkvLyBpdCdzIG91dGdvaW5nIGFzc29jaWF0aW9ucyAoaS5lLiwgdGhpcyBlbGVtZW50KSB3aWxsIGJlCi0JCS8vIHJlcGxhY2VkIGJ5IHRoZSByZXBsYWNpbmcgZWxlbWVudAotCQkvLyBhcyBhIHJlc3VsdCwgdGhlIG9wcG9zaXRlIGZlYXR1cmUgdmFsdWUgc2hvdWxkIGRyb3AgdGhlCi0JCS8vIHJlcGxhY2VkIGVsZW1lbnQKLQkJLy8KLQkJLy8gZm9yIGV4YW1wbGUsIFIxIC0+IHJlc3BvbnNpYmxlIGZvciBBMSwgUjIgcmVzcG9uc2libGUgZm9yIEEyCi0JCS8vIGlmIFIyIHJlcGxhY2VzIFIxLCB0aGVuIFIyIHN0aWxsIHJlc3BvbnNpYmxlIGZvciBBMgotCQkvLyBidXQgQTEgZG9lcyBub3QgaGF2ZSBhIHJlc3BvbnNpYmxlIHJvbGUgKG5vdCBSMikKLQkJLy8gc28gZm9yIEExJ3MgcmVzcG9uc2libGUgcm9sZSBvcHBvc2l0ZSBmZWF0dXJlLAotCQkvLyB0aGUgdmFsdWUgUjEgc2hvdWxkIGJlIGRyb3BwZWQgaW5zdGVhZCBvZiByZWFsaXplIHRvIFIyCi0JCS8vIEppbmh1YSBYaSwgMTAvMjcvMjAwNQotCQlNZXRob2RFbGVtZW50IGUgPSAoTWV0aG9kRWxlbWVudCkgdmFsdWU7Ci0JCWJvb2xlYW4gaXNWYWx1ZVJlcGxhY2VkID0gKGUgaW5zdGFuY2VvZiBWYXJpYWJpbGl0eUVsZW1lbnQpCi0JCQkJJiYgKENvbmZpZ3VyYXRpb25IZWxwZXIuZ2V0UmVwbGFjZXIoKFZhcmlhYmlsaXR5RWxlbWVudCkgZSwgcmVhbGl6ZXIuZ2V0Q29uZmlndXJhdGlvbigpKSAhPSBudWxsKTsKLQkJaWYgKCFpc1ZhbHVlUmVwbGFjZWQpIHsKLQkJCS8vIGNvbnRyaWJ1dG9yIGNhbid0IGNvbnRyaWJ1dGUgMC4uMSByZWZlcmVuY2UgaWYgYmFzZQotCQkJLy8gYWxyZWFkeSBoYXMgb25lLAotCQkJLy8gb3IgaWYgbW9yZSB0aGFuIG9uZSBjb250cmlidXRvciBoYXMgdGhlIHZhbHVlLgotCQkJLy8gZm9yIGV4YW1wbGUsIGlmIHRoZSBiYXNlIHRhc2sgaGFzIG5vIGRpc2NpcGxpbmUsIGFuZCBvbmx5Ci0JCQkvLyBvbmUgb2YgaXQncyBjb250cmlidXRvcnMgaGFzIGRpc2NpcGxpbmUsCi0JCQkvLyB0aGVuIHRoYXQgY29udHJpYnV0b3IncyBkaXNjaXBsaW5lIHdpbGwgYmUgdXNlZCwKLQkJCS8vIG90aGVyd2lzZSwgbm8gZGlzY2lwbGluZQotCi0JCQkvLyByaWdodCBub3csIHdlIGNhbid0IGRldGVybWluZSBpZiB0aGVyZSBpcyBtb3JlIHRoZW4gb25lCi0JCQkvLyBjb250cmlidXRvcnMgaGFzIHRoZSB2YWx1ZQotCQkJLy8gc28gd2UgaWdub3JlIGNvbnRyaWJ1dG9yJ3MgMDEgaW1jb21pbmcgdmFsdWUKLQkJCQotCQkJLy8gKFN1Ym1pdCk6IEluYWJpbGl0eSB0byBhZGQgcmVzcG9uc2libGUgZm9yIHJlbGF0aW9uc2hpcCB0byBhIHdvcmsgcHJvZHVjdAotCQkJLy8gbmVlZCB0byBmaXggdGhpcyBpc3N1ZS4gYWx3YXlzIHRha2UgdGhlIGZpcnN0IG9uZS4KLQkJCWUgPSBDb25maWd1cmF0aW9uSGVscGVyLmdldENhbGN1bGF0ZWRFbGVtZW50KGUsIHJlYWxpemVyKTsKLQkJCWlmICggZSAhPSBudWxsICkgewotCQkJCU9iamVjdCBrZXkgPSAob3duZXI9PW51bGwpID8gZWxlbWVudCA6IG93bmVyOwotCQkJCWlmICggIXZhbHVlTWFwLmNvbnRhaW5zS2V5KGtleSkgKSB7Ci0JCQkJCXZhbHVlTWFwLnB1dChrZXksIGUpOwotCQkJCX0KLQkJCX0JCQotCQl9Ci0JCQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5GZWF0dXJlVmFsdWUjZ2V0VmFsdWUoKQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0VmFsdWUoKSB7Ci0JCQotCQlPYmplY3QgdiA9IG51bGw7Ci0JCQotCQlpZiAoIHNpemUoKSA9PSAwICkgewotCQkJcmV0dXJuIHY7Ci0JCX0KLQkJCi0JCU9iamVjdFtdIGVudHJpZXMgPSB2YWx1ZU1hcC5lbnRyeVNldCgpLnRvQXJyYXkoKTsKLQkJaWYgKCBzaXplKCkgPT0gMSApIHsKLQkJCS8vIGlmIGp1c3Qgb25lIGVudHJ5LCByZXR1cm4gaXQKLQkJCXYgPSAoKE1hcC5FbnRyeSllbnRyaWVzWzBdKS5nZXRWYWx1ZSgpOwotCQl9IGVsc2UgewotCQkJLy8gaWYgbW9yZSB0aGFuIG9uZSBlbnRyeSwgaWYgdGhlIGZpcnN0IGVudHJ5IGlzIGZyb20gdGhlIGVsZW1lbnQgaXRzZWxmLCB0aGVuIHJldHVybiB0aGUgdmFsdWUKLQkJCS8vIG90aGVyd2lzZSwgcmV0dXJuIG51bGwKLQkJCU1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpZW50cmllc1swXTsKLQkJCWlmICggZW50cnkuZ2V0S2V5KCkgPT0gc3VwZXIuZWxlbWVudCApIHsKLQkJCQl2ID0gZW50cnkuZ2V0VmFsdWUoKTsKLQkJCX0KLQkJfQotCQkKLQkJaWYgKCBpc0V4dGVuZFJlcGxhY2VFbmFibGVkKCkgKSB7Ci0JCQlpZiAoIGlzQmxhbmtJbmRpY2F0b3IodikgKSB7Ci0JCQkJLy8gcmVtb3ZlIHRoZSBfTlVMTF8gaXRlbS4gdGhhdCBpcyB1c2VkIGFzIGFuIGluZGljYXRvciB0byBibGFuayBvdXQgdGhlIGJhc2UgCi0JCQkJLy8gZm9yIHRoZSBleHRlbmQtcmVwbGFjZQotCQkJCXYgPSBudWxsOwotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gdjsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvY29uZmlndXJhdGlvbi9jbG9zdXJlL0Nsb3N1cmVMaXN0ZW5lci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2NvbmZpZ3VyYXRpb24vY2xvc3VyZS9DbG9zdXJlTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzE4NmFkOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvY29uZmlndXJhdGlvbi9jbG9zdXJlL0Nsb3N1cmVMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5jbG9zdXJlOwotCi1pbXBvcnQgamF2YS51dGlsLkV2ZW50TGlzdGVuZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5zZXJ2aWNlcy5TYWZlVXBkYXRlQ29udHJvbGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci0KLS8qKgotICogIEJhc2UgY2xhc3MgZm9yIGxpc3RlbmVycyB0aGF0IGxpc3RlbiB0byBhIENvbmZpZ3VyYXRpb25DbG9zdXJlIGZvciBlcnJvcnMKLSAqIEBhdXRob3IgSmVmZiBIYXJkeQotICoKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIENsb3N1cmVMaXN0ZW5lciBpbXBsZW1lbnRzIEV2ZW50TGlzdGVuZXIgewotCi0JLy8gZXJyb3IgcmVtb3ZlZAotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVSUk9SX1JFTU9WRUQgPSAwOwotCQotCS8vIGVycm9yIGFkZGVkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVJST1JfQURERUQgPSAxOwotCi0JLy8gZXJyb3IgY2hhbmdlZAotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVSUk9SX1VQREFURUQgPSAyOwotCi0JcHVibGljIGFic3RyYWN0IHZvaWQgZXJyb3JSZW1vdmVkKE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnLCBJQ29uZmlndXJhdGlvbkVycm9yIGVycm9yKTsKLQotCXB1YmxpYyBhYnN0cmFjdCB2b2lkIGVycm9yQWRkZWQoTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcsIElDb25maWd1cmF0aW9uRXJyb3IgZXJyb3IpOwotCi0JcHVibGljIGFic3RyYWN0IHZvaWQgZXJyb3JVcGRhdGVkKE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnLCBJQ29uZmlndXJhdGlvbkVycm9yIGVycm9yKTsKLQkKLQlwdWJsaWMgdm9pZCBmaXJlRXZlbnQoaW50IHR5cGUsIGZpbmFsIE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnLCBmaW5hbCBJQ29uZmlndXJhdGlvbkVycm9yIGVycm9yKSB7Ci0JCXN3aXRjaCAodHlwZSkgewotCQkJY2FzZSBFUlJPUl9SRU1PVkVEOgotCQkJCVNhZmVVcGRhdGVDb250cm9sbGVyLnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJZXJyb3JSZW1vdmVkKGNvbmZpZywgZXJyb3IpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEVSUk9SX0FEREVEOgotCQkJCVNhZmVVcGRhdGVDb250cm9sbGVyLnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJZXJyb3JBZGRlZChjb25maWcsIGVycm9yKTsKLQkJCQkJfQotCQkJCX0pOwotCQkJCWJyZWFrOwotCQkJY2FzZSBFUlJPUl9VUERBVEVEOgotCQkJCVNhZmVVcGRhdGVDb250cm9sbGVyLnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJZXJyb3JVcGRhdGVkKGNvbmZpZywgZXJyb3IpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQkJYnJlYWs7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvY29uZmlndXJhdGlvbi9jbG9zdXJlL0NvbmZpZ3VyYXRpb25DbG9zdXJlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvY29uZmlndXJhdGlvbi9jbG9zdXJlL0NvbmZpZ3VyYXRpb25DbG9zdXJlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyZDc2ZjUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2NvbmZpZ3VyYXRpb24vY2xvc3VyZS9Db25maWd1cmF0aW9uQ2xvc3VyZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI5NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLmNsb3N1cmU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LklDb25maWd1cmF0aW9uQ2xvc3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5JQ29uZmlndXJhdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uQ29uZmlnRGF0YUJhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLlN1cHBvcnRpbmdFbGVtZW50RGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSUFjdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLk1ldGhvZEVsZW1lbnRQcm9wZXJ0eU1ncjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuTWV0aG9kRWxlbWVudFByb3BlcnR5TWdyLkNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuTGlicmFyeVByb2JsZW1Nb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuTGlicmFyeVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuSVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLklQcm9wZXJ0eVNvdXJjZTsKLQotLyoqCi0gKiBBIG1ldGhvZCBjb25maWd1cmF0aW9uIGNsb3N1cmUuCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIENvbmZpZ3VyYXRpb25DbG9zdXJlIGltcGxlbWVudHMgSUNvbmZpZ3VyYXRpb25DbG9zdXJlIHsKLQotCS8vIElmIHRydWUsIGdlbmVyYXRlIGRlYnVnIHRyYWNlcy4KLQlwcm90ZWN0ZWQgc3RhdGljIGJvb2xlYW4gZGVidWcgPSBMaWJyYXJ5UGx1Z2luLmdldERlZmF1bHQoKS5pc0RlYnVnZ2luZygpOwotCi0JcHJvdGVjdGVkIE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gbnVsbDsKLQotCXByb3RlY3RlZCBNZXRob2RMaWJyYXJ5IGxpYnJhcnkgPSBudWxsOwotCi0JcHJvdGVjdGVkIElDb25maWd1cmF0aW9uTWFuYWdlciBjb25maWdNYW5hZ2VyID0gbnVsbDsKLQotCXByb3RlY3RlZCBEZXBlbmRlbmN5TWFuYWdlciBkZXBlbmRlbmN5TWFuYWdlciA9IG51bGw7Ci0JCi0JcHJvdGVjdGVkIElBY3Rpb25NYW5hZ2VyIGFjdGlvbk1ncjsKLQotCS8vIE5vZGUgY2hhbmdlIGluZm9ybWF0aW9uLiBUaGUgb2JqZWN0IGFyZSB0aGUgbW9kZWwgb2JqZWN0cwotCS8vIGNoZWNrIHRoZSBsaW5rZWQgb2JqZWN0cyBpbiBuZWVkZWQKLQlwcm90ZWN0ZWQgTGlzdCBzZWxlY3RlZE5vdGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQotCXByaXZhdGUgTGlzdDxFbGVtZW50RXJyb3I+IGVycm9ycyA9IG5ldyBBcnJheUxpc3Q8RWxlbWVudEVycm9yPigpOwotCQotCXByaXZhdGUgYm9vbGVhbiBhYm9ydENoZWNrRXJyb3IgPSBmYWxzZTsKLQkKLQkvLyBtYXJrZXIgSUQgCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgbXVsdGlwbGVSZXBsYWNlcnNNQVJLRVJfSUQgPSAib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubXVsdGlwbGVSZXBsYWNlcnMiOyAvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgcmVwbGFjZXJHdWlkcyA9ICJyZXBsYWNlckd1aWRzIjsgLy8kTk9OLU5MUy0xJAotCQotCS8vIEEgbWFwIG9mIGludmFsaWQgbm9kZXMgdG8gRWxlbWVudERlcGVuZGVuY3lFcnJvciBvYmplY3RzLgotCXByb3RlY3RlZCBNYXA8T2JqZWN0LCBFbGVtZW50RGVwZW5kZW5jeUVycm9yPiBpbnZhbGlkTm9kZXNNYXAgPQotCQluZXcgSGFzaE1hcDxPYmplY3QsIEVsZW1lbnREZXBlbmRlbmN5RXJyb3I+KCk7Ci0KLQkvL3Byb3RlY3RlZCBMaXN0IGNoYW5nZWROb2RlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkKLQlwcml2YXRlIExpc3Q8Q2xvc3VyZUxpc3RlbmVyPiBsaXN0ZW5lcnM7Ci0KLQlwcml2YXRlIE1ldGhvZEVsZW1lbnRQcm9wZXJ0eU1nci5DaGFuZ2VFdmVudExpc3RlbmVyIGNvbmZpZ1Byb3BMaXN0ZW5lcjsKLQkKLQlwcml2YXRlIE1hcDxNZXRob2RFbGVtZW50LCBJTWFya2VyPiByZXBsYWNlckVsZW1lbnRNYXJrZXJNYXA7Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gYWN0aW9uTWdyCi0JICogCQkJICBUaGUgSUFjdGlvbk1hbmFnZXIgdG8gdXNlIHRvIGNoYW5nZSB0aGUgTWV0aG9kQ29uZmlndXJhdGlvbi4gIElmIG51bGwsIGNvbmZpZyB3aWxsIGJlIGNoYW5nZWQgZGlyZWN0bHkuCi0JICogQHBhcmFtIGNvbmZpZwotCSAqICAgICAgICAgICAgQSBtZXRob2QgY29uZmlndXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgQ29uZmlndXJhdGlvbkNsb3N1cmUoSUFjdGlvbk1hbmFnZXIgYWN0aW9uTWdyLCBNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZykgewotCQl0aGlzLmNvbmZpZyA9IGNvbmZpZzsKLQkJdGhpcy5hY3Rpb25NZ3IgPSBhY3Rpb25NZ3I7Ci0KLQkJY29uZmlnTWFuYWdlciA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0Q29uZmlndXJhdGlvbk1hbmFnZXIoCi0JCQkJY29uZmlnKTsKLQkJaWYgKGNvbmZpZ01hbmFnZXIgIT0gbnVsbCkgewotCQkJbGlicmFyeSA9IGNvbmZpZ01hbmFnZXIuZ2V0TWV0aG9kTGlicmFyeSgpOwotCQkJZGVwZW5kZW5jeU1hbmFnZXIgPSBjb25maWdNYW5hZ2VyLmdldERlcGVuZGVuY3lNYW5hZ2VyKCk7Ci0JCQkKLQkJCUNvbmZpZ3VyYXRpb25Qcm9wZXJ0aWVzIHByb3BzID0gY29uZmlnTWFuYWdlci5nZXRDb25maWd1cmF0aW9uUHJvcGVydGllcygpOwotCQkJY29uZmlnUHJvcExpc3RlbmVyID0gbmV3IE1ldGhvZEVsZW1lbnRQcm9wZXJ0eU1nci5DaGFuZ2VFdmVudExpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZShDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCQlyZWZyZXNoRXJyb3JtYXJrcygpOwotCQkJCX0KLQkJCX07CQkJCi0JCQlwcm9wcy5hZGRMaXN0ZW5lcihjb25maWdQcm9wTGlzdGVuZXIpOwotCQl9Ci0KLQkJLy8gY29uZmlndXJhdGlvbiBjaGFuZ2VkLCByZS1idWlsZCB0aGUgYW5hbHl6ZSB0aGUgY29uZmlndXJhdGlvbiBmb3IgZXJyb3JzCi0JCWNoZWNrRXJyb3IoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRob2QgY29uZmlndXJhdGlvbiBtYW5hZ2VyLgotCSAqIAotCSAqIEByZXR1cm4gQSA8Y29kZT5Db25maWd1cmF0aW9uTWFuYWdlcjwvY29kZT4uCi0JICovCi0JcHVibGljIElDb25maWd1cmF0aW9uTWFuYWdlciBnZXRDb25maWd1cmF0aW9uTWFuYWdlcigpIHsKLQkJcmV0dXJuIGNvbmZpZ01hbmFnZXI7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0aG9kIGNvbmZpZ3VyYXRpb24uCi0JICogCi0JICogQHJldHVybiBBIDxjb2RlPk1ldGhvZENvbmZpZ3VyYXRpb248L2NvZGU+LgotCSAqLwotCXB1YmxpYyBNZXRob2RDb25maWd1cmF0aW9uIGdldENvbmZpZ3VyYXRpb24oKSB7Ci0JCXJldHVybiBjb25maWc7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY29udGFpbmluaW5nIG1ldGhvZCBsaWJyYXJ5LgotCSAqIAotCSAqIEByZXR1cm4gQSA8Y29kZT5NZXRob2RDb25maWd1cmF0aW9uPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgTWV0aG9kTGlicmFyeSBnZXRMaWJyYXJ5KCkgewotCQlyZXR1cm4gbGlicmFyeTsKLQl9Ci0KLS8vCS8qKgotLy8JICogU2V0cyB0aGUgbWV0aG9kIHBsdWctaW5zIGFuZCBwYWNrYWdlcyBzZWxlY3Rpb24uCi0vLwkgKiAKLS8vCSAqIEBwYXJhbSBlbGVtZW50cwotLy8JICogICAgICAgICAgICBhbiBhcnJheSBvZiBtZXRob2QgcGx1Zy1pbnMgYW5kIHBhY2thZ2VzCi0vLwkgKi8KLS8vCXB1YmxpYyB2b2lkIHNldFNlbGVjdGlvbnMoT2JqZWN0W10gZWxlbWVudHMpIHsKLS8vCQkKLS8vCQlpZiAoIGVsZW1lbnRzID09IG51bGwgKSB7Ci0vLwkJCXJldHVybjsKLS8vCQl9Ci0vLwkJCi0vLwkJLy8gY2xlYXIgdGhlIG9sZCBzZWxlY3Rpb25zCi0vLwkJc2VsZWN0ZWROb3Rlcy5jbGVhcigpOwotLy8JCWZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKysgKSB7Ci0vLwkJCXNlbGVjdGVkTm90ZXMuYWRkKGVsZW1lbnRzW2ldKTsKLS8vCQl9Ci0vLwl9Ci0KLQkKLQkvKioKLQkgKiBCdWlsZHMgdGhlIHNlbGVjdGlvbiBsaXN0IGJhc2VkIG9uIHRoZSBtZXRob2QgY29uZmlndXJhdGlvbi4KLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBjaGVja0Vycm9yKCkgewotCQlpZiAoaXNSdW5uaW5nQ2hlY2tFcnJvcigpKSB7Ci0JCQlpZiAoQ29uZmlnRGF0YUJhc2UubG9jYWxEZWJ1ZykgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTEQ+IGNoZWNrRXJyb3Igc2tpcHBlZCIpOy8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCXJldHVybjsKLQkJfQotCQl0cnkgewotCQkJaWYgKENvbmZpZ0RhdGFCYXNlLmxvY2FsRGVidWcpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxEPiBjaGVja0Vycm9yXyAtPiIpOy8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWNoZWNrRXJyb3JfKCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlMaWJyYXJ5UGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChDb25maWdEYXRhQmFzZS5sb2NhbERlYnVnKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJMRD4gY2hlY2tFcnJvcl8gPC0iKTsvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlzZXRSdW5uaW5nQ2hlY2tFcnJvcihmYWxzZSk7Ci0JCX0JCi0JfQotCQotCXByaXZhdGUgYm9vbGVhbiBydW5uaW5nQ2hlY2tFcnJvciA9IGZhbHNlOwotCQotCS8vQmUgYXdhcmUgb2Ygc2lkZSBlZmZlY3Qgb2YgdGhlIGNhbGwKLQlwcml2YXRlIHN5bmNocm9uaXplZCBib29sZWFuIGlzUnVubmluZ0NoZWNrRXJyb3IoKSAgewotCQlib29sZWFuIHJldCA9IHJ1bm5pbmdDaGVja0Vycm9yOwotCQlpZiAoISByZXQpIHsJLy9tYWtlIHN1cmUgbm8gMiB0aHJlYWRzIGNhbiBiZSBydW5uaW5nQ2hlY2tFcnJvciBhdCB0aGUgc2FtZSB0aW1lCi0JCQlydW5uaW5nQ2hlY2tFcnJvciA9IHRydWU7Ci0JCX0KLQkJcmV0dXJuIHJldDsKLQl9Ci0JcHJpdmF0ZSBzeW5jaHJvbml6ZWQgdm9pZCBzZXRSdW5uaW5nQ2hlY2tFcnJvcihib29sZWFuIGIpICB7Ci0JCXJ1bm5pbmdDaGVja0Vycm9yID0gYjsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNoZWNrRXJyb3JfKCkgewotCQkKLQkJLy8gQnVnIDIwNjcyNCAtIFNDTTogQWx3YXlzIHByb21wdCBjaGVjayBvdXQgZWxlbWVudHMgZm9yIGEgb3BlbmVkIGNvbmZpZ3VyYXRpb24gd2hlbiByZWZyZXNoIHNvdXJjZSBjb250cm9sIHN0YXR1cwotCQkvLyBkb24ndCBuZWVkIHRvIHZhbGlkYXRlIHRoZSBjb25maWd1cmF0aW9uLCByZWx5IG9uIHRoZSBjYWxsZXIgdG8gdmFsaWRhdGUgaXQgYmVmb3JlIGNhbGwgdGhpcyBtZXRob2QuCi0JCS8vIFZhbGlkYXRlIHRoZSBtZXRob2QgY29uZmlndXJhdGlvbiB3aXRoIHRoZSBhY3Rpb24gbWFuYWdlci4KLQkJLy9MaWJyYXJ5VXRpbC52YWxpZGF0ZU1ldGhvZENvbmZpZ3VyYXRpb24oYWN0aW9uTWdyLCBjb25maWcpOwotCi0JCS8vIGluaXRpYWwgZmlsbCB0aGUgc2VsZWN0aW9ucwotCQlzZWxlY3RlZE5vdGVzLmNsZWFyKCk7Ci0JCXNlbGVjdGVkTm90ZXMuYWRkQWxsKGNvbmZpZy5nZXRNZXRob2RQbHVnaW5TZWxlY3Rpb24oKSk7Ci0JCXNlbGVjdGVkTm90ZXMuYWRkQWxsKGNvbmZpZy5nZXRNZXRob2RQYWNrYWdlU2VsZWN0aW9uKCkpOwotCi0JCS8vIFJlLWJ1aWxkIHRoZSBzZWxlY3Rpb25zIHRvIGF1dG8gYWRkIHRoZSBwcm9jZXNzIHBhY2thZ2VzLgotCQljbGVhckVycm9yTWFya3MoKTsKLQkJCi0JCS8vIENsZWFudXAgdGhlIG9sZCBzdGF0dXMgYW5kIHJlYnVpbGQgdGhlIGxpc3QuCi0JCWludmFsaWROb2Rlc01hcC5jbGVhcigpOwotCi0JCXByb2Nlc3NDaGFuZ2VkTm9kZXMoZ2V0U2VsZWN0aW9uKCkpOwotCi0JCXByb2Nlc3NSZXBsYWNlcnMoKTsKLQkJCi0JfQotCi0JcHJpdmF0ZSB2b2lkIHByb2Nlc3NSZXBsYWNlcnMoKSB7Ci0JCVNldDxWYXJpYWJpbGl0eUVsZW1lbnQ+IHJlcGxhY2VyU2V0ID0gZGVwZW5kZW5jeU1hbmFnZXIuZ2V0UmVwbGFjZXJTZXQoKTsKLQkJaWYgKHJlcGxhY2VyU2V0ID09IG51bGwgfHwgcmVwbGFjZXJTZXQuaXNFbXB0eSgpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCWNsZWFyUmVwbGFjZXJFbGVtZW50TWFya2VyTWFwKCk7CQkKLQkJcmVwbGFjZXJFbGVtZW50TWFya2VyTWFwID0gbmV3IEhhc2hNYXA8TWV0aG9kRWxlbWVudCwgSU1hcmtlcj4oKTsKLQkJTWFwPFZhcmlhYmlsaXR5RWxlbWVudCwgTGlzdD4gYmFzZVJlcGxhY2Vyc01hcCA9IG5ldyBIYXNoTWFwPFZhcmlhYmlsaXR5RWxlbWVudCwgTGlzdD4oKTsKLQkJZm9yIChWYXJpYWJpbGl0eUVsZW1lbnQgdmU6IHJlcGxhY2VyU2V0KSB7Ci0JCQlWYXJpYWJpbGl0eUVsZW1lbnQgYmFzZSA9IHZlLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsKLQkJCUxpc3Q8TWV0aG9kRWxlbWVudD4gcmVwbGFjZXJzID0gYmFzZVJlcGxhY2Vyc01hcC5nZXQoYmFzZSk7Ci0JCQlpZiAocmVwbGFjZXJzID09IG51bGwpIHsKLQkJCQlyZXBsYWNlcnMgPSBuZXcgQXJyYXlMaXN0PE1ldGhvZEVsZW1lbnQ+KCk7Ci0JCQkJYmFzZVJlcGxhY2Vyc01hcC5wdXQoYmFzZSwgcmVwbGFjZXJzKTsKLQkJCX0KLQkJCXJlcGxhY2Vycy5hZGQodmUpOwotCQkJcHJvY2Vzc1JlcGxhY2VyRXJyb3IocmVwbGFjZXJFbGVtZW50TWFya2VyTWFwLCBiYXNlLCByZXBsYWNlcnMpOwotCQl9Ci0JCQotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyB2b2lkIHByb2Nlc3NSZXBsYWNlckVycm9yKE1hcDxNZXRob2RFbGVtZW50LCBJTWFya2VyPiBlbGVtZW50TWFya2VyTWFwLCAKLQkJCU1ldGhvZEVsZW1lbnQgYmFzZSwgQ29sbGVjdGlvbjxNZXRob2RFbGVtZW50PiByZXBsYWNlcnMpIHsKLQkJaWYgKHJlcGxhY2VycyA9PSBudWxsIHx8IHJlcGxhY2Vycy5pc0VtcHR5KCkgfHwgcmVwbGFjZXJzLnNpemUoKSA8IDIpIHsKLQkJCXJldHVybjsKLQkJfQotCQlJTWFya2VyIG1hcmtlciA9IGVsZW1lbnRNYXJrZXJNYXAuZ2V0KGJhc2UpOwotCQlpZiAobWFya2VyID09IG51bGwpIHsKLQkJCVJlc291cmNlIHJlcyA9IGJhc2UuZVJlc291cmNlKCk7Ci0JCQlpZiAocmVzID09IG51bGwpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQotCQkJVVJJIGNvbnRhaW5lclVSSSA9IHJlcy5nZXRVUkkoKTsKLQkJCUlXb3Jrc3BhY2Ugd29ya3NwYWNlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpOwotCQkJSVBhdGggcGF0aCA9IG5ldyBQYXRoKGNvbnRhaW5lclVSSS50b0ZpbGVTdHJpbmcoKSk7Ci0JCQlJRmlsZSBmaWxlID0gd29ya3NwYWNlLmdldFJvb3QoKS5nZXRGaWxlRm9yTG9jYXRpb24ocGF0aCk7Ci0JCQlpZiAoZmlsZSA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJU3RyaW5nIGxvY2F0aW9uID0gY29udGFpbmVyVVJJICE9IG51bGwgPyBjb250YWluZXJVUkkKLQkJCQkJLnRvRmlsZVN0cmluZygpIDogIiI7IC8vJE5PTi1OTFMtMSQJCi0KLQkJCXRyeSB7Ci0JCQkJbWFya2VyID0gZmlsZS5jcmVhdGVNYXJrZXIobXVsdGlwbGVSZXBsYWNlcnNNQVJLRVJfSUQpOwotCQkJCW1hcmtlci5zZXRBdHRyaWJ1dGUoSU1hcmtlci5MT0NBVElPTiwgbG9jYXRpb24pOwkJCQkKLQkJCQltYXJrZXIuc2V0QXR0cmlidXRlKElNYXJrZXIuU0VWRVJJVFksIElNYXJrZXIuU0VWRVJJVFlfRVJST1IpOwotCQkJCW1hcmtlci5zZXRBdHRyaWJ1dGUoTGlicmFyeVByb2JsZW1Nb25pdG9yLkd1aWQsIGJhc2UuZ2V0R3VpZCgpKTsKLQkJCQkJCi0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCUxpYnJhcnlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJfQotCQl9Ci0JCQotCQkKLQkJU3RyaW5nIHJlcGxhY2VyR3VpZHNWYWx1ZSA9ICIiOwkJLy8kTk9OLU5MUy0xJAotCQlmb3IgKE1ldGhvZEVsZW1lbnQgcmVwbGFjZXI6IHJlcGxhY2VycykgewotCQkJaWYgKHJlcGxhY2VyR3VpZHNWYWx1ZS5sZW5ndGgoKSAhPSAwKSB7Ci0JCQkJcmVwbGFjZXJHdWlkc1ZhbHVlICs9ICIsICI7IC8vJE5PTi1OTFMtMSQJCi0JCQl9Ci0JCQlyZXBsYWNlckd1aWRzVmFsdWUgKz0gcmVwbGFjZXIuZ2V0R3VpZCgpOwotCQl9Ci0JCVN0cmluZyBlcnJNc2cgPSBMaWJyYXJ5UmVzb3VyY2VzLmJpbmQoTGlicmFyeVJlc291cmNlcy5FbGVtZW50RXJyb3JfaGF2aW5nX211bHRpcGxlX3JlcGxhY2VycywgCi0JCQkJKG5ldyBTdHJpbmdbXSB7TGlicmFyeVV0aWwuZ2V0VHlwZVBhdGgoYmFzZSksIAotCQkJCQkJcmVwbGFjZXJHdWlkc1ZhbHVlIH0pKTsKLQkJCi0JCXRyeSB7Ci0JCQltYXJrZXIuc2V0QXR0cmlidXRlKHJlcGxhY2VyR3VpZHMsIHJlcGxhY2VyR3VpZHNWYWx1ZSk7Ci0JCQltYXJrZXIuc2V0QXR0cmlidXRlKElNYXJrZXIuTUVTU0FHRSwgZXJyTXNnKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCUxpYnJhcnlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQl9Ci0JCQkJCi0JfQotCi0JcHJpdmF0ZSB2b2lkIGNsZWFyRXJyb3JNYXJrcygpIHsKLQkJLy8gUmUtYnVpbGQgdGhlIHNlbGVjdGlvbnMgdG8gYXV0byBhZGQgdGhlIHByb2Nlc3MgcGFja2FnZXMuCi0KLQkJZm9yIChJdGVyYXRvcjxFbGVtZW50RXJyb3I+IGl0ID0gZXJyb3JzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTsgKSB7Ci0JCQlFbGVtZW50RXJyb3IgZXJyb3IgPSBpdC5uZXh0KCk7Ci0JCQlub3RpZnlFcnJvcihlcnJvciwgQ2xvc3VyZUxpc3RlbmVyLkVSUk9SX1JFTU9WRUQpOwotCQl9CQotCX0KLQkKLQlwdWJsaWMgdm9pZCByZWZyZXNoRXJyb3JtYXJrcygpIHsKLQkJY2xlYXJFcnJvck1hcmtzKCk7Ci0JCWZvciAoSXRlcmF0b3I8RWxlbWVudEVycm9yPiBpdCA9IGVycm9ycy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7ICkgewotCQkJRWxlbWVudEVycm9yIGVycm9yID0gaXQubmV4dCgpOwotCQkJbm90aWZ5RXJyb3IoZXJyb3IsIENsb3N1cmVMaXN0ZW5lci5FUlJPUl9BRERFRCk7Ci0JCX0JCi0JfQotCQotLy8JcHJpdmF0ZSB2b2lkIHNlbGVjdFByb2Nlc3NQYWNrYWdlcyhBY3Rpdml0eSBhKSB7Ci0vLwkJaWYgKGEgPT0gbnVsbCkgewotLy8JCQlyZXR1cm47Ci0vLwkJfQotLy8KLS8vCQlmb3IgKEl0ZXJhdG9yIGl0ID0gYS5nZXRCcmVha2Rvd25FbGVtZW50cygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLS8vCQkJQnJlYWtkb3duRWxlbWVudCBlID0gKEJyZWFrZG93bkVsZW1lbnQpIGl0Lm5leHQoKTsKLS8vCQkJT2JqZWN0IHBrZyA9IGUuZUNvbnRhaW5lcigpOwotLy8JCQlpZiAoIXNlbGVjdGVkTm90ZXMuY29udGFpbnMocGtnKSkgewotLy8JCQkJc2VsZWN0ZWROb3Rlcy5hZGQocGtnKTsKLS8vCQkJCWNoYW5nZWROb2Rlcy5hZGQocGtnKTsKLS8vCQkJfQotLy8KLS8vCQkJaWYgKGUgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotLy8JCQkJc2VsZWN0UHJvY2Vzc1BhY2thZ2VzKChBY3Rpdml0eSkgZSk7Ci0vLwkJCX0KLS8vCQl9Ci0vLwl9Ci0KLS8vCS8qKgotLy8JICogQWRkcyBhIG1ldGhvZCBwbHVnLWluIG9yIHBhY2thZ2UgdG8gdGhlIGNsb3N1cmUuCi0vLwkgKiAKLS8vCSAqIEBwYXJhbSBlbGVtZW50Ci0vLwkgKiAgICAgICAgICAgIEEgbWV0aG9kIGVsZW1lbnQuCi0vLwkgKiBAcGFyYW0gYWRkQ2hpbGRyZW4KLS8vCSAqICAgICAgICAgICAgaWYgPGNvZGU+dHJ1ZTwvY29kZT4sIGFkZCBhbGwgY2hpbGQgbWV0aG9kIGVsZW1lbnRzLgotLy8JICovCi0vLwlwcml2YXRlIHZvaWQgYWRkKEVPYmplY3QgZWxlbWVudCwgYm9vbGVhbiBhZGRDaGlsZHJlbikgewotLy8JCWlmICghTGlicmFyeVV0aWwuc2VsZWN0YWJsZShlbGVtZW50KSkgewotLy8JCQlyZXR1cm47Ci0vLwkJfQotLy8KLS8vCQlpZiAoIXNlbGVjdGVkTm90ZXMuY29udGFpbnMoZWxlbWVudCkpIHsKLS8vCQkJc2VsZWN0ZWROb3Rlcy5hZGQoZWxlbWVudCk7Ci0vLwotLy8JCQkvLyBTYXZlIHRoZSBjaGFuZ2VkIG5vZGVzIHNvIHRoYXQgd2UgY2FuIHVwZGF0ZSB0aGUgc3RhdHVzIGxhdGVyLgotLy8JCQlhZGRDaGFuZ2VkKGVsZW1lbnQpOwotLy8KLS8vCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pIHsKLS8vCQkJCXNlbGVjdFN5c3RlbVBhY2thZ2VzKChNZXRob2RQbHVnaW4pIGVsZW1lbnQpOwotLy8JCQl9Ci0vLwkJfQotLy8KLS8vCQkvLyBBZGQgdGhlIHBhcmVudCBtZXRob2QgZWxlbWVudCBhcyB3ZWxsLgotLy8JCUVPYmplY3QgcGFyZW50ID0gZWxlbWVudC5lQ29udGFpbmVyKCk7Ci0vLwkJaWYgKChwYXJlbnQgIT0gbnVsbCkgJiYgIXNlbGVjdGVkTm90ZXMuY29udGFpbnMocGFyZW50KSkgewotLy8JCQlhZGQocGFyZW50LCBmYWxzZSk7Ci0vLwkJfQotLy8KLS8vCQkvLyBBZGQgY2hpbGRyZW4gYXMgbmVlZGVkLgotLy8JCWlmIChhZGRDaGlsZHJlbikgewotLy8JCQlFTGlzdCBlbGVtZW50cyA9IGVsZW1lbnQuZUNvbnRlbnRzKCk7Ci0vLwkJCWlmIChlbGVtZW50cyAhPSBudWxsKSB7Ci0vLwkJCQlmb3IgKEl0ZXJhdG9yIGl0ID0gZWxlbWVudHMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotLy8JCQkJCUVPYmplY3QgY2hpbGQgPSAoRU9iamVjdCkgaXQubmV4dCgpOwotLy8JCQkJCWFkZChjaGlsZCwgdHJ1ZSk7Ci0vLwkJCQl9Ci0vLwkJCX0KLS8vCQl9Ci0vLwl9Ci0vLwotLy8JcHJpdmF0ZSB2b2lkIGFkZENoYW5nZWQoT2JqZWN0IGVsZW1lbnQpIHsKLS8vCQlpZiAoIWNoYW5nZWROb2Rlcy5jb250YWlucyhlbGVtZW50KSkgewotLy8JCQljaGFuZ2VkTm9kZXMuYWRkKGVsZW1lbnQpOwotLy8JCX0KLS8vCX0KLQotLy8JcHJpdmF0ZSB2b2lkIHNlbGVjdFN5c3RlbVBhY2thZ2VzKE1ldGhvZFBsdWdpbiBwbHVnaW4pIHsKLS8vCQlMaXN0IHBrZ3MgPSBUbmdVdGlsLmdldEFsbFN5c3RlbVBhY2thZ2VzKHBsdWdpbik7Ci0vLwkJZm9yIChJdGVyYXRvciBpdCA9IHBrZ3MuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotLy8JCQlFT2JqZWN0IHBrZyA9IChFT2JqZWN0KSBpdC5uZXh0KCk7Ci0vLwkJCWFkZChwa2csIGZhbHNlKTsKLS8vCQl9Ci0vLwl9Ci0KLQkvKioKLQkgKiBDaGVja3Mgd2hldGhlciBhIG1ldGhvZCBwbHVnLWluIG9yIHBhY2thZ2UgaXMgc2VsZWN0ZWQuCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgZ2l2ZW4gZWxlbWVudCBpcyBzZWxlY3RlZC4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NlbGVjdGVkKE9iamVjdCBpbnB1dCkgewotCQlpZiAoKGlucHV0IGluc3RhbmNlb2YgTWV0aG9kTGlicmFyeSkgfHwgaW5wdXQgPT0gY29uZmlnCi0JCQkJfHwgc2VsZWN0ZWROb3Rlcy5jb250YWlucyhpbnB1dCkpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBlbGVtZW50IGRlcGVuZGVuY3kgZXJyb3IgZm9yIGEgbWV0aG9kIGVsZW1lbnQuCi0JICogCi0JICogQGVsZW1lbnQgQSBtZXRob2QgZWxlbWVudC4KLQkgKiAKLQkgKiBAcmV0dXJuIEFuIDxjb2RlPkVsZW1lbnREZXBlbmRlbmN5RXJyb3I8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBFbGVtZW50RGVwZW5kZW5jeUVycm9yIGdldEVycm9yKE9iamVjdCBlbGVtZW50KSB7Ci0JCXJldHVybiBnZXRFcnJvcihlbGVtZW50LCBmYWxzZSk7Ci0JfQotCi0JcHJpdmF0ZSBFbGVtZW50RGVwZW5kZW5jeUVycm9yIGdldEVycm9yKE9iamVjdCBlbGVtZW50LCBib29sZWFuIGNyZWF0ZSkgewotCQlFbGVtZW50RGVwZW5kZW5jeUVycm9yIGVycm9yID0gKEVsZW1lbnREZXBlbmRlbmN5RXJyb3IpIGludmFsaWROb2Rlc01hcAotCQkJCS5nZXQoZWxlbWVudCk7Ci0JCWlmIChlcnJvciA9PSBudWxsICYmIGNyZWF0ZSkgewotCQkJZXJyb3IgPSBuZXcgRWxlbWVudERlcGVuZGVuY3lFcnJvcihlbGVtZW50KTsKLQkJCWludmFsaWROb2Rlc01hcC5wdXQoZWxlbWVudCwgZXJyb3IpOwotCQl9Ci0JCXJldHVybiBlcnJvcjsKLQl9Ci0KLQkvKioKLQkgKiBjaGVjayBpZiB0aGVyZSBpcyBlcnJvciBpbiB0aGlzIGNvbmZpZ3VyYXRpb24gY2xvc3VyZQotCSAqIAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc0Vycm9yKCkgewotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gaW52YWxpZE5vZGVzTWFwLnZhbHVlcygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCUVsZW1lbnREZXBlbmRlbmN5RXJyb3IgZXJyb3IgPSAoRWxlbWVudERlcGVuZGVuY3lFcnJvcikgaXQubmV4dCgpOwotCQkJaWYgKGVycm9yLmlzRXJyb3IoKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBjaGVjayBpZiB0aGVyZSBpcyBhbnkgcHJvYmxlbSAoZXJyb3Ivd2FybmluZykgd2l0aCB0aGlzIGNvbmZpZ3VyYXRpb24gY2xvc3VyZS4KLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNQcm9ibGVtKCkgewotCQlyZXR1cm4gaW52YWxpZE5vZGVzTWFwLnNpemUoKSA+IDA7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhbGwgdGhlIGVycm9ycy4KLQkgKiAKLQkgKi8KLQlwdWJsaWMgTGlzdDxFbGVtZW50RXJyb3I+IGdldEFsbEVycm9ycygpIHsKLS8qCQlPbGQgY29kZQotIAkJTGlzdDxQYWNrYWdlRXJyb3I+IGVycm9ycyA9IG5ldyBBcnJheUxpc3Q8UGFja2FnZUVycm9yPigpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gaW52YWxpZE5vZGVzTWFwLnZhbHVlcygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCUVsZW1lbnREZXBlbmRlbmN5RXJyb3IgZXJyb3IgPSAoRWxlbWVudERlcGVuZGVuY3lFcnJvcikgaXQubmV4dCgpOwotCQkJZXJyb3JzLmFkZEFsbChlcnJvci5nZXRBbGwoKSk7Ci0JCX0KLSovCi0JCXJldHVybiBlcnJvcnM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhbGwgdGhlIGRlcGVuZGVuY3kgZXJyb3JzLgotCSAqIAotCSAqIEByZXR1cm4gQW4gYXJyYXkgb2YgPGNvZGU+RWxlbWVudERlcGVuZGVuY3lFcnJvcjwvY29kZT4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0W10gZ2V0RGVwZW5kZW5jeUVycm9ycygpIHsKLQkJcmV0dXJuIGludmFsaWROb2Rlc01hcC52YWx1ZXMoKS50b0FycmF5KCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhbGwgdGhlIGludmFsaWQgZWxlbWVudHMuCi0JICogCi0JICogQHJldHVybiBBIGxpc3Qgb2YgaW52YWxpZCBlbGVtZW50cy4KLQkgKi8KLQlwdWJsaWMgTGlzdDxPYmplY3Q+IGdldEludmFsaWRFbGVtZW50cygpIHsKLQkJcmV0dXJuIG5ldyBBcnJheUxpc3Q8T2JqZWN0PihpbnZhbGlkTm9kZXNNYXAua2V5U2V0KCkpOwotCX0KLQotCXByaXZhdGUgdm9pZCByZW1vdmVFcnJvcihPYmplY3QgZWxlbWVudCkgewotCQlpZiAoaW52YWxpZE5vZGVzTWFwLmNvbnRhaW5zS2V5KGVsZW1lbnQpKSB7Ci0JCQlpbnZhbGlkTm9kZXNNYXAucmVtb3ZlKGVsZW1lbnQpOwotCi0vLwkJCS8vIEVycm9yIHN0YXR1cyBjaGFuZ2VkLCBhZGQgaXQgdG8gdGhlIGNoYW5nZWQgbGlzdC4KLS8vCQkJaWYgKCFjaGFuZ2VkTm9kZXMuY29udGFpbnMoZWxlbWVudCkpIHsKLS8vCQkJCWNoYW5nZWROb2Rlcy5hZGQoZWxlbWVudCk7Ci0vLwkJCX0KLQkJfQotCX0KLQotLy8JLyoqCi0vLwkgKiBSZXR1cm5zIGFsbCB0aGUgY2hhbmdlZCBlbGVtZW50cy4gVGhlc2UgYXJlIGVsZW1lbnRzIHdob3NlIGNoZWNrIHN0YXRlcwotLy8JICogaGF2ZSBjaGFuZ2VkIG9yIHdob3NlIGltYWdlIGhhdmUgY2hhbmdlZCBkdWUgdG8gZXJyb3IuCi0vLwkgKiAKLS8vCSAqIEByZXR1cm4gQSBsaXN0IG9mIGNoYW5nZWQgbWV0aG9kIGVsZW1lbnRzLgotLy8JICovCi0vLwlwdWJsaWMgTGlzdCBnZXRDaGFuZ2VkRWxlbWVudHMoKSB7Ci0vLwkJTGlzdCBpdGVtcyA9IG5ldyBBcnJheUxpc3QoY2hhbmdlZE5vZGVzKTsKLS8vCQlmb3IgKEl0ZXJhdG9yIGl0ID0gaW52YWxpZE5vZGVzTWFwLmtleVNldCgpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLS8vCQkJT2JqZWN0IGl0ZW0gPSBpdC5uZXh0KCk7Ci0vLwkJCWlmICghaXRlbXMuY29udGFpbnMoaXRlbSkpIHsKLS8vCQkJCWl0ZW1zLmFkZChpdGVtKTsKLS8vCQkJfQotLy8JCX0KLS8vCQlyZXR1cm4gaXRlbXM7Ci0vLwl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRob2QgcGx1Zy1pbnMgYW5kIHBhY2thZ2VzIHNlbGVjdGlvbi4KLQkgKiAKLQkgKiBAcmV0dXJuIEFuIGFycmF5IG9mIG1ldGhvZCBwbHVnLWlucyBhbmQgcGFja2FnZXMuCi0JICovCi0JcHVibGljIE9iamVjdFtdIGdldFNlbGVjdGlvbigpIHsKLQkJcmV0dXJuIHNlbGVjdGVkTm90ZXMudG9BcnJheSgpOwotCX0KLQotCXByaXZhdGUgdm9pZCBwcm9jZXNzQ2hhbmdlZE5vZGVzKE9iamVjdFtdIGNoYW5nZWROb2RlcykgewotCQlnZXRDb25maWd1cmF0aW9uTWFuYWdlcigpLmdldFN1cHBvcnRpbmdFbGVtZW50RGF0YSgpLmJlZ2luVXBkYXRlU3VwcG9ydGluZ0VsZW1lbnRzKCk7Ci0JCXByb2Nlc3NDaGFuZ2VkTm9kZXNfKGNoYW5nZWROb2Rlcyk7Ci0vKgkJaWYgKGlzQWJvcnRDaGVja0Vycm9yKCkpIHsKLQkJCXJldHVybjsKLQkJfSovCi0JCU1hcDxTdHJpbmcsIEVsZW1lbnRSZWZlcmVuY2U+IHJlZk1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgRWxlbWVudFJlZmVyZW5jZT4oKTsJCQkKLQkJZ2V0Q29uZmlndXJhdGlvbk1hbmFnZXIoKS5nZXRTdXBwb3J0aW5nRWxlbWVudERhdGEoKS5lbmRVcGRhdGVTdXBwb3J0aW5nRWxlbWVudHMocmVmTWFwKTsKLQkJaWYgKGlzQWJvcnRDaGVja0Vycm9yKCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQlmb3IgKEVsZW1lbnRSZWZlcmVuY2UgcmVmIDogcmVmTWFwLnZhbHVlcygpKSB7Ci0JCQlFbGVtZW50RXJyb3IgZXJyb3IgPSBDb25maWd1cmF0aW9uRXJyb3JNYXRyaXguZ2V0RXJyb3IoY29uZmlnLCByZWYpOwotCQkJaWYgKGVycm9yICE9IG51bGwpIHsKLQkJCQllcnJvcnMuYWRkKGVycm9yKTsKLQkJCQlub3RpZnlFcnJvcihlcnJvciwgQ2xvc3VyZUxpc3RlbmVyLkVSUk9SX0FEREVEKTsKLQkJCQlwcm9jZXNzUGFja2FnZUVycm9yKExpYnJhcnlVdGlsLmdldFNlbGVjdGFibGUocmVmLmVsZW1lbnQpLAotCQkJCQkJTGlicmFyeVV0aWwuZ2V0U2VsZWN0YWJsZShyZWYucmVmRWxlbWVudCksIGVycm9yCi0JCQkJCQkJCS5nZXRFcnJvckxldmVsKCkpOwotCQkJfQotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCBwcm9jZXNzQ2hhbmdlZE5vZGVzXyhPYmplY3RbXSBjaGFuZ2VkTm9kZXMpIHsJCi0JCVN1cHBvcnRpbmdFbGVtZW50RGF0YSBzZURhdGEgPSBnZXRDb25maWd1cmF0aW9uTWFuYWdlcigpLmdldFN1cHBvcnRpbmdFbGVtZW50RGF0YSgpOwkKLQotCQkvLyBmb3IgYWxsIHRoZSBjaGFuZ2VkIG5vdGVzLAotCQkvLyBhbGwgYWxsIGNvbnRhaW5lZCBlbGVtZW50cyBhbmQgY2hlY2sgaWYgdGhlIGVsZW1lbnRzIGFyZSBpbiBjb25maWcgb3Igbm90Ci0JCS8vIGlmIHRoZSBlbGVtZW50cyBhcmUgaW4gY29uZmlnLCB0aGUgcmVmZXJlbmNlZCBlbGVtZW50cyBzaG91bGQgYWxzbyBiZSBpbiBjb25maWcKLQkJCi0JCWZvciAoaW50IGkgPSAwOyBpIDxjaGFuZ2VkTm9kZXMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChpc0Fib3J0Q2hlY2tFcnJvcigpKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJCi0JCQkvLyB0aGUgZWxlbWVudHMgYXJlIGVpdGhlciBwbHVnaW4gb3IgcGFja2FnZQotCQkJT2JqZWN0IGNoYW5nZWRFbGVtZW50ID0gY2hhbmdlZE5vZGVzW2ldOwotCQkJaWYgKHNlRGF0YS5pc1N1cHBvcnRpbmdTZWxlY3RhYmxlKChNZXRob2RFbGVtZW50KSBjaGFuZ2VkRWxlbWVudCkpIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCQotCQkJUGFja2FnZURlcGVuZGVuY3kgZGVwZW5kZW5jeSA9IGRlcGVuZGVuY3lNYW5hZ2VyCi0JCQkJCS5nZXREZXBlbmRlbmN5KChNZXRob2RFbGVtZW50KSBjaGFuZ2VkRWxlbWVudCk7Ci0JCQlpZiAoZGVwZW5kZW5jeSA9PSBudWxsKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0KLQkJCUxpc3QgcmVmcyA9IGRlcGVuZGVuY3kuZ2V0QWxsRWxlbWVudFJlZmVyZW5jZXMoKTsKLQkJCWlmICggcmVmcyA9PSBudWxsIHx8IHJlZnMuc2l6ZSgpID09IDAgKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQkKLQkJCWZvciAoSXRlcmF0b3IgaXRyID0gcmVmcy5pdGVyYXRvcigpOyBpdHIuaGFzTmV4dCgpOyApIHsKLQkJCQlFbGVtZW50UmVmZXJlbmNlIHJlZiA9IChFbGVtZW50UmVmZXJlbmNlKWl0ci5uZXh0KCk7Ci0JCQkJY2hlY2tSZWZlcmVuY2UocmVmKTsKLQkJCX0KLQkJfQotCQkKLQkJLy8gZm9yIGFsbCB0aGUgZWxlbWVudHMgaW4gdGhlIGFkZGVkIGNhdGVnb3J5LCBjaGVjayB0aGVpciByZWZlcmVuY2VzIGFzIHdlbGwKLQkJTGlzdDxNZXRob2RFbGVtZW50PiBsaXN0ID0gbmV3IEFycmF5TGlzdDxNZXRob2RFbGVtZW50PigpOwotCQlsaXN0LmFkZEFsbChjb25maWdNYW5hZ2VyLmdldENvbmZpZ3VyYXRpb25EYXRhKCkuZ2V0QWRkZWRFbGVtZW50cygpKTsKLQkJZm9yICggSXRlcmF0b3I8TWV0aG9kRWxlbWVudD4gaXQgPSBsaXN0Lml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTsgKSB7Ci0JCQlNZXRob2RFbGVtZW50IGUgPSBpdC5uZXh0KCk7Ci0JCQkKLQkJCVBhY2thZ2VEZXBlbmRlbmN5IGRlcGVuZGVuY3kgPSAKLQkJCQlkZXBlbmRlbmN5TWFuYWdlci5nZXREZXBlbmRlbmN5KChNZXRob2RFbGVtZW50KWUuZUNvbnRhaW5lcigpKTsKLQkJCWlmIChkZXBlbmRlbmN5ID09IG51bGwpIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCi0JCQlMaXN0IHJlZnMgPSBkZXBlbmRlbmN5LmdldEFsbEVsZW1lbnRSZWZlcmVuY2VzKCk7Ci0JCQlpZiAoIHJlZnMgPT0gbnVsbCB8fCByZWZzLnNpemUoKSA9PSAwICkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJCi0JCQlmb3IgKEl0ZXJhdG9yIGl0ciA9IHJlZnMuaXRlcmF0b3IoKTsgaXRyLmhhc05leHQoKTsgKSB7Ci0JCQkJRWxlbWVudFJlZmVyZW5jZSByZWYgPSAoRWxlbWVudFJlZmVyZW5jZSlpdHIubmV4dCgpOwotCQkJCWlmICggcmVmLmdldEVsZW1lbnQoKSA9PSBlICkgewotCQkJCQljaGVja1JlZmVyZW5jZShyZWYpOwotCQkJCX0KLQkJCX0KLQkKLQkJfQotCQkKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNoZWNrUmVmZXJlbmNlKEVsZW1lbnRSZWZlcmVuY2UgcmVmKSB7Ci0JCU1ldGhvZEVsZW1lbnQgZSA9IHJlZi5nZXRFbGVtZW50KCk7Ci0JCU1ldGhvZEVsZW1lbnQgZV9yZWYgPSByZWYuZ2V0UmVmRWxlbWVudCgpOwotCQlTdXBwb3J0aW5nRWxlbWVudERhdGEgc2VEYXRhID0gZ2V0Q29uZmlndXJhdGlvbk1hbmFnZXIoKS5nZXRTdXBwb3J0aW5nRWxlbWVudERhdGEoKTsKLQkJQ29uZmlndXJhdGlvbkRhdGEgY29uZmlnRGF0YSA9IGdldENvbmZpZ3VyYXRpb25NYW5hZ2VyKCkuZ2V0Q29uZmlndXJhdGlvbkRhdGEoKTsKLQotCQkKLQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oIkxEPiBlOiAiICsgZSk7Ci0JCS8vU3lzdGVtLm91dC5wcmludGxuKCJMRD4gZV9yZWY6ICIgKyBlX3JlZik7Ci0JCQkJCi0JCWlmICggZSBpbnN0YW5jZW9mIE1ldGhvZFBhY2thZ2UgfHwgZSBpbnN0YW5jZW9mIE1ldGhvZENvbmZpZ3VyYXRpb24gKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCS8vIEJ1ZyAyMDc2MDkgLSBSZXBsYWNlZCBlbGVtZW50cyBhcmUgbm90IGNvbnNpZGVyZWQgZm9yIGNvbmZpZ3VyYXRpb24gZXJyb3IgIm1pc3NpbmcgbWFuZGF0b3J5IGlucHV0IgotCQkvLyBpZiB0aGUgZWxlbWVudCBpcyByZXBsYWNlZCwgaWdub3JlIHRoZSByZWZlcmVuY2UKLQkJaWYgKCBlIGluc3RhbmNlb2YgVmFyaWFiaWxpdHlFbGVtZW50ICkgewotCQkJVmFyaWFiaWxpdHlFbGVtZW50IHJlcGxhY2VyID0gQ29uZmlndXJhdGlvbkhlbHBlci5nZXRSZXBsYWNlcigoVmFyaWFiaWxpdHlFbGVtZW50KWUsIGNvbmZpZyk7Ci0JCQlpZiAoIHJlcGxhY2VyICE9IG51bGwgKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCQotCQkvLyB0aGUgZWxlbWVudCBtaWdodCBiZSBzdWJ0cmFjdGVkLCBzbyBpZ25vcmUgaXQKLS8qCQlpZiAoICFDb25maWd1cmF0aW9uSGVscGVyLmluQ29uZmlnKGUsIGNvbmZpZywgdHJ1ZSwgZmFsc2UpKSB7Ci0JCQlyZXR1cm47Ci0JCX0qLwotCQlpZiAoIGNvbmZpZ0RhdGEuaXNTdWJzdHJhY3RlZChlKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCQkJCi0JCS8vIGlmIHRoZSByZWZlcmVuY2VkIGVsZW1lbnQgaXMgbm90IGluICBjb25maWcsIGxvZyBlcnJvcgotCQlpZiAoICFDb25maWd1cmF0aW9uSGVscGVyLmluQ29uZmlnKGVfcmVmLCBjb25maWcpCi0JCQkJJiYgIXNlRGF0YS5pc1N1cHBvcnRpbmdFbGVtZW50Q2FsbER1cmluZ1VwZGF0aW5nKHJlZikpIHsKLQkJCQotCQkJLyoKLQkJCVN0cmluZyBtZXNzYWdlID0gTGlicmFyeVJlc291cmNlcy5iaW5kKExpYnJhcnlSZXNvdXJjZXMuRWxlbWVudEVycm9yX21pc3NpbmdfZWxlbWVudCwgCi0JCQkJCShuZXcgU3RyaW5nW10ge0xpYnJhcnlVdGlsLmdldFR5cGVOYW1lKGUpLCAKLQkJCQkJCQlMaWJyYXJ5VXRpbC5nZXRUeXBlTmFtZShlX3JlZikgfSkpOwotCQkJCi0JCQlFbGVtZW50RXJyb3IgZXJyb3IgPSBuZXcgRWxlbWVudEVycm9yKAotCQkJCQl0aGlzLCBFcnJvckluZm8uV0FSTklORywKLQkJCQkJbWVzc2FnZSwgZSwgZV9yZWYsIEVycm9ySW5mby5SRUZFUkVOQ0VfVE8pOyAvLyROT04tTkxTLTEkCi0JCQkqLwotCQkJRWxlbWVudEVycm9yIGVycm9yID0gQ29uZmlndXJhdGlvbkVycm9yTWF0cml4LmdldEVycm9yKGNvbmZpZywgcmVmKTsKLQkJCWlmICggZXJyb3IgPT0gbnVsbCApIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQkKLQkJCWVycm9ycy5hZGQoZXJyb3IpOwotCQkJbm90aWZ5RXJyb3IoZXJyb3IsIENsb3N1cmVMaXN0ZW5lci5FUlJPUl9BRERFRCk7Ci0JCQkKLQkJCS8vIHByb2Nlc3MgcGFja2FnZSBlcnJvcgotCQkJcHJvY2Vzc1BhY2thZ2VFcnJvcihMaWJyYXJ5VXRpbC5nZXRTZWxlY3RhYmxlKGUpLCBMaWJyYXJ5VXRpbC5nZXRTZWxlY3RhYmxlKGVfcmVmKSwgZXJyb3IuZ2V0RXJyb3JMZXZlbCgpICk7Ci0JCX0JCi0JfQotCQotCXByaXZhdGUgdm9pZCBwcm9jZXNzUGFja2FnZUVycm9yKE9iamVjdCBwa2csIE9iamVjdCBwa2dfcmVmLCBpbnQgZXJyb3JMZXZlbCApIHsKLQkJaWYgKCBlcnJvckxldmVsID4gMCApIHsKLQkJCUVsZW1lbnREZXBlbmRlbmN5RXJyb3IgZXJyb3IgPSBnZXRFcnJvcihwa2csIHRydWUpOwotCQkJCi0JCQlQYWNrYWdlRXJyb3IgcGtnZXJyb3IgPSBlcnJvci5nZXRFcnJvcihwa2dfcmVmKTsKLQkJCWlmICggcGtnZXJyb3IgPT0gbnVsbCApIHsKLQkJCQlTdHJpbmcgbWVzc2FnZSA9IExpYnJhcnlSZXNvdXJjZXMuY29uZmlnQ2xvc3VyZVdhcm5pbmdfbXNnMTsKLQkKLQkJCQlwa2dlcnJvciA9ICBuZXcgUGFja2FnZUVycm9yKGVycm9yTGV2ZWwsIG1lc3NhZ2UsIAotCQkJCQkJcGtnLCBwa2dfcmVmLCBFcnJvckluZm8uUkVGRVJFTkNFX1RPKTsJCQkJCi0JCQkJZXJyb3IuYWRkRXJyb3IocGtnZXJyb3IpOwotCQkJCQotCQkJfSBlbHNlIHsKLQkJCQlwa2dlcnJvci5zZXRFcnJvckxldmVsKGVycm9yTGV2ZWwpOwotCQkJCQotCQkJCS8vIG5lZWQgdG8gcmVjYWxjIHRoZSBlcnJvciBiaXRzCi0JCQkJZXJyb3IuY2FsY3VsYXRlRXJyb3JCaXRzKCk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQkvLyByZW1vdmUgdGhlIGVycm9yCi0JCQlyZW1vdmVFcnJvcihwa2cpOwotCQl9Ci0JCQotCQl1cGRhdGVQYXJlbnRzRm9yRXJyb3JzKChFT2JqZWN0KXBrZyk7Ci0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIG5vdGlmeUVycm9yKEVsZW1lbnRFcnJvciBlcnJvciwgaW50IHR5cGUgKSB7Ci0JCQotCQlpZiAoIGVycm9yID09IG51bGwgfHwgbGlzdGVuZXJzID09IG51bGwgfHwgbGlzdGVuZXJzLnNpemUoKSA9PSAwICkgewotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQl0cnkgewotCQkJCQkJCQotCQkJZm9yIChJdGVyYXRvcjxDbG9zdXJlTGlzdGVuZXI+IGl0ZXIgPSBsaXN0ZW5lcnMuaXRlcmF0b3IoKTtpdGVyLmhhc05leHQoKTspIHsKLQkJCQlDbG9zdXJlTGlzdGVuZXIgbGlzdGVuZXIgPSBpdGVyLm5leHQoKTsKLQkJCQkKLQkJCQlsaXN0ZW5lci5maXJlRXZlbnQodHlwZSwgY29uZmlnLCBlcnJvcik7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJZXgucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQl9Ci0JCi0JCi0vLwkvKioKLS8vCSAqIFZhbGlkYXRlcyB0aGUgZWxlbWVudCBkZXBlbmRlbmN5IHdoZW4gdGhlIGVsZW1lbnQgaXMgc2VsZWN0ZWQuIFdoZW4gdGhlCi0vLwkgKiBlbGVtZW50IGlzIHNlbGVjdGVkLCB3ZSBuZWVkIHRvIGRvIHRoZSBmb2xsb3dpbmc6IDEuIENoZWNrIGVycm9yIGZvcgotLy8JICogcmVmZXJlbmNlcyAyLiBSZW1vdmUgZXJyb3IgZm9yIGRlcGVuZGVudHMgYXNzb2NpYXRlZCB3aXRoIGVsZW1lbnQgMy4KLS8vCSAqIFVwZGF0ZSBwYXJlbnRzOiBpZiB0aGUgc2VsZWN0aW9uIGlzIHZhbGlkLCByZW1vdmUgYWxsIGVycm9ycyBmcm9tIHBhcmVudHMKLS8vCSAqIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGVsZW1lbnQgaWYgdGhlIHNlbGVjdGlvbiBpcyBpbnZhbGlkLCBzZXQgZXJyb3IgdG8KLS8vCSAqIGFsbCBwYXJlbnRzLgotLy8JICogCi0vLwkgKiBAcGFyYW0gZGVwZW5kZW5jeQotLy8JICogICAgICAgICAgICBFbGVtZW50RGVwZW5kZW5jeQotLy8JICovCi0vLwlwcml2YXRlIHZvaWQgdmFsaWRhdGVTZWxlY3RlZChQYWNrYWdlRGVwZW5kZW5jeSBkZXBlbmRlbmN5KSB7Ci0vLwkJT2JqZWN0IGNoYW5nZWRFbGVtZW50ID0gZGVwZW5kZW5jeS5nZXRFbGVtZW50KCk7Ci0vLwotLy8JCS8vIFNpbmNlIHRoaXMgZWxlbWVudCBpcyBzZWxlY3RlZCwgcmVtb3ZlIGFsbCBwcmV2aW91cyBlcnJvcnMuCi0vLwkJcmVtb3ZlRXJyb3IoY2hhbmdlZEVsZW1lbnQpOwotLy8KLS8vCQlpZiAoY2hhbmdlZEVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RMaWJyYXJ5KSB7Ci0vLwkJCXJldHVybjsKLS8vCQl9Ci0vLwotLy8JCS8vIFNpbmNlIHRoaXMgZWxlbWVudCBpcyBzZWxlY3RlZCwgY2hlY2sgYWxsIGRlcGVuZGVuY3kgZXJyb3JzIGluIHRoZQotLy8JCS8vIGRlcGVuZGVudCBlbGVtZW50cy4KLS8vCQlMaXN0IGRlcGVuZGVudHMgPSBkZXBlbmRlbmN5LmdldERlcGVuZGVudHMoKTsKLS8vCQlpZiAoZGVwZW5kZW50cyAhPSBudWxsICYmIGRlcGVuZGVudHMuc2l6ZSgpID4gMCkgewotLy8JCQlPYmplY3QgZWxlbWVudDsKLS8vCQkJZm9yIChJdGVyYXRvciBpdHIgPSBkZXBlbmRlbnRzLml0ZXJhdG9yKCk7IGl0ci5oYXNOZXh0KCk7KSB7Ci0vLwkJCQllbGVtZW50ID0gaXRyLm5leHQoKTsKLS8vCi0vLwkJCQlFbGVtZW50RGVwZW5kZW5jeUVycm9yIGVycm9yID0gZ2V0RXJyb3IoZWxlbWVudCwgZmFsc2UpOwotLy8JCQkJaWYgKGVycm9yICE9IG51bGwpIHsKLS8vCQkJCQlQYWNrYWdlRXJyb3IgcGtnZXJyb3IgPSBlcnJvci5yZW1vdmVFcnJvcihjaGFuZ2VkRWxlbWVudCk7Ci0vLwkJCQkJaWYgKGVycm9yLnNpemUoKSA9PSAwKSB7Ci0vLwkJCQkJCXJlbW92ZUVycm9yKGVsZW1lbnQpOwotLy8KLS8vCQkJCQkJLy8gQ2xlYXIgdGhlIHBhcmVudCBlcnJvciBpbnRyb2R1Y2VkIGJ5IHRoaXMgZWxlbWVudC4KLS8vCQkJCQkJdXBkYXRlUGFyZW50c0ZvckVycm9ycygoRU9iamVjdCkgZWxlbWVudCk7Ci0vLwkJCQkJfQotLy8JCQkJCQotLy8JCQkJCS8vIG5vdGlmeSB0aGUgZXJyb3IgbGlzdGVuZXIgYWJvdXQgdGhlIGVycm9yIHJlbW92ZWQKLS8vCQkJCQlub3RpZnlFcnJvclJlbW92ZWQocGtnZXJyb3IpOwotLy8KLS8vCQkJCX0KLS8vCQkJfQotLy8JCX0KLS8vCi0vLwkJLy8gSWYgYW4gZWxlbWVudCBpcyBjaGVja2VkLCBjaGVjayB0aGUgZWxlbWVudCBpdCBkZXBlbmRzIG9uLAotLy8JCS8vIHdoaWNoIHNob3VsZCBiZSBjaGVja2VkIGFzIHdlbGwuCi0vLwkJTGlzdCByZWZzID0gZGVwZW5kZW5jeS5nZXRSZWZlcmVuY2VzKCk7Ci0vLwkJaWYgKHJlZnMgIT0gbnVsbCAmJiByZWZzLnNpemUoKSA+IDApIHsKLS8vCQkJUGFja2FnZVJlZmVyZW5jZSByZWY7Ci0vLwkJCU9iamVjdCBlbGVtZW50OwotLy8JCQlmb3IgKEl0ZXJhdG9yIGl0ciA9IHJlZnMuaXRlcmF0b3IoKTsgaXRyLmhhc05leHQoKTspIHsKLS8vCQkJCXJlZiA9IChQYWNrYWdlUmVmZXJlbmNlKSBpdHIubmV4dCgpOwotLy8JCQkJZWxlbWVudCA9IHJlZi5nZXRSZWZFbGVtZW50KCk7Ci0vLwotLy8JCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RMaWJyYXJ5KSB7Ci0vLwkJCQkJY29udGludWU7Ci0vLwkJCQl9Ci0vLwotLy8JCQkJLy8gRG9uJ3Qgd2FybiBvbiBvcHRpb25hbCBpbnB1dHMgbm90IGJlaW5nCi0vLwkJCQkvLyBwcmVzZW50LCBzbyBhZGRlZCB0aGUgY2FuSWdub3JlKCkgbWV0aG9kCi0vLwkJCQlpZiAoIWlzU2VsZWN0ZWQoZWxlbWVudCkgJiYgIWNhbklnbm9yZShyZWYpKSB7Ci0vLwkJCQkJU3RyaW5nIG1lc3NhZ2U7Ci0vLwkJCQkJaW50IGVycm9yVHlwZSA9IDA7Ci0vLwkJCQkJaWYgKHJlZi5oYXNCYXNlUmVmZXJlbmNlKCkpIHsKLS8vCQkJCQkJZXJyb3JUeXBlID0gRXJyb3JJbmZvLkVSUk9SOwotLy8JCQkJCQltZXNzYWdlID0gTGlicmFyeVJlc291cmNlcy5jb25maWdDbG9zdXJlV2FybmluZ19tc2cyOwotLy8JCQkJCX0gZWxzZSB7Ci0vLwkJCQkJCWVycm9yVHlwZSA9IEVycm9ySW5mby5XQVJOSU5HOwotLy8JCQkJCQltZXNzYWdlID0gTGlicmFyeVJlc291cmNlcy5jb25maWdDbG9zdXJlV2FybmluZ19tc2czOwotLy8JCQkJCX0KLS8vCi0vLwkJCQkJRWxlbWVudERlcGVuZGVuY3lFcnJvciBlcnJvciA9IGdldEVycm9yKGNoYW5nZWRFbGVtZW50LAotLy8JCQkJCQkJdHJ1ZSk7Ci0vLwkJCQkJCi0vLwkJCQkJUGFja2FnZUVycm9yIHBrZ2Vycm9yID0gIG5ldyBQYWNrYWdlRXJyb3IodGhpcywgZXJyb3JUeXBlLCBtZXNzYWdlLAotLy8JCQkJCQkJY2hhbmdlZEVsZW1lbnQsIGVsZW1lbnQsIEVycm9ySW5mby5SRUZFUkVOQ0VfVE8pOwkJCQkKLS8vCQkJCQllcnJvci5hZGRFcnJvcihwa2dlcnJvcik7Ci0vLwotLy8JCQkJCS8vIG5vdGlmeSB0aGUgZXJyb3IgbGlzdGVuZXIgYWJvdXQgdGhlIGVycm9yIGFkZGVkCi0vLwkJCQkJbm90aWZ5RXJyb3JBZGRlZChwa2dlcnJvcik7Ci0vLwotLy8JCQkJfSBlbHNlIHsKLS8vCQkJCQlFbGVtZW50RGVwZW5kZW5jeUVycm9yIGVycm9yID0gZ2V0RXJyb3IoY2hhbmdlZEVsZW1lbnQsCi0vLwkJCQkJCQlmYWxzZSk7Ci0vLwkJCQkJaWYgKGVycm9yICE9IG51bGwpIHsKLS8vCQkJCQkJUGFja2FnZUVycm9yIHBrZ2Vycm9yID0gZXJyb3IucmVtb3ZlRXJyb3IoZWxlbWVudCk7Ci0vLwkJCQkJCQotLy8JCQkJCQkvLyBub3RpZnkgdGhlIGVycm9yIGxpc3RlbmVyIGFib3V0IHRoZSBlcnJvciByZW1vdmVkCi0vLwkJCQkJCW5vdGlmeUVycm9yUmVtb3ZlZChwa2dlcnJvcik7Ci0vLwotLy8JCQkJCX0KLS8vCQkJCX0KLS8vCQkJfQotLy8JCX0KLS8vCi0vLwkJLy8gRmluYWxseSwgdXBkYXRlIHRoZSBwYXJlbnRzLgotLy8JCXVwZGF0ZVBhcmVudHNGb3JFcnJvcnMoKEVPYmplY3QpIGNoYW5nZWRFbGVtZW50KTsKLS8vCX0KLS8vCi0vLwkvKioKLS8vCSAqIFZhbGlkYXRlcyB0aGUgRWxlbWVudERlcGVuZGVuY3kgd2hlbiB0aGUgZWxlbWVudCBpcyB1bnNlbGVjdGVkLiBXaGVuIHRoZQotLy8JICogZWxlbWVudCBpcyB1bnNlbGVjdGVkLCB3ZSBuZWVkIHRvIGRvIHRoZSBmb2xsb3dpbmc6IDEuIGNoZWNrIGVycm9yIGZvcgotLy8JICogZGVwZW5kZW5jdHMgMi4gcmVtb3ZlIGVycm9yIGZvciByZWZlcmVuY2VzIGFzc29jaWF0ZWQgd2l0aCBlbGVtZW50LCBpbgotLy8JICogY2FzZSBvZiBhbnkgYWRkZWQgd2hlbiB0aGUgZWxlbWVudCB3YXMgY2hlY2sgMy4gdXBkYXRlIHBhcmVudHM6IGlmIHRoZQotLy8JICogc2VsZWN0aW9uIGlzIHZhbGlkLCByZW1vdmUgYWxsIGVycm9ycyBmcm9tIHBhcmVudHMgYXNzb2NpYXRlZCB3aXRoIHRoaXMKLS8vCSAqIGVsZW1lbnQgaWYgdGhlIHNlbGVjdGlvbiBpcyBpbnZhbGlkLCBzZXQgZXJyb3IgdG8gYWxsIHBhcmVudHMuCi0vLwkgKiAKLS8vCSAqIEBwYXJhbSBkZXBlbmRlbmN5Ci0vLwkgKiAgICAgICAgICAgIEEgPGNvZGU+RWxlbWVudERlcGVuZGVuY3k8L2NvZGU+IG9iamVjdC4KLS8vCSAqLwotLy8JcHJpdmF0ZSB2b2lkIHZhbGlkYXRlVW5TZWxlY3RlZChQYWNrYWdlRGVwZW5kZW5jeSBkZXBlbmRlbmN5KSB7Ci0vLwkJT2JqZWN0IGNoYW5nZWRFbGVtZW50ID0gZGVwZW5kZW5jeS5nZXRFbGVtZW50KCk7Ci0vLwotLy8JCS8vIFNpbmNlIHRoaXMgZWxlbWVudCBpcyB1bi1zZWxlY3RlZCwgcmVtb3ZlIGFsbCBwcmV2aW91cyBlcnJvcnMuCi0vLwkJcmVtb3ZlRXJyb3IoY2hhbmdlZEVsZW1lbnQpOwotLy8KLS8vCQlpZiAoY2hhbmdlZEVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RMaWJyYXJ5KSB7Ci0vLwkJCXJldHVybjsKLS8vCQl9Ci0vLwotLy8JCS8vIFNpbmNlIHRoaXMgZWxlbWVudCBpcyB1bi1zZWxlY3RlZCwgcmVtb3ZlIGFsbCBlcnJvcnMgaW4gdGhlCi0vLwkJLy8gcmVmZXJlbmNlZCBlbGVtZW50cy4KLS8vCQlMaXN0IHJlZnMgPSBkZXBlbmRlbmN5LmdldFJlZmVyZW5jZXMoKTsKLS8vCQlpZiAocmVmcyAhPSBudWxsICYmIHJlZnMuc2l6ZSgpID4gMCkgewotLy8JCQlFbGVtZW50UmVmZXJlbmNlIHJlZjsKLS8vCQkJT2JqZWN0IGVsZW1lbnQ7Ci0vLwkJCWZvciAoSXRlcmF0b3IgaXRyID0gcmVmcy5pdGVyYXRvcigpOyBpdHIuaGFzTmV4dCgpOykgewotLy8JCQkJcmVmID0gKEVsZW1lbnRSZWZlcmVuY2UpIGl0ci5uZXh0KCk7Ci0vLwkJCQllbGVtZW50ID0gcmVmLmdldFJlZkVsZW1lbnQoKTsKLS8vCi0vLwkJCQlFbGVtZW50RGVwZW5kZW5jeUVycm9yIGVycm9yID0gZ2V0RXJyb3IoZWxlbWVudCwgZmFsc2UpOwotLy8JCQkJaWYgKGVycm9yICE9IG51bGwpIHsKLS8vCQkJCQlQYWNrYWdlRXJyb3IgcGtnZXJyb3IgPSBlcnJvci5yZW1vdmVFcnJvcihjaGFuZ2VkRWxlbWVudCk7Ci0vLwkJCQkJaWYgKGVycm9yLnNpemUoKSA9PSAwKSB7Ci0vLwkJCQkJCXJlbW92ZUVycm9yKGVsZW1lbnQpOwotLy8KLS8vCQkJCQkJLy8gQ2xlYXIgdGhlIHBhcmVudCBlcnJvciBpbnRyb2R1Y2VkIGJ5IHRoaXMgZWxlbWVudC4KLS8vCQkJCQkJdXBkYXRlUGFyZW50c0ZvckVycm9ycygoRU9iamVjdCkgZWxlbWVudCk7Ci0vLwotLy8JCQkJCX0KLS8vCQkJCQkKLS8vCQkJCQkvLyBub3RpZnkgdGhlIGVycm9yIGxpc3RlbmVyIGFib3V0IHRoZSBlcnJvciByZW1vdmVkCi0vLwkJCQkJbm90aWZ5RXJyb3JSZW1vdmVkKHBrZ2Vycm9yKTsKLS8vCi0vLwkJCQl9Ci0vLwkJCX0KLS8vCQl9Ci0vLwotLy8JCS8vIElmIGFuIGVsZW1lbnQgaXMgdW5jaGVja2VkLCBjaGVjayB0aGUgZGVwZW5kZW50IGVsZW1lbnRzLgotLy8JCS8vIElmIHRoZXJlIGFyZSBjaGVjayBlbGVtZW50cyBkZXBlbmRpbmcgb24gaXQsIHRoZSBlbGVtZW50IGNhbid0IGJlCi0vLwkJLy8gdW5jaGVja2VkLgotLy8JCUxpc3QgZGVwZW5kZW50cyA9IGRlcGVuZGVuY3kuZ2V0RGVwZW5kZW50cygpOwotLy8JCWlmIChkZXBlbmRlbnRzICE9IG51bGwgJiYgZGVwZW5kZW50cy5zaXplKCkgPiAwKSB7Ci0vLwkJCU9iamVjdCBlbGVtZW50OwotLy8JCQlmb3IgKEl0ZXJhdG9yIGl0ciA9IGRlcGVuZGVudHMuaXRlcmF0b3IoKTsgaXRyLmhhc05leHQoKTspIHsKLS8vCQkJCWVsZW1lbnQgPSBpdHIubmV4dCgpOwotLy8KLS8vCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kTGlicmFyeSkgewotLy8JCQkJCWNvbnRpbnVlOwotLy8JCQkJfQotLy8KLS8vCQkJCWlmIChpc1NlbGVjdGVkKGVsZW1lbnQpKSB7Ci0vLwkJCQkJLy8gRGV0ZXJtaW5lIHRoZSB0eXBlIG9mIGRlcGVuZGVuY3kuCi0vLwkJCQkJUGFja2FnZURlcGVuZGVuY3kgY2hpbGREZXAgPSBkZXBlbmRlbmN5TWFuYWdlcgotLy8JCQkJCQkJLmdldERlcGVuZGVuY3koKE1ldGhvZEVsZW1lbnQpIGVsZW1lbnQpOwotLy8KLS8vCQkJCQl2YWxpZGF0ZVNlbGVjdGVkKGNoaWxkRGVwKTsKLS8vCQkJCX0gZWxzZSB7Ci0vLwkJCQkJcmVtb3ZlRXJyb3IoY2hhbmdlZEVsZW1lbnQpOwotLy8JCQkJfQotLy8JCQl9Ci0vLwkJfQotLy8KLS8vCQkvLyBmaW5hbGx5LCB1cGRhdGUgdGhlIHBhcmVudHMKLS8vCQl1cGRhdGVQYXJlbnRzRm9yRXJyb3JzKChFT2JqZWN0KSBjaGFuZ2VkRWxlbWVudCk7Ci0vLwl9Ci0vLwotCXByaXZhdGUgdm9pZCB1cGRhdGVQYXJlbnRFcnJvcihFT2JqZWN0IHBhcmVudCwgRU9iamVjdCBlbGVtZW50LAotCQkJaW50IGVycm9yVHlwZSkgewotCQlpZiAocGFyZW50ID09IG51bGwgfHwgKHBhcmVudCBpbnN0YW5jZW9mIE1ldGhvZExpYnJhcnkpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotLy8JCWlmICgocGFyZW50IGluc3RhbmNlb2YgTWV0aG9kUGFja2FnZSkKLS8vCQkJCSYmIENvbmZpZ3VyYXRpb25IZWxwZXIuaXNHbG9iYWxQYWNrYWdlKChNZXRob2RQYWNrYWdlKSBwYXJlbnQpKSB7Ci0vLwkJCXVwZGF0ZVBhcmVudEVycm9yKHBhcmVudC5lQ29udGFpbmVyKCksIGVsZW1lbnQsIGVycm9yVHlwZSk7Ci0vLwkJCXJldHVybjsKLS8vCQl9Ci0KLQkJLy8gUmVtb3ZlIHRoZSBlcnJvciBhc3NvY2lhdGVkIHdpdGggdGhpcyBlbGVtZW50IGZyb20gYWxsIHBhcmVudHMuCi0JCUVsZW1lbnREZXBlbmRlbmN5RXJyb3IgZXJyb3IgPSBnZXRFcnJvcihwYXJlbnQsIGZhbHNlKTsKLQkJaWYgKGVycm9yICE9IG51bGwgJiYgZXJyb3Iuc2l6ZSgpID4gMCkgewotCQkJZXJyb3IucmVtb3ZlRXJyb3IoZWxlbWVudCk7Ci0JCX0KLQotCQlpZiAoZXJyb3JUeXBlICE9IEVycm9ySW5mby5OT05FKSB7Ci0JCQkvLyBQcm9wZWdhdGUgdGhlIGVycm9yIHRvIGFsbCBwYXJlbnRzLgotCQkJZXJyb3IgPSBnZXRFcnJvcihwYXJlbnQsIHRydWUpOwotCQkJU3RyaW5nIG1lc3NhZ2UgPSBMaWJyYXJ5UmVzb3VyY2VzLmNvbmZpZ0Nsb3N1cmVXYXJuaW5nX21zZzE7Ci0JCQlQYWNrYWdlRXJyb3IgcGtnZXJyID0gbmV3IFBhY2thZ2VFcnJvcihlcnJvclR5cGUsIG1lc3NhZ2UsIHBhcmVudCwgZWxlbWVudCwKLQkJCQkJRXJyb3JJbmZvLk5PTkUpOwotCQkJZXJyb3IuYWRkRXJyb3IocGtnZXJyKTsKLQkJfSBlbHNlIGlmICgoZXJyb3IgIT0gbnVsbCkgJiYgKGVycm9yLnNpemUoKSA9PSAwKSkgewotCQkJcmVtb3ZlRXJyb3IocGFyZW50KTsKLQkJfQotCi0JCXVwZGF0ZVBhcmVudEVycm9yKHBhcmVudC5lQ29udGFpbmVyKCksIGVsZW1lbnQsIGVycm9yVHlwZSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZVBhcmVudHNGb3JFcnJvcnMoRU9iamVjdCBlbGVtZW50KSB7Ci0JCWludCBlcnJvclR5cGUgPSBFcnJvckluZm8uTk9ORTsKLQotCQlFbGVtZW50RGVwZW5kZW5jeUVycm9yIGVycm9yID0gZ2V0RXJyb3IoZWxlbWVudCk7Ci0JCWlmIChlcnJvciAhPSBudWxsICYmIGVycm9yLnNpemUoKSA+IDApIHsKLQkJCWlmIChlcnJvci5pc0Vycm9yKCkgfHwgZXJyb3IuaXNDaGlsZEVycm9yKCkpIHsKLQkJCQllcnJvclR5cGUgPSBQYWNrYWdlRXJyb3IuQ0hJTERfRVJST1I7Ci0JCQl9IGVsc2UgaWYgKGVycm9yLmlzV2FybmluZygpIHx8IGVycm9yLmlzQ2hpbGRXYXJuaW5nKCkpIHsKLQkJCQllcnJvclR5cGUgPSBQYWNrYWdlRXJyb3IuQ0hJTERfV0FSTklORzsKLQkJCX0KLQkJfQotCi0JCXVwZGF0ZVBhcmVudEVycm9yKGVsZW1lbnQuZUNvbnRhaW5lcigpLCBlbGVtZW50LCBlcnJvclR5cGUpOwotCX0KLQotCS8qKgotCSAqIGFjY2VwdCB0aGUgY3V0cnJlbnQgc2VsZWN0aW9uLCBmaXggdGhlIGVycm9ycyBhbmQgaWdub3JlIGFueSB3YXJuaW5nIG1lc3NhZ2UuCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgZml4RXJyb3JzKCkgewotCQlib29sZWFuIGNoYW5nZWQgPSB0cnVlOwotCQlib29sZWFuIGZvcmNlQ2hlY2sgPSB0cnVlOwotCQl3aGlsZSAoY2hhbmdlZCkgewotCQkJY2hhbmdlZCA9IGZpeFByb2JsZW1zKHRydWUsIGZvcmNlQ2hlY2spOwotCQkJZm9yY2VDaGVjayA9IGZhbHNlOwotCQl9Ci0JfQotCi0JLyoqCi0JICogZml4IGFsbCBlcnJvcihzKSBhbmQgd2FybmlnbihzKQotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIGZpeFByb2JsZW1zKCkgewotCQlib29sZWFuIGNoYW5nZWQgPSB0cnVlOwotCQlib29sZWFuIGZvcmNlQ2hlY2sgPSB0cnVlOwotCQl3aGlsZSAoY2hhbmdlZCkgewotCQkJY2hhbmdlZCA9IGZpeFByb2JsZW1zKGZhbHNlLCBmb3JjZUNoZWNrKTsKLQkJCWZvcmNlQ2hlY2sgPSBmYWxzZTsKLQkJfQotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBmaXhQcm9ibGVtcyhib29sZWFuIGVycm9yT25seSwgYm9vbGVhbiBmb3JjZUNoZWNrKSB7Ci0JCS8vIE5vdGU6IG1ha2UgY2xvc3VyZSB3aWxsIHNlbGVjdCBlbGVtZW50cyBhcyBuZWVkZWQuCi0JCS8vIHNvIHdlIG5lZWQgdG8gbWFrZSBhIGNvcHkgb2YgdGhlIGN1cnJlbnQgc2VsY3RlZCBvbmVzCi0JCS8vIGluIG9yZGVyIHRvIHRyYWNlIHRoZSBzdGF0dXMKLQkJLy9MaXN0IGN1cnJlbnRTZWxlY3RlZCA9IG5ldyBBcnJheUxpc3Qoc2VsZWN0ZWROb3Rlcyk7Ci0KLQkJLy8gaWYgZm9yY2UgY2hlY2sgaXMgc2V0LCBydW4gY2hlY2sgYW55d2F5Ci0JCWJvb2xlYW4gY2hhbmdlZCA9IGZvcmNlQ2hlY2s7Ci0KLQkJLy8gbGlzdCBvZiBlcnJvckluZm8gb2JqZWN0cwotCQlMaXN0IGVycm9ycyA9IGdldEFsbEVycm9ycygpOwotCQlpZiAoZXJyb3JzLnNpemUoKSA+IDApIHsJCQkKLQkJCWludmFsaWROb2Rlc01hcC5jbGVhcigpOwotCQkJUGFja2FnZUVycm9yIGVycm9yOwotCQkJRU9iamVjdCBjYXVzZUVsZW1lbnQ7Ci0JCQkvL2Jvb2xlYW4gb3duZXJTZWxlY3RlZCwgY2F1c2VTZWxlY3RlZDsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBlcnJvcnMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCWVycm9yID0gKFBhY2thZ2VFcnJvcikgaXQubmV4dCgpOwotCi0JCQkJLy9vd25lckVsZW1lbnQgPSAoRU9iamVjdCkgZXJyb3IuZ2V0T3duZXJFbGVtZW50KCk7Ci0JCQkJY2F1c2VFbGVtZW50ID0gKEVPYmplY3QpIGVycm9yLmdldENhdXNlRWxlbWVudCgpOwotCQkJCS8vYWRkQ2hhbmdlZChvd25lckVsZW1lbnQpOwotCQkJCS8vYWRkQ2hhbmdlZChjYXVzZUVsZW1lbnQpOwotLy8JCQkJaWYgKGVycm9yLmlzQ2hpbGRFcnJvcigpIHx8IGVycm9yLmlzQ2hpbGRXYXJuaW5nKCkpIHsKLS8vCQkJCQljb250aW51ZTsKLS8vCQkJCX0KLQotCQkJCWJvb2xlYW4gaXNFcnJvciA9IGVycm9yLmlzRXJyb3IoKTsKLQkJCQlib29sZWFuIGlzV2FybmluZyA9IGVycm9yLmlzV2FybmluZygpOwotCQkJCWlmICghaXNFcnJvciAmJiAhaXNXYXJuaW5nIHx8ICFpc0Vycm9yICYmIGVycm9yT25seSkgewotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkKLQkJCQlpZiAoICFpc1NlbGVjdGVkKGNhdXNlRWxlbWVudCkgJiYgc2VsZWN0RXJyb3JFbGVtZW50KGNhdXNlRWxlbWVudCkgKSB7Ci0JCQkJCWNoYW5nZWQgPSB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWlmICggY2hhbmdlZCApIHsKLQkJCWNoZWNrRXJyb3IoKTsKLQkJfQotCQkKLQkJcmV0dXJuIGNoYW5nZWQ7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIHNlbGVjdEVycm9yRWxlbWVudChFT2JqZWN0IGVsZW1lbnQpIHsKLQotCQlib29sZWFuIHNlbGVjdGVkID0gdHJ1ZTsKLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4gCi0JCQkJJiYgIWNvbmZpZy5nZXRNZXRob2RQbHVnaW5TZWxlY3Rpb24oKS5jb250YWlucyhlbGVtZW50KSkgewotCQkJY29uZmlnLmdldE1ldGhvZFBsdWdpblNlbGVjdGlvbigpLmFkZCgoTWV0aG9kUGx1Z2luKSBlbGVtZW50KTsKLQkJfSBlbHNlIGlmICggZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZFBhY2thZ2UgCi0JCQkJJiYgIWNvbmZpZy5nZXRNZXRob2RQYWNrYWdlU2VsZWN0aW9uKCkuY29udGFpbnMoZWxlbWVudCkpewotCQkJY29uZmlnLmdldE1ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKS5hZGQoKE1ldGhvZFBhY2thZ2UpIGVsZW1lbnQpOwotCQl9IGVsc2UgewotCQkJc2VsZWN0ZWQgPSBmYWxzZTsKLQkJfQotCQkKLQkJcmV0dXJuIHNlbGVjdGVkOwotCX0KLQotLy8JLyoqCi0vLwkgKiB1cGRhdGUgdGhlIG1ldGhvZCBjb25maWd1cmF0aW9uIGluIHRoZSBsaWJyYXJ5IHdpdGggdGhlIGN1cnJlbnQgc2VsZWN0aW9ucwotLy8JICovCi0vLwlwdWJsaWMgdm9pZCBzYXZlTWV0aG9kQ29uZmlndXJhdGlvbigpIHsKLS8vCQlMaXN0IHBsdWdpbnMgPSBjb25maWcuZ2V0TWV0aG9kUGx1Z2luU2VsZWN0aW9uKCk7Ci0vLwkJTGlzdCBwYWNrYWdlcyA9IGNvbmZpZy5nZXRNZXRob2RQYWNrYWdlU2VsZWN0aW9uKCk7Ci0vLwotLy8JCXBsdWdpbnMuY2xlYXIoKTsKLS8vCQlwYWNrYWdlcy5jbGVhcigpOwotLy8KLS8vCQlFT2JqZWN0IGVsZW1lbnQ7Ci0vLwkJZm9yIChJdGVyYXRvciBpdCA9IHNlbGVjdGVkTm90ZXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotLy8JCQllbGVtZW50ID0gKEVPYmplY3QpIGl0Lm5leHQoKTsKLS8vCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pIHsKLS8vCQkJCWlmICghcGx1Z2lucy5jb250YWlucyhlbGVtZW50KSkgewotLy8JCQkJCXBsdWdpbnMuYWRkKGVsZW1lbnQpOwotLy8JCQkJfQotLy8JCQl9IGVsc2UgaWYgKChlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kUGFja2FnZSkKLS8vCQkJCQkmJiAhQ29uZmlndXJhdGlvbkhlbHBlcgotLy8JCQkJCQkJLmlzR2xvYmFsUGFja2FnZSgoTWV0aG9kUGFja2FnZSkgZWxlbWVudCkpIHsKLS8vCQkJCWlmICghcGFja2FnZXMuY29udGFpbnMoZWxlbWVudCkpIHsKLS8vCQkJCQlwYWNrYWdlcy5hZGQoZWxlbWVudCk7Ci0vLwkJCQl9Ci0vLwkJCX0KLS8vCQl9Ci0vLwl9Ci0KLQkvKioKLQkgKiBQYWNrYWdlcyB0aGUgbGlicmFyeSBiYXNlZCBvbiB0aGUgc2VsZWN0aW9uLgotCSAqIDxwPgotCSAqIE5vdGU6IFRoaXMgd2lsbCBjaGFuZ2UgdGhlIGN1cnJlbnQgbGlicmFyeS4gQmVmb3JlIGNhbGxpbmcgdGhpcyBtZXRob2QsIGEKLQkgKiBjb3B5IG9mIHRoZSBjdXJyZW50IGxpYnJhcnkgc2hvdWxkIGJlIGNyZWF0ZWQgd2l0aCB0aGUgZm9sbG93aW5nIHN0ZXBzOgotCSAqIDEuIENyZWF0ZSBhIG5ldyA8Y29kZT5Db25maWd1cmF0aW9uTWFuYWdlcjwvY29kZT4gd2l0aCBhIGNvcHkgb2YgdGhlCi0JICogb3JpZ2luYWwgbGlicmFyeSwgMi4gUmVidWlsZCB0aGUgZGVwZW5kZW5jeSwgMy4gQ3JlYXRlIGEKLQkgKiA8Y29kZT5Db25maWd1cmF0aW9uQ2xvc3VyZTwvY29kZT4gd2l0aCB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uLgotCSAqIAotCSAqIEByZXR1cm4gQSA8Y29kZT5NZXRob2RMaWJyYXJ5PC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgTWV0aG9kTGlicmFyeSBwYWNrYWdlTGlicmFyeShib29sZWFuIHJlbW92ZUJyb2tlblJlZmVyZW5jZXMpIHsKLQkJcHJvY2Vzc1NlbGVjdGlvbihsaWJyYXJ5LCByZW1vdmVCcm9rZW5SZWZlcmVuY2VzKTsKLQotCQkvLyBSZW1vdmUgdGhlIGNvbmZpZ3VyYXRpb25zIGV4Y2VwdCBmb3IgdGhlIGN1cnJlbnQgb25lLgotCQlMaXN0IGNvbmZpZ3MgPSBsaWJyYXJ5LmdldFByZWRlZmluZWRDb25maWd1cmF0aW9ucygpOwotCQljb25maWdzLmNsZWFyKCk7Ci0JCWNvbmZpZ3MuYWRkKGNvbmZpZyk7Ci0KLQkJcmV0dXJuIGxpYnJhcnk7Ci0JfQotCi0JLyoqCi0JICogcHJvY2VzcyB0aGUgc2VsZWN0ZWQgcGFja2FnZSBieSByZW1vdmVpbmcgYWxsIHVuc2VsZWN0ZWQgZWxlbWVudHMgYW5kIGFueQotCSAqIG1pc3NpbmcgcmVmZXJlbmNlcwotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICovCi0JcHJpdmF0ZSB2b2lkIHByb2Nlc3NTZWxlY3Rpb24oRU9iamVjdCBlbGVtZW50LAotCQkJYm9vbGVhbiByZW1vdmVCcm9rZW5SZWZlcmVuY2VzKSB7Ci0JCWlmIChyZW1vdmVCcm9rZW5SZWZlcmVuY2VzKSB7Ci0JCQkvLyBJdGVyYXRvciB0aGUgcmVmZXJlbmNlcyBhbmQgcmVtb3ZlIGJyb2tlbiByZWZlcmVuY2VzLgotCQkJRUxpc3QgcmVmZXJlbmNlcyA9IGVsZW1lbnQuZUNyb3NzUmVmZXJlbmNlcygpOwotCQkJaWYgKHJlZmVyZW5jZXMgIT0gbnVsbCkgewotCQkJCWZvciAoSXRlcmF0b3IgaXQgPSBuZXcgQXJyYXlMaXN0KHJlZmVyZW5jZXMpLml0ZXJhdG9yKCk7IGl0Ci0JCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQlFT2JqZWN0IHJlZiA9IChFT2JqZWN0KSBpdC5uZXh0KCk7Ci0JCQkJCUVPYmplY3QgcGtnUmVmID0gTGlicmFyeVV0aWwuZ2V0U2VsZWN0YWJsZShyZWYpOwotCQkJCQlpZiAocGtnUmVmICE9IG51bGwgJiYgIWlzU2VsZWN0ZWQocGtnUmVmKSkgewotCQkJCQkJcmVtb3ZlUmVmZXJlbmNlKGVsZW1lbnQsIHJlZik7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlFTGlzdCBlbGVtZW50cyA9IGVsZW1lbnQuZUNvbnRlbnRzKCk7Ci0JCWlmIChlbGVtZW50cyAhPSBudWxsKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gbmV3IEFycmF5TGlzdChlbGVtZW50cykuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCUVPYmplY3QgY2hpbGQgPSAoRU9iamVjdCkgaXQubmV4dCgpOwotCi0JCQkJLy8gSWYgdGhlIGNoaWxkIGVsZW1lbnQgaXMgc2VsZWN0YWJsZSBidXQgaXQgaXMgbm90IGluIHRoZQotCQkJCS8vIGNvbmZpZ3VyYXRpb24sIHJlbW92ZSBpdC4KLQkJCQlpZiAoTGlicmFyeVV0aWwuc2VsZWN0YWJsZShjaGlsZCkgJiYgIWlzU2VsZWN0ZWQoY2hpbGQpKSB7Ci0JCQkJCUVjb3JlVXRpbC5yZW1vdmUoY2hpbGQpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXByb2Nlc3NTZWxlY3Rpb24oY2hpbGQsIHJlbW92ZUJyb2tlblJlZmVyZW5jZXMpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCByZW1vdmVSZWZlcmVuY2UoRU9iamVjdCBvd25lckVsZW1lbnQsIEVPYmplY3QgcmVmRWxlbWVudCkgewotCQlBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlciBwcm92aWRlciA9IGNvbmZpZ01hbmFnZXIKLQkJCQkuZ2V0Q29udGVudFByb3ZpZGVyKCk7Ci0JCUlQcm9wZXJ0eVNvdXJjZSBwcyA9IHByb3ZpZGVyLmdldFByb3BlcnR5U291cmNlKG93bmVyRWxlbWVudCk7Ci0JCUlQcm9wZXJ0eURlc2NyaXB0b3JbXSBwZHMgPSBwcy5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKCk7Ci0JCWlmIChwZHMgIT0gbnVsbCAmJiBwZHMubGVuZ3RoID4gMCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwZHMubGVuZ3RoOyBpKyspIHsKLQkJCQlJUHJvcGVydHlEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSAoSVByb3BlcnR5RGVzY3JpcHRvcikgcGRzW2ldOwotCQkJCU9iamVjdCBpZCA9IGRlc2NyaXB0b3IuZ2V0SWQoKTsKLQkJCQlPYmplY3QgdmFsdWUgPSBwcy5nZXRQcm9wZXJ0eVZhbHVlKGlkKTsKLQotCQkJCS8vIENoZWNrIHdoZXRoZXIgdGhlIHZhbHVlIG5lZWRzIHRvIGJlIGNvbnZlcnRlZCB0byBhbiBlZGl0YWJsZQotCQkJCS8vIHZhbHVlLgotCQkJCUlQcm9wZXJ0eVNvdXJjZSBzb3VyY2UgPSBwcm92aWRlci5nZXRQcm9wZXJ0eVNvdXJjZSh2YWx1ZSk7Ci0JCQkJaWYgKHNvdXJjZSAhPSBudWxsKSB7Ci0JCQkJCXZhbHVlID0gc291cmNlLmdldEVkaXRhYmxlVmFsdWUoKTsKLQkJCQl9Ci0JCQkJaWYgKHZhbHVlIGluc3RhbmNlb2YgRUxpc3QpIHsKLQkJCQkJRUxpc3QgcmVmTGlzdCA9IChFTGlzdCkgdmFsdWU7Ci0JCQkJCWlmIChyZWZMaXN0LmNvbnRhaW5zKHJlZkVsZW1lbnQpKSB7Ci0JCQkJCQlpZiAoZGVidWcpIHsKLQkJCQkJCQlTeXN0ZW0ub3V0Ci0JCQkJCQkJCQkucHJpbnRsbigiUmVmZXJlbmNlIFsiICsgTGlicmFyeVV0aWwuZ2V0TmFtZShyZWZFbGVtZW50KSAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQkJCSsgIl0gcmVtb3ZlZCBmcm9tIFsiIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCQkJKyBMaWJyYXJ5VXRpbC5nZXROYW1lKG93bmVyRWxlbWVudCkKLQkJCQkJCQkJCQkJKyAiXSdzIHJlZmVyZW5jZSBsaXN0Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCX0KLQkJCQkJCXJlZkxpc3QucmVtb3ZlKHJlZkVsZW1lbnQpOwotCQkJCQkJcHMuc2V0UHJvcGVydHlWYWx1ZShpZCwgcmVmTGlzdCk7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJCQlpZiAoZGVidWcpIHsKLQkJCQkJCVN5c3RlbS5vdXQKLQkJCQkJCQkJLnByaW50bG4oIlJlZmVyZW5jZSBbIiArIExpYnJhcnlVdGlsLmdldE5hbWUocmVmRWxlbWVudCkgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJCSsgIl0gcmVtb3ZlZCBmcm9tIFsiIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCQkrIExpYnJhcnlVdGlsLmdldE5hbWUob3duZXJFbGVtZW50KQotCQkJCQkJCQkJCSsgIl0iKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJCXBzLnNldFByb3BlcnR5VmFsdWUoaWQsIG51bGwpOwotCQkJCX0KLQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogRGlzcG9zZXMgcmVzb3VyY2VzIGFsbG9jYXRlZCBieSB0aGlzIGNsb3N1cmUuCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJCi0JCWNsZWFyRXJyb3JNYXJrcygpOwotCQkKLQkJaWYgKGNvbmZpZ01hbmFnZXIgIT0gbnVsbCkgewotCQkJQ29uZmlndXJhdGlvblByb3BlcnRpZXMgcHJvcHMgPSBjb25maWdNYW5hZ2VyLmdldENvbmZpZ3VyYXRpb25Qcm9wZXJ0aWVzKCk7CQkJCi0JCQlwcm9wcy5yZW1vdmVMaXN0ZW5lcihjb25maWdQcm9wTGlzdGVuZXIpOwotCQl9Ci0JCQkJCi0JCWNvbmZpZ01hbmFnZXIgPSBudWxsOwotCQljb25maWcgPSBudWxsOwotCQlsaWJyYXJ5ID0gbnVsbDsKLQkJZGVwZW5kZW5jeU1hbmFnZXIgPSBudWxsOwotCQlhY3Rpb25NZ3IgPSBudWxsOwotCQkvL3NlbGVjdGVkTm90ZXMuY2xlYXIoKTsKLQkJLy9jaGFuZ2VkTm9kZXMuY2xlYXIoKTsKLQkJaWYgKGludmFsaWROb2Rlc01hcCAhPSBudWxsKSB7Ci0JCQlpbnZhbGlkTm9kZXNNYXAuY2xlYXIoKTsKLQkJfQotCQlpZiAobGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCWxpc3RlbmVycy5jbGVhcigpOwotCQl9Ci0JCWNsZWFyUmVwbGFjZXJFbGVtZW50TWFya2VyTWFwKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNsZWFyUmVwbGFjZXJFbGVtZW50TWFya2VyTWFwKCkgewotCQlpZiAocmVwbGFjZXJFbGVtZW50TWFya2VyTWFwICE9IG51bGwpIHsKLQkJCWZvciAoSU1hcmtlciBtYXJrZXI6IHJlcGxhY2VyRWxlbWVudE1hcmtlck1hcC52YWx1ZXMoKSkgewotCQkJCXRyeSB7Ci0JCQkJCW1hcmtlci5kZWxldGUoKTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQlMaWJyYXJ5UGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0JCQotCQlyZXBsYWNlckVsZW1lbnRNYXJrZXJNYXAgPSBudWxsOwotCX0KLQkKLS8vCXByaXZhdGUgYm9vbGVhbiBjYW5JZ25vcmUoUGFja2FnZVJlZmVyZW5jZSBwa2dSZWYpIHsKLS8vCQlyZXR1cm4gcGtnUmVmLmNhbklnbm9yZSgpOwotLy8JfQotCi0JcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoQ2xvc3VyZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWlmIChsaXN0ZW5lcnMgPT0gbnVsbCkgewotCQkJbGlzdGVuZXJzID0gbmV3IEFycmF5TGlzdDxDbG9zdXJlTGlzdGVuZXI+KCk7Ci0JCX0KLQkJaWYgKCFsaXN0ZW5lcnMuY29udGFpbnMobGlzdGVuZXIpKSB7Ci0JCQlsaXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTsKLQkJfQotCQkKLQkJbm90aWZ5TGlzdGVuZXIobGlzdGVuZXIsIHRoaXMuZXJyb3JzKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoQ2xvc3VyZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWlmIChsaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJaWYgKGxpc3RlbmVycy5jb250YWlucyhsaXN0ZW5lcikpIHsKLQkJCQlsaXN0ZW5lcnMucmVtb3ZlKGxpc3RlbmVyKTsKLQkJCX0KLQkJfQotCX0KLQkKLS8vCXByaXZhdGUgdm9pZCBub3RpZnlFcnJvckFkZGVkKFBhY2thZ2VFcnJvciBwa2dlcnJvcikgewotLy8JCQkvL25vdGlmeUxpc3RlbmVycyhDbG9zdXJlTGlzdGVuZXIuRVJST1JfQURERUQsIHBrZ2Vycm9yKTsKLS8vCX0KLS8vCQotLy8JcHJpdmF0ZSB2b2lkIG5vdGlmeUVycm9yUmVtb3ZlZChQYWNrYWdlRXJyb3IgcGtnZXJyb3IpIHsKLS8vCQkvL25vdGlmeUxpc3RlbmVycyhDbG9zdXJlTGlzdGVuZXIuRVJST1JfUkVNT1ZFRCwgcGtnZXJyb3IpOwkKLS8vCX0KLQkKLQlwcml2YXRlIHZvaWQgbm90aWZ5TGlzdGVuZXIoQ2xvc3VyZUxpc3RlbmVyIGxpc3RlbmVyLCBMaXN0IGVycm9ycykgewotCQkJCQkJCQkJCi0JCWZvciAoIEl0ZXJhdG9yIGl0ID0gZXJyb3JzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTsgKSB7Ci0JCQlFbGVtZW50RXJyb3IgZXJyb3IgPSAoRWxlbWVudEVycm9yKWl0Lm5leHQoKTsKLQkJCWxpc3RlbmVyLmZpcmVFdmVudChDbG9zdXJlTGlzdGVuZXIuRVJST1JfQURERUQsIGNvbmZpZywgZXJyb3IpOwotCQl9Ci0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIGlzQWJvcnRDaGVja0Vycm9yKCkgewotCQlyZXR1cm4gYWJvcnRDaGVja0Vycm9yOwotCX0KLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzZXRBYm9ydENoZWNrRXJyb3IoYm9vbGVhbiBhYm9ydENoZWNrRXJyb3IpIHsKLQkJdGhpcy5hYm9ydENoZWNrRXJyb3IgPSBhYm9ydENoZWNrRXJyb3I7Ci0JCWlmIChDb25maWdEYXRhQmFzZS5sb2NhbERlYnVnKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxEPiBzZXRBYm9ydENoZWNrRXJyb3I6ICIgKyBhYm9ydENoZWNrRXJyb3IpOy8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQkKLS8vCS8qKgotLy8JICogYWRkIHRoaXMgZWxlbWVudCBpbnRvIHRoZSBjb25maWd1cmF0aW9uCi0vLwkgKiB0aGlzIGlzIGZvciBxdWljayBmaXggYWN0aW9uCi0vLwkgKiBvdXIgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBpcyB0byBzZWxlY3QgdGhlIG93bmluZyBwYWNrYWdlCi0vLwkgKiBAcGFyYW0gZWxlbWVudAotLy8JICogQHJldHVybiBJU3RhdHVzCi0vLwkgKi8KLS8vCXB1YmxpYyBJU3RhdHVzIHNlbGVjdEVsZW1lbnQoTWV0aG9kRWxlbWVudCBlbGVtZW50KSB7Ci0vLwkJCi0vLwkJLy9pZiB0aGUgZWxlbWVudCBpcyBzdWJ0cmFjdGVkLCB3ZSBjYW4ndCBzZWxlY3QgdGhlIGVsZW1lbnQKLS8vCQkvLyByZXR1cm4gYW4gZXJyb3IKLS8vCQlpZiAoIGNvbmZpZ01hbmFnZXIuZ2V0Q29uZmlndXJhdGlvbkRhdGEoKS5pc0VsZW1lbnRJblN1YnRyYWN0ZWRDYXRlZ29yeShlbGVtZW50KSkgewotLy8JCQlTdHJpbmcgbWVzc2FnZSA9IExpYnJhcnlSZXNvdXJjZXMuYmluZChMaWJyYXJ5UmVzb3VyY2VzLlF1aWNrZml4RXJyb3JfcmVhc29uMSwgCi0vLwkJCQkJKG5ldyBTdHJpbmdbXSB7TGlicmFyeVV0aWwuZ2V0VHlwZU5hbWUoZWxlbWVudCl9KSk7Ci0vLwkJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsCi0vLwkJCQkJTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SWQoKSwgSVN0YXR1cy5PSywgbWVzc2FnZSwgbnVsbCk7Ci0vLwkJfQotLy8JCQotLy8JCS8vIGZvciBxdWljayBmaXgsIHdlIGp1c3Qgc2VsZWN0IHRoZSBwYWNrYWdlIG9mIHRoZSBlbGVtZW50IAotLy8JCS8vIGFuZCB0aGUgY2hpbGQgcGFja2FnZXMKLS8vCQlPYmplY3Qgb3duZXIgPSBMaWJyYXJ5VXRpbC5nZXRTZWxlY3RhYmxlKGVsZW1lbnQpOwotLy8JCWlmICggb3duZXIgIT0gbnVsbCAmJiBvd25lciBpbnN0YW5jZW9mIE1ldGhvZFBhY2thZ2UpIHsKLS8vCQkJY29uZmlnLmdldE1ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKS5hZGQob3duZXIpOwotLy8JCX0JCi0vLwkJCi0vLwkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0vLwl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvY29uZmlndXJhdGlvbi9jbG9zdXJlL0NvbmZpZ3VyYXRpb25FcnJvck1hdHJpeC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2NvbmZpZ3VyYXRpb24vY2xvc3VyZS9Db25maWd1cmF0aW9uRXJyb3JNYXRyaXguamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjFkM2M2YS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvY29uZmlndXJhdGlvbi9jbG9zdXJlL0NvbmZpZ3VyYXRpb25FcnJvck1hdHJpeC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uY2xvc3VyZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5MaWJyYXJ5VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50Q2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HdWlkYW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3Q7Ci0KLS8qKgotICogZGVmaW5lIHRoZSBjb25maWd1cmF0aW9uIGVycm9yIGxldmVsIG1ldHJpeAotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQGF1dGhvciBXZWlwaW5nIEx1Ci0gKiBAc2luY2UgMS4yCi0gKgotICovCi1wdWJsaWMgY2xhc3MgQ29uZmlndXJhdGlvbkVycm9yTWF0cml4IHsKLQkKLS8vCXByaXZhdGUgc3RhdGljIExpc3QgbGV2ZWwxRmVhdHVyZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0vLwlwcml2YXRlIHN0YXRpYyBMaXN0IGxldmVsMkZlYXR1cmVzID0gbmV3IEFycmF5TGlzdCgpOwotLy8JcHJpdmF0ZSBzdGF0aWMgTGlzdCBsZXZlbDNGZWF0dXJlcyA9IG5ldyBBcnJheUxpc3QoKTsKLS8vCXN0YXRpYyB7Ci0vLwkJbGV2ZWwyRmVhdHVyZXMuYWRkKFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tfUGVyZm9ybWVkQnkoKSk7Ci0vLwl9Ci0JCi0vLwlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZzsKLS8vCXB1YmxpYyBDb25maWd1cmF0aW9uRXJyb3JNYXRyaXgoTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLS8vCQl0aGlzLmNvbmZpZyA9IGNvbmZpZzsKLS8vCX0KLQkKLQlwdWJsaWMgc3RhdGljIEVsZW1lbnRFcnJvciBnZXRFcnJvcihNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZywgRWxlbWVudFJlZmVyZW5jZSByZWYpIHsKLQkJCi0JCWlmICggcmVmLmhhc0ZlYXR1cmUoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VmFyaWFiaWxpdHlFbGVtZW50X1ZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSkgKSB7Ci0JCQlyZXR1cm4gZ2V0VmFyaWFiaWxpdHlFcnJvcihjb25maWcsIHJlZik7Ci0JCX0gCi0JCQotCQlpbnQgZXJyb3JMZXZlbCA9IEVycm9ySW5mby5JTkZPOwotCQlTdHJpbmcgbWVzc2FnZUlkID0gTGlicmFyeVJlc291cmNlcy5FbGVtZW50RXJyb3JfbWlzc2luZ19lbGVtZW50OwotCQkKLQkJTWV0aG9kRWxlbWVudCBlID0gKE1ldGhvZEVsZW1lbnQpcmVmLmdldEVsZW1lbnQoKTsKLQkJTWV0aG9kRWxlbWVudCBlX3JlZiA9IChNZXRob2RFbGVtZW50KXJlZi5nZXRSZWZFbGVtZW50KCk7Ci0KLQkJaWYgKCByZWYuaGFzRmVhdHVyZShVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrX01hbmRhdG9yeUlucHV0KCkpICkgewotCQkJZXJyb3JMZXZlbCA9IEVycm9ySW5mby5FUlJPUjsKLQkJCW1lc3NhZ2VJZCA9IExpYnJhcnlSZXNvdXJjZXMuRWxlbWVudEVycm9yX21pc3NpbmdfbWFuZGF0b3J5X2lucHV0OwotCQl9IGVsc2UgaWYgKCByZWYuaGFzRmVhdHVyZShVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrX091dHB1dCgpKSApIHsKLQkJCWVycm9yTGV2ZWwgPSBFcnJvckluZm8uRVJST1I7Ci0JCQltZXNzYWdlSWQgPSBMaWJyYXJ5UmVzb3VyY2VzLkVsZW1lbnRFcnJvcl9taXNzaW5nX291dHB1dDsKLQkJfSBlbHNlIGlmICggcmVmLmhhc0ZlYXR1cmUoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza19QZXJmb3JtZWRCeSgpKSApIHsKLQkJCWVycm9yTGV2ZWwgPSBFcnJvckluZm8uV0FSTklORzsKLQkJCW1lc3NhZ2VJZCA9IExpYnJhcnlSZXNvdXJjZXMuRWxlbWVudEVycm9yX21pc3NpbmdfcHJpbWFyeV9wZXJmb3JtZXI7Ci0JCX0gZWxzZSBpZiAoIHJlZi5oYXNGZWF0dXJlKFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFJvbGVfUmVzcG9uc2libGVGb3IoKSkgKSB7Ci0JCQllcnJvckxldmVsID0gRXJyb3JJbmZvLldBUk5JTkc7Ci0JCQltZXNzYWdlSWQgPSBMaWJyYXJ5UmVzb3VyY2VzLkVsZW1lbnRFcnJvcl9taXNzaW5nX3Jlc3BvbnNpYmxlX2Zvcl93b3JrUHJvZHVjdDsKLQkJfSBlbHNlIGlmICggcmVmLmhhc0ZlYXR1cmUoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza19BZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSgpKSAKLQkJCQl8fCByZWYuaGFzRmVhdHVyZShVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrX09wdGlvbmFsSW5wdXQoKSkgCi0JCQkJfHwgcmVmLmhhc0ZlYXR1cmUoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Um9sZV9Nb2RpZmllcygpKQotCQkJCSApIHsKLQkJCS8vIGRlZmF1bHQKLQkJfSBlbHNlIGlmICggaXNCcmVha2Rvd25SZWZlcmVuY2UoZSwgZV9yZWYpICkgewotCQkJZXJyb3JMZXZlbCA9IEVycm9ySW5mby5JTkZPOwotCQl9IGVsc2UgaWYoIGlzR3VpZGFuY2VSZWZlcmVuY2UoZSwgZV9yZWYpICkgewotCQkJLy8gZGVmYXVsdAotCQl9IGVsc2UgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlTdHJpbmcgbWVzc2FnZSA9IExpYnJhcnlSZXNvdXJjZXMuYmluZChtZXNzYWdlSWQsIAotCQkJCShuZXcgU3RyaW5nW10ge0xpYnJhcnlVdGlsLmdldFR5cGVQYXRoKGUpLCAKLQkJCQkJCUxpYnJhcnlVdGlsLmdldFR5cGVQYXRoKGVfcmVmKSB9KSk7Ci0KLQkJcmV0dXJuIG5ldyBFbGVtZW50RXJyb3IoY29uZmlnLCBlcnJvckxldmVsLCBtZXNzYWdlLCBlLCBlX3JlZiwgRXJyb3JJbmZvLlJFRkVSRU5DRV9UTywgbWVzc2FnZUlkKTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0JyZWFrZG93blJlZmVyZW5jZShNZXRob2RFbGVtZW50IGUsIE1ldGhvZEVsZW1lbnQgZV9yZWYpIHsKLQkJcmV0dXJuIChlX3JlZiBpbnN0YW5jZW9mIFRhc2sgfHwgZV9yZWYgaW5zdGFuY2VvZiBSb2xlIHx8IGVfcmVmIGluc3RhbmNlb2YgV29ya1Byb2R1Y3QpIAotCQkJJiYgKGUgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50KTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0d1aWRhbmNlUmVmZXJlbmNlKE1ldGhvZEVsZW1lbnQgZSwgTWV0aG9kRWxlbWVudCBlX3JlZikgewotCQlyZXR1cm4gKGUgaW5zdGFuY2VvZiBUYXNrIHx8IGUgaW5zdGFuY2VvZiBSb2xlIHx8IGUgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdCkgCi0JCQkmJiAoZV9yZWYgaW5zdGFuY2VvZiBHdWlkYW5jZSk7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIEVsZW1lbnRFcnJvciBnZXRWYXJpYWJpbGl0eUVycm9yKE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnLCBFbGVtZW50UmVmZXJlbmNlIHJlZikgewotCQotCQlWYXJpYWJpbGl0eUVsZW1lbnQgZSA9IChWYXJpYWJpbGl0eUVsZW1lbnQpcmVmLmdldEVsZW1lbnQoKTsKLQkJVmFyaWFiaWxpdHlFbGVtZW50IGVfcmVmID0gKFZhcmlhYmlsaXR5RWxlbWVudClyZWYuZ2V0UmVmRWxlbWVudCgpOwotCQkKLQkJaWYgKCBlLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSAhPSBlX3JlZiApIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCQotCQlWYXJpYWJpbGl0eVR5cGUgdHlwZSA9IGUuZ2V0VmFyaWFiaWxpdHlUeXBlKCk7Ci0JCQotCQlpbnQgZXJyb3JMZXZlbCA9IEVycm9ySW5mby5XQVJOSU5HOwotCQlTdHJpbmcgbWVzc2FnZUlkID0gTGlicmFyeVJlc291cmNlcy5FbGVtZW50RXJyb3JfbWlzc2luZ19lbGVtZW50OwotCi0JCWlmICggdHlwZSA9PSBWYXJpYWJpbGl0eVR5cGUuQ09OVFJJQlVURVMgKSB7Ci0JCQlpZiAoIGUgaW5zdGFuY2VvZiBDb250ZW50Q2F0ZWdvcnkgfHwgZSBpbnN0YW5jZW9mIEd1aWRhbmNlICkgewotCQkJCWVycm9yTGV2ZWwgPSBFcnJvckluZm8uSU5GTzsKLQkJCX0KLQkJCQotCQkJbWVzc2FnZUlkID0gTGlicmFyeVJlc291cmNlcy5FbGVtZW50RXJyb3JfY29udHJpYnV0b3JfbWlzc2luZ19iYXNlOwotCQl9IGVsc2UgaWYgKCB0eXBlID09IFZhcmlhYmlsaXR5VHlwZS5FWFRFTkRTICkgewotCQkJbWVzc2FnZUlkID0gTGlicmFyeVJlc291cmNlcy5FbGVtZW50RXJyb3JfZXh0ZW5kZXJfbWlzc2luZ19iYXNlOwotCQkJCi0JCX0gZWxzZSBpZiAoIHR5cGUgPT0gVmFyaWFiaWxpdHlUeXBlLlJFUExBQ0VTIAotCQkJCXx8IHR5cGUgPT0gVmFyaWFiaWxpdHlUeXBlLkVYVEVORFNfUkVQTEFDRVMpIHsKLQkJCW1lc3NhZ2VJZCA9IExpYnJhcnlSZXNvdXJjZXMuRWxlbWVudEVycm9yX3JlcGxhY2VyX21pc3NpbmdfYmFzZTsKLQkJfQotCQkKLQkJU3RyaW5nIG1lc3NhZ2UgPSBMaWJyYXJ5UmVzb3VyY2VzLmJpbmQobWVzc2FnZUlkLCAKLQkJCQkobmV3IFN0cmluZ1tdIHtMaWJyYXJ5VXRpbC5nZXRUeXBlUGF0aChlKSwgCi0JCQkJCQlMaWJyYXJ5VXRpbC5nZXRUeXBlUGF0aChlX3JlZikgfSkpOwotCi0JCXJldHVybiBuZXcgRWxlbWVudEVycm9yKGNvbmZpZywgZXJyb3JMZXZlbCwgbWVzc2FnZSwgZSwgZV9yZWYsIEVycm9ySW5mby5SRUZFUkVOQ0VfVE8sIG1lc3NhZ2VJZCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2NvbmZpZ3VyYXRpb24vY2xvc3VyZS9EZXBlbmRlbmN5TWFuYWdlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2NvbmZpZ3VyYXRpb24vY2xvc3VyZS9EZXBlbmRlbmN5TWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMjA3YTBlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9jb25maWd1cmF0aW9uL2Nsb3N1cmUvRGVwZW5kZW5jeU1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwOSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLmNsb3N1cmU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuSUxpYnJhcnlNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZXZlbnRzLklMaWJyYXJ5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5MaWJyYXJ5VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdDsKLQotLyoqCi0gKiBNYW5hZ2VzIHRoZSBtZXRob2QgZWxlbWVudCBkZXBlbmRlbmNpZXMgaW4gYSBtZXRob2QgbGlicmFyeS4KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRGVwZW5kZW5jeU1hbmFnZXIgewotCi0JLy8gSWYgdHJ1ZSwgZ2VuZXJhdGUgZGVidWcgdHJhY2VzLgotCXByb3RlY3RlZCBzdGF0aWMgYm9vbGVhbiBkZWJ1ZyA9IExpYnJhcnlQbHVnaW4uZ2V0RGVmYXVsdCgpLmlzRGVidWdnaW5nKCk7Ci0KLQkvLyBUaGUgbWV0aG9kIGxpYnJhcnkuCi0JcHJvdGVjdGVkIE1ldGhvZExpYnJhcnkgbGlicmFyeTsKLQotCS8vIFRoZSBsaWJyYXJ5IG1hbmFnZXIuCi0JcHJvdGVjdGVkIElMaWJyYXJ5TWFuYWdlciBsaWJyYXJ5TWFuYWdlcjsKLQotCS8vIEEgbWFwIG9mIHBhY2thZ2UgZWxlbWVudHMgdG8gUGFja2FnZURlcGVuZGVuY3kgb2JqZWN0cy4KLQlwcm90ZWN0ZWQgTWFwIGRlcGVuZGVuY3lNYXAgPSBuZXcgSGFzaE1hcCgpOwotCi0JLy8gQSBsaWJyYXJ5IGNoYW5nZSBsaXN0ZW5lci4KLQlwcml2YXRlIElMaWJyYXJ5Q2hhbmdlTGlzdGVuZXIgbGliTGlzdGVuZXIgPSBudWxsOwotCi0JcHJpdmF0ZSBTZXQ8VmFyaWFiaWxpdHlFbGVtZW50PiByZXBsYWNlclNldCA9IG5ldyBIYXNoU2V0PFZhcmlhYmlsaXR5RWxlbWVudD4oKTsKLQkKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBEZXBlbmRlbmN5TWFuYWdlcihNZXRob2RMaWJyYXJ5IGxpYnJhcnkpIHsKLQkJdGhpcy5saWJyYXJ5ID0gbGlicmFyeTsKLQkJdGhpcy5saWJyYXJ5TWFuYWdlciA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0TGlicmFyeU1hbmFnZXIoCi0JCQkJbGlicmFyeSk7Ci0JCWluaXQoKTsKLQl9Ci0KLQkvKioKLQkgKiBQZXJmb3JtcyB0aGUgbmVjZXNzYXJ5IGluaXRpYWxpemF0aW9uLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXQoKSB7Ci0JCQotCQlsaWJMaXN0ZW5lciA9IG5ldyBJTGlicmFyeUNoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgbGlicmFyeUNoYW5nZWQoaW50IG9wdGlvbiwgQ29sbGVjdGlvbiBjaGFuZ2VkSXRlbXMpIHsKLS8vCQkJCWlmIChvcHRpb24gPT0gSUxpYnJhcnlDaGFuZ2VMaXN0ZW5lci5PUFRJT05fTE9BREVECi0vLwkJCQkJCXx8IG9wdGlvbiA9PSBJTGlicmFyeUNoYW5nZUxpc3RlbmVyLk9QVElPTl9DUkVBVEVEKSB7Ci0vLwkJCQkJLy8gVE9ETzogSXMgdGhpcyBuZWNlc3Nhcnk/Ci0vLwkJCQkJLy8gcmVmcmVzaCgpOwotLy8JCQkJfSBlbHNlIAotCQkJCWlmIChvcHRpb24gPT0gSUxpYnJhcnlDaGFuZ2VMaXN0ZW5lci5PUFRJT05fREVMRVRFRCkgewotCQkJCQloYW5kbGVEZWxldGVkRWxlbWVudChjaGFuZ2VkSXRlbXMpOwotCQkJCX0gZWxzZSBpZiAob3B0aW9uID09IElMaWJyYXJ5Q2hhbmdlTGlzdGVuZXIuT1BUSU9OX0NIQU5HRUQKLQkJCQkJCXx8IG9wdGlvbiA9PSBJTGlicmFyeUNoYW5nZUxpc3RlbmVyLk9QVElPTl9ORVdDSElMRCkgewotCQkJCQlpZiAoY2hhbmdlZEl0ZW1zICE9IG51bGwgJiYgY2hhbmdlZEl0ZW1zLnNpemUoKSA+IDApIHsKLQkJCQkJCWZvciAoSXRlcmF0b3IgaXQgPSBjaGFuZ2VkSXRlbXMuaXRlcmF0b3IoKTsgaXQKLQkJCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCQl0cnkgewotCQkJCQkJCQlPYmplY3QgZSA9IGl0Lm5leHQoKTsKLQkJCQkJCQkJaWYgKGUgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQkJCQkJCQlidWlsZERlcGVuZGVuY3lGb3IoKE1ldGhvZEVsZW1lbnQpIGUpOwotCQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQkJaWYgKGRlYnVnKSB7Ci0JCQkJCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKGUKLQkJCQkJCQkJCQkJCSsgIiBpcyBub3QgYSBtZXRob2QgZWxlbWVudCIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQkJCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJCQlpZiAoZGVidWcpIHsKLQkJCQkJCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX07Ci0KLQkJbGlicmFyeU1hbmFnZXIuYWRkTGlzdGVuZXIobGliTGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHBhY2thZ2UgZGVwZW5kZW5jeSBmb3IgYSBtZXRob2QgZWxlbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqICAgICAgICAgICAgQSBtZXRob2QgZWxlbWVudC4KLQkgKiBAcmV0dXJuIEEgPGNvZGU+UGFja2FnZURlcGVuZGVuY3k8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBQYWNrYWdlRGVwZW5kZW5jeSBnZXREZXBlbmRlbmN5KE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgewotCQlpZiAoIUxpYnJhcnlVdGlsLnNlbGVjdGFibGUoZWxlbWVudCkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJLy8gQWx3YXlzIHJlYnVpbGQgdGhlIGRlcGVuZGVuY3kgZm9yIHRoZSBlbGVtZW50IHNpbmNlIHRoZQotCQkvLyBkZXBlbmRlbnRzIG1heSBub3QgYmUgZnVsbHkgZXN0YWJsaXNoZWQuCi0JCVBhY2thZ2VEZXBlbmRlbmN5IGRlcGVuZGVuY3kgPSBnZXREZXBlbmRlbmN5KGVsZW1lbnQsIGZhbHNlKTsKLQkJaWYgKGRlcGVuZGVuY3kgPT0gbnVsbCB8fCAhZGVwZW5kZW5jeS5pc0xvYWRlZCgpKSB7Ci0JCQlidWlsZERlcGVuZGVuY3koZWxlbWVudCk7Ci0JCX0KLQotCQlyZXR1cm4gZ2V0RGVwZW5kZW5jeShlbGVtZW50LCBmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogUHJpbnRzIHRoZSBkZXBlbmRlbmN5IGluZm9ybWF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHByaW50RGVwZW5kZW5jeSgpIHsKLQkJZm9yIChJdGVyYXRvciBpdCA9IGRlcGVuZGVuY3lNYXAudmFsdWVzKCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJKChQYWNrYWdlRGVwZW5kZW5jeSkgaXQubmV4dCgpKS5wcmludCgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQnVpbGRzIHRoZSBkZXBlbmRlbmN5IGZvciBhIG1ldGhvZCBlbGVtZW50LgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogICAgICAgICAgICBBIG1ldGhvZCBlbGVtZW50LgotCSAqLwotCXByaXZhdGUgdm9pZCBidWlsZERlcGVuZGVuY3koTWV0aG9kRWxlbWVudCBlbGVtZW50KSB7Ci0JCWlmIChlbGVtZW50ID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCXRyeSB7Ci0JCQlQYWNrYWdlRGVwZW5kZW5jeSBkZXBlbmRlbmN5ID0gYnVpbGREZXBlbmRlbmN5Rm9yKGVsZW1lbnQpOwotCi0JCQlFTGlzdCBlbGVtZW50cyA9IGVsZW1lbnQuZUNvbnRlbnRzKCk7Ci0JCQlpZiAoZWxlbWVudHMgIT0gbnVsbCkgewotCQkJCWZvciAoSXRlcmF0b3IgaXQgPSBlbGVtZW50cy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJCU9iamVjdCBvYmogPSBpdC5uZXh0KCk7Ci0JCQkJCWlmICghIChvYmogaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSkgewotCQkJCQkJY29udGludWU7Ci0JCQkJCX0KLQkJCQkJTWV0aG9kRWxlbWVudCBtZXRob2RFbGVtZW50ID0gKE1ldGhvZEVsZW1lbnQpIG9iajsKLQkJCQkJaWYgKG1ldGhvZEVsZW1lbnQgIT0gbnVsbAotCQkJCQkJCSYmICFMaWJyYXJ5VXRpbC5zZWxlY3RhYmxlKG1ldGhvZEVsZW1lbnQpKSB7Ci0JCQkJCQlidWlsZERlcGVuZGVuY3lGb3IobWV0aG9kRWxlbWVudCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCWRlcGVuZGVuY3kuc2V0TG9hZGVkKHRydWUpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJaWYgKGRlYnVnKSB7Ci0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEJ1aWxkcyB0aGUgZGVwZW5kZW5jeSBmb3IgYSBtZXRob2QgZWxlbWVudC4KLQkgKiA8cD4KLQkgKiBUaGlzIGNyZWF0ZXMgYW4gPGNvZGU+RWxlbWVudFJlZmVyZW5jZTwvY29kZT4gZm9yIHRoZSBnaXZlbiBlbGVtZW50Ci0JICogdGhhdCBwb2ludHMgdG8gYWxsIHRoZSByZWZlcmVuY2VkIGVsZW1lbnRzLCBhbmQgYWRkcyB0aGUgZ2l2ZW4gZWxlbWVudCBhcwotCSAqIGEgZGVwZW5kZW50IGVsZW1lbnQgdG8gYWxsIHRoZSByZWZlcmVuY2VkIGVsZW1lbnRzLiBUaGlzIHNob3VsZCBvbmx5IGJlCi0JICogY2FsbGVkIG9uY2UgZm9yIGVhY2ggbWV0aG9kIGVsZW1lbnQuCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiAgICAgICAgICAgIEEgbWV0aG9kIGVsZW1lbnQuCi0JICogQHJldHVybiBBIDxjb2RlPlBhY2thZ2VEZXBlbmRlbmN5PC9jb2RlPi4KLQkgKi8KLQlwcml2YXRlIFBhY2thZ2VEZXBlbmRlbmN5IGJ1aWxkRGVwZW5kZW5jeUZvcihNZXRob2RFbGVtZW50IGVsZW1lbnQpIHsKLQkJaWYgKGVsZW1lbnQgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQkvLyBCdWlsZCB0aGUgZGVwZW5kZW5jeSBvbiB0aGUgc2VsZWN0YWJsZSBlbGVtZW50L3BhcmVudCBvbmx5Ci0JCU1ldGhvZEVsZW1lbnQgc2VsZWN0YWJsZUVsZW1lbnQgPSAoTWV0aG9kRWxlbWVudClMaWJyYXJ5VXRpbC5nZXRTZWxlY3RhYmxlKGVsZW1lbnQpOwotCQlpZiAoc2VsZWN0YWJsZUVsZW1lbnQgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlQYWNrYWdlRGVwZW5kZW5jeSBkZXBlbmRlbmN5ID0gZ2V0RGVwZW5kZW5jeShzZWxlY3RhYmxlRWxlbWVudCwgdHJ1ZSk7Ci0KLQkJLy8gUmVtb3ZlIGFueSBleGlzdGluZyBlbGVtZW50IHJlZmVyZW5jZSBmb3IgdGhpcyBlbGVtZW50LgotCQlkZXBlbmRlbmN5LnJlbW92ZVJlZmVyZW5jZShlbGVtZW50KTsKLS8qCi0JCS8vIEdldCB0aGUgVmFyaWFiaWxpdHlFbGVtZW50LgotCQlDb250ZW50RWxlbWVudCBiYXNlRWxlbWVudCA9IG51bGw7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgQ29udGVudEVsZW1lbnQpIHsKLQkJCWJhc2VFbGVtZW50ID0gKENvbnRlbnRFbGVtZW50KSAoKENvbnRlbnRFbGVtZW50KSBlbGVtZW50KQotCQkJCQkuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpOwotCQkJaWYgKGJhc2VFbGVtZW50ICE9IG51bGwpIHsKLQkJCQkvLyBFc3RhYmxpc2ggdGhlIHBhY2thZ2UgcmVmZXJlbmNlLgotCQkJCUVPYmplY3Qgc2VsZWN0YWJsZUJhc2UgPSBMaWJyYXJ5VXRpbC5nZXRTZWxlY3RhYmxlKGJhc2VFbGVtZW50KTsKLQkJCQlpZiAoc2VsZWN0YWJsZUJhc2UgIT0gbnVsbCkgewotCQkJCQlQYWNrYWdlUmVmZXJlbmNlIHBrZ1JlZiA9IGRlcGVuZGVuY3kuZ2V0UmVmZXJlbmNlKAotCQkJCQkJCXNlbGVjdGFibGVCYXNlLCB0cnVlKTsKLQotCQkJCQlpZiAoIXBrZ1JlZi5oYXNSZWZlcmVuY2UoZWxlbWVudCwgYmFzZUVsZW1lbnQpKSB7Ci0JCQkJCQkvLyBBZGQgdGhlIGRldGFpbCBlbGVtZW50IHJlZmVyZW5jZSB0byB0aGUgcGFja2FnZQotCQkJCQkJLy8gcmVmZXJlbmNlLgotCQkJCQkJVmFyaWFiaWxpdHlFbGVtZW50UmVmZXJlbmNlIHJlZiA9IG5ldyBWYXJpYWJpbGl0eUVsZW1lbnRSZWZlcmVuY2UoCi0JCQkJCQkJCWVsZW1lbnQsIGJhc2VFbGVtZW50KTsKLQkJCQkJCXBrZ1JlZi5hZGRSZWZlcmVuY2UocmVmKTsKLQkJCQkJfQotCi0JCQkJCS8vIFNldCB0aGUgZGVwZW5kZW50IG9mIHRoZSByZWZlcmVuY2VkIHBhY2thZ2UuCi0JCQkJCWdldERlcGVuZGVuY3koc2VsZWN0YWJsZUJhc2UsIHRydWUpLmFkZERlcGVuZGVudCgKLQkJCQkJCQlzZWxlY3RhYmxlRWxlbWVudCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJTGlzdCByZWZlcmVuY2VzID0gZWxlbWVudC5lQ3Jvc3NSZWZlcmVuY2VzKCk7Ci0KLQkJLy8gVXBkYXRlIHRoZSBkZXBlbmRlbnRzIG9mIHRob3NlIGVsZW1lbnRzIGluIHRoZSBsaXN0LgotCQlpZiAocmVmZXJlbmNlcyAhPSBudWxsICYmIHJlZmVyZW5jZXMuc2l6ZSgpID4gMCkgewotCQkJLy8gR2V0IHRoZSBzZWxlY3RhYmxlIHJlZmVyZW5jZXMKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSByZWZlcmVuY2VzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlFT2JqZWN0IHJlZkVsZW1lbnQgPSAoRU9iamVjdCkgaXQubmV4dCgpOwotCQkJCUVPYmplY3Qgc2VsZWN0YWJsZVJlZiA9IExpYnJhcnlVdGlsLmdldFNlbGVjdGFibGUocmVmRWxlbWVudCk7Ci0JCQkJaWYgKHNlbGVjdGFibGVSZWYgIT0gbnVsbCkgewotCQkJCQlQYWNrYWdlUmVmZXJlbmNlIHBrZ1JlZiA9IGRlcGVuZGVuY3kuZ2V0UmVmZXJlbmNlKAotCQkJCQkJCXNlbGVjdGFibGVSZWYsIHRydWUpOwotCi0JCQkJCWlmIChlbGVtZW50ID09IHNlbGVjdGFibGVFbGVtZW50Ci0JCQkJCQkJJiYgcmVmRWxlbWVudCA9PSBzZWxlY3RhYmxlUmVmKSB7Ci0JCQkJCQkvLyBObyBuZWVkIHRvIGFkZCB0aGlzLgotCQkJCQkJY29udGludWU7Ci0JCQkJCX0KLQotCQkJCQlpZiAoIXBrZ1JlZi5oYXNSZWZlcmVuY2UoZWxlbWVudCwgcmVmRWxlbWVudCkpIHsKLQkJCQkJCUdlbmVyYWxSZWZlcmVuY2UgcmVmID0gbmV3IEdlbmVyYWxSZWZlcmVuY2UoZWxlbWVudCwKLQkJCQkJCQkJcmVmRWxlbWVudCk7Ci0JCQkJCQlwa2dSZWYuYWRkUmVmZXJlbmNlKHJlZik7Ci0JCQkJCX0KLQotCQkJCQlnZXREZXBlbmRlbmN5KHNlbGVjdGFibGVSZWYsIHRydWUpLmFkZERlcGVuZGVudCgKLQkJCQkJCQlzZWxlY3RhYmxlRWxlbWVudCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0qLwotCQlMaXN0IHByb3BlcnRpZXMgPSBMaWJyYXJ5VXRpbC5nZXRTdHJ1Y3R1cmFsRmVhdHVyZXMoZWxlbWVudCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcHJvcGVydGllcy5zaXplKCk7IGkrKykgewotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGYgPSAoRVN0cnVjdHVyYWxGZWF0dXJlKSBwcm9wZXJ0aWVzLmdldChpKTsKLQkJCWlmICghKGYgaW5zdGFuY2VvZiBFUmVmZXJlbmNlKSApIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCQotCQkJRVJlZmVyZW5jZSBmZWF0dXJlID0gKEVSZWZlcmVuY2UpZjsKLQkJCWlmICggZmVhdHVyZS5pc0NvbnRhaW5lcigpIHx8IGZlYXR1cmUuaXNDb250YWlubWVudCgpICkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJCQkJCi0JCQlPYmplY3QgdmFsdWUgPSBlbGVtZW50LmVHZXQoZmVhdHVyZSk7Ci0JCQlpZiAoIHZhbHVlID09IG51bGwgKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQkKLQkJCU1ldGhvZEVsZW1lbnQgcmVmRWxlbWVudCA9IG51bGw7Ci0JCQlMaXN0IHZhbHVlcyA9IG51bGw7Ci0JCQlpbnQgY291bnQgPSAwOwotCQkJCi0JCQlpZiAoIGZlYXR1cmUuaXNNYW55KCkgKSB7Ci0JCQkJdmFsdWVzID0gKExpc3QpdmFsdWU7Ci0JCQkJaWYgKCB2YWx1ZXMuc2l6ZSgpID4gMCApIHsKLQkJCQkJcmVmRWxlbWVudCA9IChNZXRob2RFbGVtZW50KXZhbHVlcy5nZXQoY291bnQpOwotCQkJCX0KLQkJCX0gZWxzZSBpZiAoIHZhbHVlIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCApIHsKLQkJCQlyZWZFbGVtZW50ID0gKE1ldGhvZEVsZW1lbnQpdmFsdWU7CQkJCQotCQkJCQotCQkJCWlmIChyZXBsYWNlclNldCAhPSBudWxsKSB7Ci0JCQkJCWlmIChmZWF0dXJlID09IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFZhcmlhYmlsaXR5RWxlbWVudF9WYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkpIHsKLQkJCQkJCVZhcmlhYmlsaXR5RWxlbWVudCB2ZSA9IGVsZW1lbnQgaW5zdGFuY2VvZiBWYXJpYWJpbGl0eUVsZW1lbnQgPwotCQkJCQkJCQkoVmFyaWFiaWxpdHlFbGVtZW50KSBlbGVtZW50IDogbnVsbDsKLQkJCQkJCVZhcmlhYmlsaXR5VHlwZSB0eXBlID0gdmUgPT0gbnVsbCA/IG51bGwgOiB2ZS5nZXRWYXJpYWJpbGl0eVR5cGUoKTsKLQkJCQkJCWlmICh0eXBlID09IFZhcmlhYmlsaXR5VHlwZS5FWFRFTkRTX1JFUExBQ0VTIHx8Ci0JCQkJCQkJCXR5cGUgPT0gVmFyaWFiaWxpdHlUeXBlLlJFUExBQ0VTKSB7Ci0JCQkJCQkJcmVwbGFjZXJTZXQuYWRkKHZlKTsKLQkJCQkJCX0KLQkJCQkJfQkJCQkKLQkJCQl9Ci0JCQl9Ci0JCQkgCi0JCQl3aGlsZSAoIHJlZkVsZW1lbnQgIT0gbnVsbCApIHsKLQkJCQkKLQkJCQlib29sZWFuIHNraXAgPSBmYWxzZTsKLQkJCQlpZiAoZmVhdHVyZSA9PSBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRSb2xlX01vZGlmaWVzKCkpIHsKLQkJCQkJc2tpcCA9IHRydWU7Ci0JCQkJfQkJCQkKLQkJCQkKLQkJCQlNZXRob2RFbGVtZW50IHNlbGVjdGFibGVSZWYgPSBza2lwID8gbnVsbCA6IChNZXRob2RFbGVtZW50KUxpYnJhcnlVdGlsLmdldFNlbGVjdGFibGUocmVmRWxlbWVudCk7Ci0JCQkJaWYgKHNlbGVjdGFibGVSZWYgIT0gbnVsbCkgewotCQkJCQlQYWNrYWdlUmVmZXJlbmNlIHBrZ1JlZiA9IGRlcGVuZGVuY3kuZ2V0UmVmZXJlbmNlKAotCQkJCQkJCXNlbGVjdGFibGVSZWYsIHRydWUpOwotCQotCQkJCQlpZiAoZWxlbWVudCA9PSBzZWxlY3RhYmxlRWxlbWVudAotCQkJCQkJCSYmIHJlZkVsZW1lbnQgPT0gc2VsZWN0YWJsZVJlZikgewotCQkJCQkJLy8gTm8gbmVlZCB0byBhZGQgdGhpcy4KLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCi0JCQkJCUVsZW1lbnRSZWZlcmVuY2UgcmVmID0gcGtnUmVmLmdldFJlZmVyZW5jZShlbGVtZW50LCByZWZFbGVtZW50KTsKLQkJCQkJaWYgKHJlZiA9PSBudWxsKSB7Ci0JCQkJCQlyZWYgPSBuZXcgRWxlbWVudFJlZmVyZW5jZShlbGVtZW50LCByZWZFbGVtZW50KTsKLQkJCQkJCXBrZ1JlZi5hZGRSZWZlcmVuY2UocmVmKTsKLQkJCQkJfQotCQotCQkJCQlyZWYuYWRkRmVhdHVyZShmZWF0dXJlKTsKLQkJCQkJCi0JCQkJCWdldERlcGVuZGVuY3koc2VsZWN0YWJsZVJlZiwgdHJ1ZSkuYWRkRGVwZW5kZW50KAotCQkJCQkJCXNlbGVjdGFibGVFbGVtZW50KTsKLQkJCQl9Ci0JCQkJCi0JCQkJcmVmRWxlbWVudCA9IG51bGw7Ci0JCQkJaWYgKCB2YWx1ZXMgIT0gbnVsbCApIHsKLQkJCQkJY291bnQrKzsKLQkJCQkJaWYgKCBjb3VudCA8IHZhbHVlcy5zaXplKCkgKSB7Ci0JCQkJCQlyZWZFbGVtZW50ID0gKE1ldGhvZEVsZW1lbnQpdmFsdWVzLmdldChjb3VudCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCQotCQlyZXR1cm4gZGVwZW5kZW5jeTsKLQl9Ci0KLQlwcml2YXRlIFBhY2thZ2VEZXBlbmRlbmN5IGdldERlcGVuZGVuY3koTWV0aG9kRWxlbWVudCBlbGVtZW50LCBib29sZWFuIGNyZWF0ZSkgewotCQlpZiAoIUxpYnJhcnlVdGlsLnNlbGVjdGFibGUoZWxlbWVudCkpIHsKLQkJCWlmIChkZWJ1ZykgewotCQkJCVN5c3RlbS5vdXQKLQkJCQkJCS5wcmludGxuKCJFcnJvciwgU2VsZWN0YWJsZSBlbGVtZW50IHJlcXVpcmVkOiAiICsgZWxlbWVudCk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJUGFja2FnZURlcGVuZGVuY3kgZGVwZW5kZW5jeSA9IChQYWNrYWdlRGVwZW5kZW5jeSkgZGVwZW5kZW5jeU1hcAotCQkJCS5nZXQoZWxlbWVudCk7Ci0JCWlmIChkZXBlbmRlbmN5ID09IG51bGwgJiYgY3JlYXRlKSB7Ci0JCQlkZXBlbmRlbmN5ID0gbmV3IFBhY2thZ2VEZXBlbmRlbmN5KGVsZW1lbnQpOwotCQkJZGVwZW5kZW5jeU1hcC5wdXQoZWxlbWVudCwgZGVwZW5kZW5jeSk7Ci0JCX0KLQotCQlyZXR1cm4gZGVwZW5kZW5jeTsKLQotCX0KLQotCXByaXZhdGUgdm9pZCBoYW5kbGVEZWxldGVkRWxlbWVudChDb2xsZWN0aW9uIGNoYW5nZWRJdGVtcykgewotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gY2hhbmdlZEl0ZW1zLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gaXQubmV4dCgpOwotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQkJcmVtb3ZlUmVmZXJlbmNlKChNZXRob2RFbGVtZW50KSBlbGVtZW50KTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFJlbW92ZXMgdGhlIGVsZW1lbnQgcmVmZXJlbmNlIGZvciB0aGUgc3BlY2lmaWVkIGVsZW1lbnQsIHJlYnVpbGQgbGF0ZXIKLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqICAgICAgICAgICAgQSBtZXRob2QgZWxlbWVudC4KLQkgKi8KLQlwcml2YXRlIHZvaWQgcmVtb3ZlUmVmZXJlbmNlKE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgewotCQlQYWNrYWdlRGVwZW5kZW5jeSBkZXBlbmRlbmN5ID0gbnVsbDsKLQotCQlNZXRob2RFbGVtZW50IHBrZyA9IChNZXRob2RFbGVtZW50KSBMaWJyYXJ5VXRpbC5nZXRTZWxlY3RhYmxlKGVsZW1lbnQpOwotCQlpZiAoKHBrZyA9PSBudWxsKSB8fCAoKGRlcGVuZGVuY3kgPSBnZXREZXBlbmRlbmN5KHBrZywgZmFsc2UpKSA9PSBudWxsKSkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJZGVwZW5kZW5jeS5yZW1vdmVSZWZlcmVuY2UoZWxlbWVudCk7Ci0JfQotCi0JcHVibGljIFNldDxWYXJpYWJpbGl0eUVsZW1lbnQ+IGdldFJlcGxhY2VyU2V0KCkgewotCQlyZXR1cm4gcmVwbGFjZXJTZXQ7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UmVwbGFjZXJTZXQoU2V0PFZhcmlhYmlsaXR5RWxlbWVudD4gcmVwbGFjZXJTZXQpIHsKLQkJdGhpcy5yZXBsYWNlclNldCA9IHJlcGxhY2VyU2V0OwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2NvbmZpZ3VyYXRpb24vY2xvc3VyZS9FbGVtZW50RGVwZW5kZW5jeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2NvbmZpZ3VyYXRpb24vY2xvc3VyZS9FbGVtZW50RGVwZW5kZW5jeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOTQyYWYyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9jb25maWd1cmF0aW9uL2Nsb3N1cmUvRWxlbWVudERlcGVuZGVuY3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLmNsb3N1cmU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLQotLyoqCi0gKiBIb2xkcyB0aGUgYSBsaXN0IG9mIHBhY2thZ2UgcmVmZXJlbmNlcyBvZiBvbmUgcGFja2FnZSBlbGVtZW50IGl0IGFsc28gaG9sZHMgYQotICogbGlzdCBvZiBkZXBlbmRhbnQgcGFja2FnZSBlbGVtZW50cwotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRWxlbWVudERlcGVuZGVuY3kgewotCi0JLy8gdGhlIHBhY2thZ2UgZWxlbWVudAotCXByb3RlY3RlZCBNZXRob2RFbGVtZW50IGVsZW1lbnQ7Ci0KLQkvKioKLQkgKiBsaXN0IG9mIEVsZW1lbnRSZWZlcmVuY2Ugb2JqZWN0cywgZWFjaCBFbGVtZW50UmVmZXJlbmNlIG9iamVjdCBob2xkcyBhCi0JICogbGlzdCBvZiByZWZlcmVuY2VzIG9mIHRoZSBzYW1lIHR5cGUKLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCByZWZlcmVuY2VzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JLyoqCi0JICogZGVwZW5kZW50cwotCSAqLwotCXByb3RlY3RlZCBMaXN0IGRlcGVuZGVudHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQlwcm90ZWN0ZWQgRWxlbWVudERlcGVuZGVuY3koTWV0aG9kRWxlbWVudCBlbGVtZW50KSB7Ci0JCXRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogZ2V0IHRoZSBlbGVtZW50Ci0JICogQHJldHVybiBPYmplY3QKLQkgKi8KLQlwdWJsaWMgTWV0aG9kRWxlbWVudCBnZXRFbGVtZW50KCkgewotCQlyZXR1cm4gZWxlbWVudDsKLQl9Ci0KLQkvKioKLQkgKiBnZXQgYSBsaXN0IG9mIGVsZW1lbnRzIHRoaXMgZWxlbWVudCBkZXBlbmRzIG9uCi0JICogCi0JICogQHJldHVybiBMaXN0IGEgbGlzdCBvZiBFbGVtZW50UmVmZXJlbmNlIG9iamVjdHMKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRSZWZlcmVuY2VzKCkgewotCQlyZXR1cm4gcmVmZXJlbmNlczsKLQl9Ci0KLQkvKioKLQkgKiBnZXQgdGhlIEVsZW1lbnRSZWZlcmVuY2Ugd2l0aCB0aGUgZ2l2ZW4gcmVmRWxlbWVudCB0aGF0IHRoZSBjdXJyZW50Ci0JICogZWxlbWVudCByZWNlcmVuY2VzIHRvLgotCSAqIAotCSAqIEBwYXJhbSBSZWZFbGVtZW50Ci0JICogICAgICAgICAgICB0aGUgZWxlbWVudCB0byB3aGljaCB0aGUgY3VycmVudCBlbGVtZW50IHJlZmVyZW5jZXMKLQkgKiBAcmV0dXJuIEVsZW1lbnRSZWZlcmVuY2UKLQkgKi8KLQlwdWJsaWMgRWxlbWVudFJlZmVyZW5jZSBnZXRSZWZlcmVuY2UoTWV0aG9kRWxlbWVudCByZWZFbGVtZW50KSB7Ci0JCUVsZW1lbnRSZWZlcmVuY2UgcmVmOwotCQlPYmplY3QgcmVmRWw7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSByZWZlcmVuY2VzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCXJlZiA9IChFbGVtZW50UmVmZXJlbmNlKSBpdC5uZXh0KCk7Ci0JCQlyZWZFbCA9IHJlZi5nZXRSZWZFbGVtZW50KCk7Ci0JCQlpZiAocmVmRWwgIT0gbnVsbCAmJiByZWZFbCA9PSByZWZFbGVtZW50KSB7Ci0JCQkJcmV0dXJuIHJlZjsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIGdldCB0aGUgbGlzdCBvZiBlbGVtZW50cyB0aGF0IGRlcGVuZCBvbiB0aGlzIGVsZW1lbnQKLQkgKiBAcmV0dXJuIExpc3QKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXREZXBlbmRlbnRzKCkgewotCQlyZXR1cm4gZGVwZW5kZW50czsKLQl9Ci0KLQkvKioKLQkgKiBhZGQgYSBkZXBlbmRlbnQKLQkgKiBAcGFyYW0gZWwgT2JqZWN0Ci0JICovCi0JcHVibGljIHZvaWQgYWRkRGVwZW5kZW50KE1ldGhvZEVsZW1lbnQgZWwpIHsKLQkJaWYgKCFkZXBlbmRlbnRzLmNvbnRhaW5zKGVsKSkgewotCQkJZGVwZW5kZW50cy5hZGQoZWwpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogYWRkIGEgcmVmZXJlbmNlCi0JICogQHBhcmFtIHJlZiBFbGVtZW50UmVmZXJlbmNlCi0JICovCi0JcHVibGljIHZvaWQgYWRkUmVmZXJlbmNlKEVsZW1lbnRSZWZlcmVuY2UgcmVmKSB7Ci0JCXJlZmVyZW5jZXMuYWRkKHJlZik7Ci0JfQotCi0JLyoqCi0JICogcHJpbnQgb3V0IHRoZSByZWZlcmVuY2VzLiBUaGlzIGlzIGEgZGVidWdnaW5nIG1ldGhvZC4KLQkgKgotCSAqLwotCXB1YmxpYyB2b2lkIHByaW50KCkgewotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gcmVmZXJlbmNlcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgcmVmID0gaXQubmV4dCgpOwotCQkJaWYgKHJlZiBpbnN0YW5jZW9mIFBhY2thZ2VSZWZlcmVuY2UpIHsKLQkJCQkoKFBhY2thZ2VSZWZlcmVuY2UpIHJlZikucHJpbnQoKTsKLQkJCX0gZWxzZSB7Ci0JCQkJKChFbGVtZW50UmVmZXJlbmNlKSByZWYpLnByaW50KCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9jb25maWd1cmF0aW9uL2Nsb3N1cmUvRWxlbWVudERlcGVuZGVuY3lFcnJvci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2NvbmZpZ3VyYXRpb24vY2xvc3VyZS9FbGVtZW50RGVwZW5kZW5jeUVycm9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwZTRmZWMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2NvbmZpZ3VyYXRpb24vY2xvc3VyZS9FbGVtZW50RGVwZW5kZW5jeUVycm9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5jbG9zdXJlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGhvbGRzIHRoZSBlbGVtZW50IGRlcGVuZGVuY3kgZXJyb3IgaW4gYSBjb25maWd1cmF0aW9uIGNsb3N1cmUuCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBFbGVtZW50RGVwZW5kZW5jeUVycm9yIHsKLQotCS8vIHRoZSBlcnJvciBlbGVtZW50LCBjb3VsZCBiZSBhIE1ldGhvZFBhY2thZ2Ugb3IgYSBVSSBwYWNrYWdlCi0JcHJpdmF0ZSBPYmplY3QgZXJyb3JFbGVtZW50OwotCi0JLyoqCi0JICogbWFwIG9mIGNhdXNlZWxlbWVudCB0byB0aGUgRXJyb3JJbmZvIG9iamVjdAotCSAqLwotCXByaXZhdGUgTWFwPE9iamVjdCwgUGFja2FnZUVycm9yPiBlcnJvckluZm9NYXAgPSBuZXcgSGFzaE1hcDxPYmplY3QsIFBhY2thZ2VFcnJvcj4oKTsKLQotCXByaXZhdGUgaW50IGVycm9yQml0cyA9IDA7Ci0KLQkvKioKLQkgKiBjb25zdHJ1Y3RvcgotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICovCi0JcHVibGljIEVsZW1lbnREZXBlbmRlbmN5RXJyb3IoT2JqZWN0IGVsZW1lbnQpIHsKLQkJdGhpcy5lcnJvckVsZW1lbnQgPSBlbGVtZW50OwotCX0KLQotCS8qKgotCSAqIGdldCB0aGUgZWxlbWVudCB0aGF0IGNvbnRhaW5zIHRoZSBlcnJvcgotCSAqIEByZXR1cm4gT2JqZWN0Ci0JICovCi0JcHVibGljIE9iamVjdCBnZXRFcnJvckVsZW1lbnQoKSB7Ci0JCXJldHVybiBlcnJvckVsZW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogZ2V0IHRoZSBlbGVtZW50cyB0aGF0IGNhdXNlZCB0aGUgZXJyb3IKLQkgKiBAcmV0dXJuIE9iamVjdFtdCi0JICovCi0JcHVibGljIE9iamVjdFtdIGdldENhdXNlRWxlbWVudHMoKSB7Ci0JCXJldHVybiBlcnJvckluZm9NYXAua2V5U2V0KCkudG9BcnJheSgpOwotCX0KLQotCS8qKgotCSAqIGdldCB0aGUgY291bnQgb2YgdGhlIGVycm9yIGluZm8gZW50cnkKLQkgKiBAcmV0dXJuIGludAotCSAqLwotCXB1YmxpYyBpbnQgc2l6ZSgpIHsKLQkJcmV0dXJuIGVycm9ySW5mb01hcC5zaXplKCk7Ci0JfQotCi0JLyoqCi0JICogYWRkIGFuIGVycm9yIGVudHJ5Ci0JICogQHBhcmFtIGVycm9ySW5mbyBQYWNrYWdlRXJyb3IKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRFcnJvcihQYWNrYWdlRXJyb3IgZXJyb3JJbmZvKSB7Ci0JCWVycm9ySW5mb01hcC5wdXQoZXJyb3JJbmZvLmdldENhdXNlRWxlbWVudCgpLCBlcnJvckluZm8pOwotCQllcnJvckJpdHMgfD0gZXJyb3JJbmZvLmdldEVycm9yTGV2ZWwoKTsKLQl9Ci0KLQkvKioKLQkgKiByZW1vdmUgdGhlIGVycm9yIGFzc29jaWF0ZWQgd2l0aCB0aGUgY2F1c2VFbGVtZW50Ci0JICogCi0JICogQHBhcmFtIGNhdXNlRWxlbWVudAotCSAqICAgICAgICAgICAgT2JqZWN0IHRoZSBlbGVtZW50IHRoYXQgY2F1c2VkIHRoZSBlcnJvcgotCSAqLwotCXB1YmxpYyBQYWNrYWdlRXJyb3IgcmVtb3ZlRXJyb3IoT2JqZWN0IGNhdXNlRWxlbWVudCkgewotCQlQYWNrYWdlRXJyb3IgZXJyb3IgPSBlcnJvckluZm9NYXAucmVtb3ZlKGNhdXNlRWxlbWVudCk7Ci0KLQkJLy8gcmVjYWxjdWxhdGUgdGhlIGVycm9yIGJpdHMKLQkJY2FsY3VsYXRlRXJyb3JCaXRzKCk7Ci0JCQotCQlyZXR1cm4gZXJyb3I7Ci0JfQotCi0JLyoqCi0JICogcmVtb3ZlIHRoZSBlcnJvciBhc3NvY2lhdGVkIHdpdGggdGhlIGNhdXNlRWxlbWVudAotCSAqIAotCSAqIEBwYXJhbSBjYXVzZUVsZW1lbnQKLQkgKiAgICAgICAgICAgIE9iamVjdCB0aGUgZWxlbWVudCB0aGF0IGNhdXNlZCB0aGUgZXJyb3IKLQkgKi8KLQlwdWJsaWMgUGFja2FnZUVycm9yIGdldEVycm9yKE9iamVjdCBjYXVzZUVsZW1lbnQpIHsKLQkJcmV0dXJuIGVycm9ySW5mb01hcC5nZXQoY2F1c2VFbGVtZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBnZXQgYSBsaXN0IG9mIGFsbCBFcnJJbmZvIG9iamVjdHMKLQkgKiAKLQkgKiBAcmV0dXJuIExpc3QgYSBsaXN0IG9mIEVycm9ySW5mbyBvYmplY3RzCi0JICovCi0JcHVibGljIExpc3Q8UGFja2FnZUVycm9yPiBnZXRBbGwoKSB7Ci0JCXJldHVybiBuZXcgQXJyYXlMaXN0PFBhY2thZ2VFcnJvcj4oZXJyb3JJbmZvTWFwLnZhbHVlcygpKTsKLQl9Ci0KLQkvKioKLQkgKiBjaGVjayB0aGlzIGlzIGFuIGVycm9yIG9yIG5vdC4KLQkgKiAKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0Vycm9yKCkgewotCQlyZXR1cm4gKGVycm9yQml0cyAmIEVycm9ySW5mby5FUlJPUikgPiAwOwotCX0KLQotCS8qKgotCSAqIGNoZWNrIGlmIHRoaXMgaXMgYSB3YXJuaW5nCi0JICogCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNXYXJuaW5nKCkgewotCQlyZXR1cm4gKGVycm9yQml0cyAmIEVycm9ySW5mby5XQVJOSU5HKSA+IDA7Ci0JfQotCi0JLyoqCi0JICogY2hlY2sgaWYgdGhpcyBpcyBkdWUgdG8gYW4gZXJyb3IgaW4gaXQncyBjaGlsZHJlbgotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQ2hpbGRFcnJvcigpIHsKLQkJcmV0dXJuIChlcnJvckJpdHMgJiBQYWNrYWdlRXJyb3IuQ0hJTERfRVJST1IpID4gMDsKLQl9Ci0KLQkvKioKLQkgKiBjaGVjayBpZiB0aGlzIGlzIGR1ZSB0byBhIHdhcm5pbmcgaW4gaXQncyBjaGlsZHJlbgotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQ2hpbGRXYXJuaW5nKCkgewotCQlyZXR1cm4gKGVycm9yQml0cyAmIFBhY2thZ2VFcnJvci5DSElMRF9XQVJOSU5HKSA+IDA7Ci0JfQotCi0JcHVibGljIHZvaWQgY2FsY3VsYXRlRXJyb3JCaXRzKCkgewotCQllcnJvckJpdHMgPSAwOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gZXJyb3JJbmZvTWFwLnZhbHVlcygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCWVycm9yQml0cyB8PSAoKEVycm9ySW5mbykgaXQubmV4dCgpKS5nZXRFcnJvckxldmVsKCk7Ci0JCX0KLQl9Ci0JCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvY29uZmlndXJhdGlvbi9jbG9zdXJlL0VsZW1lbnRFcnJvci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2NvbmZpZ3VyYXRpb24vY2xvc3VyZS9FbGVtZW50RXJyb3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjMzNzE4Ni4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvY29uZmlndXJhdGlvbi9jbG9zdXJlL0VsZW1lbnRFcnJvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLmNsb3N1cmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBpZGVudGlmaWVzIGEgY29uZmlndXJhdGlvbiBlcnJvciBiZXR3ZWVuIHR3byBlbGVtZW50cwotICogCi0gKiBAYXV0aG9yIGp4aQotICoKLSAqLwotcHVibGljIGNsYXNzIEVsZW1lbnRFcnJvciAgZXh0ZW5kcyBFcnJvckluZm8gaW1wbGVtZW50cyBJQ29uZmlndXJhdGlvbkVycm9yIHsKLQotCS8vIG5lZWQgdGhlIGNvbmZpZyBpZCB0byB1bmlxdWVseSBpZGVudGlmeSBhbiBlcnJvcgotCVN0cmluZyBjb25maWdJZDsKLQkKLQlwdWJsaWMgRWxlbWVudEVycm9yKE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnLCAgCi0JCQlpbnQgZXJyb3JMZXZlbCwgU3RyaW5nIG1lc3NhZ2UsIAotCQkJT2JqZWN0IG93bmVyRWxlbWVudCwgT2JqZWN0IGNhdXNlRWxlbWVudCwgCi0JCQlpbnQgcmVsYXRpb24sIFN0cmluZyBtZXNzYWdlSWQpIHsKLQkJc3VwZXIoZXJyb3JMZXZlbCwgbWVzc2FnZSwgb3duZXJFbGVtZW50LCBjYXVzZUVsZW1lbnQsIHJlbGF0aW9uLCBtZXNzYWdlSWQpOwotCQl0aGlzLmNvbmZpZ0lkID0gY29uZmlnLmdldEd1aWQoKTsKLQl9Ci0KLQkKLQkvLyBtZXRob2RzIGZvciB0aGUgSUNvbmZpZ3VyYXRpb25FcnJvcgotCS8vCi0JcHVibGljIE1ldGhvZEVsZW1lbnQgZ2V0Q2F1c2VNZXRob2RFbGVtZW50KCkgewotCQlpZiAoIHRoaXMuY2F1c2VFbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJcmV0dXJuIChNZXRob2RFbGVtZW50KXRoaXMuY2F1c2VFbGVtZW50OwotCQl9Ci0JCQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgTWV0aG9kRWxlbWVudCBnZXRFcnJvck1ldGhvZEVsZW1lbnQoKSB7Ci0JCWlmICggdGhpcy5vd25lckVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50ICkgewotCQkJcmV0dXJuIChNZXRob2RFbGVtZW50KXRoaXMub3duZXJFbGVtZW50OwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCU1ldGhvZEVsZW1lbnQgbTEgPSBnZXRFcnJvck1ldGhvZEVsZW1lbnQoKTsKLQkJTWV0aG9kRWxlbWVudCBtMiA9IGdldENhdXNlTWV0aG9kRWxlbWVudCgpOwotCQlpZiAoIG0xICE9IG51bGwgJiYgbTIgIT0gbnVsbCApIHsKLQkJCXJldHVybiBjb25maWdJZCArICIsIiArIG0xLmdldEd1aWQoKSArICIsIiArIG0yLmdldEd1aWQoKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQkJCi0JCXJldHVybiBJbnRlZ2VyLnRvSGV4U3RyaW5nKHRoaXMuaGFzaENvZGUoKSk7Ci0JfQotCi0JcHVibGljIGludCBnZXRTZXZlcml0eSgpIHsKLQkJc3dpdGNoIChnZXRFcnJvckxldmVsKCkgKSB7Ci0JCWNhc2UgRXJyb3JJbmZvLkVSUk9SOgotCQkJcmV0dXJuIElNYXJrZXIuU0VWRVJJVFlfRVJST1I7Ci0JCWNhc2UgRXJyb3JJbmZvLldBUk5JTkc6IAotCQkJcmV0dXJuIElNYXJrZXIuU0VWRVJJVFlfV0FSTklORzsKLQkJfQotCQkKLQkJcmV0dXJuIElNYXJrZXIuU0VWRVJJVFlfSU5GTzsKLQotCX0KLQkKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9jb25maWd1cmF0aW9uL2Nsb3N1cmUvRWxlbWVudFJlZmVyZW5jZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2NvbmZpZ3VyYXRpb24vY2xvc3VyZS9FbGVtZW50UmVmZXJlbmNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyMmU3ZjIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2NvbmZpZ3VyYXRpb24vY2xvc3VyZS9FbGVtZW50UmVmZXJlbmNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5jbG9zdXJlOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5MaWJyYXJ5VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFzazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0OwotCi0KLS8qKgotICogVGhpcyBjbGFzcyBkZWZpbmVzIGFuIEVsZW1lbnQgUmVmZXJlbmNlIGJldHdlZW4gdHdvIGVsZW1lbnRzLgotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRWxlbWVudFJlZmVyZW5jZSB7Ci0KLQlNZXRob2RFbGVtZW50IGVsZW1lbnQsIHJlZkVsZW1lbnQ7Ci0JCi0JLy8gc2F2ZSB0aGUgZmVhdHVyZXMgcmVsYXRpbmcgdG8gdGhpcyByZWZlcmVuY2UKLQlwcml2YXRlIFNldDxFU3RydWN0dXJhbEZlYXR1cmU+IGZlYXR1cmVzID0gbmV3IEhhc2hTZXQ8RVN0cnVjdHVyYWxGZWF0dXJlPigpOwotCQotCi0JLyoqCi0JICogY29uc3RydWN0IHRoZSByZWZlcmVuY2UgaW5zdGFuY2UKLQkgKiBAcGFyYW0gZWxlbWVudCBNZXRob2RFbGVtZW50IHRoZSBlbGVtZW50Ci0JICogQHBhcmFtIHJlZkVsZW1lbnQgTWV0aG9kRWxlbWVudCB0aGUgcmVmZXJlbmNlZCBlbGVtZW50Ci0JICovCi0JcHVibGljIEVsZW1lbnRSZWZlcmVuY2UoTWV0aG9kRWxlbWVudCBlbGVtZW50LCBNZXRob2RFbGVtZW50IHJlZkVsZW1lbnQpIHsKLQkJdGhpcy5lbGVtZW50ID0gZWxlbWVudDsKLQkJdGhpcy5yZWZFbGVtZW50ID0gcmVmRWxlbWVudDsKLQl9Ci0KLQkvKioKLQkgKiBnZXQgdGhlIGVsZW1lbnQKLQkgKiBAcmV0dXJuIE9iamVjdAotCSAqLwotCXB1YmxpYyBNZXRob2RFbGVtZW50IGdldEVsZW1lbnQoKSB7Ci0JCXJldHVybiBlbGVtZW50OwotCX0KLQotCS8qKgotCSAqIGdldCB0aGUgcmVmZXJlbmNlZCBlbGVtZW50Ci0JICogQHJldHVybiBPYmplY3QKLQkgKi8KLQlwdWJsaWMgTWV0aG9kRWxlbWVudCBnZXRSZWZFbGVtZW50KCkgewotCQlyZXR1cm4gcmVmRWxlbWVudDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRGZWF0dXJlKEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKSB7Ci0JCWlmICggIWZlYXR1cmVzLmNvbnRhaW5zKGZlYXR1cmUpICkgewotCQkJZmVhdHVyZXMuYWRkKGZlYXR1cmUpOwotCQl9Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGhhc0ZlYXR1cmUoRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUpIHsKLQkJcmV0dXJuIGZlYXR1cmVzLmNvbnRhaW5zKGZlYXR1cmUpOwotCX0KLQkKLQkvKioKLQkgKiBkZWJ1Z2dpbmcgbWV0aG9kIHRvIHByaW50IG91dCB0aGUgcmVsYXRpb25zaGlwCi0JICoKLQkgKi8KLQlwdWJsaWMgdm9pZCBwcmludCgpIHsKLQkJU3lzdGVtLm91dAotCQkJCS5wcmludGxuKCIgICAgIiArIExpYnJhcnlVdGlsLmdldE5hbWUoZWxlbWVudCkgKyAiIC0tPiAiICsgTGlicmFyeVV0aWwuZ2V0TmFtZShyZWZFbGVtZW50KSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIGNoZWNrIGlmIHRoZSByZWZlcmVuY2UgY2FuIGJlIGlnbm9yZWQKLQkgKiAKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjYW5JZ25vcmUoKSB7Ci0JCS8vIGlmIHRoZSBlbGVtZW50IGhhcyBubyBjb250YWluZXIsIGl0J3MgYSBkZWxldGVkIGVsZW1lbnQsIGlnbm9yZSBpdAotCQlpZiAoKGVsZW1lbnQgaW5zdGFuY2VvZiBFT2JqZWN0KQotCQkJCSYmICgoRU9iamVjdCkgZWxlbWVudCkuZUNvbnRhaW5lcigpID09IG51bGwKLQkJCQl8fCAocmVmRWxlbWVudCBpbnN0YW5jZW9mIEVPYmplY3QpCi0JCQkJJiYgKChFT2JqZWN0KSByZWZFbGVtZW50KS5lQ29udGFpbmVyKCkgPT0gbnVsbCkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQotCQkvLyBEb24ndCB3YXJuIG9uIG9wdGlvbmFsIGlucHV0cyBub3QgYmVpbmcgcHJlc2VudAotCQkvLyBzbyBhZGRlZCB0aGUgY2FuSWdub3JlKCkgbWV0aG9kCi0JCWlmICgoZWxlbWVudCBpbnN0YW5jZW9mIFRhc2spICYmIChyZWZFbGVtZW50IGluc3RhbmNlb2YgV29ya1Byb2R1Y3QpKSB7Ci0JCQkvLyBpZiBpdCdzIGEgbWFuZGF0b3J5IGlucHV0LCBjYW4gaWdub3JlCi0JCQlpZiAoKChUYXNrKSBlbGVtZW50KS5nZXRNYW5kYXRvcnlJbnB1dCgpLmNvbnRhaW5zKHJlZkVsZW1lbnQpKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCi0JCQkvLyBub3QgbWFuZGF0b3J5LCBidXQgb3B0aW9uYWwsIG9rLCBpZ25vcmUgaXQKLQkJCWlmICgoKFRhc2spIGVsZW1lbnQpLmdldE9wdGlvbmFsSW5wdXQoKS5jb250YWlucyhyZWZFbGVtZW50KSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0KLQkJLy8gcm9sZSdzIG1vZGlmaWVzIGZlYXR1cmUgaXMgYWN0dWFsbHkgYSBkZXJlaXZlZCBvcHBvc2l0ZSBmZWF0dXJlLAotCQkvLyBpdCdzIHZhbHVlIGNhbiBiZSBhbiBlbGVtZW50IG5vdCB2aXNpYmxlIHRvIHRoaXMgcGx1Z2luCi0JCS8vIGlnbm9yZSBpdAotCQkvLyBJbnZhbGlkIGNvbmZpZ3VyYXRpb24gZGVwZW5kZW5jeSBlcnJvciByZXBvcnRlZAotCQlpZiAoKGVsZW1lbnQgaW5zdGFuY2VvZiBSb2xlKSAmJiAocmVmRWxlbWVudCBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0KSkgewotCQkJUm9sZSByID0gKFJvbGUpIGVsZW1lbnQ7Ci0JCQlpZiAoci5nZXRNb2RpZmllcygpLmNvbnRhaW5zKHJlZkVsZW1lbnQpCi0JCQkJCSYmICFyLmdldFJlc3BvbnNpYmxlRm9yKCkuY29udGFpbnMocmVmRWxlbWVudCkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkKLQlwdWJsaWMgRVN0cnVjdHVyYWxGZWF0dXJlIGdldFNpbmdsZUZlYXR1cmUoKSB7Ci0JCWlmIChmZWF0dXJlcyAhPSBudWxsICYmIGZlYXR1cmVzLnNpemUoKSA9PSAxKSB7Ci0JCQlmb3IgKEVTdHJ1Y3R1cmFsRmVhdHVyZSBmOiBmZWF0dXJlcykgewotCQkJCXJldHVybiBmOwotCQkJfQotCQl9CQkKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2NvbmZpZ3VyYXRpb24vY2xvc3VyZS9FcnJvckluZm8uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9jb25maWd1cmF0aW9uL2Nsb3N1cmUvRXJyb3JJbmZvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2Mjk2MjYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2NvbmZpZ3VyYXRpb24vY2xvc3VyZS9FcnJvckluZm8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLmNsb3N1cmU7Ci0KLQotLyoqCi0gKiBBbiBFcnJvckluZm8gb2JqZWN0IGhvbGRzIHRoZSBlcnJvciBtZXNzYWdlIGluZm8gY2F1c2VkIGJ5IGFuIGVsZW1lbnQuIFRoZQotICogRXJyb3JJbmZvIG9iamVjdCBpcyBvd25lZCBieSB0aGUgb3duZXIgZWxlbWVudCB3aGljaCBoYXMgdGhpcyBlcnJvcgotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRXJyb3JJbmZvIHsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOT05FID0gMDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVSUk9SID0gMTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdBUk5JTkcgPSAyOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5GTyA9IDQ7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDSElMRF9FUlJPUiA9IDg7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDSElMRF9XQVJOSU5HID0gMTY7Ci0KLQkvKioKLQkgKiB0aGlzIGRlZmluZXMgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHRoZSBvd25lciBlbGVtZW50IGFuZCB0aGUgY2F1c2UgZWxlbWVudC4gCi0JICogVGhlIG93bmVyIGVsZW1lbnQgcmVmZXJlbmNlcyB0byB0aGUgdGhlIGNhdXNlIGVsZW1lbnQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRUZFUkVOQ0VfVE8gPSAxNjsKLQotCS8qKgotCSAqIHRoaXMgZGVmaW5lcyB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gdGhlIG93bmVyIGVsZW1lbnQgYW5kIHRoZSBjYXVzZSBlbGVtZW50LiAKLQkgKiBUaGUgb3duZXIgZWxlbWVudCBpcyByZWZlcmVuY2VkIGJ5IHRoZSB0aGUgY2F1c2UgZWxlbWVudAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFRkVSRU5DRURfQlkgPSAzMjsKLQotCS8vIGVycm9yIGNhdGVnb3J5Ci0JcHJvdGVjdGVkIFN0cmluZyBjYXRlZ29yeTsKLQkKLQlwcm90ZWN0ZWQgaW50IGVycm9yTGV2ZWw7Ci0KLQlwcm90ZWN0ZWQgT2JqZWN0IG93bmVyRWxlbWVudDsKLQotCXByb3RlY3RlZCBPYmplY3QgY2F1c2VFbGVtZW50OwotCi0JcHJvdGVjdGVkIFN0cmluZyBlcnJvck1lc3NhZ2U7Ci0KLQlwcm90ZWN0ZWQgaW50IHJlbGF0aW9uID0gMDsKLQkKLQlwcml2YXRlIFN0cmluZyBtZXNzYWdlSWQ7Ci0KLQkvL3Byb3RlY3RlZCBDb25maWd1cmF0aW9uQ2xvc3VyZSBjbG9zdXJlID0gbnVsbDsKLQkKLQkvKioKLQkgKiBjb25zdHJ1Y3RvcgotCSAqIAotCSAqIEBwYXJhbSBlcnJvckxldmVsIGludCB0aGUgZXJyb3IgbGV2ZWwKLQkgKiBAcGFyYW0gbWVzc2FnZSBTdHJpbmcgdGhlIGVycm9yIG1lc3NhZ2UKLQkgKiBAcGFyYW0gb3duZXJFbGVtZW50IE9iamVjdCwgdGhlIGVsZW1lbnQgdGhhdCBvd25zIHRoaXMgZXJyb3IKLQkgKiBAcGFyYW0gY2F1c2VFbGVtZW50IE9iamVjdCwgdGhlIGVsZW1lbnQgdGhhdCBjYXVzZWQgdGhpcyBlcnJvcgotCSAqIEBwYXJhbSByZWxhdGlvbiBpbnQgdGhlIHJlbGF0aGlvc2hpcCBiZXR3ZWVuIHRoZSBvd25lciBlbGVtZW50IGFuZCB0aGUgY2F1c2UgZWxlbWVudC4KLQkgKi8KLQlwdWJsaWMgRXJyb3JJbmZvKGludCBlcnJvckxldmVsLCBTdHJpbmcgbWVzc2FnZSwgT2JqZWN0IG93bmVyRWxlbWVudCwKLQkJCU9iamVjdCBjYXVzZUVsZW1lbnQsIGludCByZWxhdGlvbiwgU3RyaW5nIG1lc3NhZ2VJZCkgewotCQkvL3RoaXMuY2xvc3VyZSA9IGNsb3N1cmU7Ci0JCXRoaXMub3duZXJFbGVtZW50ID0gb3duZXJFbGVtZW50OwotCQl0aGlzLmNhdXNlRWxlbWVudCA9IGNhdXNlRWxlbWVudDsKLQkJdGhpcy5lcnJvckxldmVsID0gZXJyb3JMZXZlbDsKLQkJdGhpcy5lcnJvck1lc3NhZ2UgPSBtZXNzYWdlOwotCQl0aGlzLnJlbGF0aW9uID0gcmVsYXRpb247Ci0JCXRoaXMubWVzc2FnZUlkID0gbWVzc2FnZUlkOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gaW50Ci0JICovCi0JcHVibGljIGludCBnZXRSZWxhdGlvbigpIHsKLQkJcmV0dXJuIHJlbGF0aW9uOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gT2JqZWN0Ci0JICovCi0JcHVibGljIE9iamVjdCBnZXRPd25lckVsZW1lbnQoKSB7Ci0JCXJldHVybiBvd25lckVsZW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHJldHVybiBPYmplY3QKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldENhdXNlRWxlbWVudCgpIHsKLQkJcmV0dXJuIGNhdXNlRWxlbWVudDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RXJyb3JNZXNzYWdlKCkgewotCQlyZXR1cm4gZXJyb3JNZXNzYWdlOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gaW50Ci0JICovCi0JcHVibGljIGludCBnZXRFcnJvckxldmVsKCkgewotCQlyZXR1cm4gZXJyb3JMZXZlbDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0Vycm9yKCkgewotCQlyZXR1cm4gKGVycm9yTGV2ZWwgJiBFUlJPUikgPiAwOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzV2FybmluZygpIHsKLQkJcmV0dXJuIChlcnJvckxldmVsICYgV0FSTklORykgPiAwOwotCX0KLQotCS8qKgotCSAqIGdldCB0aGUgZXJyb3IgY2F0ZWdvcnkKLQkgKiAKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q2F0ZWdvcnkoKSB7Ci0JCXJldHVybiBjYXRlZ29yeTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VJZCgpIHsKLQkJcmV0dXJuIG1lc3NhZ2VJZDsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvY29uZmlndXJhdGlvbi9jbG9zdXJlL0lDb25maWd1cmF0aW9uRXJyb3IuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9jb25maWd1cmF0aW9uL2Nsb3N1cmUvSUNvbmZpZ3VyYXRpb25FcnJvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNTUwNjYyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9jb25maWd1cmF0aW9uL2Nsb3N1cmUvSUNvbmZpZ3VyYXRpb25FcnJvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5jbG9zdXJlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotCi0vKioKLSAqIEludGVyZmFjZSBmb3IgQ29uZmlndXJhdGlvbiBlcnJvcnMKLSAqIEBhdXRob3IgSmVmZiBIYXJkeQotICogQGF1dGhvciBKaW5odWEgWGkKLSAqCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUNvbmZpZ3VyYXRpb25FcnJvciB7Ci0JCi0JLyoqCi0JICogCi0JICogQHJldHVybiB0cnVlIGlmZiBlcnJvciBpcyBhIHdhcm5pbmcKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1dhcm5pbmcoKTsKLQkKLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIHRydWUgaWZmIGVycm9yIGlzIGFuIGVycm9yCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNFcnJvcigpOwotCQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gdGhlIE1ldGhvZEVsZW1lbnQgY29udGFpbmluZyB0aGUgZXJyb3IsIGllLCB0aGUgZWxlbWVudCByZWZlcnJpbmcgdG8gc29tZXRoaW5nIHRoYXQgaXMgbWlzc2luZwotCSAqLwotCXB1YmxpYyBNZXRob2RFbGVtZW50IGdldEVycm9yTWV0aG9kRWxlbWVudCgpOwotCQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gdGhlIE1ldGhvZEVsZW1lbnQgY2F1c2luZyB0aGUgZXJyb3IsIGllLCB0aGUgZWxlbWVudCB0aGF0IGNhbiBiZSBzZWxlY3RlZCB0byBmaXggdGhlIGVycm9yCi0JICovCi0JcHVibGljIE1ldGhvZEVsZW1lbnQgZ2V0Q2F1c2VNZXRob2RFbGVtZW50KCk7Ci0JCi0JLyoqCi0JICogCi0JICogQHJldHVybiBhIHVuaXF1ZSBJRCBmb3IgdGhpcyBlcnJvcgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKTsKLQkKLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIG9uZSBvZiBJTWFya2VyLlNFVkVSSVRZX0VSUk9SLCBJTWFya2VyLlNFVkVSSVRZX1dBUk5JTkcsIElNYXJrZXIuU0VWRVJJVFlfSU5GTwotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0U2V2ZXJpdHkoKTsKLQkKLQkvKioKLQkgKiBnZXQgdGhlIG1lc3NhZ2Ugc3RyaW5nIGZvciB0aGlzIGVycm9yCi0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEVycm9yTWVzc2FnZSgpOwotCQotCS8qKgotCSAqIGdldCB0aGUgZXJyb3IgY2F0ZWdvcnkKLQkgKiAKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q2F0ZWdvcnkoKTsKLQkKLQkvKioKLQkgKiBnZXQgdGhlIGVycm9yIG1lc3NhZ2UgaWQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRNZXNzYWdlSWQoKTsKLQkKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9jb25maWd1cmF0aW9uL2Nsb3N1cmUvUGFja2FnZURlcGVuZGVuY3kuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9jb25maWd1cmF0aW9uL2Nsb3N1cmUvUGFja2FnZURlcGVuZGVuY3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTgzNTc0YS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvY29uZmlndXJhdGlvbi9jbG9zdXJlL1BhY2thZ2VEZXBlbmRlbmN5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5jbG9zdXJlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci0KLS8qKgotICogSG9sZHMgdGhlIGEgbGlzdCBvZiBwYWNrYWdlIHJlZmVyZW5jZXMgb2Ygb25lIHBhY2thZ2UgZWxlbWVudCBpdCBhbHNvIGhvbGRzIGEKLSAqIGxpc3Qgb2YgZGVwZW5kYW50IHBhY2thZ2UgZWxlbWVudHMuCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBQYWNrYWdlRGVwZW5kZW5jeSBleHRlbmRzIEVsZW1lbnREZXBlbmRlbmN5IHsKLQotCXByaXZhdGUgYm9vbGVhbiBsb2FkZWQgPSBmYWxzZTsKLQotCS8qKgotCSAqIGNvbnN0cnVjdCBhIHBhY2thZ2UgZGVwZW5kZW5jeSBmb3IgdGhlIGVsZW1lbnQKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqLwotCXB1YmxpYyBQYWNrYWdlRGVwZW5kZW5jeShNZXRob2RFbGVtZW50IGVsZW1lbnQpIHsKLQkJc3VwZXIoZWxlbWVudCk7Ci0JfQotCi0JLyoqCi0JICogc2V0IHRoZSBsb2FkZWQgZmxhZwotCSAqIEBwYXJhbSBsb2FkZWQgYm9vbGVhbgotCSAqLwotCXB1YmxpYyB2b2lkIHNldExvYWRlZChib29sZWFuIGxvYWRlZCkgewotCQl0aGlzLmxvYWRlZCA9IGxvYWRlZDsKLQl9Ci0KLQkvKioKLQkgKiBjaGVjayBpZiBpcyBsb2FkZWQgb3Igbm90Ci0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNMb2FkZWQoKSB7Ci0JCXJldHVybiB0aGlzLmxvYWRlZDsKLQl9Ci0KLQkvKioKLQkgKiBnZXQgdGhlIHJlZmVyZW5jZSBmb3IgYW4gZWxlbWVudAotCSAqIEBwYXJhbSByZWZFbGVtZW50IE9iamVjdAotCSAqIEBwYXJhbSBjcmVhdGUgYm9vbGVhbiBpZiB0cnVlIGNyZWF0ZSBpZiBub3QgZXhpc3QuCi0JICogQHJldHVybiBQYWNrYWdlUmVmZXJlbmNlCi0JICovCi0JcHVibGljIFBhY2thZ2VSZWZlcmVuY2UgZ2V0UmVmZXJlbmNlKE1ldGhvZEVsZW1lbnQgcmVmRWxlbWVudCwgYm9vbGVhbiBjcmVhdGUpIHsKLQkJUGFja2FnZVJlZmVyZW5jZSByZWYgPSAoUGFja2FnZVJlZmVyZW5jZSkgc3VwZXIKLQkJCQkuZ2V0UmVmZXJlbmNlKHJlZkVsZW1lbnQpOwotCQlpZiAocmVmID09IG51bGwgJiYgY3JlYXRlKSB7Ci0JCQlyZWYgPSBuZXcgUGFja2FnZVJlZmVyZW5jZShlbGVtZW50LCByZWZFbGVtZW50KTsKLQkJCXN1cGVyLmFkZFJlZmVyZW5jZShyZWYpOwotCQl9Ci0KLQkJcmV0dXJuIHJlZjsKLQl9Ci0KLQlwdWJsaWMgTGlzdCBnZXRQYWNrYWdlUmVmZXJlbmNlcygpIHsKLQkJcmV0dXJuIHN1cGVyLmdldFJlZmVyZW5jZXMoKTsKLQl9Ci0JCi0JcHVibGljIExpc3QgZ2V0QWxsRWxlbWVudFJlZmVyZW5jZXMoKSB7Ci0JCUxpc3QgYWxsUmVmcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCi0JCWZvciAoIEl0ZXJhdG9yIGl0ID0gZ2V0UGFja2FnZVJlZmVyZW5jZXMoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7ICkgewotCQkJUGFja2FnZVJlZmVyZW5jZSBwa2dSZWYgPSAoUGFja2FnZVJlZmVyZW5jZSlpdC5uZXh0KCk7Ci0JCQlhbGxSZWZzLmFkZEFsbChwa2dSZWYuZ2V0UmVmZXJlbmNlcygpKTsKLQkJfQotCQkKLQkJcmV0dXJuIGFsbFJlZnM7Ci0JfQotCQotCS8qKgotCSAqIHJlbW92ZSBhbGwgcmVmZXJlbmNlcyB3aXRoIHRoZSBnaXZlbiBvd25lciBlbGVtZW50Ci0JICogQHBhcmFtIG93bmVyRWxlbWVudCBPYmplY3QKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVSZWZlcmVuY2UoTWV0aG9kRWxlbWVudCBvd25lckVsZW1lbnQpIHsKLQkJUGFja2FnZVJlZmVyZW5jZSByZWY7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSBzdXBlci5nZXRSZWZlcmVuY2VzKCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJcmVmID0gKFBhY2thZ2VSZWZlcmVuY2UpIGl0Lm5leHQoKTsKLQkJCXJlZi5yZW1vdmVSZWZlcmVuY2Uob3duZXJFbGVtZW50KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIGRlYnVnIG1ldGhvZCB0byBwcmludCBvdXQgdGhlIHJlZmVyZW5jZXMKLQkgKi8KLQlwdWJsaWMgdm9pZCBwcmludCgpIHsKLQkJc3VwZXIucHJpbnQoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9jb25maWd1cmF0aW9uL2Nsb3N1cmUvUGFja2FnZUVycm9yLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvY29uZmlndXJhdGlvbi9jbG9zdXJlL1BhY2thZ2VFcnJvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NmFiNWMxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9jb25maWd1cmF0aW9uL2Nsb3N1cmUvUGFja2FnZUVycm9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTkgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLmNsb3N1cmU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiB0aGlzIGNsYXNzIGlkZW50aWZpZXMgYSBjb25maWd1cmF0aW9uIGVycm9yIGJldHdlZW4gdHdvIHBhY2thZ2VzCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKgotICovCi1wdWJsaWMgY2xhc3MgUGFja2FnZUVycm9yIGV4dGVuZHMgRXJyb3JJbmZvIHsKLQotCUxpc3Q8RWxlbWVudEVycm9yPiBlbGVtZW50RXJyb3MgPSBudWxsOwotCQotCXB1YmxpYyBQYWNrYWdlRXJyb3IoaW50IGVycm9yTGV2ZWwsIFN0cmluZyBtZXNzYWdlLCBPYmplY3Qgb3duZXJFbGVtZW50LCAKLQkJCU9iamVjdCBjYXVzZUVsZW1lbnQsIGludCByZWxhdGlvbikgewotCQlzdXBlcihlcnJvckxldmVsLCBtZXNzYWdlLCBvd25lckVsZW1lbnQsIGNhdXNlRWxlbWVudCwgcmVsYXRpb24sIG51bGwpOwotCQkKLQkJLy9jaGVja0VsZW1lbnRFcnJvcnMoKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0RXJyb3JMZXZlbChpbnQgbGV2ZWwpIHsKLQkJZXJyb3JMZXZlbCB8PSBsZXZlbDsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaGFzRWxlbWVudEVycm9yKCkgewotCQlyZXR1cm4gZWxlbWVudEVycm9zICE9IG51bGwgJiYgZWxlbWVudEVycm9zLnNpemUoKSA+IDA7Ci0JfQotCQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQ2hpbGRFcnJvcigpIHsKLQkJcmV0dXJuIChlcnJvckxldmVsICYgQ0hJTERfRVJST1IpID4gMDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0NoaWxkV2FybmluZygpIHsKLQkJcmV0dXJuIChlcnJvckxldmVsICYgQ0hJTERfV0FSTklORykgPiAwOwotCX0KLQkKLS8vCS8qKgotLy8JICogZ2V0IGEgbGlzdCBlbGVtZW50IGVycm9ycyB3aXRoaW4gdGhpcyBQYWNrYWdlRXJyb3IKLS8vCSAqIEByZXR1cm4KLS8vCSAqLwotLy8JcHVibGljIExpc3Q8RWxlbWVudEVycm9yPiBnZXRFbGVtZW50RXJyb3JMaXN0KCkgewotLy8JCQotLy8JCXJldHVybiB0aGlzLmVsZW1lbnRFcnJvczsKLS8vCX0KLQkKLS8vCi0vLwlwcml2YXRlIHZvaWQgY2hlY2tFbGVtZW50RXJyb3JzKCkgewotLy8JCWlmICggaXNDaGlsZEVycm9yKCkgfHwgaXNDaGlsZFdhcm5pbmcoKSApIHsKLS8vCQkJcmV0dXJuOwotLy8JCX0KLS8vCQkKLS8vCQl0aGlzLmVsZW1lbnRFcnJvcyA9IG5ldyBBcnJheUxpc3Q8RWxlbWVudEVycm9yPigpOwotLy8KLS8vCQlpbnQgcmVsYXRpb24gPSB0aGlzLmdldFJlbGF0aW9uKCk7Ci0vLwkJTWV0aG9kRWxlbWVudCBvd25lckVsZW1lbnQgPSAoTWV0aG9kRWxlbWVudCkgdGhpcy5nZXRPd25lckVsZW1lbnQoKTsKLS8vCQlNZXRob2RFbGVtZW50IGNhdXNlRWxlbWVudCA9IChNZXRob2RFbGVtZW50KSB0aGlzLmdldENhdXNlRWxlbWVudCgpOwotLy8JCVBhY2thZ2VEZXBlbmRlbmN5IGRlcDsKLS8vCQlQYWNrYWdlUmVmZXJlbmNlIHBrZ1JlZiA9IG51bGw7Ci0vLwotLy8JCWlmIChyZWxhdGlvbiA9PSBFcnJvckluZm8uUkVGRVJFTkNFX1RPKSB7Ci0vLwkJCWRlcCA9IGNsb3N1cmUuZ2V0Q29uZmlndXJhdGlvbk1hbmFnZXIoKS5nZXREZXBlbmRlbmN5TWFuYWdlcigpCi0vLwkJCQkJLmdldERlcGVuZGVuY3kob3duZXJFbGVtZW50KTsKLS8vCQkJcGtnUmVmID0gZGVwLmdldFJlZmVyZW5jZShjYXVzZUVsZW1lbnQsIGZhbHNlKTsKLS8vCQl9IGVsc2UgaWYgKHJlbGF0aW9uID09IEVycm9ySW5mby5SRUZFUkVOQ0VEX0JZKSB7Ci0vLwkJCWRlcCA9IGNsb3N1cmUuZ2V0Q29uZmlndXJhdGlvbk1hbmFnZXIoKS5nZXREZXBlbmRlbmN5TWFuYWdlcigpCi0vLwkJCQkJLmdldERlcGVuZGVuY3koY2F1c2VFbGVtZW50KTsKLS8vCQkJcGtnUmVmID0gZGVwLmdldFJlZmVyZW5jZShvd25lckVsZW1lbnQsIGZhbHNlKTsKLS8vCQl9Ci0vLwotLy8JCWlmIChwa2dSZWYgIT0gbnVsbCkgewotLy8JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gcGtnUmVmLmdldFJlZmVyZW5jZXMoKS5pdGVyYXRvcigpOyBpdAotLy8JCQkJCS5oYXNOZXh0KCk7KSB7Ci0vLwkJCQlFbGVtZW50UmVmZXJlbmNlIHJlZiA9IChFbGVtZW50UmVmZXJlbmNlKSBpdC5uZXh0KCk7Ci0vLwotLy8JCQkJLy8gRG9uJ3Qgc2hvdyB0aGUgZW50cnkgaWYgdGhlIHJlZmVyZW5jZSBjYW4gYmUgaWdub3JlZC4KLS8vCQkJCWlmIChyZWYuY2FuSWdub3JlKCkpIHsKLS8vCQkJCQljb250aW51ZTsKLS8vCQkJCX0KLS8vCQkJCUVsZW1lbnRFcnJvciBlbGVtZW50RXJyb3I7Ci0vLwkJCQlTdHJpbmcgbWVzc2FnZSA9ICIiOwotLy8JCQkJTWV0aG9kRWxlbWVudCBlMSwgZTI7Ci0vLwotLy8JCQkJaWYgKHJlbGF0aW9uID09IEVycm9ySW5mby5SRUZFUkVOQ0VfVE8pIHsKLS8vCQkJCQllMSA9IChNZXRob2RFbGVtZW50KXJlZi5nZXRFbGVtZW50KCk7Ci0vLwkJCQkJZTIgPSAoTWV0aG9kRWxlbWVudClyZWYuZ2V0UmVmRWxlbWVudCgpOwotLy8JCQkJfSBlbHNlIHsKLS8vCQkJCQllMiA9IChNZXRob2RFbGVtZW50KXJlZi5nZXRFbGVtZW50KCk7Ci0vLwkJCQkJZTEgPSAoTWV0aG9kRWxlbWVudClyZWYuZ2V0UmVmRWxlbWVudCgpOwotLy8JCQkJfQotLy8KLS8vCQkJCS8vIGlmIHRoZSBlbGVtZW50IGlzIHN1YnRyYWN0ZWQsIGRvbid0IGluY2x1ZGUgdGhlIHJlZmVyZW5jZQotLy8JCQkJaWYgKCBjbG9zdXJlLmlzRWxlbWVudFN1YnRyYWN0ZWQoZTEpICkgewotLy8JCQkJCWNvbnRpbnVlOwotLy8JCQkJfQotLy8JCQkJCi0vLwkJCQltZXNzYWdlID0gTGlicmFyeVJlc291cmNlcy5iaW5kKExpYnJhcnlSZXNvdXJjZXMuRWxlbWVudEVycm9yX21pc3NpbmdfZWxlbWVudF9tZXNzYWdlLCAKLS8vCQkJCQkJKG5ldyBTdHJpbmdbXSB7TGlicmFyeVV0aWwuZ2V0VHlwZU5hbWUoZTEpLCAKLS8vCQkJCQkJCQlMaWJyYXJ5VXRpbC5nZXRUeXBlTmFtZShlMikgfSkpOwotLy8JCQkJCi0vLwkJCQllbGVtZW50RXJyb3IgPSBuZXcgRWxlbWVudEVycm9yKAotLy8JCQkJCQl0aGlzLmNsb3N1cmUsIHRoaXMuZ2V0RXJyb3JMZXZlbCgpLAotLy8JCQkJCQltZXNzYWdlLCBlMSwgZTIsIHJlbGF0aW9uKTsgLy8kTk9OLU5MUy0xJAotLy8KLS8vCQkJCXRoaXMuZWxlbWVudEVycm9zLmFkZChlbGVtZW50RXJyb3IpOwotLy8JCQl9Ci0vLwkJfQotLy8JfQotCQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2NvbmZpZ3VyYXRpb24vY2xvc3VyZS9QYWNrYWdlUmVmZXJlbmNlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvY29uZmlndXJhdGlvbi9jbG9zdXJlL1BhY2thZ2VSZWZlcmVuY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzJkZWYyMy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvY29uZmlndXJhdGlvbi9jbG9zdXJlL1BhY2thZ2VSZWZlcmVuY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLmNsb3N1cmU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuTGlicmFyeVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotCi0KLS8qKgotICogQSBwYWNrYWdlIHJlZmVyZW5jZSBob2xkcyB0aGUgcmVmZXJlbmNlIG9mIHRoZSBjdXJyZW50IHBhY2thZ2UgZWxlbWVudCB0bwotICogYW5vdGhlciBwYWNrYWdlIGVsZW1lbnQuIElmIG9uZSBlbGVtZW50IGluIHRoZSBwYWNrYWdlIHJlZmVyZW5jZXMgdG8gYW5vdGhlcgotICogZWxlbWVudCBpbiBhbm90aGVyIHBhY2thZ2UsIHRoZSB0aGlzIHBhY2thZ2UgcmVmZXJlY2VzIHRvIHRoYXQgcGFja2FnZS4KLSAqIFVubGlrZSBlbGVtZW50IHJlZmVyZW5jZXMsIFBhY2thZ2VSZWZlcmVuY2UgaG9sZCBhIG9uZSB0byBvbmUgcmVsYXRpb25zaGlwCi0gKiBiZXR3ZWVuIHR3byBwYWNrYWdlcyBUaGUgUGFja2FnZXJlZmVyZW5jZSBvYmplY3QgYWxzbyBob2xkIGEgbGlzdCBvZgotICogRWxlbWVudFJlZmVyZW5jZXMgZm9yIGJldHdlZW4gdGhlIHR3byBwYWNrYWdlcwotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUGFja2FnZVJlZmVyZW5jZSBleHRlbmRzIEVsZW1lbnRSZWZlcmVuY2UgewotCQotCS8vIGxpc3Qgb2YgZWxlbWVudCByZWZlcmVjZXMgYmV0d2VlbiB0aGUgdHdvIHBhY2thZ2UKLQlwcml2YXRlIExpc3QgcmVmTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQotCXB1YmxpYyBQYWNrYWdlUmVmZXJlbmNlKE1ldGhvZEVsZW1lbnQgZWxlbWVudCwgTWV0aG9kRWxlbWVudCByZWZFbGVtZW50KSB7Ci0JCXN1cGVyKGVsZW1lbnQsIHJlZkVsZW1lbnQpOwotCX0KLQotCS8qKgotCSAqIGFkZCBhIG5ldyBlbGVtZW50IHJlZmVyZW5jZSBpZiB0aGUgcmVmZXJlbmNlIGlzIG5vdCBzZXQuIGNhbGwKLQkgKiBoYXNSZWZlcmVuY2UoT2JqZWN0IGVsZW1lbnQsIE9iamVjdCByZWZFbGVtZW50KSBiZWZvcmUgY2FsbGluZyB0aGlzCi0JICogbWV0aG9kCi0JICogCi0JICogQHBhcmFtIHJlZgotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFJlZmVyZW5jZShFbGVtZW50UmVmZXJlbmNlIHJlZikgewotCQlyZWZMaXN0LmFkZChyZWYpOwotCX0KLQotCS8qKgotCSAqIGdldCBhIGxpc3Qgb2YgZWxlbWVudCByZWZlcmVuY2VzIGFtb25nIHRoaXMgcGFja2FnZSByZWZlcmVuY2UKLQkgKiAKLQkgKiBAcmV0dXJuIExpc3QgYSBsaXN0IG9mIEVsZW1lbnRSZWZlcmVuY2Ugb2JqZWN0cwotCSAqLwotCXB1YmxpYyBMaXN0IGdldFJlZmVyZW5jZXMoKSB7Ci0JCXJldHVybiByZWZMaXN0OwotCX0KLQotCS8qKgotCSAqIGdldCB0aGUgZWxlbWVudCByZWZlcmVuY2UgaW4gdGhpcyBwYWNrYWdlIHJlZmVyZW5jZQotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogQHBhcmFtIHJlZkVsZW1lbnQKLQkgKiBAcmV0dXJuIEVsZW1lbnRSZWZlcmVuY2UKLQkgKi8KLQlwdWJsaWMgRWxlbWVudFJlZmVyZW5jZSBnZXRSZWZlcmVuY2UoT2JqZWN0IGVsZW1lbnQsIE9iamVjdCByZWZFbGVtZW50KSB7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSByZWZMaXN0Lml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCUVsZW1lbnRSZWZlcmVuY2UgcmVmID0gKEVsZW1lbnRSZWZlcmVuY2UpIGl0Lm5leHQoKTsKLQkJCWlmIChyZWYuZ2V0RWxlbWVudCgpID09IGVsZW1lbnQKLQkJCQkJJiYgcmVmLmdldFJlZkVsZW1lbnQoKSA9PSByZWZFbGVtZW50KSB7Ci0JCQkJcmV0dXJuIHJlZjsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKioKLQkgKiBjaGVjayB0aGUgZWxlbWVudCByZWZlcmVuY2UgZXhpc3RzIGluIHRoaXMgcGFja2FnZSByZWZlcmVuY2UKLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqIEBwYXJhbSByZWZFbGVtZW50Ci0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc1JlZmVyZW5jZShNZXRob2RFbGVtZW50IGVsZW1lbnQsIE1ldGhvZEVsZW1lbnQgcmVmRWxlbWVudCkgewotCQkKLQkJcmV0dXJuIGdldFJlZmVyZW5jZShlbGVtZW50LCByZWZFbGVtZW50KSAhPSBudWxsOwotCX0KLQotLy8JLyoqCi0vLwkgKiBjaGVjayBpZiB0aGVyZSBpcyBhIHJlZmVyZW5jZSBvZiB2YXJpYWJpbGl0eSBiYXNlIGVsZW1lbnQKLS8vCSAqIEByZXR1cm4KLS8vCSAqLwotLy8JcHVibGljIGJvb2xlYW4gaGFzQmFzZVJlZmVyZW5jZSgpIHsKLS8vCQlmb3IgKEl0ZXJhdG9yIGl0ID0gcmVmTGlzdC5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0vLwkJCUVsZW1lbnRSZWZlcmVuY2UgcmVmID0gKEVsZW1lbnRSZWZlcmVuY2UpIGl0Lm5leHQoKTsKLS8vCQkJaWYgKHJlZiBpbnN0YW5jZW9mIFZhcmlhYmlsaXR5RWxlbWVudFJlZmVyZW5jZSkgewotLy8JCQkJcmV0dXJuIHRydWU7Ci0vLwkJCX0KLS8vCQl9Ci0vLwotLy8JCXJldHVybiBmYWxzZTsKLS8vCX0KLQotCS8qKgotCSAqIHJlbW92ZSB0aGUgcmVmZXJlbmNlIG93bmVyZCBieSB0aGUgc3BlY2lmaWVkIGVsZW1lbnQKLQkgKiAKLQkgKiBAcGFyYW0gb3duZXJFbGVtZW50Ci0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlUmVmZXJlbmNlKE1ldGhvZEVsZW1lbnQgb3duZXJFbGVtZW50KSB7Ci0JCU9iamVjdCBlOwotCQlpbnQgaSA9IDA7Ci0JCXdoaWxlIChpIDwgcmVmTGlzdC5zaXplKCkpIHsKLQkJCUVsZW1lbnRSZWZlcmVuY2UgcmVmID0gKEVsZW1lbnRSZWZlcmVuY2UpIHJlZkxpc3QuZ2V0KGkpOwotCQkJZSA9IHJlZi5nZXRFbGVtZW50KCk7Ci0JCQlpZiAoZSAhPSBudWxsICYmIGUgPT0gb3duZXJFbGVtZW50KSB7Ci0JCQkJcmVmTGlzdC5yZW1vdmUoaSk7Ci0JCQl9IGVsc2UgewotCQkJCWkrKzsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIHByaW50IG91dAotCSAqLwotCXB1YmxpYyB2b2lkIHByaW50KCkgewotCQlTeXN0ZW0ub3V0LnByaW50bG4oTGlicmFyeVV0aWwuZ2V0TmFtZShlbGVtZW50KQotCQkJCSsgIiAtLT4gIiArIExpYnJhcnlVdGlsLmdldE5hbWUocmVmRWxlbWVudCkpOyAvLyROT04tTkxTLTEkCi0KLQkJZm9yIChJdGVyYXRvciBpdCA9IHJlZkxpc3QuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJKChFbGVtZW50UmVmZXJlbmNlKSBpdC5uZXh0KCkpLnByaW50KCk7Ci0JCX0KLQkJU3lzdGVtLm91dC5wcmludGxuKCk7Ci0KLQl9Ci0KLQkvKioKLQkgKiBjaGVjayBpZiB0aGUgcGFja2FnZSByZWZlcmVuY2UgY2FuIGJlIGlnbm9yZWQKLQkgKiAKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjYW5JZ25vcmUoKSB7Ci0JCS8vIGlmIHRoZSBwYWNrYWdlIGhhcyBubyBlbGVtZW50IHJlZmVyZW5jZSBvciBhbGwgZWxlbWVudCByZWZlcmVuY2VzIGNhbgotCQkvLyBiZSBpZ25vcmVkLCByZXR1cm4gdHJ1ZQotCQkvLyBvdGhlcndpc2UsIGZhbHNlCi0JCUxpc3QgcmVmcyA9IHRoaXMuZ2V0UmVmZXJlbmNlcygpOwotCi0JCWlmIChyZWZzLnNpemUoKSA9PSAwKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0JCWZvciAoSXRlcmF0b3IgaXQgPSByZWZzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCUVsZW1lbnRSZWZlcmVuY2UgcmVmID0gKEVsZW1lbnRSZWZlcmVuY2UpIGl0Lm5leHQoKTsKLQkJCWlmICghcmVmLmNhbklnbm9yZSgpKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2NvbmZpZ3VyYXRpb24vcGFja2FnZS5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2NvbmZpZ3VyYXRpb24vcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YjMzZmU4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9jb25maWd1cmF0aW9uL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIGVsZW1lbnQgcmVhbGl6YXRpb24gc3VwcG9ydCBpbiBhIG1ldGhvZCBjb25maWd1cmF0aW9uLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9ldmVudHMvSUxpYnJhcnlDaGFuZ2VMaXN0ZW5lci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2V2ZW50cy9JTGlicmFyeUNoYW5nZUxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1Zjc5YzUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2V2ZW50cy9JTGlicmFyeUNoYW5nZUxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5ldmVudHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotLyoqCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElMaWJyYXJ5Q2hhbmdlTGlzdGVuZXIgewotCi0vLwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUFRJT05fTE9BREVEID0gMHgxOwotCi0vLwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUFRJT05fU0FWRUQgPSAweDI7Ci0KLS8vCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9QVElPTl9DUkVBVEVEID0gMHg0OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1BUSU9OX0NIQU5HRUQgPSAweDg7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUFRJT05fREVMRVRFRCA9IDB4MTA7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUFRJT05fTkVXQ0hJTEQgPSAweDIwOwotCi0vLwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUFRJT05fQ09ORklHVVJBVElPTl9TRUxFQ1RFRCA9IDB4NDA7Ci0KLS8vCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9QVElPTl9MSUJSQVJZX0NMT1NFRCA9IDB4ODA7Ci0KLQkvKioKLQkgKiBub3RpZnkgdGhlIGxpc3RlbmVyIG9mIHRoZSBsaWJyYXJ5IGNoYW5nZXMuCi0JICogCi0JICogQHBhcmFtIG9wdGlvbgotCSAqICAgICAgICAgICAgaW50IG9uZSBvZiB0aGUgY2hhbmdlIG9wdGlvbnMKLQkgKiBAcGFyYW0gY29sbGVjdGlvbgotCSAqICAgICAgICAgICAgdGhlIGNoYW5nZWQgZWxlbWVudHMgaW4gdGhlIGxpYnJhcnksIGlmIHRoZSBvcHRpb24gaXMKLQkgKiAgICAgICAgICAgIE9QVElPTl9DSEFOR0VELCBudWxsIG90aGVyd2lzZQotCSAqLwotCXB1YmxpYyB2b2lkIGxpYnJhcnlDaGFuZ2VkKGludCBvcHRpb24sIENvbGxlY3Rpb248T2JqZWN0PiBjb2xsZWN0aW9uKTsKLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2V2ZW50cy9wYWNrYWdlLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZXZlbnRzL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTBiYWM2Mi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZXZlbnRzL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIHRoZSBpbnRlcmZhY2VzIGZvciBtZXRob2QgbGlicmFyeSBldmVudHMuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2ludGVybmFsL0xpYnJhcnlNYW5hZ2VyRWxlbWVudC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2ludGVybmFsL0xpYnJhcnlNYW5hZ2VyRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYWFkYjI1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9pbnRlcm5hbC9MaWJyYXJ5TWFuYWdlckVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmludGVybmFsOwotCi1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLQotLyoqCi0gKiBNb2RlbHMgYSAibGlicmFyeU1hbmFnZXIiIGNvbmZpZ3VyYXRpb24gZWxlbWVudCBpbiB0aGUKLSAqICJvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5saWJyYXJ5TWFuYWdlcnMiIGV4dGVuc2lvbiBwb2ludC4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTGlicmFyeU1hbmFnZXJFbGVtZW50IHsKLQotCS8vIFRoZSBjb250cmlidXRpbmcgcGx1Zy1pbi4KLQlwcml2YXRlIEJ1bmRsZSBidW5kbGU7Ci0KLQkvLyBUaGUgbGlicmFyeSBtYW5hZ2VyIGNsYXNzIG5hbWUuCi0JcHJpdmF0ZSBTdHJpbmcgY2xhc3NOYW1lOwotCi0JLy8gVGhlIGxpYnJhcnkgdHlwZSBpZGVudGlmaWVyLgotCXByaXZhdGUgU3RyaW5nIHR5cGVJZDsKLQotCS8vIFRoZSBsaWJyYXJ5IHR5cGUgZGlzcGxheSBuYW1lLgotCXByaXZhdGUgU3RyaW5nIHR5cGVOYW1lOwotCQotCXByaXZhdGUgaW50IHZlcnNpb247Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqIAotCSAqIEBwYXJhbSBidW5kbGUKLQkgKiAgICAgICAgICAgIHRoZSBjb250cmlidXRpbmcgcGx1Zy1pbgotCSAqIEBwYXJhbSBjbGFzc05hbWUKLQkgKiAgICAgICAgICAgIHRoZSBsaWJyYXJ5IG1hbmFnZXIgY2xhc3MgbmFtZQotCSAqIEBwYXJhbSB0eXBlSWQKLQkgKiAgICAgICAgICAgIHRoZSBsaWJyYXJ5IHR5cGUgaWRlbnRpZmllcgotCSAqIEBwYXJhbSB0eXBlTmFtZQotCSAqICAgICAgICAgICAgdGhlIGxpYnJhcnkgdHlwZSBkaXNwbGF5IG5hbWUKLQkgKi8KLQlwdWJsaWMgTGlicmFyeU1hbmFnZXJFbGVtZW50KEJ1bmRsZSBidW5kbGUsIFN0cmluZyBjbGFzc05hbWUsCi0JCQlTdHJpbmcgdHlwZUlkLCBTdHJpbmcgdHlwZU5hbWUsIGludCB2ZXJzaW9uKSB7Ci0JCXRoaXMuYnVuZGxlID0gYnVuZGxlOwotCQl0aGlzLmNsYXNzTmFtZSA9IGNsYXNzTmFtZTsKLQkJdGhpcy50eXBlSWQgPSB0eXBlSWQ7Ci0JCXRoaXMudHlwZU5hbWUgPSB0eXBlTmFtZTsKLQkJdGhpcy52ZXJzaW9uID0gdmVyc2lvbjsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBwbHVnLWluIHRoYXQgY29udHJpYnV0ZWQgdGhlIGV4dGVuc2lvbiBwb2ludAotCSAqIAotCSAqIEByZXR1cm4gYSBwbHVnLWluIGJ1bmRsZQotCSAqLwotCXB1YmxpYyBCdW5kbGUgZ2V0QnVuZGxlKCkgewotCQlyZXR1cm4gYnVuZGxlOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlICJjbGFzcyIgYXR0cmlidXRlIHZhbHVlLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG5hbWUgb2YgdGhlIGxpYnJhcnkgbWFuYWdlciBjbGFzcwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q2xhc3NOYW1lKCkgewotCQlyZXR1cm4gY2xhc3NOYW1lOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlICJ0eXBlIiBhdHRyaWJ1dGUgdmFsdWUuCi0JICogCi0JICogQHJldHVybiBhIHVuaXF1ZSBzdHJpbmcgSUQgZm9yIHRoZSBsaWJyYXJ5IHR5cGUKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGVJZCgpIHsKLQkJcmV0dXJuIHR5cGVJZDsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSAidHlwZU5hbWUiIGF0dHJpYnV0ZSB2YWx1ZS4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgZGlzcGxheSBuYW1lIGZvciB0aGUgbGlicmFyeSB0eXBlCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUeXBlTmFtZSgpIHsKLQkJcmV0dXJuIHR5cGVOYW1lOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0VmVyc2lvbigpIHsKLQkJcmV0dXJuIHZlcnNpb247Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2ludGVybmFsL3BhY2thZ2UuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9pbnRlcm5hbC9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3MWQwYTQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2ludGVybmFsL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIGV4dGVuc2lvbiBwb2ludCBtYW5hZ2VtZW50IGZvciB0aGUgbGlicmFyeSBzZXJ2aWNlLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvQm9va21hcmsuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvQm9va21hcmsuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2ZhZWZiOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L0Jvb2ttYXJrLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0ODIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC51dGlsLlhtbEVsZW1lbnQ7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBkZWZpbmVzIHRoZSBib29rbWFyayBkYXRhIHN0cnVjdHVyZSBmb3IgdGhlIHB1Ymxpc2hlZCBib29rbWFyayBlbnRyaWVzLiAKLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEJvb2ttYXJrIHsKLQotCXN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtMzY1MjU4Mjc5MTMyNjMyMzg2M0w7Ci0KLQkvLyBwb2ludHMgdG8gdGhlIGRlc2NyaXB0aW9uIGZpbGUgaW4gdGhlIGZpbGUgc3lzdGVtCi0JcHJpdmF0ZSBTdHJpbmcgX2ZpbGVOYW1lID0gIiI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIHVzZWQgYXMgImNsb3NlZCIgb3IgImRlZmF1bHQiIGljb24KLQlwcml2YXRlIFN0cmluZyBfY2xvc2VkSWNvbk5hbWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCi0JLy8gdXNlZCBhcyAib3BlbiIgaWNvbgotCXByaXZhdGUgU3RyaW5nIF9vcGVuSWNvbk5hbWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCi0JLy8gcHJlc2VudGF0aW9uIG5hbWUgb2YgdGhlIGVudHJ5Ci0JcHJpdmF0ZSBTdHJpbmcgX3ByZXNlbnRhdGlvbk5hbWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCi0JLy8gd2hldGhlciBtb3VzZSBpcyBvdmVyIHRoZSBib29rbWFyawotCS8vIHRoaXMgaXMgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5Ci0JLy8gcHJpdmF0ZSBib29sZWFuIF9pc01vdXNlT3ZlciA9IGZhbHNlOwotCi0JLy8gd2hldGhlciB0aGUgZmlsZSBleGlzdHMgaW4gdGhlIGZpbGUgc3lzdGVtCi0JcHJpdmF0ZSBib29sZWFuIF9pc0V4aXN0ID0gdHJ1ZTsKLQotCS8vIHdoZXRoZXIgdGhlIGZpbGUgaXMgZnJvbSBjb250ZW50IGxpYnJhcnkKLQlwcml2YXRlIGJvb2xlYW4gX2lzRnJvbUNvbnRlbnRMaWJyYXJ5ID0gdHJ1ZTsKLQotCS8vIHVuaXF1ZSBpZC4KLQkvLyBBIGJvb2ttYXJrIG1heSBub3QgaGF2ZSBhIHVuaXF1ZUlEIGluIHdoaWNoIGNhc2UgdGhlCi0JLy8gYm9va21hcmsgaGFzIG5vIHJlbGF0aW9uIHRvIGFueSBsYXlvdXQgZWxlbWVudHMuCi0JcHJpdmF0ZSBTdHJpbmcgX3VuaXF1ZUlkID0gbnVsbDsKLQotCS8vIHdoZXRoZXIgdGhlIGJvb2ttYXJrIGlzIHZpc2libGUKLQlwcml2YXRlIGJvb2xlYW4gX2lzVmlzaWJsZSA9IHRydWU7Ci0KLQkvLyB3aGV0aGVyIHRoZSBib29rbWFyayBpcyBlbmFibGVkCi0JLy8gdGhpcyBpcyB0byBzdXBwb3J0IGEgc3BlY2lhbCBjYXNlIHdoZXJlIGJvb2ttYXJrcwotCS8vIGFyZSB0byByZW1haW4gaGlkZGVuIGFuZCBjYW5ub3QgYmUgdW5oaWRkZW4gYXMKLQkvLyB3ZWxsIGFzIHRyYW5zcGFyZW5jeQotCXByaXZhdGUgYm9vbGVhbiBfaXNFbmFibGVkID0gdHJ1ZTsKLQotCS8vIHdoZXRoZXIgdGhlIGJvb2ttYXJrIGlzIHRyYW5zcGFyZW50Ci0JcHJpdmF0ZSBib29sZWFuIF9pc1RyYW5zcGFyZW50ID0gZmFsc2U7Ci0KLQkvLyB3aGV0aGVyIHRoZSBib29rbWFyayBpcyBhIGRlZmF1bHQgb25lCi0JLy8gZGVmYXVsdCBtZWFucyB0aGF0IGl0IGlzIHB1Ymxpc2hlZCBhbmQgaXMgcmVhZC1vbmx5Ci0JcHJpdmF0ZSBib29sZWFuIF9pc0RlZmF1bHQgPSBmYWxzZTsKLQotCS8vIHdoZXRoZXIgdGhlIGJvb2ttYXJrIGlzIHRoZSBjdXJyZW50IG9uZQotCS8vIGN1cnJlbnQgbWVhbnMgdGhlIGZpcnN0IG9uZSB0byBiZSBmb2N1c2VkIG9uCi0JcHJpdmF0ZSBib29sZWFuIF9pc0N1cnJlbnQgPSBmYWxzZTsKLQotCXByaXZhdGUgU3RyaW5nIHF1ZXJ5U3RyaW5nID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwcml2YXRlIExpc3QgY2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQlwcml2YXRlIEJvb2ttYXJrIHBhcmVudCA9IG51bGw7Ci0JCi0JLy8gdGhlIG93bmVyIGVsZW1lbnQgb2YgdGhlIG5vZGUKLQlwcml2YXRlIE9iamVjdCBvd25lciA9IG51bGw7Ci0JCi0JLyoqCi0JICogRGVmYXVsdCBjb25zdHJ1Y3Rvci4gVGFrZXMgaW4gdGhlIHByZXNlbnRhdGlvbiBuYW1lIG9mIHRoZSBwcm9jZXNzIGxheW91dAotCSAqIGVudHJ5LgotCSAqLwotCXB1YmxpYyBCb29rbWFyayhTdHJpbmcgbmFtZSkgewotCQlfdW5pcXVlSWQgPSBudWxsOwotCQlfcHJlc2VudGF0aW9uTmFtZSA9IG5hbWU7Ci0JCWlmIChfcHJlc2VudGF0aW9uTmFtZSA9PSBudWxsKSB7Ci0JCQlfcHJlc2VudGF0aW9uTmFtZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBOYW1lIGFuZCB1bmlxdWVJZCBmb3IgYSBsYXlvdXQgbm9kZS4KLQkgKi8KLQlwdWJsaWMgQm9va21hcmsoU3RyaW5nIHByZXNlbnRhdGlvbk5hbWUsIFN0cmluZyB1bmlxdWVJZCkgewotCQl0aGlzKHByZXNlbnRhdGlvbk5hbWUpOwotCQlfdW5pcXVlSWQgPSB1bmlxdWVJZDsKLQotCX0KLQotCXB1YmxpYyB2b2lkIHNldE93bmVyKE9iamVjdCBlbGVtZW50KSB7Ci0JCXRoaXMub3duZXIgPSBlbGVtZW50OwotCX0KLQkKLQlwdWJsaWMgT2JqZWN0IGdldE93bmVyKCkgewotCQlyZXR1cm4gdGhpcy5vd25lcjsKLQl9Ci0JCi0JLyoqCi0JICogT3ZlcnJpZGUgdG8gcmV0dXJuIHByZXNlbnRhdGlvbiBuYW1lIGFzIHRoZSB1c2VyIG9iamVjdC4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFVzZXJPYmplY3QoKSB7Ci0JCXJldHVybiAoX3ByZXNlbnRhdGlvbk5hbWUpOwotCX0KLQotCS8qKgotCSAqIHNldCB0aGUgdXNlciBvYmplY3QKLQkgKiBAcGFyYW0gdXNlck9iamVjdCBPYmplY3QKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRVc2VyT2JqZWN0KE9iamVjdCB1c2VyT2JqZWN0KSB7Ci0JCV9wcmVzZW50YXRpb25OYW1lID0gKFN0cmluZykgdXNlck9iamVjdDsKLQkJaWYgKF9wcmVzZW50YXRpb25OYW1lID09IG51bGwpIHsKLQkJCV9wcmVzZW50YXRpb25OYW1lID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKgotCSAqIHNldCB0aGUgcHJlc2VudGF0aW9uIG5hbWUKLQkgKiAKLQkgKiBAcGFyYW0gbmFtZSBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQcmVzZW50YXRpb25OYW1lKFN0cmluZyBuYW1lKSB7Ci0JCV9wcmVzZW50YXRpb25OYW1lID0gbmFtZTsKLQkJaWYgKF9wcmVzZW50YXRpb25OYW1lID09IG51bGwpIHsKLQkJCV9wcmVzZW50YXRpb25OYW1lID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKgotCSAqIGdldCB0aGUgcHJlc2VudGF0aW9uIG5hbWUKLQkgKiAKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UHJlc2VudGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIChfcHJlc2VudGF0aW9uTmFtZSk7Ci0JfQotCi0JLyoqCi0JICogc2V0IHRoZSBmaWxlIG5hbWUKLQkgKiAKLQkgKiBAcGFyYW0gbmFtZSBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGaWxlTmFtZShTdHJpbmcgbmFtZSkgewotCQlfZmlsZU5hbWUgPSBuYW1lOwotCQlpZiAoX2ZpbGVOYW1lID09IG51bGwpIHsKLQkJCV9maWxlTmFtZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBnZXQgdGhlIGZpbGUgbmFtZQotCSAqIAotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRGaWxlTmFtZSgpIHsKLQkJcmV0dXJuIChfZmlsZU5hbWUpOwotCX0KLQotCS8qKgotCSAqIHNldCB0aGUgaWNvbiBuYW1lIGZvciB0aGUgY2xvc2VkIGljb24KLQkgKiBAcGFyYW0gbmFtZSBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDbG9zZWRJY29uTmFtZShTdHJpbmcgbmFtZSkgewotCQlfY2xvc2VkSWNvbk5hbWUgPSBuYW1lOwotCX0KLQotCS8qKgotCSAqIGdldCB0aGUgY2xvc2VkIGljb24gbmFtZQotCSAqIAotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDbG9zZWRJY29uTmFtZSgpIHsKLQkJcmV0dXJuIChfY2xvc2VkSWNvbk5hbWUpOwotCX0KLQotCS8qKgotCSAqIGdldCB0aGUgb3BlbiBpY29uIG5hbWUKLQkgKiAKLQkgKiBAcmV0dXJuIFN0cmluZyB0aGUgb3BlbiBpY29uIG5hbWUKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE9wZW5JY29uTmFtZSgpIHsKLQkJcmV0dXJuIChfb3Blbkljb25OYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBzZXQgdGhlIG9wZW4gaWNvbiBuYW1lCi0JICogCi0JICogQHBhcmFtIG5hbWUgU3RyaW5nCi0JICovCi0JcHVibGljIHZvaWQgc2V0T3Blbkljb25OYW1lKFN0cmluZyBuYW1lKSB7Ci0JCV9vcGVuSWNvbk5hbWUgPSBuYW1lOwotCX0KLQotCS8qKgotCSAqIHNldCB0aGUgZXhpc3QgZmxhZwotCSAqIAotCSAqIEBwYXJhbSBpc0V4aXN0IGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFeGlzdChib29sZWFuIGlzRXhpc3QpIHsKLQkJX2lzRXhpc3QgPSBpc0V4aXN0OwotCX0KLQotCS8qKgotCSAqIGdldCB0aGUgZXhpc3QgZmxhZwotCSAqIAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRXhpc3QoKSB7Ci0JCXJldHVybiAoX2lzRXhpc3QpOwotCX0KLQotCS8qKgotCSAqIHRoaXMgaXMgYSBsZWdhY3kgbWV0aG9kLCBub3QgdXNlZCBhbnkgbW9yZQotCSAqIEBkZXByZWNhdGVkCi0JICogQHBhcmFtIGZsYWcgYm9vbGVhbgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZyb21Db250ZW50TGlicmFyeShib29sZWFuIGZsYWcpIHsKLQkJX2lzRnJvbUNvbnRlbnRMaWJyYXJ5ID0gZmxhZzsKLQl9Ci0KLQkvKioKLQkgKiB0aGlzIGlzIGEgbGVnYWN5IG1ldGhvZCwgbm90IHVzZWQgYW55IG1vcmUKLQkgKiBAZGVwcmVjYXRlZAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRnJvbUNvbnRlbnRMaWJyYXJ5KCkgewotCQlyZXR1cm4gKF9pc0Zyb21Db250ZW50TGlicmFyeSk7Ci0JfQotCi0JLyoqCi0JICogZ2V0IHRoZSB1bmlxdWUgaWQgb2YgdGhlIGJvb2ttYXJrCi0JICogCi0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFVuaXF1ZUlkKCkgewotCQlyZXR1cm4gKF91bmlxdWVJZCk7Ci0JfQotCi0JLyoqCi0JICogc2V0IHRoZSB1bmlxdWUgaWQgb2YgdGhlIGJvb2ttYXJrCi0JICogCi0JICogQHBhcmFtIHVuaXF1ZUlkIFN0cmluZwotCSAqLwotCXB1YmxpYyB2b2lkIHNldFVuaXF1ZUlkKFN0cmluZyB1bmlxdWVJZCkgewotCQlfdW5pcXVlSWQgPSB1bmlxdWVJZDsKLQl9Ci0KLQkvKioKLQkgKiBzZXQgdGhlIHZpc2libGUgZmxhZwotCSAqIAotCSAqIEBwYXJhbSBpc1Zpc2libGUgYm9vbGVhbgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZpc2libGUoYm9vbGVhbiBpc1Zpc2libGUpIHsKLQkJX2lzVmlzaWJsZSA9IGlzVmlzaWJsZTsKLQkJLy8gc3BlY2lhbCBjYXNlIHdoZXJlIGFsbCBjaGlsZHJlbiBuZWVkIHRvIGNoYW5nZSBhcyB3ZWxsCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgZ2V0Q2hpbGRDb3VudCgpOyBpKyspIHsKLQkJCUJvb2ttYXJrIGNoaWxkID0gKEJvb2ttYXJrKSAoKEJvb2ttYXJrKSBnZXRDaGlsZEF0KGkpKTsKLQkJCWNoaWxkLnNldFZpc2libGUoaXNWaXNpYmxlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIGdldCB0aGUgdmlzaWJsZSBmbGFnCi0JICogCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNWaXNpYmxlKCkgewotCQlyZXR1cm4gKF9pc1Zpc2libGUpOwotCX0KLQotCS8qKgotCSAqIHNldCB0aGUgZW5hYmxlZCBmbGFnCi0JICogCi0JICogQHBhcmFtIGlzRW5hYmxlZCBib29sZWFuCi0JICovCi0JcHVibGljIHZvaWQgc2V0RW5hYmxlZChib29sZWFuIGlzRW5hYmxlZCkgewotCQlfaXNFbmFibGVkID0gaXNFbmFibGVkOwotCQkvLyBzcGVjaWFsIGNhc2Ugd2hlcmUgYWxsIGNoaWxkcmVuIG5lZWQgdG8gY2hhbmdlIGFzIHdlbGwKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBnZXRDaGlsZENvdW50KCk7IGkrKykgewotCQkJQm9va21hcmsgY2hpbGQgPSAoQm9va21hcmspICgoQm9va21hcmspIGdldENoaWxkQXQoaSkpOwotCQkJY2hpbGQuc2V0RW5hYmxlZChpc0VuYWJsZWQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogZ2V0IHRoZSBlbmFibGVkIGZsYWcKLQkgKiAKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWQoKSB7Ci0JCXJldHVybiAoX2lzRW5hYmxlZCk7Ci0JfQotCi0JLyoqCi0JICogc2V0IHRoZSB0cmFuc3BhcmFudCBmbGFnCi0JICogCi0JICogQHBhcmFtIGlzVHJhbnNwYXJlbnQgYm9vbGVhbgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRyYW5zcGFyZW5jeShib29sZWFuIGlzVHJhbnNwYXJlbnQpIHsKLQkJLy8gc2V0IGF0IHRoaXMgYm9va21hcmsgb25seSwgbm90IGNoaWxkcmVuCi0JCV9pc1RyYW5zcGFyZW50ID0gaXNUcmFuc3BhcmVudDsKLQl9Ci0KLQkvKioKLQkgKiBnZXQgdGhlIHRyYW5zcGFyZW50IGZsYWcKLQkgKiAKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1RyYW5zcGFyZW50KCkgewotCQlyZXR1cm4gKF9pc1RyYW5zcGFyZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBzZXQgdGhlIGJvb2ttYXJrIGFzIGRlZmF1bHQKLQkgKiAKLQkgKiBAcGFyYW0gaXNEZWZhdWx0IGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZWZhdWx0KGJvb2xlYW4gaXNEZWZhdWx0KSB7Ci0JCV9pc0RlZmF1bHQgPSBpc0RlZmF1bHQ7Ci0JfQotCi0JLyoqCi0JICogY2hlY2sgaWYgdGhpcyBib29rbWFyayBpcyBzZXQgYXMgZGVmYXVsdAotCSAqIAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRGVmYXVsdCgpIHsKLQkJcmV0dXJuIChfaXNEZWZhdWx0KTsKLQl9Ci0KLQkvKioKLQkgKiBzZXQgdGhlIGN1cnJlbnQgZmxhZwotCSAqIAotCSAqIEBwYXJhbSBpc0N1cnJlbnQgYm9vbGVhbgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEN1cnJlbnQoYm9vbGVhbiBpc0N1cnJlbnQpIHsKLQkJX2lzQ3VycmVudCA9IGlzQ3VycmVudDsKLQl9Ci0KLQkvKioKLQkgKiBnZXQgdGhlIGN1cnJlbnQgZmxhZwotCSAqIAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQ3VycmVudCgpIHsKLQkJcmV0dXJuIChfaXNDdXJyZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBnZXQgdGhlIG51bWJlciBvZiBjaGlsZHJlbgotCSAqIAotCSAqIEByZXR1cm4gaW50Ci0JICovCi0JcHVibGljIGludCBnZXRDaGlsZENvdW50KCkgewotCQlyZXR1cm4gY2hpbGRyZW4uc2l6ZSgpOwotCX0KLQotCS8qKgotCSAqIFJldHJpZXZlcyByZWFsIGNoaWxkIGNvdW50IHJlZ2FyZGxlc3Mgb2YgdmlzaWJpbGl0eS4KLQkgKi8KLQlwdWJsaWMgaW50IGdldEFjdHVhbENoaWxkQ291bnQoKSB7Ci0JCXJldHVybiAoZ2V0Q2hpbGRDb3VudCgpKTsKLQl9Ci0KLQkvKioKLQkgKiBnZXQgdGhlIHNwZWNpZmllZCBjaGlsZAotCSAqIEBwYXJhbSBpIGludCBwb3NpdGlvbiBvZiB0aGUgY2hpbGQKLQkgKiBAcmV0dXJuIE9iamVjdCB0aGUgY2hpbGQgYm9va21hcmsKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldENoaWxkQXQoaW50IGkpIHsKLQkJcmV0dXJuIGNoaWxkcmVuLmdldChpKTsKLQl9Ci0KLQkvKioKLQkgKiBzYW1lIGFzIGdldENoaWxkQXQKLQkgKiAKLQkgKiBAcGFyYW0gaSBpbnQgcG9zaXRpb24gb2YgdGhlIGNoaWxkCi0JICogQHJldHVybiBPYmplY3QgdGhlIGNoaWxkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRBY3R1YWxDaGlsZEF0KGludCBpKSB7Ci0JCXJldHVybiBjaGlsZHJlbi5nZXQoaSk7Ci0JfQotCi0JLyoqCi0JICogYWRkIGEgbmV3IGNoaWxkIGJvb2ttYXJrCi0JICogCi0JICogQHBhcmFtIGNoaWxkIEJvb2ttYXJrCi0JICovCi0JcHVibGljIHZvaWQgYWRkQ2hpbGQoQm9va21hcmsgY2hpbGQpIHsKLQkJY2hpbGRyZW4uYWRkKGNoaWxkKTsKLQkJY2hpbGQucGFyZW50ID0gdGhpczsKLQl9Ci0KLQlwdWJsaWMgQm9va21hcmsgZ2V0UGFyZW50KCkgewotCQlyZXR1cm4gdGhpcy5wYXJlbnQ7Ci0JfQotCQotCS8qKgotCSAqIGdldCB0aGUgcXVlcnkgc3RyaW5nIHRvIHRoaXMgYm9va21hcmsuCi0JICogCi0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFF1ZXJ5U3RyaW5nKCkKLQl7Ci0JCXJldHVybiBxdWVyeVN0cmluZzsKLQl9Ci0JCi0JLyoqCi0JICogc2V0IHRoZSBxdWVyeSBzdHJpbmcKLQkgKiAKLQkgKiBAcGFyYW0gcXVlcnlTdHIgU3RyaW5nCi0JICovCi0JcHVibGljIHZvaWQgc2V0UXVlcnlTdHJpbmcoU3RyaW5nIHF1ZXJ5U3RyKQotCXsKLQkJdGhpcy5xdWVyeVN0cmluZyA9IHF1ZXJ5U3RyOwotCX0KLQkKLQkvKioKLQkgKiBnZXQgdGhlIHhtbCBkb2N1bWVudCBmb3IgdGhpcyBib29rbWFyay4KLQkgKiAKLQkgKiBAcmV0dXJuIFhtbEVsZW1lbnQKLQkgKi8KLQlwdWJsaWMgWG1sRWxlbWVudCBnZXRYbWxFbGVtZW50KCkgewotCQlYbWxFbGVtZW50IGVsZW1lbnRYbWwgPSBuZXcgWG1sRWxlbWVudCgiRWxlbWVudCIpIC8vJE5PTi1OTFMtMSQKLQkJCQkuc2V0QXR0cmlidXRlKCJndWlkIiwgZ2V0VW5pcXVlSWQoKSkgLy8kTk9OLU5MUy0xJAotCQkJCS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCBnZXRQcmVzZW50YXRpb25OYW1lKCkudHJpbSgpKSAvLyROT04tTkxTLTEkCi0JCQkJLnNldEF0dHJpYnV0ZSgiY2xvc2VkSWNvbk5hbWUiLCBnZXRDbG9zZWRJY29uTmFtZSgpKSAvLyROT04tTkxTLTEkCi0JCQkJLnNldEF0dHJpYnV0ZSgib3Blbkljb25OYW1lIiwgZ2V0T3Blbkljb25OYW1lKCkpIC8vJE5PTi1OTFMtMSQKLQkJCQkuc2V0QXR0cmlidXRlKCJleGlzdCIsIGlzRXhpc3QoKSA/ICJ0cnVlIiA6ICJmYWxzZSIpIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJLnNldEF0dHJpYnV0ZSgKLQkJCQkJCSJmcm9tQ29udGVudExpYnJhcnkiLCBpc0Zyb21Db250ZW50TGlicmFyeSgpID8gInRydWUiIDogImZhbHNlIikgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkuc2V0QXR0cmlidXRlKCJ2aXNpYmxlIiwgaXNWaXNpYmxlKCkgPyAidHJ1ZSIgOiAiZmFsc2UiKSAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCS5zZXRBdHRyaWJ1dGUoImVuYWJsZWQiLCBpc0VuYWJsZWQoKSA/ICJ0cnVlIiA6ICJmYWxzZSIpIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJLnNldEF0dHJpYnV0ZSgidHJhbnNwYXJlbnQiLCBpc1RyYW5zcGFyZW50KCkgPyAidHJ1ZSIgOiAiZmFsc2UiKSAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCS5zZXRBdHRyaWJ1dGUoImRlZmF1bHQiLCBpc0RlZmF1bHQoKSA/ICJ0cnVlIiA6ICJmYWxzZSIpIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJLnNldEF0dHJpYnV0ZSgiY3VycmVudCIsIGlzQ3VycmVudCgpID8gInRydWUiIDogImZhbHNlIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0KLQkJZWxlbWVudFhtbC5zZXRBdHRyaWJ1dGUoImNsb3NlZEljb25JZCIsIGdldEljb25JZChnZXRDbG9zZWRJY29uTmFtZSgpKSk7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCVN0cmluZyBxU3RyID0gZ2V0UXVlcnlTdHJpbmcoKTsKLQkJaWYgKCBxU3RyID09IG51bGwgfHwgcVN0ci5sZW5ndGgoKSA9PSAwICkgewotCQkJcVN0ciA9ICI/bm9kZUlkPSIgKyBlbGVtZW50WG1sLmdldElkKCk7IC8vJE5PTi1OTFMtMSQKLQkJfSBlbHNlIHsKLQkJCXFTdHIgKz0gIiZub2RlSWQ9IiArIGVsZW1lbnRYbWwuZ2V0SWQoKTsgIC8vJE5PTi1OTFMtMSQKLQkJfQotCQkKLQkJZWxlbWVudFhtbC5zZXRBdHRyaWJ1dGUoInVybCIsIGdldEZpbGVOYW1lKCkgKyBxU3RyKTsgLy8kTk9OLU5MUy0xJAotCQotCQlmb3IgKGludCBpID0gMDsgaSA8IGdldENoaWxkQ291bnQoKTsgaSsrKSB7Ci0JCQlCb29rbWFyayBjaGlsZCA9IChCb29rbWFyaykgZ2V0QWN0dWFsQ2hpbGRBdChpKTsKLQkJCWVsZW1lbnRYbWwuYWRkQ2hpbGQoY2hpbGQuZ2V0WG1sRWxlbWVudCgpKTsKLQkJfQotCi0JCXJldHVybiBlbGVtZW50WG1sOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VXJsKCkgewotCQlyZXR1cm4gZ2V0RmlsZU5hbWUoKSArIGdldFF1ZXJ5U3RyaW5nKCk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0SWNvbklkKFN0cmluZyBpY29uRmlsZU5hbWUpIHsKLQkJaWYgKCBpY29uRmlsZU5hbWUgPT0gbnVsbCApIHsKLQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJcmV0dXJuIEludGVnZXIudG9IZXhTdHJpbmcoaWNvbkZpbGVOYW1lLmhhc2hDb2RlKCkpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L0Jvb2ttYXJrTGlzdC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9Cb29rbWFya0xpc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWRhMTA2Zi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L0Jvb2ttYXJrTGlzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LnV0aWwuWG1sRWxlbWVudDsKLQotCi0vKioKLSAqIFRoaXMgY2xhc3MgbWFuYWdlcyBhIGxpc3Qgb2YgYm9va21hcmtzCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBCb29rbWFya0xpc3QgewotCi0JLy8gYSBsaXN0IG9mIGJvb2ttYXJrIGl0ZW1zCi0JcHJpdmF0ZSBMaXN0IGJvb2ttYXJrcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCS8qKgotCSAqIGRlZmF1bHQgY29uc3RydWN0b3IKLQkgKgotCSAqLwotCXB1YmxpYyBCb29rbWFya0xpc3QoKSB7Ci0JfQotCi0JLyoqCi0JICogYWRkIGEgbmV3IGJvb2ttYXJrICBlbnRyeSB0byB0aGUgbGlzdAotCSAqIEBwYXJhbSBuYW1lIFN0cmluZyB0aGUgQm9va21hcmsgbmFtZQotCSAqIEBwYXJhbSBmaWxlTmFtZSBTdHJpbmcgdGhlIGZpbGUgbmFtZSBvZiB0aGUgYm9va21hcmsKLQkgKiBAcGFyYW0gc2V0QXNEZWZhdWx0IGJvb2xlYW4gc2V0IHRoZSBib29rbWFyayBhcyBkZWZhdWx0IGlmIHRydWUuCi0JICovCi0JcHVibGljIHZvaWQgYWRkQm9va21hcmsoU3RyaW5nIG5hbWUsIFN0cmluZyBmaWxlTmFtZSwgYm9vbGVhbiBzZXRBc0RlZmF1bHQpIHsKLQkJX0Jvb2ttYXJrRW50cnkgZW50cnkgPSBuZXcgX0Jvb2ttYXJrRW50cnkobmFtZSwgZmlsZU5hbWUsIHNldEFzRGVmYXVsdCk7Ci0JCWJvb2ttYXJrcy5hZGQoZW50cnkpOwotCX0KLQotCS8qKgotCSAqIGdldCBhIGxpc3Qgb2YgYm9va21hcmsgZW50cmllcwotCSAqIEByZXR1cm4gTGlzdAotCSAqLwotCXB1YmxpYyBMaXN0IGdldEJvb2ttYXJrcygpIHsKLQkJcmV0dXJuIGJvb2ttYXJrczsKLQl9Ci0KLQkvKioKLQkgKiBnZXQgdGhlIHhtbCBkb2N1bWVudCBmb3IgdGhlIGJvb2ttYXJrIGVudHJpZXMuCi0JICogCi0JICogQHJldHVybiBYbWxFbGVtZW50Ci0JICovCi0JcHVibGljIFhtbEVsZW1lbnQgZ2V0WG1sRWxlbWVudCgpIHsKLQkJWG1sRWxlbWVudCBlbGVtZW50WG1sID0gbmV3IFhtbEVsZW1lbnQoIkJvb2ttYXJrcyIpOyAvLyROT04tTkxTLTEkCi0KLQkJZm9yIChJdGVyYXRvciBpdCA9IGJvb2ttYXJrcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlfQm9va21hcmtFbnRyeSBlbnRyeSA9IChfQm9va21hcmtFbnRyeSkgaXQubmV4dCgpOwotCQkJU3RyaW5nIGJvb2ttYXJrID0gZW50cnkuZmlsZU5hbWU7Ci0KLQkJCS8vIFN0cmluZyB0YWJOYW1lPSIiOwotCQkJU3RyaW5nIHVybCA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQlpbnQgaW5keCA9IGJvb2ttYXJrLmxhc3RJbmRleE9mKCIuIik7IC8vJE5PTi1OTFMtMSQKLQkJCWlmIChpbmR4ID4gMCkgewotCQkJCS8vIHRhYk5hbWUgPSBib29rbWFyay5zdWJzdHJpbmcoMCwgaW5keCkucmVwbGFjZSgnXycsICcgJyk7Ci0JCQkJdXJsID0gYm9va21hcmsuc3Vic3RyaW5nKDAsIGluZHgpICsgIi5odG1sIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJZWxlbWVudFhtbC5uZXdDaGlsZCgiQm9va21hcmsiKSAvLyROT04tTkxTLTEkCi0JCQkJCS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCBib29rbWFyaykgLy8kTk9OLU5MUy0xJAotCQkJCQkuc2V0QXR0cmlidXRlKCJ0YWJOYW1lIiwgZW50cnkudGFiTmFtZSkgLy8kTk9OLU5MUy0xJAotCQkJCQkuc2V0QXR0cmlidXRlKCJ1cmwiLCB1cmwpIC8vJE5PTi1OTFMtMSQKLQkJCQkJLnNldEF0dHJpYnV0ZSgKLQkJCQkJCQkiZGVmYXVsdCIsIChlbnRyeS5pc0RlZmF1bHQpID8gInRydWUiIDogImZhbHNlIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCX0KLQotCQlyZXR1cm4gZWxlbWVudFhtbDsKLQl9Ci0KLQlwcml2YXRlIGNsYXNzIF9Cb29rbWFya0VudHJ5IHsKLQkJcHJpdmF0ZSBTdHJpbmcgZmlsZU5hbWU7Ci0KLQkJcHJpdmF0ZSBTdHJpbmcgdGFiTmFtZTsKLQotCQlib29sZWFuIGlzRGVmYXVsdDsKLQotCQlfQm9va21hcmtFbnRyeShTdHJpbmcgbmFtZSwgU3RyaW5nIGZpbGVOYW1lLCBib29sZWFuIGlzRGVmYXVsdCkgewotCQkJdGhpcy50YWJOYW1lID0gbmFtZS50cmltKCk7Ci0JCQl0aGlzLmZpbGVOYW1lID0gZmlsZU5hbWU7Ci0JCQl0aGlzLmlzRGVmYXVsdCA9IGlzRGVmYXVsdDsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9Ccm93c2luZ0xheW91dFNldHRpbmdzLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L0Jyb3dzaW5nTGF5b3V0U2V0dGluZ3MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzVlYWVmYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L0Jyb3dzaW5nTGF5b3V0U2V0dGluZ3MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQ7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiBEZWZpbmUgdGhlIGJyb3dzaW5nIHNldHRpbmdzLiBVSSBwcmVmZXJlbmNlIGNhbiBzZXQgdGhlIG9wdGlvbnMgdG8gY2hhbmdlIHRoZSBicm93c2luZyBiZWhhdmlvcgotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBCcm93c2luZ0xheW91dFNldHRpbmdzIHsKLQotCXB1YmxpYyBzdGF0aWMgQnJvd3NpbmdMYXlvdXRTZXR0aW5ncyBJTlNUQU5DRSA9IG5ldyBCcm93c2luZ0xheW91dFNldHRpbmdzKCk7Ci0JCi0JcHJpdmF0ZSBib29sZWFuIHNob3dFeHRyYUluZm9Gb3JEZXNjcmlwdG9ycyA9IGZhbHNlOwotCXByaXZhdGUgYm9vbGVhbiBwdWJsaXNoVW5vcGVuQWN0aXZpdHlkZCA9IGZhbHNlOwotCXByaXZhdGUgYm9vbGVhbiBwdWJsaXNoQURGb3JBY3Rpdml0eUV4dGVuc2lvbiA9IGZhbHNlOwotCQotCS8vIGlmIHRydWUsIHRoZSB0by1tYW55IG91dGdvaW5nIGFzc29jaWF0aW9uIGZyb20gYmFzZSB3aWxsIGJlIGlnbm9yZWQgaWYgdGhlIGV4dGVuZGVyIGhhcyBpdHMgb3duCi0JcHJpdmF0ZSBib29sZWFuIHVzZU5ld0V4dGVuZFNlbWFudGljcyA9IGZhbHNlOwotCQotCXByaXZhdGUgIEZpbGUgeHNsUGF0aCA9IG51bGw7Ci0JcHJpdmF0ZSAgRmlsZSBjc3NQYXRoID0gbnVsbDsKLQlwcml2YXRlIEZpbGUgc2NyaXB0UGF0aCA9IG51bGw7Ci0JCi0JLy8gcmVjb3JkIGFsbCB0aGUgc2l0ZXMgdXBkYXRlZCBzaW5jZSB0aGUgbGFzdCBjaGFuZ2UKLQlwcml2YXRlICBMaXN0IHVwZGF0ZWRTaXRlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkKLQlwdWJsaWMgdm9pZCBzZXRVc2VOZXdFeHRlbmRTZW1hbnRpY3MoYm9vbGVhbiBmbGFnKSB7Ci0JCXRoaXMudXNlTmV3RXh0ZW5kU2VtYW50aWNzID0gZmxhZzsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNVc2VOZXdFeHRlbmRTZW1hbnRpY3MoKSB7Ci0JCXJldHVybiB0aGlzLnVzZU5ld0V4dGVuZFNlbWFudGljczsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0U2hvd0V4dHJhSW5mb0ZvckRlc2NyaXB0b3JzKGJvb2xlYW4gZmxhZykgewotCQl0aGlzLnNob3dFeHRyYUluZm9Gb3JEZXNjcmlwdG9ycyA9IGZsYWc7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGlzU2hvd0V4dHJhSW5mb0ZvckRlc2NyaXB0b3JzKCkgewotCQlyZXR1cm4gdGhpcy5zaG93RXh0cmFJbmZvRm9yRGVzY3JpcHRvcnM7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFB1Ymxpc2hVbm9wZW5BY3Rpdml0eWRkKGJvb2xlYW4gZmxhZykgewotCQl0aGlzLnB1Ymxpc2hVbm9wZW5BY3Rpdml0eWRkID0gZmxhZzsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNQdWJsaXNoVW5vcGVuQWN0aXZpdHlkZCgpIHsKLQkJcmV0dXJuIHRoaXMucHVibGlzaFVub3BlbkFjdGl2aXR5ZGQ7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFB1Ymxpc2hBREZvckFjdGl2aXR5RXh0ZW5zaW9uKGJvb2xlYW4gZmxhZykgewotCQl0aGlzLnB1Ymxpc2hBREZvckFjdGl2aXR5RXh0ZW5zaW9uID0gZmxhZzsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNQdWJsaXNoQURGb3JBY3Rpdml0eUV4dGVuc2lvbigpIHsKLQkJcmV0dXJuIHRoaXMucHVibGlzaEFERm9yQWN0aXZpdHlFeHRlbnNpb247Ci0JfQotCQotCXB1YmxpYyAgdm9pZCBzZXRYc2xQYXRoKEZpbGUgcGF0aCkgewotCQl4c2xQYXRoID0gcGF0aDsKLQl9Ci0JCi0JcHVibGljICB2b2lkIHNldENzc1BhdGgoRmlsZSBwYXRoKSB7Ci0JCWNzc1BhdGggPSBwYXRoOwotCX0KLQkKLQlwdWJsaWMgIHZvaWQgc2V0U2NyaXB0UGF0aChGaWxlIHBhdGgpIHsKLQkJc2NyaXB0UGF0aCA9IHBhdGg7Ci0JfQotCQotCXB1YmxpYyAgRmlsZSBnZXRYc2xQYXRoKCkgewotCQlyZXR1cm4geHNsUGF0aDsKLQl9Ci0JCi0JcHVibGljICBGaWxlIGdldENzc1BhdGgoKSB7Ci0JCXJldHVybiBjc3NQYXRoOwotCX0KLQkKLQlwdWJsaWMgIEZpbGUgZ2V0U2NyaXB0UGF0aCgpIHsKLQkJcmV0dXJuIHNjcmlwdFBhdGg7Ci0JfQotCQotCXB1YmxpYyAgdm9pZCBzZXRDaGFuZ2VkKCkgewotCQl1cGRhdGVkU2l0ZXMuY2xlYXIoKTsKLQl9Ci0JCi0JCi0JcHVibGljICBib29sZWFuIG5lZWRVcGRhdGUoU3RyaW5nIHB1YkRpcikgewotCQlpZiAoIHB1YkRpciA9PSBudWxsICkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiAhdXBkYXRlZFNpdGVzLmNvbnRhaW5zKHB1YkRpcik7Ci0JfQotCQotCXB1YmxpYyAgdm9pZCB1cGRhdGUoSHRtbEJ1aWxkZXIgYnVpbGRlcikgewotCQlpZiAoIChidWlsZGVyID09IG51bGwpIHx8ICFuZWVkVXBkYXRlKGJ1aWxkZXIuZ2V0UHVibGlzaERpcigpKSApIHsKLQkJCWlmICgoYnVpbGRlciAhPSBudWxsKSYmKHhzbFBhdGggIT0gbnVsbCkpIHsKLQkJCQlidWlsZGVyLnNldExheW91dFhzbFJvb3RQYXRoKHhzbFBhdGguZ2V0QWJzb2x1dGVQYXRoKCkpOwotCQkJfQotCQkJcmV0dXJuOwotCQl9Ci0JCWlmICggeHNsUGF0aCA9PSBudWxsIHx8IGNzc1BhdGggPT0gbnVsbCB8fCBzY3JpcHRQYXRoID09IG51bGwpIHsKLQkJCS8vIHVzZSB0aGUgZGVmYXVsdAotCQkJTGF5b3V0UmVzb3VyY2VzLmNvcHlMYXlvdXRGaWxlcyhidWlsZGVyLmdldFB1Ymxpc2hEaXIoKSk7Ci0JCQlidWlsZGVyLmxvYWREZWZhdWx0TGF5b3V0WHNsKCk7Ci0JCX0gZWxzZSB7Ci0JCQkKLQkJCS8vIHNldCB0aGUgeHNsIHBhdGgKLQkJCWJ1aWxkZXIuc2V0TGF5b3V0WHNsUm9vdFBhdGgoeHNsUGF0aC5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0JCQkKLQkJCS8vIGNvcHkgdGhlIGZpbHMgdG8gdGhlIHB1Ymxpc2ggZm9sZGVyCi0JCQlTdHJpbmcgaW5jbHVkZSA9ICIqLiosKiovKi4qIjsgLy8kTk9OLU5MUy0xJAotCQkJU3RyaW5nIGV4Y2x1ZGUgPSBudWxsOwotCQkJYm9vbGVhbiBvdmVycmlkZSA9IHRydWU7Ci0JCQkKLQkJCUZpbGUgZm9sZGVyID0gbmV3IEZpbGUoYnVpbGRlci5nZXRQdWJsaXNoRGlyKCksICJjc3MiKTsJCQkgLy8kTk9OLU5MUy0xJAotCQkJTGF5b3V0UmVzb3VyY2VzLmNvcHlEaXIoY3NzUGF0aCwgZm9sZGVyLCBpbmNsdWRlLCBleGNsdWRlLCBvdmVycmlkZSk7Ci0JCQkKLQkJCWZvbGRlciA9IG5ldyBGaWxlKGJ1aWxkZXIuZ2V0UHVibGlzaERpcigpLCAic2NyaXB0cyIpOwkJCSAvLyROT04tTkxTLTEkCi0JCQlMYXlvdXRSZXNvdXJjZXMuY29weURpcihzY3JpcHRQYXRoLCBmb2xkZXIsIGluY2x1ZGUsIGV4Y2x1ZGUsIG92ZXJyaWRlKTsKLQkJfQotCQkKLQkJdXBkYXRlZFNpdGVzLmFkZChidWlsZGVyLmdldFB1Ymxpc2hEaXIoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9EZWZhdWx0Q29udGVudFZhbGlkYXRvci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9EZWZhdWx0Q29udGVudFZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZTQ4NDQ3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvRGVmYXVsdENvbnRlbnRWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzMiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQ7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5QcmludFN0cmVhbTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LklMaWJyYXJ5UmVzb3VyY2VNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5Db250ZW50UmVzb3VyY2VTY2FubmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuTGlicmFyeVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5SZXNvdXJjZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLS8qKgotICogZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBmb3IgSUNvbnRlbnRWYWxpZGF0b3IuIFRoaXMgdmFsaWRhdG9yIGlzIHVzZWQgZm9yIGJyb3dzaW5nIGFuZCBwcmV2aWV3Ci0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKgotICovCi1wdWJsaWMgY2xhc3MgRGVmYXVsdENvbnRlbnRWYWxpZGF0b3IgaW1wbGVtZW50cyBJQ29udGVudFZhbGlkYXRvciB7Ci0KLQlwcm90ZWN0ZWQgUHJpbnRTdHJlYW0gaW5mbzsKLQotCXByb3RlY3RlZCBQcmludFN0cmVhbSB3YXJuaW5nOwotCi0JcHJvdGVjdGVkIFByaW50U3RyZWFtIGVycm9yOwotCi0JcHJvdGVjdGVkIFN0cmluZyBwdWJEaXI7Ci0KLQkvL3Byb3RlY3RlZCBib29sZWFuIHNob3dCcm9rZW5MaW5rcyA9IHRydWU7Ci0JCQotCS8qKgotCSAqIGNvbnN0cnVjdG9yCi0JICoKLQkgKi8KLQlwdWJsaWMgRGVmYXVsdENvbnRlbnRWYWxpZGF0b3IoKSB7Ci0JCXRoaXMobnVsbCk7Ci0JfQotCi0JLyoqCi0JICogY29uc3RydWN0b3IKLQkgKiBAcGFyYW0gcHViRGlyCi0JICovCi0JcHVibGljIERlZmF1bHRDb250ZW50VmFsaWRhdG9yKFN0cmluZyBwdWJEaXIpIHsKLQkJdGhpcy5wdWJEaXIgPSBwdWJEaXI7Ci0JCWluZm8gPSBTeXN0ZW0ub3V0OwotCQl3YXJuaW5nID0gU3lzdGVtLm91dDsKLQkJZXJyb3IgPSBTeXN0ZW0uZXJyOwotCX0KLQotCS8qKgotCSAqIHNldCBwdWJsaXNoIGRpcgotCSAqIEBwYXJhbSBwdWJEaXIgU3RyaW5nCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHVibGlzaERpcihTdHJpbmcgcHViRGlyKSB7Ci0JCXRoaXMucHViRGlyID0gcHViRGlyOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldFB1Ymxpc2hEaXIoKSB7Ci0JCXJldHVybiB0aGlzLnB1YkRpcjsKLQl9Ci0KLS8vCXB1YmxpYyB2b2lkIHNldFNob3dCcm9rZW5MaW5rcyhib29sZWFuIGZsYWcpIHsKLS8vCQlzaG93QnJva2VuTGlua3MgPSBmbGFnOwotLy8JfQotCQotCXB1YmxpYyBib29sZWFuIHNob3dCcm9rZW5MaW5rcygpIHsKLQkJcmV0dXJuIHRydWU7IC8vIGRlZmF1bHQKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2NhbkNvbnRlbnQoSUVsZW1lbnRMYXlvdXQgbGF5b3V0LCBTdHJpbmcgY29udGVudCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCQotCQlNZXRob2RFbGVtZW50IG93bmVyID0gbGF5b3V0LmdldEVsZW1lbnQoKTsKLQkJU3RyaW5nIGNvbnRlbnRQYXRoID0gbGF5b3V0LmdldEZpbGVQYXRoKCk7Ci0KLQkJQ29udGVudFJlc291cmNlU2Nhbm5lciBzY2FubmVyID0gZ2V0U2Nhbm5lcihvd25lcik7Ci0JCWlmICggc2Nhbm5lciAhPSBudWxsICkgewotCQkJc2Nhbm5lci5yZXNvbHZlUmVzb3VyY2VzKG93bmVyLCBjb250ZW50LCBjb250ZW50UGF0aCk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY29udGVudCByZXNvdXJjZSBzY2FubmVyIGZvciB0aGUgZWxlbWVudC4KLQkgKi8KLQlwcml2YXRlIENvbnRlbnRSZXNvdXJjZVNjYW5uZXIgZ2V0U2Nhbm5lcihNZXRob2RFbGVtZW50IG93bmVyKSB7Ci0JCUlMaWJyYXJ5UmVzb3VyY2VNYW5hZ2VyIHJlc01nciA9IFJlc291cmNlSGVscGVyLmdldFJlc291cmNlTWdyKG93bmVyKTsKLQkJaWYgKCByZXNNZ3IgPT0gbnVsbCApIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCQotCQlTdHJpbmcgcm9vdENvbnRlbnRQYXRoID0gcmVzTWdyLmdldExvZ2ljYWxQbHVnaW5QYXRoKG93bmVyKTsKLQkJRmlsZSBzcmNfcm9vdCA9IG5ldyBGaWxlKHJlc01nci5nZXRQaHlzaWNhbFBsdWdpblBhdGgob3duZXIpKTsKLQkJRmlsZSB0Z3Rfcm9vdCA9IG5ldyBGaWxlKHB1YkRpciwgcm9vdENvbnRlbnRQYXRoKTsKLQkJQ29udGVudFJlc291cmNlU2Nhbm5lciBzY2FubmVyID0gbmV3IENvbnRlbnRSZXNvdXJjZVNjYW5uZXIoc3JjX3Jvb3QsIHRndF9yb290LCByb290Q29udGVudFBhdGgsIHRoaXMpOwotCi0JCXJldHVybiBzY2FubmVyOwotCX0KLQkKLQlwdWJsaWMgTGlua0luZm8gdmFsaWRhdGVMaW5rKE1ldGhvZEVsZW1lbnQgb3duZXIsIFN0cmluZyBhdHRyaWJ1dGVzLAotCQkJU3RyaW5nIHRleHQsIE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnLCBTdHJpbmcgdGFnKSB7Ci0KLQkJTGlua0luZm8gaW5mbyA9IG5ldyBMaW5rSW5mbyhvd25lciwgdGhpcywgcHViRGlyLCB0YWcpOwotCQlpbmZvLnZhbGlkYXRlTGluayhhdHRyaWJ1dGVzLCB0ZXh0LCBjb25maWcpOwotCi0JCXJldHVybiBpbmZvOwotCX0KLQotCXB1YmxpYyB2b2lkIGxvZ0luZm8oTWV0aG9kRWxlbWVudCBvd25lciwgU3RyaW5nIG1lc3NhZ2UpIHsKLQkJaW5mbwotCQkJCS5wcmludGxuKE5MUy5iaW5kKExpYnJhcnlSZXNvdXJjZXMuRGVmYXVsdENvbnRlbnRWYWxpZGF0b3JfTVNHMSwgKChvd25lciA9PSBudWxsKSA/ICIiIDogTGlicmFyeVV0aWwuZ2V0VHlwZU5hbWUob3duZXIpKSArICI6ICIgKyBtZXNzYWdlKSk7ICAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJaW5mby5mbHVzaCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIGxvZ1dhcm5pbmcoTWV0aG9kRWxlbWVudCBvd25lciwgU3RyaW5nIG1lc3NhZ2UpIHsKLQkJd2FybmluZwotCQkJCS5wcmludGxuKE5MUy5iaW5kKExpYnJhcnlSZXNvdXJjZXMuRGVmYXVsdENvbnRlbnRWYWxpZGF0b3JfTVNHNCwgKChvd25lciA9PSBudWxsKSA/ICIiIDogTGlicmFyeVV0aWwuZ2V0VHlwZU5hbWUob3duZXIpKSArICI6ICIgKyBtZXNzYWdlKSk7ICAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJd2FybmluZy5mbHVzaCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIGxvZ0Vycm9yKE1ldGhvZEVsZW1lbnQgb3duZXIsIFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgdGgpIHsKLQkJZXJyb3IKLQkJCQkucHJpbnRsbihOTFMuYmluZChMaWJyYXJ5UmVzb3VyY2VzLkRlZmF1bHRDb250ZW50VmFsaWRhdG9yX01TRzcsICgob3duZXIgPT0gbnVsbCkgPyAiIiA6IExpYnJhcnlVdGlsLmdldFR5cGVOYW1lKG93bmVyKSkgKyAiOiAiICsgbWVzc2FnZSkpOyAgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWlmICh0aCAhPSBudWxsKSB7Ci0JCQl0aC5wcmludFN0YWNrVHJhY2UoZXJyb3IpOwotCQl9Ci0JCWVycm9yLmZsdXNoKCk7Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBsb2dJbmZvKFN0cmluZyBtZXNzYWdlKSB7Ci0JCWxvZ0luZm8obnVsbCwgbWVzc2FnZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgbG9nV2FybmluZyhTdHJpbmcgbWVzc2FnZSkgewotCQlsb2dXYXJuaW5nKG51bGwsIG1lc3NhZ2UpOwotCX0KLQotCXB1YmxpYyB2b2lkIGxvZ0Vycm9yKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgdGgpIHsKLQkJbG9nRXJyb3IobnVsbCwgbWVzc2FnZSwgdGgpOwotCX0KLQotCXB1YmxpYyB2b2lkIGxvZ01pc3NpbmdSZWZlcmVuY2UoTWV0aG9kRWxlbWVudCBvd25lciwKLQkJCU1ldGhvZEVsZW1lbnQgcmVmRWxlbWVudCkgewotCQlsb2dXYXJuaW5nKAotCQkJCW93bmVyLAotCQkJCU5MUy5iaW5kKExpYnJhcnlSZXNvdXJjZXMuRGVmYXVsdENvbnRlbnRWYWxpZGF0b3JfTVNHMTAsIExpYnJhcnlVdGlsLmdldFR5cGVOYW1lKHJlZkVsZW1lbnQpKSk7IAotCX0KLQotCXB1YmxpYyB2b2lkIGxvZ01pc3NpbmdSZWZlcmVuY2UoTWV0aG9kRWxlbWVudCBvd25lciwgU3RyaW5nIGd1aWQsCi0JCQlTdHJpbmcgbGlua2VkVGV4dCkgewotCQlsb2dXYXJuaW5nKG93bmVyLCBOTFMuYmluZChMaWJyYXJ5UmVzb3VyY2VzLkRlZmF1bHRDb250ZW50VmFsaWRhdG9yX01TRzExLCBndWlkKSk7IAotCX0KLQotCXB1YmxpYyB2b2lkIGxvZ01pc3NpbmdSZXNvdXJjZShNZXRob2RFbGVtZW50IG93bmVyLCBGaWxlIHJlc291cmNlRmlsZSwKLQkJCVN0cmluZyB1cmwpIHsKLQkJU3RyaW5nIG1zZzsKLQkJaWYgKHJlc291cmNlRmlsZSAhPSBudWxsKSB7Ci0JCQltc2cgPSBOTFMuYmluZChMaWJyYXJ5UmVzb3VyY2VzLkRlZmF1bHRDb250ZW50VmFsaWRhdG9yX01TRzEyLCByZXNvdXJjZUZpbGUuZ2V0UGF0aCgpLCB1cmwpOyAKLQkJfSBlbHNlIHsKLQkJCW1zZyA9IE5MUy5iaW5kKExpYnJhcnlSZXNvdXJjZXMuRGVmYXVsdENvbnRlbnRWYWxpZGF0b3JfTVNHMTUsIHVybCk7IAotCQl9Ci0KLQkJbG9nV2FybmluZyhvd25lciwgbXNnKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBsb2dJbnZhbGlkRXh0ZXJuYWxMaW5rKE1ldGhvZEVsZW1lbnQgb3duZXIsIFN0cmluZyB1cmwsCi0JCQlTdHJpbmcgbWVzc2FnZSkgewotCQlTdHJpbmcgdGV4dDsKLQkJaWYgKG1lc3NhZ2UgIT0gbnVsbCAmJiBtZXNzYWdlLmxlbmd0aCgpID4gMCkgewotCQkJdGV4dCA9IE5MUy5iaW5kKExpYnJhcnlSZXNvdXJjZXMuRGVmYXVsdENvbnRlbnRWYWxpZGF0b3JfTVNHMTksIHVybCwgbWVzc2FnZSk7IAotCQl9IGVsc2UgewotCQkJdGV4dCA9IE5MUy5iaW5kKExpYnJhcnlSZXNvdXJjZXMuRGVmYXVsdENvbnRlbnRWYWxpZGF0b3JfTVNHMTcsIHVybCk7IAotCQl9Ci0JCWxvZ1dhcm5pbmcob3duZXIsIHRleHQpOwotCX0KLQotCS8qKgotCSAqIGNoZWNrIGlmIHRoZSBlbGVtZW50IGlzIGRpc2NhcmRlZCBvciBub3QKLQkgKiBkaXNjYXJkZWQgZWxlbWVudHMgd2lsbCBiZSB0cmVhdGVkIGFzIG91dCBzaWRlIHRoZSBjb25maWd1cnNhdGlvbgotCSAqIAotCSAqIEBwYXJhbSBvd25lciBNZXRob2RFbGVtZW50IHRoZSBvd25lciBvZiB0aGUgZWxlbWVudAotCSAqIEBwYXJhbSBPYmplY3QgZmVhdHVyZSBFU3RydWN0dXJhbEZlYXR1cmUgb3IgT3Bwb3NpdGVGZWF0dXJlCi0JICogQHBhcmFtIGUgTWV0aG9kRWxlbWVudCB0aGUgZWxlbWVudCB0byBiZSBjaGVja2VkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNEaXNjYXJkZWQoTWV0aG9kRWxlbWVudCBvd25lciwgT2JqZWN0IGZlYXR1cmUsIE1ldGhvZEVsZW1lbnQgZSkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRSZWZlcmVuY2VkRWxlbWVudChNZXRob2RFbGVtZW50IG93bmVyLCBNZXRob2RFbGVtZW50IGUpCi0JewotCX0KLQkKLQkKLQlwdWJsaWMgdm9pZCBzZXREaXNjYXJkZWRFbGVtZW50KE1ldGhvZEVsZW1lbnQgZSkgewotCQkKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gc2hvd0V4dHJhSW5mb0ZvckRlc2NyaXB0b3JzKCkgewotCQlyZXR1cm4gQnJvd3NpbmdMYXlvdXRTZXR0aW5ncy5JTlNUQU5DRS5pc1Nob3dFeHRyYUluZm9Gb3JEZXNjcmlwdG9ycygpOwotCX0KLQkJCi0JLyoqCi0JICogc2hvdyBkZXNjcmlwdG9ycyBvbiBtZXRob2QgZWxlbWVudCBwYWdlCi0JICovCi0JcHVibGljIGJvb2xlYW4gc2hvd1JlbGF0ZWREZXNjcmlwdG9ycygpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCS8qKgotCSAqIGdldCB0aGUgdGFiIGlkIGZvciB0aGUgYWN0aXZpdHkgbGF5b3V0Ci0JICogCi0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRBY3Rpdml0eVRhYigpIHsKLQkJcmV0dXJuIG51bGw7ICAvLyB1c2UgdGhlIGRlZmF1bHQKLQl9Ci19Ci0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvRGVmYXVsdFNoYXBlaWNvbnMucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvRGVmYXVsdFNoYXBlaWNvbnMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTg3OTk3Yy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L0RlZmF1bHRTaGFwZWljb25zLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSMgRGVmYXVsdCBTaGFwZSBJY29uIE1hcHBpbmcgZm9yIHRoZSBNZXRob2QgRWxlbWVudHMuCi0KLSMgQ29yZSBNZXRob2QgRWxlbWVudHMKLWFydGlmYWN0PWltYWdlcy9hcnRpZmFjdC5naWYKLWNvbnRlbnRlbGVtZW50PWltYWdlcy9ndWlkYW5jZS5naWYKLWNvbnRlbnRwYWNrYWdlPWltYWdlcy9jb250ZW50X3BhY2thZ2UuZ2lmCi1kZWxpdmVyYWJsZT1pbWFnZXMvYXJ0aWZhY3QuZ2lmCi1tZXRob2RwbHVnaW49aW1hZ2VzL21ldGhvZF9wbHVnaW4uZ2lmCi1vdXRjb21lPWltYWdlcy9hcnRpZmFjdC5naWYKLXJvbGU9aW1hZ2VzL3JvbGUuZ2lmCi10YXNrPWltYWdlcy90YXNrLmdpZgotCi0jIEd1aWRhbmNlCi1jaGVja2xpc3Q9aW1hZ2VzL2NoZWNrbGlzdC5naWYKLWNvbmNlcHQ9aW1hZ2VzL2NvbmNlcHQuZ2lmCi1leGFtcGxlPWltYWdlcy9leGFtcGxlLmdpZgotZXN0aW1hdGlvbmNvbnNpZGVyYXRpb25zPWltYWdlcy9lc3RpbWF0aW9uY29uc2lkZXJhdGlvbnMuZ2lmCi1ndWlkYW5jZT1pbWFnZXMvZ3VpZGFuY2UuZ2lmCi1ndWlkbGluZT1pbWFnZXMvZ3VpZGxpbmUuZ2lmCi1wcmFjdGljZT1pbWFnZXMvcHJhY3RpY2UuZ2lmCi1yb2FkbWFwPWltYWdlcy9yb2FkbWFwLmdpZgotcmVwb3J0PWltYWdlcy9yZXBvcnQuZ2lmCi1yZXVzYWJsZWFzc2V0PWltYWdlcy9yZXVzYWJsZWFzc2V0LmdpZgotc3VwcG9ydGluZ21hdGVyaWFsPWltYWdlcy9zdXBwb3J0aW5nbWF0ZXJpYWwuZ2lmCi10ZWNobmlxdWU9aW1hZ2VzL3RlY2huaXF1ZS5naWYKLXRlbXBsYXRlPWltYWdlcy90ZW1wbGF0ZS5naWYKLXRlcm1kZWZpbml0aW9uPWltYWdlcy90ZXJtZGVmaW5pdGlvbi5naWYKLXRvb2xtZW50b3I9aW1hZ2VzL3Rvb2xtZW50b3IuZ2lmCi13aGl0ZXBhcGVyPWltYWdlcy93aGl0ZXBhcGVyLmdpZgotCi0jIENvbnRlbnQgQ2F0ZWdvcmllcwotY3VzdG9tY2F0ZWdvcnk9aW1hZ2VzL2N1c3RvbWNhdC5naWYKLWRpc2NpcGxpbmU9aW1hZ2VzL2Rpc2NpcGxpbmUuZ2lmCi1kaXNjaXBsaW5lZ3JvdXBpbmc9aW1hZ2VzL2Rpc2NpcGxpbmVncm91cC5naWYKLWRvbWFpbj1pbWFnZXMvY29udGVudF9wYWNrYWdlLmdpZgotcm9sZXNldD1pbWFnZXMvcm9sZXNldC5naWYKLXJvbGVzZXRncm91cGluZz1pbWFnZXMvY29udGVudF9wYWNrYWdlLmdpZgotdG9vbD1pbWFnZXMvdG9vbC5naWYKLXdvcmtwcm9kdWN0dHlwZT1pbWFnZXMvY29udGVudF9wYWNrYWdlLmdpZgotCi0jIFByb2Nlc3MgRWxlbWVudHMKLWFjdGl2aXR5PWltYWdlcy9hY3Rpdml0eS5naWYKLWNhcGFiaWxpdHlwYXR0ZXJuPWltYWdlcy9jYXBhYmlsaXR5cGF0dGVybi5naWYKLWRlbGl2ZXJ5cHJvY2Vzcz1pbWFnZXMvZGVsaXZlcnlwcm9jZXNzLmdpZgotaXRlcmF0aW9uPWltYWdlcy9pdGVyYXRpb24uZ2lmCi1waGFzZT1pbWFnZXMvcGhhc2UuZ2lmCi1wcm9jZXNzPWltYWdlcy9wcm9jZXNzLmdpZgotCi0jIERlc2NyaXB0b3JzCi1jb21wb3NpdGVyb2xlPWltYWdlcy9jb21wb3NpdGVyb2xlLmdpZgotcm9sZWRlc2NyaXB0b3I9aW1hZ2VzL3JvbGVkZXNfbGdfZGdtMzIuZ2lmCi10YXNrZGVzY3JpcHRvcj1pbWFnZXMvdGFza2Rlc19sZ19kZ20zMi5naWYKLXRlYW1wcm9maWxlPWltYWdlcy90ZWFtcHJvZmlsZS5naWYKLXdvcmtwcm9kdWN0ZGVzY3JpcHRvcj1pbWFnZXMvd29ya2Rlc19sZ19kZ20zMi5naWYKLW1pbGVzdG9uZT1pbWFnZXMvbWlsZXN0b25lLmdpZgotCi0jIE1pc2MKLWdlbmVyYWw9aW1hZ2VzL2d1aWRhbmNlLmdpZgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9FbGVtZW50TGF5b3V0TWFuYWdlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9FbGVtZW50TGF5b3V0TWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYjM0ZDBhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvRWxlbWVudExheW91dE1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQ7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLnJlZ2V4Lk1hdGNoZXI7Ci1pbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlZEFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLlN0clV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuSUxpYnJhcnlNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uRGVmYXVsdEVsZW1lbnRSZWFsaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLkVsZW1lbnRSZWFsaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuQ29uZmlndXJhYmxlQ29tcG9zZWRBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuU3VwcHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LmRpYWdyYW0uSUFjdGl2aXR5RGlhZ3JhbVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LmVsZW1lbnRzLkFic3RyYWN0RWxlbWVudExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuZWxlbWVudHMuQWJzdHJhY3RQcm9jZXNzRWxlbWVudExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuZWxlbWVudHMuR2VuZXJhbExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLkxpYnJhcnlVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuUmVzb3VyY2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudFByb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya0JyZWFrZG93bkVsZW1lbnQ7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRWxlbWVudExheW91dE1hbmFnZXIgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBBQ0tBR0VfTkFNRSA9IEVsZW1lbnRMYXlvdXRNYW5hZ2VyLmNsYXNzCi0JCQkuZ2V0UGFja2FnZSgpLmdldE5hbWUoKTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBkZWZhdWx0X2NvbmZpZ19wYXRoID0gIm5vY29uZmlnIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBib29sZWFuIGlzUHVibGlzaGluZ01vZGUgPSBmYWxzZTsgLy8gZGVmYXVsdCB0byBicm93c2luZyBtb2RlCi0JCi0JcHJpdmF0ZSBTdHJpbmcgcHVibGlzaF9kaXIgPSBudWxsOwotCi0JcHJpdmF0ZSBNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IG51bGw7Ci0KLQlwcml2YXRlIElBY3Rpdml0eURpYWdyYW1TZXJ2aWNlIGRpYWdyYW1TZXJ2aWNlID0gbnVsbDsKLQotCS8vIG5lZWQgdG8gc2VwZXJhdGUgdGhlIGFkYXB0ZXIgZmFjdG9yeSBmb3JtIGNvbnRlbnQgYW5kIGRpYWdyYW0KLQkvLyBkaWFncmFtIGFkYXB0b3IgZmFjdG9yeSBzaG91bGQgbm90IGJlIHJvbGxlZCB1cAotCXByaXZhdGUgTGF5b3V0QWRhcHRlckZhY3RvcnkgY29udGVudExheW91dEFkYXB0ZXJGYWN0b3J5ID0gbnVsbDsKLQlwcml2YXRlIExheW91dEFkYXB0ZXJGYWN0b3J5IGRpYWdyYW1MYXlvdXRBZGFwdGVyRmFjdG9yeSA9IG51bGw7Ci0JCi0JLy8gY2FjaGUgdGhlIHN1cHByZXNzaW9uIG9iamVjdCBmb3IgcHVibGlzaGluZyBtb2RlbCBvbmx5Ci0JLy8gbWFwIG9mIHByb2MgZ3VpZCB0byBTdXBwcmVzaWlvbiBvYmplY3QJCi0JcHJpdmF0ZSBNYXAgc3VwcmVzc2lvbk1hcCA9IG51bGw7Ci0JCi0JcHJpdmF0ZSBJQ29udGVudFZhbGlkYXRvciB2YWxpZGF0b3IgPSBudWxsOwotCQotCXByaXZhdGUgRWxlbWVudFJlYWxpemVyIHJlYWxpemVyID0gbnVsbDsKLQkKLQkvLyB0aGUgbGF5b3V0IGV4dGVuc2lvbnMuIGVhY2ggZXh0ZW5zaW9uIGlzIGlkZW50aWZpZWQgYnkgdGhlIHByb3BlcnR5IGlkIG9mIHRoZSBjb25maWd1cmF0aW9uCi0JcHJpdmF0ZSBNYXA8U3RyaW5nLCBMYXlvdXRFeHRlbnNpb24+IGxheW91dEV4dGVuc2lvbnMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIExheW91dEV4dGVuc2lvbj4oKTsKLQkKLQlwdWJsaWMgYm9vbGVhbiBpc1B1Ymxpc2hpbmdNb2RlKCkKLQl7Ci0JCXJldHVybiB0aGlzLmlzUHVibGlzaGluZ01vZGU7Ci0JfQotCQotCXB1YmxpYyBFbGVtZW50TGF5b3V0TWFuYWdlcigpIHsKLQkJdGhpcyhudWxsLCBudWxsLCBudWxsLCBmYWxzZSk7Ci0JfQotCi0JcHVibGljIEVsZW1lbnRMYXlvdXRNYW5hZ2VyKE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0JCXRoaXMoY29uZmlnLCBudWxsLCBudWxsLCBmYWxzZSk7Ci0JfQotCi0JcHVibGljIEVsZW1lbnRMYXlvdXRNYW5hZ2VyKE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnLCBTdHJpbmcgcHVibGlzaGRpciwgSUNvbnRlbnRWYWxpZGF0b3IgdmFsaWRhdG9yLCBib29sZWFuIGlzUHVibGlzaGluZ01vZGUpIHsKLQkJdGhpcy52YWxpZGF0b3IgPSB2YWxpZGF0b3I7Ci0JCXRoaXMuaXNQdWJsaXNoaW5nTW9kZSA9IGlzUHVibGlzaGluZ01vZGU7Ci0JCQotCQlpZiAoY29uZmlnICE9IG51bGwpIHsKLQkJCXRoaXMuY29uZmlnID0gY29uZmlnOwotCQl9Ci0KLQkJaWYgKHB1Ymxpc2hkaXIgPT0gbnVsbCkgewotCQkJcHVibGlzaGRpciA9IExheW91dFJlc291cmNlcy5nZXREZWZhdWx0UHVibGlzaERpcigpOwotCQkJaWYgKCFwdWJsaXNoZGlyLmVuZHNXaXRoKEZpbGUuc2VwYXJhdG9yKSkgewotCQkJCXB1Ymxpc2hkaXIgKz0gRmlsZS5zZXBhcmF0b3I7Ci0JCQl9Ci0KLQkJCS8vIGFsc28gYXBwZW5kIHRoZSBjb25maWd1cmF0aW9uIHBhdGgKLQkJCWlmICh0aGlzLmNvbmZpZyA9PSBudWxsKSB7Ci0JCQkJcHVibGlzaGRpciArPSBkZWZhdWx0X2NvbmZpZ19wYXRoOwotCQkJfSBlbHNlIHsKLQkJCQlTdHJpbmcgc3RyID0gU3RyVXRpbC5yZW1vdmVTcGVjaWFsQ2hhcmFjdGVycyh0aGlzLmNvbmZpZy5nZXROYW1lKCkpOwotCQkJCWlmICggc3RyID09ICIiICkgeyAvLyROT04tTkxTLTEkCi0JCQkJCXN0ciA9IEludGVnZXIudG9IZXhTdHJpbmcodGhpcy5jb25maWcudG9TdHJpbmcoKS5oYXNoQ29kZSgpKTsKLQkJCQl9Ci0JCQkJcHVibGlzaGRpciArPSBzdHI7Ci0JCQl9Ci0JCX0KLQotCQlzZXRQdWJsaXNoRGlyKHB1Ymxpc2hkaXIpOwotCi0JCWNvbnRlbnRMYXlvdXRBZGFwdGVyRmFjdG9yeSA9IG5ldyBMYXlvdXRBZGFwdGVyRmFjdG9yeSh0aGlzLmNvbmZpZyk7Ci0JCWRpYWdyYW1MYXlvdXRBZGFwdGVyRmFjdG9yeSA9IG5ldyBMYXlvdXRBZGFwdGVyRmFjdG9yeSh0aGlzLmNvbmZpZyk7Ci0JCQotCQkvLwlsb2FkIHRoZSBsYXlvdXQgZXh0ZW5zaW9ucyBmb3IgdGhpcyBjb25maWd1cmF0aW9uCi0JCWxvYWRMYXlvdXRFeHRlbnNpb25zKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGxvYWRMYXlvdXRFeHRlbnNpb25zKCkgewotCQlpZiAoIGNvbmZpZyA9PSBudWxsICkgewotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQkvLyBsb2FkIHRoZSBsYXlvdXQgZXh0ZW5zaW9ucyBmb3IgdGhpcyBjb25maWd1cmF0aW9uCi0JCUxpc3QgcHJvcHMgPSBjb25maWcuZ2V0TWV0aG9kRWxlbWVudFByb3BlcnR5KCk7Ci0JCWlmICggcHJvcHMgIT0gbnVsbCAmJiBwcm9wcy5zaXplKCkgPiAwICkgewotCQkJZm9yIChJdGVyYXRvciBpdHAgPSBwcm9wcy5pdGVyYXRvcigpOyBpdHAuaGFzTmV4dCgpOyApIHsKLQkJCQlNZXRob2RFbGVtZW50UHJvcGVydHkgcHJvcCA9IChNZXRob2RFbGVtZW50UHJvcGVydHkpaXRwLm5leHQoKTsKLQkJCQlTdHJpbmcgaWQgPSBwcm9wLmdldE5hbWUoKTsKLQkJCQlMYXlvdXRFeHRlbnNpb24gZXh0PSBMYXlvdXRFeHRlbnNpb25GYWN0b3J5LmdldEluc3RhbmNlKCkuY3JlYXRlRXh0ZW5zaW9uKGlkKTsKLQkJCQlpZiAoIGV4dCAhPSBudWxsICkgewotCQkJCQlleHQuaW5pdCh0aGlzKTsKLQkJCQkJbGF5b3V0RXh0ZW5zaW9ucy5wdXQoaWQsIGV4dCk7Ci0JCQkJfQotCQkJCQotCQkJfQotCQl9CQkKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY29udGVudCB2YWxpZGF0b3IuCi0JICovCi0JcHVibGljIElDb250ZW50VmFsaWRhdG9yIGdldFZhbGlkYXRvcigpIHsKLQkJaWYgKHZhbGlkYXRvciA9PSBudWxsKSB7Ci0JCQl2YWxpZGF0b3IgPSBuZXcgRGVmYXVsdENvbnRlbnRWYWxpZGF0b3IoZ2V0UHVibGlzaERpcigpKTsKLQkJfQotCQlyZXR1cm4gdmFsaWRhdG9yOwotCX0KLQkKLQlwdWJsaWMgRWxlbWVudFJlYWxpemVyIGdldEVsZW1lbnRSZWFsaXplcigpIHsKLQkJaWYgKCByZWFsaXplciA9PSBudWxsICkgewotCQkJcmVhbGl6ZXIgPSBEZWZhdWx0RWxlbWVudFJlYWxpemVyLm5ld0VsZW1lbnRSZWFsaXplcihjb25maWcpOwotCQkJcmVhbGl6ZXIuc2V0RmlsdGVyKGNvbnRlbnRMYXlvdXRBZGFwdGVyRmFjdG9yeS5nZXRGaWx0ZXIoKSk7Ci0JCX0KLQkJCi0JCXJldHVybiByZWFsaXplcjsJCQotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRFbGVtZW50UmVhbGl6ZXIoRWxlbWVudFJlYWxpemVyIHJlYWxpemVyKSB7Ci0JCXRoaXMucmVhbGl6ZXIgPSByZWFsaXplcjsJCQotCX0KLQkKLQlwdWJsaWMgQ29uZmlndXJhYmxlQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBnZXRXQlNBZGFwdGVyRmFjdG9yeSgpIHsKLQkJcmV0dXJuIGNvbnRlbnRMYXlvdXRBZGFwdGVyRmFjdG9yeS53YnNBZGFwdGVyRmFjdG9yeTsKLQl9Ci0KLQlwdWJsaWMgQ29uZmlndXJhYmxlQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBnZXRUQlNBZGFwdGVyRmFjdG9yeSgpIHsKLQkJcmV0dXJuIGNvbnRlbnRMYXlvdXRBZGFwdGVyRmFjdG9yeS50YnNBZGFwdGVyRmFjdG9yeTsKLQl9Ci0KLQlwdWJsaWMgQ29uZmlndXJhYmxlQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBnZXRXUEJTQWRhcHRlckZhY3RvcnkoKSB7Ci0JCXJldHVybiBjb250ZW50TGF5b3V0QWRhcHRlckZhY3Rvcnkud3Bic0FkYXB0ZXJGYWN0b3J5OwotCX0KLQotCXB1YmxpYyBDb25maWd1cmFibGVDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IGdldENCU0FkYXB0ZXJGYWN0b3J5KCkgewotCQlyZXR1cm4gY29udGVudExheW91dEFkYXB0ZXJGYWN0b3J5LmNic0FkYXB0ZXJGYWN0b3J5OwotCX0KLQotCXB1YmxpYyBDb25maWd1cmFibGVDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IGdldERpYWdyYW1BZGFwdGVyRmFjdG9yeSgpIHsKLQkJcmV0dXJuIGRpYWdyYW1MYXlvdXRBZGFwdGVyRmFjdG9yeS53YnNBZGFwdGVyRmFjdG9yeTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0QWN0aXZpdHlEaWFncmFtU2VydmljZShJQWN0aXZpdHlEaWFncmFtU2VydmljZSBkaWFncmFtU2VydmljZSkgewotCQl0aGlzLmRpYWdyYW1TZXJ2aWNlID0gZGlhZ3JhbVNlcnZpY2U7Ci0JfQotCi0JcHVibGljIElBY3Rpdml0eURpYWdyYW1TZXJ2aWNlIGdldEFjdGl2aXR5RGlhZ3JhbVNlcnZpY2UoKSB7Ci0JCXJldHVybiB0aGlzLmRpYWdyYW1TZXJ2aWNlOwotCX0KLQotCXB1YmxpYyBTdXBwcmVzc2lvbiBnZXRTdXBwcmVzc2lvbihQcm9jZXNzIHByb2MpCi0JewotCQlTdXBwcmVzc2lvbiBzdXAgPSBudWxsOwotCQlpZiAoIGlzUHVibGlzaGluZ01vZGUpCi0JCXsKLQkJCWlmICggc3VwcmVzc2lvbk1hcCA9PSBudWxsICkKLQkJCXsKLQkJCQlzdXByZXNzaW9uTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJCX0KLQkJCVN0cmluZyBndWlkID0gcHJvYy5nZXRHdWlkKCk7Ci0JCQlzdXAgPSAoU3VwcHJlc3Npb24pc3VwcmVzc2lvbk1hcC5nZXQoZ3VpZCk7Ci0JCQlpZiAoIHN1cCA9PSBudWxsICkKLQkJCXsKLQkJCQlzdXAgPSBjcmVhdGVTdXBwcmVzc2lvbihwcm9jKTsKLQkJCQlzdXByZXNzaW9uTWFwLnB1dChndWlkLCBzdXApOwotCQkJfQotCQl9Ci0JCWVsc2UKLQkJewotCQkJc3VwID0gY3JlYXRlU3VwcHJlc3Npb24ocHJvYyk7Ci0JCX0KLQkJCi0JCXJldHVybiBzdXA7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHByZXBhcmVBZGFwdG9yRmFjdG9yaWVzRm9yUHJvY2VzcyhQcm9jZXNzIHByb2MpCi0JewotCQkvLyBuZWVkIHRvIGl0ZXJhdGUgdGhlIGFkYXB0b3IgZmFjdG9yeSB0byBnZW5lcmF0ZSB0aGUgYWRhcHRvciB0cmVlCi0JCXByZXBhcmVBZGFwdGVyZmFjdG9yeUZvcihnZXRDQlNBZGFwdGVyRmFjdG9yeSgpLCBwcm9jKTsKLQkJcHJlcGFyZUFkYXB0ZXJmYWN0b3J5Rm9yKGdldFRCU0FkYXB0ZXJGYWN0b3J5KCksIHByb2MpOwotCQlwcmVwYXJlQWRhcHRlcmZhY3RvcnlGb3IoZ2V0V0JTQWRhcHRlckZhY3RvcnkoKSwgcHJvYyk7Ci0JCXByZXBhcmVBZGFwdGVyZmFjdG9yeUZvcihnZXRXUEJTQWRhcHRlckZhY3RvcnkoKSwgcHJvYyk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBwcmVwYXJlQWRhcHRlcmZhY3RvcnlGb3IoCi0JCQlDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LCBPYmplY3Qgb2JqKSB7Ci0JCWlmIChvYmogPT0gbnVsbCB8fCBhZGFwdGVyRmFjdG9yeSA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIgcHJvdmlkZXIgPSBudWxsOwotCi0JCWlmIChvYmogaW5zdGFuY2VvZiBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIpIHsKLQkJCXByb3ZpZGVyID0gKElUcmVlSXRlbUNvbnRlbnRQcm92aWRlcikgb2JqOwotCQl9IGVsc2UgewotCQkJcHJvdmlkZXIgPSAoSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyKSBhZGFwdGVyRmFjdG9yeS5hZGFwdChvYmosCi0JCQkJCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCX0KLQotCQlpZiAocHJvdmlkZXIgIT0gbnVsbCkgewotCQkJQ29sbGVjdGlvbiBpdGVtcyA9IHByb3ZpZGVyLmdldENoaWxkcmVuKG9iaik7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gaXRlbXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCByYXdpdGVtID0gaXQubmV4dCgpOwotCi0JCQkJTWV0aG9kRWxlbWVudCBpdGVtID0gKE1ldGhvZEVsZW1lbnQpIExpYnJhcnlVdGlsCi0JCQkJCQkudW53cmFwKHJhd2l0ZW0pOwotCQkJCWlmICgoaXRlbSBpbnN0YW5jZW9mIEFjdGl2aXR5KSkgewotCQkJCQlwcmVwYXJlQWRhcHRlcmZhY3RvcnlGb3IoYWRhcHRlckZhY3RvcnksIHJhd2l0ZW0pOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkKLQlwcml2YXRlIElFbGVtZW50TGF5b3V0IGNyZWF0ZUxheW91dChNZXRob2RFbGVtZW50IGVsZW1lbnQpIHsKLQkJCi0JCS8vIGlmIHRoZSBlbGVtZW50IGlzIGFuIGFjdGl2aXR5LCB3ZSBuZWVkIHRvIGZpbmVkIHRoZSBwYXRoIHRvIHRoZSBwcm9jZXNzCi0JCVN0cmluZyBwYXRoID0gbnVsbDsKLQkJUHJvY2VzcyBvd25pbmdQcm9jID0gbnVsbDsKLQkJaWYgKCBlbGVtZW50IGluc3RhbmNlb2YgQWN0aXZpdHkgKQotCQl7Ci0JCQlBY3Rpdml0eSBhY3QgPSAoQWN0aXZpdHkpZWxlbWVudDsKLQkJCXBhdGggPSBBYnN0cmFjdFByb2Nlc3NFbGVtZW50TGF5b3V0LmdldFBhdGgoYWN0KTsKLQkJCW93bmluZ1Byb2MgPSBUbmdVdGlsLmdldE93bmluZ1Byb2Nlc3MoYWN0KTsKLQkJfQotCQkKLQkJcmV0dXJuIGNyZWF0ZUxheW91dChlbGVtZW50LCBvd25pbmdQcm9jLCBwYXRoKTsKLQl9Ci0KLQlwdWJsaWMgSUVsZW1lbnRMYXlvdXQgY3JlYXRlTGF5b3V0KE1ldGhvZEVsZW1lbnQgZWxlbWVudCwKLQkJCVByb2Nlc3Mgb3duaW5nUHJvYywgU3RyaW5nIHBhdGgpIHsKLQkJQWJzdHJhY3RFbGVtZW50TGF5b3V0IGxheW91dCA9IG51bGw7Ci0KLQkJU3RyaW5nIGNsYXNzTmFtZTsKLQkJaWYgKENvbmZpZ3VyYXRpb25IZWxwZXIuaXNEZXNjcmlwdGlvbkVsZW1lbnQoZWxlbWVudCkpIHsKLQkJCWNsYXNzTmFtZSA9ICJDb250ZW50RGVzY3JpcHRpb24iOyAvLyROT04tTkxTLTEkCi0JCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQljbGFzc05hbWUgPSAiQWN0aXZpdHkiOyAvLyROT04tTkxTLTEkCi0JCX0gZWxzZSBpZiAoKGVsZW1lbnQgaW5zdGFuY2VvZiBXb3JrQnJlYWtkb3duRWxlbWVudCkKLQkJCQkmJiAhKGVsZW1lbnQgaW5zdGFuY2VvZiBUYXNrRGVzY3JpcHRvcikpIHsKLQkJCWNsYXNzTmFtZSA9ICJXb3JrQnJlYWtkb3duRWxlbWVudCI7IC8vJE5PTi1OTFMtMSQgIC8vIHRhc2tkZXNjcmlwdG9yIGhhcyBpdCdzIG93biBsYXlvdXQKLQkJfSBlbHNlIHsKLQkJCUNsYXNzIGlbXSA9IGVsZW1lbnQuZ2V0Q2xhc3MoKS5nZXRJbnRlcmZhY2VzKCk7Ci0JCQlpZiAoaSAhPSBudWxsICYmIGkubGVuZ3RoID09IDEpIHsKLQkJCQljbGFzc05hbWUgPSBpWzBdLmdldE5hbWUoKTsKLQkJCX0gZWxzZSB7Ci0JCQkJY2xhc3NOYW1lID0gZWxlbWVudC5nZXRDbGFzcygpLmdldE5hbWUoKTsKLQkJCX0KLQotCQkJaW50IGluZGV4ID0gY2xhc3NOYW1lLmxhc3RJbmRleE9mKCIuIik7IC8vJE5PTi1OTFMtMSQKLQkJCWlmIChpbmRleCA+PSAwKSB7Ci0JCQkJY2xhc3NOYW1lID0gY2xhc3NOYW1lLnN1YnN0cmluZyhpbmRleCArIDEpOwotCQkJfQotCQl9Ci0KLQkJY2xhc3NOYW1lID0gUEFDS0FHRV9OQU1FICsgIi5lbGVtZW50cy4iICsgY2xhc3NOYW1lICsgIkxheW91dCI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JCXRyeSB7Ci0JCQlDbGFzcyBjID0gQ2xhc3MuZm9yTmFtZShjbGFzc05hbWUpOwotCQkJaWYgKGMgIT0gbnVsbCkgewotCQkJCWxheW91dCA9IChBYnN0cmFjdEVsZW1lbnRMYXlvdXQpIGMubmV3SW5zdGFuY2UoKTsKLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQkvLyBleC5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCi0JCWlmIChsYXlvdXQgPT0gbnVsbCkgewotCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJMYXlvdXQgY2xhc3MgJyIgKyBjbGFzc05hbWUgKyAiJyBmb3IgZWxlbWVudAotCQkJLy8gJyIgKyBlbGVtZW50LmdldE5hbWUoKSArICInIG5vdCBkZWZpbmVkLiBVc2UgR2VuZXJhbExheW91dCIpOwotCQkJbGF5b3V0ID0gbmV3IEdlbmVyYWxMYXlvdXQoKTsKLQkJfQotCi0JCWlmIChsYXlvdXQgaW5zdGFuY2VvZiBBYnN0cmFjdFByb2Nlc3NFbGVtZW50TGF5b3V0KSB7Ci0JCQkoKEFic3RyYWN0UHJvY2Vzc0VsZW1lbnRMYXlvdXQpIGxheW91dCkuaW5pdCh0aGlzLCBlbGVtZW50LAotCQkJCQlvd25pbmdQcm9jLCBwYXRoKTsKLQkJfSBlbHNlIHsKLQkJCWxheW91dC5pbml0KHRoaXMsIGVsZW1lbnQpOwotCQl9Ci0KLQkJcmV0dXJuIGxheW91dDsKLQl9Ci0KLQlwdWJsaWMgSUVsZW1lbnRMYXlvdXQgZ2V0TGF5b3V0KE1ldGhvZEVsZW1lbnQgZWxlbWVudCwgYm9vbGVhbiBjcmVhdGUpIHsKLQkJLy8gU3RyaW5nIGlkID0gZWxlbWVudC5nZXRHdWlkKCk7Ci0JCUlFbGVtZW50TGF5b3V0IGxheW91dCA9IG51bGw7IC8vIChJRWxlbWVudExheW91dClsYXlvdXRNYXAuZ2V0KGlkKTsKLQkJaWYgKChsYXlvdXQgPT0gbnVsbCkgJiYgY3JlYXRlKSB7Ci0JCQlsYXlvdXQgPSBjcmVhdGVMYXlvdXQoZWxlbWVudCk7Ci0JCQkvLyBsYXlvdXRNYXAucHV0KGlkLCBsYXlvdXQpOwotCQl9Ci0KLQkJcmV0dXJuIGxheW91dDsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBQYXR0ZXJuIHBfcGFyYW1ldGVycyA9IFBhdHRlcm4KLQkJCS5jb21waWxlKAotCQkJCQkiXFw/cHJvYz0oLio/KSZwYXRoPSguKik/IiwgUGF0dGVybi5DQVNFX0lOU0VOU0lUSVZFIHwgUGF0dGVybi5ET1RBTEwpOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgSUVsZW1lbnRMYXlvdXQgZ2V0TGF5b3V0KFN0cmluZyB1cmwpIHsKLQotCQlQcm9jZXNzIG93bmluZ1Byb2MgPSBudWxsOwotCQlTdHJpbmcgcGF0aCA9IG51bGw7Ci0KLQkJTWF0Y2hlciBtID0gcF9wYXJhbWV0ZXJzLm1hdGNoZXIodXJsKTsKLQkJaWYgKG0uZmluZCgpKSB7Ci0JCQlTdHJpbmcgcHJvYyA9IG0uZ3JvdXAoMSk7Ci0JCQlwYXRoID0gbS5ncm91cCgyKTsKLQkJCUlMaWJyYXJ5TWFuYWdlciBtYW5hZ2VyID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKQotCQkJLmdldEN1cnJlbnRMaWJyYXJ5TWFuYWdlcigpOwotCQkJaWYgKG1hbmFnZXIgIT0gbnVsbCkgewotCQkJCW93bmluZ1Byb2MgPSAoUHJvY2VzcykgbWFuYWdlci5nZXRNZXRob2RFbGVtZW50KAotCQkJCQkJcHJvYyk7Ci0JCQl9Ci0JCX0KLQotCQkvLyBNZXRob2RFbGVtZW50IGVsZW1lbnQgPSAoTWV0aG9kRWxlbWVudCl1cmxNYXAuZ2V0KHVybCk7Ci0JCU1ldGhvZEVsZW1lbnQgZWxlbWVudCA9IFJlc291cmNlSGVscGVyLmdldEVsZW1lbnRGcm9tRmlsZU5hbWUodXJsKTsKLQkJaWYgKGVsZW1lbnQgIT0gbnVsbCkgewotCQkJcmV0dXJuIGNyZWF0ZUxheW91dChlbGVtZW50LCBvd25pbmdQcm9jLCBwYXRoKTsKLQkJfSBlbHNlIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiQ2FuJ3QgZmluZCBlbGVtZW50IGZvciB1cmwgJyIgKyB1cmwgKyAiJyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCi0JCXJldHVybiBudWxsOwotCi0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UXVlcnlTdHJpbmcoU3RyaW5nIHByb2MsIFN0cmluZyBwYXRoKSB7Ci0JCXJldHVybiAiPyIgKyBSZXNvdXJjZUhlbHBlci5VUkxfUEFSQU1FVEVSX1BST0NFU1MgKyAiPSIgKyBwcm9jICsgIiYiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJKyBSZXNvdXJjZUhlbHBlci5VUkxfUEFSQU1FVEVSX1BBVEggKyAiPSIgKyBwYXRoOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIE1ldGhvZENvbmZpZ3VyYXRpb24gZ2V0Q29uZmlndXJhdGlvbigpIHsKLQkJcmV0dXJuIHRoaXMuY29uZmlnOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFB1Ymxpc2hEaXIoU3RyaW5nIHBhdGgpIHsKLQkJdGhpcy5wdWJsaXNoX2RpciA9IHBhdGg7Ci0JCWlmICggIXRoaXMucHVibGlzaF9kaXIuZW5kc1dpdGgoRmlsZS5zZXBhcmF0b3IpICkgewotCQkJdGhpcy5wdWJsaXNoX2RpciArPSBGaWxlLnNlcGFyYXRvcjsKLQkJfQotCi0JCS8vIGluaXRpYWxpemUgcHVibGlzaGluZyBzaXRlIGlmIG5lZWRlZAotCQlpbml0X3B1Ymxpc2hpbmdTaXRlKCk7Ci0KLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFB1Ymxpc2hEaXIoKSB7Ci0JCXJldHVybiB0aGlzLnB1Ymxpc2hfZGlyOwotCX0KLQotCXByaXZhdGUgdm9pZCBpbml0X3B1Ymxpc2hpbmdTaXRlKCkgewotCQlpZiAoIEJyb3dzaW5nTGF5b3V0U2V0dGluZ3MuSU5TVEFOQ0UubmVlZFVwZGF0ZShwdWJsaXNoX2RpcikgKSB7Ci0JCQlpZiAoIExpYnJhcnlQbHVnaW4uZ2V0RGVmYXVsdCgpLmlzRGVidWdnaW5nKCkgKSB7Ci0JCQkJU3lzdGVtLm91dAotCQkJCQkJLnByaW50bG4oIkJlZ2luIGluaXRpYWxpemluZyBwdWJsaXNoaW5nIHNpdGU6ICIgKyBwdWJsaXNoX2Rpcik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCQotCQkJLy8gY29weSB0aGUgbGF5b3V0IGZpbGVzIGZyb20gcGx1Z2luIGxheW91dCB0byBwdWJsaXNoaWduIHNpdGUKLQkJCUxheW91dFJlc291cmNlcy5jb3B5TGF5b3V0RmlsZXMocHVibGlzaF9kaXIpOwotCQotCQkJaWYgKCBMaWJyYXJ5UGx1Z2luLmdldERlZmF1bHQoKS5pc0RlYnVnZ2luZygpICkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRW5kIGluaXRpYWxpemluZyBwdWJsaXNoaW5nIHNpdGU6ICIgKyBwdWJsaXNoX2Rpcik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCX0KLQotLy8JcHVibGljIHZvaWQgY29weUxpYnJhcnlSZXNvdXJjZXMoKSB7Ci0vLwkJaWYgKCBMaWJyYXJ5UGx1Z2luLmdldERlZmF1bHQoKS5pc0RlYnVnZ2luZygpICkgewotLy8JCQlTeXN0ZW0ub3V0Ci0vLwkJCQkJLnByaW50bG4oIkJlZ2luIGNvcHlpbmcgbGlicmFyeSByZXNvdXJjZXMgdG8gcHVibGlzaGluZyBzaXRlOiAiICsgcHVibGlzaF9kaXIpOyAvLyROT04tTkxTLTEkCi0vLwkJfQotLy8JCQotLy8JCS8vIGNvcHkgbGlicmFyeSByZXNvdXJjZXMgZnJvbSBsaWJyYXJ5IHRvIHB1Ymxpc2hpbmcgc2l0ZQotLy8JCUZpbGUgbGliUm9vdCA9IG5ldyBGaWxlKExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnlQYXRoKCkpOwotLy8JCWlmIChsaWJSb290ICE9IG51bGwpIHsKLS8vCQkJTGF5b3V0UmVzb3VyY2VzLmNvcHlEaXIobGliUm9vdC5nZXRQYXRoKCksIHB1Ymxpc2hfZGlyKTsKLS8vCQl9Ci0vLwotLy8JCWlmICggTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkuaXNEZWJ1Z2dpbmcoKSApIHsKLS8vCQkJU3lzdGVtLm91dAotLy8JCQkJCS5wcmludGxuKCJFbmQgY29weWluZyBsaWJyYXJ5IHJlc291cmNlcyB0byBwdWJsaXNoaW5nIHNpdGU6ICIgKyBwdWJsaXNoX2Rpcik7IC8vJE5PTi1OTFMtMSQKLS8vCQl9Ci0vLwl9Ci0KLQlwdWJsaWMgdm9pZCBjbGVhcigpIHsKLQkJLy8gbGF5b3V0TWFwLmNsZWFyKCk7Ci0JCQotCQlkaWFncmFtU2VydmljZSA9IG51bGw7Ci0JCQotCQlpZiAoIHN1cHJlc3Npb25NYXAgIT0gbnVsbCApCi0JCXsKLQkJCXN1cHJlc3Npb25NYXAuY2xlYXIoKTsKLQkJfQotCQkKLQkJbGF5b3V0RXh0ZW5zaW9ucy5jbGVhcigpOwotCQlsYXlvdXRFeHRlbnNpb25zID0gbnVsbDsKLQkJCi0JCWNvbnRlbnRMYXlvdXRBZGFwdGVyRmFjdG9yeS5jbGVhcigpOwotCQlkaWFncmFtTGF5b3V0QWRhcHRlckZhY3RvcnkuY2xlYXIoKTsKLQkJCi0JCWlmICggdmFsaWRhdG9yICE9IG51bGwgKQotCQl7Ci0JCQl2YWxpZGF0b3IuZGlzcG9zZSgpOwotCQkJdmFsaWRhdG9yID0gbnVsbDsKLQkJfQotCQkKLQkJaWYgKCByZWFsaXplciAhPSBudWxsICkgewotCQkJcmVhbGl6ZXIuZGlzcG9zZSgpOwotCQkJcmVhbGl6ZXIgPSBudWxsOwotCQl9Ci0JCQotCQlpZiAoIGNvbnRlbnRMYXlvdXRBZGFwdGVyRmFjdG9yeSAhPSBudWxsICkgewotCQkJY29udGVudExheW91dEFkYXB0ZXJGYWN0b3J5LmNsZWFyKCk7Ci0JCQljb250ZW50TGF5b3V0QWRhcHRlckZhY3RvcnkgPSBudWxsOwkJCQotCQl9Ci0JCQotCQlpZiAoIGRpYWdyYW1MYXlvdXRBZGFwdGVyRmFjdG9yeSAhPSBudWxsICkgewotCQkJZGlhZ3JhbUxheW91dEFkYXB0ZXJGYWN0b3J5LmNsZWFyKCk7Ci0JCQlkaWFncmFtTGF5b3V0QWRhcHRlckZhY3RvcnkgPSBudWxsOwkJCQotCQl9Ci0JCSAKLQl9Ci0KLQlwdWJsaWMgY2xhc3MgTGF5b3V0QWRhcHRlckZhY3RvcnkKLQl7Ci0JCXB1YmxpYyBDb25maWd1cmFibGVDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IHdic0FkYXB0ZXJGYWN0b3J5ID0gbnVsbDsKLQkJcHVibGljIENvbmZpZ3VyYWJsZUNvbXBvc2VkQWRhcHRlckZhY3RvcnkgdGJzQWRhcHRlckZhY3RvcnkgPSBudWxsOwotCQlwdWJsaWMgQ29uZmlndXJhYmxlQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSB3cGJzQWRhcHRlckZhY3RvcnkgPSBudWxsOwotCQlwdWJsaWMgQ29uZmlndXJhYmxlQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBjYnNBZGFwdGVyRmFjdG9yeSA9IG51bGw7Ci0KLQkJUHJvY2Vzc0FkYXB0ZXJGYWN0b3J5RmlsdGVyIGNvbmZpZ3VyYXRvciA9IG51bGw7Ci0JCQotCQlwdWJsaWMgTGF5b3V0QWRhcHRlckZhY3RvcnkoTWV0aG9kQ29uZmlndXJhdGlvbiBtZXRob2RDb25maWcpCi0JCXsKLQkJCS8vIGNyZWF0ZSBhZGFwdCBmYWN0b3JpZXMKLQkJCS8vCi0JCQlpZihpc1B1Ymxpc2hpbmdNb2RlKCkpIHsKLQkJCQl3YnNBZGFwdGVyRmFjdG9yeSA9IChDb25maWd1cmFibGVDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KSBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCS5jcmVhdGVQdWJsaXNoaW5nV0JTQWRhcHRlckZhY3RvcnkoKTsKLQkJCQl0YnNBZGFwdGVyRmFjdG9yeSA9IChDb25maWd1cmFibGVDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KSBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCS5jcmVhdGVQdWJsaXNoaW5nVEJTQWRhcHRlckZhY3RvcnkoKTsKLQkJCQl3cGJzQWRhcHRlckZhY3RvcnkgPSAoQ29uZmlndXJhYmxlQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSkgVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkuY3JlYXRlUHVibGlzaGluZ1dQQlNBZGFwdGVyRmFjdG9yeSgpOwotCQkJCWNic0FkYXB0ZXJGYWN0b3J5ID0gKENvbmZpZ3VyYWJsZUNvbXBvc2VkQWRhcHRlckZhY3RvcnkpIFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJLmNyZWF0ZVB1Ymxpc2hpbmdDQlNBZGFwdGVyRmFjdG9yeSgpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJd2JzQWRhcHRlckZhY3RvcnkgPSAoQ29uZmlndXJhYmxlQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSkgVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkuY3JlYXRlV0JTQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpOwotCQkJCXRic0FkYXB0ZXJGYWN0b3J5ID0gKENvbmZpZ3VyYWJsZUNvbXBvc2VkQWRhcHRlckZhY3RvcnkpIFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJLmNyZWF0ZVRCU0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKTsKLQkJCQl3cGJzQWRhcHRlckZhY3RvcnkgPSAoQ29uZmlndXJhYmxlQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSkgVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkuY3JlYXRlV1BCU0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKTsKLQkJCQljYnNBZGFwdGVyRmFjdG9yeSA9IChDb25maWd1cmFibGVDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KSBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCS5jcmVhdGVQcm9jZXNzQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpOwotCQkJfQotCi0JCQkvLyBzZXQgY29uZmlndXJhdGlvbiBmaWx0ZXIKLQkJCWNvbmZpZ3VyYXRvciA9IG5ldyBQcm9jZXNzQWRhcHRlckZhY3RvcnlGaWx0ZXIobWV0aG9kQ29uZmlnLCB0aGlzKTsKLQotCQkJd2JzQWRhcHRlckZhY3Rvcnkuc2V0RmlsdGVyKGNvbmZpZ3VyYXRvcik7Ci0JCQl0YnNBZGFwdGVyRmFjdG9yeS5zZXRGaWx0ZXIoY29uZmlndXJhdG9yKTsKLQkJCXdwYnNBZGFwdGVyRmFjdG9yeS5zZXRGaWx0ZXIoY29uZmlndXJhdG9yKTsKLQkJCWNic0FkYXB0ZXJGYWN0b3J5LnNldEZpbHRlcihjb25maWd1cmF0b3IpOwkJCi0JCX0KLQkJCi0JCXB1YmxpYyBJRmlsdGVyIGdldEZpbHRlcigpIHsKLQkJCXJldHVybiBjb25maWd1cmF0b3I7Ci0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIGNsZWFyKCkKLQkJewotCQkJCi0JCQlpZiAod2JzQWRhcHRlckZhY3RvcnkgIT0gbnVsbCkgewotCQkJCXdic0FkYXB0ZXJGYWN0b3J5LnNldEZpbHRlcihudWxsKTsKLQkJCQl3YnNBZGFwdGVyRmFjdG9yeS5kaXNwb3NlKCk7Ci0JCQkJd2JzQWRhcHRlckZhY3RvcnkgPSBudWxsOwotCQkJfQotCi0JCQlpZiAodGJzQWRhcHRlckZhY3RvcnkgIT0gbnVsbCkgewotCQkJCXRic0FkYXB0ZXJGYWN0b3J5LnNldEZpbHRlcihudWxsKTsKLQkJCQl0YnNBZGFwdGVyRmFjdG9yeS5kaXNwb3NlKCk7Ci0JCQkJdGJzQWRhcHRlckZhY3RvcnkgPSBudWxsOwotCQkJfQotCi0JCQlpZiAod3Bic0FkYXB0ZXJGYWN0b3J5ICE9IG51bGwpIHsKLQkJCQl3cGJzQWRhcHRlckZhY3Rvcnkuc2V0RmlsdGVyKG51bGwpOwotCQkJCXdwYnNBZGFwdGVyRmFjdG9yeS5kaXNwb3NlKCk7Ci0JCQkJd3Bic0FkYXB0ZXJGYWN0b3J5ID0gbnVsbDsKLQkJCX0KLQotCQkJaWYgKGNic0FkYXB0ZXJGYWN0b3J5ICE9IG51bGwpIHsKLQkJCQljYnNBZGFwdGVyRmFjdG9yeS5zZXRGaWx0ZXIobnVsbCk7Ci0JCQkJY2JzQWRhcHRlckZhY3RvcnkuZGlzcG9zZSgpOwotCQkJCWNic0FkYXB0ZXJGYWN0b3J5ID0gbnVsbDsKLQkJCX0KLQkJCQotCQkJaWYgKCBjb25maWd1cmF0b3IgIT0gbnVsbCApIHsKLQkJCQljb25maWd1cmF0b3IuZGlzcG9zZSgpOwotCQkJCWNvbmZpZ3VyYXRvciA9IG51bGw7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBTdXBwcmVzc2lvbiBjcmVhdGVTdXBwcmVzc2lvbihQcm9jZXNzIHByb2MpIHsKLQkJLy8gY2hlY2sgaWYgdGhlcmUgYXJlIGV4dGVuc2lvbnMKLQkJaWYgKCBsYXlvdXRFeHRlbnNpb25zICE9IG51bGwgJiYgbGF5b3V0RXh0ZW5zaW9ucy5zaXplKCkgPiAwICkgewotCQkJZm9yICggSXRlcmF0b3I8TGF5b3V0RXh0ZW5zaW9uPiBpdCA9IGxheW91dEV4dGVuc2lvbnMudmFsdWVzKCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOyApIHsKLQkJCQlMYXlvdXRFeHRlbnNpb24gZXh0ID0gaXQubmV4dCgpOwotCQkJCVN1cHByZXNzaW9uIHN1cCA9IGV4dC5nZXRTdXBwcmVzc2lvbihwcm9jKTsKLQkJCQlpZiAoIHN1cCAhPSBudWxsICkgewotCQkJCQlyZXR1cm4gc3VwOwotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIG5ldyBTdXBwcmVzc2lvbihwcm9jKTsKLQl9Ci19Ci0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvRWxlbWVudFByb3BlcnR5UHJvdmlkZXJNYW5hZ2VyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L0VsZW1lbnRQcm9wZXJ0eVByb3ZpZGVyTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YTgwOGZjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvRWxlbWVudFByb3BlcnR5UHJvdmlkZXJNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LnV0aWwuWG1sRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLklFbGVtZW50UHJvcGVydHlQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBsb2FkcyBhbmQgbWFuYWdlcyBhbnkgZWxlbWVudFByb3BlcnR5UHJvdmlkZXMgcmVnaXN0ZXJlZC4gVGhpcyBjbGFzcyBydW5zIGFzIGEgc2luZ2xldG9uLgotICogCi0gKiBAYXV0aG9yIFBpZXJyZSBQYWRvdmFuaQotICoKLSAqLwotcHVibGljIGNsYXNzIEVsZW1lbnRQcm9wZXJ0eVByb3ZpZGVyTWFuYWdlciB7Ci0KLSAgLyoqCi0gICAqIFRoZSBleHRlbnNpb24gcG9pbnQgbmFtZXNwYWNlLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhURU5TSU9OX1BPSU5UX05BTUVTUEFDRSA9ICJvcmcuZWNsaXBzZS5lcGYubGlicmFyeSI7IC8vJE5PTi1OTFMtMSQKLQotICAvKioKLSAgICogVGhlIGV4dGVuc2lvbiBwb2ludCBuYW1lLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhURU5TSU9OX1BPSU5UX05BTUUgPSAiZWxlbWVudFByb3BlcnR5UHJvdmlkZXJzIjsgLy8kTk9OLU5MUy0xJAotCi0gIC8qKgotICAgKiBUaGUgImNsYXNzIiBhdHRyaWJ1dGUgbmFtZS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENMQVNTX0FUVFJJQl9OQU1FID0gImNsYXNzIjsgLy8kTk9OLU5MUy0xJAotCi0gIHByaXZhdGUgc3RhdGljIEVsZW1lbnRQcm9wZXJ0eVByb3ZpZGVyTWFuYWdlciBteXNlbGY7Ci0gIAotICBwcml2YXRlIEFycmF5TGlzdDxJRWxlbWVudFByb3BlcnR5UHJvdmlkZXI+IHByb3ZpZGVyczsKLSAgCi0gIHByaXZhdGUgRWxlbWVudFByb3BlcnR5UHJvdmlkZXJNYW5hZ2VyKCkgewotICAgIC8vIHByaXZhdGUgdG8gYXZvaWQgb3V0c2lkZSBjYWxscwotICB9Ci0gIAotICAvKioKLSAgICogVGhpcyBtZXRob2QgcmV0dXJucyB0aGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MuCi0gICAqIAotICAgKiBAcmV0dXJuIEVsZW1lbnRQcm9wZXJ0eVByb3ZpZGVyTWFuYWdlcgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBFbGVtZW50UHJvcGVydHlQcm92aWRlck1hbmFnZXIgZ2V0SW5zdGFuY2UoKSB7Ci0gICAgaWYgKG15c2VsZiA9PSBudWxsKSB7Ci0gICAgICBteXNlbGYgPSBuZXcgRWxlbWVudFByb3BlcnR5UHJvdmlkZXJNYW5hZ2VyKCk7Ci0gICAgfQotICAgIHJldHVybiBteXNlbGY7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBUaGlzIG1ldGhvZCB3aWxsIGxldmVyYWdlIHRoZSBlbGVtZW50UHJvcGVydHlQcm92aWRlcnMgZXh0ZW5zaW9uIHBvaW50IHRvIGFkZCBhZGRpdGlvbmFsIAotICAgKiBjdXN0b20gcHJvcGVydGllcyB0byB0aGUgeG1sIGRvY3VtZW50IHVzZWQgdG8gcHVibGlzaCBhZ2FpbnN0IHRoZSBYU0xUIHRlbXBsYXRlcy4gQSBuZXcgY2hpbGQKLSAgICogZWxlbWVudCB3aWxsIGJlIGNyZWF0ZWQgYmFzZWQgb24gdGhlIG5hbWUgcHJvdmlkZSBieSB0aGUgcHJvdmlkZXIuCi0gICAqIAotICAgKiBAcGFyYW0gZWxlbWVudAotICAgKiAgICAgICBNZXRob2RFbGVtZW50Ci0gICAqIEBwYXJhbSBkb2N1bWVudAotICAgKiAgICAgICBYbWxFbGVtZW50Ci0gICAqLwotICBwdWJsaWMgdm9pZCBsb2FkQWRkaXRpb25hbEVsZW1lbnRQcm9wZXJ0aWVzKE1ldGhvZEVsZW1lbnQgZWxlbWVudCwgWG1sRWxlbWVudCBkb2N1bWVudCkgewotICAgIC8vIExvYWQgdGhlIHByb3ZpZGVycyBpZiB0aGV5IGhhdmVuJ3QgYmVlbiBsb2FkZWQgYWxyZWFkeS4KLSAgICBpZiAocHJvdmlkZXJzID09IG51bGwpIHsKLSAgICAgIGxvYWRQcm92aWRlcnMoKTsKLSAgICB9Ci0gIAotICAgIC8vIE5vdyBmb3IgZWFjaCBwcm92aWRlciBoYXZlIHRoZW0gbG9hZCBwcm9wZXJ0aWVzIGFzIG5lZWRlZC4gSWYgYSBudWxsIGlzIHJldHVybmVkIGZvciB0aGUgbmFtZSwgCi0gICAgLy8gc2tpcCB0aGUgcHJvdmlkZXIuCi0gICAgZm9yIChpbnQgaWR4ID0gMDsgaWR4IDwgcHJvdmlkZXJzLnNpemUoKTsgaWR4ICsrKSB7Ci0gICAgICBJRWxlbWVudFByb3BlcnR5UHJvdmlkZXIgcHJvdmlkZXIgPSBwcm92aWRlcnMuZ2V0KGlkeCk7Ci0gICAgICBTdHJpbmcgY2hpbGROYW1lID0gcHJvdmlkZXIuZ2V0Q2hpbGRFbGVtZW50TmFtZShlbGVtZW50KTsKLSAgICAgIGlmIChjaGlsZE5hbWUgIT0gbnVsbCAmJiBjaGlsZE5hbWUubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgIFhtbEVsZW1lbnQgY2hpbGRFbGVtZW50ID0gZG9jdW1lbnQubmV3Q2hpbGQoY2hpbGROYW1lKTsKLSAgICAgICAgcHJvdmlkZXIucHVibGlzaE1ldGhvZEVsZW1lbnRQcm9wZXJ0aWVzKGVsZW1lbnQsIGNoaWxkRWxlbWVudCk7Ci0gICAgICB9Ci0gICAgfSAKLSAgfQotICAKLSAgcHJpdmF0ZSB2b2lkIGxvYWRQcm92aWRlcnMoKSB7Ci0gICAgcHJvdmlkZXJzID0gbmV3IEFycmF5TGlzdDxJRWxlbWVudFByb3BlcnR5UHJvdmlkZXI+KCk7Ci0gICAgSUV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5ID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKTsKLSAgICBJRXh0ZW5zaW9uUG9pbnQgZXh0ZW5zaW9uUG9pbnQgPSBleHRlbnNpb25SZWdpc3RyeS5nZXRFeHRlbnNpb25Qb2ludCgKLSAgICAgICAgRVhURU5TSU9OX1BPSU5UX05BTUVTUEFDRSwgRVhURU5TSU9OX1BPSU5UX05BTUUpOwotICAgIGlmIChleHRlbnNpb25Qb2ludCAhPSBudWxsKSB7Ci0gICAgICBJRXh0ZW5zaW9uW10gZXh0ZW5zaW9ucyA9IGV4dGVuc2lvblBvaW50LmdldEV4dGVuc2lvbnMoKTsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZXh0ZW5zaW9ucy5sZW5ndGg7IGkrKykgewotICAgICAgICBJRXh0ZW5zaW9uIGV4dGVuc2lvbiA9IGV4dGVuc2lvbnNbaV07Ci0gICAgICAgIElDb25maWd1cmF0aW9uRWxlbWVudFtdIGNvbmZpZ0VsZW1lbnRzID0gZXh0ZW5zaW9uCi0gICAgICAgICAgICAuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzKCk7Ci0gICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgY29uZmlnRWxlbWVudHMubGVuZ3RoOyBqKyspIHsKLSAgICAgICAgICBJQ29uZmlndXJhdGlvbkVsZW1lbnQgY29uZmlnRWxlbWVudCA9IGNvbmZpZ0VsZW1lbnRzW2pdOwotICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBwcm92aWRlcnMuYWRkKChJRWxlbWVudFByb3BlcnR5UHJvdmlkZXIpIGNvbmZpZ0VsZW1lbnQuY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbihDTEFTU19BVFRSSUJfTkFNRSkpOwotICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBMaWJyYXJ5UGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L0h0bWxCdWlsZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L0h0bWxCdWlsZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0MzlkZDEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9IdG1sQnVpbGRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbVdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLlN0cmluZ1dyaXRlcjsKLWltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7Ci1pbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLkkxOG5VdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuVGltZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi54bWwuWFNMVFByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LnV0aWwuWG1sRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQudXRpbC5YbWxIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucHJlZnMuUHJlZmVyZW5jZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5MaWJyYXJ5VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLlJlc291cmNlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLQotaW1wb3J0IGNvbS5pYm0uaWN1LnV0aWwuQ2FsZW5kYXI7Ci0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgdGhlIEhUTUwgcGFnZSBmb3IgYSBNZXRob2QgZWxlbWVudC4KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgSHRtbEJ1aWxkZXIgewotCi0JcHJpdmF0ZSBib29sZWFuIGRlYnVnID0gZmFsc2U7Ci0KLQlwcml2YXRlIFByb3BlcnRpZXMgeHNsUGFyYW1zID0gbnVsbDsKLQotCXByaXZhdGUgRWxlbWVudExheW91dE1hbmFnZXIgbWdyID0gbnVsbDsKLQotCXByaXZhdGUgRWxlbWVudExheW91dE1hbmFnZXIgaW50ZXJuYWxfbWdyID0gbnVsbDsKLQotCS8vcHJpdmF0ZSBDb250ZW50UmVzb3VyY2VTY2FubmVyIHNjYW5uZXIgPSBudWxsOwotCi0JcHJpdmF0ZSBib29sZWFuIHNjYW5Db250ZW50ID0gdHJ1ZTsKLQotCS8vIElmIHRydWUsIGRpc3BsYXkgdGhlICJTaG93IHRyZWUgYnJvd3NlIiBpbWFnZS9saW5rIHRvIHRoZSByaWdodCBvZiBhCi0JLy8gcHVibGlzaGVkIHBhZ2UuCi0JcHJpdmF0ZSBib29sZWFuIHNob3dUcmVlQnJvd3NlciA9IGZhbHNlOwotCi0JLy9wcml2YXRlIElDb250ZW50VmFsaWRhdG9yIHZhbGlkYXRvciA9IG51bGw7Ci0KLQkvLyBvdmVycmlkZSB0aGlzIHBhdGggdG8gc3BlY2lmeSB4c2wgcGF0aAotCXByaXZhdGUgU3RyaW5nIGxheW91dFhzbFJvb3RQYXRoID0gTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TGF5b3V0WHNsUGF0aCgpOwotCQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIEh0bWxCdWlsZGVyKCkgewotCQl0aGlzKG51bGwpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIEh0bWxCdWlsZGVyKEVsZW1lbnRMYXlvdXRNYW5hZ2VyIG1ncikgewotCQlpbml0KCk7Ci0JCXNldExheW91dE1hbmFnZXIobWdyKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0TGF5b3V0WHNsUm9vdFBhdGgoU3RyaW5nIHBhdGgpIHsKLQkJdHJ5IHsKLQkJCWlmICggcGF0aCAhPSBudWxsICYmIHBhdGgubGVuZ3RoKCkgPiAwICkgewotCQkJCXRoaXMubGF5b3V0WHNsUm9vdFBhdGggPSBwYXRoOwotCQkJCWlmICggIXRoaXMubGF5b3V0WHNsUm9vdFBhdGguZW5kc1dpdGgoRmlsZS5zZXBhcmF0b3IpICkgewotCQkJCQl0aGlzLmxheW91dFhzbFJvb3RQYXRoICs9IEZpbGUuc2VwYXJhdG9yOwotCQkJCX0KLQkJCQkKLQkJCQkvLyBnZXQgdGhlIGxvY2FsaXplZCBmaWxlCi0JCQkJRmlsZSBmaWxlID0gbmV3IEZpbGUodGhpcy5sYXlvdXRYc2xSb290UGF0aCwgInJlc291cmNlcy5wcm9wZXJ0aWVzIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlMb2NhbGUgbG9jYWxlID0gTG9jYWxlLmdldERlZmF1bHQoKTsKLQkJCQlTdHJpbmcgbG9jYWxGaWxlTmFtZSA9IEkxOG5VdGlsLmdldExvY2FsaXplZEZpbGUoZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSwgbG9jYWxlKTsKLQkJCQlpZiAoIGxvY2FsRmlsZU5hbWUgIT0gbnVsbCApIHsKLQkJCQkJZmlsZSA9IG5ldyBGaWxlKGxvY2FsRmlsZU5hbWUpOwotCQkJCX0KLQkJCQlpZiAoZmlsZS5leGlzdHMoKSkgewotCQkJCQl4c2xQYXJhbXMubG9hZChuZXcgRmlsZUlucHV0U3RyZWFtKGZpbGUpKTsKLQkJCQl9CQotCQkJCQotCQkJCS8vIHRoZSBQcmVmZXJlbmNlVXRpbCBhbHNvIHVzZXMgdGhlIHhzbCBwcm9wZXJ0aWVzIGZvciBhY3Rpdml0eSBicmVha2Rvd24gbGF5b3V0Ci0JCQkJLy8gc28gc2V0IGl0IGFzIHdlbGwKLQkJCQlQcmVmZXJlbmNlVXRpbC5zZXRYc2xQcm9wZXJ0aWVzKHhzbFBhcmFtcyk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBQZXJmb3JtcyB0aGUgbmVjZXNzYXJ5IGluaXRpYWxpemF0aW9uLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXQoKSB7Ci0JCWRlYnVnID0gTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkuaXNEZWJ1Z2dpbmcoKTsKLQkJbG9hZERlZmF1bHRMYXlvdXRYc2woKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBsb2FkRGVmYXVsdExheW91dFhzbCgpIHsKLQkJbGF5b3V0WHNsUm9vdFBhdGggPSBMaWJyYXJ5UGx1Z2luLmdldERlZmF1bHQoKS5nZXRMYXlvdXRYc2xQYXRoKCk7Ci0JCXRyeSB7Ci0JCQl4c2xQYXJhbXMgPSBMaWJyYXJ5UGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcm9wZXJ0aWVzKAotCQkJCQkiL2xheW91dC94c2wvcmVzb3VyY2VzLnByb3BlcnRpZXMiKTsgLy8kTk9OLU5MUy0xJAotCQkJCi0JCQkvLyBhZGQgdGhlIGNvbG9uIHByb3BlcnR5LCAKLQkJCXhzbFBhcmFtcy5wdXQoImNvbG9uX3dpdGhfc3BhY2UiLCBMaWJyYXJ5UmVzb3VyY2VzLmNvbG9uX3dpdGhfc3BhY2UpOyAvLyROT04tTkxTLTEkCi0JCQkKLQkJCS8vIHRoZSBQcmVmZXJlbmNlVXRpbCBhbHNvIHVzZXMgdGhlIHhzbCBwcm9wZXJ0aWVzIGZvciBhY3Rpdml0eSBicmVha2Rvd24gbGF5b3V0Ci0JCQkvLyBzbyBzZXQgaXQgYXMgd2VsbAotCQkJUHJlZmVyZW5jZVV0aWwuc2V0WHNsUHJvcGVydGllcyh4c2xQYXJhbXMpOwotCi0JCQkKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJeHNsUGFyYW1zID0gbnVsbDsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwdWJsaXNoIGRpcmVjdG9yeS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFB1Ymxpc2hEaXIoKSB7Ci0JCXJldHVybiAobWdyID09IG51bGwpID8gbnVsbCA6IG1nci5nZXRQdWJsaXNoRGlyKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcHVibGlzaCBkaXJlY3RvcnkuCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHVibGlzaERpcihTdHJpbmcgZGlyKSB7Ci0JCWlmIChtZ3IgIT0gbnVsbCkgewotCQkJbWdyLnNldFB1Ymxpc2hEaXIoZGlyKTsKLQkJfQotCi0JCS8vZ2V0U2Nhbm5lcigpLnNldFRhcmdldFJvb3RQYXRoKG5ldyBGaWxlKGdldFB1Ymxpc2hEaXIoKSkpOwotCi0JCS8vIFJlc2V0IHRoZSB2YWxpZGF0b3IncyBwdWJsaXNoIGRpci4KLQkJZ2V0VmFsaWRhdG9yKCkuc2V0UHVibGlzaERpcihkaXIpOwotCX0KLQotLy8JLyoqCi0vLwkgKiBTZXRzIHRoZSBjb250ZW50IHZhbGlkYXRvci4KLS8vCSAqLwotLy8JcHVibGljIHZvaWQgc2V0VmFsaWRhdG9yKElDb250ZW50VmFsaWRhdG9yIHZhbGlkYXRvcikgewotLy8JCXRoaXMudmFsaWRhdG9yID0gdmFsaWRhdG9yOwotLy8JCWdldFNjYW5uZXIoKS5zZXRWYWxpZGF0b3IodGhpcy52YWxpZGF0b3IpOwotLy8JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY29udGVudCB2YWxpZGF0b3IuCi0JICovCi0JcHVibGljIElDb250ZW50VmFsaWRhdG9yIGdldFZhbGlkYXRvcigpIHsKLS8vCQlpZiAodmFsaWRhdG9yID09IG51bGwpIHsKLS8vCQkJdmFsaWRhdG9yID0gbmV3IERlZmF1bHRDb250ZW50VmFsaWRhdG9yKGdldFB1Ymxpc2hEaXIoKSk7Ci0vLwkJfQotLy8JCXJldHVybiB2YWxpZGF0b3I7Ci0JCQotCQlyZXR1cm4gdGhpcy5tZ3IuZ2V0VmFsaWRhdG9yKCk7Ci0JfQotCi0vLwkvKioKLS8vCSAqIFJldHVybnMgdGhlIGNvbnRlbnQgcmVzb3VyY2Ugc2Nhbm5lciBmb3IgdGhlIGVsZW1lbnQuCi0vLwkgKi8KLS8vCXByaXZhdGUgQ29udGVudFJlc291cmNlU2Nhbm5lciBnZXRTY2FubmVyKE1ldGhvZEVsZW1lbnQgb3duZXIpIHsKLS8vCQlJTGlicmFyeVJlc291cmNlTWFuYWdlciByZXNNZ3IgPSBSZXNvdXJjZUhlbHBlci5nZXRSZXNvdXJjZU1ncihvd25lcik7Ci0vLwkJaWYgKCByZXNNZ3IgPT0gbnVsbCApIHsKLS8vCQkJcmV0dXJuIG51bGw7Ci0vLwkJfQotLy8JCQotLy8JCVN0cmluZyByb290Q29udGVudFBhdGggPSByZXNNZ3IuZ2V0TG9naWNhbFBsdWdpblBhdGgob3duZXIpOwotLy8JCUZpbGUgc3JjX3Jvb3QgPSBuZXcgRmlsZShyZXNNZ3IuZ2V0UGh5c2ljYWxQbHVnaW5QYXRoKG93bmVyKSk7Ci0vLwkJRmlsZSB0Z3Rfcm9vdCA9IG5ldyBGaWxlKGdldFB1Ymxpc2hEaXIoKSwgcm9vdENvbnRlbnRQYXRoKTsKLS8vCQlDb250ZW50UmVzb3VyY2VTY2FubmVyIHNjYW5uZXIgPSBuZXcgQ29udGVudFJlc291cmNlU2Nhbm5lcihzcmNfcm9vdCwgdGd0X3Jvb3QsIHJvb3RDb250ZW50UGF0aCwgZ2V0VmFsaWRhdG9yKCkpOwotLy8KLS8vCQlyZXR1cm4gc2Nhbm5lcjsKLS8vCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGZsYWcgdG8gZGlzcGxheSB0aGUgIlNob3cgdHJlZSBicm93c2VyIiBpbWFnZS9saW5rLgotCSAqLwotCXB1YmxpYyB2b2lkIGVuYWJsZVRyZWVCcm93c2VyKGJvb2xlYW4gZmxhZykgewotCQl0aGlzLnNob3dUcmVlQnJvd3NlciA9IGZsYWc7Ci0JfQotCi0JLyoqCi0JICogRW5hYmxlcyBjb250ZW50IHNjYW5uaW5nLgotCSAqLwotCXB1YmxpYyB2b2lkIGVuYWJsZUNvbnRlbnRTY2FuKGJvb2xlYW4gc2NhbikgewotCQl0aGlzLnNjYW5Db250ZW50ID0gc2NhbjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIGNvbnRlbnQgc2Nhbm5pbmcgaXMgZW5hYmxlZC4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjb250ZW50U2NhbkVuYWJsZWQoKSB7Ci0JCXJldHVybiBzY2FuQ29udGVudDsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBFbGVtZW50IExheW91dCBNYW5hZ2VyLgotCSAqIDxwPgotCSAqIEEgRWxlbWVudCBMYXlvdXQgTWFuYWdlciBpcyBhc3NvY2lhdGVkIHdpdGggYSBjb25maWd1cmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldExheW91dE1hbmFnZXIoRWxlbWVudExheW91dE1hbmFnZXIgbWdyKSB7Ci0JCXRoaXMubWdyID0gbWdyOwotCQlpZiAodGhpcy5tZ3IgPT0gbnVsbCkgewotCQkJdGhpcy5tZ3IgPSBnZXREZWZhdWx0TGF5b3V0TWFuYWdlcigpOyAKLQkJfQotCi0JCS8vIFVwZGF0ZSB0aGUgc2Nhbm5lciB0YXJnZXQgcGF0aC4KLQkJLy9nZXRTY2FubmVyKCkuc2V0VGFyZ2V0Um9vdFBhdGgobmV3IEZpbGUoZ2V0UHVibGlzaERpcigpKSk7Ci0KLQkJLy8gUmVzZXQgdGhlIHZhbGlkYXRvciBwdWIgZGlyLgotCQlnZXRWYWxpZGF0b3IoKS5zZXRQdWJsaXNoRGlyKGdldFB1Ymxpc2hEaXIoKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZGVmYXVsdCBFbGVtZW50IExheW91dCBNYW5hZ2VyLgotCSAqLwotCXByaXZhdGUgRWxlbWVudExheW91dE1hbmFnZXIgZ2V0RGVmYXVsdExheW91dE1hbmFnZXIoKSB7Ci0JCWlmICggdGhpcy5pbnRlcm5hbF9tZ3IgPT0gbnVsbCApIHsKLQkJCXRoaXMuaW50ZXJuYWxfbWdyID0gbmV3IEVsZW1lbnRMYXlvdXRNYW5hZ2VyKCk7Ci0JCX0KLQkJCi0JCXJldHVybiB0aGlzLmludGVybmFsX21ncjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBFbGVtZW50IExheW91dCBNYW5hZ2VyLgotCSAqLwotCXB1YmxpYyBFbGVtZW50TGF5b3V0TWFuYWdlciBnZXRMYXlvdXRNYW5hZ2VyKCkgewotCQlpZiAodGhpcy5tZ3IgPT0gbnVsbCkgewotCQkJdGhpcy5tZ3IgPSBnZXREZWZhdWx0TGF5b3V0TWFuYWdlcigpOwotCQl9Ci0JCXJldHVybiBtZ3I7Ci0JfQotCi0JLyoqCi0JICogR2VuZXJhdGVzIHRoZSBIVE1MIGZvciBhIE1ldGhvZCBlbGVtZW50LgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogICAgICAgICAgICBBIE1ldGhvZCBlbGVtZW50LgotCSAqIEByZXR1cm4gQSB1cmwgb2YgdGhlIGdlbmVyYXRlZCBjb250ZW50IEhUTUwgZmlsZS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdlbmVyYXRlSHRtbChNZXRob2RFbGVtZW50IGVsZW1lbnQpIHsKLQkJU3RyaW5nIHVybCA9IG51bGw7Ci0JCWlmIChkZWJ1ZykgewotCQkJbG9uZyBzdGFydFRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCUlFbGVtZW50TGF5b3V0IGxheW91dCA9IGdldExheW91dE1hbmFnZXIoKS5nZXRMYXlvdXQoZWxlbWVudCwgdHJ1ZSk7Ci0JCQl1cmwgPSBnZW5lcmF0ZUh0bWwobGF5b3V0KTsKLQkJCWxvbmcgZW5kVGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQkJU3lzdGVtLm91dAotCQkJCQkucHJpbnRsbigiVGltZSB0YWtlbiB0byByZW5kZXIgSFRNTCBwYWdlIGZvciAiICsgZWxlbWVudC5nZXROYW1lKCkgKyAvLyROT04tTkxTLTEkCi0JCQkJCQkJIjogIiArIChlbmRUaW1lIC0gc3RhcnRUaW1lKSArICIgbXMiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0gZWxzZSB7Ci0JCQlJRWxlbWVudExheW91dCBsYXlvdXQgPSBnZXRMYXlvdXRNYW5hZ2VyKCkuZ2V0TGF5b3V0KGVsZW1lbnQsIHRydWUpOwotCQkJdXJsID0gZ2VuZXJhdGVIdG1sKGxheW91dCk7Ci0JCX0KLQkJcmV0dXJuIHVybDsKLQl9Ci0KLQotCS8qKgotCSAqIEdlbmVyYXRlcyB0aGUgSFRNTCBmb3IgYSBNZXRob2QgZWxlbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gdXJsCi0JICogICAgICAgICAgICBUaGUgVVJMIG9mIGEgTWV0aG9kIGVsZW1lbnQuCi0JICovCi0JcHVibGljIHZvaWQgZ2VuZXJhdGVIdG1sKFN0cmluZyB1cmwpIHsKLQkJSUVsZW1lbnRMYXlvdXQgbGF5b3V0ID0gZ2V0TGF5b3V0TWFuYWdlcigpLmdldExheW91dCh1cmwpOwotCQlnZW5lcmF0ZUh0bWwobGF5b3V0KTsKLQl9Ci0KLQkvKioKLQkgKiBHZW5lcmF0ZXMgdGhlIEhUTUwgZm9yIGEgTWV0aG9kIGVsZW1lbnQuCi0JICogCi0JICogQHBhcmFtIGxheW91dAotCSAqICAgICAgICAgICAgQSBNZXRob2QgRWxlbWVudC4gTGF5b3V0IG9iamVjdC4KLQkgKiBAcGFyYW0gbGlua2VkRWxlbWVudHMKLQkgKiAgICAgICAgICAgIElmIG5vdCBudWxsLCB0aGlzIG9iamVjdCB3aWxsIGJlIHBvcHVsYXRlZCB3aXRoIGEgbGlzdCBvZgotCSAqICAgICAgICAgICAgbGlua2VkIGVsZW1lbnRzIGluIHRoZSBwYWdlLgotCSAqIEByZXR1cm4gQSB1cmwgb2YgdGhlIGdlbmVyYXRlZCBjb250ZW50IEhUTUwgZmlsZS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdlbmVyYXRlSHRtbChJRWxlbWVudExheW91dCBsYXlvdXQpIHsKLQkJaWYgKGxheW91dCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gImFib3V0OmJsYW5rIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oIioqKiBnZW5lcmF0ZUh0bWw6ICIgKyBMaWJyYXJ5VXRpbC5nZXRUeXBlTmFtZShsYXlvdXQuZ2V0RWxlbWVudCgpKSApOwotCQkKLQkJLy8gYWRkIHRpbWUgbG9nZ2luZyB3aGVuIHB1Ymxpc2hpbmcgZWxlbWVudAotCQlsb25nIHRpbWVfc3RhcnQgPSBDYWxlbmRhci5nZXRJbnN0YW5jZSgpLmdldFRpbWVJbk1pbGxpcygpOwotCQlTdHJpbmcgZWxlbWVudFBhdGggPSBsYXlvdXQuZ2V0RmlsZVBhdGgoKS5yZXBsYWNlKCcvJywKLQkJCQlGaWxlLnNlcGFyYXRvckNoYXIpOwotCQlTdHJpbmcgZWxlbWVudFBhdGhOYW1lID0gZWxlbWVudFBhdGgKLQkJCQkrIGxheW91dC5nZXRGaWxlTmFtZShSZXNvdXJjZUhlbHBlci5GSUxFX0VYVF9IVE1MKTsKLQkJU3RyaW5nIGZpbGVQYXRoID0gdGhpcy5nZXRQdWJsaXNoRGlyKCkgKyBlbGVtZW50UGF0aDsKLQkJU3RyaW5nIGh0bWxfZmlsZSA9IHRoaXMuZ2V0UHVibGlzaERpcigpICsgZWxlbWVudFBhdGhOYW1lOwotCi0JCXRyeSB7Ci0KLQkJCVN0cmluZ0J1ZmZlciB4bWwgPSBnZXRYbWwobGF5b3V0KTsKLQotCQkJU3RyaW5nIHhzbF91cmk7Ci0KLQkJCUZpbGUgZiA9IG5ldyBGaWxlKGZpbGVQYXRoKTsKLQkJCWlmICghZi5leGlzdHMoKSkgewotCQkJCWYubWtkaXJzKCk7Ci0JCQl9Ci0KLQkJCS8vIEdlbmVyYXRlIHRoZSBhZGRpdG9uYWwgb3V0cHV0cy4KLQkJCUxpc3QgbGF5b3V0cyA9IGxheW91dC5nZXRMYXlvdXRzKCk7Ci0JCQl4c2xfdXJpID0gbGF5b3V0WHNsUm9vdFBhdGggKyBsYXlvdXQuZ2V0WHNsVXJsKCk7Ci0JCQlnZW5lcmF0ZUh0bWwobGF5b3V0LCB4c2xfdXJpLCBodG1sX2ZpbGUsIHhtbCk7Ci0KLQkJCS8vIEdlbmVyYXRlIG90aGVyIGxheW91dCBmaWxlcy4KLQkJCWlmIChsYXlvdXRzICE9IG51bGwgJiYgbGF5b3V0cy5zaXplKCkgPiAwKSB7Ci0JCQkJZm9yIChJdGVyYXRvciBpdCA9IGxheW91dHMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCQlMYXlvdXRJbmZvIGluZm8gPSAoTGF5b3V0SW5mbykgaXQubmV4dCgpOwotCQkJCQl4c2xfdXJpID0gbGF5b3V0WHNsUm9vdFBhdGggKyBpbmZvLmxheW91dF94c2w7Ci0JCQkJCVN0cmluZyBmaWxlID0gZmlsZVBhdGggKyBpbmZvLmZpbGVOYW1lOwotCQkJCQlnZW5lcmF0ZUh0bWwobGF5b3V0LCB4c2xfdXJpLCBmaWxlLCB4bWwpOwotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQlodG1sX2ZpbGUgPSBudWxsOwotCQl9Ci0KLQkJbG9uZyB0aW1lX2VuZCA9IENhbGVuZGFyLmdldEluc3RhbmNlKCkuZ2V0VGltZUluTWlsbGlzKCk7Ci0JCWxvbmcgbWluaV9zZWNvbmRzID0gdGltZV9lbmQgLSB0aW1lX3N0YXJ0OwotCQlpZiAobWluaV9zZWNvbmRzID4gMTAwMCkgewotCQkJU3RyaW5nIG1zZyA9IG1pbmlfc2Vjb25kcwotCQkJCQkrICIgbWluaS1zZWNvbmQocykgcHVibGlzaGluZyBlbGVtZW50ICIgKyBMaWJyYXJ5VXRpbC5nZXRUeXBlTmFtZShsYXlvdXQuZ2V0RWxlbWVudCgpKSArICJbIiArIGVsZW1lbnRQYXRoTmFtZSArICJdIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCUlDb250ZW50VmFsaWRhdG9yIHZhbGlkYXRvciA9IGdldFZhbGlkYXRvcigpOwotCQkJaWYgKHZhbGlkYXRvciA9PSBudWxsKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKG1zZyk7Ci0JCQl9IGVsc2UgewotCQkJCXZhbGlkYXRvci5sb2dJbmZvKG1zZyk7Ci0JCQl9Ci0JCX0KLQkJaWYgKGh0bWxfZmlsZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gaHRtbF9maWxlOwotCQl9Ci0KLQkJcmV0dXJuICJhYm91dDpibGFuayI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBHZW5lcmF0ZXMgdGhlIEhUTUwgZm9yIGEgTWV0aG9kIGVsZW1lbnQuCi0JICogCi0JICogQHBhcmFtIGxheW91dAotCSAqICAgICAgICAgICAgQSBNZXRob2QgRWxlbWVudC4gTGF5b3V0IG9iamVjdC4KLQkgKiBAcGFyYW0geHNsVVJJCi0JICogICAgICAgICAgICBUaGUgWFNMIHN0eWxlc2hlZXQuCi0JICogQHBhcmFtIGh0bWxGaWxlCi0JICogICAgICAgICAgICBUaGUgSFRNTCBmaWxlIHRvIGJlIGdlbmVyYXRlZC4KLQkgKiBAcGFyYW0geG1sCi0JICogICAgICAgICAgICBUaGUgWE1MIGJ1ZmZlci4KLQkgKiBAcmV0dXJuIEEgdXJsIG9mIHRoZSBnZW5lcmF0ZWQgY29udGVudCBIVE1MIGZpbGUuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGdlbmVyYXRlSHRtbChJRWxlbWVudExheW91dCBsYXlvdXQsCi0JCQlTdHJpbmcgeHNsX3VyaSwgU3RyaW5nIGh0bWxfZmlsZSwgU3RyaW5nQnVmZmVyIHhtbCkgewotCQlUaHJvd2FibGUgdGggPSBudWxsOwotCQlpZiAobGF5b3V0ID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCVRpbWVyIHRpbWVyID0gbnVsbDsKLQkJaWYgKCBkZWJ1ZyApIHsKLQkJCXRpbWVyID0gbmV3IFRpbWVyKCk7Ci0JCX0KLQkJCi0JCXRyeSB7Ci0JCQlTdHJpbmdXcml0ZXIgc3cgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0JCQlYU0xUUHJvY2Vzc29yLnRyYW5zZm9ybSh4c2xfdXJpLCB4bWwudG9TdHJpbmcoKSwgeHNsUGFyYW1zLCBzdyk7Ci0JCQlzdy5mbHVzaCgpOwotCQkJU3RyaW5nIGNvbnRlbnQgPSBzdy5nZXRCdWZmZXIoKS50b1N0cmluZygpOwotCi0JCQlpZiAoIGRlYnVnKSB7Ci0JCQkJdGltZXIuc3RvcCgpOwotCQkJCVN5c3RlbS5vdXQucHJpbnRsbih0aW1lci5nZXRUaW1lKCkgKyAiIG1pbmkgc2Vjb25kcyBmb3IgeG1sL3hzbHQgdHJhbnNmb3JtYXRpb24iKTsgLy8kTk9OLU5MUy0xJAotCQkJCXRpbWVyLnN0YXJ0KCk7Ci0JCQl9Ci0JCQkvLyBBbHdheXMgdmFsaWRhdGUgYW5kIGZpeCB0aGUgY29udGVudCBiZWZvcmUgcHVibGlzaGluZy4KLQkJCWNvbnRlbnQgPSBSZXNvdXJjZUhlbHBlci52YWxpZGF0ZUNvbnRlbnQobGF5b3V0LmdldEVsZW1lbnQoKSwKLQkJCQkJY29udGVudCwgZ2V0VmFsaWRhdG9yKCksIGxheW91dC5nZXRMYXlvdXRNZ3IoKQotCQkJCQkJCS5nZXRDb25maWd1cmF0aW9uKCksIHRoaXMubGF5b3V0WHNsUm9vdFBhdGgpOwotCQkJaWYgKGNvbnRlbnRTY2FuRW5hYmxlZCgpKSB7Ci0vLwkJCQlzY2FuQ29udGVudEZvclJlc291cmNlcyhsYXlvdXQuZ2V0RWxlbWVudCgpLCBjb250ZW50LCBsYXlvdXQKLS8vCQkJCQkJLmdldEZpbGVQYXRoKCkpOwotCQkJCWdldFZhbGlkYXRvcigpLnNjYW5Db250ZW50KGxheW91dCwgY29udGVudCk7Ci0JCQl9Ci0KLQkJCWlmICggZGVidWcpIHsKLQkJCQl0aW1lci5zdG9wKCk7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKHRpbWVyLmdldFRpbWUoKSArICIgbWluaSBzZWNvbmRzIHNjYW5uaW5nIGNvbnRlbnQiKTsgLy8kTk9OLU5MUy0xJAotCQkJCXRpbWVyLnN0YXJ0KCk7Ci0JCQl9Ci0JCQkKLQkJCU91dHB1dFN0cmVhbVdyaXRlciBvdXRwdXQgPSBuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKAotCQkJCQluZXcgRmlsZU91dHB1dFN0cmVhbShodG1sX2ZpbGUpLCAidXRmLTgiKTsgLy8kTk9OLU5MUy0xJAotCQkJb3V0cHV0LndyaXRlKGNvbnRlbnQpOwotCQkJb3V0cHV0LmZsdXNoKCk7Ci0JCQlvdXRwdXQuY2xvc2UoKTsKLQkJfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJdGggPSBlOwotCQl9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCXRoID0gZTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCXRoID0gZTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl0aCA9IGU7Ci0JCX0KLQotCQlpZiAodGggIT0gbnVsbCkgewotCQkJdGhpcy5nZXRWYWxpZGF0b3IoKS5sb2dFcnJvcihsYXlvdXQuZ2V0RWxlbWVudCgpLAotCQkJCQkiRXJyb3IgZ2VuZXJhdGluZyBlbGVtZW50IGNvbnRlbnQiLCB0aCk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKgotCSAqIEdlbmVyYXRlcyB0aGUgSFRNTCBmb3IgYSBNZXRob2QgZWxlbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gbGF5b3V0Ci0JICogICAgICAgICAgICBBIE1ldGhvZCBFbGVtZW50LiBMYXlvdXQgb2JqZWN0LgotCSAqIEByZXR1cm4gQSB1cmwgb2YgdGhlIGdlbmVyYXRlZCBjb250ZW50IEhUTUwgZmlsZS4KLQkgKi8KLQlwcml2YXRlIFN0cmluZ0J1ZmZlciBnZXRYbWwoSUVsZW1lbnRMYXlvdXQgbGF5b3V0KSB7Ci0JCVN0cmluZ0J1ZmZlciB4bWwgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCVhtbEVsZW1lbnQgeG1sRWxlbWVudCA9IGxheW91dC5nZXRYbWxFbGVtZW50KHRydWUpOwotCQkKLQkJLy8gc2V0IHRoZSBsYW5ndWFnZSBhdHRyaWJ1dGUKLQkJTG9jYWxlIGxvY2FsZSA9IExvY2FsZS5nZXREZWZhdWx0KCk7Ci0JCVN0cmluZyBsYW5nID0gbG9jYWxlLmdldExhbmd1YWdlKCk7Ci0JCXhtbEVsZW1lbnQuc2V0QXR0cmlidXRlKCJsYW5nIiwgbGFuZyk7IC8vJE5PTi1OTFMtMSQKLQotCQlpZiAoc2hvd1RyZWVCcm93c2VyKSB7Ci0JCQl4bWxFbGVtZW50LnNldEF0dHJpYnV0ZSgic2hvd1RyZWVCcm93c2VyIiwgInRydWUiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQotCQl4bWwuYXBwZW5kKFhtbEhlbHBlci5YTUxfSEVBREVSKS5hcHBlbmQoeG1sRWxlbWVudC50b1htbCgpKTsKLQotCQlpZiAoIGRlYnVnICkgewotCQkJdHJ5IHsKLQkJCQlTdHJpbmcgeG1sX2ZpbGUgPSB0aGlzLmdldFB1Ymxpc2hEaXIoKSArICJ4bWwiICsgRmlsZS5zZXBhcmF0b3I7IC8vJE5PTi1OTFMtMSQKLQkJCQl4bWxfZmlsZSArPSBsYXlvdXQuZ2V0VHlwZSgpICsgIi4iICsgbGF5b3V0LmdldEZpbGVOYW1lKCIueG1sIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCUZpbGUgeGYgPSBuZXcgRmlsZSh4bWxfZmlsZSk7Ci0JCQkJaWYgKCAheGYuZXhpc3RzKCkgKQotCQkJCXsKLQkJCQkJeGYuZ2V0UGFyZW50RmlsZSgpLm1rZGlycygpOwotCQkJCQl4Zi5jcmVhdGVOZXdGaWxlKCk7Ci0JCQkJfQotCQkJCQkJCQotCQkJCU91dHB1dFN0cmVhbVdyaXRlciBvdXRwdXQgPSBuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKAotCQkJCQkJbmV3IEZpbGVPdXRwdXRTdHJlYW0oeGYpLCAidXRmLTgiKTsgLy8kTk9OLU5MUy0xJAotCQkJCW91dHB1dC53cml0ZSh4bWwudG9TdHJpbmcoKSk7Ci0JCQkJb3V0cHV0LmZsdXNoKCk7Ci0JCQkJb3V0cHV0LmNsb3NlKCk7Ci0JCi0JCQkJLy8gRmlsZVdyaXRlciB4dyA9IG5ldyBGaWxlV3JpdGVyKHhtbF9maWxlKTsKLQkJCQkvLyB4dy53cml0ZSh4bWwudG9TdHJpbmcoKSk7Ci0JCQkJLy8geHcuZmx1c2goKTsKLQkJCQkvLyB4dy5jbG9zZSgpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQkJZXgucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiB4bWw7Ci0JfQotCi0vLwkvKioKLS8vCSAqIFNjYW5zIHRoZSBjb250ZW50IGZvciByZXNvdXJjZSByZWZlcmVuY2VzLgotLy8JICovCi0vLwlwcml2YXRlIHZvaWQgc2NhbkNvbnRlbnRGb3JSZXNvdXJjZXMoTWV0aG9kRWxlbWVudCBvd25lciwgU3RyaW5nIGNvbnRlbnQsCi0vLwkJCVN0cmluZyBjb250ZW50UGF0aCkgewotLy8JCUNvbnRlbnRSZXNvdXJjZVNjYW5uZXIgc2Nhbm5lciA9IGdldFNjYW5uZXIob3duZXIpOwotLy8JCWlmICggc2Nhbm5lciAhPSBudWxsICkgewotLy8JCQlzY2FubmVyLnJlc29sdmVSZXNvdXJjZXMob3duZXIsIGNvbnRlbnQsIGNvbnRlbnRQYXRoKTsKLS8vCQl9Ci0vLwl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotLy8JCWlmICh2YWxpZGF0b3IgIT0gbnVsbCkgewotLy8JCQl2YWxpZGF0b3IuZGlzcG9zZSgpOwotLy8JCX0KLQotCQlpZiAoIGludGVybmFsX21nciAhPSBudWxsICkgewotCQkJaW50ZXJuYWxfbWdyLmNsZWFyKCk7Ci0JCQlpbnRlcm5hbF9tZ3IgPSBudWxsOwotCQl9Ci0JCQotCQltZ3IgPSBudWxsOwotLy8JCXNjYW5uZXIgPSBudWxsOwotLy8JCXZhbGlkYXRvciA9IG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9JQ29udGVudFZhbGlkYXRvci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9JQ29udGVudFZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxODQ1OGU0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvSUNvbnRlbnRWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQ7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotCi0vKioKLSAqIGludGVyZmFjZSBmb3IgY29udGVudCB2YWxpZGF0b3IgYXQgYnJvd3NpbmcgYW5kIHB1Ymxpc2hpbmcKLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUNvbnRlbnRWYWxpZGF0b3IgIHsKLQotCS8qKgotCSAqIHNldCBwdWJsaXNoIGRpcgotCSAqIEBwYXJhbSBwdWJEaXIgU3RyaW5nCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHVibGlzaERpcihTdHJpbmcgcHViRGlyKTsKLQkKLQkvKioKLQkgKiBzaG93IGJyb2tlbiBsaW5rcyBpZiB0cnVlCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gc2hvd0Jyb2tlbkxpbmtzKCk7Ci0JCi0JcHVibGljIHZvaWQgc2NhbkNvbnRlbnQoSUVsZW1lbnRMYXlvdXQgbGF5b3V0LCBTdHJpbmcgY29udGVudCkgdGhyb3dzIEV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIHZhbGlkYXRlIHRoZSBsaW5rIGF0dHJpYnV0ZSBhbmQgbGlua2VkIHRleHQgZm9yIHRoZSBvd25pbmcgZWxlbWVudCB3aXRoaW4gdGhlIGNvbmZpZ3VyYXRpb24uIAotCSAqIFJldHVybnMgYSBMaW5rSW5mbyBvYmplY3QuCi0JICogCi0JICogQHBhcmFtIG93bmVyIHtAbGluayBNZXRob2RFbGVtZW50fSB0aGUgb3duZXIgZWxlbWVudAotCSAqIEBwYXJhbSBhdHRyaWJ1dGVzIFN0cmluZyB0aGUgdXJsIGF0dHJpYnV0ZXMKLQkgKiBAcGFyYW0gdGV4dCBTdHJpbmcgdGhlIGxpbmtlZCB0ZXh0Ci0JICogQHBhcmFtIGNvbmZpZyBNZXRob2RDb25maWd1cmF0aW9uCi0JICogQHBhcmFtIHRhZyB0aGUgSFRNTCB0YWcgKGEsIGFyZWEpCi0JICogQHJldHVybiBMaW5rSW5mbwotCSAqLwotCXB1YmxpYyBMaW5rSW5mbyB2YWxpZGF0ZUxpbmsoTWV0aG9kRWxlbWVudCBvd25lciwgU3RyaW5nIGF0dHJpYnV0ZXMsCi0JCQlTdHJpbmcgdGV4dCwgTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcsIFN0cmluZyB0YWcpOwotCi0JLyoqCi0JICogbG9nIHRoZSBpbmZvIGZvciB0aGUgZWxlbWVudAotCSAqIEBwYXJhbSBvd25lciBNZXRob2RFbGVtZW50Ci0JICogQHBhcmFtIG1lc3NhZ2UgU3RyaW5nCi0JICovCi0JcHVibGljIHZvaWQgbG9nSW5mbyhNZXRob2RFbGVtZW50IG93bmVyLCBTdHJpbmcgbWVzc2FnZSk7Ci0KLQkvKioKLQkgKiBsb2cgYSBtaXNzaW5nIHJlZmVyZW5jZQotCSAqIEBwYXJhbSBvd25lciBNZXRob2RFbGVtZW50Ci0JICogQHBhcmFtIHJlZkVsZW1lbnQgTWV0aG9kRWxlbWVudCB0aGUgcmVmZXJuZWNlZCBlbGVtZW50IHRoYXQgaXMgbWlzc2luZyBpbiBjb25maWd1cmF0aW9uCi0JICovCi0JcHVibGljIHZvaWQgbG9nTWlzc2luZ1JlZmVyZW5jZShNZXRob2RFbGVtZW50IG93bmVyLAotCQkJTWV0aG9kRWxlbWVudCByZWZFbGVtZW50KTsKLQotCS8qKgotCSAqIGxvZyBhIG1pc3NpbmcgcmVmZXJlbmNlCi0JICogQHBhcmFtIG93bmVyIE1ldGhvZEVsZW1lbnQgdGhlIG93bmVyIGVsZW1lbnQKLQkgKiBAcGFyYW0gZ3VpZCBTdHJpbmcgdGhlIHJlZmVyZW5jZWQgZ3VpZCB3aGljaCBpcyBub3QgYSB2YWxpZCBlbGVtZW50IGluIHRoZSBjb25maWd1cmF0aW9uIGFueSBtb3JlCi0JICogQHBhcmFtIGxpbmtlZFRleHQgU3RyaW5nIHRoZSBsaW5rZWQgdGV4dCBhbG9uZyB3aXRoIHRoZSBsaW5rLgotCSAqLwotCXB1YmxpYyB2b2lkIGxvZ01pc3NpbmdSZWZlcmVuY2UoTWV0aG9kRWxlbWVudCBvd25lciwgU3RyaW5nIGd1aWQsCi0JCQlTdHJpbmcgbGlua2VkVGV4dCk7Ci0KLQkvKioKLQkgKiBsb2cgYSBtaXNzaW5nIHJlc291cmNlIAotCSAqIEBwYXJhbSBvd25lciBNZXRob2RFbGVtZW50IHRoZSBvd25lcgotCSAqIEBwYXJhbSByZXNvdXJjZUZpbGUgRmlsZSB0aGUgZmlsZSB0aGF0IG93bmVkIGJ5IHRoZSBlbGVtZW50IGFuZCByZWZlcmVuY2VzIHRoZSBtaXNpbmcgcmVzb3VyY2UsIAotCSAqIG51bGwgaWYgdGhlIG1pc2luZyByZWZlcmVuY2UgaXMgcmVmZXJlbmNlZCBieSB0aGUgZWxlbWVudCBpdHNlbGYgCi0JICogQHBhcmFtIHVybCBTdHJpbmcgdGhlIHVybCB0aGF0IGNhbid0IGJlIHJlc292bGVkIHRvIGEgcmVzb3VyY2UuCi0JICovCi0JcHVibGljIHZvaWQgbG9nTWlzc2luZ1Jlc291cmNlKE1ldGhvZEVsZW1lbnQgb3duZXIsIEZpbGUgcmVzb3VyY2VGaWxlLAotCQkJU3RyaW5nIHVybCk7Ci0KLQkvKioKLQkgKiBsb2duIGEgd2FybmluZyBtZXNzYWdlCi0JICogQHBhcmFtIG93bmVyIE1ldGhvZEVsZW1lbnQKLQkgKiBAcGFyYW0gbWVzc2FnZSBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgdm9pZCBsb2dXYXJuaW5nKE1ldGhvZEVsZW1lbnQgb3duZXIsIFN0cmluZyBtZXNzYWdlKTsKLQotCS8qKgotCSAqIGxvZyBhbiBlcnJvciBtZXNzYWdlCi0JICogQHBhcmFtIG93bmVyIE1ldGhvZEVsZW1lbnQKLQkgKiBAcGFyYW0gbWVzc2FnZSBTdHJpbmcKLQkgKiBAcGFyYW0gdGggVGhyb3dhYmxlLCBudWxsIGlmIG5vdAotCSAqLwotCXB1YmxpYyB2b2lkIGxvZ0Vycm9yKE1ldGhvZEVsZW1lbnQgb3duZXIsIFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgdGgpOwotCi0JLyoqCi0JICogbG9nIGFuIGludmFsaWQgZXh0ZXJuYWwgbGluawotCSAqIEBwYXJhbSBvd25lciBNZXRob2RFbGVtZW50Ci0JICogQHBhcmFtIHVybCBTdHJpbmcgdGhlIHVybAotCSAqIEBwYXJhbSBtZXNzYWdlIFN0cmluZwotCSAqLwotCXB1YmxpYyB2b2lkIGxvZ0ludmFsaWRFeHRlcm5hbExpbmsoTWV0aG9kRWxlbWVudCBvd25lciwgU3RyaW5nIHVybCwKLQkJCVN0cmluZyBtZXNzYWdlKTsKLQotCS8qKgotCSAqIGxvZyBhIG1lc3NhZ2UKLQkgKiBAcGFyYW0gbWVzc2FnZSBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgdm9pZCBsb2dJbmZvKFN0cmluZyBtZXNzYWdlKTsKLQotCS8qKgotCSAqIGxvZyBhIHdhcm5pbmcKLQkgKiBAcGFyYW0gbWVzc2FnZSBTdHJpbmcKLSAJICovCi0JcHVibGljIHZvaWQgbG9nV2FybmluZyhTdHJpbmcgbWVzc2FnZSk7Ci0KLQkvKioKLQkgKiBsb2cgYW4gZXJyb3IKLQkgKiBAcGFyYW0gbWVzc2FnZSBTdHJpbmcKLQkgKiBAcGFyYW0gdGggVGhyb3dhYmxlCi0JICovCi0JcHVibGljIHZvaWQgbG9nRXJyb3IoU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSB0aCk7Ci0KLQkvKioKLQkgKiBjaGVjayBpZiB0aGUgZWxlbWVudCBpcyBkaXNjYXJkZWQgb3Igbm90Ci0JICogZGlzY2FyZGVkIGVsZW1lbnRzIHdpbGwgYmUgdHJlYXRlZCBhcyBvdXQgc2lkZSB0aGUgY29uZmlndXJzYXRpb24KLQkgKiAKLQkgKiBAcGFyYW0gb3duZXIgTWV0aG9kRWxlbWVudCB0aGUgb3duZXIgb2YgdGhlIGVsZW1lbnQKLQkgKiBAcGFyYW0gT2JqZWN0IGZlYXR1cmUgRVN0cnVjdHVyYWxGZWF0dXJlIG9yIE9wcG9zaXRlRmVhdHVyZQotCSAqIEBwYXJhbSBlIE1ldGhvZEVsZW1lbnQgdGhlIGVsZW1lbnQgdG8gYmUgY2hlY2tlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRGlzY2FyZGVkKE1ldGhvZEVsZW1lbnQgb3duZXIsIE9iamVjdCBmZWF0dXJlLCBNZXRob2RFbGVtZW50IGUpOwotCi0JLyoqCi0JICogc2V0IGFuIGRpc2NhcmRlZCBlbGVtZW50Ci0JICogQHBhcmFtIGUgTWV0aG9kRWxlbWVudAotCSAqLwotCXB1YmxpYyB2b2lkIHNldERpc2NhcmRlZEVsZW1lbnQoTWV0aG9kRWxlbWVudCBlKTsKLQotCS8qKgotCSAqIGRpc3Bvc2UgdGhlIG9iamVjdCBhbmQgZnJlZSByZXNvdXJjZXMKLQkgKgotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKTsKLQkJCi0JLyoqCi0JICogYWRkIGEgcmVmZXJuZWNlZCBlbGVtZW50Ci0JICogCi0JICogQHBhcmFtIG93bmVyIE1ldGhvZEVsZW1lbnQKLQkgKiBAcGFyYW0gZSBNZXRob2RFbGVtZW50IHRoZSBlbGVtZW50IHJlZmVyZW5jZWQgYnkgdGhlIG93bmVyIGVsZW1lbnQKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRSZWZlcmVuY2VkRWxlbWVudChNZXRob2RFbGVtZW50IG93bmVyLCBNZXRob2RFbGVtZW50IGUpOwotCQkKLQkvKioKLQkgKiBnZXQgdGhlIGZsYWcgYWJvdXQgc2hvd2luZyBleHRyYSBpbmZvcm1hdGlvbiBmcm9tIHRoZSBsaW5rZWQgZWxlbWVudHMgZm9yIGRlc2NyaXB0b3JzCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gc2hvd0V4dHJhSW5mb0ZvckRlc2NyaXB0b3JzKCk7Ci0KLQkvKioKLQkgKiBzaG93IGRlc2NyaXB0b3JzIG9uIG1ldGhvZCBlbGVtZW50IHBhZ2UKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBzaG93UmVsYXRlZERlc2NyaXB0b3JzKCk7Ci0JCi0JLyoqCi0JICogZ2V0IHRoZSB0YWIgaWQgZm9yIHRoZSBhY3Rpdml0eSBsYXlvdXQKLQkgKiAKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdEFjdGl2aXR5VGFiKCk7Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L0lFbGVtZW50TGF5b3V0LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L0lFbGVtZW50TGF5b3V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyMjkyMmQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9JRWxlbWVudExheW91dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LnV0aWwuWG1sRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci0KLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpbnRlcmZhY2UgZm9yIGVsZW1lbnQgbGF5b3V0LiBhbnkgZWxlbWVudCBsYXlvdXQgc2hvdWxkIGltcGxlbWVudCB0aGlzIGludGVyZmFjZS4KLSAqIEFuIGVsZW1lbnQgbGF5b3V0IGRlZmluZXMgaG93IHRoZSBlbGVtZW50IHNob3VsZCBiZSByZW5kZXJlZCBpbiBicm93c2luZyBhbmQgcHVibGlzaGluZy4KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJRWxlbWVudExheW91dCB7Ci0KLQkvKioKLQkgKiBnZXQgdGhlIGVsZW1lbnQgaWQsIHdoaWNoIGlzIHRoZSBlbGVtZW50J3MgR1VJRAotCSAqIAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldElkKCk7Ci0KLQkvKioKLQkgKiB0aGUgdHlwZSBvZiB0aGUgZWxlbWVudAotCSAqIAotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUeXBlKCk7Ci0KLQkvKioKLQkgKiB0aGUgbmFtZSBvZiB0aGUgZWxlbWVudAotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCk7Ci0KLQkvKioKLQkgKiB0aGUgcmVhbGl6ZWQgcHJlc2VudGF0aW9uIG5hbWUgb2YgdGhlIGVsZW1lbnQKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGlzcGxheU5hbWUoKTsKLQotCS8qKgotCSAqIHRoZSB1cmwgb2YgdGhlIGVsZW1lbnQKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VXJsKCk7Ci0KLQkvKioKLQkgKiB0aGUgdXJsIGZvciBzaGFwZSBpY29uIG9mIHRoZSBlbGVtZW50Ci0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFNoYXBlaWNvblVybCgpOwotCi0JLyoqCi0JICogdGhlIHVybCBmb3Igbm9kZSBpY29uIG9mIHRoZSBlbGVtZW50Ci0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5vZGVpY29uVXJsKCk7Ci0KLQkvKioKLQkgKiB0aGUgdXJsIGZvciBkaWFncmFtIGljb24gb2YgdGhlIGVsZW1lbnQsIAotCSAqIGZvciBleGFtcGxlLCB0aGUgaWNvbiBmb3IgYSByb2xlIGluIHRoZSByb2xlLXRhc2std3AgcmVsYXRpb25zaGlwIGRpYWdyYW0uCi0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERpYWdyYW1pY29uVXJsKCk7IC8vIGljb24gZm9yIGRpYWdyYW0gc3VjaCBhcyBSb2xlIGRpYWdyYW0KLQotCS8qKgotCSAqIHRoZSBsYXlvdXQgeHNsIHVybAotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRYc2xVcmwoKTsKLQotCS8qKgotCSAqIHRoZSBiYWNrIHBhdGggb2YgdGhlIGVsZW1lbnQgcmVsYXRpdmUgdG8gdGhlIHB1Ymxpc2hpbmcgcm9vdCBkaXIuCi0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEJhY2tQYXRoKCk7Ci0KLQkvKioKLQkgKiBnZXQgdGhlIGZpbGUgcGF0aCByZWxhdGl2ZSB0byB0aGUgcHVibGlzaGluZyByb290Ci0JICogCi0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEZpbGVQYXRoKCk7Ci0KLQkvKioKLQkgKiBnZXQgdGhlIGZpbGUgcGF0aCByZWxhdGl2ZSB0byBhbm90aGVyIGVsZW1lbnQuIFRoaXMgaXMgdGhlCi0JICogcmVsYXRpdmVUby5iYWNrcGF0aCArIHRoaXMuZWxlbWVudHBhdGgKLQkgKiAKLQkgKiBAcGFyYW0gcmVsYXRpdmVUbwotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRGaWxlUGF0aChJRWxlbWVudExheW91dCByZWxhdGl2ZVRvKTsKLQotCS8qKgotCSAqIGdldCB0aGUgZmlsZSBuYW1lIG9mIHRoZSBlbGVtZW50LCB3aXRoIHRoZSBnaXZlbiBleHRlbnNpb24uCi0JICogQHBhcmFtIGV4dCBTdHJpbmcgZXh0ZW5zaW9uLCBzdWNoIGFzICIuaHRtbCIKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RmlsZU5hbWUoU3RyaW5nIGV4dCk7Ci0KLQkvKioKLQkgKiBnZXQgdGhlIGVsZW1lbnQgCi0JICogQHJldHVybiBNZXRob2RFbGVtZW50Ci0JICovCi0JcHVibGljIE1ldGhvZEVsZW1lbnQgZ2V0RWxlbWVudCgpOwotCi0JLyoqCi0JICogZ2V0IHRoZSBsYXlvdXQgbWFuYWdlciBmb3IgcmFuZGVyaW5nIHRoZSBsYXlvdXQgb2YgdGhlIGVsZW1lbnQuCi0JICogCi0JICogQHJldHVybiBFbGVtZW50TGF5b3V0TWFuYWdlcgotCSAqLwotCXB1YmxpYyBFbGVtZW50TGF5b3V0TWFuYWdlciBnZXRMYXlvdXRNZ3IoKTsKLQotCS8qKgotCSAqIGdldCB0aGUgWG1sRWxlbWVudCBmb3IgdGhlIGVsZW1lbnQgbGF5b3V0LgotCSAqIAotCSAqIEBwYXJhbSBpbmNsdWRlUmVmZXJlbmNlcwotCSAqICAgICAgICAgICAgdHJ1ZSB0byBpbmNsdWRlIHRoZSB4bWwgb2YgdGhlIHJlZmVyZW5jZWQgZWxlbWVudC4gZmFsc2UgdG8KLQkgKiAgICAgICAgICAgIGlnbm9yZSB0aGUgeG1sIG9mIHRoZSByZWZlcmVuY2VzLgotCSAqIEByZXR1cm4gWG1sRWxlbWVudAotCSAqLwotCXB1YmxpYyBYbWxFbGVtZW50IGdldFhtbEVsZW1lbnQoYm9vbGVhbiBpbmNsdWRlUmVmZXJlbmNlcyk7Ci0KLQkvKioKLQkgKiByZXR1cm4gYSBsaXN0IG9mIExheW91dEluZm8gb2JqZWN0cwotCSAqIAotCSAqIEByZXR1cm4gYSBsaXN0IG9mIExheW91dEluZm8gb2JqZWN0cwotCSAqLwotCXB1YmxpYyBMaXN0IGdldExheW91dHMoKTsKLQotCi0JLyoqCi0JICogaWYgdGhlIGVsZW1lbnQncyBjb250ZW50IGlzIHRhcmdldCBmb3IgYW5vdGhlciBlbGVtZW50LCBzZXQgaXQgaGVyZS4gZm9yCi0JICogZXhhbXBsZSwgc3RlcCBjb250ZW50IGNhdCB0YXJnZXQgZm9yIGEgVGFzayBvciBhIHRhc2sgZGVzY3JpcHRvcgotCSAqIGNvcHlyaWdodCBjb250ZW50IGNhbiB0YXJnZXQgdG8gZGlmZmVyZW50IGVsZW1lbnRzLgotCSAqIAotCSAqIFRoZSBwdXJwb3NlIG9mIHRoaXMgaXMgdGhhdCB0aGUgc3lzdGVtIHdpbGwgZml4IHRoZSBsaW5rcyBpbiB0aGUgY29udGVudAotCSAqIHRvIHJlbGF0aXZlIHRvIHRoZSB0YXJnZXQgZWxlbWVudC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb250ZW50VGFyZ2V0KE1ldGhvZEVsZW1lbnQgdGFyZ2V0RWxlbWVudCk7Ci0KLQkvKioKLQkgKiBuZWVkIHRvIHNldCB0aGUgb3duZXIgb2YgdGhlIGN1cnJlbnQgbGF5b3V0IGVsZW1lbnQuIEluIG1vc3QgY2FzZXMgdGhpcwotCSAqIHNob3VsZCBiZSB0aGUgZUNvbnRhaW5lciBvZiB0aGUgZWxlbWVudC4gVGhpcyBpcyBuZWVkZWQgYmVjYXVzZSBpbiBzb21lCi0JICogc2l0dWF0aW9uIHRoZSBlbGVtZW50IGRvZXMgbm90IGhhdmUgYW4gb3duZXIgd2hlbiB0aGUgb2JqZWN0IGlzIGNyZWF0ZWQuCi0JICogRm9yIGV4YW1wbGUsIHRoZSBDb250ZW50RGVzY3JpcHRpb24gb2JqZWN0J3MgZUNvbnRpbmVyIGlzIG51bGwgaWYgdGhlCi0JICogY29udGVudCBmaWxlIGlzIG5vdCBzYXZlZC4KLQkgKiAKLQkgKiBAcGFyYW0gb3duZXIKLQkgKiAgICAgICAgICAgIE1ldGhvZEVsZW1lbnQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFbGVtZW50T3duZXIoTWV0aG9kRWxlbWVudCBvd25lcik7Ci0KLQkvKioKLQkgKiBjaGVjayBpZiB0aGUgaHRtbCBjb250ZW50IGdlbmVyYXRlZCBmcm9tIHRoaXMgeHNsIGZpbGUgbmVlZHMgdG8gYmUgc2Nhbm5lZCBvciBub3QKLQkgKiBzY2FuIHRoZSBjb250ZW50IGlzIGZvciBpZGVudGlmeWluZyBlbGVtZW50IHJlZmVyZW5jZXMgaW4gdGhlIGNvbnRlbnQgYW5kIGNvcHkgb3ZlciByZXNvdXJjZSBmaWxlcwotCSAqIGluIHNvbWUgY2FzZXMgd2UgZG9uJ3QgbmVlZCB0byBzY2FuIHRoZSBjb250ZW50LCBmb3IgZXhhbXBsZSwgdGhlIGFjdGl2aXR5IGJyZWFrZG93biBzdHJ1Y3R1cmUKLQkgKiAKLQkgKiBAcGFyYW0geHNsVXJsIHRoZSB4c2wgdGhhdCBodG1sIGlzIGdlbmVyYXRlZCBmcm9tLCBudWxsIGZvciB0aGUgZGVmYXVsdCB4c2wgbGF5b3V0Ci0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gbmVlZENvbnRlbnRTY2FuKFN0cmluZyB4c2xVcmwpOwotCQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBzaG93Ci0JICogQGRlcHJlY2F0ZWQgdGhpcyBtZXRob2QgaXMgbm90IG5lZWRlZCBhbnkgbW9yZQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNob3dFbGVtZW50TGluayhib29sZWFuIHNob3cpOwotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L0xheW91dEV4dGVuc2lvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9MYXlvdXRFeHRlbnNpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmEyYWNlYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L0xheW91dEV4dGVuc2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLkVsZW1lbnRSZWFsaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuU3VwcHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzOwotCi0vKioKLSAqIGFic3RyYWN0IGJhc2UgY2xhc3MgZm9yIGxheW91dCBleHRlbmRzaW9uCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICoKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIExheW91dEV4dGVuc2lvbiB7Ci0KLQlwcm90ZWN0ZWQgRWxlbWVudExheW91dE1hbmFnZXIgbGF5b3V0TWdyOwotCQotCS8qKgotCSAqIGRlZmF1bHQgY29uc3RydWN0b3IKLQkgKgotCSAqLwotCXB1YmxpYyBMYXlvdXRFeHRlbnNpb24oKSB7Ci0JCQotCX0KLQkKLQlwdWJsaWMgdm9pZCBpbml0KEVsZW1lbnRMYXlvdXRNYW5hZ2VyIGxheW91dE1ncikgewotCQl0aGlzLmxheW91dE1nciA9IGxheW91dE1ncjsKLQl9Ci0JCi0JcHVibGljIGFic3RyYWN0IEVsZW1lbnRSZWFsaXplciBnZXRFbGVtZW50UmVhbGl6ZXIoKTsKLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjb250ZW50IHZhbGlkYXRvci4KLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgSUNvbnRlbnRWYWxpZGF0b3IgZ2V0VmFsaWRhdG9yKCk7Ci0JCi0JcHVibGljIGFic3RyYWN0IFN1cHByZXNzaW9uIGdldFN1cHByZXNzaW9uKFByb2Nlc3MgcHJvYyk7Ci0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9MYXlvdXRFeHRlbnNpb25GYWN0b3J5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L0xheW91dEV4dGVuc2lvbkZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDgxNmI3Yi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L0xheW91dEV4dGVuc2lvbkZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlQbHVnaW47Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLQotLyoqCi0gKiBNYW5hZ2VzIHRoZSBMYXlvdXRFeHRlbnNpb24gY29udHJpYnV0aW9ucwotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTGF5b3V0RXh0ZW5zaW9uRmFjdG9yeSB7Ci0KLQkvKioKLQkgKiBUaGUgZXh0ZW5zaW9uIHBvaW50IG5hbWVzcGFjZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRFTlNJT05fUE9JTlRfTkFNRVNQQUNFID0gIm9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5IjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlIGV4dGVuc2lvbiBwb2ludCBuYW1lLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVEVOU0lPTl9QT0lOVF9OQU1FID0gImVsZW1lbnRMYXlvdXRFeHRlbnNpb25zIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlICJjbGFzcyIgYXR0cmlidXRlIG5hbWUuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xBU1NfQVRUUklCX05BTUUgPSAiY2xhc3MiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgImlkIiBhdHRyaWJ1dGUgbmFtZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJRF9BVFRSSUJfTkFNRSA9ICJpZCI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIFRoZSBzaGFyZWQgaW5zdGFuY2UuCi0JcHJpdmF0ZSBzdGF0aWMgTGF5b3V0RXh0ZW5zaW9uRmFjdG9yeSBpbnN0YW5jZSA9IG51bGw7Ci0KLQkvLyBBIG1hcCBvZiBsaWJyYXJ5IG1hbmFnZXIgY29uZmlndXJhdGlvbiBlbGVtZW50cy4KLQlwcml2YXRlIE1hcDxTdHJpbmcsIExheW91dEV4dGVuc2lvbkVsZW1lbnQ+IGxheW91dEVsZW1lbnRzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBMYXlvdXRFeHRlbnNpb25FbGVtZW50PigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2hhcmVkIGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgc3luY2hyb25pemVkIExheW91dEV4dGVuc2lvbkZhY3RvcnkgZ2V0SW5zdGFuY2UoKSB7Ci0JCWlmIChpbnN0YW5jZSA9PSBudWxsKSB7Ci0JCQlpbnN0YW5jZSA9IG5ldyBMYXlvdXRFeHRlbnNpb25GYWN0b3J5KCk7Ci0JCX0KLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHJpdmF0ZSBMYXlvdXRFeHRlbnNpb25GYWN0b3J5KCkgewotCQlpbml0KCk7Ci0JfQotCi0JLyoqCi0JICogUGVyZm9ybXMgdGhlIG5lY2Vzc2FyeSBpbml0aWFsaXphdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0KCkgewotCQkvLyBQcm9jZXNzIHRoZSAib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGlicmFyeU1hbmFnZXJzIiBleHRlbnNpb24gcG9pbnQKLQkJLy8gY29udHJpYnV0b3JzLgotCQlJRXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpOwotCQlJRXh0ZW5zaW9uUG9pbnQgZXh0ZW5zaW9uUG9pbnQgPSBleHRlbnNpb25SZWdpc3RyeS5nZXRFeHRlbnNpb25Qb2ludCgKLQkJCQlFWFRFTlNJT05fUE9JTlRfTkFNRVNQQUNFLCBFWFRFTlNJT05fUE9JTlRfTkFNRSk7Ci0JCWlmIChleHRlbnNpb25Qb2ludCAhPSBudWxsKSB7Ci0JCQlJRXh0ZW5zaW9uW10gZXh0ZW5zaW9ucyA9IGV4dGVuc2lvblBvaW50LmdldEV4dGVuc2lvbnMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZXh0ZW5zaW9ucy5sZW5ndGg7IGkrKykgewotCQkJCUlFeHRlbnNpb24gZXh0ZW5zaW9uID0gZXh0ZW5zaW9uc1tpXTsKLQkJCQlTdHJpbmcgcGx1Z2luSWQgPSBleHRlbnNpb24uZ2V0TmFtZXNwYWNlSWRlbnRpZmllcigpOwotCQkJCUJ1bmRsZSBidW5kbGUgPSBQbGF0Zm9ybS5nZXRCdW5kbGUocGx1Z2luSWQpOwotCQkJCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGNvbmZpZ0VsZW1lbnRzID0gZXh0ZW5zaW9uCi0JCQkJCQkuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzKCk7Ci0JCQkJZm9yIChpbnQgaiA9IDA7IGogPCBjb25maWdFbGVtZW50cy5sZW5ndGg7IGorKykgewotCQkJCQlJQ29uZmlndXJhdGlvbkVsZW1lbnQgY29uZmlnRWxlbWVudCA9IGNvbmZpZ0VsZW1lbnRzW2pdOwotCQkJCQl0cnkgewotCQkJCQkJU3RyaW5nIGNsYXNzTmFtZSA9IGNvbmZpZ0VsZW1lbnQKLQkJCQkJCQkJLmdldEF0dHJpYnV0ZShDTEFTU19BVFRSSUJfTkFNRSk7Ci0JCQkJCQlTdHJpbmcgaWQgPSBjb25maWdFbGVtZW50Ci0JCQkJCQkJCS5nZXRBdHRyaWJ1dGUoSURfQVRUUklCX05BTUUpOwotCQkJCQkJaWYgKGNsYXNzTmFtZSAhPSBudWxsICYmIGNsYXNzTmFtZS50cmltKCkubGVuZ3RoKCkgPiAwCi0JCQkJCQkJCSYmIGlkICE9IG51bGwgJiYgaWQudHJpbSgpLmxlbmd0aCgpID4gMCkgewkJCQkJCQkKLQkJCQkJCQlMYXlvdXRFeHRlbnNpb25FbGVtZW50IHByb3ZpZGVyID0gbGF5b3V0RWxlbWVudHMuZ2V0KGlkKTsKLQkJCQkJCQlpZihwcm92aWRlciA9PSBudWxsICkgewotCQkJCQkJCQlwcm92aWRlciA9IG5ldyBMYXlvdXRFeHRlbnNpb25FbGVtZW50KAotCQkJCQkJCQkJCWJ1bmRsZSwgY2xhc3NOYW1lLCBpZCk7Ci0JCQkJCQkJCWxheW91dEVsZW1lbnRzLnB1dChpZCwgcHJvdmlkZXIpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCUxpYnJhcnlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaGFzRXh0ZW5zaW9uKFN0cmluZyBpZCkgewotCQlyZXR1cm4gbGF5b3V0RWxlbWVudHMuY29udGFpbnNLZXkoaWQpOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIGxheW91dCBleHRlbnNpb24uCi0JICogCi0JICogQHBhcmFtIGlkIHRoZSBleHRlbnNpb24gaWQKLQkgKiBAcmV0dXJuIExheW91dEV4dGVuc2lvbgotCSAqLwotCXB1YmxpYyBMYXlvdXRFeHRlbnNpb24gY3JlYXRlRXh0ZW5zaW9uKFN0cmluZyBpZCkgewotCQkKLQkJaWYgKCAhaGFzRXh0ZW5zaW9uKGlkKSApIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCQotCQlMYXlvdXRFeHRlbnNpb25FbGVtZW50IHByb3ZpZGVyID0gKExheW91dEV4dGVuc2lvbkVsZW1lbnQpIGxheW91dEVsZW1lbnRzLmdldChpZCk7Ci0JCXRyeSB7Ci0JCQlDbGFzcyBjbGF6eiA9IHByb3ZpZGVyLmJ1bmRsZS5sb2FkQ2xhc3MocHJvdmlkZXIuY2xhc3NOYW1lKTsKLQkJCXJldHVybiAoTGF5b3V0RXh0ZW5zaW9uKSBjbGF6ei5uZXdJbnN0YW5jZSgpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCX0KLQkJCi0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgY2xhc3MgTGF5b3V0RXh0ZW5zaW9uRWxlbWVudCB7Ci0JCUJ1bmRsZSBidW5kbGU7Ci0JCVN0cmluZyBjbGFzc05hbWU7Ci0JCVN0cmluZyBpZDsKLQkJcHJpdmF0ZSBMYXlvdXRFeHRlbnNpb25FbGVtZW50KEJ1bmRsZSBidW5kbGUsIFN0cmluZyBjbGFzc05hbWUsIFN0cmluZyBpZCkgewotCQkJdGhpcy5idW5kbGUgPSBidW5kbGU7Ci0JCQl0aGlzLmNsYXNzTmFtZSA9IGNsYXNzTmFtZTsKLQkJCXRoaXMuaWQgPSBpZDsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvTGF5b3V0SW5mby5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9MYXlvdXRJbmZvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2ODg1YTUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9MYXlvdXRJbmZvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQ7Ci0KLS8qKgotICogbEx5b3V0IGluZm8gZm9yIGFuIGVsZW1lbnQuCi0gKiA8cD4KLSAqIFRoaXMgaXMgdXNlZCB3aGVuIGFuIGVsZW1lbnQgb3V0cHV0IG1vcmUgdGhlbiBvbmUgbGF5b3V0LCBzdWNoIGFzIGFjdGl2aXR5Ci0gKiB0YWJzCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBMYXlvdXRJbmZvIHsKLQotCXB1YmxpYyBMYXlvdXRJbmZvKFN0cmluZyBuYW1lLCBTdHJpbmcgeHNsLCBTdHJpbmcgZmlsZU5hbWUsCi0JCQlib29sZWFuIGlzUHJpbWFyeSkgewotCQl0aGlzLm5hbWUgPSBuYW1lOwotCQl0aGlzLmxheW91dF94c2wgPSB4c2w7Ci0JCXRoaXMuZmlsZU5hbWUgPSBmaWxlTmFtZTsKLQkJdGhpcy5pc1ByaW1hcnkgPSBpc1ByaW1hcnk7Ci0JfQotCi0JLyoqCi0JICogdGhlIG5hbWUgb2YgdGhlIGxheW91dAotCSAqLwotCXB1YmxpYyBTdHJpbmcgbmFtZTsKLQotCS8qKgotCSAqIHRoZSBsYXlvdXQgeHNsIGZpbGUgbmFtZQotCSAqLwotCXB1YmxpYyBTdHJpbmcgbGF5b3V0X3hzbDsKLQotCS8qKgotCSAqIHRoZSBvdXRvdXQgZmlsZSBuYW1lCi0JICovCi0JcHVibGljIFN0cmluZyBmaWxlTmFtZTsKLQotCS8qKgotCSAqIGlzIHRoaXMgdGhlIHByaW1hcnkgbGF5b3V0PyB0aGlzIGFwcGx5IHRvIHRoZSBjYXNlIHdoZW4gb25lIGVsZW1lbnQgaGFzIG1vcmUgdGhhbiBvbmUgbGF5b3V0LgotCSAqICBGb3IgZXhhbXBsZSwgYW4gYWN0aXZpdHkgZWxlbWVudCBoYXMgNCBsYXlvdXRzLgotCSAqIAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUHJpbWFyeTsKLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9MYXlvdXRSZXNvdXJjZXMuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvTGF5b3V0UmVzb3VyY2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwZDU1NDguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9MYXlvdXRSZXNvdXJjZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQ7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLkNvcHk7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuRXhwYW5kOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLkZpbGVTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5GaWxlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5UGx1Z2luOwotCi1pbXBvcnQgY29tLmlibS5pY3UudXRpbC5DYWxlbmRhcjsKLQotCi0vKioKLSAqIGEgdXRpbGl0eSBjbGFzcyB0byBoYW5kbGUgbGF5b3V0IHJlbGF0ZWQgcmVzb3VyY2VzLgotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTGF5b3V0UmVzb3VyY2VzIHsKLQotCXByaXZhdGUgc3RhdGljIFJlc291cmNlQnVuZGxlIHJlc291cmNlQnVuZGxlOwotCi0JcHJpdmF0ZSBzdGF0aWMgUmVzb3VyY2VCdW5kbGUgc2hhcGVpY29uQnVuZGxlOwotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIFRFTVBfTEFZT1VUX0RJUiA9ICIiOyAvLyROT04tTkxTLTEkCi0Jc3RhdGljIHsKLQkJdHJ5IHsKLQkJCVN0cmluZyBwa2cgPSBMYXlvdXRSZXNvdXJjZXMuY2xhc3MuZ2V0UGFja2FnZSgpLmdldE5hbWUoKTsKLQkJCVN0cmluZyByZXNvdXJjZSA9IExheW91dFJlc291cmNlcy5jbGFzcy5nZXROYW1lKCk7Ci0JCQlyZXNvdXJjZUJ1bmRsZSA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZShyZXNvdXJjZSk7Ci0JCQlzaGFwZWljb25CdW5kbGUgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUocGtnCi0JCQkJCSsgIi5EZWZhdWx0U2hhcGVpY29ucyIpOyAvLyROT04tTkxTLTEkCi0KLQkJCS8qCi0JCQkgKiBURU1QX0xBWU9VVF9ESVIgPSBnZXRTdHJpbmcoInRlbXBfbGF5b3V0X2RpciIpOyBpZiAoCi0JCQkgKiBURU1QX0xBWU9VVF9ESVIgIT0gbnVsbCApIHsgVEVNUF9MQVlPVVRfRElSID0KLQkJCSAqIFRFTVBfTEFZT1VUX0RJUi5yZXBsYWNlKCcvJywgRmlsZS5zZXBhcmF0b3JDaGFyKTsgfQotCQkJICovCi0KLQkJCS8vIE11bHRpcGxlIGluc3RhbmNlcyBvZiBFUEYgcnVubmluZyBkaWZmZXJlbnQgbGlicyBhcmUgc2hhcmluZyB0aGUgc2FtZSBsYXlvdXQgZGlyZWN0b3J5Ci0JCQkvLyB1c2UgdGltZXN0YW1wIHRvIGlkZW50aWZ5IGVhY2ggaW5zdGFuY2UKLQkJCS8vIHdlIG5lZWQgdG8gY2xlYW4gdGhlIGZpbGVzIHdoZW4gdGhlIGFwcGxpY2F0aW9uIGV4aXQJCQkKLQkJCVN0cmluZyB1c2VySG9tZSA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgidXNlci5ob21lIik7IC8vJE5PTi1OTFMtMSQKLQkJCVRFTVBfTEFZT1VUX0RJUiA9IHVzZXJIb21lICsgRmlsZS5zZXBhcmF0b3IKLQkJCQkJKyAiRVBGIiArIEZpbGUuc2VwYXJhdG9yICsgImxheW91dCIgKyBGaWxlLnNlcGFyYXRvciAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJKyBMb25nLnRvSGV4U3RyaW5nKENhbGVuZGFyLmdldEluc3RhbmNlKCkuZ2V0VGltZUluTWlsbGlzKCkpICsgRmlsZS5zZXBhcmF0b3I7Ci0JCQkKLQkJCUZpbGUgcnVwVG1wRGlyID0gbmV3IEZpbGUoVEVNUF9MQVlPVVRfRElSKTsKLQkJCWlmICghcnVwVG1wRGlyLmV4aXN0cygpKSB7Ci0JCQkJcnVwVG1wRGlyLm1rZGlycygpOwotCQkJfSBlbHNlIHsKLQkJCQlGaWxlVXRpbC5kZWxldGVBbGxGaWxlcyhydXBUbXBEaXIuZ2V0QWJzb2x1dGVQYXRoKCkpOwotCQkJfQotCi0JCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiB4KSB7Ci0JCQl4LnByaW50U3RhY2tUcmFjZSgpOwotCQkJcmVzb3VyY2VCdW5kbGUgPSBudWxsOwotCQl9Ci0JfQotCi0JLyoqCi0JICogY2FsbCB0aGlzIHdoZW4gdGhlIGFwcGxpY2F0aW9uIGV4aXQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgY2xlYXIoKQotCXsKLQkJdHJ5IHsKLQkJCUZpbGVVdGlsLmRlbGV0ZUFsbEZpbGVzKFRFTVBfTEFZT1VUX0RJUik7Ci0JCQkKLQkJCS8vIGFsc28gZGVsZXRlIHRoZSBmb2xkZXIKLQkJCW5ldyBGaWxlKFRFTVBfTEFZT1VUX0RJUikuZGVsZXRlKCk7Ci0JCQkKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQkJCi0JCS8vIGFsc28gcmVzZXQgdGhlIGJyb3dzZXIgc2V0dGluZ3Mgc28gdGhhdCB0aGUgbGF5b3V0IGRhdGEgd2lsbCBiZSBjb3BpZWQKLQkJQnJvd3NpbmdMYXlvdXRTZXR0aW5ncy5JTlNUQU5DRS5zZXRDaGFuZ2VkKCk7Ci0JfQotCQotCS8qKgotCSAqIGdldCB0aGUgZGVmYXVsdCBwdWJsaXNoIHBhdGgKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXREZWZhdWx0UHVibGlzaERpcigpIHsKLQkJcmV0dXJuIFRFTVBfTEFZT1VUX0RJUjsKLQl9Ci0KLQkvKioKLQkgKiBnZXQgdGhlIHhzbCB1cmkgZm9yIHRoZSBnaXZlbiBrZXlzCi0JICogQHBhcmFtIGtleSBTdHJpbmcKLQkgKiBAcGFyYW0gc2Vjb25kS2V5IFN0cmluZwotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RGVmYXVsdFhzbFBhdGgoU3RyaW5nIGtleSwgU3RyaW5nIHNlY29uZEtleSkgewotCQlTdHJpbmcgdXJsID0gZ2V0WHNsVXJpKGtleSwgc2Vjb25kS2V5KTsKLQotCQlpZiAodXJsICE9IG51bGwpIHsKLQkJCS8vIHJlc29sdmUgdGhlIGZpbGUKLQkJCXJldHVybiBMaWJyYXJ5UGx1Z2luLmdldERlZmF1bHQoKS5nZXRMYXlvdXRYc2xQYXRoKCkgKyB1cmw7Ci0JCX0KLQotCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBnZXQgdGhlIHhzbCB1cmkgZm9yIHRoZSBnaXZlbiBrZXlzCi0JICogQHBhcmFtIGtleSBTdHJpbmcKLQkgKiBAcGFyYW0gc2Vjb25kS2V5IFN0cmluZwotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0WHNsVXJpKFN0cmluZyBrZXksIFN0cmluZyBzZWNvbmRLZXkpIHsKLQkJU3RyaW5nIHVybCA9IGdldFN0cmluZyhyZXNvdXJjZUJ1bmRsZSwga2V5LnRvTG93ZXJDYXNlKCkpOwotCQlpZiAoKHVybCA9PSBudWxsKSAmJiAoc2Vjb25kS2V5ICE9IG51bGwpKSB7Ci0JCQl1cmwgPSBnZXRTdHJpbmcocmVzb3VyY2VCdW5kbGUsIHNlY29uZEtleS50b0xvd2VyQ2FzZSgpKTsKLQkJfQotCi0JCWlmICh1cmwgPT0gbnVsbCkgewotCQkJdXJsID0gZ2V0U3RyaW5nKHJlc291cmNlQnVuZGxlLCAiZGVmYXVsdCIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCi0JCXJldHVybiB1cmw7IAotCX0KLQkKLQkvKioKLQkgKiBnZXQgdGhlIGRlZmF1bHQgc2hhcGUgaWNvbiB1cmwKLQkgKiBAcGFyYW0ga2V5IFN0cmluZwotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RGVmYXVsdFNoYXBlaWNvblVybChTdHJpbmcga2V5KSB7Ci0JCVN0cmluZyB1cmwgPSBnZXRTdHJpbmcoc2hhcGVpY29uQnVuZGxlLCBrZXkpOwotCQlpZiAodXJsID09IG51bGwpIHsKLQkJCXVybCA9IGdldFN0cmluZyhzaGFwZWljb25CdW5kbGUsICJnZW5lcmFsIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCXJldHVybiB1cmw7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldFN0cmluZyhSZXNvdXJjZUJ1bmRsZSBidW5kbGUsIFN0cmluZyBrZXkpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiAoYnVuZGxlICE9IG51bGwpID8gYnVuZGxlLmdldFN0cmluZyhrZXkpIDogbnVsbDsKLQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JLyoqCi0JICogZ2V0IHJlc291cmNlIHN0cmluZyBmb3IgdGhlIGtleQotCSAqIEBwYXJhbSBrZXkKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5KSB7Ci0JCXJldHVybiBnZXRTdHJpbmcocmVzb3VyY2VCdW5kbGUsIGtleSk7Ci0JfQotCi0JLyoqCi0JICogY29weSBmaWxlcyBmcm9tIG9uZSBkaXIgdG8gYW5vdGhlcgotCSAqIEBwYXJhbSBmcm9tRGlyIFN0cmluZwotCSAqIEBwYXJhbSB0b0RpciBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgY29weURpcihTdHJpbmcgZnJvbURpciwgU3RyaW5nIHRvRGlyKSB7Ci0KLQkJU3RyaW5nIGluY2x1ZGVzID0gIiouKiwgKiovY3NzLyouKiwgKiovaWNvbnMvKi4qLCAqKi9pbWFnZXMvKi4qLCAqKi9yZXNvdXJjZXMvKi4qLCAqKi9zdHlsZXNoZWV0cy8qLiosICoqL3NjcmlwdHMvKi4qIjsgLy8kTk9OLU5MUy0xJAotCQljb3B5RGlyKGZyb21EaXIsIHRvRGlyLCBpbmNsdWRlcywgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogY29weSBmaWxlcyBmcm9tIG9uZSBkaXIgdG8gYW5vdGhlciwgd2l0aCBmaWx0ZXJzCi0JICogQHBhcmFtIGZyb21EaXIgU3RyaW5nCi0JICogQHBhcmFtIHRvRGlyIFN0cmluZwotCSAqIEBwYXJhbSBpbmNsdWRlcyBTdHJpbmcKLQkgKiBAcGFyYW0gZXhjbHVkZXMgU3RyaW5nCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGNvcHlEaXIoU3RyaW5nIGZyb21EaXIsIFN0cmluZyB0b0RpciwgU3RyaW5nIGluY2x1ZGVzLAotCQkJU3RyaW5nIGV4Y2x1ZGVzKSB7Ci0JCWNvcHlEaXIobmV3IEZpbGUoZnJvbURpciksIG5ldyBGaWxlKHRvRGlyKSwgaW5jbHVkZXMsIGV4Y2x1ZGVzKTsKLQl9Ci0KLQkvKioKLQkgKiBjb3B5IGRpcgotCSAqIAotCSAqIEBwYXJhbSBmcm9tRGlyIEZpbGUKLQkgKiBAcGFyYW0gdG9EaXIgRmlsZQotCSAqIEBwYXJhbSBpbmNsdWRlcyBTdHJpbmcKLQkgKiBAcGFyYW0gZXhjbHVkZXMgU3RyaW5nCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGNvcHlEaXIoRmlsZSBmcm9tRGlyLCBGaWxlIHRvRGlyLCBTdHJpbmcgaW5jbHVkZXMsCi0JCQlTdHJpbmcgZXhjbHVkZXMpCi0JewotCQljb3B5RGlyKGZyb21EaXIsIHRvRGlyLCBpbmNsdWRlcywgZXhjbHVkZXMsIHRydWUpOwotCX0KLQkKLQkvKioKLQkgKiBjb3B5IGRpcgotCSAqIEBwYXJhbSBmcm9tRGlyIEZpbGUKLQkgKiBAcGFyYW0gdG9EaXIgRmlsZQotCSAqIEBwYXJhbSBpbmNsdWRlcyBTdHJpbmcKLQkgKiBAcGFyYW0gZXhjbHVkZXMgU3RyaW5nCi0JICogQHBhcmFtIG92ZXJ3cml0ZSBib29sZWFuIHRydWUgdG8gb3ZlcnJpZGUgZXhpc3RpbmcgZmlsZXMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgY29weURpcihGaWxlIGZyb21EaXIsIEZpbGUgdG9EaXIsIFN0cmluZyBpbmNsdWRlcywKLQkJCVN0cmluZyBleGNsdWRlcywgYm9vbGVhbiBvdmVyd3JpdGUpIHsKLQkJQ29weSBjcCA9IG5ldyBDb3B5KCk7Ci0JCWNwLnNldE92ZXJ3cml0ZShvdmVyd3JpdGUpOyAvLyBvbmx5IGNwb3kgbmV3IGZpbGVzIG9yIG5ld2VyIGZpbGVzCi0JCWlmIChpbmNsdWRlcyAhPSBudWxsIHx8IGV4Y2x1ZGVzICE9IG51bGwpIHsKLQkJCUZpbGVTZXQgc2V0ID0gbmV3IEZpbGVTZXQoKTsKLQkJCWlmIChpbmNsdWRlcyAhPSBudWxsKSB7Ci0JCQkJc2V0LnNldEluY2x1ZGVzKGluY2x1ZGVzKTsKLQkJCX0KLQotCQkJaWYgKGV4Y2x1ZGVzICE9IG51bGwpIHsKLQkJCQlzZXQuc2V0RXhjbHVkZXMoZXhjbHVkZXMpOwotCQkJfQotCi0JCQlzZXQuc2V0RGlyKGZyb21EaXIpOwotCQkJY3AuYWRkRmlsZXNldChzZXQpOwotCQl9Ci0KLQkJY3Auc2V0VG9kaXIodG9EaXIpOwotCQljcC5zZXRQcm9qZWN0KG5ldyBQcm9qZWN0KCkpOwotCQljcC5leGVjdXRlKCk7Ci0KLQl9Ci0KLQkvKioKLQkgKiBjb3B5IHRoZSBsYXlvdXQgZmlsZXMgZnJvbSB0aGUgbGlicmFyeSBsYXlvdXQgcGF0aCB0byB0aGUgc3BlY2lmaWVkCi0JICogcHVibGlzaCBmb2xkZXIKLQkgKiAKLQkgKiBAcGFyYW0gdG9EaXIKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgY29weUxheW91dEZpbGVzKFN0cmluZyB0b0RpcikgewotCQkvLyBjb3B5IHRoZSBsYXlvdXQgZmlsZXMgdG8gdGhlIHRlbXAgZm9sZGVyCi0JCVN0cmluZyBzb3VyY2VEaXIgPSBMaWJyYXJ5UGx1Z2luLmdldERlZmF1bHQoKS5nZXRMYXlvdXRQYXRoKCk7Ci0JCWNvcHlEaXIoc291cmNlRGlyLCB0b0Rpcik7Ci0KLQkJdHJ5IHsKLQkJCUxpYnJhcnlQbHVnaW4uZ2V0RGVmYXVsdCgpLmNvcHlMb2NhbGl6ZWRGaWxlcygKLQkJCQkJTGlicmFyeVBsdWdpbi5MQVlPVVRfU0NSSVBUU19QQVRILAotCQkJCQluZXcgRmlsZSh0b0RpciwgTGlicmFyeVBsdWdpbi5MQVlPVVRfU0NSSVBUU19GT0xERVIpLCB0cnVlLAotCQkJCQlmYWxzZSk7Ci0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQlleC5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCB1bnppcChGaWxlIHppcEZpbGUsIEZpbGUgdG9EaXIpIHsKLQkJRXhwYW5kIGV4cCA9IG5ldyBFeHBhbmQoKTsKLQkJZXhwLnNldE92ZXJ3cml0ZSh0cnVlKTsgCi0JCWV4cC5zZXRTcmMoemlwRmlsZSk7Ci0JCWV4cC5zZXREZXN0KHRvRGlyKTsKLQkJZXhwLnNldFByb2plY3QobmV3IFByb2plY3QoKSk7Ci0JCWV4cC5leGVjdXRlKCk7Ci0KLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L0xheW91dFJlc291cmNlcy5wcm9wZXJ0aWVzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9MYXlvdXRSZXNvdXJjZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWYxMGY4ZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L0xheW91dFJlc291cmNlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIwotIyB1cmxzIHN0YXJ0IHdpdGggdGhlIGZvbGxvd2luZyB3aWxsIGJlIHRyZWF0ZWQgYXMgZXh0ZXJuYWwgdXJscywgdXNlIHwgdG8gc3BlcmF0ZSAKLSMKLSNleHRlcm5hbFVybF9zdGFydFdpdGg9aHR0cDovL3xodHRwczovL3xmdHA6Ly8KLSMgc2VlIGFsbCB0aGUgcG9zc2libGUgcHJvdG9jYWxzIGF0OgotIyBodHRwOi8vd3d3LmlhbmEub3JnL2Fzc2lnbm1lbnRzL3VyaS1zY2hlbWVzLmh0bWwKLWV4dGVybmFsVXJsX3N0YXJ0V2l0aD1bYS16QS1aMC05XFwuXXsxLDE1fTovLwotCi0jIFhTTCBTdHlsZXNoZWV0IE1hcHBpbmcgZm9yIHRoZSBNZXRob2QgRWxlbWVudHMuCi0KLSMgQ29yZSBNZXRob2QgRWxlbWVudHMKLWFydGlmYWN0PWFydGlmYWN0LnhzbAotZGVsaXZlcmFibGU9ZGVsaXZlcmFibGUueHNsCi1vdXRjb21lPW91dGNvbWUueHNsCi1yb2xlPXJvbGUueHNsCi10YXNrPXRhc2sueHNsCi0KLSMgR3VpZGFuY2UKLWNoZWNrbGlzdD1jaGVja2xpc3QueHNsCi1jb25jZXB0PWd1aWRhbmNlLnhzbAotZXhhbXBsZT1ndWlkYW5jZV93aXRoX2F0dGFjaG1lbnQueHNsCi1ndWlkZWxpbmU9Z3VpZGFuY2UueHNsCi1wcmFjdGljZT1wcmFjdGljZS54c2wKLXJlcG9ydD1ndWlkYW5jZS54c2wKLXJvYWRtYXA9Z3VpZGFuY2UueHNsCi1yZXVzYWJsZWFzc2V0PWd1aWRhbmNlX3dpdGhfYXR0YWNobWVudC54c2wKLXN1cHBvcnRpbmdtYXRlcmlhbD1ndWlkYW5jZS54c2wKLXRlbXBsYXRlPWd1aWRhbmNlX3dpdGhfYXR0YWNobWVudC54c2wKLXRlcm1kZWZpbml0aW9uPWd1aWRhbmNlLnhzbAotdG9vbG1lbnRvcj1ndWlkYW5jZS54c2wKLXdoaXRlcGFwZXI9Z3VpZGFuY2Vfd2l0aF9hdHRhY2htZW50LnhzbAotZXN0aW1hdGlvbmNvbnNpZGVyYXRpb25zPWd1aWRhbmNlLnhzbAotCi0jIENvbnRlbnQgQ2F0ZWdvcmllcwotY3VzdG9tY2F0ZWdvcnk9Y29udGVudGNhdGVnb3J5LnhzbAotZGlzY2lwbGluZT1jb250ZW50Y2F0ZWdvcnkueHNsCi1kaXNjaXBsaW5lZ3JvdXBpbmc9Y29udGVudGNhdGVnb3J5LnhzbAotZG9tYWluPWNvbnRlbnRjYXRlZ29yeS54c2wKLXJvbGVzZXQ9Y29udGVudGNhdGVnb3J5LnhzbAotcm9sZXNldGdyb3VwaW5nPWNvbnRlbnRjYXRlZ29yeS54c2wKLXRvb2w9Y29udGVudGNhdGVnb3J5LnhzbAotd29ya3Byb2R1Y3R0eXBlPWNvbnRlbnRjYXRlZ29yeS54c2wKLQotIyBQcm9jZXNzIEVsZW1lbnRzCi0jIGFjdGl2aXR5IGxheW91dCB1c2UgdGhlIGRlZmF1bHQgdGFiIGxheW91dCB4c2wKLSN3YXMgdXNpbmcgYSByZWZyZXNoIHRvIHNob3cgdGhlIGRlZmF1bHQgcGFnZQotI2J1dCBjYXVzZWQgcHJvYmxlbSBpbiB0aGUgbmF2aWdhdGlvbiBoaXN0b3J5IGJhY2svZm9yd2FyZCBpbiBicm93c2luZwotI3NvIHN3aXRjaCB0byB0aGUgb2xkIHdheSB0byBnZW5lcmF0ZSB0aGUgZGVmYXVsdCBsYXlvdXQgdXNpbmcgdGhlIHNldCBkZWZhdWx0IHRhYgotIwotI2FjdGl2aXR5PWFjdGl2aXR5LnhzbAotI2NhcGFiaWxpdHlwYXR0ZXJuPWFjdGl2aXR5LnhzbAotI2RlbGl2ZXJ5cHJvY2Vzcz1hY3Rpdml0eS54c2wKLSNpdGVyYXRpb249YWN0aXZpdHkueHNsCi0jcGhhc2U9YWN0aXZpdHkueHNsCi0jcHJvY2Vzcz1hY3Rpdml0eS54c2wKLSNwcm9jZXNzY29udHJpYnV0aW9uPWFjdGl2aXR5LnhzbAotCi0jIERlc2NyaXB0b3JzCi1jb21wb3NpdGVyb2xlPWNvbXBvc2l0ZXJvbGUueHNsCi1taWxlc3RvbmU9bWlsZXN0b25lLnhzbAotcm9sZWRlc2NyaXB0b3I9cm9sZV9kZXNjcmlwdG9yLnhzbAotdGFza2Rlc2NyaXB0b3I9dGFza19kZXNjcmlwdG9yLnhzbAotdGVhbXByb2ZpbGU9dGVhbXByb2ZpbGUueHNsCi13b3JrcHJvZHVjdGRlc2NyaXB0b3I9YXJ0aWZhY3RfZGVzY3JpcHRvci54c2wKLQotIyBNaXNjCi1kZWZhdWx0PWRlZmF1bHQueHNsCi1nZW5lcmFsPWdlbmVyYWwueHNsCi1wYWdlX25vdF9pbnN0YWxsZWQ9cGFnZV9ub3RfaW5zdGFsbGVkLnhzbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9MaW5rSW5mby5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9MaW5rSW5mby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNTQ1N2EwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvTGlua0luZm8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQ7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtV3JpdGVyOwotaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkxEZWNvZGVyOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7Ci1pbXBvcnQgamF2YS51dGlsLnJlZ2V4Lk1hdGNoZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnhtbC5YU0xUUHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LklMaWJyYXJ5TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQudXRpbC5YbWxFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC51dGlsLlhtbEhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS5JTGlicmFyeVJlc291cmNlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuTGlicmFyeVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5SZXNvdXJjZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50OwotCi0vKioKLSAqIGNsYXNzIHRvIHByb2Nlc3MgYW4gZWxlbWVudCBsaW5rIGluIHRoZSBjb250ZW50Ci0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBMaW5rSW5mbyB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMSU5LX0FUVFJfQ0xBU1MgPSAiY2xhc3MiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMSU5LX0FUVFJfR1VJRCA9ICJndWlkIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTElOS19BVFRSX0hSRUYgPSAiaHJlZiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExJTktfQVRUUl9LRVkgPSAia2V5IjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTElOS19BVFRSX1RFWFQgPSAidGV4dCI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExJTktfQVRUUl9OQU1FID0gIm5hbWUiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIFN0cmluZyBsaW5rZWRUZXh0ID0gIiI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgTWV0aG9kRWxlbWVudCBsaW5rRWxlbWVudCA9IG51bGw7Ci0KLQlwcml2YXRlIE1ldGhvZEVsZW1lbnQgb3duZXJFbGVtZW50ID0gbnVsbDsKLQotCXByaXZhdGUgYm9vbGVhbiBpc01pc3NpbmdSZWZlcmVuY2UgPSBmYWxzZTsKLQotCXByaXZhdGUgTWFwPFN0cmluZywgU3RyaW5nPiBhdHRyaWJ1dGVNYXAgPSBuZXcgTGlua2VkSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKLQotCXByaXZhdGUgSUNvbnRlbnRWYWxpZGF0b3IgdmFsaWRhdG9yOwotCi0JcHJpdmF0ZSBTdHJpbmcgcHViRGlyOwotCQotCXByaXZhdGUgU3RyaW5nIHRhZzsKLQkKLQkvL1RlbXAgc29sdXRpb24gZm9yIGdldHRpbmcgYXJvdW5kIHdpdGhvdXQgaGF2aW5nIGEgbGliTWdyIGR1cmluZyBtaWdyYXRpb24KLQkvL1Nob3VsZCBiZSByZW1vdmVkIHdoZW4gbGliIGxvYWRlZCBkdXJpbmcgbWlncmF0aW9uIGlzIHJlZ2lzdGVkIHdpdGggTGliIHNlcnZpY2UuCi0JcHJpdmF0ZSBzdGF0aWMgTWV0aG9kTGlicmFyeSBsaWJyYXJ5OwotCi0JLyoqCi0JICogY29uc3RydWN0b3IKLQkgKiAKLQkgKiBAcGFyYW0gb3duZXIKLQkgKiBAcGFyYW0gdmFsaWRhdG9yCi0JICogQHBhcmFtIHB1YkRpcgotCSAqLwotCXB1YmxpYyBMaW5rSW5mbyhNZXRob2RFbGVtZW50IG93bmVyLCBJQ29udGVudFZhbGlkYXRvciB2YWxpZGF0b3IsCi0JCQlTdHJpbmcgcHViRGlyLCBTdHJpbmcgdGFnKSB7Ci0JCXRoaXMub3duZXJFbGVtZW50ID0gb3duZXI7Ci0JCXRoaXMudmFsaWRhdG9yID0gdmFsaWRhdG9yOwotCQl0aGlzLnB1YkRpciA9IHB1YkRpcjsKLQkJdGhpcy50YWcgPSB0YWc7Ci0JfQotCi0JLyoqCi0JICogaXMgdGhpcyBhbiBlbGVtZW50IGxpbms/Ci0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNFbGVtZW50TGluaygpIHsKLQkJcmV0dXJuIFJlc291cmNlSGVscGVyLmlzRWxlbWVudExpbmsoZ2V0RWxlbWVudExpbmtUeXBlKCkpOwotCX0KLQotCS8qKgotCSAqIGdldCB0aGUgZWxlbWVudCBsaW5rIHR5cGUKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RWxlbWVudExpbmtUeXBlKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlKExJTktfQVRUUl9DTEFTUyk7Ci0JfQotCi0JLyoqCi0JICogZ2V0IHRoZSBndWlkIG9mIHRoZSBlbGVtZW50IGxpbmsKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0R3VpZCgpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZShMSU5LX0FUVFJfR1VJRCk7Ci0JfQotCi0JLyoqCi0JICogZ2V0IHRoZSB1cmwgb2YgdGhlIGxpbmsKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VXJsKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlKExJTktfQVRUUl9IUkVGKTsKLQl9Ci0KLQkvKioKLQkgKiBnZXQgdGhlIGxpbmtlZCB0ZXh0Ci0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExpbmtlZFRleHQoKSB7Ci0JCXJldHVybiBsaW5rZWRUZXh0OwotCX0KLQotCS8qKgotCSAqIGdldCB0aGUgbGlua2VkIGVsZW1lbnQKLQkgKiBAcmV0dXJuIE1ldGhvZEVsZW1lbnQKLQkgKi8KLQlwdWJsaWMgTWV0aG9kRWxlbWVudCBnZXRMaW5rZWRFbGVtZW50KCkgewotCQlyZXR1cm4gbGlua0VsZW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogZ2V0IHRoZSBodG1sIGZvciB0aGUgbGluay4KLQkgKiAKLQkgKiBAcGFyYW0gc2hvd0Jyb2tlbkxpbmtzIGJvb2xlYW4gdHJ1ZSB0byBzaG93IHRoZSBicm9rZW4gbGluayBtYXJrLiBmYWxzZSB0byBzaG93IHRleHQgb25seQotCSAqIEByZXR1cm4gU3RyaW5nQnVmZmVyCi0JICovCi0JcHVibGljIFN0cmluZ0J1ZmZlciBnZXRIdG1sKGJvb2xlYW4gc2hvd0Jyb2tlbkxpbmtzKSB7Ci0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0KLQkJaWYgKGlzTWlzc2luZ1JlZmVyZW5jZSAmJiAocHViRGlyICE9IG51bGwpKSB7Ci0JCQlTdHJpbmcgdXJsID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCWlmICghc2hvd0Jyb2tlbkxpbmtzKSB7Ci0JCQkJYnVmZmVyLmFwcGVuZChsaW5rZWRUZXh0KTsKLQkJCQlyZXR1cm4gYnVmZmVyOwotCQkJfQotCi0JCQl1cmwgPSBnZXRNaXNzaW5nRWxlbWVudFVybCgpOwotCQkJYnVmZmVyCi0JCQkJCS5hcHBlbmQoIjxpbWcgYWx0PVwiXCIgc3JjPVwiIiArIFJlc291cmNlSGVscGVyLmdldEJhY2tQYXRoKG93bmVyRWxlbWVudCkgKyAiaW1hZ2VzL25vX3J1cC5naWZcIj4mIzE2MDsiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkJCXNldFVybCh1cmwpOwotCQl9Ci0KLQkJYnVmZmVyLmFwcGVuZCgiPCIgKyB0YWcpOyAvLyROT04tTkxTLTEkCi0KLQkJZm9yIChJdGVyYXRvcjxNYXAuRW50cnk8U3RyaW5nLCBTdHJpbmc+PiBpdCA9IGF0dHJpYnV0ZU1hcC5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCU1hcC5FbnRyeTxTdHJpbmcsIFN0cmluZz4gZW50cnkgPSBpdC5uZXh0KCk7Ci0JCQlTdHJpbmcga2V5ID0gZW50cnkuZ2V0S2V5KCk7Ci0JCQlTdHJpbmcgdmFsdWUgPSBlbnRyeS5nZXRWYWx1ZSgpOwotCQkJaWYgKExJTktfQVRUUl9IUkVGLmVxdWFscyhrZXkpCi0JCQkJCSYmICh2YWx1ZSA9PSBudWxsIHx8IHZhbHVlLmxlbmd0aCgpID09IDApKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0KLQkJCWJ1ZmZlci5hcHBlbmQoIiAiKSAvLyROT04tTkxTLTEkCi0JCQkJCS5hcHBlbmQoZW50cnkuZ2V0S2V5KCkpLmFwcGVuZCgiPSIpIC8vJE5PTi1OTFMtMSQKLQkJCQkJLmFwcGVuZCgiXCIiKS5hcHBlbmQoZW50cnkuZ2V0VmFsdWUoKSkuYXBwZW5kKCJcIiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCi0JCWJ1ZmZlci5hcHBlbmQoIj4iKS5hcHBlbmQobGlua2VkVGV4dCkuYXBwZW5kKCI8LyIgKyB0YWcgKyAiPiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCi0JCXJldHVybiBidWZmZXI7Ci0JfQotCi0JLyoqCi0JICogdmFsaWRhdGUgdGhlIGxpbmsgYXR0cmlidXRlcwotCSAqIEBwYXJhbSBhdHRyaWJ1dGVzIFN0cmluZyB0aGUgbGluayBhdHRyaWJ1dGVzCi0JICogQHBhcmFtIHRleHQgU3RyaW5nIHRoZSBsaW5rZWQgdGV4dAotCSAqIEBwYXJhbSBjb25maWcgTWV0aG9kQ29uZmlndXJhdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHZhbGlkYXRlTGluayhTdHJpbmcgYXR0cmlidXRlcywgU3RyaW5nIHRleHQsCi0JCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZykgewotCQl0aGlzLmxpbmtlZFRleHQgPSB0ZXh0OwotCi0JCU1hdGNoZXIgbTIgPSBSZXNvdXJjZUhlbHBlci5wX3RhZ19hdHRyaWJ1dGVzLm1hdGNoZXIoYXR0cmlidXRlcyk7Ci0JCXdoaWxlIChtMi5maW5kKCkpIHsKLQkJCVN0cmluZyBhdHRyTmFtZSA9IG0yLmdyb3VwKDEpLnRyaW0oKS50b0xvd2VyQ2FzZSgpOwotCQkJU3RyaW5nIGF0dHJWYWx1ZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQlpZiAobTIuZ3JvdXAoMykgIT0gbnVsbCkgewotCQkJCWF0dHJWYWx1ZSA9IG0yLmdyb3VwKDMpLnRyaW0oKTsKLQkJCX0gZWxzZSBpZiAobTIuZ3JvdXAoMikgIT0gbnVsbCkgewotCQkJCWF0dHJWYWx1ZSA9IG0yLmdyb3VwKDIpLnRyaW0oKTsKLQkJCX0KLQkJCQotCQkJLyoKLQkJCSAqIGlmIChhdHRyVmFsdWUuc3RhcnRzV2l0aCgiXCIiKSkgeyBhdHRyVmFsdWUgPQotCQkJICogYXR0clZhbHVlLnN1YnN0cmluZygxKTsgfSBpZiAoYXR0clZhbHVlLmVuZHNXaXRoKCJcIiIpKSB7Ci0JCQkgKiBhdHRyVmFsdWUgPSBhdHRyVmFsdWUuc3Vic3RyaW5nKDAsIGF0dHJWYWx1ZS5sZW5ndGgoKSAtIDEpOyB9Ci0JCQkgKi8KLQotCQkJLy8gR1ZUOiBDYW5ub3QgUHJldmlldy9Ccm93c2UgRGVzY3JpcHRpb24gVGFiIHdoZW4KLQkJCS8vIHRoZSBDUCBjb250YWlucyBjaGluZXNlIGNoYXJhY3RlcnMKLQkJCS8vIGdlbmVyYXRlZCBodG1sIGZyb20geHNsdCBnb3QgdGhlIGhyZWYgdXJscyBlbmNvZGVkLiB3ZSBkb24ndCB3YW50Ci0JCQkvLyB0aGF0IG1ha2Ugc3VyZSBkZWNvZGUgdGhlIHVybCB1c2luZyAiVVRGLTgiIGVuY29kaW5nCi0JCQlpZiAoYXR0ck5hbWUuZXF1YWxzKExJTktfQVRUUl9IUkVGKSkgewotCQkJCXRyeSB7Ci0JCQkJCWF0dHJWYWx1ZSA9IGRlY29kZShhdHRyVmFsdWUpOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJfQotCQkJfQotCQkJYXR0cmlidXRlTWFwLnB1dChhdHRyTmFtZSwgYXR0clZhbHVlKTsKLQkJfQotCi0JCVN0cmluZyBndWlkID0gZ2V0R3VpZCgpOwotCQlpZiAoZ3VpZCA9PSBudWxsKSB7Ci0JCQkvLyBjaGVjayBpZiB0aGUgZmlsZSBjb250YWlucyBndWlkLCBpZiB5ZXMsIG5lZWQgdG8gZ2V0IHRoZSBlbGVtZW50Ci0JCQlTdHJpbmcgdXJsID0gZ2V0VXJsKCk7Ci0JCQlndWlkID0gUmVzb3VyY2VIZWxwZXIuZ2V0R3VpZEZyb21GaWxlTmFtZSh1cmwpOwotCQkJaWYgKGd1aWQgIT0gbnVsbCkgewotCQkJCXNldEd1aWQoZ3VpZCk7Ci0JCQl9Ci0JCX0KLQotCQl2YWxpZGF0ZUVsZW1lbnRVcmwoY29uZmlnKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGRlY29kZShTdHJpbmcgc3RyKSB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiB7Ci0JCXJldHVybiBVUkxEZWNvZGVyLmRlY29kZShzdHIsICJVVEYtOCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogZ2V0IGF0dHJpYnV0ZQotCSAqIEBwYXJhbSBuYW1lCi0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXRBdHRyaWJ1dGUoU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIChTdHJpbmcpIGF0dHJpYnV0ZU1hcC5nZXQobmFtZSk7Ci0JfQotCi0JLyoqCi0JICogc2V0IGd1aWQKLQkgKiBAcGFyYW0gZ3VpZCBTdHJpbmcKLQkgKi8KLQlwcml2YXRlIHZvaWQgc2V0R3VpZChTdHJpbmcgZ3VpZCkgewotCQlhdHRyaWJ1dGVNYXAucHV0KExJTktfQVRUUl9HVUlELCBndWlkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRVcmwoU3RyaW5nIHVybCkgewotCQlhdHRyaWJ1dGVNYXAucHV0KExJTktfQVRUUl9IUkVGLCB1cmwpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2YWxpZGF0ZUVsZW1lbnRVcmwoTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLQkJU3RyaW5nIGd1aWQgPSBnZXRHdWlkKCk7Ci0JCWlmIChndWlkICE9IG51bGwpIHsKLQkJCU1ldGhvZEVsZW1lbnQgZSA9IG51bGw7Ci0JCQllID0gZ2V0TWV0aG9kRWxlbWVudChndWlkKTsKLQotCQkJLy8gaWYgcHJvY2VzcyBjb21wb25lbnQsIGdldCBzaG93IHRoZSBwcm9jZXNzCi0JCQlpZiAoZSBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpIHsKLQkJCQllID0gKChQcm9jZXNzQ29tcG9uZW50KSBlKS5nZXRQcm9jZXNzKCk7Ci0JCQl9Ci0KLQkJCS8vIDE1NjQ3NCAtIFByb2Nlc3MgUGFja2FnZSAoZWl0aGVyIENQIHBhY2thZ2Ugb3IgRFAgcGFja2FnZSkgY2FuCi0JCQkvLyBub3QgYmUgbGlua2VkIGluIFJURQotCQkJLy8gZG9uJ3Qgc2hvdyBsaW5rIGZvciBwYWNrYWdlcy4KLQkJCWlmIChlIGluc3RhbmNlb2YgTWV0aG9kUGFja2FnZSB8fCBlIGluc3RhbmNlb2YgTWV0aG9kQ29uZmlndXJhdGlvbgotCQkJCQl8fCBlIGluc3RhbmNlb2YgTWV0aG9kTGlicmFyeSkgewotCQkJCWUgPSBudWxsOwotCQkJCS8vIHJlbW92ZSB0aGUgbGluayBhdHl0cmlidXRlCi0JCQkJc2V0VXJsKG51bGwpOwotCQkJCXJldHVybjsKLQkJCX0KLQotCQkJaWYgKGUgIT0gbnVsbCkgewotCQkJCWlmIChjb25maWcgIT0gbnVsbCkgewotCQkJCQlNZXRob2RFbGVtZW50IGUxID0gQ29uZmlndXJhdGlvbkhlbHBlcgotCQkJCQkJCS5nZXRDYWxjdWxhdGVkRWxlbWVudChlLCBjb25maWcpOwotCQkJCQlpZiAoZTEgIT0gbnVsbCkgewotCQkJCQkJZSA9IGUxOwotCQkJCQl9IGVsc2UgewotCQkJCQkJaXNNaXNzaW5nUmVmZXJlbmNlID0gdHJ1ZTsKLQkJCQkJCXZhbGlkYXRvci5sb2dNaXNzaW5nUmVmZXJlbmNlKG93bmVyRWxlbWVudCwgZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCWlzTWlzc2luZ1JlZmVyZW5jZSA9IHRydWU7Ci0JCQkJdmFsaWRhdG9yLmxvZ01pc3NpbmdSZWZlcmVuY2Uob3duZXJFbGVtZW50LCBndWlkLCBsaW5rZWRUZXh0KTsKLQkJCX0KLQotCQkJaWYgKGUgIT0gbnVsbCkgewotCQkJCWd1aWQgPSBlLmdldEd1aWQoKTsKLQkJCQlzZXRHdWlkKGd1aWQpOwotCQkJCVN0cmluZyB1cmwgPSBnZXRVcmwoKTsKLQotCQkJCS8vIHVybCBjYW4gYmUgbnVsbCwgZm9yIGV4YW1wbGUsIGFuIGVsZW1lbnQgbGluayBmb3IKLQkJCQkvLyBwcmVzZW50YXRpb24gbmFtZSwgc3VjaCBhcwotCQkJCS8vIDxhIGNsYXNzPSJQcmVzZW50YXRpb25OYW1lIgotCQkJCS8vIGd1aWQ9IntFRTk3QThDRC02NkNBLTRBOUItOTg3MS1FM0I5NENDRUQ1Mjh9Ij5Qcm9qZWN0Ci0JCQkJLy8gTWFuYWdlcjwvYT4KLQkJCQkvLyB3ZSBvbmx5IG5lZWQgdG8gZ2V0IHRoZSBlbGVtZW50IGZyb20gdGhlIGd1aWQKLQkJCQlpZiAodXJsICE9IG51bGwpIHsKLQkJCQkJdXJsID0gdXJsLnRyaW0oKTsKLQkJCQkJaWYgKCF1cmwudG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKAotCQkJCQkJCVJlc291cmNlSGVscGVyLlVSTF9TVFJfSkFWQVNDUklQVCkpIHsKLQkJCQkJCXVybCA9IFJlc291cmNlSGVscGVyLmdldFVybChlLCBvd25lckVsZW1lbnQsCi0JCQkJCQkJCVJlc291cmNlSGVscGVyLkZJTEVfRVhUX0hUTUwsIHVybCk7Ci0JCQkJCQlzZXRVcmwodXJsKTsKLQkJCQkJfQotCQkJCX0KLQotCQkJCWlmIChpc0VsZW1lbnRMaW5rKCkgJiYgIXRhZy5lcXVhbHMoImFyZWEiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCVN0cmluZyB0ZXh0ID0gUmVzb3VyY2VIZWxwZXIuZ2V0TGlua1RleHQoZSwKLQkJCQkJCQlnZXRFbGVtZW50TGlua1R5cGUoKSwgY29uZmlnKTsKLQkJCQkJaWYgKHRleHQgIT0gbnVsbCkgewotCQkJCQkJLy8gaWYgbnVsbCwgY2FuIGJlIHVzZWQgdGV4dCwgZG9uJ3QgcmVzZXQgaXQKLQkJCQkJCXRoaXMubGlua2VkVGV4dCA9IHRleHQ7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQlpZiAodmFsaWRhdG9yLmlzRGlzY2FyZGVkKG93bmVyRWxlbWVudCwgbnVsbCwgZSkpIHsKLQkJCQkJaXNNaXNzaW5nUmVmZXJlbmNlID0gdHJ1ZTsKLQkJCQkJdmFsaWRhdG9yLmxvZ01pc3NpbmdSZWZlcmVuY2Uob3duZXJFbGVtZW50LCBlKTsKLQkJCQkJZSA9IG51bGw7IC8vIGlnbm9yZSB0aGUgZWxlbWVudCBzaW5jZSBpdCdzIGRpc2NhcmRlZAotCQkJCX0KLQkJCX0KLQotCQkJdGhpcy5saW5rRWxlbWVudCA9IGU7Ci0KLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgTWV0aG9kRWxlbWVudCBnZXRNZXRob2RFbGVtZW50KFN0cmluZyBndWlkKSB7Ci0JCU1ldGhvZEVsZW1lbnQgZTsKLQkJSUxpYnJhcnlNYW5hZ2VyIG1hbmFnZXIgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJLmdldEN1cnJlbnRMaWJyYXJ5TWFuYWdlcigpOwotCQlpZiAobWFuYWdlciAhPSBudWxsICYmIGdldExpYnJhcnkoKSA9PSBudWxsKSB7Ci0JCQllID0gbWFuYWdlci5nZXRNZXRob2RFbGVtZW50KGd1aWQpOwotCQl9IGVsc2UgewotCQkJZSA9IGdldE1ldGhvZEVsZW1lbnRfKGd1aWQpOwotCQkJaWYgKGUgPT0gbnVsbCAmJiBtYW5hZ2VyICE9IG51bGwpIHsKLQkJCQllID0gbWFuYWdlci5nZXRNZXRob2RFbGVtZW50KGd1aWQpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlOwotCX0KLQotCS8vIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNSVNTSU5HX1BBR0VTX1hTTCA9ICJwYWdlc19ub3RfaW5zdGFsbGVkLyI7Ci0JLy8gLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgU3RyaW5nIGdldE1pc3NpbmdFbGVtZW50VXJsKCkgewotCQlpZiAoIWlzTWlzc2luZ1JlZmVyZW5jZSkgewotCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlTdHJpbmcgdXJsID0gbnVsbDsKLQotCQkvLyBpZiAobGlua0VsZW1lbnQgPT0gbnVsbCkgewotCQkvLyAvLyB0aGlzIGlzIGFuIGludmFsaWQgZWxlbWVudCwgbWF5YmUgZGVsZXRlZCBmcm9tIHRoZSBsaWJyYXJ5Ci0JCS8vIC8vIGFscmVhZHkKLQkJLy8gdXJsID0gUmVzb3VyY2VIZWxwZXIuTUlTU0lOR19QQUdFU19GT0xERVIgKyBnZXRHdWlkKCkKLQkJLy8gKyBSZXNvdXJjZUhlbHBlci5GSUxFX0VYVF9IVE1MOwotCQkvLyB9IGVsc2UgewotCQkvLyB1cmwgPSBSZXNvdXJjZUhlbHBlci5NSVNTSU5HX1BBR0VTX0ZPTERFUgotCQkvLyArIFJlc291cmNlSGVscGVyLmdldEZpbGVOYW1lKGxpbmtFbGVtZW50LAotCQkvLyBSZXNvdXJjZUhlbHBlci5GSUxFX0VYVF9IVE1MKTsKLQkJLy8gfQotCi0JCXVybCA9IFJlc291cmNlSGVscGVyLk1JU1NJTkdfUEFHRVNfRk9MREVSICsgInBhZ2VzX25vdF9pbnN0YWxsZWQiIC8vJE5PTi1OTFMtMSQKLQkJCQkrIFJlc291cmNlSGVscGVyLkZJTEVfRVhUX0hUTUw7Ci0KLQkJRmlsZSBmID0gbmV3IEZpbGUocHViRGlyLCB1cmwpOwotCQlGaWxlIGRpciA9IGYuZ2V0UGFyZW50RmlsZSgpOwotCQlpZiAoIWRpci5leGlzdHMoKSkgewotCQkJZGlyLm1rZGlycygpOwotCQl9Ci0KLQkJLy8gaWYgKCAhZi5leGlzdHMoKSApCi0JCXsKLQkJCS8vIGdlbmVyYXRlIHRoZSBodG1sIGZpbGUKLQkJCVhtbEVsZW1lbnQgeG1sID0gbmV3IFhtbEVsZW1lbnQoIkVsZW1lbnQiKTsgLy8kTk9OLU5MUy0xJAotCQkJCi0JCQkKLQkJCUxvY2FsZSBsb2NhbGUgPSBMb2NhbGUuZ2V0RGVmYXVsdCgpOwotCQkJU3RyaW5nIGxhbmcgPSBsb2NhbGUuZ2V0TGFuZ3VhZ2UoKTsKLQkJCXhtbC5zZXRBdHRyaWJ1dGUoImxhbmciLCBsYW5nKTsgLy8kTk9OLU5MUy0xJAotCi0KLQkJCWlmIChsaW5rRWxlbWVudCA9PSBudWxsKSB7Ci0JCQkJeG1sLnNldEF0dHJpYnV0ZSgiaW52YWxpZExpbmsiLCAidHJ1ZSIpIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJLnNldEF0dHJpYnV0ZSgiZ3VpZCIsIGdldEd1aWQoKSkgLy8kTk9OLU5MUy0xJAotCQkJCQkJLnNldEF0dHJpYnV0ZSgibmFtZSIsIGxpbmtlZFRleHQpOyAvLyROT04tTkxTLTEkCi0JCQl9IGVsc2UgewotCQkJCXhtbAotCQkJCQkJLnNldEF0dHJpYnV0ZSgiZ3VpZCIsIGdldEd1aWQoKSkgLy8kTk9OLU5MUy0xJAotCQkJCQkJLnNldEF0dHJpYnV0ZSgidHlwZSIsIGxpbmtFbGVtZW50LmdldFR5cGUoKS5nZXROYW1lKCkpIC8vJE5PTi1OTFMtMSQKLQkJCQkJCS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCBsaW5rRWxlbWVudC5nZXROYW1lKCkpIC8vJE5PTi1OTFMtMSQKLQkJCQkJCS5zZXRBdHRyaWJ1dGUoCi0JCQkJCQkJCSJwbHVnaW5OYW1lIiwgTGlicmFyeVV0aWwuZ2V0TWV0aG9kUGx1Z2luKGxpbmtFbGVtZW50KS5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlTdHJpbmcgeHNsUGF0aCA9IExheW91dFJlc291cmNlcy5nZXREZWZhdWx0WHNsUGF0aCgKLQkJCQkJInBhZ2Vfbm90X2luc3RhbGxlZCIsIG51bGwpOyAvLyROT04tTkxTLTEkCi0JCQlzYXZlSHRtbCh4bWwsIHhzbFBhdGgsIGYpOwotCQl9Ci0KLQkJcmV0dXJuIFJlc291cmNlSGVscGVyLmdldEJhY2tQYXRoKG93bmVyRWxlbWVudCkucmVwbGFjZSgKLQkJCQlGaWxlLnNlcGFyYXRvckNoYXIsICcvJykKLQkJCQkrIHVybDsKLQl9Ci0KLQkvKioKLQkgKiBzYXZlIGEgaHRtbCBmaWxlIAotCSAqIEBwYXJhbSB4bWxFbGVtZW50Ci0JICogQHBhcmFtIHhzbF91cmkKLQkgKiBAcGFyYW0gb3V0cHV0RmlsZQotCSAqIEBkZXByZWNhdGVkIHRoaXMgbWV0aG9kIGlkIG5vdCB1c2VkIGFueSBtb3JlCi0JICovCi0JcHVibGljIHZvaWQgc2F2ZUh0bWwoWG1sRWxlbWVudCB4bWxFbGVtZW50LCBTdHJpbmcgeHNsX3VyaSwgRmlsZSBvdXRwdXRGaWxlKSB7Ci0JCXRyeSB7Ci0JCQlTdHJpbmdCdWZmZXIgeG1sID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJeG1sLmFwcGVuZChYbWxIZWxwZXIuWE1MX0hFQURFUikuYXBwZW5kKHhtbEVsZW1lbnQudG9YbWwoKSk7Ci0KLQkJCU91dHB1dFN0cmVhbVdyaXRlciBvdXRwdXQgPSBuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKAotCQkJCQluZXcgRmlsZU91dHB1dFN0cmVhbShvdXRwdXRGaWxlKSwgInV0Zi04Iik7IC8vJE5PTi1OTFMtMSQKLQkJCVByb3BlcnRpZXMgeHNsUGFyYW1zID0gTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJvcGVydGllcygKLQkJCQkJIi9sYXlvdXQveHNsL3Jlc291cmNlcy5wcm9wZXJ0aWVzIik7IC8vJE5PTi1OTFMtMSQKLQotCQkJWFNMVFByb2Nlc3Nvci50cmFuc2Zvcm0oeHNsX3VyaSwgeG1sLnRvU3RyaW5nKCksIHhzbFBhcmFtcywgb3V0cHV0KTsKLQkJCW91dHB1dC5mbHVzaCgpOwotCQkJb3V0cHV0LmNsb3NlKCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJZXgucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgTWV0aG9kRWxlbWVudCBnZXRNZXRob2RFbGVtZW50XyhTdHJpbmcgZ3VpZCkgewotCQkJCXRyeSB7Ci0JCQkJCWlmIChnZXRMaWJyYXJ5KCkgPT0gbnVsbCkgewotCQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJCX0KLQkJCQkJSUxpYnJhcnlSZXNvdXJjZVNldCByZXNvdXJjZVNldCA9IChJTGlicmFyeVJlc291cmNlU2V0KSBnZXRMaWJyYXJ5KCkKLQkJCQkJCQkuZVJlc291cmNlKCkuZ2V0UmVzb3VyY2VTZXQoKTsKLQkJCQkJaWYgKHJlc291cmNlU2V0ICE9IG51bGwpIHsKLQkJCQkJCXJldHVybiAoTWV0aG9kRWxlbWVudCkgcmVzb3VyY2VTZXQuZ2V0RU9iamVjdChndWlkKTsKLQkJCQkJfQotCQkJCX0gY2F0Y2ggKFRocm93YWJsZSB0aCkgewotCQkJCQkvLyBMb2cgZXJyb3IgaGVyZQotCQkJCQl0aC5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0KLQlwdWJsaWMgc3RhdGljIE1ldGhvZExpYnJhcnkgZ2V0TGlicmFyeSgpIHsKLQkJcmV0dXJuIGxpYnJhcnk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldExpYnJhcnkoTWV0aG9kTGlicmFyeSBsaWJyYXJ5KSB7Ci0JCUxpbmtJbmZvLmxpYnJhcnkgPSBsaWJyYXJ5OwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9Qcm9jZXNzQWRhcHRlckZhY3RvcnlGaWx0ZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvUHJvY2Vzc0FkYXB0ZXJGYWN0b3J5RmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmOGI3YjUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9Qcm9jZXNzQWRhcHRlckZhY3RvcnlGaWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLnV0aWwuSUFkYXB0ZXJGYWN0b3J5RmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uUHJvY2Vzc0NvbmZpZ3VyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci0KLQotCi0vKioKLSAqIFRoZSBwcm9jZXNzIGZpbHRlciB3aXRoIGFkYXB0b3IgZmFjdG9yeS4KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFByb2Nlc3NBZGFwdGVyRmFjdG9yeUZpbHRlciBleHRlbmRzIFByb2Nlc3NDb25maWd1cmF0b3IgaW1wbGVtZW50cwotCQlJQWRhcHRlckZhY3RvcnlGaWx0ZXIgewotCi0JcHJpdmF0ZSBFbGVtZW50TGF5b3V0TWFuYWdlci5MYXlvdXRBZGFwdGVyRmFjdG9yeSBmYWN0b3J5OwotCi0JLyoqCi0JICogY29uc3RydWN0b3IgdGhlIGZpbHRlcgotCSAqIAotCSAqIEBwYXJhbSBtZXRob2RDb25maWcKLQkgKiBAcGFyYW0gZmFjdG9yeQotCSAqLwotCXB1YmxpYyBQcm9jZXNzQWRhcHRlckZhY3RvcnlGaWx0ZXIoTWV0aG9kQ29uZmlndXJhdGlvbiBtZXRob2RDb25maWcsIEVsZW1lbnRMYXlvdXRNYW5hZ2VyLkxheW91dEFkYXB0ZXJGYWN0b3J5IGZhY3RvcnkpIHsKLQkJc3VwZXIobWV0aG9kQ29uZmlnKTsKLQkJdGhpcy5mYWN0b3J5ID0gZmFjdG9yeTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIEFkYXB0ZXJGYWN0b3J5Ci0JICovCi0JcHVibGljIEFkYXB0ZXJGYWN0b3J5IGdldFdCU0FkYXB0ZXJGYWN0b3J5KCkgewotCQlyZXR1cm4gZmFjdG9yeS53YnNBZGFwdGVyRmFjdG9yeTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIEFkYXB0ZXJGYWN0b3J5Ci0JICovCi0JcHVibGljIEFkYXB0ZXJGYWN0b3J5IGdldFRCU0FkYXB0ZXJGYWN0b3J5KCkgewotCQlyZXR1cm4gZmFjdG9yeS50YnNBZGFwdGVyRmFjdG9yeTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIEFkYXB0ZXJGYWN0b3J5Ci0JICovCi0JcHVibGljIEFkYXB0ZXJGYWN0b3J5IGdldFdQQlNBZGFwdGVyRmFjdG9yeSgpIHsKLQkJcmV0dXJuIGZhY3Rvcnkud3Bic0FkYXB0ZXJGYWN0b3J5OwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gQWRhcHRlckZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgQWRhcHRlckZhY3RvcnkgZ2V0Q0JTQWRhcHRlckZhY3RvcnkoKSB7Ci0JCXJldHVybiBmYWN0b3J5LmNic0FkYXB0ZXJGYWN0b3J5OwotCX0KLQotCS8qKgotCSAqIGFjY2VwdCB0aGUgb2JqZWN0IG9yIG5vdC4KLQkgKiBAcGFyYW0gb2JqIE9iamVjdAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCXJldHVybiBzdXBlci5hY2NlcHQob2JqKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlmYWN0b3J5ID0gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L1JpY2hUZXh0Q29udGVudFZhbGlkYXRvci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9SaWNoVGV4dENvbnRlbnRWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWY0MWY5Yi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L1JpY2hUZXh0Q29udGVudFZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQ7Ci0KLWltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotCi0vKioKLSAqIFNwZWNpYWwgY29udGVudCB2YWxpZGF0b3IgZm9yIHRoZSBSaWNoIFRleHQgRWRpdG9yCi0gKiBAYXV0aG9yIEplZmYgSGFyZHkKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBSaWNoVGV4dENvbnRlbnRWYWxpZGF0b3IgZXh0ZW5kcyBEZWZhdWx0Q29udGVudFZhbGlkYXRvciB7Ci0KLQkvKioKLQkgKiB2YWxpZGF0ZXMgYSBVUkwgd2l0aG91dCBkZWNvZGluZyBpdAotCSAqLwotCXB1YmxpYyBMaW5rSW5mbyB2YWxpZGF0ZUxpbmsoTWV0aG9kRWxlbWVudCBvd25lciwgU3RyaW5nIGF0dHJpYnV0ZXMsCi0JCQlTdHJpbmcgdGV4dCwgTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcsIFN0cmluZyB0YWcpIHsKLQotCQlMaW5rSW5mbyBpbmZvID0gbmV3IExpbmtJbmZvKG93bmVyLCB0aGlzLCBwdWJEaXIsIHRhZykgewotCQkJcHJvdGVjdGVkIFN0cmluZyBkZWNvZGUoU3RyaW5nIHN0cikgdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gewotCQkJCXJldHVybiBzdHI7Ci0JCQl9Ci0JCX07Ci0JCWluZm8udmFsaWRhdGVMaW5rKGF0dHJpYnV0ZXMsIHRleHQsIGNvbmZpZyk7Ci0KLQkJcmV0dXJuIGluZm87Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L2RpYWdyYW0vRGlhZ3JhbUluZm8uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZGlhZ3JhbS9EaWFncmFtSW5mby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNGNiMTZhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZGlhZ3JhbS9EaWFncmFtSW5mby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5kaWFncmFtOwotCi1pbXBvcnQgamF2YS5hd3QuUmVjdGFuZ2xlOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuUmVzb3VyY2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaWJhYmxlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci0KLQotLyoqCi0gKiBjbGFzcyBmb3IgZGlhZ3JhbSBsYXlvdXQKLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBEaWFncmFtSW5mbyBleHRlbmRzIE1ldGhvZEVsZW1lbnREaWFncmFtIHsKLQotCXByaXZhdGUgaW50IHN1cHByZXNzZWRDb3VudCA9IDA7Ci0JcHJpdmF0ZSBpbnQgbm9kZUNvdW50ID0gMDsKLQkKLQkvKioKLQkgKiBjb25zdHJ1Y3RvcgotCSAqIEBwYXJhbSBkaWFncmFtVHlwZQotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICovCi0JcHVibGljIERpYWdyYW1JbmZvKFN0cmluZyBkaWFncmFtVHlwZSwgTWV0aG9kRWxlbWVudCBlbGVtZW50KSB7Ci0JCXN1cGVyKGVsZW1lbnQpOwotCi0JCXN1cGVyLnNldEhUTUxNYXAobmV3IEhUTUxNYXAoZGlhZ3JhbVR5cGUgKyAiXyIgKyBlbGVtZW50LmdldE5hbWUoKSkpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogYWRkIGEgZGlhZ3JhbSBhcmVhCi0JICogQHBhcmFtIGUKLQkgKiBAcGFyYW0geAotCSAqIEBwYXJhbSB5Ci0JICogQHBhcmFtIHdpZHRoCi0JICogQHBhcmFtIGhlaWdodAotCSAqIEBwYXJhbSBhbHRUYWcKLQkgKiBAcGFyYW0gc3VwcHJlc3NlZAotCSAqLwotCXB1YmxpYyB2b2lkIGFkZEFyZWEoTWV0aG9kRWxlbWVudCBlLCBpbnQgeCwgaW50IHksIGludCB3aWR0aCwgaW50IGhlaWdodCwKLQkJCVN0cmluZyBhbHRUYWcsIGJvb2xlYW4gc3VwcHJlc3NlZCkgewotCQlpZiAoIHN1cHByZXNzZWQgKQotCQl7Ci0JCQlzdXBwcmVzc2VkQ291bnQrKzsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJaWYgKGFsdFRhZyA9PSBudWxsKSB7Ci0JCQlpZiAoZSBpbnN0YW5jZW9mIERlc2NyaWJhYmxlRWxlbWVudCkgewotCQkJCWFsdFRhZyA9ICgoRGVzY3JpYmFibGVFbGVtZW50KSBlKS5nZXRQcmVzZW50YXRpb25OYW1lKCk7Ci0JCQkJaWYgKGFsdFRhZy5sZW5ndGgoKSA8IDEgfHwgYWx0VGFnID09ICIiKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJaWYgKGUgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCQkJT2JqZWN0IGJhc2UgPSAoKEFjdGl2aXR5KSBlKS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCk7Ci0JCQkJCQlhbHRUYWcgPSAoKEFjdGl2aXR5KSBiYXNlKS5nZXRQcmVzZW50YXRpb25OYW1lKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKGUgIT0gbnVsbCkgewotCQkJCWFsdFRhZyA9IGUuZ2V0TmFtZSgpOwotCQkJfSBlbHNlIHsKLQkJCQlhbHRUYWcgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0KLQkJUmVjdGFuZ2xlIGNvb3JkaW5hdGVzID0gbmV3IFJlY3RhbmdsZSh4LCB5LCB3aWR0aCwgaGVpZ2h0KTsKLQkJU3RyaW5nIGhyZWYgPSBSZXNvdXJjZUhlbHBlci5nZXRVcmwoZSwgc3VwZXIuZ2V0TWV0aG9kRWxlbWVudCgpLAotCQkJCVJlc291cmNlSGVscGVyLkZJTEVfRVhUX0hUTUwpOwotCQlIVE1MTWFwIG1hcCA9IHN1cGVyLmdldEhUTUxNYXAoKTsKLQkJbWFwLmFkZEFyZWEobmV3IEhUTUxBcmVhKGUuZ2V0R3VpZCgpLCBocmVmLCAicmVjdCIsIGNvb3JkaW5hdGVzLCBhbHRUYWcpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQkvKioKLQkgKiBBZGQgZ3JhcGhpY2FsIG5vZGVzCi0JICovCi0JcHVibGljIHZvaWQgYWRkR3JhcGhpY2FsTm9kZXMoKSB7Ci0JCW5vZGVDb3VudCsrOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGltYWdlIHBhdGggcmVsYXRpdmUgdG8gdGhlIHB1Ymxpc2hpbmcgZGlyLgotCSAqIAotCSAqIEBwYXJhbSBwYXRoCi0JICovCi0JcHVibGljIHZvaWQgc2V0SW1hZ2VGaWxlUGF0aChTdHJpbmcgcGF0aCkgewotCQlzdXBlci5zZXRJbWFnZUZpbGVOYW1lKFJlc291cmNlSGVscGVyLmdldEJhY2tQYXRoKHN1cGVyCi0JCQkJLmdldE1ldGhvZEVsZW1lbnQoKSkKLQkJCQkrIHBhdGgucmVwbGFjZShGaWxlLnNlcGFyYXRvckNoYXIsICcvJykpOwotCX0KLQotCS8qKgotCSAqIGdldCB0aGUgbnVtYmVyIG9mIGFyZWFzCi0JICogQHJldHVybiBpbnQKLQkgKi8KLQlwdWJsaWMgaW50IGdldEFyZWFDb3VudCgpIHsKLQkJcmV0dXJuIHN1cGVyLmdldEhUTUxNYXAoKS5zaXplKCk7Ci0JfQotCi0JLyoqCi0JICogZ2V0IHRoZSBudW1iZXIgb2Ygc3VwcHJlc3NlZCBhcmVhcwotCSAqIEByZXR1cm4gaW50Ci0JICovCi0JcHVibGljIGludCBnZXRTdXBwcmVzc2VkQ291bnQoKSB7Ci0JCXJldHVybiBzdXBwcmVzc2VkQ291bnQ7Ci0JfQotCQotCS8qKgotCSAqIGdldCB0aGUgbnVtYmVyIG9mIGdyYXBoaWNhbCBub2RlcyBpbiB0aGUgZGlhZ3JhbQotCSAqIEByZXR1cm4gaW50Ci0JICovCi0JcHVibGljIGludCBnZXRHcmFwaGljYWxOb2RlQ291bnQoKSB7Ci0JCXJldHVybiBub2RlQ291bnQ7Ci0JfQotCQotCS8qKgotCSAqIGlzIGVtcHR5PwotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRW1wdHkoKSB7Ci0JCQotCQlyZXR1cm4gZ2V0QXJlYUNvdW50KCkgKyBnZXRTdXBwcmVzc2VkQ291bnQoKSArIGdldEdyYXBoaWNhbE5vZGVDb3VudCgpID09IDA7Ci0JCQkJCQotCX0KLX0KLQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9kaWFncmFtL0hUTUxBcmVhLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L2RpYWdyYW0vSFRNTEFyZWEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzk0YjllYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L2RpYWdyYW0vSFRNTEFyZWEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5kaWFncmFtOwotCi1pbXBvcnQgamF2YS5hd3QuUmVjdGFuZ2xlOwotCi0vKioKLSAqIEVuY2Fwc3VsYXRlcyB0aGUgSFRNTCBBUkVBIHRhZy4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAYXV0aG9yIEppbmh1YSBYSQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgSFRNTEFyZWEgewotCi0JcHJpdmF0ZSBTdHJpbmcgZ3VpZCA9ICBudWxsOwotCQotCXByaXZhdGUgU3RyaW5nIGhyZWY7Ci0KLQlwcml2YXRlIFN0cmluZyBzaGFwZTsKLQotCXByaXZhdGUgUmVjdGFuZ2xlIGNvb3JkaW5hdGVzOwotCi0JcHJpdmF0ZSBTdHJpbmcgYWx0VGFnOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5IVE1MQXJlYTwvY29kZT4uCi0JICovCi0JcHVibGljIEhUTUxBcmVhKFN0cmluZyBndWlkLCBTdHJpbmcgaHJlZiwgU3RyaW5nIHNoYXBlLCBSZWN0YW5nbGUgY29vcmRpbmF0ZXMsCi0JCQlTdHJpbmcgYWx0VGFnKSB7Ci0JCXRoaXMuZ3VpZCA9IGd1aWQ7Ci0JCXRoaXMuaHJlZiA9IGhyZWY7Ci0JCXRoaXMuc2hhcGUgPSBzaGFwZTsKLQkJdGhpcy5jb29yZGluYXRlcyA9IGNvb3JkaW5hdGVzOwotCQl0aGlzLmFsdFRhZyA9IGFsdFRhZzsKLQkJCi0JCS8vIHJlbW92ZSBuZXcgbGluZSBjaGFyYWN0ZXJzLCBvdGhlcndpc2UgaXQgd2lsbCBjYXVzZWQgYSB3aGl0ZSBzcGFjZSBpbiB0aGUgcHVibGlzaGVkIGh0bWwKLQkJLy8gbm90IGFzIGV4cGVjdGVkLiAKLQkJLy8gc2VlIGJ1ZyAwMDM4ODk3OCAtIEV4dHJhIHNwYWNlIGluIHRoZSBmbHlvdmVyIHRleHQgaW4gdGhlIENhc3BpYW4gSmFwYW5lc2Ugc2l0ZQkJCi0JCWlmICggdGhpcy5hbHRUYWcgIT0gbnVsbCApIHsKLQkJCXRoaXMuYWx0VGFnID0gdGhpcy5hbHRUYWcucmVwbGFjZUFsbCgiKFxyfFxuKSsiLCAiIik7ICAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCX0KLQotCS8qKgotCSAqIGdldCB0aGUgZ3VpZAotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRHdWlkKCkgewotCQlyZXR1cm4gZ3VpZDsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgSFJFRi4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEhyZWYoKSB7Ci0JCXJldHVybiBocmVmOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNoYXBlLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U2hhcGUoKSB7Ci0JCXJldHVybiBzaGFwZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjb29yZGluYXRlcy4KLQkgKi8KLQlwdWJsaWMgUmVjdGFuZ2xlIGdldENvb3JkaW5hdGVzKCkgewotCQlyZXR1cm4gY29vcmRpbmF0ZXM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgYWx0IHRhZy4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEFsdFRhZygpIHsKLQkJcmV0dXJuIGFsdFRhZzsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZGlhZ3JhbS9IVE1MTWFwLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L2RpYWdyYW0vSFRNTE1hcC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNTBhYmJkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZGlhZ3JhbS9IVE1MTWFwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuZGlhZ3JhbTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi0vKioKLSAqIEVuY2Fwc3VsYXRlcyB0aGUgSFRNTCBNQVAgdGFnLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEhUTUxNYXAgewotCi0JcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLQotCXByaXZhdGUgQXJyYXlMaXN0IGFyZWFzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5IVE1MTWFwPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgSFRNTE1hcChTdHJpbmcgbmFtZSkgewotCQl0aGlzLm5hbWUgPSBuYW1lOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG5hbWUuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIGEgbmV3IGFyZWEgdG8gdGhlIG1hcC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRBcmVhKEhUTUxBcmVhIGFyZWEpIHsKLQkJaWYgKGFyZWEgIT0gbnVsbCkgewotCQkJYXJlYXMuYWRkKGFyZWEpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhbiBpdGVyYXRvciB0byBpdGVyYXRlIHRoZSBhcmVhcy4KLQkgKi8KLQlwdWJsaWMgSXRlcmF0b3IgZ2V0QXJlYXMoKSB7Ci0JCXJldHVybiBhcmVhcy5pdGVyYXRvcigpOwotCX0KLQotCXB1YmxpYyBpbnQgc2l6ZSgpIHsKLQkJcmV0dXJuIGFyZWFzLnNpemUoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZGlhZ3JhbS9JQWN0aXZpdHlEaWFncmFtU2VydmljZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9kaWFncmFtL0lBY3Rpdml0eURpYWdyYW1TZXJ2aWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyM2E1OTUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9kaWFncmFtL0lBY3Rpdml0eURpYWdyYW1TZXJ2aWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuZGlhZ3JhbTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuU3VwcHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLQotcHVibGljIGludGVyZmFjZSBJQWN0aXZpdHlEaWFncmFtU2VydmljZSB7Ci0KLQkvKioKLQkgKiBzYXZlIHRoZSBlbGVtZW50IGRpYWdyYW0gaW1hZ2UgYW5kIHJldHVybnMgdGhlIGltYWdlIGZpbGUgdXJsLgotCSAqIAotCSAqIEBwYXJhbSB3cmFwZXIgT2JqZWN0IHRoZSBpdGVtIHByb3ZpZGVyIHdyYXBwZXIgb2YgdGhlIGFjdGl2aXR5IGVsZW1lbnQKLQkgKiBAcGFyYW0gaW1nUGF0aCBTdHJpbmcgdGhlIGdlbmVyYXRlZCBpbWFnZSBwYXRoIHJlbGF0aXZlIHRvIHRoZSBwdWJsaXNoaW5nIGRpci4KLQkgKiBAcGFyYW0gZGlhZ3JhbVR5cGUKLQkgKiBAcGFyYW0gZmlsdGVyCi0JICogICAgICAgICAgICBJRmlsdGVyCi0JICogQHBhcmFtIHN1cAotCSAqICAgICAgICAgICAgU3VwcHJlc3Npb24KLQkgKiBAcmV0dXJuIERpYWdyYW1JbmZvIHRoZSBkaWFncmFtIGluZm8KLQkgKi8KLQlwdWJsaWMgRGlhZ3JhbUluZm8gc2F2ZURpYWdyYW0oT2JqZWN0IHdyYXBlciwgU3RyaW5nIGltZ1BhdGgsIFN0cmluZyBkaWFncmFtVHlwZSwKLQkJCUlGaWx0ZXIgZmlsdGVyLCBTdXBwcmVzc2lvbiBzdXApOwotCQotCQotCXB1YmxpYyBBY3Rpdml0eSBnZXRSZWFsaXplZEZvclVubW9kaWZpZWQoT2JqZWN0IHdyYXBwZXIsIElGaWx0ZXIgZmlsdGVyLCAKLQkJCVN1cHByZXNzaW9uIHN1cHByZXNzaW9uKTsKLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9kaWFncmFtL01ldGhvZEVsZW1lbnREaWFncmFtLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L2RpYWdyYW0vTWV0aG9kRWxlbWVudERpYWdyYW0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWU5ZDVhNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L2RpYWdyYW0vTWV0aG9kRWxlbWVudERpYWdyYW0uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuZGlhZ3JhbTsKLQotaW1wb3J0IGphdmEuYXd0LlJlY3RhbmdsZTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLlN0clV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LnV0aWwuWG1sRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci0KLQotLyoqCi0gKiBFbmNhcHN1bGF0ZXMgYSBwdWJsaXNoZWQgZGlhZ3JhbSBmb3IgYSA8Y29kZT5NZXRob2RFbGVtZW50PC9jb2RlPi4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTWV0aG9kRWxlbWVudERpYWdyYW0gewotCi0JLy8gVGhlIE1ldGhvZEVsZW1lbnQuCi0JcHJpdmF0ZSBNZXRob2RFbGVtZW50IGVsZW1lbnQ7Ci0KLQkvLyBUaGUgZ2VuZXJhdGVkIEpQRUcgZmlsZSBuYW1lLgotCXByaXZhdGUgU3RyaW5nIGltYWdlRmlsZU5hbWU7Ci0KLQkvLyBUaGUgSFRNTCBBcmVhIE1hcC4KLQlwcml2YXRlIEhUTUxNYXAgaHRtbE1hcDsKLQotCS8vIFRoZSBIVE1MIHRoYXQgcmVwcmVzZW50cyB0aGlzIGRpYWdyYW0uCi0JLy8gcHJpdmF0ZSBTdHJpbmcgZGlhZ3JhbUhUTUw7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlJvbGVEaWFncmFtSW5mbzwvY29kZT4uCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiAgICAgICAgICAgIFRoZSA8Y29kZT5Db250ZW50RWxlbWVudDwvY29kZT4uCi0JICovCi0JcHVibGljIE1ldGhvZEVsZW1lbnREaWFncmFtKE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgewotCQl0aGlzLmVsZW1lbnQgPSBlbGVtZW50OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIDxjb2RlPk1ldGhvZEVsZW1lbnQ8L2NvZGU+IGFzc29jaWF0ZWQgd2l0aCB0aGUgcHVibGlzaGVkCi0JICogZGlhZ3JhbS4KLQkgKiAKLQkgKiBAcmV0dXJuIFRoZSA8Y29kZT5NZXRob2RFbGVtZW50PC9jb2RlPiBhc3NvY2lhdGVkIHdpdGggdGhlIHB1Ymxpc2hlZAotCSAqICAgICAgICAgZGlhZ3JhbS4KLQkgKi8KLQlwdWJsaWMgTWV0aG9kRWxlbWVudCBnZXRNZXRob2RFbGVtZW50KCkgewotCQlyZXR1cm4gZWxlbWVudDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBpbWFnZSBmaWxlIG5hbWUuCi0JICogCi0JICogQHJldHVybiBUaGUgaW1hZ2UgZmlsZSBuYW1lLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SW1hZ2VGaWxlTmFtZSgpIHsKLQkJcmV0dXJuIGltYWdlRmlsZU5hbWU7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgaW1hZ2UgZmlsZSBuYW1lLgotCSAqIAotCSAqIEBwYXJhbSBpbWFnZUZpbGVOYW1lCi0JICogICAgICAgICAgICBUaGUgaW1hZ2UgZmlsZSBuYW1lLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEltYWdlRmlsZU5hbWUoU3RyaW5nIGltYWdlRmlsZU5hbWUpIHsKLQkJdGhpcy5pbWFnZUZpbGVOYW1lID0gaW1hZ2VGaWxlTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBIVE1MIEFyZWEgTWFwLgotCSAqIAotCSAqIEByZXR1cm4gVGhlIEhUTUwgQXJlYSBNYXAuCi0JICovCi0JcHVibGljIEhUTUxNYXAgZ2V0SFRNTE1hcCgpIHsKLQkJcmV0dXJuIGh0bWxNYXA7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgSFRNTCBBcmVhIE1hcC4KLQkgKiAKLQkgKiBAcGFyYW0gaHRtbE1hcAotCSAqICAgICAgICAgICAgVGhlIEhUTUwgQXJlYSBNYXAuCi0JICovCi0JcHVibGljIHZvaWQgc2V0SFRNTE1hcChIVE1MTWFwIGh0bWxNYXApIHsKLQkJdGhpcy5odG1sTWFwID0gaHRtbE1hcDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBIVE1MIHJlcHJlc2VudGF0aW9uIGZvciB0aGUgZGlhZ3JhbS4KLQkgKiAKLQkgKiBAcmV0dXJuIFRoZSBIVE1MIHNvdXJjZSB0aGF0IHJlcHJlc2VudHMgdGhlIGRpYWdyYW0uCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRIVE1MKCkgewotCQlTdHJpbmdCdWZmZXIgaHRtbCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJaHRtbC5hcHBlbmQoIjxwPiIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChpbWFnZUZpbGVOYW1lICE9IG51bGwgJiYgaHRtbE1hcCAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgbWFwTmFtZSA9IGh0bWxNYXAuZ2V0TmFtZSgpOwotCQkJaHRtbC5hcHBlbmQoIjxtYXAgbmFtZT1cIiIpLmFwcGVuZChodG1sTWFwLmdldE5hbWUoKSkuYXBwZW5kKCJcIj4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlJdGVyYXRvciBhcmVhcyA9IGh0bWxNYXAuZ2V0QXJlYXMoKTsKLQkJCXdoaWxlIChhcmVhcy5oYXNOZXh0KCkpIHsKLQkJCQlIVE1MQXJlYSBodG1sQXJlYSA9IChIVE1MQXJlYSkgYXJlYXMubmV4dCgpOwotCQkJCVJlY3RhbmdsZSBjb29yZHMgPSBodG1sQXJlYS5nZXRDb29yZGluYXRlcygpOwotCQkJCWh0bWwKLQkJCQkJCS5hcHBlbmQoIjxhcmVhIGhyZWY9XCIiKS5hcHBlbmQoaHRtbEFyZWEuZ2V0SHJlZigpKS5hcHBlbmQoIlwiIikgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQkuYXBwZW5kKCIgc2hhcGU9XCIiKS5hcHBlbmQoaHRtbEFyZWEuZ2V0U2hhcGUoKSkuYXBwZW5kKCJcIiIpIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJLmFwcGVuZCgiIGNvb3Jkcz1cIiIpIC8vJE5PTi1OTFMtMSQKLQkJCQkJCS5hcHBlbmQoKGludCkgY29vcmRzLmdldFgoKSkKLQkJCQkJCS5hcHBlbmQoIiwgIikgLy8kTk9OLU5MUy0xJAotCQkJCQkJLmFwcGVuZCgoaW50KSBjb29yZHMuZ2V0WSgpKQotCQkJCQkJLmFwcGVuZCgiLCAiKSAvLyROT04tTkxTLTEkCi0JCQkJCQkuYXBwZW5kKChpbnQpIChjb29yZHMuZ2V0WCgpICsgY29vcmRzLmdldFdpZHRoKCkpKQotCQkJCQkJLmFwcGVuZCgiLCAiKSAvLyROT04tTkxTLTEkCi0JCQkJCQkuYXBwZW5kKChpbnQpIChjb29yZHMuZ2V0WSgpICsgY29vcmRzLmdldEhlaWdodCgpKSkKLQkJCQkJCS5hcHBlbmQoIlwiIikgLy8kTk9OLU5MUy0xJAotCQkJCQkJLmFwcGVuZCgiIGFsdD1cIiIpLmFwcGVuZChodG1sQXJlYS5nZXRBbHRUYWcoKSkuYXBwZW5kKCJcIiIpIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJLmFwcGVuZCgiIHRpdGxlPVwiIikuYXBwZW5kKGh0bWxBcmVhLmdldEFsdFRhZygpKS5hcHBlbmQoIlwiIikgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQkuYXBwZW5kKCIvPiIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlodG1sLmFwcGVuZCgiPC9tYXA+Iik7IC8vJE5PTi1OTFMtMSQKLQkJCWh0bWwKLQkJCQkJLmFwcGVuZCgiPGltZyBib3JkZXI9XCIwXCIgc3JjPVwiIikuYXBwZW5kKGltYWdlRmlsZU5hbWUpLmFwcGVuZCgiXCIiKSAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJLmFwcGVuZCgiIGFsdD1cIiIpLmFwcGVuZChtYXBOYW1lKS5hcHBlbmQoIlwiIikgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCS5hcHBlbmQoIiB0aXRsZT1cIiIpLmFwcGVuZChtYXBOYW1lKS5hcHBlbmQoIlwiIikgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCS5hcHBlbmQoIiB1c2VtYXA9XCIjIikuYXBwZW5kKG1hcE5hbWUpLmFwcGVuZCgiXCIvPiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCQlodG1sLmFwcGVuZCgiPC9wPiIpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBodG1sLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogZ2V0IHRoZSB4bWwgZWxlbWVudCBmb3IgdGhlIGRpYWdyYW0KLQkgKiBAcmV0dXJuIFhtbEVsZW1lbnQKLQkgKi8KLQlwdWJsaWMgWG1sRWxlbWVudCBnZXRYbWxFbGVtZW50KCkKLQl7Ci0JCVhtbEVsZW1lbnQgeG1sRWxlbWVudCA9IG51bGw7Ci0KLQkJaWYgKGltYWdlRmlsZU5hbWUgIT0gbnVsbCAmJiBodG1sTWFwICE9IG51bGwpIHsKLQkJCVN0cmluZyBtYXBOYW1lID0gaHRtbE1hcC5nZXROYW1lKCk7Ci0JCQlTdHJpbmcgZXNjYXBlZE5hbWUgPSBTdHJVdGlsLnRvRXNjYXBlZFVuaWNvZGUobWFwTmFtZSwgdHJ1ZSkucmVwbGFjZSgiXFx1IiwgIiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCXhtbEVsZW1lbnQgPSBuZXcgWG1sRWxlbWVudCgibWFwIikgLy8kTk9OLU5MUy0xJAotCQkJCS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCBlc2NhcGVkTmFtZSkgIC8vJE5PTi1OTFMtMSQgCi0JCQkJLnNldEF0dHJpYnV0ZSgic3JjIiwgaW1hZ2VGaWxlTmFtZSkgLy8kTk9OLU5MUy0xJCAKLQkJCQkuc2V0QXR0cmlidXRlKCJhbHQiLCBtYXBOYW1lKTsgIC8vJE5PTi1OTFMtMSQgCi0JCQkKLQkJCUl0ZXJhdG9yIGFyZWFzID0gaHRtbE1hcC5nZXRBcmVhcygpOwotCQkJd2hpbGUgKGFyZWFzLmhhc05leHQoKSkgewotCQkJCUhUTUxBcmVhIGh0bWxBcmVhID0gKEhUTUxBcmVhKSBhcmVhcy5uZXh0KCk7Ci0JCQkJUmVjdGFuZ2xlIGNvb3JkcyA9IGh0bWxBcmVhLmdldENvb3JkaW5hdGVzKCk7Ci0JCQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCQlidWZmZXIuYXBwZW5kKChpbnQpIGNvb3Jkcy5nZXRYKCkpCi0JCQkJLmFwcGVuZCgiLCAiKSAvLyROT04tTkxTLTEkCi0JCQkJLmFwcGVuZCgoaW50KSBjb29yZHMuZ2V0WSgpKQotCQkJCS5hcHBlbmQoIiwgIikgLy8kTk9OLU5MUy0xJAotCQkJCS5hcHBlbmQoKGludCkgKGNvb3Jkcy5nZXRYKCkgKyBjb29yZHMuZ2V0V2lkdGgoKSkpCi0JCQkJLmFwcGVuZCgiLCAiKSAvLyROT04tTkxTLTEkCi0JCQkJLmFwcGVuZCgoaW50KSAoY29vcmRzLmdldFkoKSArIGNvb3Jkcy5nZXRIZWlnaHQoKSkpOwotCQkJCQotCQkJCS8vIG5lZWQgdG8gZXNjYXBlIHRoZSB1cmwgc2luY2UgaXQgd2lsbCBiZSBwYXNzZWQgYXMgYSBsaXRlcmFsIHN0cmluZyB0byBhIGphdmFzY3JpcHQgdmFyaWFibGUKLQkJCQl4bWxFbGVtZW50Lm5ld0NoaWxkKCJhcmVhIikgLy8kTk9OLU5MUy0xJAotCQkJCQkuc2V0QXR0cmlidXRlKCJndWlkIiwgKGh0bWxBcmVhLmdldEd1aWQoKSA9PSBudWxsKSA/ICIiIDogaHRtbEFyZWEuZ2V0R3VpZCgpICkgIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkuc2V0QXR0cmlidXRlKCJocmVmIiwgU3RyVXRpbC5lc2NhcGUoaHRtbEFyZWEuZ2V0SHJlZigpKSkJLy8kTk9OLU5MUy0xJAotCQkJCQkuc2V0QXR0cmlidXRlKCJzaGFwZSIsIGh0bWxBcmVhLmdldFNoYXBlKCkpCS8vJE5PTi1OTFMtMSQKLQkJCQkJLnNldEF0dHJpYnV0ZSgiY29vcmRzIiwgYnVmZmVyLnRvU3RyaW5nKCkpCS8vJE5PTi1OTFMtMSQKLQkJCQkJLnNldEF0dHJpYnV0ZSgiYWx0IiwgaHRtbEFyZWEuZ2V0QWx0VGFnKCkpOwkvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiB4bWxFbGVtZW50OwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZGlhZ3JhbS9Sb2xlRGlhZ3JhbVB1Ymxpc2hlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9kaWFncmFtL1JvbGVEaWFncmFtUHVibGlzaGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4ZTQwNTcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9kaWFncmFtL1JvbGVEaWFncmFtUHVibGlzaGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OTIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LmRpYWdyYW07Ci0KLWltcG9ydCBqYXZhLmF3dC5CYXNpY1N0cm9rZTsKLWltcG9ydCBqYXZhLmF3dC5Db2xvcjsKLWltcG9ydCBqYXZhLmF3dC5Gb250OwotaW1wb3J0IGphdmEuYXd0LkdyYXBoaWNzMkQ7Ci1pbXBvcnQgamF2YS5hd3QuUG9pbnQ7Ci1pbXBvcnQgamF2YS5hd3QuUmVjdGFuZ2xlOwotaW1wb3J0IGphdmEuYXd0LlJlbmRlcmluZ0hpbnRzOwotaW1wb3J0IGphdmEuYXd0LlRleHR1cmVQYWludDsKLWltcG9ydCBqYXZhLmF3dC5nZW9tLkxpbmUyRDsKLWltcG9ydCBqYXZhLmF3dC5pbWFnZS5CdWZmZXJlZEltYWdlOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqYXZheC5pbWFnZWlvLkltYWdlSU87Ci1pbXBvcnQgamF2YXguc3dpbmcuSlBhbmVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuSTE4blV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5JbWFnZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5JRWxlbWVudExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuZWxlbWVudHMuUm9sZUxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wcmVmZXJlbmNlcy5MaWJyYXJ5UHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFzazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci0KLS8qKgotICogUmVuZGVycyB0aGUgUm9sZSBkaWFncmFtIHVzaW5nIEphdmEyRCBhbmQgc2F2ZXMgaXQgYXMgYSBKUEVHIGZpbGUuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFJvbGVEaWFncmFtUHVibGlzaGVyIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0ZPTlRfTkFNRSA9ICJBcmlhbCI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX0ZPTlRfU0laRSA9IDEwOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfWF9NQVJHSU4gPSAyMDA7Ci0KLQkvLyBUaGUgbWF4aW11bSB3aWR0aCBvZiB0aGUgZ2VuZXJhdGVkIGltYWdlLgotCXByaXZhdGUgaW50IG1heEltYWdlV2lkdGggPSAxMDI0OwotCi0JLy8gVGhlIG1heGltdW0gaGVpZ2h0IG9mIHRoZSBnZW5lcmF0ZWQgaW1hZ2UuCi0JcHJpdmF0ZSBpbnQgbWF4SW1hZ2VIZWlnaHQgPSAxMDI0OwotCi0JLy8gVGhlIGJvcmRlciB3aWR0aC4KLQlwcml2YXRlIGludCBib3JkZXJXaWR0aCA9IDEwOwotCi0JLy8gVGhlIGJvcmRlciBoZWlnaHQuCi0JcHJpdmF0ZSBpbnQgYm9yZGVySGVpZ2h0ID0gMTA7Ci0KLQkvLyBUaGUgYWRkaXRpb25hbCBzcGFjaW5nIGJlZm9yZSB0aGUgbGVmdC1tb3N0IFRhc2sgYW5kL29yIFdvcmsgUHJvZHVjdAotCS8vIGltYWdlLgotCXByaXZhdGUgaW50IHhNYXJnaW4gPSAyNDA7Ci0KLQkvLyBUaGUgaG9yaXpvbnRhbCBzcGFjaW5nIGJldHdlZW4gdGhlIGVsZW1lbnQgaW1hZ2VzLgotCXByaXZhdGUgaW50IHhTcGFjaW5nOwotCi0JLy8gVGhlIHZlcnRpY2FsIHNwYWNpbmcgYmV0d2VlbiB0aGUgZWxlbWVudCBpbWFnZXMuCi0JcHJpdmF0ZSBpbnQgeVNwYWNpbmc7Ci0KLQkvLyBUaGUgbWF4aW11biBudW1iZXIgb2YgdGV4dCBsaW5lcyBmb3IgdGhlIGVsZW1lbnQgbGFiZWxzLgotCXByaXZhdGUgaW50IG1heFRleHRMaW5lczsKLQotCXByaXZhdGUgaW50IGxpbmVQYWRkaW5nID0gMTI7Ci0KLQlwcml2YXRlIEZvbnQgdGV4dEZvbnQgPSBudWxsOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5JbWFnZVB1Ymxpc2hlcjwvY29kZT4uCi0JICovCi0JcHVibGljIFJvbGVEaWFncmFtUHVibGlzaGVyKCkgewotCQkvLyBTZWxlY3QgdGhlIGZvbnQgZm9yIHJlbmRlcmluZyB0aGUgZWxlbWVudCBuYW1lcy4KLQkJU3RyaW5nIGZvbnROYW1lOwotCQlpbnQgZm9udFNpemU7Ci0JCWZvbnROYW1lID0gZ2V0Rm9udE5hbWUoKTsKLQkJaWYgKFNXVC5nZXRQbGF0Zm9ybSgpLmVxdWFscyhQbGF0Zm9ybS5XU19XSU4zMikpIHsKLQkJCWZvbnRTaXplID0gSTE4blV0aWwuZ2V0SW50KAotCQkJCQlMaWJyYXJ5UmVzb3VyY2VzLnJvbGVEaWFncmFtRm9udF9zaXplX3dpbjMyLAotCQkJCQlERUZBVUxUX0ZPTlRfU0laRSk7Ci0JCX0gZWxzZSB7Ci0JCQlmb250U2l6ZSA9IEkxOG5VdGlsLmdldEludChMaWJyYXJ5UmVzb3VyY2VzLnJvbGVEaWFncmFtRm9udF9zaXplLAotCQkJCQlERUZBVUxUX0ZPTlRfU0laRSk7Ci0JCX0KLQkJaWYgKGZvbnROYW1lLnN0YXJ0c1dpdGgoIlsiKSkgeyAvLyROT04tTkxTLTEkCi0JCQlmb250TmFtZSA9IERFRkFVTFRfRk9OVF9OQU1FOwotCQl9Ci0JCXRleHRGb250ID0gbmV3IEZvbnQoZm9udE5hbWUsIEZvbnQuUExBSU4sIGZvbnRTaXplKTsKLQotCQl4TWFyZ2luID0gSTE4blV0aWwuZ2V0SW50KExpYnJhcnlSZXNvdXJjZXMucm9sZURpYWdyYW1feE1hcmdpbiwKLQkJCQlERUZBVUxUX1hfTUFSR0lOKTsKLQotCQl4U3BhY2luZyA9IExpYnJhcnlQcmVmZXJlbmNlcy5nZXRSb2xlRGlhZ3JhbUhvcml6b250YWxTcGFjaW5nKCk7Ci0JCXlTcGFjaW5nID0gTGlicmFyeVByZWZlcmVuY2VzLmdldFJvbGVEaWFncmFtVmVydGljYWxTcGFjaW5nKCk7Ci0JCW1heFRleHRMaW5lcyA9IExpYnJhcnlQcmVmZXJlbmNlcy5nZXRSb2xlRGlhZ3JhbU1heGltdW1UZXh0TGluZXMoKTsKLQl9Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0Rm9udE5hbWUoKSB7Ci0JCVN0cmluZyBmb250TmFtZTsKLQkJaWYgKFBsYXRmb3JtLmdldE5MKCkuc3RhcnRzV2l0aCgiamEiKSkgeyAvLyROT04tTkxTLTEkCi0JCQlpZiAoU1dULmdldFBsYXRmb3JtKCkuZXF1YWxzKFBsYXRmb3JtLldTX1dJTjMyKSkgewotCQkJCWZvbnROYW1lID0gTGlicmFyeVJlc291cmNlcy5yb2xlRGlhZ3JhbUZvbnRfbmFtZV93aW4zMl9qYTsKLQkJCX0gZWxzZSB7Ci0JCQkJZm9udE5hbWUgPSBMaWJyYXJ5UmVzb3VyY2VzLnJvbGVEaWFncmFtRm9udF9uYW1lX2phOwotCQkJfQotCQl9IGVsc2UgaWYgKFBsYXRmb3JtLmdldE5MKCkuc3RhcnRzV2l0aCgia28iKSkgeyAvLyROT04tTkxTLTEkCi0JCQlpZiAoU1dULmdldFBsYXRmb3JtKCkuZXF1YWxzKFBsYXRmb3JtLldTX1dJTjMyKSkgewotCQkJCWZvbnROYW1lID0gTGlicmFyeVJlc291cmNlcy5yb2xlRGlhZ3JhbUZvbnRfbmFtZV93aW4zMl9rbzsKLQkJCX0gZWxzZSB7Ci0JCQkJZm9udE5hbWUgPSBMaWJyYXJ5UmVzb3VyY2VzLnJvbGVEaWFncmFtRm9udF9uYW1lX2tvOwotCQkJfQotCQl9IGVsc2UgaWYgKFBsYXRmb3JtLmdldE5MKCkuc3RhcnRzV2l0aCgiemhfVFciKSkgeyAvLyROT04tTkxTLTEkCi0JCQlpZiAoU1dULmdldFBsYXRmb3JtKCkuZXF1YWxzKFBsYXRmb3JtLldTX1dJTjMyKSkgewotCQkJCWZvbnROYW1lID0gTGlicmFyeVJlc291cmNlcy5yb2xlRGlhZ3JhbUZvbnRfbmFtZV93aW4zMl96aF9UVzsKLQkJCX0gZWxzZSB7Ci0JCQkJZm9udE5hbWUgPSBMaWJyYXJ5UmVzb3VyY2VzLnJvbGVEaWFncmFtRm9udF9uYW1lX3poX1RXOwotCQkJfQotCQl9IGVsc2UgaWYgKFBsYXRmb3JtLmdldE5MKCkuc3RhcnRzV2l0aCgiemgiKSkgeyAvLyROT04tTkxTLTEkCi0JCQlpZiAoU1dULmdldFBsYXRmb3JtKCkuZXF1YWxzKFBsYXRmb3JtLldTX1dJTjMyKSkgewotCQkJCWZvbnROYW1lID0gTGlicmFyeVJlc291cmNlcy5yb2xlRGlhZ3JhbUZvbnRfbmFtZV93aW4zMl96aDsKLQkJCX0gZWxzZSB7Ci0JCQkJZm9udE5hbWUgPSBMaWJyYXJ5UmVzb3VyY2VzLnJvbGVEaWFncmFtRm9udF9uYW1lX3poOwotCQkJfQotCQl9IGVsc2UgewotCQkJaWYgKFNXVC5nZXRQbGF0Zm9ybSgpLmVxdWFscyhQbGF0Zm9ybS5XU19XSU4zMikpIHsKLQkJCQlmb250TmFtZSA9IExpYnJhcnlSZXNvdXJjZXMucm9sZURpYWdyYW1Gb250X25hbWVfd2luMzI7Ci0JCQl9IGVsc2UgewotCQkJCWZvbnROYW1lID0gTGlicmFyeVJlc291cmNlcy5yb2xlRGlhZ3JhbUZvbnRfbmFtZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZm9udE5hbWU7Ci0KLQl9Ci0KLQkvKioKLQkgKiBHZW5lcmF0ZXMgdGhlIFJvbGUgRGlhZ3JhbSBIVE1MIHNvdXJjZSBmb3IgdGhlIGdpdmVuIHJvbGUuCi0JICogCi0JICogQHBhcmFtIHJvbGUKLQkgKiAgICAgICAgICAgIFRoZSBSb2xlIGVsZW1lbnQuCi0JICogQHBhcmFtIHBhdGgKLQkgKiAgICAgICAgICAgIFRoZSBwdWJsaXNoIHBhdGguCi0JICogQHJldHVybiBBIDxjb2RlPk1ldGhvZEVsZW1lbnREaWFncmFtPC9jb2RlPiBvYmplY3QgYXNzb2NpYXRlZCB3aXRoIHRoZQotCSAqICAgICAgICAgcHVibGlzaGVkIGRpYWdyYW0uCi0JICovCi0JcHVibGljIE1ldGhvZEVsZW1lbnREaWFncmFtIHB1Ymxpc2goUm9sZUxheW91dCByb2xlTGF5b3V0LCBGaWxlIHBhdGgpIHsKLQotCQlSb2xlIHJvbGUgPSAoUm9sZSkgcm9sZUxheW91dC5nZXRFbGVtZW50KCk7Ci0KLQkJaWYgKHJvbGUgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotCQl9Ci0KLQkJdHJ5IHsKLQkJCU1ldGhvZEVsZW1lbnREaWFncmFtIGVsZW1lbnREaWFncmFtID0gbmV3IE1ldGhvZEVsZW1lbnREaWFncmFtKHJvbGUpOwotCi0JCQlTdHJpbmcgcHVibGlzaERpciA9IHJvbGVMYXlvdXQuZ2V0TGF5b3V0TWdyKCkuZ2V0UHVibGlzaERpcigpOwotCQkJU3RyaW5nIG1hcE5hbWUgPSByb2xlTGF5b3V0LmdldERpc3BsYXlOYW1lKCk7Ci0JCQlpZiAobWFwTmFtZSA9PSBudWxsIHx8IG1hcE5hbWUubGVuZ3RoKCkgPT0gMCkgewotCQkJCW1hcE5hbWUgPSAiVW5rbm93biI7IC8vJE5PTi1OTFMtMSQKLQkJCX0gZWxzZSB7Ci0JCQkJbWFwTmFtZSA9IG1hcE5hbWUucmVwbGFjZSgnICcsICdfJyk7Ci0JCQl9Ci0JCQlIVE1MTWFwIGh0bWxNYXAgPSBuZXcgSFRNTE1hcChtYXBOYW1lKTsKLQkJCWVsZW1lbnREaWFncmFtLnNldEhUTUxNYXAoaHRtbE1hcCk7Ci0KLQkJCS8vIENyZWF0ZSB0aGUgQVdUIEpQYW5lbCBmb3IgcmVuZGVyaW5nIHRoZSBkaWFncmFtLgotCQkJSlBhbmVsIHBhbmVsID0gbmV3IEpQYW5lbCgpOwotCi0JCQkvLyBDcmVhdGUgdGhlIG91dHB1dCBCdWZmZXJlZEltYWdlLgotCQkJQnVmZmVyZWRJbWFnZSBvdXRwdXRJbWFnZSA9IG5ldyBCdWZmZXJlZEltYWdlKG1heEltYWdlV2lkdGgsCi0JCQkJCW1heEltYWdlSGVpZ2h0LCBCdWZmZXJlZEltYWdlLlRZUEVfSU5UX1JHQik7Ci0JCQlHcmFwaGljczJEIGcyZCA9IChHcmFwaGljczJEKSBvdXRwdXRJbWFnZS5nZXRHcmFwaGljcygpOwotCi0JCQkvLyBTd2l0Y2ggb24gYW50aS1hbGlhc2luZy4KLQkJCWcyZC5zZXRSZW5kZXJpbmdIaW50KFJlbmRlcmluZ0hpbnRzLktFWV9URVhUX0FOVElBTElBU0lORywKLQkJCQkJUmVuZGVyaW5nSGludHMuVkFMVUVfVEVYVF9BTlRJQUxJQVNfT04pOwotCQkJZzJkLnNldFJlbmRlcmluZ0hpbnQoUmVuZGVyaW5nSGludHMuS0VZX0FOVElBTElBU0lORywKLQkJCQkJUmVuZGVyaW5nSGludHMuVkFMVUVfQU5USUFMSUFTX09OKTsKLQkJCWcyZC5maWxsUmVjdCgwLCAwLCBtYXhJbWFnZVdpZHRoLCBtYXhJbWFnZUhlaWdodCk7Ci0KLQkJCS8vIFNldCB0aGUgc3Ryb2tlIGZvciBkcmF3aW5nIHRoZSBhc3NvY2lhdGlvbiBsaW5lcy4KLQkJCWcyZC5zZXRTdHJva2UobmV3IEJhc2ljU3Ryb2tlKDEuMjVmKSk7Ci0JCQlnMmQuc2V0Q29sb3IoQ29sb3IuQkxBQ0spOwotCi0JCQlpbnQgeE9mZnNldCA9IHhTcGFjaW5nIC8gMjsKLQotCQkJLy8gUmVuZGVycyB0aGUgVGFza3MgcGVyZm9ybWVkIGJ5IHRoZSBSb2xlLgotCQkJTGlzdCB0YXNrcyA9IHJvbGVMYXlvdXQuZ2V0UGVyZm9ybXMoKTsKLQkJCWludCB0b3RhbFRhc2tzID0gdGFza3MgIT0gbnVsbCA/IHRhc2tzLnNpemUoKSA6IDA7Ci0JCQlQb2ludCB0YXNrU3RhcnRQb2ludCA9IG5ldyBQb2ludChib3JkZXJXaWR0aCArIHhNYXJnaW4sCi0JCQkJCWJvcmRlckhlaWdodCk7Ci0JCQlQb2ludCB0YXNrRW5kUG9pbnQgPSBuZXcgUG9pbnQoYm9yZGVyV2lkdGggKyB4TWFyZ2luLCBib3JkZXJIZWlnaHQpOwotCQkJaW50IHggPSB0YXNrU3RhcnRQb2ludC54OwotCQkJaW50IHkgPSB0YXNrU3RhcnRQb2ludC55OwotCQkJaW50IHRhc2tzRW5kWCA9IDA7Ci0JCQlpZiAodG90YWxUYXNrcyA+IDApIHsKLQkJCQlpbnQgdGFza05vID0gMTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGkgPSB0YXNrcy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgdGFza05vKyspIHsKLQkJCQkJVGFzayB0YXNrID0gKFRhc2spIGkubmV4dCgpOwotCi0JCQkJCUlFbGVtZW50TGF5b3V0IHRhc2tMYXlvdXQgPSByb2xlTGF5b3V0LmdldExheW91dE1ncigpCi0JCQkJCQkJLmdldExheW91dCh0YXNrLCB0cnVlKTsKLQotCQkJCQlTdHJpbmcgdGFza05hbWUgPSB0YXNrTGF5b3V0LmdldERpc3BsYXlOYW1lKCk7Ci0JCQkJCVN0cmluZyBpbWFnZUZpbGUgPSBwdWJsaXNoRGlyCi0JCQkJCQkJKyB0YXNrTGF5b3V0LmdldERpYWdyYW1pY29uVXJsKCk7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlCdWZmZXJlZEltYWdlIHRhc2tJbWFnZSA9IEltYWdlVXRpbC5nZXRCdWZmZXJlZEltYWdlKAotCQkJCQkJCQlpbWFnZUZpbGUsIHBhbmVsKTsKLQkJCQkJCWludCB0YXNrV2lkdGggPSB0YXNrSW1hZ2UuZ2V0V2lkdGgoKTsKLQkJCQkJCWludCB0YXNrSGVpZ2h0ID0gdGFza0ltYWdlLmdldEhlaWdodCgpOwotCQkJCQkJaWYgKHRhc2tObyA9PSAxKSB7Ci0JCQkJCQkJdGFza0VuZFBvaW50LnggKz0gdGFza1dpZHRoOwotCQkJCQkJCXRhc2tFbmRQb2ludC55ICs9IHRhc2tIZWlnaHQ7Ci0JCQkJCQkJdGFza3NFbmRYID0gdGFza0VuZFBvaW50Lng7Ci0JCQkJCQl9Ci0JCQkJCQlSZWN0YW5nbGUgdGFza0ltYWdlUmVjdCA9IG5ldyBSZWN0YW5nbGUoeCwgeSwKLQkJCQkJCQkJdGFza1dpZHRoLCB0YXNrSGVpZ2h0KTsKLQkJCQkJCVRleHR1cmVQYWludCB0YXNrUGFpbnQgPSBuZXcgVGV4dHVyZVBhaW50KHRhc2tJbWFnZSwKLQkJCQkJCQkJdGFza0ltYWdlUmVjdCk7Ci0JCQkJCQlnMmQuc2V0UGFpbnQodGFza1BhaW50KTsKLQkJCQkJCWcyZC5maWxsKHRhc2tJbWFnZVJlY3QpOwotCQkJCQkJaWYgKHRhc2tOYW1lICE9IG51bGwpIHsKLQkJCQkJCQlJbWFnZVV0aWwuZHJhd1RleHQoZzJkLCB0YXNrTmFtZSwgdGV4dEZvbnQsCi0JCQkJCQkJCQlDb2xvci5CTEFDSywgeCAtIHhPZmZzZXQsIHRhc2tFbmRQb2ludC55LAotCQkJCQkJCQkJdGFza1dpZHRoICsgeFNwYWNpbmcsIG1heFRleHRMaW5lcyk7Ci0JCQkJCQl9Ci0KLQkJCQkJCVN0cmluZyBocmVmID0gdGFza0xheW91dC5nZXRGaWxlUGF0aChyb2xlTGF5b3V0KQotCQkJCQkJCQkrIHRhc2tMYXlvdXQuZ2V0RmlsZU5hbWUoIi5odG1sIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCUhUTUxBcmVhIGh0bWxBcmVhID0gbmV3IEhUTUxBcmVhKHRhc2suZ2V0R3VpZCgpLCBocmVmLAotCQkJCQkJCQkicmVjdCIsIHRhc2tJbWFnZVJlY3QsIHRhc2tOYW1lKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJaHRtbE1hcC5hZGRBcmVhKGh0bWxBcmVhKTsKLQotCQkJCQkJaWYgKHggKyB0YXNrV2lkdGggPiB0YXNrc0VuZFgpIHsKLQkJCQkJCQl0YXNrc0VuZFggPSB4ICsgdGFza1dpZHRoOwotCQkJCQkJfQotCi0JCQkJCQlpZiAoaS5oYXNOZXh0KCkpIHsKLQkJCQkJCQlpbnQgeEluY3JlbWVudCA9IHRhc2tXaWR0aCArIHhTcGFjaW5nOwotCQkJCQkJCXggKz0geEluY3JlbWVudDsKLQkJCQkJCQl0YXNrRW5kUG9pbnQueCArPSB4SW5jcmVtZW50OwotCQkJCQkJCWlmICgoeCArIHhJbmNyZW1lbnQgKyB4T2Zmc2V0ICsgYm9yZGVyV2lkdGgpID4gbWF4SW1hZ2VXaWR0aCkgewotCQkJCQkJCQl4ID0gdGFza1N0YXJ0UG9pbnQueDsKLQkJCQkJCQkJaW50IHlJbmNyZW1lbnQgPSB0YXNrSGVpZ2h0ICsgeVNwYWNpbmc7Ci0JCQkJCQkJCXkgKz0geUluY3JlbWVudDsKLQkJCQkJCQkJdGFza0VuZFBvaW50LnkgKz0geUluY3JlbWVudDsKLQkJCQkJCQkJdGFza0VuZFBvaW50LnggPSB0YXNrU3RhcnRQb2ludC54ICsgdGFza1dpZHRoOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCUxpYnJhcnlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQkvLyBSZW5kZXJzIHRoZSBXb3JrIFByb2R1Y3RzIHRoYXQgdGhlIFJvbGUgaXMgcmVzcG9uc2libGUgZm9yLgotCQkJTGlzdCB3b3JrUHJvZHVjdHMgPSByb2xlTGF5b3V0LmdldFJlc3BvbnNpYmxlRm9yKCk7Ci0JCQlpbnQgdG90YWxXb3JrUHJvZHVjdHMgPSB3b3JrUHJvZHVjdHMgIT0gbnVsbCA/IHdvcmtQcm9kdWN0cy5zaXplKCkKLQkJCQkJOiAwOwotCQkJUG9pbnQgd29ya1Byb2R1Y3RTdGFydFBvaW50ID0gbmV3IFBvaW50KHRhc2tTdGFydFBvaW50LngsCi0JCQkJCWJvcmRlckhlaWdodCk7Ci0JCQlQb2ludCB3b3JrUHJvZHVjdEVuZFBvaW50ID0gbmV3IFBvaW50KHRhc2tTdGFydFBvaW50LngsCi0JCQkJCWJvcmRlckhlaWdodCk7Ci0JCQlpZiAodG90YWxUYXNrcyA+IDAgJiYgdG90YWxXb3JrUHJvZHVjdHMgPiAwKSB7Ci0JCQkJd29ya1Byb2R1Y3RTdGFydFBvaW50LnkgPSB0YXNrRW5kUG9pbnQueSArIHlTcGFjaW5nICsgeVNwYWNpbmcKLQkJCQkJCS8gMjsKLQkJCQl3b3JrUHJvZHVjdEVuZFBvaW50LnkgPSB3b3JrUHJvZHVjdFN0YXJ0UG9pbnQueTsKLQkJCX0gZWxzZSBpZiAodG90YWxUYXNrcyA+IDApIHsKLQkJCQl3b3JrUHJvZHVjdEVuZFBvaW50LnkgPSB0YXNrRW5kUG9pbnQueSArIGJvcmRlckhlaWdodDsKLQkJCX0KLQkJCXggPSB3b3JrUHJvZHVjdFN0YXJ0UG9pbnQueDsKLQkJCXkgPSB3b3JrUHJvZHVjdFN0YXJ0UG9pbnQueTsKLQkJCWludCB3b3JrUHJvZHVjdHNFbmRYID0gMDsKLQkJCWlmICh0b3RhbFdvcmtQcm9kdWN0cyA+IDApIHsKLQkJCQlpbnQgd29ya1Byb2R1Y3RObyA9IDE7Ci0JCQkJZm9yIChJdGVyYXRvciBpID0gd29ya1Byb2R1Y3RzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyB3b3JrUHJvZHVjdE5vKyspIHsKLQkJCQkJV29ya1Byb2R1Y3Qgd29ya1Byb2R1Y3QgPSAoV29ya1Byb2R1Y3QpIGkubmV4dCgpOwotCi0JCQkJCUlFbGVtZW50TGF5b3V0IHdwTGF5b3V0ID0gcm9sZUxheW91dC5nZXRMYXlvdXRNZ3IoKQotCQkJCQkJCS5nZXRMYXlvdXQod29ya1Byb2R1Y3QsIHRydWUpOwotCi0JCQkJCVN0cmluZyB3b3JrUHJvZHVjdE5hbWUgPSB3cExheW91dC5nZXREaXNwbGF5TmFtZSgpOwotCQkJCQlTdHJpbmcgaW1hZ2VGaWxlID0gcHVibGlzaERpcgotCQkJCQkJCSsgd3BMYXlvdXQuZ2V0RGlhZ3JhbWljb25VcmwoKTsKLQkJCQkJdHJ5IHsKLQkJCQkJCUJ1ZmZlcmVkSW1hZ2Ugd29ya1Byb2R1Y3RJbWFnZSA9IEltYWdlVXRpbAotCQkJCQkJCQkuZ2V0QnVmZmVyZWRJbWFnZShpbWFnZUZpbGUsIHBhbmVsKTsKLQkJCQkJCWludCB3b3JrUHJvZHVjdFdpZHRoID0gd29ya1Byb2R1Y3RJbWFnZS5nZXRXaWR0aCgpOwotCQkJCQkJaW50IHdvcmtQcm9kdWN0SGVpZ2h0ID0gd29ya1Byb2R1Y3RJbWFnZS5nZXRIZWlnaHQoKTsKLQkJCQkJCWlmICh3b3JrUHJvZHVjdE5vID09IDEpIHsKLQkJCQkJCQl3b3JrUHJvZHVjdEVuZFBvaW50LnggKz0gd29ya1Byb2R1Y3RXaWR0aDsKLQkJCQkJCQl3b3JrUHJvZHVjdEVuZFBvaW50LnkgKz0gd29ya1Byb2R1Y3RIZWlnaHQ7Ci0JCQkJCQkJd29ya1Byb2R1Y3RzRW5kWCA9IHdvcmtQcm9kdWN0RW5kUG9pbnQueDsKLQkJCQkJCX0KLQkJCQkJCVJlY3RhbmdsZSB3b3JrUHJvZHVjdEltYWdlUmVjdCA9IG5ldyBSZWN0YW5nbGUoeCwgeSwKLQkJCQkJCQkJd29ya1Byb2R1Y3RXaWR0aCwgd29ya1Byb2R1Y3RIZWlnaHQpOwotCQkJCQkJVGV4dHVyZVBhaW50IHdvcmtQcm9kdWN0UGFpbnQgPSBuZXcgVGV4dHVyZVBhaW50KAotCQkJCQkJCQl3b3JrUHJvZHVjdEltYWdlLCB3b3JrUHJvZHVjdEltYWdlUmVjdCk7Ci0JCQkJCQlnMmQuc2V0UGFpbnQod29ya1Byb2R1Y3RQYWludCk7Ci0JCQkJCQlnMmQuZmlsbCh3b3JrUHJvZHVjdEltYWdlUmVjdCk7Ci0JCQkJCQlpZiAod29ya1Byb2R1Y3ROYW1lICE9IG51bGwpIHsKLQkJCQkJCQlJbWFnZVV0aWwuZHJhd1RleHQoZzJkLCB3b3JrUHJvZHVjdE5hbWUsIHRleHRGb250LAotCQkJCQkJCQkJQ29sb3IuQkxBQ0ssIHggLSB4T2Zmc2V0LAotCQkJCQkJCQkJd29ya1Byb2R1Y3RFbmRQb2ludC55LCB3b3JrUHJvZHVjdFdpZHRoCi0JCQkJCQkJCQkJCSsgeFNwYWNpbmcsIG1heFRleHRMaW5lcyk7Ci0JCQkJCQl9Ci0KLQkJCQkJCVN0cmluZyBocmVmID0gd3BMYXlvdXQuZ2V0RmlsZVBhdGgocm9sZUxheW91dCkKLQkJCQkJCQkJKyB3cExheW91dC5nZXRGaWxlTmFtZSgiLmh0bWwiKTsgLy8kTk9OLU5MUy0xJAotCi0JCQkJCQlIVE1MQXJlYSBodG1sQXJlYSA9IG5ldyBIVE1MQXJlYSh3b3JrUHJvZHVjdC5nZXRHdWlkKCksCi0JCQkJCQkJCWhyZWYsCi0JCQkJCQkJCSJyZWN0Iiwgd29ya1Byb2R1Y3RJbWFnZVJlY3QsIHdvcmtQcm9kdWN0TmFtZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCWh0bWxNYXAuYWRkQXJlYShodG1sQXJlYSk7Ci0KLQkJCQkJCWlmICh4ICsgd29ya1Byb2R1Y3RXaWR0aCA+IHdvcmtQcm9kdWN0c0VuZFgpIHsKLQkJCQkJCQl3b3JrUHJvZHVjdHNFbmRYID0geCArIHdvcmtQcm9kdWN0V2lkdGg7Ci0JCQkJCQl9Ci0KLQkJCQkJCWlmIChpLmhhc05leHQoKSkgewotCQkJCQkJCWludCB4SW5jcmVtZW50ID0gd29ya1Byb2R1Y3RXaWR0aCArIHhTcGFjaW5nOwotCQkJCQkJCXggKz0geEluY3JlbWVudDsKLQkJCQkJCQl3b3JrUHJvZHVjdEVuZFBvaW50LnggKz0geEluY3JlbWVudDsKLQkJCQkJCQlpZiAoKHggKyB4SW5jcmVtZW50ICsgeE9mZnNldCArIGJvcmRlcldpZHRoKSA+IG1heEltYWdlV2lkdGgpIHsKLQkJCQkJCQkJeCA9IHdvcmtQcm9kdWN0U3RhcnRQb2ludC54OwotCQkJCQkJCQlpbnQgeUluY3JlbWVudCA9IHdvcmtQcm9kdWN0SGVpZ2h0ICsgeVNwYWNpbmc7Ci0JCQkJCQkJCXkgKz0geUluY3JlbWVudDsKLQkJCQkJCQkJd29ya1Byb2R1Y3RFbmRQb2ludC55ICs9IHlJbmNyZW1lbnQ7Ci0JCQkJCQkJCXdvcmtQcm9kdWN0RW5kUG9pbnQueCA9IHdvcmtQcm9kdWN0U3RhcnRQb2ludC54Ci0JCQkJCQkJCQkJKyB3b3JrUHJvZHVjdFdpZHRoOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCUxpYnJhcnlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQkvLyBSZW5kZXIgdGhlIFJvbGUuCi0JCQlQb2ludCByb2xlU3RhcnRQb2ludCA9IG5ldyBQb2ludCh4T2Zmc2V0IC0gNSwgYm9yZGVySGVpZ2h0KTsKLQkJCVBvaW50IHJvbGVFbmRQb2ludCA9IHJvbGVTdGFydFBvaW50OwotCQkJdHJ5IHsKLQkJCQlTdHJpbmcgcm9sZU5hbWUgPSByb2xlTGF5b3V0LmdldERpc3BsYXlOYW1lKCk7Ci0JCQkJU3RyaW5nIGltYWdlRmlsZSA9IHB1Ymxpc2hEaXIgKyByb2xlTGF5b3V0LmdldERpYWdyYW1pY29uVXJsKCk7Ci0JCQkJQnVmZmVyZWRJbWFnZSByb2xlSW1hZ2UgPSBJbWFnZVV0aWwuZ2V0QnVmZmVyZWRJbWFnZShpbWFnZUZpbGUsCi0JCQkJCQlwYW5lbCk7Ci0JCQkJaW50IHJvbGVXaWR0aCA9IHJvbGVJbWFnZS5nZXRXaWR0aCgpOwotCQkJCWludCByb2xlSGVpZ2h0ID0gcm9sZUltYWdlLmdldEhlaWdodCgpOwotCQkJCXggPSB4T2Zmc2V0IC0gNTsKLQkJCQl5ID0gYm9yZGVySGVpZ2h0OwotCQkJCXJvbGVFbmRQb2ludC54ICs9IHJvbGVXaWR0aDsKLQkJCQlyb2xlRW5kUG9pbnQueSArPSByb2xlSGVpZ2h0OwotCQkJCWlmICh0b3RhbFdvcmtQcm9kdWN0cyA+IDApIHsKLQkJCQkJeSA9IGJvcmRlckhlaWdodAotCQkJCQkJCSsgKHdvcmtQcm9kdWN0RW5kUG9pbnQueSAtIHRhc2tTdGFydFBvaW50LnkgLSByb2xlSGVpZ2h0KQotCQkJCQkJCS8gMjsKLQotCQkJCQkvLyBSZW5kZXIgdGhlICJyZXNwb25zaWJsZSBmb3IiIGFzc29jaWF0aW9uIGxpbmUuCi0JCQkJCVBvaW50IHN0YXJ0UG9pbnQgPSBuZXcgUG9pbnQoeCArIHJvbGVXaWR0aCArIGxpbmVQYWRkaW5nCi0JCQkJCQkJLyAyLCB5ICsgcm9sZUhlaWdodCAvIDIpOwotCQkJCQlpbnQgbGluZUVuZFBvaW50ID0gd29ya1Byb2R1Y3RTdGFydFBvaW50LnggLSBsaW5lUGFkZGluZzsKLQkJCQkJaWYgKGxpbmVFbmRQb2ludCA+IChERUZBVUxUX1hfTUFSR0lOIC0geFNwYWNpbmcgLyAyKSkgewotCQkJCQkJbGluZUVuZFBvaW50ID0gKERFRkFVTFRfWF9NQVJHSU4gLSB4U3BhY2luZyAvIDIpOwotCQkJCQl9Ci0JCQkJCVBvaW50IGVuZFBvaW50ID0gbmV3IFBvaW50KHdvcmtQcm9kdWN0U3RhcnRQb2ludC54Ci0JCQkJCQkJLSBsaW5lUGFkZGluZywgd29ya1Byb2R1Y3RTdGFydFBvaW50LnkKLQkJCQkJCQkrICh3b3JrUHJvZHVjdEVuZFBvaW50LnkgLSB3b3JrUHJvZHVjdFN0YXJ0UG9pbnQueSkKLQkJCQkJCQkvIDIpOwotCQkJCQlyZW5kZXJBc3NvY2lhdGlvbihnMmQsIHN0YXJ0UG9pbnQsIGVuZFBvaW50LAotCQkJCQkJCUxpYnJhcnlSZXNvdXJjZXMucm9sZURpYWdyYW1SZXNwb25zaWJsZUZvcl90ZXh0LAotCQkJCQkJCXRleHRGb250LCBDb2xvci5CTEFDSyk7Ci0JCQkJfSBlbHNlIGlmICh0b3RhbFRhc2tzID4gMCkgewotCQkJCQl5ID0gYm9yZGVySGVpZ2h0Ci0JCQkJCQkJKyAodGFza0VuZFBvaW50LnkgLSB0YXNrU3RhcnRQb2ludC55IC0gcm9sZUhlaWdodCkKLQkJCQkJCQkvIDI7Ci0JCQkJfQotCQkJCXJvbGVTdGFydFBvaW50LnkgPSB5OwotCQkJCXJvbGVFbmRQb2ludC55ID0geSArIHJvbGVIZWlnaHQ7Ci0KLQkJCQlpZiAodG90YWxUYXNrcyA+IDApIHsKLQkJCQkJLy8gUmVuZGVyIHRoZSAicGVyZm9ybXMiIGFzc29jaWF0aW9uIGxpbmUuCi0JCQkJCVBvaW50IHN0YXJ0UG9pbnQgPSBuZXcgUG9pbnQoeCArIHJvbGVXaWR0aCArIGxpbmVQYWRkaW5nCi0JCQkJCQkJLyAyLCB5ICsgcm9sZUhlaWdodCAvIDIpOwotCQkJCQlpbnQgbGluZUVuZFBvaW50ID0gdGFza1N0YXJ0UG9pbnQueCAtIGxpbmVQYWRkaW5nOwotCQkJCQlpZiAobGluZUVuZFBvaW50ID4gKERFRkFVTFRfWF9NQVJHSU4gLSB4U3BhY2luZyAvIDIpKSB7Ci0JCQkJCQlsaW5lRW5kUG9pbnQgPSAoREVGQVVMVF9YX01BUkdJTiAtIHhTcGFjaW5nIC8gMik7Ci0JCQkJCX0KLQkJCQkJUG9pbnQgZW5kUG9pbnQgPSBuZXcgUG9pbnQobGluZUVuZFBvaW50LCBib3JkZXJIZWlnaHQKLQkJCQkJCQkrICh0YXNrRW5kUG9pbnQueSAtIHRhc2tTdGFydFBvaW50LnkpIC8gMik7Ci0JCQkJCXJlbmRlckFzc29jaWF0aW9uKGcyZCwgc3RhcnRQb2ludCwgZW5kUG9pbnQsCi0JCQkJCQkJTGlicmFyeVJlc291cmNlcy5yb2xlRGlhZ3JhbVBlcmZvcm1zX3RleHQsCi0JCQkJCQkJdGV4dEZvbnQsIENvbG9yLkJMQUNLKTsKLQkJCQl9Ci0JCQkJUmVjdGFuZ2xlIHJvbGVJbWFnZVJlY3QgPSBuZXcgUmVjdGFuZ2xlKHgsIHksIHJvbGVXaWR0aCwKLQkJCQkJCXJvbGVIZWlnaHQpOwotCQkJCVRleHR1cmVQYWludCByb2xlUGFpbnQgPSBuZXcgVGV4dHVyZVBhaW50KHJvbGVJbWFnZSwKLQkJCQkJCXJvbGVJbWFnZVJlY3QpOwotCQkJCWcyZC5zZXRQYWludChyb2xlUGFpbnQpOwotCQkJCWcyZC5maWxsKHJvbGVJbWFnZVJlY3QpOwotCQkJCWlmIChyb2xlTmFtZSAhPSBudWxsKSB7Ci0JCQkJCUltYWdlVXRpbC5kcmF3VGV4dChnMmQsIHJvbGVOYW1lLCB0ZXh0Rm9udCwgQ29sb3IuQkxBQ0ssIHgKLQkJCQkJCQktIHhPZmZzZXQsIHkgKyByb2xlSGVpZ2h0LCByb2xlV2lkdGggKyB4U3BhY2luZywKLQkJCQkJCQltYXhUZXh0TGluZXMpOwotCQkJCX0KLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQl9Ci0KLQkJCS8vIENhbGN1bGF0ZSB0aGUgb3B0aW1hbCB3aWR0aCBhbmQgaGVpZ2h0IGZvciB0aGUgcmVuZGVyZWQgaW1hZ2UuCi0JCQlpbnQgb3B0aW1hbFdpZHRoID0gTWF0aC5tYXgodGFza3NFbmRYLCB3b3JrUHJvZHVjdHNFbmRYKQotCQkJCQkrIGJvcmRlcldpZHRoOwotCQkJb3B0aW1hbFdpZHRoID0gTWF0aC5tYXgob3B0aW1hbFdpZHRoLCByb2xlRW5kUG9pbnQueCArIGJvcmRlcldpZHRoKTsKLQotCQkJb3B0aW1hbFdpZHRoID0gTWF0aC5taW4ob3B0aW1hbFdpZHRoLCBtYXhJbWFnZVdpZHRoKTsKLQotCQkJaW50IG9wdGltYWxIZWlnaHQgPSB3b3JrUHJvZHVjdEVuZFBvaW50LnkgKyBib3JkZXJIZWlnaHQ7Ci0JCQlvcHRpbWFsSGVpZ2h0ID0gTWF0aC5tYXgob3B0aW1hbEhlaWdodCwgcm9sZUVuZFBvaW50LnkKLQkJCQkJKyBib3JkZXJIZWlnaHQpOwotCQkJb3B0aW1hbFdpZHRoICs9IHhPZmZzZXQ7Ci0JCQlvcHRpbWFsSGVpZ2h0ICs9IChtYXhUZXh0TGluZXMgKiAxMCk7Ci0KLQkJCW9wdGltYWxIZWlnaHQgPSBNYXRoLm1pbihvcHRpbWFsSGVpZ2h0LCBtYXhJbWFnZUhlaWdodCk7Ci0JCQlCdWZmZXJlZEltYWdlIG9wdGltYWxJbWFnZSA9IG91dHB1dEltYWdlLmdldFN1YmltYWdlKDAsIDAsCi0JCQkJCW9wdGltYWxXaWR0aCwgb3B0aW1hbEhlaWdodCk7Ci0KLQkJCS8vIFNhdmUgdGhlIGltYWdlIGFzIGEgSlBFRyBmaWxlLgotCQkJRmlsZSBqcGdGaWxlID0gbmV3IEZpbGUocGF0aCwgcm9sZUxheW91dC5nZXRGaWxlUGF0aCgpCi0JCQkJCSsgcm9sZUxheW91dC5nZXRGaWxlTmFtZSgiLmpwZyIpKTsgLy8kTk9OLU5MUy0xJAotCQkJRmlsZSBwYXJlbnRGb2xkZXIgPSBqcGdGaWxlLmdldFBhcmVudEZpbGUoKTsKLQkJCWlmICghcGFyZW50Rm9sZGVyLmV4aXN0cygpKSB7Ci0JCQkJcGFyZW50Rm9sZGVyLm1rZGlycygpOwotCQkJfQotCQkJSW1hZ2VJTy53cml0ZShvcHRpbWFsSW1hZ2UsICJqcGciLCBqcGdGaWxlKTsgLy8kTk9OLU5MUy0xJAotCQkJZWxlbWVudERpYWdyYW0uc2V0SW1hZ2VGaWxlTmFtZShqcGdGaWxlLmdldE5hbWUoKSk7Ci0JCQlyZXR1cm4gZWxlbWVudERpYWdyYW07Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlMaWJyYXJ5UGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVuZGVycyB0aGUgYXNzb2NpYXRpb24gbGluZS4KLQkgKiAKLQkgKiBAcGFyYW0gZzJkCi0JICogICAgICAgICAgICBUaGUgR3JhcGhpY3MyRCBjb250ZXh0LgotCSAqIEBwYXJhbSBzdGFydFBvaW50Ci0JICogICAgICAgICAgICBUaGUgc3RhcnQgcG9pbnQgb2YgdGhlIGxpbmUuCi0JICogQHBhcmFtIGVuZFBvaW50Ci0JICogICAgICAgICAgICBUaGUgZW5kIHBvaW50IG9mIHRoZSBsaW5lLgotCSAqIEBwYXJhbSBuYW1lCi0JICogICAgICAgICAgICBUaGUgYXNzb2NpYXRpb24gbmFtZS4KLQkgKiBAcGFyYW0gZm9udAotCSAqICAgICAgICAgICAgVGhlIGZvbnQgZm9yIHJlbmRlcmluZyB0aGUgYXNzb2NpYXRpb24gbmFtZS4KLQkgKiBAcGFyYW0gY29sb3IKLQkgKiAgICAgICAgICAgIHRoZSBjb2xvciBmb3IgcmVuZGVyaW5nIHRoZSBhc3NvY2lhdGlvbiBuYW1lLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbmRlckFzc29jaWF0aW9uKEdyYXBoaWNzMkQgZzJkLCBQb2ludCBzdGFydFBvaW50LAotCQkJUG9pbnQgZW5kUG9pbnQsIFN0cmluZyBuYW1lLCBGb250IGZvbnQsIENvbG9yIGNvbG9yKSB7Ci0JCWcyZC5kcmF3KG5ldyBMaW5lMkQuRG91YmxlKHN0YXJ0UG9pbnQueCwgc3RhcnRQb2ludC55LCBlbmRQb2ludC54LAotCQkJCWVuZFBvaW50LnkpKTsKLQkJaW50IHRleHRYID0gc3RhcnRQb2ludC54ICsgKGVuZFBvaW50LnggLSBzdGFydFBvaW50LngpIC8gMiAtIDQwOwotCQlpbnQgdGV4dFkgPSBzdGFydFBvaW50LnkgKyAoZW5kUG9pbnQueSAtIHN0YXJ0UG9pbnQueSkgLyAyIC0gNTsKLQkJaWYgKHN0YXJ0UG9pbnQueSAhPSBlbmRQb2ludC55KSB7Ci0JCQlnMmQuc2V0Q29sb3IoQ29sb3IuV0hJVEUpOwotCQkJZzJkLmZpbGxSZWN0KHRleHRYLCB0ZXh0WSwgODAsIDEwKTsKLQkJfSBlbHNlIHsKLQkJCXRleHRZIC09IDEwOwotCQl9Ci0JCUltYWdlVXRpbC5kcmF3VGV4dChnMmQsIG5hbWUsIGZvbnQsIGNvbG9yLCB0ZXh0WCwgdGV4dFksIDgwLCAzKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZGlhZ3JhbS9wYWNrYWdlLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L2RpYWdyYW0vcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMWJmMzAzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZGlhZ3JhbS9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyByb2xlIGFuZCBhY3Rpdml0eSBkaWFncmFtcyBpbiBhIHB1Ymxpc2hlZCBjb25maWd1cmFpdG9uLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZWxlbWVudHMvQWJzdHJhY3RFbGVtZW50TGF5b3V0LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L2VsZW1lbnRzL0Fic3RyYWN0RWxlbWVudExheW91dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZWVhM2ZmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZWxlbWVudHMvQWJzdHJhY3RFbGVtZW50TGF5b3V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjk1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5lbGVtZW50czsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSSTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzaWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuRmlsZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5OZXRVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuU3RyVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5JTGlicmFyeVJlc291cmNlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLkVsZW1lbnRSZWFsaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuRWxlbWVudExheW91dE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LkVsZW1lbnRQcm9wZXJ0eVByb3ZpZGVyTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuSUVsZW1lbnRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LkxheW91dEluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LkxheW91dFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQudXRpbC5YbWxFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLklMaWJyYXJ5UmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5MaWJyYXJ5VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLlJlc291cmNlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5NdWx0aUZpbGVYTUlTYXZlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNoZWNrbGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbmNlcHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkN1c3RvbUNhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpYmFibGVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkV4YW1wbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HdWlkZWxpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnRQcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5SZXVzYWJsZUFzc2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9hZG1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5TdXBwb3J0aW5nTWF0ZXJpYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldoaXRlcGFwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrT3JkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLnV0aWwuT3Bwb3NpdGVGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5Bc3NvY2lhdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLQotLyoqCi0gKiBUaGUgYWJzdHJhY3QgbGF5b3V0IGZvciBhbGwgTWV0aG9kIEVsZW1lbnRzLgotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAYXV0aG9yIFdlaXBpbmcgTHUKLSAqIEBzaWNuZSAxLjAKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0RWxlbWVudExheW91dCBpbXBsZW1lbnRzIElFbGVtZW50TGF5b3V0IHsKLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBwcm9jZXNzRGVzY3JpdG9yc05ld09wdGlvbiA9IGZhbHNlOwotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19SRUZFUkVOQ0UgPSAicmVmZXJlbmNlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19SRUZFUkVOQ0VMSVNUID0gInJlZmVyZW5jZUxpc3QiOyAvLyROT04tTkxTLTEkCi0JCi0JcHJvdGVjdGVkIEVsZW1lbnRMYXlvdXRNYW5hZ2VyIGxheW91dE1hbmFnZXI7Ci0KLQlwcm90ZWN0ZWQgTWV0aG9kRWxlbWVudCBlbGVtZW50OwotCi0JcHJvdGVjdGVkIE1ldGhvZEVsZW1lbnQgb3duZXJFbGVtZW50OwotCi0JcHJvdGVjdGVkIFN0cmluZyB1cmwgPSBudWxsOwotCi0JLy8gZWxlbWVudCBlbGVtZW50IHBhdGggcmVsYXRpdmUgdG8gdGhlIHB1Ymxpc2hpbmcgcm9vdAotCXByb3RlY3RlZCBTdHJpbmcgZWxlbWVudFBhdGggPSAiIjsgLy8kTk9OLU5MUy0xJAotCi0JLy8gdGhlIGJhY2sgdXAgcGF0aCB0byByZWF0aCB0aGUgcHVibGlzaGluZyByb290Ci0JcHJvdGVjdGVkIFN0cmluZyBiYWNrUGF0aCA9ICIiOyAvLyROT04tTkxTLTEkCi0KLQkvLyBtYXAgb2YgbGF5b3V0IGZpbGUgdG8gdGhlIG91dHB1dCBmaWxlIGV4dGVudGlvbiwgaWYgdGhlIGVsZW1lbnQgaGFzIG1vcmUKLQkvLyB0aGFuIG9uZSBsYXlvdXQgb3V0cHV0Ci0JcHJvdGVjdGVkIExpc3QgbGF5b3V0cyA9IG51bGw7Ci0KLQlwcm90ZWN0ZWQgTWV0aG9kRWxlbWVudCB0YXJnZXRFbGVtZW50ID0gbnVsbDsKLQotCXByb3RlY3RlZCBib29sZWFuIHNob3dFbGVtZW50TGluayA9IHRydWU7Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gZGVidWcgPSBMaWJyYXJ5UGx1Z2luLmdldERlZmF1bHQoKS5pc0RlYnVnZ2luZygpOwotCi0JcHJpdmF0ZSBFbGVtZW50TGF5b3V0RXh0ZW5kZXIgZXh0ZW5kZXI7Ci0JCi0JcHVibGljIEFic3RyYWN0RWxlbWVudExheW91dCgpIHsKLQl9Ci0KLQkvKioKLQkgKiBpZiB0aGUgZWxlbWVudCdzIGNvbnRlbnQgaXMgdGFyZ2V0IGZvciBhbm90aGVyIGVsZW1lbnQsIHNldCBpdCBoZXJlLiBmb3IKLQkgKiBleGFtcGxlLCBzdGVwIGNvbnRlbnQgY2F0IHRhcmdldCBmb3IgYSBUYXNrIG9yIGEgdGFzayBkZXNjcmlwdG9yCi0JICogY29weXJpZ2h0IGNvbnRlbnQgY2FuIHRhcmdldCB0byBkaWZmZXJlbnQgZWxlbWVudHMuCi0JICogCi0JICogVGhlIHB1cnBvc2Ugb2YgdGhpcyBpcyB0aGF0IHRoZSBzeXN0ZW0gd2lsbCBmaXggdGhlIGxpbmtzIGluIHRoZSBjb250ZW50Ci0JICogdG8gcmVsYXRpdmUgdG8gdGhlIHRhcmdldCBlbGVtZW50LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvbnRlbnRUYXJnZXQoTWV0aG9kRWxlbWVudCB0YXJnZXRFbGVtZW50KSB7Ci0JCXRoaXMudGFyZ2V0RWxlbWVudCA9IHRhcmdldEVsZW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogbmVlZCB0byBzZXQgdGhlIG93bmVyIG9mIHRoZSBjdXJyZW50IGxheW91dCBlbGVtZW50LiBJbiBtb3N0IGNhc2VzIHRoaXMKLQkgKiBzaG91bGQgYmUgdGhlIGVDb250YWluZXIgb2YgdGhlIGVsZW1lbnQuIFRoaXMgaXMgbmVlZGVkIGJlY2F1c2UgaW4gc29tZQotCSAqIHNpdHVhdGlvbiB0aGUgZWxlbWVudCBkb2VzIG5vdCBoYXZlIGFuIG93bmVyIHdoZW4gdGhlIG9iamVjdCBpcyBjcmVhdGVkLgotCSAqIEZvciBleGFtcGxlLCB0aGUgQ29udGVudERlc2NyaXB0aW9uIG9iamVjdCdzIGVDb250aW5lciBpcyBudWxsIGlmIHRoZQotCSAqIGNvbnRlbnQgZmlsZSBpcyBub3Qgc2F2ZWQuCi0JICogCi0JICogQHBhcmFtIG93bmVyCi0JICogICAgICAgICAgICBNZXRob2RFbGVtZW50Ci0JICovCi0JcHVibGljIHZvaWQgc2V0RWxlbWVudE93bmVyKE1ldGhvZEVsZW1lbnQgb3duZXIpIHsKLQkJdGhpcy5vd25lckVsZW1lbnQgPSBvd25lcjsKLQl9Ci0KLQkvKioKLQkgKiBAZGVwcmVjYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNob3dFbGVtZW50TGluayhib29sZWFuIHNob3cpIHsKLQkJdGhpcy5zaG93RWxlbWVudExpbmsgPSBzaG93OwotCX0KLQkKLQkvKioKLQkgKiBpbml0aWFsaXplIHRoZSBsYXlvdXQgd2l0aCB0aGUgZWxlbWVudCBsYXlvdXQgbWFuYWdlciBhbmQgdGhlIGVsZW1lbnQuCi0JICogQHBhcmFtIGxheW91dE1hbmFnZXIgRWxlbWVudExheW91dE1hbmFnZXIKLQkgKiBAcGFyYW0gZWxlbWVudCBNZXRob2RFbGVtZW50Ci0JICovCi0JcHVibGljIGFic3RyYWN0IHZvaWQgaW5pdChFbGVtZW50TGF5b3V0TWFuYWdlciBsYXlvdXRNYW5hZ2VyLAotCQkJTWV0aG9kRWxlbWVudCBlbGVtZW50KTsKLQotCXByb3RlY3RlZCB2b2lkIF9faW5pdChFbGVtZW50TGF5b3V0TWFuYWdlciBsYXlvdXRNYW5hZ2VyLAotCQkJTWV0aG9kRWxlbWVudCBlbGVtZW50KSB7Ci0JCXRoaXMubGF5b3V0TWFuYWdlciA9IGxheW91dE1hbmFnZXI7Ci0JCXRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7Ci0JCWlmICghQ29uZmlndXJhdGlvbkhlbHBlci5pc0Rlc2NyaXB0aW9uRWxlbWVudChlbGVtZW50KSkgewotCQkJaWYgKCAhKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RDb25maWd1cmF0aW9uKSApIHsKLQkJCQkvLyBtYWtlIHN1cmUgdGhlIGVsZW1lbnQgaXMgbG9hZGVkIHdpdGggdGhlIGNvcnJlY3QgY29udGFpbmVyCi0JCQkJLy8gb3RoZXJ3aXNlIHRoZSAgZWxlbWVudCBtYXkgbm90IGhhdmUgYSB2YWxpZCBjb250YWluZXIKLQkJCQkvLyBhbmQgdGh1cyB0aGUgZWxlbWVudCBjb250ZW50IHBhdGggY2FuJ3QgYmUgZGV0ZXJtaW5lZAotCQkJCS8vIHRoaXMgaXMganVzdCBhIHdvcmthcm91bmQuIHNob3VsZCB3ZSBoYXZlIGEgYmV0dGVyIHdheSB0byBtYWtlIHN1cmUgdGhlIGVsZW1lbnRzIGFyZSBsb2FkZWQgY29ycmVjdGx5Pz8/Pz8/Pz8/Pz8KLQkJCQkvLyAxNjA0NDEgLSBNaXNzaW5nIHRlbXBsYXRlIGZpbGVzIHdoZW4gcHVibGlzaCBjb25maWd1cmF0aW9uCi0JCQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IExpYnJhcnlVdGlsLmdldE1ldGhvZFBsdWdpbihlbGVtZW50KTsKLQkJCQlpZiAoIHBsdWdpbiA9PSBudWxsIHx8IHBsdWdpbi5lQ29udGFpbmVyKCkgPT0gbnVsbCkgewotCQkJCQkKLQkJCQkJLy8gdGhpcyBzaG91bGQgbm90IGhhcHBlbiBpbiBwdWJsaXNoaW5nIG1vZGUgc2luY2UgdGhlIHdob2xlIGxpYnJhcnkgaXMgYWxyZWFkeSBsb2FkZWQKLQkJCQkJaWYgKCBkZWJ1ZyAmJiBnZXRMYXlvdXRNZ3IoKS5pc1B1Ymxpc2hpbmdNb2RlKCkgKSB7Ci0JCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yOiBFbGVtZW50IHdpdGhvdXQgYSB2YWxpZCBjb250YWluZXI6ICIgKyBMaWJyYXJ5VXRpbC5nZXRUeXBlTmFtZShlbGVtZW50KSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCQkKLQkJCQkJTGlicmFyeVV0aWwuZ2V0TWV0aG9kUGx1Z2lucyhMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCkpOwotCQkJCX0gCi0JCQl9Ci0JCQlidWlsZFBhdGgoKTsKLQkJCXRoaXMudXJsID0gZWxlbWVudFBhdGggKyBnZXRGaWxlTmFtZShSZXNvdXJjZUhlbHBlci5GSUxFX0VYVF9IVE1MKTsKLQkJfQotCQkKLQkJLy8gdGhpcyBpcyBhIHdvcmthcm91bmQuIAotCQkvLyB3ZSBuZWVkIHRvIHBhc3MgcGFyYW1ldGVycyBpbiB0aGUgZmlsZSB1cmwsIAotCQkvLyBob3dldmVyLCBpZiB0aGUgZmlsZSBkb2VzIG5vdCBleGlzdCwgdGhlIHBhcmFtZXRlcnMgaXMgbm90IHBhc3NlZCBvdmVyIGluIGJyb3dzaW5nCi0JCS8vIHNvIGNyZWF0ZSBhIGR1bW15IGZpbGUKLQkJaWYgKCF0aGlzLmxheW91dE1hbmFnZXIuaXNQdWJsaXNoaW5nTW9kZSgpICYmICEoCi0JCQkJCWVsZW1lbnQgaW5zdGFuY2VvZiBDb250ZW50RGVzY3JpcHRpb24gCi0JCQkJfHwgZWxlbWVudC5lQ29udGFpbmVyKCkgaW5zdGFuY2VvZiBDb250ZW50RGVzY3JpcHRpb24KLQkJCQl8fCBlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kQ29uZmlndXJhdGlvbikgKQotCQl7Ci0JCQl0cnkgewotCQkJCVN0cmluZyBodG1sX2ZpbGUgPSB0aGlzLmxheW91dE1hbmFnZXIuZ2V0UHVibGlzaERpcigpICsgdGhpcy5nZXRGaWxlUGF0aCgpICsgZ2V0RmlsZU5hbWUoUmVzb3VyY2VIZWxwZXIuRklMRV9FWFRfSFRNTCk7Ci0JCQkJRmlsZSBmID0gbmV3IEZpbGUoaHRtbF9maWxlKTsKLQkJCQlpZiAoICFmLmV4aXN0cygpICkKLQkJCQl7Ci0JCQkJCWYuZ2V0UGFyZW50RmlsZSgpLm1rZGlycygpOwotCQkJCQlmLmNyZWF0ZU5ld0ZpbGUoKTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQkJfQotCQkKLQkJcHJlbG9hZE9wcG9zaXRlZmVhdHVyZXMoKTsKLQotCX0KLQotCXByaXZhdGUgdm9pZCBwcmVsb2FkT3Bwb3NpdGVmZWF0dXJlcygpIHsKLQkJLy8gbWFrZSBzdXJlIHRoZSBwcm9jZXNzZXMgYXJlIGxvYWRlZCBiZWZvcmUgY2FsY3VsYXRpbmcgdGhlIGZlYXR1cmUKLQkJLy8gb3RoZXJ3aXNlIHRoZSBvcHBvc2l0ZSBmZWF0dXJlIG1hcCBpcyBub3QgcG9wdWxhdGVkCi0JCS8vIGZpbmUgZm9yIHB1Ymxpc2hpbmcgc2luY2UgdGhlIHdob2xlIGxpYnJhcnkgaXMgbG9hZGVkIGFscmVhZHkKLQkJLy8gc3BlY2lhbCBoYW5kbGluZyBmb3IgYnJvd3NpbmcKLQkJLy8gbG9hZCB0aGUgb3Bwb3NpdGUgZmVhdHVyZSBzcGVjaWZpY2FsbHkKLQkJaWYgKCBnZXRMYXlvdXRNZ3IoKS5pc1B1Ymxpc2hpbmdNb2RlKCkgKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCS8vT3Bwb3NpdGVGZWF0dXJlIG9mOwotCQlSZXNvdXJjZSByZXMgPSBlbGVtZW50LmVSZXNvdXJjZSgpOwotCQlpZiAoIHJlcyA9PSBudWxsICkgewotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlSZXNvdXJjZVNldCByZXNTZXQgPSByZXMuZ2V0UmVzb3VyY2VTZXQoKTsKLQkJaWYgKCAhKHJlc1NldCBpbnN0YW5jZW9mIElMaWJyYXJ5UmVzb3VyY2VTZXQpICkgewotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlMaXN0PE9wcG9zaXRlRmVhdHVyZT4gb3Bwb3NpdGVGZWF0dXJlcyA9IG5ldyBBcnJheUxpc3Q8T3Bwb3NpdGVGZWF0dXJlPigpOwotCQlpZiAoIHRoaXMuZWxlbWVudCBpbnN0YW5jZW9mIFJvbGUgKSB7Ci0JCQlvcHBvc2l0ZUZlYXR1cmVzLmFkZChBc3NvY2lhdGlvbkhlbHBlci5Sb2xlX1JvbGVEZXNjcmlwdG9ycyk7Ci0JCX0gZWxzZSBpZiAoIHRoaXMuZWxlbWVudCBpbnN0YW5jZW9mIFRhc2sgKSB7Ci0JCQlvcHBvc2l0ZUZlYXR1cmVzLmFkZChBc3NvY2lhdGlvbkhlbHBlci5UYXNrX1Rhc2tEZXNjcmlwdG9ycyk7Ci0JCX0gZWxzZSBpZiAoIHRoaXMuZWxlbWVudCBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0ICkgewotCQkJb3Bwb3NpdGVGZWF0dXJlcy5hZGQoQXNzb2NpYXRpb25IZWxwZXIuV29ya1Byb2R1Y3RfV29ya1Byb2R1Y3REZXNjcmlwdG9ycyk7Ci0JCX0gZWxzZSBpZiAoIHRoaXMuZWxlbWVudCBpbnN0YW5jZW9mIENoZWNrbGlzdCApIHsKLQkJCW9wcG9zaXRlRmVhdHVyZXMuYWRkKEFzc29jaWF0aW9uSGVscGVyLkNoZWNrbGlzdF9CcmVha2Rvd25FbGVtZW50cyk7Ci0JCX0gZWxzZSBpZiAoIHRoaXMuZWxlbWVudCBpbnN0YW5jZW9mIENvbmNlcHQgfHwgdGhpcy5lbGVtZW50IGluc3RhbmNlb2YgV2hpdGVwYXBlciApIHsKLQkJCW9wcG9zaXRlRmVhdHVyZXMuYWRkKEFzc29jaWF0aW9uSGVscGVyLkNvbmNlcHRfQnJlYWtkb3duRWxlbWVudHMpOwotCQl9IGVsc2UgaWYgKCB0aGlzLmVsZW1lbnQgaW5zdGFuY2VvZiBDaGVja2xpc3QgKSB7Ci0JCQlvcHBvc2l0ZUZlYXR1cmVzLmFkZChBc3NvY2lhdGlvbkhlbHBlci5DaGVja2xpc3RfQnJlYWtkb3duRWxlbWVudHMpOwotCQl9IGVsc2UgaWYgKCB0aGlzLmVsZW1lbnQgaW5zdGFuY2VvZiBFeGFtcGxlICkgewotCQkJb3Bwb3NpdGVGZWF0dXJlcy5hZGQoQXNzb2NpYXRpb25IZWxwZXIuRXhhbXBsZV9CcmVha2Rvd25FbGVtZW50cyk7Ci0JCX0gZWxzZSBpZiAoIHRoaXMuZWxlbWVudCBpbnN0YW5jZW9mIEd1aWRlbGluZSApIHsKLQkJCW9wcG9zaXRlRmVhdHVyZXMuYWRkKEFzc29jaWF0aW9uSGVscGVyLkd1aWRlbGluZV9CcmVha2Rvd25FbGVtZW50cyk7Ci0JCX0gZWxzZSBpZiAoIHRoaXMuZWxlbWVudCBpbnN0YW5jZW9mIFJldXNhYmxlQXNzZXQgKSB7Ci0JCQlvcHBvc2l0ZUZlYXR1cmVzLmFkZChBc3NvY2lhdGlvbkhlbHBlci5SZXVzYWJsZUFzc2V0X0JyZWFrZG93bkVsZW1lbnRzKTsKLQkJfSBlbHNlIGlmICggdGhpcy5lbGVtZW50IGluc3RhbmNlb2YgUm9hZG1hcCApIHsKLQkJCW9wcG9zaXRlRmVhdHVyZXMuYWRkKEFzc29jaWF0aW9uSGVscGVyLlJvYWRtYXBfQWN0aXZpdGVzKTsKLQkJfSBlbHNlIGlmICggdGhpcy5lbGVtZW50IGluc3RhbmNlb2YgU3VwcG9ydGluZ01hdGVyaWFsICkgewotCQkJb3Bwb3NpdGVGZWF0dXJlcy5hZGQoQXNzb2NpYXRpb25IZWxwZXIuU3VwcG9ydGluZ01hdGVyaWFsX0JyZWFrZG93bkVsZW1lbnRzKTsKLQkJfSAKLQkKLQkJaWYgKCBvcHBvc2l0ZUZlYXR1cmVzLnNpemUoKSA+IDAgKSB7Ci0JCQlDb25maWd1cmF0aW9uSGVscGVyLmdldERlbGVnYXRlKCkubG9hZE9wcG9zaXRlRmVhdHVyZXMoCi0JCQkJCShJTGlicmFyeVJlc291cmNlU2V0KSByZXNTZXQsIG9wcG9zaXRlRmVhdHVyZXMsIGVsZW1lbnQpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0TGF5b3V0SW5mbyhMYXlvdXRJbmZvIGluZm8pIHsKLQkJaWYgKGxheW91dHMgPT0gbnVsbCkgewotCQkJbGF5b3V0cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJfQotCQlsYXlvdXRzLmFkZChpbmZvKTsKLQl9Ci0KLQkvKioKLQkgKiByZXR1cm4gYSBsaXN0IG9mIExheW91dEluZm8gb2JqZWN0cwotCSAqIAotCSAqIEByZXR1cm4gYSBsaXN0IG9mIExheW91dEluZm8gb2JqZWN0cwotCSAqLwotCXB1YmxpYyBMaXN0IGdldExheW91dHMoKSB7Ci0JCXJldHVybiBsYXlvdXRzOwotCX0KLQotCS8qKgotCSAqIGdldCBsYXlvdXQgYnkgbmFtZQotCSAqIAotCSAqIEBwYXJhbSBuYW1lCi0JICogQHJldHVybiBMYXlvdXRJbmZvCi0JICovCi0JcHVibGljIExheW91dEluZm8gZ2V0TGF5b3V0SW5mbyhTdHJpbmcgbmFtZSkgewotCQlpZiAoIGxheW91dHMgPT0gbnVsbCB8fCBsYXlvdXRzLnNpemUoKSA9PSAwICkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJCi0JCWZvciAoSXRlcmF0b3IgaXQgPSBsYXlvdXRzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTsgKSB7Ci0JCQlMYXlvdXRJbmZvIGluZm8gPSAoTGF5b3V0SW5mbylpdC5uZXh0KCk7Ci0JCQlpZiAoIGluZm8ubmFtZS5lcXVhbHMobmFtZSkgKSB7Ci0JCQkJcmV0dXJuIGluZm87Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5JRWxlbWVudExheW91dCNnZXRMYXlvdXRNZ3IoKQotCSAqLwotCXB1YmxpYyBFbGVtZW50TGF5b3V0TWFuYWdlciBnZXRMYXlvdXRNZ3IoKSB7Ci0JCXJldHVybiB0aGlzLmxheW91dE1hbmFnZXI7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuSUVsZW1lbnRMYXlvdXQjZ2V0RWxlbWVudCgpCi0JICovCi0JcHVibGljIE1ldGhvZEVsZW1lbnQgZ2V0RWxlbWVudCgpIHsKLQkJcmV0dXJuIGVsZW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuSUVsZW1lbnRMYXlvdXQjZ2V0VHlwZSgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUeXBlKCkgewotCQlyZXR1cm4gZWxlbWVudC5nZXRUeXBlKCkuZ2V0TmFtZSgpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LklFbGVtZW50TGF5b3V0I2dldE5hbWUoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIGVsZW1lbnQuZ2V0TmFtZSgpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LklFbGVtZW50TGF5b3V0I2dldERpc3BsYXlOYW1lKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERpc3BsYXlOYW1lKCkgewotCQkKLQkJLy8gW0J1ZyAxOTYzOTldIFAtbmFtZSBpcyBub3QgaW5oZXJpdGVkIGZyb20gaXRzIGJhc2UgZWxlbWVudCBpbiBhbiBleHRlbmRpbmcgZWxlbWVudAotCQlyZXR1cm4gQ29uZmlndXJhdGlvbkhlbHBlci5nZXRQcmVzZW50YXRpb25OYW1lKGVsZW1lbnQsIGdldExheW91dE1ncigpLmdldENvbmZpZ3VyYXRpb24oKSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuSUVsZW1lbnRMYXlvdXQjZ2V0SWQoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCXJldHVybiBlbGVtZW50LmdldEd1aWQoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5JRWxlbWVudExheW91dCNnZXRVcmwoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VXJsKCkgewotCQlyZXR1cm4gdXJsOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LklFbGVtZW50TGF5b3V0I2dldEJhY2tQYXRoKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEJhY2tQYXRoKCkgewotCQlyZXR1cm4gYmFja1BhdGg7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuSUVsZW1lbnRMYXlvdXQjZ2V0RmlsZVBhdGgoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RmlsZVBhdGgoKSB7Ci0JCXJldHVybiBlbGVtZW50UGF0aDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBmaWxlIHBhdGggcmVsYXRpdmUgdG8gYW5vdGhlciBlbGVtZW50LiBUaGlzIGlzIHRoZQotCSAqIHJlbGF0aXZlVG8uYmFja3BhdGggKyB0aGlzLmVsZW1lbnRwYXRoLgotCSAqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuSUVsZW1lbnRMYXlvdXQjZ2V0RmlsZVBhdGgoSUVsZW1lbnRMYXlvdXQpCi0JICovCi0KLQlwdWJsaWMgU3RyaW5nIGdldEZpbGVQYXRoKElFbGVtZW50TGF5b3V0IHJlbGF0aXZlVG8pIHsKLQkJcmV0dXJuIHJlbGF0aXZlVG8uZ2V0QmFja1BhdGgoKSArIHRoaXMuZ2V0RmlsZVBhdGgoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBmaWxlIG5hbWUgd2l0aCB0aGUgZ2l2ZW4gZXh0ZW5zaW9uLgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LklFbGVtZW50TGF5b3V0I2dldEZpbGVOYW1lKFN0cmluZykKLQkgKi8KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RmlsZU5hbWUoU3RyaW5nIGV4dCkgewotCQlyZXR1cm4gUmVzb3VyY2VIZWxwZXIuZ2V0RmlsZU5hbWUoZWxlbWVudCwgZXh0KTsKLQl9Ci0KLQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuSUVsZW1lbnRMYXlvdXQjZ2V0WHNsVXJsKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFhzbFVybCgpIHsKLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBDb250ZW50RWxlbWVudCkgewotCQkJcmV0dXJuIExheW91dFJlc291cmNlcy5nZXRYc2xVcmkoZ2V0VHlwZSgpLnRvTG93ZXJDYXNlKCksCi0JCQkJCSJjb250ZW50ZWxlbWVudCIpOyAvLyROT04tTkxTLTEkCi0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gTGF5b3V0UmVzb3VyY2VzLmdldFhzbFVyaShnZXRUeXBlKCkudG9Mb3dlckNhc2UoKSwgbnVsbCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgYnVpbGRQYXRoKCkgewotCQkvLyB0aGlzIGlzIDxwbHVnaW4+LzxlbGVtZW50IHR5cGU+LwotCQllbGVtZW50UGF0aCA9ICIiOyAvLyROT04tTkxTLTEkCi0JCWJhY2tQYXRoID0gIi4vIjsgLy8kTk9OLU5MUy0xJAotCQlpZiAoICEoZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZENvbmZpZ3VyYXRpb24gfHwgZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZExpYnJhcnkpICkKLQkJewotCQkJU3RyaW5nIHBhdGggPSBSZXNvdXJjZUhlbHBlci5nZXRFbGVtZW50UGF0aChlbGVtZW50KTsKLQkJCWlmICggcGF0aCAhPSBudWxsICkgewotCQkJCWVsZW1lbnRQYXRoID0gcGF0aC5yZXBsYWNlKEZpbGUuc2VwYXJhdG9yQ2hhciwgJy8nKTsKLQkJCQliYWNrUGF0aCA9IFJlc291cmNlSGVscGVyLmdldEJhY2tQYXRoKGVsZW1lbnQpOwotCQkJfQotCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBjaGVjayBpZiB0aGUgaHRtbCBjb250ZW50IGdlbmVyYXRlZCBmcm9tIHRoaXMgeHNsIGZpbGUgbmVlZHMgdG8gYmUgc2Nhbm5lZCBvciBub3QKLQkgKiBzY2FuIHRoZSBjb250ZW50IGlzIGZvciBpZGVudGlmeWluZyBlbGVtZW50IHJlZmVyZW5jZXMgaW4gdGhlIGNvbnRlbnQgYW5kIGNvcHkgb3ZlciByZXNvdXJjZSBmaWxlcwotCSAqIGluIHNvbWUgY2FzZXMgd2UgZG9uJ3QgbmVlZCB0byBzY2FuIHRoZSBjb250ZW50LCBmb3IgZXhhbXBsZSwgdGhlIGFjdGl2aXR5IGJyZWFrZG93biBzdHJ1Y3R1cmUKLQkgKiAKLQkgKiBAcGFyYW0geHNsVXJsIHRoZSB4c2wgdGhhdCBodG1sIGlzIGdlbmVyYXRlZCBmcm9tLCBudWxsIGZvciB0aGUgZGVmYXVsdCB4c2wgbGF5b3V0Ci0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gbmVlZENvbnRlbnRTY2FuKFN0cmluZyB4c2xVcmwpCi0JewotCQkvLyBieSBkZWZhdWx0IGFsbCBjb250ZW50cyBhcmUgc2Nhbm5lZAotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JLyoqCi0JICogZ2V0IHRoZSBsYXlvdXQgZm9yIGEgY2hpbGQgZWxlbWVudCBvZiB0aGlzIGVsZW1lbnQKLQkgKiBBY3Rpdml0eUVsZW1lbnRMYXlvdXQgc2hvdWxkIG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIGNyZWF0ZSBsYXlvdXQgd2l0aCBub2RlIHBhdGgKLQkgKiBAcGFyYW0gY2hpbGQKLQkgKiBAcmV0dXJuIElFbGVtZW50TGF5b3V0Ci0JICovCi0JcHJvdGVjdGVkIElFbGVtZW50TGF5b3V0IGdldENoaWxkTGF5b3V0KE1ldGhvZEVsZW1lbnQgY2hpbGQpCi0JewotCQlyZXR1cm4gbGF5b3V0TWFuYWdlci5nZXRMYXlvdXQoY2hpbGQsIHRydWUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzQ2hpbGQoT2JqZWN0IGZlYXR1cmUsIFhtbEVsZW1lbnQgcGFyZW50LCBNZXRob2RFbGVtZW50IGUsCi0JCQlib29sZWFuIGluY2x1ZGVSZWZlcmVuY2VzKSB7Ci0JCWlmIChlICE9IG51bGwpIHsKLQkJCUlFbGVtZW50TGF5b3V0IGwgPSBnZXRDaGlsZExheW91dChlKTsKLQkJCWlmIChsICE9IG51bGwpIHsKLQkJCQkvLyBkb24ndCBpbmNsdWRlIHRoZSByZWZlcmVuY2VzIG9mIHRoZSByZWZlcmVjZWQgZWxlbWVudHMsCi0JCQkJLy8gb3RoZXJ3aXNlLCBtYXkgY2F1c2UgZGVhZGxvY2sKLQkJCQlib29sZWFuIGlzQ29udGVudCA9IChlIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkKLQkJCQkJCSYmIENvbmZpZ3VyYXRpb25IZWxwZXIKLQkJCQkJCQkJLmlzRGVzY3JpcHRpb25FbGVtZW50KChNZXRob2RFbGVtZW50KSBlKTsKLQkJCQlpZiAoaXNDb250ZW50KSB7Ci0JCQkJCWlmICh0YXJnZXRFbGVtZW50ICE9IG51bGwpIHsKLQkJCQkJCWwuc2V0Q29udGVudFRhcmdldCh0YXJnZXRFbGVtZW50KTsKLQkJCQkJfQotCQkJCQlsLnNldEVsZW1lbnRPd25lcihlbGVtZW50KTsKLQkJCQl9Ci0JCQkJWG1sRWxlbWVudCBjaGlsZFhtbEVsZW1lbnQgPSBsLmdldFhtbEVsZW1lbnQoaW5jbHVkZVJlZmVyZW5jZXMpOwotCQkJCXBhcmVudC5hZGRDaGlsZChjaGlsZFhtbEVsZW1lbnQpOwotCQkJCXByb2Nlc3NHcmFuZENoaWxkKGZlYXR1cmUsIGUsIGwsIGNoaWxkWG1sRWxlbWVudCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzQ2hpbGQoT2JqZWN0IGZlYXR1cmUsIFhtbEVsZW1lbnQgcGFyZW50LCBMaXN0IGl0ZW1zLAotCQkJYm9vbGVhbiBpbmNsdWRlUmVmZXJlbmNlcykgewotCQlpZiAoaXRlbXMgIT0gbnVsbCAmJiBpdGVtcy5zaXplKCkgPiAwKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gaXRlbXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBlID0gaXQubmV4dCgpOwotCQkJCWlmIChlIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJCQlNZXRob2RFbGVtZW50IG1lID0gKE1ldGhvZEVsZW1lbnQpIGU7Ci0JCQkJCWUgPSBDb25maWd1cmF0aW9uSGVscGVyLmdldENhbGN1bGF0ZWRFbGVtZW50KG1lLAotCQkJCQkJCWxheW91dE1hbmFnZXIuZ2V0Q29uZmlndXJhdGlvbigpKTsKLQkJCQkJaWYgKGUgIT0gbnVsbCkgewotCQkJCQkJSUVsZW1lbnRMYXlvdXQgbCA9IGdldENoaWxkTGF5b3V0KG1lKTsKLQkJCQkJCWlmIChsICE9IG51bGwpIHsJCQkJCQkJCi0JCQkJCQkJLy8gZG9uJ3QgaW5jbHVkZSB0aGUgcmVmZXJlbmNlcyBvZiB0aGUgcmVmZXJlY2VkCi0JCQkJCQkJLy8gZWxlbWVudHMsIG90aGVyd2lzZSwgbWF5IGNhdXNlIGRlYWRsb2NrCi0JCQkJCQkJWG1sRWxlbWVudCBjaGlsZFhtbEVsZW1lbnQgPSBsLmdldFhtbEVsZW1lbnQoQ29uZmlndXJhdGlvbkhlbHBlcgotCQkJCQkJCQkJLmlzRGVzY3JpcHRpb25FbGVtZW50KG1lKSA/IHRydWUKLQkJCQkJCQkJCTogaW5jbHVkZVJlZmVyZW5jZXMpOwotCQkJCQkJCXBhcmVudC5hZGRDaGlsZChjaGlsZFhtbEVsZW1lbnQpOwotCQkJCQkJCXByb2Nlc3NHcmFuZENoaWxkKGZlYXR1cmUsIG1lLCBsLCBjaGlsZFhtbEVsZW1lbnQpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJcHJvY2Vzc05vbk1ldGhvZEVsZW1lbnRJblByb2Nlc3NDaGlsZChlLCBmZWF0dXJlLCBwYXJlbnQsIGluY2x1ZGVSZWZlcmVuY2VzKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc05vbk1ldGhvZEVsZW1lbnRJblByb2Nlc3NDaGlsZCgKLQkJCU9iamVjdCBub25NZXRob2RFbGVtZW50Q2hpbGQsIE9iamVjdCBmZWF0dXJlLCBYbWxFbGVtZW50IHBhcmVudCwKLQkJCWJvb2xlYW4gaW5jbHVkZVJlZmVyZW5jZXMpIHsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc0dyYW5kQ2hpbGQoT2JqZWN0IGZlYXR1cmUsCi0JCQlNZXRob2RFbGVtZW50IGNoaWxkRWxlbWVtdCwgSUVsZW1lbnRMYXlvdXQgY2hpbGRMYXlvdXQsCi0JCQlYbWxFbGVtZW50IGNoaWxkWG1sRWxlbWVudCkgewotCX0KLQotCS8qKgotCSAqIGNhbGN1bGF0ZSB0aGUgdG8tbWFueSByZWZlcmVuY2VzCi0JICogQHBhcmFtIGVsZW1lbnRYbWwgWG1sRWxlbWVudAotCSAqIEBwYXJhbSBpbmNsdWRlUmVmZXJlbmNlcyBib29sZWFuCi0JICovCi0JcHVibGljIHZvaWQgY2FsY3VsYXRlMG5SZWZlcmVuY2VzKFhtbEVsZW1lbnQgZWxlbWVudFhtbCwKLQkJCWJvb2xlYW4gaW5jbHVkZVJlZmVyZW5jZXMpIHsKLQkJLy8gcmVmZXJlbmNlTWFwLmNsZWFyKCk7Ci0JCUxpc3QgZmVhdHVyZXMgPSBMaWJyYXJ5VXRpbC5nZXRTdHJ1Y3R1cmFsRmVhdHVyZXMoZWxlbWVudCk7Ci0vLwkJTGlzdCBwcm9wZXJ0aWVzID0gZWxlbWVudC5nZXRJbnN0YW5jZVByb3BlcnRpZXMoKTsKLQkJaWYgKGZlYXR1cmVzICE9IG51bGwpIHsKLQkJCS8vIGdldCBhbGwgc3RyaW5nIHR5cGUgYXR0cmlidXRlcwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmZWF0dXJlcy5zaXplKCk7IGkrKykgewotCQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgZmVhdHVyZXMKLQkJCQkJCS5nZXQoaSk7Ci0JCQkJaWYgKGZlYXR1cmUuaXNNYW55KCkpIHsKLQkJCQkJbG9hZEZlYXR1cmUoZmVhdHVyZSwgZWxlbWVudFhtbCwgaW5jbHVkZVJlZmVyZW5jZXMpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCBYbWxFbGVtZW50IGdldFhtbEVsZW1lbnQoKSB7Ci0JCVhtbEVsZW1lbnQgZWxlbWVudFhtbCA9IG5ldyBYbWxFbGVtZW50KCJFbGVtZW50IikgLy8kTk9OLU5MUy0xJAotCQkJCS5zZXRBdHRyaWJ1dGUoIklkIiwgZ2V0SWQoKSkgLy8kTk9OLU5MUy0xJAkKLQkJCQkuc2V0QXR0cmlidXRlKCJUeXBlIiwgZ2V0VHlwZSgpKSAvLyROT04tTkxTLTEkCi0JCQkJLnNldEF0dHJpYnV0ZSgiVHlwZU5hbWUiLCBUbmdVdGlsLmdldFR5cGVUZXh0KGVsZW1lbnQpKSAvLyROT04tTkxTLTEkCi0JCQkJLnNldEF0dHJpYnV0ZSgiTmFtZSIsIGdldE5hbWUoKSkgLy8kTk9OLU5MUy0xJAotCQkJCS5zZXRBdHRyaWJ1dGUoIkJhY2tQYXRoIiwgZ2V0QmFja1BhdGgoKSkgLy8kTk9OLU5MUy0xJAotCQkJCS5zZXRBdHRyaWJ1dGUoIlNoYXBlaWNvblVybCIsIGdldFNoYXBlaWNvblVybCgpKSAvLyROT04tTkxTLTEkCi0JCQkJLnNldEF0dHJpYnV0ZSgiRGlzcGxheU5hbWUiLCBnZXREaXNwbGF5TmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCi0JCWlmICggc2hvd0VsZW1lbnRMaW5rICkgewotCQkJZWxlbWVudFhtbC5zZXRBdHRyaWJ1dGUoIlVybCIsIGdldFVybCgpKTsgLy8kTk9OLU5MUy0xJAotCQl9IAotCQkKLQkJcmV0dXJuIGVsZW1lbnRYbWw7Ci0JfQotCi0JLyoqCi0JICogbG9hZCB0aGUgYXR0cmlidXRlcwotCSAqIEBwYXJhbSBlbGVtZW50WG1sIFhtbEVsZW1lbnQKLQkgKi8KLQlwdWJsaWMgdm9pZCBsb2FkQXR0cmlidXRlcyhYbWxFbGVtZW50IGVsZW1lbnRYbWwpIHsKLQotCQlib29sZWFuIGlzQWN0aXZpdHlBdHRyaWJ1dGUgPSAoZWxlbWVudCBpbnN0YW5jZW9mIEFjdGl2aXR5KSAKLQkJCXx8IChlbGVtZW50IGluc3RhbmNlb2YgQ29udGVudERlc2NyaXB0aW9uKSAKLQkJCQkmJiAoZWxlbWVudC5lQ29udGFpbmVyKCkgaW5zdGFuY2VvZiBBY3Rpdml0eSB8fCBvd25lckVsZW1lbnQgaW5zdGFuY2VvZiBBY3Rpdml0eSk7Ci0JCQotCQlMaXN0IGZlYXR1cmVzID0gTGlicmFyeVV0aWwuZ2V0U3RydWN0dXJhbEZlYXR1cmVzKGVsZW1lbnQpOwotLy8JCUxpc3QgcHJvcGVydGllcyA9IGVsZW1lbnQuZ2V0SW5zdGFuY2VQcm9wZXJ0aWVzKCk7Ci0JCWlmIChmZWF0dXJlcyAhPSBudWxsKSB7Ci0JCQkvLyBnZXQgYWxsIHN0cmluZyB0eXBlIGF0dHJpYnV0ZXMKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmVhdHVyZXMuc2l6ZSgpOyBpKyspIHsKLQkJCQlFU3RydWN0dXJhbEZlYXR1cmUgcCA9IChFU3RydWN0dXJhbEZlYXR1cmUpIGZlYXR1cmVzLmdldChpKTsJCQkKLQkJCQlpZiAoIShwIGluc3RhbmNlb2YgRUF0dHJpYnV0ZSkgKSB7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCQlFQXR0cmlidXRlIGF0dHJpYiA9IChFQXR0cmlidXRlKXA7Ci0JCQkJU3RyaW5nIG5hbWUgPSBwLmdldE5hbWUoKTsKLQkJCQkJCQkJCQotCQkJCU9iamVjdCB2YWx1ZTsKLQkJCQlpZiAobmFtZS5lcXVhbHMoInByZXNlbnRhdGlvbk5hbWUiKSkgLy8kTk9OLU5MUy0xJAotCQkJCXsKLQkJCQkJLy8gdmFsdWUgPSBUbmdVdGlsLmdldFByZXNlbnRhdGlvbk5hbWUoZWxlbWVudCk7Ci0JCQkJCXZhbHVlID0gQ29uZmlndXJhdGlvbkhlbHBlci5nZXRQcmVzZW50YXRpb25OYW1lKGVsZW1lbnQsCi0JCQkJCQkJbGF5b3V0TWFuYWdlci5nZXRDb25maWd1cmF0aW9uKCkpOwotCQkJCX0gZWxzZSBpZiggaXNBY3Rpdml0eUF0dHJpYnV0ZSAmJiBTdHJpbmcuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShhdHRyaWIuZ2V0RUF0dHJpYnV0ZVR5cGUoKS5nZXRJbnN0YW5jZUNsYXNzKCkpKSB7Ci0JCQkJCQotCQkJCQkvLyBmb3IgYWN0aXZpdHksIHRoZSB3YXkgdG8gbWVyZ2UgYXR0cmlidXRlIGZyb20gYmFzZSBpcyBkaWZmZXJlbnQKLQkJCQkJdmFsdWUgPSBDb25maWd1cmF0aW9uSGVscGVyLmdldEFjdGl2aXR5U3RyaW5nQXR0cmlidXRlKGVsZW1lbnQsIG93bmVyRWxlbWVudCwgYXR0cmliLCBnZXRMYXlvdXRNZ3IoKS5nZXRDb25maWd1cmF0aW9uKCkpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXZhbHVlID0gZ2V0QXR0cmlidXRlRmVhdHVyZVZhbHVlKHApOwotCQkJCX0KLQkJCQkKLQkJCQkvLyBlc2NhcGUgQnJpZWYgRGVzY3JpcHRpb24gaW50byBIVE1MIGVudGl0aWVzCi0JCQkJaWYgKG5hbWUuZXF1YWxzKCJicmllZkRlc2NyaXB0aW9uIikgJiYgdmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQlNdWx0aUZpbGVYTUlTYXZlSW1wbC5NeUVzY2FwZSBteUVzY2FwZSA9IG5ldyBNdWx0aUZpbGVYTUlTYXZlSW1wbC5NeUVzY2FwZSgpOwotCQkJCQl2YWx1ZSA9IG15RXNjYXBlLmNvbnZlcnQoKFN0cmluZyl2YWx1ZSk7Ci0JCQkJCXZhbHVlID0gU3RyVXRpbC5jb252ZXJ0TmV3bGluZXNUb0hUTUwoKFN0cmluZyl2YWx1ZSk7Ci0JCQkJfQotCi0JCQkJZWxlbWVudFhtbAotCQkJCQkJLm5ld0NoaWxkKCJhdHRyaWJ1dGUiKS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCBuYW1lKS5zZXRWYWx1ZSgodmFsdWUgPT0gbnVsbCkgPyAiIiA6IHZhbHVlLnRvU3RyaW5nKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJfQotCQkJLy8gR2V0IHRoZSBzaW5nbGV0b24gb2YgdGhlIEVsZW1lbnRQcm9wZXJ0eVByb3ZpZGVyTWFuYWdlciBhbmQgaGF2ZSBpdCBhZGQgYW55IGFkZGl0aW9uYWwgYXR0cmlidXRlcyBhcyBuZWVkZWQKLQkJCUVsZW1lbnRQcm9wZXJ0eVByb3ZpZGVyTWFuYWdlci5nZXRJbnN0YW5jZSgpLmxvYWRBZGRpdGlvbmFsRWxlbWVudFByb3BlcnRpZXMoZWxlbWVudCwgZWxlbWVudFhtbCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBnZXQgdGhlIGF0dHJpYnV0ZSBmZWF0dXJlIHZhbHVlIGFuZCBtZXJnZSB0aGUgdGV4dCwgZml4IHVybCByZWZlcm5lY2VzLCBldGMuCi0JICogQHBhcmFtIGZlYXR1cmUgRVN0cnVjdHVyYWxGZWF0dXJlCi0JICogQHJldHVybiBPYmplY3QKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEF0dHJpYnV0ZUZlYXR1cmVWYWx1ZShFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSkgewotCQlPYmplY3QgdmFsdWUgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGNBdHRyaWJ1dGVGZWF0dXJlVmFsdWUoZWxlbWVudCwKLQkJCQlvd25lckVsZW1lbnQsIGZlYXR1cmUsIGxheW91dE1hbmFnZXIuZ2V0Q29uZmlndXJhdGlvbigpKTsKLQotCQkvLyBub3cgaWYgdGhlIHRhcmdldCBpcyBzZXQgYW5kIGlzIGRpZmZlcmVudCBmcm9tIHRoZSBlbGVtZW50IG9yIHRoZQotCQkvLyBlbGVtZW50J3Mgb3duZXIKLQkJLy8gdGhlbiBmaXggdGhlIGNvbnRlbnQKLQkJaWYgKCh0YXJnZXRFbGVtZW50ICE9IG51bGwpICYmICh2YWx1ZSAhPSBudWxsKQotCQkJCSYmICh2YWx1ZS50b1N0cmluZygpLmxlbmd0aCgpID4gMCkpIHsKLQkJCVN0cmluZyBjb250ZW50UGF0aCA9IFJlc291cmNlSGVscGVyCi0JCQkJCS5nZXRFbGVtZW50UGF0aCgoZWxlbWVudCBpbnN0YW5jZW9mIENvbnRlbnREZXNjcmlwdGlvbikgPyAKLQkJCQkJCQkoKG93bmVyRWxlbWVudD09bnVsbCkgPyAoTWV0aG9kRWxlbWVudCkgZWxlbWVudC5lQ29udGFpbmVyKCkgOiBvd25lckVsZW1lbnQpIAotCQkJCQkJCTogZWxlbWVudCk7Ci0KLQkJCVN0cmluZyBiYWNrUGF0aCA9IFJlc291cmNlSGVscGVyCi0JCQkJCS5nZXRCYWNrUGF0aCgodGFyZ2V0RWxlbWVudCBpbnN0YW5jZW9mIENvbnRlbnREZXNjcmlwdGlvbikgPyAoTWV0aG9kRWxlbWVudCkgdGFyZ2V0RWxlbWVudAotCQkJCQkJCS5lQ29udGFpbmVyKCkKLQkJCQkJCQk6IHRhcmdldEVsZW1lbnQpOwotCi0JCQl2YWx1ZSA9IFJlc291cmNlSGVscGVyLmZpeENvbnRlbnRVcmxQYXRoKHZhbHVlLnRvU3RyaW5nKCksCi0JCQkJCWNvbnRlbnRQYXRoLCBiYWNrUGF0aCk7Ci0KLQkJfQotCi0JCXJldHVybiB2YWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiBsb2FkIHRoZSBjb3B5cmlnaHQgdGV4dAotCSAqIEBwYXJhbSBlbGVtZW50WG1sIFhtbEVsZW1lbnQKLQkgKi8KLQlwdWJsaWMgdm9pZCBsb2FkQ29weXJpZ2h0KFhtbEVsZW1lbnQgZWxlbWVudFhtbCkgewotCi0JCS8vIExpc3QgaXRlbXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCS8vIENvbmZpZ3VyYXRpb25IZWxwZXIuY2FsY3VsYXRlQ29weXJpZ2h0KGVsZW1lbnQsCi0JCS8vIGxheW91dE1hbmFnZXIuZ2V0Q29uZmlndXJhdGlvbigpLCBpdGVtcyk7Ci0JCS8vIGlmICggaXRlbXMuc2l6ZSgpID4gMCApCi0JCS8vIHsKLQkJLy8gU3VwcG9ydGluZ01hdGVyaWFsIGNvcHlyaWdodDsKLQkJLy8gU3RyaW5nQnVmZmVyIGNvcHlyaWdodHMgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCS8vIGZvciAoIEl0ZXJhdG9yIGl0ID0gaXRlbXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOyApCi0JCS8vIHsKLQkJLy8gY29weXJpZ2h0ID0gKFN1cHBvcnRpbmdNYXRlcmlhbCkgaXQubmV4dCgpOwotCQkvLyBTdHJpbmcgc3RhdGVtZW50ID0gY29weXJpZ2h0LmdldFByZXNlbnRhdGlvbigpLmdldE1haW5EZXNjcmlwdGlvbigpOwotCQkvLwkJCQkJCQkKLQkJLy8gLy8gbmVlZCB0byBmaXggdGhlIGNvbnRlbnQgZm9yIHJlbGF0aXZlIGxpbmtzLgotCQkvLyAvLyBzaW5jZSB0aGUgbGluayBpcyBhIHJlbGF0aXZlIHBhdGggdG8gdGhlIFN1cHBvcnRpbmdNYXRlcmlhbAotCQkvLyBsb2NhdGlvbiwKLQkJLy8gLy8gbmVlZCB0byBjb252ZXJ0IHRvIHJlbGF0aXZlIHRvIHRoZSBjdXJyZW50IGVsZW1lbnQKLQkJLy8gLy8gc28gcmUtY2FsY3VhdGUgdGhlIGJhY2sgcGF0aAotCQkvLyAvLyBqeGksIDA2LzI4LzA1Ci0JCS8vIFN0cmluZyBjb250ZW50UGF0aCA9IFJlc291cmNlSGVscGVyLmdldEVsZW1lbnRQYXRoKGNvcHlyaWdodCk7Ci0JCS8vIFN0cmluZyBiYWNrUGF0aCA9IFJlc291cmNlSGVscGVyLmdldEJhY2tQYXRoKGVsZW1lbnQpOwotCQkvLyBzdGF0ZW1lbnQgPSBSZXNvdXJjZUhlbHBlci5maXhDb250ZW50VXJsUGF0aChzdGF0ZW1lbnQsIGNvbnRlbnRQYXRoLAotCQkvLyBiYWNrUGF0aCk7Ci0JCS8vIGNvcHlyaWdodHMuYXBwZW5kKHN0YXRlbWVudCk7Ci0JCS8vIH0KLQkJLy8JCQkKLQkJLy8gZWxlbWVudFhtbC5uZXdDaGlsZCgiY29weXJpZ2h0Iikuc2V0VmFsdWUoY29weXJpZ2h0cy50b1N0cmluZygpKTsKLQkJLy8gLy8kTk9OLU5MUy0xJAotCQkvLyB9Ci0KLQkJU3RyaW5nIGNvcHlyaWdodCA9IENvbmZpZ3VyYXRpb25IZWxwZXIuZ2V0Q29weXJpZ2h0VGV4dChlbGVtZW50LAotCQkJCWxheW91dE1hbmFnZXIuZ2V0Q29uZmlndXJhdGlvbigpKTsKLQkJaWYgKGNvcHlyaWdodCAhPSBudWxsICYmIGNvcHlyaWdodC5sZW5ndGgoKSA+IDApIHsKLQkJCWVsZW1lbnRYbWwubmV3Q2hpbGQoImNvcHlyaWdodCIpLnNldFZhbHVlKGNvcHlyaWdodCk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKgotCSAqIGNhbGN1bGF0ZSB0aGUgdG8tb25lIHJlZmVyZW5jZQotCSAqIEBwYXJhbSBlbGVtZW50WG1sIFhtbEVsZW1lbnQKLQkgKiBAcGFyYW0gaW5jbHVkZVJlZmVyZW5jZXMgYm9vbGVhbgotCSAqLwotCXB1YmxpYyB2b2lkIGNhbGN1bGF0ZTAxUmVmZXJlbmNlcyhYbWxFbGVtZW50IGVsZW1lbnRYbWwsCi0JCQlib29sZWFuIGluY2x1ZGVSZWZlcmVuY2VzKSB7Ci0JCUxpc3QgZmVhdHVyZXMgPSBMaWJyYXJ5VXRpbC5nZXRTdHJ1Y3R1cmFsRmVhdHVyZXMoZWxlbWVudCk7Ci0vLwkJTGlzdCBwcm9wZXJ0aWVzID0gZWxlbWVudC5nZXRJbnN0YW5jZVByb3BlcnRpZXMoKTsKLQkJaWYgKGZlYXR1cmVzICE9IG51bGwpIHsKLQkJCS8vIGdldCBlbGVtZW50IHJlZmVyZW5jZXMKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmVhdHVyZXMuc2l6ZSgpOyBpKyspIHsKLQkJCQlFU3RydWN0dXJhbEZlYXR1cmUgcCA9IChFU3RydWN0dXJhbEZlYXR1cmUpIGZlYXR1cmVzLmdldChpKTsKLQotCQkJCS8vIE9iamVjdCB2YWx1ZSA9IGVsZW1lbnQuZ2V0KGkpOwotCi0JCQkJRUNsYXNzaWZpZXIgdHlwZSA9IHAuZ2V0RVR5cGUoKTsKLQkJCQlpZiAoISh0eXBlIGluc3RhbmNlb2YgRUNsYXNzKSB8fCBwLmlzTWFueSgpKSB7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQotCQkJCWxvYWRGZWF0dXJlKHAsIGVsZW1lbnRYbWwsIGluY2x1ZGVSZWZlcmVuY2VzKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIGxvYWQgdGhlIG5vbi1hdHRyaWJ1dGUgZmVhdHVyZQotCSAqIAotCSAqIEBwYXJhbSBmZWF0dXJlCi0JICogQHBhcmFtIGVsZW1lbnRYbWwKLQkgKiBAcGFyYW0gaW5jbHVkZVJlZmVyZW5jZXMKLQkgKi8KLQlwdWJsaWMgdm9pZCBsb2FkRmVhdHVyZShFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgWG1sRWxlbWVudCBlbGVtZW50WG1sLAotCQkJYm9vbGVhbiBpbmNsdWRlUmVmZXJlbmNlcykgewotCQlnZXRGZWF0dXJlVmFsdWUoZmVhdHVyZSwgIGVsZW1lbnRYbWwsIGluY2x1ZGVSZWZlcmVuY2VzKTsKLQl9Ci0JCi0JLyoqCi0JICogbG9hZCB0aGUgbm9uLWF0dHJpYnV0ZSBmZWF0dXJlCi0JICogCi0JICogQHBhcmFtIGZlYXR1cmUKLQkgKiBAcGFyYW0gZWxlbWVudFhtbAotCSAqIEBwYXJhbSBpbmNsdWRlUmVmZXJlbmNlcwotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0RmVhdHVyZVZhbHVlKEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBYbWxFbGVtZW50IGVsZW1lbnRYbWwsCi0JCQlib29sZWFuIGluY2x1ZGVSZWZlcmVuY2VzKSB7Ci0JCQotCQlpZiAoIShmZWF0dXJlLmdldEVUeXBlKCkgaW5zdGFuY2VvZiBFQ2xhc3MpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCVN0cmluZyBuYW1lID0gZmVhdHVyZS5nZXROYW1lKCk7Ci0JCQotCQlpZiAoIWZlYXR1cmUuaXNNYW55KCkpIHsKLQkJCU1ldGhvZEVsZW1lbnQgZSA9IENvbmZpZ3VyYXRpb25IZWxwZXIuY2FsYzAxRmVhdHVyZVZhbHVlKGVsZW1lbnQsIG93bmVyRWxlbWVudCwKLQkJCQkJZmVhdHVyZSwgbGF5b3V0TWFuYWdlci5nZXRFbGVtZW50UmVhbGl6ZXIoKSk7Ci0JCQkvLyBCcm93c2luZyBzdG9wcyB3b3JraW5nIHdoZW4gYSByb2xlIGlzIHNldCB0bwotCQkJLy8gcmVwbGFjZWQgYW5vdGhlciByb2xlCi0JCQkvLyBmb3IgcmVwbGFjZXIsIHRoZSBiYXNlIHdpbGwgYmUgZXZhbHVhdGVkIHRvIHRoZSByZXBsYWNlcgotCQkJLy8gYW5kIGNhdXNpbmcgZGVhZGxvY2sKLQkJCWlmIChlICE9IG51bGwgJiYgZSAhPSBlbGVtZW50KSB7Ci0JCQkJYm9vbGVhbiBzaG93RGV0YWlsID0gKENvbmZpZ3VyYXRpb25IZWxwZXIKLQkJCQkJCS5pc0Rlc2NyaXB0aW9uRWxlbWVudChlKQotCQkJCS8qCi0JCQkJICogfHwgKHAgPT0KLQkJCQkgKiBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRNZXRob2RVbml0X0NvcHlyaWdodFN0YXRlbWVudCgpKQotCQkJCSAqLykgPyB0cnVlIDogaW5jbHVkZVJlZmVyZW5jZXM7Ci0JCQkJCi0JCQkJaWYgKCBhY2NlcHRGZWF0dXJlVmFsdWUoZmVhdHVyZSwgZSkgKSB7Ci0JCQkJCWlmICggZWxlbWVudFhtbCAhPSBudWxsICkgewotCQkJCQkJcHJvY2Vzc0NoaWxkKGZlYXR1cmUsIGVsZW1lbnRYbWwKLQkJCQkJCQkJCQkubmV3Q2hpbGQoVEFHX1JFRkVSRU5DRSkuc2V0QXR0cmlidXRlKCJuYW1lIiwgbmFtZSksIGUsIHNob3dEZXRhaWwpOyAvLyROT04tTkxTLTEkIAotCQkJCQl9Ci0JCQkJCQotCQkJCQlyZXR1cm4gZTsKLQkJCQl9IGVsc2UgewotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoZmVhdHVyZS5pc01hbnkoKSkgewotCQkJTGlzdCBwdiA9IGNhbGMwbkZlYXR1cmVWYWx1ZShlbGVtZW50LCBvd25lckVsZW1lbnQsIGZlYXR1cmUsCi0JCQkJCWxheW91dE1hbmFnZXIuZ2V0RWxlbWVudFJlYWxpemVyKCkpOwotCQkJaWYgKCBhY2NlcHRGZWF0dXJlVmFsdWUoZmVhdHVyZSwgcHYpICkgewotCQkJCWlmICggZWxlbWVudFhtbCAhPSBudWxsICkgewotCQkJCQlhZGRSZWZlcmVuY2VzKGZlYXR1cmUsIGVsZW1lbnRYbWwsIG5hbWUsIHB2KTsKLQkJCQl9Ci0JCQkJcmV0dXJuIHB2OwotCQkJfSBlbHNlIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIExpc3QgY2FsYzBuRmVhdHVyZVZhbHVlKE1ldGhvZEVsZW1lbnQgZWxlbWVudCwgTWV0aG9kRWxlbWVudCBvd25lckVsZW1lbnQsIAotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIEVsZW1lbnRSZWFsaXplciByZWFsaXplcikgewotCQlyZXR1cm4gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMG5GZWF0dXJlVmFsdWUoZWxlbWVudCwgb3duZXJFbGVtZW50LCBmZWF0dXJlLAotCQkJCWxheW91dE1hbmFnZXIuZ2V0RWxlbWVudFJlYWxpemVyKCkpOwotCX0JCi0JCi0JLyoqCi0JICogbG9hZCB0aGUgbm9uLWF0dHJpYnV0ZSBmZWF0dXJlCi0JICogCi0JICogQHBhcmFtIGZlYXR1cmUKLQkgKiBAcGFyYW0gZWxlbWVudFhtbAotCSAqIEBwYXJhbSBpbmNsdWRlUmVmZXJlbmNlcwotCSAqLwotCXB1YmxpYyB2b2lkIGxvYWRGZWF0dXJlKE9wcG9zaXRlRmVhdHVyZSBmZWF0dXJlLCBYbWxFbGVtZW50IGVsZW1lbnRYbWwsCi0JCQlib29sZWFuIGluY2x1ZGVSZWZlcmVuY2VzKSB7Ci0JCVN0cmluZyBuYW1lID0gZmVhdHVyZS5nZXROYW1lKCk7Ci0KLQkJaWYgKCFmZWF0dXJlLmlzTWFueSgpKSB7Ci0JCQlNZXRob2RFbGVtZW50IGUgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwMUZlYXR1cmVWYWx1ZShlbGVtZW50LAotCQkJCQlmZWF0dXJlLCBsYXlvdXRNYW5hZ2VyLmdldEVsZW1lbnRSZWFsaXplcigpKTsKLQkJCS8vIEJyb3dzaW5nIHN0b3BzIHdvcmtpbmcgd2hlbiBhIHJvbGUgaXMgc2V0IHRvCi0JCQkvLyByZXBsYWNlZCBhbm90aGVyIHJvbGUKLQkJCS8vIGZvciByZXBsYWNlciwgdGhlIGJhc2Ugd2lsbCBiZSBldmFsdWF0ZWQgdG8gdGhlIHJlcGxhY2VyCi0JCQkvLyBhbmQgY2F1c2luZyBkZWFkbG9jawotCQkJaWYgKGUgIT0gbnVsbCAmJiBlICE9IGVsZW1lbnQpIHsKLQkJCQlib29sZWFuIHNob3dEZXRhaWwgPSAoQ29uZmlndXJhdGlvbkhlbHBlcgotCQkJCQkJLmlzRGVzY3JpcHRpb25FbGVtZW50KGUpCi0JCQkJLyoKLQkJCQkgKiB8fCAocCA9PQotCQkJCSAqIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE1ldGhvZFVuaXRfQ29weXJpZ2h0U3RhdGVtZW50KCkpCi0JCQkJICovKSA/IHRydWUgOiBpbmNsdWRlUmVmZXJlbmNlczsKLQotCQkJCWlmICggYWNjZXB0RmVhdHVyZVZhbHVlKGZlYXR1cmUsIGUpICkKLQkJCQl7Ci0JCQkJCXByb2Nlc3NDaGlsZChmZWF0dXJlLCAKLQkJCQkJCQllbGVtZW50WG1sCi0JCQkJCQkJCQkubmV3Q2hpbGQoVEFHX1JFRkVSRU5DRSkuc2V0QXR0cmlidXRlKCJuYW1lIiwgbmFtZSksIGUsIHNob3dEZXRhaWwpOyAvLyROT04tTkxTLTEkIAotCQkJCX0KLQkJCX0KLQkJfSBlbHNlIGlmIChmZWF0dXJlLmlzTWFueSgpKSB7Ci0JCQlMaXN0IHB2ID0gY2FsYzBuRmVhdHVyZVZhbHVlKGVsZW1lbnQsIGZlYXR1cmUsCi0JCQkJCWxheW91dE1hbmFnZXIuZ2V0RWxlbWVudFJlYWxpemVyKCkpOwotCQkJaWYgKCBhY2NlcHRGZWF0dXJlVmFsdWUoZmVhdHVyZSwgcHYpICYmIHB2LnNpemUoKSA+IDApIHsKLQkJCQlhZGRSZWZlcmVuY2VzKGZlYXR1cmUsIGVsZW1lbnRYbWwsIG5hbWUsIHB2KTsKLQkJCX0KLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgTGlzdCBjYWxjMG5GZWF0dXJlVmFsdWUoTWV0aG9kRWxlbWVudCBlbGVtZW50LAotCQkJT3Bwb3NpdGVGZWF0dXJlIGZlYXR1cmUsIEVsZW1lbnRSZWFsaXplciByZWFsaXplcikgewotCQlyZXR1cm4gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMG5GZWF0dXJlVmFsdWUoZWxlbWVudCwgZmVhdHVyZSwKLQkJCQlsYXlvdXRNYW5hZ2VyLmdldEVsZW1lbnRSZWFsaXplcigpKTsKLQl9Ci0JCi0JLyoqCi0JICogbG9hZCByZWZlcmVuY2VzIGZvciB0aGUgZWxlbWVudAotCSAqIEBwYXJhbSBlbGVtZW50WG1sIFhtbEVsZW1lbnQKLQkgKiBAcGFyYW0gaW5jbHVkZVJlZmVyZW5jZXMgYm9vbGVhbgotCSAqLwotCXB1YmxpYyB2b2lkIGxvYWRSZWZlcmVuY2VzKFhtbEVsZW1lbnQgZWxlbWVudFhtbCwgYm9vbGVhbiBpbmNsdWRlUmVmZXJlbmNlcykgewotCQlMaXN0IGZlYXR1cmVzID0gTGlicmFyeVV0aWwuZ2V0U3RydWN0dXJhbEZlYXR1cmVzKGVsZW1lbnQpOwotLy8JCUxpc3QgcHJvcGVydGllcyA9IGVsZW1lbnQuZ2V0SW5zdGFuY2VQcm9wZXJ0aWVzKCk7Ci0JCWlmIChmZWF0dXJlcyAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGZlYXR1cmVzLnNpemUoKTsgaSsrKSB7Ci0JCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSAoRVN0cnVjdHVyYWxGZWF0dXJlKSBmZWF0dXJlcwotCQkJCQkJLmdldChpKTsKLQkJCQlpZiAoZmVhdHVyZS5nZXRFVHlwZSgpIGluc3RhbmNlb2YgRUNsYXNzKSB7Ci0JCQkJCWxvYWRGZWF0dXJlKGZlYXR1cmUsIGVsZW1lbnRYbWwsIGluY2x1ZGVSZWZlcmVuY2VzKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCUNvbGxlY3Rpb24gb3Bwb3NpdGVQcm9wZXJ0aWVzID0gbmV3IEFycmF5TGlzdChlbGVtZW50LmdldE9wcG9zaXRlRmVhdHVyZXMoKSk7Ci0JCWZvciAoSXRlcmF0b3Igej0gb3Bwb3NpdGVQcm9wZXJ0aWVzLml0ZXJhdG9yKCk7IHouaGFzTmV4dCgpOyApCi0JCXsKLQkJCU9wcG9zaXRlRmVhdHVyZSBvZmVhdHVyZSA9IChPcHBvc2l0ZUZlYXR1cmUpIHoubmV4dCgpOwotCQkJbG9hZEZlYXR1cmUob2ZlYXR1cmUsIGVsZW1lbnRYbWwsIGluY2x1ZGVSZWZlcmVuY2VzKTsKLQkJfQotCQkvL2VsZW1lbnRYbWwuc2V0QXR0cmlidXRlKCJTaG93RnVsbE1ldGhvZENvbnRlbnQiLCAobGF5b3V0TWFuYWdlci5nZXRWYWxpZGF0b3IoKS5zaG93RXh0cmFJbmZvRm9yRGVzY3JpcHRvcnMoKSkgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKLQl9Ci0KLQkvKioKLQkgKiBhZGQgdGhlIHJlZmVyZW5jZSBsYXlvdXQgdG8gdGhlIHJlc3VsdAotCSAqIEBwYXJhbSBmZWF0dXJlIE9iamVjdAotCSAqIEBwYXJhbSBlbGVtZW50WG1sIFhtbEVsZW1lbnQKLQkgKiBAcGFyYW0gcmVmZXJlbmNlTmFtZSBTdHJpbmcKLQkgKiBAcGFyYW0gZWxlbWVudCBNZXRob2RFbGVtZW50Ci0JICovCi0JcHVibGljIHZvaWQgYWRkUmVmZXJlbmNlKE9iamVjdCBmZWF0dXJlLCBYbWxFbGVtZW50IGVsZW1lbnRYbWwsIFN0cmluZyByZWZlcmVuY2VOYW1lLAotCQkJTWV0aG9kRWxlbWVudCBlbGVtZW50KSB7Ci0JCXByb2Nlc3NDaGlsZChmZWF0dXJlLCAKLQkJCQllbGVtZW50WG1sCi0JCQkJCQkubmV3Q2hpbGQoVEFHX1JFRkVSRU5DRSkuc2V0QXR0cmlidXRlKCJuYW1lIiwgcmVmZXJlbmNlTmFtZSksIGVsZW1lbnQsIGZhbHNlKTsgLy8kTk9OLU5MUy0xJCAKLQl9Ci0KLQkvKioKLQkgKiBhZGQgcmVmZXJlbmNlcyB0byB0aGUgbGF5b3V0Ci0JICogQHBhcmFtIGZlYXR1cmUKLQkgKiBAcGFyYW0gZWxlbWVudFhtbAotCSAqIEBwYXJhbSByZWZlcmVuY2VOYW1lCi0JICogQHBhcmFtIGl0ZW1zCi0JICovCi0JcHVibGljIHZvaWQgYWRkUmVmZXJlbmNlcyhPYmplY3QgZmVhdHVyZSwgWG1sRWxlbWVudCBlbGVtZW50WG1sLCBTdHJpbmcgcmVmZXJlbmNlTmFtZSwKLQkJCUxpc3QgaXRlbXMpIHsKLQkJaWYgKGl0ZW1zID09IG51bGwgfHwgaXRlbXMuaXNFbXB0eSgpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJSGFzaFNldDxPYmplY3Q+IGl0ZW1TZXQgPSBuZXcgSGFzaFNldDxPYmplY3Q+KCk7Ci0JCUxpc3QgdW5pcXVlSXRlbXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoT2JqZWN0IGl0ZW06IGl0ZW1zKSB7Ci0JCQlpZiAoISBpdGVtU2V0LmNvbnRhaW5zKGl0ZW0pKSB7Ci0JCQkJaXRlbVNldC5hZGQoaXRlbSk7Ci0JCQkJdW5pcXVlSXRlbXMuYWRkKGl0ZW0pOwotCQkJfQotCQl9Ci0JCXByb2Nlc3NDaGlsZChmZWF0dXJlLCAKLQkJCQllbGVtZW50WG1sCi0JCQkJCQkubmV3Q2hpbGQoVEFHX1JFRkVSRU5DRUxJU1QpLnNldEF0dHJpYnV0ZSgibmFtZSIsIHJlZmVyZW5jZU5hbWUpLCB1bmlxdWVJdGVtcywgZmFsc2UpOyAvLyROT04tTkxTLTEkIAotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LklFbGVtZW50TGF5b3V0I2dldFhtbEVsZW1lbnQoYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgWG1sRWxlbWVudCBnZXRYbWxFbGVtZW50KGJvb2xlYW4gaW5jbHVkZVJlZmVyZW5jZXMpIHsKLQkJWG1sRWxlbWVudCBlbGVtZW50WG1sID0gZ2V0WG1sRWxlbWVudCgpOwotCi0JCS8vIGxvYWQgdGhlIHJlZmVyZW5jZXMKLQkJaWYgKGluY2x1ZGVSZWZlcmVuY2VzKSB7Ci0KLQkJCS8vIGxvYWQgdGhlIGNvcHlyaWdodCBpbmZvCi0JCQlsb2FkQ29weXJpZ2h0KGVsZW1lbnRYbWwpOwotCi0JCQkvLyBsb2FkIHRoZSBhdHRyaWJ1dGVzCi0JCQlsb2FkQXR0cmlidXRlcyhlbGVtZW50WG1sKTsKLQotCQkJbG9hZFJlZmVyZW5jZXMoZWxlbWVudFhtbCwgZmFsc2UpOwotCQl9Ci0KLQkJcmV0dXJuIGVsZW1lbnRYbWw7Ci0JfQotCi0JLyoqCi0JICogc29tZSBsYXlvdXQgbmVlZCB0byBoYXZlIHRoZSBmZWF0dXJlIHZhbHVlcyBmb3IgZnVydGhlciBwcm9jZXNzaW5nLiBTbwotCSAqIHRoaXMgbWV0aG9kIHdpbGwgYmUgY2FsbGVkIHdoZW4gYSBmZWF0dXJlIGlzIGNhbGN1bGF0ZWQgaW4gdGhpcyBhYnN0cmFjdAotCSAqIGNsYXNzCi0JICogCi0JICogQHBhcmFtIG5hbWUKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHRGZWF0dXJlVmFsdWUoRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIE9iamVjdCB2YWx1ZSkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHRGZWF0dXJlVmFsdWUoT3Bwb3NpdGVGZWF0dXJlIGZlYXR1cmUsIE9iamVjdCB2YWx1ZSkgewotCQlpZiAoIGZlYXR1cmUgPT0gQXNzb2NpYXRpb25IZWxwZXIuRGVzY3JpYmFibGVFbGVtZW50X0N1c3RvbUNhdGVnb3JpZXMpIHsKLQkJCWlmICggdmFsdWUgaW5zdGFuY2VvZiBDdXN0b21DYXRlZ29yeSApIHsKLQkJCQlyZXR1cm4gZ2V0UHVibGlzaENhdGVnb3J5UHJvcGVydHkoKE1ldGhvZEVsZW1lbnQpdmFsdWUpOwotCQkJfSBlbHNlIGlmICggdmFsdWUgaW5zdGFuY2VvZiBMaXN0KSB7Ci0JCQkJTGlzdCBpdGVtcyA9IChMaXN0KXZhbHVlOwotCQkJCWludCBpID0gMDsKLQkJCQl3aGlsZSAoIGkgPCBpdGVtcy5zaXplKCkgKSB7Ci0JCQkJCU1ldGhvZEVsZW1lbnQgZSA9IChNZXRob2RFbGVtZW50KWl0ZW1zLmdldChpKTsKLQkJCQkJaWYgKCAhZ2V0UHVibGlzaENhdGVnb3J5UHJvcGVydHkoZSkgKSB7Ci0JCQkJCQlpdGVtcy5yZW1vdmUoaSk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlpKys7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJCQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JcHJpdmF0ZSBib29sZWFuIGdldFB1Ymxpc2hDYXRlZ29yeVByb3BlcnR5KE1ldGhvZEVsZW1lbnQgZSkgewotCQlNZXRob2RFbGVtZW50UHJvcGVydHkgcHJvcCA9IFRuZ1V0aWwuZ2V0UHVibGlzaENhdGVnb3J5UHJvcGVydHkoZSk7Ci0JCWlmICggcHJvcCA9PSBudWxsICkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCQotCQlTdHJpbmcgdiA9IHByb3AuZ2V0VmFsdWUoKTsKLQkJaWYgKCB2ID09IG51bGwgfHwgIXYudG9TdHJpbmcoKS5lcXVhbHMoInRydWUiKSApIHsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCi0JCXJldHVybiB0cnVlOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5JRWxlbWVudExheW91dCNnZXRTaGFwZWljb25VcmwoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U2hhcGVpY29uVXJsKCkgewotCQlVUkkgdXJpID0gbnVsbDsKLQkJU3RyaW5nIGltYWdlVXJsOwotCQkKLQkJLy8gU3RyaW5nIGltYWdlRmlsZTsKLQkJVmFyaWFiaWxpdHlFbGVtZW50IHVyaUluaGVyaXRpbmdCYXNlID0gbnVsbDsKLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBEZXNjcmliYWJsZUVsZW1lbnQpIHsKLQkJCXVyaSA9ICgoRGVzY3JpYmFibGVFbGVtZW50KSBlbGVtZW50KS5nZXRTaGFwZWljb24oKTsKLQotCQkJaWYgKHVyaSA9PSBudWxsICYmIGVsZW1lbnQgaW5zdGFuY2VvZiBWYXJpYWJpbGl0eUVsZW1lbnQpIHsKLQkJCQlWYXJpYWJpbGl0eUVsZW1lbnRbXSB1cmlJbmhlcml0aW5nQmFzZXMgPSBuZXcgVmFyaWFiaWxpdHlFbGVtZW50WzFdOwotCQkJCXVyaSA9IENvbmZpZ3VyYXRpb25IZWxwZXIuZ2V0SW5oZXJpdGluZ1VyaSgKLQkJCQkJCShEZXNjcmliYWJsZUVsZW1lbnQpIGVsZW1lbnQsIHVyaSwgdXJpSW5oZXJpdGluZ0Jhc2VzLAotCQkJCQkJZ2V0TGF5b3V0TWdyKCkuZ2V0Q29uZmlndXJhdGlvbigpLCAxKTsKLQkJCQl1cmlJbmhlcml0aW5nQmFzZSA9IHVyaUluaGVyaXRpbmdCYXNlc1swXTsKLQkJCX0KLQkJfQotCQlNZXRob2RFbGVtZW50IGVsZW1lbnQxID0gdXJpSW5oZXJpdGluZ0Jhc2UgPT0gbnVsbCA/IGVsZW1lbnQgOiB1cmlJbmhlcml0aW5nQmFzZTsKLQotCQlJTGlicmFyeVJlc291cmNlTWFuYWdlciByZXNNZ3IgPSBSZXNvdXJjZUhlbHBlci5nZXRSZXNvdXJjZU1ncihlbGVtZW50MSk7Ci0KLQkJaWYgKHVyaSA9PSBudWxsIHx8IHJlc01nciA9PSBudWxsICkgewotCQkJaW1hZ2VVcmwgPSBnZXREZWZhdWx0U2hhcGVpY29uVXJsKCk7Ci0JCX0gZWxzZSB7Ci0JCQlpbWFnZVVybCA9IE5ldFV0aWwuZGVjb2RlZEZpbGVVcmwodXJpLnRvU3RyaW5nKCkpOwotCQl9Ci0KLQkJLy8gbmVlZCB0byBjb3B5IHRoZSBpbWFnZSBmaWxlIGlmIGl0J3Mgbm90IGluIHRoZSBkZWZhdWx0IGRpcmVjdG9yeQotCQlpZiAoIWltYWdlVXJsLnN0YXJ0c1dpdGgoImltYWdlcy8iKSkgLy8kTk9OLU5MUy0xJAotCQl7Ci0JCQotCQkJLy8gRnJvbSBFUEYgMS4yLCBzaGFwZUljb24vbm9kZUljb24gc3RvcmVzIHVyaSByZWxhdGl2ZSB0byBwbHVnaW4gcGF0aC4gCi0JCQkvLyBCZWxvdyBzZWN0aW9uIG9mIGNvZGUgaXMgbmVjZXNzYXJ5IHRvIGFwcGVuZCBwbHVnaW4gbmFtZSB0byBzaGFwZUljb24vbm9kZUljb24gdXJpLgotCQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IFVtYVV0aWwuZ2V0TWV0aG9kUGx1Z2luKGVsZW1lbnQxKTsKLQkJCWlmKHBsdWdpbiAhPSBudWxsKXsKLQkJCQlpZighaW1hZ2VVcmwuc3RhcnRzV2l0aChwbHVnaW4uZ2V0TmFtZSgpKSApewotLy8JCQkJCVN0cmluZyBwbHVnaW5QYXRoID0gUmVzb3VyY2VIZWxwZXIuZ2V0UGx1Z2luUGF0aChlbGVtZW50KTsKLS8vCQkJCQlGaWxlIGZpbGUgPSBuZXcgRmlsZShwbHVnaW5QYXRoICsgRmlsZS5zZXBhcmF0b3IrIGltYWdlVXJsKTsKLS8vCQkJCQlpbWFnZVVybCA9IE5ldFV0aWwuZW5jb2RlRmlsZVVSTChGaWxlVXRpbC5nZXRSZWxhdGl2ZVBhdGgoZmlsZSwgCi0vLwkJCQkJCQluZXcgRmlsZShsaWJSb290KSkpOwotCQkJCQlpbWFnZVVybCA9IE5ldFV0aWwuZW5jb2RlRmlsZVVSTChwbHVnaW4uZ2V0TmFtZSgpICsgIi8iICsgaW1hZ2VVcmwpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfQotCQkJCi0JCQlpZiAoIHJlc01nciAhPSBudWxsICkgewotCQkJCS8vIG5lZWQgZGVjb2RlZCBVUkwgZm9yIGZpbGUgb3BzCi0JCQkJU3RyaW5nIGRlY29kZWRJbWFnZVVybCA9IE5ldFV0aWwuZGVjb2RlZEZpbGVVcmwoaW1hZ2VVcmwpOwotCQkJCUZpbGUgc291cmNlID0gbmV3IEZpbGUocmVzTWdyLnJlc29sdmUoZWxlbWVudDEsIGRlY29kZWRJbWFnZVVybCkpOwotCQkJCUZpbGUgZGVzdCA9IG5ldyBGaWxlKGdldExheW91dE1ncigpLmdldFB1Ymxpc2hEaXIoKSwgZGVjb2RlZEltYWdlVXJsKTsKLQkJCQlGaWxlVXRpbC5jb3B5RmlsZShzb3VyY2UsIGRlc3QpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGltYWdlVXJsOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LklFbGVtZW50TGF5b3V0I2dldE5vZGVpY29uVXJsKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5vZGVpY29uVXJsKCkgewotCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRTaGFwZWljb25VcmwoKSB7Ci0JCXJldHVybiBMYXlvdXRSZXNvdXJjZXMuZ2V0RGVmYXVsdFNoYXBlaWNvblVybChlbGVtZW50LmdldFR5cGUoKQotCQkJCS5nZXROYW1lKCkudG9Mb3dlckNhc2UoKSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuSUVsZW1lbnRMYXlvdXQjZ2V0RGlhZ3JhbWljb25VcmwoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGlhZ3JhbWljb25VcmwoKSB7Ci0JCXJldHVybiAiaWNvbnMvIiArIGVsZW1lbnQuZ2V0VHlwZSgpLmdldE5hbWUoKSArICIuZ2lmIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogdGhpcyBpcyBhIHNoYXJlZCBtZXRob2QgdG8gbG9hZCB0aGUgd29yayBvcmRlciBvZiB0aGUgd29yayBicmVha2Rvd24KLQkgKiBlbGVtZW50LiB3aWxsIGJlIHVzZWQgYnkgYWxsIHdvcmsgYnJlYWtkb3duIGVsZW1udCBsYXlvdXQuCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnRYbWwKLQkgKiAgICAgICAgICAgIFhtbEVsZW1lbnQgdGhlIHBhcmVudCB4bWwgZWxlbWVudCB0byBsb2FkIHRoZSB3b3JrIG9yZGVyCi0JICogICAgICAgICAgICBsYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBsb2FkV29ya09yZGVyKFhtbEVsZW1lbnQgZWxlbWVudFhtbCkgewotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldFdvcmtCcmVha2Rvd25FbGVtZW50X0xpbmtUb1ByZWRlY2Vzc29yKCk7Ci0KLQkJTGlzdCBpdGVtcyA9IENvbmZpZ3VyYXRpb25IZWxwZXIuY2FsYzBuRmVhdHVyZVZhbHVlKGVsZW1lbnQsIGZlYXR1cmUsCi0JCQkJbGF5b3V0TWFuYWdlci5nZXRFbGVtZW50UmVhbGl6ZXIoKSk7Ci0JCVhtbEVsZW1lbnQgcHJlZGVjZXNzb3JYbWwgPSBlbGVtZW50WG1sCi0JCQkJLm5ld0NoaWxkKFRBR19SRUZFUkVOQ0VMSVNUKS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCBmZWF0dXJlLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQgCi0JCWlmIChpdGVtcyAhPSBudWxsICYmIGl0ZW1zLnNpemUoKSA+IDApIHsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBpdGVtcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJV29ya09yZGVyIHdvID0gKFdvcmtPcmRlcikgaXQubmV4dCgpOwotCQkJCU1ldGhvZEVsZW1lbnQgbWUgPSAoTWV0aG9kRWxlbWVudCkgQ29uZmlndXJhdGlvbkhlbHBlcgotCQkJCQkJLmNhbGMwMUZlYXR1cmVWYWx1ZSh3bywgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJLmdldFdvcmtPcmRlcl9QcmVkKCksIGxheW91dE1hbmFnZXIKLQkJCQkJCQkJLmdldEVsZW1lbnRSZWFsaXplcigpKTsKLQkJCQlpZiAobWUgIT0gbnVsbCkgewotCQkJCQlJRWxlbWVudExheW91dCBsID0gZ2V0Q2hpbGRMYXlvdXQobWUpOwotCQkJCQlpZiAobCAhPSBudWxsKSB7Ci0JCQkJCQlwcmVkZWNlc3NvclhtbC5hZGRDaGlsZChsLmdldFhtbEVsZW1lbnQoZmFsc2UpKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkKLQkvKioKLQkgKiBzaG93IHRoZSBkZXNjcmlwdG9ycyBvZiB0aGUgbWV0aG9kIGVsZW1lbnQKLQkgKiBAcGFyYW0gZGVzY3JpcHRvcnMKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzRGVzY3JpcHRvcnMoWG1sRWxlbWVudCBlbGVtZW50WG1sKSB7Ci0JCQotCQkvLyAxODA1ODMgLSBQdWIgb3B0aW9ucyB0byBhbGxvdyBhZGRpbmcgKHdoZW4gcHVibGlzaGluZykgYWxsIGRlc2NyaXB0b3JzIHVuZGVyIGEgbWV0aG9kIGVsZW1lbnQgaW4gZm9ybSBvZiB0aGVpciBwYXRoCi0JCQotCQlpZiAoICFnZXRMYXlvdXRNZ3IoKS5nZXRWYWxpZGF0b3IoKS5zaG93UmVsYXRlZERlc2NyaXB0b3JzKCkgKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCS8vIHNob3cgdGhlIHJvbGUgZGVzY3JpcHRvcnMgcmVmZXJlbmNpbmcgdGhpcyByb2xlCi0JCU9wcG9zaXRlRmVhdHVyZSBvZiA9IG51bGw7Ci0JCQotCQlpZiAoIHRoaXMuZWxlbWVudCBpbnN0YW5jZW9mIFJvbGUgKSB7Ci0JCQlvZiA9IEFzc29jaWF0aW9uSGVscGVyLlJvbGVfUm9sZURlc2NyaXB0b3JzOwotCQl9IGVsc2UgaWYgKCB0aGlzLmVsZW1lbnQgaW5zdGFuY2VvZiBUYXNrICkgewotCQkJb2YgPSBBc3NvY2lhdGlvbkhlbHBlci5UYXNrX1Rhc2tEZXNjcmlwdG9yczsKLQkJfSBlbHNlIGlmICggdGhpcy5lbGVtZW50IGluc3RhbmNlb2YgV29ya1Byb2R1Y3QgKSB7Ci0JCQlvZiA9IEFzc29jaWF0aW9uSGVscGVyLldvcmtQcm9kdWN0X1dvcmtQcm9kdWN0RGVzY3JpcHRvcnM7Ci0JCX0KLQkJCQotCQlMaXN0IGRlc2NyaXB0b3JzID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMG5GZWF0dXJlVmFsdWUoCi0JCQkJdGhpcy5lbGVtZW50LCBvZiwKLQkJCQlsYXlvdXRNYW5hZ2VyLmdldEVsZW1lbnRSZWFsaXplcigpKTsKLQotCQkvLyBjcmVhdGUgYSBlbGVtZW50IG5vZGVzIGZvciBjZXNjcmlwdG9yIGxpc3QKLQkJWG1sRWxlbWVudCBkZXNjTGlzdFhtbCA9IGVsZW1lbnRYbWwubmV3Q2hpbGQoVEFHX1JFRkVSRU5DRUxJU1QpLnNldEF0dHJpYnV0ZSgibmFtZSIsICJkZXNjcmlwdG9ycyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCi0JCWFkZERlc2NyaXB0b3JzKGRlc2NyaXB0b3JzLCBkZXNjTGlzdFhtbCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZERlc2NyaXB0b3JzKExpc3QgZGVzY3JpcHRvcnMsIFhtbEVsZW1lbnQgZGVzY0xpc3RYbWwpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9ycy5zaXplKCk7IGkrKyApIHsKLQkJCURlc2NyaXB0b3IgZGVzYyA9IChEZXNjcmlwdG9yKWRlc2NyaXB0b3JzLmdldChpKTsKLQkJCUxpc3QgcGFyZW50cyA9IF9fZ2V0U3VwZXJBY3Rpdml0aWVzKGRlc2MpOwotCQkJYWRkRGVzY3JpcHRvcihkZXNjTGlzdFhtbCwgZGVzYywgcGFyZW50cywgdHJ1ZSk7CQkJCi0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkRGVzY3JpcHRvcihYbWxFbGVtZW50IGRlc2NMaXN0WG1sLCBEZXNjcmlwdG9yIGRlc2MsIExpc3QgcGFyZW50cywgYm9vbGVhbiB0b3BMZXZlbENhbGwpIHsKLQkJSUVsZW1lbnRMYXlvdXQgbGF5b3V0ID0gZ2V0Q2hpbGRMYXlvdXQoZGVzYyk7Ci0JCVhtbEVsZW1lbnQgZGVzY1htbCA9IGxheW91dC5nZXRYbWxFbGVtZW50KGZhbHNlKTsKLQkJZGVzY0xpc3RYbWwuYWRkQ2hpbGQoZGVzY1htbCk7Ci0JCQotCQkvL1Nob3cgZW50cnkvZXhpc3Qgc3RhdGUgdmFsdWVzCi0JCWlmIChkZXNjIGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yICYmIGxheW91dCBpbnN0YW5jZW9mIEFic3RyYWN0RWxlbWVudExheW91dCkgewotCQkJQWJzdHJhY3RFbGVtZW50TGF5b3V0IGFMYXlvdXQgPSAoQWJzdHJhY3RFbGVtZW50TGF5b3V0KSBsYXlvdXQ7Ci0JCQkKLQkJCUVBdHRyaWJ1dGUgYXR0OwotCQkJU3RyaW5nIHZhbHVlOwotCQkJYXR0ID0gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX0FjdGl2aXR5RW50cnlTdGF0ZSgpOwotCQkJdmFsdWUgPSAoU3RyaW5nKSBhTGF5b3V0LmdldEF0dHJpYnV0ZUZlYXR1cmVWYWx1ZShhdHQpOwotCQkJCi0JCQlpZiAodmFsdWUgIT0gbnVsbCAmJiB2YWx1ZS5sZW5ndGgoKSA+IDApIHsKLQkJCQlkZXNjWG1sCi0JCQkJLm5ld0NoaWxkKCJhdHRyaWJ1dGUiKS5zZXRBdHRyaWJ1dGUoYXR0LmdldE5hbWUoKSwgdmFsdWUpOyAvLyROT04tTkxTLTEkIAotCQkJfQotCQkJYXR0ID0gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX0FjdGl2aXR5RXhpdFN0YXRlKCk7Ci0JCQl2YWx1ZSA9IChTdHJpbmcpIGFMYXlvdXQuZ2V0QXR0cmlidXRlRmVhdHVyZVZhbHVlKGF0dCk7Ci0JCQlpZiAodmFsdWUgIT0gbnVsbCAmJiB2YWx1ZS5sZW5ndGgoKSA+IDApIHsKLQkJCQlkZXNjWG1sCi0JCQkJLm5ld0NoaWxkKCJhdHRyaWJ1dGUiKS5zZXRBdHRyaWJ1dGUoYXR0LmdldE5hbWUoKSwgdmFsdWUpOyAvLyROT04tTkxTLTEkIAotCQkJfQotCQl9Ci0JCQotCQlib29sZWFuIHRvUHJvY2Vzc0V4dGVuZGVkQWN0cyA9IHByb2Nlc3NEZXNjcml0b3JzTmV3T3B0aW9uCi0JCQkJJiYgdG9wTGV2ZWxDYWxsOwotCQlTZXQ8QWN0aXZpdHk+IHByb2Nlc3NlZEV4dGVuZGVkQWN0U2V0ID0gbnVsbDsKLQkJU2V0PEFjdGl2aXR5PiBhbGxMb2NhbEFjdFNldCA9IG51bGw7Ci0JCWlmICh0b1Byb2Nlc3NFeHRlbmRlZEFjdHMpIHsKLQkJCXByb2Nlc3NlZEV4dGVuZGVkQWN0U2V0ID0gbmV3IEhhc2hTZXQ8QWN0aXZpdHk+KCk7Ci0JCQlhbGxMb2NhbEFjdFNldCA9IGdldEFsbExvY2FsQWN0U2V0KHBhcmVudHMpOwotCQl9Ci0JCQotCQkvLyBMaXN0IHBhcmVudHMgPSBfX2dldFN1cGVyQWN0aXZpdGllcyhkZXNjKTsKLQkJZm9yIChpbnQgcCA9IDA7IHAgPCBwYXJlbnRzLnNpemUoKTsgcCsrKSB7Ci0JCQlBY3Rpdml0eSBhY3QgPSAoQWN0aXZpdHkpIHBhcmVudHMuZ2V0KHApOwotCQkJbGF5b3V0ID0gZ2V0Q2hpbGRMYXlvdXQoYWN0KTsKLQkJCVhtbEVsZW1lbnQgYWN0WG1sID0gbGF5b3V0LmdldFhtbEVsZW1lbnQoZmFsc2UpOwotCQkJZGVzY1htbC5hZGRDaGlsZChhY3RYbWwpOwotCQkJaWYgKHRvUHJvY2Vzc0V4dGVuZGVkQWN0cykgewotCQkJCXByb2Nlc3NFeHRlbmRlZEFjdChkZXNjLCBkZXNjTGlzdFhtbCwgcGFyZW50cywgcCwgYWN0LAotCQkJCQkJcHJvY2Vzc2VkRXh0ZW5kZWRBY3RTZXQsIGFsbExvY2FsQWN0U2V0KTsKLQkJCX0KLQkJfQotCX0KLQkKLQlwcml2YXRlIFNldCBnZXRBbGxMb2NhbEFjdFNldChMaXN0PEFjdGl2aXR5PiBiYXNlcykgewotCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IGdldExheW91dE1ncigpLmdldENvbmZpZ3VyYXRpb24oKTsKLQkJU2V0IHJldCA9IG5ldyBIYXNoU2V0PEFjdGl2aXR5PigpOwotCQlmb3IgKEFjdGl2aXR5IGFjdDogYmFzZXMpIHsKLQkJCXJldC5hZGRBbGwoQ29uZmlndXJhdGlvbkhlbHBlci5nZXRMb2NhbENvbnRyaWJ1dGVyc0FuZFJlcGxhY2VycyhhY3QsIGNvbmZpZykpOwotCQl9CQkKLQkJcmV0dXJuIHJldDsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHByb2Nlc3NFeHRlbmRlZEFjdChEZXNjcmlwdG9yIGRlc2MsIFhtbEVsZW1lbnQgZGVzY0xpc3RYbWwsCi0JCQlMaXN0IHBhcmVudHMsIGludCBwLCBBY3Rpdml0eSBhY3QsCi0JCQlTZXQ8QWN0aXZpdHk+IHByb2Nlc3NlZEV4dGVuZGVkQWN0U2V0LAotCQkJU2V0PEFjdGl2aXR5PiBhbGxMb2NhbEFjdFNldCkgewotCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IGdldExheW91dE1ncigpLmdldENvbmZpZ3VyYXRpb24oKTsKLQotCQlMaXN0IGFjdEV4dGVuZGVycyA9IENvbmZpZ3VyYXRpb25IZWxwZXIuZ2V0RXh0ZW5kZXJzKGFjdCwgY29uZmlnKTsKLQkJaWYgKCFhY3RFeHRlbmRlcnMuaXNFbXB0eSgpKSB7Ci0JCQlmb3IgKE9iamVjdCBvYmogOiBhY3RFeHRlbmRlcnMpIHsKLQkJCQlBY3Rpdml0eSBleHRBY3QgPSAoQWN0aXZpdHkpIG9iajsKLQkJCQlpZiAocHJvY2Vzc2VkRXh0ZW5kZWRBY3RTZXQuY29udGFpbnMoZXh0QWN0KSkgewotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJcHJvY2Vzc2VkRXh0ZW5kZWRBY3RTZXQuYWRkKGV4dEFjdCk7Ci0KLQkJCQlMaXN0PEFjdGl2aXR5PiBleHRlbmRlclBhcmVudHMgPSBfX2dldFN1cGVyQWN0aXZpdGllcyhleHRBY3QpOwotCQkJCWV4dGVuZGVyUGFyZW50cy5hZGQoZXh0QWN0KTsKLQkJCQkKLQkJCQlib29sZWFuIHRvQWRkID0gdHJ1ZTsKLQkJCQlpZiAocCA8IHBhcmVudHMuc2l6ZSgpIC0gMSkgewotCQkJCQlBY3Rpdml0eSBzdXBlckFjdCA9IGV4dEFjdDsKLQkJCQkJZm9yIChpbnQgcHAgPSBwICsgMTsgcHAgPCBwYXJlbnRzLnNpemUoKTsgcHArKykgewotCQkJCQkJQWN0aXZpdHkgcGFyZW50ID0gKEFjdGl2aXR5KSBwYXJlbnRzLmdldChwcCk7CQkJCQkJCi0JCQkJCQlwYXJlbnQgPSBjaGVja0xvY2FsQWN0KGFsbExvY2FsQWN0U2V0LCBzdXBlckFjdCwgcGFyZW50KTsKLQkJCQkJCWlmIChwYXJlbnQgIT0gbnVsbCkgewotCQkJCQkJCWV4dGVuZGVyUGFyZW50cy5hZGQocGFyZW50KTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJdG9BZGQgPSBmYWxzZTsKLQkJCQkJCQlicmVhazsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQkKLQkJCQlpZiAodG9BZGQpIHsKLQkJCQkJYWRkRGVzY3JpcHRvcihkZXNjTGlzdFhtbCwgZGVzYywgZXh0ZW5kZXJQYXJlbnRzLCBmYWxzZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQl9Ci0KLQkvLzEuIHJldHVybiBsb2NhbGx5IGNvbnRyaWJ1dGluZyBhY3QgaWYgc3VwZXJBY3QgaGFzIGEgQkUgbG9jYWxseSBjb250cmlidXRpbmcgdG8gcGFyZW50Ci0JLy8yLiByZXR1cm4gbnVsbCBpZiBpZiBzdXBlckFjdCBoYXMgYSBCRSBsb2NhbGx5IHJlcGxhY2luZyBwYXJlbnQKLQkvLzMuIHJldHVybiBwYXJlbnQgb3RoZXJ3aXNlCi0JcHJpdmF0ZSBBY3Rpdml0eSBjaGVja0xvY2FsQWN0KFNldDxBY3Rpdml0eT4gYWxsTG9jYWxBY3RTZXQsIEFjdGl2aXR5IHN1cGVyQWN0LAotCQkJQWN0aXZpdHkgcGFyZW50KSB7Ci0JCWZvciAoQnJlYWtkb3duRWxlbWVudCBiZSA6IHN1cGVyQWN0Ci0JCQkJLmdldEJyZWFrZG93bkVsZW1lbnRzKCkpIHsKLQkJCWlmIChiZSBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJQWN0aXZpdHkgYWN0QmUgPSAoQWN0aXZpdHkpIGJlOwotCQkJCWlmIChhbGxMb2NhbEFjdFNldC5jb250YWlucyhiZSkgJiYgCi0JCQkJCQlwYXJlbnQgPT0gYWN0QmUuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpKSB7Ci0JCQkJCWlmIChhY3RCZS5nZXRWYXJpYWJpbGl0eVR5cGUoKSA9PSBWYXJpYWJpbGl0eVR5cGUuTE9DQUxfUkVQTEFDRU1FTlQpIHsKLQkJCQkJCXJldHVybiBudWxsOwotCQkJCQl9Ci0JCQkJCWlmIChhY3RCZS5nZXRWYXJpYWJpbGl0eVR5cGUoKSA9PSBWYXJpYWJpbGl0eVR5cGUuTE9DQUxfQ09OVFJJQlVUSU9OKSB7Ci0JCQkJCQlyZXR1cm4gYWN0QmU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiBwYXJlbnQ7Ci0JfQotCQotCXByaXZhdGUgTGlzdCBfX2dldFN1cGVyQWN0aXZpdGllcyhCcmVha2Rvd25FbGVtZW50IGVsZW1lbnQpIHsKLQkJTGlzdCBpdGVtcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCi0JCS8vIGJ1aWxkIHRoZSBwYXJlbnQgbm9kZXMKLQkJQnJlYWtkb3duRWxlbWVudCBwYXJlbnQgPSBlbGVtZW50LmdldFN1cGVyQWN0aXZpdGllcygpOyAKLQkJd2hpbGUgKCBwYXJlbnQgIT0gbnVsbCApIHsKLQkJCQotCQkJLy8gbmVlZCB0byByZWFsaXplIHRoZSBhY3Rpdml0eSwgc28gdGhhdCB3ZSBnZXQgdGhlIGNvcnJlY3QgbGluayBhbmQgcGFyZW50IGxpbmtzCi0JCQkvLyAyMDQ3NDUgLSB3cm9uZyBwcm9jZXNzIHVzYWdlIHBhdGggZm9yIGNvbnRyaWJ1dGluZyBhY3Rpdml0aWVzCi0JCQlwYXJlbnQgPSAoQnJlYWtkb3duRWxlbWVudClDb25maWd1cmF0aW9uSGVscGVyLmdldENhbGN1bGF0ZWRFbGVtZW50KHBhcmVudCwgbGF5b3V0TWFuYWdlci5nZXRFbGVtZW50UmVhbGl6ZXIoKSk7Ci0JCQlpZiAoIHBhcmVudCA9PSBudWxsICkgewotCQkJCWJyZWFrOwotCQkJfQotCi0JCQlpdGVtcy5hZGQoMCwgcGFyZW50KTsKLQkJCWlmIChMaWJyYXJ5VXRpbC5pc1Byb2Nlc3MocGFyZW50KSApIHsKLQkJCQlicmVhazsKLQkJCX0KLQkJCXBhcmVudCA9IHBhcmVudC5nZXRTdXBlckFjdGl2aXRpZXMoKTsKLQkJfQotCi0JCXJldHVybiBpdGVtczsKLQl9Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNCcmVha2Rvd25FbGVtZW50X0d1aWRhbmNlcyhFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSkgewotCQlVbWFQYWNrYWdlIHVtYVBrZyA9IFVtYVBhY2thZ2UuZUlOU1RBTkNFOwotCQlpZiAoZmVhdHVyZSA9PSB1bWFQa2cuZ2V0QnJlYWtkb3duRWxlbWVudF9DaGVja2xpc3RzKCkpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWlmIChmZWF0dXJlID09IHVtYVBrZy5nZXRCcmVha2Rvd25FbGVtZW50X0NvbmNlcHRzKCkpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWlmIChmZWF0dXJlID09IHVtYVBrZy5nZXRCcmVha2Rvd25FbGVtZW50X0V4YW1wbGVzKCkpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWlmIChmZWF0dXJlID09IHVtYVBrZy5nZXRCcmVha2Rvd25FbGVtZW50X0d1aWRlbGluZXMoKSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0JCi0JCWlmIChmZWF0dXJlID09IHVtYVBrZy5nZXRCcmVha2Rvd25FbGVtZW50X1JldXNhYmxlQXNzZXRzKCkpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9CQotCQlpZiAoZmVhdHVyZSA9PSB1bWFQa2cuZ2V0QnJlYWtkb3duRWxlbWVudF9TdXBwb3J0aW5nTWF0ZXJpYWxzKCkpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9CQkKLQkJCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgRWxlbWVudExheW91dEV4dGVuZGVyIGdldEV4dGVuZGVyKCkgewotCQlpZiAoZXh0ZW5kZXIgPT0gbnVsbCkgewotCQkJZXh0ZW5kZXIgPSBDb25maWd1cmF0aW9uSGVscGVyLmdldERlbGVnYXRlKCkubmV3RWxlbWVudExheW91dEV4dGVuZGVyKHRoaXMpOwotCQl9Ci0JCXJldHVybiBleHRlbmRlcjsKLQl9Ci0JCi0JcHJvdGVjdGVkIExpc3Q8TWV0aG9kRWxlbWVudD4gZ2V0VGFnUXVhbGlmaWVkTGlzdChNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZywgTGlzdDxNZXRob2RFbGVtZW50PiBpdGVtcykgewotCQlFbGVtZW50TGF5b3V0RXh0ZW5kZXIgZXh0ZW5kZXIgPSBnZXRFeHRlbmRlcigpOwotCQlpZiAoZXh0ZW5kZXIgPT0gbnVsbCkgewotCQkJcmV0dXJuIGl0ZW1zOwotCQl9Ci0JCQotCQlyZXR1cm4gZXh0ZW5kZXIuZ2V0VGFnUXVhbGlmaWVkTGlzdChjb25maWcsIGl0ZW1zKTsKLQl9Ci0JCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9lbGVtZW50cy9BYnN0cmFjdFByb2Nlc3NFbGVtZW50TGF5b3V0LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L2VsZW1lbnRzL0Fic3RyYWN0UHJvY2Vzc0VsZW1lbnRMYXlvdXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2EwMjVmMy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L2VsZW1lbnRzL0Fic3RyYWN0UHJvY2Vzc0VsZW1lbnRMYXlvdXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuZWxlbWVudHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWRBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5JQlNJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlByb2Nlc3NVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5TdXBwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuRWxlbWVudExheW91dE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LklFbGVtZW50TGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC51dGlsLlhtbEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5MaWJyYXJ5VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzOwotCi1pbXBvcnQgY29tLmlibS5pY3UudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLQotLyoqCi0gKiBhYnN0cmN0IGNsYXNzIGZvciBwcm9jZXNzIGVsZW1lbnQgbGF5b3V0IHRoYXQgaXMgcHJvY2VzcyBzcGVjaWZpYwotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RQcm9jZXNzRWxlbWVudExheW91dCBleHRlbmRzCi0JCUFic3RyYWN0RWxlbWVudExheW91dCB7Ci0KLQlwcm90ZWN0ZWQgUHJvY2VzcyBvd25pbmdQcm9jZXNzID0gbnVsbDsKLQotCXByb3RlY3RlZCBTdHJpbmcgZWxlbWVudFByb2Nlc3NQYXRoID0gbnVsbDsKLQlwcm90ZWN0ZWQgU3RyaW5nIHJlbFByb2Nlc3NQYXRoID0gbnVsbDsKLQlwcm90ZWN0ZWQgU3RyaW5nW10gcGF0aHMgPSBudWxsOwotCXByb3RlY3RlZCBTdHJpbmcgZGlzcGxheU5hbWUgPSBudWxsOwotCQotCS8qKgotCSAqIGNvbnN0cnVjdCBhIGxheW91dCBmb3IgcHJvY2VzcyBlbGVtZW50Ci0JICogCi0JICogQHBhcmFtIGxheW91dE1hbmFnZXIKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqIEBwYXJhbSBvd25pbmdQcm9jCi0JICogQHBhcmFtIHBhdGgKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KEVsZW1lbnRMYXlvdXRNYW5hZ2VyIGxheW91dE1hbmFnZXIsIE1ldGhvZEVsZW1lbnQgZWxlbWVudCwKLQkJCVByb2Nlc3Mgb3duaW5nUHJvYywgU3RyaW5nIHBhdGgpIHsKLQotCQlpbml0KGxheW91dE1hbmFnZXIsIGVsZW1lbnQpOwotCi0JCXRoaXMub3duaW5nUHJvY2VzcyA9IG93bmluZ1Byb2M7Ci0JCXRoaXMuZWxlbWVudFByb2Nlc3NQYXRoID0gcGF0aDsKLQotCQlpZiAodGhpcy5vd25pbmdQcm9jZXNzID09IG51bGwpIHsKLQkJCXRoaXMub3duaW5nUHJvY2VzcyA9IFRuZ1V0aWwKLQkJCQkJLmdldE93bmluZ1Byb2Nlc3MoKEJyZWFrZG93bkVsZW1lbnQpIHN1cGVyLmVsZW1lbnQpOwotCQl9Ci0KLQkJaWYgKExpYnJhcnlVdGlsLmlzUHJvY2VzcyhlbGVtZW50KSkgewotCQkJb3duaW5nUHJvY2VzcyA9IChQcm9jZXNzKSBlbGVtZW50OwotCQkJZWxlbWVudFByb2Nlc3NQYXRoID0gQWJzdHJhY3RQcm9jZXNzRWxlbWVudExheW91dC5tYWtlUGF0aChudWxsLAotCQkJCQllbGVtZW50KTsKLQkJCXJlbFByb2Nlc3NQYXRoID0gZWxlbWVudFByb2Nlc3NQYXRoOwotCQl9Ci0JCQotCQlpZiAoIGVsZW1lbnRQcm9jZXNzUGF0aCA9PSBudWxsICYmIHRoaXMuZWxlbWVudCBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnQpCi0JCXsKLQkJCWVsZW1lbnRQcm9jZXNzUGF0aCA9IEFic3RyYWN0UHJvY2Vzc0VsZW1lbnRMYXlvdXQuZ2V0UGF0aCgoQnJlYWtkb3duRWxlbWVudCl0aGlzLmVsZW1lbnQpOwotCQl9Ci0JCQotCQkvLyBnZXQgdGhlIHBhdGggYXJyYXkKLQkJcGF0aHMgPSBnZXRQYXRoQXJyYXkoZWxlbWVudFByb2Nlc3NQYXRoKTsKLQkJCi0JfQotCi0KLQkvKioKLQkgKiB0aGUgcHJvY2VzcyBwYXRoIG9mIHRoaXMgaXRlbSByZWxhdGl2ZSB0byB0aGUgY2FsbGluZyBpdGVtCi0JICogQHBhcmFtIHBhdGgKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZWxhdGl2ZVByb2Nlc3NQYXRoKFN0cmluZyBwYXRoKQotCXsKLQkJdGhpcy5yZWxQcm9jZXNzUGF0aCA9IHBhdGg7Ci0JfQotCQotCS8qKgotCSAqIGdldCB0aGUgcmVsYXRpdmUgcHJvY2VzcyBwYXRoCi0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFJlbGF0aXZlUHJvY2Vzc1BhdGgoKQotCXsKLQkJcmV0dXJuIHRoaXMucmVsUHJvY2Vzc1BhdGg7Ci0JfQotCQotLy8JcHVibGljIFN0cmluZyBnZXRVcmwoKSB7Ci0vLwkJU3RyaW5nIHVybCA9IHN1cGVyLmdldFVybCgpOwotLy8KLS8vCQlyZXR1cm4gdXJsICsgZ2V0UXVlcnlTdHJpbmcoKTsKLS8vCX0KLQotCS8qKgotCSAqIGdldCBxdWVyeSBzdHJpbmcgZm9yIHRoZSBwcm9jZXNzIGVsZW1lbnQKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UXVlcnlTdHJpbmcoKSB7Ci0vLwkJaWYgKG93bmluZ1Byb2Nlc3MgPT0gZWxlbWVudCkgewotLy8JCQlyZXR1cm4gIiI7Ci0vLwkJfQotCQkvLyByZXR1cm4gIj8iICsgUmVzb3VyY2VIZWxwZXIuVVJMX1BBUkFNRVRFUl9QUk9DRVNTICsgIj0iICsKLQkJLy8gb3duaW5nUHJvY2Vzcy5nZXRHdWlkKCkgKyAiJiIgKyBSZXNvdXJjZUhlbHBlci5VUkxfUEFSQU1FVEVSX1BBVEggKwotCQkvLyAiPSIgKyBlbGVtZW50UHJvY2Vzc1BhdGg7Ci0KLQkJcmV0dXJuIEVsZW1lbnRMYXlvdXRNYW5hZ2VyLmdldFF1ZXJ5U3RyaW5nKG93bmluZ1Byb2Nlc3MuZ2V0R3VpZCgpLAotCQkJCWVsZW1lbnRQcm9jZXNzUGF0aCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuSUVsZW1lbnRMYXlvdXQjZ2V0RGlzcGxheU5hbWUoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGlzcGxheU5hbWUoKSB7Ci0JCWlmICggdGhpcy5kaXNwbGF5TmFtZSA9PSBudWxsICkgewotCQkJUHJvY2VzcyBwcm9jID0gZ2V0T3duaW5nUHJvY2VzcygpOwotCQkJCi0JCQkvLyBuZWVkIHRvIGhhbmRsZSB0aGUgc3VwcmVzc2VkIGJyZWFrZG93biBlbGVtZW50cwotCQkJLy8gdXNlIHRoZSBTdXByZXNzIHV0aWxpdHkKLQkJCVN1cHByZXNzaW9uIHN1cCA9IGdldFN1cHByZXNzaW9uKHByb2MpOwotCQotCQkJLy8gZGlzcGxheSBuYW1lIG5lZWRzIHRvIGJlIGZpeGVkLCBleHRlbmRlZCBhY3Rpdml0eSBtYXkgbmVlZCB0byBnZXQgZGlzcGxheSBuYW1lIGZyb20gdGhlIGJhc2UKLQkJCS8vIERWVDogIFBOcyBvZiBleHRlbmRlZCBwcm9jZXNzZXMgbm8gcGlja2VkIHVwIGZvciBwdWJsaXNoIChUQ1QgNjM4KQotCQkJQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSA9IGxheW91dE1hbmFnZXIuZ2V0Q0JTQWRhcHRlckZhY3RvcnkoKTsKLQkJCU9iamVjdCB3cmFwcGVyID0gc3VwLmdldE9iamVjdEJ5UGF0aCh0aGlzLnBhdGhzLCBhZGFwdGVyRmFjdG9yeSk7Ci0JCQlpZiAoIHdyYXBwZXIgPT0gbnVsbCApIHsKLQkJCQl3cmFwcGVyID0gc3VwZXIuZWxlbWVudDsKLQkJCX0KLQkKLQkJCUlCU0l0ZW1Qcm92aWRlciBhZGFwdGVyID0gKElCU0l0ZW1Qcm92aWRlcikgYWRhcHRlckZhY3RvcnkuYWRhcHQoCi0JCQkJCXdyYXBwZXIsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCi0JCQl0aGlzLmRpc3BsYXlOYW1lID0gUHJvY2Vzc1V0aWwuZ2V0QXR0cmlidXRlKGVsZW1lbnQsCi0JCQkJCUlCU0l0ZW1Qcm92aWRlci5DT0xfUFJFU0VOVEFUSU9OX05BTUUsIGFkYXB0ZXIpOwotCQl9Ci0JCQotCQlyZXR1cm4gZGlzcGxheU5hbWU7Ci0JfQotCQotCXByb3RlY3RlZCBTdXBwcmVzc2lvbiBnZXRTdXBwcmVzc2lvbihQcm9jZXNzIHByb2MpCi0JewotCQlyZXR1cm4gbGF5b3V0TWFuYWdlci5nZXRTdXBwcmVzc2lvbihwcm9jKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFhtbEVsZW1lbnQgZ2V0WG1sRWxlbWVudCgpIHsKLQkJWG1sRWxlbWVudCBlbGVtZW50WG1sID0gc3VwZXIuZ2V0WG1sRWxlbWVudCgpOwotCQllbGVtZW50WG1sLnNldEF0dHJpYnV0ZSgicXVlcnlTdHJpbmciLCBnZXRRdWVyeVN0cmluZygpKSAvLyROT04tTkxTLTEkCi0JCQkvLy5zZXRBdHRyaWJ1dGUoIm93bmluZ1Byb2Nlc3NHdWlkIiwgb3duaW5nUHJvY2Vzcy5nZXRHdWlkKCkpIC8vIC8vJE5PTi1OTFMtMSQKLQkJCS8vLnNldEF0dHJpYnV0ZSgiZWxlbWVudFByb2Nlc3NQYXRoIiwgZWxlbWVudFByb2Nlc3NQYXRoKSAvLyROT04tTkxTLTEkCi0JCQkuc2V0QXR0cmlidXRlKCJyZWxQcm9jZXNzUGF0aCIsIHJlbFByb2Nlc3NQYXRoKTsgLy8kTk9OLU5MUy0xJAotCi0JCXJldHVybiBlbGVtZW50WG1sOwotCX0KLQkKLQlwcm90ZWN0ZWQgUHJvY2VzcyBnZXRPd25pbmdQcm9jZXNzKCkgewotCQlyZXR1cm4gb3duaW5nUHJvY2VzczsKLQl9Ci0KLQlwcm90ZWN0ZWQgSUVsZW1lbnRMYXlvdXQgZ2V0TGF5b3V0KFByb2Nlc3NFbGVtZW50SXRlbSBpdGVtKSB7Ci0JCUlFbGVtZW50TGF5b3V0IGxheW91dCA9IGxheW91dE1hbmFnZXIuY3JlYXRlTGF5b3V0KGl0ZW0uZWxlbWVudCwgb3duaW5nUHJvY2VzcywgaXRlbS5wYXRoKTsKLQkJCi0JCWlmICggbGF5b3V0IGluc3RhbmNlb2YgQWJzdHJhY3RQcm9jZXNzRWxlbWVudExheW91dCApCi0JCXsJCQotCQkJLy8gc2V0IHRoZSByZWxhdGl2ZSBwYXRoIHRvIHRoaXMgbGF5b3V0IHNpbmNlIHRoaXMgaXMgdGhlIGNhbGxlcgotCQkJU3RyaW5nIHJlbFBhdGggPSBBYnN0cmFjdFByb2Nlc3NFbGVtZW50TGF5b3V0LmdldFJlbGF0aXZlUGF0aChpdGVtLnBhdGgsIHRoaXMuZWxlbWVudFByb2Nlc3NQYXRoKTsKLQkJCSgoQWJzdHJhY3RQcm9jZXNzRWxlbWVudExheW91dClsYXlvdXQpLnNldFJlbGF0aXZlUHJvY2Vzc1BhdGgocmVsUGF0aCk7Ci0JCX0KLQkJcmV0dXJuIGxheW91dDsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFN1cGVyQWN0aXZpdHlQYXRoKCkgewotCQlpZiAoIGVsZW1lbnQgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50ICkgewotCQkJQWN0aXZpdHkgYWN0ID0gKChCcmVha2Rvd25FbGVtZW50KWVsZW1lbnQpLmdldFN1cGVyQWN0aXZpdGllcygpOwotCQkJU3RyaW5nIGlkID0gYWN0LmdldEd1aWQoKTsKLQkJCWludCBpID0gZWxlbWVudFByb2Nlc3NQYXRoLmluZGV4T2YoaWQpOwotCQkJaWYgKCBpID49MCApIHsKLQkJCQlyZXR1cm4gZWxlbWVudFByb2Nlc3NQYXRoLnN1YnN0cmluZygwLCBpICsgaWQubGVuZ3RoKCkpOwotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogc3RhdGljIHV0aWxpdHkgbWV0aG9kcyBmb3IgbWFrZSBhIHBhdGggZm9yIHRoZSBwcm9jZXNzIGVsZW5tZW50Ci0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbWFrZVBhdGgoU3RyaW5nIHBhcmVudFBhdGgsIE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgewotCQlpZiAocGFyZW50UGF0aCA9PSBudWxsIHx8IHBhcmVudFBhdGgubGVuZ3RoKCkgPT0gMCkgewotCQkJcmV0dXJuIGVsZW1lbnQuZ2V0R3VpZCgpOwotCQl9Ci0KLQkJcmV0dXJuIHBhcmVudFBhdGggKyAiLCIgKyBlbGVtZW50LmdldEd1aWQoKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIHN0YXRpYyBtZXRob2QgdG8gZ2V0IHRoZSBwYXRoIG9mIGEgYnJlYWsgZG93biBlbGVtZW50Ci0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFBhdGgoQnJlYWtkb3duRWxlbWVudCBlbGVtZW50KSB7Ci0JCQotCQlTdHJpbmcgcGF0aCA9IGVsZW1lbnQuZ2V0R3VpZCgpOwotCQlCcmVha2Rvd25FbGVtZW50IGFjdCA9IGVsZW1lbnQ7Ci0JCVByb2Nlc3MgcHJvYyA9IFRuZ1V0aWwuZ2V0T3duaW5nUHJvY2VzcyhlbGVtZW50KTsKLQotCQkvLyBDaGVjayBzdXBlcmFjdGl2aXR5IGlzIHByb2Nlc3MgYW5kIHNob3VsZCBvd25pbmcgcHJvY2VzcyAodGhpcyBpcyB1c2VmdWwgaW4gZGVlcGNvcHkKLQkJd2hpbGUgKCBhY3QgIT0gcHJvYyApCi0JCXsKLQkJCUFjdGl2aXR5IHN1cGVyQWN0cyA9IGFjdC5nZXRTdXBlckFjdGl2aXRpZXMoKTsKLQkJCWlmICggc3VwZXJBY3RzICE9IG51bGwgKQotCQkJewotCQkJCWFjdCA9IHN1cGVyQWN0czsKLQkJCQlwYXRoID0gYWN0LmdldEd1aWQoKSArICIsIiArIHBhdGg7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIHBhdGg7CQkKLQl9Ci0JCi0JLyoqCi0JICogZ2V0IHRoZSBwYXRoIGZvciBhIGdpdmVuIGJyZWFrZG93biBlbGVtZW50IGl0ZW0gcHJvdmlkZXIKLQkgKiBAcGFyYW0gd3JhcHBlciBCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcgotCSAqIEByZXR1cm4gU3RyaW5nIHRoZSBwYXRoCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UGF0aChCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlciB3cmFwcGVyKQotCXsKLQkJT2JqZWN0IGUgPSBMaWJyYXJ5VXRpbC51bndyYXAod3JhcHBlcik7Ci0JCWlmICggIShlIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlPYmplY3QgdG9wSXRlbSA9IHdyYXBwZXIuZ2V0VG9wSXRlbSgpOwotCQlTdHJpbmdCdWZmZXIgcGF0aCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJcGF0aC5hcHBlbmQoKChNZXRob2RFbGVtZW50KWUpLmdldEd1aWQoKSk7Ci0JCQotCQlPYmplY3QgcGFyZW50ID0gd3JhcHBlcjsKLQkJd2hpbGUgKHBhcmVudCAhPSBudWxsICYmIHBhcmVudCAhPSB0b3BJdGVtKSB7Ci0JCQlpZiAoIHBhcmVudCBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnQgKSB7Ci0JCQkJcGFyZW50ID0gKChCcmVha2Rvd25FbGVtZW50KXBhcmVudCkuZ2V0U3VwZXJBY3Rpdml0aWVzKCk7Ci0JCQkJZSA9IHBhcmVudDsKLQkJCX0gZWxzZSBpZiAoIHBhcmVudCBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyICl7Ci0JCQkJcGFyZW50ID0gKChCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcilwYXJlbnQpLmdldFBhcmVudChwYXJlbnQpOwotCQkJCWUgPSBMaWJyYXJ5VXRpbC51bndyYXAocGFyZW50KTsKLQkJCX0gZWxzZSB7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQkKLQkJCWlmICggZSBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCQlwYXRoLmluc2VydCgwLCAoKE1ldGhvZEVsZW1lbnQpZSkuZ2V0R3VpZCgpICsgIiwiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gcGF0aC50b1N0cmluZygpOwotCX0KLQkKLQkvKioKLQkgKiB1dGlsaXR5IG1ldGhvZCB0byBnZXQgdGhlIHJlbGF0aXZlIHBhdGggdG8gdGhlIHBhcmVudAotCSAqIEBwYXJhbSBwYXRoIFN0cmluZwotCSAqIEBwYXJhbSBwYXJlbnRQYXRoIFN0cmluZwotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UmVsYXRpdmVQYXRoKFN0cmluZyBwYXRoLCBTdHJpbmcgcGFyZW50UGF0aCkgewotCQkKLQkJaWYgKCBwYXRoID09IG51bGwgKQotCQl7Ci0JCQlyZXR1cm4gcGF0aDsKLQkJfQotCQkKLQkJaWYgKCBwYXRoLnN0YXJ0c1dpdGgocGFyZW50UGF0aCkgKQotCQl7Ci0JCQlyZXR1cm4gcGF0aC5zdWJzdHJpbmcocGFyZW50UGF0aC5sZW5ndGgoKSk7Ci0JCX0KLQkJCi0JCXJldHVybiBwYXRoOwotCX0KLQotCS8qKgotCSAqIGdldCB0aGUgcGF0aCBhcnJyYXkKLQkgKiBAcGFyYW0gcGF0aCBTdHJpbmcKLQkgKiBAcmV0dXJuIFN0cmluZ1tdCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmdbXSBnZXRQYXRoQXJyYXkoU3RyaW5nIHBhdGgpCi0JewotCQlpZiAoIHBhdGggPT0gbnVsbCApCi0JCXsKLQkJCXJldHVybiBuZXcgU3RyaW5nW117fTsJCQkKLQkJfQotCQkKLQkJTGlzdCBpdGVtcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJU3RyaW5nVG9rZW5pemVyIHN0ID0gbmV3IFN0cmluZ1Rva2VuaXplcihwYXRoLCAiLCIpOyAvLyROT04tTkxTLTEkCi0JCXdoaWxlICggc3QuaGFzTW9yZVRva2VucygpICkKLQkJewotCQkJU3RyaW5nIHMgPSBzdC5uZXh0VG9rZW4oKS50cmltKCk7Ci0JCQlpZiAoIHMubGVuZ3RoKCkgPiAwICkKLQkJCXsKLQkJCQlpdGVtcy5hZGQocyk7Ci0JCQl9Ci0JCX0KLQkJCi0JCVN0cmluZ1tdIGFyciA9IG5ldyBTdHJpbmdbaXRlbXMuc2l6ZSgpXTsKLQkJaXRlbXMudG9BcnJheShhcnIpOwotCQkKLQkJcmV0dXJuIGFycjsKLQl9Ci0JCi0JLyoqCi0JICogZ2V0IHRoZSBvd25pbmcgcHJvY2VzcyBmcm9tIHBhdGgsIHRoZSBmaXJzdCBwYXJ0IG9mIHRoZSBwYXRoIGlzIHRoZSBndWlkIG9mIHRoZSBwcm9jZXNzCi0JICogQHBhcmFtIHBhdGgKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE93bmluZ1Byb2Nlc3NHdWlkRnJvbVBhdGgoU3RyaW5nIHBhdGgpCi0JewotCQlpZiAoIHBhdGggPT0gbnVsbCApCi0JCXsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCQotCQlpbnQgaW5kZXggPSBwYXRoLmluZGV4T2YoIiwiKTsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgZ3VpZDsKLQkJaWYgKCBpbmRleCA8IDAgKQotCQl7Ci0JCQlndWlkID0gcGF0aDsKLQkJfQotCQllbHNlCi0JCXsKLQkJCWd1aWQgPSBwYXRoLnN1YnN0cmluZygwLCBpbmRleCk7Ci0JCX0KLQkJCi0JCXJldHVybiBndWlkOwotCX0KLQotCS8qKgotCSAqIGdldCB0aGUgcGFyZW50IHBhdGgKLQkgKiBAcGFyYW0gcGF0aAotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UGFyZW50UGF0aChTdHJpbmcgcGF0aCkgewotCQlpZiAoIHBhdGggPT0gbnVsbCApIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCQotCQlpbnQgaW5kZXggPSBwYXRoLmxhc3RJbmRleE9mKCIsIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKCBpbmRleCA+IDAgKSB7Ci0JCQlyZXR1cm4gcGF0aC5zdWJzdHJpbmcoMCwgaW5kZXgpOwotCQl9Ci0JCQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L2VsZW1lbnRzL0FjdGl2aXR5TGF5b3V0LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L2VsZW1lbnRzL0FjdGl2aXR5TGF5b3V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4NWY3OTUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9lbGVtZW50cy9BY3Rpdml0eUxheW91dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYyNyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuZWxlbWVudHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5UcmVlSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzaWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlZEFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLlN0clV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5UaW1lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLlhNTFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkNvbXBvc2VkV1BEZXNjcmlwdG9yV3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuSUJTSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Db21wYXJhdG9yczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuUHJlZGVjZXNzb3JMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Qcm9jZXNzVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuU3VwcHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LkVsZW1lbnRMYXlvdXRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5JRWxlbWVudExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuTGF5b3V0SW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuZGlhZ3JhbS5EaWFncmFtSW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuZGlhZ3JhbS5JQWN0aXZpdHlEaWFncmFtU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQudXRpbC5YbWxFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnByZWZzLkJTQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnByZWZzLlByZWZlcmVuY2VVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuTGlicmFyeVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5SZXNvdXJjZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQXJ0aWZhY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29tcG9zaXRlUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuU3VwcG9ydGluZ01hdGVyaWFsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFzazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGVhbVByb2ZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya0JyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS51dGlsLk9wcG9zaXRlRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQXNzb2NpYXRpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotCi0vKioKLSAqIFRoZSBlbGVtZW50IGxheW91dCBmb3IgYSBSb2xlLgotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eUxheW91dCBleHRlbmRzIEFic3RyYWN0UHJvY2Vzc0VsZW1lbnRMYXlvdXQgewotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBQl9OQU1FX0FDVElWSVRZX0RFU0MgPSAiRGVzY3JpcHRpb24iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFCX05BTUVfQUNUSVZJVFlfV0JTID0gIldCUyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUJfTkFNRV9BQ1RJVklUWV9UQlMgPSAiVEJTIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBQl9OQU1FX0FDVElWSVRZX1dQQlMgPSAiV1BCUyI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvL3B1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJSQUNFX1JFUExBQ0VNRU5UID0gIl9CUl8iOwkgLy8kTk9OLU5MUy0xJAotCS8vcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1BFTkJSQUNFX1NUUklORyA9ICJcXHsiOwkgLy8kTk9OLU5MUy0xJAotCQotCW9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLnV0aWwuRGlhZ3JhbUluZm8gdXNlckRpYWdyYW1JbmZvID0gbnVsbDsKLQlib29sZWFuIGRlYnVnID0gTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkuaXNEZWJ1Z2dpbmcoKTsKLQkKLQlwcml2YXRlIFRCU0l0ZW1EZXRhaWwgaXRlbURldGFpbCA9IG5ldyBUQlNJdGVtRGV0YWlsKCk7Ci0JCi0JcHVibGljIEFjdGl2aXR5TGF5b3V0KCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIGluaXRpYWxpemUgdGhlIGxheW91dAotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoRWxlbWVudExheW91dE1hbmFnZXIgbGF5b3V0TWFuYWdlciwgTWV0aG9kRWxlbWVudCBlbGVtZW50KSB7Ci0JCQotCQkvLyBtYWtlIHN1cmUgdGhlIHByb2Nlc3MgaXMgbG9hZGVkCi0JCS8vIG90aGVyd2lzZSB0aGUgcHJvY2VzcyBvciBwcm9jZXNzIGVsZW1lbnRzIG1heSBub3QgaGF2ZSBhIHZhbGlkIGNvbnRhaW5lcgotCQkvLyBhbmQgdGh1cyB0aGUgZWxlbWVudCBjb250ZW50IHBhdGggY2FuJ3QgYmUgZGV0ZXJtaW5lZAotCQkvLyB0aGlzIGlzIGp1c3QgYSB3b3JrYXJvdW5kLiBzaG91bGQgd2UgaGF2ZSBhIGJldHRlciB3YXkgdG8gbWFrZSBzdXJlIHRoZSBlbGVtZW50cyBhcmUgbG9hZGVkIGNvcnJlY3RseT8/Pz8/Pz8/Pz8/Ci0JCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSBMaWJyYXJ5VXRpbC5nZXRNZXRob2RQbHVnaW4oZWxlbWVudCk7Ci0JCWlmICggcGx1Z2luID09IG51bGwgfHwgcGx1Z2luLmVDb250YWluZXIoKSA9PSBudWxsICkgewotCQkJLy8gdGhpcyBzaG91bGQgbm90IGhhcHBlbiBpbiBwdWJsaXNoaW5nIG1vZGUgc2luY2UgdGhlIHdob2xlIGxpYnJhcnkgaXMgYWxyZWFkeSBsb2FkZWQKLQkJCWlmICggZGVidWcgJiYgZ2V0TGF5b3V0TWdyKCkuaXNQdWJsaXNoaW5nTW9kZSgpICkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRXJyb3I6IEVsZW1lbnQgd2l0aG91dCBhIHZhbGlkIGNvbnRhaW5lcjogIiArIExpYnJhcnlVdGlsLmdldFR5cGVOYW1lKGVsZW1lbnQpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCi0JCQlMaWJyYXJ5VXRpbC5sb2FkQWxsUHJvY2Vzc2VzKExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKSk7Ci0JCX0KLQkJCi0JCXN1cGVyLl9faW5pdChsYXlvdXRNYW5hZ2VyLCBlbGVtZW50KTsKLQotCQl1c2VyRGlhZ3JhbUluZm8gPSBuZXcgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwudXRpbC5EaWFncmFtSW5mbygoQWN0aXZpdHkpZWxlbWVudCk7Ci0JCQotCQotCQkvLyBzZXR1cCB0aGUgbXVsdGkgbGF5b3V0IG91dHB1dAotCQkvLyBTdHJpbmcgZmlsZV9kZXNjID0gc3VwZXIuZ2V0RmlsZU5hbWUoUmVzb3VyY2VIZWxwZXIuRklMRV9FWFRfSFRNTCk7CQkKLQkJCi0JCVN0cmluZyBmaWxlOwotCQkKLS8vCQlpZiAoc3VwZXIuZWxlbWVudC5nZXRHdWlkKCkuc3RhcnRzV2l0aCgieyIpKQotLy8JCXsKLS8vCQkJU3RyaW5nIG5ld0d1aWQgPSBzdXBlci5lbGVtZW50LmdldEd1aWQoKS5yZXBsYWNlRmlyc3QoIE9QRU5CUkFDRV9TVFJJTkcsIEJSQUNFX1JFUExBQ0VNRU5UICk7Ci0vLwkJCWZpbGUgPSBzdXBlci5lbGVtZW50LmdldE5hbWUoKSArIG5ld0d1aWQuc3Vic3RyaW5nKDAsIG5ld0d1aWQubGVuZ3RoKCktMSk7Ci0vLwkJfQotLy8JCWVsc2UKLQkJCS8vZmlsZSA9IFN0clV0aWwucmVtb3ZlU3BlY2lhbENoYXJhY3RlcnMoc3VwZXIuZWxlbWVudC5nZXROYW1lKCkpICsgc3VwZXIuZWxlbWVudC5nZXRHdWlkKCk7Ci0JCQotCQlmaWxlID0gZ2V0RmlsZU5hbWUoUmVzb3VyY2VIZWxwZXIuRklMRV9FWFRfSFRNTCk7Ci0JCWlmIChmaWxlICE9IG51bGwgKSB7Ci0JCQkvLyByZXBsYWNlICcgYW5kICIgd2l0aCBzcGFjZQotCQkJZmlsZSA9IGZpbGUucmVwbGFjZSgnXCcnLCAnICcpLnJlcGxhY2UoJ1wiJywgJyAnKTsKLQkJCQotCQkJc2V0TGF5b3V0SW5mbyhuZXcgTGF5b3V0SW5mbygKLQkJCQlUQUJfTkFNRV9BQ1RJVklUWV9ERVNDLCAiYWN0aXZpdHlfZGVzYy54c2wiLCBmaWxlICsgVEFCVVJMX1NVRkZJWF9ERVNDLCB0cnVlKSk7IC8vJE5PTi1OTFMtMSQgCi0JCQlzZXRMYXlvdXRJbmZvKG5ldyBMYXlvdXRJbmZvKAotCQkJCVRBQl9OQU1FX0FDVElWSVRZX1dQQlMsICJhY3Rpdml0eV93cGJzLnhzbCIsIGZpbGUgKyBUQUJVUkxfU1VGRklYX1dQQlMsIGZhbHNlKSk7IC8vJE5PTi1OTFMtMSQgCi0JCQlzZXRMYXlvdXRJbmZvKG5ldyBMYXlvdXRJbmZvKAotCQkJCVRBQl9OQU1FX0FDVElWSVRZX1RCUywgImFjdGl2aXR5X3Ricy54c2wiLCBmaWxlICsgVEFCVVJMX1NVRkZJWF9UQlMsIGZhbHNlKSk7IC8vJE5PTi1OTFMtMSQgCi0JCQlzZXRMYXlvdXRJbmZvKG5ldyBMYXlvdXRJbmZvKAotCQkJCVRBQl9OQU1FX0FDVElWSVRZX1dCUywgImFjdGl2aXR5X3dicy54c2wiLCBmaWxlICsgVEFCVVJMX1NVRkZJWF9XQlMsIGZhbHNlKSk7IC8vJE5PTi1OTFMtMSQgCi0JCX0gZWxzZSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yIGluIEFjdGl2aXR5TGF5b3V0LmluaXQ6IG5vIGZpbGUgZm9yIGVsZW1lbnQgIiArIHN1cGVyLmVsZW1lbnQuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LklFbGVtZW50TGF5b3V0I2dldFhzbFVybCgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRYc2xVcmwoKSB7Ci0JCS8vIHNldCB0aGUgZGVmYXVsdCB0YWIgdXJsLCB0aGUgZGVmYXVsdCB0YWIgd2lsbCBiZSBzZXQgaW4gcHVibGlzaGluZy4KLQkJLy8gZm9yIGJyb3dzaW5nLCB1c2UgdGhlIFRBQl9OQU1FX0FDVElWSVRZX1dCUyB0YWIKLQkJU3RyaW5nIHRhYk5hbWUgPSBnZXRMYXlvdXRNZ3IoKS5nZXRWYWxpZGF0b3IoKS5nZXREZWZhdWx0QWN0aXZpdHlUYWIoKTsKLQkJaWYgKCB0YWJOYW1lID09IG51bGwgKSB7Ci0JCQl0YWJOYW1lID0gVEFCX05BTUVfQUNUSVZJVFlfV0JTOwotCQl9Ci0JCUxheW91dEluZm8gaW5mbyA9IGdldExheW91dEluZm8odGFiTmFtZSk7Ci0JCWlmICggaW5mbyA9PSBudWxsICkgewotCQkJaW5mbyA9IGdldExheW91dEluZm8oVEFCX05BTUVfQUNUSVZJVFlfV0JTKTsKLQkJfQkKLQkJCi0JCXJldHVybiBpbmZvLmxheW91dF94c2w7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUJVUkxfU1VGRklYX0RFU0MgPSAiX2Rlc2MiICsgUmVzb3VyY2VIZWxwZXIuRklMRV9FWFRfSFRNTDsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUJVUkxfU1VGRklYX1dQQlMgPSAiX3dwYnMiICsgUmVzb3VyY2VIZWxwZXIuRklMRV9FWFRfSFRNTDsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUJVUkxfU1VGRklYX1RCUyA9ICJfdGJzIiArIFJlc291cmNlSGVscGVyLkZJTEVfRVhUX0hUTUw7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFCVVJMX1NVRkZJWF9XQlMgPSAiX3dicyIgKyBSZXNvdXJjZUhlbHBlci5GSUxFX0VYVF9IVE1MOyAvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzQWN0aXZpdHlUYWJVcmwoU3RyaW5nIHVybCkgewotCQkKLQkJaWYgKCB1cmwgPT0gbnVsbCB8fCB1cmwubGVuZ3RoKCkgPT0gMCApIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQkKLQkJcmV0dXJuICh1cmwuZW5kc1dpdGgoVEFCVVJMX1NVRkZJWF9ERVNDKSAKLQkJCQl8fCB1cmwuZW5kc1dpdGgoVEFCVVJMX1NVRkZJWF9XUEJTKSAKLQkJCQl8fCB1cmwuZW5kc1dpdGgoVEFCVVJMX1NVRkZJWF9UQlMpIAotCQkJCXx8IHVybC5lbmRzV2l0aChUQUJVUkxfU1VGRklYX1dCUykgKTsKLQkJCi0JfQotCS8qKgotCSAqIG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIGNvbGxlY3QgdGhlIFN1cHBvcnRpbmdNYXRlcmlhbHMgdGhhdCBhcmUgZm9yIHVzZXIgZGVmaW5lZCBkaWFncmFtcwotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGFjY2VwdEZlYXR1cmVWYWx1ZShFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgT2JqZWN0IHZhbHVlKSB7Ci0JCQotCQlpZiAoIHZhbHVlIGluc3RhbmNlb2YgU3VwcG9ydGluZ01hdGVyaWFsICkgewkJCQotCQkJcmV0dXJuICF1c2VyRGlhZ3JhbUluZm8uaXNEaWFncmFtKCAoU3VwcG9ydGluZ01hdGVyaWFsKXZhbHVlICk7Ci0JCX0KLQkJZWxzZSBpZiAoIHZhbHVlIGluc3RhbmNlb2YgTGlzdCApCi0JCXsKLQkJCUxpc3QgaXRlbXMgPSAoTGlzdCl2YWx1ZTsKLQkJCWludCBpID0gMDsKLQkJCXdoaWxlICggaSA8IGl0ZW1zLnNpemUoKSApCi0JCQl7Ci0JCQkJT2JqZWN0IG8gPSBpdGVtcy5nZXQoaSk7Ci0JCQkJaWYgKCAobyBpbnN0YW5jZW9mIFN1cHBvcnRpbmdNYXRlcmlhbCkgJiYgdXNlckRpYWdyYW1JbmZvLmlzRGlhZ3JhbSgoU3VwcG9ydGluZ01hdGVyaWFsKW8pICkgewkJCQotCQkJCQlpdGVtcy5yZW1vdmUoaSk7Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQl7Ci0JCQkJCWkrKzsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiB0cnVlOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5JRWxlbWVudExheW91dCNnZXRYbWxFbGVtZW50KGJvb2xlYW4pCi0JICovCi0JcHVibGljIFhtbEVsZW1lbnQgZ2V0WG1sRWxlbWVudChib29sZWFuIGluY2x1ZGVSZWZlcmVuY2VzKSB7Ci0JCQotCQlTdHJpbmcgbXNnOwotCQlUaW1lciB0ID0gbnVsbDsKLQkJaWYgKCBkZWJ1ZyApIHsKLQkJCXQgPSBuZXcgVGltZXIoKTsJCi0JCQltc2cgPSAiR2VuZXJhdGluZyBsYXlvdXQgeG1sIGZvciAiICsgTGlicmFyeVV0aWwuZ2V0VHlwZU5hbWUoZWxlbWVudCkgIC8vJE5PTi1OTFMtMSQgCi0JCQkJKyAiLCBpbmNsdWRlUmVmZXJlbmNlcyA9ICIgKyBpbmNsdWRlUmVmZXJlbmNlczsgLy8kTk9OLU5MUy0xJAotCQkJU3lzdGVtLm91dC5wcmludGxuKG1zZyk7Ci0JCX0KLQkJCi0KLQkJWG1sRWxlbWVudCBlbGVtZW50WG1sID0gc3VwZXIuZ2V0WG1sRWxlbWVudCgpOwotCQkKLQkJLy8gbG9hZCB0aGUgYXR0cmlidXRlcwotCQlsb2FkQXR0cmlidXRlcyhlbGVtZW50WG1sKTsKLQkJCi0vLwkJLy8gc2V0IHRoZSBkZWZhdWx0IHRhYiB1cmwsIHRoZSBkZWZhdWx0IHRhYiB3aWxsIGJlIHNldCBpbiBwdWJsaXNoaW5nLgotLy8JCS8vIGZvciBicm93c2luZywgdXNlIHRoZSBUQUJfTkFNRV9BQ1RJVklUWV9XQlMgdGFiCi0vLwkJU3RyaW5nIHRhYk5hbWUgPSBnZXRMYXlvdXRNZ3IoKS5nZXRWYWxpZGF0b3IoKS5nZXREZWZhdWx0QWN0aXZpdHlUYWIoKTsKLS8vCQlpZiAoIHRhYk5hbWUgPT0gbnVsbCApIHsKLS8vCQkJdGFiTmFtZSA9IFRBQl9OQU1FX0FDVElWSVRZX1dCUzsKLS8vCQl9Ci0vLwkJTGF5b3V0SW5mbyBsaW5mbyA9IGdldExheW91dEluZm8odGFiTmFtZSk7Ci0vLwkJaWYgKCBsaW5mbyA9PSBudWxsICkgewotLy8JCQlsaW5mbyA9IGdldExheW91dEluZm8oVEFCX05BTUVfQUNUSVZJVFlfV0JTKTsKLS8vCQl9CQotLy8JCQotLy8JCWVsZW1lbnRYbWwuc2V0QXR0cmlidXRlKCJkZWZhdWx0VGFiVXJsIiwgbGluZm8uZmlsZU5hbWUpOwotLy8JCQotCQlQcm9jZXNzIHByb2MgPSBnZXRPd25pbmdQcm9jZXNzKCk7Ci0JCQotCQkvLyBuZWVkIHRvIGhhbmRsZSB0aGUgc3VwcmVzc2VkIGJyZWFrZG93biBlbGVtZW50cwotCQkvLyB1c2UgdGhlIFN1cHJlc3MgdXRpbGl0eQotCQlTdXBwcmVzc2lvbiBzdXAgPSBnZXRTdXBwcmVzc2lvbihwcm9jKTsKLQotLy8JCS8vIGRpc3BsYXkgbmFtZSBuZWVkcyB0byBiZSBmaXhlZCwgZXh0ZW5kZWQgYWN0aXZpdHkgbWF5IG5lZWQgdG8gZ2V0IGRpc3BsYXkgbmFtZSBmcm9tIHRoZSBiYXNlCi0vLwkJLy8gRFZUOiAgUE5zIG9mIGV4dGVuZGVkIHByb2Nlc3NlcyBubyBwaWNrZWQgdXAgZm9yIHB1Ymxpc2ggKFRDVCA2MzgpCi0vLwkJQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSA9IGxheW91dE1hbmFnZXIuZ2V0Q0JTQWRhcHRlckZhY3RvcnkoKTsKLS8vCQlPYmplY3Qgd3JhcHBlciA9IHN1cC5nZXRPYmplY3RCeVBhdGgoc3VwZXIucGF0aHMsIGFkYXB0ZXJGYWN0b3J5KTsKLS8vCQlpZiAoIHdyYXBwZXIgPT0gbnVsbCApIHsKLS8vCQkJd3JhcHBlciA9IHN1cGVyLmVsZW1lbnQ7Ci0vLwkJfQotLy8KLS8vCQlJQlNJdGVtUHJvdmlkZXIgYWRhcHRlciA9IChJQlNJdGVtUHJvdmlkZXIpIGFkYXB0ZXJGYWN0b3J5LmFkYXB0KAotLy8JCQkJd3JhcHBlciwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLS8vCi0vLwkJU3RyaW5nIGRpc3BsYXlOYW1lID0gUHJvY2Vzc1V0aWwuZ2V0QXR0cmlidXRlKGVsZW1lbnQsCi0vLwkJCQlJQlNJdGVtUHJvdmlkZXIuQ09MX1BSRVNFTlRBVElPTl9OQU1FLCBhZGFwdGVyKTsKLS8vCi0vLwkJZWxlbWVudFhtbC5zZXRBdHRyaWJ1dGUoIkRpc3BsYXlOYW1lIiwgZGlzcGxheU5hbWUpOyAvLyROT04tTkxTLTEkCi0JCQotCQlpZiAoIWluY2x1ZGVSZWZlcmVuY2VzKSB7Ci0JCQlyZXR1cm4gZWxlbWVudFhtbDsKLQkJfQotCQkKLQkJZWxlbWVudFhtbC5zZXRBdHRyaWJ1dGUoIlNob3dGdWxsTWV0aG9kQ29udGVudCIsIChsYXlvdXRNYW5hZ2VyLmdldFZhbGlkYXRvcigpLnNob3dFeHRyYUluZm9Gb3JEZXNjcmlwdG9ycygpKSA/ICJ0cnVlIiA6ICJmYWxzZSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCi0JCS8vIGdldCB0aGUgdGFicyB4bWwgc2VjdGlvbgotCQlYbWxFbGVtZW50IHRhYnNYbWwgPSBlbGVtZW50WG1sLm5ld0NoaWxkKCJ0YWJzIik7IC8vJE5PTi1OTFMtMSQKLQkJZm9yIChJdGVyYXRvciBpdCA9IGxheW91dHMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJTGF5b3V0SW5mbyBpbmZvID0gKExheW91dEluZm8pIGl0Lm5leHQoKTsKLQkJCXRhYnNYbWwubmV3Q2hpbGQoInRhYiIpIC8vJE5PTi1OTFMtMSQKLQkJCQkJLnNldEF0dHJpYnV0ZSgibmFtZSIsIGluZm8ubmFtZSkgLy8kTk9OLU5MUy0xJAotCQkJCQkuc2V0QXR0cmlidXRlKCJ1cmwiLCBzdXBlci5lbGVtZW50UGF0aCArIGluZm8uZmlsZU5hbWUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQkvLyBkbyBpdCBvbmx5IHdoZW4gaXQncyBhIHByb2Nlc3Mgb3IgaXQncyBub3QgaW4gcHVibGlzaGluZyBtb2RlbAotCQkvLyBzaW5jZSBpbiBwdWJsaXNoaW5nLCB0aGUgaXRlcmF0aW9uIGFsd2F5cyBzdGFydCBmcm9tIHByb2Nlc3MKLQkJLy8gZm9yIGJyb3dzaW5nLCBpdCBjYW4gc3RhcnQgaW4gdGhlIG1pZGRsZSAKLQkJaWYgKCAhZ2V0TGF5b3V0TWdyKCkuaXNQdWJsaXNoaW5nTW9kZSgpIHx8IHN1cGVyLmVsZW1lbnQgaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3MgKSB7Ci0JCQlnZXRMYXlvdXRNZ3IoKS5wcmVwYXJlQWRhcHRvckZhY3Rvcmllc0ZvclByb2Nlc3MocHJvYyk7Ci0JCX0KLQotCQkvLyBsb2FkIHRoZSBjb3B5cmlnaHQgaW5mbwotCQlsb2FkQ29weXJpZ2h0KGVsZW1lbnRYbWwpOwotCi0JCS8vIGNhbGN1bGF0ZSBvdGhlciBzZWxlY3RlZCByZWZlcmVjbmVzCi0JCUxpc3QgZmVhdHVyZXMgPSBMaWJyYXJ5VXRpbC5nZXRTdHJ1Y3R1cmFsRmVhdHVyZXMoZWxlbWVudCk7Ci0vLwkJTGlzdCBwcm9wZXJ0aWVzID0gZWxlbWVudC5nZXRJbnN0YW5jZVByb3BlcnRpZXMoKTsKLQkJaWYgKGZlYXR1cmVzICE9IG51bGwpIHsKLQkJCS8vIGdldCBlbGVtZW50IHJlZmVyZW5jZXMKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmVhdHVyZXMuc2l6ZSgpOyBpKyspIHsKLQkJCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IChFU3RydWN0dXJhbEZlYXR1cmUpIGZlYXR1cmVzCi0JCQkJCQkuZ2V0KGkpOwotCi0JCQkJLy8gc2tpcCB0aGUgYnJlYWtkb3duIGVsZW1lbnRzIHNpbmNlIHdlIHdpbGwgYnVpbGQgdGhlIGJyZWFrZG93bgotCQkJCS8vIHN0cnVjdHVyZSBsYXRlcgotCQkJCWlmIChmZWF0dXJlID09IFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkuZ2V0QWN0aXZpdHlfQnJlYWtkb3duRWxlbWVudHMoKSkgewotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0KLQkJCQkvLyBPYmplY3QgdmFsdWUgPSBlbGVtZW50LmdldChpKTsKLQkJCQlFQ2xhc3NpZmllciB0eXBlID0gZmVhdHVyZS5nZXRFVHlwZSgpOwotCQkJCWlmICghKHR5cGUgaW5zdGFuY2VvZiBFQ2xhc3MpKSB7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQotCQkJCWxvYWRGZWF0dXJlKGZlYXR1cmUsIGVsZW1lbnRYbWwsIGZhbHNlKTsKLQkJCX0KLQkJfQotCQkKLQkJQ29sbGVjdGlvbiBvcHBvc2l0ZVByb3BlcnRpZXMgPSBuZXcgQXJyYXlMaXN0KGVsZW1lbnQuZ2V0T3Bwb3NpdGVGZWF0dXJlcygpKTsKLQkJZm9yIChJdGVyYXRvciB6PSBvcHBvc2l0ZVByb3BlcnRpZXMuaXRlcmF0b3IoKTsgei5oYXNOZXh0KCk7ICkKLQkJewotCQkJT3Bwb3NpdGVGZWF0dXJlIG9mZWF0dXJlID0gKE9wcG9zaXRlRmVhdHVyZSkgei5uZXh0KCk7Ci0JCQlsb2FkRmVhdHVyZShvZmVhdHVyZSwgZWxlbWVudFhtbCwgaW5jbHVkZVJlZmVyZW5jZXMpOwotCQl9Ci0JCQotCQlpZiAoIGRlYnVnICkgewotCQkJdC5zdG9wKCk7Ci0JCQltc2cgPSB0LmdldFRpbWUoKSArICIgbWluaSBzZWNvbmRzIGJ1aWxkaW5nIEFjdGl2aXR5IERlc2NyaW90aW9uIHhtbCBmb3IgIiArIExpYnJhcnlVdGlsLmdldFR5cGVOYW1lKGVsZW1lbnQpICA7IC8vJE5PTi1OTFMtMSQgCQkJCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4obXNnKTsKLQkJCQotCQkJdC5zdGFydCgpOwotCQl9Ci0KLQkJYnVpbGRXQlMoZWxlbWVudFhtbCwgc3VwKTsKLQkJaWYgKCBkZWJ1ZyApIHsKLQkJCXQuc3RvcCgpOwotCQkJbXNnID0gdC5nZXRUaW1lKCkgKyAiIG1pbmkgc2Vjb25kcyBidWlsZGluZyBXQlMgZm9yICIgKyBMaWJyYXJ5VXRpbC5nZXRUeXBlTmFtZShlbGVtZW50KSAgOyAvLyROT04tTkxTLTEkIAkJCQotCQkJU3lzdGVtLm91dC5wcmludGxuKG1zZyk7Ci0JCQkKLQkJCXQuc3RhcnQoKTsKLQkJfQotCQkKLQkJYnVpbGRUQlMoZWxlbWVudFhtbCwgc3VwKTsJCi0JCQotCQlpZiAoIGRlYnVnICkgewotCQkJdC5zdG9wKCk7Ci0JCQltc2cgPSB0LmdldFRpbWUoKSArICIgbWluaSBzZWNvbmRzIGJ1aWxkaW5nIFRCUyBmb3IgIiArIExpYnJhcnlVdGlsLmdldFR5cGVOYW1lKGVsZW1lbnQpICA7IC8vJE5PTi1OTFMtMSQgCQkJCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4obXNnKTsKLQkKLQkJCXQuc3RhcnQoKTsKLQkJfQotCQkKLQkJYnVpbGRXUEJTKGVsZW1lbnRYbWwsIHN1cCk7Ci0JCQotCQlpZiAoIGRlYnVnICkgewotCQkJdC5zdG9wKCk7Ci0JCQltc2cgPSB0LmdldFRpbWUoKSArICIgbWluaSBzZWNvbmRzIGJ1aWxkaW5nIFdQQlMgZm9yICIgKyBMaWJyYXJ5VXRpbC5nZXRUeXBlTmFtZShlbGVtZW50KSAgOyAvLyROT04tTkxTLTEkIAkJCQotCQkJU3lzdGVtLm91dC5wcmludGxuKG1zZyk7Ci0JCQkKLQkJCW1zZyA9IHQuZ2V0VG90YWxUaW1lKCkgKyAiIG1pbmkgc2Vjb25kcyBidWlsZGluZyBsYXlvdXQgeG1sIGZvciAiICsgTGlicmFyeVV0aWwuZ2V0VHlwZU5hbWUoZWxlbWVudCkgIDsgLy8kTk9OLU5MUy0xJCAJCQkKLQkJCVN5c3RlbS5vdXQucHJpbnRsbihtc2cpOwotCQl9Ci0JCQotCQkKLS8vCQkvLyBmb3IgdGVzdCBvbmx5Ci0vLwkJUHJvY2Vzc0xheW91dERhdGEgZGF0YSA9IG5ldyBQcm9jZXNzTGF5b3V0RGF0YShnZXRPd25pbmdQcm9jZXNzKCkuZ2V0R3VpZCgpKTsKLS8vCQlsb2FkTGF5b3V0RGF0YShkYXRhLCB0cnVlLCB0cnVlLCB0cnVlKTsKLQkJCi0JCXJldHVybiBlbGVtZW50WG1sOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldFVzZXJEaWFncmFtVGV4dChTdXBwb3J0aW5nTWF0ZXJpYWwgdXNlckRpYWdyYW0pCi0JewotCQkvLyB1c2VyIGRlZmluZWQgZGlhZ3JhbQotCQlBYnN0cmFjdEVsZW1lbnRMYXlvdXQgbCA9IG5ldyBHZW5lcmFsTGF5b3V0KCk7Ci0JCWwuaW5pdChnZXRMYXlvdXRNZ3IoKSwgdXNlckRpYWdyYW0uZ2V0UHJlc2VudGF0aW9uKCkpOwotCQlsLnNldENvbnRlbnRUYXJnZXQoZWxlbWVudCk7Ci0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29udGVudERlc2NyaXB0aW9uX01haW5EZXNjcmlwdGlvbigpOwotCQlyZXR1cm4gKFN0cmluZylsLmdldEF0dHJpYnV0ZUZlYXR1cmVWYWx1ZShmZWF0dXJlKTsJCQotCX0KLQkKLQlwcml2YXRlIHZvaWQgc2V0Q29sdW1ucyhYbWxFbGVtZW50IHBhcmVudFhtbCwgTGlzdCBjb2xzKSB7Ci0JCVhtbEVsZW1lbnQgY29sc1htbCA9IHBhcmVudFhtbC5uZXdDaGlsZCgiY29sdW1ucyIpOyAvLyROT04tTkxTLTEkCi0JCWZvciAoSXRlcmF0b3IgaXQgPSBjb2xzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTsgKSB7Ci0JCQlCU0NvbHVtbiBjb2wgPSAoQlNDb2x1bW4paXQubmV4dCgpOwotCQkJY29sc1htbC5uZXdDaGlsZCgiY29sdW1uIikgLy8kTk9OLU5MUy0xJAotCQkJCS5zZXRBdHRyaWJ1dGUoImlkIiwgY29sLmlkKSAvLyROT04tTkxTLTEkCi0JCQkJLnNldEF0dHJpYnV0ZSgibGFiZWwiLCBjb2wubGFiZWwpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkV0JTKFhtbEVsZW1lbnQgZWxlbWVudFhtbCwgU3VwcHJlc3Npb24gc3VwKQotCXsKLQkJLy8gYnVpbGQgdGhlIGJyZWFrZG93biBzdHJ1Y3R1cmUgdHJlZQotCQlYbWxFbGVtZW50IGJzID0gZWxlbWVudFhtbAotCQkJCS5uZXdDaGlsZCgiYnJlYWtkb3duIikuc2V0QXR0cmlidXRlKCJuYW1lIiwgIldvcmsgQnJlYWtkb3duIFN0cnVjdHVyZSIpIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJLnNldEF0dHJpYnV0ZSgiRGlzcGxheU5hbWUiLCBnZXREaXNwbGF5TmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCi0JCS8vIHNldCB0aGUgY29sdW1ucwotCQlzZXRDb2x1bW5zKGJzLCBQcmVmZXJlbmNlVXRpbC5nZXRXQlNDb2x1bW5zKCkpOwotCQkKLQkJLy8gcHVibGlzaCB0aGUgY29uc29saWRhdGVkIHZpZXcKLQkJQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSA9IGxheW91dE1hbmFnZXIKLQkJCQkuZ2V0Q0JTQWRhcHRlckZhY3RvcnkoKTsKLQkJQ29tcG9zaXRlUm9sZXMgY3JzID0gbnVsbDsgLy9uZXcgQ29tcG9zaXRlUm9sZXMoYWRhcHRlckZhY3RvcnksIChBY3Rpdml0eSkgc3VwZXIuZWxlbWVudCk7Ci0JCS8vIGlmICggc3VwZXIuZWxlbWVudCBpbnN0YW5jZW9mIFByb2Nlc3MgKQotCQl7Ci0JCQlQcm9jZXNzVXRpbC51cGRhdGVJRHMoYWRhcHRlckZhY3RvcnksIHN1cC5nZXRQcm9jZXNzKCkpOwotCQl9Ci0KLQkJQWN0aXZpdHlMYXlvdXRTZXR0aW5nIHNldHRpbmcgPSBuZXcgQWN0aXZpdHlMYXlvdXRTZXR0aW5nKAotCQkJCWFkYXB0ZXJGYWN0b3J5LCBjcnMsIHN1cCk7Ci0KLQkJLy8gZXNjYXBlIHRoZSBxdW90ZXMgaW4gdGhlIHN0cmluZyBzaWNuZSB3ZSBzZXQgdGhlIHN0cmluZyBpbnRvIGphdmFzY3JpcHQgdmFyaWFibGVzIGluIHRoZSBsYXlvdXQKLQkJc2V0dGluZy5lc2NhcGVTdHJpbmcgPSB0cnVlOwotCQkKLQkJLy8gc2V0IHRvIG9ubHkgc2hvdyB0YXNrIGRlc2NyaXB0b3JzIGZvciBzdWItYWN0aXZpdGllcwotCQlzZXR0aW5nLnNob3dUYXNrT25seSA9IHRydWU7Ci0JCQotCQkvLyBuZWVkIHRvIGdldCB0aGUgcmF3IGl0ZW0gcHJvdmlkZXIgZnJvbSB0aGUgYWRhcHRlciBmYWN0b3J5Ci0JCU9iamVjdCB3cmFwcGVyID0gc3VwLmdldE9iamVjdEJ5UGF0aChzdXBlci5wYXRocywgYWRhcHRlckZhY3RvcnkpOwotCQlpZiAoIHdyYXBwZXIgPT0gbnVsbCApIHsKLQkJCXdyYXBwZXIgPSBzdXBlci5lbGVtZW50OwotCQl9IAotCQkKLQkJaWYgKCBzdXAuaXNTdXBwcmVzc2VkKHdyYXBwZXIpICkgewotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlQcm9jZXNzRWxlbWVudEl0ZW0gZWxlbWVudEl0ZW0gPSBuZXcgUHJvY2Vzc0VsZW1lbnRJdGVtKHdyYXBwZXIsIHN1cGVyLmVsZW1lbnQsIHN1cGVyLmVsZW1lbnRQcm9jZXNzUGF0aCk7Ci0JCWl0ZXJhdGUoZWxlbWVudEl0ZW0sIGJzLCBzZXR0aW5nKTsKLQkJCi0KLQkJWG1sRWxlbWVudCBkaWFncmFtcyA9IGVsZW1lbnRYbWwubmV3Q2hpbGQoImRpYWdyYW1zIik7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCVN0cmluZyBkaWFncmFtVHlwZTsKLQkJU3RyaW5nIGltZ0ZpbGU7Ci0JCWRpYWdyYW1UeXBlID0gUmVzb3VyY2VIZWxwZXIuRElBR1JBTV9UWVBFX1dPUktGTE9XOwotCQlTdXBwb3J0aW5nTWF0ZXJpYWwgdXNlckRpYWdyYW0gPSB1c2VyRGlhZ3JhbUluZm8uZ2V0QWN0aXZpdHlEaWFncmFtKCk7Ci0JCWlmICggdXNlckRpYWdyYW1JbmZvLmNhblB1Ymxpc2hBREltYWdlKCkgJiYgKHVzZXJEaWFncmFtICE9IG51bGwpICkKLQkJewkJCQkKLQkJCWRpYWdyYW1zLm5ld0NoaWxkKCJ1c2VyZGlhZ3JhbSIpIC8vJE5PTi1OTFMtMSQKLQkJCQkuc2V0QXR0cmlidXRlKCJuYW1lIiwgZGlhZ3JhbVR5cGUpIC8vJE5PTi1OTFMtMSQKLQkJCQkuc2V0VmFsdWUoZ2V0VXNlckRpYWdyYW1UZXh0KHVzZXJEaWFncmFtKSk7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC51dGlsLkRpYWdyYW1JbmZvIHVkZEluZm8gPSBnZXRSZWFsaXplZFVERChzdXAsIGRpYWdyYW1UeXBlKTsKLQkJCWJvb2xlYW4gZ2VuZXJhdGVkRGlhZ3JhbSA9IHRydWU7Ci0JCQlpZih1ZGRJbmZvICE9IG51bGwpewotCQkJCXVzZXJEaWFncmFtID0gdWRkSW5mby5nZXRBY3Rpdml0eURpYWdyYW0oKTsKLQkJCQlpZih1ZGRJbmZvLmNhblB1Ymxpc2hBREltYWdlKCkgJiYgdXNlckRpYWdyYW0gIT0gbnVsbCl7Ci0JCQkJCWRpYWdyYW1zLm5ld0NoaWxkKCJ1c2VyZGlhZ3JhbSIpIC8vJE5PTi1OTFMtMSQKLQkJCQkJLnNldEF0dHJpYnV0ZSgibmFtZSIsIGRpYWdyYW1UeXBlKSAvLyROT04tTkxTLTEkCi0JCQkJCS5zZXRWYWx1ZShnZXRVc2VyRGlhZ3JhbVRleHQodXNlckRpYWdyYW0pKTsKLQkJCQkJZ2VuZXJhdGVkRGlhZ3JhbSA9IGZhbHNlOwotCQkJCX0KLQkJCX0KLQkJCQotCQkJaWYoZ2VuZXJhdGVkRGlhZ3JhbSl7Ci0JCQkJaW1nRmlsZSA9IFJlc291cmNlSGVscGVyLmdldERpYWdyYW1GaWxlUGF0aE5hbWUoZWxlbWVudCwgZGlhZ3JhbVR5cGUpOwotCQkJCURpYWdyYW1JbmZvIGRpYWdyYW1fd29ya2Zsb3cgPSBnZW5lcmF0ZURpYWdyYW0oc3VwLCBkaWFncmFtVHlwZSwgaW1nRmlsZSk7CQotCQkJCWlmIChkaWFncmFtX3dvcmtmbG93ICE9IG51bGwKLQkJCQkJJiYgZGlhZ3JhbV93b3JrZmxvdy5nZXRJbWFnZUZpbGVOYW1lKCkgIT0gbnVsbCkgewotCQkJCWRpYWdyYW1zLm5ld0NoaWxkKCJkaWFncmFtIikgLy8kTk9OLU5MUy0xJAotCQkJCQkJLnNldEF0dHJpYnV0ZSgibmFtZSIsIFJlc291cmNlSGVscGVyLkRJQUdSQU1fVFlQRV9XT1JLRkxPVykgLy8kTk9OLU5MUy0xJAotCQkJCQkJLnNldEF0dHJpYnV0ZSgiYWx0IiwgZ2V0RGlhZ3JhbURpc3BsYXlOYW1lKFJlc291cmNlSGVscGVyLkRJQUdSQU1fVFlQRV9XT1JLRkxPVykpIC8vJE5PTi1OTFMtMSQKLQkJCQkJCS8vLnNldFZhbHVlKGRpYWdyYW1fd29ya2Zsb3cuZ2V0SFRNTCgpKTsKLQkJCQkJCS5hZGRDaGlsZChkaWFncmFtX3dvcmtmbG93LmdldFhtbEVsZW1lbnQoKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQlkaWFncmFtVHlwZSA9IFJlc291cmNlSGVscGVyLkRJQUdSQU1fVFlQRV9BQ1RJVklUWV9ERVRBSUw7Ci0JCXVzZXJEaWFncmFtID0gdXNlckRpYWdyYW1JbmZvLmdldEFjdGl2aXR5RGV0YWlsRGlhZ3JhbSgpOwotCQlpZiAoIHVzZXJEaWFncmFtSW5mby5jYW5QdWJsaXNoQURESW1hZ2UoKSAmJiAodXNlckRpYWdyYW0gIT0gbnVsbCkgKQotCQl7CQkJCQotCQkJZGlhZ3JhbXMubmV3Q2hpbGQoInVzZXJkaWFncmFtIikgLy8kTk9OLU5MUy0xJAotCQkJCS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCBkaWFncmFtVHlwZSkgLy8kTk9OLU5MUy0xJAotCQkJCS5zZXRWYWx1ZShnZXRVc2VyRGlhZ3JhbVRleHQodXNlckRpYWdyYW0pKTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCWltZ0ZpbGUgPSBSZXNvdXJjZUhlbHBlci5nZXREaWFncmFtRmlsZVBhdGhOYW1lKGVsZW1lbnQsIGRpYWdyYW1UeXBlKTsKLQkJCURpYWdyYW1JbmZvIGRpYWdyYW1fZGV0YWlsID0gZ2VuZXJhdGVEaWFncmFtKHN1cCwgZGlhZ3JhbVR5cGUsIGltZ0ZpbGUpOwkKLQkJCWlmIChkaWFncmFtX2RldGFpbCAhPSBudWxsICYmIGRpYWdyYW1fZGV0YWlsLmdldEltYWdlRmlsZU5hbWUoKSAhPSBudWxsKSB7Ci0JCQkJZGlhZ3JhbXMKLQkJCQkJCS5uZXdDaGlsZCgiZGlhZ3JhbSIpIC8vJE5PTi1OTFMtMSQKLQkJCQkJCS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCBSZXNvdXJjZUhlbHBlci5ESUFHUkFNX1RZUEVfQUNUSVZJVFlfREVUQUlMKSAvLyROT04tTkxTLTEkCi0JCQkJCQkuc2V0QXR0cmlidXRlKAotCQkJCQkJCQkiYWx0IiwgZ2V0RGlhZ3JhbURpc3BsYXlOYW1lKFJlc291cmNlSGVscGVyLkRJQUdSQU1fVFlQRV9BQ1RJVklUWV9ERVRBSUwpKSAvLyROT04tTkxTLTEkCi0JCQkJCQkvLy5zZXRWYWx1ZShkaWFncmFtX2RldGFpbC5nZXRIVE1MKCkpOwotCQkJCQkJLmFkZENoaWxkKGRpYWdyYW1fZGV0YWlsLmdldFhtbEVsZW1lbnQoKSk7Ci0JCQl9Ci0JCX0KLQkJCi0JCWRpYWdyYW1UeXBlID0gUmVzb3VyY2VIZWxwZXIuRElBR1JBTV9UWVBFX1dQX0RFUEVOREVOQ1k7Ci0JCXVzZXJEaWFncmFtID0gdXNlckRpYWdyYW1JbmZvLmdldFdQRERpYWdyYW0oKTsKLQkJaWYgKCB1c2VyRGlhZ3JhbUluZm8uY2FuUHVibGlzaFdQREltYWdlKCkgJiYgKHVzZXJEaWFncmFtICE9IG51bGwpICkKLQkJewkJCQkKLQkJCWRpYWdyYW1zLm5ld0NoaWxkKCJ1c2VyZGlhZ3JhbSIpIC8vJE5PTi1OTFMtMSQKLQkJCQkuc2V0QXR0cmlidXRlKCJuYW1lIiwgZGlhZ3JhbVR5cGUpIC8vJE5PTi1OTFMtMSQKLQkJCQkuc2V0VmFsdWUoZ2V0VXNlckRpYWdyYW1UZXh0KHVzZXJEaWFncmFtKSk7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlpbWdGaWxlID0gUmVzb3VyY2VIZWxwZXIuZ2V0RGlhZ3JhbUZpbGVQYXRoTmFtZShlbGVtZW50LCBkaWFncmFtVHlwZSk7Ci0JCQlEaWFncmFtSW5mbyBkaWFncmFtX3dwID0gZ2VuZXJhdGVEaWFncmFtKHN1cCwgZGlhZ3JhbVR5cGUsIGltZ0ZpbGUpOwkKLQkJCWlmIChkaWFncmFtX3dwICE9IG51bGwgJiYgZGlhZ3JhbV93cC5nZXRJbWFnZUZpbGVOYW1lKCkgIT0gbnVsbCkgewotCQkJCWRpYWdyYW1zLm5ld0NoaWxkKCJkaWFncmFtIikgLy8kTk9OLU5MUy0xJAotCQkJCQkJLnNldEF0dHJpYnV0ZSgibmFtZSIsIFJlc291cmNlSGVscGVyLkRJQUdSQU1fVFlQRV9XUF9ERVBFTkRFTkNZKSAvLyROT04tTkxTLTEkCi0JCQkJCQkuc2V0QXR0cmlidXRlKAotCQkJCQkJCQkiYWx0IiwgZ2V0RGlhZ3JhbURpc3BsYXlOYW1lKFJlc291cmNlSGVscGVyLkRJQUdSQU1fVFlQRV9XUF9ERVBFTkRFTkNZKSkgLy8kTk9OLU5MUy0xJAotCQkJCQkJLy8uc2V0VmFsdWUoZGlhZ3JhbV93cC5nZXRIVE1MKCkpOwotCQkJCQkJLmFkZENoaWxkKGRpYWdyYW1fd3AuZ2V0WG1sRWxlbWVudCgpKTsKLQkJCX0KLQkJfQotCX0KLQkKLQlwcml2YXRlIFN0cmluZyBnZXREaWFncmFtRGlzcGxheU5hbWUoU3RyaW5nIHR5cGUpIHsKLQkKLQkJU3RyaW5nIG5hbWUgPSBnZXREaXNwbGF5TmFtZSgpOwotCQlpZiAoIFJlc291cmNlSGVscGVyLkRJQUdSQU1fVFlQRV9XT1JLRkxPVy5lcXVhbHModHlwZSkgKSB7Ci0JCQlyZXR1cm4gTkxTLmJpbmQoTGlicmFyeVJlc291cmNlcy5hY3Rpdml0eURpYWdyYW1OYW1lLCBuYW1lKTsJCQotCQl9IGVsc2UgaWYgKCBSZXNvdXJjZUhlbHBlci5ESUFHUkFNX1RZUEVfQUNUSVZJVFlfREVUQUlMLmVxdWFscyh0eXBlKSApIHsKLQkJCXJldHVybiBOTFMuYmluZChMaWJyYXJ5UmVzb3VyY2VzLmFjdGl2aXR5RGV0YWlsRGlhZ3JhbU5hbWUsIG5hbWUpOwkJCi0JCX0gZWxzZSBpZiAoIFJlc291cmNlSGVscGVyLkRJQUdSQU1fVFlQRV9XUF9ERVBFTkRFTkNZLmVxdWFscyh0eXBlKSApIHsKLQkJCXJldHVybiBOTFMuYmluZChMaWJyYXJ5UmVzb3VyY2VzLndwRGVwZW5kZW5jeURpYWdyYW1OYW1lLCBuYW1lKTsJCQotCQl9IGVsc2UgewotCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0JCi0vLwlwcml2YXRlIERpYWdyYW1JbmZvIGdlbmVyYXRlRGlhZ3JhbShTdXBwcmVzc2lvbiBzdXAsIFN0cmluZyBkaWFncmFtVHlwZSwgU3RyaW5nIGltZ0ZpbGUpIHsKLS8vCQkKLS8vLy8JCWlmICggIl9vM25ab1NGckVkcXJYOFlWenZ0bElnLF9qaW4yb0NHR0VkcU1jb3ZSemtDUW93Ii5lcXVhbHMoc3VwZXIuZWxlbWVudFByb2Nlc3NQYXRoKSApIHsKLS8vLy8JCQlTeXN0ZW0ub3V0LnByaW50bG4oInh4Iik7Ci0vLy8vCQl9Ci0vLwkJCi0vLwkJRGlhZ3JhbUluZm8gaW5mbyA9IG51bGw7Ci0vLwkJRWxlbWVudExheW91dE1hbmFnZXIgbWdyID0gZ2V0TGF5b3V0TWdyKCk7Ci0vLwkJaWYgKG1nciAhPSBudWxsKSB7Ci0vLwkJCWluZm8gPSBtZ3IuZ2V0Q2FjaGVkRGlhZ3JhbUluZm8oc3VwLCBkaWFncmFtVHlwZSwgaW1nRmlsZSk7Ci0vLwkJCWlmIChpbmZvICE9IG51bGwpIHsKLS8vCQkJCVN5c3RlbS5lcnIucHJpbnRsbigiKioqIGRpYWdyYW0gZ2VuZXJhdGVkOiAiICsgaW5mby5wYXRoICsgIiwgIGZpbGUgbmFtZTogIiArIGltZ0ZpbGUpOwotLy8KLS8vCQkJCXJldHVybiBpbmZvOwotLy8JCQl9Ci0vLwkJfQotLy8JCWluZm8gPSBnZW5lcmF0ZURpYWdyYW1fKHN1cCwgZGlhZ3JhbVR5cGUsIGltZ0ZpbGUpOwotLy8JCWlmICggaW5mbyAhPSBudWxsICkgewotLy8JCQlpbmZvLnBhdGggPSBzdXBlci5lbGVtZW50UHJvY2Vzc1BhdGg7Ci0vLwkJfQotLy8JCQotLy8JCWlmIChtZ3IgIT0gbnVsbCkgewotLy8JCQltZ3IuYWRkQ2FjaGVkRGlhZ3JhbUluZm8oaW5mbywgc3VwLCBkaWFncmFtVHlwZSwgaW1nRmlsZSk7Ci0vLwkJfQotLy8JCXJldHVybiBpbmZvOwotLy8JfQotCQotCXByaXZhdGUgRGlhZ3JhbUluZm8gZ2VuZXJhdGVEaWFncmFtKFN1cHByZXNzaW9uIHN1cCwgU3RyaW5nIGRpYWdyYW1UeXBlLCBTdHJpbmcgaW1nRmlsZSkKLQl7Ci0JCVRpbWVyIHRpbWVyID0gbnVsbDsKLQkJaWYgKGRlYnVnICl7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIlNUQVJUOiBnZW5lcmF0aW5nIGRpYWdyYW0gIiArIGltZ0ZpbGUpOy8vJE5PTi1OTFMtMSQKLQkJCXRpbWVyID0gbmV3IFRpbWVyKCk7CQkJCi0JCX0KLQkJLy8gZ2VuZXJhdGUgZGlhZ3JhbQotCQkvLyBzaG93IHRoZSBhY3Rpdml0eSBkaWFncmFtcwotCQlJQWN0aXZpdHlEaWFncmFtU2VydmljZSBkaWFncmFtU2VydmljZSA9IGxheW91dE1hbmFnZXIKLQkJCQkuZ2V0QWN0aXZpdHlEaWFncmFtU2VydmljZSgpOwotCQlEaWFncmFtSW5mbyBkaWFncmFtID0gbnVsbDsKLQkJaWYgKGRpYWdyYW1TZXJ2aWNlICE9IG51bGwpIHsKLQkJCUlGaWx0ZXIgZmlsdGVyID0gbGF5b3V0TWFuYWdlci5nZXREaWFncmFtQWRhcHRlckZhY3RvcnkoKS5nZXRGaWx0ZXIoKTsKLQkJCQotCQkJLy8gZ2V0IHRoZSB3cmFwcGVyIGZyb20gdGhlIFdCUyBhZGFwdGVyIGZhY3RvcnkKLQkJCU9iamVjdCB3cmFwcGVyID0gc3VwLmdldE9iamVjdEJ5UGF0aChzdXBlci5wYXRocywgbGF5b3V0TWFuYWdlci5nZXREaWFncmFtQWRhcHRlckZhY3RvcnkoKSk7Ci0JCQkKLQkJCS8vIFNldCB0aGUgcHVibGlzaGluZyBtb2RlCi0JCQlib29sZWFuIHB1Ymxpc2hpbmdtb2RlID0gTGlicmFyeVV0aWwuUFVCTElTSF9NT0RFOwotCQkJTGlicmFyeVV0aWwuUFVCTElTSF9NT0RFID0gdHJ1ZTsKLQotCQkJZGlhZ3JhbSA9IGRpYWdyYW1TZXJ2aWNlLnNhdmVEaWFncmFtKHdyYXBwZXIsCi0JCQkJCWltZ0ZpbGUsCi0JCQkJCWRpYWdyYW1UeXBlLCBmaWx0ZXIsIHN1cCk7Ci0JCQkKLQkJCS8vIHNldCBiYWNrIHRvIAotCQkJTGlicmFyeVV0aWwuUFVCTElTSF9NT0RFID0gcHVibGlzaGluZ21vZGU7Ci0JCX0KLQotCQlpZiAoIHRpbWVyICE9IG51bGwgKXsKLQkJCXRpbWVyLnN0b3AoKTsJCi0JCQlTdHJpbmcgbXNnID0gdGltZXIuZ2V0VGltZSgpICsgIiBtaW5pIHNlY29uZHMgZ2VuZXJhdGluZyAiICsgZGlhZ3JhbVR5cGUgKyAiIGRpYWdyYW0iICA7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAJCQkKLQkJCVN5c3RlbS5vdXQucHJpbnRsbihtc2cpOwotCQkJU3lzdGVtLm91dC5wcmludGxuKCJFTkQ6IGdlbmVyYXRpbmcgZGlhZ3JhbSAiICsgaW1nRmlsZSk7Ly8kTk9OLU5MUy0xJAotCQl9Ci0JCQotCQlyZXR1cm4gZGlhZ3JhbTsKLQotCX0KLQkKLQlwcml2YXRlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLnV0aWwuRGlhZ3JhbUluZm8gZ2V0UmVhbGl6ZWRVREQoU3VwcHJlc3Npb24gc3VwLCBTdHJpbmcgZGlhZ3JhbVR5cGUpCi0JewotCQkvLyBnZW5lcmF0ZSBkaWFncmFtCi0JCS8vIHNob3cgdGhlIGFjdGl2aXR5IGRpYWdyYW1zCi0JCUlBY3Rpdml0eURpYWdyYW1TZXJ2aWNlIGRpYWdyYW1TZXJ2aWNlID0gbGF5b3V0TWFuYWdlcgotCQkJCS5nZXRBY3Rpdml0eURpYWdyYW1TZXJ2aWNlKCk7Ci0JCWlmIChkaWFncmFtU2VydmljZSAhPSBudWxsKSB7Ci0JCQlJRmlsdGVyIGZpbHRlciA9IGxheW91dE1hbmFnZXIuZ2V0RGlhZ3JhbUFkYXB0ZXJGYWN0b3J5KCkuZ2V0RmlsdGVyKCk7Ci0JCQkKLQkJCS8vIGdldCB0aGUgd3JhcHBlciBmcm9tIHRoZSBXQlMgYWRhcHRlciBmYWN0b3J5Ci0JCQlPYmplY3Qgd3JhcHBlciA9IHN1cC5nZXRPYmplY3RCeVBhdGgoc3VwZXIucGF0aHMsIGxheW91dE1hbmFnZXIuZ2V0RGlhZ3JhbUFkYXB0ZXJGYWN0b3J5KCkpOwotCi0JCQlPYmplY3QgcmVhbGl6ZWQgPSBkaWFncmFtU2VydmljZS5nZXRSZWFsaXplZEZvclVubW9kaWZpZWQod3JhcHBlciwgZmlsdGVyLCBzdXApOwotCQkJCi0JCQlpZihyZWFsaXplZCBpbnN0YW5jZW9mIEFjdGl2aXR5KXsKLQkJCQlvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC51dGlsLkRpYWdyYW1JbmZvIHVkZEluZm8gPSBuZXcgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwudXRpbC5EaWFncmFtSW5mbygKLQkJCQkJCShBY3Rpdml0eSlyZWFsaXplZCk7Ci0JCQkJaWYodWRkSW5mby5jYW5QdWJsaXNoQURJbWFnZSgpKXsKLQkJCQkJcmV0dXJuIHVkZEluZm87IAotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkVEJTKFhtbEVsZW1lbnQgZWxlbWVudFhtbCwgU3VwcHJlc3Npb24gc3VwKQotCXsKLQkJWG1sRWxlbWVudCBicyA9IGVsZW1lbnRYbWwKLQkJLm5ld0NoaWxkKCJicmVha2Rvd24iKS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCAiVGVhbSBCcmVha2Rvd24gU3RydWN0dXJlIikgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJLnNldEF0dHJpYnV0ZSgiRGlzcGxheU5hbWUiLCBnZXREaXNwbGF5TmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCi0JCS8vIHNldCB0aGUgY29sdW1ucwotCQlzZXRDb2x1bW5zKGJzLCBQcmVmZXJlbmNlVXRpbC5nZXRUQlNDb2x1bW5zKCkpOwotCi0JCUNvbXBvc2VkQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkgPSBsYXlvdXRNYW5hZ2VyLmdldFRCU0FkYXB0ZXJGYWN0b3J5KCk7Ci0JCUNvbXBvc2l0ZVJvbGVzIGNycyA9IG51bGw7IC8vbmV3IENvbXBvc2l0ZVJvbGVzKGFkYXB0ZXJGYWN0b3J5LCAoQWN0aXZpdHkpIHN1cGVyLmVsZW1lbnQpOwotCQkKLQkJLy8gcm9vbHVwIHRoZSBsYXlvdXQKLQkJSUJTSXRlbVByb3ZpZGVyIHByb3ZpZGVyID0gKElCU0l0ZW1Qcm92aWRlcikgYWRhcHRlckZhY3RvcnkuYWRhcHQoCi0JCQkJc3VwZXIuZWxlbWVudCwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCQkKLQkJLy8gbmVlZCB0byBnZXQgdGhlIHJhdyBpdGVtIHByb3ZpZGVyIGZyb20gdGhlIGFkYXB0ZXIgZmFjdG9yeQotCQlPYmplY3Qgd3JhcHBlciA9IHN1cC5nZXRPYmplY3RCeVBhdGgoc3VwZXIucGF0aHMsIGFkYXB0ZXJGYWN0b3J5KTsKLQkJaWYgKCB3cmFwcGVyID09IG51bGwgKSB7Ci0JCQl3cmFwcGVyID0gc3VwZXIuZWxlbWVudDsKLQkJfQotCQlQcm9jZXNzRWxlbWVudEl0ZW0gZWxlbWVudEl0ZW0gPSBuZXcgUHJvY2Vzc0VsZW1lbnRJdGVtKHdyYXBwZXIsIHN1cGVyLmVsZW1lbnQsIHN1cGVyLmVsZW1lbnRQcm9jZXNzUGF0aCk7Ci0KLQkJLy8gY29sbGVjdCBhbGwgUm9sZURlc2NyaXB0b3JzIGJlZm9yZSByb2xsdXAKLQkJcHJvdmlkZXIuc2V0Um9sbGVkVXAoZmFsc2UpOwotCQlpdGVtRGV0YWlsLml0ZXJhdGUoYWRhcHRlckZhY3RvcnksIHdyYXBwZXIpOwotCi0JCXByb3ZpZGVyLnNldFJvbGxlZFVwKHRydWUpOwkJCi0JCUFjdGl2aXR5TGF5b3V0U2V0dGluZyBzZXR0aW5nID0gbmV3IEFjdGl2aXR5TGF5b3V0U2V0dGluZyhhZGFwdGVyRmFjdG9yeSwgY3JzLCBzdXApOwotCQlzZXR0aW5nLnJvbGx1cFJvbGVzID0gdHJ1ZTsKLQkJc2V0dGluZy5lc2NhcGVTdHJpbmcgPSB0cnVlOwotCi0JCWl0ZXJhdGUoZWxlbWVudEl0ZW0sIGJzLCBzZXR0aW5nKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkV1BCUyhYbWxFbGVtZW50IGVsZW1lbnRYbWwsIFN1cHByZXNzaW9uIHN1cCkKLQl7Ci0JCVhtbEVsZW1lbnQgYnMgPSBlbGVtZW50WG1sCi0JCS5uZXdDaGlsZCgiYnJlYWtkb3duIikuc2V0QXR0cmlidXRlKCJuYW1lIiwgIldvcmsgUHJvZHVjdCBCcmVha2Rvd24gU3RydWN0dXJlIikgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJLnNldEF0dHJpYnV0ZSgiRGlzcGxheU5hbWUiLCBnZXREaXNwbGF5TmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCi0JCS8vIHNldCB0aGUgY29sdW1ucwotCQlzZXRDb2x1bW5zKGJzLCBQcmVmZXJlbmNlVXRpbC5nZXRXUEJTQ29sdW1ucygpKTsKLQotCQlDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5ID0gbGF5b3V0TWFuYWdlci5nZXRXUEJTQWRhcHRlckZhY3RvcnkoKTsKLQkJQ29tcG9zaXRlUm9sZXMgY3JzID0gbnVsbDsgLy9uZXcgQ29tcG9zaXRlUm9sZXMoYWRhcHRlckZhY3RvcnksIChBY3Rpdml0eSkgc3VwZXIuZWxlbWVudCk7Ci0JCQotCQkvLyByb29sdXAgdGhlIGxheW91dAotCQlJQlNJdGVtUHJvdmlkZXIgcHJvdmlkZXIgPSAoSUJTSXRlbVByb3ZpZGVyKSBhZGFwdGVyRmFjdG9yeS5hZGFwdChzdXBlci5lbGVtZW50LAotCQkJCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCXByb3ZpZGVyLnNldFJvbGxlZFVwKHRydWUpOwotCQkKLQkJQWN0aXZpdHlMYXlvdXRTZXR0aW5nIHNldHRpbmcgPSBuZXcgQWN0aXZpdHlMYXlvdXRTZXR0aW5nKGFkYXB0ZXJGYWN0b3J5LCBjcnMsIHN1cCk7Ci0JCXNldHRpbmcuZXNjYXBlU3RyaW5nID0gdHJ1ZTsKLQotCQkvLyBuZWVkIHRvIGdldCB0aGUgcmF3IGl0ZW0gcHJvdmlkZXIgZnJvbSB0aGUgYWRhcHRlciBmYWN0b3J5Ci0JCU9iamVjdCB3cmFwcGVyID0gc3VwLmdldE9iamVjdEJ5UGF0aChzdXBlci5wYXRocywgYWRhcHRlckZhY3RvcnkpOwotCQlpZiAoIHdyYXBwZXIgPT0gbnVsbCApIHsKLQkJCXdyYXBwZXIgPSBzdXBlci5lbGVtZW50OwotCQl9Ci0JCVByb2Nlc3NFbGVtZW50SXRlbSBlbGVtZW50SXRlbSA9IG5ldyBQcm9jZXNzRWxlbWVudEl0ZW0od3JhcHBlciwgc3VwZXIuZWxlbWVudCwgc3VwZXIuZWxlbWVudFByb2Nlc3NQYXRoKTsKLQkJaXRlcmF0ZShlbGVtZW50SXRlbSwgYnMsIHNldHRpbmcpOwotCi0JfQotCi0JLyoqCi0JICogaXRlcmF0ZSB0aGUgYnJlYWsgZG93biBzdHJ1Y3R1cmUgYW5kIGJ1aWxkIHRoZSB4bWwgZG9jdW1lbnQKLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50SXRlbQotCSAqICAgICAgICAgICAgVGhlIG9iamVjdCB0byBpdGVyYXRlLiBJdCBjYW4gYmUgYSBicmVha2Rvd24gZWxlbWVudCwgb3IgaXQncwotCSAqICAgICAgICAgICAgYWRhcHRvcgotCSAqIEBwYXJhbSBwYXJlbnRYbWwKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKi8KLQlwcml2YXRlIHZvaWQgaXRlcmF0ZShQcm9jZXNzRWxlbWVudEl0ZW0gcGFyZW50SXRlbSwgWG1sRWxlbWVudCBwYXJlbnRYbWwsCi0JCQlBY3Rpdml0eUxheW91dFNldHRpbmcgc2V0dGluZykgewotCQlpdGVyYXRlKHBhcmVudEl0ZW0sIHBhcmVudFhtbCwgc2V0dGluZywgMCk7Ci0JfQotCQotCS8vIGxldmVsIHRvIGV4cGFuZCBhbGwgQldTIGFjdGl2aXRpZXMgdG8sIDAgZm9yIHRoZSBmaXJzdCBsZXZlbAotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBBQ1RJVklUWV9TSE9XX0xFVkVMID0gMTsKLQkKLQkvKioKLQkgKiBpdGVyYXRlIHRoZSBicmVhayBkb3duIHN0cnVjdHVyZSBhbmQgYnVpbGQgdGhlIHhtbCBkb2N1bWVudAotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnRJdGVtCi0JICogICAgICAgICAgICBUaGUgb2JqZWN0IHRvIGl0ZXJhdGUuIEl0IGNhbiBiZSBhIGJyZWFrZG93biBlbGVtZW50LCBvciBpdCdzCi0JICogICAgICAgICAgICBhZGFwdG9yCi0JICogQHBhcmFtIHBhcmVudFhtbAotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqLwotCXByaXZhdGUgdm9pZCBpdGVyYXRlKFByb2Nlc3NFbGVtZW50SXRlbSBwYXJlbnRJdGVtLCBYbWxFbGVtZW50IHBhcmVudFhtbCwKLQkJCUFjdGl2aXR5TGF5b3V0U2V0dGluZyBzZXR0aW5nLCBpbnQgYWN0TGV2ZWwpIHsKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyIHByb3ZpZGVyID0gbnVsbDsKLQkJT2JqZWN0IHBhcmVudE9iaiA9IHBhcmVudEl0ZW0ucmF3SXRlbTsKLQkJCQotCQlUaW1lciB0aW1lciA9IG51bGw7Ci0JCWlmIChkZWJ1ZyApewotCQkJdGltZXIgPSBuZXcgVGltZXIoKTsJCQkKLQkJfQotCQkKLQkJaWYgKHBhcmVudE9iaiBpbnN0YW5jZW9mIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlcikgewotCQkJcHJvdmlkZXIgPSAoSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyKSBwYXJlbnRPYmo7Ci0JCX0gZWxzZSB7Ci0JCQlwcm92aWRlciA9IChJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIpIHNldHRpbmcuYWRhcHRlckZhY3RvcnkuYWRhcHQoCi0JCQkJCXBhcmVudE9iaiwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJfQotCi0JCS8vIEVpdGhlciBkZWxlZ2F0ZSB0aGUgY2FsbCBvciByZXR1cm4gbm90aGluZy4KLQkJaWYgKHByb3ZpZGVyICE9IG51bGwpIHsKLS8vCQkJU3RyaW5nIGRpc3BsYXlOYW1lID0gUHJvY2Vzc1V0aWwuZ2V0QXR0cmlidXRlKHBhcmVudE9iaiwKLS8vCQkJCQlJQlNJdGVtUHJvdmlkZXIuQ09MX1BSRVNFTlRBVElPTl9OQU1FLCBwcm92aWRlcik7Ci0vLwkJCXBhcmVudFhtbC5zZXRBdHRyaWJ1dGUoIkRpc3BsYXlOYW1lIiwgZGlzcGxheU5hbWUpOyAvLyROT04tTkxTLTEkCi0KLQkJCS8vTGlzdCB1bmlxdWVMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJQ29sbGVjdGlvbiBpdGVtcyA9IHByb3ZpZGVyLmdldENoaWxkcmVuKHBhcmVudE9iaik7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gaXRlbXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCByYXdpdGVtID0gaXQubmV4dCgpOwotCi0JCQkJTWV0aG9kRWxlbWVudCBpdGVtID0gKE1ldGhvZEVsZW1lbnQpIExpYnJhcnlVdGlsCi0JCQkJCQkudW53cmFwKHJhd2l0ZW0pOwotCi0JCQkJaWYgKCBzZXR0aW5nLnNob3dUYXNrT25seSAmJiAoYWN0TGV2ZWwgPiBBQ1RJVklUWV9TSE9XX0xFVkVMKQotCQkJCQkJJiYgIShpdGVtIGluc3RhbmNlb2YgQWN0aXZpdHkgfHwgaXRlbSBpbnN0YW5jZW9mIFRhc2tEZXNjcmlwdG9yKSApIHsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCi0JCQkJaWYgKCBpdGVtID09IG51bGwgKSB7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCQkKLQkJCQkvLyBhZGQgdGhlIGVsZW1lbnQgdG8gdGhlIHJlZmVyZW5jZSBsaXN0LCAKLQkJCQkvLyB0aGlzIGlzIGZvciBwdWJsaXNoaW5nIG9ubHksIGZvciBicm93c2luZywgdGhpcyBjYWxsIGRvZXMgbm90aGluZwotCQkJCWdldExheW91dE1ncigpLmdldFZhbGlkYXRvcigpLmFkZFJlZmVyZW5jZWRFbGVtZW50KHN1cGVyLmVsZW1lbnQsIGl0ZW0pOwotCQkJCQotCQkJCVByb2Nlc3NFbGVtZW50SXRlbSBlbGVtZW50SXRlbSA9IG5ldyBQcm9jZXNzRWxlbWVudEl0ZW0ocmF3aXRlbSwgaXRlbSwgcGFyZW50SXRlbSk7Ci0KLQkJCQkvLyBQcm9jZXNzIFB1Ymxpc2hpbmc6IFJlcGxhY2Ugcm9sZSBkZXNjcmlwdG9yCi0JCQkJLy8gd2l0aCBjb21wb3NpdGUgcm9sZQotCQkJCS8vIGlmIGl0IGNvbnRhaW5zIHRoZSByb2xlIGRlc2NyaXB0b3IgZHVyaW5nIHByZXZpZXcvcHVibGlzaGluZwotCQkJCS8vIHNvIGlmIHRoaXMgZ3V5IGlzIGEgUm9sZURlc2NycHRvciwgZmluZCB0aGUgY29tcG9zaXRlIHJvbGUKLQkJCQkvLyBkZXNjcmlwdG9yIHdpdGhpbiB0aGUgc2NvcGUKLQkJCQkvLyAKLQkJCQlpZiAoKHBhcmVudE9iaiBpbnN0YW5jZW9mIEFjdGl2aXR5ICYmIHNldHRpbmcuY3JzICE9IG51bGwpCi0JCQkJCQkmJiAoaXRlbSBpbnN0YW5jZW9mIFJvbGVEZXNjcmlwdG9yKSkgewotCQkJCQlDb21wb3NpdGVSb2xlIGNyID0gc2V0dGluZy5jcnMuZ2V0Q29tcG9zaXRlUm9sZSgKLQkJCQkJCQkoQWN0aXZpdHkpIHBhcmVudE9iaiwgKFJvbGVEZXNjcmlwdG9yKSBpdGVtKTsKLQkJCQkJaWYgKGNyICE9IG51bGwpIHsKLQkJCQkJCWl0ZW0gPSBjcjsKLQkJCQkJfQotCQkJCX0KLQotCQkJCVhtbEVsZW1lbnQgY2hpbGQgPSBnZW5lcmF0ZUNoaWxkWG1sKGVsZW1lbnRJdGVtLCBwYXJlbnRYbWwsIHNldHRpbmcpOwotCQkJCQkKLQkJCQlwYXJlbnRYbWwuYWRkQ2hpbGQoY2hpbGQpOwotCQkJCQkJCQkJCi0JCQkJLy8gc2hvdyBvbmx5IHRhc2sgdGFzayBkZXNjcmlwdG9ycyBmb3Igc3ViIGFjdGl2aXRpZXMgaW4gdGhlIHRicyBsYXlvdXQKLQkJCQlpZiAoIHNldHRpbmcuc2hvd1Rhc2tPbmx5ICYmIChhY3RMZXZlbCA+IEFDVElWSVRZX1NIT1dfTEVWRUwpICYmICEoaXRlbSBpbnN0YW5jZW9mIEFjdGl2aXR5ICkpIHsKLQkJCQkJLy8gaWYgYWN0IGxldmVsID4gMCwgb25seSBpdGVyYXRlIHRoZSBzdWItYWN0aXZpdGllcwotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJCi0JCQkJLy8gaW5ldGVyYXRlIGNoaWxkcmVuLCBub3QganVzdCBhY3Rpdml0eSwgYW55IGNoaWxkIGluIHRoZQotCQkJCS8vIHJhd2l0ZW0gc2hvdWxkIGJlIGl0ZXJhdGVkLAotCQkJCS8vIHN1Y2ggYXMgdGhlIHN1Yi1hcnRpZmFjdHMKLQkJCQlpdGVyYXRlKGVsZW1lbnRJdGVtLCBjaGlsZCwgc2V0dGluZywgCi0JCQkJCQkoaXRlbSBpbnN0YW5jZW9mIEFjdGl2aXR5KSA/IGFjdExldmVsKzEgOiBhY3RMZXZlbCk7CQkJCQotCQkJfQotCQl9Ci0JCQotCQlpZiAoIHRpbWVyICE9IG51bGwgKSB7Ci0JCQl0aW1lci5zdG9wKCk7CQotCQkJaWYgKHRpbWVyLmdldFRpbWUoKSA+IDEwMCkgewotCQkJCVN0cmluZyBtc2cgPSB0aW1lci5nZXRUaW1lKCkgKyAiIG1pbmkgc2Vjb25kcyBpdGVyYXRpbmcgYnJlYWtkb3duIGl0ZW0gIiArIExpYnJhcnlVdGlsLmdldFR5cGVOYW1lKHBhcmVudEl0ZW0uZWxlbWVudCkgIDsgLy8kTk9OLU5MUy0xJCAJCQotCQkJCVN5c3RlbS5vdXQucHJpbnRsbihtc2cpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBYbWxFbGVtZW50IGdlbmVyYXRlQ2hpbGRYbWwoUHJvY2Vzc0VsZW1lbnRJdGVtIGVsZW1lbnRJdGVtLCBYbWxFbGVtZW50IHBhcmVudFhtbCwKLQkJCUFjdGl2aXR5TGF5b3V0U2V0dGluZyBzZXR0aW5nKQotCXsKLQkJVGltZXIgdGltZXIgPSBudWxsOwotCQlpZiAoZGVidWcgKXsKLQkJCXRpbWVyID0gbmV3IFRpbWVyKCk7CQkJCi0JCX0KLQkJCi0JCU1ldGhvZEVsZW1lbnQgaXRlbSA9IGVsZW1lbnRJdGVtLmVsZW1lbnQ7Ci0JCQotCQlJRWxlbWVudExheW91dCBsID0gZ2V0TGF5b3V0KGVsZW1lbnRJdGVtKTsKLQkKLQkJLy8gbGF0IHRoZSBwcmVzZW50YXRpb24gdG8gZGV0ZXJtaW5lIHdoZW4gdG8gc2hvdwotCQkvLyBzZXQgZ2VuZXJhdGUgdGhlIGZsYWcgZm9yIGJyb3dzaW5nCi0JCWJvb2xlYW4gaXNTdXByZXNzZWQgPSBzZXR0aW5nLnN1cC5pc1N1cHByZXNzZWQoZWxlbWVudEl0ZW0ucmF3SXRlbSk7Ci0JCWlmICggaXNTdXByZXNzZWQgKSB7Ci0JCQlpdGVtRGV0YWlsLmFkZFN1cHByZXNzZWQoZWxlbWVudEl0ZW0uZWxlbWVudCk7Ci0JCX0KLQkJCi0JCVhtbEVsZW1lbnQgY2hpbGQgPSBsLmdldFhtbEVsZW1lbnQoZmFsc2UpOwotCi0JCS8vIHdlIHN0aWxsIGdlbmVyYXRlIHRoZSBpdGVtIGV2ZW4gdGhvdWdoIGl0J3Mgc3VwcHJlc3NlZCwgCi0JCS8vIGxldCB0aGUgbGF5b3V0IGphdmFzY3JpcHQgdG8gaGFuZGxlIHRoZSBzaG93IG9yIGhpZGUKLQkJLy8gc2V0IHRoZSBpc1N1cHJlc3NlZCBmbGFnIGZvciBicm93c2luZyBtb2RlbCBvbmx5LAotCQkvLyBmb3IgcHVibGlzaGluZywgdGhlIGZsYWcgd2lsbCBiZSBnZWVucmF0ZWQgYW5kIHNhdmVkIGluIGEgc2VwZXJhdGVkIGpzIGZpbGUKLQkJLy8gcHVibGlzaGVkIGh0bWwgcGFnZXMgd2lsbCBnZXQgdGhlIGlzU3VwcmVzc2VkIGZsYWcgdmlhIGphdmFzY3JpcHQgbWV0aG9kLgotCQlpZiAoICFnZXRMYXlvdXRNZ3IoKS5pc1B1Ymxpc2hpbmdNb2RlKCkgKQotCQl7Ci0JCQljaGlsZC5zZXRBdHRyaWJ1dGUoImlzU3VwcmVzc2VkIiwgKGlzU3VwcmVzc2VkID8gInRydWUiIDogImZhbHNlIikgKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJfQotCQkKLQkJSUJTSXRlbVByb3ZpZGVyIGFkYXB0ZXIgPSBudWxsOwotCQlpZiAoZWxlbWVudEl0ZW0ucmF3SXRlbSBpbnN0YW5jZW9mIElCU0l0ZW1Qcm92aWRlcikgewotCQkJYWRhcHRlciA9IChJQlNJdGVtUHJvdmlkZXIpIGVsZW1lbnRJdGVtLnJhd0l0ZW07Ci0JCX0gZWxzZSB7Ci0JCQlhZGFwdGVyID0gKElCU0l0ZW1Qcm92aWRlcikgc2V0dGluZy5hZGFwdGVyRmFjdG9yeQotCQkJCQkuYWRhcHQoZWxlbWVudEl0ZW0uZWxlbWVudCwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCTsKLQkJfQotCi0JCS8vIGdldCB0aGUgaW5kZXggYW5kIHByZWRlY2Vzc29yIGluZGVjZXMKLQkJaWYgKGVsZW1lbnRJdGVtLmVsZW1lbnQgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50KSB7Ci0JCQlTdHJpbmcgaW5kZXggPSBnZXRJbmRleChhZGFwdGVyKTsKLQkJCQotCQkJU3RyaW5nIG1vZGVsSW5mbyA9IG51bGw7CQkJCi0JCQlpZiAoYWRhcHRlciBpbnN0YW5jZW9mIENvbXBvc2VkV1BEZXNjcmlwdG9yV3JhcHBlckl0ZW1Qcm92aWRlcikgewotCQkJCUNvbXBvc2VkV1BEZXNjcmlwdG9yV3JhcHBlckl0ZW1Qcm92aWRlciBwcm92aWRlciA9IChDb21wb3NlZFdQRGVzY3JpcHRvcldyYXBwZXJJdGVtUHJvdmlkZXIpIGFkYXB0ZXI7Ci0JCQkJbW9kZWxJbmZvID0gcHJvdmlkZXIuZ2V0QXR0cmlidXRlKGl0ZW0sIElCU0l0ZW1Qcm92aWRlci5DT0xfTU9ERUxfSU5GTyk7Ci0JCQl9IGVsc2UgewotCQkJCW1vZGVsSW5mbyA9IFByb2Nlc3NVdGlsLmdldEF0dHJpYnV0ZShpdGVtLAotCQkJCQkJSUJTSXRlbVByb3ZpZGVyLkNPTF9NT0RFTF9JTkZPLCBhZGFwdGVyKTsKLQkJCX0JCQkKLQkJCQotCQkJU3RyaW5nIHRlYW0gPSBQcm9jZXNzVXRpbC5nZXRBdHRyaWJ1dGUoaXRlbSwKLQkJCQkJSUJTSXRlbVByb3ZpZGVyLkNPTF9URUFNUywgYWRhcHRlcik7Ci0JCQlTdHJpbmcgcHJlZml4ID0gUHJvY2Vzc1V0aWwuZ2V0QXR0cmlidXRlKGl0ZW0sCi0JCQkJCUlCU0l0ZW1Qcm92aWRlci5DT0xfUFJFRklYLCBhZGFwdGVyKTsJCQkKLQkJCVN0cmluZyBpc0V2ZW50RHJpdmVuID0gUHJvY2Vzc1V0aWwuZ2V0QXR0cmlidXRlKGl0ZW0sCi0JCQkJCUlCU0l0ZW1Qcm92aWRlci5DT0xfSVNfRVZFTlRfRFJJVkVOLCBhZGFwdGVyKTsKLQkJCVN0cmluZyBpc09uZ29pbmcgPSBQcm9jZXNzVXRpbC5nZXRBdHRyaWJ1dGUoaXRlbSwKLQkJCQkJSUJTSXRlbVByb3ZpZGVyLkNPTF9JU19PTkdPSU5HLCBhZGFwdGVyKTsKLQkJCVN0cmluZyBpc09wdGlvbmFsID0gUHJvY2Vzc1V0aWwuZ2V0QXR0cmlidXRlKGl0ZW0sCi0JCQkJCUlCU0l0ZW1Qcm92aWRlci5DT0xfSVNfT1BUSU9OQUwsIGFkYXB0ZXIpOwotCQkJU3RyaW5nIGlzUGxhbm5lZCA9IFByb2Nlc3NVdGlsLmdldEF0dHJpYnV0ZShpdGVtLAotCQkJCQlJQlNJdGVtUHJvdmlkZXIuQ09MX0lTX1BMQU5ORUQsIGFkYXB0ZXIpOwotCQkJU3RyaW5nIGlzUmVwZWF0YWJsZSA9IFByb2Nlc3NVdGlsLmdldEF0dHJpYnV0ZShpdGVtLAotCQkJCQlJQlNJdGVtUHJvdmlkZXIuQ09MX0lTX1JFUEVBVEFCTEUsIGFkYXB0ZXIpOwotCQkJU3RyaW5nIGhhc011bHRpcGxlT2NjdXJyZW5jZXMgPSBQcm9jZXNzVXRpbAotCQkJCQkuZ2V0QXR0cmlidXRlKAotCQkJCQkJCWl0ZW0sCi0JCQkJCQkJSUJTSXRlbVByb3ZpZGVyLkNPTF9IQVNfTVVMVElQTEVfT0NDVVJSRU5DRVMsCi0JCQkJCQkJYWRhcHRlcik7Ci0JCQkKLQkJCVN0cmluZyBkaXNwbGF5TmFtZSA9IFByb2Nlc3NVdGlsLmdldEF0dHJpYnV0ZShpdGVtLAotCQkJCQlJQlNJdGVtUHJvdmlkZXIuQ09MX1BSRVNFTlRBVElPTl9OQU1FLCBhZGFwdGVyKTsKLQkJCQotCQkJU3RyaW5nIG1OYW1lID0gUHJvY2Vzc1V0aWwuZ2V0QXR0cmlidXRlKGl0ZW0sCi0JCQkJCUlCU0l0ZW1Qcm92aWRlci5DT0xfTkFNRSwgYWRhcHRlcik7Ci0KLQkJCS8vIGZvciBXQlMgbGF5b3V0IHdlIHB1dCB0aGUgc3RyaW5nIGludG8gamF2YXNjcmlwdCB2YXJpYWJsZXMKLQkJCS8vIHNvIG5lZWQgdG8gZXNjYXBlIHRoZSBxdW90ZXMgIiBhbmQgJwotCQkJaWYgKCBzZXR0aW5nLmVzY2FwZVN0cmluZyApCi0JCQl7Ci0JCQkJbW9kZWxJbmZvID0gU3RyVXRpbC5lc2NhcGUobW9kZWxJbmZvKTsKLQkJCQlkaXNwbGF5TmFtZSA9IFhNTFV0aWwuZXNjYXBlKGRpc3BsYXlOYW1lKTsKLQkJCQltTmFtZSA9IFhNTFV0aWwuZXNjYXBlKG1OYW1lKTsKLQkJCQkKLQkJCQkvLyBhbmQgdGhlIHVybAotCQkJCS8vIG5lZWQgYW4gZXNjYXBlZCB1cmwgZm9yIGphdmFzY3JpcHQKLQkJCQlTdHJpbmcganNFc2NhcGVkVXJsID0gU3RyVXRpbC5lc2NhcGUobC5nZXRVcmwoKSk7Ci0JCQkJY2hpbGQuc2V0QXR0cmlidXRlKCJVcmwiLCBqc0VzY2FwZWRVcmwpOyAvLyROT04tTkxTLTEkCi0KLQkJCX0KLQkJCQotCQkJY2hpbGQuc2V0QXR0cmlidXRlKCJJbmRleCIsIGluZGV4KSAvLyROT04tTkxTLTEkCi0JCQkJCS5zZXRBdHRyaWJ1dGUoIk1vZGVsSW5mbyIsIG1vZGVsSW5mbykgLy8kTk9OLU5MUy0xJAotCQkJCQkuc2V0QXR0cmlidXRlKCJUZWFtIiwgdGVhbSk7IC8vJE5PTi1OTFMtMSQKLQotCQkJY2hpbGQubmV3Q2hpbGQoImF0dHJpYnV0ZSIpLnNldEF0dHJpYnV0ZSgibmFtZSIsICJwcmVmaXgiKS5zZXRWYWx1ZShwcmVmaXgpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCi0JCQljaGlsZAotCQkJCQkubmV3Q2hpbGQoImF0dHJpYnV0ZSIpLnNldEF0dHJpYnV0ZSgibmFtZSIsICJpc0V2ZW50RHJpdmVuIikuc2V0VmFsdWUoaXNFdmVudERyaXZlbik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIAotCQkJY2hpbGQKLQkJCQkJLm5ld0NoaWxkKCJhdHRyaWJ1dGUiKS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCAiaXNPbmdvaW5nIikuc2V0VmFsdWUoaXNPbmdvaW5nKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgCi0JCQljaGlsZAotCQkJCQkubmV3Q2hpbGQoImF0dHJpYnV0ZSIpLnNldEF0dHJpYnV0ZSgibmFtZSIsICJpc09wdGlvbmFsIikuc2V0VmFsdWUoaXNPcHRpb25hbCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIAotCQkJY2hpbGQKLQkJCQkJLm5ld0NoaWxkKCJhdHRyaWJ1dGUiKS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCAiaXNQbGFubmVkIikuc2V0VmFsdWUoaXNQbGFubmVkKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgCi0JCQljaGlsZAotCQkJCQkubmV3Q2hpbGQoImF0dHJpYnV0ZSIpLnNldEF0dHJpYnV0ZSgibmFtZSIsICJpc1JlcGVhdGFibGUiKS5zZXRWYWx1ZShpc1JlcGVhdGFibGUpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAKLQkJCWNoaWxkCi0JCQkJCS5uZXdDaGlsZCgiYXR0cmlidXRlIikuc2V0QXR0cmlidXRlKCJuYW1lIiwgImhhc011bHRpcGxlT2NjdXJyZW5jZXMiKS5zZXRWYWx1ZShoYXNNdWx0aXBsZU9jY3VycmVuY2VzKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgCi0KLQkJCWNoaWxkLnNldEF0dHJpYnV0ZSgiRGlzcGxheU5hbWUiLCBkaXNwbGF5TmFtZSk7IC8vJE5PTi1OTFMtMSQKLQkJCWNoaWxkLnNldEF0dHJpYnV0ZSgiTmFtZSIsIG1OYW1lKTsgLy8kTk9OLU5MUy0xJAotCQl9CQkKLQotCQlpZiAoaXRlbSBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgewotCQkJU3RyaW5nIGVudHJ5U3RhdGUgPSBhZGFwdGVyLmdldEF0dHJpYnV0ZShpdGVtLCBJQlNJdGVtUHJvdmlkZXIuQ09MX0VOVFJZX1NUQVRFKTsKLQkJCVN0cmluZyBleGl0U3RhdGUgPSBhZGFwdGVyLmdldEF0dHJpYnV0ZShpdGVtLCBJQlNJdGVtUHJvdmlkZXIuQ09MX0VYSVRfU1RBVEUpOwotCQkJU3RyaW5nIGRlbGl2ZXJhYmxlID0gYWRhcHRlci5nZXRBdHRyaWJ1dGUoaXRlbSwgSUJTSXRlbVByb3ZpZGVyLkNPTF9ERUxJVkVSQUJMRSk7Ci0KLQkJCWNoaWxkLnNldEF0dHJpYnV0ZSgiRW50cnlTdGF0ZSIsIGVudHJ5U3RhdGUpIC8vJE5PTi1OTFMtMSQKLQkJCQkJLnNldEF0dHJpYnV0ZSgiRXhpdFN0YXRlIiwgZXhpdFN0YXRlKSAvLyROT04tTkxTLTEkCi0JCQkJCS5zZXRBdHRyaWJ1dGUoIkRlbGl2ZXJhYmxlIiwgZGVsaXZlcmFibGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlpZiAoaXRlbSBpbnN0YW5jZW9mIFdvcmtCcmVha2Rvd25FbGVtZW50KSB7Ci0JCQlTdHJpbmcgcHJlZGVjZXNzb3JzID0gZ2V0UHJlZGVjZXNzb3JzKGFkYXB0ZXIsCi0JCQkJCXNldHRpbmcuc3VwKTsKLQkJCWNoaWxkLnNldEF0dHJpYnV0ZSgiUHJlZGVjZXNzb3JzIiwgcHJlZGVjZXNzb3JzKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJLy8gaWYgaXQncyBhIHRhc2sgZGVzY3JpcHRvciwgZ2V0IHRoZSBzdGVwcwotCQlpZiAoaXRlbSBpbnN0YW5jZW9mIFRhc2tEZXNjcmlwdG9yKSB7Ci0KLQkJCVhtbEVsZW1lbnQgc3RlcHNYbWwgPSBjaGlsZC5uZXdDaGlsZCgiU3RlcHMiKTsgLy8kTk9OLU5MUy0xJAotCQkJVGFza0Rlc2NyaXB0b3IgdGQgPSAoVGFza0Rlc2NyaXB0b3IpIGl0ZW07Ci0JCQlMaXN0IHNlbFN0ZXBzID0gdGQuZ2V0U2VsZWN0ZWRTdGVwcygpOwotCQkJVGFzayB0ID0gKFRhc2spIENvbmZpZ3VyYXRpb25IZWxwZXIKLQkJCQkJLmdldENhbGN1bGF0ZWRFbGVtZW50KHRkLmdldFRhc2soKSwKLQkJCQkJCQlnZXRMYXlvdXRNZ3IoKS5nZXRDb25maWd1cmF0aW9uKCkpOwotCQkJaWYgKHQgIT0gbnVsbCkgewotCQkJCUxpc3Qgc3RlcHMgPSBDb25maWd1cmF0aW9uSGVscGVyCi0JCQkJCQkuY2FsYzBuRmVhdHVyZVZhbHVlKHQsIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCS5nZXRUYXNrX1N0ZXBzKCksIGdldExheW91dE1ncigpCi0JCQkJCQkJCS5nZXRFbGVtZW50UmVhbGl6ZXIoKSk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzdGVwcy5zaXplKCk7IGkrKykgewotCQkJCQlPYmplY3Qgc3RlcCA9IHN0ZXBzLmdldChpKTsKLQkJCQkJYm9vbGVhbiBzZWxlY3RlZCA9IHNlbFN0ZXBzLmNvbnRhaW5zKHN0ZXApOwotCQkJCQlzdGVwc1htbAotCQkJCQkJCS5uZXdDaGlsZCgiU3RlcCIpIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkuc2V0QXR0cmlidXRlKAotCQkJCQkJCQkJImluZGV4IiwgSW50ZWdlci50b1N0cmluZyhpKSkgLy8kTk9OLU5MUy0xJAotCQkJCQkJCS5zZXRBdHRyaWJ1dGUoCi0JCQkJCQkJCQkic2VsZWN0ZWQiLCBzZWxlY3RlZCA/ICJ0cnVlIiA6ICJmYWxzZSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCX0KLQkJCX0KLQotCQl9Ci0KLQkJLy8gYnVpbGQgdGhlIHRlYW0gcHJvZmlsZSB0cmVlLgotCQkvLyBUaGlzIGlzIGEgdGVtcG9yYXJ5IHJlcGxhY2VtZW50IGZvciB0aGUgdGVhbSBicmVha2Rvd24KLQkJLy8gc3RydWN0dXJlIGRpYWdyYW0KLQkJaWYgKGl0ZW0gaW5zdGFuY2VvZiBUZWFtUHJvZmlsZSkgewotCQkJVGVhbVByb2ZpbGUgc3VwZXJUZWFtID0gKChUZWFtUHJvZmlsZSlpdGVtKS5nZXRTdXBlclRlYW0oKTsKLQkJCWNoaWxkLnNldEF0dHJpYnV0ZSgiaGFzU3VwZXJUZWFtIiwgKHN1cGVyVGVhbSAhPSBudWxsKSA/ICJ0cnVlIiA6ICJmYWxzZSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQl9Ci0KLQkJLy8gaWYgcm9sZSByb2xsdXAgaXMgc2V0LCBidWlsZCB0aGUgcm9sZSBzdWIgdHJlZQotCQlpZiAoc2V0dGluZy5yb2xsdXBSb2xlcyAmJiBpdGVtIGluc3RhbmNlb2YgUm9sZURlc2NyaXB0b3IpIHsKLQkJCWJ1aWxkUm9sZVJvbGx1cCgoUm9sZURlc2NyaXB0b3IpIGl0ZW0sIGNoaWxkLCBzZXR0aW5nKTsKLQkJfQotCQkKLQkJaWYgKCB0aW1lciAhPSBudWxsICkgewotCQkJdGltZXIuc3RvcCgpOwkKLQkJCWlmICh0aW1lci5nZXRUaW1lKCkgPiAxMDApIHsKLQkJCQlTdHJpbmcgbXNnID0gdGltZXIuZ2V0VGltZSgpICsgIiBtaW5pIHNlY29uZHMgZ2VuZXJhdGluZyB4bWwgZm9yIGJyZWFrZG93biBpdGVtICIgKyBMaWJyYXJ5VXRpbC5nZXRUeXBlTmFtZShlbGVtZW50SXRlbS5lbGVtZW50KSAgOyAvLyROT04tTkxTLTEkIAkJCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKG1zZyk7Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiBjaGlsZDsKLQl9Ci0JCi0JCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkUm9sZVJvbGx1cChSb2xlRGVzY3JpcHRvciByb2xlSXRlbSwgWG1sRWxlbWVudCBwYXJlbnRYbWwsCi0JCQlBY3Rpdml0eUxheW91dFNldHRpbmcgc2V0dGluZykgewotCQlSb2xlIHIgPSByb2xlSXRlbS5nZXRSb2xlKCk7Ci0JCUxpc3QgZGVzY3JpcHRvcnMgPSBpdGVtRGV0YWlsLmdldERlc2NyaXB0b3JzKHIpOwotCQlpZiAoIGRlc2NyaXB0b3JzID09IG51bGwgKSB7Ci0JCQlkZXNjcmlwdG9ycyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJfQotCQlpZiAoICFkZXNjcmlwdG9ycy5jb250YWlucyhyb2xlSXRlbSkgKSB7Ci0JCQlkZXNjcmlwdG9ycy5hZGQocm9sZUl0ZW0pOwotCQl9Ci0JCQotCQlMaXN0IHJlc3BvbnNpYmxlRm9yID0gbmV3IEFycmF5TGlzdCgpOwotCQlMaXN0IG1vZGlmaWVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlMaXN0IHByaW1hcnlUYXNrcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJTGlzdCBhZGRpdGlvbmFsVGFza3MgPSBuZXcgQXJyYXlMaXN0KCk7CQotCQlMaXN0IGl0ZW1zOwotCQkKLQkJZm9yICggSXRlcmF0b3IgaXQgPSBkZXNjcmlwdG9ycy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7ICkgewotCQkJCi0JCQlyb2xlSXRlbSA9IChSb2xlRGVzY3JpcHRvcikgaXQubmV4dCgpOwotCQkJCi0JCQlpdGVtcyA9IENvbmZpZ3VyYXRpb25IZWxwZXIuY2FsYzBuRmVhdHVyZVZhbHVlKHJvbGVJdGVtLAotCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRSb2xlRGVzY3JpcHRvcl9SZXNwb25zaWJsZUZvcigpLCAKLQkJCQkJZ2V0TGF5b3V0TWdyKCkuZ2V0RWxlbWVudFJlYWxpemVyKCkpOwotCQkJcmVzcG9uc2libGVGb3IuYWRkQWxsKGl0ZW1zKTsKLQkJCQkKLQkJCWl0ZW1zID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMG5GZWF0dXJlVmFsdWUocm9sZUl0ZW0sCi0JCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFJvbGVEZXNjcmlwdG9yX01vZGlmaWVzKCksIGdldExheW91dE1ncigpLmdldEVsZW1lbnRSZWFsaXplcigpKTsKLQkJCW1vZGlmaWVzLmFkZEFsbChpdGVtcyk7Ci0JCQkKLQkJCWl0ZW1zID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMG5GZWF0dXJlVmFsdWUocm9sZUl0ZW0sCi0JCQkJCUFzc29jaWF0aW9uSGVscGVyLlJvbGVEZXNjcmlwdG9yX1ByaW1hcnlUYXNrRGVzY3JpcHRvcnMsCi0JCQkJCWdldExheW91dE1ncigpLmdldEVsZW1lbnRSZWFsaXplcigpKTsKLQkJCXByaW1hcnlUYXNrcy5hZGRBbGwoaXRlbXMpOwotCQkJCi0JCQlpdGVtcyA9IENvbmZpZ3VyYXRpb25IZWxwZXIuY2FsYzBuRmVhdHVyZVZhbHVlKHJvbGVJdGVtLAotCQkJCQlBc3NvY2lhdGlvbkhlbHBlci5Sb2xlRGVzY3JpcHRvcl9BZGRpdGlvbmFsVGFza0Rlc2NyaXB0b3JzLCAKLQkJCQkJZ2V0TGF5b3V0TWdyKCkuZ2V0RWxlbWVudFJlYWxpemVyKCkpOwotCQkJYWRkaXRpb25hbFRhc2tzLmFkZEFsbChpdGVtcyk7Ci0JCX0KLQkJCi0JCUNvbGxlY3Rpb25zLnNvcnQocmVzcG9uc2libGVGb3IsIENvbXBhcmF0b3JzLlBSRVNFTlRBVElPTl9OQU1FX0NPTVBBUkFUT1IpOwotCQljcmVhdGVSb2xlUm9sbHVwTm9kZXMocGFyZW50WG1sLCByZXNwb25zaWJsZUZvciwgVG5nVXRpbAotCQkJCS5nZXRGZWF0dXJlVGV4dChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRSb2xlRGVzY3JpcHRvcl9SZXNwb25zaWJsZUZvcigpKSk7Ci0KLQkJQ29sbGVjdGlvbnMuc29ydChtb2RpZmllcywgQ29tcGFyYXRvcnMuUFJFU0VOVEFUSU9OX05BTUVfQ09NUEFSQVRPUik7Ci0JCWNyZWF0ZVJvbGVSb2xsdXBOb2RlcyhwYXJlbnRYbWwsIG1vZGlmaWVzLCBUbmdVdGlsCi0JCQkJLmdldEZlYXR1cmVUZXh0KFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFJvbGVEZXNjcmlwdG9yX01vZGlmaWVzKCkpKTsKLQotCQlDb2xsZWN0aW9ucy5zb3J0KHByaW1hcnlUYXNrcywgQ29tcGFyYXRvcnMuUFJFU0VOVEFUSU9OX05BTUVfQ09NUEFSQVRPUik7Ci0JCWNyZWF0ZVJvbGVSb2xsdXBOb2RlcyhwYXJlbnRYbWwsIHByaW1hcnlUYXNrcywgCi0JCQkJTGlicmFyeVJlc291cmNlcy5BY3Rpdml0eUxheW91dF9wcmltYXJ5VGFza3NfdGV4dCk7IAotCi0JCUNvbGxlY3Rpb25zLnNvcnQoYWRkaXRpb25hbFRhc2tzLCBDb21wYXJhdG9ycy5QUkVTRU5UQVRJT05fTkFNRV9DT01QQVJBVE9SKTsKLQkJY3JlYXRlUm9sZVJvbGx1cE5vZGVzKHBhcmVudFhtbCwgYWRkaXRpb25hbFRhc2tzLCAKLQkJCQlMaWJyYXJ5UmVzb3VyY2VzLkFjdGl2aXR5TGF5b3V0X2FkZGl0aW9uYWxUYXNrc190ZXh0KTsgCi0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVJvbGVSb2xsdXBOb2RlcyhYbWxFbGVtZW50IHBhcmVudFhtbCwgTGlzdCBpdGVtcywKLQkJCVN0cmluZyBpbmZvKSB7Ci0JCQotCQkvLyAxNjAxODggLSBQdWJsaXNoZWQgVGVhbSBBbGxvY2F0aW9uIHRhYiBzaG93cyByZWR1bmRhbnQgaW5mb3JtYXRpb24KLQkJLy8gb25seSBzaG93IG9uZSBkZXNjcmlwdG9yIGlmIG1vcmUgdGhhbiBvbmUgYXJlIGxpbmtlZCB0byB0aGUgc2FtZSB0YXNrIG9yIHdwLgotCQkvLyBzbyBrZWVwIHRoZSBwcm9jZXNzZWQgdGFzayBhbmQgd3AgaW5zdGVhZCBvZiB0aGUgZGVzY3JpcHRvcnMKLQkJTGlzdCBwcm9jZXNzZWQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCU1ldGhvZEVsZW1lbnQgbGlua2VkID0gbnVsbDsKLQkJZm9yIChJdGVyYXRvciBpdCA9IGl0ZW1zLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCU1ldGhvZEVsZW1lbnQgZSA9IChNZXRob2RFbGVtZW50KSBpdC5uZXh0KCk7Ci0JCQlsaW5rZWQgPSBudWxsOwotCQkJaWYgKCBlIGluc3RhbmNlb2YgVGFza0Rlc2NyaXB0b3IgKSB7Ci0JCQkJbGlua2VkID0gKChUYXNrRGVzY3JpcHRvcillKS5nZXRUYXNrKCk7Ci0JCQl9IGVsc2UgaWYgKCBlIGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yICkgewotCQkJCWxpbmtlZCA9ICgoV29ya1Byb2R1Y3REZXNjcmlwdG9yKWUpLmdldFdvcmtQcm9kdWN0KCk7Ci0JCQl9Ci0JCQlpZiAoIGxpbmtlZCA9PSBudWxsICkgewotCQkJCWxpbmtlZCA9IGU7Ci0JCQl9Ci0JCQkKLQkJCWlmICggcHJvY2Vzc2VkLmNvbnRhaW5zKGxpbmtlZCkgKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQkKLQkJCXByb2Nlc3NlZC5hZGQobGlua2VkKTsKLQkJCQotCQkJSUVsZW1lbnRMYXlvdXQgbCA9IGxheW91dE1hbmFnZXIuZ2V0TGF5b3V0KGUsIHRydWUpOwotCQkJWG1sRWxlbWVudCBjaGlsZCA9IGwuZ2V0WG1sRWxlbWVudChmYWxzZSk7Ci0JCQljaGlsZC5zZXRBdHRyaWJ1dGUoIk1vZGVsSW5mbyIsIGluZm8pOyAvLyROT04tTkxTLTEkCi0JCQlwYXJlbnRYbWwuYWRkQ2hpbGQoY2hpbGQpOwotCQl9Ci0KLQl9Ci0KLQotCXByaXZhdGUgU3RyaW5nIGdldEluZGV4KElCU0l0ZW1Qcm92aWRlciBhZGFwdGVyKSB7Ci0JCS8vIElCU0l0ZW1Qcm92aWRlciBhZGFwdGVyID0gKElCU0l0ZW1Qcm92aWRlcikgZmFjdG9yeS5hZGFwdChlLAotCQkvLyBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOzsKLQkJaWYgKGFkYXB0ZXIgIT0gbnVsbCkgewotCQkJaW50IGluZGV4ID0gYWRhcHRlci5nZXRJZCgpOwotCQkJaWYgKGluZGV4ID09IDApIHsKLQkJCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCXJldHVybiBJbnRlZ2VyLnRvU3RyaW5nKGluZGV4KTsKLQkJfQotCi0JCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldFByZWRlY2Vzc29ycyhJQlNJdGVtUHJvdmlkZXIgYWRhcHRlciwgU3VwcHJlc3Npb24gc3VwKSB7Ci0JCS8vIElCU0l0ZW1Qcm92aWRlciBhZGFwdGVyID0gKElCU0l0ZW1Qcm92aWRlcikgZmFjdG9yeS5hZGFwdChlLAotCQkvLyBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOzsKLQkJaWYgKGFkYXB0ZXIgIT0gbnVsbCkgewotCQkJUHJlZGVjZXNzb3JMaXN0IGxpc3QgPSBhZGFwdGVyLmdldFByZWRlY2Vzc29ycygpOwotCQkJaWYgKGxpc3QgIT0gbnVsbCkgewotCQkJCXJldHVybiBsaXN0LnRvVW5TdXBwcmVzc2VkU3RyaW5nKHN1cCwgdHJ1ZSk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgY2xhc3MgQ29tcG9zaXRlUm9sZXMgewotCQkvLyBhIG1hcCBvZiBhY3Rpdml0eSB0byBDb21wb3NpdGVSb2xlSW5mbwotCQlNYXAgaXRlbU1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0KLQkJcHVibGljIENvbXBvc2l0ZVJvbGVzKENvbXBvc2VkQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksCi0JCQkJQWN0aXZpdHkgYWN0KSB7Ci0JCQlzY2FuKGFkYXB0ZXJGYWN0b3J5LCBudWxsLCBhY3QpOwotCQl9Ci0KLQkJcHJpdmF0ZSBDb21wb3NpdGVSb2xlSW5mbyBnZXRDb21wb3NpdGVSb2xlSW5mbyhBY3Rpdml0eSBwYXJlbnQsCi0JCQkJQWN0aXZpdHkgYWN0KSB7Ci0JCQlDb21wb3NpdGVSb2xlSW5mbyBpbmZvID0gKENvbXBvc2l0ZVJvbGVJbmZvKSBpdGVtTWFwLmdldChhY3QpOwotCQkJaWYgKGluZm8gPT0gbnVsbCkgewotCQkJCWluZm8gPSBuZXcgQ29tcG9zaXRlUm9sZUluZm8ocGFyZW50LCBhY3QpOwotCQkJCWl0ZW1NYXAucHV0KGFjdCwgaW5mbyk7Ci0JCQl9Ci0KLQkJCXJldHVybiBpbmZvOwotCQl9Ci0KLQkJcHJpdmF0ZSB2b2lkIHNjYW4oQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwKLQkJCQlBY3Rpdml0eSBwYXJlbnQsIEFjdGl2aXR5IGFjdCkgewotCQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyIHByb3ZpZGVyID0gKElUcmVlSXRlbUNvbnRlbnRQcm92aWRlcikgYWRhcHRlckZhY3RvcnkKLQkJCQkJLmFkYXB0KGFjdCwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCWlmIChwcm92aWRlciAhPSBudWxsKSB7Ci0JCQkJQ29sbGVjdGlvbiBpdGVtcyA9IHByb3ZpZGVyLmdldENoaWxkcmVuKGFjdCk7Ci0JCQkJZm9yIChJdGVyYXRvciBpdCA9IGl0ZW1zLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQkJTWV0aG9kRWxlbWVudCBpdGVtID0gKE1ldGhvZEVsZW1lbnQpIExpYnJhcnlVdGlsLnVud3JhcChpdAotCQkJCQkJCS5uZXh0KCkpOwotCQkJCQlpZiAoaXRlbSBpbnN0YW5jZW9mIENvbXBvc2l0ZVJvbGUpIHsKLQkJCQkJCWdldENvbXBvc2l0ZVJvbGVJbmZvKHBhcmVudCwgYWN0KS5hZGRDb21wb3NpdGVSb2xlKAotCQkJCQkJCQkoQ29tcG9zaXRlUm9sZSkgaXRlbSk7Ci0JCQkJCX0gZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJCQlzY2FuKGFkYXB0ZXJGYWN0b3J5LCBhY3QsIChBY3Rpdml0eSkgaXRlbSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQkvKioKLQkJICogZmluZCB0aGUgY29tcG9zaXRlIHJvbGUgZm9yIHRoZSByb2xlIGRlc2NyaXB0b3IgZnJvbSB0aGUgYWN0aXZpdHkgYW5kCi0JCSAqIGl0J3MgcGFyZW50cywgcmV0dXJuIG51bGwgaWYgbm90IGZvdW5kCi0JCSAqIAotCQkgKiBAcGFyYW0gYWN0aXZpdHkKLQkJICogQHBhcmFtIGl0ZW0KLQkJICogQHJldHVybiBSb2xlRGVzY3JpcHRvcgotCQkgKi8KLQkJcHJpdmF0ZSBDb21wb3NpdGVSb2xlIGdldENvbXBvc2l0ZVJvbGUoQWN0aXZpdHkgYWN0aXZpdHksCi0JCQkJUm9sZURlc2NyaXB0b3IgaXRlbSkgewotCQkJLy8gaXRlcmF0ZSB0aGUgYnJlYWtkb3duIGVsZW1lbnRzLAotCQkJLy8gaWYgdGhlcmUgaXMgYSBjb21wb3NpdGUgcm9sZSB0aGF0IGNvbnRhaW5zIHRoZSByb2xlLCByZXR1cm4gdGhlCi0JCQkvLyBjb21wb3NpdGUsCi0JCQkvLyBpZiBub3QsIGZpbmQgaW4gdGhlIHBhcmVudCBhY3Rpdml0eQotCi0JCQlpZiAoYWN0aXZpdHkgPT0gbnVsbCkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCi0JCQlDb21wb3NpdGVSb2xlIGRlc2MgPSBudWxsOwotCQkJQ29tcG9zaXRlUm9sZUluZm8gaW5mbyA9IChDb21wb3NpdGVSb2xlSW5mbykgaXRlbU1hcC5nZXQoYWN0aXZpdHkpOwotCQkJaWYgKGluZm8gIT0gbnVsbCkgewotCQkJCWRlc2MgPSBpbmZvLmdldENvbXBvc2l0ZVJvbGUoaXRlbSk7Ci0JCQkJaWYgKGRlc2MgIT0gbnVsbCkgewotCQkJCQlyZXR1cm4gZGVzYzsKLQkJCQl9Ci0KLQkJCQlyZXR1cm4gZ2V0Q29tcG9zaXRlUm9sZShpbmZvLmdldFBhcmVudEFjdGl2aXR5KCksIGl0ZW0pOwotCQkJfQotCi0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCXB1YmxpYyBjbGFzcyBDb21wb3NpdGVSb2xlSW5mbyB7Ci0JCUFjdGl2aXR5IHBhcmVudDsKLQotCQlBY3Rpdml0eSBvd25lcjsKLQotCQlMaXN0IGl0ZW1zID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCXB1YmxpYyBDb21wb3NpdGVSb2xlSW5mbyhBY3Rpdml0eSBwYXJlbnQsIEFjdGl2aXR5IG93bmVyKSB7Ci0JCQl0aGlzLnBhcmVudCA9IHBhcmVudDsKLQkJCXRoaXMub3duZXIgPSBvd25lcjsKLQkJfQotCi0JCXByaXZhdGUgdm9pZCBhZGRDb21wb3NpdGVSb2xlKENvbXBvc2l0ZVJvbGUgZSkgewotCQkJaWYgKCFpdGVtcy5jb250YWlucyhlKSkgewotCQkJCWl0ZW1zLmFkZChlKTsKLQkJCX0KLQkJfQotCi0JCXByaXZhdGUgQWN0aXZpdHkgZ2V0UGFyZW50QWN0aXZpdHkoKSB7Ci0JCQlyZXR1cm4gcGFyZW50OwotCQl9Ci0KLQkJcHJpdmF0ZSBDb21wb3NpdGVSb2xlIGdldENvbXBvc2l0ZVJvbGUoUm9sZURlc2NyaXB0b3IgaXRlbSkgewotCQkJaWYgKGl0ZW1zLnNpemUoKSA9PSAwKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0KLQkJCVJvbGUgciA9IGl0ZW0uZ2V0Um9sZSgpOwotCQkJZm9yIChJdGVyYXRvciBpdCA9IGl0ZW1zLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlDb21wb3NpdGVSb2xlIGNyID0gKENvbXBvc2l0ZVJvbGUpIGl0Lm5leHQoKTsKLQkJCQlpZiAoY3IuZ2V0QWdncmVnYXRlZFJvbGVzKCkuY29udGFpbnMocikpIHsKLQkJCQkJcmV0dXJuIGNyOwotCQkJCX0KLQkJCX0KLQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgY2xhc3MgQWN0aXZpdHlMYXlvdXRTZXR0aW5nIHsKLQkJcHVibGljIENvbXBvc2VkQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3Rvcnk7Ci0KLQkJcHVibGljIENvbXBvc2l0ZVJvbGVzIGNyczsKLQotCQlwdWJsaWMgU3VwcHJlc3Npb24gc3VwOwotCi0JCWJvb2xlYW4gcm9sbHVwUm9sZXMgPSBmYWxzZTsKLQotCQlwdWJsaWMgYm9vbGVhbiBlc2NhcGVTdHJpbmcgPSBmYWxzZTsKLQkJCi0JCS8vIHNldCB0byBzaG93IHRhc2sgb25seSBmb3Igc3ViIGFjdGl2aXRpZXMKLQkJLy8gdGhpcyBvbmx5IGFwcGx5IHRvIENCUyBsYXlvdXQKLQkJcHVibGljIGJvb2xlYW4gc2hvd1Rhc2tPbmx5ID0gZmFsc2U7Ci0JCQotCQlwdWJsaWMgQWN0aXZpdHlMYXlvdXRTZXR0aW5nKENvbXBvc2VkQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksCi0JCQkJQ29tcG9zaXRlUm9sZXMgY3JzLCBTdXBwcmVzc2lvbiBzdXApIHsKLQkJCXRoaXMuYWRhcHRlckZhY3RvcnkgPSBhZGFwdGVyRmFjdG9yeTsKLQkJCXRoaXMuY3JzID0gY3JzOwotCQkJdGhpcy5zdXAgPSBzdXA7Ci0KLQkJfQotCX0KLQotCXB1YmxpYyBjbGFzcyBUQlNJdGVtRGV0YWlsIHsKLQkJCi0JCS8vIHJlY29yZCB0aGUgc3VwcHJlc3NlZCBpdGVtcwotCQlMaXN0IHN1cHByZXNzZWRJdGVtcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCi0JCS8vIG1hcCBvZiByb2xlIHRvIHJvbGUgZGVzY3JpcHRvcnMKLQkJTWFwIHJvbGVEZXNjcmlwdG9yTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJCi0JCXB1YmxpYyBUQlNJdGVtRGV0YWlsKCkgewotCQkJCi0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIGFkZFN1cHByZXNzZWQoT2JqZWN0IGl0ZW0pIHsKLQkJCWlmICggIXN1cHByZXNzZWRJdGVtcy5jb250YWlucyhpdGVtKSApIHsKLQkJCQlzdXBwcmVzc2VkSXRlbXMuYWRkKGl0ZW0pOwotCQkJfQotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCBpdGVyYXRlKENvbXBvc2VkQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksIE9iamVjdCBwYXJlbnRPYmopIHsKLQkJCi0JCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIgcHJvdmlkZXIgPSBudWxsOwotCQkJaWYgKHBhcmVudE9iaiBpbnN0YW5jZW9mIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlcikgewotCQkJCXByb3ZpZGVyID0gKElUcmVlSXRlbUNvbnRlbnRQcm92aWRlcikgcGFyZW50T2JqOwotCQkJfSBlbHNlIHsKLQkJCQlwcm92aWRlciA9IChJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIpIGFkYXB0ZXJGYWN0b3J5LmFkYXB0KAotCQkJCQkJcGFyZW50T2JqLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkJfQotCi0JCQkvLyBFaXRoZXIgZGVsZWdhdGUgdGhlIGNhbGwgb3IgcmV0dXJuIG5vdGhpbmcuCi0JCQlpZiAocHJvdmlkZXIgPT0gbnVsbCkgewotCQkJCXJldHVybjsKLQkJCX0KLQkJCQkKLQkJCUNvbGxlY3Rpb24gaXRlbXMgPSBwcm92aWRlci5nZXRDaGlsZHJlbihwYXJlbnRPYmopOwotCQkJZm9yIChJdGVyYXRvciBpdCA9IGl0ZW1zLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlPYmplY3QgcmF3aXRlbSA9IGl0Lm5leHQoKTsKLQotCQkJCU1ldGhvZEVsZW1lbnQgaXRlbSA9IChNZXRob2RFbGVtZW50KSBMaWJyYXJ5VXRpbC51bndyYXAocmF3aXRlbSk7Ci0JCQkJaWYgKCBpdGVtIGluc3RhbmNlb2YgUm9sZURlc2NyaXB0b3IgKSB7Ci0JCQkJCWFkZFJvbGVEZXNjcmlwdG9yKCAoUm9sZURlc2NyaXB0b3IpaXRlbSApOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWl0ZXJhdGUoYWRhcHRlckZhY3RvcnksIHJhd2l0ZW0pOwotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQkJCi0JCXByaXZhdGUgdm9pZCBhZGRSb2xlRGVzY3JpcHRvcihSb2xlRGVzY3JpcHRvciByZGVzYykgewotCQkJUm9sZSByID0gcmRlc2MuZ2V0Um9sZSgpOwotCQkJaWYgKHIgIT0gbnVsbCApIHsKLQkJCQlMaXN0IGl0ZW1zID0gKExpc3Qpcm9sZURlc2NyaXB0b3JNYXAuZ2V0KHIpOwotCQkJCWlmICggaXRlbXMgPT0gbnVsbCApIHsKLQkJCQkJaXRlbXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCXJvbGVEZXNjcmlwdG9yTWFwLnB1dChyLCBpdGVtcyk7Ci0JCQkJCWlmIChkZWJ1ZyApIHsKLQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiQWRkZWQgUm9sZURlc2NyaXB0b3IgIiArIHJkZXNjLmdldFByZXNlbnRhdGlvbk5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCX0KLQkJCQkKLQkJCQlpZiAoICFpdGVtcy5jb250YWlucyhyZGVzYykgKSB7Ci0JCQkJCWl0ZW1zLmFkZChyZGVzYyk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQlwdWJsaWMgTGlzdCBnZXREZXNjcmlwdG9ycyhSb2xlIHIpIHsKLQkJCXJldHVybiAoTGlzdClyb2xlRGVzY3JpcHRvck1hcC5nZXQocik7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogbG9hZCB0aGUgcHJvY2VzcyBzcGVjaWZpYyBsYXlvdXQgZGF0YSBmb3IgcHVibGlzaGluZy4KLQkgKiBicm93c2luZyBkb2VzIG5vdCBuZWVkIHRoaXMgc2luY2UgaXQncyBnZW5lcmF0ZWQgb24gdGhlIGZseQotCSAqIEBwYXJhbSBwcm9jX2RhdGEKLQkgKi8KLQlwdWJsaWMgdm9pZCBsb2FkTGF5b3V0RGF0YShQcm9jZXNzTGF5b3V0RGF0YSBwcm9jX2RhdGEsIGJvb2xlYW4gbG9hZFdicywgYm9vbGVhbiBsb2FkVGJzLCBib29sZWFuIGxvYWRXcGJzKQotCXsKLQkJVGltZXIgdCA9IG5ldyBUaW1lcigpOwkJCi0KLQkJQWN0aXZpdHlMYXlvdXREYXRhIGFjdF9kYXRhID0gcHJvY19kYXRhLmNyZWF0ZUFjdGl2aXR5TGF1b3V0RGF0YSh0aGlzLmVsZW1lbnRQcm9jZXNzUGF0aCk7Ci0JCQotCQkvLyBpdGVyYXRlIHRoZSBicmVha2Rvd24gc3RydWN0dXJlIGFuZCBjb2xsZWN0IHRoZSBpbmZvLgotCQlQcm9jZXNzIHByb2MgPSBnZXRPd25pbmdQcm9jZXNzKCk7Ci0JCWlmICggcHJvYyA9PSB0aGlzLmVsZW1lbnQgKSB7Ci0JCQlzdXBDb3VudCA9IDA7Ci0JCX0KLQkJCi0JCS8vIG5lZWQgdG8gaGFuZGxlIHRoZSBzdXByZXNzZWQgYnJlYWtkb3duIGVsZW1lbnRzCi0JCS8vIHVzZSB0aGUgU3VwcmVzcyB1dGlsaXR5Ci0JCVN1cHByZXNzaW9uIHN1cCA9IGdldFN1cHByZXNzaW9uKHByb2MpOwotCi0JCS8vIG5lZWQgdG8gaW50ZXJhdGUgdGhlIDMgbGF5b3V0IHN0cnVjdHVyZSBzaWNuZSB0aGVpciBwYXRoIGlzIGRpZmZlcmVudAotCQlpZiAoIGxvYWRXYnMgKSB7Ci0JCQlsb2FkV0JTTGF5b3V0RGF0YShhY3RfZGF0YSwgc3VwKTsKLQkJfQotCQkKLQkJaWYgKCBsb2FkVGJzICkgewotCQkJbG9hZFRCU0xheW91dERhdGEoYWN0X2RhdGEsIHN1cCk7Ci0JCX0KLQkJCi0JCWlmICggbG9hZFdwYnMgKSB7Ci0JCQlsb2FkV1BCU0xheW91dERhdGEoYWN0X2RhdGEsIHN1cCk7Ci0JCX0KLQkJCi0JCWlmICggZGVidWcgKSB7Ci0JCQl0LnN0b3AoKTsKLQkJCVN0cmluZyBtc2cgPSB0LmdldFRpbWUoKQotCQkJCQkrICIgbWluaS1zZWNvbmQocykgbG9hZGluZyBsYXlvdXQgZGF0YSBmb3IgcHJvY2VzcyAiICsgTGlicmFyeVV0aWwuZ2V0VHlwZU5hbWUocHJvYykgLy8kTk9OLU5MUy0xJCAvCi0JCQkJCSsgIiwgYWN0aXZpdHk6ICIgKyBMaWJyYXJ5VXRpbC5nZXRUeXBlTmFtZShzdXBlci5lbGVtZW50KTsgLy8kTk9OLU5MUy0xJCAvCQkJCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4obXNnKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgbG9hZFdCU0xheW91dERhdGEoQWN0aXZpdHlMYXlvdXREYXRhIGFjdF9kYXRhLCBTdXBwcmVzc2lvbiBzdXApCi0JewotCQkvLyBwdWJsaXNoIHRoZSBjb25zb2xpZGF0ZWQgdmlldwotCQlDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5ID0gbGF5b3V0TWFuYWdlcgotCQkJCS5nZXRDQlNBZGFwdGVyRmFjdG9yeSgpOwotCQlDb21wb3NpdGVSb2xlcyBjcnMgPSBudWxsOyAvL25ldyBDb21wb3NpdGVSb2xlcyhhZGFwdGVyRmFjdG9yeSwgKEFjdGl2aXR5KSBzdXBlci5lbGVtZW50KTsKLQotCQlBY3Rpdml0eUxheW91dFNldHRpbmcgc2V0dGluZyA9IG5ldyBBY3Rpdml0eUxheW91dFNldHRpbmcoCi0JCQkJYWRhcHRlckZhY3RvcnksIGNycywgc3VwKTsKLQotCQkvLyBuZWVkIHRvIGdldCB0aGUgcmF3IGl0ZW0gcHJvdmlkZXIgZnJvbSB0aGUgYWRhcHRlciBmYWN0b3J5Ci0JCU9iamVjdCB3cmFwcGVyID0gc3VwLmdldE9iamVjdEJ5UGF0aChzdXBlci5wYXRocywgYWRhcHRlckZhY3RvcnkpOwotCQlpZiAoIHdyYXBwZXIgPT0gbnVsbCApIHsKLQkJCXdyYXBwZXIgPSBzdXBlci5lbGVtZW50OwotCQl9Ci0JCVByb2Nlc3NFbGVtZW50SXRlbSBlbGVtZW50SXRlbSA9IG5ldyBQcm9jZXNzRWxlbWVudEl0ZW0od3JhcHBlciwgc3VwZXIuZWxlbWVudCwgc3VwZXIuZWxlbWVudFByb2Nlc3NQYXRoKTsKLQkJaXRlcmF0ZVByb2Nlc3NJdGVtKGVsZW1lbnRJdGVtLCBhY3RfZGF0YSwgc2V0dGluZywgdHJ1ZSwgZmFsc2UsIGZhbHNlKTsKLQotLy8JCS8vIGlmIHRoZXJlIGlzIG5vIHByb2Nlc3MtbG9jYWwgc3VwcmVzc2VkIGl0ZW0sIGRvbid0IGdlbmVyYXRlIGRpYWdyYW1zCi0JCS8vIG5vLCB0aGlzIHdpbGwgbm90IHdvcmssIHNpbmNlIHRoZSB0ZXh0IGNvbG9yIG9mZCB0aGUgZGlhZ3JhbSBpcyBncmVlbiwgaWYgdXNlIGJhc2UsIGl0J3MgYmxhY2suCi0JCS8vIHNvIG5lZWQgdG8gZ2VuZXJhdGUgdGhlIGRpYWdyYW0gbm8gbWF0dGVyIHdoYXQuCi0vLwkJaWYgKCAhYWN0X2RhdGEuaGFzTG9jYWxTdXBwcmVzc2VkKCkgKQotLy8JCXsKLS8vCQkJcmV0dXJuOwotLy8JCX0KLQkJCi0JCVN0cmluZyBkaWFncmFtVHlwZSwgaW1nRmlsZTsKLQkJCi0JCS8vIG1ha2UgYSBzaG9ydCBwcmVmaXggZm9yIHRoZSBmaWxlIG5hbWUKLQkJU3RyaW5nIHByZWZpeCA9IEludGVnZXIudG9IZXhTdHJpbmcoc3VwZXIuZWxlbWVudFByb2Nlc3NQYXRoLmhhc2hDb2RlKCkpOwotCQkKLQkJZGlhZ3JhbVR5cGUgPSBSZXNvdXJjZUhlbHBlci5ESUFHUkFNX1RZUEVfV09SS0ZMT1c7Ci0JCWltZ0ZpbGUgPSBSZXNvdXJjZUhlbHBlci5nZXREaWFncmFtRmlsZVBhdGhOYW1lKGVsZW1lbnQsIHByZWZpeCArICJfIiArIGRpYWdyYW1UeXBlKTsgLy8kTk9OLU5MUy0xJAotCQlEaWFncmFtSW5mbyBkaWFncmFtX3dvcmtmbG93ID0gZ2VuZXJhdGVEaWFncmFtKHN1cCwgZGlhZ3JhbVR5cGUsIGltZ0ZpbGUpOwkKLQkJaWYgKGRpYWdyYW1fd29ya2Zsb3cgIT0gbnVsbAotCQkJCSYmIGRpYWdyYW1fd29ya2Zsb3cuZ2V0SW1hZ2VGaWxlTmFtZSgpICE9IG51bGwpIHsKLQkJCWFjdF9kYXRhLnNldEFjdGl2aXR5RGlhZ3JhbVBhdGgoZGlhZ3JhbV93b3JrZmxvdy5nZXRJbWFnZUZpbGVOYW1lKCkpOwotCQl9Ci0JCQotCQlkaWFncmFtVHlwZSA9IFJlc291cmNlSGVscGVyLkRJQUdSQU1fVFlQRV9BQ1RJVklUWV9ERVRBSUw7Ci0JCWltZ0ZpbGUgPSBSZXNvdXJjZUhlbHBlci5nZXREaWFncmFtRmlsZVBhdGhOYW1lKGVsZW1lbnQsIHByZWZpeCArICJfIiArIGRpYWdyYW1UeXBlKTsgLy8kTk9OLU5MUy0xJAotCQlEaWFncmFtSW5mbyBkaWFncmFtX2RldGFpbCA9IGdlbmVyYXRlRGlhZ3JhbShzdXAsIGRpYWdyYW1UeXBlLCBpbWdGaWxlKTsJCi0JCWlmIChkaWFncmFtX2RldGFpbCAhPSBudWxsICYmIGRpYWdyYW1fZGV0YWlsLmdldEltYWdlRmlsZU5hbWUoKSAhPSBudWxsKSB7Ci0JCQlhY3RfZGF0YS5zZXRBY3Rpdml0eURldGFpbERpYWdyYW1QYXRoKGRpYWdyYW1fZGV0YWlsLmdldEltYWdlRmlsZU5hbWUoKSk7Ci0JCX0KLQotCQlkaWFncmFtVHlwZSA9IFJlc291cmNlSGVscGVyLkRJQUdSQU1fVFlQRV9XUF9ERVBFTkRFTkNZOwotCQlpbWdGaWxlID0gUmVzb3VyY2VIZWxwZXIuZ2V0RGlhZ3JhbUZpbGVQYXRoTmFtZShlbGVtZW50LCBwcmVmaXggKyAiXyIgKyBkaWFncmFtVHlwZSk7IC8vJE5PTi1OTFMtMSQKLQkJRGlhZ3JhbUluZm8gZGlhZ3JhbV93cCA9IGdlbmVyYXRlRGlhZ3JhbShzdXAsIGRpYWdyYW1UeXBlLCBpbWdGaWxlKTsJCi0JCWlmIChkaWFncmFtX3dwICE9IG51bGwgJiYgZGlhZ3JhbV93cC5nZXRJbWFnZUZpbGVOYW1lKCkgIT0gbnVsbCkgewotCQkJYWN0X2RhdGEuc2V0V1BEZXBlbmRlbmN5RGlhZ3JhbVBhdGgoZGlhZ3JhbV93cC5nZXRJbWFnZUZpbGVOYW1lKCkpOwotCQl9Ci0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGxvYWRUQlNMYXlvdXREYXRhKEFjdGl2aXR5TGF5b3V0RGF0YSBhY3RfZGF0YSwgU3VwcHJlc3Npb24gc3VwKQotCXsKLQkJLy8gcHVibGlzaCB0aGUgY29uc29saWRhdGVkIHZpZXcKLQkJQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSA9IGxheW91dE1hbmFnZXIKLQkJCQkuZ2V0VEJTQWRhcHRlckZhY3RvcnkoKTsKLQkJQ29tcG9zaXRlUm9sZXMgY3JzID0gbnVsbDsgLy9uZXcgQ29tcG9zaXRlUm9sZXMoYWRhcHRlckZhY3RvcnksIChBY3Rpdml0eSkgc3VwZXIuZWxlbWVudCk7Ci0KLQkJLy8gcm9vbHVwIHRoZSBsYXlvdXQKLQkJSUJTSXRlbVByb3ZpZGVyIHByb3ZpZGVyID0gKElCU0l0ZW1Qcm92aWRlcikgYWRhcHRlckZhY3RvcnkuYWRhcHQoCi0JCQkJc3VwZXIuZWxlbWVudCwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJcHJvdmlkZXIuc2V0Um9sbGVkVXAodHJ1ZSk7Ci0KLQkJCi0JCUFjdGl2aXR5TGF5b3V0U2V0dGluZyBzZXR0aW5nID0gbmV3IEFjdGl2aXR5TGF5b3V0U2V0dGluZygKLQkJCQlhZGFwdGVyRmFjdG9yeSwgY3JzLCBzdXApOwotCQlzZXR0aW5nLnJvbGx1cFJvbGVzID0gdHJ1ZTsKLQotCQkKLQkJLy8gbmVlZCB0byBnZXQgdGhlIHJhdyBpdGVtIHByb3ZpZGVyIGZyb20gdGhlIGFkYXB0ZXIgZmFjdG9yeQotCQlPYmplY3Qgd3JhcHBlciA9IHN1cC5nZXRPYmplY3RCeVBhdGgoc3VwZXIucGF0aHMsIGFkYXB0ZXJGYWN0b3J5KTsKLQkJaWYgKCB3cmFwcGVyID09IG51bGwgKSB7Ci0JCQl3cmFwcGVyID0gc3VwZXIuZWxlbWVudDsKLQkJfQotCQlQcm9jZXNzRWxlbWVudEl0ZW0gZWxlbWVudEl0ZW0gPSBuZXcgUHJvY2Vzc0VsZW1lbnRJdGVtKHdyYXBwZXIsIHN1cGVyLmVsZW1lbnQsIHN1cGVyLmVsZW1lbnRQcm9jZXNzUGF0aCk7Ci0JCWl0ZXJhdGVQcm9jZXNzSXRlbShlbGVtZW50SXRlbSwgYWN0X2RhdGEsIHNldHRpbmcsIGZhbHNlLCB0cnVlLCBmYWxzZSk7Ci0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGxvYWRXUEJTTGF5b3V0RGF0YShBY3Rpdml0eUxheW91dERhdGEgYWN0X2RhdGEsIFN1cHByZXNzaW9uIHN1cCkKLQl7Ci0JCS8vIHB1Ymxpc2ggdGhlIGNvbnNvbGlkYXRlZCB2aWV3Ci0JCUNvbXBvc2VkQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkgPSBsYXlvdXRNYW5hZ2VyCi0JCQkJLmdldFdQQlNBZGFwdGVyRmFjdG9yeSgpOwotCQlDb21wb3NpdGVSb2xlcyBjcnMgPSBudWxsOyAvL25ldyBDb21wb3NpdGVSb2xlcyhhZGFwdGVyRmFjdG9yeSwgKEFjdGl2aXR5KSBzdXBlci5lbGVtZW50KTsKLQotCQkvLyByb29sdXAgdGhlIGxheW91dAotCQlJQlNJdGVtUHJvdmlkZXIgcHJvdmlkZXIgPSAoSUJTSXRlbVByb3ZpZGVyKSBhZGFwdGVyRmFjdG9yeS5hZGFwdCgKLQkJCQlzdXBlci5lbGVtZW50LCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQlwcm92aWRlci5zZXRSb2xsZWRVcCh0cnVlKTsKLQkKLQkJQWN0aXZpdHlMYXlvdXRTZXR0aW5nIHNldHRpbmcgPSBuZXcgQWN0aXZpdHlMYXlvdXRTZXR0aW5nKAotCQkJCWFkYXB0ZXJGYWN0b3J5LCBjcnMsIHN1cCk7Ci0KLQkJCi0JCS8vIG5lZWQgdG8gZ2V0IHRoZSByYXcgaXRlbSBwcm92aWRlciBmcm9tIHRoZSBhZGFwdGVyIGZhY3RvcnkKLQkJT2JqZWN0IHdyYXBwZXIgPSBzdXAuZ2V0T2JqZWN0QnlQYXRoKHN1cGVyLnBhdGhzLCBhZGFwdGVyRmFjdG9yeSk7Ci0JCWlmICggd3JhcHBlciA9PSBudWxsICkgewotCQkJd3JhcHBlciA9IHN1cGVyLmVsZW1lbnQ7Ci0JCX0KLQkJUHJvY2Vzc0VsZW1lbnRJdGVtIGVsZW1lbnRJdGVtID0gbmV3IFByb2Nlc3NFbGVtZW50SXRlbSh3cmFwcGVyLCBzdXBlci5lbGVtZW50LCBzdXBlci5lbGVtZW50UHJvY2Vzc1BhdGgpOwotCQlpdGVyYXRlUHJvY2Vzc0l0ZW0oZWxlbWVudEl0ZW0sIGFjdF9kYXRhLCBzZXR0aW5nLCBmYWxzZSwgZmFsc2UsIHRydWUpOwotCi0JfQotCQotCXByaXZhdGUgc3RhdGljIGludCBzdXBDb3VudCA9IDA7Ci0JCi0JcHJpdmF0ZSB2b2lkIGl0ZXJhdGVQcm9jZXNzSXRlbShQcm9jZXNzRWxlbWVudEl0ZW0gcGFyZW50SXRlbSwgQWN0aXZpdHlMYXlvdXREYXRhIGFjdF9kYXRhLCAKLQkJCUFjdGl2aXR5TGF5b3V0U2V0dGluZyBzZXR0aW5nLCBib29sZWFuIGxvYWRXYnMsIGJvb2xlYW4gbG9hZFRicywgYm9vbGVhbiBsb2FkV3BicykgewotCQkKLQkJLy9TdHJpbmcgbXNnID0gIiAtLS0gaXRlcmF0ZSBwcm9jZXNzIGl0ZW0gIiArIExpYnJhcnlVdGlsLmdldFR5cGVOYW1lKHBhcmVudEl0ZW0uZWxlbWVudCkgKyAiWyIgKyBwYXJlbnRJdGVtLnBhdGggKyAiXSIgOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAJCQkKLQkJLy9TeXN0ZW0ub3V0LnByaW50bG4obXNnKTsKLQotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIgcHJvdmlkZXIgPSBudWxsOwotCQlPYmplY3QgcGFyZW50T2JqID0gcGFyZW50SXRlbS5yYXdJdGVtOwotCQkKLQkJaWYgKHBhcmVudE9iaiBpbnN0YW5jZW9mIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlcikgewotCQkJcHJvdmlkZXIgPSAoSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyKSBwYXJlbnRPYmo7Ci0JCX0gZWxzZSB7Ci0JCQlwcm92aWRlciA9IChJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIpIHNldHRpbmcuYWRhcHRlckZhY3RvcnkuYWRhcHQoCi0JCQkJCXBhcmVudE9iaiwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJfQotCi0JCS8vIEVpdGhlciBkZWxlZ2F0ZSB0aGUgY2FsbCBvciByZXR1cm4gbm90aGluZy4KLQkJaWYgKHByb3ZpZGVyICE9IG51bGwpIHsKLQkJCUNvbGxlY3Rpb24gaXRlbXMgPSBwcm92aWRlci5nZXRDaGlsZHJlbihwYXJlbnRPYmopOwotCQkJZm9yIChJdGVyYXRvciBpdCA9IGl0ZW1zLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlPYmplY3QgcmF3aXRlbSA9IGl0Lm5leHQoKTsJCQkKLQkJCQkKLS8vCQkJCS8vIGxhdCB0aGUgcHJlc2VudGF0aW9uIHRvIGRldGVybWluZSB3aGVuIHRvIHNob3cKLS8vCQkJCS8vIHNldCBnZW5lcmF0ZSB0aGUgZmxhZyBmb3IgYnJvd3NpbmcKLQkJCQlib29sZWFuIGlzU3VwcmVzc2VkID0gc2V0dGluZy5zdXAuaXNTdXBwcmVzc2VkKHJhd2l0ZW0pOwotCQkJCU1ldGhvZEVsZW1lbnQgaXRlbSA9IChNZXRob2RFbGVtZW50KSBMaWJyYXJ5VXRpbAotCQkJCQkJLnVud3JhcChyYXdpdGVtKTsKLQkJCQkJCQkJCi0JCQkJUHJvY2Vzc0VsZW1lbnRJdGVtIGVsZW1lbnRJdGVtID0gbmV3IFByb2Nlc3NFbGVtZW50SXRlbShyYXdpdGVtLCBpdGVtLCBwYXJlbnRJdGVtKTsKLQotCQkJCWlmIChkZWJ1ZyAmJiBpc1N1cHJlc3NlZCApIHsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJzdXBwcmVzc2VkOiAiICsgKytzdXBDb3VudCArICIgOiAiICAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCQkrIExpYnJhcnlVdGlsLmdldFR5cGVOYW1lKGl0ZW0pIAotCQkJCQkJCSsgIjogIiArIGVsZW1lbnRJdGVtLnBhdGgpOyAvLyROT04tTkxTLTEkCi0JCQkJCQotCQkJCX0KLQotCQkJCUlFbGVtZW50TGF5b3V0IGwgPSBnZXRMYXlvdXQoZWxlbWVudEl0ZW0pOwotCQkJCWlmICggbCBpbnN0YW5jZW9mIEFic3RyYWN0UHJvY2Vzc0VsZW1lbnRMYXlvdXQgKQotCQkJCXsJCQotCQkJCQlpZiAoIGlzU3VwcmVzc2VkICkKLQkJCQkJewotCQkJCQkJU3RyaW5nIHJlbFBhdGggPSAoKEFic3RyYWN0UHJvY2Vzc0VsZW1lbnRMYXlvdXQpbCkuZ2V0UmVsYXRpdmVQcm9jZXNzUGF0aCgpOwotCQkJCQkJYWN0X2RhdGEuc2V0U3VwcHJlc3NlZChyZWxQYXRoKTsKLQkJCQkJfSAKLQkJCQkJZWxzZSAKLQkJCQkJewkJCQkKLQkJCQkJCS8vIG9ubHkgaXRlcmF0ZSB1bi1zdXBwcmVzc2VkIGl0ZW0KLQkJCQkJCS8vIGlmIHRoZSBsYXlvdXQgaXMgYW4gYWN0aXZpdHkgbGF5b3V0LCBjb2xsZWN0IHRoZSBsYXlvdXQgZGF0YSBmb3IgaXQKLQkJCQkJCWlmICggbCBpbnN0YW5jZW9mIEFjdGl2aXR5TGF5b3V0ICkKLQkJCQkJCXsKLQkJCQkJCQkoKEFjdGl2aXR5TGF5b3V0KWwpLmxvYWRMYXlvdXREYXRhKGFjdF9kYXRhLmdldFByb2Nlc3NMYXlvdXREYXRhKCksIAotCQkJCQkJCQkgbG9hZFdicywgbG9hZFRicywgbG9hZFdwYnMpOwotCQkJCQkJfQotCQkJCQkJZWxzZQotCQkJCQkJewotCQkJCQkJCS8vIGluZXRlcmF0ZSBjaGlsZHJlbiwgbm90IGp1c3QgYWN0aXZpdHksIGFueSBjaGlsZCBpbiB0aGUKLQkJCQkJCQkvLyByYXdpdGVtIHNob3VsZCBiZSBpdGVyYXRlZCwKLQkJCQkJCQkvLyBzdWNoIGFzIHRoZSBzdWItYXJ0aWZhY3RzCi0JCQkJCQkJaXRlcmF0ZVByb2Nlc3NJdGVtKGVsZW1lbnRJdGVtLCBhY3RfZGF0YSwgc2V0dGluZywgbG9hZFdicywgbG9hZFRicywgbG9hZFdwYnMpOwkJCQkJCQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQkKLQkKLQkvKioKLQkgKiBnZXQgYWxsIHRoZSBsaW5rZWQgdGFza3MsIHJvbGVzLCBhbmQgd29ya3Byb2R1Y3RzIGZvciB0aGlzIGFjdGl2aXR5IGFuZCBhbGwgaXQncyBicmVha2Rvd24gZWxlbWVudHMsIHJlY3Vyc2l2ZWx5LgotCSAqIHRoZSBlbGVtZW50IGZvdW5kIGFyZSBub3RpZmllZCB2aWEgSUNvbnRlbnRWYWxpZGF0b3IuYWRkUmVmZXJlbmNlZEVsZW1lbnQoKQotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIGZpbmRBbGxMaW5rZWRFbGVtZW50cygpIHsKLQkJLy8gaXRlcmF0ZSB0aGUgYnJlYWtkb3duIHN0cnVjdHVyZSBhbmQgY29sbGVjdCB0aGUgaW5mby4KLQkJUHJvY2VzcyBwcm9jID0gZ2V0T3duaW5nUHJvY2VzcygpOwotCQkKLQkJLy8gbmVlZCB0byBoYW5kbGUgdGhlIHN1cHJlc3NlZCBicmVha2Rvd24gZWxlbWVudHMKLQkJLy8gdXNlIHRoZSBTdXByZXNzIHV0aWxpdHkKLQkJU3VwcHJlc3Npb24gc3VwID0gZ2V0U3VwcHJlc3Npb24ocHJvYyk7Ci0KLQkJLy8gcHVibGlzaCB0aGUgY29uc29saWRhdGVkIHZpZXcKLQkJQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSA9IGxheW91dE1hbmFnZXIKLQkJCQkuZ2V0Q0JTQWRhcHRlckZhY3RvcnkoKTsKLQotCQkvLyBuZWVkIHRvIGdldCB0aGUgcmF3IGl0ZW0gcHJvdmlkZXIgZnJvbSB0aGUgYWRhcHRlciBmYWN0b3J5Ci0JCU9iamVjdCB3cmFwcGVyID0gc3VwLmdldE9iamVjdEJ5UGF0aChzdXBlci5wYXRocywgYWRhcHRlckZhY3RvcnkpOwotCQlpZiAoIHdyYXBwZXIgPT0gbnVsbCApIHsKLQkJCXdyYXBwZXIgPSBzdXBlci5lbGVtZW50OwotCQl9Ci0JCQotCQlnZXRMYXlvdXRNZ3IoKS5nZXRWYWxpZGF0b3IoKS5hZGRSZWZlcmVuY2VkRWxlbWVudChudWxsLCBzdXBlci5lbGVtZW50KTsKLQotCQlpdGVyYXRlSXRlbUZvckxpbmtlZEVsZW1lbnRzKHdyYXBwZXIsIGFkYXB0ZXJGYWN0b3J5LCBzdXApOwotCX0KLQotCXByaXZhdGUgdm9pZCBpdGVyYXRlSXRlbUZvckxpbmtlZEVsZW1lbnRzKE9iamVjdCBwYXJlbnRPYmosIENvbXBvc2VkQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksIFN1cHByZXNzaW9uIHN1cCkgewotCQkKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyIHByb3ZpZGVyID0gbnVsbDsKLQkJCi0JCWlmIChwYXJlbnRPYmogaW5zdGFuY2VvZiBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIpIHsKLQkJCXByb3ZpZGVyID0gKElUcmVlSXRlbUNvbnRlbnRQcm92aWRlcikgcGFyZW50T2JqOwotCQl9IGVsc2UgewotCQkJcHJvdmlkZXIgPSAoSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyKSBhZGFwdGVyRmFjdG9yeS5hZGFwdCgKLQkJCQkJcGFyZW50T2JqLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQl9Ci0KLQkJLy8gRWl0aGVyIGRlbGVnYXRlIHRoZSBjYWxsIG9yIHJldHVybiBub3RoaW5nLgotCQlpZiAocHJvdmlkZXIgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlDb2xsZWN0aW9uIGl0ZW1zID0gcHJvdmlkZXIuZ2V0Q2hpbGRyZW4ocGFyZW50T2JqKTsKLQkJZm9yIChJdGVyYXRvciBpdCA9IGl0ZW1zLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCU9iamVjdCByYXdpdGVtID0gaXQubmV4dCgpOwkJCQotCQkJCi0JCQlpZiAoIHN1cC5pc1N1cHByZXNzZWQocmF3aXRlbSkgKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQkKLQkJCU1ldGhvZEVsZW1lbnQgaXRlbSA9IChNZXRob2RFbGVtZW50KSBMaWJyYXJ5VXRpbAotCQkJCQkudW53cmFwKHJhd2l0ZW0pOwotCQkJTWV0aG9kRWxlbWVudCBlID0gbnVsbDsKLQkJCWlmICggaXRlbSBpbnN0YW5jZW9mIFRhc2tEZXNjcmlwdG9yICkgewotCQkJCWUgPSAoKFRhc2tEZXNjcmlwdG9yKWl0ZW0pLmdldFRhc2soKTsKLQkJCX0gZWxzZSBpZiAoIGl0ZW0gaW5zdGFuY2VvZiBSb2xlRGVzY3JpcHRvciApIHsKLQkJCQllID0gKChSb2xlRGVzY3JpcHRvcilpdGVtKS5nZXRSb2xlKCk7Ci0JCQl9IGVsc2UgaWYgKCBpdGVtIGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yICkgewotCQkJCWUgPSAoKFdvcmtQcm9kdWN0RGVzY3JpcHRvcilpdGVtKS5nZXRXb3JrUHJvZHVjdCgpOwotCQkJfSAKLQkJCQotCQkJaWYgKGUgIT0gbnVsbCkgewotCQkJCWdldExheW91dE1ncigpLmdldFZhbGlkYXRvcigpLmFkZFJlZmVyZW5jZWRFbGVtZW50KGl0ZW0sIGUpOwotCQkJCWlmIChlIGluc3RhbmNlb2YgQXJ0aWZhY3QpIHsKLQkJCQkJZm9yIChUcmVlSXRlcmF0b3I8RU9iamVjdD4gdGkgPSBlLmVBbGxDb250ZW50cygpOyB0aS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlFT2JqZWN0IG9iaiA9IHRpLm5leHQoKTsKLQkJCQkJCWlmIChvYmogaW5zdGFuY2VvZiBBcnRpZmFjdCkgewotCQkJCQkJCWdldExheW91dE1ncigpLmdldFZhbGlkYXRvcigpLmFkZFJlZmVyZW5jZWRFbGVtZW50KAotCQkJCQkJCQkJaXRlbSwgKEFydGlmYWN0KSBvYmopOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfSAKLQkJCQkKLQkJCU1ldGhvZEVsZW1lbnQgcGFyZW50ID0gKE1ldGhvZEVsZW1lbnQpIExpYnJhcnlVdGlsLnVud3JhcChyYXdpdGVtKTsKLQkJCWdldExheW91dE1ncigpLmdldFZhbGlkYXRvcigpLmFkZFJlZmVyZW5jZWRFbGVtZW50KHBhcmVudCwgaXRlbSk7Ci0KLQkJCWl0ZXJhdGVJdGVtRm9yTGlua2VkRWxlbWVudHMocmF3aXRlbSwgYWRhcHRlckZhY3RvcnksIHN1cCk7Ci0JCX0KLQl9CQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9lbGVtZW50cy9BY3Rpdml0eUxheW91dERhdGEuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZWxlbWVudHMvQWN0aXZpdHlMYXlvdXREYXRhLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzMjFlMDYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9lbGVtZW50cy9BY3Rpdml0eUxheW91dERhdGEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuZWxlbWVudHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIGNsYXNzIHRvIGhvbGQgcHJvY2VzcyBzcGVjaWZpYyBsYXlvdXQgZGF0YSBmb3IgZWFjaCBhY3Rpdml0eQotICogdGhlIGRhdGEgd2lsbCBiZSB3cml0ZSBvdXQgdG8gYSBqYXZhc2NyaXB0IG1hcCAKLSAqIHNvIHRoYXQgYWN0aXZpdHkgbGF5b3V0IGluIHRoZSBwdWJsaXNoZWQgc2l0ZSBjYW4gZ2V0IHRoZSBzdGF0dXMgZHluYW1pY2FsbHkuCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICoKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXR5TGF5b3V0RGF0YSB7Ci0KLQlwcml2YXRlIFByb2Nlc3NMYXlvdXREYXRhIHByb2NfZGF0YTsKLQkKLQlwdWJsaWMgU3RyaW5nIGFkX2ltZ19wYXRoID0gbnVsbDsKLQlwdWJsaWMgU3RyaW5nIGFkZF9pbWdfcGF0aCA9IG51bGw7Ci0JcHVibGljIFN0cmluZyB3cGRfaW1nX3BhdGggPSBudWxsOwotCQotCS8vIG1hcCBvZiBzdXByZXNzZWQgaXRlbSdzIHJlbGF0aXZlIHBhdGggdG8gdGhlIGN1cnJlbnQgYWN0aXZpdHkKLQlwcml2YXRlIExpc3Qgc3VwcmVzc2VkSXRlbXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCi0JLyoqCi0JICogY29uc3R1Y3RvcgotCSAqIEBwYXJhbSBwcm9jX2RhdGEKLQkgKiBAcGFyYW0gYWN0aXZpdHlfcGF0aAotCSAqLwotCXB1YmxpYyBBY3Rpdml0eUxheW91dERhdGEoUHJvY2Vzc0xheW91dERhdGEgcHJvY19kYXRhLCBTdHJpbmcgYWN0aXZpdHlfcGF0aCkKLQl7Ci0JCXRoaXMucHJvY19kYXRhID0gcHJvY19kYXRhOwotCX0KLQotCS8qKgotCSAqIGdldCB0aGUgUHJvY2Vzc0xheW91dERhdGEKLQkgKiBAcmV0dXJuIFByb2Nlc3NMYXlvdXREYXRhCi0JICovCi0JcHVibGljIFByb2Nlc3NMYXlvdXREYXRhIGdldFByb2Nlc3NMYXlvdXREYXRhKCkKLQl7Ci0JCXJldHVybiBwcm9jX2RhdGE7Ci0JfQotCQotCS8qKgotCSAqIHNldCBhY3Rpdml0eSBkaWFncmFtIHBhdGgKLQkgKiBAcGFyYW0gcGF0aCBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBY3Rpdml0eURpYWdyYW1QYXRoKFN0cmluZyBwYXRoKQotCXsKLQkJYWRfaW1nX3BhdGggPSBwYXRoOwotCX0KLQkKLQkvKioKLQkgKiBzZXQgYWN0aXZpdHkgZGV0YWlsIGRpYWdyYW0gcGF0aAotCSAqIEBwYXJhbSBwYXRoIFN0cmluZwotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFjdGl2aXR5RGV0YWlsRGlhZ3JhbVBhdGgoU3RyaW5nIHBhdGgpCi0JewotCQlhZGRfaW1nX3BhdGggPSBwYXRoOwotCX0KLQkKLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gcGF0aCBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRXUERlcGVuZGVuY3lEaWFncmFtUGF0aChTdHJpbmcgcGF0aCkKLQl7Ci0JCXdwZF9pbWdfcGF0aCA9IHBhdGg7Ci0JfQotCQotCS8qKgotCSAqIHNldCB0aGUgZWxlbWVudCdzIHJlbGF0aXZlIHBhdGggZm9yIHRoZSBzdXBwcmVzcyBlbGVtZW50Ci0JICogQHBhcmFtIGl0ZW1SZWxQYXRoCi0JICovCi0JcHVibGljIHZvaWQgc2V0U3VwcHJlc3NlZChTdHJpbmcgaXRlbVJlbFBhdGgpCi0JewotCQkvL1N5c3RlbS5vdXQucHJpbnRsbigiU3VwcHJlc3NlZDogIiArIGFjdGl2aXR5X3BhdGggKyAiOiAiICsgaXRlbVJlbFBhdGgpOwotCQkKLQkJaWYgKCAhc3VwcmVzc2VkSXRlbXMuY29udGFpbnMoaXRlbVJlbFBhdGgpICkKLQkJewotCQkJc3VwcmVzc2VkSXRlbXMuYWRkKGl0ZW1SZWxQYXRoKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBnZXQgdGhlIHN1cHByZXNzZWQgZWxlbWVudHMKLQkgKiBAcmV0dXJuIExpc3QgYSBsaXN0IG9mIFN0cmluZyBmb3IgdGhlIHJlbGF0aXZlIHBhdGggb2YgdGhlIHN1cHByZXNzZWQgZWxlbWVudHMKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRTdXBwcmVzc2VkSXRlbXMoKQotCXsKLQkJcmV0dXJuIHN1cHJlc3NlZEl0ZW1zOwotCX0KLQkKLQkvKioKLQkgKiBjaGVjayBpZiB0aGVyZSBpcyBhbnkgc3VwcHJlc3NlZCBpdGVtIGxvY2FsIHRvIHRoaXMgcHJvY2VzcwotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc0xvY2FsU3VwcHJlc3NlZCgpCi0JewotCQlyZXR1cm4gKHN1cHJlc3NlZEl0ZW1zLnNpemUoKSA+IDApOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZWxlbWVudHMvQXJ0aWZhY3RMYXlvdXQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZWxlbWVudHMvQXJ0aWZhY3RMYXlvdXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzEyODY5Mi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L2VsZW1lbnRzL0FydGlmYWN0TGF5b3V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuZWxlbWVudHM7Ci0KLS8qKgotICogVGhlIGVsZW1lbnQgbGF5b3V0IGZvciBhbiBBcnRpZmFjdC4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBBcnRpZmFjdExheW91dCBleHRlbmRzIFdvcmtQcm9kdWN0TGF5b3V0IHsKLQotCS8qKgotCSAqIGNvbnN0cnVjdG9yIGZvciBBcnRpZmFjdExheW91dAotCSAqCi0JICovCi0JcHVibGljIEFydGlmYWN0TGF5b3V0KCkgewotCQlzdXBlcigpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9lbGVtZW50cy9DaGVja2xpc3RMYXlvdXQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZWxlbWVudHMvQ2hlY2tsaXN0TGF5b3V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjM2M3NWEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9lbGVtZW50cy9DaGVja2xpc3RMYXlvdXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5lbGVtZW50czsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5FbGVtZW50TGF5b3V0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQudXRpbC5YbWxFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQXNzb2NpYXRpb25IZWxwZXI7Ci0KLQotLyoqCi0gKiBUaGUgZWxlbWVudCBsYXlvdXQgZm9yIGEgQ2hlY2tsaXN0LgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBDaGVja2xpc3RMYXlvdXQgZXh0ZW5kcyBBYnN0cmFjdEVsZW1lbnRMYXlvdXQgewotCi0JLyoqCi0JICogY29uc3RydWN0b3IgZm9yIGNoZWNrIGxpc3QgbGF5b3V0Ci0JICoKLQkgKi8KLQlwdWJsaWMgQ2hlY2tsaXN0TGF5b3V0KCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIGluaXRpYWxpemUgdGhlIGxheW91dAotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoRWxlbWVudExheW91dE1hbmFnZXIgbGF5b3V0TWFuYWdlciwgTWV0aG9kRWxlbWVudCBlbGVtZW50KSB7Ci0JCXN1cGVyLl9faW5pdChsYXlvdXRNYW5hZ2VyLCBlbGVtZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5JRWxlbWVudExheW91dCNnZXRYbWxFbGVtZW50KGJvb2xlYW4pCi0JICovCi0JcHVibGljIFhtbEVsZW1lbnQgZ2V0WG1sRWxlbWVudChib29sZWFuIGluY2x1ZGVSZWZlcmVuY2VzKSB7Ci0JCVhtbEVsZW1lbnQgZWxlbWVudFhtbCA9IHN1cGVyLmdldFhtbEVsZW1lbnQoaW5jbHVkZVJlZmVyZW5jZXMpOwotCi0JCWlmIChpbmNsdWRlUmVmZXJlbmNlcykgewotCQkJTGlzdCBjb250ZW50RWxlbWVudHMgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwbkZlYXR1cmVWYWx1ZShzdXBlci5lbGVtZW50LAotCQkJCQlBc3NvY2lhdGlvbkhlbHBlci5DaGVja2xpc3RfQ29udGVudEVsZW1lbnRzLCBsYXlvdXRNYW5hZ2VyCi0JCQkJCQkJLmdldEVsZW1lbnRSZWFsaXplcigpKTsKLQkJCQotCQkJTGlzdCBhY3Rpdml0aWVzID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMG5GZWF0dXJlVmFsdWUoc3VwZXIuZWxlbWVudCwKLQkJCQkJQXNzb2NpYXRpb25IZWxwZXIuQ2hlY2tsaXN0X0JyZWFrZG93bkVsZW1lbnRzLCBsYXlvdXRNYW5hZ2VyCi0JCQkJCQkJLmdldEVsZW1lbnRSZWFsaXplcigpKTsKLQotCQkJY29udGVudEVsZW1lbnRzLmFkZEFsbChhY3Rpdml0aWVzKTsKLQotCQkJYWRkUmVmZXJlbmNlcyhBc3NvY2lhdGlvbkhlbHBlci5DaGVja2xpc3RfQ29udGVudEVsZW1lbnRzLCBlbGVtZW50WG1sLCAiY29udGVudEVsZW1lbnRzIiwgY29udGVudEVsZW1lbnRzKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJcmV0dXJuIGVsZW1lbnRYbWw7Ci0JfQotCi19Ci0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZWxlbWVudHMvQ29uY2VwdExheW91dC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9lbGVtZW50cy9Db25jZXB0TGF5b3V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2NmM2NWUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9lbGVtZW50cy9Db25jZXB0TGF5b3V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuZWxlbWVudHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuRWxlbWVudExheW91dE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LnV0aWwuWG1sRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkFzc29jaWF0aW9uSGVscGVyOwotCi0KLS8qKgotICogVGhlIGVsZW1lbnQgbGF5b3V0IGZvciBhIENvbmNlcHQuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIENvbmNlcHRMYXlvdXQgZXh0ZW5kcyBBYnN0cmFjdEVsZW1lbnRMYXlvdXQgewotCi0JLyoqCi0JICogY29uc3RydWN0IGEgbGF5b3V0IGZvciBDb25jZXB0Ci0JICoKLQkgKi8KLQlwdWJsaWMgQ29uY2VwdExheW91dCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBpbml0aWFsaXplIHRoZSBsYXlvdXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KEVsZW1lbnRMYXlvdXRNYW5hZ2VyIGxheW91dE1hbmFnZXIsIE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgewotCQlzdXBlci5fX2luaXQobGF5b3V0TWFuYWdlciwgZWxlbWVudCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuSUVsZW1lbnRMYXlvdXQjZ2V0WG1sRWxlbWVudChib29sZWFuKQotCSAqLwotCXB1YmxpYyBYbWxFbGVtZW50IGdldFhtbEVsZW1lbnQoYm9vbGVhbiBpbmNsdWRlUmVmZXJlbmNlcykgewotCQlYbWxFbGVtZW50IGVsZW1lbnRYbWwgPSBzdXBlci5nZXRYbWxFbGVtZW50KGluY2x1ZGVSZWZlcmVuY2VzKTsKLQotCQlpZiAoaW5jbHVkZVJlZmVyZW5jZXMpIHsKLQkJCUxpc3QgY29udGVudEVsZW1lbnRzID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMG5GZWF0dXJlVmFsdWUoc3VwZXIuZWxlbWVudCwKLQkJCQkJQXNzb2NpYXRpb25IZWxwZXIuQ29uY2VwdF9Db250ZW50RWxlbWVudHMsIGxheW91dE1hbmFnZXIKLQkJCQkJCQkuZ2V0RWxlbWVudFJlYWxpemVyKCkpOwotCi0JCQlMaXN0IGFjdGl2aXRpZXMgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwbkZlYXR1cmVWYWx1ZShzdXBlci5lbGVtZW50LAotCQkJCQlBc3NvY2lhdGlvbkhlbHBlci5Db25jZXB0X0JyZWFrZG93bkVsZW1lbnRzLCBsYXlvdXRNYW5hZ2VyCi0JCQkJCQkJLmdldEVsZW1lbnRSZWFsaXplcigpKTsKLQotCQkJY29udGVudEVsZW1lbnRzLmFkZEFsbChhY3Rpdml0aWVzKTsKLQkJCQotCQkJYWRkUmVmZXJlbmNlcyhBc3NvY2lhdGlvbkhlbHBlci5Db25jZXB0X0NvbnRlbnRFbGVtZW50cywgZWxlbWVudFhtbCwgImNvbnRlbnRFbGVtZW50cyIsIGNvbnRlbnRFbGVtZW50cyk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCXJldHVybiBlbGVtZW50WG1sOwotCX0KLQotCi0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZWxlbWVudHMvRGVsaXZlcmFibGVMYXlvdXQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZWxlbWVudHMvRGVsaXZlcmFibGVMYXlvdXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2I1NTU2Yy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L2VsZW1lbnRzL0RlbGl2ZXJhYmxlTGF5b3V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuZWxlbWVudHM7Ci0KLS8qKgotICogVGhlIGVsZW1lbnQgbGF5b3V0IGZvciBhIERlbGl2ZXJhYmxlLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIERlbGl2ZXJhYmxlTGF5b3V0IGV4dGVuZHMgV29ya1Byb2R1Y3RMYXlvdXQgewotCi0JLyoqCi0JICogbGF5b3V0IGZvciBEZWxpdmVyYWJsZQotCSAqCi0JICovCi0JcHVibGljIERlbGl2ZXJhYmxlTGF5b3V0KCkgewotCQlzdXBlcigpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9lbGVtZW50cy9EZXNjcmlwdG9yRGVzY3JpcHRpb25MYXlvdXQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZWxlbWVudHMvRGVzY3JpcHRvckRlc2NyaXB0aW9uTGF5b3V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiMzVmNWUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9lbGVtZW50cy9EZXNjcmlwdG9yRGVzY3JpcHRpb25MYXlvdXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuZWxlbWVudHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5FbGVtZW50TGF5b3V0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQudXRpbC5YbWxFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuTGlicmFyeVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmliYWJsZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3I7Ci0KLS8qKgotICogbGF5b3V0IGNsYXNzIGZvciBkZXNjcmlwdG9yIGNvbnRlbnRzCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBEZXNjcmlwdG9yRGVzY3JpcHRpb25MYXlvdXQgZXh0ZW5kcyBBYnN0cmFjdEVsZW1lbnRMYXlvdXQgewotCi0JTWV0aG9kRWxlbWVudCBkZXNjcmlwdG9yOwotCU1ldGhvZEVsZW1lbnQgbGlua2VkRWxlbWVudDsKLQlBYnN0cmFjdEVsZW1lbnRMYXlvdXQgbGlua2VkRGVzY3JpcHRpb25MYXlvdXQgPSBudWxsOwotCi0JLyoqCi0JICogbGF5b3V0IGZvciBkZXNjcmlwdG9ycwotCSAqIEBwYXJhbSBkZXNjcmlwdG9yCi0JICovCi0JcHVibGljIERlc2NyaXB0b3JEZXNjcmlwdGlvbkxheW91dChNZXRob2RFbGVtZW50IGRlc2NyaXB0b3IpIHsKLQkJdGhpcy5kZXNjcmlwdG9yID0gZGVzY3JpcHRvcjsKLQl9Ci0JCi0JLyoqCi0JICogaW5pdGlhbGl6ZSB0aGUgbGF5b3V0Ci0JICovCi0JcHVibGljIHZvaWQgaW5pdChFbGVtZW50TGF5b3V0TWFuYWdlciBsYXlvdXRNYW5hZ2VyLCBNZXRob2RFbGVtZW50IGVsZW1lbnQpIHsKLQkJc3VwZXIuX19pbml0KGxheW91dE1hbmFnZXIsIGVsZW1lbnQpOwotCQkKLQkJc3VwZXIudGFyZ2V0RWxlbWVudCA9IGRlc2NyaXB0b3I7Ci0JCXN1cGVyLm93bmVyRWxlbWVudCA9IGRlc2NyaXB0b3I7Ci0JCQotCQlpZiAoZGVzY3JpcHRvciBpbnN0YW5jZW9mIFRhc2tEZXNjcmlwdG9yKSB7Ci0JCQlsaW5rZWRFbGVtZW50ID0gKChUYXNrRGVzY3JpcHRvcikgZGVzY3JpcHRvcikuZ2V0VGFzaygpOwotCQl9IGVsc2UgaWYgKGRlc2NyaXB0b3IgaW5zdGFuY2VvZiBSb2xlRGVzY3JpcHRvcikgewotCQkJbGlua2VkRWxlbWVudCA9ICgoUm9sZURlc2NyaXB0b3IpIGRlc2NyaXB0b3IpLmdldFJvbGUoKTsKLQkJfSBlbHNlIGlmIChkZXNjcmlwdG9yIGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yKSB7Ci0JCQlsaW5rZWRFbGVtZW50ID0gKChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIGRlc2NyaXB0b3IpLmdldFdvcmtQcm9kdWN0KCk7Ci0JCX0KLQkJCi0JCS8vIGdldCB0aGUgcmVhbGl6ZWQgb25lCi0JCS8vIDE5NjA5NCAtIFRhc2sgZGVzY3JpcHRvciBwYWdlIHNob3VsZCBzaG93IHRoZSByZWFsaXplZCBjb250ZW50IG9mIHRoZSBsaW5rZWQgZWxlbWVudAotCQlsaW5rZWRFbGVtZW50ID0gQ29uZmlndXJhdGlvbkhlbHBlci5nZXRDYWxjdWxhdGVkRWxlbWVudChsaW5rZWRFbGVtZW50LCBsYXlvdXRNYW5hZ2VyLmdldEVsZW1lbnRSZWFsaXplcigpKTsKLQotCQlpZiAobGlua2VkRWxlbWVudCAhPSBudWxsKSB7Ci0JCQlsaW5rZWREZXNjcmlwdGlvbkxheW91dCA9IG5ldyBHZW5lcmFsTGF5b3V0KCk7Ci0JCQlsaW5rZWREZXNjcmlwdGlvbkxheW91dC5pbml0KGxheW91dE1hbmFnZXIsICgoRGVzY3JpYmFibGVFbGVtZW50KWxpbmtlZEVsZW1lbnQpLmdldFByZXNlbnRhdGlvbigpKTsKLQkJCWxpbmtlZERlc2NyaXB0aW9uTGF5b3V0LnNldENvbnRlbnRUYXJnZXQoZGVzY3JpcHRvcik7Ci0JCQlsaW5rZWREZXNjcmlwdGlvbkxheW91dC5zZXRFbGVtZW50T3duZXIobGlua2VkRWxlbWVudCk7CQkKLQkJfQotCi0JfQotCi0JcHVibGljIHZvaWQgbG9hZEF0dHJpYnV0ZXMoWG1sRWxlbWVudCBlbGVtZW50WG1sKSB7Ci0KLQkJTWFwIGZlYXR1cmVWYWx1ZU1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCUxpc3QgZmVhdHVyZXMgPSBMaWJyYXJ5VXRpbC5nZXRTdHJ1Y3R1cmFsRmVhdHVyZXMoZWxlbWVudCk7Ci0vLwkJTGlzdCBwcm9wZXJ0aWVzID0gZWxlbWVudC5nZXRJbnN0YW5jZVByb3BlcnRpZXMoKTsKLQkJaWYgKGZlYXR1cmVzICE9IG51bGwpIHsKLQkJCS8vIGdldCBhbGwgc3RyaW5nIHR5cGUgYXR0cmlidXRlcwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmZWF0dXJlcy5zaXplKCk7IGkrKykgewotCQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBwID0gKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgZmVhdHVyZXMuZ2V0KGkpOwkJCQotCQkJCWlmICghKHAgaW5zdGFuY2VvZiBFQXR0cmlidXRlKSApIHsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJCS8vRUF0dHJpYnV0ZSBhdHRyaWIgPSAoRUF0dHJpYnV0ZSlwOwotCQkJCVN0cmluZyBuYW1lID0gcC5nZXROYW1lKCk7Ci0JCQkJCQkJCQotCQkJCU9iamVjdCB2YWx1ZTsKLQkJCQlpZiAobmFtZS5lcXVhbHMoInByZXNlbnRhdGlvbk5hbWUiKSkgLy8kTk9OLU5MUy0xJAotCQkJCXsKLQkJCQkJLy8gdmFsdWUgPSBUbmdVdGlsLmdldFByZXNlbnRhdGlvbk5hbWUoZWxlbWVudCk7Ci0JCQkJCXZhbHVlID0gQ29uZmlndXJhdGlvbkhlbHBlci5nZXRQcmVzZW50YXRpb25OYW1lKGVsZW1lbnQsCi0JCQkJCQkJbGF5b3V0TWFuYWdlci5nZXRDb25maWd1cmF0aW9uKCkpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXZhbHVlID0gZ2V0QXR0cmlidXRlRmVhdHVyZVZhbHVlKHApOwotCQkJCX0KLQkJCQkKLQkJCQlmZWF0dXJlVmFsdWVNYXAucHV0KG5hbWUsIHZhbHVlKTsKLQkJCX0KLQkJfQotCQkKLQkJU3RyaW5nIHJlZmluZWREZXNjTmFtZSA9IFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkuZ2V0RGVzY3JpcHRvckRlc2NyaXB0aW9uX1JlZmluZWREZXNjcmlwdGlvbigpLmdldE5hbWUoKTsKLQkJU3RyaW5nIG1haW5EZXNjTmFtZSA9IFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCS5nZXRDb250ZW50RGVzY3JpcHRpb25fTWFpbkRlc2NyaXB0aW9uKCkuZ2V0TmFtZSgpOwotCQkKLQkJLy8gbm93LCBnZXQgdGhlIGZlYXR1cmUgdmFsdWUgZnJvbSB0aGUgbGluayBlbGVtZW50J3MgZGVjcmlwdGlvbgotCQlmZWF0dXJlcyA9IG51bGw7Ci0JCWlmICggKCBsaW5rZWREZXNjcmlwdGlvbkxheW91dCE9bnVsbCApICYmIChsaW5rZWREZXNjcmlwdGlvbkxheW91dC5nZXRFbGVtZW50KCkgIT0gbnVsbCkgKSB7Ci0vLwkJCXByb3BlcnRpZXMgPSBsaW5rZWREZXNjcmlwdGlvbkxheW91dC5nZXRFbGVtZW50KCkuZ2V0SW5zdGFuY2VQcm9wZXJ0aWVzKCk7Ci0JCQlmZWF0dXJlcyA9IExpYnJhcnlVdGlsLmdldFN0cnVjdHVyYWxGZWF0dXJlcyhsaW5rZWREZXNjcmlwdGlvbkxheW91dC5nZXRFbGVtZW50KCkpOwotCQl9Ci0JCQotCQlpZiAoZmVhdHVyZXMgIT0gbnVsbCkgewotCQkJLy8gZ2V0IGFsbCBzdHJpbmcgdHlwZSBhdHRyaWJ1dGVzCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IGZlYXR1cmVzLnNpemUoKTsgaSsrKSB7Ci0JCQkJRVN0cnVjdHVyYWxGZWF0dXJlIHAgPSAoRVN0cnVjdHVyYWxGZWF0dXJlKSBmZWF0dXJlcy5nZXQoaSk7CQkJCi0JCQkJaWYgKCEocCBpbnN0YW5jZW9mIEVBdHRyaWJ1dGUpICkgewotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJLy9FQXR0cmlidXRlIGF0dHJpYiA9IChFQXR0cmlidXRlKXA7Ci0JCQkJU3RyaW5nIG5hbWUgPSBwLmdldE5hbWUoKTsKLQkJCQlpZiAoIG5hbWUuZXF1YWxzKG1haW5EZXNjTmFtZSkgKSB7Ci0JCQkJCW5hbWUgPSByZWZpbmVkRGVzY05hbWU7Ci0JCQkJfQotCQkJCQotCQkJCU9iamVjdCB2YWx1ZSA9IGZlYXR1cmVWYWx1ZU1hcC5nZXQobmFtZSk7Ci0JCQkJaWYgKCB2YWx1ZSA9PSBudWxsIHx8IHZhbHVlLnRvU3RyaW5nKCkubGVuZ3RoKCkgPT0gMCApIHsKLQkJCQkJdmFsdWUgPSBsaW5rZWREZXNjcmlwdGlvbkxheW91dC5nZXRBdHRyaWJ1dGVGZWF0dXJlVmFsdWUocCk7Ci0JCQkJCWZlYXR1cmVWYWx1ZU1hcC5wdXQobmFtZSwgdmFsdWUpOwotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQkJLy8gbm93IHNldCB0aGUgdmFsdWVzCi0JCWZvciAoSXRlcmF0b3IgaXQgPSBmZWF0dXJlVmFsdWVNYXAuZW50cnlTZXQoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7ICkgewotCQkJTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSlpdC5uZXh0KCk7Ci0JCQlTdHJpbmcgbmFtZSA9IChTdHJpbmcpZW50cnkuZ2V0S2V5KCk7Ci0JCQlPYmplY3QgdmFsdWUgPSBlbnRyeS5nZXRWYWx1ZSgpOwotCQkJZWxlbWVudFhtbC5uZXdDaGlsZCgiYXR0cmlidXRlIikJLy8kTk9OLU5MUy0xJAotCQkJCS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCBuYW1lKQkJLy8kTk9OLU5MUy0xJAotCQkJCS5zZXRWYWx1ZSgodmFsdWUgPT0gbnVsbCkgPyAiIiA6IHZhbHVlLnRvU3RyaW5nKCkpOyAgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L2VsZW1lbnRzL0Rlc2NyaXB0b3JMYXlvdXQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZWxlbWVudHMvRGVzY3JpcHRvckxheW91dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNWEwMmYwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZWxlbWVudHMvRGVzY3JpcHRvckxheW91dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5lbGVtZW50czsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlN1cHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5FbGVtZW50TGF5b3V0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuSUVsZW1lbnRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpcHRvckRlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUudXRpbC5PcHBvc2l0ZUZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkFzc29jaWF0aW9uSGVscGVyOwotCi0vKioKLSAqIGJhc2UgbGF5b3V0IGNsYXNzIGZvciBkZXNjcmlwdG9ycwotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIERlc2NyaXB0b3JMYXlvdXQgZXh0ZW5kcyBBYnN0cmFjdFByb2Nlc3NFbGVtZW50TGF5b3V0IHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29sbGVjdGlvbjxFU3RydWN0dXJhbEZlYXR1cmU+IGV4dHJhRmVhdHVyZXNGcm9tQ29udGVudEVsZW1lbnQgPSBBcnJheXMuYXNMaXN0KG5ldyBFU3RydWN0dXJhbEZlYXR1cmVbXSB7Ci0JCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb250ZW50RWxlbWVudF9Bc3NldHMoKSwKLQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbnRlbnRFbGVtZW50X0NoZWNrbGlzdHMoKSwKLQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbnRlbnRFbGVtZW50X0NvbmNlcHRzQW5kUGFwZXJzKCksCi0JCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb250ZW50RWxlbWVudF9FeGFtcGxlcygpLAotCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29udGVudEVsZW1lbnRfR3VpZGVsaW5lcygpLAotCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29udGVudEVsZW1lbnRfU3VwcG9ydGluZ01hdGVyaWFscygpCQotCX0pOwotCi0JTWV0aG9kRWxlbWVudCBsaW5rZWRFbGVtZW50ID0gbnVsbDsKLQotCUFic3RyYWN0RWxlbWVudExheW91dCBlbGVtZW50TGF5b3V0ID0gbnVsbDsKLQkKLQlwcm90ZWN0ZWQgdm9pZCBfX2luaXQoRWxlbWVudExheW91dE1hbmFnZXIgbGF5b3V0TWFuYWdlciwKLQkJCU1ldGhvZEVsZW1lbnQgZWxlbWVudCkgewotCQlzdXBlci5fX2luaXQobGF5b3V0TWFuYWdlciwgZWxlbWVudCk7Ci0KLQkJLy8gMTk2MDk0IC0gVGFzayBkZXNjcmlwdG9yIHBhZ2Ugc2hvdWxkIHNob3cgdGhlIHJlYWxpemVkIGNvbnRlbnQgb2YgdGhlIGxpbmtlZCBlbGVtZW50Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgVGFza0Rlc2NyaXB0b3IpIHsKLQkJCWxpbmtlZEVsZW1lbnQgPSAoKFRhc2tEZXNjcmlwdG9yKSBlbGVtZW50KS5nZXRUYXNrKCk7Ci0JCQlsaW5rZWRFbGVtZW50ID0gQ29uZmlndXJhdGlvbkhlbHBlci5nZXRDYWxjdWxhdGVkRWxlbWVudChsaW5rZWRFbGVtZW50LCBsYXlvdXRNYW5hZ2VyLmdldEVsZW1lbnRSZWFsaXplcigpKTsKLQkJCWlmIChsaW5rZWRFbGVtZW50ICE9IG51bGwpIHsKLQkJCQllbGVtZW50TGF5b3V0ID0gbmV3IFRhc2tMYXlvdXQoKTsKLQkJCX0KLQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgUm9sZURlc2NyaXB0b3IpIHsKLQkJCWxpbmtlZEVsZW1lbnQgPSAoKFJvbGVEZXNjcmlwdG9yKSBlbGVtZW50KS5nZXRSb2xlKCk7Ci0JCQlsaW5rZWRFbGVtZW50ID0gQ29uZmlndXJhdGlvbkhlbHBlci5nZXRDYWxjdWxhdGVkRWxlbWVudChsaW5rZWRFbGVtZW50LCBsYXlvdXRNYW5hZ2VyLmdldEVsZW1lbnRSZWFsaXplcigpKTsKLQkJCWlmIChsaW5rZWRFbGVtZW50ICE9IG51bGwpIHsKLQkJCQllbGVtZW50TGF5b3V0ID0gbmV3IFJvbGVMYXlvdXQoKTsKLQkJCX0KLQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yKSB7Ci0JCQlsaW5rZWRFbGVtZW50ID0gKChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIGVsZW1lbnQpLmdldFdvcmtQcm9kdWN0KCk7Ci0JCQlsaW5rZWRFbGVtZW50ID0gQ29uZmlndXJhdGlvbkhlbHBlci5nZXRDYWxjdWxhdGVkRWxlbWVudChsaW5rZWRFbGVtZW50LCBsYXlvdXRNYW5hZ2VyLmdldEVsZW1lbnRSZWFsaXplcigpKTsKLQkJCWlmIChsaW5rZWRFbGVtZW50ICE9IG51bGwpIHsKLQkJCQllbGVtZW50TGF5b3V0ID0gbmV3IFdvcmtQcm9kdWN0TGF5b3V0KCk7Ci0JCQl9Ci0JCX0KLQotCQlpZiAoZWxlbWVudExheW91dCAhPSBudWxsKSB7Ci0JCQllbGVtZW50TGF5b3V0LmluaXQobGF5b3V0TWFuYWdlciwgbGlua2VkRWxlbWVudCk7Ci0JCQllbGVtZW50TGF5b3V0LnNldENvbnRlbnRUYXJnZXQoZWxlbWVudCk7Ci0JCX0JCi0JCQotCQkvLyBtYWtlIHN1cmUgdGhlIGxpbmtlZCBlbGVtZW50IGlzIGxvYWRlZAotCQlpZiAoIGxpbmtlZEVsZW1lbnQgIT0gbnVsbCApIHsKLQkJCWZvciAoSXRlcmF0b3I8RU9iamVjdD4gaXRlciA9IGxpbmtlZEVsZW1lbnQuZUFsbENvbnRlbnRzKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCWl0ZXIubmV4dCgpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogZm9yIGRlc2NyaXB0b3JzLCBpZiB0aGUgYXR0cmlidXRlIGlzIG5vdCBkZWZpbmVkLCBnZXQgZnJvbSB0aGUgbGliZWQKLQkgKiBlbGVtZW50Ci0JICogCi0JICogQHBhcmFtIGZlYXR1cmUgRVN0cnVjdHVyYWxGZWF0dXJlCi0JICogQHJldHVybiBPYmplY3QKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEF0dHJpYnV0ZUZlYXR1cmVWYWx1ZShFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSkgewotCQlPYmplY3QgdmFsdWUgPSBzdXBlci5nZXRBdHRyaWJ1dGVGZWF0dXJlVmFsdWUoZmVhdHVyZSk7Ci0JCWlmICgoZWxlbWVudExheW91dCA9PSBudWxsKSB8fCAodmFsdWUgIT0gbnVsbCkKLQkJCQkmJiAodmFsdWUudG9TdHJpbmcoKS5sZW5ndGgoKSA+IDApKSB7Ci0JCQlyZXR1cm4gdmFsdWU7Ci0JCX0KLQotCQkvLyBpZiB0aGUgYXR0cmlidXRlIGlzIG5vdCBkZWZpbmVkLCBncmFiIHRoZSBhdHRyaWJ1dGUgdmFsdWUgZnJvbSB0aGUKLQkJLy8gbGlua2VkIGVsZW1lbnQKLQkJLy8gc3BlY2lmaWVkIGF0dHJpYnV0ZXMgb25seS4gQWRkIG1vcmUgZmVhdHVyZSBoZXJlIGlmIG5lZWRlZAotCQlpZiAoZmVhdHVyZSA9PSBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRNZXRob2RFbGVtZW50X0JyaWVmRGVzY3JpcHRpb24oKSkgewotCQkJcmV0dXJuIGVsZW1lbnRMYXlvdXQuZ2V0QXR0cmlidXRlRmVhdHVyZVZhbHVlKGZlYXR1cmUpOwotCQl9Ci0KLQkJcmV0dXJuIHZhbHVlOwotCX0KLQotCS8qKgotCSAqIGdldCB0aGUgbGF5b3V0IGZvciBhIGNoaWxkIGVsZW1lbnQgb2YgdGhpcyBlbGVtZW50Ci0JICogQWN0aXZpdHlFbGVtZW50TGF5b3V0IHNob3VsZCBvdmVycmlkZSB0aGlzIG1ldGhvZCB0byBjcmVhdGUgbGF5b3V0IHdpdGggbm9kZSBwYXRoCi0JICogQHBhcmFtIGNoaWxkCi0JICogQHJldHVybiBJRWxlbWVudExheW91dAotCSAqLwotCXByb3RlY3RlZCBJRWxlbWVudExheW91dCBnZXRDaGlsZExheW91dChNZXRob2RFbGVtZW50IGNoaWxkKQotCXsKLQkJaWYgKCBsYXlvdXRNYW5hZ2VyLmdldFZhbGlkYXRvcigpLnNob3dFeHRyYUluZm9Gb3JEZXNjcmlwdG9ycygpIAotCQkJCSYmIChjaGlsZCBpbnN0YW5jZW9mIERlc2NyaXB0b3JEZXNjcmlwdGlvbikgKSB7Ci0JCQlEZXNjcmlwdG9yRGVzY3JpcHRpb25MYXlvdXQgbCA9IG5ldyBEZXNjcmlwdG9yRGVzY3JpcHRpb25MYXlvdXQodGhpcy5lbGVtZW50KTsKLQkJCWwuaW5pdChsYXlvdXRNYW5hZ2VyLCBjaGlsZCk7Ci0JCQlyZXR1cm4gbDsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBsYXlvdXRNYW5hZ2VyLmdldExheW91dChjaGlsZCwgdHJ1ZSk7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIENvbGxlY3Rpb248RVN0cnVjdHVyYWxGZWF0dXJlPiBnZXRFeHRyYUZlYXR1cmVzRnJvbUNvbnRlbnRFbGVtZW50KCkgewotCQlyZXR1cm4gZXh0cmFGZWF0dXJlc0Zyb21Db250ZW50RWxlbWVudDsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHRGZWF0dXJlVmFsdWUoRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsCi0JCQlPYmplY3QgdmFsdWUpIHsKLQkJCi0JCVN1cHByZXNzaW9uIHN1cCA9IHN1cGVyLmdldFN1cHByZXNzaW9uKHN1cGVyLm93bmluZ1Byb2Nlc3MpOwotCQlpZiAoIHN1cCAhPSBudWxsICkgewotCQkJLy8gY2hlY2sgc3VwcHJlc3Npb24KLQkJCWlmICggdmFsdWUgaW5zdGFuY2VvZiBMaXN0ICkgewotCQkJCUxpc3QgaXRlbXMgPSAoTGlzdCl2YWx1ZTsKLQkJCQlpbnQgaSA9IDA7Ci0JCQkJd2hpbGUgKCBpIDwgaXRlbXMuc2l6ZSgpICkgewotCQkJCQlPYmplY3QgdiA9IGl0ZW1zLmdldChpKTsKLQkJCQkJaWYgKCBpc1N1cHByZXNzZWQoc3VwLCBmZWF0dXJlLCB2KSApIHsKLQkJCQkJCWl0ZW1zLnJlbW92ZShpKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCWkrKzsKLQkJCQkJfQotCQkJCX0KLQkJCQkKLQkJCQlpZiAoIGl0ZW1zLnNpemUoKSA9PSAwICkgewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlpZiAoIGlzU3VwcHJlc3NlZChzdXAsIGZlYXR1cmUsIHZhbHVlKSApIHsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIHN1cGVyLmFjY2VwdEZlYXR1cmVWYWx1ZShmZWF0dXJlLCB2YWx1ZSk7Ci0JfQotCQotCXByb3RlY3RlZCBib29sZWFuIGlzU3VwcHJlc3NlZChTdXBwcmVzc2lvbiBzdXAsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBPYmplY3QgZWxlbWVudCkgewotCQlpZiAoIGVsZW1lbnQgaW5zdGFuY2VvZiBEZXNjcmlwdG9yICkgewotCQkJcmV0dXJuIHN1cC5pc1N1cHByZXNzZWQoZWxlbWVudCk7Ci0JCX0KLQkJCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNUYXNrT3Bwb3NpdGVGZWF0dXJlKE9wcG9zaXRlRmVhdHVyZSBmZWF0dXJlKSB7Ci0JCXJldHVybiAoZmVhdHVyZSA9PSBBc3NvY2lhdGlvbkhlbHBlci5Sb2xlRGVzY3JpcHRvcl9QcmltYXJ5VGFza0Rlc2NyaXB0b3JzKQotCQl8fCAoIGZlYXR1cmUgPT0gQXNzb2NpYXRpb25IZWxwZXIuUm9sZURlc2NyaXB0b3JfQWRkaXRpb25hbFRhc2tEZXNjcmlwdG9ycykKLQkJfHwgKCBmZWF0dXJlID09IEFzc29jaWF0aW9uSGVscGVyLlJvbGVEZXNjcmlwdG9yX0Fzc2lzdHNJbl9UYXNrRGVzY3JpcHRvcnMpCi0JCXx8ICggZmVhdHVyZSA9PSBBc3NvY2lhdGlvbkhlbHBlci5Xb3JrUHJvZHVjdERlc2NyaXB0b3JfRXh0ZXJuYWxJbnB1dFRvX1Rhc2tEZXNjcmlwdG9ycykKLQkJfHwgKCBmZWF0dXJlID09IEFzc29jaWF0aW9uSGVscGVyLldvcmtQcm9kdWN0RGVzY3JpcHRvcl9NYW5kYXRvcnlJbnB1dFRvX1Rhc2tEZXNjcmlwdG9ycykKLQkJfHwgKCBmZWF0dXJlID09IEFzc29jaWF0aW9uSGVscGVyLldvcmtQcm9kdWN0RGVzY3JpcHRvcl9PcHRpb25hbElucHV0VG9fVGFza0Rlc2NyaXB0b3JzKQotCQl8fCAoIGZlYXR1cmUgPT0gQXNzb2NpYXRpb25IZWxwZXIuV29ya1Byb2R1Y3REZXNjcmlwdG9yX091dHB1dEZyb21fVGFza0Rlc2NyaXB0b3JzKTsKLQkJCi0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9lbGVtZW50cy9EaXNjaXBsaW5lTGF5b3V0LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L2VsZW1lbnRzL0Rpc2NpcGxpbmVMYXlvdXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGIyZWVkZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L2VsZW1lbnRzL0Rpc2NpcGxpbmVMYXlvdXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5lbGVtZW50czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5FbGVtZW50TGF5b3V0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRGlzY2lwbGluZUxheW91dCBleHRlbmRzIEFic3RyYWN0RWxlbWVudExheW91dCB7Ci0KLQlwdWJsaWMgRGlzY2lwbGluZUxheW91dCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0KEVsZW1lbnRMYXlvdXRNYW5hZ2VyIGxheW91dE1hbmFnZXIsIE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgewotCQlzdXBlci5fX2luaXQobGF5b3V0TWFuYWdlciwgZWxlbWVudCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L2VsZW1lbnRzL0VsZW1lbnRMYXlvdXRFeHRlbmRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9lbGVtZW50cy9FbGVtZW50TGF5b3V0RXh0ZW5kZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjgxZjU1Ni4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L2VsZW1lbnRzL0VsZW1lbnRMYXlvdXRFeHRlbmRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LmVsZW1lbnRzOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFzazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0OwotCi0KLS8qKgotICogVGhlIGxheW91dCBleHRlbmRlciBmb3IgYWxsIE1ldGhvZCBFbGVtZW50cy4KLSAqIAotICogQGF1dGhvciBXZWlwaW5nIEx1Ci0gKiBAc2ljbmUgMS41Ci0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBFbGVtZW50TGF5b3V0RXh0ZW5kZXIgewotCi0JcHJpdmF0ZSBBYnN0cmFjdEVsZW1lbnRMYXlvdXQgbGF5b3V0OwotCXB1YmxpYyBFbGVtZW50TGF5b3V0RXh0ZW5kZXIoQWJzdHJhY3RFbGVtZW50TGF5b3V0IGxheW91dCkgewotCQl0aGlzLmxheW91dCA9IGxheW91dDsKLQl9Ci0JCi0JcHVibGljIGFic3RyYWN0IExpc3Q8TWV0aG9kRWxlbWVudD4gZ2V0VGFnUXVhbGlmaWVkTGlzdChNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZywgTGlzdDxNZXRob2RFbGVtZW50PiBpdGVtcyk7Ci0KLQlwdWJsaWMgQWJzdHJhY3RFbGVtZW50TGF5b3V0IGdldExheW91dCgpIHsKLQkJcmV0dXJuIGxheW91dDsKLQl9Ci0JCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9lbGVtZW50cy9Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnNMYXlvdXQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZWxlbWVudHMvRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zTGF5b3V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiYzllZTEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9lbGVtZW50cy9Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnNMYXlvdXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5lbGVtZW50czsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5FbGVtZW50TGF5b3V0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQudXRpbC5YbWxFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQXNzb2NpYXRpb25IZWxwZXI7Ci0KLQotLyoqCi0gKiBUaGUgZWxlbWVudCBsYXlvdXQgZm9yIGEgRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zLgotICogCi0gKiBAYXV0aG9yIFdlaXBpbmcgTHUKLSAqIEBzaW5jZSAxLjIKLSAqLwotcHVibGljIGNsYXNzIEVzdGltYXRpb25Db25zaWRlcmF0aW9uc0xheW91dCBleHRlbmRzIEFic3RyYWN0RWxlbWVudExheW91dCB7Ci0KLQlwdWJsaWMgRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zTGF5b3V0KCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXQoRWxlbWVudExheW91dE1hbmFnZXIgbGF5b3V0TWFuYWdlciwgTWV0aG9kRWxlbWVudCBlbGVtZW50KSB7Ci0JCXN1cGVyLl9faW5pdChsYXlvdXRNYW5hZ2VyLCBlbGVtZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5JRWxlbWVudExheW91dCNnZXRYbWxFbGVtZW50KGJvb2xlYW4pCi0JICovCi0JcHVibGljIFhtbEVsZW1lbnQgZ2V0WG1sRWxlbWVudChib29sZWFuIGluY2x1ZGVSZWZlcmVuY2VzKSB7Ci0JCVhtbEVsZW1lbnQgZWxlbWVudFhtbCA9IHN1cGVyLmdldFhtbEVsZW1lbnQoaW5jbHVkZVJlZmVyZW5jZXMpOwotCi0JCWlmIChpbmNsdWRlUmVmZXJlbmNlcykgewkJCQkJCQotCQkJTGlzdCB0YXNrcyA9IENvbmZpZ3VyYXRpb25IZWxwZXIuY2FsYzBuRmVhdHVyZVZhbHVlKHN1cGVyLmVsZW1lbnQsCi0JCQkJCUFzc29jaWF0aW9uSGVscGVyLkVzdGltYXRpb25Db25zaWRlcmF0aW9uc19UYXNrcywgbGF5b3V0TWFuYWdlcgotCQkJCQkJCS5nZXRFbGVtZW50UmVhbGl6ZXIoKSk7Ci0JCQlhZGRSZWZlcmVuY2VzKEFzc29jaWF0aW9uSGVscGVyLkVzdGltYXRpb25Db25zaWRlcmF0aW9uc19UYXNrcywgZWxlbWVudFhtbCwgImNvbnRlbnRFbGVtZW50cyIsIHRhc2tzKTsgLy8kTk9OLU5MUy0xJAotCQkJCi0JCQlMaXN0IHdvcmtQcm9kdWN0cyA9IENvbmZpZ3VyYXRpb25IZWxwZXIuY2FsYzBuRmVhdHVyZVZhbHVlKHN1cGVyLmVsZW1lbnQsCi0JCQkJCUFzc29jaWF0aW9uSGVscGVyLkVzdGltYXRpb25Db25zaWRlcmF0aW9uc19Xb3JrUHJvZHVjdHMsIGxheW91dE1hbmFnZXIKLQkJCQkJCQkuZ2V0RWxlbWVudFJlYWxpemVyKCkpOwotCQkJYWRkUmVmZXJlbmNlcyhBc3NvY2lhdGlvbkhlbHBlci5Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnNfV29ya1Byb2R1Y3RzLCBlbGVtZW50WG1sLCAiY29udGVudEVsZW1lbnRzIiwgd29ya1Byb2R1Y3RzKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJcmV0dXJuIGVsZW1lbnRYbWw7Ci0JfQotCi0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZWxlbWVudHMvRXhhbXBsZUxheW91dC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9lbGVtZW50cy9FeGFtcGxlTGF5b3V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkMGViNjYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9lbGVtZW50cy9FeGFtcGxlTGF5b3V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LmVsZW1lbnRzOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5yZWdleC5NYXRjaGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLkZpbGVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuRWxlbWVudExheW91dE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LnV0aWwuWG1sRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLlJlc291cmNlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3VpZGFuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQXNzb2NpYXRpb25IZWxwZXI7Ci0KLQotLyoqCi0gKiBUaGUgZWxlbWVudCBsYXlvdXQgZm9yIGFuIEV4YW1wbGUuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEV4YW1wbGVMYXlvdXQgZXh0ZW5kcyBBYnN0cmFjdEVsZW1lbnRMYXlvdXQgewotCi0JcHVibGljIEV4YW1wbGVMYXlvdXQoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdChFbGVtZW50TGF5b3V0TWFuYWdlciBsYXlvdXRNYW5hZ2VyLCBNZXRob2RFbGVtZW50IGVsZW1lbnQpIHsKLQkJc3VwZXIuX19pbml0KGxheW91dE1hbmFnZXIsIGVsZW1lbnQpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LklFbGVtZW50TGF5b3V0I2dldFhtbEVsZW1lbnQoYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgWG1sRWxlbWVudCBnZXRYbWxFbGVtZW50KGJvb2xlYW4gaW5jbHVkZVJlZmVyZW5jZXMpIHsKLQkJWG1sRWxlbWVudCBlbGVtZW50WG1sID0gc3VwZXIuZ2V0WG1sRWxlbWVudChpbmNsdWRlUmVmZXJlbmNlcyk7Ci0KLQkJaWYgKGluY2x1ZGVSZWZlcmVuY2VzKSB7Ci0JCQlMaXN0IGNvbnRlbnRFbGVtZW50cyA9IENvbmZpZ3VyYXRpb25IZWxwZXIuY2FsYzBuRmVhdHVyZVZhbHVlKHN1cGVyLmVsZW1lbnQsCi0JCQkJCUFzc29jaWF0aW9uSGVscGVyLkV4YW1wbGVfQ29udGVudEVsZW1lbnRzLCBsYXlvdXRNYW5hZ2VyCi0JCQkJCQkJLmdldEVsZW1lbnRSZWFsaXplcigpKTsKLQkJCQotCQkJTGlzdCBhY3Rpdml0aWVzID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMG5GZWF0dXJlVmFsdWUoc3VwZXIuZWxlbWVudCwKLQkJCQkJQXNzb2NpYXRpb25IZWxwZXIuRXhhbXBsZV9CcmVha2Rvd25FbGVtZW50cywgbGF5b3V0TWFuYWdlcgotCQkJCQkJCS5nZXRFbGVtZW50UmVhbGl6ZXIoKSk7Ci0KLQkJCWNvbnRlbnRFbGVtZW50cy5hZGRBbGwoYWN0aXZpdGllcyk7Ci0JCQkKLQkJCWFkZFJlZmVyZW5jZXMoQXNzb2NpYXRpb25IZWxwZXIuRXhhbXBsZV9Db250ZW50RWxlbWVudHMsIGVsZW1lbnRYbWwsICJjb250ZW50RWxlbWVudHMiLCBjb250ZW50RWxlbWVudHMpOyAvLyROT04tTkxTLTEkCi0KLQkJCUd1aWRhbmNlIGd1aWRhbmNlID0gKEd1aWRhbmNlKSBzdXBlci5lbGVtZW50OwotCQkJQ29udGVudERlc2NyaXB0aW9uIGNvbnRlbnQgPSAoQ29udGVudERlc2NyaXB0aW9uKSBndWlkYW5jZQotCQkJCQkuZ2V0UHJlc2VudGF0aW9uKCk7Ci0JCQlpZiAoY29udGVudCAhPSBudWxsKSB7Ci0JCQkJCi0JCQkJLy8gQXV0aG9yaW5nOiAgVGVtcGxhdGUgYXR0YWNobWVudHMgb2YgYSBjb250cmlidXRpbmcgdGVtcGxhdGUgZ3VpZGFuY2UgZWxlbWVudCBhcmUgbm90IGFwcGVuZGVkIHRvIHRoZSBiYXNlIGxpc3Qgb2YgYXR0YWNobWVudHMJCQkJCi0JCQkJLy9TdHJpbmcgYXR0YWNobWVudFN0cmluZyA9ICgob3JnLmVjbGlwc2UuZXBmLnVtYS5HdWlkYW5jZURlc2NyaXB0aW9uKWNvbnRlbnQpLmdldEF0dGFjaG1lbnRzKCk7Ci0JCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRHdWlkYW5jZURlc2NyaXB0aW9uX0F0dGFjaG1lbnRzKCk7Ci0JCQkJU3RyaW5nIGF0dGFjaG1lbnRTdHJpbmcgPSAoU3RyaW5nKUNvbmZpZ3VyYXRpb25IZWxwZXIuY2FsY0F0dHJpYnV0ZUZlYXR1cmVWYWx1ZShjb250ZW50LCBzdXBlci5lbGVtZW50LCBmZWF0dXJlLCBzdXBlci5sYXlvdXRNYW5hZ2VyLmdldENvbmZpZ3VyYXRpb24oKSk7Ci0JCQkJaWYgKCAoYXR0YWNobWVudFN0cmluZyAhPSBudWxsKSAmJiAoYXR0YWNobWVudFN0cmluZy5pbmRleE9mKENvbmZpZ3VyYXRpb25IZWxwZXIuQVRUUklCVVRFX1ZBTFVFX1NFUEVSQVRPUikgPiAwKSApCi0JCQkJewotCQkJCQlhdHRhY2htZW50U3RyaW5nID0gYXR0YWNobWVudFN0cmluZy5yZXBsYWNlQWxsKENvbmZpZ3VyYXRpb25IZWxwZXIuQVRUUklCVVRFX1ZBTFVFX1NFUEVSQVRPUiwgVG5nVXRpbC5HVUlEQU5DRV9GSUxFU1RSSU5HX1NFUEFSQVRPUik7IAotCQkJCX0KLQkJCQlMaXN0IGF0dGFjaG1lbnRMaXN0ID0gVG5nVXRpbC5jb252ZXJ0R3VpZGFuY2VBdHRhY2htZW50c1RvTGlzdChhdHRhY2htZW50U3RyaW5nKTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBhdHRhY2htZW50TGlzdC5pdGVyYXRvcigpO2l0ZXIuaGFzTmV4dCgpOykgewotCQkJCQlTdHJpbmcgYXR0YWNobWVudEZpbGUgPSAoU3RyaW5nKSBpdGVyLm5leHQoKTsKLQkJCQkJaWYgKGF0dGFjaG1lbnRGaWxlICE9IG51bGwpIHsKLQkJCQkJCU1hdGNoZXIgbSA9IFJlc291cmNlSGVscGVyLnBfdGVtcGxhdGVfYXR0YWNobWVudF91cmwubWF0Y2hlcihhdHRhY2htZW50RmlsZSk7Ci0JCQkJCQlpZiAoIW0uZmluZCgpKSB7Ci0JCQkJCQkJU3RyaW5nIGZpbGVOYW1lID0gRmlsZVV0aWwuZ2V0RmlsZU5hbWUoYXR0YWNobWVudEZpbGUpOwotCQkJCQkJCWVsZW1lbnRYbWwubmV3Q2hpbGQoImF0dHJpYnV0ZSIpLnNldEF0dHJpYnV0ZSgibmFtZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJCQkJImF0dGFjaGVkRmlsZSIpLnNldEF0dHJpYnV0ZSggLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJInVybCIsICJmaWxlOi8vIiArIGF0dGFjaG1lbnRGaWxlKSAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgCi0JCQkJCQkJCQkuc2V0QXR0cmlidXRlKCJmaWxlTmFtZSIsIGZpbGVOYW1lKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlTdHJpbmcgZmlsZU5hbWUgPSBtLmdyb3VwKDIpOwotCQkJCQkJCWVsZW1lbnRYbWwubmV3Q2hpbGQoImF0dHJpYnV0ZSIpLnNldEF0dHJpYnV0ZSgibmFtZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJCQkJImF0dGFjaGVkRmlsZSIpLnNldEF0dHJpYnV0ZSggLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJInVybCIsIG0uZ3JvdXAoMSkpIC8vJE5PTi1OTFMtMSQgCi0JCQkJCQkJCQkuc2V0QXR0cmlidXRlKCJmaWxlTmFtZSIsIGZpbGVOYW1lKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotfQotCi0JCXJldHVybiBlbGVtZW50WG1sOwotCX0KLQotCi0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZWxlbWVudHMvR2VuZXJhbExheW91dC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9lbGVtZW50cy9HZW5lcmFsTGF5b3V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlNjczZDMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9lbGVtZW50cy9HZW5lcmFsTGF5b3V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuZWxlbWVudHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuRWxlbWVudExheW91dE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotCi0KLS8qKgotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEdlbmVyYWxMYXlvdXQgZXh0ZW5kcyBBYnN0cmFjdEVsZW1lbnRMYXlvdXQgewotCi0JcHVibGljIEdlbmVyYWxMYXlvdXQoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdChFbGVtZW50TGF5b3V0TWFuYWdlciBsYXlvdXRNYW5hZ2VyLCBNZXRob2RFbGVtZW50IGVsZW1lbnQpIHsKLQkJc3VwZXIuX19pbml0KGxheW91dE1hbmFnZXIsIGVsZW1lbnQpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9lbGVtZW50cy9HdWlkZWxpbmVMYXlvdXQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZWxlbWVudHMvR3VpZGVsaW5lTGF5b3V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4NDdkMDIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9lbGVtZW50cy9HdWlkZWxpbmVMYXlvdXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5lbGVtZW50czsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5FbGVtZW50TGF5b3V0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQudXRpbC5YbWxFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQXNzb2NpYXRpb25IZWxwZXI7Ci0KLQotLyoqCi0gKiBUaGUgZWxlbWVudCBsYXlvdXQgZm9yIGEgR3VpZGVsaW5lLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBHdWlkZWxpbmVMYXlvdXQgZXh0ZW5kcyBBYnN0cmFjdEVsZW1lbnRMYXlvdXQgewotCi0JcHVibGljIEd1aWRlbGluZUxheW91dCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0KEVsZW1lbnRMYXlvdXRNYW5hZ2VyIGxheW91dE1hbmFnZXIsIE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgewotCQlzdXBlci5fX2luaXQobGF5b3V0TWFuYWdlciwgZWxlbWVudCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuSUVsZW1lbnRMYXlvdXQjZ2V0WG1sRWxlbWVudChib29sZWFuKQotCSAqLwotCXB1YmxpYyBYbWxFbGVtZW50IGdldFhtbEVsZW1lbnQoYm9vbGVhbiBpbmNsdWRlUmVmZXJlbmNlcykgewotCQlYbWxFbGVtZW50IGVsZW1lbnRYbWwgPSBzdXBlci5nZXRYbWxFbGVtZW50KGluY2x1ZGVSZWZlcmVuY2VzKTsKLQotCQlpZiAoaW5jbHVkZVJlZmVyZW5jZXMpIHsKLQkJCUxpc3QgY29udGVudEVsZW1lbnRzID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMG5GZWF0dXJlVmFsdWUoc3VwZXIuZWxlbWVudCwKLQkJCQkJQXNzb2NpYXRpb25IZWxwZXIuR3VpZGVsaW5lX0NvbnRlbnRFbGVtZW50cywgbGF5b3V0TWFuYWdlcgotCQkJCQkJCS5nZXRFbGVtZW50UmVhbGl6ZXIoKSk7Ci0JCQkKLQkJCUxpc3QgYWN0aXZpdGllcyA9IENvbmZpZ3VyYXRpb25IZWxwZXIuY2FsYzBuRmVhdHVyZVZhbHVlKHN1cGVyLmVsZW1lbnQsCi0JCQkJCUFzc29jaWF0aW9uSGVscGVyLkd1aWRlbGluZV9CcmVha2Rvd25FbGVtZW50cywgbGF5b3V0TWFuYWdlcgotCQkJCQkJCS5nZXRFbGVtZW50UmVhbGl6ZXIoKSk7Ci0KLQkJCWNvbnRlbnRFbGVtZW50cy5hZGRBbGwoYWN0aXZpdGllcyk7Ci0KLQkJCWFkZFJlZmVyZW5jZXMoQXNzb2NpYXRpb25IZWxwZXIuR3VpZGVsaW5lX0NvbnRlbnRFbGVtZW50cywgZWxlbWVudFhtbCwgImNvbnRlbnRFbGVtZW50cyIsIGNvbnRlbnRFbGVtZW50cyk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCXJldHVybiBlbGVtZW50WG1sOwotCX0KLQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L2VsZW1lbnRzL091dGNvbWVMYXlvdXQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZWxlbWVudHMvT3V0Y29tZUxheW91dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzODQ5OWEwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZWxlbWVudHMvT3V0Y29tZUxheW91dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LmVsZW1lbnRzOwotCi0vKioKLSAqIFRoZSBlbGVtZW50IGxheW91dCBmb3IgYSBPdXRjb21lLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIE91dGNvbWVMYXlvdXQgZXh0ZW5kcyBXb3JrUHJvZHVjdExheW91dCB7Ci0KLQlwdWJsaWMgT3V0Y29tZUxheW91dCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZWxlbWVudHMvUHJhY3RpY2VMYXlvdXQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZWxlbWVudHMvUHJhY3RpY2VMYXlvdXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjViYzBmZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L2VsZW1lbnRzL1ByYWN0aWNlTGF5b3V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LmVsZW1lbnRzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlByZXNlbnRhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb25maWd1cmF0aW9uLlByYWN0aWNlSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29uZmlndXJhdGlvbi5QcmFjdGljZUl0ZW1Qcm92aWRlci5Hcm91cGluZ0hlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuQ2F0ZWdvcnlTb3J0SGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5FbGVtZW50TGF5b3V0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQudXRpbC5YbWxFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS51dGlsLk9wcG9zaXRlRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQXNzb2NpYXRpb25IZWxwZXI7Ci0KLQotLyoqCi0gKiBUaGUgZWxlbWVudCBsYXlvdXQgZm9yIGEgUHJhY3RpY2UKLSAqIAotICogQGF1dGhvciBXZWlwaW5nIEx1Ci0gKiBAc2luY2UgMS41Ci0gKi8KLXB1YmxpYyBjbGFzcyBQcmFjdGljZUxheW91dCBleHRlbmRzIEFic3RyYWN0RWxlbWVudExheW91dCB7Ci0KLQlwdWJsaWMgUHJhY3RpY2VMYXlvdXQoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdChFbGVtZW50TGF5b3V0TWFuYWdlciBsYXlvdXRNYW5hZ2VyLCBNZXRob2RFbGVtZW50IGVsZW1lbnQpIHsKLQkJc3VwZXIuX19pbml0KGxheW91dE1hbmFnZXIsIGVsZW1lbnQpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LklFbGVtZW50TGF5b3V0I2dldFhtbEVsZW1lbnQoYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgWG1sRWxlbWVudCBnZXRYbWxFbGVtZW50KGJvb2xlYW4gaW5jbHVkZVJlZmVyZW5jZXMpIHsKLQkJWG1sRWxlbWVudCBlbGVtZW50WG1sID0gc3VwZXIuZ2V0WG1sRWxlbWVudChpbmNsdWRlUmVmZXJlbmNlcyk7Ci0KLQkJaWYgKGluY2x1ZGVSZWZlcmVuY2VzKSB7Ci0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IFVtYVBhY2thZ2UuTGl0ZXJhbHMuUFJBQ1RJQ0VfX0NPTlRFTlRfUkVGRVJFTkNFUzsKLQkJCUxpc3Q8TWV0aG9kRWxlbWVudD4gY2hpbGRyZW4gPSBjYWxjMG5GZWF0dXJlVmFsdWUoZWxlbWVudCwgbnVsbCwKLQkJCQkJZmVhdHVyZSwgbGF5b3V0TWFuYWdlci5nZXRFbGVtZW50UmVhbGl6ZXIoKSk7Ci0JCQkKLQkJCUxpc3Q8V29ya1Byb2R1Y3Q+IHdwU2xvdElucHV0cyA9IGdldElucHV0V3BTbG90cyhjaGlsZHJlbik7Ci0JCQkKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlMSA9IFVtYVBhY2thZ2UuTGl0ZXJhbHMuUFJBQ1RJQ0VfX0FDVElWSVRZX1JFRkVSRU5DRVM7Ci0JCQlMaXN0PE1ldGhvZEVsZW1lbnQ+IGNoaWxkcmVuMSA9IGNhbGMwbkZlYXR1cmVWYWx1ZShlbGVtZW50LCBudWxsLAotCQkJCQlmZWF0dXJlMSwgbGF5b3V0TWFuYWdlci5nZXRFbGVtZW50UmVhbGl6ZXIoKSk7Ci0JCQkKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlMiA9IFVtYVBhY2thZ2UuTGl0ZXJhbHMuUFJBQ1RJQ0VfX1NVQl9QUkFDVElDRVM7Ci0JCQlMaXN0PE1ldGhvZEVsZW1lbnQ+IGNoaWxkcmVuMiA9IGNhbGMwbkZlYXR1cmVWYWx1ZShlbGVtZW50LCBudWxsLAotCQkJCQlmZWF0dXJlMiwgbGF5b3V0TWFuYWdlci5nZXRFbGVtZW50UmVhbGl6ZXIoKSk7Ci0JCQkKLQkJCWNoaWxkcmVuLmFkZEFsbChjaGlsZHJlbjEpOwotCQkJY2hpbGRyZW4uYWRkQWxsKGNoaWxkcmVuMik7Ci0JCQkKLQkJCUxpc3QgcmV0ID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCQlHcm91cGluZ0hlbHBlciBncm91cGluZ0hlbHBlciA9IG5ldyBHcm91cGluZ0hlbHBlcih0aGlzKSB7CQkJCi0JCQkJcHJvdGVjdGVkIHZvaWQgZ3JvdXBpbmcoT2JqZWN0IHBhcmVudE9iamVjdCwgTGlzdCByZXQsCi0JCQkJCQlDb2xsZWN0aW9uIGNoaWxkcmVuLCBHcm91cGluZ0hlbHBlciBncm91cGluZ0hlbHBlcikgewkJCQkJCi0JCQkJCWlmIChnZXRHcm91cGVyKCkgaW5zdGFuY2VvZiBQcmFjdGljZUxheW91dCkgewotCQkJCQkJKChQcmFjdGljZUxheW91dCkgZ2V0R3JvdXBlcigpKS5ncm91cGluZyhwYXJlbnRPYmplY3QsIHJldCwKLQkJCQkJCQkJY2hpbGRyZW4sIGdyb3VwaW5nSGVscGVyKTsKLQkJCQkJfQotCQkJCX0JCi0JCQl9OwotCQkJCi0JCQlncm91cGluZyh0aGlzLCByZXQsIGNoaWxkcmVuLCBncm91cGluZ0hlbHBlcik7Ci0JCQkJCQotCQkJYWRkUmVmZXJlbmNlcyhmZWF0dXJlLAotCQkJCQllbGVtZW50WG1sLCAiUHJhY3RpY2UgZ3VpZGFuY2UgdHJlZSIsIHJldCk7IC8vJE5PTi1OTFMtMSQKLQkJCQotCQkJaWYgKHdwU2xvdElucHV0cyAhPSBudWxsKSB7Ci0JCQkJYWRkUmVmZXJlbmNlcyhmZWF0dXJlLAotCQkJCQllbGVtZW50WG1sLCAiSW5wdXQgd29yayBwcm9kdWN0IHNsb3RzIiwgd3BTbG90SW5wdXRzKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCi0JCX0KLQotCQlyZXR1cm4gZWxlbWVudFhtbDsKLQl9Ci0KLQlwcml2YXRlIExpc3Q8V29ya1Byb2R1Y3Q+IGdldElucHV0V3BTbG90cyhMaXN0PE1ldGhvZEVsZW1lbnQ+IGVsZW1lbnRzKSB7Ci0JCVNldDxXb3JrUHJvZHVjdD4gc2xvdHMgPSBuZXcgSGFzaFNldDxXb3JrUHJvZHVjdD4oKTsKLQkJZm9yIChNZXRob2RFbGVtZW50IGVsZW06IGVsZW1lbnRzKSB7Ci0JCQlpZiAoZWxlbSBpbnN0YW5jZW9mIFRhc2spIHsKLQkJCQlUYXNrIHRhc2sgPSAoVGFzaykgZWxlbTsKLQkJCQlmb3IgKFdvcmtQcm9kdWN0IHdwOiB0YXNrLmdldE1hbmRhdG9yeUlucHV0KCkpIHsKLQkJCQkJaWYgKHdwLmdldElzQWJzdHJhY3QoKSkgewotCQkJCQkJc2xvdHMuYWRkKHdwKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlmb3IgKFdvcmtQcm9kdWN0IHdwOiB0YXNrLmdldE9wdGlvbmFsSW5wdXQoKSkgewotCQkJCQlpZiAod3AuZ2V0SXNBYnN0cmFjdCgpKSB7Ci0JCQkJCQlzbG90cy5hZGQod3ApOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmIChzbG90cy5pc0VtcHR5KCkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJTGlzdDxXb3JrUHJvZHVjdD4gd3BTbG90SW5wdXRzID0gbmV3IEFycmF5TGlzdDxXb3JrUHJvZHVjdD4oKTsKLQkJd3BTbG90SW5wdXRzLmFkZEFsbChzbG90cyk7Ci0JCQotCQlpZiAod3BTbG90SW5wdXRzLnNpemUoKSA+IDEpIHsKLQkJCUNvbXBhcmF0b3IgY29tcGFyYXRvciA9IFByZXNlbnRhdGlvbkNvbnRleHQuSU5TVEFOQ0UuZ2V0UHJlc05hbWVDb21wYXJhdG9yKCk7Ci0JCQlDb2xsZWN0aW9ucy48V29ya1Byb2R1Y3Q+c29ydCh3cFNsb3RJbnB1dHMsIGNvbXBhcmF0b3IpOwotCQl9Ci0JCQotCQlyZXR1cm4gd3BTbG90SW5wdXRzOwotCX0KLQkKLQlwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHRGZWF0dXJlVmFsdWUoRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIE9iamVjdCB2YWx1ZSkgewotCQlpZiAoZmVhdHVyZS5pc01hbnkoKSkgewotCQkJLy9yZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmFjY2VwdEZlYXR1cmVWYWx1ZShmZWF0dXJlLCB2YWx1ZSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGdyb3VwaW5nKE9iamVjdCBwYXJlbnRPYmplY3QsIExpc3QgcmV0LCBDb2xsZWN0aW9uIGNoaWxkcmVuLCAKLQkJCVByYWN0aWNlSXRlbVByb3ZpZGVyLkdyb3VwaW5nSGVscGVyIGdyb3VwaW5nSGVscGVyKSB7Ci0JCU1hcDxTdHJpbmcsIExpc3Q+IG1hcCA9IFByYWN0aWNlSXRlbVByb3ZpZGVyLmdldFN1Ykdyb3VwTWFwKGNoaWxkcmVuLCBncm91cGluZ0hlbHBlcik7Ci0JCQotCQlib29sZWFuIHRvU29ydCA9IHRydWU7Ci0JCWlmIChwYXJlbnRPYmplY3QgaW5zdGFuY2VvZiBQcmFjdGljZUxheW91dCkgewotCQkJTWV0aG9kRWxlbWVudCBlbGVtID0gKChQcmFjdGljZUxheW91dCkgcGFyZW50T2JqZWN0KS5lbGVtZW50OwotCQkJaWYgKGVsZW0gIT0gbnVsbCkgewotCQkJCXRvU29ydCA9ICEgQ2F0ZWdvcnlTb3J0SGVscGVyLmlzTWFudWFsQ2F0ZWdvcnlTb3J0KGVsZW0pOwotCQkJfQotCQl9Ci0JCVN0cmluZ1tdIGtleXMgPSBncm91cGluZ0hlbHBlci5nZXRLZXlzSW5PcmRlcigpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHsKLQkJCVN0cmluZyBrZXkgPSBrZXlzW2ldOwotCQkJTGlzdCBzdWJncm91cENoaWxkcmVuID0gbWFwLmdldChrZXkpOwotCQkJaWYgKHN1Ymdyb3VwQ2hpbGRyZW4gPT0gbnVsbCB8fCBzdWJncm91cENoaWxkcmVuLmlzRW1wdHkoKSkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJaWYgKGdyb3VwaW5nSGVscGVyLnRvR3JvdXAoa2V5LCBzdWJncm91cENoaWxkcmVuKSkgewotCQkJCXN1Ymdyb3VwQ2hpbGRyZW4gPSBncm91cGluZ0hlbHBlci5uZXN0ZWRHcm91cGluZyhwYXJlbnRPYmplY3QsIGtleSwgc3ViZ3JvdXBDaGlsZHJlbik7Ci0JCQkJU3ViR3JvdXBWYWx1ZSBzdWJHcm91cFZhbHVlID0gbmV3IFN1Ykdyb3VwVmFsdWUoa2V5LCBzdWJncm91cENoaWxkcmVuKTsKLQkJCQlyZXQuYWRkKHN1Ykdyb3VwVmFsdWUpOwotCQkJfSBlbHNlIHsKLQkJCQlpZiAodG9Tb3J0KSB7Ci0JCQkJCVByYWN0aWNlSXRlbVByb3ZpZGVyLnNvcnQoc3ViZ3JvdXBDaGlsZHJlbik7Ci0JCQkJfQotCQkJCXJldC5hZGRBbGwoc3ViZ3JvdXBDaGlsZHJlbik7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc05vbk1ldGhvZEVsZW1lbnRJblByb2Nlc3NDaGlsZCgKLQkJCU9iamVjdCBub25NZXRob2RFbGVtZW50Q2hpbGQsIE9iamVjdCBmZWF0dXJlLCBYbWxFbGVtZW50IHBhcmVudCwKLQkJCWJvb2xlYW4gaW5jbHVkZVJlZmVyZW5jZXMpIHsKLQkJCi0JCWlmIChub25NZXRob2RFbGVtZW50Q2hpbGQgaW5zdGFuY2VvZiBTdWJHcm91cFZhbHVlKSB7Ci0JCQlTdWJHcm91cFZhbHVlIHN1Ykdyb3VwVmFsdWUgPSAoU3ViR3JvdXBWYWx1ZSkgbm9uTWV0aG9kRWxlbWVudENoaWxkOwotCQkJU3RyaW5nIGtleSA9IHN1Ykdyb3VwVmFsdWUua2V5OwotCQkJTGlzdCBsaXN0VmFsdWUgPSBzdWJHcm91cFZhbHVlLmxpc3RWYWx1ZTsKLQkJCWFkZFJlZmVyZW5jZXMoZmVhdHVyZSwKLQkJCQlwYXJlbnQsIGtleSwgbGlzdFZhbHVlKTsgCi0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0RmVhdHVyZVZhbHVlKE9wcG9zaXRlRmVhdHVyZSBmZWF0dXJlLCBPYmplY3QgdmFsdWUpIHsKLS8qCQlpZiAoIGZlYXR1cmUgPT0gQXNzb2NpYXRpb25IZWxwZXIuRGVzY3JpYmFibGVFbGVtZW50X0N1c3RvbUNhdGVnb3JpZXMpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ki8JCQkKLQkJcmV0dXJuIHN1cGVyLmFjY2VwdEZlYXR1cmVWYWx1ZShmZWF0dXJlLCB2YWx1ZSk7Ci0JfQotCi0Jc3RhdGljIGNsYXNzIFN1Ykdyb3VwVmFsdWUgewotCQlwdWJsaWMgU3RyaW5nIGtleTsKLQkJcHVibGljIExpc3QgbGlzdFZhbHVlOwotCQkKLQkJcHVibGljIFN1Ykdyb3VwVmFsdWUoU3RyaW5nIGtleSwgTGlzdCBsaXN0VmFsdWUpIHsKLQkJCXRoaXMua2V5ID0ga2V5OwotCQkJdGhpcy5saXN0VmFsdWUgPSBsaXN0VmFsdWU7Ci0JCX0KLQl9Ci0KLQkKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZWxlbWVudHMvUHJvY2Vzc0VsZW1lbnRJdGVtLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L2VsZW1lbnRzL1Byb2Nlc3NFbGVtZW50SXRlbS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZDI5OTM1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZWxlbWVudHMvUHJvY2Vzc0VsZW1lbnRJdGVtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuZWxlbWVudHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuRWxlbWVudExheW91dE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotCi0KLS8qKgotICogc2ltcGxlIGhvbGRlciBvZiBwcm9jZXNzIGVsZW1lbnQgaXRlbSBpbmZvCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9jZXNzRWxlbWVudEl0ZW0gewotCQotCXB1YmxpYyBPYmplY3QgcmF3SXRlbSA9IG51bGw7Ci0JcHVibGljIE1ldGhvZEVsZW1lbnQgZWxlbWVudCA9IG51bGw7Ci0JcHVibGljIFN0cmluZyBwYXRoID0gbnVsbDsKLQlwdWJsaWMgU3RyaW5nIHByb2NfZ3VpZCA9IG51bGw7Ci0JCi0JcHVibGljIFByb2Nlc3NFbGVtZW50SXRlbShPYmplY3QgcmF3SXRlbSwgTWV0aG9kRWxlbWVudCBlbGVtZW50LCBTdHJpbmcgcGF0aCkKLQl7Ci0JCXRoaXMucmF3SXRlbSA9IHJhd0l0ZW07Ci0JCXRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7Ci0JCXRoaXMucGF0aCA9IHBhdGg7Ci0JCXRoaXMucHJvY19ndWlkID0gQWJzdHJhY3RQcm9jZXNzRWxlbWVudExheW91dC5nZXRPd25pbmdQcm9jZXNzR3VpZEZyb21QYXRoKHBhdGgpOwotCX0KLQkKLQlwdWJsaWMgUHJvY2Vzc0VsZW1lbnRJdGVtKE9iamVjdCByYXdJdGVtLCBNZXRob2RFbGVtZW50IGVsZW1lbnQsIFByb2Nlc3NFbGVtZW50SXRlbSBwYXJlbnQpCi0JewotCQl0aGlzLnJhd0l0ZW0gPSByYXdJdGVtOwotCQl0aGlzLmVsZW1lbnQgPSBlbGVtZW50OwotCQl0aGlzLnBhdGggPSBBYnN0cmFjdFByb2Nlc3NFbGVtZW50TGF5b3V0Lm1ha2VQYXRoKHBhcmVudC5wYXRoLCB0aGlzLmVsZW1lbnQpOyAvLyBtYWtlIHBhdGggaGVyZQotCQl0aGlzLnByb2NfZ3VpZCA9IHBhcmVudC5wcm9jX2d1aWQ7CQkKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFF1ZXJ5U3RyaW5nKCkKLQl7Ci0JCXJldHVybiBFbGVtZW50TGF5b3V0TWFuYWdlci5nZXRRdWVyeVN0cmluZyhwcm9jX2d1aWQsIHBhdGgpOwkJCi0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9lbGVtZW50cy9Qcm9jZXNzTGF5b3V0LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L2VsZW1lbnRzL1Byb2Nlc3NMYXlvdXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGI1ZDgwNy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L2VsZW1lbnRzL1Byb2Nlc3NMYXlvdXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuZWxlbWVudHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlZEFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5FbGVtZW50TGF5b3V0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuSUVsZW1lbnRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LnV0aWwuWG1sRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLkxpYnJhcnlVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotCi0KLS8qKgotICogVGhlIGVsZW1lbnQgbGF5b3V0IGZvciBhIFJvbGUuCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFByb2Nlc3NMYXlvdXQgZXh0ZW5kcyBBYnN0cmFjdEVsZW1lbnRMYXlvdXQgewotCi0JcHVibGljIFByb2Nlc3NMYXlvdXQoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdChFbGVtZW50TGF5b3V0TWFuYWdlciBsYXlvdXRNYW5hZ2VyLCBNZXRob2RFbGVtZW50IGVsZW1lbnQpIHsKLQkJc3VwZXIuX19pbml0KGxheW91dE1hbmFnZXIsIGVsZW1lbnQpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LklFbGVtZW50TGF5b3V0I2dldFhtbEVsZW1lbnQoYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgWG1sRWxlbWVudCBnZXRYbWxFbGVtZW50KGJvb2xlYW4gaW5jbHVkZVJlZmVyZW5jZXMpIHsKLQkJWG1sRWxlbWVudCBlbGVtZW50WG1sID0gc3VwZXIuZ2V0WG1sRWxlbWVudCgpOwotCi0JCWlmICghaW5jbHVkZVJlZmVyZW5jZXMpIHsKLQkJCXJldHVybiBlbGVtZW50WG1sOwotCQl9Ci0KLQkJLy8gYnVpbGQgdGhlIGJyZWFrZG93biBzdHJ1Y3R1cmUgdHJlZQotCQlYbWxFbGVtZW50IGJzID0gZWxlbWVudFhtbAotCQkJCS5uZXdDaGlsZCgiYnJlYWtkb3duIikuc2V0QXR0cmlidXRlKCJuYW1lIiwgIldvcmsgQnJlYWtkb3duIFN0cnVjdHVyZSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQlDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5ID0gVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkuZ2V0V0JTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKTsKLQkJaXRlcmF0ZShzdXBlci5lbGVtZW50LCBicywgYWRhcHRlckZhY3RvcnkpOwotCi0JCWJzID0gZWxlbWVudFhtbAotCQkJCS5uZXdDaGlsZCgiYnJlYWtkb3duIikuc2V0QXR0cmlidXRlKCJuYW1lIiwgIlRlYW0gQnJlYWtkb3duIFN0cnVjdHVyZSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQlhZGFwdGVyRmFjdG9yeSA9IFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJLmdldE9CU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCk7Ci0JCWl0ZXJhdGUoc3VwZXIuZWxlbWVudCwgYnMsIGFkYXB0ZXJGYWN0b3J5KTsKLQotCQlicyA9IGVsZW1lbnRYbWwKLQkJCQkubmV3Q2hpbGQoImJyZWFrZG93biIpLnNldEF0dHJpYnV0ZSgibmFtZSIsICJXb3JrIFByb2R1Y3QgQnJlYWtkb3duIFN0cnVjdHVyZSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQlhZGFwdGVyRmFjdG9yeSA9IFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJLmdldFBCU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCk7Ci0JCWl0ZXJhdGUoc3VwZXIuZWxlbWVudCwgYnMsIGFkYXB0ZXJGYWN0b3J5KTsKLQotCQlyZXR1cm4gZWxlbWVudFhtbDsKLQl9Ci0KLQkvKioKLQkgKiBpdGVyYXRlIHRoZSBicmVhayBkb3duIHN0cnVjdHVyZSBhbmQgYnVpbGQgdGhlIHhtbCBkb2N1bWVudAotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnRPYmoKLQkgKiBAcGFyYW0gcGFyZW50WG1sCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICovCi0JcHJpdmF0ZSB2b2lkIGl0ZXJhdGUoT2JqZWN0IHBhcmVudE9iaiwgWG1sRWxlbWVudCBwYXJlbnRYbWwsCi0JCQlDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciBwcm92aWRlciA9IChJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIpIGFkYXB0ZXJGYWN0b3J5Ci0JCQkJLmFkYXB0KHBhcmVudE9iaiwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJLy8gRWl0aGVyIGRlbGVnYXRlIHRoZSBjYWxsIG9yIHJldHVybiBub3RoaW5nLgotCQlpZiAocHJvdmlkZXIgIT0gbnVsbCkgewotCQkJQ29sbGVjdGlvbiBpdGVtcyA9IHByb3ZpZGVyLmdldENoaWxkcmVuKHBhcmVudE9iaik7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gaXRlbXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCU1ldGhvZEVsZW1lbnQgaXRlbSA9IChNZXRob2RFbGVtZW50KSBMaWJyYXJ5VXRpbC51bndyYXAoaXQKLQkJCQkJCS5uZXh0KCkpOwotCQkJCS8vIHN1cGVyLnByb2Nlc3NDaGlsZChwYXJlbnRYbWwsIGl0ZW0sIGZhbHNlKTsKLQkJCQlJRWxlbWVudExheW91dCBsID0gbGF5b3V0TWFuYWdlci5nZXRMYXlvdXQoaXRlbSwgdHJ1ZSk7Ci0JCQkJaWYgKGwgIT0gbnVsbCkgewotCQkJCQlYbWxFbGVtZW50IGNoaWxkID0gbC5nZXRYbWxFbGVtZW50KGZhbHNlKTsKLQkJCQkJcGFyZW50WG1sLmFkZENoaWxkKGNoaWxkKTsKLQotCQkJCQkvLyBpbmV0ZXJhdGUgY2hpbGRyZW4KLQkJCQkJaWYgKGl0ZW0gaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCQkJaXRlcmF0ZShpdGVtLCBjaGlsZCwgYWRhcHRlckZhY3RvcnkpOwotCQkJCQl9Ci0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZWxlbWVudHMvUHJvY2Vzc0xheW91dERhdGEuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZWxlbWVudHMvUHJvY2Vzc0xheW91dERhdGEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGY2ODM1Ny4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L2VsZW1lbnRzL1Byb2Nlc3NMYXlvdXREYXRhLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LmVsZW1lbnRzOwotCi1pbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuUmVzb3VyY2VIZWxwZXI7Ci0KLS8qKgotICogCi0gKiBjbGFzcyB0byBob2xkIHByb2Nlc3Mgc3BlY2lmaWMgbGF5b3V0IGRhdGEgZm9yIGVhY2ggYWN0aXZpdHkKLSAqIHRoZSBkYXRhIHdpbGwgYmUgd3JpdGUgb3V0IHRvIGEgamF2YXNjcmlwdCBtYXAgCi0gKiBzbyB0aGF0IGFjdGl2aXR5IGxheW91dCBpbiB0aGUgcHVibGlzaGVkIHNpdGUgY2FuIGdldCB0aGUgc3RhdHVzIGR5bmFtaWNhbGx5LgotICoKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9jZXNzTGF5b3V0RGF0YSB7Ci0KLQlNYXAgYWN0aXZpdHlNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQotCS8qKgotCSAqIGNvbnN0cnVjdG9yCi0JICogQHBhcmFtIHByb2NfZ3VpZAotCSAqLwotCXB1YmxpYyBQcm9jZXNzTGF5b3V0RGF0YShTdHJpbmcgcHJvY19ndWlkKQotCXsKLQl9Ci0JCi0JLyoqCi0JICogY2hlY2sgaWYgaXQgY29udGFpbnMgdGhlIGFjdGl2aXR5IGxheW91dCBvZiB0aGUgc3BlY2lmaWVkIHBhdGgKLQkgKiBAcGFyYW0gYWN0aXZpdHlfcGF0aCBTdHJpbmcKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNBY3Rpdml0eUxheW91dChTdHJpbmcgYWN0aXZpdHlfcGF0aCkKLQl7Ci0JCXJldHVybiBhY3Rpdml0eU1hcC5jb250YWluc0tleShhY3Rpdml0eV9wYXRoKTsKLQl9Ci0JCi0JLyoqCi0JICogY3JlYXRlIGFuIEFjdGl2aXR5TGF5b3V0RGF0YSBmb3IgdGhlIGFjdGl2aXR5IHBhdGgKLQkgKiBAcGFyYW0gYWN0aXZpdHlfcGF0aCBTdHJpbmcKLQkgKiBAcmV0dXJuIEFjdGl2aXR5TGF5b3V0RGF0YQotCSAqLwotCXB1YmxpYyBBY3Rpdml0eUxheW91dERhdGEgY3JlYXRlQWN0aXZpdHlMYXVvdXREYXRhKFN0cmluZyBhY3Rpdml0eV9wYXRoKQotCXsKLQkJQWN0aXZpdHlMYXlvdXREYXRhIGRhdGEgPSAoQWN0aXZpdHlMYXlvdXREYXRhKWFjdGl2aXR5TWFwLmdldChhY3Rpdml0eV9wYXRoKTsKLQkJaWYgKCBkYXRhID09IG51bGwgKQotCQl7Ci0JCQlkYXRhID0gbmV3IEFjdGl2aXR5TGF5b3V0RGF0YSh0aGlzLCBhY3Rpdml0eV9wYXRoKTsKLQkJCWFjdGl2aXR5TWFwLnB1dChhY3Rpdml0eV9wYXRoLCBkYXRhKTsKLQkJfQotCQkKLQkJcmV0dXJuIGRhdGE7Ci0JfQotCQotCS8qKgotCSAqIGdldCBhIG1hcCBvZiB0aGUgYWN0aXZpdHkgbGF5b3V0IGRhdGEKLQkgKiBAcmV0dXJuIE1hcAotCSAqLwotCXB1YmxpYyBNYXAgZ2V0QWN0aXZpdHlMYXlvdXREYXRhTWFwKCkKLQl7Ci0JCXJldHVybiBhY3Rpdml0eU1hcDsKLQl9Ci0JCi0JLyoqCi0JICogcHJpbnQgdGhlIGluZm8gdG8gYSBqYXZhc2NyaXB0IGZpbGUgaW4gdGhlIHB1Ymxpc2hlZCBzaXRlLiAKLQkgKiBUaGVzZSBpbmZvcm1hdGlvbiB3aWxsIGJlIHVzZWQgdG8gZGV0ZXJtaW5lIHRoZSBsYXlvdXQgb2YgcHJvY2VzcyBlbGVtZW50cy4KLQkgKiBAcGFyYW0gcHMgUHJpbnRXcml0ZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCBwcmludChQcmludFdyaXRlciBwcykKLQl7Ci0JCWZvciAoIEl0ZXJhdG9yIGl0ID0gYWN0aXZpdHlNYXAuZW50cnlTZXQoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7ICkKLQkJewotCQkJTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSlpdC5uZXh0KCk7Ci0JCQlTdHJpbmcgYWN0aXZpdHlfcGF0aCA9IChTdHJpbmcpZW50cnkuZ2V0S2V5KCk7Ci0JCQlBY3Rpdml0eUxheW91dERhdGEgZGF0YSA9IChBY3Rpdml0eUxheW91dERhdGEpZW50cnkuZ2V0VmFsdWUoKTsKLQkJCWlmICggZGF0YS5hZF9pbWdfcGF0aCAhPSBudWxsICkKLQkJCXsKLQkJCQlTdHJpbmcga2V5ID0gYWN0aXZpdHlfcGF0aCArIFJlc291cmNlSGVscGVyLkRJQUdSQU1fVFlQRV9XT1JLRkxPVzsKLQkJCQlwcmludEltZ0ZpbGUocHMsIGtleSwgZGF0YS5hZF9pbWdfcGF0aCk7Ci0JCQl9Ci0JCQkKLQkJCWlmICggZGF0YS5hZGRfaW1nX3BhdGggIT0gbnVsbCApCi0JCQl7Ci0JCQkJU3RyaW5nIGtleSA9IGFjdGl2aXR5X3BhdGggKyBSZXNvdXJjZUhlbHBlci5ESUFHUkFNX1RZUEVfQUNUSVZJVFlfREVUQUlMOwotCQkJCXByaW50SW1nRmlsZShwcywga2V5LCBkYXRhLmFkZF9pbWdfcGF0aCk7Ci0JCQl9Ci0JCQkKLQkJCWlmICggZGF0YS53cGRfaW1nX3BhdGggIT0gbnVsbCApCi0JCQl7Ci0JCQkJU3RyaW5nIGtleSA9IGFjdGl2aXR5X3BhdGggKyBSZXNvdXJjZUhlbHBlci5ESUFHUkFNX1RZUEVfV1BfREVQRU5ERU5DWTsKLQkJCQlwcmludEltZ0ZpbGUocHMsIGtleSwgZGF0YS53cGRfaW1nX3BhdGgpOwotCQkJfQotCi0JCQlpZiAoIGRhdGEuZ2V0U3VwcHJlc3NlZEl0ZW1zKCkuc2l6ZSgpID4gMCApCi0JCQl7Ci0JCQkJZm9yICggSXRlcmF0b3IgaXQyID0gZGF0YS5nZXRTdXBwcmVzc2VkSXRlbXMoKS5pdGVyYXRvcigpOyBpdDIuaGFzTmV4dCgpOyApCi0JCQkJewotCQkJCQlTdHJpbmcgcmVsUGF0aCA9IChTdHJpbmcpaXQyLm5leHQoKTsKLQkJCQkJU3RyaW5nIGtleSA9IGFjdGl2aXR5X3BhdGggKyByZWxQYXRoOwotCQkJCQlwcmludFN1cHByZXNzZWRJdGVtKHBzLCBrZXkpOwotCQkJCX0KLQkJCX0JCQkKLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgcHJpbnRJbWdGaWxlKFByaW50V3JpdGVyIHBzLCBTdHJpbmcga2V5LCBTdHJpbmcgZmlsZU5hbWUpCi0JewotCQlTdHJpbmcgbGluZSA9ICJjb250ZW50UGFnZS5wcm9jZXNzUGFnZS5pbWFnZUZpbGVzW1wiIiArIGtleSArICJcIl09XCIiICsgZmlsZU5hbWUgKyAiXCIiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQlwcy5wcmludGxuKGxpbmUpOwotCQkvL1N5c3RlbS5vdXQucHJpbnRsbihsaW5lKTsKLQkJCi0JfQotCQotCXByaXZhdGUgdm9pZCBwcmludFN1cHByZXNzZWRJdGVtKFByaW50V3JpdGVyIHBzLCBTdHJpbmcga2V5KQotCXsKLQkJU3RyaW5nIGxpbmUgPSAiY29udGVudFBhZ2UucHJvY2Vzc1BhZ2Uuc3VwcHJlc3NlZEl0ZW1zW1wiIiArIGtleSArICJcIl09dHJ1ZSI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlwcy5wcmludGxuKGxpbmUpOwkKLQkJLy9TeXN0ZW0ub3V0LnByaW50bG4obGluZSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGNsZWFyKCkgewotCQlhY3Rpdml0eU1hcC5jbGVhcigpOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZWxlbWVudHMvUmVwb3J0TGF5b3V0LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L2VsZW1lbnRzL1JlcG9ydExheW91dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYTk5ZTYyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZWxlbWVudHMvUmVwb3J0TGF5b3V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuZWxlbWVudHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuRWxlbWVudExheW91dE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LnV0aWwuWG1sRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkFzc29jaWF0aW9uSGVscGVyOwotCi0KLS8qKgotICogVGhlIGVsZW1lbnQgbGF5b3V0IGZvciBhIFJlcG9ydC4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUmVwb3J0TGF5b3V0IGV4dGVuZHMgQWJzdHJhY3RFbGVtZW50TGF5b3V0IHsKLQotCXB1YmxpYyBSZXBvcnRMYXlvdXQoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdChFbGVtZW50TGF5b3V0TWFuYWdlciBsYXlvdXRNYW5hZ2VyLCBNZXRob2RFbGVtZW50IGVsZW1lbnQpIHsKLQkJc3VwZXIuX19pbml0KGxheW91dE1hbmFnZXIsIGVsZW1lbnQpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LklFbGVtZW50TGF5b3V0I2dldFhtbEVsZW1lbnQoYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgWG1sRWxlbWVudCBnZXRYbWxFbGVtZW50KGJvb2xlYW4gaW5jbHVkZVJlZmVyZW5jZXMpIHsKLQkJWG1sRWxlbWVudCBlbGVtZW50WG1sID0gc3VwZXIuZ2V0WG1sRWxlbWVudChpbmNsdWRlUmVmZXJlbmNlcyk7Ci0KLQkJaWYgKGluY2x1ZGVSZWZlcmVuY2VzKSB7Ci0JCQlMaXN0IGNvbnRlbnRFbGVtZW50cyA9IENvbmZpZ3VyYXRpb25IZWxwZXIuY2FsYzBuRmVhdHVyZVZhbHVlKHN1cGVyLmVsZW1lbnQsCi0JCQkJCUFzc29jaWF0aW9uSGVscGVyLlJlcG9ydF9Xb3JrUHJvZHVjdHMsIGxheW91dE1hbmFnZXIKLQkJCQkJCQkuZ2V0RWxlbWVudFJlYWxpemVyKCkpOwotCQkJYWRkUmVmZXJlbmNlcyhBc3NvY2lhdGlvbkhlbHBlci5SZXBvcnRfV29ya1Byb2R1Y3RzLCBlbGVtZW50WG1sLCAiY29udGVudEVsZW1lbnRzIiwgY29udGVudEVsZW1lbnRzKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJcmV0dXJuIGVsZW1lbnRYbWw7Ci0JfQotCi0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZWxlbWVudHMvUmV1c2FibGVBc3NldExheW91dC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9lbGVtZW50cy9SZXVzYWJsZUFzc2V0TGF5b3V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4MDdkZDguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9lbGVtZW50cy9SZXVzYWJsZUFzc2V0TGF5b3V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LmVsZW1lbnRzOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5yZWdleC5NYXRjaGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLkZpbGVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuRWxlbWVudExheW91dE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LnV0aWwuWG1sRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLlJlc291cmNlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3VpZGFuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQXNzb2NpYXRpb25IZWxwZXI7Ci0KLQotLyoqCi0gKiBUaGUgZWxlbWVudCBsYXlvdXQgZm9yIGEgUmV1c2FibGUgQXNzZXQuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFJldXNhYmxlQXNzZXRMYXlvdXQgZXh0ZW5kcyBBYnN0cmFjdEVsZW1lbnRMYXlvdXQgewotCi0JcHVibGljIFJldXNhYmxlQXNzZXRMYXlvdXQoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdChFbGVtZW50TGF5b3V0TWFuYWdlciBsYXlvdXRNYW5hZ2VyLCBNZXRob2RFbGVtZW50IGVsZW1lbnQpIHsKLQkJc3VwZXIuX19pbml0KGxheW91dE1hbmFnZXIsIGVsZW1lbnQpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LklFbGVtZW50TGF5b3V0I2dldFhtbEVsZW1lbnQoYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgWG1sRWxlbWVudCBnZXRYbWxFbGVtZW50KGJvb2xlYW4gaW5jbHVkZVJlZmVyZW5jZXMpIHsKLQkJWG1sRWxlbWVudCBlbGVtZW50WG1sID0gc3VwZXIuZ2V0WG1sRWxlbWVudChpbmNsdWRlUmVmZXJlbmNlcyk7Ci0KLQkJaWYgKGluY2x1ZGVSZWZlcmVuY2VzKSB7Ci0JCQlMaXN0IGNvbnRlbnRFbGVtZW50cyA9IENvbmZpZ3VyYXRpb25IZWxwZXIuY2FsYzBuRmVhdHVyZVZhbHVlKHN1cGVyLmVsZW1lbnQsCi0JCQkJCUFzc29jaWF0aW9uSGVscGVyLlJldXNhYmxlQXNzZXRfQ29udGVudEVsZW1lbnRzLAotCQkJCQlsYXlvdXRNYW5hZ2VyLmdldEVsZW1lbnRSZWFsaXplcigpKTsKLQkJCQotCQkJTGlzdCBhY3Rpdml0aWVzID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMG5GZWF0dXJlVmFsdWUoc3VwZXIuZWxlbWVudCwKLQkJCQkJQXNzb2NpYXRpb25IZWxwZXIuUmV1c2FibGVBc3NldF9CcmVha2Rvd25FbGVtZW50cywgbGF5b3V0TWFuYWdlcgotCQkJCQkJCS5nZXRFbGVtZW50UmVhbGl6ZXIoKSk7Ci0KLQkJCWNvbnRlbnRFbGVtZW50cy5hZGRBbGwoYWN0aXZpdGllcyk7Ci0KLQkJCWFkZFJlZmVyZW5jZXMoQXNzb2NpYXRpb25IZWxwZXIuUmV1c2FibGVBc3NldF9Db250ZW50RWxlbWVudHMsIGVsZW1lbnRYbWwsICJjb250ZW50RWxlbWVudHMiLCBjb250ZW50RWxlbWVudHMpOyAvLyROT04tTkxTLTEkCi0KLQkJCUd1aWRhbmNlIGd1aWRhbmNlID0gKEd1aWRhbmNlKSBzdXBlci5lbGVtZW50OwotCQkJQ29udGVudERlc2NyaXB0aW9uIGNvbnRlbnQgPSAoQ29udGVudERlc2NyaXB0aW9uKSBndWlkYW5jZQotCQkJCQkuZ2V0UHJlc2VudGF0aW9uKCk7Ci0JCQlpZiAoY29udGVudCAhPSBudWxsKSB7Ci0JCQkJCi0JCQkJLy8gQXV0aG9yaW5nOiAgVGVtcGxhdGUgYXR0YWNobWVudHMgb2YgYSBjb250cmlidXRpbmcgdGVtcGxhdGUgZ3VpZGFuY2UgZWxlbWVudCBhcmUgbm90IGFwcGVuZGVkIHRvIHRoZSBiYXNlIGxpc3Qgb2YgYXR0YWNobWVudHMJCQkJCi0JCQkJLy9TdHJpbmcgYXR0YWNobWVudFN0cmluZyA9ICgob3JnLmVjbGlwc2UuZXBmLnVtYS5HdWlkYW5jZURlc2NyaXB0aW9uKWNvbnRlbnQpLmdldEF0dGFjaG1lbnRzKCk7Ci0JCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRHdWlkYW5jZURlc2NyaXB0aW9uX0F0dGFjaG1lbnRzKCk7Ci0JCQkJU3RyaW5nIGF0dGFjaG1lbnRTdHJpbmcgPSAoU3RyaW5nKUNvbmZpZ3VyYXRpb25IZWxwZXIuY2FsY0F0dHJpYnV0ZUZlYXR1cmVWYWx1ZShjb250ZW50LCBzdXBlci5lbGVtZW50LCBmZWF0dXJlLCBzdXBlci5sYXlvdXRNYW5hZ2VyLmdldENvbmZpZ3VyYXRpb24oKSk7Ci0JCQkJaWYgKCAoYXR0YWNobWVudFN0cmluZyAhPSBudWxsKSAmJiAoYXR0YWNobWVudFN0cmluZy5pbmRleE9mKENvbmZpZ3VyYXRpb25IZWxwZXIuQVRUUklCVVRFX1ZBTFVFX1NFUEVSQVRPUikgPiAwKSApCi0JCQkJewotCQkJCQlhdHRhY2htZW50U3RyaW5nID0gYXR0YWNobWVudFN0cmluZy5yZXBsYWNlQWxsKENvbmZpZ3VyYXRpb25IZWxwZXIuQVRUUklCVVRFX1ZBTFVFX1NFUEVSQVRPUiwgVG5nVXRpbC5HVUlEQU5DRV9GSUxFU1RSSU5HX1NFUEFSQVRPUik7IAotCQkJCX0KLQkJCQlMaXN0IGF0dGFjaG1lbnRMaXN0ID0gVG5nVXRpbC5jb252ZXJ0R3VpZGFuY2VBdHRhY2htZW50c1RvTGlzdChhdHRhY2htZW50U3RyaW5nKTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBhdHRhY2htZW50TGlzdC5pdGVyYXRvcigpO2l0ZXIuaGFzTmV4dCgpOykgewotCQkJCQlTdHJpbmcgYXR0YWNobWVudEZpbGUgPSAoU3RyaW5nKSBpdGVyLm5leHQoKTsKLQkJCQkJaWYgKGF0dGFjaG1lbnRGaWxlICE9IG51bGwpIHsKLQkJCQkJCU1hdGNoZXIgbSA9IFJlc291cmNlSGVscGVyLnBfdGVtcGxhdGVfYXR0YWNobWVudF91cmwubWF0Y2hlcihhdHRhY2htZW50RmlsZSk7Ci0JCQkJCQlpZiAoIW0uZmluZCgpKSB7Ci0JCQkJCQkJU3RyaW5nIGZpbGVOYW1lID0gRmlsZVV0aWwuZ2V0RmlsZU5hbWUoYXR0YWNobWVudEZpbGUpOwotCQkJCQkJCWVsZW1lbnRYbWwubmV3Q2hpbGQoImF0dHJpYnV0ZSIpLnNldEF0dHJpYnV0ZSgibmFtZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJCQkJImF0dGFjaGVkRmlsZSIpLnNldEF0dHJpYnV0ZSggLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJInVybCIsICJmaWxlOi8vIiArIGF0dGFjaG1lbnRGaWxlKSAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgCi0JCQkJCQkJCQkuc2V0QXR0cmlidXRlKCJmaWxlTmFtZSIsIGZpbGVOYW1lKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlTdHJpbmcgZmlsZU5hbWUgPSBtLmdyb3VwKDIpOwotCQkJCQkJCWVsZW1lbnRYbWwubmV3Q2hpbGQoImF0dHJpYnV0ZSIpLnNldEF0dHJpYnV0ZSgibmFtZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJCQkJImF0dGFjaGVkRmlsZSIpLnNldEF0dHJpYnV0ZSggLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJInVybCIsIG0uZ3JvdXAoMSkpIC8vJE5PTi1OTFMtMSQgCi0JCQkJCQkJCQkuc2V0QXR0cmlidXRlKCJmaWxlTmFtZSIsIGZpbGVOYW1lKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotfQotCi0JCXJldHVybiBlbGVtZW50WG1sOwotCX0KLQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L2VsZW1lbnRzL1JvYWRtYXBMYXlvdXQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZWxlbWVudHMvUm9hZG1hcExheW91dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Y2EyZTQ5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZWxlbWVudHMvUm9hZG1hcExheW91dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LmVsZW1lbnRzOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LkVsZW1lbnRMYXlvdXRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC51dGlsLlhtbEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5Bc3NvY2lhdGlvbkhlbHBlcjsKLQotCi0vKioKLSAqIFRoZSBlbGVtZW50IGxheW91dCBmb3IgYSBSb2FkbWFwLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBSb2FkbWFwTGF5b3V0IGV4dGVuZHMgQWJzdHJhY3RFbGVtZW50TGF5b3V0IHsKLQotCXB1YmxpYyBSb2FkbWFwTGF5b3V0KCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXQoRWxlbWVudExheW91dE1hbmFnZXIgbGF5b3V0TWFuYWdlciwgTWV0aG9kRWxlbWVudCBlbGVtZW50KSB7Ci0JCXN1cGVyLl9faW5pdChsYXlvdXRNYW5hZ2VyLCBlbGVtZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5JRWxlbWVudExheW91dCNnZXRYbWxFbGVtZW50KGJvb2xlYW4pCi0JICovCi0JcHVibGljIFhtbEVsZW1lbnQgZ2V0WG1sRWxlbWVudChib29sZWFuIGluY2x1ZGVSZWZlcmVuY2VzKSB7Ci0JCVhtbEVsZW1lbnQgZWxlbWVudFhtbCA9IHN1cGVyLmdldFhtbEVsZW1lbnQoaW5jbHVkZVJlZmVyZW5jZXMpOwotCi0JCWlmIChpbmNsdWRlUmVmZXJlbmNlcykgewotCQkJTGlzdCBjb250ZW50RWxlbWVudHMgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwbkZlYXR1cmVWYWx1ZShzdXBlci5lbGVtZW50LAotCQkJCQlBc3NvY2lhdGlvbkhlbHBlci5Sb2FkbWFwX0FjdGl2aXRlcywgbGF5b3V0TWFuYWdlcgotCQkJCQkJCS5nZXRFbGVtZW50UmVhbGl6ZXIoKSk7Ci0JCQlhZGRSZWZlcmVuY2VzKEFzc29jaWF0aW9uSGVscGVyLlJvYWRtYXBfQWN0aXZpdGVzLCBlbGVtZW50WG1sLCAiY29udGVudEVsZW1lbnRzIiwgY29udGVudEVsZW1lbnRzKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJcmV0dXJuIGVsZW1lbnRYbWw7Ci0JfQotCi0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZWxlbWVudHMvUm9sZURlc2NyaXB0b3JMYXlvdXQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZWxlbWVudHMvUm9sZURlc2NyaXB0b3JMYXlvdXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGNmOTI4Yi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L2VsZW1lbnRzL1JvbGVEZXNjcmlwdG9yTGF5b3V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LmVsZW1lbnRzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLkVsZW1lbnRSZWFsaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuRWxlbWVudExheW91dE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LnV0aWwuWG1sRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUudXRpbC5PcHBvc2l0ZUZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkFzc29jaWF0aW9uSGVscGVyOwotCi0KLS8qKgotICogVGhlIGxheW91dCBmb3IgYSBSb2xlRGVzY3JpcHRvci4KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBSb2xlRGVzY3JpcHRvckxheW91dCBleHRlbmRzIERlc2NyaXB0b3JMYXlvdXQgewotCQotCXB1YmxpYyBSb2xlRGVzY3JpcHRvckxheW91dCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0KEVsZW1lbnRMYXlvdXRNYW5hZ2VyIGxheW91dE1hbmFnZXIsIE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgewotCQlzdXBlci5fX2luaXQobGF5b3V0TWFuYWdlciwgZWxlbWVudCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuSUVsZW1lbnRMYXlvdXQjZ2V0WG1sRWxlbWVudChib29sZWFuKQotCSAqLwotCXB1YmxpYyBYbWxFbGVtZW50IGdldFhtbEVsZW1lbnQoYm9vbGVhbiBpbmNsdWRlUmVmZXJlbmNlcykgewotCQlYbWxFbGVtZW50IGVsZW1lbnRYbWwgPSBzdXBlci5nZXRYbWxFbGVtZW50KGluY2x1ZGVSZWZlcmVuY2VzKTsKLQotCQkvLyB1c2UgdGhlIGRlZmF1bHQKLQkJLy8gaWYgeW91IG5lZWQgdG8gZ2VuZXJhdGUgZGlhZ3JhbSwgeW91IG1heSBuZWVkIHRvIGtlZXAgdGhlIGZlYXR1cmUKLQkJLy8gdmFsdWVzLgotCQkvLyBqdXN0IGRvIHNvbWV0aGluZyBzaW1pbGFyIHRvIHRoZSBSb2xlTGF5b3V0Ci0JCS8vIE5PVEU6IGZvciByb2xlLXRhc2tzIHJlbGF0aW9uc2hpcCwgdGhlIGZlYXR1cmUgaXMKLQkJLy8gUm9sZURlc2NyaXB0b3IjZ2V0UGVyZm9ybXNBc093bmVyCi0JCS8vIGl0J3MgYSBiaWRpcmVjdGlvbmFsIGZlYXR1cmUsIGRvbid0IG5lZWQgb3Bwb3NpdGUgZmVhdHVyZQotCQlyZXR1cm4gZWxlbWVudFhtbDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgbG9hZFJlZmVyZW5jZXMoWG1sRWxlbWVudCBlbGVtZW50WG1sLCBib29sZWFuIGluY2x1ZGVSZWZlcmVuY2VzKSB7Ci0KLQkJc3VwZXIubG9hZFJlZmVyZW5jZXMoZWxlbWVudFhtbCwgaW5jbHVkZVJlZmVyZW5jZXMpOwotCQkKLQkJZWxlbWVudFhtbC5zZXRBdHRyaWJ1dGUoIlNob3dGdWxsTWV0aG9kQ29udGVudCIsIChsYXlvdXRNYW5hZ2VyLmdldFZhbGlkYXRvcigpLnNob3dFeHRyYUluZm9Gb3JEZXNjcmlwdG9ycygpKSA/ICJ0cnVlIiA6ICJmYWxzZSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkKLQkJaWYgKCAoc3VwZXIuZWxlbWVudExheW91dCAhPSBudWxsICkgJiYgbGF5b3V0TWFuYWdlci5nZXRWYWxpZGF0b3IoKS5zaG93RXh0cmFJbmZvRm9yRGVzY3JpcHRvcnMoKSApIHsKLQkJCS8vIGFsc28gbG9hZCB0aGUgbGlua2VkIGVsZW1lbnQgcmVmZXJlbmNlZCBpbmZvcm1hdGlvbgotCQkJZm9yIChJdGVyYXRvcjxFU3RydWN0dXJhbEZlYXR1cmU+IGl0ZXIgPSBnZXRFeHRyYUZlYXR1cmVzRnJvbUNvbnRlbnRFbGVtZW50KCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSAoRVN0cnVjdHVyYWxGZWF0dXJlKSBpdGVyLm5leHQoKTsKLQkJCQlzdXBlci5lbGVtZW50TGF5b3V0LmxvYWRGZWF0dXJlKGZlYXR1cmUsIGVsZW1lbnRYbWwsIGZhbHNlKTsKLQkJCX0KLQkJfQotCX0KLQotCQotCS8qKgotCSAqIGxvYWQgdGhlIG5vbi1hdHRyaWJ1dGUgZmVhdHVyZQotCSAqIAotCSAqIEBwYXJhbSBmZWF0dXJlCi0JICogQHBhcmFtIGVsZW1lbnRYbWwKLQkgKiBAcGFyYW0gaW5jbHVkZVJlZmVyZW5jZXMKLQkgKi8KLQlwdWJsaWMgdm9pZCBsb2FkRmVhdHVyZShFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgWG1sRWxlbWVudCBlbGVtZW50WG1sLAotCQkJYm9vbGVhbiBpbmNsdWRlUmVmZXJlbmNlcykgewotCQlpZiAoIGZlYXR1cmUgPT0gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Um9sZURlc2NyaXB0b3JfTW9kaWZpZXMoKSApIHsKLQkJCUxpc3QgdiA9IGNhbGNNb2RpZmllZFdvcmtQcm9kdWN0RGVzY3JpcHRvcnMoKTsKLQkJCWFkZFJlZmVyZW5jZXMoZmVhdHVyZSwgZWxlbWVudFhtbCwgZmVhdHVyZS5nZXROYW1lKCksIHYpOwotCQl9IGVsc2UgewotCQkJZ2V0RmVhdHVyZVZhbHVlKGZlYXR1cmUsICBlbGVtZW50WG1sLCBpbmNsdWRlUmVmZXJlbmNlcyk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIExpc3QgY2FsY01vZGlmaWVkV29ya1Byb2R1Y3REZXNjcmlwdG9ycygpIHsKLQkJTGlzdCB2ID0gbmV3IEFycmF5TGlzdCgpOwotCQlFbGVtZW50UmVhbGl6ZXIgcmVhbGl6ZXIgPSBnZXRMYXlvdXRNZ3IoKS5nZXRFbGVtZW50UmVhbGl6ZXIoKTsKLQkJT3Bwb3NpdGVGZWF0dXJlIG9mZWF0dXJlID0gQXNzb2NpYXRpb25IZWxwZXIuUm9sZURlc2NyaXB0b3JfUHJpbWFyeVRhc2tEZXNjcmlwdG9yczsKLQkJTGlzdCB2MiA9IENvbmZpZ3VyYXRpb25IZWxwZXIuY2FsYzBuRmVhdHVyZVZhbHVlKGVsZW1lbnQsIG9mZWF0dXJlLCByZWFsaXplcik7Ci0JCWlmICggdjIuc2l6ZSgpID4gMCApIHsKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza0Rlc2NyaXB0b3JfT3V0cHV0KCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gdjIuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOyApIHsKLQkJCQlNZXRob2RFbGVtZW50IGUgPSAoTWV0aG9kRWxlbWVudClpdC5uZXh0KCk7Ci0JCQkJCi0JCQkJU3RyaW5nIHBhdGggPSBzdXBlci5tYWtlUGF0aChnZXRTdXBlckFjdGl2aXR5UGF0aCgpLCBlKTsKLQkJCQlUYXNrRGVzY3JpcHRvckxheW91dCB0bCA9IChUYXNrRGVzY3JpcHRvckxheW91dClsYXlvdXRNYW5hZ2VyLmNyZWF0ZUxheW91dChlLCBvd25pbmdQcm9jZXNzLCBwYXRoKTsKLQkJCQkvL1JvbGVEZXNjcmlwdG9yIHIgPSAoUm9sZURlc2NyaXB0b3IpdGwuZ2V0RmVhdHVyZVZhbHVlKFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tEZXNjcmlwdG9yX1BlcmZvcm1lZFByaW1hcmlseUJ5KCksIG51bGwsIGZhbHNlKTsKLQkJCQlMaXN0IHJMaXN0ID0gKExpc3QpdGwuZ2V0RmVhdHVyZVZhbHVlKFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tEZXNjcmlwdG9yX1BlcmZvcm1lZFByaW1hcmlseUJ5KCksIG51bGwsIGZhbHNlKTsKLQkJCQkvL2lmICggciA9PSB0aGlzLmVsZW1lbnQgKSB7Ci0JCQkJaWYgKCByTGlzdC5jb250YWlucyh0aGlzLmVsZW1lbnQpICkgewotCQkJCQlMaXN0IHZhbHVlID0gKExpc3QpdGwuZ2V0RmVhdHVyZVZhbHVlKGZlYXR1cmUsIG51bGwsIGZhbHNlKTsKLQkJCQkJaWYgKCB2YWx1ZSAhPSBudWxsICYmIHZhbHVlLnNpemUoKSA+IDAgKSB7Ci0JCQkJCQlmb3IgKCBJdGVyYXRvciBpdHIgPSB2YWx1ZS5pdGVyYXRvcigpOyBpdHIuaGFzTmV4dCgpOyApIHsKLQkJCQkJCQlPYmplY3QgbyA9IGl0ci5uZXh0KCk7Ci0JCQkJCQkJaWYgKCAhdi5jb250YWlucyhvKSApIHsKLQkJCQkJCQkJdi5hZGQobyk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gdjsKLQl9Ci0JCQotCXByb3RlY3RlZCBib29sZWFuIGFjY2VwdEZlYXR1cmVWYWx1ZShPcHBvc2l0ZUZlYXR1cmUgZmVhdHVyZSwgT2JqZWN0IHZhbHVlKSB7Ci0JCQotCQlpZiAoICFzdXBlci5hY2NlcHRGZWF0dXJlVmFsdWUoZmVhdHVyZSwgdmFsdWUpICkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCQotCQlpZiAoICFpc1Rhc2tPcHBvc2l0ZUZlYXR1cmUoZmVhdHVyZSkgfHwgISh2YWx1ZSBpbnN0YW5jZW9mIExpc3QpICkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJCi0JCUxpc3QgaXRlbXMgPSAoTGlzdCl2YWx1ZTsKLQkJaW50IGkgPSAwOwotCQl3aGlsZSAoaSA8IGl0ZW1zLnNpemUoKSApIHsKLQkJCU1ldGhvZEVsZW1lbnQgZSA9IChNZXRob2RFbGVtZW50KWl0ZW1zLmdldChpKTsKLQkJCVN0cmluZyBwYXRoID0gc3VwZXIubWFrZVBhdGgoZ2V0U3VwZXJBY3Rpdml0eVBhdGgoKSwgZSk7Ci0JCQlUYXNrRGVzY3JpcHRvckxheW91dCB0bCA9IChUYXNrRGVzY3JpcHRvckxheW91dClsYXlvdXRNYW5hZ2VyLmNyZWF0ZUxheW91dChlLCBvd25pbmdQcm9jZXNzLCBwYXRoKTsKLQkJCU9iamVjdCBvID0gbnVsbDsKLQkJCWlmICggZmVhdHVyZSA9PSBBc3NvY2lhdGlvbkhlbHBlci5Sb2xlRGVzY3JpcHRvcl9QcmltYXJ5VGFza0Rlc2NyaXB0b3JzICkgewotCQkJCW8gPSB0bC5nZXRGZWF0dXJlVmFsdWUoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza0Rlc2NyaXB0b3JfUGVyZm9ybWVkUHJpbWFyaWx5QnkoKSwgbnVsbCwgZmFsc2UpOwkJCQotCQkJfSBlbHNlIGlmICggZmVhdHVyZSA9PSBBc3NvY2lhdGlvbkhlbHBlci5Sb2xlRGVzY3JpcHRvcl9BZGRpdGlvbmFsVGFza0Rlc2NyaXB0b3JzICkgewotCQkJCW8gPSB0bC5nZXRGZWF0dXJlVmFsdWUoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza0Rlc2NyaXB0b3JfQWRkaXRpb25hbGx5UGVyZm9ybWVkQnkoKSwgbnVsbCwgZmFsc2UpOwkJCQkJCQotCQkJfSBlbHNlIGlmICggZmVhdHVyZSA9PSBBc3NvY2lhdGlvbkhlbHBlci5Sb2xlRGVzY3JpcHRvcl9Bc3Npc3RzSW5fVGFza0Rlc2NyaXB0b3JzICkgewotCQkJIG8gPSB0bC5nZXRGZWF0dXJlVmFsdWUoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza0Rlc2NyaXB0b3JfQXNzaXN0ZWRCeSgpLCBudWxsLCBmYWxzZSk7CQkJCQkJCi0JCQl9Ci0JCQkKLQkJCWlmICggKG8gPT0gdGhpcy5lbGVtZW50KSB8fCAobyBpbnN0YW5jZW9mIExpc3QpICYmICgoTGlzdClvKS5jb250YWlucyh0aGlzLmVsZW1lbnQpICkgewotCQkJCWkrKzsKLQkJCX0gZWxzZSB7Ci0JCQkJaXRlbXMucmVtb3ZlKGkpOwotCQkJfQotCQl9Ci0KLQotCQkKLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9lbGVtZW50cy9Sb2xlTGF5b3V0LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L2VsZW1lbnRzL1JvbGVMYXlvdXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjA3YzE1YS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L2VsZW1lbnRzL1JvbGVMYXlvdXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuZWxlbWVudHM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLkVsZW1lbnRSZWFsaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuQ29tcGFyYXRvcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LkVsZW1lbnRMYXlvdXRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5JRWxlbWVudExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuZGlhZ3JhbS5NZXRob2RFbGVtZW50RGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuZGlhZ3JhbS5Sb2xlRGlhZ3JhbVB1Ymxpc2hlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQudXRpbC5YbWxFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLnV0aWwuT3Bwb3NpdGVGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5Bc3NvY2lhdGlvbkhlbHBlcjsKLQotLyoqCi0gKiBUaGUgZWxlbWVudCBsYXlvdXQgZm9yIGEgUm9sZS4KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQGF1dGhvciBXZWlwaW5nIEx1Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBSb2xlTGF5b3V0IGV4dGVuZHMgQWJzdHJhY3RFbGVtZW50TGF5b3V0IHsKLQotCXByb3RlY3RlZCBNYXAgcmVmZXJlbmNlTWFwID0gbmV3IEhhc2hNYXAoKTsKLQotCXB1YmxpYyBSb2xlTGF5b3V0KCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXQoRWxlbWVudExheW91dE1hbmFnZXIgbGF5b3V0TWFuYWdlciwgTWV0aG9kRWxlbWVudCBlbGVtZW50KSB7Ci0JCXN1cGVyLl9faW5pdChsYXlvdXRNYW5hZ2VyLCBlbGVtZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5JRWxlbWVudExheW91dCNnZXRYbWxFbGVtZW50KGJvb2xlYW4pCi0JICovCi0JcHVibGljIFhtbEVsZW1lbnQgZ2V0WG1sRWxlbWVudChib29sZWFuIGluY2x1ZGVSZWZlcmVuY2VzKSB7Ci0JCVhtbEVsZW1lbnQgZWxlbWVudFhtbCA9IHN1cGVyLmdldFhtbEVsZW1lbnQoaW5jbHVkZVJlZmVyZW5jZXMpOwotCQlpZiAoaW5jbHVkZVJlZmVyZW5jZXMpIHsKLQkJCUxpc3QgcGVyZm9ybXMgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwbkZlYXR1cmVWYWx1ZSgKLQkJCQkJc3VwZXIuZWxlbWVudCwgQXNzb2NpYXRpb25IZWxwZXIuUm9sZV9QcmltYXJ5X1Rhc2tzLAotCQkJCQlsYXlvdXRNYW5hZ2VyLmdldEVsZW1lbnRSZWFsaXplcigpKTsKLQkJCXJlZmVyZW5jZU1hcC5wdXQoInBlcmZvcm1zIiwgcGVyZm9ybXMpOyAvLyROT04tTkxTLTEkCi0KLQkJCS8vIE5PLCB0aGlzIGlzIHdyb25nISBzaG91bGQgY2FsY3VsYXRlIHRoZSByZWFsaXplZCBmZWF0dXJlIHZhbHVlIQotCQkJLy8gbW92ZWQgdG8gYWNjZXB0RmVhdHVyZVZhbHVlIHRvIGdldCB0aGUgcmVhbGl6ZWQgdmFsdWUgYW5kIHNhdmUgdG8KLQkJCS8vIHRoZSBtYXAKLQkJCS8vIGlmIChzdXBlci5lbGVtZW50IGluc3RhbmNlb2YgUm9sZUltcGwpCi0JCQkvLyB7Ci0JCQkvLyByZWZlcmVuY2VNYXAucHV0KCJyZXNwb25zaWJsZUZvciIsCi0JCQkvLyAoKFJvbGVJbXBsKXN1cGVyLmVsZW1lbnQpLmdldFJlc3BvbnNpYmxlRm9yKCkpOwotCQkJLy8gfQotCi0JCQlMaXN0IGFkZGl0aW9uYWxseVBlcmZvcm1zID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMG5GZWF0dXJlVmFsdWUoCi0JCQkJCXN1cGVyLmVsZW1lbnQsIEFzc29jaWF0aW9uSGVscGVyLlJvbGVfU2Vjb25kYXJ5X1Rhc2tzLAotCQkJCQlsYXlvdXRNYW5hZ2VyLmdldEVsZW1lbnRSZWFsaXplcigpKTsKLQkJCS8vIHJlZmVyZW5jZU1hcC5wdXQoImFkZGl0aW9uYWxseVBlcmZvcm1zIiwgYWRkaXRpb25hbGx5UGVyZm9ybXMpOwotCQkJLy8gLy8kTk9OLU5MUy0xJAotCQkJYWRkUmVmZXJlbmNlcyhBc3NvY2lhdGlvbkhlbHBlci5Sb2xlX1NlY29uZGFyeV9UYXNrcywgZWxlbWVudFhtbCwKLQkJCQkJImFkZGl0aW9uYWxseVBlcmZvcm1zIiwgYWRkaXRpb25hbGx5UGVyZm9ybXMpOyAvLyROT04tTkxTLTEkCi0JCQlSb2xlRGlhZ3JhbVB1Ymxpc2hlciBkaWFncmFtUHVibGlzaGVyID0gbmV3IFJvbGVEaWFncmFtUHVibGlzaGVyKCk7Ci0JCQlNZXRob2RFbGVtZW50RGlhZ3JhbSBkaWFncmFtID0gZGlhZ3JhbVB1Ymxpc2hlci5wdWJsaXNoKHRoaXMsCi0JCQkJCW5ldyBGaWxlKGxheW91dE1hbmFnZXIuZ2V0UHVibGlzaERpcigpKSk7Ci0KLQkJCWlmIChkaWFncmFtICE9IG51bGwpCi0JCQkJZWxlbWVudFhtbC5zZXRDb250ZW50KCJkaWFncmFtIiwgZGlhZ3JhbS5nZXRIVE1MKCkpOyAvLyROT04tTkxTLTEkCi0KLQkJCUxpc3Qgcm9sZVNldHMgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwbkZlYXR1cmVWYWx1ZSgKLQkJCQkJc3VwZXIuZWxlbWVudCwgQXNzb2NpYXRpb25IZWxwZXIuUm9sZV9Sb2xlU2V0cywKLQkJCQkJbGF5b3V0TWFuYWdlci5nZXRFbGVtZW50UmVhbGl6ZXIoKSk7Ci0JCQlhZGRSZWZlcmVuY2VzKEFzc29jaWF0aW9uSGVscGVyLlJvbGVfUm9sZVNldHMsIGVsZW1lbnRYbWwsCi0JCQkJCSJyb2xlU2V0cyIsIHJvbGVTZXRzKTsgLy8kTk9OLU5MUy0xJAotCQkJCi0JCQkvLyBhZGQgdGhlIGRlc2NyaXB0b3JzIHJlZmVyZW5jaW5nIHRoaXMgZWxlbWVudAotCQkJc3VwZXIucHJvY2Vzc0Rlc2NyaXB0b3JzKGVsZW1lbnRYbWwpOwotCQkJCi0JCX0KLQkJCi0JCWVsZW1lbnRYbWwuc2V0QXR0cmlidXRlKCJTaG93RnVsbE1ldGhvZENvbnRlbnQiLCAobGF5b3V0TWFuYWdlci5nZXRWYWxpZGF0b3IoKS5zaG93RXh0cmFJbmZvRm9yRGVzY3JpcHRvcnMoKSkgPyAidHJ1ZSIgOiAiZmFsc2UiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCi0JCXJldHVybiBlbGVtZW50WG1sOwotCX0KLQkKLQlwdWJsaWMgTGlzdCBnZXRQZXJmb3JtcygpIHsKLQkJTGlzdCBsaXN0ID0gKExpc3QpIHJlZmVyZW5jZU1hcC5nZXQoInBlcmZvcm1zIik7IC8vJE5PTi1OTFMtMSQKLQkJQ29sbGVjdGlvbnMuc29ydChsaXN0LCBDb21wYXJhdG9ycy5QUkVTRU5UQVRJT05fTkFNRV9DT01QQVJBVE9SKTsKLQkJcmV0dXJuIGxpc3Q7Ci0JfQotCi0JcHVibGljIExpc3QgZ2V0QWRkaXRpb25hbGx5UGVyZm9ybXMoKSB7Ci0JCUxpc3QgbGlzdCA9IChMaXN0KSByZWZlcmVuY2VNYXAuZ2V0KCJhZGRpdGlvbmFsbHlQZXJmb3JtcyIpOyAvLyROT04tTkxTLTEkCi0JCUNvbGxlY3Rpb25zLnNvcnQobGlzdCwgQ29tcGFyYXRvcnMuUFJFU0VOVEFUSU9OX05BTUVfQ09NUEFSQVRPUik7Ci0JCXJldHVybiBsaXN0OwkJCi0JfQotCi0JcHVibGljIExpc3QgZ2V0UmVzcG9uc2libGVGb3IoKSB7Ci0JCUxpc3QgbGlzdCA9ICAoTGlzdCkgcmVmZXJlbmNlTWFwLmdldCgicmVzcG9uc2libGVGb3IiKTsgLy8kTk9OLU5MUy0xJAotCQlDb2xsZWN0aW9ucy5zb3J0KGxpc3QsIENvbXBhcmF0b3JzLlBSRVNFTlRBVElPTl9OQU1FX0NPTVBBUkFUT1IpOwotCQlyZXR1cm4gbGlzdDsJCQotCX0KLQotCXB1YmxpYyBMaXN0IGdldE1vZGlmaWVzKCkgewotCQlMaXN0IGxpc3QgPSAgKExpc3QpIHJlZmVyZW5jZU1hcC5nZXQoIm1vZGlmaWVzIik7IC8vJE5PTi1OTFMtMSQKLQkJQ29sbGVjdGlvbnMuc29ydChsaXN0LCBDb21wYXJhdG9ycy5QUkVTRU5UQVRJT05fTkFNRV9DT01QQVJBVE9SKTsKLQkJcmV0dXJuIGxpc3Q7CQkKLQl9Ci0KLQkvKioKLQkgKiBzb21lIGxheW91dCBuZWVkIHRvIGhhdmUgdGhlIGZlYXR1cmUgdmFsdWVzIGZvciBmdXJ0aGVyIHByb2Nlc3NpbmcuIFNvCi0JICogdGhpcyBtZXRob2Qgd2lsbCBiZSBjYWxsZWQgd2hlbiBhIGZlYXR1cmUgaXMgY2FsY3VsYXRlZCBpbiB0aGlzIGFic3RyYWN0Ci0JICogY2xhc3MKLQkgKiAKLQkgKiBAcGFyYW0gbmFtZQotCSAqIEBwYXJhbSB2YWx1ZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIG5vdGlmeUZlYXR1cmVWYWx1ZShTdHJpbmcgbmFtZSwgT2JqZWN0IHZhbHVlKSB7Ci0JCXJlZmVyZW5jZU1hcC5wdXQobmFtZSwgdmFsdWUpOwotCX0KLQotCS8qKgotCSAqIHNvbWUgbGF5b3V0IG5lZWQgdG8gaGF2ZSB0aGUgZmVhdHVyZSB2YWx1ZXMgZm9yIGZ1cnRoZXIgcHJvY2Vzc2luZy4gU28KLQkgKiB0aGlzIG1ldGhvZCB3aWxsIGJlIGNhbGxlZCB3aGVuIGEgZmVhdHVyZSBpcyBjYWxjdWxhdGVkIGluIHRoaXMgYWJzdHJhY3QKLQkgKiBjbGFzcwotCSAqIAotCSAqIEBwYXJhbSBuYW1lCi0JICogQHBhcmFtIHZhbHVlCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0RmVhdHVyZVZhbHVlKEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLAotCQkJT2JqZWN0IHZhbHVlKSB7Ci0KLQkJLy8gc2F2ZSB0aGUgZmVhdHVyZSB2YWx1ZSBmb3IgZGlhZ3JhbSBnZW5lcmF0aW9uCi0JCWlmIChmZWF0dXJlID09IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFJvbGVfUmVzcG9uc2libGVGb3IoKSkgewotCQkJcmVmZXJlbmNlTWFwLnB1dCgicmVzcG9uc2libGVGb3IiLCB2YWx1ZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCXJldHVybiBzdXBlci5hY2NlcHRGZWF0dXJlVmFsdWUoZmVhdHVyZSwgdmFsdWUpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGFjY2VwdEZlYXR1cmVWYWx1ZShPcHBvc2l0ZUZlYXR1cmUgZmVhdHVyZSwgT2JqZWN0IHZhbHVlKSB7Ci0JCXJldHVybiBzdXBlci5hY2NlcHRGZWF0dXJlVmFsdWUoZmVhdHVyZSwgdmFsdWUpOwotCX0KLQkKLQkKLQlwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzR3JhbmRDaGlsZChPYmplY3QgZmVhdHVyZSwKLQkJCU1ldGhvZEVsZW1lbnQgY2hpbGRFbGVtZW10LCBJRWxlbWVudExheW91dCBjaGlsZExheW91dCwKLQkJCVhtbEVsZW1lbnQgY2hpbGRYbWxFbGVtZW50KSB7Ci0JCWlmICghKGNoaWxkTGF5b3V0IGluc3RhbmNlb2YgV29ya1Byb2R1Y3RMYXlvdXQpCi0JCQkJfHwgY2hpbGRYbWxFbGVtZW50ID09IG51bGwKLQkJCQl8fCAhKGNoaWxkRWxlbWVtdCBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0KSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWlmICghICgoV29ya1Byb2R1Y3QpY2hpbGRFbGVtZW10KS5nZXRJc0Fic3RyYWN0KCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJV29ya1Byb2R1Y3RMYXlvdXQgd3BDaGlsZExheW91dCA9IChXb3JrUHJvZHVjdExheW91dCkgY2hpbGRMYXlvdXQ7Ci0JCUVsZW1lbnRSZWFsaXplciByZWFsaXplciA9IHdwQ2hpbGRMYXlvdXQubGF5b3V0TWFuYWdlcgotCQkJCS5nZXRFbGVtZW50UmVhbGl6ZXIoKTsKLQotCQlpZiAoZmVhdHVyZSA9PSBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRSb2xlX1Jlc3BvbnNpYmxlRm9yKCkgfHwKLQkJCWZlYXR1cmUgPT0gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Um9sZV9Nb2RpZmllcygpKSB7Ci0JCQlPcHBvc2l0ZUZlYXR1cmUgb0Z1bGZpbGxpbmdGZWF0dXJlID0gQXNzb2NpYXRpb25IZWxwZXIuRnVsRmlsbHNfRnVsbEZpbGxhYmxlRWxlbWVudHM7Ci0JCQlMaXN0IGl0ZW1zID0gd3BDaGlsZExheW91dC5jYWxjMG5GZWF0dXJlVmFsdWUoY2hpbGRFbGVtZW10LCBvRnVsZmlsbGluZ0ZlYXR1cmUsIHJlYWxpemVyKTsKLQkJCWl0ZW1zID0gZ2V0VGFnUXVhbGlmaWVkTGlzdChyZWFsaXplci5nZXRDb25maWd1cmF0aW9uKCksIGl0ZW1zKTsKLQkJCXdwQ2hpbGRMYXlvdXQuYWRkUmVmZXJlbmNlcyhvRnVsZmlsbGluZ0ZlYXR1cmUsIGNoaWxkWG1sRWxlbWVudCwgb0Z1bGZpbGxpbmdGZWF0dXJlCi0JCQkJCS5nZXROYW1lKCksIGl0ZW1zKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9lbGVtZW50cy9TdGVwTGF5b3V0LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L2VsZW1lbnRzL1N0ZXBMYXlvdXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmVkYzE4Yi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L2VsZW1lbnRzL1N0ZXBMYXlvdXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5lbGVtZW50czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5FbGVtZW50TGF5b3V0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgU3RlcExheW91dCBleHRlbmRzIEFic3RyYWN0RWxlbWVudExheW91dCB7Ci0KLQlwdWJsaWMgU3RlcExheW91dCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0KEVsZW1lbnRMYXlvdXRNYW5hZ2VyIGxheW91dE1hbmFnZXIsIE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgewotCQlzdXBlci5fX2luaXQobGF5b3V0TWFuYWdlciwgZWxlbWVudCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L2VsZW1lbnRzL1N1bW1hcnlQYWdlTGF5b3V0LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L2VsZW1lbnRzL1N1bW1hcnlQYWdlTGF5b3V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxYWVlMmYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9lbGVtZW50cy9TdW1tYXJ5UGFnZUxheW91dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjU0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5lbGVtZW50czsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuU3RyVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb25maWd1cmF0aW9uLlByYWN0aWNlU3ViZ3JvdXBJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LkVsZW1lbnRMYXlvdXRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5IdG1sQnVpbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuSUVsZW1lbnRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LkxheW91dEluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LnV0aWwuWG1sRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLlJlc291cmNlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLQotCi0vKioKLSAqIFRoZSBsYXlvdXQgZm9yIGEgc3VtbWFyeSBwYWdlIG9mIGFuIGVsZW1lbnQuCi0gKiA8cD4KLSAqIFRoZSBzdW1tYXJ5cGFnZSBsYXlvdXQgYSBsaXN0IG9mIGVsZW1lbnRzIHJlZmVyZW5jZWQgYnkgdGhlIG93bmVyIGVsZW1lbnQKLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBhdXRob3IgV2VpcGluZyBMdQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgU3VtbWFyeVBhZ2VMYXlvdXQgaW1wbGVtZW50cyBJRWxlbWVudExheW91dCB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEFZT1VUX1RZUEUgPSAiU3VtbWFyeSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMQVlPVVRfWFNMID0gInN1bW1hcnkueHNsIjsgLy8kTk9OLU5MUy0xJAotCi0JRWxlbWVudExheW91dE1hbmFnZXIgbGF5b3V0TWFuYWdlcjsKLQotCU1ldGhvZEVsZW1lbnQgZWxlbWVudDsKLQotCUxpc3QgcmVmTGlzdDsKLQotCVN0cmluZyB0aXRsZTsKLQkKLQlTdHJpbmcgcHJlZml4OwotCQotCXByaXZhdGUgU3RyaW5nIHR5cGVOYW1lOwotCi0JcHJpdmF0ZSBIdG1sQnVpbGRlciBodG1sQnVpbGRlcjsKLQkKLQkvLyBTdHJpbmcgZmlsZU5hbWU7Ci0JSUVsZW1lbnRMYXlvdXQgZWxlbWVudExheW91dDsKLQotLy8JcHVibGljIFN1bW1hcnlQYWdlTGF5b3V0KEVsZW1lbnRMYXlvdXRNYW5hZ2VyIGxheW91dE1hbmFnZXIsCi0vLwkJCU1ldGhvZEVsZW1lbnQgZWxlbWVudCwgU3RyaW5nIHRpdGxlLCBMaXN0IHJlZkxpc3QpIHsKLS8vCQl0aGlzLmxheW91dE1hbmFnZXIgPSBsYXlvdXRNYW5hZ2VyOwotLy8JCXRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7Ci0vLwkJdGhpcy5yZWZMaXN0ID0gcmVmTGlzdDsKLS8vCQl0aGlzLnRpdGxlID0gdGl0bGU7Ci0vLwotLy8JCXRoaXMuZWxlbWVudExheW91dCA9IGxheW91dE1hbmFnZXIuZ2V0TGF5b3V0KGVsZW1lbnQsIHRydWUpOwotLy8JfQotCXB1YmxpYyBTdW1tYXJ5UGFnZUxheW91dChFbGVtZW50TGF5b3V0TWFuYWdlciBsYXlvdXRNYW5hZ2VyLAotCQkJTWV0aG9kRWxlbWVudCBlbGVtZW50LCBTdHJpbmcgcHJlZml4LCBTdHJpbmcgdGl0bGUsIExpc3QgcmVmTGlzdCkgewotCQl0aGlzKGxheW91dE1hbmFnZXIsIGVsZW1lbnQsIHByZWZpeCwgdGl0bGUsIHJlZkxpc3QsIG51bGwpOwotCX0KLQkKLQlwdWJsaWMgU3VtbWFyeVBhZ2VMYXlvdXQoRWxlbWVudExheW91dE1hbmFnZXIgbGF5b3V0TWFuYWdlciwKLQkJCU1ldGhvZEVsZW1lbnQgZWxlbWVudCwgU3RyaW5nIHByZWZpeCwgU3RyaW5nIHRpdGxlLCAKLQkJCUxpc3QgcmVmTGlzdCwgU3RyaW5nIHR5cGVOYW1lKSAKLQl7Ci0JCXRoaXMudHlwZU5hbWUgPSB0eXBlTmFtZTsKLQkJdGhpcy5sYXlvdXRNYW5hZ2VyID0gbGF5b3V0TWFuYWdlcjsKLQkJdGhpcy5lbGVtZW50ID0gZWxlbWVudDsKLQkJdGhpcy5yZWZMaXN0ID0gcmVmTGlzdDsKLQkJdGhpcy50aXRsZSA9IHRpdGxlOwotCQl0aGlzLnByZWZpeCA9IChwcmVmaXggIT0gbnVsbCAmJiBwcmVmaXgubGVuZ3RoKCkgPiAwICYmIHByZWZpeC5pbmRleE9mKCJudWxsIikgPCAwKSA/IHByZWZpeCA6ICJTdW1tYXJ5IjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkJdGhpcy5lbGVtZW50TGF5b3V0ID0gbGF5b3V0TWFuYWdlci5nZXRMYXlvdXQoZWxlbWVudCwgdHJ1ZSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJcmV0dXJuIGVsZW1lbnQuZ2V0R3VpZCgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIExBWU9VVF9UWVBFOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIHRpdGxlOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RGlzcGxheU5hbWUoKSB7Ci0JCXJldHVybiB0aXRsZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFVybCgpIHsKLQkJcmV0dXJuIGVsZW1lbnRMYXlvdXQuZ2V0RmlsZVBhdGgoKQotCQkJCSsgZ2V0RmlsZU5hbWUoUmVzb3VyY2VIZWxwZXIuRklMRV9FWFRfSFRNTCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRTaGFwZWljb25VcmwoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0Tm9kZWljb25VcmwoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RGlhZ3JhbWljb25VcmwoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0WHNsVXJsKCkgewotCQlyZXR1cm4gTEFZT1VUX1hTTDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEJhY2tQYXRoKCkgewotCQlyZXR1cm4gZWxlbWVudExheW91dC5nZXRCYWNrUGF0aCgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RmlsZVBhdGgoKSB7Ci0JCXJldHVybiBlbGVtZW50TGF5b3V0LmdldEZpbGVQYXRoKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRGaWxlUGF0aChJRWxlbWVudExheW91dCByZWxhdGl2ZVRvKSB7Ci0JCXJldHVybiBlbGVtZW50TGF5b3V0LmdldEZpbGVQYXRoKHJlbGF0aXZlVG8pOwotCX0KLQotLy8JcHVibGljIFN0cmluZyBnZXRGaWxlTmFtZShTdHJpbmcgZXh0KSB7Ci0vLwkJcmV0dXJuIFN0clV0aWwubWFrZVZhbGlkRmlsZU5hbWUodGl0bGUgKyAiXyIpICsgZWxlbWVudExheW91dC5nZXRGaWxlTmFtZShleHQpOyAvLyROT04tTkxTLTEkCi0vLwotLy8JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0RmlsZU5hbWUoU3RyaW5nIGV4dCkgewotCQlyZXR1cm4gU3RyVXRpbC5yZW1vdmVTcGVjaWFsQ2hhcmFjdGVycyhwcmVmaXggKyAiXyIpICsgZWxlbWVudExheW91dC5nZXRGaWxlTmFtZShleHQpOyAvLyROT04tTkxTLTEkCi0KLQl9Ci0KLQlwdWJsaWMgTWV0aG9kRWxlbWVudCBnZXRFbGVtZW50KCkgewotCQlyZXR1cm4gZWxlbWVudDsKLQl9Ci0KLQlwdWJsaWMgRWxlbWVudExheW91dE1hbmFnZXIgZ2V0TGF5b3V0TWdyKCkgewotCQlyZXR1cm4gbGF5b3V0TWFuYWdlcjsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5JRWxlbWVudExheW91dCNnZXRYbWxFbGVtZW50KGJvb2xlYW4pCi0JICovCi0JcHVibGljIFhtbEVsZW1lbnQgZ2V0WG1sRWxlbWVudChib29sZWFuIGluY2x1ZGVSZWZlcmVuY2VzKSB7Ci0JCQotCQlYbWxFbGVtZW50IGVsZW1lbnRYbWwgPSBuZXcgWG1sRWxlbWVudCgiRWxlbWVudCIpIC8vJE5PTi1OTFMtMSQKLQkJCQkuc2V0QXR0cmlidXRlKCJUeXBlIiwgZ2V0VHlwZSgpKSAvLyROT04tTkxTLTEkCi0JCQkJLnNldEF0dHJpYnV0ZSgiTmFtZSIsIGdldE5hbWUoKSkgLy8kTk9OLU5MUy0xJAotCQkJCS5zZXRBdHRyaWJ1dGUoIlVybCIsIGdldFVybCgpKSAvLyROT04tTkxTLTEkCi0JCQkJLnNldEF0dHJpYnV0ZSgiQmFja1BhdGgiLCBnZXRCYWNrUGF0aCgpKSAvLyROT04tTkxTLTEkCi0JCQkJLnNldEF0dHJpYnV0ZSgiSW1hZ2VVcmwiLCBnZXRTaGFwZWljb25VcmwoKSkgLy8kTk9OLU5MUy0xJAotCQkJCS5zZXRBdHRyaWJ1dGUoIkRpc3BsYXlOYW1lIiwgZ2V0RGlzcGxheU5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCWlmICh0eXBlTmFtZSAhPSBudWxsKSB7Ci0JCQllbGVtZW50WG1sLnNldEF0dHJpYnV0ZSgiVHlwZU5hbWUiLCB0eXBlTmFtZSk7Ly8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJaWYgKGluY2x1ZGVSZWZlcmVuY2VzKSB7Ci0JCQkKLQkJCVN0cmluZyBjb3B5cmlnaHQgPSBDb25maWd1cmF0aW9uSGVscGVyLmdldENvcHlyaWdodFRleHQoZWxlbWVudCwKLQkJCQkJbGF5b3V0TWFuYWdlci5nZXRDb25maWd1cmF0aW9uKCkpOwotCQkJaWYgKGNvcHlyaWdodCAhPSBudWxsICYmIGNvcHlyaWdodC5sZW5ndGgoKSA+IDApIHsKLQkJCQllbGVtZW50WG1sLm5ld0NoaWxkKCJjb3B5cmlnaHQiKS5zZXRWYWx1ZShjb3B5cmlnaHQpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQkKLQkJCVhtbEVsZW1lbnQgcmVmWG1sID0gZWxlbWVudFhtbAotCQkJCQkubmV3Q2hpbGQoInJlZmVyZW5jZUxpc3QiKS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCAiIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0KLQkJCWZvciAoSXRlcmF0b3IgaXQgPSByZWZMaXN0Lml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlPYmplY3QgZSA9IGl0Lm5leHQoKTsKLQkJCQlpZiAoZSBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCQkJTWV0aG9kRWxlbWVudCBtZSA9IChNZXRob2RFbGVtZW50KSBlOwotCQkJCQltZSA9IENvbmZpZ3VyYXRpb25IZWxwZXIuZ2V0Q2FsY3VsYXRlZEVsZW1lbnQobWUsCi0JCQkJCQkJbGF5b3V0TWFuYWdlci5nZXRDb25maWd1cmF0aW9uKCkpOwotCQkJCQlpZiAobWUgIT0gbnVsbCkgewotCQkJCQkJSUVsZW1lbnRMYXlvdXQgbCA9IGxheW91dE1hbmFnZXIuZ2V0TGF5b3V0KG1lLCB0cnVlKTsKLQkJCQkJCWlmIChsICE9IG51bGwpIHsKLQkJCQkJCQkvLyBkb24ndCBpbmNsdWRlIHRoZSByZWZlcmVuY2VzIG9mIHRoZSByZWZlcmVjZWQKLQkJCQkJCQkvLyBlbGVtZW50cywgb3RoZXJ3aXNlLCBtYXkgY2F1c2UgZGVhZGxvY2sKLQkJCQkJCQlyZWZYbWwuYWRkQ2hpbGQobC5nZXRYbWxFbGVtZW50KGZhbHNlKSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9IGVsc2UgaWYgKGUgaW5zdGFuY2VvZiBQcmFjdGljZVN1Ymdyb3VwSXRlbVByb3ZpZGVyKSB7Ci0JCQkJCVByYWN0aWNlU3ViZ3JvdXBJdGVtUHJvdmlkZXIgcHJvdmlkZXIgPSAoUHJhY3RpY2VTdWJncm91cEl0ZW1Qcm92aWRlcikgZTsKLQkJCQkJSUVsZW1lbnRMYXlvdXQgbCA9IG5ldyBTdW1tYXJ5UGFnZUxheW91dChnZXRMYXlvdXRNZ3IoKSwKLQkJCQkJCQlwcm92aWRlci5nZXRQcmFjdGljZSgpLCBwcm92aWRlci5nZXRUZXh0KG51bGwpLAotCQkJCQkJCXByb3ZpZGVyLmdldFRleHQobnVsbCksIChMaXN0KSBwcm92aWRlcgotCQkJCQkJCQkJLmdldENoaWxkcmVuKG51bGwpLCBwcm92aWRlci5nZXRUZXh0KG51bGwpKTsKLQkJCQkJcmVmWG1sLmFkZENoaWxkKGwuZ2V0WG1sRWxlbWVudChmYWxzZSkpOwotCQkJCQkKLQkJCQkJLy9UaGlzIGlzIGEgc2hvcnQgY3V0IGFwcHJvYWNoLgotCQkJCQkvL1RvIGRvOiBnZW5lcmFsaXplIGxheW91dE1hbmFnZXIgdG8gaGFuZGxlIG5vbiBtZXRob2QgZWxlbWVudCBsYXlvdXRzCi0JCQkJCWlmICghdGhpcy5sYXlvdXRNYW5hZ2VyLmlzUHVibGlzaGluZ01vZGUoKSAmJiBodG1sQnVpbGRlciAhPSBudWxsKSB7Ci0JCQkJCQlodG1sQnVpbGRlci5nZW5lcmF0ZUh0bWwobCk7CQkJCQkJCi0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gZWxlbWVudFhtbDsKLQl9Ci0KLQlwdWJsaWMgTGlzdCBnZXRMYXlvdXRzKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBmaWxlIG5hbWUgd2l0aCB0aGUgZ2l2ZW4gZXh0ZW5zaW9uIGZvciB0aGUgZ2l2ZW4gbGF5b3V0LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RmlsZU5hbWUoTGF5b3V0SW5mbyBpbmZvLCBTdHJpbmcgZXh0KSB7Ci0JCXJldHVybiBSZXNvdXJjZUhlbHBlci5nZXRGaWxlTmFtZShlbGVtZW50LCBudWxsLCBpbmZvLm5hbWUsIGV4dCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Q29udGVudFRhcmdldChNZXRob2RFbGVtZW50IHRhcmdldEVsZW1lbnQpIHsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRFbGVtZW50T3duZXIoTWV0aG9kRWxlbWVudCBvd25lcikgewotCX0KLQotCS8qKgotCSAqIGNoZWNrIGlmIHRoZSBodG1sIGNvbnRlbnQgZ2VuZXJhdGVkIGZyb20gdGhpcyB4c2wgZmlsZSBuZWVkcyB0byBiZSBzY2FubmVkIG9yIG5vdAotCSAqIHNjYW4gdGhlIGNvbnRlbnQgaXMgZm9yIGlkZW50aWZ5aW5nIGVsZW1lbnQgcmVmZXJlbmNlcyBpbiB0aGUgY29udGVudCBhbmQgY29weSBvdmVyIHJlc291cmNlIGZpbGVzCi0JICogaW4gc29tZSBjYXNlcyB3ZSBkb24ndCBuZWVkIHRvIHNjYW4gdGhlIGNvbnRlbnQsIGZvciBleGFtcGxlLCB0aGUgYWN0aXZpdHkgYnJlYWtkb3duIHN0cnVjdHVyZQotCSAqIAotCSAqIEBwYXJhbSB4c2xVcmwgdGhlIHhzbCB0aGF0IGh0bWwgaXMgZ2VuZXJhdGVkIGZyb20sIG51bGwgZm9yIHRoZSBkZWZhdWx0IHhzbCBsYXlvdXQKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBuZWVkQ29udGVudFNjYW4oU3RyaW5nIHhzbFVybCkKLQl7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0U2hvd0VsZW1lbnRMaW5rKGJvb2xlYW4gc2hvdykgewotCX0KLQotCXB1YmxpYyB2b2lkIHNldEh0bWxCdWlsZGVyKEh0bWxCdWlsZGVyIGh0bWxCdWlsZGVyKSB7Ci0JCXRoaXMuaHRtbEJ1aWxkZXIgPSBodG1sQnVpbGRlcjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZWxlbWVudHMvU3VwcG9ydGluZ01hdGVyaWFsTGF5b3V0LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L2VsZW1lbnRzL1N1cHBvcnRpbmdNYXRlcmlhbExheW91dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZjMwOWQ4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZWxlbWVudHMvU3VwcG9ydGluZ01hdGVyaWFsTGF5b3V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuZWxlbWVudHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuRWxlbWVudExheW91dE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LnV0aWwuWG1sRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkFzc29jaWF0aW9uSGVscGVyOwotCi0KLS8qKgotICogVGhlIGVsZW1lbnQgbGF5b3V0IGZvciBhIFN1cHBvcnRpbmcgTWF0ZXJpYWwuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFN1cHBvcnRpbmdNYXRlcmlhbExheW91dCBleHRlbmRzIEFic3RyYWN0RWxlbWVudExheW91dCB7Ci0KLQlwdWJsaWMgU3VwcG9ydGluZ01hdGVyaWFsTGF5b3V0KCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXQoRWxlbWVudExheW91dE1hbmFnZXIgbGF5b3V0TWFuYWdlciwgTWV0aG9kRWxlbWVudCBlbGVtZW50KSB7Ci0JCXN1cGVyLl9faW5pdChsYXlvdXRNYW5hZ2VyLCBlbGVtZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5JRWxlbWVudExheW91dCNnZXRYbWxFbGVtZW50KGJvb2xlYW4pCi0JICovCi0JcHVibGljIFhtbEVsZW1lbnQgZ2V0WG1sRWxlbWVudChib29sZWFuIGluY2x1ZGVSZWZlcmVuY2VzKSB7Ci0JCVhtbEVsZW1lbnQgZWxlbWVudFhtbCA9IHN1cGVyLmdldFhtbEVsZW1lbnQoaW5jbHVkZVJlZmVyZW5jZXMpOwotCi0JCWlmIChpbmNsdWRlUmVmZXJlbmNlcykgewotCQkJTGlzdCBjb250ZW50RWxlbWVudHMgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwbkZlYXR1cmVWYWx1ZShzdXBlci5lbGVtZW50LAotCQkJCQlBc3NvY2lhdGlvbkhlbHBlci5TdXBwb3J0aW5nTWF0ZXJpYWxfQ29udGVudEVsZW1lbnRzLAotCQkJCQlsYXlvdXRNYW5hZ2VyLmdldEVsZW1lbnRSZWFsaXplcigpKTsKLQkJCQotCQkJTGlzdCBhY3Rpdml0aWVzID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMG5GZWF0dXJlVmFsdWUoc3VwZXIuZWxlbWVudCwKLQkJCQkJQXNzb2NpYXRpb25IZWxwZXIuU3VwcG9ydGluZ01hdGVyaWFsX0JyZWFrZG93bkVsZW1lbnRzLCBsYXlvdXRNYW5hZ2VyCi0JCQkJCQkJLmdldEVsZW1lbnRSZWFsaXplcigpKTsKLQotCQkJY29udGVudEVsZW1lbnRzLmFkZEFsbChhY3Rpdml0aWVzKTsKLQotCQkJYWRkUmVmZXJlbmNlcyhBc3NvY2lhdGlvbkhlbHBlci5TdXBwb3J0aW5nTWF0ZXJpYWxfQ29udGVudEVsZW1lbnRzLCBlbGVtZW50WG1sLCAiY29udGVudEVsZW1lbnRzIiwgY29udGVudEVsZW1lbnRzKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJcmV0dXJuIGVsZW1lbnRYbWw7Ci0JfQotCi0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZWxlbWVudHMvVGFza0Rlc2NyaXB0b3JMYXlvdXQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZWxlbWVudHMvVGFza0Rlc2NyaXB0b3JMYXlvdXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzc1ZjZmMy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L2VsZW1lbnRzL1Rhc2tEZXNjcmlwdG9yTGF5b3V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LmVsZW1lbnRzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlZEFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuU3VwcHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LkVsZW1lbnRMYXlvdXRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5JRWxlbWVudExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQudXRpbC5YbWxFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuTGlicmFyeVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yOwotCi0vKioKLSAqIFRoZSBsYXlvdXQgZm9yIGEgVGFza0Rlc2NyaXB0b3IuCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgVGFza0Rlc2NyaXB0b3JMYXlvdXQgZXh0ZW5kcyBEZXNjcmlwdG9yTGF5b3V0IHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIENvbGxlY3Rpb248RVN0cnVjdHVyYWxGZWF0dXJlPiBleHRyYUZlYXR1cmVzRnJvbVRhc2sgPSBBcnJheXMuYXNMaXN0KG5ldyBFU3RydWN0dXJhbEZlYXR1cmVbXSB7Ci0JCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrX1Rvb2xNZW50b3JzKCkKLQl9KTsKLQkKLQlwdWJsaWMgVGFza0Rlc2NyaXB0b3JMYXlvdXQoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdChFbGVtZW50TGF5b3V0TWFuYWdlciBsYXlvdXRNYW5hZ2VyLCBNZXRob2RFbGVtZW50IGVsZW1lbnQpIHsKLQkJc3VwZXIuX19pbml0KGxheW91dE1hbmFnZXIsIGVsZW1lbnQpOwotCX0KLQotCXB1YmxpYyBYbWxFbGVtZW50IGdldFhtbEVsZW1lbnQoYm9vbGVhbiBpbmNsdWRlUmVmZXJlbmNlcykgewotCQlyZXR1cm4gc3VwZXIuZ2V0WG1sRWxlbWVudChpbmNsdWRlUmVmZXJlbmNlcyk7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LmVsZW1lbnRzLkFic3RyYWN0RWxlbWVudExheW91dCNsb2FkUmVmZXJlbmNlcyhYbWxFbGVtZW50LCBib29sZWFuKQotCSAqLwotCXB1YmxpYyB2b2lkIGxvYWRSZWZlcmVuY2VzKFhtbEVsZW1lbnQgZWxlbWVudFhtbCwgYm9vbGVhbiBpbmNsdWRlUmVmZXJlbmNlcykgewotCQlMaXN0IGZlYXR1cmVzID0gTGlicmFyeVV0aWwuZ2V0U3RydWN0dXJhbEZlYXR1cmVzKGVsZW1lbnQpOwotLy8JCUxpc3QgcHJvcGVydGllcyA9IGVsZW1lbnQuZ2V0SW5zdGFuY2VQcm9wZXJ0aWVzKCk7Ci0JCWlmIChmZWF0dXJlcyAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGZlYXR1cmVzLnNpemUoKTsgaSsrKSB7Ci0JCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSAoRVN0cnVjdHVyYWxGZWF0dXJlKSBmZWF0dXJlcwotCQkJCQkJLmdldChpKTsKLQkJCQlpZiAoZmVhdHVyZSA9PSBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJLmdldFRhc2tEZXNjcmlwdG9yX1NlbGVjdGVkU3RlcHMoKSkgewotCQkJCQkvLyBuZWVkIHRvIGhhbmRsZSB0aGUgc3RlcCBjb250ZW50cyBieSBmaXhpbmcgdGhlIGxpbmtzCi0JCQkJCXByb2Nlc3NTdGVwcyhlbGVtZW50WG1sLCBpbmNsdWRlUmVmZXJlbmNlcyk7Ci0KLQkJCQl9IGVsc2UgaWYgKGZlYXR1cmUgPT0gVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCS5nZXRXb3JrQnJlYWtkb3duRWxlbWVudF9MaW5rVG9QcmVkZWNlc3NvcigpKSB7Ci0JCQkJCXN1cGVyLmxvYWRXb3JrT3JkZXIoZWxlbWVudFhtbCk7Ci0JCQkJfSBlbHNlIGlmIChmZWF0dXJlLmdldEVUeXBlKCkgaW5zdGFuY2VvZiBFQ2xhc3MpIHsKLQkJCQkJbG9hZEZlYXR1cmUoZmVhdHVyZSwgZWxlbWVudFhtbCwgaW5jbHVkZVJlZmVyZW5jZXMpOwotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQkJZWxlbWVudFhtbC5zZXRBdHRyaWJ1dGUoIlNob3dGdWxsTWV0aG9kQ29udGVudCIsIChsYXlvdXRNYW5hZ2VyLmdldFZhbGlkYXRvcigpLnNob3dFeHRyYUluZm9Gb3JEZXNjcmlwdG9ycygpKSA/ICJ0cnVlIiA6ICJmYWxzZSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkKLQkJaWYgKChzdXBlci5lbGVtZW50TGF5b3V0ICE9IG51bGwgKSAmJiBsYXlvdXRNYW5hZ2VyLmdldFZhbGlkYXRvcigpLnNob3dFeHRyYUluZm9Gb3JEZXNjcmlwdG9ycygpICkgewotCQkJLy8gYWxzbyBsb2FkIHRoZSBsaW5rZWQgZWxlbWVudCByZWZlcmVuY2VkIGluZm9ybWF0aW9uCi0JCQlmb3IgKEl0ZXJhdG9yPEVTdHJ1Y3R1cmFsRmVhdHVyZT4gaXRlcmF0b3IgPSBnZXRFeHRyYUZlYXR1cmVzRnJvbUNvbnRlbnRFbGVtZW50KCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gaXRlcmF0b3IubmV4dCgpOwotCQkJCXN1cGVyLmVsZW1lbnRMYXlvdXQubG9hZEZlYXR1cmUoZmVhdHVyZSwgZWxlbWVudFhtbCwgZmFsc2UpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHByb2Nlc3NTdGVwcyhYbWxFbGVtZW50IGVsZW1lbnRYbWwsIGJvb2xlYW4gaW5jbHVkZVJlZmVyZW5jZXMpIHsKLQkJCi0JCS8vIDE5NjA5NCAtIFRhc2sgZGVzY3JpcHRvciBwYWdlIHNob3VsZCBzaG93IHRoZSByZWFsaXplZCBjb250ZW50IG9mIHRoZSBsaW5rZWQgZWxlbWVudAotCQkKLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrRGVzY3JpcHRvcl9TZWxlY3RlZFN0ZXBzKCk7Ci0JCVN0cmluZyBmZWF0dXJlX25hbWUgPSBmZWF0dXJlLmdldE5hbWUoKTsKLQotCQlMaXN0IGl0ZW1zOwotCQkKLQkJLy8gcGVyIFBldGVyLCB0aGlzIGlzIG5vdCB0aGUgcmlnaHQgYmVoYXZpb3IKLQkJLy8gZGVzY3JpcHRvcnMgc2hvdWxkIGFsd2F5cyBzaG93IHRoZSBzZWxlY3RlZCBzdGVwcyBvZiB0aGUgb3JpZ2luYWwgZWxlbWVudAotCQkvLyBpdCBzaG91bGQgbm90IHNob3cgdGhlIHJlYWxpemVkIHN0ZXBzCi0JCS8vIHNvIHJvbGxiYWNrIHRvIHRoZSBvbGQgYmVoYXZpb3IKLQkJLy8gSmluaHVhIFhpIDA4LzI4LzA3Ci0JCS8qCi0JCWlmICggbGF5b3V0TWFuYWdlci5nZXRWYWxpZGF0b3IoKS5zaG93RXh0cmFJbmZvRm9yRGVzY3JpcHRvcnMoKSkgewotCQkJaWYgKGxpbmtlZEVsZW1lbnQgPT0gbnVsbCkgewotCQkJCWl0ZW1zID0gbnVsbDsKLQkJCX0gZWxzZSB7Ci0JCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGYgPSBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrX1N0ZXBzKCk7Ci0JCQkJaXRlbXMgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwbkZlYXR1cmVWYWx1ZShsaW5rZWRFbGVtZW50LCBmLAotCQkJCQkJZ2V0TGF5b3V0TWdyKCkuZ2V0RWxlbWVudFJlYWxpemVyKCkpOwotCQkJfQotCi0JCX0gZWxzZSAKLQkJKi8KLQkJewotCQkJaXRlbXMgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwbkZlYXR1cmVWYWx1ZShlbGVtZW50LCBmZWF0dXJlLAotCQkJCQlnZXRMYXlvdXRNZ3IoKS5nZXRFbGVtZW50UmVhbGl6ZXIoKSk7Ci0JCX0KLQkJCi0JCVhtbEVsZW1lbnQgc3RlcFhtbCA9IGVsZW1lbnRYbWwKLQkJCQkubmV3Q2hpbGQoInJlZmVyZW5jZUxpc3QiKS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCBmZWF0dXJlX25hbWUpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCQlpZiAoaXRlbXMgIT0gbnVsbCAmJiBpdGVtcy5zaXplKCkgPiAwKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gaXRlbXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBlID0gaXQubmV4dCgpOwotCQkJCWlmIChlIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJCQlNZXRob2RFbGVtZW50IG1lID0gKE1ldGhvZEVsZW1lbnQpIGU7Ci0JCQkJCWUgPSBDb25maWd1cmF0aW9uSGVscGVyLmdldENhbGN1bGF0ZWRFbGVtZW50KG1lLAotCQkJCQkJCWxheW91dE1hbmFnZXIuZ2V0Q29uZmlndXJhdGlvbigpKTsKLQkJCQkJaWYgKGUgIT0gbnVsbCkgewotCQkJCQkJSUVsZW1lbnRMYXlvdXQgbCA9IGxheW91dE1hbmFnZXIuZ2V0TGF5b3V0KG1lLCB0cnVlKTsKLQkJCQkJCWlmIChsICE9IG51bGwpIHsKLQkJCQkJCQlsLnNldENvbnRlbnRUYXJnZXQoZWxlbWVudCk7Ci0JCQkJCQkJc3RlcFhtbC5hZGRDaGlsZChsCi0JCQkJCQkJCQkuZ2V0WG1sRWxlbWVudChDb25maWd1cmF0aW9uSGVscGVyCi0JCQkJCQkJCQkJCS5pc0Rlc2NyaXB0aW9uRWxlbWVudChtZSkgPyB0cnVlCi0JCQkJCQkJCQkJCTogaW5jbHVkZVJlZmVyZW5jZXMpKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBDb2xsZWN0aW9uPEVTdHJ1Y3R1cmFsRmVhdHVyZT4gZ2V0RXh0cmFGZWF0dXJlc0Zyb21Db250ZW50RWxlbWVudCgpIHsKLQkJQXJyYXlMaXN0PEVTdHJ1Y3R1cmFsRmVhdHVyZT4gZmVhdHVyZXMgPSBuZXcgQXJyYXlMaXN0PEVTdHJ1Y3R1cmFsRmVhdHVyZT4oZXh0cmFGZWF0dXJlc0Zyb21UYXNrKTsKLQkJZmVhdHVyZXMuYWRkQWxsKHN1cGVyLmdldEV4dHJhRmVhdHVyZXNGcm9tQ29udGVudEVsZW1lbnQoKSk7Ci0JCXJldHVybiBmZWF0dXJlczsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1N1cHByZXNzZWQoU3VwcHJlc3Npb24gc3VwLCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgT2JqZWN0IGVsZW1lbnQpIHsKLQkJCi0JCS8vIG1ha2Ugc3VyZSBhbGwgY2FzZXMgYXJlIGNvdmVyZWQKLQkJaWYgKCBlbGVtZW50IGluc3RhbmNlb2YgUm9sZURlc2NyaXB0b3IgfHwgZWxlbWVudCBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0RGVzY3JpcHRvciApIHsKLQkJCVN0cmluZyBwYXRoID0gc3VwZXIubWFrZVBhdGgoc3VwZXIuZWxlbWVudFByb2Nlc3NQYXRoLCAoTWV0aG9kRWxlbWVudCllbGVtZW50KTsKLQkJCVN0cmluZ1tdIHBhdGhzID0gc3VwZXIuZ2V0UGF0aEFycmF5KHBhdGgpOwotCQkJQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSA9IGxheW91dE1hbmFnZXIuZ2V0Q0JTQWRhcHRlckZhY3RvcnkoKTsKLQkJCU9iamVjdCB3cmFwcGVyID0gc3VwLmdldE9iamVjdEJ5UGF0aChwYXRocywgYWRhcHRlckZhY3RvcnkpOwotCQkJaWYgKCB3cmFwcGVyID09IG51bGwgKSB7Ci0JCQkJd3JhcHBlciA9IGVsZW1lbnQ7Ci0JCQl9Ci0JCQkKLQkJCXJldHVybiBzdXAuaXNTdXBwcmVzc2VkKHdyYXBwZXIsIGZlYXR1cmUpOwotCQotCQl9IGVsc2UgewotCQkJcmV0dXJuIHN1cGVyLmlzU3VwcHJlc3NlZChzdXAsIGZlYXR1cmUsIGVsZW1lbnQpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9lbGVtZW50cy9UYXNrTGF5b3V0LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L2VsZW1lbnRzL1Rhc2tMYXlvdXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGFmOTMwZi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L2VsZW1lbnRzL1Rhc2tMYXlvdXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuZWxlbWVudHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLkVsZW1lbnRSZWFsaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuRWxlbWVudExheW91dE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LklFbGVtZW50TGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC51dGlsLlhtbEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS51dGlsLk9wcG9zaXRlRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQXNzb2NpYXRpb25IZWxwZXI7Ci0KLQotLyoqCi0gKiBUaGUgZWxlbWVudCBsYXlvdXQgZm9yIGEgVGFzay4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQGF1dGhvciBXZWlwaW5nIEx1Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBUYXNrTGF5b3V0IGV4dGVuZHMgQWJzdHJhY3RFbGVtZW50TGF5b3V0IHsKLQotCXB1YmxpYyBUYXNrTGF5b3V0KCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXQoRWxlbWVudExheW91dE1hbmFnZXIgbGF5b3V0TWFuYWdlciwgTWV0aG9kRWxlbWVudCBlbGVtZW50KSB7Ci0JCXN1cGVyLl9faW5pdChsYXlvdXRNYW5hZ2VyLCBlbGVtZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5JRWxlbWVudExheW91dCNnZXRYbWxFbGVtZW50KGJvb2xlYW4pCi0JICovCi0JcHVibGljIFhtbEVsZW1lbnQgZ2V0WG1sRWxlbWVudChib29sZWFuIGluY2x1ZGVSZWZlcmVuY2VzKSB7Ci0JCVhtbEVsZW1lbnQgZWxlbWVudFhtbCA9IHN1cGVyLmdldFhtbEVsZW1lbnQoaW5jbHVkZVJlZmVyZW5jZXMpOwotCQlpZiAoaW5jbHVkZVJlZmVyZW5jZXMpIHsKLQkJCVRhc2sgdGFzayA9IChUYXNrKSBzdXBlci5lbGVtZW50OwotCQkJTGlzdCBwZXJmb3JtaW5nUm9sZXMgPSB0YXNrLmdldFBlcmZvcm1lZEJ5KCk7Ci0JCQlmb3IgKGphdmEudXRpbC5JdGVyYXRvciBpdG9yID0gcGVyZm9ybWluZ1JvbGVzLml0ZXJhdG9yKCk7IGl0b3IuaGFzTmV4dCgpOykgewotCQkJCVJvbGUgcGVyZm9ybWluZ1JvbGUgPSAoUm9sZSkgaXRvci5uZXh0KCk7Ci0JCQkJaWYgKHBlcmZvcm1pbmdSb2xlICE9IG51bGwpIHsKLQkJCQkJTWV0aG9kRWxlbWVudCByb2xlID0gQ29uZmlndXJhdGlvbkhlbHBlci5nZXRDYWxjdWxhdGVkRWxlbWVudCgKLQkJCQkJCQkoTWV0aG9kRWxlbWVudCkgcGVyZm9ybWluZ1JvbGUsIGxheW91dE1hbmFnZXIKLQkJCQkJCQkJCS5nZXRDb25maWd1cmF0aW9uKCkpOwotCQkJCQlpZiAocm9sZSAhPSBudWxsKSB7Ci0JCQkJCQlTdHJpbmcgcm9sZU5hbWUgPSAoKFJvbGUpIHJvbGUpLmdldFByZXNlbnRhdGlvbk5hbWUoKTsKLQkJCQkJCWlmIChyb2xlTmFtZSA9PSBudWxsIHx8IHJvbGVOYW1lLmxlbmd0aCgpID09IDApIHsKLQkJCQkJCQlyb2xlTmFtZSA9IHJvbGUuZ2V0TmFtZSgpOwotCQkJCQkJfQotCQkJCQkJZWxlbWVudFhtbC5zZXRBdHRyaWJ1dGUoInBlcmZvcm1pbmdSb2xlTmFtZSIsIHJvbGVOYW1lKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJYWRkUmVmZXJlbmNlKFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tfUGVyZm9ybWVkQnkoKSwgZWxlbWVudFhtbCwgInBlcmZvcm1pbmdSb2xlIiwgcm9sZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCQotCi0JCQkvLyBjYWxjdWxhdGUgdGhlIGNhdGVnb3JpZXMgb3Bwb3NpdGUgZmVhdHVyZQotCQkJLy8gbXVsdGlwbGljaXR5IGNoYW5nZSBmb3Igb3Bwb3NpdGUgZmVhdHVyZXMKLQkJCUxpc3QgZGlzY2lwbGluZXMgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwbkZlYXR1cmVWYWx1ZSgKLQkJCQkJc3VwZXIuZWxlbWVudCwgQXNzb2NpYXRpb25IZWxwZXIuVGFza19EaXNjaXBsaW5lcywKLQkJCQkJbGF5b3V0TWFuYWdlci5nZXRFbGVtZW50UmVhbGl6ZXIoKSk7Ci0JCQlhZGRSZWZlcmVuY2VzKEFzc29jaWF0aW9uSGVscGVyLlRhc2tfRGlzY2lwbGluZXMsIGVsZW1lbnRYbWwsICJkaXNjaXBsaW5lcyIsIGRpc2NpcGxpbmVzKTsgLy8kTk9OLU5MUy0xJAotCi0JCQlMaXN0IHVzZXJjYXRlZ29yaWVzID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMG5GZWF0dXJlVmFsdWUoCi0JCQkJCXN1cGVyLmVsZW1lbnQsCi0JCQkJCUFzc29jaWF0aW9uSGVscGVyLkRlc2NyaWJhYmxlRWxlbWVudF9DdXN0b21DYXRlZ29yaWVzLAotCQkJCQlsYXlvdXRNYW5hZ2VyLmdldEVsZW1lbnRSZWFsaXplcigpKTsKLQkJCXByb2Nlc3NDaGlsZChBc3NvY2lhdGlvbkhlbHBlci5EZXNjcmliYWJsZUVsZW1lbnRfQ3VzdG9tQ2F0ZWdvcmllcywgCi0JCQkJCWVsZW1lbnRYbWwKLQkJCQkJCQkubmV3Q2hpbGQoInJlZmVyZW5jZUxpc3QiKS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCAiY3VzdG9tQ2F0ZWdvcmllcyIpLCB1c2VyY2F0ZWdvcmllcywgZmFsc2UpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCi0JCQkvLyBhZGQgdGhlIGRlc2NyaXB0b3JzIHJlZmVyZW5jaW5nIHRoaXMgZWxlbWVudAotCQkJc3VwZXIucHJvY2Vzc0Rlc2NyaXB0b3JzKGVsZW1lbnRYbWwpOwotCi0JCX0KLQkJZWxlbWVudFhtbC5zZXRBdHRyaWJ1dGUoIlNob3dGdWxsTWV0aG9kQ29udGVudCIsIChsYXlvdXRNYW5hZ2VyLmdldFZhbGlkYXRvcigpLnNob3dFeHRyYUluZm9Gb3JEZXNjcmlwdG9ycygpKSA/ICJ0cnVlIiA6ICJmYWxzZSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkKLQkJcmV0dXJuIGVsZW1lbnRYbWw7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHByb2Nlc3NHcmFuZENoaWxkKE9iamVjdCBmZWF0dXJlLAotCQkJTWV0aG9kRWxlbWVudCBjaGlsZEVsZW1lbXQsIElFbGVtZW50TGF5b3V0IGNoaWxkTGF5b3V0LAotCQkJWG1sRWxlbWVudCBjaGlsZFhtbEVsZW1lbnQpIHsKLQkJaWYgKCEoY2hpbGRMYXlvdXQgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdExheW91dCkKLQkJCQl8fCBjaGlsZFhtbEVsZW1lbnQgPT0gbnVsbAotCQkJCXx8ICEoY2hpbGRFbGVtZW10IGluc3RhbmNlb2YgV29ya1Byb2R1Y3QpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKCEgKChXb3JrUHJvZHVjdCljaGlsZEVsZW1lbXQpLmdldElzQWJzdHJhY3QoKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlXb3JrUHJvZHVjdExheW91dCB3cENoaWxkTGF5b3V0ID0gKFdvcmtQcm9kdWN0TGF5b3V0KSBjaGlsZExheW91dDsKLQkJRWxlbWVudFJlYWxpemVyIHJlYWxpemVyID0gd3BDaGlsZExheW91dC5sYXlvdXRNYW5hZ2VyCi0JCQkJLmdldEVsZW1lbnRSZWFsaXplcigpOwotCi0JCWlmIChmZWF0dXJlID09IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tfTWFuZGF0b3J5SW5wdXQoKSB8fAotCQkJZmVhdHVyZSA9PSBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrX09wdGlvbmFsSW5wdXQoKSB8fAotCQkJZmVhdHVyZSA9PSBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrX091dHB1dCgpKSB7Ci0JCQlPcHBvc2l0ZUZlYXR1cmUgb0Z1bGZpbGxpbmdGZWF0dXJlID0gQXNzb2NpYXRpb25IZWxwZXIuRnVsRmlsbHNfRnVsbEZpbGxhYmxlRWxlbWVudHM7Ci0JCQlMaXN0IGl0ZW1zID0gd3BDaGlsZExheW91dC5jYWxjMG5GZWF0dXJlVmFsdWUoY2hpbGRFbGVtZW10LCBvRnVsZmlsbGluZ0ZlYXR1cmUsIHJlYWxpemVyKTsKLQkJCWl0ZW1zID0gZ2V0VGFnUXVhbGlmaWVkTGlzdChyZWFsaXplci5nZXRDb25maWd1cmF0aW9uKCksIGl0ZW1zKTsKLQkJCXdwQ2hpbGRMYXlvdXQuYWRkUmVmZXJlbmNlcyhvRnVsZmlsbGluZ0ZlYXR1cmUsIGNoaWxkWG1sRWxlbWVudCwgb0Z1bGZpbGxpbmdGZWF0dXJlCi0JCQkJCS5nZXROYW1lKCksIGl0ZW1zKTsKLQkJfQotCX0KLQkKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZWxlbWVudHMvVGVhbVByb2ZpbGVMYXlvdXQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZWxlbWVudHMvVGVhbVByb2ZpbGVMYXlvdXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjhlYTM0Ny4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L2VsZW1lbnRzL1RlYW1Qcm9maWxlTGF5b3V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LmVsZW1lbnRzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5FbGVtZW50TGF5b3V0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQudXRpbC5YbWxFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdG9yOwotCi0KLS8qKgotICogVGVhbSBQcm9maWxlIGxheW91dCBmb3IgYnJvd3NpbmcKLSAqIAotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKgotICovCi1wdWJsaWMgY2xhc3MgVGVhbVByb2ZpbGVMYXlvdXQgZXh0ZW5kcyBBYnN0cmFjdFByb2Nlc3NFbGVtZW50TGF5b3V0IHsKLQotCXB1YmxpYyBUZWFtUHJvZmlsZUxheW91dCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0KEVsZW1lbnRMYXlvdXRNYW5hZ2VyIGxheW91dE1hbmFnZXIsIE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgewotCQlzdXBlci5fX2luaXQobGF5b3V0TWFuYWdlciwgZWxlbWVudCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuSUVsZW1lbnRMYXlvdXQjZ2V0WG1sRWxlbWVudChib29sZWFuKQotCSAqLwotCXB1YmxpYyBYbWxFbGVtZW50IGdldFhtbEVsZW1lbnQoYm9vbGVhbiBpbmNsdWRlUmVmZXJlbmNlcykgewotCQlyZXR1cm4gc3VwZXIuZ2V0WG1sRWxlbWVudChpbmNsdWRlUmVmZXJlbmNlcyk7Ci0JfQotCS8qKgotCSAqIGxvYWQgdGhlIG5vbi1hdHRyaWJ1dGUgZmVhdHVyZQotCSAqIAotCSAqIEBwYXJhbSBmZWF0dXJlCi0JICogQHBhcmFtIGVsZW1lbnRYbWwKLQkgKiBAcGFyYW0gaW5jbHVkZVJlZmVyZW5jZXMKLQkgKi8KLQlwdWJsaWMgdm9pZCBsb2FkRmVhdHVyZShFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgWG1sRWxlbWVudCBlbGVtZW50WG1sLAotCQkJYm9vbGVhbiBpbmNsdWRlUmVmZXJlbmNlcykgewotCQlpZiAoIShmZWF0dXJlLmdldEVUeXBlKCkgaW5zdGFuY2VvZiBFQ2xhc3MpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlTdHJpbmcgbmFtZSA9IGZlYXR1cmUuZ2V0TmFtZSgpOwotCi0JCWlmICghZmVhdHVyZS5pc01hbnkoKSkgewotCQkJTWV0aG9kRWxlbWVudCBlID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMDFGZWF0dXJlVmFsdWUoZWxlbWVudCwKLQkJCQkJZmVhdHVyZSwgbGF5b3V0TWFuYWdlci5nZXRFbGVtZW50UmVhbGl6ZXIoKSk7Ci0JCQkvLyBCcm93c2luZyBzdG9wcyB3b3JraW5nIHdoZW4gYSByb2xlIGlzIHNldCB0bwotCQkJLy8gcmVwbGFjZWQgYW5vdGhlciByb2xlCi0JCQkvLyBmb3IgcmVwbGFjZXIsIHRoZSBiYXNlIHdpbGwgYmUgZXZhbHVhdGVkIHRvIHRoZSByZXBsYWNlcgotCQkJLy8gYW5kIGNhdXNpbmcgZGVhZGxvY2sKLQkJCWlmIChlICE9IG51bGwgJiYgZSAhPSBlbGVtZW50KSB7Ci0JCQkJYm9vbGVhbiBzaG93RGV0YWlsID0gKENvbmZpZ3VyYXRpb25IZWxwZXIKLQkJCQkJCS5pc0Rlc2NyaXB0aW9uRWxlbWVudChlKQotCQkJCS8qCi0JCQkJICogfHwgKHAgPT0KLQkJCQkgKiBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRNZXRob2RVbml0X0NvcHlyaWdodFN0YXRlbWVudCgpKQotCQkJCSAqLykgPyB0cnVlIDogaW5jbHVkZVJlZmVyZW5jZXM7Ci0KLQkJCQlpZiAoIGFjY2VwdEZlYXR1cmVWYWx1ZShmZWF0dXJlLCBlKSApIHsKLQkJCQkJcHJvY2Vzc0NoaWxkKGZlYXR1cmUsIAotCQkJCQkJCWVsZW1lbnRYbWwKLQkJCQkJCQkJCS5uZXdDaGlsZCgicmVmZXJlbmNlIikuc2V0QXR0cmlidXRlKCJuYW1lIiwgbmFtZSksIGUsIHNob3dEZXRhaWwpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQl9Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoZmVhdHVyZS5pc01hbnkoKSkgewotCQkJaWYgKGlzQnJlYWtkb3duRWxlbWVudF9HdWlkYW5jZXMoZmVhdHVyZSkpIHsKLQkJCQlzdXBlci5sb2FkRmVhdHVyZShmZWF0dXJlLCBlbGVtZW50WG1sLCBpbmNsdWRlUmVmZXJlbmNlcyk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJTGlzdCBwdiA9IENvbmZpZ3VyYXRpb25IZWxwZXIuY2FsYzBuRmVhdHVyZVZhbHVlKGVsZW1lbnQsIGZlYXR1cmUsCi0JCQkJCWdldExheW91dE1ncigpLmdldEVsZW1lbnRSZWFsaXplcigpKTsKLQkJCUxpc3Qgcm9sZURlc2NMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJaWYgKChwdiAhPSBudWxsKSAmJiAoIXB2LmlzRW1wdHkoKSkpCi0JCQl7Ci0JCQkJZm9yIChJdGVyYXRvciBpdG9yPXB2Lml0ZXJhdG9yKCk7IGl0b3IuaGFzTmV4dCgpOykKLQkJCQl7Ci0JCQkJCU9iamVjdCBvYmogPSBpdG9yLm5leHQoKTsKLQkJCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFJvbGVEZXNjcmlwdG9yKSAKLQkJCQkJewotCQkJCQkJUm9sZURlc2NyaXB0b3Igcm9sZURlc2MgPSAoUm9sZURlc2NyaXB0b3IpIG9iajsKLQkJCQkJCWlmICgocm9sZURlc2MuZ2V0U3VwZXJBY3Rpdml0aWVzKCkgPT0gbnVsbCkKLQkJCQkJCQl8fCAocm9sZURlc2MuZ2V0U3VwZXJBY3Rpdml0aWVzKCkgPT0gbnVsbCkpCi0JCQkJCQkJcm9sZURlc2NMaXN0LmFkZChvYmopOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQlpZiAoIGFjY2VwdEZlYXR1cmVWYWx1ZShmZWF0dXJlLCByb2xlRGVzY0xpc3QpICYmIHJvbGVEZXNjTGlzdC5zaXplKCkgPiAwICkgewotCQkJCWFkZFJlZmVyZW5jZXMoZmVhdHVyZSwgZWxlbWVudFhtbCwgbmFtZSwgcm9sZURlc2NMaXN0KTsKLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZWxlbWVudHMvVGVtcGxhdGVMYXlvdXQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZWxlbWVudHMvVGVtcGxhdGVMYXlvdXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWEzY2QyOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L2VsZW1lbnRzL1RlbXBsYXRlTGF5b3V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LmVsZW1lbnRzOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5yZWdleC5NYXRjaGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLkZpbGVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuRWxlbWVudExheW91dE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LnV0aWwuWG1sRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLlJlc291cmNlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3VpZGFuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQXNzb2NpYXRpb25IZWxwZXI7Ci0KLQotLyoqCi0gKiBUaGUgZWxlbWVudCBsYXlvdXQgZm9yIGEgVGVtcGxhdGUuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFRlbXBsYXRlTGF5b3V0IGV4dGVuZHMgQWJzdHJhY3RFbGVtZW50TGF5b3V0IHsKLQotCXB1YmxpYyBUZW1wbGF0ZUxheW91dCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0KEVsZW1lbnRMYXlvdXRNYW5hZ2VyIGxheW91dE1hbmFnZXIsIE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgewotCQlzdXBlci5fX2luaXQobGF5b3V0TWFuYWdlciwgZWxlbWVudCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuSUVsZW1lbnRMYXlvdXQjZ2V0WG1sRWxlbWVudChib29sZWFuKQotCSAqLwotCXB1YmxpYyBYbWxFbGVtZW50IGdldFhtbEVsZW1lbnQoYm9vbGVhbiBpbmNsdWRlUmVmZXJlbmNlcykgewotCQlYbWxFbGVtZW50IGVsZW1lbnRYbWwgPSBzdXBlci5nZXRYbWxFbGVtZW50KGluY2x1ZGVSZWZlcmVuY2VzKTsKLQotCQlpZiAoaW5jbHVkZVJlZmVyZW5jZXMpIHsKLQkJCUxpc3QgY29udGVudEVsZW1lbnRzID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMG5GZWF0dXJlVmFsdWUoc3VwZXIuZWxlbWVudCwKLQkJCQkJQXNzb2NpYXRpb25IZWxwZXIuVGVtcGxhdGVfV29ya1Byb2R1Y3RzLCBsYXlvdXRNYW5hZ2VyCi0JCQkJCQkJLmdldEVsZW1lbnRSZWFsaXplcigpKTsKLQkJCWFkZFJlZmVyZW5jZXMoQXNzb2NpYXRpb25IZWxwZXIuVGVtcGxhdGVfV29ya1Byb2R1Y3RzLCBlbGVtZW50WG1sLCAiY29udGVudEVsZW1lbnRzIiwgY29udGVudEVsZW1lbnRzKTsgLy8kTk9OLU5MUy0xJAotCi0JCQlHdWlkYW5jZSBndWlkYW5jZSA9IChHdWlkYW5jZSkgc3VwZXIuZWxlbWVudDsKLQkJCUNvbnRlbnREZXNjcmlwdGlvbiBjb250ZW50ID0gKENvbnRlbnREZXNjcmlwdGlvbikgZ3VpZGFuY2UKLQkJCQkJLmdldFByZXNlbnRhdGlvbigpOwotCQkJaWYgKGNvbnRlbnQgIT0gbnVsbCkgewotCQkJCQotCQkJCS8vIEF1dGhvcmluZzogIFRlbXBsYXRlIGF0dGFjaG1lbnRzIG9mIGEgY29udHJpYnV0aW5nIHRlbXBsYXRlIGd1aWRhbmNlIGVsZW1lbnQgYXJlIG5vdCBhcHBlbmRlZCB0byB0aGUgYmFzZSBsaXN0IG9mIGF0dGFjaG1lbnRzCQkJCQotCQkJCS8vU3RyaW5nIGF0dGFjaG1lbnRTdHJpbmcgPSAoKG9yZy5lY2xpcHNlLmVwZi51bWEuR3VpZGFuY2VEZXNjcmlwdGlvbiljb250ZW50KS5nZXRBdHRhY2htZW50cygpOwotCQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0R3VpZGFuY2VEZXNjcmlwdGlvbl9BdHRhY2htZW50cygpOwotCQkJCVN0cmluZyBhdHRhY2htZW50U3RyaW5nID0gKFN0cmluZylDb25maWd1cmF0aW9uSGVscGVyLmNhbGNBdHRyaWJ1dGVGZWF0dXJlVmFsdWUoY29udGVudCwgc3VwZXIuZWxlbWVudCwgZmVhdHVyZSwgc3VwZXIubGF5b3V0TWFuYWdlci5nZXRDb25maWd1cmF0aW9uKCkpOwotCQkJCWlmICggKGF0dGFjaG1lbnRTdHJpbmcgIT0gbnVsbCkgJiYgKGF0dGFjaG1lbnRTdHJpbmcuaW5kZXhPZihDb25maWd1cmF0aW9uSGVscGVyLkFUVFJJQlVURV9WQUxVRV9TRVBFUkFUT1IpID4gMCkgKQotCQkJCXsKLQkJCQkJYXR0YWNobWVudFN0cmluZyA9IGF0dGFjaG1lbnRTdHJpbmcucmVwbGFjZUFsbChDb25maWd1cmF0aW9uSGVscGVyLkFUVFJJQlVURV9WQUxVRV9TRVBFUkFUT1IsIFRuZ1V0aWwuR1VJREFOQ0VfRklMRVNUUklOR19TRVBBUkFUT1IpOyAKLQkJCQl9Ci0JCQkJTGlzdCBhdHRhY2htZW50TGlzdCA9IFRuZ1V0aWwuY29udmVydEd1aWRhbmNlQXR0YWNobWVudHNUb0xpc3QoYXR0YWNobWVudFN0cmluZyk7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gYXR0YWNobWVudExpc3QuaXRlcmF0b3IoKTtpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJU3RyaW5nIGF0dGFjaG1lbnRGaWxlID0gKFN0cmluZykgaXRlci5uZXh0KCk7Ci0JCQkJCWlmIChhdHRhY2htZW50RmlsZSAhPSBudWxsKSB7Ci0JCQkJCQlNYXRjaGVyIG0gPSBSZXNvdXJjZUhlbHBlci5wX3RlbXBsYXRlX2F0dGFjaG1lbnRfdXJsLm1hdGNoZXIoYXR0YWNobWVudEZpbGUpOwotCQkJCQkJaWYgKCFtLmZpbmQoKSkgewotCQkJCQkJCVN0cmluZyBmaWxlTmFtZSA9IEZpbGVVdGlsLmdldEZpbGVOYW1lKGF0dGFjaG1lbnRGaWxlKTsKLQkJCQkJCQllbGVtZW50WG1sLm5ld0NoaWxkKCJhdHRyaWJ1dGUiKS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCQkJCSJhdHRhY2hlZEZpbGUiKS5zZXRBdHRyaWJ1dGUoIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCSJ1cmwiLCAiZmlsZTovLyIgKyBhdHRhY2htZW50RmlsZSkgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIAotCQkJCQkJCQkJLnNldEF0dHJpYnV0ZSgiZmlsZU5hbWUiLCBmaWxlTmFtZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJU3RyaW5nIGZpbGVOYW1lID0gbS5ncm91cCgyKTsKLQkJCQkJCQllbGVtZW50WG1sLm5ld0NoaWxkKCJhdHRyaWJ1dGUiKS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCQkJCSJhdHRhY2hlZEZpbGUiKS5zZXRBdHRyaWJ1dGUoIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCSJ1cmwiLCBtLmdyb3VwKDEpKSAvLyROT04tTkxTLTEkIAotCQkJCQkJCQkJLnNldEF0dHJpYnV0ZSgiZmlsZU5hbWUiLCBmaWxlTmFtZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiBlbGVtZW50WG1sOwotCX0KLQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L2VsZW1lbnRzL1Rvb2xNZW50b3JMYXlvdXQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZWxlbWVudHMvVG9vbE1lbnRvckxheW91dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNzUxOTExLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZWxlbWVudHMvVG9vbE1lbnRvckxheW91dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LmVsZW1lbnRzOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LkVsZW1lbnRMYXlvdXRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC51dGlsLlhtbEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5Bc3NvY2lhdGlvbkhlbHBlcjsKLQotCi0vKioKLSAqIFRoZSBlbGVtZW50IGxheW91dCBmb3IgYSBUb29sIE1lbnRvci4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgVG9vbE1lbnRvckxheW91dCBleHRlbmRzIEFic3RyYWN0RWxlbWVudExheW91dCB7Ci0KLQlwdWJsaWMgVG9vbE1lbnRvckxheW91dCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0KEVsZW1lbnRMYXlvdXRNYW5hZ2VyIGxheW91dE1hbmFnZXIsIE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgewotCQlzdXBlci5fX2luaXQobGF5b3V0TWFuYWdlciwgZWxlbWVudCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuSUVsZW1lbnRMYXlvdXQjZ2V0WG1sRWxlbWVudChib29sZWFuKQotCSAqLwotCXB1YmxpYyBYbWxFbGVtZW50IGdldFhtbEVsZW1lbnQoYm9vbGVhbiBpbmNsdWRlUmVmZXJlbmNlcykgewotCQlYbWxFbGVtZW50IGVsZW1lbnRYbWwgPSBzdXBlci5nZXRYbWxFbGVtZW50KGluY2x1ZGVSZWZlcmVuY2VzKTsKLQotCQlpZiAoaW5jbHVkZVJlZmVyZW5jZXMpIHsKLQkJCUxpc3QgY29udGVudEVsZW1lbnRzID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMG5GZWF0dXJlVmFsdWUoc3VwZXIuZWxlbWVudCwKLQkJCQkJQXNzb2NpYXRpb25IZWxwZXIuVG9vbE1lbnRvcl9UYXNrcywgbGF5b3V0TWFuYWdlcgotCQkJCQkJCS5nZXRFbGVtZW50UmVhbGl6ZXIoKSk7Ci0JCQlhZGRSZWZlcmVuY2VzKEFzc29jaWF0aW9uSGVscGVyLlRvb2xNZW50b3JfVGFza3MsIGVsZW1lbnRYbWwsICJjb250ZW50RWxlbWVudHMiLCBjb250ZW50RWxlbWVudHMpOyAvLyROT04tTkxTLTEkCi0KLQkJCUxpc3Q8TWV0aG9kRWxlbWVudD4gdG9vbHMgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwbkZlYXR1cmVWYWx1ZSgKLQkJCQkJc3VwZXIuZWxlbWVudCwgQXNzb2NpYXRpb25IZWxwZXIuVG9vbE1lbnRvcl9Ub29scywKLQkJCQkJbGF5b3V0TWFuYWdlci5nZXRFbGVtZW50UmVhbGl6ZXIoKSk7Ci0JCQlpbnQgc3ogPSB0b29scyA9PSBudWxsID8gMCA6IHRvb2xzLnNpemUoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc3o7IGkrKykgewotCQkJCU1ldGhvZEVsZW1lbnQgdG9vbCA9IHRvb2xzLmdldChpKTsKLQkJCQlhZGRSZWZlcmVuY2UoQXNzb2NpYXRpb25IZWxwZXIuVG9vbE1lbnRvcl9Ub29scywgZWxlbWVudFhtbCwgInRvb2wiLCB0b29sKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGVsZW1lbnRYbWw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L2VsZW1lbnRzL1doaXRlcGFwZXJMYXlvdXQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZWxlbWVudHMvV2hpdGVwYXBlckxheW91dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZWY3ZjNmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZWxlbWVudHMvV2hpdGVwYXBlckxheW91dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5lbGVtZW50czsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwucmVnZXguTWF0Y2hlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5GaWxlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LkVsZW1lbnRMYXlvdXRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC51dGlsLlhtbEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5SZXNvdXJjZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkd1aWRhbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkFzc29jaWF0aW9uSGVscGVyOwotCi0KLS8qKgotICogVGhlIGVsZW1lbnQgbGF5b3V0IGZvciBhIFdoaXRlcGFwZXIuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBXaGl0ZXBhcGVyTGF5b3V0IGV4dGVuZHMgQWJzdHJhY3RFbGVtZW50TGF5b3V0IHsKLQkKLQlwdWJsaWMgV2hpdGVwYXBlckxheW91dCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgaW5pdChFbGVtZW50TGF5b3V0TWFuYWdlciBsYXlvdXRNYW5hZ2VyLCBNZXRob2RFbGVtZW50IGVsZW1lbnQpIHsKLQkJc3VwZXIuX19pbml0KGxheW91dE1hbmFnZXIsIGVsZW1lbnQpOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5JRWxlbWVudExheW91dCNnZXRYbWxFbGVtZW50KGJvb2xlYW4pCi0JICovCi0JcHVibGljIFhtbEVsZW1lbnQgZ2V0WG1sRWxlbWVudChib29sZWFuIGluY2x1ZGVSZWZlcmVuY2VzKSB7Ci0JCVhtbEVsZW1lbnQgZWxlbWVudFhtbCA9IHN1cGVyLmdldFhtbEVsZW1lbnQoaW5jbHVkZVJlZmVyZW5jZXMpOwotCi0JCWlmIChpbmNsdWRlUmVmZXJlbmNlcykgewotCQkJTGlzdCBjb250ZW50RWxlbWVudHMgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwbkZlYXR1cmVWYWx1ZShzdXBlci5lbGVtZW50LCAKLQkJCQkJQXNzb2NpYXRpb25IZWxwZXIuQ29uY2VwdF9Db250ZW50RWxlbWVudHMsIAotCQkJCQlsYXlvdXRNYW5hZ2VyLmdldEVsZW1lbnRSZWFsaXplcigpKTsKLQkJCQotCQkJTGlzdCBhY3Rpdml0aWVzID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMG5GZWF0dXJlVmFsdWUoc3VwZXIuZWxlbWVudCwKLQkJCQkJQXNzb2NpYXRpb25IZWxwZXIuQ29uY2VwdF9CcmVha2Rvd25FbGVtZW50cywgbGF5b3V0TWFuYWdlcgotCQkJCQkJCS5nZXRFbGVtZW50UmVhbGl6ZXIoKSk7Ci0KLQkJCWNvbnRlbnRFbGVtZW50cy5hZGRBbGwoYWN0aXZpdGllcyk7Ci0KLQkJCWFkZFJlZmVyZW5jZXMoQXNzb2NpYXRpb25IZWxwZXIuQ29uY2VwdF9Db250ZW50RWxlbWVudHMsIGVsZW1lbnRYbWwsICJjb250ZW50RWxlbWVudHMiLCBjb250ZW50RWxlbWVudHMpOyAvLyROT04tTkxTLTEkCi0KLQkJCUd1aWRhbmNlIGd1aWRhbmNlID0gKEd1aWRhbmNlKSBzdXBlci5lbGVtZW50OwotCQkJQ29udGVudERlc2NyaXB0aW9uIGNvbnRlbnQgPSAoQ29udGVudERlc2NyaXB0aW9uKSBndWlkYW5jZQotCQkJCQkuZ2V0UHJlc2VudGF0aW9uKCk7Ci0JCQlpZiAoY29udGVudCAhPSBudWxsKSB7Ci0JCQkJCi0JCQkJLy8gQXV0aG9yaW5nOiAgVGVtcGxhdGUgYXR0YWNobWVudHMgb2YgYSBjb250cmlidXRpbmcgdGVtcGxhdGUgZ3VpZGFuY2UgZWxlbWVudCBhcmUgbm90IGFwcGVuZGVkIHRvIHRoZSBiYXNlIGxpc3Qgb2YgYXR0YWNobWVudHMJCQkJCi0JCQkJLy9TdHJpbmcgYXR0YWNobWVudFN0cmluZyA9ICgob3JnLmVjbGlwc2UuZXBmLnVtYS5HdWlkYW5jZURlc2NyaXB0aW9uKWNvbnRlbnQpLmdldEF0dGFjaG1lbnRzKCk7Ci0JCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRHdWlkYW5jZURlc2NyaXB0aW9uX0F0dGFjaG1lbnRzKCk7Ci0JCQkJU3RyaW5nIGF0dGFjaG1lbnRTdHJpbmcgPSAoU3RyaW5nKUNvbmZpZ3VyYXRpb25IZWxwZXIuY2FsY0F0dHJpYnV0ZUZlYXR1cmVWYWx1ZShjb250ZW50LCBzdXBlci5lbGVtZW50LCBmZWF0dXJlLCBzdXBlci5sYXlvdXRNYW5hZ2VyLmdldENvbmZpZ3VyYXRpb24oKSk7Ci0JCQkJaWYgKCAoYXR0YWNobWVudFN0cmluZyAhPSBudWxsKSAmJiAoYXR0YWNobWVudFN0cmluZy5pbmRleE9mKENvbmZpZ3VyYXRpb25IZWxwZXIuQVRUUklCVVRFX1ZBTFVFX1NFUEVSQVRPUikgPiAwKSApCi0JCQkJewotCQkJCQlhdHRhY2htZW50U3RyaW5nID0gYXR0YWNobWVudFN0cmluZy5yZXBsYWNlQWxsKENvbmZpZ3VyYXRpb25IZWxwZXIuQVRUUklCVVRFX1ZBTFVFX1NFUEVSQVRPUiwgVG5nVXRpbC5HVUlEQU5DRV9GSUxFU1RSSU5HX1NFUEFSQVRPUik7IAotCQkJCX0KLQkJCQlMaXN0IGF0dGFjaG1lbnRMaXN0ID0gVG5nVXRpbC5jb252ZXJ0R3VpZGFuY2VBdHRhY2htZW50c1RvTGlzdChhdHRhY2htZW50U3RyaW5nKTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBhdHRhY2htZW50TGlzdC5pdGVyYXRvcigpO2l0ZXIuaGFzTmV4dCgpOykgewotCQkJCQlTdHJpbmcgYXR0YWNobWVudEZpbGUgPSAoU3RyaW5nKSBpdGVyLm5leHQoKTsKLQkJCQkJaWYgKGF0dGFjaG1lbnRGaWxlICE9IG51bGwpIHsKLQkJCQkJCU1hdGNoZXIgbSA9IFJlc291cmNlSGVscGVyLnBfdGVtcGxhdGVfYXR0YWNobWVudF91cmwubWF0Y2hlcihhdHRhY2htZW50RmlsZSk7Ci0JCQkJCQlpZiAoIW0uZmluZCgpKSB7Ci0JCQkJCQkJU3RyaW5nIGZpbGVOYW1lID0gRmlsZVV0aWwuZ2V0RmlsZU5hbWUoYXR0YWNobWVudEZpbGUpOwotCQkJCQkJCWVsZW1lbnRYbWwubmV3Q2hpbGQoImF0dHJpYnV0ZSIpLnNldEF0dHJpYnV0ZSgibmFtZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJCQkJImF0dGFjaGVkRmlsZSIpLnNldEF0dHJpYnV0ZSggLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJInVybCIsICJmaWxlOi8vIiArIGF0dGFjaG1lbnRGaWxlKSAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgCi0JCQkJCQkJCQkuc2V0QXR0cmlidXRlKCJmaWxlTmFtZSIsIGZpbGVOYW1lKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlTdHJpbmcgZmlsZU5hbWUgPSBtLmdyb3VwKDIpOwotCQkJCQkJCWVsZW1lbnRYbWwubmV3Q2hpbGQoImF0dHJpYnV0ZSIpLnNldEF0dHJpYnV0ZSgibmFtZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJCQkJImF0dGFjaGVkRmlsZSIpLnNldEF0dHJpYnV0ZSggLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJInVybCIsIG0uZ3JvdXAoMSkpIC8vJE5PTi1OTFMtMSQgCi0JCQkJCQkJCQkuc2V0QXR0cmlidXRlKCJmaWxlTmFtZSIsIGZpbGVOYW1lKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGVsZW1lbnRYbWw7Ci0JfQotCQotfQotCi0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZWxlbWVudHMvV29ya0JyZWFrZG93bkVsZW1lbnRMYXlvdXQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZWxlbWVudHMvV29ya0JyZWFrZG93bkVsZW1lbnRMYXlvdXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWJlNWQxNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L2VsZW1lbnRzL1dvcmtCcmVha2Rvd25FbGVtZW50TGF5b3V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuZWxlbWVudHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuRWxlbWVudExheW91dE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LnV0aWwuWG1sRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLkxpYnJhcnlVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLQotLyoqCi0gKiBUaGUgbGF5b3V0IGZvciB3b3JrIGJyZWFrZG93biBFbGVtZW50cy4KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFdvcmtCcmVha2Rvd25FbGVtZW50TGF5b3V0IGV4dGVuZHMgQWJzdHJhY3RQcm9jZXNzRWxlbWVudExheW91dCB7Ci0KLQlwdWJsaWMgdm9pZCBpbml0KEVsZW1lbnRMYXlvdXRNYW5hZ2VyIGxheW91dE1hbmFnZXIsIE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgewotCQlzdXBlci5fX2luaXQobGF5b3V0TWFuYWdlciwgZWxlbWVudCk7Ci0JfQotCi0JLyoqCi0JICogb3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gaGFuZGxlIHRoZSB3b3Jrb3JkZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCBsb2FkUmVmZXJlbmNlcyhYbWxFbGVtZW50IGVsZW1lbnRYbWwsIGJvb2xlYW4gaW5jbHVkZVJlZmVyZW5jZXMpIHsKLQkJTGlzdCBmZWF0dXJlcyA9IExpYnJhcnlVdGlsLmdldFN0cnVjdHVyYWxGZWF0dXJlcyhlbGVtZW50KTsKLS8vCQlMaXN0IHByb3BlcnRpZXMgPSBlbGVtZW50LmdldEluc3RhbmNlUHJvcGVydGllcygpOwotCQlpZiAoZmVhdHVyZXMgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmZWF0dXJlcy5zaXplKCk7IGkrKykgewotCQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgZmVhdHVyZXMKLQkJCQkJCS5nZXQoaSk7Ci0JCQkJaWYgKGZlYXR1cmUuZ2V0RVR5cGUoKSBpbnN0YW5jZW9mIEVDbGFzcykgewotCQkJCQlpZiAoZmVhdHVyZSAhPSBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCS5nZXRXb3JrQnJlYWtkb3duRWxlbWVudF9MaW5rVG9QcmVkZWNlc3NvcigpKSB7Ci0JCQkJCQlsb2FkRmVhdHVyZShmZWF0dXJlLCBlbGVtZW50WG1sLCBpbmNsdWRlUmVmZXJlbmNlcyk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlzdXBlci5sb2FkV29ya09yZGVyKGVsZW1lbnRYbWwpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L2VsZW1lbnRzL1dvcmtQcm9kdWN0RGVzY3JpcHRvckxheW91dC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9lbGVtZW50cy9Xb3JrUHJvZHVjdERlc2NyaXB0b3JMYXlvdXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjFiOTI4MS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L2VsZW1lbnRzL1dvcmtQcm9kdWN0RGVzY3JpcHRvckxheW91dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5lbGVtZW50czsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5FbGVtZW50UmVhbGl6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LkVsZW1lbnRMYXlvdXRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC51dGlsLlhtbEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFydGlmYWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0VsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS51dGlsLk9wcG9zaXRlRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQXNzb2NpYXRpb25IZWxwZXI7Ci0KLQotcHVibGljIGNsYXNzIFdvcmtQcm9kdWN0RGVzY3JpcHRvckxheW91dCBleHRlbmRzIERlc2NyaXB0b3JMYXlvdXQgewotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29sbGVjdGlvbjxFU3RydWN0dXJhbEZlYXR1cmU+IGV4dHJhRmVhdHVyZXNGcm9tV29ya1Byb2R1Y3QgPSBBcnJheXMuYXNMaXN0KG5ldyBFU3RydWN0dXJhbEZlYXR1cmVbXSB7Ci0JCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRXb3JrUHJvZHVjdF9Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMoKSwKLQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFdvcmtQcm9kdWN0X1JlcG9ydHMoKSwKLQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFdvcmtQcm9kdWN0X1RlbXBsYXRlcygpLAotCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V29ya1Byb2R1Y3RfVG9vbE1lbnRvcnMoKQotCX0pOwotCi0JcHVibGljIHZvaWQgaW5pdChFbGVtZW50TGF5b3V0TWFuYWdlciBsYXlvdXRNYW5hZ2VyLCBNZXRob2RFbGVtZW50IGVsZW1lbnQpIHsKLQkJc3VwZXIuX19pbml0KGxheW91dE1hbmFnZXIsIGVsZW1lbnQpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LmVsZW1lbnRzLkFic3RyYWN0RWxlbWVudExheW91dCNsb2FkUmVmZXJlbmNlcyhYbWxFbGVtZW50LCBib29sZWFuKQotCSAqLwotCXB1YmxpYyB2b2lkIGxvYWRSZWZlcmVuY2VzKFhtbEVsZW1lbnQgZWxlbWVudFhtbCwgYm9vbGVhbiBpbmNsdWRlUmVmZXJlbmNlcykgewotCi0JCXN1cGVyLmxvYWRSZWZlcmVuY2VzKGVsZW1lbnRYbWwsIGluY2x1ZGVSZWZlcmVuY2VzKTsKLQkJCi0JCS8vIDE2MTMyNSAtIFdQRGVzY3JpcHRvcnMgZGlkIG5vdCBzaG93IG1vZGlmeSBSb2xlRGVzY3JpcHRvcnMKLQkJLy8gZ2V0IHRoZSBtb2RpZmllcyBmZWF0dXJlCi0JCS8vIHRoaXMgZ3V5IGRvZXMgbm90IGhhdmUgYSBkZWZpbmVkIG9wcG9zaXRlIGZlYXR1cmUKLQkJLy8gdGhpcyBtZXRob2QgY2FsbCBpcyBub3Qgc2FmZS4gCi0vLwkJTGlzdCBtb2RpZnlSb2xlcyA9IENvbmZpZ3VyYXRpb25IZWxwZXIuY2FsY01vZGlmeVJvbGVEZXNjcmlwdG9ycygKLS8vCQkJCShXb3JrUHJvZHVjdERlc2NyaXB0b3Ipc3VwZXIuZWxlbWVudCwgCi0vLwkJCQlsYXlvdXRNYW5hZ2VyLmdldEVsZW1lbnRSZWFsaXplcigpKTsKLQkJCi0JCUxpc3QgbW9kaWZ5Um9sZXMgPSBjYWxjTW9kaWZ5Um9sZURlc2NyaXB0b3JzKCk7Ci0JCQotCQlhZGRSZWZlcmVuY2VzKG51bGwsIGVsZW1lbnRYbWwsICJ3b3JrZWRPbkJ5IiwgbW9kaWZ5Um9sZXMpOyAvLyROT04tTkxTLTEkCi0JCQotCQllbGVtZW50WG1sLnNldEF0dHJpYnV0ZSgiU2hvd0Z1bGxNZXRob2RDb250ZW50IiwgKGxheW91dE1hbmFnZXIuZ2V0VmFsaWRhdG9yKCkuc2hvd0V4dHJhSW5mb0ZvckRlc2NyaXB0b3JzKCkpID8gInRydWUiIDogImZhbHNlIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQotCQlpZiAoKHN1cGVyLmVsZW1lbnRMYXlvdXQgIT0gbnVsbCApICYmIGxheW91dE1hbmFnZXIuZ2V0VmFsaWRhdG9yKCkuc2hvd0V4dHJhSW5mb0ZvckRlc2NyaXB0b3JzKCkgKSB7Ci0JCQkvLyBhbHNvIGxvYWQgdGhlIGxpbmtlZCBlbGVtZW50IHJlZmVyZW5jZWQgaW5mb3JtYXRpb24KLQkJCWZvciAoSXRlcmF0b3I8RVN0cnVjdHVyYWxGZWF0dXJlPiBpdGVyYXRvciA9IGdldEV4dHJhRmVhdHVyZXNGcm9tQ29udGVudEVsZW1lbnQoKS5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJc3VwZXIuZWxlbWVudExheW91dC5sb2FkRmVhdHVyZShmZWF0dXJlLCBlbGVtZW50WG1sLCBmYWxzZSk7Ci0JCQl9Ci0KLQkJfQotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQ29sbGVjdGlvbjxFU3RydWN0dXJhbEZlYXR1cmU+IGdldEV4dHJhRmVhdHVyZXNGcm9tQ29udGVudEVsZW1lbnQoKSB7Ci0JCUFycmF5TGlzdDxFU3RydWN0dXJhbEZlYXR1cmU+IGZlYXR1cmVzID0gbmV3IEFycmF5TGlzdDxFU3RydWN0dXJhbEZlYXR1cmU+KGV4dHJhRmVhdHVyZXNGcm9tV29ya1Byb2R1Y3QpOwotCQlmZWF0dXJlcy5hZGRBbGwoc3VwZXIuZ2V0RXh0cmFGZWF0dXJlc0Zyb21Db250ZW50RWxlbWVudCgpKTsKLQkJcmV0dXJuIGZlYXR1cmVzOwotCX0KLQkKLQlwdWJsaWMgTGlzdCBjYWxjTW9kaWZ5Um9sZURlc2NyaXB0b3JzKCkgewotCQkKLQkJTGlzdCBtb2RpZnlSb2xlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQlFbGVtZW50UmVhbGl6ZXIgcmVhbGl6ZXIgPSBnZXRMYXlvdXRNZ3IoKS5nZXRFbGVtZW50UmVhbGl6ZXIoKTsKLQkJTGlzdCB0YXNrRGVzY3JpcHRvcnMgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwbkZlYXR1cmVWYWx1ZSgKLQkJCQllbGVtZW50LCAKLQkJCQlBc3NvY2lhdGlvbkhlbHBlci5Xb3JrUHJvZHVjdERlc2NyaXB0b3JfT3V0cHV0RnJvbV9UYXNrRGVzY3JpcHRvcnMsIAotCQkJCXJlYWxpemVyKTsKLQkJCi0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza0Rlc2NyaXB0b3JfT3V0cHV0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSB0YXNrRGVzY3JpcHRvcnMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOyApIHsKLQkJCVRhc2tEZXNjcmlwdG9yIHQgPSAoVGFza0Rlc2NyaXB0b3IpaXQubmV4dCgpOwotCQkJCi0JCQkvLyBtYWtlIHN1cmUgdGhlIHRhc2sgZGVzY3JpcHRvciBoYXMgdGhlIGN1cnJlbnQgd3AgZGVzY3JpcHRvciBhcyBvdXRwdXQKLQkJCVN0cmluZyBwYXRoID0gc3VwZXIubWFrZVBhdGgoZ2V0U3VwZXJBY3Rpdml0eVBhdGgoKSwgdCk7Ci0JCQlUYXNrRGVzY3JpcHRvckxheW91dCB0bCA9IChUYXNrRGVzY3JpcHRvckxheW91dClsYXlvdXRNYW5hZ2VyLmNyZWF0ZUxheW91dCh0LCBvd25pbmdQcm9jZXNzLCBwYXRoKTsKLQkJCUxpc3Qgb3V0cHV0cyA9IChMaXN0KXRsLmdldEZlYXR1cmVWYWx1ZShmZWF0dXJlLCBudWxsLCBmYWxzZSk7Ci0JCQkKLQkJCWlmICggb3V0cHV0cyAhPSBudWxsICYmIG91dHB1dHMuY29udGFpbnMoZWxlbWVudCkgKSB7CQotCQkJCUxpc3Qgcm9sZURlc2NyaXB0b3JzID0gKExpc3QpIHRsLmdldEZlYXR1cmVWYWx1ZShVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrRGVzY3JpcHRvcl9QZXJmb3JtZWRQcmltYXJpbHlCeSgpLCBudWxsLCBmYWxzZSk7Ci0JCQkJaWYgKHJvbGVEZXNjcmlwdG9ycyAhPSBudWxsKSB7Ci0JCQkJZm9yIChJdGVyYXRvciBpID0gcm9sZURlc2NyaXB0b3JzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLQkJCQl7Ci0JCQkJCVJvbGVEZXNjcmlwdG9yIHIgPSAoUm9sZURlc2NyaXB0b3IpIGkubmV4dCgpOwotCQkJCQlpZiAoIChyICE9IG51bGwpICYmICFtb2RpZnlSb2xlcy5jb250YWlucyhyKSApIHsKLQkJCQkJCW1vZGlmeVJvbGVzLmFkZChyKTsKLQkJCQkJfQotCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiBtb2RpZnlSb2xlczsKLQl9Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0RmVhdHVyZVZhbHVlKE9wcG9zaXRlRmVhdHVyZSBmZWF0dXJlLCBPYmplY3QgdmFsdWUpIHsKLQkJCi0JCWlmICggIXN1cGVyLmFjY2VwdEZlYXR1cmVWYWx1ZShmZWF0dXJlLCB2YWx1ZSkgKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJCi0JCWlmICggIWlzVGFza09wcG9zaXRlRmVhdHVyZShmZWF0dXJlKSB8fCAhKHZhbHVlIGluc3RhbmNlb2YgTGlzdCkgKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQkKLQkJTGlzdCBpdGVtcyA9IChMaXN0KXZhbHVlOwotCQlpbnQgaSA9IDA7Ci0JCXdoaWxlIChpIDwgaXRlbXMuc2l6ZSgpICkgewotCQkJTWV0aG9kRWxlbWVudCBlID0gKE1ldGhvZEVsZW1lbnQpaXRlbXMuZ2V0KGkpOwotCQkJU3RyaW5nIHBhdGggPSBzdXBlci5tYWtlUGF0aChnZXRTdXBlckFjdGl2aXR5UGF0aCgpLCBlKTsKLQkJCVRhc2tEZXNjcmlwdG9yTGF5b3V0IHRsID0gKFRhc2tEZXNjcmlwdG9yTGF5b3V0KWxheW91dE1hbmFnZXIuY3JlYXRlTGF5b3V0KGUsIG93bmluZ1Byb2Nlc3MsIHBhdGgpOwotCQkJTGlzdCBvID0gbnVsbDsKLQkJCWlmICggZmVhdHVyZSA9PSBBc3NvY2lhdGlvbkhlbHBlci5Xb3JrUHJvZHVjdERlc2NyaXB0b3JfRXh0ZXJuYWxJbnB1dFRvX1Rhc2tEZXNjcmlwdG9ycyApIHsKLQkJCQlvID0gKExpc3QpdGwuZ2V0RmVhdHVyZVZhbHVlKFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tEZXNjcmlwdG9yX0V4dGVybmFsSW5wdXQoKSwgbnVsbCwgZmFsc2UpOwkJCQotCQkJfSBlbHNlIGlmICggZmVhdHVyZSA9PSBBc3NvY2lhdGlvbkhlbHBlci5Xb3JrUHJvZHVjdERlc2NyaXB0b3JfTWFuZGF0b3J5SW5wdXRUb19UYXNrRGVzY3JpcHRvcnMgKSB7Ci0JCQkJbyA9IChMaXN0KXRsLmdldEZlYXR1cmVWYWx1ZShVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrRGVzY3JpcHRvcl9NYW5kYXRvcnlJbnB1dCgpLCBudWxsLCBmYWxzZSk7CQkJCi0JCQl9IGVsc2UgaWYgKCBmZWF0dXJlID09IEFzc29jaWF0aW9uSGVscGVyLldvcmtQcm9kdWN0RGVzY3JpcHRvcl9PcHRpb25hbElucHV0VG9fVGFza0Rlc2NyaXB0b3JzICkgewotCQkJCW8gPSAoTGlzdCl0bC5nZXRGZWF0dXJlVmFsdWUoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza0Rlc2NyaXB0b3JfT3B0aW9uYWxJbnB1dCgpLCBudWxsLCBmYWxzZSk7CQkJCi0JCQl9IGVsc2UgaWYgKCBmZWF0dXJlID09IEFzc29jaWF0aW9uSGVscGVyLldvcmtQcm9kdWN0RGVzY3JpcHRvcl9PdXRwdXRGcm9tX1Rhc2tEZXNjcmlwdG9ycyApIHsKLQkJCQlvID0gKExpc3QpdGwuZ2V0RmVhdHVyZVZhbHVlKFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tEZXNjcmlwdG9yX091dHB1dCgpLCBudWxsLCBmYWxzZSk7CQkJCi0JCQl9IAotCQkJCi0JCQlpZiAoIChvICE9IG51bGwpICYmIG8uY29udGFpbnModGhpcy5lbGVtZW50KSApIHsKLQkJCQlpKys7Ci0JCQl9IGVsc2UgewotCQkJCWl0ZW1zLnJlbW92ZShpKTsKLQkJCX0KLQkJfQotCi0KLQkJCi0JCXJldHVybiB0cnVlOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5JRWxlbWVudExheW91dCNnZXRYbWxFbGVtZW50KGJvb2xlYW4pCi0JICovCi0JcHVibGljIFhtbEVsZW1lbnQgZ2V0WG1sRWxlbWVudChib29sZWFuIGluY2x1ZGVSZWZlcmVuY2VzKSB7Ci0JCVhtbEVsZW1lbnQgZWxlbWVudFhtbCA9IHN1cGVyLmdldFhtbEVsZW1lbnQoaW5jbHVkZVJlZmVyZW5jZXMpOwotCQkKLQkJaWYgKGluY2x1ZGVSZWZlcmVuY2VzKSB7Ci0JCQlpbmNsdWRlQ29udGFpbmVkV3BkUmVmZXJlbmNlcyhlbGVtZW50WG1sKTsKLQkJfQotCQkKLQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yIHdwZCA9IG51bGw7Ci0JCVdvcmtQcm9kdWN0IHdwID0gbnVsbDsKLQotCQlib29sZWFuIGlzU2xvdCA9IGZhbHNlOwotCQlpZiAoZ2V0RWxlbWVudCgpIGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yKSB7Ci0JCQl3cGQgPSAoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBnZXRFbGVtZW50KCk7Ci0JCQl3cCA9IHdwZC5nZXRXb3JrUHJvZHVjdCgpOwotCQkJaWYgKHdwICE9IG51bGwpIHsKLQkJCQlpc1Nsb3QgPSB3cC5nZXRJc0Fic3RyYWN0KCk7Ci0JCQl9Ci0JCX0KLQkJaWYgKGlzU2xvdCkgewotCQkJZWxlbWVudFhtbC5zZXRBdHRyaWJ1dGUoCi0JCQkJCSJUeXBlIiwgIldvcmtQcm9kdWN0U2xvdCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCWVsZW1lbnRYbWwuc2V0QXR0cmlidXRlKAotCQkJCQkiVHlwZU5hbWUiLCBMaWJyYXJ5UmVzb3VyY2VzLldvcmtQcm9kdWN0U2xvdF90ZXh0KTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJRU9iamVjdCBjb250YWluaW5nT2JqID0gd3BkLmVDb250YWluZXIoKTsKLQkJUHJvY2Vzc1BhY2thZ2UgY29udGFuaW5nUGtnID0gY29udGFpbmluZ09iaiBpbnN0YW5jZW9mIFByb2Nlc3NQYWNrYWdlID8gKFByb2Nlc3NQYWNrYWdlKSBjb250YWluaW5nT2JqCi0JCQkJOiBudWxsOwotCi0JCWlmIChpbmNsdWRlUmVmZXJlbmNlcyAmJiBjb250YW5pbmdQa2cgIT0gbnVsbCkgewotCQkJTGlzdDxQcm9jZXNzRWxlbWVudD4gcHJvY2Vzc0VsZW1lbnRzID0gY29udGFuaW5nUGtnCi0JCQkJCS5nZXRQcm9jZXNzRWxlbWVudHMoKTsKLQkJCU1hcDxXb3JrUHJvZHVjdCwgV29ya1Byb2R1Y3REZXNjcmlwdG9yPiB3cFdwZE1hcCA9IG5ldyBIYXNoTWFwPFdvcmtQcm9kdWN0LCBXb3JrUHJvZHVjdERlc2NyaXB0b3I+KCk7Ci0JCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IGxheW91dE1hbmFnZXIuZ2V0RWxlbWVudFJlYWxpemVyKCkKLQkJCQkJLmdldENvbmZpZ3VyYXRpb24oKTsKLQkJCWZvciAoUHJvY2Vzc0VsZW1lbnQgcHJvY2Vzc0VsZW1lbnQgOiBwcm9jZXNzRWxlbWVudHMpIHsKLQkJCQlpZiAocHJvY2Vzc0VsZW1lbnQgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3IpIHsKLQkJCQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yIHdwZEVsZW0gPSAoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBwcm9jZXNzRWxlbWVudDsKLQkJCQkJV29ya1Byb2R1Y3Qgd3BFbGVtZW50ID0gd3BkRWxlbS5nZXRXb3JrUHJvZHVjdCgpOwotCQkJCQlpZiAod3BFbGVtZW50ICE9IG51bGwpIHsKLQkJCQkJCXdwRWxlbWVudCA9IChXb3JrUHJvZHVjdCkgQ29uZmlndXJhdGlvbkhlbHBlcgotCQkJCQkJLmdldENhbGN1bGF0ZWRFbGVtZW50KHdwRWxlbWVudCwgY29uZmlnKTsKLQkJCQkJCWlmICh3cEVsZW1lbnQgIT0gbnVsbCkgewotCQkJCQkJCXdwV3BkTWFwLnB1dCh3cEVsZW1lbnQsIHdwZEVsZW0pOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQlpZiAoaXNTbG90KSB7Ci0JCQkJT3Bwb3NpdGVGZWF0dXJlIG9mZWF0dXJlID0gQXNzb2NpYXRpb25IZWxwZXIuRnVsRmlsbHNfRnVsbEZpbGxhYmxlRWxlbWVudHM7Ci0JCQkJTGlzdCBsaXN0ID0gQ29uZmlndXJhdGlvbkhlbHBlcgotCQkJCQkJLmNhbGNGdWxmaWxsc19GdWxmaWxsYWJsZUVsZW1lbnQod3AsIGNvbmZpZyk7Ci0JCQkJTGlzdDxXb3JrUHJvZHVjdERlc2NyaXB0b3I+IHdwZExpc3QgPSBnZXRXcGRMaXN0KHdwV3BkTWFwLCBsaXN0KTsKLQkJCQlhZGRSZWZlcmVuY2VzKG9mZWF0dXJlLCBlbGVtZW50WG1sLCBvZmVhdHVyZS5nZXROYW1lKCksIHdwZExpc3QpOwotCQkJfSBlbHNlIGlmICh3cCAhPSBudWxsKSB7Ci0JCQkJRVJlZmVyZW5jZSBmZWF0dXJlID0gVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCS5nZXRGdWxmaWxsYWJsZUVsZW1lbnRfRnVsZmlsbHMoKTsKLQkJCQlMaXN0IGxpc3QgPSBDb25maWd1cmF0aW9uSGVscGVyCi0JCQkJCQkuY2FsY0Z1bGZpbGxhYmxlRWxlbWVudF9GdWxmaWxscyh3cCwgY29uZmlnKTsKLQkJCQlMaXN0PFdvcmtQcm9kdWN0RGVzY3JpcHRvcj4gd3BkTGlzdCA9IGdldFdwZExpc3Qod3BXcGRNYXAsIGxpc3QpOwotCQkJCWFkZFJlZmVyZW5jZXMoZmVhdHVyZSwgZWxlbWVudFhtbCwgZmVhdHVyZS5nZXROYW1lKCksIHdwZExpc3QpOwotCQkJCQotCQkJCWluY2x1ZGVTbG90UmVmZXJlbmNlcyhlbGVtZW50WG1sLCB3cGRMaXN0KTsKLQkJCX0KLQotCQl9Ci0KLQkJcmV0dXJuIGVsZW1lbnRYbWw7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBpbmNsdWRlU2xvdFJlZmVyZW5jZXMoWG1sRWxlbWVudCBlbGVtZW50WG1sLCBMaXN0PFdvcmtQcm9kdWN0RGVzY3JpcHRvcj4gd3Bkc1dpdGhzbG90cykgewotCQlFbGVtZW50UmVhbGl6ZXIgcmVhbGl6ZXIgPSBsYXlvdXRNYW5hZ2VyLmdldEVsZW1lbnRSZWFsaXplcigpOwkJCi0JCQkJCi0JCWFkZFNsb3RSZWZlcmVuY2VzKGVsZW1lbnRYbWwsCi0JCQkJQXNzb2NpYXRpb25IZWxwZXIuV29ya1Byb2R1Y3REZXNjcmlwdG9yX01hbmRhdG9yeUlucHV0VG9fVGFza0Rlc2NyaXB0b3JzLAotCQkJCSJtYW5kYXRvcnlJbnB1dFRvVGFza0Rlc2NyaXB0b3JzX2Zyb21TbG90cyIsIHdwZHNXaXRoc2xvdHMsIHJlYWxpemVyKTsJLy8kTk9OLU5MUy0xJAotCi0JCWFkZFNsb3RSZWZlcmVuY2VzKGVsZW1lbnRYbWwsCi0JCQkJQXNzb2NpYXRpb25IZWxwZXIuV29ya1Byb2R1Y3REZXNjcmlwdG9yX09wdGlvbmFsSW5wdXRUb19UYXNrRGVzY3JpcHRvcnMsCi0JCQkJIm9wdGlvbmFsSW5wdXRUb1Rhc2tEZXNjcmlwdG9yc19mcm9tU2xvdHMiLCB3cGRzV2l0aHNsb3RzLCByZWFsaXplcik7CS8vJE5PTi1OTFMtMSQKLQotCQlhZGRTbG90UmVmZXJlbmNlcyhlbGVtZW50WG1sLAotCQkJCUFzc29jaWF0aW9uSGVscGVyLldvcmtQcm9kdWN0RGVzY3JpcHRvcl9PdXRwdXRGcm9tX1Rhc2tEZXNjcmlwdG9ycywKLQkJCQkib3V0cHV0RnJvbVRhc2tEZXNjcmlwdG9yc19mcm9tU2xvdHMiLCB3cGRzV2l0aHNsb3RzLCByZWFsaXplcik7CS8vJE5PTi1OTFMtMSQKLQkJCi0JfQotCQotCXByaXZhdGUgdm9pZCBhZGRTbG90UmVmZXJlbmNlcyhYbWxFbGVtZW50IGVsZW1lbnRYbWwsIE9wcG9zaXRlRmVhdHVyZSBvZmVhdHVyZSwgU3RyaW5nIHJlZmVyZW5jZU5hbWUsIExpc3Q8V29ya1Byb2R1Y3REZXNjcmlwdG9yPiB3cGRzV2l0aHNsb3RzLCBFbGVtZW50UmVhbGl6ZXIgcmVhbGl6ZXIpIHsKLQkJTGlzdCByZWZlcmVuY2VzID0gbmV3IEFycmF5TGlzdCgpOwotCQkKLQkJZm9yIChXb3JrUHJvZHVjdERlc2NyaXB0b3Igd3BkOiB3cGRzV2l0aHNsb3RzKSB7Ci0JCQlMaXN0IGxpc3QgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwbkZlYXR1cmVWYWx1ZSh3cGQsIG9mZWF0dXJlLCByZWFsaXplcik7Ci0JCQlyZWZlcmVuY2VzLmFkZEFsbChsaXN0KTsKLQkJfQotCi0JCWFkZFJlZmVyZW5jZXMob2ZlYXR1cmUsIGVsZW1lbnRYbWwsIHJlZmVyZW5jZU5hbWUsIHJlZmVyZW5jZXMpOyAKLQl9Ci0JCi0JcHJpdmF0ZSBMaXN0PFdvcmtQcm9kdWN0RGVzY3JpcHRvcj4gZ2V0V3BkTGlzdChNYXA8V29ya1Byb2R1Y3QsIFdvcmtQcm9kdWN0RGVzY3JpcHRvcj4gd3BXcGRNYXAsIExpc3Q8V29ya1Byb2R1Y3Q+IHdwTGlzdCkgewotCQlMaXN0PFdvcmtQcm9kdWN0RGVzY3JpcHRvcj4gcmV0ID0gbmV3IEFycmF5TGlzdDxXb3JrUHJvZHVjdERlc2NyaXB0b3I+KCk7Ci0JCWZvciAoV29ya1Byb2R1Y3Qgd3A6IHdwTGlzdCkgewotCQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yIHdwZCA9IHdwV3BkTWFwLmdldCh3cCk7Ci0JCQlpZiAod3BkICE9IG51bGwpIHsKLQkJCQlyZXQuYWRkKHdwZCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJldDsKLQl9CQkKLQotCXByaXZhdGUgdm9pZCBpbmNsdWRlQ29udGFpbmVkV3BkUmVmZXJlbmNlcyhYbWxFbGVtZW50IGVsZW1lbnRYbWwpIHsKLQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yIHdwZCA9IGdldEVsZW1lbnQoKSBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0RGVzY3JpcHRvciA/Ci0JCQkJKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgZ2V0RWxlbWVudCgpIDogbnVsbDsKLQkJaWYgKHdwZCA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0JCQotCQlXb3JrUHJvZHVjdCB3cCA9IHdwZC5nZXRXb3JrUHJvZHVjdCgpOwotCQlpZiAoISAod3AgaW5zdGFuY2VvZiBBcnRpZmFjdCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGNvbnRhaW5lckZlYXR1cmUgPSBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRBcnRpZmFjdF9Db250YWluZXJBcnRpZmFjdCgpOwotCQlBcnRpZmFjdCBjb250YWluZXJBcnRpZmFjdCA9IChBcnRpZmFjdCkgQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMDFGZWF0dXJlVmFsdWUod3AsIG51bGwsCi0JCQkJY29udGFpbmVyRmVhdHVyZSwgbGF5b3V0TWFuYWdlci5nZXRFbGVtZW50UmVhbGl6ZXIoKSk7Ci0JCQkJCi0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QXJ0aWZhY3RfQ29udGFpbmVkQXJ0aWZhY3RzKCk7CQkJCQkJCi0JCUxpc3Q8V29ya1Byb2R1Y3REZXNjcmlwdG9yPiB3cGRMaXN0ID0gbmV3IEFycmF5TGlzdDxXb3JrUHJvZHVjdERlc2NyaXB0b3I+KCk7Ci0JCUFjdGl2aXR5IHN1cGVyQWN0ID0gd3BkLmdldFN1cGVyQWN0aXZpdGllcygpOwotCQlmb3IgKEJyZWFrZG93bkVsZW1lbnQgYmU6IHN1cGVyQWN0LmdldEJyZWFrZG93bkVsZW1lbnRzKCkpIHsKLQkJCWlmIChiZSBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgewotCQkJCVdvcmtQcm9kdWN0IHdwQmUgPSAoKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgYmUpLmdldFdvcmtQcm9kdWN0KCk7Ci0JCQkJaWYgKHdwQmUgaW5zdGFuY2VvZiBBcnRpZmFjdCkgewotCQkJCQlpZiAoKChBcnRpZmFjdCkgd3BCZSkuZ2V0Q29udGFpbmVyQXJ0aWZhY3QoKSA9PSB3cCkgewotCQkJCQkJd3BkTGlzdC5hZGQoKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgYmUpOwotCQkJCQl9Ci0JCQkJCWlmIChjb250YWluZXJBcnRpZmFjdCAhPSBudWxsICYmIGNvbnRhaW5lckFydGlmYWN0ID09IHdwQmUpIHsKLQkJCQkJCWNvbnRhaW5lckFydGlmYWN0ID0gbnVsbDsKLQkJCQkJCXByb2Nlc3NDaGlsZChjb250YWluZXJGZWF0dXJlLCBlbGVtZW50WG1sCi0JCQkJCQkJCS5uZXdDaGlsZChUQUdfUkVGRVJFTkNFKS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCBjb250YWluZXJGZWF0dXJlLmdldE5hbWUoKSksIGJlLCBmYWxzZSk7IC8vJE5PTi1OTFMtMSQgCi0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCQkKLQkJYWRkUmVmZXJlbmNlcyhmZWF0dXJlLCBlbGVtZW50WG1sLCBmZWF0dXJlLmdldE5hbWUoKSwgd3BkTGlzdCk7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9lbGVtZW50cy9Xb3JrUHJvZHVjdExheW91dC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9lbGVtZW50cy9Xb3JrUHJvZHVjdExheW91dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNmFlYjljLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZWxlbWVudHMvV29ya1Byb2R1Y3RMYXlvdXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyMCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuZWxlbWVudHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLkVsZW1lbnRSZWFsaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuRWxlbWVudExheW91dE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LnV0aWwuWG1sRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkZ1bGZpbGxhYmxlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS51dGlsLk9wcG9zaXRlRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQXNzb2NpYXRpb25IZWxwZXI7Ci0KLQotLyoqCi0gKiBUaGUgZWxlbWVudCBsYXlvdXQgZm9yIGFuIEFydGlmYWN0LgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBXb3JrUHJvZHVjdExheW91dCBleHRlbmRzIEFic3RyYWN0RWxlbWVudExheW91dCB7Ci0KLQlwdWJsaWMgV29ya1Byb2R1Y3RMYXlvdXQoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdChFbGVtZW50TGF5b3V0TWFuYWdlciBsYXlvdXRNYW5hZ2VyLCBNZXRob2RFbGVtZW50IGVsZW1lbnQpIHsKLQkJc3VwZXIuX19pbml0KGxheW91dE1hbmFnZXIsIGVsZW1lbnQpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LklFbGVtZW50TGF5b3V0I2dldFhtbEVsZW1lbnQoYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgWG1sRWxlbWVudCBnZXRYbWxFbGVtZW50KGJvb2xlYW4gaW5jbHVkZVJlZmVyZW5jZXMpIHsKLQkJWG1sRWxlbWVudCBlbGVtZW50WG1sID0gc3VwZXIuZ2V0WG1sRWxlbWVudChpbmNsdWRlUmVmZXJlbmNlcyk7Ci0JCQotCQlib29sZWFuIGlzU2xvdCA9IGZhbHNlOwotCQlpZiAoZ2V0RWxlbWVudCgpIGluc3RhbmNlb2YgV29ya1Byb2R1Y3QpIHsKLQkJCVdvcmtQcm9kdWN0IHdwID0gKFdvcmtQcm9kdWN0KSBnZXRFbGVtZW50KCk7Ci0JCQlpc1Nsb3QgPSB3cC5nZXRJc0Fic3RyYWN0KCk7Ci0JCX0KLQkJaWYgKGlzU2xvdCkgewkJCQotCQkJZWxlbWVudFhtbC5zZXRBdHRyaWJ1dGUoIlR5cGUiLCAiV29ya1Byb2R1Y3RTbG90Iik7IC8vJE5PTi1OTFMtMSQvLyROT04tTkxTLTIkCi0JCQllbGVtZW50WG1sLnNldEF0dHJpYnV0ZSgiVHlwZU5hbWUiLCBMaWJyYXJ5UmVzb3VyY2VzLldvcmtQcm9kdWN0U2xvdF90ZXh0KTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCQotCQlpZiAoaW5jbHVkZVJlZmVyZW5jZXMpIHsKLQotCQkJLy8gbm8gdGhpcyB3aWxsIGxvc2UgdGhlIGNvbnRyaWJ1dG9yCi0JCQkvLyBSb2xlIHJlc3BvbnNpYmxlUm9sZSA9Ci0JCQkvLyBBc3NvY2lhdGlvbkhlbHBlci5nZXRSZXNwb25zaWJsZVJvbGUoKFdvcmtQcm9kdWN0KXN1cGVyLmVsZW1lbnQpOwotCQkJLy9tdWx0aXBsaWNpdHkgY2hhbmdlIGZvciBvcHBvc2l0ZSBmZWF0dXJlcwotCQkJTGlzdCByZXNwb25zaWJsZVJvbGVzID0gQ29uZmlndXJhdGlvbkhlbHBlcgotCQkJCQkuY2FsYzBuRmVhdHVyZVZhbHVlKHN1cGVyLmVsZW1lbnQsCi0JCQkJCQkJQXNzb2NpYXRpb25IZWxwZXIuV29ya1Byb2R1Y3RfUmVzcG9uc2libGVSb2xlcywKLQkJCQkJCQlsYXlvdXRNYW5hZ2VyLmdldEVsZW1lbnRSZWFsaXplcigpKTsKLS8vCQkJaWYgKHJlc3BvbnNpYmxlUm9sZSAhPSBudWxsKSB7Ci0vLwkJCQlNZXRob2RFbGVtZW50IHJvbGUgPSBDb25maWd1cmF0aW9uSGVscGVyLmdldENhbGN1bGF0ZWRFbGVtZW50KAotLy8JCQkJCQkoTWV0aG9kRWxlbWVudCkgcmVzcG9uc2libGVSb2xlLCBsYXlvdXRNYW5hZ2VyCi0vLwkJCQkJCQkJLmdldENvbmZpZ3VyYXRpb24oKSk7Ci0vLwkJCQlpZiAocm9sZSAhPSBudWxsKSB7Ci0vLwkJCQkJU3RyaW5nIHJvbGVOYW1lID0gKChSb2xlKSByb2xlKS5nZXRQcmVzZW50YXRpb25OYW1lKCk7Ci0vLwkJCQkJaWYgKHJvbGVOYW1lID09IG51bGwgfHwgcm9sZU5hbWUubGVuZ3RoKCkgPT0gMCkgewotLy8JCQkJCQlyb2xlTmFtZSA9IHJvbGUuZ2V0TmFtZSgpOwotLy8JCQkJCX0KLS8vCQkJCQllbGVtZW50WG1sLnNldEF0dHJpYnV0ZSgicmVzcG9uc2libGVSb2xlTmFtZSIsIHJvbGVOYW1lKTsgLy8kTk9OLU5MUy0xJAotLy8JCQkJCWFkZFJlZmVyZW5jZShBc3NvY2lhdGlvbkhlbHBlci5Xb3JrUHJvZHVjdF9SZXNwb25zaWJsZVJvbGUsIGVsZW1lbnRYbWwsICJyZXNwb25zaWJsZVJvbGUiLCByb2xlKTsgLy8kTk9OLU5MUy0xJAotLy8JCQkJfQotLy8JCQl9Ci0JCQlhZGRSZWZlcmVuY2VzKEFzc29jaWF0aW9uSGVscGVyLldvcmtQcm9kdWN0X1Jlc3BvbnNpYmxlUm9sZXMsIGVsZW1lbnRYbWwsICJyZXNwb25zaWJsZVJvbGVzIiwgcmVzcG9uc2libGVSb2xlcyk7IC8vJE5PTi1OTFMtMSQKLQotCQkJLy8gQnJvd3NpbmcgYSBDb25maWd1cmF0aW9uIEluY2x1ZGVzIGEgUmVsYXRpb25zaGlwIHRoYXQgaXMgbm90IFBhcnQgb2YgdGhlIENvbmZpZ3VyYXRpb24KLQkJCS8vIHNob3VsZCBjYWxsIHRoZSBjb25maWd1cmF0aW9uIGhlbHBlciB0byByZWFsaXplIHRoZSB2YWx1ZQotCQkJLy8gdGhlcmUgaXMgbm8gb3Bwb3NpdGUgZmVhdHVyZSBkZWZpbmVkIGZvciB0aGlzLiAKLQkJCS8vIHdlIGdldCB0aGUgdmFsdWUgaW4gdHdvIHN0ZXBzOgotCQkJLy8gMS4gZ2V0IHRoZSB0YXNrcyB0aGF0IG91dHB1dCB0aGlzIFdQCi0JCQkvLyAyLiBnZXQgdGhlIHJvbGVzIHRoYXQgaXMgdGhlIHJlc3BvbnNpYmxlIGZvciB0aGUgdGFza3MKLS8vCQkJTGlzdCBtb2RpZnlSb2xlcyA9IEFzc29jaWF0aW9uSGVscGVyCi0vLwkJCQkJLmdldE1vZGlmaWVkQnkoKFdvcmtQcm9kdWN0KSBzdXBlci5lbGVtZW50KTsKLS8vCQkJbW9kaWZ5Um9sZXMgPSBDb25maWd1cmF0aW9uSGVscGVyLmdldENhbGN1bGF0ZWRFbGVtZW50cygKLS8vCQkJCQltb2RpZnlSb2xlcywgbGF5b3V0TWFuYWdlci5nZXRDb25maWd1cmF0aW9uKCkpOwotCQkJCi0vLwkJCUxpc3QgdGFza3MgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwbkZlYXR1cmVWYWx1ZSgKLS8vCQkJCQlzdXBlci5lbGVtZW50LCAKLS8vCQkJCQlBc3NvY2lhdGlvbkhlbHBlci5Xb3JrUHJvZHVjdF9PdXRwdXRGcm9tX1Rhc2tzLCAKLS8vCQkJCQlsYXlvdXRNYW5hZ2VyLmdldEVsZW1lbnRSZWFsaXplcigpKTsKLS8vCQkJTGlzdCBtb2RpZnlSb2xlcyA9IG5ldyBBcnJheUxpc3QoKTsKLS8vCQkJZm9yIChJdGVyYXRvciBpdCA9IHRhc2tzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTsgKSB7Ci0vLwkJCQlUYXNrIHQgPSAoVGFzaylpdC5uZXh0KCk7Ci0vLwkJCQlMaXN0IHJvbGVzID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMG5GZWF0dXJlVmFsdWUoCi0vLwkJCQkJCXQsIAotLy8JCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrX1BlcmZvcm1lZEJ5KCksIAotLy8JCQkJCQlsYXlvdXRNYW5hZ2VyLmdldEVsZW1lbnRSZWFsaXplcigpKTsKLS8vCQkJCWZvciAoSXRlcmF0b3IgaXRyID0gcm9sZXMuaXRlcmF0b3IoKTsgaXRyLmhhc05leHQoKTsgKSB7Ci0vLwkJCQkJT2JqZWN0IHIgPSBpdHIubmV4dCgpOwotLy8JCQkJCWlmICggIW1vZGlmeVJvbGVzLmNvbnRhaW5zKHIpICkgewotLy8JCQkJCQltb2RpZnlSb2xlcy5hZGQocik7Ci0vLwkJCQkJfQotLy8JCQkJfQotLy8JCQl9Ci0JCQkKLQkJCUxpc3QgbW9kaWZ5Um9sZXMgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGNNb2RpZnlSb2xlcygKLQkJCQkJKFdvcmtQcm9kdWN0KXN1cGVyLmVsZW1lbnQsIAotCQkJCQlsYXlvdXRNYW5hZ2VyLmdldEVsZW1lbnRSZWFsaXplcigpKTsKLQkJCQotCQkJLy8gdGhpcyBndXkgZG9lcyBub3QgaGF2ZSBhIGRlZmluZWQgb3Bwb3NpdGUgZmVhdHVyZQotCQkJLy8ganVzdCBwYXNzIG51bGwgYXMgaXQncyBmZWF0dXJlIG9iamVjdCwgSmluaHVhIFhpLCAwNC8xNy8yMDA2Ci0JCQlhZGRSZWZlcmVuY2VzKG51bGwsIGVsZW1lbnRYbWwsICJtb2RpZnlSb2xlcyIsIG1vZGlmeVJvbGVzKTsgLy8kTk9OLU5MUy0xJAotCi0JCQlMaXN0IGRvbWFpbnMgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwbkZlYXR1cmVWYWx1ZSgKLQkJCQkJc3VwZXIuZWxlbWVudCwgQXNzb2NpYXRpb25IZWxwZXIuV29ya1Byb2R1Y3RfRG9tYWlucywKLQkJCQkJbGF5b3V0TWFuYWdlci5nZXRFbGVtZW50UmVhbGl6ZXIoKSk7Ci0JCQlhZGRSZWZlcmVuY2VzKEFzc29jaWF0aW9uSGVscGVyLldvcmtQcm9kdWN0X0RvbWFpbnMsIGVsZW1lbnRYbWwsICJkb21haW5zIiwgZG9tYWlucyk7IC8vJE5PTi1OTFMtMSQKLQotCQkJTGlzdCB3b3JrUHJvZHVjdFR5cGVzID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMG5GZWF0dXJlVmFsdWUoc3VwZXIuZWxlbWVudCwKLQkJCQkJQXNzb2NpYXRpb25IZWxwZXIuV29ya1Byb2R1Y3RfV29ya1Byb2R1Y3RUeXBlcywKLQkJCQkJbGF5b3V0TWFuYWdlci5nZXRFbGVtZW50UmVhbGl6ZXIoKSk7Ci0JCQlhZGRSZWZlcmVuY2VzKEFzc29jaWF0aW9uSGVscGVyLldvcmtQcm9kdWN0X1dvcmtQcm9kdWN0VHlwZXMsIGVsZW1lbnRYbWwsICJ3b3JrUHJvZHVjdFR5cGVzIiwgd29ya1Byb2R1Y3RUeXBlcyk7IC8vJE5PTi1OTFMtMSQKLQotCQkJTGlzdCBtYW5kYXRvcnlJbnB1dFRvVGFza3MgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwbkZlYXR1cmVWYWx1ZShzdXBlci5lbGVtZW50LAotCQkJCQlBc3NvY2lhdGlvbkhlbHBlci5Xb3JrUHJvZHVjdF9NYW5kYXRvcnlJbnB1dFRvX1Rhc2tzLAotCQkJCQlsYXlvdXRNYW5hZ2VyLmdldEVsZW1lbnRSZWFsaXplcigpKTsKLQkJCWFkZFJlZmVyZW5jZXMoQXNzb2NpYXRpb25IZWxwZXIuV29ya1Byb2R1Y3RfTWFuZGF0b3J5SW5wdXRUb19UYXNrcywgZWxlbWVudFhtbCwKLQkJCQkJIm1hbmRhdG9yeUlucHV0VG9UYXNrcyIsIG1hbmRhdG9yeUlucHV0VG9UYXNrcyk7IC8vJE5PTi1OTFMtMSQKLQotCQkJTGlzdCBvcHRpb25hbElucHV0VG9UYXNrcyA9IENvbmZpZ3VyYXRpb25IZWxwZXIuY2FsYzBuRmVhdHVyZVZhbHVlKHN1cGVyLmVsZW1lbnQsCi0JCQkJCUFzc29jaWF0aW9uSGVscGVyLldvcmtQcm9kdWN0X09wdGlvbmFsSW5wdXRUb19UYXNrcywKLQkJCQkJbGF5b3V0TWFuYWdlci5nZXRFbGVtZW50UmVhbGl6ZXIoKSk7Ci0JCQlhZGRSZWZlcmVuY2VzKEFzc29jaWF0aW9uSGVscGVyLldvcmtQcm9kdWN0X09wdGlvbmFsSW5wdXRUb19UYXNrcywgZWxlbWVudFhtbCwKLQkJCQkJIm9wdGlvbmFsSW5wdXRUb1Rhc2tzIiwgb3B0aW9uYWxJbnB1dFRvVGFza3MpOyAvLyROT04tTkxTLTEkCi0KLQkJCUxpc3Qgb3V0cHV0RnJvbVRhc2tzID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMG5GZWF0dXJlVmFsdWUoc3VwZXIuZWxlbWVudCwKLQkJCQkJQXNzb2NpYXRpb25IZWxwZXIuV29ya1Byb2R1Y3RfT3V0cHV0RnJvbV9UYXNrcywKLQkJCQkJbGF5b3V0TWFuYWdlci5nZXRFbGVtZW50UmVhbGl6ZXIoKSk7Ci0JCQlhZGRSZWZlcmVuY2VzKEFzc29jaWF0aW9uSGVscGVyLldvcmtQcm9kdWN0X091dHB1dEZyb21fVGFza3MsIAotCQkJCQllbGVtZW50WG1sLCAib3V0cHV0RnJvbVRhc2tzIiwgb3V0cHV0RnJvbVRhc2tzKTsgLy8kTk9OLU5MUy0xJAotCQkJCi0JCQlpbmNsdWRlU2xvdFJlZmVyZW5jZXMoZWxlbWVudFhtbCk7Ci0JCQkKLQkJCS8vIGFkZCB0aGUgZGVzY3JpcHRvcnMgcmVmZXJlbmNpbmcgdGhpcyBlbGVtZW50Ci0JCQlzdXBlci5wcm9jZXNzRGVzY3JpcHRvcnMoZWxlbWVudFhtbCk7Ci0KLQkJfQotCQllbGVtZW50WG1sLnNldEF0dHJpYnV0ZSgiU2hvd0Z1bGxNZXRob2RDb250ZW50IiwgKGxheW91dE1hbmFnZXIuZ2V0VmFsaWRhdG9yKCkuc2hvd0V4dHJhSW5mb0ZvckRlc2NyaXB0b3JzKCkpID8gInRydWUiIDogImZhbHNlIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQotCQlyZXR1cm4gZWxlbWVudFhtbDsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGluY2x1ZGVTbG90UmVmZXJlbmNlcyhYbWxFbGVtZW50IGVsZW1lbnRYbWwpIHsKLQkJRWxlbWVudFJlYWxpemVyIHJlYWxpemVyID0gbGF5b3V0TWFuYWdlci5nZXRFbGVtZW50UmVhbGl6ZXIoKTsJCQotCQlGdWxmaWxsYWJsZUVsZW1lbnQgZkVsZW1lbnQgPSAoRnVsZmlsbGFibGVFbGVtZW50KSBnZXRFbGVtZW50KCk7Ci0JCWlmIChmRWxlbWVudC5nZXRJc0Fic3RyYWN0KCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQlMaXN0IHNsb3RzID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjRnVsZmlsbGFibGVFbGVtZW50X0Z1bGZpbGxzKAotCQkJCWZFbGVtZW50LCByZWFsaXplci5nZXRDb25maWd1cmF0aW9uKCkpOwotCQkJCQotCQlhZGRTbG90UmVmZXJlbmNlcyhlbGVtZW50WG1sLAotCQkJCUFzc29jaWF0aW9uSGVscGVyLldvcmtQcm9kdWN0X01hbmRhdG9yeUlucHV0VG9fVGFza3MsCi0JCQkJIm1hbmRhdG9yeUlucHV0VG9UYXNrc19mcm9tU2xvdHMiLCBzbG90cywgcmVhbGl6ZXIpOwkvLyROT04tTkxTLTEkCi0KLQkJYWRkU2xvdFJlZmVyZW5jZXMoZWxlbWVudFhtbCwKLQkJCQlBc3NvY2lhdGlvbkhlbHBlci5Xb3JrUHJvZHVjdF9PcHRpb25hbElucHV0VG9fVGFza3MsCi0JCQkJIm9wdGlvbmFsSW5wdXRUb1Rhc2tzX2Zyb21TbG90cyIsIHNsb3RzLCByZWFsaXplcik7CS8vJE5PTi1OTFMtMSQKLQotCQlhZGRTbG90UmVmZXJlbmNlcyhlbGVtZW50WG1sLAotCQkJCUFzc29jaWF0aW9uSGVscGVyLldvcmtQcm9kdWN0X091dHB1dEZyb21fVGFza3MsCi0JCQkJIm91dHB1dEZyb21UYXNrc19mcm9tU2xvdHMiLCBzbG90cywgcmVhbGl6ZXIpOwkvLyROT04tTkxTLTEkCQotCX0KLQkKLQlwcml2YXRlIHZvaWQgYWRkU2xvdFJlZmVyZW5jZXMoWG1sRWxlbWVudCBlbGVtZW50WG1sLCBPcHBvc2l0ZUZlYXR1cmUgb2ZlYXR1cmUsIFN0cmluZyByZWZlcmVuY2VOYW1lLCBMaXN0PEZ1bGZpbGxhYmxlRWxlbWVudD4gc2xvdHMsIEVsZW1lbnRSZWFsaXplciByZWFsaXplcikgewotCQlMaXN0IHJlZmVyZW5jZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQotCQlmb3IgKEZ1bGZpbGxhYmxlRWxlbWVudCBmRWxlbWVudDogc2xvdHMpIHsKLQkJCUxpc3QgbGlzdCA9IENvbmZpZ3VyYXRpb25IZWxwZXIuY2FsYzBuRmVhdHVyZVZhbHVlKGZFbGVtZW50LCBvZmVhdHVyZSwgcmVhbGl6ZXIpOwotCQkJbGlzdCA9IGdldFRhZ1F1YWxpZmllZExpc3QocmVhbGl6ZXIuZ2V0Q29uZmlndXJhdGlvbigpLCBsaXN0KTsKLQkJCXJlZmVyZW5jZXMuYWRkQWxsKGxpc3QpOwotCQl9Ci0KLQkJYWRkUmVmZXJlbmNlcyhvZmVhdHVyZSwgZWxlbWVudFhtbCwgcmVmZXJlbmNlTmFtZSwgcmVmZXJlbmNlcyk7IAotCX0KLQkJCi0JcHJvdGVjdGVkIExpc3QgY2FsYzBuRmVhdHVyZVZhbHVlKE1ldGhvZEVsZW1lbnQgZWxlbWVudCwKLQkJCU1ldGhvZEVsZW1lbnQgb3duZXJFbGVtZW50LCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwKLQkJCUVsZW1lbnRSZWFsaXplciByZWFsaXplcikgewotCQlpZiAoZmVhdHVyZSA9PSBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRGdWxmaWxsYWJsZUVsZW1lbnRfRnVsZmlsbHMoKSkgewotCQkJcmV0dXJuIENvbmZpZ3VyYXRpb25IZWxwZXIuY2FsY0Z1bGZpbGxhYmxlRWxlbWVudF9GdWxmaWxscygKLQkJCQkJKEZ1bGZpbGxhYmxlRWxlbWVudCkgZWxlbWVudCwgcmVhbGl6ZXIuZ2V0Q29uZmlndXJhdGlvbigpKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuY2FsYzBuRmVhdHVyZVZhbHVlKGVsZW1lbnQsIG93bmVyRWxlbWVudCwgZmVhdHVyZSwKLQkJCQlsYXlvdXRNYW5hZ2VyLmdldEVsZW1lbnRSZWFsaXplcigpKTsKLQl9CQotCi0JcHJvdGVjdGVkIExpc3QgY2FsYzBuRmVhdHVyZVZhbHVlKE1ldGhvZEVsZW1lbnQgZWxlbWVudCwKLQkJCU9wcG9zaXRlRmVhdHVyZSBmZWF0dXJlLCBFbGVtZW50UmVhbGl6ZXIgcmVhbGl6ZXIpIHsKLQkJaWYgKGZlYXR1cmUgPT0gQXNzb2NpYXRpb25IZWxwZXIuRnVsRmlsbHNfRnVsbEZpbGxhYmxlRWxlbWVudHMpIHsKLQkJCXJldHVybiBDb25maWd1cmF0aW9uSGVscGVyLmNhbGNGdWxmaWxsc19GdWxmaWxsYWJsZUVsZW1lbnQoCi0JCQkJCShGdWxmaWxsYWJsZUVsZW1lbnQpIGVsZW1lbnQsIHJlYWxpemVyLmdldENvbmZpZ3VyYXRpb24oKSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmNhbGMwbkZlYXR1cmVWYWx1ZShlbGVtZW50LCBmZWF0dXJlLCBsYXlvdXRNYW5hZ2VyCi0JCQkJLmdldEVsZW1lbnRSZWFsaXplcigpKTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L2VsZW1lbnRzL3BhY2thZ2UuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZWxlbWVudHMvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4N2M0ZjNlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZWxlbWVudHMvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgbGF5b3V0IG1hbmFnZW1lbnQgZm9yIG1ldGhvZCBhbmQgcHJvY2VzcyBlbGVtZW50cyBpbiBhIHB1Ymxpc2hlZCBjb25maWd1cmF0aW9uLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvcGFja2FnZS5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkNWJlZjUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyB0aGUgaW50ZXJmYWNlcyBmb3IgbWFuYWdpbmcgdGhlIGxheW91dCBvZiBtZXRob2QgYW5kIHByb2Nlc3MgZWxlbWVudHMgaW4gYSBwdWJsaXNoZWQgY29uZmlndXJhdGlvbi4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L3V0aWwvSVhtbEVsZW1lbnQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvdXRpbC9JWG1sRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZWM4Nzg5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvdXRpbC9JWG1sRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LnV0aWw7Ci0KLS8qKgotICogVGhlIGludGVyZmFjZSBmb3IgYW4gWE1MIGVsZW1lbnQuCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVhtbEVsZW1lbnQgewotCi0JLyoqCi0JICogZ2V0IHRoZSB4bWwgc3RyaW5nIHRleHQKLQkgKiBAcmV0dXJuIFN0cmluZ0J1ZmZlcgotCSAqLwotCXB1YmxpYyBTdHJpbmdCdWZmZXIgdG9YbWwoKTsKLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC91dGlsL1htbEVsZW1lbnQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvdXRpbC9YbWxFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmZjk2MTAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC91dGlsL1htbEVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyMiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQudXRpbDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbVdyaXRlcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5GaWxlVXRpbDsKLQotCi0vKioKLSAqIEltcGxlbWVudHMgYSBYTUwgZWxlbWVudC4KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgWG1sRWxlbWVudCBpbXBsZW1lbnRzIElYbWxFbGVtZW50IHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJSID0gRmlsZVV0aWwuTElORV9TRVA7Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgTk9ERV9JRCA9ICJub2RlSWQiOyAvLyROT04tTkxTLTEkCi0KLQkvLyBwcml2YXRlIHN0YXRpYyBTdHJpbmcgUEFSRU5UX05PREVfSUQgPSAicGFyZW50Tm9kZUlkIjsKLQotCXByaXZhdGUgU3RyaW5nIGVsZW1lbnRfbmFtZSA9IG51bGw7Ci0KLQlwcml2YXRlIFN0cmluZyBlbGVtZW50X3ZhbHVlID0gbnVsbDsKLQotCXByaXZhdGUgTWFwIGF0dHJpYnV0ZXMgPSBuZXcgSGFzaE1hcCgpOwotCi0JcHJpdmF0ZSBNYXAgY29udGVudHMgPSBuZXcgSGFzaE1hcCgpOwotCi0JcHJpdmF0ZSBMaXN0IGNoaWxkcmVuID0gbmV3IEFycmF5TGlzdCgpOwotCi0JcHJpdmF0ZSBTdHJpbmcgaWQgPSBudWxsOwotCi0JLyoqCi0JICogY3JlYXRlIGFuIFhtbEVsZW1lbnQKLQkgKiAKLQkgKiBAcGFyYW0gbmFtZSBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgWG1sRWxlbWVudChTdHJpbmcgbmFtZSkgewotCQl0aGlzKG5hbWUsIG51bGwpOwotCX0KLQotCS8qKgotCSAqIGNyZWF0ZSBhbiBYbWxFbGVtZW50Ci0JICogQHBhcmFtIG5hbWUgU3RyaW5nCi0JICogQHBhcmFtIGlkIFN0cmluZwotCSAqLwotCXB1YmxpYyBYbWxFbGVtZW50KFN0cmluZyBuYW1lLCBTdHJpbmcgaWQpIHsKLQkJdGhpcy5lbGVtZW50X25hbWUgPSBuYW1lOwotCQkKLQkJaWYgKGlkID09IG51bGwgKSB7Ci0JCQlpZCA9IEludGVnZXIudG9IZXhTdHJpbmcodGhpcy50b1N0cmluZygpLmhhc2hDb2RlKCkpOwotCQl9Ci0JCQotCQl0aGlzLmlkID0gaWQ7Ci0JCXNldEF0dHJpYnV0ZShOT0RFX0lELCB0aGlzLmlkKTsKLQl9Ci0JCi0JLyoqCi0JICogc2V0IGF0dHJpYnV0ZQotCSAqIEBwYXJhbSBuYW1lCi0JICogQHBhcmFtIHZhbHVlCi0JICogQHJldHVybiBYbWxFbGVtZW50IHRoZSBlbGVtZW50IGl0c2VsZgotCSAqLwotCXB1YmxpYyBYbWxFbGVtZW50IHNldEF0dHJpYnV0ZShTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlKSB7Ci0JCWF0dHJpYnV0ZXMucHV0KG5hbWUsIHZhbHVlKTsKLQkJcmV0dXJuIHRoaXM7Ci0JfQotCi0JLyoqCi0JICogc2V0IHRoZSB2YWx1ZSBvZiB0aGUgZWxlbWVudAotCSAqIEBwYXJhbSB2YWx1ZQotCSAqIEByZXR1cm4gWG1sRWxlbWVudCB0aGUgZWxlbWVudCBpdHNlbGYKLQkgKi8KLQlwdWJsaWMgWG1sRWxlbWVudCBzZXRWYWx1ZShTdHJpbmcgdmFsdWUpIHsKLQkJdGhpcy5lbGVtZW50X3ZhbHVlID0gdmFsdWU7Ci0JCXJldHVybiB0aGlzOwotCX0KLQotCS8qKgotCSAqIHNldCB0aGUgY29udGVudCBvZiB0aGUgZWxlbWVudC4KLQkgKiBAcGFyYW0gbmFtZQotCSAqIEBwYXJhbSB2YWx1ZQotCSAqIEByZXR1cm4gWG1sRWxlbWVudCB0aGUgZWxlbWVudCBpdHNlbGYKLQkgKi8KLQlwdWJsaWMgWG1sRWxlbWVudCBzZXRDb250ZW50KFN0cmluZyBuYW1lLCBPYmplY3QgdmFsdWUpIHsKLQkJY29udGVudHMucHV0KG5hbWUsIHZhbHVlKTsKLQkJcmV0dXJuIHRoaXM7Ci0JfQotCi0JLyoqCi0JICogYWRkIGEgY2hpbGQgZWxlbWVudAotCSAqIEBwYXJhbSBjaGlsZAotCSAqIEByZXR1cm4gWG1sRWxlbWVudCB0aGUgZWxlbWVudCBpdHNlbGYKLQkgKi8KLQlwdWJsaWMgWG1sRWxlbWVudCBhZGRDaGlsZChYbWxFbGVtZW50IGNoaWxkKSB7Ci0JCWNoaWxkcmVuLmFkZChjaGlsZCk7Ci0JCXJldHVybiB0aGlzOwotCX0KLQotCS8qKgotCSAqIGNyZWF0ZSBhIG5ldyBjaGlpbGQgZWxlbWVudAotCSAqIEBwYXJhbSBuYW1lCi0JICogQHJldHVybiBYbWxFbGVtZW50IHRoZSBjaGlsZCBlbGVtZW50Ci0JICovCi0JcHVibGljIFhtbEVsZW1lbnQgbmV3Q2hpbGQoU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIG5ld0NoaWxkKG5hbWUsIG51bGwpOwotCX0KLQkKLQkvKioKLQkgKiBjcmVhdGUgYSBuZXcgY2hpbGQgZWxlbWVudAotCSAqIEBwYXJhbSBuYW1lCi0JICogQHBhcmFtIGlkCi0JICogQHJldHVybiBYbWxFbGVtZW50IHRoZSBjaGlsZCBlbGVtZW50Ci0JICovCi0JcHVibGljIFhtbEVsZW1lbnQgbmV3Q2hpbGQoU3RyaW5nIG5hbWUsIFN0cmluZyBpZCkgewotCQlYbWxFbGVtZW50IGNoaWxkID0gbmV3IFhtbEVsZW1lbnQobmFtZSwgaWQpOwotCQljaGlsZHJlbi5hZGQoY2hpbGQpOwotCQlyZXR1cm4gY2hpbGQ7Ci0JfQotCi0JLyoqCi0JICogZ2V0IHRoZSBpZAotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJcmV0dXJuIHRoaXMuaWQ7Ci0JfQotCQotCS8qKgotCSAqIGdldCB0aGUgeG1sIHN0cmluZwotCSAqIEByZXR1cm4gU3RyaW5nQnVmZmVyCi0JICovCi0JcHVibGljIFN0cmluZ0J1ZmZlciB0b1htbCgpIHsKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJaWYgKGNvbnRlbnRzLnNpemUoKSA9PSAwICYmIGNoaWxkcmVuLnNpemUoKSA9PSAwKSB7Ci0JCQlidWZmZXIuYXBwZW5kKAotCQkJCQlYbWxIZWxwZXIuZ2V0RWxlbWVudChlbGVtZW50X25hbWUsIGVsZW1lbnRfdmFsdWUsCi0JCQkJCQkJYXR0cmlidXRlcykpLmFwcGVuZChCUik7Ci0JCX0gZWxzZSB7Ci0JCQlidWZmZXIuYXBwZW5kKFhtbEhlbHBlci5iZWdpbkVsZW1lbnQoZWxlbWVudF9uYW1lLCBhdHRyaWJ1dGVzKSkKLQkJCQkJLmFwcGVuZChCUik7Ci0KLQkJCS8vIHByb2Nlc3MgdGhlIGNvbnRlbnRzCi0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gY29udGVudHMuZW50cnlTZXQoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSkgaXQubmV4dCgpOwotCQkJCVN0cmluZyBrZXkgPSAoU3RyaW5nKSBlbnRyeS5nZXRLZXkoKTsKLQkJCQlPYmplY3QgdmFsdWUgPSBlbnRyeS5nZXRWYWx1ZSgpOwotCQkJCWlmICh2YWx1ZSBpbnN0YW5jZW9mIExpc3QpIHsKLQkJCQkJZm9yIChJdGVyYXRvciBpdExpc3QgPSAoKExpc3QpIHZhbHVlKS5pdGVyYXRvcigpOyBpdExpc3QKLQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJYnVmZmVyLmFwcGVuZCgKLQkJCQkJCQkJWG1sSGVscGVyLmdldEVsZW1lbnQoa2V5LCBpdExpc3QubmV4dCgpCi0JCQkJCQkJCQkJLnRvU3RyaW5nKCksIG51bGwpKS5hcHBlbmQoQlIpOwotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJYnVmZmVyCi0JCQkJCQkJLmFwcGVuZCgKLQkJCQkJCQkJCVhtbEhlbHBlcgotCQkJCQkJCQkJCQkuZ2V0RWxlbWVudCgKLQkJCQkJCQkJCQkJCQlrZXksCi0JCQkJCQkJCQkJCQkJKHZhbHVlID09IG51bGwpID8gIiIgOiB2YWx1ZS50b1N0cmluZygpLCBudWxsKSkuYXBwZW5kKEJSKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCX0KLQotCQkJLy8gcHJvY2VzcyB0aGUgY2hpbGRyZW4KLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBjaGlsZHJlbi5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJSVhtbEVsZW1lbnQgY2hpbGQgPSAoSVhtbEVsZW1lbnQpIGl0Lm5leHQoKTsKLQkJCQlidWZmZXIuYXBwZW5kKGNoaWxkLnRvWG1sKCkpOwotCQkJfQotCi0JCQlidWZmZXIuYXBwZW5kKFhtbEhlbHBlci5lbmRFbGVtZW50KGVsZW1lbnRfbmFtZSkpLmFwcGVuZChCUik7Ci0JCX0KLQotCQlyZXR1cm4gYnVmZmVyOwotCX0KLQotCS8qKgotCSAqIHNhdmUgdGhlIGVsZW1lbnQncyB4bWwgdG8gYSBmaWxlCi0JICogQHBhcmFtIGZpbGVQYXRoTmFtZQotCSAqLwotCXB1YmxpYyB2b2lkIHNhdmVUbyhTdHJpbmcgZmlsZVBhdGhOYW1lKSB7Ci0JCVN0cmluZ0J1ZmZlciB4bWwgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCXhtbC5hcHBlbmQoWG1sSGVscGVyLlhNTF9IRUFERVIpLmFwcGVuZCh0aGlzLnRvWG1sKCkpOwotCi0JCXRyeSB7Ci0JCQkvLyBtYXkgbmVlZCB0byBjcmVhdGUgdGhlIGZvbGRlcnMsIFRPRE8KLQkJCS8qCi0JCQkgKiBGaWxlIHhmID0gbmV3IEZpbGUoIGZpbGVQYXRoKTsgaWYgKCAheGYuZXhpc3RzKCkgKSB7IHhmLm1rZGlycygpOyB9Ci0JCQkgKi8KLQotCQkJLy8gbmVlZCB0byBlbmZvcmUgdXRmLTggZW5jb2RpbmcsIGNhbid0IHVzZSBGaWxlV3JpdGVyLCBqeGkKLQkJCS8vIEZpbGVXcml0ZXIgeHcgPSBuZXcgRmlsZVdyaXRlcihmaWxlUGF0aE5hbWUpOwotCQkJT3V0cHV0U3RyZWFtV3JpdGVyIHh3ID0gbmV3IE91dHB1dFN0cmVhbVdyaXRlcigKLQkJCQkJbmV3IEZpbGVPdXRwdXRTdHJlYW0oZmlsZVBhdGhOYW1lKSwgInV0Zi04Iik7IC8vJE5PTi1OTFMtMSQKLQotCQkJeHcud3JpdGUoeG1sLnRvU3RyaW5nKCkpOwotCQkJeHcuZmx1c2goKTsKLQkJCXh3LmNsb3NlKCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L3V0aWwvWG1sSGVscGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L3V0aWwvWG1sSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1ZmFkMjUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC91dGlsL1htbEhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuRmlsZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5YTUxVdGlsOwotCi0KLS8qKgotICogSGVscGVyIGNsYXNzIGZvciBwcm9jZXNzaW5nIHRoZSBYTUwgcmVwcmVzZW50YXRpb24gb2YgYSBNZXRob2QgRWxlbWVudC4KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICovCi1wdWJsaWMgY2xhc3MgWG1sSGVscGVyIHsKLQotCS8qKgotCSAqIFhNTCBkZWNsYXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBYTUxfSEVBREVSID0gWE1MVXRpbC5YTUxfREVDTEFSQVRJT04KLQkJCSsgRmlsZVV0aWwuTElORV9TRVA7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB2YWxpZE5hbWUoU3RyaW5nIGVsZW1lbnROYW1lKSB7Ci0JCXJldHVybiBYTUxVdGlsLmVzY2FwZShlbGVtZW50TmFtZS5yZXBsYWNlKCcgJywgJy0nKSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcXVvdGUoU3RyaW5nIHN0cikgewotCQlyZXR1cm4gIlwiIiArIHN0ciArICJcIiI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHZhbGlkYXRlKFN0cmluZyBzKSB7Ci0JCXJldHVybiBzID09IG51bGwgPyAiIiA6IHM7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBjcmVhdGUgdGhlIHN0YXJ0IHRhZyBvZiBhbiB4bWwgZWxlbWVudAotCSAqIEBwYXJhbSBlbGVtZW50TmFtZQotCSAqIEBwYXJhbSBhdHRyaWJ1dGVzCi0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBiZWdpbkVsZW1lbnQoU3RyaW5nIGVsZW1lbnROYW1lLCBNYXAgYXR0cmlidXRlcykgewotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlidWZmZXIuYXBwZW5kKCI8IiArIHZhbGlkTmFtZShlbGVtZW50TmFtZSkpOyAvLyROT04tTkxTLTEkCi0JCWlmICgoYXR0cmlidXRlcyAhPSBudWxsKSAmJiAoYXR0cmlidXRlcy5zaXplKCkgPiAwKSkgewotCQkJSXRlcmF0b3IgaXQgPSBhdHRyaWJ1dGVzLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsKLQkJCVN0cmluZyBrZXksIHZhbHVlOwotCQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJCU1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIGl0Lm5leHQoKTsKLQkJCQlrZXkgPSAoU3RyaW5nKSBlbnRyeS5nZXRLZXkoKTsKLQkJCQl2YWx1ZSA9IHF1b3RlKFhNTFV0aWwuZXNjYXBlKAotCQkJCQkJdmFsaWRhdGUoKFN0cmluZykgZW50cnkuZ2V0VmFsdWUoKSksIHRydWUpKTsKLQkJCQlidWZmZXIuYXBwZW5kKCIgIiArIHZhbGlkTmFtZShrZXkpICsgIj0iICsgdmFsdWUpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCX0KLQkJfQotCQlidWZmZXIuYXBwZW5kKCI+Iik7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIGNyZWF0ZSBhbiBlbmQgdGFnIG9mIGFuIHhtbCBlbGVtZW50Ci0JICogQHBhcmFtIGVsZW1lbnROYW1lCi0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlbmRFbGVtZW50KFN0cmluZyBlbGVtZW50TmFtZSkgewotCQlyZXR1cm4gIjwvIiArIHZhbGlkTmFtZShlbGVtZW50TmFtZSkgKyAiPiI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIGNyZWF0ZSBhbiB4bWwgZWxlbWVudCBzdHJpbmcKLQkgKiBAcGFyYW0gZWxlbWVudE5hbWUKLQkgKiBAcGFyYW0gZWxlbWVudFZhbHVlCi0JICogQHBhcmFtIGF0dHJpYnV0ZXMKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEVsZW1lbnQoU3RyaW5nIGVsZW1lbnROYW1lLCBTdHJpbmcgZWxlbWVudFZhbHVlLAotCQkJTWFwIGF0dHJpYnV0ZXMpIHsKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJYnVmZmVyLmFwcGVuZChiZWdpbkVsZW1lbnQoZWxlbWVudE5hbWUsIGF0dHJpYnV0ZXMpKS5hcHBlbmQoCi0JCQkJWE1MVXRpbC5lc2NhcGUodmFsaWRhdGUoZWxlbWVudFZhbHVlKSwgdHJ1ZSkpLmFwcGVuZCgKLQkJCQllbmRFbGVtZW50KGVsZW1lbnROYW1lKSk7Ci0JCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvdXRpbC9wYWNrYWdlLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L3V0aWwvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZDBmMDM0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvdXRpbC9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyBsYXlvdXQgbWFuYWdlbWVudCBzdXBwb3J0IGZvciBtZXRob2QgYW5kIHByb2Nlc3MgZWxlbWVudHMuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3BhY2thZ2UuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5MTYxNTEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIHRoZSBpbnRlcmZhY2VzIGZvciB0aGUgbGlicmFyeSBzZXJ2aWNlLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9wcmVmZXJlbmNlcy9MaWJyYXJ5UHJlZmVyZW5jZXMuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9wcmVmZXJlbmNlcy9MaWJyYXJ5UHJlZmVyZW5jZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTE5YTliYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvcHJlZmVyZW5jZXMvTGlicmFyeVByZWZlcmVuY2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucHJlZmVyZW5jZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnByZWZlcmVuY2VzLklQcmVmZXJlbmNlU3RvcmVXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlQbHVnaW47Ci0KLS8qKgotICogVGhlIExpYnJhcnkgcHJlZmVyZW5jZXMuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTGlicmFyeVByZWZlcmVuY2VzIHsKLQotCS8qKgotCSAqIFByZWZlcmVuY2Uga2V5IGZvciBzdG9yaW5nIHRoZSBVUkkgb2YgdGhlIG1ldGhvZCBsaWJyYXJ5IHRoYXQgd2FzIG9wZW5lZAotCSAqIGluIHRoZSBsYXN0IHNlc3Npb24uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0FWRURfTUVUSE9EX0xJUkFSWV9VUkkgPSAic2F2ZWRNZXRob2RMaWJyYXJ5VVJJIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogUHJlZmVyZW5jZSBrZXkgZm9yIHN0b3JpbmcgdGhlIHR5cGUgb2YgdGhlIG1ldGhvZCBsaWJyYXJ5IHRoYXQgd2FzIG9wZW5lZAotCSAqIGluIHRoZSBsYXN0IHNlc3Npb24uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0FWRURfTUVUSE9EX0xJUkFSWV9UWVBFID0gInNhdmVkTWV0aG9kTGlicmFyeVR5cGUiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBQcmVmZXJlbmNlIGtleSBmb3Igc3RvcmluZyB0aGUgZGlzY2FyZCB1bnJlc29sdmVkIHJlZmVyZW5jZXMuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElTQ0FSRF9VTlJFU09MVkVEX1JFRkVSRU5DRVMgPSAiZGlzY2FyZFVucmVzb2x2ZWRSZWZlcmVuY2VzIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogUHJlZmVyZW5jZSBrZXkgZm9yIHVzZSBuZXcgZXh0ZW5kcyBzZW1hbnRpY3MuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVNFX05FV19FWFRFTkRTX1NFTUFOVElDUyA9ICJ1c2VOZXdFeHRlbmRzU2VtYW50aWNzIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogUHJlZmVyZW5jZSBrZXkgZm9yIHRoZSBob3Jpem9udGFsIHNwYWNpbmcgYmV0d2VlbiB0YXNrcyBhbmQgcm9sZXMgaW4gdGhlCi0JICogcm9sZSBkaWFncmFtLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJPTEVfRElBR1JBTV9IT1JJWk9OVEFMX1NQQUNJTkcgPSAicm9sZURpYWdyYW1Ib3Jpem9udGFsU3BhY2luZyI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFByZWZlcmVuY2Uga2V5IGZvciB0aGUgdmVydGljYWwgc3BhY2luZyBiZXR3ZWVuIHRhc2tzIGFuZCByb2xlcyBpbiB0aGUKLQkgKiByb2xlIGRpYWdyYW0uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUk9MRV9ESUFHUkFNX1ZFUlRJQ0FMX1NQQUNJTkcgPSAicm9sZURpYWdyYW1WZXJ0aWNhbFNwYWNpbmciOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBQcmVmZXJlbmNlIGtleSBmb3IgdGhlIG1heGltdW4gZWxlbWVudCBsYWJlbCB0ZXh0IGxpbmVzIGluIHRoZSByb2xlCi0JICogZGlhZ3JhbS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBST0xFX0RJQUdSQU1fTUFYX1RFWFRfTElORVMgPSAicm9sZURpYWdyYW1FbGVtZW50TGFiZWxUZXh0TGluZXMiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERFRkFVTFRfRElTQ0FSRF9VTlJFU09MVkVEX1JFRkVSRU5DRVMgPSBmYWxzZTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVGQVVMVF9VU0VfTkVXX0VYVEVORFNfU0VNQU5USUNTID0gZmFsc2U7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9ST0xFX0RJQUdSQU1fSE9SSVpPTlRBTF9TUEFDSU5HID0gNzA7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9ST0xFX0RJQUdSQU1fVkVSVElDQUxfU1BBQ0lORyA9IDMwOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfUk9MRV9ESUFHUkFNX01BWF9URVhUX0xJTkVTID0gMzsKLQotCS8vIFRoZSBwbHVnLWluIHNwZWNpZmljIHByZWZlcmVuY2Ugc3RvcmUuCi0JcHJpdmF0ZSBzdGF0aWMgSVByZWZlcmVuY2VTdG9yZVdyYXBwZXIgcHJlZlN0b3JlID0gTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQotCXN0YXRpYyB7Ci0JCS8vIEluaXRpYWxpemUgdGhlIGRlZmF1bHQgcHJlZmVyZW5jZSB2YWx1ZXMuCi0JCXByZWZTdG9yZS5zZXREZWZhdWx0KERJU0NBUkRfVU5SRVNPTFZFRF9SRUZFUkVOQ0VTLAotCQkJCURFRkFVTFRfRElTQ0FSRF9VTlJFU09MVkVEX1JFRkVSRU5DRVMpOwotCQlwcmVmU3RvcmUuc2V0RGVmYXVsdChVU0VfTkVXX0VYVEVORFNfU0VNQU5USUNTLAotCQkJCURFRkFVTFRfVVNFX05FV19FWFRFTkRTX1NFTUFOVElDUyk7Ci0KLQkJcHJlZlN0b3JlLnNldERlZmF1bHQoUk9MRV9ESUFHUkFNX0hPUklaT05UQUxfU1BBQ0lORywKLQkJCQlERUZBVUxUX1JPTEVfRElBR1JBTV9IT1JJWk9OVEFMX1NQQUNJTkcpOwotCQlwcmVmU3RvcmUuc2V0RGVmYXVsdChST0xFX0RJQUdSQU1fVkVSVElDQUxfU1BBQ0lORywKLQkJCQlERUZBVUxUX1JPTEVfRElBR1JBTV9WRVJUSUNBTF9TUEFDSU5HKTsKLQkJcHJlZlN0b3JlLnNldERlZmF1bHQoUk9MRV9ESUFHUkFNX01BWF9URVhUX0xJTkVTLAotCQkJCURFRkFVTFRfUk9MRV9ESUFHUkFNX01BWF9URVhUX0xJTkVTKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBVUkkgb2YgdGhlIG1ldGhvZCBsaWJyYXJ5IHRoYXQgd2FzIG9wZW5lZCBpbiB0aGUgbGFzdCBzZXNzaW9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFNhdmVkTWV0aG9kTGlicmFyeVVSSSgpIHsKLQkJcmV0dXJuIHByZWZTdG9yZS5nZXRTdHJpbmcoU0FWRURfTUVUSE9EX0xJUkFSWV9VUkkpOwotCX0KLQotCS8qKgotCSAqIFNhdmVzIHRoZSBVUkkgb2YgdGhlIG1ldGhvZCBsaWJyYXJ5IHRoYXQgd2FzIG9wZW5lZCBpbiB0aGUgbGFzdCBzZXNzaW9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRTYXZlZE1ldGhvZExpYnJhcnlVUkkoU3RyaW5nIHZhbHVlKSB7Ci0JCXByZWZTdG9yZS5zZXRWYWx1ZShTQVZFRF9NRVRIT0RfTElSQVJZX1VSSSwgdmFsdWUpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHR5cGUgb2YgdGhlIG1ldGhvZCBsaWJyYXJ5IHRoYXQgd2FzIG9wZW5lZCBpbiB0aGUgbGFzdCBzZXNzaW9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFNhdmVkTWV0aG9kTGlicmFyeVR5cGUoKSB7Ci0JCXJldHVybiBwcmVmU3RvcmUuZ2V0U3RyaW5nKFNBVkVEX01FVEhPRF9MSVJBUllfVFlQRSk7Ci0JfQotCi0JLyoqCi0JICogU2F2ZXMgdGhlIHR5cGUgb2YgdGhlIG1ldGhvZCBsaWJyYXJ5IHRoYXQgd2FzIG9wZW5lZCBpbiB0aGUgbGFzdCBzZXNzaW9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRTYXZlZE1ldGhvZExpYnJhcnlUeXBlKFN0cmluZyB2YWx1ZSkgewotCQlwcmVmU3RvcmUuc2V0VmFsdWUoU0FWRURfTUVUSE9EX0xJUkFSWV9UWVBFLCB2YWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgZGVmYXVsdCBkaXNjYXJkIHVucmVzb2x2ZWQgcmVmZXJlbmNlcyBwcmVmZXJlbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBnZXREZWZhdWx0RGlzY2FyZFVucmVzb2x2ZWRSZWZlcmVuY2VzKCkgewotCQlyZXR1cm4gREVGQVVMVF9ESVNDQVJEX1VOUkVTT0xWRURfUkVGRVJFTkNFUzsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBkaXNjYXJkIHVucmVzb2x2ZWQgcmVmZXJlbmNlcyBwcmVmZXJlbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBnZXREaXNjYXJkVW5yZXNvbHZlZFJlZmVyZW5jZXMoKSB7Ci0JCXJldHVybiBwcmVmU3RvcmUuZ2V0Qm9vbGVhbihESVNDQVJEX1VOUkVTT0xWRURfUkVGRVJFTkNFUyk7Ci0JfQotCi0JLyoqCi0JICogU2F2ZXMgdGhlIGRpc2NhcmQgdW5yZXNvbHZlZCByZWZlcmVuY2VzIHByZWZlcmVuY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldERpc2NhcmRVbnJlc29sdmVkUmVmZXJlbmNlcyhib29sZWFuIHZhbHVlKSB7Ci0JCXByZWZTdG9yZS5zZXRWYWx1ZShESVNDQVJEX1VOUkVTT0xWRURfUkVGRVJFTkNFUywgdmFsdWUpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGRlZmF1bHQgdXNlIG5ldyBleHRlbmRzIHNlbWFudGljcyBwcmVmZXJlbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBnZXREZWZhdWx0VXNlTmV3RXh0ZW5kc1NlbWFudGljcygpIHsKLQkJcmV0dXJuIERFRkFVTFRfVVNFX05FV19FWFRFTkRTX1NFTUFOVElDUzsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSB1c2UgbmV3IGV4dGVuZHMgc2VtYW50aWNzIHByZWZlcmVuY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGdldFVzZU5ld0V4dGVuZHNTZW1hbnRpY3MoKSB7Ci0JCXJldHVybiBwcmVmU3RvcmUuZ2V0Qm9vbGVhbihVU0VfTkVXX0VYVEVORFNfU0VNQU5USUNTKTsKLQl9Ci0KLQkvKioKLQkgKiBTYXZlcyB0aGUgdXNlIG5ldyBleHRlbmRzIHNlbWFudGljcyBwcmVmZXJlbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRVc2VOZXdFeHRlbmRzU2VtYW50aWNzKGJvb2xlYW4gdmFsdWUpIHsKLQkJcHJlZlN0b3JlLnNldFZhbHVlKFVTRV9ORVdfRVhURU5EU19TRU1BTlRJQ1MsIHZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBkZWZhdWx0IHJvbGUgZGlhZ3JhbSBob3Jpem9udGFsIHNwYWNpbmcuCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgZ2V0RGVmYXVsdFJvbGVEaWFncmFtSG9yaXpvbnRhbFNwYWNpbmcoKSB7Ci0JCXJldHVybiBERUZBVUxUX1JPTEVfRElBR1JBTV9IT1JJWk9OVEFMX1NQQUNJTkc7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgcm9sZSBkaWFncmFtIGhvcml6b250YWwgc3BhY2luZy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBnZXRSb2xlRGlhZ3JhbUhvcml6b250YWxTcGFjaW5nKCkgewotCQlpbnQgdmFsdWUgPSBwcmVmU3RvcmUuZ2V0SW50KFJPTEVfRElBR1JBTV9IT1JJWk9OVEFMX1NQQUNJTkcpOwotCQlyZXR1cm4gdmFsdWUgPiAwID8gdmFsdWUgOiBERUZBVUxUX1JPTEVfRElBR1JBTV9IT1JJWk9OVEFMX1NQQUNJTkc7Ci0JfQotCi0JLyoqCi0JICogU2F2ZXMgdGhlIHJvbGUgZGlhZ3JhbSBob3Jpem9udGFsIHNwYWNpbmcuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldFJvbGVEaWFncmFtSG9yaXpvbnRhbFNwYWNpbmcoaW50IHZhbHVlKSB7Ci0JCXByZWZTdG9yZS5zZXRWYWx1ZShST0xFX0RJQUdSQU1fSE9SSVpPTlRBTF9TUEFDSU5HLCB2YWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgZGVmYXVsdCByb2xlIGRpYWdyYW0gdmVydGljYWwgc3BhY2luZy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBnZXREZWZhdWx0Um9sZURpYWdyYW1WZXJ0aWNhbFNwYWNpbmcoKSB7Ci0JCXJldHVybiBERUZBVUxUX1JPTEVfRElBR1JBTV9WRVJUSUNBTF9TUEFDSU5HOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHJvbGUgZGlhZ3JhbSB2ZXJ0aWNhbCBzcGFjaW5nLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IGdldFJvbGVEaWFncmFtVmVydGljYWxTcGFjaW5nKCkgewotCQlpbnQgdmFsdWUgPSBwcmVmU3RvcmUuZ2V0SW50KFJPTEVfRElBR1JBTV9WRVJUSUNBTF9TUEFDSU5HKTsKLQkJcmV0dXJuIHZhbHVlID4gMCA/IHZhbHVlIDogREVGQVVMVF9ST0xFX0RJQUdSQU1fVkVSVElDQUxfU1BBQ0lORzsKLQl9Ci0KLQkvKioKLQkgKiBTYXZlcyB0aGUgcm9sZSBkaWFncmFtIHZlcnRpY2FsIHNwYWNpbmcuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldFJvbGVEaWFncmFtVmVydGljYWxTcGFjaW5nKGludCB2YWx1ZSkgewotCQlwcmVmU3RvcmUuc2V0VmFsdWUoUk9MRV9ESUFHUkFNX1ZFUlRJQ0FMX1NQQUNJTkcsIHZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBkZWZhdWx0IHJvbGUgZGlhZ3JhbSBlbGVtZW50IGxhYmVsIG1heGltdW0gdGV4dCBsaW5lcy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBnZXREZWZhdWx0Um9sZURpYWdyYW1NYXhpbXVtVGV4dExpbmVzKCkgewotCQlyZXR1cm4gREVGQVVMVF9ST0xFX0RJQUdSQU1fTUFYX1RFWFRfTElORVM7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgcm9sZSBkaWFncmFtIGVsZW1lbnQgbGFiZWwgbWF4aW11bSB0ZXh0IGxpbmVzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IGdldFJvbGVEaWFncmFtTWF4aW11bVRleHRMaW5lcygpIHsKLQkJaW50IHZhbHVlID0gcHJlZlN0b3JlLmdldEludChST0xFX0RJQUdSQU1fTUFYX1RFWFRfTElORVMpOwotCQlyZXR1cm4gdmFsdWUgPiAwID8gdmFsdWUgOiBERUZBVUxUX1JPTEVfRElBR1JBTV9NQVhfVEVYVF9MSU5FUzsKLQl9Ci0KLQkvKioKLQkgKiBTYXZlcyB0aGUgcm9sZSBkaWFncmFtIGVsZW1lbnQgbGFiZWwgbWF4aW11bSB0ZXh0IGxpbmVzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRSb2xlRGlhZ3JhbU1heGltdW1UZXh0TGluZXMoaW50IHZhbHVlKSB7Ci0JCXByZWZTdG9yZS5zZXRWYWx1ZShST0xFX0RJQUdSQU1fTUFYX1RFWFRfTElORVMsIHZhbHVlKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9wcmVmZXJlbmNlcy9wYWNrYWdlLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvcHJlZmVyZW5jZXMvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOWNjMDM5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9wcmVmZXJlbmNlcy9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyBwcmVmZXJlbmNlIHN1cHBvcnQgZm9yIHRoZSBsaWJyYXJ5IHNlcnZpY2UuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3ByZWZzL0JTQ29sdW1uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvcHJlZnMvQlNDb2x1bW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTc4MWJhYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvcHJlZnMvQlNDb2x1bW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnByZWZzOwotCi0vKioKLSAqIFNpbXBsZSBkYXRhIHN0cnVjdHVyZSB0byBpZGVudGlmeSBhIGJyZWFrZG93biBsYXlvdXQgY29sdW1uLgotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBCU0NvbHVtbiB7Ci0KLQlwdWJsaWMgU3RyaW5nIGlkOwotCXB1YmxpYyBTdHJpbmcgbGFiZWw7Ci0JCi0JcHVibGljIEJTQ29sdW1uKFN0cmluZyBpZCwgU3RyaW5nIGxhYmVsKSB7Ci0JCXRoaXMuaWQgPSBpZDsKLQkJdGhpcy5sYWJlbCA9IGxhYmVsOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9wcmVmcy9MaWJyYXJ5UHJlZmVyZW5jZUNvbnN0YW50cy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3ByZWZzL0xpYnJhcnlQcmVmZXJlbmNlQ29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2ZDRmNDAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3ByZWZzL0xpYnJhcnlQcmVmZXJlbmNlQ29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wcmVmczsKLQotLyoqCi0gKiBAYXV0aG9yIEJpbmd4dWUgWHUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBMaWJyYXJ5UHJlZmVyZW5jZUNvbnN0YW50cyBleHRlbmRzIFByZWZlcmVuY2VDb25zdGFudHMgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRl9MQVNUX0xJQlJBUllfUEFSRU5UX0RJUkVDVE9SWSA9IFBSRUZJWCArICJsYXN0X2xpYnJhcnlfX3BhcmVudF9kaXJlY3RvcnkiOyAvLyROT04tTkxTLTEkCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRl9MQVNUX0RFRkFVTFRfRElSRUNUT1JZX0NIRUNLRUQgPSBQUkVGSVggKyAibGFzdF9kZWZhdWx0X2RpcmVjdG9yeV9jaGVja2VkIjsgLy8kTk9OLU5MUy0xJAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZfUkFESU9fU0FWRV9DSE9JQ0UgPSBQUkVGSVggKyAicmFkaW9fc2F2ZV9jaG9pY2UiOyAvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRl9MQVNUX1RSQU5TTEFUSU9OX0VYUE9SVF9ESVJFQ1RPUlkgPSBQUkVGSVggKyAibGFzdF90cmFuc2xhdGlvbl9leHBvcnRfZGlyZWN0b3J5IjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRl9MQVNUX1BVQkxJU0hfRk9MREVSID0gUFJFRklYICsgImxhc3RfcHVibGlzaF9mb2xkZXIiOyAvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRl9ERUZBVUxUX1BVQkxJU0hfRElSRUNUT1JZID0gUFJFRklYICsgImRlZmF1bHRfcHVibGlzaF9kaXJlY3RvcnkiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRl9ERUZBVUxUX0ZFRURCQUNLX1VSTCA9IFBSRUZJWCArICJkZWZhdWx0X2ZlZWRiYWNrX3VybCI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGX1BST01QVF9GT1JfTElCUkFSWV9BVF9TVEFSVFVQID0gUFJFRklYICsgInByb21wdF9mb3JfbGlicmFyeV9hdF9zdGFydHVwIjsgLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZfU0VMRUNURURfQ09ORklHX0lOX0xBU1RfU0VTU0lPTiA9IFBSRUZJWCArICJzZWxlY3RlZF9jb25maWdfaW5fbGFzdF9zZXNzaW9uIjsgLy8kTk9OLU5MUy0xJAotCQotCS8vcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRl9ERUZBVUxUX0hJU1RPUllfU0laRSA9IFBSRUZJWCArICJkZWZhdWx0X2xpc3RfbGVuZ3RoX2xhYmVsIjsKLQkKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9wcmVmcy9QcmVmZXJlbmNlQ29uc3RhbnRzLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvcHJlZnMvUHJlZmVyZW5jZUNvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNjk0NjA5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9wcmVmcy9QcmVmZXJlbmNlQ29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wcmVmczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5JQlNJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkxpYnJhcnlFZGl0Q29uc3RhbnRzOwotCi0vKioKLSAqIENvbnN0YW50cyB0byBiZSB1c2VkIGluIHByZWZlcmVuY2Ugc3RvcmUuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFByZWZlcmVuY2VDb25zdGFudHMgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRklYID0gIm9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnByZWYuIjsgLy8kTk9OLU5MUy0xJAotCi0JLy8gbW92ZWQgZnJvbSB0byBoZXJlIHRvIHNoYXJlIHRoZSBjb25zdGFudHMKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGX1dCU19DT0xVTU5TID0gTGlicmFyeUVkaXRDb25zdGFudHMuUFJFRl9XQlNfQ09MVU1OUzsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZfVEJTX0NPTFVNTlMgPSBMaWJyYXJ5RWRpdENvbnN0YW50cy5QUkVGX1RCU19DT0xVTU5TOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRl9XUEJTX0NPTFVNTlMgPSBMaWJyYXJ5RWRpdENvbnN0YW50cy5QUkVGX1dQQlNfQ09MVU1OUzsKLQotCS8vIGRlZmluZSB0aGUgZGVmYXVsdCBjb2x1bW5zIGZvciB3YnMsIHRicywgYW5kIHdwYnMgbGF5b3V0Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBERUZBVUxUX1dCU19DT0xVTU5TID0gewotCQkJSUJTSXRlbVByb3ZpZGVyLkNPTF9QUkVTRU5UQVRJT05fTkFNRSwKLQkJCUlCU0l0ZW1Qcm92aWRlci5DT0xfSUQsCi0JCQkvLyBJQlNJdGVtUHJvdmlkZXIuQ09MX1BSRUZJWCwKLQkJCUlCU0l0ZW1Qcm92aWRlci5DT0xfUFJFREVDRVNTT1JTLCBJQlNJdGVtUHJvdmlkZXIuQ09MX01PREVMX0lORk8sCi0JCQlJQlNJdGVtUHJvdmlkZXIuQ09MX1RZUEUsIElCU0l0ZW1Qcm92aWRlci5DT0xfSVNfUExBTk5FRCwKLQkJCUlCU0l0ZW1Qcm92aWRlci5DT0xfSVNfUkVQRUFUQUJMRSwKLQkJCUlCU0l0ZW1Qcm92aWRlci5DT0xfSEFTX01VTFRJUExFX09DQ1VSUkVOQ0VTLAotCQkJSUJTSXRlbVByb3ZpZGVyLkNPTF9JU19PTkdPSU5HLAotCQkJSUJTSXRlbVByb3ZpZGVyLkNPTF9JU19FVkVOVF9EUklWRU4sCi0JCQlJQlNJdGVtUHJvdmlkZXIuQ09MX0lTX09QVElPTkFMIH07Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZ1tdIERFRkFVTFRfVEJTX0NPTFVNTlMgPSB7Ci0JCQlJQlNJdGVtUHJvdmlkZXIuQ09MX1BSRVNFTlRBVElPTl9OQU1FLAotCQkJLy8gSUJTSXRlbVByb3ZpZGVyLkNPTF9JRCwKLQkJCS8vIElCU0l0ZW1Qcm92aWRlci5DT0xfUFJFRklYLAotCQkJSUJTSXRlbVByb3ZpZGVyLkNPTF9NT0RFTF9JTkZPLCBJQlNJdGVtUHJvdmlkZXIuQ09MX1RFQU1TLAotCQkJSUJTSXRlbVByb3ZpZGVyLkNPTF9UWVBFLCBJQlNJdGVtUHJvdmlkZXIuQ09MX0lTX1BMQU5ORUQsCi0JCQlJQlNJdGVtUHJvdmlkZXIuQ09MX0hBU19NVUxUSVBMRV9PQ0NVUlJFTkNFUywKLQkJCUlCU0l0ZW1Qcm92aWRlci5DT0xfSVNfT1BUSU9OQUwgfTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nW10gREVGQVVMVF9XUEJTX0NPTFVNTlMgPSB7Ci0JCQlJQlNJdGVtUHJvdmlkZXIuQ09MX1BSRVNFTlRBVElPTl9OQU1FLAotCQkJLy8gSUJTSXRlbVByb3ZpZGVyLkNPTF9JRCwKLQkJCS8vIElCU0l0ZW1Qcm92aWRlci5DT0xfUFJFRklYLAotCQkJSUJTSXRlbVByb3ZpZGVyLkNPTF9NT0RFTF9JTkZPLCBJQlNJdGVtUHJvdmlkZXIuQ09MX0VOVFJZX1NUQVRFLAotCQkJSUJTSXRlbVByb3ZpZGVyLkNPTF9FWElUX1NUQVRFLCBJQlNJdGVtUHJvdmlkZXIuQ09MX0RFTElWRVJBQkxFLAotCQkJSUJTSXRlbVByb3ZpZGVyLkNPTF9UWVBFLCBJQlNJdGVtUHJvdmlkZXIuQ09MX0lTX1BMQU5ORUQsCi0JCQlJQlNJdGVtUHJvdmlkZXIuQ09MX0hBU19NVUxUSVBMRV9PQ0NVUlJFTkNFUywKLQkJCUlCU0l0ZW1Qcm92aWRlci5DT0xfSVNfT1BUSU9OQUwgfTsKLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3ByZWZzL1ByZWZlcmVuY2VVdGlsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvcHJlZnMvUHJlZmVyZW5jZVV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjgyZWViNS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvcHJlZnMvUHJlZmVyZW5jZVV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyNSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wcmVmczsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5wcmVmZXJlbmNlcy5JUHJlZmVyZW5jZVN0b3JlV3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5JQlNJdGVtUHJvdmlkZXI7Ci0KLWltcG9ydCBjb20uaWJtLmljdS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotLyoqCi0gKiB1dGlsaXR5IGNsYXNzIHRvIGhhbmRsZSB0aGUgcHJvY2VzcyBlbGVtZW50IGxheW91dCBwcmVmZXJlbmNlcwotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICoKLSAqLwotcHVibGljIGNsYXNzIFByZWZlcmVuY2VVdGlsIHsKLQkJCi0JcHJpdmF0ZSBzdGF0aWMgUHJvcGVydGllcyB4c2xQYXJhbXM7Ci0JcHJpdmF0ZSBzdGF0aWMgTWFwIGNvbElkTGFiZWxNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQotCS8vIHF1aWNrIHNvbHV0aW9uLCB0aGUgdGVhbSBjb2x1bW4gZm9yIHRoZSBXQlMgdmlldy4KLQkvLyAxNjI3ODMgLSBQdWJsaXNoIHRlYW0gaW5mb3JtYXRpb24gaW4gV0JTIGZvciBURHMKLQlwcml2YXRlIHN0YXRpYyBCU0NvbHVtbiB0ZWFtQ29sID0gbnVsbDsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJRF9TVEVQUyA9ICJzdGVwcyI7IC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgewotCQl0cnkgewotCQkJUHJvcGVydGllcyBwYXJhbXMgPSBMaWJyYXJ5UGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcm9wZXJ0aWVzKAotCQkJCQkiL2xheW91dC94c2wvcmVzb3VyY2VzLnByb3BlcnRpZXMiKTsgLy8kTk9OLU5MUy0xJAotCQkJCi0JCQlzZXRYc2xQcm9wZXJ0aWVzKHBhcmFtcyk7Ci0JCQkKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQl9Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRYc2xQcm9wZXJ0aWVzKFByb3BlcnRpZXMgbmV3WHNsUGFyYW1zKSB7Ci0JCXhzbFBhcmFtcyA9IG5ld1hzbFBhcmFtczsJCi0JCQotCQljb2xJZExhYmVsTWFwLnB1dChJQlNJdGVtUHJvdmlkZXIuQ09MX0lELCBnZXRMYWJlbCgiaW5kZXhUZXh0IikpOyAvLyROT04tTkxTLTEkCi0JCWNvbElkTGFiZWxNYXAucHV0KElCU0l0ZW1Qcm92aWRlci5DT0xfTkFNRSwgZ2V0TGFiZWwoIm5hbWVUZXh0IikpOyAvLyROT04tTkxTLTEkCi0JCWNvbElkTGFiZWxNYXAucHV0KElCU0l0ZW1Qcm92aWRlci5DT0xfUFJFU0VOVEFUSU9OX05BTUUsIGdldExhYmVsKCJicmVha2Rvd25FbGVtZW50VGV4dCIpKTsgLy8kTk9OLU5MUy0xJAotCQljb2xJZExhYmVsTWFwLnB1dChJRF9TVEVQUywgZ2V0TGFiZWwoInN0ZXBzVGV4dCIpKTsJCSAvLyROT04tTkxTLTEkCi0JCWNvbElkTGFiZWxNYXAucHV0KElCU0l0ZW1Qcm92aWRlci5DT0xfUFJFRklYLCBnZXRMYWJlbCgicHJlZml4VGV4dCIpKTsgLy8kTk9OLU5MUy0xJAotCQljb2xJZExhYmVsTWFwLnB1dChJQlNJdGVtUHJvdmlkZXIuQ09MX1RZUEUsIGdldExhYmVsKCJ0eXBlVGV4dCIpKTsgLy8kTk9OLU5MUy0xJAotCQljb2xJZExhYmVsTWFwLnB1dChJQlNJdGVtUHJvdmlkZXIuQ09MX01PREVMX0lORk8sIGdldExhYmVsKCJtb2RlbEluZm9UZXh0IikpOyAvLyROT04tTkxTLTEkCi0JCWNvbElkTGFiZWxNYXAucHV0KElCU0l0ZW1Qcm92aWRlci5DT0xfUFJFREVDRVNTT1JTLCBnZXRMYWJlbCgicHJlZGVjZXNzb3JzVGV4dCIpKTsgLy8kTk9OLU5MUy0xJAotCQljb2xJZExhYmVsTWFwLnB1dChJQlNJdGVtUHJvdmlkZXIuQ09MX0lTX1JFUEVBVEFCTEUsIGdldExhYmVsKCJyZXBlYXRhYmxlVGV4dCIpKTsgLy8kTk9OLU5MUy0xJAotCQljb2xJZExhYmVsTWFwLnB1dChJQlNJdGVtUHJvdmlkZXIuQ09MX0lTX09OR09JTkcsIGdldExhYmVsKCJvbmdvaW5nVGV4dCIpKTsgLy8kTk9OLU5MUy0xJAotCQljb2xJZExhYmVsTWFwLnB1dChJQlNJdGVtUHJvdmlkZXIuQ09MX0lTX0VWRU5UX0RSSVZFTiwgZ2V0TGFiZWwoImV2ZW50RHJpdmVuVGV4dCIpKTsgLy8kTk9OLU5MUy0xJAotCQljb2xJZExhYmVsTWFwLnB1dChJQlNJdGVtUHJvdmlkZXIuQ09MX0lTX09QVElPTkFMLCBnZXRMYWJlbCgib3B0aW9uYWxUZXh0IikpOyAvLyROT04tTkxTLTEkCi0JCWNvbElkTGFiZWxNYXAucHV0KElCU0l0ZW1Qcm92aWRlci5DT0xfSVNfUExBTk5FRCwgZ2V0TGFiZWwoInBsYW5uZWRUZXh0IikpOyAvLyROT04tTkxTLTEkCi0JCWNvbElkTGFiZWxNYXAucHV0KElCU0l0ZW1Qcm92aWRlci5DT0xfSEFTX01VTFRJUExFX09DQ1VSUkVOQ0VTLCBnZXRMYWJlbCgibXVsdGlwbGVPY2N1cnJlbmNlc1RleHQiKSk7IC8vJE5PTi1OTFMtMSQKLQotCQljb2xJZExhYmVsTWFwLnB1dChJQlNJdGVtUHJvdmlkZXIuQ09MX1RFQU1TLCBnZXRMYWJlbCgidGVhbVRleHQiKSk7IC8vJE5PTi1OTFMtMSQKLQotCQljb2xJZExhYmVsTWFwLnB1dChJQlNJdGVtUHJvdmlkZXIuQ09MX0RFTElWRVJBQkxFLCBnZXRMYWJlbCgiZGVsaXZlcmFibGVUZXh0IikpOyAvLyROT04tTkxTLTEkCi0JCWNvbElkTGFiZWxNYXAucHV0KElCU0l0ZW1Qcm92aWRlci5DT0xfRU5UUllfU1RBVEUsIGdldExhYmVsKCJlbnRyeVN0YXRlVGV4dCIpKTsgLy8kTk9OLU5MUy0xJAotCQljb2xJZExhYmVsTWFwLnB1dChJQlNJdGVtUHJvdmlkZXIuQ09MX0VYSVRfU1RBVEUsIGdldExhYmVsKCJleGl0U3RhdGVUZXh0IikpOyAvLyROT04tTkxTLTEkCi0KLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldExhYmVsKFN0cmluZyBrZXkpIHsKLQkJU3RyaW5nIGxhYmVsID0geHNsUGFyYW1zLmdldFByb3BlcnR5KGtleSk7Ci0JCWlmICggbGFiZWwgPT0gbnVsbCApIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiQ2FuJ3QgZmluZCBwcm9wZXJ0eSBlbnRyeSBmb3IgIiArIGtleSk7IC8vJE5PTi1OTFMtMSQKLQkJCWxhYmVsID0ga2V5OwotCQl9Ci0JCXJldHVybiBsYWJlbDsKLQl9Ci0JCi0JLyoqCi0JICogZ2V0IGEgbGlzdCBvZiBjb2x1bW5zIGZvciBXQlMgbGF5b3V0Ci0JICogQHJldHVybiBMaXN0IG9mIEJTQ29sdW1uIG9iamVjdHMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3QgZ2V0V0JTQ29sdW1ucygpIHsKLQkJTGlzdCBjb2xzID0gZ2V0UHJlZmVyZW5jZUl0ZW1zKFByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9XQlNfQ09MVU1OUyk7Ci0JCQotCQkvLyBpZiB0aGUgVEJTIGNvbHVtbnMgaGFzIHRlYW0sIGFsc28gYWRkIHRvIHRoZSBXQlMKLQkJLy8gMTYyNzgzIC0gUHVibGlzaCB0ZWFtIGluZm9ybWF0aW9uIGluIFdCUyBmb3IgVERzCi0JCXRlYW1Db2wgPSBudWxsOwotCQlnZXRUQlNDb2x1bW5zKCk7Ci0JCWlmICggdGVhbUNvbCAhPSBudWxsICkgewotCQkJY29scy5hZGQoY29scy5zaXplKCksIHRlYW1Db2wpOwotCQl9Ci0JCXJldHVybiBjb2xzOwotCX0KLQkKLQkvKioKLQkgKiBnZXQgYSBsaXN0IG9mIGNvbHVtbnMgZm9yIFRCUyBsYXlvdXQKLQkgKiBAcmV0dXJuIExpc3Qgb2YgQlNDb2x1bW4gb2JqZWN0cwotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRUQlNDb2x1bW5zKCkgewotCQlyZXR1cm4gZ2V0UHJlZmVyZW5jZUl0ZW1zKFByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9UQlNfQ09MVU1OUyk7Ci0JfQotCQotCS8qKgotCSAqIGdldCBhIGxpc3Qgb2YgY29sdW1ucyBmb3IgV1BCUyBsYXlvdXQKLQkgKiBAcmV0dXJuIExpc3Qgb2YgQlNDb2x1bW4gb2JqZWN0cwotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRXUEJTQ29sdW1ucygpIHsKLQkJcmV0dXJuIGdldFByZWZlcmVuY2VJdGVtcyhQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfV1BCU19DT0xVTU5TKTsKLQl9Ci0JCi0JLyoqCi0JICogdmFsaWRhdGUgdGhlIGNvbHVtbnMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgdmFsaWRhdGVQcmVmZXJlbmNlcygpIHsKLQkJLy8gY2FsbCB0aGUgbWV0aG9kIHRvIG1ha2Ugc3VyZSB0aGUgZGVmYXVsdCBpcyBsb2FkZWQKLQkJZ2V0V0JTQ29sdW1ucygpOwotCQlnZXRUQlNDb2x1bW5zKCk7Ci0JCWdldFdQQlNDb2x1bW5zKCk7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIExpc3QgZ2V0UHJlZmVyZW5jZUl0ZW1zKFN0cmluZyBrZXkpIHsKLQkJCi0JCUlQcmVmZXJlbmNlU3RvcmVXcmFwcGVyIHN0b3JlID0gTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7CQkKLQkJU3RyaW5nIHN0ciA9IHN0b3JlLmdldFN0cmluZyhrZXkpOwotCQlpZiAoc3RyID09IG51bGwpIHsKLQkJCXN0ciA9IHN0b3JlLmdldERlZmF1bHRTdHJpbmcoa2V5KTsKLQkJfQotCQkKLQkJaWYgKCBzdHIgPT0gbnVsbCB8fCBzdHIubGVuZ3RoKCkgPT0gMCApIHsKLQkJCXN0ciA9IGdldERlZmF1bHQoa2V5KTsKLQkJCXN0b3JlLnNldFZhbHVlKGtleSwgc3RyKTsKLQkJfQotCQkKLQkJTGlzdCBpdGVtcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJU3RyaW5nVG9rZW5pemVyIHRva2VucyA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoc3RyLCAiLCIpOyAvLyROT04tTkxTLTEkCi0JCXdoaWxlICh0b2tlbnMuaGFzTW9yZVRva2VucygpKSB7Ci0JCQlTdHJpbmcgaWQgPSB0b2tlbnMubmV4dFRva2VuKCkudHJpbSgpOwkJCi0JCQlpZiAoaWQgIT0gbnVsbCAmJiBpZC5sZW5ndGgoKSAhPSAwICkgewotCQkJCQotCQkJCUJTQ29sdW1uIGNvbCA9IG5ldyBCU0NvbHVtbihpZCwgZ2V0Q29sVGV4dChpZCkpOwotCQkJCWl0ZW1zLmFkZChjb2wpOwotCQkJCS8vIGFkZCBzdGVwcyBjb2x1bW4gZm9yIFdCUwotCQkJCWlmICgga2V5LmVxdWFscyhQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfV0JTX0NPTFVNTlMpIAotCQkJCQkJJiYgaWQuZXF1YWxzKElCU0l0ZW1Qcm92aWRlci5DT0xfUFJFU0VOVEFUSU9OX05BTUUpICkgewotCQkJCQljb2wgPSBuZXcgQlNDb2x1bW4oSURfU1RFUFMsIGdldENvbFRleHQoSURfU1RFUFMpKTsKLQkJCQkJaXRlbXMuYWRkKGNvbCk7Ci0JCQkJfQotCQkJCQotCQkJCS8vIHNhdmUgdGhlIHRlYW0gY29sdW1uIGZvciBXQlMKLQkJCQkvLyAxNjI3ODMgLSBQdWJsaXNoIHRlYW0gaW5mb3JtYXRpb24gaW4gV0JTIGZvciBURHMKLQkJCQlpZiAoIElCU0l0ZW1Qcm92aWRlci5DT0xfVEVBTVMuZXF1YWxzKGlkKSApIHsKLQkJCQkJdGVhbUNvbCA9IGNvbDsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiBpdGVtczsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldENvbFRleHQoU3RyaW5nIGtleSkgewotCQlTdHJpbmcgdGV4dCA9IChTdHJpbmcpY29sSWRMYWJlbE1hcC5nZXQoa2V5KTsKLQkJaWYgKCB0ZXh0ID09IG51bGwgKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIk5vIGxhYmVsIGRlZmluZWQgZm9yIGNvbHVtbiAiICsga2V5KTsgIC8vJE5PTi1OTFMtMSQKLQkJCXRleHQgPSBrZXk7Ci0JCX0KLQkJCi0JCXJldHVybiB0ZXh0OwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyAgU3RyaW5nIGdldERlZmF1bHQoU3RyaW5nIGtleSkgewotCQlpZiAoIFByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9XQlNfQ09MVU1OUy5lcXVhbHMoa2V5KSApIHsKLQkJCXJldHVybiB0b1N0cmluZyhQcmVmZXJlbmNlQ29uc3RhbnRzLkRFRkFVTFRfV0JTX0NPTFVNTlMpOwotCQl9Ci0JCQotCQlpZiAoIFByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9UQlNfQ09MVU1OUy5lcXVhbHMoa2V5KSApIHsKLQkJCXJldHVybiB0b1N0cmluZyhQcmVmZXJlbmNlQ29uc3RhbnRzLkRFRkFVTFRfVEJTX0NPTFVNTlMpOwotCQl9Ci0JCQotCQlpZiAoIFByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9XUEJTX0NPTFVNTlMuZXF1YWxzKGtleSkgKSB7Ci0JCQlyZXR1cm4gdG9TdHJpbmcoUHJlZmVyZW5jZUNvbnN0YW50cy5ERUZBVUxUX1dQQlNfQ09MVU1OUyk7Ci0JCX0KLQkJCi0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgdG9TdHJpbmcoU3RyaW5nW10gaWRzKSB7Ci0JCVN0cmluZ0J1ZmZlciBzdHJCdWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWludCBtYXggPSBpZHMubGVuZ3RoIC0gMTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtYXg7IGkrKykgewotCQkJc3RyQnVmLmFwcGVuZChpZHNbaV0pCi0JCQkJCS5hcHBlbmQoJywnKTsKLQkJfQotCQlzdHJCdWYuYXBwZW5kKGlkc1tpZHMubGVuZ3RoLTFdKTsKLQkJcmV0dXJuIHN0ckJ1Zi50b1N0cmluZygpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBzYXZlU2VsZWN0ZWRDb25maWdJbnRvUGVyc2lzdGVuY2UoU3RyaW5nIGNvbmZpZ05hbWUpIHsKLQkJSVByZWZlcmVuY2VTdG9yZVdyYXBwZXIgc3RvcmUgPSBMaWJyYXJ5UGx1Z2luLmdldERlZmF1bHQoKQotCQkJCS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQkJc3RvcmUKLQkJCQkuc2V0VmFsdWUoCi0JCQkJCQlMaWJyYXJ5UHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX1NFTEVDVEVEX0NPTkZJR19JTl9MQVNUX1NFU1NJT04sCi0JCQkJCQljb25maWdOYW1lKTsKLQkJTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkuc2F2ZVBsdWdpblByZWZlcmVuY2VzKCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U2F2ZWRMYXN0Q29uZmlnKCkgewotCQlJUHJlZmVyZW5jZVN0b3JlV3JhcHBlciBzdG9yZSA9IExpYnJhcnlQbHVnaW4uZ2V0RGVmYXVsdCgpCi0JCQkJLmdldFByZWZlcmVuY2VTdG9yZSgpOwotCQlyZXR1cm4gc3RvcmUKLQkJCQkuZ2V0U3RyaW5nKExpYnJhcnlQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfU0VMRUNURURfQ09ORklHX0lOX0xBU1RfU0VTU0lPTik7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3ByZWZzL3BhY2thZ2UuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9wcmVmcy9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5Y2MwMzkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3ByZWZzL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIHByZWZlcmVuY2Ugc3VwcG9ydCBmb3IgdGhlIGxpYnJhcnkgc2VydmljZS4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvcHJvamVjdC9NZXRob2RMaWJyYXJ5UHJvamVjdC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Byb2plY3QvTWV0aG9kTGlicmFyeVByb2plY3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2RjNWVhZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvcHJvamVjdC9NZXRob2RMaWJyYXJ5UHJvamVjdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnByb2plY3Q7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3REZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLQotCi0vKioKLSAqIEhlbHBlciBjbGFzcyBmb3IgbWFuYWdpbmcgdGhlIE1ldGhvZCBMaWJyYXJ5IFByb2plY3RzIGluIGEgd29ya3NwYWNlLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiAKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIE1ldGhvZExpYnJhcnlQcm9qZWN0IHsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgbWV0aG9kIGxpYnJhcnkgcHJvamVjdCBpbiB0aGUgY3VycmVudCB3b3Jrc3BhY2UuCi0JICogCi0JICogQHBhcmFtIHBhdGgKLQkgKiAgICAgICAgICAgIEFuIGFic29sdXRlIHBhdGggdG8gYSBtZXRob2QgbGlicmFyeS4KLQkgKiBAcGFyYW0gcHJvamVjdE5hbWUKLQkgKiAgICAgICAgICAgIEEgbmFtZSBmb3IgdGhlIG5ldyBtZXRob2QgbGlicmFyeSBwcm9qZWN0LgotCSAqIEBwYXJhbSBtb25pdG9yCi0JICogICAgICAgICAgICBBIHByb2dyZXNzIG1vbml0b3IuCi0JICogQHJldHVybiBBIG1ldGhvZCBsaWJyYXJ5IHByb2plY3QuCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElQcm9qZWN0IGNyZWF0ZVByb2plY3QoU3RyaW5nIHBhdGgsIFN0cmluZyBwcm9qZWN0TmFtZSwKLQkJCUlQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJV29ya3NwYWNlIHdvcmtzcGFjZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKTsKLQkJCi0JCS8vIGZpbmQgdGhlIHByb2plY3QgYnkgcGF0aAotCQlJUHJvamVjdCBwcm9qZWN0ID0gZmluZFByb2plY3QocGF0aCk7CQkKLQkJaWYgKHByb2plY3QgIT0gbnVsbCApIHsKLQkJCXByb2plY3QuZGVsZXRlKElQcm9qZWN0LkZPUkNFCi0JCQkJCXwgSVByb2plY3QuTkVWRVJfREVMRVRFX1BST0pFQ1RfQ09OVEVOVCwgbW9uaXRvcik7Ci0JCX0KLQkJCi0JCWlmICggcHJvamVjdE5hbWUgPT0gbnVsbCApIHsKLQkJCUZpbGUgbGlicmFyeVBhdGggPSBuZXcgRmlsZShwYXRoKTsKLQkJCXByb2plY3ROYW1lID0gbGlicmFyeVBhdGguZ2V0TmFtZSgpOwotCQl9Ci0JCQotCQkvLyBpZiBhIHByb2plY3Qgb2YgdGhlIHNhbWUgbmFtZSBhbHNvIGV4aXN0cywgZGVsZXRlIGl0Ci0JCS8vIHRoaXMgaXMgbmVlZGVkIHRvIHRha2UgY2FyZSBvZiB0aGUgZm9sbG93aW5nIHNjZW5hcmlvOgotCQkvLyBhIHByb2plY3QgaXMgb3BlbmVkIGJ1dCBub3QgY2xvc2VkIGZvciBzb21lIHJlYXNvbgotCQkvLyBub3cgY3JlYXRlIGEgbmV3IGxpYnJhcnkgd2l0aCB0aGUgc2FtZSBuYW1lIChzYW1lIGxpYnJhcnkgZm9sZGVyKQotCQkvLyB3ZSBuZWVkIHRvIGRlbGV0ZSB0aGUgcHJldmlvdXMgb25lCi0JCXByb2plY3QgPSB3b3Jrc3BhY2UuZ2V0Um9vdCgpLmdldFByb2plY3QocHJvamVjdE5hbWUpOwotCQlpZiAocHJvamVjdC5leGlzdHMoKSkgewotCQkJcHJvamVjdC5kZWxldGUoSVByb2plY3QuRk9SQ0UKLQkJCQkJfCBJUHJvamVjdC5ORVZFUl9ERUxFVEVfUFJPSkVDVF9DT05URU5ULCBtb25pdG9yKTsKLQkJfQotCQkKLQotCQlJUHJvamVjdERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uID0gd29ya3NwYWNlCi0JCQkJLm5ld1Byb2plY3REZXNjcmlwdGlvbihwcm9qZWN0TmFtZSk7Ci0JCWRlc2NyaXB0aW9uLnNldE5hdHVyZUlkcyhNZXRob2RMaWJyYXJ5UHJvamVjdE5hdHVyZS5OQVRVUkVfSURTKTsKLQkJSVBhdGggcHJvamVjdFBhdGggPSBuZXcgUGF0aChwYXRoKTsKLQkJaWYgKCFQbGF0Zm9ybS5nZXRMb2NhdGlvbigpLmlzUHJlZml4T2YocHJvamVjdFBhdGgpKSB7Ci0JCQlkZXNjcmlwdGlvbi5zZXRMb2NhdGlvbihwcm9qZWN0UGF0aCk7Ci0JCX0KLQkJcHJvamVjdC5jcmVhdGUoZGVzY3JpcHRpb24sIG1vbml0b3IpOwotCQlyZXR1cm4gcHJvamVjdDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IG1ldGhvZCBsaWJyYXJ5IHByb2plY3QgaW4gdGhlIGN1cnJlbnQgd29ya3NwYWNlLgotCSAqIAotCSAqIEBwYXJhbSBwYXRoCi0JICogICAgICAgICAgICBBbiBhYnNvbHV0ZSBwYXRoIHRvIGEgbWV0aG9kIGxpYnJhcnkuCi0JICogQHBhcmFtIG1vbml0b3IKLQkgKiAgICAgICAgICAgIEEgcHJvZ3Jlc3MgbW9uaXRvci4KLQkgKiBAcmV0dXJuIEEgPGNvZGU+SVByb2plY3Q8L2NvZGU+IG9yIDxvY2RlPm51bGw8L2NvZGU+IGlmIHRoZSBtZXRob2QKLQkgKiAgICAgICAgIGxpYnJhcnkgcHJvamVjdCBjYW5ub3QgYmUgY3JlYXRlZC4KLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUgcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVByb2plY3QgY3JlYXRlUHJvamVjdChTdHJpbmcgcGF0aCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQotCQkJdGhyb3dzIENvcmVFeGNlcHRpb24gewotLy8JCUlQcm9qZWN0IHByb2plY3QgPSBmaW5kUHJvamVjdChwYXRoKTsKLS8vCQlpZiAocHJvamVjdCAhPSBudWxsKSB7Ci0vLwkJCXByb2plY3QuZGVsZXRlKElQcm9qZWN0LkZPUkNFCi0vLwkJCQkJfCBJUHJvamVjdC5ORVZFUl9ERUxFVEVfUFJPSkVDVF9DT05URU5ULCBtb25pdG9yKTsKLS8vCQl9Ci0vLwkJRmlsZSBsaWJyYXJ5UGF0aCA9IG5ldyBGaWxlKHBhdGgpOwotLy8JCVN0cmluZyBwcm9qZWN0UGF0aCA9IGxpYnJhcnlQYXRoLmdldEFic29sdXRlUGF0aCgpOwotLy8JCVN0cmluZyBwcm9qZWN0TmFtZSA9IGxpYnJhcnlQYXRoLmdldE5hbWUoKTsKLS8vCQlyZXR1cm4gY3JlYXRlUHJvamVjdChwcm9qZWN0UGF0aCwgcHJvamVjdE5hbWUsIG1vbml0b3IpOwotCQkKLQkJcmV0dXJuIGNyZWF0ZVByb2plY3QocGF0aCwgbnVsbCwgbW9uaXRvcik7Ci0JfQotCi0JLyoqCi0JICogVmVyaWZpZXMgdGhhdCBhIHdvcmtzcGFjZSBwcm9qZWN0IGlzIGEgbWV0aG9kIGxpYnJhcnkgcHJvamVjdC4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvamVjdAotCSAqICAgICAgICAgICAgQSB3b3Jrc3BhY2UgcHJvamVjdC4KLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBnaXZlbiB3b3Jrc3BhY2UgcHJvamVjdCBpcyBhIG1ldGhvZAotCSAqICAgICAgICAgbGlicmFyeSBwcm9qZWN0LCA8Y29kZT5mYWxzZTwvY2xvZGU+IG90aGVyd2lzZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNNZXRob2RMaWJyYXJ5UHJvamVjdChJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCWlmIChwcm9qZWN0ICE9IG51bGwpIHsKLQkJCWJvb2xlYW4gY2xvc2VQcm9qZWN0T25FeGl0ID0gZmFsc2U7Ci0JCQl0cnkgewotCQkJCWlmICghcHJvamVjdC5pc09wZW4oKSkgewotCQkJCQlwcm9qZWN0Lm9wZW4oSVJlc291cmNlLkJBQ0tHUk9VTkRfUkVGUkVTSCwKLQkJCQkJCQluZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJCQkJY2xvc2VQcm9qZWN0T25FeGl0ID0gdHJ1ZTsKLQkJCQl9Ci0JCQkJSVByb2plY3REZXNjcmlwdGlvbiBkZXNjcmlwdGlvbiA9IHByb2plY3QuZ2V0RGVzY3JpcHRpb24oKTsKLQkJCQlpZiAoZGVzY3JpcHRpb24gIT0gbnVsbCkgewotCQkJCQlTdHJpbmdbXSBuYXR1cmVJZHMgPSBkZXNjcmlwdGlvbi5nZXROYXR1cmVJZHMoKTsKLQkJCQkJaWYgKEFycmF5cy5hc0xpc3QobmF0dXJlSWRzKS5jb250YWlucygKLQkJCQkJCQlNZXRob2RMaWJyYXJ5UHJvamVjdE5hdHVyZS5OQVRVUkVfSUQpKSB7Ci0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJfQotCQkJCX0KLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJfSBmaW5hbGx5IHsKLQkJCQlpZiAoY2xvc2VQcm9qZWN0T25FeGl0KSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlwcm9qZWN0LmNsb3NlKG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBMb2NhdGVzIGEgbWV0aG9kIGxpYnJhcnkgcHJvamVjdCBpbiB0aGUgY3VycmVudCB3b3Jrc3BhY2UuCi0JICogCi0JICogQHBhcmFtIHBhdGgKLQkgKiAgICAgICAgICAgIEFuIGFic29sdXRlIHBhdGggdG8gYSBtZXRob2QgbGlicmFyeS4KLQkgKiBAcmV0dXJuIEEgPGNvZGU+SVByb2plY3Q8L2NvZGU+IG9yIDxvY2RlPm51bGw8L2NvZGU+IGlmIHRoZSBtZXRob2QKLQkgKiAgICAgICAgIGxpYnJhcnkgcHJvamVjdCBjYW5ub3QgYmUgZm91bmQuCi0JICovCi0JcHVibGljIHN0YXRpYyBJUHJvamVjdCBmaW5kUHJvamVjdChTdHJpbmcgcGF0aCkgewotCQlpZiAocGF0aCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlmaW5hbCBJV29ya3NwYWNlIHdvcmtzcGFjZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKTsKLQkJSVByb2plY3RbXSBwcm9qZWN0cyA9IHdvcmtzcGFjZS5nZXRSb290KCkuZ2V0UHJvamVjdHMoKTsKLQkJdHJ5IHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcHJvamVjdHMubGVuZ3RoOyBpKyspIHsKLQkJCQlJUHJvamVjdCBwcm9qZWN0ID0gcHJvamVjdHNbaV07Ci0JCQkJaWYgKG5ldyBGaWxlKHBhdGgpLmNvbXBhcmVUbyhwcm9qZWN0LmdldExvY2F0aW9uKCkudG9GaWxlKCkpID09IDAKLQkJCQkJCSYmIGlzTWV0aG9kTGlicmFyeVByb2plY3QocHJvamVjdCkpIHsKLQkJCQkJcmV0dXJuIHByb2plY3Q7Ci0JCQkJfQotCQkJCWlmIChuZXcgRmlsZShwYXRoKS5jb21wYXJlVG8ocHJvamVjdC5nZXRMb2NhdGlvbigpLnRvRmlsZSgpKSA9PSAwKSB7Ci0JCQkJCXJldHVybiBwcm9qZWN0OwotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCUxpYnJhcnlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIExvY2F0ZXMgYSBtZXRob2QgbGlicmFyeSBwcm9qZWN0IGluIHRoZSBjdXJyZW50IHdvcmtzcGFjZS4KLQkgKiAKLQkgKiBAcGFyYW0gbGlicmFyeQotCSAqICAgICAgICAgICAgQSBtZXRob2QgbGlicmFyeS4KLQkgKiBAcmV0dXJuIEEgPGNvZGU+SVByb2plY3Q8L2NvZGU+IG9yIDxvY2RlPm51bGw8L2NvZGU+IGlmIHRoZSBtZXRob2QKLQkgKiAgICAgICAgIGxpYnJhcnkgcHJvamVjdCBjYW5ub3QgYmUgZm91bmQuCi0JICovCi0JcHVibGljIHN0YXRpYyBJUHJvamVjdCBmaW5kUHJvamVjdChNZXRob2RMaWJyYXJ5IGxpYnJhcnkpIHsKLQkJcmV0dXJuIGZpbmRQcm9qZWN0KGdldExpYnJhcnlQYXRoKGxpYnJhcnkpKTsKLQl9Ci0KLQkvKioKLQkgKiBPcGVucyBhbiBleGlzdGluZyBtZXRob2QgbGlicmFyeSBwcm9qZWN0IGluIHRoZSBjdXJyZW50IHdvcmtzcGFjZS4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWV0aG9kIGxpYnJhcnkgcHJvamVjdCBjYW5ub3QgYmUgbG9jYXRlZCwgY3JlYXRlIGEgbmV3IG9uZS4KLQkgKiAKLQkgKiBAcGFyYW0gcGF0aAotCSAqICAgICAgICAgICAgQW4gYWJzb2x1dGUgcGF0aCB0byBhIG1ldGhvZCBsaWJyYXJ5LgotCSAqIEBwYXJhbSBtb25pdG9yCi0JICogICAgICAgICAgICBBIHByb2dyZXNzIG1vbml0b3IuCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIGlmIGFuIEkvTyBlcnJvciBvY2N1cnMgd2hpbGUgcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uLgotCSAqIEByZXR1cm4gQSA8Y29kZT5JUHJvamVjdDwvY29kZT4uCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElQcm9qZWN0IG9wZW5Qcm9qZWN0KFN0cmluZyBwYXRoLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIAotCQkJdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlyZXR1cm4gb3BlblByb2plY3QocGF0aCwgbnVsbCwgIG1vbml0b3IpOwotCX0KLQotCS8qKgotCSAqIE9wZW5zIGFuIGV4aXN0aW5nIG1ldGhvZCBsaWJyYXJ5IHByb2plY3QgaW4gdGhlIGN1cnJlbnQgd29ya3NwYWNlLgotCSAqIDxwPgotCSAqIElmIHRoZSBtZXRob2QgbGlicmFyeSBwcm9qZWN0IGNhbm5vdCBiZSBsb2NhdGVkLCBjcmVhdGUgYSBuZXcgb25lLgotCSAqIAotCSAqIEBwYXJhbSBwYXRoCi0JICogICAgICAgICAgICBBbiBhYnNvbHV0ZSBwYXRoIHRvIGEgbWV0aG9kIGxpYnJhcnkuCi0JICogQHBhcmFtIG1vbml0b3IKLQkgKiAgICAgICAgICAgIEEgcHJvZ3Jlc3MgbW9uaXRvci4KLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgaWYgYW4gSS9PIGVycm9yIG9jY3VycyB3aGlsZSBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24uCi0JICogQHJldHVybiBBIDxjb2RlPklQcm9qZWN0PC9jb2RlPi4KLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUgcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVByb2plY3Qgb3BlblByb2plY3QoU3RyaW5nIHBhdGgsIFN0cmluZyBwcm9qZWN0TmFtZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQotCQkJdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJUGF0aCBwcm9qZWN0UGF0aCA9IG5ldyBQYXRoKHBhdGggKyBGaWxlLnNlcGFyYXRvcgotCQkJCSsgSVByb2plY3REZXNjcmlwdGlvbi5ERVNDUklQVElPTl9GSUxFX05BTUUpOwotCi0JCUlQcm9qZWN0RGVzY3JpcHRpb24gZGVzY3JpcHRpb247Ci0JCXRyeSB7Ci0JCQlkZXNjcmlwdGlvbiA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKQotCQkJCQkubG9hZFByb2plY3REZXNjcmlwdGlvbihwcm9qZWN0UGF0aCk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZXhjZXB0aW9uKSB7Ci0JCQlkZXNjcmlwdGlvbiA9IG51bGw7Ci0JCX0KLQotCQlJUHJvamVjdCBwcm9qZWN0ID0gbnVsbDsKLQotCQlpZiAoZGVzY3JpcHRpb24gPT0gbnVsbCkgewotCQkJLy8gLnByb2plY3QgZmlsZSBpcyBtaXNzaW5nLCBjcmVhdGUgYSBuZXcgbWV0aG9kIGxpYnJhcnkKLQkJCS8vIHByb2plY3QuCi0JCQlwcm9qZWN0ID0gTWV0aG9kTGlicmFyeVByb2plY3QuY3JlYXRlUHJvamVjdChwYXRoLCBwcm9qZWN0TmFtZSwgbW9uaXRvcik7Ci0JCX0gZWxzZSB7Ci0JCQkvLyAucHJvamVjdCBmaWxlIGV4aXN0cywgcmV0cmlldmUgdGhlIHByb2plY3QgZnJvbSB0aGUKLQkJCS8vIHdvcmtzcGFjZS4KLQkJCWlmICggcHJvamVjdE5hbWUgIT0gbnVsbCApIHsKLQkJCQlkZXNjcmlwdGlvbi5zZXROYW1lKHByb2plY3ROYW1lKTsKLQkJCX0KLQkJCQotCQkJcHJvamVjdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdCgKLQkJCQkJZGVzY3JpcHRpb24uZ2V0TmFtZSgpKTsKLQkJCWlmICghcHJvamVjdC5leGlzdHMoKSkgewotCQkJCS8vIFRoZSBwcm9qZWN0IGRvZXMgbm90IGV4aXN0IGluIHRoZSB3b3Jrc3BhY2UuIENyZWF0ZSBhIG5ldwotCQkJCS8vIG1ldGhvZCBsaWJyYXJ5IHByb2plY3QgdXNpbmcgdGhlIHByb2plY3QgbmFtZSBmcm9tIHRoZQotCQkJCS8vIC5wcm9qZWN0IGZpbGUuCi0JCQkJcHJvamVjdCA9IE1ldGhvZExpYnJhcnlQcm9qZWN0LmNyZWF0ZVByb2plY3QocGF0aCwgcHJvamVjdAotCQkJCQkJLmdldE5hbWUoKSwgbW9uaXRvcik7Ci0JCQl9IGVsc2UgewotCQkJCS8vIFRoZSBwcm9qZWN0IGRvZXMgZXhpc3QgaW4gdGhlIHdvcmtzcGFjZS4KLQkJCQkvLyBWZXJpZnkgdGhhdCB0aGUgbG9jYXRpb24gbWF0Y2hlcy4gSWYgbm90LCBjcmVhdGUgYSBuZXcgbWV0aG9kCi0JCQkJLy8gbGlicmFyeSBwcm9qZWN0LgotCQkJCWlmIChuZXcgRmlsZShwYXRoKS5jb21wYXJlVG8ocHJvamVjdC5nZXRMb2NhdGlvbigpLnRvRmlsZSgpKSAhPSAwKSB7Ci0JCQkJCXByb2plY3QgPSBNZXRob2RMaWJyYXJ5UHJvamVjdC5jcmVhdGVQcm9qZWN0KHBhdGgsIG1vbml0b3IpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWlmICghcHJvamVjdC5pc09wZW4oKSkgewotCQkJcHJvamVjdC5vcGVuKElSZXNvdXJjZS5CQUNLR1JPVU5EX1JFRlJFU0gsIG1vbml0b3IpOwotCQl9Ci0KLQkJaWYgKGRlc2NyaXB0aW9uID09IG51bGwpIHsKLQkJCWRlc2NyaXB0aW9uID0gcHJvamVjdC5nZXREZXNjcmlwdGlvbigpOwotCQl9Ci0KLQkJLy8gTWFrZSBzdXJlIHRoZSBwcm9qZWN0IGhhcyB0aGUgTWV0aG9kTGlicmFyeVByb2plY3ROYXR1cmUuCi0JCVN0cmluZ1tdIG5hdHVyZUlkcyA9IGRlc2NyaXB0aW9uLmdldE5hdHVyZUlkcygpOwotCQlpZiAoIUFycmF5cy5hc0xpc3QobmF0dXJlSWRzKS5jb250YWlucygKLQkJCQlNZXRob2RMaWJyYXJ5UHJvamVjdE5hdHVyZS5OQVRVUkVfSUQpKSB7Ci0JCQlkZXNjcmlwdGlvbi5zZXROYXR1cmVJZHMoTWV0aG9kTGlicmFyeVByb2plY3ROYXR1cmUuTkFUVVJFX0lEUyk7Ci0JCQlwcm9qZWN0LnNldERlc2NyaXB0aW9uKGRlc2NyaXB0aW9uLCBJUHJvamVjdC5GT1JDRQotCQkJCQl8IElQcm9qZWN0LktFRVBfSElTVE9SWSwgbW9uaXRvcik7Ci0JCX0KLQotCQlyZXR1cm4gcHJvamVjdDsKLQl9Ci0KLQkvKioKLQkgKiBDbG9zZXMgYSBtZXRob2QgbGlicmFyeSBwcm9qZWN0IGluIHRoZSB3b3Jrc3BhY2UuCi0JICogCi0JICogQHBhcmFtIHBhdGgKLQkgKiAgICAgICAgICAgIEFuIGFic29sdXRlIHBhdGggdG8gYSBtZXRob2QgbGlicmFyeS4KLQkgKiBAcGFyYW0gbW9uaXRvcgotCSAqICAgICAgICAgICAgQSBwcm9ncmVzcyBtb25pdG9yLgotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycyB3aGlsZSBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24uCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGNsb3NlUHJvamVjdChTdHJpbmcgcGF0aCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQotCQkJdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJUHJvamVjdCBwcm9qZWN0ID0gZmluZFByb2plY3QocGF0aCk7Ci0JCS8vIGNoZWNrIGlmIHdvcmtzcGFjZSBpcyBtb2RpZmlhYmxlCi0JCWlmIChwcm9qZWN0ICE9IG51bGwgJiYgIXByb2plY3QuZ2V0V29ya3NwYWNlKCkuaXNUcmVlTG9ja2VkKCkgJiYgcHJvamVjdC5pc09wZW4oKSkgewotCQkJcHJvamVjdC5jbG9zZShtb25pdG9yKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENsb3NlcyBhIG1ldGhvZCBsaWJyYXJ5IHByb2plY3QgaW4gdGhlIHdvcmtzcGFjZS4KLQkgKiAKLQkgKiBAcGFyYW0gbGlicmFyeQotCSAqICAgICAgICAgICAgQSBtZXRob2QgbGlicmFyeS4KLQkgKiBAcGFyYW0gbW9uaXRvcgotCSAqICAgICAgICAgICAgQSBwcm9ncmVzcyBtb25pdG9yLgotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycyB3aGlsZSBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24uCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGNsb3NlUHJvamVjdChNZXRob2RMaWJyYXJ5IGxpYnJhcnksCi0JCQlJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJY2xvc2VQcm9qZWN0KGdldExpYnJhcnlQYXRoKGxpYnJhcnkpLCBtb25pdG9yKTsKLQl9Ci0KLQkvKioKLQkgKiBEZWxldGVzIGEgbWV0aG9kIGxpYnJhcnkgcHJvamVjdCBmcm9tIHRoZSBjdXJyZW50IHdvcmtzcGFjZS4KLQkgKiAKLQkgKiBAcGFyYW0gcGF0aAotCSAqICAgICAgICAgICAgQW4gYWJzb2x1dGUgcGF0aCB0byBhIG1ldGhvZCBsaWJyYXJ5LgotCSAqIEBwYXJhbSBtb25pdG9yCi0JICogICAgICAgICAgICBBIHByb2dyZXNzIG1vbml0b3IuCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgbWV0aG9kIGxpYnJhcnkgcHJvamVjdCBpcyBzdWNjZXNzZnVsbHkKLQkgKiAgICAgICAgIGRlbGV0ZWQsIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gZGVsZXRlUHJvamVjdChTdHJpbmcgcGF0aCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCUlQcm9qZWN0IHByb2plY3QgPSBmaW5kUHJvamVjdChwYXRoKTsKLQkJaWYgKHByb2plY3QgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlpZiAobW9uaXRvciA9PSBudWxsKSB7Ci0JCQkJCW1vbml0b3IgPSBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpOwotCQkJCX0KLQkJCQlwcm9qZWN0LmRlbGV0ZShJUHJvamVjdC5GT1JDRQotCQkJCQkJfCBJUHJvamVjdC5ORVZFUl9ERUxFVEVfUFJPSkVDVF9DT05URU5ULCBtb25pdG9yKTsKLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCUxpYnJhcnlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBEZWxldGVzIGEgbWV0aG9kIGxpYnJhcnkgcHJvamVjdCBmcm9tIHRoZSBjdXJyZW50IHdvcmtzcGFjZS4KLQkgKiAKLQkgKiBAcGFyYW0gbGlicmFyeQotCSAqICAgICAgICAgICAgQSBtZXRob2QgbGlicmFyeS4KLQkgKiBAcGFyYW0gbW9uaXRvcgotCSAqICAgICAgICAgICAgQSBwcm9ncmVzcyBtb25pdG9yLgotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIG1ldGhvZCBsaWJyYXJ5IHByb2plY3QgaXMgc3VjY2Vzc2Z1bGx5Ci0JICogICAgICAgICBkZWxldGVkLCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBkZWxldGVQcm9qZWN0KE1ldGhvZExpYnJhcnkgbGlicmFyeSwKLQkJCUlQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlyZXR1cm4gZGVsZXRlUHJvamVjdChnZXRMaWJyYXJ5UGF0aChsaWJyYXJ5KSwgbW9uaXRvcik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgYWJzb2x1dGUgcGF0aCB0byBhIG1ldGhvZCBsaWJyYXJ5LgotCSAqIAotCSAqIEBwYXJhbSBsaWJyYXJ5Ci0JICogQHJldHVybiBBbiBhYnNvbHV0ZSBwYXRoIHRvIGEgbWV0aG9kIGxpYnJhcnkuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldExpYnJhcnlQYXRoKE1ldGhvZExpYnJhcnkgbGlicmFyeSkgewotCQlyZXR1cm4gbmV3IEZpbGUobGlicmFyeS5lUmVzb3VyY2UoKS5nZXRVUkkoKS50b0ZpbGVTdHJpbmcoKSkKLQkJCQkuZ2V0UGFyZW50KCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvcHJvamVjdC9NZXRob2RMaWJyYXJ5UHJvamVjdE5hdHVyZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Byb2plY3QvTWV0aG9kTGlicmFyeVByb2plY3ROYXR1cmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2YzYzNjOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvcHJvamVjdC9NZXRob2RMaWJyYXJ5UHJvamVjdE5hdHVyZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucHJvamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0TmF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotCi0vKioKLSAqIEEgTWV0aG9kIExpYnJhcnkgUHJvamVjdCBuYXR1cmUuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTWV0aG9kTGlicmFyeVByb2plY3ROYXR1cmUgaW1wbGVtZW50cyBJUHJvamVjdE5hdHVyZSB7Ci0KLQkvKioKLQkgKiBUaGUgbmF0dXJlIElEIGZvciBhIE1ldGhvZCBMaWJyYXJ5IFByb2plY3QuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFUVVJFX0lEID0gTWV0aG9kTGlicmFyeVByb2plY3ROYXR1cmUuY2xhc3MKLQkJCS5nZXROYW1lKCk7Ci0KLQkvKioKLQkgKiBBbiBhcnJheSBvZiBNZXRob2QgTGlicmFyeSBQcm9qZWN0IG5hdHVyZSBJRHMuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmdbXSBOQVRVUkVfSURTID0geyBOQVRVUkVfSUQgfTsKLQotCXByaXZhdGUgSVByb2plY3QgcHJvamVjdDsKLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3ROYXR1cmUjY29uZmlndXJlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjb25maWd1cmUoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdE5hdHVyZSNkZWNvbmZpZ3VyZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGVjb25maWd1cmUoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdE5hdHVyZSNnZXRQcm9qZWN0KCkKLQkgKi8KLQlwdWJsaWMgSVByb2plY3QgZ2V0UHJvamVjdCgpIHsKLQkJcmV0dXJuIHByb2plY3Q7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdE5hdHVyZSNzZXRQcm9qZWN0KElQcm9qZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFByb2plY3QoSVByb2plY3QgcHJvamVjdCkgewotCQl0aGlzLnByb2plY3QgPSBwcm9qZWN0OwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Byb2plY3QvcGFja2FnZS5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Byb2plY3QvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMzE4YjRkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9wcm9qZWN0L3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIG1hbmFnZW1lbnQgb2YgbWV0aG9kIGxpYnJhcnkgcHJvamVjdHMgaW4gYSB3b3Jrc3BhY2UuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3NlcnZpY2VzL0VsZW1lbnRGaWxlLmphdmEudHh0IGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3NlcnZpY2VzL0VsZW1lbnRGaWxlLmphdmEudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYThlYzU5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9zZXJ2aWNlcy9FbGVtZW50RmlsZS5qYXZhLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnNlcnZpY2VzOwotCi0vKioKLSAqIAotICogVGhpcyBjbGFzcyBpcyBkZXByaWNhdGVkLiB1c2UgRmlsZU5hbWVHZW5lcmF0b3IgaW5zdGVhZAotICoKLSAqLwotcHVibGljIGNsYXNzIEVsZW1lbnRGaWxlIGltcGxlbWVudHMgQ29tcGFyYWJsZSB7Ci0JcHJpdmF0ZSBTdHJpbmcgZ3VpZDsKLQlwcml2YXRlIFN0cmluZyBmaWxlTmFtZTsKLQlwcml2YXRlIHN0YXRpYyBpbnQgaW5kZXhDb3VudGVyID0gMDsKLQkKLQlwdWJsaWMgRWxlbWVudEZpbGUoU3RyaW5nIGd1aWQsIFN0cmluZyBmaWxlTmFtZSkgewotCQl0aGlzLmd1aWQgPSBndWlkOwotCQl0aGlzLmZpbGVOYW1lID0gZmlsZU5hbWU7Ci0JCWluZGV4Q291bnRlciA9IDA7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgZSkJewotCQlFbGVtZW50RmlsZSBlRmlsZSA9IChFbGVtZW50RmlsZSkgZTsKLQkJCi0JCWlmICghKGdldEd1aWQoKS5lcXVhbHMoZUZpbGUuZ2V0R3VpZCgpKSkgCi0JCQkJJiYgZ2V0RmlsZU5hbWUoKS5lcXVhbHMoZUZpbGUuZ2V0RmlsZU5hbWUoKSkpIHsJCQkKLQkJCXJldHVybiBhcHBlbmRJbmRleCgpOwotCQl9Ci0JCWluZGV4Q291bnRlcisrOwotCQlyZXR1cm4gZ2V0RmlsZU5hbWUoKS5lcXVhbHMoZUZpbGUuZ2V0RmlsZU5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0JCXJldHVybiBmaWxlTmFtZS5oYXNoQ29kZSgpOwotCX0KLQkKLQlwdWJsaWMgaW50IGNvbXBhcmVUbyhPYmplY3QgZSkgewkJCi0JCWlmIChlIGluc3RhbmNlb2YgRWxlbWVudEZpbGUpCi0JCXsKLQkJCUVsZW1lbnRGaWxlIGFGaWxlID0gKEVsZW1lbnRGaWxlKSBlOwotCQkJcmV0dXJuIGZpbGVOYW1lLmNvbXBhcmVUbyhhRmlsZS5nZXRGaWxlTmFtZSgpKTsKLQkJfQotCQlyZXR1cm4gMTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0RmlsZU5hbWUoU3RyaW5nIGZOYW1lKSB7Ci0JCWZpbGVOYW1lID0gZk5hbWU7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0RmlsZU5hbWUoKQl7Ci0JCXJldHVybiBmaWxlTmFtZTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRHdWlkKCkJewotCQlyZXR1cm4gZ3VpZDsKLQl9Ci0JCi0JcHJpdmF0ZSBib29sZWFuIGFwcGVuZEluZGV4KCkgewotCQlTdHJpbmdCdWZmZXIgdFN0cmluZyA9IG5ldyBTdHJpbmdCdWZmZXIoZ2V0RmlsZU5hbWUoKSk7Ci0JCWludCBiZWdpbmRJZHggPSBnZXRGaWxlTmFtZSgpLmxhc3RJbmRleE9mKCItIik7Ci0JCWludCBlbmRJZHggPSBnZXRGaWxlTmFtZSgpLmxhc3RJbmRleE9mKCIuaHRtIik7Ci0JCWlmIChiZWdpbmRJZHggPiAtMSAmJiBlbmRJZHggPiAtMSkgewotCQkJaWYgKGluZGV4Q291bnRlciA+IDApIHsKLQkJCQl0U3RyaW5nLnJlcGxhY2UoYmVnaW5kSWR4KzEsIGVuZElkeCwgSW50ZWdlci50b1N0cmluZygrK2luZGV4Q291bnRlcikpOwkKLQkJCQlzZXRGaWxlTmFtZSh0U3RyaW5nLnRvU3RyaW5nKCkpOwotCQkJCS8vaW5kZXhDb3VudGVyID0gMDsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfSBlbHNlIGlmIChlbmRJZHggPiAtMSkgewkJCQotCQkJdFN0cmluZy5pbnNlcnQoZW5kSWR4LCAiLSIgKyBJbnRlZ2VyLnRvU3RyaW5nKCsraW5kZXhDb3VudGVyKSk7Ci0JCQlzZXRGaWxlTmFtZSh0U3RyaW5nLnRvU3RyaW5nKCkpOwotCQkJLy9pbmRleENvdW50ZXIgPSAwOwotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9zZXJ2aWNlcy9MaWJyYXJ5TW9kaWZpY2F0aW9uSGVscGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvc2VydmljZXMvTGlicmFyeU1vZGlmaWNhdGlvbkhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5N2JmZGU5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9zZXJ2aWNlcy9MaWJyYXJ5TW9kaWZpY2F0aW9uSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuc2VydmljZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5BY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLklMaWJyYXJ5UmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzLklMaWJyYXJ5UGVyc2lzdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy5JTGlicmFyeVBlcnNpc3Rlci5GYWlsU2FmZU1ldGhvZExpYnJhcnlQZXJzaXN0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLS8qKgotICogVGhpcyBoZWxwZXIgaXMgdXNpbmcgYW4gaW5zdGFuY2Ugb2YgSUFjdGlvbk1hbmFnZXIgdG8ga2VlcCB0cmFjayBvZiBjaGFuZ2VzLgotICogQ2xpZW4gbXVzdCB7QGxpbmsgI2Rpc3Bvc2UoKSA8ZW0+ZGlzcG9zZTwvZW0+fSB0aGlzIGhlbHBlciBhZnRlciB1c2UuCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBMaWJyYXJ5TW9kaWZpY2F0aW9uSGVscGVyIHsKLQotCUFjdGlvbk1hbmFnZXIgYWN0aW9uTWdyID0gbnVsbDsKLQotCS8qKgotCSAqIGNvbnN0cnVjdG9yCi0JICoKLQkgKi8KLQlwdWJsaWMgTGlicmFyeU1vZGlmaWNhdGlvbkhlbHBlcigpIHsKLQl9Ci0KLQkvKioKLQkgKiBnZXQgdGhlIGFjdGlvbiBtYW5hZ2VyCi0JICogQHJldHVybiBBY3Rpb25NYW5hZ2VyCi0JICovCi0JcHVibGljIEFjdGlvbk1hbmFnZXIgZ2V0QWN0aW9uTWFuYWdlcigpIHsKLQkJaWYgKGFjdGlvbk1nciAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gYWN0aW9uTWdyOwotCQl9Ci0KLQkJYWN0aW9uTWdyID0gbmV3IEFjdGlvbk1hbmFnZXIoKSB7Ci0JCQlwdWJsaWMgYm9vbGVhbiBkb0FjdGlvbihpbnQgYWN0aW9uVHlwZSwgRU9iamVjdCBvYmplY3QsCi0JCQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBPYmplY3QgdmFsdWUsIGludCBpbmRleCkgewotCQkJCWlmIChjYW5VcGRhdGUob2JqZWN0KSkgewotCQkJCQlyZXR1cm4gc3VwZXIuZG9BY3Rpb24oYWN0aW9uVHlwZSwgb2JqZWN0LCBmZWF0dXJlLCB2YWx1ZSwKLQkJCQkJCQlpbmRleCk7Ci0JCQkJfQotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQotCQkJcHJvdGVjdGVkIHZvaWQgc2F2ZShSZXNvdXJjZSByZXNvdXJjZSkgewotCQkJfQotCQl9OwotCi0JCXJldHVybiBhY3Rpb25NZ3I7Ci0JfQotCi0JLyoqCi0JICogZGlzcG9zZQotCSAqCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJaWYgKGFjdGlvbk1nciAhPSBudWxsKSB7Ci0JCQlhY3Rpb25NZ3IuZGlzcG9zZSgpOwotCQkJYWN0aW9uTWdyID0gbnVsbDsKLQkJfQotCX0KLQotCS8qKgotCSAqIGNoZWNrIGlmIHVwZGF0ZSBpcyBhbGxvd2VkCi0JICogQHBhcmFtIG9iamVjdAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjYW5VcGRhdGUoRU9iamVjdCBvYmplY3QpIHsKLQkJSVN0YXR1cyBzdGF0dXMgPSBUbmdVdGlsLmNoZWNrRWRpdChvYmplY3QsIG51bGwpOwotCQlpZiAoc3RhdHVzLmlzT0soKSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0gZWxzZSB7Ci0JCQlTdHJpbmcgbXNnID0gTkxTLmJpbmQoTGlicmFyeVJlc291cmNlcy5MaWJyYXJ5TW9kaWZpY2F0aW9uSGVscGVyX2Nhbm5vdFVwZGF0ZSwgVG5nVXRpbC5nZXRUeXBlVGV4dChvYmplY3QpLCBvYmplY3QKLQkJCS5lR2V0KFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE5hbWVkRWxlbWVudF9OYW1lKCkpKTsKLQkJCUxpYnJhcnlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0NhbGxiYWNrKCkuZGlzcGxheVdhcm5pbmcoTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCksCi0JCQkJCUxpYnJhcnlSZXNvdXJjZXMud2FybmluZ0RsZ190aXRsZQotCQkJCQksIG1zZywgVG5nVXRpbC5nZXRNZXNzYWdlKHN0YXR1cykpOwotCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBjaGVjayBpZiBzYXZlIGlzIG5lZWRlZAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2F2ZU5lZWRlZCgpIHsKLQkJcmV0dXJuIChhY3Rpb25NZ3IgIT0gbnVsbCkgJiYgYWN0aW9uTWdyLmlzU2F2ZU5lZWRlZCgpOwotCX0KLQotCS8qKgotCSAqIGRvIHNhdmUKLQkgKgotCSAqLwotCXB1YmxpYyB2b2lkIHNhdmUoKSB7Ci0JCWlmIChhY3Rpb25NZ3IgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJdHJ5IHsJCQkKLQkJCUNvbGxlY3Rpb24gbW9kaWZpZWRSZXNvdXJjZXMgPSBhY3Rpb25NZ3IuZ2V0TW9kaWZpZWRSZXNvdXJjZXMoKTsKLQkJCUZhaWxTYWZlTWV0aG9kTGlicmFyeVBlcnNpc3RlciBwZXJzaXN0ZXIgPSBnZXRQZXJzaXN0ZXIobW9kaWZpZWRSZXNvdXJjZXMpOwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gbW9kaWZpZWRSZXNvdXJjZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSAoUmVzb3VyY2UpIGl0ZXIubmV4dCgpOwotCQkJCXRyeSB7Ci0JCQkJCXBlcnNpc3Rlci5zYXZlKHJlc291cmNlKTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQlTdHJpbmcgbXNnID0gTkxTLmJpbmQoTGlicmFyeVJlc291cmNlcy5lcnJvckRsZ19zYXZlRXJyb3IKLQkJCQkJCQksIHJlc291cmNlLmdldFVSSSgpLmlzRmlsZSgpID8gcmVzb3VyY2UuZ2V0VVJJKCkudG9GaWxlU3RyaW5nKCkgOiByZXNvdXJjZS5nZXRVUkkoKS50b1N0cmluZygpKTsgCi0JCQkJCUxpYnJhcnlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0NhbGxiYWNrKCkuZGlzcGxheUVycm9yKExpYnJhcnlQbHVnaW4uZ2V0RGVmYXVsdCgpLAotCQkJCQkJCUxpYnJhcnlSZXNvdXJjZXMuZXJyb3JEbGdfdGl0bGUKLQkJCQkJCQksIG1zZywgZSk7Ci0JCQkJfQotCQkJfQotCi0JCQl0cnkgewotCQkJCXBlcnNpc3Rlci5jb21taXQoKTsKLQkJCQlhY3Rpb25NZ3Iuc2F2ZUlzRG9uZSgpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQl0cnkgewotCQkJCQlwZXJzaXN0ZXIucm9sbGJhY2soKTsKLQkJCQl9IGNhdGNoIChUaHJvd2FibGUgdGgpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCS8vIGlmIHJvbGxiYWNrIGZhaWxlZCwgcmVsb2FkIHRoZSBsaWJyYXJ5Ci0JCQkJCQlMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJCQkJCS5yZW9wZW5DdXJyZW50TWV0aG9kTGlicmFyeSgpOwotCQkJCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUxKSB7Ci0JCQkJCQllMS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQkJfQotCQkJCX0KLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0KLQotCXByaXZhdGUgRmFpbFNhZmVNZXRob2RMaWJyYXJ5UGVyc2lzdGVyIGdldFBlcnNpc3RlcihDb2xsZWN0aW9uIHJlc291cmNlcykgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSByZXNvdXJjZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlSZXNvdXJjZSByZXNvdXJjZSA9IChSZXNvdXJjZSkgaXRlci5uZXh0KCk7Ci0JCQlSZXNvdXJjZVNldCByZXNvdXJjZVNldCA9IHJlc291cmNlLmdldFJlc291cmNlU2V0KCk7Ci0JCQlpZihyZXNvdXJjZVNldCBpbnN0YW5jZW9mIElMaWJyYXJ5UmVzb3VyY2VTZXQpIHsKLQkJCQlJTGlicmFyeVBlcnNpc3RlciBwZXJzaXN0ZXIgPSAoKElMaWJyYXJ5UmVzb3VyY2VTZXQpcmVzb3VyY2VTZXQpLmdldFBlcnNpc3RlcigpOwotCQkJCWlmKHBlcnNpc3RlciAhPSBudWxsKSB7Ci0JCQkJCXJldHVybiBwZXJzaXN0ZXIuZ2V0RmFpbFNhZmVQZXJzaXN0ZXIoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvc2VydmljZXMvTmFtZUNhY2hlLmphdmEudHh0IGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3NlcnZpY2VzL05hbWVDYWNoZS5qYXZhLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWNmNmEyMS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvc2VydmljZXMvTmFtZUNhY2hlLmphdmEudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMjA3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnNlcnZpY2VzOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5TdHJVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5Cb29rbWFyazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuTGlua0luZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLk11bHRpRmlsZVJlc291cmNlU2V0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci0KLS8qKgotICogCi0gKiBUaGlzIGNsYXNzIGlzIGRlcHJpY2F0ZWQuIHVzZSBGaWxlTmFtZUdlbmVyYXRvciBpbnN0ZWFkCi0gKgotICovCi1wdWJsaWMgY2xhc3MgTmFtZUNhY2hlIHsKLQkKLQlwcml2YXRlIHN0YXRpYyBOYW1lQ2FjaGUgaW5zdGFuY2UgPSBuZXcgTmFtZUNhY2hlKCk7Ci0JcHJpdmF0ZSBNYXA8U3RyaW5nLCBTdHJpbmc+IGFNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKLQlwcml2YXRlIFNldDxFbGVtZW50RmlsZT4gYVNldCA9IG5ldyBIYXNoU2V0PEVsZW1lbnRGaWxlPigpOwotCXByaXZhdGUgTWFwPFN0cmluZywgU3RyaW5nPiBnTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaGFyZWQgaW5zdGFuY2UuCi0JICogQGRlcGxpY2F0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBOYW1lQ2FjaGUgZ2V0SW5zdGFuY2UoKSB7Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci0KLQkvKioKLQkgKiBQcml2YXRlIGNvbnN0cnVjdG9yIHRvIHByZXZlbnQgdGhpcyBjbGFzcyBmcm9tIGJlaW5nIGluc3RhbnRpYXRlZC4KLQkgKi8KLQlwcml2YXRlIE5hbWVDYWNoZSgpIHsKLQl9Ci0JCi0JcHVibGljIHZvaWQgY2xlYXIoKSB7Ci0JCWFNYXAuY2xlYXIoKTsKLQkJYVNldC5jbGVhcigpOwotCQlnTWFwLmNsZWFyKCk7Ci0JfQotCQotCS8qKgotCSAqIGdldCB0aGUgZmlsZSBuYW1lIHdpdGggdGhlIGdpdmVuIHByZWZpeCBhbmQgZXh0ZW5zaW9uCi0JICogQHBhcmFtIGVsZW1lbnQgTWV0aG9kRWxlbWVudAotCSAqIEBwYXJhbSBuYW1lUHJlZml4IFN0cmluZyBwcmVmaXggZm9yIHRoZSBuYW1lCi0JICogQHBhcmFtIG5hbWVTdWZmaXggU3RyaW5nIHN1ZmZpeCBmb3IgdGhlIG5hbWUKLQkgKiBAcGFyYW0gZXh0IFN0cmluZyBmaWxlIGV4dGVuc2lvbiwgZm9yIGV4YW1wbGUsICIuaHRtbCIKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqIEBkZXBsaWNhdGVkCi0JICovCSAKLQlwcml2YXRlIFN0cmluZyBnZXRGaWxlTmFtZShNZXRob2RFbGVtZW50IGVsZW1lbnQsIFN0cmluZyBuYW1lUHJlZml4LAotCQkJU3RyaW5nIG5hbWVTdWZmaXgsIFN0cmluZyBleHQpIHsKLQkJCi0JCVN0cmluZyBleGlzdGluZ0VsZW1lbnROYW1lID0gbnVsbDsKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJaWYgKG5hbWVQcmVmaXggIT0gbnVsbCkgewotCQkJYnVmZmVyLmFwcGVuZChuYW1lUHJlZml4KTsKLQkJfQotCQkKLQkJaWYgKGVsZW1lbnQuZ2V0TmFtZSgpID09ICIiKQotCQkJcmV0dXJuICIwIiArIGV4dDsgLy8kTk9OLU5MUy0xJAotCQkJCi0JCWlmICghZ01hcC5pc0VtcHR5KCkpIHsKLQkJCWV4aXN0aW5nRWxlbWVudE5hbWUgPSAgKFN0cmluZykgZ01hcC5nZXQoZWxlbWVudC5nZXRHdWlkKCkpOwotCQl9Ci0JCS8vIEJyb3dzaW5nOiBCcm93c2luZyBDUCB3aXRoIHNwZWNpYWwgY2hhcnMgZmFpbGVkIHdpdGgKLQkJLy8gYmxhbmsgcGFnZXMgYW5kIFNjcmlwdCBFcnJvciBuZWVkIHRvIG1ha2UgYSB2YWxpZCBmaWxlIG5hbWUKLQkJYnVmZmVyLmFwcGVuZCgoZXhpc3RpbmdFbGVtZW50TmFtZSAhPSBudWxsKSA/IGV4aXN0aW5nRWxlbWVudE5hbWUgOiBTdHJVdGlsLnJlbW92ZVNwZWNpYWxDaGFyYWN0ZXJzKGVsZW1lbnQuZ2V0TmFtZSgpKSk7Ci0JCWlmIChuYW1lU3VmZml4ICE9IG51bGwpIHsKLQkJCWJ1ZmZlci5hcHBlbmQobmFtZVN1ZmZpeCk7Ci0JCX0KLQotCQlpZiAoZXh0ICE9IG51bGwpIHsKLQkJCWlmIChleHQuaW5kZXhPZigiLiIpIDwgMCkgLy8kTk9OLU5MUy0xJAotCQkJewotCQkJCWV4dCA9ICIuIiArIGV4dDsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJYnVmZmVyLmFwcGVuZChleHQpOwotCQl9Ci0JCQotCQlpZiAoZXhpc3RpbmdFbGVtZW50TmFtZSA9PSBudWxsKSB7Ci0JCQkKLQkJCUVsZW1lbnRGaWxlIGEgPSBuZXcgRWxlbWVudEZpbGUoZWxlbWVudC5nZXRHdWlkKCksIGJ1ZmZlci50b1N0cmluZygpKTsKLQkJCQotCQkJaWYgKGEgIT0gbnVsbCAmJiBhU2V0LmFkZChhKSkgewotCQkJCWludCBleHREb3QgPSBhLmdldEZpbGVOYW1lKCkubGFzdEluZGV4T2YoIi4iKTsKLQkJCQlhTWFwLnB1dCgoZXh0RG90IDwgMCkgPyBhLmdldEZpbGVOYW1lKCkgOiBhLmdldEZpbGVOYW1lKCkuc3Vic3RyaW5nKDAsIGV4dERvdCksIGVsZW1lbnQuZ2V0R3VpZCgpKTsJCQkgCi0JCQkJZ01hcC5wdXQoZWxlbWVudC5nZXRHdWlkKCksIChleHREb3QgPCAwKSA/IGEuZ2V0RmlsZU5hbWUoKSA6IGEuZ2V0RmlsZU5hbWUoKS5zdWJzdHJpbmcoMCwgZXh0RG90KSk7Ci0JCQl9Ci0JCQotCQkJcmV0dXJuIGEuZ2V0RmlsZU5hbWUoKTsKLQkJfQotCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JfQotCQotCQotCXByaXZhdGUgU3RyaW5nIGdldEZpbGVOYW1lKFN0cmluZyBndWlkKSB7Ci0JCi0JCWlmIChndWlkICE9IG51bGwgJiYgIWdNYXAuaXNFbXB0eSgpKSB7Ci0JCQlyZXR1cm4gKFN0cmluZykgZ01hcC5nZXQoZ3VpZCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7IAotCX0KLQotCS8qKgotCSAqIGdldCB0aGUgZ3VpZCBmcm9tIHRoZSBmaWxlIG5hbWUsIGFzc3VtaW5nIHRoZSBmaWxlIG5hbWUgaXMgZ2VuZXJhdGVkIGZyb20gYW4gZWxlbWVudCwgCi0JICogcmV0dXJuIG51bGwgaWYgbm90IGZvdW5kLgotCSAqIEBwYXJhbSBmaWxlTmFtZSBTdHJpbmcKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0R3VpZEZyb21GaWxlTmFtZShTdHJpbmcgZmlsZU5hbWUpIHsKLQkJaWYgKGZpbGVOYW1lID09IG51bGwgfHwgKGZpbGVOYW1lLmluZGV4T2YoInJlc291cmNlcy8iKSA+IC0xICYmIGZpbGVOYW1lLmluZGV4T2YoIi5odG0iKSA8IDApKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQkJCQotCQkKLQkJU3RyaW5nIGd1aWQgPSBudWxsOwotCQkKLQkJaW50IGlkeCA9IGZpbGVOYW1lLmxhc3RJbmRleE9mKCIvIik7Ci0JCWludCBsYXN0SWR4ID0gZmlsZU5hbWUubGFzdEluZGV4T2YoIi4iKTsKLQotCQlpZiAoaWR4ID4gLTEpIHsKLQkJCWd1aWQgPSAoU3RyaW5nKSBhTWFwLmdldCgobGFzdElkeCA+IC0xICYmIGlkeCA8IGxhc3RJZHgpID8gCi0JCQkJCWZpbGVOYW1lLnN1YnN0cmluZyhpZHgrMSwgbGFzdElkeCkgOiAoaWR4IDwgZmlsZU5hbWUubGVuZ3RoKCkpID8gCi0JCQkJCQkJZmlsZU5hbWUuc3Vic3RyaW5nKGlkeCsxKSA6IG51bGwpOwotCQl9IGVsc2UgewotCQkJZ3VpZCA9IChTdHJpbmcpIGFNYXAuZ2V0KChsYXN0SWR4ID4gLTEpID8gZmlsZU5hbWUuc3Vic3RyaW5nKDAsIGxhc3RJZHgpIDogZmlsZU5hbWUpOwotCQl9Ci0JCWlmIChndWlkID09IG51bGwpCXJldHVybiBudWxsOwkJCi0JCi0JCS8vIHR1cm4gb2ZmIGVycm9yIHJlcG9ydGluZyBhbmQgc2VlIGlmIGd1aWQgZXhpc3RzIGluIGxpYnJhcnkKLQkJYm9vbGVhbiBvbGRSZXBvcnRfRXJyb3IgPSBNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwuUkVQT1JUX0VSUk9SOwotCQlNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwuUkVQT1JUX0VSUk9SID0gZmFsc2U7Ci0vKgkJTWV0aG9kRWxlbWVudCBlID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TGlicmFyeU1hbmFnZXIoKQotCQkJCS5nZXRNZXRob2RFbGVtZW50KGd1aWQpOyovCi0JCS8vcGFydCBvZiB0ZW1wIHNvbHV0aW9uIGR1ZSB0byBub3QgaGF2aW5nIGxpYiBtZ3IgZHVyaW5nIG1pZ3JhdGlvbgotCQlNZXRob2RFbGVtZW50IGUgPSBMaW5rSW5mby5nZXRNZXRob2RFbGVtZW50KGd1aWQpOwotCQlNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwuUkVQT1JUX0VSUk9SID0gb2xkUmVwb3J0X0Vycm9yOwotCQlpZiAoZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJcmV0dXJuIGd1aWQ7Ci0JfQotCQotCS8qKgotCSAqIGdldCB0aGUgZmlsZSBuYW1lIHdpdGggdGhlIGdpdmVuIHByZWZpeCBhbmQgZXh0ZW5zaW9uCi0JICogQHBhcmFtIHZpZXcgQm9va21hcmsKLQkgKiBAcGFyYW0gbmFtZVByZWZpeCBTdHJpbmcgcHJlZml4IGZvciB0aGUgbmFtZQotCSAqIEBwYXJhbSBuYW1lU3VmZml4IFN0cmluZyBzdWZmaXggZm9yIHRoZSBuYW1lCi0JICogQHBhcmFtIGV4dCBTdHJpbmcgZmlsZSBleHRlbnNpb24sIGZvciBleGFtcGxlLCAiLmh0bWwiCi0JICogQHJldHVybiBTdHJpbmcKLQkgKiBAZGVwbGljYXRlZCB0aGlzIG1ldGhvZCBpcyBub3QgbmVlZGVkIAotCSAqLwkgCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0RmlsZU5hbWUoQm9va21hcmsgdmlldywgU3RyaW5nIG5hbWVQcmVmaXgsCi0JCQlTdHJpbmcgbmFtZVN1ZmZpeCwgU3RyaW5nIGV4dCkgewotCQkKLQkJU3RyaW5nIGV4aXN0aW5nRWxlbWVudE5hbWUgPSBudWxsOwotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlpZiAobmFtZVByZWZpeCAhPSBudWxsKSB7Ci0JCQlidWZmZXIuYXBwZW5kKG5hbWVQcmVmaXgpOwotCQl9Ci0JCQotCQlpZiAodmlldy5nZXRQcmVzZW50YXRpb25OYW1lKCkgPT0gIiIpCi0JCQlyZXR1cm4gIjAiICsgZXh0OyAvLyROT04tTkxTLTEkCi0JCQotCQlpZiAoIWdNYXAuaXNFbXB0eSgpKSB7Ci0JCQlleGlzdGluZ0VsZW1lbnROYW1lID0gIChTdHJpbmcpIGdNYXAuZ2V0KHZpZXcuZ2V0VW5pcXVlSWQoKSk7Ci0JCX0KLQkJLy8gQnJvd3Npbmc6IEJyb3dzaW5nIENQIHdpdGggc3BlY2lhbCBjaGFycyBmYWlsZWQgd2l0aAotCQkvLyBibGFuayBwYWdlcyBhbmQgU2NyaXB0IEVycm9yIG5lZWQgdG8gbWFrZSBhIHZhbGlkIGZpbGUgbmFtZQotCQlidWZmZXIuYXBwZW5kKChleGlzdGluZ0VsZW1lbnROYW1lICE9IG51bGwpID8gZXhpc3RpbmdFbGVtZW50TmFtZSA6IFN0clV0aWwucmVtb3ZlU3BlY2lhbENoYXJhY3RlcnModmlldy5nZXRQcmVzZW50YXRpb25OYW1lKCkpKTsKLQkJaWYgKG5hbWVTdWZmaXggIT0gbnVsbCkgewotCQkJYnVmZmVyLmFwcGVuZChuYW1lU3VmZml4KTsKLQkJfQotCi0JCWlmIChleHQgIT0gbnVsbCkgewotCQkJaWYgKGV4dC5pbmRleE9mKCIuIikgPCAwKSAvLyROT04tTkxTLTEkCi0JCQl7Ci0JCQkJZXh0ID0gIi4iICsgZXh0OyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlidWZmZXIuYXBwZW5kKGV4dCk7Ci0JCX0KLQotCQlFbGVtZW50RmlsZSBhID0gbmV3IEVsZW1lbnRGaWxlKHZpZXcuZ2V0VW5pcXVlSWQoKSwgYnVmZmVyLnRvU3RyaW5nKCkpOwotCQkKLQkJaWYgKGEgIT0gbnVsbCAmJiBhU2V0LmFkZChhKSkgewotCQkJaW50IGV4dERvdCA9IGEuZ2V0RmlsZU5hbWUoKS5sYXN0SW5kZXhPZigiLiIpOwotCQkJYU1hcC5wdXQoKGV4dERvdCA8IDApID8gYS5nZXRGaWxlTmFtZSgpIDogYS5nZXRGaWxlTmFtZSgpLnN1YnN0cmluZygwLCBleHREb3QpLCB2aWV3LmdldFVuaXF1ZUlkKCkpOwkJCSAKLQkJCWdNYXAucHV0KHZpZXcuZ2V0VW5pcXVlSWQoKSwgKGV4dERvdCA8IDApID8gYS5nZXRGaWxlTmFtZSgpIDogYS5nZXRGaWxlTmFtZSgpLnN1YnN0cmluZygwLCBleHREb3QpKTsKLQkJfQotCi0JCXJldHVybiBhLmdldEZpbGVOYW1lKCk7IAotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9zZXJ2aWNlcy9TYWZlVXBkYXRlQ29udHJvbGxlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3NlcnZpY2VzL1NhZmVVcGRhdGVDb250cm9sbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViOTUwNDQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3NlcnZpY2VzL1NhZmVVcGRhdGVDb250cm9sbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5zZXJ2aWNlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLQotLyoqCi0gKiBhIHV0aWxpdHkgY2xhc3MgdG8gYWxsb3cgVUkgdXBkYXRlIHdpdGggdGhlIHZhbGlkIFVJIHRocmVhZC4KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBTYWZlVXBkYXRlQ29udHJvbGxlciB7Ci0KLQkvKioKLQkgKiBzeW5jIGV4ZWN1dGUgdGhlIHJ1bm5hYmxlIHdpdGggdGhlIHZhbGlkIFVJIHRocmVhZC4KLQkgKiBAcGFyYW0gcnVubmFibGUgUnVubmFibGUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc3luY0V4ZWMoUnVubmFibGUgcnVubmFibGUpIHsKLQkJdHJ5IHsKLQkJCS8vIHNpbmNlIHRoaXMgd2lsbCBjYXVzZSBVSSB1cGRhdGUsIHdoaWNoIG11c3QgYmUgZXhlY3V0ZWQgaW4gdGhlIFVJCi0JCQkvLyB0aHJlYWQKLQkJCS8vIG90aGVyd2lzZSwgd2lsbCBjYXVzZSBJbnZhbGlkIFRocmVhZCBBY2Nlc3MgZXhjZXB0aW9uCi0JCQlEaXNwbGF5IGRpc3BsYXkgPSBEaXNwbGF5LmdldEN1cnJlbnQoKTsKLQkJCWlmIChkaXNwbGF5ID09IG51bGwpIHsKLQkJCQlkaXNwbGF5ID0gRGlzcGxheS5nZXREZWZhdWx0KCk7Ci0JCQl9Ci0JCQlpZiAoZGlzcGxheSA9PSBudWxsKSB7Ci0JCQkJcnVubmFibGUucnVuKCk7Ci0JCQl9IGVsc2UgewotCQkJCWRpc3BsYXkuc3luY0V4ZWMocnVubmFibGUpOwotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCUxpYnJhcnlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGV4KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIGFzeW5jIGV4ZWN1dGUgdGhlIHJ1bm5hYmxlIHdpdGggdGhlIHZhbGlkIFVJIHRocmVhZC4KLQkgKiBAcGFyYW0gcnVubmFibGUgUnVubmFibGUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgYXN5bmNFeGVjKFJ1bm5hYmxlIHJ1bm5hYmxlKSB7Ci0JCXRyeSB7Ci0JCQkvLyBzaW5jZSB0aGlzIHdpbGwgY2F1c2UgVUkgdXBkYXRlLCB3aGljaCBtdXN0IGJlIGV4ZWN1dGVkIGluIHRoZSBVSQotCQkJLy8gdGhyZWFkCi0JCQkvLyBvdGhlcndpc2UsIHdpbGwgY2F1c2UgSW52YWxpZCBUaHJlYWQgQWNjZXNzIGV4Y2VwdGlvbgotCQkJRGlzcGxheSBkaXNwbGF5ID0gRGlzcGxheS5nZXRDdXJyZW50KCk7Ci0JCQlpZiAoZGlzcGxheSA9PSBudWxsKSB7Ci0JCQkJZGlzcGxheSA9IERpc3BsYXkuZ2V0RGVmYXVsdCgpOwotCQkJfQotCQkJaWYgKGRpc3BsYXkgPT0gbnVsbCkgewotCQkJCXJ1bm5hYmxlLnJ1bigpOwotCQkJfSBlbHNlIHsKLQkJCQlkaXNwbGF5LmFzeW5jRXhlYyhydW5uYWJsZSk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZXgpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvc2VydmljZXMvcGFja2FnZS5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3NlcnZpY2VzL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTU5NGI2Ny4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvc2VydmljZXMvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgaW1wbGVtZW50YXRpb24gc3VwcG9ydCBmb3IgdGhlIGxpYnJhcnkgc2VydmljZS4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdXRpbC9Db250ZW50UmVzb3VyY2VTY2FubmVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdXRpbC9Db250ZW50UmVzb3VyY2VTY2FubmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlMjI5MTEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3V0aWwvQ29udGVudFJlc291cmNlU2Nhbm5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzE2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWw7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLnJlZ2V4Lk1hdGNoZXI7Ci1pbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuRmlsZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LklDb250ZW50VmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpYmFibGVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlNlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi1pbXBvcnQgY29tLmlibS5pY3UudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLS8qKgotICogdXRpbGl0eSBjbGFzcyB0byBzY2FuIGNvbnRlbnQgYW5kIGNvcHkgcmVzb3VyY2VzIHRvIHRoZSB0YXJnZXQgbG9jYXRpb24gZm9yIGJyb3dzaW5nIGFuZCBwdWJsaXNoaW5nCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKgotICovCi1wdWJsaWMgY2xhc3MgQ29udGVudFJlc291cmNlU2Nhbm5lciB7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFBhdHRlcm4gcF9pbWFnZV9yZWYgPSBQYXR0ZXJuCi0JCQkuY29tcGlsZSgKLQkJCQkJIig8KGltZ3xpZnJhbWUpLio/c3JjXFxzKj1cXHMqXCIpKC4qPykoXCIpIiwgUGF0dGVybi5DQVNFX0lOU0VOU0lUSVZFIHwgUGF0dGVybi5ET1RBTEwpOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIEZpbGUgc291cmNlUm9vdFBhdGg7Ci0KLQlwcml2YXRlIEZpbGUgdGFyZ2V0Um9vdFBhdGg7Ci0KLQlwcml2YXRlIFN0cmluZyByb290Q29udGVudFBhdGg7Ci0JCi0JcHJpdmF0ZSBJQ29udGVudFZhbGlkYXRvciB2YWxpZGF0b3I7Ci0KLQlwcml2YXRlIExpc3QgcHJvY2Vzc2VkSXRlbXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkvKioKLQkgKiBjb25zdHJ1Y3QgdGhlIG9iamVjdCB3aXRoIHRoZSByb290IHBhdGggb2YgdGhlIHNvdXJjZSBjb250ZW50Ci0JICogQHBhcmFtIHNvdXJjZVJvb3RQYXRoIEZpbGUKLQkgKi8KLQlwdWJsaWMgQ29udGVudFJlc291cmNlU2Nhbm5lcihGaWxlIHNvdXJjZVJvb3RQYXRoLCBGaWxlIHRhcmdldFJvb3RQYXRoLCBTdHJpbmcgcm9vdENvbnRlbnRQYXRoKSB7Ci0JCXRoaXMoc291cmNlUm9vdFBhdGgsIHRhcmdldFJvb3RQYXRoLCByb290Q29udGVudFBhdGgsIG51bGwpOwotCX0KLQotCS8qKgotCSAqIGNvbnN0cnVjdCB0aGUgb2JqZWN0IGluc3RhbmNlIHdpdGggdGhlIHJvb3QgcGF0aCBvZiB0aGUgc291cmNlIGNvbnRlbnQgYW5kIGEgY29udGVudCB2YWxpZGF0b3IKLQkgKiAKLQkgKiBAcGFyYW0gc291cmNlUm9vdFBhdGggRmlsZQotCSAqIEBwYXJhbSB2YWxpZGF0b3IgSUNvbnRlbnRWYWxpZGF0b3IKLQkgKi8KLQlwdWJsaWMgQ29udGVudFJlc291cmNlU2Nhbm5lcihGaWxlIHNvdXJjZVJvb3RQYXRoLCBGaWxlIHRhcmdldFJvb3RQYXRoLCBTdHJpbmcgcm9vdENvbnRlbnRQYXRoLCAKLQkJCUlDb250ZW50VmFsaWRhdG9yIHZhbGlkYXRvcikgewotCQl0aGlzLnNvdXJjZVJvb3RQYXRoID0gc291cmNlUm9vdFBhdGg7Ci0JCXRoaXMudGFyZ2V0Um9vdFBhdGggPSB0YXJnZXRSb290UGF0aDsKLQkJdGhpcy5yb290Q29udGVudFBhdGggPSByb290Q29udGVudFBhdGg7Ci0JCXRoaXMudmFsaWRhdG9yID0gdmFsaWRhdG9yOwotCX0KLQotCS8qKgotCSAqIHNldCBjb250ZW50IHZhbGlkYXRvcgotCSAqIEBwYXJhbSB2YWxpZGF0b3IgSUNvbnRlbnRWYWxpZGF0b3IKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWYWxpZGF0b3IoSUNvbnRlbnRWYWxpZGF0b3IgdmFsaWRhdG9yKSB7Ci0JCXRoaXMudmFsaWRhdG9yID0gdmFsaWRhdG9yOwotCX0KLQotCS8qKgotCSAqIGdldCB0aGUgc291cmNlIHJvb3QgcGF0aAotCSAqIEByZXR1cm4gRmlsZQotCSAqLwotCXB1YmxpYyBGaWxlIGdldFNvdXJjZVJvb3RQYXRoKCkgewotCQlyZXR1cm4gdGhpcy5zb3VyY2VSb290UGF0aDsKLQl9Ci0JCi0JLyoqCi0JICogZ2V0IHRoZSB0YXJnZXQgcm9vdCBwYXRoCi0JICogQHJldHVybiBGaWxlCi0JICovCi0JcHVibGljIEZpbGUgZ2V0VGFyZ2V0Um9vdFBhdGgoKSB7Ci0JCXJldHVybiB0aGlzLnRhcmdldFJvb3RQYXRoOwotCX0KLQkKLQkvKioKLQkgKiBzZXQgdGhlIHRhcmdldCByb290IHBhdGgKLQkgKiBAcGFyYW0gdGFyZ2V0Um9vdFBhdGggRmlsZQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRhcmdldFJvb3RQYXRoKEZpbGUgdGFyZ2V0Um9vdFBhdGgpIHsKLQkJdGhpcy50YXJnZXRSb290UGF0aCA9IHRhcmdldFJvb3RQYXRoOwotCX0KLQotCS8qKgotCSAqIHJlc29sdmUgdGhlIGltYWdlcyBpbiB0aGUgdGV4dC4gY29weSB0aGUgaW1hZ2UgdG8gZGVzdGluYXRpb24gaWYgbmVlZGVkCi0JICogVGhpcyBpcyB1c2VkIGZvciBjb3B5aW5nIHJlc291cmNlcyBmcm9tIGEgbGlicmFyeSB0byBhbm90aGVyIGRlc3RpbmF0aW9uCi0JICogCi0JICogQHBhcmFtIGNvbnRlbnQKLQkgKiBAcGFyYW0gY29udGVudFBhdGgKLQkgKiAgICAgICAgICAgIHRoZSBjb250ZW50IHBhdGggb2YgdGhlIHNvdXJjZQotCSAqLwotCXB1YmxpYyB2b2lkIHJlc29sdmVSZXNvdXJjZXMoU3RyaW5nIGNvbnRlbnQsIFN0cmluZyBjb250ZW50UGF0aCkgewotCQlyZXNvbHZlUmVzb3VyY2VzKG51bGwsIGNvbnRlbnQsIGNvbnRlbnRQYXRoKTsKLQl9Ci0KLQkvKioKLQkgKiByZXNvbHZlIHRoZSBpbWFnZXMgaW4gdGhlIHRleHQuIGNvcHkgdGhlIGltYWdlIHRvIGRlc3RpbmF0aW9uIGlmIG5lZWRlZAotCSAqIFRoaXMgaXMgdXNlZCBmb3IgY29weWluZyByZXNvdXJjZXMgZnJvbSBhIGxpYnJhcnkgdG8gYW5vdGhlciBkZXN0aW5hdGlvbgotCSAqIAotCSAqIEBwYXJhbSBvd25lciBNZXRob2RFbGVtZW50Ci0JICogQHBhcmFtIGNvbnRlbnQgU3RyaW5nCi0JICogQHBhcmFtIGNvbnRlbnRQYXRoIFN0cmluZwotCSAqICAgICAgICAgICAgdGhlIGNvbnRlbnQgcGF0aCBvZiB0aGUgc291cmNlCi0JICovCi0JcHVibGljIHZvaWQgcmVzb2x2ZVJlc291cmNlcyhNZXRob2RFbGVtZW50IG93bmVyLCBTdHJpbmcgY29udGVudCwKLQkJCVN0cmluZyBjb250ZW50UGF0aCkgewotCQlwcm9jZXNzZWRJdGVtcy5jbGVhcigpOwotCQlSZXNvdXJjZUhlbHBlci5yZXNvbHZlUmVzb3VyY2VzKG93bmVyLCBudWxsLCBjb250ZW50LCBjb250ZW50UGF0aCwKLQkJCQl0aGlzLnNvdXJjZVJvb3RQYXRoLCB0aGlzLnRhcmdldFJvb3RQYXRoLCB0aGlzLnJvb3RDb250ZW50UGF0aCwgcHJvY2Vzc2VkSXRlbXMsCi0JCQkJdmFsaWRhdG9yKTsKLQl9Ci0KLQkvKioKLQkgKiByZXNvbHZlIHRoZSBpbWFnZXMgaW4gdGhlIHRleHQuIGNvcHkgdGhlIGltYWdlIHRvIGRlc3RpbmF0aW9uIGlmIG5lZWRlZAotCSAqIFRoaXMgaXMgdXNlZCBmb3IgbW92aW5nIHJlc291cmNlcyB3aXRoaW4gYSBsaWJyYXJ5IGllLCB3aGVuCi0JICogc291cmNlUm9vdFBhdGguZXF1YWxzKHRhcmdldFJvb3RQYXRoKQotCSAqIAotCSAqIEBwYXJhbSBzb3VyY2UKLQkgKiBAcGFyYW0gY29udGVudFBhdGgKLQkgKiAgICAgICAgICAgIHRoZSBjb250ZW50IHBhdGggb2YgdGhlIHNvdXJjZQotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyByZXNvbHZlUmVzb3VyY2VzUGx1Z2luKFN0cmluZyBjb250ZW50LCBTdHJpbmcgY29udGVudFBhdGgsCi0JCQlTdHJpbmcgb2xkQ29udGVudFBhdGgpIHsKLQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQl0cnkgewotCQkJLy8gcHJvY2VzcyBpbWFnZXMKLQkJCU1hdGNoZXIgbSA9IFJlc291cmNlSGVscGVyLnBfaW1hZ2VfcmVmLm1hdGNoZXIoY29udGVudCk7Ci0JCQl3aGlsZSAobS5maW5kKCkpIHsKLQkJCQlTdHJpbmcgdXJsID0gbS5ncm91cCgzKTsKLQkJCQl1cmwgPSBwcm9jZXNzUmVzb3VyY2VVcmxQbHVnaW4odXJsLCBjb250ZW50UGF0aCwgb2xkQ29udGVudFBhdGgpOwotCQkJCW0uYXBwZW5kUmVwbGFjZW1lbnQoc2IsIG0uZ3JvdXAoMSkgKyB1cmwgKyBtLmdyb3VwKDQpKTsKLQkJCX0KLQkJCW0uYXBwZW5kVGFpbChzYik7Ci0KLQkJCWNvbnRlbnQgPSBzYi50b1N0cmluZygpOwotCQkJc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0KLQkJCS8vIHByb2Nlc3MgYXR0YWNobWVudHMKLQkJCW0gPSBSZXNvdXJjZUhlbHBlci5wX2xpbmtfcmVmX2dlbi5tYXRjaGVyKGNvbnRlbnQpOwotCQkJd2hpbGUgKG0uZmluZCgpKSB7Ci0JCQkJU3RyaW5nQnVmZmVyIHNiTGluayA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCQkvLyBTdHJpbmcgdGFnID0gbS5ncm91cCgxKTsKLQkJCQlTdHJpbmcgdXJsdGV4dCA9ICIgIiArIG0uZ3JvdXAoMikgKyAiICI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCWlmIChSZXNvdXJjZUhlbHBlci5nZXRHdWlkRnJvbVVybCh1cmx0ZXh0KSA9PSBudWxsKSB7Ci0JCQkJCU1hdGNoZXIgbTIgPSBSZXNvdXJjZUhlbHBlci5wX2xpbmtfaHJlZl9waWNrZXIKLQkJCQkJCQkubWF0Y2hlcih1cmx0ZXh0KTsKLQkJCQkJaWYgKG0yLmZpbmQoKSkgewotCQkJCQkJU3RyaW5nIHVybCA9IG0yLmdyb3VwKDEpLnRyaW0oKS5yZXBsYWNlQWxsKCJcIiIsICIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQl1cmwgPSBwcm9jZXNzUmVzb3VyY2VVcmxQbHVnaW4odXJsLCBjb250ZW50UGF0aCwKLQkJCQkJCQkJb2xkQ29udGVudFBhdGgpOwotCQkJCQkJbTIuYXBwZW5kUmVwbGFjZW1lbnQoc2JMaW5rLCB1cmx0ZXh0LnN1YnN0cmluZyhtMgotCQkJCQkJCQkuc3RhcnQoKSwgbTIuc3RhcnQoMSkpCi0JCQkJCQkJCSsgdXJsICsgdXJsdGV4dC5zdWJzdHJpbmcobTIuZW5kKDEpLCBtMi5lbmQoKSkpOwotCQkJCQkJbTIuYXBwZW5kVGFpbChzYkxpbmspOwotCQkJCQkJbS5hcHBlbmRSZXBsYWNlbWVudChzYiwgY29udGVudC5zdWJzdHJpbmcobS5zdGFydCgpLCBtCi0JCQkJCQkJCS5zdGFydCgyKSkKLQkJCQkJCQkJKyBzYkxpbmsudG9TdHJpbmcoKQotCQkJCQkJCQkrIGNvbnRlbnQuc3Vic3RyaW5nKG0uZW5kKDIpLCBtLmVuZCgpKSk7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCX0KLQkJCW0uYXBwZW5kVGFpbChzYik7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJZXgucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogUHJvY2Vzc2VzIGEgcmVzb3VyY2UgdXJsIGZvciBtb3Zpbmcgd2l0aGluIGEgbGlicmFyeQotCSAqIAotCSAqIEBwYXJhbSB1cmwKLQkgKiBAcGFyYW0gY29udGVudFBhdGgKLQkgKiAgICAgICAgICAgIG5ldyBwbHVnaW4gcGF0aAotCSAqIEBwYXJhbSBvbGRDb250ZW50UGF0aAotCSAqICAgICAgICAgICAgb2xkIHBsdWdpbiBwYXRoCi0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBwcm9jZXNzUmVzb3VyY2VVcmxQbHVnaW4oU3RyaW5nIHVybCwgU3RyaW5nIGNvbnRlbnRQYXRoLAotCQkJU3RyaW5nIG9sZENvbnRlbnRQYXRoKSB7Ci0JCVN0cmluZyBpbWFnZUZpbGUgPSBSZXNvdXJjZUhlbHBlci5nZXRGaWxlUGF0aEZyb21VcmwodXJsLAotCQkJCW9sZENvbnRlbnRQYXRoKTsKLQkJaWYgKGltYWdlRmlsZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gdXJsOwotCQl9Ci0JCVN0cmluZyBuZXdVcmwgPSBudWxsOwotCQlGaWxlIHNvdXJjZTsKLQkJRmlsZSBkZXN0OwotCQkvLyB0YXJnZXRSb290UGF0aCBpcyBzZXQgdG8gdGhlIHRhcmdldCBwbHVnaW4gZGlyZWN0b3J5Ci0JCXNvdXJjZSA9IG5ldyBGaWxlKHRoaXMuc291cmNlUm9vdFBhdGguZ2V0UGFyZW50RmlsZSgpLCBpbWFnZUZpbGUpOwotCQlpZiAoaW1hZ2VGaWxlLmluZGV4T2YoRmlsZS5zZXBhcmF0b3IpICE9IC0xKSB7Ci0JCQlTdHJpbmcgb2xkUGx1Z2luID0gaW1hZ2VGaWxlLnN1YnN0cmluZygwLCBpbWFnZUZpbGUKLQkJCQkJLmluZGV4T2YoRmlsZS5zZXBhcmF0b3IpKTsKLQkJCVN0cmluZyBuZXdQbHVnaW4gPSB0aGlzLnRhcmdldFJvb3RQYXRoLmdldE5hbWUoKTsKLQkJCW5ld1VybCA9IHVybC5yZXBsYWNlRmlyc3Qob2xkUGx1Z2luLCBuZXdQbHVnaW4pOwotCQkJaW1hZ2VGaWxlID0gaW1hZ2VGaWxlLnN1YnN0cmluZyhpbWFnZUZpbGUuaW5kZXhPZihGaWxlLnNlcGFyYXRvcikpOwotCQl9Ci0JCWRlc3QgPSBuZXcgRmlsZSh0aGlzLnRhcmdldFJvb3RQYXRoLCBpbWFnZUZpbGUpOwotCi0JCUZpbGVVdGlsLmNvcHlGaWxlKHNvdXJjZSwgZGVzdCk7Ci0KLQkJcmV0dXJuIG5ld1VybDsKLQl9Ci0KLQkKLQkvKioKLQkgKiBjb3B5IGFsbCByZXNvdXJjZXMgcmVmZXJlbmNlZCBieSB0aGUgdGhlIGVsZW1lbnQgYW5kIGFsbCBpdHMgY29udGFpbmVkIGVsZW1lbnRzLCByZWN1cnNpdmVseQotCSAqIEBwYXJhbSBlbGVtZW50IEVPYmplY3QKLQkgKi8KLQlwdWJsaWMgdm9pZCBjb3B5UmVzb3VyY2VzKEVPYmplY3QgZWxlbWVudCkgewotCQkKLQkJaWYgKCBlbGVtZW50ID09IG51bGwgKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCWlmICggZWxlbWVudCBpbnN0YW5jZW9mIERlc2NyaWJhYmxlRWxlbWVudCApIHsKLQkJCURlc2NyaWJhYmxlRWxlbWVudCBkZSA9IChEZXNjcmliYWJsZUVsZW1lbnQpZWxlbWVudDsKLQkJCVN0cmluZyBlbGVtZW50UGF0aCA9IFJlc291cmNlSGVscGVyLmdldEVsZW1lbnRQYXRoKGRlKTsKLQkJCQotCQkJLy8xLiBpY29ucwotCQkJamF2YS5uZXQuVVJJIGljb24gPSBkZS5nZXRTaGFwZWljb24oKTsKLQkJCWlmICggaWNvbiAhPSBudWxsICkgewotCQkJCVN0cmluZyBwYXRoID0gaWNvbi5nZXRQYXRoKCk7Ci0JCQkJRmlsZVV0aWwuY29weUZpbGUoCi0JCQkJCQluZXcgRmlsZShnZXRTb3VyY2VSb290UGF0aCgpLCBwYXRoKSwgCi0JCQkJCQluZXcgRmlsZShnZXRUYXJnZXRSb290UGF0aCgpLCBwYXRoKSk7Ci0JCQl9Ci0JCQkKLQkJCWljb24gPSBkZS5nZXROb2RlaWNvbigpOwotCQkJaWYgKCBpY29uICE9IG51bGwgKSB7Ci0JCQkJU3RyaW5nIHBhdGggPSBpY29uLmdldFBhdGgoKTsKLQkJCQlGaWxlVXRpbC5jb3B5RmlsZSgKLQkJCQkJCW5ldyBGaWxlKGdldFNvdXJjZVJvb3RQYXRoKCksIHBhdGgpLCAKLQkJCQkJCW5ldyBGaWxlKGdldFRhcmdldFJvb3RQYXRoKCksIHBhdGgpKTsKLQkJCX0KLQkJCQotCQkJLy8gMi4gYXR0YWNobWVudHMKLQkJCi0JCQkKLQkJCS8vIDMuIGNvbnRlbnRzCi0JCQlDb250ZW50RGVzY3JpcHRpb24gZGVzYyA9IGRlLmdldFByZXNlbnRhdGlvbigpOwotCQkJaWYgKCBkZXNjLmVDb250YWluZXIoKSAhPSBudWxsICkgewotCQkJCUxpc3QgZmVhdHVyZXMgPSBMaWJyYXJ5VXRpbC5nZXRTdHJ1Y3R1cmFsRmVhdHVyZXMoZGVzYyk7Ci0vLwkJCQlMaXN0IHByb3BlcnRpZXMgPSBkZXNjLmdldEluc3RhbmNlUHJvcGVydGllcygpOwotCQkJCQkJCQkKLQkJCQkvLyBnZXQgYWxsIHN0cmluZyB0eXBlIGF0dHJpYnV0ZXMKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGZlYXR1cmVzLnNpemUoKTsgaSsrKSB7Ci0JCQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgZmVhdHVyZXMKLQkJCQkJCQkuZ2V0KGkpOwotCQkJCQlpZiAoICEoZmVhdHVyZSBpbnN0YW5jZW9mIEVBdHRyaWJ1dGUpICkgewotCQkJCQkJY29udGludWU7Ci0JCQkJCX0KLQkJCQkJCi0JCQkJCU9iamVjdCB2YWx1ZSA9IGRlc2MuZUdldChmZWF0dXJlKTsKLQkJCQkJaWYgKCB2YWx1ZSA9PSBudWxsICkgewotCQkJCQkJY29udGludWU7Ci0JCQkJCX0KLQkJCQkJCi0JCQkJCQotCQkJCQlpZiAoZmVhdHVyZSA9PSBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb250ZW50RGVzY3JpcHRpb25fU2VjdGlvbnMoKSApIHsKLQkJCQkJCUxpc3Qgc2VjdGlvbnMgPSAoTGlzdCl2YWx1ZTsKLQkJCQkJCWZvciAoSXRlcmF0b3IgaXQgPSBzZWN0aW9ucy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7ICkgewotCQkJCQkJCVN0cmluZyB0ZXh0ID0gKChTZWN0aW9uKWl0Lm5leHQoKSkuZ2V0U2VjdGlvbkRlc2NyaXB0aW9uKCk7Ci0JCQkJCQkJcmVzb2x2ZVJlc291cmNlcyhkZSwgdGV4dCwgZWxlbWVudFBhdGgpOwotCQkJCQkJfQotCQkJCQl9ICBlbHNlIGlmIChmZWF0dXJlID09IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEd1aWRhbmNlRGVzY3JpcHRpb25fQXR0YWNobWVudHMoKSApIHsKLQkJCQkJCVN0cmluZyB1cmxzID0gdmFsdWUudG9TdHJpbmcoKS50cmltKCk7Ci0JCQkJCQlpZiAodXJscy5sZW5ndGgoKSAhPSAwICkgewotCQkJCQkJCVN0cmluZ1Rva2VuaXplciBzdCA9IG5ldyBTdHJpbmdUb2tlbml6ZXIodXJscywgInwiKTsgLy8gdGhpcyBpcyBoYXJkY29kZWQgc29tZWhvdyAvLyROT04tTkxTLTEkCi0JCQkJCQkJd2hpbGUgKHN0Lmhhc01vcmVUb2tlbnMoKSApIHsKLQkJCQkJCQkJU3RyaW5nIHVybCA9IHN0Lm5leHRUb2tlbigpOwotCQkJCQkJCQlGaWxlVXRpbC5jb3B5RmlsZSgKLQkJCQkJCQkJCQluZXcgRmlsZShnZXRTb3VyY2VSb290UGF0aCgpLCBlbGVtZW50UGF0aCArIHVybCksIAotCQkJCQkJCQkJCW5ldyBGaWxlKGdldFRhcmdldFJvb3RQYXRoKCksIGVsZW1lbnRQYXRoICsgdXJsKSk7Ci0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0gZWxzZSBpZiAoIHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nICkgewotCQkJCQkJcmVzb2x2ZVJlc291cmNlcyhkZSwgdmFsdWUudG9TdHJpbmcoKSwgZWxlbWVudFBhdGgpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJLy8gZG8gbm90aGluZwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3V0aWwvQ29udmVydEFjdGl2aXR5VHlwZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3V0aWwvQ29udmVydEFjdGl2aXR5VHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMTAyNGZhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91dGlsL0NvbnZlcnRBY3Rpdml0eVR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotCi0vKioKLSAqIGNsYXNzIHRvIGNvbnZlcnQgYWN0aXZpdHkgdHlwZXMKLSAqIAotICogQGF1dGhvciBKZWZmIEhhcmR5Ci0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMAotICoKLSAqLwotcHVibGljIGNsYXNzIENvbnZlcnRBY3Rpdml0eVR5cGUgewotCi0vLwlwcml2YXRlIHN0YXRpYyBBY3Rpdml0eSBvbGRBY3Rpdml0eSA9IG51bGw7Ci0vLwlwcml2YXRlIHN0YXRpYyBBY3Rpdml0eSBuZXdBY3Rpdml0eSA9IG51bGw7Ci0vLwkKLS8vCS8vIG9yaWdpbmFsIGFjdGl2aXR5J3MgY29udGFpbmVyCi0vLwlwcml2YXRlIHN0YXRpYyBQcm9jZXNzUGFja2FnZSBvbGRBY3Rpdml0eUNvbnRhaW5lciA9IG51bGw7Ci0vLwkKLS8vCS8vIHRoZSBvcmlnaW5hbCBhY3Rpdml0eSdzIGJyZWFrZG93biBsaXN0Ci0vLwlwcml2YXRlIHN0YXRpYyBMaXN0IG9sZEFjdGl2aXR5QnJlYWtkb3duID0gbnVsbDsKLS8vCQotLy8JLy8gaW5kZXggb2YgdGhlIG9yaWdpbmFsIGFjdGl2aXR5IGluIGl0J3Mgc3VwZXJBY3Rpdml0eSdzIGJyZWFrZG93biBsaXN0Ci0vLwlwcml2YXRlIHN0YXRpYyBpbnQgb2xkQWN0aXZpdHlCcmVha2Rvd25JbmRleCA9IC0xOwotLy8JCi0vLwkvLyBvcmlnaW5hbCBBY3Rpdml0eSdzIHBhcmVudCBhY3Rpdml0eQotLy8JcHJpdmF0ZSBzdGF0aWMgQWN0aXZpdHkgc3VwZXJBY3QgPSBudWxsOwotLy8JCi0vLwkvLyBwYXJlbnQgYWN0aXZpdHkncyBicmVha2Rvd24gbGlzdAotLy8JcHJpdmF0ZSBzdGF0aWMgRUxpc3Qgc3VwZXJBY3RicmVha2Rvd25MaXN0ID0gbnVsbDsKLS8vCQotLy8JLy8gb3JpZ2luYWwgQWN0aXZpdHkncyB2YXJpYWJpbGl0eVR5cGUKLS8vCXByaXZhdGUgc3RhdGljIFZhcmlhYmlsaXR5VHlwZSBvbGRBY3RWYXJUeXBlID0gbnVsbDsKLS8vCQotLy8JLy8gb3JpZ2luYWwgQWN0aXZpdHkncyB2YXJpYWJpbGl0eUVsZW1lbnQKLS8vCXByaXZhdGUgc3RhdGljIFZhcmlhYmlsaXR5RWxlbWVudCBvbGRBY3RWYXJFbGVtZW50ID0gbnVsbDsKLS8vCQotLy8JLy8gb3JpZ2luYWwgQWN0aXZpdHkncyBpbW1lZGl0YXRlVmFyaWV0aWVzCi0vLwlwcml2YXRlIHN0YXRpYyBMaXN0IG9sZEFjdEltbWVkaWF0ZVZhcmlldGllc0xpc3QgPSBudWxsOwotCi0JcHVibGljIHN0YXRpYyBpbnRbXSBjb21wYXRpYmxlQWN0aXZpdGllcyA9IHsgVW1hUGFja2FnZS5BQ1RJVklUWSwKLQkJCVVtYVBhY2thZ2UuSVRFUkFUSU9OLAotCQkJVW1hUGFja2FnZS5QSEFTRSwKLQkJCVVtYVBhY2thZ2UuQ0FQQUJJTElUWV9QQVRURVJOLAotCQkJVW1hUGFja2FnZS5ERUxJVkVSWV9QUk9DRVNTLAotCX07Ci0KLQlwdWJsaWMgc3RhdGljIExpc3QgY29tcGF0aWJsZUFjdGl2aXRpZXNMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCXN0YXRpYyB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY29tcGF0aWJsZUFjdGl2aXRpZXMubGVuZ3RoOyBpKyspCi0JCQljb21wYXRpYmxlQWN0aXZpdGllc0xpc3QuYWRkKG5ldyBJbnRlZ2VyKGNvbXBhdGlibGVBY3Rpdml0aWVzW2ldKSk7Ci0JfQotCi0JLy8gVGhpcyBtZXRob2QgaXMgYnVnZ3kgYW5kIGlzIHJlcGxhY2VkIHdpdGggVHlwZUNvbnZlcnRlci5jb252ZXJ0QWN0aXZpdHkoKQotCS8vCi0vLwlwdWJsaWMgc3RhdGljIEFjdGl2aXR5IGNvbnZlcnRBY3Rpdml0eShBY3Rpdml0eSBvbGRBY3Rpdml0eSwgaW50IG5ld1R5cGUsCi0vLwkJCURlbGV0ZU1ldGhvZEVsZW1lbnRDb21tYW5kIGNvbW1hbmQpIHsKLS8vCi0vLwkJCi0vLwkJQ29udmVydEFjdGl2aXR5VHlwZS5vbGRBY3Rpdml0eSA9IG9sZEFjdGl2aXR5OwotLy8JCQotLy8JCS8vIGFjdGl2aXR5IGlzIGFscmVhZHkgdGhpcyB0eXBlCi0vLwkJaWYgKG5ld1R5cGUgPT0gb2xkQWN0aXZpdHkuZUNsYXNzKCkuZ2V0Q2xhc3NpZmllcklEKCkpIHsKLS8vCQkJcmV0dXJuIG51bGw7Ci0vLwkJfQotLy8JCQotLy8JCS8vIG5ld1R5cGUgaXMgbm90IHZhbGlkCi0vLwkJaWYgKCFjb21wYXRpYmxlQWN0aXZpdGllc0xpc3QuY29udGFpbnMobmV3IEludGVnZXIobmV3VHlwZSkpKSB7Ci0vLwkJCXJldHVybiBudWxsOwotLy8JCX0KLS8vCQkKLS8vCQlBY3Rpdml0eSBuZXdBY3Rpdml0eSA9IGRvQ29udmVydChuZXdUeXBlLCBjb21tYW5kKTsKLS8vCi0vLwkJcmV0dXJuIG5ld0FjdGl2aXR5OwotLy8JfQotLy8KLS8vCXByaXZhdGUgc3RhdGljIEFjdGl2aXR5IGRvQ29udmVydChpbnQgbmV3VHlwZSwgRGVsZXRlTWV0aG9kRWxlbWVudENvbW1hbmQgY29tbWFuZCkgewotLy8JCQotLy8JCXRyeSB7Ci0vLwkJCUZpbGUgb2xkQWN0aXZpdHlQYXRoRmlsZSA9IG5ldyBGaWxlKExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLS8vCQkJCQkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnlQYXRoKCksIE1ldGhvZExpYnJhcnlQZXJzaXN0ZXIKLS8vCQkJCQkuZ2V0RWxlbWVudFBhdGgob2xkQWN0aXZpdHkpKTsKLS8vCi0vLwkJCS8vIGNyZWF0ZSBuZXcgYWN0aXZpdHkKLS8vCQkJbmV3QWN0aXZpdHkgPSBjcmVhdGVOZXdBY3Rpdml0eShuZXdUeXBlKTsKLS8vCi0vLwkJCS8vIFRPRE86IHN0b3JlIG9sZEFjdGl2aXR5J3MgZmVhdHVyZXMgaGVyZSwgYW5kIGRvbid0IHNldCB0aGVtIHVudGlsCi0vLwkJCS8vIGFmdGVyIG9sZGFjdGl2aXR5IGlzIGRlbGV0ZWQKLS8vCQkJCi0vLwkJCS8vIHN0b3JlIG9sZEFjdGl2aXR5J3MgYnJlYWtkb3duIGxpc3QKLS8vCQkJb2xkQWN0aXZpdHlCcmVha2Rvd24gPSBuZXcgQXJyYXlMaXN0KCk7Ci0vLwkJCWZvciAoSXRlcmF0b3IgaXRlciA9IG9sZEFjdGl2aXR5LmdldEJyZWFrZG93bkVsZW1lbnRzKCkuaXRlcmF0b3IoKTtpdGVyLmhhc05leHQoKTspIHsKLS8vCQkJCW9sZEFjdGl2aXR5QnJlYWtkb3duLmFkZChpdGVyLm5leHQoKSk7Ci0vLwkJCX0KLS8vCQkJb2xkQWN0aXZpdHlCcmVha2Rvd25JbmRleCA9IGdldEluZGV4SW5CcmVha2Rvd24ob2xkQWN0aXZpdHkpOwotLy8JCQkKLS8vCQkJLy8gY29weSBhbGwgZGF0YSBmcm9tIG9sZEFjdGl2aXR5IHRvIG5ld0FjdGl2aXR5Ci0vLwkJCUl0ZXJhdG9yIGl0ZXIgPSBvbGRBY3Rpdml0eS5lQ2xhc3MoKS5nZXRFQWxsU3RydWN0dXJhbEZlYXR1cmVzKCkKLS8vCQkJCQkuaXRlcmF0b3IoKTsKLS8vCQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0vLwkJCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IChFU3RydWN0dXJhbEZlYXR1cmUpIGl0ZXIubmV4dCgpOwotLy8JCQkJT2JqZWN0IG8gPSBvbGRBY3Rpdml0eS5lR2V0KGZlYXR1cmUpOwotLy8JCQkJaWYgKGZlYXR1cmUuZ2V0RmVhdHVyZUlEKCkgIT0gVW1hUGFja2FnZS5ERVNDUklCQUJMRV9FTEVNRU5UX19QUkVTRU5UQVRJT04KLS8vCQkJCQkJJiYgZmVhdHVyZS5nZXRGZWF0dXJlSUQoKSAhPSBVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19HVUlECi0vLwkJCQkJCSYmIGZlYXR1cmUuZ2V0RmVhdHVyZUlEKCkgIT0gVW1hUGFja2FnZS5BQ1RJVklUWV9fQlJFQUtET1dOX0VMRU1FTlRTCi0vLwkJCQkJCSYmIGZlYXR1cmUuZ2V0RmVhdHVyZUlEKCkgIT0gVW1hUGFja2FnZS5BQ1RJVklUWV9fU1VQRVJfQUNUSVZJVElFUyAKLS8vCQkJCQkJJiYgZmVhdHVyZS5nZXRGZWF0dXJlSUQoKSAhPSBVbWFQYWNrYWdlLlBST0NFU1NfX0lOQ0xVREVTX1BBVFRFUk5TCi0vLwkJCQkJCSYmIGZlYXR1cmUuZ2V0RmVhdHVyZUlEKCkgIT0gVW1hUGFja2FnZS5QUk9DRVNTX19WQUxJRF9DT05URVhUCi0vLwkJCQkJCSYmIGZlYXR1cmUuZ2V0RmVhdHVyZUlEKCkgIT0gVW1hUGFja2FnZS5QUk9DRVNTX19ERUZBVUxUX0NPTlRFWFQKLS8vCQkJCQkJJiYgZmVhdHVyZS5nZXRGZWF0dXJlSUQoKSAhPSBVbWFQYWNrYWdlLkRFTElWRVJZX1BST0NFU1NfX0NPTU1VTklDQVRJT05TX01BVEVSSUFMUwotLy8JCQkJCQkmJiBmZWF0dXJlLmdldEZlYXR1cmVJRCgpICE9IFVtYVBhY2thZ2UuREVMSVZFUllfUFJPQ0VTU19fRURVQ0FUSU9OX01BVEVSSUFMUwotLy8JCQkJCQkpIHsKLS8vCQkJCQluZXdBY3Rpdml0eS5lU2V0KGZlYXR1cmUsIG8pOwotLy8JCQkJfQotLy8JCQl9Ci0vLwotLy8JCQkvLyBzdG9yZSBHdWlkIGhlcmUKLS8vCQkJU3RyaW5nIG9sZEFjdGl2aXR5R3VpZCA9IG9sZEFjdGl2aXR5LmdldEd1aWQoKTsKLS8vCi0vLwkJCS8vIHN0b3JlIG9sZCBhY3Rpdml0eSdzIGVDb250YWluZXIKLS8vCQkJb2xkQWN0aXZpdHlDb250YWluZXIgPSAoUHJvY2Vzc1BhY2thZ2UpIG9sZEFjdGl2aXR5Ci0vLwkJCQkJLmVDb250YWluZXIoKTsKLS8vCi0vLwkJCS8vIHNldCBjb250YWluZXIKLS8vCQkJb2xkQWN0aXZpdHlDb250YWluZXIuZ2V0UHJvY2Vzc0VsZW1lbnRzKCkucmVtb3ZlKG9sZEFjdGl2aXR5KTsKLS8vCQkJb2xkQWN0aXZpdHlDb250YWluZXIuZ2V0UHJvY2Vzc0VsZW1lbnRzKCkuYWRkKG5ld0FjdGl2aXR5KTsKLS8vCi0vLwkJCS8vIGNyZWF0ZSBwcmVzZW50YXRpb24KLS8vCQkJQ29udGVudERlc2NyaXB0aW9uIG5ld0NvbnRlbnREZXNjID0gQ29udGVudERlc2NyaXB0aW9uRmFjdG9yeQotLy8JCQkJCS5jcmVhdGVDb250ZW50RGVzY3JpcHRpb24obmV3QWN0aXZpdHkpOwotLy8JCQluZXdBY3Rpdml0eS5zZXRQcmVzZW50YXRpb24obmV3Q29udGVudERlc2MpOwotLy8KLS8vCQkJRmlsZSBuZXdBY3Rpdml0eVBhdGhGaWxlID0gbmV3IEZpbGUoTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKQotLy8JCQkJCS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeVBhdGgoKSwgTWV0aG9kTGlicmFyeVBlcnNpc3RlcgotLy8JCQkJCS5nZXRFbGVtZW50UGF0aChuZXdBY3Rpdml0eSkpOwotLy8JCQlDb250ZW50UmVzb3VyY2VTY2FubmVyIHNjYW5uZXIgPSBuZXcgQ29udGVudFJlc291cmNlU2Nhbm5lcigKLS8vCQkJCQlvbGRBY3Rpdml0eVBhdGhGaWxlKTsKLS8vCQkJc2Nhbm5lci5zZXRUYXJnZXRSb290UGF0aChuZXdBY3Rpdml0eVBhdGhGaWxlKTsKLS8vCi0vLwkJCS8vIGNvcHkgYWxsIHByZXNlbnRhdGlvbiBkYXRhIGZyb20gb2xkQWN0aXZpdHkgdG8gbmV3QWN0aXZpdHkKLS8vCQkJQ29udGVudERlc2NyaXB0aW9uIG9sZENvbnRlbnREZXNjID0gb2xkQWN0aXZpdHkuZ2V0UHJlc2VudGF0aW9uKCk7Ci0vLwkJCWl0ZXIgPSBvbGRDb250ZW50RGVzYy5lQ2xhc3MoKS5nZXRFQWxsQXR0cmlidXRlcygpLml0ZXJhdG9yKCk7Ci0vLwkJCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotLy8JCQkJRUF0dHJpYnV0ZSBhdHRyaWIgPSAoRUF0dHJpYnV0ZSkgaXRlci5uZXh0KCk7Ci0vLwkJCQlpZiAoYXR0cmliLmdldEZlYXR1cmVJRCgpICE9IFVtYVBhY2thZ2UuUFJPQ0VTU19ERVNDUklQVElPTl9fRVhURVJOQUxfSUQKLS8vCQkJCQkJJiYgYXR0cmliLmdldEZlYXR1cmVJRCgpICE9IFVtYVBhY2thZ2UuUFJPQ0VTU19ERVNDUklQVElPTl9fU0NPUEUKLS8vCQkJCQkJJiYgYXR0cmliLmdldEZlYXR1cmVJRCgpICE9IFVtYVBhY2thZ2UuUFJPQ0VTU19ERVNDUklQVElPTl9fVVNBR0VfTk9URVMKLS8vCQkJCQkJJiYgYXR0cmliLmdldEZlYXR1cmVJRCgpICE9IFVtYVBhY2thZ2UuREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fRVNUSU1BVElOR19URUNITklRVUUKLS8vCQkJCQkJJiYgYXR0cmliLmdldEZlYXR1cmVJRCgpICE9IFVtYVBhY2thZ2UuREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fUFJPSkVDVF9DSEFSQUNURVJJU1RJQ1MKLS8vCQkJCQkJJiYgYXR0cmliLmdldEZlYXR1cmVJRCgpICE9IFVtYVBhY2thZ2UuREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fUFJPSkVDVF9NRU1CRVJfRVhQRVJUSVNFCi0vLwkJCQkJCSYmIGF0dHJpYi5nZXRGZWF0dXJlSUQoKSAhPSBVbWFQYWNrYWdlLkRFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1JJU0tfTEVWRUwKLS8vCQkJCQkJJiYgYXR0cmliLmdldEZlYXR1cmVJRCgpICE9IFVtYVBhY2thZ2UuREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fU0NBTEUKLS8vCQkJCQkJJiYgYXR0cmliLmdldEZlYXR1cmVJRCgpICE9IFVtYVBhY2thZ2UuREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fVFlQRV9PRl9DT05UUkFDVAotLy8JCQkJCQkpIHsKLS8vCQkJCQlPYmplY3QgbyA9IG9sZENvbnRlbnREZXNjLmVHZXQoYXR0cmliKTsKLS8vCQkJCQlpZiAobyBpbnN0YW5jZW9mIFN0cmluZyAmJiAoKFN0cmluZykgbykudHJpbSgpLmxlbmd0aCgpID4gMCkgewotLy8JCQkJCQkvLyBwcm9jZXNzIGxpbmtzCi0vLwkJCQkJCXNjYW5uZXIucmVzb2x2ZVJlc291cmNlcyhuZXdBY3Rpdml0eSwgKFN0cmluZykgbywgIiIpOyAvLyROT04tTkxTLTEkCi0vLwkJCQkJCS8vIHNjYW5uZXIucmVzb2x2ZVJlc291cmNlcyhuZXdBY3Rpdml0eSwgKFN0cmluZykgbywKLS8vCQkJCQkJLy8gTWV0aG9kTGlicmFyeVBlcnNpc3Rlci5nZXRFbGVtZW50UGF0aChuZXdBY3Rpdml0eSkpOwotLy8JCQkJCQkvLyAvLyROT04tTkxTLTEkCi0vLwkJCQkJfQotLy8JCQkJCW5ld0NvbnRlbnREZXNjLmVTZXQoYXR0cmliLCBvKTsKLS8vCQkJCX0KLS8vCQkJfQotLy8JCQkKLS8vCQkJLy8gbWFrZSBicmVha2Rvd24gbGlua3MKLS8vCQkJTGlzdCBvbGRBY3RCcmVha2Rvd25MaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotLy8JCQlvbGRBY3RCcmVha2Rvd25MaXN0LmFkZEFsbChvbGRBY3Rpdml0eS5nZXRCcmVha2Rvd25FbGVtZW50cygpKTsKLS8vCQkJZm9yIChpdGVyID0gb2xkQWN0QnJlYWtkb3duTGlzdC5pdGVyYXRvcigpO2l0ZXIuaGFzTmV4dCgpOykgewotLy8JCQkJQnJlYWtkb3duRWxlbWVudCBiZSA9IChCcmVha2Rvd25FbGVtZW50KWl0ZXIubmV4dCgpOwotLy8JCQkJYmUuc2V0U3VwZXJBY3Rpdml0aWVzKG51bGwpOwotLy8JCQl9Ci0vLwkJCQotLy8JCQlvbGRBY3Rpdml0eS5nZXRCcmVha2Rvd25FbGVtZW50cygpLmNsZWFyKCk7Ci0vLwkJCW5ld0FjdGl2aXR5LmdldEJyZWFrZG93bkVsZW1lbnRzKCkuYWRkQWxsKG9sZEFjdGl2aXR5QnJlYWtkb3duKTsKLS8vCQkJLy8gbW92ZSBuZXcgYWN0aXZpdHkgdG8gcHJvcGVyIGluZGV4IGluIHRoZSBwYXJlbnQgYWN0J3MgYnJlYWtkb3duIGxpc3QKLS8vCQkJc3VwZXJBY3QgPSBVbWFVdGlsLmdldFBhcmVudEFjdGl2aXR5KG9sZEFjdGl2aXR5KTsKLS8vCQkJc3VwZXJBY3RicmVha2Rvd25MaXN0ID0gKEVMaXN0KXN1cGVyQWN0LmdldEJyZWFrZG93bkVsZW1lbnRzKCk7Ci0vLwkJCXN1cGVyQWN0YnJlYWtkb3duTGlzdC5hZGQob2xkQWN0aXZpdHlCcmVha2Rvd25JbmRleCwgbmV3QWN0aXZpdHkpOwotLy8JCQkKLS8vCQkJLy8gaGFuZGxlIHZhcmlhYmlsaXR5Ci0vLwkJCW9sZEFjdFZhckVsZW1lbnQgPSBvbGRBY3Rpdml0eS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCk7Ci0vLwkJCW9sZEFjdFZhclR5cGUgPSBvbGRBY3Rpdml0eS5nZXRWYXJpYWJpbGl0eVR5cGUoKTsKLS8vCQkJb2xkQWN0SW1tZWRpYXRlVmFyaWV0aWVzTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLS8vCQkJb2xkQWN0SW1tZWRpYXRlVmFyaWV0aWVzTGlzdC5hZGRBbGwoQXNzb2NpYXRpb25IZWxwZXIuZ2V0SW1tZWRpYXRlVmFyaWV0aWVzKG9sZEFjdGl2aXR5KSk7Ci0vLwkJCQotLy8JCQlpZiAob2xkQWN0VmFyRWxlbWVudCAhPSBudWxsICYmIG9sZEFjdFZhclR5cGUgIT0gbnVsbCkgewotLy8JCQkJbmV3QWN0aXZpdHkuc2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudChvbGRBY3RWYXJFbGVtZW50KTsKLS8vCQkJCW5ld0FjdGl2aXR5LnNldFZhcmlhYmlsaXR5VHlwZShvbGRBY3RWYXJUeXBlKTsKLS8vCQkJfQotLy8JCQkKLS8vCQkJZm9yIChpdGVyID0gb2xkQWN0SW1tZWRpYXRlVmFyaWV0aWVzTGlzdC5pdGVyYXRvcigpO2l0ZXIuaGFzTmV4dCgpOykgewotLy8JCQkJVmFyaWFiaWxpdHlFbGVtZW50IHZlID0gKFZhcmlhYmlsaXR5RWxlbWVudCkgaXRlci5uZXh0KCk7Ci0vLwkJCQl2ZS5zZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KG5ld0FjdGl2aXR5KTsKLS8vCQkJfQotLy8KLS8vCQkJLy8gY3JlYXRlIHRlbXAgUHJvY2Vzc1BhY2thZ2UgYW5kIG1vdmUgb2xkQWN0aXZpdHkgdG8gaXQKLS8vCQkJUHJvY2Vzc1BhY2thZ2UgdGVtcFBhcmVudCA9IFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVByb2Nlc3NQYWNrYWdlKCk7Ci0vLwkJCXRlbXBQYXJlbnQuZ2V0UHJvY2Vzc0VsZW1lbnRzKCkuYWRkKG9sZEFjdGl2aXR5KTsKLS8vCQkJdGVtcFBhcmVudC5zZXROYW1lKCJ0ZW1wIFBQIGZvciBkZWxldGlvbiIpOyAvLyROT04tTkxTLTEkCi0vLwotLy8JCQkvLyBkZWxldGUgb2xkIEFjdGl2aXR5IGhlcmUgLSBpZiBmYWlscywgcm9sbCBiYWNrIGJ5IGRlbGV0aW5nIG5ldyBBY3Rpdml0eQotLy8JCQljb21tYW5kLmV4ZWN1dGUoKTsKLS8vCi0vLwkJCWlmICghY29tbWFuZC5leGVjdXRlZCB8fCBjb21tYW5kLmZhaWxlZCkgewotLy8JCQkJLy8gZGVsZXRlIGZhaWxlZCwgb3IgdXNlciBzZWxlY3RlZCBjYW5jZWwgb24gdGhlICJkZWxldGUKLS8vCQkJCS8vIHJlZmVyZW5jZXMiIGRpYWxvZwotLy8JCQkJLy8gY2xlYW4gdXAgbmV3IEFjdGl2aXR5Ci0vLwotLy8JCQkJdW5kbygpOwotLy8KLS8vCQkJCW5ld0FjdGl2aXR5ID0gbnVsbDsKLS8vCQkJCW5ld0NvbnRlbnREZXNjID0gbnVsbDsKLS8vCQkJCXJldHVybiBudWxsOwotLy8JCQl9Ci0vLwotLy8JCQkvLyBzZXQgbmV3IGFjdGl2aXR5J3MgR1VJRAotLy8JCQluZXdBY3Rpdml0eS5zZXRHdWlkKG9sZEFjdGl2aXR5R3VpZCk7Ci0vLwkJCQotLy8JCQkvLyBUT0RPOiB1cGRhdGUgZWRpdG9yIGNvbnRlbnRzIAotLy8KLS8vCQkJLy8gVE9ETzogb24gcm9sbGJhY2ssIGxpYnJhcnkgbWF5IGJlIGRpcnR5IGJlY2F1c2Ugb2YgdGhlCi0vLwkJCS8vIGNvbnRhaW5lci9jb250ZW50ZGVzYyBjaGFuZ2VzIHdlJ3ZlIGRvbmUKLS8vCQkJLy8gZml4IHRoaXMgYnkgc3RvcmluZyBhbGwgdGhlIG9sZCBhY3Rpdml0eSdzIGluZm8sIHRoZW4gb25seSBjcmVhdGUKLS8vCQkJLy8gbmV3IGFjdGl2aXR5IGFmdGVyIG9sZCBvbmUgaGFzCi0vLwkJCS8vIGJlZW4gZGVsZXRlZC4KLS8vCi0vLwkJCVNldCBtb2RpZmllZFJlc291cmNlU2V0ID0gbmV3IEhhc2hTZXQoKTsKLS8vCQkJCi0vLwkJCS8vIHNhdmUgbmV3IGFjdGl2aXR5IGFuZCBpdHMgcHJlc2VudGF0aW9uCi0vLwkJCUlGaWxlQmFzZWRMaWJyYXJ5UGVyc2lzdGVyLkZhaWxTYWZlTWV0aG9kTGlicmFyeVBlcnNpc3RlciBwZXJzaXN0ZXIgPSBDb250ZW50RGVzY3JpcHRpb25GYWN0b3J5Ci0vLwkJCQkJLmdldE1ldGhvZExpYnJhcnlQZXJzaXN0ZXIoKS5nZXRGYWlsU2FmZVBlcnNpc3RlcigpOwotLy8JCQl0cnkgewotLy8JCQkJaWYgKG5ld0FjdGl2aXR5LmVSZXNvdXJjZSgpICE9IG51bGwpCi0vLwkJCQkJbW9kaWZpZWRSZXNvdXJjZVNldC5hZGQobmV3QWN0aXZpdHkuZVJlc291cmNlKCkpOwotLy8JCQkJaWYgKG5ld0FjdGl2aXR5LmdldFByZXNlbnRhdGlvbigpLmVSZXNvdXJjZSgpICE9IG51bGwpCi0vLwkJCQkJbW9kaWZpZWRSZXNvdXJjZVNldC5hZGQobmV3QWN0aXZpdHkuZ2V0UHJlc2VudGF0aW9uKCkuZVJlc291cmNlKCkpOwotLy8JCQkJaWYgKG9sZEFjdGl2aXR5Q29udGFpbmVyLmVSZXNvdXJjZSgpICE9IG51bGwpCi0vLwkJCQkJbW9kaWZpZWRSZXNvdXJjZVNldC5hZGQob2xkQWN0aXZpdHlDb250YWluZXIuZVJlc291cmNlKCkpOwotLy8JCQkJaWYgKHN1cGVyQWN0LmVSZXNvdXJjZSgpICE9IG51bGwpCi0vLwkJCQkJbW9kaWZpZWRSZXNvdXJjZVNldC5hZGQoc3VwZXJBY3QuZVJlc291cmNlKCkpOwotLy8KLS8vCQkJCWZvciAoaXRlciA9IG1vZGlmaWVkUmVzb3VyY2VTZXQuaXRlcmF0b3IoKTtpdGVyLmhhc05leHQoKTspIHsKLS8vCQkJCQlSZXNvdXJjZSByZXMgPSAoUmVzb3VyY2UpIGl0ZXIubmV4dCgpOwotLy8JCQkJCXBlcnNpc3Rlci5zYXZlKHJlcyk7Ci0vLwkJCQl9Ci0vLwkJCQlwZXJzaXN0ZXIuY29tbWl0KCk7Ci0vLwotLy8JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotLy8JCQkJcGVyc2lzdGVyLnJvbGxiYWNrKCk7Ci0vLwkJCQljb21tYW5kLnVuZG8oKTsKLS8vCQkJCQotLy8JCQkJdW5kbygpOwotLy8JCQkJTGlicmFyeVBsdWdpbgotLy8JCQkJCQkuZ2V0RGVmYXVsdCgpCi0vLwkJCQkJCS5nZXRNc2dEaWFsb2coKQotLy8JCQkJCQkuZGlzcGxheUVycm9yKAotLy8JCQkJCQkJCUxpYnJhcnlSZXNvdXJjZXMuY29udmVydEFjdGl2aXR5RXJyb3JfdGl0bGUsCi0vLwkJCQkJCQkJTkxTLmJpbmQoTGlicmFyeVJlc291cmNlcy5zYXZlQ29udmVydGVkQWN0aXZpdHlFcnJvcl9tc2csIG5ld0FjdGl2aXR5LmdldE5hbWUoKSksIAotLy8JCQkJCQkJCUxpYnJhcnlSZXNvdXJjZXMuZXJyb3JfcmVhc29uLAotLy8JCQkJCQkJCWUpOwotLy8JCQkJbmV3QWN0aXZpdHkgPSBudWxsOwotLy8JCQl9Ci0vLwkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0vLwkJCWV4LnByaW50U3RhY2tUcmFjZSgpOwotLy8JCQljb21tYW5kLnVuZG8oKTsKLS8vCQkJdW5kbygpOwotLy8JCQlMaWJyYXJ5UGx1Z2luCi0vLwkJCQkJLmdldERlZmF1bHQoKQotLy8JCQkJCS5nZXRNc2dEaWFsb2coKQotLy8JCQkJCS5kaXNwbGF5RXJyb3IoCi0vLwkJCQkJCQlMaWJyYXJ5UmVzb3VyY2VzLmNvbnZlcnRBY3Rpdml0eUVycm9yX3RpdGxlLAotLy8JCQkJCQkJTkxTLmJpbmQoTGlicmFyeVJlc291cmNlcy5jb252ZXJ0QWN0aXZpdHlFcnJvcl9tc2csIG5ld0FjdGl2aXR5LmdldE5hbWUoKSksIAotLy8JCQkJCQkJTGlicmFyeVJlc291cmNlcy5lcnJvcl9yZWFzb24sIAotLy8JCQkJCQkJZXgpOwotLy8JCQluZXdBY3Rpdml0eSA9IG51bGw7Ci0vLwkJfQotLy8JCXJldHVybiBuZXdBY3Rpdml0eTsKLS8vCX0KLS8vCi0vLwlwcml2YXRlIHN0YXRpYyBBY3Rpdml0eSBjcmVhdGVOZXdBY3Rpdml0eShpbnQgbmV3VHlwZSkgewotLy8JCXN3aXRjaCAobmV3VHlwZSkgewotLy8JCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFk6Ci0vLwkJCQlyZXR1cm4gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQWN0aXZpdHkoKTsKLS8vCQkJY2FzZSBVbWFQYWNrYWdlLklURVJBVElPTjoKLS8vCQkJCXJldHVybiBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVJdGVyYXRpb24oKTsKLS8vCQkJY2FzZSBVbWFQYWNrYWdlLlBIQVNFOgotLy8JCQkJcmV0dXJuIFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVBoYXNlKCk7Ci0vLwkJCWRlZmF1bHQ6Ci0vLwkJCQlyZXR1cm4gbnVsbDsKLS8vCQl9Ci0vLwl9Ci0vLwkKLS8vCXByaXZhdGUgc3RhdGljIGludCBnZXRJbmRleEluQnJlYWtkb3duKEFjdGl2aXR5IGFjdCkgewotLy8JCWludCBpbmRleCA9IC0xOwotLy8JCUFjdGl2aXR5IHN1cGVyQWN0ID0gVW1hVXRpbC5nZXRQYXJlbnRBY3Rpdml0eShhY3QpOwotLy8JCWlmIChzdXBlckFjdCBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpIHsKLS8vCQkJLy8gZ2V0IHByb2Nlc3MsIGZpbmQgYnJlYWtkb3duCi0vLwkJCWluZGV4ID0gKChQcm9jZXNzQ29tcG9uZW50KXN1cGVyQWN0KS5nZXRQcm9jZXNzKCkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5pbmRleE9mKGFjdCk7Ci0vLwkJfQotLy8JCWVsc2UgewotLy8JCQlpbmRleCA9IHN1cGVyQWN0LmdldEJyZWFrZG93bkVsZW1lbnRzKCkuaW5kZXhPZihhY3QpOwotLy8JCX0KLS8vCQlyZXR1cm4gaW5kZXg7Ci0vLwl9Ci0vLwkKLS8vCXByaXZhdGUgc3RhdGljIHZvaWQgdW5kbygpIHsKLS8vCQkvLyB1bmRvIG1vdmluZyBvZiBvbGRBY3Rpdml0eSB0byB0aGUgZmFrZSBQUAotLy8JCWlmIChvbGRBY3Rpdml0eUNvbnRhaW5lciAhPSBudWxsKSB7Ci0vLwkJCW9sZEFjdGl2aXR5Q29udGFpbmVyLmdldFByb2Nlc3NFbGVtZW50cygpLnJlbW92ZShuZXdBY3Rpdml0eSk7Ci0vLwkJCWlmICghb2xkQWN0aXZpdHlDb250YWluZXIuZ2V0UHJvY2Vzc0VsZW1lbnRzKCkuY29udGFpbnMob2xkQWN0aXZpdHkpKQotLy8JCQkJb2xkQWN0aXZpdHlDb250YWluZXIuZ2V0UHJvY2Vzc0VsZW1lbnRzKCkuYWRkKG9sZEFjdGl2aXR5KTsKLS8vCQl9Ci0vLwkJLy8gdW5kbyB0aGUgYnJlYWtkb3duIGxpbmsgY2hhbmdlcwotLy8JCWlmIChuZXdBY3Rpdml0eSAhPSBudWxsKSB7Ci0vLwkJCW5ld0FjdGl2aXR5LmdldEJyZWFrZG93bkVsZW1lbnRzKCkuY2xlYXIoKTsKLS8vCQl9Ci0vLwkJaWYgKG9sZEFjdGl2aXR5QnJlYWtkb3duICE9IG51bGwgJiYgb2xkQWN0aXZpdHkgIT0gbnVsbCkgewotLy8vLwkJCW9sZEFjdGl2aXR5LmdldEJyZWFrZG93bkVsZW1lbnRzKCkuY2xlYXIoKTsKLS8vCQkJb2xkQWN0aXZpdHkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5hZGRBbGwob2xkQWN0aXZpdHlCcmVha2Rvd24pOwotLy8JCX0KLS8vCQlpZiAoc3VwZXJBY3RicmVha2Rvd25MaXN0ICE9IG51bGwpIHsKLS8vCQkJaWYgKG5ld0FjdGl2aXR5ICE9IG51bGwpIHsKLS8vCQkJCXN1cGVyQWN0YnJlYWtkb3duTGlzdC5yZW1vdmUobmV3QWN0aXZpdHkpOwotLy8JCQl9Ci0vLwkJCWlmIChvbGRBY3Rpdml0eUJyZWFrZG93bkluZGV4ICE9IC0xICYmIG9sZEFjdGl2aXR5ICE9IG51bGwgJiYKLS8vCQkJCQkhc3VwZXJBY3RicmVha2Rvd25MaXN0LmNvbnRhaW5zKG9sZEFjdGl2aXR5KSkKLS8vCQkJCXN1cGVyQWN0YnJlYWtkb3duTGlzdC5hZGQob2xkQWN0aXZpdHlCcmVha2Rvd25JbmRleCwgb2xkQWN0aXZpdHkpOwotLy8JCX0KLS8vCQkKLS8vCQkvLyB2YXJpYWJpbGl0eQotLy8JCWlmIChvbGRBY3RWYXJFbGVtZW50ICE9IG51bGwgJiYgb2xkQWN0VmFyVHlwZSAhPSBudWxsKSB7Ci0vLwkJCW9sZEFjdGl2aXR5LnNldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQob2xkQWN0VmFyRWxlbWVudCk7Ci0vLwkJCW9sZEFjdGl2aXR5LnNldFZhcmlhYmlsaXR5VHlwZShvbGRBY3RWYXJUeXBlKTsKLS8vCQl9Ci0vLwkJCi0vLwkJaWYgKG9sZEFjdEltbWVkaWF0ZVZhcmlldGllc0xpc3QgIT0gbnVsbCkgewotLy8JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBvbGRBY3RJbW1lZGlhdGVWYXJpZXRpZXNMaXN0Lml0ZXJhdG9yKCk7aXRlci5oYXNOZXh0KCk7KSB7Ci0vLwkJCQlWYXJpYWJpbGl0eUVsZW1lbnQgdmUgPSAoVmFyaWFiaWxpdHlFbGVtZW50KSBpdGVyLm5leHQoKTsKLS8vCQkJCXZlLnNldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQob2xkQWN0aXZpdHkpOwotLy8JCQl9Ci0vLwkJfQotLy8KLS8vCi0vLwl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3V0aWwvQ29weUF0dGFjaG1lbnRzVG9OZXdMb2NhdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3V0aWwvQ29weUF0dGFjaG1lbnRzVG9OZXdMb2NhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NzJjNzNjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91dGlsL0NvcHlBdHRhY2htZW50c1RvTmV3TG9jYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEubmV0LlVSSVN5bnRheEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5yZWdleC5NYXRjaGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuRmlsZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5OZXRVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LklMaWJyYXJ5UmVzb3VyY2VNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuTWV0aG9kRWxlbWVudEFkZENvbW1hbmQuQmFzaWNSZXNvdXJjZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LklDb250ZW50VmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpYmFibGVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3VpZGFuY2VEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotLyoqCi0gKiB1dGlsaXR5IGNsYXNzIHRvIGNvcHkgYXR0YWNobWVlbnRzIHRvIGFub3RoZXIgbG9jYXRpb24KLSAqIEBhdXRob3IgSmVmZiBIYXJkeQotICogQHNpY25lIDEuMAotICoKLSAqLwotcHVibGljIGNsYXNzIENvcHlBdHRhY2htZW50c1RvTmV3TG9jYXRpb24gZXh0ZW5kcyBCYXNpY1Jlc291cmNlTWFuYWdlciB7Ci0KLQlwcml2YXRlIENvbGxlY3Rpb24gbW9kaWZpZWRSZXNvdXJjZVNldDsKLQotCXByaXZhdGUgYm9vbGVhbiBkZWJ1ZzsKLQotCXByaXZhdGUgTWFwIGVsZW1lbnRUb09sZFBsdWdpbk1hcDsKLQotCXByaXZhdGUgTWV0aG9kUGx1Z2luIGxhc3RPbGRQbHVnaW4gPSBudWxsOwotCi0JcHVibGljIENvcHlBdHRhY2htZW50c1RvTmV3TG9jYXRpb24oKSB7Ci0JCWRlYnVnID0gTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkuaXNEZWJ1Z2dpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBDb3B5IGF0dGFjaG1lbnRzIHdpdGhpbiBhIGxpYnJhcnksIGZyb20gb25lIHBsdWdpbiB0byBhbm90aGVyCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gY29weVJlZmVyZW5jZWRDb250ZW50cyhDb2xsZWN0aW9uIGVsZW1lbnRzLAotCQkJTWFwIGVsZW1lbnRUb09sZFBsdWdpbk1hcCkgewotCQlsYXN0T2xkUGx1Z2luID0gbnVsbDsKLQkJbW9kaWZpZWRSZXNvdXJjZVNldCA9IG5ldyBIYXNoU2V0KCk7Ci0JCWlmIChlbGVtZW50VG9PbGRQbHVnaW5NYXAgPT0gbnVsbCkgewotCQkJcmV0dXJuIG1vZGlmaWVkUmVzb3VyY2VTZXQ7Ci0JCX0KLQkJdGhpcy5lbGVtZW50VG9PbGRQbHVnaW5NYXAgPSBlbGVtZW50VG9PbGRQbHVnaW5NYXA7Ci0KLQkJSXRlcmF0b3IgaXRlciA9IGVsZW1lbnRzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJT2JqZWN0IG8gPSBpdGVyLm5leHQoKTsKLQkJCWlmIChvIGluc3RhbmNlb2YgUmVzb3VyY2UpIHsKLQkJCQlSZXNvdXJjZSByID0gKFJlc291cmNlKSBvOwotCQkJCUl0ZXJhdG9yIHJlc291cmNlSXRlciA9IHIuZ2V0Q29udGVudHMoKS5pdGVyYXRvcigpOwotCQkJCXdoaWxlIChyZXNvdXJjZUl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQkJCUVPYmplY3QgZSA9IChFT2JqZWN0KSByZXNvdXJjZUl0ZXIubmV4dCgpOwotCQkJCQlIYW5kbGVBdHRhY2htZW50c1BsdWdpbihlKTsKLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKG8gaW5zdGFuY2VvZiBFT2JqZWN0KSB7Ci0JCQkJRU9iamVjdCBlID0gKEVPYmplY3QpIG87Ci0JCQkJSGFuZGxlQXR0YWNobWVudHNQbHVnaW4oZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG1vZGlmaWVkUmVzb3VyY2VTZXQ7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIEhhbmRsZUF0dGFjaG1lbnRzUGx1Z2luKEVPYmplY3QgZSkgewotCQkvLyBoYW5kbGUgc2VsZgotCQlNZXRob2RFbGVtZW50IGVsZW1lbnRUb1Byb2Nlc3MgPSBudWxsOwotCQkvLyBmaW5kIHRoZSBvbGQgcGx1Z2luLCBpZiB0aGVyZSBpcyBvbmUKLQkJaWYgKGVsZW1lbnRUb09sZFBsdWdpbk1hcCAhPSBudWxsCi0JCQkJJiYgKE1ldGhvZFBsdWdpbikgZWxlbWVudFRvT2xkUGx1Z2luTWFwLmdldChlKSAhPSBudWxsKSB7Ci0JCQlsYXN0T2xkUGx1Z2luID0gKE1ldGhvZFBsdWdpbikgZWxlbWVudFRvT2xkUGx1Z2luTWFwLmdldChlKTsKLQkJfQotCi0JCWlmIChsYXN0T2xkUGx1Z2luICE9IG51bGwpIHsKLQkJCWlmIChlIGluc3RhbmNlb2YgRGVzY3JpYmFibGVFbGVtZW50KSB7Ci0JCQkJRGVzY3JpYmFibGVFbGVtZW50IGRlID0gKERlc2NyaWJhYmxlRWxlbWVudCkgZTsKLQotCQkJCS8vIEN1c3RvbSBpY29ucwotCQkJCXRyeSB7Ci0JCQkJCS8vIHNoYXBlIGljb24KLQkJCQkJamF2YS5uZXQuVVJJIHNoYXBlSWNvblVyaSA9IGRlLmdldFNoYXBlaWNvbigpOwotCQkJCQlpZiAoc2hhcGVJY29uVXJpICE9IG51bGwpIHsKLQkJCQkJCS8vIFRvIGhhbmRsZSB0aGUgc2hhcGVJY29uL25vZGVJY29uIHVyaSBnb3QgY2hhbmdlZCwgaXRzIHJlbGF0aXZlIHRvIHBsdWdpblBhdGguCi0JCQkJCQlqYXZhLm5ldC5VUkkgbmV3U2hhcGVJY29uVXJpID0gaGFuZGxlSWNvblVSSShkZSwKLQkJCQkJCQkJc2hhcGVJY29uVXJpKTsKLQkJCQkJCWlmIChuZXdTaGFwZUljb25VcmkgIT0gbnVsbCkgewotCQkJCQkJCWRlLnNldFNoYXBlaWNvbihuZXdTaGFwZUljb25VcmkpOwotCQkJCQkJCW1vZGlmaWVkUmVzb3VyY2VTZXQuYWRkKGRlLmVSZXNvdXJjZSgpKTsKLQkJCQkJCX0KLQkJCQkJfQotCi0JCQkJCS8vIG5vZGUgaWNvbgotCQkJCQlqYXZhLm5ldC5VUkkgbm9kZUljb25VcmkgPSBkZS5nZXROb2RlaWNvbigpOwotCQkJCQlpZiAobm9kZUljb25VcmkgIT0gbnVsbCkgewotCQkJCQkJamF2YS5uZXQuVVJJIG5ld05vZGVJY29uVXJpID0gaGFuZGxlSWNvblVSSShkZSwKLQkJCQkJCQkJbm9kZUljb25VcmkpOwotCQkJCQkJaWYgKG5ld05vZGVJY29uVXJpICE9IG51bGwpIHsKLQkJCQkJCQlkZS5zZXROb2RlaWNvbihuZXdOb2RlSWNvblVyaSk7Ci0JCQkJCQkJbW9kaWZpZWRSZXNvdXJjZVNldC5hZGQoZGUuZVJlc291cmNlKCkpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCUxpYnJhcnlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGV4KTsKLQkJCQl9Ci0JCQkJSGFuZGxlQXR0YWNobWVudHNQbHVnaW4oZGUuZ2V0UHJlc2VudGF0aW9uKCkpOwotCQkJCXJldHVybjsKLQkJCX0gZWxzZSBpZiAoZSBpbnN0YW5jZW9mIENvbnRlbnREZXNjcmlwdGlvbikgewotCQkJCWVsZW1lbnRUb1Byb2Nlc3MgPSAoQ29udGVudERlc2NyaXB0aW9uKSBlOwotCQkJfSBlbHNlIGlmIChlIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJCWVsZW1lbnRUb1Byb2Nlc3MgPSAoTWV0aG9kRWxlbWVudCkgZTsKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKGRlYnVnKSB7Ci0JCQkJCVN5c3RlbS5vdXQKLQkJCQkJCQkucHJpbnRsbigiQ29weUF0dGFjaG1lbnRzVG9OZXdMb2NhdGlvbi5IYW5kbGVBdHRhY2htZW50c1BsdWdpbjogdW5rbm93biB0eXBlICIgKyBlKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCX0KLQotCQkJaWYgKGVsZW1lbnRUb1Byb2Nlc3MgIT0gbnVsbAotCQkJCQkmJiBlbGVtZW50VG9Qcm9jZXNzLmVSZXNvdXJjZSgpICE9IG51bGwpIHsKLQkJCQkvLyBzZXQgdXAgQ29udGVudFJlc291cmNlU2Nhbm5lciBmb3IgdGhpcyBlbGVtZW50Ci0JCQkJLy8gZ2l2ZSBDb250ZW50UmVzb3VyY2VTY2FubmVyIHNhbWUgZGlyZWN0b3J5IGZvciBzb3VyY2VSb290UGF0aAotCQkJCS8vIGFuZCB0YXJnZXRSb290UGF0aAotLy8JCQkJSUxpYnJhcnlNYW5hZ2VyIG1hbmFnZXIgPSAoSUxpYnJhcnlNYW5hZ2VyKSBMaWJyYXJ5U2VydmljZQotLy8JCQkJCQkuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TGlicmFyeU1hbmFnZXIoKTsKLS8vCQkJCQotLy8JCQkJVVJJIGVsZW1lbnRVUkkgPSBtYW5hZ2VyICE9IG51bGwgPyBtYW5hZ2VyLmdldEVsZW1lbnRSZWxhdGl2ZVVSSShlbGVtZW50VG9Qcm9jZXNzKSA6IG51bGw7Ci0vLwkJCQlpZiAoZWxlbWVudFVSSSA9PSBudWxsIHx8IGVsZW1lbnRVUkkuc2VnbWVudENvdW50KCkgPCAxKQotLy8JCQkJCXJldHVybjsKLQkJCQkKLQkJCQkKLQkJCQlJTGlicmFyeVJlc291cmNlTWFuYWdlciByZXNNZ3IgPSBSZXNvdXJjZUhlbHBlci5nZXRSZXNvdXJjZU1ncihlbGVtZW50VG9Qcm9jZXNzKTsKLQkJCQlJTGlicmFyeVJlc291cmNlTWFuYWdlciBsYXN0T2xkUGx1Z2luUmVzTWdyID0gUmVzb3VyY2VIZWxwZXIuZ2V0UmVzb3VyY2VNZ3IobGFzdE9sZFBsdWdpbik7Ci0JCQkJCi0JCQkJQ29udGVudFJlc291cmNlU2Nhbm5lciBzY2FubmVyID0gZ2V0U2Nhbm5lcihlbGVtZW50VG9Qcm9jZXNzKTsKLQotCQkJCS8vIGl0ZXJhdGUgdGhydSBlbGVtZW50J3MgY29udGVudAotCQkJCVN0cmluZyBjb250ZW50UGF0aCA9IFJlc291cmNlSGVscGVyCi0JCQkJCQkuZ2V0RWxlbWVudFBhdGgoKE1ldGhvZEVsZW1lbnQpIGVsZW1lbnRUb1Byb2Nlc3MpOwotCQkJCWlmIChjb250ZW50UGF0aCA9PSBudWxsIHx8IGNvbnRlbnRQYXRoLmxlbmd0aCgpID09IDApIHsKLQkJCQkJTGlicmFyeVBsdWdpbgotCQkJCQkJCS5nZXREZWZhdWx0KCkKLQkJCQkJCQkuZ2V0TG9nZ2VyKCkKLQkJCQkJCQkubG9nV2FybmluZygKLQkJCQkJCQkJCU5MUy5iaW5kKExpYnJhcnlSZXNvdXJjZXMuQ29weUF0dGFjaG1lbnRzVG9OZXdMb2NhdGlvbl9sb2dfbm9Db250ZW50UGF0aCwgKG5ldyBPYmplY3RbXSB7ICgoTWV0aG9kRWxlbWVudCkgZWxlbWVudFRvUHJvY2VzcykuZ2V0TmFtZSgpIH0pKSk7IAotCQkJCQlyZXR1cm47Ci0JCQkJfQotCi0JCQkJLy8gRklYTUU6IHRoaXMgaXMgbm90IGFsd2F5cyBjb3JyZWN0IHRoaXMgcmVsYXRpdmUgb2YgdGhlIGVsZW1lbnQncyBmb2xkZXIgbWlnaHQgaGF2ZSBiZWVuIGNoYW5nZWQKLQkJCQkvLyBkdXJpbmcgbW92ZS9jb3B5Ci0JCQkJU3RyaW5nIG9sZENvbnRlbnRQYXRoID0gY29udGVudFBhdGgucmVwbGFjZUZpcnN0KFVtYVV0aWwKLQkJCQkJCS5nZXRNZXRob2RQbHVnaW4oZWxlbWVudFRvUHJvY2VzcykuZ2V0TmFtZSgpLAotCQkJCQkJbGFzdE9sZFBsdWdpbi5nZXROYW1lKCkpOwotCQkJCQotCQkJCS8vQ29tbWVudGVkIG91dCB0aGUgZm9sbG93aW5nIGFuZCByb2xsZWQgYmFjayB0byB0aGUgYWJvdmUgdG8gZml4IGEgYnVnCi0JCQkJLy93aXRoIGF0dGFjaGVkIGZpbGUgaW4gY29udGVudCBwYXN0ZS4gQnV0IHdoeSBpdCB3YXMgaW50cm9kdWNlZD8gV2l0aG91dCBpdAotCQkJCS8vdGhlIHNoYXBlIGFuZCBub2RlIGljb24gYXBwZWFyIHRvIGJlIHdvcmtpbmcgZmluZS4KLQkJCQkvL1N0cmluZyBvbGRDb250ZW50UGF0aCA9IFJlc291cmNlSGVscGVyCi0JCQkJLy8JLmdldEVsZW1lbnRQYXRoKGxhc3RPbGRQbHVnaW4pOwkJCQkKLQotCQkJCUl0ZXJhdG9yIGl0ZXIgPSBlbGVtZW50VG9Qcm9jZXNzLmVDbGFzcygpLmdldEVBbGxBdHRyaWJ1dGVzKCkKLQkJCQkJCS5pdGVyYXRvcigpOwotCQkJCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJCQlFQXR0cmlidXRlIGF0dHJpYiA9IChFQXR0cmlidXRlKSBpdGVyLm5leHQoKTsKLQkJCQkJT2JqZWN0IG8gPSBlbGVtZW50VG9Qcm9jZXNzLmVHZXQoYXR0cmliKTsKLQkJCQkJaWYgKG8gaW5zdGFuY2VvZiBTdHJpbmcpIHsKLQkJCQkJCVN0cmluZyBjb250ZW50ID0gKFN0cmluZykgbzsKLQkJCQkJCWlmIChjb250ZW50Lmxlbmd0aCgpID4gMCkgewotCQkJCQkJCVN0cmluZyBuZXdDb250ZW50ID0gc2Nhbm5lci5yZXNvbHZlUmVzb3VyY2VzUGx1Z2luKAotCQkJCQkJCQkJY29udGVudCwgY29udGVudFBhdGgsIG9sZENvbnRlbnRQYXRoKTsKLQkJCQkJCQlpZiAobmV3Q29udGVudCAhPSBudWxsCi0JCQkJCQkJCQkmJiBuZXdDb250ZW50LnRyaW0oKS5sZW5ndGgoKSAhPSAwCi0JCQkJCQkJCQkmJiAhY29udGVudC5lcXVhbHMobmV3Q29udGVudCkpIHsKLQkJCQkJCQkJZWxlbWVudFRvUHJvY2Vzcy5lU2V0KGF0dHJpYiwgbmV3Q29udGVudCk7Ci0JCQkJCQkJCW1vZGlmaWVkUmVzb3VyY2VTZXQuYWRkKGVsZW1lbnRUb1Byb2Nlc3MKLQkJCQkJCQkJCQkuZVJlc291cmNlKCkpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQotCQkJCS8vIFRlbXBsYXRlIGF0dGFjaG1lbnRzCi0vLwkJCQlTdHJpbmcgbGliUm9vdCA9IFJlc291cmNlSGVscGVyLmdldFZpcnR1YWxMaWJyYXJ5Um9vdChlbGVtZW50VG9Qcm9jZXNzKTsKLQkJCQlpZiAoZWxlbWVudFRvUHJvY2VzcyBpbnN0YW5jZW9mIEd1aWRhbmNlRGVzY3JpcHRpb24pIHsKLQkJCQkJU3RyaW5nIGF0dGFjaG1lbnRTdHJpbmcgPSAoKEd1aWRhbmNlRGVzY3JpcHRpb24pIGVsZW1lbnRUb1Byb2Nlc3MpCi0JCQkJCQkJLmdldEF0dGFjaG1lbnRzKCk7Ci0JCQkJCUxpc3QgYXR0YWNobWVudExpc3QgPSBUbmdVdGlsCi0JCQkJCQkJLmNvbnZlcnRHdWlkYW5jZUF0dGFjaG1lbnRzVG9MaXN0KGF0dGFjaG1lbnRTdHJpbmcpOwotCQkJCQlmb3IgKGl0ZXIgPSBhdHRhY2htZW50TGlzdC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJCVN0cmluZyBhdHRhY2htZW50ID0gKFN0cmluZykgaXRlci5uZXh0KCk7Ci0JCQkJCQlpZiAoYXR0YWNobWVudCAhPSBudWxsCi0JCQkJCQkJCSYmIGF0dGFjaG1lbnQudHJpbSgpLmxlbmd0aCgpID4gMCkgewotCQkJCQkJCU1hdGNoZXIgbSA9IFJlc291cmNlSGVscGVyLnBfdGVtcGxhdGVfYXR0YWNobWVudF91cmwubWF0Y2hlcihhdHRhY2htZW50KTsKLQkJCQkJCQlpZiAoIW0uZmluZCgpKSB7Ci0JCQkJCQkJCUZpbGUgc3JjQ29udGVudFBhdGggPSBuZXcgRmlsZShsYXN0T2xkUGx1Z2luUmVzTWdyLnJlc29sdmUobGFzdE9sZFBsdWdpbiwgb2xkQ29udGVudFBhdGgpKTsKLQkJCQkJCQkJRmlsZSBzcmNGaWxlID0gbmV3IEZpbGUoc3JjQ29udGVudFBhdGgsCi0JCQkJCQkJCQkJYXR0YWNobWVudCk7Ci0JCQkJCQkJCUZpbGUgdGd0Q29udGVudFBhdGggPSBuZXcgRmlsZShyZXNNZ3IuZ2V0UGh5c2ljYWxQYXRoKGVsZW1lbnRUb1Byb2Nlc3MpKTsKLQkJCQkJCQkJRmlsZSB0Z3RGaWxlID0gbmV3IEZpbGUodGd0Q29udGVudFBhdGgsCi0JCQkJCQkJCQkJYXR0YWNobWVudCk7Ci0JCQkJCQkJCWlmICghdGd0RmlsZS5leGlzdHMoKSkgewotCQkJCQkJCQkJRmlsZVV0aWwuY29weUZpbGUoc3JjRmlsZSwgdGd0RmlsZSk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQkvLyBoYW5kbGUgY2hpbGRyZW4KLQkJSXRlcmF0b3IgaXRlciA9IGUuZUFsbENvbnRlbnRzKCk7Ci0JCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJRU9iamVjdCBjaGlsZCA9IChFT2JqZWN0KSBpdGVyLm5leHQoKTsKLQkJCUhhbmRsZUF0dGFjaG1lbnRzUGx1Z2luKGNoaWxkKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBkZQotCSAqIEBwYXJhbSBpY29uVXJpCi0JICogQHJldHVybiB0aGUgbmV3IEljb24gVVJJIChyZWxhdGl2ZSBwYXRoLCBzbyBpdHMgcmVhZHkgdG8gYmUgcGVyc2lzdGVkIHRvIHRoZSBtb2RlbCkKLQkgKiBAdGhyb3dzIFVSSVN5bnRheEV4Y2VwdGlvbgotCSAqLwotCXByaXZhdGUgamF2YS5uZXQuVVJJIGhhbmRsZUljb25VUkkoRGVzY3JpYmFibGVFbGVtZW50IGRlLAotCQkJamF2YS5uZXQuVVJJIGljb25VcmkpIHRocm93cyBVUklTeW50YXhFeGNlcHRpb24gewotCQlqYXZhLm5ldC5VUkkgc3JjVXJpID0gVG5nVXRpbC5nZXRGdWxsUGF0aFVSSShkZSwKLQkJCQlpY29uVXJpKTsKLQkJU3RyaW5nIGljb25QYXRoID0gaWNvblVyaS5nZXRQYXRoKCk7Ci0JCWlmKGljb25QYXRoLmluZGV4T2YobGFzdE9sZFBsdWdpbi5nZXROYW1lKCkpIDwgMCl7Ci0JCQlzcmNVcmkgPSBuZXcgRmlsZShSZXNvdXJjZUhlbHBlci5nZXRQbHVnaW5QYXRoKGxhc3RPbGRQbHVnaW4pICsgRmlsZS5zZXBhcmF0b3IgKyBpY29uUGF0aCkudG9VUkkoKTsKLQkJfQotCQlGaWxlIHNyY0ZpbGUgPSBuZXcgRmlsZShzcmNVcmkpOwotCQlqYXZhLm5ldC5VUkkgdGd0VXJpID0gbmV3IEZpbGUoUmVzb3VyY2VIZWxwZXIuZ2V0UGx1Z2luUGF0aChkZSkgKyBGaWxlLnNlcGFyYXRvciArIGljb25QYXRoKS50b1VSSSgpOwotCQlGaWxlIHRndEZpbGUgPSBuZXcgRmlsZSh0Z3RVcmkpOwotCQlpZiAoIXRndEZpbGUuZXhpc3RzKCkpIHsKLQkJCUZpbGVVdGlsLmNvcHlGaWxlKHNyY0ZpbGUsIHRndEZpbGUpOwotCQl9Ci0JCWphdmEubmV0LlVSSSBuZXdJY29uVXJpID0gbmV3IGphdmEubmV0LlVSSShOZXRVdGlsCi0JCQkJLmVuY29kZUZpbGVVUkwoRmlsZVV0aWwuZ2V0UmVsYXRpdmVQYXRoKAotCQkJCQkJdGd0RmlsZSwgbmV3IEZpbGUoUmVzb3VyY2VIZWxwZXIuZ2V0UGx1Z2luUGF0aChkZSkpKSkpOwotCQlyZXR1cm4gbmV3SWNvblVyaTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjb250ZW50IHJlc291cmNlIHNjYW5uZXIgZm9yIHRoZSBlbGVtZW50LgotCSAqLwotCXByaXZhdGUgQ29udGVudFJlc291cmNlU2Nhbm5lciBnZXRTY2FubmVyKE1ldGhvZEVsZW1lbnQgb3duZXIpIHsKLQkJSUxpYnJhcnlSZXNvdXJjZU1hbmFnZXIgcmVzTWdyID0gUmVzb3VyY2VIZWxwZXIuZ2V0UmVzb3VyY2VNZ3Iob3duZXIpOwotCQlpZiAoIHJlc01nciA9PSBudWxsICkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJCi0JCVN0cmluZyByb290Q29udGVudFBhdGggPSByZXNNZ3IuZ2V0TG9naWNhbFBsdWdpblBhdGgob3duZXIpOwotCQlGaWxlIHNyY19yb290ID0gbmV3IEZpbGUocmVzTWdyLmdldFBoeXNpY2FsUGx1Z2luUGF0aChvd25lcikpOwotCQlGaWxlIHRndF9yb290ID0gc3JjX3Jvb3Q7Ci0JCUNvbnRlbnRSZXNvdXJjZVNjYW5uZXIgc2Nhbm5lciA9IG5ldyBDb250ZW50UmVzb3VyY2VTY2FubmVyKHNyY19yb290LCB0Z3Rfcm9vdCwgcm9vdENvbnRlbnRQYXRoLCBnZXRWYWxpZGF0b3IoKSk7Ci0KLQkJcmV0dXJuIHNjYW5uZXI7Ci0JfQotCQotCXB1YmxpYyBJQ29udGVudFZhbGlkYXRvciBnZXRWYWxpZGF0b3IoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCQotCS8qKgotCSAqIENvcHkgYWxsIGF0dGFjaG1lbnRzIGZyb20gb25lIGxpYnJhcnkgdG8gYW5vdGhlcgotCSAqIAotCSAqIEBwYXJhbSBvbGRMaWJEaXIKLQkgKiAgICAgICAgICAgIE9yaWdpbmFsIGxpYnJhcnkgcm9vdAotCSAqIEBwYXJhbSBuZXdMaWJEaXIKLQkgKiAgICAgICAgICAgIE5ldyBsaWJyYXJ5IHJvb3QKLQkgKiBAcGFyYW0geG1pTGlzdAotCSAqICAgICAgICAgICAgbGlzdCBvZiB4bWkgRmlsZSdzIChwYXNzIG51bGwgdG8gcHJvY2VzcyBhbGwgZmlsZXMgaW4KLQkgKiAgICAgICAgICAgIG5ld0xpYkRpcikKLQkgKiBAcGFyYW0gbW9uaXRvcgotCSAqICAgICAgICAgICAgb3B0aW9uYWwgKGNhbiBiZSBudWxsKSBJUHJvZ3Jlc3NNb25pdG9yCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGNvcHlBdHRhY2htZW50c0xpYnJhcnkoU3RyaW5nIG9sZExpYkRpciwKLQkJCVN0cmluZyBuZXdMaWJEaXIsIExpc3QgeG1pTGlzdCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0KLQkJLy8gZ2V0IGxpc3Qgb2YgLnhtaSBmaWxlcyBpbiBuZXdMaWJEaXIKLQkJaWYgKHhtaUxpc3QgPT0gbnVsbCkKLQkJCXhtaUxpc3QgPSBGaWxlVXRpbC5maWxlTGlzdChuZXcgRmlsZShuZXdMaWJEaXIpLCAieG1pIik7IC8vJE5PTi1OTFMtMSQKLQotCQlpZiAobW9uaXRvciAhPSBudWxsKQotCQkJbW9uaXRvci5zdWJUYXNrKExpYnJhcnlSZXNvdXJjZXMuY29weWluZ0F0dGFjaG1lbnRzVGFza19uYW1lKTsKLQotCQlJdGVyYXRvciBpdGVyID0geG1pTGlzdC5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCWlmIChtb25pdG9yICE9IG51bGwpCi0JCQkJbW9uaXRvci53b3JrZWQoMSk7Ci0JCQlGaWxlIHhtaUZpbGUgPSAoRmlsZSkgaXRlci5uZXh0KCk7Ci0JCQlpZiAoeG1pRmlsZS5leGlzdHMoKSkgewotCQkJCS8vIHBhcnNlIHhtaSBmaWxlCi0JCQkJU0FYUGFyc2VyWE1JIHBhcnNlciA9IG5ldyBTQVhQYXJzZXJYTUkobnVsbCk7Ci0JCQkJcGFyc2VyLnBhcnNlKHhtaUZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOwotCQkJCS8vIGl0ZXJhdGUgdGhydSBpdCdzIGVsZW1lbnRzLCBjaGVja2luZyBjb250ZW50IGZvciBhdHRhY2htZW50cwotCQkJCUNvbnRlbnRSZXNvdXJjZVNjYW5uZXIgc2Nhbm5lciA9IG5ldyBDb250ZW50UmVzb3VyY2VTY2FubmVyKAotCQkJCQkJbmV3IEZpbGUob2xkTGliRGlyKSwgbmV3IEZpbGUobmV3TGliRGlyKSwgbnVsbCk7Ci0JCQkJSGFuZGxlQXR0YWNobWVudHMocGFyc2VyLnhtaU1hcCwgc2Nhbm5lciwgeG1pRmlsZS5nZXRQYXJlbnQoKQotCQkJCQkJLnN1YnN0cmluZyhuZXdMaWJEaXIubGVuZ3RoKCkpKTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgSGFuZGxlQXR0YWNobWVudHMoSGFzaE1hcCBlTWFwLAotCQkJQ29udGVudFJlc291cmNlU2Nhbm5lciBzY2FubmVyLCBTdHJpbmcgY29udGVudFBhdGgpIHsKLQkJLy8gaGFuZGxlIHNlbGYKLQkJU3RyaW5nIGNvbnRlbnQgPSBTQVhQYXJzZXJYTUkuZ2V0RWxlbWVudENvbnRlbnQoZU1hcCk7Ci0JCWlmIChjb250ZW50ICE9IG51bGwpIHsKLQkJCS8vIHNjYW4gY29udGVudCBmb3IgYXR0YWNobWVudHMKLQkJCXNjYW5uZXIucmVzb2x2ZVJlc291cmNlcyhjb250ZW50LCBjb250ZW50UGF0aCk7Ci0JCX0KLQotCQkvLyBoYW5kbGUgY2hpbGRyZW4KLQkJSXRlcmF0b3IgaXRlciA9ICgoQXJyYXlMaXN0KSBlTWFwLmdldCgiY2hpbGRyZW4iKSkuaXRlcmF0b3IoKTsgLy8kTk9OLU5MUy0xJAotCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCUhhc2hNYXAgY2hpbGRNYXAgPSAoSGFzaE1hcCkgaXRlci5uZXh0KCk7Ci0JCQlIYW5kbGVBdHRhY2htZW50cyhjaGlsZE1hcCwgc2Nhbm5lciwgY29udGVudFBhdGgpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdXRpbC9GaWxlTmFtZUdlbmVyYXRvci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3V0aWwvRmlsZU5hbWVHZW5lcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjk2ZWMyNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdXRpbC9GaWxlTmFtZUdlbmVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWw7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuU3RyVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5JTGlicmFyeVNlcnZpY2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLQotLyoqCi0gKiBoZWxwZXIgY2xhc3MgdG8gcHJvZHVjZSBhIHVuaXF1ZSBuYW1lIGZvciBlYWNoIGd1aWQgb3IgZWxlbWVudAotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMgotICoKLSAqLwotcHVibGljIGNsYXNzIEZpbGVOYW1lR2VuZXJhdG9yIHsKLQlwdWJsaWMgc3RhdGljIEZpbGVOYW1lR2VuZXJhdG9yIElOU1RBTkNFID0gbmV3IEZpbGVOYW1lR2VuZXJhdG9yKCk7Ci0JCi0JcHJpdmF0ZSBNYXA8U3RyaW5nLCBTdHJpbmc+IG5hbWVUb0d1aWRNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKLQlwcml2YXRlIE1hcDxTdHJpbmcsIFN0cmluZz4gZ3VpZFRvTmFtZU1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOwotCXByaXZhdGUgTWFwPFN0cmluZywgSW50ZWdlcj4gYmFzZU5hbWVJbmRleE1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgSW50ZWdlcj4oKTsKLQkKLQlwcml2YXRlIElMaWJyYXJ5U2VydmljZUxpc3RlbmVyIHN2Y0xpc3RlbmVyOwotCQotCXByaXZhdGUgRmlsZU5hbWVHZW5lcmF0b3IoKSB7Ci0JCQotCQlzdmNMaXN0ZW5lciA9IG5ldyBJTGlicmFyeVNlcnZpY2VMaXN0ZW5lcigpewotCi0JCQlwdWJsaWMgdm9pZCBjb25maWd1cmF0aW9uU2V0KE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0JCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQkJCQotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBsaWJyYXJ5Q2xvc2VkKE1ldGhvZExpYnJhcnkgbGlicmFyeSkgewotCQkJCUZpbGVOYW1lR2VuZXJhdG9yLnRoaXMuY2xlYXIoKTsKLQkJCQkKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgbGlicmFyeUNyZWF0ZWQoTWV0aG9kTGlicmFyeSBsaWJyYXJ5KSB7Ci0JCQkJRmlsZU5hbWVHZW5lcmF0b3IudGhpcy5jbGVhcigpOwotCQkJCQotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBsaWJyYXJ5T3BlbmVkKE1ldGhvZExpYnJhcnkgbGlicmFyeSkgewotCQkJCUZpbGVOYW1lR2VuZXJhdG9yLnRoaXMuY2xlYXIoKTsKLQkJCQkKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgbGlicmFyeVJlb3BlbmVkKE1ldGhvZExpYnJhcnkgbGlicmFyeSkgewotCQkJCUZpbGVOYW1lR2VuZXJhdG9yLnRoaXMuY2xlYXIoKTsKLQkJCQkKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgbGlicmFyeVNldChNZXRob2RMaWJyYXJ5IGxpYnJhcnkpIHsKLQkJCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCQkJCi0JCQl9Ci0JCQkKLQkJfTsKLQkJCi0JCUxpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuYWRkTGlzdGVuZXIoc3ZjTGlzdGVuZXIpOwotCX0KLQkKLQkvKioKLQkgKiBnZXQgdGhlIGd1aWQgZnJvbSB0aGUgZmlsZSBuYW1lLCBhc3N1bWluZyB0aGUgZmlsZSBuYW1lIGlzIGdlbmVyYXRlZCBmcm9tIGFuIGVsZW1lbnQsIAotCSAqIHJldHVybiBudWxsIGlmIG5vdCBmb3VuZC4KLQkgKiBAcGFyYW0gZmlsZU5hbWUgU3RyaW5nCi0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIFN0cmluZyBnZXRHdWlkRnJvbUZpbGVOYW1lKFN0cmluZyBmaWxlTmFtZSkgewotCQlpZiAoIGZpbGVOYW1lID09IG51bGwgfHwgZmlsZU5hbWUuZXF1YWxzKCIiKSApIHsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJCi0JCXJldHVybiBnZXRHdWlkRnJvbVVuaXF1ZU5hbWUoZ2V0VW5pcXVlTmFtZShmaWxlTmFtZSkpOwotCX0KLQotCS8qKgotCSAqIGdldCB0aGUgZmlsZSBuYW1lIHdpdGggdGhlIGdpdmVuIHByZWZpeCBhbmQgZXh0ZW5zaW9uCi0JICogQHBhcmFtIGVsZW1lbnQgTWV0aG9kRWxlbWVudAotCSAqIEBwYXJhbSBuYW1lUHJlZml4IFN0cmluZyBwcmVmaXggZm9yIHRoZSBuYW1lCi0JICogQHBhcmFtIG5hbWVTdWZmaXggU3RyaW5nIHN1ZmZpeCBmb3IgdGhlIG5hbWUKLQkgKiBAcGFyYW0gZXh0IFN0cmluZyBmaWxlIGV4dGVuc2lvbiwgZm9yIGV4YW1wbGUsICIuaHRtbCIKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwkgCi0JcHVibGljIHN5bmNocm9uaXplZCBTdHJpbmcgZ2V0RmlsZU5hbWUoTWV0aG9kRWxlbWVudCBlbGVtZW50LCBTdHJpbmcgbmFtZVByZWZpeCwKLQkJCVN0cmluZyBuYW1lU3VmZml4LCBTdHJpbmcgZXh0KSB7Ci0KLQkJU3RyaW5nIHVuaXF1ZU5hbWUgPSBnZXRVbmlxdWVOYW1lRm9yR3VpZChlbGVtZW50LmdldEd1aWQoKSwgZWxlbWVudC5nZXROYW1lKCkpOwotCQkKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJaWYgKG5hbWVQcmVmaXggIT0gbnVsbCkgewotCQkJYnVmZmVyLmFwcGVuZChuYW1lUHJlZml4KTsKLQkJfQotCi0JCWJ1ZmZlci5hcHBlbmQodW5pcXVlTmFtZSk7Ci0JCQotCQlpZiAobmFtZVN1ZmZpeCAhPSBudWxsKSB7Ci0JCQlidWZmZXIuYXBwZW5kKG5hbWVTdWZmaXgpOwotCQl9Ci0KLQkJaWYgKGV4dCAhPSBudWxsKSB7Ci0JCQlpZiAoZXh0LmluZGV4T2YoIi4iKSA8IDApIC8vJE5PTi1OTFMtMSQKLQkJCXsKLQkJCQlleHQgPSAiLiIgKyBleHQ7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWJ1ZmZlci5hcHBlbmQoZXh0KTsKLQkJfQotCQkKLQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBjbGVhcigpIHsKLQkJbmFtZVRvR3VpZE1hcC5jbGVhcigpOwotCQlndWlkVG9OYW1lTWFwLmNsZWFyKCk7Ci0JCWJhc2VOYW1lSW5kZXhNYXAuY2xlYXIoKTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1BWF9OQU1FX0xFTkdUSCA9IDY0OwotCQotCXByaXZhdGUgU3RyaW5nIGdldFVuaXF1ZU5hbWVGb3JHdWlkKFN0cmluZyBndWlkLCBTdHJpbmcgZGVmYXVsdE5hbWUpIHsKLQkJaWYgKCBndWlkID09IG51bGwgfHwgZ3VpZC5lcXVhbHMoIiIpICkgeyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQkKLQkJLy8gaWYgdGhlIG5hbWUgaXMgYWxyZWFkeSBnZW5lbnJhdGVkLCByZXR1cm4gaXQKLQkJU3RyaW5nIHVuaXF1ZU5hbWUgPSBndWlkVG9OYW1lTWFwLmdldChndWlkKTsKLQkJaWYgKCB1bmlxdWVOYW1lICE9IG51bGwgKSB7Ci0JCQlyZXR1cm4gdW5pcXVlTmFtZTsKLQkJfQotCQkKLQkJLy8gY29uc3RydWN0IHRoZSBiYXNlIGZpbGUgbmFtZSBvZiB0aGUgZWxlbWVudAotCQkvLyBub3RlOiB0byBtYWtlIHRoZSBuYW1lIGNvbnNpc3RlbnQgZXZlcnl0aW1lIHRoZSBuYW1lIGlzIGdlbmVyYXRlZCwgCi0JCS8vIHdlIHN0aWxsIG5lZWQgdG8gbWFrZSB0aGUgbmFtZSBndWlkIHNwZWNpZmljLiAKLQkJLy8gYXBwZW5kaW5nIHRoZSBndWlkIG1ha2VzIHRoZSBzdHJpbmcgdG8gbG9uZywgc28gdXNlIHRoZSBoYXNoY29kZQotCQkvLyBob3dldmVyLCBoYXNoY29kZSBtYXkgaGF2ZSBjb2xsaXNpb24sIHNvIHN0aWxsIG5lZWQgdG8gYXBwZW5kIHRoZSBzdWZmaXggaW5kZXgsCi0JCS8vIGluIHN1Y2ggY2FzZSwgdGhlIGZpbGUgbmFtZSBtYXkgc3RpbGwgbm90IHVuaXF1ZWx5IGJpbmRpbmcgdG8gdGhlIHNhbWUgZWxlbWVudCBjb25zaXN0ZW50bHkuCi0JCS8vIGJ1dCB0aGUgY2hhbmNlIGlzIG11Y2ggc21hbGxlcgotCQlpZiAoIGRlZmF1bHROYW1lID09IG51bGwgKSB7Ci0JCQlkZWZhdWx0TmFtZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCX0gCi0JCQotCQkvLyBtYWtlIHN1cmUgdGhlIGJhc2UgbmFtZSBzdHJpbmcgaXMgdmFsaWQgYW5kIG5vdCBleGNlZWQgdGhlIG1heGltdW0gbGVuZ3RoCi0JCVN0cmluZyBiYXNlTmFtZSA9IFN0clV0aWwucmVtb3ZlU3BlY2lhbENoYXJhY3RlcnMoZGVmYXVsdE5hbWUpOwkKLQkJaWYgKCBiYXNlTmFtZS5sZW5ndGgoKSA+IE1BWF9OQU1FX0xFTkdUSCApIHsKLQkJCWJhc2VOYW1lID0gYmFzZU5hbWUuc3Vic3RyaW5nKDAsIE1BWF9OQU1FX0xFTkdUSCk7Ci0JCX0KLQkJCQotCQliYXNlTmFtZSArPSAiXyIgKyBJbnRlZ2VyLnRvSGV4U3RyaW5nKGd1aWQuaGFzaENvZGUoKSkudG9VcHBlckNhc2UoKTsgLy8kTk9OLU5MUy0xJAotCi0JCXVuaXF1ZU5hbWUgPSBiYXNlTmFtZTsKLQkJSW50ZWdlciBpbmRleCA9IGJhc2VOYW1lSW5kZXhNYXAuZ2V0KGJhc2VOYW1lKTsKLQkJaWYgKCBpbmRleCA9PSBudWxsICkgewotCQkJLy8gdGhpcyBpcyB0aGUgZmlyc3Qgd2l0aCB0aGlzIGJhc2UgbmFtZSwgdXNlIGl0Ci0JCQlpbmRleCA9IG5ldyBJbnRlZ2VyKDEpOwotCQl9IGVsc2UgewotCQkJLy8gaW5jcmVhc2UgdGhlIGluZGV4IGJ5IG9uZSBhbmQgYXBwZW5kIHRvIHRoZSBlbmQgb2YgdGhlIGJhc2UgbmFtZQotCQkJaW5kZXgrKzsKLQkJCXVuaXF1ZU5hbWUgPSBiYXNlTmFtZSArICItIiArIGluZGV4LnRvU3RyaW5nKCk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQkKLQkJYmFzZU5hbWVJbmRleE1hcC5wdXQoYmFzZU5hbWUsIGluZGV4KTsKLQkJZ3VpZFRvTmFtZU1hcC5wdXQoZ3VpZCwgdW5pcXVlTmFtZSk7Ci0JCW5hbWVUb0d1aWRNYXAucHV0KHVuaXF1ZU5hbWUsIGd1aWQpOwotCQlyZXR1cm4gdW5pcXVlTmFtZTsKLQl9Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0R3VpZEZyb21VbmlxdWVOYW1lKFN0cmluZyB1bmlxdWVOYW1lKSB7Ci0JCXJldHVybiBuYW1lVG9HdWlkTWFwLmdldCh1bmlxdWVOYW1lKTsKLQl9Ci0JCQotCXByaXZhdGUgU3RyaW5nIGdldFVuaXF1ZU5hbWUoU3RyaW5nIGZpbGVOYW1lKSB7Ci0JCQotCQl0cnkgewotCQlGaWxlIGYgPSBuZXcgRmlsZShmaWxlTmFtZSk7Ci0JCWZpbGVOYW1lID0gZi5nZXROYW1lKCk7Ci0JCWludCBpbmRleCA9IGZpbGVOYW1lLmxhc3RJbmRleE9mKCIuIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKCBpbmRleCA8IDAgKSB7Ci0JCQlyZXR1cm4gZmlsZU5hbWU7Ci0JCX0KLQkJCi0JCXJldHVybiBmaWxlTmFtZS5zdWJzdHJpbmcoMCwgaW5kZXgpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCWV4LnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JCQotCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdXRpbC9JRWxlbWVudFByb3BlcnR5UHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91dGlsL0lFbGVtZW50UHJvcGVydHlQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNDc2ODM4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91dGlsL0lFbGVtZW50UHJvcGVydHlQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXhlY3V0YWJsZUV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQudXRpbC5YbWxFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLQotLyoqCi0gKiBUaGlzIGludGVyZmFjZSwgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgZXh0ZW5zaW9uIHBvaW50Ci0gKiBlbGVtZW50UHJvcGVydHlQcm92aWRlcnMsIHByb3ZpZGVzIGEgbWVjaGFuaXNtIGZvciBleHBvc3VyZSBvZiBjdXN0b20KLSAqIGF0dHJpYnV0ZXMgb2YgTWV0aG9kRWxlbWVudCB0byB0aGUgWFNMVCB0ZW1wbGF0ZXMgZHVyaW5nIGEgcHVibGlzaCBvZiB0aGUKLSAqIG1ldGhvZCBsaWJyYXJ5LgotICogCi0gKiBAYXV0aG9yIFBpZXJyZSBQYWRvdmFuaQotICogCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUVsZW1lbnRQcm9wZXJ0eVByb3ZpZGVyIGV4dGVuZHMgSUV4ZWN1dGFibGVFeHRlbnNpb24gewotCi0gIAotICAvKioKLSAgICogSW1wbGVtZW50b3JzIG11c3QgcmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBjaGlsZCBYbWxFbGVtZW50IHRoZXkgd2lzaCB0byBoYXZlIGNyZWF0ZWQKLSAgICogYWdhaW5zdCB0aGUgTWV0aG9kRWxlbWVudCBiZWluZyBwcm9jZXNzZWQuIFRoaXMgbmFtZSB3aWxsIGJlIHVzZWQgdG8gY3JlYXRlIHRoZSBjaGlsZAotICAgKiBYbWxFbGVtZW50IGJlZm9yZSBhIHN1YnNlcXVlbnQgY2FsbCB0byBwdWJsaXNoTWV0aG9kRWxlbWVudFByb3BlcnRpZXMuIElmIG5vIHByb3BlcnRpZXMKLSAgICogZm9yIHRoZSBlbGVtZW50IGV4aXN0IG9yIGhhdmUgYmVlbiBkZWZpbmVkLCByZXR1cm4gbnVsbC4KLSAgICogCi0gICAqIEBwYXJhbSBlbGVtZW50Ci0gICAqICAgICAgICAgIE1ldGhvZEVsZW1lbnQKLSAgICogQHJldHVybiBTdHJpbmcKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0Q2hpbGRFbGVtZW50TmFtZShNZXRob2RFbGVtZW50IGVsZW1lbnQpOwotICAKLSAgLyoqCi0gICAqIEltcGxlbWVudG9ycyBvZiB0aGlzIG1ldGhvZCB3aWxsIGJlIGdpdmVuIGEgY2hpbGQgWG1sRWxlbWVudCB0aGF0IGNhbiBiZSBmaWxsZWQgd2l0aAotICAgKiBhbnkgZGF0YSBkZXNpcmVkLiBBbGwgZGF0YSBjb250YWluZWQgaW4gdGhpcyBYbWxFbGVtZW50IHdpbGwgYmUgZXhwb3NlZCB0byB0aGUgWFNMVCAKLSAgICogZHVyaW5nIGEgcHVibGlzaC4KLSAgICogCi0gICAqIEBwYXJhbSBlbGVtZW50Ci0gICAqICAgICAgICAgIE1ldGhvZEVsZW1lbnQKLSAgICogQHBhcmFtIGRhdGEKLSAgICogICAgICAgICAgWG1sRWxlbWVudAotICAgKi8KLSAgcHVibGljIHZvaWQgcHVibGlzaE1ldGhvZEVsZW1lbnRQcm9wZXJ0aWVzKE1ldGhvZEVsZW1lbnQgZWxlbWVudCwgWG1sRWxlbWVudCBkYXRhKTsKLSAgCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdXRpbC9JY29uVXRpbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3V0aWwvSWNvblV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDNjZjZjMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdXRpbC9JY29uVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWw7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuRmlsZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5VbWFFZGl0UGx1Z2luOwotCi0vKioKLSAqIHV0aWxpdHkgY2xhc3MgdG8gbWFuYWdlIGljb24gdXJscwotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICoKLSAqLwotcHVibGljIGNsYXNzIEljb25VdGlsIHsKLQotCXByaXZhdGUgc3RhdGljIFVSTCBub2RlSWNvblBsdWdpblJvb3QgPSBudWxsOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUNPTl9BY3Rpdml0eSA9ICJmdWxsL29iajE2L0FjdGl2aXR5IjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUNPTl9BcnRpZmFjdCA9ICJmdWxsL29iajE2L0FydGlmYWN0IjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUNPTl9DYXBhYmlsaXR5UGF0dGVybiA9ICJmdWxsL29iajE2L0NhcGFiaWxpdHlQYXR0ZXJuIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUNPTl9DaGVja2xpc3QgPSAiZnVsbC9vYmoxNi9DaGVja2xpc3QiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJQ09OX0NvbmNlcHQgPSAiZnVsbC9vYmoxNi9Db25jZXB0IjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUNPTl9Db250ZW50UGFja2FnZSA9ICJmdWxsL29iajE2L0NvbnRlbnRQYWNrYWdlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUNPTl9DdXN0b21DYXRlZ29yeSA9ICJmdWxsL29iajE2L0N1c3RvbUNhdGVnb3J5IjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUNPTl9EZWxpdmVyYWJsZSA9ICJmdWxsL29iajE2L0RlbGl2ZXJhYmxlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUNPTl9EZWxpdmVyeVByb2Nlc3MgPSAiZnVsbC9vYmoxNi9EZWxpdmVyeVByb2Nlc3MiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJQ09OX0Rpc2NpcGxpbmUgPSAiZnVsbC9vYmoxNi9EaXNjaXBsaW5lIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUNPTl9EaXNjaXBsaW5lR3JvdXBpbmcgPSAiZnVsbC9vYmoxNi9EaXNjaXBsaW5lR3JvdXBpbmciOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJQ09OX0RvbWFpbiA9ICJmdWxsL29iajE2L0RvbWFpbiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElDT05fRXN0aW1hdGUgPSAiZnVsbC9vYmoxNi9Fc3RpbWF0ZSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElDT05fRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zID0gImZ1bGwvb2JqMTYvRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUNPTl9FeGFtcGxlID0gImZ1bGwvb2JqMTYvRXhhbXBsZSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElDT05fR3VpZGVsaW5lID0gImZ1bGwvb2JqMTYvR3VpZGVsaW5lIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUNPTl9JdGVyYXRpb24gPSAiZnVsbC9vYmoxNi9JdGVyYXRpb24iOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJQ09OX01ldGhvZENvbmZpZ3VyYXRpb24gPSAiZnVsbC9vYmoxNi9NZXRob2RDb25maWd1cmF0aW9uIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUNPTl9NZXRob2RMaWJyYXJ5ID0gImZ1bGwvb2JqMTYvTWV0aG9kTGlicmFyeSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElDT05fTWV0aG9kUGFja2FnZSA9ICJmdWxsL29iajE2L01ldGhvZFBhY2thZ2UiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJQ09OX01ldGhvZFBsdWdpbiA9ICJmdWxsL29iajE2L01ldGhvZFBsdWdpbiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElDT05fTWlsZXN0b25lID0gImZ1bGwvb2JqMTYvTWlsZXN0b25lIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUNPTl9PdXRjb21lID0gImZ1bGwvb2JqMTYvT3V0Y29tZSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElDT05fUGhhc2UgPSAiZnVsbC9vYmoxNi9QaGFzZSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElDT05fUHJhY3RpY2UgPSAiZnVsbC9vYmoxNi9QcmFjdGljZSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElDT05fUHJvY2Vzc0NvbnRyaWJ1dGlvbiA9ICJmdWxsL29iajE2L1Byb2Nlc3NDb250cmlidXRpb24iOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJQ09OX1Byb2Nlc3NGYW1pbHkgPSAiZnVsbC9vYmoxNi9Qcm9jZXNzRmFtaWx5IjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUNPTl9Qcm9jZXNzUGFja2FnZSA9ICJmdWxsL29iajE2L1Byb2Nlc3NQYWNrYWdlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUNPTl9SZXBvcnQgPSAiZnVsbC9vYmoxNi9SZXBvcnQiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJQ09OX1JldXNhYmxlQXNzZXQgPSAiZnVsbC9vYmoxNi9SZXVzYWJsZUFzc2V0IjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUNPTl9Sb2FkbWFwID0gImZ1bGwvb2JqMTYvUm9hZG1hcCI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElDT05fUm9sZSA9ICJmdWxsL29iajE2L1JvbGUiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJQ09OX1JvbGVTZXQgPSAiZnVsbC9vYmoxNi9Sb2xlU2V0IjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUNPTl9Sb2xlU2V0R3JvdXBpbmcgPSAiZnVsbC9vYmoxNi9Sb2xlU2V0R3JvdXBpbmciOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJQ09OX1N1cHBvcnRpbmdNYXRlcmlhbCA9ICJmdWxsL29iajE2L1N1cHBvcnRpbmdNYXRlcmlhbCI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElDT05fVGFzayA9ICJmdWxsL29iajE2L1Rhc2siOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJQ09OX1RlbXBsYXRlID0gImZ1bGwvb2JqMTYvVGVtcGxhdGUiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJQ09OX1Rlcm1EZWZpbml0aW9uID0gImZ1bGwvb2JqMTYvVGVybURlZmluaXRpb24iOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJQ09OX1Rvb2wgPSAiZnVsbC9vYmoxNi9Ub29sIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUNPTl9Ub29sTWVudG9yID0gImZ1bGwvb2JqMTYvVG9vbE1lbnRvciI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElDT05fV2hpdGVwYXBlciA9ICJmdWxsL29iajE2L1doaXRlcGFwZXIiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJQ09OX1dvcmtQcm9kdWN0ID0gImZ1bGwvb2JqMTYvV29ya1Byb2R1Y3QiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJQ09OX1dvcmtQcm9kdWN0VHlwZSA9ICJmdWxsL29iajE2L1dvcmtQcm9kdWN0VHlwZSI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIG1hcCBvZiBpbWFnZSB0eXBlIHRvIGltYWdlCi0JcHJpdmF0ZSBzdGF0aWMgTWFwIG5vZGVJY29uVXJsTWFwID0gbmV3IEhhc2hNYXAoKTsKLQlzdGF0aWMgewotCQlub2RlSWNvblVybE1hcC5wdXQoImFjdGl2aXR5IiwgSUNPTl9BY3Rpdml0eSk7IC8vJE5PTi1OTFMtMSQKLQkJbm9kZUljb25VcmxNYXAucHV0KCJhcnRpZmFjdCIsIElDT05fQXJ0aWZhY3QpOyAvLyROT04tTkxTLTEkCi0JCW5vZGVJY29uVXJsTWFwLnB1dCgiY2FwYWJpbGl0eXBhdHRlcm4iLCBJQ09OX0NhcGFiaWxpdHlQYXR0ZXJuKTsgLy8kTk9OLU5MUy0xJAotCQlub2RlSWNvblVybE1hcC5wdXQoImNoZWNrbGlzdCIsIElDT05fQ2hlY2tsaXN0KTsgLy8kTk9OLU5MUy0xJAotCQlub2RlSWNvblVybE1hcC5wdXQoImNvbmNlcHQiLCBJQ09OX0NvbmNlcHQpOyAvLyROT04tTkxTLTEkCi0JCW5vZGVJY29uVXJsTWFwLnB1dCgiY29udGVudHBhY2thZ2UiLCBJQ09OX0NvbnRlbnRQYWNrYWdlKTsgLy8kTk9OLU5MUy0xJAotCQlub2RlSWNvblVybE1hcC5wdXQoImN1c3RvbWNhdGVnb3J5IiwgSUNPTl9DdXN0b21DYXRlZ29yeSk7IC8vJE5PTi1OTFMtMSQKLQkJbm9kZUljb25VcmxNYXAucHV0KCJkZWxpdmVyYWJsZSIsIElDT05fRGVsaXZlcmFibGUpOyAvLyROT04tTkxTLTEkCi0JCW5vZGVJY29uVXJsTWFwLnB1dCgiZGVsaXZlcnlwcm9jZXNzIiwgSUNPTl9EZWxpdmVyeVByb2Nlc3MpOyAvLyROT04tTkxTLTEkCi0JCW5vZGVJY29uVXJsTWFwLnB1dCgiZGlzY2lwbGluZSIsIElDT05fRGlzY2lwbGluZSk7IC8vJE5PTi1OTFMtMSQKLQkJbm9kZUljb25VcmxNYXAucHV0KCJkaXNjaXBsaW5lZ3JvdXBpbmciLCBJQ09OX0Rpc2NpcGxpbmVHcm91cGluZyk7IC8vJE5PTi1OTFMtMSQKLQkJbm9kZUljb25VcmxNYXAucHV0KCJkb21haW4iLCBJQ09OX0RvbWFpbik7IC8vJE5PTi1OTFMtMSQKLQkJbm9kZUljb25VcmxNYXAucHV0KCJlc3RpbWF0ZSIsIElDT05fRXN0aW1hdGUpOyAvLyROT04tTkxTLTEkCi0JCW5vZGVJY29uVXJsTWFwLnB1dCgKLQkJCQkiZXN0aW1hdGlvbmNvbnNpZGVyYXRpb25zIiwgSUNPTl9Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMpOyAvLyROT04tTkxTLTEkCi0JCW5vZGVJY29uVXJsTWFwLnB1dCgiZXhhbXBsZSIsIElDT05fRXhhbXBsZSk7IC8vJE5PTi1OTFMtMSQKLQkJbm9kZUljb25VcmxNYXAucHV0KCJndWlkZWxpbmUiLCBJQ09OX0d1aWRlbGluZSk7IC8vJE5PTi1OTFMtMSQKLQkJbm9kZUljb25VcmxNYXAucHV0KCJpdGVyYXRpb24iLCBJQ09OX0l0ZXJhdGlvbik7IC8vJE5PTi1OTFMtMSQKLQkJbm9kZUljb25VcmxNYXAucHV0KCJtZXRob2Rjb25maWd1cmF0aW9uIiwgSUNPTl9NZXRob2RDb25maWd1cmF0aW9uKTsgLy8kTk9OLU5MUy0xJAotCQlub2RlSWNvblVybE1hcC5wdXQoIm1ldGhvZGxpYnJhcnkiLCBJQ09OX01ldGhvZExpYnJhcnkpOyAvLyROT04tTkxTLTEkCi0JCW5vZGVJY29uVXJsTWFwLnB1dCgibWV0aG9kcGFja2FnZSIsIElDT05fTWV0aG9kUGFja2FnZSk7IC8vJE5PTi1OTFMtMSQKLQkJbm9kZUljb25VcmxNYXAucHV0KCJtZXRob2RwbHVnaW4iLCBJQ09OX01ldGhvZFBsdWdpbik7IC8vJE5PTi1OTFMtMSQKLQkJbm9kZUljb25VcmxNYXAucHV0KCJtaWxlc3RvbmUiLCBJQ09OX01pbGVzdG9uZSk7IC8vJE5PTi1OTFMtMSQKLQkJbm9kZUljb25VcmxNYXAucHV0KCJvdXRjb21lIiwgSUNPTl9PdXRjb21lKTsgLy8kTk9OLU5MUy0xJAotCQlub2RlSWNvblVybE1hcC5wdXQoInBoYXNlIiwgSUNPTl9QaGFzZSk7IC8vJE5PTi1OTFMtMSQKLQkJbm9kZUljb25VcmxNYXAucHV0KCJwcmFjdGljZSIsIElDT05fUHJhY3RpY2UpOyAvLyROT04tTkxTLTEkCi0JCW5vZGVJY29uVXJsTWFwLnB1dCgicHJvY2Vzc2NvbnRyaWJ1dGlvbiIsIElDT05fUHJvY2Vzc0NvbnRyaWJ1dGlvbik7IC8vJE5PTi1OTFMtMSQKLQkJbm9kZUljb25VcmxNYXAucHV0KCJwcm9jZXNzZmFtaWx5IiwgSUNPTl9Qcm9jZXNzRmFtaWx5KTsgLy8kTk9OLU5MUy0xJAotCQlub2RlSWNvblVybE1hcC5wdXQoInByb2Nlc3NwYWNrYWdlIiwgSUNPTl9Qcm9jZXNzUGFja2FnZSk7IC8vJE5PTi1OTFMtMSQKLQkJbm9kZUljb25VcmxNYXAucHV0KCJyZXBvcnQiLCBJQ09OX1JlcG9ydCk7IC8vJE5PTi1OTFMtMSQKLQkJbm9kZUljb25VcmxNYXAucHV0KCJyZXVzYWJsZWFzc2V0IiwgSUNPTl9SZXVzYWJsZUFzc2V0KTsgLy8kTk9OLU5MUy0xJAotCQlub2RlSWNvblVybE1hcC5wdXQoInJvYWRtYXAiLCBJQ09OX1JvYWRtYXApOyAvLyROT04tTkxTLTEkCi0JCW5vZGVJY29uVXJsTWFwLnB1dCgicm9sZSIsIElDT05fUm9sZSk7IC8vJE5PTi1OTFMtMSQKLQkJbm9kZUljb25VcmxNYXAucHV0KCJyb2xlc2V0IiwgSUNPTl9Sb2xlU2V0KTsgLy8kTk9OLU5MUy0xJAotCQlub2RlSWNvblVybE1hcC5wdXQoInJvbGVzZXRncm91cGluZyIsIElDT05fUm9sZVNldEdyb3VwaW5nKTsgLy8kTk9OLU5MUy0xJAotCQlub2RlSWNvblVybE1hcC5wdXQoInN1cHBvcnRpbmdtYXRlcmlhbCIsIElDT05fU3VwcG9ydGluZ01hdGVyaWFsKTsgLy8kTk9OLU5MUy0xJAotCQlub2RlSWNvblVybE1hcC5wdXQoInRhc2siLCBJQ09OX1Rhc2spOyAvLyROT04tTkxTLTEkCi0JCW5vZGVJY29uVXJsTWFwLnB1dCgidGVtcGxhdGUiLCBJQ09OX1RlbXBsYXRlKTsgLy8kTk9OLU5MUy0xJAotCQlub2RlSWNvblVybE1hcC5wdXQoInRlcm1kZWZpbml0aW9uIiwgSUNPTl9UZXJtRGVmaW5pdGlvbik7IC8vJE5PTi1OTFMtMSQKLQkJbm9kZUljb25VcmxNYXAucHV0KCJ0b29sIiwgSUNPTl9Ub29sKTsgLy8kTk9OLU5MUy0xJAotCQlub2RlSWNvblVybE1hcC5wdXQoInRvb2xtZW50b3IiLCBJQ09OX1Rvb2xNZW50b3IpOyAvLyROT04tTkxTLTEkCi0JCW5vZGVJY29uVXJsTWFwLnB1dCgid2hpdGVwYXBlciIsIElDT05fV2hpdGVwYXBlcik7IC8vJE5PTi1OTFMtMSQKLQkJbm9kZUljb25VcmxNYXAucHV0KCJ3b3JrcHJvZHVjdCIsIElDT05fV29ya1Byb2R1Y3QpOyAvLyROT04tTkxTLTEkCi0JCW5vZGVJY29uVXJsTWFwLnB1dCgid29ya3Byb2R1Y3R0eXBlIiwgSUNPTl9Xb3JrUHJvZHVjdFR5cGUpOyAvLyROT04tTkxTLTEkCi0KLQkJbm9kZUljb25VcmxNYXAucHV0KCJyb2xlZGVzY3JpcHRvciIsIElDT05fUm9sZSk7IC8vJE5PTi1OTFMtMSQKLQkJbm9kZUljb25VcmxNYXAucHV0KCJ0YXNrZGVzY3JpcHRvciIsIElDT05fVGFzayk7IC8vJE5PTi1OTFMtMSQKLQkJbm9kZUljb25VcmxNYXAucHV0KCJ3b3JrcHJvZHVjdGRlc2NyaXB0b3IiLCBJQ09OX1dvcmtQcm9kdWN0KTsgLy8kTk9OLU5MUy0xJAotCi0JCXRyeSB7Ci0JCQlub2RlSWNvblBsdWdpblJvb3QgPSBGaWxlTG9jYXRvci5yZXNvbHZlKFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJLmdldEJhc2VVUkwoKSk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIGdldCB0aGUgbm9kZSBpY29uIHVybAotCSAqIAotCSAqIEBwYXJhbSB0eXBlIFN0cmluZyB0aGUgZWxlbWVudCB0eXBlCi0JICogQHJldHVybiBVUkwKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFVSTCBnZXROb2RlSWNvblVSTChTdHJpbmcgdHlwZSkgewotCQl0cnkgewotCQkJU3RyaW5nIGtleSA9IChTdHJpbmcpIG5vZGVJY29uVXJsTWFwLmdldCh0eXBlLnRvTG93ZXJDYXNlKCkpOwotCQkJaWYgKGtleSAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIG5ldyBVUkwobm9kZUljb25QbHVnaW5Sb290LCAiaWNvbnMvIiArIGtleSArICIuZ2lmIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJfQotCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIGdldCB0aGUgbm9kZSBpY29uIGZpbGUgbG9jYXRpb24gZm9yIHRoZSBlbGVtZW50IHR5cGUKLQkgKiBAcGFyYW0gdHlwZSBTdHJpbmcgdGhlIGVsZW1lbnQgdHlwZQotCSAqIEByZXR1cm4gRmlsZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgRmlsZSBnZXROb2RlSWNvbkZpbGUoU3RyaW5nIHR5cGUpIHsKLQkJVVJMIHVybCA9IGdldE5vZGVJY29uVVJMKHR5cGUpOwotCQlpZiAodXJsICE9IG51bGwpIHsKLQkJCXJldHVybiBuZXcgRmlsZSh1cmwuZ2V0RmlsZSgpKTsKLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91dGlsL0ltcG9ydEV4cG9ydFV0aWwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91dGlsL0ltcG9ydEV4cG9ydFV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2MzODlmOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdXRpbC9JbXBvcnRFeHBvcnRVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRmFjdG9yeUNvbmZpZ3VyYXRpb25FcnJvcjsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5QYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuRmlsZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuSUxpYnJhcnlNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLk11bHRpRmlsZVNhdmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS51dGlsLlBlcnNpc3RlbmNlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmVzb3VyY2VtYW5hZ2VyLlJlc291cmNlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFzazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKLQotLyoqCi0gKiB1dGlsaXR5IGNsYXNzIHRvIGhhbmRsZSBlbGVtZW50IHJlcGxhY2Ugb3IgcmVuYW1pbmcgZm9yIGltcG9ydC9leHBvcnQKLSAqIAotICogQGF1dGhvciA/Pz8KLSAqIEBzaW5jZSAxLjAKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBJbXBvcnRFeHBvcnRVdGlsIHsKLQkKLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gcHJvY0NvbXAKLQkgKiBAcGFyYW0gZGlyCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbgotCSAqIEB0aHJvd3MgUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbgotCSAqIEB0aHJvd3MgRmFjdG9yeUNvbmZpZ3VyYXRpb25FcnJvcgotCSAqIEB0aHJvd3MgU0FYRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlcGxhY2UoUHJvY2Vzc0NvbXBvbmVudCBwcm9jQ29tcCwgU3RyaW5nIGRpcikKLQkJCXRocm93cyBJT0V4Y2VwdGlvbiwgUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiwKLQkJCUZhY3RvcnlDb25maWd1cmF0aW9uRXJyb3IsIFNBWEV4Y2VwdGlvbiB7Ci0JCUZpbGUgbmV3UHJvY0NvbXBGaWxlID0gbmV3IEZpbGUoZGlyLAotCQkJCU11bHRpRmlsZVNhdmVVdGlsLkRFRkFVTFRfTU9ERUxfRklMRU5BTUUpOwotCQlpZiAoIW5ld1Byb2NDb21wRmlsZS5leGlzdHMoKSkgewotCQkJdGhyb3cgbmV3IEZpbGVOb3RGb3VuZEV4Y2VwdGlvbigKLQkJCQkJTWVzc2FnZUZvcm1hdAotCQkJCQkJCS5mb3JtYXQoCi0JCQkJCQkJCQlMaWJyYXJ5UmVzb3VyY2VzLkltcG9ydEV4cG9ydFV0aWxfTVNHOCwgbmV3IE9iamVjdFtdIHsgbmV3UHJvY0NvbXBGaWxlIH0pKTsKLQkJfQotCi0JCVN0cmluZyBvbGRNb2RlbEZpbGVTdHIgPSBwcm9jQ29tcC5lUmVzb3VyY2UoKS5nZXRVUkkoKS50b0ZpbGVTdHJpbmcoKTsKLQkJU3RyaW5nIG9sZFByb2NDb21wRGlyID0gbmV3IEZpbGUob2xkTW9kZWxGaWxlU3RyKS5nZXRQYXJlbnQoKTsKLQotCQlTdHJpbmcgc3VmZml4ID0gTXVsdGlGaWxlU2F2ZVV0aWwuZ2V0QmFja3VwRmlsZVN1ZmZpeCgpOwotCi0JCUZpbGUgdGVtcERpciA9IG51bGw7Ci0KLQkJdHJ5IHsKLQkJCS8vIGNvcHkgZGlyIGEgdGVtcCBkaXIgaW5zaWRlIHRoZSB0YXJnZXQgZGlyCi0JCQkvLwotCQkJdGVtcERpciA9IG5ldyBGaWxlKG9sZFByb2NDb21wRGlyLCBzdWZmaXgpOwotCQkJaWYgKCF0ZW1wRGlyLm1rZGlyKCkpIHsKLQkJCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oCi0JCQkJCQlNZXNzYWdlRm9ybWF0Ci0JCQkJCQkJCS5mb3JtYXQoCi0JCQkJCQkJCQkJTGlicmFyeVJlc291cmNlcy5JbXBvcnRFeHBvcnRVdGlsX01TRzksIG5ldyBPYmplY3RbXSB7IHRlbXBEaXIgfSkpOwotCQkJfQotCQkJRmlsZVV0aWwuY29weURpcihuZXcgRmlsZShkaXIpLCB0ZW1wRGlyKTsKLQkJCW5ld1Byb2NDb21wRmlsZSA9IG5ldyBGaWxlKHRlbXBEaXIsCi0JCQkJCU11bHRpRmlsZVNhdmVVdGlsLkRFRkFVTFRfTU9ERUxfRklMRU5BTUUpOwotCi0JCQkvLyBsb2FkIHRoZSBuZXcgbW9kZWwueG1pCi0JCQkvLwotCQkJUmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQgPSBwcm9jQ29tcAotCQkJCQkuZVJlc291cmNlKCkuZ2V0UmVzb3VyY2VTZXQoKTsKLQkJCVJlc291cmNlIG5ld1Jlc291cmNlID0gcmVzb3VyY2VTZXQuZ2V0UmVzb3VyY2UoVVJJCi0JCQkJCS5jcmVhdGVGaWxlVVJJKG5ld1Byb2NDb21wRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSksIHRydWUpOwotCi0JCQkvLyBmaXggY29uZmlndXJhdGlvbiByZWZlcmVuY2VzCi0JCQkvLwotCQkJUHJvY2Vzc0NvbXBvbmVudCBuZXdQcm9jQ29tcCA9IChQcm9jZXNzQ29tcG9uZW50KSBQZXJzaXN0ZW5jZVV0aWwKLQkJCQkJLmdldE1ldGhvZEVsZW1lbnQobmV3UmVzb3VyY2UpOwotCQkJUHJvY2VzcyBuZXdQcm9jID0gbmV3UHJvY0NvbXAuZ2V0UHJvY2VzcygpOwotCQkJbmV3UHJvYwotCQkJCQkuc2V0RGVmYXVsdENvbnRleHQocHJvY0NvbXAuZ2V0UHJvY2VzcygpCi0JCQkJCQkJLmdldERlZmF1bHRDb250ZXh0KCkpOwotCQkJbmV3UHJvYy5nZXRWYWxpZENvbnRleHQoKS5jbGVhcigpOwotCQkJbmV3UHJvYy5nZXRWYWxpZENvbnRleHQoKS5hZGRBbGwoCi0JCQkJCXByb2NDb21wLmdldFByb2Nlc3MoKS5nZXRWYWxpZENvbnRleHQoKSk7Ci0KLQkJCS8vIGZpeCBhbGwgc3RlcHMKLQkJCS8vCQkKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IG5ld1Byb2NDb21wLmVBbGxDb250ZW50cygpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3QgZWxlbWVudCA9IGl0ZXIubmV4dCgpOwotCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgVGFza0Rlc2NyaXB0b3IpIHsKLQkJCQkJVGFza0Rlc2NyaXB0b3IgdGFza0Rlc2MgPSAoVGFza0Rlc2NyaXB0b3IpIGVsZW1lbnQ7Ci0JCQkJCVRhc2sgdGFzayA9IHRhc2tEZXNjLmdldFRhc2soKTsKLQkJCQkJU3RyaW5nIHRhc2tOYW1lID0gdGFzayA9PSBudWxsID8gIk5PTkUiIDogIiciICsgdGFzay5nZXROYW1lKCkgKyAiJyI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiVGFzazogIiArIHRhc2tOYW1lKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlpZiAodGFzayAhPSBudWxsKSB7Ci0JCQkJCQl0YXNrRGVzYy5nZXRTZWxlY3RlZFN0ZXBzKCkuY2xlYXIoKTsKLQkJCQkJCXRhc2tEZXNjLmdldFNlbGVjdGVkU3RlcHMoKS5hZGRBbGwodGFzay5nZXRTdGVwcygpKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJLy8gcmVwbGFjZSBHVUlEIG9mIG5ldyBQcm9jZXNzQ29tcG9uZW50IGFuZCBpdHMgUmVzb3VyY2VNYW5hZ2VyIHdpdGgKLQkJCS8vIG9sZCBvbmVzCi0JCQkvLwotCi0JCQkvLyAvLyByZWFkIHRoZSBtb2RlbC54bWkgZmlsZQotCQkJLy8gRG9jdW1lbnRCdWlsZGVyIGJ1aWxkZXIgPQotCQkJLy8gRG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpLm5ld0RvY3VtZW50QnVpbGRlcigpOwotCQkJLy8gRG9jdW1lbnQgZG9jID0gYnVpbGRlci5wYXJzZShuZXdQcm9jQ29tcEZpbGUpOwotCi0JCQkvLyBzZXQgR1VJRCBvZiBuZXcgUmVzb3VyY2VNYW5hZ2VyIHRvIG9sZCBHVUlECi0JCQlSZXNvdXJjZU1hbmFnZXIgcmVzTWdyID0gTXVsdGlGaWxlU2F2ZVV0aWwKLQkJCQkJLmdldFJlc291cmNlTWFuYWdlcihwcm9jQ29tcC5lUmVzb3VyY2UoKSk7Ci0JCQlpZiAocmVzTWdyICE9IG51bGwpIHsKLQkJCQlNdWx0aUZpbGVTYXZlVXRpbC5nZXRSZXNvdXJjZU1hbmFnZXIobmV3UmVzb3VyY2UpLnNldEd1aWQoCi0JCQkJCQlyZXNNZ3IuZ2V0R3VpZCgpKTsKLQkJCX0KLQotCQkJLy8gTm9kZUxpc3QgbGlzdCA9Ci0JCQkvLyBkb2MuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9yZy5lY2xpcHNlLmVwZi51bWEucmVzb3VyY2VtYW5hZ2VyOlJlc291cmNlTWFuYWdlciIpOwotCQkJLy8gRWxlbWVudCBlID0gKEVsZW1lbnQpIGxpc3QuaXRlbSgwKTsKLQkJCS8vIGUuc2V0QXR0cmlidXRlKCJ4bWk6aWQiLCBndWlkKTsKLQkJCS8vIGUuc2V0QXR0cmlidXRlKCJndWlkIiwgZ3VpZCk7Ci0KLQkJCS8vIHNldCBHVUlEIG9mIG5ldyBQcm9jZXNzQ29tcG9uZW50IHRvIG9sZCBHVUlECi0JCQluZXdQcm9jQ29tcC5zZXRHdWlkKHByb2NDb21wLmdldEd1aWQoKSk7Ci0KLQkJCS8vIGd1aWQgPSBwcm9jQ29tcC5nZXRHdWlkKCk7Ci0JCQkvLyBsaXN0ID0KLQkJCS8vIGRvYy5nZXRFbGVtZW50c0J5VGFnTmFtZSgib3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzQ29tcG9uZW50Iik7Ci0JCQkvLyBlID0gKEVsZW1lbnQpIGxpc3QuaXRlbSgwKTsKLQkJCS8vIGUuc2V0QXR0cmlidXRlKCJ4bWk6aWQiLCBndWlkKTsKLQkJCS8vIGUuc2V0QXR0cmlidXRlKCJndWlkIiwgZ3VpZCk7Ci0KLQkJCS8vIHNhdmUgdGhlIG5ldyBtb2RlbC54bWkKLQkJCUlMaWJyYXJ5TWFuYWdlciBtYW5hZ2VyID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKQotCQkJCQkuZ2V0Q3VycmVudExpYnJhcnlNYW5hZ2VyKCk7Ci0JCQlNYXAgc2F2ZU9wdGlvbnMgPSBtYW5hZ2VyICE9IG51bGwgPyBtYW5hZ2VyLmdldFNhdmVPcHRpb25zKCkgOiBuZXcgSGFzaE1hcCgpOwkJCQotCQkJbmV3UmVzb3VyY2Uuc2F2ZShzYXZlT3B0aW9ucyk7Ci0KLQkJCS8vIGJhY2sgdXAgb2xkIG1vZGVsLnhtaQotCQkJRmlsZSBmaWxlID0gbmV3IEZpbGUob2xkTW9kZWxGaWxlU3RyKTsKLQkJCUZpbGVVdGlsLm1vdmVGaWxlKGZpbGUsIG5ldyBGaWxlKG9sZE1vZGVsRmlsZVN0ciArICIuYmFrIiArIHN1ZmZpeCkpOyAvLyROT04tTkxTLTEkCi0KLQkJCUZpbGVVdGlsLm1vdmVGaWxlKG5ld1Byb2NDb21wRmlsZSwgbmV3IEZpbGUob2xkTW9kZWxGaWxlU3RyKSk7Ci0KLQkJCS8vIFhNTFV0aWwuc2F2ZURvY3VtZW50KGRvYywgb2xkTW9kZWxGaWxlU3RyKTsKLQotCQkJRmlsZSBuZXdDb250ZW50RmlsZSA9IG5ldyBGaWxlKHRlbXBEaXIsCi0JCQkJCU11bHRpRmlsZVNhdmVVdGlsLkRFRkFVTFRfQ09OVEVOVF9GSUxFTkFNRSk7Ci0KLQkJCS8vIGJhY2sgdXAgb2xkIGNvbnRlbnQueG1pCi0JCQlTdHJpbmcgY29udGVudEZpbGVTdHIgPSBvbGRQcm9jQ29tcERpciArIEZpbGUuc2VwYXJhdG9yCi0JCQkJCSsgTXVsdGlGaWxlU2F2ZVV0aWwuREVGQVVMVF9DT05URU5UX0ZJTEVOQU1FOwotCQkJRmlsZSBvbGRDb250ZW50RmlsZSA9IG5ldyBGaWxlKGNvbnRlbnRGaWxlU3RyKTsKLQkJCUZpbGVVdGlsLm1vdmVGaWxlKG9sZENvbnRlbnRGaWxlLCBuZXcgRmlsZShjb250ZW50RmlsZVN0ciArICIuYmFrIiArIHN1ZmZpeCkpOyAvLyROT04tTkxTLTEkCi0KLQkJCS8vIGNvcHkgbmV3IGNvbnRlbnQueG1pCi0JCQlpZiAobmV3Q29udGVudEZpbGUuZXhpc3RzKCkpIHsKLQkJCQlGaWxlVXRpbC5tb3ZlRmlsZShuZXdDb250ZW50RmlsZSwgb2xkQ29udGVudEZpbGUpOwotCQkJfQotCQl9IGZpbmFsbHkgewotCQkJaWYgKHRlbXBEaXIgIT0gbnVsbCkgewotCQkJCUZpbGVVdGlsLmRlbGV0ZUFsbEZpbGVzKHRlbXBEaXIuZ2V0QWJzb2x1dGVQYXRoKCkpOwotCQkJCXRlbXBEaXIuZGVsZXRlKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdXRpbC9MaWJyYXJ5TWFuYWdlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3V0aWwvTGlicmFyeU1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWNiYmE4Ni4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdXRpbC9MaWJyYXJ5TWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODk5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQWJzdHJhY3RUcmVlSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5UcmVlSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLkFkZFRvQ2F0ZWdvcnlDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JQWN0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSVJlc291cmNlQXdhcmVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5SZW1vdmVGcm9tQ2F0ZWdvcnlDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5NZXRob2RFbGVtZW50VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuTWlzYzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuTW9kZWxTdHJ1Y3R1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50Q2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ3VzdG9tQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmliYWJsZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaXNjaXBsaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGlzY2lwbGluZUdyb3VwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZVNldEdyb3VwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFzazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRvb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Ub29sTWVudG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3RUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5Bc3NvY2lhdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLQotCi0vKioKLSAqIFRoaXMgY2xhc3MgY29udGFpbnMgYWxsIHRoZSByb3V0aW5lcyB1c2VkIGJ5IHRoZSB0b29sIGVkaXRvciB0byBtYW5pcHVsYXRlCi0gKiB0aGUgYXNzb2NpYXRpb25zIG9mIGEgbWV0aG9kIGVsZW1lbnQgaW4gdGhlIGxpYnJhcnkgd2l0aCBvdGhlciBjYXRlZ29yaWVzIG9yCi0gKiBtZXRob2QgZWxlbWVudHMKLSAqIAotICogVXNlIGdldEF2YWlsYWJsZVhYWCB0byByZXRyaWV2ZSBhIHBpY2sgbGlzdCBvZiBjYXRlZ29yaWVzLCBtZXRob2QgZWxlbWVudCBmb3IKLSAqIGEgZ2l2ZW4gbWV0aG9kIGVsZW1lbnQuIFVzZSBhZGRUb1hYWCB0byBlc3RhYmxpc2ggYSBuZXcgYXNzb2NpYXRpb24uIFVzZQotICogcmVtb3ZlRnJvbVhYWCB0byByZW1vdmUgYW4gZXhpc2l0aW5nIGFzc29jaWF0aW9uLgotICogCi0gKiBDYWxsIHJlbGVhc2VDYXRlZ29yaWVzKCkgYmVmb3JlIHRoZSBlZGl0b3IgY2xvc2VzLCBwYXNzaW5nIGluIGFsbCB0aGUKLSAqIGNhdGVnb3JpZXMgdGhhdCB5b3UgaGF2ZSByZXRyaWV2ZWQgd2l0aCBnZXRBdmFpbGFibGVYWFgoKSBmb3IgdGhlIGVkaXRvci4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIExpYnJhcnlNYW5hZ2VyIHsKLQotCXByaXZhdGUgc3RhdGljIENvbXBhcmF0b3IgbmFtZUNvbXBhcmF0b3IgPSBuZXcgQ29tcGFyYXRvcigpIHsKLQotCQlwdWJsaWMgaW50IGNvbXBhcmUoT2JqZWN0IG8xLCBPYmplY3QgbzIpIHsKLQkJCWlmIChvMSBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQgJiYgbzIgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQkJcmV0dXJuICgoTWV0aG9kRWxlbWVudCkgbzEpLmdldE5hbWUoKS5jb21wYXJlVG8oCi0JCQkJCQkoKE1ldGhvZEVsZW1lbnQpIG8yKS5nZXROYW1lKCkpOwotCQkJfQotCi0JCQlyZXR1cm4gMDsKLQkJfQotCi0JfTsKLQotCXByaXZhdGUgc3RhdGljIExpYnJhcnlNYW5hZ2VyIGluc3RhbmNlID0gbnVsbDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgTGlicmFyeU1hbmFnZXIgZ2V0SW5zdGFuY2UoKSB7Ci0JCWlmIChpbnN0YW5jZSA9PSBudWxsKSB7Ci0JCQlzeW5jaHJvbml6ZWQgKExpYnJhcnlNYW5hZ2VyLmNsYXNzKSB7Ci0JCQkJaWYgKGluc3RhbmNlID09IG51bGwpIHsKLQkJCQkJaW5zdGFuY2UgPSBuZXcgTGlicmFyeU1hbmFnZXIoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLQotCXByb3RlY3RlZCBMaWJyYXJ5TWFuYWdlcigpIHsKLQl9Ci0KLQkvLyAvLy8vLy8KLQkvLyBCZWdpbiBvZiBjb2RlIG1vdmVkIGZyb20gTWV0aG9kRWxlbWVudFV0aWwgYW5kIG1hZGUgcHJpdmF0ZQotCS8vIC8vLy8vLwotCS8qKgotCSAqIFJldHVybiBjYXRlZ29yaWVzIGluIHRoZSBtb2RlbCwgZ2l2ZW4gcGFydGljdWxhciBvYmplY3QgYW5kIGNsYXNzCi0JICogCi0JICogQHBhcmFtIG9iamVjdAotCSAqIEBwYXJhbSBjbGFzcwotCSAqIEBwYXJhbSBTdHJpbmdbXQotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRBdmFpbGFibGVDYXRlZ29yaWVzKE1ldGhvZEVsZW1lbnQgb2JqZWN0LCBDbGFzcyBjbGFzc1R5cGUsCi0JCQlTdHJpbmdbXSBwYXRoKSB7Ci0JCUxpc3QgaXRlbUxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCU1ldGhvZFBsdWdpbiBtb2RlbCA9IFVtYVV0aWwuZ2V0TWV0aG9kUGx1Z2luKChFT2JqZWN0KSBvYmplY3QpOwotCi0JCWlmIChtb2RlbCAhPSBudWxsKSB7Ci0JCQkvLyBhZGQgYWxsIGNhdGVnb3JpZXMgZnJvbSB0aGUgY3VycmVudCBwbHVnaW4KLQkJCS8vCi0JCQlDb250ZW50UGFja2FnZSBkaXNjaXBsaW5lUGtnID0gVW1hVXRpbC5maW5kQ29udGVudFBhY2thZ2UobW9kZWwsCi0JCQkJCXBhdGgpOwotCQkJaWYgKGRpc2NpcGxpbmVQa2cgIT0gbnVsbCkgewotCQkJCUVMaXN0IGNvbnRlbnRDYXRzID0gKEVMaXN0KSBkaXNjaXBsaW5lUGtnLmdldENvbnRlbnRFbGVtZW50cygpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY29udGVudENhdHMuc2l6ZSgpOyBpKyspIHsKLQkJCQkJT2JqZWN0IGVsZW1lbnQgPSBjb250ZW50Q2F0cy5nZXQoaSk7Ci0KLQkJCQkJaWYgKGNsYXNzVHlwZS5pc0luc3RhbmNlKGVsZW1lbnQpICYmIGVsZW1lbnQgIT0gb2JqZWN0KSB7Ci0JCQkJCQlpdGVtTGlzdC5hZGQoZWxlbWVudCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCS8vIGFkZCBhbGwgY2F0ZWdvcmllcyBmcm9tIGJhc2UgcGx1Z2lucyB0aGF0IGFyZSBub3QgZXh0ZW5kZWQKLQkJCS8vCi0JCQlMaXN0IGxpc3QgPSBNaXNjLmdldEFsbEJhc2UobW9kZWwpOwotCQkJLy8gbGlzdC5hZGQoMCwgbW9kZWwpOwotCQkJZm9yIChpbnQgaiA9IDA7IGogPCBsaXN0LnNpemUoKTsgaisrKSB7Ci0JCQkJQ29udGVudFBhY2thZ2UgcGFyZW50RGlzY2lwbGluZXMgPSBVbWFVdGlsLmZpbmRDb250ZW50UGFja2FnZSgKLQkJCQkJCSgoTWV0aG9kUGx1Z2luKSBsaXN0LmdldChqKSksIHBhdGgpOwotCQkJCWlmIChwYXJlbnREaXNjaXBsaW5lcyAhPSBudWxsKSB7Ci0JCQkJCUVMaXN0IGNvbnRlbnRDYXRzID0gKEVMaXN0KSBwYXJlbnREaXNjaXBsaW5lcwotCQkJCQkJCS5nZXRDb250ZW50RWxlbWVudHMoKTsKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb250ZW50Q2F0cy5zaXplKCk7IGkrKykgewotCQkJCQkJT2JqZWN0IGVsZW1lbnQgPSBjb250ZW50Q2F0cy5nZXQoaSk7Ci0KLQkJCQkJCWlmIChjbGFzc1R5cGUuaXNJbnN0YW5jZShlbGVtZW50KSkgewotCQkJCQkJCVZhcmlhYmlsaXR5RWxlbWVudCBpdGVtID0gKFZhcmlhYmlsaXR5RWxlbWVudCkgZWxlbWVudDsKLQkJCQkJCQlpZiAoaXRlbS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkgPT0gbnVsbCkgewotCQkJCQkJCQkvLyBtYWtlIHN1cmUgdGhlIGl0ZW1MaXN0IGRvZXNuJ3QgaGF2ZSBhCi0JCQkJCQkJCS8vIGNhdGVnb3J5IHRoYXQgZXh0ZW5kcyB0aGlzCi0JCQkJCQkJCWludCBrOwotCQkJCQkJCQlmb3IgKGsgPSAwOyBrIDwgaXRlbUxpc3Quc2l6ZSgpOyBrKyspIHsKLQkJCQkJCQkJCWlmICgoKFZhcmlhYmlsaXR5RWxlbWVudCkgaXRlbUxpc3QuZ2V0KGspKQotCQkJCQkJCQkJCQkuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpID09IGl0ZW0pCi0JCQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJCX0KLQkJCQkJCQkJaWYgKGsgPT0gaXRlbUxpc3Quc2l6ZSgpKQotCQkJCQkJCQkJaXRlbUxpc3QuYWRkKGl0ZW0pOwotCi0JCQkJCQkJCS8vIGl0ZW1MaXN0LmFkZChpdGVtKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlDb2xsZWN0aW9ucy5zb3J0KGl0ZW1MaXN0LCBuYW1lQ29tcGFyYXRvcik7Ci0KLQkJcmV0dXJuIGl0ZW1MaXN0OwotCX0KLQotCS8vIC8vLy8vLy8vCi0JLy8gRW5kIG9mIGNvZGUgbW92ZWQgZnJvbSBNZXRob2RFbGVtZW50VXRpbAotCS8vIC8vLy8vLy8vCi0KLQkvKioKLQkgKiBHZXRzIGFsbCBkaXNjaXBsaW5lcyB0aGF0IGFyZSBhdmFpbGFibGUgdG8gdGhlIGdpdmVuIE1ldGhvZEVsZW1lbnQKLQkgKiBvYmplY3QuCi0JICogCi0JICogQHBhcmFtIGUKLQkgKiBAcmV0dXJuIGxpc3Qgb2YgRGlzY2lwbGluZSBvYmplY3RzCi0JICovCi0JcHVibGljIExpc3QgZ2V0QXZhaWxhYmxlRGlzY2lwbGluZXMoTWV0aG9kRWxlbWVudCBlKSB7Ci0JCXJldHVybiBnZXRBdmFpbGFibGVDYXRlZ29yaWVzKGUsIERpc2NpcGxpbmUuY2xhc3MsCi0JCQkJTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVF9ESVNDSVBMSU5FX0RFRl9QQVRIKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIGFsbCBkb21haW5zIHRoYXQgYXJlIGF2YWlsYWJsZSB0byB0aGUgZ2l2ZW4gTWV0aG9kRWxlbWVudCBvYmplY3QuCi0JICogCi0JICogQHBhcmFtIGUKLQkgKiBAcmV0dXJuIGxpc3Qgb2YgRG9tYWluIG9iamVjdHMKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRBdmFpbGFibGVEb21haW5zKE1ldGhvZEVsZW1lbnQgZSkgewotCQlMaXN0IGRvbWFpbnMgPSBnZXRBdmFpbGFibGVDYXRlZ29yaWVzKGUsIERvbWFpbi5jbGFzcywKLQkJCQlNb2RlbFN0cnVjdHVyZS5ERUZBVUxUX0RPTUFJTl9QQVRIKTsKLQotCQkvLyBnZXQgYWxsIHRoZSBkb21haW5zIGluY2x1ZGluZyBzdWJkb21haW5zCi0JCS8vCi0JCUxpc3QgYWxsRG9tYWlucyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZG9tYWlucy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCURvbWFpbiBkb21haW4gPSAoRG9tYWluKSBpdGVyLm5leHQoKTsKLQkJCUl0ZXJhdG9yIGRvbWFpblRyZWUgPSBuZXcgQWJzdHJhY3RUcmVlSXRlcmF0b3IoZG9tYWluLCB0cnVlKSB7Ci0KLQkJCQlwcm90ZWN0ZWQgSXRlcmF0b3IgZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQkJCQlyZXR1cm4gKChEb21haW4pIG9iamVjdCkuZ2V0U3ViZG9tYWlucygpLml0ZXJhdG9yKCk7Ci0JCQkJfQotCi0JCQl9OwotCQkJd2hpbGUgKGRvbWFpblRyZWUuaGFzTmV4dCgpKSB7Ci0JCQkJYWxsRG9tYWlucy5hZGQoZG9tYWluVHJlZS5uZXh0KCkpOwotCQkJfQotCQl9Ci0KLQkJQ29sbGVjdGlvbnMuc29ydChhbGxEb21haW5zLCBuYW1lQ29tcGFyYXRvcik7Ci0KLQkJcmV0dXJuIGFsbERvbWFpbnM7Ci0JfQotCi0JLyoqCi0JICogR2V0cyBhbGwgd29yayBwcm9kdWN0IHR5cGVzIHRoYXQgYXJlIGF2YWlsYWJsZSB0byB0aGUgZ2l2ZW4gTWV0aG9kRWxlbWVudAotCSAqIG9iamVjdC4KLQkgKiAKLQkgKiBAcGFyYW0gZQotCSAqIEByZXR1cm4gbGlzdCBvZiBXb3JrUHJvZHVjdFR5cGUgb2JqZWN0cwotCSAqLwotCXB1YmxpYyBMaXN0IGdldEF2YWlsYWJsZVdvcmtQcm9kdWN0VHlwZXMoTWV0aG9kRWxlbWVudCBlKSB7Ci0JCXJldHVybiBnZXRBdmFpbGFibGVDYXRlZ29yaWVzKGUsIFdvcmtQcm9kdWN0VHlwZS5jbGFzcywKLQkJCQlNb2RlbFN0cnVjdHVyZS5ERUZBVUxUX1dPUktfUFJPRFVDVF9UWVBFX1BBVEgpOwotCX0KLQotCS8qKgotCSAqIEdldHMgYWxsIHJvbGUgc2V0cyB0aGF0IGFyZSBhdmFpbGFibGUgdG8gdGhlIGdpdmVuIE1ldGhvZEVsZW1lbnQgb2JqZWN0LgotCSAqIAotCSAqIEBwYXJhbSBlCi0JICogQHJldHVybiBsaXN0IG9mIFJvbGVTZXQgb2JqZWN0cwotCSAqLwotCXB1YmxpYyBMaXN0IGdldEF2YWlsYWJsZVJvbGVTZXRzKE1ldGhvZEVsZW1lbnQgZSkgewotCQlyZXR1cm4gZ2V0QXZhaWxhYmxlQ2F0ZWdvcmllcyhlLCBSb2xlU2V0LmNsYXNzLAotCQkJCU1vZGVsU3RydWN0dXJlLkRFRkFVTFQucm9sZVNldFBhdGgpOwotCX0KLQotCS8qKgotCSAqIEdldHMgYWxsIGN1c3RvbSBjYXRlZ29yaWVzIHRoYXQgYXJlIGF2YWlsYWJsZSB0byB0aGUgZ2l2ZW4gTWV0aG9kRWxlbWVudAotCSAqIG9iamVjdC4KLQkgKiAKLQkgKiBAcGFyYW0gZQotCSAqIEByZXR1cm4gbGlzdCBvZiBSb2xlU2V0IG9iamVjdHMKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRBdmFpbGFibGVDdXN0b21DYXRlZ29yaWVzKE1ldGhvZEVsZW1lbnQgZSkgewotCQlMaXN0IGNhdGVnb3JpZXMgPSBnZXRBdmFpbGFibGVDYXRlZ29yaWVzKGUsIEN1c3RvbUNhdGVnb3J5LmNsYXNzLAotCQkJCU1vZGVsU3RydWN0dXJlLkRFRkFVTFRfQ1VTVE9NX0NBVEVHT1JZX1BBVEgpOwotCQkvLyBmaWx0ZXIgb3V0IHRoZSByb290IGN1c3RvbSBjYXRlZ29yaWVzCi0JCS8vCi0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGNhdGVnb3JpZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlpZiAoVG5nVXRpbC5pc1Jvb3RDdXN0b21DYXRlZ29yeSgoQ3VzdG9tQ2F0ZWdvcnkpIGl0ZXIubmV4dCgpKSkgewotCQkJCWl0ZXIucmVtb3ZlKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGNhdGVnb3JpZXM7Ci0JfQotCi0JLyoqCi0JICogR2V0cyBhbGwgdG9vbHMgdGhhdCBhcmUgYXZhaWxhYmxlIHRvIHRoZSBnaXZlbiBNZXRob2RFbGVtZW50IG9iamVjdC4KLQkgKiAKLQkgKiBAcGFyYW0gZQotCSAqIEByZXR1cm4gbGlzdCBvZiBUb29sIG9iamVjdHMKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRBdmFpbGFibGVUb29scyhNZXRob2RFbGVtZW50IGUpIHsKLQkJcmV0dXJuIGdldEF2YWlsYWJsZUNhdGVnb3JpZXMoZSwgVG9vbC5jbGFzcywKLQkJCQlNb2RlbFN0cnVjdHVyZS5ERUZBVUxULnRvb2xQYXRoKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIGFsbCBkaXNjaXBsaW5lIGdyb3VwaW5ncyB0aGF0IGFyZSBhdmFpbGFibGUgdG8gdGhlIGdpdmVuCi0JICogTWV0aG9kRWxlbWVudCBvYmplY3QuCi0JICogCi0JICogQHBhcmFtIGUKLQkgKiBAcmV0dXJuIGxpc3Qgb2YgUm9sZVNldCBvYmplY3RzCi0JICovCi0JcHVibGljIExpc3QgZ2V0QXZhaWxhYmxlRGlzY2lwbGluZUdyb3VwaW5ncyhNZXRob2RFbGVtZW50IGUpIHsKLQkJcmV0dXJuIGdldEF2YWlsYWJsZUNhdGVnb3JpZXMoZSwgRGlzY2lwbGluZUdyb3VwaW5nLmNsYXNzLAotCQkJCU1vZGVsU3RydWN0dXJlLkRFRkFVTFQuZGlzY2lwbGluZURlZmluaXRpb25QYXRoKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIGFsbCByb2xlIHNldCBncm91cGluZ3MgdGhhdCBhcmUgYXZhaWxhYmxlIHRvIHRoZSBnaXZlbiBNZXRob2RFbGVtZW50Ci0JICogb2JqZWN0LgotCSAqIAotCSAqIEBwYXJhbSBlCi0JICogQHJldHVybiBsaXN0IG9mIFJvbGVTZXQgb2JqZWN0cwotCSAqLwotCXB1YmxpYyBMaXN0IGdldEF2YWlsYWJsZVJvbGVTZXRHcm91cGluZ3MoTWV0aG9kRWxlbWVudCBlKSB7Ci0JCXJldHVybiBnZXRBdmFpbGFibGVDYXRlZ29yaWVzKGUsIFJvbGVTZXRHcm91cGluZy5jbGFzcywKLQkJCQlNb2RlbFN0cnVjdHVyZS5ERUZBVUxULnJvbGVTZXRQYXRoKTsKLQl9Ci0KLQkvKioKLQkgKiBhZGQgYSB0YXNrIHRvIGEgZGlzY2lwbGluZQotCSAqIAotCSAqIEBwYXJhbSBhY3Rpb25NZ3IKLQkgKiBAcGFyYW0gZGlzY2lwbGluZQotCSAqIEBwYXJhbSB0YXNrCi0JICogQHJldHVybiBEaXNjaXBsaW5lCi0JICovCi0JcHVibGljIERpc2NpcGxpbmUgYWRkVG9EaXNjaXBsaW5lKElBY3Rpb25NYW5hZ2VyIGFjdGlvbk1nciwKLQkJCURpc2NpcGxpbmUgZGlzY2lwbGluZSwgVGFzayB0YXNrLCBMaXN0IHVzZWRDYXRlZ29yaWVzKSB7Ci0JCXJldHVybiAoRGlzY2lwbGluZSkgYWRkVG9DYXRlZ29yeShhY3Rpb25NZ3IsIGRpc2NpcGxpbmUsIHRhc2ssCi0JCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RGlzY2lwbGluZV9UYXNrcygpLAotCQkJCU1vZGVsU3RydWN0dXJlLkRFRkFVTFQuZGlzY2lwbGluZURlZmluaXRpb25QYXRoLCB0cnVlLCB1c2VkQ2F0ZWdvcmllcyk7Ci0JfQotCi0JLyoqCi0JICogYWRkIGEgd29ya3Byb2R1Y3QgdG8gYSBkb21haW4KLQkgKiAKLQkgKiBAcGFyYW0gYWN0aW9uTWdyCi0JICogQHBhcmFtIGRvbWFpbgotCSAqIEBwYXJhbSB3cAotCSAqIEByZXR1cm4gRG9tYWluCi0JICovCi0JcHVibGljIERvbWFpbiBhZGRUb0RvbWFpbihJQWN0aW9uTWFuYWdlciBhY3Rpb25NZ3IsIERvbWFpbiBkb21haW4sCi0JCQlXb3JrUHJvZHVjdCB3cCwgTGlzdCB1c2VkQ2F0ZWdvcmllcykgewotCQlyZXR1cm4gKERvbWFpbikgYWRkVG9DYXRlZ29yeShhY3Rpb25NZ3IsIGRvbWFpbiwgd3AsCi0JCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RG9tYWluX1dvcmtQcm9kdWN0cygpLAotCQkJCU1vZGVsU3RydWN0dXJlLkRFRkFVTFQuZG9tYWluUGF0aCwgdHJ1ZSwgdXNlZENhdGVnb3JpZXMpOwotCX0KLQotCi0JLyoqCi0JICogYWRkIGEgd29yayBwcm9kdWN0IHRvIGEgV29ya1Byb2R1Y3RUeXBlCi0JICogCi0JICogQHBhcmFtIGFjdGlvbk1ncgotCSAqIEBwYXJhbSB3cFR5cGUKLQkgKiBAcGFyYW0gd3AKLQkgKiBAcmV0dXJuIFdvcmtQcm9kdWN0VHlwZQotCSAqLwotCXB1YmxpYyBXb3JrUHJvZHVjdFR5cGUgYWRkVG9Xb3JrUHJvZHVjdFR5cGUoSUFjdGlvbk1hbmFnZXIgYWN0aW9uTWdyLAotCQkJV29ya1Byb2R1Y3RUeXBlIHdwVHlwZSwgV29ya1Byb2R1Y3Qgd3AsIExpc3QgdXNlZENhdGVnb3JpZXMpIHsKLQkJcmV0dXJuIChXb3JrUHJvZHVjdFR5cGUpIGFkZFRvQ2F0ZWdvcnkoYWN0aW9uTWdyLCB3cFR5cGUsIHdwLAotCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFdvcmtQcm9kdWN0VHlwZV9Xb3JrUHJvZHVjdHMoKSwKLQkJCQlNb2RlbFN0cnVjdHVyZS5ERUZBVUxULndvcmtQcm9kdWN0VHlwZVBhdGgsIHRydWUsIHVzZWRDYXRlZ29yaWVzKTsKLQl9Ci0KLQotCi0JLyoqCi0JICogYWRkIGFuIGVsZW1lbnQgdG8gYSBDdXN0b21DYXRlZ29yeQotCSAqIAotCSAqIEBwYXJhbSBhY3Rpb25NZ3IKLQkgKiBAcGFyYW0gdXNlckRlZmluZWRDYXRlZ29yeQotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogQHJldHVybiBDdXN0b21DYXRlZ29yeQotCSAqLwotCXB1YmxpYyBDdXN0b21DYXRlZ29yeSBhZGRUb0N1c3RvbUNhdGVnb3J5KElBY3Rpb25NYW5hZ2VyIGFjdGlvbk1nciwKLQkJCUN1c3RvbUNhdGVnb3J5IHVzZXJEZWZpbmVkQ2F0ZWdvcnksIE1ldGhvZEVsZW1lbnQgZWxlbWVudCwgTGlzdCB1c2VkQ2F0ZWdvcmllcykgewotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIERlc2NyaWJhYmxlRWxlbWVudCkgewotCQkJcmV0dXJuIChDdXN0b21DYXRlZ29yeSkgYWRkVG9DYXRlZ29yeShhY3Rpb25NZ3IsCi0JCQkJCXVzZXJEZWZpbmVkQ2F0ZWdvcnksIGVsZW1lbnQsIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJLmdldEN1c3RvbUNhdGVnb3J5X0NhdGVnb3JpemVkRWxlbWVudHMoKSwKLQkJCQkJTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC5jdXN0b21DYXRlZ29yeVBhdGgsIHRydWUsIHVzZWRDYXRlZ29yaWVzKTsKLQkJfQotCi0JCS8vIGlmKGVsZW1lbnQgaW5zdGFuY2VvZiBDb250ZW50RWxlbWVudCkgewotCQkvLyByZXR1cm4gKEN1c3RvbUNhdGVnb3J5KSBhZGRUb0NhdGVnb3J5KGFjdGlvbk1nciwgdXNlckRlZmluZWRDYXRlZ29yeSwKLQkJLy8gZWxlbWVudCwKLQkJLy8gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q3VzdG9tQ2F0ZWdvcnlfQ2F0ZWdvcml6ZWRFbGVtZW50cygpLAotCQkvLyBNb2RlbFN0cnVjdHVyZS5ERUZBVUxULmN1c3RvbUNhdGVnb3J5UGF0aCwgdHJ1ZSk7Ci0JCS8vIH0KLQkJLy8gZWxzZSBpZihlbGVtZW50IGluc3RhbmNlb2YgQ29udGVudENhdGVnb3J5KSB7Ci0JCS8vIHJldHVybiAoQ3VzdG9tQ2F0ZWdvcnkpIGFkZFRvQ2F0ZWdvcnkoYWN0aW9uTWdyLCB1c2VyRGVmaW5lZENhdGVnb3J5LAotCQkvLyBlbGVtZW50LCBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRDdXN0b21DYXRlZ29yeV9TdWJDYXRlZ29yaWVzKCksCi0JCS8vIE1vZGVsU3RydWN0dXJlLkRFRkFVTFQuY3VzdG9tQ2F0ZWdvcnlQYXRoLCB0cnVlKTsKLQkJLy8gfQotCQkvLyBlbHNlIGlmKGVsZW1lbnQgaW5zdGFuY2VvZiBQcm9jZXNzKXsKLQkJLy8gcmV0dXJuIChDdXN0b21DYXRlZ29yeSkgYWRkVG9DYXRlZ29yeShhY3Rpb25NZ3IsIHVzZXJEZWZpbmVkQ2F0ZWdvcnksCi0JCS8vIGVsZW1lbnQsIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEN1c3RvbUNhdGVnb3J5X1Byb2Nlc3NFbGVtZW50cygpLAotCQkvLyBNb2RlbFN0cnVjdHVyZS5ERUZBVUxULmN1c3RvbUNhdGVnb3J5UGF0aCwgdHJ1ZSk7Ci0JCS8vIH0KLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQotCS8qKgotCSAqIGFkZCBhIHRvb2xtZW50b3IgdG8gYSBUb29sCi0JICogCi0JICogQHBhcmFtIGFjdGlvbk1ncgotCSAqIEBwYXJhbSB0b29sCi0JICogQHBhcmFtIHRvb2xNZW50b3IKLQkgKiBAcmV0dXJuIFRvb2wKLQkgKi8KLQlwdWJsaWMgVG9vbCBhZGRUb1Rvb2woSUFjdGlvbk1hbmFnZXIgYWN0aW9uTWdyLCBUb29sIHRvb2wsCi0JCQlUb29sTWVudG9yIHRvb2xNZW50b3IsIExpc3QgdXNlZENhdGVnb3JpZXMpIHsKLQkJcmV0dXJuIChUb29sKSBhZGRUb0NhdGVnb3J5KGFjdGlvbk1nciwgdG9vbCwgdG9vbE1lbnRvciwKLQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUb29sX1Rvb2xNZW50b3JzKCksCi0JCQkJTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC50b29sUGF0aCwgdHJ1ZSwgdXNlZENhdGVnb3JpZXMpOwotCX0KLQotCi0JLyoqCi0JICogYWRkIGEgcm9sZSB0byBhIFJvbGVTZXQKLQkgKiBAcGFyYW0gYWN0aW9uTWdyCi0JICogQHBhcmFtIHJvbGVTZXQKLQkgKiBAcGFyYW0gcm9sZQotCSAqIEByZXR1cm4gUm9sZVNldAotCSAqLwotCXB1YmxpYyBSb2xlU2V0IGFkZFRvUm9sZVNldChJQWN0aW9uTWFuYWdlciBhY3Rpb25NZ3IsIFJvbGVTZXQgcm9sZVNldCwKLQkJCVJvbGUgcm9sZSwgTGlzdCB1c2VkQ2F0ZWdvcmllcykgewotCQlyZXR1cm4gKFJvbGVTZXQpIGFkZFRvQ2F0ZWdvcnkoYWN0aW9uTWdyLCByb2xlU2V0LCByb2xlLAotCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFJvbGVTZXRfUm9sZXMoKSwKLQkJCQlNb2RlbFN0cnVjdHVyZS5ERUZBVUxULnJvbGVTZXRQYXRoLCB0cnVlLCB1c2VkQ2F0ZWdvcmllcyk7Ci0JfQotCi0JLyoqCi0JICogQWRkcyBhIG1ldGhvZCBlbGVtZW50IHRvIHRoZSBjYXRlZ29yeS4gVGhpcyBtZXRob2QgbWlnaHQgY3JlYXRlIGEgbmV3Ci0JICogY29udHJpYnV0b3IgdG8gdGhlIGdpdmVuIGNhdGVnb3J5IGluIHRoZSBtZXRob2QgZWxlbWVudCdzIHBsdWdpbiBpZiB0aGUKLQkgKiBnaXZlbiBjYXRlZ29yeSBiZWxvbmdzIHRvIHRoZSBiYXNlIHBsdWdpbiBvZiB0aGUgbWV0aG9kIGVsZW1lbnQncyBwbHVnaW4uCi0JICogCi0JICogQHBhcmFtIGFjdGlvbk1ncgotCSAqIEBwYXJhbSBjYXRlZ29yeQotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogQHBhcmFtIGZlYXR1cmUKLQkgKiBAcGFyYW0gY2F0ZWdvcnlQa2dQYXRoCi0JICogQHBhcmFtIGNoZWNrRm9yRXhpc3RpbmdDb250cmlidXRvcgotCSAqIEByZXR1cm4gdGhlIGFjdHVhbCBjYXRlZ29yeSB0aGF0IHRoZSBnaXZlbiBtZXRob2QgZWxlbWVudCBpcyBhZGRlZCB0bwotCSAqLwotCXB1YmxpYyBDb250ZW50Q2F0ZWdvcnkgYWRkVG9DYXRlZ29yeShJQWN0aW9uTWFuYWdlciBhY3Rpb25NZ3IsCi0JCQlDb250ZW50Q2F0ZWdvcnkgY2F0ZWdvcnksIE1ldGhvZEVsZW1lbnQgZWxlbWVudCwKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBTdHJpbmdbXSBjYXRlZ29yeVBrZ1BhdGgsCi0JCQlib29sZWFuIGNoZWNrRm9yRXhpc3RpbmdDb250cmlidXRvciwgTGlzdCB1c2VkQ2F0ZWdvcmllcykgewotCQlBZGRUb0NhdGVnb3J5Q29tbWFuZCBjbWQgPSBuZXcgQWRkVG9DYXRlZ29yeUNvbW1hbmQoY2F0ZWdvcnksIGVsZW1lbnQsCi0JCQkJZmVhdHVyZSwgY2F0ZWdvcnlQa2dQYXRoLCBjaGVja0ZvckV4aXN0aW5nQ29udHJpYnV0b3IsIHVzZWRDYXRlZ29yaWVzKTsKLQkJYWN0aW9uTWdyLmV4ZWN1dGUoY21kKTsKLQkJcmV0dXJuIChDb250ZW50Q2F0ZWdvcnkpICgoTGlzdCkgY21kLmdldEFmZmVjdGVkT2JqZWN0cygpKS5nZXQoMCk7Ci0JfQotCi0vLwlwdWJsaWMgdm9pZCBzZXRSZXNwb25zaWJsZVJvbGUoSUFjdGlvbk1hbmFnZXIgYWN0aW9uTWdyLCBXb3JrUHJvZHVjdCB3cCwKLS8vCQkJUm9sZSByb2xlKSB7Ci0vLwkJSVJlc291cmNlQXdhcmVDb21tYW5kIGNtZCA9IG5ldyBTZXRPcHBvc2l0ZUZlYXR1cmVDb21tYW5kKHdwLAotLy8JCQkJQXNzb2NpYXRpb25IZWxwZXIuV29ya1Byb2R1Y3RfUmVzcG9uc2libGVSb2xlLCByb2xlKTsKLS8vCQlhY3Rpb25NZ3IuZXhlY3V0ZShjbWQpOwotLy8JfQotCi0JLyoqCi0JICogUmVtb3ZlcyB0aGUgbWV0aG9kIGVsZW1lbnQgZnJvbSB0aGUgY2F0ZWdvcnkuIFRoaXMgbWV0aG9kIG1pZ2h0IGRlbGV0ZQotCSAqIHRoZSBjYXRlZ29yeSBpZiBpdCBpcyBhIGNvbnRyaWJ1dG9yIGFuZCBiZWNhbWUgZW1wdHkgYWZ0ZXIgdGhlIHJlbW92YWwgb2YKLQkgKiB0aGUgbWV0aG9kIGVsZW1lbnQuCi0JICogCi0JICogQHBhcmFtIGNhdGVnb3J5Ci0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiBAcGFyYW0gZmVhdHVyZQotCSAqICAgICAgICAgICAgZmVhdHVyZSB0aGF0IGNvbnRhaW5zIHRoZSBnaXZlbiBtZXRob2QgZWxlbWVudAotCSAqIEBwYXJhbSBjb250ZW50UGtnUGF0aAotCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgbWV0aG9kIGVsZW1lbnQgaXMgc3VjY2Vzc2Z1bGx5IHJlbW92ZWQsIGZhbHNlCi0JICogICAgICAgICBvdGhlcndpc2UuCi0JICovCi0JcHVibGljIGJvb2xlYW4gcmVtb3ZlRnJvbUNhdGVnb3J5KElBY3Rpb25NYW5hZ2VyIGFjdGlvbk1nciwKLQkJCUNvbnRlbnRDYXRlZ29yeSBjYXRlZ29yeSwgTWV0aG9kRWxlbWVudCBlbGVtZW50LAotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIFN0cmluZ1tdIGNvbnRlbnRQa2dQYXRoLCBMaXN0IHVzZWRDYXRlZ29yaWVzKSB7Ci0JCUlSZXNvdXJjZUF3YXJlQ29tbWFuZCBjbWQgPSBuZXcgUmVtb3ZlRnJvbUNhdGVnb3J5Q29tbWFuZChjYXRlZ29yeSwKLQkJCQllbGVtZW50LCBmZWF0dXJlLCBjb250ZW50UGtnUGF0aCwgdXNlZENhdGVnb3JpZXMpOwotCQlhY3Rpb25NZ3IuZXhlY3V0ZShjbWQpOwotCQlyZXR1cm4gIWNtZC5nZXRSZXN1bHQoKS5pc0VtcHR5KCk7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlcyB0aGUgbWV0aG9kIGVsZW1lbnQgZnJvbSB0aGUgY2F0ZWdvcnkuIFRoaXMgbWV0aG9kIG1pZ2h0IGRlbGV0ZQotCSAqIHRoZSBjYXRlZ29yeSBpZiBpdCBpcyBhIGNvbnRyaWJ1dG9yIGFuZCBiZWNhbWUgZW1wdHkgYWZ0ZXIgdGhlIHJlbW92YWwgb2YKLQkgKiB0aGUgbWV0aG9kIGVsZW1lbnQuCi0JICogCi0JICogQHBhcmFtIGNhdGVnb3J5Ci0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiBAcGFyYW0gZmVhdHVyZQotCSAqICAgICAgICAgICAgZmVhdHVyZSB0aGF0IGNvbnRhaW5zIHRoZSBnaXZlbiBtZXRob2QgZWxlbWVudAotCSAqIEBwYXJhbSBlbGVtZW50RmVhdHVyZXMKLQkgKiAgICAgICAgICAgIGZlYXR1cmVzIHRvIGNoZWNrIGZvciBlbXB0aW5lc3MgYmVmb3JlIGRlbGV0aW5nIHRoZSBjYXRlZ29yeQotCSAqIEBwYXJhbSBjb250ZW50UGtnUGF0aAotCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgbWV0aG9kIGVsZW1lbnQgaXMgc3VjY2Vzc2Z1bGx5IHJlbW92ZWQsIGZhbHNlCi0JICogICAgICAgICBvdGhlcndpc2UuCi0JICovCi0JLy8gcHVibGljIGJvb2xlYW4gcmVtb3ZlRnJvbUNhdGVnb3J5KENvbnRlbnRDYXRlZ29yeSBjYXRlZ29yeSwgTWV0aG9kRWxlbWVudAotCS8vIGVsZW1lbnQsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBFU3RydWN0dXJhbEZlYXR1cmVbXQotCS8vIGVsZW1lbnRGZWF0dXJlcywgU3RyaW5nW10gY29udGVudFBrZ1BhdGgpIHsKLQkvLyBib29sZWFuIHJldDsKLQkvLyBib29sZWFuIGVtcHR5ID0gZmFsc2U7Ci0JLy8gTWV0aG9kUGx1Z2luIGNhdGVnb3J5UGx1Z2luID0gVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4oY2F0ZWdvcnkpOwotCS8vIE1ldGhvZFBsdWdpbiBlbGVtZW50UGx1Z2luID0gVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4oZWxlbWVudCk7Ci0JLy8gQ29udGVudENhdGVnb3J5IHVzZWRDYXRlZ29yeTsKLQkvLyBpZihjYXRlZ29yeVBsdWdpbiAhPSBlbGVtZW50UGx1Z2luKSB7Ci0JLy8gdXNlZENhdGVnb3J5ID0KLQkvLyBUbmdVdGlsLmZpbmRDb250cmlidXRvcihVbWFVdGlsLmZpbmRDb250ZW50UGFja2FnZShlbGVtZW50UGx1Z2luLAotCS8vIGNvbnRlbnRQa2dQYXRoKSwgY2F0ZWdvcnkpOwotCS8vIGlmKHVzZWRDYXRlZ29yeSA9PSBudWxsKSByZXR1cm4gZmFsc2U7Ci0JLy8gfQotCS8vIGVsc2UgewotCS8vIHVzZWRDYXRlZ29yeSA9IGNhdGVnb3J5OwotCS8vIH0KLQkvLyBpZihmZWF0dXJlLmlzTWFueSgpKSB7Ci0JLy8gQ29sbGVjdGlvbiBjb2xsZWN0aW9uID0gKENvbGxlY3Rpb24pIHVzZWRDYXRlZ29yeS5lR2V0KGZlYXR1cmUpOwotCS8vIHJldCA9IGNvbGxlY3Rpb24ucmVtb3ZlKGVsZW1lbnQpOwotCS8vIGVtcHR5ID0gdHJ1ZTsKLQkvLyAvL1RPRE86IG5lZWQgcmV2aXNpdCB0byBmaW5kIGJldHRlciB3YXkgdG8gcmVtb3ZlIHRoZSBlbXB0eSBjb250cmlidXRvcnMKLQkvLyB3aXRob3V0IGFkZGluZyB0byBtdWNoIHdvcmsgb24gaW4gdGhlIFVJIGNvZGUKLQkvLyAvLwotCS8vIC8vIGZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudEZlYXR1cmVzLmxlbmd0aDsgaSsrKSB7Ci0JLy8gLy8gY29sbGVjdGlvbiA9IChDb2xsZWN0aW9uKSBjYXRlZ29yeS5lR2V0KGVsZW1lbnRGZWF0dXJlc1tpXSk7Ci0JLy8gLy8gaWYoIWNvbGxlY3Rpb24uaXNFbXB0eSgpKSB7Ci0JLy8gLy8gZW1wdHkgPSBmYWxzZTsKLQkvLyAvLyBicmVhazsKLQkvLyAvLyB9Ci0JLy8gLy8gfQotCS8vIH0KLQkvLyBlbHNlIHsKLQkvLyB1c2VkQ2F0ZWdvcnkuZVNldChmZWF0dXJlLCBudWxsKTsKLQkvLyByZXQgPSB0cnVlOwotCS8vIH0KLQkvLyAvLyBpZihjYXRlZ29yeS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkgIT0gbnVsbCAmJiBlbXB0eSkgewotCS8vIC8vIEVjb3JlVXRpbC5yZW1vdmUoY2F0ZWdvcnkpOwotCS8vIC8vIH0KLQkvLyByZXR1cm4gcmV0OwotCS8vIH0KLQkvLyBwdWJsaWMgYm9vbGVhbiByZW1vdmVGcm9tRGlzY2lwbGluZShEaXNjaXBsaW5lIGRpc2NpcGxpbmUsIFRhc2sgdGFzaykgewotCS8vIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RGlzY2lwbGluZV9UYXNrcygpOwotCS8vIHJldHVybiByZW1vdmVGcm9tQ2F0ZWdvcnkoZGlzY2lwbGluZSwgdGFzaywgZmVhdHVyZSwgbmV3Ci0JLy8gRVN0cnVjdHVyYWxGZWF0dXJlW10geyBmZWF0dXJlIH0sCi0JLy8gTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC5kaXNjaXBsaW5lRGVmaW5pdGlvblBhdGgpOwotCS8vIH0KLQlwdWJsaWMgYm9vbGVhbiByZW1vdmVGcm9tRGlzY2lwbGluZShJQWN0aW9uTWFuYWdlciBhY3Rpb25NZ3IsCi0JCQlEaXNjaXBsaW5lIGRpc2NpcGxpbmUsIFRhc2sgdGFzaywgTGlzdCB1c2VkQ2F0ZWdvcmllcykgewotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldERpc2NpcGxpbmVfVGFza3MoKTsKLQkJcmV0dXJuIHJlbW92ZUZyb21DYXRlZ29yeShhY3Rpb25NZ3IsIGRpc2NpcGxpbmUsIHRhc2ssIGZlYXR1cmUsCi0JCQkJTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC5kaXNjaXBsaW5lRGVmaW5pdGlvblBhdGgsIHVzZWRDYXRlZ29yaWVzKTsKLQl9Ci0KLQkvLyBwdWJsaWMgYm9vbGVhbiByZW1vdmVGcm9tRG9tYWluKERvbWFpbiBkb21haW4sIFdvcmtQcm9kdWN0IHdwKSB7Ci0JLy8gRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPQotCS8vIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldERvbWFpbl9Xb3JrUHJvZHVjdHMoKTsKLQkvLyByZXR1cm4gcmVtb3ZlRnJvbUNhdGVnb3J5KGRvbWFpbiwgd3AsIGZlYXR1cmUsIG5ldyBFU3RydWN0dXJhbEZlYXR1cmVbXSB7Ci0JLy8gZmVhdHVyZSB9LCBNb2RlbFN0cnVjdHVyZS5ERUZBVUxULmRvbWFpblBhdGgpOwotCS8vIH0KLQotCXB1YmxpYyBib29sZWFuIHJlbW92ZUZyb21Eb21haW4oSUFjdGlvbk1hbmFnZXIgYWN0aW9uTWdyLCBEb21haW4gZG9tYWluLAotCQkJV29ya1Byb2R1Y3Qgd3AsIExpc3QgdXNlZENhdGVnb3JpZXMpIHsKLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXREb21haW5fV29ya1Byb2R1Y3RzKCk7Ci0JCXJldHVybiByZW1vdmVGcm9tQ2F0ZWdvcnkoYWN0aW9uTWdyLCBkb21haW4sIHdwLCBmZWF0dXJlLAotCQkJCU1vZGVsU3RydWN0dXJlLkRFRkFVTFQuZG9tYWluUGF0aCwgdXNlZENhdGVnb3JpZXMpOwotCX0KLQotCS8vIHB1YmxpYyBib29sZWFuIHJlbW92ZUZyb21Xb3JrUHJvZHVjdFR5cGUoV29ya1Byb2R1Y3RUeXBlIHdwVHlwZSwKLQkvLyBXb3JrUHJvZHVjdCB3cCkgewotCS8vIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0KLQkvLyBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRXb3JrUHJvZHVjdFR5cGVfV29ya1Byb2R1Y3RzKCk7Ci0JLy8gcmV0dXJuIHJlbW92ZUZyb21DYXRlZ29yeSh3cFR5cGUsIHdwLCBmZWF0dXJlLCBuZXcgRVN0cnVjdHVyYWxGZWF0dXJlW10gewotCS8vIGZlYXR1cmUgfSwgTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC53b3JrUHJvZHVjdFR5cGVQYXRoKTsKLQkvLyB9Ci0KLQlwdWJsaWMgYm9vbGVhbiByZW1vdmVGcm9tV29ya1Byb2R1Y3RUeXBlKElBY3Rpb25NYW5hZ2VyIGFjdGlvbk1nciwKLQkJCVdvcmtQcm9kdWN0VHlwZSB3cFR5cGUsIFdvcmtQcm9kdWN0IHdwLCBMaXN0IHVzZWRDYXRlZ29yaWVzKSB7Ci0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0V29ya1Byb2R1Y3RUeXBlX1dvcmtQcm9kdWN0cygpOwotCQlyZXR1cm4gcmVtb3ZlRnJvbUNhdGVnb3J5KGFjdGlvbk1nciwgd3BUeXBlLCB3cCwgZmVhdHVyZSwKLQkJCQlNb2RlbFN0cnVjdHVyZS5ERUZBVUxULndvcmtQcm9kdWN0VHlwZVBhdGgsIHVzZWRDYXRlZ29yaWVzKTsKLQl9Ci0KLQkvLyBwdWJsaWMgYm9vbGVhbiByZW1vdmVGcm9tUm9sZVNldChSb2xlU2V0IHJvbGVTZXQsIFJvbGUgcm9sZSkgewotCS8vIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Um9sZVNldF9Sb2xlcygpOwotCS8vIHJldHVybiByZW1vdmVGcm9tQ2F0ZWdvcnkocm9sZVNldCwgcm9sZSwgZmVhdHVyZSwgbmV3Ci0JLy8gRVN0cnVjdHVyYWxGZWF0dXJlW10geyBmZWF0dXJlIH0sIE1vZGVsU3RydWN0dXJlLkRFRkFVTFQucm9sZVNldFBhdGgpOwotCS8vIH0KLQotCXB1YmxpYyBib29sZWFuIHJlbW92ZUZyb21Sb2xlU2V0KElBY3Rpb25NYW5hZ2VyIGFjdGlvbk1nciwgUm9sZVNldCByb2xlU2V0LAotCQkJUm9sZSByb2xlLCBMaXN0IHVzZWRDYXRlZ29yaWVzKSB7Ci0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Um9sZVNldF9Sb2xlcygpOwotCQlyZXR1cm4gcmVtb3ZlRnJvbUNhdGVnb3J5KGFjdGlvbk1nciwgcm9sZVNldCwgcm9sZSwgZmVhdHVyZSwKLQkJCQlNb2RlbFN0cnVjdHVyZS5ERUZBVUxULnJvbGVTZXRQYXRoLCB1c2VkQ2F0ZWdvcmllcyk7Ci0JfQotCi0JLy8gcHVibGljIGJvb2xlYW4gcmVtb3ZlRnJvbVRvb2woVG9vbCB0b29sLCBUb29sTWVudG9yIHRvb2xNZW50b3IpIHsKLQkvLyBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRvb2xfVG9vbE1lbnRvcnMoKTsKLQkvLyByZXR1cm4gcmVtb3ZlRnJvbUNhdGVnb3J5KHRvb2wsIHRvb2xNZW50b3IsIGZlYXR1cmUsIG5ldwotCS8vIEVTdHJ1Y3R1cmFsRmVhdHVyZVtdIHsgZmVhdHVyZSB9LCBNb2RlbFN0cnVjdHVyZS5ERUZBVUxULnRvb2xQYXRoKTsKLQkvLyB9Ci0KLQlwdWJsaWMgYm9vbGVhbiByZW1vdmVGcm9tVG9vbChJQWN0aW9uTWFuYWdlciBhY3Rpb25NZ3IsIFRvb2wgdG9vbCwKLQkJCVRvb2xNZW50b3IgdG9vbE1lbnRvciwgTGlzdCB1c2VkQ2F0ZWdvcmllcykgewotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRvb2xfVG9vbE1lbnRvcnMoKTsKLQkJcmV0dXJuIHJlbW92ZUZyb21DYXRlZ29yeShhY3Rpb25NZ3IsIHRvb2wsIHRvb2xNZW50b3IsIGZlYXR1cmUsCi0JCQkJTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC50b29sUGF0aCwgdXNlZENhdGVnb3JpZXMpOwotCX0KLQotCS8vIHB1YmxpYyBib29sZWFuIHJlbW92ZUZyb21DdXN0b21DYXRlZ29yeShDdXN0b21DYXRlZ29yeQotCS8vIHVzZXJEZWZpbmVkQ2F0ZWdvcnksIE1ldGhvZEVsZW1lbnQgZSkgewotCS8vIEVTdHJ1Y3R1cmFsRmVhdHVyZSBjb250ZW50RWxlbWVudEZlYXR1cmUgPQotCS8vIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEN1c3RvbUNhdGVnb3J5X0NhdGVnb3JpemVkRWxlbWVudHMoKTsKLQkvLyBFU3RydWN0dXJhbEZlYXR1cmUgY29udGVudENhdGVnb3J5RmVhdHVyZSA9Ci0JLy8gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q3VzdG9tQ2F0ZWdvcnlfU3ViQ2F0ZWdvcmllcygpOwotCS8vIEVTdHJ1Y3R1cmFsRmVhdHVyZVtdIGZlYXR1cmVzID0geyBjb250ZW50RWxlbWVudEZlYXR1cmUsCi0JLy8gY29udGVudENhdGVnb3J5RmVhdHVyZSB9OwotCS8vIGlmKGUgaW5zdGFuY2VvZiBDb250ZW50RWxlbWVudCkgewotCS8vIHJldHVybiByZW1vdmVGcm9tQ2F0ZWdvcnkodXNlckRlZmluZWRDYXRlZ29yeSwgZSwgY29udGVudEVsZW1lbnRGZWF0dXJlLAotCS8vIGZlYXR1cmVzLCBNb2RlbFN0cnVjdHVyZS5ERUZBVUxULmN1c3RvbUNhdGVnb3J5UGF0aCk7Ci0JLy8gfQotCS8vIGVsc2UgaWYoZSBpbnN0YW5jZW9mIENvbnRlbnRDYXRlZ29yeSkgewotCS8vIHJldHVybiByZW1vdmVGcm9tQ2F0ZWdvcnkodXNlckRlZmluZWRDYXRlZ29yeSwgZSwgY29udGVudENhdGVnb3J5RmVhdHVyZSwKLQkvLyBmZWF0dXJlcywgTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC5jdXN0b21DYXRlZ29yeVBhdGgpOwotCS8vIH0KLQkvLyByZXR1cm4gZmFsc2U7Ci0JLy8gfQotCi0JcHVibGljIGJvb2xlYW4gcmVtb3ZlRnJvbUN1c3RvbUNhdGVnb3J5KElBY3Rpb25NYW5hZ2VyIGFjdGlvbk1nciwKLQkJCUN1c3RvbUNhdGVnb3J5IHVzZXJEZWZpbmVkQ2F0ZWdvcnksIE1ldGhvZEVsZW1lbnQgZSwgTGlzdCB1c2VkQ2F0ZWdvcmllcykgewotCQlpZiAoZSBpbnN0YW5jZW9mIERlc2NyaWJhYmxlRWxlbWVudCkgewotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkuZ2V0Q3VzdG9tQ2F0ZWdvcnlfQ2F0ZWdvcml6ZWRFbGVtZW50cygpOwotCQkJcmV0dXJuIHJlbW92ZUZyb21DYXRlZ29yeShhY3Rpb25NZ3IsIHVzZXJEZWZpbmVkQ2F0ZWdvcnksIGUsCi0JCQkJCWZlYXR1cmUsIE1vZGVsU3RydWN0dXJlLkRFRkFVTFQuY3VzdG9tQ2F0ZWdvcnlQYXRoLCB1c2VkQ2F0ZWdvcmllcyk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIENhbGwgdGhpcyBtZXRob2QgYmVmb3JlIHRoZSBlZGl0b3IgY2xvc2VzLCBwYXNzaW5nIGluIGFsbCB0aGUgY2F0ZWdvcmllcwotCSAqIHRoYXQgeW91IGhhdmUgcmV0cmlldmVkIHdpdGggZ2V0QXZhaWxhYmxlWFhYKCkgZm9yIHRoZSBlZGl0b3IKLQkgKiAKLQkgKiBAcGFyYW0gY29uc3VtZXIKLQkgKiBAcGFyYW0gY2F0ZWdvcmllcwotCSAqLwotCXB1YmxpYyB2b2lkIHJlbGVhc2VDYXRlZ29yaWVzKE1ldGhvZEVsZW1lbnQgY29uc3VtZXIsIENvbGxlY3Rpb24gY2F0ZWdvcmllcykgewotCQlNZXRob2RQbHVnaW4gY29uc3VtZXJQbHVnaW4gPSBVbWFVdGlsLmdldE1ldGhvZFBsdWdpbihjb25zdW1lcik7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGNhdGVnb3JpZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlDb250ZW50Q2F0ZWdvcnkgY2F0ZWdvcnkgPSAoQ29udGVudENhdGVnb3J5KSBpdGVyLm5leHQoKTsKLQkJCU1ldGhvZFBsdWdpbiBjYXRlZ29yeVBsdWdpbiA9IFVtYVV0aWwuZ2V0TWV0aG9kUGx1Z2luKGNhdGVnb3J5KTsKLQkJCWlmIChjYXRlZ29yeS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkgIT0gbnVsbAotCQkJCQkmJiBjYXRlZ29yeVBsdWdpbiA9PSBjb25zdW1lclBsdWdpbgotCQkJCQkmJiBUbmdVdGlsLmlzRW1wdHkoY2F0ZWdvcnkpKSB7Ci0JCQkJRWNvcmVVdGlsLnJlbW92ZShjYXRlZ29yeSk7Ci0JCQkJaWYgKGNhdGVnb3J5IGluc3RhbmNlb2YgQ3VzdG9tQ2F0ZWdvcnkpIHsKLQkJCQkJVG5nVXRpbC5nZXRSb290Q3VzdG9tQ2F0ZWdvcnkoY2F0ZWdvcnlQbHVnaW4pCi0JCQkJCQkJLmdldENhdGVnb3JpemVkRWxlbWVudHMoKS5yZW1vdmUoY2F0ZWdvcnkpOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJU3RyaW5nW10gcGF0aCA9IGdldENhdGVnb3J5UGFja2FnZVBhdGgoY2F0ZWdvcnkpOwotCQkJCS8vIHBhdGggY2FuIGJlIG51bGwgaWYgdGhlIGNhdGVnb3J5IGlzIGRlbGV0ZWQKLQkJCQkvLwotCQkJCWlmIChwYXRoICE9IG51bGwpIHsKLQkJCQkJQ29udGVudFBhY2thZ2UgY2F0ZWdvcnlQa2cgPSBVbWFVdGlsLmZpbmRDb250ZW50UGFja2FnZSgKLQkJCQkJCQljb25zdW1lclBsdWdpbiwgcGF0aCk7Ci0JCQkJCUNvbnRlbnRDYXRlZ29yeSBjb250cmlidXRvciA9IFRuZ1V0aWwuZmluZENvbnRyaWJ1dG9yKAotCQkJCQkJCWNhdGVnb3J5UGtnLCBjYXRlZ29yeSk7Ci0JCQkJCWlmIChjb250cmlidXRvciAhPSBudWxsICYmIFRuZ1V0aWwuaXNFbXB0eShjb250cmlidXRvcikpIHsKLQkJCQkJCUVjb3JlVXRpbC5yZW1vdmUoY29udHJpYnV0b3IpOwotCQkJCQkJaWYgKGNvbnRyaWJ1dG9yIGluc3RhbmNlb2YgQ3VzdG9tQ2F0ZWdvcnkpIHsKLQkJCQkJCQlUbmdVdGlsLmdldFJvb3RDdXN0b21DYXRlZ29yeShjb25zdW1lclBsdWdpbikKLQkJCQkJCQkJCS5nZXRDYXRlZ29yaXplZEVsZW1lbnRzKCkucmVtb3ZlKGNvbnRyaWJ1dG9yKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBjYXRlZ29yeQotCSAqIEByZXR1cm4gTGlzdAotCSAqLwotCXB1YmxpYyBMaXN0IGdldEF2YWlsYWJsZVRhc2tzKENvbnRlbnRDYXRlZ29yeSBjYXRlZ29yeSkgewotCQlyZXR1cm4gZ2V0QXZhaWxhYmxlQ29udGVudEVsZW1lbnRzKFRhc2suY2xhc3MsIGNhdGVnb3J5LCBmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIGNhdGVnb3J5Ci0JICogQHJldHVybiBMaXN0Ci0JICovCi0JcHVibGljIExpc3QgZ2V0QXZhaWxhYmxlV29ya1Byb2R1Y3RzKENvbnRlbnRDYXRlZ29yeSBjYXRlZ29yeSkgewotCQkvLyAvLyBzcGVjaWFsIGhhbmRsaW5nIHRvIGRpc2FsbG93IGFzc2lnbWVudCBvZiB3b3JrIHByb2R1Y3RzIHRvIGRvbWFpbgotCQkvLyB3aXRoIHN1YmRvbWFpbnMKLQkJLy8gLy8KLQkJLy8gaWYoY2F0ZWdvcnkgaW5zdGFuY2VvZiBEb21haW4gJiYKLQkJLy8gISgoRG9tYWluKWNhdGVnb3J5KS5nZXRTdWJkb21haW5zKCkuaXNFbXB0eSgpKSB7Ci0JCS8vIHJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCQkvLyB9Ci0KLQkJcmV0dXJuIGdldEF2YWlsYWJsZUNvbnRlbnRFbGVtZW50cyhXb3JrUHJvZHVjdC5jbGFzcywgY2F0ZWdvcnksIGZhbHNlKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gY2F0ZWdvcnkKLQkgKiBAcmV0dXJuIExpc3QKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRBdmFpbGFibGVSb2xlcyhDb250ZW50Q2F0ZWdvcnkgY2F0ZWdvcnkpIHsKLQkJcmV0dXJuIGdldEF2YWlsYWJsZUNvbnRlbnRFbGVtZW50cyhSb2xlLmNsYXNzLCBjYXRlZ29yeSwgZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIEdldHMgYWxsIGNvbnRlbnQgZWxlbWVudHMgdGhhdCBhcmUgYXZhaWxhYmxlIHRvIHRoZSBnaXZlbiBjb250ZW50IGVsZW1lbnQKLQkgKiB0byByZWZlcmVuY2UgdG8KLQkgKiAKLQkgKiBAcGFyYW0gbWV0aG9kRWxlbWVudFR5cGUKLQkgKiAgICAgICAgICAgIGNvbmNyZWN0IGNsYXNzIG9mIHRoZSB0aGUgZ2l2ZW4gY29udGVudCBlbGVtZW50LgotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogQHBhcmFtIGxvY2FsT25seQotCSAqICAgICAgICAgICAgaWYgdHJ1ZSwgb25seSB0aGUgZWxlbWVudHMgaW4gdGhlIGdpdmVuIGVsZW1lbnQncyBwbHVnaW4gYXJlCi0JICogICAgICAgICAgICBpbmNsdWRlZCBpbiB0aGUgcmVzdWx0LgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRBdmFpbGFibGVDb250ZW50RWxlbWVudHMoQ2xhc3MgbWV0aG9kRWxlbWVudFR5cGUsCi0JCQlDb250ZW50RWxlbWVudCBlbGVtZW50LCBib29sZWFuIGxvY2FsT25seSkgewotCQlMaXN0IGVsZW1lbnRMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlMaXN0IG1vZGVsTGlzdDsKLQkJaWYgKGxvY2FsT25seSkgewotCQkJbW9kZWxMaXN0ID0gQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChVbWFVdGlsCi0JCQkJCS5nZXRNZXRob2RQbHVnaW4oZWxlbWVudCkpOwotCQl9IGVsc2UgewotCQkJbW9kZWxMaXN0ID0gTWV0aG9kRWxlbWVudFV0aWwuZ2V0QWxsTW9kZWxzKGVsZW1lbnQpOwotCQl9Ci0JCWludCBzaXplID0gbW9kZWxMaXN0LnNpemUoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCU1ldGhvZFBsdWdpbiBtb2RlbCA9IChNZXRob2RQbHVnaW4pIG1vZGVsTGlzdC5nZXQoaSk7Ci0JCQlDb250ZW50UGFja2FnZSBjb3JlQ29udGVudFBrZyA9IFVtYVV0aWwuZmluZENvbnRlbnRQYWNrYWdlKG1vZGVsLAotCQkJCQlNb2RlbFN0cnVjdHVyZS5ERUZBVUxULmNvcmVDb250ZW50UGF0aCk7Ci0JCQlpZiAoY29yZUNvbnRlbnRQa2cgPT0gbnVsbCkKLQkJCQljb250aW51ZTsKLQkJCVRyZWVJdGVyYXRvciBpdGVyYXRvciA9IGNvcmVDb250ZW50UGtnLmVBbGxDb250ZW50cygpOwotCi0JCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJT2JqZWN0IG9iaiA9IChPYmplY3QpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQlpZiAobWV0aG9kRWxlbWVudFR5cGUuaXNJbnN0YW5jZShvYmopICYmIG9iaiAhPSBlbGVtZW50KSB7Ci0JCQkJCWVsZW1lbnRMaXN0LmFkZChvYmopOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCUNvbGxlY3Rpb25zLnNvcnQoZWxlbWVudExpc3QsIG5hbWVDb21wYXJhdG9yKTsKLQotCQlyZXR1cm4gZWxlbWVudExpc3Q7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIHJvbGUKLQkgKiBAcmV0dXJuIExpc3QKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRBdmFpbGFibGVUYXNrcyhSb2xlIHJvbGUpIHsKLQkJLy8gV2hpbGUgZWRpdGluZyBhIHJvbGUsIHlvdSBvbmx5IGNhbiBhc3NpZ24gdGhpcyByb2xlIHRvIGEgdGFzayBpbiB0aGUKLQkJLy8gc2FtZSBwbHVnaW4uCi0JCS8vIE90aGV3aXNlIHlvdSB3aWxsIG1vZGlmeSB0aGUgYmFzZSBwbHVnaW4uCi0JCS8vCi0JCXJldHVybiBnZXRBdmFpbGFibGVDb250ZW50RWxlbWVudHMoVGFzay5jbGFzcywgcm9sZSwgdHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIHdwCi0JICogQHJldHVybiBMaXN0Ci0JICovCi0JcHVibGljIExpc3QgZ2V0QXZhaWxhYmxlVGFza3MoV29ya1Byb2R1Y3Qgd3ApIHsKLQkJLy8gV2hpbGUgZWRpdGluZyBhIHdvcmsgcHJvZHVjdCwgeW91IG9ubHkgY2FuIGFzc2lnbiB0aGlzIHdvcmsgcHJvZHVjdAotCQkvLyB0byBhIHRhc2sgaW4gdGhlIHNhbWUgcGx1Z2luLgotCQkvLyBPdGhld2lzZSB5b3Ugd2lsbCBtb2RpZnkgdGhlIGJhc2UgcGx1Z2luLgotCQkvLwotCQlyZXR1cm4gZ2V0QXZhaWxhYmxlQ29udGVudEVsZW1lbnRzKFRhc2suY2xhc3MsIHdwLCB0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gd3AKLQkgKiBAcmV0dXJuIExpc3QKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRBdmFpbGFibGVSb2xlcyhXb3JrUHJvZHVjdCB3cCkgewotCQkvLyBXaGlsZSBlZGl0aW5nIGEgd29yayBwcm9kdWN0LCB5b3Ugb25seSBjYW4gYXNzaWduIHRoaXMgd29yayBwcm9kdWN0Ci0JCS8vIHRvIGEgcm9sZSBpbiB0aGUgc2FtZSBwbHVnaW4uCi0JCS8vIE90aGV3aXNlIHlvdSB3aWxsIG1vZGlmeSB0aGUgYmFzZSBwbHVnaW4uCi0JCS8vCi0JCXJldHVybiBnZXRBdmFpbGFibGVDb250ZW50RWxlbWVudHMoUm9sZS5jbGFzcywgd3AsIHRydWUpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSByb2xlCi0JICogQHJldHVybiBMaXN0Ci0JICovCi0JcHVibGljIExpc3QgZ2V0QXZhaWxhYmxlV29ya1Byb2R1Y3RzKFJvbGUgcm9sZSkgewotCQlyZXR1cm4gZ2V0QXZhaWxhYmxlQ29udGVudEVsZW1lbnRzKFdvcmtQcm9kdWN0LmNsYXNzLCByb2xlLCBmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHRhc2sKLQkgKiBAcmV0dXJuIExpc3QKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRBdmFpbGFibGVXb3JrUHJvZHVjdHMoVGFzayB0YXNrKSB7Ci0JCXJldHVybiBnZXRBdmFpbGFibGVDb250ZW50RWxlbWVudHMoV29ya1Byb2R1Y3QuY2xhc3MsIHRhc2ssIGZhbHNlKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gdGFzawotCSAqIEByZXR1cm4gTGlzdAotCSAqLwotCXB1YmxpYyBMaXN0IGdldEF2YWlsYWJsZVJvbGVzKFRhc2sgdGFzaykgewotCQlyZXR1cm4gZ2V0QXZhaWxhYmxlQ29udGVudEVsZW1lbnRzKFJvbGUuY2xhc3MsIHRhc2ssIGZhbHNlKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gdGFzawotCSAqIEByZXR1cm4gTGlzdAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFN0ZXBMaXN0KFRhc2sgdGFzaykgewotCQlpZiAodGFzay5nZXRWYXJpYWJpbGl0eVR5cGUoKSA9PSBWYXJpYWJpbGl0eVR5cGUuRVhURU5EUwotCQkJCXx8IHRhc2suZ2V0VmFyaWFiaWxpdHlUeXBlKCkgPT0gVmFyaWFiaWxpdHlUeXBlLkNPTlRSSUJVVEVTKSB7Ci0JCQlWYXJpYWJpbGl0eUVsZW1lbnQgYmFzZSA9IFRuZ1V0aWwuZ2V0QmFzZSh0YXNrKTsKLQkJCWZpbmFsIExpc3QgdHlwZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlpZiAodHlwZXMuaXNFbXB0eSgpKSB7Ci0JCQkJc3luY2hyb25pemVkICh0eXBlcykgewotCQkJCQlpZiAodHlwZXMuaXNFbXB0eSgpKSB7Ci0JCQkJCQl0eXBlcy5hZGQoVmFyaWFiaWxpdHlUeXBlLkNPTlRSSUJVVEVTKTsKLQkJCQkJCXR5cGVzLmFkZChWYXJpYWJpbGl0eVR5cGUuRVhURU5EUyk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlJdGVyYXRvciBleHRlbmRlZCA9IG5ldyBBYnN0cmFjdFRyZWVJdGVyYXRvcihiYXNlKSB7Ci0JCQkJcHJvdGVjdGVkIEl0ZXJhdG9yIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJCQkJTGlzdCBsaXN0ID0gQXNzb2NpYXRpb25IZWxwZXIKLQkJCQkJCQkuZ2V0SW1tZWRpYXRlVmFyaWV0aWVzKChWYXJpYWJpbGl0eUVsZW1lbnQpIG9iamVjdCk7Ci0JCQkJCWlmIChsaXN0ID09IG51bGwgfHwgbGlzdC5pc0VtcHR5KCkpCi0JCQkJCQlDb2xsZWN0aW9ucy5FTVBUWV9MSVNULml0ZXJhdG9yKCk7Ci0JCQkJCWludCBzaXplID0gbGlzdC5zaXplKCk7Ci0JCQkJCUxpc3Qgb3V0cHV0TGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQkJCVZhcmlhYmlsaXR5RWxlbWVudCBlID0gKFZhcmlhYmlsaXR5RWxlbWVudCkgbGlzdC5nZXQoaSk7Ci0JCQkJCQlpZiAodHlwZXMuY29udGFpbnMoZS5nZXRWYXJpYWJpbGl0eVR5cGUoKSkpIHsKLQkJCQkJCQlvdXRwdXRMaXN0LmFkZChlKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlyZXR1cm4gb3V0cHV0TGlzdC5pdGVyYXRvcigpOwotCQkJCX0KLQkJCX07Ci0JCQlmb3IgKDsgZXh0ZW5kZWQuaGFzTmV4dCgpOykgewotCQkJCVRhc2sgdCA9IChUYXNrKSBleHRlbmRlZC5uZXh0KCk7Ci0JCQkJdC5nZXRQcmVzZW50YXRpb24oKS5nZXRTZWN0aW9ucygpOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBiYXNlCi0JICogQHBhcmFtIHZhcmlhYmlsaXR5VHlwZXMKLQkgKiBAcmV0dXJuIExpc3QKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRFeHRlbmRlZChWYXJpYWJpbGl0eUVsZW1lbnQgYmFzZSwgQ29sbGVjdGlvbiB2YXJpYWJpbGl0eVR5cGVzKSB7Ci0JCUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZ2V0RXh0ZW5kZWQobGlzdCwgYmFzZSwgdmFyaWFiaWxpdHlUeXBlcyk7Ci0JCXJldHVybiBsaXN0OwotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgZ2V0RXh0ZW5kZWQoTGlzdCBvdXRwdXRMaXN0LCBWYXJpYWJpbGl0eUVsZW1lbnQgYmFzZSwKLQkJCUNvbGxlY3Rpb24gdmFyaWFiaWxpdHlUeXBlcykgewotCQlMaXN0IGxpc3QgPSBBc3NvY2lhdGlvbkhlbHBlci5nZXRJbW1lZGlhdGVWYXJpZXRpZXMoYmFzZSk7Ci0JCWlmIChsaXN0ID09IG51bGwgfHwgbGlzdC5pc0VtcHR5KCkpCi0JCQlyZXR1cm47Ci0JCWludCBzaXplID0gbGlzdC5zaXplKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlWYXJpYWJpbGl0eUVsZW1lbnQgZSA9IChWYXJpYWJpbGl0eUVsZW1lbnQpIGxpc3QuZ2V0KGkpOwotCQkJaWYgKHZhcmlhYmlsaXR5VHlwZXMuY29udGFpbnMoZS5nZXRWYXJpYWJpbGl0eVR5cGUoKSkpIHsKLQkJCQlvdXRwdXRMaXN0LmFkZChlKTsKLQkJCX0KLQkJfQotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJVmFyaWFiaWxpdHlFbGVtZW50IGUgPSAoVmFyaWFiaWxpdHlFbGVtZW50KSBsaXN0LmdldChpKTsKLQkJCWlmICh2YXJpYWJpbGl0eVR5cGVzLmNvbnRhaW5zKGUuZ2V0VmFyaWFiaWxpdHlUeXBlKCkpKSB7Ci0JCQkJZ2V0RXh0ZW5kZWQob3V0cHV0TGlzdCwgYmFzZSwgdmFyaWFiaWxpdHlUeXBlcyk7Ci0JCQl9Ci0JCX0KLQotCX0KLQotCXByaXZhdGUgc3RhdGljIFN0cmluZ1tdIGdldENhdGVnb3J5UGFja2FnZVBhdGgoQ29udGVudENhdGVnb3J5IGNhdGVnb3J5KSB7Ci0JCUVPYmplY3QgcGFyZW50ID0gbnVsbDsKLQkJZm9yIChwYXJlbnQgPSBjYXRlZ29yeS5lQ29udGFpbmVyKCk7IHBhcmVudCAhPSBudWxsCi0JCQkJJiYgIShwYXJlbnQgaW5zdGFuY2VvZiBDb250ZW50UGFja2FnZSk7IHBhcmVudCA9IHBhcmVudAotCQkJCS5lQ29udGFpbmVyKCkpCi0JCQk7Ci0JCWlmIChwYXJlbnQgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlDb250ZW50UGFja2FnZSBjYXRlZ29yeVBrZyA9IChDb250ZW50UGFja2FnZSkgcGFyZW50OwotCQlyZXR1cm4gTWlzYy5nZXRQYXRoUmVsYXRpdmVUb1BsdWdpbihjYXRlZ29yeVBrZyk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdXRpbC9MaWJyYXJ5UHJvYmxlbU1vbml0b3IuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91dGlsL0xpYnJhcnlQcm9ibGVtTW9uaXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNzk3MWZiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91dGlsL0xpYnJhcnlQcm9ibGVtTW9uaXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzU1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5SZXN0YXJ0YWJsZUpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5JTGlicmFyeU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuSUxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5ldmVudHMuSUxpYnJhcnlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VydmljZXMuSUxpYnJhcnlQZXJzaXN0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotCi0vKioKLSAqIFRoZSBjbGFzcyBmb3IgbW9uaXRvciBsaWJyYXJ5IHByb2JsZW1zLgotICogCi0gKiAoMSkgV2FrZSB1cCByZWd1bGFybHkgKHNheSBldmVyeSAzMCBzZWNvbmRzKSAKLSAqICAgICB0byBzY2hlZHVsZSBqb2IgaWYgYW55IGNoYW5nZSBpcyByZWdpc3RlcmVkIGR1cmluZyBzbGVlcAotICogICAgIAotICogKDIpIEdvZXMgdG8gc2xlZXAgYWdhaW4gaW1tZWRpYXRlbHkgYWZ0ZXIgIndha2luZyB1cC9kbyBub3RoaW5nIiBvcgotICogICAgICJ3YWtpbmcgdXAvc2NoZWR1bGluZyBhIGpvYiIgICAgCi0gKiAgICAgCi0gKiAoMykgSm9iIChmaW5kaW5nIGxpYnJhcnkgcHJvYmxlbXMpIHJ1bnMgdG8gZW5kIG9ubHkgdGhlcmUgaXMgbm8gY2hhbmdlIGR1cmluZyBydW4uCi0gKiAKLSAqICg0KSBKb2IgcnVuIGlzIGFib3J0ZWQgKGJ5IHRocm93aW5nIGEgUmVzdGFydEludGVycnVwdEV4Y2VwdGlvbikKLSAqICAgICB3aGVuZXZlciBhIGNoYW5nZSBpcyBkZXRlY3RlZCBkdXJpbmcgcnVuLCBhbmQgYSBuZXcgam9iIHNjaGVkdWxlZCAKLSAqICAgICB3aXRoIGEgZGVsYXkgdGltZSAoc2F5IDEgc2Vjb25kKS4KLSAqICAgICAgCi0gKiAoNSkgTWFrZSBzdXJlIHRoZXJlIGlzIGFsd2F5cyBhdCBtb3N0IG9uZSBqb2IgcnVubmluZwotICogCi0gKiBAYXV0aG9yIFdlaXBpbmcgTHUKLSAqIEBzaW5jZSAxLjUKLSAqLwotCi1wdWJsaWMgY2xhc3MgTGlicmFyeVByb2JsZW1Nb25pdG9yIGV4dGVuZHMgUmVzdGFydGFibGVKb2IgaW1wbGVtZW50cyBJTGlicmFyeUNoYW5nZUxpc3RlbmVyIHsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVbnJlc29sdmVkQmFzZWRQbHVnaW5NQVJLRVJfSUQgPSBMaWJyYXJ5UGx1Z2luLmdldERlZmF1bHQoKS5nZXRJZCgpICsgIi51bnJlc29sdmVkQmFzZVBsdWdpbnMiOyAvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTmFtZSA9ICJuYW1lIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEd1aWQgPSAiZ3VpZCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVbnJlc29sdmVkQmFzZUd1aWRzID0gInVucmVzb2x2ZWRCYXNlR3VpZHMiOyAvLyROT04tTkxTLTEkCi0JCi0JcHJpdmF0ZSBsb25nIGRlbGF5ID0gMzAwMDBMOwotCXByaXZhdGUgbG9uZyByZXN0YXJ0RGVsYXkgPSAxMDAwTDsKLQlwcml2YXRlIGJvb2xlYW4gaGFzQ2hhbmdlID0gZmFsc2U7Ci0JcHJpdmF0ZSBUaHJlYWQgbW9uaXRvclRocmVhZDsKLQlwcml2YXRlIGJvb2xlYW4gc3RvcE1vbml0b3IgPSBmYWxzZTsKLQlwcml2YXRlIE1ldGhvZExpYnJhcnkgbGlicmFyeTsKLQlwcml2YXRlIE1hcDxNZXRob2RQbHVnaW4sIElNYXJrZXI+IHBsdWdpbk1hcmtlck1hcCA9IG5ldyBIYXNoTWFwPE1ldGhvZFBsdWdpbiwgSU1hcmtlcj4oKTsKLQkKLQlwdWJsaWMgTGlicmFyeVByb2JsZW1Nb25pdG9yKCkgewotCQlzdXBlcihMaWJyYXJ5UmVzb3VyY2VzLmxpYnJhcnlQcm9ibGVtTW9uaXRvcik7Ci0JCQotCQlMaWJyYXJ5U2VydmljZUxpc3RlbmVyIGxpYlNlcnZpY2VMaXN0ZW5lciA9IG5ldyBMaWJyYXJ5U2VydmljZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgbGlicmFyeVNldChNZXRob2RMaWJyYXJ5IGxpYikgewotCQkJCUlMaWJyYXJ5U2VydmljZSBsaWJTZXJ2aWNlID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKTsJCQkJCi0JCQkJaWYgKGxpYnJhcnkgIT0gbnVsbCAmJiBsaWJyYXJ5ICE9IGxpYikgewotCQkJCQlJTGlicmFyeU1hbmFnZXIgbGliTWdyID0gbGliU2VydmljZS5nZXRMaWJyYXJ5TWFuYWdlcihsaWJyYXJ5KTsKLQkJCQkJaWYgKGxpYk1nciAhPSBudWxsKSB7Ci0JCQkJCQlsaWJNZ3IucmVtb3ZlTGlzdGVuZXIoTGlicmFyeVByb2JsZW1Nb25pdG9yLnRoaXMpOwotCQkJCQl9Ci0JCQkJfQotCQkJCQotCQkJCWlmIChsaWIgIT0gbnVsbCAmJiBsaWIgIT0gbGlicmFyeSkgewotCQkJCQlJTGlicmFyeU1hbmFnZXIgbGliTWdyID0gbGliU2VydmljZS5nZXRMaWJyYXJ5TWFuYWdlcihsaWIpOwotCQkJCQlpZiAobGliTWdyICE9IG51bGwpIHsKLQkJCQkJCWxpYk1nci5hZGRMaXN0ZW5lcihMaWJyYXJ5UHJvYmxlbU1vbml0b3IudGhpcyk7Ci0JCQkJCX0KLQkJCQkJa2lja1RvUnVuKCk7Ci0JCQkJfQotCQkJCi0JCQkJbGlicmFyeSA9IGxpYjsKLQkJCX0KLQkJfTsKLQkJTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5hZGRMaXN0ZW5lcihsaWJTZXJ2aWNlTGlzdGVuZXIpOwotCQlzdGFydE1vbml0b3IoKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc3RhcnRNb25pdG9yKCkgewotCQlSdW5uYWJsZSBydW5uYWJsZSA9IG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQl3aGlsZSAoISBzdG9wTW9uaXRvcikgewotCQkJCQl0cnkgewotCQkJCQkJVGhyZWFkLnNsZWVwKGRlbGF5KTsKLQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCUxpYnJhcnlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCQkJcmV0dXJuOwotCQkJCQl9Ci0JCQkJCWlmIChoYXNDaGFuZ2UpIHsKLQkJCQkJCWhhc0NoYW5nZSA9IGZhbHNlOwotCQkJCQkJZ3VhcmRlZFNjaGVkdWxlKDBMKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfTsKLQkJCi0JCXN0b3BNb25pdG9yID0gZmFsc2U7Ci0JCWlmIChtb25pdG9yVGhyZWFkID09IG51bGwpIHsKLQkJCW1vbml0b3JUaHJlYWQgPSBuZXcgVGhyZWFkKHJ1bm5hYmxlKTsKLQkJfQotCQltb25pdG9yVGhyZWFkLnN0YXJ0KCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHN0b3BNb25pdG9yKCkgewotCQlzdG9wTW9uaXRvciA9IHRydWU7Ci0JfQotCQotCQotCXB1YmxpYyB2b2lkIGxpYnJhcnlDaGFuZ2VkKGludCBvcHRpb24sIENvbGxlY3Rpb248T2JqZWN0PiBjaGFuZ2VkSXRlbXMpIHsKLQkJaWYgKGNoYW5nZWRJdGVtcyAhPSBudWxsICYmIGNoYW5nZWRJdGVtcy5zaXplKCkgPiAwKSB7Ci0JCQloYXNDaGFuZ2UgPSB0cnVlOwotCQkJZW5hYmxlVG9SZXN0YXJ0KCk7Ci0JCX0KLQl9Ci0JCi0JLy8gVXBkYXRlIHdpbGwgYWJvcnQgYW5kIHJlLXNjaGVkdWxlIGEgam9iIGlmIG5ldyBjaGFuZ2UgZGV0ZWN0ZWQKLQlwcml2YXRlIHZvaWQgdXBkYXRlKCkgIHRocm93cyBSZXN0YXJ0SW50ZXJydXB0RXhjZXB0aW9uIHsKLQkJaWYgKGxvY2FsRGVidWcpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTEQ+IHVwZGF0ZSIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJTWV0aG9kTGlicmFyeSBsaWIgPSBnZXRMaWJyYXJ5KCk7Ci0JCWlmIChsaWIgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWNoZWNrUmVzdGFydEludGVycnVwdEV4Y2VwdGlvbihyZXN0YXJ0RGVsYXkpOwkJCi0KLQkJY2xlYW5VcCgpOwotCQkKLQkJTGlzdDxNZXRob2RQbHVnaW4+IHBsdWdpbnMgPSBuZXcgQXJyYXlMaXN0PE1ldGhvZFBsdWdpbj4oKTsKLQkJcGx1Z2lucy5hZGRBbGwobGliLmdldE1ldGhvZFBsdWdpbnMoKSk7Ci0JCQotCQlTZXQ8TWV0aG9kUGx1Z2luPiBwbHVnaW5TZXQgPSBuZXcgSGFzaFNldDxNZXRob2RQbHVnaW4+KHBsdWdpbnMpOwotCQlmb3IgKE1ldGhvZFBsdWdpbiBwbHVnaW46IHBsdWdpbnMpIHsKLQkJCWNoZWNrUmVzdGFydEludGVycnVwdEV4Y2VwdGlvbihyZXN0YXJ0RGVsYXkpOwotCQkJTGlzdDxNZXRob2RQbHVnaW4+IGJhc2VMaXN0ID0gcGx1Z2luLmdldEJhc2VzKCk7Ci0JCQlib29sZWFuIG1pc3NpbmcgPSBmYWxzZTsKLQkJCWZvciAoTWV0aG9kUGx1Z2luIGJhc2U6IGJhc2VMaXN0KSB7Ci0JCQkJY2hlY2tSZXN0YXJ0SW50ZXJydXB0RXhjZXB0aW9uKHJlc3RhcnREZWxheSk7Ci0JCQkJaWYgKCEgcGx1Z2luU2V0LmNvbnRhaW5zKGJhc2UpKSB7CQkJCQkKLQkJCQkJaWYgKCEgbWlzc2luZykgewotCQkJCQkJaWYgKGxvY2FsRGVidWcpIHsKLQkJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxEPiBwbHVnaW46ICIgKyBwbHVnaW4pOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJMRD4gIiArIHBsdWdpbi5nZXROYW1lKCkgKyAiIHJlZmVyZW5jZXMgdW5yZXNvbHZlZCBiYXNlczoiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQl9Ci0JCQkJCQltaXNzaW5nID0gdHJ1ZTsKLQkJCQkJfQotCQkJCQlpZiAobG9jYWxEZWJ1ZykgewotCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJMRD4gYmFzZTogIiArIGJhc2UpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQkJYWRkTWlzc2luZ0Jhc2VQbHVnaW5FcnJvcihwbHVnaW4sIGJhc2UpOwotCQkJCX0KLQkJCX0KLQkJCWlmIChtaXNzaW5nKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCIiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9CQkKLQkJCi0JfQotCQotCXByaXZhdGUgdm9pZCBhZGRNaXNzaW5nQmFzZVBsdWdpbkVycm9yKE1ldGhvZFBsdWdpbiBwbHVnaW4sIE1ldGhvZFBsdWdpbiBiYXNlKSB7Ci0JCUlNYXJrZXIgbWFya2VyID0gcGx1Z2luTWFya2VyTWFwLmdldChwbHVnaW4pOwotCQlpZiAobWFya2VyID09IG51bGwpIHsKLQkJCVJlc291cmNlIHJlcyA9IHBsdWdpbi5lUmVzb3VyY2UoKTsKLQkJCWlmIChyZXMgPT0gbnVsbCkgewotCQkJCXJldHVybjsKLQkJCX0KLQkJCi0JCQlVUkkgY29udGFpbmVyVVJJID0gcmVzLmdldFVSSSgpOwotCQkJSVdvcmtzcGFjZSB3b3Jrc3BhY2UgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCk7Ci0JCQlJUGF0aCBwYXRoID0gbmV3IFBhdGgoY29udGFpbmVyVVJJLnRvRmlsZVN0cmluZygpKTsKLQkJCUlGaWxlIGZpbGUgPSB3b3Jrc3BhY2UuZ2V0Um9vdCgpLmdldEZpbGVGb3JMb2NhdGlvbihwYXRoKTsKLQkJCWlmIChmaWxlID09IG51bGwpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlTdHJpbmcgbG9jYXRpb24gPSBjb250YWluZXJVUkkgIT0gbnVsbCA/IGNvbnRhaW5lclVSSQotCQkJCQkudG9GaWxlU3RyaW5nKCkgOiAiIjsgLy8kTk9OLU5MUy0xJAkKLQkJCXRyeSB7Ci0JCQkJbWFya2VyID0gZmlsZS5jcmVhdGVNYXJrZXIoVW5yZXNvbHZlZEJhc2VkUGx1Z2luTUFSS0VSX0lEKTsKLQkJCQltYXJrZXIuc2V0QXR0cmlidXRlKElNYXJrZXIuU0VWRVJJVFksIElNYXJrZXIuU0VWRVJJVFlfRVJST1IpOwotCQkJCW1hcmtlci5zZXRBdHRyaWJ1dGUoTmFtZSwgcGx1Z2luLmdldE5hbWUoKSk7Ci0JCQkJbWFya2VyLnNldEF0dHJpYnV0ZShHdWlkLCBwbHVnaW4uZ2V0R3VpZCgpKTsKLQkJCQltYXJrZXIuc2V0QXR0cmlidXRlKElNYXJrZXIuTE9DQVRJT04sIGxvY2F0aW9uKTsKLQkJCQltYXJrZXIuc2V0QXR0cmlidXRlKEd1aWQsIHBsdWdpbi5nZXRHdWlkKCkpOwkKLQotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlMaWJyYXJ5UGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCX0KLQkJCWlmIChtYXJrZXIgPT0gbnVsbCkgewotCQkJCXJldHVybjsKLQkJCX0KLQkJCWlmIChsb2NhbERlYnVnKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJMRD4gbWFya2VyOiAiICsgbWFya2VyKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJcGx1Z2luTWFya2VyTWFwLnB1dChwbHVnaW4sIG1hcmtlcik7CQkJCQotCQkKLQkJfQotCQkKLQkJU3RyaW5nIHVucmVzb2x2ZWRCYXNlR3VpZHNWYWx1ZSA9IG51bGw7Ci0JCXRyeSB7Ci0KLQkJCVN0cmluZyBlcnJNc2cgPSBwbHVnaW4uZ2V0TmFtZSgpICsgIiByZWZlcmVuY2VzIHVucmVzb2x2ZWQgYmFzZSAiOyAvLyROT04tTkxTLTEkCi0JCQl1bnJlc29sdmVkQmFzZUd1aWRzVmFsdWUgPSAoU3RyaW5nKSBtYXJrZXIuZ2V0QXR0cmlidXRlKFVucmVzb2x2ZWRCYXNlR3VpZHMpOwotCQkJaWYgKHVucmVzb2x2ZWRCYXNlR3VpZHNWYWx1ZSA9PSBudWxsIHx8IHVucmVzb2x2ZWRCYXNlR3VpZHNWYWx1ZS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJdW5yZXNvbHZlZEJhc2VHdWlkc1ZhbHVlID0gYmFzZS5nZXRHdWlkKCk7Ci0JCQkJZXJyTXNnICs9ICJwbHVnaW46ICI7IC8vJE5PTi1OTFMtMSQKLQkJCX0gZWxzZSBpZiAodW5yZXNvbHZlZEJhc2VHdWlkc1ZhbHVlLmluZGV4T2YoYmFzZS5nZXRHdWlkKCkpIDwgMCkgewotCQkJCXVucmVzb2x2ZWRCYXNlR3VpZHNWYWx1ZSArPSAiLCAiICsgYmFzZS5nZXRHdWlkKCk7IC8vJE5PTi1OTFMtMSQKLQkJCQllcnJNc2cgKz0gInBsdWdpbnM6ICI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWVyck1zZyArPSB1bnJlc29sdmVkQmFzZUd1aWRzVmFsdWU7Ci0JCQltYXJrZXIuc2V0QXR0cmlidXRlKElNYXJrZXIuTUVTU0FHRSwgZXJyTXNnKTsKLQkJCW1hcmtlci5zZXRBdHRyaWJ1dGUoVW5yZXNvbHZlZEJhc2VHdWlkcywgdW5yZXNvbHZlZEJhc2VHdWlkc1ZhbHVlKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCUxpYnJhcnlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQl9Ci0KLQl9Ci0JCi0JcHJvdGVjdGVkIElTdGF0dXMgcmVzdGFydGFibGVSdW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgUmVzdGFydEludGVycnVwdEV4Y2VwdGlvbiB7Ci0JCXVwZGF0ZSgpOwotCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgcmVzZXRUb1Jlc3RhcnQoKSB7Ci0JCWlmIChsb2NhbERlYnVnKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxEPiByZXNldFRvUmVzdGFydCIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJY2xlYW5VcCgpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgY2xlYW5VcCgpIHsKLQkJaWYgKHBsdWdpbk1hcmtlck1hcC5pc0VtcHR5KCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQlmb3IgKElNYXJrZXIgbWFya2VyOiBwbHVnaW5NYXJrZXJNYXAudmFsdWVzKCkpIHsKLQkJCXRyeSB7Ci0JCQkJbWFya2VyLmRlbGV0ZSgpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlMaWJyYXJ5UGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCX0KLQkJfQotCQlwbHVnaW5NYXJrZXJNYXAgPSBuZXcgSGFzaE1hcDxNZXRob2RQbHVnaW4sIElNYXJrZXI+KCk7Ci0JfQotCi0JcHVibGljIHZvaWQga2lja1RvUnVuKCkgewotCQlpZiAobG9jYWxEZWJ1ZykgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJMRD4ga2lja1RvUnVuIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQllbmFibGVUb1Jlc3RhcnQoKTsKLQkJZ3VhcmRlZFNjaGVkdWxlKDBMKTsKLQl9Ci0JCi0JLy9UbyBkbzogYWxsb3cgYSBjYWNoZWQgZGF0YSB0byBwYXNlZCBhbmQgcmV0dXJuIC0+IG9wdGltaXplIGZpeCBvZiBzaW1pbGFyIHByb2JsZW1zCi0JcHVibGljIHZvaWQgZml4UHJvYmxlbShJTWFya2VyIG1hcmtlcikgewotCQl0cnkgewotCQkJaWYgKG1hcmtlci5nZXRUeXBlKCkgIT0gVW5yZXNvbHZlZEJhc2VkUGx1Z2luTUFSS0VSX0lEKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJTWV0aG9kTGlicmFyeSBsaWIgPSBnZXRMaWJyYXJ5KCk7Ci0JCQlpZiAobGliID09IG51bGwpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0KLQkJCU1hcDxTdHJpbmcsIE1ldGhvZFBsdWdpbj4gZ3VpZFRvUGx1Z2luTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBNZXRob2RQbHVnaW4+KCk7Ci0JCQlmb3IgKE1ldGhvZFBsdWdpbiBwbHVnaW4gOiBsaWIuZ2V0TWV0aG9kUGx1Z2lucygpKSB7Ci0JCQkJZ3VpZFRvUGx1Z2luTWFwLnB1dChwbHVnaW4uZ2V0R3VpZCgpLCBwbHVnaW4pOwotCQkJfQotCQkJU3RyaW5nIGd1aWQgPSAoU3RyaW5nKSBtYXJrZXIuZ2V0QXR0cmlidXRlKEd1aWQpOyAvLyROT04tTkxTLTEkCi0KLQkJCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSBndWlkVG9QbHVnaW5NYXAuZ2V0KGd1aWQpOwotCQkJaWYgKHBsdWdpbiA9PSBudWxsIHx8IHBsdWdpbi5lUmVzb3VyY2UoKSA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJCi0JCQlpZiAobG9jYWxEZWJ1ZykgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTEQ+IGZpeFByb2JsZW0sIHBsdWdpbjogIiArIHBsdWdpbik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCQotCQkJTGlzdDxNZXRob2RQbHVnaW4+IGJhc2VzID0gbmV3IEFycmF5TGlzdDxNZXRob2RQbHVnaW4+KCk7Ci0JCQliYXNlcy5hZGRBbGwocGx1Z2luLmdldEJhc2VzKCkpOwotCi0JCQlib29sZWFuIG1vZGlmaWVkID0gZmFsc2U7Ci0JCQlmb3IgKE1ldGhvZFBsdWdpbiBiYXNlIDogYmFzZXMpIHsKLQkJCQlpZiAoISBndWlkVG9QbHVnaW5NYXAuY29udGFpbnNLZXkoYmFzZS5nZXRHdWlkKCkpKSB7Ci0JCQkJCW1vZGlmaWVkID0gdHJ1ZTsKLQkJCQkJcGx1Z2luLmdldEJhc2VzKCkucmVtb3ZlKGJhc2UpOwotCQkJCX0KLQkJCX0KLQkJCWlmICghIG1vZGlmaWVkKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJCi0JCQlSZXNvdXJjZSByZXNvdXJjZSA9IHBsdWdpbi5lUmVzb3VyY2UoKTsKLQkJCUlMaWJyYXJ5UGVyc2lzdGVyLkZhaWxTYWZlTWV0aG9kTGlicmFyeVBlcnNpc3RlciBwZXJzaXN0ZXIgPSBMaWJyYXJ5U2VydmljZVV0aWwKLQkJCQkJLmdldFBlcnNpc3RlckZvcihyZXNvdXJjZSkuZ2V0RmFpbFNhZmVQZXJzaXN0ZXIoKTsKLQkJCXRyeSB7Ci0JCQkJcGVyc2lzdGVyLnNhdmUocmVzb3VyY2UpOwotCQkJCXBlcnNpc3Rlci5jb21taXQoKTsKLQkJCX0KLQkJCWNhdGNoKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkJcGVyc2lzdGVyLnJvbGxiYWNrKCk7Ci0JCQl9Ci0KLQkJCWtpY2tUb1J1bigpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJc3RvcE1vbml0b3IoKTsKLQkJY2xlYW5VcCgpOwotCX0KLQotCXB1YmxpYyBNZXRob2RMaWJyYXJ5IGdldExpYnJhcnkoKSB7Ci0JCXJldHVybiBsaWJyYXJ5OwotCX0KLQotCXB1YmxpYyB2b2lkIHNldExpYnJhcnkoTWV0aG9kTGlicmFyeSBsaWJyYXJ5KSB7Ci0JCXRoaXMubGlicmFyeSA9IGxpYnJhcnk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdXRpbC9MaWJyYXJ5VXRpbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3V0aWwvTGlicmFyeVV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjE1M2E5Ny4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdXRpbC9MaWJyYXJ5VXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTUwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWw7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5UcmVlSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3NpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnNkby5FUHJvcGVydHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuSUxpYnJhcnlNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVHJhbnNpZW50R3JvdXBJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklBY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5NZXRob2RFbGVtZW50UHJvcGVydHlIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLklWYWxpZGF0b3JGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLklMaWJyYXJ5UmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5NdWx0aUZpbGVSZXNvdXJjZVNldEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLk11bHRpRmlsZVhNSVNhdmVJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy5TZXJ2aWNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50Q2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DdXN0b21DYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaWJhYmxlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudFByb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlN1cHBvcnRpbmdNYXRlcmlhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS5pbXBsLk11bHRpUmVzb3VyY2VFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5VbWFVdGlsOwotCi0vKioKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTGlicmFyeVV0aWwgewotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIFBVQkxJU0hfTU9ERSA9IGZhbHNlOwotCQotCXByaXZhdGUgc3RhdGljIENvbXBhcmF0b3I8RUNsYXNzPiB0eXBlQ29tcGFyYXRvciA9IG5ldyBDb21wYXJhdG9yPEVDbGFzcz4oKSB7Ci0KLQkJcHVibGljIGludCBjb21wYXJlKEVDbGFzcyBvMSwgRUNsYXNzIG8yKSB7Ci0JCQlyZXR1cm4gbzEuZ2V0TmFtZSgpLmNvbXBhcmVUbyhvMi5nZXROYW1lKCkpOwotCQl9Ci0JCQotCX07Ci0KLQlwcml2YXRlIHN0YXRpYyBMaXN0PEVDbGFzcz4gaW5jbHVkZWRFbGVtZW50VHlwZXM7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ29sbGVjdGlvbjxFQ2xhc3M+IGV4Y2x1ZGVkVHlwZXMgPSBBcnJheXMuYXNMaXN0KG5ldyBFQ2xhc3NbXSB7Ci0JCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRCcmVha2Rvd25FbGVtZW50KCksCi0JCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb21wb3NpdGVSb2xlKCksCi0JCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXREZXNjcmliYWJsZUVsZW1lbnQoKSwKLQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldERlc2NyaXB0b3IoKSwKLQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEZ1bGZpbGxhYmxlRWxlbWVudCgpLAotCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0S2luZCgpLAotCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3IoKSwKLQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UoKSwKLQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFByb2Nlc3NFbGVtZW50KCksCi0JCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSgpLAotCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Um9sZURlc2NyaXB0b3IoKSwKLQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tEZXNjcmlwdG9yKCksCi0JCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUZWFtUHJvZmlsZSgpLAotCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V29ya0JyZWFrZG93bkVsZW1lbnQoKSwKLQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFdvcmtPcmRlcigpLAotCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yKCkKLQl9KTsKLQkKLQkvKioKLQkgKiBDaGVjayBpcyBnaXZlbiBwbHVnaW4gbmFtZSBpcyB2YWxpZCBuYW1lIGluIHRoZSBsaWJyYXJ5Ci0JICogCi0JICogQHBhcmFtIG5hbWUKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNoZWNrUGx1Z2luTmFtZShNZXRob2RQbHVnaW4gcGx1Z2luLCBTdHJpbmcgbmV3TmFtZSkgewotCQlNZXRob2RMaWJyYXJ5IGxpYiA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLQkJCQkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKTsKLQkJcmV0dXJuIElWYWxpZGF0b3JGYWN0b3J5LklOU1RBTkNFLmNyZWF0ZVZhbGlkYXRvcihsaWIsCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5NRVRIT0RfTElCUkFSWV9fTUVUSE9EX1BMVUdJTlMsCi0JCQkJKElGaWx0ZXIpIG51bGwsIG51bGwsIFVtYVBhY2thZ2UuTGl0ZXJhbHMuTkFNRURfRUxFTUVOVF9fTkFNRSkKLQkJCQkuaXNWYWxpZChuZXdOYW1lKTsJCQotCX0KLQotCS8qKgotCSAqIG1ldGhvZCB0byBjaGVjayBpZiB0aGUgZWxlbWVudCBpcyBhIHBsdWdpbiBvciBwYWNrYWdlIHNvIHRoYXQgaXMgY2FuIGJlIHNlbGVjdGVkIGluIGNvbmZpZ3VyYXRpb24gZWRpdG9yLiAKLQkgKiBNYXkgbmVlZCBhIGJldHRlciBuYW1lIGZvciB0aGlzLgotCSAqIEBwYXJhbSBlbGVtZW50IEVPYmplY3QKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gc2VsZWN0YWJsZShFT2JqZWN0IGVsZW1lbnQpIHsKLQkJcmV0dXJuIChlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kTGlicmFyeQotCQkJCXx8IGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4gfHwgZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZFBhY2thZ2UpOwotCX0KLQotCS8qKgotCSAqIGdldCB0aGUgY29udGFpbmVyIG9mIHRoZSBlbGVtZW50IHRoYXQgaXMgc2VsZWN0YWJsZS4KLQkgKiBAcGFyYW0gZWxlbWVudCBFT2JqZWN0Ci0JICogQHJldHVybiBFT2JqZWN0Ci0JICovCi0JcHVibGljIHN0YXRpYyBFT2JqZWN0IGdldFNlbGVjdGFibGUoRU9iamVjdCBlbGVtZW50KSB7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudCkgewotCQkJRU9iamVjdCBwa2cgPSBlbGVtZW50LmVDb250YWluZXIoKTsKLQkJCXdoaWxlIChwa2cgIT0gbnVsbCAmJiAhKHBrZyBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpICkgewotCQkJCXBrZyA9IHBrZy5lQ29udGFpbmVyKCk7Ci0JCQl9Ci0JCQlyZXR1cm4gcGtnOwotCQkJCi0JCX0gZWxzZSB7Ci0JCQlFT2JqZWN0IHBhcmVudCA9IGVsZW1lbnQ7Ci0JCQl3aGlsZSAoKHBhcmVudCAhPSBudWxsKSAmJiAhc2VsZWN0YWJsZShwYXJlbnQpKSB7Ci0JCQkJcGFyZW50ID0gcGFyZW50LmVDb250YWluZXIoKTsKLQkJCX0KLQotCQkJcmV0dXJuIHBhcmVudDsKLQkJfQotCX0KLQotCS8qKgotCSAqIGdldCB0aGUgbWV0aG9kIHBsdWdpbiBmb3IgdGhlIGVsZW1lbnQKLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudCBFT2JqZWN0Ci0JICogQHJldHVybiBNZXRob2RQbHVnaW4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1ldGhvZFBsdWdpbiBnZXRNZXRob2RQbHVnaW4oRU9iamVjdCBlbGVtZW50KSB7Ci0JCS8vIEVPYmplY3QgcGFyZW50ID0gZWxlbWVudDsKLQkJLy8gd2hpbGUgKChwYXJlbnQgIT0gbnVsbCkgJiYgIShwYXJlbnQgaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pKSB7Ci0JCS8vIHBhcmVudCA9IHBhcmVudC5lQ29udGFpbmVyKCk7Ci0JCS8vIH0KLQkJLy8KLQkJLy8gcmV0dXJuIChNZXRob2RQbHVnaW4pIHBhcmVudDsKLQotCQlyZXR1cm4gVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4oZWxlbWVudCk7Ci0JfQotCi0JLyoqCi0JICogZ2V0IGEgcHJpbnRhYmxlIG5hbWUgc3RyaW5nIGZvciB0aGUgZWxlbWVudC4gTm90ZSwgdGhpcyBpcyBub3QgdGhlIGVsZW1lbnQgbmFtZSBhdHRyaWJ1dGUKLQkgKiBAcGFyYW0gZWxlbWVudCBPYmplY3QKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE5hbWUoT2JqZWN0IGVsZW1lbnQpIHsKLQkJaWYgKGVsZW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybiBMaWJyYXJ5UmVzb3VyY2VzLnVua25vd25fdGV4dDsgCi0KLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQlyZXR1cm4gZ2V0RnVsbE5hbWUoKE1ldGhvZEVsZW1lbnQpIGVsZW1lbnQpOwotCQl9Ci0KLQkJcmV0dXJuIGVsZW1lbnQudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBnZXQgYSBwcmludGFibGUgbmFtZSBmb3IgdGhlIGVsZW1lbnQuCi0JICogQHBhcmFtIGVsZW1lbnQgTWV0aG9kRWxlbWVudAotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RnVsbE5hbWUoTWV0aG9kRWxlbWVudCBlbGVtZW50KSB7Ci0JCWlmIChzZWxlY3RhYmxlKGVsZW1lbnQpKSB7Ci0JCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJYnVmZmVyLmFwcGVuZCgiWyIpLmFwcGVuZChlbGVtZW50LmdldE5hbWUoKSkuYXBwZW5kKCJdIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJTWV0aG9kRWxlbWVudCBwYXJlbnQgPSBlbGVtZW50OwotCQkJd2hpbGUgKChwYXJlbnQgPSAoTWV0aG9kRWxlbWVudCkgcGFyZW50LmVDb250YWluZXIoKSkgIT0gbnVsbCkgewotCQkJCWlmIChwYXJlbnQgaW5zdGFuY2VvZiBNZXRob2RMaWJyYXJ5KSB7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQlidWZmZXIuaW5zZXJ0KDAsICJbIiArIHBhcmVudC5nZXROYW1lKCkgKyAiXS4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQl9Ci0JCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gZWxlbWVudC5nZXROYW1lKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBnZXQgdGhlIGVsZW1lbnQncyB0eXBlOm5hbWUgYXMgYSBsb2NhbGl6ZWQgc3RyaW5nCi0JICogQHBhcmFtIGVsZW1lbnQgTWV0aG9kRWxlbWVudAotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TG9jYWxpemVUeXBlTmFtZShNZXRob2RFbGVtZW50IGVsZW1lbnQpIHsKLQkJaWYgKGVsZW1lbnQgPT0gbnVsbCkgewotCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBEZXNjcmliYWJsZUVsZW1lbnQpIHsKLQkJCVN0cmluZyBuYW1lU3RyID0gVG5nVXRpbC5nZXRUeXBlVGV4dChlbGVtZW50KSArIExpYnJhcnlSZXNvdXJjZXMuY29sb25fd2l0aF9zcGFjZSA7Ci0JCQkKLQkJCWlmICgoKERlc2NyaWJhYmxlRWxlbWVudCkgZWxlbWVudCkuZ2V0UHJlc2VudGF0aW9uTmFtZSgpICE9IG51bGwpIHsKLQkJCQluYW1lU3RyICs9ICIoIiArICgoRGVzY3JpYmFibGVFbGVtZW50KSBlbGVtZW50KS5nZXRQcmVzZW50YXRpb25OYW1lKCkgLy8kTk9OLU5MUy0xJAotCQkJCQkJKyAiKSAiICsgKChEZXNjcmliYWJsZUVsZW1lbnQpIGVsZW1lbnQpLmdldE5hbWUoKTsgLy8kTk9OLU5MUy0xJAotCQkJfSBlbHNlIHsKLQkJCQluYW1lU3RyICs9IGVsZW1lbnQuZ2V0TmFtZSgpOwotCQkJfQotCQkJcmV0dXJuIG5hbWVTdHIgOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIGdldFR5cGVOYW1lKGVsZW1lbnQpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIGdldCB0aGUgZWxlbWVudCdzIHR5cGU6bmFtZQotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50IE1ldGhvZEVsZW1lbnQKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFR5cGVOYW1lKE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgewotCQlyZXR1cm4gZWxlbWVudCA9PSBudWxsID8gIiIgOiBlbGVtZW50LmdldFR5cGUoKS5nZXROYW1lKCkgKyAiOiIgKyBlbGVtZW50LmdldE5hbWUoKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCQotCS8qKgotCSAqIGdldCB0aGUgZWxlbWVudCdzIHR5cGU6bmFtZQotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50IE1ldGhvZEVsZW1lbnQKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFR5cGVQYXRoKE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgewotCQlyZXR1cm4gZWxlbWVudCA9PSBudWxsID8gIiIgOiBlbGVtZW50LmdldFR5cGUoKS5nZXROYW1lKCkgKyAiOiIgKyBUbmdVdGlsLmdldExhYmVsV2l0aFBhdGgoZWxlbWVudCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCQotCS8qKgotCSAqIGdldCB0aGUgbWV0aG9kIHBsdWdpbnMgaW4gdGhlIGxpYnJhcnkKLQkgKiBAcGFyYW0gbGlicmFyeSBNZXRob2RMaWJyYXJ5Ci0JICogQHJldHVybiBMaXN0IGEgbGlzdCBvZiBNZXRob2RQbHVnaW4gb2JqZWN0cwotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdDxNZXRob2RQbHVnaW4+IGdldE1ldGhvZFBsdWdpbnMoTWV0aG9kTGlicmFyeSBsaWJyYXJ5KSB7Ci0JCXJldHVybiBuZXcgQXJyYXlMaXN0PE1ldGhvZFBsdWdpbj4obGlicmFyeS5nZXRNZXRob2RQbHVnaW5zKCkpOwotCX0KLQotCS8qKgotCSAqIGdldCBhIGxpc3Qgb2YgZ3VpZCBzdHJpbmdzIG9mIHRoZSBtZXRob2QgcGx1Z2lucyBpbiB0aGUgbGlicmFyeQotCSAqIEBwYXJhbSBsaWJyYXJ5IE1ldGhvZExpYnJhcnkKLQkgKiBAcmV0dXJuIExpc3QKLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3QgZ2V0TWV0aG9kUGx1Z2luR3VpZHMoTWV0aG9kTGlicmFyeSBsaWJyYXJ5KSB7Ci0JCUxpc3QgaXRlbXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUxpc3QgZWxlbWVudHMgPSBsaWJyYXJ5LmdldE1ldGhvZFBsdWdpbnMoKTsKLQkJaWYgKGVsZW1lbnRzICE9IG51bGwpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBlbGVtZW50cy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJTWV0aG9kUGx1Z2luIGVsZW1lbnQgPSAoTWV0aG9kUGx1Z2luKSBpdC5uZXh0KCk7Ci0JCQkJaXRlbXMuYWRkKGVsZW1lbnQuZ2V0R3VpZCgpKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBpdGVtczsKLQl9Ci0KLQkvKioKLQkgKiBnZXQgdGhlIE1ldGhvZFBsdWdpbiBpbiB0aGUgbGlicmFyeSB3aXRoIHRoZSBnaXZlbiBwbHVnaW4gZ3VpZC4KLQkgKiAKLQkgKiBAcGFyYW0gbGlicmFyeSBNZXRob2RMaWJyYXJ5Ci0JICogQHBhcmFtIHBsdWdpbkd1aWQgU3RyaW5nCi0JICogQHJldHVybiBNZXRob2RQbHVnaW4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1ldGhvZFBsdWdpbiBnZXRNZXRob2RQbHVnaW4oTWV0aG9kTGlicmFyeSBsaWJyYXJ5LAotCQkJU3RyaW5nIHBsdWdpbkd1aWQpIHsKLQkJaWYgKHBsdWdpbkd1aWQgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlMaXN0IGVsZW1lbnRzID0gbGlicmFyeS5nZXRNZXRob2RQbHVnaW5zKCk7Ci0JCWlmIChlbGVtZW50cyAhPSBudWxsKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gZWxlbWVudHMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCU1ldGhvZFBsdWdpbiBlbGVtZW50ID0gKE1ldGhvZFBsdWdpbikgaXQubmV4dCgpOwotCQkJCWlmIChwbHVnaW5HdWlkLmVxdWFscyhlbGVtZW50LmdldEd1aWQoKSkpIHsKLQkJCQkJcmV0dXJuIGVsZW1lbnQ7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qKgotCSAqIGdldCB0aGUgTWV0aG9kUGx1Z2luIGluIHRoZSBsaWJyYXJ5IHdpdGggdGhlIGdpdmVuIHBsdWdpbiBuYW1lLgotCSAqIAotCSAqIEBwYXJhbSBsaWJyYXJ5IE1ldGhvZExpYnJhcnkKLQkgKiBAcGFyYW0gbmFtZSBTdHJpbmcKLQkgKiBAcmV0dXJuIE1ldGhvZFBsdWdpbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTWV0aG9kUGx1Z2luIGdldE1ldGhvZFBsdWdpbkJ5TmFtZShNZXRob2RMaWJyYXJ5IGxpYnJhcnksCi0JCQlTdHJpbmcgbmFtZSkgewotCQlpZiAobmFtZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCUxpc3QgZWxlbWVudHMgPSBsaWJyYXJ5LmdldE1ldGhvZFBsdWdpbnMoKTsKLQkJaWYgKGVsZW1lbnRzICE9IG51bGwpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBlbGVtZW50cy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJTWV0aG9kUGx1Z2luIGVsZW1lbnQgPSAoTWV0aG9kUGx1Z2luKSBpdC5uZXh0KCk7Ci0JCQkJaWYgKG5hbWUuZXF1YWxzKGVsZW1lbnQuZ2V0TmFtZSgpKSkgewotCQkJCQlyZXR1cm4gZWxlbWVudDsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQotCS8qKgotCSAqIGdldCBhbGwgdGhlIGNvbnRhaW5lZCBNZXRob2RQYWNrYWdlcyBmb3IgdGhlIGVsZW1lbnQsIHJldHVybiBlbXB0eSBsaXN0IGlmIG5vdGhpbmcgZm91bmQuCi0JICogQHBhcmFtIGVsZW1lbnQgTWV0aG9kRWxlbWVudAotCSAqIEByZXR1cm4gTGlzdAotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRNZXRob2RQYWNrYWdlcyhNZXRob2RFbGVtZW50IGVsZW1lbnQpIHsKLQkJTGlzdCBpdGVtcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChJdGVyYXRvciBpdCA9IGVsZW1lbnQuZUFsbENvbnRlbnRzKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCUVPYmplY3QgZSA9IChFT2JqZWN0KSBpdC5uZXh0KCk7Ci0JCQlpZiAoZSBpbnN0YW5jZW9mIE1ldGhvZFBhY2thZ2UpIHsKLQkJCQlpdGVtcy5hZGQoZSk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gaXRlbXM7Ci0JfQotCi0JLyoqCi0JICogdXB3cmFwIHRoZSBvYmplY3QKLQkgKiBAcGFyYW0gb2JqIE9iamVjdAotCSAqIEByZXR1cm4gT2JqZWN0Ci0JICovCi0JcHVibGljIHN0YXRpYyBPYmplY3QgdW53cmFwKE9iamVjdCBvYmopIHsKLQkJcmV0dXJuIFRuZ1V0aWwudW53cmFwKG9iaik7Ci0JfQotCi0JLyoqCi0JICogdW53cmFwIHRoZSBjb21tYW5kCi0JICogQHBhcmFtIGNtZCBDb21tYW5kCi0JICogQHJldHVybiBDb21tYW5kCi0JICovCi0JcHVibGljIHN0YXRpYyBDb21tYW5kIHVud3JhcChDb21tYW5kIGNtZCkgewotCQlyZXR1cm4gVG5nVXRpbC51bndyYXAoY21kKTsKLQl9Ci0KLQkvKioKLQkgKiBjbGVhciB0aGUgcmVzb3VyY2UgdGhlIGVsZW1lbnRzIGFzc29jaWF0ZWQgdG8uIFNvIHRoYXQgdGhlIGVsZW1lbnQgY2FuIGJlCi0JICogYWRkZWQgdG8gYW5vdGhlciBsaWJyYXJ5IGFuZCBnb3QgbmV3IHJlc291cmNlIGFzc2lnbmVkLgotCSAqIAotCSAqIEBwYXJhbSBpbXBvcnRMaWJyYXR5Ci0JICogICAgICAgICAgICBNZXRob2RMaWJyYXJ5Ci0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGRldGFjaEZyb21SZXNvdXJjZShNZXRob2RMaWJyYXJ5IGltcG9ydExpYnJhdHkpIHsKLQkJUmVzb3VyY2VTZXQgcmVzU2V0ID0gbnVsbDsKLQkJUmVzb3VyY2UgcmVzID0gaW1wb3J0TGlicmF0eS5lUmVzb3VyY2UoKTsKLQkJaWYgKHJlcyAhPSBudWxsKSB7Ci0JCQlyZXNTZXQgPSByZXMuZ2V0UmVzb3VyY2VTZXQoKTsKLQkJfQotCi0JCWlmIChyZXNTZXQgIT0gbnVsbCkgewotCQkJZm9yIChUcmVlSXRlcmF0b3IgaXQgPSByZXNTZXQuZ2V0QWxsQ29udGVudHMoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBvYmogPSBpdC5uZXh0KCk7Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIE11bHRpUmVzb3VyY2VFT2JqZWN0KSB7Ci0JCQkJCSgoTXVsdGlSZXNvdXJjZUVPYmplY3QpIG9iaikuZVNldFJlc291cmNlKG51bGwpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCS8vIGNsZWFyIGFsbCB0aGUgdW5yZXNvbHZlZCBwcm94aWVzCi0JCWNsZWFyUHJveGllcyhpbXBvcnRMaWJyYXR5KTsKLQl9Ci0KLQkvKioKLQkgKiBjbGVhciBwcm94eSBmb3IgdGhlIGVsZW1lbnQuIFRoaXMgaXMgdXNlZCB0byBmaXggdGhlIGVsZW1lbnQgd2hlbiB0aGUgcHJveHkgY2FuJ3QgYmUgcmVzb2x2ZWQuCi0JICogQHBhcmFtIGVsZW1lbnQgRU9iamVjdAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBjbGVhclByb3hpZXMoRU9iamVjdCBlbGVtZW50KSB7Ci0JCWlmIChlbGVtZW50LmVJc1Byb3h5KCkpIHsKLQkJCS8vIHJlc2V0IHRoZSBwcm94eSB0byBudWxsCi0JCQlzZXRQcm94eVVSSShlbGVtZW50LCBudWxsKTsKLQkJfSBlbHNlIHsKLQkJCS8vIGl0ZXJhdGUgdGhlIGNoaWxkcmVuCi0JCQlmb3IgKFRyZWVJdGVyYXRvciBpdCA9IGVsZW1lbnQuZUFsbENvbnRlbnRzKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlFT2JqZWN0IG8gPSAoRU9iamVjdCkgaXQubmV4dCgpOwotCQkJCWlmIChvLmVJc1Byb3h5KCkpIHsKLQkJCQkJc2V0UHJveHlVUkkobywgbnVsbCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogc2V0IHRoZSBvYmplY3QncyBwcm94eSB1cmkKLQkgKiBAcGFyYW0gb2JqIEVPYmplY3QKLQkgKiBAcGFyYW0gdXJpIG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0UHJveHlVUkkoRU9iamVjdCBvYmosCi0JCQlvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJIHVyaSkgewotCQkoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3QpIG9iaikuZVNldFByb3h5VVJJKHVyaSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBDb2xsZWN0aW9uPFJlc291cmNlPiBnZXRMb2FkZWRSZXNvdXJjZXMoTWV0aG9kTGlicmFyeSBsaWIsIENvbGxlY3Rpb248UmVzb3VyY2U+IGV4Y2x1ZGVzKSB7Ci0KLQkJQ29sbGVjdGlvbjxSZXNvdXJjZT4gbG9hZGVkcmVzID0gbmV3IEhhc2hTZXQ8UmVzb3VyY2U+KCk7Ci0KLQkJZm9yIChJdGVyYXRvcjxSZXNvdXJjZT4gaXQgPSBsaWIuZVJlc291cmNlKCkuZ2V0UmVzb3VyY2VTZXQoKQotCQkJCS5nZXRSZXNvdXJjZXMoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7ICkgewotCQkJUmVzb3VyY2UgcmVzID0gKFJlc291cmNlKWl0Lm5leHQoKTsKLQkJCWlmICggcmVzLmlzTG9hZGVkKCkgKSB7Ci0JCQkJaWYgKCAoZXhjbHVkZXMgPT0gbnVsbCkgfHwgIWV4Y2x1ZGVzLmNvbnRhaW5zKHJlcykgKSB7Ci0JCQkJCWxvYWRlZHJlcy5hZGQocmVzKTsKLQkJCQl9Ci0JCQl9Ci0JCX0JCi0JCQotCQlyZXR1cm4gbG9hZGVkcmVzOwotCX0KLQkKLQkvKioKLQkgKiBsb2FkIGFsbCBlbGVtZW50cyBpbiB0aGUgbGlicmFyeQotCSAqIEBwYXJhbSBsaWIgTWV0aG9kTGlicmFyeQotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ29sbGVjdGlvbjxSZXNvdXJjZT4gbG9hZEFsbChNZXRob2RMaWJyYXJ5IGxpYikgewotCi0JCUNvbGxlY3Rpb248UmVzb3VyY2U+IGxvYWRlZHJlcyA9IGdldExvYWRlZFJlc291cmNlcyhsaWIsIG51bGwpOwotCQkKLQkJbG9hZEFsbENvbnRhaW5lZChsaWIpOwotCQkKLQkJcmV0dXJuIGdldExvYWRlZFJlc291cmNlcyhsaWIsIGxvYWRlZHJlcyk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvYWRBbGxDb250YWluZWQoTWV0aG9kRWxlbWVudCBtZSkgewotCQlmb3IgKEl0ZXJhdG9yPEVPYmplY3Q+IGl0ZXIgPSBtZS5lQWxsQ29udGVudHMoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQl0cnkgewotCQkJCUVPYmplY3QgZWxlbWVudCA9IChFT2JqZWN0KSBpdGVyLm5leHQoKTsKLQkJCQlmb3IgKEl0ZXJhdG9yPEVPYmplY3Q+IGl0ZXJhdG9yID0gZWxlbWVudC5lQ3Jvc3NSZWZlcmVuY2VzKCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IKLQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCWl0ZXJhdG9yLm5leHQoKTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCUxpYnJhcnlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJfQotCQl9Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2FkQWxsUGx1Z2lucyhNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZykgewotCQlMaXN0PE1ldGhvZFBsdWdpbj4gcGx1aWducyA9IGNvbmZpZy5nZXRNZXRob2RQbHVnaW5TZWxlY3Rpb24oKTsKLQkJZm9yIChNZXRob2RQbHVnaW4gcGx1Z2luOiBwbHVpZ25zKSB7Ci0JCQlsb2FkQWxsQ29udGFpbmVkKHBsdWdpbik7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogbG9hZCBhbGwgcHJvY2Vzc2VzIGluIHRoZSBsaWJyYXJ5Ci0JICogQHBhcmFtIGxpYiBNZXRob2RMaWJyYXJ5Ci0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvYWRBbGxQcm9jZXNzZXMoTWV0aG9kTGlicmFyeSBsaWIpIHsKLQotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBsaWIuZ2V0TWV0aG9kUGx1Z2lucygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJdHJ5IHsKLQkJCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gKE1ldGhvZFBsdWdpbikgaXRlci5uZXh0KCk7Ci0JCQkJVG5nVXRpbC5nZXRBbGxQcm9jZXNzZXMocGx1Z2luKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkubG9nKGUpOwotCQkJfQotCQl9Ci0JfQotCQotCS8qKgotCSAqIHNhdmUgYWxsIGVsZW1lbnRzIGluIHRoZSBsaWJyYXJ5IG5vdCBtYXR0ZXIgdGhlIGVsZW1lbnQgaXMgY2hhbmdlZCBvciBub3QuIAotCSAqIERvbid0IHJlZnJlc2ggdGhlIHdvcmtzcGFjZS4KLQkgKiBAcGFyYW0gbGliIE1ldGhvZExpYnJhcnkKLQkgKiBAdGhyb3dzIEV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzYXZlQWxsKE1ldGhvZExpYnJhcnkgbGliKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc2F2ZUxpYnJhcnkobGliLCB0cnVlLCBmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogc2F2ZSB0aGUgc3BlY2lmaWVkIG1ldGhvZCBsaWJyYXJ5IGJhc2VkIG9uIHRoZSBsaWJyYXJ5IHJlc291cmNlc2V0LiBZb3UKLQkgKiBuZWVkIHRvIHNldCB0aGUgcmVzb3VyY2Ugc2V0IGJlZm9yZSBjYWxsaW5nIHRoaXMgbWV0aG9kIHRvIHNhdmUgdGhlCi0JICogbGlicmFyeQotCSAqIAotCSAqIEBwYXJhbSBsaWIKLQkgKiAgICAgICAgICAgIE1ldGhvZExpYnJhcnkKLQkgKiBAcGFyYW0gc2F2ZUFsbAotCSAqICAgICAgICAgICAgYm9vbGVhbiBpZiB0cnVlLCBmb3JjZSBzYXZpbmcgYWxsIHRoZSByZXNvdXJjZXMgZXZlbiBpZiB0aGV5Ci0JICogICAgICAgICAgICBhcmUgbm90IG1vZGlmaWVkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzYXZlTGlicmFyeShNZXRob2RMaWJyYXJ5IGxpYiwgYm9vbGVhbiBzYXZlQWxsLAotCQkJYm9vbGVhbiByZWZyZXNoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUxpYnJhcnlSZXNvdXJjZVNldCBsaWJSZXNvdXJjZVNldCA9IChJTGlicmFyeVJlc291cmNlU2V0KSBsaWIuZVJlc291cmNlKCkuZ2V0UmVzb3VyY2VTZXQoKTsKLQkJaWYobGliUmVzb3VyY2VTZXQgaW5zdGFuY2VvZiBNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwpIHsKLQkJCU11bHRpRmlsZVJlc291cmNlU2V0SW1wbCByZXNvdXJjZVNldCA9IChNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwpIGxpYlJlc291cmNlU2V0OwotCi0JCQlJTGlicmFyeU1hbmFnZXIgbWFuYWdlciA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLQkJCS5nZXRDdXJyZW50TGlicmFyeU1hbmFnZXIoKTsKLQkJCU1hcCBzYXZlT3B0aW9ucyA9IG1hbmFnZXIgIT0gbnVsbCA/IG1hbmFnZXIuZ2V0U2F2ZU9wdGlvbnMoKQotCQkJCQk6IG5ldyBIYXNoTWFwKCk7Ci0KLQkJCS8vIGJhY2sgdXAgY3VycmVudCBSRUZSRVNIX05FV19SRVNPVVJDRSBvcHRpb24KLQkJCU9iamVjdCBvbGQgPSBzYXZlT3B0aW9ucy5nZXQoTXVsdGlGaWxlWE1JU2F2ZUltcGwuUkVGUkVTSF9ORVdfUkVTT1VSQ0UpOwotCQkJT2JqZWN0IG9sZENoZWNrTW9kaWZ5ID0gc2F2ZU9wdGlvbnMKLQkJCS5nZXQoTXVsdGlGaWxlWE1JU2F2ZUltcGwuQ0hFQ0tfTU9ESUZZKTsKLQkJCXRyeSB7Ci0JCQkJLy8gZGlzYWJsZSB3b3Jrc3BhY2UgcmVmcmVzaCB3aGVuIG5ldyBmaWxlIGlzIGNyZWF0ZWQKLQkJCQlzYXZlT3B0aW9ucy5wdXQoTXVsdGlGaWxlWE1JU2F2ZUltcGwuUkVGUkVTSF9ORVdfUkVTT1VSQ0UsCi0JCQkJCQlyZWZyZXNoID8gInRydWUiIDogImZhbHNlIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCXNhdmVPcHRpb25zLnB1dChNdWx0aUZpbGVYTUlTYXZlSW1wbC5DSEVDS19NT0RJRlksICJmYWxzZSIpOyAvLyROT04tTkxTLTEkCi0KLQkJCQkvLyBzYXZlIHJlc291cmNlIHNldCBoZXJlCi0JCQkJcmVzb3VyY2VTZXQuc2F2ZShzYXZlT3B0aW9ucywgc2F2ZUFsbCk7Ci0JCQl9IGZpbmFsbHkgewotCQkJCS8vIHJlc3RvcmUgUkVGUkVTSF9ORVdfUkVTT1VSQ0Ugb3B0aW9uCi0JCQkJc2F2ZU9wdGlvbnMucHV0KE11bHRpRmlsZVhNSVNhdmVJbXBsLlJFRlJFU0hfTkVXX1JFU09VUkNFLCBvbGQpOwotCQkJCXNhdmVPcHRpb25zLnB1dChNdWx0aUZpbGVYTUlTYXZlSW1wbC5DSEVDS19NT0RJRlksIG9sZENoZWNrTW9kaWZ5KTsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCWxpYlJlc291cmNlU2V0LnNhdmUoQ29sbGVjdGlvbnMuRU1QVFlfTUFQKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIGxvYWQgdGhlIGxpYnJhcnkgYXQgdGhlIHNwZWNpZmllZCBwYXRoLiByZXR1cm4gdGhlIE1ldGhvZExpYnJhcnkuCi0JICogVGhpcyBtZXRob2QgaXMgZGlmZmVyZW50IGZyb20gdGhlIHRoZSBvcGVuIGxpYnJhcnkgaW4gTGlicmFyeVNlcnZpY2UuIAotCSAqIEl0IG9ubHkgbG9hZCB0aGUgcm93IGxpYnJhcnkgb2JqZWN0IGJ1dCB3aWxsIG5vdCBpbXBhY3QgdGhlIGN1cnJlbnQgRVBGIGVudmlyb25tZW50LgotCSAqIEBwYXJhbSBsaWJyYXJ5UGF0aCBTdHJpbmcKLQkgKiBAcmV0dXJuIE1ldGhvZExpYnJhcnkKLQkgKiBAdGhyb3dzIEV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTWV0aG9kTGlicmFyeSBsb2FkTGlicmFyeShTdHJpbmcgbGlicmFyeVBhdGgpCi0JCQl0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUxpYnJhcnlSZXNvdXJjZVNldCByZXNvdXJjZVNldCA9IFBlcnNpc3RlbmNlU2VydmljZS5JTlNUQU5DRS5jcmVhdGVSZXNvdXJjZVNldChTZXJ2aWNlcy5YTUlfUEVSU0lTVEVOQ0VfVFlQRSk7Ci0JCXJlc291cmNlU2V0LmxvYWRNZXRob2RMaWJyYXJpZXMoVVJJLmNyZWF0ZUZpbGVVUkkobGlicmFyeVBhdGgpLCBDb2xsZWN0aW9ucy5FTVBUWV9NQVApOwotCQlyZXR1cm4gcmVzb3VyY2VTZXQuZ2V0Rmlyc3RNZXRob2RMaWJyYXJ5KCk7Ci0JfQotCi0JLyoqCi0JICogZ2V0IHRoZSByb290IHBhdGggb2YgdGhlIG1ldGhvZCBsaWJyYXJ5IAotCSAqIEBwYXJhbSBsaWIgTWV0aG9kTGlicmFyeQotCSAqIEByZXR1cm4gRmlsZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgRmlsZSBnZXRMaWJyYXJ5Um9vdFBhdGgoTWV0aG9kTGlicmFyeSBsaWIpIHsKLQkJUmVzb3VyY2UgcmVzID0gbGliLmVSZXNvdXJjZSgpOwotCQlpZiAocmVzID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJVVJJIHVyaSA9IHJlcy5nZXRVUkkoKTsKLQkJU3RyaW5nIHBhdGggPSB1cmkudG9GaWxlU3RyaW5nKCk7Ci0JCUZpbGUgZiA9IG5ldyBGaWxlKHBhdGgpOwotCQlyZXR1cm4gZi5nZXRQYXJlbnRGaWxlKCk7Ci0JfQotCi0JLyoqCi0JICogZ2V0IGFsbCBwYWNrYWdlcyBpbiB0aGUgcGx1Z2luCi0JICogQHBhcmFtIHBsdWdpbiBNZXRob2RQbHVnaW4KLQkgKiBAcmV0dXJuIExpc3QKLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3QgZ2V0QWxsUGFja2FnZXMoTWV0aG9kUGx1Z2luIHBsdWdpbikgewotCQlMaXN0IGFsbFBrZ3MgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJTGlzdCBwa2dzID0gcGx1Z2luLmdldE1ldGhvZFBhY2thZ2VzKCk7Ci0JCWFsbFBrZ3MuYWRkQWxsKHBrZ3MpOwotCi0JCWZvciAoSXRlcmF0b3IgaXQgPSBwa2dzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCWdldEFsbENoaWxkUGFja2FnZXMoKE1ldGhvZFBhY2thZ2UpIGl0Lm5leHQoKSwgYWxsUGtncyk7Ci0JCX0KLQotCQlyZXR1cm4gYWxsUGtnczsKLQl9Ci0KLQkvKioKLQkgKiBnZXQgYWxsIGNoaWxkIHBhY2thZ2VzIG9mIHRoZSBnaXZlbiBNZXRob2RQYWNrYWdlIGFuZCBhZGQgdG8gdGhlIGxpc3QKLQkgKiBAcGFyYW0gcGtnIE1ldGhvZFBhY2thZ2UKLQkgKiBAcGFyYW0gcmVzdWx0IExpc3QgdGhlIHBhY2thZ2VzIGZvdW5kCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGdldEFsbENoaWxkUGFja2FnZXMoTWV0aG9kUGFja2FnZSBwa2csIExpc3QgcmVzdWx0KSB7Ci0JCUxpc3QgcGtncyA9IHBrZy5nZXRDaGlsZFBhY2thZ2VzKCk7Ci0JCXJlc3VsdC5hZGRBbGwocGtncyk7Ci0KLQkJZm9yIChJdGVyYXRvciBpdCA9IHBrZ3MuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJZ2V0QWxsQ2hpbGRQYWNrYWdlcygoTWV0aG9kUGFja2FnZSkgaXQubmV4dCgpLCByZXN1bHQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogZ2V0IGFsbCBjb25maWd1cmF0aW9ucyByZWZlcmVuY2VkIGJ5IHRoaXMgcGx1Z2luCi0JICogCi0JICogQHBhcmFtIHBsdWdpbgotCSAqIEByZXR1cm4gTGlzdCBvZiBNZXRob2RDb25maWd1cmF0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0PE1ldGhvZENvbmZpZ3VyYXRpb24+IGdldEFzc29jaWF0ZWRDb25maWd1cmF0aW9ucyhNZXRob2RQbHVnaW4gcGx1Z2luKSB7Ci0JCS8vIGdldCB0aGUgY29uZmlncyB0aGF0IHJlZmVyZW5jZXMgdGhpcyBtZXRob2QgcGx1Z2luCi0JCUxpc3Q8TWV0aG9kQ29uZmlndXJhdGlvbj4gYWxsQ29uZmlncyA9IG5ldyBBcnJheUxpc3Q8TWV0aG9kQ29uZmlndXJhdGlvbj4oKTsKLS8qCQlMaXN0IGNvbmZpZ3MgPSAoTGlzdCkgKChNdWx0aVJlc291cmNlRU9iamVjdCkgcGx1Z2luKQotCQkJCS5nZXRPcHBvc2l0ZUZlYXR1cmVWYWx1ZShBc3NvY2lhdGlvbkhlbHBlci5NZXRob2RQbHVnaW5fTWV0aG9kQ29uZmlndXJhdGlvbnMpOwotCQlhZGRVbmlxdWVJdGVtcyhjb25maWdzLCBhbGxDb25maWdzKTsKLQotCQkvLyBnZXQgdGhlIGNvbmZpZ3MgdGhhdCByZWZlcmVuY2VzIHRoZSBwYWNrYWdlcyBpbiB0aGlzIHBsdWdpbgotCQlMaXN0IHBrZ3MgPSBnZXRBbGxQYWNrYWdlcyhwbHVnaW4pOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gcGtncy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlNdWx0aVJlc291cmNlRU9iamVjdCBvID0gKE11bHRpUmVzb3VyY2VFT2JqZWN0KSBpdC5uZXh0KCk7Ci0KLQkJCWNvbmZpZ3MgPSAoTGlzdCkgbwotCQkJCQkuZ2V0T3Bwb3NpdGVGZWF0dXJlVmFsdWUoQXNzb2NpYXRpb25IZWxwZXIuTWV0aG9kUGFja2FnZV9NZXRob2RDb25maWd1cmF0aW9ucyk7Ci0JCQlhZGRVbmlxdWVJdGVtcyhjb25maWdzLCBhbGxDb25maWdzKTsKLQkJfQotKi8KLQkJLy8gZ2V0IHRoZSBjb25naWd1cmF0aW9ucyB0aGF0IHJlZmVyZW5jZWQgYnkgdGhlIHByb2Nlc3NlcyBpbiB0aGlzCi0JCS8vIHBsdWdpbgotCQlMaXN0IHByb2NzID0gVG5nVXRpbC5nZXRBbGxQcm9jZXNzZXMocGx1Z2luKTsKLQkJZm9yIChJdGVyYXRvciBpdCA9IHByb2NzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCW9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzcyBwID0gKG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzcykgaXQKLQkJCQkJLm5leHQoKTsKLQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gYyA9IHAuZ2V0RGVmYXVsdENvbnRleHQoKTsKLQkJCWlmICgoYyAhPSBudWxsKSAmJiAhYWxsQ29uZmlncy5jb250YWlucyhjKSkgewotCQkJCWFsbENvbmZpZ3MuYWRkKGMpOwotCQkJfQotCQkJYWRkVW5pcXVlSXRlbXMocC5nZXRWYWxpZENvbnRleHQoKSwgYWxsQ29uZmlncyk7Ci0JCX0KLQotCQlyZXR1cm4gYWxsQ29uZmlnczsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGFkZFVuaXF1ZUl0ZW1zKExpc3QgZnJvbSwgTGlzdCB0bykgewotCQlpZiAoZnJvbSA9PSBudWxsIHx8IHRvID09IG51bGwgfHwgZnJvbS5zaXplKCkgPT0gMCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJZm9yIChJdGVyYXRvciBpdCA9IGZyb20uaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IG8gPSBpdC5uZXh0KCk7Ci0JCQlpZiAoIXRvLmNvbnRhaW5zKG8pKSB7Ci0JCQkJdG8uYWRkKG8pOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogdmFsaWRhdGUgdGhlIGNvbmZpZ3VyYXRpb24gYnkgZm9yY2luZyB0byBzZWxlY3QgdGhlIGdsb2JhbCBwYWNrYWdlcyBvZgotCSAqIHRoZSBzZWxlY3RlZCBtZXRob2QgcGx1Z2lucywgdGhpcyBpcyBuZWVkZWQgZm9yIGNvbmZpZ3VyYXRpb24gZXhwb3J0aW5nLgotCSAqIElmIGdsb2JhbCBwYWNrYWdlcyBhcmUgbWlzc2luZywgdGhlIGV4cG9ydGVkIGNvbmZpZ3VyYXRpb24gaXMgbm90IHZhbGlkCi0JICogCi0JICogQHBhcmFtIGFjdGlvbk1nciBpZiBub3QgbnVsbCwgd2lsbCB1c2UgdGhlIGdpdmVuIElBY3Rpb25NYW5hZ2VyIHRvIGNoYW5nZSB0aGUgY29uZmlndXJhdGlvbiwgb3RoZXJ3aXNlIGNvbmZpZ3VyYXRpb24gd2lsbCBiZSBjaGFuZ2VkIGRpcmVjdGx5Ci0JICogQHBhcmFtIHBsdWdpbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCB2YWxpZGF0ZU1ldGhvZENvbmZpZ3VyYXRpb24oSUFjdGlvbk1hbmFnZXIgYWN0aW9uTWdyLCBNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZykgewotLy8JCUxpc3QgcGx1Z2lucyA9IGNvbmZpZy5nZXRNZXRob2RQbHVnaW5TZWxlY3Rpb24oKTsKLS8vCQlMaXN0IHBrZ1NlbHMgPSBjb25maWcuZ2V0TWV0aG9kUGFja2FnZVNlbGVjdGlvbigpOwotLy8KLS8vCQlmb3IgKEl0ZXJhdG9yIGl0cCA9IHBsdWdpbnMuaXRlcmF0b3IoKTsgaXRwLmhhc05leHQoKTspIHsKLS8vCQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IChNZXRob2RQbHVnaW4pIGl0cC5uZXh0KCk7Ci0vLwkJCUxpc3QgcGtncyA9IFRuZ1V0aWwuZ2V0QWxsU3lzdGVtUGFja2FnZXMocGx1Z2luKTsKLS8vCQkJZm9yIChJdGVyYXRvciBpdCA9IHBrZ3MuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotLy8JCQkJT2JqZWN0IHBrZyA9IGl0Lm5leHQoKTsKLS8vCQkJCWlmICghcGtnU2Vscy5jb250YWlucyhwa2cpKSB7Ci0vLwkJCQkJcGtnU2Vscy5hZGQocGtnKTsKLS8vCQkJCX0KLS8vCQkJfQotLy8JCX0KLQkJCi0JCS8vIG1vdmVkIHRvIFRuZ1V0aWwKLQkJVG5nVXRpbC52YWxpZGF0ZU1ldGhvZENvbmZpZ3VyYXRpb24oYWN0aW9uTWdyLCBjb25maWcpOwotCX0KLQotCS8qKgotCSAqIHZhbGlkYXRlIHRoZSBjb25maWd1cmF0aW9uIGJ5IGZvcmNpbmcgdG8gc2VsZWN0IHRoZSBnbG9iYWwgcGFja2FnZXMgb2YKLQkgKiB0aGUgc2VsZWN0ZWQgbWV0aG9kIHBsdWdpbnMsIHRoaXMgaXMgbmVlZGVkIGZvciBjb25maWd1cmF0aW9uIGV4cG9ydGluZy4KLQkgKiBJZiBnbG9iYWwgcGFja2FnZXMgYXJlIG1pc3NpbmcsIHRoZSBleHBvcnRlZCBjb25maWd1cmF0aW9uIGlzIG5vdCB2YWxpZAotCSAqIEBwYXJhbSBwbHVnaW4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgdmFsaWRhdGVNZXRob2RDb25maWd1cmF0aW9uKE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0JCXZhbGlkYXRlTWV0aG9kQ29uZmlndXJhdGlvbihudWxsLCBjb25maWcpOwotCX0KLQkKLQkvKioKLQkgKiBnZXQgdGhlIGNvcHlyaWdodCBvYmplY3QgZm9yIGFuIGVsZW1lbnQKLQkgKiBAcGFyYW0gZWxlbWVudCBNZXRob2RFbGVtZW50Ci0JICogQHJldHVybiBTdXBwb3J0aW5nTWF0ZXJpYWwKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN1cHBvcnRpbmdNYXRlcmlhbCBnZXRDb3B5cmlnaHQoTWV0aG9kRWxlbWVudCBlbGVtZW50KSB7Ci0JCVN1cHBvcnRpbmdNYXRlcmlhbCBzbSA9IG51bGw7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kVW5pdCkgewotCQkJc20gPSAoKE1ldGhvZFVuaXQpIGVsZW1lbnQpLmdldENvcHlyaWdodFN0YXRlbWVudCgpOwotCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBEZXNjcmliYWJsZUVsZW1lbnQpIHsKLQkJCXNtID0gKChEZXNjcmliYWJsZUVsZW1lbnQpIGVsZW1lbnQpLmdldFByZXNlbnRhdGlvbigpCi0JCQkJCS5nZXRDb3B5cmlnaHRTdGF0ZW1lbnQoKTsKLQkJfQotCi0JCS8vIGlmIG5vIGNvcHlyaWdodCBvZiBpdCdzIG93biwgZ2V0IHRoZSBjb3B5cmlnaHQgZnJvbSB0aGUgcGx1Z2luCi0JCWlmIChzbSA9PSBudWxsKSB7Ci0JCQlNZXRob2RQbHVnaW4gcCA9IGdldE1ldGhvZFBsdWdpbihlbGVtZW50KTsKLQkJCWlmIChwICE9IG51bGwpIHsKLQkJCQlzbSA9IHAuZ2V0Q29weXJpZ2h0U3RhdGVtZW50KCk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gc207Ci0JfQotCi0JLyoqCi0JICogZm9yIHRoZSBnaXZlbiBjb250YWluZXIgYW5kIGVsZW1lbnRzIGxpc3QsIGNoZWNrIGlmIHRoZSBlbGVtZW50IGluIHRoZSBsaXN0IGlzIGNvbnRhaW5lZCBieSB0aGUgY29udGFpbmVyIG9yIG5vdC4gCi0JICogcmV0dXJuIGFsbCB0aGUgY29udGFpbmVkIGVsZW1lbnRzIGZvciBhIGdpdmVuIGNvbnRhaW5lcgotCSAqIEBwYXJhbSBjb250YWluZXIgT2JqZWN0Ci0JICogQHBhcmFtIGVsZW1lbnRzIENvbGxlY3Rpb24KLQkgKiBAcmV0dXJuIENvbGxlY3Rpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIENvbGxlY3Rpb24gZ2V0Q29udGFpbmVkRWxlbWVudHMoT2JqZWN0IGNvbnRhaW5lciwKLQkJCUNvbGxlY3Rpb24gZWxlbWVudHMpIHsKLQkJaWYgKGNvbnRhaW5lciBpbnN0YW5jZW9mIFRyYW5zaWVudEdyb3VwSXRlbVByb3ZpZGVyKSB7Ci0JCQljb250YWluZXIgPSAoKFRyYW5zaWVudEdyb3VwSXRlbVByb3ZpZGVyKSBjb250YWluZXIpLmdldFRhcmdldCgpOwotCQl9Ci0JCUFycmF5TGlzdCBjb250YWluZWQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGVsZW1lbnRzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyLm5leHQoKTsKLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgRU9iamVjdAotCQkJCQkmJiBVbWFVdGlsLmlzQ29udGFpbmVkQnkoKEVPYmplY3QpIGVsZW1lbnQsIGNvbnRhaW5lcikpIHsKLQkJCQljb250YWluZWQuYWRkKGVsZW1lbnQpOwotCQkJfQotCQl9Ci0JCXJldHVybiBjb250YWluZWQ7Ci0JfQotCi0JLyoqCi0JICogY2hlY2sgaWYgdHdvIG1ldGhvZCBlbGVtZW50IGFyZSBpZGVudGljYWwgb3Igbm90LiBUd28gZWxlbWVudHMgYXJlCi0JICogaWRlbnRpY2FsIGlmIGFuZCBvbmx5IGlmOiBhbGwgdGhlIGF0dHJpYnV0ZSB2YWx1ZXMgYXJlIGVxdWFsIGFsbCB0aGUKLQkgKiByZWZlcmVuY2VkIGVsZW1lbnRzIGFyZSBlcXVhbCBhbGwgdGhlIGNvbnRhaW5lZCBlbGVtZW50cyBhcmUgaWRlbnRpY2FsCi0JICogCi0JICogQHBhcmFtIG9sZE9iagotCSAqICAgICAgICAgICAgTWV0aG9kRWxlbWVudAotCSAqIEBwYXJhbSBuZXdPYmoKLQkgKiAgICAgICAgICAgIE1ldGhvZEVsZW1lbnQKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNJZGVudGljYWwoTWV0aG9kRWxlbWVudCBvbGRPYmosIE1ldGhvZEVsZW1lbnQgbmV3T2JqKSB7Ci0KLQkJaWYgKChvbGRPYmogPT0gbnVsbCkgJiYgKG5ld09iaiA9PSBudWxsKSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQotCQlpZiAoKG9sZE9iaiA9PSBudWxsKSB8fCAobmV3T2JqID09IG51bGwpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQkvLyB0aGlzIGRvZXMgbm90IHdvcmssIHRoZSB0b1N0cmluZyBjb250YWlucyB0aGUgb2JqZWN0IGluc3RhbmNlIGluZm8KLQkJLy8gcmV0dXJuIG9sZE9iai50b1N0cmluZygpLmVxdWFscyhuZXdPYmoudG9TdHJpbmcoKSk7Ci0KLQkJTGlzdCBmZWF0dXJlcyA9IGdldFN0cnVjdHVyYWxGZWF0dXJlcyhvbGRPYmopOwotLy8JCUxpc3QgcHJvcGVydGllcyA9IG9sZE9iai5nZXRJbnN0YW5jZVByb3BlcnRpZXMoKTsKLQkJaWYgKGZlYXR1cmVzICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmVhdHVyZXMuc2l6ZSgpOyBpKyspIHsKLQkJCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IChFU3RydWN0dXJhbEZlYXR1cmUpIGZlYXR1cmVzCi0JCQkJCQkuZ2V0KGkpOwotCQkJCU9iamVjdCBvbGRWYWx1ZSA9IG9sZE9iai5lR2V0KGZlYXR1cmUpOwotCQkJCU9iamVjdCBuZXdWYWx1ZSA9IG5ld09iai5lR2V0KGZlYXR1cmUpOwotCQkJCWlmIChvbGRWYWx1ZSA9PSBudWxsICYmIG5ld1ZhbHVlID09IG51bGwpIHsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCi0JCQkJaWYgKG9sZFZhbHVlID09IG51bGwgfHwgbmV3VmFsdWUgPT0gbnVsbCkgewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCi0JCQkJaWYgKG9sZFZhbHVlIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCi0JCQkJCS8vIGlmIGl0J2MgY29udGFpbm1lbnQgZmVhdHVyZSB2YWx1ZSwgaXRlcmF0ZSBpdAotCQkJCQlNZXRob2RFbGVtZW50IG9sZGUgPSAoTWV0aG9kRWxlbWVudCkgb2xkVmFsdWU7Ci0JCQkJCWlmIChvbGRlLmVDb250YWluZXIoKSA9PSBvbGRPYmopIHsKLQkJCQkJCWlmICghaXNJZGVudGljYWwob2xkZSwgKE1ldGhvZEVsZW1lbnQpIG5ld1ZhbHVlKSkgewotCQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJCX0KLQkJCQkJfSBlbHNlIGlmIChvbGRWYWx1ZSAhPSBuZXdWYWx1ZSkgewotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQl9Ci0JCQkJfSBlbHNlIGlmIChvbGRWYWx1ZSBpbnN0YW5jZW9mIExpc3QpIHsKLQkJCQkJTGlzdCBvbGRsID0gKExpc3QpIG9sZFZhbHVlOwotCQkJCQlMaXN0IG5ld2wgPSAoTGlzdCkgbmV3VmFsdWU7Ci0JCQkJCWlmIChvbGRsLnNpemUoKSAhPSBuZXdsLnNpemUoKSkgewotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQl9Ci0KLQkJCQkJZm9yIChpbnQgeCA9IDA7IHggPCBvbGRsLnNpemUoKTsgeCsrKSB7Ci0JCQkJCQlPYmplY3QgbyA9IG9sZGwuZ2V0KHgpOwotCQkJCQkJT2JqZWN0IG4gPSBuZXdsLmdldCh4KTsKLQkJCQkJCWlmIChvIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJCQkJCS8vIGlmIGl0J2MgY29udGFpbm1lbnQgZmVhdHVyZSB2YWx1ZSwgaXRlcmF0ZSBpdAotCQkJCQkJCU1ldGhvZEVsZW1lbnQgb2xkZSA9IChNZXRob2RFbGVtZW50KSBvOwotCQkJCQkJCWlmIChvbGRlLmVDb250YWluZXIoKSA9PSBvbGRPYmopIHsKLQkJCQkJCQkJaWYgKCFpc0lkZW50aWNhbChvbGRlLCAoTWV0aG9kRWxlbWVudCkgbikpIHsKLQkJCQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJCQkJfQotCQkJCQkJCX0gZWxzZSBpZiAob2xkVmFsdWUgIT0gbmV3VmFsdWUpIHsKLQkJCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQkJCX0KLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJaWYgKCFvLmVxdWFscyhuKSkgewotCQkJCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJaWYgKCFvbGRWYWx1ZS5lcXVhbHMobmV3VmFsdWUpKSB7Ci0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JLyoqCi0JICogY2hlY2sgaWYgdGhlIGVsZW1lbnQgaXMgYSBwcm9jZXNzIG9yIG5vdC4gCi0JICogQSBQcm9jZXNzIGlzIGEgQ2FwYWJpbGl0eVBhdHRlcm4gb3IgRGVsaXZlcnlQcm9jZXNzIG9iamVjdCAKLQkgKiB0aGF0IGlzIGNvbnRhaW5lZCBieSBhIFByb2Nlc3NDb21wb25lbnQuCi0JICogQHBhcmFtIGUgRU9iamVjdAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1Byb2Nlc3MoRU9iamVjdCBlKSB7Ci0JCXJldHVybiAoZSBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzcykgJiYgCi0JCQkoZS5lQ29udGFpbmVyKCkgaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50KTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBMaXN0IGdldFZhbGlkVmlld3MoTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLQkJCi0JCUxpc3Qgdmlld3MgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoIEl0ZXJhdG9yIGl0ID0gY29uZmlnLmdldFByb2Nlc3NWaWV3cygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTsgKSB7Ci0JCQlDb250ZW50Q2F0ZWdvcnkgdmlldyA9IChDb250ZW50Q2F0ZWdvcnkpaXQubmV4dCgpOwotCQkJaWYgKCAhQ29uZmlndXJhdGlvbkhlbHBlci5pc0NvbnRyaWJ1dG9yKHZpZXcpICkgewotCQkJCXZpZXcgPSAoQ29udGVudENhdGVnb3J5KUNvbmZpZ3VyYXRpb25IZWxwZXIuZ2V0Q2FsY3VsYXRlZEVsZW1lbnQodmlldywgY29uZmlnKTsKLQkJCQlpZiAoIHZpZXcgIT0gbnVsbCAmJiAhdmlld3MuY29udGFpbnModmlldykgKSB7Ci0JCQkJCXZpZXdzLmFkZCh2aWV3KTsKLQkJCQl9IAotCQkJfQkKLQkJfQotCQkJCQotCQlyZXR1cm4gdmlld3M7Ci0JfQotCQotLy8JcHVibGljIHN0YXRpYyBMaXN0IGdldFN1cGVyQWN0aXZpdGllcyhCcmVha2Rvd25FbGVtZW50IGVsZW1lbnQpIHsKLS8vCQlMaXN0IGl0ZW1zID0gbmV3IEFycmF5TGlzdCgpOwotLy8KLS8vCQkvLyBidWlsZCB0aGUgcGFyZW50IG5vZGVzCi0vLwkJQnJlYWtkb3duRWxlbWVudCBwYXJlbnQgPSBlbGVtZW50LmdldFN1cGVyQWN0aXZpdGllcygpOyAKLS8vCQl3aGlsZSAoIHBhcmVudCAhPSBudWxsICkgewotLy8JCQlpdGVtcy5hZGQoMCwgcGFyZW50KTsKLS8vCQkJaWYgKExpYnJhcnlVdGlsLmlzUHJvY2VzcyhwYXJlbnQpICkgewotLy8JCQkJYnJlYWs7Ci0vLwkJCX0KLS8vCQkJcGFyZW50ID0gcGFyZW50LmdldFN1cGVyQWN0aXZpdGllcygpOwotLy8JCX0KLS8vCi0vLwkJcmV0dXJuIGl0ZW1zOwotLy8JfQotCQotCS8qKgotCSAqIFJldHVybnMgYWxsIHN0cnVjdHVyYWwgZmVhdHVyZXMgZm9yIHRoZSBnaXZlbiBtZXRob2QgZWxlbWVudAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRTdHJ1Y3R1cmFsRmVhdHVyZXMoTWV0aG9kRWxlbWVudCBlbGVtZW50KSB7Ci0JCUxpc3QgcHJvcGVydGllcyA9IGVsZW1lbnQuZ2V0SW5zdGFuY2VQcm9wZXJ0aWVzKCk7Ci0KLQkJaWYgKHByb3BlcnRpZXMgIT0gbnVsbCkgewotCQkJTGlzdDxFU3RydWN0dXJhbEZlYXR1cmU+IGZlYXR1cmVzID0gbmV3IEFycmF5TGlzdDxFU3RydWN0dXJhbEZlYXR1cmU+KCk7Ci0JCQkvLyBnZXQgYWxsIGZlYXR1cmVzCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IHByb3BlcnRpZXMuc2l6ZSgpOyBpKyspIHsKLQkJCQlFUHJvcGVydHkgcHJvcGVydHkgPSAoRVByb3BlcnR5KSBwcm9wZXJ0aWVzLmdldChpKTsKLQkJCQlpZiAocHJvcGVydHkgIT0gbnVsbCkgewotCQkJCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IHByb3BlcnR5Ci0JCQkJCQkJLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZSgpOwotCQkJCQlmZWF0dXJlcy5hZGQoZmVhdHVyZSk7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIGZlYXR1cmVzOwotCQl9IGVsc2UKLQkJCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIExpc3Q8RUNsYXNzPiBnZXRJbmNsdWRlZEVsZW1lbnRUeXBlcygpIHsKLQkJaWYgKGluY2x1ZGVkRWxlbWVudFR5cGVzID09IG51bGwpIHsKLQkJCXN5bmNocm9uaXplZCAoTGlicmFyeVV0aWwuY2xhc3MpIHsKLQkJCQlpZiAoaW5jbHVkZWRFbGVtZW50VHlwZXMgPT0gbnVsbCkgewotCQkJCQlpbmNsdWRlZEVsZW1lbnRUeXBlcyA9IG5ldyBBcnJheUxpc3Q8RUNsYXNzPigpOwotCQkJCQlmb3IgKEVDbGFzc2lmaWVyIGNscyA6IFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJLmdldEVDbGFzc2lmaWVycygpKSB7Ci0JCQkJCQlpZiAoY2xzIGluc3RhbmNlb2YgRUNsYXNzCi0JCQkJCQkJCSYmIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldERlc2NyaWJhYmxlRWxlbWVudCgpCi0JCQkJCQkJCQkJLmlzU3VwZXJUeXBlT2YoKEVDbGFzcykgY2xzKSkgewotCQkJCQkJCWluY2x1ZGVkRWxlbWVudFR5cGVzLmFkZCgoRUNsYXNzKSBjbHMpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWluY2x1ZGVkRWxlbWVudFR5cGVzLnJlbW92ZUFsbChleGNsdWRlZFR5cGVzKTsKLQkJCQkJQ29sbGVjdGlvbnMuc29ydChpbmNsdWRlZEVsZW1lbnRUeXBlcywgdHlwZUNvbXBhcmF0b3IpOwotCQkJCQlpbmNsdWRlZEVsZW1lbnRUeXBlcyA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoaW5jbHVkZWRFbGVtZW50VHlwZXMpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gaW5jbHVkZWRFbGVtZW50VHlwZXM7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgTGlzdDxEZXNjcmliYWJsZUVsZW1lbnQ+IGdldEluY2x1ZGVkRWxlbWVudHMoQ3VzdG9tQ2F0ZWdvcnkgY2F0ZWdvcnksIE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0JCUxpc3Q8RGVzY3JpYmFibGVFbGVtZW50PiBpbmNsdWRlZEVsZW1lbnRzID0gbmV3IEFycmF5TGlzdDxEZXNjcmliYWJsZUVsZW1lbnQ+KCk7Ci0JCWlmIChjb25maWcgPT0gbnVsbCkgewotCQkJcmV0dXJuIGluY2x1ZGVkRWxlbWVudHM7Ci0JCX0KLQkJTWV0aG9kRWxlbWVudFByb3BlcnR5IHByb3AgPSBNZXRob2RFbGVtZW50UHJvcGVydHlIZWxwZXIuZ2V0UHJvcGVydHkoY2F0ZWdvcnksIE1ldGhvZEVsZW1lbnRQcm9wZXJ0eUhlbHBlci5DVVNUT01fQ0FURUdPUllfX0lOQ0xVREVEX0VMRU1FTlRTKTsKLQkJRUNsYXNzaWZpZXIgY2xzID0gcHJvcCA9PSBudWxsID8gbnVsbCA6IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEVDbGFzc2lmaWVyKHByb3AuZ2V0VmFsdWUoKSk7Ci0JCWlmKGNscyBpbnN0YW5jZW9mIEVDbGFzcykgewotCQkJRUNsYXNzIGVDbGFzcyA9IChFQ2xhc3MpIGNsczsKLQkJCWlmIChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXREZXNjcmliYWJsZUVsZW1lbnQoKS5pc1N1cGVyVHlwZU9mKGVDbGFzcykpIHsKLQkJCQlNZXRob2RMaWJyYXJ5IGxpYiA9IChNZXRob2RMaWJyYXJ5KSBjb25maWcKLQkJCQkJCS5lQ29udGFpbmVyKCk7Ci0JCQkJSXRlcmF0b3I8RU9iamVjdD4gaXRlciA9IGxpYi5lQWxsQ29udGVudHMoKTsKLQkJCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCQkJRU9iamVjdCBlT2JqZWN0ID0gaXRlci5uZXh0KCk7Ci0JCQkJCWlmIChlQ2xhc3MuaXNJbnN0YW5jZShlT2JqZWN0KSkgewotCQkJCQkJaW5jbHVkZWRFbGVtZW50cy5hZGQoKERlc2NyaWJhYmxlRWxlbWVudCkgZU9iamVjdCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGluY2x1ZGVkRWxlbWVudHM7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91dGlsL0xvZy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3V0aWwvTG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhNmY2OTcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3V0aWwvTG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5zZXJ2aWNlYWJpbGl0eS5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVBsdWdpbjsKLQotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBMb2cgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHID0gTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCS5pc0RlYnVnZ2luZygpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBMb2dnZXIgSU5TVEFOQ0UgPSBMaWJyYXJ5UGx1Z2luLmdldERlZmF1bHQoKQotCQkJLmdldExvZ2dlcigpOwotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdXRpbC9NaWdyYXRpb25VdGlsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdXRpbC9NaWdyYXRpb25VdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViZjA5MzcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3V0aWwvTWlncmF0aW9uVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZEhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuVHJlZU1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uUHJvY2Vzc0NvbmZpZ3VyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuTW9kZWxTdHJ1Y3R1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNhcGFiaWxpdHlQYXR0ZXJuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcnlQcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLQotLyoqCi0gKiBIZWxwZXIgdXRpbGl0aWVzIGZvciB0aGUgTWlncmF0aW9uIFNlcnZpY2UuCi0gKgotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTWlncmF0aW9uVXRpbCB7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbWFwIG9mIGFsbCB0aGUgPGNvZGU+Q2FwYWJpbGl0eVBhdHRlcm48L2NvZGU+IGFuZCA8Y29kZT5EZWxpdmVyeVByb2Nlc3M8L2NvZGU+Ci0JICogaW4gdGhlIGN1cnJlbnQgTWV0aG9kIExpYnJhcnkuCi0JICoKLQkgKiBUT0RPOiBNb3ZlIHRoaXMgbWV0aG9kIHRvIHRoZSBjb20uaWJtLnJtbS5saWJyYXJ5LnNlcnZpY2VzLkxpYnJhcnlVdGlsIGNsYXNzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTWFwIGdldFByb2Nlc3NlcygpIHsKLQkJTWV0aG9kTGlicmFyeSBsaWJyYXJ5ID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKQotCQkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKTsKLQkJaWYgKGxpYnJhcnkgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlNYXAgcmVzdWx0ID0gbmV3IFRyZWVNYXAoKTsKLQkJTGlzdCBtZXRob2RQbHVnaW5zID0gTGlicmFyeVV0aWwuZ2V0TWV0aG9kUGx1Z2lucyhsaWJyYXJ5KTsKLQkJZm9yIChJdGVyYXRvciBpID0gbWV0aG9kUGx1Z2lucy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKSB7Ci0JCQlNZXRob2RQbHVnaW4gbWV0aG9kUGx1Z2luID0gKE1ldGhvZFBsdWdpbilpLm5leHQoKTsKLQkJCVN0cmluZyBjYXBhYmlsaXR5UGF0dGVyblBhdGhzW10gPSBNb2RlbFN0cnVjdHVyZS5ERUZBVUxULmNhcGFiaWxpdHlQYXR0ZXJuUGF0aDsKLQkJCU1ldGhvZFBhY2thZ2UgbWV0aG9kUGFja2FnZSAgPSBVbWFVdGlsLmZpbmRNZXRob2RQYWNrYWdlKG1ldGhvZFBsdWdpbiwgY2FwYWJpbGl0eVBhdHRlcm5QYXRocyk7Ci0JCQlpZiAobWV0aG9kUGFja2FnZSBpbnN0YW5jZW9mIFByb2Nlc3NQYWNrYWdlKSB7Ci0JCQkJaWYgKG1ldGhvZFBhY2thZ2UgaW5zdGFuY2VvZiBQcm9jZXNzUGFja2FnZSkgewotCQkJCQlnZXRDYXBhYmlsaXR5UGF0dGVybnMoKFByb2Nlc3NQYWNrYWdlKW1ldGhvZFBhY2thZ2UsIHJlc3VsdCk7Ci0JCQkJfQotCQkJfQotCQkJU3RyaW5nIGRlbGl2ZXJ5UHJvY2Vzc1BhdGhzW10gPSBNb2RlbFN0cnVjdHVyZS5ERUZBVUxULmRlbGl2ZXJ5UHJvY2Vzc1BhdGg7Ci0JCQltZXRob2RQYWNrYWdlID0gVW1hVXRpbC5maW5kTWV0aG9kUGFja2FnZShtZXRob2RQbHVnaW4sIGRlbGl2ZXJ5UHJvY2Vzc1BhdGhzKTsKLQkJCWlmIChtZXRob2RQYWNrYWdlIGluc3RhbmNlb2YgUHJvY2Vzc1BhY2thZ2UpIHsKLQkJCQlpZiAobWV0aG9kUGFja2FnZSBpbnN0YW5jZW9mIFByb2Nlc3NQYWNrYWdlKSB7Ci0JCQkJCWdldERlbGl2ZXJ5UHJvY2Vzc2VzKChQcm9jZXNzUGFja2FnZSltZXRob2RQYWNrYWdlLCByZXN1bHQpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSBtYXAgb2YgYWxsIDxjb2RlPkNhcGFiaWxpdHlQYXR0ZXJuPC9jb2RlPiBpbiB0aGUgY3VycmVudCBNZXRob2QgTGlicmFyeS4KLQkgKgotCSAqIFRPRE86IE1vdmUgdGhpcyBtZXRob2QgdG8gdGhlIGNvbS5pYm0ucm1tLmxpYnJhcnkuc2VydmljZXMuTGlicmFyeVV0aWwgY2xhc3MuCi0JICovCi0JcHVibGljIHN0YXRpYyBNYXAgZ2V0Q2FwYWJpbGl0eVBhdHRlcm5zKCkgewotCQlNZXRob2RMaWJyYXJ5IGxpYnJhcnkgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpOwotCQlpZiAobGlicmFyeSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCU1hcCByZXN1bHQgPSBuZXcgVHJlZU1hcCgpOwotCQlMaXN0IG1ldGhvZFBsdWdpbnMgPSBMaWJyYXJ5VXRpbC5nZXRNZXRob2RQbHVnaW5zKGxpYnJhcnkpOwotCQlmb3IgKEl0ZXJhdG9yIGkgPSBtZXRob2RQbHVnaW5zLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApIHsKLQkJCU1ldGhvZFBsdWdpbiBtZXRob2RQbHVnaW4gPSAoTWV0aG9kUGx1Z2luKWkubmV4dCgpOwotCQkJU3RyaW5nIGNhcGFiaWxpdHlQYXR0ZXJuUGF0aHNbXSA9IE1vZGVsU3RydWN0dXJlLkRFRkFVTFQuY2FwYWJpbGl0eVBhdHRlcm5QYXRoOwotCQkJTWV0aG9kUGFja2FnZSBtZXRob2RQYWNrYWdlICA9IFVtYVV0aWwuZmluZE1ldGhvZFBhY2thZ2UobWV0aG9kUGx1Z2luLCBjYXBhYmlsaXR5UGF0dGVyblBhdGhzKTsKLQkJCWlmIChtZXRob2RQYWNrYWdlIGluc3RhbmNlb2YgUHJvY2Vzc1BhY2thZ2UpIHsKLQkJCQlnZXRDYXBhYmlsaXR5UGF0dGVybnMoKFByb2Nlc3NQYWNrYWdlKW1ldGhvZFBhY2thZ2UsIHJlc3VsdCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbWFwIG9mIGFsbCB0aGUgPGNvZGU+RGVsaXZlcnlQcm9jZXNzPC9jb2RlPiBpbiB0aGUgY3VycmVudCBNZXRob2QgTGlicmFyeS4KLQkgKgotCSAqIFRPRE86IE1vdmUgdGhpcyBtZXRob2QgdG8gdGhlIGNvbS5pYm0ucm1tLmxpYnJhcnkuc2VydmljZXMuTGlicmFyeVV0aWwgY2xhc3MuCi0JICovCi0JcHVibGljIHN0YXRpYyBNYXAgZ2V0RGVsaXZlcnlQcm9jZXNzZXMoKSB7Ci0JCU1ldGhvZExpYnJhcnkgbGlicmFyeSA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLQkJLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCk7Ci0JCWlmIChsaWJyYXJ5ID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJTWFwIHJlc3VsdCA9IG5ldyBUcmVlTWFwKCk7Ci0JCUxpc3QgbWV0aG9kUGx1Z2lucyA9IExpYnJhcnlVdGlsLmdldE1ldGhvZFBsdWdpbnMobGlicmFyeSk7Ci0JCWZvciAoSXRlcmF0b3IgaSA9IG1ldGhvZFBsdWdpbnMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkgewotCQkJTWV0aG9kUGx1Z2luIG1ldGhvZFBsdWdpbiA9IChNZXRob2RQbHVnaW4paS5uZXh0KCk7Ci0JCQlTdHJpbmcgZGVsaXZlcnlQcm9jZXNzUGF0aHNbXSA9IE1vZGVsU3RydWN0dXJlLkRFRkFVTFQuZGVsaXZlcnlQcm9jZXNzUGF0aDsKLQkJCU1ldGhvZFBhY2thZ2UgbWV0aG9kUGFja2FnZSA9IFVtYVV0aWwuZmluZE1ldGhvZFBhY2thZ2UobWV0aG9kUGx1Z2luLCBkZWxpdmVyeVByb2Nlc3NQYXRocyk7Ci0JCQlpZiAobWV0aG9kUGFja2FnZSBpbnN0YW5jZW9mIFByb2Nlc3NQYWNrYWdlKSB7Ci0JCQkJZ2V0RGVsaXZlcnlQcm9jZXNzZXMoKFByb2Nlc3NQYWNrYWdlKW1ldGhvZFBhY2thZ2UsIHJlc3VsdCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbWFwIG9mIGFsbCB0aGUgY29udGV4dHMgYXNzb2NpYXRlZCB3aXRoIGEgcHJvY2Vzcy4KLQkgKgotCSAqIFRPRE86IE1vdmUgdGhpcyBtZXRob2QgdG8gdGhlIGNvbS5pYm0ucm1tLmxpYnJhcnkuc2VydmljZXMuTGlicmFyeVV0aWwgY2xhc3MuCi0JICovCi0JcHVibGljIHN0YXRpYyBNYXAgZ2V0Q29udGV4dHMoUHJvY2VzcyBwcm9jZXNzKSB7Ci0JCWlmIChwcm9jZXNzID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJTWV0aG9kTGlicmFyeSBsaWJyYXJ5ID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKQotCQkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKTsKLQkJaWYgKGxpYnJhcnkgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlNYXAgcmVzdWx0ID0gbmV3IFRyZWVNYXAoKTsKLQkJTWV0aG9kQ29uZmlndXJhdGlvbiBkZWZhdWx0Q29udGV4dCA9IHByb2Nlc3MuZ2V0RGVmYXVsdENvbnRleHQoKTsKLQkJaWYgKGRlZmF1bHRDb250ZXh0ICE9IG51bGwpIHsKLQkJCXJlc3VsdC5wdXQoZGVmYXVsdENvbnRleHQuZ2V0TmFtZSgpLCBkZWZhdWx0Q29udGV4dCk7Ci0JCX0KLQotCQlMaXN0IGNvbnRleHRzID0gcHJvY2Vzcy5nZXRWYWxpZENvbnRleHQoKTsKLQkJZm9yIChJdGVyYXRvciBpID0gY29udGV4dHMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkgewotCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb250ZXh0ID0gKE1ldGhvZENvbmZpZ3VyYXRpb24paS5uZXh0KCk7Ci0JCQlpZiAoY29udGV4dCAhPSBudWxsKSB7Ci0JCQkJcmVzdWx0LnB1dChjb250ZXh0LmdldE5hbWUoKSwgY29udGV4dCk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIEFkZCBhIG1hcCBvZiBhbGwgPGNvZGU+Q2FwYWJpbGl0eVBhdHRlcm48L2NvZGU+IGluIGEgZ2l2ZW4gPGNvZGU+UHJvY2Vzc1BhY2thZ2U8L2NvZGU+LgotCSAqCi0JICogVE9ETzogTW92ZSB0aGlzIG1ldGhvZCB0byB0aGUgY29tLmlibS5ybW0ubGlicmFyeS5zZXJ2aWNlcy5MaWJyYXJ5VXRpbCBjbGFzcy4KLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIHZvaWQgZ2V0Q2FwYWJpbGl0eVBhdHRlcm5zKFByb2Nlc3NQYWNrYWdlIHByb2Nlc3NQYWNrYWdlLCBNYXAgcmVzdWx0KSB7Ci0JCUxpc3QgY2hpbGRQYWNrYWdlcyA9IHByb2Nlc3NQYWNrYWdlLmdldENoaWxkUGFja2FnZXMoKTsKLQkJZm9yIChJdGVyYXRvciBpID0gY2hpbGRQYWNrYWdlcy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKSB7Ci0JCQlPYmplY3Qgb2JqID0gaS5uZXh0KCk7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkgewotCQkJCVByb2Nlc3NDb21wb25lbnQgcHJvY2Vzc0NvbXBvbmVudCA9IChQcm9jZXNzQ29tcG9uZW50KW9iajsKLQkJCQlQcm9jZXNzIHByb2Nlc3MgID0gcHJvY2Vzc0NvbXBvbmVudC5nZXRQcm9jZXNzKCk7Ci0JCQkJaWYgKHByb2Nlc3MgaW5zdGFuY2VvZiBDYXBhYmlsaXR5UGF0dGVybikgewotCQkJCQlTdHJpbmcgbmFtZSA9IHByb2Nlc3MuZ2V0TmFtZSgpOwotCQkJCQlyZXN1bHQucHV0KG5hbWUsIHByb2Nlc3MpOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIFByb2Nlc3NQYWNrYWdlKSB7Ci0JCQkJZ2V0Q2FwYWJpbGl0eVBhdHRlcm5zKChQcm9jZXNzUGFja2FnZSlvYmosIHJlc3VsdCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBZGQgYSBtYXAgb2YgYWxsIDxjb2RlPkRlbGl2ZXJ5UHJvY2VzczwvY29kZT4gaW4gYSBnaXZlbiA8Y29kZT5Qcm9jZXNzUGFja2FnZTwvY29kZT4uCi0JICoKLQkgKiBUT0RPOiBNb3ZlIHRoaXMgbWV0aG9kIHRvIHRoZSBjb20uaWJtLnJtbS5saWJyYXJ5LnNlcnZpY2VzLkxpYnJhcnlVdGlsIGNsYXNzLgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgdm9pZCBnZXREZWxpdmVyeVByb2Nlc3NlcyhQcm9jZXNzUGFja2FnZSBwcm9jZXNzUGFja2FnZSwgTWFwIHJlc3VsdCkgewotCQlMaXN0IGNoaWxkUGFja2FnZXMgPSBwcm9jZXNzUGFja2FnZS5nZXRDaGlsZFBhY2thZ2VzKCk7Ci0JCWZvciAoSXRlcmF0b3IgaSA9IGNoaWxkUGFja2FnZXMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkgewotCQkJT2JqZWN0IG9iaiA9IGkubmV4dCgpOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpIHsKLQkJCQlQcm9jZXNzQ29tcG9uZW50IHByb2Nlc3NDb21wb25lbnQgPSAoUHJvY2Vzc0NvbXBvbmVudClvYmo7Ci0JCQkJUHJvY2VzcyBwcm9jZXNzICA9IHByb2Nlc3NDb21wb25lbnQuZ2V0UHJvY2VzcygpOwotCQkJCWlmIChwcm9jZXNzIGluc3RhbmNlb2YgRGVsaXZlcnlQcm9jZXNzKSB7Ci0JCQkJCVN0cmluZyBuYW1lID0gcHJvY2Vzcy5nZXROYW1lKCk7Ci0JCQkJCXJlc3VsdC5wdXQobmFtZSwgcHJvY2Vzcyk7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgUHJvY2Vzc1BhY2thZ2UpIHsKLQkJCQlnZXREZWxpdmVyeVByb2Nlc3NlcygoUHJvY2Vzc1BhY2thZ2Upb2JqLCByZXN1bHQpOwotCQkJfQotCQl9Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgTWFwIGdldEFjdGl2aXRpZXMoUHJvY2VzcyBwcm9jZXNzKXsKLQkJcmV0dXJuIGdldEFjdGl2aXRpZXMocHJvY2VzcywgZmFsc2UpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIE1hcCBnZXRBY3Rpdml0aWVzKFByb2Nlc3MgcHJvY2VzcywgYm9vbGVhbiBsaW5rZWRIYXNoTWFwKXsKLQkJTWFwIHJlc3VsdCA9IGxpbmtlZEhhc2hNYXAgPyBuZXcgTGlua2VkSGFzaE1hcCgpIDogbmV3IFRyZWVNYXAoKTsKLQkJTWV0aG9kQ29uZmlndXJhdGlvbiBkZWZhdWx0Q29udGV4dCA9IHByb2Nlc3MuZ2V0RGVmYXVsdENvbnRleHQoKTsKLQkJUHJvY2Vzc0NvbmZpZ3VyYXRvciBmaWx0ZXIgPSBuZXcgUHJvY2Vzc0NvbmZpZ3VyYXRvcihkZWZhdWx0Q29udGV4dCk7Ci0JCWdldEFjdGl2aXRpZXMocHJvY2VzcywgcmVzdWx0LCBmaWx0ZXIpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkKLQkvKioKLQkgKiBNZXRob2QgcmV0dXJucyBMaXN0IG9mIGFjdGl2aXRpZXMgKHJlY3Vyc2l2ZWx5KSBmb3IgcGFydGljdWxhciBjb25maWd1cmF0aW9uIAotCSAqIHVuZGVyIGEgUHJvY2VzcyAoPGNvZGU+RGVsaXZlcnlQcm9jZXNzPC9jb2RlPiBvciA8Y29kZT5DYXBhYmlsaXR5UGF0dGVybjwvY29kZT4pLiAgCi0JICogIEBwYXJhbSBBY3Rpdml0eQotCSAqICBAcGFyYW0gTWFwCi0JICogIEBwYXJhbSBQcm9jZXNzQ29uZmlndXJhdG9yCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyB2b2lkIGdldEFjdGl2aXRpZXMoQWN0aXZpdHkgcHJvY2VzcywgTWFwIHJlc3VsdCwgUHJvY2Vzc0NvbmZpZ3VyYXRvciBmaWx0ZXIpewotCQlyZXN1bHQucHV0KHByb2Nlc3MuZ2V0TmFtZSgpLCBwcm9jZXNzKTsKLQkJTGlzdCBsaXN0ID0gcHJvY2Vzcy5nZXRCcmVha2Rvd25FbGVtZW50cygpOwotCQlpZihsaXN0LnNpemUoKSA+IDApewotCQkJZm9yKEl0ZXJhdG9yIGl0ZXJhdG9yID0gbGlzdC5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KXsKLQkJCQlPYmplY3Qgb2JqZWN0ID0gaXRlcmF0b3IubmV4dCgpOwotCQkJCWlmKG9iamVjdCBpbnN0YW5jZW9mIEFjdGl2aXR5KXsKLQkJCQkJaWYoZmlsdGVyICE9IG51bGwgJiYgZmlsdGVyLmFjY2VwdChvYmplY3QpKXsKLQkJCQkJCXJlc3VsdC5wdXQoKChBY3Rpdml0eSlvYmplY3QpLmdldE5hbWUoKSwgb2JqZWN0KTsKLQkJCQkJfQotCQkJCQlpZihvYmplY3QgaW5zdGFuY2VvZiBBY3Rpdml0eSl7Ci0JCQkJCQlnZXRBY3Rpdml0aWVzKChBY3Rpdml0eSlvYmplY3QsIHJlc3VsdCwgZmlsdGVyKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3V0aWwvTW9kZWxTdG9yYWdlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdXRpbC9Nb2RlbFN0b3JhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWZhZjg3ZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdXRpbC9Nb2RlbFN0b3JhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5CYXNpY0VMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuTW9kZWxTdHJ1Y3R1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UuSUxpYnJhcnlSZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UuTXVsdGlGaWxlU2F2ZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc1BhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5VbWFVdGlsOwotCi0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIE1vZGVsU3RvcmFnZSB7Ci0JCi0JLyoqCi0JICogcmV0dXJuIHRoZSBNZXRob2RQbHVnaW5zIGluIHRoZSBjdXJyZW50IE1ldGhvZExpYnJhcnkKLQkgKiBAcmV0dXJuIExpc3QKLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3Q8TWV0aG9kUGx1Z2luPiBnZXRCYXNlTW9kZWxzKCkgewotCQlNZXRob2RMaWJyYXJ5IGxpYiA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKTsKLQkJaWYgKGxpYiAhPSBudWxsKQotCQkJcmV0dXJuIG5ldyBBcnJheUxpc3Q8TWV0aG9kUGx1Z2luPihsaWIuZ2V0TWV0aG9kUGx1Z2lucygpKTsKLQkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOwotCX0KLQotCS8qKgotCSAqIGNyZWF0ZSBhIG5ldyBNZXRob2RMaWJyYXJ5IGFuZCByZXR1cm4gdGhlIGFzc29jaWF0ZWQgUmVzb3VyY2UKLQkgKiAKLQkgKiBAcGFyYW0gcmVzb3VyY2VTZXQgTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsCi0JICogQHBhcmFtIG5hbWUgU3RyaW5nCi0JICogQHBhcmFtIGRpciBTdHJpbmcKLQkgKiBAcGFyYW0gYk11bHRpcGxlIGJvb2xlYW4KLQkgKiBAcmV0dXJuIFJlc291cmNlCi0JICogQHRocm93cyBFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFJlc291cmNlIG5ld0xpYnJhcnkoSUxpYnJhcnlSZXNvdXJjZVNldCByZXNvdXJjZVNldCwKLQkJCVN0cmluZyBuYW1lLCBTdHJpbmcgZGlyLCBib29sZWFuIGJNdWx0aXBsZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVN0cmluZyBsaWJfZmlsZW5hbWUgPSBudWxsOwotCQkvLyBNYXAgb3B0aW9ucyA9IG5ldwotCQkvLyBIYXNoTWFwKE11bHRpRmlsZVJlc291cmNlU2V0SW1wbC5ERUZBVUxUX1NBVkVfT1BUSU9OUyk7Ci0JCWlmIChiTXVsdGlwbGUpIHsKLQkJCWxpYl9maWxlbmFtZSA9IE11bHRpRmlsZVNhdmVVdGlsLkRFRkFVTFRfTElCUkFSWV9NT0RFTF9GSUxFTkFNRTsKLQkJCS8vIG9wdGlvbnMucHV0KE11bHRpRmlsZVhNSVNhdmVJbXBsLk1VTFRJX0ZJTEUsIEJvb2xlYW4uVFJVRSk7Ci0JCX0gZWxzZSB7Ci0JCQlsaWJfZmlsZW5hbWUgPSBuYW1lOwotCQl9Ci0JCXJlc291cmNlU2V0LnVubG9hZCgpOwotCQlSZXNvdXJjZSByZXMgPSByZXNvdXJjZVNldC5jcmVhdGVSZXNvdXJjZShVUkkuY3JlYXRlRmlsZVVSSShkaXIKLQkJCQkrIEZpbGUuc2VwYXJhdG9yICsgbGliX2ZpbGVuYW1lKSk7Ci0JCU1ldGhvZExpYnJhcnkgbGliID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlTWV0aG9kTGlicmFyeSgpOwotCQlsaWIuc2V0TmFtZShuYW1lKTsKLQkJcmVzLmdldENvbnRlbnRzKCkuYWRkKGxpYik7Ci0JCXJlc291cmNlU2V0LnNhdmUobnVsbCk7Ci0JCXJldHVybiByZXM7Ci0JfQotCQotCS8qKgotCSAqIGluaXRpYWxpemUgYSBuZXcgbWV0aG9kIHBsdWdpbgotCSAqIEBwYXJhbSBlbXB0eU1vZGVsIE1ldGhvZFBsdWdpbgotCSAqIEByZXR1cm4gTWV0aG9kUGx1Z2luCi0JICovCi0JcHVibGljIHN0YXRpYyBNZXRob2RQbHVnaW4gaW5pdGlhbGl6ZShNZXRob2RQbHVnaW4gZW1wdHlNb2RlbCkgewotCQllbXB0eU1vZGVsLnNldFVzZXJDaGFuZ2VhYmxlKEJvb2xlYW4uVFJVRSk7Ci0KLQkJY3JlYXRlQ29udGVudFBhY2thZ2VzKGVtcHR5TW9kZWwsIE1vZGVsU3RydWN0dXJlLkRFRkFVTFRfRE9NQUlOX1BBVEgpOwotCQljcmVhdGVDb250ZW50UGFja2FnZXMoZW1wdHlNb2RlbCwKLQkJCQlNb2RlbFN0cnVjdHVyZS5ERUZBVUxULmRpc2NpcGxpbmVEZWZpbml0aW9uUGF0aCk7Ci0JCWNyZWF0ZUNvbnRlbnRQYWNrYWdlcyhlbXB0eU1vZGVsLCBNb2RlbFN0cnVjdHVyZS5ERUZBVUxULnJvbGVTZXRQYXRoKTsKLQkJY3JlYXRlQ29udGVudFBhY2thZ2VzKGVtcHR5TW9kZWwsCi0JCQkJTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC5jb3JlQ29udGVudFBhdGgpOwotCQljcmVhdGVDb250ZW50UGFja2FnZXMoZW1wdHlNb2RlbCwKLQkJCQlNb2RlbFN0cnVjdHVyZS5ERUZBVUxULndvcmtQcm9kdWN0VHlwZVBhdGgpOwotCQljcmVhdGVDb250ZW50UGFja2FnZXMoZW1wdHlNb2RlbCwgTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC50b29sUGF0aCk7Ci0JCWNyZWF0ZUNvbnRlbnRQYWNrYWdlcyhlbXB0eU1vZGVsLAotCQkJCU1vZGVsU3RydWN0dXJlLkRFRkFVTFQuc3RhbmRhcmRDYXRlZ29yeVBhdGgpOwotCi0JCUNvbnRlbnRQYWNrYWdlIGNvbnRlbnRQa2cgPSBjcmVhdGVDb250ZW50UGFja2FnZXMoZW1wdHlNb2RlbCwKLQkJCQlNb2RlbFN0cnVjdHVyZS5ERUZBVUxULmN1c3RvbUNhdGVnb3J5UGF0aCk7Ci0JCVRuZ1V0aWwuY3JlYXRlUm9vdEN1c3RvbUNhdGVnb3J5KGNvbnRlbnRQa2cpOwotCi0JCS8vIGNyZWF0ZSBEZWxpdmVyeVByb2Nlc3NlcyBwcm9jZXNzIHBhY2thZ2UKLQkJLy8KLQkJUHJvY2Vzc1BhY2thZ2UgcGtnID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUHJvY2Vzc1BhY2thZ2UoKTsKLQkJcGtnLnNldE5hbWUoTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC5kZWxpdmVyeVByb2Nlc3NQYXRoWzBdKTsKLQkJZW1wdHlNb2RlbC5nZXRNZXRob2RQYWNrYWdlcygpLmFkZChwa2cpOwotCi0JCS8vIGNyZWF0ZSBQcm9jZXNzQ29udHJpYnV0aW9ucyBwcm9jZXNzIHBhY2thZ2UKLQkJLy8KLQkJTW9kZWxTdHJ1Y3R1cmUuY3JlYXRlUHJvY2Vzc0NvbnRyaWJ1dGlvblBhY2thZ2UoZW1wdHlNb2RlbCk7Ci0KLQkJLy8gY3JlYXRlIENhcGFiaWxpdHlQYXR0ZXJucyBwcm9jZXNzIHBhY2thZ2UKLQkJLy8KLQkJcGtnID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUHJvY2Vzc1BhY2thZ2UoKTsKLQkJaW50IGxlbiA9IE1vZGVsU3RydWN0dXJlLkRFRkFVTFQuY2FwYWJpbGl0eVBhdHRlcm5QYXRoLmxlbmd0aCAtIDE7Ci0JCXBrZy5zZXROYW1lKE1vZGVsU3RydWN0dXJlLkRFRkFVTFQuY2FwYWJpbGl0eVBhdHRlcm5QYXRoW2xlbl0pOwotCQlTdHJpbmdbXSBwYXRoID0gbmV3IFN0cmluZ1tsZW5dOwotCQlTeXN0ZW0uYXJyYXljb3B5KE1vZGVsU3RydWN0dXJlLkRFRkFVTFQuY2FwYWJpbGl0eVBhdHRlcm5QYXRoLCAwLCBwYXRoLAotCQkJCTAsIGxlbik7Ci0JCUNvbnRlbnRQYWNrYWdlIGNvbnRQa2cgPSBVbWFVdGlsLmZpbmRDb250ZW50UGFja2FnZShlbXB0eU1vZGVsLCBwYXRoKTsKLQkJY29udFBrZy5nZXRDaGlsZFBhY2thZ2VzKCkuYWRkKHBrZyk7Ci0KLQkJLy8gLy8gY3JlYXRlIGluaGVyaXRlZCBkb21haW5zCi0JCS8vIC8vCi0JCS8vIExpc3QgYWxsQmFzZSA9IE1pc2MuZ2V0QWxsQmFzZShlbXB0eU1vZGVsKTsKLQkJLy8gLy8gU3lzdGVtLm91dC5wcmludGxuKCJNb2RlbFN0b3JhZ2UuaW5pdGlhbGl6ZSgpOiBhbGxCYXNlPSIrYWxsQmFzZSk7Ci0JCS8vIGZvcihJdGVyYXRvciBpdGVyID0gYWxsQmFzZS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJLy8gTWV0aG9kUGx1Z2luIGJhc2VQbHVnaW4gPSAoTWV0aG9kUGx1Z2luKSBpdGVyLm5leHQoKTsKLQkJLy8gQ29udGVudFBhY2thZ2UgYmFzZURvbWFpblBrZyA9IFVtYVV0aWwuZmluZENvbnRlbnRQYWNrYWdlKGJhc2VQbHVnaW4sCi0JCS8vIE1vZGVsU3RydWN0dXJlLkRFRkFVTFRfRE9NQUlOX1BBVEgpOwotCQkvLyBJbmhlcml0ZWRDYXRlZ29yeVBhY2thZ2VMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldwotCQkvLyBJbmhlcml0ZWREb21haW5QYWNrYWdlTGlzdGVuZXIoZG9tYWluUGtnKTsKLQkJLy8gYmFzZURvbWFpblBrZy5lQWRhcHRlcnMoKS5hZGQobGlzdGVuZXIpOwotCQkvLyBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0KLQkJLy8gYmFzZURvbWFpblBrZy5nZXRDb250ZW50RWxlbWVudHMoKS5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCS8vIE9iamVjdCBlbGVtZW50ID0gKE9iamVjdCkgaXRlcmF0b3IubmV4dCgpOwotCQkvLyBpZihlbGVtZW50IGluc3RhbmNlb2YgRG9tYWluKSB7Ci0JCS8vIENvbnRlbnRDYXRlZ29yeSBjYXRlZ29yeSA9IChDb250ZW50Q2F0ZWdvcnkpIGVsZW1lbnQ7Ci0JCS8vIGlmKGNhdGVnb3J5LmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSA9PSBudWxsKSB7Ci0JCS8vIC8vIHRoaXMgY2F0ZWdvcnkgaXMgbm90IGEgaW5oZXJpdGVkIG9uZSwgY2FuIGJlIGFkZGVkLgotCQkvLyAvLwotCQkvLyBkb21haW5Qa2cuZ2V0Q29udGVudEVsZW1lbnRzKCkuYWRkKGxpc3RlbmVyLmNyZWF0ZUluaGVyaXRlZCgoQ29udGVudENhdGVnb3J5KQotCQkvLyBlbGVtZW50KSk7Ci0JCS8vIH0KLQkJLy8gfQotCQkvLyB9Ci0JCS8vIH0KLQotCQkvLyBUT0RPOiB0ZXN0IG9uLWZseSBjcmVhdGlvbiBvZiBjYXRlZ29yeSBjb250cmlidXRvcgotCQkvLyBNZXRob2RQbHVnaW5JdGVtUHJvdmlkZXIgaXRlbVByb3ZpZGVyID0gKE1ldGhvZFBsdWdpbkl0ZW1Qcm92aWRlcikKLQkJLy8gVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkuYWRhcHQoZW1wdHlNb2RlbCwKLQkJLy8gSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJLy8gaXRlbVByb3ZpZGVyLmFkZEluaGVyaXRlZENhdGVnb3JpZXMoKTsKLQotCQlyZXR1cm4gZW1wdHlNb2RlbDsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gcGF0aAotCSAqIEBwYXJhbSBlbXB0eU1vZGVsCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgQ29udGVudFBhY2thZ2UgY3JlYXRlQ29udGVudFBhY2thZ2VzKE1ldGhvZFBsdWdpbiBtb2RlbCwKLQkJCVN0cmluZ1tdIHBhdGgpIHsKLQkJTGlzdCBsaXN0ID0gbW9kZWwuZ2V0TWV0aG9kUGFja2FnZXMoKTsKLQkJQ29udGVudFBhY2thZ2UgcGtnID0gVW1hVXRpbC5maW5kQ29udGVudFBhY2thZ2UobGlzdCwgcGF0aFswXSk7Ci0JCWlmIChwa2cgPT0gbnVsbCkgewotCQkJcGtnID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQ29udGVudFBhY2thZ2UoKTsKLQkJCXBrZy5zZXROYW1lKHBhdGhbMF0pOwotCQkJbGlzdC5hZGQocGtnKTsKLQkJfQotCQlmb3IgKGludCBpID0gMTsgaSA8IHBhdGgubGVuZ3RoOyBpKyspIHsKLQkJCWxpc3QgPSBwa2cuZ2V0Q2hpbGRQYWNrYWdlcygpOwotCQkJcGtnID0gVW1hVXRpbC5maW5kQ29udGVudFBhY2thZ2UobGlzdCwgcGF0aFtpXSk7Ci0JCQlpZiAocGtnID09IG51bGwpIHsKLQkJCQlwa2cgPSBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVDb250ZW50UGFja2FnZSgpOwotCQkJCXBrZy5zZXROYW1lKHBhdGhbaV0pOwotCQkJCWxpc3QuYWRkKHBrZyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHBrZzsKLQl9Ci0KLQkvKioKLQkgKiBsb2FkIHRoZSBjb250YWlubWVudCBwcm94aWVzIGZvciB0aGUgb2JqZWN0Ci0JICogQHBhcmFtIG9iaiBFT2JqZWN0Ci0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvYWRDb250YWlubWVudFByb3hpZXMoRU9iamVjdCBvYmopIHsKLQkJLy8gZm9yKFRyZWVJdGVyYXRvciBpdGVyID0gb2JqLmVBbGxDb250ZW50cygpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJTGlzdCBsaXN0ID0gb2JqLmVDb250ZW50cygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxpc3Quc2l6ZSgpOyBpKyspIHsKLQkJCUludGVybmFsRU9iamVjdCBvID0gKEludGVybmFsRU9iamVjdCkgbGlzdC5nZXQoaSk7Ci0JCQkvLyBJbnRlcm5hbEVPYmplY3QgbyA9IChJbnRlcm5hbEVPYmplY3QpaXRlci5uZXh0KCk7Ci0JCQlpZiAoby5lUHJveHlVUkkoKSAhPSBudWxsKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJwcm94eSBVUkkgPSAiICsgby5lUHJveHlVUkkoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQlSZXNvdXJjZVNldCByZXNvdXJjZVNldCA9IG8uZVJlc291cmNlKCkuZ2V0UmVzb3VyY2VTZXQoKTsKLQkJCQlSZXNvdXJjZSByZXMgPSByZXNvdXJjZVNldC5nZXRSZXNvdXJjZShvLmVQcm94eVVSSSgpLCB0cnVlKTsKLQkJCQlJbnRlcm5hbEVPYmplY3QgcmVzb2x2ZWRPYmogPSBudWxsOwotCQkJCXRyeSB7Ci0JCQkJCXJlc29sdmVkT2JqID0gKEludGVybmFsRU9iamVjdCkgcmVzLmdldENvbnRlbnRzKCkuZ2V0KDApOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJfQotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigicmVzb2x2ZWRPYmogPSAiICsgcmVzb2x2ZWRPYmopOyAvLyROT04tTkxTLTEkCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOyAvLyROT04tTkxTLTEkCi0JCQkJaWYgKHJlc29sdmVkT2JqICE9IG51bGwpIHsKLQkJCQkJRWNvcmVVdGlsLnJlcGxhY2UobywgcmVzb2x2ZWRPYmopOwotCQkJCQkoKEJhc2ljRUxpc3QpIHJlcy5nZXRDb250ZW50cygpKS5zZXREYXRhKDEsCi0JCQkJCQkJbmV3IE9iamVjdFtdIHsgcmVzb2x2ZWRPYmogfSk7ICAgICAgICAgCi0JCQkJCW8gPSByZXNvbHZlZE9iajsKLQkJCQl9Ci0JCQl9Ci0JCQlsb2FkQ29udGFpbm1lbnRQcm94aWVzKG8pOwotCQl9Ci0JfQotCi0JLyoqCi0JICogbG9hZCBhbGwgcHJveGllcyBmb3IgdGhlIG9iamVjdAotCSAqIEBwYXJhbSBvYmogRU9iamVjdAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2FkQWxsUHJveGllcyhFT2JqZWN0IG9iaikgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBvYmouZUFsbENvbnRlbnRzKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJRU9iamVjdCBlbGVtZW50ID0gKEVPYmplY3QpIGl0ZXIubmV4dCgpOwotCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGVsZW1lbnQuZUNyb3NzUmVmZXJlbmNlcygpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yCi0JCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJaXRlcmF0b3IubmV4dCgpOwotCQkJfQotCQl9Ci0KLQkJLy8gbG9hZENvbnRhaW5tZW50UHJveGllcyhvYmopOwotCQkvLyBsb2FkQ3Jvc3NSZWZlcmVuY2VQcm94aWVzKG9iaik7Ci0JfQotCi0JLyoqCi0JICogbG9hZCBhbGwgY3Jvc3MgcmVmZXJlbmNlIHByb3hpZXMgZm9yIHRoZSBvYmplY3QKLQkgKiBAcGFyYW0gb2JqIEVPYmplY3QKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9hZENyb3NzUmVmZXJlbmNlUHJveGllcyhFT2JqZWN0IG9iaikgewotCQlMaXN0IGxpc3QgPSBvYmouZUNyb3NzUmVmZXJlbmNlcygpOwotCQlpbnQgc2l6ZSA9IGxpc3Quc2l6ZSgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJRU9iamVjdCBvID0gKEVPYmplY3QpIGxpc3QuZ2V0KGkpOwotCQkJbG9hZENyb3NzUmVmZXJlbmNlUHJveGllcyhvKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIGZpbmQgYSBNZXRob2RFbGVtZW50IHdpdGggdGhlIGdpdmVuIGVsZW1lbnQgbmFtZSBpbiB0aGUgZWxlbWVudCBsaXN0Ci0JICogQHBhcmFtIG1ldGhvZEVsZW1lbnRzIFRoZSBlbGVtZW50IGxpc3QKLQkgKiBAcGFyYW0gbmFtZSBTdHJpbmcKLQkgKiBAcmV0dXJuIE1ldGhvZEVsZW1lbnQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1ldGhvZEVsZW1lbnQgZmluZE1ldGhvZEVsZW1lbnQoTGlzdCBtZXRob2RFbGVtZW50cywKLQkJCVN0cmluZyBuYW1lKSB7Ci0JCWludCBzaXplID0gbWV0aG9kRWxlbWVudHMuc2l6ZSgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJTWV0aG9kRWxlbWVudCBlbGVtZW50ID0gKE1ldGhvZEVsZW1lbnQpIG1ldGhvZEVsZW1lbnRzLmdldChpKTsKLQkJCWlmIChuYW1lLmVxdWFscyhlbGVtZW50LmdldE5hbWUoKSkpCi0JCQkJcmV0dXJuIGVsZW1lbnQ7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogZ2V0IG9mIGluZGV4IGludCBoZSBsaXN0IGxvY2F0aW9uIGZvciB0aGUgZWxlbWVudCB3aXRoIHRoZSBnaXZlbiBuYW1lLgotCSAqIEBwYXJhbSBtZXRob2RFbGVtZW50cyBMaXN0Ci0JICogQHBhcmFtIG5hbWUgU3RyaW5nCi0JICogQHJldHVybiBpbnQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBpbmRleE9mKExpc3QgbWV0aG9kRWxlbWVudHMsIFN0cmluZyBuYW1lKSB7Ci0JCWludCBzaXplID0gbWV0aG9kRWxlbWVudHMuc2l6ZSgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJTWV0aG9kRWxlbWVudCBlbGVtZW50ID0gKE1ldGhvZEVsZW1lbnQpIG1ldGhvZEVsZW1lbnRzLmdldChpKTsKLQkJCWlmIChuYW1lLmVxdWFscyhlbGVtZW50LmdldE5hbWUoKSkpCi0JCQkJcmV0dXJuIGk7Ci0JCX0KLQkJcmV0dXJuIC0xOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3V0aWwvUGx1Z2luUmVmZXJlbmNlQ2hlY2tlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3V0aWwvUGx1Z2luUmVmZXJlbmNlQ2hlY2tlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOTA3NWVmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91dGlsL1BsdWdpblJlZmVyZW5jZUNoZWNrZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb24uRGVwZW5kZW5jeUNoZWNrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5Bc3NvY2lhdGlvbkhlbHBlcjsKLQotLyoqCi0gKiB1dGlsaXR5IGNsYXNzIHRvIGNoZWNrIHBsdWdpbiByZWZlcmVuY2VzCi0gKiBAYXV0aG9yID8/PwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUGx1Z2luUmVmZXJlbmNlQ2hlY2tlciB7Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIExpc3QKLQkgKi8KLS8vCXB1YmxpYyBzdGF0aWMgTGlzdCBjaGVja0NpcmN1bGFyRGVwZW5kZW50UGx1Z2luc0luTGlicmFyeSgpIHsKLS8vCQlMaXN0IGNkTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLS8vCi0vLwkJTGlzdCBhbGxQbHVnaW5MaXN0ID0gTW9kZWxTdG9yYWdlLmdldEJhc2VNb2RlbHMoKTsKLS8vCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBhbGxQbHVnaW5MaXN0Lml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotLy8JCQlNZXRob2RQbHVnaW4gZWxlbWVudCA9IChNZXRob2RQbHVnaW4pIGl0ZXIubmV4dCgpOwotLy8JCQlpZiAoaGFzQ2lyY3VsYXJDb25mbGljdFdpdGhQbHVnaW4oZWxlbWVudCkpCi0vLwkJCQljZExpc3QuYWRkKGVsZW1lbnQpOwotLy8JCX0KLS8vCQlyZXR1cm4gY2RMaXN0OwotLy8JfQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIGFQbHVnaW4KLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaGFzQ2lyY3VsYXJDb25mbGljdFdpdGhQbHVnaW4oTWV0aG9kUGx1Z2luIGFQbHVnaW4pIHsJCQotLy8JCWJvb2xlYW4gYW5zd2VyID0gZmFsc2U7Ci0vLwotLy8JCUxpc3QgYWxsb3dhYmxlQmFzZUxpc3QgPSBnZXRBcHBsaWNhYmxlQmFzZVBsdWdpbnMoYVBsdWdpbik7Ci0vLwkJTGlzdCBleHRlbmRlZEJhc2VMaXN0ID0gYVBsdWdpbi5nZXRCYXNlcygpOwotLy8KLS8vCQlpZiAoIWFsbG93YWJsZUJhc2VMaXN0LmNvbnRhaW5zQWxsKGV4dGVuZGVkQmFzZUxpc3QpKSB7Ci0vLwkJCVN5c3RlbS5vdXQKLS8vCQkJCQkucHJpbnRsbigiJCQkOiBjaXJjdWxhciBkZXBlbmRlbmN5IGRldGVjdGVkIGZvciAiICsgYVBsdWdpbi5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkCi0vLwkJCXByaW50UGx1Z2luTGlzdCgiYWxsb3dhYmxlIHBsdWdpbiBsaXN0IiwgYWxsb3dhYmxlQmFzZUxpc3QpOyAvLyROT04tTkxTLTEkCi0vLwkJCXByaW50UGx1Z2luTGlzdCgiY3VycmVudCBiYXNlIGxpc3QiLCBleHRlbmRlZEJhc2VMaXN0KTsgLy8kTk9OLU5MUy0xJAotLy8JCQlhbnN3ZXIgPSB0cnVlOwotLy8JCX0KLS8vCi0vLwkJcmV0dXJuIGFuc3dlcjsKLQkJCi0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGFQbHVnaW4uZ2V0QmFzZXMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBiYXNlID0gKE9iamVjdCkgaXRlci5uZXh0KCk7Ci0JCQlpZighRGVwZW5kZW5jeUNoZWNrZXIuY2hlY2tDaXJjdWxhckRlcGVuZGVuY3koYVBsdWdpbiwgVW1hUGFja2FnZS5MaXRlcmFscy5NRVRIT0RfUExVR0lOX19CQVNFUywgYmFzZSkuaXNPSygpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBhUGx1Z2luCi0JICogQHJldHVybiBMaXN0Ci0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0PE1ldGhvZFBsdWdpbj4gZ2V0QXBwbGljYWJsZUJhc2VQbHVnaW5zKE1ldGhvZFBsdWdpbiBhUGx1Z2luKSB7Ci0JCUxpc3Q8TWV0aG9kUGx1Z2luPiBtb2RlbHMgPSBNb2RlbFN0b3JhZ2UuZ2V0QmFzZU1vZGVscygpOwotCi0JCUxpc3Q8TWV0aG9kUGx1Z2luPiBkZXNjZW5kYW50TGlzdCA9IGdldERlc2NlbmRhbnRzKGFQbHVnaW4pOwotCQlmb3IgKEl0ZXJhdG9yPE1ldGhvZFBsdWdpbj4gaXRlciA9IGRlc2NlbmRhbnRMaXN0Lml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJTWV0aG9kUGx1Z2luIGVsZW1lbnQgPSAoTWV0aG9kUGx1Z2luKSBpdGVyLm5leHQoKTsKLQkJCWlmIChhUGx1Z2luLmdldEJhc2VzKCkuY29udGFpbnMoZWxlbWVudCkpIHsJCS8vcGFydCBvZiAxNzAzNjc6IGFsbG93IGl0IHRvIHNob3cgZm9yIHVuc2VsZWN0Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQltb2RlbHMucmVtb3ZlKGVsZW1lbnQpOwotCQl9Ci0KLQkJcmV0dXJuIG1vZGVsczsKLQl9Ci0KLQkvLyB0aG9zZSB0d28gZ2V0RGVzY2VuZGFudHMoKSBtZXRob2RzIHNob3VsZCBiZSBtb3ZlZCBpbnRvIGxvd2VyIGxheWVyCi0JcHJpdmF0ZSBzdGF0aWMgTGlzdDxNZXRob2RQbHVnaW4+IGdldERlc2NlbmRhbnRzKE1ldGhvZFBsdWdpbiBtZXRob2RPYmplY3QpIHsKLQkJTGlzdDxNZXRob2RQbHVnaW4+IGRlc2NlbmRhbnRMaXN0ID0gbmV3IEFycmF5TGlzdDxNZXRob2RQbHVnaW4+KCk7Ci0KLQkJTGlzdDxNZXRob2RQbHVnaW4+IG9iakxpc3QgPSBuZXcgQXJyYXlMaXN0PE1ldGhvZFBsdWdpbj4oKTsKLQkJb2JqTGlzdC5hZGQobWV0aG9kT2JqZWN0KTsKLQotCQlnZXREZXNjZW5kYW50cyhkZXNjZW5kYW50TGlzdCwgb2JqTGlzdCk7Ci0KLQkJcmV0dXJuIGRlc2NlbmRhbnRMaXN0OwotCX0KLQotCXByaXZhdGUgc3RhdGljIExpc3Q8TWV0aG9kUGx1Z2luPiBnZXREZXNjZW5kYW50cyhMaXN0PE1ldGhvZFBsdWdpbj4gYWxsRGVzY2VuZGFudExpc3QsCi0JCQlMaXN0PE1ldGhvZFBsdWdpbj4gbWV0aG9kT2JqZWN0TGlzdCkgewotCQlpZiAobWV0aG9kT2JqZWN0TGlzdC5pc0VtcHR5KCkpCi0JCQlyZXR1cm4gYWxsRGVzY2VuZGFudExpc3Q7Ci0KLQkJTGlzdDxNZXRob2RQbHVnaW4+IGNvbWJEZXNjZW5kYW50TGlzdCA9IG5ldyBBcnJheUxpc3Q8TWV0aG9kUGx1Z2luPigpOwotCi0JCWZvciAoSXRlcmF0b3I8TWV0aG9kUGx1Z2luPiBpdGVyID0gbWV0aG9kT2JqZWN0TGlzdC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU1ldGhvZFBsdWdpbiBlbGVtZW50ID0gKE1ldGhvZFBsdWdpbikgaXRlci5uZXh0KCk7Ci0JCQlMaXN0PE1ldGhvZFBsdWdpbj4gZGVzY2VuZGFudExpc3QgPSBBc3NvY2lhdGlvbkhlbHBlcgotCQkJCQkuZ2V0UGx1Z2luRGlyZWN0RXh0ZW5zaW9ucyhlbGVtZW50KTsKLQkJCWNvbWJEZXNjZW5kYW50TGlzdC5hZGRBbGwoZGVzY2VuZGFudExpc3QpOwotCi0JCX0KLQotCQlhbGxEZXNjZW5kYW50TGlzdC5hZGRBbGwobWV0aG9kT2JqZWN0TGlzdCk7Ci0JCUxpc3Q8TWV0aG9kUGx1Z2luPiBuZXh0Q2hlY2tMaXN0ID0gbmV3IEFycmF5TGlzdDxNZXRob2RQbHVnaW4+KCk7Ci0JCWZvciAoSXRlcmF0b3I8TWV0aG9kUGx1Z2luPiBpdGVyID0gY29tYkRlc2NlbmRhbnRMaXN0Lml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJTWV0aG9kUGx1Z2luIGVsZW1lbnQgPSBpdGVyLm5leHQoKTsKLQkJCWlmICghYWxsRGVzY2VuZGFudExpc3QuY29udGFpbnMoZWxlbWVudCkpCi0JCQkJbmV4dENoZWNrTGlzdC5hZGQoZWxlbWVudCk7Ci0JCX0KLQotCQlyZXR1cm4gZ2V0RGVzY2VuZGFudHMoYWxsRGVzY2VuZGFudExpc3QsIG5leHRDaGVja0xpc3QpOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBkZXNjCi0JICogQHBhcmFtIHBsdWdpbkxpc3QKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcHJpbnRQbHVnaW5MaXN0KFN0cmluZyBkZXNjLCBMaXN0IHBsdWdpbkxpc3QpIHsKLQkJU3lzdGVtLm91dC5wcmludCgiJCQkICIgKyBkZXNjICsgIjogWyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IHBsdWdpbkxpc3QuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IChNZXRob2RQbHVnaW4pIGl0ZXJhdG9yLm5leHQoKTsKLQkJCVN5c3RlbS5vdXQucHJpbnQocGx1Z2luLmdldE5hbWUoKSArICIsICIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJU3lzdGVtLm91dC5wcmludGxuKCJdIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91dGlsL1Jlc291cmNlSGVscGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdXRpbC9SZXNvdXJjZUhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNmIyOTQzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91dGlsL1Jlc291cmNlSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTQ0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWw7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW1Xcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSSTsKLWltcG9ydCBqYXZhLm5ldC5VUkxEZWNvZGVyOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7Ci1pbXBvcnQgamF2YS51dGlsLnJlZ2V4Lk1hdGNoZXI7Ci1pbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLkZpbGVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuSTE4blV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5OZXRVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuU3RyVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLlhNTFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi54bWwuWFNMVFByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5JTGlicmFyeU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuSUxpYnJhcnlSZXNvdXJjZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuQnJvd3NpbmdMYXlvdXRTZXR0aW5nczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuRGVmYXVsdENvbnRlbnRWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LklDb250ZW50VmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5MYXlvdXRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LkxpbmtJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5lbGVtZW50cy5BY3Rpdml0eUxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQudXRpbC5YbWxFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC51dGlsLlhtbEhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UuTWV0aG9kTGlicmFyeVBlcnNpc3RlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLQotLyoqCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUmVzb3VyY2VIZWxwZXIgewotCi0JLy8gcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlJBQ0VfUkVQTEFDRU1FTlQgPSAiX0JSXyI7IC8vJE5PTi1OTFMtMSQKLQkvLyBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPUEVOQlJBQ0VfU1RSSU5HID0gIlxceyI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVSTF9CT09LTUFSS19JTkRJQ0FUT1IgPSAiIyI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVSTF9QQVJBTUVURVJfSU5ESUNBVE9SID0gIj8iOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVUkxfUEFSQU1FVEVSX1BST0NFU1MgPSAicHJvYyI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVSTF9TVFJfSkFWQVNDUklQVCA9ICJqYXZhc2NyaXB0OiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVSTF9TVFJfTUFJTFRPID0gIm1haWx0bzoiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVUkxfUEFSQU1FVEVSX1BBVEggPSAicGF0aCI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19BVFRSX05BTUUgPSAibmFtZSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19BVFRSX0tFWSA9ICJrZXkiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfQVRUUl9URVhUID0gInRleHQiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfQVRUUl9DTEFTUyA9ICJjbGFzcyI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19BVFRSX0dVSUQgPSAiZ3VpZCI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19BVFRSX0hSRUYgPSAiaHJlZiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19BVFRSX1ZBTFVFX0lOREVYID0gImluZGV4IjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklMRV9FWFRfSFRNTCA9ICIuaHRtbCI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZJTEVfRVhUX0hUTSA9ICIuaHRtIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklMRV9FWFRfSlBFRyA9ICIuanBlZyI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1JU1NJTkdfUEFHRVNfRk9MREVSID0gInBhZ2VzX25vdF9pbnN0YWxsZWQvIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxFTUVOVF9MSU5LX0NMQVNTX2VsZW1lbnRMaW5rID0gImVsZW1lbnRMaW5rIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxFTUVOVF9MSU5LX0NMQVNTX2VsZW1lbnRMaW5rV2l0aFR5cGUgPSAiZWxlbWVudExpbmtXaXRoVHlwZSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVMRU1FTlRfTElOS19DTEFTU19lbGVtZW50TGlua1dpdGhVc2VyVGV4dCA9ICJlbGVtZW50TGlua1dpdGhVc2VyVGV4dCI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFU09VUkNFX0ZPTERFUiA9IE1ldGhvZExpYnJhcnlQZXJzaXN0ZXIuUkVTT1VSQ0VfRk9MREVSOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBQYXR0ZXJuIHBfaHRtbF9maWxlX25hbWUgPSBQYXR0ZXJuCi0JCQkuY29tcGlsZSgiKC4qKSwoLiopXFwuaHRtbCIpOyAvLyROT04tTkxTLTEkCi0KLQkvLyB0aGlzIG9uZSBkb2VzIG5vdCB3b3JrIHdoZW4gY29udGFpbmluZyBub24tZW5nbGlzaCBjaGFyYWN0ZXJzLCB1c2UgdGhlCi0JLy8gbW9yZSBnZW5lcmFsIG9uZQotCS8vIHB1YmxpYyBzdGF0aWMgZmluYWwgUGF0dGVybiBwX2xpbmtfcmVmID0KLQkvLyBQYXR0ZXJuLmNvbXBpbGUoIjxhXFxzKz8oW14+XSopPiguKj8pPC9hPiIsIFBhdHRlcm4uQ0FTRV9JTlNFTlNJVElWRSB8Ci0JLy8gUGF0dGVybi5ET1RBTEwpOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBQYXR0ZXJuIHBfbGlua19yZWYgPSBQYXR0ZXJuCi0JCQkuY29tcGlsZSgKLQkJCQkJIjxhXFxzKz8oLio/KT4oLio/KTwvYT4iLCBQYXR0ZXJuLkNBU0VfSU5TRU5TSVRJVkUgfCBQYXR0ZXJuLkRPVEFMTCk7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgUGF0dGVybiBwX3RlbXBsYXRlX2F0dGFjaG1lbnRfdXJsID0gUGF0dGVybgotCQkJLmNvbXBpbGUoCi0JCQkJCSI8YVxccys/aHJlZlxccyo/PVxccyo/XCIoLio/KVwiXFxzKj8+KC4qPyk8L2E+IiwgUGF0dGVybi5DQVNFX0lOU0VOU0lUSVZFIHwgUGF0dGVybi5ET1RBTEwpOyAvLyROT04tTkxTLTEkCi0KLS8vCXB1YmxpYyBzdGF0aWMgZmluYWwgUGF0dGVybiBwX2FyZWFfcmVmID0gUGF0dGVybgotLy8JCQkuY29tcGlsZSgKLS8vCQkJCQkiPGFyZWEuKj8oaHJlZlxccyo9XFxzKlwiKC4qPylcIikiLCBQYXR0ZXJuLkNBU0VfSU5TRU5TSVRJVkUgfCBQYXR0ZXJuLkRPVEFMTCk7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFBhdHRlcm4gcF9hcmVhX3JlZiA9IFBhdHRlcm4KLQkuY29tcGlsZSgKLQkJCSI8YXJlYVxccys/KC4qPykvPz4iLCBQYXR0ZXJuLkNBU0VfSU5TRU5TSVRJVkUgfCBQYXR0ZXJuLkRPVEFMTCk7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgUGF0dGVybiBwX2xpbmtfcmVmX2dlbiA9IFBhdHRlcm4KLQkJCS5jb21waWxlKAotCQkJCQkiPChhfGFyZWEpXFxzKz8oW14+XSopPiIsIFBhdHRlcm4uQ0FTRV9JTlNFTlNJVElWRSB8IFBhdHRlcm4uRE9UQUxMKTsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBQYXR0ZXJuIHBfbGlua190eXBlX3BpY2tlciA9IFBhdHRlcm4KLQkJCS5jb21waWxlKAotCQkJCQkiXFxzKmNsYXNzXFxzKj89XFxzKj8oLio/KVxccysiLCBQYXR0ZXJuLkNBU0VfSU5TRU5TSVRJVkUgfCBQYXR0ZXJuLkRPVEFMTCk7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgUGF0dGVybiBwX2xpbmtfZ3VpZF9waWNrZXIgPSBQYXR0ZXJuCi0JCQkuY29tcGlsZSgKLQkJCQkJIlxccypndWlkXFxzKj89XFxzKj8oLio/KVxccysiLCBQYXR0ZXJuLkNBU0VfSU5TRU5TSVRJVkUgfCBQYXR0ZXJuLkRPVEFMTCk7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgUGF0dGVybiBwX2xpbmtfaHJlZl9waWNrZXIgPSBQYXR0ZXJuCi0JCQkuY29tcGlsZSgKLQkJCQkJIlxccypocmVmXFxzKj89XFxzKj9cIiguKj8pXCJcXHMrIiwgUGF0dGVybi5DQVNFX0lOU0VOU0lUSVZFIHwgUGF0dGVybi5ET1RBTEwpOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFBhdHRlcm4gcF90YWdfcmVmID0gUGF0dGVybgotCQkJLmNvbXBpbGUoCi0JCQkJCSI8KFtePiFdKikoXFxufFxccikoW14+XSopPiIsIFBhdHRlcm4uQ0FTRV9JTlNFTlNJVElWRSB8IFBhdHRlcm4uRE9UQUxMKTsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBQYXR0ZXJuIHBfaW1hZ2VfcmVmID0gUGF0dGVybgotCQkJLmNvbXBpbGUoCi0JCQkJCSIoPChpbWd8aWZyYW1lKS4qP3NyY1xccyo9XFxzKlwiKSguKj8pKFwiKSIsIFBhdHRlcm4uQ0FTRV9JTlNFTlNJVElWRSB8IFBhdHRlcm4uRE9UQUxMKTsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBQYXR0ZXJuIHBfdXJsX2RlY29kZXIgPSBQYXR0ZXJuCi0JCQkuY29tcGlsZSgKLQkJCQkJIig8W14+XSo/KHNyY3xocmVmKVxccyo9XFxzKlwiKSguKj8pKFwiW14+XSo/PikiLCBQYXR0ZXJuLkNBU0VfSU5TRU5TSVRJVkUgfCBQYXR0ZXJuLkRPVEFMTCk7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgUGF0dGVybiBwX3RhZ19hdHRyaWJ1dGVzID0gUGF0dGVybgotCS5jb21waWxlKAotCQkJIihbXFxTJiZbXj1dXSspXFxzKj1cXHMqKFtcXFMmJlteXCJdXSt8XCIoW1xcUyAmJlteXCJdXSspXCIpIiwgUGF0dGVybi5DQVNFX0lOU0VOU0lUSVZFIHwgUGF0dGVybi5ET1RBTEwpOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFBhdHRlcm4gcF9jc3NfcmVmID0gUGF0dGVybi5jb21waWxlKAotCQkJIiB1cmxcXCgoLio/KVxcKSIsIFBhdHRlcm4uQ0FTRV9JTlNFTlNJVElWRSB8IFBhdHRlcm4uRE9UQUxMKTsgLy8kTk9OLU5MUy0xJAotCi0JLy8gZGVmaW5lIGNvbnN0YW50cyBmb3IgZGlhZ3JhbSB0eXBlLgotCS8vIFRoaXMgd2lsbCBiZSB1c2VkIHdoZW4gbGlua2luZyBkaWFncmFtcyBpbnRvIHB1Ymxpc2hlZCBjb250ZW50cwotCS8vIEFjdGl2aXR5IGRpYWdyYW0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBESUFHUkFNX1RZUEVfV09SS0ZMT1cgPSAiQWN0aXZpdHkiOyAvLyROT04tTkxTLTEkCi0KLQkvLyBhY3Rpdml0eSBkZXRhaWwgZGlhZ3JhbQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERJQUdSQU1fVFlQRV9BQ1RJVklUWV9ERVRBSUwgPSAiQWN0aXZpdHlEZXRhaWwiOyAvLyROT04tTkxTLTEkCi0KLQkvLyBXUERlcGVuZGVuY3kgZGlhZ3JhbQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERJQUdSQU1fVFlQRV9XUF9ERVBFTkRFTkNZID0gIldQRGVwZW5kZW5jeSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIElMaWJyYXJ5UmVzb3VyY2VNYW5hZ2VyIGRlZmF1bHRSZXNvdXJjZU1ncjsKLQkJCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBzaG93U2tpblJlc291cmNlID0gZmFsc2U7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgTEFZT1VUX1hTTF9ST09UX1BBVEggPSBudWxsOwotCQotCXB1YmxpYyBSZXNvdXJjZUhlbHBlcigpIHsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHN5bmNocm9uaXplZCB2b2lkIHNldERlZmF1bHRSZXNvdXJjZU1ncihJTGlicmFyeVJlc291cmNlTWFuYWdlciBtZ3IpIHsKLQkJZGVmYXVsdFJlc291cmNlTWdyID0gbWdyOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHN5bmNocm9uaXplZCBJTGlicmFyeVJlc291cmNlTWFuYWdlciBnZXREZWZhdWx0UmVzb3VyY2VNZ3IoKSB7Ci0JCXJldHVybiBkZWZhdWx0UmVzb3VyY2VNZ3I7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgSUxpYnJhcnlSZXNvdXJjZU1hbmFnZXIgZ2V0UmVzb3VyY2VNZ3IoTWV0aG9kRWxlbWVudCBlbGVtZW50KSB7Ci0JCU1ldGhvZExpYnJhcnkgbGliID0gVW1hVXRpbC5nZXRNZXRob2RMaWJyYXJ5KGVsZW1lbnQpOwotCQlpZiAoIGxpYiAhPSBudWxsICkgewotCQkJSUxpYnJhcnlNYW5hZ2VyIGxpYk1nciA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0TGlicmFyeU1hbmFnZXIobGliKTsKLQkJCWlmIChsaWJNZ3IgPT0gbnVsbCkgewotCQkJCWxpYiA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKTsKLQkJCQlsaWJNZ3IgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmdldExpYnJhcnlNYW5hZ2VyKGxpYik7Ci0JCQl9Ci0JCQlpZiAobGliTWdyID09IG51bGwpIHsKLQkJCQlyZXR1cm4gZ2V0RGVmYXVsdFJlc291cmNlTWdyKCk7Ci0JCQl9Ci0JCQlyZXR1cm4gbGliTWdyLmdldFJlc291cmNlTWFuYWdlcigpOwotCQl9Ci0JCQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogdGhlIHJlbGF0aXZlIHBhdGggb2YgdGhlIHJlc291cmNlIGZvbGRlciBvZiB0aGUgcGx1Z2luIGluIHRoZSBsaWJyYXJ5LAotCSAqIHJlbGF0aXZlIHRvIHRoZSBsaWJyYXJ5IHJvb3QKLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UGx1Z2luUmVzb3VyY2VQYXRoKE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgewotCQlJTGlicmFyeVJlc291cmNlTWFuYWdlciByZXNNZ3IgPSBnZXRSZXNvdXJjZU1ncihlbGVtZW50KTsKLQkJaWYgKCByZXNNZ3IgIT0gbnVsbCApIHsKLQkJCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSBVbWFVdGlsLmdldE1ldGhvZFBsdWdpbihlbGVtZW50KTsKLQkJCWlmIChwbHVnaW4gPT0gbnVsbCkgewotCQkJCXJldHVybiByZXNNZ3IuZ2V0TG9naWNhbFJlc291cmNlUGF0aChlbGVtZW50KTsKLQkJCX0gZWxzZSB7Ci0JCQkJcmV0dXJuIHJlc01nci5nZXRMb2dpY2FsUmVzb3VyY2VQYXRoKHBsdWdpbik7Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIGdldCB0aGUgcmVsYXRpdmUgcGF0aCBvZiB0aGUgcmVzb3VyY2UgZm9sZGVyIG9mIHRoZSBlbGVtZW50IGluIHRoZQotCSAqIGxpYnJhcnksIHJlbGF0aXZlIHRvIHRoZSBsaWJyYXJ5IHJvb3QKLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudCBNZXRob2RFbGVtZW50Ci0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRFbGVtZW50UmVzb3VyY2VQYXRoKE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgewotCQlJTGlicmFyeVJlc291cmNlTWFuYWdlciByZXNNZ3IgPSBnZXRSZXNvdXJjZU1ncihlbGVtZW50KTsKLQkJaWYgKCByZXNNZ3IgIT0gbnVsbCApIHsKLQkJCXJldHVybiByZXNNZ3IuZ2V0TG9naWNhbFJlc291cmNlUGF0aChlbGVtZW50KTsKLQkJfQotCQkKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qKgotCSAqIEdldHMgdGhlIGFic29sdXRlIHBhdGggb2YgdGhlIHJlc291cmNlIGZvbGRlciBvZiB0aGUgZWxlbWVudCBpbiB0aGUgbGlicmFyeS4KLQkgKiAKLQkgKiBAcGFyYW0gZQotCSAqIEByZXR1cm4gYWJzb2x1dGUgcGF0aCBvZiB0aGUgZWxlbWVudCdzIHJlc291cmNlIGZvbGRlcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEFic29sdXRlRWxlbWVudFJlc291cmNlUGF0aChNZXRob2RFbGVtZW50IGVsZW1lbnQpIHsKLQkJSUxpYnJhcnlSZXNvdXJjZU1hbmFnZXIgcmVzTWdyID0gZ2V0UmVzb3VyY2VNZ3IoZWxlbWVudCk7Ci0JCWlmICggcmVzTWdyICE9IG51bGwgKSB7Ci0JCQlyZXR1cm4gcmVzTWdyLmdldFBoeXNpY2FsUmVzb3VyY2VQYXRoKGVsZW1lbnQpOwotCQl9Ci0JCQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBnZXQgdGhlIHJlbGF0aXZlIHBhdGggb2YgdGhlIGZvbGRlciBvZiB0aGUgZWxlbWVudCBpbiB0aGUgbGlicmFyeSwKLQkgKiByZWxhdGl2ZSB0byB0aGUgbGlicmFyeSByb290Ci0JICogCi0JICogQHBhcmFtIGVsZW1lbnQgTWV0aG9kRWxlbWVudAotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RWxlbWVudFBhdGgoTWV0aG9kRWxlbWVudCBlbGVtZW50KSB7Ci0vLwkJdHJ5IHsKLS8vCQkJU3RyaW5nIHBhdGggPSBNZXRob2RMaWJyYXJ5UGVyc2lzdGVyLklOU1RBTkNFLmdldFJlbGF0aXZlRWxlbWVudFBhdGgoZWxlbWVudCk7Ci0vLwkJCWlmIChwYXRoID09IG51bGwgfHwgcGF0aC5lcXVhbHMoIiIpKSAvLyROT04tTkxTLTEkCi0vLwkJCXsKLS8vCQkJCVN5c3RlbS5vdXQKLS8vCQkJCQkJLnByaW50bG4oIldhcm5pbmchIE5vIFBhdGggZm9yIEVsZW1lbnQgWyIgKyBlbGVtZW50LmdldFR5cGUoKS5nZXROYW1lKCkgKyAiOiAiICsgZWxlbWVudC5nZXROYW1lKCkgKyAiXSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotLy8JCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0vLwkJCX0KLS8vCQkJcmV0dXJuIGZpeFBhdGgocGF0aCk7Ci0vLwkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0vLwkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0vLwkJfQotLy8KLS8vCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJSUxpYnJhcnlSZXNvdXJjZU1hbmFnZXIgcmVzTWdyID0gZ2V0UmVzb3VyY2VNZ3IoZWxlbWVudCk7Ci0JCWlmICggcmVzTWdyICE9IG51bGwgKSB7Ci0JCQlyZXR1cm4gcmVzTWdyLmdldExvZ2ljYWxQYXRoKGVsZW1lbnQpOwotCQl9Ci0JCQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0vLwlwcml2YXRlIHN0YXRpYyBJRmlsZUJhc2VkTGlicmFyeVBlcnNpc3RlciBnZXRGaWxlQmFzZWRMaWJyYXJ5UGVyc2lzdGVyKE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgewotLy8JCVJlc291cmNlIHJlc291cmNlID0gZWxlbWVudC5lUmVzb3VyY2UoKTsKLS8vCQlpZihyZXNvdXJjZSAhPSBudWxsKSB7Ci0vLwkJCUlMaWJyYXJ5UGVyc2lzdGVyIHBlcnNpc3RlciA9IExpYnJhcnlTZXJ2aWNlVXRpbC5nZXRQZXJzaXN0ZXJGb3IocmVzb3VyY2UpOwotLy8JCQlpZihwZXJzaXN0ZXIgaW5zdGFuY2VvZiBJRmlsZUJhc2VkTGlicmFyeVBlcnNpc3RlcikgewotLy8JCQkJcmV0dXJuICgoSUZpbGVCYXNlZExpYnJhcnlQZXJzaXN0ZXIpcGVyc2lzdGVyKTsKLS8vCQkJfQotLy8JCX0KLS8vCQlyZXR1cm4gbnVsbDsKLS8vCX0KLS8vCQotLy8JLyoqCi0vLwkgKiBHZXRzIHRoZSBwYXRoIG9mIGEgbWV0aG9kIGVsZW1lbnQncyBmb2xkZXIgcmVsYXRpdmUgdG8gaXRzIHBsdWctaW4uCi0vLwkgKiAKLS8vCSAqIEBwYXJhbSBlbGVtZW50Ci0vLwkgKiBAcmV0dXJuCi0vLwkgKiBAZGVwbGljYXRlZCAKLS8vCSAqLwotLy8JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldEZvbGRlclJlbGF0aXZlUGF0aChNZXRob2RFbGVtZW50IGVsZW1lbnQpIHsKLS8vCQlJRmlsZUJhc2VkTGlicmFyeVBlcnNpc3RlciBwZXJzaXN0ZXIgPSBnZXRGaWxlQmFzZWRMaWJyYXJ5UGVyc2lzdGVyKGVsZW1lbnQpOwotLy8JCXJldHVybiBwZXJzaXN0ZXIgIT0gbnVsbCA/IHBlcnNpc3Rlci5nZXRGb2xkZXJSZWxhdGl2ZVBhdGgoZWxlbWVudCkgOiBudWxsOwotLy8JfQotCQotCS8qKgotCSAqIEdldHMgdGhlIGFic29sdXRlIHBhdGggb2YgYSBtZXRob2QgZWxlbWVudCdzIGZvbGRlci4KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqIEByZXR1cm4gdGhlIGFic29sdXRlIHBhdGgKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRGb2xkZXJBYnNvbHV0ZVBhdGgoTWV0aG9kRWxlbWVudCBlbGVtZW50KSB7Ci0vLwkJaWYgKCBlbGVtZW50ID09IG51bGwgKSB7Ci0vLwkJCXJldHVybiBudWxsOwotLy8JCX0KLS8vCQkKLS8vCQlJRmlsZUJhc2VkTGlicmFyeVBlcnNpc3RlciBwZXJzaXN0ZXIgPSBnZXRGaWxlQmFzZWRMaWJyYXJ5UGVyc2lzdGVyKGVsZW1lbnQpOwotLy8JCXJldHVybiBwZXJzaXN0ZXIgIT0gbnVsbCA/IHBlcnNpc3Rlci5nZXRGb2xkZXJBYnNvbHV0ZVBhdGgoZWxlbWVudCkgOiBudWxsOwotCQlJTGlicmFyeVJlc291cmNlTWFuYWdlciByZXNNZ3IgPSBnZXRSZXNvdXJjZU1ncihlbGVtZW50KTsKLQkJaWYgKCByZXNNZ3IgIT0gbnVsbCApIHsKLQkJCXJldHVybiByZXNNZ3IuZ2V0UGh5c2ljYWxQYXRoKGVsZW1lbnQpOwotCQl9Ci0JCQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLS8vCS8qKgotLy8JICogcmV0dXJuIHRoZSBwYXJlbnQgZm9sZGVyIG9mIHRoZSBwbHVnaW4gb3IgY29uZmlndXJhdGlvbiBvZiB0aGUgZWxlbWVudC4KLS8vCSAqIG9yIHRoZSBsaWJyYXJ5IHJvb3QgaWYgdGhlIGVsZW1lbnQgaXMgdGhlIE1ldGhvZExpYnJhcnkuCi0vLwkgKiAKLS8vCSAqIEBwYXJhbSBlbGVtZW50IE1ldGhvZEVsZW1lbnQKLS8vCSAqIEByZXR1cm4gU3RyaW5nCi0vLwkgKi8KLS8vCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFZpcnR1YWxMaWJyYXJ5Um9vdChNZXRob2RFbGVtZW50IGVsZW1lbnQpIHsKLS8vCQlpZiAoIGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RMaWJyYXJ5ICkgewotLy8JCQkvLyBkZWZhdWx0LCByZXR1cm4gdGhlIGN1cnJlbnQgbGlicmFyeSBwYXRoCi0vLwkJCXJldHVybiBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5TG9jYXRpb24oKTsJCQkJCQotLy8JCX0gCi0vLwkJCi0vLwkJU3RyaW5nIHBhdGggPSBudWxsOwotLy8JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kQ29uZmlndXJhdGlvbiApIHsKLS8vCQkJcGF0aCA9IGdldEZvbGRlckFic29sdXRlUGF0aChlbGVtZW50KTsKLS8vCQl9IGVsc2UgewotLy8JCQlwYXRoID0gZ2V0UGx1Z2luUGF0aChlbGVtZW50KTsKLS8vCQl9Ci0vLwkJCi0vLwkJaWYgKCBwYXRoICE9IG51bGwgKSB7Ci0vLwkJCUZpbGUgZiA9IG5ldyBGaWxlKHBhdGgpOwotLy8JCQlyZXR1cm4gZi5nZXRQYXJlbnRGaWxlKCkuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0vLwkJfQotLy8JCQotLy8JCXJldHVybiBudWxsOwotLy8JfQotCQotLy8JLyoqCi0vLwkgKiBmaXggdGhlIHBhdGggYnkgYXBwZW5kaW5nIGEgRmlsZS5zZXBlcmF0b3IgdG8gdGhlIGVuZCBvZiBpdAotLy8JICogQHBhcmFtIHBhdGggU3RyaW5nCi0vLwkgKiBAcmV0dXJuIFN0cmluZwotLy8JICovCi0vLwlwdWJsaWMgc3RhdGljIFN0cmluZyBmaXhQYXRoKFN0cmluZyBwYXRoKSB7Ci0vLwkJaWYgKHBhdGggPT0gbnVsbCB8fCBwYXRoLmVxdWFscygiIikpIC8vJE5PTi1OTFMtMSQKLS8vCQl7Ci0vLwkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotLy8JCX0gZWxzZSBpZiAoIXBhdGguZW5kc1dpdGgoRmlsZS5zZXBhcmF0b3IpKSB7Ci0vLwkJCXJldHVybiBwYXRoICsgRmlsZS5zZXBhcmF0b3I7Ci0vLwkJfSBlbHNlIHsKLS8vCQkJcmV0dXJuIHBhdGg7Ci0vLwkJfQotLy8JfQotCi0JCi0JLyoqCi0JICogZ2V0IHRoZSBlbGVtZW50J3MgYmFjayBwYXRoIHJlbGF0aXZlIHRvIHRoZSBsaWJyYXJ5IHJvb3QuIEZvciBleGFtcGxlLAotCSAqICJPcGVuVVBcZ3VpZGFuY2VcY29uY2VwdFxjMS54bWwiLCB0aGUgYmFjayBwYXRoIGlzICIuLy4uLy4uLy4uLyIKLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudCBNZXRob2RFbGVtZW50Ci0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRCYWNrUGF0aChNZXRob2RFbGVtZW50IGVsZW1lbnQpIHsKLS8vCQkvLyBMaW51eDogQnJvd3NpbmcgYW5kIHByZXZpZXcgc2hvd3Mgb25seSBwbGFpbiB0ZXh0LgotLy8JCS8vIFRoZXJlIGFyZSBubyBpbWFnZXMvc2VjdGlvbnMKLS8vCQkvLyBlbGVtZW50IHBhdGggc2hvdWxkIGNoZWNrIEZpbGUuc2VwYXJhdG9yQ2hhciBpbnN0ZWFkIG9mICJcIgotLy8JCVN0cmluZyBiYWNrUGF0aCA9ICIiOyAvLyROT04tTkxTLTEkCi0vLwkJU3RyaW5nIHBhdGggPSBnZXRFbGVtZW50UGF0aChlbGVtZW50KTsKLS8vCQlpZiAocGF0aCAhPSBudWxsICYmIHBhdGgubGVuZ3RoKCkgPiAwKSB7Ci0vLwkJCWJhY2tQYXRoID0gcGF0aC5yZXBsYWNlKEZpbGUuc2VwYXJhdG9yQ2hhciwgJy8nKS5yZXBsYWNlQWxsKAotLy8JCQkJCSIuKj8vIiwgIlxcLlxcLi8iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0vLwkJfQotLy8JCXJldHVybiAiLi8iICsgYmFja1BhdGg7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCUlMaWJyYXJ5UmVzb3VyY2VNYW5hZ2VyIHJlc01nciA9IGdldFJlc291cmNlTWdyKGVsZW1lbnQpOwotCQlpZiAoIHJlc01nciAhPSBudWxsICkgewotCQkJcmV0dXJuIHJlc01nci5nZXRCYWNrUGF0aChlbGVtZW50KTsKLQkJfQotCQkKLQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogZ2V0IHRoZSBmaWxlIG5hbWUgd2l0aCB0aGUgZ2l2ZW4gZXh0ZW5zaW9uCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQgTWV0aG9kRWxlbWVudAotCSAqIEBwYXJhbSBleHQgU3RyaW5nIHRoZSBmaWxlIGV4dGVuYXNpb24sIGZvciBleGFtcGxlLCAiLmh0bWwiCi0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRGaWxlTmFtZShNZXRob2RFbGVtZW50IGVsZW1lbnQsIFN0cmluZyBleHQpIHsKLQkJcmV0dXJuIGdldEZpbGVOYW1lKGVsZW1lbnQsIG51bGwsIG51bGwsIGV4dCk7Ci0JfQotCi0JLyoqCi0JICogZ2V0IHRoZSBmaWxlIG5hbWUgd2l0aCB0aGUgZ2l2ZW4gcHJlZml4IGFuZCBleHRlbnNpb24KLQkgKiBAcGFyYW0gZWxlbWVudCBNZXRob2RFbGVtZW50Ci0JICogQHBhcmFtIG5hbWVQcmVmaXggU3RyaW5nIHByZWZpeCBmb3IgdGhlIG5hbWUKLQkgKiBAcGFyYW0gbmFtZVN1ZmZpeCBTdHJpbmcgc3VmZml4IGZvciB0aGUgbmFtZQotCSAqIEBwYXJhbSBleHQgU3RyaW5nIGZpbGUgZXh0ZW5zaW9uLCBmb3IgZXhhbXBsZSwgIi5odG1sIgotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCSAKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRGaWxlTmFtZShNZXRob2RFbGVtZW50IGVsZW1lbnQsIFN0cmluZyBuYW1lUHJlZml4LAotCQkJU3RyaW5nIG5hbWVTdWZmaXgsIFN0cmluZyBleHQpIHsJCQotCQlyZXR1cm4gRmlsZU5hbWVHZW5lcmF0b3IuSU5TVEFOQ0UuZ2V0RmlsZU5hbWUoZWxlbWVudCwgbmFtZVByZWZpeCwgbmFtZVN1ZmZpeCwgZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBnZXQgdGhlIGd1aWQgZnJvbSB0aGUgZmlsZSBuYW1lLCBhc3N1bWluZyB0aGUgZmlsZSBuYW1lIGlzIGdlbmVyYXRlZCBmcm9tIGFuIGVsZW1lbnQsIAotCSAqIHJldHVybiBudWxsIGlmIG5vdCBmb3VuZC4KLQkgKiBAcGFyYW0gZmlsZU5hbWUgU3RyaW5nCi0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRHdWlkRnJvbUZpbGVOYW1lKFN0cmluZyBmaWxlTmFtZSkgewotCQlyZXR1cm4gRmlsZU5hbWVHZW5lcmF0b3IuSU5TVEFOQ0UuZ2V0R3VpZEZyb21GaWxlTmFtZShmaWxlTmFtZSk7Ci0JfQotCi0JLyoqCi0JICogZ2V0IHRoZSBlbGVtZW50IGZyb20gdGhlIGZpbGUgbmFtZSwgYXNzdW1pbmcgdGhlIGZpbGUgbmFtZSBpcyBnZW5lcmF0ZWQgZnJvbSBhbiBlbGVtZW50LAotCSAqIHJldHVybiBudWxsIGlmIG5vdC4KLQkgKiBAcGFyYW0gZmlsZU5hbWUgU3RyaW5nCi0JICogQHJldHVybiBNZXRob2RFbGVtZW50Ci0JICovCi0JcHVibGljIHN0YXRpYyBNZXRob2RFbGVtZW50IGdldEVsZW1lbnRGcm9tRmlsZU5hbWUoU3RyaW5nIGZpbGVOYW1lKSB7Ci0JCVN0cmluZyBndWlkID0gZ2V0R3VpZEZyb21GaWxlTmFtZShmaWxlTmFtZSk7Ci0JCWlmIChndWlkICE9IG51bGwpIHsKLQkJCUlMaWJyYXJ5TWFuYWdlciBtYW5hZ2VyID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKQotCQkJCQkuZ2V0Q3VycmVudExpYnJhcnlNYW5hZ2VyKCk7Ci0JCQlpZiAobWFuYWdlciAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIG1hbmFnZXIuZ2V0TWV0aG9kRWxlbWVudChndWlkKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIGdldCB0aGUgZWxlbWVudCB1cmwgcmVsYXRpdmUgdG8gdGhlIHJlZkVsZW1lbnQKLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudCBNZXRob2RFbGVtZW50Ci0JICogQHBhcmFtIHJlZkVsZW1lbnQgTWV0aG9kRWxlbWVudAotCSAqIEBwYXJhbSBmaWxlRXh0IFN0cmluZyBmaWxlIGV4dGVuc2lvbgotCSAqIEBwYXJhbSBvbGRfdXJsIFN0cmluZyB0aGUgb2xkIHVybCBvZiB0aGUgZWxlbWVudC4gSWYgdGhlIG9sZCB1cmwgaXMgbm90IG51bGwsIAotCSAqIGFueSBib29rbWFyayBvciB1cmwgcGFyYW1ldGVycyBhcmUgcGFzc2VkIHRvIHRoZSBuZXcgdXJsCi0JICogQHJldHVybiBTdHJpbmcgU3RyaW5nIHRoZSBuZXcgZWxlbWVudAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFVybChNZXRob2RFbGVtZW50IGVsZW1lbnQsCi0JCQlNZXRob2RFbGVtZW50IHJlZkVsZW1lbnQsIFN0cmluZyBmaWxlRXh0LCBTdHJpbmcgb2xkX3VybCkgewotCQlTdHJpbmcgdXJsID0gZ2V0VXJsKGVsZW1lbnQsIHJlZkVsZW1lbnQsIGZpbGVFeHQpOwotCi0JCS8vIGlmIHRoZSBvbGQgdXJsIGhhcyBib29rbWFyayBpbiBpdCwga2VlcCBpdAotCQlpZiAob2xkX3VybCAhPSBudWxsKSB7Ci0JCQlpbnQgaW5keCA9IG9sZF91cmwuaW5kZXhPZihVUkxfQk9PS01BUktfSU5ESUNBVE9SKTsKLQkJCWlmIChpbmR4IDwgMCkgewotCQkJCS8vIGtlZXAgdXJsIHF1ZXJ5IHN0cmluZyBhcyB3ZWxsCi0JCQkJaW5keCA9IG9sZF91cmwuaW5kZXhPZihVUkxfUEFSQU1FVEVSX0lORElDQVRPUik7Ci0JCQl9Ci0KLQkJCWlmIChpbmR4ID49IDApIHsKLQkJCQl1cmwgPSB1cmwgKyBvbGRfdXJsLnN1YnN0cmluZyhpbmR4KTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiB1cmw7Ci0JfQotCi0JLyoqCi0JICogZ2V0IHRoZSBlbGVtZW50IHVybCByZWxhdGl2ZSB0byB0aGUgcmVmRWxlbWVudAotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50IE1ldGhvZEVsZW1lbnQKLQkgKiBAcGFyYW0gcmVmRWxlbWVudCBNZXRob2RFbGVtZW50Ci0JICogQHBhcmFtIGZpbGVFeHQgU3RyaW5nIGZpbGUgZXh0ZW5zaW9uCi0JICogQHJldHVybiBTdHJpbmcgdGhlIHVybAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFVybChNZXRob2RFbGVtZW50IGVsZW1lbnQsCi0JCQlNZXRob2RFbGVtZW50IHJlZkVsZW1lbnQsIFN0cmluZyBmaWxlRXh0KSB7Ci0JCWlmIChlbGVtZW50ID09IG51bGwpIHsKLQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJaWYgKHJlZkVsZW1lbnQgPT0gbnVsbCkgewotCQkJcmV0dXJuIGdldEVsZW1lbnRQYXRoKGVsZW1lbnQpLnJlcGxhY2UoRmlsZS5zZXBhcmF0b3JDaGFyLCAnLycpCi0JCQkJCSsgZ2V0RmlsZU5hbWUoZWxlbWVudCwgZmlsZUV4dCk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gKGdldEJhY2tQYXRoKHJlZkVsZW1lbnQpICsgZ2V0RWxlbWVudFBhdGgoZWxlbWVudCkpLnJlcGxhY2UoCi0JCQkJCUZpbGUuc2VwYXJhdG9yQ2hhciwgJy8nKQotCQkJCQkrIGdldEZpbGVOYW1lKGVsZW1lbnQsIGZpbGVFeHQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogZ2V0IHRoZSBsaW5rIHRleHQgZm9yIGFuIGVsZW1lbnQKLQkgKiBAcGFyYW0gZSBNZXRob2RFbGVtZW50Ci0JICogQHBhcmFtIGxpbmtUeXBlIFN0cmluZwotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TGlua1RleHQoTWV0aG9kRWxlbWVudCBlLCBTdHJpbmcgbGlua1R5cGUsIE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0JCVN0cmluZyBsaW5rZWRUZXh0ID0gbnVsbDsKLQotCQkvLyBSVEUgbWF5IGNoYW5nZSB0aGUgY2FzZSBvZiBhdHRyaWJ1dGVzLgotCQlpZiAoKGxpbmtUeXBlICE9IG51bGwpCi0JCQkJJiYgIUVMRU1FTlRfTElOS19DTEFTU19lbGVtZW50TGlua1dpdGhVc2VyVGV4dC5lcXVhbHNJZ25vcmVDYXNlKGxpbmtUeXBlKSkgewotCQkJaWYgKEVMRU1FTlRfTElOS19DTEFTU19lbGVtZW50TGlua1dpdGhUeXBlLmVxdWFsc0lnbm9yZUNhc2UobGlua1R5cGUpKSB7Ci0JCQkJbGlua2VkVGV4dCA9IGdldEVsZW1lbnRMaW5rVGV4dChlLCB0cnVlLCBjb25maWcpOwotCQkJfSBlbHNlIGlmIChFTEVNRU5UX0xJTktfQ0xBU1NfZWxlbWVudExpbmsuZXF1YWxzSWdub3JlQ2FzZShsaW5rVHlwZSkpIHsKLQkJCQlsaW5rZWRUZXh0ID0gZ2V0RWxlbWVudExpbmtUZXh0KGUsIGZhbHNlLCBjb25maWcpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGxpbmtlZFRleHQ7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldExpbmtUZXh0KE1ldGhvZEVsZW1lbnQgZSwgU3RyaW5nIGxpbmtUeXBlKSB7Ci0JCXJldHVybiBnZXRMaW5rVGV4dChlLCBsaW5rVHlwZSwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogZ2V0IHRoZSBlbGVtZW50IGxpbmsgdGV4dCBmb3IgdGhlIGdpdmVuIGVsZW1lbnQKLQkgKiBAcGFyYW0gZWxlbWVudCBNZXRob2RFbGVtZW50Ci0JICogQHBhcmFtIHdpdGhUeXBlIGJvb2xlYW4gaWYgdHJ1ZSB0aGUgZWxlbWVudCB0eXBlIHN0cmluZyB3aWxsIGJlIGluY2x1ZGVkCi0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRFbGVtZW50TGlua1RleHQoTWV0aG9kRWxlbWVudCBlbGVtZW50LAotCQkJYm9vbGVhbiB3aXRoVHlwZSkgewotCQlyZXR1cm4gZ2V0RWxlbWVudExpbmtUZXh0KGVsZW1lbnQsIHdpdGhUeXBlLCBudWxsKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RWxlbWVudExpbmtUZXh0KE1ldGhvZEVsZW1lbnQgZWxlbWVudCwKLQkJCWJvb2xlYW4gd2l0aFR5cGUsIGZpbmFsIE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0JCQotCQlUbmdVdGlsLlByZXNlbnRhdGlvbk5hbWVIZWxwZXIgcEhlbHBlciA9IGNvbmZpZyA9PSBudWxsID8gbnVsbCA6IAotCQkJCQkJCQluZXcgVG5nVXRpbC5QcmVzZW50YXRpb25OYW1lSGVscGVyKCkgewotCQkJCi0JCQlwdWJsaWMgU3RyaW5nIGdldFByZXNlbnRhdGlvbk5hbWUoTWV0aG9kRWxlbWVudCBlbGVtZW50KSB7Ci0JCQkJaWYgKGVsZW1lbnQgPT0gbnVsbCkgewotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0JCQkJU3RyaW5nIHN0ciA9IHN1cGVyLmdldFByZXNlbnRhdGlvbk5hbWUoZWxlbWVudCk7Ci0JCQkJaWYgKFN0clV0aWwuaXNCbGFuayhzdHIpICYmIGVsZW1lbnQgaW5zdGFuY2VvZiBWYXJpYWJpbGl0eUVsZW1lbnQpIHsKLQkJCQkJVmFyaWFiaWxpdHlFbGVtZW50IHZlID0gKFZhcmlhYmlsaXR5RWxlbWVudCkgZWxlbWVudDsKLQkJCQkJaWYgKHZlLmdldFZhcmlhYmlsaXR5VHlwZSgpID09IFZhcmlhYmlsaXR5VHlwZS5FWFRFTkRTX1JFUExBQ0VTKSB7Ci0JCQkJCQlWYXJpYWJpbGl0eUVsZW1lbnQgYmFzZSA9IHZlLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsKLQkJCQkJCVN0cmluZyBiYXNlU3RyID0gYmFzZSA9PSBudWxsID8gbnVsbCA6IGJhc2UuZ2V0UHJlc2VudGF0aW9uTmFtZSgpOwotCQkJCQkJaWYgKCEgU3RyVXRpbC5pc0JsYW5rKGJhc2VTdHIpKSB7Ci0JCQkJCQkJcmV0dXJuIGJhc2VTdHI7Ci0JCQkJCQl9Ci0JCQkJCX0JCQkJCQotCQkJCX0KLQkJCQlyZXR1cm4gc3RyOwotCQkJfQotCQkJCi0JCX07Ci0JCQotCQlTdHJpbmcgdGV4dCA9IFRuZ1V0aWwuZ2V0UHJlc2VudGF0aW9uTmFtZShlbGVtZW50LCBwSGVscGVyKTsKLS8vCQlpZiAod2l0aFR5cGUpIHsKLQkJCi0vLwkJCXJldHVybiBnZXRFbGVtZW50VHlwZVRleHQoZWxlbWVudCkgKyBMaWJyYXJ5UmVzb3VyY2VzLmNvbG9uX3dpdGhfc3BhY2UgKyB0ZXh0OyAKLS8vCQl9Ci0vLwotLy8JCXJldHVybiB0ZXh0OwotCQlpZiAod2l0aFR5cGUpIHsKLQkJCWlmIChzaG93U2tpblJlc291cmNlKSB7Ci0JCQkJU3RyaW5nIHhzbFBhdGggPSBudWxsOwotCi0JCQkJaWYgKChMQVlPVVRfWFNMX1JPT1RfUEFUSCA9PSBudWxsKQotCQkJCQkJfHwgKExBWU9VVF9YU0xfUk9PVF9QQVRILmVxdWFscygiIikpKSB7Ly8kTk9OLU5MUy0xJAotCQkJCQlMQVlPVVRfWFNMX1JPT1RfUEFUSCA9IEJyb3dzaW5nTGF5b3V0U2V0dGluZ3MuSU5TVEFOQ0UuZ2V0WHNsUGF0aCgpCi0JCQkJCQkJLmdldEFic29sdXRlUGF0aCgpOwotCQkJCX0KLQkJCQlQcm9wZXJ0aWVzIGJyb3dzaW5nUmVzb3VyY2UgPSBuZXcgUHJvcGVydGllcygpOwotCQkJCUZpbGUgZmlsZSA9IG5ldyBGaWxlKExBWU9VVF9YU0xfUk9PVF9QQVRILCAicmVzb3VyY2VzLnByb3BlcnRpZXMiKTsgLy8kTk9OLU5MUy0xJAotCQkJCUxvY2FsZSBsb2NhbGUgPSBMb2NhbGUuZ2V0RGVmYXVsdCgpOwotCQkJCVN0cmluZyBsb2NhbEZpbGVOYW1lID0gSTE4blV0aWwuZ2V0TG9jYWxpemVkRmlsZShmaWxlCi0JCQkJCQkuZ2V0QWJzb2x1dGVQYXRoKCksIGxvY2FsZSk7Ci0JCQkJaWYgKGxvY2FsRmlsZU5hbWUgIT0gbnVsbCkgewotCQkJCQlmaWxlID0gbmV3IEZpbGUobG9jYWxGaWxlTmFtZSk7Ci0JCQkJfQotCQkJCWlmIChmaWxlLmV4aXN0cygpKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlicm93c2luZ1Jlc291cmNlLmxvYWQobmV3IEZpbGVJbnB1dFN0cmVhbShmaWxlKSk7Ci0JCQkJCX0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCi0JCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCi0JCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJU3RyaW5nIHR5cGUgPSBnZXRFbGVtZW50VHlwZVRleHQoZWxlbWVudCk7Ci0JCQkJU3RyaW5nIGtleSA9IHR5cGUuc3Vic3RyaW5nKDAsIDEpLnRvTG93ZXJDYXNlKCkKLQkJCQkJCSsgdHlwZS5zdWJzdHJpbmcoMSkgKyAiVGV4dCI7Ly8kTk9OLU5MUy0xJAotCQkJCVN0cmluZyB2YWx1ZSA9IGJyb3dzaW5nUmVzb3VyY2UuZ2V0UHJvcGVydHkoa2V5KTsKLQkJCQlpZiAodmFsdWUgIT0gbnVsbCkgewotCQkJCQlyZXR1cm4gdmFsdWUgKyBMaWJyYXJ5UmVzb3VyY2VzLmNvbG9uX3dpdGhfc3BhY2UgKyB0ZXh0OwotCQkJCX0gZWxzZSB7Ci0JCQkJCXJldHVybiB0eXBlICsgTGlicmFyeVJlc291cmNlcy5jb2xvbl93aXRoX3NwYWNlICsgdGV4dDsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJcmV0dXJuIGdldEVsZW1lbnRUeXBlVGV4dChlbGVtZW50KSArIExpYnJhcnlSZXNvdXJjZXMuY29sb25fd2l0aF9zcGFjZSArIHRleHQ7Ci0JCQl9Ci0JCQkKLQkJfQotCQkKLQkJcmV0dXJuIHRleHQ7Ci0JfQotCi0JLyoqCi0JICogZ3RlIHRoZSBlbGVtZW50IHR5cGUgc3RyaW5nCi0JICogQHBhcmFtIGVsZW1lbnQgTWV0aG9kRWxlbWVudAotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RWxlbWVudFR5cGVUZXh0KE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgewotCQlpZiAoZWxlbWVudCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCXJldHVybiBUbmdVdGlsLmdldFR5cGVUZXh0KGVsZW1lbnQpOwotCX0KLQotCS8qKgotCSAqIGF1dG8gZ2VuZXJhdGVkIGVsZW1lbnQgbGluayA8YSBjbGFzcz0iZWxlbWVudExpbmsiIGhyZWY9ImVsZW1lbnRfdXJsIgotCSAqIGd1aWQ9ImVsZW1lbnRfZ3VpZCI+ZWxlbWVudF90eXBlOiBlbGVtZW50X3ByZXNlbnRhdGlvbl9uYW1lPC9hPgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogICAgICAgICAgICBNZXRob2RFbGVtZW50Ci0JICogQHBhcmFtIHdpdGhUeXBlCi0JICogICAgICAgICAgICBib29sZWFuCi0JICogQHBhcmFtIHVybAotCSAqICAgICAgICAgICAgU3RyaW5nCi0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRFbGVtZW50TGluayhNZXRob2RFbGVtZW50IGVsZW1lbnQsCi0JCQlib29sZWFuIHdpdGhUeXBlLCBTdHJpbmcgdXJsKSB7Ci0JCVN0cmluZyB0ZXh0ID0gZ2V0RWxlbWVudExpbmtUZXh0KGVsZW1lbnQsIHdpdGhUeXBlKTsKLQkJU3RyaW5nIGxpbmtDbGFzcyA9IEVMRU1FTlRfTElOS19DTEFTU19lbGVtZW50TGluazsKLQkJaWYgKHdpdGhUeXBlKQotCQkJbGlua0NsYXNzID0gRUxFTUVOVF9MSU5LX0NMQVNTX2VsZW1lbnRMaW5rV2l0aFR5cGU7Ci0JCXJldHVybiBnZXRFbGVtZW50TGluayhlbGVtZW50LCB0ZXh0LCB1cmwsIGxpbmtDbGFzcyk7Ci0JfQotCi0JLyoqCi0JICogZWxlbWVudCBsaW5rIHdpdGggdXNlciBzcGVjaWZpZWQgbGluayB0ZXh0Ci0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiBAcGFyYW0gdGV4dAotCSAqIEBwYXJhbSB1cmwKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEVsZW1lbnRMaW5rKE1ldGhvZEVsZW1lbnQgZWxlbWVudCwgU3RyaW5nIHRleHQsCi0JCQlTdHJpbmcgdXJsKSB7Ci0JCXJldHVybiBnZXRFbGVtZW50TGluayhlbGVtZW50LCB0ZXh0LCB1cmwsCi0JCQkJRUxFTUVOVF9MSU5LX0NMQVNTX2VsZW1lbnRMaW5rV2l0aFVzZXJUZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBlbGVtZW50IGxpbmsgd2l0aCB1c2VyIHNwZWNpZmllZCBsaW5rIHRleHQKLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqIEBwYXJhbSB0ZXh0Ci0JICogQHBhcmFtIHVybAotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RWxlbWVudExpbmsoTWV0aG9kRWxlbWVudCBlbGVtZW50LCBTdHJpbmcgdGV4dCwKLQkJCVN0cmluZyB1cmwsIFN0cmluZyBsaW5rQ2xhc3MpIHsKLQkJcmV0dXJuICI8YSBjbGFzcz1cIiIgKyBsaW5rQ2xhc3MgKyAiXCIgIiArIGdldFVybFRleHQodXJsKSArICIgZ3VpZD1cIiIgKyBlbGVtZW50LmdldEd1aWQoKSArICJcIiA+IiArIHRleHQgKyAiPC9hPiI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQgLy8kTk9OLU5MUy01JAotCX0KLQotCS8qKgotCSAqIHRoZSBwYXNzZWQgaW4gdXJsIG1pZ2h0IGNvbnRhaW4gdGhlIGhyZWYgYXR0cmlidXRlIHdpdGggaXQsIG9yIGV2ZW4gb3RoZXIKLQkgKiBhdHRyaWJ1dGVzLCBzbyBjaGVjayBpZiB0aGlzIGlzIGEgcHVyZSB1cmwgb3Igbm90LiByZXR1cm4gdGhlIHVybCBocmVmCi0JICogdGVybSBzdHJpbmcKLQkgKiAKLQkgKiBAcGFyYW0gdXJsCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRVcmxUZXh0KFN0cmluZyB1cmwpIHsKLQkJaWYgKHVybCA9PSBudWxsKSB7Ci0JCQl1cmwgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQl9IGVsc2UgewotCQkJdXJsID0gdXJsLnRyaW0oKTsKLQkJfQotCi0JCS8vIHN0YXJ0cyB3aXRoIGhyZWYsIG9yIGNvbnRhaW5zIGFuIGhyZWYgdGVybSBpbiBpdAotCQlpZiAodXJsLnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aCgiaHJlZiIpIHx8IHVybC50b0xvd2VyQ2FzZSgpLmluZGV4T2YoIiBocmVmIikgPiAwKSAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJewotCQkJcmV0dXJuIHVybDsKLQkJfQotCi0JCXJldHVybiAiaHJlZj1cIiIgKyB1cmwgKyAiXCIiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiB2YWxpZGF0ZSB0aGUgY29udGVudCBieSBjaGVja2luZyBlbGVtZW50IGxpbmtzIGFuZCBpbWFnZXMKLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqIEBwYXJhbSBzb3VyY2UKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHZhbGlkYXRlQ29udGVudChNZXRob2RFbGVtZW50IGVsZW1lbnQsIFN0cmluZyBzb3VyY2UpIHsKLQkJcmV0dXJuIHZhbGlkYXRlQ29udGVudChlbGVtZW50LCBzb3VyY2UsIG5ldyBEZWZhdWx0Q29udGVudFZhbGlkYXRvcigpLAotCQkJCW51bGwsIG51bGwpOwotCX0KLQotCS8qKgotCSAqIGNoZWNrIGlmIHRoZSBsaW5rIHR5cGUgaXMgZWxlbWVudCBsaW5rIG9yIG5vdAotCSAqIEBwYXJhbSBsaW5rVHlwZSBTdHJpbmcKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNFbGVtZW50TGluayhTdHJpbmcgbGlua1R5cGUpIHsKLQkJaWYgKGxpbmtUeXBlID09IG51bGwgfHwgbGlua1R5cGUubGVuZ3RoKCkgPT0gMCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJLy8gUlRFIG1heSBjaGFuZ2UgdGhlIGNhc2Ugb2YgYXR0cmlidXRlcy4KLQkJcmV0dXJuIGxpbmtUeXBlLmVxdWFsc0lnbm9yZUNhc2UoRUxFTUVOVF9MSU5LX0NMQVNTX2VsZW1lbnRMaW5rKQotCQkJCXx8IGxpbmtUeXBlLmVxdWFsc0lnbm9yZUNhc2UoRUxFTUVOVF9MSU5LX0NMQVNTX2VsZW1lbnRMaW5rV2l0aFR5cGUpCi0JCQkJfHwgbGlua1R5cGUuZXF1YWxzSWdub3JlQ2FzZShFTEVNRU5UX0xJTktfQ0xBU1NfZWxlbWVudExpbmtXaXRoVXNlclRleHQpOwotCX0KLQotCS8qKgotCSAqIHZhbGlkYXRlIHRoZSBjb250ZW50IGJ5IGNoZWNraW5nIGVsZW1lbnQgbGlua3MgYW5kIGltYWdlcywgZm9yIHRoZQotCSAqIHNwZWNpZmllZCBlbGVtZW50IG93bmVyCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiAgICAgICAgICAgIE1ldGhvZEVsZW1lbnQsIHRoZSBlbGVtZW50IHRoYXQgb3ducyB0aGUgY29udGVudAotCSAqIEBwYXJhbSBjb250ZW50Ci0JICogQHBhcmFtIGNvbmZpZwotCSAqICAgICAgICAgICAgTWV0aG9kQ29uZmlndXJhdGlvbiB0aGUgY29uZmlndXJhdGlvbiB0byB3aGljaCB0aGUgY29udGVudCBpcwotCSAqICAgICAgICAgICAgdmFsaWRhdGVkCi0JICogQHBhcmFtIGxpbmtlZEVsZW1lbnRzCi0JICogICAgICAgICAgICBMaXN0IGEgcGFzc2VkIGluIGxpc3QgdG8gY29sbGVjdCB0aGUgbGlua2VkIGVsZW1lbnRzIGluIHRoaXMKLQkgKiAgICAgICAgICAgIGNvbnRlbnQsIGlmIG51bGwsIG5vIGxpbmtlZCBlbGVtZW50cyBhcmUgY29sbGVjdGVkLgotCSAqIEByZXR1cm4gU3RyaW5nIHRoZSB2YWxpZGF0ZWQgY29udGVudAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHZhbGlkYXRlQ29udGVudChNZXRob2RFbGVtZW50IGVsZW1lbnQsIFN0cmluZyBzb3VyY2UsCi0JCQlJQ29udGVudFZhbGlkYXRvciB2YWxpZGF0b3IsIE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnLCBTdHJpbmcgbGF5b3V0WHNsUm9vdFBhdGgpIHsKLQkJCQotCQl0cnkgewotCQkJUmVzb3VyY2VIZWxwZXIuTEFZT1VUX1hTTF9ST09UX1BBVEggPSBsYXlvdXRYc2xSb290UGF0aDsKLQkJCXNob3dTa2luUmVzb3VyY2UgPSB0cnVlOwotCQkJLy8gZmlyc3QgdmFsaWRhdGUgdGhlIHRhZ3MsIHJlbW92ZSBhbnkgQ0YvTEYgZnJvbSB0aGUgdGFnIHRleHQKLQkJCXNvdXJjZSA9IHZhbGlkYXRlVGFnKHNvdXJjZSk7Ci0KLQkJCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCU1hdGNoZXIgbSA9IHBfbGlua19yZWYubWF0Y2hlcihzb3VyY2UpOwotCi0JCQl3aGlsZSAobS5maW5kKCkpIHsKLQkJCQlTdHJpbmcgdGV4dCA9IG0uZ3JvdXAoKTsKLQotCQkJCS8vIFByb2JsZW1zIHBhcnNpbmcgPGEgaHJlZj4gdGFncwotCQkJCS8vIG5lZWQgdG8gcmVtb3ZlIGFsbCBMRiwgQ1Igd2l0aGluIHRoZSA8YSAuLj4gdGFnCi0JCQkJU3RyaW5nIHVybHRleHQgPSBtLmdyb3VwKDEpOwotCQkJCVN0cmluZyBsaW5rZWRUZXh0ID0gbS5ncm91cCgyKTsKLQkJCQlMaW5rSW5mbyBpbmZvID0gdmFsaWRhdG9yLnZhbGlkYXRlTGluayhlbGVtZW50LCB1cmx0ZXh0LAotCQkJCQkJbGlua2VkVGV4dCwgY29uZmlnLCAiYSIpOyAvLyROT04tTkxTLTEkCi0JCQkJaWYgKGluZm8gIT0gbnVsbCkgewotCQkJCQl0ZXh0ID0gaW5mby5nZXRIdG1sKHZhbGlkYXRvci5zaG93QnJva2VuTGlua3MoKSkudG9TdHJpbmcoKTsKLQkJCQkJTWV0aG9kRWxlbWVudCBlID0gaW5mby5nZXRMaW5rZWRFbGVtZW50KCk7Ci0JCQkJCWlmIChlICE9IG51bGwpIHsKLQkJCQkJCXZhbGlkYXRvci5hZGRSZWZlcmVuY2VkRWxlbWVudChlbGVtZW50LCBlKTsKLQkJCQkJfQotCQkJCX0KLQotCQkJCVN0cmluZyByZXBsYWNlbWVudCA9IHRleHQucmVwbGFjZUFsbCgiZmlsZTovLy8iLCAiIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCXJlcGxhY2VtZW50ID0gcmVwbGFjZW1lbnQucmVwbGFjZUFsbCgiZmlsZTovLyIsICIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCQkJCQotCQkJCW0uYXBwZW5kUmVwbGFjZW1lbnQoc2IsIHJlZ0V4cEVzY2FwZShyZXBsYWNlbWVudCkpOwotCQkJfQotCi0JCQltLmFwcGVuZFRhaWwoc2IpOwotCi0JCQlpZiAoZWxlbWVudCA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JCQl9Ci0KLQkJCS8vIGFsc28gZml4IHRoZSBhcmVhIG1hcAotCQkJc291cmNlID0gc2IudG9TdHJpbmcoKTsKLQkJCW0gPSBwX2FyZWFfcmVmLm1hdGNoZXIoc291cmNlKTsKLQkJCXNiLnNldExlbmd0aCgwKTsKLQkJCXdoaWxlIChtLmZpbmQoKSkgewotCQkJCVN0cmluZyB0ZXh0ID0gbS5ncm91cCgpOwotCi0JCQkJU3RyaW5nIHVybHRleHQgPSBtLmdyb3VwKDEpOwotCQkJCUxpbmtJbmZvIGluZm8gPSB2YWxpZGF0b3IudmFsaWRhdGVMaW5rKGVsZW1lbnQsIHVybHRleHQsCi0JCQkJCQkiIiwgY29uZmlnLCAiYXJlYSIpOyAgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJaWYgKGluZm8gIT0gbnVsbCkgewotCQkJCQkKLQkJCQkJLy8gZG9uJ3Qgc2hvdyBicm9rZW4gbGlua3MgaW4gYXJlYSBtYXAuIFNob3cgcGxhbiB0ZXh0IGluc3RlYWQKLQkJCQkJdGV4dCA9IGluZm8uZ2V0SHRtbChmYWxzZS8qdmFsaWRhdG9yLnNob3dCcm9rZW5MaW5rcygpKi8pLnRvU3RyaW5nKCk7Ci0JCQkJCU1ldGhvZEVsZW1lbnQgZSA9IGluZm8uZ2V0TGlua2VkRWxlbWVudCgpOwotCQkJCQlpZiAoZSAhPSBudWxsKSB7Ci0JCQkJCQl2YWxpZGF0b3IuYWRkUmVmZXJlbmNlZEVsZW1lbnQoZWxlbWVudCwgZSk7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQlTdHJpbmcgcmVwbGFjZW1lbnQgPSB0ZXh0LnJlcGxhY2VBbGwoImZpbGU6Ly8vIiwgIiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQlyZXBsYWNlbWVudCA9IHJlcGxhY2VtZW50LnJlcGxhY2VBbGwoImZpbGU6Ly8iLCAiIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAkJCQkKLQkJCQltLmFwcGVuZFJlcGxhY2VtZW50KHNiLCByZWdFeHBFc2NhcGUocmVwbGFjZW1lbnQpKTsKLQkJCX0KLQotCQkJbS5hcHBlbmRUYWlsKHNiKTsKLQotCQkJLy8gU2hhcGUgaWNvbiBicm9rZW4gaW4gcHJldmlldyBhbmQgYnJvd3NpbmcKLQkJCS8vIC8vIG5lZWQgdG8gZGVjb2RlIHRoZSBpbWFnZSBwYXRoIHVubGVzcyB3ZSBjYW4gZGlzYWJsZSB0aGUgdXJsCi0JCQkvLyBlbmNvZGluZyBpbiB4c2x0Ci0JCQkvLyBzb3VyY2UgPSBzYi50b1N0cmluZygpOwotCQkJLy8gc2Iuc2V0TGVuZ3RoKDApOwotCQkJLy8gbSA9IFJlc291cmNlSGVscGVyLnBfaW1hZ2VfcmVmLm1hdGNoZXIoc291cmNlKTsKLQkJCS8vIHdoaWxlICggbS5maW5kKCkgKQotCQkJLy8gewotCQkJLy8gU3RyaW5nIHVybCA9IG0uZ3JvdXAoMyk7Ci0JCQkvLyB1cmwgPSBVUkxEZWNvZGVyLmRlY29kZSh1cmwsICJVVEYtOCIpOwotCQkJLy8gbS5hcHBlbmRSZXBsYWNlbWVudChzYiwgbS5ncm91cCgxKSArIHVybCArIG0uZ3JvdXAoNCkpOwotCQkJLy8gfQotCQkJLy8gbS5hcHBlbmRUYWlsKHNiKTsKLQkJCS8vIHJldHVybiBzYi50b1N0cmluZygpOwotCi0JCQkvLyBkZWNvZGUgdGhlIHVybHMKLQkJCXJldHVybiBkZWNvZGVVcmxzSW5Db250ZW50KHNiLnRvU3RyaW5nKCkpOwotCi0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJZXgucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQkJZmluYWxseQotCQl7Ci0JCQlSZXNvdXJjZUhlbHBlci5MQVlPVVRfWFNMX1JPT1RfUEFUSCA9IG51bGw7Ci0JCQlzaG93U2tpblJlc291cmNlID0gZmFsc2U7Ci0JCX0KLQotCQlyZXR1cm4gc291cmNlOwotCX0KLQotCS8qKgotCSAqIGRlY29kZSB0aGUgdXJscyBpbiB0aGUgY29udGVudC4gQ29udGVudCBmcm9tIHhzbHQgb3V0cHV0IGFyZSBlbmNvZGVkLiBXZQotCSAqIGRvbid0IHdhbnQgdGhpcyB0byBiZSBlbmNvZGVkIHNpbmNlIHRoZSBicm93c2VyIG1heSBkZWNvZGUgaXQgaW4gYSB3cm9uZwotCSAqIGVuY29kaW5nLgotCSAqIAotCSAqIEBwYXJhbSBjb250ZW50Ci0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkZWNvZGVVcmxzSW5Db250ZW50KFN0cmluZyBjb250ZW50KSB7Ci0JCXRyeSB7Ci0JCQkvLyBTaGFwZSBpY29uIGJyb2tlbiBpbiBwcmV2aWV3IGFuZCBicm93c2luZwotCQkJLy8gbmVlZCB0byBkZWNvZGUgdGhlIGltYWdlIHBhdGggdW5sZXNzIHdlIGNhbiBkaXNhYmxlIHRoZSB1cmwKLQkJCS8vIGVuY29kaW5nIGluIHhzbHQKLQkJCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCU1hdGNoZXIgbSA9IFJlc291cmNlSGVscGVyLnBfdXJsX2RlY29kZXIubWF0Y2hlcihjb250ZW50KTsKLQkJCXdoaWxlIChtLmZpbmQoKSkgewotCQkJCVN0cmluZyB1cmwgPSBtLmdyb3VwKDMpOwotCQkJCXVybCA9IFVSTERlY29kZXIuZGVjb2RlKHVybCwgIlVURi04Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQlTdHJpbmcgdGV4dCA9IG0uZ3JvdXAoMSkgKyB1cmwgKyBtLmdyb3VwKDQpOwotCQkJCW0uYXBwZW5kUmVwbGFjZW1lbnQoc2IsIHJlZ0V4cEVzY2FwZSh0ZXh0KSk7IAkKLQkJCX0KLQkJCW0uYXBwZW5kVGFpbChzYik7Ci0KLQkJCXJldHVybiBzYi50b1N0cmluZygpOwotCi0JCX0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCi0JCXJldHVybiBjb250ZW50OwotCX0KLQotCS8qKgotCSAqIGVzY2FwZSB0aGUgcmVnZXhwIHJlc2VydmVkIHdvcmRzLCBzdWNoIGFzICQKLQkgKiBAcGFyYW0gdGV4dCBTdHJpbmcKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlZ0V4cEVzY2FwZShTdHJpbmcgdGV4dCkgewotCQkvLyBlc2NhcGUgdGhlIHJlZ0V4cCByZXNlcnZlZCB3b3JkcywKLQkJLy8gdGhlICQgc2lnbiBpcyByZXNlcnZlZCBmb3IgZ3JvdXAgbWF0Y2hpbmcgCi0JCVN0cmluZyBuZXd0ZXh0ID0gU3RyVXRpbC5lc2NhcGVDaGFyKHRleHQsICckJyk7Ci0JCW5ld3RleHQgPSBTdHJVdGlsLmVzY2FwZUNoYXIodGV4dCwgJ1xcJyk7Ci0JCXJldHVybiBuZXd0ZXh0OwotCX0KLQkKLQkvKioKLQkgKiBmaXggdGhlIGVsZW1lbnQgdXJsIGluIHRoZSB1cmx0ZXh0LiB0aGUgdGV4dCBpcyB0aGUgcGFydCBmcm9tIHRoZQotCSAqIHBfbGlua19yZWYgcGF0dGVybiBtYXRjaAotCSAqIAotCSAqIEBwYXJhbSB1cmx0ZXh0Ci0JICogQHBhcmFtIGNvbmZpZwotCSAqICAgICAgICAgICAgTWV0aG9kQ29uZmlndXJhdGlvbiB0aGUgY29uZmlndXJhdGlvbiB0byB3aGljaCB0aGUgY29udGVudCBpcwotCSAqICAgICAgICAgICAgdmFsaWRhdGVkCi0JICogQHJldHVybiBTdHJpbmcgdGhlIGZpeGVkIHRleHQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBmaXhFbGVtZW50VXJsKE1ldGhvZEVsZW1lbnQgZWxlbWVudCwgU3RyaW5nIHVybHRleHQsCi0JCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZykgewotCQlNYXRjaGVyIG0gPSBwX2xpbmtfaHJlZl9waWNrZXIubWF0Y2hlcigiICIgKyB1cmx0ZXh0ICsgIiAiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJaWYgKG0uZmluZCgpKSB7Ci0JCQlTdHJpbmcgdXJsID0gbS5ncm91cCgxKTsKLQkJCVN0cmluZyBuZXd1cmwgPSBudWxsOwotCQkJaWYgKGVsZW1lbnQgIT0gbnVsbCkgewotCQkJCVN0cmluZyBndWlkID0gZ2V0R3VpZEZyb21VcmwodXJsdGV4dCk7Ci0JCQkJaWYgKGd1aWQgIT0gbnVsbCkgewotCQkJCQlJTGlicmFyeU1hbmFnZXIgbWFuYWdlciA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLQkJCQkJCQkuZ2V0Q3VycmVudExpYnJhcnlNYW5hZ2VyKCk7Ci0JCQkJCU1ldGhvZEVsZW1lbnQgZSA9IG1hbmFnZXIgIT0gbnVsbCA/IG1hbmFnZXIKLQkJCQkJCQkuZ2V0TWV0aG9kRWxlbWVudChndWlkKSA6IG51bGw7Ci0JCQkJCWlmIChlICE9IG51bGwpIHsKLQkJCQkJCWlmIChjb25maWcgIT0gbnVsbCkgewotCQkJCQkJCWUgPSBDb25maWd1cmF0aW9uSGVscGVyLmdldENhbGN1bGF0ZWRFbGVtZW50KGUsCi0JCQkJCQkJCQljb25maWcpOwotCQkJCQkJfQotCQkJCQkJbmV3dXJsID0gZ2V0VXJsKGUsIGVsZW1lbnQsIEZJTEVfRVhUX0hUTUwsIHVybCk7Ci0JCQkJCX0KLQotCQkJCQkvLyBpZiB0aGUgZWxlbWVudCBpcyBudWxsLCB3ZSBzaG91bGQgcmVtb3ZlIHRoZSB1cmwgbGluayBhbmQKLQkJCQkJLy8gbG9nIGFuIGVycm9yCi0JCQkJCS8vIFRPRE8KLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmIChuZXd1cmwgIT0gbnVsbCAmJiAhbmV3dXJsLmVxdWFscyh1cmwpKSB7Ci0JCQkJU3RyaW5nIHJlcGxhY2VtZW50ID0gIiBocmVmPVwiIiArIG5ld3VybCArICJcIiAiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQltLmFwcGVuZFJlcGxhY2VtZW50KHNiLCByZWdFeHBFc2NhcGUocmVwbGFjZW1lbnQpKTsKLQkJCQltLmFwcGVuZFRhaWwoc2IpOwotCQkJCXJldHVybiBzYi50b1N0cmluZygpOwotCi0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gdXJsdGV4dDsKLQl9Ci0KLQkvKioKLQkgKiBnZXQgdGhlIGVsZW1lbnQgbGluayB0eXBlIGZvciB0aGUgdXJsCi0JICogQHBhcmFtIHNvdXJjZSBTdHJpbmcgdGhlIGxpbmsKLQkgKiBAcmV0dXJuIFN0cmluZyB0aGUgdHlwZSBzdHJpbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRFbGVtZW50TGlua1R5cGUoU3RyaW5nIHNvdXJjZSkgewotCQlNYXRjaGVyIG0gPSBwX2xpbmtfdHlwZV9waWNrZXIubWF0Y2hlcigiICIgKyBzb3VyY2UgKyAiICIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJaWYgKG0uZmluZCgpKSB7Ci0JCQlyZXR1cm4gbS5ncm91cCgxKS50cmltKCkucmVwbGFjZUFsbCgiXCIiLCAiIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogZ2V0IHRoZSBndWlkIGZyb20gdGhlIHVybAotCSAqIEBwYXJhbSBzb3VyY2UgU3RyaW5nIHRoZSB1cmwKLQkgKiBAcmV0dXJuIFN0cmlnbiB0aGUgZ3VpZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEd1aWRGcm9tVXJsKFN0cmluZyBzb3VyY2UpIHsKLQkJTWF0Y2hlciBtID0gcF9saW5rX2d1aWRfcGlja2VyLm1hdGNoZXIoIiAiICsgc291cmNlICsgIiAiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWlmIChtLmZpbmQoKSkgewotCQkJcmV0dXJuIG0uZ3JvdXAoMSkudHJpbSgpLnJlcGxhY2VBbGwoIlwiIiwgIiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCi0JCW0gPSBwX2xpbmtfaHJlZl9waWNrZXIubWF0Y2hlcigiICIgKyBzb3VyY2UgKyAiICIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJaWYgKG0uZmluZCgpKSB7Ci0JCQlTdHJpbmcgaHJlZiA9IG0uZ3JvdXAoMSkudHJpbSgpLnJlcGxhY2VBbGwoIlwiIiwgIiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCXJldHVybiBnZXRHdWlkRnJvbUZpbGVOYW1lKGhyZWYpOwotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogaGFuZGxlIGEgYnVnIGluIElFLiBhbmNob3IgdGFnIGNhbid0IGhhdmUgQ1IgTEYsIGxpa2UgPEEgXHJcbgotCSAqIGhyZWY9Ind3dy55YWhvby5jb20iIFxyXG4+IHNjYW4gdGhlIHN0cmluZyBzb3VyY2UsIGZpbmQgYWxsIGFuY2hvciB0YWdzCi0JICogYW5kIHJlcGxhY2Ugd2l0aCBzcGFjZS4KLQkgKiAKLQkgKiBAcGFyYW0gc291cmNlCi0JICogQHJldHVybiBTdHJpbmcgdGhlIGZpeGVkIHNvdXJjZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHZhbGlkYXRlVGFnKFN0cmluZyBzb3VyY2UpIHsKLQkJLy8gUGF0dGVybiBwX2FuY2hvcl9yZWYgPSBQYXR0ZXJuLmNvbXBpbGUoIigqKz8pPSgqLj8pIiwKLQkJLy8gUGF0dGVybi5DQVNFX0lOU0VOU0lUSVZFIHwgUGF0dGVybi5ET1RBTEwpOwotCi0JCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJTWF0Y2hlciBtID0gcF90YWdfcmVmLm1hdGNoZXIoc291cmNlKTsKLQkJLy8gU3RyaW5nQnVmZmVyIHRlbXBTYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQotCQl3aGlsZSAobS5maW5kKCkpIHsKLQkJCVN0cmluZyB0ZXh0ID0gbS5ncm91cCgpOwotCQkJU3RyaW5nIHJlcGxhY2VtZW50ID0gZml4VGFnQXR0cmlidXRlKHRleHQpOwotCQkJbS5hcHBlbmRSZXBsYWNlbWVudChzYiwgcmVnRXhwRXNjYXBlKHJlcGxhY2VtZW50KSk7Ci0JCX0KLQotCQltLmFwcGVuZFRhaWwoc2IpOwotCi0JCXJldHVybiBzYi50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIGZpeCB0YWcgYXR0cmlidXRlCi0JICogQHBhcmFtIHNvdXJjZQotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZml4VGFnQXR0cmlidXRlKFN0cmluZyBzb3VyY2UpIHsKLQkJLy8gc2ltcGx5IHJlcGxhY2UgYWxsIENSIExGIHdpdGggJyAnLCBmaW5lIHR1bmUgbGF0ZXIKLQkJcmV0dXJuIHNvdXJjZQotCQkJCS5yZXBsYWNlQWxsKCJcXFxyXFxcbiIsICIgIikucmVwbGFjZUFsbCgiXFxcciIsICIgIikucmVwbGFjZUFsbCgiXFxcbiIsICIgIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQgLy8kTk9OLU5MUy01JCAvLyROT04tTkxTLTYkCi0JfQotCi0vLwkvKioKLS8vCSAqIGdldCB0aGUgcmVzb3VyY2UgZmlsZSB1cmwgcmVsYXRpdmUgdG8gdGhlIGxpYnJhcnkgcm9vdAotLy8JICogCi0vLwkgKiBAcGFyYW0gZQotLy8JICogICAgICAgICAgICBNZXRob2RFbGVtZW50IHRoZSBlbGVtZW50IHRoYXQgcmVmZXJlbmNlcyB0aGlzIHJlc291cmNlCi0vLwkgKiBAcGFyYW0gZmlsZQotLy8JICogICAgICAgICAgICBGaWxlIHRoZSByZXNvdXJjZSdzIHBoeXNpY2FsIHBhdGgKLS8vCSAqIEByZXR1cm4gU3RyaW5nIHRoZSB1cmwgdG8gdGhpcyByZXNvdXJjZSBmcm9tIHRoZSBlbGVtZW50Ci0vLwkgKiBAZGVwbGljYXRlZCB0aGlzIG1ldGhvZCBpcyBub3QgdmFsaWQgZm9yIGRpc3RyaWJ1dGVkIGxpYnJhcnkKLS8vCSAqLwotLy8JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldFJlc291cmNlRmlsZVVybChNZXRob2RFbGVtZW50IGUsIEZpbGUgZmlsZSkgewotLy8JCVN0cmluZyBmaWxlVXJsID0gZ2V0RmlsZVVybChmaWxlKTsKLS8vCQkvLyBTdHJpbmcgZWxlbWVudFBhdGggPQotLy8JCS8vIFJlc291cmNlSGVscGVyLmdldEVsZW1lbnRSZXNvdXJjZVBhdGgoZSkucmVwbGFjZShGaWxlLnNlcGFyYXRvckNoYXIsCi0vLwkJLy8gJy8nKTsKLS8vCi0vLwkJZmlsZVVybCA9IFJlc291cmNlSGVscGVyLmdldEJhY2tQYXRoKGUpICsgZmlsZVVybDsKLS8vCi0vLwkJcmV0dXJuIGZpbGVVcmw7Ci0vLwotLy8JfQotLy8KLS8vCS8qKgotLy8JICogcmV0dXJuIHRoZSBmaWxlJ3MgcmVsYXRpdmUgcGF0aCB0byB0aGUgcGx1Z2luIHJvb3QKLS8vCSAqIAotLy8JICogQHBhcmFtIGYKLS8vCSAqIEByZXR1cm4gU3RyaW5nCi0vLwkgKiBAZGVwbGljYXRlZCB0aGlzIG1ldGhvZCBpcyBub3QgdmFsaWQgZm9yIGRpc3RyaWJ1dGVkIGxpYnJhcnkKLS8vCSAqLwotLy8JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldEZpbGVVcmwoRmlsZSBmKSB7Ci0vLwkJU3RyaW5nIHBhdGggPSBnZXRGaWxlUmVsUGF0aChmKTsKLS8vCQlwYXRoID0gcGF0aC5yZXBsYWNlKEZpbGUuc2VwYXJhdG9yQ2hhciwgJy8nKTsKLS8vCQlyZXR1cm4gcGF0aDsKLS8vCX0KLQotLy8JLyoqCi0vLwkgKiBnZXQgdGhlIFVSSSByZWxhdGl2ZSB0byB0aGUgc3BlY2lmaWVkIGJhc2UKLS8vCSAqIAotLy8JICogQHBhcmFtIHVyaQotLy8JICogQHJldHVybiBqYXZhLm5ldC5VUkkKLS8vCSAqLwotLy8JcHVibGljIHN0YXRpYyBVUkkgZ2V0UmVsYXRpdmVVUkkoVVJJIHVyaSwgU3RyaW5nIHJvb3RQYXRoKSB7Ci0vLwkJcmV0dXJuIGdldFJlbGF0aXZlVVJJKHVyaSwgbmV3IEZpbGUocm9vdFBhdGgpLnRvVVJJKCkpOwotLy8JfQotCi0JLyoqCi0JICogZ2V0IHRoZSBVUkkgcmVsYXRpdmUgdG8gdGhlIHNwZWNpZmllZCBiYXNlCi0JICogCi0JICogQHBhcmFtIHVyaQotCSAqIEByZXR1cm4gamF2YS5uZXQuVVJJCi0JICogQGRlcGxpY2F0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFVSSSBnZXRSZWxhdGl2ZVVSSShVUkkgdXJpLCBVUkkgcmVsYXRpdmVUbykgewotCQlVUkkgcmVsVXJpID0gcmVsYXRpdmVUby5yZWxhdGl2aXplKHVyaSk7Ci0JCXJldHVybiByZWxVcmk7Ci0JfQotCi0vLwkvKioKLS8vCSAqIHJlc29sdmUgdGhlIHJlbGF0aXZlIHBhdGggdG8gdGhlIGxpYnJhcnkgcm9vdAotLy8JICogCi0vLwkgKiBAcGFyYW0gZgotLy8JICogQHJldHVybiBTdHJpbmcgdGhlIHJhbHRpdmUgcGF0aAotLy8JICogQGRlcGxpY2F0ZWQgdGhpcyBtZXRob2QgaXMgbm90IHZhbGlkIGZvciBkaXN0cmlidXRlZCBsaWJyYXJ5Ci0vLwkgKi8KLS8vCXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRGaWxlUmVsUGF0aChGaWxlIGYpIHsKLS8vCQlGaWxlIGxpYnJhcnlSb290UGF0aCA9IG5ldyBGaWxlKExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLS8vCQkJCS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeUxvY2F0aW9uKCkpOwotLy8JCVN0cmluZyByb290ID0gbGlicmFyeVJvb3RQYXRoLmdldEFic29sdXRlUGF0aCgpOwotLy8JCVN0cmluZyBwYXRoID0gZi5nZXRBYnNvbHV0ZVBhdGgoKTsKLS8vCQlpZiAocGF0aC5zdGFydHNXaXRoKHJvb3QpKSB7Ci0vLwkJCXBhdGggPSBwYXRoLnN1YnN0cmluZyhyb290Lmxlbmd0aCgpKTsKLS8vCQl9Ci0vLwotLy8JCWlmIChwYXRoLnN0YXJ0c1dpdGgoRmlsZS5zZXBhcmF0b3IpKSB7Ci0vLwkJCXBhdGggPSBwYXRoLnN1YnN0cmluZygxKTsKLS8vCQl9Ci0vLwotLy8JCXJldHVybiBwYXRoOwotLy8JfQotCi0vLwkvKioKLS8vCSAqIGdldCB0aGUgVVJJIHJlbGF0aXZlIHRvIHRoZSBsaWJyYXJ5IHJvb3QKLS8vCSAqIAotLy8JICogQHBhcmFtIGYKLS8vCSAqIEByZXR1cm4gamF2YS5uZXQuVVJJCi0vLwkgKiBAZGVwbGljYXRlZCB0aGlzIG1ldGhvZCBpcyBub3QgdmFsaWQgZm9yIGRpc3RyaWJ1dGVkIGxpYnJhcnkKLS8vCSAqLwotLy8JcHJpdmF0ZSBzdGF0aWMgamF2YS5uZXQuVVJJIGdldEZpbGVSZWxhdGl2ZVVSSShGaWxlIGYpIHsKLS8vCQlGaWxlIGxpYnJhcnlSb290UGF0aCA9IG5ldyBGaWxlKExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLS8vCQkJCS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeUxvY2F0aW9uKCkpOwotLy8JCWphdmEubmV0LlVSSSBsaWJVUkkgPSBsaWJyYXJ5Um9vdFBhdGgudG9VUkkoKTsKLS8vCQlqYXZhLm5ldC5VUkkgZmlsZVVSSSA9IGYudG9VUkkoKTsKLS8vCQlqYXZhLm5ldC5VUkkgcmVsVXJpID0gbGliVVJJLnJlbGF0aXZpemUoZmlsZVVSSSk7Ci0vLwotLy8JCXJldHVybiByZWxVcmk7Ci0vLwl9Ci0KLQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiBAcGFyYW0gYXR0YWNobWVudAotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UmVsYXRpdmVQYXRoVG9GaWxlRnJvbUVsZW1lbnQoCi0JCQlNZXRob2RFbGVtZW50IGVsZW1lbnQsIEZpbGUgYXR0YWNobWVudCkgewotCQlTdHJpbmcgZWxlbWVudExvYyA9IGdldEZvbGRlckFic29sdXRlUGF0aChlbGVtZW50KTsJCi0JCXJldHVybiBGaWxlVXRpbC5nZXRSZWxhdGl2ZVBhdGgoYXR0YWNobWVudCwgbmV3IEZpbGUoZWxlbWVudExvYykpOwotCX0KLQotCS8qKgotCSAqIGdldCB0aGUgZmlsZSBwYXRoIG5hbWUgb2YgdGhlIHR5cGUgb2YgZGlhZ3JhbSBmb3IgdGhlIHNwZWNpZmllZCBlbGVtZW50Ci0JICogCi0JICogQHBhcmFtIGUKLQkgKiBAcGFyYW0gZGlhZ3JhbVR5cGUKLQkgKiAgICAgICAgICAgIFN0cmluZyBkaWFncmFtIHR5cGUgZGVmaW5lZCBpbiBvbmUgb2YgdGhlIGRpYWdyYW0gdHlwZQotCSAqICAgICAgICAgICAgY29uc3RhbnRzCi0JICogQHJldHVybiBTdHJpbmcgdGhlIGZpbGUgcGF0aCByZWxhdGl2ZSB0byB0aGUgbGlicmFyeSByb290Ci0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RGlhZ3JhbUZpbGVQYXRoTmFtZShNZXRob2RFbGVtZW50IGUsCi0JCQlTdHJpbmcgZGlhZ3JhbVR5cGUpIHsKLQkJLy8gSW5zdGFuY2VzIG9mIHRoZSBzYW1lIGFjdGl2aXR5L0NQIHNoYXJlIHRoZQotCQkvLyBzYW1lIGRpYWdyYW0gaW4gYSBEZWxpdmVyeSBQcm9jZXNzCi0JCS8vIG5lZWQgdG8gbWFrZSB0aGUgbmFtZSB1bmlxdWUKLS8vCQlyZXR1cm4gZ2V0RWxlbWVudFJlc291cmNlUGF0aChlKQotLy8JCQkJKyBTdHJVdGlsLnJlbW92ZVNwZWNpYWxDaGFyYWN0ZXJzKGUuZ2V0TmFtZSgpKQotLy8JCQkJKyAiXyIgKyBlLmdldEd1aWQoKSArICJfIiArIGRpYWdyYW1UeXBlICsgRklMRV9FWFRfSlBFRzsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQotCQlyZXR1cm4gZ2V0RWxlbWVudFJlc291cmNlUGF0aChlKQotCQkrIEZpbGVOYW1lR2VuZXJhdG9yLklOU1RBTkNFLmdldEZpbGVOYW1lKGUsICIiLCAiXyIgKyBkaWFncmFtVHlwZSwgRklMRV9FWFRfSlBFRyk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFhtbEV4cG9ydGVkRGlhZ3JhbUltYWdlRmlsZU5hbWUoTWV0aG9kRWxlbWVudCBlLCBTdHJpbmcgZGlhZ3JhbVR5cGUsIFN0cmluZyBmb3JtYXQpIHsKLQkJU3RyaW5nIHN0ciA9IGUuZ2V0TmFtZSgpICsgIiAiICsgZS5nZXRHdWlkKCkgKyAiXyIgKyBkaWFncmFtVHlwZSArIGZvcm1hdDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCXJldHVybiBzdHI7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0Fic29sdXRlcGF0aChTdHJpbmcgcGF0aCkgewotCQkKLQkJaWYgKCBwYXRoID09IG51bGwgKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJCi0JCWlmICggCXBhdGguc3RhcnRzV2l0aCgiLyIpICAvLyROT04tTkxTLTEkCi0JCQkJfHwgcGF0aC5zdGFydHNXaXRoKEZpbGUuc2VwYXJhdG9yKSAKLQkJCQl8fCBwYXRoLmluZGV4T2YoIjoiKSA+IDAgKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCS8qKgotCSAqIGdldCB0aGUgcmVsYXRpdmUgcGF0aCBvZiB0aGUgZmlsZSBiYXNlZCBvbiB0aGUgdXJsCi0JICogCi0JICogQHBhcmFtIHVybAotCSAqICAgICAgICAgICAgU3RyaW5nIHRoZSB1cmwKLQkgKiBAcGFyYW0gY29udGVudFBhdGgKLQkgKiAgICAgICAgICAgIFN0cmluZyB0aGUgcGF0aCBvZiB0aGUgY29udGVudCB0aGF0IGNvbnRhaW5zIHRoaXMgdXJsCi0JICogQHJldHVybiBTdHJpbmcgdGhlIGZpbGUgcGF0aCByZWxhdGl2ZSB0byB0aGUgY29udGVudCBwdWJsaXNoaW5nIHJvb3QKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRGaWxlUGF0aEZyb21VcmwoU3RyaW5nIHVybCwgU3RyaW5nIGNvbnRlbnRQYXRoKSB7Ci0KLQkJU3RyaW5nIGZpbGVQYXRoID0gdXJsOwotCQlpZiAoaXNFeHRlcm5hbExpbmsoZmlsZVBhdGgpCi0JCQkJfHwgZmlsZVBhdGguc3RhcnRzV2l0aCgibWFpbHRvOiIpIHx8IGZpbGVQYXRoLnN0YXJ0c1dpdGgoVVJMX0JPT0tNQVJLX0lORElDQVRPUikpIC8vJE5PTi1OTFMtMSQgCi0JCXsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJaW50IGluZGV4ID0gZmlsZVBhdGguaW5kZXhPZihOZXRVdGlsLkZJTEVfUFJFRklYXzMpOwotCQlpZiAoaW5kZXggPT0gMCkgewotCQkJZmlsZVBhdGggPSBmaWxlUGF0aC5zdWJzdHJpbmcoTmV0VXRpbC5GSUxFX1BSRUZJWF8zLmxlbmd0aCgpKTsKLQkJfQotCi0JCWluZGV4ID0gZmlsZVBhdGguaW5kZXhPZihOZXRVdGlsLkZJTEVfUFJFRklYXzIpOwotCQlpZiAoaW5kZXggPT0gMCkgewotCQkJZmlsZVBhdGggPSBmaWxlUGF0aC5zdWJzdHJpbmcoTmV0VXRpbC5GSUxFX1BSRUZJWF8yLmxlbmd0aCgpKTsKLQkJfQotCQkKLQkJaWYgKCBpc0Fic29sdXRlcGF0aChmaWxlUGF0aCkgKSB7Ci0JCQkvLyBhc3N1bWUgdGhpcyBpcyBhbiBhYnNvbHV0ZSBwYXRoCi0JCQlyZXR1cm4gWE1MVXRpbC51bmVzY2FwZShOZXRVdGlsLmRlY29kZWRGaWxlVXJsKGZpbGVQYXRoKSk7Ci0vLwkJCXJldHVybiB1cmw7Ci0JCX0KLQotCQlGaWxlIGYgPSBuZXcgRmlsZShjb250ZW50UGF0aCk7Ci0JCQotCQlpbnQgc3RhcnQgPSAwOwotCQlpbmRleCA9IDA7Ci0JCXdoaWxlICgoZiAhPSBudWxsKSAmJiAoaW5kZXggPSBmaWxlUGF0aC5pbmRleE9mKCIuLi8iLCBzdGFydCkpID49IDApIC8vJE5PTi1OTFMtMSQKLQkJewotCQkJZiA9IGYuZ2V0UGFyZW50RmlsZSgpOwotCQkJc3RhcnQgPSBpbmRleCArIDM7Ci0JCX0KLQkJCi0JCVN0cmluZyByb290Rm9sZGVyID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKGYgIT0gbnVsbCkgewotCQkJcm9vdEZvbGRlciA9IGYuZ2V0UGF0aCgpOwotCQl9Ci0KLQkJaWYgKHJvb3RGb2xkZXIubGVuZ3RoKCkgPiAwICYmICFyb290Rm9sZGVyLmVuZHNXaXRoKEZpbGUuc2VwYXJhdG9yKSkgewotCQkJcm9vdEZvbGRlciArPSBGaWxlLnNlcGFyYXRvcjsKLQkJfQotCi0JCS8vIHRoZSBmaWxlIHBhdGggaXMKLQkJU3RyaW5nIHBhdGggPSByb290Rm9sZGVyCi0JCQkJKyBmaWxlUGF0aC5zdWJzdHJpbmcoc3RhcnQpLnJlcGxhY2UoJy8nLCBGaWxlLnNlcGFyYXRvckNoYXIpOwotCi0JCXJldHVybiBYTUxVdGlsLnVuZXNjYXBlKE5ldFV0aWwuZGVjb2RlZEZpbGVVcmwocGF0aCkpOwotCX0KLQotCS8qKgotCSAqIGZvciB0aGUgZ2l2ZW4gY29udGVudCB3aXRoIHVybCBiYXNlZCBvbiB0aGUgb2xkQ29udGVudFBhdGgsIHJlc29sdmUgdG8KLQkgKiB0aGUgcGF0aCByZWxhdGl2ZSB0byB0aGUgcm9vdCBvZiB0aGUgY29udGVudFBhdGguIElmIGJhY2twYXRoIGlzCi0JICogc3BlY2lmaWVkLCBhZGQgdGhlIGJhY2tQYXRoLiByZXR1cm4gdGhlIHVwZGF0ZWQgY29udGVudC4gQSB0eXBpY2FsCi0JICogc2NlbmFyaW8gaXMgdGhlIGNvbnRlbnQgaXMgZnJvbSBhIGNvbnRyaWJ1dGluZyBlbGVtZW50LCB3aGljaCBoYXMgdXJscwotCSAqIHJlbGF0aXZlIHRvIHRoZSBjb250cmlidXRpbmcgZWxlbWVudCdzIGNvbnRlbnRQYXRoLiBUaGlzIG1ldGhvZCB3aWxsIGZpeAotCSAqIHRoZSB1cmwgdG8gYmFzZWQgb24gdGhlIGJhc2UgZWxlbWVudCdzIGNvbnRlbnRQYXRoLgotCSAqIAotCSAqIFNvIGNhbGwgZml4Q29udGVudFVybFBhdGgoY29udHJpYnV0b3JfdGV4dCwgY29udHJpYnV0b3JfZWxlbWVudFBhdGgsCi0JICogYmFzZUVsZW1lbnRfYmFja1BhdGgpCi0JICogCi0JICogQHBhcmFtIGNvbnRlbnQKLQkgKiBAcGFyYW0gY29udGVudFBhdGgKLQkgKiBAcGFyYW0gb2xkQ29udGVudFBhdGgKLQkgKiBAcmV0dXJuIFN0cmluZyB0aGUgdXBkYXRlZCBjb250ZW50IHdpdGggZml4ZWQgcGF0aC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBmaXhDb250ZW50VXJsUGF0aChTdHJpbmcgY29udGVudCwgU3RyaW5nIGNvbnRlbnRQYXRoLAotCQkJU3RyaW5nIGJhY2tQYXRoKSB7Ci0JCQotCQlpZiAoIGNvbnRlbnRQYXRoID09IG51bGwgfHwgYmFja1BhdGggPT0gbnVsbCApIHsKLQkJCXJldHVybiBjb250ZW50OwotCQl9Ci0JCQotCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCXRyeSB7Ci0JCQkvLyBwcm9jZXNzIGltYWdlcwotCQkJTWF0Y2hlciBtID0gUmVzb3VyY2VIZWxwZXIucF9pbWFnZV9yZWYubWF0Y2hlcihjb250ZW50KTsKLQkJCXdoaWxlIChtLmZpbmQoKSkgewotCQkJCVN0cmluZyB1cmwgPSBtLmdyb3VwKDMpOwotCQkJCXVybCA9IHJlc29sdmVVcmwodXJsLCBjb250ZW50UGF0aCwgYmFja1BhdGgpOwotCQkJCWlmICh1cmwgIT0gbnVsbCkgewotCQkJCQltLmFwcGVuZFJlcGxhY2VtZW50KHNiLCByZWdFeHBFc2NhcGUobS5ncm91cCgxKSArIHVybCArIG0uZ3JvdXAoNCkpKTsKLQkJCQl9Ci0JCQl9Ci0JCQltLmFwcGVuZFRhaWwoc2IpOwotCi0JCQljb250ZW50ID0gc2IudG9TdHJpbmcoKTsKLQkJCXNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJCi0JCQkvLyBwcm9jZXNzIGF0dGFjaG1lbnRzCi0JCQltID0gUmVzb3VyY2VIZWxwZXIucF9saW5rX3JlZl9nZW4ubWF0Y2hlcihjb250ZW50KTsKLQkJCXdoaWxlIChtLmZpbmQoKSkgewotCQkJCVN0cmluZ0J1ZmZlciBzYkxpbmsgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQkJLy8gU3RyaW5nIHRhZyA9IG0uZ3JvdXAoMSk7Ci0JCQkJU3RyaW5nIHVybHRleHQgPSAiICIgKyBtLmdyb3VwKDIpICsgIiAiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkKLQkJCQlpZiAoUmVzb3VyY2VIZWxwZXIuZ2V0R3VpZEZyb21VcmwodXJsdGV4dCkgPT0gbnVsbCkgewotCQkJCQlNYXRjaGVyIG0yID0gUmVzb3VyY2VIZWxwZXIucF9saW5rX2hyZWZfcGlja2VyCi0JCQkJCQkJLm1hdGNoZXIodXJsdGV4dCk7Ci0JCQkJCWlmIChtMi5maW5kKCkpIHsKLQkJCQkJCVN0cmluZyB1cmwgPSBtMi5ncm91cCgxKS50cmltKCkucmVwbGFjZUFsbCgiXCIiLCAiIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JCQkJCQlpZiAoIGlzRXh0ZXJuYWxMaW5rKHVybCkgKSB7Ci0JCQkJCQkJLy8gZGVjb2RlIGZvciBleHRlcm5hbCBsaW5rIAotCQkJCQkJCXVybCA9IFhNTFV0aWwudW5lc2NhcGUoTmV0VXRpbC5kZWNvZGVkRmlsZVVybCh1cmwpKTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJdXJsID0gcmVzb2x2ZVVybCh1cmwsIGNvbnRlbnRQYXRoLCBiYWNrUGF0aCk7Ci0JCQkJCQl9Ci0JCQkJCQlpZiAodXJsICE9IG51bGwpIHsKLQkJCQkJCQlTdHJpbmcgcmVwbGFjZW1lbnQgPSB1cmx0ZXh0LnN1YnN0cmluZyhtMi5zdGFydCgpLCBtMi5zdGFydCgxKSkKLQkJCQkJCQkJCSsgdXJsCi0JCQkJCQkJCQkrIHVybHRleHQuc3Vic3RyaW5nKG0yLmVuZCgxKSwgbTIuZW5kKCkpOwotCQkJCQkJCQotCQkJCQkJCW0yLmFwcGVuZFJlcGxhY2VtZW50KHNiTGluaywgcmVnRXhwRXNjYXBlKHJlcGxhY2VtZW50KSk7Ci0JCQkJCQkJbTIuYXBwZW5kVGFpbChzYkxpbmspOwotCQkJCQkJCQotCQkJCQkJCXJlcGxhY2VtZW50ID0gY29udGVudC5zdWJzdHJpbmcobS5zdGFydCgpLCBtLnN0YXJ0KDIpKQotCQkJCQkJCQkJKyBzYkxpbmsudG9TdHJpbmcoKSArIGNvbnRlbnQuc3Vic3RyaW5nKG0uZW5kKDIpLCBtLmVuZCgpKTsKLQkJCQkJCQltLmFwcGVuZFJlcGxhY2VtZW50KHNiLCByZWdFeHBFc2NhcGUocmVwbGFjZW1lbnQpKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQotCQkJfQotCQkJbS5hcHBlbmRUYWlsKHNiKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQlleC5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gdXJsCi0JICogQHBhcmFtIGNvbnRlbnRQYXRoCi0JICogQHBhcmFtIGJhY2tQYXRoCi0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZXNvbHZlVXJsKFN0cmluZyB1cmwsIFN0cmluZyBjb250ZW50UGF0aCwKLQkJCVN0cmluZyBiYWNrUGF0aCkgewotCQlTdHJpbmcgbmV3X3VybCA9IGdldEZpbGVQYXRoRnJvbVVybCh1cmwsIGNvbnRlbnRQYXRoKTsKLQkJaWYgKGlzQWJzb2x1dGVwYXRoKG5ld191cmwpKQotCQkJcmV0dXJuIG5ld191cmw7Ci0JCWlmIChuZXdfdXJsICE9IG51bGwgJiYgIW5ld191cmwuZXF1YWxzKHVybCkgKSB7Ci0JCQlpZiAoYmFja1BhdGggIT0gbnVsbCkgewotCQkJCW5ld191cmwgPSBiYWNrUGF0aCArIG5ld191cmw7Ci0JCQl9Ci0KLQkJCXJldHVybiBuZXdfdXJsLnJlcGxhY2UoRmlsZS5zZXBhcmF0b3JDaGFyLCAnLycpOwotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVEVSTkFMX1VSTF9TVEFSVF9XSVRIID0gTGF5b3V0UmVzb3VyY2VzCi0JCQkuZ2V0U3RyaW5nKCJleHRlcm5hbFVybF9zdGFydFdpdGgiKTsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBQYXR0ZXJuIHBfZXh0ZXJuYWxfdXJsX3N0YXJ0V2l0aCA9IFBhdHRlcm4KLQkJCS5jb21waWxlKAotCQkJCQkiKCIgKyBFWFRFUk5BTF9VUkxfU1RBUlRfV0lUSCArICIpIiwgUGF0dGVybi5DQVNFX0lOU0VOU0lUSVZFIHwgUGF0dGVybi5ET1RBTEwpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCS8qKgotCSAqIGNoZWNrIGlmIHRoaXMgaXMgYW4gZXh0ZXJuYWwgdXJsIG9yIG5vdAotCSAqIEBwYXJhbSB1cmwKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNFeHRlcm5hbExpbmsoU3RyaW5nIHVybCkgewotCQkvLyAxNjI5NjkgLSBSZWZpbmUgZXh0ZXJuYWwgbGluaydzIHJlZ3VsYXIgZXhwIGluIGVwZi5saWJyYXJ5L2xheW91dC9MYXlvdXRSZXNvdXJjZXMucHJvcGVydGllcwotCQkvLyBmaWxlOi8vIHNob3VsZCBiZSBleGNsdWRlZAotCQlpZiAoIHVybCA9PSBudWxsICkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCQotCQl1cmwgPSB1cmwudG9Mb3dlckNhc2UoKTsKLQkJaWYgKCB1cmwuc3RhcnRzV2l0aCgiZmlsZTovLyIpICkgeyAgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCQotCQlpZiAoIHVybC5zdGFydHNXaXRoKCJodHRwOi8vIikgCS8vJE5PTi1OTFMtMSQKLQkJCQl8fCB1cmwuc3RhcnRzV2l0aCgiaHR0cHM6Ly8iKSAvLyROT04tTkxTLTEkCi0JCQkJfHwgdXJsLnN0YXJ0c1dpdGgoImZ0cDovLyIpICAvLyROT04tTkxTLTEkCi0JCQkJfHwgdXJsLnN0YXJ0c1dpdGgoInd3dy4iKSApIHsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJCi0JCU1hdGNoZXIgbSA9IHBfZXh0ZXJuYWxfdXJsX3N0YXJ0V2l0aC5tYXRjaGVyKHVybCk7Ci0JCWlmIChtLmZpbmQoKSkgewotCQkJcmV0dXJuIChtLnN0YXJ0KDEpID09IDApOwotCQl9Ci0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSB1cmwKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNKYXZhc2NyaXB0VXJsKFN0cmluZyB1cmwpIHsKLQkJaWYgKHVybCA9PSBudWxsICkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiB1cmwuc3RhcnRzV2l0aChVUkxfU1RSX01BSUxUTykKLQkJCQl8fCB1cmwudG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKFVSTF9TVFJfSkFWQVNDUklQVCk7Ci0JfQotCQotCS8qKgotCSAqIGZpbmQgdGhlIHJlc291cmNlIGZpbGUgYmFzZWQgb24gdGhlIHVybCwgY29weSB0aGUgZmlsZSB0byB0aGUgZGVzdGluYXRpb24KLQkgKiBmb2xkZXIuIGlmIHRoZSBmaWxlIGlzIGFuIGh0bWwgYXR0YWNobWVudCwgc2NhbiB0aGUgZmlsZSByZWN1cnNpdmVseSBhbmQKLQkgKiBjb3B5IGNvbnRhaW5lZCBpbWFnZXMsIHJlc291cmNlcy4KLQkgKiAKLQkgKiBAcGFyYW0gb3duZXIKLQkgKiAgICAgICAgICAgIE1ldGhvZEVsZW1lbnQsIHRoZSBvd25lciBlbGVtZW50Ci0JICogQHBhcmFtIHJlc291cmNlRmlsZQotCSAqICAgICAgICAgICAgRmlsZSwgdGhlIHJlc291cmNlIGZpbGUKLQkgKiBAcGFyYW0gdXJsCi0JICogICAgICAgICAgICBTdHJpbmcgdGhlIHVybCB0byBiZSBwcm9jZXNzZWQKLQkgKiBAcGFyYW0gY29udGVudFBhdGgKLQkgKiAgICAgICAgICAgIFN0cmluZyB0aGUgY29udGVudCBwYXRoIG9mIHRoZSB1cmwgb3duZXIsIHJlbGF0aXZlIHRvIHRoZQotCSAqICAgICAgICAgICAgc291cmNlIHJvb3QgcGF0aAotCSAqIEBwYXJhbSBzb3VyY2VSb290UGF0aAotCSAqICAgICAgICAgICAgRmlsZSB0aGUgc291cmNlIHJvb3QgcGF0aCwgdXN1YWxseSBpdCdzIHRoZSBsaWJyYXJ5IHJvb3QgcGF0aAotCSAqIEBwYXJhbSB0YXJnZXRSb290UGF0aAotCSAqICAgICAgICAgICAgRmlsZSB0aGUgdGFyZ2V0IHJvb3QgcGF0aCwgdXN1YWxseSBpdCdzIHRoZSBwdWJsaXNoaW5nIHJvb3QKLQkgKiAgICAgICAgICAgIHBhdGgKLQkgKiBAcGFyYW0gcm9vdENvbnRlbnRQYXRoIFN0cmluZyB0aGUgY29udGVudCBwYXRoIG9mIHRoZSByb290Ci0JICogQHBhcmFtIHByb2Nlc3NlZEl0ZW1zCi0JICogICAgICAgICAgICBMaXN0LCBhIGxpc3QgdG8gaG9sZCBhbGwgcHJvY2Vzc2VkIHVybHMsIHRvIGF2b2lkIGR1cGxpY2F0ZQotCSAqICAgICAgICAgICAgcHJvY2Vzc2luZwotCSAqIEBwYXJhbSB2YWxpZGF0b3IKLQkgKiAgICAgICAgICAgIElDb250ZW50VmFsaWRhdG9yCi0JICogQHJldHVybiBTdHJpbmcgdGhlIGZpeGVkIHVybCwgbm90IHVzZWQuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHJvY2Vzc1Jlc291cmNlVXJsKE1ldGhvZEVsZW1lbnQgb3duZXIsCi0JCQlGaWxlIHJlc291cmNlRmlsZSwgU3RyaW5nIHVybCwgU3RyaW5nIGNvbnRlbnRQYXRoLAotCQkJRmlsZSBzb3VyY2VSb290UGF0aCwgRmlsZSB0YXJnZXRSb290UGF0aCwgU3RyaW5nIHJvb3RDb250ZW50UGF0aCwgTGlzdCBwcm9jZXNzZWRJdGVtcywKLQkJCUlDb250ZW50VmFsaWRhdG9yIHZhbGlkYXRvcikgewotCQlpZiAodXJsID09IG51bGwgfHwgaXNFeHRlcm5hbExpbmsodXJsKSB8fCBpc0phdmFzY3JpcHRVcmwodXJsKQotCQkJCXx8IHVybC5zdGFydHNXaXRoKFVSTF9CT09LTUFSS19JTkRJQ0FUT1IpKSB7Ci0JCQlyZXR1cm4gdXJsOwotCQl9Ci0JCQotCQkvLyBpZiB0aGUgdXJsIGNvbnRhaW5zIHRoZSBndWlkLCBpdCBtaWdodCBiZSBzb21lIGtpbmQgb2YgZWxlbWVudCBsaW5rLAotCQkvLyBmb3IgZXhhbXBsZSwgYWN0aXZpdHkgY2FuIGhhdmUgbW9kZWwgdGhhbiBvbmUgZWxlbWVudCBsaW5rCi0JCVN0cmluZyBndWlkID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKG93bmVyICE9IG51bGwpIHsKLQkJCWd1aWQgPSBvd25lci5nZXRHdWlkKCk7Ci0JCQlpZiAodXJsLmluZGV4T2YoZ3VpZCkgPj0gMCB8fCBpc0FjdGl2aXR5VGFiVXJsKHVybCkgKSB7CQkJCQotCQkJCXJldHVybiB1cmw7Ci0JCQl9CQkJCi0JCX0KLQkJCi0JCS8vIFB1Ymxpc2hpbmcgcmVwb3J0IGxpc3RzIG1pc3NpbmcgcmVzb3VyY2UgZmlsZXMgdGhhdAotCQkvLyBhcmUgcHJlc2VudAotCQkvLyBib29rbWFya3Mgc2hvdWxkIGJlIHN0cmlwcGVkIG91dCB3aGVuIGNoZWNraW5nIHJlc291cmNlCi0JCWludCBpbmRleCA9IHVybC5pbmRleE9mKFVSTF9CT09LTUFSS19JTkRJQ0FUT1IpOwotCQlpZiAoaW5kZXggPCAwKSB7Ci0JCQlpbmRleCA9IHVybC5pbmRleE9mKFVSTF9QQVJBTUVURVJfSU5ESUNBVE9SKTsKLQkJfQotCi0JCVN0cmluZyB1cmxfdGFpbCA9ICIiOyAvLyROT04tTkxTLTEkCi0JCWlmIChpbmRleCA+IDApIHsKLQkJCXVybF90YWlsID0gdXJsLnN1YnN0cmluZyhpbmRleCk7Ci0JCQl1cmwgPSB1cmwuc3Vic3RyaW5nKDAsIGluZGV4KTsKLQkJfQotCi0JCVN0cmluZyBpbWFnZUZpbGUgPSBSZXNvdXJjZUhlbHBlci5nZXRGaWxlUGF0aEZyb21VcmwodXJsLCBjb250ZW50UGF0aCk7Ci0JCWlmIChpbWFnZUZpbGUgPT0gbnVsbCkgewotCQkJaWYgKHZhbGlkYXRvciAhPSBudWxsKSB7Ci0JCQkJdmFsaWRhdG9yLmxvZ01pc3NpbmdSZXNvdXJjZShvd25lciwgcmVzb3VyY2VGaWxlLCB1cmwpOwotCQkJfQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJCQotCQkvLyBpbmRleC5odG0gaXMgdGhlIGRlZmF1bHQgaW5kZXggZmlsZSwgYWx3YXlzIGlnbm9yZSBpdAotCQlpZiAoaW1hZ2VGaWxlLmVxdWFsc0lnbm9yZUNhc2UoImluZGV4Lmh0bSIpIHx8IGltYWdlRmlsZS5lcXVhbHNJZ25vcmVDYXNlKCJpbmRleC5odG1sIikpIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl7Ci0JCQlyZXR1cm4gdXJsICsgdXJsX3RhaWw7Ci0JCX0KLQotCQlTdHJpbmcgbmV3VXJsID0gdXJsOwotCi0JCUZpbGUgc291cmNlOwotCQlGaWxlIGRlc3Q7Ci0JCQotCQkvLyBpZiB0aGUgdXJsIGlzIGEgbG9jYWwgZmlsZSBpbiBhbiBhYnNvbHV0ZSBwYXRoLCB3ZSBkb24ndCBjb3B5IHRoZSBmaWxlLCBsZWF2ZSBhcyBpcwotCQlzb3VyY2UgPSBuZXcgRmlsZShpbWFnZUZpbGUpOwotCQlpZiAoIHNvdXJjZS5leGlzdHMoKSApIHsKLQkJCXJldHVybiB1cmwgKyB1cmxfdGFpbDsKLQkJfQotCi0JCS8vIGlmIHJvb3QgQ29udGVudCBwYXRoIGlzIHNldCwgcmVtb3ZlIGZyb20gdGhlIGZpbGUgcGF0aAotCQlib29sZWFuIHVzZVB1YlJvb3QgPSB0cnVlOwotCQlTdHJpbmcgZmlsZVBhdGggPSBpbWFnZUZpbGU7Ci0JCWlmICggcm9vdENvbnRlbnRQYXRoICE9IG51bGwgJiYgcm9vdENvbnRlbnRQYXRoLmxlbmd0aCgpID4gMCApIHsKLQkJCWlmICggZmlsZVBhdGguc3RhcnRzV2l0aChyb290Q29udGVudFBhdGgpICkgewotCQkJCWZpbGVQYXRoID0gZmlsZVBhdGguc3Vic3RyaW5nKHJvb3RDb250ZW50UGF0aC5sZW5ndGgoKSk7Ci0JCQkJdXNlUHViUm9vdCA9IGZhbHNlOwotCQkJfQotCQl9Ci0JCS8vIGNoZWNrIGlmIHRoaXMgaXMgYSByZWFsIGZpbGUsIGlmIG5vdCwgaXQgaXMgYSByZWZlcmVuY2UgdG8gYSBiYXNlCi0JCS8vIHBsdWdpbgotCQlzb3VyY2UgPSBuZXcgRmlsZShzb3VyY2VSb290UGF0aCwgZmlsZVBhdGgpOwotCQkKLQkJLy8gaWYgdGhlIHNvdXJjZSBkb2VzIG5vdCBleGlzdCwgbWlnaHQgYmUgYSByZWZlcmVuY2UgdG8gYSByZXNvdXJjZSBpbiBhbm90aGVyIHBsdWdpbj8KLQkJLy8gZm9yIGV4YW1wbGUsIGlmIHRoZSBjb250ZW50IGlzIGNvbnRyaWJ1dGVkIGZyb20gYW5vdGhlciBlbGVtZW50IGluIGFub3RoZXIgcGx1Z2luLCB0aGlzIHdpbGwgaGFwcGVuCi0JCWlmICghc291cmNlLmV4aXN0cygpKSB7Ci0JCQlJTGlicmFyeVJlc291cmNlTWFuYWdlciBtZ3IgPSBnZXRSZXNvdXJjZU1ncihvd25lcik7Ci0JCQlpZiAoIG1nciAhPSBudWxsICkgewotCQkJCVN0cmluZyB0bXBQYXRoID0gbWdyLnJlc29sdmUob3duZXIsIGZpbGVQYXRoKTsKLQkJCQlpZiAoIHRtcFBhdGggIT0gbnVsbCApIHsKLQkJCQkJc291cmNlID0gbmV3IEZpbGUodG1wUGF0aCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQkvLyBpZiB0aGUgZmlsZSBpcyBub3QgaW4gdGhlIGxpYnJhcnksIGNoZWNrIHRoZSBwbHVnaW4gbGF5b3V0IGZvbGRlcgotCQlpZiAoIXNvdXJjZS5leGlzdHMoKSkgewotCQkJc291cmNlID0gbmV3IEZpbGUoTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TGF5b3V0UGF0aCgpLAotCQkJCQlmaWxlUGF0aCk7Ci0JCX0KLQotCQkvLyBpZiB0aGUgZmlsZVBhdGggaXMgcmVsYXRpdmUgdG8gdGhlIHB1YiByb290LCBmaXggdGhlIHRhcmdldCBwYXRoCi0JCWlmICggdXNlUHViUm9vdCAmJiByb290Q29udGVudFBhdGggIT0gbnVsbCAmJiByb290Q29udGVudFBhdGgubGVuZ3RoKCkgPiAwICkgewotCQkJRmlsZSB0bXBmID0gIG5ldyBGaWxlKHJvb3RDb250ZW50UGF0aCk7Ci0JCQl3aGlsZSAoIHRtcGYgIT0gbnVsbCApIHsKLQkJCQl0bXBmID0gdG1wZi5nZXRQYXJlbnRGaWxlKCk7Ci0JCQkJdGFyZ2V0Um9vdFBhdGggPSB0YXJnZXRSb290UGF0aC5nZXRQYXJlbnRGaWxlKCk7Ci0JCQl9Ci0JCX0KLQkJCi0JCWRlc3QgPSBuZXcgRmlsZSh0YXJnZXRSb290UGF0aCwgZmlsZVBhdGgpOwotCi0JCWlmIChzb3VyY2UuZXhpc3RzKCkpIHsKLQkJCUZpbGVVdGlsLmNvcHlGaWxlKHNvdXJjZSwgZGVzdCk7Ci0KLQkJCS8vIGlmIHRoZSBmaWxlIGlzIGFuIGh0bWwgYXR0YWNobWVudCwgbmVlZCB0byBzY2FuIHRoZSBmaWxlIGFuZCBjb3B5Ci0JCQkvLyB0aGUgcmVmZXJlbmNlZCBmaWxlIGluIGl0LCByZWN1cnNpdmVseQotCQkJaWYgKGltYWdlRmlsZS5lbmRzV2l0aChSZXNvdXJjZUhlbHBlci5GSUxFX0VYVF9IVE0pCi0JCQkJCXx8IGltYWdlRmlsZS5lbmRzV2l0aChSZXNvdXJjZUhlbHBlci5GSUxFX0VYVF9IVE1MKSkgewotCQkJCUZpbGUgZiA9IG5ldyBGaWxlKGltYWdlRmlsZSk7Ci0JCQkJdHJ5IHsKLQkJCQkJcmVzb2x2ZVJlc291cmNlcyhvd25lciwgZiwgRmlsZVV0aWwucmVhZEZpbGUoc291cmNlLAotCQkJCQkJCUZpbGVVdGlsLkVOQ09ESU5HX1VURl84KS50b1N0cmluZygpLCBmLmdldFBhcmVudCgpLAotCQkJCQkJCXNvdXJjZVJvb3RQYXRoLCB0YXJnZXRSb290UGF0aCwgcm9vdENvbnRlbnRQYXRoLCBwcm9jZXNzZWRJdGVtcywKLQkJCQkJCQl2YWxpZGF0b3IpOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJCQlleC5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJLy8gaWYgdGhlIGRlc3RpbmF0aW9uIGZpbGUgaXMgdGhlcmUsIG1pZ2h0IGJlIGdlbmVyYXRlZCBkeW5hbWljYWxseSwgc28KLQkJLy8gZG9uJ3QgbG9nIGl0Ci0JCWVsc2UgaWYgKCFkZXN0LmV4aXN0cygpICYmIGlzVmFsaWRGaWxlVXJsKHVybCkgJiYgKHZhbGlkYXRvciAhPSBudWxsKSkgewotCQkJdmFsaWRhdG9yLmxvZ01pc3NpbmdSZXNvdXJjZShvd25lciwgcmVzb3VyY2VGaWxlLCB1cmwpOwotCQl9Ci0KLQkJcmV0dXJuIG5ld1VybCArIHVybF90YWlsOwotCi0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0FjdGl2aXR5VGFiVXJsKFN0cmluZyB1cmwpIHsKLQkJcmV0dXJuIEFjdGl2aXR5TGF5b3V0LmlzQWN0aXZpdHlUYWJVcmwodXJsKTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1ZhbGlkRmlsZVVybChTdHJpbmcgdXJsKSB7Ci0JCS8vIGp1c3QgYSB0ZW1wIHNvbHV0aW9uIGhlcmUgdG8gZ2V0IHJpZCBvZiB0aGUgd3JvbmcgcmVwb3J0aW5nIG9mIG1zc2luZwotCQkvLyByZXNvdXJjZQotCQlpZiAodXJsID09IG51bGwgfHwgdXJsLmVxdWFscygiJyArIGRpYWdyYW1faW1nICsgJyIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIHJlc29sdmUgdGhlIGltYWdlcyBpbiB0aGUgdGV4dC4gY29weSB0aGUgaW1hZ2UgdG8gZGVzdGluYXRpb24gaWYgbmVlZGVkCi0JICogVGhpcyBpcyB1c2VkIGZvciBjb3B5aW5nIHJlc291cmNlcyBmcm9tIGEgbGlicmFyeSB0byBhbm90aGVyIGRlc3RpbmF0aW9uCi0JICogCi0JICogQHBhcmFtIG93bmVyCi0JICogICAgICAgICAgICBNZXRob2RFbGVtZW50LCB0aGUgb3duZXIgZWxlbWVudAotCSAqIEBwYXJhbSByZXNvdXJjZUZpbGUKLQkgKiAgICAgICAgICAgIEZpbGUsIHRoZSByZXNvdXJjZSBmaWxlCi0JICogQHBhcmFtIGNvbnRlbnQKLQkgKiAgICAgICAgICAgIFN0cmluZyB0aGUgY29udGVudCBzdHJpbmcgdG8gYmUgcHJvY2Vzc2VkCi0JICogQHBhcmFtIGNvbnRlbnRQYXRoCi0JICogICAgICAgICAgICBTdHJpbmcgdGhlIGNvbnRlbnQgcGF0aCBvZiB0aGUgc291cmNlIHRleHQsIHJlbGF0aXZlIHRvIHRoZQotCSAqICAgICAgICAgICAgc291cmNlIHJvb3QgcGF0aAotCSAqIEBwYXJhbSBzb3VyY2VSb290UGF0aAotCSAqICAgICAgICAgICAgRmlsZSB0aGUgc291cmNlIHJvb3QgcGF0aCwgdXN1YWxseSBpdCdzIHRoZSBsaWJyYXJ5IHJvb3QgcGF0aAotCSAqIEBwYXJhbSB0YXJnZXRSb290UGF0aAotCSAqICAgICAgICAgICAgRmlsZSB0aGUgdGFyZ2V0IHJvb3QgcGF0aCwgdXN1YWxseSBpdCdzIHRoZSBwdWJsaXNoaW5nIHJvb3QKLQkgKiAgICAgICAgICAgIHBhdGgKLQkgKiBAcGFyYW0gcm9vdENvbnRlbnRQYXRoIFN0cmluZyB0aGUgY29udGVudCBwYXRoIG9mIHRoZSByb290Ci0JICogQHBhcmFtIHByb2Nlc3NlZEl0ZW1zCi0JICogICAgICAgICAgICBMaXN0LCBhIGxpc3QgdG8gaG9sZCBhbGwgcHJvY2Vzc2VkIHVybHMsIHRvIGF2b2lkIGR1cGxpY2F0ZQotCSAqICAgICAgICAgICAgcHJvY2Vzc2luZwotCSAqIEBwYXJhbSB2YWxpZGF0b3IKLQkgKiAgICAgICAgICAgIElDb250ZW50VmFsaWRhdG9yCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlc29sdmVSZXNvdXJjZXMoTWV0aG9kRWxlbWVudCBvd25lciwgRmlsZSByZXNvdXJjZUZpbGUsCi0JCQlTdHJpbmcgY29udGVudCwgU3RyaW5nIGNvbnRlbnRQYXRoLCBGaWxlIHNvdXJjZVJvb3RQYXRoLAotCQkJRmlsZSB0YXJnZXRSb290UGF0aCwgU3RyaW5nIHJvb3RDb250ZW50UGF0aCwgTGlzdCBwcm9jZXNzZWRJdGVtcywKLQkJCUlDb250ZW50VmFsaWRhdG9yIHZhbGlkYXRvcikgewotCQl0cnkgewotCQkJLy8gcHJvY2VzcyBpbWFnZXMKLQkJCU1hdGNoZXIgbSA9IFJlc291cmNlSGVscGVyLnBfaW1hZ2VfcmVmLm1hdGNoZXIoY29udGVudCk7Ci0JCQl3aGlsZSAobS5maW5kKCkpIHsKLQkJCQlTdHJpbmcgdXJsID0gbS5ncm91cCgzKTsKLQkJCQlpZiAoIXByb2Nlc3NlZEl0ZW1zLmNvbnRhaW5zKHVybCkpIHsKLQkJCQkJLy8gbm90ZTogYWRkIHRoZSB1cmwgaW50byB0aGUgcHJvY2Vzc2VkSXRlbXMgbGlzdCBmaXJzdCwKLQkJCQkJLy8gb3RoZXJ3aXNlIG1heSBnZXQgZGVhZGxvY2sgaWYgdGhlIHVybCBjb250ZW50IGhhcwotCQkJCQkvLyByZWZlcmVuY2UgYmFjayB0byB0aGUgb3duZXIKLQkJCQkJcHJvY2Vzc2VkSXRlbXMuYWRkKHVybCk7Ci0JCQkJCVJlc291cmNlSGVscGVyLnByb2Nlc3NSZXNvdXJjZVVybChvd25lciwgcmVzb3VyY2VGaWxlLCB1cmwsCi0JCQkJCQkJY29udGVudFBhdGgsIHNvdXJjZVJvb3RQYXRoLCB0YXJnZXRSb290UGF0aCwgcm9vdENvbnRlbnRQYXRoLCAKLQkJCQkJCQlwcm9jZXNzZWRJdGVtcywgdmFsaWRhdG9yKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCW0gPSBSZXNvdXJjZUhlbHBlci5wX2Nzc19yZWYubWF0Y2hlcihjb250ZW50KTsKLQkJCXdoaWxlIChtLmZpbmQoKSkgewotCQkJCVN0cmluZyBjc3NVUkwgPSBtLmdyb3VwKDEpOwotCi0JCQkJLy8gaXQncyBoYXJkIHRvIHRlbGwgaWYgdGhpcyBpcyBhIHJpZ2h0IG1hdGNoIG9yIG5vdAotCQkJCS8vIHNpbmNlIHdlIGNhbid0IHRlbGwgaWYgdGhlIG1hdGNoZWQgb25lIGlzIGFjdHVhbGx5IGZyb20gYSBjc3MKLQkJCQkvLyBvciBqdXN0IGEgaHRtbCB0ZXh0Ci0JCQkJLy8gZm9yIGV4YW1wbGUsIHRleHQgY2FuIGhhdmUgc29tZXRoaW5nIGxpa2UgdXJsKHh4eCkgd2hpY2ggaXMKLQkJCQkvLyBtYXRjaGVkIGhlcmUKLQkJCQkvLyB3ZSBkb24ndCB3YW50IHRvIHJlcG9ydCBtaXNzaW5nIHJlc291cmNlIGZvciB0aGlzCi0JCQkJLy8gc28gZG9uJ3Qgc2V0IHRoZSB2YWxpZGF0b3IKLQkJCQkvLyBQdWJsaXNoaW5nIHdhcm5pbmdzOiBpbmFwcHJvcHJpYXRlIHdhcm5pbmdzCi0JCQkJLy8gY29taW5nIGZyb20gcmVxdWlyZWQgY29weXJpdGUuaHRtCi0KLQkJCQlpZiAoIXByb2Nlc3NlZEl0ZW1zLmNvbnRhaW5zKGNzc1VSTCkpIHsKLQkJCQkJLy8gbm90ZTogYWRkIHRoZSB1cmwgaW50byB0aGUgcHJvY2Vzc2VkSXRlbXMgbGlzdCBmaXJzdCwKLQkJCQkJLy8gb3RoZXJ3aXNlIG1heSBnZXQgZGVhZGxvY2sgaWYgdGhlIHVybCBjb250ZW50IGhhcwotCQkJCQkvLyByZWZlcmVuY2UgYmFjayB0byB0aGUgb3duZXIKLQkJCQkJcHJvY2Vzc2VkSXRlbXMuYWRkKGNzc1VSTCk7Ci0JCQkJCVJlc291cmNlSGVscGVyCi0JCQkJCQkJLnByb2Nlc3NSZXNvdXJjZVVybChvd25lciwgcmVzb3VyY2VGaWxlLCBjc3NVUkwsCi0JCQkJCQkJCQljb250ZW50UGF0aCwgc291cmNlUm9vdFBhdGgsCi0JCQkJCQkJCQl0YXJnZXRSb290UGF0aCwgcm9vdENvbnRlbnRQYXRoLCBwcm9jZXNzZWRJdGVtcywgbnVsbC8qIHZhbGlkYXRvciAqLyk7Ci0JCQkJfQotCQkJfQotCi0JCQkvLyBwcm9jZXNzIGF0dGFjaG1lbnRzCi0JCQltID0gUmVzb3VyY2VIZWxwZXIucF9saW5rX3JlZl9nZW4ubWF0Y2hlcihjb250ZW50KTsKLQkJCXdoaWxlIChtLmZpbmQoKSkgewotCQkJCS8vIFN0cmluZyB0YWcgPSBtLmdyb3VwKDEpOwotCQkJCVN0cmluZyB1cmx0ZXh0ID0gbS5ncm91cCgyKTsKLQkJCQlpZiAoUmVzb3VyY2VIZWxwZXIuZ2V0R3VpZEZyb21VcmwodXJsdGV4dCkgPT0gbnVsbCkgewotCQkJCQlNYXRjaGVyIG0yID0gUmVzb3VyY2VIZWxwZXIucF9saW5rX2hyZWZfcGlja2VyCi0JCQkJCQkJLm1hdGNoZXIoIiAiICsgdXJsdGV4dCArICIgIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQlpZiAobTIuZmluZCgpKSB7Ci0JCQkJCQlTdHJpbmcgdXJsID0gbTIuZ3JvdXAoMSkudHJpbSgpLnJlcGxhY2VBbGwoIlwiIiwgIiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCWlmICghcHJvY2Vzc2VkSXRlbXMuY29udGFpbnModXJsKSkgewotCQkJCQkJCS8vIG5vdGU6IGFkZCB0aGUgdXJsIGludG8gdGhlIHByb2Nlc3NlZEl0ZW1zIGxpc3QKLQkJCQkJCQkvLyBmaXJzdCwgb3RoZXJ3aXNlIG1heSBnZXQgZGVhZGxvY2sgaWYgdGhlIHVybAotCQkJCQkJCS8vIGNvbnRlbnQgaGFzIHJlZmVyZW5jZSBiYWNrIHRvIHRoZSBvd25lcgotCQkJCQkJCXByb2Nlc3NlZEl0ZW1zLmFkZCh1cmwpOwotCQkJCQkJCVJlc291cmNlSGVscGVyLnByb2Nlc3NSZXNvdXJjZVVybChvd25lciwKLQkJCQkJCQkJCXJlc291cmNlRmlsZSwgdXJsLCBjb250ZW50UGF0aCwKLQkJCQkJCQkJCXNvdXJjZVJvb3RQYXRoLCB0YXJnZXRSb290UGF0aCwgcm9vdENvbnRlbnRQYXRoLCAKLQkJCQkJCQkJCXByb2Nlc3NlZEl0ZW1zLCB2YWxpZGF0b3IpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCWV4LnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogdGFrZSB0aGUgdGFnIGF0dHJpYnV0ZXMgc3RyaW5nIGFzIGlucHV0IGFuZCByZXR1cm5zIHRoZSBhdHRyaWJ1dGUKLQkgKiBuYW1lLXZhbHVlIG1hcAotCSAqIAotCSAqIEBwYXJhbSBhdHRyaWJ1dGVzU3RyCi0JICogQHJldHVybiBNYXAgdGhlIGF0dHJpYnV0ZSBuYW1lLXZhbHVlIG1hcAotCSAqLwotCXB1YmxpYyBzdGF0aWMgTWFwIGdldFRhZ0F0dHJpYnV0ZXMoU3RyaW5nIGF0dHJpYnV0ZXNTdHIpIHsKLQkJdHJ5IHsKLQkJCS8vIHVzZSBMaW5rZWRIYXNoTWFwIHRvIHJlc2VydmUgdGhlIG9yZGVyIG9mIHRoZSBhdHRyaWJ1dGVzCi0JCQlNYXAgYXR0cmlidXRlTWFwID0gbmV3IExpbmtlZEhhc2hNYXAoMyk7Ci0JCQlNYXRjaGVyIG0yID0gcF90YWdfYXR0cmlidXRlcy5tYXRjaGVyKGF0dHJpYnV0ZXNTdHIpOwotCi0JCQl3aGlsZSAobTIuZmluZCgpKSB7Ci0JCQkJU3RyaW5nIGF0dHJOYW1lID0gbTIuZ3JvdXAoMSkudHJpbSgpLnRvTG93ZXJDYXNlKCk7Ci0JCQkJU3RyaW5nIGF0dHJWYWx1ZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQkJaWYgKG0yLmdyb3VwKDMpICE9IG51bGwpIHsKLQkJCQkJYXR0clZhbHVlID0gbTIuZ3JvdXAoMykudHJpbSgpOwotCQkJCX0gZWxzZSBpZiAobTIuZ3JvdXAoMikgIT0gbnVsbCkgewotCQkJCQlhdHRyVmFsdWUgPSBtMi5ncm91cCgyKS50cmltKCk7Ci0JCQkJfQkJCQkKLQkJCi0JCQkJLy8gQ2Fubm90IFByZXZpZXcvQnJvd3NlIERlc2NyaXB0aW9uIFRhYiB3aGVuCi0JCQkJLy8gdGhlIENQIGNvbnRhaW5zIGNoaW5lc2UgY2hhcmFjdGVycwotCQkJCS8vIGdlbmVyYXRlZCBodG1sIGZyb20geHNsdCBnb3QgdGhlIGhyZWYgdXJscyBlbmNvZGVkLiB3ZSBkb24ndCB3YW50Ci0JCQkJLy8gdGhhdCBtYWtlIHN1cmUgZGVjb2RlIHRoZSB1cmwgdXNpbmcgIlVURi04IiBlbmNvZGluZwotCQkJCWlmIChhdHRyTmFtZS5lcXVhbHMoVEFHX0FUVFJfSFJFRikpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCWF0dHJWYWx1ZSA9IFVSTERlY29kZXIuZGVjb2RlKGF0dHJWYWx1ZSwgIlVURi04Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCQl9CQkJCQkKLQkJCQl9Ci0JCQkJYXR0cmlidXRlTWFwLnB1dChhdHRyTmFtZSwgYXR0clZhbHVlKTsKLQkJCX0KLQkJCXJldHVybiBhdHRyaWJ1dGVNYXA7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CQkJCi0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIHJldHVybnMgdGhlIGF0dHJpYnV0ZSBuYW1lLXZhbHVlIG1hcCBmb3IgYW4gSFRNTCBsaW5rCi0JICogCi0JICogQHBhcmFtIGxpbmsKLQkgKiBAcmV0dXJuIE1hcAotCSAqLwotCXB1YmxpYyBzdGF0aWMgTWFwIGdldEF0dHJpYnV0ZXNGcm9tTGluayhTdHJpbmcgbGluaykgewotCQlNYXRjaGVyIG0gPSBwX2xpbmtfcmVmLm1hdGNoZXIobGluayk7Ci0JCWlmIChtLmZpbmQoKSkgewotCQkJU3RyaW5nIGF0dHJpYnV0ZXMgPSBtLmdyb3VwKDEpOwotCQkJcmV0dXJuIGdldFRhZ0F0dHJpYnV0ZXMoYXR0cmlidXRlcyk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogcmV0dXJucyB0aGUgYXR0cmlidXRlIG5hbWUtdmFsdWUgbWFwIGZvciBhbiBIVE1MIGxpbmsKLQkgKiAKLQkgKiBAcGFyYW0gbGluawotCSAqIEByZXR1cm4gTWFwCi0JICovCi0JcHVibGljIHN0YXRpYyBNYXAgZ2V0QXR0cmlidXRlc0Zyb21MaW5rKFBhdHRlcm4gcGF0dGVybiwgU3RyaW5nIGxpbmspIHsKLQkJTWF0Y2hlciBtID0gcGF0dGVybi5tYXRjaGVyKGxpbmspOwotCQlpZiAobS5maW5kKCkpIHsKLQkJCVN0cmluZyBhdHRyaWJ1dGVzID0gbS5ncm91cCgxKTsKLQkJCXJldHVybiBnZXRUYWdBdHRyaWJ1dGVzKGF0dHJpYnV0ZXMpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKioKLQkgKiB0YWtlcyBhbiBhdHRyaWJ1dGVNYXAgKGllLCBmcm9tICNnZXRUYWdBdHRyaWJ1dGVzKSBhbmQgcmV0dXJucyB0aGUgU3RyaW5nCi0JICogcmVwcmVzZW50YXRpb24KLQkgKiAKLQkgKiBAcGFyYW0gYXR0cmlidXRlTWFwCi0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRBdHRyaWJ1dGVzQXNTdHJpbmcoTWFwIGF0dHJpYnV0ZU1hcCkgewotCQlTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBhdHRyaWJ1dGVNYXAua2V5U2V0KCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlTdHJpbmcga2V5ID0gKFN0cmluZykgaXRlci5uZXh0KCk7Ci0JCQlTdHJpbmcgdmFsdWUgPSAoU3RyaW5nKSBhdHRyaWJ1dGVNYXAuZ2V0KGtleSk7Ci0JCQlpZiAoYnVmLmxlbmd0aCgpID4gMCkKLQkJCQlidWYuYXBwZW5kKCIgIik7IC8vJE5PTi1OTFMtMSQKLQkJCWJ1Zi5hcHBlbmQoa2V5ICsgIj1cIiIgKyB2YWx1ZSArICJcIiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCQlyZXR1cm4gYnVmLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogQmFkIGxpbmsgZnJvbSBXZWxjb21lIHBhZ2UgaHVtcCBjaGFydAotCSAqIAotCSAqLwotCXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXREaXNjYXJkZWRFbGVtZW50VVJMKE1ldGhvZEVsZW1lbnQgb3duZXJFbGVtZW50LAotCQkJTWV0aG9kRWxlbWVudCBsaW5rRWxlbWVudCwgU3RyaW5nIGd1aWQsIFN0cmluZyBwdWJEaXIpIHsKLQkJU3RyaW5nQnVmZmVyIGRpc2NhcmRlZEVsZW1lbnRVUkwgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0KLQkJZGlzY2FyZGVkRWxlbWVudFVSTC5hcHBlbmQoTUlTU0lOR19QQUdFU19GT0xERVIpLmFwcGVuZCgKLQkJCQkicGFnZXNfbm90X2luc3RhbGxlZCIpLmFwcGVuZChGSUxFX0VYVF9IVE1MKTsgLy8kTk9OLU5MUy0xJAotCi0JCUZpbGUgb3V0cHV0RmlsZSA9IG5ldyBGaWxlKHB1YkRpciwgZGlzY2FyZGVkRWxlbWVudFVSTC50b1N0cmluZygpKTsKLQkJRmlsZSBkaXIgPSBvdXRwdXRGaWxlLmdldFBhcmVudEZpbGUoKTsKLQkJaWYgKCFkaXIuZXhpc3RzKCkpIHsKLQkJCWRpci5ta2RpcnMoKTsKLQkJfQotCi0JCS8vIGdlbmVyYXRlIHRoZSBodG1sIGZpbGUKLQkJWG1sRWxlbWVudCB4bWwgPSBuZXcgWG1sRWxlbWVudCgiRWxlbWVudCIpOyAvLyROT04tTkxTLTEkCi0KLQkJeG1sCi0JCQkJLnNldEF0dHJpYnV0ZSgiZ3VpZCIsIGd1aWQpLnNldEF0dHJpYnV0ZSgidHlwZSIsIGxpbmtFbGVtZW50LmdldFR5cGUoKS5nZXROYW1lKCkpIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCBsaW5rRWxlbWVudC5nZXROYW1lKCkpIC8vJE5PTi1OTFMtMSQKLQkJCQkuc2V0QXR0cmlidXRlKAotCQkJCQkJInBsdWdpbk5hbWUiLCBMaWJyYXJ5VXRpbC5nZXRNZXRob2RQbHVnaW4obGlua0VsZW1lbnQpLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQJCQkJCQkJCQotCQlTdHJpbmcgeHNsUGF0aCA9IExheW91dFJlc291cmNlcy5nZXREZWZhdWx0WHNsUGF0aCgicGFnZV9ub3RfaW5zdGFsbGVkIiwgbnVsbCk7IC8vJE5PTi1OTFMtMSQKLQotCQl0cnkgewotCQkJU3RyaW5nQnVmZmVyIHhtbDIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQl4bWwyLmFwcGVuZChYbWxIZWxwZXIuWE1MX0hFQURFUikuYXBwZW5kKHhtbC50b1htbCgpKTsKLQotCQkJT3V0cHV0U3RyZWFtV3JpdGVyIG91dHB1dCA9IG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIoCi0JCQkJCW5ldyBGaWxlT3V0cHV0U3RyZWFtKG91dHB1dEZpbGUpLCAidXRmLTgiKTsgLy8kTk9OLU5MUy0xJAotCQkJUHJvcGVydGllcyB4c2xQYXJhbXMgPSBMaWJyYXJ5UGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcm9wZXJ0aWVzKAotCQkJCQkiL2xheW91dC94c2wvcmVzb3VyY2VzLnByb3BlcnRpZXMiKTsgLy8kTk9OLU5MUy0xJAotCi0JCQlYU0xUUHJvY2Vzc29yCi0JCQkJCS50cmFuc2Zvcm0oeHNsUGF0aCwgeG1sMi50b1N0cmluZygpLCB4c2xQYXJhbXMsIG91dHB1dCk7Ci0JCQlvdXRwdXQuZmx1c2goKTsKLQkJCW91dHB1dC5jbG9zZSgpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCWV4LnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0KLQkJcmV0dXJuIGdldEJhY2tQYXRoKG93bmVyRWxlbWVudCkucmVwbGFjZShGaWxlLnNlcGFyYXRvckNoYXIsICcvJykKLQkJCQkrIGRpc2NhcmRlZEVsZW1lbnRVUkwudG9TdHJpbmcoKTsKLQl9Ci0JCi0JCi0JCi0JLyoqCi0JICogRk9SIFVTRSBXSVRIIFJJQ0ggVEVYVCBFRElUT1IKLQkgKiB2YWxpZGF0ZSB0aGUgY29udGVudCBieSBjaGVja2luZyBlbGVtZW50IGxpbmtzIGFuZCBpbWFnZXMsIGZvciB0aGUKLQkgKiBzcGVjaWZpZWQgZWxlbWVudCBvd25lcgotCSAqIAotCSAqIFRoaXMgaXMgaWRlbnRpY2FsIHRvIHRoZSB2YWxpZGF0ZUNvbnRlbnQgbWV0aG9kLCBleGNlcHQgaXQgZG9lcyBub3QgZGVjb2RlIHRoZSByZXN1bHRzCi0JICogdmlhIFVSTERlY29kZXIuZGVjb2RlKCkKLQkgKiAKLQkgKiAgdGhpcyB3aWxsIGRvIHRoZSBmb2xsb3dpbmcgdG8gdGhlIEhUTUw6Ci0JICogIDEuICB1cGRhdGUgRWxlbWVudCBMaW5rcwotCSAqICAyLiAgY2hhbmdlIDxBIC4uPiB0byA8YSAuLj4KLQkgKiAgMy4gIGNoYW5nZSA8L0E+IHRvIDwvYT4KLQkgKiAgNC4gIGFkZCBkb3VibGUtcXVvdGVzICgiKSBhcm91bmQgYWxsIGF0dHJpYnV0ZSB2YWx1ZXMgaWYgdGhleSBhcmUgbWlzc2luZwotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogICAgICAgICAgICBNZXRob2RFbGVtZW50LCB0aGUgZWxlbWVudCB0aGF0IG93bnMgdGhlIGNvbnRlbnQKLQkgKiBAcGFyYW0gY29udGVudAotCSAqIEBwYXJhbSBjb25maWcKLQkgKiAgICAgICAgICAgIE1ldGhvZENvbmZpZ3VyYXRpb24gdGhlIGNvbmZpZ3VyYXRpb24gdG8gd2hpY2ggdGhlIGNvbnRlbnQgaXMKLQkgKiAgICAgICAgICAgIHZhbGlkYXRlZAotCSAqIEBwYXJhbSBsaW5rZWRFbGVtZW50cwotCSAqICAgICAgICAgICAgTGlzdCBhIHBhc3NlZCBpbiBsaXN0IHRvIGNvbGxlY3QgdGhlIGxpbmtlZCBlbGVtZW50cyBpbiB0aGlzCi0JICogICAgICAgICAgICBjb250ZW50LCBpZiBudWxsLCBubyBsaW5rZWQgZWxlbWVudHMgYXJlIGNvbGxlY3RlZC4KLQkgKiBAcmV0dXJuIFN0cmluZyB0aGUgdmFsaWRhdGVkIGNvbnRlbnQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB2YWxpZGF0ZVJpY2hUZXh0Q29udGVudChNZXRob2RFbGVtZW50IGVsZW1lbnQsIFN0cmluZyBzb3VyY2UsIElDb250ZW50VmFsaWRhdG9yIHZhbGlkYXRvcikgewotIAkJdHJ5IHsKLQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gbnVsbDsKLQkJCQotCQkJLy8gZmlyc3QgdmFsaWRhdGUgdGhlIHRhZ3MsIHJlbW92ZSBhbnkgQ0YvTEYgZnJvbSB0aGUgdGFnIHRleHQKLQkJCXNvdXJjZSA9IHZhbGlkYXRlVGFnKHNvdXJjZSk7Ci0KLQkJCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCU1hdGNoZXIgbSA9IHBfbGlua19yZWYubWF0Y2hlcihzb3VyY2UpOwotCi0JCQl3aGlsZSAobS5maW5kKCkpIHsKLQkJCQlTdHJpbmcgdGV4dCA9IG0uZ3JvdXAoKTsKLQotCQkJCS8vIFByb2JsZW1zIHBhcnNpbmcgPGEgaHJlZj4gdGFncwotCQkJCS8vIG5lZWQgdG8gcmVtb3ZlIGFsbCBMRiwgQ1Igd2l0aGluIHRoZSA8YSAuLj4gdGFnCi0JCQkJU3RyaW5nIHVybHRleHQgPSBtLmdyb3VwKDEpOwotCQkJCVN0cmluZyBsaW5rZWRUZXh0ID0gbS5ncm91cCgyKTsKLQkJCQlMaW5rSW5mbyBpbmZvID0gdmFsaWRhdG9yLnZhbGlkYXRlTGluayhlbGVtZW50LCB1cmx0ZXh0LAotCQkJCQkJbGlua2VkVGV4dCwgY29uZmlnLCAiYSIpOyAvLyROT04tTkxTLTEkCi0JCQkJaWYgKGluZm8gIT0gbnVsbCkgewotCQkJCQl0ZXh0ID0gaW5mby5nZXRIdG1sKHZhbGlkYXRvci5zaG93QnJva2VuTGlua3MoKSkudG9TdHJpbmcoKTsKLQkJCQkJTWV0aG9kRWxlbWVudCBlID0gaW5mby5nZXRMaW5rZWRFbGVtZW50KCk7Ci0JCQkJCWlmIChlICE9IG51bGwpIHsKLQkJCQkJCXZhbGlkYXRvci5hZGRSZWZlcmVuY2VkRWxlbWVudChlbGVtZW50LCBlKTsKLQkJCQkJfQotCQkJCX0KLQotCQkJCVN0cmluZyByZXBsYWNlbWVudCA9IHRleHQucmVwbGFjZUFsbCgiZmlsZTovLy8iLCAiIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCXJlcGxhY2VtZW50ID0gcmVwbGFjZW1lbnQucmVwbGFjZUFsbCgiZmlsZTovLyIsICIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJbS5hcHBlbmRSZXBsYWNlbWVudChzYiwgcmVnRXhwRXNjYXBlKHJlcGxhY2VtZW50KSk7Ci0JCQl9Ci0KLQkJCW0uYXBwZW5kVGFpbChzYik7Ci0KLQkJCWlmIChlbGVtZW50ID09IG51bGwpIHsKLQkJCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQkJCX0KLQotCQkJLy8gYWxzbyBmaXggdGhlIGFyZWEgbWFwCi0JCQlzb3VyY2UgPSBzYi50b1N0cmluZygpOwotCQkJbSA9IHBfYXJlYV9yZWYubWF0Y2hlcihzb3VyY2UpOwotCQkJc2Iuc2V0TGVuZ3RoKDApOwotCi0JCQl3aGlsZSAobS5maW5kKCkpIHsKLQkJCQlTdHJpbmcgdGV4dCA9IG0uZ3JvdXAoKTsKLQotCQkJCS8vIFByb2JsZW1zIHBhcnNpbmcgPGEgaHJlZj4gdGFncwotCQkJCS8vIG5lZWQgdG8gcmVtb3ZlIGFsbCBMRiwgQ1Igd2l0aGluIHRoZSA8YSAuLj4gdGFnCi0JCQkJU3RyaW5nIHVybHRleHQgPSBtLmdyb3VwKDEpOwotCQkJCUxpbmtJbmZvIGluZm8gPSB2YWxpZGF0b3IudmFsaWRhdGVMaW5rKGVsZW1lbnQsIHVybHRleHQsCi0JCQkJCQkiIiwgY29uZmlnLCAiYXJlYSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQlpZiAoaW5mbyAhPSBudWxsKSB7Ci0JCQkJCXRleHQgPSBpbmZvLmdldEh0bWwodmFsaWRhdG9yLnNob3dCcm9rZW5MaW5rcygpKS50b1N0cmluZygpOwotCQkJCQlNZXRob2RFbGVtZW50IGUgPSBpbmZvLmdldExpbmtlZEVsZW1lbnQoKTsKLQkJCQkJaWYgKGUgIT0gbnVsbCkgewotCQkJCQkJdmFsaWRhdG9yLmFkZFJlZmVyZW5jZWRFbGVtZW50KGVsZW1lbnQsIGUpOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJU3RyaW5nIHJlcGxhY2VtZW50ID0gdGV4dC5yZXBsYWNlQWxsKCJmaWxlOi8vLyIsICIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJcmVwbGFjZW1lbnQgPSByZXBsYWNlbWVudC5yZXBsYWNlQWxsKCJmaWxlOi8vIiwgIiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQltLmFwcGVuZFJlcGxhY2VtZW50KHNiLCByZWdFeHBFc2NhcGUocmVwbGFjZW1lbnQpKTsKLQkJCX0KLQotCQkJbS5hcHBlbmRUYWlsKHNiKTsKLQotCQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQlMaWJyYXJ5UGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihleCk7Ci0JCX0KLQotCQlyZXR1cm4gc291cmNlOwotCX0KLQotLy8JLyoqCi0vLwkgKiBjb3B5IGFsbCByZXNvdXJjZSBmaWxlcyBhc3NvY2lhdGVkIHdpdGggdGhlIGVsZW1lbnQgdG8gdGhlIHRhcmdldCBsb2NhdGlvbi4KLS8vCSAqIHJlY3Vyc2l2ZSBhbGwgaXQncyBjb250YWluZWQgZWxlbWVudHMgaWYgcmVjdXJzaXZlIGlzIHRydWUuCi0vLwkgKiAKLS8vCSAqIEBwYXJhbSBlbGVtZW50Ci0vLwkgKiBAcGFyYW0gZnJvbQotLy8JICogQHBhcmFtIHRvCi0vLwkgKi8KLS8vCXB1YmxpYyBzdGF0aWMgdm9pZCBjb3B5QWxsUmVzb3VyY2VzKE1ldGhvZEVsZW1lbnQgZWxlbWVudCwgRmlsZSBmcm9tLCBGaWxlIHRvLCBib29sZWFuIHJlY3Vyc2l2ZSkgewotLy8JCQotLy8JCUNvbnRlbnRSZXNvdXJjZVNjYW5uZXIgc2Nhbm5lciA9IG5ldyBDb250ZW50UmVzb3VyY2VTY2FubmVyKGZyb20sIHRvLCApOwotLy8JCXNjYW5uZXIuc2V0VGFyZ2V0Um9vdFBhdGgodG8pOwotLy8JCXNjYW5uZXIuY29weVJlc291cmNlcyhlbGVtZW50KTsKLS8vCQkKLS8vCQlpZiAoIHJlY3Vyc2l2ZSApIHsKLS8vCQkJZm9yICggSXRlcmF0b3IgaXQgPSBlbGVtZW50LmVBbGxDb250ZW50cygpOyBpdC5oYXNOZXh0KCk7ICkgewotLy8JCQkJT2JqZWN0IG9iaiA9IGl0Lm5leHQoKTsKLS8vCQkJCWlmICggb2JqIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCApIHsKLS8vCQkJCQlzY2FubmVyLmNvcHlSZXNvdXJjZXMoKE1ldGhvZEVsZW1lbnQpb2JqKTsKLS8vCQkJCX0KLS8vCQkJfQotLy8JCX0KLS8vCX0KLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRQbHVnaW5QYXRoKE1ldGhvZEVsZW1lbnQgZSkgewkJCi0JCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSBVbWFVdGlsLmdldE1ldGhvZFBsdWdpbihlKTsKLQkJcmV0dXJuIGdldEZvbGRlckFic29sdXRlUGF0aChwbHVnaW4pOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFBsdWdpblBhdGgoTWV0aG9kUGx1Z2luIHBsdWdpbikgewotCQlyZXR1cm4gZ2V0Rm9sZGVyQWJzb2x1dGVQYXRoKHBsdWdpbik7Ci0JfQotCQotCi0JCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdXRpbC9SZXNvdXJjZVNjYW5uZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91dGlsL1Jlc291cmNlU2Nhbm5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZmMwZTI4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91dGlsL1Jlc291cmNlU2Nhbm5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWw7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZEhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmEudXRpbC5yZWdleC5NYXRjaGVyOwotaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLkZpbGVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotCi0vKioKLSAqIFV0aWxpdHkgY2xhc3MgdG8gc2NhbiBhbmQgY29weSByZXNvdXJjZXMgZnJvbSBhIHBsdWdpbiB0byBhbm90aGVyIHBsdWdpbi4KLSAqIEBhdXRob3IgV2VpcGluZyBMdQotICogQHNpbmNlIDEuNQotICoKLSAqLwotcHVibGljIGNsYXNzIFJlc291cmNlU2Nhbm5lciB7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBsb2NhbERlYnVnID0gZmFsc2U7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFBhdHRlcm4gcF9zcmNfcmVmID0gUGF0dGVybi5jb21waWxlKAotCQkJInNyY1xccyo9XFxzKlwiKC4qPylcIiIsIFBhdHRlcm4uQ0FTRV9JTlNFTlNJVElWRSB8IFBhdHRlcm4uRE9UQUxMKTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgUGF0dGVybiBwX2hyZWZfcmVmID0gUGF0dGVybgotCQkJLmNvbXBpbGUoCi0JCQkJCSJocmVmXFxzKj1cXHMqXCIoLio/KVwiIiwgUGF0dGVybi5DQVNFX0lOU0VOU0lUSVZFIHwgUGF0dGVybi5ET1RBTEwpOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIE1ldGhvZFBsdWdpbiBzcmNQbHVnaW47Ci0JcHJpdmF0ZSBNZXRob2RQbHVnaW4gdGd0UGx1Z2luOwotCQotCXByaXZhdGUgRmlsZSBzcmNQbHVnaW5Sb290OwotCXByaXZhdGUgRmlsZSB0Z3RQbHVnaW5Sb290OwotCQotCXByaXZhdGUgRmlsZSBzcmNQbHVnaW5Sb290UGFyZW50OwotCXByaXZhdGUgRmlsZSB0Z3RQbHVnaW5Sb290UGFyZW50OwotCQotCXByaXZhdGUgTWFwPEZpbGUsIEZpbGU+IGZpbGVNYXAgPSBuZXcgTGlua2VkSGFzaE1hcDxGaWxlLCBGaWxlPigpOwotCXByaXZhdGUgU2V0PEZpbGU+IHRndEZpbGVTZXQgPSBuZXcgSGFzaFNldDxGaWxlPigpOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VTY2FubmVyKE1ldGhvZFBsdWdpbiBzcmNQbHVnaW4sIE1ldGhvZFBsdWdpbiB0Z3RQbHVnaW4pIHsKLQkJdGhpcy5zcmNQbHVnaW4gPSBzcmNQbHVnaW47Ci0JCXRoaXMudGd0UGx1Z2luID0gdGd0UGx1Z2luOwotCQlGaWxlIHNyY0ZpbGUgPSBuZXcgRmlsZShzcmNQbHVnaW4uZVJlc291cmNlKCkuZ2V0VVJJKCkudG9GaWxlU3RyaW5nKCkpOwotCQlGaWxlIHRndEZpbGUgPSBuZXcgRmlsZSh0Z3RQbHVnaW4uZVJlc291cmNlKCkuZ2V0VVJJKCkudG9GaWxlU3RyaW5nKCkpOwotCQlzcmNQbHVnaW5Sb290ID0gc3JjRmlsZS5nZXRQYXJlbnRGaWxlKCk7Ci0JCXRndFBsdWdpblJvb3QgPSB0Z3RGaWxlLmdldFBhcmVudEZpbGUoKTsKLQkJc3JjUGx1Z2luUm9vdFBhcmVudCA9IHNyY1BsdWdpblJvb3QuZ2V0UGFyZW50RmlsZSgpOwotCQl0Z3RQbHVnaW5Sb290UGFyZW50ID0gdGd0UGx1Z2luUm9vdC5nZXRQYXJlbnRGaWxlKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBzY2FuKE1ldGhvZEVsZW1lbnQgc3JjRWxlbWVudCwgTWV0aG9kRWxlbWVudCB0Z3RFbGVtZW50LCBTdHJpbmcgc291cmNlLCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSkgewotLyoJCWlmIChmZWF0dXJlLmdldE5hbWUoKS5lcXVhbHMoIm1haW5EZXNjcmlwdGlvbiIpKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxEPiBzcmNFbGVtZW50OiAiICsgc3JjRWxlbWVudC5nZXROYW1lKCkgKyAiLCBmZWF0dXJlOiAiICsgZmVhdHVyZS5nZXROYW1lKCkpOwotCQl9Ki8KLQkJU3RyaW5nIHNyY1BhdGggPSBSZXNvdXJjZUhlbHBlci5nZXRFbGVtZW50UGF0aChzcmNFbGVtZW50KTsKLQkJaWYgKHNyY1BhdGggPT0gbnVsbCkgewotCQkJcmV0dXJuIHNvdXJjZTsKLQkJfQotCQlTdHJpbmcgdGd0UGF0aCA9IFJlc291cmNlSGVscGVyLmdldEVsZW1lbnRQYXRoKHRndEVsZW1lbnQpOwotCQlpZiAodGd0UGF0aCA9PSBudWxsKSB7Ci0JCQlpZiAoc3JjUGF0aC5pbmRleE9mKHNyY1BsdWdpbi5nZXROYW1lKCkpID09IDApIHsKLQkJCQl0Z3RQYXRoID0gdGd0UGx1Z2luLmdldE5hbWUoKSArIHNyY1BhdGguc3Vic3RyaW5nKHNyY1BsdWdpbi5nZXROYW1lKCkubGVuZ3RoKCkpOwotCQkJfSBlbHNlIHsKLQkJCQlyZXR1cm4gc291cmNlOwotCQkJfQotCQl9Ci0KLQkJRmlsZSBzcmNGb2xkZXIgPSBuZXcgRmlsZShzcmNQbHVnaW5Sb290UGFyZW50LCBzcmNQYXRoKTsKLQkJRmlsZSB0Z3RGb2xkZXIgPSBuZXcgRmlsZSh0Z3RQbHVnaW5Sb290UGFyZW50LCB0Z3RQYXRoKTsKLQkJCi0JCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJdHJ5IHsKLQkJCS8vIHByb2Nlc3MgaW1hZ2VzIGFuZCBvdGhlciBzcmMgcmVzb3VyY2VzCi0JCQlNYXRjaGVyIG0gPSBwX3NyY19yZWYubWF0Y2hlcihzb3VyY2UpOwotCQkJd2hpbGUgKG0uZmluZCgpKSB7Ci0JCQkJU3RyaW5nIHRleHQgPSBtLmdyb3VwKCk7Ci0JCQkJU3RyaW5nIHVybCA9IG0uZ3JvdXAoMSk7Ci0JCQkJU3RyaW5nIHRndFVybCA9IHJlZ2lzdGVyRmlsZUNvcHkoc3JjRm9sZGVyLCB0Z3RGb2xkZXIsIHVybCk7Ci0JCQkJU3RyaW5nIHJlcGxhY2VUZXh0ID0gdGV4dC5yZXBsYWNlKHVybCwgdGd0VXJsKTsKLQkJCQltLmFwcGVuZFJlcGxhY2VtZW50KHNiLCBNYXRjaGVyLnF1b3RlUmVwbGFjZW1lbnQocmVwbGFjZVRleHQpKTsJCi0JCQl9Ci0JCQltLmFwcGVuZFRhaWwoc2IpOwotCi0JCQkvLyBwcm9jZXNzIGhyZWZzCi0JCQltID0gcF9ocmVmX3JlZi5tYXRjaGVyKHNiLnRvU3RyaW5nKCkpOwotCQkJd2hpbGUgKG0uZmluZCgpKSB7Ci0JCQkJU3RyaW5nIHRleHQgPSBtLmdyb3VwKCk7Ci0JCQkJU3RyaW5nIHVybCA9IG0uZ3JvdXAoMSk7Ci0JCQkJU3RyaW5nIHRndFVybCA9IHJlZ2lzdGVyRmlsZUNvcHkoc3JjRm9sZGVyLCB0Z3RGb2xkZXIsIHVybCk7Ci0JCQkJU3RyaW5nIHJlcGxhY2VUZXh0ID0gdGV4dC5yZXBsYWNlKHVybCwgdGd0VXJsKTsKLQkJCQltLmFwcGVuZFJlcGxhY2VtZW50KHNiLCBNYXRjaGVyLnF1b3RlUmVwbGFjZW1lbnQocmVwbGFjZVRleHQpKTsJCi0JCQl9Ci0JCQltLmFwcGVuZFRhaWwoc2IpOwotCQkJCi0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZXgpOwotCQl9Ci0JCQotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyByZWdpc3RlckZpbGVDb3B5KFN0cmluZyBzcmNVcmwpIHsKLQkJcmV0dXJuIHJlZ2lzdGVyRmlsZUNvcHkoc3JjUGx1Z2luUm9vdCwgdGd0UGx1Z2luUm9vdCwgc3JjVXJsKTsKLQl9Ci0JCi0JLyoqCi0JICogQHBhcmFtIHNyY0ZvbGRlcgotCSAqIEBwYXJhbSB0Z3RGb2xkZXIKLQkgKiBAcGFyYW0gdXJsCi0JICogQHJldHVybiB0Z3RVcmwKLQkgKi8KLQlwcml2YXRlIFN0cmluZyByZWdpc3RlckZpbGVDb3B5KEZpbGUgc3JjRm9sZGVyLCBGaWxlIHRndEZvbGRlciwgU3RyaW5nIHNyY1VybCkgewotCQlpZiAoc3JjVXJsID09IG51bGwpIHsKLQkJCXJldHVybiBzcmNVcmw7Ci0JCX0KLQotCQlTdHJpbmcgdGd0VXJsID0gc3JjVXJsOwotCQlpbnQgaW5kZXggPSB0Z3RVcmwuaW5kZXhPZigiIyIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChpbmRleCA+PSAwKSB7Ci0JCQl0Z3RVcmwgPSB0Z3RVcmwuc3Vic3RyaW5nKDAsIGluZGV4KTsKLQkJfQotCi0JCWluZGV4ID0gdGd0VXJsLmluZGV4T2YoIj8iKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAoaW5kZXggPj0gMCkgewotCQkJdGd0VXJsID0gdGd0VXJsLnN1YnN0cmluZygwLCBpbmRleCk7Ci0JCX0KLQotCQlpZiAodGd0VXJsLnRyaW0oKS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQlyZXR1cm4gc3JjVXJsOwotCQl9Ci0KLQkJdHJ5IHsKLQkJCUZpbGUgc3JjRmlsZSA9IG5ldyBGaWxlKHNyY0ZvbGRlciwgc3JjVXJsKTsKLQkJCUZpbGUgdGd0RmlsZSA9IG5ldyBGaWxlKHRndEZvbGRlciwgdGd0VXJsKTsKLQkJCQotCQkJaWYgKHNyY0ZpbGUuaXNGaWxlKCkgJiYgc3JjRmlsZS5leGlzdHMoKSkgewotCQkJCWlmICh0Z3RGaWxlLmV4aXN0cygpKSB7Ci0JCQkJCWlmICh0Z3RGaWxlLmxhc3RNb2RpZmllZCgpID09IHNyY0ZpbGUubGFzdE1vZGlmaWVkKCkKLQkJCQkJCQkmJiB0Z3RGaWxlLmxlbmd0aCgpID09IHNyY0ZpbGUubGVuZ3RoKCkpIHsKLQkJCQkJCXJldHVybiB0Z3RVcmw7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJdGd0VXJsID0gdGhpcy5nZXRUYXJnZXRVcmwoc3JjRmlsZSwgdGd0Rm9sZGVyLCB0Z3RVcmwpOwotCQkJCXRndEZpbGUgPSBuZXcgRmlsZSh0Z3RGb2xkZXIsIHRndFVybCk7OwotCQkJCQotCQkJCXNyY0ZpbGUgPSBzcmNGaWxlLmdldENhbm9uaWNhbEZpbGUoKTsKLQkJCQl0Z3RGaWxlID0gdGd0RmlsZS5nZXRDYW5vbmljYWxGaWxlKCk7CQkJCQotCQkJCWZpbGVNYXAucHV0KHNyY0ZpbGUsIHRndEZpbGUpOwkJCQkKLQkJCX0KLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCX0KLQkJCi0JCXJldHVybiB0Z3RVcmw7Ci0JfQotCi0KLQkvKioKLQkgKiBjb3B5IGFsbCB0aGUgZmlsZXMgdG8gdGhlIGRlc3RpbmF0aW9uCi0JICovCi0JcHVibGljIHZvaWQgY29weUZpbGVzKCkgewotCQlpZiAobG9jYWxEZWJ1ZykgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJMRD4gY29weUZpbGVzOiAiKTsJLy8kTk9OLU5MUy0xJAotCQl9Ci0JCQkJCi0JCWZvciAoSXRlcmF0b3IgaXQgPSBmaWxlTWFwLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOyApIHsKLQkJCU1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpaXQubmV4dCgpOwotCQkJRmlsZSBzcmNGaWxlID0gKEZpbGUpIGVudHJ5LmdldEtleSgpOwotCQkJRmlsZSB0Z3RGaWxlID0gKEZpbGUpIGVudHJ5LmdldFZhbHVlKCk7Ci0JCQlGaWxlVXRpbC5jb3B5RmlsZShzcmNGaWxlLCB0Z3RGaWxlKTsJCQkKLQkJCXRndEZpbGUuc2V0TGFzdE1vZGlmaWVkKHNyY0ZpbGUubGFzdE1vZGlmaWVkKCkpOwkJCQotCQkJCi0JCQlpZiAobG9jYWxEZWJ1ZykgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTEQ+IHNyY0ZpbGU6ICIgKyBzcmNGaWxlKTsJLy8kTk9OLU5MUy0xJAotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTEQ+IHRndEZpbGU6ICIgKyB0Z3RGaWxlKTsJLy8kTk9OLU5MUy0xJAotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiIik7CQkJCQkJCS8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQkJCi0JfQotCQotCXByaXZhdGUgU3RyaW5nIGdldFRhcmdldFVybChGaWxlIHNyY0ZpbGUsIEZpbGUgdGd0Rm9sZGVyLCBTdHJpbmcgdGd0VXJsMCkgewotCQlTdHJpbmcgZG90ID0gIi4iOwkvLyROT04tTkxTLTEkCi0JCVN0cmluZyB1cmwxID0gdGd0VXJsMDsKLQkJU3RyaW5nIHVybDIgPSAiIjsJLy8kTk9OLU5MUy0xJAotCQkKLQkJaW50IGl4ID0gdGd0VXJsMC5sYXN0SW5kZXhPZihkb3QpOwotCQlpbnQgbGVuID0gdGd0VXJsMC5sZW5ndGgoKTsKLQotCQlib29sZWFuIGFkZERvdCA9IGZhbHNlOwotCQlpZiAoaXggPiAwICYmIGl4IDwgbGVuKSB7Ci0JCQl1cmwxID0gdGd0VXJsMC5zdWJzdHJpbmcoMCwgaXgpOwotCQkJdXJsMiA9IHRndFVybDAuc3Vic3RyaW5nKGl4ICsgMSwgbGVuKTsKLQkJCWFkZERvdCA9IHRydWU7Ci0JCX0KLQkJCi0JCVN0cmluZyB0Z3RVcmwgPSB0Z3RVcmwwOwotCQlGaWxlIHRndEZpbGUgPSBuZXcgRmlsZSh0Z3RGb2xkZXIsIHRndFVybCk7Ci0JCVN0cmluZyB1ID0gIl8iOwkvLyROT04tTkxTLTEkCi0JCWludCBpID0gMTsKLQkJd2hpbGUgKHRydWUpIHsKLQkJCWJvb2xlYW4gZXhpc3RzID0gdGd0RmlsZS5leGlzdHMoKTsKLQkJCWlmIChleGlzdHMpIHsKLQkJCQlpZiAodGd0RmlsZS5sYXN0TW9kaWZpZWQoKSA9PSBzcmNGaWxlLmxhc3RNb2RpZmllZCgpCi0JCQkJCQkmJiB0Z3RGaWxlLmxlbmd0aCgpID09IHNyY0ZpbGUubGVuZ3RoKCkpIHsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQkJCQotCQkJCi0JCQlib29sZWFuIGluVGd0U2V0ID0gdGd0RmlsZVNldC5jb250YWlucyh0Z3RGaWxlKTsKLQkJCWlmICghIGV4aXN0cyAmJiAhaW5UZ3RTZXQpIHsKLQkJCQlicmVhazsKLQkJCX0KLQkJCQkJCQotCQkJaWYgKGluVGd0U2V0KSB7Ci0JCQkJdHJ5IHsKLQkJCQkJRmlsZSBmaWxlID0gZmlsZU1hcC5nZXQoc3JjRmlsZS5nZXRDYW5vbmljYWxGaWxlKCkpOwotCQkJCQlpZiAoZmlsZSAhPSBudWxsICYmIGZpbGUuZXF1YWxzKHRndEZpbGUuZ2V0Q2Fub25pY2FsRmlsZSgpKSkgewotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQlMaWJyYXJ5UGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCQl9Ci0JCQl9Ci0JCQkJCQkJCQotCQkJdGd0VXJsID0gdXJsMSArIHUgKyBpOwotCQkJaWYgKGFkZERvdCkgewotCQkJCXRndFVybCArPSBkb3QgKyB1cmwyOwotCQkJfQotCQkJdGd0RmlsZSA9IG5ldyBGaWxlKHRndEZvbGRlciwgdGd0VXJsKTsJCQkKLQkJCWkrKzsKLQkJfQotCQkKLQkJdHJ5IHsKLQkJCXRndEZpbGUgPSB0Z3RGaWxlLmdldENhbm9uaWNhbEZpbGUoKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCUxpYnJhcnlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQl9Ci0JCQotCQl0Z3RGaWxlU2V0LmFkZCh0Z3RGaWxlKTsJCQotCQlyZXR1cm4gdGd0VXJsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3V0aWwvUmVzb3VyY2VVdGlsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdXRpbC9SZXNvdXJjZVV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDZlMzNhYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdXRpbC9SZXNvdXJjZVV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wcm9qZWN0Lk1ldGhvZExpYnJhcnlQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5GaWxlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci0KLS8qKgotICogSGVscGVyIGNsYXNzIGZvciBtYW5hZ2luZyB0aGUgTWV0aG9kIExpYnJhcnkgYXMgYSBwcm9qZWN0IGluIHRoZSBFY2xpcHNlCi0gKiB3b3Jrc3BhY2UuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFJlc291cmNlVXRpbCB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgbWV0aG9kTGlicmFyeU5hdHVyZSA9ICJvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wcm9qZWN0Lk1ldGhvZExpYnJhcnlQcm9qZWN0TmF0dXJlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gbWV0aG9kTGlicmFyeU5hdHVyZXMgPSB7IG1ldGhvZExpYnJhcnlOYXR1cmUgfTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gZGVidWcgPSBMaWJyYXJ5UGx1Z2luLmdldERlZmF1bHQoKS5pc0RlYnVnZ2luZygpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9DS19GSUxFTkFNRSA9ICIubG9jayI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBsaWIgTWV0aG9kTGlicmFyeQotCSAqIEBwYXJhbSBtb25pdG9yIElQcm9ncmVzc01vbml0b3IKLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCB2b2lkIG9wZW4oTWV0aG9kTGlicmFyeSBsaWIsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLQkJCXRocm93cyBDb3JlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0JCW9wZW4oZ2V0TGlicmFyeURpcmVjdG9yeShsaWIpLCBtb25pdG9yKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gbGliRGlyIFN0cmluZwotCSAqIEBwYXJhbSBtb25pdG9yIElQcm9ncmVzc01vbml0b3IKLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCB2b2lkIG9wZW4oU3RyaW5nIGxpYkRpciwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQotCQkJdGhyb3dzIENvcmVFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLQkJSVBhdGggcGF0aCA9IG5ldyBQYXRoKGxpYkRpciArIEZpbGUuc2VwYXJhdG9yCi0JCQkJKyBJUHJvamVjdERlc2NyaXB0aW9uLkRFU0NSSVBUSU9OX0ZJTEVfTkFNRSk7Ci0JCUlQcm9qZWN0RGVzY3JpcHRpb24gZGVzY3JpcHRpb24gPSBudWxsOwotCi0JCXRyeSB7Ci0JCQlkZXNjcmlwdGlvbiA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKQotCQkJCQkubG9hZFByb2plY3REZXNjcmlwdGlvbihwYXRoKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLQkJCS8vIG1pc3NpbmcgLnByb2plY3QgZmlsZQotCQkJaWYgKGRlYnVnKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCIjIyMgLSBleGNlcHRpb24gaW4gbG9hZFByb2plY3REZXNjcmlwdGlvbiIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQotCQlJUHJvamVjdCBwcm9qZWN0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWlmIChkZXNjcmlwdGlvbiA9PSBudWxsKSB7Ci0JCQkJLy8gLnByb2plY3QgZmlsZSBpcyBtaXNzaW5nIC0gY3JlYXRlIGEgbmV3IHByb2plY3QKLQkJCQlpZiAoZGVidWcpIHsKLQkJCQkJU3lzdGVtLm91dAotCQkJCQkJCS5wcmludGxuKCIjIyMgLSBjcmVhdGluZyBuZXcgbWV0aG9kIGxpYnJhcnkgcHJvamVjdCIpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJCXByb2plY3QgPSBjcmVhdGVWYWxpZFByb2plY3RGcm9tUGF0aChsaWJEaXIsIG1vbml0b3IpOwotCQkJfSBlbHNlIHsKLQkJCQkvLyAucHJvamVjdCBmaWxlIGV4aXN0cwotCQkJCWlmIChkZWJ1ZykgewotCQkJCQlTeXN0ZW0ub3V0Ci0JCQkJCQkJLnByaW50bG4oIiMjIyAtIG9wZW5pbmcgZXhpc3RpbmcgbWV0aG9kIGxpYnJhcnkgcHJvamVjdCAiICsgZGVzY3JpcHRpb24uZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQotCQkJCS8vIGNoZWNrIGlmIHByb2plY3Qgb2YgdGhpcyBuYW1lIGV4aXN0cyBpbiB3b3Jrc3BhY2UKLQkJCQlwcm9qZWN0ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0KAotCQkJCQkJZGVzY3JpcHRpb24uZ2V0TmFtZSgpKTsKLQotCQkJCWlmICghcHJvamVjdC5leGlzdHMoKSkgewotCQkJCQkvLyBwcm9qZWN0IGRvZXNuJ3QgZXhpc3QgaW4gd29ya3NwYWNlLCBzbyBtYWtlIG9uZSB3aXRoIHRoZQotCQkJCQkvLyBwcm9qZWN0IG5hbWUgaW4gLnByb2plY3QKLQkJCQkJdHJ5IHsKLQkJCQkJCWlmIChkZWJ1ZykgewotCQkJCQkJCVN5c3RlbS5vdXQKLQkJCQkJCQkJCS5wcmludGxuKCIjIyMgLSBjcmVhdGluZyBleGlzdGluZyAucHJvamVjdCAiICsgZGVzY3JpcHRpb24uZ2V0TmFtZSgpICsgIiBpbiB3b3Jrc3BhY2UiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQl9Ci0JCQkJCQlwcm9qZWN0ID0gY3JlYXRlUHJvamVjdChsaWJEaXIsIHByb2plY3QuZ2V0TmFtZSgpLAotCQkJCQkJCQltb25pdG9yKTsKLQkJCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBleCkgewotCQkJCQkJLy8gZmFpbGVkIHRvIG1ha2UgdGhpcyBwcm9qZWN0IGluIHRoZSB3b3Jrc3BhY2UgLQotCQkJCQkJLy8gYW5vdGhlciBwcm9qZWN0IG1heSBleGlzdCBpbiB0aGUgd29ya3NwYWNlIGF0IHRoaXMKLQkJCQkJCS8vIGxvY2F0aW9uCi0JCQkJCQkvLyBzbyB3ZSBuZWVkIHRvIGRlbGV0ZSB0aGF0IGNvbmZsaWN0aW5nIHByb2plY3QgYW5kIHRyeQotCQkJCQkJLy8gYWdhaW4KLQkJCQkJCWlmIChkZWJ1ZykgewotCQkJCQkJCVN5c3RlbS5vdXQKLQkJCQkJCQkJCS5wcmludGxuKCIjIyMgLSBjcmVhdGluZyBleGlzdGluZyAucHJvamVjdCBmYWlsZWQgLSBkZWxldGluZyB3b3Jrc3BhY2UtcHJvamVjdCBpbiAiICsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJCQlsaWJEaXIKLQkJCQkJCQkJCQkJKyAiIGFuZCBjcmVhdGluZyB3b3Jrc3BhY2UtcHJvamVjdCAiICsgcHJvamVjdC5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJCQl9Ci0JCQkJCQlkZWxldGVQcm9qZWN0KGxpYkRpciwgbW9uaXRvcik7Ci0JCQkJCQlwcm9qZWN0ID0gY3JlYXRlUHJvamVjdChsaWJEaXIsIHByb2plY3QuZ2V0TmFtZSgpLAotCQkJCQkJCQltb25pdG9yKTsKLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCS8vIHByb2plY3QgZG9lcyBleGlzdCBpbiB3b3Jrc3BhY2UgLSBtYWtlIHN1cmUgbG9jYXRpb24KLQkJCQkJLy8gbWF0Y2hlcywgaWYgbm90LCBtYWtlIGEgbmV3IHByb2plY3QKLQkJCQkJaWYgKGRlYnVnKSB7Ci0JCQkJCQlTeXN0ZW0ub3V0Ci0JCQkJCQkJCS5wcmludGxuKCIjIyMgLSBwcm9qZWN0ICIgKyBwcm9qZWN0LmdldE5hbWUoKSArICIgZXhpc3RzIGluIHdvcmtzcGFjZSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJfQotCQkJCQlpZiAobmV3IEZpbGUobGliRGlyKS5jb21wYXJlVG8ocHJvamVjdC5nZXRMb2NhdGlvbigpCi0JCQkJCQkJLnRvRmlsZSgpKSAhPSAwKSB7Ci0JCQkJCQlpZiAoZGVidWcpIHsKLQkJCQkJCQlTeXN0ZW0ub3V0Ci0JCQkJCQkJCQkucHJpbnRsbigiIyMjIC0gcHJvamVjdCAiICsgcHJvamVjdC5nZXROYW1lKCkgKyAiIGV4aXN0cyBpbiB3b3Jrc3BhY2UsIGJ1dCBsb2NhdGlvbiBkaWZmZXJzIC0gY3JlYXRlIGEgbmV3IHByb2plY3QiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQl9Ci0JCQkJCQlGaWxlIHByb2plY3RGaWxlID0gcGF0aC50b0ZpbGUoKTsKLQkJCQkJCWlmIChwcm9qZWN0RmlsZS5jYW5Xcml0ZSgpKSB7Ci0JCQkJCQkJcHJvamVjdEZpbGUuZGVsZXRlKCk7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCS8vIHRoaXMgd2lsbCBjYXVzZSB0aGUgY2FsbGVyIHRvIGRpc3BsYXkgYQotCQkJCQkJCS8vIG1lc3NhZ2Vib3ggYXNraW5nIHRoZSB1c2VyIHRvIG1ha2UgLnByb2plY3QKLQkJCQkJCQkvLyB3cml0YWJsZQotCQkJCQkJCS8vIFRPRE86IHVzZSBvdXIgb3duIHR5cGUgb2YgRXhjZXB0aW9uPwotCQkJCQkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbigKLQkJCQkJCQkJCSIjIyMiICsgcHJvamVjdEZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJCQl9Ci0JCQkJCQlwcm9qZWN0ID0gY3JlYXRlVmFsaWRQcm9qZWN0RnJvbVBhdGgobGliRGlyLCBtb25pdG9yKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWlmIChwcm9qZWN0ID09IG51bGwpIHsKLQkJCQkvLyBsaWJEaXIgbXVzdCBiZSBhbiBpbnZhbGlkIHBhdGggKG92ZXJsYXBzIHdvcmtzcGFjZT8pCi0JCQkJLy8gVE9ETzogdGhpcyBleGNlcHRpb24gaXNuJ3QgaGFuZGxlZCB3ZWxsIC0gaXQgc2hvdWxkbid0IGhhcHBlbgotCQkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbihMaWJyYXJ5UmVzb3VyY2VzLmludmFsaWRMaWJyYXJ5UGF0aEVycm9yX3JlYXNvbik7Ci0JCQl9Ci0JCQlwcm9qZWN0Lm9wZW4oSVJlc291cmNlLkJBQ0tHUk9VTkRfUkVGUkVTSCwgbW9uaXRvcik7CQkJCQkJCi0JCQkKLQkJCS8vIFNldCBsb2NrIGZpbGUgYXMgdGVhbSBwcml2YXRlIG1lbWJlciBzbyBpdCB3aWxsIG5vdCBiZSBzaGFyZWQgKGFkZGVkIHRvIHNvdXJjZSBjb250cm9sKS4KLQkJCS8vIFRoaXMgbXVzdCBiZSBkb25lIGJlZm9yZSB0aGUgcHJvamVjdCBmb2xkZXIgZ290IHJlZnJlc2hlZC4gU28gdGhpcyBwb3J0aW9uIG9mIGNvZGUgbXVzdCBiZQotCQkJLy8gZXhlY3V0ZWQgcmlnaHQgYWZ0ZXIgSVByb2plY3Qub3BlbigpIHJldHVybmVkLiBQcm9qZWN0IG11c3QgYmUgb3BlbmVkIHdpdGggSVJlc291cmNlLkJBQ0tHUk9VTkRfUkVGUkVTSAotCQkJLy8gdG8gcHJldmVudCBsb2NrIGZpbGUgZnJvbSBiZWluZyBhZGRlZCB0byB0aGUgcHJvamVjdCBiZWZvcmUgaXQgaXMgc2V0IGFzIHRlYW0gcHJpdmF0ZSBtZW1iZXIKLQkJCS8vCi0JCQlGaWxlIGxvY2tGaWxlID0gbmV3IEZpbGUobGliRGlyLCBSZXNvdXJjZVV0aWwuTE9DS19GSUxFTkFNRSk7Ci0JCQlpZihsb2NrRmlsZS5leGlzdHMoKSkgewotCQkJCXRyeSB7Ci0JCQkJCUlSZXNvdXJjZSB3c1JlcyA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0RmlsZUZvckxvY2F0aW9uKG5ldyBQYXRoKGxvY2tGaWxlLmdldEFic29sdXRlUGF0aCgpKSk7Ci0JCQkJCWlmKHdzUmVzICE9IG51bGwpIHsKLQkJCQkJCXdzUmVzLnJlZnJlc2hMb2NhbChJUmVzb3VyY2UuREVQVEhfWkVSTywgbnVsbCk7Ci0JCQkJCQl3c1Jlcy5zZXRUZWFtUHJpdmF0ZU1lbWJlcih0cnVlKTsKLQkJCQkJfQotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCUxpYnJhcnlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCX0KLQkJCX0KLQotCQkJLy8gbW9uaXRvciBmb3IgY2hhbmdlIGluIHRoZSByZXNvdXJjZQotLy8JCQlSZWZyZXNoTWFuYWdlci5nZXRJbnN0YW5jZSgpLm1vbml0b3IocHJvamVjdCk7Ci0KLQkJCWRlc2NyaXB0aW9uID0gcHJvamVjdC5nZXREZXNjcmlwdGlvbigpOwotCi0JCQkvLyBtYWtlIHN1cmUgcHJvamVjdCBoYXMgdGhlIE1ldGhvZExpYnJhcnlOYXR1cmUKLQkJCVN0cmluZ1tdIGV4aXN0aW5nTmF0dXJlcyA9IGRlc2NyaXB0aW9uLmdldE5hdHVyZUlkcygpOwotCQkJaWYgKCEoQXJyYXlzLmFzTGlzdChleGlzdGluZ05hdHVyZXMpLmNvbnRhaW5zKG1ldGhvZExpYnJhcnlOYXR1cmUpKSkgewotCQkJCWlmIChkZWJ1ZykgewotCQkJCQlTeXN0ZW0ub3V0Ci0JCQkJCQkJLnByaW50bG4oIiMjIyAtIGFkZGluZyBtZXRob2RsaWJyYXJ5bmF0dXJlIHRvICIgKyBkZXNjcmlwdGlvbi5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJCWRlc2NyaXB0aW9uLnNldE5hdHVyZUlkcyhtZXRob2RMaWJyYXJ5TmF0dXJlcyk7Ci0JCQkJcHJvamVjdC5zZXREZXNjcmlwdGlvbihkZXNjcmlwdGlvbiwgSVByb2plY3QuRk9SQ0UKLQkJCQkJCXwgSVByb2plY3QuS0VFUF9ISVNUT1JZLCBtb25pdG9yKTsKLQkJCX0KLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBleCkgewotCQkJTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZXgpOwotCQkJdGhyb3cgZXg7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDbG9zZXMgYSBsaWJyYXJ5J3MgcHJvamVjdC4gSXQgZmluZHMgdGhlIHByb2plY3QgYnkgbG9jYXRpbmcgYSBwcm9qZWN0Ci0JICogd2l0aCB0aGUgc2FtZSBsb2NhdGlvbiBhcyB0aGUgbGlicmFyeS4KLQkgKiAKLQkgKiBAcGFyYW0gbGliCi0JICogQHBhcmFtIG1vbml0b3IKLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIHZvaWQgY2xvc2UoTWV0aG9kTGlicmFyeSBsaWIsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLQkJCXRocm93cyBDb3JlRXhjZXB0aW9uIHsKLS8vCQlJUHJvamVjdCBwcm9qZWN0ID0gZmluZFByb2plY3QobGliKTsKLS8vCQlpZiAocHJvamVjdCAhPSBudWxsICYmIHByb2plY3QuaXNPcGVuKCkpIHsKLS8vCQkJaWYgKGRlYnVnKSB7Ci0vLwkJCQlTeXN0ZW0ub3V0Ci0vLwkJCQkJCS5wcmludGxuKCIjIyMgLSBjbG9zaW5nIHByb2plY3QgIiArIHByb2plY3QuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotLy8JCQl9Ci0vLwkJCXByb2plY3QuY2xvc2UobW9uaXRvcik7Ci0vLwkJfSBlbHNlIHsKLS8vCQkJaWYgKGRlYnVnKSB7Ci0vLwkJCQlTeXN0ZW0ub3V0Ci0vLwkJCQkJCS5wcmludGxuKCIjIyMgLSBFUlJPUiBjbG9zaW5nIHByb2plY3QgZm9yIGxpYnJhcnkgaW4gXCIiICsgZ2V0TGlicmFyeURpcmVjdG9yeShsaWIpICsgIlwiOiBwcm9qZWN0IGNvdWxkIG5vdCBiZSBmb3VuZC4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0vLwkJCX0KLS8vCQl9Ci0JCQotCQljbG9zZShnZXRMaWJyYXJ5RGlyZWN0b3J5KGxpYiksIG1vbml0b3IpOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBkaXIgU3RyaW5nCi0JICogQHBhcmFtIG1vbml0b3IgSVByb2dyZXNzTW9uaXRvcgotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgdm9pZCBjbG9zZShTdHJpbmcgZGlyLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCi0JdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJUHJvamVjdCBwcm9qZWN0ID0gZmluZFByb2plY3QoZGlyKTsKLQkJaWYgKHByb2plY3QgIT0gbnVsbCAmJiBwcm9qZWN0LmlzT3BlbigpKSB7Ci0JCQlpZiAoZGVidWcpIHsKLQkJCQlTeXN0ZW0ub3V0Ci0JCQkJCQkucHJpbnRsbigiIyMjIC0gY2xvc2luZyBwcm9qZWN0ICIgKyBwcm9qZWN0LmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCXByb2plY3QuY2xvc2UobW9uaXRvcik7Ci0JCQkKLQkJCS8vIHN0b3AgbW9uaXRvcmluZyBjaGFuZ2Ugb24gdGhlIHByb2plY3QKLQkJCS8vCi0vLwkJCVJlZnJlc2hNYW5hZ2VyLmdldEluc3RhbmNlKCkudW5tb25pdG9yKHByb2plY3QpOwotCQkJCi0JCX0gZWxzZSB7Ci0JCQlpZiAoZGVidWcpIHsKLQkJCQlTeXN0ZW0ub3V0Ci0JCQkJCQkucHJpbnRsbigiIyMjIC0gRVJST1IgY2xvc2luZyBwcm9qZWN0IGZvciBsaWJyYXJ5IGluIFwiIiArIGRpciArICJcIjogcHJvamVjdCBjb3VsZCBub3QgYmUgZm91bmQuIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJfQotCQl9Ci0JfQotCi0JCQotCS8qKgotCSAqIExvY2F0ZXMgdGhlIHByb2plY3Qgd2l0aCB0aGUgc2FtZSBsb2NhdGlvbiBhcyB0aGUgbGlicmFyeSdzIGRpcmVjdG9yeS4KLQkgKiAKLQkgKiBAcGFyYW0gbGliIE1ldGhvZExpYnJhcnkKLQkgKiBAcmV0dXJuIElQcm9qZWN0Ci0JICovCi0JcHVibGljIHN0YXRpYyBJUHJvamVjdCBmaW5kUHJvamVjdChNZXRob2RMaWJyYXJ5IGxpYikgewotCQlyZXR1cm4gZmluZFByb2plY3QoZ2V0TGlicmFyeURpcmVjdG9yeShsaWIpKTsKLQl9Ci0KLQkvKioKLQkgKiBMb2NhdGVzdCB0aGUgcHJvamVjdCB3aG9zZSBsb2NhdGlvbiBtYXRjaGVzIHRoZSBzcGVjaWZpZWQgZGlyZWN0b3J5LgotCSAqIAotCSAqIEBwYXJhbSBkaXIgU3RyaW5nCi0JICogQHJldHVybiBJUHJvamVjdAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVByb2plY3QgZmluZFByb2plY3QoU3RyaW5nIGRpcikgewotCQlmaW5hbCBJV29ya3NwYWNlIHdvcmtzcGFjZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKTsKLQkJSVByb2plY3RbXSBwcm9qZWN0cyA9IHdvcmtzcGFjZS5nZXRSb290KCkuZ2V0UHJvamVjdHMoKTsKLQkJdHJ5IHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcHJvamVjdHMubGVuZ3RoOyBpKyspIHsKLQkJCQlJUHJvamVjdCBwcm9qZWN0ID0gcHJvamVjdHNbaV07Ci0JCQkJaWYgKG5ldyBGaWxlKGRpcikuY29tcGFyZVRvKHByb2plY3QuZ2V0TG9jYXRpb24oKS50b0ZpbGUoKSkgPT0gMCkgewotCQkJCQlpZiAoZGVidWcpIHsKLQkJCQkJCVN5c3RlbS5vdXQKLQkJCQkJCQkJLnByaW50bG4oIiMjIyAtIGZvdW5kIHByb2plY3QgIiArIHByb2plY3QuZ2V0TmFtZSgpICsgIiB3aXRoIGxvY2F0aW9uICIgKyBkaXIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJfQotCQkJCQlyZXR1cm4gcHJvamVjdDsKLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJZXgucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQlMaWJyYXJ5UGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihleCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogRGVsZXRlcyB0aGUgcHJvamVjdCB3aG9zZSBsb2NhdGlvbiBpcyB0aGUgc2FtZSBhcyB0aGUgbGlicmFyeS4KLQkgKiAKLQkgKiBAcGFyYW0gbGliIE1ldGhvZExpYnJhcnkKLQkgKiBAcGFyYW0gbW9uaXRvciBJUHJvZ3Jlc3NNb25pdG9yCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIGRlbGV0ZVByb2plY3QoTWV0aG9kTGlicmFyeSBsaWIsCi0JCQlJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGRlbGV0ZVByb2plY3QoZ2V0TGlicmFyeURpcmVjdG9yeShsaWIpLCBtb25pdG9yKTsKLQl9Ci0KLQkvKioKLQkgKiBEZWxldGVzIHRoZSBwcm9qZWN0IHdob3NlIGxvY2F0aW9uIGlzIHRoZSBzYW1lIGFzIHRoZSBnaXZlbiBwYXRoLgotCSAqIAotCSAqIEBwYXJhbSBwYXRoCi0JICogQHBhcmFtIG1vbml0b3IKLQkgKiBAcmV0dXJuCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBkZWxldGVQcm9qZWN0KFN0cmluZyBwYXRoLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCi0JCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCS8vIGRlbGV0ZSBhbnkgd29ya3NwYWNlIHByb2plY3QgdGhhdCBleGlzdHMgZm9yIHRoaXMgcGF0aAotCQlJUHJvamVjdCBwcm9qZWN0ID0gZmluZFByb2plY3QocGF0aCk7Ci0JCXRyeSB7Ci0JCQlpZiAocHJvamVjdCAhPSBudWxsKSB7Ci0JCQkJaWYgKGRlYnVnKSB7Ci0JCQkJCVN5c3RlbS5vdXQKLQkJCQkJCQkucHJpbnRsbigiIyMjIC0gZGVsZXRpbmcgcHJvamVjdCAiICsgcHJvamVjdC5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJCWlmIChtb25pdG9yID09IG51bGwpIHsKLQkJCQkJbW9uaXRvciA9IG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCk7Ci0JCQkJfQotCQkJCXByb2plY3QuZGVsZXRlKElQcm9qZWN0LkZPUkNFCi0JCQkJCQl8IElQcm9qZWN0Lk5FVkVSX0RFTEVURV9QUk9KRUNUX0NPTlRFTlQsIG1vbml0b3IpOwotCQkJfQotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGV4KSB7Ci0JCQlleC5wcmludFN0YWNrVHJhY2UoKTsKLQkJCUxpYnJhcnlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGV4KTsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgcHJvamVjdCBmb3IgdGhlIGxpYnJhcnkuCi0JICogCi0JICogQHJldHVybiBudWxsIGlmIHRoZSBsaWJyYXJ5IGlzIG5vdCBpbiBhIHZhbGlkIHByb2plY3QgbG9jYXRpb24gKGllLAotCSAqICAgICAgICAgb3ZlcmxhcHMgdGhlIHdvcmtzcGFjZSkuCi0JICovCi0JcHVibGljIHN0YXRpYyBJUHJvamVjdCBjcmVhdGVQcm9qZWN0KE1ldGhvZExpYnJhcnkgbGliLAotCQkJSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCXJldHVybiBjcmVhdGVWYWxpZFByb2plY3RGcm9tUGF0aChnZXRMaWJyYXJ5RGlyZWN0b3J5KGxpYiksIG1vbml0b3IpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBwcm9qZWN0IGZvciB0aGUgcGF0aCBzcGVjaWZpZWQsIHVzaW5nIHRoZSBsYXN0IHBhdGggZnJhZ21lbnQgYXMKLQkgKiB0aGUgcHJvamVjdCBuYW1lLiBXaWxsIGFwcGVuZCBpbmNyZWFzaW5nIGludGVnZXJzIHRvIHRoZSBwcm9qZWN0IG5hbWUgaW4KLQkgKiBvcmRlciB0byBjcmVhdGUgYSB2YWxpZCBwcm9qZWN0LiBGaXJzdCBkZWxldGVzIGFueSB3b3Jrc3BhY2UgcHJvamVjdAotCSAqIHdob3NlIGxvY2F0aW9uIGlzIHRoZSBnaXZlbiBwYXRoLgotCSAqIAotCSAqIEBwYXJhbSBwYXRoCi0JICogQHBhcmFtIG1vbml0b3IKLQkgKiBAcmV0dXJuIElQcm9qZWN0Ci0JICovCi0JcHVibGljIHN0YXRpYyBJUHJvamVjdCBjcmVhdGVWYWxpZFByb2plY3RGcm9tUGF0aChTdHJpbmcgcGF0aCwKLQkJCUlQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkvLyBkZWxldGUgYW55IHdvcmtzcGFjZSBwcm9qZWN0IHRoYXQgZXhpc3RzIGZvciB0aGlzIHBhdGgKLQkJSVByb2plY3QgcHJvamVjdCA9IGZpbmRQcm9qZWN0KHBhdGgpOwotCQl0cnkgewotCQkJaWYgKHByb2plY3QgIT0gbnVsbCkgewotCQkJCXByb2plY3QuZGVsZXRlKElQcm9qZWN0LkZPUkNFCi0JCQkJCQl8IElQcm9qZWN0Lk5FVkVSX0RFTEVURV9QUk9KRUNUX0NPTlRFTlQsIG1vbml0b3IpOwotCQkJfQotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGV4KSB7Ci0JCQlMaWJyYXJ5UGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihleCk7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCVN0cmluZyBsaWJOYW1lID0gbmV3IEZpbGUocGF0aCkuZ2V0TmFtZSgpOwotCQlTdHJpbmcgbGliRGlyID0gbmV3IEZpbGUocGF0aCkuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0KLQkJU3RyaW5nIHByb2plY3ROYW1lID0gbGliTmFtZTsKLQkJaW50IGkgPSAyOwotCQl3aGlsZSAoaSA8IDEwMCkgewotCQkJdHJ5IHsKLQkJCQlwcm9qZWN0ID0gY3JlYXRlUHJvamVjdChsaWJEaXIsIHByb2plY3ROYW1lLCBtb25pdG9yKTsKLQkJCQlpZiAoZGVidWcpIHsKLQkJCQkJU3lzdGVtLm91dAotCQkJCQkJCS5wcmludGxuKCIjIyMgLSBjcmVhdGluZyBuZXcgbWV0aG9kIGxpYnJhcnkgcHJvamVjdCAiICsgcHJvamVjdE5hbWUpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJCXJldHVybiBwcm9qZWN0OwotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBleCkgewotCQkJCXByb2plY3ROYW1lID0gbmV3IFN0cmluZ0J1ZmZlcihsaWJOYW1lKS5hcHBlbmQoJyAnKS5hcHBlbmQoaSsrKQotCQkJCQkJLnRvU3RyaW5nKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQXR0ZW1wdHMgdG8gY3JlYXRlIGEgcHJvamVjdCBuYW1lZCBwcm9qZWN0TmFtZSBpbiB0aGUgZGlyZWN0b3J5IGRpci4KLQkgKiBUaHJvd3MgQ29yZUV4Y2VwdGlvbiBpZiB0aGlzIGZhaWxzIGZvciBhbnkgcmVhc29uLgotCSAqIAotCSAqIEBwYXJhbSBkaXIKLQkgKiBAcGFyYW0gcHJvamVjdE5hbWUKLQkgKiBAcGFyYW0gbW9uaXRvcgotCSAqIEByZXR1cm4KLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBJUHJvamVjdCBjcmVhdGVQcm9qZWN0KFN0cmluZyBkaXIsIFN0cmluZyBwcm9qZWN0TmFtZSwKLQkJCUlQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJV29ya3NwYWNlIHdvcmtzcGFjZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKTsKLQotCQkvLyBnZXQgYSBwcm9qZWN0IGhhbmRsZQotCQlJUHJvamVjdCBuZXdQcm9qZWN0SGFuZGxlID0gd29ya3NwYWNlLmdldFJvb3QoKS5nZXRQcm9qZWN0KHByb2plY3ROYW1lKTsKLQkJSVByb2plY3REZXNjcmlwdGlvbiBkZXNjcmlwdGlvbiA9IHdvcmtzcGFjZQotCQkJCS5uZXdQcm9qZWN0RGVzY3JpcHRpb24obmV3UHJvamVjdEhhbmRsZS5nZXROYW1lKCkpOwotCQlkZXNjcmlwdGlvbi5zZXROYXR1cmVJZHMobWV0aG9kTGlicmFyeU5hdHVyZXMpOwotCQlJUGF0aCBwcm9qZWN0UGF0aCA9IG5ldyBQYXRoKGRpcik7Ci0JCWlmICghUGxhdGZvcm0uZ2V0TG9jYXRpb24oKS5pc1ByZWZpeE9mKHByb2plY3RQYXRoKSkgewotCQkJZGVzY3JpcHRpb24uc2V0TG9jYXRpb24ocHJvamVjdFBhdGgpOwotCQl9Ci0KLQkJbmV3UHJvamVjdEhhbmRsZS5jcmVhdGUoZGVzY3JpcHRpb24sIG1vbml0b3IpOwotCQlyZXR1cm4gbmV3UHJvamVjdEhhbmRsZTsKLQl9Ci0KLQkvKioKLQkgKiBDbG9zZXMgYWxsIChvcGVuKSBwcm9qZWN0cyB0aGF0IGhhdmUgdGhlIE1ldGhvZExpYnJhcnkgbmF0dXJlCi0JICogCi0JICogQHBhcmFtIG1vbml0b3IgSVByb2dyZXNzTW9uaXRvcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBjbG9zZUFsbE1ldGhvZExpYnJhcnlQcm9qZWN0cyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJZmluYWwgSVdvcmtzcGFjZSB3b3Jrc3BhY2UgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCk7Ci0JCUlQcm9qZWN0W10gcHJvamVjdHMgPSB3b3Jrc3BhY2UuZ2V0Um9vdCgpLmdldFByb2plY3RzKCk7Ci0JCXRyeSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHByb2plY3RzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJSVByb2plY3QgcHJvamVjdCA9IHByb2plY3RzW2ldOwotCQkJCWlmIChwcm9qZWN0LmlzT3BlbigpCi0JCQkJCQkmJiBwcm9qZWN0LmdldE5hdHVyZShtZXRob2RMaWJyYXJ5TmF0dXJlKSAhPSBudWxsKSB7Ci0JCQkJCWlmIChkZWJ1ZykgewotCQkJCQkJU3lzdGVtLm91dAotCQkJCQkJCQkucHJpbnRsbigiIyMjIC0gY2xvc2luZyBtZXRob2QgbGlicmFyeSBwcm9qZWN0ICIgKyBwcm9qZWN0LmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCQlwcm9qZWN0LmNsb3NlKG1vbml0b3IpOwotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBleCkgewotCQkJZXgucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQlMaWJyYXJ5UGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihleCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gbGliIE1ldGhvZExpYnJhcnkKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldExpYnJhcnlEaXJlY3RvcnkoTWV0aG9kTGlicmFyeSBsaWIpIHsKLQkJcmV0dXJuIG5ldyBGaWxlKGxpYi5lUmVzb3VyY2UoKS5nZXRVUkkoKS50b0ZpbGVTdHJpbmcoKSkuZ2V0UGFyZW50KCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIHVzZWRSZXNvdXJjZXMKLQkgKiBAcmV0dXJuIENvbGxlY3Rpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIENvbGxlY3Rpb248UmVzb3VyY2U+IGdldE91dE9mU3luY1Jlc291cmNlcyhDb2xsZWN0aW9uPFJlc291cmNlPiB1c2VkUmVzb3VyY2VzKSB7Ci0JCUFycmF5TGlzdDxSZXNvdXJjZT4gY2hhbmdlZFJlc291cmNlcyA9IG5ldyBBcnJheUxpc3Q8UmVzb3VyY2U+KCk7Ci0JCWZvciAoUmVzb3VyY2UgcmVzb3VyY2UgOiB1c2VkUmVzb3VyY2VzKSB7Ci0JCQlTdHJpbmcgZmlsZVBhdGggPSByZXNvdXJjZS5nZXRVUkkoKS50b0ZpbGVTdHJpbmcoKTsKLQkJCUlSZXNvdXJjZSB3c1JlcyA9IEZpbGVNYW5hZ2VyLmdldFJlc291cmNlRm9yTG9jYXRpb24oZmlsZVBhdGgpOwotCQkJaWYod3NSZXMgIT0gbnVsbCAmJiAhd3NSZXMuaXNTeW5jaHJvbml6ZWQoSVJlc291cmNlLkRFUFRIX1pFUk8pKSB7Ci0JCQkJY2hhbmdlZFJlc291cmNlcy5hZGQocmVzb3VyY2UpOwotCQkJfQotCi0JCX0KLQkJcmV0dXJuIGNoYW5nZWRSZXNvdXJjZXM7Ci0JfQkKLQkKLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gcmVzb3VyY2VzIENvbGxlY3Rpb24KLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaGFzT3V0T2ZTeW5jaChDb2xsZWN0aW9uPFJlc291cmNlPiByZXNvdXJjZXMpIHsKLQkJZm9yIChSZXNvdXJjZSByZXNvdXJjZSA6IHJlc291cmNlcykgewotCQkJaWYocmVzb3VyY2UuZ2V0VVJJKCkuaXNGaWxlKCkpIHsKLQkJCQlTdHJpbmcgZmlsZVBhdGggPSByZXNvdXJjZS5nZXRVUkkoKS50b0ZpbGVTdHJpbmcoKTsKLQkJCQlJUmVzb3VyY2Ugd3NSZXMgPSBGaWxlTWFuYWdlci5nZXRSZXNvdXJjZUZvckxvY2F0aW9uKGZpbGVQYXRoKTsKLQkJCQlpZih3c1JlcyAhPSBudWxsICYmICF3c1Jlcy5pc1N5bmNocm9uaXplZChJUmVzb3VyY2UuREVQVEhfWkVSTykpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQotCQl9CQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSByZXNvdXJjZXNUb0NoZWNrIENvbGxlY3Rpb24KLQkgKiBAcGFyYW0gcmVtb3ZlZFJlc291cmNlcyBDb2xsZWN0aW9uCi0JICogQHBhcmFtIGNoYW5nZWRSZXNvdXJjZXMgQ29sbGVjdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBjaGVja091dE9mU3luY2hSZXNvdXJjZXMoQ29sbGVjdGlvbiByZXNvdXJjZXNUb0NoZWNrLCAKLQkJCUNvbGxlY3Rpb24gcmVtb3ZlZFJlc291cmNlcywgQ29sbGVjdGlvbiBjaGFuZ2VkUmVzb3VyY2VzKQotCXsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gcmVzb3VyY2VzVG9DaGVjay5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCVJlc291cmNlIHJlc291cmNlID0gKFJlc291cmNlKSBpdGVyLm5leHQoKTsKLQkJCVN0cmluZyBmaWxlUGF0aCA9IHJlc291cmNlLmdldFVSSSgpLnRvRmlsZVN0cmluZygpOwotCQkJSVJlc291cmNlIHdzUmVzID0gRmlsZU1hbmFnZXIuZ2V0UmVzb3VyY2VGb3JMb2NhdGlvbihmaWxlUGF0aCk7Ci0JCQlpZih3c1JlcyA9PSBudWxsKSB7Ci0JCQkJcmVtb3ZlZFJlc291cmNlcy5hZGQocmVzb3VyY2UpOwotCQkJfQotCQkJZWxzZSBpZighd3NSZXMuaXNTeW5jaHJvbml6ZWQoSVJlc291cmNlLkRFUFRIX1pFUk8pKSB7Ci0JCQkJY2hhbmdlZFJlc291cmNlcy5hZGQocmVzb3VyY2UpOwotCQkJfQotCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gbGliIE1ldGhvZExpYnJhcnkKLQkgKiBAcGFyYW0gbW9uaXRvciBJUHJvZ3Jlc3NNb25pdG9yCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlZnJlc2hSZXNvdXJjZXMoTWV0aG9kTGlicmFyeSBsaWIsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlpZihsaWIgIT0gbnVsbCkgewotCQkJSVByb2plY3QgcHJqID0gTWV0aG9kTGlicmFyeVByb2plY3QuZmluZFByb2plY3QobGliKTsKLQkJCWlmKHByaiAhPSBudWxsKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJcHJqLnJlZnJlc2hMb2NhbChJUmVzb3VyY2UuREVQVEhfSU5GSU5JVEUsIG1vbml0b3IpOwotCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQlMaWJyYXJ5UGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3V0aWwvU0FYUGFyc2VyWE1JLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdXRpbC9TQVhQYXJzZXJYTUkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTk5MzNkOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdXRpbC9TQVhQYXJzZXJYTUkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuRW1wdHlTdGFja0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlN0YWNrOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnNlcnZpY2VhYmlsaXR5LkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnhtbC5BYnN0cmFjdFNBWFBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UuTXVsdGlGaWxlWE1JU2F2ZUltcGwuTXlFc2NhcGU7Ci1pbXBvcnQgb3JnLnhtbC5zYXguQXR0cmlidXRlczsKLQotCi0vKioKLSAqIFRoaXMgY2xhc3MgcGFyc2VzIGFuIFhNSSBmaWxlLCBhbmQgc3RvcmVzIHRoZSBkYXRhIGluIGEgSGFzaE1hcCBjYWxsZWQgYW4KLSAqICJlTWFwIi4KLSAqIDxwPgotICogQW4gZU1hcCBoYXMgNCBlbnRyaWVzOgotICogPGxpPiJ0YWciIC0gdGhlIGVsZW1lbnQncyB0YWc8L2xpPgotICogPGxpPiJhdHRyaWJ1dGVzIiAtIGFuIEFycmF5TGlzdCBvZiB0aGUgWE1MIGF0dHJpYnV0ZXMuIEVhY2ggYXR0cmlidXRlIGlzIG9mCi0gKiB0aGUgZm9ybSAoYXR0cmlidXRlIG5hbWUpLChhdHRyaWJ1dGUgdmFsdWUpPC9saT4KLSAqIDxsaT4iY29udGVudCIgLSB0aGUgZWxlbWVudCdzIGNvbnRlbnQ8L2xpPgotICogPGxpPiJjaGlsZHJlbiIgLSBhbiBBcnJheUxpc3Qgb2YgdGhlIGVsZW1lbnQncyBzdWItZWxlbWVudHMuIEVhY2ggY2hpbGQgaXMKLSAqIGFuIGVNYXAuPC9saT4KLSAqIDwvcD4KLSAqIDxwPgotICogVGhlIHJvb3QgZWxlbWVudCdzIGVNYXAgaXMgcmVmZXJlbmNlZCBieSBUTkdTQVhQYXJzZXJYTUkueG1pTWFwCi0gKiA8L3A+Ci0gKiAKLSAqIEBhdXRob3IgSmVmZiBIYXJkeQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgU0FYUGFyc2VyWE1JIGV4dGVuZHMgQWJzdHJhY3RTQVhQYXJzZXIgewotCi0JcHVibGljIEhhc2hNYXAgeG1pTWFwOwotCi0JLy8gcHJpdmF0ZSBpbnQgZWxlbWVudENvdW50ID0gMDsKLQlwcml2YXRlIFN0YWNrIHN0YWNrOwotCi0JcHJpdmF0ZSBNeUVzY2FwZSBlc2NhcGUgPSBuZXcgTXlFc2NhcGUoKTsKLQotCXB1YmxpYyBTQVhQYXJzZXJYTUkoTG9nZ2VyIGxvZ2dlcikgewotCQkvLyB2YWxpZGF0aW5nIGlzIGZhbHNlIHNpbmNlIHdlIGRvbid0IGhhdmUgYSBEVEQKLQkJc3VwZXIobG9nZ2VyLCBmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogQ2FsbGVkIHdoZW4gdGhlIFhNTCBwYXJzZXIgc3RhcnRzIHRvIHBhcnNlIHRoZSBkb2N1bWVudC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydERvY3VtZW50KCkgewotCQlzdXBlci5zdGFydERvY3VtZW50KCk7Ci0JCXN0YWNrID0gbmV3IFN0YWNrKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgZW5kRG9jdW1lbnQoKSB7Ci0JCXN1cGVyLmVuZERvY3VtZW50KCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnRFbGVtZW50KFN0cmluZyBuYW1lc3BhY2VVUkwsIFN0cmluZyBsb2NhbE5hbWUsCi0JCQlTdHJpbmcgcW5hbWUsIEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgewotCQlIYXNoTWFwIGVNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQl0cnkgewotCQkJSGFzaE1hcCBwYXJlbnQgPSAoSGFzaE1hcCkgc3RhY2sucGVlaygpOwotCQkJKChBcnJheUxpc3QpIHBhcmVudC5nZXQoImNoaWxkcmVuIikpLmFkZChlTWFwKTsgLy8kTk9OLU5MUy0xJAotCQl9IGNhdGNoIChFbXB0eVN0YWNrRXhjZXB0aW9uIGUpIHsKLQkJCXhtaU1hcCA9IGVNYXA7Ci0JCX0KLQotCQkvLyBwdXQgdGFnCi0JCWVNYXAucHV0KCJ0YWciLCBxbmFtZSk7IC8vJE5PTi1OTFMtMSQKLQotCQkvLyBwdXQgYXR0cmlidXRlTWFwCi0JCUxpc3QgYXR0cmlidXRlTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJaWYgKGF0dHJpYnV0ZXMuZ2V0TGVuZ3RoKCkgPiAwKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGF0dHJpYnV0ZXMuZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJCWF0dHJpYnV0ZUxpc3QuYWRkKGF0dHJpYnV0ZXMuZ2V0UU5hbWUoaSkKLQkJCQkJCSsgIiwiICsgYXR0cmlidXRlcy5nZXRWYWx1ZShpKSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCi0JCXN0ckJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQotCQllTWFwLnB1dCgiYXR0cmlidXRlcyIsIGF0dHJpYnV0ZUxpc3QpOyAvLyROT04tTkxTLTEkCi0KLQkJZU1hcC5wdXQoImNoaWxkcmVuIiwgbmV3IEFycmF5TGlzdCgpKTsgLy8kTk9OLU5MUy0xJAotCQlzdGFjay5wdXNoKGVNYXApOwotCX0KLQotCXB1YmxpYyB2b2lkIGVuZEVsZW1lbnQoU3RyaW5nIG5hbWVzcGFjZVVSTCwgU3RyaW5nIGxvY2FsTmFtZSwgU3RyaW5nIHFuYW1lKSB7Ci0JCXRyeSB7Ci0JCQlIYXNoTWFwIGVNYXAgPSAoSGFzaE1hcCkgc3RhY2sucGVlaygpOwotCQkJTGlzdCBhdHRyaWJ1dGVMaXN0ID0gKEFycmF5TGlzdCkgZU1hcC5nZXQoImF0dHJpYnV0ZXMiKTsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKGF0dHJpYnV0ZUxpc3Quc2l6ZSgpID09IDApCi0JCQkJaWYgKHN0ckJ1Zi50b1N0cmluZygpLnRyaW0oKS5sZW5ndGgoKSA+IDApIHsKLQkJCQkJZU1hcC5wdXQoImNvbnRlbnQiLCBlc2NhcGUuY29udmVydExpbmVzKHN0ckJ1Zi50b1N0cmluZygpKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCX0gY2F0Y2ggKEVtcHR5U3RhY2tFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCQlzdGFjay5wb3AoKTsKLQl9Ci0KLQkvKioKLQkgKiBGb3IgdXNlIHdpdGggVE5HU0FYUGFyc2VyWE1JLiBGaW5kIGEgZ3VpZCdzIGVsZW1lbnQgdGFnIHdpdGhpbiB0aGUgWE1JCi0JICogZmlsZS4KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudFRhZwotCSAqIEBwYXJhbSBndWlkCi0JICogQHBhcmFtIHhtaU1hcAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEhhc2hNYXAgZmluZEVsZW1lbnRUYWdvZkd1aWQoU3RyaW5nIGVsZW1lbnRUYWcsIFN0cmluZyBndWlkLAotCQkJSGFzaE1hcCB4bWlNYXApIHsKLQkJSGFzaE1hcCBlTWFwID0gU0FYUGFyc2VyWE1JLmZpbmRHdWlkKGd1aWQsIHhtaU1hcCk7Ci0KLQkJLy8gd2UgaGF2ZSBoYXNobWFwIG9mIHRoZSBndWlkJ3MgZWxlbWVudCAtIHNlYXJjaCBjaGlsZHJlbiBmb3IgdGhlCi0JCS8vIGVsZW1lbnRUYWcKLQkJSXRlcmF0b3IgaXRlciA9ICgoQXJyYXlMaXN0KSBlTWFwLmdldCgiY2hpbGRyZW4iKSkuaXRlcmF0b3IoKTsgLy8kTk9OLU5MUy0xJAotCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCUhhc2hNYXAgY2hpbGRNYXAgPSAoSGFzaE1hcCkgaXRlci5uZXh0KCk7Ci0JCQlpZiAoU0FYUGFyc2VyWE1JLmdldFRhZyhjaGlsZE1hcCkuZXF1YWxzKGVsZW1lbnRUYWcpKQotCQkJCXJldHVybiBjaGlsZE1hcDsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBGb3IgdXNlIHdpdGggVE5HU0FYUGFyc2VyWE1JLiBzZWFyY2hlcyBlTWFwJ3MgY2hpbGRyZW4gZm9yIGVsZW1lbnRUYWcKLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudFRhZwotCSAqIEBwYXJhbSBlTWFwCi0JICogQHJldHVybiBIYXNoTWFwCi0JICovCi0JcHVibGljIHN0YXRpYyBIYXNoTWFwIGdldENoaWxkRWxlbWVudFRhZyhTdHJpbmcgZWxlbWVudFRhZywgSGFzaE1hcCBlTWFwKSB7Ci0JCS8vIHNlYXJjaCBjaGlsZHJlbiBmb3IgdGhlIGVsZW1lbnRUYWcKLQkJSXRlcmF0b3IgaXRlciA9ICgoQXJyYXlMaXN0KSBlTWFwLmdldCgiY2hpbGRyZW4iKSkuaXRlcmF0b3IoKTsgLy8kTk9OLU5MUy0xJAotCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCUhhc2hNYXAgY2hpbGRNYXAgPSAoSGFzaE1hcCkgaXRlci5uZXh0KCk7Ci0JCQlpZiAoU0FYUGFyc2VyWE1JLmdldFRhZyhjaGlsZE1hcCkuZXF1YWxzKGVsZW1lbnRUYWcpKQotCQkJCXJldHVybiBjaGlsZE1hcDsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBGb3IgdXNlIHdpdGggVE5HU0FYUGFyc2VyWE1JLiByZXR1cm5zIFRhZyBvZiBlbGVtZW50LiBEb2VzIG5vdCByZXR1cm4KLQkgKiBudWxsLCByZXR1cm5zICIiIGluc3RlYWQuCi0JICogCi0JICogQHBhcmFtIGVNYXAKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFRhZyhIYXNoTWFwIGVNYXApIHsKLQkJU3RyaW5nIHRhZyA9ICIiOyAvLyROT04tTkxTLTEkCi0JCWlmIChlTWFwICE9IG51bGwpCi0JCQl0YWcgPSAoU3RyaW5nKSBlTWFwLmdldCgidGFnIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKHRhZyAhPSBudWxsKQotCQkJcmV0dXJuIHRhZzsKLQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogRm9yIHVzZSB3aXRoIFROR1NBWFBhcnNlclhNSS4gZ2V0cyBjb250ZW50IG9mIGVsZW1lbnQgLSBjYW4gYmUgbnVsbAotCSAqIAotCSAqIEBwYXJhbSBlTWFwCi0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRFbGVtZW50Q29udGVudChIYXNoTWFwIGVNYXApIHsKLQkJU3RyaW5nIGNvbnRlbnQgPSBudWxsOwotCQlpZiAoZU1hcCAhPSBudWxsKQotCQkJY29udGVudCA9IChTdHJpbmcpIGVNYXAuZ2V0KCJjb250ZW50Iik7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIGNvbnRlbnQ7Ci0JfQotCi0JLyoqCi0JICogRmluZHMgYSBndWlkIGNvbnRhaW5lZCB3aXRoaW4gdGhlIGdpdmVuIGVNYXAgLSBjYW4gcmV0dXJuIG51bGwKLQkgKiAKLQkgKiBAcGFyYW0gZ3VpZAotCSAqICAgICAgICAgICAgZ3VpZCB0byBmaW5kCi0JICogQHBhcmFtIGVNYXAKLQkgKiAgICAgICAgICAgIHVzZSBUTkdTQVhQYXJzZXJYTUkueG1pTWFwLCBvciBhIHN1Yi1lTWFwCi0JICogQHJldHVybiBIYXNoTWFwCi0JICovCi0JcHVibGljIHN0YXRpYyBIYXNoTWFwIGZpbmRHdWlkKFN0cmluZyBndWlkLCBIYXNoTWFwIGVNYXApIHsKLQkJQXJyYXlMaXN0IGF0dExpc3QgPSAoQXJyYXlMaXN0KSBlTWFwLmdldCgiYXR0cmlidXRlcyIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChndWlkLmVxdWFscyhTQVhQYXJzZXJYTUkuZ2V0R3VpZE9mTGlzdChhdHRMaXN0KSkpCi0JCQlyZXR1cm4gZU1hcDsKLQotCQlJdGVyYXRvciBpdGVyID0gKChBcnJheUxpc3QpIGVNYXAuZ2V0KCJjaGlsZHJlbiIpKS5pdGVyYXRvcigpOyAvLyROT04tTkxTLTEkCi0JCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJSGFzaE1hcCBjaGlsZE1hcCA9IChIYXNoTWFwKSBpdGVyLm5leHQoKTsKLQkJCUhhc2hNYXAgcmVzdWx0ID0gZmluZEd1aWQoZ3VpZCwgY2hpbGRNYXApOwotCQkJaWYgKHJlc3VsdCAhPSBudWxsKQotCQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogRm9yIHVzZSB3aXRoIFROR1NBWFBhcnNlclhNSS4KLQkgKiAKLQkgKiBAcGFyYW0gYXR0TGlzdAotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0R3VpZE9mTGlzdChBcnJheUxpc3QgYXR0TGlzdCkgewotCQlJdGVyYXRvciBpdGVyID0gYXR0TGlzdC5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCVN0cmluZyBhdHRwYWlyID0gKFN0cmluZykgaXRlci5uZXh0KCk7Ci0JCQlTdHJpbmcgYXR0bmFtZSA9IGF0dHBhaXIuc3Vic3RyaW5nKDAsIGF0dHBhaXIuaW5kZXhPZigiLCIpKTsgLy8kTk9OLU5MUy0xJAotCQkJU3RyaW5nIGF0dHZhbCA9IGF0dHBhaXIuc3Vic3RyaW5nKGF0dHBhaXIuaW5kZXhPZigiLCIpICsgMSk7IC8vJE5PTi1OTFMtMSQKLQkJCWlmIChhdHRuYW1lLmVxdWFscygiZ3VpZCIpKSAvLyROT04tTkxTLTEkCi0JCQkJcmV0dXJuIGF0dHZhbDsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBGb3IgdXNlIHdpdGggVE5HU0FYUGFyc2VyWE1JIHdoZW4gcGFyc2luZyByZXNtZ3IueG1pCi0JICogCi0JICogQHBhcmFtIGF0dExpc3QKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldElkT2ZMaXN0KEFycmF5TGlzdCBhdHRMaXN0KSB7Ci0JCUl0ZXJhdG9yIGl0ZXIgPSBhdHRMaXN0Lml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJU3RyaW5nIGF0dHBhaXIgPSAoU3RyaW5nKSBpdGVyLm5leHQoKTsKLQkJCVN0cmluZyBhdHRuYW1lID0gYXR0cGFpci5zdWJzdHJpbmcoMCwgYXR0cGFpci5pbmRleE9mKCIsIikpOyAvLyROT04tTkxTLTEkCi0JCQlTdHJpbmcgYXR0dmFsID0gYXR0cGFpci5zdWJzdHJpbmcoYXR0cGFpci5pbmRleE9mKCIsIikgKyAxKTsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKGF0dG5hbWUuZXF1YWxzKCJpZCIpKSAvLyROT04tTkxTLTEkCi0JCQkJcmV0dXJuIGF0dHZhbDsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gZU1hcAotCSAqIEByZXR1cm4gVVJJCi0JICovCi0JcHVibGljIHN0YXRpYyBVUkkgZ2V0UHJlc2VudGF0aW9uVXJpT2ZFbGVtZW50KEhhc2hNYXAgZU1hcCkgewotCQlpZiAoZU1hcCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCVN0cmluZyB0YWcgPSBTQVhQYXJzZXJYTUkuZ2V0VGFnKGVNYXApOwotCi0JCS8vIC8vIGNoZWNrIHRvIHNlZSBpZiB0aGlzIGlzIGFuIGJyZWFrZG93bkVsZW1lbnQgLSBpZiBzbywgcmV0dXJuIG51bGwKLQkJLy8gLy8gYmVjYXVzZSB3aGlsZSBicmVha2Rvd25FbGVtZW50cyBoYXZlIHByZXNlbnRhdGlvbnMsIHRoZXkgYXJlIG5vdAotCQkvLyB1c2VkLgotCQkvLyBpZiAodGFnLmVxdWFscygiYnJlYWtkb3duRWxlbWVudHMiKSkgewotCQkvLyByZXR1cm4gbnVsbDsKLQkJLy8gfQotCQkvLyAvLyBwcm9jZXNzZXMgZG9uJ3QgdXNlIHRoZWlyIHByZXNlbnRhdGlvbiBlaXRoZXIKLQkJLy8gaWYgKHRhZy5lcXVhbHMoInByb2Nlc3MiKSkgewotCQkvLyByZXR1cm4gbnVsbDsKLQkJLy8gfQotCi0JCS8vIGxvb2sgZm9yIGNoaWxkUGFja2FnZSBwcmVzZW50YXRpb25zLCB3aGljaCBhcmUgYW4gaHJlZiBhdHRyaWJ1dGUKLQkJaWYgKHRhZy5lcXVhbHMoImNoaWxkUGFja2FnZXMiKSkgeyAvLyROT04tTkxTLTEkCi0JCQlBcnJheUxpc3QgYXR0TGlzdCA9IChBcnJheUxpc3QpIGVNYXAuZ2V0KCJhdHRyaWJ1dGVzIik7IC8vJE5PTi1OTFMtMSQKLQkJCUl0ZXJhdG9yIGl0ZXIgPSBhdHRMaXN0Lml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCQlTdHJpbmcgYXR0cGFpciA9IChTdHJpbmcpIGl0ZXIubmV4dCgpOwotCQkJCVN0cmluZyBhdHRuYW1lID0gYXR0cGFpci5zdWJzdHJpbmcoMCwgYXR0cGFpci5pbmRleE9mKCIsIikpOyAvLyROT04tTkxTLTEkCi0JCQkJU3RyaW5nIGF0dHZhbCA9IGF0dHBhaXIuc3Vic3RyaW5nKGF0dHBhaXIuaW5kZXhPZigiLCIpICsgMSk7IC8vJE5PTi1OTFMtMSQKLQkJCQlpZiAoYXR0bmFtZS5lcXVhbHMoImhyZWYiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCXRyeSB7Ci0JCQkJCQlVUkkgdXJpID0gVVJJLmNyZWF0ZVVSSShhdHR2YWwpOwotCQkJCQkJcmV0dXJuIHVyaTsKLQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCQlleC5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQkJfQotCQkJCQkvLyBpZiAoYXR0dmFsLmluZGV4T2YoInVtYTovLyIpICE9IC0xKSB7Ci0JCQkJCS8vIFN0cmluZyBwcmVzSWQgPQotCQkJCQkvLyBhdHR2YWwuc3Vic3RyaW5nKGF0dHZhbC5pbmRleE9mKCJ1bWE6Ly8iKSs2KTsKLQkJCQkJLy8gcmV0dXJuIHByZXNJZDsKLQkJCQkJLy8gfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCUFycmF5TGlzdCBjaGlsZExpc3QgPSAoQXJyYXlMaXN0KSBlTWFwLmdldCgiY2hpbGRyZW4iKTsgLy8kTk9OLU5MUy0xJAotCQlJdGVyYXRvciBpdGVyID0gY2hpbGRMaXN0Lml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJSGFzaE1hcCBjaGlsZE1hcCA9IChIYXNoTWFwKSBpdGVyLm5leHQoKTsKLQkJCXRhZyA9IFNBWFBhcnNlclhNSS5nZXRUYWcoY2hpbGRNYXApOwotCQkJaWYgKHRhZy5lcXVhbHMoInByZXNlbnRhdGlvbiIpKSB7IC8vIHx8IC8vJE5PTi1OTFMtMSQKLQkJCQkvLyB0YWcuZXF1YWxzKCJ2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50IikpCi0JCQkJLy8geyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQlBcnJheUxpc3QgYXR0TGlzdCA9IChBcnJheUxpc3QpIGNoaWxkTWFwLmdldCgiYXR0cmlidXRlcyIpOyAvLyROT04tTkxTLTEkCi0JCQkJSXRlcmF0b3IgYXR0SXRlciA9IGF0dExpc3QuaXRlcmF0b3IoKTsKLQkJCQl3aGlsZSAoYXR0SXRlci5oYXNOZXh0KCkpIHsKLQkJCQkJU3RyaW5nIGF0dHBhaXIgPSAoU3RyaW5nKSBhdHRJdGVyLm5leHQoKTsKLQkJCQkJU3RyaW5nIGF0dG5hbWUgPSBhdHRwYWlyLnN1YnN0cmluZygwLCBhdHRwYWlyLmluZGV4T2YoIiwiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJU3RyaW5nIGF0dHZhbCA9IGF0dHBhaXIuc3Vic3RyaW5nKGF0dHBhaXIuaW5kZXhPZigiLCIpICsgMSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJaWYgKGF0dG5hbWUuZXF1YWxzKCJocmVmIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQkJdHJ5IHsKLQkJCQkJCQlVUkkgdXJpID0gVVJJLmNyZWF0ZVVSSShhdHR2YWwpOwotCQkJCQkJCXJldHVybiB1cmk7Ci0JCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCQkJCQlleC5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQkJCX0KLQkJCQkJCS8vIGlmIChhdHR2YWwuaW5kZXhPZigidW1hOi8vIikgIT0gLTEpIHsKLQkJCQkJCS8vIFN0cmluZyBwcmVzSWQgPQotCQkJCQkJLy8gYXR0dmFsLnN1YnN0cmluZyhhdHR2YWwuaW5kZXhPZigidW1hOi8vIikrNik7Ci0JCQkJCQkvLyByZXR1cm4gcHJlc0lkOwotCQkJCQkJLy8gfQotCQkJCQl9Ci0JCQkJfQotCi0JCQkJLy8gaWYgKGF0dExpc3Quc2l6ZSgpID09IDApCi0JCQkJLy8gY29udGludWU7Ci0JCQkJLy8gU3RyaW5nIGF0dHBhaXIgPSAoU3RyaW5nKWF0dExpc3QuZ2V0KDApOwotCQkJCS8vIC8vIFN0cmluZyBhdHRuYW1lID0gYXR0cGFpci5zdWJzdHJpbmcoMCwKLQkJCQkvLyBhdHRwYWlyLmluZGV4T2YoIiwiKSk7Ci0JCQkJLy8gU3RyaW5nIGF0dHZhbCA9IGF0dHBhaXIuc3Vic3RyaW5nKGF0dHBhaXIuaW5kZXhPZigiLCIpKzEpOwotCQkJCS8vIGlmIChhdHR2YWwuaW5kZXhPZigidW1hOi8vIikgIT0gLTEpIHsKLQkJCQkvLyBTdHJpbmcgcHJlc0lkID0gYXR0dmFsLnN1YnN0cmluZyhhdHR2YWwuaW5kZXhPZigidW1hOi8vIikrNik7Ci0JCQkJLy8gcmV0dXJuIHByZXNJZDsKLQkJCQkvLyB9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIGVNYXAKLQkgKiBAcGFyYW0gYXR0cmlidXRlTmFtZQotCSAqIEBwYXJhbSBhdHRyaWJ1dGVWYWx1ZQotCSAqIEByZXR1cm4gSGFzaE1hcAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSGFzaE1hcCBmaW5kRWxlbWVudEJ5QXR0cmlidXRlKEhhc2hNYXAgZU1hcCwKLQkJCVN0cmluZyBhdHRyaWJ1dGVOYW1lLCBTdHJpbmcgYXR0cmlidXRlVmFsdWUpIHsKLQkJLy8gc2VhcmNoIHRoaXMgZU1hcCdzIGNoaWxkcmVuCi0JCUl0ZXJhdG9yIGl0ZXIgPSAoKEFycmF5TGlzdCkgZU1hcC5nZXQoImNoaWxkcmVuIikpLml0ZXJhdG9yKCk7IC8vJE5PTi1OTFMtMSQKLQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlIYXNoTWFwIGNoaWxkTWFwID0gKEhhc2hNYXApIGl0ZXIubmV4dCgpOwotCQkJSGFzaE1hcCByZXN1bHQgPSBmaW5kRWxlbWVudEJ5QXR0cmlidXRlKGNoaWxkTWFwLCBhdHRyaWJ1dGVOYW1lLAotCQkJCQlhdHRyaWJ1dGVWYWx1ZSk7Ci0JCQlpZiAocmVzdWx0ICE9IG51bGwpCi0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCi0JCS8vIHNlYXJjaCB0aGlzIGVNYXAKLQkJaXRlciA9ICgoQXJyYXlMaXN0KSBlTWFwLmdldCgiYXR0cmlidXRlcyIpKS5pdGVyYXRvcigpOyAvLyROT04tTkxTLTEkCi0JCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJU3RyaW5nIGF0dHBhaXIgPSAoU3RyaW5nKSBpdGVyLm5leHQoKTsKLQkJCVN0cmluZyBhdHRuYW1lID0gYXR0cGFpci5zdWJzdHJpbmcoMCwgYXR0cGFpci5pbmRleE9mKCIsIikpOyAvLyROT04tTkxTLTEkCi0JCQlTdHJpbmcgYXR0dmFsID0gYXR0cGFpci5zdWJzdHJpbmcoYXR0cGFpci5pbmRleE9mKCIsIikgKyAxKTsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKGF0dG5hbWUuZXF1YWxzKGF0dHJpYnV0ZU5hbWUpICYmIGF0dHZhbC5lcXVhbHMoYXR0cmlidXRlVmFsdWUpKQotCQkJCXJldHVybiBlTWFwOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBlTWFwCi0JICogQHBhcmFtIGF0dHJpYnV0ZU5hbWUKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEF0dHJpYnV0ZU9mRWxlbWVudChIYXNoTWFwIGVNYXAsCi0JCQlTdHJpbmcgYXR0cmlidXRlTmFtZSkgewotCQlJdGVyYXRvciBpdGVyID0gKChBcnJheUxpc3QpIGVNYXAuZ2V0KCJhdHRyaWJ1dGVzIikpLml0ZXJhdG9yKCk7IC8vJE5PTi1OTFMtMSQKLQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlTdHJpbmcgYXR0cGFpciA9IChTdHJpbmcpIGl0ZXIubmV4dCgpOwotCQkJU3RyaW5nIGF0dG5hbWUgPSBhdHRwYWlyLnN1YnN0cmluZygwLCBhdHRwYWlyLmluZGV4T2YoIiwiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCVN0cmluZyBhdHR2YWwgPSBhdHRwYWlyLnN1YnN0cmluZyhhdHRwYWlyLmluZGV4T2YoIiwiKSArIDEpOyAvLyROT04tTkxTLTEkCi0JCQlpZiAoYXR0bmFtZS5lcXVhbHMoYXR0cmlidXRlTmFtZSkpCi0JCQkJcmV0dXJuIGF0dHZhbDsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91dGlsL1RleHRSZWZlcmVuY2VSZXBsYWNlckltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91dGlsL1RleHRSZWZlcmVuY2VSZXBsYWNlckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTBiYzA0ZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdXRpbC9UZXh0UmVmZXJlbmNlUmVwbGFjZXJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8qKgotICogSW1wbGVtZW50YXRpb24gZm9yIElUZXh0UmVmZXJlbmNlUmVwbGFjZXIuIFVzZWQgaW4gZGVlcCBjb3B5Ci0gKiAKLSAqIEBhdXRob3IgV2VpcGluZyBMdQotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLnJlZ2V4Lk1hdGNoZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5JVGV4dFJlZmVyZW5jZVJlcGxhY2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5NdWx0aUZpbGVTYXZlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNhcGFiaWxpdHlQYXR0ZXJuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcnlQcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLQotcHVibGljIGNsYXNzIFRleHRSZWZlcmVuY2VSZXBsYWNlckltcGwgaW1wbGVtZW50cyBJVGV4dFJlZmVyZW5jZVJlcGxhY2VyIHsKLQkKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgQ0FQQUJJTElUWV9QQVRIID0gTXVsdGlGaWxlU2F2ZVV0aWwuQ0FQQUJJTElUWV9QQVRURVJOX1BBVEggKyAiLyI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgREVMSVZFUllfUEFUSCA9IE11bHRpRmlsZVNhdmVVdGlsLkRFTElWRVJZX1BST0NFU1NfUEFUSCArICIvIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gZGVidWcgPSBMaWJyYXJ5UGx1Z2luLmdldERlZmF1bHQoKS5pc0RlYnVnZ2luZygpOwotCXByaXZhdGUgZmluYWwgc3RhdGljIGJvb2xlYW4gbG9jYWxEZWJ1ZyAgPSBmYWxzZTsJCi0JCi0JcHJpdmF0ZSBNYXAgY29udmVydE1hcChNYXAgb2xkVG9OZXdPYmplY3RNYXApIHsKLQkJaWYgKG9sZFRvTmV3T2JqZWN0TWFwID09IG51bGwpIHsKLQkJCWlmIChsb2NhbERlYnVnKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJMRD4gb2xkVG9OZXdPYmplY3RNYXAgaXMgbnVsbC4iKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJTWFwIG0gPSBudWxsOwotCQlJdGVyYXRvciBpdCA9IG9sZFRvTmV3T2JqZWN0TWFwLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSkgaXQubmV4dCgpOwotCQkJT2JqZWN0IGtleSA9IGVudHJ5LmdldEtleSgpOwotCQkJT2JqZWN0IHZhbCA9IGVudHJ5LmdldFZhbHVlKCk7Ci0JCQlpZiAobG9jYWxEZWJ1ZykgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTEQ+IG9sZCBrZXkgPSAiICsga2V5KTsgLy8kTk9OLU5MUy0xJAotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTEQ+IG9sZCB2YWwgPSAiICsgdmFsKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJaWYgKCBrZXkgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50ICYmIHZhbCBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCQlTdHJpbmcgbmV3S2V5ID0gKChNZXRob2RFbGVtZW50KWtleSkuZ2V0R3VpZCgpOwotCQkJCVN0cmluZyBuZXdWYWwgPSAoKE1ldGhvZEVsZW1lbnQpdmFsKS5nZXRHdWlkKCk7Ci0JCQkJaWYgKGtleSAhPSBudWxsICYmIHZhbCAhPSBudWxsKSB7Ci0JCQkJCWlmIChtID09IG51bGwpIHsKLQkJCQkJCW0gPSBuZXcgSGFzaE1hcCgpOwotCQkJCQl9Ci0JCQkJCW0ucHV0KG5ld0tleSwgbmV3VmFsKTsKLQkJCQl9Ci0JCQkJaWYgKGxvY2FsRGVidWcpIHsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJMRD4gbmV3IGtleSA9ICIgKyBuZXdLZXkgKyAiLCBuZXdWYWwgPSAiICsgbmV3VmFsKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiIik7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQl9IAotCQl9Ci0JCXJldHVybiBtOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBzb3VyY2UgU3RyaW5nCi0JICogQHBhcmFtIG93bmVyIEVPYmplY3QKLQkgKiBAb2xkVG9OZXdPYmplY3RNYXAgTWFwCi0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHJlcGxhY2UoU3RyaW5nIHNvdXJjZSwgRU9iamVjdCBvd25lciwgTWFwIG9sZFRvTmV3T2JqZWN0TWFwKSB7Ci0JCWlmIChsb2NhbERlYnVnKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxEPiBFbnRlcmluZyBUZXh0UmVmZXJlbmNlUmVwbGFjZXJJbXBsLnJlcGxhY2U6ICIgKyBzb3VyY2UpOyAvLyROT04tTkxTLTEkCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxEPiBvd25lcjogIiArIG93bmVyKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCVN0cmluZyByZXQgPSByZXBsYWNlXyhzb3VyY2UsIG93bmVyLCBvbGRUb05ld09iamVjdE1hcCk7Ci0JCWlmIChsb2NhbERlYnVnKSB7Ci0JCQlib29sZWFuIG5vQ2hhbmdlID0gISBzb3VyY2UuZXF1YWxzKHJldCk7Ci0JCQlTdHJpbmcgc3RyID0gc291cmNlLmVxdWFscyhyZXQpID8gIk5vIGNobmFuZ2UhIiA6IHJldDsgLy8kTk9OLU5MUy0xJAotCQkJU3lzdGVtLm91dC5wcmludGxuKCJMRD4gRXhpdGluZyBUZXh0UmVmZXJlbmNlUmVwbGFjZXJJbXBsLnJlcGxhY2U6ICIgKyBzdHIpOyAvLyROT04tTkxTLTEkCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIiIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIHJldDsKLQl9Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgcmVwbGFjZV8oU3RyaW5nIHNvdXJjZSwgRU9iamVjdCBvd25lciwgTWFwIG9sZFRvTmV3T2JqZWN0TWFwKSB7CQotCQlNYXAgbG9jYWxNYXAgPSBjb252ZXJ0TWFwKG9sZFRvTmV3T2JqZWN0TWFwKTsKLQkJaWYgKGxvY2FsTWFwID09IG51bGwpIHsKLQkJCXJldHVybiBzb3VyY2U7Ci0JCX0KLQkJCi0JCVN0cmluZyByZXBsYWNpbmdQYXRoID0gbnVsbDsKLQkJU3RyaW5nIHJlcGxhY2VkUGF0aCA9IG51bGw7CQkJCi0JCWlmIChvd25lciBpbnN0YW5jZW9mIERlbGl2ZXJ5UHJvY2VzcykgewotCQkJcmVwbGFjaW5nUGF0aCA9IERFTElWRVJZX1BBVEg7Ci0JCQlyZXBsYWNlZFBhdGggPSBDQVBBQklMSVRZX1BBVEg7Ci0JCX0KLQkJZWxzZSBpZiAob3duZXIgaW5zdGFuY2VvZiBDYXBhYmlsaXR5UGF0dGVybikgewotCQkJcmVwbGFjaW5nUGF0aCA9IENBUEFCSUxJVFlfUEFUSDsKLQkJCXJlcGxhY2VkUGF0aCA9IERFTElWRVJZX1BBVEg7Ci0JCX0gZWxzZSB7Ci0JCQlyZXBsYWNpbmdQYXRoID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCXJlcGxhY2VkUGF0aCA9ICIiOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJCi0JCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJTWF0Y2hlciBtID0gUmVzb3VyY2VIZWxwZXIucF9saW5rX3JlZi5tYXRjaGVyKHNvdXJjZSk7Ci0KLQkJd2hpbGUgKG0uZmluZCgpKSB7Ci0JCQlTdHJpbmcgdGV4dCA9IG0uZ3JvdXAoKTsJCQkJCQkKLQkJCU1hcCBhdHRyaWJ1dGVNYXAgPSBSZXNvdXJjZUhlbHBlci5nZXRBdHRyaWJ1dGVzRnJvbUxpbmsodGV4dCk7Ci0JCQlTdHJpbmcgb2xkR3VpZCA9IChTdHJpbmcpIGF0dHJpYnV0ZU1hcC5nZXQoUmVzb3VyY2VIZWxwZXIuVEFHX0FUVFJfR1VJRCk7CQotCQkJU3RyaW5nIG5ld0d1aWQgPSBvbGRHdWlkID09IG51bGwgPyBudWxsIDogKFN0cmluZykgbG9jYWxNYXAuZ2V0KG9sZEd1aWQpOwotCQkJCi0JCQlpZiAobG9jYWxEZWJ1ZykgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTEQ+IHRleHQ6ICAgICAgIiArIHRleHQpOyAvLyROT04tTkxTLTEkCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJMRD4gYXR0cmlidXRlTWFwOiAiICsgYXR0cmlidXRlTWFwKTsgLy8kTk9OLU5MUy0xJAotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTEQ+IG9sZEd1aWQ6ICIgKyBvbGRHdWlkKTsgLy8kTk9OLU5MUy0xJAotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTEQ+IG5ld0d1aWQ6ICIgKyBuZXdHdWlkKTsgLy8kTk9OLU5MUy0xJAotCQkJfQkJCQotCQkJaWYgKG5ld0d1aWQgIT0gbnVsbCAmJiAhbmV3R3VpZC5lcXVhbHMob2xkR3VpZCkpIHsKLQkJCQkJCQkJCi0JCQkJLy9TdHJpbmcgcmVwbGFjZW1lbnQgPSB0ZXh0LnJlcGxhY2VBbGwob2xkR3VpZCwgbmV3R3VpZCk7Ci0JCQkJLy9DYW4ndCB1c2UgdGhlIGFib3ZlIGNvbW1lbnRlZCBvdXQgbGluZSwgYmVjYXVzZSBzb21lIGd1aWQgc3RyaW5ncyBhcmUgbm90IHZhbGlkIHJlZ2V4IHBhdHRlcm5zCi0JCQkJU3RyaW5nIHJlcGxhY2VtZW50ID0gcmVwbGFjZUFsbCh0ZXh0LCBvbGRHdWlkLCBuZXdHdWlkKTsJCQotCQkJCWlmIChyZXBsYWNlbWVudC5pbmRleE9mKHJlcGxhY2VkUGF0aCkgPiAwKSB7Ci0JCQkJCXJlcGxhY2VtZW50ID0gcmVwbGFjZW1lbnQucmVwbGFjZUZpcnN0KHJlcGxhY2VkUGF0aCwgcmVwbGFjaW5nUGF0aCk7Ci0JCQkJfQotCQkJCWlmIChsb2NhbERlYnVnKSB7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTEQ+IHJlcGxhY2VtZW50OiAiICsgcmVwbGFjZW1lbnQpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJCW0uYXBwZW5kUmVwbGFjZW1lbnQoc2IsIHJlcGxhY2VtZW50KTsJCi0JCQl9Ci0JCQkKLQkJfQotCQltLmFwcGVuZFRhaWwoc2IpOwotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci0JCi0JLyoqCi0JICogCi0JICogQHBhcmFtIHRleHQgU3RyaW5nCi0JICogQHBhcmFtIHJlcGxhY2VkIFN0cmluZwotCSAqIEBwYXJhbSByZXBsYWNpbmcgU3RyaW5nCi0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZXBsYWNlQWxsKFN0cmluZyB0ZXh0LCBTdHJpbmcgcmVwbGFjZWQsIFN0cmluZyByZXBsYWNpbmcpIHsKLQkJaW50IGZyb21JbmRleCA9IDA7Ci0JCWludCBpeCA9IHRleHQuaW5kZXhPZihyZXBsYWNlZCwgZnJvbUluZGV4KTsKLQkJaWYgKGl4IDwgMCkgewotCQkJcmV0dXJuIHRleHQ7Ci0JCX0JCQkKLQkJaW50IHJlcGxhY2VkTGVuID0gcmVwbGFjZWQubGVuZ3RoKCk7Ci0JCVN0cmluZ0J1ZmZlciBuZXdUZXh0ID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQl3aGlsZSAoaXggPj0gZnJvbUluZGV4KSB7Ci0JCQlpZiAoaXggPiBmcm9tSW5kZXgpIHsKLQkJCQluZXdUZXh0LmFwcGVuZCh0ZXh0LnN1YnN0cmluZyhmcm9tSW5kZXgsIGl4KSk7Ci0JCQl9Ci0JCQluZXdUZXh0LmFwcGVuZChyZXBsYWNpbmcpOwotCQkJZnJvbUluZGV4ID0gaXggKyByZXBsYWNlZExlbjsKLQkJCWl4ID0gdGV4dC5pbmRleE9mKHJlcGxhY2VkLCBmcm9tSW5kZXgpOwotCQl9Ci0JCWlmIChmcm9tSW5kZXggPCB0ZXh0Lmxlbmd0aCgpICkgewotCQkJbmV3VGV4dC5hcHBlbmQodGV4dC5zdWJzdHJpbmcoZnJvbUluZGV4LCB0ZXh0Lmxlbmd0aCgpKSk7Ci0JCX0KLQkJcmV0dXJuIG5ld1RleHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91dGlsL3BhY2thZ2UuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91dGlsL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTQwZTBlMy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdXRpbC9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyBhY2Nlc3MgYW5kIGVkaXRpbmcgc3VwcG9ydCBmb3IgYSBtZXRob2QgbGlicmFyeS4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubWlncmF0aW9uLmRpYWdyYW0vLmNsYXNzcGF0aCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5taWdyYXRpb24uZGlhZ3JhbS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTFjOGYyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5taWdyYXRpb24uZGlhZ3JhbS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1pZ3JhdGlvbi5kaWFncmFtLy5jdnNpZ25vcmUgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubWlncmF0aW9uLmRpYWdyYW0vLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzVlODJkNy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubWlncmF0aW9uLmRpYWdyYW0vLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWJpbgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5taWdyYXRpb24uZGlhZ3JhbS8ub3B0aW9ucyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5taWdyYXRpb24uZGlhZ3JhbS8ub3B0aW9ucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2FjMzU1Ny4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubWlncmF0aW9uLmRpYWdyYW0vLm9wdGlvbnMKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLSMgVHVybiBvbiBkZWJ1ZyB0cmFjZSBmb3IgdGhlIGRpYWdyYW0gbWlncmF0aW9uIHBsdWctaW4KLW9yZy5lY2xpcHNlLmVwZi5taWdyYXRpb24uZGlhZ3JhbS9kZWJ1Zz10cnVlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubWlncmF0aW9uLmRpYWdyYW0vLnByb2plY3QgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubWlncmF0aW9uLmRpYWdyYW0vLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2MWUxNWUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1pZ3JhdGlvbi5kaWFncmFtLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuZXBmLm1pZ3JhdGlvbi5kaWFncmFtPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5taWdyYXRpb24uZGlhZ3JhbS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5taWdyYXRpb24uZGlhZ3JhbS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTgyMDUwNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubWlncmF0aW9uLmRpYWdyYW0vTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuZXBmLm1pZ3JhdGlvbi5kaWFncmFtO3NpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuNS4wLnF1YWxpZmllcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UuZXBmLm1pZ3JhdGlvbi5kaWFncmFtLkRpYWdyYW1NaWdyYXRpb25QbHVnaW4KLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLnVpLAotIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZSwKLSBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLAotIG9yZy5lY2xpcHNlLmVwZi51bWEsCi0gb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnksCi0gb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQsCi0gb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aSwKLSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLAotIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZCwKLSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLAotIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaSwKLSBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpCi1FY2xpcHNlLUxhenlTdGFydDogdHJ1ZQotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41Ci1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuZXBmLm1pZ3JhdGlvbi5kaWFncmFtLnV0aWwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5taWdyYXRpb24uZGlhZ3JhbS9idWlsZC5wcm9wZXJ0aWVzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1pZ3JhdGlvbi5kaWFncmFtL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlZjhlNjIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1pZ3JhdGlvbi5kaWFncmFtL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLXNvdXJjZS4uID0gc3JjLwotb3V0cHV0Li4gPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgLixcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIGljb25zLwpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1pZ3JhdGlvbi5kaWFncmFtL2ljb25zL2Z1bGwvb2JqMTYvWE1MRmlsZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubWlncmF0aW9uLmRpYWdyYW0vaWNvbnMvZnVsbC9vYmoxNi9YTUxGaWxlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODNiNDRiYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubWlncmF0aW9uLmRpYWdyYW0vaWNvbnMvZnVsbC9vYmoxNi9YTUxGaWxlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5taWdyYXRpb24uZGlhZ3JhbS9pY29ucy9mdWxsL3dpemJhbi9FeHBvcnRYTUwuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1pZ3JhdGlvbi5kaWFncmFtL2ljb25zL2Z1bGwvd2l6YmFuL0V4cG9ydFhNTC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyNDk4MzEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1pZ3JhdGlvbi5kaWFncmFtL2ljb25zL2Z1bGwvd2l6YmFuL0V4cG9ydFhNTC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubWlncmF0aW9uLmRpYWdyYW0vcGx1Z2luLnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubWlncmF0aW9uLmRpYWdyYW0vcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmNzgxYzguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1pZ3JhdGlvbi5kaWFncmFtL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLQotcGx1Z2luTmFtZT1FUEYgRGlhZ3JhbSBNaWdyYXRpb24KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotCi0jIFdpemFyZHMKLWV4cG9ydFdvcmtmbG93VGVtcGxhdGVXaXphcmROYW1lPVdvcmtmbG93IFRlbXBsYXRlCi1leHBvcnRXb3JrZmxvd1RlbXBsYXRlV2l6YXJkRGVzY3JpcHRpb249RXhwb3J0IGEgY2FwYWJpbGl0eSBwYXR0ZXJuIG9yIGRlbGl2ZXJ5IHByb2Nlc3MgZGlhZ3JhbSB0ZW1wbGF0ZS4KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1pZ3JhdGlvbi5kaWFncmFtL3BsdWdpbi54bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubWlncmF0aW9uLmRpYWdyYW0vcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGIzOTc4NS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubWlncmF0aW9uLmRpYWdyYW0vcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4yIj8+Ci08cGx1Z2luPgotPCEtLQotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmV4cG9ydFdpemFyZHMiPgotICAgICAgPHdpemFyZAotICAgICAJICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5lcGYudWkuZXhwb3J0V2l6YXJkcy5jYXRlZ29yeSIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYubWlncmF0aW9uLmRpYWdyYW0uYWQud2l6YXJkcy5NaWdyYXRpb25FeHBvcnRXaXphcmQiCi0gICAgICAgICAgICBpY29uPSJpY29ucy9mdWxsL29iajE2L1hNTEZpbGUuZ2lmIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5taWdyYXRpb24uZGlhZ3JhbS5hZC53aXphcmRzLk1pZ3JhdGlvbkV4cG9ydFdpemFyZCIKLSAgICAgICAgICAgIG5hbWU9IiVleHBvcnRXb3JrZmxvd1RlbXBsYXRlV2l6YXJkTmFtZSI+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+Ci0JICAgICAgICAgJWV4cG9ydFdvcmtmbG93VGVtcGxhdGVXaXphcmREZXNjcmlwdGlvbgotICAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvd2l6YXJkPgotICAgPC9leHRlbnNpb24+Ci0gICAKLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5lcGYudWkuZXhwb3J0V2l6YXJkcyI+Ci0gICAgICA8d2l6YXJkIGlkPSJvcmcuZWNsaXBzZS5lcGYubWlncmF0aW9uLmRpYWdyYW0uYWQud2l6YXJkcy5NaWdyYXRpb25FeHBvcnRXaXphcmQiLz4KLSAgIDwvZXh0ZW5zaW9uPgotICAgLS0+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pLmRpYWdyYW1NaWdyYXRpb24iPgotICAgICAgPGRpYWdyYW1NaWdyYXRpb24gY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5taWdyYXRpb24uZGlhZ3JhbS5EaWFncmFtTWlncmF0aW9uIi8+Ci0gICA8L2V4dGVuc2lvbj4KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1pZ3JhdGlvbi5kaWFncmFtL3NyYy9vcmcvZWNsaXBzZS9lcGYvbWlncmF0aW9uL2RpYWdyYW0vRGlhZ3JhbU1pZ3JhdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1pZ3JhdGlvbi5kaWFncmFtL3NyYy9vcmcvZWNsaXBzZS9lcGYvbWlncmF0aW9uL2RpYWdyYW0vRGlhZ3JhbU1pZ3JhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjY2UyMzg3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5taWdyYXRpb24uZGlhZ3JhbS9zcmMvb3JnL2VjbGlwc2UvZXBmL21pZ3JhdGlvbi9kaWFncmFtL0RpYWdyYW1NaWdyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubWlncmF0aW9uLmRpYWdyYW07Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLlJlc291cmNlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkuSURpYWdyYW1NaWdyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1pZ3JhdGlvbi5kaWFncmFtLmFkLnNlcnZpY2VzLldvcmtmbG93RXhwb3J0U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubWlncmF0aW9uLmRpYWdyYW0udXRpbC5NaWdyYXRpb25VdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5NdWx0aUZpbGVSZXNvdXJjZVNldEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc1BhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci0KLS8qKgotICogSW1wbGVtZW50YXRpb24gY2xhc3MgZm9yIGRpZ3JhbSBtaWdyYXRpb24gCi0gKiAKLSAqIEBhdXRob3IgV2VpcGluZyBMdSAtIEFwcmlsIDA0LCAyMDA3Ci0gKiBAc2luY2UgIDEuMgotICovCi1wdWJsaWMgY2xhc3MgRGlhZ3JhbU1pZ3JhdGlvbiBpbXBsZW1lbnRzIElEaWFncmFtTWlncmF0aW9uIHsKLQotCXByb3RlY3RlZCBib29sZWFuIGRlYnVnOwotCQotCXB1YmxpYyB2b2lkIG1pZ3JhdGUoQ29sbGVjdGlvbjxQcm9jZXNzPiBwcm9jZXNzZXMpIHRocm93cyBFeGNlcHRpb24gewkKLQkJLy8gZGVidWcKLQkJZGVidWcgPSBEaWFncmFtTWlncmF0aW9uUGx1Z2luLmdldERlZmF1bHQoKS5pc0RlYnVnZ2luZygpOwotCQkKLQkJV29ya2Zsb3dFeHBvcnRTZXJ2aWNlIHNlcnZpY2UgPSBuZXcgV29ya2Zsb3dFeHBvcnRTZXJ2aWNlKCk7Ci0JCQotCQlpbnQgIGVycm9yQ291bnQgPSAwOwotCQlNZXRob2RMaWJyYXJ5IGxpYiA9IG51bGw7Ci0JCQotCQlmb3IgKEl0ZXJhdG9yPFByb2Nlc3M+IGl0ID0gcHJvY2Vzc2VzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCVByb2Nlc3MgcHJvYyA9IGl0Lm5leHQoKTsKLQkJCWlmIChsaWIgPT0gbnVsbCkgewotCQkJCWxpYiA9IFVtYVV0aWwuZ2V0TWV0aG9kTGlicmFyeShwcm9jKTsKLQkJCX0KLQkJCQotCQkJaWYgKGRlYnVnKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJMRD4gcHJvYzogIiArIHByb2MpOwkvLyROT04tTkxTLTEkCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJMRD4gIHByb2MuZVJlc291cmNlKCk6ICIgKyAgcHJvYy5lUmVzb3VyY2UoKSk7Ly8kTk9OLU5MUy0xJAotCQkJCWlmIChwcm9jLmVSZXNvdXJjZSgpICE9IG51bGwpIHsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJMRD4gIHByb2MuZVJlc291cmNlKCkuZ2V0VVJJKCk6ICIgKyAgcHJvYy5lUmVzb3VyY2UoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQl9Ci0KLQkJCVN0cmluZyBtb2RlbEZpbGVQYXRoID0gcHJvYy5lUmVzb3VyY2UoKSA9PSBudWxsID8gbnVsbCA6IAotCQkJCQkJCQkJCXByb2MuZVJlc291cmNlKCkuZ2V0VVJJKCkudG9GaWxlU3RyaW5nKCk7Ci0JCQlpZiAobW9kZWxGaWxlUGF0aCA9PSBudWxsKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQkJCQkKLQkJCUZpbGUgY3BGb2xkZXJQYXRoID0gbmV3IEZpbGUobW9kZWxGaWxlUGF0aCkuZ2V0UGFyZW50RmlsZSgpOwotCQkJU3RyaW5nIGRpYWdyYW1GaWxlUGF0aCA9IGNwRm9sZGVyUGF0aC5nZXRBYnNvbHV0ZVBhdGgoKSArIEZpbGUuc2VwYXJhdG9yICsKLQkJCQkJCQkJCQkiZGlhZ3JhbS54bWkiOwkJCQkvLyROT04tTkxTLTEkCi0JCQlGaWxlIGRpYWdyYW1GaWxlID0gbmV3IEZpbGUoZGlhZ3JhbUZpbGVQYXRoKTsKLQkJCWlmIChkaWFncmFtRmlsZS5leGlzdHMoKSkgewotCQkJCWRpYWdyYW1GaWxlLmRlbGV0ZSgpOwotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTEQ+IERlbGV0ZWQgZGlhZ3JhbUZpbGU6ICIgKyBkaWFncmFtRmlsZSk7Ly8kTk9OLU5MUy0xJAotCQkJCVJlc291cmNlVXRpbC5yZWZyZXNoUmVzb3VyY2VzKGxpYiwgbnVsbCk7Ci0JCQl9Ci0JCQkvL2RpYWdyYW1GaWxlLmNyZWF0ZU5ld0ZpbGUoKTsKLQkJCWlmIChkZWJ1ZykgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTEQ+IGRpYWdyYW1GaWxlOiAiICsgZGlhZ3JhbUZpbGUpOy8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCXRyeSB7Ci0JCQkJc2VydmljZS5leHBvcnQocHJvYywgcHJvYywgImRpYWdyYW0ueG1pIiwgY3BGb2xkZXJQYXRoKTsgLy8kTk9OLU5MUy0xJAotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQllcnJvckNvdW50Kys7Ci0JCQkJaWYgKGRlYnVnKSB7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTEQ+IGZhaWxlZDogIiArIGRpYWdyYW1GaWxlKTsJLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAoZGVidWcpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTEQ+IHByb2Nlc3Nlcy5zaXplKCk6ICIgKyBwcm9jZXNzZXMuc2l6ZSgpKTsJLy8kTk9OLU5MUy0xJAotCQkJU3lzdGVtLm91dC5wcmludGxuKCJMRD4gZXJyb3JDb3VudDogIiArIGVycm9yQ291bnQpOwkvLyROT04tTkxTLTEkCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIiIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJCi0JCXJlbW92ZU9sZERpYWdyYW1zKHByb2Nlc3NlcywgbGliKTsJCQkJCi0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgcmVtb3ZlT2xkRGlhZ3JhbXMoQ29sbGVjdGlvbjxQcm9jZXNzPiBwcm9jZXNzZXMsIE1ldGhvZExpYnJhcnkgbGliKSB7CQkKLQkJaWYgKGxpYiA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJYm9vbGVhbiBuZWVkU2F2ZSA9IGZhbHNlOwotCQlpZiAoZGVidWcpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTEQ+IHJlbW92ZU9sZERpYWdyYW1zIC4uLiIpOwkvLyROT04tTkxTLTEkCi0JCX0KLQkJZm9yIChJdGVyYXRvcjxQcm9jZXNzPiBpdCA9IHByb2Nlc3Nlcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlQcm9jZXNzIHByb2MgPSBpdC5uZXh0KCk7Ci0JCQlib29sZWFuIGRpcnR5ID0gZmFsc2U7Ci0JCQl0cnkgewotCQkJCU1hcCBhY3Rpdml0aWVzID0gTWlncmF0aW9uVXRpbC5nZXRBY3Rpdml0aWVzKHByb2MsIHRydWUpOwotCQkJCWZvciAoSXRlcmF0b3IgaWl0ID0gYWN0aXZpdGllcy52YWx1ZXMoKS5pdGVyYXRvcigpOyBpaXQuaGFzTmV4dCgpOykgewkJCQkKLQkJCQkJCUFjdGl2aXR5IGFjdCA9IChBY3Rpdml0eSkgaWl0Lm5leHQoKTsJCQkJCQkKLQkJCQkJCUVPYmplY3QgY29udGFpbmVyID0gYWN0LmVDb250YWluZXIoKTsKLQkJCQkJCWlmIChjb250YWluZXIgaW5zdGFuY2VvZiBQcm9jZXNzUGFja2FnZSkgewotCQkJCQkJCVByb2Nlc3NQYWNrYWdlIHBrZyA9IChQcm9jZXNzUGFja2FnZSkgY29udGFpbmVyOwotCQkJCQkJCWlmICghIHBrZy5nZXREaWFncmFtcygpLmlzRW1wdHkoKSkgewotCQkJCQkJCQlBcnJheUxpc3QgcmVtb3ZlTGlzdCA9IG5ldyBBcnJheUxpc3QocGtnLmdldERpYWdyYW1zKCkpOwotCQkJCQkJCQlwa2cuZ2V0RGlhZ3JhbXMoKS5yZW1vdmVBbGwocmVtb3ZlTGlzdCk7Ci0JCQkJCQkJCWRpcnR5ID0gdHJ1ZTsKLQkJCQkJCQkJaWYgKGRlYnVnKSB7Ci0JCQkJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxEPiBwcm9jOiAiICsgcHJvYyk7CS8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTEQ+ICBwa2c6ICIpOwkJCS8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKGRpcnR5KSB7Ci0JCQkJCXByb2MuZVJlc291cmNlKCkuc2V0TW9kaWZpZWQodHJ1ZSk7Ci0JCQkJCW5lZWRTYXZlID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCWlmIChkZWJ1ZykgewotCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCX0KLQkJCX0JCQkKLQkJfQotCQlpZiAobmVlZFNhdmUpIHsKLQkJCVJlc291cmNlIHJlc291cmNlID0gbGliLmVSZXNvdXJjZSgpOwotCQkJTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsIHJlc291cmNlU2V0ID0gKE11bHRpRmlsZVJlc291cmNlU2V0SW1wbCkgcmVzb3VyY2UuZ2V0UmVzb3VyY2VTZXQoKTsKLQkJCU1hcCBzYXZlT3B0aW9ucyA9IHJlc291cmNlU2V0LmdldERlZmF1bHRTYXZlT3B0aW9ucygpOwotCQkJdHJ5IHsKLQkJCQlyZXNvdXJjZVNldC5zYXZlKHNhdmVPcHRpb25zLCB0cnVlKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJaWYgKGRlYnVnKSB7Ci0JCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJfQotCQkJfQkKLQkJfQotCX0KLQkKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5taWdyYXRpb24uZGlhZ3JhbS9zcmMvb3JnL2VjbGlwc2UvZXBmL21pZ3JhdGlvbi9kaWFncmFtL0RpYWdyYW1NaWdyYXRpb25QbHVnaW4uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5taWdyYXRpb24uZGlhZ3JhbS9zcmMvb3JnL2VjbGlwc2UvZXBmL21pZ3JhdGlvbi9kaWFncmFtL0RpYWdyYW1NaWdyYXRpb25QbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzUxNmY5ZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubWlncmF0aW9uLmRpYWdyYW0vc3JjL29yZy9lY2xpcHNlL2VwZi9taWdyYXRpb24vZGlhZ3JhbS9EaWFncmFtTWlncmF0aW9uUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5taWdyYXRpb24uZGlhZ3JhbTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udWkuQWJzdHJhY3RQbHVnaW47Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0KLS8qKgotICogVGhlIGFjdGl2YXRvciBjbGFzcyBjb250cm9scyB0aGUgcGx1Zy1pbiBsaWZlIGN5Y2xlCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMgotICovCi1wdWJsaWMgY2xhc3MgRGlhZ3JhbU1pZ3JhdGlvblBsdWdpbiBleHRlbmRzIEFic3RyYWN0UGx1Z2luIHsKLQotCS8vIFRoZSBwbHVnLWluIElECi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLmVwZi5taWdyYXRpb24uZGlhZ3JhbSI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIFRoZSBzaGFyZWQgaW5zdGFuY2UKLQlwcml2YXRlIHN0YXRpYyBEaWFncmFtTWlncmF0aW9uUGx1Z2luIHBsdWdpbjsKLQkKLQkvKioKLQkgKiBUaGUgY29uc3RydWN0b3IKLQkgKi8KLQlwdWJsaWMgRGlhZ3JhbU1pZ3JhdGlvblBsdWdpbigpIHsKLQkJcGx1Z2luID0gdGhpczsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luI3N0YXJ0KG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0YXJ0KGNvbnRleHQpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW4jc3RvcChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXBsdWdpbiA9IG51bGw7Ci0JCXN1cGVyLnN0b3AoY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2hhcmVkIGluc3RhbmNlCi0JICoKLQkgKiBAcmV0dXJuIHRoZSBzaGFyZWQgaW5zdGFuY2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIERpYWdyYW1NaWdyYXRpb25QbHVnaW4gZ2V0RGVmYXVsdCgpIHsKLQkJcmV0dXJuIHBsdWdpbjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5taWdyYXRpb24uZGlhZ3JhbS9zcmMvb3JnL2VjbGlwc2UvZXBmL21pZ3JhdGlvbi9kaWFncmFtL01pZ3JhdGlvbkV4cG9ydENvbnN0YW50cy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1pZ3JhdGlvbi5kaWFncmFtL3NyYy9vcmcvZWNsaXBzZS9lcGYvbWlncmF0aW9uL2RpYWdyYW0vTWlncmF0aW9uRXhwb3J0Q29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhNTRhOGIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1pZ3JhdGlvbi5kaWFncmFtL3NyYy9vcmcvZWNsaXBzZS9lcGYvbWlncmF0aW9uL2RpYWdyYW0vTWlncmF0aW9uRXhwb3J0Q29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubWlncmF0aW9uLmRpYWdyYW07Ci0KLS8qKgotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAc2luY2UgMS4yCi0gKgotICovCi1wdWJsaWMgY2xhc3MgTWlncmF0aW9uRXhwb3J0Q29uc3RhbnRzIHsKLQkKLQkvKioKLQkgKiBUaGUgcHJvY2VzcyB0eXBlIHByZWZlcmVuY2Uga2V5LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0NFU1NfVFlQRSA9ICJwcm9jZXNzVHlwZSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSBwcm9jZXNzIG5hbWUgcHJlZmVyZW5jZSBrZXkuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPQ0VTU19OQU1FID0gInByb2Nlc3NOYW1lIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlIHByb2Nlc3MgY29udGV4dCBwcmVmZXJlbmNlIGtleS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9DRVNTX0NPTlRFWFQgPSAiY29udGV4dCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSB0YXJnZXQgZGlyZWN0b3JpZXMgcHJlZmVyZW5jZSBrZXkuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFSR0VUX0RJUkVDVE9SSUVTID0gInRhcmdldERpcnMiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgdGVtcGxhdGUgbmFtZXMgcHJlZmVyZW5jZSBrZXkuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVNUExBVEVfTkFNRVMgPSAidGVtcGxhdGVOYW1lcyI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBUaGUgcHJvY2VzcyBjb250ZXh0IHByZWZlcmVuY2Uga2V5LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElWSVRZX0NPTlRFWFQgPSAiYWN0aXZpdHkiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGRlYnVnID0gdHJ1ZTsKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5taWdyYXRpb24uZGlhZ3JhbS9zcmMvb3JnL2VjbGlwc2UvZXBmL21pZ3JhdGlvbi9kaWFncmFtL01pZ3JhdGlvbkV4cG9ydEV4Y2VwdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1pZ3JhdGlvbi5kaWFncmFtL3NyYy9vcmcvZWNsaXBzZS9lcGYvbWlncmF0aW9uL2RpYWdyYW0vTWlncmF0aW9uRXhwb3J0RXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlYjExMjQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1pZ3JhdGlvbi5kaWFncmFtL3NyYy9vcmcvZWNsaXBzZS9lcGYvbWlncmF0aW9uL2RpYWdyYW0vTWlncmF0aW9uRXhwb3J0RXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubWlncmF0aW9uLmRpYWdyYW07Ci0KLS8qKgotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAc2luY2UgMS4yCi0gKgotICovCi1wdWJsaWMgY2xhc3MgTWlncmF0aW9uRXhwb3J0RXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uIHsKLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDUwNDk0MDAzNTA1Mjc3MTA2MTRMOwotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIE1pZ3JhdGlvbkV4cG9ydEV4Y2VwdGlvbigpIHsKLQkJc3VwZXIoKTsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjb25zdHJ1Y3RvciBzdHViCi0JfQotCi0JLyoqCi0JICogQHBhcmFtIG1lc3NhZ2UKLQkgKi8KLQlwdWJsaWMgTWlncmF0aW9uRXhwb3J0RXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlKSB7Ci0JCXN1cGVyKG1lc3NhZ2UpOwotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNvbnN0cnVjdG9yIHN0dWIKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gY2F1c2UKLQkgKi8KLQlwdWJsaWMgTWlncmF0aW9uRXhwb3J0RXhjZXB0aW9uKFRocm93YWJsZSBjYXVzZSkgewotCQlzdXBlcihjYXVzZSk7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY29uc3RydWN0b3Igc3R1YgotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBtZXNzYWdlCi0JICogQHBhcmFtIGNhdXNlCi0JICovCi0JcHVibGljIE1pZ3JhdGlvbkV4cG9ydEV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGNhdXNlKSB7Ci0JCXN1cGVyKG1lc3NhZ2UsIGNhdXNlKTsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjb25zdHJ1Y3RvciBzdHViCi0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubWlncmF0aW9uLmRpYWdyYW0vc3JjL29yZy9lY2xpcHNlL2VwZi9taWdyYXRpb24vZGlhZ3JhbS9NaWdyYXRpb25SZXNvdXJjZXMuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5taWdyYXRpb24uZGlhZ3JhbS9zcmMvb3JnL2VjbGlwc2UvZXBmL21pZ3JhdGlvbi9kaWFncmFtL01pZ3JhdGlvblJlc291cmNlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkN2UzYjE2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5taWdyYXRpb24uZGlhZ3JhbS9zcmMvb3JnL2VjbGlwc2UvZXBmL21pZ3JhdGlvbi9kaWFncmFtL01pZ3JhdGlvblJlc291cmNlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLm1pZ3JhdGlvbi5kaWFncmFtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotLyoqCi0gKiBNaWdyYXRpb24gcmVzb3VyY2VzCi0gKiAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4yCi0gKgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgTWlncmF0aW9uUmVzb3VyY2VzIGV4dGVuZHMgTkxTIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJvcmcuZWNsaXBzZS5lcGYubWlncmF0aW9uLmRpYWdyYW0uUmVzb3VyY2VzIjsvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBNaWdyYXRpb25SZXNvdXJjZXMoKSB7Ci0JCS8vIERvIG5vdCBpbnN0YW50aWF0ZQotCX0KLQkKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdvcmtmbG93X2V4cG9ydF93aXphcmRfdGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgd29ya2Zsb3dfZXhwb3J0X3dpemFyZF90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdvcmtmbG93X2V4cG9ydF93aXphcmRfcHJvY2Vzc0dyb3VwX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgd29ya2Zsb3dfZXhwb3J0X3dpemFyZF9jYXBhYmlsaXR5UGF0dGVyblJhZGlvQnV0dG9uX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgd29ya2Zsb3dfZXhwb3J0X3dpemFyZF9kZWxpdmVyeVByb2Nlc3NSYWRpb0J1dHRvbl90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdvcmtmbG93X2V4cG9ydF93aXphcmRfcHJvY2Vzc05hbWVMYWJlbF90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdvcmtmbG93X2V4cG9ydF93aXphcmRfY29udGV4dE5hbWVMYWJlbF90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdvcmtmbG93X2V4cG9ydF93aXphcmRfdGVtcGxhdGVHcm91cF90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdvcmtmbG93X2V4cG9ydF93aXphcmRfdGVtcGxhdGVOYW1lTGFiZWxfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3b3JrZmxvd19leHBvcnRfd2l6YXJkX2RpckxhYmVsX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgd29ya2Zsb3dfZXhwb3J0X3dpemFyZF9icm93c2VCdXR0b25fdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3b3JrZmxvd19vdmVyd3JpdGVUZXh0RGlhbG9nX3RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdvcmtmbG93X292ZXJ3cml0ZVRleHRfbXNnOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdvcmtmbG93X2V4cG9ydF93aXphcmRfYWN0aXZpdGllc05hbWVMYWJlbF90ZXh0OwotCi0JCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG9wZW5fbWV0aG9kX2xpYnJhcnlfZXJyb3JfdGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgb3Blbl9tZXRob2RfbGlicmFyeV9lcnJvcl90ZXh0OwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEdSQVBIX05PREVfRk9SSzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBHUkFQSF9OT0RFX0lOSVRJQUw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgR1JBUEhfTk9ERV9GSU5BTDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBHUkFQSF9OT0RFX0RFQ0lTSU9OOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEdSQVBIX05PREVfRlJFRV9URVhUOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEdSQVBIX05PREVfTUVSR0U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgR1JBUEhfTk9ERV9KT0lOOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEdSQVBIX05PREVfTElOSzsKLQkKLQlzdGF0aWMgewotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBNaWdyYXRpb25SZXNvdXJjZXMuY2xhc3MpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubWlncmF0aW9uLmRpYWdyYW0vc3JjL29yZy9lY2xpcHNlL2VwZi9taWdyYXRpb24vZGlhZ3JhbS9SZXNvdXJjZXMucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5taWdyYXRpb24uZGlhZ3JhbS9zcmMvb3JnL2VjbGlwc2UvZXBmL21pZ3JhdGlvbi9kaWFncmFtL1Jlc291cmNlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYzFmMzg0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5taWdyYXRpb24uZGlhZ3JhbS9zcmMvb3JnL2VjbGlwc2UvZXBmL21pZ3JhdGlvbi9kaWFncmFtL1Jlc291cmNlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLQotd29ya2Zsb3dfZXhwb3J0X3dpemFyZF90aXRsZT1FeHBvcnQgV29ya2Zsb3cgV2l6YXJkCi13b3JrZmxvd19leHBvcnRfd2l6YXJkX3RleHQ9V2l6YXJkIHRvIGV4cG9ydCB3b3JrZmxvdyAoYWN0aXZpdHkgZGlhZ3JhbXMpCi13b3JrZmxvd19leHBvcnRfd2l6YXJkX3Byb2Nlc3NHcm91cF90ZXh0PVByb2Nlc3MKLXdvcmtmbG93X2V4cG9ydF93aXphcmRfY2FwYWJpbGl0eVBhdHRlcm5SYWRpb0J1dHRvbl90ZXh0PUNhcGFiaWxpdHkgUGF0dGVybgotd29ya2Zsb3dfZXhwb3J0X3dpemFyZF9kZWxpdmVyeVByb2Nlc3NSYWRpb0J1dHRvbl90ZXh0PURlbGl2ZXJ5IFByb2Nlc3MKLXdvcmtmbG93X2V4cG9ydF93aXphcmRfcHJvY2Vzc05hbWVMYWJlbF90ZXh0PVByb2Nlc3M6Ci13b3JrZmxvd19leHBvcnRfd2l6YXJkX2NvbnRleHROYW1lTGFiZWxfdGV4dD1Db25maWd1cmF0aW9uOgotd29ya2Zsb3dfZXhwb3J0X3dpemFyZF90ZW1wbGF0ZUdyb3VwX3RleHQ9VGVtcGxhdGUKLXdvcmtmbG93X2V4cG9ydF93aXphcmRfdGVtcGxhdGVOYW1lTGFiZWxfdGV4dD1GaWxlIE5hbWU6Ci13b3JrZmxvd19leHBvcnRfd2l6YXJkX2RpckxhYmVsX3RleHQ9RGlyZWN0b3J5Ogotd29ya2Zsb3dfZXhwb3J0X3dpemFyZF9icm93c2VCdXR0b25fdGV4dD1Ccm93c2UuLi4KLXdvcmtmbG93X292ZXJ3cml0ZVRleHREaWFsb2dfdGl0bGU9T3ZlcndyaXRlCi13b3JrZmxvd19vdmVyd3JpdGVUZXh0X21zZz1EbyB5b3Ugd2FudCB0byBvdmVyd3JpdGUgdGhlIGV4aXN0aW5nIGZpbGU/Ci13b3JrZmxvd19leHBvcnRfd2l6YXJkX2FjdGl2aXRpZXNOYW1lTGFiZWxfdGV4dD1BY3Rpdml0eToKLQotb3Blbl9tZXRob2RfbGlicmFyeV9lcnJvcl90aXRsZT1PcGVuIE1ldGhvZCBMaWJyYXJ5IEVycm9yCi1vcGVuX21ldGhvZF9saWJyYXJ5X2Vycm9yX3RleHQ9WW91IG5lZWQgdG8gb3BlbiBhIG1ldGhvZCBsaWJyYXJ5IGJlZm9yZSBwZXJmb3JtaW5nIGFuIGV4cG9ydC4KLQotIyBHcmFwaCBOb2RlIG5hbWVzCi0KLUdSQVBIX05PREVfRk9SSz1Gb3JrIE5vZGUKLUdSQVBIX05PREVfSU5JVElBTD1TdGFydCBOb2RlCi1HUkFQSF9OT0RFX0ZJTkFMPUVuZCBOb2RlCi1HUkFQSF9OT0RFX0RFQ0lTSU9OPURlY2lzaW9uIG5vZGUKLUdSQVBIX05PREVfRlJFRV9URVhUPUZyZWUgVGV4dAotR1JBUEhfTk9ERV9NRVJHRT1NZXJnZSBOb2RlCi1HUkFQSF9OT0RFX0pPSU49Sm9pbiBOb2RlCi1HUkFQSF9OT0RFX0xJTks9TGluawpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5taWdyYXRpb24uZGlhZ3JhbS9zcmMvb3JnL2VjbGlwc2UvZXBmL21pZ3JhdGlvbi9kaWFncmFtL2FkL21hcC9BY3Rpdml0eU1hcE5vZGUuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5taWdyYXRpb24uZGlhZ3JhbS9zcmMvb3JnL2VjbGlwc2UvZXBmL21pZ3JhdGlvbi9kaWFncmFtL2FkL21hcC9BY3Rpdml0eU1hcE5vZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTQwZjliNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubWlncmF0aW9uLmRpYWdyYW0vc3JjL29yZy9lY2xpcHNlL2VwZi9taWdyYXRpb24vZGlhZ3JhbS9hZC9tYXAvQWN0aXZpdHlNYXBOb2RlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubWlncmF0aW9uLmRpYWdyYW0uYWQubWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5icmlkZ2UuQnJpZGdlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5JdGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUGhhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5VTUxQYWNrYWdlOwotCi0vKioKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBhdXRob3IgV2VpcGluZyBMdQotICogQHNpbmNlIDEuMgotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZpdHlNYXBOb2RlIGV4dGVuZHMgTWFwTm9kZSB7Ci0KLQlwdWJsaWMgQWN0aXZpdHlNYXBOb2RlKE5vZGUgbm9kZSkgewotCQlzdXBlcihub2RlKTsKLQl9Ci0KLQkvKioKLQkgKiBVcGRhdGUgdW1sIG5vZGUKLQkgKi8KLQlwdWJsaWMgdm9pZCB1cGRhdGVOb2RlKCkgewotCQlzdXBlci51cGRhdGVOb2RlKCk7Ci0JCXVtbE5vZGUgPSAoU3RydWN0dXJlZEFjdGl2aXR5Tm9kZSkgZ2V0QWN0aXZpdHkoKS5jcmVhdGVOb2RlKG5hbWUsCi0JCQkJVU1MUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U3RydWN0dXJlZEFjdGl2aXR5Tm9kZSgpKTsKLQkJT2JqZWN0IG9iaiA9IChPYmplY3QpIG5vZGUuZ2V0T2JqZWN0KCk7Ci0vKgkJaWYgKG9iaiBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCUJyaWRnZUhlbHBlci5hZGRFQW5ub3RhdGlvbih1bWxOb2RlLCAoKE1ldGhvZEVsZW1lbnQpIG9iaikpOwotCQl9Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBQaGFzZSkgewotCQkJQnJpZGdlSGVscGVyLmFkZEVBbm5vdGF0aW9uVHlwZSh1bWxOb2RlLCAKLQkJCQkJQnJpZGdlSGVscGVyLlVNQV9QSEFTRSk7Ci0JCX0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgSXRlcmF0aW9uKSB7Ci0JCQlCcmlkZ2VIZWxwZXIuYWRkRUFubm90YXRpb25UeXBlKHVtbE5vZGUsIAotCQkJCQlCcmlkZ2VIZWxwZXIuVU1BX0lURVJBVElPTik7Ci0JCX0gZWxzZSB7Ci0JCQlCcmlkZ2VIZWxwZXIuYWRkRUFubm90YXRpb25UeXBlKHVtbE5vZGUsIAotCQkJCQlCcmlkZ2VIZWxwZXIuVU1BX0FDVElWSVRZKTsKLQkJfSovCi0JCWlmIChvYmogaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQlCcmlkZ2VIZWxwZXIuYXNzb2NpYXRlKHVtbE5vZGUsICgoTWV0aG9kRWxlbWVudCkgb2JqKSk7Ci0JCX0KLQotCQlpZiAodW1sTm9kZSAhPSBudWxsKSB7Ci0JCQlncmFwaFVNTE5vZGVNYXAucHV0KG5vZGUsIHVtbE5vZGUpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1pZ3JhdGlvbi5kaWFncmFtL3NyYy9vcmcvZWNsaXBzZS9lcGYvbWlncmF0aW9uL2RpYWdyYW0vYWQvbWFwL0FjdGl2aXR5UGFyYW1ldGVyTWFwZU5vZGUuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5taWdyYXRpb24uZGlhZ3JhbS9zcmMvb3JnL2VjbGlwc2UvZXBmL21pZ3JhdGlvbi9kaWFncmFtL2FkL21hcC9BY3Rpdml0eVBhcmFtZXRlck1hcGVOb2RlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwNGIyMjMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1pZ3JhdGlvbi5kaWFncmFtL3NyYy9vcmcvZWNsaXBzZS9lcGYvbWlncmF0aW9uL2RpYWdyYW0vYWQvbWFwL0FjdGl2aXR5UGFyYW1ldGVyTWFwZU5vZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLm1pZ3JhdGlvbi5kaWFncmFtLmFkLm1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuYnJpZGdlLkJyaWRnZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1pbGVzdG9uZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkFjdGl2aXR5UGFyYW1ldGVyTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5VTUxQYWNrYWdlOwotCi0vKioKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4yCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eVBhcmFtZXRlck1hcGVOb2RlIGV4dGVuZHMgTWFwTm9kZSB7Ci0KLQlwdWJsaWMgQWN0aXZpdHlQYXJhbWV0ZXJNYXBlTm9kZShOb2RlIG5vZGUpIHsKLQkJc3VwZXIobm9kZSk7Ci0JfQotCi0JLyoqCi0JICogVXBkYXRlIHVtbCBub2RlCi0JICovCi0JcHVibGljIHZvaWQgdXBkYXRlTm9kZSgpIHsKLQkJc3VwZXIudXBkYXRlTm9kZSgpOwotCQl1bWxOb2RlID0gKEFjdGl2aXR5UGFyYW1ldGVyTm9kZSkgZ2V0QWN0aXZpdHkoKS5jcmVhdGVOb2RlKG5hbWUsCi0JCQkJVU1MUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QWN0aXZpdHlQYXJhbWV0ZXJOb2RlKCkpOwotCQlPYmplY3Qgb2JqID0gKE9iamVjdCkgbm9kZS5nZXRPYmplY3QoKTsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCUJyaWRnZUhlbHBlci5hZGRFQW5ub3RhdGlvbih1bWxOb2RlLCAoKE1ldGhvZEVsZW1lbnQpIG9iaikpOwotCQl9Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBNaWxlc3RvbmUpIHsKLQkJCUJyaWRnZUhlbHBlci5hZGRFQW5ub3RhdGlvblR5cGUodW1sTm9kZSwgCi0JCQkJCUJyaWRnZUhlbHBlci5VTUFfTUlMRVNUT05FKTsKLQkJfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBUYXNrRGVzY3JpcHRvcikgewotCQkJQnJpZGdlSGVscGVyLmFkZEVBbm5vdGF0aW9uVHlwZSh1bWxOb2RlLCAKLQkJCQkJQnJpZGdlSGVscGVyLlVNQV9UQVNLX0RFU0NSSVBUT1IpOwotCQl9Ci0KLQkJaWYgKHVtbE5vZGUgIT0gbnVsbCkgewotCQkJZ3JhcGhVTUxOb2RlTWFwLnB1dChub2RlLCB1bWxOb2RlKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5taWdyYXRpb24uZGlhZ3JhbS9zcmMvb3JnL2VjbGlwc2UvZXBmL21pZ3JhdGlvbi9kaWFncmFtL2FkL21hcC9EZWNpc2lvbk5vZGVNYXAuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5taWdyYXRpb24uZGlhZ3JhbS9zcmMvb3JnL2VjbGlwc2UvZXBmL21pZ3JhdGlvbi9kaWFncmFtL2FkL21hcC9EZWNpc2lvbk5vZGVNYXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmE4NThhNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubWlncmF0aW9uLmRpYWdyYW0vc3JjL29yZy9lY2xpcHNlL2VwZi9taWdyYXRpb24vZGlhZ3JhbS9hZC9tYXAvRGVjaXNpb25Ob2RlTWFwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubWlncmF0aW9uLmRpYWdyYW0uYWQubWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5EZWNpc2lvbk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuVU1MUGFja2FnZTsKLQotLyoqCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4yCi0gKi8KLXB1YmxpYyBjbGFzcyBEZWNpc2lvbk5vZGVNYXAgZXh0ZW5kcyBNYXBOb2RlIHsKLQotCi0JLyoqCi0JICogQHBhcmFtIG5vZGUKLQkgKi8KLQlwdWJsaWMgRGVjaXNpb25Ob2RlTWFwKE5vZGUgbm9kZSkgewotCQlzdXBlcihub2RlKTsKLQl9Ci0JCi0JCi0JLyoqCi0JICogVXBkYXRlIHVtbCBub2RlCi0JICovCi0JcHVibGljIHZvaWQgdXBkYXRlTm9kZSgpIHsKLQkJc3VwZXIudXBkYXRlTm9kZSgpOwotCi0JCXVtbE5vZGUgPSAoRGVjaXNpb25Ob2RlKWdldEFjdGl2aXR5KCkuY3JlYXRlTm9kZShuYW1lID0gKG5hbWUgIT0gbnVsbCk/IG5hbWUgOiAiICIsIC8vJE5PTi1OTFMtMSQgCi0JCQkJCQlVTUxQYWNrYWdlLmVJTlNUQU5DRS5nZXREZWNpc2lvbk5vZGUoKSk7Ci0JCQotCQlpZih1bWxOb2RlICE9IG51bGwpewotCQkJZ3JhcGhVTUxOb2RlTWFwLnB1dChub2RlLCB1bWxOb2RlKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5taWdyYXRpb24uZGlhZ3JhbS9zcmMvb3JnL2VjbGlwc2UvZXBmL21pZ3JhdGlvbi9kaWFncmFtL2FkL21hcC9GaW5hbE5vZGVNYXAuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5taWdyYXRpb24uZGlhZ3JhbS9zcmMvb3JnL2VjbGlwc2UvZXBmL21pZ3JhdGlvbi9kaWFncmFtL2FkL21hcC9GaW5hbE5vZGVNYXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTEyNzk2My4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubWlncmF0aW9uLmRpYWdyYW0vc3JjL29yZy9lY2xpcHNlL2VwZi9taWdyYXRpb24vZGlhZ3JhbS9hZC9tYXAvRmluYWxOb2RlTWFwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubWlncmF0aW9uLmRpYWdyYW0uYWQubWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eUZpbmFsTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5VTUxQYWNrYWdlOwotCi0vKioKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjIKLSAqLwotcHVibGljIGNsYXNzIEZpbmFsTm9kZU1hcCBleHRlbmRzIE1hcE5vZGUgewotCi0KLQkvKioKLQkgKiBAcGFyYW0gbm9kZQotCSAqLwotCXB1YmxpYyBGaW5hbE5vZGVNYXAoTm9kZSBub2RlKSB7Ci0JCXN1cGVyKG5vZGUpOwotCX0KLQkKLQkvKioKLQkgKiBVcGRhdGUgdW1sIG5vZGUKLQkgKi8KLQlwdWJsaWMgdm9pZCB1cGRhdGVOb2RlKCkgewotCQkKLQkJc3VwZXIudXBkYXRlTm9kZSgpOwotCQl1bWxOb2RlID0gKEFjdGl2aXR5RmluYWxOb2RlKWdldEFjdGl2aXR5KCkuY3JlYXRlTm9kZShuYW1lID0gKG5hbWUgIT0gbnVsbCk/IG5hbWUgOiBHUkFQSF9OT0RFX0ZJTkFMLCAKLQkJCQlVTUxQYWNrYWdlLmVJTlNUQU5DRS5nZXRBY3Rpdml0eUZpbmFsTm9kZSgpKTsKLQkJCi0JCWlmKHVtbE5vZGUgIT0gbnVsbCl7Ci0JCQlncmFwaFVNTE5vZGVNYXAucHV0KG5vZGUsIHVtbE5vZGUpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1pZ3JhdGlvbi5kaWFncmFtL3NyYy9vcmcvZWNsaXBzZS9lcGYvbWlncmF0aW9uL2RpYWdyYW0vYWQvbWFwL0ZvcmtOb2RlTWFwLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubWlncmF0aW9uLmRpYWdyYW0vc3JjL29yZy9lY2xpcHNlL2VwZi9taWdyYXRpb24vZGlhZ3JhbS9hZC9tYXAvRm9ya05vZGVNYXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTVhOWYyYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubWlncmF0aW9uLmRpYWdyYW0vc3JjL29yZy9lY2xpcHNlL2VwZi9taWdyYXRpb24vZGlhZ3JhbS9hZC9tYXAvRm9ya05vZGVNYXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5taWdyYXRpb24uZGlhZ3JhbS5hZC5tYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkZvcmtOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLlVNTFBhY2thZ2U7Ci0KLS8qKgotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMgotICovCi1wdWJsaWMgY2xhc3MgRm9ya05vZGVNYXAgZXh0ZW5kcyBNYXBOb2RlIHsKLQotCS8qKgotCSAqIEBwYXJhbSBub2RlCi0JICovCi0JcHVibGljIEZvcmtOb2RlTWFwKE5vZGUgbm9kZSkgewotCQlzdXBlcihub2RlKTsKLQl9Ci0JCi0JLyoqCi0JICogIFVwZGF0ZSB1bWwgbm9kZQotCSAqLwotCXB1YmxpYyB2b2lkIHVwZGF0ZU5vZGUoKSB7Ci0JCXN1cGVyLnVwZGF0ZU5vZGUoKTsKLQotCQl1bWxOb2RlID0gKEZvcmtOb2RlKWdldEFjdGl2aXR5KCkuY3JlYXRlTm9kZShuYW1lID0gKG5hbWUgIT0gbnVsbCk/IG5hbWUgOiBHUkFQSF9OT0RFX0ZPUktfTk9ERSwgCi0JCQkJCQlVTUxQYWNrYWdlLmVJTlNUQU5DRS5nZXRGb3JrTm9kZSgpKTsKLQkKLQkJaWYodW1sTm9kZSAhPSBudWxsKXsKLQkJCWdyYXBoVU1MTm9kZU1hcC5wdXQobm9kZSwgdW1sTm9kZSk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5taWdyYXRpb24uZGlhZ3JhbS9zcmMvb3JnL2VjbGlwc2UvZXBmL21pZ3JhdGlvbi9kaWFncmFtL2FkL21hcC9JTWFwQ29uc3RhbnRzLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubWlncmF0aW9uLmRpYWdyYW0vc3JjL29yZy9lY2xpcHNlL2VwZi9taWdyYXRpb24vZGlhZ3JhbS9hZC9tYXAvSU1hcENvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMDE1Zjg0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5taWdyYXRpb24uZGlhZ3JhbS9zcmMvb3JnL2VjbGlwc2UvZXBmL21pZ3JhdGlvbi9kaWFncmFtL2FkL21hcC9JTWFwQ29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubWlncmF0aW9uLmRpYWdyYW0uYWQubWFwOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5taWdyYXRpb24uZGlhZ3JhbS5NaWdyYXRpb25SZXNvdXJjZXM7Ci0KLS8qKgotICogCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBzaW5jZSAxLjIKLSAqCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSU1hcENvbnN0YW50cyB7Ci0JCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGRlYnVnICA9IHRydWU7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgR1JBUEhfTk9ERV9GT1JLX05PREUgPSAiIjsgLy9NaWdyYXRpb25SZXNvdXJjZXMuR1JBUEhfTk9ERV9GT1JLOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHUkFQSF9OT0RFX0lOSVRJQUwgPSAiIjsgLy9NaWdyYXRpb25SZXNvdXJjZXMuR1JBUEhfTk9ERV9JTklUSUFMOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHUkFQSF9OT0RFX0ZJTkFMID0gIiI7IC8vIE1pZ3JhdGlvblJlc291cmNlcy5HUkFQSF9OT0RFX0ZJTkFMOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHUkFQSF9OT0RFX0RFQ0lTSU9OID0gIE1pZ3JhdGlvblJlc291cmNlcy5HUkFQSF9OT0RFX0RFQ0lTSU9OOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgR1JBUEhfTk9ERV9GUkVFX1RFWFQgPSBNaWdyYXRpb25SZXNvdXJjZXMuR1JBUEhfTk9ERV9GUkVFX1RFWFQ7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgR1JBUEhfTk9ERV9NRVJHRSA9IE1pZ3JhdGlvblJlc291cmNlcy5HUkFQSF9OT0RFX01FUkdFOwotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEdSQVBIX05PREVfSk9JTiA9ICIiOyAvL01pZ3JhdGlvblJlc291cmNlcy5HUkFQSF9OT0RFX0pPSU47IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgTWFwIGdyYXBoVU1MTm9kZU1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubWlncmF0aW9uLmRpYWdyYW0vc3JjL29yZy9lY2xpcHNlL2VwZi9taWdyYXRpb24vZGlhZ3JhbS9hZC9tYXAvSW5pdGlhbE5vZGVNYXAuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5taWdyYXRpb24uZGlhZ3JhbS9zcmMvb3JnL2VjbGlwc2UvZXBmL21pZ3JhdGlvbi9kaWFncmFtL2FkL21hcC9Jbml0aWFsTm9kZU1hcC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZjY1YTRiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5taWdyYXRpb24uZGlhZ3JhbS9zcmMvb3JnL2VjbGlwc2UvZXBmL21pZ3JhdGlvbi9kaWFncmFtL2FkL21hcC9Jbml0aWFsTm9kZU1hcC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLm1pZ3JhdGlvbi5kaWFncmFtLmFkLm1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuSW5pdGlhbE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuVU1MUGFja2FnZTsKLQotLyoqCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4yCi0gKi8KLXB1YmxpYyBjbGFzcyBJbml0aWFsTm9kZU1hcCBleHRlbmRzIE1hcE5vZGUgewotCi0JCi0JLyoqCi0JICogQHBhcmFtIG5vZGUKLQkgKi8KLQlwdWJsaWMgSW5pdGlhbE5vZGVNYXAoTm9kZSBub2RlKSB7Ci0JCXN1cGVyKG5vZGUpOwotCX0KLQkKLQkvKioKLQkgKiBVcGRhdGUgdW1sIG5vZGUKLQkgKi8KLQlwdWJsaWMgdm9pZCB1cGRhdGVOb2RlKCkgewotCQlzdXBlci51cGRhdGVOb2RlKCk7Ci0JCXVtbE5vZGUgPSAoSW5pdGlhbE5vZGUpZ2V0QWN0aXZpdHkoKS5jcmVhdGVOb2RlKG5hbWUgPSAobmFtZSAhPSBudWxsKT8gbmFtZSA6IEdSQVBIX05PREVfSU5JVElBTCwgCi0JCQkJCQlVTUxQYWNrYWdlLmVJTlNUQU5DRS5nZXRJbml0aWFsTm9kZSgpKTsKLQkJCi0JCWlmKHVtbE5vZGUgIT0gbnVsbCl7Ci0JCQlncmFwaFVNTE5vZGVNYXAucHV0KG5vZGUsIHVtbE5vZGUpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1pZ3JhdGlvbi5kaWFncmFtL3NyYy9vcmcvZWNsaXBzZS9lcGYvbWlncmF0aW9uL2RpYWdyYW0vYWQvbWFwL0pvaW5Ob2RlTWFwLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubWlncmF0aW9uLmRpYWdyYW0vc3JjL29yZy9lY2xpcHNlL2VwZi9taWdyYXRpb24vZGlhZ3JhbS9hZC9tYXAvSm9pbk5vZGVNYXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjI5MmE1Ny4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubWlncmF0aW9uLmRpYWdyYW0vc3JjL29yZy9lY2xpcHNlL2VwZi9taWdyYXRpb24vZGlhZ3JhbS9hZC9tYXAvSm9pbk5vZGVNYXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5taWdyYXRpb24uZGlhZ3JhbS5hZC5tYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkpvaW5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLlVNTFBhY2thZ2U7Ci0KLS8qKgotICogCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMgotICoKLSAqLwotcHVibGljIGNsYXNzIEpvaW5Ob2RlTWFwIGV4dGVuZHMgTWFwTm9kZSB7Ci0KLQlwdWJsaWMgSm9pbk5vZGVNYXAoTm9kZSBub2RlKSB7Ci0JCXN1cGVyKG5vZGUpOwotCX0KLQkKLQkvKioKLQkgKiBVcGRhdGUgdW1sIG5vZGUKLQkgKi8KLQlwdWJsaWMgdm9pZCB1cGRhdGVOb2RlKCkgewotCQlzdXBlci51cGRhdGVOb2RlKCk7Ci0JCXVtbE5vZGUgPSAoSm9pbk5vZGUpZ2V0QWN0aXZpdHkoKS5jcmVhdGVOb2RlKG5hbWUgPSAobmFtZSAhPSBudWxsKT8gbmFtZSA6IEdSQVBIX05PREVfSk9JTiwgCi0JCQkJCQlVTUxQYWNrYWdlLmVJTlNUQU5DRS5nZXRKb2luTm9kZSgpKTsKLQkJCi0JCWlmKHVtbE5vZGUgIT0gbnVsbCl7Ci0JCQlncmFwaFVNTE5vZGVNYXAucHV0KG5vZGUsIHVtbE5vZGUpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1pZ3JhdGlvbi5kaWFncmFtL3NyYy9vcmcvZWNsaXBzZS9lcGYvbWlncmF0aW9uL2RpYWdyYW0vYWQvbWFwL01hcEZhY3RvcnkuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5taWdyYXRpb24uZGlhZ3JhbS9zcmMvb3JnL2VjbGlwc2UvZXBmL21pZ3JhdGlvbi9kaWFncmFtL2FkL21hcC9NYXBGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmYjUzNmIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1pZ3JhdGlvbi5kaWFncmFtL3NyYy9vcmcvZWNsaXBzZS9lcGYvbWlncmF0aW9uL2RpYWdyYW0vYWQvbWFwL01hcEZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubWlncmF0aW9uLmRpYWdyYW0uYWQubWFwOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk1vZGVsUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLlR5cGVkTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWlsZXN0b25lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0b3I7Ci0KLS8qKgotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMgotICovCi0KLQotcHVibGljIGNsYXNzIE1hcEZhY3RvcnkgewotCU1hcCBtYXAgPSBuZXcgSGFzaE1hcCgpOwotCi0Jc3RhdGljIE1hcEZhY3RvcnkgZmFjdG9yeSA9IG51bGw7Ci0KLQkKLQlwdWJsaWMgc3RhdGljIE1hcEZhY3RvcnkgZ2V0SW5zdGFuY2UoKSB7Ci0JCWlmIChmYWN0b3J5ID09IG51bGwpIHsKLQkJCWZhY3RvcnkgPSBuZXcgTWFwRmFjdG9yeSgpOwotCQl9Ci0JCXJldHVybiBmYWN0b3J5OwotCX0KLQotCS8qKgotCSAqIENyZXRlIG1hcCBub2RlCi0JICogQHBhcmFtIG5vZGUKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIE1hcE5vZGUgY3JlYXRlKE5vZGUgbm9kZSkgewotCQlpbnQgY2xhc3NpZmllciA9IG5vZGUuZUNsYXNzKCkuZ2V0Q2xhc3NpZmllcklEKCk7Ci0JCXN3aXRjaCAoY2xhc3NpZmllcikgewotCQljYXNlIE1vZGVsUGFja2FnZS5XT1JLX0JSRUFLRE9XTl9FTEVNRU5UX05PREU6Ci0JCQlyZXR1cm4gY3JlYXRlV29ya0JyZWFrRG93bkVsZW1lbnROb2RlKG5vZGUpOwotCQljYXNlIE1vZGVsUGFja2FnZS5UWVBFRF9OT0RFOgotCQkJVHlwZWROb2RlIHR5cGVkTm9kZSA9IChUeXBlZE5vZGUpIG5vZGU7Ci0JCQlpZiAodHlwZWROb2RlLmdldFR5cGUoKSA9PSBUeXBlZE5vZGUuREVDSVNJT04pIHsKLQkJCQlMaXN0IGluY29taW5nQ29ubmVjdGlvbnMgPSB0eXBlZE5vZGUuZ2V0SW5jb21pbmdDb25uZWN0aW9ucygpOwotCQkJCQotCQkJCWlmIChpbmNvbWluZ0Nvbm5lY3Rpb25zLnNpemUoKSA+IDEpCi0JCQkJCXJldHVybiBjcmVhdGVNZXJnZU5vZGUobm9kZSk7Ci0JCQkJZWxzZQotCQkJCQlyZXR1cm4gY3JlYXRlRGVjaXNpb25Ob2RlKG5vZGUpOwotCQkJCQotLy8JCQkJTGlzdCBvdXRnb2luZ0Nvbm5lY3Rpb25zID0gdHlwZWROb2RlLmdldE91dGdvaW5nQ29ubmVjdGlvbnMoKTsKLS8vCQkJCWlmIChpbmNvbWluZ0Nvbm5lY3Rpb25zLnNpemUoKSA+IDEgJiYgb3V0Z29pbmdDb25uZWN0aW9ucy5zaXplKCkgPT0gMSkKLS8vCQkJCQlyZXR1cm4gY3JlYXRlTWVyZ2VOb2RlKG5vZGUpOwotLy8JCQkJaWYgKGluY29taW5nQ29ubmVjdGlvbnMuc2l6ZSgpID09IDEgJiYgb3V0Z29pbmdDb25uZWN0aW9ucy5zaXplKCkgPiAxKQotLy8JCQkJCXJldHVybiBjcmVhdGVEZWNpc2lvbk5vZGUobm9kZSk7Ci0vLwkJCQlpZiAoaW5jb21pbmdDb25uZWN0aW9ucy5zaXplKCkgPiAxCi0vLwkJCQkJCSYmIG91dGdvaW5nQ29ubmVjdGlvbnMuc2l6ZSgpID4gMSkgewotLy8JCQkJCWNyZWF0ZU1lcmdlTm9kZShub2RlKTsKLS8vCQkJCQlyZXR1cm4gY3JlYXRlRGVjaXNpb25Ob2RlKG5vZGUpOwotLy8JCQkJfQotCQkJfSBlbHNlIGlmICh0eXBlZE5vZGUuZ2V0VHlwZSgpID09IFR5cGVkTm9kZS5TVEFSVCkKLQkJCQlyZXR1cm4gY3JlYXRlSW5pdGlhbE5vZGUobm9kZSk7Ci0JCQllbHNlIGlmICh0eXBlZE5vZGUuZ2V0VHlwZSgpID09IFR5cGVkTm9kZS5FTkQpCi0JCQkJcmV0dXJuIGNyZWF0ZUZpbmFsTm9kZShub2RlKTsKLQkJCWVsc2UgaWYgKHR5cGVkTm9kZS5nZXRUeXBlKCkgPT0gVHlwZWROb2RlLlNZTkNIX0JBUikgewotCQkJCUxpc3QgaW5jb21pbmdDb25uZWN0aW9ucyA9IHR5cGVkTm9kZS5nZXRJbmNvbWluZ0Nvbm5lY3Rpb25zKCk7Ci0JCQkJaWYgKGluY29taW5nQ29ubmVjdGlvbnMuc2l6ZSgpID4gMSkKLQkJCQkJcmV0dXJuIGNyZWF0ZUpvaW5Ob2RlKG5vZGUpOwotCQkJCWVsc2UKLQkJCQkJcmV0dXJuIGNyZWF0ZUZvcmtOb2RlKG5vZGUpOwotLy8JCQkJTGlzdCBvdXRnb2luZ0Nvbm5lY3Rpb25zID0gdHlwZWROb2RlLmdldE91dGdvaW5nQ29ubmVjdGlvbnMoKTsKLS8vCQkJCWlmIChpbmNvbWluZ0Nvbm5lY3Rpb25zLnNpemUoKSA+IDEgJiYgb3V0Z29pbmdDb25uZWN0aW9ucy5zaXplKCkgPT0gMSkKLS8vCQkJCQlyZXR1cm4gY3JlYXRlSm9pbk5vZGUobm9kZSk7Ci0vLwkJCQlpZiAoaW5jb21pbmdDb25uZWN0aW9ucy5zaXplKCkgPT0gMSAmJiBvdXRnb2luZ0Nvbm5lY3Rpb25zLnNpemUoKSA+IDEpCi0vLwkJCQkJcmV0dXJuIGNyZWF0ZUZvcmtOb2RlKG5vZGUpOwotLy8JCQkJaWYgKGluY29taW5nQ29ubmVjdGlvbnMuc2l6ZSgpID4gMQotLy8JCQkJCQkmJiBvdXRnb2luZ0Nvbm5lY3Rpb25zLnNpemUoKSA+IDEpIHsKLS8vCQkJCQljcmVhdGVKb2luTm9kZShub2RlKTsKLS8vCQkJCQlyZXR1cm4gY3JlYXRlRm9ya05vZGUobm9kZSk7Ci0vLwkJCQl9Ci0JCQl9IGVsc2UgaWYgKHR5cGVkTm9kZS5nZXRUeXBlKCkgPT0gVHlwZWROb2RlLkZSRUVfVEVYVCkgewotCQkJCXJldHVybiBjcmVhdGVGcmVlVGV4dE5vZGUobm9kZSk7Ci0JCQl9Ci0JCWNhc2UgTW9kZWxQYWNrYWdlLkxJTks6Ci0JCQlyZXR1cm4gY3JlYXRlQ29udHJvbEZsb3cobm9kZSk7Ci0JCWRlZmF1bHQ6Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgY2xhc3MgJyIgLy8kTk9OLU5MUy0xJAotCQkJCQkrIG5vZGUuZUNsYXNzKCkuZ2V0TmFtZSgpICsgIicgaXMgbm90IGEgdmFsaWQgY2xhc3NpZmllciIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQlwcml2YXRlIE1hcE5vZGUgY3JlYXRlV29ya0JyZWFrRG93bkVsZW1lbnROb2RlKE5vZGUgbm9kZSkgewotCQlPYmplY3Qgb2JqID0gbm9kZS5nZXRPYmplY3QoKTsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIEFjdGl2aXR5KSAKLQkJCXJldHVybiBuZXcgQWN0aXZpdHlNYXBOb2RlKG5vZGUpOwotCQllbHNlIGlmIChvYmogaW5zdGFuY2VvZiBUYXNrRGVzY3JpcHRvciB8fCBvYmogaW5zdGFuY2VvZiBNaWxlc3RvbmUpIAotCQkJcmV0dXJuIG5ldyBBY3Rpdml0eVBhcmFtZXRlck1hcGVOb2RlKG5vZGUpOwotCQkKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBNYXBOb2RlIGNyZWF0ZUZyZWVUZXh0Tm9kZShOb2RlIG5vZGUpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBNYXBOb2RlIGNyZWF0ZUZpbmFsTm9kZShOb2RlIG5vZGUpIHsKLQkJcmV0dXJuIG5ldyBGaW5hbE5vZGVNYXAobm9kZSk7Ci0JfQotCi0JcHJpdmF0ZSBNYXBOb2RlIGNyZWF0ZUluaXRpYWxOb2RlKE5vZGUgbm9kZSkgewotCQlyZXR1cm4gbmV3IEluaXRpYWxOb2RlTWFwKG5vZGUpOwotCX0KLQotCXByaXZhdGUgTWFwTm9kZSBjcmVhdGVDb250cm9sRmxvdyhOb2RlIG5vZGUpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBNYXBOb2RlIGNyZWF0ZU1lcmdlTm9kZShOb2RlIG5vZGUpIHsKLQkJcmV0dXJuIG5ldyBNZXJnZU5vZGVNYXAobm9kZSk7Ci0JfQotCi0JcHJpdmF0ZSBNYXBOb2RlIGNyZWF0ZUpvaW5Ob2RlKE5vZGUgbm9kZSkgewotCQlyZXR1cm4gbmV3IEpvaW5Ob2RlTWFwKG5vZGUpOwotCX0KLQotCXByaXZhdGUgTWFwTm9kZSBjcmVhdGVEZWNpc2lvbk5vZGUoTm9kZSBub2RlKSB7Ci0JCXJldHVybiBuZXcgRGVjaXNpb25Ob2RlTWFwKG5vZGUpOwotCX0KLQotCXByaXZhdGUgTWFwTm9kZSBjcmVhdGVGb3JrTm9kZShOb2RlIG5vZGUpIHsKLQkJcmV0dXJuIG5ldyBGb3JrTm9kZU1hcChub2RlKTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubWlncmF0aW9uLmRpYWdyYW0vc3JjL29yZy9lY2xpcHNlL2VwZi9taWdyYXRpb24vZGlhZ3JhbS9hZC9tYXAvTWFwTm9kZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1pZ3JhdGlvbi5kaWFncmFtL3NyYy9vcmcvZWNsaXBzZS9lcGYvbWlncmF0aW9uL2RpYWdyYW0vYWQvbWFwL01hcE5vZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzE4N2E0Yi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubWlncmF0aW9uLmRpYWdyYW0vc3JjL29yZy9lY2xpcHNlL2VwZi9taWdyYXRpb24vZGlhZ3JhbS9hZC9tYXAvTWFwTm9kZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTI4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5taWdyYXRpb24uZGlhZ3JhbS5hZC5tYXA7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5BYnNvbHV0ZUJlbmRwb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuRGltZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUHJlY2lzaW9uUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5BY3Rpdml0eUZpbmFsTm9kZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuRGVjaXNpb25Ob2RlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5Gb3JrTm9kZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuSm9pbk5vZGVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLk1lcmdlTm9kZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuYnJpZGdlLkJyaWRnZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnV0aWwuRGlhZ3JhbUNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTmFtZWROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uQm91bmRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkRpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRWRnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5JZGVudGl0eUFuY2hvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob3RhdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uUmVsYXRpdmVCZW5kcG9pbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uZGF0YXR5cGUuUmVsYXRpdmVCZW5kcG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuQWN0aXZpdHlOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkNvbnRyb2xGbG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLlVNTFBhY2thZ2U7Ci0KLS8qKgotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBNYXBOb2RlIGltcGxlbWVudHMgSU1hcENvbnN0YW50cyB7Ci0KLQlwcm90ZWN0ZWQgTm9kZSBub2RlOwotCi0JLy9wcml2YXRlIFJlc291cmNlU2V0IHJlc291cmNlU2V0OwotCi0JcHJvdGVjdGVkIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vZGUgbm90YXRpb25Ob2RlOwotCi0JcHJpdmF0ZSBBY3Rpdml0eSBhY3Rpdml0eTsKLQkKLQlwcml2YXRlIERpYWdyYW0gZGlhZ3JhbTsKLQotCXByb3RlY3RlZCBTdHJpbmcgbmFtZTsKLQotCXByb3RlY3RlZCBBY3Rpdml0eU5vZGUgdW1sTm9kZTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBJTUFHRV9IRUlHSFQgPSAzMjsKLQkKLQlwdWJsaWMgTWFwTm9kZShOb2RlIG5vZGUpIHsKLQkJdGhpcy5ub2RlID0gbm9kZTsKLQl9Ci0KLQlwdWJsaWMgTWFwTm9kZSgpIHsKLQl9Ci0KLQkvKioKLQkgKiBVcGRhdGUgcmVzb3VyY2UKLQkgKiAKLQkgKiBAcGFyYW0gcmVzb3VyY2VTZXQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vZGUgdXBkYXRlUmVzb3VyY2UoKSB7Ci0JCURpYWdyYW0gZGlhZ3JhbSA9IGdldERpYWdyYW0oKTsKLQotCQkvLyBDaGVjayBpZiBub3RhdGlvbiBlbGVtZW50IGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGdyYXBoVU1MTm9kZU1hcC5nZXQobm9kZSkgIT0gbnVsbCkgewotCQkJb3JnLmVjbGlwc2UudW1sMi51bWwuQWN0aXZpdHlOb2RlIHRlbXBVTUxOb2RlID0gKEFjdGl2aXR5Tm9kZSkgZ3JhcGhVTUxOb2RlTWFwCi0JCQkJCS5nZXQobm9kZSk7Ci0JCQlvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob2RlIHRlbXBOb3RhdGlvbk5vZGUgPSBmaW5kTm90YXRpb25Ob2RlKAotCQkJCQlkaWFncmFtLCB0ZW1wVU1MTm9kZSk7Ci0JCQlpZiAodGVtcE5vdGF0aW9uTm9kZSAhPSBudWxsKQotCQkJCXJldHVybiB0ZW1wTm90YXRpb25Ob2RlOwotCi0JCX0KLQotCQkvLyBDcmVhdGUgQWN0aXZpdHkgTm9kZQotCQl1cGRhdGVOb2RlKCk7Ci0KLQkJLy8gQ3JlYXRlIE5vdGF0aW9uIG5ub2RlCi0JCW5vdGF0aW9uTm9kZSA9IE1hcFV0aWwuY3JlYXRlTm90YXRpb25Ob2RlX0FEKGRpYWdyYW0sIHVtbE5vZGUpOwotCQlkaWFncmFtLmluc2VydENoaWxkKG5vdGF0aW9uTm9kZSk7Ci0KLQkJLy8gc2V0IHNpemUKLQkJc2V0TGF5b3V0Q29uc3RyYWludChub2RlLCBub3RhdGlvbk5vZGUpOwotCi0JCS8vIHNldCBlbGVtZW50Ci0JCW5vdGF0aW9uTm9kZS5zZXRFbGVtZW50KHVtbE5vZGUpOwotCi0JCS8vIG1hcmsgaW5oZXJpdGVkCi0JCXNldEluaGVyaXRlZEF0dHJpYnV0ZShub2RlLCBub3RhdGlvbk5vZGUpOwotCQkKLQkJcmV0dXJuIG5vdGF0aW9uTm9kZTsKLQl9Ci0KLQkKLQkvKioKLQkgKiBAcGFyYW0gbm9kZQotCSAqIEBwYXJhbSBub3RhdGlvbk5vZGUKLQkgKi8KLQlwcml2YXRlIHZvaWQgc2V0TGF5b3V0Q29uc3RyYWludChvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlIG5vZGUsCi0JCQlvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob2RlIG5vdGF0aW9uTm9kZSkgewotCQlCb3VuZHMgYm91bmRzID0gTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVCb3VuZHMoKTsKLQkJCi0JCWludCB0eXBlID0gbmV3IEludGVnZXIobm90YXRpb25Ob2RlLmdldFR5cGUoKSkuaW50VmFsdWUoKTsKLQkJaWYgKG5vZGUuZ2V0SGVpZ2h0KCkgPT0gLTEpIHsKLQkJCSBpZiAodHlwZSA9PSBEZWNpc2lvbk5vZGVFZGl0UGFydC5WSVNVQUxfSUQgfHwgdHlwZSA9PSBNZXJnZU5vZGVFZGl0UGFydC5WSVNVQUxfSUQpCXsKLQkJCQkgYm91bmRzLnNldEhlaWdodCgyNCk7Ci0JCQkgfQotCQkJIGVsc2UgaWYgKHR5cGUgPT0gRm9ya05vZGVFZGl0UGFydC5WSVNVQUxfSUQgfHwgdHlwZSA9PSBKb2luTm9kZUVkaXRQYXJ0LlZJU1VBTF9JRCkJewotCQkJCSBib3VuZHMuc2V0SGVpZ2h0KDUpOwotCQkJIH0KLQkJCSBlbHNlIGlmICh0eXBlID09IEFjdGl2aXR5RmluYWxOb2RlRWRpdFBhcnQuVklTVUFMX0lEKXsKLQkJCQkgYm91bmRzLnNldEhlaWdodCgyNCk7Ci0JCQkgfQotCQl9IGVsc2UgewotCQkJYm91bmRzLnNldEhlaWdodChub2RlLmdldEhlaWdodCgpKTsKLQkJfQotCQkKLQkJLy8gRHVlIHRvIGJ1ZyBpbiBvbGQgZGlhZ3JhbSwgc29tZSBvZiB0aGUgZGVjaXNpb25Ob2RlIHdpZHRoIGlzIC0xCi0JCWlmICgobm9kZS5nZXRXaWR0aCgpID09IC0xKSAmJiAodHlwZSA9PSBEZWNpc2lvbk5vZGVFZGl0UGFydC5WSVNVQUxfSUQKLQkJCQkJfHwgdHlwZSA9PSBNZXJnZU5vZGVFZGl0UGFydC5WSVNVQUxfSUQpKSB7Ci0JCQkJYm91bmRzLnNldFdpZHRoKDQ4KTsKLQkJfSBlbHNlIHsKLQkJCWJvdW5kcy5zZXRXaWR0aChub2RlLmdldFdpZHRoKCkpOwotCQl9Ci0JCQotCQlpbnQgdyA9IGJvdW5kcy5nZXRXaWR0aCgpOwotCQlpbnQgaCA9IGJvdW5kcy5nZXRIZWlnaHQoKTsKLQkJRGltZW5zaW9uIGRpbSA9IERpYWdyYW1Db3JlVXRpbC5nZXRUZXh0U2l6ZUluV3JhcExhYmVsKG5hbWUsIG51bGwsIHcsIGgsIG51bGwpOwotCQlpbnQgZGltdyA9IGRpbS53aWR0aDsKLQkJaWYgKHcgPCBkaW13ICYmIGRpbXcgIT0gMCkgewotCQkJYm91bmRzLnNldFdpZHRoKGRpbXcpOwotCQl9Ci0JCQotLy8JCWJvdW5kcy5zZXRIZWlnaHQobm9kZS5nZXRIZWlnaHQoKSk7Ci0vLwkJYm91bmRzLnNldFdpZHRoKG5vZGUuZ2V0V2lkdGgoKSk7Ci0JCWJvdW5kcy5zZXRYKG5vZGUuZ2V0TG9jYXRpb24oKS54KTsKLQkJYm91bmRzLnNldFkobm9kZS5nZXRMb2NhdGlvbigpLnkpOwotCQlub3RhdGlvbk5vZGUuc2V0TGF5b3V0Q29uc3RyYWludChib3VuZHMpOwotCX0KLQotCS8qKgotCSAqIFNldCBpbmhlcml0ZWQgYXR0cmlidXRlCi0JICogQHBhcmFtIG5vZGUKLQkgKiBAcGFyYW0gbm90YXRpb25Ob2RlCi0JICovCi0JcHJpdmF0ZSB2b2lkIHNldEluaGVyaXRlZEF0dHJpYnV0ZShvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlIG5vZGUsCi0JCQlvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob2RlIG5vdGF0aW9uTm9kZSkgewotCQlpZiAobm9kZS5nZXRMaW5rZWRFbGVtZW50KCkgPT0gbnVsbCkgewotCQkJaWYgKG5vZGUuZ2V0R3JhcGhOb2RlKCkuZ2V0QnJpZWZEZXNjcmlwdGlvbigpICE9IG51bGwKLQkJCQkJJiYgIShub2RlLmdldEdyYXBoTm9kZSgpLmdldEJyaWVmRGVzY3JpcHRpb24oKS50cmltKCkKLQkJCQkJCQkuZXF1YWxzKCIiKSkpIC8vJE5PTi1OTFMtMSQKLQkJCQlCcmlkZ2VIZWxwZXIubWFya0luaGVyaXRlZChub3RhdGlvbk5vZGUpOwotCQl9IAotCX0KLQkKLQkKLQkvKioKLQkgKiBGaW5kIGNvcnJlc3BvbmRpbmcgbm90YXRpb24gbm9kZSBmb3IgdGhlIHVtbCBub2RlIGluIHRoZSBkaWFncmFtCi0JICogQHBhcmFtIGRpYWdyYW0KLQkgKiBAcGFyYW0gdW1sTm9kZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vZGUgZmluZE5vdGF0aW9uTm9kZSgKLQkJCURpYWdyYW0gZGlhZ3JhbSwgQWN0aXZpdHlOb2RlIHVtbE5vZGUpIHsKLQkJTGlzdCBsaXN0ID0gZGlhZ3JhbS5nZXRDaGlsZHJlbigpOwotCQlpZiAobGlzdCAhPSBudWxsICYmIGxpc3Quc2l6ZSgpID4gMCkgewotCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGxpc3QuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJCW9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vZGUgbm9kZSA9IChvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob2RlKSBpdGVyYXRvcgotCQkJCQkJLm5leHQoKTsKLQkJCQlpZiAodW1sTm9kZS5lcXVhbHMobm9kZS5nZXRFbGVtZW50KCkpKSB7Ci0JCQkJCXJldHVybiBub2RlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBVcGRhdGUgVW1sIG5vZGUKLQkgKi8KLQlwdWJsaWMgdm9pZCB1cGRhdGVOb2RlKCkgewotCQlpZiAobm9kZSBpbnN0YW5jZW9mIE5hbWVkTm9kZSkgewotCQkJbmFtZSA9ICgoTmFtZWROb2RlKSBub2RlKS5nZXROYW1lKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgb3V0Z29pbmcgY29ubmVjdGlvbnMKLQkgKiBAcGFyYW0gbm9kZQotCSAqLwotCXB1YmxpYyB2b2lkIG91dGdvaW5nQ29ubmVjdGlvbnMoTm9kZSBub2RlKSB7Ci0JCUxpc3QgY29ubmVjdGlvbnMgPSBub2RlLmdldE91dGdvaW5nQ29ubmVjdGlvbnMoKTsKLQotCQlpZiAoY29ubmVjdGlvbnMgIT0gbnVsbCAmJiBjb25uZWN0aW9ucy5zaXplKCkgPiAwKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gY29ubmVjdGlvbnMuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJCUxpbmsgbGluayA9IChMaW5rKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCi0JCQkJLy8gY3JlYXRlIGNvbm5lY3Rpb24KLQkJCQlFZGdlIGVkZ2UgPSBjcmVhdGVDb25uZWN0aW9uKGxpbmspOwotCi0JCQkJQWN0aXZpdHlOb2RlIHNvdXJjZU5vZGUgPSAob3JnLmVjbGlwc2UudW1sMi51bWwuQWN0aXZpdHlOb2RlKSBncmFwaFVNTE5vZGVNYXAKLQkJCQkJCS5nZXQobm9kZSk7Ci0JCQkJb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm9kZSBzb3VyY2VOb3RhdGlvbk5vZGUgPSBmaW5kTm90YXRpb25Ob2RlKAotCQkJCQkJZ2V0RGlhZ3JhbSgpLCBzb3VyY2VOb2RlKTsKLQotCQkJCS8vIGFkZCB0aGUgZWRnZSBhcyBzb3VyY2UgZWRnZQotCQkJCXNvdXJjZU5vdGF0aW9uTm9kZS5nZXRTb3VyY2VFZGdlcygpLmFkZChlZGdlKTsKLQkJCQlzb3VyY2VOb3RhdGlvbk5vZGUuZ2V0RGlhZ3JhbSgpLmluc2VydEVkZ2UoZWRnZSk7Ci0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBVTUwgY29udHJvbCBmbG93Ci0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgQ29udHJvbEZsb3cgY3JlYXRlQ29udHJvbEZsb3coKSB7Ci0JCUNvbnRyb2xGbG93IGNvbnRyb2xGbG93ID0gKG9yZy5lY2xpcHNlLnVtbDIudW1sLkNvbnRyb2xGbG93KSBnZXRBY3Rpdml0eSgpCi0JCQkJLmNyZWF0ZUVkZ2UoIiIsIC8qTWlncmF0aW9uUmVzb3VyY2VzLkdSQVBIX05PREVfTElOSywqLyAvLyROT04tTkxTLTEkCi0JCQkJCQlVTUxQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb250cm9sRmxvdygpKTsKLQotCQlyZXR1cm4gY29udHJvbEZsb3c7Ci0JfQotCi0JLyoqCi0JICogTG9hZHMgc291cmNlIGFuZCB0YXJnZXQgZW5kIHBvaW50cyBmb3Igc3luY2hyb25pemF0aW9uIGJhciBhbmQgZGVjaXNpb24gbm9kZQotCSAqIEBwYXJhbSBlZGdlCi0JICogQHBhcmFtIGZsb3cKLQkgKi8KLQlwcml2YXRlIHZvaWQgbG9hZFNvdXJjZUFuZFRhcmdldEVuZFBvaW50KEVkZ2UgZWRnZSwgTGluayBmbG93KSB7Ci0JCVBvaW50IHNyY1BvaW50ID0gZmxvdy5nZXRTb3VyY2VFbmRQb2ludCgpOwotCQlQb2ludCB0YXJnZXRQb2ludCA9IGZsb3cuZ2V0VGFyZ2V0RW5kUG9pbnQoKTsKLQotCQlWaWV3IHNyY1ZpZXcgPSBlZGdlLmdldFNvdXJjZSgpOwotCQlWaWV3IHRhcmdldFZpZXcgPSBlZGdlLmdldFRhcmdldCgpOwotCQlpbnQgc3JjVHlwZSA9IG5ldyBJbnRlZ2VyKHNyY1ZpZXcuZ2V0VHlwZSgpKS5pbnRWYWx1ZSgpOwotCQlpbnQgdGFyZ2V0VHlwZSA9IG5ldyBJbnRlZ2VyKHRhcmdldFZpZXcuZ2V0VHlwZSgpKS5pbnRWYWx1ZSgpOwotCi0JCWlmIChzcmNUeXBlID09IEZvcmtOb2RlRWRpdFBhcnQuVklTVUFMX0lEIHx8IHNyY1R5cGUgPT0gSm9pbk5vZGVFZGl0UGFydC5WSVNVQUxfSUQgfHwKLQkJCQlzcmNUeXBlID09IERlY2lzaW9uTm9kZUVkaXRQYXJ0LlZJU1VBTF9JRCB8fCBzcmNUeXBlID09IE1lcmdlTm9kZUVkaXRQYXJ0LlZJU1VBTF9JRCkgewotCQkJaWYgKHNyY1BvaW50ICE9IG51bGwKLQkJCQkJJiYgc3JjVmlldyBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vZGUgKSB7Ci0JCQkJQm91bmRzIGJvdW5kcyA9IChCb3VuZHMpICgob3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm9kZSkgc3JjVmlldykKLQkJCQkJCS5nZXRMYXlvdXRDb25zdHJhaW50KCk7Ci0JCQkJSWRlbnRpdHlBbmNob3IgYW5jaG9yID0gY3JlYXRlSWRlbnRpdHlBbmNob3Ioc3JjUG9pbnQsIGJvdW5kcyk7Ci0JCQkJaWYgKGFuY2hvciAhPSBudWxsKQotCQkJCQllZGdlLnNldFNvdXJjZUFuY2hvcihhbmNob3IpOwotCQkJfQotCQl9Ci0JCWlmICh0YXJnZXRUeXBlID09IEZvcmtOb2RlRWRpdFBhcnQuVklTVUFMX0lEIHx8IHRhcmdldFR5cGUgPT0gSm9pbk5vZGVFZGl0UGFydC5WSVNVQUxfSUQgfHwKLQkJCQl0YXJnZXRUeXBlID09IERlY2lzaW9uTm9kZUVkaXRQYXJ0LlZJU1VBTF9JRCB8fCB0YXJnZXRUeXBlID09IE1lcmdlTm9kZUVkaXRQYXJ0LlZJU1VBTF9JRCkgewotCQkJaWYgKHRhcmdldFBvaW50ICE9IG51bGwKLQkJCQkJJiYgdGFyZ2V0VmlldyBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vZGUpIHsKLQkJCQlCb3VuZHMgYm91bmRzID0gKEJvdW5kcykgKChvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob2RlKSB0YXJnZXRWaWV3KQotCQkJCQkJLmdldExheW91dENvbnN0cmFpbnQoKTsKLQkJCQlJZGVudGl0eUFuY2hvciBhbmNob3IgPSBjcmVhdGVJZGVudGl0eUFuY2hvcih0YXJnZXRQb2ludCwgYm91bmRzKTsKLQkJCQlpZiAoYW5jaG9yICE9IG51bGwpCi0JCQkJCWVkZ2Uuc2V0VGFyZ2V0QW5jaG9yKGFuY2hvcik7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JCi0JLyoqCi0JICogQ3JlYXRlIGlkZW50aXR5IGFuY2hvcgotCSAqIEBwYXJhbSBwb2ludAotCSAqIEBwYXJhbSBib3VuZHMKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBJZGVudGl0eUFuY2hvciBjcmVhdGVJZGVudGl0eUFuY2hvcihQb2ludCBwb2ludCwgQm91bmRzIGJvdW5kcykgewotCQlQb2ludCB0ZW1wUG9pbnQgPSBuZXcgUG9pbnQoYm91bmRzLmdldFgoKSArIHBvaW50LngsIGJvdW5kcy5nZXRZKCkKLQkJCQkrIHBvaW50LnkpOwotCi0JCVByZWNpc2lvblBvaW50IHByZVBvaW50ID0gTWFwVXRpbC5nZXRBbmNob3JSZWxhdGl2ZUxvY2F0aW9uKHRlbXBQb2ludCwgYm91bmRzKTsKLQkJU3RyaW5nIGlkID0gTWFwVXRpbC5jb21wb3NlVGVybWluYWxTdHJpbmcocHJlUG9pbnQpOwotCi0JCUlkZW50aXR5QW5jaG9yIHZhbHVlID0gTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVJZGVudGl0eUFuY2hvcigpOwotCQl2YWx1ZS5zZXRJZChpZCk7Ci0KLQkJcmV0dXJuIHZhbHVlOwotCX0KLQkKLQkKLQkKLQkvKioKLQkgKiBMb2FkIHJlbGF0aXZlIGJlbmQgcG9pbnRzCi0JICogQHBhcmFtIGVkZ2UKLQkgKiBAcGFyYW0gZmxvdwotCSAqLwotCXByaXZhdGUgdm9pZCBsb2FkQmVuZFBvaW50cyhFZGdlIGVkZ2UsIExpbmsgZmxvdykgewotCQlMaXN0IGxpc3QgPSBmbG93LmdldEJlbmRwb2ludHMoKTsKLQkJTGlzdDxSZWxhdGl2ZUJlbmRwb2ludD4gcmVsYXRpdmVQb2ludHMgPSBuZXcgQXJyYXlMaXN0PFJlbGF0aXZlQmVuZHBvaW50PigpOwotCi0JCVJlbGF0aXZlQmVuZHBvaW50IHJicCA9IG5ldyBSZWxhdGl2ZUJlbmRwb2ludCgwLCAwLCAwLCAwKTsKLQotCQlyZWxhdGl2ZVBvaW50cy5hZGQocmJwKTsKLQkJaWYgKGxpc3QgIT0gbnVsbCAmJiBsaXN0LnNpemUoKSA+IDApIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBsaXN0Lml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCQlBYnNvbHV0ZUJlbmRwb2ludCBhYnAgPSAoQWJzb2x1dGVCZW5kcG9pbnQpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkKLQkJCQlvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob2RlIHNyY05vZGUgPSAob3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm9kZSkgZWRnZS5nZXRTb3VyY2UoKTsKLQkJCQlvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob2RlIHRhcmdldE5vZGUgPSAob3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm9kZSkgZWRnZS5nZXRUYXJnZXQoKTsKLQkJCQlpbnQgc3JjVHlwZSA9IG5ldyBJbnRlZ2VyKHNyY05vZGUuZ2V0VHlwZSgpKS5pbnRWYWx1ZSgpOwotCQkJCWludCB0YXJnZXRUeXBlID0gbmV3IEludGVnZXIodGFyZ2V0Tm9kZS5nZXRUeXBlKCkpLmludFZhbHVlKCk7Ci0JCQkJCi0JCQkJQm91bmRzIHNvdXJjZUJvdW5kcyA9IChCb3VuZHMpIHNyY05vZGUuZ2V0TGF5b3V0Q29uc3RyYWludCgpOwkJCQkKLQkJCQlCb3VuZHMgdGFyZ2V0Qm91bmRzID0gKEJvdW5kcykgdGFyZ2V0Tm9kZS5nZXRMYXlvdXRDb25zdHJhaW50KCk7Ci0JCQkJCQkKLQkJCQlpbnQgc3JjTGluZSA9IE1hcFV0aWwuZ2V0Tm9PZkxpbmVzKHNyY05vZGUpOwotCQkJCWludCB0YXJnZXRMaW5lID0gTWFwVXRpbC5nZXROb09mTGluZXModGFyZ2V0Tm9kZSk7Ci0JCQkJaW50IHNyY0hlaWdodCA9IE1hcFV0aWwuZ2V0VGV4dEhlaWdodChzcmNOb2RlKTsKLQkJCQlpbnQgdGFyZ2V0SGVpZ2h0ID0gTWFwVXRpbC5nZXRUZXh0SGVpZ2h0KHRhcmdldE5vZGUpOwotCQkJCQotCQkJCWludCBzcmNYID0gc291cmNlQm91bmRzLmdldFgoKSArIHNvdXJjZUJvdW5kcy5nZXRXaWR0aCgpIC8gMjsKLQkJCQlpbnQgc3JjWSA9IHNvdXJjZUJvdW5kcy5nZXRZKCkgKyAoSU1BR0VfSEVJR0hUICsgKHNyY0xpbmUgKiBzcmNIZWlnaHQpKSAvIDI7Ci0JCQkJaW50IHRhclggPSB0YXJnZXRCb3VuZHMuZ2V0WCgpICsgdGFyZ2V0Qm91bmRzLmdldFdpZHRoKCkgLyAyOwotCQkJCWludCB0YXJZID0gdGFyZ2V0Qm91bmRzLmdldFkoKSArIChJTUFHRV9IRUlHSFQgKyAodGFyZ2V0TGluZSAqIHRhcmdldEhlaWdodCkpIC8gMjsKLQotCQkJCWlmIChzcmNUeXBlID09IEZvcmtOb2RlRWRpdFBhcnQuVklTVUFMX0lECi0JCQkJCQl8fCBzcmNUeXBlID09IEpvaW5Ob2RlRWRpdFBhcnQuVklTVUFMX0lECi0JCQkJCQl8fCBzcmNUeXBlID09IERlY2lzaW9uTm9kZUVkaXRQYXJ0LlZJU1VBTF9JRAotCQkJCQkJfHwgc3JjVHlwZSA9PSBNZXJnZU5vZGVFZGl0UGFydC5WSVNVQUxfSUQpIHsKLQkJCQkJUG9pbnQgc3JjUG9pbnQgPSBmbG93LmdldFNvdXJjZUVuZFBvaW50KCk7Ci0JCQkJCWlmIChzcmNQb2ludCAhPSBudWxsKSB7Ci0JCQkJCQlzcmNYID0gc291cmNlQm91bmRzLmdldFgoKSArIHNyY1BvaW50Lng7Ci0JCQkJCQlzcmNZID0gc291cmNlQm91bmRzLmdldFkoKSArIHNyY1BvaW50Lnk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKHRhcmdldFR5cGUgPT0gRm9ya05vZGVFZGl0UGFydC5WSVNVQUxfSUQKLQkJCQkJCXx8IHRhcmdldFR5cGUgPT0gSm9pbk5vZGVFZGl0UGFydC5WSVNVQUxfSUQKLQkJCQkJCXx8IHRhcmdldFR5cGUgPT0gRGVjaXNpb25Ob2RlRWRpdFBhcnQuVklTVUFMX0lECi0JCQkJCQl8fCB0YXJnZXRUeXBlID09IE1lcmdlTm9kZUVkaXRQYXJ0LlZJU1VBTF9JRCkgewotCQkJCQlQb2ludCB0YXJnZXRQb2ludCA9IGZsb3cuZ2V0VGFyZ2V0RW5kUG9pbnQoKTsJCQotCQkJCQlpZiAodGFyZ2V0UG9pbnQgIT0gbnVsbCkgewotCQkJCQkJdGFyWCA9IHRhcmdldEJvdW5kcy5nZXRYKCkgKyB0YXJnZXRQb2ludC54OwotCQkJCQkJdGFyWSA9IHRhcmdldEJvdW5kcy5nZXRZKCkgKyB0YXJnZXRQb2ludC55OwotCQkJCQl9CQkJCi0JCQkJfQkJCQotCQkJCWlmICh0YXJnZXRUeXBlID09IEFjdGl2aXR5RmluYWxOb2RlRWRpdFBhcnQuVklTVUFMX0lEKXsJCi0JCQkJCXRhclggPSB0YXJnZXRCb3VuZHMuZ2V0WCgpICsgdGFyZ2V0Qm91bmRzLmdldFdpZHRoKCkgLyAyOwotCQkJCQl0YXJZID0gdGFyZ2V0Qm91bmRzLmdldFkoKSArIHRhcmdldEJvdW5kcy5nZXRIZWlnaHQoKSAvIDI7CQkKLQkJCQl9Ci0KLQkJCQlpbnQgcmVsMSA9IGFicC54IC0gc3JjWDsKLQkJCQlpbnQgcmVsMiA9IGFicC55IC0gc3JjWTsKLQkJCQlpbnQgcmVsMyA9IGFicC54IC0gdGFyWDsKLQkJCQlpbnQgcmVsNCA9IGFicC55IC0gdGFyWTsKLQotCQkJCVJlbGF0aXZlQmVuZHBvaW50IHJicDEgPSBuZXcgUmVsYXRpdmVCZW5kcG9pbnQocmVsMSwgcmVsMiwKLQkJCQkJCXJlbDMsIHJlbDQpOwotCQkJCXJlbGF0aXZlUG9pbnRzLmFkZChyYnAxKTsKLQkJCX0KLQkJfQotCQlyZWxhdGl2ZVBvaW50cy5hZGQocmJwKTsKLQotCQlpZiAocmVsYXRpdmVQb2ludHMuc2l6ZSgpID4gMCkgewotCQkJUmVsYXRpdmVCZW5kcG9pbnRzIGJlbmRwb2ludHMgPSBOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJCS5jcmVhdGVSZWxhdGl2ZUJlbmRwb2ludHMoKTsKLQkJCWJlbmRwb2ludHMuc2V0UG9pbnRzKHJlbGF0aXZlUG9pbnRzKTsKLQkJCWVkZ2Uuc2V0QmVuZHBvaW50cyhiZW5kcG9pbnRzKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEZpbmQgZWRnZSBpbiBkaWFncmFtIGdpdmVuIHNvdXJjZSBhbmQgdGFyZ2V0IG5vZGVzCi0JICogQHBhcmFtIHNvdXJjZU5vZGUKLQkgKiBAcGFyYW0gdGFyZ2V0Tm9kZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIEVkZ2UgZmluZEVkZ2Uob3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm9kZSBzb3VyY2VOb2RlLAotCQkJb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm9kZSB0YXJnZXROb2RlKSB7Ci0JCUxpc3QgbGlzdCA9IG5vdGF0aW9uTm9kZS5nZXREaWFncmFtKCkuZ2V0RWRnZXMoKTsKLQkJaWYgKGxpc3QgIT0gbnVsbCAmJiBsaXN0LnNpemUoKSA+IDApIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBsaXN0Lml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCQlFZGdlIGVkZ2UgPSAoRWRnZSkgaXRlcmF0b3IubmV4dCgpOwotCQkJCWlmICgoZWRnZS5nZXRUYXJnZXQoKSAhPSBudWxsKQotCQkJCQkJJiYgdGFyZ2V0Tm9kZS5lcXVhbHMoZWRnZS5nZXRUYXJnZXQoKSkKLQkJCQkJCSYmIChlZGdlLmdldFNvdXJjZSgpICE9IG51bGwpCi0JCQkJCQkmJiBzb3VyY2VOb2RlLmVxdWFscyhlZGdlLmdldFNvdXJjZSgpKSkgewotCQkJCQlyZXR1cm4gZWRnZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0KLQkvKioKLQkgKiBDcmVhdGUgaW5jb21pbmcgY29ubmVjdGlvbnMKLQkgKiBAcGFyYW0gbm9kZQotCSAqLwotCXB1YmxpYyB2b2lkIGluY29taW5nQ29ubmVjdGlvbnMoTm9kZSBub2RlKSB7Ci0JCUxpc3QgY29ubmVjdGlvbnMgPSBub2RlLmdldEluY29taW5nQ29ubmVjdGlvbnMoKTsKLQotCQlpZiAoY29ubmVjdGlvbnMgIT0gbnVsbCAmJiBjb25uZWN0aW9ucy5zaXplKCkgPiAwKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gY29ubmVjdGlvbnMuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJCUxpbmsgbGluayA9IChMaW5rKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCi0JCQkJLy8gY3JlYXRlIGVkZ2UKLQkJCQlFZGdlIGVkZ2UgPSBjcmVhdGVDb25uZWN0aW9uKGxpbmspOwotCi0JCQkJQWN0aXZpdHlOb2RlIHNvdXJjZU5vZGUgPSAob3JnLmVjbGlwc2UudW1sMi51bWwuQWN0aXZpdHlOb2RlKSBncmFwaFVNTE5vZGVNYXAKLQkJCQkJCS5nZXQobm9kZSk7Ci0JCQkJb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm9kZSBzb3VyY2VOb3RhdGlvbk5vZGUgPSBmaW5kTm90YXRpb25Ob2RlKAotCQkJCQkJZ2V0RGlhZ3JhbSgpLCBzb3VyY2VOb2RlKTsKLQotCQkJCS8vIGFkZCB0aGUgZWRnZSBhcyB0YXJnZXQgZWRnZQotCQkJCXNvdXJjZU5vdGF0aW9uTm9kZS5nZXRUYXJnZXRFZGdlcygpLmFkZChlZGdlKTsKLQkJCQlzb3VyY2VOb3RhdGlvbk5vZGUuZ2V0RGlhZ3JhbSgpLmluc2VydEVkZ2UoZWRnZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgbm90YXRpb24gZWRnZSBmb3IgdGhlIGdpdmVuIGxpbmsKLQkgKiBAcGFyYW0gbGluawotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIEVkZ2UgY3JlYXRlQ29ubmVjdGlvbihMaW5rIGxpbmspIHsKLQkJLy8gZ2V0IHNvdXJjZSBhbmQgdGFyZ2V0IG9iamVjdHMgb2YgdGhlIGxpbmsKLQkJTm9kZSBzb3VyY2VPYmogPSBsaW5rLmdldFNvdXJjZSgpOwotCQlOb2RlIHRhcmdldE9iaiA9IGxpbmsuZ2V0VGFyZ2V0KCk7Ci0KLQkJLy8gZ2V0IHVtbCBub2RlcwotCQlBY3Rpdml0eU5vZGUgc291cmNlVU1MTm9kZSA9IChvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eU5vZGUpIGdyYXBoVU1MTm9kZU1hcAotCQkJCS5nZXQoc291cmNlT2JqKTsKLQkJQWN0aXZpdHlOb2RlIHRhcmdldFVNTE5vZGUgPSAob3JnLmVjbGlwc2UudW1sMi51bWwuQWN0aXZpdHlOb2RlKSBncmFwaFVNTE5vZGVNYXAKLQkJCQkuZ2V0KHRhcmdldE9iaik7Ci0KLQkJLy8gZ2V0IG5vdGF0aW9uIG5vZGVzCi0JCW9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vZGUgc291cmNlTm90YXRpb25Ob2RlID0gZmluZE5vdGF0aW9uTm9kZSgKLQkJCQlnZXREaWFncmFtKCksIHNvdXJjZVVNTE5vZGUpOwotCQlvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob2RlIHRhcmdldE5vdGF0aW9uTm9kZSA9IGZpbmROb3RhdGlvbk5vZGUoCi0JCQkJZ2V0RGlhZ3JhbSgpLCB0YXJnZXRVTUxOb2RlKTsKLQotCQlFZGdlIGVkZ2UgPSBmaW5kRWRnZShzb3VyY2VOb3RhdGlvbk5vZGUsIHRhcmdldE5vdGF0aW9uTm9kZSk7Ci0JCWlmIChlZGdlID09IG51bGwgJiYgdGFyZ2V0Tm90YXRpb25Ob2RlICE9IG51bGwpIHsKLQkJCUNvbnRyb2xGbG93IGNvbnRyb2xGbG93ID0gY3JlYXRlQ29udHJvbEZsb3coKTsKLQotCQkJaWYgKHRhcmdldFVNTE5vZGUgaW5zdGFuY2VvZiBBY3Rpdml0eU5vZGUpIHsKLQkJCQljb250cm9sRmxvdy5zZXRTb3VyY2UoKEFjdGl2aXR5Tm9kZSkgc291cmNlVU1MTm9kZSk7Ci0JCQkJY29udHJvbEZsb3cuc2V0VGFyZ2V0KChBY3Rpdml0eU5vZGUpIHRhcmdldFVNTE5vZGUpOwotCQkJfQotCi0JCQkvLyBjcmVhdGUgbm90YXRpb24gZWRnZQotCQkJZWRnZSA9IE1hcFV0aWwuY3JlYXRlRWRnZV9BRChzb3VyY2VOb3RhdGlvbk5vZGUsIHRhcmdldE5vdGF0aW9uTm9kZSwKLQkJCQkJY29udHJvbEZsb3cpOwotCQkJZWRnZS5zZXRFbGVtZW50KGNvbnRyb2xGbG93KTsKLQkJCWxvYWRTb3VyY2VBbmRUYXJnZXRFbmRQb2ludChlZGdlLCBsaW5rKTsKLQkJCWxvYWRCZW5kUG9pbnRzKGVkZ2UsIGxpbmspOwotCQl9Ci0JCXJldHVybiBlZGdlOwotCX0KLQotCS8vIHByaXZhdGUgRWRnZSBmaW5kRWRnZShvcmcuZWNsaXBzZS51bWwyLnVtbC5Db250cm9sRmxvdyBmbG93LCBEaWFncmFtCi0JLy8gZGlhZ3JhbSkgewotCS8vIExpc3QgbGlzdCA9IGRpYWdyYW0uZ2V0Q2hpbGRyZW4oKTsKLQkvLyBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gbGlzdC5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JLy8gT2JqZWN0IG9iamVjdCA9IGl0ZXJhdG9yLm5leHQoKTsKLQkvLyBpZiAob2JqZWN0IGluc3RhbmNlb2YgRWRnZSkgewotCS8vIE9iamVjdCBlbGVtZW50ID0gKChFZGdlKSBvYmplY3QpLmdldEVsZW1lbnQoKTsKLQkvLyBpZiAoZmxvdy5lcXVhbHMoZWxlbWVudCkpIHsKLQkvLyByZXR1cm4gKEVkZ2UpIG9iamVjdDsKLQkvLyB9Ci0JLy8gfQotCS8vIH0KLQkvLyByZXR1cm4gbnVsbDsKLQkvLyB9Ci0KLQlwcml2YXRlIERpYWdyYW0gZ2V0RGlhZ3JhbSgpIHsKLS8qCQlpZiAoZGlhZ3JhbSA9PSBudWxsKSB7Ci0JCQlSZXNvdXJjZSByZXNvdXJjZSA9IChSZXNvdXJjZSkgcmVzb3VyY2VTZXQuZ2V0UmVzb3VyY2VzKCkuZ2V0KDApOwotCQkJZGlhZ3JhbSA9IChEaWFncmFtKSByZXNvdXJjZS5nZXRDb250ZW50cygpLmdldCgxKTsKLQkJfSovCi0JCXJldHVybiBkaWFncmFtOwotCX0KLQotCXB1YmxpYyBBY3Rpdml0eSBnZXRBY3Rpdml0eSgpIHsKLS8qCQlpZiAoYWN0aXZpdHkgPT0gbnVsbCkgewotCQkJLy8gcmV0dXJuCi0JCQkvLyAoQWN0aXZpdHkpKChNb2RlbClnZXRVTUxPYmplY3QoKSkuYWxsT3duZWRFbGVtZW50cygpLmdldCgwKTsKLQkJCVJlc291cmNlIHJlc291cmNlID0gKFJlc291cmNlKSByZXNvdXJjZVNldC5nZXRSZXNvdXJjZXMoKS5nZXQoMCk7Ci0JCQlhY3Rpdml0eSA9IChBY3Rpdml0eSkgcmVzb3VyY2UuZ2V0Q29udGVudHMoKS5nZXQoMCk7Ci0JCX0qLwotCQlyZXR1cm4gYWN0aXZpdHk7Ci0JfQotCS8vIHB1YmxpYyBFT2JqZWN0IGdldFVNTE9iamVjdCgpewotCS8vIGlmKGVPYmplY3QgPT0gbnVsbCl7Ci0JLy8JCQkKLQkvLyBlT2JqZWN0ID0gKEFjdGl2aXR5KWdldFJlc291cmNlKDApLmdldENvbnRlbnRzKCkuZ2V0KDApOwotCS8vIH0KLQkvLyByZXR1cm4gZU9iamVjdDsKLQkvLyB9Ci0KLQlwdWJsaWMgdm9pZCBzZXREaWFncmFtKERpYWdyYW0gZGlhZ3JhbSkgewotCQl0aGlzLmRpYWdyYW0gPSBkaWFncmFtOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEFjdGl2aXR5KEFjdGl2aXR5IGFjdGl2aXR5KSB7Ci0JCXRoaXMuYWN0aXZpdHkgPSBhY3Rpdml0eTsKLQl9Ci0KLQkvLyBwcml2YXRlIFJlc291cmNlIGdldFJlc291cmNlKGludCBpKXsKLQkvLyByZXR1cm4gKFJlc291cmNlKXJlc291cmNlU2V0LmdldFJlc291cmNlcygpLmdldChpKTsKLQkvLyB9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5taWdyYXRpb24uZGlhZ3JhbS9zcmMvb3JnL2VjbGlwc2UvZXBmL21pZ3JhdGlvbi9kaWFncmFtL2FkL21hcC9NYXBVdGlsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubWlncmF0aW9uLmRpYWdyYW0vc3JjL29yZy9lY2xpcHNlL2VwZi9taWdyYXRpb24vZGlhZ3JhbS9hZC9tYXAvTWFwVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOGYwZTJiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5taWdyYXRpb24uZGlhZ3JhbS9zcmMvb3JnL2VjbGlwc2UvZXBmL21pZ3JhdGlvbi9kaWFncmFtL2FkL21hcC9NYXBVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MTggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLm1pZ3JhdGlvbi5kaWFncmFtLmFkLm1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5EaW1lbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5QcmVjaXNpb25Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi51dGlsLlRlbXBsYXRlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuQWN0aXZpdHlGaW5hbE5vZGVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLkFjdGl2aXR5RmluYWxOb2RlTmFtZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuQWN0aXZpdHlQYXJhbWV0ZXJOb2RlMkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuQWN0aXZpdHlQYXJhbWV0ZXJOb2RlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5BY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lMkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuQ29udHJvbEZsb3dFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLkNvbnRyb2xGbG93TmFtZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuRGVjaXNpb25Ob2RlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5EZWNpc2lvbk5vZGVOYW1lRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5Gb3JrTm9kZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuSW5pdGlhbE5vZGVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLkluaXRpYWxOb2RlTmFtZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuSm9pbk5vZGVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLk1lcmdlTm9kZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuTWVyZ2VOb2RlTmFtZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTJFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGUzRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZTJFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVOYW1lM0VkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5wYXJ0LkFjdGl2aXR5RGlhZ3JhbUVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wYXJ0cy5Sb2xlVGFza0NvbXBvc2l0ZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBhcnRzLldvcmtQcm9kdWN0Q29tcG9zaXRlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLnBhcnQuQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuYnJpZGdlLkJyaWRnZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5MaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLlJvbGVUYXNrQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLldvcmtQcm9kdWN0Q29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLldvcmtQcm9kdWN0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC51dGlsLkdyYXBoaWNhbERhdGFIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5lZGl0LnBhcnRzLldvcmtQcm9kdWN0Tm9kZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQuZWRpdC5wYXJ0cy5Xb3JrUHJvZHVjdE5vZGVOYW1lRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5wYXJ0LldQRERpYWdyYW1FZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLkNvbW1vblBhcnNlckhpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLnNlcnZpY2VzLlZpZXdTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS51dGlsLlZpZXdUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucHJlZmVyZW5jZXMuSVByZWZlcmVuY2VDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuRmlndXJlVXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkJvdW5kczsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5EZXNjcmlwdGlvblN0eWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkRpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRWRnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5GaWxsU3R5bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRm9udFN0eWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkxpbmVTdHlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vdGF0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob3RhdGlvblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZUNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUkdCOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkFjdGl2aXR5RWRnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuQWN0aXZpdHlQYXJhbWV0ZXJOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkNvbnRyb2xGbG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkRlY2lzaW9uTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5GaW5hbE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuRm9ya05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuSW5pdGlhbE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuSm9pbk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuTWVyZ2VOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLk5hbWVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlOwotCi0vKioKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4yCi0gKi8KLQotcHVibGljIGNsYXNzIE1hcFV0aWwgewotCi0JLyoqCi0JICogQ3JlYXRlIG5vdGF0aW9uIG5vZGUgaW4gZGlhZ3JhbSBjb3JyZXNwb25kaW5nIHRvIGFjdGl2aXR5IG5vZGUKLQkgKiAKLQkgKiBAcGFyYW0gZGlhZ3JhbQotCSAqIEBwYXJhbSB1bWxOb2RlCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTm9kZSBjcmVhdGVOb3RhdGlvbk5vZGVfQUQoRGlhZ3JhbSBkaWFncmFtLCBPYmplY3Qgb2JqKSB7Ci0JCU5vZGUgbm90YXRpb25Ob2RlID0gbnVsbDsKLQotCQlBY3Rpdml0eU5vZGUgdW1sTm9kZSA9IG9iaiBpbnN0YW5jZW9mIEFjdGl2aXR5Tm9kZSA/IChBY3Rpdml0eU5vZGUpIG9iagotCQkJCTogbnVsbDsKLQkJaWYgKHVtbE5vZGUgaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlKSB7Ci0JCQlTdHJpbmcgdHlwZSA9IEJyaWRnZUhlbHBlci5nZXRFQW5ub3RhdGlvblR5cGUodW1sTm9kZSwKLQkJCQkJQnJpZGdlSGVscGVyLlVNQV9UWVBFKTsKLQkJCWlmICh0eXBlLmVxdWFsc0lnbm9yZUNhc2UoQnJpZGdlSGVscGVyLlVNQV9QSEFTRSkpIHsKLQkJCQkvLyBQaGFzZQotCQkJCW5vdGF0aW9uTm9kZSA9IFZpZXdTZXJ2aWNlLmNyZWF0ZU5vZGUoZGlhZ3JhbSwgdW1sTm9kZSwKLQkJCQkJCW5ldyBJbnRlZ2VyKFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUyRWRpdFBhcnQuVklTVUFMX0lEKQotCQkJCQkJCQkudG9TdHJpbmcoKSwKLQkJCQkJCUFjdGl2aXR5RGlhZ3JhbUVkaXRvclBsdWdpbi5ESUFHUkFNX1BSRUZFUkVOQ0VTX0hJTlQpOwotCQkJCVZpZXdTZXJ2aWNlLmNyZWF0ZU5vZGUobm90YXRpb25Ob2RlLCB1bWxOb2RlLCBuZXcgSW50ZWdlcigKLQkJCQkJCVN0cnVjdHVyZWRBY3Rpdml0eU5vZGVOYW1lMkVkaXRQYXJ0LlZJU1VBTF9JRCkKLQkJCQkJCS50b1N0cmluZygpLAotCQkJCQkJQWN0aXZpdHlEaWFncmFtRWRpdG9yUGx1Z2luLkRJQUdSQU1fUFJFRkVSRU5DRVNfSElOVCk7Ci0JCQkJCi0JCQl9IGVsc2UgaWYgKHR5cGUuZXF1YWxzSWdub3JlQ2FzZShCcmlkZ2VIZWxwZXIuVU1BX0lURVJBVElPTikpIHsKLQkJCQkvLyBJdGVyYXRpb24KLQkJCQlub3RhdGlvbk5vZGUgPSBWaWV3U2VydmljZS5jcmVhdGVOb2RlKGRpYWdyYW0sIHVtbE5vZGUsCi0JCQkJCQluZXcgSW50ZWdlcihTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlM0VkaXRQYXJ0LlZJU1VBTF9JRCkKLQkJCQkJCQkJLnRvU3RyaW5nKCksCi0JCQkJCQlBY3Rpdml0eURpYWdyYW1FZGl0b3JQbHVnaW4uRElBR1JBTV9QUkVGRVJFTkNFU19ISU5UKTsKLQkJCQlWaWV3U2VydmljZS5jcmVhdGVOb2RlKG5vdGF0aW9uTm9kZSwgdW1sTm9kZSwgbmV3IEludGVnZXIoCi0JCQkJCQlTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZTNFZGl0UGFydC5WSVNVQUxfSUQpCi0JCQkJCQkudG9TdHJpbmcoKSwKLQkJCQkJCUFjdGl2aXR5RGlhZ3JhbUVkaXRvclBsdWdpbi5ESUFHUkFNX1BSRUZFUkVOQ0VTX0hJTlQpOwotCQkJfSBlbHNlIHsKLQkJCQkvLyBBY3Rpdml0eQotCQkJCW5vdGF0aW9uTm9kZSA9IFZpZXdTZXJ2aWNlLmNyZWF0ZU5vZGUoZGlhZ3JhbSwgdW1sTm9kZSwKLQkJCQkJCW5ldyBJbnRlZ2VyKFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVFZGl0UGFydC5WSVNVQUxfSUQpCi0JCQkJCQkJCS50b1N0cmluZygpLAotCQkJCQkJQWN0aXZpdHlEaWFncmFtRWRpdG9yUGx1Z2luLkRJQUdSQU1fUFJFRkVSRU5DRVNfSElOVCk7Ci0JCQkJVmlld1NlcnZpY2UuY3JlYXRlTm9kZShub3RhdGlvbk5vZGUsIHVtbE5vZGUsIG5ldyBJbnRlZ2VyKAotCQkJCQkJU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWVFZGl0UGFydC5WSVNVQUxfSUQpCi0JCQkJCQkudG9TdHJpbmcoKSwKLQkJCQkJCUFjdGl2aXR5RGlhZ3JhbUVkaXRvclBsdWdpbi5ESUFHUkFNX1BSRUZFUkVOQ0VTX0hJTlQpOwotCQkJfQotCQkJCi0JCQkvLyBzZXQgZGVmYXVsdCBmb250IHN0eWxlCi0JCQlzZXREZWZhdWx0Rm9udFN0eWxlKG5vdGF0aW9uTm9kZSk7Ci0JCQkKLQkJfSBlbHNlIGlmICh1bWxOb2RlIGluc3RhbmNlb2YgSW5pdGlhbE5vZGUpIHsKLQkJCW5vdGF0aW9uTm9kZSA9IFZpZXdTZXJ2aWNlLmNyZWF0ZU5vZGUoZGlhZ3JhbSwgdW1sTm9kZSwKLQkJCQkJbmV3IEludGVnZXIoSW5pdGlhbE5vZGVFZGl0UGFydC5WSVNVQUxfSUQpLnRvU3RyaW5nKCksCi0JCQkJCUFjdGl2aXR5RGlhZ3JhbUVkaXRvclBsdWdpbi5ESUFHUkFNX1BSRUZFUkVOQ0VTX0hJTlQpOwotCQkJVmlld1NlcnZpY2UuY3JlYXRlTm9kZShub3RhdGlvbk5vZGUsIHVtbE5vZGUsIG5ldyBJbnRlZ2VyKAotCQkJCQlJbml0aWFsTm9kZU5hbWVFZGl0UGFydC5WSVNVQUxfSUQpLnRvU3RyaW5nKCksCi0JCQkJCUFjdGl2aXR5RGlhZ3JhbUVkaXRvclBsdWdpbi5ESUFHUkFNX1BSRUZFUkVOQ0VTX0hJTlQpOwotCQl9IGVsc2UgaWYgKHVtbE5vZGUgaW5zdGFuY2VvZiBEZWNpc2lvbk5vZGUpIHsKLQkJCW5vdGF0aW9uTm9kZSA9IFZpZXdTZXJ2aWNlLmNyZWF0ZU5vZGUoZGlhZ3JhbSwgdW1sTm9kZSwKLQkJCQkJbmV3IEludGVnZXIoRGVjaXNpb25Ob2RlRWRpdFBhcnQuVklTVUFMX0lEKS50b1N0cmluZygpLAotCQkJCQlBY3Rpdml0eURpYWdyYW1FZGl0b3JQbHVnaW4uRElBR1JBTV9QUkVGRVJFTkNFU19ISU5UKTsKLQkJCVZpZXdTZXJ2aWNlLmNyZWF0ZU5vZGUobm90YXRpb25Ob2RlLCB1bWxOb2RlLCBuZXcgSW50ZWdlcigKLQkJCQkJRGVjaXNpb25Ob2RlTmFtZUVkaXRQYXJ0LlZJU1VBTF9JRCkudG9TdHJpbmcoKSwKLQkJCQkJQWN0aXZpdHlEaWFncmFtRWRpdG9yUGx1Z2luLkRJQUdSQU1fUFJFRkVSRU5DRVNfSElOVCk7Ci0JCX0gZWxzZSBpZiAodW1sTm9kZSBpbnN0YW5jZW9mIE1lcmdlTm9kZSkgewotCQkJbm90YXRpb25Ob2RlID0gVmlld1NlcnZpY2UuY3JlYXRlTm9kZShkaWFncmFtLCB1bWxOb2RlLAotCQkJCQluZXcgSW50ZWdlcihNZXJnZU5vZGVFZGl0UGFydC5WSVNVQUxfSUQpLnRvU3RyaW5nKCksCi0JCQkJCUFjdGl2aXR5RGlhZ3JhbUVkaXRvclBsdWdpbi5ESUFHUkFNX1BSRUZFUkVOQ0VTX0hJTlQpOwotCQkJVmlld1NlcnZpY2UuY3JlYXRlTm9kZShub3RhdGlvbk5vZGUsIHVtbE5vZGUsIG5ldyBJbnRlZ2VyKAotCQkJCQlNZXJnZU5vZGVOYW1lRWRpdFBhcnQuVklTVUFMX0lEKS50b1N0cmluZygpLAotCQkJCQlBY3Rpdml0eURpYWdyYW1FZGl0b3JQbHVnaW4uRElBR1JBTV9QUkVGRVJFTkNFU19ISU5UKTsKLQkJfSBlbHNlIGlmICh1bWxOb2RlIGluc3RhbmNlb2YgRm9ya05vZGUpIHsKLQkJCW5vdGF0aW9uTm9kZSA9IFZpZXdTZXJ2aWNlLmNyZWF0ZU5vZGUoZGlhZ3JhbSwgdW1sTm9kZSwKLQkJCQkJbmV3IEludGVnZXIoRm9ya05vZGVFZGl0UGFydC5WSVNVQUxfSUQpLnRvU3RyaW5nKCksCi0JCQkJCUFjdGl2aXR5RGlhZ3JhbUVkaXRvclBsdWdpbi5ESUFHUkFNX1BSRUZFUkVOQ0VTX0hJTlQpOwotCQl9IGVsc2UgaWYgKHVtbE5vZGUgaW5zdGFuY2VvZiBKb2luTm9kZSkgewotCQkJbm90YXRpb25Ob2RlID0gVmlld1NlcnZpY2UuY3JlYXRlTm9kZShkaWFncmFtLCB1bWxOb2RlLAotCQkJCQluZXcgSW50ZWdlcihKb2luTm9kZUVkaXRQYXJ0LlZJU1VBTF9JRCkudG9TdHJpbmcoKSwKLQkJCQkJQWN0aXZpdHlEaWFncmFtRWRpdG9yUGx1Z2luLkRJQUdSQU1fUFJFRkVSRU5DRVNfSElOVCk7Ci0JCX0gZWxzZSBpZiAodW1sTm9kZSBpbnN0YW5jZW9mIEZpbmFsTm9kZSkgewotCQkJbm90YXRpb25Ob2RlID0gVmlld1NlcnZpY2UKLQkJCQkJLmNyZWF0ZU5vZGUoZGlhZ3JhbSwgdW1sTm9kZSwgbmV3IEludGVnZXIoCi0JCQkJCQkJQWN0aXZpdHlGaW5hbE5vZGVFZGl0UGFydC5WSVNVQUxfSUQpLnRvU3RyaW5nKCksCi0JCQkJCQkJQWN0aXZpdHlEaWFncmFtRWRpdG9yUGx1Z2luLkRJQUdSQU1fUFJFRkVSRU5DRVNfSElOVCk7Ci0JCQlWaWV3U2VydmljZS5jcmVhdGVOb2RlKG5vdGF0aW9uTm9kZSwgdW1sTm9kZSwgbmV3IEludGVnZXIoCi0JCQkJCUFjdGl2aXR5RmluYWxOb2RlTmFtZUVkaXRQYXJ0LlZJU1VBTF9JRCkudG9TdHJpbmcoKSwKLQkJCQkJQWN0aXZpdHlEaWFncmFtRWRpdG9yUGx1Z2luLkRJQUdSQU1fUFJFRkVSRU5DRVNfSElOVCk7Ci0JCX0gZWxzZSBpZiAodW1sTm9kZSBpbnN0YW5jZW9mIEFjdGl2aXR5UGFyYW1ldGVyTm9kZSkgewotCQkJU3RyaW5nIHR5cGUgPSBCcmlkZ2VIZWxwZXIuZ2V0RUFubm90YXRpb25UeXBlKHVtbE5vZGUsCi0JCQkJCUJyaWRnZUhlbHBlci5VTUFfVFlQRSk7Ci0JCQlpZiAodHlwZS5lcXVhbHNJZ25vcmVDYXNlKEJyaWRnZUhlbHBlci5VTUFfTUlMRVNUT05FKSkgewotCQkJCS8vIE1pbGVzdG9uZQotCQkJCW5vdGF0aW9uTm9kZSA9IFZpZXdTZXJ2aWNlLmNyZWF0ZU5vZGUoZGlhZ3JhbSwgdW1sTm9kZSwKLQkJCQkJCW5ldyBJbnRlZ2VyKEFjdGl2aXR5UGFyYW1ldGVyTm9kZTJFZGl0UGFydC5WSVNVQUxfSUQpCi0JCQkJCQkJCS50b1N0cmluZygpLAotCQkJCQkJQWN0aXZpdHlEaWFncmFtRWRpdG9yUGx1Z2luLkRJQUdSQU1fUFJFRkVSRU5DRVNfSElOVCk7Ci0JCQkJVmlld1NlcnZpY2UuY3JlYXRlTm9kZShub3RhdGlvbk5vZGUsIHVtbE5vZGUsIG5ldyBJbnRlZ2VyKAotCQkJCQkJQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZTJFZGl0UGFydC5WSVNVQUxfSUQpCi0JCQkJCQkudG9TdHJpbmcoKSwKLQkJCQkJCUFjdGl2aXR5RGlhZ3JhbUVkaXRvclBsdWdpbi5ESUFHUkFNX1BSRUZFUkVOQ0VTX0hJTlQpOwotCQkJfSBlbHNlIGlmICh0eXBlLmVxdWFsc0lnbm9yZUNhc2UoQnJpZGdlSGVscGVyLlVNQV9UQVNLX0RFU0NSSVBUT1IpKSB7Ci0JCQkJLy8gVGFza0Rlc2NyaXB0b3IKLQkJCQlub3RhdGlvbk5vZGUgPSBWaWV3U2VydmljZS5jcmVhdGVOb2RlKGRpYWdyYW0sIHVtbE5vZGUsCi0JCQkJCQluZXcgSW50ZWdlcihBY3Rpdml0eVBhcmFtZXRlck5vZGVFZGl0UGFydC5WSVNVQUxfSUQpCi0JCQkJCQkJCS50b1N0cmluZygpLAotCQkJCQkJQWN0aXZpdHlEaWFncmFtRWRpdG9yUGx1Z2luLkRJQUdSQU1fUFJFRkVSRU5DRVNfSElOVCk7Ci0JCQkJVmlld1NlcnZpY2UKLQkJCQkJCS5jcmVhdGVOb2RlKG5vdGF0aW9uTm9kZSwgdW1sTm9kZSwgbmV3IEludGVnZXIoCi0JCQkJCQkJCUFjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWVFZGl0UGFydC5WSVNVQUxfSUQpCi0JCQkJCQkJCS50b1N0cmluZygpLAotCQkJCQkJCQlBY3Rpdml0eURpYWdyYW1FZGl0b3JQbHVnaW4uRElBR1JBTV9QUkVGRVJFTkNFU19ISU5UKTsKLQkJCX0KLQotCQkJLy8Jc2V0IGRlZmF1bHQgZm9udCBzdHlsZQotCQkJc2V0RGVmYXVsdEZvbnRTdHlsZShub3RhdGlvbk5vZGUpOwotCQl9Ci0KLQkJcmV0dXJuIG5vdGF0aW9uTm9kZTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgbm90YXRpb24gbm9kZSBmb3IgbW9kZWwgbm9kZSBpbiBBREQgYW5kIFdQRAotCSAqIEBwYXJhbSBkaWFncmFtCi0JICogQHBhcmFtIG9iagotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE5vZGUgY3JlYXRlTm90YXRpb25Ob2RlX0FERG9yV1BEKERpYWdyYW0gZGlhZ3JhbSwgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZSBvYmopIHsKLQkJTm9kZSBub3RhdGlvbk5vZGUgPSBudWxsOwotCQlvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlIG5vZGUgPSBvYmogaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlID8gKG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGUpIG9iagotCQkJCTogbnVsbDsKLQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBSb2xlVGFza0NvbXBvc2l0ZSkgewotCQkJbm90YXRpb25Ob2RlID0gVmlld1NlcnZpY2UuY3JlYXRlTm9kZShkaWFncmFtLCBub2RlLCBuZXcgSW50ZWdlcigKLQkJCQkJUm9sZVRhc2tDb21wb3NpdGVFZGl0UGFydC5WSVNVQUxfSUQpLnRvU3RyaW5nKCksCi0JCQkJCUFjdGl2aXR5RGlhZ3JhbUVkaXRvclBsdWdpbi5ESUFHUkFNX1BSRUZFUkVOQ0VTX0hJTlQpOwotCQkJLyoKLQkJCSAqIFZpZXdTZXJ2aWNlLmNyZWF0ZU5vZGUobm90YXRpb25Ob2RlLCBub2RlLCBuZXcgSW50ZWdlcigKLQkJCSAqIFJvbGVUYXNrQ29tcG9zaXRlUm9sZVRhc2tDb21wYXJ0bWVudEVkaXRQYXJ0LlZJU1VBTF9JRCkudG9TdHJpbmcoKSwKLQkJCSAqIEFjdGl2aXR5RGlhZ3JhbUVkaXRvclBsdWdpbi5ESUFHUkFNX1BSRUZFUkVOQ0VTX0hJTlQpOwotCQkJICovCi0JCX0gZWxzZSBpZiAobm9kZSBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0Q29tcG9zaXRlKSB7Ci0JCQlub3RhdGlvbk5vZGUgPSBWaWV3U2VydmljZS5jcmVhdGVOb2RlKGRpYWdyYW0sIG5vZGUsIG5ldyBJbnRlZ2VyKAotCQkJCQlXb3JrUHJvZHVjdENvbXBvc2l0ZUVkaXRQYXJ0LlZJU1VBTF9JRCkudG9TdHJpbmcoKSwKLQkJCQkJQWN0aXZpdHlEaWFncmFtRWRpdG9yUGx1Z2luLkRJQUdSQU1fUFJFRkVSRU5DRVNfSElOVCk7Ci0JCQkvKgotCQkJICogVmlld1NlcnZpY2UuY3JlYXRlTm9kZShub3RhdGlvbk5vZGUsIG5vZGUsIG5ldyBJbnRlZ2VyKAotCQkJICogV29ya1Byb2R1Y3RDb21wb3NpdGVXb3JrUHJvZHVjdENvbXBhcnRtZW50RWRpdFBhcnQuVklTVUFMX0lEKS50b1N0cmluZygpLAotCQkJICogQWN0aXZpdHlEaWFncmFtRWRpdG9yUGx1Z2luLkRJQUdSQU1fUFJFRkVSRU5DRVNfSElOVCk7Ci0JCQkgKi8KLQkJfSBlbHNlIGlmIChub2RlIGluc3RhbmNlb2YgV29ya1Byb2R1Y3ROb2RlKSB7Ci0JCQlub3RhdGlvbk5vZGUgPSBWaWV3U2VydmljZS5jcmVhdGVOb2RlKGRpYWdyYW0sIG5vZGUsIG5ldyBJbnRlZ2VyKAotCQkJCQlXb3JrUHJvZHVjdE5vZGVFZGl0UGFydC5WSVNVQUxfSUQpLnRvU3RyaW5nKCksCi0JCQkJCUFjdGl2aXR5RGlhZ3JhbUVkaXRvclBsdWdpbi5ESUFHUkFNX1BSRUZFUkVOQ0VTX0hJTlQpOwotCQkJVmlld1NlcnZpY2UuY3JlYXRlTm9kZShub3RhdGlvbk5vZGUsIG5vZGUsIG5ldyBJbnRlZ2VyKAotCQkJCQlXb3JrUHJvZHVjdE5vZGVOYW1lRWRpdFBhcnQuVklTVUFMX0lEKS50b1N0cmluZygpLAotCQkJCQlBY3Rpdml0eURpYWdyYW1FZGl0b3JQbHVnaW4uRElBR1JBTV9QUkVGRVJFTkNFU19ISU5UKTsKLQkJfQotCQkKLQkJLy8gc2V0IGRlZmF1bHQgZm9udCBzdHlsZSBmb3Igbm90YXRpb24gbm9kZQotCQlzZXREZWZhdWx0Rm9udFN0eWxlKG5vdGF0aW9uTm9kZSk7Ci0JCXJldHVybiBub3RhdGlvbk5vZGU7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQ3JlYXRlIHRleHQgZm9yIGZyZWUgZm9ybSB0ZXh0Ci0JICogQHBhcmFtIGRpYWdyYW0KLQkgKiBAcGFyYW0gbm9kZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE5vZGUgY3JlYXRlVGV4dChEaWFncmFtIGRpYWdyYW0sCi0JCQlvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlIG5vZGUpIHsKLQotCQkvLyBjcmVhdGUgdGV4dAotCQlOb2RlIHRleHQgPSBWaWV3U2VydmljZS5jcmVhdGVOb2RlKGRpYWdyYW0sIFZpZXdUeXBlLlRFWFQsCi0JCQkJQWN0aXZpdHlEaWFncmFtRWRpdG9yUGx1Z2luLkRJQUdSQU1fUFJFRkVSRU5DRVNfSElOVCk7Ci0JCQotCQlWaWV3U2VydmljZS5jcmVhdGVOb2RlKHRleHQsIFZpZXdUeXBlLkRJQUdSQU1fTkFNRSwKLQkJCQlBY3Rpdml0eURpYWdyYW1FZGl0b3JQbHVnaW4uRElBR1JBTV9QUkVGRVJFTkNFU19ISU5UKTsKLQkJVmlld1NlcnZpY2UuY3JlYXRlTm9kZSh0ZXh0LCBDb21tb25QYXJzZXJIaW50LkRFU0NSSVBUSU9OLAotCQkJCUFjdGl2aXR5RGlhZ3JhbUVkaXRvclBsdWdpbi5ESUFHUkFNX1BSRUZFUkVOQ0VTX0hJTlQpOwotCi0JCS8vIGNyZWF0ZSBkZXNjcmlwdGlvbgotCQlHcmFwaE5vZGUgZ3JhcGhOb2RlID0gKEdyYXBoTm9kZSkgbm9kZS5nZXRPYmplY3QoKTsKLQkJU3RyaW5nIGRlc2NyaXB0aW9uID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJUHJvcGVydHkgcHJvcCA9IEdyYXBoaWNhbERhdGFIZWxwZXIuZ2V0UHJvcGVydHlCeUtleShncmFwaE5vZGUKLQkJCQkuZ2V0UHJvcGVydHkoKSwgR3JhcGhpY2FsRGF0YUhlbHBlci5HUkFQSF9OT0RFX0ZSRUVfVEVYVCk7Ci0KLQkJaWYgKHByb3AgIT0gbnVsbCkKLQkJCWRlc2NyaXB0aW9uID0gcHJvcC5nZXRWYWx1ZSgpOwotCQlEZXNjcmlwdGlvblN0eWxlIGRlc2NTdHlsZSA9IChEZXNjcmlwdGlvblN0eWxlKSB0ZXh0Ci0JCQkJLmdldFN0eWxlKE5vdGF0aW9uUGFja2FnZS5MaXRlcmFscy5ERVNDUklQVElPTl9TVFlMRSk7Ci0JCWRlc2NTdHlsZS5zZXREZXNjcmlwdGlvbihkZXNjcmlwdGlvbik7Ci0JCQotCQkvLyAKLQkJSVByZWZlcmVuY2VTdG9yZSBzdG9yZSA9IChJUHJlZmVyZW5jZVN0b3JlKSBBY3Rpdml0eURpYWdyYW1FZGl0b3JQbHVnaW4uRElBR1JBTV9QUkVGRVJFTkNFU19ISU5UCi0JCQkJLmdldFByZWZlcmVuY2VTdG9yZSgpOwotCi0JCS8vIGNyZWF0ZSBmaWxsIHN0eWxlCi0JCUZpbGxTdHlsZSBmaWxsU3R5bGUgPSAoRmlsbFN0eWxlKSB0ZXh0Ci0JCQkJLmdldFN0eWxlKE5vdGF0aW9uUGFja2FnZS5MaXRlcmFscy5GSUxMX1NUWUxFKTsKLQkJaWYgKGZpbGxTdHlsZSAhPSBudWxsKSB7Ci0JCQkvLyBmaWxsIGNvbG9yCi0JCQlSR0IgZmlsbFJHQiA9IFByZWZlcmVuY2VDb252ZXJ0ZXIuZ2V0Q29sb3Ioc3RvcmUsCi0JCQkJCUlQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfRklMTF9DT0xPUik7Ci0JCQlmaWxsU3R5bGUuc2V0RmlsbENvbG9yKEZpZ3VyZVV0aWxpdGllcy5SR0JUb0ludGVnZXIoZmlsbFJHQikKLQkJCQkJLmludFZhbHVlKCkpOwotCQl9Ci0KLQkJLy8gY3JlYXRlIGxpbmUgc3R5bGUKLQkJTGluZVN0eWxlIGxpbmVTdHlsZSA9IChMaW5lU3R5bGUpIHRleHQKLQkJCQkuZ2V0U3R5bGUoTm90YXRpb25QYWNrYWdlLkxpdGVyYWxzLkxJTkVfU1RZTEUpOwotCQlpZiAobGluZVN0eWxlICE9IG51bGwpIHsKLQkJCS8vIGxpbmUgY29sb3IKLQkJCVJHQiBsaW5lUkdCID0gUHJlZmVyZW5jZUNvbnZlcnRlci5nZXRDb2xvcihzdG9yZSwKLQkJCQkJSVByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9MSU5FX0NPTE9SKTsKLQkJCWxpbmVTdHlsZS5zZXRMaW5lQ29sb3IoRmlndXJlVXRpbGl0aWVzLlJHQlRvSW50ZWdlcihsaW5lUkdCKQotCQkJCQkuaW50VmFsdWUoKSk7Ci0JCX0KLQotCQkvLyBjcmVhdGUgZm9udCBzdHlsZQotCQlGb250U3R5bGUgZm9udFN0eWxlID0gKEZvbnRTdHlsZSkgdGV4dAotCQkJCS5nZXRTdHlsZShOb3RhdGlvblBhY2thZ2UuTGl0ZXJhbHMuRk9OVF9TVFlMRSk7Ci0JCUZvbnQgb2xkRm9udCA9IG51bGw7Ci0JCWlmIChmb250U3R5bGUgIT0gbnVsbCkgewotCQkJLy8gZ2V0IGZvbnQgcHJvcGVydGllcwotCQkJU3RyaW5nIGZvbnROYW1lID0gZ2V0UHJvcGVydHlWYWx1ZShncmFwaE5vZGUsCi0JCQkJCVRlbXBsYXRlQ29uc3RhbnRzLlBST1BFUlRZX0ZPTlRfTkFNRSk7Ci0JCQlpZiAoZm9udE5hbWUgPT0gbnVsbCkgZm9udE5hbWUgPSBUZW1wbGF0ZUNvbnN0YW50cy5ERUZBVUxUX0ZPTlRfTkFNRTsKLQkJCVN0cmluZyBvbGRGb250U3R5bGVTdHIgPSBnZXRQcm9wZXJ0eVZhbHVlKGdyYXBoTm9kZSwKLQkJCQkJVGVtcGxhdGVDb25zdGFudHMuUFJPUEVSVFlfRk9OVF9TVFlMRSk7CQotCQkJU3RyaW5nIGZvbnRIZWlnaHRTdHIgPSBnZXRQcm9wZXJ0eVZhbHVlKGdyYXBoTm9kZSwKLQkJCQkJVGVtcGxhdGVDb25zdGFudHMuUFJPUEVSVFlfRk9OVF9IRUlHSFQpOwkJCQotCQkJU3RyaW5nIGZvbnRSZWQgPSBnZXRQcm9wZXJ0eVZhbHVlKGdyYXBoTm9kZSwKLQkJCQkJVGVtcGxhdGVDb25zdGFudHMuUFJPUEVSVFlfRk9OVF9SRUQpOwotCQkJU3RyaW5nIGZvbnRHcmVlbiA9IGdldFByb3BlcnR5VmFsdWUoZ3JhcGhOb2RlLAotCQkJCQlUZW1wbGF0ZUNvbnN0YW50cy5QUk9QRVJUWV9GT05UX0dSRUVOKTsKLQkJCVN0cmluZyBmb250Qmx1ZSA9IGdldFByb3BlcnR5VmFsdWUoZ3JhcGhOb2RlLAotCQkJCQlUZW1wbGF0ZUNvbnN0YW50cy5QUk9QRVJUWV9GT05UX0JMVUUpOwotCQkJCi0JCQlpbnQgcmVkID0gMDsKLQkJCWludCBncmVlbiA9IDA7Ci0JCQlpbnQgYmx1ZSA9IDA7Ci0KLQkJCWlmIChmb250TmFtZSAhPSBudWxsKQotCQkJCWZvbnRTdHlsZS5zZXRGb250TmFtZShmb250TmFtZSk7Ci0JCQkKLQkJCWludCBvbGRGb250U3R5bGUgPSAwOwotCQkJaWYgKG9sZEZvbnRTdHlsZVN0ciAhPSBudWxsKSB7Ci0JCQkJb2xkRm9udFN0eWxlID0gbmV3IEludGVnZXIob2xkRm9udFN0eWxlU3RyKS5pbnRWYWx1ZSgpOwotCQkJCWlmIChvbGRGb250U3R5bGUgPT0gMSkKLQkJCQkJZm9udFN0eWxlLnNldEJvbGQodHJ1ZSk7Ci0JCQkJaWYgKG9sZEZvbnRTdHlsZSA9PSAyKQotCQkJCQlmb250U3R5bGUuc2V0SXRhbGljKHRydWUpOwotCQkJCWlmIChvbGRGb250U3R5bGUgPT0gMykgewotCQkJCQlmb250U3R5bGUuc2V0Qm9sZCh0cnVlKTsKLQkJCQkJZm9udFN0eWxlLnNldEl0YWxpYyh0cnVlKTsKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCS8vIHNldCBmb250IGhlaWdodAotCQkJaW50IGZvbnRIZWlnaHQgPSBUZW1wbGF0ZUNvbnN0YW50cy5ERUZBVUxUX0ZPTlRfU0laRTsKLQkJCWlmIChmb250SGVpZ2h0U3RyICE9IG51bGwpCi0JCQkJZm9udEhlaWdodCA9IG5ldyBJbnRlZ2VyKGZvbnRIZWlnaHRTdHIpLmludFZhbHVlKCk7Ci0JCQlmb250U3R5bGUuc2V0Rm9udEhlaWdodChmb250SGVpZ2h0KTsKLQkJCQotCQkJLy8gc2V0IGZvbnQgUkdCIGNvbG9yCi0JCQlpZiAoZm9udFJlZCAhPSBudWxsKQotCQkJCXJlZCA9IG5ldyBJbnRlZ2VyKGZvbnRSZWQpLmludFZhbHVlKCk7Ci0JCQlpZiAoZm9udEdyZWVuICE9IG51bGwpCi0JCQkJZ3JlZW4gPSBuZXcgSW50ZWdlcihmb250R3JlZW4pLmludFZhbHVlKCk7Ci0JCQlpZiAoZm9udEJsdWUgIT0gbnVsbCkKLQkJCQlibHVlID0gbmV3IEludGVnZXIoZm9udEJsdWUpLmludFZhbHVlKCk7Ci0KLQkJCVJHQiBmb250UkdCID0gbmV3IFJHQihyZWQsIGdyZWVuLCBibHVlKTsKLQkJCWZvbnRTdHlsZS5zZXRGb250Q29sb3IoRmlndXJlVXRpbGl0aWVzLlJHQlRvSW50ZWdlcihmb250UkdCKQotCQkJCQkuaW50VmFsdWUoKSk7CQkJCi0JCQkKLQkJCS8vIG1ha2Ugb2xkIGZvbnQgYXMgd2VsbAotCQkJb2xkRm9udCA9IG5ldyBGb250KG51bGwsIGZvbnROYW1lLCBmb250SGVpZ2h0LCBvbGRGb250U3R5bGUpOwotCQl9Ci0JCi0JCURpbWVuc2lvbiBkID0gRmlndXJlVXRpbGl0aWVzLmdldFRleHRFeHRlbnRzKGRlc2NyaXB0aW9uLCBvbGRGb250KTsKLQkJaWYgKG9sZEZvbnQgIT0gbnVsbCkgewotCQkJb2xkRm9udC5kaXNwb3NlKCk7Ci0JCX0KLQkJaW50IG5vT2ZMaW5lcyA9IDE7Ci0JCWlmIChkICE9IG51bGwgJiYgZC53aWR0aCA+IDApIHsKLQkJCWlmIChub2RlLmdldFdpZHRoKCkgPT0gLTEpCi0JCQkJbm9PZkxpbmVzID0gMTsKLQkJCWVsc2UgewotCQkJCWludCBkaXYgPSBkLndpZHRoIC8gbm9kZS5nZXRXaWR0aCgpOwkJCi0JCQkJaW50IG1vZCA9IGQud2lkdGggJSBub2RlLmdldFdpZHRoKCk7Ci0vLwkJCQlpZiAobW9kICE9IDApCi0JCQkJCWRpdisrOwotCQkJCW5vT2ZMaW5lcyA9IGRpdjsKLQkJCX0KLQkJfQotCi0JCWludCB0ZXh0SGVpZ2h0ID0gZC5oZWlnaHQ7CQkKLQotCQkvLyBjcmVhdGUgbGF5b3V0IGNvbnRyYWludAotCQlCb3VuZHMgYm91bmRzID0gTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVCb3VuZHMoKTsKLS8vCQlib3VuZHMuc2V0SGVpZ2h0KG5vT2ZMaW5lcyAqIHRleHRIZWlnaHQpOwotCQlpZiAobm9kZS5nZXRXaWR0aCgpID09IC0xKSB7Ci0JCQlpbnQgdGV4dFdpZHRoID0gZC53aWR0aDsKLQkJCWJvdW5kcy5zZXRXaWR0aCh0ZXh0V2lkdGgpOwotCQl9Ci0JCWVsc2UKLQkJCWJvdW5kcy5zZXRXaWR0aChub2RlLmdldFdpZHRoKCkpOwotCQlib3VuZHMuc2V0WChub2RlLmdldExvY2F0aW9uKCkueCk7Ci0JCWJvdW5kcy5zZXRZKG5vZGUuZ2V0TG9jYXRpb24oKS55KTsKLQotCQl0ZXh0LnNldExheW91dENvbnN0cmFpbnQoYm91bmRzKTsKLQkJcmV0dXJuIHRleHQ7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGVkZ2UgZm9yIEFEIGRpYWdyYW0KLQkgKiAKLQkgKiBAcGFyYW0gc291cmNlTm9kZQotCSAqIEBwYXJhbSB0YXJnZXROb2RlCi0JICogQHBhcmFtIGFjdEVkZ2UKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBFZGdlIGNyZWF0ZUVkZ2VfQUQoTm9kZSBzb3VyY2VOb2RlLCBOb2RlIHRhcmdldE5vZGUsCi0JCQlBY3Rpdml0eUVkZ2UgYWN0RWRnZSkgewotCQlpZiAoYWN0RWRnZSBpbnN0YW5jZW9mIENvbnRyb2xGbG93KSB7Ci0JCQlFZGdlIGVkZ2UgPSBWaWV3U2VydmljZS5jcmVhdGVFZGdlKHNvdXJjZU5vZGUsIHRhcmdldE5vZGUsIGFjdEVkZ2UsCi0JCQkJCW5ldyBJbnRlZ2VyKENvbnRyb2xGbG93RWRpdFBhcnQuVklTVUFMX0lEKS50b1N0cmluZygpLAotCQkJCQlBY3Rpdml0eURpYWdyYW1FZGl0b3JQbHVnaW4uRElBR1JBTV9QUkVGRVJFTkNFU19ISU5UKTsKLQkJCVZpZXdTZXJ2aWNlLmNyZWF0ZU5vZGUoZWRnZSwgYWN0RWRnZSwgbmV3IEludGVnZXIoCi0JCQkJCUNvbnRyb2xGbG93TmFtZUVkaXRQYXJ0LlZJU1VBTF9JRCkudG9TdHJpbmcoKSwKLQkJCQkJQWN0aXZpdHlEaWFncmFtRWRpdG9yUGx1Z2luLkRJQUdSQU1fUFJFRkVSRU5DRVNfSElOVCk7Ci0JCQlyZXR1cm4gZWRnZTsKLQkJfQotCQkKLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkKLQkvKioKLQkgKiBDcmVhdGUgZWRnZSBmb3IgV1BEIGRpYWdyYW0KLQkgKiAKLQkgKiBAcGFyYW0gc291cmNlTm9kZQotCSAqIEBwYXJhbSB0YXJnZXROb2RlCi0JICogQHBhcmFtIGFjdEVkZ2UKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBFZGdlIGNyZWF0ZUVkZ2VfV1BEKE5vZGUgc291cmNlTm9kZSwgTm9kZSB0YXJnZXROb2RlLAotCQkJRU9iamVjdCBhY3RFZGdlKSB7Ci0JCWlmIChhY3RFZGdlIGluc3RhbmNlb2YgTGluaykgewotCQkJRWRnZSBlZGdlID0gVmlld1NlcnZpY2UuY3JlYXRlRWRnZShzb3VyY2VOb2RlLCB0YXJnZXROb2RlLCBhY3RFZGdlLAotCQkJCQluZXcgSW50ZWdlcihvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLmVkaXQucGFydHMuTGlua0VkaXRQYXJ0LlZJU1VBTF9JRCkudG9TdHJpbmcoKSwKLQkJCQkJV1BERGlhZ3JhbUVkaXRvclBsdWdpbi5ESUFHUkFNX1BSRUZFUkVOQ0VTX0hJTlQpOwotCQkJVmlld1NlcnZpY2UuY3JlYXRlTm9kZShlZGdlLCBhY3RFZGdlLCBuZXcgSW50ZWdlcigKLQkJCQkJb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5lZGl0LnBhcnRzLkxpbmtFZGl0UGFydC5WSVNVQUxfSUQpLnRvU3RyaW5nKCksCi0JCQkJCVdQRERpYWdyYW1FZGl0b3JQbHVnaW4uRElBR1JBTV9QUkVGRVJFTkNFU19ISU5UKTsKLQkJCXJldHVybiBlZGdlOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkKLQkvKioKLQkgKiBDcmVhdGUgZWRnZSBmb3IgQUREIGRpYWdyYW0KLQkgKiAKLQkgKiBAcGFyYW0gc291cmNlTm9kZQotCSAqIEBwYXJhbSB0YXJnZXROb2RlCi0JICogQHBhcmFtIGFjdEVkZ2UKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBFZGdlIGNyZWF0ZUVkZ2VfQUREKE5vZGUgc291cmNlTm9kZSwgTm9kZSB0YXJnZXROb2RlLAotCQkJRU9iamVjdCBhY3RFZGdlKSB7Ci0JCWlmIChhY3RFZGdlIGluc3RhbmNlb2YgTGluaykgewotCQkJRWRnZSBlZGdlID0gVmlld1NlcnZpY2UuY3JlYXRlRWRnZShzb3VyY2VOb2RlLCB0YXJnZXROb2RlLCBhY3RFZGdlLAotCQkJCQluZXcgSW50ZWdlcihvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wYXJ0cy5MaW5rRWRpdFBhcnQuVklTVUFMX0lEKS50b1N0cmluZygpLAotCQkJCQlBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0b3JQbHVnaW4uRElBR1JBTV9QUkVGRVJFTkNFU19ISU5UKTsKLQkJCVZpZXdTZXJ2aWNlLmNyZWF0ZU5vZGUoZWRnZSwgYWN0RWRnZSwgbmV3IEludGVnZXIoCi0JCQkJCW9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBhcnRzLkxpbmtFZGl0UGFydC5WSVNVQUxfSUQpLnRvU3RyaW5nKCksCi0JCQkJCUFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvclBsdWdpbi5ESUFHUkFNX1BSRUZFUkVOQ0VTX0hJTlQpOwotCQkJcmV0dXJuIGVkZ2U7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRQcm9wZXJ0eVZhbHVlKEdyYXBoTm9kZSBncmFwaE5vZGUsIFN0cmluZyBrZXkpIHsKLQkJUHJvcGVydHkgcHJvcCA9IEdyYXBoaWNhbERhdGFIZWxwZXIuZ2V0UHJvcGVydHlCeUtleShncmFwaE5vZGUKLQkJCQkuZ2V0UHJvcGVydHkoKSwga2V5KTsKLQotCQlpZiAocHJvcCAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gcHJvcC5nZXRWYWx1ZSgpOwotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ2FsY3VsYXRlcyBubyBvZiBsaW5lcyBpbiB0aGUgbm9kZSB0ZXh0IGJhc2VkIG9uIHRleHQgd2lkdGggYW5kIHdpZHRoIG9mCi0JICogZmlndXJlCi0JICogCi0JICogQHBhcmFtIG5vZGUKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgZ2V0Tm9PZkxpbmVzKE5vZGUgbm9kZSkgewotCQlpbnQgbm9PZkxpbmVzID0gMTsKLQkJaWYgKG5vZGUuZ2V0RWxlbWVudCgpICE9IG51bGwKLQkJCQkmJiBub2RlLmdldEVsZW1lbnQoKSBpbnN0YW5jZW9mIE5hbWVkRWxlbWVudCkgewotCQkJU3RyaW5nIHRleHQgPSAoKE5hbWVkRWxlbWVudCkgbm9kZS5nZXRFbGVtZW50KCkpLmdldE5hbWUoKTsKLQkJCUZvbnQgZiA9IFRlbXBsYXRlQ29uc3RhbnRzLkRFRkFVTFRfRk9OVDsKLQkJCURpbWVuc2lvbiBkID0gRmlndXJlVXRpbGl0aWVzLmdldFRleHRFeHRlbnRzKHRleHQsIGYpOwotCi0JCQlCb3VuZHMgYm91bmRzID0gKEJvdW5kcykgbm9kZS5nZXRMYXlvdXRDb25zdHJhaW50KCk7Ci0JCQlpZiAoZCAhPSBudWxsICYmIGQud2lkdGggPiAwKSB7Ci0JCQkJaW50IGRpdiA9IGQud2lkdGggLyBib3VuZHMuZ2V0V2lkdGgoKTsKLQkJCQlpbnQgbW9kID0gZC53aWR0aCAlIGJvdW5kcy5nZXRXaWR0aCgpOwotCQkJCWlmIChtb2QgIT0gMCkKLQkJCQkJZGl2Kys7Ci0JCQkJbm9PZkxpbmVzID0gZGl2OwotCQkJfQotCQl9Ci0JCXJldHVybiBub09mTGluZXM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGhlaWdodCBvZiB0ZXh0IG9mIHRoIGVub2RlCi0JICogCi0JICogQHBhcmFtIG5vZGUKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgZ2V0VGV4dEhlaWdodChOb2RlIG5vZGUpIHsKLQkJaWYgKG5vZGUuZ2V0RWxlbWVudCgpICE9IG51bGwKLQkJCQkmJiBub2RlLmdldEVsZW1lbnQoKSBpbnN0YW5jZW9mIE5hbWVkRWxlbWVudCkgewotCQkJU3RyaW5nIHRleHQgPSAoKE5hbWVkRWxlbWVudCkgbm9kZS5nZXRFbGVtZW50KCkpLmdldE5hbWUoKTsKLQkJCUZvbnQgZiA9IFRlbXBsYXRlQ29uc3RhbnRzLkRFRkFVTFRfRk9OVDsKLQkJCURpbWVuc2lvbiBkID0gRmlndXJlVXRpbGl0aWVzLmdldFRleHRFeHRlbnRzKHRleHQsIGYpOwotCi0JCQlpZiAoZCAhPSBudWxsKQotCQkJCXJldHVybiBkLmhlaWdodDsKLQkJfQotCQlyZXR1cm4gMDsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZXJ0IHBvaW50IHRvIHRlcm1pbmFsIHN0cmluZwotCSAqIAotCSAqIEBwYXJhbSBwCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbXBvc2VUZXJtaW5hbFN0cmluZyhQcmVjaXNpb25Qb2ludCBwKSB7Ci0JCWZpbmFsIGNoYXIgVEVSTUlOQUxfU1RBUlRfQ0hBUiA9ICcoJzsKLQkJZmluYWwgY2hhciBURVJNSU5BTF9ERUxJTUlURVJfQ0hBUiA9ICcsJzsKLQkJZmluYWwgY2hhciBURVJNSU5BTF9FTkRfQ0hBUiA9ICcpJzsKLQotCQlTdHJpbmdCdWZmZXIgcyA9IG5ldyBTdHJpbmdCdWZmZXIoMjQpOwotCQlzLmFwcGVuZChURVJNSU5BTF9TVEFSVF9DSEFSKTsgLy8gMSBjaGFyCi0JCXMuYXBwZW5kKChmbG9hdCkgcC5wcmVjaXNlWCk7IC8vIDEwIGNoYXJzCi0JCXMuYXBwZW5kKFRFUk1JTkFMX0RFTElNSVRFUl9DSEFSKTsgLy8gMSBjaGFyCi0JCXMuYXBwZW5kKChmbG9hdCkgcC5wcmVjaXNlWSk7IC8vIDEwIGNoYXJzCi0JCXMuYXBwZW5kKFRFUk1JTkFMX0VORF9DSEFSKTsgLy8gMSBjaGFyCi0JCXJldHVybiBzLnRvU3RyaW5nKCk7IC8vIDI0IGNoYXJzIG1heCAoKzEgZm9yIHNhZmV0eSwgaS5lLiBmb3Igc3RyaW5nCi0JCQkJCQkJCS8vIHRlcm1pbmF0aW9uKQotCX0KLQotCS8qKgotCSAqIEdldCByZWxhdGl2ZSBhbmNob3IgbG9jYXRpb24KLQkgKiAKLQkgKiBAcGFyYW0gcAotCSAqIEBwYXJhbSBib3VuZHMKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBQcmVjaXNpb25Qb2ludCBnZXRBbmNob3JSZWxhdGl2ZUxvY2F0aW9uKFBvaW50IHAsCi0JCQlCb3VuZHMgYm91bmRzKSB7Ci0JCVByZWNpc2lvblBvaW50IHJlbExvY2F0aW9uOwotCQlQb2ludCB0ZW1wID0gbmV3IFBvaW50KHApOwotCQlpZiAocC54IDwgYm91bmRzLmdldFgoKSB8fCBwLnggPiBib3VuZHMuZ2V0WCgpICsgYm91bmRzLmdldFdpZHRoKCkKLQkJCQl8fCBwLnkgPCBib3VuZHMuZ2V0WSgpCi0JCQkJfHwgcC55ID4gYm91bmRzLmdldFkoKSArIGJvdW5kcy5nZXRIZWlnaHQoKSkgewotCQkJaWYgKHAueCA8IGJvdW5kcy5nZXRYKCkgfHwgcC54ID4gYm91bmRzLmdldFgoKSArIGJvdW5kcy5nZXRXaWR0aCgpKSB7Ci0JCQkJdGVtcC54ID0gcC54IDwgYm91bmRzLmdldFgoKSA/IGJvdW5kcy5nZXRYKCkgOiBib3VuZHMuZ2V0WCgpCi0JCQkJCQkrIGJvdW5kcy5nZXRXaWR0aCgpOwotCQkJfQotCQkJaWYgKHAueSA8IGJvdW5kcy5nZXRZKCkgfHwgcC55ID4gYm91bmRzLmdldFkoKSArIGJvdW5kcy5nZXRIZWlnaHQoKSkgewotCQkJCXRlbXAueSA9IHAueSA8IGJvdW5kcy5nZXRZKCkgPyBib3VuZHMuZ2V0WSgpIDogYm91bmRzLmdldFkoKQotCQkJCQkJKyBib3VuZHMuZ2V0SGVpZ2h0KCk7Ci0JCQl9Ci0JCQlyZWxMb2NhdGlvbiA9IG5ldyBQcmVjaXNpb25Qb2ludCgoZG91YmxlKSAodGVtcC54IC0gYm91bmRzLmdldFgoKSkKLQkJCQkJLyBib3VuZHMuZ2V0V2lkdGgoKSwgKGRvdWJsZSkgKHRlbXAueSAtIGJvdW5kcy5nZXRZKCkpCi0JCQkJCS8gYm91bmRzLmdldEhlaWdodCgpKTsKLQkJfSBlbHNlIHsKLQotCQkJcmVsTG9jYXRpb24gPSBuZXcgUHJlY2lzaW9uUG9pbnQoKGRvdWJsZSkgKHRlbXAueCAtIGJvdW5kcy5nZXRYKCkpCi0JCQkJCS8gYm91bmRzLmdldFdpZHRoKCksIChkb3VibGUpICh0ZW1wLnkgLSBib3VuZHMuZ2V0WSgpKQotCQkJCQkvIGJvdW5kcy5nZXRIZWlnaHQoKSk7Ci0JCX0KLQkJcmV0dXJuIHJlbExvY2F0aW9uOwotCX0KLQotCQotCS8qKgotCSAqIFNldCBkZWZhdWx0IGZvbnQgc3R5bGUgZm9yIG5vdGF0aW9uIG5vZGUKLQkgKiBAcGFyYW0gbm90YXRpb25Ob2RlCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBzZXREZWZhdWx0Rm9udFN0eWxlKE5vZGUgbm90YXRpb25Ob2RlKSB7Ci0JCS8vCWNyZWF0ZSBmb250IHN0eWxlCi0JCUZvbnRTdHlsZSBmb250U3R5bGUgPSAoRm9udFN0eWxlKSBub3RhdGlvbk5vZGUKLQkJCQkuZ2V0U3R5bGUoTm90YXRpb25QYWNrYWdlLkxpdGVyYWxzLkZPTlRfU1RZTEUpOwotCi0JCWlmIChmb250U3R5bGUgIT0gbnVsbCkgewotCi0JCQkvLyBzZXQgZm9udCBuYW1lCi0JCQlTdHJpbmcgZm9udE5hbWUgPSBUZW1wbGF0ZUNvbnN0YW50cy5ERUZBVUxUX0ZPTlRfTkFNRTsKLQkJCWlmIChmb250TmFtZSAhPSBudWxsKQotCQkJCWZvbnRTdHlsZS5zZXRGb250TmFtZShmb250TmFtZSk7Ci0KLQkJCS8vIHNldCBmb250IGhlaWdodAotCQkJaW50IGZvbnRIZWlnaHQgPSBUZW1wbGF0ZUNvbnN0YW50cy5ERUZBVUxUX0ZPTlRfU0laRTsKLQkJCWZvbnRTdHlsZS5zZXRGb250SGVpZ2h0KGZvbnRIZWlnaHQpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1pZ3JhdGlvbi5kaWFncmFtL3NyYy9vcmcvZWNsaXBzZS9lcGYvbWlncmF0aW9uL2RpYWdyYW0vYWQvbWFwL01lcmdlTm9kZU1hcC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1pZ3JhdGlvbi5kaWFncmFtL3NyYy9vcmcvZWNsaXBzZS9lcGYvbWlncmF0aW9uL2RpYWdyYW0vYWQvbWFwL01lcmdlTm9kZU1hcC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMjYyZWVlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5taWdyYXRpb24uZGlhZ3JhbS9zcmMvb3JnL2VjbGlwc2UvZXBmL21pZ3JhdGlvbi9kaWFncmFtL2FkL21hcC9NZXJnZU5vZGVNYXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5taWdyYXRpb24uZGlhZ3JhbS5hZC5tYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLk1lcmdlTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5VTUxQYWNrYWdlOwotCi0vKioKLSAqIAotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjIKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXJnZU5vZGVNYXAgZXh0ZW5kcyBNYXBOb2RlIHsKLQotCXB1YmxpYyBNZXJnZU5vZGVNYXAoTm9kZSBub2RlKSB7Ci0JCXN1cGVyKG5vZGUpOwotCX0KLQkKLQkvKioKLQkgKiBVcGRhdGUgdW1sIG5vZGUKLQkgKi8KLQlwdWJsaWMgdm9pZCB1cGRhdGVOb2RlKCkgewotCQlzdXBlci51cGRhdGVOb2RlKCk7Ci0JCXVtbE5vZGUgPSAoTWVyZ2VOb2RlKWdldEFjdGl2aXR5KCkuY3JlYXRlTm9kZShuYW1lID0gKG5hbWUgIT0gbnVsbCk/IG5hbWUgOiAiICIsIC8vJE5PTi1OTFMtMSQgCi0JCQkJCQlVTUxQYWNrYWdlLmVJTlNUQU5DRS5nZXRNZXJnZU5vZGUoKSk7Ci0JCQotCQlpZih1bWxOb2RlICE9IG51bGwpewotCQkJZ3JhcGhVTUxOb2RlTWFwLnB1dChub2RlLCB1bWxOb2RlKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5taWdyYXRpb24uZGlhZ3JhbS9zcmMvb3JnL2VjbGlwc2UvZXBmL21pZ3JhdGlvbi9kaWFncmFtL2FkL3NlcnZpY2VzL1dvcmtmbG93MlhNSVJlc291cmNlSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1pZ3JhdGlvbi5kaWFncmFtL3NyYy9vcmcvZWNsaXBzZS9lcGYvbWlncmF0aW9uL2RpYWdyYW0vYWQvc2VydmljZXMvV29ya2Zsb3cyWE1JUmVzb3VyY2VJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkNDhkNzQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1pZ3JhdGlvbi5kaWFncmFtL3NyYy9vcmcvZWNsaXBzZS9lcGYvbWlncmF0aW9uL2RpYWdyYW0vYWQvc2VydmljZXMvV29ya2Zsb3cyWE1JUmVzb3VyY2VJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubWlncmF0aW9uLmRpYWdyYW0uYWQuc2VydmljZXM7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuWE1JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5YTUxSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLlhNTFNhdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5pbXBsLlhNSVJlc291cmNlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLmltcGwuWE1JU2F2ZUltcGw7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4yCi0gKiAKLSAqLwotCi1wdWJsaWMgY2xhc3MgV29ya2Zsb3cyWE1JUmVzb3VyY2VJbXBsIGV4dGVuZHMgWE1JUmVzb3VyY2VJbXBsIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfRU5DT0RJTkcgPSAiVVRGLTgiOyAvLyROT04tTkxTLTEkCi0JTWFwIG1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JLyoqCi0JICogCi0JICovCi0JcHVibGljIFdvcmtmbG93MlhNSVJlc291cmNlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gdXJpCi0JICovCi0JcHVibGljIFdvcmtmbG93MlhNSVJlc291cmNlSW1wbChVUkkgdXJpKSB7Ci0JCXN1cGVyKHVyaSk7Ci0KLQkJZ2V0RGVmYXVsdFNhdmVPcHRpb25zKCkucHV0KFhNTFJlc291cmNlLk9QVElPTl9FWFRFTkRFRF9NRVRBX0RBVEEsIEJvb2xlYW4uVFJVRSk7Ci0JCWdldERlZmF1bHRMb2FkT3B0aW9ucygpLnB1dChYTUxSZXNvdXJjZS5PUFRJT05fRVhURU5ERURfTUVUQV9EQVRBLCBCb29sZWFuLlRSVUUpOwotCi0JCWdldERlZmF1bHRTYXZlT3B0aW9ucygpLnB1dChYTUxSZXNvdXJjZS5PUFRJT05fU0NIRU1BX0xPQ0FUSU9OLCBCb29sZWFuLlRSVUUpOwotCi0JCWdldERlZmF1bHRMb2FkT3B0aW9ucygpLnB1dChYTUxSZXNvdXJjZS5PUFRJT05fVVNFX0VOQ09ERURfQVRUUklCVVRFX1NUWUxFLCBCb29sZWFuLlRSVUUpOwotCQlnZXREZWZhdWx0U2F2ZU9wdGlvbnMoKS5wdXQoWE1MUmVzb3VyY2UuT1BUSU9OX1VTRV9FTkNPREVEX0FUVFJJQlVURV9TVFlMRSwgQm9vbGVhbi5UUlVFKTsKLQkJCi0JCWdldERlZmF1bHRMb2FkT3B0aW9ucygpLnB1dChYTUxSZXNvdXJjZS5PUFRJT05fRU5DT0RJTkcsIERFRkFVTFRfRU5DT0RJTkcpOwotCQlnZXREZWZhdWx0U2F2ZU9wdGlvbnMoKS5wdXQoWE1MUmVzb3VyY2UuT1BUSU9OX0VOQ09ESU5HLCBERUZBVUxUX0VOQ09ESU5HKTsKLQkJCi0KLQkJZ2V0RGVmYXVsdExvYWRPcHRpb25zKCkucHV0KFhNTFJlc291cmNlLk9QVElPTl9VU0VfTEVYSUNBTF9IQU5ETEVSLCBCb29sZWFuLlRSVUUpOwotCi0JCWdldERlZmF1bHRTYXZlT3B0aW9ucygpLnB1dChYTUlSZXNvdXJjZS5PUFRJT05fVVNFX1hNSV9UWVBFLCBCb29sZWFuLlRSVUUpOwotCQlnZXREZWZhdWx0TG9hZE9wdGlvbnMoKS5wdXQoWE1JUmVzb3VyY2UuT1BUSU9OX1VTRV9YTUlfVFlQRSwgQm9vbGVhbi5UUlVFKTsKLQkJc2V0VHJhY2tpbmdNb2RpZmljYXRpb24odHJ1ZSk7Ci0JCS8vc2V0SW50cmluc2ljSURUb0VPYmplY3RNYXAobWFwKTsKLQkJaWRUb0VPYmplY3RNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQljcmVhdGVYTUxIZWxwZXIoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gdXNlVVVJRHMoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQkKLQlwcm90ZWN0ZWQgWE1MU2F2ZSBjcmVhdGVYTUxTYXZlKCkgewotCQlyZXR1cm4gbmV3IFhNSVNhdmVJbXBsKGNyZWF0ZVhNTEhlbHBlcigpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2F2ZShNYXAgb3B0aW9ucykgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2F2ZShvcHRpb25zKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5taWdyYXRpb24uZGlhZ3JhbS9zcmMvb3JnL2VjbGlwc2UvZXBmL21pZ3JhdGlvbi9kaWFncmFtL2FkL3NlcnZpY2VzL1dvcmtmbG93RXhwb3J0U2VydmljZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1pZ3JhdGlvbi5kaWFncmFtL3NyYy9vcmcvZWNsaXBzZS9lcGYvbWlncmF0aW9uL2RpYWdyYW0vYWQvc2VydmljZXMvV29ya2Zsb3dFeHBvcnRTZXJ2aWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3ZTU0ODYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1pZ3JhdGlvbi5kaWFncmFtL3NyYy9vcmcvZWNsaXBzZS9lcGYvbWlncmF0aW9uL2RpYWdyYW0vYWQvc2VydmljZXMvV29ya2Zsb3dFeHBvcnRTZXJ2aWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NzMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLm1pZ3JhdGlvbi5kaWFncmFtLmFkLnNlcnZpY2VzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU1vZGVsRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlRyYW5zYWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnBhcnQuQWN0aXZpdHlEaWFncmFtRWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5wYXJ0LkFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLmJyaWRnZS5CcmlkZ2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5zZXJ2aWNlcy5EaWFncmFtTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5BY3Rpdml0eURldGFpbERpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuQWN0aXZpdHlEaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk1vZGVsRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLlR5cGVkTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Xb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLnV0aWwuR3JhcGhpY2FsRGF0YUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC51dGlsLkdyYXBoaWNhbERhdGFNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQucGFydC5XUEREaWFncmFtRWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uUHJvY2Vzc0F1dGhvcmluZ0NvbmZpZ3VyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuRGlhZ3JhbU9wdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLklEaWFncmFtTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuU3VwcHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuc2VydmljZXMuU2FmZVVwZGF0ZUNvbnRyb2xsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1pZ3JhdGlvbi5kaWFncmFtLkRpYWdyYW1NaWdyYXRpb25QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1pZ3JhdGlvbi5kaWFncmFtLk1pZ3JhdGlvbkV4cG9ydEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubWlncmF0aW9uLmRpYWdyYW0uYWQubWFwLklNYXBDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1pZ3JhdGlvbi5kaWFncmFtLmFkLm1hcC5NYXBGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5taWdyYXRpb24uZGlhZ3JhbS5hZC5tYXAuTWFwTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubWlncmF0aW9uLmRpYWdyYW0uYWQubWFwLk1hcFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1pZ3JhdGlvbi5kaWFncmFtLmFkZHdwZC5tYXAuQ29ubmVjdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1pZ3JhdGlvbi5kaWFncmFtLnV0aWwuTWlncmF0aW9uVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUucHJlZmVyZW5jZXMuUHJlZmVyZW5jZXNIaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5zZXJ2aWNlcy5WaWV3U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Cb3VuZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob3RhdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuVU1MRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5VTUxQYWNrYWdlOwotCi0vKioKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBhdXRob3IgV2VpcGluZyBMdQotICogQHNpbmNlIDEuMgotICovCi0KLXB1YmxpYyBjbGFzcyBXb3JrZmxvd0V4cG9ydFNlcnZpY2UgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9YTUlfRVhURU5TSU9OID0gIi54bWkiOyAvLyROT04tTkxTLTEkCi0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBkZWJ1ZzsKLQkKLQlwdWJsaWMgc3RhdGljIFdvcmtmbG93RXhwb3J0U2VydmljZSBzaW5nbGV0b24gPSBudWxsOwotCi0JcHVibGljIHN0YXRpYyBXb3JrZmxvd0V4cG9ydFNlcnZpY2UgZ2V0SW5zdGFuY2UoKSB7Ci0JCWlmIChzaW5nbGV0b24gPT0gbnVsbCkgewotCQkJc2luZ2xldG9uID0gbmV3IFdvcmtmbG93RXhwb3J0U2VydmljZSgpOwotCQl9Ci0JCXJldHVybiBzaW5nbGV0b247Ci0JfQotCi0JLyoqCi0JICogRXhwb3J0IGFjdGl2aXR5IGRpYWdyYW0gZGF0YQotCSAqIEBwYXJhbSBwcm9jCi0JICogQHBhcmFtIGFjdGl2aXR5Ci0JICogQHBhcmFtIGZpbGVOYW1lCi0JICogQHBhcmFtIHRhcmdldERpcgotCSAqIEByZXR1cm4KLQkgKiBAdGhyb3dzIE1pZ3JhdGlvbkV4cG9ydEV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGV4cG9ydChQcm9jZXNzIHByb2MsIEFjdGl2aXR5IGFjdGl2aXR5LCBTdHJpbmcgZmlsZU5hbWUsCi0JCQlGaWxlIHRhcmdldERpcikgdGhyb3dzIE1pZ3JhdGlvbkV4cG9ydEV4Y2VwdGlvbiB7Ci0KLQkJZGVidWcgPSBEaWFncmFtTWlncmF0aW9uUGx1Z2luLmdldERlZmF1bHQoKS5pc0RlYnVnZ2luZygpOwotCQkKLQkJLy8gY29uc3RydWN0IHRoZSBleHBvcnQgdGFyZ2V0IHhtbCBmaWxlIHBhdGgKLQkJUGF0aCBleHBvcnRQYXRoID0gbmV3IFBhdGgodGFyZ2V0RGlyLmdldEFic29sdXRlUGF0aCgpKTsKLQkJYm9vbGVhbiBlbmRXaXRoWG1pRXh0ID0gZmlsZU5hbWUudG9Mb3dlckNhc2UoKS5lbmRzV2l0aCgKLQkJCQlERUZBVUxUX1hNSV9FWFRFTlNJT04pOwotCi0JCVN0cmluZyBleHBvcnRYTUlQYXRoID0gKGV4cG9ydFBhdGguYXBwZW5kKGVuZFdpdGhYbWlFeHQgPyBmaWxlTmFtZQotCQkJCTogKGZpbGVOYW1lICsgREVGQVVMVF9YTUlfRVhURU5TSU9OKSkpLnRvT1NTdHJpbmcoKTsKLQotCi0JCVVSSSB1cmkgPSBVUkkuY3JlYXRlRmlsZVVSSShleHBvcnRYTUlQYXRoKTsKLQkJCi0vKgkJLy8gQ3JlYXRlIHJlc291cmNlIHNldAotCQlSZXNvdXJjZVNldCByZXNvdXJjZVNldCA9IG5ldyBSZXNvdXJjZVNldEltcGwoKTsKLQotCQkvL1hNTFJlc291cmNlSW1wbCB4bWlyZXMgPSBuZXcgV29ya2Zsb3cyWE1JUmVzb3VyY2VJbXBsKHVyaSk7Ci0JCS8vUmVzb3VyY2UgeG1pcmVzID0gIG5ldyBHTUZSZXNvdXJjZUZhY3RvcnkoKS5jcmVhdGVSZXNvdXJjZSh1cmkpOwotCQlSZXNvdXJjZSB4bWlyZXMgPSAgRGlhZ3JhbU1hbmFnZXIuZ2V0SW5zdGFuY2UocHJvYykKLQkJCQkJCQkuZ2V0RWRpdGluZ0RvbWFpbigpLmdldFJlc291cmNlU2V0KCkuY3JlYXRlUmVzb3VyY2UodXJpKTsKLQotCQlyZXNvdXJjZVNldC5nZXRSZXNvdXJjZXMoKS5hZGQoeG1pcmVzKTsqLwotCQlEaWFncmFtTWFuYWdlciBtZ3IgPSBEaWFncmFtTWFuYWdlci5nZXRJbnN0YW5jZShwcm9jLCB0aGlzKTsKLQkJCi0JCXRyeSB7Ci0JCQlUcmFuc2FjdGlvbiB0eCA9ICBtZ3IuZ2V0RWRpdGluZ0RvbWFpbigpLnN0YXJ0VHJhbnNhY3Rpb24oZmFsc2UsCi0JCQkJCUNvbGxlY3Rpb25zLkVNUFRZX01BUCk7Ci0JCQlSZXNvdXJjZSB4bWlyZXMgPSBtZ3IuZ2V0UmVzb3VyY2UoKTsKLQkJCXR4LmNvbW1pdCgpOwotCQkJCi0JCQkvLyBDcmVhdGUgdGVtcCBtYXAKLQkJCUlNYXBDb25zdGFudHMuZ3JhcGhVTUxOb2RlTWFwLmNsZWFyKCk7Ci0JCQkKLQkJCWlmIChwcm9jID09IGFjdGl2aXR5KSB7Ci0JCQkJTWFwIGFjdGl2aXRpZXMgPSBNaWdyYXRpb25VdGlsLmdldEFjdGl2aXRpZXMocHJvYywgdHJ1ZSk7Ci0JCQkJZm9yIChJdGVyYXRvciBpdCA9IGFjdGl2aXRpZXMudmFsdWVzKCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCQlBY3Rpdml0eSBhY3QgPSAoQWN0aXZpdHkpIGl0Lm5leHQoKTsKLQkJCQkJYWRkQUQoeG1pcmVzLCBwcm9jLCBhY3QsIG1ncik7Ci0JCQkJCWFkZEFERCh4bWlyZXMsIHByb2MsIGFjdCwgbWdyKTsKLQkJCQkJYWRkV1BEKHhtaXJlcywgcHJvYywgYWN0LCBtZ3IpOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJYWRkQUQoeG1pcmVzLCBwcm9jLCBhY3Rpdml0eSwgbWdyKTsKLQkJCQlhZGRBREQoeG1pcmVzLCBwcm9jLCBhY3Rpdml0eSwgbWdyKTsKLQkJCQlhZGRXUEQoeG1pcmVzLCBwcm9jLCBhY3Rpdml0eSwgbWdyKTsKLQkJCX0KLQotLyoJCQl0eC5jb21taXQoKTsqLwotCQkJCi0JCQlMaXN0IGNvbnRlbnRzID0geG1pcmVzLmdldENvbnRlbnRzKCk7Ci0JCQlpZiAoY29udGVudHMgIT0gbnVsbCAmJiAhIGNvbnRlbnRzLmlzRW1wdHkoKSkgewotCQkJCXhtaXJlcy5zYXZlKG51bGwpOwotCQkJfQotCi0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJdGhyb3cgbmV3IE1pZ3JhdGlvbkV4cG9ydEV4Y2VwdGlvbihlKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWlmKG1nciAhPSBudWxsKSB7Ci0JCQkJbWdyLnJlbW92ZUNvbnN1bWVyKHRoaXMpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBhZGREYXRhVG9SZXNvdXJjZV9XUEQoUmVzb3VyY2UgeG1pUmVzb3VyY2UsIFByb2Nlc3MgcHJvYywKLQkJCUFjdGl2aXR5IHVtYUFjdGl2aXR5KSB7CQotCQkKLQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtIGQgID0gR3JhcGhpY2FsRGF0YU1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5nZXRVTUFEaWFncmFtKHVtYUFjdGl2aXR5LCBJRGlhZ3JhbU1hbmFnZXIuV09SS19QUk9EVUNUX0RFUEVOREVOQ1lfRElBR1JBTSwgZmFsc2UpOwotCQlpZiAoZCAhPSBudWxsKSB7Ci0JCQlpZiAoZGVidWcpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIldQREQtPiIrcHJvYy5nZXROYW1lKCkrIjo6Iit1bWFBY3Rpdml0eS5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCX0KLQkJCVdvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW0gd3BkRGlhZ3JhbSA9IE1vZGVsRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkJLmNyZWF0ZVdvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW0oKTsKLQkJCWFkZERhdGFUb1Jlc291cmNlX0FERG9yV1BEKHByb2MsIHVtYUFjdGl2aXR5LCB4bWlSZXNvdXJjZSwKLQkJCQkJd3BkRGlhZ3JhbSk7Ci0JCX0KLQl9Ci0JCi0KLQlwcml2YXRlIHZvaWQgYWRkRGF0YVRvUmVzb3VyY2VfQUREKFJlc291cmNlIHhtaVJlc291cmNlLAotCQkJUHJvY2VzcyBwcm9jLCBBY3Rpdml0eSB1bWFBY3Rpdml0eSkgewotCQlvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW0gZCA9IEdyYXBoaWNhbERhdGFNYW5hZ2VyLmdldEluc3RhbmNlKCkKLQkJCQkuZ2V0VU1BRGlhZ3JhbSh1bWFBY3Rpdml0eSwKLQkJCQkJCUlEaWFncmFtTWFuYWdlci5BQ1RJVklUWV9ERVRBSUxfRElBR1JBTSwgZmFsc2UpOwotCQlpZiAoZCAhPSBudWxsKSB7Ci0JCQlpZiAoZGVidWcpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkFERC0+Iitwcm9jLmdldE5hbWUoKSsiOiIrdW1hQWN0aXZpdHkuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQl9Ci0JCQlBY3Rpdml0eURldGFpbERpYWdyYW0gYWRkRGlhZ3JhbSA9IE1vZGVsRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkJLmNyZWF0ZUFjdGl2aXR5RGV0YWlsRGlhZ3JhbSgpOwotCQkJYWRkRGF0YVRvUmVzb3VyY2VfQUREb3JXUEQocHJvYywgdW1hQWN0aXZpdHksIHhtaVJlc291cmNlLAotCQkJCQlhZGREaWFncmFtKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBhZGREYXRhVG9SZXNvdXJjZV9BRERvcldQRChQcm9jZXNzIHByb2MsIEFjdGl2aXR5IHVtYUFjdGl2aXR5LCAKLQkJCVJlc291cmNlIHhtaVJlc291cmNlLCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5EaWFncmFtIGFkZE9yV3BkRGlhZ3JhbSkgewotCQlTdXBwcmVzc2lvbiBzdXAgPSBuZXcgU3VwcHJlc3Npb24ocHJvYyk7Ci0JCWFkZE9yV3BkRGlhZ3JhbS5zZXRTdXBwcmVzc2lvbihzdXApOwotCQlTdHJpbmcga2luZCA9IG51bGw7Ci0JCVByZWZlcmVuY2VzSGludCBwcmVmSGludCA9IG51bGw7Ci0JCWlmIChhZGRPcldwZERpYWdyYW0gaW5zdGFuY2VvZiBBY3Rpdml0eURldGFpbERpYWdyYW0pIHsKLQkJCWFkZE9yV3BkRGlhZ3JhbS5zZXRGaWx0ZXIoUHJvY2Vzc0F1dGhvcmluZ0NvbmZpZ3VyYXRvci5JTlNUQU5DRSk7Ci0JCQlraW5kID0gRGlhZ3JhbU1hbmFnZXIuQUREX2tpbmQ7Ci0JCQlwcmVmSGludCA9IEFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvclBsdWdpbi5ESUFHUkFNX1BSRUZFUkVOQ0VTX0hJTlQ7Ci0JCX0gZWxzZSBpZiAoYWRkT3JXcGREaWFncmFtIGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbSkgewotCQkJa2luZCA9IERpYWdyYW1NYW5hZ2VyLldQRF9raW5kOwotCQkJcHJlZkhpbnQgPSBXUEREaWFncmFtRWRpdG9yUGx1Z2luLkRJQUdSQU1fUFJFRkVSRU5DRVNfSElOVDsKLQkJfSBlbHNlIHsKLQkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCQl9Ci0JCWFkZE9yV3BkRGlhZ3JhbS5zZXRPYmplY3QodW1hQWN0aXZpdHkpOwotCQlhZGRPcldwZERpYWdyYW0uc2V0TGlua2VkRWxlbWVudCh1bWFBY3Rpdml0eSk7Ci0JCQotCQkvLwlzZXQgc3VwcHJlc3Npb24vcHVibGlzaGVkIGluZm8gZm9yIEFERC8gV1BERAotCQlvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW0gdW1hRGlhZ3JhbSA9IGFkZE9yV3BkRGlhZ3JhbS5nZXRVTUFEaWFncmFtKCk7Ci0JCWlmICh1bWFEaWFncmFtICE9IG51bGwpIHsKLQkJCWlmICh1bWFEaWFncmFtLmdldFN1cHByZXNzZWQoKS5ib29sZWFuVmFsdWUoKSkgewkKLQkJCQlpZiAoYWRkT3JXcGREaWFncmFtIGluc3RhbmNlb2YgQWN0aXZpdHlEZXRhaWxEaWFncmFtKXsKLQkJCQkJRGlhZ3JhbU9wdGlvbnMuc2V0UHVibGlzaEFERCh1bWFBY3Rpdml0eSwgZmFsc2UpOwotCQkJCX0KLQkJCQllbHNlIGlmIChhZGRPcldwZERpYWdyYW0gaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtKSB7Ci0JCQkJCURpYWdyYW1PcHRpb25zLnNldFB1Ymxpc2hXUEREKHVtYUFjdGl2aXR5LCBmYWxzZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCS8vIGdldCBhdXRvTGF5b3V0IGZsYWcgaWYgZGlhZ3JhbSBpcyBBREQKLQkJaWYgKGFkZE9yV3BkRGlhZ3JhbSBpbnN0YW5jZW9mIEFjdGl2aXR5RGV0YWlsRGlhZ3JhbSkgewotCQkJYm9vbGVhbiB2YWx1ZSA9IEdyYXBoaWNhbERhdGFIZWxwZXIKLQkJCQkJLmlzQXV0b0xheW91dCgoQWN0aXZpdHlEZXRhaWxEaWFncmFtKSBhZGRPcldwZERpYWdyYW0pOwotCQkJKChBY3Rpdml0eURldGFpbERpYWdyYW0pIGFkZE9yV3BkRGlhZ3JhbSkuc2V0QXV0b0xheW91dCh2YWx1ZSk7Ci0JCX0KLQkJCi0JCS8vIENyZWF0ZSBkaWFncmFtCi0JCURpYWdyYW0gZGlhZ3JhbSA9IFZpZXdTZXJ2aWNlLmNyZWF0ZURpYWdyYW0oYWRkT3JXcGREaWFncmFtLCBraW5kLAotCQkJCXByZWZIaW50KTsKLQkJZGlhZ3JhbS5zZXRFbGVtZW50KGFkZE9yV3BkRGlhZ3JhbSk7Ci0JCWRpYWdyYW0uc2V0TmFtZSh1bWFBY3Rpdml0eS5nZXROYW1lKCkpOwotCQkKLQkJeG1pUmVzb3VyY2UuZ2V0Q29udGVudHMoKS5hZGQoYWRkT3JXcGREaWFncmFtKTsKLQkJeG1pUmVzb3VyY2UuZ2V0Q29udGVudHMoKS5hZGQoZGlhZ3JhbSk7Ci0JCQotCQlMaXN0IG5vZGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlIYXNoTWFwIG1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCQotCQkKLQkJTGlzdCBkaWFncmFtTm9kZXMgPSBhZGRPcldwZERpYWdyYW0uZ2V0Tm9kZXMoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGRpYWdyYW1Ob2Rlcy5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3Qgb2JqID0gaXRlcmF0b3IubmV4dCgpOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIE5vZGUgKSB7Ci0JCQkJTm9kZSBub2RlID0gKE5vZGUpIG9iajsKLQkJCQlpZiAoKG9iaiBpbnN0YW5jZW9mIFR5cGVkTm9kZSkgJiYKLQkJCQkJCSgoKFR5cGVkTm9kZSlvYmopLmdldFR5cGUoKSA9PSBUeXBlZE5vZGUuRlJFRV9URVhUKSkJewkKLQkJCQkJLy8gZG8gc3BlY2lhbCBoYW5kaW5nIGZvciBmcmVlIHRleHQgbm9kZQkJCQkJCi0JCQkJCW9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vZGUgdGV4dCA9IE1hcFV0aWwuY3JlYXRlVGV4dChkaWFncmFtLCAoTm9kZSkgb2JqKTsKLQkJCQkJZGlhZ3JhbS5pbnNlcnRDaGlsZCh0ZXh0KTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCS8vIENyZWF0ZSBOb3RhdGlvbiBubm9kZQotCQkJCQlvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob2RlIG5vdGF0aW9uTm9kZSA9IE1hcFV0aWwuY3JlYXRlTm90YXRpb25Ob2RlX0FERG9yV1BEKGRpYWdyYW0sIG5vZGUpOwotCQkJCQlpZiAobm90YXRpb25Ob2RlID09IG51bGwpIHsKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQl9Ci0JCQkJCWRpYWdyYW0uaW5zZXJ0Q2hpbGQobm90YXRpb25Ob2RlKTsKLQotCQkJCQlCb3VuZHMgYm91bmRzID0gTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVCb3VuZHMoKTsKLQkJCQkJYm91bmRzLnNldEhlaWdodChub2RlLmdldEhlaWdodCgpKTsKLQkJCQkJYm91bmRzLnNldFdpZHRoKG5vZGUuZ2V0V2lkdGgoKSk7Ci0JCQkJCWJvdW5kcy5zZXRYKG5vZGUuZ2V0TG9jYXRpb24oKS54KTsKLQkJCQkJYm91bmRzLnNldFkobm9kZS5nZXRMb2NhdGlvbigpLnkpOwotCQkJCQlub3RhdGlvbk5vZGUuc2V0TGF5b3V0Q29uc3RyYWludChib3VuZHMpOwotCi0JCQkJCW5vdGF0aW9uTm9kZS5zZXRFbGVtZW50KG5vZGUpOwotCQkJCQotCQkJCQlub2Rlcy5hZGQobm9kZSk7Ci0JCQkJCW1hcC5wdXQobm9kZSwgbm90YXRpb25Ob2RlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCQotCQlDb25uZWN0aW9uRmFjdG9yeSBmYWN0b3J5ID0gbmV3IENvbm5lY3Rpb25GYWN0b3J5KGRpYWdyYW0sIG1hcCwga2luZCk7Ci0JCS8vIENyZWF0ZSBPdXRnb2luZyBjb25uZWN0aW9ucwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gbm9kZXMuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IG9iaiA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBOb2RlKSB7Ci0JCQkJZmFjdG9yeS5vdXRnb2luZ0Nvbm5lY3Rpb25zKChOb2RlKSBvYmopOwotCQkJfQotCQl9Ci0KLQkJLy8gQ3JlYXRlIE91dGdvaW5nIGNvbm5lY3Rpb25zCi0JCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBub2Rlcy5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3Qgb2JqID0gaXRlcmF0b3IubmV4dCgpOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIE5vZGUpIHsKLQkJCQlmYWN0b3J5LmluY29taW5nQ29ubmVjdGlvbnMoKE5vZGUpIG9iaik7Ci0JCQl9Ci0JCX0KLQkJCi0JfQotCQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIHJlc291cmNlCi0JICogQHBhcmFtIGxpc3QKLQkgKiBAcGFyYW0gcHJvY2VzcwotCSAqLwotCXByaXZhdGUgdm9pZCBhZGREYXRhVG9SZXNvdXJjZV9BRCggUmVzb3VyY2UgeG1pUmVzb3VyY2UsIFByb2Nlc3MgcHJvYywKLQkJCUFjdGl2aXR5IHVtYUFjdGl2aXR5KSB7Ci0KLQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtIGQgPSBHcmFwaGljYWxEYXRhTWFuYWdlci5nZXRJbnN0YW5jZSgpCi0JCQkJLmdldFVNQURpYWdyYW0odW1hQWN0aXZpdHksIElEaWFncmFtTWFuYWdlci5BQ1RJVklUWV9ESUFHUkFNLAotCQkJCQkJZmFsc2UpOwotCQlpZiAoZCA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKGRlYnVnKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkFELT4iK3Byb2MuZ2V0TmFtZSgpKyI6Iit1bWFBY3Rpdml0eS5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCQkKLQkJLy8gQ3JlYXRlIHRvcCBsZXZlbCBVTUwgYWN0aXZpdHkKLQkJRU9iamVjdCBhY3Rpdml0eSA9IFVNTEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZShVTUxQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRBY3Rpdml0eSgpKTsKLQkJaWYgKGFjdGl2aXR5IGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UudW1sMi51bWwuQWN0aXZpdHkpIHsKLQkJCSgob3JnLmVjbGlwc2UudW1sMi51bWwuQWN0aXZpdHkpYWN0aXZpdHkpLnNldE5hbWUodW1hQWN0aXZpdHkuZ2V0TmFtZSgpKTsKLQkJfQotCQlpZiAoYWN0aXZpdHkgaW5zdGFuY2VvZiBFTW9kZWxFbGVtZW50KSB7Ci0JCQkvL0JyaWRnZUhlbHBlci5hZGRFQW5ub3RhdGlvbigoRU1vZGVsRWxlbWVudCkgYWN0aXZpdHksICgoTWV0aG9kRWxlbWVudCkgdW1hQWN0aXZpdHkpKTsKLS8vCQkJVW1hVW1sVXRpbC5jcmVhdGVFQW5ub3RhdGlvbkZvclVtbCgoTmFtZWRFbGVtZW50KSBhY3Rpdml0eSwKLS8vCQkJCQl1bWFBY3Rpdml0eS5nZXRHdWlkKCkpOwotCQkJCi0JCQlCcmlkZ2VIZWxwZXIuYXNzb2NpYXRlKChFTW9kZWxFbGVtZW50KSBhY3Rpdml0eSwgdW1hQWN0aXZpdHkpOwotCQl9Ci0JCQotCQkvLyBDcmVhdGUgZGlhZ3JhbQotCQlEaWFncmFtIGRpYWdyYW0gPSBWaWV3U2VydmljZS5jcmVhdGVEaWFncmFtKGFjdGl2aXR5LCBEaWFncmFtTWFuYWdlci5BRF9raW5kLAotCQkJCUFjdGl2aXR5RGlhZ3JhbUVkaXRvclBsdWdpbi5ESUFHUkFNX1BSRUZFUkVOQ0VTX0hJTlQpOwotCQlkaWFncmFtLnNldEVsZW1lbnQoYWN0aXZpdHkpOwotCQlpZiAoYWN0aXZpdHkgaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eSkgewotCQkJZGlhZ3JhbS5zZXROYW1lKHVtYUFjdGl2aXR5LmdldE5hbWUoKSk7Ci0JCX0KLQkKLQkJU3VwcHJlc3Npb24gc3VwcHJlc3Npb24gPSBuZXcgU3VwcHJlc3Npb24ocHJvYyk7Ci0JCQotCQlBY3Rpdml0eURpYWdyYW0gYWQgPSBNb2RlbEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUFjdGl2aXR5RGlhZ3JhbSgpOwotCQlhZC5zZXRTdXBwcmVzc2lvbihzdXBwcmVzc2lvbik7Ci0JCWFkLnNldE9iamVjdCh1bWFBY3Rpdml0eSk7Ci0JCWlmIChhZC5pc05ldygpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCS8vIHNldCBzdXBwcmVzc2lvbi9wdWJsaXNoZWQgaW5mbyBmb3IgQUQgCi0JCW9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbSB1bWFEaWFncmFtID0gYWQuZ2V0VU1BRGlhZ3JhbSgpOwotCQlpZiAodW1hRGlhZ3JhbSAhPSBudWxsKSB7Ci0JCQlpZiAodW1hRGlhZ3JhbS5nZXRTdXBwcmVzc2VkKCkuYm9vbGVhblZhbHVlKCkpIHsJCi0JCQkJRGlhZ3JhbU9wdGlvbnMuc2V0UHVibGlzaEFEKHVtYUFjdGl2aXR5LCBmYWxzZSk7Ci0JCQl9Ci0JCX0KLQkJCi0vLwkJcmV0dXJuIChMaXN0KSBhZC5nZXROb2RlcygpOwotCQkKLS8vCQlMaXN0IGRpYWdyYW1Ob2RlcyA9IGdldEFjdGl2aXR5RGlhZ3JhbURhdGEoc3VwcHJlc3Npb24sIHVtYUFjdGl2aXR5KTsKLQkJTGlzdCBkaWFncmFtTm9kZXMgPSBhZC5nZXROb2RlcygpOwotCQlpZiAoZGlhZ3JhbU5vZGVzID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQkKLQotCi0JCXhtaVJlc291cmNlLmdldENvbnRlbnRzKCkuYWRkKGFjdGl2aXR5KTsKLQkJeG1pUmVzb3VyY2UuZ2V0Q29udGVudHMoKS5hZGQoZGlhZ3JhbSk7Ci0JCQkKLQkJTGlzdCBtYXBOb2RlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJSGFzaE1hcCBtYXBOb2Rlc01hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCQotCQkvLyBDcmVhdGUgVU1MIGFuZCBub3RhdGlvbiBub2RlcwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gZGlhZ3JhbU5vZGVzLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBvYmogPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgTm9kZSApIHsKLQkJCQlpZiAoKG9iaiBpbnN0YW5jZW9mIFR5cGVkTm9kZSkgJiYKLQkJCQkJCSgoKFR5cGVkTm9kZSlvYmopLmdldFR5cGUoKSA9PSBUeXBlZE5vZGUuRlJFRV9URVhUKSkJewkKLQkJCQkJLy8gZG8gc3BlY2lhbCBoYW5kaW5nIGZvciBmcmVlIHRleHQgbm9kZQotCQkJCQlvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob2RlIHRleHQgPSBNYXBVdGlsLmNyZWF0ZVRleHQoZGlhZ3JhbSwgKE5vZGUpIG9iaik7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlNYXBOb2RlIG1hcE5vZGUgPSBNYXBGYWN0b3J5LmdldEluc3RhbmNlKCkuY3JlYXRlKChOb2RlKSBvYmopOwotCQkJCQltYXBOb2RlLnNldEFjdGl2aXR5KChvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eSlhY3Rpdml0eSk7Ci0JCQkJCW1hcE5vZGUuc2V0RGlhZ3JhbShkaWFncmFtKTsKLQkJCQkJCi0JCQkJCW1hcE5vZGUudXBkYXRlUmVzb3VyY2UoKTsKLQkJCQkJbWFwTm9kZXMuYWRkKG1hcE5vZGUpOwotCQkJCQltYXBOb2Rlc01hcC5wdXQobWFwTm9kZSwgKE5vZGUpIG9iaik7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQkvLyBDcmVhdGUgT3V0Z29pbmcgY29ubmVjdGlvbnMKLQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IG1hcE5vZGVzLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBvYmogPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgTWFwTm9kZSkgewotCQkJCSgoTWFwTm9kZSkgb2JqKS5vdXRnb2luZ0Nvbm5lY3Rpb25zKChOb2RlKSBtYXBOb2Rlc01hcC5nZXQoKE1hcE5vZGUpIG9iaikpOwotCQkJfQotCQl9Ci0JCQotCQkvLyBDcmVhdGUgaW5jb21pbmcgY29ubmVjdGlvbnMKLQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IG1hcE5vZGVzLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBvYmogPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgTWFwTm9kZSkgewotCQkJCSgoTWFwTm9kZSkgb2JqKS5pbmNvbWluZ0Nvbm5lY3Rpb25zKChOb2RlKSBtYXBOb2Rlc01hcC5nZXQoKE1hcE5vZGUpIG9iaikpOwotCQkJfQotCQl9Ci0JfQotCQotCQotCS8qKgotCSAqIFJldHVybiBhY3Rpdml0eSBkaWFncmFtIGRhdGEKLQkgKiBAcGFyYW0gc3VwCi0JICogQHBhcmFtIGFjdGl2aXR5Ci0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgTGlzdCBnZXRBY3Rpdml0eURpYWdyYW1EYXRhKFN1cHByZXNzaW9uIHN1cCwgQWN0aXZpdHkgYWN0aXZpdHkpIHsKLQkJQWN0aXZpdHlEaWFncmFtIGFkID0gTW9kZWxGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVBY3Rpdml0eURpYWdyYW0oKTsKLQkJYWQuc2V0U3VwcHJlc3Npb24oc3VwKTsKLQkJYWQuc2V0T2JqZWN0KGFjdGl2aXR5KTsKLQkJaWYgKGFkLmlzTmV3KCkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiAoTGlzdCkgYWQuZ2V0Tm9kZXMoKTsKLQotCX0KLQkKLQlwcml2YXRlIHZvaWQgYWRkQUQoZmluYWwgUmVzb3VyY2UgcmVzb3VyY2UsIGZpbmFsIFByb2Nlc3MgcHJvYywKLQkJCWZpbmFsIEFjdGl2aXR5IHVtYUFjdGl2aXR5LCBmaW5hbCBEaWFncmFtTWFuYWdlciBtZ3IpIHsKLQkJYWRkVG9SZXNvdXJjZShyZXNvdXJjZSwgcHJvYywgdW1hQWN0aXZpdHksIG1nciwgMCk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBhZGRBREQoZmluYWwgUmVzb3VyY2UgcmVzb3VyY2UsIGZpbmFsIFByb2Nlc3MgcHJvYywKLQkJCWZpbmFsIEFjdGl2aXR5IHVtYUFjdGl2aXR5LCBmaW5hbCBEaWFncmFtTWFuYWdlciBtZ3IpIHsKLQkJYWRkVG9SZXNvdXJjZShyZXNvdXJjZSwgcHJvYywgdW1hQWN0aXZpdHksIG1nciwgMSk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBhZGRXUEQoZmluYWwgUmVzb3VyY2UgcmVzb3VyY2UsIGZpbmFsIFByb2Nlc3MgcHJvYywKLQkJCWZpbmFsIEFjdGl2aXR5IHVtYUFjdGl2aXR5LCBmaW5hbCBEaWFncmFtTWFuYWdlciBtZ3IpIHsKLQkJYWRkVG9SZXNvdXJjZShyZXNvdXJjZSwgcHJvYywgdW1hQWN0aXZpdHksIG1nciwgMik7Ci0JfQotCQotCS8vdHlwZTogMD1BRCwgMT1BREQsIDI9V1BECi0JcHJpdmF0ZSB2b2lkIGFkZFRvUmVzb3VyY2UoZmluYWwgUmVzb3VyY2UgcmVzb3VyY2UsCi0JCQlmaW5hbCBQcm9jZXNzIHByb2MsIGZpbmFsIEFjdGl2aXR5IHVtYUFjdGl2aXR5LAotCQkJZmluYWwgRGlhZ3JhbU1hbmFnZXIgbWdyLCBmaW5hbCBpbnQgdHlwZSkgewotCQlTYWZlVXBkYXRlQ29udHJvbGxlci5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJVHJhbnNhY3Rpb24gdHggPSBtZ3IuZ2V0RWRpdGluZ0RvbWFpbigpLnN0YXJ0VHJhbnNhY3Rpb24oCi0JCQkJCQkJZmFsc2UsIENvbGxlY3Rpb25zLkVNUFRZX01BUCk7Ci0KLQkJCQkJaWYgKHR5cGUgPT0gMCkgewotCQkJCQkJYWRkRGF0YVRvUmVzb3VyY2VfQUQocmVzb3VyY2UsIHByb2MsIHVtYUFjdGl2aXR5KTsKLQkJCQkJfSBlbHNlIGlmICh0eXBlID09IDEpIHsKLQkJCQkJCWFkZERhdGFUb1Jlc291cmNlX0FERChyZXNvdXJjZSwgcHJvYywgdW1hQWN0aXZpdHkpOwotCQkJCQl9IGVsc2UgaWYgKHR5cGUgPT0gMikgewotCQkJCQkJYWRkRGF0YVRvUmVzb3VyY2VfV1BEKHJlc291cmNlLCBwcm9jLCB1bWFBY3Rpdml0eSk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlhc3NlcnQgKGZhbHNlKTsKLQkJCQkJfQotCQkJCQkKLQkJCQkJdHguY29tbWl0KCk7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1pZ3JhdGlvbi5kaWFncmFtL3NyYy9vcmcvZWNsaXBzZS9lcGYvbWlncmF0aW9uL2RpYWdyYW0vYWQvd2l6YXJkcy9NaWdyYXRpb25FeHBvcnRXaXphcmQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5taWdyYXRpb24uZGlhZ3JhbS9zcmMvb3JnL2VjbGlwc2UvZXBmL21pZ3JhdGlvbi9kaWFncmFtL2FkL3dpemFyZHMvTWlncmF0aW9uRXhwb3J0V2l6YXJkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkMjNiODAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1pZ3JhdGlvbi5kaWFncmFtL3NyYy9vcmcvZWNsaXBzZS9lcGYvbWlncmF0aW9uL2RpYWdyYW0vYWQvd2l6YXJkcy9NaWdyYXRpb25FeHBvcnRXaXphcmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubWlncmF0aW9uLmRpYWdyYW0uYWQud2l6YXJkczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5taWdyYXRpb24uZGlhZ3JhbS5EaWFncmFtTWlncmF0aW9uUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5taWdyYXRpb24uZGlhZ3JhbS5NaWdyYXRpb25FeHBvcnRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1pZ3JhdGlvbi5kaWFncmFtLk1pZ3JhdGlvblJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubWlncmF0aW9uLmRpYWdyYW0uYWQuc2VydmljZXMuV29ya2Zsb3dFeHBvcnRTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFeHBvcnRXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLQotLyoqCi0gKiBFeHBvcnQgd2l6YXJkIGZvciBleHBvcnRpbmcgZGlhZ3JhbXMKLSAqIAotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBNaWdyYXRpb25FeHBvcnRXaXphcmQgZXh0ZW5kcyBXaXphcmQgaW1wbGVtZW50cyBJRXhwb3J0V2l6YXJkIHsKLQotCS8vIFRoZSB3b3JrYmVuY2ggaW5zdGFuY2UuCi0JcHJvdGVjdGVkIElXb3JrYmVuY2ggd29ya2JlbmNoOwotCi0JLy8gVGhlIHdvcmtiZW5jaCBzZWxlY3Rpb24gd2hlbiB0aGUgd2l6YXJkIHdhcyBzdGFydGVkLgotCXByb3RlY3RlZCBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb247Ci0KLQkvLyBUaGUgZmlyc3Qgd2l6YXJkIHBhZ2UuCi0JcHJvdGVjdGVkIE1pZ3JhdGlvbkV4cG9ydFdpemFyZFBhZ2UgcGFnZTE7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgZGlhZ3JhbSBtaWdyYXRpb24gZXhwb3J0Ci0JICovCi0JcHVibGljIE1pZ3JhdGlvbkV4cG9ydFdpemFyZCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmQjcGVyZm9ybUZpbmlzaCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gcGVyZm9ybUZpbmlzaCgpIHsKLQkJaWYgKHBhZ2UxICE9IG51bGwpIHsKLQotCQkJUHJvY2VzcyBwcm9jID0gcGFnZTEuZ2V0UHJvY2VzcygpOwotCQkJQWN0aXZpdHkgYWN0aXZpdHkgPSBwYWdlMS5nZXRBY3Rpdml0eSgpOwotCQkJLy8gTWV0aG9kQ29uZmlndXJhdGlvbiBtYyA9IHBhZ2UxLmdldENvbnRleHQoKTsKLQotCQkJU3RyaW5nIGZpbGVOYW1lID0gcGFnZTEuZ2V0VGVtcGxhdGVOYW1lKCk7Ci0JCQlTdHJpbmcgdGFyZ2V0RGlyID0gcGFnZTEuZ2V0VGFyZ2V0RGlyZWN0b3J5KCk7Ci0KLQkJCVN0cmluZyB0ZW1wbGF0ZUZpbGVOYW1lID0gZmlsZU5hbWUgKyAiLnhtaSI7IC8vJE5PTi1OTFMtMSQKLQkJCUZpbGUgdGVtcGxhdGVGaWxlID0gbmV3IEZpbGUodGFyZ2V0RGlyLCB0ZW1wbGF0ZUZpbGVOYW1lKTsKLQkJCWlmICh0ZW1wbGF0ZUZpbGUuZXhpc3RzKCkpIHsKLQkJCQlib29sZWFuIG9rID0gRGlhZ3JhbU1pZ3JhdGlvblBsdWdpbgotCQkJCQkJLmdldERlZmF1bHQoKQotCQkJCQkJLmdldE1zZ0RpYWxvZygpCi0JCQkJCQkuZGlzcGxheVByb21wdCgKLQkJCQkJCQkJTWlncmF0aW9uUmVzb3VyY2VzLndvcmtmbG93X292ZXJ3cml0ZVRleHREaWFsb2dfdGl0bGUsCi0JCQkJCQkJCU1pZ3JhdGlvblJlc291cmNlcwotCQkJCQkJCQkJCS5iaW5kKAotCQkJCQkJCQkJCQkJTWlncmF0aW9uUmVzb3VyY2VzLndvcmtmbG93X292ZXJ3cml0ZVRleHRfbXNnLAotCQkJCQkJCQkJCQkJbmV3IE9iamVjdFtdIHsKLQkJCQkJCQkJCQkJCQkJdGVtcGxhdGVGaWxlTmFtZSwKLQkJCQkJCQkJCQkJCQkJdGFyZ2V0RGlyIH0pKTsKLQotCQkJCWlmICghb2spIHsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCX0KLQotCQkJdHJ5IHsKLQkJCQlib29sZWFuIHN1Y2Nlc3MgPSBXb3JrZmxvd0V4cG9ydFNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5leHBvcnQoCi0JCQkJCQlwcm9jLCBhY3Rpdml0eSwgZmlsZU5hbWUsIG5ldyBGaWxlKHRhcmdldERpcikpOwotCi0JCQkJaWYgKHN1Y2Nlc3MpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCi0JCQl9IGNhdGNoIChNaWdyYXRpb25FeHBvcnRFeGNlcHRpb24geGUpIHsKLQkJCQl4ZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQotCQl9Ci0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpemFyZCNpbml0KG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2gsCi0JICogICAgICBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaCB3b3JrYmVuY2gsIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQl0aGlzLndvcmtiZW5jaCA9IHdvcmtiZW5jaDsKLQkJdGhpcy5zZWxlY3Rpb24gPSBzZWxlY3Rpb247Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkI2FkZFBhZ2VzKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRQYWdlcygpIHsKLQkJLy8gc3VwZXIuYWRkUGFnZXMoKTsKLQkJTWV0aG9kTGlicmFyeSBsaWIgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCk7Ci0JCWlmIChsaWIgPT0gbnVsbCkgewotCQkJRGlhZ3JhbU1pZ3JhdGlvblBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkKLQkJCQkJLmRpc3BsYXlFcnJvcigKLQkJCQkJCQlNaWdyYXRpb25SZXNvdXJjZXMub3Blbl9tZXRob2RfbGlicmFyeV9lcnJvcl90aXRsZSwKLQkJCQkJCQlNaWdyYXRpb25SZXNvdXJjZXMub3Blbl9tZXRob2RfbGlicmFyeV9lcnJvcl90ZXh0KTsKLQotCQkJcmV0dXJuOwotCQl9Ci0KLQkJcGFnZTEgPSBuZXcgTWlncmF0aW9uRXhwb3J0V2l6YXJkUGFnZSgpOwotCQlhZGRQYWdlKHBhZ2UxKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmQjY2FuRmluaXNoKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjYW5GaW5pc2goKSB7Ci0JCS8vIHJldHVybiBzdXBlci5jYW5GaW5pc2goKTsKLQkJcmV0dXJuIHBhZ2UxLmlzUGFnZUNvbXBsZXRlKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkI2NyZWF0ZVBhZ2VDb250cm9scyhvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlUGFnZUNvbnRyb2xzKENvbXBvc2l0ZSBwYWdlQ29udGFpbmVyKSB7Ci0JCXN1cGVyLmNyZWF0ZVBhZ2VDb250cm9scyhwYWdlQ29udGFpbmVyKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5taWdyYXRpb24uZGlhZ3JhbS9zcmMvb3JnL2VjbGlwc2UvZXBmL21pZ3JhdGlvbi9kaWFncmFtL2FkL3dpemFyZHMvTWlncmF0aW9uRXhwb3J0V2l6YXJkUGFnZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1pZ3JhdGlvbi5kaWFncmFtL3NyYy9vcmcvZWNsaXBzZS9lcGYvbWlncmF0aW9uL2RpYWdyYW0vYWQvd2l6YXJkcy9NaWdyYXRpb25FeHBvcnRXaXphcmRQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2ZTAxOWUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1pZ3JhdGlvbi5kaWFncmFtL3NyYy9vcmcvZWNsaXBzZS9lcGYvbWlncmF0aW9uL2RpYWdyYW0vYWQvd2l6YXJkcy9NaWdyYXRpb25FeHBvcnRXaXphcmRQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MjMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLm1pZ3JhdGlvbi5kaWFncmFtLmFkLndpemFyZHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1pZ3JhdGlvbi5kaWFncmFtLkRpYWdyYW1NaWdyYXRpb25QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1pZ3JhdGlvbi5kaWFncmFtLk1pZ3JhdGlvbkV4cG9ydENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubWlncmF0aW9uLmRpYWdyYW0uTWlncmF0aW9uUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5taWdyYXRpb24uZGlhZ3JhbS51dGlsLk1pZ3JhdGlvblV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXJlY3RvcnlEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci0KLS8qKgotICogRXhwb3J0IHdpemFyZCBwYWdlIGZvciBleHBvcnRpbmcgZGlhZ3JhbXMKLSAqIAotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjIKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBNaWdyYXRpb25FeHBvcnRXaXphcmRQYWdlIGV4dGVuZHMgV2l6YXJkUGFnZSBpbXBsZW1lbnRzCi0JCUlXaXphcmRQYWdlLCBMaXN0ZW5lciB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQUdFX05BTUUgPSBNaWdyYXRpb25FeHBvcnRXaXphcmRQYWdlLmNsYXNzCi0JCQkuZ2V0TmFtZSgpOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gRU1QVFlfQVJSQVkgPSBuZXcgU3RyaW5nWzBdOwotCi0JcHJpdmF0ZSBCdXR0b24gY2FwYWJpbGl0eVBhdHRlcm5SYWRpb0J1dHRvbjsKLQotCXByaXZhdGUgQnV0dG9uIGRlbGl2ZXJ5UHJvY2Vzc1JhZGlvQnV0dG9uOwotCi0JcHJpdmF0ZSBDb21ibyBwcm9jZXNzQ29tYm87Ci0KLS8vCXByaXZhdGUgQ29tYm8gY29udGV4dENvbWJvOwotCi0JcHJpdmF0ZSBDb21ibyBhY3Rpdml0eUNvbWJvOwotCi0JcHJpdmF0ZSBDb21ibyB0ZW1wbGF0ZU5hbWVDb21ibzsKLQotCXByaXZhdGUgQ29tYm8gdGVtcGxhdGVEaXJDb21ibzsKLQotCXByaXZhdGUgTWFwIGNhcGFiaWxpdHlQYXR0ZXJuczsKLQotCXByaXZhdGUgTWFwIGRlbGl2ZXJ5UHJvY2Vzc2VzOwotCi0JcHJpdmF0ZSBNYXAgYWN0aXZpdGllczsKLQotCXByaXZhdGUgTW9kaWZ5TGlzdGVuZXIgbW9kaWZ5TGlzdGVuZXIgPSBuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotCQkJc2V0UGFnZUNvbXBsZXRlKGlzUGFnZUNvbXBsZXRlKCkpOwotCQl9Ci0JfTsKLQotCXByb3RlY3RlZCBNaWdyYXRpb25FeHBvcnRXaXphcmRQYWdlKCkgewotCQlzdXBlcihQQUdFX05BTUUpOwotCQlzZXRUaXRsZShNaWdyYXRpb25SZXNvdXJjZXMud29ya2Zsb3dfZXhwb3J0X3dpemFyZF90aXRsZSk7Ci0JCXNldERlc2NyaXB0aW9uKE1pZ3JhdGlvblJlc291cmNlcy53b3JrZmxvd19leHBvcnRfd2l6YXJkX3RleHQpOwotCQkKLQkJc2V0SW1hZ2VEZXNjcmlwdG9yKERpYWdyYW1NaWdyYXRpb25QbHVnaW4uZ2V0RGVmYXVsdCgpCi0JCQkJLmdldEltYWdlRGVzY3JpcHRvcigiZnVsbC93aXpiYW4vRXhwb3J0WE1MLmdpZiIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCQlmaW5hbCBTaGVsbCBzaGVsbCA9IHBhcmVudC5nZXRTaGVsbCgpOwotCi0JCS8vIENyZWF0ZSB0aGUgY29tcG9zaXRlIHRvIGhvbGQgdGhlIHdpZGdldHMuCi0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDEsIGZhbHNlKSk7Ci0KLQkJLy8gQ3JlYXRlIHRoZSBQcm9jZXNzIGdyb3VwLgotCQlHcm91cCBwcm9jZXNzR3JvdXAgPSBuZXcgR3JvdXAoY29tcG9zaXRlLCBTV1QuTlVMTCk7Ci0JCXByb2Nlc3NHcm91cC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMSwgZmFsc2UpKTsKLQkJcHJvY2Vzc0dyb3VwLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQlwcm9jZXNzR3JvdXAKLQkJCQkuc2V0VGV4dChNaWdyYXRpb25SZXNvdXJjZXMud29ya2Zsb3dfZXhwb3J0X3dpemFyZF9wcm9jZXNzR3JvdXBfdGV4dCk7Ci0KLQkJQ29tcG9zaXRlIGJ1dHRvbkNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocHJvY2Vzc0dyb3VwLCBTV1QuTlVMTCk7Ci0JCWJ1dHRvbkNvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpKTsKLQotCQljYXBhYmlsaXR5UGF0dGVyblJhZGlvQnV0dG9uID0gbmV3IEJ1dHRvbihidXR0b25Db21wb3NpdGUsIFNXVC5SQURJTyk7Ci0JCWNhcGFiaWxpdHlQYXR0ZXJuUmFkaW9CdXR0b24KLQkJCQkuc2V0VGV4dChNaWdyYXRpb25SZXNvdXJjZXMud29ya2Zsb3dfZXhwb3J0X3dpemFyZF9jYXBhYmlsaXR5UGF0dGVyblJhZGlvQnV0dG9uX3RleHQpOwotCQljYXBhYmlsaXR5UGF0dGVyblJhZGlvQnV0dG9uCi0JCQkJLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQkJCXVwZGF0ZVByb2Nlc3NDb21ibyhjYXBhYmlsaXR5UGF0dGVybnMpOwotCQkJCQkJdXBkYXRlQWN0aXZpdHlDb21ibyhnZXRQcm9jZXNzKCkpOwotCQkJCQl9Ci0KLQkJCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJCX0KLQkJCQl9KTsKLQotCQlkZWxpdmVyeVByb2Nlc3NSYWRpb0J1dHRvbiA9IG5ldyBCdXR0b24oYnV0dG9uQ29tcG9zaXRlLCBTV1QuUkFESU8pOwotCQlkZWxpdmVyeVByb2Nlc3NSYWRpb0J1dHRvbgotCQkJCS5zZXRUZXh0KE1pZ3JhdGlvblJlc291cmNlcy53b3JrZmxvd19leHBvcnRfd2l6YXJkX2RlbGl2ZXJ5UHJvY2Vzc1JhZGlvQnV0dG9uX3RleHQpOwotCQlkZWxpdmVyeVByb2Nlc3NSYWRpb0J1dHRvbgotCQkJCS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJCQl1cGRhdGVQcm9jZXNzQ29tYm8oZGVsaXZlcnlQcm9jZXNzZXMpOwotCQkJCQkJdXBkYXRlQWN0aXZpdHlDb21ibyhnZXRQcm9jZXNzKCkpOwotCQkJCQl9Ci0KLQkJCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJCX0KLQkJCQl9KTsKLQotCQlDb21wb3NpdGUgcHJvY2Vzc0NvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocHJvY2Vzc0dyb3VwLCBTV1QuTlVMTCk7Ci0JCXByb2Nlc3NDb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKSk7Ci0JCXByb2Nlc3NDb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLQkJTGFiZWwgcHJvY2Vzc05hbWVMYWJlbCA9IG5ldyBMYWJlbChwcm9jZXNzQ29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCXByb2Nlc3NOYW1lTGFiZWwKLQkJCQkuc2V0VGV4dChNaWdyYXRpb25SZXNvdXJjZXMud29ya2Zsb3dfZXhwb3J0X3dpemFyZF9wcm9jZXNzTmFtZUxhYmVsX3RleHQpOwotCi0JCXByb2Nlc3NDb21ibyA9IG5ldyBDb21ibyhwcm9jZXNzQ29tcG9zaXRlLCBTV1QuQk9SREVSIHwgU1dULlJFQURfT05MWSk7Ci0JCXByb2Nlc3NDb21iby5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJcHJvY2Vzc0NvbWJvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0vLwkJCQl1cGRhdGVDb250ZXh0Q29tYm8oZ2V0UHJvY2VzcygpKTsKLS8vCQkJCWlmIChnZXRQcm9jZXNzQ29udGV4dE5hbWUoKSAhPSBudWxsKSB7Ci0vLwkJCQkJU3RyaW5nIGNvbnRleHROYW1lID0gZ2V0UHJvY2Vzc0NvbnRleHROYW1lKCk7Ci0vLwkJCQkJTWFwIHJlc3VsdCA9IE1pZ3JhdGlvblV0aWwuZ2V0Q29udGV4dHMoZ2V0UHJvY2VzcygpKTsKLS8vCQkJCQl1cGRhdGVBY3Rpdml0eUNvbWJvKGdldFByb2Nlc3MoKSwKLS8vCQkJCQkJCShNZXRob2RDb25maWd1cmF0aW9uKSByZXN1bHQuZ2V0KGNvbnRleHROYW1lKSk7Ci0vLwkJCQl9Ci0JCQkJdXBkYXRlQWN0aXZpdHlDb21ibyhnZXRQcm9jZXNzKCkpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCX0KLQkJfSk7Ci0KLS8vCQlMYWJlbCBjb250ZXh0TmFtZUxhYmVsID0gbmV3IExhYmVsKHByb2Nlc3NDb21wb3NpdGUsIFNXVC5OT05FKTsKLS8vCQljb250ZXh0TmFtZUxhYmVsCi0vLwkJCQkuc2V0VGV4dChNaWdyYXRpb25SZXNvdXJjZXMud29ya2Zsb3dfZXhwb3J0X3dpemFyZF9jb250ZXh0TmFtZUxhYmVsX3RleHQpOwotLy8KLS8vCQljb250ZXh0Q29tYm8gPSBuZXcgQ29tYm8ocHJvY2Vzc0NvbXBvc2l0ZSwgU1dULkJPUkRFUiB8IFNXVC5SRUFEX09OTFkpOwotLy8JCWNvbnRleHRDb21iby5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLS8vCQljb250ZXh0Q29tYm8uYWRkTW9kaWZ5TGlzdGVuZXIobW9kaWZ5TGlzdGVuZXIpOwotLy8KLS8vCQljb250ZXh0Q29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotLy8JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotLy8JCQkJU3RyaW5nIGNvbnRleHROYW1lID0gZ2V0UHJvY2Vzc0NvbnRleHROYW1lKCk7Ci0vLwkJCQlNYXAgcmVzdWx0ID0gTWlncmF0aW9uVXRpbC5nZXRDb250ZXh0cyhnZXRQcm9jZXNzKCkpOwotLy8JCQkJdXBkYXRlQWN0aXZpdHlDb21ibyhnZXRQcm9jZXNzKCksIChNZXRob2RDb25maWd1cmF0aW9uKSByZXN1bHQKLS8vCQkJCQkJLmdldChjb250ZXh0TmFtZSkpOwotLy8JCQl9Ci0vLwotLy8JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLS8vCQkJfQotLy8JCX0pOwotCi0JCUxhYmVsIGFjdGl2aXRpZXNOYW1lTGFiZWwgPSBuZXcgTGFiZWwocHJvY2Vzc0NvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlhY3Rpdml0aWVzTmFtZUxhYmVsCi0JCQkJLnNldFRleHQoTWlncmF0aW9uUmVzb3VyY2VzLndvcmtmbG93X2V4cG9ydF93aXphcmRfYWN0aXZpdGllc05hbWVMYWJlbF90ZXh0KTsKLQotCQlhY3Rpdml0eUNvbWJvID0gbmV3IENvbWJvKHByb2Nlc3NDb21wb3NpdGUsIFNXVC5CT1JERVIgfCBTV1QuUkVBRF9PTkxZKTsKLQkJYWN0aXZpdHlDb21iby5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJYWN0aXZpdHlDb21iby5hZGRNb2RpZnlMaXN0ZW5lcihtb2RpZnlMaXN0ZW5lcik7Ci0KLQkJY2FwYWJpbGl0eVBhdHRlcm5zID0gTWlncmF0aW9uVXRpbC5nZXRDYXBhYmlsaXR5UGF0dGVybnMoKTsKLQkJZGVsaXZlcnlQcm9jZXNzZXMgPSBNaWdyYXRpb25VdGlsLmdldERlbGl2ZXJ5UHJvY2Vzc2VzKCk7Ci0JCVN0cmluZyBzYXZlZFByb2Nlc3NUeXBlID0gRGlhZ3JhbU1pZ3JhdGlvblBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCQkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkuZ2V0U3RyaW5nKAotCQkJCQkJTWlncmF0aW9uRXhwb3J0Q29uc3RhbnRzLlBST0NFU1NfVFlQRSk7Ci0JCWlmIChzYXZlZFByb2Nlc3NUeXBlICE9IG51bGwKLQkJCQkmJiBzYXZlZFByb2Nlc3NUeXBlLmVxdWFscygiRGVsaXZlcnlQcm9jZXNzIikgJiYgZGVsaXZlcnlQcm9jZXNzZXMuc2l6ZSgpID4gMCkgeyAvLyROT04tTkxTLTEkCi0JCQlkZWxpdmVyeVByb2Nlc3NSYWRpb0J1dHRvbi5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCQl1cGRhdGVQcm9jZXNzQ29tYm8oZGVsaXZlcnlQcm9jZXNzZXMpOwotCQl9IGVsc2UgaWYgKHNhdmVkUHJvY2Vzc1R5cGUgIT0gbnVsbCAmJiBjYXBhYmlsaXR5UGF0dGVybnMgIT0gbnVsbCAmJiBjYXBhYmlsaXR5UGF0dGVybnMuc2l6ZSgpID4gMCkgewotCQkJY2FwYWJpbGl0eVBhdHRlcm5SYWRpb0J1dHRvbi5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCQl1cGRhdGVQcm9jZXNzQ29tYm8oY2FwYWJpbGl0eVBhdHRlcm5zKTsKLQkJfSBlbHNlIGlmIChjYXBhYmlsaXR5UGF0dGVybnMgIT0gbnVsbCAmJiBjYXBhYmlsaXR5UGF0dGVybnMuc2l6ZSgpID4gMCkgewotCQkJY2FwYWJpbGl0eVBhdHRlcm5SYWRpb0J1dHRvbi5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCQl1cGRhdGVQcm9jZXNzQ29tYm8oY2FwYWJpbGl0eVBhdHRlcm5zKTsKLQkJfSBlbHNlIHsKLQkJCWRlbGl2ZXJ5UHJvY2Vzc1JhZGlvQnV0dG9uLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJCXVwZGF0ZVByb2Nlc3NDb21ibyhkZWxpdmVyeVByb2Nlc3Nlcyk7Ci0JCX0KLQotCQl1cGRhdGVBY3Rpdml0eUNvbWJvKGdldFByb2Nlc3MoKSk7Ci0JCQotCQkvLyBDcmVhdGUgdGhlIFByb2plY3QgVGVtcGxhdGUgZ3JvdXAuCi0JCUdyb3VwIHRlbXBsYXRlR3JvdXAgPSBuZXcgR3JvdXAoY29tcG9zaXRlLCBTV1QuTlVMTCk7Ci0JCXRlbXBsYXRlR3JvdXAuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDEsIGZhbHNlKSk7Ci0JCXRlbXBsYXRlR3JvdXAuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCXRlbXBsYXRlR3JvdXAKLQkJCQkuc2V0VGV4dChNaWdyYXRpb25SZXNvdXJjZXMud29ya2Zsb3dfZXhwb3J0X3dpemFyZF90ZW1wbGF0ZUdyb3VwX3RleHQpOwotCi0JCUNvbXBvc2l0ZSB0ZW1wbGF0ZUNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUodGVtcGxhdGVHcm91cCwgU1dULk5VTEwpOwotCQl0ZW1wbGF0ZUNvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMywgZmFsc2UpKTsKLQkJdGVtcGxhdGVDb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLQkJTGFiZWwgdGVtcGxhdGVOYW1lTGFiZWwgPSBuZXcgTGFiZWwodGVtcGxhdGVDb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJdGVtcGxhdGVOYW1lTGFiZWwKLQkJCQkuc2V0VGV4dChNaWdyYXRpb25SZXNvdXJjZXMud29ya2Zsb3dfZXhwb3J0X3dpemFyZF90ZW1wbGF0ZU5hbWVMYWJlbF90ZXh0KTsKLQotCQl0ZW1wbGF0ZU5hbWVDb21ibyA9IG5ldyBDb21ibyh0ZW1wbGF0ZUNvbXBvc2l0ZSwgU1dULkJPUkRFUik7Ci0JCXRlbXBsYXRlTmFtZUNvbWJvLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQlTdHJpbmcgcHJldk5hbWUgPSBEaWFncmFtTWlncmF0aW9uUGx1Z2luLmdldERlZmF1bHQoKQotCQkJCS5nZXRQcmVmZXJlbmNlU3RvcmUoKS5nZXRTdHJpbmcoCi0JCQkJCQlNaWdyYXRpb25FeHBvcnRDb25zdGFudHMuVEVNUExBVEVfTkFNRVMpOwotCQlpZiAocHJldk5hbWUgIT0gbnVsbCkgewotCQkJdGVtcGxhdGVOYW1lQ29tYm8uYWRkKHByZXZOYW1lKTsKLQkJfQotCQl0ZW1wbGF0ZU5hbWVDb21iby5hZGRNb2RpZnlMaXN0ZW5lcihtb2RpZnlMaXN0ZW5lcik7Ci0KLQkJbmV3IExhYmVsKHRlbXBsYXRlQ29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0KLQkJTGFiZWwgZGlyTGFiZWwgPSBuZXcgTGFiZWwodGVtcGxhdGVDb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJZGlyTGFiZWwKLQkJCQkuc2V0VGV4dChNaWdyYXRpb25SZXNvdXJjZXMud29ya2Zsb3dfZXhwb3J0X3dpemFyZF9kaXJMYWJlbF90ZXh0KTsKLQotCQl0ZW1wbGF0ZURpckNvbWJvID0gbmV3IENvbWJvKHRlbXBsYXRlQ29tcG9zaXRlLCBTV1QuQk9SREVSKTsKLQkJdGVtcGxhdGVEaXJDb21iby5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJU3RyaW5nIHNhdmVkRGlyID0gRGlhZ3JhbU1pZ3JhdGlvblBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCQkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkuZ2V0U3RyaW5nKAotCQkJCQkJTWlncmF0aW9uRXhwb3J0Q29uc3RhbnRzLlRBUkdFVF9ESVJFQ1RPUklFUyk7Ci0JCWlmIChzYXZlZERpciAhPSBudWxsKSB7Ci0JCQl0ZW1wbGF0ZURpckNvbWJvLmFkZChzYXZlZERpcik7Ci0JCQl0ZW1wbGF0ZURpckNvbWJvLnNldFRleHQoc2F2ZWREaXIpOwotCQl9Ci0JCXRlbXBsYXRlRGlyQ29tYm8uYWRkTW9kaWZ5TGlzdGVuZXIobW9kaWZ5TGlzdGVuZXIpOwotCi0JCUJ1dHRvbiBicm93c2VCdXR0b24gPSBuZXcgQnV0dG9uKHRlbXBsYXRlQ29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWJyb3dzZUJ1dHRvbgotCQkJCS5zZXRUZXh0KE1pZ3JhdGlvblJlc291cmNlcy53b3JrZmxvd19leHBvcnRfd2l6YXJkX2Jyb3dzZUJ1dHRvbl90ZXh0KTsKLQkJYnJvd3NlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQl0cnkgewotCQkJCQlEaXJlY3RvcnlEaWFsb2cgZGlhbG9nID0gbmV3IERpcmVjdG9yeURpYWxvZyhzaGVsbCwKLQkJCQkJCQlTV1QuTk9ORSk7Ci0JCQkJCVN0cmluZyBzZWxlY3RlZERpciA9IGRpYWxvZy5vcGVuKCk7Ci0JCQkJCWlmIChzZWxlY3RlZERpciAhPSBudWxsKSB7Ci0JCQkJCQl0ZW1wbGF0ZURpckNvbWJvLmFkZChzZWxlY3RlZERpciwgMCk7Ci0JCQkJCQl0ZW1wbGF0ZURpckNvbWJvLnNldFRleHQoc2VsZWN0ZWREaXIpOwotCQkJCQl9Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JCXNldENvbnRyb2woY29tcG9zaXRlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCX0KLQotCS8qKgotCSAqIFVwZGF0ZXMgdGhlIFByb2Nlc3MgQ29tYm8uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlUHJvY2Vzc0NvbWJvKE1hcCBwcm9jZXNzZXMpIHsKLQkJaWYgKHByb2Nlc3NlcyAhPSBudWxsICYmIHByb2Nlc3Nlcy5zaXplKCkgPiAwKSB7Ci0JCQlTdHJpbmdbXSBuYW1lcyA9IG5ldyBTdHJpbmdbcHJvY2Vzc2VzLnNpemUoKV07Ci0JCQlwcm9jZXNzZXMua2V5U2V0KCkudG9BcnJheShuYW1lcyk7Ci0JCQlwcm9jZXNzQ29tYm8uc2V0SXRlbXMobmFtZXMpOwotCQkJU3RyaW5nIHNhdmVkUHJvY2VzcyA9IERpYWdyYW1NaWdyYXRpb25QbHVnaW4uZ2V0RGVmYXVsdCgpCi0JCQkJCS5nZXRQcmVmZXJlbmNlU3RvcmUoKS5nZXRTdHJpbmcoCi0JCQkJCQkJTWlncmF0aW9uRXhwb3J0Q29uc3RhbnRzLlBST0NFU1NfTkFNRSk7Ci0JCQlpZiAoc2F2ZWRQcm9jZXNzICE9IG51bGwgJiYgcHJvY2Vzc2VzLmNvbnRhaW5zS2V5KHNhdmVkUHJvY2VzcykpIHsKLQkJCQlwcm9jZXNzQ29tYm8uc2V0VGV4dChzYXZlZFByb2Nlc3MpOwotCQkJfSBlbHNlIHsKLQkJCQlwcm9jZXNzQ29tYm8uc2V0VGV4dChwcm9jZXNzQ29tYm8uZ2V0SXRlbSgwKSk7Ci0JCQl9Ci0vLwkJCXVwZGF0ZUNvbnRleHRDb21ibyhnZXRQcm9jZXNzKCkpOwotCQl9IGVsc2UgewotCQkJcHJvY2Vzc0NvbWJvLnNldEl0ZW1zKEVNUFRZX0FSUkFZKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFVwZGF0ZXMgdGhlIENvbnRleHQgQ29tYm8uCi0JICovCi0vLwlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVDb250ZXh0Q29tYm8oUHJvY2VzcyBwcm9jZXNzKSB7Ci0vLwkJdHJ5IHsKLS8vCQkJTWFwIGNvbnRleHRzID0gTWlncmF0aW9uVXRpbC5nZXRDb250ZXh0cyhwcm9jZXNzKTsKLS8vCQkJaWYgKGNvbnRleHRzICE9IG51bGwgJiYgY29udGV4dHMuc2l6ZSgpID4gMCkgewotLy8JCQkJU3RyaW5nW10gbmFtZXMgPSBuZXcgU3RyaW5nW2NvbnRleHRzLnNpemUoKV07Ci0vLwkJCQljb250ZXh0cy5rZXlTZXQoKS50b0FycmF5KG5hbWVzKTsKLS8vCQkJCWNvbnRleHRDb21iby5zZXRJdGVtcyhuYW1lcyk7Ci0vLwkJCQlTdHJpbmcgc2F2ZWRDb250ZXh0ID0gRGlhZ3JhbW1pbmdNaWdyYXRpb25QbHVnaW4uZ2V0RGVmYXVsdCgpCi0vLwkJCQkJCS5nZXRQcmVmZXJlbmNlU3RvcmUoKS5nZXRTdHJpbmcoCi0vLwkJCQkJCQkJTWlncmF0aW9uRXhwb3J0Q29uc3RhbnRzLlBST0NFU1NfQ09OVEVYVCk7Ci0vLwkJCQlpZiAoc2F2ZWRDb250ZXh0ICE9IG51bGwgJiYgY29udGV4dHMuY29udGFpbnNLZXkoc2F2ZWRDb250ZXh0KSkgewotLy8JCQkJCWNvbnRleHRDb21iby5zZXRUZXh0KHNhdmVkQ29udGV4dCk7Ci0vLwkJCQl9IGVsc2UgewotLy8JCQkJCVN0cmluZyBkZWZhdWx0Q29udGV4dCA9IHByb2Nlc3MuZ2V0RGVmYXVsdENvbnRleHQoKQotLy8JCQkJCQkJLmdldE5hbWUoKTsKLS8vCQkJCQljb250ZXh0Q29tYm8uc2V0VGV4dChkZWZhdWx0Q29udGV4dCk7Ci0vLwkJCQl9Ci0vLwkJCX0gZWxzZSB7Ci0vLwkJCQljb250ZXh0Q29tYm8uc2V0SXRlbXMoRU1QVFlfQVJSQVkpOwotLy8JCQl9Ci0vLwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLS8vCQl9Ci0vLwl9Ci0KLQkvKioKLQkgKiBVcGRhdGVzIHRoZSBhY3Rpdml0aXR5IENvbWJvLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZUFjdGl2aXR5Q29tYm8oUHJvY2VzcyBwcm9jZXNzKSB7Ci0JCXRyeSB7Ci0JCQlhY3Rpdml0aWVzID0gTWlncmF0aW9uVXRpbC5nZXRBY3Rpdml0aWVzKHByb2Nlc3MpOwotCQkJaWYgKGFjdGl2aXRpZXMgIT0gbnVsbCAmJiBhY3Rpdml0aWVzLnNpemUoKSA+IDApIHsKLQkJCQlTdHJpbmdbXSBuYW1lcyA9IG5ldyBTdHJpbmdbYWN0aXZpdGllcy5zaXplKCldOwotCQkJCWFjdGl2aXRpZXMua2V5U2V0KCkudG9BcnJheShuYW1lcyk7Ci0JCQkJYWN0aXZpdHlDb21iby5zZXRJdGVtcyhuYW1lcyk7Ci0JCQkJLy8gU3RyaW5nIHNhdmVkQ29udGV4dCA9IFdvcmtmbG93RXhwUGx1Z2luLmdldERlZmF1bHQoKQotCQkJCS8vIC5nZXRQcmVmZXJlbmNlU3RvcmUoKS5nZXRTdHJpbmcoCi0JCQkJLy8gV29ya2Zsb3dFeHBvcnRDb25zdGFudHMuQUNUSVZJVFlfQ09OVEVYVCk7Ci0JCQkJLy8gaWYgKHNhdmVkQ29udGV4dCAhPSBudWxsICYmCi0JCQkJLy8gY29udGV4dHMuY29udGFpbnNLZXkoc2F2ZWRDb250ZXh0KSkgewotCQkJCS8vIGFjdGl2aXR5Q29tYm8uc2V0VGV4dChzYXZlZENvbnRleHQpOwotCQkJCS8vIH0gZWxzZSB7Ci0JCQkJLy8gU3RyaW5nIGRlZmF1bHRDb250ZXh0ID0gcHJvY2Vzcy5nZXREZWZhdWx0Q29udGV4dCgpCi0JCQkJLy8gLmdldE5hbWUoKTsKLQkJCQkvLyBhY3Rpdml0eUNvbWJvLnNldFRleHQoZGVmYXVsdENvbnRleHQpOwotCQkJCS8vIH0KLQkJCQlhY3Rpdml0eUNvbWJvLnNldFRleHQobmFtZXNbMF0pOwotCQkJfSBlbHNlIHsKLQkJCQlhY3Rpdml0eUNvbWJvLnNldEl0ZW1zKEVNUFRZX0FSUkFZKTsKLQkJCX0KLQkJCQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2VsZWN0ZWQgUHJvY2Vzcy4KLQkgKi8KLQlwdWJsaWMgUHJvY2VzcyBnZXRQcm9jZXNzKCkgewotCQlpZiAoY2FwYWJpbGl0eVBhdHRlcm5SYWRpb0J1dHRvbi5nZXRTZWxlY3Rpb24oKSkgewotCQkJU3RyaW5nIG5hbWUgPSBwcm9jZXNzQ29tYm8uZ2V0VGV4dCgpOwotCQkJcmV0dXJuIChQcm9jZXNzKSBjYXBhYmlsaXR5UGF0dGVybnMuZ2V0KG5hbWUpOwotCQl9IGVsc2UgewotCQkJU3RyaW5nIG5hbWUgPSBwcm9jZXNzQ29tYm8uZ2V0VGV4dCgpOwotCQkJcmV0dXJuIChQcm9jZXNzKSBkZWxpdmVyeVByb2Nlc3Nlcy5nZXQobmFtZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzZWxlY3RlZCBQcm9jZXNzIGNvbnRleHQuCi0JICovCi0vLwlwdWJsaWMgU3RyaW5nIGdldFByb2Nlc3NDb250ZXh0TmFtZSgpIHsKLS8vCQlyZXR1cm4gKFN0cmluZykgY29udGV4dENvbWJvLmdldFRleHQoKTsKLS8vCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHRlbXBsYXRlIG5hbWUuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZW1wbGF0ZU5hbWUoKSB7Ci0JCXJldHVybiB0ZW1wbGF0ZU5hbWVDb21iby5nZXRUZXh0KCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdGFyZ2V0IGRpcmVjdG9yeS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRhcmdldERpcmVjdG9yeSgpIHsKLQkJcmV0dXJuIHRlbXBsYXRlRGlyQ29tYm8uZ2V0VGV4dCgpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2UjaXNDb21wbGV0ZWQoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUGFnZUNvbXBsZXRlKCkgewotCQlpZiAocHJvY2Vzc0NvbWJvLmdldFRleHQoKS50cmltKCkubGVuZ3RoKCkgPiAwCi0vLwkJCQkmJiBjb250ZXh0Q29tYm8uZ2V0VGV4dCgpLnRyaW0oKS5sZW5ndGgoKSA+IDAKLQkJCQkmJiB0ZW1wbGF0ZU5hbWVDb21iby5nZXRUZXh0KCkudHJpbSgpLmxlbmd0aCgpID4gMAotCQkJCSYmIHRlbXBsYXRlRGlyQ29tYm8uZ2V0VGV4dCgpLnRyaW0oKS5sZW5ndGgoKSA+IDAKLQkJCQkmJiBhY3Rpdml0eUNvbWJvLmdldFRleHQoKS50cmltKCkubGVuZ3RoKCkgPiAwKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIEFjdGl2aXR5IGdldEFjdGl2aXR5KCkgewotCQlpZiAoYWN0aXZpdHlDb21iby5nZXRTZWxlY3Rpb25JbmRleCgpICE9IC0xKSB7Ci0JCQlTdHJpbmcgYWN0aXZpdHlOYW1lID0gYWN0aXZpdHlDb21iby5nZXRUZXh0KCk7Ci0JCQlBY3Rpdml0eSBhY3Rpdml0eSA9IChBY3Rpdml0eSkgYWN0aXZpdGllcy5nZXQoYWN0aXZpdHlOYW1lKTsKLQkJCXJldHVybiBhY3Rpdml0eTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLS8vCXB1YmxpYyBNZXRob2RDb25maWd1cmF0aW9uIGdldENvbnRleHQoKSB7Ci0vLwkJaWYgKGdldFByb2Nlc3NDb250ZXh0TmFtZSgpICE9IG51bGwpIHsKLS8vCQkJU3RyaW5nIGNvbnRleHROYW1lID0gZ2V0UHJvY2Vzc0NvbnRleHROYW1lKCk7Ci0vLwkJCU1hcCByZXN1bHQgPSBNaWdyYXRpb25VdGlsLmdldENvbnRleHRzKGdldFByb2Nlc3MoKSk7Ci0vLwkJCXJldHVybiAoTWV0aG9kQ29uZmlndXJhdGlvbikgcmVzdWx0LmdldChjb250ZXh0TmFtZSk7Ci0vLwkJfQotLy8JCXJldHVybiBudWxsOwotLy8JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1pZ3JhdGlvbi5kaWFncmFtL3NyYy9vcmcvZWNsaXBzZS9lcGYvbWlncmF0aW9uL2RpYWdyYW0vYWRkd3BkL21hcC9Db25uZWN0aW9uRmFjdG9yeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1pZ3JhdGlvbi5kaWFncmFtL3NyYy9vcmcvZWNsaXBzZS9lcGYvbWlncmF0aW9uL2RpYWdyYW0vYWRkd3BkL21hcC9Db25uZWN0aW9uRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ODdhMjI1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5taWdyYXRpb24uZGlhZ3JhbS9zcmMvb3JnL2VjbGlwc2UvZXBmL21pZ3JhdGlvbi9kaWFncmFtL2FkZHdwZC9tYXAvQ29ubmVjdGlvbkZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubWlncmF0aW9uLmRpYWdyYW0uYWRkd3BkLm1hcDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkFic29sdXRlQmVuZHBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUHJlY2lzaW9uUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5zZXJ2aWNlcy5EaWFncmFtTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5MaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1pZ3JhdGlvbi5kaWFncmFtLmFkLm1hcC5NYXBVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkJvdW5kczsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5EaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkVkZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uSWRlbnRpdHlBbmNob3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm90YXRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlJlbGF0aXZlQmVuZHBvaW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLmRhdGF0eXBlLlJlbGF0aXZlQmVuZHBvaW50OwotCi0vKioKLSAqIAotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjIKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgQ29ubmVjdGlvbkZhY3RvcnkgewotCi0JcHJpdmF0ZSBIYXNoTWFwIG1hcCA9IG51bGw7Ci0KLQlwcml2YXRlIERpYWdyYW0gZGlhZ3JhbSA9IG51bGw7Ci0KLQlwcml2YXRlIFN0cmluZyBraW5kOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IElNQUdFX0hFSUdIVCA9IDMyOwotCi0JcHVibGljIENvbm5lY3Rpb25GYWN0b3J5KERpYWdyYW0gZGlhZ3JhbSwgSGFzaE1hcCBtYXAsIFN0cmluZyBraW5kKSB7Ci0JCXRoaXMubWFwID0gbWFwOwotCQl0aGlzLmRpYWdyYW0gPSBkaWFncmFtOwotCQl0aGlzLmtpbmQgPSBraW5kOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBvdXRnb2luZyBjb25uZWN0aW9ucwotCSAqIAotCSAqIEBwYXJhbSBub2RlCi0JICovCi0JcHVibGljIHZvaWQgb3V0Z29pbmdDb25uZWN0aW9ucyhOb2RlIG5vZGUpIHsKLQkJTGlzdCBjb25uZWN0aW9ucyA9IG5vZGUuZ2V0T3V0Z29pbmdDb25uZWN0aW9ucygpOwotCi0JCWlmIChjb25uZWN0aW9ucyAhPSBudWxsICYmIGNvbm5lY3Rpb25zLnNpemUoKSA+IDApIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBjb25uZWN0aW9ucy5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJTGluayBsaW5rID0gKExpbmspIGl0ZXJhdG9yLm5leHQoKTsKLQotCQkJCS8vIGNyZWF0ZSBjb25uZWN0aW9uCi0JCQkJRWRnZSBlZGdlID0gY3JlYXRlQ29ubmVjdGlvbihsaW5rKTsKLQotCQkJCS8vIGdldCBzb3VyY2Ugbm9kZQotCQkJCW9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vZGUgc291cmNlTm90YXRpb25Ob2RlID0gKG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vZGUpIG1hcAotCQkJCQkJLmdldChub2RlKTsKLQotCQkJCS8vIGFkZCB0aGUgZWRnZSBhcyBzb3VyY2UgZWRnZQotCQkJCXNvdXJjZU5vdGF0aW9uTm9kZS5nZXRTb3VyY2VFZGdlcygpLmFkZChlZGdlKTsKLQkJCQlzb3VyY2VOb3RhdGlvbk5vZGUuZ2V0RGlhZ3JhbSgpLmluc2VydEVkZ2UoZWRnZSk7Ci0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBpbmNvbWluZyBjb25uZWN0aW9ucwotCSAqIAotCSAqIEBwYXJhbSBub2RlCi0JICovCi0JcHVibGljIHZvaWQgaW5jb21pbmdDb25uZWN0aW9ucyhOb2RlIG5vZGUpIHsKLQkJTGlzdCBjb25uZWN0aW9ucyA9IG5vZGUuZ2V0SW5jb21pbmdDb25uZWN0aW9ucygpOwotCi0JCWlmIChjb25uZWN0aW9ucyAhPSBudWxsICYmIGNvbm5lY3Rpb25zLnNpemUoKSA+IDApIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBjb25uZWN0aW9ucy5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJTGluayBsaW5rID0gKExpbmspIGl0ZXJhdG9yLm5leHQoKTsKLQotCQkJCS8vIGNyZWF0ZSBlZGdlCi0JCQkJRWRnZSBlZGdlID0gY3JlYXRlQ29ubmVjdGlvbihsaW5rKTsKLQotCQkJCS8vIGdldCBzb3VyY2Ugbm9kZQotCQkJCW9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vZGUgc291cmNlTm90YXRpb25Ob2RlID0gKG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vZGUpIG1hcAotCQkJCQkJLmdldChub2RlKTsKLQotCQkJCS8vIGFkZCB0aGUgZWRnZSBhcyB0YXJnZXQgZWRnZQotCQkJCXNvdXJjZU5vdGF0aW9uTm9kZS5nZXRUYXJnZXRFZGdlcygpLmFkZChlZGdlKTsKLQkJCQlzb3VyY2VOb3RhdGlvbk5vZGUuZ2V0RGlhZ3JhbSgpLmluc2VydEVkZ2UoZWRnZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgbm90YXRpb24gZWRnZSBmb3IgdGhlIGdpdmVuIGxpbmsKLQkgKiAKLQkgKiBAcGFyYW0gbGluawotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIEVkZ2UgY3JlYXRlQ29ubmVjdGlvbihMaW5rIGxpbmspIHsKLQkJLy8gZ2V0IHNvdXJjZSBhbmQgdGFyZ2V0IG9iamVjdHMgb2YgdGhlIGxpbmsKLQkJTm9kZSBzb3VyY2VPYmogPSBsaW5rLmdldFNvdXJjZSgpOwotCQlOb2RlIHRhcmdldE9iaiA9IGxpbmsuZ2V0VGFyZ2V0KCk7Ci0KLQkJLy8gZ2V0IG5vdGF0aW9uIG5vZGVzCi0JCW9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vZGUgc291cmNlTm90YXRpb25Ob2RlID0gKG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vZGUpIG1hcAotCQkJCS5nZXQoc291cmNlT2JqKTsKLQkJb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm9kZSB0YXJnZXROb3RhdGlvbk5vZGUgPSAob3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm9kZSkgbWFwCi0JCQkJLmdldCh0YXJnZXRPYmopOwotCi0JCUVkZ2UgZWRnZSA9IGZpbmRFZGdlKHNvdXJjZU5vdGF0aW9uTm9kZSwgdGFyZ2V0Tm90YXRpb25Ob2RlKTsKLQkJaWYgKGVkZ2UgPT0gbnVsbCAmJiB0YXJnZXROb3RhdGlvbk5vZGUgIT0gbnVsbCkgewotCQkJLy8gY3JlYXRlIG5vdGF0aW9uIGVkZ2UKLQkJCWlmIChraW5kID09IERpYWdyYW1NYW5hZ2VyLkFERF9raW5kKQotCQkJCWVkZ2UgPSBNYXBVdGlsLmNyZWF0ZUVkZ2VfV1BEKHNvdXJjZU5vdGF0aW9uTm9kZSwKLQkJCQkJCXRhcmdldE5vdGF0aW9uTm9kZSwgbGluayk7Ci0JCQllbHNlIGlmIChraW5kID09IERpYWdyYW1NYW5hZ2VyLldQRF9raW5kKQotCQkJCWVkZ2UgPSBNYXBVdGlsLmNyZWF0ZUVkZ2VfV1BEKHNvdXJjZU5vdGF0aW9uTm9kZSwKLQkJCQkJCXRhcmdldE5vdGF0aW9uTm9kZSwgbGluayk7Ci0KLQkJCWlmIChlZGdlID09IG51bGwpCi0JCQkJcmV0dXJuIG51bGw7Ci0KLQkJCWVkZ2Uuc2V0RWxlbWVudChsaW5rKTsKLQkJCWxvYWRTb3VyY2VBbmRUYXJnZXRFbmRQb2ludChlZGdlLCBsaW5rKTsKLQkJCWxvYWRCZW5kUG9pbnRzKGVkZ2UsIGxpbmspOwotCQl9Ci0JCXJldHVybiBlZGdlOwotCX0KLQotCS8qKgotCSAqIExvYWRzIHNvdXJjZSBhbmQgdGFyZ2V0IGVuZCBwb2ludHMgZm9yIHN5bmNocm9uaXphdGlvbiBiYXIgYW5kIGRlY2lzaW9uCi0JICogbm9kZQotCSAqIAotCSAqIEBwYXJhbSBlZGdlCi0JICogQHBhcmFtIGZsb3cKLQkgKi8KLQlwcml2YXRlIHZvaWQgbG9hZFNvdXJjZUFuZFRhcmdldEVuZFBvaW50KEVkZ2UgZWRnZSwgTGluayBmbG93KSB7Ci0JCVBvaW50IHNyY1BvaW50ID0gZmxvdy5nZXRTb3VyY2VFbmRQb2ludCgpOwotCQlQb2ludCB0YXJnZXRQb2ludCA9IGZsb3cuZ2V0VGFyZ2V0RW5kUG9pbnQoKTsKLQotCQlWaWV3IHNyY1ZpZXcgPSBlZGdlLmdldFNvdXJjZSgpOwotCQlWaWV3IHRhcmdldFZpZXcgPSBlZGdlLmdldFRhcmdldCgpOwotCi0JCWlmIChzcmNQb2ludCAhPSBudWxsCi0JCQkJJiYgc3JjVmlldyBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vZGUpIHsKLQkJCUJvdW5kcyBib3VuZHMgPSAoQm91bmRzKSAoKG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vZGUpIHNyY1ZpZXcpCi0JCQkJCS5nZXRMYXlvdXRDb25zdHJhaW50KCk7Ci0JCQkvLyBmb3IgV1BELCBoZWlnaHQgaXMgbm90IHN0b3JlZCBhbmQgaXQncyBhbHdheXMgc2FtZS4KLQkJCS8vIFdlIGRvIG5lZWQgY29ycmVjdCBoZWlnaHQgdG8gY2FsY3VsYXRlIGlkZW50aXR5IGFuY2hvciBpbiBHTUYKLQkJCWlmIChib3VuZHMuZ2V0SGVpZ2h0KCkgPT0gLTEpCi0JCQkJYm91bmRzLnNldEhlaWdodCg0MCk7Ci0JCQlJZGVudGl0eUFuY2hvciBhbmNob3IgPSBjcmVhdGVJZGVudGl0eUFuY2hvcihzcmNQb2ludCwgYm91bmRzKTsKLQkJCWlmIChhbmNob3IgIT0gbnVsbCkKLQkJCQllZGdlLnNldFNvdXJjZUFuY2hvcihhbmNob3IpOwotCQl9Ci0KLQkJaWYgKHRhcmdldFBvaW50ICE9IG51bGwKLQkJCQkmJiB0YXJnZXRWaWV3IGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm9kZSkgewotCQkJQm91bmRzIGJvdW5kcyA9IChCb3VuZHMpICgob3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm9kZSkgdGFyZ2V0VmlldykKLQkJCQkJLmdldExheW91dENvbnN0cmFpbnQoKTsKLQkJCS8vIEZvciBXUEQsIGhlaWdodCBpcyBub3Qgc3RvcmVkIGFuZCBpdCdzIGFsd2F5cyBzYW1lLgotCQkJLy8gV2UgZG8gbmVlZCBjb3JyZWN0IGhlaWdodCB0byBjYWxjdWxhdGUgaWRlbnRpdHkgYW5jaG9yIGluIEdNRgotCQkJaWYgKGJvdW5kcy5nZXRIZWlnaHQoKSA9PSAtMSkKLQkJCQlib3VuZHMuc2V0SGVpZ2h0KDQwKTsKLQkJCUlkZW50aXR5QW5jaG9yIGFuY2hvciA9IGNyZWF0ZUlkZW50aXR5QW5jaG9yKHRhcmdldFBvaW50LCBib3VuZHMpOwotCQkJaWYgKGFuY2hvciAhPSBudWxsKQotCQkJCWVkZ2Uuc2V0VGFyZ2V0QW5jaG9yKGFuY2hvcik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgaWRlbnRpdHkgYW5jaG9yCi0JICogCi0JICogQHBhcmFtIHBvaW50Ci0JICogQHBhcmFtIGJvdW5kcwotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIElkZW50aXR5QW5jaG9yIGNyZWF0ZUlkZW50aXR5QW5jaG9yKFBvaW50IHBvaW50LCBCb3VuZHMgYm91bmRzKSB7Ci0JCVByZWNpc2lvblBvaW50IHByZVBvaW50ID0gTWFwVXRpbC5nZXRBbmNob3JSZWxhdGl2ZUxvY2F0aW9uKHBvaW50LAotCQkJCWJvdW5kcyk7Ci0JCVN0cmluZyBpZCA9IE1hcFV0aWwuY29tcG9zZVRlcm1pbmFsU3RyaW5nKHByZVBvaW50KTsKLQotCQlJZGVudGl0eUFuY2hvciB2YWx1ZSA9IE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlSWRlbnRpdHlBbmNob3IoKTsKLQkJdmFsdWUuc2V0SWQoaWQpOwotCi0JCXJldHVybiB2YWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiBMb2FkIHJlbGF0aXZlIGJlbmQgcG9pbnRzCi0JICogCi0JICogQHBhcmFtIGVkZ2UKLQkgKiBAcGFyYW0gZmxvdwotCSAqLwotCXByaXZhdGUgdm9pZCBsb2FkQmVuZFBvaW50cyhFZGdlIGVkZ2UsIExpbmsgZmxvdykgewotCQlMaXN0IGxpc3QgPSBmbG93LmdldEJlbmRwb2ludHMoKTsKLQkJTGlzdDxSZWxhdGl2ZUJlbmRwb2ludD4gcmVsYXRpdmVQb2ludHMgPSBuZXcgQXJyYXlMaXN0PFJlbGF0aXZlQmVuZHBvaW50PigpOwotCi0JCVJlbGF0aXZlQmVuZHBvaW50IHJicCA9IG5ldyBSZWxhdGl2ZUJlbmRwb2ludCgwLCAwLCAwLCAwKTsKLQotCQlyZWxhdGl2ZVBvaW50cy5hZGQocmJwKTsKLQkJaWYgKGxpc3QgIT0gbnVsbCAmJiBsaXN0LnNpemUoKSA+IDApIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBsaXN0Lml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCQlBYnNvbHV0ZUJlbmRwb2ludCBhYnAgPSAoQWJzb2x1dGVCZW5kcG9pbnQpIGl0ZXJhdG9yLm5leHQoKTsKLQotCQkJCW9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vZGUgc3JjTm9kZSA9IChvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob2RlKSBlZGdlCi0JCQkJCQkuZ2V0U291cmNlKCk7Ci0JCQkJb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm9kZSB0YXJnZXROb2RlID0gKG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vZGUpIGVkZ2UKLQkJCQkJCS5nZXRUYXJnZXQoKTsKLQotCQkJCUJvdW5kcyBzb3VyY2VCb3VuZHMgPSAoQm91bmRzKSBzcmNOb2RlLmdldExheW91dENvbnN0cmFpbnQoKTsKLQkJCQlCb3VuZHMgdGFyZ2V0Qm91bmRzID0gKEJvdW5kcykgdGFyZ2V0Tm9kZS5nZXRMYXlvdXRDb25zdHJhaW50KCk7Ci0KLQkJCQlpbnQgc3JjTGluZSA9IE1hcFV0aWwuZ2V0Tm9PZkxpbmVzKHNyY05vZGUpOwotCQkJCWludCB0YXJnZXRMaW5lID0gTWFwVXRpbC5nZXROb09mTGluZXModGFyZ2V0Tm9kZSk7Ci0JCQkJaW50IHNyY0hlaWdodCA9IE1hcFV0aWwuZ2V0VGV4dEhlaWdodChzcmNOb2RlKTsKLQkJCQlpbnQgdGFyZ2V0SGVpZ2h0ID0gTWFwVXRpbC5nZXRUZXh0SGVpZ2h0KHRhcmdldE5vZGUpOwotCi0JCQkJaW50IHNyY1ggPSBzb3VyY2VCb3VuZHMuZ2V0WCgpICsgc291cmNlQm91bmRzLmdldFdpZHRoKCkgLyAyOwotCQkJCWludCBzcmNZID0gc291cmNlQm91bmRzLmdldFkoKQotCQkJCQkJKyAoSU1BR0VfSEVJR0hUICsgKHNyY0xpbmUgKiBzcmNIZWlnaHQpKSAvIDI7Ci0JCQkJaW50IHRhclggPSB0YXJnZXRCb3VuZHMuZ2V0WCgpICsgdGFyZ2V0Qm91bmRzLmdldFdpZHRoKCkgLyAyOwotCQkJCWludCB0YXJZID0gdGFyZ2V0Qm91bmRzLmdldFkoKQotCQkJCQkJKyAoSU1BR0VfSEVJR0hUICsgKHRhcmdldExpbmUgKiB0YXJnZXRIZWlnaHQpKSAvIDI7Ci0KLQkJCQlpbnQgcmVsMSA9IGFicC54IC0gc3JjWDsKLQkJCQlpbnQgcmVsMiA9IGFicC55IC0gc3JjWTsKLQkJCQlpbnQgcmVsMyA9IGFicC54IC0gdGFyWDsKLQkJCQlpbnQgcmVsNCA9IGFicC55IC0gdGFyWTsKLQotCQkJCVJlbGF0aXZlQmVuZHBvaW50IHJicDEgPSBuZXcgUmVsYXRpdmVCZW5kcG9pbnQocmVsMSwgcmVsMiwKLQkJCQkJCXJlbDMsIHJlbDQpOwotCQkJCXJlbGF0aXZlUG9pbnRzLmFkZChyYnAxKTsKLQkJCX0KLQkJfQotCQlyZWxhdGl2ZVBvaW50cy5hZGQocmJwKTsKLQotCQlpZiAocmVsYXRpdmVQb2ludHMuc2l6ZSgpID4gMCkgewotCQkJUmVsYXRpdmVCZW5kcG9pbnRzIGJlbmRwb2ludHMgPSBOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJCS5jcmVhdGVSZWxhdGl2ZUJlbmRwb2ludHMoKTsKLQkJCWJlbmRwb2ludHMuc2V0UG9pbnRzKHJlbGF0aXZlUG9pbnRzKTsKLQkJCWVkZ2Uuc2V0QmVuZHBvaW50cyhiZW5kcG9pbnRzKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEZpbmQgZWRnZSBpbiBkaWFncmFtIGdpdmVuIHNvdXJjZSBhbmQgdGFyZ2V0IG5vZGVzCi0JICogCi0JICogQHBhcmFtIHNvdXJjZU5vZGUKLQkgKiBAcGFyYW0gdGFyZ2V0Tm9kZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIEVkZ2UgZmluZEVkZ2Uob3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm9kZSBzb3VyY2VOb2RlLAotCQkJb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm9kZSB0YXJnZXROb2RlKSB7Ci0JCUxpc3QgbGlzdCA9IGRpYWdyYW0uZ2V0RWRnZXMoKTsKLQkJaWYgKGxpc3QgIT0gbnVsbCAmJiBsaXN0LnNpemUoKSA+IDApIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBsaXN0Lml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCQlFZGdlIGVkZ2UgPSAoRWRnZSkgaXRlcmF0b3IubmV4dCgpOwotCQkJCWlmICgoZWRnZS5nZXRUYXJnZXQoKSAhPSBudWxsKQotCQkJCQkJJiYgdGFyZ2V0Tm9kZS5lcXVhbHMoZWRnZS5nZXRUYXJnZXQoKSkKLQkJCQkJCSYmIChlZGdlLmdldFNvdXJjZSgpICE9IG51bGwpCi0JCQkJCQkmJiBzb3VyY2VOb2RlLmVxdWFscyhlZGdlLmdldFNvdXJjZSgpKSkgewotCQkJCQlyZXR1cm4gZWRnZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubWlncmF0aW9uLmRpYWdyYW0vc3JjL29yZy9lY2xpcHNlL2VwZi9taWdyYXRpb24vZGlhZ3JhbS91dGlsL01pZ3JhdGlvblV0aWwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5taWdyYXRpb24uZGlhZ3JhbS9zcmMvb3JnL2VjbGlwc2UvZXBmL21pZ3JhdGlvbi9kaWFncmFtL3V0aWwvTWlncmF0aW9uVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOGUyZDcwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5taWdyYXRpb24uZGlhZ3JhbS9zcmMvb3JnL2VjbGlwc2UvZXBmL21pZ3JhdGlvbi9kaWFncmFtL3V0aWwvTWlncmF0aW9uVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQ0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5taWdyYXRpb24uZGlhZ3JhbS51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRIYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlRyZWVNYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLlByb2Nlc3NDb25maWd1cmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLk1vZGVsU3RydWN0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuTGlicmFyeVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNhcGFiaWxpdHlQYXR0ZXJuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcnlQcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLQotLyoqCi0gKiBIZWxwZXIgdXRpbGl0aWVzIGZvciB0aGUgTWlncmF0aW9uIFNlcnZpY2UuCi0gKgotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTWlncmF0aW9uVXRpbCB7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbWFwIG9mIGFsbCB0aGUgPGNvZGU+Q2FwYWJpbGl0eVBhdHRlcm48L2NvZGU+IGFuZCA8Y29kZT5EZWxpdmVyeVByb2Nlc3M8L2NvZGU+Ci0JICogaW4gdGhlIGN1cnJlbnQgTWV0aG9kIExpYnJhcnkuCi0JICoKLQkgKiBUT0RPOiBNb3ZlIHRoaXMgbWV0aG9kIHRvIHRoZSBjb20uaWJtLnJtbS5saWJyYXJ5LnNlcnZpY2VzLkxpYnJhcnlVdGlsIGNsYXNzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTWFwIGdldFByb2Nlc3NlcygpIHsKLQkJTWV0aG9kTGlicmFyeSBsaWJyYXJ5ID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKQotCQkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKTsKLQkJaWYgKGxpYnJhcnkgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlNYXAgcmVzdWx0ID0gbmV3IFRyZWVNYXAoKTsKLQkJTGlzdCBtZXRob2RQbHVnaW5zID0gTGlicmFyeVV0aWwuZ2V0TWV0aG9kUGx1Z2lucyhsaWJyYXJ5KTsKLQkJZm9yIChJdGVyYXRvciBpID0gbWV0aG9kUGx1Z2lucy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKSB7Ci0JCQlNZXRob2RQbHVnaW4gbWV0aG9kUGx1Z2luID0gKE1ldGhvZFBsdWdpbilpLm5leHQoKTsKLQkJCVN0cmluZyBjYXBhYmlsaXR5UGF0dGVyblBhdGhzW10gPSBNb2RlbFN0cnVjdHVyZS5ERUZBVUxULmNhcGFiaWxpdHlQYXR0ZXJuUGF0aDsKLQkJCU1ldGhvZFBhY2thZ2UgbWV0aG9kUGFja2FnZSAgPSBVbWFVdGlsLmZpbmRNZXRob2RQYWNrYWdlKG1ldGhvZFBsdWdpbiwgY2FwYWJpbGl0eVBhdHRlcm5QYXRocyk7Ci0JCQlpZiAobWV0aG9kUGFja2FnZSBpbnN0YW5jZW9mIFByb2Nlc3NQYWNrYWdlKSB7Ci0JCQkJaWYgKG1ldGhvZFBhY2thZ2UgaW5zdGFuY2VvZiBQcm9jZXNzUGFja2FnZSkgewotCQkJCQlnZXRDYXBhYmlsaXR5UGF0dGVybnMoKFByb2Nlc3NQYWNrYWdlKW1ldGhvZFBhY2thZ2UsIHJlc3VsdCk7Ci0JCQkJfQotCQkJfQotCQkJU3RyaW5nIGRlbGl2ZXJ5UHJvY2Vzc1BhdGhzW10gPSBNb2RlbFN0cnVjdHVyZS5ERUZBVUxULmRlbGl2ZXJ5UHJvY2Vzc1BhdGg7Ci0JCQltZXRob2RQYWNrYWdlID0gVW1hVXRpbC5maW5kTWV0aG9kUGFja2FnZShtZXRob2RQbHVnaW4sIGRlbGl2ZXJ5UHJvY2Vzc1BhdGhzKTsKLQkJCWlmIChtZXRob2RQYWNrYWdlIGluc3RhbmNlb2YgUHJvY2Vzc1BhY2thZ2UpIHsKLQkJCQlpZiAobWV0aG9kUGFja2FnZSBpbnN0YW5jZW9mIFByb2Nlc3NQYWNrYWdlKSB7Ci0JCQkJCWdldERlbGl2ZXJ5UHJvY2Vzc2VzKChQcm9jZXNzUGFja2FnZSltZXRob2RQYWNrYWdlLCByZXN1bHQpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSBtYXAgb2YgYWxsIDxjb2RlPkNhcGFiaWxpdHlQYXR0ZXJuPC9jb2RlPiBpbiB0aGUgY3VycmVudCBNZXRob2QgTGlicmFyeS4KLQkgKgotCSAqIFRPRE86IE1vdmUgdGhpcyBtZXRob2QgdG8gdGhlIGNvbS5pYm0ucm1tLmxpYnJhcnkuc2VydmljZXMuTGlicmFyeVV0aWwgY2xhc3MuCi0JICovCi0JcHVibGljIHN0YXRpYyBNYXAgZ2V0Q2FwYWJpbGl0eVBhdHRlcm5zKCkgewotCQlNZXRob2RMaWJyYXJ5IGxpYnJhcnkgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpOwotCQlpZiAobGlicmFyeSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCU1hcCByZXN1bHQgPSBuZXcgVHJlZU1hcCgpOwotCQlMaXN0IG1ldGhvZFBsdWdpbnMgPSBMaWJyYXJ5VXRpbC5nZXRNZXRob2RQbHVnaW5zKGxpYnJhcnkpOwotCQlmb3IgKEl0ZXJhdG9yIGkgPSBtZXRob2RQbHVnaW5zLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApIHsKLQkJCU1ldGhvZFBsdWdpbiBtZXRob2RQbHVnaW4gPSAoTWV0aG9kUGx1Z2luKWkubmV4dCgpOwotCQkJU3RyaW5nIGNhcGFiaWxpdHlQYXR0ZXJuUGF0aHNbXSA9IE1vZGVsU3RydWN0dXJlLkRFRkFVTFQuY2FwYWJpbGl0eVBhdHRlcm5QYXRoOwotCQkJTWV0aG9kUGFja2FnZSBtZXRob2RQYWNrYWdlICA9IFVtYVV0aWwuZmluZE1ldGhvZFBhY2thZ2UobWV0aG9kUGx1Z2luLCBjYXBhYmlsaXR5UGF0dGVyblBhdGhzKTsKLQkJCWlmIChtZXRob2RQYWNrYWdlIGluc3RhbmNlb2YgUHJvY2Vzc1BhY2thZ2UpIHsKLQkJCQlnZXRDYXBhYmlsaXR5UGF0dGVybnMoKFByb2Nlc3NQYWNrYWdlKW1ldGhvZFBhY2thZ2UsIHJlc3VsdCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbWFwIG9mIGFsbCB0aGUgPGNvZGU+RGVsaXZlcnlQcm9jZXNzPC9jb2RlPiBpbiB0aGUgY3VycmVudCBNZXRob2QgTGlicmFyeS4KLQkgKgotCSAqIFRPRE86IE1vdmUgdGhpcyBtZXRob2QgdG8gdGhlIGNvbS5pYm0ucm1tLmxpYnJhcnkuc2VydmljZXMuTGlicmFyeVV0aWwgY2xhc3MuCi0JICovCi0JcHVibGljIHN0YXRpYyBNYXAgZ2V0RGVsaXZlcnlQcm9jZXNzZXMoKSB7Ci0JCU1ldGhvZExpYnJhcnkgbGlicmFyeSA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLQkJLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCk7Ci0JCWlmIChsaWJyYXJ5ID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJTWFwIHJlc3VsdCA9IG5ldyBUcmVlTWFwKCk7Ci0JCUxpc3QgbWV0aG9kUGx1Z2lucyA9IExpYnJhcnlVdGlsLmdldE1ldGhvZFBsdWdpbnMobGlicmFyeSk7Ci0JCWZvciAoSXRlcmF0b3IgaSA9IG1ldGhvZFBsdWdpbnMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkgewotCQkJTWV0aG9kUGx1Z2luIG1ldGhvZFBsdWdpbiA9IChNZXRob2RQbHVnaW4paS5uZXh0KCk7Ci0JCQlTdHJpbmcgZGVsaXZlcnlQcm9jZXNzUGF0aHNbXSA9IE1vZGVsU3RydWN0dXJlLkRFRkFVTFQuZGVsaXZlcnlQcm9jZXNzUGF0aDsKLQkJCU1ldGhvZFBhY2thZ2UgbWV0aG9kUGFja2FnZSA9IFVtYVV0aWwuZmluZE1ldGhvZFBhY2thZ2UobWV0aG9kUGx1Z2luLCBkZWxpdmVyeVByb2Nlc3NQYXRocyk7Ci0JCQlpZiAobWV0aG9kUGFja2FnZSBpbnN0YW5jZW9mIFByb2Nlc3NQYWNrYWdlKSB7Ci0JCQkJZ2V0RGVsaXZlcnlQcm9jZXNzZXMoKFByb2Nlc3NQYWNrYWdlKW1ldGhvZFBhY2thZ2UsIHJlc3VsdCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbWFwIG9mIGFsbCB0aGUgY29udGV4dHMgYXNzb2NpYXRlZCB3aXRoIGEgcHJvY2Vzcy4KLQkgKgotCSAqIFRPRE86IE1vdmUgdGhpcyBtZXRob2QgdG8gdGhlIGNvbS5pYm0ucm1tLmxpYnJhcnkuc2VydmljZXMuTGlicmFyeVV0aWwgY2xhc3MuCi0JICovCi0JcHVibGljIHN0YXRpYyBNYXAgZ2V0Q29udGV4dHMoUHJvY2VzcyBwcm9jZXNzKSB7Ci0JCWlmIChwcm9jZXNzID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJTWV0aG9kTGlicmFyeSBsaWJyYXJ5ID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKQotCQkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKTsKLQkJaWYgKGxpYnJhcnkgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlNYXAgcmVzdWx0ID0gbmV3IFRyZWVNYXAoKTsKLQkJTWV0aG9kQ29uZmlndXJhdGlvbiBkZWZhdWx0Q29udGV4dCA9IHByb2Nlc3MuZ2V0RGVmYXVsdENvbnRleHQoKTsKLQkJaWYgKGRlZmF1bHRDb250ZXh0ICE9IG51bGwpIHsKLQkJCXJlc3VsdC5wdXQoZGVmYXVsdENvbnRleHQuZ2V0TmFtZSgpLCBkZWZhdWx0Q29udGV4dCk7Ci0JCX0KLQotCQlMaXN0IGNvbnRleHRzID0gcHJvY2Vzcy5nZXRWYWxpZENvbnRleHQoKTsKLQkJZm9yIChJdGVyYXRvciBpID0gY29udGV4dHMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkgewotCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb250ZXh0ID0gKE1ldGhvZENvbmZpZ3VyYXRpb24paS5uZXh0KCk7Ci0JCQlpZiAoY29udGV4dCAhPSBudWxsKSB7Ci0JCQkJcmVzdWx0LnB1dChjb250ZXh0LmdldE5hbWUoKSwgY29udGV4dCk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIEFkZCBhIG1hcCBvZiBhbGwgPGNvZGU+Q2FwYWJpbGl0eVBhdHRlcm48L2NvZGU+IGluIGEgZ2l2ZW4gPGNvZGU+UHJvY2Vzc1BhY2thZ2U8L2NvZGU+LgotCSAqCi0JICogVE9ETzogTW92ZSB0aGlzIG1ldGhvZCB0byB0aGUgY29tLmlibS5ybW0ubGlicmFyeS5zZXJ2aWNlcy5MaWJyYXJ5VXRpbCBjbGFzcy4KLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIHZvaWQgZ2V0Q2FwYWJpbGl0eVBhdHRlcm5zKFByb2Nlc3NQYWNrYWdlIHByb2Nlc3NQYWNrYWdlLCBNYXAgcmVzdWx0KSB7Ci0JCUxpc3QgY2hpbGRQYWNrYWdlcyA9IHByb2Nlc3NQYWNrYWdlLmdldENoaWxkUGFja2FnZXMoKTsKLQkJZm9yIChJdGVyYXRvciBpID0gY2hpbGRQYWNrYWdlcy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKSB7Ci0JCQlPYmplY3Qgb2JqID0gaS5uZXh0KCk7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkgewotCQkJCVByb2Nlc3NDb21wb25lbnQgcHJvY2Vzc0NvbXBvbmVudCA9IChQcm9jZXNzQ29tcG9uZW50KW9iajsKLQkJCQlQcm9jZXNzIHByb2Nlc3MgID0gcHJvY2Vzc0NvbXBvbmVudC5nZXRQcm9jZXNzKCk7Ci0JCQkJaWYgKHByb2Nlc3MgaW5zdGFuY2VvZiBDYXBhYmlsaXR5UGF0dGVybikgewotCQkJCQlTdHJpbmcgbmFtZSA9IHByb2Nlc3MuZ2V0TmFtZSgpOwotCQkJCQlyZXN1bHQucHV0KG5hbWUsIHByb2Nlc3MpOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIFByb2Nlc3NQYWNrYWdlKSB7Ci0JCQkJZ2V0Q2FwYWJpbGl0eVBhdHRlcm5zKChQcm9jZXNzUGFja2FnZSlvYmosIHJlc3VsdCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBZGQgYSBtYXAgb2YgYWxsIDxjb2RlPkRlbGl2ZXJ5UHJvY2VzczwvY29kZT4gaW4gYSBnaXZlbiA8Y29kZT5Qcm9jZXNzUGFja2FnZTwvY29kZT4uCi0JICoKLQkgKiBUT0RPOiBNb3ZlIHRoaXMgbWV0aG9kIHRvIHRoZSBjb20uaWJtLnJtbS5saWJyYXJ5LnNlcnZpY2VzLkxpYnJhcnlVdGlsIGNsYXNzLgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgdm9pZCBnZXREZWxpdmVyeVByb2Nlc3NlcyhQcm9jZXNzUGFja2FnZSBwcm9jZXNzUGFja2FnZSwgTWFwIHJlc3VsdCkgewotCQlMaXN0IGNoaWxkUGFja2FnZXMgPSBwcm9jZXNzUGFja2FnZS5nZXRDaGlsZFBhY2thZ2VzKCk7Ci0JCWZvciAoSXRlcmF0b3IgaSA9IGNoaWxkUGFja2FnZXMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkgewotCQkJT2JqZWN0IG9iaiA9IGkubmV4dCgpOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpIHsKLQkJCQlQcm9jZXNzQ29tcG9uZW50IHByb2Nlc3NDb21wb25lbnQgPSAoUHJvY2Vzc0NvbXBvbmVudClvYmo7Ci0JCQkJUHJvY2VzcyBwcm9jZXNzICA9IHByb2Nlc3NDb21wb25lbnQuZ2V0UHJvY2VzcygpOwotCQkJCWlmIChwcm9jZXNzIGluc3RhbmNlb2YgRGVsaXZlcnlQcm9jZXNzKSB7Ci0JCQkJCVN0cmluZyBuYW1lID0gcHJvY2Vzcy5nZXROYW1lKCk7Ci0JCQkJCXJlc3VsdC5wdXQobmFtZSwgcHJvY2Vzcyk7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgUHJvY2Vzc1BhY2thZ2UpIHsKLQkJCQlnZXREZWxpdmVyeVByb2Nlc3NlcygoUHJvY2Vzc1BhY2thZ2Upb2JqLCByZXN1bHQpOwotCQkJfQotCQl9Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgTWFwIGdldEFjdGl2aXRpZXMoUHJvY2VzcyBwcm9jZXNzKXsKLQkJcmV0dXJuIGdldEFjdGl2aXRpZXMocHJvY2VzcywgZmFsc2UpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIE1hcCBnZXRBY3Rpdml0aWVzKFByb2Nlc3MgcHJvY2VzcywgYm9vbGVhbiBsaW5rZWRIYXNoTWFwKXsKLQkJTWFwIHJlc3VsdCA9IGxpbmtlZEhhc2hNYXAgPyBuZXcgTGlua2VkSGFzaE1hcCgpIDogbmV3IFRyZWVNYXAoKTsKLQkJTWV0aG9kQ29uZmlndXJhdGlvbiBkZWZhdWx0Q29udGV4dCA9IHByb2Nlc3MuZ2V0RGVmYXVsdENvbnRleHQoKTsKLQkJUHJvY2Vzc0NvbmZpZ3VyYXRvciBmaWx0ZXIgPSBuZXcgUHJvY2Vzc0NvbmZpZ3VyYXRvcihkZWZhdWx0Q29udGV4dCk7Ci0JCWdldEFjdGl2aXRpZXMocHJvY2VzcywgcmVzdWx0LCBmaWx0ZXIpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkKLQkvKioKLQkgKiBNZXRob2QgcmV0dXJucyBMaXN0IG9mIGFjdGl2aXRpZXMgKHJlY3Vyc2l2ZWx5KSBmb3IgcGFydGljdWxhciBjb25maWd1cmF0aW9uIAotCSAqIHVuZGVyIGEgUHJvY2VzcyAoPGNvZGU+RGVsaXZlcnlQcm9jZXNzPC9jb2RlPiBvciA8Y29kZT5DYXBhYmlsaXR5UGF0dGVybjwvY29kZT4pLiAgCi0JICogIEBwYXJhbSBBY3Rpdml0eQotCSAqICBAcGFyYW0gTWFwCi0JICogIEBwYXJhbSBQcm9jZXNzQ29uZmlndXJhdG9yCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyB2b2lkIGdldEFjdGl2aXRpZXMoQWN0aXZpdHkgcHJvY2VzcywgTWFwIHJlc3VsdCwgUHJvY2Vzc0NvbmZpZ3VyYXRvciBmaWx0ZXIpewotCQlyZXN1bHQucHV0KHByb2Nlc3MuZ2V0TmFtZSgpLCBwcm9jZXNzKTsKLQkJTGlzdCBsaXN0ID0gcHJvY2Vzcy5nZXRCcmVha2Rvd25FbGVtZW50cygpOwotCQlpZihsaXN0LnNpemUoKSA+IDApewotCQkJZm9yKEl0ZXJhdG9yIGl0ZXJhdG9yID0gbGlzdC5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KXsKLQkJCQlPYmplY3Qgb2JqZWN0ID0gaXRlcmF0b3IubmV4dCgpOwotCQkJCWlmKG9iamVjdCBpbnN0YW5jZW9mIEFjdGl2aXR5KXsKLQkJCQkJaWYoZmlsdGVyICE9IG51bGwgJiYgZmlsdGVyLmFjY2VwdChvYmplY3QpKXsKLQkJCQkJCXJlc3VsdC5wdXQoKChBY3Rpdml0eSlvYmplY3QpLmdldE5hbWUoKSwgb2JqZWN0KTsKLQkJCQkJfQotCQkJCQlpZihvYmplY3QgaW5zdGFuY2VvZiBBY3Rpdml0eSl7Ci0JCQkJCQlnZXRBY3Rpdml0aWVzKChBY3Rpdml0eSlvYmplY3QsIHJlc3VsdCwgZmlsdGVyKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC8uY2xhc3NwYXRoIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTFjOGYyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QvLnByb2plY3QgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Ly5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYzlmNzk1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0PC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjFjYzAwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdDsgc2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS41LjAucXVhbGlmaWVyCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LAotIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbCwKLSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LnV0aWwKLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUsCi0gb3JnLmVjbGlwc2UuZW1mLmVjb3JlO3Zpc2liaWxpdHk6PXJlZXhwb3J0LAotIG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWk7dmlzaWJpbGl0eTo9cmVleHBvcnQsCi0gY29tLmlibS5pY3UKLUVjbGlwc2UtTGF6eVN0YXJ0OiB0cnVlCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QvYnVpbGQucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODQ5NGVmZi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLXNvdXJjZS4uID0gc3JjLwotb3V0cHV0Li4gPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSAuLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBtb2RlbC8sXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbAotCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L21vZGVsL01TX1Byb2plY3RfMjAwMy5nZW5tb2RlbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QvbW9kZWwvTVNfUHJvamVjdF8yMDAzLmdlbm1vZGVsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OTQ2ZjJjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QvbW9kZWwvTVNfUHJvamVjdF8yMDAzLmdlbm1vZGVsCisrKyAvZGV2L251bGwKQEAgLTEsNTk4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Z2VubW9kZWw6R2VuTW9kZWwgeG1pOnZlcnNpb249IjIuMCIKLSAgICB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOmVjb3JlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIgotICAgIHhtbG5zOmdlbm1vZGVsPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIiBtb2RlbERpcmVjdG9yeT0iL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjIgotICAgIG1vZGVsUGx1Z2luSUQ9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QiIG1vZGVsTmFtZT0iTVNfUHJvamVjdF8yMDAzIiBpbXBvcnRlcklEPSJvcmcuZWNsaXBzZS54c2QuZWNvcmUuaW1wb3J0ZXIiPgotICA8Zm9yZWlnbk1vZGVsPmZpbGU6L0M6L0VjbGlwc2UzMTEvTVNfUHJvamVjdF8yMDAzLnhzZDwvZm9yZWlnbk1vZGVsPgotICA8Z2VuUGFja2FnZXMgcHJlZml4PSJNc3Byb2plY3QiIGJhc2VQYWNrYWdlPSJvcmcuZWNsaXBzZS5lcGYiIHJlc291cmNlPSJYTUwiIGRpc3Bvc2FibGVQcm92aWRlckZhY3Rvcnk9InRydWUiCi0gICAgICBsb2FkSW5pdGlhbGl6YXRpb249InRydWUiIGVjb3JlUGFja2FnZT0ibXNwcm9qZWN0LmVjb3JlIy8iPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0ibXNwcm9qZWN0LmVjb3JlIy8vQWNjcnVlQXQiLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9Im1zcHJvamVjdC5lY29yZSMvL0FjdGl2ZURpcmVjdG9yeUdVSURUeXBlIi8+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJtc3Byb2plY3QuZWNvcmUjLy9BbGlhc1R5cGUiLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9Im1zcHJvamVjdC5lY29yZSMvL0F1dGhvclR5cGUiLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9Im1zcHJvamVjdC5lY29yZSMvL0Jhc2VsaW5lRm9yRWFybmVkVmFsdWVUeXBlIi8+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJtc3Byb2plY3QuZWNvcmUjLy9Cb29raW5nVHlwZVR5cGUiLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9Im1zcHJvamVjdC5lY29yZSMvL0Jvb2tpbmdUeXBlVHlwZTEiLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9Im1zcHJvamVjdC5lY29yZSMvL0NhbGN1bGF0aW9uVHlwZVR5cGUiLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9Im1zcHJvamVjdC5lY29yZSMvL0NhdGVnb3J5VHlwZSIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0ibXNwcm9qZWN0LmVjb3JlIy8vQ29kZVR5cGUiLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9Im1zcHJvamVjdC5lY29yZSMvL0NvbXBhbnlUeXBlIi8+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJtc3Byb2plY3QuZWNvcmUjLy9Db25zdHJhaW50VHlwZVR5cGUiLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9Im1zcHJvamVjdC5lY29yZSMvL0NvbnRhY3RUeXBlIi8+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJtc3Byb2plY3QuZWNvcmUjLy9Db3N0UmF0ZVRhYmxlVHlwZSIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0ibXNwcm9qZWN0LmVjb3JlIy8vQ3VycmVuY3lTeW1ib2xQb3NpdGlvblR5cGUiLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9Im1zcHJvamVjdC5lY29yZSMvL0N1cnJlbmN5U3ltYm9sVHlwZSIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0ibXNwcm9qZWN0LmVjb3JlIy8vRGF5VHlwZVR5cGUiLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9Im1zcHJvamVjdC5lY29yZSMvL0RlZmF1bHRGaXhlZENvc3RBY2NydWFsVHlwZSIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0ibXNwcm9qZWN0LmVjb3JlIy8vRGVmYXVsdFRhc2tFVk1ldGhvZFR5cGUiLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9Im1zcHJvamVjdC5lY29yZSMvL0RlZmF1bHRUYXNrVHlwZVR5cGUiLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9Im1zcHJvamVjdC5lY29yZSMvL0R1cmF0aW9uRm9ybWF0VHlwZSIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0ibXNwcm9qZWN0LmVjb3JlIy8vRHVyYXRpb25Gb3JtYXRUeXBlMSIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0ibXNwcm9qZWN0LmVjb3JlIy8vRHVyYXRpb25Gb3JtYXRUeXBlMiIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0ibXNwcm9qZWN0LmVjb3JlIy8vRHVyYXRpb25Gb3JtYXRUeXBlMyIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0ibXNwcm9qZWN0LmVjb3JlIy8vRHVyYXRpb25Gb3JtYXRUeXBlNCIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0ibXNwcm9qZWN0LmVjb3JlIy8vRHVyYXRpb25Gb3JtYXRUeXBlNSIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0ibXNwcm9qZWN0LmVjb3JlIy8vRWFybmVkVmFsdWVNZXRob2RUeXBlIi8+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJtc3Byb2plY3QuZWNvcmUjLy9FYXJuZWRWYWx1ZU1ldGhvZFR5cGUxIi8+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJtc3Byb2plY3QuZWNvcmUjLy9FbWFpbEFkZHJlc3NUeXBlIi8+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJtc3Byb2plY3QuZWNvcmUjLy9FeHRlcm5hbFRhc2tQcm9qZWN0VHlwZSIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0ibXNwcm9qZWN0LmVjb3JlIy8vRml4ZWRDb3N0QWNjcnVhbFR5cGUiLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9Im1zcHJvamVjdC5lY29yZSMvL0ZZU3RhcnREYXRlVHlwZSIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0ibXNwcm9qZWN0LmVjb3JlIy8vR3JvdXBUeXBlIi8+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJtc3Byb2plY3QuZWNvcmUjLy9IeXBlcmxpbmtBZGRyZXNzVHlwZSIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0ibXNwcm9qZWN0LmVjb3JlIy8vSHlwZXJsaW5rQWRkcmVzc1R5cGUxIi8+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJtc3Byb2plY3QuZWNvcmUjLy9IeXBlcmxpbmtBZGRyZXNzVHlwZTIiLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9Im1zcHJvamVjdC5lY29yZSMvL0h5cGVybGlua1N1YkFkZHJlc3NUeXBlIi8+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJtc3Byb2plY3QuZWNvcmUjLy9IeXBlcmxpbmtTdWJBZGRyZXNzVHlwZTEiLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9Im1zcHJvamVjdC5lY29yZSMvL0h5cGVybGlua1N1YkFkZHJlc3NUeXBlMiIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0ibXNwcm9qZWN0LmVjb3JlIy8vSHlwZXJsaW5rVHlwZSIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0ibXNwcm9qZWN0LmVjb3JlIy8vSHlwZXJsaW5rVHlwZTEiLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9Im1zcHJvamVjdC5lY29yZSMvL0h5cGVybGlua1R5cGUyIi8+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJtc3Byb2plY3QuZWNvcmUjLy9Jbml0aWFsc1R5cGUiLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9Im1zcHJvamVjdC5lY29yZSMvL0xhZ0Zvcm1hdFR5cGUiLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9Im1zcHJvamVjdC5lY29yZSMvL0xldmVsaW5nRGVsYXlGb3JtYXRUeXBlIi8+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJtc3Byb2plY3QuZWNvcmUjLy9MZXZlbGluZ0RlbGF5Rm9ybWF0VHlwZTEiLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9Im1zcHJvamVjdC5lY29yZSMvL01hbmFnZXJUeXBlIi8+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJtc3Byb2plY3QuZWNvcmUjLy9NYXRlcmlhbExhYmVsVHlwZSIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0ibXNwcm9qZWN0LmVjb3JlIy8vTmFtZVR5cGUiLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9Im1zcHJvamVjdC5lY29yZSMvL05hbWVUeXBlMSIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0ibXNwcm9qZWN0LmVjb3JlIy8vTmFtZVR5cGUyIi8+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJtc3Byb2plY3QuZWNvcmUjLy9OYW1lVHlwZTMiLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9Im1zcHJvamVjdC5lY29yZSMvL05ld1Rhc2tTdGFydERhdGVUeXBlIi8+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJtc3Byb2plY3QuZWNvcmUjLy9OVEFjY291bnRUeXBlIi8+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJtc3Byb2plY3QuZWNvcmUjLy9PdXRsaW5lTnVtYmVyVHlwZSIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0ibXNwcm9qZWN0LmVjb3JlIy8vT3ZlcnRpbWVSYXRlRm9ybWF0VHlwZSIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0ibXNwcm9qZWN0LmVjb3JlIy8vT3ZlcnRpbWVSYXRlRm9ybWF0VHlwZTEiLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9Im1zcHJvamVjdC5lY29yZSMvL1Bob25ldGljQWxpYXNUeXBlIi8+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJtc3Byb2plY3QuZWNvcmUjLy9QaG9uZXRpY3NUeXBlIi8+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJtc3Byb2plY3QuZWNvcmUjLy9QcmVmaXhUeXBlIi8+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJtc3Byb2plY3QuZWNvcmUjLy9SYXRlVGFibGVUeXBlIi8+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJtc3Byb2plY3QuZWNvcmUjLy9Sb2xsdXBUeXBlVHlwZSIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0ibXNwcm9qZWN0LmVjb3JlIy8vU3RhbmRhcmRSYXRlRm9ybWF0VHlwZSIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0ibXNwcm9qZWN0LmVjb3JlIy8vU3RhbmRhcmRSYXRlRm9ybWF0VHlwZTEiLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9Im1zcHJvamVjdC5lY29yZSMvL1N1YmplY3RUeXBlIi8+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJtc3Byb2plY3QuZWNvcmUjLy9TdWJwcm9qZWN0TmFtZVR5cGUiLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9Im1zcHJvamVjdC5lY29yZSMvL1RpdGxlVHlwZSIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0ibXNwcm9qZWN0LmVjb3JlIy8vVHlwZVR5cGUiLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9Im1zcHJvamVjdC5lY29yZSMvL1R5cGVUeXBlMSIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0ibXNwcm9qZWN0LmVjb3JlIy8vVHlwZVR5cGUyIi8+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJtc3Byb2plY3QuZWNvcmUjLy9UeXBlVHlwZTMiLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9Im1zcHJvamVjdC5lY29yZSMvL1R5cGVUeXBlNCIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0ibXNwcm9qZWN0LmVjb3JlIy8vVHlwZVR5cGU1Ii8+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJtc3Byb2plY3QuZWNvcmUjLy9VSURUeXBlIi8+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJtc3Byb2plY3QuZWNvcmUjLy9Vbml0VHlwZSIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0ibXNwcm9qZWN0LmVjb3JlIy8vVmFsdWVsaXN0U29ydE9yZGVyVHlwZSIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0ibXNwcm9qZWN0LmVjb3JlIy8vV2Vla1N0YXJ0RGF5VHlwZSIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0ibXNwcm9qZWN0LmVjb3JlIy8vV29ya0NvbnRvdXJUeXBlIi8+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJtc3Byb2plY3QuZWNvcmUjLy9Xb3JrRm9ybWF0VHlwZSIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0ibXNwcm9qZWN0LmVjb3JlIy8vV29ya0dyb3VwVHlwZSIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Im1zcHJvamVjdC5lY29yZSMvL0Fzc2lnbm1lbnQiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0Fzc2lnbm1lbnQvdUlEIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vQXNzaWdubWVudC90YXNrVUlEIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vQXNzaWdubWVudC9yZXNvdXJjZVVJRCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0Fzc2lnbm1lbnQvcGVyY2VudFdvcmtDb21wbGV0ZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0Fzc2lnbm1lbnQvYWN0dWFsQ29zdCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0Fzc2lnbm1lbnQvYWN0dWFsRmluaXNoIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vQXNzaWdubWVudC9hY3R1YWxPdmVydGltZUNvc3QiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Bc3NpZ25tZW50L2FjdHVhbE92ZXJ0aW1lV29yayIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0Fzc2lnbm1lbnQvYWN0dWFsU3RhcnQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Bc3NpZ25tZW50L2FjdHVhbFdvcmsiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Bc3NpZ25tZW50L2FDV1AiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Bc3NpZ25tZW50L2NvbmZpcm1lZCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0Fzc2lnbm1lbnQvY29zdCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0Fzc2lnbm1lbnQvY29zdFJhdGVUYWJsZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0Fzc2lnbm1lbnQvY29zdFZhcmlhbmNlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vQXNzaWdubWVudC9jViIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0Fzc2lnbm1lbnQvZGVsYXkiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Bc3NpZ25tZW50L2ZpbmlzaCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0Fzc2lnbm1lbnQvZmluaXNoVmFyaWFuY2UiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Bc3NpZ25tZW50L2h5cGVybGluayIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0Fzc2lnbm1lbnQvaHlwZXJsaW5rQWRkcmVzcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0Fzc2lnbm1lbnQvaHlwZXJsaW5rU3ViQWRkcmVzcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0Fzc2lnbm1lbnQvd29ya1ZhcmlhbmNlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vQXNzaWdubWVudC9oYXNGaXhlZFJhdGVVbml0cyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0Fzc2lnbm1lbnQvZml4ZWRNYXRlcmlhbCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0Fzc2lnbm1lbnQvbGV2ZWxpbmdEZWxheSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0Fzc2lnbm1lbnQvbGV2ZWxpbmdEZWxheUZvcm1hdCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0Fzc2lnbm1lbnQvbGlua2VkRmllbGRzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vQXNzaWdubWVudC9taWxlc3RvbmUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Bc3NpZ25tZW50L25vdGVzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vQXNzaWdubWVudC9vdmVyYWxsb2NhdGVkIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vQXNzaWdubWVudC9vdmVydGltZUNvc3QiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Bc3NpZ25tZW50L292ZXJ0aW1lV29yayIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0Fzc2lnbm1lbnQvcmVndWxhcldvcmsiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Bc3NpZ25tZW50L3JlbWFpbmluZ0Nvc3QiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Bc3NpZ25tZW50L3JlbWFpbmluZ092ZXJ0aW1lQ29zdCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0Fzc2lnbm1lbnQvcmVtYWluaW5nT3ZlcnRpbWVXb3JrIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vQXNzaWdubWVudC9yZW1haW5pbmdXb3JrIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vQXNzaWdubWVudC9yZXNwb25zZVBlbmRpbmciLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Bc3NpZ25tZW50L3N0YXJ0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vQXNzaWdubWVudC9zdG9wIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vQXNzaWdubWVudC9yZXN1bWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Bc3NpZ25tZW50L3N0YXJ0VmFyaWFuY2UiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Bc3NpZ25tZW50L3VuaXRzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vQXNzaWdubWVudC91cGRhdGVOZWVkZWQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Bc3NpZ25tZW50L3ZBQyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0Fzc2lnbm1lbnQvd29yayIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0Fzc2lnbm1lbnQvd29ya0NvbnRvdXIiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Bc3NpZ25tZW50L2JDV1MiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Bc3NpZ25tZW50L2JDV1AiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Bc3NpZ25tZW50L2Jvb2tpbmdUeXBlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vQXNzaWdubWVudC9hY3R1YWxXb3JrUHJvdGVjdGVkIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vQXNzaWdubWVudC9hY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Bc3NpZ25tZW50L2NyZWF0aW9uRGF0ZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBtc3Byb2plY3QuZWNvcmUjLy9Bc3NpZ25tZW50L2V4dGVuZGVkQXR0cmlidXRlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG1zcHJvamVjdC5lY29yZSMvL0Fzc2lnbm1lbnQvYmFzZWxpbmUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgbXNwcm9qZWN0LmVjb3JlIy8vQXNzaWdubWVudC90aW1lcGhhc2VkRGF0YSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJtc3Byb2plY3QuZWNvcmUjLy9Bc3NpZ25tZW50cyI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG1zcHJvamVjdC5lY29yZSMvL0Fzc2lnbm1lbnRzL2Fzc2lnbm1lbnQiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ibXNwcm9qZWN0LmVjb3JlIy8vQXZhaWxhYmlsaXR5UGVyaW9kIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9BdmFpbGFiaWxpdHlQZXJpb2QvYXZhaWxhYmxlRnJvbSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0F2YWlsYWJpbGl0eVBlcmlvZC9hdmFpbGFibGVUbyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0F2YWlsYWJpbGl0eVBlcmlvZC9hdmFpbGFibGVVbml0cyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJtc3Byb2plY3QuZWNvcmUjLy9BdmFpbGFiaWxpdHlQZXJpb2RzIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgbXNwcm9qZWN0LmVjb3JlIy8vQXZhaWxhYmlsaXR5UGVyaW9kcy9hdmFpbGFiaWxpdHlQZXJpb2QiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ibXNwcm9qZWN0LmVjb3JlIy8vQmFzZWxpbmUiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBtc3Byb2plY3QuZWNvcmUjLy9CYXNlbGluZS90aW1lcGhhc2VkRGF0YSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0Jhc2VsaW5lL251bWJlciIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0Jhc2VsaW5lL2ludGVyaW0iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9CYXNlbGluZS9zdGFydCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0Jhc2VsaW5lL2ZpbmlzaCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0Jhc2VsaW5lL2R1cmF0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vQmFzZWxpbmUvZHVyYXRpb25Gb3JtYXQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9CYXNlbGluZS9lc3RpbWF0ZWREdXJhdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0Jhc2VsaW5lL3dvcmsiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9CYXNlbGluZS9jb3N0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vQmFzZWxpbmUvYkNXUyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0Jhc2VsaW5lL2JDV1AiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ibXNwcm9qZWN0LmVjb3JlIy8vQmFzZWxpbmUyIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9CYXNlbGluZTIvbnVtYmVyIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vQmFzZWxpbmUyL3dvcmsiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9CYXNlbGluZTIvY29zdCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0Jhc2VsaW5lMi9iQ1dTIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vQmFzZWxpbmUyL2JDV1AiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ibXNwcm9qZWN0LmVjb3JlIy8vQmFzZWxpbmUzIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgbXNwcm9qZWN0LmVjb3JlIy8vQmFzZWxpbmUzL3RpbWVwaGFzZWREYXRhIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vQmFzZWxpbmUzL251bWJlciIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0Jhc2VsaW5lMy9zdGFydCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0Jhc2VsaW5lMy9maW5pc2giLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9CYXNlbGluZTMvd29yayIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0Jhc2VsaW5lMy9jb3N0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vQmFzZWxpbmUzL2JDV1MiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9CYXNlbGluZTMvYkNXUCIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJtc3Byb2plY3QuZWNvcmUjLy9DYWxlbmRhciI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vQ2FsZW5kYXIvdUlEIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vQ2FsZW5kYXIvbmFtZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0NhbGVuZGFyL2lzQmFzZUNhbGVuZGFyIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vQ2FsZW5kYXIvYmFzZUNhbGVuZGFyVUlEIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG1zcHJvamVjdC5lY29yZSMvL0NhbGVuZGFyL3dlZWtEYXlzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Im1zcHJvamVjdC5lY29yZSMvL0NhbGVuZGFycyI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG1zcHJvamVjdC5lY29yZSMvL0NhbGVuZGFycy9jYWxlbmRhciIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJtc3Byb2plY3QuZWNvcmUjLy9Eb2N1bWVudFJvb3QiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Eb2N1bWVudFJvb3QvbWl4ZWQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgbXNwcm9qZWN0LmVjb3JlIy8vRG9jdW1lbnRSb290L3hNTE5TUHJlZml4TWFwIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG1zcHJvamVjdC5lY29yZSMvL0RvY3VtZW50Um9vdC94U0lTY2hlbWFMb2NhdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBtc3Byb2plY3QuZWNvcmUjLy9Eb2N1bWVudFJvb3QvcHJvamVjdCIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJtc3Byb2plY3QuZWNvcmUjLy9FeHRlbmRlZEF0dHJpYnV0ZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vRXh0ZW5kZWRBdHRyaWJ1dGUvZmllbGRJRCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0V4dGVuZGVkQXR0cmlidXRlL2ZpZWxkTmFtZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0V4dGVuZGVkQXR0cmlidXRlL2FsaWFzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vRXh0ZW5kZWRBdHRyaWJ1dGUvcGhvbmV0aWNBbGlhcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0V4dGVuZGVkQXR0cmlidXRlL3JvbGx1cFR5cGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9FeHRlbmRlZEF0dHJpYnV0ZS9jYWxjdWxhdGlvblR5cGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9FeHRlbmRlZEF0dHJpYnV0ZS9mb3JtdWxhIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vRXh0ZW5kZWRBdHRyaWJ1dGUvcmVzdHJpY3RWYWx1ZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9FeHRlbmRlZEF0dHJpYnV0ZS92YWx1ZWxpc3RTb3J0T3JkZXIiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9FeHRlbmRlZEF0dHJpYnV0ZS9hcHBlbmROZXdWYWx1ZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9FeHRlbmRlZEF0dHJpYnV0ZS9kZWZhdWx0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG1zcHJvamVjdC5lY29yZSMvL0V4dGVuZGVkQXR0cmlidXRlL3ZhbHVlTGlzdCIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJtc3Byb2plY3QuZWNvcmUjLy9FeHRlbmRlZEF0dHJpYnV0ZTIiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0V4dGVuZGVkQXR0cmlidXRlMi91SUQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9FeHRlbmRlZEF0dHJpYnV0ZTIvZmllbGRJRCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0V4dGVuZGVkQXR0cmlidXRlMi92YWx1ZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0V4dGVuZGVkQXR0cmlidXRlMi92YWx1ZUlEIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vRXh0ZW5kZWRBdHRyaWJ1dGUyL2R1cmF0aW9uRm9ybWF0Ii8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Im1zcHJvamVjdC5lY29yZSMvL0V4dGVuZGVkQXR0cmlidXRlMyI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vRXh0ZW5kZWRBdHRyaWJ1dGUzL3VJRCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0V4dGVuZGVkQXR0cmlidXRlMy9maWVsZElEIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vRXh0ZW5kZWRBdHRyaWJ1dGUzL3ZhbHVlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vRXh0ZW5kZWRBdHRyaWJ1dGUzL3ZhbHVlSUQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9FeHRlbmRlZEF0dHJpYnV0ZTMvZHVyYXRpb25Gb3JtYXQiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ibXNwcm9qZWN0LmVjb3JlIy8vRXh0ZW5kZWRBdHRyaWJ1dGU0Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9FeHRlbmRlZEF0dHJpYnV0ZTQvdUlEIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vRXh0ZW5kZWRBdHRyaWJ1dGU0L2ZpZWxkSUQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9FeHRlbmRlZEF0dHJpYnV0ZTQvdmFsdWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9FeHRlbmRlZEF0dHJpYnV0ZTQvdmFsdWVJRCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0V4dGVuZGVkQXR0cmlidXRlNC9kdXJhdGlvbkZvcm1hdCIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJtc3Byb2plY3QuZWNvcmUjLy9FeHRlbmRlZEF0dHJpYnV0ZXMiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBtc3Byb2plY3QuZWNvcmUjLy9FeHRlbmRlZEF0dHJpYnV0ZXMvZXh0ZW5kZWRBdHRyaWJ1dGUiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ibXNwcm9qZWN0LmVjb3JlIy8vTWFzayI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vTWFzay9sZXZlbCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL01hc2svdHlwZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL01hc2svbGVuZ3RoIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vTWFzay9zZXBhcmF0b3IiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ibXNwcm9qZWN0LmVjb3JlIy8vTWFza3MiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBtc3Byb2plY3QuZWNvcmUjLy9NYXNrcy9tYXNrIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Im1zcHJvamVjdC5lY29yZSMvL091dGxpbmVDb2RlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9PdXRsaW5lQ29kZS9maWVsZElEIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vT3V0bGluZUNvZGUvZmllbGROYW1lIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vT3V0bGluZUNvZGUvYWxpYXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9PdXRsaW5lQ29kZS9waG9uZXRpY0FsaWFzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG1zcHJvamVjdC5lY29yZSMvL091dGxpbmVDb2RlL3ZhbHVlcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL091dGxpbmVDb2RlL2VudGVycHJpc2UiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9PdXRsaW5lQ29kZS9lbnRlcnByaXNlT3V0bGluZUNvZGVBbGlhcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL091dGxpbmVDb2RlL3Jlc291cmNlU3Vic3RpdHV0aW9uRW5hYmxlZCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL091dGxpbmVDb2RlL2xlYWZPbmx5Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vT3V0bGluZUNvZGUvYWxsTGV2ZWxzUmVxdWlyZWQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9PdXRsaW5lQ29kZS9vbmx5VGFibGVWYWx1ZXNBbGxvd2VkIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG1zcHJvamVjdC5lY29yZSMvL091dGxpbmVDb2RlL21hc2tzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Im1zcHJvamVjdC5lY29yZSMvL091dGxpbmVDb2RlMiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vT3V0bGluZUNvZGUyL3VJRCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL091dGxpbmVDb2RlMi9maWVsZElEIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vT3V0bGluZUNvZGUyL3ZhbHVlSUQiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ibXNwcm9qZWN0LmVjb3JlIy8vT3V0bGluZUNvZGUzIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9PdXRsaW5lQ29kZTMvdUlEIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vT3V0bGluZUNvZGUzL2ZpZWxkSUQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9PdXRsaW5lQ29kZTMvdmFsdWVJRCIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJtc3Byb2plY3QuZWNvcmUjLy9PdXRsaW5lQ29kZXMiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBtc3Byb2plY3QuZWNvcmUjLy9PdXRsaW5lQ29kZXMvb3V0bGluZUNvZGUiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ibXNwcm9qZWN0LmVjb3JlIy8vUHJlZGVjZXNzb3JMaW5rIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9QcmVkZWNlc3NvckxpbmsvcHJlZGVjZXNzb3JVSUQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9QcmVkZWNlc3NvckxpbmsvdHlwZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1ByZWRlY2Vzc29yTGluay9jcm9zc1Byb2plY3QiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9QcmVkZWNlc3NvckxpbmsvY3Jvc3NQcm9qZWN0TmFtZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1ByZWRlY2Vzc29yTGluay9saW5rTGFnIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUHJlZGVjZXNzb3JMaW5rL2xhZ0Zvcm1hdCIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJtc3Byb2plY3QuZWNvcmUjLy9Qcm9qZWN0Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Qcm9qZWN0L3VJRCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Byb2plY3QvbmFtZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Byb2plY3QvdGl0bGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Qcm9qZWN0L3N1YmplY3QiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Qcm9qZWN0L2NhdGVnb3J5Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUHJvamVjdC9jb21wYW55Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUHJvamVjdC9tYW5hZ2VyIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUHJvamVjdC9hdXRob3IiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Qcm9qZWN0L2NyZWF0aW9uRGF0ZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Byb2plY3QvcmV2aXNpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Qcm9qZWN0L2xhc3RTYXZlZCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Byb2plY3Qvc2NoZWR1bGVGcm9tU3RhcnQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Qcm9qZWN0L3N0YXJ0RGF0ZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Byb2plY3QvZmluaXNoRGF0ZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Byb2plY3QvZllTdGFydERhdGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Qcm9qZWN0L2NyaXRpY2FsU2xhY2tMaW1pdCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Byb2plY3QvY3VycmVuY3lEaWdpdHMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Qcm9qZWN0L2N1cnJlbmN5U3ltYm9sIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUHJvamVjdC9jdXJyZW5jeVN5bWJvbFBvc2l0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUHJvamVjdC9jYWxlbmRhclVJRCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Byb2plY3QvZGVmYXVsdFN0YXJ0VGltZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Byb2plY3QvZGVmYXVsdEZpbmlzaFRpbWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Qcm9qZWN0L21pbnV0ZXNQZXJEYXkiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Qcm9qZWN0L21pbnV0ZXNQZXJXZWVrIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUHJvamVjdC9kYXlzUGVyTW9udGgiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Qcm9qZWN0L2RlZmF1bHRUYXNrVHlwZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Byb2plY3QvZGVmYXVsdEZpeGVkQ29zdEFjY3J1YWwiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Qcm9qZWN0L2RlZmF1bHRTdGFuZGFyZFJhdGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Qcm9qZWN0L2RlZmF1bHRPdmVydGltZVJhdGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Qcm9qZWN0L2R1cmF0aW9uRm9ybWF0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUHJvamVjdC93b3JrRm9ybWF0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUHJvamVjdC9lZGl0YWJsZUFjdHVhbENvc3RzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUHJvamVjdC9ob25vckNvbnN0cmFpbnRzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUHJvamVjdC9lYXJuZWRWYWx1ZU1ldGhvZCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Byb2plY3QvaW5zZXJ0ZWRQcm9qZWN0c0xpa2VTdW1tYXJ5Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUHJvamVjdC9tdWx0aXBsZUNyaXRpY2FsUGF0aHMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Qcm9qZWN0L25ld1Rhc2tzRWZmb3J0RHJpdmVuIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUHJvamVjdC9uZXdUYXNrc0VzdGltYXRlZCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Byb2plY3Qvc3BsaXRzSW5Qcm9ncmVzc1Rhc2tzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUHJvamVjdC9zcHJlYWRBY3R1YWxDb3N0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUHJvamVjdC9zcHJlYWRQZXJjZW50Q29tcGxldGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Qcm9qZWN0L3Rhc2tVcGRhdGVzUmVzb3VyY2UiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Qcm9qZWN0L2Zpc2NhbFllYXJTdGFydCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Byb2plY3Qvd2Vla1N0YXJ0RGF5Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUHJvamVjdC9tb3ZlQ29tcGxldGVkRW5kc0JhY2siLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Qcm9qZWN0L21vdmVSZW1haW5pbmdTdGFydHNCYWNrIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUHJvamVjdC9tb3ZlUmVtYWluaW5nU3RhcnRzRm9yd2FyZCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Byb2plY3QvbW92ZUNvbXBsZXRlZEVuZHNGb3J3YXJkIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUHJvamVjdC9iYXNlbGluZUZvckVhcm5lZFZhbHVlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUHJvamVjdC9hdXRvQWRkTmV3UmVzb3VyY2VzQW5kVGFza3MiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Qcm9qZWN0L3N0YXR1c0RhdGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Qcm9qZWN0L2N1cnJlbnREYXRlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUHJvamVjdC9taWNyb3NvZnRQcm9qZWN0U2VydmVyVVJMIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUHJvamVjdC9hdXRvbGluayIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Byb2plY3QvbmV3VGFza1N0YXJ0RGF0ZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Byb2plY3QvZGVmYXVsdFRhc2tFVk1ldGhvZCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Byb2plY3QvcHJvamVjdEV4dGVybmFsbHlFZGl0ZWQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Qcm9qZWN0L2V4dGVuZGVkQ3JlYXRpb25EYXRlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUHJvamVjdC9hY3R1YWxzSW5TeW5jIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUHJvamVjdC9yZW1vdmVGaWxlUHJvcGVydGllcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Byb2plY3QvYWRtaW5Qcm9qZWN0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG1zcHJvamVjdC5lY29yZSMvL1Byb2plY3Qvb3V0bGluZUNvZGVzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG1zcHJvamVjdC5lY29yZSMvL1Byb2plY3Qvd0JTTWFza3MiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgbXNwcm9qZWN0LmVjb3JlIy8vUHJvamVjdC9leHRlbmRlZEF0dHJpYnV0ZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgbXNwcm9qZWN0LmVjb3JlIy8vUHJvamVjdC9jYWxlbmRhcnMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgbXNwcm9qZWN0LmVjb3JlIy8vUHJvamVjdC90YXNrcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBtc3Byb2plY3QuZWNvcmUjLy9Qcm9qZWN0L3Jlc291cmNlcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBtc3Byb2plY3QuZWNvcmUjLy9Qcm9qZWN0L2Fzc2lnbm1lbnRzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Im1zcHJvamVjdC5lY29yZSMvL1JhdGUiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1JhdGUvcmF0ZXNGcm9tIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUmF0ZS9yYXRlc1RvIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUmF0ZS9yYXRlVGFibGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9SYXRlL3N0YW5kYXJkUmF0ZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1JhdGUvc3RhbmRhcmRSYXRlRm9ybWF0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUmF0ZS9vdmVydGltZVJhdGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9SYXRlL292ZXJ0aW1lUmF0ZUZvcm1hdCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1JhdGUvY29zdFBlclVzZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJtc3Byb2plY3QuZWNvcmUjLy9SYXRlcyI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG1zcHJvamVjdC5lY29yZSMvL1JhdGVzL3JhdGUiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ibXNwcm9qZWN0LmVjb3JlIy8vUmVzb3VyY2UiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Jlc291cmNlL3VJRCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Jlc291cmNlL2lEIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUmVzb3VyY2UvbmFtZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Jlc291cmNlL3R5cGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9SZXNvdXJjZS9pc051bGwiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9SZXNvdXJjZS9pbml0aWFscyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Jlc291cmNlL3Bob25ldGljcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Jlc291cmNlL25UQWNjb3VudCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Jlc291cmNlL21hdGVyaWFsTGFiZWwiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9SZXNvdXJjZS9jb2RlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUmVzb3VyY2UvZ3JvdXAiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9SZXNvdXJjZS93b3JrR3JvdXAiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9SZXNvdXJjZS9lbWFpbEFkZHJlc3MiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9SZXNvdXJjZS9oeXBlcmxpbmsiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9SZXNvdXJjZS9oeXBlcmxpbmtBZGRyZXNzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUmVzb3VyY2UvaHlwZXJsaW5rU3ViQWRkcmVzcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Jlc291cmNlL21heFVuaXRzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUmVzb3VyY2UvcGVha1VuaXRzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUmVzb3VyY2Uvb3ZlckFsbG9jYXRlZCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Jlc291cmNlL2F2YWlsYWJsZUZyb20iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9SZXNvdXJjZS9hdmFpbGFibGVUbyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Jlc291cmNlL3N0YXJ0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUmVzb3VyY2UvZmluaXNoIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUmVzb3VyY2UvY2FuTGV2ZWwiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9SZXNvdXJjZS9hY2NydWVBdCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Jlc291cmNlL3dvcmsiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9SZXNvdXJjZS9yZWd1bGFyV29yayIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Jlc291cmNlL292ZXJ0aW1lV29yayIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Jlc291cmNlL2FjdHVhbFdvcmsiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9SZXNvdXJjZS9yZW1haW5pbmdXb3JrIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUmVzb3VyY2UvYWN0dWFsT3ZlcnRpbWVXb3JrIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUmVzb3VyY2UvcmVtYWluaW5nT3ZlcnRpbWVXb3JrIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUmVzb3VyY2UvcGVyY2VudFdvcmtDb21wbGV0ZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Jlc291cmNlL3N0YW5kYXJkUmF0ZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Jlc291cmNlL3N0YW5kYXJkUmF0ZUZvcm1hdCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Jlc291cmNlL2Nvc3QiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9SZXNvdXJjZS9vdmVydGltZVJhdGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9SZXNvdXJjZS9vdmVydGltZVJhdGVGb3JtYXQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9SZXNvdXJjZS9vdmVydGltZUNvc3QiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9SZXNvdXJjZS9jb3N0UGVyVXNlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUmVzb3VyY2UvYWN0dWFsQ29zdCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Jlc291cmNlL2FjdHVhbE92ZXJ0aW1lQ29zdCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Jlc291cmNlL3JlbWFpbmluZ0Nvc3QiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9SZXNvdXJjZS9yZW1haW5pbmdPdmVydGltZUNvc3QiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9SZXNvdXJjZS93b3JrVmFyaWFuY2UiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9SZXNvdXJjZS9jb3N0VmFyaWFuY2UiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9SZXNvdXJjZS9zViIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Jlc291cmNlL2NWIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUmVzb3VyY2UvYUNXUCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Jlc291cmNlL2NhbGVuZGFyVUlEIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUmVzb3VyY2Uvbm90ZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9SZXNvdXJjZS9iQ1dTIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUmVzb3VyY2UvYkNXUCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Jlc291cmNlL2lzR2VuZXJpYyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Jlc291cmNlL2lzSW5hY3RpdmUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9SZXNvdXJjZS9pc0VudGVycHJpc2UiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9SZXNvdXJjZS9ib29raW5nVHlwZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Jlc291cmNlL2FjdHVhbFdvcmtQcm90ZWN0ZWQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9SZXNvdXJjZS9hY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9SZXNvdXJjZS9hY3RpdmVEaXJlY3RvcnlHVUlEIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUmVzb3VyY2UvY3JlYXRpb25EYXRlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG1zcHJvamVjdC5lY29yZSMvL1Jlc291cmNlL2V4dGVuZGVkQXR0cmlidXRlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG1zcHJvamVjdC5lY29yZSMvL1Jlc291cmNlL2Jhc2VsaW5lIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG1zcHJvamVjdC5lY29yZSMvL1Jlc291cmNlL291dGxpbmVDb2RlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG1zcHJvamVjdC5lY29yZSMvL1Jlc291cmNlL2F2YWlsYWJpbGl0eVBlcmlvZHMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgbXNwcm9qZWN0LmVjb3JlIy8vUmVzb3VyY2UvcmF0ZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgbXNwcm9qZWN0LmVjb3JlIy8vUmVzb3VyY2UvdGltZXBoYXNlZERhdGEiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ibXNwcm9qZWN0LmVjb3JlIy8vUmVzb3VyY2VzIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgbXNwcm9qZWN0LmVjb3JlIy8vUmVzb3VyY2VzL3Jlc291cmNlIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Im1zcHJvamVjdC5lY29yZSMvL1Rhc2siPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Rhc2svdUlEIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vVGFzay9pRCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Rhc2svbmFtZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Rhc2svdHlwZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Rhc2svaXNOdWxsIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vVGFzay9jcmVhdGVEYXRlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vVGFzay9jb250YWN0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vVGFzay93QlMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9UYXNrL3dCU0xldmVsIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vVGFzay9vdXRsaW5lTnVtYmVyIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vVGFzay9vdXRsaW5lTGV2ZWwiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9UYXNrL3ByaW9yaXR5Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vVGFzay9zdGFydCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Rhc2svZmluaXNoIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vVGFzay9kdXJhdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Rhc2svZHVyYXRpb25Gb3JtYXQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9UYXNrL3dvcmsiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9UYXNrL3N0b3AiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9UYXNrL3Jlc3VtZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Rhc2svcmVzdW1lVmFsaWQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9UYXNrL2VmZm9ydERyaXZlbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Rhc2svcmVjdXJyaW5nIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vVGFzay9vdmVyQWxsb2NhdGVkIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vVGFzay9lc3RpbWF0ZWQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9UYXNrL21pbGVzdG9uZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Rhc2svc3VtbWFyeSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Rhc2svY3JpdGljYWwiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9UYXNrL2lzU3VicHJvamVjdCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Rhc2svaXNTdWJwcm9qZWN0UmVhZE9ubHkiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9UYXNrL3N1YnByb2plY3ROYW1lIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vVGFzay9leHRlcm5hbFRhc2siLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9UYXNrL2V4dGVybmFsVGFza1Byb2plY3QiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9UYXNrL2Vhcmx5U3RhcnQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9UYXNrL2Vhcmx5RmluaXNoIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vVGFzay9sYXRlU3RhcnQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9UYXNrL2xhdGVGaW5pc2giLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9UYXNrL3N0YXJ0VmFyaWFuY2UiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9UYXNrL2ZpbmlzaFZhcmlhbmNlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vVGFzay93b3JrVmFyaWFuY2UiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9UYXNrL2ZyZWVTbGFjayIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Rhc2svdG90YWxTbGFjayIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Rhc2svZml4ZWRDb3N0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vVGFzay9maXhlZENvc3RBY2NydWFsIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vVGFzay9wZXJjZW50Q29tcGxldGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9UYXNrL3BlcmNlbnRXb3JrQ29tcGxldGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9UYXNrL2Nvc3QiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9UYXNrL292ZXJ0aW1lQ29zdCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Rhc2svb3ZlcnRpbWVXb3JrIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vVGFzay9hY3R1YWxTdGFydCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Rhc2svYWN0dWFsRmluaXNoIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vVGFzay9hY3R1YWxEdXJhdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Rhc2svYWN0dWFsQ29zdCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Rhc2svYWN0dWFsT3ZlcnRpbWVDb3N0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vVGFzay9hY3R1YWxXb3JrIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vVGFzay9hY3R1YWxPdmVydGltZVdvcmsiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9UYXNrL3JlZ3VsYXJXb3JrIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vVGFzay9yZW1haW5pbmdEdXJhdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Rhc2svcmVtYWluaW5nQ29zdCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Rhc2svcmVtYWluaW5nV29yayIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Rhc2svcmVtYWluaW5nT3ZlcnRpbWVDb3N0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vVGFzay9yZW1haW5pbmdPdmVydGltZVdvcmsiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9UYXNrL2FDV1AiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9UYXNrL2NWIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vVGFzay9jb25zdHJhaW50VHlwZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Rhc2svY2FsZW5kYXJVSUQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9UYXNrL2NvbnN0cmFpbnREYXRlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vVGFzay9kZWFkbGluZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Rhc2svbGV2ZWxBc3NpZ25tZW50cyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Rhc2svbGV2ZWxpbmdDYW5TcGxpdCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Rhc2svbGV2ZWxpbmdEZWxheSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Rhc2svbGV2ZWxpbmdEZWxheUZvcm1hdCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Rhc2svcHJlTGV2ZWxlZFN0YXJ0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vVGFzay9wcmVMZXZlbGVkRmluaXNoIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vVGFzay9oeXBlcmxpbmsiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9UYXNrL2h5cGVybGlua0FkZHJlc3MiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9UYXNrL2h5cGVybGlua1N1YkFkZHJlc3MiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9UYXNrL2lnbm9yZVJlc291cmNlQ2FsZW5kYXIiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9UYXNrL25vdGVzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vVGFzay9oaWRlQmFyIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vVGFzay9yb2xsdXAiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9UYXNrL2JDV1MiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9UYXNrL2JDV1AiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9UYXNrL3BoeXNpY2FsUGVyY2VudENvbXBsZXRlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vVGFzay9lYXJuZWRWYWx1ZU1ldGhvZCIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBtc3Byb2plY3QuZWNvcmUjLy9UYXNrL3ByZWRlY2Vzc29yTGluayIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Rhc2svYWN0dWFsV29ya1Byb3RlY3RlZCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Rhc2svYWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG1zcHJvamVjdC5lY29yZSMvL1Rhc2svZXh0ZW5kZWRBdHRyaWJ1dGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgbXNwcm9qZWN0LmVjb3JlIy8vVGFzay9iYXNlbGluZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBtc3Byb2plY3QuZWNvcmUjLy9UYXNrL291dGxpbmVDb2RlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG1zcHJvamVjdC5lY29yZSMvL1Rhc2svdGltZXBoYXNlZERhdGEiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ibXNwcm9qZWN0LmVjb3JlIy8vVGFza3MiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBtc3Byb2plY3QuZWNvcmUjLy9UYXNrcy90YXNrIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Im1zcHJvamVjdC5lY29yZSMvL1RpbWVQZXJpb2QiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1RpbWVQZXJpb2QvZnJvbURhdGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9UaW1lUGVyaW9kL3RvRGF0ZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJtc3Byb2plY3QuZWNvcmUjLy9UaW1lcGhhc2VkRGF0YVR5cGUiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1RpbWVwaGFzZWREYXRhVHlwZS90eXBlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vVGltZXBoYXNlZERhdGFUeXBlL3VJRCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1RpbWVwaGFzZWREYXRhVHlwZS9zdGFydCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1RpbWVwaGFzZWREYXRhVHlwZS9maW5pc2giLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9UaW1lcGhhc2VkRGF0YVR5cGUvdW5pdCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1RpbWVwaGFzZWREYXRhVHlwZS92YWx1ZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJtc3Byb2plY3QuZWNvcmUjLy9WYWx1ZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vVmFsdWUvdmFsdWVJRCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1ZhbHVlL3BhcmVudFZhbHVlSUQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9WYWx1ZS92YWx1ZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1ZhbHVlL2Rlc2NyaXB0aW9uIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Im1zcHJvamVjdC5lY29yZSMvL1ZhbHVlMiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vVmFsdWUyL2lEIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vVmFsdWUyL3ZhbHVlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vVmFsdWUyL2Rlc2NyaXB0aW9uIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Im1zcHJvamVjdC5lY29yZSMvL1ZhbHVlTGlzdCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG1zcHJvamVjdC5lY29yZSMvL1ZhbHVlTGlzdC92YWx1ZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJtc3Byb2plY3QuZWNvcmUjLy9WYWx1ZXMiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9WYWx1ZXMvZ3JvdXAiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgbXNwcm9qZWN0LmVjb3JlIy8vVmFsdWVzL3ZhbHVlIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Im1zcHJvamVjdC5lY29yZSMvL1dCU01hc2siPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1dCU01hc2svbGV2ZWwiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9XQlNNYXNrL3R5cGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9XQlNNYXNrL2xlbmd0aCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1dCU01hc2svc2VwYXJhdG9yIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Im1zcHJvamVjdC5lY29yZSMvL1dCU01hc2tzIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9XQlNNYXNrcy92ZXJpZnlVbmlxdWVDb2RlcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1dCU01hc2tzL2dlbmVyYXRlQ29kZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9XQlNNYXNrcy9wcmVmaXgiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgbXNwcm9qZWN0LmVjb3JlIy8vV0JTTWFza3Mvd0JTTWFzayIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJtc3Byb2plY3QuZWNvcmUjLy9XZWVrRGF5Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9XZWVrRGF5L2RheVR5cGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9XZWVrRGF5L2RheVdvcmtpbmciLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgbXNwcm9qZWN0LmVjb3JlIy8vV2Vla0RheS90aW1lUGVyaW9kIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG1zcHJvamVjdC5lY29yZSMvL1dlZWtEYXkvd29ya2luZ1RpbWVzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Im1zcHJvamVjdC5lY29yZSMvL1dlZWtEYXlzIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgbXNwcm9qZWN0LmVjb3JlIy8vV2Vla0RheXMvd2Vla0RheSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJtc3Byb2plY3QuZWNvcmUjLy9Xb3JraW5nVGltZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vV29ya2luZ1RpbWUvZnJvbVRpbWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Xb3JraW5nVGltZS90b1RpbWUiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ibXNwcm9qZWN0LmVjb3JlIy8vV29ya2luZ1RpbWVzIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgbXNwcm9qZWN0LmVjb3JlIy8vV29ya2luZ1RpbWVzL3dvcmtpbmdUaW1lIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICA8L2dlblBhY2thZ2VzPgotPC9nZW5tb2RlbDpHZW5Nb2RlbD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QvbW9kZWwvbXNwcm9qZWN0LmVjb3JlIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9tb2RlbC9tc3Byb2plY3QuZWNvcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxZWJkMjIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9tb2RlbC9tc3Byb2plY3QuZWNvcmUKKysrIC9kZXYvbnVsbApAQCAtMSw1NTExICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZWNvcmU6RVBhY2thZ2UgeG1pOnZlcnNpb249IjIuMCIKLSAgICB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgeG1sbnM6ZWNvcmU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUiIG5hbWU9Im1zcHJvamVjdCIKLSAgICBuc1VSST0iaHR0cDovL2VwZi5lY2xpcHNlLm9yZy9tc3Byb2plY3QiIG5zUHJlZml4PSJtc3Byb2plY3QiPgotICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGZ1bGwgcHJvamVjdCBzY2hlbWEgZGVmaW5pdGlvbiBmcm9tIHRoZSBwcm9qZWN0IGxldmVsIGRvd24sICYjeEQ7JiN4QTsmI3g5OyYjeDk7c3RhcnRpbmcgd2l0aCBkYXRhIHR5cGUgZGVmaW5pdGlvbnMuIi8+Ci0gIDwvZUFubm90YXRpb25zPgotICA8ZUFubm90YXRpb25zPgotICAgIDxkZXRhaWxzIGtleT0iYXBwaW5mbyIgdmFsdWU9IlRoZSBNaWNyb3NvZnQgUHJvamVjdCBEYXRhIEludGVyY2hhbmdlIFNjaGVtYSBmb3IgTWljcm9zb2Z0IFByb2plY3QgMTAuJiN4RDsmI3hBOyYjeDk7JiN4OTsiLz4KLSAgPC9lQW5ub3RhdGlvbnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iQWNjcnVlQXQiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLm1hdGguQmlnSW50ZWdlciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJBY2NydWVBdF8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjaW50ZWdlciIvPgotICAgICAgPGRldGFpbHMga2V5PSJlbnVtZXJhdGlvbiIgdmFsdWU9IjEgMiAzIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IkFjdGl2ZURpcmVjdG9yeUdVSURUeXBlIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5sYW5nLlN0cmluZyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJBY3RpdmVEaXJlY3RvcnlHVUlEXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNzdHJpbmciLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ibWF4TGVuZ3RoIiB2YWx1ZT0iMTYiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iQWxpYXNUeXBlIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5sYW5nLlN0cmluZyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJBbGlhc18uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjc3RyaW5nIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im1heExlbmd0aCIgdmFsdWU9IjUwIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkFzc2lnbm1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQXNzaWdubWVudF8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InVJRCIgdW5pcXVlPSJmYWxzZSIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9JbnRlZ2VyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBhc3NpZ25tZW50LiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlVJRCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InRhc2tVSUQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vSW50ZWdlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgdGFzay4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJUYXNrVUlEIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmVzb3VyY2VVSUQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vSW50ZWdlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgcmVzb3VyY2UuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUmVzb3VyY2VVSUQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwZXJjZW50V29ya0NvbXBsZXRlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0ludGVnZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYW1vdW50IG9mIHdvcmsgY29tcGxldGVkIG9uIHRoZSBhc3NpZ25tZW50LiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlBlcmNlbnRXb3JrQ29tcGxldGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhY3R1YWxDb3N0IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RlY2ltYWwiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYWN0dWFsIGNvc3QgaW5jdXJyZWQgb24gdGhlIGFzc2lnbm1lbnQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQWN0dWFsQ29zdCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFjdHVhbEZpbmlzaCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EYXRlVGltZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBhY3R1YWwgZmluaXNoIGRhdGUgb2YgdGhlIGFzc2lnbm1lbnQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQWN0dWFsRmluaXNoIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYWN0dWFsT3ZlcnRpbWVDb3N0IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RlY2ltYWwiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYWN0dWFsIG92ZXJ0aW1lIGNvc3QgaW5jdXJyZWQgb24gdGhlIGFzc2lnbm1lbnQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQWN0dWFsT3ZlcnRpbWVDb3N0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYWN0dWFsT3ZlcnRpbWVXb3JrIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0R1cmF0aW9uIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGFjdHVhbCBhbW91bnQgb2Ygb3ZlcnRpbWUgd29yayBpbmN1cnJlZCBvbiB0aGUgYXNzaWdubWVudC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJBY3R1YWxPdmVydGltZVdvcmsiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhY3R1YWxTdGFydCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EYXRlVGltZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBhY3R1YWwgc3RhcnQgZGF0ZSBvZiB0aGUgYXNzaWdubWVudC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJBY3R1YWxTdGFydCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFjdHVhbFdvcmsiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRHVyYXRpb24iPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYWN0dWFsIGFtb3VudCBvZiB3b3JrIGluY3VycmVkIG9uIHRoZSBhc3NpZ25tZW50LiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkFjdHVhbFdvcmsiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhQ1dQIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Zsb2F0IgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGFjdHVhbCBjb3N0IG9mIHdvcmsgcGVyZm9ybWVkIG9uIHRoZSBhc3NpZ25tZW50IHRvLWRhdGUuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQUNXUCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNvbmZpcm1lZCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV2hldGhlciB0aGUgUmVzb3VyY2UgaGFzIGFjY2VwdGVkIGFsbCBvZiBoaXMgb3IgaGVyIGFzc2lnbm1lbnRzLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkNvbmZpcm1lZCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNvc3QiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGVjaW1hbCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBwcm9qZWN0ZWQgb3Igc2NoZWR1bGVkIGNvc3Qgb2YgdGhlIGFzc2lnbm1lbnQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ29zdCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNvc3RSYXRlVGFibGUiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9Db3N0UmF0ZVRhYmxlVHlwZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBjb3N0IHJhdGUgdGFibGUgdXNlZCBmb3IgdGhlIGFzc2lnbm1lbnQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ29zdFJhdGVUYWJsZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNvc3RWYXJpYW5jZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9GbG9hdCIgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIGNvc3QgYW5kIGJhc2VsaW5lIGNvc3QgZm9yIGEgcmVzb3VyY2UuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ29zdFZhcmlhbmNlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY1YiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRmxvYXQiCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJFYXJuZWQgdmFsdWUgY29zdCB2YXJpYW5jZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDViIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImRlbGF5IiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0ludGVnZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYW1vdW50IHRoYXQgdGhlIGFzc2lnbm1lbnQgaXMgZGVsYXllZC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJEZWxheSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImZpbmlzaCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EYXRlVGltZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBzY2hlZHVsZWQgZmluaXNoIGRhdGUgb2YgdGhlIGFzc2lnbm1lbnQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRmluaXNoIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZmluaXNoVmFyaWFuY2UiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vSW50ZWdlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB2YXJpYW5jZSBvZiB0aGUgYXNzaWdubWVudCBmaW5pc2ggZGF0ZSBmcm9tIHRoZSBiYXNlbGluZSBmaW5pc2ggZGF0ZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJGaW5pc2hWYXJpYW5jZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Imh5cGVybGluayIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL0h5cGVybGlua1R5cGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdGl0bGUgb2YgdGhlIGh5cGVybGluayBhc3NvY2lhdGVkIHdpdGggdGhlIGFzc2lnbm1lbnQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iSHlwZXJsaW5rIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaHlwZXJsaW5rQWRkcmVzcyIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL0h5cGVybGlua0FkZHJlc3NUeXBlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGh5cGVybGluayBhc3NvY2lhdGVkIHdpdGggdGhlIGFzc2lnbm1lbnQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iSHlwZXJsaW5rQWRkcmVzcyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Imh5cGVybGlua1N1YkFkZHJlc3MiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9IeXBlcmxpbmtTdWJBZGRyZXNzVHlwZTEiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZG9jdW1lbnQgYm9va21hcmsgb2YgdGhlIGh5cGVybGluayBhc3NvY2lhdGVkIHdpdGggdGhlIGFzc2lnbm1lbnQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iSHlwZXJsaW5rU3ViQWRkcmVzcyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9IndvcmtWYXJpYW5jZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9GbG9hdCIgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB2YXJpYW5jZSBvZiBhc3NpZ25tZW50IHdvcmsgZnJvbSB0aGUgYmFzZWxpbmUgd29yayBhcyBtaW51dGVzIHggMTAwMC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJXb3JrVmFyaWFuY2UiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJoYXNGaXhlZFJhdGVVbml0cyIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV2hldGhlciB0aGUgVW5pdHMgYXJlIEZpeGVkIFJhdGUuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iSGFzRml4ZWRSYXRlVW5pdHMiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJmaXhlZE1hdGVyaWFsIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXaGV0aGVyIHRoZSBjb25zdW1wdGlvbiBvZiB0aGUgYXNzaWduZWQgbWF0ZXJpYWwgcmVzb3VyY2Ugb2NjdXJzIGluIGEgc2luZ2xlLCBmaXhlZCBhbW91bnQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRml4ZWRNYXRlcmlhbCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImxldmVsaW5nRGVsYXkiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vSW50ZWdlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBkZWxheSBjYXVzZWQgYnkgbGV2ZWxpbmcuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTGV2ZWxpbmdEZWxheSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImxldmVsaW5nRGVsYXlGb3JtYXQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9MZXZlbGluZ0RlbGF5Rm9ybWF0VHlwZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBmb3JtYXQgZm9yIGV4cHJlc3NpbmcgdGhlIGR1cmF0aW9uIG9mIHRoZSBkZWxheS4gICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVzIGFyZTogMz1tLCA0PWVtLCA1PWgsIDY9ZWgsIDc9ZCwgOD1lZCwgOT13LCAxMD1ldywgMTE9bW8sIDEyPWVtbywgMTk9JSwgMjA9ZSUsIDIxPW51bGwsICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzU9bT8sIDM2PWVtPywgMzc9aD8sIDM4PWVoPywgMzk9ZD8sIDQwPWVkPywgNDE9dz8sIDQyPWV3PywgNDM9bW8/LCA0ND1lbW8/LCA1MT0lPywgNTI9ZSU/IGFuZCA1Mz1udWxsLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkxldmVsaW5nRGVsYXlGb3JtYXQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJsaW5rZWRGaWVsZHMiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldoZXRoZXIgdGhlIFByb2plY3QgaXMgbGlua2VkIHRvIGFub3RoZXIgT0xFIG9iamVjdC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJMaW5rZWRGaWVsZHMiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJtaWxlc3RvbmUiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldoZXRoZXIgdGhlIGFzc2lnbm1lbnQgaXMgYSBtaWxlc3RvbmUuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTWlsZXN0b25lIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibm90ZXMiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGV4dCBub3RlcyBhc3NvY2lhdGVkIHdpdGggdGhlIGFzc2lnbm1lbnQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTm90ZXMiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJvdmVyYWxsb2NhdGVkIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXaGV0aGVyIHRoZSBhc3NpZ25tZW50IGlzIG92ZXJhbGxvY2F0ZWQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iT3ZlcmFsbG9jYXRlZCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im92ZXJ0aW1lQ29zdCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EZWNpbWFsIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHN1bSBvZiB0aGUgYWN0dWFsIGFuZCByZW1haW5pbmcgb3ZlcnRpbWUgY29zdCBvZiB0aGUgYXNzaWdubWVudC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJPdmVydGltZUNvc3QiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJvdmVydGltZVdvcmsiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRHVyYXRpb24iPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgc2NoZWR1bGVkIG92ZXJ0aW1lIHdvcmsgc2NoZWR1bGVkIGZvciB0aGUgYXNzaWdubWVudC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJPdmVydGltZVdvcmsiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyZWd1bGFyV29yayIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EdXJhdGlvbiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBhbW91bnQgb2Ygbm9uLW92ZXJ0aW1lIHdvcmsgc2NoZWR1bGVkIGZvciB0aGUgYXNzaWdubWVudC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJSZWd1bGFyV29yayIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJlbWFpbmluZ0Nvc3QiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGVjaW1hbCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSByZW1haW5pbmcgcHJvamVjdGVkIGNvc3Qgb2YgY29tcGxldGluZyB0aGUgYXNzaWdubWVudC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJSZW1haW5pbmdDb3N0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmVtYWluaW5nT3ZlcnRpbWVDb3N0IgotICAgICAgICB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RlY2ltYWwiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgcmVtYWluaW5nIHByb2plY3RlZCBvdmVydGltZSBjb3N0IG9mIGNvbXBsZXRpbmcgdGhlIGFzc2lnbm1lbnQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUmVtYWluaW5nT3ZlcnRpbWVDb3N0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmVtYWluaW5nT3ZlcnRpbWVXb3JrIgotICAgICAgICB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0R1cmF0aW9uIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHJlbWFpbmluZyBvdmVydGltZSB3b3JrIHNjaGVkdWxlZCB0byBjb21wbGV0ZSB0aGUgYXNzaWdubWVudC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJSZW1haW5pbmdPdmVydGltZVdvcmsiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyZW1haW5pbmdXb3JrIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0R1cmF0aW9uIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHJlbWFpbmluZyB3b3JrIHNjaGVkdWxlZCB0byBjb21wbGV0ZSB0aGUgYXNzaWdubWVudC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJSZW1haW5pbmdXb3JrIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmVzcG9uc2VQZW5kaW5nIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUcnVlIGlmIGEgcmVzcG9uc2UgaGFzIG5vdCBiZWVuIHJlY2VpdmVkIGZvciBhIFRlYW1Bc3NpZ24gbWVzc2FnZS4gJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUmVzcG9uc2VQZW5kaW5nIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic3RhcnQiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGF0ZVRpbWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgc2NoZWR1bGVkIHN0YXJ0IGRhdGUgb2YgdGhlIGFzc2lnbm1lbnQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iU3RhcnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzdG9wIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RhdGVUaW1lIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGRhdGUgdGhhdCB0aGUgYXNzaWdubWVudCB3YXMgc3RvcHBlZC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJTdG9wIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmVzdW1lIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RhdGVUaW1lIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGRhdGUgdGhhdCB0aGUgYXNzaWdubWVudCByZXN1bWVkLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlJlc3VtZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InN0YXJ0VmFyaWFuY2UiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vSW50ZWdlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB2YXJpYW5jZSBvZiB0aGUgYXNzaWdubWVudCBzdGFydCBkYXRlIGZyb20gdGhlIGJhc2VsaW5lIHN0YXJ0IGRhdGUuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iU3RhcnRWYXJpYW5jZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InVuaXRzIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Zsb2F0IgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIG51bWJlciBvZiB1bml0cyBmb3IgdGhlIGFzc2lnbm1lbnQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVW5pdHMiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ1cGRhdGVOZWVkZWQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRydWUgaWYgdGhlIHJlc291cmNlIGFzc2lnbmVkIHRvIGEgdGFzayBuZWVkcyB0byBiZSB1cGRhdGVkIGFzIHRvIHRoZSBzdGF0dXMgb2YgdGhlIHRhc2suJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVXBkYXRlTmVlZGVkIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idkFDIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Zsb2F0IgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBiYXNsaW5lIGNvc3QgYW5kIHRvdGFsIGNvc3QuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVkFDIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0id29yayIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EdXJhdGlvbiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBhbW91bnQgb2Ygc2NoZWR1bGVkIHdvcmsgZm9yIHRoZSBhc3NpZ25tZW50LiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IldvcmsiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ3b3JrQ29udG91ciIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL1dvcmtDb250b3VyVHlwZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB3b3JrIGNvbnRvdXIgb2YgdGhlIGFzc2lnbm1lbnQuICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVzIGFyZTogMD1GbGF0LCAxPUJhY2sgTG9hZGVkLCAyPUZyb250IExvYWRlZCwgMz1Eb3VibGUgUGVhaywgND1FYXJseSBQZWFrLCA1PUxhdGUgUGVhaywgJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICA2PUJlbGwsIDc9VHVydGxlLCA4PUNvbnRvdXJlZCYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IldvcmtDb250b3VyIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYkNXUyIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9GbG9hdCIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBidWRnZXRlZCBjb3N0IG9mIHdvcmsgb24gdGhlIGFzc2lnbm1lbnQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQkNXUyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImJDV1AiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRmxvYXQiCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYnVkZ2V0ZWQgY29zdCBvZiB3b3JrIHBlcmZvcm1lZCBvbiB0aGUgYXNzaWdubWVudCB0by1kYXRlLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkJDV1AiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJib29raW5nVHlwZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL0Jvb2tpbmdUeXBlVHlwZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlNwZWNpZmllcyB0aGUgYm9va2luZyB0eXBlIG9mIHRoZSBhc3NpZ25tZW50LiAxPUNvbW1pdGVkLCAyPVByb3Bvc2VkJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQm9va2luZ1R5cGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhY3R1YWxXb3JrUHJvdGVjdGVkIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0R1cmF0aW9uIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iU3BlY2lmaWVzIHRoZSBkdXJhdGlvbiB0aHJvdWdoIHdoaWNoIGFjdHVhbCB3b3JrIGlzIHByb3RlY3RlZC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJBY3R1YWxXb3JrUHJvdGVjdGVkIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkIgotICAgICAgICB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0R1cmF0aW9uIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iU3BlY2lmaWVzIHRoZSBkdXJhdGlvbiB0aHJvdWdoIHdoaWNoIGFjdHVhbCBvdmVydGltZSB3b3JrIGlzIHByb3RlY3RlZC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJBY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjcmVhdGlvbkRhdGUiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGF0ZVRpbWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZGF0ZSB0aGF0IHRoZSBhc3NpZ25tZW50IHdhcyBjcmVhdGVkLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDcmVhdGlvbkRhdGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJleHRlbmRlZEF0dHJpYnV0ZSIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9FeHRlbmRlZEF0dHJpYnV0ZTQiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdmFsdWUgb2YgYW4gZXh0ZW5kZWQgYXR0cmlidXRlLiAgVHdvIHBpZWNlcyBvZiBkYXRhIGFyZSBuZWNlc3NhcnkgLSAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEgcG9pbnRlciBiYWNrIHRvIHRoZSBleHRlbmRlZCBhdHRyaWJ1dGUgdGFibGUgd2hpY2ggaXMgc3BlY2lmaWVkIGVpdGhlciBieSB0aGUgdW5pcXVlIElEIG9yIHRoZSAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpZWxkIElELCBhbmQgdGhlIHZhbHVlIHdoaWNoIGlzIHNwZWNpZmllZCBlaXRoZXIgd2l0aCB0aGUgdmFsdWUsIG9yIGEgcG9pbnRlciBiYWNrIHRvIHRoZSB2YWx1ZSBsaXN0LiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkV4dGVuZGVkQXR0cmlidXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iYmFzZWxpbmUiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vQmFzZWxpbmUzIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGNvbGxlY3Rpb24gb2YgYmFzZWxpbmUgdmFsdWVzIGFzc29jaWF0ZWQgd2l0aCB0aGUgYXNzaWdubWVudC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJCYXNlbGluZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InRpbWVwaGFzZWREYXRhIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL1RpbWVwaGFzZWREYXRhVHlwZSIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB0aW1lIHBoYXNlZCBkYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGUgYXNzaWdubWVudC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJUaW1lcGhhc2VkRGF0YSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkFzc2lnbm1lbnRzIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkFzc2lnbm1lbnRzXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iYXNzaWdubWVudCIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9Bc3NpZ25tZW50IiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlcmUgbXVzdCBiZSBhdCBsZWFzdCBvbmUgYXNzaWdubWVudCBpbiBlYWNoIEFzc2lnbm1lbnRzIGNvbGxlY3Rpb24uJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQXNzaWdubWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IkF1dGhvclR5cGUiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLmxhbmcuU3RyaW5nIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkF1dGhvcl8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjc3RyaW5nIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im1heExlbmd0aCIgdmFsdWU9IjUxMiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJBdmFpbGFiaWxpdHlQZXJpb2QiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQXZhaWxhYmlsaXR5UGVyaW9kXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYXZhaWxhYmxlRnJvbSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EYXRlVGltZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBkYXRlIHRoYXQgdGhlIHJlc291cmNlIGJlY29tZXMgYXZhaWxhYmxlIGZvciB0aGUgc3BlY2lmaWVkIHBlcmlvZC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQXZhaWxhYmxlRnJvbSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImF2YWlsYWJsZVRvIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RhdGVUaW1lIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGxhc3QgZGF0ZSB0aGF0IHRoZSByZXNvdXJjZSBpcyBhdmFpbGFibGUgZm9yIHRoZSBzcGVjaWZpZWQgcGVyaW9kLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJBdmFpbGFibGVUbyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImF2YWlsYWJsZVVuaXRzIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Zsb2F0IiB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHBlcmNlbnRhZ2UgdGhhdCB0aGUgcmVzb3VyY2UgaXMgYXZhaWxhYmxlIGR1cmluZyB0aGUgc3BlY2lmaWVkIHBlcmlvZC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQXZhaWxhYmxlVW5pdHMiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJBdmFpbGFiaWxpdHlQZXJpb2RzIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkF2YWlsYWJpbGl0eVBlcmlvZHNfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJhdmFpbGFiaWxpdHlQZXJpb2QiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vQXZhaWxhYmlsaXR5UGVyaW9kIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHBlcmlvZCB0aGUgcmVzb3VyY2UgaXMgYXZhaWxhYmxlLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJBdmFpbGFiaWxpdHlQZXJpb2QiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJCYXNlbGluZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJCYXNlbGluZV8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InRpbWVwaGFzZWREYXRhIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL1RpbWVwaGFzZWREYXRhVHlwZSIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB0aW1lIHBoYXNlZCBkYXRhIGJsb2NrIGFzc29jaWF0ZWQgd2l0aCB0aGUgdGFzayBiYXNlbGluZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVGltZXBoYXNlZERhdGEiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJudW1iZXIiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vSW50ZWdlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB1bmlxdWUgbnVtYmVyIG9mIHRoZSBiYXNlbGluZSBkYXRhIHJlY29yZC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTnVtYmVyIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaW50ZXJpbSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldoZXRoZXIgdGhpcyBpcyBhbiBJbnRlcmltIEJhc2VsaW5lLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJJbnRlcmltIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic3RhcnQiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGF0ZVRpbWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgc2NoZWR1bGVkIHN0YXJ0IGRhdGUgb2YgdGhlIHRhc2sgd2hlbiB0aGUgYmFzZWxpbmUgd2FzIHNhdmVkLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJTdGFydCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImZpbmlzaCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EYXRlVGltZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBzY2hlZHVsZWQgZmluaXNoIGRhdGUgb2YgdGhlIHRhc2sgd2hlbiB0aGUgYmFzZWxpbmUgd2FzIHNhdmVkLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJGaW5pc2giLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJkdXJhdGlvbiIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EdXJhdGlvbiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBzY2hlZHVsZWQgZHVyYXRpb24gb2YgdGhlIHRhc2sgd2hlbiB0aGUgYmFzZWxpbmUgd2FzIHNhdmVkLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJEdXJhdGlvbiIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImR1cmF0aW9uRm9ybWF0IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vRHVyYXRpb25Gb3JtYXRUeXBlMSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBmb3JtYXQgZm9yIGV4cHJlc3NpbmcgdGhlIER1cmF0aW9uIG9mIHRoZSBUYXNrIGJhc2VsaW5lLiAgJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVzIGFyZTogMz1tLCA0PWVtLCA1PWgsIDY9ZWgsIDc9ZCwgOD1lZCwgOT13LCAxMD1ldywgMTE9bW8sIDEyPWVtbywgMTk9JSwgMjA9ZSUsICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIxPW51bGwsIDM1PW0/LCAzNj1lbT8sIDM3PWg/LCAzOD1laD8sIDM5PWQ/LCA0MD1lZD8sIDQxPXc/LCA0Mj1ldz8sIDQzPW1vPywgNDQ9ZW1vPywgJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTE9JT8sIDUyPWUlPyBhbmQgNTM9bnVsbC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRHVyYXRpb25Gb3JtYXQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJlc3RpbWF0ZWREdXJhdGlvbiIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV2hldGhlciB0aGUgYmFzZWxpbmUgZHVyYXRpb24gb2YgdGhlIHRhc2sgd2FzIGVzdGltYXRlZC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRXN0aW1hdGVkRHVyYXRpb24iLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ3b3JrIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0R1cmF0aW9uIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHNjaGVkdWxlZCB3b3JrIG9mIHRoZSB0YXNrIHdoZW4gdGhlIGJhc2VsaW5lIHdhcyBzYXZlZC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iV29yayIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNvc3QiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGVjaW1hbCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBwcm9qZWN0ZWQgY29zdCBvZiB0aGUgdGFzayB3aGVuIHRoZSBiYXNlbGluZSB3YXMgc2F2ZWQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkNvc3QiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJiQ1dTIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Zsb2F0IgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGJ1ZGdldGVkIGNvc3Qgb2Ygd29yayBzY2hlZHVsZWQgZm9yIHRoZSB0YXNrLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJCQ1dTIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYkNXUCIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9GbG9hdCIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBidWRnZXRlZCBjb3N0IG9mIHdvcmsgcGVyZm9ybWVkIG9uIHRoZSB0YXNrIHRvLWRhdGUuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkJDV1AiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJCYXNlbGluZTIiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQmFzZWxpbmVfLl8xXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibnVtYmVyIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBsb3dlckJvdW5kPSIxIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0ludGVnZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdW5pcXVlIG51bWJlciBvZiB0aGUgYmFzZWxpbmUgZGF0YSByZWNvcmQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik51bWJlciIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9IndvcmsiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRHVyYXRpb24iPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgd29yayBhc3NpZ25lZCB0aGUgcmVzb3VyY2Ugd2hlbiB0aGUgYmFzZWxpbmUgaXMgc2F2ZWQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IldvcmsiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjb3N0IiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Zsb2F0IgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHByb2plY3RlZCBjb3N0IGZvciB0aGUgcmVzb3VyY2Ugd2hlbiB0aGUgYmFzZWxpbmUgd2FzIHNhdmVkLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDb3N0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYkNXUyIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9GbG9hdCIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBidWRnZXQgY29zdCBvZiB3b3JrIHNjaGVkdWxlZCBmb3IgdGhlIHJlc291cmNlLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJCQ1dTIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYkNXUCIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9GbG9hdCIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBidWRnZXRlZCBjb3N0IG9mIG9mIHRoZSB3b3JrIHBlcmZvcm1lZCBieSB0aGUgcmVzb3VyY2UgZm9yIHRoZSBwcm9qZWN0IHRvLWRhdGUuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkJDV1AiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJCYXNlbGluZTMiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQmFzZWxpbmVfLl8yXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0idGltZXBoYXNlZERhdGEiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vVGltZXBoYXNlZERhdGFUeXBlIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHRpbWUgcGhhc2VkIGRhdGEgYXNzb2NpYXRlZCB3aXRoIHRoZSBCYXNlbGluZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJUaW1lcGhhc2VkRGF0YSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im51bWJlciIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgbG93ZXJCb3VuZD0iMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdW5pcXVlIG51bWJlciBvZiB0aGUgYmFzZWxpbmUgZGF0YSByZWNvcmQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTnVtYmVyIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic3RhcnQiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHNjaGVkdWxlZCBzdGFydCBkYXRlIG9mIHRoZSBhc3NpZ25tZW50IHdoZW4gdGhlIGJhc2VsaW5lIHdhcyBzYXZlZC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJTdGFydCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImZpbmlzaCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgc2NoZWR1bGVkIGZpbmlzaCBkYXRlIG9mIHRoZSBhc3NpZ25tZW50IHdoZW4gdGhlIGJhc2VsaW5lIHdhcyBzYXZlZC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJGaW5pc2giLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ3b3JrIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0R1cmF0aW9uIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHRvdGFsIGFtb3VudCBvZiB3b3JrIHNjaGVkdWxlZCBvbiB0aGUgYXNzaWdubWVudCB3aGVuIHRoZSBiYXNlbGluZSB3YXMgc2F2ZWQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iV29yayIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNvc3QiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHRvdGFsIHByb2plY3RlZCBjb3N0IG9mIHRoZSBhc3NpZ25tZW50IHdoZW4gdGhlIGJhc2VsaW5lIHdhcyBzYXZlZC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDb3N0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYkNXUyIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9GbG9hdCIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBidWRnZXRlZCBjb3N0IG9mIHdvcmsgb24gdGhlIGFzc2lnbm1lbnQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQkNXUyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImJDV1AiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRmxvYXQiCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYnVkZ2V0ZWQgY29zdCBvZiB3b3JrIHBlcmZvcm1lZCBvbiB0aGUgYXNzaWdubWVudCB0by1kYXRlLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkJDV1AiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJCYXNlbGluZUZvckVhcm5lZFZhbHVlVHlwZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubWF0aC5CaWdJbnRlZ2VyIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkJhc2VsaW5lRm9yRWFybmVkVmFsdWVfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXIiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iZW51bWVyYXRpb24iIHZhbHVlPSIwIDEgMiAzIDQgNSA2IDcgOCA5IDEwIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IkJvb2tpbmdUeXBlVHlwZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubWF0aC5CaWdJbnRlZ2VyIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkJvb2tpbmdUeXBlXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImVudW1lcmF0aW9uIiB2YWx1ZT0iMCAxIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IkJvb2tpbmdUeXBlVHlwZTEiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLm1hdGguQmlnSW50ZWdlciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJCb29raW5nVHlwZV8uXzFfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXIiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iZW51bWVyYXRpb24iIHZhbHVlPSIwIDEiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iQ2FsY3VsYXRpb25UeXBlVHlwZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubWF0aC5CaWdJbnRlZ2VyIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkNhbGN1bGF0aW9uVHlwZV8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjaW50ZWdlciIvPgotICAgICAgPGRldGFpbHMga2V5PSJlbnVtZXJhdGlvbiIgdmFsdWU9IjAgMSAyIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkNhbGVuZGFyIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkNhbGVuZGFyXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idUlEIiB1bmlxdWU9ImZhbHNlIiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0ludGVnZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIGNhbGVuZGFyLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJVSUQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJuYW1lIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iIy8vTmFtZVR5cGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgbmFtZSBvZiB0aGUgY2FsZW5kYXIuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik5hbWUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpc0Jhc2VDYWxlbmRhciIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV2hldGhlciB0aGUgY2FsZW5kYXIgaXMgYSBiYXNlIGNhbGVuZGFyLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJJc0Jhc2VDYWxlbmRhciIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImJhc2VDYWxlbmRhclVJRCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9JbnRlZ2VyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBiYXNlIGNhbGVuZGFyICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uIHdoaWNoIHRoaXMgY2FsZW5kYXIgZGVwZW5kcy4gT25seSBhcHBsaWNhYmxlIGlmIHRoZSBjYWxlbmRhciBpcyAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3QgYSBiYXNlIGNhbGVuZGFyLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJCYXNlQ2FsZW5kYXJVSUQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ3ZWVrRGF5cyIgZVR5cGU9IiMvL1dlZWtEYXlzIgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGNvbGxlY3Rpb24gb2YgV2Vla2RheXMgdGhhdCBkZWZpbmVzIHRoaXMgY2FsZW5kYXIuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IldlZWtEYXlzIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQ2FsZW5kYXJzIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkNhbGVuZGFyc18uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImNhbGVuZGFyIiBsb3dlckJvdW5kPSIxIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0NhbGVuZGFyIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQ2FsZW5kYXJzIGFyZSB1c2VkIHRvIGRlZmluZSBzdGFuZGFyZCB3b3JraW5nIGFuZCAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICBub24td29ya2luZyB0aW1lcy4gUHJvamVjdHMgbXVzdCBoYXZlIG9uZSBiYXNlIGNhbGVuZGFyLiBUYXNrcyBhbmQgcmVzb3VyY2VzICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIG1heSBoYXZlIHRoZWlyIG93biBub24tYmFzZSBjYWxlbmRhcnMgd2hpY2ggYXJlIGJhc2VkIG9uIGEgYmFzZSBjYWxlbmRhci4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ2FsZW5kYXIiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJDYXRlZ29yeVR5cGUiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLmxhbmcuU3RyaW5nIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkNhdGVnb3J5Xy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNzdHJpbmciLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ibWF4TGVuZ3RoIiB2YWx1ZT0iNTEyIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IkNvZGVUeXBlIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5sYW5nLlN0cmluZyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDb2RlXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNzdHJpbmciLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ibWF4TGVuZ3RoIiB2YWx1ZT0iNTEyIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IkNvbXBhbnlUeXBlIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5sYW5nLlN0cmluZyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDb21wYW55Xy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNzdHJpbmciLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ibWF4TGVuZ3RoIiB2YWx1ZT0iNTEyIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IkNvbnN0cmFpbnRUeXBlVHlwZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubWF0aC5CaWdJbnRlZ2VyIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkNvbnN0cmFpbnRUeXBlXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImVudW1lcmF0aW9uIiB2YWx1ZT0iMCAxIDIgMyA0IDUgNiA3Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IkNvbnRhY3RUeXBlIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5sYW5nLlN0cmluZyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDb250YWN0Xy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNzdHJpbmciLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ibWF4TGVuZ3RoIiB2YWx1ZT0iNTEyIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IkNvc3RSYXRlVGFibGVUeXBlIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5tYXRoLkJpZ0ludGVnZXIiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ29zdFJhdGVUYWJsZV8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjaW50ZWdlciIvPgotICAgICAgPGRldGFpbHMga2V5PSJlbnVtZXJhdGlvbiIgdmFsdWU9IjAgMSAyIDMgNCIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJDdXJyZW5jeVN5bWJvbFBvc2l0aW9uVHlwZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubWF0aC5CaWdJbnRlZ2VyIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkN1cnJlbmN5U3ltYm9sUG9zaXRpb25fLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXIiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iZW51bWVyYXRpb24iIHZhbHVlPSIwIDEgMiAzIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IkN1cnJlbmN5U3ltYm9sVHlwZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubGFuZy5TdHJpbmciPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ3VycmVuY3lTeW1ib2xfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3N0cmluZyIvPgotICAgICAgPGRldGFpbHMga2V5PSJtYXhMZW5ndGgiIHZhbHVlPSIyMCIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJEYXlUeXBlVHlwZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubWF0aC5CaWdJbnRlZ2VyIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkRheVR5cGVfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXIiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iZW51bWVyYXRpb24iIHZhbHVlPSIwIDEgMiAzIDQgNSA2IDciLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iRGVmYXVsdEZpeGVkQ29zdEFjY3J1YWxUeXBlIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5tYXRoLkJpZ0ludGVnZXIiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRGVmYXVsdEZpeGVkQ29zdEFjY3J1YWxfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXIiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iZW51bWVyYXRpb24iIHZhbHVlPSIxIDIgMyIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJEZWZhdWx0VGFza0VWTWV0aG9kVHlwZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubWF0aC5CaWdJbnRlZ2VyIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkRlZmF1bHRUYXNrRVZNZXRob2RfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXIiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iZW51bWVyYXRpb24iIHZhbHVlPSIwIDEiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iRGVmYXVsdFRhc2tUeXBlVHlwZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubWF0aC5CaWdJbnRlZ2VyIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkRlZmF1bHRUYXNrVHlwZV8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjaW50ZWdlciIvPgotICAgICAgPGRldGFpbHMga2V5PSJlbnVtZXJhdGlvbiIgdmFsdWU9IjAgMSAyIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkRvY3VtZW50Um9vdCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSIiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9Im1peGVkIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im1peGVkIiB1bmlxdWU9ImZhbHNlIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUZlYXR1cmVNYXBFbnRyeSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudFdpbGRjYXJkIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IjptaXhlZCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ4TUxOU1ByZWZpeE1hcCIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFQ2xhc3MgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmdUb1N0cmluZ01hcEVudHJ5IgotICAgICAgICB0cmFuc2llbnQ9InRydWUiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImF0dHJpYnV0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJ4bWxuczpwcmVmaXgiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ieFNJU2NoZW1hTG9jYXRpb24iIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iZWNvcmU6RUNsYXNzIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nVG9TdHJpbmdNYXBFbnRyeSIKLSAgICAgICAgdHJhbnNpZW50PSJ0cnVlIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJhdHRyaWJ1dGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0ieHNpOnNjaGVtYUxvY2F0aW9uIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InByb2plY3QiIHVwcGVyQm91bmQ9Ii0yIgotICAgICAgICBlVHlwZT0iIy8vUHJvamVjdCIgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIgY29udGFpbm1lbnQ9InRydWUiCi0gICAgICAgIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBwcm9qZWN0IGlzIHRoZSB0b3AgbGV2ZWwgZWxlbWVudCBvZiB0aGUgZG9jdW1lbnQuJiN4RDsmI3hBOyYjeDk7JiN4OTsmI3g5OyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJQcm9qZWN0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iRHVyYXRpb25Gb3JtYXRUeXBlIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5tYXRoLkJpZ0ludGVnZXIiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRHVyYXRpb25Gb3JtYXRfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXIiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iZW51bWVyYXRpb24iIHZhbHVlPSIzIDQgNSA2IDcgOCA5IDEwIDExIDEyIDE5IDIwIDIxIDM1IDM2IDM3IDM4IDM5IDQwIDQxIDQyIDQzIDQ0IDUxIDUyIDUzIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IkR1cmF0aW9uRm9ybWF0VHlwZTEiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLm1hdGguQmlnSW50ZWdlciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJEdXJhdGlvbkZvcm1hdF8uXzFfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXIiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iZW51bWVyYXRpb24iIHZhbHVlPSIzIDQgNSA2IDcgOCA5IDEwIDExIDEyIDE5IDIwIDIxIDM1IDM2IDM3IDM4IDM5IDQwIDQxIDQyIDQzIDQ0IDUxIDUyIDUzIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IkR1cmF0aW9uRm9ybWF0VHlwZTIiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLm1hdGguQmlnSW50ZWdlciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJEdXJhdGlvbkZvcm1hdF8uXzJfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXIiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iZW51bWVyYXRpb24iIHZhbHVlPSIzIDQgNSA2IDcgOCA5IDEwIDExIDEyIDE5IDIwIDIxIDM1IDM2IDM3IDM4IDM5IDQwIDQxIDQyIDQzIDQ0IDUxIDUyIDUzIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IkR1cmF0aW9uRm9ybWF0VHlwZTMiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLm1hdGguQmlnSW50ZWdlciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJEdXJhdGlvbkZvcm1hdF8uXzNfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXIiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iZW51bWVyYXRpb24iIHZhbHVlPSIzIDQgNSA2IDcgOCA5IDEwIDExIDEyIDE5IDIwIDIxIDM1IDM2IDM3IDM4IDM5IDQwIDQxIDQyIDQzIDQ0IDUxIDUyIDUzIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IkR1cmF0aW9uRm9ybWF0VHlwZTQiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLm1hdGguQmlnSW50ZWdlciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJEdXJhdGlvbkZvcm1hdF8uXzRfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXIiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iZW51bWVyYXRpb24iIHZhbHVlPSIzIDQgNSA2IDcgOCA5IDEwIDExIDEyIDE5IDIwIDIxIDM1IDM2IDM3IDM4IDM5IDQwIDQxIDQyIDQzIDQ0IDUxIDUyIDUzIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IkR1cmF0aW9uRm9ybWF0VHlwZTUiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLm1hdGguQmlnSW50ZWdlciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJEdXJhdGlvbkZvcm1hdF8uXzVfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXIiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iZW51bWVyYXRpb24iIHZhbHVlPSIzIDQgNSA2IDcgOCA5IDEwIDExIDEyIDE5IDIwIDIxIDM1IDM2IDM3IDM4IDM5IDQwIDQxIDQyIDQzIDQ0IDUxIDUyIDUzIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IkVhcm5lZFZhbHVlTWV0aG9kVHlwZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubWF0aC5CaWdJbnRlZ2VyIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkVhcm5lZFZhbHVlTWV0aG9kXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImVudW1lcmF0aW9uIiB2YWx1ZT0iMCAxIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IkVhcm5lZFZhbHVlTWV0aG9kVHlwZTEiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLm1hdGguQmlnSW50ZWdlciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJFYXJuZWRWYWx1ZU1ldGhvZF8uXzFfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXIiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iZW51bWVyYXRpb24iIHZhbHVlPSIwIDEiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iRW1haWxBZGRyZXNzVHlwZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubGFuZy5TdHJpbmciPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRW1haWxBZGRyZXNzXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNzdHJpbmciLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ibWF4TGVuZ3RoIiB2YWx1ZT0iNTEyIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkV4dGVuZGVkQXR0cmlidXRlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkV4dGVuZGVkQXR0cmlidXRlXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZmllbGRJRCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGlzIGNvcnJlc3BvbmRzIHRvIHRoZSBQSUQgb2YgdGhlIGN1c3RvbSBmaWVsZC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRmllbGRJRCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImZpZWxkTmFtZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgbmFtZSBvZiB0aGUgY3VzdG9tIGZpZWxkLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJGaWVsZE5hbWUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhbGlhcyIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9IiMvL0FsaWFzVHlwZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBhbGlhcyBvZiB0aGUgY3VzdG9tIGZpZWxkIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkFsaWFzIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icGhvbmV0aWNBbGlhcyIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL1Bob25ldGljQWxpYXNUeXBlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHBob25ldGljIHByb251bmNpYXRpb24gb2YgdGhlIGFsaWFzIG9mIHRoZSAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXN0b20gZmllbGQiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUGhvbmV0aWNBbGlhcyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJvbGx1cFR5cGUiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9Sb2xsdXBUeXBlVHlwZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkhvdyByb2xsdXBzIGFyZSBjYWxjdWxhdGVkLiBWYWx1ZXMgYXJlOiAwPU1heGltdW0gJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE9SIGZvciBmbGFnIGZpZWxkcyksIDE9TWluaW11bSAoQU5EIGZvciBmbGFnIGZpZWxkcyksIDI9Q291bnQgYWxsLCAzPVN1bSwgJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgND1BdmVyYWdlLCA1PUF2ZXJhZ2UgRmlyc3QgU3VibGV2ZWwsIDY9Q291bnQgRmlyc3QgU3VibGV2ZWwsIDc9Q291bnQgJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm9uc3VtbWFyaWVzIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlJvbGx1cFR5cGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjYWxjdWxhdGlvblR5cGUiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9DYWxjdWxhdGlvblR5cGVUeXBlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV2hldGhlciByb2xsdXBzIGFyZSBjYWxjdWxhdGVkIGZvciB0YXNrIGFuZCBncm91cCBzdW1tYXJ5IHJvd3MuICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlcyBhcmU6IDA9Tm9uZSwgMT1Sb2xsdXAsIDI9Q2FsY3VsYXRpb24iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ2FsY3VsYXRpb25UeXBlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZm9ybXVsYSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZm9ybXVsYSB0aGF0IE1pY3Jvc29mdCBQcm9qZWN0IHVzZXMgdG8gcG9wdWxhdGUgdGhlICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1c3RvbSB0YXNrIGZpZWxkLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJGb3JtdWxhIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmVzdHJpY3RWYWx1ZXMiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IklmIFJlc3RyaWN0VmFsdWVzPVRydWUgdGhlbiBvbmx5IHZhbHVlcyBpbiB0aGUgbGlzdCBhcmUgJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dlZCBpbiB0aGUgZmlsZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJSZXN0cmljdFZhbHVlcyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InZhbHVlbGlzdFNvcnRPcmRlciIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL1ZhbHVlbGlzdFNvcnRPcmRlclR5cGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJIb3cgdmFsdWUgbGlzdHMgYXJlIHNvcnRlZC4gVmFsdWVzIGFyZTogJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMD1EZXNjZW5kaW5nLCAxPUFzY2VuZGluZyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJWYWx1ZWxpc3RTb3J0T3JkZXIiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhcHBlbmROZXdWYWx1ZXMiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IklmIEFwcGVuZE5ld1ZhbHVlcz1UcnVlIHRoZW4gYW55IG5ldyB2YWx1ZXMgYWRkZWQgaW4gYSBwcm9qZWN0ICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZSBhdXRvbWF0aWNhbGx5IGFwcGVuZGVkIHRvIHRoZSBsaXN0LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJBcHBlbmROZXdWYWx1ZXMiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJkZWZhdWx0IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoaXMgcG9pbnRzIHRvIHRoZSBkZWZhdWx0IHZhbHVlIGluIHRoZSBsaXN0LiAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb3QgcHJlc2VudCBpZiBubyBkZWZhdWx0IGlzIHNldC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRGVmYXVsdCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InZhbHVlTGlzdCIgZVR5cGU9IiMvL1ZhbHVlTGlzdCIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldoZW4gdmFsdWVzIG9mIGV4dGVuZGVkIGF0dHJpYnV0ZXMgYXJlIHNwZWNpZmllZCBhcyAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzIG9mIGVsZW1lbnRzIGluIHRoZSBzY2hlbWEsIHRoZXkgbWF5IGVpdGhlciBiZSBzcGVjaWZpZWQgYnkgdmFsdWVzICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIGJ5IHJlZmVyZW5jZXMgdG8gdGhlIHZhbHVlcyBjb250YWluZWQgaW4gdGhpcyBsaXN0LiAgQXBwbGljYXRpb25zIG1heSAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3N1bWUgb3JkZXJpbmcgb2YgdGhlIGxpc3QgYnkgb3JkZXJpbmcgc3BlY2lmaWVkIGhlcmUuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlZhbHVlTGlzdCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkV4dGVuZGVkQXR0cmlidXRlMiI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJFeHRlbmRlZEF0dHJpYnV0ZV8uXzFfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ1SUQiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vSW50ZWdlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB1bmlxdWUgSUQgb2YgdGhlIHZhbHVlIGluIHRoZSBleHRlbmRlZCBhdHRyaWJ1dGUgY29sbGVjdGlvbi4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVUlEIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZmllbGRJRCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgUElEIG9mIHRoZSBjdXN0b20gZmllbGQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkZpZWxkSUQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ2YWx1ZSIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYWN0dWFsIHZhbHVlIG9mIHRoZSBleHRlbmRlZCBhdHRyaWJ1dGUuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlZhbHVlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idmFsdWVJRCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9JbnRlZ2VyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIElEIG9mIHRoZSB2YWx1ZSBpbiB0aGUgZXh0ZW5kZWQgYXR0cmlidXQgbG9va3VwIHRhYmxlLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJWYWx1ZUlEIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZHVyYXRpb25Gb3JtYXQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9EdXJhdGlvbkZvcm1hdFR5cGUyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGZvcm1hdCBmb3IgZXhwcmVzc2luZyB0aGUgYnVsayBkdXJhdGlvbi4gICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlcyBhcmU6IDM9bSwgND1lbSwgNT1oLCA2PWVoLCA3PWQsIDg9ZWQsIDk9dywgMTA9ZXcsIDExPW1vLCAxMj1lbW8sICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE5PSUsIDIwPWUlLCAyMT1udWxsLCAzNT1tPywgMzY9ZW0/LCAzNz1oPywgMzg9ZWg/LCAzOT1kPywgNDA9ZWQ/LCA0MT13PywgJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDI9ZXc/LCA0Mz1tbz8sIDQ0PWVtbz8sIDUxPSU/LCA1Mj1lJT8gYW5kIDUzPW51bGwuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkR1cmF0aW9uRm9ybWF0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRXh0ZW5kZWRBdHRyaWJ1dGUzIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkV4dGVuZGVkQXR0cmlidXRlXy5fMl8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InVJRCIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9JbnRlZ2VyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHVuaXF1ZSBJRCBvZiB0aGUgdmFsdWUgaW4gdGhlIGV4dGVuZGVkIGF0dHJpYnV0ZSBjb2xsZWN0aW9uLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJVSUQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJmaWVsZElEIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBQSUQgb2YgdGhlIGN1c3RvbSBmaWVsZC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRmllbGRJRCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InZhbHVlIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBhY3R1YWwgdmFsdWUgb2YgdGhlIGV4dGVuZGVkIGF0dHJpYnV0ZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVmFsdWUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ2YWx1ZUlEIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0ludGVnZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgSUQgb2YgdGhlIHZhbHVlIGluIHRoZSBleHRlbmRlZCBhdHRyaWJ1dCBsb29rdXAgdGFibGUuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlZhbHVlSUQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJkdXJhdGlvbkZvcm1hdCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL0R1cmF0aW9uRm9ybWF0VHlwZTMiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZm9ybWF0IGZvciBleHByZXNzaW5nIHRoZSBidWxrIGR1cmF0aW9uLiAgJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVzIGFyZTogMz1tLCA0PWVtLCA1PWgsIDY9ZWgsIDc9ZCwgOD1lZCwgOT13LCAxMD1ldywgMTE9bW8sIDEyPWVtbywgMTk9JSwgJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjA9ZSUsIDIxPW51bGwsIDM1PW0/LCAzNj1lbT8sIDM3PWg/LCAzOD1laD8sIDM5PWQ/LCA0MD1lZD8sIDQxPXc/LCA0Mj1ldz8sICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQzPW1vPywgNDQ9ZW1vPywgNTE9JT8sIDUyPWUlPyBhbmQgNTM9bnVsbC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRHVyYXRpb25Gb3JtYXQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJFeHRlbmRlZEF0dHJpYnV0ZTQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRXh0ZW5kZWRBdHRyaWJ1dGVfLl8zXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idUlEIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0ludGVnZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdW5pcXVlIElEIG9mIHRoZSB2YWx1ZSBpbiB0aGUgZXh0ZW5kZWQgYXR0cmlidXRlIGNvbGxlY3Rpb24uJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVUlEIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZmllbGRJRCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZmllbGQgSUQgaW4gdGhlIGxvY2FsaXNlZCBsYW5ndWFnZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJGaWVsZElEIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idmFsdWUiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGFjdHVhbCB2YWx1ZSBvZiB0aGUgZXh0ZW5kZWQgYXR0cmlidXRlLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlZhbHVlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idmFsdWVJRCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9JbnRlZ2VyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIElEIG9mIHRoZSB2YWx1ZSBpbiB0aGUgZXh0ZW5kZWQgYXR0cmlidXQgbG9va3VwIHRhYmxlLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlZhbHVlSUQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJkdXJhdGlvbkZvcm1hdCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL0R1cmF0aW9uRm9ybWF0VHlwZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBmb3JtYXQgZm9yIGV4cHJlc3NpbmcgdGhlIGJ1bGsgZHVyYXRpb24uICAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlcyBhcmU6IDM9bSwgND1lbSwgNT1oLCA2PWVoLCA3PWQsIDg9ZWQsIDk9dywgMTA9ZXcsIDExPW1vLCAxMj1lbW8sIDE5PSUsIDIwPWUlLCAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIxPW51bGwsIDM1PW0/LCAzNj1lbT8sIDM3PWg/LCAzOD1laD8sIDM5PWQ/LCA0MD1lZD8sIDQxPXc/LCA0Mj1ldz8sIDQzPW1vPywgNDQ9ZW1vPywgJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1MT0lPywgNTI9ZSU/IGFuZCA1Mz1udWxsLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkR1cmF0aW9uRm9ybWF0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRXh0ZW5kZWRBdHRyaWJ1dGVzIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkV4dGVuZGVkQXR0cmlidXRlc18uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImV4dGVuZGVkQXR0cmlidXRlIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL0V4dGVuZGVkQXR0cmlidXRlIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRWFjaCBvZiB0aGUgaW5kaXZpZHVhbCBlbnRyaWVzIGluIHRoZSBleHRlbmRlZCBhdHRyaWJ1dGVzIGRlZmluaXRpb24gJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgY29sbGVjdGlvbi4gIFRoZXJlIGFyZSBubyBsaW1pdHMgdG8gdGhlIG51bWJlciBvZiBjaGlsZHJlbiB0aGF0IG1heSBhcHBlYXIsIGJ1dCBwcm9qZWN0ICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIHdpbGwgb25seSB1bmRlcnN0YW5kIEZsYWcxLUZsYWcxMCwgZXRjLiAgVGhpcyBtdXN0IGFwcGVhciBvbmNlIGluIGVhY2ggRXh0ZW5kZWRBdHRyaWJ1dGVzICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIGNvbGxlY3Rpb24uIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkV4dGVuZGVkQXR0cmlidXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iRXh0ZXJuYWxUYXNrUHJvamVjdFR5cGUiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLmxhbmcuU3RyaW5nIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkV4dGVybmFsVGFza1Byb2plY3RfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3N0cmluZyIvPgotICAgICAgPGRldGFpbHMga2V5PSJtYXhMZW5ndGgiIHZhbHVlPSI1MTIiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iRml4ZWRDb3N0QWNjcnVhbFR5cGUiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLmxhbmcuU3RyaW5nIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkZpeGVkQ29zdEFjY3J1YWxfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3N0cmluZyIvPgotICAgICAgPGRldGFpbHMga2V5PSJlbnVtZXJhdGlvbiIgdmFsdWU9IjEgMiAzIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IkZZU3RhcnREYXRlVHlwZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubWF0aC5CaWdJbnRlZ2VyIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkZZU3RhcnREYXRlXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImVudW1lcmF0aW9uIiB2YWx1ZT0iMSAyIDMgNCA1IDYgNyA4IDkgMTAgMTEgMTIiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iR3JvdXBUeXBlIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5sYW5nLlN0cmluZyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJHcm91cF8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjc3RyaW5nIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im1heExlbmd0aCIgdmFsdWU9IjUxMiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJIeXBlcmxpbmtBZGRyZXNzVHlwZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubGFuZy5TdHJpbmciPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iSHlwZXJsaW5rQWRkcmVzc18uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjc3RyaW5nIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im1heExlbmd0aCIgdmFsdWU9IjUxMiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJIeXBlcmxpbmtBZGRyZXNzVHlwZTEiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLmxhbmcuU3RyaW5nIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ikh5cGVybGlua0FkZHJlc3NfLl8xXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNzdHJpbmciLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ibWF4TGVuZ3RoIiB2YWx1ZT0iNTEyIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9Ikh5cGVybGlua0FkZHJlc3NUeXBlMiIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubGFuZy5TdHJpbmciPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iSHlwZXJsaW5rQWRkcmVzc18uXzJfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3N0cmluZyIvPgotICAgICAgPGRldGFpbHMga2V5PSJtYXhMZW5ndGgiIHZhbHVlPSI1MTIiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iSHlwZXJsaW5rU3ViQWRkcmVzc1R5cGUiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLmxhbmcuU3RyaW5nIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ikh5cGVybGlua1N1YkFkZHJlc3NfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3N0cmluZyIvPgotICAgICAgPGRldGFpbHMga2V5PSJtYXhMZW5ndGgiIHZhbHVlPSI1MTIiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iSHlwZXJsaW5rU3ViQWRkcmVzc1R5cGUxIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5sYW5nLlN0cmluZyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJIeXBlcmxpbmtTdWJBZGRyZXNzXy5fMV8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjc3RyaW5nIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im1heExlbmd0aCIgdmFsdWU9IjUxMiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJIeXBlcmxpbmtTdWJBZGRyZXNzVHlwZTIiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLmxhbmcuU3RyaW5nIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ikh5cGVybGlua1N1YkFkZHJlc3NfLl8yXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNzdHJpbmciLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ibWF4TGVuZ3RoIiB2YWx1ZT0iNTEyIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9Ikh5cGVybGlua1R5cGUiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLmxhbmcuU3RyaW5nIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ikh5cGVybGlua18uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjc3RyaW5nIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im1heExlbmd0aCIgdmFsdWU9IjUxMiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJIeXBlcmxpbmtUeXBlMSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubGFuZy5TdHJpbmciPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iSHlwZXJsaW5rXy5fMV8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjc3RyaW5nIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im1heExlbmd0aCIgdmFsdWU9IjUxMiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJIeXBlcmxpbmtUeXBlMiIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubGFuZy5TdHJpbmciPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iSHlwZXJsaW5rXy5fMl8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjc3RyaW5nIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im1heExlbmd0aCIgdmFsdWU9IjUxMiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJJbml0aWFsc1R5cGUiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLmxhbmcuU3RyaW5nIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkluaXRpYWxzXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNzdHJpbmciLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ibWF4TGVuZ3RoIiB2YWx1ZT0iNTEyIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IkxhZ0Zvcm1hdFR5cGUiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLm1hdGguQmlnSW50ZWdlciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJMYWdGb3JtYXRfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXIiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iZW51bWVyYXRpb24iIHZhbHVlPSIzIDQgNSA2IDcgOCA5IDEwIDExIDEyIDE5IDIwIDM1IDM2IDM3IDM4IDM5IDQwIDQxIDQyIDQzIDQ0IDUxIDUyIDUzIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IkxldmVsaW5nRGVsYXlGb3JtYXRUeXBlIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5tYXRoLkJpZ0ludGVnZXIiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTGV2ZWxpbmdEZWxheUZvcm1hdF8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjaW50ZWdlciIvPgotICAgICAgPGRldGFpbHMga2V5PSJlbnVtZXJhdGlvbiIgdmFsdWU9IjMgNCA1IDYgNyA4IDkgMTAgMTEgMTIgMTkgMjAgMjEgMzUgMzYgMzcgMzggMzkgNDAgNDEgNDIgNDMgNDQgNTEgNTIgNTMiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iTGV2ZWxpbmdEZWxheUZvcm1hdFR5cGUxIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5tYXRoLkJpZ0ludGVnZXIiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTGV2ZWxpbmdEZWxheUZvcm1hdF8uXzFfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXIiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iZW51bWVyYXRpb24iIHZhbHVlPSIzIDQgNSA2IDcgOCA5IDEwIDExIDEyIDE5IDIwIDIxIDM1IDM2IDM3IDM4IDM5IDQwIDQxIDQyIDQzIDQ0IDUxIDUyIDUzIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9Ik1hbmFnZXJUeXBlIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5sYW5nLlN0cmluZyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJNYW5hZ2VyXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNzdHJpbmciLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ibWF4TGVuZ3RoIiB2YWx1ZT0iNTEyIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ik1hc2siPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTWFza18uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImxldmVsIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0ludGVnZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgbGV2ZWwgb2YgdGhlIG1hc2suIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkxldmVsIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idHlwZSIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9IiMvL1R5cGVUeXBlNSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB0eXBlIG9mIG1hc2suIFZhbHVlcyBhcmU6IDA9TnVtYmVycywgMT1VcHBlciBDYXNlIExldHRlcnMsIDI9TG93ZXIgQ2FzZSBMZXR0ZXJzLCAzPUNoYXJhY3RlcnMiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVHlwZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Imxlbmd0aCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9JbnRlZ2VyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIG1heGltdW0gbGVuZ3RoIGluIGNoYXJhY3RlcnMgb2YgdGhlIG91dGxpbmUgY29kZSB2YWx1ZXMuICBJZiBsZW5ndGggaXMgYW55LCB0aGUgdmFsdWUgaXMgemVyby4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTGVuZ3RoIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic2VwYXJhdG9yIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBzZXBhcmF0b3IgdmFsdWUgb2YgdGhlIGNvZGUgdmFsdWVzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJTZXBhcmF0b3IiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJNYXNrcyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJNYXNrc18uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im1hc2siIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vTWFzayIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBmb3VyIGVsZW1lbnRzIG9mIHRoZSBtYXNrIGNvbnN0aXR1dGUgdGhlIGZvcm1hdCBpbiB3aGljaCB0aGUgb3V0bGluZSBjb2RlIG11c3QgYXBwZWFyLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJNYXNrIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iTWF0ZXJpYWxMYWJlbFR5cGUiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLmxhbmcuU3RyaW5nIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik1hdGVyaWFsTGFiZWxfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3N0cmluZyIvPgotICAgICAgPGRldGFpbHMga2V5PSJtYXhMZW5ndGgiIHZhbHVlPSI1MTIiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iTmFtZVR5cGUiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLmxhbmcuU3RyaW5nIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik5hbWVfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3N0cmluZyIvPgotICAgICAgPGRldGFpbHMga2V5PSJtYXhMZW5ndGgiIHZhbHVlPSI1MTIiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iTmFtZVR5cGUxIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5sYW5nLlN0cmluZyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJOYW1lXy5fMV8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjc3RyaW5nIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im1heExlbmd0aCIgdmFsdWU9IjUxMiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJOYW1lVHlwZTIiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLmxhbmcuU3RyaW5nIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik5hbWVfLl8yXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNzdHJpbmciLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ibWF4TGVuZ3RoIiB2YWx1ZT0iNTEyIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9Ik5hbWVUeXBlMyIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubGFuZy5TdHJpbmciPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTmFtZV8uXzNfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3N0cmluZyIvPgotICAgICAgPGRldGFpbHMga2V5PSJtYXhMZW5ndGgiIHZhbHVlPSIyNTUiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iTmV3VGFza1N0YXJ0RGF0ZVR5cGUiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLm1hdGguQmlnSW50ZWdlciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJOZXdUYXNrU3RhcnREYXRlXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImVudW1lcmF0aW9uIiB2YWx1ZT0iMCAxIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9Ik5UQWNjb3VudFR5cGUiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLmxhbmcuU3RyaW5nIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik5UQWNjb3VudF8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjc3RyaW5nIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im1heExlbmd0aCIgdmFsdWU9IjUxMiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJPdXRsaW5lQ29kZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJPdXRsaW5lQ29kZV8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImZpZWxkSUQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQ29yZXNwb25kcyB0byB0aGUgZmllbGQgbnVtYmVyIG9mIG91dGxpbmUgY29kZS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRmllbGRJRCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImZpZWxkTmFtZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgbmFtZSBvZiB0aGUgY3VzdG9tIG91dGxpbmUgY29kZS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRmllbGROYW1lIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYWxpYXMiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGFsaWFzIG9mIHRoZSBjdXN0b20gb3V0bGluZSBjb2RlLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJBbGlhcyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InBob25ldGljQWxpYXMiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHBob25ldGljIHByb251bmNpYXRpb24gb2YgdGhlIGFsaWFzIG9mIHRoZSBjdXN0b20gb3V0bGluZSBjb2RlLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJQaG9uZXRpY0FsaWFzIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0idmFsdWVzIiBlVHlwZT0iIy8vVmFsdWVzIgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHZhbHVlcyBvZiB0aGUgdGFibGUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgb3V0bGluZSBjb2RlLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJWYWx1ZXMiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJlbnRlcnByaXNlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJJbmRpY2F0ZXMgd2hldGhlciB0aGUgY3VzdG9tIG91dGxpbmUgY29kZSBpcyBhbiBlbnRlcnByaXNlIGN1c3RvbSBvdXRsaW5lIGNvZGUuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkVudGVycHJpc2UiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJlbnRlcnByaXNlT3V0bGluZUNvZGVBbGlhcyIKLSAgICAgICAgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9JbnRlZ2VyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSByZWZlcmVuY2UgdG8gYW5vdGhlciBjdXN0b20gZmllbGQgZm9yIHdoaWNoIHRoaXMgaXMgYW4gYWxpYXMuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkVudGVycHJpc2VPdXRsaW5lQ29kZUFsaWFzIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmVzb3VyY2VTdWJzdGl0dXRpb25FbmFibGVkIgotICAgICAgICB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXaGV0aGVyIHRoZSBjdXN0b20gb3V0bGluZSBjb2RlIGNhbiBiZSB1c2VkIGJ5IHRoZSBSZXNvdXJjZSBTdWJzdGl0dXRpb24gV2l6YXJkIGluIE1pY3Jvc29mdCBQcm9qZWN0LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJSZXNvdXJjZVN1YnN0aXR1dGlvbkVuYWJsZWQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJsZWFmT25seSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV2hldGhlciBvciBub3QgdmFsdWVzIHNwZWNpZmllZCBpbiB0aGlzIG91dGxpbmUgY29kZSBmaWVsZCBtdXN0IGJlIGxlYWYgdmFsdWVzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJMZWFmT25seSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFsbExldmVsc1JlcXVpcmVkIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJOZXcgY29kZXMgbXVzdCBoYXZlIGFsbCBsZXZlbHMgcHJlc2VudC4gIE5vdCBhdmFpbGFibGUgZm9yIEVudGVycHJpc2UgQ29kZXMuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkFsbExldmVsc1JlcXVpcmVkIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ib25seVRhYmxlVmFsdWVzQWxsb3dlZCIKLSAgICAgICAgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV2hldGhlciB2YWx1ZXMgc3BlY2lmaWVkIG11c3QgY29tZSBmcm9tIHZhbHVlcyB0YWJsZS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iT25seVRhYmxlVmFsdWVzQWxsb3dlZCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im1hc2tzIiBlVHlwZT0iIy8vTWFza3MiCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdGFibGUgb2YgZW50cmllcyB0aGF0IGRlZmluZSB0aGUgb3V0bGluZSBjb2RlIG1hc2suIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik1hc2tzIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iT3V0bGluZUNvZGUyIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik91dGxpbmVDb2RlXy5fMV8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InVJRCIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9JbnRlZ2VyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHVuaXF1ZSBJRCBvZiB0aGUgdmFsdWUgaW4gdGhlIG91dGxpbmUgY29kZSBjb2xsZWN0aW9uLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJVSUQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJmaWVsZElEIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBmaWVsZCBJRCBpbiB0aGUgbG9jYWxpc2VkIGxhbmd1YWdlLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJGaWVsZElEIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idmFsdWVJRCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9JbnRlZ2VyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHVuaXF1ZSBJRCBpbiB0aGUgdmFsdWUgbGlzdCBhc3NvY2lhdGVkIHdpdGggdGhlIGRlZmluaXRpb24gaW4gdGhlICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dGxpbmUgY29kZSBjb2xsZWN0aW9uLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJWYWx1ZUlEIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iT3V0bGluZUNvZGUzIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik91dGxpbmVDb2RlXy5fMl8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InVJRCIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9JbnRlZ2VyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHVuaXF1ZSBJRCBvZiB0aGUgdmFsdWUgaW4gdGhlIG91dGxpbmUgY29kZSBjb2xsZWN0aW9uLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJVSUQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJmaWVsZElEIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBmaWVsZCBJRCBpbiB0aGUgbG9jYWxpc2VkIGxhbmd1YWdlLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJGaWVsZElEIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idmFsdWVJRCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9JbnRlZ2VyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHVuaXF1ZSBJRCBpbiB0aGUgdmFsdWUgbGlzdCBhc3NvY2lhdGVkIHdpdGggdGhlIGRlZmluaXRpb24gJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gdGhlIG91dGxpbmUgY29kZSBjb2xsZWN0aW9uLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJWYWx1ZUlEIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iT3V0bGluZUNvZGVzIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik91dGxpbmVDb2Rlc18uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im91dGxpbmVDb2RlIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL091dGxpbmVDb2RlIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGluZGl2aWR1YWwgb3V0bGluZSBjb2Rlcy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iT3V0bGluZUNvZGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJPdXRsaW5lTnVtYmVyVHlwZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubGFuZy5TdHJpbmciPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iT3V0bGluZU51bWJlcl8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjc3RyaW5nIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im1heExlbmd0aCIgdmFsdWU9IjUxMiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJPdmVydGltZVJhdGVGb3JtYXRUeXBlIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5tYXRoLkJpZ0ludGVnZXIiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iT3ZlcnRpbWVSYXRlRm9ybWF0Xy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImVudW1lcmF0aW9uIiB2YWx1ZT0iMSAyIDMgNCA1IDciLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iT3ZlcnRpbWVSYXRlRm9ybWF0VHlwZTEiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLm1hdGguQmlnSW50ZWdlciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJPdmVydGltZVJhdGVGb3JtYXRfLl8xXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImVudW1lcmF0aW9uIiB2YWx1ZT0iMSAyIDMgNCA1IDciLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iUGhvbmV0aWNBbGlhc1R5cGUiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLmxhbmcuU3RyaW5nIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlBob25ldGljQWxpYXNfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3N0cmluZyIvPgotICAgICAgPGRldGFpbHMga2V5PSJtYXhMZW5ndGgiIHZhbHVlPSI1MCIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJQaG9uZXRpY3NUeXBlIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5sYW5nLlN0cmluZyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJQaG9uZXRpY3NfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3N0cmluZyIvPgotICAgICAgPGRldGFpbHMga2V5PSJtYXhMZW5ndGgiIHZhbHVlPSI1MTIiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUHJlZGVjZXNzb3JMaW5rIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlByZWRlY2Vzc29yTGlua18uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InByZWRlY2Vzc29yVUlEIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0ludGVnZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIHByZWRlY2Vzc29yIHRhc2suJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlByZWRlY2Vzc29yVUlEIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idHlwZSIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9IiMvL1R5cGVUeXBlMSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBsaW5rIHR5cGUuICBWYWx1ZXMgYXJlIDA9RkYsIDE9RlMsIDI9U0YgYW5kIDM9U1MmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVHlwZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNyb3NzUHJvamVjdCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV2hldGhlciB0aGUgcHJlZGVjZXNzb3IgaXMgcGFydCBvZiBhbm90aGVyIHByb2plY3QuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkNyb3NzUHJvamVjdCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNyb3NzUHJvamVjdE5hbWUiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGV4dGVybmFsIHByZWRlY2Vzc29yIHByb2plY3QuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkNyb3NzUHJvamVjdE5hbWUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJsaW5rTGFnIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0ludGVnZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYW1vdW50IG9mIGxhZyBpbiB0ZW50aHMgb2YgYSBtaW51dGUuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkxpbmtMYWciLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJsYWdGb3JtYXQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9MYWdGb3JtYXRUeXBlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGZvcm1hdCBmb3IgZXhwcmVzc2luZyB0aGUgbGFnIGZvcm1hdC4gICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlcyBhcmU6IDM9bSwgND1lbSwgNT1oLCA2PWVoLCA3PWQsIDg9ZWQsIDk9dywgMTA9ZXcsIDExPW1vLCAxMj1lbW8sIDE5PSUsICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIwPWUlLCAzNT1tPywgMzY9ZW0/LCAzNz1oPywgMzg9ZWg/LCAzOT1kPywgNDA9ZWQ/LCA0MT13PywgNDI9ZXc/LCA0Mz1tbz8sICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ0PWVtbz8sIDUxPSU/LCA1Mj1lJT8gYW5kIDUzPW51bGwuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkxhZ0Zvcm1hdCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IlByZWZpeFR5cGUiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLmxhbmcuU3RyaW5nIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlByZWZpeF8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjc3RyaW5nIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im1heExlbmd0aCIgdmFsdWU9IjUwIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlByb2plY3QiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUHJvamVjdF8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InVJRCIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9IiMvL1VJRFR5cGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdW5pcXVlIElEIG9mIHRoZSBwcm9qZWN0LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJVSUQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJuYW1lIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iIy8vTmFtZVR5cGUzIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIG5hbWUgb2YgdGhlIHByb2plY3QuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik5hbWUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ0aXRsZSIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9IiMvL1RpdGxlVHlwZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB0aXRsZSBvZiB0aGUgcHJvamVjdC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVGl0bGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzdWJqZWN0IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vU3ViamVjdFR5cGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgc3ViamVjdCBvZiB0aGUgcHJvamVjdC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iU3ViamVjdCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNhdGVnb3J5IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vQ2F0ZWdvcnlUeXBlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGNhdGVnb3J5IG9mIHRoZSBwcm9qZWN0LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDYXRlZ29yeSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNvbXBhbnkiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9Db21wYW55VHlwZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBjb21wYW55IHRoYXQgb3ducyB0aGUgcHJvamVjdC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ29tcGFueSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im1hbmFnZXIiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9NYW5hZ2VyVHlwZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBtYW5hZ2VyIG9mIHRoZSBwcm9qZWN0LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJNYW5hZ2VyIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYXV0aG9yIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vQXV0aG9yVHlwZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBhdXRob3Igb2YgdGhlIHByb2plY3QuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkF1dGhvciIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNyZWF0aW9uRGF0ZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EYXRlVGltZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBkYXRlIHRoYXQgdGhlIHByb2plY3Qgd2FzIGNyZWF0ZWQuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkNyZWF0aW9uRGF0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJldmlzaW9uIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0ludGVnZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgbnVtYmVyIG9mIHRpbWVzIGEgcHJvamVjdCBoYXMgYmVlbiBzYXZlZC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUmV2aXNpb24iLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJsYXN0U2F2ZWQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGF0ZVRpbWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZGF0ZSB0aGF0IHRoZSBwcm9qZWN0IHdhcyBsYXN0IHNhdmVkLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJMYXN0U2F2ZWQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzY2hlZHVsZUZyb21TdGFydCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSJ0cnVlIiB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV2hldGhlciB0aGUgcHJvamVjdCBpcyBzY2hkdWxlZCBmcm9tIHRoZSBzdGFydCBkYXRlIG9yIGZpbmlzaCBkYXRlLiYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTsiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iU2NoZWR1bGVGcm9tU3RhcnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzdGFydERhdGUiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGF0ZVRpbWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgc3RhcnQgZGF0ZSBvZiB0aGUgcHJvamVjdC4gUmVxdWlyZWQgaWYgU2NoZWR1bGVGcm9tU3RhcnQgaXMgdHJ1ZS4mI3hEOyYjeEE7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlN0YXJ0RGF0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImZpbmlzaERhdGUiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGF0ZVRpbWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZmluaXNoIGRhdGUgb2YgdGhlIHByb2plY3QuIFJlcXVpcmVkIGlmIFNjaGVkdWxlRnJvbVN0YXJ0IGlzIGZhbHNlLiYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTsiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRmluaXNoRGF0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImZZU3RhcnREYXRlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vRllTdGFydERhdGVUeXBlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRmlzY2FsIFllYXIgc3RhcnRpbmcgbW9udGguIFZhbHVlcyBhcmU6ICYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTsxPUphbnVhcnksIDI9RmVicnVhcnksIDM9TWFyY2gsIDQ9QXByaWwsIDU9TWF5LCA2PUp1bmUsIDc9SnVseSwgJiN4RDsmI3hBOyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5Ozg9QXVndXN0LCA5PVNlcHRlbWJlciwgMTA9T2N0b2JlciwgMTE9Tm92ZW1iZXIsIDEyPURlY2VtYmVyICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJGWVN0YXJ0RGF0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNyaXRpY2FsU2xhY2tMaW1pdCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9JbnRlZ2VyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIG51bWJlciBvZiBkYXlzIHBhc3QgaXRzIGVuZCBkYXRlIHRoYXQgYSB0YXNrIGNhbiBnbyAmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7YmVmb3JlIE1pY3Jvc29mdCBQcm9qZWN0IG1hcmtzIHRoYXQgdGFzayBhcyBhIGNyaXRpY2FsIHRhc2suIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkNyaXRpY2FsU2xhY2tMaW1pdCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImN1cnJlbmN5RGlnaXRzIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0ludGVnZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgbnVtYmVyIG9mIGRpZ2l0cyBhZnRlciB0aGUgZGVjaW1hbCBzeW1ib2wuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkN1cnJlbmN5RGlnaXRzIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY3VycmVuY3lTeW1ib2wiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9DdXJyZW5jeVN5bWJvbFR5cGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgY3VycmVuY3kgc3ltYm9sIHVzZWQgaW4gdGhlIHByb2plY3QuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkN1cnJlbmN5U3ltYm9sIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY3VycmVuY3lTeW1ib2xQb3NpdGlvbiIKLSAgICAgICAgdW5pcXVlPSJmYWxzZSIgZVR5cGU9IiMvL0N1cnJlbmN5U3ltYm9sUG9zaXRpb25UeXBlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHBvc2l0aW9uIG9mIHRoZSBjdXJyZW5jeSBzeW1ib2wuICBWYWx1ZXMgYXJlOiAmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7MD1CZWZvcmUsIDE9QWZ0ZXIsIDI9QmVmb3JlIFdpdGggU3BhY2UsIDM9QWZ0ZXIgd2l0aCBzcGFjZS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ3VycmVuY3lTeW1ib2xQb3NpdGlvbiIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNhbGVuZGFyVUlEIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0ludGVnZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgcHJvamVjdCBjYWxlbmRhci4gIFJlZmVycyB0byBhIHZhbGlkIFVJRCBpbiB0aGUgJiN4RDsmI3hBOyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5O0NhbGVuZGFycyBlbGVtZW50IG9mIHRoZSBNaWNyb3NvZnQgUHJvamVjdCBYTUwgU2NoZW1hLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDYWxlbmRhclVJRCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImRlZmF1bHRTdGFydFRpbWUiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vVGltZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBkZWZhdWx0IHN0YXJ0IHRpbWUgb2YgbmV3IHRhc2tzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJEZWZhdWx0U3RhcnRUaW1lIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZGVmYXVsdEZpbmlzaFRpbWUiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vVGltZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBkZWZhdWx0IGZpbmlzaCB0aW1lIG9mIG5ldyB0YXNrcy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRGVmYXVsdEZpbmlzaFRpbWUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJtaW51dGVzUGVyRGF5IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0ludGVnZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgbnVtYmVyIG9mIG1pbnV0ZXMgcGVyIGRheS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTWludXRlc1BlckRheSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im1pbnV0ZXNQZXJXZWVrIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0ludGVnZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgbnVtYmVyIG9mIG1pbnV0ZXMgcGVyIHdlZWsuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik1pbnV0ZXNQZXJXZWVrIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZGF5c1Blck1vbnRoIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0ludGVnZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgbnVtYmVyIG9mIGRheXMgcGVyIG1vbnRoLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJEYXlzUGVyTW9udGgiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJkZWZhdWx0VGFza1R5cGUiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9EZWZhdWx0VGFza1R5cGVUeXBlIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIxIiB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGRlZmF1bHQgdHlwZSBvZiBuZXcgdGFza3MuIFZhbHVlcyBhcmU6ICYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTswPUZpeGVkIFVuaXRzLCAxPUZpeGVkIER1cmF0aW9uLCAyPUZpeGVkIFdvcmsuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkRlZmF1bHRUYXNrVHlwZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImRlZmF1bHRGaXhlZENvc3RBY2NydWFsIgotICAgICAgICB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iIy8vRGVmYXVsdEZpeGVkQ29zdEFjY3J1YWxUeXBlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGRlZmF1bHQgZnJvbSB3aGVyZSBmaXhlZCBjb3N0cyBhcmUgYWNjcnVlZC4gIFZhbHVlcyBhcmU6ICYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTsxPVN0YXJ0LCAyPVByb3JhdGVkLCAzPUVuZCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJEZWZhdWx0Rml4ZWRDb3N0QWNjcnVhbCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImRlZmF1bHRTdGFuZGFyZFJhdGUiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRmxvYXQiIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZGVmYXVsdCBzdGFuZGFyZCByYXRlIGZvciBuZXcgcmVzb3VyY2VzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJEZWZhdWx0U3RhbmRhcmRSYXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZGVmYXVsdE92ZXJ0aW1lUmF0ZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9GbG9hdCIgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBkZWZhdWx0IG92ZXJ0aW1lIHJhdGUgZm9yIG5ldyByZXNvdXJjZXMuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkRlZmF1bHRPdmVydGltZVJhdGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJkdXJhdGlvbkZvcm1hdCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL0R1cmF0aW9uRm9ybWF0VHlwZTUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZm9ybWF0IGZvciBleHByZXNzaW5nIHRoZSBidWxrIGR1cmF0aW9uLiAgVmFsdWVzIGFyZTogJiN4RDsmI3hBOyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OzM9bSwgND1lbSwgNT1oLCA2PWVoLCA3PWQsIDg9ZWQsIDk9dywgMTA9ZXcsIDExPW1vLCAxMj1lbW8sIDE5PSUsIDIwPWUlLCAyMT1udWxsLCAmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7MzU9bT8sIDM2PWVtPywgMzc9aD8sIDM4PWVoPywgMzk9ZD8sIDQwPWVkPywgNDE9dz8sIDQyPWV3PywgNDM9bW8/LCA0ND1lbW8/LCA1MT0lPywgNTI9ZSU/IGFuZCAmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7NTM9bnVsbC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRHVyYXRpb25Gb3JtYXQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ3b3JrRm9ybWF0IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vV29ya0Zvcm1hdFR5cGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZGVmYXVsdCB3b3JrIHVuaXQgZm9ybWF0LiBWYWx1ZXMgYXJlOiAmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7MT1tLCAyPWgsIDM9ZCwgND13LCA1PW1vIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IldvcmtGb3JtYXQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJlZGl0YWJsZUFjdHVhbENvc3RzIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV2hldGhlciBvciBub3QgYWN0dWFsIGNvc3RzIGFyZSBlZGl0YWJsZS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRWRpdGFibGVBY3R1YWxDb3N0cyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Imhvbm9yQ29uc3RyYWludHMiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0idHJ1ZSIgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldoZXRoZXIgdGFza3MgaG9ub3VyIHRoZWlyIGNvbnN0cmFpbnQgZGF0ZXMuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ikhvbm9yQ29uc3RyYWludHMiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJlYXJuZWRWYWx1ZU1ldGhvZCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL0Vhcm5lZFZhbHVlTWV0aG9kVHlwZTEiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZGVmYXVsdCBtZXRob2QgZm9yIGNhbGN1bGF0aW5nIGVhcm5lZCB2YWx1ZS4gVmFsdWVzIGFyZTogJiN4RDsmI3hBOyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OzA9UGVyY2VudCBDb21wbGV0ZSwgMT1QaHlzaWNhbCBQZXJjZW50IENvbXBsZXRlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkVhcm5lZFZhbHVlTWV0aG9kIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaW5zZXJ0ZWRQcm9qZWN0c0xpa2VTdW1tYXJ5IgotICAgICAgICB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9InRydWUiIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXaGV0aGVyIHRvIGNhbGN1bGF0ZSBzdWJ0YXNrcyBhcyBzdW1tYXJ5IHRhc2tzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJJbnNlcnRlZFByb2plY3RzTGlrZVN1bW1hcnkiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJtdWx0aXBsZUNyaXRpY2FsUGF0aHMiCi0gICAgICAgIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXaGV0aGVyIG11bHRpcGxlIGNyaXRpY2FsIHBhdGhzIGFyZSBjYWxjdWxhdGVkLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJNdWx0aXBsZUNyaXRpY2FsUGF0aHMiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJuZXdUYXNrc0VmZm9ydERyaXZlbiIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSJ0cnVlIiB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV2hldGhlciBuZXcgdGFza3MgYXJlIGVmZm9ydCBkcml2ZW4uIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik5ld1Rhc2tzRWZmb3J0RHJpdmVuIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibmV3VGFza3NFc3RpbWF0ZWQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0idHJ1ZSIgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldoZXRoZXIgdG8gc2hvdyB0aGUgZXN0aW1hdGVkIGR1cmF0aW9uIGJ5IGRlZmF1bHQuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik5ld1Rhc2tzRXN0aW1hdGVkIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic3BsaXRzSW5Qcm9ncmVzc1Rhc2tzIgotICAgICAgICB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9InRydWUiIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXaGV0aGVyIGluLXByb2dyZXNzIHRhc2tzIGNhbiBiZSBzcGxpdC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iU3BsaXRzSW5Qcm9ncmVzc1Rhc2tzIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic3ByZWFkQWN0dWFsQ29zdCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSJ0cnVlIiB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV2hldGhlciBhY3R1YWwgY29zdHMgYXJlIHNwcmVhZCB0byB0aGUgc3RhdHVzIGRhdGUuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlNwcmVhZEFjdHVhbENvc3QiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzcHJlYWRQZXJjZW50Q29tcGxldGUiCi0gICAgICAgIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXaGV0aGVyIHBlcmNlbnQgY29tcGxldGUgaXMgc3ByZWFkIHRvIHRoZSBzdGF0dXMgZGF0ZS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iU3ByZWFkUGVyY2VudENvbXBsZXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idGFza1VwZGF0ZXNSZXNvdXJjZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV2hldGhlciB1cGRhdGVzIHRvIHRhc2tzIHVwZGF0ZSByZXNvdXJjZXMuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlRhc2tVcGRhdGVzUmVzb3VyY2UiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJmaXNjYWxZZWFyU3RhcnQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlNwZWNpZmllcyB3aGV0aGVyIHRvIHVzZSBmaXNjYWwgeWVhciBudW1iZXJpbmciLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRmlzY2FsWWVhclN0YXJ0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0id2Vla1N0YXJ0RGF5IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vV2Vla1N0YXJ0RGF5VHlwZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlN0YXJ0IGRheSBvZiB0aGUgd2Vlay4gVmFsdWVzIGFyZTogJiN4RDsmI3hBOyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OzA9U3VuZGF5LCAxPU1vbmRheSwgMj1UdWVzZGF5LCAzPVdlZG5lc2RheSwgND1UaHVyc2RheSwgNT1GcmlkYXksIDY9U2F0dXJkYXkiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iV2Vla1N0YXJ0RGF5Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibW92ZUNvbXBsZXRlZEVuZHNCYWNrIgotICAgICAgICB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iJiN4RDsmI3hBOyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7U3BlY2lmaWVzIHdoZXRoZXIgdGhlIGVuZCBvZiBjb21wbGV0ZWQgcG9ydGlvbnMgb2YgdGFza3Mgc2NoZWR1bGVkIHRvIGJlZ2luIGFmdGVyIHRoZSAmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTtzdGF0dXMgZGF0ZSBidXQgYmVndW4gZWFybHkgc2hvdWxkIGJlIG1vdmVkIGJhY2sgdG8gdGhlIHN0YXR1cyBkYXRlLiYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTsiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTW92ZUNvbXBsZXRlZEVuZHNCYWNrIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibW92ZVJlbWFpbmluZ1N0YXJ0c0JhY2siCi0gICAgICAgIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSImI3hEOyYjeEE7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTtTcGVjaWZpZXMgd2hldGhlciB0aGUgYmVnaW5uaW5nIG9mIHJlbWFpbmluZyBwb3J0aW9ucyBvZiB0YXNrcyBzY2hlZHVsZWQgdG8gYmVnaW4gYWZ0ZXIgdGhlICYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5O3N0YXR1cyBkYXRlIGJ1dCBiZWd1biBlYXJseSBzaG91bGQgYmUgbW92ZWQgYmFjayB0byB0aGUgc3RhdHVzIGRhdGUuJiN4RDsmI3hBOyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJNb3ZlUmVtYWluaW5nU3RhcnRzQmFjayIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im1vdmVSZW1haW5pbmdTdGFydHNGb3J3YXJkIgotICAgICAgICB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iJiN4RDsmI3hBOyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7U3BlY2lmaWVzIHdoZXRoZXIgdGhlIGJlZ2lubmluZyBvZiByZW1haW5pbmcgcG9ydGlvbnMgb2YgdGFza3Mgc2NoZWR1bGVkIHRvIGhhdmUgYmVndW4gbGF0ZSAmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTtzaG91bGQgYmUgbW92ZWQgdXAgdG8gdGhlIHN0YXR1cyBkYXRlLiYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTsiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTW92ZVJlbWFpbmluZ1N0YXJ0c0ZvcndhcmQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJtb3ZlQ29tcGxldGVkRW5kc0ZvcndhcmQiCi0gICAgICAgIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSImI3hEOyYjeEE7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTtTcGVjaWZpZXMgd2hldGhlciB0aGUgZW5kIG9mIGNvbXBsZXRlZCBwb3J0aW9ucyBvZiB0YXNrcyBzY2hlZHVsZWQgdG8gaGF2ZSBiZWVuIGNvbXBsZXRlZCAmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTtiZWZvcmUgdGhlIHN0YXR1cyBkYXRlIGJ1dCBiZWd1biBsYXRlIHNob3VsZCBiZSBtb3ZlZCB1cCB0byB0aGUgc3RhdHVzIGRhdGUuJiN4RDsmI3hBOyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJNb3ZlQ29tcGxldGVkRW5kc0ZvcndhcmQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJiYXNlbGluZUZvckVhcm5lZFZhbHVlIgotICAgICAgICB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iIy8vQmFzZWxpbmVGb3JFYXJuZWRWYWx1ZVR5cGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgc3BlY2lmaWMgYmFzZWxpbmUgdXNlZCB0byBjYWxjdWxhdGUgVmFyaWFuY2UgdmFsdWVzLiAgVmFsdWVzIGFyZTogJiN4RDsmI3hBOyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OzA9QmFzZWxpbmUsIDE9QmFzZWxpbmUgMSwgMj1CYXNlbGluZSAyLCAzPUJhc2VsaW5lIDMsIDQ9QmFzZWxpbmUgNCwgNT1CYXNlbGluZSA1LCA2PUJhc2VsaW5lIDYsICYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTs3PUJhc2VsaW5lIDcsIDg9QmFzZWxpbmUgOCwgOT1CYXNlbGluZSA5LCAxMD1CYXNlbGluZSAxMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJCYXNlbGluZUZvckVhcm5lZFZhbHVlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYXV0b0FkZE5ld1Jlc291cmNlc0FuZFRhc2tzIgotICAgICAgICB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9InRydWUiIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXaGV0aGVyIHRvIGF1dG9tYXRpY2FsbHkgYWRkIG5ldyByZXNvdXJjZXMgdG8gdGhlIHJlc291cmNlIHBvb2wuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkF1dG9BZGROZXdSZXNvdXJjZXNBbmRUYXNrcyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InN0YXR1c0RhdGUiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGF0ZVRpbWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJEYXRlIHVzZWQgZm9yIGNhbGN1bGF0aW9uIGFuZCByZXBvcnRpbmcuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlN0YXR1c0RhdGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjdXJyZW50RGF0ZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EYXRlVGltZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBzeXN0ZW0gZGF0ZSB0aGF0IHRoZSBYTUwgd2FzIGdlbmVyYXRlZC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ3VycmVudERhdGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJtaWNyb3NvZnRQcm9qZWN0U2VydmVyVVJMIgotICAgICAgICB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXaGV0aGVyIHRoZSBwcm9qZWN0IHdhcyBjcmVhdGVkIGJ5IGEgUHJvamVjdCBTZXJ2ZXIgdXNlciBhcyBvcHBvc2VkIHRvIGFuIE5UIHVzZXIuJiN4RDsmI3hBOyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJNaWNyb3NvZnRQcm9qZWN0U2VydmVyVVJMIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYXV0b2xpbmsiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldoZXRoZXIgdG8gYXV0b2xpbmsgaW5zZXJ0ZWQgb3IgbW92ZWQgdGFza3MuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkF1dG9saW5rIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibmV3VGFza1N0YXJ0RGF0ZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL05ld1Rhc2tTdGFydERhdGVUeXBlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGRlZmF1bHQgZGF0ZSBmb3IgbmV3IHRhc2tzIHN0YXJ0LiAgVmFsdWVzIGFyZTogJiN4RDsmI3hBOyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OzA9UHJvamVjdCBTdGFydCBEYXRlLCAxPUN1cnJlbnQgRGF0ZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJOZXdUYXNrU3RhcnREYXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZGVmYXVsdFRhc2tFVk1ldGhvZCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL0RlZmF1bHRUYXNrRVZNZXRob2RUeXBlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGRlZmF1bHQgZWFybmVkIHZhbHVlIG1ldGhvZCBmb3IgdGFza3MuICBWYWx1ZXMgYXJlOiAmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7MD1QZXJjZW50IENvbXBsZXRlLCAxPVBoeXNpY2FsIFBlcmNlbnQgQ29tcGxldGUiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRGVmYXVsdFRhc2tFVk1ldGhvZCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InByb2plY3RFeHRlcm5hbGx5RWRpdGVkIgotICAgICAgICB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXaGV0aGVyIHRoZSBwcm9qZWN0IFhNTCB3YXMgZWRpdGVkLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJQcm9qZWN0RXh0ZXJuYWxseUVkaXRlZCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImV4dGVuZGVkQ3JlYXRpb25EYXRlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RhdGVUaW1lIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRGF0ZSB1c2VkIGZvciBjYWxjdWxhdGlvbiBhbmQgcmVwb3J0aW5nLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJFeHRlbmRlZENyZWF0aW9uRGF0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFjdHVhbHNJblN5bmMiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldoZXRoZXIgYWxsIGFjdHVhbCB3b3JrIGhhcyBiZWVuIHN5bmNocm9uaXplZCB3aXRoIHRoZSBwcm9qZWN0LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJBY3R1YWxzSW5TeW5jIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmVtb3ZlRmlsZVByb3BlcnRpZXMiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldoZXRoZXIgdG8gcmVtb3ZlIGFsbCBmaWxlIHByb3BlcnRpZXMgb24gc2F2ZS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUmVtb3ZlRmlsZVByb3BlcnRpZXMiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhZG1pblByb2plY3QiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldoZXRoZXIgdGhlIHByb2plY3QgaXMgYW4gYWRtaW5pc3RyYXRpdmUgcHJvamVjdC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQWRtaW5Qcm9qZWN0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ib3V0bGluZUNvZGVzIiBlVHlwZT0iIy8vT3V0bGluZUNvZGVzIgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGNvbGxlY3Rpb24gb2Ygb3V0bGluZSBjb2RlIGRlZmluaXRpb25zIGFzc29jaWF0ZWQgd2l0aCB0aGUgcHJvamVjdC4gIFRoZXNlIGNvZGVzIG1heSBiZSBhc3NvY2lhdGVkIG9ubHkgd2l0aCB0aGlzIHByb2plY3QsIG9yIG1heSBiZSBjb21tb24gYW1vbmcgc2V2ZXJhbCBwcm9qZWN0cyAoZW50ZXJwcmlzZSBjb2RlcykuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik91dGxpbmVDb2RlcyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9IndCU01hc2tzIiBlVHlwZT0iIy8vV0JTTWFza3MiCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdGFibGUgb2YgZW50cmllcyB0aGF0IGRlZmluZSB0aGUgb3V0bGluZSBjb2RlIG1hc2suIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IldCU01hc2tzIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZXh0ZW5kZWRBdHRyaWJ1dGVzIiBlVHlwZT0iIy8vRXh0ZW5kZWRBdHRyaWJ1dGVzIgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGNvbGxlY3Rpb24gb2YgZXh0ZW5kZWQgYXR0cmlidXRlIChjdXN0b20gZmllbGQpIGRlZmluaXRpb25zICYjeEQ7JiN4QTsgICAgICAgIGFzc29jaWF0ZWQgd2l0aCB0aGUgcHJvamVjdC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRXh0ZW5kZWRBdHRyaWJ1dGVzIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iY2FsZW5kYXJzIiBlVHlwZT0iIy8vQ2FsZW5kYXJzIgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGNvbGxlY3Rpb24gb2YgY2FsZW5kYXJzIHRoYXQgaXMgYXNzb2NpYXRlZCB3aXRoIHRoZSAmI3hEOyYjeEE7ICAgICAgICBwcm9qZWN0LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDYWxlbmRhcnMiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ0YXNrcyIgZVR5cGU9IiMvL1Rhc2tzIgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGNvbGxlY3Rpb24gb2YgdGFza3MgdGhhdCBtYWtlIHVwIHRoZSBwcm9qZWN0LiYjeEQ7JiN4QTsgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJUYXNrcyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InJlc291cmNlcyIgZVR5cGU9IiMvL1Jlc291cmNlcyIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBjb2xsZWN0aW9uIG9mIHJlc291cmNlcyB0aGF0IG1ha2UgdXAgdGhlIHByb2plY3QuJiN4RDsmI3hBOyAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlJlc291cmNlcyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImFzc2lnbm1lbnRzIiBlVHlwZT0iIy8vQXNzaWdubWVudHMiCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgY29sbGVjdGlvbiBvZiBhc3NpZ25tZW50cyB0aGF0IG1ha2UgdXAgdGhlIHByb2plY3QuJiN4RDsmI3hBOyAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQXNzaWdubWVudHMiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJSYXRlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlJhdGVfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyYXRlc0Zyb20iIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGxvd2VyQm91bmQ9IjEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGF0ZVRpbWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZGF0ZSB0aGF0IHRoZSByYXRlIGJlY29tZXMgZWZmZWN0aXZlLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJSYXRlc0Zyb20iLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyYXRlc1RvIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBsb3dlckJvdW5kPSIxIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RhdGVUaW1lIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGxhc3QgZGF0ZSB0aGF0IHRoZSByYXRlIGlzIGVmZmVjdGl2ZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUmF0ZXNUbyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJhdGVUYWJsZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL1JhdGVUYWJsZVR5cGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIHJhdGUgdGFibGUgZm9yIHRoZSByZXNvdXJjZS4gJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVzIGFyZTogMD1BLCAxPUIsIDI9QywgMz1ELCA0PUUiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUmF0ZVRhYmxlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic3RhbmRhcmRSYXRlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RlY2ltYWwiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgc3RhbmRhcmQgcmF0ZSBmb3IgdGhlIHJlc291cmNlIGZvciB0aGUgcGVyaW9kIHNwZWNpZmllZC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iU3RhbmRhcmRSYXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic3RhbmRhcmRSYXRlRm9ybWF0IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vU3RhbmRhcmRSYXRlRm9ybWF0VHlwZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB1bml0cyB1c2VkIGJ5IE1pY3Jvc29mdCBQcm9qZWN0IHRvIGRpc3BsYXkgdGhlIHN0YW5kYXJkIHJhdGUuICAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxPW0sIDI9aCwgMz1kLCA0PXcsIDU9bW8sIDc9eSYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJTdGFuZGFyZFJhdGVGb3JtYXQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJvdmVydGltZVJhdGUiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGVjaW1hbCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBvdmVydGltZSByYXRlIGZvciB0aGUgcmVzb3VyY2UgZm9yIHRoZSBwZXJpb2Qgc3BlY2lmaWVkLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJPdmVydGltZVJhdGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJvdmVydGltZVJhdGVGb3JtYXQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9PdmVydGltZVJhdGVGb3JtYXRUeXBlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHVuaXRzIHVzZWQgYnkgTWljcm9zb2Z0IFByb2plY3QgdG8gZGlzcGxheSB0aGUgb3ZlcnRpbWUgcmF0ZS4gICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE9bSwgMj1oLCAzPWQsIDQ9dywgNT1tbywgNz15Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik92ZXJ0aW1lUmF0ZUZvcm1hdCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNvc3RQZXJVc2UiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGVjaW1hbCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBjb3N0IHBlciB1c2Ugb2YgdGhlIHJlc291cmNlLiAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHZhbHVlIGlzIGFzIG9mIHRoZSBjdXJyZW50IGRhdGUgaWYgYSByYXRlIHRhYmxlIGV4aXN0cyBmb3IgdGhlIHJlc291cmNlLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDb3N0UGVyVXNlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUmF0ZXMiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUmF0ZXNfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJyYXRlIiB1cHBlckJvdW5kPSIyNSIgZVR5cGU9IiMvL1JhdGUiCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZGVmaW5pdGlvbiBvZiBhIHRpbWUgcGVyaW9kLCBhbmQgdGhlIHJhdGVzIGFwcGxpY2FibGUgZm9yICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSByZXNvdXJjZSBkdXJpbmcgdGhhdCBwZXJpb2QuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlJhdGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJSYXRlVGFibGVUeXBlIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5tYXRoLkJpZ0ludGVnZXIiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUmF0ZVRhYmxlXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImVudW1lcmF0aW9uIiB2YWx1ZT0iMCAxIDIgMyA0Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlJlc291cmNlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlJlc291cmNlXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idUlEIiB1bmlxdWU9ImZhbHNlIiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0ludGVnZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIHJlc291cmNlLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJVSUQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpRCIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9JbnRlZ2VyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHBvc2l0aW9uIGlkZW50aWZpZXIgb2YgdGhlIHJlc291cmNlIHdpdGhpbiB0aGUgbGlzdCBvZiByZXNvdXJjZXMuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IklEIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibmFtZSIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9IiMvL05hbWVUeXBlMSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBuYW1lIG9mIHRoZSByZXNvdXJjZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTmFtZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InR5cGUiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSIjLy9UeXBlVHlwZTQiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdHlwZSBvZiByZXNvdXJjZS4gVmFsdWVzIGFyZTogMD1NYXRlcmlhbCwgMT1Xb3JrJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlR5cGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpc051bGwiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlNwZWNpZmllcyB3aGV0aGVyIHRoZSByZXNvdXJjZSBpcyBudWxsLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJJc051bGwiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpbml0aWFscyIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL0luaXRpYWxzVHlwZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBpbml0aWFscyBvZiB0aGUgcmVzb3VyY2UuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkluaXRpYWxzIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icGhvbmV0aWNzIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vUGhvbmV0aWNzVHlwZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBwaG9uZXRpYyBzcGVsbGluZyBvZiB0aGUgcmVzb3VyY2UgbmFtZS4gICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZvciB1c2Ugd2l0aCBKYXBhbmVzZSBvbmx5LiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJQaG9uZXRpY3MiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJuVEFjY291bnQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9OVEFjY291bnRUeXBlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIE5UIGFjY291bnQgYXNzb2NpYXRlZCB3aXRoIHRoZSByZXNvdXJjZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTlRBY2NvdW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibWF0ZXJpYWxMYWJlbCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL01hdGVyaWFsTGFiZWxUeXBlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHVuaXQgb2YgbWVhc3VyZSBmb3IgdGhlIG1hdGVyaWFsIHJlc291cmNlLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJNYXRlcmlhbExhYmVsIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY29kZSIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9IiMvL0NvZGVUeXBlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGNvZGUgb3Igb3RoZXIgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHJlc291cmNlLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDb2RlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZ3JvdXAiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSIjLy9Hcm91cFR5cGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZ3JvdXAgdG8gd2hpY2ggdGhlIHJlc291cmNlIGJlbG9uZ3MuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ikdyb3VwIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0id29ya0dyb3VwIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vV29ya0dyb3VwVHlwZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB0eXBlIG9mIHdvcmtncm91cCB0byB3aGljaCB0aGUgcmVzb3VyY2UgYmVsb25ncy4gJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVzIGFyZTogMD1EZWZhdWx0LCAxPU5vbmUsIDI9RW1haWwsIDM9V2ViJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IldvcmtHcm91cCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImVtYWlsQWRkcmVzcyIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL0VtYWlsQWRkcmVzc1R5cGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZW1haWwgYWRkcmVzcyBvZiB0aGUgcmVzb3VyY2UuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkVtYWlsQWRkcmVzcyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Imh5cGVybGluayIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL0h5cGVybGlua1R5cGUxIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHRpdGxlIG9mIHRoZSBoeXBlcmxpbmsgYXNzb2NpYXRlZCB3aXRoIHRoZSByZXNvdXJjZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iSHlwZXJsaW5rIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaHlwZXJsaW5rQWRkcmVzcyIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL0h5cGVybGlua0FkZHJlc3NUeXBlMSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBoeXBlcmxpbmsgYXNzb2NpYXRlZCB3aXRoIHRoZSByZXNvdXJjZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iSHlwZXJsaW5rQWRkcmVzcyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Imh5cGVybGlua1N1YkFkZHJlc3MiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9IeXBlcmxpbmtTdWJBZGRyZXNzVHlwZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBkb2N1bWVudCBib29rbWFyayBvZiB0aGUgaHlwZXJsaW5rIGFzc29jaWF0ZWQgd2l0aCB0aGUgcmVzb3VyY2UuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ikh5cGVybGlua1N1YkFkZHJlc3MiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJtYXhVbml0cyIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9GbG9hdCIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iMS4wIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIG1heGltdW0gbnVtYmVyIG9mIHVuaXRzIHRoYXQgdGhlIHJlc291cmNlIGlzIGF2YWlsYWJsZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTWF4VW5pdHMiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwZWFrVW5pdHMiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRmxvYXQiIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgbGFyZ2VzdCBudW1iZXIgb2YgdW5pdHMgYXNzaWduZWQgdG8gdGhlIHJlc291cmNlIGF0IGFueSB0aW1lLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJQZWFrVW5pdHMiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJvdmVyQWxsb2NhdGVkIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXaGV0aGVyIHRoZSByZXNvdXJjZSBpcyBvdmVyYWxsb2NhdGVkLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJPdmVyQWxsb2NhdGVkIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYXZhaWxhYmxlRnJvbSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EYXRlVGltZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBmaXJzdCBkYXRlIHRoYXQgdGhlIHJlc291cmNlIGlzIGF2YWlsYWJsZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQXZhaWxhYmxlRnJvbSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImF2YWlsYWJsZVRvIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RhdGVUaW1lIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGxhc3QgZGF0ZSB0aGUgcmVzb3VyY2UgaXMgYXZhaWxhYmxlLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJBdmFpbGFibGVUbyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InN0YXJ0IiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RhdGVUaW1lIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHNjaGVkdWxlZCBzdGFydCBkYXRlIG9mIHRoZSByZXNvdXJjZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iU3RhcnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJmaW5pc2giIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGF0ZVRpbWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgc2NoZWR1bGVkIGZpbmlzaCBkYXRlIG9mIHRoZSByZXNvdXJjZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRmluaXNoIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY2FuTGV2ZWwiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldoZXRoZXIgdGhlIHJlc291cmNlIGNhbiBiZSBsZXZlbGVkLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDYW5MZXZlbCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFjY3J1ZUF0IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vQWNjcnVlQXQiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJIb3cgY29zdCBpcyBhY2NydWVkIGFnYWluc3QgdGhlIHJlc291cmNlLiAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZXMgYXJlOiAxPVN0YXJ0LCAyPUVuZCwgMz1Qcm9yYXRlZCYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJBY2NydWVBdCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9IndvcmsiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRHVyYXRpb24iPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdG90YWwgd29yayBhc3NpZ25lZCB0byB0aGUgcmVzb3VyY2UgYWNyb3NzIGFsbCBhc3NpZ25lZCB0YXNrcy4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iV29yayIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJlZ3VsYXJXb3JrIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0R1cmF0aW9uIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGFtb3VudCBvZiBub24tb3ZlcnRpbWUgd29yayBhc3NpZ25lZCB0byB0aGUgcmVzb3VyY2UuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlJlZ3VsYXJXb3JrIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ib3ZlcnRpbWVXb3JrIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0R1cmF0aW9uIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGFtb3VudCBvZiBvdmVydGltZSB3b3JrIGFzc2lnbmVkIHRvIHRoZSByZXNvdXJjZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iT3ZlcnRpbWVXb3JrIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYWN0dWFsV29yayIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EdXJhdGlvbiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBhbW91bnQgb2YgYWN0dWFsIHdvcmsgcGVyZm9ybWVkIGJ5IHRoZSByZXNvdXJjZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQWN0dWFsV29yayIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJlbWFpbmluZ1dvcmsiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRHVyYXRpb24iPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYW1vdW50IG9mIHJlbWFpbmluZyB3b3JrIHJlcXVpcmVkIHRvIGNvbXBsZXRlIGFsbCBhc3NpZ25lZCB0YXNrcy4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUmVtYWluaW5nV29yayIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFjdHVhbE92ZXJ0aW1lV29yayIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EdXJhdGlvbiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBhbW91bnQgb2YgYWN0dWFsIG92ZXJ0aW1lIHdvcmsgcGVyZm9ybWVkIGJ5IHRoZSByZXNvdXJjZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQWN0dWFsT3ZlcnRpbWVXb3JrIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmVtYWluaW5nT3ZlcnRpbWVXb3JrIgotICAgICAgICB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0R1cmF0aW9uIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGFtb3VudCBvZiByZW1haW5pbmcgb3ZlcnRpbWUgd29yayByZXF1aXJlZCB0byBjb21wbGV0ZSBhbGwgdGFza3MuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlJlbWFpbmluZ092ZXJ0aW1lV29yayIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InBlcmNlbnRXb3JrQ29tcGxldGUiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vSW50ZWdlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBwZXJjZW50YWdlIG9mIHdvcmsgY29tcGxldGVkIGFjcm9zcyBhbGwgdGFza3MuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlBlcmNlbnRXb3JrQ29tcGxldGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzdGFuZGFyZFJhdGUiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGVjaW1hbCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBzdGFuZGFyZCByYXRlIG9mIHRoZSByZXNvdXJjZS4gJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyB2YWx1ZSBpcyBhcyBvZiB0aGUgY3VycmVudCBkYXRlIGlmIGEgcmF0ZSB0YWJsZSBleGlzdHMgZm9yIHRoZSByZXNvdXJjZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iU3RhbmRhcmRSYXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic3RhbmRhcmRSYXRlRm9ybWF0IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vU3RhbmRhcmRSYXRlRm9ybWF0VHlwZTEiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdW5pdHMgdXNlZCBieSBNaWNyb3NvZnQgUHJvamVjdCB0byBkaXNwbGF5IHRoZSBzdGFuZGFyZCByYXRlLiAgJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMT1tLCAyPWgsIDM9ZCwgND13LCA1PW1vLCA3PXksIDg9bWF0ZXJpYWwgcmVzb3VyY2UgcmF0ZSAob3IgYmxhbmsgc3ltYm9sIHNwZWNpZmllZCkmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iU3RhbmRhcmRSYXRlRm9ybWF0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY29zdCIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EZWNpbWFsIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHRvdGFsIHByb2plY3QgY29zdCBmb3IgdGhlIHJlc291cmNlIGFjcm9zcyBhbGwgYXNzaWduZWQgdGFza3MuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkNvc3QiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJvdmVydGltZVJhdGUiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGVjaW1hbCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBvdmVydGltZSByYXRlIG9mIHRoZSByZXNvdXJjZS4gJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyB2YWx1ZSBpcyBhcyBvZiB0aGUgY3VycmVudCBkYXRlIGlmIGEgcmF0ZSB0YWJsZSBleGlzdHMgZm9yIHRoZSByZXNvdXJjZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iT3ZlcnRpbWVSYXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ib3ZlcnRpbWVSYXRlRm9ybWF0IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vT3ZlcnRpbWVSYXRlRm9ybWF0VHlwZTEiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdW5pdHMgdXNlZCBieSBNaWNyb3NvZnQgUHJvamVjdCB0byBkaXNwbGF5IHRoZSBvdmVydGltZSByYXRlLiAgJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMT1tLCAyPWgsIDM9ZCwgND13LCA1PW1vLCA3PXkmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iT3ZlcnRpbWVSYXRlRm9ybWF0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ib3ZlcnRpbWVDb3N0IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RlY2ltYWwiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdG90YWwgb3ZlcnRpbWUgY29zdCBmb3IgdGhlIHJlc291cmNlIGluY2x1ZGluZyBhY3R1YWwgYW5kIHJlbWFpbmluZyBvdmVydGltZSBjb3N0cy4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iT3ZlcnRpbWVDb3N0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY29zdFBlclVzZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EZWNpbWFsIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGNvc3QgcGVyIHVzZSBvZiB0aGUgcmVzb3VyY2UuIFRoaXMgdmFsdWUgaXMgYXMgb2YgdGhlIGN1cnJlbnQgZGF0ZSBpZiBhIHJhdGUgdGFibGUgJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhpc3RzIGZvciB0aGUgcmVzb3VyY2UuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkNvc3RQZXJVc2UiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhY3R1YWxDb3N0IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RlY2ltYWwiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYWN0dWFsIGNvc3QgaW5jdXJyZWQgYnkgdGhlIHJlc291cmNlIGFjcm9zcyBhbGwgYXNzaWduZWQgdGFza3MuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkFjdHVhbENvc3QiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhY3R1YWxPdmVydGltZUNvc3QiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGVjaW1hbCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBhY3R1YWwgb3ZlcnRpbWUgY29zdCBpbmN1cnJlZCBieSB0aGUgcmVzb3VyY2UgYWNyb3NzIGFsbCBhc3NpZ25lZCB0YXNrcy4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQWN0dWFsT3ZlcnRpbWVDb3N0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmVtYWluaW5nQ29zdCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EZWNpbWFsIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHJlbWFpbmluZyBwcm9qZWN0ZWQgY29zdCBvZiB0aGUgcmVzb3VyY2UgdG8gY29tcGxldGUgYWxsIGFzc2lnbmVkIHRhc2tzLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJSZW1haW5pbmdDb3N0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmVtYWluaW5nT3ZlcnRpbWVDb3N0IgotICAgICAgICB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RlY2ltYWwiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgcmVtYWluaW5nIHByb2plY3RlZCBvdmVydGltZSBjb3N0IG9mIHRoZSByZXNvdXJjZSB0byBjb21wbGV0ZSBhbGwgYXNzaWduZWQgdGFza3MuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlJlbWFpbmluZ092ZXJ0aW1lQ29zdCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9IndvcmtWYXJpYW5jZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9GbG9hdCIgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIGJhc2VsaW5lIHdvcmsgYW5kIHRoZSB3b3JrIGFzIG1pbnV0ZXMgeCAxMDAwLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJXb3JrVmFyaWFuY2UiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjb3N0VmFyaWFuY2UiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRmxvYXQiIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBiYXNlbGluZSBjb3N0IGFuZCB0aGUgY29zdC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ29zdFZhcmlhbmNlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic1YiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRmxvYXQiCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJFYXJuZWQgdmFsdWUgc2NoZWR1bGUgdmFyaWFuY2UsIHRocm91Z2ggdGhlIHByb2plY3Qgc3RhdHVzIGRhdGUuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlNWIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY1YiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRmxvYXQiCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJFYXJuZWQgdmFsdWUgY29zdCB2YXJpYW5jZSwgdGhyb3VnaCB0aGUgcHJvamVjdCBzdGF0dXMgZGF0ZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ1YiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhQ1dQIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Zsb2F0IgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGFjdHVhbCBjb3N0IG9mIHRoZSB3b3JrIHBlcmZvcm1lZCBieSB0aGUgcmVzb3VyY2UgZm9yIHRoZSBwcm9qZWN0IHRvLWRhdGUuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkFDV1AiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjYWxlbmRhclVJRCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9JbnRlZ2VyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHJlc291cmNlIGNhbGVuZGFyLlJlZmVycyB0byBhIHZhbGlkIFVJRCBpbiB0aGUgQ2FsZW5kYXJzIGVsZW1lbnQgb2YgJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIE1pY3Jvc29mdCBQcm9qZWN0IFhNTCBTY2hlbWEuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkNhbGVuZGFyVUlEIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibm90ZXMiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGV4dCBub3RlcyBhc3NvY2lhdGVkIHdpdGggdGhlIHJlc291cmNlLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJOb3RlcyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImJDV1MiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRmxvYXQiCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYnVkZ2V0IGNvc3Qgb2Ygd29yayBzY2hlZHVsZWQgZm9yIHRoZSByZXNvdXJjZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQkNXUyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImJDV1AiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRmxvYXQiCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYnVkZ2V0ZWQgY29zdCBvZiBvZiB0aGUgd29yayBwZXJmb3JtZWQgYnkgdGhlIHJlc291cmNlIGZvciB0aGUgcHJvamVjdCB0by1kYXRlLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJCQ1dQIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaXNHZW5lcmljIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJTcGVjaWZpZXMgd2hldGhlciB0aGUgcmVzb3VyY2UgaXMgZ2VuZXJpYy4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iSXNHZW5lcmljIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaXNJbmFjdGl2ZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iU3BlY2lmaWVzIHdoZXRoZXIgdGhlIHJlc291cmNlIGlzIHNldCB0byBpbmFjdGl2ZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iSXNJbmFjdGl2ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImlzRW50ZXJwcmlzZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iU3BlY2lmaWVzIHdoZXRoZXIgdGhlIHJlc291cmNlIGlzIGFuIEVudGVycHJpc2UgcmVzb3VyY2UuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IklzRW50ZXJwcmlzZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImJvb2tpbmdUeXBlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vQm9va2luZ1R5cGVUeXBlMSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlNwZWNpZmllcyB0aGUgYm9va2luZyB0eXBlIG9mIHRoZSByZXNvdXJjZS4gMT1Db21taXRlZCwgMj1Qcm9wb3NlZCYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJCb29raW5nVHlwZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFjdHVhbFdvcmtQcm90ZWN0ZWQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRHVyYXRpb24iPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJTcGVjaWZpZXMgdGhlIGR1cmF0aW9uIHRocm91Z2ggd2hpY2ggYWN0dWFsIHdvcmsgaXMgcHJvdGVjdGVkLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJBY3R1YWxXb3JrUHJvdGVjdGVkIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkIgotICAgICAgICB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0R1cmF0aW9uIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iU3BlY2lmaWVzIHRoZSBkdXJhdGlvbiB0aHJvdWdoIHdoaWNoIGFjdHVhbCBvdmVydGltZSB3b3JrIGlzIHByb3RlY3RlZC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYWN0aXZlRGlyZWN0b3J5R1VJRCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL0FjdGl2ZURpcmVjdG9yeUdVSURUeXBlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIEFjdGl2ZSBEaXJlY3RvcnkgR1VJRCBmb3IgdGhlIHJlc291cmNlLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJBY3RpdmVEaXJlY3RvcnlHVUlEIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY3JlYXRpb25EYXRlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RhdGVUaW1lIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGRhdGUgdGhhdCB0aGUgcmVzb3VyY2Ugd2FzIGNyZWF0ZWQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkNyZWF0aW9uRGF0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImV4dGVuZGVkQXR0cmlidXRlIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL0V4dGVuZGVkQXR0cmlidXRlMyIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB2YWx1ZSBvZiBhbiBleHRlbmRlZCBhdHRyaWJ1dGUuICBUd28gcGllY2VzIG9mIGRhdGEgYXJlIG5lY2Vzc2FyeSAtICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEgcG9pbnRlciBiYWNrIHRvIHRoZSBleHRlbmRlZCBhdHRyaWJ1dGUgdGFibGUgd2hpY2ggaXMgc3BlY2lmaWVkIGVpdGhlciBieSB0aGUgdW5pcXVlIElEIG9yIHRoZSBGaWVsZCBJRCwgJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIHRoZSB2YWx1ZSB3aGljaCBpcyBzcGVjaWZpZWQgZWl0aGVyIHdpdGggdGhlIHZhbHVlLCBvciBhIHBvaW50ZXIgYmFjayB0byB0aGUgdmFsdWUgbGlzdC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRXh0ZW5kZWRBdHRyaWJ1dGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJiYXNlbGluZSIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9CYXNlbGluZTIiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYmFzZWxpbmUgdmFsdWVzIGZvciB0aGUgcmVzb3VyY2VzLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJCYXNlbGluZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im91dGxpbmVDb2RlIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL091dGxpbmVDb2RlMyIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB2YWx1ZSBvZiBhbiBvdXRsaW5lIGNvZGUuICBUd28gcGllY2VzIG9mIGRhdGEgYXJlIG5lY2Vzc2FyeSAtIGEgcG9pbnRlciBiYWNrIHRvICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBvdXRsaW5lIGNvZGUgdGFibGUgd2hpY2ggaXMgc3BlY2lmaWVkIGVpdGhlciBieSB0aGUgdW5pcXVlIElEIG9yIHRoZSBGaWVsZCBJRCwgYW5kIHRoZSB2YWx1ZSB3aGljaCBpcyAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGVjaWZpZWQgZWl0aGVyIHdpdGggdGhlIHZhbHVlLCBvciBhIHBvaW50ZXIgYmFjayB0byB0aGUgdmFsdWUgbGlzdC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iT3V0bGluZUNvZGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJhdmFpbGFiaWxpdHlQZXJpb2RzIiBlVHlwZT0iIy8vQXZhaWxhYmlsaXR5UGVyaW9kcyIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgY29sbGVjdGlvbiBvZiBwZXJpb2RzIGR1cmluZyB3aGljaCB0aGUgcmVzb3VyY2UgaXMgYXZhaWxhYmxlLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJBdmFpbGFiaWxpdHlQZXJpb2RzIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icmF0ZXMiIGVUeXBlPSIjLy9SYXRlcyIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgY29sbGVjdGlvbiBvZiBwZXJpb2RzIGFuZCB0aGUgcmF0ZXMgYXNzb2NpYXRlZCB3aXRoIGVhY2ggb25lLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJSYXRlcyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InRpbWVwaGFzZWREYXRhIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL1RpbWVwaGFzZWREYXRhVHlwZSIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB0aW1lIHBoYXNlZCBkYXRhJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlRpbWVwaGFzZWREYXRhIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUmVzb3VyY2VzIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlJlc291cmNlc18uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InJlc291cmNlIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL1Jlc291cmNlIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlcmUgbXVzdCBiZSBhdCBsZWFzdCBvbmUgcmVzb3VyY2UgaW4gZWFjaCBSZXNvdXJjZXMgY29sbGVjdGlvbi4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUmVzb3VyY2UiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJSb2xsdXBUeXBlVHlwZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubWF0aC5CaWdJbnRlZ2VyIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlJvbGx1cFR5cGVfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXIiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iZW51bWVyYXRpb24iIHZhbHVlPSIwIDEgMiAzIDQgNSA2IDciLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iU3RhbmRhcmRSYXRlRm9ybWF0VHlwZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubWF0aC5CaWdJbnRlZ2VyIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlN0YW5kYXJkUmF0ZUZvcm1hdF8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjaW50ZWdlciIvPgotICAgICAgPGRldGFpbHMga2V5PSJlbnVtZXJhdGlvbiIgdmFsdWU9IjEgMiAzIDQgNSA3Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IlN0YW5kYXJkUmF0ZUZvcm1hdFR5cGUxIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5tYXRoLkJpZ0ludGVnZXIiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iU3RhbmRhcmRSYXRlRm9ybWF0Xy5fMV8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjaW50ZWdlciIvPgotICAgICAgPGRldGFpbHMga2V5PSJlbnVtZXJhdGlvbiIgdmFsdWU9IjEgMiAzIDQgNSA3IDgiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iU3ViamVjdFR5cGUiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLmxhbmcuU3RyaW5nIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlN1YmplY3RfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3N0cmluZyIvPgotICAgICAgPGRldGFpbHMga2V5PSJtYXhMZW5ndGgiIHZhbHVlPSI1MTIiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iU3VicHJvamVjdE5hbWVUeXBlIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5sYW5nLlN0cmluZyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJTdWJwcm9qZWN0TmFtZV8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjc3RyaW5nIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im1heExlbmd0aCIgdmFsdWU9IjUxMiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJUYXNrIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlRhc2tfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ1SUQiIHVuaXF1ZT0iZmFsc2UiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vSW50ZWdlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB1bmlxdWUgSUQgb2YgdGhlIHRhc2suJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlVJRCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImlEIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0ludGVnZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgcG9zaXRpb24gaWRlbnRpZmllciBvZiB0aGUgdGFzayB3aXRoaW4gdGhlIGxpc3Qgb2YgdGFza3MuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IklEIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibmFtZSIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9IiMvL05hbWVUeXBlMiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBuYW1lIG9mIHRoZSB0YXNrLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJOYW1lIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idHlwZSIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9IiMvL1R5cGVUeXBlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHR5cGUgb2YgdGFzay4gJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVzIGFyZTogMD1GaXhlZCBVbml0cywgMT1GaXhlZCBEdXJhdGlvbiwgMj1GaXhlZCBXb3JrLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJUeXBlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaXNOdWxsIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJTcGVjaWZpZXMgd2hldGhlciB0aGUgdGFzayBpcyBudWxsLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJJc051bGwiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjcmVhdGVEYXRlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RhdGVUaW1lIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGRhdGUgdGhhdCB0aGUgdGFzayB3YXMgY3JlYXRlZC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ3JlYXRlRGF0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNvbnRhY3QiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9Db250YWN0VHlwZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBjb250YWN0IHBlcnNvbiBmb3IgdGhlIHRhc2suJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkNvbnRhY3QiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ3QlMiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHdvcmsgYnJlYWtkb3duIHN0cnVjdHVyZSBjb2RlIG9mIHRoZSB0YXNrLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJXQlMiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ3QlNMZXZlbCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgcmlnaHRtb3N0IFdCUyBsZXZlbCBvZiB0aGUgdGFzay4gJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IldCU0xldmVsIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ib3V0bGluZU51bWJlciIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL091dGxpbmVOdW1iZXJUeXBlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIG91dGxpbmUgbnVtYmVyIG9mIHRoZSB0YXNrLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJPdXRsaW5lTnVtYmVyIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ib3V0bGluZUxldmVsIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0ludGVnZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgb3V0bGluZSBsZXZlbCBvZiB0aGUgdGFzay4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iT3V0bGluZUxldmVsIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icHJpb3JpdHkiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vSW50ZWdlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBwcmlvcml0eSBvZiB0aGUgdGFzayBmcm9tIDAgdG8gMTAwMC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUHJpb3JpdHkiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzdGFydCIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EYXRlVGltZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBzY2hlZHVsZWQgc3RhcnQgZGF0ZSBvZiB0aGUgdGFzay4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iU3RhcnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJmaW5pc2giIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGF0ZVRpbWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgc2NoZWR1bGVkIGZpbmlzaCBkYXRlIG9mIHRoZSB0YXNrLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJGaW5pc2giLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJkdXJhdGlvbiIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EdXJhdGlvbiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBwbGFubmVkIGR1cmF0aW9uIG9mIHRoZSB0YXNrLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJEdXJhdGlvbiIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImR1cmF0aW9uRm9ybWF0IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vRHVyYXRpb25Gb3JtYXRUeXBlNCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBmb3JtYXQgZm9yIGV4cHJlc3NpbmcgdGhlIER1cmF0aW9uIG9mIHRoZSBUYXNrLiAgJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVzIGFyZTogMz1tLCA0PWVtLCA1PWgsIDY9ZWgsIDc9ZCwgOD1lZCwgOT13LCAxMD1ldywgMTE9bW8sIDEyPWVtbywgMTk9JSwgJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjA9ZSUsIDIxPW51bGwsIDM1PW0/LCAzNj1lbT8sIDM3PWg/LCAzOD1laD8sIDM5PWQ/LCA0MD1lZD8sIDQxPXc/LCA0Mj1ldz8sICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQzPW1vPywgNDQ9ZW1vPywgNTE9JT8sIDUyPWUlPyBhbmQgNTM9bnVsbC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRHVyYXRpb25Gb3JtYXQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ3b3JrIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0R1cmF0aW9uIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGFtb3VudCBvZiBzY2hlZHVsZWQgd29yayBmb3IgdGhlIHRhc2suJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IldvcmsiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzdG9wIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RhdGVUaW1lIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGRhdGUgdGhhdCB0aGUgdGFzayB3YXMgc3RvcHBlZC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iU3RvcCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJlc3VtZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EYXRlVGltZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBkYXRlIHRoYXQgdGhlIHRhc2sgcmVzdW1lZC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUmVzdW1lIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmVzdW1lVmFsaWQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldoZXRoZXIgdGhlIHRhc2sgY2FuIGJlIHJlc3VtZWQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlJlc3VtZVZhbGlkIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZWZmb3J0RHJpdmVuIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXaGV0aGVyIHRoZSB0YXNrIGlzIGVmZm9ydC1kcml2ZW4uJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkVmZm9ydERyaXZlbiIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJlY3VycmluZyIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV2hldGhlciB0aGUgdGFzayBpcyBhIHJlY3VycmluZyB0YXNrLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJSZWN1cnJpbmciLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJvdmVyQWxsb2NhdGVkIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXaGV0aGVyIHRoZSB0YXNrIGlzIG92ZXJhbGxvY2F0ZWQuICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZWxlbWVudCBpcyBpbmZvcm1hdGlvbmFsIG9ubHkuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik92ZXJBbGxvY2F0ZWQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJlc3RpbWF0ZWQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldoZXRoZXIgdGhlIHRhc2sgaXMgZXN0aW1hdGVkLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJFc3RpbWF0ZWQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJtaWxlc3RvbmUiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldoZXRoZXIgdGhlIHRhc2sgaXMgYSBtaWxlc3RvbmUuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik1pbGVzdG9uZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InN1bW1hcnkiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldoZXRoZXIgdGhlIHRhc2sgaXMgYSBzdW1tYXJ5IHRhc2suJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlN1bW1hcnkiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjcml0aWNhbCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV2hldGhlciB0aGUgdGFzayBpcyBpbiB0aGUgY3JpdGljYWwgY2hhaW4uJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkNyaXRpY2FsIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaXNTdWJwcm9qZWN0IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXaGV0aGVyIHRoZSB0YXNrIGlzIGFuIGluc2VydGVkIHByb2plY3QuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IklzU3VicHJvamVjdCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImlzU3VicHJvamVjdFJlYWRPbmx5IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXaGV0aGVyIHRoZSBpbnNlcnRlZCBwcm9qZWN0IGlzIHJlYWQtb25seS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iSXNTdWJwcm9qZWN0UmVhZE9ubHkiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzdWJwcm9qZWN0TmFtZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL1N1YnByb2plY3ROYW1lVHlwZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBzb3VyY2UgbG9jYXRpb24gb2YgdGhlIGluc2VydGVkIHByb2plY3QuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlN1YnByb2plY3ROYW1lIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZXh0ZXJuYWxUYXNrIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXaGV0aGVyIHRoZSB0YXNrIGlzIGV4dGVybmFsLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJFeHRlcm5hbFRhc2siLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJleHRlcm5hbFRhc2tQcm9qZWN0IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vRXh0ZXJuYWxUYXNrUHJvamVjdFR5cGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgc291cmNlIGxvY2F0aW9uIGFuZCB0YXNrIGlkZW50aWZpZXIgb2YgdGhlIGV4dGVybmFsIHRhc2suJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkV4dGVybmFsVGFza1Byb2plY3QiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJlYXJseVN0YXJ0IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RhdGVUaW1lIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGVhcmx5IHN0YXJ0IGRhdGUgb2YgdGhlIHRhc2suJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkVhcmx5U3RhcnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJlYXJseUZpbmlzaCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EYXRlVGltZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBlYXJseSBmaW5pc2ggZGF0ZSBvZiB0aGUgdGFzay4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRWFybHlGaW5pc2giLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJsYXRlU3RhcnQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGF0ZVRpbWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgbGF0ZSBzdGFydCBkYXRlIG9mIHRoZSB0YXNrLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJMYXRlU3RhcnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJsYXRlRmluaXNoIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RhdGVUaW1lIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGxhdGUgZmluaXNoIGRhdGUgb2YgdGhlIHRhc2suJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkxhdGVGaW5pc2giLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzdGFydFZhcmlhbmNlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0ludGVnZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdmFyaWFuY2Ugb2YgdGhlIHRhc2sgc3RhcnQgZGF0ZSBmcm9tICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBiYXNlbGluZSBzdGFydCBkYXRlIGFzIG1pbnV0ZXMgeCAxMDAwLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJTdGFydFZhcmlhbmNlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZmluaXNoVmFyaWFuY2UiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vSW50ZWdlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB2YXJpYW5jZSBvZiB0aGUgdGFzayBmaW5pc2ggZGF0ZSBmcm9tICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBiYXNlbGluZSBmaW5pc2ggZGF0ZSBhcyBtaW51dGVzIHggMTAwMC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRmluaXNoVmFyaWFuY2UiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ3b3JrVmFyaWFuY2UiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRmxvYXQiIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdmFyaWFuY2Ugb2YgdGFzayB3b3JrIGZyb20gdGhlIGJhc2VsaW5lICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhc2sgd29yayBhcyBtaW51dGVzIHggMTAwMC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iV29ya1ZhcmlhbmNlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZnJlZVNsYWNrIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0ludGVnZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYW1vdW50IG9mIGZyZWUgc2xhY2suJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkZyZWVTbGFjayIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InRvdGFsU2xhY2siIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vSW50ZWdlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBhbW91bnQgb2YgdG90YWwgc2xhY2suJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlRvdGFsU2xhY2siLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJmaXhlZENvc3QiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRmxvYXQiIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZml4ZWQgY29zdCBvZiB0aGUgdGFzay4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRml4ZWRDb3N0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZml4ZWRDb3N0QWNjcnVhbCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL0ZpeGVkQ29zdEFjY3J1YWxUeXBlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iSG93IHRoZSBmaXhlZCBjb3N0IGlzIGFjY3J1ZWQgYWdhaW5zdCB0aGUgdGFzay4gJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVzIGFyZTogMT1TdGFydCwgMj1Qcm9yYXRlZCBhbmQgMz1FbmQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkZpeGVkQ29zdEFjY3J1YWwiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwZXJjZW50Q29tcGxldGUiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vSW50ZWdlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBwZXJjZW50YWdlIG9mIHRoZSB0YXNrIGR1cmF0aW9uIGNvbXBsZXRlZC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUGVyY2VudENvbXBsZXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icGVyY2VudFdvcmtDb21wbGV0ZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9JbnRlZ2VyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHBlcmNlbnRhZ2Ugb2YgdGhlIHRhc2sgd29yayBjb21wbGV0ZWQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlBlcmNlbnRXb3JrQ29tcGxldGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjb3N0IiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RlY2ltYWwiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgcHJvamVjdGVkIG9yIHNjaGVkdWxlZCBjb3N0IG9mIHRoZSB0YXNrLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDb3N0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ib3ZlcnRpbWVDb3N0IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RlY2ltYWwiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgc3VtIG9mIHRoZSBhY3R1YWwgYW5kIHJlbWFpbmluZyBvdmVydGltZSBjb3N0IG9mIHRoZSB0YXNrLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJPdmVydGltZUNvc3QiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJvdmVydGltZVdvcmsiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRHVyYXRpb24iPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYW1vdW50IG9mIG92ZXJ0aW1lIHdvcmsgc2NoZWR1bGVkIGZvciB0aGUgdGFzay4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iT3ZlcnRpbWVXb3JrIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYWN0dWFsU3RhcnQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGF0ZVRpbWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYWN0dWFsIHN0YXJ0IGRhdGUgb2YgdGhlIHRhc2suJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkFjdHVhbFN0YXJ0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYWN0dWFsRmluaXNoIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RhdGVUaW1lIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGFjdHVhbCBmaW5pc2ggZGF0ZSBvZiB0aGUgdGFzay4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQWN0dWFsRmluaXNoIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYWN0dWFsRHVyYXRpb24iIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRHVyYXRpb24iPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYWN0dWFsIGR1cmF0aW9uIG9mIHRoZSB0YXNrLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJBY3R1YWxEdXJhdGlvbiIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFjdHVhbENvc3QiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGVjaW1hbCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBhY3R1YWwgY29zdCBvZiB0aGUgdGFzay4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQWN0dWFsQ29zdCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFjdHVhbE92ZXJ0aW1lQ29zdCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EZWNpbWFsIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGFjdHVhbCBvdmVydGltZSBjb3N0IG9mIHRoZSB0YXNrLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJBY3R1YWxPdmVydGltZUNvc3QiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhY3R1YWxXb3JrIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0R1cmF0aW9uIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGFjdHVhbCB3b3JrIGZvciB0aGUgdGFzay4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQWN0dWFsV29yayIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFjdHVhbE92ZXJ0aW1lV29yayIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EdXJhdGlvbiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBhY3R1YWwgb3ZlcnRpbWUgd29yayBmb3IgdGhlIHRhc2suJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkFjdHVhbE92ZXJ0aW1lV29yayIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJlZ3VsYXJXb3JrIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0R1cmF0aW9uIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGFtb3VudCBvZiBub24tb3ZlcnRpbWUgd29yayBzY2hlZHVsZWQgZm9yIHRoZSB0YXNrLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJSZWd1bGFyV29yayIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJlbWFpbmluZ0R1cmF0aW9uIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0R1cmF0aW9uIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGFtb3VudCBvZiB0aW1lIHJlcXVpcmVkIHRvIGNvbXBsZXRlIHRoZSB1bmZpbmlzaGVkIHBvcnRpb24gb2YgdGhlIHRhc2suJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlJlbWFpbmluZ0R1cmF0aW9uIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmVtYWluaW5nQ29zdCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EZWNpbWFsIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHJlbWFpbmluZyBwcm9qZWN0ZWQgY29zdCBvZiBjb21wbGV0aW5nIHRoZSB0YXNrLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJSZW1haW5pbmdDb3N0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmVtYWluaW5nV29yayIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EdXJhdGlvbiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSByZW1haW5pbmcgd29yayBzY2hlZHVsZWQgdG8gY29tcGxldGUgdGhlIHRhc2suJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlJlbWFpbmluZ1dvcmsiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyZW1haW5pbmdPdmVydGltZUNvc3QiCi0gICAgICAgIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGVjaW1hbCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSByZW1haW5pbmcgb3ZlcnRpbWUgY29zdCBwcm9qZWN0ZWQgdG8gZmluaXNoIHRoZSB0YXNrLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJSZW1haW5pbmdPdmVydGltZUNvc3QiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyZW1haW5pbmdPdmVydGltZVdvcmsiCi0gICAgICAgIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRHVyYXRpb24iPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgcmVtYWluaW5nIG92ZXJ0aW1lIHdvcmsgc2NoZWR1bGVkIHRvIGZpbmlzaCB0aGUgdGFzay4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUmVtYWluaW5nT3ZlcnRpbWVXb3JrIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYUNXUCIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9GbG9hdCIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBhY3R1YWwgY29zdCBvZiB3b3JrIHBlcmZvcm1lZCBvbiB0aGUgdGFzayB0by1kYXRlLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJBQ1dQIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY1YiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRmxvYXQiCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJFYXJuZWQgdmFsdWUgY29zdCB2YXJpYW5jZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ1YiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjb25zdHJhaW50VHlwZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL0NvbnN0cmFpbnRUeXBlVHlwZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBjb25zdHJhaW50IG9uIHRoZSBzdGFydCBvciBmaW5pc2ggZGF0ZSBvZiB0aGUgdGFzay4gJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVzIGFyZTogMD1BcyBTb29uIEFzIFBvc3NpYmxlLCAxPUFzIExhdGUgQXMgUG9zc2libGUsIDI9TXVzdCBTdGFydCBPbiwgMz1NdXN0IEZpbmlzaCBPbiwgJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgND1TdGFydCBObyBFYXJsaWVyIFRoYW4sIDU9U3RhcnQgTm8gTGF0ZXIgVGhhbiwgNj1GaW5pc2ggTm8gRWFybGllciBUaGFuIGFuZCA3PUZpbmlzaCBObyBMYXRlciBUaGFuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkNvbnN0cmFpbnRUeXBlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY2FsZW5kYXJVSUQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vSW50ZWdlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB0YXNrIGNhbGVuZGFyLlJlZmVycyB0byBhIHZhbGlkIFVJRCBpbiB0aGUgQ2FsZW5kYXJzIGVsZW1lbnQgb2YgJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIE1pY3Jvc29mdCBQcm9qZWN0IFhNTCBTY2hlbWEuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkNhbGVuZGFyVUlEIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY29uc3RyYWludERhdGUiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGF0ZVRpbWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZGF0ZSBhcmd1bWVudCBmb3IgdGhlIHRhc2sgY29uc3RyYWludCB0eXBlLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDb25zdHJhaW50RGF0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImRlYWRsaW5lIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RhdGVUaW1lIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGRlYWRsaW5lIGZvciB0aGUgdGFzayB0byBiZSBjb21wbGV0ZWQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkRlYWRsaW5lIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibGV2ZWxBc3NpZ25tZW50cyIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV2hldGhlciBsZXZlbGluZyBjYW4gYWRqdXN0IGFzc2lnbm1lbnRzLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJMZXZlbEFzc2lnbm1lbnRzIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibGV2ZWxpbmdDYW5TcGxpdCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV2hldGhlciBsZXZlbGluZyBjYW4gc3BsaXQgdGhlIHRhc2suJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkxldmVsaW5nQ2FuU3BsaXQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJsZXZlbGluZ0RlbGF5IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0ludGVnZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZGVsYXkgY2F1c2VkIGJ5IGxldmVsaW5nIHRoZSB0YXNrLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJMZXZlbGluZ0RlbGF5Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibGV2ZWxpbmdEZWxheUZvcm1hdCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL0xldmVsaW5nRGVsYXlGb3JtYXRUeXBlMSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBmb3JtYXQgZm9yIGV4cHJlc3NpbmcgdGhlIGR1cmF0aW9uIG9mIHRoZSBkZWxheS4gICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlcyBhcmU6IDM9bSwgND1lbSwgNT1oLCA2PWVoLCA3PWQsIDg9ZWQsIDk9dywgMTA9ZXcsIDExPW1vLCAxMj1lbW8sIDE5PSUsICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIwPWUlLCAyMT1udWxsLCAzNT1tPywgMzY9ZW0/LCAzNz1oPywgMzg9ZWg/LCAzOT1kPywgNDA9ZWQ/LCA0MT13PywgNDI9ZXc/LCAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0Mz1tbz8sIDQ0PWVtbz8sIDUxPSU/LCA1Mj1lJT8gYW5kIDUzPW51bGwuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkxldmVsaW5nRGVsYXlGb3JtYXQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwcmVMZXZlbGVkU3RhcnQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGF0ZVRpbWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgc3RhcnQgZGF0ZSBvZiB0aGUgdGFzayBiZWZvcmUgaXQgd2FzIGxldmVsZWQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlByZUxldmVsZWRTdGFydCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InByZUxldmVsZWRGaW5pc2giIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGF0ZVRpbWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZmluaXNoIGRhdGUgb2YgdGhlIHRhc2sgYmVmb3JlIGl0IHdhcyBsZXZlbGVkLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJQcmVMZXZlbGVkRmluaXNoIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaHlwZXJsaW5rIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vSHlwZXJsaW5rVHlwZTIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdGl0bGUgb2YgdGhlIGh5cGVybGluayBhc3NvY2lhdGVkIHdpdGggdGhlIHRhc2suJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ikh5cGVybGluayIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Imh5cGVybGlua0FkZHJlc3MiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9IeXBlcmxpbmtBZGRyZXNzVHlwZTIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgaHlwZXJsaW5rIGFzc29jaWF0ZWQgd2l0aCB0aGUgdGFzay4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iSHlwZXJsaW5rQWRkcmVzcyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Imh5cGVybGlua1N1YkFkZHJlc3MiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9IeXBlcmxpbmtTdWJBZGRyZXNzVHlwZTIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZG9jdW1lbnQgYm9va21hcmsgb2YgdGhlIGh5cGVybGluayBhc3NvY2lhdGVkIHdpdGggdGhlIHRhc2suJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ikh5cGVybGlua1N1YkFkZHJlc3MiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpZ25vcmVSZXNvdXJjZUNhbGVuZGFyIgotICAgICAgICB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXaGV0aGVyIHRoZSB0YXNrIGlnbm9yZXMgdGhlIHJlc291cmNlIGNhbGVuZGFyLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJJZ25vcmVSZXNvdXJjZUNhbGVuZGFyIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibm90ZXMiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGV4dCBub3RlcyBhc3NvY2lhdGVkIHdpdGggdGhlIHRhc2suJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik5vdGVzIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaGlkZUJhciIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV2hldGhlciB0aGUgR0FOVFQgYmFyIG9mIHRoZSB0YXNrIGlzIGhpZGRlbiB3aGVuIGRpc3BsYXllZCBpbiBNaWNyb3NvZnQgUHJvamVjdC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iSGlkZUJhciIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJvbGx1cCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV2hldGhlciB0aGUgdGFzayBpcyByb2xsZWQgdXAuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlJvbGx1cCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImJDV1MiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRmxvYXQiCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYnVkZ2V0ZWQgY29zdCBvZiB3b3JrIHNjaGVkdWxlZCBmb3IgdGhlIHRhc2suJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkJDV1MiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJiQ1dQIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Zsb2F0IgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGJ1ZGdldGVkIGNvc3Qgb2Ygd29yayBwZXJmb3JtZWQgb24gdGhlIHRhc2sgdG8tZGF0ZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQkNXUCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InBoeXNpY2FsUGVyY2VudENvbXBsZXRlIgotICAgICAgICB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0ludGVnZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgcGVyY2VudGFnZSBjb21wbGV0ZSB2YWx1ZSBlbnRlcmVkIGJ5IHRoZSBQcm9qZWN0IE1hbmFnZXIuICAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGNhbiBiZSB1c2VkIGFzIGFuIGFsdGVybmF0aXZlIGZvciBjYWxjdWxhdGluZyBCQ1dQLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJQaHlzaWNhbFBlcmNlbnRDb21wbGV0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImVhcm5lZFZhbHVlTWV0aG9kIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vRWFybmVkVmFsdWVNZXRob2RUeXBlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIG1ldGhvZCBmb3IgY2FsY3VsYXRpbmcgZWFybmVkIHZhbHVlLiAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZXMgYXJlOiAwPVBlcmNlbnQgQ29tcGxldGUsIDE9UGh5c2ljYWwgUGVyY2VudCBDb21wbGV0ZSYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJFYXJuZWRWYWx1ZU1ldGhvZCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InByZWRlY2Vzc29yTGluayIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9QcmVkZWNlc3NvckxpbmsiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJEZWZpbmVzIHRoZSBwcmVkZWNlc3NvciB0YXNrIG9mIHRoZSB0YXNrIHRoYXQgY29udGFpbnMgaXQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlByZWRlY2Vzc29yTGluayIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFjdHVhbFdvcmtQcm90ZWN0ZWQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRHVyYXRpb24iPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJTcGVjaWZpZXMgdGhlIGR1cmF0aW9uIHRocm91Z2ggd2hpY2ggYWN0dWFsIHdvcmsgaXMgcHJvdGVjdGVkLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJBY3R1YWxXb3JrUHJvdGVjdGVkIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkIgotICAgICAgICB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0R1cmF0aW9uIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iU3BlY2lmaWVzIHRoZSBkdXJhdGlvbiB0aHJvdWdoIHdoaWNoIGFjdHVhbCBvdmVydGltZSB3b3JrIGlzIHByb3RlY3RlZC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZXh0ZW5kZWRBdHRyaWJ1dGUiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vRXh0ZW5kZWRBdHRyaWJ1dGUyIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHZhbHVlIG9mIGFuIGV4dGVuZGVkIGF0dHJpYnV0ZS4gIFR3byBwaWVjZXMgb2YgZGF0YSBhcmUgbmVjZXNzYXJ5IC0gJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYSBwb2ludGVyIGJhY2sgdG8gdGhlIGV4dGVuZGVkIGF0dHJpYnV0ZSB0YWJsZSB3aGljaCBpcyBzcGVjaWZpZWQgZWl0aGVyIGJ5IHRoZSB1bmlxdWUgSUQgb3IgJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIEZpZWxkIElELCBhbmQgdGhlIHZhbHVlIHdoaWNoIGlzIHNwZWNpZmllZCBlaXRoZXIgd2l0aCB0aGUgdmFsdWUsIG9yIGEgcG9pbnRlciBiYWNrIHRvIHRoZSB2YWx1ZSBsaXN0LiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJFeHRlbmRlZEF0dHJpYnV0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImJhc2VsaW5lIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL0Jhc2VsaW5lIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGNvbGxlY3Rpb24gb2YgYmFzZWxpbmUgdmFsdWVzIG9mIHRoZSB0YXNrLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJCYXNlbGluZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im91dGxpbmVDb2RlIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL091dGxpbmVDb2RlMiIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB2YWx1ZSBvZiBhbiBvdXRsaW5lIGNvZGUuICBUd28gcGllY2VzIG9mIGRhdGEgYXJlIG5lY2Vzc2FyeSAtICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEgcG9pbnRlciBiYWNrIHRvIHRoZSBvdXRsaW5lIGNvZGUgdGFibGUgd2hpY2ggaXMgc3BlY2lmaWVkIGVpdGhlciBieSB0aGUgdW5pcXVlIElEIG9yIHRoZSBGaWVsZCBJRCwgJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIHRoZSB2YWx1ZSB3aGljaCBpcyBzcGVjaWZpZWQgZWl0aGVyIHdpdGggdGhlIHZhbHVlLCBvciBhIHBvaW50ZXIgYmFjayB0byB0aGUgdmFsdWUgbGlzdC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iT3V0bGluZUNvZGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ0aW1lcGhhc2VkRGF0YSIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9UaW1lcGhhc2VkRGF0YVR5cGUiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdGltZSBwaGFzZWQgZGF0YSBibG9jayBhc3NvY2lhdGVkIHdpdGggdGhlIHRhc2suJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlRpbWVwaGFzZWREYXRhIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iVGFza3MiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVGFza3NfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ0YXNrIiB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1Rhc2siCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGVyZSBtdXN0IGJlIGF0IGxlYXN0IG9uZSB0YXNrIGluIGVhY2ggVGFza3MgY29sbGVjdGlvbi4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVGFzayIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlRpbWVQZXJpb2QiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVGltZVBlcmlvZF8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImZyb21EYXRlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RhdGVUaW1lIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGJlZ2lubmluZyBvZiB0aGUgZXhjZXB0aW9uIHRpbWUuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJGcm9tRGF0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InRvRGF0ZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EYXRlVGltZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBlbmQgb2YgdGhlIGV4Y2VwdGlvbiB0aW1lLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVG9EYXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iVGltZXBoYXNlZERhdGFUeXBlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZGVmaW5pdGlvbiBvZiB0aGUgdGltZSBwaGFzZWQgZGF0YSBibG9jay4mI3hEOyYjeEE7JiN4OTsmI3g5OyAgICAgICAgIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJUaW1lcGhhc2VkRGF0YVR5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InR5cGUiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSIjLy9UeXBlVHlwZTMiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSImI3hEOyYjeEE7ICAgICAgICAgICAgICAgIFRoZSB0eXBlIG9mIHRhc2sgdGltZXBoYXNlZCBkYXRhLiBWYWx1ZXMgYXJlOiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDE9QXNzaWdubWVudCBSZW1haW5pbmcgV29yayYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDI9QXNzaWdubWVudCBBY3R1YWwgV29yayYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDM9QXNzaWdubWVudCBBY3R1YWwgT3ZlcnRpbWUgV29yayYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDQ9QXNzaWdubWVudCBCYXNlbGluZSBXb3JrJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgNT1Bc3NpZ25tZW50IEJhc2VsaW5lIENvc3QmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICA2PUFzc2lnbm1lbnQgQWN0dWFsIENvc3QmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICA3PVJlc291cmNlIEJhc2VsaW5lIFdvcmsmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICA4PVJlc291cmNlIEJhc2VsaW5lIENvc3QmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICA5PVRhc2sgQmFzZWxpbmUgV29yayYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDEwPVRhc2sgQmFzZWxpbmUgQ29zdCYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDExPVRhc2sgUGVyY2VudCBDb21wbGV0ZSYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDE2PUFzc2lnbm1lbnQgQmFzZWxpbmUgMSBXb3JrJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgMTc9QXNzaWdubWVudCBCYXNlbGluZSAxIENvc3QmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAxOD1UYXNrIEJhc2VsaW5lIDEgV29yayYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDE5PVRhc2sgQmFzZWxpbmUgMSBDb3N0JiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgMjA9UmVzb3VyY2UgQmFzZWxpbmUgMSBXb3JrJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgMjE9UmVzb3VyY2UgQmFzZWxpbmUgMSBDb3N0JiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgMjI9QXNzaWdubWVudCBCYXNlbGluZSAyIFdvcmsmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAyMz1Bc3NpZ25tZW50IEJhc2VsaW5lIDIgQ29zdCYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDI0PVRhc2sgQmFzZWxpbmUgMiBXb3JrJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgMjU9VGFzayBCYXNlbGluZSAyIENvc3QmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAyNj1SZXNvdXJjZSBCYXNlbGluZSAyIFdvcmsmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAyNz1SZXNvdXJjZSBCYXNlbGluZSAyIENvc3QmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAyOD1Bc3NpZ25tZW50IEJhc2VsaW5lIDMgV29yayYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDI5PUFzc2lnbm1lbnQgQmFzZWxpbmUgMyBDb3N0JiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgMzA9VGFzayBCYXNlbGluZSAzIFdvcmsmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAzMT1UYXNrIEJhc2VsaW5lIDMgQ29zdCYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDMyPVJlc291cmNlIEJhc2VsaW5lIDMgV29yayYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDMzPVJlc291cmNlIEJhc2VsaW5lIDMgQ29zdCYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDM0PUFzc2lnbm1lbnQgQmFzZWxpbmUgNCBXb3JrJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgMzU9QXNzaWdubWVudCBCYXNlbGluZSA0IENvc3QmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAzNj1UYXNrIEJhc2VsaW5lIDQgV29yayYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDM3PVRhc2sgQmFzZWxpbmUgNCBDb3N0JiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgMzg9UmVzb3VyY2UgQmFzZWxpbmUgNCBXb3JrJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgMzk9UmVzb3VyY2UgQmFzZWxpbmUgNCBDb3N0JiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgNDA9QXNzaWdubWVudCBCYXNlbGluZSA1IFdvcmsmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICA0MT1Bc3NpZ25tZW50IEJhc2VsaW5lIDUgQ29zdCYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDQyPVRhc2sgQmFzZWxpbmUgNSBXb3JrJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgNDM9VGFzayBCYXNlbGluZSA1IENvc3QmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICA0ND1SZXNvdXJjZSBCYXNlbGluZSA1IFdvcmsmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICA0NT1SZXNvdXJjZSBCYXNlbGluZSA1IENvc3QmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICA0Nj1Bc3NpZ25tZW50IEJhc2VsaW5lIDYgV29yayYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDQ3PUFzc2lnbm1lbnQgQmFzZWxpbmUgNiBDb3N0JiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgNDg9VGFzayBCYXNlbGluZSA2IFdvcmsmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICA0OT1UYXNrIEJhc2VsaW5lIDYgQ29zdCYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDUwPVJlc291cmNlIEJhc2VsaW5lIDYgV29yayYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDUxPVJlc291cmNlIEJhc2VsaW5lIDYgQ29zdCYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDUyPUFzc2lnbm1lbnQgQmFzZWxpbmUgNyBXb3JrJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgNTM9QXNzaWdubWVudCBCYXNlbGluZSA3IENvc3QmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICA1ND1UYXNrIEJhc2VsaW5lIDcgV29yayYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDU1PVRhc2sgQmFzZWxpbmUgNyBDb3N0JiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgNTY9UmVzb3VyY2UgQmFzZWxpbmUgNyBXb3JrJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgNTc9UmVzb3VyY2UgQmFzZWxpbmUgNyBDb3N0JiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgNTg9QXNzaWdubWVudCBCYXNlbGluZSA4IFdvcmsmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICA1OT1Bc3NpZ25tZW50IEJhc2VsaW5lIDggQ29zdCYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDYwPVRhc2sgQmFzZWxpbmUgOCBXb3JrJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgNjE9VGFzayBCYXNlbGluZSA4IENvc3QmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICA2Mj1SZXNvdXJjZSBCYXNlbGluZSA4IFdvcmsmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICA2Mz1SZXNvdXJjZSBCYXNlbGluZSA4IENvc3QmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICA2ND1Bc3NpZ25tZW50IEJhc2VsaW5lIDkgV29yayYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDY1PUFzc2lnbm1lbnQgQmFzZWxpbmUgOSBDb3N0JiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgNjY9VGFzayBCYXNlbGluZSA5IFdvcmsmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICA2Nz1UYXNrIEJhc2VsaW5lIDkgQ29zdCYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDY4PVJlc291cmNlIEJhc2VsaW5lIDkgV29yayYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDY5PVJlc291cmNlIEJhc2VsaW5lIDkgQ29zdCYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDcwPUFzc2lnbm1lbnQgQmFzZWxpbmUgMTAgV29yayYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDcxPUFzc2lnbm1lbnQgQmFzZWxpbmUgMTAgQ29zdCYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDcyPVRhc2sgQmFzZWxpbmUgMTAgV29yayYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDczPVRhc2sgQmFzZWxpbmUgMTAgQ29zdCYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDc0PVJlc291cmNlIEJhc2VsaW5lIDEwIFdvcmsmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICA3NT1SZXNvdXJjZSBCYXNlbGluZSAxMCBDb3N0JiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgNzY9UGh5c2ljYWwgUGVyY2VudCBDb21wbGV0ZSYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlR5cGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ1SUQiIHVuaXF1ZT0iZmFsc2UiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vSW50ZWdlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgdGltZXBoYXNlZCBkYXRhIHJlY29yZC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJVSUQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzdGFydCIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EYXRlVGltZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBzdGFydCBkYXRlIG9mIHRoZSB0aW1lcGhhc2VkIGRhdGEgcGVyaW9kLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlN0YXJ0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZmluaXNoIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RhdGVUaW1lIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGZpbmlzaCBkYXRlIG9mIHRoZSB0aW1lcGhhc2VkIGRhdGEgcGVyaW9kLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkZpbmlzaCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InVuaXQiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSIjLy9Vbml0VHlwZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB0aW1lIHVuaXQgb2YgdGhlIHRpbWVwaGFzZWQgZGF0YSBwZXJpb2QuICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgVmFsdWVzIGFyZTogMD1tLCAxPWgsIDI9ZCwgMz13LCA1PW1vLCA4PXkmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJVbml0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idmFsdWUiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHZhbHVlIHBlciB1bml0IG9mIHRpbWUgZm9yIHRoZSB0aW1lcGhhc2VkIGRhdGEgcGVyaW9kLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlZhbHVlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iVGl0bGVUeXBlIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5sYW5nLlN0cmluZyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJUaXRsZV8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjc3RyaW5nIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im1heExlbmd0aCIgdmFsdWU9IjUxMiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJUeXBlVHlwZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubWF0aC5CaWdJbnRlZ2VyIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlR5cGVfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXIiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iZW51bWVyYXRpb24iIHZhbHVlPSIwIDEgMiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJUeXBlVHlwZTEiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLm1hdGguQmlnSW50ZWdlciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJUeXBlXy5fMV8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjaW50ZWdlciIvPgotICAgICAgPGRldGFpbHMga2V5PSJlbnVtZXJhdGlvbiIgdmFsdWU9IjAgMSAyIDMiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iVHlwZVR5cGUyIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5tYXRoLkJpZ0ludGVnZXIiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVHlwZV8uXzJfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXIiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iZW51bWVyYXRpb24iIHZhbHVlPSIwIDEgMiAzIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IlR5cGVUeXBlMyIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubWF0aC5CaWdJbnRlZ2VyIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlR5cGVfLl8zXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImVudW1lcmF0aW9uIiB2YWx1ZT0iMSAyIDMgNCA1IDYgNyA4IDkgMTAgMTEgMTYgMTcgMTggMTkgMjAgMjEgMjIgMjMgMjQgMjUgMjYgMjcgMjggMjkgMzAgMzEgMzIgMzMgMzQgMzUgMzYgMzcgMzggMzkgNDAgNDEgNDIgNDMgNDQgNDUgNDYgNDcgNDggNDkgNTAgNTEgNTIgNTMgNTQgNTUgNTYgNTcgNTggNTkgNjAgNjEgNjIgNjMgNjQgNjUgNjYgNjcgNjggNjkgNzAgNzEgNzIgNzMgNzQgNzUgNzYiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iVHlwZVR5cGU0IiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5tYXRoLkJpZ0ludGVnZXIiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVHlwZV8uXzRfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXIiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iZW51bWVyYXRpb24iIHZhbHVlPSIwIDEiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iVHlwZVR5cGU1IiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5tYXRoLkJpZ0ludGVnZXIiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVHlwZV8uXzVfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXIiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iZW51bWVyYXRpb24iIHZhbHVlPSIwIDEgMiAzIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IlVJRFR5cGUiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLmxhbmcuU3RyaW5nIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlVJRF8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjc3RyaW5nIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im1heExlbmd0aCIgdmFsdWU9IjE2Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IlVuaXRUeXBlIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5tYXRoLkJpZ0ludGVnZXIiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVW5pdF8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjaW50ZWdlciIvPgotICAgICAgPGRldGFpbHMga2V5PSJlbnVtZXJhdGlvbiIgdmFsdWU9IjAgMSAyIDMgNSA4Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlZhbHVlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlZhbHVlXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idmFsdWVJRCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9JbnRlZ2VyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHVuaXF1ZSBJRCBvZiB0aGUgb3V0bGluZSBjb2RlIHZhbHVlIGFjcm9zcyB0aGUgcHJvamVjdC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVmFsdWVJRCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InBhcmVudFZhbHVlSUQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vSW50ZWdlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB2YWx1ZSBvZiB0aGUgcGFyZW50IG5vZGUgb2YgdGhlIG91dGxpbmUgY29kZS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUGFyZW50VmFsdWVJRCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InZhbHVlIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBhY3R1YWwgdmFsdWUuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlZhbHVlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZGVzY3JpcHRpb24iIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBkZXNjcmlwdGlvbiBvZiB0aGlzIHZhbHVlLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJEZXNjcmlwdGlvbiIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlZhbHVlMiI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJWYWx1ZV8uXzFfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpRCIgdW5pcXVlPSJmYWxzZSIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9JbnRlZ2VyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVW5pcXVlIElEIG9mIHZhbHVlIGFjcm9zcyAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgcHJvamVjdC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iSUQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ2YWx1ZSIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYWN0dWFsIHZhbHVlLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJWYWx1ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImRlc2NyaXB0aW9uIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgdmFsdWUgJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gdGhlIGxpc3QuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkRlc2NyaXB0aW9uIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iVmFsdWVMaXN0Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlZhbHVlTGlzdF8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InZhbHVlIiBsb3dlckJvdW5kPSIxIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL1ZhbHVlMiIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB2YWx1ZXMgdGhhdCBtYWtlIHVwIHRoZSB2YWx1ZSBsaXN0LiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJWYWx1ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IlZhbHVlbGlzdFNvcnRPcmRlclR5cGUiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLm1hdGguQmlnSW50ZWdlciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJWYWx1ZWxpc3RTb3J0T3JkZXJfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXIiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iZW51bWVyYXRpb24iIHZhbHVlPSIwIDEiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iVmFsdWVzIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlZhbHVlc18uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Imdyb3VwIiB1bmlxdWU9ImZhbHNlIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUZlYXR1cmVNYXBFbnRyeSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZ3JvdXAiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iZ3JvdXA6MCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ2YWx1ZSIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9WYWx1ZSIgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIgY29udGFpbm1lbnQ9InRydWUiCi0gICAgICAgIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBpbmRpdmlkdWFsIHZhbHVlcy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVmFsdWUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Imdyb3VwIiB2YWx1ZT0iI2dyb3VwOjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iV0JTTWFzayI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJXQlNNYXNrXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibGV2ZWwiIHVuaXF1ZT0iZmFsc2UiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vSW50ZWdlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBsZXZlbCBvZiB0aGUgbWFzay4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTGV2ZWwiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ0eXBlIiB1bmlxdWU9ImZhbHNlIiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iIy8vVHlwZVR5cGUyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHR5cGUgb2YgdGhlIG5vZGUgdmFsdWUuICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSB2YWx1ZXMgYXJlOiAwPU51bWJlcnMsIDE9VXBwZXJjYXNlIExldHRlcnMsIDI9TG93ZXJjYXNlIExldHRlcnMsIDM9Q2hhcmFjdGVycy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVHlwZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Imxlbmd0aCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgbG93ZXJCb3VuZD0iMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgbWF4aW11bSBsZW5ndGggaW4gY2hhcmFjdGVycy4gICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZWxlbWVudCBpcyBvbWl0dGVkIHdoZW4gbGVuZ3RoIGlzICZxdW90O2FueSZxdW90Oy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTGVuZ3RoIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic2VwYXJhdG9yIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBsb3dlckJvdW5kPSIxIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBzZXBhcmF0b3IgY2hhcmFjdGVyIG9mIHRoZSBub2RlLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJTZXBhcmF0b3IiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJXQlNNYXNrcyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJXQlNNYXNrc18uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InZlcmlmeVVuaXF1ZUNvZGVzIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV2hldGhlciBXQlMgY29kZXMgYXJlIHVuaXF1ZSBmb3IgbmV3IHRhc2tzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJWZXJpZnlVbmlxdWVDb2RlcyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImdlbmVyYXRlQ29kZXMiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXaGV0aGVyIFdCUyBjb2RlcyBhcmUgZ2VuZXJhdGVkIGZvciBuZXcgdGFza3MuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkdlbmVyYXRlQ29kZXMiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwcmVmaXgiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9QcmVmaXhUeXBlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHByZWZpeCBmb3IgYWxsIFdCUyBjb2Rlcy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUHJlZml4Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0id0JTTWFzayIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9XQlNNYXNrIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIFdCUyBNYXNrIHRoYXQgaXMgYXBwbGllZCB0byBhbGwgdGFza3MgaW4gdGhlIFByb2plY3QuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IldCU01hc2siLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJXZWVrRGF5Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IldlZWtEYXlfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJkYXlUeXBlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBsb3dlckJvdW5kPSIxIiBlVHlwZT0iIy8vRGF5VHlwZVR5cGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdHlwZSBvZiBkYXkuICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZXMgYXJlOiAwPUV4Y2VwdGlvbiwgMT1Nb25kYXksIDI9VHVlc2RheSwgJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDM9V2VkbmVzZGF5LCA0PVRodXJzZGF5LCA1PUZyaWRheSwgNj1TYXR1cmRheSwgJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDc9U3VuZGF5Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkRheVR5cGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJkYXlXb3JraW5nIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXaGV0aGVyIHRoZSBzcGVjaWZpZWQgZGF0ZSBvciBkYXkgJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgaXMgd29ya2luZy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRGF5V29ya2luZyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InRpbWVQZXJpb2QiIGVUeXBlPSIjLy9UaW1lUGVyaW9kIgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRGVmaW5lcyBhIGNvbnRpZ3VvdXMgc2V0IG9mIGV4Y2VwdGlvbiBkYXlzLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVGltZVBlcmlvZCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9IndvcmtpbmdUaW1lcyIgZVR5cGU9IiMvL1dvcmtpbmdUaW1lcyIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBjb2xsZWN0aW9uIG9mIHdvcmtpbmcgdGltZXMgdGhhdCBkZWZpbmUgdGhlIHRpbWUgd29ya2VkICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbiB0aGUgd2Vla2RheS4gIE9uZSBvZiB0aGVzZSBtdXN0IGJlIHByZXNlbnQsIGFuZCB0aGVyZSBtYXkgYmUgbm8gbW9yZSB0aGFuIGZpdmUuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJXb3JraW5nVGltZXMiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJXZWVrRGF5cyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJXZWVrRGF5c18uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9IndlZWtEYXkiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vV2Vla0RheSIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgd2Vla2RheSBlaXRoZXIgZGVmaW5lcyByZWd1bGFyIGRheXMgJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2YgdGhlIHdlZWsgb3IgZXhjZXB0aW9uIGRheXMgaW4gdGhlIGNhbGVuZGFyLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJXZWVrRGF5Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iV2Vla1N0YXJ0RGF5VHlwZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubWF0aC5CaWdJbnRlZ2VyIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IldlZWtTdGFydERheV8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjaW50ZWdlciIvPgotICAgICAgPGRldGFpbHMga2V5PSJlbnVtZXJhdGlvbiIgdmFsdWU9IjAgMSAyIDMgNCA1IDYiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iV29ya0NvbnRvdXJUeXBlIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5tYXRoLkJpZ0ludGVnZXIiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iV29ya0NvbnRvdXJfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXIiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iZW51bWVyYXRpb24iIHZhbHVlPSIwIDEgMiAzIDQgNSA2IDcgOCIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJXb3JrRm9ybWF0VHlwZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubWF0aC5CaWdJbnRlZ2VyIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IldvcmtGb3JtYXRfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXIiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iZW51bWVyYXRpb24iIHZhbHVlPSIxIDIgMyA0IDUiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iV29ya0dyb3VwVHlwZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubWF0aC5CaWdJbnRlZ2VyIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IldvcmtHcm91cF8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjaW50ZWdlciIvPgotICAgICAgPGRldGFpbHMga2V5PSJlbnVtZXJhdGlvbiIgdmFsdWU9IjAgMSAyIDMiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iV29ya2luZ1RpbWUiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iV29ya2luZ1RpbWVfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJmcm9tVGltZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9UaW1lIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGJlZ2lubmluZyBvZiB0aGUgd29ya2luZyB0aW1lLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkZyb21UaW1lIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idG9UaW1lIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1RpbWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZW5kIG9mIHRoZSB3b3JraW5nICB0aW1lLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlRvVGltZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IldvcmtpbmdUaW1lcyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJXb3JraW5nVGltZXNfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ3b3JraW5nVGltZSIgdXBwZXJCb3VuZD0iNSIKLSAgICAgICAgZVR5cGU9IiMvL1dvcmtpbmdUaW1lIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRGVmaW5lcyB0aGUgd29ya2luZyB0aW1lIGR1cmluZyB0aGUgd2Vla2RheS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJXb3JraW5nVGltZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotPC9lY29yZTpFUGFja2FnZT4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QvcGx1Z2luLnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNDM0M2IxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0jIDxjb3B5cmlnaHQ+Ci0jIDwvY29weXJpZ2h0PgotIwotIyAkSWQ6IHBsdWdpbi5wcm9wZXJ0aWVzLHYgMS4xIDIwMDgvMDEvMTUgMDg6NTI6NTcganRoYW0gRXhwICQKLQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyBUbyBjb2RlIGRldmVsb3BlcjoKLSMgICBEbyBOT1QgY2hhbmdlIHRoZSBwcm9wZXJ0aWVzIGJldHdlZW4gdGhpcyBsaW5lIGFuZCB0aGUKLSMgICAiJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlIiBsaW5lLgotIyAgIE1ha2UgYSBuZXcgcHJvcGVydHkgbmFtZSwgYXBwZW5kIHRvIHRoZSBlbmQgb2YgdGhlIGZpbGUgYW5kIGNoYW5nZQotIyAgIHRoZSBjb2RlIHRvIHVzZSB0aGUgbmV3IHByb3BlcnR5LgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLQotcGx1Z2luTmFtZSA9IEVQRiBNU1Byb2plY3QyMDAzIE1vZGVsCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKLQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9wbHVnaW4ueG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMjYxOTU4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci0KLTwhLS0KLSA8Y29weXJpZ2h0PgotIDwvY29weXJpZ2h0PgotCi0gJElkOiBwbHVnaW4ueG1sLHYgMS4xIDIwMDgvMDEvMTUgMDg6NTI6NTcganRoYW0gRXhwICQKLS0tPgotCi08cGx1Z2luPgotCi0gIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5nZW5lcmF0ZWRfcGFja2FnZSI+Ci0gICAgPHBhY2thZ2UgCi0gICAgICAgdXJpID0gImh0dHA6Ly9lcGYuZWNsaXBzZS5vcmcvbXNwcm9qZWN0IiAKLSAgICAgICBjbGFzcyA9ICJvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UiCi0gICAgICAgZ2VuTW9kZWwgPSAibW9kZWwvTVNfUHJvamVjdF8yMDAzLmdlbm1vZGVsIiAvPiAKLSAgPC9leHRlbnNpb24+Ci0KLSAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLmV4dGVuc2lvbl9wYXJzZXIiPgotICAgIDxwYXJzZXIgCi0gICAgICAgdHlwZT0ibXNwcm9qZWN0IiAKLSAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC51dGlsLk1zcHJvamVjdFJlc291cmNlRmFjdG9yeUltcGwiIC8+Ci0gIDwvZXh0ZW5zaW9uPgotCi08L3BsdWdpbj4KLQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9Bc3NpZ25tZW50LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L0Fzc2lnbm1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjM4YmM0NC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L0Fzc2lnbm1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwMzQgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBBc3NpZ25tZW50LmphdmEsdiAxLjEgMjAwOC8wMS8xNSAwODo1Mjo0NSBqdGhhbSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Q7Ci0KLWltcG9ydCBqYXZhLm1hdGguQmlnRGVjaW1hbDsKLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+QXNzaWdubWVudDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0VUlEIDxlbT5VSUQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRUYXNrVUlEIDxlbT5UYXNrIFVJRDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldFJlc291cmNlVUlEIDxlbT5SZXNvdXJjZSBVSUQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRQZXJjZW50V29ya0NvbXBsZXRlIDxlbT5QZXJjZW50IFdvcmsgQ29tcGxldGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRBY3R1YWxDb3N0IDxlbT5BY3R1YWwgQ29zdDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldEFjdHVhbEZpbmlzaCA8ZW0+QWN0dWFsIEZpbmlzaDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldEFjdHVhbE92ZXJ0aW1lQ29zdCA8ZW0+QWN0dWFsIE92ZXJ0aW1lIENvc3Q8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRBY3R1YWxPdmVydGltZVdvcmsgPGVtPkFjdHVhbCBPdmVydGltZSBXb3JrPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0QWN0dWFsU3RhcnQgPGVtPkFjdHVhbCBTdGFydDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldEFjdHVhbFdvcmsgPGVtPkFjdHVhbCBXb3JrPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0QUNXUCA8ZW0+QUNXUDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2lzQ29uZmlybWVkIDxlbT5Db25maXJtZWQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRDb3N0IDxlbT5Db3N0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0Q29zdFJhdGVUYWJsZSA8ZW0+Q29zdCBSYXRlIFRhYmxlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0Q29zdFZhcmlhbmNlIDxlbT5Db3N0IFZhcmlhbmNlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0Q1YgPGVtPkNWPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0RGVsYXkgPGVtPkRlbGF5PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0RmluaXNoIDxlbT5GaW5pc2g8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRGaW5pc2hWYXJpYW5jZSA8ZW0+RmluaXNoIFZhcmlhbmNlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0SHlwZXJsaW5rIDxlbT5IeXBlcmxpbms8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRIeXBlcmxpbmtBZGRyZXNzIDxlbT5IeXBlcmxpbmsgQWRkcmVzczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldEh5cGVybGlua1N1YkFkZHJlc3MgPGVtPkh5cGVybGluayBTdWIgQWRkcmVzczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldFdvcmtWYXJpYW5jZSA8ZW0+V29yayBWYXJpYW5jZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2lzSGFzRml4ZWRSYXRlVW5pdHMgPGVtPkhhcyBGaXhlZCBSYXRlIFVuaXRzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjaXNGaXhlZE1hdGVyaWFsIDxlbT5GaXhlZCBNYXRlcmlhbDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldExldmVsaW5nRGVsYXkgPGVtPkxldmVsaW5nIERlbGF5PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0TGV2ZWxpbmdEZWxheUZvcm1hdCA8ZW0+TGV2ZWxpbmcgRGVsYXkgRm9ybWF0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjaXNMaW5rZWRGaWVsZHMgPGVtPkxpbmtlZCBGaWVsZHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNpc01pbGVzdG9uZSA8ZW0+TWlsZXN0b25lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0Tm90ZXMgPGVtPk5vdGVzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjaXNPdmVyYWxsb2NhdGVkIDxlbT5PdmVyYWxsb2NhdGVkPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0T3ZlcnRpbWVDb3N0IDxlbT5PdmVydGltZSBDb3N0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0T3ZlcnRpbWVXb3JrIDxlbT5PdmVydGltZSBXb3JrPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0UmVndWxhcldvcmsgPGVtPlJlZ3VsYXIgV29yazwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldFJlbWFpbmluZ0Nvc3QgPGVtPlJlbWFpbmluZyBDb3N0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0UmVtYWluaW5nT3ZlcnRpbWVDb3N0IDxlbT5SZW1haW5pbmcgT3ZlcnRpbWUgQ29zdDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldFJlbWFpbmluZ092ZXJ0aW1lV29yayA8ZW0+UmVtYWluaW5nIE92ZXJ0aW1lIFdvcms8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRSZW1haW5pbmdXb3JrIDxlbT5SZW1haW5pbmcgV29yazwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2lzUmVzcG9uc2VQZW5kaW5nIDxlbT5SZXNwb25zZSBQZW5kaW5nPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0U3RhcnQgPGVtPlN0YXJ0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0U3RvcCA8ZW0+U3RvcDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldFJlc3VtZSA8ZW0+UmVzdW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0U3RhcnRWYXJpYW5jZSA8ZW0+U3RhcnQgVmFyaWFuY2U8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRVbml0cyA8ZW0+VW5pdHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNpc1VwZGF0ZU5lZWRlZCA8ZW0+VXBkYXRlIE5lZWRlZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldFZBQyA8ZW0+VkFDPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0V29yayA8ZW0+V29yazwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldFdvcmtDb250b3VyIDxlbT5Xb3JrIENvbnRvdXI8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRCQ1dTIDxlbT5CQ1dTPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0QkNXUCA8ZW0+QkNXUDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldEJvb2tpbmdUeXBlIDxlbT5Cb29raW5nIFR5cGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRBY3R1YWxXb3JrUHJvdGVjdGVkIDxlbT5BY3R1YWwgV29yayBQcm90ZWN0ZWQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRBY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQgPGVtPkFjdHVhbCBPdmVydGltZSBXb3JrIFByb3RlY3RlZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldENyZWF0aW9uRGF0ZSA8ZW0+Q3JlYXRpb24gRGF0ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldEV4dGVuZGVkQXR0cmlidXRlIDxlbT5FeHRlbmRlZCBBdHRyaWJ1dGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRCYXNlbGluZSA8ZW0+QmFzZWxpbmU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRUaW1lcGhhc2VkRGF0YSA8ZW0+VGltZXBoYXNlZCBEYXRhPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0QXNzaWdubWVudCgpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nQXNzaWdubWVudF8uX3R5cGUnIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBBc3NpZ25tZW50IGV4dGVuZHMgRU9iamVjdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VUlEPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIGFzc2lnbm1lbnQuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5VSUQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFVJRChCaWdJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEFzc2lnbm1lbnRfVUlEKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5JbnRlZ2VyIiByZXF1aXJlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nVUlEJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnSW50ZWdlciBnZXRVSUQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRVSUQgPGVtPlVJRDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VUlEPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRVSUQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFVJRChCaWdJbnRlZ2VyIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlRhc2sgVUlEPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIHRhc2suCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5UYXNrIFVJRDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0VGFza1VJRChCaWdJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEFzc2lnbm1lbnRfVGFza1VJRCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuSW50ZWdlciIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nVGFza1VJRCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0ludGVnZXIgZ2V0VGFza1VJRCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldFRhc2tVSUQgPGVtPlRhc2sgVUlEPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5UYXNrIFVJRDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0VGFza1VJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VGFza1VJRChCaWdJbnRlZ2VyIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJlc291cmNlIFVJRDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSByZXNvdXJjZS4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJlc291cmNlIFVJRDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UmVzb3VyY2VVSUQoQmlnSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRBc3NpZ25tZW50X1Jlc291cmNlVUlEKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5JbnRlZ2VyIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdSZXNvdXJjZVVJRCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0ludGVnZXIgZ2V0UmVzb3VyY2VVSUQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRSZXNvdXJjZVVJRCA8ZW0+UmVzb3VyY2UgVUlEPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5SZXNvdXJjZSBVSUQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFJlc291cmNlVUlEKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRSZXNvdXJjZVVJRChCaWdJbnRlZ2VyIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlBlcmNlbnQgV29yayBDb21wbGV0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGFtb3VudCBvZiB3b3JrIGNvbXBsZXRlZCBvbiB0aGUgYXNzaWdubWVudC4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlBlcmNlbnQgV29yayBDb21wbGV0ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UGVyY2VudFdvcmtDb21wbGV0ZShCaWdJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEFzc2lnbm1lbnRfUGVyY2VudFdvcmtDb21wbGV0ZSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuSW50ZWdlciIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nUGVyY2VudFdvcmtDb21wbGV0ZScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0ludGVnZXIgZ2V0UGVyY2VudFdvcmtDb21wbGV0ZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldFBlcmNlbnRXb3JrQ29tcGxldGUgPGVtPlBlcmNlbnQgV29yayBDb21wbGV0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UGVyY2VudCBXb3JrIENvbXBsZXRlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRQZXJjZW50V29ya0NvbXBsZXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRQZXJjZW50V29ya0NvbXBsZXRlKEJpZ0ludGVnZXIgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QWN0dWFsIENvc3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBhY3R1YWwgY29zdCBpbmN1cnJlZCBvbiB0aGUgYXNzaWdubWVudC4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkFjdHVhbCBDb3N0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRBY3R1YWxDb3N0KEJpZ0RlY2ltYWwpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0QXNzaWdubWVudF9BY3R1YWxDb3N0KCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EZWNpbWFsIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdBY3R1YWxDb3N0JyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnRGVjaW1hbCBnZXRBY3R1YWxDb3N0KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0QWN0dWFsQ29zdCA8ZW0+QWN0dWFsIENvc3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkFjdHVhbCBDb3N0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRBY3R1YWxDb3N0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRBY3R1YWxDb3N0KEJpZ0RlY2ltYWwgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QWN0dWFsIEZpbmlzaDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGFjdHVhbCBmaW5pc2ggZGF0ZSBvZiB0aGUgYXNzaWdubWVudC4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkFjdHVhbCBGaW5pc2g8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEFjdHVhbEZpbmlzaChPYmplY3QpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0QXNzaWdubWVudF9BY3R1YWxGaW5pc2goKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkRhdGVUaW1lIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdBY3R1YWxGaW5pc2gnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlPYmplY3QgZ2V0QWN0dWFsRmluaXNoKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0QWN0dWFsRmluaXNoIDxlbT5BY3R1YWwgRmluaXNoPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BY3R1YWwgRmluaXNoPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRBY3R1YWxGaW5pc2goKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEFjdHVhbEZpbmlzaChPYmplY3QgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QWN0dWFsIE92ZXJ0aW1lIENvc3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBhY3R1YWwgb3ZlcnRpbWUgY29zdCBpbmN1cnJlZCBvbiB0aGUgYXNzaWdubWVudC4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkFjdHVhbCBPdmVydGltZSBDb3N0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRBY3R1YWxPdmVydGltZUNvc3QoQmlnRGVjaW1hbCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRBc3NpZ25tZW50X0FjdHVhbE92ZXJ0aW1lQ29zdCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRGVjaW1hbCIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQWN0dWFsT3ZlcnRpbWVDb3N0JyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnRGVjaW1hbCBnZXRBY3R1YWxPdmVydGltZUNvc3QoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRBY3R1YWxPdmVydGltZUNvc3QgPGVtPkFjdHVhbCBPdmVydGltZSBDb3N0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BY3R1YWwgT3ZlcnRpbWUgQ29zdDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0QWN0dWFsT3ZlcnRpbWVDb3N0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRBY3R1YWxPdmVydGltZUNvc3QoQmlnRGVjaW1hbCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BY3R1YWwgT3ZlcnRpbWUgV29yazwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGFjdHVhbCBhbW91bnQgb2Ygb3ZlcnRpbWUgd29yayBpbmN1cnJlZCBvbiB0aGUgYXNzaWdubWVudC4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkFjdHVhbCBPdmVydGltZSBXb3JrPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRBY3R1YWxPdmVydGltZVdvcmsoT2JqZWN0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEFzc2lnbm1lbnRfQWN0dWFsT3ZlcnRpbWVXb3JrKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EdXJhdGlvbiIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQWN0dWFsT3ZlcnRpbWVXb3JrJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JT2JqZWN0IGdldEFjdHVhbE92ZXJ0aW1lV29yaygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldEFjdHVhbE92ZXJ0aW1lV29yayA8ZW0+QWN0dWFsIE92ZXJ0aW1lIFdvcms8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkFjdHVhbCBPdmVydGltZSBXb3JrPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRBY3R1YWxPdmVydGltZVdvcmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEFjdHVhbE92ZXJ0aW1lV29yayhPYmplY3QgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QWN0dWFsIFN0YXJ0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgYWN0dWFsIHN0YXJ0IGRhdGUgb2YgdGhlIGFzc2lnbm1lbnQuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BY3R1YWwgU3RhcnQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEFjdHVhbFN0YXJ0KE9iamVjdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRBc3NpZ25tZW50X0FjdHVhbFN0YXJ0KCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EYXRlVGltZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQWN0dWFsU3RhcnQnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlPYmplY3QgZ2V0QWN0dWFsU3RhcnQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRBY3R1YWxTdGFydCA8ZW0+QWN0dWFsIFN0YXJ0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BY3R1YWwgU3RhcnQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEFjdHVhbFN0YXJ0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRBY3R1YWxTdGFydChPYmplY3QgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QWN0dWFsIFdvcms8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBhY3R1YWwgYW1vdW50IG9mIHdvcmsgaW5jdXJyZWQgb24gdGhlIGFzc2lnbm1lbnQuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BY3R1YWwgV29yazwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0QWN0dWFsV29yayhPYmplY3QpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0QXNzaWdubWVudF9BY3R1YWxXb3JrKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EdXJhdGlvbiIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQWN0dWFsV29yaycgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU9iamVjdCBnZXRBY3R1YWxXb3JrKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0QWN0dWFsV29yayA8ZW0+QWN0dWFsIFdvcms8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkFjdHVhbCBXb3JrPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRBY3R1YWxXb3JrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRBY3R1YWxXb3JrKE9iamVjdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BQ1dQPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgYWN0dWFsIGNvc3Qgb2Ygd29yayBwZXJmb3JtZWQgb24gdGhlIGFzc2lnbm1lbnQgdG8tZGF0ZS4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkFDV1A8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0QUNXUCgpCi0JICogQHNlZSAjdW5zZXRBQ1dQKCkKLQkgKiBAc2VlICNzZXRBQ1dQKGZsb2F0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEFzc2lnbm1lbnRfQUNXUCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRmxvYXQiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0FDV1AnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlmbG9hdCBnZXRBQ1dQKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0QUNXUCA8ZW0+QUNXUDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QUNXUDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRBQ1dQKCkKLQkgKiBAc2VlICN1bnNldEFDV1AoKQotCSAqIEBzZWUgI2dldEFDV1AoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEFDV1AoZmxvYXQgdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0QUNXUCA8ZW0+QUNXUDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRBQ1dQKCkKLQkgKiBAc2VlICNnZXRBQ1dQKCkKLQkgKiBAc2VlICNzZXRBQ1dQKGZsb2F0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0QUNXUCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0QUNXUCA8ZW0+QUNXUDwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QUNXUDwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0QUNXUCgpCi0JICogQHNlZSAjZ2V0QUNXUCgpCi0JICogQHNlZSAjc2V0QUNXUChmbG9hdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldEFDV1AoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNvbmZpcm1lZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogV2hldGhlciB0aGUgUmVzb3VyY2UgaGFzIGFjY2VwdGVkIGFsbCBvZiBoaXMgb3IgaGVyIGFzc2lnbm1lbnRzLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q29uZmlybWVkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldENvbmZpcm1lZCgpCi0JICogQHNlZSAjdW5zZXRDb25maXJtZWQoKQotCSAqIEBzZWUgI3NldENvbmZpcm1lZChib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEFzc2lnbm1lbnRfQ29uZmlybWVkKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdDb25maXJtZWQnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzQ29uZmlybWVkKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjaXNDb25maXJtZWQgPGVtPkNvbmZpcm1lZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q29uZmlybWVkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldENvbmZpcm1lZCgpCi0JICogQHNlZSAjdW5zZXRDb25maXJtZWQoKQotCSAqIEBzZWUgI2lzQ29uZmlybWVkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRDb25maXJtZWQoYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNpc0NvbmZpcm1lZCA8ZW0+Q29uZmlybWVkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldENvbmZpcm1lZCgpCi0JICogQHNlZSAjaXNDb25maXJtZWQoKQotCSAqIEBzZWUgI3NldENvbmZpcm1lZChib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0Q29uZmlybWVkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNpc0NvbmZpcm1lZCA8ZW0+Q29uZmlybWVkPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Db25maXJtZWQ8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldENvbmZpcm1lZCgpCi0JICogQHNlZSAjaXNDb25maXJtZWQoKQotCSAqIEBzZWUgI3NldENvbmZpcm1lZChib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0Q29uZmlybWVkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Db3N0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgcHJvamVjdGVkIG9yIHNjaGVkdWxlZCBjb3N0IG9mIHRoZSBhc3NpZ25tZW50LgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q29zdDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0Q29zdChCaWdEZWNpbWFsKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEFzc2lnbm1lbnRfQ29zdCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRGVjaW1hbCIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQ29zdCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0RlY2ltYWwgZ2V0Q29zdCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldENvc3QgPGVtPkNvc3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNvc3Q8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldENvc3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldENvc3QoQmlnRGVjaW1hbCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Db3N0IFJhdGUgVGFibGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBjb3N0IHJhdGUgdGFibGUgdXNlZCBmb3IgdGhlIGFzc2lnbm1lbnQuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Db3N0IFJhdGUgVGFibGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldENvc3RSYXRlVGFibGUoQmlnSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRBc3NpZ25tZW50X0Nvc3RSYXRlVGFibGUoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Db3N0UmF0ZVRhYmxlVHlwZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQ29zdFJhdGVUYWJsZScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0ludGVnZXIgZ2V0Q29zdFJhdGVUYWJsZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldENvc3RSYXRlVGFibGUgPGVtPkNvc3QgUmF0ZSBUYWJsZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q29zdCBSYXRlIFRhYmxlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRDb3N0UmF0ZVRhYmxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRDb3N0UmF0ZVRhYmxlKEJpZ0ludGVnZXIgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q29zdCBWYXJpYW5jZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgY29zdCBhbmQgYmFzZWxpbmUgY29zdCBmb3IgYSByZXNvdXJjZS4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNvc3QgVmFyaWFuY2U8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0Q29zdFZhcmlhbmNlKCkKLQkgKiBAc2VlICN1bnNldENvc3RWYXJpYW5jZSgpCi0JICogQHNlZSAjc2V0Q29zdFZhcmlhbmNlKGZsb2F0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEFzc2lnbm1lbnRfQ29zdFZhcmlhbmNlKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5GbG9hdCIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQ29zdFZhcmlhbmNlJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JZmxvYXQgZ2V0Q29zdFZhcmlhbmNlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0Q29zdFZhcmlhbmNlIDxlbT5Db3N0IFZhcmlhbmNlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Db3N0IFZhcmlhbmNlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldENvc3RWYXJpYW5jZSgpCi0JICogQHNlZSAjdW5zZXRDb3N0VmFyaWFuY2UoKQotCSAqIEBzZWUgI2dldENvc3RWYXJpYW5jZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Q29zdFZhcmlhbmNlKGZsb2F0IHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldENvc3RWYXJpYW5jZSA8ZW0+Q29zdCBWYXJpYW5jZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRDb3N0VmFyaWFuY2UoKQotCSAqIEBzZWUgI2dldENvc3RWYXJpYW5jZSgpCi0JICogQHNlZSAjc2V0Q29zdFZhcmlhbmNlKGZsb2F0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0Q29zdFZhcmlhbmNlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRDb3N0VmFyaWFuY2UgPGVtPkNvc3QgVmFyaWFuY2U8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNvc3QgVmFyaWFuY2U8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldENvc3RWYXJpYW5jZSgpCi0JICogQHNlZSAjZ2V0Q29zdFZhcmlhbmNlKCkKLQkgKiBAc2VlICNzZXRDb3N0VmFyaWFuY2UoZmxvYXQpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRDb3N0VmFyaWFuY2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNWPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBFYXJuZWQgdmFsdWUgY29zdCB2YXJpYW5jZS4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNWPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldENWKCkKLQkgKiBAc2VlICN1bnNldENWKCkKLQkgKiBAc2VlICNzZXRDVihmbG9hdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRBc3NpZ25tZW50X0NWKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5GbG9hdCIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQ1YnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlmbG9hdCBnZXRDVigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldENWIDxlbT5DVjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q1Y8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0Q1YoKQotCSAqIEBzZWUgI3Vuc2V0Q1YoKQotCSAqIEBzZWUgI2dldENWKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRDVihmbG9hdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRDViA8ZW0+Q1Y8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0Q1YoKQotCSAqIEBzZWUgI2dldENWKCkKLQkgKiBAc2VlICNzZXRDVihmbG9hdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldENWKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRDViA8ZW0+Q1Y8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNWPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRDVigpCi0JICogQHNlZSAjZ2V0Q1YoKQotCSAqIEBzZWUgI3NldENWKGZsb2F0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0Q1YoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRlbGF5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgYW1vdW50IHRoYXQgdGhlIGFzc2lnbm1lbnQgaXMgZGVsYXllZC4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRlbGF5PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXREZWxheShCaWdJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEFzc2lnbm1lbnRfRGVsYXkoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkludGVnZXIiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0RlbGF5JyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnSW50ZWdlciBnZXREZWxheSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldERlbGF5IDxlbT5EZWxheTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RGVsYXk8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldERlbGF5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXREZWxheShCaWdJbnRlZ2VyIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkZpbmlzaDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHNjaGVkdWxlZCBmaW5pc2ggZGF0ZSBvZiB0aGUgYXNzaWdubWVudC4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkZpbmlzaDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0RmluaXNoKE9iamVjdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRBc3NpZ25tZW50X0ZpbmlzaCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRGF0ZVRpbWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0ZpbmlzaCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU9iamVjdCBnZXRGaW5pc2goKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRGaW5pc2ggPGVtPkZpbmlzaDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RmluaXNoPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRGaW5pc2goKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEZpbmlzaChPYmplY3QgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RmluaXNoIFZhcmlhbmNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgdmFyaWFuY2Ugb2YgdGhlIGFzc2lnbm1lbnQgZmluaXNoIGRhdGUgZnJvbSB0aGUgYmFzZWxpbmUgZmluaXNoIGRhdGUuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5GaW5pc2ggVmFyaWFuY2U8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEZpbmlzaFZhcmlhbmNlKEJpZ0ludGVnZXIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0QXNzaWdubWVudF9GaW5pc2hWYXJpYW5jZSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuSW50ZWdlciIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nRmluaXNoVmFyaWFuY2UnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdJbnRlZ2VyIGdldEZpbmlzaFZhcmlhbmNlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0RmluaXNoVmFyaWFuY2UgPGVtPkZpbmlzaCBWYXJpYW5jZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RmluaXNoIFZhcmlhbmNlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRGaW5pc2hWYXJpYW5jZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RmluaXNoVmFyaWFuY2UoQmlnSW50ZWdlciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5IeXBlcmxpbms8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSB0aXRsZSBvZiB0aGUgaHlwZXJsaW5rIGFzc29jaWF0ZWQgd2l0aCB0aGUgYXNzaWdubWVudC4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkh5cGVybGluazwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0SHlwZXJsaW5rKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRBc3NpZ25tZW50X0h5cGVybGluaygpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lkh5cGVybGlua1R5cGUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0h5cGVybGluaycgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRIeXBlcmxpbmsoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRIeXBlcmxpbmsgPGVtPkh5cGVybGluazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SHlwZXJsaW5rPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRIeXBlcmxpbmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEh5cGVybGluayhTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SHlwZXJsaW5rIEFkZHJlc3M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBoeXBlcmxpbmsgYXNzb2NpYXRlZCB3aXRoIHRoZSBhc3NpZ25tZW50LgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SHlwZXJsaW5rIEFkZHJlc3M8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEh5cGVybGlua0FkZHJlc3MoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEFzc2lnbm1lbnRfSHlwZXJsaW5rQWRkcmVzcygpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lkh5cGVybGlua0FkZHJlc3NUeXBlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdIeXBlcmxpbmtBZGRyZXNzJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldEh5cGVybGlua0FkZHJlc3MoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRIeXBlcmxpbmtBZGRyZXNzIDxlbT5IeXBlcmxpbmsgQWRkcmVzczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SHlwZXJsaW5rIEFkZHJlc3M8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEh5cGVybGlua0FkZHJlc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEh5cGVybGlua0FkZHJlc3MoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkh5cGVybGluayBTdWIgQWRkcmVzczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGRvY3VtZW50IGJvb2ttYXJrIG9mIHRoZSBoeXBlcmxpbmsgYXNzb2NpYXRlZCB3aXRoIHRoZSBhc3NpZ25tZW50LgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SHlwZXJsaW5rIFN1YiBBZGRyZXNzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRIeXBlcmxpbmtTdWJBZGRyZXNzKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRBc3NpZ25tZW50X0h5cGVybGlua1N1YkFkZHJlc3MoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5IeXBlcmxpbmtTdWJBZGRyZXNzVHlwZTEiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0h5cGVybGlua1N1YkFkZHJlc3MnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0SHlwZXJsaW5rU3ViQWRkcmVzcygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldEh5cGVybGlua1N1YkFkZHJlc3MgPGVtPkh5cGVybGluayBTdWIgQWRkcmVzczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SHlwZXJsaW5rIFN1YiBBZGRyZXNzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRIeXBlcmxpbmtTdWJBZGRyZXNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRIeXBlcmxpbmtTdWJBZGRyZXNzKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Xb3JrIFZhcmlhbmNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgdmFyaWFuY2Ugb2YgYXNzaWdubWVudCB3b3JrIGZyb20gdGhlIGJhc2VsaW5lIHdvcmsgYXMgbWludXRlcyB4IDEwMDAuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Xb3JrIFZhcmlhbmNlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldFdvcmtWYXJpYW5jZSgpCi0JICogQHNlZSAjdW5zZXRXb3JrVmFyaWFuY2UoKQotCSAqIEBzZWUgI3NldFdvcmtWYXJpYW5jZShmbG9hdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRBc3NpZ25tZW50X1dvcmtWYXJpYW5jZSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRmxvYXQiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1dvcmtWYXJpYW5jZScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWZsb2F0IGdldFdvcmtWYXJpYW5jZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldFdvcmtWYXJpYW5jZSA8ZW0+V29yayBWYXJpYW5jZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+V29yayBWYXJpYW5jZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRXb3JrVmFyaWFuY2UoKQotCSAqIEBzZWUgI3Vuc2V0V29ya1ZhcmlhbmNlKCkKLQkgKiBAc2VlICNnZXRXb3JrVmFyaWFuY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFdvcmtWYXJpYW5jZShmbG9hdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRXb3JrVmFyaWFuY2UgPGVtPldvcmsgVmFyaWFuY2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0V29ya1ZhcmlhbmNlKCkKLQkgKiBAc2VlICNnZXRXb3JrVmFyaWFuY2UoKQotCSAqIEBzZWUgI3NldFdvcmtWYXJpYW5jZShmbG9hdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldFdvcmtWYXJpYW5jZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0V29ya1ZhcmlhbmNlIDxlbT5Xb3JrIFZhcmlhbmNlPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Xb3JrIFZhcmlhbmNlPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRXb3JrVmFyaWFuY2UoKQotCSAqIEBzZWUgI2dldFdvcmtWYXJpYW5jZSgpCi0JICogQHNlZSAjc2V0V29ya1ZhcmlhbmNlKGZsb2F0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0V29ya1ZhcmlhbmNlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5IYXMgRml4ZWQgUmF0ZSBVbml0czwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogV2hldGhlciB0aGUgVW5pdHMgYXJlIEZpeGVkIFJhdGUuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5IYXMgRml4ZWQgUmF0ZSBVbml0czwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRIYXNGaXhlZFJhdGVVbml0cygpCi0JICogQHNlZSAjdW5zZXRIYXNGaXhlZFJhdGVVbml0cygpCi0JICogQHNlZSAjc2V0SGFzRml4ZWRSYXRlVW5pdHMoYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRBc3NpZ25tZW50X0hhc0ZpeGVkUmF0ZVVuaXRzKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdIYXNGaXhlZFJhdGVVbml0cycgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNIYXNGaXhlZFJhdGVVbml0cygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2lzSGFzRml4ZWRSYXRlVW5pdHMgPGVtPkhhcyBGaXhlZCBSYXRlIFVuaXRzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5IYXMgRml4ZWQgUmF0ZSBVbml0czwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRIYXNGaXhlZFJhdGVVbml0cygpCi0JICogQHNlZSAjdW5zZXRIYXNGaXhlZFJhdGVVbml0cygpCi0JICogQHNlZSAjaXNIYXNGaXhlZFJhdGVVbml0cygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0SGFzRml4ZWRSYXRlVW5pdHMoYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNpc0hhc0ZpeGVkUmF0ZVVuaXRzIDxlbT5IYXMgRml4ZWQgUmF0ZSBVbml0czwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRIYXNGaXhlZFJhdGVVbml0cygpCi0JICogQHNlZSAjaXNIYXNGaXhlZFJhdGVVbml0cygpCi0JICogQHNlZSAjc2V0SGFzRml4ZWRSYXRlVW5pdHMoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldEhhc0ZpeGVkUmF0ZVVuaXRzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNpc0hhc0ZpeGVkUmF0ZVVuaXRzIDxlbT5IYXMgRml4ZWQgUmF0ZSBVbml0czwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SGFzIEZpeGVkIFJhdGUgVW5pdHM8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldEhhc0ZpeGVkUmF0ZVVuaXRzKCkKLQkgKiBAc2VlICNpc0hhc0ZpeGVkUmF0ZVVuaXRzKCkKLQkgKiBAc2VlICNzZXRIYXNGaXhlZFJhdGVVbml0cyhib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0SGFzRml4ZWRSYXRlVW5pdHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkZpeGVkIE1hdGVyaWFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBXaGV0aGVyIHRoZSBjb25zdW1wdGlvbiBvZiB0aGUgYXNzaWduZWQgbWF0ZXJpYWwgcmVzb3VyY2Ugb2NjdXJzIGluIGEgc2luZ2xlLCBmaXhlZCBhbW91bnQuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5GaXhlZCBNYXRlcmlhbDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRGaXhlZE1hdGVyaWFsKCkKLQkgKiBAc2VlICN1bnNldEZpeGVkTWF0ZXJpYWwoKQotCSAqIEBzZWUgI3NldEZpeGVkTWF0ZXJpYWwoYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRBc3NpZ25tZW50X0ZpeGVkTWF0ZXJpYWwoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW4iCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0ZpeGVkTWF0ZXJpYWwnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzRml4ZWRNYXRlcmlhbCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2lzRml4ZWRNYXRlcmlhbCA8ZW0+Rml4ZWQgTWF0ZXJpYWw8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkZpeGVkIE1hdGVyaWFsPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldEZpeGVkTWF0ZXJpYWwoKQotCSAqIEBzZWUgI3Vuc2V0Rml4ZWRNYXRlcmlhbCgpCi0JICogQHNlZSAjaXNGaXhlZE1hdGVyaWFsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRGaXhlZE1hdGVyaWFsKGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjaXNGaXhlZE1hdGVyaWFsIDxlbT5GaXhlZCBNYXRlcmlhbDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRGaXhlZE1hdGVyaWFsKCkKLQkgKiBAc2VlICNpc0ZpeGVkTWF0ZXJpYWwoKQotCSAqIEBzZWUgI3NldEZpeGVkTWF0ZXJpYWwoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldEZpeGVkTWF0ZXJpYWwoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2lzRml4ZWRNYXRlcmlhbCA8ZW0+Rml4ZWQgTWF0ZXJpYWw8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkZpeGVkIE1hdGVyaWFsPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRGaXhlZE1hdGVyaWFsKCkKLQkgKiBAc2VlICNpc0ZpeGVkTWF0ZXJpYWwoKQotCSAqIEBzZWUgI3NldEZpeGVkTWF0ZXJpYWwoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldEZpeGVkTWF0ZXJpYWwoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkxldmVsaW5nIERlbGF5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgZGVsYXkgY2F1c2VkIGJ5IGxldmVsaW5nLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TGV2ZWxpbmcgRGVsYXk8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldExldmVsaW5nRGVsYXkoQmlnSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRBc3NpZ25tZW50X0xldmVsaW5nRGVsYXkoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkludGVnZXIiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0xldmVsaW5nRGVsYXknIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdJbnRlZ2VyIGdldExldmVsaW5nRGVsYXkoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRMZXZlbGluZ0RlbGF5IDxlbT5MZXZlbGluZyBEZWxheTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TGV2ZWxpbmcgRGVsYXk8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldExldmVsaW5nRGVsYXkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldExldmVsaW5nRGVsYXkoQmlnSW50ZWdlciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5MZXZlbGluZyBEZWxheSBGb3JtYXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBmb3JtYXQgZm9yIGV4cHJlc3NpbmcgdGhlIGR1cmF0aW9uIG9mIHRoZSBkZWxheS4gIAotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZXMgYXJlOiAzPW0sIDQ9ZW0sIDU9aCwgNj1laCwgNz1kLCA4PWVkLCA5PXcsIDEwPWV3LCAxMT1tbywgMTI9ZW1vLCAxOT0lLCAyMD1lJSwgMjE9bnVsbCwgCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIDM1PW0/LCAzNj1lbT8sIDM3PWg/LCAzOD1laD8sIDM5PWQ/LCA0MD1lZD8sIDQxPXc/LCA0Mj1ldz8sIDQzPW1vPywgNDQ9ZW1vPywgNTE9JT8sIDUyPWUlPyBhbmQgNTM9bnVsbC4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkxldmVsaW5nIERlbGF5IEZvcm1hdDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0TGV2ZWxpbmdEZWxheUZvcm1hdChCaWdJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEFzc2lnbm1lbnRfTGV2ZWxpbmdEZWxheUZvcm1hdCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkxldmVsaW5nRGVsYXlGb3JtYXRUeXBlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdMZXZlbGluZ0RlbGF5Rm9ybWF0JyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnSW50ZWdlciBnZXRMZXZlbGluZ0RlbGF5Rm9ybWF0KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0TGV2ZWxpbmdEZWxheUZvcm1hdCA8ZW0+TGV2ZWxpbmcgRGVsYXkgRm9ybWF0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5MZXZlbGluZyBEZWxheSBGb3JtYXQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldExldmVsaW5nRGVsYXlGb3JtYXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldExldmVsaW5nRGVsYXlGb3JtYXQoQmlnSW50ZWdlciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5MaW5rZWQgRmllbGRzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBXaGV0aGVyIHRoZSBQcm9qZWN0IGlzIGxpbmtlZCB0byBhbm90aGVyIE9MRSBvYmplY3QuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5MaW5rZWQgRmllbGRzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldExpbmtlZEZpZWxkcygpCi0JICogQHNlZSAjdW5zZXRMaW5rZWRGaWVsZHMoKQotCSAqIEBzZWUgI3NldExpbmtlZEZpZWxkcyhib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEFzc2lnbm1lbnRfTGlua2VkRmllbGRzKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdMaW5rZWRGaWVsZHMnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzTGlua2VkRmllbGRzKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjaXNMaW5rZWRGaWVsZHMgPGVtPkxpbmtlZCBGaWVsZHM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkxpbmtlZCBGaWVsZHM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0TGlua2VkRmllbGRzKCkKLQkgKiBAc2VlICN1bnNldExpbmtlZEZpZWxkcygpCi0JICogQHNlZSAjaXNMaW5rZWRGaWVsZHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldExpbmtlZEZpZWxkcyhib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2lzTGlua2VkRmllbGRzIDxlbT5MaW5rZWQgRmllbGRzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldExpbmtlZEZpZWxkcygpCi0JICogQHNlZSAjaXNMaW5rZWRGaWVsZHMoKQotCSAqIEBzZWUgI3NldExpbmtlZEZpZWxkcyhib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0TGlua2VkRmllbGRzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNpc0xpbmtlZEZpZWxkcyA8ZW0+TGlua2VkIEZpZWxkczwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TGlua2VkIEZpZWxkczwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0TGlua2VkRmllbGRzKCkKLQkgKiBAc2VlICNpc0xpbmtlZEZpZWxkcygpCi0JICogQHNlZSAjc2V0TGlua2VkRmllbGRzKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRMaW5rZWRGaWVsZHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1pbGVzdG9uZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogV2hldGhlciB0aGUgYXNzaWdubWVudCBpcyBhIG1pbGVzdG9uZS4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1pbGVzdG9uZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRNaWxlc3RvbmUoKQotCSAqIEBzZWUgI3Vuc2V0TWlsZXN0b25lKCkKLQkgKiBAc2VlICNzZXRNaWxlc3RvbmUoYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRBc3NpZ25tZW50X01pbGVzdG9uZSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbiIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nTWlsZXN0b25lJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc01pbGVzdG9uZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2lzTWlsZXN0b25lIDxlbT5NaWxlc3RvbmU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk1pbGVzdG9uZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRNaWxlc3RvbmUoKQotCSAqIEBzZWUgI3Vuc2V0TWlsZXN0b25lKCkKLQkgKiBAc2VlICNpc01pbGVzdG9uZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TWlsZXN0b25lKGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjaXNNaWxlc3RvbmUgPGVtPk1pbGVzdG9uZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRNaWxlc3RvbmUoKQotCSAqIEBzZWUgI2lzTWlsZXN0b25lKCkKLQkgKiBAc2VlICNzZXRNaWxlc3RvbmUoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldE1pbGVzdG9uZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjaXNNaWxlc3RvbmUgPGVtPk1pbGVzdG9uZTwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TWlsZXN0b25lPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRNaWxlc3RvbmUoKQotCSAqIEBzZWUgI2lzTWlsZXN0b25lKCkKLQkgKiBAc2VlICNzZXRNaWxlc3RvbmUoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldE1pbGVzdG9uZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Tm90ZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRleHQgbm90ZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBhc3NpZ25tZW50LgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Tm90ZXM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldE5vdGVzKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRBc3NpZ25tZW50X05vdGVzKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J05vdGVzJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldE5vdGVzKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0Tm90ZXMgPGVtPk5vdGVzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Ob3RlczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0Tm90ZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldE5vdGVzKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5PdmVyYWxsb2NhdGVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBXaGV0aGVyIHRoZSBhc3NpZ25tZW50IGlzIG92ZXJhbGxvY2F0ZWQuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5PdmVyYWxsb2NhdGVkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldE92ZXJhbGxvY2F0ZWQoKQotCSAqIEBzZWUgI3Vuc2V0T3ZlcmFsbG9jYXRlZCgpCi0JICogQHNlZSAjc2V0T3ZlcmFsbG9jYXRlZChib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEFzc2lnbm1lbnRfT3ZlcmFsbG9jYXRlZCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbiIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nT3ZlcmFsbG9jYXRlZCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNPdmVyYWxsb2NhdGVkKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjaXNPdmVyYWxsb2NhdGVkIDxlbT5PdmVyYWxsb2NhdGVkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5PdmVyYWxsb2NhdGVkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldE92ZXJhbGxvY2F0ZWQoKQotCSAqIEBzZWUgI3Vuc2V0T3ZlcmFsbG9jYXRlZCgpCi0JICogQHNlZSAjaXNPdmVyYWxsb2NhdGVkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRPdmVyYWxsb2NhdGVkKGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjaXNPdmVyYWxsb2NhdGVkIDxlbT5PdmVyYWxsb2NhdGVkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldE92ZXJhbGxvY2F0ZWQoKQotCSAqIEBzZWUgI2lzT3ZlcmFsbG9jYXRlZCgpCi0JICogQHNlZSAjc2V0T3ZlcmFsbG9jYXRlZChib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0T3ZlcmFsbG9jYXRlZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjaXNPdmVyYWxsb2NhdGVkIDxlbT5PdmVyYWxsb2NhdGVkPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5PdmVyYWxsb2NhdGVkPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRPdmVyYWxsb2NhdGVkKCkKLQkgKiBAc2VlICNpc092ZXJhbGxvY2F0ZWQoKQotCSAqIEBzZWUgI3NldE92ZXJhbGxvY2F0ZWQoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldE92ZXJhbGxvY2F0ZWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk92ZXJ0aW1lIENvc3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBzdW0gb2YgdGhlIGFjdHVhbCBhbmQgcmVtYWluaW5nIG92ZXJ0aW1lIGNvc3Qgb2YgdGhlIGFzc2lnbm1lbnQuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5PdmVydGltZSBDb3N0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRPdmVydGltZUNvc3QoQmlnRGVjaW1hbCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRBc3NpZ25tZW50X092ZXJ0aW1lQ29zdCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRGVjaW1hbCIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nT3ZlcnRpbWVDb3N0JyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnRGVjaW1hbCBnZXRPdmVydGltZUNvc3QoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRPdmVydGltZUNvc3QgPGVtPk92ZXJ0aW1lIENvc3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk92ZXJ0aW1lIENvc3Q8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldE92ZXJ0aW1lQ29zdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0T3ZlcnRpbWVDb3N0KEJpZ0RlY2ltYWwgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+T3ZlcnRpbWUgV29yazwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHNjaGVkdWxlZCBvdmVydGltZSB3b3JrIHNjaGVkdWxlZCBmb3IgdGhlIGFzc2lnbm1lbnQuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5PdmVydGltZSBXb3JrPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRPdmVydGltZVdvcmsoT2JqZWN0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEFzc2lnbm1lbnRfT3ZlcnRpbWVXb3JrKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EdXJhdGlvbiIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nT3ZlcnRpbWVXb3JrJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JT2JqZWN0IGdldE92ZXJ0aW1lV29yaygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldE92ZXJ0aW1lV29yayA8ZW0+T3ZlcnRpbWUgV29yazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+T3ZlcnRpbWUgV29yazwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0T3ZlcnRpbWVXb3JrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRPdmVydGltZVdvcmsoT2JqZWN0IHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJlZ3VsYXIgV29yazwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGFtb3VudCBvZiBub24tb3ZlcnRpbWUgd29yayBzY2hlZHVsZWQgZm9yIHRoZSBhc3NpZ25tZW50LgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmVndWxhciBXb3JrPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRSZWd1bGFyV29yayhPYmplY3QpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0QXNzaWdubWVudF9SZWd1bGFyV29yaygpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRHVyYXRpb24iCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1JlZ3VsYXJXb3JrJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JT2JqZWN0IGdldFJlZ3VsYXJXb3JrKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0UmVndWxhcldvcmsgPGVtPlJlZ3VsYXIgV29yazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UmVndWxhciBXb3JrPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRSZWd1bGFyV29yaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UmVndWxhcldvcmsoT2JqZWN0IHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJlbWFpbmluZyBDb3N0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgcmVtYWluaW5nIHByb2plY3RlZCBjb3N0IG9mIGNvbXBsZXRpbmcgdGhlIGFzc2lnbm1lbnQuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZW1haW5pbmcgQ29zdDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UmVtYWluaW5nQ29zdChCaWdEZWNpbWFsKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEFzc2lnbm1lbnRfUmVtYWluaW5nQ29zdCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRGVjaW1hbCIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nUmVtYWluaW5nQ29zdCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0RlY2ltYWwgZ2V0UmVtYWluaW5nQ29zdCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldFJlbWFpbmluZ0Nvc3QgPGVtPlJlbWFpbmluZyBDb3N0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5SZW1haW5pbmcgQ29zdDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UmVtYWluaW5nQ29zdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UmVtYWluaW5nQ29zdChCaWdEZWNpbWFsIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJlbWFpbmluZyBPdmVydGltZSBDb3N0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgcmVtYWluaW5nIHByb2plY3RlZCBvdmVydGltZSBjb3N0IG9mIGNvbXBsZXRpbmcgdGhlIGFzc2lnbm1lbnQuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZW1haW5pbmcgT3ZlcnRpbWUgQ29zdDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UmVtYWluaW5nT3ZlcnRpbWVDb3N0KEJpZ0RlY2ltYWwpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0QXNzaWdubWVudF9SZW1haW5pbmdPdmVydGltZUNvc3QoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkRlY2ltYWwiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1JlbWFpbmluZ092ZXJ0aW1lQ29zdCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0RlY2ltYWwgZ2V0UmVtYWluaW5nT3ZlcnRpbWVDb3N0KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0UmVtYWluaW5nT3ZlcnRpbWVDb3N0IDxlbT5SZW1haW5pbmcgT3ZlcnRpbWUgQ29zdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UmVtYWluaW5nIE92ZXJ0aW1lIENvc3Q8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFJlbWFpbmluZ092ZXJ0aW1lQ29zdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UmVtYWluaW5nT3ZlcnRpbWVDb3N0KEJpZ0RlY2ltYWwgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmVtYWluaW5nIE92ZXJ0aW1lIFdvcms8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSByZW1haW5pbmcgb3ZlcnRpbWUgd29yayBzY2hlZHVsZWQgdG8gY29tcGxldGUgdGhlIGFzc2lnbm1lbnQuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZW1haW5pbmcgT3ZlcnRpbWUgV29yazwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UmVtYWluaW5nT3ZlcnRpbWVXb3JrKE9iamVjdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRBc3NpZ25tZW50X1JlbWFpbmluZ092ZXJ0aW1lV29yaygpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRHVyYXRpb24iCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1JlbWFpbmluZ092ZXJ0aW1lV29yaycgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU9iamVjdCBnZXRSZW1haW5pbmdPdmVydGltZVdvcmsoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRSZW1haW5pbmdPdmVydGltZVdvcmsgPGVtPlJlbWFpbmluZyBPdmVydGltZSBXb3JrPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5SZW1haW5pbmcgT3ZlcnRpbWUgV29yazwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UmVtYWluaW5nT3ZlcnRpbWVXb3JrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRSZW1haW5pbmdPdmVydGltZVdvcmsoT2JqZWN0IHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJlbWFpbmluZyBXb3JrPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgcmVtYWluaW5nIHdvcmsgc2NoZWR1bGVkIHRvIGNvbXBsZXRlIHRoZSBhc3NpZ25tZW50LgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmVtYWluaW5nIFdvcms8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFJlbWFpbmluZ1dvcmsoT2JqZWN0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEFzc2lnbm1lbnRfUmVtYWluaW5nV29yaygpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRHVyYXRpb24iCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1JlbWFpbmluZ1dvcmsnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlPYmplY3QgZ2V0UmVtYWluaW5nV29yaygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldFJlbWFpbmluZ1dvcmsgPGVtPlJlbWFpbmluZyBXb3JrPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5SZW1haW5pbmcgV29yazwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UmVtYWluaW5nV29yaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UmVtYWluaW5nV29yayhPYmplY3QgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmVzcG9uc2UgUGVuZGluZzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVHJ1ZSBpZiBhIHJlc3BvbnNlIGhhcyBub3QgYmVlbiByZWNlaXZlZCBmb3IgYSBUZWFtQXNzaWduIG1lc3NhZ2UuIAotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmVzcG9uc2UgUGVuZGluZzwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRSZXNwb25zZVBlbmRpbmcoKQotCSAqIEBzZWUgI3Vuc2V0UmVzcG9uc2VQZW5kaW5nKCkKLQkgKiBAc2VlICNzZXRSZXNwb25zZVBlbmRpbmcoYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRBc3NpZ25tZW50X1Jlc3BvbnNlUGVuZGluZygpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbiIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nUmVzcG9uc2VQZW5kaW5nJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1Jlc3BvbnNlUGVuZGluZygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2lzUmVzcG9uc2VQZW5kaW5nIDxlbT5SZXNwb25zZSBQZW5kaW5nPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5SZXNwb25zZSBQZW5kaW5nPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldFJlc3BvbnNlUGVuZGluZygpCi0JICogQHNlZSAjdW5zZXRSZXNwb25zZVBlbmRpbmcoKQotCSAqIEBzZWUgI2lzUmVzcG9uc2VQZW5kaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRSZXNwb25zZVBlbmRpbmcoYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNpc1Jlc3BvbnNlUGVuZGluZyA8ZW0+UmVzcG9uc2UgUGVuZGluZzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRSZXNwb25zZVBlbmRpbmcoKQotCSAqIEBzZWUgI2lzUmVzcG9uc2VQZW5kaW5nKCkKLQkgKiBAc2VlICNzZXRSZXNwb25zZVBlbmRpbmcoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldFJlc3BvbnNlUGVuZGluZygpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjaXNSZXNwb25zZVBlbmRpbmcgPGVtPlJlc3BvbnNlIFBlbmRpbmc8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJlc3BvbnNlIFBlbmRpbmc8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldFJlc3BvbnNlUGVuZGluZygpCi0JICogQHNlZSAjaXNSZXNwb25zZVBlbmRpbmcoKQotCSAqIEBzZWUgI3NldFJlc3BvbnNlUGVuZGluZyhib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0UmVzcG9uc2VQZW5kaW5nKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TdGFydDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHNjaGVkdWxlZCBzdGFydCBkYXRlIG9mIHRoZSBhc3NpZ25tZW50LgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U3RhcnQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFN0YXJ0KE9iamVjdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRBc3NpZ25tZW50X1N0YXJ0KCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EYXRlVGltZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nU3RhcnQnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlPYmplY3QgZ2V0U3RhcnQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRTdGFydCA8ZW0+U3RhcnQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlN0YXJ0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRTdGFydCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0U3RhcnQoT2JqZWN0IHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlN0b3A8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBkYXRlIHRoYXQgdGhlIGFzc2lnbm1lbnQgd2FzIHN0b3BwZWQuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TdG9wPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRTdG9wKE9iamVjdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRBc3NpZ25tZW50X1N0b3AoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkRhdGVUaW1lIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdTdG9wJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JT2JqZWN0IGdldFN0b3AoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRTdG9wIDxlbT5TdG9wPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TdG9wPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRTdG9wKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRTdG9wKE9iamVjdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SZXN1bWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBkYXRlIHRoYXQgdGhlIGFzc2lnbm1lbnQgcmVzdW1lZC4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJlc3VtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UmVzdW1lKE9iamVjdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRBc3NpZ25tZW50X1Jlc3VtZSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRGF0ZVRpbWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1Jlc3VtZScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU9iamVjdCBnZXRSZXN1bWUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRSZXN1bWUgPGVtPlJlc3VtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UmVzdW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRSZXN1bWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFJlc3VtZShPYmplY3QgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U3RhcnQgVmFyaWFuY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSB2YXJpYW5jZSBvZiB0aGUgYXNzaWdubWVudCBzdGFydCBkYXRlIGZyb20gdGhlIGJhc2VsaW5lIHN0YXJ0IGRhdGUuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TdGFydCBWYXJpYW5jZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0U3RhcnRWYXJpYW5jZShCaWdJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEFzc2lnbm1lbnRfU3RhcnRWYXJpYW5jZSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuSW50ZWdlciIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nU3RhcnRWYXJpYW5jZScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0ludGVnZXIgZ2V0U3RhcnRWYXJpYW5jZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldFN0YXJ0VmFyaWFuY2UgPGVtPlN0YXJ0IFZhcmlhbmNlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TdGFydCBWYXJpYW5jZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0U3RhcnRWYXJpYW5jZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0U3RhcnRWYXJpYW5jZShCaWdJbnRlZ2VyIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlVuaXRzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgbnVtYmVyIG9mIHVuaXRzIGZvciB0aGUgYXNzaWdubWVudC4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlVuaXRzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldFVuaXRzKCkKLQkgKiBAc2VlICN1bnNldFVuaXRzKCkKLQkgKiBAc2VlICNzZXRVbml0cyhmbG9hdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRBc3NpZ25tZW50X1VuaXRzKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5GbG9hdCIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nVW5pdHMnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlmbG9hdCBnZXRVbml0cygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldFVuaXRzIDxlbT5Vbml0czwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VW5pdHM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0VW5pdHMoKQotCSAqIEBzZWUgI3Vuc2V0VW5pdHMoKQotCSAqIEBzZWUgI2dldFVuaXRzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRVbml0cyhmbG9hdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRVbml0cyA8ZW0+VW5pdHM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0VW5pdHMoKQotCSAqIEBzZWUgI2dldFVuaXRzKCkKLQkgKiBAc2VlICNzZXRVbml0cyhmbG9hdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldFVuaXRzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRVbml0cyA8ZW0+VW5pdHM8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlVuaXRzPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRVbml0cygpCi0JICogQHNlZSAjZ2V0VW5pdHMoKQotCSAqIEBzZWUgI3NldFVuaXRzKGZsb2F0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0VW5pdHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlVwZGF0ZSBOZWVkZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRydWUgaWYgdGhlIHJlc291cmNlIGFzc2lnbmVkIHRvIGEgdGFzayBuZWVkcyB0byBiZSB1cGRhdGVkIGFzIHRvIHRoZSBzdGF0dXMgb2YgdGhlIHRhc2suCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5VcGRhdGUgTmVlZGVkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldFVwZGF0ZU5lZWRlZCgpCi0JICogQHNlZSAjdW5zZXRVcGRhdGVOZWVkZWQoKQotCSAqIEBzZWUgI3NldFVwZGF0ZU5lZWRlZChib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEFzc2lnbm1lbnRfVXBkYXRlTmVlZGVkKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdVcGRhdGVOZWVkZWQnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzVXBkYXRlTmVlZGVkKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjaXNVcGRhdGVOZWVkZWQgPGVtPlVwZGF0ZSBOZWVkZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlVwZGF0ZSBOZWVkZWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0VXBkYXRlTmVlZGVkKCkKLQkgKiBAc2VlICN1bnNldFVwZGF0ZU5lZWRlZCgpCi0JICogQHNlZSAjaXNVcGRhdGVOZWVkZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFVwZGF0ZU5lZWRlZChib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2lzVXBkYXRlTmVlZGVkIDxlbT5VcGRhdGUgTmVlZGVkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldFVwZGF0ZU5lZWRlZCgpCi0JICogQHNlZSAjaXNVcGRhdGVOZWVkZWQoKQotCSAqIEBzZWUgI3NldFVwZGF0ZU5lZWRlZChib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0VXBkYXRlTmVlZGVkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNpc1VwZGF0ZU5lZWRlZCA8ZW0+VXBkYXRlIE5lZWRlZDwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VXBkYXRlIE5lZWRlZDwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0VXBkYXRlTmVlZGVkKCkKLQkgKiBAc2VlICNpc1VwZGF0ZU5lZWRlZCgpCi0JICogQHNlZSAjc2V0VXBkYXRlTmVlZGVkKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRVcGRhdGVOZWVkZWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlZBQzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBiYXNsaW5lIGNvc3QgYW5kIHRvdGFsIGNvc3QuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5WQUM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0VkFDKCkKLQkgKiBAc2VlICN1bnNldFZBQygpCi0JICogQHNlZSAjc2V0VkFDKGZsb2F0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEFzc2lnbm1lbnRfVkFDKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5GbG9hdCIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nVkFDJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JZmxvYXQgZ2V0VkFDKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0VkFDIDxlbT5WQUM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlZBQzwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRWQUMoKQotCSAqIEBzZWUgI3Vuc2V0VkFDKCkKLQkgKiBAc2VlICNnZXRWQUMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFZBQyhmbG9hdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRWQUMgPGVtPlZBQzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRWQUMoKQotCSAqIEBzZWUgI2dldFZBQygpCi0JICogQHNlZSAjc2V0VkFDKGZsb2F0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0VkFDKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRWQUMgPGVtPlZBQzwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VkFDPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRWQUMoKQotCSAqIEBzZWUgI2dldFZBQygpCi0JICogQHNlZSAjc2V0VkFDKGZsb2F0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0VkFDKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Xb3JrPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgYW1vdW50IG9mIHNjaGVkdWxlZCB3b3JrIGZvciB0aGUgYXNzaWdubWVudC4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPldvcms8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFdvcmsoT2JqZWN0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEFzc2lnbm1lbnRfV29yaygpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRHVyYXRpb24iCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1dvcmsnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlPYmplY3QgZ2V0V29yaygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldFdvcmsgPGVtPldvcms8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPldvcms8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFdvcmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFdvcmsoT2JqZWN0IHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPldvcmsgQ29udG91cjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHdvcmsgY29udG91ciBvZiB0aGUgYXNzaWdubWVudC4gCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlcyBhcmU6IDA9RmxhdCwgMT1CYWNrIExvYWRlZCwgMj1Gcm9udCBMb2FkZWQsIDM9RG91YmxlIFBlYWssIDQ9RWFybHkgUGVhaywgNT1MYXRlIFBlYWssIAotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICA2PUJlbGwsIDc9VHVydGxlLCA4PUNvbnRvdXJlZAotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+V29yayBDb250b3VyPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRXb3JrQ29udG91cihCaWdJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEFzc2lnbm1lbnRfV29ya0NvbnRvdXIoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Xb3JrQ29udG91clR5cGUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1dvcmtDb250b3VyJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnSW50ZWdlciBnZXRXb3JrQ29udG91cigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldFdvcmtDb250b3VyIDxlbT5Xb3JrIENvbnRvdXI8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPldvcmsgQ29udG91cjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0V29ya0NvbnRvdXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFdvcmtDb250b3VyKEJpZ0ludGVnZXIgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QkNXUzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGJ1ZGdldGVkIGNvc3Qgb2Ygd29yayBvbiB0aGUgYXNzaWdubWVudC4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkJDV1M8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0QkNXUygpCi0JICogQHNlZSAjdW5zZXRCQ1dTKCkKLQkgKiBAc2VlICNzZXRCQ1dTKGZsb2F0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEFzc2lnbm1lbnRfQkNXUygpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRmxvYXQiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0JDV1MnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlmbG9hdCBnZXRCQ1dTKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0QkNXUyA8ZW0+QkNXUzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QkNXUzwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRCQ1dTKCkKLQkgKiBAc2VlICN1bnNldEJDV1MoKQotCSAqIEBzZWUgI2dldEJDV1MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEJDV1MoZmxvYXQgdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0QkNXUyA8ZW0+QkNXUzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRCQ1dTKCkKLQkgKiBAc2VlICNnZXRCQ1dTKCkKLQkgKiBAc2VlICNzZXRCQ1dTKGZsb2F0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0QkNXUygpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0QkNXUyA8ZW0+QkNXUzwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QkNXUzwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0QkNXUygpCi0JICogQHNlZSAjZ2V0QkNXUygpCi0JICogQHNlZSAjc2V0QkNXUyhmbG9hdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldEJDV1MoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkJDV1A8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBidWRnZXRlZCBjb3N0IG9mIHdvcmsgcGVyZm9ybWVkIG9uIHRoZSBhc3NpZ25tZW50IHRvLWRhdGUuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5CQ1dQPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldEJDV1AoKQotCSAqIEBzZWUgI3Vuc2V0QkNXUCgpCi0JICogQHNlZSAjc2V0QkNXUChmbG9hdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRBc3NpZ25tZW50X0JDV1AoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkZsb2F0IgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdCQ1dQJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JZmxvYXQgZ2V0QkNXUCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldEJDV1AgPGVtPkJDV1A8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkJDV1A8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0QkNXUCgpCi0JICogQHNlZSAjdW5zZXRCQ1dQKCkKLQkgKiBAc2VlICNnZXRCQ1dQKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRCQ1dQKGZsb2F0IHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldEJDV1AgPGVtPkJDV1A8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0QkNXUCgpCi0JICogQHNlZSAjZ2V0QkNXUCgpCi0JICogQHNlZSAjc2V0QkNXUChmbG9hdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldEJDV1AoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldEJDV1AgPGVtPkJDV1A8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkJDV1A8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldEJDV1AoKQotCSAqIEBzZWUgI2dldEJDV1AoKQotCSAqIEBzZWUgI3NldEJDV1AoZmxvYXQpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRCQ1dQKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Cb29raW5nIFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFNwZWNpZmllcyB0aGUgYm9va2luZyB0eXBlIG9mIHRoZSBhc3NpZ25tZW50LiAxPUNvbW1pdGVkLCAyPVByb3Bvc2VkCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Cb29raW5nIFR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEJvb2tpbmdUeXBlKEJpZ0ludGVnZXIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0QXNzaWdubWVudF9Cb29raW5nVHlwZSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJvb2tpbmdUeXBlVHlwZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQm9va2luZ1R5cGUnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdJbnRlZ2VyIGdldEJvb2tpbmdUeXBlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0Qm9va2luZ1R5cGUgPGVtPkJvb2tpbmcgVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Qm9va2luZyBUeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRCb29raW5nVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Qm9va2luZ1R5cGUoQmlnSW50ZWdlciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BY3R1YWwgV29yayBQcm90ZWN0ZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFNwZWNpZmllcyB0aGUgZHVyYXRpb24gdGhyb3VnaCB3aGljaCBhY3R1YWwgd29yayBpcyBwcm90ZWN0ZWQuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BY3R1YWwgV29yayBQcm90ZWN0ZWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEFjdHVhbFdvcmtQcm90ZWN0ZWQoT2JqZWN0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEFzc2lnbm1lbnRfQWN0dWFsV29ya1Byb3RlY3RlZCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRHVyYXRpb24iCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0FjdHVhbFdvcmtQcm90ZWN0ZWQnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlPYmplY3QgZ2V0QWN0dWFsV29ya1Byb3RlY3RlZCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldEFjdHVhbFdvcmtQcm90ZWN0ZWQgPGVtPkFjdHVhbCBXb3JrIFByb3RlY3RlZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QWN0dWFsIFdvcmsgUHJvdGVjdGVkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRBY3R1YWxXb3JrUHJvdGVjdGVkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRBY3R1YWxXb3JrUHJvdGVjdGVkKE9iamVjdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BY3R1YWwgT3ZlcnRpbWUgV29yayBQcm90ZWN0ZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFNwZWNpZmllcyB0aGUgZHVyYXRpb24gdGhyb3VnaCB3aGljaCBhY3R1YWwgb3ZlcnRpbWUgd29yayBpcyBwcm90ZWN0ZWQuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BY3R1YWwgT3ZlcnRpbWUgV29yayBQcm90ZWN0ZWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEFjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZChPYmplY3QpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0QXNzaWdubWVudF9BY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkR1cmF0aW9uIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdBY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlPYmplY3QgZ2V0QWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0QWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkIDxlbT5BY3R1YWwgT3ZlcnRpbWUgV29yayBQcm90ZWN0ZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkFjdHVhbCBPdmVydGltZSBXb3JrIFByb3RlY3RlZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0QWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRBY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQoT2JqZWN0IHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNyZWF0aW9uIERhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBkYXRlIHRoYXQgdGhlIGFzc2lnbm1lbnQgd2FzIGNyZWF0ZWQuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNyZWF0aW9uIERhdGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldENyZWF0aW9uRGF0ZShPYmplY3QpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0QXNzaWdubWVudF9DcmVhdGlvbkRhdGUoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkRhdGVUaW1lIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdDcmVhdGlvbkRhdGUnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlPYmplY3QgZ2V0Q3JlYXRpb25EYXRlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0Q3JlYXRpb25EYXRlIDxlbT5DcmVhdGlvbiBEYXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5DcmVhdGlvbiBEYXRlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRDcmVhdGlvbkRhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldENyZWF0aW9uRGF0ZShPYmplY3QgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RXh0ZW5kZWQgQXR0cmlidXRlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZTR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHZhbHVlIG9mIGFuIGV4dGVuZGVkIGF0dHJpYnV0ZS4gIFR3byBwaWVjZXMgb2YgZGF0YSBhcmUgbmVjZXNzYXJ5IC0gCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEgcG9pbnRlciBiYWNrIHRvIHRoZSBleHRlbmRlZCBhdHRyaWJ1dGUgdGFibGUgd2hpY2ggaXMgc3BlY2lmaWVkIGVpdGhlciBieSB0aGUgdW5pcXVlIElEIG9yIHRoZSAKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmllbGQgSUQsIGFuZCB0aGUgdmFsdWUgd2hpY2ggaXMgc3BlY2lmaWVkIGVpdGhlciB3aXRoIHRoZSB2YWx1ZSwgb3IgYSBwb2ludGVyIGJhY2sgdG8gdGhlIHZhbHVlIGxpc3QuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FeHRlbmRlZCBBdHRyaWJ1dGU8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0QXNzaWdubWVudF9FeHRlbmRlZEF0dHJpYnV0ZSgpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGU0IiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdFeHRlbmRlZEF0dHJpYnV0ZScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldEV4dGVuZGVkQXR0cmlidXRlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5CYXNlbGluZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUzfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBjb2xsZWN0aW9uIG9mIGJhc2VsaW5lIHZhbHVlcyBhc3NvY2lhdGVkIHdpdGggdGhlIGFzc2lnbm1lbnQuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5CYXNlbGluZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRBc3NpZ25tZW50X0Jhc2VsaW5lKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZTMiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0Jhc2VsaW5lJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0QmFzZWxpbmUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlRpbWVwaGFzZWQgRGF0YTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGltZXBoYXNlZERhdGFUeXBlfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSB0aW1lIHBoYXNlZCBkYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGUgYXNzaWdubWVudC4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlRpbWVwaGFzZWQgRGF0YTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRBc3NpZ25tZW50X1RpbWVwaGFzZWREYXRhKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UaW1lcGhhc2VkRGF0YVR5cGUiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1RpbWVwaGFzZWREYXRhJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0VGltZXBoYXNlZERhdGEoKTsKLQotfSAvLyBBc3NpZ25tZW50CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L0Fzc2lnbm1lbnRzLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L0Fzc2lnbm1lbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhODBjZWMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9Bc3NpZ25tZW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBBc3NpZ25tZW50cy5qYXZhLHYgMS4xIDIwMDgvMDEvMTUgMDg6NTI6NDUganRoYW0gRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Bc3NpZ25tZW50czwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnRzI2dldEFzc2lnbm1lbnQgPGVtPkFzc2lnbm1lbnQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRBc3NpZ25tZW50cygpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nQXNzaWdubWVudHNfLl90eXBlJyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQXNzaWdubWVudHMgZXh0ZW5kcyBFT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Bc3NpZ25tZW50PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZXJlIG11c3QgYmUgYXQgbGVhc3Qgb25lIGFzc2lnbm1lbnQgaW4gZWFjaCBBc3NpZ25tZW50cyBjb2xsZWN0aW9uLgotCSAqICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QXNzaWdubWVudDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRBc3NpZ25tZW50c19Bc3NpZ25tZW50KCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50IiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdBc3NpZ25tZW50JyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0QXNzaWdubWVudCgpOwotCi19IC8vIEFzc2lnbm1lbnRzCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L0F2YWlsYWJpbGl0eVBlcmlvZC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9BdmFpbGFiaWxpdHlQZXJpb2QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWE3ZDgwNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L0F2YWlsYWJpbGl0eVBlcmlvZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM4ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogQXZhaWxhYmlsaXR5UGVyaW9kLmphdmEsdiAxLjEgMjAwOC8wMS8xNSAwODo1Mjo0NiBqdGhhbSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+QXZhaWxhYmlsaXR5IFBlcmlvZDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkF2YWlsYWJpbGl0eVBlcmlvZCNnZXRBdmFpbGFibGVGcm9tIDxlbT5BdmFpbGFibGUgRnJvbTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5BdmFpbGFiaWxpdHlQZXJpb2QjZ2V0QXZhaWxhYmxlVG8gPGVtPkF2YWlsYWJsZSBUbzwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5BdmFpbGFiaWxpdHlQZXJpb2QjZ2V0QXZhaWxhYmxlVW5pdHMgPGVtPkF2YWlsYWJsZSBVbml0czwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEF2YWlsYWJpbGl0eVBlcmlvZCgpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nQXZhaWxhYmlsaXR5UGVyaW9kXy5fdHlwZScga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEF2YWlsYWJpbGl0eVBlcmlvZCBleHRlbmRzIEVPYmplY3QgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkF2YWlsYWJsZSBGcm9tPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgZGF0ZSB0aGF0IHRoZSByZXNvdXJjZSBiZWNvbWVzIGF2YWlsYWJsZSBmb3IgdGhlIHNwZWNpZmllZCBwZXJpb2QuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QXZhaWxhYmxlIEZyb208L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEF2YWlsYWJsZUZyb20oT2JqZWN0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEF2YWlsYWJpbGl0eVBlcmlvZF9BdmFpbGFibGVGcm9tKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EYXRlVGltZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQXZhaWxhYmxlRnJvbScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU9iamVjdCBnZXRBdmFpbGFibGVGcm9tKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkF2YWlsYWJpbGl0eVBlcmlvZCNnZXRBdmFpbGFibGVGcm9tIDxlbT5BdmFpbGFibGUgRnJvbTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QXZhaWxhYmxlIEZyb208L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEF2YWlsYWJsZUZyb20oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEF2YWlsYWJsZUZyb20oT2JqZWN0IHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkF2YWlsYWJsZSBUbzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGxhc3QgZGF0ZSB0aGF0IHRoZSByZXNvdXJjZSBpcyBhdmFpbGFibGUgZm9yIHRoZSBzcGVjaWZpZWQgcGVyaW9kLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkF2YWlsYWJsZSBUbzwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0QXZhaWxhYmxlVG8oT2JqZWN0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEF2YWlsYWJpbGl0eVBlcmlvZF9BdmFpbGFibGVUbygpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRGF0ZVRpbWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0F2YWlsYWJsZVRvJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JT2JqZWN0IGdldEF2YWlsYWJsZVRvKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkF2YWlsYWJpbGl0eVBlcmlvZCNnZXRBdmFpbGFibGVUbyA8ZW0+QXZhaWxhYmxlIFRvPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BdmFpbGFibGUgVG88L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEF2YWlsYWJsZVRvKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRBdmFpbGFibGVUbyhPYmplY3QgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QXZhaWxhYmxlIFVuaXRzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgcGVyY2VudGFnZSB0aGF0IHRoZSByZXNvdXJjZSBpcyBhdmFpbGFibGUgZHVyaW5nIHRoZSBzcGVjaWZpZWQgcGVyaW9kLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkF2YWlsYWJsZSBVbml0czwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRBdmFpbGFibGVVbml0cygpCi0JICogQHNlZSAjdW5zZXRBdmFpbGFibGVVbml0cygpCi0JICogQHNlZSAjc2V0QXZhaWxhYmxlVW5pdHMoZmxvYXQpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0QXZhaWxhYmlsaXR5UGVyaW9kX0F2YWlsYWJsZVVuaXRzKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5GbG9hdCIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQXZhaWxhYmxlVW5pdHMnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlmbG9hdCBnZXRBdmFpbGFibGVVbml0cygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5BdmFpbGFiaWxpdHlQZXJpb2QjZ2V0QXZhaWxhYmxlVW5pdHMgPGVtPkF2YWlsYWJsZSBVbml0czwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QXZhaWxhYmxlIFVuaXRzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldEF2YWlsYWJsZVVuaXRzKCkKLQkgKiBAc2VlICN1bnNldEF2YWlsYWJsZVVuaXRzKCkKLQkgKiBAc2VlICNnZXRBdmFpbGFibGVVbml0cygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0QXZhaWxhYmxlVW5pdHMoZmxvYXQgdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkF2YWlsYWJpbGl0eVBlcmlvZCNnZXRBdmFpbGFibGVVbml0cyA8ZW0+QXZhaWxhYmxlIFVuaXRzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldEF2YWlsYWJsZVVuaXRzKCkKLQkgKiBAc2VlICNnZXRBdmFpbGFibGVVbml0cygpCi0JICogQHNlZSAjc2V0QXZhaWxhYmxlVW5pdHMoZmxvYXQpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRBdmFpbGFibGVVbml0cygpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkF2YWlsYWJpbGl0eVBlcmlvZCNnZXRBdmFpbGFibGVVbml0cyA8ZW0+QXZhaWxhYmxlIFVuaXRzPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BdmFpbGFibGUgVW5pdHM8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldEF2YWlsYWJsZVVuaXRzKCkKLQkgKiBAc2VlICNnZXRBdmFpbGFibGVVbml0cygpCi0JICogQHNlZSAjc2V0QXZhaWxhYmxlVW5pdHMoZmxvYXQpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRBdmFpbGFibGVVbml0cygpOwotCi19IC8vIEF2YWlsYWJpbGl0eVBlcmlvZApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9BdmFpbGFiaWxpdHlQZXJpb2RzLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L0F2YWlsYWJpbGl0eVBlcmlvZHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODBkZTk2ZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L0F2YWlsYWJpbGl0eVBlcmlvZHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogQXZhaWxhYmlsaXR5UGVyaW9kcy5qYXZhLHYgMS4xIDIwMDgvMDEvMTUgMDg6NTI6NDUganRoYW0gRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5BdmFpbGFiaWxpdHkgUGVyaW9kczwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkF2YWlsYWJpbGl0eVBlcmlvZHMjZ2V0QXZhaWxhYmlsaXR5UGVyaW9kIDxlbT5BdmFpbGFiaWxpdHkgUGVyaW9kPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0QXZhaWxhYmlsaXR5UGVyaW9kcygpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nQXZhaWxhYmlsaXR5UGVyaW9kc18uX3R5cGUnIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBBdmFpbGFiaWxpdHlQZXJpb2RzIGV4dGVuZHMgRU9iamVjdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QXZhaWxhYmlsaXR5IFBlcmlvZDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXZhaWxhYmlsaXR5UGVyaW9kfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBwZXJpb2QgdGhlIHJlc291cmNlIGlzIGF2YWlsYWJsZS4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BdmFpbGFiaWxpdHkgUGVyaW9kPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEF2YWlsYWJpbGl0eVBlcmlvZHNfQXZhaWxhYmlsaXR5UGVyaW9kKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5BdmFpbGFiaWxpdHlQZXJpb2QiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0F2YWlsYWJpbGl0eVBlcmlvZCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldEF2YWlsYWJpbGl0eVBlcmlvZCgpOwotCi19IC8vIEF2YWlsYWJpbGl0eVBlcmlvZHMKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvQmFzZWxpbmUuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvQmFzZWxpbmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTM1YWRkMy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L0Jhc2VsaW5lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NjkgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBCYXNlbGluZS5qYXZhLHYgMS4xIDIwMDgvMDEvMTUgMDg6NTI6NDUganRoYW0gRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0OwotCi1pbXBvcnQgamF2YS5tYXRoLkJpZ0RlY2ltYWw7Ci1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkJhc2VsaW5lPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUjZ2V0VGltZXBoYXNlZERhdGEgPGVtPlRpbWVwaGFzZWQgRGF0YTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZSNnZXROdW1iZXIgPGVtPk51bWJlcjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZSNpc0ludGVyaW0gPGVtPkludGVyaW08L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUjZ2V0U3RhcnQgPGVtPlN0YXJ0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lI2dldEZpbmlzaCA8ZW0+RmluaXNoPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lI2dldER1cmF0aW9uIDxlbT5EdXJhdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZSNnZXREdXJhdGlvbkZvcm1hdCA8ZW0+RHVyYXRpb24gRm9ybWF0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lI2lzRXN0aW1hdGVkRHVyYXRpb24gPGVtPkVzdGltYXRlZCBEdXJhdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZSNnZXRXb3JrIDxlbT5Xb3JrPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lI2dldENvc3QgPGVtPkNvc3Q8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUjZ2V0QkNXUyA8ZW0+QkNXUzwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZSNnZXRCQ1dQIDxlbT5CQ1dQPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0QmFzZWxpbmUoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J0Jhc2VsaW5lXy5fdHlwZScga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEJhc2VsaW5lIGV4dGVuZHMgRU9iamVjdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VGltZXBoYXNlZCBEYXRhPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UaW1lcGhhc2VkRGF0YVR5cGV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHRpbWUgcGhhc2VkIGRhdGEgYmxvY2sgYXNzb2NpYXRlZCB3aXRoIHRoZSB0YXNrIGJhc2VsaW5lLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlRpbWVwaGFzZWQgRGF0YTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRCYXNlbGluZV9UaW1lcGhhc2VkRGF0YSgpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGltZXBoYXNlZERhdGFUeXBlIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdUaW1lcGhhc2VkRGF0YScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldFRpbWVwaGFzZWREYXRhKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5OdW1iZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSB1bmlxdWUgbnVtYmVyIG9mIHRoZSBiYXNlbGluZSBkYXRhIHJlY29yZC4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5OdW1iZXI8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldE51bWJlcihCaWdJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEJhc2VsaW5lX051bWJlcigpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuSW50ZWdlciIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nTnVtYmVyJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnSW50ZWdlciBnZXROdW1iZXIoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUjZ2V0TnVtYmVyIDxlbT5OdW1iZXI8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk51bWJlcjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0TnVtYmVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXROdW1iZXIoQmlnSW50ZWdlciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JbnRlcmltPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+ImZhbHNlIjwvY29kZT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBXaGV0aGVyIHRoaXMgaXMgYW4gSW50ZXJpbSBCYXNlbGluZS4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JbnRlcmltPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldEludGVyaW0oKQotCSAqIEBzZWUgI3Vuc2V0SW50ZXJpbSgpCi0JICogQHNlZSAjc2V0SW50ZXJpbShib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEJhc2VsaW5lX0ludGVyaW0oKQotCSAqIEBtb2RlbCBkZWZhdWx0PSJmYWxzZSIgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdJbnRlcmltJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc0ludGVyaW0oKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUjaXNJbnRlcmltIDxlbT5JbnRlcmltPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5JbnRlcmltPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldEludGVyaW0oKQotCSAqIEBzZWUgI3Vuc2V0SW50ZXJpbSgpCi0JICogQHNlZSAjaXNJbnRlcmltKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRJbnRlcmltKGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lI2lzSW50ZXJpbSA8ZW0+SW50ZXJpbTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRJbnRlcmltKCkKLQkgKiBAc2VlICNpc0ludGVyaW0oKQotCSAqIEBzZWUgI3NldEludGVyaW0oYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldEludGVyaW0oKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZSNpc0ludGVyaW0gPGVtPkludGVyaW08L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkludGVyaW08L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldEludGVyaW0oKQotCSAqIEBzZWUgI2lzSW50ZXJpbSgpCi0JICogQHNlZSAjc2V0SW50ZXJpbShib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0SW50ZXJpbSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U3RhcnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBzY2hlZHVsZWQgc3RhcnQgZGF0ZSBvZiB0aGUgdGFzayB3aGVuIHRoZSBiYXNlbGluZSB3YXMgc2F2ZWQuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U3RhcnQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFN0YXJ0KE9iamVjdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRCYXNlbGluZV9TdGFydCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRGF0ZVRpbWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1N0YXJ0JyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JT2JqZWN0IGdldFN0YXJ0KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lI2dldFN0YXJ0IDxlbT5TdGFydDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U3RhcnQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFN0YXJ0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRTdGFydChPYmplY3QgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RmluaXNoPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgc2NoZWR1bGVkIGZpbmlzaCBkYXRlIG9mIHRoZSB0YXNrIHdoZW4gdGhlIGJhc2VsaW5lIHdhcyBzYXZlZC4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5GaW5pc2g8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEZpbmlzaChPYmplY3QpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0QmFzZWxpbmVfRmluaXNoKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EYXRlVGltZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nRmluaXNoJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JT2JqZWN0IGdldEZpbmlzaCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZSNnZXRGaW5pc2ggPGVtPkZpbmlzaDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RmluaXNoPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRGaW5pc2goKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEZpbmlzaChPYmplY3QgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RHVyYXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBzY2hlZHVsZWQgZHVyYXRpb24gb2YgdGhlIHRhc2sgd2hlbiB0aGUgYmFzZWxpbmUgd2FzIHNhdmVkLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkR1cmF0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXREdXJhdGlvbihPYmplY3QpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0QmFzZWxpbmVfRHVyYXRpb24oKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkR1cmF0aW9uIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdEdXJhdGlvbicgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU9iamVjdCBnZXREdXJhdGlvbigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZSNnZXREdXJhdGlvbiA8ZW0+RHVyYXRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkR1cmF0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXREdXJhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RHVyYXRpb24oT2JqZWN0IHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkR1cmF0aW9uIEZvcm1hdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGZvcm1hdCBmb3IgZXhwcmVzc2luZyB0aGUgRHVyYXRpb24gb2YgdGhlIFRhc2sgYmFzZWxpbmUuICAKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlcyBhcmU6IDM9bSwgND1lbSwgNT1oLCA2PWVoLCA3PWQsIDg9ZWQsIDk9dywgMTA9ZXcsIDExPW1vLCAxMj1lbW8sIDE5PSUsIDIwPWUlLCAKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIxPW51bGwsIDM1PW0/LCAzNj1lbT8sIDM3PWg/LCAzOD1laD8sIDM5PWQ/LCA0MD1lZD8sIDQxPXc/LCA0Mj1ldz8sIDQzPW1vPywgNDQ9ZW1vPywgCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1MT0lPywgNTI9ZSU/IGFuZCA1Mz1udWxsLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkR1cmF0aW9uIEZvcm1hdDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0RHVyYXRpb25Gb3JtYXQoQmlnSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRCYXNlbGluZV9EdXJhdGlvbkZvcm1hdCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkR1cmF0aW9uRm9ybWF0VHlwZTEiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0R1cmF0aW9uRm9ybWF0JyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnSW50ZWdlciBnZXREdXJhdGlvbkZvcm1hdCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZSNnZXREdXJhdGlvbkZvcm1hdCA8ZW0+RHVyYXRpb24gRm9ybWF0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5EdXJhdGlvbiBGb3JtYXQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldER1cmF0aW9uRm9ybWF0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXREdXJhdGlvbkZvcm1hdChCaWdJbnRlZ2VyIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkVzdGltYXRlZCBEdXJhdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogV2hldGhlciB0aGUgYmFzZWxpbmUgZHVyYXRpb24gb2YgdGhlIHRhc2sgd2FzIGVzdGltYXRlZC4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Fc3RpbWF0ZWQgRHVyYXRpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0RXN0aW1hdGVkRHVyYXRpb24oKQotCSAqIEBzZWUgI3Vuc2V0RXN0aW1hdGVkRHVyYXRpb24oKQotCSAqIEBzZWUgI3NldEVzdGltYXRlZER1cmF0aW9uKGJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0QmFzZWxpbmVfRXN0aW1hdGVkRHVyYXRpb24oKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW4iCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0VzdGltYXRlZER1cmF0aW9uJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc0VzdGltYXRlZER1cmF0aW9uKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lI2lzRXN0aW1hdGVkRHVyYXRpb24gPGVtPkVzdGltYXRlZCBEdXJhdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RXN0aW1hdGVkIER1cmF0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldEVzdGltYXRlZER1cmF0aW9uKCkKLQkgKiBAc2VlICN1bnNldEVzdGltYXRlZER1cmF0aW9uKCkKLQkgKiBAc2VlICNpc0VzdGltYXRlZER1cmF0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRFc3RpbWF0ZWREdXJhdGlvbihib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZSNpc0VzdGltYXRlZER1cmF0aW9uIDxlbT5Fc3RpbWF0ZWQgRHVyYXRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0RXN0aW1hdGVkRHVyYXRpb24oKQotCSAqIEBzZWUgI2lzRXN0aW1hdGVkRHVyYXRpb24oKQotCSAqIEBzZWUgI3NldEVzdGltYXRlZER1cmF0aW9uKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRFc3RpbWF0ZWREdXJhdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lI2lzRXN0aW1hdGVkRHVyYXRpb24gPGVtPkVzdGltYXRlZCBEdXJhdGlvbjwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RXN0aW1hdGVkIER1cmF0aW9uPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRFc3RpbWF0ZWREdXJhdGlvbigpCi0JICogQHNlZSAjaXNFc3RpbWF0ZWREdXJhdGlvbigpCi0JICogQHNlZSAjc2V0RXN0aW1hdGVkRHVyYXRpb24oYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldEVzdGltYXRlZER1cmF0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Xb3JrPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgc2NoZWR1bGVkIHdvcmsgb2YgdGhlIHRhc2sgd2hlbiB0aGUgYmFzZWxpbmUgd2FzIHNhdmVkLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPldvcms8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFdvcmsoT2JqZWN0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEJhc2VsaW5lX1dvcmsoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkR1cmF0aW9uIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdXb3JrJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JT2JqZWN0IGdldFdvcmsoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUjZ2V0V29yayA8ZW0+V29yazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+V29yazwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0V29yaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0V29yayhPYmplY3QgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q29zdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHByb2plY3RlZCBjb3N0IG9mIHRoZSB0YXNrIHdoZW4gdGhlIGJhc2VsaW5lIHdhcyBzYXZlZC4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Db3N0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRDb3N0KEJpZ0RlY2ltYWwpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0QmFzZWxpbmVfQ29zdCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRGVjaW1hbCIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQ29zdCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0RlY2ltYWwgZ2V0Q29zdCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZSNnZXRDb3N0IDxlbT5Db3N0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Db3N0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRDb3N0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRDb3N0KEJpZ0RlY2ltYWwgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QkNXUzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGJ1ZGdldGVkIGNvc3Qgb2Ygd29yayBzY2hlZHVsZWQgZm9yIHRoZSB0YXNrLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkJDV1M8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0QkNXUygpCi0JICogQHNlZSAjdW5zZXRCQ1dTKCkKLQkgKiBAc2VlICNzZXRCQ1dTKGZsb2F0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEJhc2VsaW5lX0JDV1MoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkZsb2F0IgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdCQ1dTJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JZmxvYXQgZ2V0QkNXUygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZSNnZXRCQ1dTIDxlbT5CQ1dTPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5CQ1dTPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldEJDV1MoKQotCSAqIEBzZWUgI3Vuc2V0QkNXUygpCi0JICogQHNlZSAjZ2V0QkNXUygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0QkNXUyhmbG9hdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUjZ2V0QkNXUyA8ZW0+QkNXUzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRCQ1dTKCkKLQkgKiBAc2VlICNnZXRCQ1dTKCkKLQkgKiBAc2VlICNzZXRCQ1dTKGZsb2F0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0QkNXUygpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lI2dldEJDV1MgPGVtPkJDV1M8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkJDV1M8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldEJDV1MoKQotCSAqIEBzZWUgI2dldEJDV1MoKQotCSAqIEBzZWUgI3NldEJDV1MoZmxvYXQpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRCQ1dTKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5CQ1dQPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgYnVkZ2V0ZWQgY29zdCBvZiB3b3JrIHBlcmZvcm1lZCBvbiB0aGUgdGFzayB0by1kYXRlLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkJDV1A8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0QkNXUCgpCi0JICogQHNlZSAjdW5zZXRCQ1dQKCkKLQkgKiBAc2VlICNzZXRCQ1dQKGZsb2F0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEJhc2VsaW5lX0JDV1AoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkZsb2F0IgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdCQ1dQJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JZmxvYXQgZ2V0QkNXUCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZSNnZXRCQ1dQIDxlbT5CQ1dQPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5CQ1dQPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldEJDV1AoKQotCSAqIEBzZWUgI3Vuc2V0QkNXUCgpCi0JICogQHNlZSAjZ2V0QkNXUCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0QkNXUChmbG9hdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUjZ2V0QkNXUCA8ZW0+QkNXUDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRCQ1dQKCkKLQkgKiBAc2VlICNnZXRCQ1dQKCkKLQkgKiBAc2VlICNzZXRCQ1dQKGZsb2F0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0QkNXUCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lI2dldEJDV1AgPGVtPkJDV1A8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkJDV1A8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldEJDV1AoKQotCSAqIEBzZWUgI2dldEJDV1AoKQotCSAqIEBzZWUgI3NldEJDV1AoZmxvYXQpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRCQ1dQKCk7Ci0KLX0gLy8gQmFzZWxpbmUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvQmFzZWxpbmUyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L0Jhc2VsaW5lMi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYWE3NzFkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvQmFzZWxpbmUyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTAgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBCYXNlbGluZTIuamF2YSx2IDEuMSAyMDA4LzAxLzE1IDA4OjUyOjQ2IGp0aGFtIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdDsKLQotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkJhc2VsaW5lMjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lMiNnZXROdW1iZXIgPGVtPk51bWJlcjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZTIjZ2V0V29yayA8ZW0+V29yazwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZTIjZ2V0Q29zdCA8ZW0+Q29zdDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZTIjZ2V0QkNXUyA8ZW0+QkNXUzwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZTIjZ2V0QkNXUCA8ZW0+QkNXUDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEJhc2VsaW5lMigpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nQmFzZWxpbmVfLl8xXy5fdHlwZScga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEJhc2VsaW5lMiBleHRlbmRzIEVPYmplY3QgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk51bWJlcjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHVuaXF1ZSBudW1iZXIgb2YgdGhlIGJhc2VsaW5lIGRhdGEgcmVjb3JkLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk51bWJlcjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0TnVtYmVyKEJpZ0ludGVnZXIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0QmFzZWxpbmUyX051bWJlcigpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuSW50ZWdlciIgcmVxdWlyZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J051bWJlcicgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0ludGVnZXIgZ2V0TnVtYmVyKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lMiNnZXROdW1iZXIgPGVtPk51bWJlcjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TnVtYmVyPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXROdW1iZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldE51bWJlcihCaWdJbnRlZ2VyIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPldvcms8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSB3b3JrIGFzc2lnbmVkIHRoZSByZXNvdXJjZSB3aGVuIHRoZSBiYXNlbGluZSBpcyBzYXZlZC4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Xb3JrPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRXb3JrKE9iamVjdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRCYXNlbGluZTJfV29yaygpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRHVyYXRpb24iCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1dvcmsnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlPYmplY3QgZ2V0V29yaygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZTIjZ2V0V29yayA8ZW0+V29yazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+V29yazwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0V29yaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0V29yayhPYmplY3QgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q29zdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHByb2plY3RlZCBjb3N0IGZvciB0aGUgcmVzb3VyY2Ugd2hlbiB0aGUgYmFzZWxpbmUgd2FzIHNhdmVkLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNvc3Q8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0Q29zdCgpCi0JICogQHNlZSAjdW5zZXRDb3N0KCkKLQkgKiBAc2VlICNzZXRDb3N0KGZsb2F0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEJhc2VsaW5lMl9Db3N0KCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5GbG9hdCIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQ29zdCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWZsb2F0IGdldENvc3QoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUyI2dldENvc3QgPGVtPkNvc3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNvc3Q8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0Q29zdCgpCi0JICogQHNlZSAjdW5zZXRDb3N0KCkKLQkgKiBAc2VlICNnZXRDb3N0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRDb3N0KGZsb2F0IHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZTIjZ2V0Q29zdCA8ZW0+Q29zdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRDb3N0KCkKLQkgKiBAc2VlICNnZXRDb3N0KCkKLQkgKiBAc2VlICNzZXRDb3N0KGZsb2F0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0Q29zdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lMiNnZXRDb3N0IDxlbT5Db3N0PC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Db3N0PC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRDb3N0KCkKLQkgKiBAc2VlICNnZXRDb3N0KCkKLQkgKiBAc2VlICNzZXRDb3N0KGZsb2F0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0Q29zdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QkNXUzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGJ1ZGdldCBjb3N0IG9mIHdvcmsgc2NoZWR1bGVkIGZvciB0aGUgcmVzb3VyY2UuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QkNXUzwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRCQ1dTKCkKLQkgKiBAc2VlICN1bnNldEJDV1MoKQotCSAqIEBzZWUgI3NldEJDV1MoZmxvYXQpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0QmFzZWxpbmUyX0JDV1MoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkZsb2F0IgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdCQ1dTJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JZmxvYXQgZ2V0QkNXUygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZTIjZ2V0QkNXUyA8ZW0+QkNXUzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QkNXUzwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRCQ1dTKCkKLQkgKiBAc2VlICN1bnNldEJDV1MoKQotCSAqIEBzZWUgI2dldEJDV1MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEJDV1MoZmxvYXQgdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lMiNnZXRCQ1dTIDxlbT5CQ1dTPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldEJDV1MoKQotCSAqIEBzZWUgI2dldEJDV1MoKQotCSAqIEBzZWUgI3NldEJDV1MoZmxvYXQpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRCQ1dTKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUyI2dldEJDV1MgPGVtPkJDV1M8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkJDV1M8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldEJDV1MoKQotCSAqIEBzZWUgI2dldEJDV1MoKQotCSAqIEBzZWUgI3NldEJDV1MoZmxvYXQpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRCQ1dTKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5CQ1dQPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgYnVkZ2V0ZWQgY29zdCBvZiBvZiB0aGUgd29yayBwZXJmb3JtZWQgYnkgdGhlIHJlc291cmNlIGZvciB0aGUgcHJvamVjdCB0by1kYXRlLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkJDV1A8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0QkNXUCgpCi0JICogQHNlZSAjdW5zZXRCQ1dQKCkKLQkgKiBAc2VlICNzZXRCQ1dQKGZsb2F0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEJhc2VsaW5lMl9CQ1dQKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5GbG9hdCIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQkNXUCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWZsb2F0IGdldEJDV1AoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUyI2dldEJDV1AgPGVtPkJDV1A8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkJDV1A8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0QkNXUCgpCi0JICogQHNlZSAjdW5zZXRCQ1dQKCkKLQkgKiBAc2VlICNnZXRCQ1dQKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRCQ1dQKGZsb2F0IHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZTIjZ2V0QkNXUCA8ZW0+QkNXUDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRCQ1dQKCkKLQkgKiBAc2VlICNnZXRCQ1dQKCkKLQkgKiBAc2VlICNzZXRCQ1dQKGZsb2F0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0QkNXUCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lMiNnZXRCQ1dQIDxlbT5CQ1dQPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5CQ1dQPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRCQ1dQKCkKLQkgKiBAc2VlICNnZXRCQ1dQKCkKLQkgKiBAc2VlICNzZXRCQ1dQKGZsb2F0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0QkNXUCgpOwotCi19IC8vIEJhc2VsaW5lMgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9CYXNlbGluZTMuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvQmFzZWxpbmUzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlOWE2YzguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9CYXNlbGluZTMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5NiArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IEJhc2VsaW5lMy5qYXZhLHYgMS4xIDIwMDgvMDEvMTUgMDg6NTI6NDUganRoYW0gRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5CYXNlbGluZTM8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZTMjZ2V0VGltZXBoYXNlZERhdGEgPGVtPlRpbWVwaGFzZWQgRGF0YTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZTMjZ2V0TnVtYmVyIDxlbT5OdW1iZXI8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUzI2dldFN0YXJ0IDxlbT5TdGFydDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZTMjZ2V0RmluaXNoIDxlbT5GaW5pc2g8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUzI2dldFdvcmsgPGVtPldvcms8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUzI2dldENvc3QgPGVtPkNvc3Q8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUzI2dldEJDV1MgPGVtPkJDV1M8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUzI2dldEJDV1AgPGVtPkJDV1A8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRCYXNlbGluZTMoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J0Jhc2VsaW5lXy5fMl8uX3R5cGUnIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBCYXNlbGluZTMgZXh0ZW5kcyBFT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5UaW1lcGhhc2VkIERhdGE8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRpbWVwaGFzZWREYXRhVHlwZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgdGltZSBwaGFzZWQgZGF0YSBhc3NvY2lhdGVkIHdpdGggdGhlIEJhc2VsaW5lLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VGltZXBoYXNlZCBEYXRhPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEJhc2VsaW5lM19UaW1lcGhhc2VkRGF0YSgpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGltZXBoYXNlZERhdGFUeXBlIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdUaW1lcGhhc2VkRGF0YScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldFRpbWVwaGFzZWREYXRhKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5OdW1iZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSB1bmlxdWUgbnVtYmVyIG9mIHRoZSBiYXNlbGluZSBkYXRhIHJlY29yZC4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk51bWJlcjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0TnVtYmVyKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRCYXNlbGluZTNfTnVtYmVyKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciIHJlcXVpcmVkPSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdOdW1iZXInIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0TnVtYmVyKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lMyNnZXROdW1iZXIgPGVtPk51bWJlcjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TnVtYmVyPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXROdW1iZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldE51bWJlcihTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U3RhcnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBzY2hlZHVsZWQgc3RhcnQgZGF0ZSBvZiB0aGUgYXNzaWdubWVudCB3aGVuIHRoZSBiYXNlbGluZSB3YXMgc2F2ZWQuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TdGFydDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0U3RhcnQoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEJhc2VsaW5lM19TdGFydCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdTdGFydCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRTdGFydCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZTMjZ2V0U3RhcnQgPGVtPlN0YXJ0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TdGFydDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0U3RhcnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFN0YXJ0KFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5GaW5pc2g8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBzY2hlZHVsZWQgZmluaXNoIGRhdGUgb2YgdGhlIGFzc2lnbm1lbnQgd2hlbiB0aGUgYmFzZWxpbmUgd2FzIHNhdmVkLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RmluaXNoPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRGaW5pc2goU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEJhc2VsaW5lM19GaW5pc2goKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nRmluaXNoJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldEZpbmlzaCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZTMjZ2V0RmluaXNoIDxlbT5GaW5pc2g8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkZpbmlzaDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0RmluaXNoKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRGaW5pc2goU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPldvcms8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSB0b3RhbCBhbW91bnQgb2Ygd29yayBzY2hlZHVsZWQgb24gdGhlIGFzc2lnbm1lbnQgd2hlbiB0aGUgYmFzZWxpbmUgd2FzIHNhdmVkLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+V29yazwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0V29yayhPYmplY3QpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0QmFzZWxpbmUzX1dvcmsoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkR1cmF0aW9uIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdXb3JrJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JT2JqZWN0IGdldFdvcmsoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUzI2dldFdvcmsgPGVtPldvcms8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPldvcms8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFdvcmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFdvcmsoT2JqZWN0IHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNvc3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSB0b3RhbCBwcm9qZWN0ZWQgY29zdCBvZiB0aGUgYXNzaWdubWVudCB3aGVuIHRoZSBiYXNlbGluZSB3YXMgc2F2ZWQuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Db3N0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRDb3N0KFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRCYXNlbGluZTNfQ29zdCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdDb3N0JyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldENvc3QoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUzI2dldENvc3QgPGVtPkNvc3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNvc3Q8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldENvc3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldENvc3QoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkJDV1M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBidWRnZXRlZCBjb3N0IG9mIHdvcmsgb24gdGhlIGFzc2lnbm1lbnQuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5CQ1dTPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldEJDV1MoKQotCSAqIEBzZWUgI3Vuc2V0QkNXUygpCi0JICogQHNlZSAjc2V0QkNXUyhmbG9hdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRCYXNlbGluZTNfQkNXUygpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRmxvYXQiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0JDV1MnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlmbG9hdCBnZXRCQ1dTKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lMyNnZXRCQ1dTIDxlbT5CQ1dTPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5CQ1dTPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldEJDV1MoKQotCSAqIEBzZWUgI3Vuc2V0QkNXUygpCi0JICogQHNlZSAjZ2V0QkNXUygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0QkNXUyhmbG9hdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUzI2dldEJDV1MgPGVtPkJDV1M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0QkNXUygpCi0JICogQHNlZSAjZ2V0QkNXUygpCi0JICogQHNlZSAjc2V0QkNXUyhmbG9hdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldEJDV1MoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZTMjZ2V0QkNXUyA8ZW0+QkNXUzwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QkNXUzwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0QkNXUygpCi0JICogQHNlZSAjZ2V0QkNXUygpCi0JICogQHNlZSAjc2V0QkNXUyhmbG9hdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldEJDV1MoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkJDV1A8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBidWRnZXRlZCBjb3N0IG9mIHdvcmsgcGVyZm9ybWVkIG9uIHRoZSBhc3NpZ25tZW50IHRvLWRhdGUuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5CQ1dQPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldEJDV1AoKQotCSAqIEBzZWUgI3Vuc2V0QkNXUCgpCi0JICogQHNlZSAjc2V0QkNXUChmbG9hdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRCYXNlbGluZTNfQkNXUCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRmxvYXQiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0JDV1AnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlmbG9hdCBnZXRCQ1dQKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lMyNnZXRCQ1dQIDxlbT5CQ1dQPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5CQ1dQPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldEJDV1AoKQotCSAqIEBzZWUgI3Vuc2V0QkNXUCgpCi0JICogQHNlZSAjZ2V0QkNXUCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0QkNXUChmbG9hdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUzI2dldEJDV1AgPGVtPkJDV1A8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0QkNXUCgpCi0JICogQHNlZSAjZ2V0QkNXUCgpCi0JICogQHNlZSAjc2V0QkNXUChmbG9hdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldEJDV1AoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZTMjZ2V0QkNXUCA8ZW0+QkNXUDwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QkNXUDwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0QkNXUCgpCi0JICogQHNlZSAjZ2V0QkNXUCgpCi0JICogQHNlZSAjc2V0QkNXUChmbG9hdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldEJDV1AoKTsKLQotfSAvLyBCYXNlbGluZTMKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvQ2FsZW5kYXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvQ2FsZW5kYXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDI5NWQwMy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L0NhbGVuZGFyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTYgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBDYWxlbmRhci5qYXZhLHYgMS4xIDIwMDgvMDEvMTUgMDg6NTI6NDYganRoYW0gRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0OwotCi1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Q2FsZW5kYXI8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5DYWxlbmRhciNnZXRVSUQgPGVtPlVJRDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5DYWxlbmRhciNnZXROYW1lIDxlbT5OYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkNhbGVuZGFyI2lzSXNCYXNlQ2FsZW5kYXIgPGVtPklzIEJhc2UgQ2FsZW5kYXI8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQ2FsZW5kYXIjZ2V0QmFzZUNhbGVuZGFyVUlEIDxlbT5CYXNlIENhbGVuZGFyIFVJRDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5DYWxlbmRhciNnZXRXZWVrRGF5cyA8ZW0+V2VlayBEYXlzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0Q2FsZW5kYXIoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J0NhbGVuZGFyXy5fdHlwZScga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIENhbGVuZGFyIGV4dGVuZHMgRU9iamVjdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VUlEPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIGNhbGVuZGFyLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlVJRDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0VUlEKEJpZ0ludGVnZXIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0Q2FsZW5kYXJfVUlEKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5JbnRlZ2VyIiByZXF1aXJlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nVUlEJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnSW50ZWdlciBnZXRVSUQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQ2FsZW5kYXIjZ2V0VUlEIDxlbT5VSUQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlVJRDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0VUlEKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRVSUQoQmlnSW50ZWdlciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgbmFtZSBvZiB0aGUgY2FsZW5kYXIuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldE5hbWUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldENhbGVuZGFyX05hbWUoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5OYW1lVHlwZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nTmFtZScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXROYW1lKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkNhbGVuZGFyI2dldE5hbWUgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldE5hbWUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPklzIEJhc2UgQ2FsZW5kYXI8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFdoZXRoZXIgdGhlIGNhbGVuZGFyIGlzIGEgYmFzZSBjYWxlbmRhci4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JcyBCYXNlIENhbGVuZGFyPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldElzQmFzZUNhbGVuZGFyKCkKLQkgKiBAc2VlICN1bnNldElzQmFzZUNhbGVuZGFyKCkKLQkgKiBAc2VlICNzZXRJc0Jhc2VDYWxlbmRhcihib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldENhbGVuZGFyX0lzQmFzZUNhbGVuZGFyKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdJc0Jhc2VDYWxlbmRhcicgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNJc0Jhc2VDYWxlbmRhcigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5DYWxlbmRhciNpc0lzQmFzZUNhbGVuZGFyIDxlbT5JcyBCYXNlIENhbGVuZGFyPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5JcyBCYXNlIENhbGVuZGFyPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldElzQmFzZUNhbGVuZGFyKCkKLQkgKiBAc2VlICN1bnNldElzQmFzZUNhbGVuZGFyKCkKLQkgKiBAc2VlICNpc0lzQmFzZUNhbGVuZGFyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRJc0Jhc2VDYWxlbmRhcihib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5DYWxlbmRhciNpc0lzQmFzZUNhbGVuZGFyIDxlbT5JcyBCYXNlIENhbGVuZGFyPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldElzQmFzZUNhbGVuZGFyKCkKLQkgKiBAc2VlICNpc0lzQmFzZUNhbGVuZGFyKCkKLQkgKiBAc2VlICNzZXRJc0Jhc2VDYWxlbmRhcihib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0SXNCYXNlQ2FsZW5kYXIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5DYWxlbmRhciNpc0lzQmFzZUNhbGVuZGFyIDxlbT5JcyBCYXNlIENhbGVuZGFyPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JcyBCYXNlIENhbGVuZGFyPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRJc0Jhc2VDYWxlbmRhcigpCi0JICogQHNlZSAjaXNJc0Jhc2VDYWxlbmRhcigpCi0JICogQHNlZSAjc2V0SXNCYXNlQ2FsZW5kYXIoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldElzQmFzZUNhbGVuZGFyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5CYXNlIENhbGVuZGFyIFVJRDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBiYXNlIGNhbGVuZGFyIAotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb24gd2hpY2ggdGhpcyBjYWxlbmRhciBkZXBlbmRzLiBPbmx5IGFwcGxpY2FibGUgaWYgdGhlIGNhbGVuZGFyIGlzIAotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90IGEgYmFzZSBjYWxlbmRhci4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QmFzZSBDYWxlbmRhciBVSUQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEJhc2VDYWxlbmRhclVJRChCaWdJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldENhbGVuZGFyX0Jhc2VDYWxlbmRhclVJRCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuSW50ZWdlciIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQmFzZUNhbGVuZGFyVUlEJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnSW50ZWdlciBnZXRCYXNlQ2FsZW5kYXJVSUQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQ2FsZW5kYXIjZ2V0QmFzZUNhbGVuZGFyVUlEIDxlbT5CYXNlIENhbGVuZGFyIFVJRDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QmFzZSBDYWxlbmRhciBVSUQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEJhc2VDYWxlbmRhclVJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0QmFzZUNhbGVuZGFyVUlEKEJpZ0ludGVnZXIgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+V2VlayBEYXlzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgY29sbGVjdGlvbiBvZiBXZWVrZGF5cyB0aGF0IGRlZmluZXMgdGhpcyBjYWxlbmRhci4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5XZWVrIERheXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFdlZWtEYXlzKFdlZWtEYXlzKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldENhbGVuZGFyX1dlZWtEYXlzKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nV2Vla0RheXMnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlXZWVrRGF5cyBnZXRXZWVrRGF5cygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5DYWxlbmRhciNnZXRXZWVrRGF5cyA8ZW0+V2VlayBEYXlzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5XZWVrIERheXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldFdlZWtEYXlzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRXZWVrRGF5cyhXZWVrRGF5cyB2YWx1ZSk7Ci0KLX0gLy8gQ2FsZW5kYXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvQ2FsZW5kYXJzLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L0NhbGVuZGFycy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZGI2MmNhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvQ2FsZW5kYXJzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IENhbGVuZGFycy5qYXZhLHYgMS4xIDIwMDgvMDEvMTUgMDg6NTI6NDUganRoYW0gRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5DYWxlbmRhcnM8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5DYWxlbmRhcnMjZ2V0Q2FsZW5kYXIgPGVtPkNhbGVuZGFyPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0Q2FsZW5kYXJzKCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdDYWxlbmRhcnNfLl90eXBlJyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ2FsZW5kYXJzIGV4dGVuZHMgRU9iamVjdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q2FsZW5kYXI8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkNhbGVuZGFyfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIENhbGVuZGFycyBhcmUgdXNlZCB0byBkZWZpbmUgc3RhbmRhcmQgd29ya2luZyBhbmQgCi0JICogICAgICAgICAgICAgICAgICAgICBub24td29ya2luZyB0aW1lcy4gUHJvamVjdHMgbXVzdCBoYXZlIG9uZSBiYXNlIGNhbGVuZGFyLiBUYXNrcyBhbmQgcmVzb3VyY2VzIAotCSAqICAgICAgICAgICAgICAgICAgICAgbWF5IGhhdmUgdGhlaXIgb3duIG5vbi1iYXNlIGNhbGVuZGFycyB3aGljaCBhcmUgYmFzZWQgb24gYSBiYXNlIGNhbGVuZGFyLgotCSAqICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNhbGVuZGFyPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldENhbGVuZGFyc19DYWxlbmRhcigpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQ2FsZW5kYXIiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiIHJlcXVpcmVkPSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdDYWxlbmRhcicgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldENhbGVuZGFyKCk7Ci0KLX0gLy8gQ2FsZW5kYXJzCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L0RvY3VtZW50Um9vdC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9Eb2N1bWVudFJvb3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjI3NzU1Ni4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L0RvY3VtZW50Um9vdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEzICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogRG9jdW1lbnRSb290LmphdmEsdiAxLjEgMjAwOC8wMS8xNSAwODo1Mjo0NiBqdGhhbSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Eb2N1bWVudCBSb290PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRG9jdW1lbnRSb290I2dldE1peGVkIDxlbT5NaXhlZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Eb2N1bWVudFJvb3QjZ2V0WE1MTlNQcmVmaXhNYXAgPGVtPlhNTE5TIFByZWZpeCBNYXA8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRG9jdW1lbnRSb290I2dldFhTSVNjaGVtYUxvY2F0aW9uIDxlbT5YU0kgU2NoZW1hIExvY2F0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkRvY3VtZW50Um9vdCNnZXRQcm9qZWN0IDxlbT5Qcm9qZWN0PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0RG9jdW1lbnRSb290KCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPScnIGtpbmQ9J21peGVkJyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBEb2N1bWVudFJvb3QgZXh0ZW5kcyBFT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5NaXhlZDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXAuRW50cnl9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TWl4ZWQ8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NaXhlZDwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXREb2N1bWVudFJvb3RfTWl4ZWQoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVGZWF0dXJlTWFwRW50cnkiIG1hbnk9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnRXaWxkY2FyZCcgbmFtZT0nOm1peGVkJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRmVhdHVyZU1hcCBnZXRNaXhlZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+WE1MTlMgUHJlZml4IE1hcDwvYj48L2VtPicgbWFwLgotCSAqIFRoZSBrZXkgaXMgb2YgdHlwZSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30sCi0JICogYW5kIHRoZSB2YWx1ZSBpcyBvZiB0eXBlIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfSwKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlhNTE5TIFByZWZpeCBNYXA8L2VtPicgbWFwIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+WE1MTlMgUHJlZml4IE1hcDwvZW0+JyBtYXAuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0RG9jdW1lbnRSb290X1hNTE5TUHJlZml4TWFwKCkKLQkgKiBAbW9kZWwgbWFwVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJpbmdUb1N0cmluZ01hcEVudHJ5IiBrZXlUeXBlPSJqYXZhLmxhbmcuU3RyaW5nIiB2YWx1ZVR5cGU9ImphdmEubGFuZy5TdHJpbmciIHRyYW5zaWVudD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nYXR0cmlidXRlJyBuYW1lPSd4bWxuczpwcmVmaXgnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTWFwIGdldFhNTE5TUHJlZml4TWFwKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5YU0kgU2NoZW1hIExvY2F0aW9uPC9iPjwvZW0+JyBtYXAuCi0JICogVGhlIGtleSBpcyBvZiB0eXBlIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfSwKLQkgKiBhbmQgdGhlIHZhbHVlIGlzIG9mIHR5cGUge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9LAotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+WFNJIFNjaGVtYSBMb2NhdGlvbjwvZW0+JyBtYXAgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5YU0kgU2NoZW1hIExvY2F0aW9uPC9lbT4nIG1hcC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXREb2N1bWVudFJvb3RfWFNJU2NoZW1hTG9jYXRpb24oKQotCSAqIEBtb2RlbCBtYXBUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cmluZ1RvU3RyaW5nTWFwRW50cnkiIGtleVR5cGU9ImphdmEubGFuZy5TdHJpbmciIHZhbHVlVHlwZT0iamF2YS5sYW5nLlN0cmluZyIgdHJhbnNpZW50PSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdhdHRyaWJ1dGUnIG5hbWU9J3hzaTpzY2hlbWFMb2NhdGlvbiciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVNYXAgZ2V0WFNJU2NoZW1hTG9jYXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlByb2plY3Q8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBwcm9qZWN0IGlzIHRoZSB0b3AgbGV2ZWwgZWxlbWVudCBvZiB0aGUgZG9jdW1lbnQuCi0JICogCQkJCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlByb2plY3Q8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFByb2plY3QoUHJvamVjdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXREb2N1bWVudFJvb3RfUHJvamVjdCgpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiIHVwcGVyPSItMiIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nUHJvamVjdCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVByb2plY3QgZ2V0UHJvamVjdCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Eb2N1bWVudFJvb3QjZ2V0UHJvamVjdCA8ZW0+UHJvamVjdDwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UHJvamVjdDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0UHJvamVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UHJvamVjdChQcm9qZWN0IHZhbHVlKTsKLQotfSAvLyBEb2N1bWVudFJvb3QKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvRXh0ZW5kZWRBdHRyaWJ1dGUuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvRXh0ZW5kZWRBdHRyaWJ1dGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDU5Mzc4My4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L0V4dGVuZGVkQXR0cmlidXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MjEgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBFeHRlbmRlZEF0dHJpYnV0ZS5qYXZhLHYgMS4xIDIwMDgvMDEvMTUgMDg6NTI6NDYganRoYW0gRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0OwotCi1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RXh0ZW5kZWQgQXR0cmlidXRlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUjZ2V0RmllbGRJRCA8ZW0+RmllbGQgSUQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUjZ2V0RmllbGROYW1lIDxlbT5GaWVsZCBOYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlI2dldEFsaWFzIDxlbT5BbGlhczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZSNnZXRQaG9uZXRpY0FsaWFzIDxlbT5QaG9uZXRpYyBBbGlhczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZSNnZXRSb2xsdXBUeXBlIDxlbT5Sb2xsdXAgVHlwZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZSNnZXRDYWxjdWxhdGlvblR5cGUgPGVtPkNhbGN1bGF0aW9uIFR5cGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUjZ2V0Rm9ybXVsYSA8ZW0+Rm9ybXVsYTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZSNpc1Jlc3RyaWN0VmFsdWVzIDxlbT5SZXN0cmljdCBWYWx1ZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUjZ2V0VmFsdWVsaXN0U29ydE9yZGVyIDxlbT5WYWx1ZWxpc3QgU29ydCBPcmRlcjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZSNpc0FwcGVuZE5ld1ZhbHVlcyA8ZW0+QXBwZW5kIE5ldyBWYWx1ZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUjZ2V0RGVmYXVsdCA8ZW0+RGVmYXVsdDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZSNnZXRWYWx1ZUxpc3QgPGVtPlZhbHVlIExpc3Q8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRFeHRlbmRlZEF0dHJpYnV0ZSgpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nRXh0ZW5kZWRBdHRyaWJ1dGVfLl90eXBlJyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRXh0ZW5kZWRBdHRyaWJ1dGUgZXh0ZW5kcyBFT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5GaWVsZCBJRDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhpcyBjb3JyZXNwb25kcyB0byB0aGUgUElEIG9mIHRoZSBjdXN0b20gZmllbGQuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RmllbGQgSUQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEZpZWxkSUQoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEV4dGVuZGVkQXR0cmlidXRlX0ZpZWxkSUQoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nRmllbGRJRCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRGaWVsZElEKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlI2dldEZpZWxkSUQgPGVtPkZpZWxkIElEPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5GaWVsZCBJRDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0RmllbGRJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RmllbGRJRChTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RmllbGQgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIG5hbWUgb2YgdGhlIGN1c3RvbSBmaWVsZC4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RmllbGQgTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0RmllbGROYW1lKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRFeHRlbmRlZEF0dHJpYnV0ZV9GaWVsZE5hbWUoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nRmllbGROYW1lJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldEZpZWxkTmFtZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZSNnZXRGaWVsZE5hbWUgPGVtPkZpZWxkIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkZpZWxkIE5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEZpZWxkTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RmllbGROYW1lKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BbGlhczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGFsaWFzIG9mIHRoZSBjdXN0b20gZmllbGQKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QWxpYXM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEFsaWFzKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRFeHRlbmRlZEF0dHJpYnV0ZV9BbGlhcygpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFsaWFzVHlwZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQWxpYXMnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0QWxpYXMoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUjZ2V0QWxpYXMgPGVtPkFsaWFzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BbGlhczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0QWxpYXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEFsaWFzKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QaG9uZXRpYyBBbGlhczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHBob25ldGljIHByb251bmNpYXRpb24gb2YgdGhlIGFsaWFzIG9mIHRoZSAKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1c3RvbSBmaWVsZAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QaG9uZXRpYyBBbGlhczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UGhvbmV0aWNBbGlhcyhTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0RXh0ZW5kZWRBdHRyaWJ1dGVfUGhvbmV0aWNBbGlhcygpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlBob25ldGljQWxpYXNUeXBlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdQaG9uZXRpY0FsaWFzJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFBob25ldGljQWxpYXMoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUjZ2V0UGhvbmV0aWNBbGlhcyA8ZW0+UGhvbmV0aWMgQWxpYXM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlBob25ldGljIEFsaWFzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRQaG9uZXRpY0FsaWFzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRQaG9uZXRpY0FsaWFzKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Sb2xsdXAgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogSG93IHJvbGx1cHMgYXJlIGNhbGN1bGF0ZWQuIFZhbHVlcyBhcmU6IDA9TWF4aW11bSAKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChPUiBmb3IgZmxhZyBmaWVsZHMpLCAxPU1pbmltdW0gKEFORCBmb3IgZmxhZyBmaWVsZHMpLCAyPUNvdW50IGFsbCwgMz1TdW0sIAotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgND1BdmVyYWdlLCA1PUF2ZXJhZ2UgRmlyc3QgU3VibGV2ZWwsIDY9Q291bnQgRmlyc3QgU3VibGV2ZWwsIDc9Q291bnQgCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb25zdW1tYXJpZXMKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Um9sbHVwIFR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFJvbGx1cFR5cGUoQmlnSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRFeHRlbmRlZEF0dHJpYnV0ZV9Sb2xsdXBUeXBlKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUm9sbHVwVHlwZVR5cGUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1JvbGx1cFR5cGUnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdJbnRlZ2VyIGdldFJvbGx1cFR5cGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUjZ2V0Um9sbHVwVHlwZSA8ZW0+Um9sbHVwIFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlJvbGx1cCBUeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRSb2xsdXBUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRSb2xsdXBUeXBlKEJpZ0ludGVnZXIgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q2FsY3VsYXRpb24gVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogV2hldGhlciByb2xsdXBzIGFyZSBjYWxjdWxhdGVkIGZvciB0YXNrIGFuZCBncm91cCBzdW1tYXJ5IHJvd3MuIAotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVzIGFyZTogMD1Ob25lLCAxPVJvbGx1cCwgMj1DYWxjdWxhdGlvbgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5DYWxjdWxhdGlvbiBUeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRDYWxjdWxhdGlvblR5cGUoQmlnSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRFeHRlbmRlZEF0dHJpYnV0ZV9DYWxjdWxhdGlvblR5cGUoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5DYWxjdWxhdGlvblR5cGVUeXBlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdDYWxjdWxhdGlvblR5cGUnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdJbnRlZ2VyIGdldENhbGN1bGF0aW9uVHlwZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZSNnZXRDYWxjdWxhdGlvblR5cGUgPGVtPkNhbGN1bGF0aW9uIFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNhbGN1bGF0aW9uIFR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldENhbGN1bGF0aW9uVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Q2FsY3VsYXRpb25UeXBlKEJpZ0ludGVnZXIgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Rm9ybXVsYTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGZvcm11bGEgdGhhdCBNaWNyb3NvZnQgUHJvamVjdCB1c2VzIHRvIHBvcHVsYXRlIHRoZSAKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1c3RvbSB0YXNrIGZpZWxkLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Gb3JtdWxhPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRGb3JtdWxhKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRFeHRlbmRlZEF0dHJpYnV0ZV9Gb3JtdWxhKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0Zvcm11bGEnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0Rm9ybXVsYSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZSNnZXRGb3JtdWxhIDxlbT5Gb3JtdWxhPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Gb3JtdWxhPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRGb3JtdWxhKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRGb3JtdWxhKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SZXN0cmljdCBWYWx1ZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIElmIFJlc3RyaWN0VmFsdWVzPVRydWUgdGhlbiBvbmx5IHZhbHVlcyBpbiB0aGUgbGlzdCBhcmUgCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd2VkIGluIHRoZSBmaWxlCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJlc3RyaWN0IFZhbHVlczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRSZXN0cmljdFZhbHVlcygpCi0JICogQHNlZSAjdW5zZXRSZXN0cmljdFZhbHVlcygpCi0JICogQHNlZSAjc2V0UmVzdHJpY3RWYWx1ZXMoYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRFeHRlbmRlZEF0dHJpYnV0ZV9SZXN0cmljdFZhbHVlcygpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbiIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nUmVzdHJpY3RWYWx1ZXMnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzUmVzdHJpY3RWYWx1ZXMoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUjaXNSZXN0cmljdFZhbHVlcyA8ZW0+UmVzdHJpY3QgVmFsdWVzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5SZXN0cmljdCBWYWx1ZXM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0UmVzdHJpY3RWYWx1ZXMoKQotCSAqIEBzZWUgI3Vuc2V0UmVzdHJpY3RWYWx1ZXMoKQotCSAqIEBzZWUgI2lzUmVzdHJpY3RWYWx1ZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFJlc3RyaWN0VmFsdWVzKGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlI2lzUmVzdHJpY3RWYWx1ZXMgPGVtPlJlc3RyaWN0IFZhbHVlczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRSZXN0cmljdFZhbHVlcygpCi0JICogQHNlZSAjaXNSZXN0cmljdFZhbHVlcygpCi0JICogQHNlZSAjc2V0UmVzdHJpY3RWYWx1ZXMoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldFJlc3RyaWN0VmFsdWVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUjaXNSZXN0cmljdFZhbHVlcyA8ZW0+UmVzdHJpY3QgVmFsdWVzPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZXN0cmljdCBWYWx1ZXM8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldFJlc3RyaWN0VmFsdWVzKCkKLQkgKiBAc2VlICNpc1Jlc3RyaWN0VmFsdWVzKCkKLQkgKiBAc2VlICNzZXRSZXN0cmljdFZhbHVlcyhib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0UmVzdHJpY3RWYWx1ZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlZhbHVlbGlzdCBTb3J0IE9yZGVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBIb3cgdmFsdWUgbGlzdHMgYXJlIHNvcnRlZC4gVmFsdWVzIGFyZTogCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwPURlc2NlbmRpbmcsIDE9QXNjZW5kaW5nCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlZhbHVlbGlzdCBTb3J0IE9yZGVyPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRWYWx1ZWxpc3RTb3J0T3JkZXIoQmlnSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRFeHRlbmRlZEF0dHJpYnV0ZV9WYWx1ZWxpc3RTb3J0T3JkZXIoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5WYWx1ZWxpc3RTb3J0T3JkZXJUeXBlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdWYWx1ZWxpc3RTb3J0T3JkZXInIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdJbnRlZ2VyIGdldFZhbHVlbGlzdFNvcnRPcmRlcigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZSNnZXRWYWx1ZWxpc3RTb3J0T3JkZXIgPGVtPlZhbHVlbGlzdCBTb3J0IE9yZGVyPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5WYWx1ZWxpc3QgU29ydCBPcmRlcjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0VmFsdWVsaXN0U29ydE9yZGVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRWYWx1ZWxpc3RTb3J0T3JkZXIoQmlnSW50ZWdlciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BcHBlbmQgTmV3IFZhbHVlczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogSWYgQXBwZW5kTmV3VmFsdWVzPVRydWUgdGhlbiBhbnkgbmV3IHZhbHVlcyBhZGRlZCBpbiBhIHByb2plY3QgCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmUgYXV0b21hdGljYWxseSBhcHBlbmRlZCB0byB0aGUgbGlzdC4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QXBwZW5kIE5ldyBWYWx1ZXM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0QXBwZW5kTmV3VmFsdWVzKCkKLQkgKiBAc2VlICN1bnNldEFwcGVuZE5ld1ZhbHVlcygpCi0JICogQHNlZSAjc2V0QXBwZW5kTmV3VmFsdWVzKGJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0RXh0ZW5kZWRBdHRyaWJ1dGVfQXBwZW5kTmV3VmFsdWVzKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdBcHBlbmROZXdWYWx1ZXMnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzQXBwZW5kTmV3VmFsdWVzKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlI2lzQXBwZW5kTmV3VmFsdWVzIDxlbT5BcHBlbmQgTmV3IFZhbHVlczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QXBwZW5kIE5ldyBWYWx1ZXM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0QXBwZW5kTmV3VmFsdWVzKCkKLQkgKiBAc2VlICN1bnNldEFwcGVuZE5ld1ZhbHVlcygpCi0JICogQHNlZSAjaXNBcHBlbmROZXdWYWx1ZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEFwcGVuZE5ld1ZhbHVlcyhib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZSNpc0FwcGVuZE5ld1ZhbHVlcyA8ZW0+QXBwZW5kIE5ldyBWYWx1ZXM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0QXBwZW5kTmV3VmFsdWVzKCkKLQkgKiBAc2VlICNpc0FwcGVuZE5ld1ZhbHVlcygpCi0JICogQHNlZSAjc2V0QXBwZW5kTmV3VmFsdWVzKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRBcHBlbmROZXdWYWx1ZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZSNpc0FwcGVuZE5ld1ZhbHVlcyA8ZW0+QXBwZW5kIE5ldyBWYWx1ZXM8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkFwcGVuZCBOZXcgVmFsdWVzPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRBcHBlbmROZXdWYWx1ZXMoKQotCSAqIEBzZWUgI2lzQXBwZW5kTmV3VmFsdWVzKCkKLQkgKiBAc2VlICNzZXRBcHBlbmROZXdWYWx1ZXMoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldEFwcGVuZE5ld1ZhbHVlcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGVmYXVsdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhpcyBwb2ludHMgdG8gdGhlIGRlZmF1bHQgdmFsdWUgaW4gdGhlIGxpc3QuIAotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm90IHByZXNlbnQgaWYgbm8gZGVmYXVsdCBpcyBzZXQuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRlZmF1bHQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldERlZmF1bHQoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEV4dGVuZGVkQXR0cmlidXRlX0RlZmF1bHQoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nRGVmYXVsdCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXREZWZhdWx0KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlI2dldERlZmF1bHQgPGVtPkRlZmF1bHQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkRlZmF1bHQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldERlZmF1bHQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldERlZmF1bHQoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlZhbHVlIExpc3Q8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFdoZW4gdmFsdWVzIG9mIGV4dGVuZGVkIGF0dHJpYnV0ZXMgYXJlIHNwZWNpZmllZCBhcyAKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnRpZXMgb2YgZWxlbWVudHMgaW4gdGhlIHNjaGVtYSwgdGhleSBtYXkgZWl0aGVyIGJlIHNwZWNpZmllZCBieSB2YWx1ZXMgCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvciBieSByZWZlcmVuY2VzIHRvIHRoZSB2YWx1ZXMgY29udGFpbmVkIGluIHRoaXMgbGlzdC4gIEFwcGxpY2F0aW9ucyBtYXkgCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3N1bWUgb3JkZXJpbmcgb2YgdGhlIGxpc3QgYnkgb3JkZXJpbmcgc3BlY2lmaWVkIGhlcmUuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlZhbHVlIExpc3Q8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFZhbHVlTGlzdChWYWx1ZUxpc3QpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0RXh0ZW5kZWRBdHRyaWJ1dGVfVmFsdWVMaXN0KCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nVmFsdWVMaXN0JyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JVmFsdWVMaXN0IGdldFZhbHVlTGlzdCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZSNnZXRWYWx1ZUxpc3QgPGVtPlZhbHVlIExpc3Q8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlZhbHVlIExpc3Q8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldFZhbHVlTGlzdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VmFsdWVMaXN0KFZhbHVlTGlzdCB2YWx1ZSk7Ci0KLX0gLy8gRXh0ZW5kZWRBdHRyaWJ1dGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvRXh0ZW5kZWRBdHRyaWJ1dGUyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L0V4dGVuZGVkQXR0cmlidXRlMi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZDVhNzhiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvRXh0ZW5kZWRBdHRyaWJ1dGUyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzIgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBFeHRlbmRlZEF0dHJpYnV0ZTIuamF2YSx2IDEuMSAyMDA4LzAxLzE1IDA4OjUyOjQ2IGp0aGFtIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdDsKLQotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkV4dGVuZGVkIEF0dHJpYnV0ZTI8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZTIjZ2V0VUlEIDxlbT5VSUQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUyI2dldEZpZWxkSUQgPGVtPkZpZWxkIElEPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlMiNnZXRWYWx1ZSA8ZW0+VmFsdWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUyI2dldFZhbHVlSUQgPGVtPlZhbHVlIElEPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlMiNnZXREdXJhdGlvbkZvcm1hdCA8ZW0+RHVyYXRpb24gRm9ybWF0PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUyKCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdFeHRlbmRlZEF0dHJpYnV0ZV8uXzFfLl90eXBlJyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRXh0ZW5kZWRBdHRyaWJ1dGUyIGV4dGVuZHMgRU9iamVjdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VUlEPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgdW5pcXVlIElEIG9mIHRoZSB2YWx1ZSBpbiB0aGUgZXh0ZW5kZWQgYXR0cmlidXRlIGNvbGxlY3Rpb24uCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VUlEPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRVSUQoQmlnSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRFeHRlbmRlZEF0dHJpYnV0ZTJfVUlEKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5JbnRlZ2VyIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdVSUQnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdJbnRlZ2VyIGdldFVJRCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZTIjZ2V0VUlEIDxlbT5VSUQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlVJRDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0VUlEKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRVSUQoQmlnSW50ZWdlciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5GaWVsZCBJRDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIFBJRCBvZiB0aGUgY3VzdG9tIGZpZWxkLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkZpZWxkIElEPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRGaWVsZElEKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRFeHRlbmRlZEF0dHJpYnV0ZTJfRmllbGRJRCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdGaWVsZElEJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldEZpZWxkSUQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUyI2dldEZpZWxkSUQgPGVtPkZpZWxkIElEPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5GaWVsZCBJRDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0RmllbGRJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RmllbGRJRChTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBhY3R1YWwgdmFsdWUgb2YgdGhlIGV4dGVuZGVkIGF0dHJpYnV0ZS4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5WYWx1ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0VmFsdWUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEV4dGVuZGVkQXR0cmlidXRlMl9WYWx1ZSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdWYWx1ZScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRWYWx1ZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZTIjZ2V0VmFsdWUgPGVtPlZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5WYWx1ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0VmFsdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFZhbHVlKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5WYWx1ZSBJRDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIElEIG9mIHRoZSB2YWx1ZSBpbiB0aGUgZXh0ZW5kZWQgYXR0cmlidXQgbG9va3VwIHRhYmxlLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlZhbHVlIElEPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRWYWx1ZUlEKEJpZ0ludGVnZXIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUyX1ZhbHVlSUQoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkludGVnZXIiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1ZhbHVlSUQnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdJbnRlZ2VyIGdldFZhbHVlSUQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUyI2dldFZhbHVlSUQgPGVtPlZhbHVlIElEPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5WYWx1ZSBJRDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0VmFsdWVJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VmFsdWVJRChCaWdJbnRlZ2VyIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkR1cmF0aW9uIEZvcm1hdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGZvcm1hdCBmb3IgZXhwcmVzc2luZyB0aGUgYnVsayBkdXJhdGlvbi4gIAotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVzIGFyZTogMz1tLCA0PWVtLCA1PWgsIDY9ZWgsIDc9ZCwgOD1lZCwgOT13LCAxMD1ldywgMTE9bW8sIDEyPWVtbywgCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxOT0lLCAyMD1lJSwgMjE9bnVsbCwgMzU9bT8sIDM2PWVtPywgMzc9aD8sIDM4PWVoPywgMzk9ZD8sIDQwPWVkPywgNDE9dz8sIAotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDI9ZXc/LCA0Mz1tbz8sIDQ0PWVtbz8sIDUxPSU/LCA1Mj1lJT8gYW5kIDUzPW51bGwuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RHVyYXRpb24gRm9ybWF0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXREdXJhdGlvbkZvcm1hdChCaWdJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEV4dGVuZGVkQXR0cmlidXRlMl9EdXJhdGlvbkZvcm1hdCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkR1cmF0aW9uRm9ybWF0VHlwZTIiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0R1cmF0aW9uRm9ybWF0JyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnSW50ZWdlciBnZXREdXJhdGlvbkZvcm1hdCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZTIjZ2V0RHVyYXRpb25Gb3JtYXQgPGVtPkR1cmF0aW9uIEZvcm1hdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RHVyYXRpb24gRm9ybWF0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXREdXJhdGlvbkZvcm1hdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RHVyYXRpb25Gb3JtYXQoQmlnSW50ZWdlciB2YWx1ZSk7Ci0KLX0gLy8gRXh0ZW5kZWRBdHRyaWJ1dGUyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L0V4dGVuZGVkQXR0cmlidXRlMy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9FeHRlbmRlZEF0dHJpYnV0ZTMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGY4YjI4Yy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L0V4dGVuZGVkQXR0cmlidXRlMy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcyICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogRXh0ZW5kZWRBdHRyaWJ1dGUzLmphdmEsdiAxLjEgMjAwOC8wMS8xNSAwODo1Mjo0NiBqdGhhbSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Q7Ci0KLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5FeHRlbmRlZCBBdHRyaWJ1dGUzPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUzI2dldFVJRCA8ZW0+VUlEPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlMyNnZXRGaWVsZElEIDxlbT5GaWVsZCBJRDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZTMjZ2V0VmFsdWUgPGVtPlZhbHVlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlMyNnZXRWYWx1ZUlEIDxlbT5WYWx1ZSBJRDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZTMjZ2V0RHVyYXRpb25Gb3JtYXQgPGVtPkR1cmF0aW9uIEZvcm1hdDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEV4dGVuZGVkQXR0cmlidXRlMygpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nRXh0ZW5kZWRBdHRyaWJ1dGVfLl8yXy5fdHlwZScga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEV4dGVuZGVkQXR0cmlidXRlMyBleHRlbmRzIEVPYmplY3QgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlVJRDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHVuaXF1ZSBJRCBvZiB0aGUgdmFsdWUgaW4gdGhlIGV4dGVuZGVkIGF0dHJpYnV0ZSBjb2xsZWN0aW9uLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlVJRDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0VUlEKEJpZ0ludGVnZXIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUzX1VJRCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuSW50ZWdlciIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nVUlEJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnSW50ZWdlciBnZXRVSUQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUzI2dldFVJRCA8ZW0+VUlEPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5VSUQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFVJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VUlEKEJpZ0ludGVnZXIgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RmllbGQgSUQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBQSUQgb2YgdGhlIGN1c3RvbSBmaWVsZC4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5GaWVsZCBJRDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0RmllbGRJRChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUzX0ZpZWxkSUQoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nRmllbGRJRCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRGaWVsZElEKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlMyNnZXRGaWVsZElEIDxlbT5GaWVsZCBJRDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RmllbGQgSUQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEZpZWxkSUQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEZpZWxkSUQoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgYWN0dWFsIHZhbHVlIG9mIHRoZSBleHRlbmRlZCBhdHRyaWJ1dGUuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VmFsdWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFZhbHVlKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRFeHRlbmRlZEF0dHJpYnV0ZTNfVmFsdWUoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nVmFsdWUnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0VmFsdWUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUzI2dldFZhbHVlIDxlbT5WYWx1ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VmFsdWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFZhbHVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRWYWx1ZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VmFsdWUgSUQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBJRCBvZiB0aGUgdmFsdWUgaW4gdGhlIGV4dGVuZGVkIGF0dHJpYnV0IGxvb2t1cCB0YWJsZS4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5WYWx1ZSBJRDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0VmFsdWVJRChCaWdJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEV4dGVuZGVkQXR0cmlidXRlM19WYWx1ZUlEKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5JbnRlZ2VyIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdWYWx1ZUlEJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnSW50ZWdlciBnZXRWYWx1ZUlEKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlMyNnZXRWYWx1ZUlEIDxlbT5WYWx1ZSBJRDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VmFsdWUgSUQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFZhbHVlSUQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFZhbHVlSUQoQmlnSW50ZWdlciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EdXJhdGlvbiBGb3JtYXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBmb3JtYXQgZm9yIGV4cHJlc3NpbmcgdGhlIGJ1bGsgZHVyYXRpb24uICAKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlcyBhcmU6IDM9bSwgND1lbSwgNT1oLCA2PWVoLCA3PWQsIDg9ZWQsIDk9dywgMTA9ZXcsIDExPW1vLCAxMj1lbW8sIDE5PSUsIAotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjA9ZSUsIDIxPW51bGwsIDM1PW0/LCAzNj1lbT8sIDM3PWg/LCAzOD1laD8sIDM5PWQ/LCA0MD1lZD8sIDQxPXc/LCA0Mj1ldz8sIAotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDM9bW8/LCA0ND1lbW8/LCA1MT0lPywgNTI9ZSU/IGFuZCA1Mz1udWxsLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkR1cmF0aW9uIEZvcm1hdDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0RHVyYXRpb25Gb3JtYXQoQmlnSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRFeHRlbmRlZEF0dHJpYnV0ZTNfRHVyYXRpb25Gb3JtYXQoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5EdXJhdGlvbkZvcm1hdFR5cGUzIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdEdXJhdGlvbkZvcm1hdCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0ludGVnZXIgZ2V0RHVyYXRpb25Gb3JtYXQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUzI2dldER1cmF0aW9uRm9ybWF0IDxlbT5EdXJhdGlvbiBGb3JtYXQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkR1cmF0aW9uIEZvcm1hdDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0RHVyYXRpb25Gb3JtYXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldER1cmF0aW9uRm9ybWF0KEJpZ0ludGVnZXIgdmFsdWUpOwotCi19IC8vIEV4dGVuZGVkQXR0cmlidXRlMwpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9FeHRlbmRlZEF0dHJpYnV0ZTQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvRXh0ZW5kZWRBdHRyaWJ1dGU0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0ZDFlY2MuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9FeHRlbmRlZEF0dHJpYnV0ZTQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MiArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IEV4dGVuZGVkQXR0cmlidXRlNC5qYXZhLHYgMS4xIDIwMDgvMDEvMTUgMDg6NTI6NDUganRoYW0gRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0OwotCi1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RXh0ZW5kZWQgQXR0cmlidXRlNDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlNCNnZXRVSUQgPGVtPlVJRDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZTQjZ2V0RmllbGRJRCA8ZW0+RmllbGQgSUQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGU0I2dldFZhbHVlIDxlbT5WYWx1ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZTQjZ2V0VmFsdWVJRCA8ZW0+VmFsdWUgSUQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGU0I2dldER1cmF0aW9uRm9ybWF0IDxlbT5EdXJhdGlvbiBGb3JtYXQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRFeHRlbmRlZEF0dHJpYnV0ZTQoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J0V4dGVuZGVkQXR0cmlidXRlXy5fM18uX3R5cGUnIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBFeHRlbmRlZEF0dHJpYnV0ZTQgZXh0ZW5kcyBFT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5VSUQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSB1bmlxdWUgSUQgb2YgdGhlIHZhbHVlIGluIHRoZSBleHRlbmRlZCBhdHRyaWJ1dGUgY29sbGVjdGlvbi4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlVJRDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0VUlEKEJpZ0ludGVnZXIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0RXh0ZW5kZWRBdHRyaWJ1dGU0X1VJRCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuSW50ZWdlciIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nVUlEJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnSW50ZWdlciBnZXRVSUQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGU0I2dldFVJRCA8ZW0+VUlEPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5VSUQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFVJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VUlEKEJpZ0ludGVnZXIgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RmllbGQgSUQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBmaWVsZCBJRCBpbiB0aGUgbG9jYWxpc2VkIGxhbmd1YWdlLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RmllbGQgSUQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEZpZWxkSUQoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEV4dGVuZGVkQXR0cmlidXRlNF9GaWVsZElEKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0ZpZWxkSUQnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0RmllbGRJRCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZTQjZ2V0RmllbGRJRCA8ZW0+RmllbGQgSUQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkZpZWxkIElEPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRGaWVsZElEKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRGaWVsZElEKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5WYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGFjdHVhbCB2YWx1ZSBvZiB0aGUgZXh0ZW5kZWQgYXR0cmlidXRlLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VmFsdWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFZhbHVlKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRFeHRlbmRlZEF0dHJpYnV0ZTRfVmFsdWUoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nVmFsdWUnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0VmFsdWUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGU0I2dldFZhbHVlIDxlbT5WYWx1ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VmFsdWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFZhbHVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRWYWx1ZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VmFsdWUgSUQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBJRCBvZiB0aGUgdmFsdWUgaW4gdGhlIGV4dGVuZGVkIGF0dHJpYnV0IGxvb2t1cCB0YWJsZS4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlZhbHVlIElEPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRWYWx1ZUlEKEJpZ0ludGVnZXIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0RXh0ZW5kZWRBdHRyaWJ1dGU0X1ZhbHVlSUQoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkludGVnZXIiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1ZhbHVlSUQnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdJbnRlZ2VyIGdldFZhbHVlSUQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGU0I2dldFZhbHVlSUQgPGVtPlZhbHVlIElEPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5WYWx1ZSBJRDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0VmFsdWVJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VmFsdWVJRChCaWdJbnRlZ2VyIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkR1cmF0aW9uIEZvcm1hdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGZvcm1hdCBmb3IgZXhwcmVzc2luZyB0aGUgYnVsayBkdXJhdGlvbi4gIAotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZXMgYXJlOiAzPW0sIDQ9ZW0sIDU9aCwgNj1laCwgNz1kLCA4PWVkLCA5PXcsIDEwPWV3LCAxMT1tbywgMTI9ZW1vLCAxOT0lLCAyMD1lJSwgCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIxPW51bGwsIDM1PW0/LCAzNj1lbT8sIDM3PWg/LCAzOD1laD8sIDM5PWQ/LCA0MD1lZD8sIDQxPXc/LCA0Mj1ldz8sIDQzPW1vPywgNDQ9ZW1vPywgCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUxPSU/LCA1Mj1lJT8gYW5kIDUzPW51bGwuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EdXJhdGlvbiBGb3JtYXQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldER1cmF0aW9uRm9ybWF0KEJpZ0ludGVnZXIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0RXh0ZW5kZWRBdHRyaWJ1dGU0X0R1cmF0aW9uRm9ybWF0KCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRHVyYXRpb25Gb3JtYXRUeXBlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdEdXJhdGlvbkZvcm1hdCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0ludGVnZXIgZ2V0RHVyYXRpb25Gb3JtYXQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGU0I2dldER1cmF0aW9uRm9ybWF0IDxlbT5EdXJhdGlvbiBGb3JtYXQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkR1cmF0aW9uIEZvcm1hdDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0RHVyYXRpb25Gb3JtYXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldER1cmF0aW9uRm9ybWF0KEJpZ0ludGVnZXIgdmFsdWUpOwotCi19IC8vIEV4dGVuZGVkQXR0cmlidXRlNApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9FeHRlbmRlZEF0dHJpYnV0ZXMuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvRXh0ZW5kZWRBdHRyaWJ1dGVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1NDhmMDcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9FeHRlbmRlZEF0dHJpYnV0ZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogRXh0ZW5kZWRBdHRyaWJ1dGVzLmphdmEsdiAxLjEgMjAwOC8wMS8xNSAwODo1Mjo0NSBqdGhhbSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkV4dGVuZGVkIEF0dHJpYnV0ZXM8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZXMjZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUgPGVtPkV4dGVuZGVkIEF0dHJpYnV0ZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEV4dGVuZGVkQXR0cmlidXRlcygpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nRXh0ZW5kZWRBdHRyaWJ1dGVzXy5fdHlwZScga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEV4dGVuZGVkQXR0cmlidXRlcyBleHRlbmRzIEVPYmplY3QgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkV4dGVuZGVkIEF0dHJpYnV0ZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogRWFjaCBvZiB0aGUgaW5kaXZpZHVhbCBlbnRyaWVzIGluIHRoZSBleHRlbmRlZCBhdHRyaWJ1dGVzIGRlZmluaXRpb24gCi0JICogICAgICAgICAgICAgICAgICAgICBjb2xsZWN0aW9uLiAgVGhlcmUgYXJlIG5vIGxpbWl0cyB0byB0aGUgbnVtYmVyIG9mIGNoaWxkcmVuIHRoYXQgbWF5IGFwcGVhciwgYnV0IHByb2plY3QgCi0JICogICAgICAgICAgICAgICAgICAgICB3aWxsIG9ubHkgdW5kZXJzdGFuZCBGbGFnMS1GbGFnMTAsIGV0Yy4gIFRoaXMgbXVzdCBhcHBlYXIgb25jZSBpbiBlYWNoIEV4dGVuZGVkQXR0cmlidXRlcyAKLQkgKiAgICAgICAgICAgICAgICAgICAgIGNvbGxlY3Rpb24uCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkV4dGVuZGVkIEF0dHJpYnV0ZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRFeHRlbmRlZEF0dHJpYnV0ZXNfRXh0ZW5kZWRBdHRyaWJ1dGUoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdFeHRlbmRlZEF0dHJpYnV0ZScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldEV4dGVuZGVkQXR0cmlidXRlKCk7Ci0KLX0gLy8gRXh0ZW5kZWRBdHRyaWJ1dGVzCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L01hc2suamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvTWFzay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjN2Y5OWIxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvTWFzay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM3ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogTWFzay5qYXZhLHYgMS4xIDIwMDgvMDEvMTUgMDg6NTI6NDYganRoYW0gRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0OwotCi1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+TWFzazwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1hc2sjZ2V0TGV2ZWwgPGVtPkxldmVsPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1hc2sjZ2V0VHlwZSA8ZW0+VHlwZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5NYXNrI2dldExlbmd0aCA8ZW0+TGVuZ3RoPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1hc2sjZ2V0U2VwYXJhdG9yIDxlbT5TZXBhcmF0b3I8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRNYXNrKCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdNYXNrXy5fdHlwZScga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIE1hc2sgZXh0ZW5kcyBFT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5MZXZlbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGxldmVsIG9mIHRoZSBtYXNrLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5MZXZlbDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0TGV2ZWwoQmlnSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRNYXNrX0xldmVsKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5JbnRlZ2VyIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdMZXZlbCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0ludGVnZXIgZ2V0TGV2ZWwoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTWFzayNnZXRMZXZlbCA8ZW0+TGV2ZWw8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkxldmVsPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRMZXZlbCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TGV2ZWwoQmlnSW50ZWdlciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5UeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgdHlwZSBvZiBtYXNrLiBWYWx1ZXMgYXJlOiAwPU51bWJlcnMsIDE9VXBwZXIgQ2FzZSBMZXR0ZXJzLCAyPUxvd2VyIENhc2UgTGV0dGVycywgMz1DaGFyYWN0ZXJzCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFR5cGUoQmlnSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRNYXNrX1R5cGUoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UeXBlVHlwZTUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1R5cGUnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdJbnRlZ2VyIGdldFR5cGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTWFzayNnZXRUeXBlIDxlbT5UeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5UeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRUeXBlKEJpZ0ludGVnZXIgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TGVuZ3RoPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgbWF4aW11bSBsZW5ndGggaW4gY2hhcmFjdGVycyBvZiB0aGUgb3V0bGluZSBjb2RlIHZhbHVlcy4gIElmIGxlbmd0aCBpcyBhbnksIHRoZSB2YWx1ZSBpcyB6ZXJvLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5MZW5ndGg8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldExlbmd0aChCaWdJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldE1hc2tfTGVuZ3RoKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5JbnRlZ2VyIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdMZW5ndGgnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdJbnRlZ2VyIGdldExlbmd0aCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5NYXNrI2dldExlbmd0aCA8ZW0+TGVuZ3RoPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5MZW5ndGg8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldExlbmd0aCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TGVuZ3RoKEJpZ0ludGVnZXIgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U2VwYXJhdG9yPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgc2VwYXJhdG9yIHZhbHVlIG9mIHRoZSBjb2RlIHZhbHVlcy4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U2VwYXJhdG9yPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRTZXBhcmF0b3IoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldE1hc2tfU2VwYXJhdG9yKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1NlcGFyYXRvcicgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRTZXBhcmF0b3IoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTWFzayNnZXRTZXBhcmF0b3IgPGVtPlNlcGFyYXRvcjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U2VwYXJhdG9yPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRTZXBhcmF0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFNlcGFyYXRvcihTdHJpbmcgdmFsdWUpOwotCi19IC8vIE1hc2sKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvTWFza3MuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvTWFza3MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGQwNjRhZi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L01hc2tzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IE1hc2tzLmphdmEsdiAxLjEgMjAwOC8wMS8xNSAwODo1Mjo0NSBqdGhhbSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk1hc2tzPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTWFza3MjZ2V0TWFzayA8ZW0+TWFzazwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldE1hc2tzKCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdNYXNrc18uX3R5cGUnIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBNYXNrcyBleHRlbmRzIEVPYmplY3QgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1hc2s8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1hc2t9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGZvdXIgZWxlbWVudHMgb2YgdGhlIG1hc2sgY29uc3RpdHV0ZSB0aGUgZm9ybWF0IGluIHdoaWNoIHRoZSBvdXRsaW5lIGNvZGUgbXVzdCBhcHBlYXIuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1hc2s8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0TWFza3NfTWFzaygpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTWFzayIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nTWFzaycgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldE1hc2soKTsKLQotfSAvLyBNYXNrcwpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9Nc3Byb2plY3RGYWN0b3J5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L01zcHJvamVjdEZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjc1ZTdmYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L01zcHJvamVjdEZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwNiArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IE1zcHJvamVjdEZhY3RvcnkuamF2YSx2IDEuMSAyMDA4LzAxLzE1IDA4OjUyOjQ1IGp0aGFtIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRmFjdG9yeTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogVGhlIDxiPkZhY3Rvcnk8L2I+IGZvciB0aGUgbW9kZWwuCi0gKiBJdCBwcm92aWRlcyBhIGNyZWF0ZSBtZXRob2QgZm9yIGVhY2ggbm9uLWFic3RyYWN0IGNsYXNzIG9mIHRoZSBtb2RlbC4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBNc3Byb2plY3RGYWN0b3J5IGV4dGVuZHMgRUZhY3RvcnkgewotCS8qKgotCSAqIFRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIGZhY3RvcnkuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTXNwcm9qZWN0RmFjdG9yeSBlSU5TVEFOQ0UgPSBuZXcgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdEZhY3RvcnlJbXBsKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkFzc2lnbm1lbnQ8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkFzc2lnbm1lbnQ8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUFzc2lnbm1lbnQgY3JlYXRlQXNzaWdubWVudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Bc3NpZ25tZW50czwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+QXNzaWdubWVudHM8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUFzc2lnbm1lbnRzIGNyZWF0ZUFzc2lnbm1lbnRzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkF2YWlsYWJpbGl0eSBQZXJpb2Q8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkF2YWlsYWJpbGl0eSBQZXJpb2Q8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUF2YWlsYWJpbGl0eVBlcmlvZCBjcmVhdGVBdmFpbGFiaWxpdHlQZXJpb2QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+QXZhaWxhYmlsaXR5IFBlcmlvZHM8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkF2YWlsYWJpbGl0eSBQZXJpb2RzPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlBdmFpbGFiaWxpdHlQZXJpb2RzIGNyZWF0ZUF2YWlsYWJpbGl0eVBlcmlvZHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+QmFzZWxpbmU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkJhc2VsaW5lPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCYXNlbGluZSBjcmVhdGVCYXNlbGluZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5CYXNlbGluZTI8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkJhc2VsaW5lMjwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmFzZWxpbmUyIGNyZWF0ZUJhc2VsaW5lMigpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5CYXNlbGluZTM8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkJhc2VsaW5lMzwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmFzZWxpbmUzIGNyZWF0ZUJhc2VsaW5lMygpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5DYWxlbmRhcjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+Q2FsZW5kYXI8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUNhbGVuZGFyIGNyZWF0ZUNhbGVuZGFyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkNhbGVuZGFyczwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+Q2FsZW5kYXJzPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlDYWxlbmRhcnMgY3JlYXRlQ2FsZW5kYXJzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkRvY3VtZW50IFJvb3Q8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkRvY3VtZW50IFJvb3Q8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCURvY3VtZW50Um9vdCBjcmVhdGVEb2N1bWVudFJvb3QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RXh0ZW5kZWQgQXR0cmlidXRlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5FeHRlbmRlZCBBdHRyaWJ1dGU8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUV4dGVuZGVkQXR0cmlidXRlIGNyZWF0ZUV4dGVuZGVkQXR0cmlidXRlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkV4dGVuZGVkIEF0dHJpYnV0ZTI8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkV4dGVuZGVkIEF0dHJpYnV0ZTI8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUV4dGVuZGVkQXR0cmlidXRlMiBjcmVhdGVFeHRlbmRlZEF0dHJpYnV0ZTIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RXh0ZW5kZWQgQXR0cmlidXRlMzwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RXh0ZW5kZWQgQXR0cmlidXRlMzwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRXh0ZW5kZWRBdHRyaWJ1dGUzIGNyZWF0ZUV4dGVuZGVkQXR0cmlidXRlMygpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5FeHRlbmRlZCBBdHRyaWJ1dGU0PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5FeHRlbmRlZCBBdHRyaWJ1dGU0PC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFeHRlbmRlZEF0dHJpYnV0ZTQgY3JlYXRlRXh0ZW5kZWRBdHRyaWJ1dGU0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkV4dGVuZGVkIEF0dHJpYnV0ZXM8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkV4dGVuZGVkIEF0dHJpYnV0ZXM8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUV4dGVuZGVkQXR0cmlidXRlcyBjcmVhdGVFeHRlbmRlZEF0dHJpYnV0ZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+TWFzazwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+TWFzazwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTWFzayBjcmVhdGVNYXNrKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPk1hc2tzPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5NYXNrczwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTWFza3MgY3JlYXRlTWFza3MoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+T3V0bGluZSBDb2RlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5PdXRsaW5lIENvZGU8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU91dGxpbmVDb2RlIGNyZWF0ZU91dGxpbmVDb2RlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPk91dGxpbmUgQ29kZTI8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPk91dGxpbmUgQ29kZTI8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU91dGxpbmVDb2RlMiBjcmVhdGVPdXRsaW5lQ29kZTIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+T3V0bGluZSBDb2RlMzwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+T3V0bGluZSBDb2RlMzwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JT3V0bGluZUNvZGUzIGNyZWF0ZU91dGxpbmVDb2RlMygpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5PdXRsaW5lIENvZGVzPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5PdXRsaW5lIENvZGVzPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlPdXRsaW5lQ29kZXMgY3JlYXRlT3V0bGluZUNvZGVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlByZWRlY2Vzc29yIExpbms8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlByZWRlY2Vzc29yIExpbms8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVByZWRlY2Vzc29yTGluayBjcmVhdGVQcmVkZWNlc3NvckxpbmsoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UHJvamVjdDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UHJvamVjdDwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUHJvamVjdCBjcmVhdGVQcm9qZWN0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlJhdGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlJhdGU8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVJhdGUgY3JlYXRlUmF0ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5SYXRlczwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UmF0ZXM8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVJhdGVzIGNyZWF0ZVJhdGVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlJlc291cmNlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5SZXNvdXJjZTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUmVzb3VyY2UgY3JlYXRlUmVzb3VyY2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UmVzb3VyY2VzPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5SZXNvdXJjZXM8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVJlc291cmNlcyBjcmVhdGVSZXNvdXJjZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+VGFzazwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+VGFzazwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JVGFzayBjcmVhdGVUYXNrKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlRhc2tzPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5UYXNrczwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JVGFza3MgY3JlYXRlVGFza3MoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+VGltZSBQZXJpb2Q8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlRpbWUgUGVyaW9kPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlUaW1lUGVyaW9kIGNyZWF0ZVRpbWVQZXJpb2QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+VGltZXBoYXNlZCBEYXRhIFR5cGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlRpbWVwaGFzZWQgRGF0YSBUeXBlPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlUaW1lcGhhc2VkRGF0YVR5cGUgY3JlYXRlVGltZXBoYXNlZERhdGFUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlZhbHVlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5WYWx1ZTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JVmFsdWUgY3JlYXRlVmFsdWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+VmFsdWUyPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5WYWx1ZTI8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVZhbHVlMiBjcmVhdGVWYWx1ZTIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+VmFsdWUgTGlzdDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+VmFsdWUgTGlzdDwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JVmFsdWVMaXN0IGNyZWF0ZVZhbHVlTGlzdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5WYWx1ZXM8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlZhbHVlczwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JVmFsdWVzIGNyZWF0ZVZhbHVlcygpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5XQlMgTWFzazwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+V0JTIE1hc2s8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVdCU01hc2sgY3JlYXRlV0JTTWFzaygpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5XQlMgTWFza3M8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPldCUyBNYXNrczwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JV0JTTWFza3MgY3JlYXRlV0JTTWFza3MoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+V2VlayBEYXk8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPldlZWsgRGF5PC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlXZWVrRGF5IGNyZWF0ZVdlZWtEYXkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+V2VlayBEYXlzPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5XZWVrIERheXM8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVdlZWtEYXlzIGNyZWF0ZVdlZWtEYXlzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPldvcmtpbmcgVGltZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+V29ya2luZyBUaW1lPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlXb3JraW5nVGltZSBjcmVhdGVXb3JraW5nVGltZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Xb3JraW5nIFRpbWVzPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Xb3JraW5nIFRpbWVzPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlXb3JraW5nVGltZXMgY3JlYXRlV29ya2luZ1RpbWVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwYWNrYWdlIHN1cHBvcnRlZCBieSB0aGlzIGZhY3RvcnkuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBwYWNrYWdlIHN1cHBvcnRlZCBieSB0aGlzIGZhY3RvcnkuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU1zcHJvamVjdFBhY2thZ2UgZ2V0TXNwcm9qZWN0UGFja2FnZSgpOwotCi19IC8vTXNwcm9qZWN0RmFjdG9yeQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9Nc3Byb2plY3RQYWNrYWdlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L01zcHJvamVjdFBhY2thZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTM4N2M0Yi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L01zcHJvamVjdFBhY2thZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNTQ2ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogTXNwcm9qZWN0UGFja2FnZS5qYXZhLHYgMS4xIDIwMDgvMDEvMTUgMDg6NTI6NDYganRoYW0gRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRURhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogVGhlIDxiPlBhY2thZ2U8L2I+IGZvciB0aGUgbW9kZWwuCi0gKiBJdCBjb250YWlucyBhY2Nlc3NvcnMgZm9yIHRoZSBtZXRhIG9iamVjdHMgdG8gcmVwcmVzZW50Ci0gKiA8dWw+Ci0gKiAgIDxsaT5lYWNoIGNsYXNzLDwvbGk+Ci0gKiAgIDxsaT5lYWNoIGZlYXR1cmUgb2YgZWFjaCBjbGFzcyw8L2xpPgotICogICA8bGk+ZWFjaCBlbnVtLDwvbGk+Ci0gKiAgIDxsaT5hbmQgZWFjaCBkYXRhIHR5cGU8L2xpPgotICogPC91bD4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBUaGUgZnVsbCBwcm9qZWN0IHNjaGVtYSBkZWZpbml0aW9uIGZyb20gdGhlIHByb2plY3QgbGV2ZWwgZG93biwgCi0gKiAJCXN0YXJ0aW5nIHdpdGggZGF0YSB0eXBlIGRlZmluaXRpb25zLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdEZhY3RvcnkKLSAqIEBtb2RlbCBraW5kPSJwYWNrYWdlIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIE1zcHJvamVjdFBhY2thZ2UgZXh0ZW5kcyBFUGFja2FnZSB7Ci0JLyoqCi0JICogVGhlIHBhY2thZ2UgbmFtZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZU5BTUUgPSAibXNwcm9qZWN0IjsKLQotCS8qKgotCSAqIFRoZSBwYWNrYWdlIG5hbWVzcGFjZSBVUkkuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGVOU19VUkkgPSAiaHR0cDovL2VwZi5lY2xpcHNlLm9yZy9tc3Byb2plY3QiOwotCi0JLyoqCi0JICogVGhlIHBhY2thZ2UgbmFtZXNwYWNlIG5hbWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGVOU19QUkVGSVggPSAibXNwcm9qZWN0IjsKLQotCS8qKgotCSAqIFRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIHBhY2thZ2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTXNwcm9qZWN0UGFja2FnZSBlSU5TVEFOQ0UgPSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwuaW5pdCgpOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuQXNzaWdubWVudEltcGwgPGVtPkFzc2lnbm1lbnQ8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuQXNzaWdubWVudEltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Nc3Byb2plY3RQYWNrYWdlSW1wbCNnZXRBc3NpZ25tZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IEFTU0lHTk1FTlQgPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVJRDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFTU0lHTk1FTlRfX1VJRCA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGFzayBVSUQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBU1NJR05NRU5UX19UQVNLX1VJRCA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVzb3VyY2UgVUlEPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVNTSUdOTUVOVF9fUkVTT1VSQ0VfVUlEID0gMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QZXJjZW50IFdvcmsgQ29tcGxldGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBU1NJR05NRU5UX19QRVJDRU5UX1dPUktfQ09NUExFVEUgPSAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFjdHVhbCBDb3N0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVNTSUdOTUVOVF9fQUNUVUFMX0NPU1QgPSA0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFjdHVhbCBGaW5pc2g8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBU1NJR05NRU5UX19BQ1RVQUxfRklOSVNIID0gNTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BY3R1YWwgT3ZlcnRpbWUgQ29zdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFTU0lHTk1FTlRfX0FDVFVBTF9PVkVSVElNRV9DT1NUID0gNjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BY3R1YWwgT3ZlcnRpbWUgV29yazwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFTU0lHTk1FTlRfX0FDVFVBTF9PVkVSVElNRV9XT1JLID0gNzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BY3R1YWwgU3RhcnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBU1NJR05NRU5UX19BQ1RVQUxfU1RBUlQgPSA4OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFjdHVhbCBXb3JrPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVNTSUdOTUVOVF9fQUNUVUFMX1dPUksgPSA5OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFDV1A8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBU1NJR05NRU5UX19BQ1dQID0gMTA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29uZmlybWVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVNTSUdOTUVOVF9fQ09ORklSTUVEID0gMTE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29zdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFTU0lHTk1FTlRfX0NPU1QgPSAxMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db3N0IFJhdGUgVGFibGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBU1NJR05NRU5UX19DT1NUX1JBVEVfVEFCTEUgPSAxMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db3N0IFZhcmlhbmNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVNTSUdOTUVOVF9fQ09TVF9WQVJJQU5DRSA9IDE0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNWPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVNTSUdOTUVOVF9fQ1YgPSAxNTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZWxheTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFTU0lHTk1FTlRfX0RFTEFZID0gMTY7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RmluaXNoPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVNTSUdOTUVOVF9fRklOSVNIID0gMTc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RmluaXNoIFZhcmlhbmNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVNTSUdOTUVOVF9fRklOSVNIX1ZBUklBTkNFID0gMTg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SHlwZXJsaW5rPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVNTSUdOTUVOVF9fSFlQRVJMSU5LID0gMTk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SHlwZXJsaW5rIEFkZHJlc3M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBU1NJR05NRU5UX19IWVBFUkxJTktfQUREUkVTUyA9IDIwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkh5cGVybGluayBTdWIgQWRkcmVzczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFTU0lHTk1FTlRfX0hZUEVSTElOS19TVUJfQUREUkVTUyA9IDIxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldvcmsgVmFyaWFuY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBU1NJR05NRU5UX19XT1JLX1ZBUklBTkNFID0gMjI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SGFzIEZpeGVkIFJhdGUgVW5pdHM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBU1NJR05NRU5UX19IQVNfRklYRURfUkFURV9VTklUUyA9IDIzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZpeGVkIE1hdGVyaWFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVNTSUdOTUVOVF9fRklYRURfTUFURVJJQUwgPSAyNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5MZXZlbGluZyBEZWxheTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFTU0lHTk1FTlRfX0xFVkVMSU5HX0RFTEFZID0gMjU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TGV2ZWxpbmcgRGVsYXkgRm9ybWF0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVNTSUdOTUVOVF9fTEVWRUxJTkdfREVMQVlfRk9STUFUID0gMjY7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TGlua2VkIEZpZWxkczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFTU0lHTk1FTlRfX0xJTktFRF9GSUVMRFMgPSAyNzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NaWxlc3RvbmU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBU1NJR05NRU5UX19NSUxFU1RPTkUgPSAyODsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob3RlczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFTU0lHTk1FTlRfX05PVEVTID0gMjk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3ZlcmFsbG9jYXRlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFTU0lHTk1FTlRfX09WRVJBTExPQ0FURUQgPSAzMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PdmVydGltZSBDb3N0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVNTSUdOTUVOVF9fT1ZFUlRJTUVfQ09TVCA9IDMxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk92ZXJ0aW1lIFdvcms8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBU1NJR05NRU5UX19PVkVSVElNRV9XT1JLID0gMzI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVndWxhciBXb3JrPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVNTSUdOTUVOVF9fUkVHVUxBUl9XT1JLID0gMzM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVtYWluaW5nIENvc3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBU1NJR05NRU5UX19SRU1BSU5JTkdfQ09TVCA9IDM0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlbWFpbmluZyBPdmVydGltZSBDb3N0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVNTSUdOTUVOVF9fUkVNQUlOSU5HX09WRVJUSU1FX0NPU1QgPSAzNTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZW1haW5pbmcgT3ZlcnRpbWUgV29yazwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFTU0lHTk1FTlRfX1JFTUFJTklOR19PVkVSVElNRV9XT1JLID0gMzY7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVtYWluaW5nIFdvcms8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBU1NJR05NRU5UX19SRU1BSU5JTkdfV09SSyA9IDM3OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlc3BvbnNlIFBlbmRpbmc8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBU1NJR05NRU5UX19SRVNQT05TRV9QRU5ESU5HID0gMzg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3RhcnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBU1NJR05NRU5UX19TVEFSVCA9IDM5OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN0b3A8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBU1NJR05NRU5UX19TVE9QID0gNDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVzdW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVNTSUdOTUVOVF9fUkVTVU1FID0gNDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3RhcnQgVmFyaWFuY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBU1NJR05NRU5UX19TVEFSVF9WQVJJQU5DRSA9IDQyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVuaXRzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVNTSUdOTUVOVF9fVU5JVFMgPSA0MzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5VcGRhdGUgTmVlZGVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVNTSUdOTUVOVF9fVVBEQVRFX05FRURFRCA9IDQ0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZBQzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFTU0lHTk1FTlRfX1ZBQyA9IDQ1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldvcms8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBU1NJR05NRU5UX19XT1JLID0gNDY7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+V29yayBDb250b3VyPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVNTSUdOTUVOVF9fV09SS19DT05UT1VSID0gNDc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QkNXUzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFTU0lHTk1FTlRfX0JDV1MgPSA0ODsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CQ1dQPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVNTSUdOTUVOVF9fQkNXUCA9IDQ5OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJvb2tpbmcgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFTU0lHTk1FTlRfX0JPT0tJTkdfVFlQRSA9IDUwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFjdHVhbCBXb3JrIFByb3RlY3RlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFTU0lHTk1FTlRfX0FDVFVBTF9XT1JLX1BST1RFQ1RFRCA9IDUxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFjdHVhbCBPdmVydGltZSBXb3JrIFByb3RlY3RlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFTU0lHTk1FTlRfX0FDVFVBTF9PVkVSVElNRV9XT1JLX1BST1RFQ1RFRCA9IDUyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNyZWF0aW9uIERhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBU1NJR05NRU5UX19DUkVBVElPTl9EQVRFID0gNTM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXh0ZW5kZWQgQXR0cmlidXRlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBU1NJR05NRU5UX19FWFRFTkRFRF9BVFRSSUJVVEUgPSA1NDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CYXNlbGluZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVNTSUdOTUVOVF9fQkFTRUxJTkUgPSA1NTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UaW1lcGhhc2VkIERhdGE8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFTU0lHTk1FTlRfX1RJTUVQSEFTRURfREFUQSA9IDU2OwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5Bc3NpZ25tZW50PC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFTU0lHTk1FTlRfRkVBVFVSRV9DT1VOVCA9IDU3OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuQXNzaWdubWVudHNJbXBsIDxlbT5Bc3NpZ25tZW50czwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Bc3NpZ25tZW50c0ltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Nc3Byb2plY3RQYWNrYWdlSW1wbCNnZXRBc3NpZ25tZW50cygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBBU1NJR05NRU5UUyA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXNzaWdubWVudDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVNTSUdOTUVOVFNfX0FTU0lHTk1FTlQgPSAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5Bc3NpZ25tZW50czwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBU1NJR05NRU5UU19GRUFUVVJFX0NPVU5UID0gMTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkF2YWlsYWJpbGl0eVBlcmlvZEltcGwgPGVtPkF2YWlsYWJpbGl0eSBQZXJpb2Q8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuQXZhaWxhYmlsaXR5UGVyaW9kSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldEF2YWlsYWJpbGl0eVBlcmlvZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBBVkFJTEFCSUxJVFlfUEVSSU9EID0gMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BdmFpbGFibGUgRnJvbTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFWQUlMQUJJTElUWV9QRVJJT0RfX0FWQUlMQUJMRV9GUk9NID0gMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BdmFpbGFibGUgVG88L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBVkFJTEFCSUxJVFlfUEVSSU9EX19BVkFJTEFCTEVfVE8gPSAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkF2YWlsYWJsZSBVbml0czwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFWQUlMQUJJTElUWV9QRVJJT0RfX0FWQUlMQUJMRV9VTklUUyA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPkF2YWlsYWJpbGl0eSBQZXJpb2Q8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVZBSUxBQklMSVRZX1BFUklPRF9GRUFUVVJFX0NPVU5UID0gMzsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkF2YWlsYWJpbGl0eVBlcmlvZHNJbXBsIDxlbT5BdmFpbGFiaWxpdHkgUGVyaW9kczwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5BdmFpbGFiaWxpdHlQZXJpb2RzSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldEF2YWlsYWJpbGl0eVBlcmlvZHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgQVZBSUxBQklMSVRZX1BFUklPRFMgPSAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkF2YWlsYWJpbGl0eSBQZXJpb2Q8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFWQUlMQUJJTElUWV9QRVJJT0RTX19BVkFJTEFCSUxJVFlfUEVSSU9EID0gMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+QXZhaWxhYmlsaXR5IFBlcmlvZHM8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVZBSUxBQklMSVRZX1BFUklPRFNfRkVBVFVSRV9DT1VOVCA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5CYXNlbGluZUltcGwgPGVtPkJhc2VsaW5lPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkJhc2VsaW5lSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldEJhc2VsaW5lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IEJBU0VMSU5FID0gNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UaW1lcGhhc2VkIERhdGE8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJBU0VMSU5FX19USU1FUEhBU0VEX0RBVEEgPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk51bWJlcjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJBU0VMSU5FX19OVU1CRVIgPSAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkludGVyaW08L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCQVNFTElORV9fSU5URVJJTSA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3RhcnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCQVNFTElORV9fU1RBUlQgPSAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZpbmlzaDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJBU0VMSU5FX19GSU5JU0ggPSA0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkR1cmF0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQkFTRUxJTkVfX0RVUkFUSU9OID0gNTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EdXJhdGlvbiBGb3JtYXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCQVNFTElORV9fRFVSQVRJT05fRk9STUFUID0gNjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Fc3RpbWF0ZWQgRHVyYXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCQVNFTElORV9fRVNUSU1BVEVEX0RVUkFUSU9OID0gNzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Xb3JrPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQkFTRUxJTkVfX1dPUksgPSA4OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvc3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCQVNFTElORV9fQ09TVCA9IDk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QkNXUzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJBU0VMSU5FX19CQ1dTID0gMTA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QkNXUDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJBU0VMSU5FX19CQ1dQID0gMTE7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPkJhc2VsaW5lPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJBU0VMSU5FX0ZFQVRVUkVfQ09VTlQgPSAxMjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkJhc2VsaW5lMkltcGwgPGVtPkJhc2VsaW5lMjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5CYXNlbGluZTJJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0QmFzZWxpbmUyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IEJBU0VMSU5FMiA9IDU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TnVtYmVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQkFTRUxJTkUyX19OVU1CRVIgPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldvcms8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCQVNFTElORTJfX1dPUksgPSAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvc3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCQVNFTElORTJfX0NPU1QgPSAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJDV1M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCQVNFTElORTJfX0JDV1MgPSAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJDV1A8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCQVNFTElORTJfX0JDV1AgPSA0OwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5CYXNlbGluZTI8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQkFTRUxJTkUyX0ZFQVRVUkVfQ09VTlQgPSA1OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuQmFzZWxpbmUzSW1wbCA8ZW0+QmFzZWxpbmUzPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkJhc2VsaW5lM0ltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Nc3Byb2plY3RQYWNrYWdlSW1wbCNnZXRCYXNlbGluZTMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgQkFTRUxJTkUzID0gNjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UaW1lcGhhc2VkIERhdGE8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJBU0VMSU5FM19fVElNRVBIQVNFRF9EQVRBID0gMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OdW1iZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCQVNFTElORTNfX05VTUJFUiA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3RhcnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCQVNFTElORTNfX1NUQVJUID0gMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GaW5pc2g8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCQVNFTElORTNfX0ZJTklTSCA9IDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+V29yazwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJBU0VMSU5FM19fV09SSyA9IDQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29zdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJBU0VMSU5FM19fQ09TVCA9IDU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QkNXUzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJBU0VMSU5FM19fQkNXUyA9IDY7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QkNXUDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJBU0VMSU5FM19fQkNXUCA9IDc7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPkJhc2VsaW5lMzwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCQVNFTElORTNfRkVBVFVSRV9DT1VOVCA9IDg7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5DYWxlbmRhckltcGwgPGVtPkNhbGVuZGFyPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkNhbGVuZGFySW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldENhbGVuZGFyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IENBTEVOREFSID0gNzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5VSUQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDQUxFTkRBUl9fVUlEID0gMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0FMRU5EQVJfX05BTUUgPSAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIEJhc2UgQ2FsZW5kYXI8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDQUxFTkRBUl9fSVNfQkFTRV9DQUxFTkRBUiA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QmFzZSBDYWxlbmRhciBVSUQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDQUxFTkRBUl9fQkFTRV9DQUxFTkRBUl9VSUQgPSAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldlZWsgRGF5czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENBTEVOREFSX19XRUVLX0RBWVMgPSA0OwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5DYWxlbmRhcjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDQUxFTkRBUl9GRUFUVVJFX0NPVU5UID0gNTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkNhbGVuZGFyc0ltcGwgPGVtPkNhbGVuZGFyczwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5DYWxlbmRhcnNJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0Q2FsZW5kYXJzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IENBTEVOREFSUyA9IDg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2FsZW5kYXI8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENBTEVOREFSU19fQ0FMRU5EQVIgPSAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5DYWxlbmRhcnM8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0FMRU5EQVJTX0ZFQVRVUkVfQ09VTlQgPSAxOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuRG9jdW1lbnRSb290SW1wbCA8ZW0+RG9jdW1lbnQgUm9vdDwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Eb2N1bWVudFJvb3RJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0RG9jdW1lbnRSb290KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IERPQ1VNRU5UX1JPT1QgPSA5OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1peGVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBET0NVTUVOVF9ST09UX19NSVhFRCA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+WE1MTlMgUHJlZml4IE1hcDwvYj48L2VtPicgbWFwLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERPQ1VNRU5UX1JPT1RfX1hNTE5TX1BSRUZJWF9NQVAgPSAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlhTSSBTY2hlbWEgTG9jYXRpb248L2I+PC9lbT4nIG1hcC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBET0NVTUVOVF9ST09UX19YU0lfU0NIRU1BX0xPQ0FUSU9OID0gMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qcm9qZWN0PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRE9DVU1FTlRfUk9PVF9fUFJPSkVDVCA9IDM7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPkRvY3VtZW50IFJvb3Q8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRE9DVU1FTlRfUk9PVF9GRUFUVVJFX0NPVU5UID0gNDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkV4dGVuZGVkQXR0cmlidXRlSW1wbCA8ZW0+RXh0ZW5kZWQgQXR0cmlidXRlPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkV4dGVuZGVkQXR0cmlidXRlSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldEV4dGVuZGVkQXR0cmlidXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IEVYVEVOREVEX0FUVFJJQlVURSA9IDEwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZpZWxkIElEPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVhURU5ERURfQVRUUklCVVRFX19GSUVMRF9JRCA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RmllbGQgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVYVEVOREVEX0FUVFJJQlVURV9fRklFTERfTkFNRSA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWxpYXM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFWFRFTkRFRF9BVFRSSUJVVEVfX0FMSUFTID0gMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QaG9uZXRpYyBBbGlhczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVYVEVOREVEX0FUVFJJQlVURV9fUEhPTkVUSUNfQUxJQVMgPSAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJvbGx1cCBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVhURU5ERURfQVRUUklCVVRFX19ST0xMVVBfVFlQRSA9IDQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2FsY3VsYXRpb24gVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVYVEVOREVEX0FUVFJJQlVURV9fQ0FMQ1VMQVRJT05fVFlQRSA9IDU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Rm9ybXVsYTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVYVEVOREVEX0FUVFJJQlVURV9fRk9STVVMQSA9IDY7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVzdHJpY3QgVmFsdWVzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVhURU5ERURfQVRUUklCVVRFX19SRVNUUklDVF9WQUxVRVMgPSA3OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhbHVlbGlzdCBTb3J0IE9yZGVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVhURU5ERURfQVRUUklCVVRFX19WQUxVRUxJU1RfU09SVF9PUkRFUiA9IDg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXBwZW5kIE5ldyBWYWx1ZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFWFRFTkRFRF9BVFRSSUJVVEVfX0FQUEVORF9ORVdfVkFMVUVTID0gOTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZWZhdWx0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVhURU5ERURfQVRUUklCVVRFX19ERUZBVUxUID0gMTA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFsdWUgTGlzdDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVYVEVOREVEX0FUVFJJQlVURV9fVkFMVUVfTElTVCA9IDExOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5FeHRlbmRlZCBBdHRyaWJ1dGU8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVhURU5ERURfQVRUUklCVVRFX0ZFQVRVUkVfQ09VTlQgPSAxMjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkV4dGVuZGVkQXR0cmlidXRlMkltcGwgPGVtPkV4dGVuZGVkIEF0dHJpYnV0ZTI8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuRXh0ZW5kZWRBdHRyaWJ1dGUySW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldEV4dGVuZGVkQXR0cmlidXRlMigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBFWFRFTkRFRF9BVFRSSUJVVEUyID0gMTE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VUlEPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVhURU5ERURfQVRUUklCVVRFMl9fVUlEID0gMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GaWVsZCBJRDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVYVEVOREVEX0FUVFJJQlVURTJfX0ZJRUxEX0lEID0gMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVYVEVOREVEX0FUVFJJQlVURTJfX1ZBTFVFID0gMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYWx1ZSBJRDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVYVEVOREVEX0FUVFJJQlVURTJfX1ZBTFVFX0lEID0gMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EdXJhdGlvbiBGb3JtYXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFWFRFTkRFRF9BVFRSSUJVVEUyX19EVVJBVElPTl9GT1JNQVQgPSA0OwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5FeHRlbmRlZCBBdHRyaWJ1dGUyPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVYVEVOREVEX0FUVFJJQlVURTJfRkVBVFVSRV9DT1VOVCA9IDU7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5FeHRlbmRlZEF0dHJpYnV0ZTNJbXBsIDxlbT5FeHRlbmRlZCBBdHRyaWJ1dGUzPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkV4dGVuZGVkQXR0cmlidXRlM0ltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Nc3Byb2plY3RQYWNrYWdlSW1wbCNnZXRFeHRlbmRlZEF0dHJpYnV0ZTMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgRVhURU5ERURfQVRUUklCVVRFMyA9IDEyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVJRDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVYVEVOREVEX0FUVFJJQlVURTNfX1VJRCA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RmllbGQgSUQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFWFRFTkRFRF9BVFRSSUJVVEUzX19GSUVMRF9JRCA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFWFRFTkRFRF9BVFRSSUJVVEUzX19WQUxVRSA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFsdWUgSUQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFWFRFTkRFRF9BVFRSSUJVVEUzX19WQUxVRV9JRCA9IDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RHVyYXRpb24gRm9ybWF0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVhURU5ERURfQVRUUklCVVRFM19fRFVSQVRJT05fRk9STUFUID0gNDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+RXh0ZW5kZWQgQXR0cmlidXRlMzwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFWFRFTkRFRF9BVFRSSUJVVEUzX0ZFQVRVUkVfQ09VTlQgPSA1OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuRXh0ZW5kZWRBdHRyaWJ1dGU0SW1wbCA8ZW0+RXh0ZW5kZWQgQXR0cmlidXRlNDwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5FeHRlbmRlZEF0dHJpYnV0ZTRJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0RXh0ZW5kZWRBdHRyaWJ1dGU0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IEVYVEVOREVEX0FUVFJJQlVURTQgPSAxMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5VSUQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFWFRFTkRFRF9BVFRSSUJVVEU0X19VSUQgPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZpZWxkIElEPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVhURU5ERURfQVRUUklCVVRFNF9fRklFTERfSUQgPSAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVhURU5ERURfQVRUUklCVVRFNF9fVkFMVUUgPSAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhbHVlIElEPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVhURU5ERURfQVRUUklCVVRFNF9fVkFMVUVfSUQgPSAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkR1cmF0aW9uIEZvcm1hdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVYVEVOREVEX0FUVFJJQlVURTRfX0RVUkFUSU9OX0ZPUk1BVCA9IDQ7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPkV4dGVuZGVkIEF0dHJpYnV0ZTQ8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVhURU5ERURfQVRUUklCVVRFNF9GRUFUVVJFX0NPVU5UID0gNTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkV4dGVuZGVkQXR0cmlidXRlc0ltcGwgPGVtPkV4dGVuZGVkIEF0dHJpYnV0ZXM8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuRXh0ZW5kZWRBdHRyaWJ1dGVzSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldEV4dGVuZGVkQXR0cmlidXRlcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBFWFRFTkRFRF9BVFRSSUJVVEVTID0gMTQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXh0ZW5kZWQgQXR0cmlidXRlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFWFRFTkRFRF9BVFRSSUJVVEVTX19FWFRFTkRFRF9BVFRSSUJVVEUgPSAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5FeHRlbmRlZCBBdHRyaWJ1dGVzPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVYVEVOREVEX0FUVFJJQlVURVNfRkVBVFVSRV9DT1VOVCA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5NYXNrSW1wbCA8ZW0+TWFzazwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5NYXNrSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldE1hc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgTUFTSyA9IDE1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxldmVsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUFTS19fTEVWRUwgPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNQVNLX19UWVBFID0gMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5MZW5ndGg8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNQVNLX19MRU5HVEggPSAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNlcGFyYXRvcjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1BU0tfX1NFUEFSQVRPUiA9IDM7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPk1hc2s8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUFTS19GRUFUVVJFX0NPVU5UID0gNDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1hc2tzSW1wbCA8ZW0+TWFza3M8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTWFza3NJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0TWFza3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgTUFTS1MgPSAxNjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYXNrPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNQVNLU19fTUFTSyA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPk1hc2tzPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1BU0tTX0ZFQVRVUkVfQ09VTlQgPSAxOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuT3V0bGluZUNvZGVJbXBsIDxlbT5PdXRsaW5lIENvZGU8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuT3V0bGluZUNvZGVJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0T3V0bGluZUNvZGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgT1VUTElORV9DT0RFID0gMTc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RmllbGQgSUQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBPVVRMSU5FX0NPREVfX0ZJRUxEX0lEID0gMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GaWVsZCBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgT1VUTElORV9DT0RFX19GSUVMRF9OQU1FID0gMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BbGlhczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE9VVExJTkVfQ09ERV9fQUxJQVMgPSAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBob25ldGljIEFsaWFzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgT1VUTElORV9DT0RFX19QSE9ORVRJQ19BTElBUyA9IDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFsdWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgT1VUTElORV9DT0RFX19WQUxVRVMgPSA0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVudGVycHJpc2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBPVVRMSU5FX0NPREVfX0VOVEVSUFJJU0UgPSA1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVudGVycHJpc2UgT3V0bGluZSBDb2RlIEFsaWFzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgT1VUTElORV9DT0RFX19FTlRFUlBSSVNFX09VVExJTkVfQ09ERV9BTElBUyA9IDY7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVzb3VyY2UgU3Vic3RpdHV0aW9uIEVuYWJsZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBPVVRMSU5FX0NPREVfX1JFU09VUkNFX1NVQlNUSVRVVElPTl9FTkFCTEVEID0gNzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5MZWFmIE9ubHk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBPVVRMSU5FX0NPREVfX0xFQUZfT05MWSA9IDg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWxsIExldmVscyBSZXF1aXJlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE9VVExJTkVfQ09ERV9fQUxMX0xFVkVMU19SRVFVSVJFRCA9IDk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T25seSBUYWJsZSBWYWx1ZXMgQWxsb3dlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE9VVExJTkVfQ09ERV9fT05MWV9UQUJMRV9WQUxVRVNfQUxMT1dFRCA9IDEwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1hc2tzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgT1VUTElORV9DT0RFX19NQVNLUyA9IDExOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5PdXRsaW5lIENvZGU8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgT1VUTElORV9DT0RFX0ZFQVRVUkVfQ09VTlQgPSAxMjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk91dGxpbmVDb2RlMkltcGwgPGVtPk91dGxpbmUgQ29kZTI8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuT3V0bGluZUNvZGUySW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldE91dGxpbmVDb2RlMigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBPVVRMSU5FX0NPREUyID0gMTg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VUlEPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgT1VUTElORV9DT0RFMl9fVUlEID0gMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GaWVsZCBJRDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE9VVExJTkVfQ09ERTJfX0ZJRUxEX0lEID0gMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYWx1ZSBJRDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE9VVExJTkVfQ09ERTJfX1ZBTFVFX0lEID0gMjsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+T3V0bGluZSBDb2RlMjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBPVVRMSU5FX0NPREUyX0ZFQVRVUkVfQ09VTlQgPSAzOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuT3V0bGluZUNvZGUzSW1wbCA8ZW0+T3V0bGluZSBDb2RlMzwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5PdXRsaW5lQ29kZTNJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0T3V0bGluZUNvZGUzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IE9VVExJTkVfQ09ERTMgPSAxOTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5VSUQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBPVVRMSU5FX0NPREUzX19VSUQgPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZpZWxkIElEPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgT1VUTElORV9DT0RFM19fRklFTERfSUQgPSAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhbHVlIElEPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgT1VUTElORV9DT0RFM19fVkFMVUVfSUQgPSAyOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5PdXRsaW5lIENvZGUzPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE9VVExJTkVfQ09ERTNfRkVBVFVSRV9DT1VOVCA9IDM7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5PdXRsaW5lQ29kZXNJbXBsIDxlbT5PdXRsaW5lIENvZGVzPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk91dGxpbmVDb2Rlc0ltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Nc3Byb2plY3RQYWNrYWdlSW1wbCNnZXRPdXRsaW5lQ29kZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgT1VUTElORV9DT0RFUyA9IDIwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk91dGxpbmUgQ29kZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgT1VUTElORV9DT0RFU19fT1VUTElORV9DT0RFID0gMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+T3V0bGluZSBDb2RlczwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBPVVRMSU5FX0NPREVTX0ZFQVRVUkVfQ09VTlQgPSAxOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUHJlZGVjZXNzb3JMaW5rSW1wbCA8ZW0+UHJlZGVjZXNzb3IgTGluazwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5QcmVkZWNlc3NvckxpbmtJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0UHJlZGVjZXNzb3JMaW5rKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFBSRURFQ0VTU09SX0xJTksgPSAyMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVkZWNlc3NvciBVSUQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUkVERUNFU1NPUl9MSU5LX19QUkVERUNFU1NPUl9VSUQgPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUkVERUNFU1NPUl9MSU5LX19UWVBFID0gMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Dcm9zcyBQcm9qZWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJFREVDRVNTT1JfTElOS19fQ1JPU1NfUFJPSkVDVCA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q3Jvc3MgUHJvamVjdCBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJFREVDRVNTT1JfTElOS19fQ1JPU1NfUFJPSkVDVF9OQU1FID0gMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5MaW5rIExhZzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBSRURFQ0VTU09SX0xJTktfX0xJTktfTEFHID0gNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5MYWcgRm9ybWF0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJFREVDRVNTT1JfTElOS19fTEFHX0ZPUk1BVCA9IDU7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPlByZWRlY2Vzc29yIExpbms8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJFREVDRVNTT1JfTElOS19GRUFUVVJFX0NPVU5UID0gNjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlByb2plY3RJbXBsIDxlbT5Qcm9qZWN0PC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlByb2plY3RJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0UHJvamVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBQUk9KRUNUID0gMjI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VUlEPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPSkVDVF9fVUlEID0gMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPSkVDVF9fTkFNRSA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGl0bGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9KRUNUX19USVRMRSA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3ViamVjdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0pFQ1RfX1NVQkpFQ1QgPSAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNhdGVnb3J5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPSkVDVF9fQ0FURUdPUlkgPSA0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbXBhbnk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9KRUNUX19DT01QQU5ZID0gNTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYW5hZ2VyPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPSkVDVF9fTUFOQUdFUiA9IDY7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXV0aG9yPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPSkVDVF9fQVVUSE9SID0gNzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DcmVhdGlvbiBEYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPSkVDVF9fQ1JFQVRJT05fREFURSA9IDg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmV2aXNpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9KRUNUX19SRVZJU0lPTiA9IDk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TGFzdCBTYXZlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0pFQ1RfX0xBU1RfU0FWRUQgPSAxMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TY2hlZHVsZSBGcm9tIFN0YXJ0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPSkVDVF9fU0NIRURVTEVfRlJPTV9TVEFSVCA9IDExOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN0YXJ0IERhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9KRUNUX19TVEFSVF9EQVRFID0gMTI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RmluaXNoIERhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9KRUNUX19GSU5JU0hfREFURSA9IDEzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZZIFN0YXJ0IERhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9KRUNUX19GWVNUQVJUX0RBVEUgPSAxNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Dcml0aWNhbCBTbGFjayBMaW1pdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0pFQ1RfX0NSSVRJQ0FMX1NMQUNLX0xJTUlUID0gMTU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q3VycmVuY3kgRGlnaXRzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPSkVDVF9fQ1VSUkVOQ1lfRElHSVRTID0gMTY7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q3VycmVuY3kgU3ltYm9sPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPSkVDVF9fQ1VSUkVOQ1lfU1lNQk9MID0gMTc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q3VycmVuY3kgU3ltYm9sIFBvc2l0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPSkVDVF9fQ1VSUkVOQ1lfU1lNQk9MX1BPU0lUSU9OID0gMTg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2FsZW5kYXIgVUlEPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPSkVDVF9fQ0FMRU5EQVJfVUlEID0gMTk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVmYXVsdCBTdGFydCBUaW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPSkVDVF9fREVGQVVMVF9TVEFSVF9USU1FID0gMjA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVmYXVsdCBGaW5pc2ggVGltZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0pFQ1RfX0RFRkFVTFRfRklOSVNIX1RJTUUgPSAyMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NaW51dGVzIFBlciBEYXk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9KRUNUX19NSU5VVEVTX1BFUl9EQVkgPSAyMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NaW51dGVzIFBlciBXZWVrPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPSkVDVF9fTUlOVVRFU19QRVJfV0VFSyA9IDIzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRheXMgUGVyIE1vbnRoPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPSkVDVF9fREFZU19QRVJfTU9OVEggPSAyNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZWZhdWx0IFRhc2sgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0pFQ1RfX0RFRkFVTFRfVEFTS19UWVBFID0gMjU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVmYXVsdCBGaXhlZCBDb3N0IEFjY3J1YWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9KRUNUX19ERUZBVUxUX0ZJWEVEX0NPU1RfQUNDUlVBTCA9IDI2OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlZmF1bHQgU3RhbmRhcmQgUmF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0pFQ1RfX0RFRkFVTFRfU1RBTkRBUkRfUkFURSA9IDI3OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlZmF1bHQgT3ZlcnRpbWUgUmF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0pFQ1RfX0RFRkFVTFRfT1ZFUlRJTUVfUkFURSA9IDI4OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkR1cmF0aW9uIEZvcm1hdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0pFQ1RfX0RVUkFUSU9OX0ZPUk1BVCA9IDI5OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldvcmsgRm9ybWF0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPSkVDVF9fV09SS19GT1JNQVQgPSAzMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FZGl0YWJsZSBBY3R1YWwgQ29zdHM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9KRUNUX19FRElUQUJMRV9BQ1RVQUxfQ09TVFMgPSAzMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ib25vciBDb25zdHJhaW50czwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0pFQ1RfX0hPTk9SX0NPTlNUUkFJTlRTID0gMzI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RWFybmVkIFZhbHVlIE1ldGhvZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0pFQ1RfX0VBUk5FRF9WQUxVRV9NRVRIT0QgPSAzMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbnNlcnRlZCBQcm9qZWN0cyBMaWtlIFN1bW1hcnk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9KRUNUX19JTlNFUlRFRF9QUk9KRUNUU19MSUtFX1NVTU1BUlkgPSAzNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NdWx0aXBsZSBDcml0aWNhbCBQYXRoczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0pFQ1RfX01VTFRJUExFX0NSSVRJQ0FMX1BBVEhTID0gMzU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmV3IFRhc2tzIEVmZm9ydCBEcml2ZW48L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9KRUNUX19ORVdfVEFTS1NfRUZGT1JUX0RSSVZFTiA9IDM2OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5ldyBUYXNrcyBFc3RpbWF0ZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9KRUNUX19ORVdfVEFTS1NfRVNUSU1BVEVEID0gMzc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3BsaXRzIEluIFByb2dyZXNzIFRhc2tzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPSkVDVF9fU1BMSVRTX0lOX1BST0dSRVNTX1RBU0tTID0gMzg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3ByZWFkIEFjdHVhbCBDb3N0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPSkVDVF9fU1BSRUFEX0FDVFVBTF9DT1NUID0gMzk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3ByZWFkIFBlcmNlbnQgQ29tcGxldGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9KRUNUX19TUFJFQURfUEVSQ0VOVF9DT01QTEVURSA9IDQwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRhc2sgVXBkYXRlcyBSZXNvdXJjZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0pFQ1RfX1RBU0tfVVBEQVRFU19SRVNPVVJDRSA9IDQxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZpc2NhbCBZZWFyIFN0YXJ0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPSkVDVF9fRklTQ0FMX1lFQVJfU1RBUlQgPSA0MjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5XZWVrIFN0YXJ0IERheTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0pFQ1RfX1dFRUtfU1RBUlRfREFZID0gNDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TW92ZSBDb21wbGV0ZWQgRW5kcyBCYWNrPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPSkVDVF9fTU9WRV9DT01QTEVURURfRU5EU19CQUNLID0gNDQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TW92ZSBSZW1haW5pbmcgU3RhcnRzIEJhY2s8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9KRUNUX19NT1ZFX1JFTUFJTklOR19TVEFSVFNfQkFDSyA9IDQ1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1vdmUgUmVtYWluaW5nIFN0YXJ0cyBGb3J3YXJkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPSkVDVF9fTU9WRV9SRU1BSU5JTkdfU1RBUlRTX0ZPUldBUkQgPSA0NjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Nb3ZlIENvbXBsZXRlZCBFbmRzIEZvcndhcmQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9KRUNUX19NT1ZFX0NPTVBMRVRFRF9FTkRTX0ZPUldBUkQgPSA0NzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CYXNlbGluZSBGb3IgRWFybmVkIFZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPSkVDVF9fQkFTRUxJTkVfRk9SX0VBUk5FRF9WQUxVRSA9IDQ4OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkF1dG8gQWRkIE5ldyBSZXNvdXJjZXMgQW5kIFRhc2tzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPSkVDVF9fQVVUT19BRERfTkVXX1JFU09VUkNFU19BTkRfVEFTS1MgPSA0OTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdGF0dXMgRGF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0pFQ1RfX1NUQVRVU19EQVRFID0gNTA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q3VycmVudCBEYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPSkVDVF9fQ1VSUkVOVF9EQVRFID0gNTE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWljcm9zb2Z0IFByb2plY3QgU2VydmVyIFVSTDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0pFQ1RfX01JQ1JPU09GVF9QUk9KRUNUX1NFUlZFUl9VUkwgPSA1MjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BdXRvbGluazwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0pFQ1RfX0FVVE9MSU5LID0gNTM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmV3IFRhc2sgU3RhcnQgRGF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0pFQ1RfX05FV19UQVNLX1NUQVJUX0RBVEUgPSA1NDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZWZhdWx0IFRhc2sgRVYgTWV0aG9kPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPSkVDVF9fREVGQVVMVF9UQVNLX0VWX01FVEhPRCA9IDU1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByb2plY3QgRXh0ZXJuYWxseSBFZGl0ZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9KRUNUX19QUk9KRUNUX0VYVEVSTkFMTFlfRURJVEVEID0gNTY7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXh0ZW5kZWQgQ3JlYXRpb24gRGF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0pFQ1RfX0VYVEVOREVEX0NSRUFUSU9OX0RBVEUgPSA1NzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BY3R1YWxzIEluIFN5bmM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9KRUNUX19BQ1RVQUxTX0lOX1NZTkMgPSA1ODsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZW1vdmUgRmlsZSBQcm9wZXJ0aWVzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPSkVDVF9fUkVNT1ZFX0ZJTEVfUFJPUEVSVElFUyA9IDU5OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFkbWluIFByb2plY3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9KRUNUX19BRE1JTl9QUk9KRUNUID0gNjA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3V0bGluZSBDb2RlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0pFQ1RfX09VVExJTkVfQ09ERVMgPSA2MTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5XQlMgTWFza3M8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9KRUNUX19XQlNfTUFTS1MgPSA2MjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeHRlbmRlZCBBdHRyaWJ1dGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPSkVDVF9fRVhURU5ERURfQVRUUklCVVRFUyA9IDYzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNhbGVuZGFyczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0pFQ1RfX0NBTEVOREFSUyA9IDY0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRhc2tzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPSkVDVF9fVEFTS1MgPSA2NTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXNvdXJjZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9KRUNUX19SRVNPVVJDRVMgPSA2NjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Bc3NpZ25tZW50czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0pFQ1RfX0FTU0lHTk1FTlRTID0gNjc7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPlByb2plY3Q8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPSkVDVF9GRUFUVVJFX0NPVU5UID0gNjg7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5SYXRlSW1wbCA8ZW0+UmF0ZTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5SYXRlSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldFJhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgUkFURSA9IDIzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJhdGVzIEZyb208L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSQVRFX19SQVRFU19GUk9NID0gMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SYXRlcyBUbzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJBVEVfX1JBVEVTX1RPID0gMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SYXRlIFRhYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkFURV9fUkFURV9UQUJMRSA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3RhbmRhcmQgUmF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJBVEVfX1NUQU5EQVJEX1JBVEUgPSAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN0YW5kYXJkIFJhdGUgRm9ybWF0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkFURV9fU1RBTkRBUkRfUkFURV9GT1JNQVQgPSA0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk92ZXJ0aW1lIFJhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSQVRFX19PVkVSVElNRV9SQVRFID0gNTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PdmVydGltZSBSYXRlIEZvcm1hdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJBVEVfX09WRVJUSU1FX1JBVEVfRk9STUFUID0gNjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db3N0IFBlciBVc2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSQVRFX19DT1NUX1BFUl9VU0UgPSA3OwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5SYXRlPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJBVEVfRkVBVFVSRV9DT1VOVCA9IDg7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5SYXRlc0ltcGwgPGVtPlJhdGVzPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlJhdGVzSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldFJhdGVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFJBVEVTID0gMjQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmF0ZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkFURVNfX1JBVEUgPSAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5SYXRlczwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSQVRFU19GRUFUVVJFX0NPVU5UID0gMTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlJlc291cmNlSW1wbCA8ZW0+UmVzb3VyY2U8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUmVzb3VyY2VJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0UmVzb3VyY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgUkVTT1VSQ0UgPSAyNTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5VSUQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVNPVVJDRV9fVUlEID0gMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JRDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFU09VUkNFX19JRCA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFU09VUkNFX19OQU1FID0gMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVTT1VSQ0VfX1RZUEUgPSAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIE51bGw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVNPVVJDRV9fSVNfTlVMTCA9IDQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW5pdGlhbHM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVNPVVJDRV9fSU5JVElBTFMgPSA1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBob25ldGljczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFU09VUkNFX19QSE9ORVRJQ1MgPSA2OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5UIEFjY291bnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVNPVVJDRV9fTlRBQ0NPVU5UID0gNzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYXRlcmlhbCBMYWJlbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFU09VUkNFX19NQVRFUklBTF9MQUJFTCA9IDg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29kZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFU09VUkNFX19DT0RFID0gOTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFU09VUkNFX19HUk9VUCA9IDEwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldvcmsgR3JvdXA8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVNPVVJDRV9fV09SS19HUk9VUCA9IDExOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVtYWlsIEFkZHJlc3M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVNPVVJDRV9fRU1BSUxfQUREUkVTUyA9IDEyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkh5cGVybGluazwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFU09VUkNFX19IWVBFUkxJTksgPSAxMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5IeXBlcmxpbmsgQWRkcmVzczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFU09VUkNFX19IWVBFUkxJTktfQUREUkVTUyA9IDE0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkh5cGVybGluayBTdWIgQWRkcmVzczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFU09VUkNFX19IWVBFUkxJTktfU1VCX0FERFJFU1MgPSAxNTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYXggVW5pdHM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVNPVVJDRV9fTUFYX1VOSVRTID0gMTY7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UGVhayBVbml0czwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFU09VUkNFX19QRUFLX1VOSVRTID0gMTc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3ZlciBBbGxvY2F0ZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVNPVVJDRV9fT1ZFUl9BTExPQ0FURUQgPSAxODsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BdmFpbGFibGUgRnJvbTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFU09VUkNFX19BVkFJTEFCTEVfRlJPTSA9IDE5OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkF2YWlsYWJsZSBUbzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFU09VUkNFX19BVkFJTEFCTEVfVE8gPSAyMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdGFydDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFU09VUkNFX19TVEFSVCA9IDIxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZpbmlzaDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFU09VUkNFX19GSU5JU0ggPSAyMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DYW4gTGV2ZWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVNPVVJDRV9fQ0FOX0xFVkVMID0gMjM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWNjcnVlIEF0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVTT1VSQ0VfX0FDQ1JVRV9BVCA9IDI0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldvcms8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVNPVVJDRV9fV09SSyA9IDI1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlZ3VsYXIgV29yazwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFU09VUkNFX19SRUdVTEFSX1dPUksgPSAyNjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PdmVydGltZSBXb3JrPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVTT1VSQ0VfX09WRVJUSU1FX1dPUksgPSAyNzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BY3R1YWwgV29yazwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFU09VUkNFX19BQ1RVQUxfV09SSyA9IDI4OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlbWFpbmluZyBXb3JrPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVTT1VSQ0VfX1JFTUFJTklOR19XT1JLID0gMjk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWN0dWFsIE92ZXJ0aW1lIFdvcms8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVNPVVJDRV9fQUNUVUFMX09WRVJUSU1FX1dPUksgPSAzMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZW1haW5pbmcgT3ZlcnRpbWUgV29yazwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFU09VUkNFX19SRU1BSU5JTkdfT1ZFUlRJTUVfV09SSyA9IDMxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBlcmNlbnQgV29yayBDb21wbGV0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFU09VUkNFX19QRVJDRU5UX1dPUktfQ09NUExFVEUgPSAzMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdGFuZGFyZCBSYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVTT1VSQ0VfX1NUQU5EQVJEX1JBVEUgPSAzMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdGFuZGFyZCBSYXRlIEZvcm1hdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFU09VUkNFX19TVEFOREFSRF9SQVRFX0ZPUk1BVCA9IDM0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvc3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVNPVVJDRV9fQ09TVCA9IDM1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk92ZXJ0aW1lIFJhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVNPVVJDRV9fT1ZFUlRJTUVfUkFURSA9IDM2OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk92ZXJ0aW1lIFJhdGUgRm9ybWF0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVTT1VSQ0VfX09WRVJUSU1FX1JBVEVfRk9STUFUID0gMzc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3ZlcnRpbWUgQ29zdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFU09VUkNFX19PVkVSVElNRV9DT1NUID0gMzg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29zdCBQZXIgVXNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVTT1VSQ0VfX0NPU1RfUEVSX1VTRSA9IDM5OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFjdHVhbCBDb3N0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVTT1VSQ0VfX0FDVFVBTF9DT1NUID0gNDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWN0dWFsIE92ZXJ0aW1lIENvc3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVNPVVJDRV9fQUNUVUFMX09WRVJUSU1FX0NPU1QgPSA0MTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZW1haW5pbmcgQ29zdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFU09VUkNFX19SRU1BSU5JTkdfQ09TVCA9IDQyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlbWFpbmluZyBPdmVydGltZSBDb3N0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVTT1VSQ0VfX1JFTUFJTklOR19PVkVSVElNRV9DT1NUID0gNDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+V29yayBWYXJpYW5jZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFU09VUkNFX19XT1JLX1ZBUklBTkNFID0gNDQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29zdCBWYXJpYW5jZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFU09VUkNFX19DT1NUX1ZBUklBTkNFID0gNDU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U1Y8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVNPVVJDRV9fU1YgPSA0NjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DVjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFU09VUkNFX19DViA9IDQ3OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFDV1A8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVNPVVJDRV9fQUNXUCA9IDQ4OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNhbGVuZGFyIFVJRDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFU09VUkNFX19DQUxFTkRBUl9VSUQgPSA0OTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob3RlczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFU09VUkNFX19OT1RFUyA9IDUwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJDV1M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVNPVVJDRV9fQkNXUyA9IDUxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJDV1A8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVNPVVJDRV9fQkNXUCA9IDUyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIEdlbmVyaWM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVNPVVJDRV9fSVNfR0VORVJJQyA9IDUzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIEluYWN0aXZlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVTT1VSQ0VfX0lTX0lOQUNUSVZFID0gNTQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgRW50ZXJwcmlzZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFU09VUkNFX19JU19FTlRFUlBSSVNFID0gNTU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Qm9va2luZyBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVTT1VSQ0VfX0JPT0tJTkdfVFlQRSA9IDU2OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFjdHVhbCBXb3JrIFByb3RlY3RlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFU09VUkNFX19BQ1RVQUxfV09SS19QUk9URUNURUQgPSA1NzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BY3R1YWwgT3ZlcnRpbWUgV29yayBQcm90ZWN0ZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVNPVVJDRV9fQUNUVUFMX09WRVJUSU1FX1dPUktfUFJPVEVDVEVEID0gNTg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWN0aXZlIERpcmVjdG9yeSBHVUlEPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVTT1VSQ0VfX0FDVElWRV9ESVJFQ1RPUllfR1VJRCA9IDU5OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNyZWF0aW9uIERhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVNPVVJDRV9fQ1JFQVRJT05fREFURSA9IDYwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4dGVuZGVkIEF0dHJpYnV0ZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVTT1VSQ0VfX0VYVEVOREVEX0FUVFJJQlVURSA9IDYxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJhc2VsaW5lPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVNPVVJDRV9fQkFTRUxJTkUgPSA2MjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PdXRsaW5lIENvZGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFU09VUkNFX19PVVRMSU5FX0NPREUgPSA2MzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BdmFpbGFiaWxpdHkgUGVyaW9kczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFU09VUkNFX19BVkFJTEFCSUxJVFlfUEVSSU9EUyA9IDY0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJhdGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVTT1VSQ0VfX1JBVEVTID0gNjU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGltZXBoYXNlZCBEYXRhPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVNPVVJDRV9fVElNRVBIQVNFRF9EQVRBID0gNjY7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPlJlc291cmNlPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFU09VUkNFX0ZFQVRVUkVfQ09VTlQgPSA2NzsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlJlc291cmNlc0ltcGwgPGVtPlJlc291cmNlczwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5SZXNvdXJjZXNJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0UmVzb3VyY2VzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFJFU09VUkNFUyA9IDI2OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlc291cmNlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVNPVVJDRVNfX1JFU09VUkNFID0gMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+UmVzb3VyY2VzPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFU09VUkNFU19GRUFUVVJFX0NPVU5UID0gMTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlRhc2tJbXBsIDxlbT5UYXNrPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlRhc2tJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0VGFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBUQVNLID0gMjc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VUlEPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fVUlEID0gMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JRDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX0lEID0gMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fTkFNRSA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX1RZUEUgPSAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIE51bGw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19JU19OVUxMID0gNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DcmVhdGUgRGF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX0NSRUFURV9EQVRFID0gNTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db250YWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fQ09OVEFDVCA9IDY7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+V0JTPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fV0JTID0gNzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5XQlMgTGV2ZWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19XQlNfTEVWRUwgPSA4OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk91dGxpbmUgTnVtYmVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fT1VUTElORV9OVU1CRVIgPSA5OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk91dGxpbmUgTGV2ZWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19PVVRMSU5FX0xFVkVMID0gMTA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJpb3JpdHk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19QUklPUklUWSA9IDExOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN0YXJ0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fU1RBUlQgPSAxMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GaW5pc2g8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19GSU5JU0ggPSAxMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EdXJhdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX0RVUkFUSU9OID0gMTQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RHVyYXRpb24gRm9ybWF0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fRFVSQVRJT05fRk9STUFUID0gMTU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+V29yazwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX1dPUksgPSAxNjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdG9wPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fU1RPUCA9IDE3OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlc3VtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX1JFU1VNRSA9IDE4OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlc3VtZSBWYWxpZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX1JFU1VNRV9WQUxJRCA9IDE5OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVmZm9ydCBEcml2ZW48L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19FRkZPUlRfRFJJVkVOID0gMjA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVjdXJyaW5nPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fUkVDVVJSSU5HID0gMjE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3ZlciBBbGxvY2F0ZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19PVkVSX0FMTE9DQVRFRCA9IDIyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVzdGltYXRlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX0VTVElNQVRFRCA9IDIzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1pbGVzdG9uZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX01JTEVTVE9ORSA9IDI0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1bW1hcnk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19TVU1NQVJZID0gMjU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q3JpdGljYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19DUklUSUNBTCA9IDI2OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIFN1YnByb2plY3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19JU19TVUJQUk9KRUNUID0gMjc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgU3VicHJvamVjdCBSZWFkIE9ubHk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19JU19TVUJQUk9KRUNUX1JFQURfT05MWSA9IDI4OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1YnByb2plY3QgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX1NVQlBST0pFQ1RfTkFNRSA9IDI5OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4dGVybmFsIFRhc2s8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19FWFRFUk5BTF9UQVNLID0gMzA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXh0ZXJuYWwgVGFzayBQcm9qZWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fRVhURVJOQUxfVEFTS19QUk9KRUNUID0gMzE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RWFybHkgU3RhcnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19FQVJMWV9TVEFSVCA9IDMyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVhcmx5IEZpbmlzaDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX0VBUkxZX0ZJTklTSCA9IDMzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxhdGUgU3RhcnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19MQVRFX1NUQVJUID0gMzQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TGF0ZSBGaW5pc2g8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19MQVRFX0ZJTklTSCA9IDM1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN0YXJ0IFZhcmlhbmNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fU1RBUlRfVkFSSUFOQ0UgPSAzNjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GaW5pc2ggVmFyaWFuY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19GSU5JU0hfVkFSSUFOQ0UgPSAzNzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Xb3JrIFZhcmlhbmNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fV09SS19WQVJJQU5DRSA9IDM4OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZyZWUgU2xhY2s8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19GUkVFX1NMQUNLID0gMzk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VG90YWwgU2xhY2s8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19UT1RBTF9TTEFDSyA9IDQwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZpeGVkIENvc3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19GSVhFRF9DT1NUID0gNDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Rml4ZWQgQ29zdCBBY2NydWFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fRklYRURfQ09TVF9BQ0NSVUFMID0gNDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UGVyY2VudCBDb21wbGV0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX1BFUkNFTlRfQ09NUExFVEUgPSA0MzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QZXJjZW50IFdvcmsgQ29tcGxldGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19QRVJDRU5UX1dPUktfQ09NUExFVEUgPSA0NDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db3N0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fQ09TVCA9IDQ1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk92ZXJ0aW1lIENvc3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19PVkVSVElNRV9DT1NUID0gNDY7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3ZlcnRpbWUgV29yazwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX09WRVJUSU1FX1dPUksgPSA0NzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BY3R1YWwgU3RhcnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19BQ1RVQUxfU1RBUlQgPSA0ODsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BY3R1YWwgRmluaXNoPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fQUNUVUFMX0ZJTklTSCA9IDQ5OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFjdHVhbCBEdXJhdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX0FDVFVBTF9EVVJBVElPTiA9IDUwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFjdHVhbCBDb3N0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fQUNUVUFMX0NPU1QgPSA1MTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BY3R1YWwgT3ZlcnRpbWUgQ29zdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX0FDVFVBTF9PVkVSVElNRV9DT1NUID0gNTI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWN0dWFsIFdvcms8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19BQ1RVQUxfV09SSyA9IDUzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFjdHVhbCBPdmVydGltZSBXb3JrPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fQUNUVUFMX09WRVJUSU1FX1dPUksgPSA1NDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZWd1bGFyIFdvcms8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19SRUdVTEFSX1dPUksgPSA1NTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZW1haW5pbmcgRHVyYXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19SRU1BSU5JTkdfRFVSQVRJT04gPSA1NjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZW1haW5pbmcgQ29zdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX1JFTUFJTklOR19DT1NUID0gNTc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVtYWluaW5nIFdvcms8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19SRU1BSU5JTkdfV09SSyA9IDU4OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlbWFpbmluZyBPdmVydGltZSBDb3N0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fUkVNQUlOSU5HX09WRVJUSU1FX0NPU1QgPSA1OTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZW1haW5pbmcgT3ZlcnRpbWUgV29yazwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX1JFTUFJTklOR19PVkVSVElNRV9XT1JLID0gNjA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QUNXUDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX0FDV1AgPSA2MTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DVjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX0NWID0gNjI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29uc3RyYWludCBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fQ09OU1RSQUlOVF9UWVBFID0gNjM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2FsZW5kYXIgVUlEPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fQ0FMRU5EQVJfVUlEID0gNjQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29uc3RyYWludCBEYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fQ09OU1RSQUlOVF9EQVRFID0gNjU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVhZGxpbmU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19ERUFETElORSA9IDY2OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxldmVsIEFzc2lnbm1lbnRzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fTEVWRUxfQVNTSUdOTUVOVFMgPSA2NzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5MZXZlbGluZyBDYW4gU3BsaXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19MRVZFTElOR19DQU5fU1BMSVQgPSA2ODsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5MZXZlbGluZyBEZWxheTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX0xFVkVMSU5HX0RFTEFZID0gNjk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TGV2ZWxpbmcgRGVsYXkgRm9ybWF0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fTEVWRUxJTkdfREVMQVlfRk9STUFUID0gNzA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlIExldmVsZWQgU3RhcnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19QUkVfTEVWRUxFRF9TVEFSVCA9IDcxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZSBMZXZlbGVkIEZpbmlzaDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX1BSRV9MRVZFTEVEX0ZJTklTSCA9IDcyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkh5cGVybGluazwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX0hZUEVSTElOSyA9IDczOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkh5cGVybGluayBBZGRyZXNzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fSFlQRVJMSU5LX0FERFJFU1MgPSA3NDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5IeXBlcmxpbmsgU3ViIEFkZHJlc3M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19IWVBFUkxJTktfU1VCX0FERFJFU1MgPSA3NTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZ25vcmUgUmVzb3VyY2UgQ2FsZW5kYXI8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19JR05PUkVfUkVTT1VSQ0VfQ0FMRU5EQVIgPSA3NjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob3RlczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX05PVEVTID0gNzc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SGlkZSBCYXI8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19ISURFX0JBUiA9IDc4OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJvbGx1cDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX1JPTExVUCA9IDc5OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJDV1M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19CQ1dTID0gODA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QkNXUDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX0JDV1AgPSA4MTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QaHlzaWNhbCBQZXJjZW50IENvbXBsZXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fUEhZU0lDQUxfUEVSQ0VOVF9DT01QTEVURSA9IDgyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVhcm5lZCBWYWx1ZSBNZXRob2Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19FQVJORURfVkFMVUVfTUVUSE9EID0gODM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlZGVjZXNzb3IgTGluazwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fUFJFREVDRVNTT1JfTElOSyA9IDg0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFjdHVhbCBXb3JrIFByb3RlY3RlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX0FDVFVBTF9XT1JLX1BST1RFQ1RFRCA9IDg1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFjdHVhbCBPdmVydGltZSBXb3JrIFByb3RlY3RlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX0FDVFVBTF9PVkVSVElNRV9XT1JLX1BST1RFQ1RFRCA9IDg2OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4dGVuZGVkIEF0dHJpYnV0ZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fRVhURU5ERURfQVRUUklCVVRFID0gODc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QmFzZWxpbmU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX0JBU0VMSU5FID0gODg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3V0bGluZSBDb2RlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19PVVRMSU5FX0NPREUgPSA4OTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UaW1lcGhhc2VkIERhdGE8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX1RJTUVQSEFTRURfREFUQSA9IDkwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5UYXNrPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfRkVBVFVSRV9DT1VOVCA9IDkxOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVGFza3NJbXBsIDxlbT5UYXNrczwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5UYXNrc0ltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Nc3Byb2plY3RQYWNrYWdlSW1wbCNnZXRUYXNrcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBUQVNLUyA9IDI4OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRhc2s8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tTX19UQVNLID0gMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+VGFza3M8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS1NfRkVBVFVSRV9DT1VOVCA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5UaW1lUGVyaW9kSW1wbCA8ZW0+VGltZSBQZXJpb2Q8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVGltZVBlcmlvZEltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Nc3Byb2plY3RQYWNrYWdlSW1wbCNnZXRUaW1lUGVyaW9kKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFRJTUVfUEVSSU9EID0gMjk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RnJvbSBEYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVElNRV9QRVJJT0RfX0ZST01fREFURSA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VG8gRGF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRJTUVfUEVSSU9EX19UT19EQVRFID0gMTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+VGltZSBQZXJpb2Q8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVElNRV9QRVJJT0RfRkVBVFVSRV9DT1VOVCA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5UaW1lcGhhc2VkRGF0YVR5cGVJbXBsIDxlbT5UaW1lcGhhc2VkIERhdGEgVHlwZTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5UaW1lcGhhc2VkRGF0YVR5cGVJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0VGltZXBoYXNlZERhdGFUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFRJTUVQSEFTRURfREFUQV9UWVBFID0gMzA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRJTUVQSEFTRURfREFUQV9UWVBFX19UWVBFID0gMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5VSUQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUSU1FUEhBU0VEX0RBVEFfVFlQRV9fVUlEID0gMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdGFydDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRJTUVQSEFTRURfREFUQV9UWVBFX19TVEFSVCA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RmluaXNoPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVElNRVBIQVNFRF9EQVRBX1RZUEVfX0ZJTklTSCA9IDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VW5pdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRJTUVQSEFTRURfREFUQV9UWVBFX19VTklUID0gNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRJTUVQSEFTRURfREFUQV9UWVBFX19WQUxVRSA9IDU7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPlRpbWVwaGFzZWQgRGF0YSBUeXBlPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRJTUVQSEFTRURfREFUQV9UWVBFX0ZFQVRVUkVfQ09VTlQgPSA2OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVmFsdWVJbXBsIDxlbT5WYWx1ZTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5WYWx1ZUltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Nc3Byb2plY3RQYWNrYWdlSW1wbCNnZXRWYWx1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBWQUxVRSA9IDMxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhbHVlIElEPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVkFMVUVfX1ZBTFVFX0lEID0gMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QYXJlbnQgVmFsdWUgSUQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBWQUxVRV9fUEFSRU5UX1ZBTFVFX0lEID0gMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFZBTFVFX19WQUxVRSA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBWQUxVRV9fREVTQ1JJUFRJT04gPSAzOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5WYWx1ZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBWQUxVRV9GRUFUVVJFX0NPVU5UID0gNDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlZhbHVlMkltcGwgPGVtPlZhbHVlMjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5WYWx1ZTJJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0VmFsdWUyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFZBTFVFMiA9IDMyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklEPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVkFMVUUyX19JRCA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBWQUxVRTJfX1ZBTFVFID0gMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFZBTFVFMl9fREVTQ1JJUFRJT04gPSAyOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5WYWx1ZTI8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVkFMVUUyX0ZFQVRVUkVfQ09VTlQgPSAzOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVmFsdWVMaXN0SW1wbCA8ZW0+VmFsdWUgTGlzdDwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5WYWx1ZUxpc3RJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0VmFsdWVMaXN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFZBTFVFX0xJU1QgPSAzMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYWx1ZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVkFMVUVfTElTVF9fVkFMVUUgPSAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5WYWx1ZSBMaXN0PC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFZBTFVFX0xJU1RfRkVBVFVSRV9DT1VOVCA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5WYWx1ZXNJbXBsIDxlbT5WYWx1ZXM8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVmFsdWVzSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldFZhbHVlcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBWQUxVRVMgPSAzNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVkFMVUVTX19HUk9VUCA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFsdWU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFZBTFVFU19fVkFMVUUgPSAxOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5WYWx1ZXM8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVkFMVUVTX0ZFQVRVUkVfQ09VTlQgPSAyOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuV0JTTWFza0ltcGwgPGVtPldCUyBNYXNrPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLldCU01hc2tJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0V0JTTWFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBXQlNfTUFTSyA9IDM1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxldmVsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV0JTX01BU0tfX0xFVkVMID0gMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV0JTX01BU0tfX1RZUEUgPSAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxlbmd0aDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdCU19NQVNLX19MRU5HVEggPSAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNlcGFyYXRvcjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdCU19NQVNLX19TRVBBUkFUT1IgPSAzOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5XQlMgTWFzazwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXQlNfTUFTS19GRUFUVVJFX0NPVU5UID0gNDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLldCU01hc2tzSW1wbCA8ZW0+V0JTIE1hc2tzPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLldCU01hc2tzSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldFdCU01hc2tzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFdCU19NQVNLUyA9IDM2OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZlcmlmeSBVbmlxdWUgQ29kZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXQlNfTUFTS1NfX1ZFUklGWV9VTklRVUVfQ09ERVMgPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdlbmVyYXRlIENvZGVzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV0JTX01BU0tTX19HRU5FUkFURV9DT0RFUyA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlZml4PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV0JTX01BU0tTX19QUkVGSVggPSAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldCUyBNYXNrPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXQlNfTUFTS1NfX1dCU19NQVNLID0gMzsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+V0JTIE1hc2tzPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdCU19NQVNLU19GRUFUVVJFX0NPVU5UID0gNDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLldlZWtEYXlJbXBsIDxlbT5XZWVrIERheTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5XZWVrRGF5SW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldFdlZWtEYXkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgV0VFS19EQVkgPSAzNzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EYXkgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdFRUtfREFZX19EQVlfVFlQRSA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGF5IFdvcmtpbmc8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXRUVLX0RBWV9fREFZX1dPUktJTkcgPSAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRpbWUgUGVyaW9kPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV0VFS19EQVlfX1RJTUVfUEVSSU9EID0gMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Xb3JraW5nIFRpbWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV0VFS19EQVlfX1dPUktJTkdfVElNRVMgPSAzOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5XZWVrIERheTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXRUVLX0RBWV9GRUFUVVJFX0NPVU5UID0gNDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLldlZWtEYXlzSW1wbCA8ZW0+V2VlayBEYXlzPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLldlZWtEYXlzSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldFdlZWtEYXlzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFdFRUtfREFZUyA9IDM4OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldlZWsgRGF5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXRUVLX0RBWVNfX1dFRUtfREFZID0gMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+V2VlayBEYXlzPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdFRUtfREFZU19GRUFUVVJFX0NPVU5UID0gMTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLldvcmtpbmdUaW1lSW1wbCA8ZW0+V29ya2luZyBUaW1lPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLldvcmtpbmdUaW1lSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldFdvcmtpbmdUaW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFdPUktJTkdfVElNRSA9IDM5OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZyb20gVGltZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktJTkdfVElNRV9fRlJPTV9USU1FID0gMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UbyBUaW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS0lOR19USU1FX19UT19USU1FID0gMTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+V29ya2luZyBUaW1lPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktJTkdfVElNRV9GRUFUVVJFX0NPVU5UID0gMjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLldvcmtpbmdUaW1lc0ltcGwgPGVtPldvcmtpbmcgVGltZXM8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuV29ya2luZ1RpbWVzSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldFdvcmtpbmdUaW1lcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBXT1JLSU5HX1RJTUVTID0gNDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+V29ya2luZyBUaW1lPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLSU5HX1RJTUVTX19XT1JLSU5HX1RJTUUgPSAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5Xb3JraW5nIFRpbWVzPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktJTkdfVElNRVNfRkVBVFVSRV9DT1VOVCA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPkFjY3J1ZSBBdDwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGphdmEubWF0aC5CaWdJbnRlZ2VyCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0QWNjcnVlQXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgQUNDUlVFX0FUID0gNDE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPkFjdGl2ZSBEaXJlY3RvcnkgR1VJRCBUeXBlPC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZwotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldEFjdGl2ZURpcmVjdG9yeUdVSURUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IEFDVElWRV9ESVJFQ1RPUllfR1VJRF9UWVBFID0gNDI7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPkFsaWFzIFR5cGU8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0QWxpYXNUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IEFMSUFTX1RZUEUgPSA0MzsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+QXV0aG9yIFR5cGU8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0QXV0aG9yVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBBVVRIT1JfVFlQRSA9IDQ0OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5CYXNlbGluZSBGb3IgRWFybmVkIFZhbHVlIFR5cGU8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqYXZhLm1hdGguQmlnSW50ZWdlcgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldEJhc2VsaW5lRm9yRWFybmVkVmFsdWVUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IEJBU0VMSU5FX0ZPUl9FQVJORURfVkFMVUVfVFlQRSA9IDQ1OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5Cb29raW5nIFR5cGUgVHlwZTwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGphdmEubWF0aC5CaWdJbnRlZ2VyCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0Qm9va2luZ1R5cGVUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IEJPT0tJTkdfVFlQRV9UWVBFID0gNDY7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPkJvb2tpbmcgVHlwZSBUeXBlMTwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGphdmEubWF0aC5CaWdJbnRlZ2VyCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0Qm9va2luZ1R5cGVUeXBlMSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBCT09LSU5HX1RZUEVfVFlQRTEgPSA0NzsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+Q2FsY3VsYXRpb24gVHlwZSBUeXBlPC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgamF2YS5tYXRoLkJpZ0ludGVnZXIKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Nc3Byb2plY3RQYWNrYWdlSW1wbCNnZXRDYWxjdWxhdGlvblR5cGVUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IENBTENVTEFUSU9OX1RZUEVfVFlQRSA9IDQ4OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5DYXRlZ29yeSBUeXBlPC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZwotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldENhdGVnb3J5VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBDQVRFR09SWV9UWVBFID0gNDk7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPkNvZGUgVHlwZTwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Nc3Byb2plY3RQYWNrYWdlSW1wbCNnZXRDb2RlVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBDT0RFX1RZUEUgPSA1MDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+Q29tcGFueSBUeXBlPC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZwotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldENvbXBhbnlUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IENPTVBBTllfVFlQRSA9IDUxOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5Db25zdHJhaW50IFR5cGUgVHlwZTwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGphdmEubWF0aC5CaWdJbnRlZ2VyCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0Q29uc3RyYWludFR5cGVUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IENPTlNUUkFJTlRfVFlQRV9UWVBFID0gNTI7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPkNvbnRhY3QgVHlwZTwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Nc3Byb2plY3RQYWNrYWdlSW1wbCNnZXRDb250YWN0VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBDT05UQUNUX1RZUEUgPSA1MzsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+Q29zdCBSYXRlIFRhYmxlIFR5cGU8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqYXZhLm1hdGguQmlnSW50ZWdlcgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldENvc3RSYXRlVGFibGVUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IENPU1RfUkFURV9UQUJMRV9UWVBFID0gNTQ7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPkN1cnJlbmN5IFN5bWJvbCBQb3NpdGlvbiBUeXBlPC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgamF2YS5tYXRoLkJpZ0ludGVnZXIKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Nc3Byb2plY3RQYWNrYWdlSW1wbCNnZXRDdXJyZW5jeVN5bWJvbFBvc2l0aW9uVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBDVVJSRU5DWV9TWU1CT0xfUE9TSVRJT05fVFlQRSA9IDU1OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5DdXJyZW5jeSBTeW1ib2wgVHlwZTwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Nc3Byb2plY3RQYWNrYWdlSW1wbCNnZXRDdXJyZW5jeVN5bWJvbFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgQ1VSUkVOQ1lfU1lNQk9MX1RZUEUgPSA1NjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+RGF5IFR5cGUgVHlwZTwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGphdmEubWF0aC5CaWdJbnRlZ2VyCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0RGF5VHlwZVR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgREFZX1RZUEVfVFlQRSA9IDU3OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5EZWZhdWx0IEZpeGVkIENvc3QgQWNjcnVhbCBUeXBlPC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgamF2YS5tYXRoLkJpZ0ludGVnZXIKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Nc3Byb2plY3RQYWNrYWdlSW1wbCNnZXREZWZhdWx0Rml4ZWRDb3N0QWNjcnVhbFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgREVGQVVMVF9GSVhFRF9DT1NUX0FDQ1JVQUxfVFlQRSA9IDU4OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5EZWZhdWx0IFRhc2sgRVYgTWV0aG9kIFR5cGU8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqYXZhLm1hdGguQmlnSW50ZWdlcgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldERlZmF1bHRUYXNrRVZNZXRob2RUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IERFRkFVTFRfVEFTS19FVl9NRVRIT0RfVFlQRSA9IDU5OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5EZWZhdWx0IFRhc2sgVHlwZSBUeXBlPC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgamF2YS5tYXRoLkJpZ0ludGVnZXIKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Nc3Byb2plY3RQYWNrYWdlSW1wbCNnZXREZWZhdWx0VGFza1R5cGVUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IERFRkFVTFRfVEFTS19UWVBFX1RZUEUgPSA2MDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+RHVyYXRpb24gRm9ybWF0IFR5cGU8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqYXZhLm1hdGguQmlnSW50ZWdlcgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldER1cmF0aW9uRm9ybWF0VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBEVVJBVElPTl9GT1JNQVRfVFlQRSA9IDYxOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5EdXJhdGlvbiBGb3JtYXQgVHlwZTE8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqYXZhLm1hdGguQmlnSW50ZWdlcgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldER1cmF0aW9uRm9ybWF0VHlwZTEoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgRFVSQVRJT05fRk9STUFUX1RZUEUxID0gNjI7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPkR1cmF0aW9uIEZvcm1hdCBUeXBlMjwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGphdmEubWF0aC5CaWdJbnRlZ2VyCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0RHVyYXRpb25Gb3JtYXRUeXBlMigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBEVVJBVElPTl9GT1JNQVRfVFlQRTIgPSA2MzsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+RHVyYXRpb24gRm9ybWF0IFR5cGUzPC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgamF2YS5tYXRoLkJpZ0ludGVnZXIKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Nc3Byb2plY3RQYWNrYWdlSW1wbCNnZXREdXJhdGlvbkZvcm1hdFR5cGUzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IERVUkFUSU9OX0ZPUk1BVF9UWVBFMyA9IDY0OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5EdXJhdGlvbiBGb3JtYXQgVHlwZTQ8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqYXZhLm1hdGguQmlnSW50ZWdlcgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldER1cmF0aW9uRm9ybWF0VHlwZTQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgRFVSQVRJT05fRk9STUFUX1RZUEU0ID0gNjU7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPkR1cmF0aW9uIEZvcm1hdCBUeXBlNTwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGphdmEubWF0aC5CaWdJbnRlZ2VyCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0RHVyYXRpb25Gb3JtYXRUeXBlNSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBEVVJBVElPTl9GT1JNQVRfVFlQRTUgPSA2NjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+RWFybmVkIFZhbHVlIE1ldGhvZCBUeXBlPC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgamF2YS5tYXRoLkJpZ0ludGVnZXIKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Nc3Byb2plY3RQYWNrYWdlSW1wbCNnZXRFYXJuZWRWYWx1ZU1ldGhvZFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgRUFSTkVEX1ZBTFVFX01FVEhPRF9UWVBFID0gNjc7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPkVhcm5lZCBWYWx1ZSBNZXRob2QgVHlwZTE8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqYXZhLm1hdGguQmlnSW50ZWdlcgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldEVhcm5lZFZhbHVlTWV0aG9kVHlwZTEoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgRUFSTkVEX1ZBTFVFX01FVEhPRF9UWVBFMSA9IDY4OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5FbWFpbCBBZGRyZXNzIFR5cGU8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0RW1haWxBZGRyZXNzVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBFTUFJTF9BRERSRVNTX1RZUEUgPSA2OTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+RXh0ZXJuYWwgVGFzayBQcm9qZWN0IFR5cGU8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0RXh0ZXJuYWxUYXNrUHJvamVjdFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgRVhURVJOQUxfVEFTS19QUk9KRUNUX1RZUEUgPSA3MDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+Rml4ZWQgQ29zdCBBY2NydWFsIFR5cGU8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0Rml4ZWRDb3N0QWNjcnVhbFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgRklYRURfQ09TVF9BQ0NSVUFMX1RZUEUgPSA3MTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+RlkgU3RhcnQgRGF0ZSBUeXBlPC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgamF2YS5tYXRoLkJpZ0ludGVnZXIKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Nc3Byb2plY3RQYWNrYWdlSW1wbCNnZXRGWVN0YXJ0RGF0ZVR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgRllfU1RBUlRfREFURV9UWVBFID0gNzI7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPkdyb3VwIFR5cGU8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0R3JvdXBUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IEdST1VQX1RZUEUgPSA3MzsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+SHlwZXJsaW5rIEFkZHJlc3MgVHlwZTwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Nc3Byb2plY3RQYWNrYWdlSW1wbCNnZXRIeXBlcmxpbmtBZGRyZXNzVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBIWVBFUkxJTktfQUREUkVTU19UWVBFID0gNzQ7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPkh5cGVybGluayBBZGRyZXNzIFR5cGUxPC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZwotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldEh5cGVybGlua0FkZHJlc3NUeXBlMSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBIWVBFUkxJTktfQUREUkVTU19UWVBFMSA9IDc1OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5IeXBlcmxpbmsgQWRkcmVzcyBUeXBlMjwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Nc3Byb2plY3RQYWNrYWdlSW1wbCNnZXRIeXBlcmxpbmtBZGRyZXNzVHlwZTIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgSFlQRVJMSU5LX0FERFJFU1NfVFlQRTIgPSA3NjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+SHlwZXJsaW5rIFN1YiBBZGRyZXNzIFR5cGU8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0SHlwZXJsaW5rU3ViQWRkcmVzc1R5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgSFlQRVJMSU5LX1NVQl9BRERSRVNTX1RZUEUgPSA3NzsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+SHlwZXJsaW5rIFN1YiBBZGRyZXNzIFR5cGUxPC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZwotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldEh5cGVybGlua1N1YkFkZHJlc3NUeXBlMSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBIWVBFUkxJTktfU1VCX0FERFJFU1NfVFlQRTEgPSA3ODsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+SHlwZXJsaW5rIFN1YiBBZGRyZXNzIFR5cGUyPC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZwotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldEh5cGVybGlua1N1YkFkZHJlc3NUeXBlMigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBIWVBFUkxJTktfU1VCX0FERFJFU1NfVFlQRTIgPSA3OTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+SHlwZXJsaW5rIFR5cGU8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0SHlwZXJsaW5rVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBIWVBFUkxJTktfVFlQRSA9IDgwOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5IeXBlcmxpbmsgVHlwZTE8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0SHlwZXJsaW5rVHlwZTEoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgSFlQRVJMSU5LX1RZUEUxID0gODE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPkh5cGVybGluayBUeXBlMjwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Nc3Byb2plY3RQYWNrYWdlSW1wbCNnZXRIeXBlcmxpbmtUeXBlMigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBIWVBFUkxJTktfVFlQRTIgPSA4MjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+SW5pdGlhbHMgVHlwZTwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Nc3Byb2plY3RQYWNrYWdlSW1wbCNnZXRJbml0aWFsc1R5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgSU5JVElBTFNfVFlQRSA9IDgzOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5MYWcgRm9ybWF0IFR5cGU8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqYXZhLm1hdGguQmlnSW50ZWdlcgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldExhZ0Zvcm1hdFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgTEFHX0ZPUk1BVF9UWVBFID0gODQ7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPkxldmVsaW5nIERlbGF5IEZvcm1hdCBUeXBlPC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgamF2YS5tYXRoLkJpZ0ludGVnZXIKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Nc3Byb2plY3RQYWNrYWdlSW1wbCNnZXRMZXZlbGluZ0RlbGF5Rm9ybWF0VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBMRVZFTElOR19ERUxBWV9GT1JNQVRfVFlQRSA9IDg1OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5MZXZlbGluZyBEZWxheSBGb3JtYXQgVHlwZTE8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqYXZhLm1hdGguQmlnSW50ZWdlcgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldExldmVsaW5nRGVsYXlGb3JtYXRUeXBlMSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBMRVZFTElOR19ERUxBWV9GT1JNQVRfVFlQRTEgPSA4NjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+TWFuYWdlciBUeXBlPC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZwotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldE1hbmFnZXJUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IE1BTkFHRVJfVFlQRSA9IDg3OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5NYXRlcmlhbCBMYWJlbCBUeXBlPC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZwotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldE1hdGVyaWFsTGFiZWxUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IE1BVEVSSUFMX0xBQkVMX1RZUEUgPSA4ODsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+TmFtZSBUeXBlPC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZwotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldE5hbWVUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IE5BTUVfVFlQRSA9IDg5OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5OYW1lIFR5cGUxPC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZwotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldE5hbWVUeXBlMSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBOQU1FX1RZUEUxID0gOTA7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPk5hbWUgVHlwZTI8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0TmFtZVR5cGUyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IE5BTUVfVFlQRTIgPSA5MTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+TmFtZSBUeXBlMzwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Nc3Byb2plY3RQYWNrYWdlSW1wbCNnZXROYW1lVHlwZTMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgTkFNRV9UWVBFMyA9IDkyOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5OZXcgVGFzayBTdGFydCBEYXRlIFR5cGU8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqYXZhLm1hdGguQmlnSW50ZWdlcgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldE5ld1Rhc2tTdGFydERhdGVUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IE5FV19UQVNLX1NUQVJUX0RBVEVfVFlQRSA9IDkzOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5OVCBBY2NvdW50IFR5cGU8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0TlRBY2NvdW50VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBOVF9BQ0NPVU5UX1RZUEUgPSA5NDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+T3V0bGluZSBOdW1iZXIgVHlwZTwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Nc3Byb2plY3RQYWNrYWdlSW1wbCNnZXRPdXRsaW5lTnVtYmVyVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBPVVRMSU5FX05VTUJFUl9UWVBFID0gOTU7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPk92ZXJ0aW1lIFJhdGUgRm9ybWF0IFR5cGU8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqYXZhLm1hdGguQmlnSW50ZWdlcgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldE92ZXJ0aW1lUmF0ZUZvcm1hdFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgT1ZFUlRJTUVfUkFURV9GT1JNQVRfVFlQRSA9IDk2OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5PdmVydGltZSBSYXRlIEZvcm1hdCBUeXBlMTwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGphdmEubWF0aC5CaWdJbnRlZ2VyCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0T3ZlcnRpbWVSYXRlRm9ybWF0VHlwZTEoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgT1ZFUlRJTUVfUkFURV9GT1JNQVRfVFlQRTEgPSA5NzsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+UGhvbmV0aWMgQWxpYXMgVHlwZTwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Nc3Byb2plY3RQYWNrYWdlSW1wbCNnZXRQaG9uZXRpY0FsaWFzVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBQSE9ORVRJQ19BTElBU19UWVBFID0gOTg7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPlBob25ldGljcyBUeXBlPC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZwotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldFBob25ldGljc1R5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgUEhPTkVUSUNTX1RZUEUgPSA5OTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+UHJlZml4IFR5cGU8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0UHJlZml4VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBQUkVGSVhfVFlQRSA9IDEwMDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+UmF0ZSBUYWJsZSBUeXBlPC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgamF2YS5tYXRoLkJpZ0ludGVnZXIKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Nc3Byb2plY3RQYWNrYWdlSW1wbCNnZXRSYXRlVGFibGVUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFJBVEVfVEFCTEVfVFlQRSA9IDEwMTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+Um9sbHVwIFR5cGUgVHlwZTwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGphdmEubWF0aC5CaWdJbnRlZ2VyCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0Um9sbHVwVHlwZVR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgUk9MTFVQX1RZUEVfVFlQRSA9IDEwMjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+U3RhbmRhcmQgUmF0ZSBGb3JtYXQgVHlwZTwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGphdmEubWF0aC5CaWdJbnRlZ2VyCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0U3RhbmRhcmRSYXRlRm9ybWF0VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBTVEFOREFSRF9SQVRFX0ZPUk1BVF9UWVBFID0gMTAzOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5TdGFuZGFyZCBSYXRlIEZvcm1hdCBUeXBlMTwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGphdmEubWF0aC5CaWdJbnRlZ2VyCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0U3RhbmRhcmRSYXRlRm9ybWF0VHlwZTEoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgU1RBTkRBUkRfUkFURV9GT1JNQVRfVFlQRTEgPSAxMDQ7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPlN1YmplY3QgVHlwZTwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Nc3Byb2plY3RQYWNrYWdlSW1wbCNnZXRTdWJqZWN0VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBTVUJKRUNUX1RZUEUgPSAxMDU7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPlN1YnByb2plY3QgTmFtZSBUeXBlPC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZwotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldFN1YnByb2plY3ROYW1lVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBTVUJQUk9KRUNUX05BTUVfVFlQRSA9IDEwNjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+VGl0bGUgVHlwZTwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Nc3Byb2plY3RQYWNrYWdlSW1wbCNnZXRUaXRsZVR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgVElUTEVfVFlQRSA9IDEwNzsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+VHlwZSBUeXBlPC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgamF2YS5tYXRoLkJpZ0ludGVnZXIKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Nc3Byb2plY3RQYWNrYWdlSW1wbCNnZXRUeXBlVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBUWVBFX1RZUEUgPSAxMDg7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPlR5cGUgVHlwZTE8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqYXZhLm1hdGguQmlnSW50ZWdlcgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldFR5cGVUeXBlMSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBUWVBFX1RZUEUxID0gMTA5OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5UeXBlIFR5cGUyPC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgamF2YS5tYXRoLkJpZ0ludGVnZXIKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Nc3Byb2plY3RQYWNrYWdlSW1wbCNnZXRUeXBlVHlwZTIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgVFlQRV9UWVBFMiA9IDExMDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+VHlwZSBUeXBlMzwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGphdmEubWF0aC5CaWdJbnRlZ2VyCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0VHlwZVR5cGUzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFRZUEVfVFlQRTMgPSAxMTE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPlR5cGUgVHlwZTQ8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqYXZhLm1hdGguQmlnSW50ZWdlcgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldFR5cGVUeXBlNCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBUWVBFX1RZUEU0ID0gMTEyOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5UeXBlIFR5cGU1PC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgamF2YS5tYXRoLkJpZ0ludGVnZXIKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Nc3Byb2plY3RQYWNrYWdlSW1wbCNnZXRUeXBlVHlwZTUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgVFlQRV9UWVBFNSA9IDExMzsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+VUlEIFR5cGU8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0VUlEVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBVSURfVFlQRSA9IDExNDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+VW5pdCBUeXBlPC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgamF2YS5tYXRoLkJpZ0ludGVnZXIKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Nc3Byb2plY3RQYWNrYWdlSW1wbCNnZXRVbml0VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBVTklUX1RZUEUgPSAxMTU7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPlZhbHVlbGlzdCBTb3J0IE9yZGVyIFR5cGU8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqYXZhLm1hdGguQmlnSW50ZWdlcgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldFZhbHVlbGlzdFNvcnRPcmRlclR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgVkFMVUVMSVNUX1NPUlRfT1JERVJfVFlQRSA9IDExNjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+V2VlayBTdGFydCBEYXkgVHlwZTwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGphdmEubWF0aC5CaWdJbnRlZ2VyCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0V2Vla1N0YXJ0RGF5VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBXRUVLX1NUQVJUX0RBWV9UWVBFID0gMTE3OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5Xb3JrIENvbnRvdXIgVHlwZTwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGphdmEubWF0aC5CaWdJbnRlZ2VyCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0V29ya0NvbnRvdXJUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFdPUktfQ09OVE9VUl9UWVBFID0gMTE4OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5Xb3JrIEZvcm1hdCBUeXBlPC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgamF2YS5tYXRoLkJpZ0ludGVnZXIKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Nc3Byb2plY3RQYWNrYWdlSW1wbCNnZXRXb3JrRm9ybWF0VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBXT1JLX0ZPUk1BVF9UWVBFID0gMTE5OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5Xb3JrIEdyb3VwIFR5cGU8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqYXZhLm1hdGguQmlnSW50ZWdlcgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldFdvcmtHcm91cFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgV09SS19HUk9VUF9UWVBFID0gMTIwOwotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQgPGVtPkFzc2lnbm1lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+QXNzaWdubWVudDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0QXNzaWdubWVudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0VUlEIDxlbT5VSUQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5VSUQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0VUlEKCkKLQkgKiBAc2VlICNnZXRBc3NpZ25tZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X1VJRCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0VGFza1VJRCA8ZW0+VGFzayBVSUQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5UYXNrIFVJRDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRUYXNrVUlEKCkKLQkgKiBAc2VlICNnZXRBc3NpZ25tZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X1Rhc2tVSUQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldFJlc291cmNlVUlEIDxlbT5SZXNvdXJjZSBVSUQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5SZXNvdXJjZSBVSUQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0UmVzb3VyY2VVSUQoKQotCSAqIEBzZWUgI2dldEFzc2lnbm1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEFzc2lnbm1lbnRfUmVzb3VyY2VVSUQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldFBlcmNlbnRXb3JrQ29tcGxldGUgPGVtPlBlcmNlbnQgV29yayBDb21wbGV0ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlBlcmNlbnQgV29yayBDb21wbGV0ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRQZXJjZW50V29ya0NvbXBsZXRlKCkKLQkgKiBAc2VlICNnZXRBc3NpZ25tZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X1BlcmNlbnRXb3JrQ29tcGxldGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldEFjdHVhbENvc3QgPGVtPkFjdHVhbCBDb3N0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+QWN0dWFsIENvc3Q8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0QWN0dWFsQ29zdCgpCi0JICogQHNlZSAjZ2V0QXNzaWdubWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QXNzaWdubWVudF9BY3R1YWxDb3N0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRBY3R1YWxGaW5pc2ggPGVtPkFjdHVhbCBGaW5pc2g8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5BY3R1YWwgRmluaXNoPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldEFjdHVhbEZpbmlzaCgpCi0JICogQHNlZSAjZ2V0QXNzaWdubWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QXNzaWdubWVudF9BY3R1YWxGaW5pc2goKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldEFjdHVhbE92ZXJ0aW1lQ29zdCA8ZW0+QWN0dWFsIE92ZXJ0aW1lIENvc3Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5BY3R1YWwgT3ZlcnRpbWUgQ29zdDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRBY3R1YWxPdmVydGltZUNvc3QoKQotCSAqIEBzZWUgI2dldEFzc2lnbm1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEFzc2lnbm1lbnRfQWN0dWFsT3ZlcnRpbWVDb3N0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRBY3R1YWxPdmVydGltZVdvcmsgPGVtPkFjdHVhbCBPdmVydGltZSBXb3JrPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+QWN0dWFsIE92ZXJ0aW1lIFdvcms8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0QWN0dWFsT3ZlcnRpbWVXb3JrKCkKLQkgKiBAc2VlICNnZXRBc3NpZ25tZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X0FjdHVhbE92ZXJ0aW1lV29yaygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0QWN0dWFsU3RhcnQgPGVtPkFjdHVhbCBTdGFydDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkFjdHVhbCBTdGFydDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRBY3R1YWxTdGFydCgpCi0JICogQHNlZSAjZ2V0QXNzaWdubWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QXNzaWdubWVudF9BY3R1YWxTdGFydCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0QWN0dWFsV29yayA8ZW0+QWN0dWFsIFdvcms8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5BY3R1YWwgV29yazwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRBY3R1YWxXb3JrKCkKLQkgKiBAc2VlICNnZXRBc3NpZ25tZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X0FjdHVhbFdvcmsoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldEFDV1AgPGVtPkFDV1A8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5BQ1dQPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldEFDV1AoKQotCSAqIEBzZWUgI2dldEFzc2lnbm1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEFzc2lnbm1lbnRfQUNXUCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjaXNDb25maXJtZWQgPGVtPkNvbmZpcm1lZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkNvbmZpcm1lZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNpc0NvbmZpcm1lZCgpCi0JICogQHNlZSAjZ2V0QXNzaWdubWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QXNzaWdubWVudF9Db25maXJtZWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldENvc3QgPGVtPkNvc3Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Db3N0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldENvc3QoKQotCSAqIEBzZWUgI2dldEFzc2lnbm1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEFzc2lnbm1lbnRfQ29zdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0Q29zdFJhdGVUYWJsZSA8ZW0+Q29zdCBSYXRlIFRhYmxlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Q29zdCBSYXRlIFRhYmxlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldENvc3RSYXRlVGFibGUoKQotCSAqIEBzZWUgI2dldEFzc2lnbm1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEFzc2lnbm1lbnRfQ29zdFJhdGVUYWJsZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0Q29zdFZhcmlhbmNlIDxlbT5Db3N0IFZhcmlhbmNlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Q29zdCBWYXJpYW5jZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRDb3N0VmFyaWFuY2UoKQotCSAqIEBzZWUgI2dldEFzc2lnbm1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEFzc2lnbm1lbnRfQ29zdFZhcmlhbmNlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRDViA8ZW0+Q1Y8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5DVjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRDVigpCi0JICogQHNlZSAjZ2V0QXNzaWdubWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QXNzaWdubWVudF9DVigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0RGVsYXkgPGVtPkRlbGF5PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RGVsYXk8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0RGVsYXkoKQotCSAqIEBzZWUgI2dldEFzc2lnbm1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEFzc2lnbm1lbnRfRGVsYXkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldEZpbmlzaCA8ZW0+RmluaXNoPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RmluaXNoPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldEZpbmlzaCgpCi0JICogQHNlZSAjZ2V0QXNzaWdubWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QXNzaWdubWVudF9GaW5pc2goKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldEZpbmlzaFZhcmlhbmNlIDxlbT5GaW5pc2ggVmFyaWFuY2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5GaW5pc2ggVmFyaWFuY2U8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0RmluaXNoVmFyaWFuY2UoKQotCSAqIEBzZWUgI2dldEFzc2lnbm1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEFzc2lnbm1lbnRfRmluaXNoVmFyaWFuY2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldEh5cGVybGluayA8ZW0+SHlwZXJsaW5rPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SHlwZXJsaW5rPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldEh5cGVybGluaygpCi0JICogQHNlZSAjZ2V0QXNzaWdubWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QXNzaWdubWVudF9IeXBlcmxpbmsoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldEh5cGVybGlua0FkZHJlc3MgPGVtPkh5cGVybGluayBBZGRyZXNzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SHlwZXJsaW5rIEFkZHJlc3M8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0SHlwZXJsaW5rQWRkcmVzcygpCi0JICogQHNlZSAjZ2V0QXNzaWdubWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QXNzaWdubWVudF9IeXBlcmxpbmtBZGRyZXNzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRIeXBlcmxpbmtTdWJBZGRyZXNzIDxlbT5IeXBlcmxpbmsgU3ViIEFkZHJlc3M8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5IeXBlcmxpbmsgU3ViIEFkZHJlc3M8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0SHlwZXJsaW5rU3ViQWRkcmVzcygpCi0JICogQHNlZSAjZ2V0QXNzaWdubWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QXNzaWdubWVudF9IeXBlcmxpbmtTdWJBZGRyZXNzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRXb3JrVmFyaWFuY2UgPGVtPldvcmsgVmFyaWFuY2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Xb3JrIFZhcmlhbmNlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldFdvcmtWYXJpYW5jZSgpCi0JICogQHNlZSAjZ2V0QXNzaWdubWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QXNzaWdubWVudF9Xb3JrVmFyaWFuY2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2lzSGFzRml4ZWRSYXRlVW5pdHMgPGVtPkhhcyBGaXhlZCBSYXRlIFVuaXRzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SGFzIEZpeGVkIFJhdGUgVW5pdHM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjaXNIYXNGaXhlZFJhdGVVbml0cygpCi0JICogQHNlZSAjZ2V0QXNzaWdubWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QXNzaWdubWVudF9IYXNGaXhlZFJhdGVVbml0cygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjaXNGaXhlZE1hdGVyaWFsIDxlbT5GaXhlZCBNYXRlcmlhbDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkZpeGVkIE1hdGVyaWFsPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2lzRml4ZWRNYXRlcmlhbCgpCi0JICogQHNlZSAjZ2V0QXNzaWdubWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QXNzaWdubWVudF9GaXhlZE1hdGVyaWFsKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRMZXZlbGluZ0RlbGF5IDxlbT5MZXZlbGluZyBEZWxheTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkxldmVsaW5nIERlbGF5PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldExldmVsaW5nRGVsYXkoKQotCSAqIEBzZWUgI2dldEFzc2lnbm1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEFzc2lnbm1lbnRfTGV2ZWxpbmdEZWxheSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0TGV2ZWxpbmdEZWxheUZvcm1hdCA8ZW0+TGV2ZWxpbmcgRGVsYXkgRm9ybWF0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TGV2ZWxpbmcgRGVsYXkgRm9ybWF0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldExldmVsaW5nRGVsYXlGb3JtYXQoKQotCSAqIEBzZWUgI2dldEFzc2lnbm1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEFzc2lnbm1lbnRfTGV2ZWxpbmdEZWxheUZvcm1hdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjaXNMaW5rZWRGaWVsZHMgPGVtPkxpbmtlZCBGaWVsZHM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5MaW5rZWQgRmllbGRzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2lzTGlua2VkRmllbGRzKCkKLQkgKiBAc2VlICNnZXRBc3NpZ25tZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X0xpbmtlZEZpZWxkcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjaXNNaWxlc3RvbmUgPGVtPk1pbGVzdG9uZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk1pbGVzdG9uZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNpc01pbGVzdG9uZSgpCi0JICogQHNlZSAjZ2V0QXNzaWdubWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QXNzaWdubWVudF9NaWxlc3RvbmUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldE5vdGVzIDxlbT5Ob3RlczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk5vdGVzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldE5vdGVzKCkKLQkgKiBAc2VlICNnZXRBc3NpZ25tZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X05vdGVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNpc092ZXJhbGxvY2F0ZWQgPGVtPk92ZXJhbGxvY2F0ZWQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5PdmVyYWxsb2NhdGVkPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2lzT3ZlcmFsbG9jYXRlZCgpCi0JICogQHNlZSAjZ2V0QXNzaWdubWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QXNzaWdubWVudF9PdmVyYWxsb2NhdGVkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRPdmVydGltZUNvc3QgPGVtPk92ZXJ0aW1lIENvc3Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5PdmVydGltZSBDb3N0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldE92ZXJ0aW1lQ29zdCgpCi0JICogQHNlZSAjZ2V0QXNzaWdubWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QXNzaWdubWVudF9PdmVydGltZUNvc3QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldE92ZXJ0aW1lV29yayA8ZW0+T3ZlcnRpbWUgV29yazwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk92ZXJ0aW1lIFdvcms8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0T3ZlcnRpbWVXb3JrKCkKLQkgKiBAc2VlICNnZXRBc3NpZ25tZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X092ZXJ0aW1lV29yaygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0UmVndWxhcldvcmsgPGVtPlJlZ3VsYXIgV29yazwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlJlZ3VsYXIgV29yazwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRSZWd1bGFyV29yaygpCi0JICogQHNlZSAjZ2V0QXNzaWdubWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QXNzaWdubWVudF9SZWd1bGFyV29yaygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0UmVtYWluaW5nQ29zdCA8ZW0+UmVtYWluaW5nIENvc3Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5SZW1haW5pbmcgQ29zdDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRSZW1haW5pbmdDb3N0KCkKLQkgKiBAc2VlICNnZXRBc3NpZ25tZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X1JlbWFpbmluZ0Nvc3QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldFJlbWFpbmluZ092ZXJ0aW1lQ29zdCA8ZW0+UmVtYWluaW5nIE92ZXJ0aW1lIENvc3Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5SZW1haW5pbmcgT3ZlcnRpbWUgQ29zdDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRSZW1haW5pbmdPdmVydGltZUNvc3QoKQotCSAqIEBzZWUgI2dldEFzc2lnbm1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEFzc2lnbm1lbnRfUmVtYWluaW5nT3ZlcnRpbWVDb3N0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRSZW1haW5pbmdPdmVydGltZVdvcmsgPGVtPlJlbWFpbmluZyBPdmVydGltZSBXb3JrPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UmVtYWluaW5nIE92ZXJ0aW1lIFdvcms8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0UmVtYWluaW5nT3ZlcnRpbWVXb3JrKCkKLQkgKiBAc2VlICNnZXRBc3NpZ25tZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X1JlbWFpbmluZ092ZXJ0aW1lV29yaygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0UmVtYWluaW5nV29yayA8ZW0+UmVtYWluaW5nIFdvcms8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5SZW1haW5pbmcgV29yazwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRSZW1haW5pbmdXb3JrKCkKLQkgKiBAc2VlICNnZXRBc3NpZ25tZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X1JlbWFpbmluZ1dvcmsoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2lzUmVzcG9uc2VQZW5kaW5nIDxlbT5SZXNwb25zZSBQZW5kaW5nPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UmVzcG9uc2UgUGVuZGluZzwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNpc1Jlc3BvbnNlUGVuZGluZygpCi0JICogQHNlZSAjZ2V0QXNzaWdubWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QXNzaWdubWVudF9SZXNwb25zZVBlbmRpbmcoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldFN0YXJ0IDxlbT5TdGFydDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlN0YXJ0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldFN0YXJ0KCkKLQkgKiBAc2VlICNnZXRBc3NpZ25tZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X1N0YXJ0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRTdG9wIDxlbT5TdG9wPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+U3RvcDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRTdG9wKCkKLQkgKiBAc2VlICNnZXRBc3NpZ25tZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X1N0b3AoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldFJlc3VtZSA8ZW0+UmVzdW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UmVzdW1lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldFJlc3VtZSgpCi0JICogQHNlZSAjZ2V0QXNzaWdubWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QXNzaWdubWVudF9SZXN1bWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldFN0YXJ0VmFyaWFuY2UgPGVtPlN0YXJ0IFZhcmlhbmNlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+U3RhcnQgVmFyaWFuY2U8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0U3RhcnRWYXJpYW5jZSgpCi0JICogQHNlZSAjZ2V0QXNzaWdubWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QXNzaWdubWVudF9TdGFydFZhcmlhbmNlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRVbml0cyA8ZW0+VW5pdHM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Vbml0czwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRVbml0cygpCi0JICogQHNlZSAjZ2V0QXNzaWdubWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QXNzaWdubWVudF9Vbml0cygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjaXNVcGRhdGVOZWVkZWQgPGVtPlVwZGF0ZSBOZWVkZWQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5VcGRhdGUgTmVlZGVkPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2lzVXBkYXRlTmVlZGVkKCkKLQkgKiBAc2VlICNnZXRBc3NpZ25tZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X1VwZGF0ZU5lZWRlZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0VkFDIDxlbT5WQUM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5WQUM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0VkFDKCkKLQkgKiBAc2VlICNnZXRBc3NpZ25tZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X1ZBQygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0V29yayA8ZW0+V29yazwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPldvcms8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0V29yaygpCi0JICogQHNlZSAjZ2V0QXNzaWdubWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QXNzaWdubWVudF9Xb3JrKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRXb3JrQ29udG91ciA8ZW0+V29yayBDb250b3VyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+V29yayBDb250b3VyPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldFdvcmtDb250b3VyKCkKLQkgKiBAc2VlICNnZXRBc3NpZ25tZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X1dvcmtDb250b3VyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRCQ1dTIDxlbT5CQ1dTPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+QkNXUzwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRCQ1dTKCkKLQkgKiBAc2VlICNnZXRBc3NpZ25tZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X0JDV1MoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldEJDV1AgPGVtPkJDV1A8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5CQ1dQPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldEJDV1AoKQotCSAqIEBzZWUgI2dldEFzc2lnbm1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEFzc2lnbm1lbnRfQkNXUCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0Qm9va2luZ1R5cGUgPGVtPkJvb2tpbmcgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkJvb2tpbmcgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRCb29raW5nVHlwZSgpCi0JICogQHNlZSAjZ2V0QXNzaWdubWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QXNzaWdubWVudF9Cb29raW5nVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0QWN0dWFsV29ya1Byb3RlY3RlZCA8ZW0+QWN0dWFsIFdvcmsgUHJvdGVjdGVkPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+QWN0dWFsIFdvcmsgUHJvdGVjdGVkPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldEFjdHVhbFdvcmtQcm90ZWN0ZWQoKQotCSAqIEBzZWUgI2dldEFzc2lnbm1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEFzc2lnbm1lbnRfQWN0dWFsV29ya1Byb3RlY3RlZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0QWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkIDxlbT5BY3R1YWwgT3ZlcnRpbWUgV29yayBQcm90ZWN0ZWQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5BY3R1YWwgT3ZlcnRpbWUgV29yayBQcm90ZWN0ZWQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0QWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkKCkKLQkgKiBAc2VlICNnZXRBc3NpZ25tZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X0FjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0Q3JlYXRpb25EYXRlIDxlbT5DcmVhdGlvbiBEYXRlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Q3JlYXRpb24gRGF0ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRDcmVhdGlvbkRhdGUoKQotCSAqIEBzZWUgI2dldEFzc2lnbm1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEFzc2lnbm1lbnRfQ3JlYXRpb25EYXRlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldEV4dGVuZGVkQXR0cmlidXRlIDxlbT5FeHRlbmRlZCBBdHRyaWJ1dGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkV4dGVuZGVkIEF0dHJpYnV0ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRFeHRlbmRlZEF0dHJpYnV0ZSgpCi0JICogQHNlZSAjZ2V0QXNzaWdubWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0QXNzaWdubWVudF9FeHRlbmRlZEF0dHJpYnV0ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRCYXNlbGluZSA8ZW0+QmFzZWxpbmU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkJhc2VsaW5lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldEJhc2VsaW5lKCkKLQkgKiBAc2VlICNnZXRBc3NpZ25tZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRBc3NpZ25tZW50X0Jhc2VsaW5lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldFRpbWVwaGFzZWREYXRhIDxlbT5UaW1lcGhhc2VkIERhdGE8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPlRpbWVwaGFzZWQgRGF0YTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRUaW1lcGhhc2VkRGF0YSgpCi0JICogQHNlZSAjZ2V0QXNzaWdubWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0QXNzaWdubWVudF9UaW1lcGhhc2VkRGF0YSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50cyA8ZW0+QXNzaWdubWVudHM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+QXNzaWdubWVudHM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnRzCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRBc3NpZ25tZW50cygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudHMjZ2V0QXNzaWdubWVudCA8ZW0+QXNzaWdubWVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+QXNzaWdubWVudDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudHMjZ2V0QXNzaWdubWVudCgpCi0JICogQHNlZSAjZ2V0QXNzaWdubWVudHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldEFzc2lnbm1lbnRzX0Fzc2lnbm1lbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXZhaWxhYmlsaXR5UGVyaW9kIDxlbT5BdmFpbGFiaWxpdHkgUGVyaW9kPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkF2YWlsYWJpbGl0eSBQZXJpb2Q8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkF2YWlsYWJpbGl0eVBlcmlvZAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0QXZhaWxhYmlsaXR5UGVyaW9kKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXZhaWxhYmlsaXR5UGVyaW9kI2dldEF2YWlsYWJsZUZyb20gPGVtPkF2YWlsYWJsZSBGcm9tPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+QXZhaWxhYmxlIEZyb208L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkF2YWlsYWJpbGl0eVBlcmlvZCNnZXRBdmFpbGFibGVGcm9tKCkKLQkgKiBAc2VlICNnZXRBdmFpbGFiaWxpdHlQZXJpb2QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEF2YWlsYWJpbGl0eVBlcmlvZF9BdmFpbGFibGVGcm9tKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXZhaWxhYmlsaXR5UGVyaW9kI2dldEF2YWlsYWJsZVRvIDxlbT5BdmFpbGFibGUgVG88L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5BdmFpbGFibGUgVG88L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkF2YWlsYWJpbGl0eVBlcmlvZCNnZXRBdmFpbGFibGVUbygpCi0JICogQHNlZSAjZ2V0QXZhaWxhYmlsaXR5UGVyaW9kKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRBdmFpbGFiaWxpdHlQZXJpb2RfQXZhaWxhYmxlVG8oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5BdmFpbGFiaWxpdHlQZXJpb2QjZ2V0QXZhaWxhYmxlVW5pdHMgPGVtPkF2YWlsYWJsZSBVbml0czwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkF2YWlsYWJsZSBVbml0czwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXZhaWxhYmlsaXR5UGVyaW9kI2dldEF2YWlsYWJsZVVuaXRzKCkKLQkgKiBAc2VlICNnZXRBdmFpbGFiaWxpdHlQZXJpb2QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEF2YWlsYWJpbGl0eVBlcmlvZF9BdmFpbGFibGVVbml0cygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5BdmFpbGFiaWxpdHlQZXJpb2RzIDxlbT5BdmFpbGFiaWxpdHkgUGVyaW9kczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5BdmFpbGFiaWxpdHkgUGVyaW9kczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXZhaWxhYmlsaXR5UGVyaW9kcwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0QXZhaWxhYmlsaXR5UGVyaW9kcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXZhaWxhYmlsaXR5UGVyaW9kcyNnZXRBdmFpbGFiaWxpdHlQZXJpb2QgPGVtPkF2YWlsYWJpbGl0eSBQZXJpb2Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkF2YWlsYWJpbGl0eSBQZXJpb2Q8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkF2YWlsYWJpbGl0eVBlcmlvZHMjZ2V0QXZhaWxhYmlsaXR5UGVyaW9kKCkKLQkgKiBAc2VlICNnZXRBdmFpbGFiaWxpdHlQZXJpb2RzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRBdmFpbGFiaWxpdHlQZXJpb2RzX0F2YWlsYWJpbGl0eVBlcmlvZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZSA8ZW0+QmFzZWxpbmU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+QmFzZWxpbmU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRCYXNlbGluZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUjZ2V0VGltZXBoYXNlZERhdGEgPGVtPlRpbWVwaGFzZWQgRGF0YTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+VGltZXBoYXNlZCBEYXRhPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZSNnZXRUaW1lcGhhc2VkRGF0YSgpCi0JICogQHNlZSAjZ2V0QmFzZWxpbmUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldEJhc2VsaW5lX1RpbWVwaGFzZWREYXRhKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUjZ2V0TnVtYmVyIDxlbT5OdW1iZXI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5OdW1iZXI8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lI2dldE51bWJlcigpCi0JICogQHNlZSAjZ2V0QmFzZWxpbmUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEJhc2VsaW5lX051bWJlcigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lI2lzSW50ZXJpbSA8ZW0+SW50ZXJpbTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkludGVyaW08L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lI2lzSW50ZXJpbSgpCi0JICogQHNlZSAjZ2V0QmFzZWxpbmUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEJhc2VsaW5lX0ludGVyaW0oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZSNnZXRTdGFydCA8ZW0+U3RhcnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5TdGFydDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUjZ2V0U3RhcnQoKQotCSAqIEBzZWUgI2dldEJhc2VsaW5lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRCYXNlbGluZV9TdGFydCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lI2dldEZpbmlzaCA8ZW0+RmluaXNoPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RmluaXNoPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZSNnZXRGaW5pc2goKQotCSAqIEBzZWUgI2dldEJhc2VsaW5lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRCYXNlbGluZV9GaW5pc2goKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZSNnZXREdXJhdGlvbiA8ZW0+RHVyYXRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5EdXJhdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUjZ2V0RHVyYXRpb24oKQotCSAqIEBzZWUgI2dldEJhc2VsaW5lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRCYXNlbGluZV9EdXJhdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lI2dldER1cmF0aW9uRm9ybWF0IDxlbT5EdXJhdGlvbiBGb3JtYXQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5EdXJhdGlvbiBGb3JtYXQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lI2dldER1cmF0aW9uRm9ybWF0KCkKLQkgKiBAc2VlICNnZXRCYXNlbGluZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QmFzZWxpbmVfRHVyYXRpb25Gb3JtYXQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZSNpc0VzdGltYXRlZER1cmF0aW9uIDxlbT5Fc3RpbWF0ZWQgRHVyYXRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Fc3RpbWF0ZWQgRHVyYXRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lI2lzRXN0aW1hdGVkRHVyYXRpb24oKQotCSAqIEBzZWUgI2dldEJhc2VsaW5lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRCYXNlbGluZV9Fc3RpbWF0ZWREdXJhdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lI2dldFdvcmsgPGVtPldvcms8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Xb3JrPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZSNnZXRXb3JrKCkKLQkgKiBAc2VlICNnZXRCYXNlbGluZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QmFzZWxpbmVfV29yaygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lI2dldENvc3QgPGVtPkNvc3Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Db3N0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZSNnZXRDb3N0KCkKLQkgKiBAc2VlICNnZXRCYXNlbGluZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QmFzZWxpbmVfQ29zdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lI2dldEJDV1MgPGVtPkJDV1M8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5CQ1dTPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZSNnZXRCQ1dTKCkKLQkgKiBAc2VlICNnZXRCYXNlbGluZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QmFzZWxpbmVfQkNXUygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lI2dldEJDV1AgPGVtPkJDV1A8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5CQ1dQPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZSNnZXRCQ1dQKCkKLQkgKiBAc2VlICNnZXRCYXNlbGluZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QmFzZWxpbmVfQkNXUCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZTIgPGVtPkJhc2VsaW5lMjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5CYXNlbGluZTI8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lMgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0QmFzZWxpbmUyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUyI2dldE51bWJlciA8ZW0+TnVtYmVyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TnVtYmVyPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZTIjZ2V0TnVtYmVyKCkKLQkgKiBAc2VlICNnZXRCYXNlbGluZTIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEJhc2VsaW5lMl9OdW1iZXIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZTIjZ2V0V29yayA8ZW0+V29yazwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPldvcms8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lMiNnZXRXb3JrKCkKLQkgKiBAc2VlICNnZXRCYXNlbGluZTIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEJhc2VsaW5lMl9Xb3JrKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUyI2dldENvc3QgPGVtPkNvc3Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Db3N0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZTIjZ2V0Q29zdCgpCi0JICogQHNlZSAjZ2V0QmFzZWxpbmUyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRCYXNlbGluZTJfQ29zdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lMiNnZXRCQ1dTIDxlbT5CQ1dTPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+QkNXUzwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUyI2dldEJDV1MoKQotCSAqIEBzZWUgI2dldEJhc2VsaW5lMigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QmFzZWxpbmUyX0JDV1MoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZTIjZ2V0QkNXUCA8ZW0+QkNXUDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkJDV1A8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lMiNnZXRCQ1dQKCkKLQkgKiBAc2VlICNnZXRCYXNlbGluZTIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEJhc2VsaW5lMl9CQ1dQKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lMyA8ZW0+QmFzZWxpbmUzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkJhc2VsaW5lMzwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUzCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRCYXNlbGluZTMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lMyNnZXRUaW1lcGhhc2VkRGF0YSA8ZW0+VGltZXBoYXNlZCBEYXRhPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5UaW1lcGhhc2VkIERhdGE8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lMyNnZXRUaW1lcGhhc2VkRGF0YSgpCi0JICogQHNlZSAjZ2V0QmFzZWxpbmUzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRCYXNlbGluZTNfVGltZXBoYXNlZERhdGEoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZTMjZ2V0TnVtYmVyIDxlbT5OdW1iZXI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5OdW1iZXI8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lMyNnZXROdW1iZXIoKQotCSAqIEBzZWUgI2dldEJhc2VsaW5lMygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QmFzZWxpbmUzX051bWJlcigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lMyNnZXRTdGFydCA8ZW0+U3RhcnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5TdGFydDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUzI2dldFN0YXJ0KCkKLQkgKiBAc2VlICNnZXRCYXNlbGluZTMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEJhc2VsaW5lM19TdGFydCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lMyNnZXRGaW5pc2ggPGVtPkZpbmlzaDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkZpbmlzaDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUzI2dldEZpbmlzaCgpCi0JICogQHNlZSAjZ2V0QmFzZWxpbmUzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRCYXNlbGluZTNfRmluaXNoKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUzI2dldFdvcmsgPGVtPldvcms8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Xb3JrPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZTMjZ2V0V29yaygpCi0JICogQHNlZSAjZ2V0QmFzZWxpbmUzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRCYXNlbGluZTNfV29yaygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lMyNnZXRDb3N0IDxlbT5Db3N0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Q29zdDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUzI2dldENvc3QoKQotCSAqIEBzZWUgI2dldEJhc2VsaW5lMygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QmFzZWxpbmUzX0Nvc3QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZTMjZ2V0QkNXUyA8ZW0+QkNXUzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkJDV1M8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lMyNnZXRCQ1dTKCkKLQkgKiBAc2VlICNnZXRCYXNlbGluZTMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEJhc2VsaW5lM19CQ1dTKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUzI2dldEJDV1AgPGVtPkJDV1A8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5CQ1dQPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZTMjZ2V0QkNXUCgpCi0JICogQHNlZSAjZ2V0QmFzZWxpbmUzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRCYXNlbGluZTNfQkNXUCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5DYWxlbmRhciA8ZW0+Q2FsZW5kYXI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+Q2FsZW5kYXI8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkNhbGVuZGFyCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRDYWxlbmRhcigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkNhbGVuZGFyI2dldFVJRCA8ZW0+VUlEPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VUlEPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5DYWxlbmRhciNnZXRVSUQoKQotCSAqIEBzZWUgI2dldENhbGVuZGFyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRDYWxlbmRhcl9VSUQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5DYWxlbmRhciNnZXROYW1lIDxlbT5OYW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TmFtZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQ2FsZW5kYXIjZ2V0TmFtZSgpCi0JICogQHNlZSAjZ2V0Q2FsZW5kYXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldENhbGVuZGFyX05hbWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5DYWxlbmRhciNpc0lzQmFzZUNhbGVuZGFyIDxlbT5JcyBCYXNlIENhbGVuZGFyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SXMgQmFzZSBDYWxlbmRhcjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQ2FsZW5kYXIjaXNJc0Jhc2VDYWxlbmRhcigpCi0JICogQHNlZSAjZ2V0Q2FsZW5kYXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldENhbGVuZGFyX0lzQmFzZUNhbGVuZGFyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQ2FsZW5kYXIjZ2V0QmFzZUNhbGVuZGFyVUlEIDxlbT5CYXNlIENhbGVuZGFyIFVJRDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkJhc2UgQ2FsZW5kYXIgVUlEPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5DYWxlbmRhciNnZXRCYXNlQ2FsZW5kYXJVSUQoKQotCSAqIEBzZWUgI2dldENhbGVuZGFyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRDYWxlbmRhcl9CYXNlQ2FsZW5kYXJVSUQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5DYWxlbmRhciNnZXRXZWVrRGF5cyA8ZW0+V2VlayBEYXlzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+V2VlayBEYXlzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5DYWxlbmRhciNnZXRXZWVrRGF5cygpCi0JICogQHNlZSAjZ2V0Q2FsZW5kYXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldENhbGVuZGFyX1dlZWtEYXlzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkNhbGVuZGFycyA8ZW0+Q2FsZW5kYXJzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkNhbGVuZGFyczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQ2FsZW5kYXJzCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRDYWxlbmRhcnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkNhbGVuZGFycyNnZXRDYWxlbmRhciA8ZW0+Q2FsZW5kYXI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkNhbGVuZGFyPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5DYWxlbmRhcnMjZ2V0Q2FsZW5kYXIoKQotCSAqIEBzZWUgI2dldENhbGVuZGFycygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0Q2FsZW5kYXJzX0NhbGVuZGFyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkRvY3VtZW50Um9vdCA8ZW0+RG9jdW1lbnQgUm9vdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Eb2N1bWVudCBSb290PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Eb2N1bWVudFJvb3QKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldERvY3VtZW50Um9vdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRG9jdW1lbnRSb290I2dldE1peGVkIDxlbT5NaXhlZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+TWl4ZWQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkRvY3VtZW50Um9vdCNnZXRNaXhlZCgpCi0JICogQHNlZSAjZ2V0RG9jdW1lbnRSb290KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXREb2N1bWVudFJvb3RfTWl4ZWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgbWFwICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Eb2N1bWVudFJvb3QjZ2V0WE1MTlNQcmVmaXhNYXAgPGVtPlhNTE5TIFByZWZpeCBNYXA8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBtYXAgJzxlbT5YTUxOUyBQcmVmaXggTWFwPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Eb2N1bWVudFJvb3QjZ2V0WE1MTlNQcmVmaXhNYXAoKQotCSAqIEBzZWUgI2dldERvY3VtZW50Um9vdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0RG9jdW1lbnRSb290X1hNTE5TUHJlZml4TWFwKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIG1hcCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRG9jdW1lbnRSb290I2dldFhTSVNjaGVtYUxvY2F0aW9uIDxlbT5YU0kgU2NoZW1hIExvY2F0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgbWFwICc8ZW0+WFNJIFNjaGVtYSBMb2NhdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRG9jdW1lbnRSb290I2dldFhTSVNjaGVtYUxvY2F0aW9uKCkKLQkgKiBAc2VlICNnZXREb2N1bWVudFJvb3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldERvY3VtZW50Um9vdF9YU0lTY2hlbWFMb2NhdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkRvY3VtZW50Um9vdCNnZXRQcm9qZWN0IDxlbT5Qcm9qZWN0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+UHJvamVjdDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRG9jdW1lbnRSb290I2dldFByb2plY3QoKQotCSAqIEBzZWUgI2dldERvY3VtZW50Um9vdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0RG9jdW1lbnRSb290X1Byb2plY3QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUgPGVtPkV4dGVuZGVkIEF0dHJpYnV0ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5FeHRlbmRlZCBBdHRyaWJ1dGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRFeHRlbmRlZEF0dHJpYnV0ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlI2dldEZpZWxkSUQgPGVtPkZpZWxkIElEPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RmllbGQgSUQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlI2dldEZpZWxkSUQoKQotCSAqIEBzZWUgI2dldEV4dGVuZGVkQXR0cmlidXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRFeHRlbmRlZEF0dHJpYnV0ZV9GaWVsZElEKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUjZ2V0RmllbGROYW1lIDxlbT5GaWVsZCBOYW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RmllbGQgTmFtZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUjZ2V0RmllbGROYW1lKCkKLQkgKiBAc2VlICNnZXRFeHRlbmRlZEF0dHJpYnV0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RXh0ZW5kZWRBdHRyaWJ1dGVfRmllbGROYW1lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUjZ2V0QWxpYXMgPGVtPkFsaWFzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+QWxpYXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlI2dldEFsaWFzKCkKLQkgKiBAc2VlICNnZXRFeHRlbmRlZEF0dHJpYnV0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RXh0ZW5kZWRBdHRyaWJ1dGVfQWxpYXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZSNnZXRQaG9uZXRpY0FsaWFzIDxlbT5QaG9uZXRpYyBBbGlhczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlBob25ldGljIEFsaWFzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZSNnZXRQaG9uZXRpY0FsaWFzKCkKLQkgKiBAc2VlICNnZXRFeHRlbmRlZEF0dHJpYnV0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RXh0ZW5kZWRBdHRyaWJ1dGVfUGhvbmV0aWNBbGlhcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlI2dldFJvbGx1cFR5cGUgPGVtPlJvbGx1cCBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Um9sbHVwIFR5cGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlI2dldFJvbGx1cFR5cGUoKQotCSAqIEBzZWUgI2dldEV4dGVuZGVkQXR0cmlidXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRFeHRlbmRlZEF0dHJpYnV0ZV9Sb2xsdXBUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUjZ2V0Q2FsY3VsYXRpb25UeXBlIDxlbT5DYWxjdWxhdGlvbiBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Q2FsY3VsYXRpb24gVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUjZ2V0Q2FsY3VsYXRpb25UeXBlKCkKLQkgKiBAc2VlICNnZXRFeHRlbmRlZEF0dHJpYnV0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RXh0ZW5kZWRBdHRyaWJ1dGVfQ2FsY3VsYXRpb25UeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUjZ2V0Rm9ybXVsYSA8ZW0+Rm9ybXVsYTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkZvcm11bGE8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlI2dldEZvcm11bGEoKQotCSAqIEBzZWUgI2dldEV4dGVuZGVkQXR0cmlidXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRFeHRlbmRlZEF0dHJpYnV0ZV9Gb3JtdWxhKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUjaXNSZXN0cmljdFZhbHVlcyA8ZW0+UmVzdHJpY3QgVmFsdWVzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UmVzdHJpY3QgVmFsdWVzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZSNpc1Jlc3RyaWN0VmFsdWVzKCkKLQkgKiBAc2VlICNnZXRFeHRlbmRlZEF0dHJpYnV0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RXh0ZW5kZWRBdHRyaWJ1dGVfUmVzdHJpY3RWYWx1ZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZSNnZXRWYWx1ZWxpc3RTb3J0T3JkZXIgPGVtPlZhbHVlbGlzdCBTb3J0IE9yZGVyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VmFsdWVsaXN0IFNvcnQgT3JkZXI8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlI2dldFZhbHVlbGlzdFNvcnRPcmRlcigpCi0JICogQHNlZSAjZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEV4dGVuZGVkQXR0cmlidXRlX1ZhbHVlbGlzdFNvcnRPcmRlcigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlI2lzQXBwZW5kTmV3VmFsdWVzIDxlbT5BcHBlbmQgTmV3IFZhbHVlczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkFwcGVuZCBOZXcgVmFsdWVzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZSNpc0FwcGVuZE5ld1ZhbHVlcygpCi0JICogQHNlZSAjZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEV4dGVuZGVkQXR0cmlidXRlX0FwcGVuZE5ld1ZhbHVlcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlI2dldERlZmF1bHQgPGVtPkRlZmF1bHQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5EZWZhdWx0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZSNnZXREZWZhdWx0KCkKLQkgKiBAc2VlICNnZXRFeHRlbmRlZEF0dHJpYnV0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RXh0ZW5kZWRBdHRyaWJ1dGVfRGVmYXVsdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlI2dldFZhbHVlTGlzdCA8ZW0+VmFsdWUgTGlzdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPlZhbHVlIExpc3Q8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlI2dldFZhbHVlTGlzdCgpCi0JICogQHNlZSAjZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldEV4dGVuZGVkQXR0cmlidXRlX1ZhbHVlTGlzdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZTIgPGVtPkV4dGVuZGVkIEF0dHJpYnV0ZTI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+RXh0ZW5kZWQgQXR0cmlidXRlMjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUyCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRFeHRlbmRlZEF0dHJpYnV0ZTIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZTIjZ2V0VUlEIDxlbT5VSUQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5VSUQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlMiNnZXRVSUQoKQotCSAqIEBzZWUgI2dldEV4dGVuZGVkQXR0cmlidXRlMigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUyX1VJRCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlMiNnZXRGaWVsZElEIDxlbT5GaWVsZCBJRDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkZpZWxkIElEPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZTIjZ2V0RmllbGRJRCgpCi0JICogQHNlZSAjZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRFeHRlbmRlZEF0dHJpYnV0ZTJfRmllbGRJRCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlMiNnZXRWYWx1ZSA8ZW0+VmFsdWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5WYWx1ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUyI2dldFZhbHVlKCkKLQkgKiBAc2VlICNnZXRFeHRlbmRlZEF0dHJpYnV0ZTIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEV4dGVuZGVkQXR0cmlidXRlMl9WYWx1ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlMiNnZXRWYWx1ZUlEIDxlbT5WYWx1ZSBJRDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlZhbHVlIElEPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZTIjZ2V0VmFsdWVJRCgpCi0JICogQHNlZSAjZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRFeHRlbmRlZEF0dHJpYnV0ZTJfVmFsdWVJRCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlMiNnZXREdXJhdGlvbkZvcm1hdCA8ZW0+RHVyYXRpb24gRm9ybWF0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RHVyYXRpb24gRm9ybWF0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZTIjZ2V0RHVyYXRpb25Gb3JtYXQoKQotCSAqIEBzZWUgI2dldEV4dGVuZGVkQXR0cmlidXRlMigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUyX0R1cmF0aW9uRm9ybWF0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlMyA8ZW0+RXh0ZW5kZWQgQXR0cmlidXRlMzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5FeHRlbmRlZCBBdHRyaWJ1dGUzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZTMKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldEV4dGVuZGVkQXR0cmlidXRlMygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlMyNnZXRVSUQgPGVtPlVJRDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlVJRDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUzI2dldFVJRCgpCi0JICogQHNlZSAjZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRFeHRlbmRlZEF0dHJpYnV0ZTNfVUlEKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUzI2dldEZpZWxkSUQgPGVtPkZpZWxkIElEPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RmllbGQgSUQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlMyNnZXRGaWVsZElEKCkKLQkgKiBAc2VlICNnZXRFeHRlbmRlZEF0dHJpYnV0ZTMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEV4dGVuZGVkQXR0cmlidXRlM19GaWVsZElEKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUzI2dldFZhbHVlIDxlbT5WYWx1ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlZhbHVlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZTMjZ2V0VmFsdWUoKQotCSAqIEBzZWUgI2dldEV4dGVuZGVkQXR0cmlidXRlMygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUzX1ZhbHVlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUzI2dldFZhbHVlSUQgPGVtPlZhbHVlIElEPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VmFsdWUgSUQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlMyNnZXRWYWx1ZUlEKCkKLQkgKiBAc2VlICNnZXRFeHRlbmRlZEF0dHJpYnV0ZTMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEV4dGVuZGVkQXR0cmlidXRlM19WYWx1ZUlEKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUzI2dldER1cmF0aW9uRm9ybWF0IDxlbT5EdXJhdGlvbiBGb3JtYXQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5EdXJhdGlvbiBGb3JtYXQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlMyNnZXREdXJhdGlvbkZvcm1hdCgpCi0JICogQHNlZSAjZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRFeHRlbmRlZEF0dHJpYnV0ZTNfRHVyYXRpb25Gb3JtYXQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGU0IDxlbT5FeHRlbmRlZCBBdHRyaWJ1dGU0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkV4dGVuZGVkIEF0dHJpYnV0ZTQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlNAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0RXh0ZW5kZWRBdHRyaWJ1dGU0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGU0I2dldFVJRCA8ZW0+VUlEPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VUlEPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZTQjZ2V0VUlEKCkKLQkgKiBAc2VlICNnZXRFeHRlbmRlZEF0dHJpYnV0ZTQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEV4dGVuZGVkQXR0cmlidXRlNF9VSUQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZTQjZ2V0RmllbGRJRCA8ZW0+RmllbGQgSUQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5GaWVsZCBJRDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGU0I2dldEZpZWxkSUQoKQotCSAqIEBzZWUgI2dldEV4dGVuZGVkQXR0cmlidXRlNCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RXh0ZW5kZWRBdHRyaWJ1dGU0X0ZpZWxkSUQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZTQjZ2V0VmFsdWUgPGVtPlZhbHVlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VmFsdWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlNCNnZXRWYWx1ZSgpCi0JICogQHNlZSAjZ2V0RXh0ZW5kZWRBdHRyaWJ1dGU0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRFeHRlbmRlZEF0dHJpYnV0ZTRfVmFsdWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZTQjZ2V0VmFsdWVJRCA8ZW0+VmFsdWUgSUQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5WYWx1ZSBJRDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGU0I2dldFZhbHVlSUQoKQotCSAqIEBzZWUgI2dldEV4dGVuZGVkQXR0cmlidXRlNCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RXh0ZW5kZWRBdHRyaWJ1dGU0X1ZhbHVlSUQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZTQjZ2V0RHVyYXRpb25Gb3JtYXQgPGVtPkR1cmF0aW9uIEZvcm1hdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkR1cmF0aW9uIEZvcm1hdDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGU0I2dldER1cmF0aW9uRm9ybWF0KCkKLQkgKiBAc2VlICNnZXRFeHRlbmRlZEF0dHJpYnV0ZTQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEV4dGVuZGVkQXR0cmlidXRlNF9EdXJhdGlvbkZvcm1hdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZXMgPGVtPkV4dGVuZGVkIEF0dHJpYnV0ZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+RXh0ZW5kZWQgQXR0cmlidXRlczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGVzCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRFeHRlbmRlZEF0dHJpYnV0ZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlcyNnZXRFeHRlbmRlZEF0dHJpYnV0ZSA8ZW0+RXh0ZW5kZWQgQXR0cmlidXRlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5FeHRlbmRlZCBBdHRyaWJ1dGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlcyNnZXRFeHRlbmRlZEF0dHJpYnV0ZSgpCi0JICogQHNlZSAjZ2V0RXh0ZW5kZWRBdHRyaWJ1dGVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRFeHRlbmRlZEF0dHJpYnV0ZXNfRXh0ZW5kZWRBdHRyaWJ1dGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTWFzayA8ZW0+TWFzazwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5NYXNrPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5NYXNrCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRNYXNrKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTWFzayNnZXRMZXZlbCA8ZW0+TGV2ZWw8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5MZXZlbDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTWFzayNnZXRMZXZlbCgpCi0JICogQHNlZSAjZ2V0TWFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0TWFza19MZXZlbCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1hc2sjZ2V0VHlwZSA8ZW0+VHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlR5cGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1hc2sjZ2V0VHlwZSgpCi0JICogQHNlZSAjZ2V0TWFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0TWFza19UeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTWFzayNnZXRMZW5ndGggPGVtPkxlbmd0aDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkxlbmd0aDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTWFzayNnZXRMZW5ndGgoKQotCSAqIEBzZWUgI2dldE1hc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldE1hc2tfTGVuZ3RoKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTWFzayNnZXRTZXBhcmF0b3IgPGVtPlNlcGFyYXRvcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlNlcGFyYXRvcjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTWFzayNnZXRTZXBhcmF0b3IoKQotCSAqIEBzZWUgI2dldE1hc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldE1hc2tfU2VwYXJhdG9yKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1hc2tzIDxlbT5NYXNrczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5NYXNrczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTWFza3MKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldE1hc2tzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5NYXNrcyNnZXRNYXNrIDxlbT5NYXNrPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5NYXNrPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5NYXNrcyNnZXRNYXNrKCkKLQkgKiBAc2VlICNnZXRNYXNrcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0TWFza3NfTWFzaygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZSA8ZW0+T3V0bGluZSBDb2RlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPk91dGxpbmUgQ29kZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldE91dGxpbmVDb2RlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGUjZ2V0RmllbGRJRCA8ZW0+RmllbGQgSUQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5GaWVsZCBJRDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGUjZ2V0RmllbGRJRCgpCi0JICogQHNlZSAjZ2V0T3V0bGluZUNvZGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldE91dGxpbmVDb2RlX0ZpZWxkSUQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZSNnZXRGaWVsZE5hbWUgPGVtPkZpZWxkIE5hbWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5GaWVsZCBOYW1lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZSNnZXRGaWVsZE5hbWUoKQotCSAqIEBzZWUgI2dldE91dGxpbmVDb2RlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRPdXRsaW5lQ29kZV9GaWVsZE5hbWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZSNnZXRBbGlhcyA8ZW0+QWxpYXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5BbGlhczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGUjZ2V0QWxpYXMoKQotCSAqIEBzZWUgI2dldE91dGxpbmVDb2RlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRPdXRsaW5lQ29kZV9BbGlhcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlI2dldFBob25ldGljQWxpYXMgPGVtPlBob25ldGljIEFsaWFzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UGhvbmV0aWMgQWxpYXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlI2dldFBob25ldGljQWxpYXMoKQotCSAqIEBzZWUgI2dldE91dGxpbmVDb2RlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRPdXRsaW5lQ29kZV9QaG9uZXRpY0FsaWFzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGUjZ2V0VmFsdWVzIDxlbT5WYWx1ZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5WYWx1ZXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlI2dldFZhbHVlcygpCi0JICogQHNlZSAjZ2V0T3V0bGluZUNvZGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldE91dGxpbmVDb2RlX1ZhbHVlcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlI2lzRW50ZXJwcmlzZSA8ZW0+RW50ZXJwcmlzZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkVudGVycHJpc2U8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlI2lzRW50ZXJwcmlzZSgpCi0JICogQHNlZSAjZ2V0T3V0bGluZUNvZGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldE91dGxpbmVDb2RlX0VudGVycHJpc2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZSNnZXRFbnRlcnByaXNlT3V0bGluZUNvZGVBbGlhcyA8ZW0+RW50ZXJwcmlzZSBPdXRsaW5lIENvZGUgQWxpYXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5FbnRlcnByaXNlIE91dGxpbmUgQ29kZSBBbGlhczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGUjZ2V0RW50ZXJwcmlzZU91dGxpbmVDb2RlQWxpYXMoKQotCSAqIEBzZWUgI2dldE91dGxpbmVDb2RlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRPdXRsaW5lQ29kZV9FbnRlcnByaXNlT3V0bGluZUNvZGVBbGlhcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlI2lzUmVzb3VyY2VTdWJzdGl0dXRpb25FbmFibGVkIDxlbT5SZXNvdXJjZSBTdWJzdGl0dXRpb24gRW5hYmxlZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlJlc291cmNlIFN1YnN0aXR1dGlvbiBFbmFibGVkPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZSNpc1Jlc291cmNlU3Vic3RpdHV0aW9uRW5hYmxlZCgpCi0JICogQHNlZSAjZ2V0T3V0bGluZUNvZGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldE91dGxpbmVDb2RlX1Jlc291cmNlU3Vic3RpdHV0aW9uRW5hYmxlZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlI2lzTGVhZk9ubHkgPGVtPkxlYWYgT25seTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkxlYWYgT25seTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGUjaXNMZWFmT25seSgpCi0JICogQHNlZSAjZ2V0T3V0bGluZUNvZGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldE91dGxpbmVDb2RlX0xlYWZPbmx5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGUjaXNBbGxMZXZlbHNSZXF1aXJlZCA8ZW0+QWxsIExldmVscyBSZXF1aXJlZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkFsbCBMZXZlbHMgUmVxdWlyZWQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlI2lzQWxsTGV2ZWxzUmVxdWlyZWQoKQotCSAqIEBzZWUgI2dldE91dGxpbmVDb2RlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRPdXRsaW5lQ29kZV9BbGxMZXZlbHNSZXF1aXJlZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlI2lzT25seVRhYmxlVmFsdWVzQWxsb3dlZCA8ZW0+T25seSBUYWJsZSBWYWx1ZXMgQWxsb3dlZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk9ubHkgVGFibGUgVmFsdWVzIEFsbG93ZWQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlI2lzT25seVRhYmxlVmFsdWVzQWxsb3dlZCgpCi0JICogQHNlZSAjZ2V0T3V0bGluZUNvZGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldE91dGxpbmVDb2RlX09ubHlUYWJsZVZhbHVlc0FsbG93ZWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZSNnZXRNYXNrcyA8ZW0+TWFza3M8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5NYXNrczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGUjZ2V0TWFza3MoKQotCSAqIEBzZWUgI2dldE91dGxpbmVDb2RlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRPdXRsaW5lQ29kZV9NYXNrcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZTIgPGVtPk91dGxpbmUgQ29kZTI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+T3V0bGluZSBDb2RlMjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGUyCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRPdXRsaW5lQ29kZTIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZTIjZ2V0VUlEIDxlbT5VSUQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5VSUQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlMiNnZXRVSUQoKQotCSAqIEBzZWUgI2dldE91dGxpbmVDb2RlMigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0T3V0bGluZUNvZGUyX1VJRCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlMiNnZXRGaWVsZElEIDxlbT5GaWVsZCBJRDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkZpZWxkIElEPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZTIjZ2V0RmllbGRJRCgpCi0JICogQHNlZSAjZ2V0T3V0bGluZUNvZGUyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRPdXRsaW5lQ29kZTJfRmllbGRJRCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlMiNnZXRWYWx1ZUlEIDxlbT5WYWx1ZSBJRDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlZhbHVlIElEPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZTIjZ2V0VmFsdWVJRCgpCi0JICogQHNlZSAjZ2V0T3V0bGluZUNvZGUyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRPdXRsaW5lQ29kZTJfVmFsdWVJRCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZTMgPGVtPk91dGxpbmUgQ29kZTM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+T3V0bGluZSBDb2RlMzwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGUzCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRPdXRsaW5lQ29kZTMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZTMjZ2V0VUlEIDxlbT5VSUQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5VSUQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlMyNnZXRVSUQoKQotCSAqIEBzZWUgI2dldE91dGxpbmVDb2RlMygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0T3V0bGluZUNvZGUzX1VJRCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlMyNnZXRGaWVsZElEIDxlbT5GaWVsZCBJRDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkZpZWxkIElEPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZTMjZ2V0RmllbGRJRCgpCi0JICogQHNlZSAjZ2V0T3V0bGluZUNvZGUzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRPdXRsaW5lQ29kZTNfRmllbGRJRCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlMyNnZXRWYWx1ZUlEIDxlbT5WYWx1ZSBJRDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlZhbHVlIElEPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZTMjZ2V0VmFsdWVJRCgpCi0JICogQHNlZSAjZ2V0T3V0bGluZUNvZGUzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRPdXRsaW5lQ29kZTNfVmFsdWVJRCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZXMgPGVtPk91dGxpbmUgQ29kZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+T3V0bGluZSBDb2RlczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGVzCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRPdXRsaW5lQ29kZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlcyNnZXRPdXRsaW5lQ29kZSA8ZW0+T3V0bGluZSBDb2RlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5PdXRsaW5lIENvZGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlcyNnZXRPdXRsaW5lQ29kZSgpCi0JICogQHNlZSAjZ2V0T3V0bGluZUNvZGVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRPdXRsaW5lQ29kZXNfT3V0bGluZUNvZGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJlZGVjZXNzb3JMaW5rIDxlbT5QcmVkZWNlc3NvciBMaW5rPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlByZWRlY2Vzc29yIExpbms8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByZWRlY2Vzc29yTGluawotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0UHJlZGVjZXNzb3JMaW5rKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJlZGVjZXNzb3JMaW5rI2dldFByZWRlY2Vzc29yVUlEIDxlbT5QcmVkZWNlc3NvciBVSUQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5QcmVkZWNlc3NvciBVSUQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByZWRlY2Vzc29yTGluayNnZXRQcmVkZWNlc3NvclVJRCgpCi0JICogQHNlZSAjZ2V0UHJlZGVjZXNzb3JMaW5rKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcmVkZWNlc3NvckxpbmtfUHJlZGVjZXNzb3JVSUQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5QcmVkZWNlc3NvckxpbmsjZ2V0VHlwZSA8ZW0+VHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlR5cGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByZWRlY2Vzc29yTGluayNnZXRUeXBlKCkKLQkgKiBAc2VlICNnZXRQcmVkZWNlc3NvckxpbmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFByZWRlY2Vzc29yTGlua19UeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJlZGVjZXNzb3JMaW5rI2lzQ3Jvc3NQcm9qZWN0IDxlbT5Dcm9zcyBQcm9qZWN0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Q3Jvc3MgUHJvamVjdDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJlZGVjZXNzb3JMaW5rI2lzQ3Jvc3NQcm9qZWN0KCkKLQkgKiBAc2VlICNnZXRQcmVkZWNlc3NvckxpbmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFByZWRlY2Vzc29yTGlua19Dcm9zc1Byb2plY3QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5QcmVkZWNlc3NvckxpbmsjZ2V0Q3Jvc3NQcm9qZWN0TmFtZSA8ZW0+Q3Jvc3MgUHJvamVjdCBOYW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Q3Jvc3MgUHJvamVjdCBOYW1lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5QcmVkZWNlc3NvckxpbmsjZ2V0Q3Jvc3NQcm9qZWN0TmFtZSgpCi0JICogQHNlZSAjZ2V0UHJlZGVjZXNzb3JMaW5rKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcmVkZWNlc3NvckxpbmtfQ3Jvc3NQcm9qZWN0TmFtZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByZWRlY2Vzc29yTGluayNnZXRMaW5rTGFnIDxlbT5MaW5rIExhZzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkxpbmsgTGFnPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5QcmVkZWNlc3NvckxpbmsjZ2V0TGlua0xhZygpCi0JICogQHNlZSAjZ2V0UHJlZGVjZXNzb3JMaW5rKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcmVkZWNlc3NvckxpbmtfTGlua0xhZygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByZWRlY2Vzc29yTGluayNnZXRMYWdGb3JtYXQgPGVtPkxhZyBGb3JtYXQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5MYWcgRm9ybWF0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5QcmVkZWNlc3NvckxpbmsjZ2V0TGFnRm9ybWF0KCkKLQkgKiBAc2VlICNnZXRQcmVkZWNlc3NvckxpbmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFByZWRlY2Vzc29yTGlua19MYWdGb3JtYXQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCA8ZW0+UHJvamVjdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Qcm9qZWN0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRQcm9qZWN0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRVSUQgPGVtPlVJRDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlVJRDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRVSUQoKQotCSAqIEBzZWUgI2dldFByb2plY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFByb2plY3RfVUlEKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXROYW1lIDxlbT5OYW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TmFtZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXROYW1lKCkKLQkgKiBAc2VlICNnZXRQcm9qZWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X05hbWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldFRpdGxlIDxlbT5UaXRsZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlRpdGxlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldFRpdGxlKCkKLQkgKiBAc2VlICNnZXRQcm9qZWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X1RpdGxlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRTdWJqZWN0IDxlbT5TdWJqZWN0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+U3ViamVjdDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRTdWJqZWN0KCkKLQkgKiBAc2VlICNnZXRQcm9qZWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X1N1YmplY3QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldENhdGVnb3J5IDxlbT5DYXRlZ29yeTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkNhdGVnb3J5PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldENhdGVnb3J5KCkKLQkgKiBAc2VlICNnZXRQcm9qZWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X0NhdGVnb3J5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRDb21wYW55IDxlbT5Db21wYW55PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Q29tcGFueTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRDb21wYW55KCkKLQkgKiBAc2VlICNnZXRQcm9qZWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X0NvbXBhbnkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldE1hbmFnZXIgPGVtPk1hbmFnZXI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5NYW5hZ2VyPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldE1hbmFnZXIoKQotCSAqIEBzZWUgI2dldFByb2plY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFByb2plY3RfTWFuYWdlcigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0QXV0aG9yIDxlbT5BdXRob3I8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5BdXRob3I8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0QXV0aG9yKCkKLQkgKiBAc2VlICNnZXRQcm9qZWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X0F1dGhvcigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0Q3JlYXRpb25EYXRlIDxlbT5DcmVhdGlvbiBEYXRlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Q3JlYXRpb24gRGF0ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRDcmVhdGlvbkRhdGUoKQotCSAqIEBzZWUgI2dldFByb2plY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFByb2plY3RfQ3JlYXRpb25EYXRlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRSZXZpc2lvbiA8ZW0+UmV2aXNpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5SZXZpc2lvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRSZXZpc2lvbigpCi0JICogQHNlZSAjZ2V0UHJvamVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9SZXZpc2lvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0TGFzdFNhdmVkIDxlbT5MYXN0IFNhdmVkPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TGFzdCBTYXZlZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRMYXN0U2F2ZWQoKQotCSAqIEBzZWUgI2dldFByb2plY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFByb2plY3RfTGFzdFNhdmVkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc1NjaGVkdWxlRnJvbVN0YXJ0IDxlbT5TY2hlZHVsZSBGcm9tIFN0YXJ0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+U2NoZWR1bGUgRnJvbSBTdGFydDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc1NjaGVkdWxlRnJvbVN0YXJ0KCkKLQkgKiBAc2VlICNnZXRQcm9qZWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X1NjaGVkdWxlRnJvbVN0YXJ0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRTdGFydERhdGUgPGVtPlN0YXJ0IERhdGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5TdGFydCBEYXRlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldFN0YXJ0RGF0ZSgpCi0JICogQHNlZSAjZ2V0UHJvamVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9TdGFydERhdGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldEZpbmlzaERhdGUgPGVtPkZpbmlzaCBEYXRlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RmluaXNoIERhdGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0RmluaXNoRGF0ZSgpCi0JICogQHNlZSAjZ2V0UHJvamVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9GaW5pc2hEYXRlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRGWVN0YXJ0RGF0ZSA8ZW0+RlkgU3RhcnQgRGF0ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkZZIFN0YXJ0IERhdGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0RllTdGFydERhdGUoKQotCSAqIEBzZWUgI2dldFByb2plY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFByb2plY3RfRllTdGFydERhdGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldENyaXRpY2FsU2xhY2tMaW1pdCA8ZW0+Q3JpdGljYWwgU2xhY2sgTGltaXQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Dcml0aWNhbCBTbGFjayBMaW1pdDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRDcml0aWNhbFNsYWNrTGltaXQoKQotCSAqIEBzZWUgI2dldFByb2plY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFByb2plY3RfQ3JpdGljYWxTbGFja0xpbWl0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRDdXJyZW5jeURpZ2l0cyA8ZW0+Q3VycmVuY3kgRGlnaXRzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Q3VycmVuY3kgRGlnaXRzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldEN1cnJlbmN5RGlnaXRzKCkKLQkgKiBAc2VlICNnZXRQcm9qZWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X0N1cnJlbmN5RGlnaXRzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRDdXJyZW5jeVN5bWJvbCA8ZW0+Q3VycmVuY3kgU3ltYm9sPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Q3VycmVuY3kgU3ltYm9sPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldEN1cnJlbmN5U3ltYm9sKCkKLQkgKiBAc2VlICNnZXRQcm9qZWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X0N1cnJlbmN5U3ltYm9sKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRDdXJyZW5jeVN5bWJvbFBvc2l0aW9uIDxlbT5DdXJyZW5jeSBTeW1ib2wgUG9zaXRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5DdXJyZW5jeSBTeW1ib2wgUG9zaXRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0Q3VycmVuY3lTeW1ib2xQb3NpdGlvbigpCi0JICogQHNlZSAjZ2V0UHJvamVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9DdXJyZW5jeVN5bWJvbFBvc2l0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRDYWxlbmRhclVJRCA8ZW0+Q2FsZW5kYXIgVUlEPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Q2FsZW5kYXIgVUlEPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldENhbGVuZGFyVUlEKCkKLQkgKiBAc2VlICNnZXRQcm9qZWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X0NhbGVuZGFyVUlEKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXREZWZhdWx0U3RhcnRUaW1lIDxlbT5EZWZhdWx0IFN0YXJ0IFRpbWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5EZWZhdWx0IFN0YXJ0IFRpbWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0RGVmYXVsdFN0YXJ0VGltZSgpCi0JICogQHNlZSAjZ2V0UHJvamVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9EZWZhdWx0U3RhcnRUaW1lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXREZWZhdWx0RmluaXNoVGltZSA8ZW0+RGVmYXVsdCBGaW5pc2ggVGltZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkRlZmF1bHQgRmluaXNoIFRpbWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0RGVmYXVsdEZpbmlzaFRpbWUoKQotCSAqIEBzZWUgI2dldFByb2plY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFByb2plY3RfRGVmYXVsdEZpbmlzaFRpbWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldE1pbnV0ZXNQZXJEYXkgPGVtPk1pbnV0ZXMgUGVyIERheTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk1pbnV0ZXMgUGVyIERheTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRNaW51dGVzUGVyRGF5KCkKLQkgKiBAc2VlICNnZXRQcm9qZWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X01pbnV0ZXNQZXJEYXkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldE1pbnV0ZXNQZXJXZWVrIDxlbT5NaW51dGVzIFBlciBXZWVrPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TWludXRlcyBQZXIgV2VlazwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRNaW51dGVzUGVyV2VlaygpCi0JICogQHNlZSAjZ2V0UHJvamVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9NaW51dGVzUGVyV2VlaygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0RGF5c1Blck1vbnRoIDxlbT5EYXlzIFBlciBNb250aDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkRheXMgUGVyIE1vbnRoPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldERheXNQZXJNb250aCgpCi0JICogQHNlZSAjZ2V0UHJvamVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9EYXlzUGVyTW9udGgoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldERlZmF1bHRUYXNrVHlwZSA8ZW0+RGVmYXVsdCBUYXNrIFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5EZWZhdWx0IFRhc2sgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXREZWZhdWx0VGFza1R5cGUoKQotCSAqIEBzZWUgI2dldFByb2plY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFByb2plY3RfRGVmYXVsdFRhc2tUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXREZWZhdWx0Rml4ZWRDb3N0QWNjcnVhbCA8ZW0+RGVmYXVsdCBGaXhlZCBDb3N0IEFjY3J1YWw8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5EZWZhdWx0IEZpeGVkIENvc3QgQWNjcnVhbDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXREZWZhdWx0Rml4ZWRDb3N0QWNjcnVhbCgpCi0JICogQHNlZSAjZ2V0UHJvamVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9EZWZhdWx0Rml4ZWRDb3N0QWNjcnVhbCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0RGVmYXVsdFN0YW5kYXJkUmF0ZSA8ZW0+RGVmYXVsdCBTdGFuZGFyZCBSYXRlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RGVmYXVsdCBTdGFuZGFyZCBSYXRlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldERlZmF1bHRTdGFuZGFyZFJhdGUoKQotCSAqIEBzZWUgI2dldFByb2plY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFByb2plY3RfRGVmYXVsdFN0YW5kYXJkUmF0ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0RGVmYXVsdE92ZXJ0aW1lUmF0ZSA8ZW0+RGVmYXVsdCBPdmVydGltZSBSYXRlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RGVmYXVsdCBPdmVydGltZSBSYXRlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldERlZmF1bHRPdmVydGltZVJhdGUoKQotCSAqIEBzZWUgI2dldFByb2plY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFByb2plY3RfRGVmYXVsdE92ZXJ0aW1lUmF0ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0RHVyYXRpb25Gb3JtYXQgPGVtPkR1cmF0aW9uIEZvcm1hdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkR1cmF0aW9uIEZvcm1hdDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXREdXJhdGlvbkZvcm1hdCgpCi0JICogQHNlZSAjZ2V0UHJvamVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9EdXJhdGlvbkZvcm1hdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0V29ya0Zvcm1hdCA8ZW0+V29yayBGb3JtYXQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Xb3JrIEZvcm1hdDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRXb3JrRm9ybWF0KCkKLQkgKiBAc2VlICNnZXRQcm9qZWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X1dvcmtGb3JtYXQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzRWRpdGFibGVBY3R1YWxDb3N0cyA8ZW0+RWRpdGFibGUgQWN0dWFsIENvc3RzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RWRpdGFibGUgQWN0dWFsIENvc3RzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzRWRpdGFibGVBY3R1YWxDb3N0cygpCi0JICogQHNlZSAjZ2V0UHJvamVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9FZGl0YWJsZUFjdHVhbENvc3RzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc0hvbm9yQ29uc3RyYWludHMgPGVtPkhvbm9yIENvbnN0cmFpbnRzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SG9ub3IgQ29uc3RyYWludHM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNIb25vckNvbnN0cmFpbnRzKCkKLQkgKiBAc2VlICNnZXRQcm9qZWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X0hvbm9yQ29uc3RyYWludHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldEVhcm5lZFZhbHVlTWV0aG9kIDxlbT5FYXJuZWQgVmFsdWUgTWV0aG9kPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RWFybmVkIFZhbHVlIE1ldGhvZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRFYXJuZWRWYWx1ZU1ldGhvZCgpCi0JICogQHNlZSAjZ2V0UHJvamVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9FYXJuZWRWYWx1ZU1ldGhvZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNJbnNlcnRlZFByb2plY3RzTGlrZVN1bW1hcnkgPGVtPkluc2VydGVkIFByb2plY3RzIExpa2UgU3VtbWFyeTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkluc2VydGVkIFByb2plY3RzIExpa2UgU3VtbWFyeTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc0luc2VydGVkUHJvamVjdHNMaWtlU3VtbWFyeSgpCi0JICogQHNlZSAjZ2V0UHJvamVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9JbnNlcnRlZFByb2plY3RzTGlrZVN1bW1hcnkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzTXVsdGlwbGVDcml0aWNhbFBhdGhzIDxlbT5NdWx0aXBsZSBDcml0aWNhbCBQYXRoczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk11bHRpcGxlIENyaXRpY2FsIFBhdGhzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzTXVsdGlwbGVDcml0aWNhbFBhdGhzKCkKLQkgKiBAc2VlICNnZXRQcm9qZWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X011bHRpcGxlQ3JpdGljYWxQYXRocygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNOZXdUYXNrc0VmZm9ydERyaXZlbiA8ZW0+TmV3IFRhc2tzIEVmZm9ydCBEcml2ZW48L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5OZXcgVGFza3MgRWZmb3J0IERyaXZlbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc05ld1Rhc2tzRWZmb3J0RHJpdmVuKCkKLQkgKiBAc2VlICNnZXRQcm9qZWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X05ld1Rhc2tzRWZmb3J0RHJpdmVuKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc05ld1Rhc2tzRXN0aW1hdGVkIDxlbT5OZXcgVGFza3MgRXN0aW1hdGVkPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TmV3IFRhc2tzIEVzdGltYXRlZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc05ld1Rhc2tzRXN0aW1hdGVkKCkKLQkgKiBAc2VlICNnZXRQcm9qZWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X05ld1Rhc2tzRXN0aW1hdGVkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc1NwbGl0c0luUHJvZ3Jlc3NUYXNrcyA8ZW0+U3BsaXRzIEluIFByb2dyZXNzIFRhc2tzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+U3BsaXRzIEluIFByb2dyZXNzIFRhc2tzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzU3BsaXRzSW5Qcm9ncmVzc1Rhc2tzKCkKLQkgKiBAc2VlICNnZXRQcm9qZWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X1NwbGl0c0luUHJvZ3Jlc3NUYXNrcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNTcHJlYWRBY3R1YWxDb3N0IDxlbT5TcHJlYWQgQWN0dWFsIENvc3Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5TcHJlYWQgQWN0dWFsIENvc3Q8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNTcHJlYWRBY3R1YWxDb3N0KCkKLQkgKiBAc2VlICNnZXRQcm9qZWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X1NwcmVhZEFjdHVhbENvc3QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzU3ByZWFkUGVyY2VudENvbXBsZXRlIDxlbT5TcHJlYWQgUGVyY2VudCBDb21wbGV0ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlNwcmVhZCBQZXJjZW50IENvbXBsZXRlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzU3ByZWFkUGVyY2VudENvbXBsZXRlKCkKLQkgKiBAc2VlICNnZXRQcm9qZWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X1NwcmVhZFBlcmNlbnRDb21wbGV0ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNUYXNrVXBkYXRlc1Jlc291cmNlIDxlbT5UYXNrIFVwZGF0ZXMgUmVzb3VyY2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5UYXNrIFVwZGF0ZXMgUmVzb3VyY2U8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNUYXNrVXBkYXRlc1Jlc291cmNlKCkKLQkgKiBAc2VlICNnZXRQcm9qZWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X1Rhc2tVcGRhdGVzUmVzb3VyY2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzRmlzY2FsWWVhclN0YXJ0IDxlbT5GaXNjYWwgWWVhciBTdGFydDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkZpc2NhbCBZZWFyIFN0YXJ0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzRmlzY2FsWWVhclN0YXJ0KCkKLQkgKiBAc2VlICNnZXRQcm9qZWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X0Zpc2NhbFllYXJTdGFydCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0V2Vla1N0YXJ0RGF5IDxlbT5XZWVrIFN0YXJ0IERheTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPldlZWsgU3RhcnQgRGF5PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldFdlZWtTdGFydERheSgpCi0JICogQHNlZSAjZ2V0UHJvamVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9XZWVrU3RhcnREYXkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzTW92ZUNvbXBsZXRlZEVuZHNCYWNrIDxlbT5Nb3ZlIENvbXBsZXRlZCBFbmRzIEJhY2s8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Nb3ZlIENvbXBsZXRlZCBFbmRzIEJhY2s8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNNb3ZlQ29tcGxldGVkRW5kc0JhY2soKQotCSAqIEBzZWUgI2dldFByb2plY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFByb2plY3RfTW92ZUNvbXBsZXRlZEVuZHNCYWNrKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc01vdmVSZW1haW5pbmdTdGFydHNCYWNrIDxlbT5Nb3ZlIFJlbWFpbmluZyBTdGFydHMgQmFjazwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk1vdmUgUmVtYWluaW5nIFN0YXJ0cyBCYWNrPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzTW92ZVJlbWFpbmluZ1N0YXJ0c0JhY2soKQotCSAqIEBzZWUgI2dldFByb2plY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFByb2plY3RfTW92ZVJlbWFpbmluZ1N0YXJ0c0JhY2soKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzTW92ZVJlbWFpbmluZ1N0YXJ0c0ZvcndhcmQgPGVtPk1vdmUgUmVtYWluaW5nIFN0YXJ0cyBGb3J3YXJkPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TW92ZSBSZW1haW5pbmcgU3RhcnRzIEZvcndhcmQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNNb3ZlUmVtYWluaW5nU3RhcnRzRm9yd2FyZCgpCi0JICogQHNlZSAjZ2V0UHJvamVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9Nb3ZlUmVtYWluaW5nU3RhcnRzRm9yd2FyZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNNb3ZlQ29tcGxldGVkRW5kc0ZvcndhcmQgPGVtPk1vdmUgQ29tcGxldGVkIEVuZHMgRm9yd2FyZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk1vdmUgQ29tcGxldGVkIEVuZHMgRm9yd2FyZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc01vdmVDb21wbGV0ZWRFbmRzRm9yd2FyZCgpCi0JICogQHNlZSAjZ2V0UHJvamVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9Nb3ZlQ29tcGxldGVkRW5kc0ZvcndhcmQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldEJhc2VsaW5lRm9yRWFybmVkVmFsdWUgPGVtPkJhc2VsaW5lIEZvciBFYXJuZWQgVmFsdWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5CYXNlbGluZSBGb3IgRWFybmVkIFZhbHVlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldEJhc2VsaW5lRm9yRWFybmVkVmFsdWUoKQotCSAqIEBzZWUgI2dldFByb2plY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFByb2plY3RfQmFzZWxpbmVGb3JFYXJuZWRWYWx1ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNBdXRvQWRkTmV3UmVzb3VyY2VzQW5kVGFza3MgPGVtPkF1dG8gQWRkIE5ldyBSZXNvdXJjZXMgQW5kIFRhc2tzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+QXV0byBBZGQgTmV3IFJlc291cmNlcyBBbmQgVGFza3M8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNBdXRvQWRkTmV3UmVzb3VyY2VzQW5kVGFza3MoKQotCSAqIEBzZWUgI2dldFByb2plY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFByb2plY3RfQXV0b0FkZE5ld1Jlc291cmNlc0FuZFRhc2tzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRTdGF0dXNEYXRlIDxlbT5TdGF0dXMgRGF0ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlN0YXR1cyBEYXRlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldFN0YXR1c0RhdGUoKQotCSAqIEBzZWUgI2dldFByb2plY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFByb2plY3RfU3RhdHVzRGF0ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0Q3VycmVudERhdGUgPGVtPkN1cnJlbnQgRGF0ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkN1cnJlbnQgRGF0ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRDdXJyZW50RGF0ZSgpCi0JICogQHNlZSAjZ2V0UHJvamVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9DdXJyZW50RGF0ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNNaWNyb3NvZnRQcm9qZWN0U2VydmVyVVJMIDxlbT5NaWNyb3NvZnQgUHJvamVjdCBTZXJ2ZXIgVVJMPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TWljcm9zb2Z0IFByb2plY3QgU2VydmVyIFVSTDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc01pY3Jvc29mdFByb2plY3RTZXJ2ZXJVUkwoKQotCSAqIEBzZWUgI2dldFByb2plY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFByb2plY3RfTWljcm9zb2Z0UHJvamVjdFNlcnZlclVSTCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNBdXRvbGluayA8ZW0+QXV0b2xpbms8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5BdXRvbGluazwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc0F1dG9saW5rKCkKLQkgKiBAc2VlICNnZXRQcm9qZWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X0F1dG9saW5rKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXROZXdUYXNrU3RhcnREYXRlIDxlbT5OZXcgVGFzayBTdGFydCBEYXRlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TmV3IFRhc2sgU3RhcnQgRGF0ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXROZXdUYXNrU3RhcnREYXRlKCkKLQkgKiBAc2VlICNnZXRQcm9qZWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X05ld1Rhc2tTdGFydERhdGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldERlZmF1bHRUYXNrRVZNZXRob2QgPGVtPkRlZmF1bHQgVGFzayBFViBNZXRob2Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5EZWZhdWx0IFRhc2sgRVYgTWV0aG9kPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldERlZmF1bHRUYXNrRVZNZXRob2QoKQotCSAqIEBzZWUgI2dldFByb2plY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFByb2plY3RfRGVmYXVsdFRhc2tFVk1ldGhvZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNQcm9qZWN0RXh0ZXJuYWxseUVkaXRlZCA8ZW0+UHJvamVjdCBFeHRlcm5hbGx5IEVkaXRlZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlByb2plY3QgRXh0ZXJuYWxseSBFZGl0ZWQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNQcm9qZWN0RXh0ZXJuYWxseUVkaXRlZCgpCi0JICogQHNlZSAjZ2V0UHJvamVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9Qcm9qZWN0RXh0ZXJuYWxseUVkaXRlZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0RXh0ZW5kZWRDcmVhdGlvbkRhdGUgPGVtPkV4dGVuZGVkIENyZWF0aW9uIERhdGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5FeHRlbmRlZCBDcmVhdGlvbiBEYXRlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldEV4dGVuZGVkQ3JlYXRpb25EYXRlKCkKLQkgKiBAc2VlICNnZXRQcm9qZWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X0V4dGVuZGVkQ3JlYXRpb25EYXRlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc0FjdHVhbHNJblN5bmMgPGVtPkFjdHVhbHMgSW4gU3luYzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkFjdHVhbHMgSW4gU3luYzwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc0FjdHVhbHNJblN5bmMoKQotCSAqIEBzZWUgI2dldFByb2plY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFByb2plY3RfQWN0dWFsc0luU3luYygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNSZW1vdmVGaWxlUHJvcGVydGllcyA8ZW0+UmVtb3ZlIEZpbGUgUHJvcGVydGllczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlJlbW92ZSBGaWxlIFByb3BlcnRpZXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNSZW1vdmVGaWxlUHJvcGVydGllcygpCi0JICogQHNlZSAjZ2V0UHJvamVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9SZW1vdmVGaWxlUHJvcGVydGllcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNBZG1pblByb2plY3QgPGVtPkFkbWluIFByb2plY3Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5BZG1pbiBQcm9qZWN0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzQWRtaW5Qcm9qZWN0KCkKLQkgKiBAc2VlICNnZXRQcm9qZWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X0FkbWluUHJvamVjdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0T3V0bGluZUNvZGVzIDxlbT5PdXRsaW5lIENvZGVzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+T3V0bGluZSBDb2RlczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRPdXRsaW5lQ29kZXMoKQotCSAqIEBzZWUgI2dldFByb2plY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFByb2plY3RfT3V0bGluZUNvZGVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRXQlNNYXNrcyA8ZW0+V0JTIE1hc2tzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+V0JTIE1hc2tzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldFdCU01hc2tzKCkKLQkgKiBAc2VlICNnZXRQcm9qZWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRQcm9qZWN0X1dCU01hc2tzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRFeHRlbmRlZEF0dHJpYnV0ZXMgPGVtPkV4dGVuZGVkIEF0dHJpYnV0ZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5FeHRlbmRlZCBBdHRyaWJ1dGVzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldEV4dGVuZGVkQXR0cmlidXRlcygpCi0JICogQHNlZSAjZ2V0UHJvamVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0UHJvamVjdF9FeHRlbmRlZEF0dHJpYnV0ZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldENhbGVuZGFycyA8ZW0+Q2FsZW5kYXJzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+Q2FsZW5kYXJzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldENhbGVuZGFycygpCi0JICogQHNlZSAjZ2V0UHJvamVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0UHJvamVjdF9DYWxlbmRhcnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldFRhc2tzIDxlbT5UYXNrczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPlRhc2tzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldFRhc2tzKCkKLQkgKiBAc2VlICNnZXRQcm9qZWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRQcm9qZWN0X1Rhc2tzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRSZXNvdXJjZXMgPGVtPlJlc291cmNlczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPlJlc291cmNlczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRSZXNvdXJjZXMoKQotCSAqIEBzZWUgI2dldFByb2plY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFByb2plY3RfUmVzb3VyY2VzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRBc3NpZ25tZW50cyA8ZW0+QXNzaWdubWVudHM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5Bc3NpZ25tZW50czwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRBc3NpZ25tZW50cygpCi0JICogQHNlZSAjZ2V0UHJvamVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0UHJvamVjdF9Bc3NpZ25tZW50cygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SYXRlIDxlbT5SYXRlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlJhdGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJhdGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFJhdGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SYXRlI2dldFJhdGVzRnJvbSA8ZW0+UmF0ZXMgRnJvbTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlJhdGVzIEZyb208L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJhdGUjZ2V0UmF0ZXNGcm9tKCkKLQkgKiBAc2VlICNnZXRSYXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRSYXRlX1JhdGVzRnJvbSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJhdGUjZ2V0UmF0ZXNUbyA8ZW0+UmF0ZXMgVG88L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5SYXRlcyBUbzwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmF0ZSNnZXRSYXRlc1RvKCkKLQkgKiBAc2VlICNnZXRSYXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRSYXRlX1JhdGVzVG8oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SYXRlI2dldFJhdGVUYWJsZSA8ZW0+UmF0ZSBUYWJsZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlJhdGUgVGFibGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJhdGUjZ2V0UmF0ZVRhYmxlKCkKLQkgKiBAc2VlICNnZXRSYXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRSYXRlX1JhdGVUYWJsZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJhdGUjZ2V0U3RhbmRhcmRSYXRlIDxlbT5TdGFuZGFyZCBSYXRlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+U3RhbmRhcmQgUmF0ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmF0ZSNnZXRTdGFuZGFyZFJhdGUoKQotCSAqIEBzZWUgI2dldFJhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFJhdGVfU3RhbmRhcmRSYXRlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmF0ZSNnZXRTdGFuZGFyZFJhdGVGb3JtYXQgPGVtPlN0YW5kYXJkIFJhdGUgRm9ybWF0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+U3RhbmRhcmQgUmF0ZSBGb3JtYXQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJhdGUjZ2V0U3RhbmRhcmRSYXRlRm9ybWF0KCkKLQkgKiBAc2VlICNnZXRSYXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRSYXRlX1N0YW5kYXJkUmF0ZUZvcm1hdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJhdGUjZ2V0T3ZlcnRpbWVSYXRlIDxlbT5PdmVydGltZSBSYXRlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+T3ZlcnRpbWUgUmF0ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmF0ZSNnZXRPdmVydGltZVJhdGUoKQotCSAqIEBzZWUgI2dldFJhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFJhdGVfT3ZlcnRpbWVSYXRlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmF0ZSNnZXRPdmVydGltZVJhdGVGb3JtYXQgPGVtPk92ZXJ0aW1lIFJhdGUgRm9ybWF0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+T3ZlcnRpbWUgUmF0ZSBGb3JtYXQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJhdGUjZ2V0T3ZlcnRpbWVSYXRlRm9ybWF0KCkKLQkgKiBAc2VlICNnZXRSYXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRSYXRlX092ZXJ0aW1lUmF0ZUZvcm1hdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJhdGUjZ2V0Q29zdFBlclVzZSA8ZW0+Q29zdCBQZXIgVXNlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Q29zdCBQZXIgVXNlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SYXRlI2dldENvc3RQZXJVc2UoKQotCSAqIEBzZWUgI2dldFJhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFJhdGVfQ29zdFBlclVzZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SYXRlcyA8ZW0+UmF0ZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+UmF0ZXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJhdGVzCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRSYXRlcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmF0ZXMjZ2V0UmF0ZSA8ZW0+UmF0ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+UmF0ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmF0ZXMjZ2V0UmF0ZSgpCi0JICogQHNlZSAjZ2V0UmF0ZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFJhdGVzX1JhdGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UgPGVtPlJlc291cmNlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlJlc291cmNlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0UmVzb3VyY2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRVSUQgPGVtPlVJRDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlVJRDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0VUlEKCkKLQkgKiBAc2VlICNnZXRSZXNvdXJjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfVUlEKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0SUQgPGVtPklEPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SUQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldElEKCkKLQkgKiBAc2VlICNnZXRSZXNvdXJjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfSUQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXROYW1lIDxlbT5OYW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TmFtZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0TmFtZSgpCi0JICogQHNlZSAjZ2V0UmVzb3VyY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFJlc291cmNlX05hbWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRUeXBlIDxlbT5UeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VHlwZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0VHlwZSgpCi0JICogQHNlZSAjZ2V0UmVzb3VyY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFJlc291cmNlX1R5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNpc0lzTnVsbCA8ZW0+SXMgTnVsbDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPklzIE51bGw8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2lzSXNOdWxsKCkKLQkgKiBAc2VlICNnZXRSZXNvdXJjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfSXNOdWxsKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0SW5pdGlhbHMgPGVtPkluaXRpYWxzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SW5pdGlhbHM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldEluaXRpYWxzKCkKLQkgKiBAc2VlICNnZXRSZXNvdXJjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfSW5pdGlhbHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRQaG9uZXRpY3MgPGVtPlBob25ldGljczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlBob25ldGljczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0UGhvbmV0aWNzKCkKLQkgKiBAc2VlICNnZXRSZXNvdXJjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfUGhvbmV0aWNzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0TlRBY2NvdW50IDxlbT5OVCBBY2NvdW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TlQgQWNjb3VudDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0TlRBY2NvdW50KCkKLQkgKiBAc2VlICNnZXRSZXNvdXJjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfTlRBY2NvdW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0TWF0ZXJpYWxMYWJlbCA8ZW0+TWF0ZXJpYWwgTGFiZWw8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5NYXRlcmlhbCBMYWJlbDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0TWF0ZXJpYWxMYWJlbCgpCi0JICogQHNlZSAjZ2V0UmVzb3VyY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFJlc291cmNlX01hdGVyaWFsTGFiZWwoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRDb2RlIDxlbT5Db2RlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Q29kZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0Q29kZSgpCi0JICogQHNlZSAjZ2V0UmVzb3VyY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFJlc291cmNlX0NvZGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRHcm91cCA8ZW0+R3JvdXA8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Hcm91cDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0R3JvdXAoKQotCSAqIEBzZWUgI2dldFJlc291cmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9Hcm91cCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldFdvcmtHcm91cCA8ZW0+V29yayBHcm91cDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPldvcmsgR3JvdXA8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldFdvcmtHcm91cCgpCi0JICogQHNlZSAjZ2V0UmVzb3VyY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFJlc291cmNlX1dvcmtHcm91cCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldEVtYWlsQWRkcmVzcyA8ZW0+RW1haWwgQWRkcmVzczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkVtYWlsIEFkZHJlc3M8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldEVtYWlsQWRkcmVzcygpCi0JICogQHNlZSAjZ2V0UmVzb3VyY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFJlc291cmNlX0VtYWlsQWRkcmVzcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldEh5cGVybGluayA8ZW0+SHlwZXJsaW5rPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SHlwZXJsaW5rPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRIeXBlcmxpbmsoKQotCSAqIEBzZWUgI2dldFJlc291cmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9IeXBlcmxpbmsoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRIeXBlcmxpbmtBZGRyZXNzIDxlbT5IeXBlcmxpbmsgQWRkcmVzczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkh5cGVybGluayBBZGRyZXNzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRIeXBlcmxpbmtBZGRyZXNzKCkKLQkgKiBAc2VlICNnZXRSZXNvdXJjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfSHlwZXJsaW5rQWRkcmVzcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldEh5cGVybGlua1N1YkFkZHJlc3MgPGVtPkh5cGVybGluayBTdWIgQWRkcmVzczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkh5cGVybGluayBTdWIgQWRkcmVzczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0SHlwZXJsaW5rU3ViQWRkcmVzcygpCi0JICogQHNlZSAjZ2V0UmVzb3VyY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFJlc291cmNlX0h5cGVybGlua1N1YkFkZHJlc3MoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRNYXhVbml0cyA8ZW0+TWF4IFVuaXRzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TWF4IFVuaXRzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRNYXhVbml0cygpCi0JICogQHNlZSAjZ2V0UmVzb3VyY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFJlc291cmNlX01heFVuaXRzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0UGVha1VuaXRzIDxlbT5QZWFrIFVuaXRzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UGVhayBVbml0czwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0UGVha1VuaXRzKCkKLQkgKiBAc2VlICNnZXRSZXNvdXJjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfUGVha1VuaXRzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjaXNPdmVyQWxsb2NhdGVkIDxlbT5PdmVyIEFsbG9jYXRlZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk92ZXIgQWxsb2NhdGVkPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNpc092ZXJBbGxvY2F0ZWQoKQotCSAqIEBzZWUgI2dldFJlc291cmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9PdmVyQWxsb2NhdGVkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0QXZhaWxhYmxlRnJvbSA8ZW0+QXZhaWxhYmxlIEZyb208L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5BdmFpbGFibGUgRnJvbTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0QXZhaWxhYmxlRnJvbSgpCi0JICogQHNlZSAjZ2V0UmVzb3VyY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFJlc291cmNlX0F2YWlsYWJsZUZyb20oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRBdmFpbGFibGVUbyA8ZW0+QXZhaWxhYmxlIFRvPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+QXZhaWxhYmxlIFRvPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRBdmFpbGFibGVUbygpCi0JICogQHNlZSAjZ2V0UmVzb3VyY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFJlc291cmNlX0F2YWlsYWJsZVRvKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0U3RhcnQgPGVtPlN0YXJ0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+U3RhcnQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldFN0YXJ0KCkKLQkgKiBAc2VlICNnZXRSZXNvdXJjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfU3RhcnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRGaW5pc2ggPGVtPkZpbmlzaDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkZpbmlzaDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0RmluaXNoKCkKLQkgKiBAc2VlICNnZXRSZXNvdXJjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfRmluaXNoKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjaXNDYW5MZXZlbCA8ZW0+Q2FuIExldmVsPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Q2FuIExldmVsPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNpc0NhbkxldmVsKCkKLQkgKiBAc2VlICNnZXRSZXNvdXJjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfQ2FuTGV2ZWwoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRBY2NydWVBdCA8ZW0+QWNjcnVlIEF0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+QWNjcnVlIEF0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRBY2NydWVBdCgpCi0JICogQHNlZSAjZ2V0UmVzb3VyY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFJlc291cmNlX0FjY3J1ZUF0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0V29yayA8ZW0+V29yazwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPldvcms8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldFdvcmsoKQotCSAqIEBzZWUgI2dldFJlc291cmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9Xb3JrKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0UmVndWxhcldvcmsgPGVtPlJlZ3VsYXIgV29yazwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlJlZ3VsYXIgV29yazwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0UmVndWxhcldvcmsoKQotCSAqIEBzZWUgI2dldFJlc291cmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9SZWd1bGFyV29yaygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldE92ZXJ0aW1lV29yayA8ZW0+T3ZlcnRpbWUgV29yazwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk92ZXJ0aW1lIFdvcms8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldE92ZXJ0aW1lV29yaygpCi0JICogQHNlZSAjZ2V0UmVzb3VyY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFJlc291cmNlX092ZXJ0aW1lV29yaygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldEFjdHVhbFdvcmsgPGVtPkFjdHVhbCBXb3JrPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+QWN0dWFsIFdvcms8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldEFjdHVhbFdvcmsoKQotCSAqIEBzZWUgI2dldFJlc291cmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9BY3R1YWxXb3JrKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0UmVtYWluaW5nV29yayA8ZW0+UmVtYWluaW5nIFdvcms8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5SZW1haW5pbmcgV29yazwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0UmVtYWluaW5nV29yaygpCi0JICogQHNlZSAjZ2V0UmVzb3VyY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFJlc291cmNlX1JlbWFpbmluZ1dvcmsoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRBY3R1YWxPdmVydGltZVdvcmsgPGVtPkFjdHVhbCBPdmVydGltZSBXb3JrPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+QWN0dWFsIE92ZXJ0aW1lIFdvcms8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldEFjdHVhbE92ZXJ0aW1lV29yaygpCi0JICogQHNlZSAjZ2V0UmVzb3VyY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFJlc291cmNlX0FjdHVhbE92ZXJ0aW1lV29yaygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldFJlbWFpbmluZ092ZXJ0aW1lV29yayA8ZW0+UmVtYWluaW5nIE92ZXJ0aW1lIFdvcms8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5SZW1haW5pbmcgT3ZlcnRpbWUgV29yazwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0UmVtYWluaW5nT3ZlcnRpbWVXb3JrKCkKLQkgKiBAc2VlICNnZXRSZXNvdXJjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfUmVtYWluaW5nT3ZlcnRpbWVXb3JrKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0UGVyY2VudFdvcmtDb21wbGV0ZSA8ZW0+UGVyY2VudCBXb3JrIENvbXBsZXRlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UGVyY2VudCBXb3JrIENvbXBsZXRlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRQZXJjZW50V29ya0NvbXBsZXRlKCkKLQkgKiBAc2VlICNnZXRSZXNvdXJjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfUGVyY2VudFdvcmtDb21wbGV0ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldFN0YW5kYXJkUmF0ZSA8ZW0+U3RhbmRhcmQgUmF0ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlN0YW5kYXJkIFJhdGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldFN0YW5kYXJkUmF0ZSgpCi0JICogQHNlZSAjZ2V0UmVzb3VyY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFJlc291cmNlX1N0YW5kYXJkUmF0ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldFN0YW5kYXJkUmF0ZUZvcm1hdCA8ZW0+U3RhbmRhcmQgUmF0ZSBGb3JtYXQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5TdGFuZGFyZCBSYXRlIEZvcm1hdDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0U3RhbmRhcmRSYXRlRm9ybWF0KCkKLQkgKiBAc2VlICNnZXRSZXNvdXJjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfU3RhbmRhcmRSYXRlRm9ybWF0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0Q29zdCA8ZW0+Q29zdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkNvc3Q8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldENvc3QoKQotCSAqIEBzZWUgI2dldFJlc291cmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9Db3N0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0T3ZlcnRpbWVSYXRlIDxlbT5PdmVydGltZSBSYXRlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+T3ZlcnRpbWUgUmF0ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0T3ZlcnRpbWVSYXRlKCkKLQkgKiBAc2VlICNnZXRSZXNvdXJjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfT3ZlcnRpbWVSYXRlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0T3ZlcnRpbWVSYXRlRm9ybWF0IDxlbT5PdmVydGltZSBSYXRlIEZvcm1hdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk92ZXJ0aW1lIFJhdGUgRm9ybWF0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRPdmVydGltZVJhdGVGb3JtYXQoKQotCSAqIEBzZWUgI2dldFJlc291cmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9PdmVydGltZVJhdGVGb3JtYXQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRPdmVydGltZUNvc3QgPGVtPk92ZXJ0aW1lIENvc3Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5PdmVydGltZSBDb3N0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRPdmVydGltZUNvc3QoKQotCSAqIEBzZWUgI2dldFJlc291cmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9PdmVydGltZUNvc3QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRDb3N0UGVyVXNlIDxlbT5Db3N0IFBlciBVc2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Db3N0IFBlciBVc2U8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldENvc3RQZXJVc2UoKQotCSAqIEBzZWUgI2dldFJlc291cmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9Db3N0UGVyVXNlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0QWN0dWFsQ29zdCA8ZW0+QWN0dWFsIENvc3Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5BY3R1YWwgQ29zdDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0QWN0dWFsQ29zdCgpCi0JICogQHNlZSAjZ2V0UmVzb3VyY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFJlc291cmNlX0FjdHVhbENvc3QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRBY3R1YWxPdmVydGltZUNvc3QgPGVtPkFjdHVhbCBPdmVydGltZSBDb3N0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+QWN0dWFsIE92ZXJ0aW1lIENvc3Q8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldEFjdHVhbE92ZXJ0aW1lQ29zdCgpCi0JICogQHNlZSAjZ2V0UmVzb3VyY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFJlc291cmNlX0FjdHVhbE92ZXJ0aW1lQ29zdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldFJlbWFpbmluZ0Nvc3QgPGVtPlJlbWFpbmluZyBDb3N0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UmVtYWluaW5nIENvc3Q8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldFJlbWFpbmluZ0Nvc3QoKQotCSAqIEBzZWUgI2dldFJlc291cmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9SZW1haW5pbmdDb3N0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0UmVtYWluaW5nT3ZlcnRpbWVDb3N0IDxlbT5SZW1haW5pbmcgT3ZlcnRpbWUgQ29zdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlJlbWFpbmluZyBPdmVydGltZSBDb3N0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRSZW1haW5pbmdPdmVydGltZUNvc3QoKQotCSAqIEBzZWUgI2dldFJlc291cmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9SZW1haW5pbmdPdmVydGltZUNvc3QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRXb3JrVmFyaWFuY2UgPGVtPldvcmsgVmFyaWFuY2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Xb3JrIFZhcmlhbmNlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRXb3JrVmFyaWFuY2UoKQotCSAqIEBzZWUgI2dldFJlc291cmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9Xb3JrVmFyaWFuY2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRDb3N0VmFyaWFuY2UgPGVtPkNvc3QgVmFyaWFuY2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Db3N0IFZhcmlhbmNlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRDb3N0VmFyaWFuY2UoKQotCSAqIEBzZWUgI2dldFJlc291cmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9Db3N0VmFyaWFuY2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRTViA8ZW0+U1Y8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5TVjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0U1YoKQotCSAqIEBzZWUgI2dldFJlc291cmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9TVigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldENWIDxlbT5DVjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkNWPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRDVigpCi0JICogQHNlZSAjZ2V0UmVzb3VyY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFJlc291cmNlX0NWKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0QUNXUCA8ZW0+QUNXUDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkFDV1A8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldEFDV1AoKQotCSAqIEBzZWUgI2dldFJlc291cmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9BQ1dQKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0Q2FsZW5kYXJVSUQgPGVtPkNhbGVuZGFyIFVJRDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkNhbGVuZGFyIFVJRDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0Q2FsZW5kYXJVSUQoKQotCSAqIEBzZWUgI2dldFJlc291cmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9DYWxlbmRhclVJRCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldE5vdGVzIDxlbT5Ob3RlczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk5vdGVzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXROb3RlcygpCi0JICogQHNlZSAjZ2V0UmVzb3VyY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFJlc291cmNlX05vdGVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0QkNXUyA8ZW0+QkNXUzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkJDV1M8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldEJDV1MoKQotCSAqIEBzZWUgI2dldFJlc291cmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9CQ1dTKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0QkNXUCA8ZW0+QkNXUDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkJDV1A8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldEJDV1AoKQotCSAqIEBzZWUgI2dldFJlc291cmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9CQ1dQKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjaXNJc0dlbmVyaWMgPGVtPklzIEdlbmVyaWM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5JcyBHZW5lcmljPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNpc0lzR2VuZXJpYygpCi0JICogQHNlZSAjZ2V0UmVzb3VyY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFJlc291cmNlX0lzR2VuZXJpYygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2lzSXNJbmFjdGl2ZSA8ZW0+SXMgSW5hY3RpdmU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5JcyBJbmFjdGl2ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjaXNJc0luYWN0aXZlKCkKLQkgKiBAc2VlICNnZXRSZXNvdXJjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfSXNJbmFjdGl2ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2lzSXNFbnRlcnByaXNlIDxlbT5JcyBFbnRlcnByaXNlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SXMgRW50ZXJwcmlzZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjaXNJc0VudGVycHJpc2UoKQotCSAqIEBzZWUgI2dldFJlc291cmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9Jc0VudGVycHJpc2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRCb29raW5nVHlwZSA8ZW0+Qm9va2luZyBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Qm9va2luZyBUeXBlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRCb29raW5nVHlwZSgpCi0JICogQHNlZSAjZ2V0UmVzb3VyY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFJlc291cmNlX0Jvb2tpbmdUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0QWN0dWFsV29ya1Byb3RlY3RlZCA8ZW0+QWN0dWFsIFdvcmsgUHJvdGVjdGVkPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+QWN0dWFsIFdvcmsgUHJvdGVjdGVkPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRBY3R1YWxXb3JrUHJvdGVjdGVkKCkKLQkgKiBAc2VlICNnZXRSZXNvdXJjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfQWN0dWFsV29ya1Byb3RlY3RlZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldEFjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZCA8ZW0+QWN0dWFsIE92ZXJ0aW1lIFdvcmsgUHJvdGVjdGVkPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+QWN0dWFsIE92ZXJ0aW1lIFdvcmsgUHJvdGVjdGVkPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRBY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQoKQotCSAqIEBzZWUgI2dldFJlc291cmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9BY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRBY3RpdmVEaXJlY3RvcnlHVUlEIDxlbT5BY3RpdmUgRGlyZWN0b3J5IEdVSUQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5BY3RpdmUgRGlyZWN0b3J5IEdVSUQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldEFjdGl2ZURpcmVjdG9yeUdVSUQoKQotCSAqIEBzZWUgI2dldFJlc291cmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9BY3RpdmVEaXJlY3RvcnlHVUlEKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0Q3JlYXRpb25EYXRlIDxlbT5DcmVhdGlvbiBEYXRlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Q3JlYXRpb24gRGF0ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0Q3JlYXRpb25EYXRlKCkKLQkgKiBAc2VlICNnZXRSZXNvdXJjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfQ3JlYXRpb25EYXRlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRFeHRlbmRlZEF0dHJpYnV0ZSA8ZW0+RXh0ZW5kZWQgQXR0cmlidXRlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5FeHRlbmRlZCBBdHRyaWJ1dGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldEV4dGVuZGVkQXR0cmlidXRlKCkKLQkgKiBAc2VlICNnZXRSZXNvdXJjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0UmVzb3VyY2VfRXh0ZW5kZWRBdHRyaWJ1dGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldEJhc2VsaW5lIDxlbT5CYXNlbGluZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+QmFzZWxpbmU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldEJhc2VsaW5lKCkKLQkgKiBAc2VlICNnZXRSZXNvdXJjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0UmVzb3VyY2VfQmFzZWxpbmUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldE91dGxpbmVDb2RlIDxlbT5PdXRsaW5lIENvZGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPk91dGxpbmUgQ29kZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0T3V0bGluZUNvZGUoKQotCSAqIEBzZWUgI2dldFJlc291cmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRSZXNvdXJjZV9PdXRsaW5lQ29kZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldEF2YWlsYWJpbGl0eVBlcmlvZHMgPGVtPkF2YWlsYWJpbGl0eSBQZXJpb2RzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+QXZhaWxhYmlsaXR5IFBlcmlvZHM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldEF2YWlsYWJpbGl0eVBlcmlvZHMoKQotCSAqIEBzZWUgI2dldFJlc291cmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRSZXNvdXJjZV9BdmFpbGFiaWxpdHlQZXJpb2RzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0UmF0ZXMgPGVtPlJhdGVzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+UmF0ZXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldFJhdGVzKCkKLQkgKiBAc2VlICNnZXRSZXNvdXJjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0UmVzb3VyY2VfUmF0ZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldFRpbWVwaGFzZWREYXRhIDxlbT5UaW1lcGhhc2VkIERhdGE8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPlRpbWVwaGFzZWQgRGF0YTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0VGltZXBoYXNlZERhdGEoKQotCSAqIEBzZWUgI2dldFJlc291cmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRSZXNvdXJjZV9UaW1lcGhhc2VkRGF0YSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZXMgPGVtPlJlc291cmNlczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5SZXNvdXJjZXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlcwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0UmVzb3VyY2VzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZXMjZ2V0UmVzb3VyY2UgPGVtPlJlc291cmNlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5SZXNvdXJjZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2VzI2dldFJlc291cmNlKCkKLQkgKiBAc2VlICNnZXRSZXNvdXJjZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFJlc291cmNlc19SZXNvdXJjZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrIDxlbT5UYXNrPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlRhc2s8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFRhc2soKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldFVJRCA8ZW0+VUlEPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VUlEPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldFVJRCgpCi0JICogQHNlZSAjZ2V0VGFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGFza19VSUQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldElEIDxlbT5JRDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPklEPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldElEKCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrX0lEKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXROYW1lIDxlbT5OYW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TmFtZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXROYW1lKCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrX05hbWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldFR5cGUgPGVtPlR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5UeXBlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldFR5cGUoKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tfVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjaXNJc051bGwgPGVtPklzIE51bGw8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5JcyBOdWxsPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2lzSXNOdWxsKCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrX0lzTnVsbCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0Q3JlYXRlRGF0ZSA8ZW0+Q3JlYXRlIERhdGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5DcmVhdGUgRGF0ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRDcmVhdGVEYXRlKCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrX0NyZWF0ZURhdGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldENvbnRhY3QgPGVtPkNvbnRhY3Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Db250YWN0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldENvbnRhY3QoKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tfQ29udGFjdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0V0JTIDxlbT5XQlM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5XQlM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0V0JTKCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrX1dCUygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0V0JTTGV2ZWwgPGVtPldCUyBMZXZlbDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPldCUyBMZXZlbDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRXQlNMZXZlbCgpCi0JICogQHNlZSAjZ2V0VGFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGFza19XQlNMZXZlbCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0T3V0bGluZU51bWJlciA8ZW0+T3V0bGluZSBOdW1iZXI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5PdXRsaW5lIE51bWJlcjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRPdXRsaW5lTnVtYmVyKCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrX091dGxpbmVOdW1iZXIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldE91dGxpbmVMZXZlbCA8ZW0+T3V0bGluZSBMZXZlbDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk91dGxpbmUgTGV2ZWw8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0T3V0bGluZUxldmVsKCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrX091dGxpbmVMZXZlbCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0UHJpb3JpdHkgPGVtPlByaW9yaXR5PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UHJpb3JpdHk8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0UHJpb3JpdHkoKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tfUHJpb3JpdHkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldFN0YXJ0IDxlbT5TdGFydDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlN0YXJ0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldFN0YXJ0KCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrX1N0YXJ0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRGaW5pc2ggPGVtPkZpbmlzaDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkZpbmlzaDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRGaW5pc2goKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tfRmluaXNoKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXREdXJhdGlvbiA8ZW0+RHVyYXRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5EdXJhdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXREdXJhdGlvbigpCi0JICogQHNlZSAjZ2V0VGFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGFza19EdXJhdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0RHVyYXRpb25Gb3JtYXQgPGVtPkR1cmF0aW9uIEZvcm1hdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkR1cmF0aW9uIEZvcm1hdDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXREdXJhdGlvbkZvcm1hdCgpCi0JICogQHNlZSAjZ2V0VGFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGFza19EdXJhdGlvbkZvcm1hdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0V29yayA8ZW0+V29yazwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPldvcms8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0V29yaygpCi0JICogQHNlZSAjZ2V0VGFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGFza19Xb3JrKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRTdG9wIDxlbT5TdG9wPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+U3RvcDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRTdG9wKCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrX1N0b3AoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldFJlc3VtZSA8ZW0+UmVzdW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UmVzdW1lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldFJlc3VtZSgpCi0JICogQHNlZSAjZ2V0VGFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGFza19SZXN1bWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2lzUmVzdW1lVmFsaWQgPGVtPlJlc3VtZSBWYWxpZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlJlc3VtZSBWYWxpZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNpc1Jlc3VtZVZhbGlkKCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrX1Jlc3VtZVZhbGlkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNpc0VmZm9ydERyaXZlbiA8ZW0+RWZmb3J0IERyaXZlbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkVmZm9ydCBEcml2ZW48L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjaXNFZmZvcnREcml2ZW4oKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tfRWZmb3J0RHJpdmVuKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNpc1JlY3VycmluZyA8ZW0+UmVjdXJyaW5nPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UmVjdXJyaW5nPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2lzUmVjdXJyaW5nKCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrX1JlY3VycmluZygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjaXNPdmVyQWxsb2NhdGVkIDxlbT5PdmVyIEFsbG9jYXRlZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk92ZXIgQWxsb2NhdGVkPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2lzT3ZlckFsbG9jYXRlZCgpCi0JICogQHNlZSAjZ2V0VGFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGFza19PdmVyQWxsb2NhdGVkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNpc0VzdGltYXRlZCA8ZW0+RXN0aW1hdGVkPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RXN0aW1hdGVkPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2lzRXN0aW1hdGVkKCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrX0VzdGltYXRlZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjaXNNaWxlc3RvbmUgPGVtPk1pbGVzdG9uZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk1pbGVzdG9uZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNpc01pbGVzdG9uZSgpCi0JICogQHNlZSAjZ2V0VGFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGFza19NaWxlc3RvbmUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2lzU3VtbWFyeSA8ZW0+U3VtbWFyeTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlN1bW1hcnk8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjaXNTdW1tYXJ5KCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrX1N1bW1hcnkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2lzQ3JpdGljYWwgPGVtPkNyaXRpY2FsPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Q3JpdGljYWw8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjaXNDcml0aWNhbCgpCi0JICogQHNlZSAjZ2V0VGFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGFza19Dcml0aWNhbCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjaXNJc1N1YnByb2plY3QgPGVtPklzIFN1YnByb2plY3Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5JcyBTdWJwcm9qZWN0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2lzSXNTdWJwcm9qZWN0KCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrX0lzU3VicHJvamVjdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjaXNJc1N1YnByb2plY3RSZWFkT25seSA8ZW0+SXMgU3VicHJvamVjdCBSZWFkIE9ubHk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5JcyBTdWJwcm9qZWN0IFJlYWQgT25seTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNpc0lzU3VicHJvamVjdFJlYWRPbmx5KCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrX0lzU3VicHJvamVjdFJlYWRPbmx5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRTdWJwcm9qZWN0TmFtZSA8ZW0+U3VicHJvamVjdCBOYW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+U3VicHJvamVjdCBOYW1lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldFN1YnByb2plY3ROYW1lKCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrX1N1YnByb2plY3ROYW1lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNpc0V4dGVybmFsVGFzayA8ZW0+RXh0ZXJuYWwgVGFzazwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkV4dGVybmFsIFRhc2s8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjaXNFeHRlcm5hbFRhc2soKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tfRXh0ZXJuYWxUYXNrKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRFeHRlcm5hbFRhc2tQcm9qZWN0IDxlbT5FeHRlcm5hbCBUYXNrIFByb2plY3Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5FeHRlcm5hbCBUYXNrIFByb2plY3Q8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0RXh0ZXJuYWxUYXNrUHJvamVjdCgpCi0JICogQHNlZSAjZ2V0VGFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGFza19FeHRlcm5hbFRhc2tQcm9qZWN0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRFYXJseVN0YXJ0IDxlbT5FYXJseSBTdGFydDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkVhcmx5IFN0YXJ0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldEVhcmx5U3RhcnQoKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tfRWFybHlTdGFydCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0RWFybHlGaW5pc2ggPGVtPkVhcmx5IEZpbmlzaDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkVhcmx5IEZpbmlzaDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRFYXJseUZpbmlzaCgpCi0JICogQHNlZSAjZ2V0VGFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGFza19FYXJseUZpbmlzaCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0TGF0ZVN0YXJ0IDxlbT5MYXRlIFN0YXJ0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TGF0ZSBTdGFydDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRMYXRlU3RhcnQoKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tfTGF0ZVN0YXJ0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRMYXRlRmluaXNoIDxlbT5MYXRlIEZpbmlzaDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkxhdGUgRmluaXNoPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldExhdGVGaW5pc2goKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tfTGF0ZUZpbmlzaCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0U3RhcnRWYXJpYW5jZSA8ZW0+U3RhcnQgVmFyaWFuY2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5TdGFydCBWYXJpYW5jZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRTdGFydFZhcmlhbmNlKCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrX1N0YXJ0VmFyaWFuY2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldEZpbmlzaFZhcmlhbmNlIDxlbT5GaW5pc2ggVmFyaWFuY2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5GaW5pc2ggVmFyaWFuY2U8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0RmluaXNoVmFyaWFuY2UoKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tfRmluaXNoVmFyaWFuY2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldFdvcmtWYXJpYW5jZSA8ZW0+V29yayBWYXJpYW5jZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPldvcmsgVmFyaWFuY2U8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0V29ya1ZhcmlhbmNlKCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrX1dvcmtWYXJpYW5jZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0RnJlZVNsYWNrIDxlbT5GcmVlIFNsYWNrPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RnJlZSBTbGFjazwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRGcmVlU2xhY2soKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tfRnJlZVNsYWNrKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRUb3RhbFNsYWNrIDxlbT5Ub3RhbCBTbGFjazwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlRvdGFsIFNsYWNrPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldFRvdGFsU2xhY2soKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tfVG90YWxTbGFjaygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0Rml4ZWRDb3N0IDxlbT5GaXhlZCBDb3N0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Rml4ZWQgQ29zdDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRGaXhlZENvc3QoKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tfRml4ZWRDb3N0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRGaXhlZENvc3RBY2NydWFsIDxlbT5GaXhlZCBDb3N0IEFjY3J1YWw8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5GaXhlZCBDb3N0IEFjY3J1YWw8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0Rml4ZWRDb3N0QWNjcnVhbCgpCi0JICogQHNlZSAjZ2V0VGFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGFza19GaXhlZENvc3RBY2NydWFsKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRQZXJjZW50Q29tcGxldGUgPGVtPlBlcmNlbnQgQ29tcGxldGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5QZXJjZW50IENvbXBsZXRlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldFBlcmNlbnRDb21wbGV0ZSgpCi0JICogQHNlZSAjZ2V0VGFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGFza19QZXJjZW50Q29tcGxldGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldFBlcmNlbnRXb3JrQ29tcGxldGUgPGVtPlBlcmNlbnQgV29yayBDb21wbGV0ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlBlcmNlbnQgV29yayBDb21wbGV0ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRQZXJjZW50V29ya0NvbXBsZXRlKCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrX1BlcmNlbnRXb3JrQ29tcGxldGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldENvc3QgPGVtPkNvc3Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Db3N0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldENvc3QoKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tfQ29zdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0T3ZlcnRpbWVDb3N0IDxlbT5PdmVydGltZSBDb3N0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+T3ZlcnRpbWUgQ29zdDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRPdmVydGltZUNvc3QoKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tfT3ZlcnRpbWVDb3N0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRPdmVydGltZVdvcmsgPGVtPk92ZXJ0aW1lIFdvcms8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5PdmVydGltZSBXb3JrPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldE92ZXJ0aW1lV29yaygpCi0JICogQHNlZSAjZ2V0VGFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGFza19PdmVydGltZVdvcmsoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldEFjdHVhbFN0YXJ0IDxlbT5BY3R1YWwgU3RhcnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5BY3R1YWwgU3RhcnQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0QWN0dWFsU3RhcnQoKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tfQWN0dWFsU3RhcnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldEFjdHVhbEZpbmlzaCA8ZW0+QWN0dWFsIEZpbmlzaDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkFjdHVhbCBGaW5pc2g8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0QWN0dWFsRmluaXNoKCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrX0FjdHVhbEZpbmlzaCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0QWN0dWFsRHVyYXRpb24gPGVtPkFjdHVhbCBEdXJhdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkFjdHVhbCBEdXJhdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRBY3R1YWxEdXJhdGlvbigpCi0JICogQHNlZSAjZ2V0VGFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGFza19BY3R1YWxEdXJhdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0QWN0dWFsQ29zdCA8ZW0+QWN0dWFsIENvc3Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5BY3R1YWwgQ29zdDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRBY3R1YWxDb3N0KCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrX0FjdHVhbENvc3QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldEFjdHVhbE92ZXJ0aW1lQ29zdCA8ZW0+QWN0dWFsIE92ZXJ0aW1lIENvc3Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5BY3R1YWwgT3ZlcnRpbWUgQ29zdDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRBY3R1YWxPdmVydGltZUNvc3QoKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tfQWN0dWFsT3ZlcnRpbWVDb3N0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRBY3R1YWxXb3JrIDxlbT5BY3R1YWwgV29yazwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkFjdHVhbCBXb3JrPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldEFjdHVhbFdvcmsoKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tfQWN0dWFsV29yaygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0QWN0dWFsT3ZlcnRpbWVXb3JrIDxlbT5BY3R1YWwgT3ZlcnRpbWUgV29yazwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkFjdHVhbCBPdmVydGltZSBXb3JrPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldEFjdHVhbE92ZXJ0aW1lV29yaygpCi0JICogQHNlZSAjZ2V0VGFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGFza19BY3R1YWxPdmVydGltZVdvcmsoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldFJlZ3VsYXJXb3JrIDxlbT5SZWd1bGFyIFdvcms8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5SZWd1bGFyIFdvcms8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0UmVndWxhcldvcmsoKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tfUmVndWxhcldvcmsoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldFJlbWFpbmluZ0R1cmF0aW9uIDxlbT5SZW1haW5pbmcgRHVyYXRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5SZW1haW5pbmcgRHVyYXRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0UmVtYWluaW5nRHVyYXRpb24oKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tfUmVtYWluaW5nRHVyYXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldFJlbWFpbmluZ0Nvc3QgPGVtPlJlbWFpbmluZyBDb3N0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UmVtYWluaW5nIENvc3Q8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0UmVtYWluaW5nQ29zdCgpCi0JICogQHNlZSAjZ2V0VGFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGFza19SZW1haW5pbmdDb3N0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRSZW1haW5pbmdXb3JrIDxlbT5SZW1haW5pbmcgV29yazwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlJlbWFpbmluZyBXb3JrPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldFJlbWFpbmluZ1dvcmsoKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tfUmVtYWluaW5nV29yaygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0UmVtYWluaW5nT3ZlcnRpbWVDb3N0IDxlbT5SZW1haW5pbmcgT3ZlcnRpbWUgQ29zdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlJlbWFpbmluZyBPdmVydGltZSBDb3N0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldFJlbWFpbmluZ092ZXJ0aW1lQ29zdCgpCi0JICogQHNlZSAjZ2V0VGFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGFza19SZW1haW5pbmdPdmVydGltZUNvc3QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldFJlbWFpbmluZ092ZXJ0aW1lV29yayA8ZW0+UmVtYWluaW5nIE92ZXJ0aW1lIFdvcms8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5SZW1haW5pbmcgT3ZlcnRpbWUgV29yazwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRSZW1haW5pbmdPdmVydGltZVdvcmsoKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tfUmVtYWluaW5nT3ZlcnRpbWVXb3JrKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRBQ1dQIDxlbT5BQ1dQPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+QUNXUDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRBQ1dQKCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrX0FDV1AoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldENWIDxlbT5DVjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkNWPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldENWKCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrX0NWKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRDb25zdHJhaW50VHlwZSA8ZW0+Q29uc3RyYWludCBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Q29uc3RyYWludCBUeXBlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldENvbnN0cmFpbnRUeXBlKCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrX0NvbnN0cmFpbnRUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRDYWxlbmRhclVJRCA8ZW0+Q2FsZW5kYXIgVUlEPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Q2FsZW5kYXIgVUlEPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldENhbGVuZGFyVUlEKCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrX0NhbGVuZGFyVUlEKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRDb25zdHJhaW50RGF0ZSA8ZW0+Q29uc3RyYWludCBEYXRlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Q29uc3RyYWludCBEYXRlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldENvbnN0cmFpbnREYXRlKCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrX0NvbnN0cmFpbnREYXRlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXREZWFkbGluZSA8ZW0+RGVhZGxpbmU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5EZWFkbGluZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXREZWFkbGluZSgpCi0JICogQHNlZSAjZ2V0VGFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGFza19EZWFkbGluZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjaXNMZXZlbEFzc2lnbm1lbnRzIDxlbT5MZXZlbCBBc3NpZ25tZW50czwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkxldmVsIEFzc2lnbm1lbnRzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2lzTGV2ZWxBc3NpZ25tZW50cygpCi0JICogQHNlZSAjZ2V0VGFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGFza19MZXZlbEFzc2lnbm1lbnRzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNpc0xldmVsaW5nQ2FuU3BsaXQgPGVtPkxldmVsaW5nIENhbiBTcGxpdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkxldmVsaW5nIENhbiBTcGxpdDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNpc0xldmVsaW5nQ2FuU3BsaXQoKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tfTGV2ZWxpbmdDYW5TcGxpdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0TGV2ZWxpbmdEZWxheSA8ZW0+TGV2ZWxpbmcgRGVsYXk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5MZXZlbGluZyBEZWxheTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRMZXZlbGluZ0RlbGF5KCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrX0xldmVsaW5nRGVsYXkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldExldmVsaW5nRGVsYXlGb3JtYXQgPGVtPkxldmVsaW5nIERlbGF5IEZvcm1hdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkxldmVsaW5nIERlbGF5IEZvcm1hdDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRMZXZlbGluZ0RlbGF5Rm9ybWF0KCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrX0xldmVsaW5nRGVsYXlGb3JtYXQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldFByZUxldmVsZWRTdGFydCA8ZW0+UHJlIExldmVsZWQgU3RhcnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5QcmUgTGV2ZWxlZCBTdGFydDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRQcmVMZXZlbGVkU3RhcnQoKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tfUHJlTGV2ZWxlZFN0YXJ0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRQcmVMZXZlbGVkRmluaXNoIDxlbT5QcmUgTGV2ZWxlZCBGaW5pc2g8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5QcmUgTGV2ZWxlZCBGaW5pc2g8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0UHJlTGV2ZWxlZEZpbmlzaCgpCi0JICogQHNlZSAjZ2V0VGFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGFza19QcmVMZXZlbGVkRmluaXNoKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRIeXBlcmxpbmsgPGVtPkh5cGVybGluazwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkh5cGVybGluazwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRIeXBlcmxpbmsoKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tfSHlwZXJsaW5rKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRIeXBlcmxpbmtBZGRyZXNzIDxlbT5IeXBlcmxpbmsgQWRkcmVzczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkh5cGVybGluayBBZGRyZXNzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldEh5cGVybGlua0FkZHJlc3MoKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tfSHlwZXJsaW5rQWRkcmVzcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0SHlwZXJsaW5rU3ViQWRkcmVzcyA8ZW0+SHlwZXJsaW5rIFN1YiBBZGRyZXNzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SHlwZXJsaW5rIFN1YiBBZGRyZXNzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldEh5cGVybGlua1N1YkFkZHJlc3MoKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tfSHlwZXJsaW5rU3ViQWRkcmVzcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjaXNJZ25vcmVSZXNvdXJjZUNhbGVuZGFyIDxlbT5JZ25vcmUgUmVzb3VyY2UgQ2FsZW5kYXI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5JZ25vcmUgUmVzb3VyY2UgQ2FsZW5kYXI8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjaXNJZ25vcmVSZXNvdXJjZUNhbGVuZGFyKCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrX0lnbm9yZVJlc291cmNlQ2FsZW5kYXIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldE5vdGVzIDxlbT5Ob3RlczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk5vdGVzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldE5vdGVzKCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrX05vdGVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNpc0hpZGVCYXIgPGVtPkhpZGUgQmFyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SGlkZSBCYXI8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjaXNIaWRlQmFyKCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrX0hpZGVCYXIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2lzUm9sbHVwIDxlbT5Sb2xsdXA8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Sb2xsdXA8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjaXNSb2xsdXAoKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tfUm9sbHVwKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRCQ1dTIDxlbT5CQ1dTPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+QkNXUzwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRCQ1dTKCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrX0JDV1MoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldEJDV1AgPGVtPkJDV1A8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5CQ1dQPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldEJDV1AoKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tfQkNXUCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0UGh5c2ljYWxQZXJjZW50Q29tcGxldGUgPGVtPlBoeXNpY2FsIFBlcmNlbnQgQ29tcGxldGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5QaHlzaWNhbCBQZXJjZW50IENvbXBsZXRlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldFBoeXNpY2FsUGVyY2VudENvbXBsZXRlKCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrX1BoeXNpY2FsUGVyY2VudENvbXBsZXRlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRFYXJuZWRWYWx1ZU1ldGhvZCA8ZW0+RWFybmVkIFZhbHVlIE1ldGhvZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkVhcm5lZCBWYWx1ZSBNZXRob2Q8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0RWFybmVkVmFsdWVNZXRob2QoKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tfRWFybmVkVmFsdWVNZXRob2QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0UHJlZGVjZXNzb3JMaW5rIDxlbT5QcmVkZWNlc3NvciBMaW5rPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5QcmVkZWNlc3NvciBMaW5rPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldFByZWRlY2Vzc29yTGluaygpCi0JICogQHNlZSAjZ2V0VGFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0VGFza19QcmVkZWNlc3NvckxpbmsoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldEFjdHVhbFdvcmtQcm90ZWN0ZWQgPGVtPkFjdHVhbCBXb3JrIFByb3RlY3RlZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkFjdHVhbCBXb3JrIFByb3RlY3RlZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRBY3R1YWxXb3JrUHJvdGVjdGVkKCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrX0FjdHVhbFdvcmtQcm90ZWN0ZWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldEFjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZCA8ZW0+QWN0dWFsIE92ZXJ0aW1lIFdvcmsgUHJvdGVjdGVkPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+QWN0dWFsIE92ZXJ0aW1lIFdvcmsgUHJvdGVjdGVkPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldEFjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZCgpCi0JICogQHNlZSAjZ2V0VGFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGFza19BY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUgPGVtPkV4dGVuZGVkIEF0dHJpYnV0ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+RXh0ZW5kZWQgQXR0cmlidXRlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldEV4dGVuZGVkQXR0cmlidXRlKCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRUYXNrX0V4dGVuZGVkQXR0cmlidXRlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldEJhc2VsaW5lIDxlbT5CYXNlbGluZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+QmFzZWxpbmU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0QmFzZWxpbmUoKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFRhc2tfQmFzZWxpbmUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0T3V0bGluZUNvZGUgPGVtPk91dGxpbmUgQ29kZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+T3V0bGluZSBDb2RlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldE91dGxpbmVDb2RlKCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRUYXNrX091dGxpbmVDb2RlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldFRpbWVwaGFzZWREYXRhIDxlbT5UaW1lcGhhc2VkIERhdGE8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPlRpbWVwaGFzZWQgRGF0YTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRUaW1lcGhhc2VkRGF0YSgpCi0JICogQHNlZSAjZ2V0VGFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0VGFza19UaW1lcGhhc2VkRGF0YSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrcyA8ZW0+VGFza3M8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+VGFza3M8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2tzCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRUYXNrcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFza3MjZ2V0VGFzayA8ZW0+VGFzazwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+VGFzazwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFza3MjZ2V0VGFzaygpCi0JICogQHNlZSAjZ2V0VGFza3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFRhc2tzX1Rhc2soKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGltZVBlcmlvZCA8ZW0+VGltZSBQZXJpb2Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+VGltZSBQZXJpb2Q8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRpbWVQZXJpb2QKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFRpbWVQZXJpb2QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UaW1lUGVyaW9kI2dldEZyb21EYXRlIDxlbT5Gcm9tIERhdGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Gcm9tIERhdGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRpbWVQZXJpb2QjZ2V0RnJvbURhdGUoKQotCSAqIEBzZWUgI2dldFRpbWVQZXJpb2QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRpbWVQZXJpb2RfRnJvbURhdGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UaW1lUGVyaW9kI2dldFRvRGF0ZSA8ZW0+VG8gRGF0ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlRvIERhdGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRpbWVQZXJpb2QjZ2V0VG9EYXRlKCkKLQkgKiBAc2VlICNnZXRUaW1lUGVyaW9kKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUaW1lUGVyaW9kX1RvRGF0ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UaW1lcGhhc2VkRGF0YVR5cGUgPGVtPlRpbWVwaGFzZWQgRGF0YSBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlRpbWVwaGFzZWQgRGF0YSBUeXBlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UaW1lcGhhc2VkRGF0YVR5cGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFRpbWVwaGFzZWREYXRhVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRpbWVwaGFzZWREYXRhVHlwZSNnZXRUeXBlIDxlbT5UeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VHlwZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGltZXBoYXNlZERhdGFUeXBlI2dldFR5cGUoKQotCSAqIEBzZWUgI2dldFRpbWVwaGFzZWREYXRhVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGltZXBoYXNlZERhdGFUeXBlX1R5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UaW1lcGhhc2VkRGF0YVR5cGUjZ2V0VUlEIDxlbT5VSUQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5VSUQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRpbWVwaGFzZWREYXRhVHlwZSNnZXRVSUQoKQotCSAqIEBzZWUgI2dldFRpbWVwaGFzZWREYXRhVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGltZXBoYXNlZERhdGFUeXBlX1VJRCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRpbWVwaGFzZWREYXRhVHlwZSNnZXRTdGFydCA8ZW0+U3RhcnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5TdGFydDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGltZXBoYXNlZERhdGFUeXBlI2dldFN0YXJ0KCkKLQkgKiBAc2VlICNnZXRUaW1lcGhhc2VkRGF0YVR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRpbWVwaGFzZWREYXRhVHlwZV9TdGFydCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRpbWVwaGFzZWREYXRhVHlwZSNnZXRGaW5pc2ggPGVtPkZpbmlzaDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkZpbmlzaDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGltZXBoYXNlZERhdGFUeXBlI2dldEZpbmlzaCgpCi0JICogQHNlZSAjZ2V0VGltZXBoYXNlZERhdGFUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUaW1lcGhhc2VkRGF0YVR5cGVfRmluaXNoKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGltZXBoYXNlZERhdGFUeXBlI2dldFVuaXQgPGVtPlVuaXQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Vbml0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UaW1lcGhhc2VkRGF0YVR5cGUjZ2V0VW5pdCgpCi0JICogQHNlZSAjZ2V0VGltZXBoYXNlZERhdGFUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUaW1lcGhhc2VkRGF0YVR5cGVfVW5pdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRpbWVwaGFzZWREYXRhVHlwZSNnZXRWYWx1ZSA8ZW0+VmFsdWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5WYWx1ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGltZXBoYXNlZERhdGFUeXBlI2dldFZhbHVlKCkKLQkgKiBAc2VlICNnZXRUaW1lcGhhc2VkRGF0YVR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRpbWVwaGFzZWREYXRhVHlwZV9WYWx1ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5WYWx1ZSA8ZW0+VmFsdWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+VmFsdWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlZhbHVlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRWYWx1ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlZhbHVlI2dldFZhbHVlSUQgPGVtPlZhbHVlIElEPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VmFsdWUgSUQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlZhbHVlI2dldFZhbHVlSUQoKQotCSAqIEBzZWUgI2dldFZhbHVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRWYWx1ZV9WYWx1ZUlEKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVmFsdWUjZ2V0UGFyZW50VmFsdWVJRCA8ZW0+UGFyZW50IFZhbHVlIElEPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UGFyZW50IFZhbHVlIElEPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5WYWx1ZSNnZXRQYXJlbnRWYWx1ZUlEKCkKLQkgKiBAc2VlICNnZXRWYWx1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VmFsdWVfUGFyZW50VmFsdWVJRCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlZhbHVlI2dldFZhbHVlIDxlbT5WYWx1ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlZhbHVlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5WYWx1ZSNnZXRWYWx1ZSgpCi0JICogQHNlZSAjZ2V0VmFsdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFZhbHVlX1ZhbHVlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVmFsdWUjZ2V0RGVzY3JpcHRpb24gPGVtPkRlc2NyaXB0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RGVzY3JpcHRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlZhbHVlI2dldERlc2NyaXB0aW9uKCkKLQkgKiBAc2VlICNnZXRWYWx1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VmFsdWVfRGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVmFsdWUyIDxlbT5WYWx1ZTI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+VmFsdWUyPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5WYWx1ZTIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFZhbHVlMigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlZhbHVlMiNnZXRJRCA8ZW0+SUQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5JRDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVmFsdWUyI2dldElEKCkKLQkgKiBAc2VlICNnZXRWYWx1ZTIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFZhbHVlMl9JRCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlZhbHVlMiNnZXRWYWx1ZSA8ZW0+VmFsdWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5WYWx1ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVmFsdWUyI2dldFZhbHVlKCkKLQkgKiBAc2VlICNnZXRWYWx1ZTIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFZhbHVlMl9WYWx1ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlZhbHVlMiNnZXREZXNjcmlwdGlvbiA8ZW0+RGVzY3JpcHRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5EZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVmFsdWUyI2dldERlc2NyaXB0aW9uKCkKLQkgKiBAc2VlICNnZXRWYWx1ZTIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFZhbHVlMl9EZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5WYWx1ZUxpc3QgPGVtPlZhbHVlIExpc3Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+VmFsdWUgTGlzdDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVmFsdWVMaXN0Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRWYWx1ZUxpc3QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlZhbHVlTGlzdCNnZXRWYWx1ZSA8ZW0+VmFsdWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPlZhbHVlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5WYWx1ZUxpc3QjZ2V0VmFsdWUoKQotCSAqIEBzZWUgI2dldFZhbHVlTGlzdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0VmFsdWVMaXN0X1ZhbHVlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlZhbHVlcyA8ZW0+VmFsdWVzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlZhbHVlczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVmFsdWVzCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRWYWx1ZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlZhbHVlcyNnZXRHcm91cCA8ZW0+R3JvdXA8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPkdyb3VwPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5WYWx1ZXMjZ2V0R3JvdXAoKQotCSAqIEBzZWUgI2dldFZhbHVlcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VmFsdWVzX0dyb3VwKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5WYWx1ZXMjZ2V0VmFsdWUgPGVtPlZhbHVlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5WYWx1ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVmFsdWVzI2dldFZhbHVlKCkKLQkgKiBAc2VlICNnZXRWYWx1ZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFZhbHVlc19WYWx1ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5XQlNNYXNrIDxlbT5XQlMgTWFzazwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5XQlMgTWFzazwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV0JTTWFzawotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0V0JTTWFzaygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldCU01hc2sjZ2V0TGV2ZWwgPGVtPkxldmVsPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TGV2ZWw8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldCU01hc2sjZ2V0TGV2ZWwoKQotCSAqIEBzZWUgI2dldFdCU01hc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFdCU01hc2tfTGV2ZWwoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5XQlNNYXNrI2dldFR5cGUgPGVtPlR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5UeXBlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5XQlNNYXNrI2dldFR5cGUoKQotCSAqIEBzZWUgI2dldFdCU01hc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFdCU01hc2tfVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldCU01hc2sjZ2V0TGVuZ3RoIDxlbT5MZW5ndGg8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5MZW5ndGg8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldCU01hc2sjZ2V0TGVuZ3RoKCkKLQkgKiBAc2VlICNnZXRXQlNNYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRXQlNNYXNrX0xlbmd0aCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldCU01hc2sjZ2V0U2VwYXJhdG9yIDxlbT5TZXBhcmF0b3I8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5TZXBhcmF0b3I8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldCU01hc2sjZ2V0U2VwYXJhdG9yKCkKLQkgKiBAc2VlICNnZXRXQlNNYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRXQlNNYXNrX1NlcGFyYXRvcigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5XQlNNYXNrcyA8ZW0+V0JTIE1hc2tzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPldCUyBNYXNrczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV0JTTWFza3MKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFdCU01hc2tzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV0JTTWFza3MjaXNWZXJpZnlVbmlxdWVDb2RlcyA8ZW0+VmVyaWZ5IFVuaXF1ZSBDb2RlczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlZlcmlmeSBVbmlxdWUgQ29kZXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldCU01hc2tzI2lzVmVyaWZ5VW5pcXVlQ29kZXMoKQotCSAqIEBzZWUgI2dldFdCU01hc2tzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRXQlNNYXNrc19WZXJpZnlVbmlxdWVDb2RlcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldCU01hc2tzI2lzR2VuZXJhdGVDb2RlcyA8ZW0+R2VuZXJhdGUgQ29kZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5HZW5lcmF0ZSBDb2RlczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV0JTTWFza3MjaXNHZW5lcmF0ZUNvZGVzKCkKLQkgKiBAc2VlICNnZXRXQlNNYXNrcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0V0JTTWFza3NfR2VuZXJhdGVDb2RlcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldCU01hc2tzI2dldFByZWZpeCA8ZW0+UHJlZml4PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UHJlZml4PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5XQlNNYXNrcyNnZXRQcmVmaXgoKQotCSAqIEBzZWUgI2dldFdCU01hc2tzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRXQlNNYXNrc19QcmVmaXgoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldCU01hc2tzI2dldFdCU01hc2sgPGVtPldCUyBNYXNrPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5XQlMgTWFzazwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV0JTTWFza3MjZ2V0V0JTTWFzaygpCi0JICogQHNlZSAjZ2V0V0JTTWFza3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFdCU01hc2tzX1dCU01hc2soKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV2Vla0RheSA8ZW0+V2VlayBEYXk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+V2VlayBEYXk8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldlZWtEYXkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFdlZWtEYXkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5XZWVrRGF5I2dldERheVR5cGUgPGVtPkRheSBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RGF5IFR5cGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldlZWtEYXkjZ2V0RGF5VHlwZSgpCi0JICogQHNlZSAjZ2V0V2Vla0RheSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0V2Vla0RheV9EYXlUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV2Vla0RheSNpc0RheVdvcmtpbmcgPGVtPkRheSBXb3JraW5nPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RGF5IFdvcmtpbmc8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldlZWtEYXkjaXNEYXlXb3JraW5nKCkKLQkgKiBAc2VlICNnZXRXZWVrRGF5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRXZWVrRGF5X0RheVdvcmtpbmcoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5XZWVrRGF5I2dldFRpbWVQZXJpb2QgPGVtPlRpbWUgUGVyaW9kPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+VGltZSBQZXJpb2Q8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldlZWtEYXkjZ2V0VGltZVBlcmlvZCgpCi0JICogQHNlZSAjZ2V0V2Vla0RheSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0V2Vla0RheV9UaW1lUGVyaW9kKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV2Vla0RheSNnZXRXb3JraW5nVGltZXMgPGVtPldvcmtpbmcgVGltZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5Xb3JraW5nIFRpbWVzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5XZWVrRGF5I2dldFdvcmtpbmdUaW1lcygpCi0JICogQHNlZSAjZ2V0V2Vla0RheSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0V2Vla0RheV9Xb3JraW5nVGltZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV2Vla0RheXMgPGVtPldlZWsgRGF5czwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5XZWVrIERheXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldlZWtEYXlzCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRXZWVrRGF5cygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV2Vla0RheXMjZ2V0V2Vla0RheSA8ZW0+V2VlayBEYXk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPldlZWsgRGF5PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5XZWVrRGF5cyNnZXRXZWVrRGF5KCkKLQkgKiBAc2VlICNnZXRXZWVrRGF5cygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0V2Vla0RheXNfV2Vla0RheSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Xb3JraW5nVGltZSA8ZW0+V29ya2luZyBUaW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPldvcmtpbmcgVGltZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV29ya2luZ1RpbWUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFdvcmtpbmdUaW1lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV29ya2luZ1RpbWUjZ2V0RnJvbVRpbWUgPGVtPkZyb20gVGltZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkZyb20gVGltZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV29ya2luZ1RpbWUjZ2V0RnJvbVRpbWUoKQotCSAqIEBzZWUgI2dldFdvcmtpbmdUaW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRXb3JraW5nVGltZV9Gcm9tVGltZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldvcmtpbmdUaW1lI2dldFRvVGltZSA8ZW0+VG8gVGltZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlRvIFRpbWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldvcmtpbmdUaW1lI2dldFRvVGltZSgpCi0JICogQHNlZSAjZ2V0V29ya2luZ1RpbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFdvcmtpbmdUaW1lX1RvVGltZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Xb3JraW5nVGltZXMgPGVtPldvcmtpbmcgVGltZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+V29ya2luZyBUaW1lczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV29ya2luZ1RpbWVzCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRXb3JraW5nVGltZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldvcmtpbmdUaW1lcyNnZXRXb3JraW5nVGltZSA8ZW0+V29ya2luZyBUaW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5Xb3JraW5nIFRpbWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldvcmtpbmdUaW1lcyNnZXRXb3JraW5nVGltZSgpCi0JICogQHNlZSAjZ2V0V29ya2luZ1RpbWVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRXb3JraW5nVGltZXNfV29ya2luZ1RpbWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLm1hdGguQmlnSW50ZWdlciA8ZW0+QWNjcnVlIEF0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5BY2NydWUgQXQ8L2VtPicuCi0JICogQHNlZSBqYXZhLm1hdGguQmlnSW50ZWdlcgotCSAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZhLm1hdGguQmlnSW50ZWdlciIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nQWNjcnVlQXRfLl90eXBlJyBiYXNlVHlwZT0naHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXInIGVudW1lcmF0aW9uPScxIDIgMyciIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRGF0YVR5cGUgZ2V0QWNjcnVlQXQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLmxhbmcuU3RyaW5nIDxlbT5BY3RpdmUgRGlyZWN0b3J5IEdVSUQgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+QWN0aXZlIERpcmVjdG9yeSBHVUlEIFR5cGU8L2VtPicuCi0JICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmEubGFuZy5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J0FjdGl2ZURpcmVjdG9yeUdVSURfLl90eXBlJyBiYXNlVHlwZT0naHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3N0cmluZycgbWF4TGVuZ3RoPScxNiciIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRGF0YVR5cGUgZ2V0QWN0aXZlRGlyZWN0b3J5R1VJRFR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLmxhbmcuU3RyaW5nIDxlbT5BbGlhcyBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5BbGlhcyBUeXBlPC9lbT4nLgotCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZwotCSAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZhLmxhbmcuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdBbGlhc18uX3R5cGUnIGJhc2VUeXBlPSdodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjc3RyaW5nJyBtYXhMZW5ndGg9JzUwJyIgCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXRBbGlhc1R5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLmxhbmcuU3RyaW5nIDxlbT5BdXRob3IgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+QXV0aG9yIFR5cGU8L2VtPicuCi0JICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmEubGFuZy5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J0F1dGhvcl8uX3R5cGUnIGJhc2VUeXBlPSdodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjc3RyaW5nJyBtYXhMZW5ndGg9JzUxMiciIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRGF0YVR5cGUgZ2V0QXV0aG9yVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIGphdmEubWF0aC5CaWdJbnRlZ2VyIDxlbT5CYXNlbGluZSBGb3IgRWFybmVkIFZhbHVlIFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPkJhc2VsaW5lIEZvciBFYXJuZWQgVmFsdWUgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIGphdmEubWF0aC5CaWdJbnRlZ2VyCi0JICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmEubWF0aC5CaWdJbnRlZ2VyIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdCYXNlbGluZUZvckVhcm5lZFZhbHVlXy5fdHlwZScgYmFzZVR5cGU9J2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyJyBlbnVtZXJhdGlvbj0nMCAxIDIgMyA0IDUgNiA3IDggOSAxMCciIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRGF0YVR5cGUgZ2V0QmFzZWxpbmVGb3JFYXJuZWRWYWx1ZVR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLm1hdGguQmlnSW50ZWdlciA8ZW0+Qm9va2luZyBUeXBlIFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPkJvb2tpbmcgVHlwZSBUeXBlPC9lbT4nLgotCSAqIEBzZWUgamF2YS5tYXRoLkJpZ0ludGVnZXIKLQkgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0iamF2YS5tYXRoLkJpZ0ludGVnZXIiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J0Jvb2tpbmdUeXBlXy5fdHlwZScgYmFzZVR5cGU9J2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyJyBlbnVtZXJhdGlvbj0nMCAxJyIgCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXRCb29raW5nVHlwZVR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLm1hdGguQmlnSW50ZWdlciA8ZW0+Qm9va2luZyBUeXBlIFR5cGUxPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5Cb29raW5nIFR5cGUgVHlwZTE8L2VtPicuCi0JICogQHNlZSBqYXZhLm1hdGguQmlnSW50ZWdlcgotCSAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZhLm1hdGguQmlnSW50ZWdlciIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nQm9va2luZ1R5cGVfLl8xXy5fdHlwZScgYmFzZVR5cGU9J2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyJyBlbnVtZXJhdGlvbj0nMCAxJyIgCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXRCb29raW5nVHlwZVR5cGUxKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICd7QGxpbmsgamF2YS5tYXRoLkJpZ0ludGVnZXIgPGVtPkNhbGN1bGF0aW9uIFR5cGUgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+Q2FsY3VsYXRpb24gVHlwZSBUeXBlPC9lbT4nLgotCSAqIEBzZWUgamF2YS5tYXRoLkJpZ0ludGVnZXIKLQkgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0iamF2YS5tYXRoLkJpZ0ludGVnZXIiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J0NhbGN1bGF0aW9uVHlwZV8uX3R5cGUnIGJhc2VUeXBlPSdodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjaW50ZWdlcicgZW51bWVyYXRpb249JzAgMSAyJyIgCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXRDYWxjdWxhdGlvblR5cGVUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICd7QGxpbmsgamF2YS5sYW5nLlN0cmluZyA8ZW0+Q2F0ZWdvcnkgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+Q2F0ZWdvcnkgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0iamF2YS5sYW5nLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nQ2F0ZWdvcnlfLl90eXBlJyBiYXNlVHlwZT0naHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3N0cmluZycgbWF4TGVuZ3RoPSc1MTInIiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRURhdGFUeXBlIGdldENhdGVnb3J5VHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIGphdmEubGFuZy5TdHJpbmcgPGVtPkNvZGUgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+Q29kZSBUeXBlPC9lbT4nLgotCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZwotCSAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZhLmxhbmcuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdDb2RlXy5fdHlwZScgYmFzZVR5cGU9J2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNzdHJpbmcnIG1heExlbmd0aD0nNTEyJyIgCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXRDb2RlVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIGphdmEubGFuZy5TdHJpbmcgPGVtPkNvbXBhbnkgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+Q29tcGFueSBUeXBlPC9lbT4nLgotCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZwotCSAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZhLmxhbmcuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdDb21wYW55Xy5fdHlwZScgYmFzZVR5cGU9J2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNzdHJpbmcnIG1heExlbmd0aD0nNTEyJyIgCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXRDb21wYW55VHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIGphdmEubWF0aC5CaWdJbnRlZ2VyIDxlbT5Db25zdHJhaW50IFR5cGUgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+Q29uc3RyYWludCBUeXBlIFR5cGU8L2VtPicuCi0JICogQHNlZSBqYXZhLm1hdGguQmlnSW50ZWdlcgotCSAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZhLm1hdGguQmlnSW50ZWdlciIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nQ29uc3RyYWludFR5cGVfLl90eXBlJyBiYXNlVHlwZT0naHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXInIGVudW1lcmF0aW9uPScwIDEgMiAzIDQgNSA2IDcnIiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRURhdGFUeXBlIGdldENvbnN0cmFpbnRUeXBlVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIGphdmEubGFuZy5TdHJpbmcgPGVtPkNvbnRhY3QgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+Q29udGFjdCBUeXBlPC9lbT4nLgotCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZwotCSAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZhLmxhbmcuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdDb250YWN0Xy5fdHlwZScgYmFzZVR5cGU9J2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNzdHJpbmcnIG1heExlbmd0aD0nNTEyJyIgCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXRDb250YWN0VHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIGphdmEubWF0aC5CaWdJbnRlZ2VyIDxlbT5Db3N0IFJhdGUgVGFibGUgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+Q29zdCBSYXRlIFRhYmxlIFR5cGU8L2VtPicuCi0JICogQHNlZSBqYXZhLm1hdGguQmlnSW50ZWdlcgotCSAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZhLm1hdGguQmlnSW50ZWdlciIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nQ29zdFJhdGVUYWJsZV8uX3R5cGUnIGJhc2VUeXBlPSdodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjaW50ZWdlcicgZW51bWVyYXRpb249JzAgMSAyIDMgNCciIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRGF0YVR5cGUgZ2V0Q29zdFJhdGVUYWJsZVR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLm1hdGguQmlnSW50ZWdlciA8ZW0+Q3VycmVuY3kgU3ltYm9sIFBvc2l0aW9uIFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPkN1cnJlbmN5IFN5bWJvbCBQb3NpdGlvbiBUeXBlPC9lbT4nLgotCSAqIEBzZWUgamF2YS5tYXRoLkJpZ0ludGVnZXIKLQkgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0iamF2YS5tYXRoLkJpZ0ludGVnZXIiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J0N1cnJlbmN5U3ltYm9sUG9zaXRpb25fLl90eXBlJyBiYXNlVHlwZT0naHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXInIGVudW1lcmF0aW9uPScwIDEgMiAzJyIgCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXRDdXJyZW5jeVN5bWJvbFBvc2l0aW9uVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIGphdmEubGFuZy5TdHJpbmcgPGVtPkN1cnJlbmN5IFN5bWJvbCBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5DdXJyZW5jeSBTeW1ib2wgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0iamF2YS5sYW5nLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nQ3VycmVuY3lTeW1ib2xfLl90eXBlJyBiYXNlVHlwZT0naHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3N0cmluZycgbWF4TGVuZ3RoPScyMCciIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRGF0YVR5cGUgZ2V0Q3VycmVuY3lTeW1ib2xUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICd7QGxpbmsgamF2YS5tYXRoLkJpZ0ludGVnZXIgPGVtPkRheSBUeXBlIFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPkRheSBUeXBlIFR5cGU8L2VtPicuCi0JICogQHNlZSBqYXZhLm1hdGguQmlnSW50ZWdlcgotCSAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZhLm1hdGguQmlnSW50ZWdlciIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nRGF5VHlwZV8uX3R5cGUnIGJhc2VUeXBlPSdodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjaW50ZWdlcicgZW51bWVyYXRpb249JzAgMSAyIDMgNCA1IDYgNyciIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRGF0YVR5cGUgZ2V0RGF5VHlwZVR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLm1hdGguQmlnSW50ZWdlciA8ZW0+RGVmYXVsdCBGaXhlZCBDb3N0IEFjY3J1YWwgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+RGVmYXVsdCBGaXhlZCBDb3N0IEFjY3J1YWwgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIGphdmEubWF0aC5CaWdJbnRlZ2VyCi0JICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmEubWF0aC5CaWdJbnRlZ2VyIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdEZWZhdWx0Rml4ZWRDb3N0QWNjcnVhbF8uX3R5cGUnIGJhc2VUeXBlPSdodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjaW50ZWdlcicgZW51bWVyYXRpb249JzEgMiAzJyIgCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXREZWZhdWx0Rml4ZWRDb3N0QWNjcnVhbFR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLm1hdGguQmlnSW50ZWdlciA8ZW0+RGVmYXVsdCBUYXNrIEVWIE1ldGhvZCBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5EZWZhdWx0IFRhc2sgRVYgTWV0aG9kIFR5cGU8L2VtPicuCi0JICogQHNlZSBqYXZhLm1hdGguQmlnSW50ZWdlcgotCSAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZhLm1hdGguQmlnSW50ZWdlciIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nRGVmYXVsdFRhc2tFVk1ldGhvZF8uX3R5cGUnIGJhc2VUeXBlPSdodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjaW50ZWdlcicgZW51bWVyYXRpb249JzAgMSciIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRGF0YVR5cGUgZ2V0RGVmYXVsdFRhc2tFVk1ldGhvZFR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLm1hdGguQmlnSW50ZWdlciA8ZW0+RGVmYXVsdCBUYXNrIFR5cGUgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+RGVmYXVsdCBUYXNrIFR5cGUgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIGphdmEubWF0aC5CaWdJbnRlZ2VyCi0JICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmEubWF0aC5CaWdJbnRlZ2VyIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdEZWZhdWx0VGFza1R5cGVfLl90eXBlJyBiYXNlVHlwZT0naHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXInIGVudW1lcmF0aW9uPScwIDEgMiciIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRGF0YVR5cGUgZ2V0RGVmYXVsdFRhc2tUeXBlVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIGphdmEubWF0aC5CaWdJbnRlZ2VyIDxlbT5EdXJhdGlvbiBGb3JtYXQgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+RHVyYXRpb24gRm9ybWF0IFR5cGU8L2VtPicuCi0JICogQHNlZSBqYXZhLm1hdGguQmlnSW50ZWdlcgotCSAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZhLm1hdGguQmlnSW50ZWdlciIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nRHVyYXRpb25Gb3JtYXRfLl90eXBlJyBiYXNlVHlwZT0naHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXInIGVudW1lcmF0aW9uPSczIDQgNSA2IDcgOCA5IDEwIDExIDEyIDE5IDIwIDIxIDM1IDM2IDM3IDM4IDM5IDQwIDQxIDQyIDQzIDQ0IDUxIDUyIDUzJyIgCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXREdXJhdGlvbkZvcm1hdFR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLm1hdGguQmlnSW50ZWdlciA8ZW0+RHVyYXRpb24gRm9ybWF0IFR5cGUxPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5EdXJhdGlvbiBGb3JtYXQgVHlwZTE8L2VtPicuCi0JICogQHNlZSBqYXZhLm1hdGguQmlnSW50ZWdlcgotCSAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZhLm1hdGguQmlnSW50ZWdlciIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nRHVyYXRpb25Gb3JtYXRfLl8xXy5fdHlwZScgYmFzZVR5cGU9J2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyJyBlbnVtZXJhdGlvbj0nMyA0IDUgNiA3IDggOSAxMCAxMSAxMiAxOSAyMCAyMSAzNSAzNiAzNyAzOCAzOSA0MCA0MSA0MiA0MyA0NCA1MSA1MiA1MyciIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRGF0YVR5cGUgZ2V0RHVyYXRpb25Gb3JtYXRUeXBlMSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIGphdmEubWF0aC5CaWdJbnRlZ2VyIDxlbT5EdXJhdGlvbiBGb3JtYXQgVHlwZTI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPkR1cmF0aW9uIEZvcm1hdCBUeXBlMjwvZW0+Jy4KLQkgKiBAc2VlIGphdmEubWF0aC5CaWdJbnRlZ2VyCi0JICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmEubWF0aC5CaWdJbnRlZ2VyIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdEdXJhdGlvbkZvcm1hdF8uXzJfLl90eXBlJyBiYXNlVHlwZT0naHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXInIGVudW1lcmF0aW9uPSczIDQgNSA2IDcgOCA5IDEwIDExIDEyIDE5IDIwIDIxIDM1IDM2IDM3IDM4IDM5IDQwIDQxIDQyIDQzIDQ0IDUxIDUyIDUzJyIgCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXREdXJhdGlvbkZvcm1hdFR5cGUyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICd7QGxpbmsgamF2YS5tYXRoLkJpZ0ludGVnZXIgPGVtPkR1cmF0aW9uIEZvcm1hdCBUeXBlMzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+RHVyYXRpb24gRm9ybWF0IFR5cGUzPC9lbT4nLgotCSAqIEBzZWUgamF2YS5tYXRoLkJpZ0ludGVnZXIKLQkgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0iamF2YS5tYXRoLkJpZ0ludGVnZXIiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J0R1cmF0aW9uRm9ybWF0Xy5fM18uX3R5cGUnIGJhc2VUeXBlPSdodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjaW50ZWdlcicgZW51bWVyYXRpb249JzMgNCA1IDYgNyA4IDkgMTAgMTEgMTIgMTkgMjAgMjEgMzUgMzYgMzcgMzggMzkgNDAgNDEgNDIgNDMgNDQgNTEgNTIgNTMnIiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRURhdGFUeXBlIGdldER1cmF0aW9uRm9ybWF0VHlwZTMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLm1hdGguQmlnSW50ZWdlciA8ZW0+RHVyYXRpb24gRm9ybWF0IFR5cGU0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5EdXJhdGlvbiBGb3JtYXQgVHlwZTQ8L2VtPicuCi0JICogQHNlZSBqYXZhLm1hdGguQmlnSW50ZWdlcgotCSAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZhLm1hdGguQmlnSW50ZWdlciIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nRHVyYXRpb25Gb3JtYXRfLl80Xy5fdHlwZScgYmFzZVR5cGU9J2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyJyBlbnVtZXJhdGlvbj0nMyA0IDUgNiA3IDggOSAxMCAxMSAxMiAxOSAyMCAyMSAzNSAzNiAzNyAzOCAzOSA0MCA0MSA0MiA0MyA0NCA1MSA1MiA1MyciIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRGF0YVR5cGUgZ2V0RHVyYXRpb25Gb3JtYXRUeXBlNCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIGphdmEubWF0aC5CaWdJbnRlZ2VyIDxlbT5EdXJhdGlvbiBGb3JtYXQgVHlwZTU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPkR1cmF0aW9uIEZvcm1hdCBUeXBlNTwvZW0+Jy4KLQkgKiBAc2VlIGphdmEubWF0aC5CaWdJbnRlZ2VyCi0JICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmEubWF0aC5CaWdJbnRlZ2VyIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdEdXJhdGlvbkZvcm1hdF8uXzVfLl90eXBlJyBiYXNlVHlwZT0naHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXInIGVudW1lcmF0aW9uPSczIDQgNSA2IDcgOCA5IDEwIDExIDEyIDE5IDIwIDIxIDM1IDM2IDM3IDM4IDM5IDQwIDQxIDQyIDQzIDQ0IDUxIDUyIDUzJyIgCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXREdXJhdGlvbkZvcm1hdFR5cGU1KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICd7QGxpbmsgamF2YS5tYXRoLkJpZ0ludGVnZXIgPGVtPkVhcm5lZCBWYWx1ZSBNZXRob2QgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+RWFybmVkIFZhbHVlIE1ldGhvZCBUeXBlPC9lbT4nLgotCSAqIEBzZWUgamF2YS5tYXRoLkJpZ0ludGVnZXIKLQkgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0iamF2YS5tYXRoLkJpZ0ludGVnZXIiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J0Vhcm5lZFZhbHVlTWV0aG9kXy5fdHlwZScgYmFzZVR5cGU9J2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyJyBlbnVtZXJhdGlvbj0nMCAxJyIgCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXRFYXJuZWRWYWx1ZU1ldGhvZFR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLm1hdGguQmlnSW50ZWdlciA8ZW0+RWFybmVkIFZhbHVlIE1ldGhvZCBUeXBlMTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+RWFybmVkIFZhbHVlIE1ldGhvZCBUeXBlMTwvZW0+Jy4KLQkgKiBAc2VlIGphdmEubWF0aC5CaWdJbnRlZ2VyCi0JICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmEubWF0aC5CaWdJbnRlZ2VyIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdFYXJuZWRWYWx1ZU1ldGhvZF8uXzFfLl90eXBlJyBiYXNlVHlwZT0naHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXInIGVudW1lcmF0aW9uPScwIDEnIiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRURhdGFUeXBlIGdldEVhcm5lZFZhbHVlTWV0aG9kVHlwZTEoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLmxhbmcuU3RyaW5nIDxlbT5FbWFpbCBBZGRyZXNzIFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPkVtYWlsIEFkZHJlc3MgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0iamF2YS5sYW5nLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nRW1haWxBZGRyZXNzXy5fdHlwZScgYmFzZVR5cGU9J2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNzdHJpbmcnIG1heExlbmd0aD0nNTEyJyIgCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXRFbWFpbEFkZHJlc3NUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICd7QGxpbmsgamF2YS5sYW5nLlN0cmluZyA8ZW0+RXh0ZXJuYWwgVGFzayBQcm9qZWN0IFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPkV4dGVybmFsIFRhc2sgUHJvamVjdCBUeXBlPC9lbT4nLgotCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZwotCSAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZhLmxhbmcuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdFeHRlcm5hbFRhc2tQcm9qZWN0Xy5fdHlwZScgYmFzZVR5cGU9J2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNzdHJpbmcnIG1heExlbmd0aD0nNTEyJyIgCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXRFeHRlcm5hbFRhc2tQcm9qZWN0VHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIGphdmEubGFuZy5TdHJpbmcgPGVtPkZpeGVkIENvc3QgQWNjcnVhbCBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5GaXhlZCBDb3N0IEFjY3J1YWwgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0iamF2YS5sYW5nLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nRml4ZWRDb3N0QWNjcnVhbF8uX3R5cGUnIGJhc2VUeXBlPSdodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjc3RyaW5nJyBlbnVtZXJhdGlvbj0nMSAyIDMnIiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRURhdGFUeXBlIGdldEZpeGVkQ29zdEFjY3J1YWxUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICd7QGxpbmsgamF2YS5tYXRoLkJpZ0ludGVnZXIgPGVtPkZZIFN0YXJ0IERhdGUgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+RlkgU3RhcnQgRGF0ZSBUeXBlPC9lbT4nLgotCSAqIEBzZWUgamF2YS5tYXRoLkJpZ0ludGVnZXIKLQkgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0iamF2YS5tYXRoLkJpZ0ludGVnZXIiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J0ZZU3RhcnREYXRlXy5fdHlwZScgYmFzZVR5cGU9J2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyJyBlbnVtZXJhdGlvbj0nMSAyIDMgNCA1IDYgNyA4IDkgMTAgMTEgMTInIiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRURhdGFUeXBlIGdldEZZU3RhcnREYXRlVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIGphdmEubGFuZy5TdHJpbmcgPGVtPkdyb3VwIFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPkdyb3VwIFR5cGU8L2VtPicuCi0JICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmEubGFuZy5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J0dyb3VwXy5fdHlwZScgYmFzZVR5cGU9J2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNzdHJpbmcnIG1heExlbmd0aD0nNTEyJyIgCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXRHcm91cFR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLmxhbmcuU3RyaW5nIDxlbT5IeXBlcmxpbmsgQWRkcmVzcyBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5IeXBlcmxpbmsgQWRkcmVzcyBUeXBlPC9lbT4nLgotCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZwotCSAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZhLmxhbmcuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdIeXBlcmxpbmtBZGRyZXNzXy5fdHlwZScgYmFzZVR5cGU9J2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNzdHJpbmcnIG1heExlbmd0aD0nNTEyJyIgCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXRIeXBlcmxpbmtBZGRyZXNzVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIGphdmEubGFuZy5TdHJpbmcgPGVtPkh5cGVybGluayBBZGRyZXNzIFR5cGUxPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5IeXBlcmxpbmsgQWRkcmVzcyBUeXBlMTwvZW0+Jy4KLQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0iamF2YS5sYW5nLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nSHlwZXJsaW5rQWRkcmVzc18uXzFfLl90eXBlJyBiYXNlVHlwZT0naHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3N0cmluZycgbWF4TGVuZ3RoPSc1MTInIiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRURhdGFUeXBlIGdldEh5cGVybGlua0FkZHJlc3NUeXBlMSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIGphdmEubGFuZy5TdHJpbmcgPGVtPkh5cGVybGluayBBZGRyZXNzIFR5cGUyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5IeXBlcmxpbmsgQWRkcmVzcyBUeXBlMjwvZW0+Jy4KLQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0iamF2YS5sYW5nLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nSHlwZXJsaW5rQWRkcmVzc18uXzJfLl90eXBlJyBiYXNlVHlwZT0naHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3N0cmluZycgbWF4TGVuZ3RoPSc1MTInIiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRURhdGFUeXBlIGdldEh5cGVybGlua0FkZHJlc3NUeXBlMigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIGphdmEubGFuZy5TdHJpbmcgPGVtPkh5cGVybGluayBTdWIgQWRkcmVzcyBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5IeXBlcmxpbmsgU3ViIEFkZHJlc3MgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0iamF2YS5sYW5nLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nSHlwZXJsaW5rU3ViQWRkcmVzc18uX3R5cGUnIGJhc2VUeXBlPSdodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjc3RyaW5nJyBtYXhMZW5ndGg9JzUxMiciIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRGF0YVR5cGUgZ2V0SHlwZXJsaW5rU3ViQWRkcmVzc1R5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLmxhbmcuU3RyaW5nIDxlbT5IeXBlcmxpbmsgU3ViIEFkZHJlc3MgVHlwZTE8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPkh5cGVybGluayBTdWIgQWRkcmVzcyBUeXBlMTwvZW0+Jy4KLQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0iamF2YS5sYW5nLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nSHlwZXJsaW5rU3ViQWRkcmVzc18uXzFfLl90eXBlJyBiYXNlVHlwZT0naHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3N0cmluZycgbWF4TGVuZ3RoPSc1MTInIiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRURhdGFUeXBlIGdldEh5cGVybGlua1N1YkFkZHJlc3NUeXBlMSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIGphdmEubGFuZy5TdHJpbmcgPGVtPkh5cGVybGluayBTdWIgQWRkcmVzcyBUeXBlMjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+SHlwZXJsaW5rIFN1YiBBZGRyZXNzIFR5cGUyPC9lbT4nLgotCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZwotCSAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZhLmxhbmcuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdIeXBlcmxpbmtTdWJBZGRyZXNzXy5fMl8uX3R5cGUnIGJhc2VUeXBlPSdodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjc3RyaW5nJyBtYXhMZW5ndGg9JzUxMiciIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRGF0YVR5cGUgZ2V0SHlwZXJsaW5rU3ViQWRkcmVzc1R5cGUyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICd7QGxpbmsgamF2YS5sYW5nLlN0cmluZyA8ZW0+SHlwZXJsaW5rIFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPkh5cGVybGluayBUeXBlPC9lbT4nLgotCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZwotCSAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZhLmxhbmcuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdIeXBlcmxpbmtfLl90eXBlJyBiYXNlVHlwZT0naHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3N0cmluZycgbWF4TGVuZ3RoPSc1MTInIiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRURhdGFUeXBlIGdldEh5cGVybGlua1R5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLmxhbmcuU3RyaW5nIDxlbT5IeXBlcmxpbmsgVHlwZTE8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPkh5cGVybGluayBUeXBlMTwvZW0+Jy4KLQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0iamF2YS5sYW5nLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nSHlwZXJsaW5rXy5fMV8uX3R5cGUnIGJhc2VUeXBlPSdodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjc3RyaW5nJyBtYXhMZW5ndGg9JzUxMiciIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRGF0YVR5cGUgZ2V0SHlwZXJsaW5rVHlwZTEoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLmxhbmcuU3RyaW5nIDxlbT5IeXBlcmxpbmsgVHlwZTI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPkh5cGVybGluayBUeXBlMjwvZW0+Jy4KLQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0iamF2YS5sYW5nLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nSHlwZXJsaW5rXy5fMl8uX3R5cGUnIGJhc2VUeXBlPSdodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjc3RyaW5nJyBtYXhMZW5ndGg9JzUxMiciIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRGF0YVR5cGUgZ2V0SHlwZXJsaW5rVHlwZTIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLmxhbmcuU3RyaW5nIDxlbT5Jbml0aWFscyBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5Jbml0aWFscyBUeXBlPC9lbT4nLgotCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZwotCSAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZhLmxhbmcuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdJbml0aWFsc18uX3R5cGUnIGJhc2VUeXBlPSdodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjc3RyaW5nJyBtYXhMZW5ndGg9JzUxMiciIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRGF0YVR5cGUgZ2V0SW5pdGlhbHNUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICd7QGxpbmsgamF2YS5tYXRoLkJpZ0ludGVnZXIgPGVtPkxhZyBGb3JtYXQgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+TGFnIEZvcm1hdCBUeXBlPC9lbT4nLgotCSAqIEBzZWUgamF2YS5tYXRoLkJpZ0ludGVnZXIKLQkgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0iamF2YS5tYXRoLkJpZ0ludGVnZXIiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J0xhZ0Zvcm1hdF8uX3R5cGUnIGJhc2VUeXBlPSdodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjaW50ZWdlcicgZW51bWVyYXRpb249JzMgNCA1IDYgNyA4IDkgMTAgMTEgMTIgMTkgMjAgMzUgMzYgMzcgMzggMzkgNDAgNDEgNDIgNDMgNDQgNTEgNTIgNTMnIiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRURhdGFUeXBlIGdldExhZ0Zvcm1hdFR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLm1hdGguQmlnSW50ZWdlciA8ZW0+TGV2ZWxpbmcgRGVsYXkgRm9ybWF0IFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPkxldmVsaW5nIERlbGF5IEZvcm1hdCBUeXBlPC9lbT4nLgotCSAqIEBzZWUgamF2YS5tYXRoLkJpZ0ludGVnZXIKLQkgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0iamF2YS5tYXRoLkJpZ0ludGVnZXIiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J0xldmVsaW5nRGVsYXlGb3JtYXRfLl90eXBlJyBiYXNlVHlwZT0naHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXInIGVudW1lcmF0aW9uPSczIDQgNSA2IDcgOCA5IDEwIDExIDEyIDE5IDIwIDIxIDM1IDM2IDM3IDM4IDM5IDQwIDQxIDQyIDQzIDQ0IDUxIDUyIDUzJyIgCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXRMZXZlbGluZ0RlbGF5Rm9ybWF0VHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIGphdmEubWF0aC5CaWdJbnRlZ2VyIDxlbT5MZXZlbGluZyBEZWxheSBGb3JtYXQgVHlwZTE8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPkxldmVsaW5nIERlbGF5IEZvcm1hdCBUeXBlMTwvZW0+Jy4KLQkgKiBAc2VlIGphdmEubWF0aC5CaWdJbnRlZ2VyCi0JICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmEubWF0aC5CaWdJbnRlZ2VyIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdMZXZlbGluZ0RlbGF5Rm9ybWF0Xy5fMV8uX3R5cGUnIGJhc2VUeXBlPSdodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjaW50ZWdlcicgZW51bWVyYXRpb249JzMgNCA1IDYgNyA4IDkgMTAgMTEgMTIgMTkgMjAgMjEgMzUgMzYgMzcgMzggMzkgNDAgNDEgNDIgNDMgNDQgNTEgNTIgNTMnIiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRURhdGFUeXBlIGdldExldmVsaW5nRGVsYXlGb3JtYXRUeXBlMSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIGphdmEubGFuZy5TdHJpbmcgPGVtPk1hbmFnZXIgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+TWFuYWdlciBUeXBlPC9lbT4nLgotCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZwotCSAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZhLmxhbmcuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdNYW5hZ2VyXy5fdHlwZScgYmFzZVR5cGU9J2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNzdHJpbmcnIG1heExlbmd0aD0nNTEyJyIgCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXRNYW5hZ2VyVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIGphdmEubGFuZy5TdHJpbmcgPGVtPk1hdGVyaWFsIExhYmVsIFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPk1hdGVyaWFsIExhYmVsIFR5cGU8L2VtPicuCi0JICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmEubGFuZy5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J01hdGVyaWFsTGFiZWxfLl90eXBlJyBiYXNlVHlwZT0naHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3N0cmluZycgbWF4TGVuZ3RoPSc1MTInIiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRURhdGFUeXBlIGdldE1hdGVyaWFsTGFiZWxUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICd7QGxpbmsgamF2YS5sYW5nLlN0cmluZyA8ZW0+TmFtZSBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5OYW1lIFR5cGU8L2VtPicuCi0JICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmEubGFuZy5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J05hbWVfLl90eXBlJyBiYXNlVHlwZT0naHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3N0cmluZycgbWF4TGVuZ3RoPSc1MTInIiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRURhdGFUeXBlIGdldE5hbWVUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICd7QGxpbmsgamF2YS5sYW5nLlN0cmluZyA8ZW0+TmFtZSBUeXBlMTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+TmFtZSBUeXBlMTwvZW0+Jy4KLQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0iamF2YS5sYW5nLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nTmFtZV8uXzFfLl90eXBlJyBiYXNlVHlwZT0naHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3N0cmluZycgbWF4TGVuZ3RoPSc1MTInIiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRURhdGFUeXBlIGdldE5hbWVUeXBlMSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIGphdmEubGFuZy5TdHJpbmcgPGVtPk5hbWUgVHlwZTI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPk5hbWUgVHlwZTI8L2VtPicuCi0JICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmEubGFuZy5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J05hbWVfLl8yXy5fdHlwZScgYmFzZVR5cGU9J2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNzdHJpbmcnIG1heExlbmd0aD0nNTEyJyIgCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXROYW1lVHlwZTIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLmxhbmcuU3RyaW5nIDxlbT5OYW1lIFR5cGUzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5OYW1lIFR5cGUzPC9lbT4nLgotCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZwotCSAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZhLmxhbmcuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdOYW1lXy5fM18uX3R5cGUnIGJhc2VUeXBlPSdodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjc3RyaW5nJyBtYXhMZW5ndGg9JzI1NSciIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRGF0YVR5cGUgZ2V0TmFtZVR5cGUzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICd7QGxpbmsgamF2YS5tYXRoLkJpZ0ludGVnZXIgPGVtPk5ldyBUYXNrIFN0YXJ0IERhdGUgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+TmV3IFRhc2sgU3RhcnQgRGF0ZSBUeXBlPC9lbT4nLgotCSAqIEBzZWUgamF2YS5tYXRoLkJpZ0ludGVnZXIKLQkgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0iamF2YS5tYXRoLkJpZ0ludGVnZXIiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J05ld1Rhc2tTdGFydERhdGVfLl90eXBlJyBiYXNlVHlwZT0naHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXInIGVudW1lcmF0aW9uPScwIDEnIiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRURhdGFUeXBlIGdldE5ld1Rhc2tTdGFydERhdGVUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICd7QGxpbmsgamF2YS5sYW5nLlN0cmluZyA8ZW0+TlQgQWNjb3VudCBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5OVCBBY2NvdW50IFR5cGU8L2VtPicuCi0JICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmEubGFuZy5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J05UQWNjb3VudF8uX3R5cGUnIGJhc2VUeXBlPSdodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjc3RyaW5nJyBtYXhMZW5ndGg9JzUxMiciIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRGF0YVR5cGUgZ2V0TlRBY2NvdW50VHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIGphdmEubGFuZy5TdHJpbmcgPGVtPk91dGxpbmUgTnVtYmVyIFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPk91dGxpbmUgTnVtYmVyIFR5cGU8L2VtPicuCi0JICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmEubGFuZy5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J091dGxpbmVOdW1iZXJfLl90eXBlJyBiYXNlVHlwZT0naHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3N0cmluZycgbWF4TGVuZ3RoPSc1MTInIiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRURhdGFUeXBlIGdldE91dGxpbmVOdW1iZXJUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICd7QGxpbmsgamF2YS5tYXRoLkJpZ0ludGVnZXIgPGVtPk92ZXJ0aW1lIFJhdGUgRm9ybWF0IFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPk92ZXJ0aW1lIFJhdGUgRm9ybWF0IFR5cGU8L2VtPicuCi0JICogQHNlZSBqYXZhLm1hdGguQmlnSW50ZWdlcgotCSAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZhLm1hdGguQmlnSW50ZWdlciIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nT3ZlcnRpbWVSYXRlRm9ybWF0Xy5fdHlwZScgYmFzZVR5cGU9J2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyJyBlbnVtZXJhdGlvbj0nMSAyIDMgNCA1IDcnIiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRURhdGFUeXBlIGdldE92ZXJ0aW1lUmF0ZUZvcm1hdFR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLm1hdGguQmlnSW50ZWdlciA8ZW0+T3ZlcnRpbWUgUmF0ZSBGb3JtYXQgVHlwZTE8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPk92ZXJ0aW1lIFJhdGUgRm9ybWF0IFR5cGUxPC9lbT4nLgotCSAqIEBzZWUgamF2YS5tYXRoLkJpZ0ludGVnZXIKLQkgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0iamF2YS5tYXRoLkJpZ0ludGVnZXIiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J092ZXJ0aW1lUmF0ZUZvcm1hdF8uXzFfLl90eXBlJyBiYXNlVHlwZT0naHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXInIGVudW1lcmF0aW9uPScxIDIgMyA0IDUgNyciIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRGF0YVR5cGUgZ2V0T3ZlcnRpbWVSYXRlRm9ybWF0VHlwZTEoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLmxhbmcuU3RyaW5nIDxlbT5QaG9uZXRpYyBBbGlhcyBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5QaG9uZXRpYyBBbGlhcyBUeXBlPC9lbT4nLgotCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZwotCSAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZhLmxhbmcuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdQaG9uZXRpY0FsaWFzXy5fdHlwZScgYmFzZVR5cGU9J2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNzdHJpbmcnIG1heExlbmd0aD0nNTAnIiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRURhdGFUeXBlIGdldFBob25ldGljQWxpYXNUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICd7QGxpbmsgamF2YS5sYW5nLlN0cmluZyA8ZW0+UGhvbmV0aWNzIFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPlBob25ldGljcyBUeXBlPC9lbT4nLgotCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZwotCSAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZhLmxhbmcuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdQaG9uZXRpY3NfLl90eXBlJyBiYXNlVHlwZT0naHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3N0cmluZycgbWF4TGVuZ3RoPSc1MTInIiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRURhdGFUeXBlIGdldFBob25ldGljc1R5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLmxhbmcuU3RyaW5nIDxlbT5QcmVmaXggVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+UHJlZml4IFR5cGU8L2VtPicuCi0JICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmEubGFuZy5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J1ByZWZpeF8uX3R5cGUnIGJhc2VUeXBlPSdodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjc3RyaW5nJyBtYXhMZW5ndGg9JzUwJyIgCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXRQcmVmaXhUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICd7QGxpbmsgamF2YS5tYXRoLkJpZ0ludGVnZXIgPGVtPlJhdGUgVGFibGUgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+UmF0ZSBUYWJsZSBUeXBlPC9lbT4nLgotCSAqIEBzZWUgamF2YS5tYXRoLkJpZ0ludGVnZXIKLQkgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0iamF2YS5tYXRoLkJpZ0ludGVnZXIiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J1JhdGVUYWJsZV8uX3R5cGUnIGJhc2VUeXBlPSdodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjaW50ZWdlcicgZW51bWVyYXRpb249JzAgMSAyIDMgNCciIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRGF0YVR5cGUgZ2V0UmF0ZVRhYmxlVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIGphdmEubWF0aC5CaWdJbnRlZ2VyIDxlbT5Sb2xsdXAgVHlwZSBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5Sb2xsdXAgVHlwZSBUeXBlPC9lbT4nLgotCSAqIEBzZWUgamF2YS5tYXRoLkJpZ0ludGVnZXIKLQkgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0iamF2YS5tYXRoLkJpZ0ludGVnZXIiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J1JvbGx1cFR5cGVfLl90eXBlJyBiYXNlVHlwZT0naHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXInIGVudW1lcmF0aW9uPScwIDEgMiAzIDQgNSA2IDcnIiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRURhdGFUeXBlIGdldFJvbGx1cFR5cGVUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICd7QGxpbmsgamF2YS5tYXRoLkJpZ0ludGVnZXIgPGVtPlN0YW5kYXJkIFJhdGUgRm9ybWF0IFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPlN0YW5kYXJkIFJhdGUgRm9ybWF0IFR5cGU8L2VtPicuCi0JICogQHNlZSBqYXZhLm1hdGguQmlnSW50ZWdlcgotCSAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZhLm1hdGguQmlnSW50ZWdlciIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nU3RhbmRhcmRSYXRlRm9ybWF0Xy5fdHlwZScgYmFzZVR5cGU9J2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyJyBlbnVtZXJhdGlvbj0nMSAyIDMgNCA1IDcnIiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRURhdGFUeXBlIGdldFN0YW5kYXJkUmF0ZUZvcm1hdFR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLm1hdGguQmlnSW50ZWdlciA8ZW0+U3RhbmRhcmQgUmF0ZSBGb3JtYXQgVHlwZTE8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPlN0YW5kYXJkIFJhdGUgRm9ybWF0IFR5cGUxPC9lbT4nLgotCSAqIEBzZWUgamF2YS5tYXRoLkJpZ0ludGVnZXIKLQkgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0iamF2YS5tYXRoLkJpZ0ludGVnZXIiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J1N0YW5kYXJkUmF0ZUZvcm1hdF8uXzFfLl90eXBlJyBiYXNlVHlwZT0naHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXInIGVudW1lcmF0aW9uPScxIDIgMyA0IDUgNyA4JyIgCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXRTdGFuZGFyZFJhdGVGb3JtYXRUeXBlMSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIGphdmEubGFuZy5TdHJpbmcgPGVtPlN1YmplY3QgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+U3ViamVjdCBUeXBlPC9lbT4nLgotCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZwotCSAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZhLmxhbmcuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdTdWJqZWN0Xy5fdHlwZScgYmFzZVR5cGU9J2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNzdHJpbmcnIG1heExlbmd0aD0nNTEyJyIgCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXRTdWJqZWN0VHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIGphdmEubGFuZy5TdHJpbmcgPGVtPlN1YnByb2plY3QgTmFtZSBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5TdWJwcm9qZWN0IE5hbWUgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0iamF2YS5sYW5nLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nU3VicHJvamVjdE5hbWVfLl90eXBlJyBiYXNlVHlwZT0naHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3N0cmluZycgbWF4TGVuZ3RoPSc1MTInIiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRURhdGFUeXBlIGdldFN1YnByb2plY3ROYW1lVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIGphdmEubGFuZy5TdHJpbmcgPGVtPlRpdGxlIFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPlRpdGxlIFR5cGU8L2VtPicuCi0JICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmEubGFuZy5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J1RpdGxlXy5fdHlwZScgYmFzZVR5cGU9J2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNzdHJpbmcnIG1heExlbmd0aD0nNTEyJyIgCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXRUaXRsZVR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLm1hdGguQmlnSW50ZWdlciA8ZW0+VHlwZSBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5UeXBlIFR5cGU8L2VtPicuCi0JICogQHNlZSBqYXZhLm1hdGguQmlnSW50ZWdlcgotCSAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZhLm1hdGguQmlnSW50ZWdlciIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nVHlwZV8uX3R5cGUnIGJhc2VUeXBlPSdodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjaW50ZWdlcicgZW51bWVyYXRpb249JzAgMSAyJyIgCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXRUeXBlVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIGphdmEubWF0aC5CaWdJbnRlZ2VyIDxlbT5UeXBlIFR5cGUxPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5UeXBlIFR5cGUxPC9lbT4nLgotCSAqIEBzZWUgamF2YS5tYXRoLkJpZ0ludGVnZXIKLQkgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0iamF2YS5tYXRoLkJpZ0ludGVnZXIiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J1R5cGVfLl8xXy5fdHlwZScgYmFzZVR5cGU9J2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyJyBlbnVtZXJhdGlvbj0nMCAxIDIgMyciIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRGF0YVR5cGUgZ2V0VHlwZVR5cGUxKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICd7QGxpbmsgamF2YS5tYXRoLkJpZ0ludGVnZXIgPGVtPlR5cGUgVHlwZTI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPlR5cGUgVHlwZTI8L2VtPicuCi0JICogQHNlZSBqYXZhLm1hdGguQmlnSW50ZWdlcgotCSAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZhLm1hdGguQmlnSW50ZWdlciIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nVHlwZV8uXzJfLl90eXBlJyBiYXNlVHlwZT0naHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXInIGVudW1lcmF0aW9uPScwIDEgMiAzJyIgCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXRUeXBlVHlwZTIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLm1hdGguQmlnSW50ZWdlciA8ZW0+VHlwZSBUeXBlMzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+VHlwZSBUeXBlMzwvZW0+Jy4KLQkgKiBAc2VlIGphdmEubWF0aC5CaWdJbnRlZ2VyCi0JICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmEubWF0aC5CaWdJbnRlZ2VyIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdUeXBlXy5fM18uX3R5cGUnIGJhc2VUeXBlPSdodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjaW50ZWdlcicgZW51bWVyYXRpb249JzEgMiAzIDQgNSA2IDcgOCA5IDEwIDExIDE2IDE3IDE4IDE5IDIwIDIxIDIyIDIzIDI0IDI1IDI2IDI3IDI4IDI5IDMwIDMxIDMyIDMzIDM0IDM1IDM2IDM3IDM4IDM5IDQwIDQxIDQyIDQzIDQ0IDQ1IDQ2IDQ3IDQ4IDQ5IDUwIDUxIDUyIDUzIDU0IDU1IDU2IDU3IDU4IDU5IDYwIDYxIDYyIDYzIDY0IDY1IDY2IDY3IDY4IDY5IDcwIDcxIDcyIDczIDc0IDc1IDc2JyIgCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXRUeXBlVHlwZTMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLm1hdGguQmlnSW50ZWdlciA8ZW0+VHlwZSBUeXBlNDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+VHlwZSBUeXBlNDwvZW0+Jy4KLQkgKiBAc2VlIGphdmEubWF0aC5CaWdJbnRlZ2VyCi0JICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmEubWF0aC5CaWdJbnRlZ2VyIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdUeXBlXy5fNF8uX3R5cGUnIGJhc2VUeXBlPSdodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjaW50ZWdlcicgZW51bWVyYXRpb249JzAgMSciIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRGF0YVR5cGUgZ2V0VHlwZVR5cGU0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICd7QGxpbmsgamF2YS5tYXRoLkJpZ0ludGVnZXIgPGVtPlR5cGUgVHlwZTU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPlR5cGUgVHlwZTU8L2VtPicuCi0JICogQHNlZSBqYXZhLm1hdGguQmlnSW50ZWdlcgotCSAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZhLm1hdGguQmlnSW50ZWdlciIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nVHlwZV8uXzVfLl90eXBlJyBiYXNlVHlwZT0naHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXInIGVudW1lcmF0aW9uPScwIDEgMiAzJyIgCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXRUeXBlVHlwZTUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLmxhbmcuU3RyaW5nIDxlbT5VSUQgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+VUlEIFR5cGU8L2VtPicuCi0JICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmEubGFuZy5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J1VJRF8uX3R5cGUnIGJhc2VUeXBlPSdodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjc3RyaW5nJyBtYXhMZW5ndGg9JzE2JyIgCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXRVSURUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICd7QGxpbmsgamF2YS5tYXRoLkJpZ0ludGVnZXIgPGVtPlVuaXQgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+VW5pdCBUeXBlPC9lbT4nLgotCSAqIEBzZWUgamF2YS5tYXRoLkJpZ0ludGVnZXIKLQkgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0iamF2YS5tYXRoLkJpZ0ludGVnZXIiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J1VuaXRfLl90eXBlJyBiYXNlVHlwZT0naHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXInIGVudW1lcmF0aW9uPScwIDEgMiAzIDUgOCciIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRGF0YVR5cGUgZ2V0VW5pdFR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLm1hdGguQmlnSW50ZWdlciA8ZW0+VmFsdWVsaXN0IFNvcnQgT3JkZXIgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+VmFsdWVsaXN0IFNvcnQgT3JkZXIgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIGphdmEubWF0aC5CaWdJbnRlZ2VyCi0JICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmEubWF0aC5CaWdJbnRlZ2VyIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdWYWx1ZWxpc3RTb3J0T3JkZXJfLl90eXBlJyBiYXNlVHlwZT0naHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXInIGVudW1lcmF0aW9uPScwIDEnIiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRURhdGFUeXBlIGdldFZhbHVlbGlzdFNvcnRPcmRlclR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLm1hdGguQmlnSW50ZWdlciA8ZW0+V2VlayBTdGFydCBEYXkgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+V2VlayBTdGFydCBEYXkgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIGphdmEubWF0aC5CaWdJbnRlZ2VyCi0JICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmEubWF0aC5CaWdJbnRlZ2VyIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdXZWVrU3RhcnREYXlfLl90eXBlJyBiYXNlVHlwZT0naHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXInIGVudW1lcmF0aW9uPScwIDEgMiAzIDQgNSA2JyIgCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXRXZWVrU3RhcnREYXlUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICd7QGxpbmsgamF2YS5tYXRoLkJpZ0ludGVnZXIgPGVtPldvcmsgQ29udG91ciBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5Xb3JrIENvbnRvdXIgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIGphdmEubWF0aC5CaWdJbnRlZ2VyCi0JICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmEubWF0aC5CaWdJbnRlZ2VyIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdXb3JrQ29udG91cl8uX3R5cGUnIGJhc2VUeXBlPSdodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjaW50ZWdlcicgZW51bWVyYXRpb249JzAgMSAyIDMgNCA1IDYgNyA4JyIgCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXRXb3JrQ29udG91clR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLm1hdGguQmlnSW50ZWdlciA8ZW0+V29yayBGb3JtYXQgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+V29yayBGb3JtYXQgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIGphdmEubWF0aC5CaWdJbnRlZ2VyCi0JICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmEubWF0aC5CaWdJbnRlZ2VyIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdXb3JrRm9ybWF0Xy5fdHlwZScgYmFzZVR5cGU9J2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyJyBlbnVtZXJhdGlvbj0nMSAyIDMgNCA1JyIgCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXRXb3JrRm9ybWF0VHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIGphdmEubWF0aC5CaWdJbnRlZ2VyIDxlbT5Xb3JrIEdyb3VwIFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPldvcmsgR3JvdXAgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIGphdmEubWF0aC5CaWdJbnRlZ2VyCi0JICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmEubWF0aC5CaWdJbnRlZ2VyIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdXb3JrR3JvdXBfLl90eXBlJyBiYXNlVHlwZT0naHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXInIGVudW1lcmF0aW9uPScwIDEgMiAzJyIgCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXRXb3JrR3JvdXBUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBmYWN0b3J5IHRoYXQgY3JlYXRlcyB0aGUgaW5zdGFuY2VzIG9mIHRoZSBtb2RlbC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIGZhY3RvcnkgdGhhdCBjcmVhdGVzIHRoZSBpbnN0YW5jZXMgb2YgdGhlIG1vZGVsLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlNc3Byb2plY3RGYWN0b3J5IGdldE1zcHJvamVjdEZhY3RvcnkoKTsKLQotfSAvL01zcHJvamVjdFBhY2thZ2UKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvT3V0bGluZUNvZGUuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvT3V0bGluZUNvZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGUxOWFmNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L091dGxpbmVDb2RlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0ODggKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBPdXRsaW5lQ29kZS5qYXZhLHYgMS4xIDIwMDgvMDEvMTUgMDg6NTI6NDYganRoYW0gRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0OwotCi1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+T3V0bGluZSBDb2RlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGUjZ2V0RmllbGRJRCA8ZW0+RmllbGQgSUQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGUjZ2V0RmllbGROYW1lIDxlbT5GaWVsZCBOYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlI2dldEFsaWFzIDxlbT5BbGlhczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZSNnZXRQaG9uZXRpY0FsaWFzIDxlbT5QaG9uZXRpYyBBbGlhczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZSNnZXRWYWx1ZXMgPGVtPlZhbHVlczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZSNpc0VudGVycHJpc2UgPGVtPkVudGVycHJpc2U8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGUjZ2V0RW50ZXJwcmlzZU91dGxpbmVDb2RlQWxpYXMgPGVtPkVudGVycHJpc2UgT3V0bGluZSBDb2RlIEFsaWFzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlI2lzUmVzb3VyY2VTdWJzdGl0dXRpb25FbmFibGVkIDxlbT5SZXNvdXJjZSBTdWJzdGl0dXRpb24gRW5hYmxlZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZSNpc0xlYWZPbmx5IDxlbT5MZWFmIE9ubHk8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGUjaXNBbGxMZXZlbHNSZXF1aXJlZCA8ZW0+QWxsIExldmVscyBSZXF1aXJlZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZSNpc09ubHlUYWJsZVZhbHVlc0FsbG93ZWQgPGVtPk9ubHkgVGFibGUgVmFsdWVzIEFsbG93ZWQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGUjZ2V0TWFza3MgPGVtPk1hc2tzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0T3V0bGluZUNvZGUoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J091dGxpbmVDb2RlXy5fdHlwZScga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIE91dGxpbmVDb2RlIGV4dGVuZHMgRU9iamVjdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RmllbGQgSUQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIENvcmVzcG9uZHMgdG8gdGhlIGZpZWxkIG51bWJlciBvZiBvdXRsaW5lIGNvZGUuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkZpZWxkIElEPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRGaWVsZElEKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRPdXRsaW5lQ29kZV9GaWVsZElEKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0ZpZWxkSUQnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0RmllbGRJRCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZSNnZXRGaWVsZElEIDxlbT5GaWVsZCBJRDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RmllbGQgSUQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEZpZWxkSUQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEZpZWxkSUQoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkZpZWxkIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBuYW1lIG9mIHRoZSBjdXN0b20gb3V0bGluZSBjb2RlLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5GaWVsZCBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRGaWVsZE5hbWUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldE91dGxpbmVDb2RlX0ZpZWxkTmFtZSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdGaWVsZE5hbWUnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0RmllbGROYW1lKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlI2dldEZpZWxkTmFtZSA8ZW0+RmllbGQgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RmllbGQgTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0RmllbGROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRGaWVsZE5hbWUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkFsaWFzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgYWxpYXMgb2YgdGhlIGN1c3RvbSBvdXRsaW5lIGNvZGUuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkFsaWFzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRBbGlhcyhTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0T3V0bGluZUNvZGVfQWxpYXMoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQWxpYXMnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0QWxpYXMoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGUjZ2V0QWxpYXMgPGVtPkFsaWFzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BbGlhczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0QWxpYXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEFsaWFzKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QaG9uZXRpYyBBbGlhczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHBob25ldGljIHByb251bmNpYXRpb24gb2YgdGhlIGFsaWFzIG9mIHRoZSBjdXN0b20gb3V0bGluZSBjb2RlLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QaG9uZXRpYyBBbGlhczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UGhvbmV0aWNBbGlhcyhTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0T3V0bGluZUNvZGVfUGhvbmV0aWNBbGlhcygpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdQaG9uZXRpY0FsaWFzJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFBob25ldGljQWxpYXMoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGUjZ2V0UGhvbmV0aWNBbGlhcyA8ZW0+UGhvbmV0aWMgQWxpYXM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlBob25ldGljIEFsaWFzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRQaG9uZXRpY0FsaWFzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRQaG9uZXRpY0FsaWFzKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5WYWx1ZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSB2YWx1ZXMgb2YgdGhlIHRhYmxlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIG91dGxpbmUgY29kZS4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VmFsdWVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRWYWx1ZXMoVmFsdWVzKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldE91dGxpbmVDb2RlX1ZhbHVlcygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1ZhbHVlcycgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVZhbHVlcyBnZXRWYWx1ZXMoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGUjZ2V0VmFsdWVzIDxlbT5WYWx1ZXM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlZhbHVlczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0VmFsdWVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRWYWx1ZXMoVmFsdWVzIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkVudGVycHJpc2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBjdXN0b20gb3V0bGluZSBjb2RlIGlzIGFuIGVudGVycHJpc2UgY3VzdG9tIG91dGxpbmUgY29kZS4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RW50ZXJwcmlzZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRFbnRlcnByaXNlKCkKLQkgKiBAc2VlICN1bnNldEVudGVycHJpc2UoKQotCSAqIEBzZWUgI3NldEVudGVycHJpc2UoYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRPdXRsaW5lQ29kZV9FbnRlcnByaXNlKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdFbnRlcnByaXNlJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc0VudGVycHJpc2UoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGUjaXNFbnRlcnByaXNlIDxlbT5FbnRlcnByaXNlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5FbnRlcnByaXNlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldEVudGVycHJpc2UoKQotCSAqIEBzZWUgI3Vuc2V0RW50ZXJwcmlzZSgpCi0JICogQHNlZSAjaXNFbnRlcnByaXNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRFbnRlcnByaXNlKGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlI2lzRW50ZXJwcmlzZSA8ZW0+RW50ZXJwcmlzZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRFbnRlcnByaXNlKCkKLQkgKiBAc2VlICNpc0VudGVycHJpc2UoKQotCSAqIEBzZWUgI3NldEVudGVycHJpc2UoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldEVudGVycHJpc2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZSNpc0VudGVycHJpc2UgPGVtPkVudGVycHJpc2U8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkVudGVycHJpc2U8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldEVudGVycHJpc2UoKQotCSAqIEBzZWUgI2lzRW50ZXJwcmlzZSgpCi0JICogQHNlZSAjc2V0RW50ZXJwcmlzZShib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0RW50ZXJwcmlzZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RW50ZXJwcmlzZSBPdXRsaW5lIENvZGUgQWxpYXM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIEEgcmVmZXJlbmNlIHRvIGFub3RoZXIgY3VzdG9tIGZpZWxkIGZvciB3aGljaCB0aGlzIGlzIGFuIGFsaWFzLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FbnRlcnByaXNlIE91dGxpbmUgQ29kZSBBbGlhczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0RW50ZXJwcmlzZU91dGxpbmVDb2RlQWxpYXMoQmlnSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRPdXRsaW5lQ29kZV9FbnRlcnByaXNlT3V0bGluZUNvZGVBbGlhcygpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuSW50ZWdlciIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nRW50ZXJwcmlzZU91dGxpbmVDb2RlQWxpYXMnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdJbnRlZ2VyIGdldEVudGVycHJpc2VPdXRsaW5lQ29kZUFsaWFzKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlI2dldEVudGVycHJpc2VPdXRsaW5lQ29kZUFsaWFzIDxlbT5FbnRlcnByaXNlIE91dGxpbmUgQ29kZSBBbGlhczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RW50ZXJwcmlzZSBPdXRsaW5lIENvZGUgQWxpYXM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEVudGVycHJpc2VPdXRsaW5lQ29kZUFsaWFzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRFbnRlcnByaXNlT3V0bGluZUNvZGVBbGlhcyhCaWdJbnRlZ2VyIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJlc291cmNlIFN1YnN0aXR1dGlvbiBFbmFibGVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBXaGV0aGVyIHRoZSBjdXN0b20gb3V0bGluZSBjb2RlIGNhbiBiZSB1c2VkIGJ5IHRoZSBSZXNvdXJjZSBTdWJzdGl0dXRpb24gV2l6YXJkIGluIE1pY3Jvc29mdCBQcm9qZWN0LgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZXNvdXJjZSBTdWJzdGl0dXRpb24gRW5hYmxlZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRSZXNvdXJjZVN1YnN0aXR1dGlvbkVuYWJsZWQoKQotCSAqIEBzZWUgI3Vuc2V0UmVzb3VyY2VTdWJzdGl0dXRpb25FbmFibGVkKCkKLQkgKiBAc2VlICNzZXRSZXNvdXJjZVN1YnN0aXR1dGlvbkVuYWJsZWQoYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRPdXRsaW5lQ29kZV9SZXNvdXJjZVN1YnN0aXR1dGlvbkVuYWJsZWQoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW4iCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1Jlc291cmNlU3Vic3RpdHV0aW9uRW5hYmxlZCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNSZXNvdXJjZVN1YnN0aXR1dGlvbkVuYWJsZWQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGUjaXNSZXNvdXJjZVN1YnN0aXR1dGlvbkVuYWJsZWQgPGVtPlJlc291cmNlIFN1YnN0aXR1dGlvbiBFbmFibGVkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5SZXNvdXJjZSBTdWJzdGl0dXRpb24gRW5hYmxlZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRSZXNvdXJjZVN1YnN0aXR1dGlvbkVuYWJsZWQoKQotCSAqIEBzZWUgI3Vuc2V0UmVzb3VyY2VTdWJzdGl0dXRpb25FbmFibGVkKCkKLQkgKiBAc2VlICNpc1Jlc291cmNlU3Vic3RpdHV0aW9uRW5hYmxlZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UmVzb3VyY2VTdWJzdGl0dXRpb25FbmFibGVkKGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlI2lzUmVzb3VyY2VTdWJzdGl0dXRpb25FbmFibGVkIDxlbT5SZXNvdXJjZSBTdWJzdGl0dXRpb24gRW5hYmxlZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRSZXNvdXJjZVN1YnN0aXR1dGlvbkVuYWJsZWQoKQotCSAqIEBzZWUgI2lzUmVzb3VyY2VTdWJzdGl0dXRpb25FbmFibGVkKCkKLQkgKiBAc2VlICNzZXRSZXNvdXJjZVN1YnN0aXR1dGlvbkVuYWJsZWQoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldFJlc291cmNlU3Vic3RpdHV0aW9uRW5hYmxlZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlI2lzUmVzb3VyY2VTdWJzdGl0dXRpb25FbmFibGVkIDxlbT5SZXNvdXJjZSBTdWJzdGl0dXRpb24gRW5hYmxlZDwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmVzb3VyY2UgU3Vic3RpdHV0aW9uIEVuYWJsZWQ8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldFJlc291cmNlU3Vic3RpdHV0aW9uRW5hYmxlZCgpCi0JICogQHNlZSAjaXNSZXNvdXJjZVN1YnN0aXR1dGlvbkVuYWJsZWQoKQotCSAqIEBzZWUgI3NldFJlc291cmNlU3Vic3RpdHV0aW9uRW5hYmxlZChib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0UmVzb3VyY2VTdWJzdGl0dXRpb25FbmFibGVkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5MZWFmIE9ubHk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFdoZXRoZXIgb3Igbm90IHZhbHVlcyBzcGVjaWZpZWQgaW4gdGhpcyBvdXRsaW5lIGNvZGUgZmllbGQgbXVzdCBiZSBsZWFmIHZhbHVlcy4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TGVhZiBPbmx5PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldExlYWZPbmx5KCkKLQkgKiBAc2VlICN1bnNldExlYWZPbmx5KCkKLQkgKiBAc2VlICNzZXRMZWFmT25seShib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldE91dGxpbmVDb2RlX0xlYWZPbmx5KCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdMZWFmT25seScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNMZWFmT25seSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZSNpc0xlYWZPbmx5IDxlbT5MZWFmIE9ubHk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkxlYWYgT25seTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRMZWFmT25seSgpCi0JICogQHNlZSAjdW5zZXRMZWFmT25seSgpCi0JICogQHNlZSAjaXNMZWFmT25seSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TGVhZk9ubHkoYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGUjaXNMZWFmT25seSA8ZW0+TGVhZiBPbmx5PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldExlYWZPbmx5KCkKLQkgKiBAc2VlICNpc0xlYWZPbmx5KCkKLQkgKiBAc2VlICNzZXRMZWFmT25seShib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0TGVhZk9ubHkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZSNpc0xlYWZPbmx5IDxlbT5MZWFmIE9ubHk8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkxlYWYgT25seTwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0TGVhZk9ubHkoKQotCSAqIEBzZWUgI2lzTGVhZk9ubHkoKQotCSAqIEBzZWUgI3NldExlYWZPbmx5KGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRMZWFmT25seSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QWxsIExldmVscyBSZXF1aXJlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogTmV3IGNvZGVzIG11c3QgaGF2ZSBhbGwgbGV2ZWxzIHByZXNlbnQuICBOb3QgYXZhaWxhYmxlIGZvciBFbnRlcnByaXNlIENvZGVzLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BbGwgTGV2ZWxzIFJlcXVpcmVkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldEFsbExldmVsc1JlcXVpcmVkKCkKLQkgKiBAc2VlICN1bnNldEFsbExldmVsc1JlcXVpcmVkKCkKLQkgKiBAc2VlICNzZXRBbGxMZXZlbHNSZXF1aXJlZChib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldE91dGxpbmVDb2RlX0FsbExldmVsc1JlcXVpcmVkKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdBbGxMZXZlbHNSZXF1aXJlZCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNBbGxMZXZlbHNSZXF1aXJlZCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZSNpc0FsbExldmVsc1JlcXVpcmVkIDxlbT5BbGwgTGV2ZWxzIFJlcXVpcmVkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BbGwgTGV2ZWxzIFJlcXVpcmVkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldEFsbExldmVsc1JlcXVpcmVkKCkKLQkgKiBAc2VlICN1bnNldEFsbExldmVsc1JlcXVpcmVkKCkKLQkgKiBAc2VlICNpc0FsbExldmVsc1JlcXVpcmVkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRBbGxMZXZlbHNSZXF1aXJlZChib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZSNpc0FsbExldmVsc1JlcXVpcmVkIDxlbT5BbGwgTGV2ZWxzIFJlcXVpcmVkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldEFsbExldmVsc1JlcXVpcmVkKCkKLQkgKiBAc2VlICNpc0FsbExldmVsc1JlcXVpcmVkKCkKLQkgKiBAc2VlICNzZXRBbGxMZXZlbHNSZXF1aXJlZChib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0QWxsTGV2ZWxzUmVxdWlyZWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZSNpc0FsbExldmVsc1JlcXVpcmVkIDxlbT5BbGwgTGV2ZWxzIFJlcXVpcmVkPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BbGwgTGV2ZWxzIFJlcXVpcmVkPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRBbGxMZXZlbHNSZXF1aXJlZCgpCi0JICogQHNlZSAjaXNBbGxMZXZlbHNSZXF1aXJlZCgpCi0JICogQHNlZSAjc2V0QWxsTGV2ZWxzUmVxdWlyZWQoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldEFsbExldmVsc1JlcXVpcmVkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Pbmx5IFRhYmxlIFZhbHVlcyBBbGxvd2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBXaGV0aGVyIHZhbHVlcyBzcGVjaWZpZWQgbXVzdCBjb21lIGZyb20gdmFsdWVzIHRhYmxlLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Pbmx5IFRhYmxlIFZhbHVlcyBBbGxvd2VkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldE9ubHlUYWJsZVZhbHVlc0FsbG93ZWQoKQotCSAqIEBzZWUgI3Vuc2V0T25seVRhYmxlVmFsdWVzQWxsb3dlZCgpCi0JICogQHNlZSAjc2V0T25seVRhYmxlVmFsdWVzQWxsb3dlZChib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldE91dGxpbmVDb2RlX09ubHlUYWJsZVZhbHVlc0FsbG93ZWQoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW4iCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J09ubHlUYWJsZVZhbHVlc0FsbG93ZWQnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzT25seVRhYmxlVmFsdWVzQWxsb3dlZCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZSNpc09ubHlUYWJsZVZhbHVlc0FsbG93ZWQgPGVtPk9ubHkgVGFibGUgVmFsdWVzIEFsbG93ZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk9ubHkgVGFibGUgVmFsdWVzIEFsbG93ZWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0T25seVRhYmxlVmFsdWVzQWxsb3dlZCgpCi0JICogQHNlZSAjdW5zZXRPbmx5VGFibGVWYWx1ZXNBbGxvd2VkKCkKLQkgKiBAc2VlICNpc09ubHlUYWJsZVZhbHVlc0FsbG93ZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldE9ubHlUYWJsZVZhbHVlc0FsbG93ZWQoYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGUjaXNPbmx5VGFibGVWYWx1ZXNBbGxvd2VkIDxlbT5Pbmx5IFRhYmxlIFZhbHVlcyBBbGxvd2VkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldE9ubHlUYWJsZVZhbHVlc0FsbG93ZWQoKQotCSAqIEBzZWUgI2lzT25seVRhYmxlVmFsdWVzQWxsb3dlZCgpCi0JICogQHNlZSAjc2V0T25seVRhYmxlVmFsdWVzQWxsb3dlZChib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0T25seVRhYmxlVmFsdWVzQWxsb3dlZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlI2lzT25seVRhYmxlVmFsdWVzQWxsb3dlZCA8ZW0+T25seSBUYWJsZSBWYWx1ZXMgQWxsb3dlZDwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+T25seSBUYWJsZSBWYWx1ZXMgQWxsb3dlZDwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0T25seVRhYmxlVmFsdWVzQWxsb3dlZCgpCi0JICogQHNlZSAjaXNPbmx5VGFibGVWYWx1ZXNBbGxvd2VkKCkKLQkgKiBAc2VlICNzZXRPbmx5VGFibGVWYWx1ZXNBbGxvd2VkKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRPbmx5VGFibGVWYWx1ZXNBbGxvd2VkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5NYXNrczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHRhYmxlIG9mIGVudHJpZXMgdGhhdCBkZWZpbmUgdGhlIG91dGxpbmUgY29kZSBtYXNrLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NYXNrczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0TWFza3MoTWFza3MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0T3V0bGluZUNvZGVfTWFza3MoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdNYXNrcycgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU1hc2tzIGdldE1hc2tzKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlI2dldE1hc2tzIDxlbT5NYXNrczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TWFza3M8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldE1hc2tzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRNYXNrcyhNYXNrcyB2YWx1ZSk7Ci0KLX0gLy8gT3V0bGluZUNvZGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvT3V0bGluZUNvZGUyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L091dGxpbmVDb2RlMi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMDMwMWIyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvT3V0bGluZUNvZGUyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTQgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBPdXRsaW5lQ29kZTIuamF2YSx2IDEuMSAyMDA4LzAxLzE1IDA4OjUyOjQ2IGp0aGFtIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdDsKLQotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk91dGxpbmUgQ29kZTI8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZTIjZ2V0VUlEIDxlbT5VSUQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGUyI2dldEZpZWxkSUQgPGVtPkZpZWxkIElEPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlMiNnZXRWYWx1ZUlEIDxlbT5WYWx1ZSBJRDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldE91dGxpbmVDb2RlMigpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nT3V0bGluZUNvZGVfLl8xXy5fdHlwZScga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIE91dGxpbmVDb2RlMiBleHRlbmRzIEVPYmplY3QgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlVJRDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHVuaXF1ZSBJRCBvZiB0aGUgdmFsdWUgaW4gdGhlIG91dGxpbmUgY29kZSBjb2xsZWN0aW9uLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlVJRDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0VUlEKEJpZ0ludGVnZXIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0T3V0bGluZUNvZGUyX1VJRCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuSW50ZWdlciIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nVUlEJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnSW50ZWdlciBnZXRVSUQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGUyI2dldFVJRCA8ZW0+VUlEPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5VSUQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFVJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VUlEKEJpZ0ludGVnZXIgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RmllbGQgSUQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBmaWVsZCBJRCBpbiB0aGUgbG9jYWxpc2VkIGxhbmd1YWdlLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkZpZWxkIElEPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRGaWVsZElEKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRPdXRsaW5lQ29kZTJfRmllbGRJRCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdGaWVsZElEJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldEZpZWxkSUQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGUyI2dldEZpZWxkSUQgPGVtPkZpZWxkIElEPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5GaWVsZCBJRDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0RmllbGRJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RmllbGRJRChTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VmFsdWUgSUQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSB1bmlxdWUgSUQgaW4gdGhlIHZhbHVlIGxpc3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBkZWZpbml0aW9uIGluIHRoZSAKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dGxpbmUgY29kZSBjb2xsZWN0aW9uLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlZhbHVlIElEPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRWYWx1ZUlEKEJpZ0ludGVnZXIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0T3V0bGluZUNvZGUyX1ZhbHVlSUQoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkludGVnZXIiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1ZhbHVlSUQnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdJbnRlZ2VyIGdldFZhbHVlSUQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGUyI2dldFZhbHVlSUQgPGVtPlZhbHVlIElEPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5WYWx1ZSBJRDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0VmFsdWVJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VmFsdWVJRChCaWdJbnRlZ2VyIHZhbHVlKTsKLQotfSAvLyBPdXRsaW5lQ29kZTIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvT3V0bGluZUNvZGUzLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L091dGxpbmVDb2RlMy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNjVlODMzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvT3V0bGluZUNvZGUzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTMgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBPdXRsaW5lQ29kZTMuamF2YSx2IDEuMSAyMDA4LzAxLzE1IDA4OjUyOjQ1IGp0aGFtIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdDsKLQotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk91dGxpbmUgQ29kZTM8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZTMjZ2V0VUlEIDxlbT5VSUQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGUzI2dldEZpZWxkSUQgPGVtPkZpZWxkIElEPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlMyNnZXRWYWx1ZUlEIDxlbT5WYWx1ZSBJRDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldE91dGxpbmVDb2RlMygpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nT3V0bGluZUNvZGVfLl8yXy5fdHlwZScga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIE91dGxpbmVDb2RlMyBleHRlbmRzIEVPYmplY3QgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlVJRDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHVuaXF1ZSBJRCBvZiB0aGUgdmFsdWUgaW4gdGhlIG91dGxpbmUgY29kZSBjb2xsZWN0aW9uLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlVJRDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0VUlEKEJpZ0ludGVnZXIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0T3V0bGluZUNvZGUzX1VJRCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuSW50ZWdlciIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nVUlEJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnSW50ZWdlciBnZXRVSUQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGUzI2dldFVJRCA8ZW0+VUlEPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5VSUQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFVJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VUlEKEJpZ0ludGVnZXIgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RmllbGQgSUQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBmaWVsZCBJRCBpbiB0aGUgbG9jYWxpc2VkIGxhbmd1YWdlLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkZpZWxkIElEPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRGaWVsZElEKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRPdXRsaW5lQ29kZTNfRmllbGRJRCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdGaWVsZElEJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldEZpZWxkSUQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGUzI2dldEZpZWxkSUQgPGVtPkZpZWxkIElEPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5GaWVsZCBJRDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0RmllbGRJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RmllbGRJRChTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VmFsdWUgSUQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSB1bmlxdWUgSUQgaW4gdGhlIHZhbHVlIGxpc3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBkZWZpbml0aW9uIAotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gdGhlIG91dGxpbmUgY29kZSBjb2xsZWN0aW9uLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5WYWx1ZSBJRDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0VmFsdWVJRChCaWdJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldE91dGxpbmVDb2RlM19WYWx1ZUlEKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5JbnRlZ2VyIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdWYWx1ZUlEJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnSW50ZWdlciBnZXRWYWx1ZUlEKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlMyNnZXRWYWx1ZUlEIDxlbT5WYWx1ZSBJRDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VmFsdWUgSUQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFZhbHVlSUQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFZhbHVlSUQoQmlnSW50ZWdlciB2YWx1ZSk7Ci0KLX0gLy8gT3V0bGluZUNvZGUzCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L091dGxpbmVDb2Rlcy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9PdXRsaW5lQ29kZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTA2ODYyZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L091dGxpbmVDb2Rlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBPdXRsaW5lQ29kZXMuamF2YSx2IDEuMSAyMDA4LzAxLzE1IDA4OjUyOjQ2IGp0aGFtIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+T3V0bGluZSBDb2RlczwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlcyNnZXRPdXRsaW5lQ29kZSA8ZW0+T3V0bGluZSBDb2RlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0T3V0bGluZUNvZGVzKCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdPdXRsaW5lQ29kZXNfLl90eXBlJyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgT3V0bGluZUNvZGVzIGV4dGVuZHMgRU9iamVjdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+T3V0bGluZSBDb2RlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgaW5kaXZpZHVhbCBvdXRsaW5lIGNvZGVzLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5PdXRsaW5lIENvZGU8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0T3V0bGluZUNvZGVzX091dGxpbmVDb2RlKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZSIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nT3V0bGluZUNvZGUnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXRPdXRsaW5lQ29kZSgpOwotCi19IC8vIE91dGxpbmVDb2RlcwpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9QcmVkZWNlc3NvckxpbmsuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvUHJlZGVjZXNzb3JMaW5rLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjY2FiN2UuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9QcmVkZWNlc3NvckxpbmsuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyNyArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFByZWRlY2Vzc29yTGluay5qYXZhLHYgMS4xIDIwMDgvMDEvMTUgMDg6NTI6NDYganRoYW0gRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0OwotCi1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UHJlZGVjZXNzb3IgTGluazwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByZWRlY2Vzc29yTGluayNnZXRQcmVkZWNlc3NvclVJRCA8ZW0+UHJlZGVjZXNzb3IgVUlEPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByZWRlY2Vzc29yTGluayNnZXRUeXBlIDxlbT5UeXBlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByZWRlY2Vzc29yTGluayNpc0Nyb3NzUHJvamVjdCA8ZW0+Q3Jvc3MgUHJvamVjdDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5QcmVkZWNlc3NvckxpbmsjZ2V0Q3Jvc3NQcm9qZWN0TmFtZSA8ZW0+Q3Jvc3MgUHJvamVjdCBOYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByZWRlY2Vzc29yTGluayNnZXRMaW5rTGFnIDxlbT5MaW5rIExhZzwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5QcmVkZWNlc3NvckxpbmsjZ2V0TGFnRm9ybWF0IDxlbT5MYWcgRm9ybWF0PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UHJlZGVjZXNzb3JMaW5rKCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdQcmVkZWNlc3NvckxpbmtfLl90eXBlJyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUHJlZGVjZXNzb3JMaW5rIGV4dGVuZHMgRU9iamVjdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UHJlZGVjZXNzb3IgVUlEPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIHByZWRlY2Vzc29yIHRhc2suCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UHJlZGVjZXNzb3IgVUlEPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRQcmVkZWNlc3NvclVJRChCaWdJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFByZWRlY2Vzc29yTGlua19QcmVkZWNlc3NvclVJRCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuSW50ZWdlciIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nUHJlZGVjZXNzb3JVSUQnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdJbnRlZ2VyIGdldFByZWRlY2Vzc29yVUlEKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByZWRlY2Vzc29yTGluayNnZXRQcmVkZWNlc3NvclVJRCA8ZW0+UHJlZGVjZXNzb3IgVUlEPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5QcmVkZWNlc3NvciBVSUQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFByZWRlY2Vzc29yVUlEKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRQcmVkZWNlc3NvclVJRChCaWdJbnRlZ2VyIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBsaW5rIHR5cGUuICBWYWx1ZXMgYXJlIDA9RkYsIDE9RlMsIDI9U0YgYW5kIDM9U1MKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5UeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRUeXBlKEJpZ0ludGVnZXIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UHJlZGVjZXNzb3JMaW5rX1R5cGUoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UeXBlVHlwZTEiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1R5cGUnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdJbnRlZ2VyIGdldFR5cGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJlZGVjZXNzb3JMaW5rI2dldFR5cGUgPGVtPlR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFR5cGUoQmlnSW50ZWdlciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Dcm9zcyBQcm9qZWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBXaGV0aGVyIHRoZSBwcmVkZWNlc3NvciBpcyBwYXJ0IG9mIGFub3RoZXIgcHJvamVjdC4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Dcm9zcyBQcm9qZWN0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldENyb3NzUHJvamVjdCgpCi0JICogQHNlZSAjdW5zZXRDcm9zc1Byb2plY3QoKQotCSAqIEBzZWUgI3NldENyb3NzUHJvamVjdChib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFByZWRlY2Vzc29yTGlua19Dcm9zc1Byb2plY3QoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW4iCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0Nyb3NzUHJvamVjdCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNDcm9zc1Byb2plY3QoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJlZGVjZXNzb3JMaW5rI2lzQ3Jvc3NQcm9qZWN0IDxlbT5Dcm9zcyBQcm9qZWN0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Dcm9zcyBQcm9qZWN0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldENyb3NzUHJvamVjdCgpCi0JICogQHNlZSAjdW5zZXRDcm9zc1Byb2plY3QoKQotCSAqIEBzZWUgI2lzQ3Jvc3NQcm9qZWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRDcm9zc1Byb2plY3QoYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJlZGVjZXNzb3JMaW5rI2lzQ3Jvc3NQcm9qZWN0IDxlbT5Dcm9zcyBQcm9qZWN0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldENyb3NzUHJvamVjdCgpCi0JICogQHNlZSAjaXNDcm9zc1Byb2plY3QoKQotCSAqIEBzZWUgI3NldENyb3NzUHJvamVjdChib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0Q3Jvc3NQcm9qZWN0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJlZGVjZXNzb3JMaW5rI2lzQ3Jvc3NQcm9qZWN0IDxlbT5Dcm9zcyBQcm9qZWN0PC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Dcm9zcyBQcm9qZWN0PC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRDcm9zc1Byb2plY3QoKQotCSAqIEBzZWUgI2lzQ3Jvc3NQcm9qZWN0KCkKLQkgKiBAc2VlICNzZXRDcm9zc1Byb2plY3QoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldENyb3NzUHJvamVjdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q3Jvc3MgUHJvamVjdCBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgZXh0ZXJuYWwgcHJlZGVjZXNzb3IgcHJvamVjdC4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Dcm9zcyBQcm9qZWN0IE5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldENyb3NzUHJvamVjdE5hbWUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFByZWRlY2Vzc29yTGlua19Dcm9zc1Byb2plY3ROYW1lKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0Nyb3NzUHJvamVjdE5hbWUnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0Q3Jvc3NQcm9qZWN0TmFtZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5QcmVkZWNlc3NvckxpbmsjZ2V0Q3Jvc3NQcm9qZWN0TmFtZSA8ZW0+Q3Jvc3MgUHJvamVjdCBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Dcm9zcyBQcm9qZWN0IE5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldENyb3NzUHJvamVjdE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldENyb3NzUHJvamVjdE5hbWUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkxpbmsgTGFnPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgYW1vdW50IG9mIGxhZyBpbiB0ZW50aHMgb2YgYSBtaW51dGUuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TGluayBMYWc8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldExpbmtMYWcoQmlnSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRQcmVkZWNlc3NvckxpbmtfTGlua0xhZygpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuSW50ZWdlciIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nTGlua0xhZycgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0ludGVnZXIgZ2V0TGlua0xhZygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5QcmVkZWNlc3NvckxpbmsjZ2V0TGlua0xhZyA8ZW0+TGluayBMYWc8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkxpbmsgTGFnPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRMaW5rTGFnKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRMaW5rTGFnKEJpZ0ludGVnZXIgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TGFnIEZvcm1hdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGZvcm1hdCBmb3IgZXhwcmVzc2luZyB0aGUgbGFnIGZvcm1hdC4gIAotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVzIGFyZTogMz1tLCA0PWVtLCA1PWgsIDY9ZWgsIDc9ZCwgOD1lZCwgOT13LCAxMD1ldywgMTE9bW8sIDEyPWVtbywgMTk9JSwgCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMD1lJSwgMzU9bT8sIDM2PWVtPywgMzc9aD8sIDM4PWVoPywgMzk9ZD8sIDQwPWVkPywgNDE9dz8sIDQyPWV3PywgNDM9bW8/LCAKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ0PWVtbz8sIDUxPSU/LCA1Mj1lJT8gYW5kIDUzPW51bGwuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TGFnIEZvcm1hdDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0TGFnRm9ybWF0KEJpZ0ludGVnZXIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UHJlZGVjZXNzb3JMaW5rX0xhZ0Zvcm1hdCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkxhZ0Zvcm1hdFR5cGUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0xhZ0Zvcm1hdCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0ludGVnZXIgZ2V0TGFnRm9ybWF0KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByZWRlY2Vzc29yTGluayNnZXRMYWdGb3JtYXQgPGVtPkxhZyBGb3JtYXQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkxhZyBGb3JtYXQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldExhZ0Zvcm1hdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TGFnRm9ybWF0KEJpZ0ludGVnZXIgdmFsdWUpOwotCi19IC8vIFByZWRlY2Vzc29yTGluawpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9Qcm9qZWN0LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L1Byb2plY3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTg4MDcwMy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L1Byb2plY3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2MjEgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBQcm9qZWN0LmphdmEsdiAxLjEgMjAwOC8wMS8xNSAwODo1Mjo0NiBqdGhhbSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Q7Ci0KLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Qcm9qZWN0PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRVSUQgPGVtPlVJRDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldE5hbWUgPGVtPk5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRUaXRsZSA8ZW0+VGl0bGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRTdWJqZWN0IDxlbT5TdWJqZWN0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0Q2F0ZWdvcnkgPGVtPkNhdGVnb3J5PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0Q29tcGFueSA8ZW0+Q29tcGFueTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldE1hbmFnZXIgPGVtPk1hbmFnZXI8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRBdXRob3IgPGVtPkF1dGhvcjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldENyZWF0aW9uRGF0ZSA8ZW0+Q3JlYXRpb24gRGF0ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldFJldmlzaW9uIDxlbT5SZXZpc2lvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldExhc3RTYXZlZCA8ZW0+TGFzdCBTYXZlZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzU2NoZWR1bGVGcm9tU3RhcnQgPGVtPlNjaGVkdWxlIEZyb20gU3RhcnQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRTdGFydERhdGUgPGVtPlN0YXJ0IERhdGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRGaW5pc2hEYXRlIDxlbT5GaW5pc2ggRGF0ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldEZZU3RhcnREYXRlIDxlbT5GWSBTdGFydCBEYXRlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0Q3JpdGljYWxTbGFja0xpbWl0IDxlbT5Dcml0aWNhbCBTbGFjayBMaW1pdDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldEN1cnJlbmN5RGlnaXRzIDxlbT5DdXJyZW5jeSBEaWdpdHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRDdXJyZW5jeVN5bWJvbCA8ZW0+Q3VycmVuY3kgU3ltYm9sPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0Q3VycmVuY3lTeW1ib2xQb3NpdGlvbiA8ZW0+Q3VycmVuY3kgU3ltYm9sIFBvc2l0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0Q2FsZW5kYXJVSUQgPGVtPkNhbGVuZGFyIFVJRDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldERlZmF1bHRTdGFydFRpbWUgPGVtPkRlZmF1bHQgU3RhcnQgVGltZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldERlZmF1bHRGaW5pc2hUaW1lIDxlbT5EZWZhdWx0IEZpbmlzaCBUaW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0TWludXRlc1BlckRheSA8ZW0+TWludXRlcyBQZXIgRGF5PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0TWludXRlc1BlcldlZWsgPGVtPk1pbnV0ZXMgUGVyIFdlZWs8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXREYXlzUGVyTW9udGggPGVtPkRheXMgUGVyIE1vbnRoPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0RGVmYXVsdFRhc2tUeXBlIDxlbT5EZWZhdWx0IFRhc2sgVHlwZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldERlZmF1bHRGaXhlZENvc3RBY2NydWFsIDxlbT5EZWZhdWx0IEZpeGVkIENvc3QgQWNjcnVhbDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldERlZmF1bHRTdGFuZGFyZFJhdGUgPGVtPkRlZmF1bHQgU3RhbmRhcmQgUmF0ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldERlZmF1bHRPdmVydGltZVJhdGUgPGVtPkRlZmF1bHQgT3ZlcnRpbWUgUmF0ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldER1cmF0aW9uRm9ybWF0IDxlbT5EdXJhdGlvbiBGb3JtYXQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRXb3JrRm9ybWF0IDxlbT5Xb3JrIEZvcm1hdDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzRWRpdGFibGVBY3R1YWxDb3N0cyA8ZW0+RWRpdGFibGUgQWN0dWFsIENvc3RzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNIb25vckNvbnN0cmFpbnRzIDxlbT5Ib25vciBDb25zdHJhaW50czwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldEVhcm5lZFZhbHVlTWV0aG9kIDxlbT5FYXJuZWQgVmFsdWUgTWV0aG9kPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNJbnNlcnRlZFByb2plY3RzTGlrZVN1bW1hcnkgPGVtPkluc2VydGVkIFByb2plY3RzIExpa2UgU3VtbWFyeTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzTXVsdGlwbGVDcml0aWNhbFBhdGhzIDxlbT5NdWx0aXBsZSBDcml0aWNhbCBQYXRoczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzTmV3VGFza3NFZmZvcnREcml2ZW4gPGVtPk5ldyBUYXNrcyBFZmZvcnQgRHJpdmVuPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNOZXdUYXNrc0VzdGltYXRlZCA8ZW0+TmV3IFRhc2tzIEVzdGltYXRlZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzU3BsaXRzSW5Qcm9ncmVzc1Rhc2tzIDxlbT5TcGxpdHMgSW4gUHJvZ3Jlc3MgVGFza3M8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc1NwcmVhZEFjdHVhbENvc3QgPGVtPlNwcmVhZCBBY3R1YWwgQ29zdDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzU3ByZWFkUGVyY2VudENvbXBsZXRlIDxlbT5TcHJlYWQgUGVyY2VudCBDb21wbGV0ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzVGFza1VwZGF0ZXNSZXNvdXJjZSA8ZW0+VGFzayBVcGRhdGVzIFJlc291cmNlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNGaXNjYWxZZWFyU3RhcnQgPGVtPkZpc2NhbCBZZWFyIFN0YXJ0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0V2Vla1N0YXJ0RGF5IDxlbT5XZWVrIFN0YXJ0IERheTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzTW92ZUNvbXBsZXRlZEVuZHNCYWNrIDxlbT5Nb3ZlIENvbXBsZXRlZCBFbmRzIEJhY2s8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc01vdmVSZW1haW5pbmdTdGFydHNCYWNrIDxlbT5Nb3ZlIFJlbWFpbmluZyBTdGFydHMgQmFjazwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzTW92ZVJlbWFpbmluZ1N0YXJ0c0ZvcndhcmQgPGVtPk1vdmUgUmVtYWluaW5nIFN0YXJ0cyBGb3J3YXJkPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNNb3ZlQ29tcGxldGVkRW5kc0ZvcndhcmQgPGVtPk1vdmUgQ29tcGxldGVkIEVuZHMgRm9yd2FyZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldEJhc2VsaW5lRm9yRWFybmVkVmFsdWUgPGVtPkJhc2VsaW5lIEZvciBFYXJuZWQgVmFsdWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc0F1dG9BZGROZXdSZXNvdXJjZXNBbmRUYXNrcyA8ZW0+QXV0byBBZGQgTmV3IFJlc291cmNlcyBBbmQgVGFza3M8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRTdGF0dXNEYXRlIDxlbT5TdGF0dXMgRGF0ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldEN1cnJlbnREYXRlIDxlbT5DdXJyZW50IERhdGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc01pY3Jvc29mdFByb2plY3RTZXJ2ZXJVUkwgPGVtPk1pY3Jvc29mdCBQcm9qZWN0IFNlcnZlciBVUkw8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc0F1dG9saW5rIDxlbT5BdXRvbGluazwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldE5ld1Rhc2tTdGFydERhdGUgPGVtPk5ldyBUYXNrIFN0YXJ0IERhdGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXREZWZhdWx0VGFza0VWTWV0aG9kIDxlbT5EZWZhdWx0IFRhc2sgRVYgTWV0aG9kPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNQcm9qZWN0RXh0ZXJuYWxseUVkaXRlZCA8ZW0+UHJvamVjdCBFeHRlcm5hbGx5IEVkaXRlZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldEV4dGVuZGVkQ3JlYXRpb25EYXRlIDxlbT5FeHRlbmRlZCBDcmVhdGlvbiBEYXRlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNBY3R1YWxzSW5TeW5jIDxlbT5BY3R1YWxzIEluIFN5bmM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc1JlbW92ZUZpbGVQcm9wZXJ0aWVzIDxlbT5SZW1vdmUgRmlsZSBQcm9wZXJ0aWVzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNBZG1pblByb2plY3QgPGVtPkFkbWluIFByb2plY3Q8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRPdXRsaW5lQ29kZXMgPGVtPk91dGxpbmUgQ29kZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRXQlNNYXNrcyA8ZW0+V0JTIE1hc2tzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0RXh0ZW5kZWRBdHRyaWJ1dGVzIDxlbT5FeHRlbmRlZCBBdHRyaWJ1dGVzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0Q2FsZW5kYXJzIDxlbT5DYWxlbmRhcnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRUYXNrcyA8ZW0+VGFza3M8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRSZXNvdXJjZXMgPGVtPlJlc291cmNlczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldEFzc2lnbm1lbnRzIDxlbT5Bc3NpZ25tZW50czwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFByb2plY3QoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J1Byb2plY3RfLl90eXBlJyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUHJvamVjdCBleHRlbmRzIEVPYmplY3QgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlVJRDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHVuaXF1ZSBJRCBvZiB0aGUgcHJvamVjdC4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VUlEPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRVSUQoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFByb2plY3RfVUlEKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVUlEVHlwZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nVUlEJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFVJRCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldFVJRCA8ZW0+VUlEPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5VSUQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFVJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VUlEKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgbmFtZSBvZiB0aGUgcHJvamVjdC4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0TmFtZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UHJvamVjdF9OYW1lKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTmFtZVR5cGUzIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdOYW1lJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldE5hbWUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXROYW1lIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXROYW1lKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5UaXRsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHRpdGxlIG9mIHRoZSBwcm9qZWN0LgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5UaXRsZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0VGl0bGUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFByb2plY3RfVGl0bGUoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UaXRsZVR5cGUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1RpdGxlJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFRpdGxlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0VGl0bGUgPGVtPlRpdGxlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5UaXRsZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0VGl0bGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFRpdGxlKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TdWJqZWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgc3ViamVjdCBvZiB0aGUgcHJvamVjdC4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U3ViamVjdDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0U3ViamVjdChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UHJvamVjdF9TdWJqZWN0KCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuU3ViamVjdFR5cGUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1N1YmplY3QnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0U3ViamVjdCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldFN1YmplY3QgPGVtPlN1YmplY3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlN1YmplY3Q8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFN1YmplY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFN1YmplY3QoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNhdGVnb3J5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgY2F0ZWdvcnkgb2YgdGhlIHByb2plY3QuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNhdGVnb3J5PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRDYXRlZ29yeShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UHJvamVjdF9DYXRlZ29yeSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkNhdGVnb3J5VHlwZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQ2F0ZWdvcnknIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0Q2F0ZWdvcnkoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRDYXRlZ29yeSA8ZW0+Q2F0ZWdvcnk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNhdGVnb3J5PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRDYXRlZ29yeSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Q2F0ZWdvcnkoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNvbXBhbnk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBjb21wYW55IHRoYXQgb3ducyB0aGUgcHJvamVjdC4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q29tcGFueTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0Q29tcGFueShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UHJvamVjdF9Db21wYW55KCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQ29tcGFueVR5cGUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0NvbXBhbnknIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0Q29tcGFueSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldENvbXBhbnkgPGVtPkNvbXBhbnk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNvbXBhbnk8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldENvbXBhbnkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldENvbXBhbnkoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1hbmFnZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBtYW5hZ2VyIG9mIHRoZSBwcm9qZWN0LgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NYW5hZ2VyPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRNYW5hZ2VyKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRQcm9qZWN0X01hbmFnZXIoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5NYW5hZ2VyVHlwZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nTWFuYWdlcicgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRNYW5hZ2VyKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0TWFuYWdlciA8ZW0+TWFuYWdlcjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TWFuYWdlcjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0TWFuYWdlcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TWFuYWdlcihTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QXV0aG9yPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgYXV0aG9yIG9mIHRoZSBwcm9qZWN0LgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BdXRob3I8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEF1dGhvcihTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UHJvamVjdF9BdXRob3IoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5BdXRob3JUeXBlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdBdXRob3InIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0QXV0aG9yKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0QXV0aG9yIDxlbT5BdXRob3I8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkF1dGhvcjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0QXV0aG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRBdXRob3IoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNyZWF0aW9uIERhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBkYXRlIHRoYXQgdGhlIHByb2plY3Qgd2FzIGNyZWF0ZWQuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNyZWF0aW9uIERhdGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldENyZWF0aW9uRGF0ZShPYmplY3QpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UHJvamVjdF9DcmVhdGlvbkRhdGUoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkRhdGVUaW1lIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdDcmVhdGlvbkRhdGUnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlPYmplY3QgZ2V0Q3JlYXRpb25EYXRlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0Q3JlYXRpb25EYXRlIDxlbT5DcmVhdGlvbiBEYXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5DcmVhdGlvbiBEYXRlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRDcmVhdGlvbkRhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldENyZWF0aW9uRGF0ZShPYmplY3QgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmV2aXNpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBudW1iZXIgb2YgdGltZXMgYSBwcm9qZWN0IGhhcyBiZWVuIHNhdmVkLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZXZpc2lvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UmV2aXNpb24oQmlnSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRQcm9qZWN0X1JldmlzaW9uKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5JbnRlZ2VyIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdSZXZpc2lvbicgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0ludGVnZXIgZ2V0UmV2aXNpb24oKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRSZXZpc2lvbiA8ZW0+UmV2aXNpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlJldmlzaW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRSZXZpc2lvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UmV2aXNpb24oQmlnSW50ZWdlciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5MYXN0IFNhdmVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgZGF0ZSB0aGF0IHRoZSBwcm9qZWN0IHdhcyBsYXN0IHNhdmVkLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5MYXN0IFNhdmVkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRMYXN0U2F2ZWQoT2JqZWN0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFByb2plY3RfTGFzdFNhdmVkKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EYXRlVGltZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nTGFzdFNhdmVkJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JT2JqZWN0IGdldExhc3RTYXZlZCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldExhc3RTYXZlZCA8ZW0+TGFzdCBTYXZlZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TGFzdCBTYXZlZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0TGFzdFNhdmVkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRMYXN0U2F2ZWQoT2JqZWN0IHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlNjaGVkdWxlIEZyb20gU3RhcnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4idHJ1ZSI8L2NvZGU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogV2hldGhlciB0aGUgcHJvamVjdCBpcyBzY2hkdWxlZCBmcm9tIHRoZSBzdGFydCBkYXRlIG9yIGZpbmlzaCBkYXRlLgotCSAqIAkJCQkJCQotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TY2hlZHVsZSBGcm9tIFN0YXJ0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldFNjaGVkdWxlRnJvbVN0YXJ0KCkKLQkgKiBAc2VlICN1bnNldFNjaGVkdWxlRnJvbVN0YXJ0KCkKLQkgKiBAc2VlICNzZXRTY2hlZHVsZUZyb21TdGFydChib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFByb2plY3RfU2NoZWR1bGVGcm9tU3RhcnQoKQotCSAqIEBtb2RlbCBkZWZhdWx0PSJ0cnVlIiB1bmlxdWU9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW4iCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1NjaGVkdWxlRnJvbVN0YXJ0JyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NjaGVkdWxlRnJvbVN0YXJ0KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNTY2hlZHVsZUZyb21TdGFydCA8ZW0+U2NoZWR1bGUgRnJvbSBTdGFydDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U2NoZWR1bGUgRnJvbSBTdGFydDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRTY2hlZHVsZUZyb21TdGFydCgpCi0JICogQHNlZSAjdW5zZXRTY2hlZHVsZUZyb21TdGFydCgpCi0JICogQHNlZSAjaXNTY2hlZHVsZUZyb21TdGFydCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0U2NoZWR1bGVGcm9tU3RhcnQoYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc1NjaGVkdWxlRnJvbVN0YXJ0IDxlbT5TY2hlZHVsZSBGcm9tIFN0YXJ0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldFNjaGVkdWxlRnJvbVN0YXJ0KCkKLQkgKiBAc2VlICNpc1NjaGVkdWxlRnJvbVN0YXJ0KCkKLQkgKiBAc2VlICNzZXRTY2hlZHVsZUZyb21TdGFydChib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0U2NoZWR1bGVGcm9tU3RhcnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzU2NoZWR1bGVGcm9tU3RhcnQgPGVtPlNjaGVkdWxlIEZyb20gU3RhcnQ8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlNjaGVkdWxlIEZyb20gU3RhcnQ8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldFNjaGVkdWxlRnJvbVN0YXJ0KCkKLQkgKiBAc2VlICNpc1NjaGVkdWxlRnJvbVN0YXJ0KCkKLQkgKiBAc2VlICNzZXRTY2hlZHVsZUZyb21TdGFydChib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0U2NoZWR1bGVGcm9tU3RhcnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlN0YXJ0IERhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBzdGFydCBkYXRlIG9mIHRoZSBwcm9qZWN0LiBSZXF1aXJlZCBpZiBTY2hlZHVsZUZyb21TdGFydCBpcyB0cnVlLgotCSAqIAkJCQkJCQotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TdGFydCBEYXRlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRTdGFydERhdGUoT2JqZWN0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFByb2plY3RfU3RhcnREYXRlKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EYXRlVGltZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nU3RhcnREYXRlJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JT2JqZWN0IGdldFN0YXJ0RGF0ZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldFN0YXJ0RGF0ZSA8ZW0+U3RhcnQgRGF0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U3RhcnQgRGF0ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0U3RhcnREYXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRTdGFydERhdGUoT2JqZWN0IHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkZpbmlzaCBEYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgZmluaXNoIGRhdGUgb2YgdGhlIHByb2plY3QuIFJlcXVpcmVkIGlmIFNjaGVkdWxlRnJvbVN0YXJ0IGlzIGZhbHNlLgotCSAqIAkJCQkJCQotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5GaW5pc2ggRGF0ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0RmluaXNoRGF0ZShPYmplY3QpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UHJvamVjdF9GaW5pc2hEYXRlKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EYXRlVGltZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nRmluaXNoRGF0ZScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU9iamVjdCBnZXRGaW5pc2hEYXRlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0RmluaXNoRGF0ZSA8ZW0+RmluaXNoIERhdGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkZpbmlzaCBEYXRlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRGaW5pc2hEYXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRGaW5pc2hEYXRlKE9iamVjdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5GWSBTdGFydCBEYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBGaXNjYWwgWWVhciBzdGFydGluZyBtb250aC4gVmFsdWVzIGFyZTogCi0JICogCQkJCQkJMT1KYW51YXJ5LCAyPUZlYnJ1YXJ5LCAzPU1hcmNoLCA0PUFwcmlsLCA1PU1heSwgNj1KdW5lLCA3PUp1bHksIAotCSAqIAkJCQkJCTg9QXVndXN0LCA5PVNlcHRlbWJlciwgMTA9T2N0b2JlciwgMTE9Tm92ZW1iZXIsIDEyPURlY2VtYmVyIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5GWSBTdGFydCBEYXRlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRGWVN0YXJ0RGF0ZShCaWdJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFByb2plY3RfRllTdGFydERhdGUoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5GWVN0YXJ0RGF0ZVR5cGUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0ZZU3RhcnREYXRlJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnSW50ZWdlciBnZXRGWVN0YXJ0RGF0ZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldEZZU3RhcnREYXRlIDxlbT5GWSBTdGFydCBEYXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5GWSBTdGFydCBEYXRlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRGWVN0YXJ0RGF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RllTdGFydERhdGUoQmlnSW50ZWdlciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Dcml0aWNhbCBTbGFjayBMaW1pdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIG51bWJlciBvZiBkYXlzIHBhc3QgaXRzIGVuZCBkYXRlIHRoYXQgYSB0YXNrIGNhbiBnbyAKLQkgKiAJCQkJCQliZWZvcmUgTWljcm9zb2Z0IFByb2plY3QgbWFya3MgdGhhdCB0YXNrIGFzIGEgY3JpdGljYWwgdGFzay4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q3JpdGljYWwgU2xhY2sgTGltaXQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldENyaXRpY2FsU2xhY2tMaW1pdChCaWdJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFByb2plY3RfQ3JpdGljYWxTbGFja0xpbWl0KCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5JbnRlZ2VyIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdDcml0aWNhbFNsYWNrTGltaXQnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdJbnRlZ2VyIGdldENyaXRpY2FsU2xhY2tMaW1pdCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldENyaXRpY2FsU2xhY2tMaW1pdCA8ZW0+Q3JpdGljYWwgU2xhY2sgTGltaXQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNyaXRpY2FsIFNsYWNrIExpbWl0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRDcml0aWNhbFNsYWNrTGltaXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldENyaXRpY2FsU2xhY2tMaW1pdChCaWdJbnRlZ2VyIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkN1cnJlbmN5IERpZ2l0czwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIG51bWJlciBvZiBkaWdpdHMgYWZ0ZXIgdGhlIGRlY2ltYWwgc3ltYm9sLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5DdXJyZW5jeSBEaWdpdHM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEN1cnJlbmN5RGlnaXRzKEJpZ0ludGVnZXIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UHJvamVjdF9DdXJyZW5jeURpZ2l0cygpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuSW50ZWdlciIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQ3VycmVuY3lEaWdpdHMnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdJbnRlZ2VyIGdldEN1cnJlbmN5RGlnaXRzKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0Q3VycmVuY3lEaWdpdHMgPGVtPkN1cnJlbmN5IERpZ2l0czwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q3VycmVuY3kgRGlnaXRzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRDdXJyZW5jeURpZ2l0cygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Q3VycmVuY3lEaWdpdHMoQmlnSW50ZWdlciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5DdXJyZW5jeSBTeW1ib2w8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBjdXJyZW5jeSBzeW1ib2wgdXNlZCBpbiB0aGUgcHJvamVjdC4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q3VycmVuY3kgU3ltYm9sPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRDdXJyZW5jeVN5bWJvbChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UHJvamVjdF9DdXJyZW5jeVN5bWJvbCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkN1cnJlbmN5U3ltYm9sVHlwZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQ3VycmVuY3lTeW1ib2wnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0Q3VycmVuY3lTeW1ib2woKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRDdXJyZW5jeVN5bWJvbCA8ZW0+Q3VycmVuY3kgU3ltYm9sPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5DdXJyZW5jeSBTeW1ib2w8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEN1cnJlbmN5U3ltYm9sKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRDdXJyZW5jeVN5bWJvbChTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q3VycmVuY3kgU3ltYm9sIFBvc2l0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgcG9zaXRpb24gb2YgdGhlIGN1cnJlbmN5IHN5bWJvbC4gIFZhbHVlcyBhcmU6IAotCSAqIAkJCQkJCTA9QmVmb3JlLCAxPUFmdGVyLCAyPUJlZm9yZSBXaXRoIFNwYWNlLCAzPUFmdGVyIHdpdGggc3BhY2UuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkN1cnJlbmN5IFN5bWJvbCBQb3NpdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0Q3VycmVuY3lTeW1ib2xQb3NpdGlvbihCaWdJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFByb2plY3RfQ3VycmVuY3lTeW1ib2xQb3NpdGlvbigpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkN1cnJlbmN5U3ltYm9sUG9zaXRpb25UeXBlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdDdXJyZW5jeVN5bWJvbFBvc2l0aW9uJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnSW50ZWdlciBnZXRDdXJyZW5jeVN5bWJvbFBvc2l0aW9uKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0Q3VycmVuY3lTeW1ib2xQb3NpdGlvbiA8ZW0+Q3VycmVuY3kgU3ltYm9sIFBvc2l0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5DdXJyZW5jeSBTeW1ib2wgUG9zaXRpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEN1cnJlbmN5U3ltYm9sUG9zaXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEN1cnJlbmN5U3ltYm9sUG9zaXRpb24oQmlnSW50ZWdlciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5DYWxlbmRhciBVSUQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBwcm9qZWN0IGNhbGVuZGFyLiAgUmVmZXJzIHRvIGEgdmFsaWQgVUlEIGluIHRoZSAKLQkgKiAJCQkJCQlDYWxlbmRhcnMgZWxlbWVudCBvZiB0aGUgTWljcm9zb2Z0IFByb2plY3QgWE1MIFNjaGVtYS4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q2FsZW5kYXIgVUlEPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRDYWxlbmRhclVJRChCaWdJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFByb2plY3RfQ2FsZW5kYXJVSUQoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkludGVnZXIiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0NhbGVuZGFyVUlEJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnSW50ZWdlciBnZXRDYWxlbmRhclVJRCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldENhbGVuZGFyVUlEIDxlbT5DYWxlbmRhciBVSUQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNhbGVuZGFyIFVJRDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0Q2FsZW5kYXJVSUQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldENhbGVuZGFyVUlEKEJpZ0ludGVnZXIgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGVmYXVsdCBTdGFydCBUaW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgZGVmYXVsdCBzdGFydCB0aW1lIG9mIG5ldyB0YXNrcy4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGVmYXVsdCBTdGFydCBUaW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXREZWZhdWx0U3RhcnRUaW1lKE9iamVjdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRQcm9qZWN0X0RlZmF1bHRTdGFydFRpbWUoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlRpbWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0RlZmF1bHRTdGFydFRpbWUnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlPYmplY3QgZ2V0RGVmYXVsdFN0YXJ0VGltZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldERlZmF1bHRTdGFydFRpbWUgPGVtPkRlZmF1bHQgU3RhcnQgVGltZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RGVmYXVsdCBTdGFydCBUaW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXREZWZhdWx0U3RhcnRUaW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXREZWZhdWx0U3RhcnRUaW1lKE9iamVjdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EZWZhdWx0IEZpbmlzaCBUaW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgZGVmYXVsdCBmaW5pc2ggdGltZSBvZiBuZXcgdGFza3MuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRlZmF1bHQgRmluaXNoIFRpbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldERlZmF1bHRGaW5pc2hUaW1lKE9iamVjdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRQcm9qZWN0X0RlZmF1bHRGaW5pc2hUaW1lKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5UaW1lIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdEZWZhdWx0RmluaXNoVGltZScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU9iamVjdCBnZXREZWZhdWx0RmluaXNoVGltZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldERlZmF1bHRGaW5pc2hUaW1lIDxlbT5EZWZhdWx0IEZpbmlzaCBUaW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5EZWZhdWx0IEZpbmlzaCBUaW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXREZWZhdWx0RmluaXNoVGltZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RGVmYXVsdEZpbmlzaFRpbWUoT2JqZWN0IHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1pbnV0ZXMgUGVyIERheTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIG51bWJlciBvZiBtaW51dGVzIHBlciBkYXkuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1pbnV0ZXMgUGVyIERheTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0TWludXRlc1BlckRheShCaWdJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFByb2plY3RfTWludXRlc1BlckRheSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuSW50ZWdlciIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nTWludXRlc1BlckRheScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0ludGVnZXIgZ2V0TWludXRlc1BlckRheSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldE1pbnV0ZXNQZXJEYXkgPGVtPk1pbnV0ZXMgUGVyIERheTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TWludXRlcyBQZXIgRGF5PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRNaW51dGVzUGVyRGF5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRNaW51dGVzUGVyRGF5KEJpZ0ludGVnZXIgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TWludXRlcyBQZXIgV2VlazwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIG51bWJlciBvZiBtaW51dGVzIHBlciB3ZWVrLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NaW51dGVzIFBlciBXZWVrPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRNaW51dGVzUGVyV2VlayhCaWdJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFByb2plY3RfTWludXRlc1BlcldlZWsoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkludGVnZXIiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J01pbnV0ZXNQZXJXZWVrJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnSW50ZWdlciBnZXRNaW51dGVzUGVyV2VlaygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldE1pbnV0ZXNQZXJXZWVrIDxlbT5NaW51dGVzIFBlciBXZWVrPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5NaW51dGVzIFBlciBXZWVrPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRNaW51dGVzUGVyV2VlaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TWludXRlc1BlcldlZWsoQmlnSW50ZWdlciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EYXlzIFBlciBNb250aDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIG51bWJlciBvZiBkYXlzIHBlciBtb250aC4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGF5cyBQZXIgTW9udGg8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldERheXNQZXJNb250aChCaWdJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFByb2plY3RfRGF5c1Blck1vbnRoKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5JbnRlZ2VyIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdEYXlzUGVyTW9udGgnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdJbnRlZ2VyIGdldERheXNQZXJNb250aCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldERheXNQZXJNb250aCA8ZW0+RGF5cyBQZXIgTW9udGg8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkRheXMgUGVyIE1vbnRoPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXREYXlzUGVyTW9udGgoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldERheXNQZXJNb250aChCaWdJbnRlZ2VyIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRlZmF1bHQgVGFzayBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+IjEiPC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBkZWZhdWx0IHR5cGUgb2YgbmV3IHRhc2tzLiBWYWx1ZXMgYXJlOiAKLQkgKiAJCQkJCQkwPUZpeGVkIFVuaXRzLCAxPUZpeGVkIER1cmF0aW9uLCAyPUZpeGVkIFdvcmsuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRlZmF1bHQgVGFzayBUeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldERlZmF1bHRUYXNrVHlwZSgpCi0JICogQHNlZSAjdW5zZXREZWZhdWx0VGFza1R5cGUoKQotCSAqIEBzZWUgI3NldERlZmF1bHRUYXNrVHlwZShCaWdJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFByb2plY3RfRGVmYXVsdFRhc2tUeXBlKCkKLQkgKiBAbW9kZWwgZGVmYXVsdD0iMSIgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRGVmYXVsdFRhc2tUeXBlVHlwZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nRGVmYXVsdFRhc2tUeXBlJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnSW50ZWdlciBnZXREZWZhdWx0VGFza1R5cGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXREZWZhdWx0VGFza1R5cGUgPGVtPkRlZmF1bHQgVGFzayBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5EZWZhdWx0IFRhc2sgVHlwZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXREZWZhdWx0VGFza1R5cGUoKQotCSAqIEBzZWUgI3Vuc2V0RGVmYXVsdFRhc2tUeXBlKCkKLQkgKiBAc2VlICNnZXREZWZhdWx0VGFza1R5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldERlZmF1bHRUYXNrVHlwZShCaWdJbnRlZ2VyIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldERlZmF1bHRUYXNrVHlwZSA8ZW0+RGVmYXVsdCBUYXNrIFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0RGVmYXVsdFRhc2tUeXBlKCkKLQkgKiBAc2VlICNnZXREZWZhdWx0VGFza1R5cGUoKQotCSAqIEBzZWUgI3NldERlZmF1bHRUYXNrVHlwZShCaWdJbnRlZ2VyKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0RGVmYXVsdFRhc2tUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXREZWZhdWx0VGFza1R5cGUgPGVtPkRlZmF1bHQgVGFzayBUeXBlPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EZWZhdWx0IFRhc2sgVHlwZTwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0RGVmYXVsdFRhc2tUeXBlKCkKLQkgKiBAc2VlICNnZXREZWZhdWx0VGFza1R5cGUoKQotCSAqIEBzZWUgI3NldERlZmF1bHRUYXNrVHlwZShCaWdJbnRlZ2VyKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0RGVmYXVsdFRhc2tUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EZWZhdWx0IEZpeGVkIENvc3QgQWNjcnVhbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGRlZmF1bHQgZnJvbSB3aGVyZSBmaXhlZCBjb3N0cyBhcmUgYWNjcnVlZC4gIFZhbHVlcyBhcmU6IAotCSAqIAkJCQkJCTE9U3RhcnQsIDI9UHJvcmF0ZWQsIDM9RW5kCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRlZmF1bHQgRml4ZWQgQ29zdCBBY2NydWFsPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXREZWZhdWx0Rml4ZWRDb3N0QWNjcnVhbChCaWdJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFByb2plY3RfRGVmYXVsdEZpeGVkQ29zdEFjY3J1YWwoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5EZWZhdWx0Rml4ZWRDb3N0QWNjcnVhbFR5cGUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0RlZmF1bHRGaXhlZENvc3RBY2NydWFsJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnSW50ZWdlciBnZXREZWZhdWx0Rml4ZWRDb3N0QWNjcnVhbCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldERlZmF1bHRGaXhlZENvc3RBY2NydWFsIDxlbT5EZWZhdWx0IEZpeGVkIENvc3QgQWNjcnVhbDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RGVmYXVsdCBGaXhlZCBDb3N0IEFjY3J1YWw8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldERlZmF1bHRGaXhlZENvc3RBY2NydWFsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXREZWZhdWx0Rml4ZWRDb3N0QWNjcnVhbChCaWdJbnRlZ2VyIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRlZmF1bHQgU3RhbmRhcmQgUmF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGRlZmF1bHQgc3RhbmRhcmQgcmF0ZSBmb3IgbmV3IHJlc291cmNlcy4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGVmYXVsdCBTdGFuZGFyZCBSYXRlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldERlZmF1bHRTdGFuZGFyZFJhdGUoKQotCSAqIEBzZWUgI3Vuc2V0RGVmYXVsdFN0YW5kYXJkUmF0ZSgpCi0JICogQHNlZSAjc2V0RGVmYXVsdFN0YW5kYXJkUmF0ZShmbG9hdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRQcm9qZWN0X0RlZmF1bHRTdGFuZGFyZFJhdGUoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkZsb2F0IgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdEZWZhdWx0U3RhbmRhcmRSYXRlJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JZmxvYXQgZ2V0RGVmYXVsdFN0YW5kYXJkUmF0ZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldERlZmF1bHRTdGFuZGFyZFJhdGUgPGVtPkRlZmF1bHQgU3RhbmRhcmQgUmF0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RGVmYXVsdCBTdGFuZGFyZCBSYXRlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldERlZmF1bHRTdGFuZGFyZFJhdGUoKQotCSAqIEBzZWUgI3Vuc2V0RGVmYXVsdFN0YW5kYXJkUmF0ZSgpCi0JICogQHNlZSAjZ2V0RGVmYXVsdFN0YW5kYXJkUmF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RGVmYXVsdFN0YW5kYXJkUmF0ZShmbG9hdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXREZWZhdWx0U3RhbmRhcmRSYXRlIDxlbT5EZWZhdWx0IFN0YW5kYXJkIFJhdGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0RGVmYXVsdFN0YW5kYXJkUmF0ZSgpCi0JICogQHNlZSAjZ2V0RGVmYXVsdFN0YW5kYXJkUmF0ZSgpCi0JICogQHNlZSAjc2V0RGVmYXVsdFN0YW5kYXJkUmF0ZShmbG9hdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldERlZmF1bHRTdGFuZGFyZFJhdGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldERlZmF1bHRTdGFuZGFyZFJhdGUgPGVtPkRlZmF1bHQgU3RhbmRhcmQgUmF0ZTwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGVmYXVsdCBTdGFuZGFyZCBSYXRlPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXREZWZhdWx0U3RhbmRhcmRSYXRlKCkKLQkgKiBAc2VlICNnZXREZWZhdWx0U3RhbmRhcmRSYXRlKCkKLQkgKiBAc2VlICNzZXREZWZhdWx0U3RhbmRhcmRSYXRlKGZsb2F0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0RGVmYXVsdFN0YW5kYXJkUmF0ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGVmYXVsdCBPdmVydGltZSBSYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgZGVmYXVsdCBvdmVydGltZSByYXRlIGZvciBuZXcgcmVzb3VyY2VzLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EZWZhdWx0IE92ZXJ0aW1lIFJhdGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0RGVmYXVsdE92ZXJ0aW1lUmF0ZSgpCi0JICogQHNlZSAjdW5zZXREZWZhdWx0T3ZlcnRpbWVSYXRlKCkKLQkgKiBAc2VlICNzZXREZWZhdWx0T3ZlcnRpbWVSYXRlKGZsb2F0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFByb2plY3RfRGVmYXVsdE92ZXJ0aW1lUmF0ZSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRmxvYXQiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0RlZmF1bHRPdmVydGltZVJhdGUnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlmbG9hdCBnZXREZWZhdWx0T3ZlcnRpbWVSYXRlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0RGVmYXVsdE92ZXJ0aW1lUmF0ZSA8ZW0+RGVmYXVsdCBPdmVydGltZSBSYXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5EZWZhdWx0IE92ZXJ0aW1lIFJhdGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0RGVmYXVsdE92ZXJ0aW1lUmF0ZSgpCi0JICogQHNlZSAjdW5zZXREZWZhdWx0T3ZlcnRpbWVSYXRlKCkKLQkgKiBAc2VlICNnZXREZWZhdWx0T3ZlcnRpbWVSYXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXREZWZhdWx0T3ZlcnRpbWVSYXRlKGZsb2F0IHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldERlZmF1bHRPdmVydGltZVJhdGUgPGVtPkRlZmF1bHQgT3ZlcnRpbWUgUmF0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXREZWZhdWx0T3ZlcnRpbWVSYXRlKCkKLQkgKiBAc2VlICNnZXREZWZhdWx0T3ZlcnRpbWVSYXRlKCkKLQkgKiBAc2VlICNzZXREZWZhdWx0T3ZlcnRpbWVSYXRlKGZsb2F0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0RGVmYXVsdE92ZXJ0aW1lUmF0ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0RGVmYXVsdE92ZXJ0aW1lUmF0ZSA8ZW0+RGVmYXVsdCBPdmVydGltZSBSYXRlPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EZWZhdWx0IE92ZXJ0aW1lIFJhdGU8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldERlZmF1bHRPdmVydGltZVJhdGUoKQotCSAqIEBzZWUgI2dldERlZmF1bHRPdmVydGltZVJhdGUoKQotCSAqIEBzZWUgI3NldERlZmF1bHRPdmVydGltZVJhdGUoZmxvYXQpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXREZWZhdWx0T3ZlcnRpbWVSYXRlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EdXJhdGlvbiBGb3JtYXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBmb3JtYXQgZm9yIGV4cHJlc3NpbmcgdGhlIGJ1bGsgZHVyYXRpb24uICBWYWx1ZXMgYXJlOiAKLQkgKiAJCQkJCQkzPW0sIDQ9ZW0sIDU9aCwgNj1laCwgNz1kLCA4PWVkLCA5PXcsIDEwPWV3LCAxMT1tbywgMTI9ZW1vLCAxOT0lLCAyMD1lJSwgMjE9bnVsbCwgCi0JICogCQkJCQkJMzU9bT8sIDM2PWVtPywgMzc9aD8sIDM4PWVoPywgMzk9ZD8sIDQwPWVkPywgNDE9dz8sIDQyPWV3PywgNDM9bW8/LCA0ND1lbW8/LCA1MT0lPywgNTI9ZSU/IGFuZCAKLQkgKiAJCQkJCQk1Mz1udWxsLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EdXJhdGlvbiBGb3JtYXQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldER1cmF0aW9uRm9ybWF0KEJpZ0ludGVnZXIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UHJvamVjdF9EdXJhdGlvbkZvcm1hdCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkR1cmF0aW9uRm9ybWF0VHlwZTUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0R1cmF0aW9uRm9ybWF0JyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnSW50ZWdlciBnZXREdXJhdGlvbkZvcm1hdCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldER1cmF0aW9uRm9ybWF0IDxlbT5EdXJhdGlvbiBGb3JtYXQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkR1cmF0aW9uIEZvcm1hdDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0RHVyYXRpb25Gb3JtYXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldER1cmF0aW9uRm9ybWF0KEJpZ0ludGVnZXIgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+V29yayBGb3JtYXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBkZWZhdWx0IHdvcmsgdW5pdCBmb3JtYXQuIFZhbHVlcyBhcmU6IAotCSAqIAkJCQkJCTE9bSwgMj1oLCAzPWQsIDQ9dywgNT1tbwotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Xb3JrIEZvcm1hdDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0V29ya0Zvcm1hdChCaWdJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFByb2plY3RfV29ya0Zvcm1hdCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldvcmtGb3JtYXRUeXBlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdXb3JrRm9ybWF0JyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnSW50ZWdlciBnZXRXb3JrRm9ybWF0KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0V29ya0Zvcm1hdCA8ZW0+V29yayBGb3JtYXQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPldvcmsgRm9ybWF0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRXb3JrRm9ybWF0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRXb3JrRm9ybWF0KEJpZ0ludGVnZXIgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RWRpdGFibGUgQWN0dWFsIENvc3RzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+ImZhbHNlIjwvY29kZT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBXaGV0aGVyIG9yIG5vdCBhY3R1YWwgY29zdHMgYXJlIGVkaXRhYmxlLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FZGl0YWJsZSBBY3R1YWwgQ29zdHM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0RWRpdGFibGVBY3R1YWxDb3N0cygpCi0JICogQHNlZSAjdW5zZXRFZGl0YWJsZUFjdHVhbENvc3RzKCkKLQkgKiBAc2VlICNzZXRFZGl0YWJsZUFjdHVhbENvc3RzKGJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UHJvamVjdF9FZGl0YWJsZUFjdHVhbENvc3RzKCkKLQkgKiBAbW9kZWwgZGVmYXVsdD0iZmFsc2UiIHVuaXF1ZT0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbiIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nRWRpdGFibGVBY3R1YWxDb3N0cycgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNFZGl0YWJsZUFjdHVhbENvc3RzKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNFZGl0YWJsZUFjdHVhbENvc3RzIDxlbT5FZGl0YWJsZSBBY3R1YWwgQ29zdHM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkVkaXRhYmxlIEFjdHVhbCBDb3N0czwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRFZGl0YWJsZUFjdHVhbENvc3RzKCkKLQkgKiBAc2VlICN1bnNldEVkaXRhYmxlQWN0dWFsQ29zdHMoKQotCSAqIEBzZWUgI2lzRWRpdGFibGVBY3R1YWxDb3N0cygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RWRpdGFibGVBY3R1YWxDb3N0cyhib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzRWRpdGFibGVBY3R1YWxDb3N0cyA8ZW0+RWRpdGFibGUgQWN0dWFsIENvc3RzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldEVkaXRhYmxlQWN0dWFsQ29zdHMoKQotCSAqIEBzZWUgI2lzRWRpdGFibGVBY3R1YWxDb3N0cygpCi0JICogQHNlZSAjc2V0RWRpdGFibGVBY3R1YWxDb3N0cyhib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0RWRpdGFibGVBY3R1YWxDb3N0cygpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNFZGl0YWJsZUFjdHVhbENvc3RzIDxlbT5FZGl0YWJsZSBBY3R1YWwgQ29zdHM8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkVkaXRhYmxlIEFjdHVhbCBDb3N0czwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0RWRpdGFibGVBY3R1YWxDb3N0cygpCi0JICogQHNlZSAjaXNFZGl0YWJsZUFjdHVhbENvc3RzKCkKLQkgKiBAc2VlICNzZXRFZGl0YWJsZUFjdHVhbENvc3RzKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRFZGl0YWJsZUFjdHVhbENvc3RzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Ib25vciBDb25zdHJhaW50czwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiJ0cnVlIjwvY29kZT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBXaGV0aGVyIHRhc2tzIGhvbm91ciB0aGVpciBjb25zdHJhaW50IGRhdGVzLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Ib25vciBDb25zdHJhaW50czwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRIb25vckNvbnN0cmFpbnRzKCkKLQkgKiBAc2VlICN1bnNldEhvbm9yQ29uc3RyYWludHMoKQotCSAqIEBzZWUgI3NldEhvbm9yQ29uc3RyYWludHMoYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRQcm9qZWN0X0hvbm9yQ29uc3RyYWludHMoKQotCSAqIEBtb2RlbCBkZWZhdWx0PSJ0cnVlIiB1bmlxdWU9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW4iCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0hvbm9yQ29uc3RyYWludHMnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzSG9ub3JDb25zdHJhaW50cygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzSG9ub3JDb25zdHJhaW50cyA8ZW0+SG9ub3IgQ29uc3RyYWludHM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkhvbm9yIENvbnN0cmFpbnRzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldEhvbm9yQ29uc3RyYWludHMoKQotCSAqIEBzZWUgI3Vuc2V0SG9ub3JDb25zdHJhaW50cygpCi0JICogQHNlZSAjaXNIb25vckNvbnN0cmFpbnRzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRIb25vckNvbnN0cmFpbnRzKGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNIb25vckNvbnN0cmFpbnRzIDxlbT5Ib25vciBDb25zdHJhaW50czwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRIb25vckNvbnN0cmFpbnRzKCkKLQkgKiBAc2VlICNpc0hvbm9yQ29uc3RyYWludHMoKQotCSAqIEBzZWUgI3NldEhvbm9yQ29uc3RyYWludHMoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldEhvbm9yQ29uc3RyYWludHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzSG9ub3JDb25zdHJhaW50cyA8ZW0+SG9ub3IgQ29uc3RyYWludHM8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkhvbm9yIENvbnN0cmFpbnRzPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRIb25vckNvbnN0cmFpbnRzKCkKLQkgKiBAc2VlICNpc0hvbm9yQ29uc3RyYWludHMoKQotCSAqIEBzZWUgI3NldEhvbm9yQ29uc3RyYWludHMoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldEhvbm9yQ29uc3RyYWludHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkVhcm5lZCBWYWx1ZSBNZXRob2Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBkZWZhdWx0IG1ldGhvZCBmb3IgY2FsY3VsYXRpbmcgZWFybmVkIHZhbHVlLiBWYWx1ZXMgYXJlOiAKLQkgKiAJCQkJCQkwPVBlcmNlbnQgQ29tcGxldGUsIDE9UGh5c2ljYWwgUGVyY2VudCBDb21wbGV0ZQotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FYXJuZWQgVmFsdWUgTWV0aG9kPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRFYXJuZWRWYWx1ZU1ldGhvZChCaWdJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFByb2plY3RfRWFybmVkVmFsdWVNZXRob2QoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FYXJuZWRWYWx1ZU1ldGhvZFR5cGUxIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdFYXJuZWRWYWx1ZU1ldGhvZCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0ludGVnZXIgZ2V0RWFybmVkVmFsdWVNZXRob2QoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRFYXJuZWRWYWx1ZU1ldGhvZCA8ZW0+RWFybmVkIFZhbHVlIE1ldGhvZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RWFybmVkIFZhbHVlIE1ldGhvZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0RWFybmVkVmFsdWVNZXRob2QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEVhcm5lZFZhbHVlTWV0aG9kKEJpZ0ludGVnZXIgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SW5zZXJ0ZWQgUHJvamVjdHMgTGlrZSBTdW1tYXJ5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+InRydWUiPC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFdoZXRoZXIgdG8gY2FsY3VsYXRlIHN1YnRhc2tzIGFzIHN1bW1hcnkgdGFza3MuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkluc2VydGVkIFByb2plY3RzIExpa2UgU3VtbWFyeTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRJbnNlcnRlZFByb2plY3RzTGlrZVN1bW1hcnkoKQotCSAqIEBzZWUgI3Vuc2V0SW5zZXJ0ZWRQcm9qZWN0c0xpa2VTdW1tYXJ5KCkKLQkgKiBAc2VlICNzZXRJbnNlcnRlZFByb2plY3RzTGlrZVN1bW1hcnkoYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRQcm9qZWN0X0luc2VydGVkUHJvamVjdHNMaWtlU3VtbWFyeSgpCi0JICogQG1vZGVsIGRlZmF1bHQ9InRydWUiIHVuaXF1ZT0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbiIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nSW5zZXJ0ZWRQcm9qZWN0c0xpa2VTdW1tYXJ5JyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc0luc2VydGVkUHJvamVjdHNMaWtlU3VtbWFyeSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzSW5zZXJ0ZWRQcm9qZWN0c0xpa2VTdW1tYXJ5IDxlbT5JbnNlcnRlZCBQcm9qZWN0cyBMaWtlIFN1bW1hcnk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkluc2VydGVkIFByb2plY3RzIExpa2UgU3VtbWFyeTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRJbnNlcnRlZFByb2plY3RzTGlrZVN1bW1hcnkoKQotCSAqIEBzZWUgI3Vuc2V0SW5zZXJ0ZWRQcm9qZWN0c0xpa2VTdW1tYXJ5KCkKLQkgKiBAc2VlICNpc0luc2VydGVkUHJvamVjdHNMaWtlU3VtbWFyeSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0SW5zZXJ0ZWRQcm9qZWN0c0xpa2VTdW1tYXJ5KGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNJbnNlcnRlZFByb2plY3RzTGlrZVN1bW1hcnkgPGVtPkluc2VydGVkIFByb2plY3RzIExpa2UgU3VtbWFyeTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRJbnNlcnRlZFByb2plY3RzTGlrZVN1bW1hcnkoKQotCSAqIEBzZWUgI2lzSW5zZXJ0ZWRQcm9qZWN0c0xpa2VTdW1tYXJ5KCkKLQkgKiBAc2VlICNzZXRJbnNlcnRlZFByb2plY3RzTGlrZVN1bW1hcnkoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldEluc2VydGVkUHJvamVjdHNMaWtlU3VtbWFyeSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNJbnNlcnRlZFByb2plY3RzTGlrZVN1bW1hcnkgPGVtPkluc2VydGVkIFByb2plY3RzIExpa2UgU3VtbWFyeTwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SW5zZXJ0ZWQgUHJvamVjdHMgTGlrZSBTdW1tYXJ5PC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRJbnNlcnRlZFByb2plY3RzTGlrZVN1bW1hcnkoKQotCSAqIEBzZWUgI2lzSW5zZXJ0ZWRQcm9qZWN0c0xpa2VTdW1tYXJ5KCkKLQkgKiBAc2VlICNzZXRJbnNlcnRlZFByb2plY3RzTGlrZVN1bW1hcnkoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldEluc2VydGVkUHJvamVjdHNMaWtlU3VtbWFyeSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TXVsdGlwbGUgQ3JpdGljYWwgUGF0aHM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iZmFsc2UiPC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFdoZXRoZXIgbXVsdGlwbGUgY3JpdGljYWwgcGF0aHMgYXJlIGNhbGN1bGF0ZWQuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk11bHRpcGxlIENyaXRpY2FsIFBhdGhzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldE11bHRpcGxlQ3JpdGljYWxQYXRocygpCi0JICogQHNlZSAjdW5zZXRNdWx0aXBsZUNyaXRpY2FsUGF0aHMoKQotCSAqIEBzZWUgI3NldE11bHRpcGxlQ3JpdGljYWxQYXRocyhib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFByb2plY3RfTXVsdGlwbGVDcml0aWNhbFBhdGhzKCkKLQkgKiBAbW9kZWwgZGVmYXVsdD0iZmFsc2UiIHVuaXF1ZT0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbiIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nTXVsdGlwbGVDcml0aWNhbFBhdGhzJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc011bHRpcGxlQ3JpdGljYWxQYXRocygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzTXVsdGlwbGVDcml0aWNhbFBhdGhzIDxlbT5NdWx0aXBsZSBDcml0aWNhbCBQYXRoczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TXVsdGlwbGUgQ3JpdGljYWwgUGF0aHM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0TXVsdGlwbGVDcml0aWNhbFBhdGhzKCkKLQkgKiBAc2VlICN1bnNldE11bHRpcGxlQ3JpdGljYWxQYXRocygpCi0JICogQHNlZSAjaXNNdWx0aXBsZUNyaXRpY2FsUGF0aHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldE11bHRpcGxlQ3JpdGljYWxQYXRocyhib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzTXVsdGlwbGVDcml0aWNhbFBhdGhzIDxlbT5NdWx0aXBsZSBDcml0aWNhbCBQYXRoczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRNdWx0aXBsZUNyaXRpY2FsUGF0aHMoKQotCSAqIEBzZWUgI2lzTXVsdGlwbGVDcml0aWNhbFBhdGhzKCkKLQkgKiBAc2VlICNzZXRNdWx0aXBsZUNyaXRpY2FsUGF0aHMoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldE11bHRpcGxlQ3JpdGljYWxQYXRocygpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNNdWx0aXBsZUNyaXRpY2FsUGF0aHMgPGVtPk11bHRpcGxlIENyaXRpY2FsIFBhdGhzPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NdWx0aXBsZSBDcml0aWNhbCBQYXRoczwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0TXVsdGlwbGVDcml0aWNhbFBhdGhzKCkKLQkgKiBAc2VlICNpc011bHRpcGxlQ3JpdGljYWxQYXRocygpCi0JICogQHNlZSAjc2V0TXVsdGlwbGVDcml0aWNhbFBhdGhzKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRNdWx0aXBsZUNyaXRpY2FsUGF0aHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk5ldyBUYXNrcyBFZmZvcnQgRHJpdmVuPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+InRydWUiPC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFdoZXRoZXIgbmV3IHRhc2tzIGFyZSBlZmZvcnQgZHJpdmVuLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5OZXcgVGFza3MgRWZmb3J0IERyaXZlbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXROZXdUYXNrc0VmZm9ydERyaXZlbigpCi0JICogQHNlZSAjdW5zZXROZXdUYXNrc0VmZm9ydERyaXZlbigpCi0JICogQHNlZSAjc2V0TmV3VGFza3NFZmZvcnREcml2ZW4oYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRQcm9qZWN0X05ld1Rhc2tzRWZmb3J0RHJpdmVuKCkKLQkgKiBAbW9kZWwgZGVmYXVsdD0idHJ1ZSIgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdOZXdUYXNrc0VmZm9ydERyaXZlbicgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNOZXdUYXNrc0VmZm9ydERyaXZlbigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzTmV3VGFza3NFZmZvcnREcml2ZW4gPGVtPk5ldyBUYXNrcyBFZmZvcnQgRHJpdmVuPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5OZXcgVGFza3MgRWZmb3J0IERyaXZlbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXROZXdUYXNrc0VmZm9ydERyaXZlbigpCi0JICogQHNlZSAjdW5zZXROZXdUYXNrc0VmZm9ydERyaXZlbigpCi0JICogQHNlZSAjaXNOZXdUYXNrc0VmZm9ydERyaXZlbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TmV3VGFza3NFZmZvcnREcml2ZW4oYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc05ld1Rhc2tzRWZmb3J0RHJpdmVuIDxlbT5OZXcgVGFza3MgRWZmb3J0IERyaXZlbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXROZXdUYXNrc0VmZm9ydERyaXZlbigpCi0JICogQHNlZSAjaXNOZXdUYXNrc0VmZm9ydERyaXZlbigpCi0JICogQHNlZSAjc2V0TmV3VGFza3NFZmZvcnREcml2ZW4oYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldE5ld1Rhc2tzRWZmb3J0RHJpdmVuKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc05ld1Rhc2tzRWZmb3J0RHJpdmVuIDxlbT5OZXcgVGFza3MgRWZmb3J0IERyaXZlbjwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TmV3IFRhc2tzIEVmZm9ydCBEcml2ZW48L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldE5ld1Rhc2tzRWZmb3J0RHJpdmVuKCkKLQkgKiBAc2VlICNpc05ld1Rhc2tzRWZmb3J0RHJpdmVuKCkKLQkgKiBAc2VlICNzZXROZXdUYXNrc0VmZm9ydERyaXZlbihib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0TmV3VGFza3NFZmZvcnREcml2ZW4oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk5ldyBUYXNrcyBFc3RpbWF0ZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4idHJ1ZSI8L2NvZGU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogV2hldGhlciB0byBzaG93IHRoZSBlc3RpbWF0ZWQgZHVyYXRpb24gYnkgZGVmYXVsdC4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TmV3IFRhc2tzIEVzdGltYXRlZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXROZXdUYXNrc0VzdGltYXRlZCgpCi0JICogQHNlZSAjdW5zZXROZXdUYXNrc0VzdGltYXRlZCgpCi0JICogQHNlZSAjc2V0TmV3VGFza3NFc3RpbWF0ZWQoYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRQcm9qZWN0X05ld1Rhc2tzRXN0aW1hdGVkKCkKLQkgKiBAbW9kZWwgZGVmYXVsdD0idHJ1ZSIgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdOZXdUYXNrc0VzdGltYXRlZCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNOZXdUYXNrc0VzdGltYXRlZCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzTmV3VGFza3NFc3RpbWF0ZWQgPGVtPk5ldyBUYXNrcyBFc3RpbWF0ZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk5ldyBUYXNrcyBFc3RpbWF0ZWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0TmV3VGFza3NFc3RpbWF0ZWQoKQotCSAqIEBzZWUgI3Vuc2V0TmV3VGFza3NFc3RpbWF0ZWQoKQotCSAqIEBzZWUgI2lzTmV3VGFza3NFc3RpbWF0ZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldE5ld1Rhc2tzRXN0aW1hdGVkKGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNOZXdUYXNrc0VzdGltYXRlZCA8ZW0+TmV3IFRhc2tzIEVzdGltYXRlZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXROZXdUYXNrc0VzdGltYXRlZCgpCi0JICogQHNlZSAjaXNOZXdUYXNrc0VzdGltYXRlZCgpCi0JICogQHNlZSAjc2V0TmV3VGFza3NFc3RpbWF0ZWQoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldE5ld1Rhc2tzRXN0aW1hdGVkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc05ld1Rhc2tzRXN0aW1hdGVkIDxlbT5OZXcgVGFza3MgRXN0aW1hdGVkPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5OZXcgVGFza3MgRXN0aW1hdGVkPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXROZXdUYXNrc0VzdGltYXRlZCgpCi0JICogQHNlZSAjaXNOZXdUYXNrc0VzdGltYXRlZCgpCi0JICogQHNlZSAjc2V0TmV3VGFza3NFc3RpbWF0ZWQoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldE5ld1Rhc2tzRXN0aW1hdGVkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TcGxpdHMgSW4gUHJvZ3Jlc3MgVGFza3M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4idHJ1ZSI8L2NvZGU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogV2hldGhlciBpbi1wcm9ncmVzcyB0YXNrcyBjYW4gYmUgc3BsaXQuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlNwbGl0cyBJbiBQcm9ncmVzcyBUYXNrczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRTcGxpdHNJblByb2dyZXNzVGFza3MoKQotCSAqIEBzZWUgI3Vuc2V0U3BsaXRzSW5Qcm9ncmVzc1Rhc2tzKCkKLQkgKiBAc2VlICNzZXRTcGxpdHNJblByb2dyZXNzVGFza3MoYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRQcm9qZWN0X1NwbGl0c0luUHJvZ3Jlc3NUYXNrcygpCi0JICogQG1vZGVsIGRlZmF1bHQ9InRydWUiIHVuaXF1ZT0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbiIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nU3BsaXRzSW5Qcm9ncmVzc1Rhc2tzJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NwbGl0c0luUHJvZ3Jlc3NUYXNrcygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzU3BsaXRzSW5Qcm9ncmVzc1Rhc2tzIDxlbT5TcGxpdHMgSW4gUHJvZ3Jlc3MgVGFza3M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlNwbGl0cyBJbiBQcm9ncmVzcyBUYXNrczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRTcGxpdHNJblByb2dyZXNzVGFza3MoKQotCSAqIEBzZWUgI3Vuc2V0U3BsaXRzSW5Qcm9ncmVzc1Rhc2tzKCkKLQkgKiBAc2VlICNpc1NwbGl0c0luUHJvZ3Jlc3NUYXNrcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0U3BsaXRzSW5Qcm9ncmVzc1Rhc2tzKGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNTcGxpdHNJblByb2dyZXNzVGFza3MgPGVtPlNwbGl0cyBJbiBQcm9ncmVzcyBUYXNrczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRTcGxpdHNJblByb2dyZXNzVGFza3MoKQotCSAqIEBzZWUgI2lzU3BsaXRzSW5Qcm9ncmVzc1Rhc2tzKCkKLQkgKiBAc2VlICNzZXRTcGxpdHNJblByb2dyZXNzVGFza3MoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldFNwbGl0c0luUHJvZ3Jlc3NUYXNrcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNTcGxpdHNJblByb2dyZXNzVGFza3MgPGVtPlNwbGl0cyBJbiBQcm9ncmVzcyBUYXNrczwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U3BsaXRzIEluIFByb2dyZXNzIFRhc2tzPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRTcGxpdHNJblByb2dyZXNzVGFza3MoKQotCSAqIEBzZWUgI2lzU3BsaXRzSW5Qcm9ncmVzc1Rhc2tzKCkKLQkgKiBAc2VlICNzZXRTcGxpdHNJblByb2dyZXNzVGFza3MoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldFNwbGl0c0luUHJvZ3Jlc3NUYXNrcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U3ByZWFkIEFjdHVhbCBDb3N0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+InRydWUiPC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFdoZXRoZXIgYWN0dWFsIGNvc3RzIGFyZSBzcHJlYWQgdG8gdGhlIHN0YXR1cyBkYXRlLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TcHJlYWQgQWN0dWFsIENvc3Q8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0U3ByZWFkQWN0dWFsQ29zdCgpCi0JICogQHNlZSAjdW5zZXRTcHJlYWRBY3R1YWxDb3N0KCkKLQkgKiBAc2VlICNzZXRTcHJlYWRBY3R1YWxDb3N0KGJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UHJvamVjdF9TcHJlYWRBY3R1YWxDb3N0KCkKLQkgKiBAbW9kZWwgZGVmYXVsdD0idHJ1ZSIgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdTcHJlYWRBY3R1YWxDb3N0JyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NwcmVhZEFjdHVhbENvc3QoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc1NwcmVhZEFjdHVhbENvc3QgPGVtPlNwcmVhZCBBY3R1YWwgQ29zdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U3ByZWFkIEFjdHVhbCBDb3N0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldFNwcmVhZEFjdHVhbENvc3QoKQotCSAqIEBzZWUgI3Vuc2V0U3ByZWFkQWN0dWFsQ29zdCgpCi0JICogQHNlZSAjaXNTcHJlYWRBY3R1YWxDb3N0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRTcHJlYWRBY3R1YWxDb3N0KGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNTcHJlYWRBY3R1YWxDb3N0IDxlbT5TcHJlYWQgQWN0dWFsIENvc3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0U3ByZWFkQWN0dWFsQ29zdCgpCi0JICogQHNlZSAjaXNTcHJlYWRBY3R1YWxDb3N0KCkKLQkgKiBAc2VlICNzZXRTcHJlYWRBY3R1YWxDb3N0KGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRTcHJlYWRBY3R1YWxDb3N0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc1NwcmVhZEFjdHVhbENvc3QgPGVtPlNwcmVhZCBBY3R1YWwgQ29zdDwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U3ByZWFkIEFjdHVhbCBDb3N0PC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRTcHJlYWRBY3R1YWxDb3N0KCkKLQkgKiBAc2VlICNpc1NwcmVhZEFjdHVhbENvc3QoKQotCSAqIEBzZWUgI3NldFNwcmVhZEFjdHVhbENvc3QoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldFNwcmVhZEFjdHVhbENvc3QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlNwcmVhZCBQZXJjZW50IENvbXBsZXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+ImZhbHNlIjwvY29kZT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBXaGV0aGVyIHBlcmNlbnQgY29tcGxldGUgaXMgc3ByZWFkIHRvIHRoZSBzdGF0dXMgZGF0ZS4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U3ByZWFkIFBlcmNlbnQgQ29tcGxldGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0U3ByZWFkUGVyY2VudENvbXBsZXRlKCkKLQkgKiBAc2VlICN1bnNldFNwcmVhZFBlcmNlbnRDb21wbGV0ZSgpCi0JICogQHNlZSAjc2V0U3ByZWFkUGVyY2VudENvbXBsZXRlKGJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UHJvamVjdF9TcHJlYWRQZXJjZW50Q29tcGxldGUoKQotCSAqIEBtb2RlbCBkZWZhdWx0PSJmYWxzZSIgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdTcHJlYWRQZXJjZW50Q29tcGxldGUnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU3ByZWFkUGVyY2VudENvbXBsZXRlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNTcHJlYWRQZXJjZW50Q29tcGxldGUgPGVtPlNwcmVhZCBQZXJjZW50IENvbXBsZXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TcHJlYWQgUGVyY2VudCBDb21wbGV0ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRTcHJlYWRQZXJjZW50Q29tcGxldGUoKQotCSAqIEBzZWUgI3Vuc2V0U3ByZWFkUGVyY2VudENvbXBsZXRlKCkKLQkgKiBAc2VlICNpc1NwcmVhZFBlcmNlbnRDb21wbGV0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0U3ByZWFkUGVyY2VudENvbXBsZXRlKGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNTcHJlYWRQZXJjZW50Q29tcGxldGUgPGVtPlNwcmVhZCBQZXJjZW50IENvbXBsZXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldFNwcmVhZFBlcmNlbnRDb21wbGV0ZSgpCi0JICogQHNlZSAjaXNTcHJlYWRQZXJjZW50Q29tcGxldGUoKQotCSAqIEBzZWUgI3NldFNwcmVhZFBlcmNlbnRDb21wbGV0ZShib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0U3ByZWFkUGVyY2VudENvbXBsZXRlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc1NwcmVhZFBlcmNlbnRDb21wbGV0ZSA8ZW0+U3ByZWFkIFBlcmNlbnQgQ29tcGxldGU8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlNwcmVhZCBQZXJjZW50IENvbXBsZXRlPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRTcHJlYWRQZXJjZW50Q29tcGxldGUoKQotCSAqIEBzZWUgI2lzU3ByZWFkUGVyY2VudENvbXBsZXRlKCkKLQkgKiBAc2VlICNzZXRTcHJlYWRQZXJjZW50Q29tcGxldGUoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldFNwcmVhZFBlcmNlbnRDb21wbGV0ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VGFzayBVcGRhdGVzIFJlc291cmNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBXaGV0aGVyIHVwZGF0ZXMgdG8gdGFza3MgdXBkYXRlIHJlc291cmNlcy4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VGFzayBVcGRhdGVzIFJlc291cmNlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldFRhc2tVcGRhdGVzUmVzb3VyY2UoKQotCSAqIEBzZWUgI3Vuc2V0VGFza1VwZGF0ZXNSZXNvdXJjZSgpCi0JICogQHNlZSAjc2V0VGFza1VwZGF0ZXNSZXNvdXJjZShib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFByb2plY3RfVGFza1VwZGF0ZXNSZXNvdXJjZSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbiIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nVGFza1VwZGF0ZXNSZXNvdXJjZScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNUYXNrVXBkYXRlc1Jlc291cmNlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNUYXNrVXBkYXRlc1Jlc291cmNlIDxlbT5UYXNrIFVwZGF0ZXMgUmVzb3VyY2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlRhc2sgVXBkYXRlcyBSZXNvdXJjZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRUYXNrVXBkYXRlc1Jlc291cmNlKCkKLQkgKiBAc2VlICN1bnNldFRhc2tVcGRhdGVzUmVzb3VyY2UoKQotCSAqIEBzZWUgI2lzVGFza1VwZGF0ZXNSZXNvdXJjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VGFza1VwZGF0ZXNSZXNvdXJjZShib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzVGFza1VwZGF0ZXNSZXNvdXJjZSA8ZW0+VGFzayBVcGRhdGVzIFJlc291cmNlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldFRhc2tVcGRhdGVzUmVzb3VyY2UoKQotCSAqIEBzZWUgI2lzVGFza1VwZGF0ZXNSZXNvdXJjZSgpCi0JICogQHNlZSAjc2V0VGFza1VwZGF0ZXNSZXNvdXJjZShib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0VGFza1VwZGF0ZXNSZXNvdXJjZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNUYXNrVXBkYXRlc1Jlc291cmNlIDxlbT5UYXNrIFVwZGF0ZXMgUmVzb3VyY2U8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlRhc2sgVXBkYXRlcyBSZXNvdXJjZTwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0VGFza1VwZGF0ZXNSZXNvdXJjZSgpCi0JICogQHNlZSAjaXNUYXNrVXBkYXRlc1Jlc291cmNlKCkKLQkgKiBAc2VlICNzZXRUYXNrVXBkYXRlc1Jlc291cmNlKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRUYXNrVXBkYXRlc1Jlc291cmNlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5GaXNjYWwgWWVhciBTdGFydDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogU3BlY2lmaWVzIHdoZXRoZXIgdG8gdXNlIGZpc2NhbCB5ZWFyIG51bWJlcmluZwotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5GaXNjYWwgWWVhciBTdGFydDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRGaXNjYWxZZWFyU3RhcnQoKQotCSAqIEBzZWUgI3Vuc2V0RmlzY2FsWWVhclN0YXJ0KCkKLQkgKiBAc2VlICNzZXRGaXNjYWxZZWFyU3RhcnQoYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRQcm9qZWN0X0Zpc2NhbFllYXJTdGFydCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbiIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nRmlzY2FsWWVhclN0YXJ0JyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc0Zpc2NhbFllYXJTdGFydCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzRmlzY2FsWWVhclN0YXJ0IDxlbT5GaXNjYWwgWWVhciBTdGFydDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RmlzY2FsIFllYXIgU3RhcnQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0RmlzY2FsWWVhclN0YXJ0KCkKLQkgKiBAc2VlICN1bnNldEZpc2NhbFllYXJTdGFydCgpCi0JICogQHNlZSAjaXNGaXNjYWxZZWFyU3RhcnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEZpc2NhbFllYXJTdGFydChib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzRmlzY2FsWWVhclN0YXJ0IDxlbT5GaXNjYWwgWWVhciBTdGFydDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRGaXNjYWxZZWFyU3RhcnQoKQotCSAqIEBzZWUgI2lzRmlzY2FsWWVhclN0YXJ0KCkKLQkgKiBAc2VlICNzZXRGaXNjYWxZZWFyU3RhcnQoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldEZpc2NhbFllYXJTdGFydCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNGaXNjYWxZZWFyU3RhcnQgPGVtPkZpc2NhbCBZZWFyIFN0YXJ0PC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5GaXNjYWwgWWVhciBTdGFydDwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0RmlzY2FsWWVhclN0YXJ0KCkKLQkgKiBAc2VlICNpc0Zpc2NhbFllYXJTdGFydCgpCi0JICogQHNlZSAjc2V0RmlzY2FsWWVhclN0YXJ0KGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRGaXNjYWxZZWFyU3RhcnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPldlZWsgU3RhcnQgRGF5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBTdGFydCBkYXkgb2YgdGhlIHdlZWsuIFZhbHVlcyBhcmU6IAotCSAqIAkJCQkJCTA9U3VuZGF5LCAxPU1vbmRheSwgMj1UdWVzZGF5LCAzPVdlZG5lc2RheSwgND1UaHVyc2RheSwgNT1GcmlkYXksIDY9U2F0dXJkYXkKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+V2VlayBTdGFydCBEYXk8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFdlZWtTdGFydERheShCaWdJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFByb2plY3RfV2Vla1N0YXJ0RGF5KCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV2Vla1N0YXJ0RGF5VHlwZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nV2Vla1N0YXJ0RGF5JyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnSW50ZWdlciBnZXRXZWVrU3RhcnREYXkoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRXZWVrU3RhcnREYXkgPGVtPldlZWsgU3RhcnQgRGF5PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5XZWVrIFN0YXJ0IERheTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0V2Vla1N0YXJ0RGF5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRXZWVrU3RhcnREYXkoQmlnSW50ZWdlciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Nb3ZlIENvbXBsZXRlZCBFbmRzIEJhY2s8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iZmFsc2UiPC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIAotCSAqIAkJCQkJCQlTcGVjaWZpZXMgd2hldGhlciB0aGUgZW5kIG9mIGNvbXBsZXRlZCBwb3J0aW9ucyBvZiB0YXNrcyBzY2hlZHVsZWQgdG8gYmVnaW4gYWZ0ZXIgdGhlIAotCSAqIAkJCQkJCQlzdGF0dXMgZGF0ZSBidXQgYmVndW4gZWFybHkgc2hvdWxkIGJlIG1vdmVkIGJhY2sgdG8gdGhlIHN0YXR1cyBkYXRlLgotCSAqIAkJCQkJCQotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Nb3ZlIENvbXBsZXRlZCBFbmRzIEJhY2s8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0TW92ZUNvbXBsZXRlZEVuZHNCYWNrKCkKLQkgKiBAc2VlICN1bnNldE1vdmVDb21wbGV0ZWRFbmRzQmFjaygpCi0JICogQHNlZSAjc2V0TW92ZUNvbXBsZXRlZEVuZHNCYWNrKGJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UHJvamVjdF9Nb3ZlQ29tcGxldGVkRW5kc0JhY2soKQotCSAqIEBtb2RlbCBkZWZhdWx0PSJmYWxzZSIgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdNb3ZlQ29tcGxldGVkRW5kc0JhY2snIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzTW92ZUNvbXBsZXRlZEVuZHNCYWNrKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNNb3ZlQ29tcGxldGVkRW5kc0JhY2sgPGVtPk1vdmUgQ29tcGxldGVkIEVuZHMgQmFjazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TW92ZSBDb21wbGV0ZWQgRW5kcyBCYWNrPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldE1vdmVDb21wbGV0ZWRFbmRzQmFjaygpCi0JICogQHNlZSAjdW5zZXRNb3ZlQ29tcGxldGVkRW5kc0JhY2soKQotCSAqIEBzZWUgI2lzTW92ZUNvbXBsZXRlZEVuZHNCYWNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRNb3ZlQ29tcGxldGVkRW5kc0JhY2soYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc01vdmVDb21wbGV0ZWRFbmRzQmFjayA8ZW0+TW92ZSBDb21wbGV0ZWQgRW5kcyBCYWNrPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldE1vdmVDb21wbGV0ZWRFbmRzQmFjaygpCi0JICogQHNlZSAjaXNNb3ZlQ29tcGxldGVkRW5kc0JhY2soKQotCSAqIEBzZWUgI3NldE1vdmVDb21wbGV0ZWRFbmRzQmFjayhib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0TW92ZUNvbXBsZXRlZEVuZHNCYWNrKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc01vdmVDb21wbGV0ZWRFbmRzQmFjayA8ZW0+TW92ZSBDb21wbGV0ZWQgRW5kcyBCYWNrPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Nb3ZlIENvbXBsZXRlZCBFbmRzIEJhY2s8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldE1vdmVDb21wbGV0ZWRFbmRzQmFjaygpCi0JICogQHNlZSAjaXNNb3ZlQ29tcGxldGVkRW5kc0JhY2soKQotCSAqIEBzZWUgI3NldE1vdmVDb21wbGV0ZWRFbmRzQmFjayhib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0TW92ZUNvbXBsZXRlZEVuZHNCYWNrKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Nb3ZlIFJlbWFpbmluZyBTdGFydHMgQmFjazwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiJmYWxzZSI8L2NvZGU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogCi0JICogCQkJCQkJCVNwZWNpZmllcyB3aGV0aGVyIHRoZSBiZWdpbm5pbmcgb2YgcmVtYWluaW5nIHBvcnRpb25zIG9mIHRhc2tzIHNjaGVkdWxlZCB0byBiZWdpbiBhZnRlciB0aGUgCi0JICogCQkJCQkJCXN0YXR1cyBkYXRlIGJ1dCBiZWd1biBlYXJseSBzaG91bGQgYmUgbW92ZWQgYmFjayB0byB0aGUgc3RhdHVzIGRhdGUuCi0JICogCQkJCQkJCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1vdmUgUmVtYWluaW5nIFN0YXJ0cyBCYWNrPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldE1vdmVSZW1haW5pbmdTdGFydHNCYWNrKCkKLQkgKiBAc2VlICN1bnNldE1vdmVSZW1haW5pbmdTdGFydHNCYWNrKCkKLQkgKiBAc2VlICNzZXRNb3ZlUmVtYWluaW5nU3RhcnRzQmFjayhib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFByb2plY3RfTW92ZVJlbWFpbmluZ1N0YXJ0c0JhY2soKQotCSAqIEBtb2RlbCBkZWZhdWx0PSJmYWxzZSIgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdNb3ZlUmVtYWluaW5nU3RhcnRzQmFjaycgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNNb3ZlUmVtYWluaW5nU3RhcnRzQmFjaygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzTW92ZVJlbWFpbmluZ1N0YXJ0c0JhY2sgPGVtPk1vdmUgUmVtYWluaW5nIFN0YXJ0cyBCYWNrPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Nb3ZlIFJlbWFpbmluZyBTdGFydHMgQmFjazwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRNb3ZlUmVtYWluaW5nU3RhcnRzQmFjaygpCi0JICogQHNlZSAjdW5zZXRNb3ZlUmVtYWluaW5nU3RhcnRzQmFjaygpCi0JICogQHNlZSAjaXNNb3ZlUmVtYWluaW5nU3RhcnRzQmFjaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TW92ZVJlbWFpbmluZ1N0YXJ0c0JhY2soYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc01vdmVSZW1haW5pbmdTdGFydHNCYWNrIDxlbT5Nb3ZlIFJlbWFpbmluZyBTdGFydHMgQmFjazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRNb3ZlUmVtYWluaW5nU3RhcnRzQmFjaygpCi0JICogQHNlZSAjaXNNb3ZlUmVtYWluaW5nU3RhcnRzQmFjaygpCi0JICogQHNlZSAjc2V0TW92ZVJlbWFpbmluZ1N0YXJ0c0JhY2soYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldE1vdmVSZW1haW5pbmdTdGFydHNCYWNrKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc01vdmVSZW1haW5pbmdTdGFydHNCYWNrIDxlbT5Nb3ZlIFJlbWFpbmluZyBTdGFydHMgQmFjazwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TW92ZSBSZW1haW5pbmcgU3RhcnRzIEJhY2s8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldE1vdmVSZW1haW5pbmdTdGFydHNCYWNrKCkKLQkgKiBAc2VlICNpc01vdmVSZW1haW5pbmdTdGFydHNCYWNrKCkKLQkgKiBAc2VlICNzZXRNb3ZlUmVtYWluaW5nU3RhcnRzQmFjayhib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0TW92ZVJlbWFpbmluZ1N0YXJ0c0JhY2soKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1vdmUgUmVtYWluaW5nIFN0YXJ0cyBGb3J3YXJkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+ImZhbHNlIjwvY29kZT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiAKLQkgKiAJCQkJCQkJU3BlY2lmaWVzIHdoZXRoZXIgdGhlIGJlZ2lubmluZyBvZiByZW1haW5pbmcgcG9ydGlvbnMgb2YgdGFza3Mgc2NoZWR1bGVkIHRvIGhhdmUgYmVndW4gbGF0ZSAKLQkgKiAJCQkJCQkJc2hvdWxkIGJlIG1vdmVkIHVwIHRvIHRoZSBzdGF0dXMgZGF0ZS4KLQkgKiAJCQkJCQkKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TW92ZSBSZW1haW5pbmcgU3RhcnRzIEZvcndhcmQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0TW92ZVJlbWFpbmluZ1N0YXJ0c0ZvcndhcmQoKQotCSAqIEBzZWUgI3Vuc2V0TW92ZVJlbWFpbmluZ1N0YXJ0c0ZvcndhcmQoKQotCSAqIEBzZWUgI3NldE1vdmVSZW1haW5pbmdTdGFydHNGb3J3YXJkKGJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UHJvamVjdF9Nb3ZlUmVtYWluaW5nU3RhcnRzRm9yd2FyZCgpCi0JICogQG1vZGVsIGRlZmF1bHQ9ImZhbHNlIiB1bmlxdWU9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW4iCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J01vdmVSZW1haW5pbmdTdGFydHNGb3J3YXJkJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc01vdmVSZW1haW5pbmdTdGFydHNGb3J3YXJkKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNNb3ZlUmVtYWluaW5nU3RhcnRzRm9yd2FyZCA8ZW0+TW92ZSBSZW1haW5pbmcgU3RhcnRzIEZvcndhcmQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk1vdmUgUmVtYWluaW5nIFN0YXJ0cyBGb3J3YXJkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldE1vdmVSZW1haW5pbmdTdGFydHNGb3J3YXJkKCkKLQkgKiBAc2VlICN1bnNldE1vdmVSZW1haW5pbmdTdGFydHNGb3J3YXJkKCkKLQkgKiBAc2VlICNpc01vdmVSZW1haW5pbmdTdGFydHNGb3J3YXJkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRNb3ZlUmVtYWluaW5nU3RhcnRzRm9yd2FyZChib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzTW92ZVJlbWFpbmluZ1N0YXJ0c0ZvcndhcmQgPGVtPk1vdmUgUmVtYWluaW5nIFN0YXJ0cyBGb3J3YXJkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldE1vdmVSZW1haW5pbmdTdGFydHNGb3J3YXJkKCkKLQkgKiBAc2VlICNpc01vdmVSZW1haW5pbmdTdGFydHNGb3J3YXJkKCkKLQkgKiBAc2VlICNzZXRNb3ZlUmVtYWluaW5nU3RhcnRzRm9yd2FyZChib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0TW92ZVJlbWFpbmluZ1N0YXJ0c0ZvcndhcmQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzTW92ZVJlbWFpbmluZ1N0YXJ0c0ZvcndhcmQgPGVtPk1vdmUgUmVtYWluaW5nIFN0YXJ0cyBGb3J3YXJkPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Nb3ZlIFJlbWFpbmluZyBTdGFydHMgRm9yd2FyZDwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0TW92ZVJlbWFpbmluZ1N0YXJ0c0ZvcndhcmQoKQotCSAqIEBzZWUgI2lzTW92ZVJlbWFpbmluZ1N0YXJ0c0ZvcndhcmQoKQotCSAqIEBzZWUgI3NldE1vdmVSZW1haW5pbmdTdGFydHNGb3J3YXJkKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRNb3ZlUmVtYWluaW5nU3RhcnRzRm9yd2FyZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TW92ZSBDb21wbGV0ZWQgRW5kcyBGb3J3YXJkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+ImZhbHNlIjwvY29kZT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiAKLQkgKiAJCQkJCQkJU3BlY2lmaWVzIHdoZXRoZXIgdGhlIGVuZCBvZiBjb21wbGV0ZWQgcG9ydGlvbnMgb2YgdGFza3Mgc2NoZWR1bGVkIHRvIGhhdmUgYmVlbiBjb21wbGV0ZWQgCi0JICogCQkJCQkJCWJlZm9yZSB0aGUgc3RhdHVzIGRhdGUgYnV0IGJlZ3VuIGxhdGUgc2hvdWxkIGJlIG1vdmVkIHVwIHRvIHRoZSBzdGF0dXMgZGF0ZS4KLQkgKiAJCQkJCQkKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TW92ZSBDb21wbGV0ZWQgRW5kcyBGb3J3YXJkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldE1vdmVDb21wbGV0ZWRFbmRzRm9yd2FyZCgpCi0JICogQHNlZSAjdW5zZXRNb3ZlQ29tcGxldGVkRW5kc0ZvcndhcmQoKQotCSAqIEBzZWUgI3NldE1vdmVDb21wbGV0ZWRFbmRzRm9yd2FyZChib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFByb2plY3RfTW92ZUNvbXBsZXRlZEVuZHNGb3J3YXJkKCkKLQkgKiBAbW9kZWwgZGVmYXVsdD0iZmFsc2UiIHVuaXF1ZT0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbiIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nTW92ZUNvbXBsZXRlZEVuZHNGb3J3YXJkJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc01vdmVDb21wbGV0ZWRFbmRzRm9yd2FyZCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzTW92ZUNvbXBsZXRlZEVuZHNGb3J3YXJkIDxlbT5Nb3ZlIENvbXBsZXRlZCBFbmRzIEZvcndhcmQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk1vdmUgQ29tcGxldGVkIEVuZHMgRm9yd2FyZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRNb3ZlQ29tcGxldGVkRW5kc0ZvcndhcmQoKQotCSAqIEBzZWUgI3Vuc2V0TW92ZUNvbXBsZXRlZEVuZHNGb3J3YXJkKCkKLQkgKiBAc2VlICNpc01vdmVDb21wbGV0ZWRFbmRzRm9yd2FyZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TW92ZUNvbXBsZXRlZEVuZHNGb3J3YXJkKGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNNb3ZlQ29tcGxldGVkRW5kc0ZvcndhcmQgPGVtPk1vdmUgQ29tcGxldGVkIEVuZHMgRm9yd2FyZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRNb3ZlQ29tcGxldGVkRW5kc0ZvcndhcmQoKQotCSAqIEBzZWUgI2lzTW92ZUNvbXBsZXRlZEVuZHNGb3J3YXJkKCkKLQkgKiBAc2VlICNzZXRNb3ZlQ29tcGxldGVkRW5kc0ZvcndhcmQoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldE1vdmVDb21wbGV0ZWRFbmRzRm9yd2FyZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNNb3ZlQ29tcGxldGVkRW5kc0ZvcndhcmQgPGVtPk1vdmUgQ29tcGxldGVkIEVuZHMgRm9yd2FyZDwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TW92ZSBDb21wbGV0ZWQgRW5kcyBGb3J3YXJkPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRNb3ZlQ29tcGxldGVkRW5kc0ZvcndhcmQoKQotCSAqIEBzZWUgI2lzTW92ZUNvbXBsZXRlZEVuZHNGb3J3YXJkKCkKLQkgKiBAc2VlICNzZXRNb3ZlQ29tcGxldGVkRW5kc0ZvcndhcmQoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldE1vdmVDb21wbGV0ZWRFbmRzRm9yd2FyZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QmFzZWxpbmUgRm9yIEVhcm5lZCBWYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHNwZWNpZmljIGJhc2VsaW5lIHVzZWQgdG8gY2FsY3VsYXRlIFZhcmlhbmNlIHZhbHVlcy4gIFZhbHVlcyBhcmU6IAotCSAqIAkJCQkJCTA9QmFzZWxpbmUsIDE9QmFzZWxpbmUgMSwgMj1CYXNlbGluZSAyLCAzPUJhc2VsaW5lIDMsIDQ9QmFzZWxpbmUgNCwgNT1CYXNlbGluZSA1LCA2PUJhc2VsaW5lIDYsIAotCSAqIAkJCQkJCTc9QmFzZWxpbmUgNywgOD1CYXNlbGluZSA4LCA5PUJhc2VsaW5lIDksIDEwPUJhc2VsaW5lIDEwCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkJhc2VsaW5lIEZvciBFYXJuZWQgVmFsdWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEJhc2VsaW5lRm9yRWFybmVkVmFsdWUoQmlnSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRQcm9qZWN0X0Jhc2VsaW5lRm9yRWFybmVkVmFsdWUoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZUZvckVhcm5lZFZhbHVlVHlwZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQmFzZWxpbmVGb3JFYXJuZWRWYWx1ZScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0ludGVnZXIgZ2V0QmFzZWxpbmVGb3JFYXJuZWRWYWx1ZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldEJhc2VsaW5lRm9yRWFybmVkVmFsdWUgPGVtPkJhc2VsaW5lIEZvciBFYXJuZWQgVmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkJhc2VsaW5lIEZvciBFYXJuZWQgVmFsdWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEJhc2VsaW5lRm9yRWFybmVkVmFsdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEJhc2VsaW5lRm9yRWFybmVkVmFsdWUoQmlnSW50ZWdlciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BdXRvIEFkZCBOZXcgUmVzb3VyY2VzIEFuZCBUYXNrczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiJ0cnVlIjwvY29kZT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBXaGV0aGVyIHRvIGF1dG9tYXRpY2FsbHkgYWRkIG5ldyByZXNvdXJjZXMgdG8gdGhlIHJlc291cmNlIHBvb2wuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkF1dG8gQWRkIE5ldyBSZXNvdXJjZXMgQW5kIFRhc2tzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldEF1dG9BZGROZXdSZXNvdXJjZXNBbmRUYXNrcygpCi0JICogQHNlZSAjdW5zZXRBdXRvQWRkTmV3UmVzb3VyY2VzQW5kVGFza3MoKQotCSAqIEBzZWUgI3NldEF1dG9BZGROZXdSZXNvdXJjZXNBbmRUYXNrcyhib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFByb2plY3RfQXV0b0FkZE5ld1Jlc291cmNlc0FuZFRhc2tzKCkKLQkgKiBAbW9kZWwgZGVmYXVsdD0idHJ1ZSIgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdBdXRvQWRkTmV3UmVzb3VyY2VzQW5kVGFza3MnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzQXV0b0FkZE5ld1Jlc291cmNlc0FuZFRhc2tzKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNBdXRvQWRkTmV3UmVzb3VyY2VzQW5kVGFza3MgPGVtPkF1dG8gQWRkIE5ldyBSZXNvdXJjZXMgQW5kIFRhc2tzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BdXRvIEFkZCBOZXcgUmVzb3VyY2VzIEFuZCBUYXNrczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRBdXRvQWRkTmV3UmVzb3VyY2VzQW5kVGFza3MoKQotCSAqIEBzZWUgI3Vuc2V0QXV0b0FkZE5ld1Jlc291cmNlc0FuZFRhc2tzKCkKLQkgKiBAc2VlICNpc0F1dG9BZGROZXdSZXNvdXJjZXNBbmRUYXNrcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0QXV0b0FkZE5ld1Jlc291cmNlc0FuZFRhc2tzKGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNBdXRvQWRkTmV3UmVzb3VyY2VzQW5kVGFza3MgPGVtPkF1dG8gQWRkIE5ldyBSZXNvdXJjZXMgQW5kIFRhc2tzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldEF1dG9BZGROZXdSZXNvdXJjZXNBbmRUYXNrcygpCi0JICogQHNlZSAjaXNBdXRvQWRkTmV3UmVzb3VyY2VzQW5kVGFza3MoKQotCSAqIEBzZWUgI3NldEF1dG9BZGROZXdSZXNvdXJjZXNBbmRUYXNrcyhib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0QXV0b0FkZE5ld1Jlc291cmNlc0FuZFRhc2tzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc0F1dG9BZGROZXdSZXNvdXJjZXNBbmRUYXNrcyA8ZW0+QXV0byBBZGQgTmV3IFJlc291cmNlcyBBbmQgVGFza3M8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkF1dG8gQWRkIE5ldyBSZXNvdXJjZXMgQW5kIFRhc2tzPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRBdXRvQWRkTmV3UmVzb3VyY2VzQW5kVGFza3MoKQotCSAqIEBzZWUgI2lzQXV0b0FkZE5ld1Jlc291cmNlc0FuZFRhc2tzKCkKLQkgKiBAc2VlICNzZXRBdXRvQWRkTmV3UmVzb3VyY2VzQW5kVGFza3MoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldEF1dG9BZGROZXdSZXNvdXJjZXNBbmRUYXNrcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U3RhdHVzIERhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIERhdGUgdXNlZCBmb3IgY2FsY3VsYXRpb24gYW5kIHJlcG9ydGluZy4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U3RhdHVzIERhdGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFN0YXR1c0RhdGUoT2JqZWN0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFByb2plY3RfU3RhdHVzRGF0ZSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRGF0ZVRpbWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1N0YXR1c0RhdGUnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlPYmplY3QgZ2V0U3RhdHVzRGF0ZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldFN0YXR1c0RhdGUgPGVtPlN0YXR1cyBEYXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TdGF0dXMgRGF0ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0U3RhdHVzRGF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0U3RhdHVzRGF0ZShPYmplY3QgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q3VycmVudCBEYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgc3lzdGVtIGRhdGUgdGhhdCB0aGUgWE1MIHdhcyBnZW5lcmF0ZWQuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkN1cnJlbnQgRGF0ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0Q3VycmVudERhdGUoT2JqZWN0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFByb2plY3RfQ3VycmVudERhdGUoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkRhdGVUaW1lIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdDdXJyZW50RGF0ZScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU9iamVjdCBnZXRDdXJyZW50RGF0ZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldEN1cnJlbnREYXRlIDxlbT5DdXJyZW50IERhdGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkN1cnJlbnQgRGF0ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0Q3VycmVudERhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEN1cnJlbnREYXRlKE9iamVjdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5NaWNyb3NvZnQgUHJvamVjdCBTZXJ2ZXIgVVJMPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBXaGV0aGVyIHRoZSBwcm9qZWN0IHdhcyBjcmVhdGVkIGJ5IGEgUHJvamVjdCBTZXJ2ZXIgdXNlciBhcyBvcHBvc2VkIHRvIGFuIE5UIHVzZXIuCi0JICogCQkJCQkJCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1pY3Jvc29mdCBQcm9qZWN0IFNlcnZlciBVUkw8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0TWljcm9zb2Z0UHJvamVjdFNlcnZlclVSTCgpCi0JICogQHNlZSAjdW5zZXRNaWNyb3NvZnRQcm9qZWN0U2VydmVyVVJMKCkKLQkgKiBAc2VlICNzZXRNaWNyb3NvZnRQcm9qZWN0U2VydmVyVVJMKGJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UHJvamVjdF9NaWNyb3NvZnRQcm9qZWN0U2VydmVyVVJMKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdNaWNyb3NvZnRQcm9qZWN0U2VydmVyVVJMJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc01pY3Jvc29mdFByb2plY3RTZXJ2ZXJVUkwoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc01pY3Jvc29mdFByb2plY3RTZXJ2ZXJVUkwgPGVtPk1pY3Jvc29mdCBQcm9qZWN0IFNlcnZlciBVUkw8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk1pY3Jvc29mdCBQcm9qZWN0IFNlcnZlciBVUkw8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0TWljcm9zb2Z0UHJvamVjdFNlcnZlclVSTCgpCi0JICogQHNlZSAjdW5zZXRNaWNyb3NvZnRQcm9qZWN0U2VydmVyVVJMKCkKLQkgKiBAc2VlICNpc01pY3Jvc29mdFByb2plY3RTZXJ2ZXJVUkwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldE1pY3Jvc29mdFByb2plY3RTZXJ2ZXJVUkwoYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc01pY3Jvc29mdFByb2plY3RTZXJ2ZXJVUkwgPGVtPk1pY3Jvc29mdCBQcm9qZWN0IFNlcnZlciBVUkw8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0TWljcm9zb2Z0UHJvamVjdFNlcnZlclVSTCgpCi0JICogQHNlZSAjaXNNaWNyb3NvZnRQcm9qZWN0U2VydmVyVVJMKCkKLQkgKiBAc2VlICNzZXRNaWNyb3NvZnRQcm9qZWN0U2VydmVyVVJMKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRNaWNyb3NvZnRQcm9qZWN0U2VydmVyVVJMKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc01pY3Jvc29mdFByb2plY3RTZXJ2ZXJVUkwgPGVtPk1pY3Jvc29mdCBQcm9qZWN0IFNlcnZlciBVUkw8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1pY3Jvc29mdCBQcm9qZWN0IFNlcnZlciBVUkw8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldE1pY3Jvc29mdFByb2plY3RTZXJ2ZXJVUkwoKQotCSAqIEBzZWUgI2lzTWljcm9zb2Z0UHJvamVjdFNlcnZlclVSTCgpCi0JICogQHNlZSAjc2V0TWljcm9zb2Z0UHJvamVjdFNlcnZlclVSTChib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0TWljcm9zb2Z0UHJvamVjdFNlcnZlclVSTCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QXV0b2xpbms8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFdoZXRoZXIgdG8gYXV0b2xpbmsgaW5zZXJ0ZWQgb3IgbW92ZWQgdGFza3MuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkF1dG9saW5rPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldEF1dG9saW5rKCkKLQkgKiBAc2VlICN1bnNldEF1dG9saW5rKCkKLQkgKiBAc2VlICNzZXRBdXRvbGluayhib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFByb2plY3RfQXV0b2xpbmsoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW4iCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0F1dG9saW5rJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc0F1dG9saW5rKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNBdXRvbGluayA8ZW0+QXV0b2xpbms8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkF1dG9saW5rPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldEF1dG9saW5rKCkKLQkgKiBAc2VlICN1bnNldEF1dG9saW5rKCkKLQkgKiBAc2VlICNpc0F1dG9saW5rKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRBdXRvbGluayhib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzQXV0b2xpbmsgPGVtPkF1dG9saW5rPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldEF1dG9saW5rKCkKLQkgKiBAc2VlICNpc0F1dG9saW5rKCkKLQkgKiBAc2VlICNzZXRBdXRvbGluayhib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0QXV0b2xpbmsoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzQXV0b2xpbmsgPGVtPkF1dG9saW5rPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BdXRvbGluazwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0QXV0b2xpbmsoKQotCSAqIEBzZWUgI2lzQXV0b2xpbmsoKQotCSAqIEBzZWUgI3NldEF1dG9saW5rKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRBdXRvbGluaygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TmV3IFRhc2sgU3RhcnQgRGF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGRlZmF1bHQgZGF0ZSBmb3IgbmV3IHRhc2tzIHN0YXJ0LiAgVmFsdWVzIGFyZTogCi0JICogCQkJCQkJMD1Qcm9qZWN0IFN0YXJ0IERhdGUsIDE9Q3VycmVudCBEYXRlCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk5ldyBUYXNrIFN0YXJ0IERhdGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldE5ld1Rhc2tTdGFydERhdGUoQmlnSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRQcm9qZWN0X05ld1Rhc2tTdGFydERhdGUoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5OZXdUYXNrU3RhcnREYXRlVHlwZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nTmV3VGFza1N0YXJ0RGF0ZScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0ludGVnZXIgZ2V0TmV3VGFza1N0YXJ0RGF0ZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldE5ld1Rhc2tTdGFydERhdGUgPGVtPk5ldyBUYXNrIFN0YXJ0IERhdGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk5ldyBUYXNrIFN0YXJ0IERhdGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldE5ld1Rhc2tTdGFydERhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldE5ld1Rhc2tTdGFydERhdGUoQmlnSW50ZWdlciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EZWZhdWx0IFRhc2sgRVYgTWV0aG9kPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgZGVmYXVsdCBlYXJuZWQgdmFsdWUgbWV0aG9kIGZvciB0YXNrcy4gIFZhbHVlcyBhcmU6IAotCSAqIAkJCQkJCTA9UGVyY2VudCBDb21wbGV0ZSwgMT1QaHlzaWNhbCBQZXJjZW50IENvbXBsZXRlCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRlZmF1bHQgVGFzayBFViBNZXRob2Q8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldERlZmF1bHRUYXNrRVZNZXRob2QoQmlnSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRQcm9qZWN0X0RlZmF1bHRUYXNrRVZNZXRob2QoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5EZWZhdWx0VGFza0VWTWV0aG9kVHlwZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nRGVmYXVsdFRhc2tFVk1ldGhvZCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0ludGVnZXIgZ2V0RGVmYXVsdFRhc2tFVk1ldGhvZCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldERlZmF1bHRUYXNrRVZNZXRob2QgPGVtPkRlZmF1bHQgVGFzayBFViBNZXRob2Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkRlZmF1bHQgVGFzayBFViBNZXRob2Q8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldERlZmF1bHRUYXNrRVZNZXRob2QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldERlZmF1bHRUYXNrRVZNZXRob2QoQmlnSW50ZWdlciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Qcm9qZWN0IEV4dGVybmFsbHkgRWRpdGVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBXaGV0aGVyIHRoZSBwcm9qZWN0IFhNTCB3YXMgZWRpdGVkLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Qcm9qZWN0IEV4dGVybmFsbHkgRWRpdGVkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldFByb2plY3RFeHRlcm5hbGx5RWRpdGVkKCkKLQkgKiBAc2VlICN1bnNldFByb2plY3RFeHRlcm5hbGx5RWRpdGVkKCkKLQkgKiBAc2VlICNzZXRQcm9qZWN0RXh0ZXJuYWxseUVkaXRlZChib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFByb2plY3RfUHJvamVjdEV4dGVybmFsbHlFZGl0ZWQoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW4iCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1Byb2plY3RFeHRlcm5hbGx5RWRpdGVkJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1Byb2plY3RFeHRlcm5hbGx5RWRpdGVkKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNQcm9qZWN0RXh0ZXJuYWxseUVkaXRlZCA8ZW0+UHJvamVjdCBFeHRlcm5hbGx5IEVkaXRlZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UHJvamVjdCBFeHRlcm5hbGx5IEVkaXRlZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRQcm9qZWN0RXh0ZXJuYWxseUVkaXRlZCgpCi0JICogQHNlZSAjdW5zZXRQcm9qZWN0RXh0ZXJuYWxseUVkaXRlZCgpCi0JICogQHNlZSAjaXNQcm9qZWN0RXh0ZXJuYWxseUVkaXRlZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UHJvamVjdEV4dGVybmFsbHlFZGl0ZWQoYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc1Byb2plY3RFeHRlcm5hbGx5RWRpdGVkIDxlbT5Qcm9qZWN0IEV4dGVybmFsbHkgRWRpdGVkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldFByb2plY3RFeHRlcm5hbGx5RWRpdGVkKCkKLQkgKiBAc2VlICNpc1Byb2plY3RFeHRlcm5hbGx5RWRpdGVkKCkKLQkgKiBAc2VlICNzZXRQcm9qZWN0RXh0ZXJuYWxseUVkaXRlZChib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0UHJvamVjdEV4dGVybmFsbHlFZGl0ZWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzUHJvamVjdEV4dGVybmFsbHlFZGl0ZWQgPGVtPlByb2plY3QgRXh0ZXJuYWxseSBFZGl0ZWQ8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlByb2plY3QgRXh0ZXJuYWxseSBFZGl0ZWQ8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldFByb2plY3RFeHRlcm5hbGx5RWRpdGVkKCkKLQkgKiBAc2VlICNpc1Byb2plY3RFeHRlcm5hbGx5RWRpdGVkKCkKLQkgKiBAc2VlICNzZXRQcm9qZWN0RXh0ZXJuYWxseUVkaXRlZChib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0UHJvamVjdEV4dGVybmFsbHlFZGl0ZWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkV4dGVuZGVkIENyZWF0aW9uIERhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIERhdGUgdXNlZCBmb3IgY2FsY3VsYXRpb24gYW5kIHJlcG9ydGluZy4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RXh0ZW5kZWQgQ3JlYXRpb24gRGF0ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0RXh0ZW5kZWRDcmVhdGlvbkRhdGUoT2JqZWN0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFByb2plY3RfRXh0ZW5kZWRDcmVhdGlvbkRhdGUoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkRhdGVUaW1lIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdFeHRlbmRlZENyZWF0aW9uRGF0ZScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU9iamVjdCBnZXRFeHRlbmRlZENyZWF0aW9uRGF0ZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldEV4dGVuZGVkQ3JlYXRpb25EYXRlIDxlbT5FeHRlbmRlZCBDcmVhdGlvbiBEYXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5FeHRlbmRlZCBDcmVhdGlvbiBEYXRlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRFeHRlbmRlZENyZWF0aW9uRGF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RXh0ZW5kZWRDcmVhdGlvbkRhdGUoT2JqZWN0IHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkFjdHVhbHMgSW4gU3luYzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogV2hldGhlciBhbGwgYWN0dWFsIHdvcmsgaGFzIGJlZW4gc3luY2hyb25pemVkIHdpdGggdGhlIHByb2plY3QuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkFjdHVhbHMgSW4gU3luYzwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRBY3R1YWxzSW5TeW5jKCkKLQkgKiBAc2VlICN1bnNldEFjdHVhbHNJblN5bmMoKQotCSAqIEBzZWUgI3NldEFjdHVhbHNJblN5bmMoYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRQcm9qZWN0X0FjdHVhbHNJblN5bmMoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW4iCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0FjdHVhbHNJblN5bmMnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzQWN0dWFsc0luU3luYygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzQWN0dWFsc0luU3luYyA8ZW0+QWN0dWFscyBJbiBTeW5jPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BY3R1YWxzIEluIFN5bmM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0QWN0dWFsc0luU3luYygpCi0JICogQHNlZSAjdW5zZXRBY3R1YWxzSW5TeW5jKCkKLQkgKiBAc2VlICNpc0FjdHVhbHNJblN5bmMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEFjdHVhbHNJblN5bmMoYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc0FjdHVhbHNJblN5bmMgPGVtPkFjdHVhbHMgSW4gU3luYzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRBY3R1YWxzSW5TeW5jKCkKLQkgKiBAc2VlICNpc0FjdHVhbHNJblN5bmMoKQotCSAqIEBzZWUgI3NldEFjdHVhbHNJblN5bmMoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldEFjdHVhbHNJblN5bmMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzQWN0dWFsc0luU3luYyA8ZW0+QWN0dWFscyBJbiBTeW5jPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BY3R1YWxzIEluIFN5bmM8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldEFjdHVhbHNJblN5bmMoKQotCSAqIEBzZWUgI2lzQWN0dWFsc0luU3luYygpCi0JICogQHNlZSAjc2V0QWN0dWFsc0luU3luYyhib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0QWN0dWFsc0luU3luYygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmVtb3ZlIEZpbGUgUHJvcGVydGllczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogV2hldGhlciB0byByZW1vdmUgYWxsIGZpbGUgcHJvcGVydGllcyBvbiBzYXZlLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZW1vdmUgRmlsZSBQcm9wZXJ0aWVzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldFJlbW92ZUZpbGVQcm9wZXJ0aWVzKCkKLQkgKiBAc2VlICN1bnNldFJlbW92ZUZpbGVQcm9wZXJ0aWVzKCkKLQkgKiBAc2VlICNzZXRSZW1vdmVGaWxlUHJvcGVydGllcyhib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFByb2plY3RfUmVtb3ZlRmlsZVByb3BlcnRpZXMoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW4iCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1JlbW92ZUZpbGVQcm9wZXJ0aWVzJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1JlbW92ZUZpbGVQcm9wZXJ0aWVzKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNSZW1vdmVGaWxlUHJvcGVydGllcyA8ZW0+UmVtb3ZlIEZpbGUgUHJvcGVydGllczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UmVtb3ZlIEZpbGUgUHJvcGVydGllczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRSZW1vdmVGaWxlUHJvcGVydGllcygpCi0JICogQHNlZSAjdW5zZXRSZW1vdmVGaWxlUHJvcGVydGllcygpCi0JICogQHNlZSAjaXNSZW1vdmVGaWxlUHJvcGVydGllcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UmVtb3ZlRmlsZVByb3BlcnRpZXMoYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc1JlbW92ZUZpbGVQcm9wZXJ0aWVzIDxlbT5SZW1vdmUgRmlsZSBQcm9wZXJ0aWVzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldFJlbW92ZUZpbGVQcm9wZXJ0aWVzKCkKLQkgKiBAc2VlICNpc1JlbW92ZUZpbGVQcm9wZXJ0aWVzKCkKLQkgKiBAc2VlICNzZXRSZW1vdmVGaWxlUHJvcGVydGllcyhib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0UmVtb3ZlRmlsZVByb3BlcnRpZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzUmVtb3ZlRmlsZVByb3BlcnRpZXMgPGVtPlJlbW92ZSBGaWxlIFByb3BlcnRpZXM8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJlbW92ZSBGaWxlIFByb3BlcnRpZXM8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldFJlbW92ZUZpbGVQcm9wZXJ0aWVzKCkKLQkgKiBAc2VlICNpc1JlbW92ZUZpbGVQcm9wZXJ0aWVzKCkKLQkgKiBAc2VlICNzZXRSZW1vdmVGaWxlUHJvcGVydGllcyhib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0UmVtb3ZlRmlsZVByb3BlcnRpZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkFkbWluIFByb2plY3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFdoZXRoZXIgdGhlIHByb2plY3QgaXMgYW4gYWRtaW5pc3RyYXRpdmUgcHJvamVjdC4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QWRtaW4gUHJvamVjdDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRBZG1pblByb2plY3QoKQotCSAqIEBzZWUgI3Vuc2V0QWRtaW5Qcm9qZWN0KCkKLQkgKiBAc2VlICNzZXRBZG1pblByb2plY3QoYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRQcm9qZWN0X0FkbWluUHJvamVjdCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbiIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQWRtaW5Qcm9qZWN0JyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc0FkbWluUHJvamVjdCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzQWRtaW5Qcm9qZWN0IDxlbT5BZG1pbiBQcm9qZWN0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BZG1pbiBQcm9qZWN0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldEFkbWluUHJvamVjdCgpCi0JICogQHNlZSAjdW5zZXRBZG1pblByb2plY3QoKQotCSAqIEBzZWUgI2lzQWRtaW5Qcm9qZWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRBZG1pblByb2plY3QoYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc0FkbWluUHJvamVjdCA8ZW0+QWRtaW4gUHJvamVjdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRBZG1pblByb2plY3QoKQotCSAqIEBzZWUgI2lzQWRtaW5Qcm9qZWN0KCkKLQkgKiBAc2VlICNzZXRBZG1pblByb2plY3QoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldEFkbWluUHJvamVjdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNBZG1pblByb2plY3QgPGVtPkFkbWluIFByb2plY3Q8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkFkbWluIFByb2plY3Q8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldEFkbWluUHJvamVjdCgpCi0JICogQHNlZSAjaXNBZG1pblByb2plY3QoKQotCSAqIEBzZWUgI3NldEFkbWluUHJvamVjdChib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0QWRtaW5Qcm9qZWN0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5PdXRsaW5lIENvZGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgY29sbGVjdGlvbiBvZiBvdXRsaW5lIGNvZGUgZGVmaW5pdGlvbnMgYXNzb2NpYXRlZCB3aXRoIHRoZSBwcm9qZWN0LiAgVGhlc2UgY29kZXMgbWF5IGJlIGFzc29jaWF0ZWQgb25seSB3aXRoIHRoaXMgcHJvamVjdCwgb3IgbWF5IGJlIGNvbW1vbiBhbW9uZyBzZXZlcmFsIHByb2plY3RzIChlbnRlcnByaXNlIGNvZGVzKS4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+T3V0bGluZSBDb2RlczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0T3V0bGluZUNvZGVzKE91dGxpbmVDb2RlcykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRQcm9qZWN0X091dGxpbmVDb2RlcygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J091dGxpbmVDb2RlcycgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU91dGxpbmVDb2RlcyBnZXRPdXRsaW5lQ29kZXMoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRPdXRsaW5lQ29kZXMgPGVtPk91dGxpbmUgQ29kZXM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk91dGxpbmUgQ29kZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldE91dGxpbmVDb2RlcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0T3V0bGluZUNvZGVzKE91dGxpbmVDb2RlcyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5XQlMgTWFza3M8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSB0YWJsZSBvZiBlbnRyaWVzIHRoYXQgZGVmaW5lIHRoZSBvdXRsaW5lIGNvZGUgbWFzay4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+V0JTIE1hc2tzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRXQlNNYXNrcyhXQlNNYXNrcykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRQcm9qZWN0X1dCU01hc2tzKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nV0JTTWFza3MnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlXQlNNYXNrcyBnZXRXQlNNYXNrcygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldFdCU01hc2tzIDxlbT5XQlMgTWFza3M8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPldCUyBNYXNrczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0V0JTTWFza3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFdCU01hc2tzKFdCU01hc2tzIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkV4dGVuZGVkIEF0dHJpYnV0ZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBjb2xsZWN0aW9uIG9mIGV4dGVuZGVkIGF0dHJpYnV0ZSAoY3VzdG9tIGZpZWxkKSBkZWZpbml0aW9ucyAKLQkgKiAgICAgICAgIGFzc29jaWF0ZWQgd2l0aCB0aGUgcHJvamVjdC4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RXh0ZW5kZWQgQXR0cmlidXRlczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0RXh0ZW5kZWRBdHRyaWJ1dGVzKEV4dGVuZGVkQXR0cmlidXRlcykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRQcm9qZWN0X0V4dGVuZGVkQXR0cmlidXRlcygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0V4dGVuZGVkQXR0cmlidXRlcycgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUV4dGVuZGVkQXR0cmlidXRlcyBnZXRFeHRlbmRlZEF0dHJpYnV0ZXMoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRFeHRlbmRlZEF0dHJpYnV0ZXMgPGVtPkV4dGVuZGVkIEF0dHJpYnV0ZXM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkV4dGVuZGVkIEF0dHJpYnV0ZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldEV4dGVuZGVkQXR0cmlidXRlcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RXh0ZW5kZWRBdHRyaWJ1dGVzKEV4dGVuZGVkQXR0cmlidXRlcyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5DYWxlbmRhcnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBjb2xsZWN0aW9uIG9mIGNhbGVuZGFycyB0aGF0IGlzIGFzc29jaWF0ZWQgd2l0aCB0aGUgCi0JICogICAgICAgICBwcm9qZWN0LgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5DYWxlbmRhcnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldENhbGVuZGFycyhDYWxlbmRhcnMpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UHJvamVjdF9DYWxlbmRhcnMoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdDYWxlbmRhcnMnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlDYWxlbmRhcnMgZ2V0Q2FsZW5kYXJzKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0Q2FsZW5kYXJzIDxlbT5DYWxlbmRhcnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNhbGVuZGFyczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0Q2FsZW5kYXJzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRDYWxlbmRhcnMoQ2FsZW5kYXJzIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlRhc2tzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgY29sbGVjdGlvbiBvZiB0YXNrcyB0aGF0IG1ha2UgdXAgdGhlIHByb2plY3QuCi0JICogICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VGFza3M8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFRhc2tzKFRhc2tzKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFByb2plY3RfVGFza3MoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdUYXNrcycgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVRhc2tzIGdldFRhc2tzKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0VGFza3MgPGVtPlRhc2tzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5UYXNrczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0VGFza3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFRhc2tzKFRhc2tzIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJlc291cmNlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGNvbGxlY3Rpb24gb2YgcmVzb3VyY2VzIHRoYXQgbWFrZSB1cCB0aGUgcHJvamVjdC4KLQkgKiAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZXNvdXJjZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFJlc291cmNlcyhSZXNvdXJjZXMpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UHJvamVjdF9SZXNvdXJjZXMoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdSZXNvdXJjZXMnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlSZXNvdXJjZXMgZ2V0UmVzb3VyY2VzKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0UmVzb3VyY2VzIDxlbT5SZXNvdXJjZXM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlJlc291cmNlczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0UmVzb3VyY2VzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRSZXNvdXJjZXMoUmVzb3VyY2VzIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkFzc2lnbm1lbnRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgY29sbGVjdGlvbiBvZiBhc3NpZ25tZW50cyB0aGF0IG1ha2UgdXAgdGhlIHByb2plY3QuCi0JICogICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Bc3NpZ25tZW50czwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0QXNzaWdubWVudHMoQXNzaWdubWVudHMpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UHJvamVjdF9Bc3NpZ25tZW50cygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0Fzc2lnbm1lbnRzJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQXNzaWdubWVudHMgZ2V0QXNzaWdubWVudHMoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRBc3NpZ25tZW50cyA8ZW0+QXNzaWdubWVudHM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkFzc2lnbm1lbnRzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRBc3NpZ25tZW50cygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0QXNzaWdubWVudHMoQXNzaWdubWVudHMgdmFsdWUpOwotCi19IC8vIFByb2plY3QKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvUmF0ZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9SYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlZTQ4MDUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9SYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTYgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBSYXRlLmphdmEsdiAxLjEgMjAwOC8wMS8xNSAwODo1Mjo0NiBqdGhhbSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Q7Ci0KLWltcG9ydCBqYXZhLm1hdGguQmlnRGVjaW1hbDsKLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5SYXRlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmF0ZSNnZXRSYXRlc0Zyb20gPGVtPlJhdGVzIEZyb208L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmF0ZSNnZXRSYXRlc1RvIDxlbT5SYXRlcyBUbzwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SYXRlI2dldFJhdGVUYWJsZSA8ZW0+UmF0ZSBUYWJsZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SYXRlI2dldFN0YW5kYXJkUmF0ZSA8ZW0+U3RhbmRhcmQgUmF0ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SYXRlI2dldFN0YW5kYXJkUmF0ZUZvcm1hdCA8ZW0+U3RhbmRhcmQgUmF0ZSBGb3JtYXQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmF0ZSNnZXRPdmVydGltZVJhdGUgPGVtPk92ZXJ0aW1lIFJhdGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmF0ZSNnZXRPdmVydGltZVJhdGVGb3JtYXQgPGVtPk92ZXJ0aW1lIFJhdGUgRm9ybWF0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJhdGUjZ2V0Q29zdFBlclVzZSA8ZW0+Q29zdCBQZXIgVXNlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UmF0ZSgpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nUmF0ZV8uX3R5cGUnIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBSYXRlIGV4dGVuZHMgRU9iamVjdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmF0ZXMgRnJvbTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGRhdGUgdGhhdCB0aGUgcmF0ZSBiZWNvbWVzIGVmZmVjdGl2ZS4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SYXRlcyBGcm9tPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRSYXRlc0Zyb20oT2JqZWN0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFJhdGVfUmF0ZXNGcm9tKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EYXRlVGltZSIgcmVxdWlyZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1JhdGVzRnJvbScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU9iamVjdCBnZXRSYXRlc0Zyb20oKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmF0ZSNnZXRSYXRlc0Zyb20gPGVtPlJhdGVzIEZyb208L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlJhdGVzIEZyb208L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFJhdGVzRnJvbSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UmF0ZXNGcm9tKE9iamVjdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SYXRlcyBUbzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGxhc3QgZGF0ZSB0aGF0IHRoZSByYXRlIGlzIGVmZmVjdGl2ZS4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SYXRlcyBUbzwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UmF0ZXNUbyhPYmplY3QpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UmF0ZV9SYXRlc1RvKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EYXRlVGltZSIgcmVxdWlyZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1JhdGVzVG8nIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlPYmplY3QgZ2V0UmF0ZXNUbygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SYXRlI2dldFJhdGVzVG8gPGVtPlJhdGVzIFRvPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5SYXRlcyBUbzwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UmF0ZXNUbygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UmF0ZXNUbyhPYmplY3QgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmF0ZSBUYWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSByYXRlIHRhYmxlIGZvciB0aGUgcmVzb3VyY2UuIAotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVzIGFyZTogMD1BLCAxPUIsIDI9QywgMz1ELCA0PUUKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmF0ZSBUYWJsZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UmF0ZVRhYmxlKEJpZ0ludGVnZXIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UmF0ZV9SYXRlVGFibGUoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SYXRlVGFibGVUeXBlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdSYXRlVGFibGUnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdJbnRlZ2VyIGdldFJhdGVUYWJsZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SYXRlI2dldFJhdGVUYWJsZSA8ZW0+UmF0ZSBUYWJsZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UmF0ZSBUYWJsZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UmF0ZVRhYmxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRSYXRlVGFibGUoQmlnSW50ZWdlciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TdGFuZGFyZCBSYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgc3RhbmRhcmQgcmF0ZSBmb3IgdGhlIHJlc291cmNlIGZvciB0aGUgcGVyaW9kIHNwZWNpZmllZC4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TdGFuZGFyZCBSYXRlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRTdGFuZGFyZFJhdGUoQmlnRGVjaW1hbCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRSYXRlX1N0YW5kYXJkUmF0ZSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRGVjaW1hbCIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nU3RhbmRhcmRSYXRlJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnRGVjaW1hbCBnZXRTdGFuZGFyZFJhdGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmF0ZSNnZXRTdGFuZGFyZFJhdGUgPGVtPlN0YW5kYXJkIFJhdGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlN0YW5kYXJkIFJhdGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFN0YW5kYXJkUmF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0U3RhbmRhcmRSYXRlKEJpZ0RlY2ltYWwgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U3RhbmRhcmQgUmF0ZSBGb3JtYXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSB1bml0cyB1c2VkIGJ5IE1pY3Jvc29mdCBQcm9qZWN0IHRvIGRpc3BsYXkgdGhlIHN0YW5kYXJkIHJhdGUuICAKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE9bSwgMj1oLCAzPWQsIDQ9dywgNT1tbywgNz15Ci0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U3RhbmRhcmQgUmF0ZSBGb3JtYXQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFN0YW5kYXJkUmF0ZUZvcm1hdChCaWdJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFJhdGVfU3RhbmRhcmRSYXRlRm9ybWF0KCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuU3RhbmRhcmRSYXRlRm9ybWF0VHlwZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nU3RhbmRhcmRSYXRlRm9ybWF0JyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnSW50ZWdlciBnZXRTdGFuZGFyZFJhdGVGb3JtYXQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmF0ZSNnZXRTdGFuZGFyZFJhdGVGb3JtYXQgPGVtPlN0YW5kYXJkIFJhdGUgRm9ybWF0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TdGFuZGFyZCBSYXRlIEZvcm1hdDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0U3RhbmRhcmRSYXRlRm9ybWF0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRTdGFuZGFyZFJhdGVGb3JtYXQoQmlnSW50ZWdlciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5PdmVydGltZSBSYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgb3ZlcnRpbWUgcmF0ZSBmb3IgdGhlIHJlc291cmNlIGZvciB0aGUgcGVyaW9kIHNwZWNpZmllZC4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5PdmVydGltZSBSYXRlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRPdmVydGltZVJhdGUoQmlnRGVjaW1hbCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRSYXRlX092ZXJ0aW1lUmF0ZSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRGVjaW1hbCIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nT3ZlcnRpbWVSYXRlJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnRGVjaW1hbCBnZXRPdmVydGltZVJhdGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmF0ZSNnZXRPdmVydGltZVJhdGUgPGVtPk92ZXJ0aW1lIFJhdGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk92ZXJ0aW1lIFJhdGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldE92ZXJ0aW1lUmF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0T3ZlcnRpbWVSYXRlKEJpZ0RlY2ltYWwgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+T3ZlcnRpbWUgUmF0ZSBGb3JtYXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSB1bml0cyB1c2VkIGJ5IE1pY3Jvc29mdCBQcm9qZWN0IHRvIGRpc3BsYXkgdGhlIG92ZXJ0aW1lIHJhdGUuICAKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE9bSwgMj1oLCAzPWQsIDQ9dywgNT1tbywgNz15Ci0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk92ZXJ0aW1lIFJhdGUgRm9ybWF0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRPdmVydGltZVJhdGVGb3JtYXQoQmlnSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRSYXRlX092ZXJ0aW1lUmF0ZUZvcm1hdCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk92ZXJ0aW1lUmF0ZUZvcm1hdFR5cGUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J092ZXJ0aW1lUmF0ZUZvcm1hdCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0ludGVnZXIgZ2V0T3ZlcnRpbWVSYXRlRm9ybWF0KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJhdGUjZ2V0T3ZlcnRpbWVSYXRlRm9ybWF0IDxlbT5PdmVydGltZSBSYXRlIEZvcm1hdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+T3ZlcnRpbWUgUmF0ZSBGb3JtYXQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldE92ZXJ0aW1lUmF0ZUZvcm1hdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0T3ZlcnRpbWVSYXRlRm9ybWF0KEJpZ0ludGVnZXIgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q29zdCBQZXIgVXNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgY29zdCBwZXIgdXNlIG9mIHRoZSByZXNvdXJjZS4gCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHZhbHVlIGlzIGFzIG9mIHRoZSBjdXJyZW50IGRhdGUgaWYgYSByYXRlIHRhYmxlIGV4aXN0cyBmb3IgdGhlIHJlc291cmNlLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNvc3QgUGVyIFVzZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0Q29zdFBlclVzZShCaWdEZWNpbWFsKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFJhdGVfQ29zdFBlclVzZSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRGVjaW1hbCIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQ29zdFBlclVzZScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0RlY2ltYWwgZ2V0Q29zdFBlclVzZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SYXRlI2dldENvc3RQZXJVc2UgPGVtPkNvc3QgUGVyIFVzZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q29zdCBQZXIgVXNlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRDb3N0UGVyVXNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRDb3N0UGVyVXNlKEJpZ0RlY2ltYWwgdmFsdWUpOwotCi19IC8vIFJhdGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvUmF0ZXMuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvUmF0ZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWZkN2VkNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L1JhdGVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFJhdGVzLmphdmEsdiAxLjEgMjAwOC8wMS8xNSAwODo1Mjo0NiBqdGhhbSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlJhdGVzPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmF0ZXMjZ2V0UmF0ZSA8ZW0+UmF0ZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFJhdGVzKCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdSYXRlc18uX3R5cGUnIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBSYXRlcyBleHRlbmRzIEVPYmplY3QgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJhdGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJhdGV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGRlZmluaXRpb24gb2YgYSB0aW1lIHBlcmlvZCwgYW5kIHRoZSByYXRlcyBhcHBsaWNhYmxlIGZvciAKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSByZXNvdXJjZSBkdXJpbmcgdGhhdCBwZXJpb2QuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJhdGU8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UmF0ZXNfUmF0ZSgpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmF0ZSIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIgdXBwZXI9IjI1IgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdSYXRlJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0UmF0ZSgpOwotCi19IC8vIFJhdGVzCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L1Jlc291cmNlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L1Jlc291cmNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwNjRmOWIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9SZXNvdXJjZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI4NiArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFJlc291cmNlLmphdmEsdiAxLjEgMjAwOC8wMS8xNSAwODo1Mjo0NiBqdGhhbSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Q7Ci0KLWltcG9ydCBqYXZhLm1hdGguQmlnRGVjaW1hbDsKLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UmVzb3VyY2U8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRVSUQgPGVtPlVJRDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRJRCA8ZW0+SUQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRUeXBlIDxlbT5UeXBlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2lzSXNOdWxsIDxlbT5JcyBOdWxsPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldEluaXRpYWxzIDxlbT5Jbml0aWFsczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRQaG9uZXRpY3MgPGVtPlBob25ldGljczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXROVEFjY291bnQgPGVtPk5UIEFjY291bnQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0TWF0ZXJpYWxMYWJlbCA8ZW0+TWF0ZXJpYWwgTGFiZWw8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0Q29kZSA8ZW0+Q29kZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRHcm91cCA8ZW0+R3JvdXA8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0V29ya0dyb3VwIDxlbT5Xb3JrIEdyb3VwPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldEVtYWlsQWRkcmVzcyA8ZW0+RW1haWwgQWRkcmVzczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRIeXBlcmxpbmsgPGVtPkh5cGVybGluazwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRIeXBlcmxpbmtBZGRyZXNzIDxlbT5IeXBlcmxpbmsgQWRkcmVzczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRIeXBlcmxpbmtTdWJBZGRyZXNzIDxlbT5IeXBlcmxpbmsgU3ViIEFkZHJlc3M8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0TWF4VW5pdHMgPGVtPk1heCBVbml0czwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRQZWFrVW5pdHMgPGVtPlBlYWsgVW5pdHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjaXNPdmVyQWxsb2NhdGVkIDxlbT5PdmVyIEFsbG9jYXRlZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRBdmFpbGFibGVGcm9tIDxlbT5BdmFpbGFibGUgRnJvbTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRBdmFpbGFibGVUbyA8ZW0+QXZhaWxhYmxlIFRvPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldFN0YXJ0IDxlbT5TdGFydDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRGaW5pc2ggPGVtPkZpbmlzaDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNpc0NhbkxldmVsIDxlbT5DYW4gTGV2ZWw8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0QWNjcnVlQXQgPGVtPkFjY3J1ZSBBdDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRXb3JrIDxlbT5Xb3JrPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldFJlZ3VsYXJXb3JrIDxlbT5SZWd1bGFyIFdvcms8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0T3ZlcnRpbWVXb3JrIDxlbT5PdmVydGltZSBXb3JrPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldEFjdHVhbFdvcmsgPGVtPkFjdHVhbCBXb3JrPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldFJlbWFpbmluZ1dvcmsgPGVtPlJlbWFpbmluZyBXb3JrPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldEFjdHVhbE92ZXJ0aW1lV29yayA8ZW0+QWN0dWFsIE92ZXJ0aW1lIFdvcms8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0UmVtYWluaW5nT3ZlcnRpbWVXb3JrIDxlbT5SZW1haW5pbmcgT3ZlcnRpbWUgV29yazwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRQZXJjZW50V29ya0NvbXBsZXRlIDxlbT5QZXJjZW50IFdvcmsgQ29tcGxldGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0U3RhbmRhcmRSYXRlIDxlbT5TdGFuZGFyZCBSYXRlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldFN0YW5kYXJkUmF0ZUZvcm1hdCA8ZW0+U3RhbmRhcmQgUmF0ZSBGb3JtYXQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0Q29zdCA8ZW0+Q29zdDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRPdmVydGltZVJhdGUgPGVtPk92ZXJ0aW1lIFJhdGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0T3ZlcnRpbWVSYXRlRm9ybWF0IDxlbT5PdmVydGltZSBSYXRlIEZvcm1hdDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRPdmVydGltZUNvc3QgPGVtPk92ZXJ0aW1lIENvc3Q8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0Q29zdFBlclVzZSA8ZW0+Q29zdCBQZXIgVXNlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldEFjdHVhbENvc3QgPGVtPkFjdHVhbCBDb3N0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldEFjdHVhbE92ZXJ0aW1lQ29zdCA8ZW0+QWN0dWFsIE92ZXJ0aW1lIENvc3Q8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0UmVtYWluaW5nQ29zdCA8ZW0+UmVtYWluaW5nIENvc3Q8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0UmVtYWluaW5nT3ZlcnRpbWVDb3N0IDxlbT5SZW1haW5pbmcgT3ZlcnRpbWUgQ29zdDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRXb3JrVmFyaWFuY2UgPGVtPldvcmsgVmFyaWFuY2U8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0Q29zdFZhcmlhbmNlIDxlbT5Db3N0IFZhcmlhbmNlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldFNWIDxlbT5TVjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRDViA8ZW0+Q1Y8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0QUNXUCA8ZW0+QUNXUDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRDYWxlbmRhclVJRCA8ZW0+Q2FsZW5kYXIgVUlEPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldE5vdGVzIDxlbT5Ob3RlczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRCQ1dTIDxlbT5CQ1dTPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldEJDV1AgPGVtPkJDV1A8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjaXNJc0dlbmVyaWMgPGVtPklzIEdlbmVyaWM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjaXNJc0luYWN0aXZlIDxlbT5JcyBJbmFjdGl2ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNpc0lzRW50ZXJwcmlzZSA8ZW0+SXMgRW50ZXJwcmlzZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRCb29raW5nVHlwZSA8ZW0+Qm9va2luZyBUeXBlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldEFjdHVhbFdvcmtQcm90ZWN0ZWQgPGVtPkFjdHVhbCBXb3JrIFByb3RlY3RlZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRBY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQgPGVtPkFjdHVhbCBPdmVydGltZSBXb3JrIFByb3RlY3RlZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRBY3RpdmVEaXJlY3RvcnlHVUlEIDxlbT5BY3RpdmUgRGlyZWN0b3J5IEdVSUQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0Q3JlYXRpb25EYXRlIDxlbT5DcmVhdGlvbiBEYXRlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldEV4dGVuZGVkQXR0cmlidXRlIDxlbT5FeHRlbmRlZCBBdHRyaWJ1dGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0QmFzZWxpbmUgPGVtPkJhc2VsaW5lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldE91dGxpbmVDb2RlIDxlbT5PdXRsaW5lIENvZGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0QXZhaWxhYmlsaXR5UGVyaW9kcyA8ZW0+QXZhaWxhYmlsaXR5IFBlcmlvZHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0UmF0ZXMgPGVtPlJhdGVzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldFRpbWVwaGFzZWREYXRhIDxlbT5UaW1lcGhhc2VkIERhdGE8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRSZXNvdXJjZSgpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nUmVzb3VyY2VfLl90eXBlJyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUmVzb3VyY2UgZXh0ZW5kcyBFT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5VSUQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgcmVzb3VyY2UuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VUlEPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRVSUQoQmlnSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRSZXNvdXJjZV9VSUQoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkludGVnZXIiIHJlcXVpcmVkPSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdVSUQnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdJbnRlZ2VyIGdldFVJRCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRVSUQgPGVtPlVJRDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VUlEPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRVSUQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFVJRChCaWdJbnRlZ2VyIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPklEPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgcG9zaXRpb24gaWRlbnRpZmllciBvZiB0aGUgcmVzb3VyY2Ugd2l0aGluIHRoZSBsaXN0IG9mIHJlc291cmNlcy4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JRDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0SUQoQmlnSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRSZXNvdXJjZV9JRCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuSW50ZWdlciIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nSUQnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdJbnRlZ2VyIGdldElEKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldElEIDxlbT5JRDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SUQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldElEKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRJRChCaWdJbnRlZ2VyIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBuYW1lIG9mIHRoZSByZXNvdXJjZS4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXROYW1lKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRSZXNvdXJjZV9OYW1lKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTmFtZVR5cGUxIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdOYW1lJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldE5hbWUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TmFtZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHR5cGUgb2YgcmVzb3VyY2UuIFZhbHVlcyBhcmU6IDA9TWF0ZXJpYWwsIDE9V29yawotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFR5cGUoQmlnSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRSZXNvdXJjZV9UeXBlKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVHlwZVR5cGU0IgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdUeXBlJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnSW50ZWdlciBnZXRUeXBlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldFR5cGUgPGVtPlR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFR5cGUoQmlnSW50ZWdlciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JcyBOdWxsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBTcGVjaWZpZXMgd2hldGhlciB0aGUgcmVzb3VyY2UgaXMgbnVsbC4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JcyBOdWxsPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldElzTnVsbCgpCi0JICogQHNlZSAjdW5zZXRJc051bGwoKQotCSAqIEBzZWUgI3NldElzTnVsbChib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFJlc291cmNlX0lzTnVsbCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbiIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nSXNOdWxsJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc0lzTnVsbCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNpc0lzTnVsbCA8ZW0+SXMgTnVsbDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SXMgTnVsbDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRJc051bGwoKQotCSAqIEBzZWUgI3Vuc2V0SXNOdWxsKCkKLQkgKiBAc2VlICNpc0lzTnVsbCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0SXNOdWxsKGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2lzSXNOdWxsIDxlbT5JcyBOdWxsPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldElzTnVsbCgpCi0JICogQHNlZSAjaXNJc051bGwoKQotCSAqIEBzZWUgI3NldElzTnVsbChib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0SXNOdWxsKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjaXNJc051bGwgPGVtPklzIE51bGw8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPklzIE51bGw8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldElzTnVsbCgpCi0JICogQHNlZSAjaXNJc051bGwoKQotCSAqIEBzZWUgI3NldElzTnVsbChib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0SXNOdWxsKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Jbml0aWFsczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGluaXRpYWxzIG9mIHRoZSByZXNvdXJjZS4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Jbml0aWFsczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0SW5pdGlhbHMoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFJlc291cmNlX0luaXRpYWxzKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuSW5pdGlhbHNUeXBlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdJbml0aWFscycgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRJbml0aWFscygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRJbml0aWFscyA8ZW0+SW5pdGlhbHM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkluaXRpYWxzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRJbml0aWFscygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0SW5pdGlhbHMoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlBob25ldGljczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHBob25ldGljIHNwZWxsaW5nIG9mIHRoZSByZXNvdXJjZSBuYW1lLiAgCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGb3IgdXNlIHdpdGggSmFwYW5lc2Ugb25seS4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QaG9uZXRpY3M8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFBob25ldGljcyhTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UmVzb3VyY2VfUGhvbmV0aWNzKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUGhvbmV0aWNzVHlwZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nUGhvbmV0aWNzJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFBob25ldGljcygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRQaG9uZXRpY3MgPGVtPlBob25ldGljczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UGhvbmV0aWNzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRQaG9uZXRpY3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFBob25ldGljcyhTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TlQgQWNjb3VudDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIE5UIGFjY291bnQgYXNzb2NpYXRlZCB3aXRoIHRoZSByZXNvdXJjZS4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5OVCBBY2NvdW50PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXROVEFjY291bnQoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFJlc291cmNlX05UQWNjb3VudCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk5UQWNjb3VudFR5cGUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J05UQWNjb3VudCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXROVEFjY291bnQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0TlRBY2NvdW50IDxlbT5OVCBBY2NvdW50PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5OVCBBY2NvdW50PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXROVEFjY291bnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldE5UQWNjb3VudChTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TWF0ZXJpYWwgTGFiZWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSB1bml0IG9mIG1lYXN1cmUgZm9yIHRoZSBtYXRlcmlhbCByZXNvdXJjZS4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NYXRlcmlhbCBMYWJlbDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0TWF0ZXJpYWxMYWJlbChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UmVzb3VyY2VfTWF0ZXJpYWxMYWJlbCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1hdGVyaWFsTGFiZWxUeXBlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdNYXRlcmlhbExhYmVsJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldE1hdGVyaWFsTGFiZWwoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0TWF0ZXJpYWxMYWJlbCA8ZW0+TWF0ZXJpYWwgTGFiZWw8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk1hdGVyaWFsIExhYmVsPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRNYXRlcmlhbExhYmVsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRNYXRlcmlhbExhYmVsKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Db2RlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgY29kZSBvciBvdGhlciBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcmVzb3VyY2UuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q29kZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0Q29kZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UmVzb3VyY2VfQ29kZSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkNvZGVUeXBlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdDb2RlJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldENvZGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0Q29kZSA8ZW0+Q29kZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q29kZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0Q29kZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Q29kZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+R3JvdXA8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBncm91cCB0byB3aGljaCB0aGUgcmVzb3VyY2UgYmVsb25ncy4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Hcm91cDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0R3JvdXAoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFJlc291cmNlX0dyb3VwKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuR3JvdXBUeXBlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdHcm91cCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRHcm91cCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRHcm91cCA8ZW0+R3JvdXA8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkdyb3VwPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRHcm91cCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0R3JvdXAoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPldvcmsgR3JvdXA8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSB0eXBlIG9mIHdvcmtncm91cCB0byB3aGljaCB0aGUgcmVzb3VyY2UgYmVsb25ncy4gCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZXMgYXJlOiAwPURlZmF1bHQsIDE9Tm9uZSwgMj1FbWFpbCwgMz1XZWIKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Xb3JrIEdyb3VwPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRXb3JrR3JvdXAoQmlnSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRSZXNvdXJjZV9Xb3JrR3JvdXAoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Xb3JrR3JvdXBUeXBlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdXb3JrR3JvdXAnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdJbnRlZ2VyIGdldFdvcmtHcm91cCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRXb3JrR3JvdXAgPGVtPldvcmsgR3JvdXA8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPldvcmsgR3JvdXA8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFdvcmtHcm91cCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0V29ya0dyb3VwKEJpZ0ludGVnZXIgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RW1haWwgQWRkcmVzczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGVtYWlsIGFkZHJlc3Mgb2YgdGhlIHJlc291cmNlLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkVtYWlsIEFkZHJlc3M8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEVtYWlsQWRkcmVzcyhTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UmVzb3VyY2VfRW1haWxBZGRyZXNzKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRW1haWxBZGRyZXNzVHlwZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nRW1haWxBZGRyZXNzJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldEVtYWlsQWRkcmVzcygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRFbWFpbEFkZHJlc3MgPGVtPkVtYWlsIEFkZHJlc3M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkVtYWlsIEFkZHJlc3M8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEVtYWlsQWRkcmVzcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RW1haWxBZGRyZXNzKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5IeXBlcmxpbms8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSB0aXRsZSBvZiB0aGUgaHlwZXJsaW5rIGFzc29jaWF0ZWQgd2l0aCB0aGUgcmVzb3VyY2UuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SHlwZXJsaW5rPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRIeXBlcmxpbmsoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFJlc291cmNlX0h5cGVybGluaygpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lkh5cGVybGlua1R5cGUxIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdIeXBlcmxpbmsnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0SHlwZXJsaW5rKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldEh5cGVybGluayA8ZW0+SHlwZXJsaW5rPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5IeXBlcmxpbms8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEh5cGVybGluaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0SHlwZXJsaW5rKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5IeXBlcmxpbmsgQWRkcmVzczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGh5cGVybGluayBhc3NvY2lhdGVkIHdpdGggdGhlIHJlc291cmNlLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkh5cGVybGluayBBZGRyZXNzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRIeXBlcmxpbmtBZGRyZXNzKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRSZXNvdXJjZV9IeXBlcmxpbmtBZGRyZXNzKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuSHlwZXJsaW5rQWRkcmVzc1R5cGUxIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdIeXBlcmxpbmtBZGRyZXNzJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldEh5cGVybGlua0FkZHJlc3MoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0SHlwZXJsaW5rQWRkcmVzcyA8ZW0+SHlwZXJsaW5rIEFkZHJlc3M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkh5cGVybGluayBBZGRyZXNzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRIeXBlcmxpbmtBZGRyZXNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRIeXBlcmxpbmtBZGRyZXNzKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5IeXBlcmxpbmsgU3ViIEFkZHJlc3M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBkb2N1bWVudCBib29rbWFyayBvZiB0aGUgaHlwZXJsaW5rIGFzc29jaWF0ZWQgd2l0aCB0aGUgcmVzb3VyY2UuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SHlwZXJsaW5rIFN1YiBBZGRyZXNzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRIeXBlcmxpbmtTdWJBZGRyZXNzKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRSZXNvdXJjZV9IeXBlcmxpbmtTdWJBZGRyZXNzKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuSHlwZXJsaW5rU3ViQWRkcmVzc1R5cGUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0h5cGVybGlua1N1YkFkZHJlc3MnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0SHlwZXJsaW5rU3ViQWRkcmVzcygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRIeXBlcmxpbmtTdWJBZGRyZXNzIDxlbT5IeXBlcmxpbmsgU3ViIEFkZHJlc3M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkh5cGVybGluayBTdWIgQWRkcmVzczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0SHlwZXJsaW5rU3ViQWRkcmVzcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0SHlwZXJsaW5rU3ViQWRkcmVzcyhTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TWF4IFVuaXRzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+IjEuMCI8L2NvZGU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIG1heGltdW0gbnVtYmVyIG9mIHVuaXRzIHRoYXQgdGhlIHJlc291cmNlIGlzIGF2YWlsYWJsZS4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NYXggVW5pdHM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0TWF4VW5pdHMoKQotCSAqIEBzZWUgI3Vuc2V0TWF4VW5pdHMoKQotCSAqIEBzZWUgI3NldE1heFVuaXRzKGZsb2F0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFJlc291cmNlX01heFVuaXRzKCkKLQkgKiBAbW9kZWwgZGVmYXVsdD0iMS4wIiB1bmlxdWU9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkZsb2F0IgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdNYXhVbml0cycgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWZsb2F0IGdldE1heFVuaXRzKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldE1heFVuaXRzIDxlbT5NYXggVW5pdHM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk1heCBVbml0czwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRNYXhVbml0cygpCi0JICogQHNlZSAjdW5zZXRNYXhVbml0cygpCi0JICogQHNlZSAjZ2V0TWF4VW5pdHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldE1heFVuaXRzKGZsb2F0IHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRNYXhVbml0cyA8ZW0+TWF4IFVuaXRzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldE1heFVuaXRzKCkKLQkgKiBAc2VlICNnZXRNYXhVbml0cygpCi0JICogQHNlZSAjc2V0TWF4VW5pdHMoZmxvYXQpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRNYXhVbml0cygpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldE1heFVuaXRzIDxlbT5NYXggVW5pdHM8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1heCBVbml0czwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0TWF4VW5pdHMoKQotCSAqIEBzZWUgI2dldE1heFVuaXRzKCkKLQkgKiBAc2VlICNzZXRNYXhVbml0cyhmbG9hdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldE1heFVuaXRzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QZWFrIFVuaXRzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgbGFyZ2VzdCBudW1iZXIgb2YgdW5pdHMgYXNzaWduZWQgdG8gdGhlIHJlc291cmNlIGF0IGFueSB0aW1lLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlBlYWsgVW5pdHM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0UGVha1VuaXRzKCkKLQkgKiBAc2VlICN1bnNldFBlYWtVbml0cygpCi0JICogQHNlZSAjc2V0UGVha1VuaXRzKGZsb2F0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFJlc291cmNlX1BlYWtVbml0cygpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRmxvYXQiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1BlYWtVbml0cycgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWZsb2F0IGdldFBlYWtVbml0cygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRQZWFrVW5pdHMgPGVtPlBlYWsgVW5pdHM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlBlYWsgVW5pdHM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0UGVha1VuaXRzKCkKLQkgKiBAc2VlICN1bnNldFBlYWtVbml0cygpCi0JICogQHNlZSAjZ2V0UGVha1VuaXRzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRQZWFrVW5pdHMoZmxvYXQgdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldFBlYWtVbml0cyA8ZW0+UGVhayBVbml0czwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRQZWFrVW5pdHMoKQotCSAqIEBzZWUgI2dldFBlYWtVbml0cygpCi0JICogQHNlZSAjc2V0UGVha1VuaXRzKGZsb2F0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0UGVha1VuaXRzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0UGVha1VuaXRzIDxlbT5QZWFrIFVuaXRzPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QZWFrIFVuaXRzPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRQZWFrVW5pdHMoKQotCSAqIEBzZWUgI2dldFBlYWtVbml0cygpCi0JICogQHNlZSAjc2V0UGVha1VuaXRzKGZsb2F0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0UGVha1VuaXRzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5PdmVyIEFsbG9jYXRlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogV2hldGhlciB0aGUgcmVzb3VyY2UgaXMgb3ZlcmFsbG9jYXRlZC4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5PdmVyIEFsbG9jYXRlZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRPdmVyQWxsb2NhdGVkKCkKLQkgKiBAc2VlICN1bnNldE92ZXJBbGxvY2F0ZWQoKQotCSAqIEBzZWUgI3NldE92ZXJBbGxvY2F0ZWQoYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRSZXNvdXJjZV9PdmVyQWxsb2NhdGVkKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdPdmVyQWxsb2NhdGVkJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc092ZXJBbGxvY2F0ZWQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjaXNPdmVyQWxsb2NhdGVkIDxlbT5PdmVyIEFsbG9jYXRlZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+T3ZlciBBbGxvY2F0ZWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0T3ZlckFsbG9jYXRlZCgpCi0JICogQHNlZSAjdW5zZXRPdmVyQWxsb2NhdGVkKCkKLQkgKiBAc2VlICNpc092ZXJBbGxvY2F0ZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldE92ZXJBbGxvY2F0ZWQoYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjaXNPdmVyQWxsb2NhdGVkIDxlbT5PdmVyIEFsbG9jYXRlZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRPdmVyQWxsb2NhdGVkKCkKLQkgKiBAc2VlICNpc092ZXJBbGxvY2F0ZWQoKQotCSAqIEBzZWUgI3NldE92ZXJBbGxvY2F0ZWQoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldE92ZXJBbGxvY2F0ZWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNpc092ZXJBbGxvY2F0ZWQgPGVtPk92ZXIgQWxsb2NhdGVkPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5PdmVyIEFsbG9jYXRlZDwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0T3ZlckFsbG9jYXRlZCgpCi0JICogQHNlZSAjaXNPdmVyQWxsb2NhdGVkKCkKLQkgKiBAc2VlICNzZXRPdmVyQWxsb2NhdGVkKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRPdmVyQWxsb2NhdGVkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BdmFpbGFibGUgRnJvbTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGZpcnN0IGRhdGUgdGhhdCB0aGUgcmVzb3VyY2UgaXMgYXZhaWxhYmxlLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkF2YWlsYWJsZSBGcm9tPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRBdmFpbGFibGVGcm9tKE9iamVjdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRSZXNvdXJjZV9BdmFpbGFibGVGcm9tKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EYXRlVGltZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQXZhaWxhYmxlRnJvbScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU9iamVjdCBnZXRBdmFpbGFibGVGcm9tKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldEF2YWlsYWJsZUZyb20gPGVtPkF2YWlsYWJsZSBGcm9tPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BdmFpbGFibGUgRnJvbTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0QXZhaWxhYmxlRnJvbSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0QXZhaWxhYmxlRnJvbShPYmplY3QgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QXZhaWxhYmxlIFRvPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgbGFzdCBkYXRlIHRoZSByZXNvdXJjZSBpcyBhdmFpbGFibGUuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QXZhaWxhYmxlIFRvPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRBdmFpbGFibGVUbyhPYmplY3QpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UmVzb3VyY2VfQXZhaWxhYmxlVG8oKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkRhdGVUaW1lIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdBdmFpbGFibGVUbycgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU9iamVjdCBnZXRBdmFpbGFibGVUbygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRBdmFpbGFibGVUbyA8ZW0+QXZhaWxhYmxlIFRvPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BdmFpbGFibGUgVG88L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEF2YWlsYWJsZVRvKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRBdmFpbGFibGVUbyhPYmplY3QgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U3RhcnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBzY2hlZHVsZWQgc3RhcnQgZGF0ZSBvZiB0aGUgcmVzb3VyY2UuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U3RhcnQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFN0YXJ0KE9iamVjdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRSZXNvdXJjZV9TdGFydCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRGF0ZVRpbWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1N0YXJ0JyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JT2JqZWN0IGdldFN0YXJ0KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldFN0YXJ0IDxlbT5TdGFydDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U3RhcnQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFN0YXJ0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRTdGFydChPYmplY3QgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RmluaXNoPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgc2NoZWR1bGVkIGZpbmlzaCBkYXRlIG9mIHRoZSByZXNvdXJjZS4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5GaW5pc2g8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEZpbmlzaChPYmplY3QpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UmVzb3VyY2VfRmluaXNoKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EYXRlVGltZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nRmluaXNoJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JT2JqZWN0IGdldEZpbmlzaCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRGaW5pc2ggPGVtPkZpbmlzaDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RmluaXNoPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRGaW5pc2goKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEZpbmlzaChPYmplY3QgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q2FuIExldmVsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBXaGV0aGVyIHRoZSByZXNvdXJjZSBjYW4gYmUgbGV2ZWxlZC4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5DYW4gTGV2ZWw8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0Q2FuTGV2ZWwoKQotCSAqIEBzZWUgI3Vuc2V0Q2FuTGV2ZWwoKQotCSAqIEBzZWUgI3NldENhbkxldmVsKGJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UmVzb3VyY2VfQ2FuTGV2ZWwoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW4iCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0NhbkxldmVsJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc0NhbkxldmVsKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2lzQ2FuTGV2ZWwgPGVtPkNhbiBMZXZlbDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q2FuIExldmVsPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldENhbkxldmVsKCkKLQkgKiBAc2VlICN1bnNldENhbkxldmVsKCkKLQkgKiBAc2VlICNpc0NhbkxldmVsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRDYW5MZXZlbChib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNpc0NhbkxldmVsIDxlbT5DYW4gTGV2ZWw8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0Q2FuTGV2ZWwoKQotCSAqIEBzZWUgI2lzQ2FuTGV2ZWwoKQotCSAqIEBzZWUgI3NldENhbkxldmVsKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRDYW5MZXZlbCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2lzQ2FuTGV2ZWwgPGVtPkNhbiBMZXZlbDwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q2FuIExldmVsPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRDYW5MZXZlbCgpCi0JICogQHNlZSAjaXNDYW5MZXZlbCgpCi0JICogQHNlZSAjc2V0Q2FuTGV2ZWwoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldENhbkxldmVsKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BY2NydWUgQXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIEhvdyBjb3N0IGlzIGFjY3J1ZWQgYWdhaW5zdCB0aGUgcmVzb3VyY2UuIAotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVzIGFyZTogMT1TdGFydCwgMj1FbmQsIDM9UHJvcmF0ZWQKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BY2NydWUgQXQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEFjY3J1ZUF0KEJpZ0ludGVnZXIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UmVzb3VyY2VfQWNjcnVlQXQoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5BY2NydWVBdCIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQWNjcnVlQXQnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdJbnRlZ2VyIGdldEFjY3J1ZUF0KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldEFjY3J1ZUF0IDxlbT5BY2NydWUgQXQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkFjY3J1ZSBBdDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0QWNjcnVlQXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEFjY3J1ZUF0KEJpZ0ludGVnZXIgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+V29yazwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHRvdGFsIHdvcmsgYXNzaWduZWQgdG8gdGhlIHJlc291cmNlIGFjcm9zcyBhbGwgYXNzaWduZWQgdGFza3MuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+V29yazwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0V29yayhPYmplY3QpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UmVzb3VyY2VfV29yaygpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRHVyYXRpb24iCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1dvcmsnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlPYmplY3QgZ2V0V29yaygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRXb3JrIDxlbT5Xb3JrPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Xb3JrPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRXb3JrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRXb3JrKE9iamVjdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SZWd1bGFyIFdvcms8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBhbW91bnQgb2Ygbm9uLW92ZXJ0aW1lIHdvcmsgYXNzaWduZWQgdG8gdGhlIHJlc291cmNlLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJlZ3VsYXIgV29yazwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UmVndWxhcldvcmsoT2JqZWN0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFJlc291cmNlX1JlZ3VsYXJXb3JrKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EdXJhdGlvbiIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nUmVndWxhcldvcmsnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlPYmplY3QgZ2V0UmVndWxhcldvcmsoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0UmVndWxhcldvcmsgPGVtPlJlZ3VsYXIgV29yazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UmVndWxhciBXb3JrPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRSZWd1bGFyV29yaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UmVndWxhcldvcmsoT2JqZWN0IHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk92ZXJ0aW1lIFdvcms8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBhbW91bnQgb2Ygb3ZlcnRpbWUgd29yayBhc3NpZ25lZCB0byB0aGUgcmVzb3VyY2UuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+T3ZlcnRpbWUgV29yazwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0T3ZlcnRpbWVXb3JrKE9iamVjdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRSZXNvdXJjZV9PdmVydGltZVdvcmsoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkR1cmF0aW9uIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdPdmVydGltZVdvcmsnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlPYmplY3QgZ2V0T3ZlcnRpbWVXb3JrKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldE92ZXJ0aW1lV29yayA8ZW0+T3ZlcnRpbWUgV29yazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+T3ZlcnRpbWUgV29yazwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0T3ZlcnRpbWVXb3JrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRPdmVydGltZVdvcmsoT2JqZWN0IHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkFjdHVhbCBXb3JrPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgYW1vdW50IG9mIGFjdHVhbCB3b3JrIHBlcmZvcm1lZCBieSB0aGUgcmVzb3VyY2UuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QWN0dWFsIFdvcms8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEFjdHVhbFdvcmsoT2JqZWN0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFJlc291cmNlX0FjdHVhbFdvcmsoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkR1cmF0aW9uIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdBY3R1YWxXb3JrJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JT2JqZWN0IGdldEFjdHVhbFdvcmsoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0QWN0dWFsV29yayA8ZW0+QWN0dWFsIFdvcms8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkFjdHVhbCBXb3JrPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRBY3R1YWxXb3JrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRBY3R1YWxXb3JrKE9iamVjdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SZW1haW5pbmcgV29yazwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGFtb3VudCBvZiByZW1haW5pbmcgd29yayByZXF1aXJlZCB0byBjb21wbGV0ZSBhbGwgYXNzaWduZWQgdGFza3MuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmVtYWluaW5nIFdvcms8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFJlbWFpbmluZ1dvcmsoT2JqZWN0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFJlc291cmNlX1JlbWFpbmluZ1dvcmsoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkR1cmF0aW9uIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdSZW1haW5pbmdXb3JrJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JT2JqZWN0IGdldFJlbWFpbmluZ1dvcmsoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0UmVtYWluaW5nV29yayA8ZW0+UmVtYWluaW5nIFdvcms8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlJlbWFpbmluZyBXb3JrPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRSZW1haW5pbmdXb3JrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRSZW1haW5pbmdXb3JrKE9iamVjdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BY3R1YWwgT3ZlcnRpbWUgV29yazwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGFtb3VudCBvZiBhY3R1YWwgb3ZlcnRpbWUgd29yayBwZXJmb3JtZWQgYnkgdGhlIHJlc291cmNlLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkFjdHVhbCBPdmVydGltZSBXb3JrPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRBY3R1YWxPdmVydGltZVdvcmsoT2JqZWN0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFJlc291cmNlX0FjdHVhbE92ZXJ0aW1lV29yaygpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRHVyYXRpb24iCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0FjdHVhbE92ZXJ0aW1lV29yaycgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU9iamVjdCBnZXRBY3R1YWxPdmVydGltZVdvcmsoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0QWN0dWFsT3ZlcnRpbWVXb3JrIDxlbT5BY3R1YWwgT3ZlcnRpbWUgV29yazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QWN0dWFsIE92ZXJ0aW1lIFdvcms8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEFjdHVhbE92ZXJ0aW1lV29yaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0QWN0dWFsT3ZlcnRpbWVXb3JrKE9iamVjdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SZW1haW5pbmcgT3ZlcnRpbWUgV29yazwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGFtb3VudCBvZiByZW1haW5pbmcgb3ZlcnRpbWUgd29yayByZXF1aXJlZCB0byBjb21wbGV0ZSBhbGwgdGFza3MuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmVtYWluaW5nIE92ZXJ0aW1lIFdvcms8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFJlbWFpbmluZ092ZXJ0aW1lV29yayhPYmplY3QpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UmVzb3VyY2VfUmVtYWluaW5nT3ZlcnRpbWVXb3JrKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EdXJhdGlvbiIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nUmVtYWluaW5nT3ZlcnRpbWVXb3JrJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JT2JqZWN0IGdldFJlbWFpbmluZ092ZXJ0aW1lV29yaygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRSZW1haW5pbmdPdmVydGltZVdvcmsgPGVtPlJlbWFpbmluZyBPdmVydGltZSBXb3JrPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5SZW1haW5pbmcgT3ZlcnRpbWUgV29yazwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UmVtYWluaW5nT3ZlcnRpbWVXb3JrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRSZW1haW5pbmdPdmVydGltZVdvcmsoT2JqZWN0IHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlBlcmNlbnQgV29yayBDb21wbGV0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHBlcmNlbnRhZ2Ugb2Ygd29yayBjb21wbGV0ZWQgYWNyb3NzIGFsbCB0YXNrcy4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QZXJjZW50IFdvcmsgQ29tcGxldGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFBlcmNlbnRXb3JrQ29tcGxldGUoQmlnSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRSZXNvdXJjZV9QZXJjZW50V29ya0NvbXBsZXRlKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5JbnRlZ2VyIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdQZXJjZW50V29ya0NvbXBsZXRlJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnSW50ZWdlciBnZXRQZXJjZW50V29ya0NvbXBsZXRlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldFBlcmNlbnRXb3JrQ29tcGxldGUgPGVtPlBlcmNlbnQgV29yayBDb21wbGV0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UGVyY2VudCBXb3JrIENvbXBsZXRlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRQZXJjZW50V29ya0NvbXBsZXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRQZXJjZW50V29ya0NvbXBsZXRlKEJpZ0ludGVnZXIgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U3RhbmRhcmQgUmF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHN0YW5kYXJkIHJhdGUgb2YgdGhlIHJlc291cmNlLiAKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgdmFsdWUgaXMgYXMgb2YgdGhlIGN1cnJlbnQgZGF0ZSBpZiBhIHJhdGUgdGFibGUgZXhpc3RzIGZvciB0aGUgcmVzb3VyY2UuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U3RhbmRhcmQgUmF0ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0U3RhbmRhcmRSYXRlKEJpZ0RlY2ltYWwpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UmVzb3VyY2VfU3RhbmRhcmRSYXRlKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EZWNpbWFsIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdTdGFuZGFyZFJhdGUnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdEZWNpbWFsIGdldFN0YW5kYXJkUmF0ZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRTdGFuZGFyZFJhdGUgPGVtPlN0YW5kYXJkIFJhdGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlN0YW5kYXJkIFJhdGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFN0YW5kYXJkUmF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0U3RhbmRhcmRSYXRlKEJpZ0RlY2ltYWwgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U3RhbmRhcmQgUmF0ZSBGb3JtYXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSB1bml0cyB1c2VkIGJ5IE1pY3Jvc29mdCBQcm9qZWN0IHRvIGRpc3BsYXkgdGhlIHN0YW5kYXJkIHJhdGUuICAKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE9bSwgMj1oLCAzPWQsIDQ9dywgNT1tbywgNz15LCA4PW1hdGVyaWFsIHJlc291cmNlIHJhdGUgKG9yIGJsYW5rIHN5bWJvbCBzcGVjaWZpZWQpCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U3RhbmRhcmQgUmF0ZSBGb3JtYXQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFN0YW5kYXJkUmF0ZUZvcm1hdChCaWdJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFJlc291cmNlX1N0YW5kYXJkUmF0ZUZvcm1hdCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlN0YW5kYXJkUmF0ZUZvcm1hdFR5cGUxIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdTdGFuZGFyZFJhdGVGb3JtYXQnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdJbnRlZ2VyIGdldFN0YW5kYXJkUmF0ZUZvcm1hdCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRTdGFuZGFyZFJhdGVGb3JtYXQgPGVtPlN0YW5kYXJkIFJhdGUgRm9ybWF0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TdGFuZGFyZCBSYXRlIEZvcm1hdDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0U3RhbmRhcmRSYXRlRm9ybWF0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRTdGFuZGFyZFJhdGVGb3JtYXQoQmlnSW50ZWdlciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Db3N0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgdG90YWwgcHJvamVjdCBjb3N0IGZvciB0aGUgcmVzb3VyY2UgYWNyb3NzIGFsbCBhc3NpZ25lZCB0YXNrcy4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Db3N0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRDb3N0KEJpZ0RlY2ltYWwpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UmVzb3VyY2VfQ29zdCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRGVjaW1hbCIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQ29zdCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0RlY2ltYWwgZ2V0Q29zdCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRDb3N0IDxlbT5Db3N0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Db3N0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRDb3N0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRDb3N0KEJpZ0RlY2ltYWwgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+T3ZlcnRpbWUgUmF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIG92ZXJ0aW1lIHJhdGUgb2YgdGhlIHJlc291cmNlLiAKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgdmFsdWUgaXMgYXMgb2YgdGhlIGN1cnJlbnQgZGF0ZSBpZiBhIHJhdGUgdGFibGUgZXhpc3RzIGZvciB0aGUgcmVzb3VyY2UuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+T3ZlcnRpbWUgUmF0ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0T3ZlcnRpbWVSYXRlKEJpZ0RlY2ltYWwpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UmVzb3VyY2VfT3ZlcnRpbWVSYXRlKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EZWNpbWFsIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdPdmVydGltZVJhdGUnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdEZWNpbWFsIGdldE92ZXJ0aW1lUmF0ZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRPdmVydGltZVJhdGUgPGVtPk92ZXJ0aW1lIFJhdGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk92ZXJ0aW1lIFJhdGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldE92ZXJ0aW1lUmF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0T3ZlcnRpbWVSYXRlKEJpZ0RlY2ltYWwgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+T3ZlcnRpbWUgUmF0ZSBGb3JtYXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSB1bml0cyB1c2VkIGJ5IE1pY3Jvc29mdCBQcm9qZWN0IHRvIGRpc3BsYXkgdGhlIG92ZXJ0aW1lIHJhdGUuICAKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE9bSwgMj1oLCAzPWQsIDQ9dywgNT1tbywgNz15Ci0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+T3ZlcnRpbWUgUmF0ZSBGb3JtYXQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldE92ZXJ0aW1lUmF0ZUZvcm1hdChCaWdJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFJlc291cmNlX092ZXJ0aW1lUmF0ZUZvcm1hdCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk92ZXJ0aW1lUmF0ZUZvcm1hdFR5cGUxIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdPdmVydGltZVJhdGVGb3JtYXQnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdJbnRlZ2VyIGdldE92ZXJ0aW1lUmF0ZUZvcm1hdCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRPdmVydGltZVJhdGVGb3JtYXQgPGVtPk92ZXJ0aW1lIFJhdGUgRm9ybWF0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5PdmVydGltZSBSYXRlIEZvcm1hdDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0T3ZlcnRpbWVSYXRlRm9ybWF0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRPdmVydGltZVJhdGVGb3JtYXQoQmlnSW50ZWdlciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5PdmVydGltZSBDb3N0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgdG90YWwgb3ZlcnRpbWUgY29zdCBmb3IgdGhlIHJlc291cmNlIGluY2x1ZGluZyBhY3R1YWwgYW5kIHJlbWFpbmluZyBvdmVydGltZSBjb3N0cy4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5PdmVydGltZSBDb3N0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRPdmVydGltZUNvc3QoQmlnRGVjaW1hbCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRSZXNvdXJjZV9PdmVydGltZUNvc3QoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkRlY2ltYWwiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J092ZXJ0aW1lQ29zdCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0RlY2ltYWwgZ2V0T3ZlcnRpbWVDb3N0KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldE92ZXJ0aW1lQ29zdCA8ZW0+T3ZlcnRpbWUgQ29zdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+T3ZlcnRpbWUgQ29zdDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0T3ZlcnRpbWVDb3N0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRPdmVydGltZUNvc3QoQmlnRGVjaW1hbCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Db3N0IFBlciBVc2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBjb3N0IHBlciB1c2Ugb2YgdGhlIHJlc291cmNlLiBUaGlzIHZhbHVlIGlzIGFzIG9mIHRoZSBjdXJyZW50IGRhdGUgaWYgYSByYXRlIHRhYmxlIAotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhpc3RzIGZvciB0aGUgcmVzb3VyY2UuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q29zdCBQZXIgVXNlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRDb3N0UGVyVXNlKEJpZ0RlY2ltYWwpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UmVzb3VyY2VfQ29zdFBlclVzZSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRGVjaW1hbCIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQ29zdFBlclVzZScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0RlY2ltYWwgZ2V0Q29zdFBlclVzZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRDb3N0UGVyVXNlIDxlbT5Db3N0IFBlciBVc2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNvc3QgUGVyIFVzZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0Q29zdFBlclVzZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Q29zdFBlclVzZShCaWdEZWNpbWFsIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkFjdHVhbCBDb3N0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgYWN0dWFsIGNvc3QgaW5jdXJyZWQgYnkgdGhlIHJlc291cmNlIGFjcm9zcyBhbGwgYXNzaWduZWQgdGFza3MuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QWN0dWFsIENvc3Q8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEFjdHVhbENvc3QoQmlnRGVjaW1hbCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRSZXNvdXJjZV9BY3R1YWxDb3N0KCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EZWNpbWFsIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdBY3R1YWxDb3N0JyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnRGVjaW1hbCBnZXRBY3R1YWxDb3N0KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldEFjdHVhbENvc3QgPGVtPkFjdHVhbCBDb3N0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BY3R1YWwgQ29zdDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0QWN0dWFsQ29zdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0QWN0dWFsQ29zdChCaWdEZWNpbWFsIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkFjdHVhbCBPdmVydGltZSBDb3N0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgYWN0dWFsIG92ZXJ0aW1lIGNvc3QgaW5jdXJyZWQgYnkgdGhlIHJlc291cmNlIGFjcm9zcyBhbGwgYXNzaWduZWQgdGFza3MuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QWN0dWFsIE92ZXJ0aW1lIENvc3Q8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEFjdHVhbE92ZXJ0aW1lQ29zdChCaWdEZWNpbWFsKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFJlc291cmNlX0FjdHVhbE92ZXJ0aW1lQ29zdCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRGVjaW1hbCIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQWN0dWFsT3ZlcnRpbWVDb3N0JyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnRGVjaW1hbCBnZXRBY3R1YWxPdmVydGltZUNvc3QoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0QWN0dWFsT3ZlcnRpbWVDb3N0IDxlbT5BY3R1YWwgT3ZlcnRpbWUgQ29zdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QWN0dWFsIE92ZXJ0aW1lIENvc3Q8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEFjdHVhbE92ZXJ0aW1lQ29zdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0QWN0dWFsT3ZlcnRpbWVDb3N0KEJpZ0RlY2ltYWwgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmVtYWluaW5nIENvc3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSByZW1haW5pbmcgcHJvamVjdGVkIGNvc3Qgb2YgdGhlIHJlc291cmNlIHRvIGNvbXBsZXRlIGFsbCBhc3NpZ25lZCB0YXNrcy4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZW1haW5pbmcgQ29zdDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UmVtYWluaW5nQ29zdChCaWdEZWNpbWFsKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFJlc291cmNlX1JlbWFpbmluZ0Nvc3QoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkRlY2ltYWwiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1JlbWFpbmluZ0Nvc3QnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdEZWNpbWFsIGdldFJlbWFpbmluZ0Nvc3QoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0UmVtYWluaW5nQ29zdCA8ZW0+UmVtYWluaW5nIENvc3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlJlbWFpbmluZyBDb3N0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRSZW1haW5pbmdDb3N0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRSZW1haW5pbmdDb3N0KEJpZ0RlY2ltYWwgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmVtYWluaW5nIE92ZXJ0aW1lIENvc3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSByZW1haW5pbmcgcHJvamVjdGVkIG92ZXJ0aW1lIGNvc3Qgb2YgdGhlIHJlc291cmNlIHRvIGNvbXBsZXRlIGFsbCBhc3NpZ25lZCB0YXNrcy4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZW1haW5pbmcgT3ZlcnRpbWUgQ29zdDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UmVtYWluaW5nT3ZlcnRpbWVDb3N0KEJpZ0RlY2ltYWwpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UmVzb3VyY2VfUmVtYWluaW5nT3ZlcnRpbWVDb3N0KCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EZWNpbWFsIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdSZW1haW5pbmdPdmVydGltZUNvc3QnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdEZWNpbWFsIGdldFJlbWFpbmluZ092ZXJ0aW1lQ29zdCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRSZW1haW5pbmdPdmVydGltZUNvc3QgPGVtPlJlbWFpbmluZyBPdmVydGltZSBDb3N0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5SZW1haW5pbmcgT3ZlcnRpbWUgQ29zdDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UmVtYWluaW5nT3ZlcnRpbWVDb3N0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRSZW1haW5pbmdPdmVydGltZUNvc3QoQmlnRGVjaW1hbCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Xb3JrIFZhcmlhbmNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBiYXNlbGluZSB3b3JrIGFuZCB0aGUgd29yayBhcyBtaW51dGVzIHggMTAwMC4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Xb3JrIFZhcmlhbmNlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldFdvcmtWYXJpYW5jZSgpCi0JICogQHNlZSAjdW5zZXRXb3JrVmFyaWFuY2UoKQotCSAqIEBzZWUgI3NldFdvcmtWYXJpYW5jZShmbG9hdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRSZXNvdXJjZV9Xb3JrVmFyaWFuY2UoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkZsb2F0IgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdXb3JrVmFyaWFuY2UnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlmbG9hdCBnZXRXb3JrVmFyaWFuY2UoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0V29ya1ZhcmlhbmNlIDxlbT5Xb3JrIFZhcmlhbmNlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Xb3JrIFZhcmlhbmNlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldFdvcmtWYXJpYW5jZSgpCi0JICogQHNlZSAjdW5zZXRXb3JrVmFyaWFuY2UoKQotCSAqIEBzZWUgI2dldFdvcmtWYXJpYW5jZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0V29ya1ZhcmlhbmNlKGZsb2F0IHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRXb3JrVmFyaWFuY2UgPGVtPldvcmsgVmFyaWFuY2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0V29ya1ZhcmlhbmNlKCkKLQkgKiBAc2VlICNnZXRXb3JrVmFyaWFuY2UoKQotCSAqIEBzZWUgI3NldFdvcmtWYXJpYW5jZShmbG9hdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldFdvcmtWYXJpYW5jZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldFdvcmtWYXJpYW5jZSA8ZW0+V29yayBWYXJpYW5jZTwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+V29yayBWYXJpYW5jZTwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0V29ya1ZhcmlhbmNlKCkKLQkgKiBAc2VlICNnZXRXb3JrVmFyaWFuY2UoKQotCSAqIEBzZWUgI3NldFdvcmtWYXJpYW5jZShmbG9hdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldFdvcmtWYXJpYW5jZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q29zdCBWYXJpYW5jZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgYmFzZWxpbmUgY29zdCBhbmQgdGhlIGNvc3QuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q29zdCBWYXJpYW5jZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRDb3N0VmFyaWFuY2UoKQotCSAqIEBzZWUgI3Vuc2V0Q29zdFZhcmlhbmNlKCkKLQkgKiBAc2VlICNzZXRDb3N0VmFyaWFuY2UoZmxvYXQpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UmVzb3VyY2VfQ29zdFZhcmlhbmNlKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5GbG9hdCIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQ29zdFZhcmlhbmNlJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JZmxvYXQgZ2V0Q29zdFZhcmlhbmNlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldENvc3RWYXJpYW5jZSA8ZW0+Q29zdCBWYXJpYW5jZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q29zdCBWYXJpYW5jZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRDb3N0VmFyaWFuY2UoKQotCSAqIEBzZWUgI3Vuc2V0Q29zdFZhcmlhbmNlKCkKLQkgKiBAc2VlICNnZXRDb3N0VmFyaWFuY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldENvc3RWYXJpYW5jZShmbG9hdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0Q29zdFZhcmlhbmNlIDxlbT5Db3N0IFZhcmlhbmNlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldENvc3RWYXJpYW5jZSgpCi0JICogQHNlZSAjZ2V0Q29zdFZhcmlhbmNlKCkKLQkgKiBAc2VlICNzZXRDb3N0VmFyaWFuY2UoZmxvYXQpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRDb3N0VmFyaWFuY2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRDb3N0VmFyaWFuY2UgPGVtPkNvc3QgVmFyaWFuY2U8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNvc3QgVmFyaWFuY2U8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldENvc3RWYXJpYW5jZSgpCi0JICogQHNlZSAjZ2V0Q29zdFZhcmlhbmNlKCkKLQkgKiBAc2VlICNzZXRDb3N0VmFyaWFuY2UoZmxvYXQpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRDb3N0VmFyaWFuY2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlNWPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBFYXJuZWQgdmFsdWUgc2NoZWR1bGUgdmFyaWFuY2UsIHRocm91Z2ggdGhlIHByb2plY3Qgc3RhdHVzIGRhdGUuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U1Y8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0U1YoKQotCSAqIEBzZWUgI3Vuc2V0U1YoKQotCSAqIEBzZWUgI3NldFNWKGZsb2F0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFJlc291cmNlX1NWKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5GbG9hdCIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nU1YnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlmbG9hdCBnZXRTVigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRTViA8ZW0+U1Y8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlNWPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldFNWKCkKLQkgKiBAc2VlICN1bnNldFNWKCkKLQkgKiBAc2VlICNnZXRTVigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0U1YoZmxvYXQgdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldFNWIDxlbT5TVjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRTVigpCi0JICogQHNlZSAjZ2V0U1YoKQotCSAqIEBzZWUgI3NldFNWKGZsb2F0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0U1YoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRTViA8ZW0+U1Y8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlNWPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRTVigpCi0JICogQHNlZSAjZ2V0U1YoKQotCSAqIEBzZWUgI3NldFNWKGZsb2F0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0U1YoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNWPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBFYXJuZWQgdmFsdWUgY29zdCB2YXJpYW5jZSwgdGhyb3VnaCB0aGUgcHJvamVjdCBzdGF0dXMgZGF0ZS4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5DVjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRDVigpCi0JICogQHNlZSAjdW5zZXRDVigpCi0JICogQHNlZSAjc2V0Q1YoZmxvYXQpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UmVzb3VyY2VfQ1YoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkZsb2F0IgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdDVicgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWZsb2F0IGdldENWKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldENWIDxlbT5DVjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q1Y8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0Q1YoKQotCSAqIEBzZWUgI3Vuc2V0Q1YoKQotCSAqIEBzZWUgI2dldENWKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRDVihmbG9hdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0Q1YgPGVtPkNWPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldENWKCkKLQkgKiBAc2VlICNnZXRDVigpCi0JICogQHNlZSAjc2V0Q1YoZmxvYXQpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRDVigpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldENWIDxlbT5DVjwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q1Y8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldENWKCkKLQkgKiBAc2VlICNnZXRDVigpCi0JICogQHNlZSAjc2V0Q1YoZmxvYXQpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRDVigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QUNXUDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGFjdHVhbCBjb3N0IG9mIHRoZSB3b3JrIHBlcmZvcm1lZCBieSB0aGUgcmVzb3VyY2UgZm9yIHRoZSBwcm9qZWN0IHRvLWRhdGUuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QUNXUDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRBQ1dQKCkKLQkgKiBAc2VlICN1bnNldEFDV1AoKQotCSAqIEBzZWUgI3NldEFDV1AoZmxvYXQpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UmVzb3VyY2VfQUNXUCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRmxvYXQiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0FDV1AnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlmbG9hdCBnZXRBQ1dQKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldEFDV1AgPGVtPkFDV1A8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkFDV1A8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0QUNXUCgpCi0JICogQHNlZSAjdW5zZXRBQ1dQKCkKLQkgKiBAc2VlICNnZXRBQ1dQKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRBQ1dQKGZsb2F0IHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRBQ1dQIDxlbT5BQ1dQPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldEFDV1AoKQotCSAqIEBzZWUgI2dldEFDV1AoKQotCSAqIEBzZWUgI3NldEFDV1AoZmxvYXQpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRBQ1dQKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0QUNXUCA8ZW0+QUNXUDwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QUNXUDwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0QUNXUCgpCi0JICogQHNlZSAjZ2V0QUNXUCgpCi0JICogQHNlZSAjc2V0QUNXUChmbG9hdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldEFDV1AoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNhbGVuZGFyIFVJRDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHJlc291cmNlIGNhbGVuZGFyLlJlZmVycyB0byBhIHZhbGlkIFVJRCBpbiB0aGUgQ2FsZW5kYXJzIGVsZW1lbnQgb2YgCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgTWljcm9zb2Z0IFByb2plY3QgWE1MIFNjaGVtYS4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5DYWxlbmRhciBVSUQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldENhbGVuZGFyVUlEKEJpZ0ludGVnZXIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UmVzb3VyY2VfQ2FsZW5kYXJVSUQoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkludGVnZXIiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0NhbGVuZGFyVUlEJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnSW50ZWdlciBnZXRDYWxlbmRhclVJRCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRDYWxlbmRhclVJRCA8ZW0+Q2FsZW5kYXIgVUlEPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5DYWxlbmRhciBVSUQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldENhbGVuZGFyVUlEKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRDYWxlbmRhclVJRChCaWdJbnRlZ2VyIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk5vdGVzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUZXh0IG5vdGVzIGFzc29jaWF0ZWQgd2l0aCB0aGUgcmVzb3VyY2UuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Tm90ZXM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldE5vdGVzKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRSZXNvdXJjZV9Ob3RlcygpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdOb3RlcycgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXROb3RlcygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXROb3RlcyA8ZW0+Tm90ZXM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk5vdGVzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXROb3RlcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Tm90ZXMoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkJDV1M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBidWRnZXQgY29zdCBvZiB3b3JrIHNjaGVkdWxlZCBmb3IgdGhlIHJlc291cmNlLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkJDV1M8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0QkNXUygpCi0JICogQHNlZSAjdW5zZXRCQ1dTKCkKLQkgKiBAc2VlICNzZXRCQ1dTKGZsb2F0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFJlc291cmNlX0JDV1MoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkZsb2F0IgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdCQ1dTJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JZmxvYXQgZ2V0QkNXUygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRCQ1dTIDxlbT5CQ1dTPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5CQ1dTPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldEJDV1MoKQotCSAqIEBzZWUgI3Vuc2V0QkNXUygpCi0JICogQHNlZSAjZ2V0QkNXUygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0QkNXUyhmbG9hdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0QkNXUyA8ZW0+QkNXUzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRCQ1dTKCkKLQkgKiBAc2VlICNnZXRCQ1dTKCkKLQkgKiBAc2VlICNzZXRCQ1dTKGZsb2F0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0QkNXUygpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldEJDV1MgPGVtPkJDV1M8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkJDV1M8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldEJDV1MoKQotCSAqIEBzZWUgI2dldEJDV1MoKQotCSAqIEBzZWUgI3NldEJDV1MoZmxvYXQpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRCQ1dTKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5CQ1dQPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgYnVkZ2V0ZWQgY29zdCBvZiBvZiB0aGUgd29yayBwZXJmb3JtZWQgYnkgdGhlIHJlc291cmNlIGZvciB0aGUgcHJvamVjdCB0by1kYXRlLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkJDV1A8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0QkNXUCgpCi0JICogQHNlZSAjdW5zZXRCQ1dQKCkKLQkgKiBAc2VlICNzZXRCQ1dQKGZsb2F0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFJlc291cmNlX0JDV1AoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkZsb2F0IgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdCQ1dQJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JZmxvYXQgZ2V0QkNXUCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRCQ1dQIDxlbT5CQ1dQPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5CQ1dQPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldEJDV1AoKQotCSAqIEBzZWUgI3Vuc2V0QkNXUCgpCi0JICogQHNlZSAjZ2V0QkNXUCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0QkNXUChmbG9hdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0QkNXUCA8ZW0+QkNXUDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRCQ1dQKCkKLQkgKiBAc2VlICNnZXRCQ1dQKCkKLQkgKiBAc2VlICNzZXRCQ1dQKGZsb2F0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0QkNXUCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldEJDV1AgPGVtPkJDV1A8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkJDV1A8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldEJDV1AoKQotCSAqIEBzZWUgI2dldEJDV1AoKQotCSAqIEBzZWUgI3NldEJDV1AoZmxvYXQpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRCQ1dQKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JcyBHZW5lcmljPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBTcGVjaWZpZXMgd2hldGhlciB0aGUgcmVzb3VyY2UgaXMgZ2VuZXJpYy4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JcyBHZW5lcmljPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldElzR2VuZXJpYygpCi0JICogQHNlZSAjdW5zZXRJc0dlbmVyaWMoKQotCSAqIEBzZWUgI3NldElzR2VuZXJpYyhib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFJlc291cmNlX0lzR2VuZXJpYygpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbiIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nSXNHZW5lcmljJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc0lzR2VuZXJpYygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNpc0lzR2VuZXJpYyA8ZW0+SXMgR2VuZXJpYzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SXMgR2VuZXJpYzwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRJc0dlbmVyaWMoKQotCSAqIEBzZWUgI3Vuc2V0SXNHZW5lcmljKCkKLQkgKiBAc2VlICNpc0lzR2VuZXJpYygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0SXNHZW5lcmljKGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2lzSXNHZW5lcmljIDxlbT5JcyBHZW5lcmljPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldElzR2VuZXJpYygpCi0JICogQHNlZSAjaXNJc0dlbmVyaWMoKQotCSAqIEBzZWUgI3NldElzR2VuZXJpYyhib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0SXNHZW5lcmljKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjaXNJc0dlbmVyaWMgPGVtPklzIEdlbmVyaWM8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPklzIEdlbmVyaWM8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldElzR2VuZXJpYygpCi0JICogQHNlZSAjaXNJc0dlbmVyaWMoKQotCSAqIEBzZWUgI3NldElzR2VuZXJpYyhib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0SXNHZW5lcmljKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JcyBJbmFjdGl2ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogU3BlY2lmaWVzIHdoZXRoZXIgdGhlIHJlc291cmNlIGlzIHNldCB0byBpbmFjdGl2ZS4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JcyBJbmFjdGl2ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRJc0luYWN0aXZlKCkKLQkgKiBAc2VlICN1bnNldElzSW5hY3RpdmUoKQotCSAqIEBzZWUgI3NldElzSW5hY3RpdmUoYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRSZXNvdXJjZV9Jc0luYWN0aXZlKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdJc0luYWN0aXZlJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc0lzSW5hY3RpdmUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjaXNJc0luYWN0aXZlIDxlbT5JcyBJbmFjdGl2ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SXMgSW5hY3RpdmU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0SXNJbmFjdGl2ZSgpCi0JICogQHNlZSAjdW5zZXRJc0luYWN0aXZlKCkKLQkgKiBAc2VlICNpc0lzSW5hY3RpdmUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldElzSW5hY3RpdmUoYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjaXNJc0luYWN0aXZlIDxlbT5JcyBJbmFjdGl2ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRJc0luYWN0aXZlKCkKLQkgKiBAc2VlICNpc0lzSW5hY3RpdmUoKQotCSAqIEBzZWUgI3NldElzSW5hY3RpdmUoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldElzSW5hY3RpdmUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNpc0lzSW5hY3RpdmUgPGVtPklzIEluYWN0aXZlPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JcyBJbmFjdGl2ZTwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0SXNJbmFjdGl2ZSgpCi0JICogQHNlZSAjaXNJc0luYWN0aXZlKCkKLQkgKiBAc2VlICNzZXRJc0luYWN0aXZlKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRJc0luYWN0aXZlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JcyBFbnRlcnByaXNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBTcGVjaWZpZXMgd2hldGhlciB0aGUgcmVzb3VyY2UgaXMgYW4gRW50ZXJwcmlzZSByZXNvdXJjZS4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JcyBFbnRlcnByaXNlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldElzRW50ZXJwcmlzZSgpCi0JICogQHNlZSAjdW5zZXRJc0VudGVycHJpc2UoKQotCSAqIEBzZWUgI3NldElzRW50ZXJwcmlzZShib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFJlc291cmNlX0lzRW50ZXJwcmlzZSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbiIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nSXNFbnRlcnByaXNlJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc0lzRW50ZXJwcmlzZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNpc0lzRW50ZXJwcmlzZSA8ZW0+SXMgRW50ZXJwcmlzZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SXMgRW50ZXJwcmlzZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRJc0VudGVycHJpc2UoKQotCSAqIEBzZWUgI3Vuc2V0SXNFbnRlcnByaXNlKCkKLQkgKiBAc2VlICNpc0lzRW50ZXJwcmlzZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0SXNFbnRlcnByaXNlKGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2lzSXNFbnRlcnByaXNlIDxlbT5JcyBFbnRlcnByaXNlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldElzRW50ZXJwcmlzZSgpCi0JICogQHNlZSAjaXNJc0VudGVycHJpc2UoKQotCSAqIEBzZWUgI3NldElzRW50ZXJwcmlzZShib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0SXNFbnRlcnByaXNlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjaXNJc0VudGVycHJpc2UgPGVtPklzIEVudGVycHJpc2U8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPklzIEVudGVycHJpc2U8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldElzRW50ZXJwcmlzZSgpCi0JICogQHNlZSAjaXNJc0VudGVycHJpc2UoKQotCSAqIEBzZWUgI3NldElzRW50ZXJwcmlzZShib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0SXNFbnRlcnByaXNlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Cb29raW5nIFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFNwZWNpZmllcyB0aGUgYm9va2luZyB0eXBlIG9mIHRoZSByZXNvdXJjZS4gMT1Db21taXRlZCwgMj1Qcm9wb3NlZAotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkJvb2tpbmcgVHlwZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0Qm9va2luZ1R5cGUoQmlnSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRSZXNvdXJjZV9Cb29raW5nVHlwZSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJvb2tpbmdUeXBlVHlwZTEiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0Jvb2tpbmdUeXBlJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnSW50ZWdlciBnZXRCb29raW5nVHlwZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRCb29raW5nVHlwZSA8ZW0+Qm9va2luZyBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Cb29raW5nIFR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEJvb2tpbmdUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRCb29raW5nVHlwZShCaWdJbnRlZ2VyIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkFjdHVhbCBXb3JrIFByb3RlY3RlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogU3BlY2lmaWVzIHRoZSBkdXJhdGlvbiB0aHJvdWdoIHdoaWNoIGFjdHVhbCB3b3JrIGlzIHByb3RlY3RlZC4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BY3R1YWwgV29yayBQcm90ZWN0ZWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEFjdHVhbFdvcmtQcm90ZWN0ZWQoT2JqZWN0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFJlc291cmNlX0FjdHVhbFdvcmtQcm90ZWN0ZWQoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkR1cmF0aW9uIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdBY3R1YWxXb3JrUHJvdGVjdGVkJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JT2JqZWN0IGdldEFjdHVhbFdvcmtQcm90ZWN0ZWQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0QWN0dWFsV29ya1Byb3RlY3RlZCA8ZW0+QWN0dWFsIFdvcmsgUHJvdGVjdGVkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BY3R1YWwgV29yayBQcm90ZWN0ZWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEFjdHVhbFdvcmtQcm90ZWN0ZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEFjdHVhbFdvcmtQcm90ZWN0ZWQoT2JqZWN0IHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkFjdHVhbCBPdmVydGltZSBXb3JrIFByb3RlY3RlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogU3BlY2lmaWVzIHRoZSBkdXJhdGlvbiB0aHJvdWdoIHdoaWNoIGFjdHVhbCBvdmVydGltZSB3b3JrIGlzIHByb3RlY3RlZC4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BY3R1YWwgT3ZlcnRpbWUgV29yayBQcm90ZWN0ZWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEFjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZChPYmplY3QpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UmVzb3VyY2VfQWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EdXJhdGlvbiIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JT2JqZWN0IGdldEFjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRBY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQgPGVtPkFjdHVhbCBPdmVydGltZSBXb3JrIFByb3RlY3RlZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QWN0dWFsIE92ZXJ0aW1lIFdvcmsgUHJvdGVjdGVkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRBY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEFjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZChPYmplY3QgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QWN0aXZlIERpcmVjdG9yeSBHVUlEPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgQWN0aXZlIERpcmVjdG9yeSBHVUlEIGZvciB0aGUgcmVzb3VyY2UuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QWN0aXZlIERpcmVjdG9yeSBHVUlEPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRBY3RpdmVEaXJlY3RvcnlHVUlEKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRSZXNvdXJjZV9BY3RpdmVEaXJlY3RvcnlHVUlEKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQWN0aXZlRGlyZWN0b3J5R1VJRFR5cGUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0FjdGl2ZURpcmVjdG9yeUdVSUQnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0QWN0aXZlRGlyZWN0b3J5R1VJRCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRBY3RpdmVEaXJlY3RvcnlHVUlEIDxlbT5BY3RpdmUgRGlyZWN0b3J5IEdVSUQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkFjdGl2ZSBEaXJlY3RvcnkgR1VJRDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0QWN0aXZlRGlyZWN0b3J5R1VJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0QWN0aXZlRGlyZWN0b3J5R1VJRChTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q3JlYXRpb24gRGF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGRhdGUgdGhhdCB0aGUgcmVzb3VyY2Ugd2FzIGNyZWF0ZWQuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q3JlYXRpb24gRGF0ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0Q3JlYXRpb25EYXRlKE9iamVjdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRSZXNvdXJjZV9DcmVhdGlvbkRhdGUoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkRhdGVUaW1lIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdDcmVhdGlvbkRhdGUnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlPYmplY3QgZ2V0Q3JlYXRpb25EYXRlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldENyZWF0aW9uRGF0ZSA8ZW0+Q3JlYXRpb24gRGF0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q3JlYXRpb24gRGF0ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0Q3JlYXRpb25EYXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRDcmVhdGlvbkRhdGUoT2JqZWN0IHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkV4dGVuZGVkIEF0dHJpYnV0ZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUzfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSB2YWx1ZSBvZiBhbiBleHRlbmRlZCBhdHRyaWJ1dGUuICBUd28gcGllY2VzIG9mIGRhdGEgYXJlIG5lY2Vzc2FyeSAtIAotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYSBwb2ludGVyIGJhY2sgdG8gdGhlIGV4dGVuZGVkIGF0dHJpYnV0ZSB0YWJsZSB3aGljaCBpcyBzcGVjaWZpZWQgZWl0aGVyIGJ5IHRoZSB1bmlxdWUgSUQgb3IgdGhlIEZpZWxkIElELCAKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCB0aGUgdmFsdWUgd2hpY2ggaXMgc3BlY2lmaWVkIGVpdGhlciB3aXRoIHRoZSB2YWx1ZSwgb3IgYSBwb2ludGVyIGJhY2sgdG8gdGhlIHZhbHVlIGxpc3QuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RXh0ZW5kZWQgQXR0cmlidXRlPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFJlc291cmNlX0V4dGVuZGVkQXR0cmlidXRlKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZTMiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0V4dGVuZGVkQXR0cmlidXRlJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkJhc2VsaW5lPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZTJ9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGJhc2VsaW5lIHZhbHVlcyBmb3IgdGhlIHJlc291cmNlcy4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5CYXNlbGluZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRSZXNvdXJjZV9CYXNlbGluZSgpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUyIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdCYXNlbGluZScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldEJhc2VsaW5lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5PdXRsaW5lIENvZGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlM30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgdmFsdWUgb2YgYW4gb3V0bGluZSBjb2RlLiAgVHdvIHBpZWNlcyBvZiBkYXRhIGFyZSBuZWNlc3NhcnkgLSBhIHBvaW50ZXIgYmFjayB0byAKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBvdXRsaW5lIGNvZGUgdGFibGUgd2hpY2ggaXMgc3BlY2lmaWVkIGVpdGhlciBieSB0aGUgdW5pcXVlIElEIG9yIHRoZSBGaWVsZCBJRCwgYW5kIHRoZSB2YWx1ZSB3aGljaCBpcyAKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNpZmllZCBlaXRoZXIgd2l0aCB0aGUgdmFsdWUsIG9yIGEgcG9pbnRlciBiYWNrIHRvIHRoZSB2YWx1ZSBsaXN0LgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk91dGxpbmUgQ29kZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRSZXNvdXJjZV9PdXRsaW5lQ29kZSgpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGUzIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdPdXRsaW5lQ29kZScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldE91dGxpbmVDb2RlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BdmFpbGFiaWxpdHkgUGVyaW9kczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogQSBjb2xsZWN0aW9uIG9mIHBlcmlvZHMgZHVyaW5nIHdoaWNoIHRoZSByZXNvdXJjZSBpcyBhdmFpbGFibGUuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QXZhaWxhYmlsaXR5IFBlcmlvZHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldEF2YWlsYWJpbGl0eVBlcmlvZHMoQXZhaWxhYmlsaXR5UGVyaW9kcykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRSZXNvdXJjZV9BdmFpbGFiaWxpdHlQZXJpb2RzKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQXZhaWxhYmlsaXR5UGVyaW9kcycgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUF2YWlsYWJpbGl0eVBlcmlvZHMgZ2V0QXZhaWxhYmlsaXR5UGVyaW9kcygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRBdmFpbGFiaWxpdHlQZXJpb2RzIDxlbT5BdmFpbGFiaWxpdHkgUGVyaW9kczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QXZhaWxhYmlsaXR5IFBlcmlvZHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldEF2YWlsYWJpbGl0eVBlcmlvZHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEF2YWlsYWJpbGl0eVBlcmlvZHMoQXZhaWxhYmlsaXR5UGVyaW9kcyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SYXRlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogQSBjb2xsZWN0aW9uIG9mIHBlcmlvZHMgYW5kIHRoZSByYXRlcyBhc3NvY2lhdGVkIHdpdGggZWFjaCBvbmUuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmF0ZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFJhdGVzKFJhdGVzKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFJlc291cmNlX1JhdGVzKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nUmF0ZXMnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlSYXRlcyBnZXRSYXRlcygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRSYXRlcyA8ZW0+UmF0ZXM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlJhdGVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRSYXRlcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UmF0ZXMoUmF0ZXMgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VGltZXBoYXNlZCBEYXRhPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UaW1lcGhhc2VkRGF0YVR5cGV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHRpbWUgcGhhc2VkIGRhdGEKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5UaW1lcGhhc2VkIERhdGE8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UmVzb3VyY2VfVGltZXBoYXNlZERhdGEoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRpbWVwaGFzZWREYXRhVHlwZSIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nVGltZXBoYXNlZERhdGEnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXRUaW1lcGhhc2VkRGF0YSgpOwotCi19IC8vIFJlc291cmNlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L1Jlc291cmNlcy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9SZXNvdXJjZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzZiZjZmMS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L1Jlc291cmNlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBSZXNvdXJjZXMuamF2YSx2IDEuMSAyMDA4LzAxLzE1IDA4OjUyOjQ2IGp0aGFtIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UmVzb3VyY2VzPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2VzI2dldFJlc291cmNlIDxlbT5SZXNvdXJjZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFJlc291cmNlcygpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nUmVzb3VyY2VzXy5fdHlwZScga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFJlc291cmNlcyBleHRlbmRzIEVPYmplY3QgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJlc291cmNlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGVyZSBtdXN0IGJlIGF0IGxlYXN0IG9uZSByZXNvdXJjZSBpbiBlYWNoIFJlc291cmNlcyBjb2xsZWN0aW9uLgotCSAqICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJlc291cmNlPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFJlc291cmNlc19SZXNvdXJjZSgpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1Jlc291cmNlJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0UmVzb3VyY2UoKTsKLQotfSAvLyBSZXNvdXJjZXMKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvVGFzay5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9UYXNrLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwYjQxMjkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9UYXNrLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMTcxICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogVGFzay5qYXZhLHYgMS4xIDIwMDgvMDEvMTUgMDg6NTI6NDYganRoYW0gRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0OwotCi1pbXBvcnQgamF2YS5tYXRoLkJpZ0RlY2ltYWw7Ci1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlRhc2s8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldFVJRCA8ZW0+VUlEPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0SUQgPGVtPklEPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldFR5cGUgPGVtPlR5cGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNpc0lzTnVsbCA8ZW0+SXMgTnVsbDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldENyZWF0ZURhdGUgPGVtPkNyZWF0ZSBEYXRlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0Q29udGFjdCA8ZW0+Q29udGFjdDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldFdCUyA8ZW0+V0JTPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0V0JTTGV2ZWwgPGVtPldCUyBMZXZlbDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldE91dGxpbmVOdW1iZXIgPGVtPk91dGxpbmUgTnVtYmVyPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0T3V0bGluZUxldmVsIDxlbT5PdXRsaW5lIExldmVsPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0UHJpb3JpdHkgPGVtPlByaW9yaXR5PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0U3RhcnQgPGVtPlN0YXJ0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0RmluaXNoIDxlbT5GaW5pc2g8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXREdXJhdGlvbiA8ZW0+RHVyYXRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXREdXJhdGlvbkZvcm1hdCA8ZW0+RHVyYXRpb24gRm9ybWF0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0V29yayA8ZW0+V29yazwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldFN0b3AgPGVtPlN0b3A8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRSZXN1bWUgPGVtPlJlc3VtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2lzUmVzdW1lVmFsaWQgPGVtPlJlc3VtZSBWYWxpZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2lzRWZmb3J0RHJpdmVuIDxlbT5FZmZvcnQgRHJpdmVuPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjaXNSZWN1cnJpbmcgPGVtPlJlY3VycmluZzwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2lzT3ZlckFsbG9jYXRlZCA8ZW0+T3ZlciBBbGxvY2F0ZWQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNpc0VzdGltYXRlZCA8ZW0+RXN0aW1hdGVkPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjaXNNaWxlc3RvbmUgPGVtPk1pbGVzdG9uZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2lzU3VtbWFyeSA8ZW0+U3VtbWFyeTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2lzQ3JpdGljYWwgPGVtPkNyaXRpY2FsPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjaXNJc1N1YnByb2plY3QgPGVtPklzIFN1YnByb2plY3Q8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNpc0lzU3VicHJvamVjdFJlYWRPbmx5IDxlbT5JcyBTdWJwcm9qZWN0IFJlYWQgT25seTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldFN1YnByb2plY3ROYW1lIDxlbT5TdWJwcm9qZWN0IE5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNpc0V4dGVybmFsVGFzayA8ZW0+RXh0ZXJuYWwgVGFzazwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldEV4dGVybmFsVGFza1Byb2plY3QgPGVtPkV4dGVybmFsIFRhc2sgUHJvamVjdDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldEVhcmx5U3RhcnQgPGVtPkVhcmx5IFN0YXJ0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0RWFybHlGaW5pc2ggPGVtPkVhcmx5IEZpbmlzaDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldExhdGVTdGFydCA8ZW0+TGF0ZSBTdGFydDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldExhdGVGaW5pc2ggPGVtPkxhdGUgRmluaXNoPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0U3RhcnRWYXJpYW5jZSA8ZW0+U3RhcnQgVmFyaWFuY2U8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRGaW5pc2hWYXJpYW5jZSA8ZW0+RmluaXNoIFZhcmlhbmNlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0V29ya1ZhcmlhbmNlIDxlbT5Xb3JrIFZhcmlhbmNlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0RnJlZVNsYWNrIDxlbT5GcmVlIFNsYWNrPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0VG90YWxTbGFjayA8ZW0+VG90YWwgU2xhY2s8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRGaXhlZENvc3QgPGVtPkZpeGVkIENvc3Q8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRGaXhlZENvc3RBY2NydWFsIDxlbT5GaXhlZCBDb3N0IEFjY3J1YWw8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRQZXJjZW50Q29tcGxldGUgPGVtPlBlcmNlbnQgQ29tcGxldGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRQZXJjZW50V29ya0NvbXBsZXRlIDxlbT5QZXJjZW50IFdvcmsgQ29tcGxldGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRDb3N0IDxlbT5Db3N0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0T3ZlcnRpbWVDb3N0IDxlbT5PdmVydGltZSBDb3N0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0T3ZlcnRpbWVXb3JrIDxlbT5PdmVydGltZSBXb3JrPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0QWN0dWFsU3RhcnQgPGVtPkFjdHVhbCBTdGFydDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldEFjdHVhbEZpbmlzaCA8ZW0+QWN0dWFsIEZpbmlzaDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldEFjdHVhbER1cmF0aW9uIDxlbT5BY3R1YWwgRHVyYXRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRBY3R1YWxDb3N0IDxlbT5BY3R1YWwgQ29zdDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldEFjdHVhbE92ZXJ0aW1lQ29zdCA8ZW0+QWN0dWFsIE92ZXJ0aW1lIENvc3Q8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRBY3R1YWxXb3JrIDxlbT5BY3R1YWwgV29yazwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldEFjdHVhbE92ZXJ0aW1lV29yayA8ZW0+QWN0dWFsIE92ZXJ0aW1lIFdvcms8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRSZWd1bGFyV29yayA8ZW0+UmVndWxhciBXb3JrPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0UmVtYWluaW5nRHVyYXRpb24gPGVtPlJlbWFpbmluZyBEdXJhdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldFJlbWFpbmluZ0Nvc3QgPGVtPlJlbWFpbmluZyBDb3N0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0UmVtYWluaW5nV29yayA8ZW0+UmVtYWluaW5nIFdvcms8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRSZW1haW5pbmdPdmVydGltZUNvc3QgPGVtPlJlbWFpbmluZyBPdmVydGltZSBDb3N0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0UmVtYWluaW5nT3ZlcnRpbWVXb3JrIDxlbT5SZW1haW5pbmcgT3ZlcnRpbWUgV29yazwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldEFDV1AgPGVtPkFDV1A8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRDViA8ZW0+Q1Y8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRDb25zdHJhaW50VHlwZSA8ZW0+Q29uc3RyYWludCBUeXBlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0Q2FsZW5kYXJVSUQgPGVtPkNhbGVuZGFyIFVJRDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldENvbnN0cmFpbnREYXRlIDxlbT5Db25zdHJhaW50IERhdGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXREZWFkbGluZSA8ZW0+RGVhZGxpbmU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNpc0xldmVsQXNzaWdubWVudHMgPGVtPkxldmVsIEFzc2lnbm1lbnRzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjaXNMZXZlbGluZ0NhblNwbGl0IDxlbT5MZXZlbGluZyBDYW4gU3BsaXQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRMZXZlbGluZ0RlbGF5IDxlbT5MZXZlbGluZyBEZWxheTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldExldmVsaW5nRGVsYXlGb3JtYXQgPGVtPkxldmVsaW5nIERlbGF5IEZvcm1hdDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldFByZUxldmVsZWRTdGFydCA8ZW0+UHJlIExldmVsZWQgU3RhcnQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRQcmVMZXZlbGVkRmluaXNoIDxlbT5QcmUgTGV2ZWxlZCBGaW5pc2g8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRIeXBlcmxpbmsgPGVtPkh5cGVybGluazwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldEh5cGVybGlua0FkZHJlc3MgPGVtPkh5cGVybGluayBBZGRyZXNzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0SHlwZXJsaW5rU3ViQWRkcmVzcyA8ZW0+SHlwZXJsaW5rIFN1YiBBZGRyZXNzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjaXNJZ25vcmVSZXNvdXJjZUNhbGVuZGFyIDxlbT5JZ25vcmUgUmVzb3VyY2UgQ2FsZW5kYXI8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXROb3RlcyA8ZW0+Tm90ZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNpc0hpZGVCYXIgPGVtPkhpZGUgQmFyPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjaXNSb2xsdXAgPGVtPlJvbGx1cDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldEJDV1MgPGVtPkJDV1M8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRCQ1dQIDxlbT5CQ1dQPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0UGh5c2ljYWxQZXJjZW50Q29tcGxldGUgPGVtPlBoeXNpY2FsIFBlcmNlbnQgQ29tcGxldGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRFYXJuZWRWYWx1ZU1ldGhvZCA8ZW0+RWFybmVkIFZhbHVlIE1ldGhvZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldFByZWRlY2Vzc29yTGluayA8ZW0+UHJlZGVjZXNzb3IgTGluazwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldEFjdHVhbFdvcmtQcm90ZWN0ZWQgPGVtPkFjdHVhbCBXb3JrIFByb3RlY3RlZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldEFjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZCA8ZW0+QWN0dWFsIE92ZXJ0aW1lIFdvcmsgUHJvdGVjdGVkPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUgPGVtPkV4dGVuZGVkIEF0dHJpYnV0ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldEJhc2VsaW5lIDxlbT5CYXNlbGluZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldE91dGxpbmVDb2RlIDxlbT5PdXRsaW5lIENvZGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRUaW1lcGhhc2VkRGF0YSA8ZW0+VGltZXBoYXNlZCBEYXRhPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VGFzaygpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nVGFza18uX3R5cGUnIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBUYXNrIGV4dGVuZHMgRU9iamVjdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VUlEPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgdW5pcXVlIElEIG9mIHRoZSB0YXNrLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlVJRDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0VUlEKEJpZ0ludGVnZXIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VGFza19VSUQoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkludGVnZXIiIHJlcXVpcmVkPSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdVSUQnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdJbnRlZ2VyIGdldFVJRCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldFVJRCA8ZW0+VUlEPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5VSUQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFVJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VUlEKEJpZ0ludGVnZXIgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SUQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBwb3NpdGlvbiBpZGVudGlmaWVyIG9mIHRoZSB0YXNrIHdpdGhpbiB0aGUgbGlzdCBvZiB0YXNrcy4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JRDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0SUQoQmlnSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRUYXNrX0lEKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5JbnRlZ2VyIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdJRCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0ludGVnZXIgZ2V0SUQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRJRCA8ZW0+SUQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPklEPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0SUQoQmlnSW50ZWdlciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgbmFtZSBvZiB0aGUgdGFzay4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXROYW1lKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRUYXNrX05hbWUoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5OYW1lVHlwZTIiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J05hbWUnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0TmFtZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldE5hbWUgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldE5hbWUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSB0eXBlIG9mIHRhc2suIAotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVzIGFyZTogMD1GaXhlZCBVbml0cywgMT1GaXhlZCBEdXJhdGlvbiwgMj1GaXhlZCBXb3JrLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFR5cGUoQmlnSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRUYXNrX1R5cGUoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UeXBlVHlwZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nVHlwZScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0ludGVnZXIgZ2V0VHlwZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldFR5cGUgPGVtPlR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFR5cGUoQmlnSW50ZWdlciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JcyBOdWxsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBTcGVjaWZpZXMgd2hldGhlciB0aGUgdGFzayBpcyBudWxsLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPklzIE51bGw8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0SXNOdWxsKCkKLQkgKiBAc2VlICN1bnNldElzTnVsbCgpCi0JICogQHNlZSAjc2V0SXNOdWxsKGJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VGFza19Jc051bGwoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW4iCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0lzTnVsbCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNJc051bGwoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNpc0lzTnVsbCA8ZW0+SXMgTnVsbDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SXMgTnVsbDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRJc051bGwoKQotCSAqIEBzZWUgI3Vuc2V0SXNOdWxsKCkKLQkgKiBAc2VlICNpc0lzTnVsbCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0SXNOdWxsKGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjaXNJc051bGwgPGVtPklzIE51bGw8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0SXNOdWxsKCkKLQkgKiBAc2VlICNpc0lzTnVsbCgpCi0JICogQHNlZSAjc2V0SXNOdWxsKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRJc051bGwoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2lzSXNOdWxsIDxlbT5JcyBOdWxsPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JcyBOdWxsPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRJc051bGwoKQotCSAqIEBzZWUgI2lzSXNOdWxsKCkKLQkgKiBAc2VlICNzZXRJc051bGwoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldElzTnVsbCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q3JlYXRlIERhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBkYXRlIHRoYXQgdGhlIHRhc2sgd2FzIGNyZWF0ZWQuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q3JlYXRlIERhdGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldENyZWF0ZURhdGUoT2JqZWN0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFRhc2tfQ3JlYXRlRGF0ZSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRGF0ZVRpbWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0NyZWF0ZURhdGUnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlPYmplY3QgZ2V0Q3JlYXRlRGF0ZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldENyZWF0ZURhdGUgPGVtPkNyZWF0ZSBEYXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5DcmVhdGUgRGF0ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0Q3JlYXRlRGF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Q3JlYXRlRGF0ZShPYmplY3QgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q29udGFjdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGNvbnRhY3QgcGVyc29uIGZvciB0aGUgdGFzay4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Db250YWN0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRDb250YWN0KFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRUYXNrX0NvbnRhY3QoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Db250YWN0VHlwZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQ29udGFjdCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRDb250YWN0KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0Q29udGFjdCA8ZW0+Q29udGFjdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q29udGFjdDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0Q29udGFjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Q29udGFjdChTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+V0JTPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgd29yayBicmVha2Rvd24gc3RydWN0dXJlIGNvZGUgb2YgdGhlIHRhc2suCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+V0JTPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRXQlMoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFRhc2tfV0JTKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1dCUycgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRXQlMoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRXQlMgPGVtPldCUzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+V0JTPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRXQlMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFdCUyhTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+V0JTIExldmVsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgcmlnaHRtb3N0IFdCUyBsZXZlbCBvZiB0aGUgdGFzay4gCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+V0JTIExldmVsPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRXQlNMZXZlbChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VGFza19XQlNMZXZlbCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdXQlNMZXZlbCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRXQlNMZXZlbCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldFdCU0xldmVsIDxlbT5XQlMgTGV2ZWw8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPldCUyBMZXZlbDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0V0JTTGV2ZWwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFdCU0xldmVsKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5PdXRsaW5lIE51bWJlcjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIG91dGxpbmUgbnVtYmVyIG9mIHRoZSB0YXNrLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk91dGxpbmUgTnVtYmVyPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRPdXRsaW5lTnVtYmVyKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRUYXNrX091dGxpbmVOdW1iZXIoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lTnVtYmVyVHlwZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nT3V0bGluZU51bWJlcicgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRPdXRsaW5lTnVtYmVyKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0T3V0bGluZU51bWJlciA8ZW0+T3V0bGluZSBOdW1iZXI8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk91dGxpbmUgTnVtYmVyPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRPdXRsaW5lTnVtYmVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRPdXRsaW5lTnVtYmVyKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5PdXRsaW5lIExldmVsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgb3V0bGluZSBsZXZlbCBvZiB0aGUgdGFzay4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5PdXRsaW5lIExldmVsPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRPdXRsaW5lTGV2ZWwoQmlnSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRUYXNrX091dGxpbmVMZXZlbCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuSW50ZWdlciIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nT3V0bGluZUxldmVsJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnSW50ZWdlciBnZXRPdXRsaW5lTGV2ZWwoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRPdXRsaW5lTGV2ZWwgPGVtPk91dGxpbmUgTGV2ZWw8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk91dGxpbmUgTGV2ZWw8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldE91dGxpbmVMZXZlbCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0T3V0bGluZUxldmVsKEJpZ0ludGVnZXIgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UHJpb3JpdHk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBwcmlvcml0eSBvZiB0aGUgdGFzayBmcm9tIDAgdG8gMTAwMC4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Qcmlvcml0eTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UHJpb3JpdHkoQmlnSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRUYXNrX1ByaW9yaXR5KCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5JbnRlZ2VyIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdQcmlvcml0eScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0ludGVnZXIgZ2V0UHJpb3JpdHkoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRQcmlvcml0eSA8ZW0+UHJpb3JpdHk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlByaW9yaXR5PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRQcmlvcml0eSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UHJpb3JpdHkoQmlnSW50ZWdlciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TdGFydDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHNjaGVkdWxlZCBzdGFydCBkYXRlIG9mIHRoZSB0YXNrLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlN0YXJ0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRTdGFydChPYmplY3QpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VGFza19TdGFydCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRGF0ZVRpbWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1N0YXJ0JyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JT2JqZWN0IGdldFN0YXJ0KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0U3RhcnQgPGVtPlN0YXJ0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TdGFydDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0U3RhcnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFN0YXJ0KE9iamVjdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5GaW5pc2g8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBzY2hlZHVsZWQgZmluaXNoIGRhdGUgb2YgdGhlIHRhc2suCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RmluaXNoPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRGaW5pc2goT2JqZWN0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFRhc2tfRmluaXNoKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EYXRlVGltZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nRmluaXNoJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JT2JqZWN0IGdldEZpbmlzaCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldEZpbmlzaCA8ZW0+RmluaXNoPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5GaW5pc2g8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEZpbmlzaCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RmluaXNoKE9iamVjdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EdXJhdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHBsYW5uZWQgZHVyYXRpb24gb2YgdGhlIHRhc2suCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RHVyYXRpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldER1cmF0aW9uKE9iamVjdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRUYXNrX0R1cmF0aW9uKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EdXJhdGlvbiIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nRHVyYXRpb24nIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlPYmplY3QgZ2V0RHVyYXRpb24oKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXREdXJhdGlvbiA8ZW0+RHVyYXRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkR1cmF0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXREdXJhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RHVyYXRpb24oT2JqZWN0IHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkR1cmF0aW9uIEZvcm1hdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGZvcm1hdCBmb3IgZXhwcmVzc2luZyB0aGUgRHVyYXRpb24gb2YgdGhlIFRhc2suICAKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlcyBhcmU6IDM9bSwgND1lbSwgNT1oLCA2PWVoLCA3PWQsIDg9ZWQsIDk9dywgMTA9ZXcsIDExPW1vLCAxMj1lbW8sIDE5PSUsIAotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjA9ZSUsIDIxPW51bGwsIDM1PW0/LCAzNj1lbT8sIDM3PWg/LCAzOD1laD8sIDM5PWQ/LCA0MD1lZD8sIDQxPXc/LCA0Mj1ldz8sIAotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDM9bW8/LCA0ND1lbW8/LCA1MT0lPywgNTI9ZSU/IGFuZCA1Mz1udWxsLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkR1cmF0aW9uIEZvcm1hdDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0RHVyYXRpb25Gb3JtYXQoQmlnSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRUYXNrX0R1cmF0aW9uRm9ybWF0KCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRHVyYXRpb25Gb3JtYXRUeXBlNCIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nRHVyYXRpb25Gb3JtYXQnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdJbnRlZ2VyIGdldER1cmF0aW9uRm9ybWF0KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0RHVyYXRpb25Gb3JtYXQgPGVtPkR1cmF0aW9uIEZvcm1hdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RHVyYXRpb24gRm9ybWF0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXREdXJhdGlvbkZvcm1hdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RHVyYXRpb25Gb3JtYXQoQmlnSW50ZWdlciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Xb3JrPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgYW1vdW50IG9mIHNjaGVkdWxlZCB3b3JrIGZvciB0aGUgdGFzay4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Xb3JrPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRXb3JrKE9iamVjdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRUYXNrX1dvcmsoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkR1cmF0aW9uIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdXb3JrJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JT2JqZWN0IGdldFdvcmsoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRXb3JrIDxlbT5Xb3JrPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Xb3JrPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRXb3JrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRXb3JrKE9iamVjdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TdG9wPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgZGF0ZSB0aGF0IHRoZSB0YXNrIHdhcyBzdG9wcGVkLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlN0b3A8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFN0b3AoT2JqZWN0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFRhc2tfU3RvcCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRGF0ZVRpbWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1N0b3AnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlPYmplY3QgZ2V0U3RvcCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldFN0b3AgPGVtPlN0b3A8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlN0b3A8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFN0b3AoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFN0b3AoT2JqZWN0IHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJlc3VtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGRhdGUgdGhhdCB0aGUgdGFzayByZXN1bWVkLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJlc3VtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UmVzdW1lKE9iamVjdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRUYXNrX1Jlc3VtZSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRGF0ZVRpbWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1Jlc3VtZScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU9iamVjdCBnZXRSZXN1bWUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRSZXN1bWUgPGVtPlJlc3VtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UmVzdW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRSZXN1bWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFJlc3VtZShPYmplY3QgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmVzdW1lIFZhbGlkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBXaGV0aGVyIHRoZSB0YXNrIGNhbiBiZSByZXN1bWVkLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJlc3VtZSBWYWxpZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRSZXN1bWVWYWxpZCgpCi0JICogQHNlZSAjdW5zZXRSZXN1bWVWYWxpZCgpCi0JICogQHNlZSAjc2V0UmVzdW1lVmFsaWQoYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRUYXNrX1Jlc3VtZVZhbGlkKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdSZXN1bWVWYWxpZCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNSZXN1bWVWYWxpZCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2lzUmVzdW1lVmFsaWQgPGVtPlJlc3VtZSBWYWxpZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UmVzdW1lIFZhbGlkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldFJlc3VtZVZhbGlkKCkKLQkgKiBAc2VlICN1bnNldFJlc3VtZVZhbGlkKCkKLQkgKiBAc2VlICNpc1Jlc3VtZVZhbGlkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRSZXN1bWVWYWxpZChib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2lzUmVzdW1lVmFsaWQgPGVtPlJlc3VtZSBWYWxpZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRSZXN1bWVWYWxpZCgpCi0JICogQHNlZSAjaXNSZXN1bWVWYWxpZCgpCi0JICogQHNlZSAjc2V0UmVzdW1lVmFsaWQoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldFJlc3VtZVZhbGlkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNpc1Jlc3VtZVZhbGlkIDxlbT5SZXN1bWUgVmFsaWQ8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJlc3VtZSBWYWxpZDwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0UmVzdW1lVmFsaWQoKQotCSAqIEBzZWUgI2lzUmVzdW1lVmFsaWQoKQotCSAqIEBzZWUgI3NldFJlc3VtZVZhbGlkKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRSZXN1bWVWYWxpZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RWZmb3J0IERyaXZlbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogV2hldGhlciB0aGUgdGFzayBpcyBlZmZvcnQtZHJpdmVuLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkVmZm9ydCBEcml2ZW48L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0RWZmb3J0RHJpdmVuKCkKLQkgKiBAc2VlICN1bnNldEVmZm9ydERyaXZlbigpCi0JICogQHNlZSAjc2V0RWZmb3J0RHJpdmVuKGJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VGFza19FZmZvcnREcml2ZW4oKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW4iCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0VmZm9ydERyaXZlbicgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNFZmZvcnREcml2ZW4oKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNpc0VmZm9ydERyaXZlbiA8ZW0+RWZmb3J0IERyaXZlbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RWZmb3J0IERyaXZlbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRFZmZvcnREcml2ZW4oKQotCSAqIEBzZWUgI3Vuc2V0RWZmb3J0RHJpdmVuKCkKLQkgKiBAc2VlICNpc0VmZm9ydERyaXZlbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RWZmb3J0RHJpdmVuKGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjaXNFZmZvcnREcml2ZW4gPGVtPkVmZm9ydCBEcml2ZW48L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0RWZmb3J0RHJpdmVuKCkKLQkgKiBAc2VlICNpc0VmZm9ydERyaXZlbigpCi0JICogQHNlZSAjc2V0RWZmb3J0RHJpdmVuKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRFZmZvcnREcml2ZW4oKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2lzRWZmb3J0RHJpdmVuIDxlbT5FZmZvcnQgRHJpdmVuPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FZmZvcnQgRHJpdmVuPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRFZmZvcnREcml2ZW4oKQotCSAqIEBzZWUgI2lzRWZmb3J0RHJpdmVuKCkKLQkgKiBAc2VlICNzZXRFZmZvcnREcml2ZW4oYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldEVmZm9ydERyaXZlbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmVjdXJyaW5nPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBXaGV0aGVyIHRoZSB0YXNrIGlzIGEgcmVjdXJyaW5nIHRhc2suCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmVjdXJyaW5nPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldFJlY3VycmluZygpCi0JICogQHNlZSAjdW5zZXRSZWN1cnJpbmcoKQotCSAqIEBzZWUgI3NldFJlY3VycmluZyhib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFRhc2tfUmVjdXJyaW5nKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdSZWN1cnJpbmcnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzUmVjdXJyaW5nKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjaXNSZWN1cnJpbmcgPGVtPlJlY3VycmluZzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UmVjdXJyaW5nPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldFJlY3VycmluZygpCi0JICogQHNlZSAjdW5zZXRSZWN1cnJpbmcoKQotCSAqIEBzZWUgI2lzUmVjdXJyaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRSZWN1cnJpbmcoYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNpc1JlY3VycmluZyA8ZW0+UmVjdXJyaW5nPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldFJlY3VycmluZygpCi0JICogQHNlZSAjaXNSZWN1cnJpbmcoKQotCSAqIEBzZWUgI3NldFJlY3VycmluZyhib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0UmVjdXJyaW5nKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNpc1JlY3VycmluZyA8ZW0+UmVjdXJyaW5nPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZWN1cnJpbmc8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldFJlY3VycmluZygpCi0JICogQHNlZSAjaXNSZWN1cnJpbmcoKQotCSAqIEBzZWUgI3NldFJlY3VycmluZyhib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0UmVjdXJyaW5nKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5PdmVyIEFsbG9jYXRlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogV2hldGhlciB0aGUgdGFzayBpcyBvdmVyYWxsb2NhdGVkLiAKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZWxlbWVudCBpcyBpbmZvcm1hdGlvbmFsIG9ubHkuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+T3ZlciBBbGxvY2F0ZWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0T3ZlckFsbG9jYXRlZCgpCi0JICogQHNlZSAjdW5zZXRPdmVyQWxsb2NhdGVkKCkKLQkgKiBAc2VlICNzZXRPdmVyQWxsb2NhdGVkKGJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VGFza19PdmVyQWxsb2NhdGVkKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdPdmVyQWxsb2NhdGVkJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc092ZXJBbGxvY2F0ZWQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNpc092ZXJBbGxvY2F0ZWQgPGVtPk92ZXIgQWxsb2NhdGVkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5PdmVyIEFsbG9jYXRlZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRPdmVyQWxsb2NhdGVkKCkKLQkgKiBAc2VlICN1bnNldE92ZXJBbGxvY2F0ZWQoKQotCSAqIEBzZWUgI2lzT3ZlckFsbG9jYXRlZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0T3ZlckFsbG9jYXRlZChib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2lzT3ZlckFsbG9jYXRlZCA8ZW0+T3ZlciBBbGxvY2F0ZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0T3ZlckFsbG9jYXRlZCgpCi0JICogQHNlZSAjaXNPdmVyQWxsb2NhdGVkKCkKLQkgKiBAc2VlICNzZXRPdmVyQWxsb2NhdGVkKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRPdmVyQWxsb2NhdGVkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNpc092ZXJBbGxvY2F0ZWQgPGVtPk92ZXIgQWxsb2NhdGVkPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5PdmVyIEFsbG9jYXRlZDwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0T3ZlckFsbG9jYXRlZCgpCi0JICogQHNlZSAjaXNPdmVyQWxsb2NhdGVkKCkKLQkgKiBAc2VlICNzZXRPdmVyQWxsb2NhdGVkKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRPdmVyQWxsb2NhdGVkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Fc3RpbWF0ZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFdoZXRoZXIgdGhlIHRhc2sgaXMgZXN0aW1hdGVkLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkVzdGltYXRlZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRFc3RpbWF0ZWQoKQotCSAqIEBzZWUgI3Vuc2V0RXN0aW1hdGVkKCkKLQkgKiBAc2VlICNzZXRFc3RpbWF0ZWQoYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRUYXNrX0VzdGltYXRlZCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbiIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nRXN0aW1hdGVkJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc0VzdGltYXRlZCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2lzRXN0aW1hdGVkIDxlbT5Fc3RpbWF0ZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkVzdGltYXRlZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRFc3RpbWF0ZWQoKQotCSAqIEBzZWUgI3Vuc2V0RXN0aW1hdGVkKCkKLQkgKiBAc2VlICNpc0VzdGltYXRlZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RXN0aW1hdGVkKGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjaXNFc3RpbWF0ZWQgPGVtPkVzdGltYXRlZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRFc3RpbWF0ZWQoKQotCSAqIEBzZWUgI2lzRXN0aW1hdGVkKCkKLQkgKiBAc2VlICNzZXRFc3RpbWF0ZWQoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldEVzdGltYXRlZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjaXNFc3RpbWF0ZWQgPGVtPkVzdGltYXRlZDwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RXN0aW1hdGVkPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRFc3RpbWF0ZWQoKQotCSAqIEBzZWUgI2lzRXN0aW1hdGVkKCkKLQkgKiBAc2VlICNzZXRFc3RpbWF0ZWQoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldEVzdGltYXRlZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TWlsZXN0b25lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBXaGV0aGVyIHRoZSB0YXNrIGlzIGEgbWlsZXN0b25lLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1pbGVzdG9uZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRNaWxlc3RvbmUoKQotCSAqIEBzZWUgI3Vuc2V0TWlsZXN0b25lKCkKLQkgKiBAc2VlICNzZXRNaWxlc3RvbmUoYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRUYXNrX01pbGVzdG9uZSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbiIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nTWlsZXN0b25lJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc01pbGVzdG9uZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2lzTWlsZXN0b25lIDxlbT5NaWxlc3RvbmU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk1pbGVzdG9uZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRNaWxlc3RvbmUoKQotCSAqIEBzZWUgI3Vuc2V0TWlsZXN0b25lKCkKLQkgKiBAc2VlICNpc01pbGVzdG9uZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TWlsZXN0b25lKGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjaXNNaWxlc3RvbmUgPGVtPk1pbGVzdG9uZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRNaWxlc3RvbmUoKQotCSAqIEBzZWUgI2lzTWlsZXN0b25lKCkKLQkgKiBAc2VlICNzZXRNaWxlc3RvbmUoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldE1pbGVzdG9uZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjaXNNaWxlc3RvbmUgPGVtPk1pbGVzdG9uZTwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TWlsZXN0b25lPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRNaWxlc3RvbmUoKQotCSAqIEBzZWUgI2lzTWlsZXN0b25lKCkKLQkgKiBAc2VlICNzZXRNaWxlc3RvbmUoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldE1pbGVzdG9uZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U3VtbWFyeTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogV2hldGhlciB0aGUgdGFzayBpcyBhIHN1bW1hcnkgdGFzay4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TdW1tYXJ5PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldFN1bW1hcnkoKQotCSAqIEBzZWUgI3Vuc2V0U3VtbWFyeSgpCi0JICogQHNlZSAjc2V0U3VtbWFyeShib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFRhc2tfU3VtbWFyeSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbiIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nU3VtbWFyeScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTdW1tYXJ5KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjaXNTdW1tYXJ5IDxlbT5TdW1tYXJ5PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TdW1tYXJ5PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldFN1bW1hcnkoKQotCSAqIEBzZWUgI3Vuc2V0U3VtbWFyeSgpCi0JICogQHNlZSAjaXNTdW1tYXJ5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRTdW1tYXJ5KGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjaXNTdW1tYXJ5IDxlbT5TdW1tYXJ5PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldFN1bW1hcnkoKQotCSAqIEBzZWUgI2lzU3VtbWFyeSgpCi0JICogQHNlZSAjc2V0U3VtbWFyeShib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0U3VtbWFyeSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjaXNTdW1tYXJ5IDxlbT5TdW1tYXJ5PC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TdW1tYXJ5PC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRTdW1tYXJ5KCkKLQkgKiBAc2VlICNpc1N1bW1hcnkoKQotCSAqIEBzZWUgI3NldFN1bW1hcnkoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldFN1bW1hcnkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNyaXRpY2FsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBXaGV0aGVyIHRoZSB0YXNrIGlzIGluIHRoZSBjcml0aWNhbCBjaGFpbi4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Dcml0aWNhbDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRDcml0aWNhbCgpCi0JICogQHNlZSAjdW5zZXRDcml0aWNhbCgpCi0JICogQHNlZSAjc2V0Q3JpdGljYWwoYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRUYXNrX0NyaXRpY2FsKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdDcml0aWNhbCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNDcml0aWNhbCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2lzQ3JpdGljYWwgPGVtPkNyaXRpY2FsPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Dcml0aWNhbDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRDcml0aWNhbCgpCi0JICogQHNlZSAjdW5zZXRDcml0aWNhbCgpCi0JICogQHNlZSAjaXNDcml0aWNhbCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Q3JpdGljYWwoYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNpc0NyaXRpY2FsIDxlbT5Dcml0aWNhbDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRDcml0aWNhbCgpCi0JICogQHNlZSAjaXNDcml0aWNhbCgpCi0JICogQHNlZSAjc2V0Q3JpdGljYWwoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldENyaXRpY2FsKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNpc0NyaXRpY2FsIDxlbT5Dcml0aWNhbDwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q3JpdGljYWw8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldENyaXRpY2FsKCkKLQkgKiBAc2VlICNpc0NyaXRpY2FsKCkKLQkgKiBAc2VlICNzZXRDcml0aWNhbChib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0Q3JpdGljYWwoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPklzIFN1YnByb2plY3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFdoZXRoZXIgdGhlIHRhc2sgaXMgYW4gaW5zZXJ0ZWQgcHJvamVjdC4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JcyBTdWJwcm9qZWN0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldElzU3VicHJvamVjdCgpCi0JICogQHNlZSAjdW5zZXRJc1N1YnByb2plY3QoKQotCSAqIEBzZWUgI3NldElzU3VicHJvamVjdChib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFRhc2tfSXNTdWJwcm9qZWN0KCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdJc1N1YnByb2plY3QnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzSXNTdWJwcm9qZWN0KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjaXNJc1N1YnByb2plY3QgPGVtPklzIFN1YnByb2plY3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPklzIFN1YnByb2plY3Q8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0SXNTdWJwcm9qZWN0KCkKLQkgKiBAc2VlICN1bnNldElzU3VicHJvamVjdCgpCi0JICogQHNlZSAjaXNJc1N1YnByb2plY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldElzU3VicHJvamVjdChib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2lzSXNTdWJwcm9qZWN0IDxlbT5JcyBTdWJwcm9qZWN0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldElzU3VicHJvamVjdCgpCi0JICogQHNlZSAjaXNJc1N1YnByb2plY3QoKQotCSAqIEBzZWUgI3NldElzU3VicHJvamVjdChib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0SXNTdWJwcm9qZWN0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNpc0lzU3VicHJvamVjdCA8ZW0+SXMgU3VicHJvamVjdDwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SXMgU3VicHJvamVjdDwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0SXNTdWJwcm9qZWN0KCkKLQkgKiBAc2VlICNpc0lzU3VicHJvamVjdCgpCi0JICogQHNlZSAjc2V0SXNTdWJwcm9qZWN0KGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRJc1N1YnByb2plY3QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPklzIFN1YnByb2plY3QgUmVhZCBPbmx5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBXaGV0aGVyIHRoZSBpbnNlcnRlZCBwcm9qZWN0IGlzIHJlYWQtb25seS4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JcyBTdWJwcm9qZWN0IFJlYWQgT25seTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRJc1N1YnByb2plY3RSZWFkT25seSgpCi0JICogQHNlZSAjdW5zZXRJc1N1YnByb2plY3RSZWFkT25seSgpCi0JICogQHNlZSAjc2V0SXNTdWJwcm9qZWN0UmVhZE9ubHkoYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRUYXNrX0lzU3VicHJvamVjdFJlYWRPbmx5KCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdJc1N1YnByb2plY3RSZWFkT25seScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNJc1N1YnByb2plY3RSZWFkT25seSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2lzSXNTdWJwcm9qZWN0UmVhZE9ubHkgPGVtPklzIFN1YnByb2plY3QgUmVhZCBPbmx5PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5JcyBTdWJwcm9qZWN0IFJlYWQgT25seTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRJc1N1YnByb2plY3RSZWFkT25seSgpCi0JICogQHNlZSAjdW5zZXRJc1N1YnByb2plY3RSZWFkT25seSgpCi0JICogQHNlZSAjaXNJc1N1YnByb2plY3RSZWFkT25seSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0SXNTdWJwcm9qZWN0UmVhZE9ubHkoYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNpc0lzU3VicHJvamVjdFJlYWRPbmx5IDxlbT5JcyBTdWJwcm9qZWN0IFJlYWQgT25seTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRJc1N1YnByb2plY3RSZWFkT25seSgpCi0JICogQHNlZSAjaXNJc1N1YnByb2plY3RSZWFkT25seSgpCi0JICogQHNlZSAjc2V0SXNTdWJwcm9qZWN0UmVhZE9ubHkoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldElzU3VicHJvamVjdFJlYWRPbmx5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNpc0lzU3VicHJvamVjdFJlYWRPbmx5IDxlbT5JcyBTdWJwcm9qZWN0IFJlYWQgT25seTwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SXMgU3VicHJvamVjdCBSZWFkIE9ubHk8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldElzU3VicHJvamVjdFJlYWRPbmx5KCkKLQkgKiBAc2VlICNpc0lzU3VicHJvamVjdFJlYWRPbmx5KCkKLQkgKiBAc2VlICNzZXRJc1N1YnByb2plY3RSZWFkT25seShib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0SXNTdWJwcm9qZWN0UmVhZE9ubHkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlN1YnByb2plY3QgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHNvdXJjZSBsb2NhdGlvbiBvZiB0aGUgaW5zZXJ0ZWQgcHJvamVjdC4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TdWJwcm9qZWN0IE5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFN1YnByb2plY3ROYW1lKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRUYXNrX1N1YnByb2plY3ROYW1lKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuU3VicHJvamVjdE5hbWVUeXBlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdTdWJwcm9qZWN0TmFtZScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRTdWJwcm9qZWN0TmFtZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldFN1YnByb2plY3ROYW1lIDxlbT5TdWJwcm9qZWN0IE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlN1YnByb2plY3QgTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0U3VicHJvamVjdE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFN1YnByb2plY3ROYW1lKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FeHRlcm5hbCBUYXNrPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBXaGV0aGVyIHRoZSB0YXNrIGlzIGV4dGVybmFsLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkV4dGVybmFsIFRhc2s8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0RXh0ZXJuYWxUYXNrKCkKLQkgKiBAc2VlICN1bnNldEV4dGVybmFsVGFzaygpCi0JICogQHNlZSAjc2V0RXh0ZXJuYWxUYXNrKGJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VGFza19FeHRlcm5hbFRhc2soKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW4iCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0V4dGVybmFsVGFzaycgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNFeHRlcm5hbFRhc2soKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNpc0V4dGVybmFsVGFzayA8ZW0+RXh0ZXJuYWwgVGFzazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RXh0ZXJuYWwgVGFzazwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRFeHRlcm5hbFRhc2soKQotCSAqIEBzZWUgI3Vuc2V0RXh0ZXJuYWxUYXNrKCkKLQkgKiBAc2VlICNpc0V4dGVybmFsVGFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RXh0ZXJuYWxUYXNrKGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjaXNFeHRlcm5hbFRhc2sgPGVtPkV4dGVybmFsIFRhc2s8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0RXh0ZXJuYWxUYXNrKCkKLQkgKiBAc2VlICNpc0V4dGVybmFsVGFzaygpCi0JICogQHNlZSAjc2V0RXh0ZXJuYWxUYXNrKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRFeHRlcm5hbFRhc2soKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2lzRXh0ZXJuYWxUYXNrIDxlbT5FeHRlcm5hbCBUYXNrPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FeHRlcm5hbCBUYXNrPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRFeHRlcm5hbFRhc2soKQotCSAqIEBzZWUgI2lzRXh0ZXJuYWxUYXNrKCkKLQkgKiBAc2VlICNzZXRFeHRlcm5hbFRhc2soYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldEV4dGVybmFsVGFzaygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RXh0ZXJuYWwgVGFzayBQcm9qZWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgc291cmNlIGxvY2F0aW9uIGFuZCB0YXNrIGlkZW50aWZpZXIgb2YgdGhlIGV4dGVybmFsIHRhc2suCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RXh0ZXJuYWwgVGFzayBQcm9qZWN0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRFeHRlcm5hbFRhc2tQcm9qZWN0KFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRUYXNrX0V4dGVybmFsVGFza1Byb2plY3QoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlcm5hbFRhc2tQcm9qZWN0VHlwZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nRXh0ZXJuYWxUYXNrUHJvamVjdCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRFeHRlcm5hbFRhc2tQcm9qZWN0KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0RXh0ZXJuYWxUYXNrUHJvamVjdCA8ZW0+RXh0ZXJuYWwgVGFzayBQcm9qZWN0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5FeHRlcm5hbCBUYXNrIFByb2plY3Q8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEV4dGVybmFsVGFza1Byb2plY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEV4dGVybmFsVGFza1Byb2plY3QoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkVhcmx5IFN0YXJ0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgZWFybHkgc3RhcnQgZGF0ZSBvZiB0aGUgdGFzay4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FYXJseSBTdGFydDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0RWFybHlTdGFydChPYmplY3QpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VGFza19FYXJseVN0YXJ0KCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EYXRlVGltZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nRWFybHlTdGFydCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU9iamVjdCBnZXRFYXJseVN0YXJ0KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0RWFybHlTdGFydCA8ZW0+RWFybHkgU3RhcnQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkVhcmx5IFN0YXJ0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRFYXJseVN0YXJ0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRFYXJseVN0YXJ0KE9iamVjdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FYXJseSBGaW5pc2g8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBlYXJseSBmaW5pc2ggZGF0ZSBvZiB0aGUgdGFzay4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FYXJseSBGaW5pc2g8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEVhcmx5RmluaXNoKE9iamVjdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRUYXNrX0Vhcmx5RmluaXNoKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EYXRlVGltZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nRWFybHlGaW5pc2gnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlPYmplY3QgZ2V0RWFybHlGaW5pc2goKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRFYXJseUZpbmlzaCA8ZW0+RWFybHkgRmluaXNoPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5FYXJseSBGaW5pc2g8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEVhcmx5RmluaXNoKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRFYXJseUZpbmlzaChPYmplY3QgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TGF0ZSBTdGFydDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGxhdGUgc3RhcnQgZGF0ZSBvZiB0aGUgdGFzay4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5MYXRlIFN0YXJ0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRMYXRlU3RhcnQoT2JqZWN0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFRhc2tfTGF0ZVN0YXJ0KCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EYXRlVGltZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nTGF0ZVN0YXJ0JyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JT2JqZWN0IGdldExhdGVTdGFydCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldExhdGVTdGFydCA8ZW0+TGF0ZSBTdGFydDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TGF0ZSBTdGFydDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0TGF0ZVN0YXJ0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRMYXRlU3RhcnQoT2JqZWN0IHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkxhdGUgRmluaXNoPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgbGF0ZSBmaW5pc2ggZGF0ZSBvZiB0aGUgdGFzay4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5MYXRlIEZpbmlzaDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0TGF0ZUZpbmlzaChPYmplY3QpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VGFza19MYXRlRmluaXNoKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EYXRlVGltZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nTGF0ZUZpbmlzaCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU9iamVjdCBnZXRMYXRlRmluaXNoKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0TGF0ZUZpbmlzaCA8ZW0+TGF0ZSBGaW5pc2g8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkxhdGUgRmluaXNoPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRMYXRlRmluaXNoKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRMYXRlRmluaXNoKE9iamVjdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TdGFydCBWYXJpYW5jZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHZhcmlhbmNlIG9mIHRoZSB0YXNrIHN0YXJ0IGRhdGUgZnJvbSAKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBiYXNlbGluZSBzdGFydCBkYXRlIGFzIG1pbnV0ZXMgeCAxMDAwLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlN0YXJ0IFZhcmlhbmNlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRTdGFydFZhcmlhbmNlKEJpZ0ludGVnZXIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VGFza19TdGFydFZhcmlhbmNlKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5JbnRlZ2VyIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdTdGFydFZhcmlhbmNlJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnSW50ZWdlciBnZXRTdGFydFZhcmlhbmNlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0U3RhcnRWYXJpYW5jZSA8ZW0+U3RhcnQgVmFyaWFuY2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlN0YXJ0IFZhcmlhbmNlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRTdGFydFZhcmlhbmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRTdGFydFZhcmlhbmNlKEJpZ0ludGVnZXIgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RmluaXNoIFZhcmlhbmNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgdmFyaWFuY2Ugb2YgdGhlIHRhc2sgZmluaXNoIGRhdGUgZnJvbSAKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBiYXNlbGluZSBmaW5pc2ggZGF0ZSBhcyBtaW51dGVzIHggMTAwMC4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5GaW5pc2ggVmFyaWFuY2U8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEZpbmlzaFZhcmlhbmNlKEJpZ0ludGVnZXIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VGFza19GaW5pc2hWYXJpYW5jZSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuSW50ZWdlciIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nRmluaXNoVmFyaWFuY2UnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdJbnRlZ2VyIGdldEZpbmlzaFZhcmlhbmNlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0RmluaXNoVmFyaWFuY2UgPGVtPkZpbmlzaCBWYXJpYW5jZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RmluaXNoIFZhcmlhbmNlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRGaW5pc2hWYXJpYW5jZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RmluaXNoVmFyaWFuY2UoQmlnSW50ZWdlciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Xb3JrIFZhcmlhbmNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgdmFyaWFuY2Ugb2YgdGFzayB3b3JrIGZyb20gdGhlIGJhc2VsaW5lIAotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFzayB3b3JrIGFzIG1pbnV0ZXMgeCAxMDAwLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPldvcmsgVmFyaWFuY2U8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0V29ya1ZhcmlhbmNlKCkKLQkgKiBAc2VlICN1bnNldFdvcmtWYXJpYW5jZSgpCi0JICogQHNlZSAjc2V0V29ya1ZhcmlhbmNlKGZsb2F0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFRhc2tfV29ya1ZhcmlhbmNlKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5GbG9hdCIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nV29ya1ZhcmlhbmNlJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JZmxvYXQgZ2V0V29ya1ZhcmlhbmNlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0V29ya1ZhcmlhbmNlIDxlbT5Xb3JrIFZhcmlhbmNlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Xb3JrIFZhcmlhbmNlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldFdvcmtWYXJpYW5jZSgpCi0JICogQHNlZSAjdW5zZXRXb3JrVmFyaWFuY2UoKQotCSAqIEBzZWUgI2dldFdvcmtWYXJpYW5jZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0V29ya1ZhcmlhbmNlKGZsb2F0IHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldFdvcmtWYXJpYW5jZSA8ZW0+V29yayBWYXJpYW5jZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRXb3JrVmFyaWFuY2UoKQotCSAqIEBzZWUgI2dldFdvcmtWYXJpYW5jZSgpCi0JICogQHNlZSAjc2V0V29ya1ZhcmlhbmNlKGZsb2F0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0V29ya1ZhcmlhbmNlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRXb3JrVmFyaWFuY2UgPGVtPldvcmsgVmFyaWFuY2U8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPldvcmsgVmFyaWFuY2U8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldFdvcmtWYXJpYW5jZSgpCi0JICogQHNlZSAjZ2V0V29ya1ZhcmlhbmNlKCkKLQkgKiBAc2VlICNzZXRXb3JrVmFyaWFuY2UoZmxvYXQpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRXb3JrVmFyaWFuY2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkZyZWUgU2xhY2s8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBhbW91bnQgb2YgZnJlZSBzbGFjay4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5GcmVlIFNsYWNrPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRGcmVlU2xhY2soQmlnSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRUYXNrX0ZyZWVTbGFjaygpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuSW50ZWdlciIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nRnJlZVNsYWNrJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnSW50ZWdlciBnZXRGcmVlU2xhY2soKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRGcmVlU2xhY2sgPGVtPkZyZWUgU2xhY2s8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkZyZWUgU2xhY2s8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEZyZWVTbGFjaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RnJlZVNsYWNrKEJpZ0ludGVnZXIgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VG90YWwgU2xhY2s8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBhbW91bnQgb2YgdG90YWwgc2xhY2suCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VG90YWwgU2xhY2s8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFRvdGFsU2xhY2soQmlnSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRUYXNrX1RvdGFsU2xhY2soKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkludGVnZXIiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1RvdGFsU2xhY2snIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdJbnRlZ2VyIGdldFRvdGFsU2xhY2soKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRUb3RhbFNsYWNrIDxlbT5Ub3RhbCBTbGFjazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VG90YWwgU2xhY2s8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFRvdGFsU2xhY2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFRvdGFsU2xhY2soQmlnSW50ZWdlciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5GaXhlZCBDb3N0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgZml4ZWQgY29zdCBvZiB0aGUgdGFzay4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5GaXhlZCBDb3N0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldEZpeGVkQ29zdCgpCi0JICogQHNlZSAjdW5zZXRGaXhlZENvc3QoKQotCSAqIEBzZWUgI3NldEZpeGVkQ29zdChmbG9hdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRUYXNrX0ZpeGVkQ29zdCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRmxvYXQiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0ZpeGVkQ29zdCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWZsb2F0IGdldEZpeGVkQ29zdCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldEZpeGVkQ29zdCA8ZW0+Rml4ZWQgQ29zdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Rml4ZWQgQ29zdDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRGaXhlZENvc3QoKQotCSAqIEBzZWUgI3Vuc2V0Rml4ZWRDb3N0KCkKLQkgKiBAc2VlICNnZXRGaXhlZENvc3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEZpeGVkQ29zdChmbG9hdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRGaXhlZENvc3QgPGVtPkZpeGVkIENvc3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0Rml4ZWRDb3N0KCkKLQkgKiBAc2VlICNnZXRGaXhlZENvc3QoKQotCSAqIEBzZWUgI3NldEZpeGVkQ29zdChmbG9hdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldEZpeGVkQ29zdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0Rml4ZWRDb3N0IDxlbT5GaXhlZCBDb3N0PC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5GaXhlZCBDb3N0PC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRGaXhlZENvc3QoKQotCSAqIEBzZWUgI2dldEZpeGVkQ29zdCgpCi0JICogQHNlZSAjc2V0Rml4ZWRDb3N0KGZsb2F0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0Rml4ZWRDb3N0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5GaXhlZCBDb3N0IEFjY3J1YWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIEhvdyB0aGUgZml4ZWQgY29zdCBpcyBhY2NydWVkIGFnYWluc3QgdGhlIHRhc2suIAotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVzIGFyZTogMT1TdGFydCwgMj1Qcm9yYXRlZCBhbmQgMz1FbmQuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Rml4ZWQgQ29zdCBBY2NydWFsPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRGaXhlZENvc3RBY2NydWFsKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRUYXNrX0ZpeGVkQ29zdEFjY3J1YWwoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5GaXhlZENvc3RBY2NydWFsVHlwZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nRml4ZWRDb3N0QWNjcnVhbCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRGaXhlZENvc3RBY2NydWFsKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0Rml4ZWRDb3N0QWNjcnVhbCA8ZW0+Rml4ZWQgQ29zdCBBY2NydWFsPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5GaXhlZCBDb3N0IEFjY3J1YWw8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEZpeGVkQ29zdEFjY3J1YWwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEZpeGVkQ29zdEFjY3J1YWwoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlBlcmNlbnQgQ29tcGxldGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBwZXJjZW50YWdlIG9mIHRoZSB0YXNrIGR1cmF0aW9uIGNvbXBsZXRlZC4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QZXJjZW50IENvbXBsZXRlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRQZXJjZW50Q29tcGxldGUoQmlnSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRUYXNrX1BlcmNlbnRDb21wbGV0ZSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuSW50ZWdlciIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nUGVyY2VudENvbXBsZXRlJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnSW50ZWdlciBnZXRQZXJjZW50Q29tcGxldGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRQZXJjZW50Q29tcGxldGUgPGVtPlBlcmNlbnQgQ29tcGxldGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlBlcmNlbnQgQ29tcGxldGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFBlcmNlbnRDb21wbGV0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UGVyY2VudENvbXBsZXRlKEJpZ0ludGVnZXIgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UGVyY2VudCBXb3JrIENvbXBsZXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgcGVyY2VudGFnZSBvZiB0aGUgdGFzayB3b3JrIGNvbXBsZXRlZC4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QZXJjZW50IFdvcmsgQ29tcGxldGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFBlcmNlbnRXb3JrQ29tcGxldGUoQmlnSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRUYXNrX1BlcmNlbnRXb3JrQ29tcGxldGUoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkludGVnZXIiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1BlcmNlbnRXb3JrQ29tcGxldGUnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdJbnRlZ2VyIGdldFBlcmNlbnRXb3JrQ29tcGxldGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRQZXJjZW50V29ya0NvbXBsZXRlIDxlbT5QZXJjZW50IFdvcmsgQ29tcGxldGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlBlcmNlbnQgV29yayBDb21wbGV0ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UGVyY2VudFdvcmtDb21wbGV0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UGVyY2VudFdvcmtDb21wbGV0ZShCaWdJbnRlZ2VyIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNvc3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBwcm9qZWN0ZWQgb3Igc2NoZWR1bGVkIGNvc3Qgb2YgdGhlIHRhc2suCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q29zdDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0Q29zdChCaWdEZWNpbWFsKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFRhc2tfQ29zdCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRGVjaW1hbCIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQ29zdCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0RlY2ltYWwgZ2V0Q29zdCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldENvc3QgPGVtPkNvc3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNvc3Q8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldENvc3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldENvc3QoQmlnRGVjaW1hbCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5PdmVydGltZSBDb3N0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgc3VtIG9mIHRoZSBhY3R1YWwgYW5kIHJlbWFpbmluZyBvdmVydGltZSBjb3N0IG9mIHRoZSB0YXNrLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk92ZXJ0aW1lIENvc3Q8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldE92ZXJ0aW1lQ29zdChCaWdEZWNpbWFsKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFRhc2tfT3ZlcnRpbWVDb3N0KCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EZWNpbWFsIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdPdmVydGltZUNvc3QnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdEZWNpbWFsIGdldE92ZXJ0aW1lQ29zdCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldE92ZXJ0aW1lQ29zdCA8ZW0+T3ZlcnRpbWUgQ29zdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+T3ZlcnRpbWUgQ29zdDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0T3ZlcnRpbWVDb3N0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRPdmVydGltZUNvc3QoQmlnRGVjaW1hbCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5PdmVydGltZSBXb3JrPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgYW1vdW50IG9mIG92ZXJ0aW1lIHdvcmsgc2NoZWR1bGVkIGZvciB0aGUgdGFzay4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5PdmVydGltZSBXb3JrPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRPdmVydGltZVdvcmsoT2JqZWN0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFRhc2tfT3ZlcnRpbWVXb3JrKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EdXJhdGlvbiIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nT3ZlcnRpbWVXb3JrJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JT2JqZWN0IGdldE92ZXJ0aW1lV29yaygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldE92ZXJ0aW1lV29yayA8ZW0+T3ZlcnRpbWUgV29yazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+T3ZlcnRpbWUgV29yazwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0T3ZlcnRpbWVXb3JrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRPdmVydGltZVdvcmsoT2JqZWN0IHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkFjdHVhbCBTdGFydDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGFjdHVhbCBzdGFydCBkYXRlIG9mIHRoZSB0YXNrLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkFjdHVhbCBTdGFydDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0QWN0dWFsU3RhcnQoT2JqZWN0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFRhc2tfQWN0dWFsU3RhcnQoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkRhdGVUaW1lIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdBY3R1YWxTdGFydCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU9iamVjdCBnZXRBY3R1YWxTdGFydCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldEFjdHVhbFN0YXJ0IDxlbT5BY3R1YWwgU3RhcnQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkFjdHVhbCBTdGFydDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0QWN0dWFsU3RhcnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEFjdHVhbFN0YXJ0KE9iamVjdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BY3R1YWwgRmluaXNoPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgYWN0dWFsIGZpbmlzaCBkYXRlIG9mIHRoZSB0YXNrLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkFjdHVhbCBGaW5pc2g8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEFjdHVhbEZpbmlzaChPYmplY3QpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VGFza19BY3R1YWxGaW5pc2goKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkRhdGVUaW1lIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdBY3R1YWxGaW5pc2gnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlPYmplY3QgZ2V0QWN0dWFsRmluaXNoKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0QWN0dWFsRmluaXNoIDxlbT5BY3R1YWwgRmluaXNoPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BY3R1YWwgRmluaXNoPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRBY3R1YWxGaW5pc2goKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEFjdHVhbEZpbmlzaChPYmplY3QgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QWN0dWFsIER1cmF0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgYWN0dWFsIGR1cmF0aW9uIG9mIHRoZSB0YXNrLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkFjdHVhbCBEdXJhdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0QWN0dWFsRHVyYXRpb24oT2JqZWN0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFRhc2tfQWN0dWFsRHVyYXRpb24oKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkR1cmF0aW9uIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdBY3R1YWxEdXJhdGlvbicgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU9iamVjdCBnZXRBY3R1YWxEdXJhdGlvbigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldEFjdHVhbER1cmF0aW9uIDxlbT5BY3R1YWwgRHVyYXRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkFjdHVhbCBEdXJhdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0QWN0dWFsRHVyYXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEFjdHVhbER1cmF0aW9uKE9iamVjdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BY3R1YWwgQ29zdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGFjdHVhbCBjb3N0IG9mIHRoZSB0YXNrLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkFjdHVhbCBDb3N0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRBY3R1YWxDb3N0KEJpZ0RlY2ltYWwpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VGFza19BY3R1YWxDb3N0KCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EZWNpbWFsIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdBY3R1YWxDb3N0JyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnRGVjaW1hbCBnZXRBY3R1YWxDb3N0KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0QWN0dWFsQ29zdCA8ZW0+QWN0dWFsIENvc3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkFjdHVhbCBDb3N0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRBY3R1YWxDb3N0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRBY3R1YWxDb3N0KEJpZ0RlY2ltYWwgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QWN0dWFsIE92ZXJ0aW1lIENvc3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBhY3R1YWwgb3ZlcnRpbWUgY29zdCBvZiB0aGUgdGFzay4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BY3R1YWwgT3ZlcnRpbWUgQ29zdDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0QWN0dWFsT3ZlcnRpbWVDb3N0KEJpZ0RlY2ltYWwpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VGFza19BY3R1YWxPdmVydGltZUNvc3QoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkRlY2ltYWwiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0FjdHVhbE92ZXJ0aW1lQ29zdCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0RlY2ltYWwgZ2V0QWN0dWFsT3ZlcnRpbWVDb3N0KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0QWN0dWFsT3ZlcnRpbWVDb3N0IDxlbT5BY3R1YWwgT3ZlcnRpbWUgQ29zdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QWN0dWFsIE92ZXJ0aW1lIENvc3Q8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEFjdHVhbE92ZXJ0aW1lQ29zdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0QWN0dWFsT3ZlcnRpbWVDb3N0KEJpZ0RlY2ltYWwgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QWN0dWFsIFdvcms8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBhY3R1YWwgd29yayBmb3IgdGhlIHRhc2suCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QWN0dWFsIFdvcms8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEFjdHVhbFdvcmsoT2JqZWN0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFRhc2tfQWN0dWFsV29yaygpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRHVyYXRpb24iCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0FjdHVhbFdvcmsnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlPYmplY3QgZ2V0QWN0dWFsV29yaygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldEFjdHVhbFdvcmsgPGVtPkFjdHVhbCBXb3JrPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BY3R1YWwgV29yazwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0QWN0dWFsV29yaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0QWN0dWFsV29yayhPYmplY3QgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QWN0dWFsIE92ZXJ0aW1lIFdvcms8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBhY3R1YWwgb3ZlcnRpbWUgd29yayBmb3IgdGhlIHRhc2suCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QWN0dWFsIE92ZXJ0aW1lIFdvcms8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEFjdHVhbE92ZXJ0aW1lV29yayhPYmplY3QpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VGFza19BY3R1YWxPdmVydGltZVdvcmsoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkR1cmF0aW9uIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdBY3R1YWxPdmVydGltZVdvcmsnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlPYmplY3QgZ2V0QWN0dWFsT3ZlcnRpbWVXb3JrKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0QWN0dWFsT3ZlcnRpbWVXb3JrIDxlbT5BY3R1YWwgT3ZlcnRpbWUgV29yazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QWN0dWFsIE92ZXJ0aW1lIFdvcms8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEFjdHVhbE92ZXJ0aW1lV29yaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0QWN0dWFsT3ZlcnRpbWVXb3JrKE9iamVjdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SZWd1bGFyIFdvcms8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBhbW91bnQgb2Ygbm9uLW92ZXJ0aW1lIHdvcmsgc2NoZWR1bGVkIGZvciB0aGUgdGFzay4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZWd1bGFyIFdvcms8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFJlZ3VsYXJXb3JrKE9iamVjdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRUYXNrX1JlZ3VsYXJXb3JrKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EdXJhdGlvbiIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nUmVndWxhcldvcmsnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlPYmplY3QgZ2V0UmVndWxhcldvcmsoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRSZWd1bGFyV29yayA8ZW0+UmVndWxhciBXb3JrPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5SZWd1bGFyIFdvcms8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFJlZ3VsYXJXb3JrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRSZWd1bGFyV29yayhPYmplY3QgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmVtYWluaW5nIER1cmF0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgYW1vdW50IG9mIHRpbWUgcmVxdWlyZWQgdG8gY29tcGxldGUgdGhlIHVuZmluaXNoZWQgcG9ydGlvbiBvZiB0aGUgdGFzay4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZW1haW5pbmcgRHVyYXRpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFJlbWFpbmluZ0R1cmF0aW9uKE9iamVjdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRUYXNrX1JlbWFpbmluZ0R1cmF0aW9uKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EdXJhdGlvbiIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nUmVtYWluaW5nRHVyYXRpb24nIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlPYmplY3QgZ2V0UmVtYWluaW5nRHVyYXRpb24oKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRSZW1haW5pbmdEdXJhdGlvbiA8ZW0+UmVtYWluaW5nIER1cmF0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5SZW1haW5pbmcgRHVyYXRpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFJlbWFpbmluZ0R1cmF0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRSZW1haW5pbmdEdXJhdGlvbihPYmplY3QgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmVtYWluaW5nIENvc3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSByZW1haW5pbmcgcHJvamVjdGVkIGNvc3Qgb2YgY29tcGxldGluZyB0aGUgdGFzay4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZW1haW5pbmcgQ29zdDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UmVtYWluaW5nQ29zdChCaWdEZWNpbWFsKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFRhc2tfUmVtYWluaW5nQ29zdCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRGVjaW1hbCIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nUmVtYWluaW5nQ29zdCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0RlY2ltYWwgZ2V0UmVtYWluaW5nQ29zdCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldFJlbWFpbmluZ0Nvc3QgPGVtPlJlbWFpbmluZyBDb3N0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5SZW1haW5pbmcgQ29zdDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UmVtYWluaW5nQ29zdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UmVtYWluaW5nQ29zdChCaWdEZWNpbWFsIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJlbWFpbmluZyBXb3JrPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgcmVtYWluaW5nIHdvcmsgc2NoZWR1bGVkIHRvIGNvbXBsZXRlIHRoZSB0YXNrLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJlbWFpbmluZyBXb3JrPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRSZW1haW5pbmdXb3JrKE9iamVjdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRUYXNrX1JlbWFpbmluZ1dvcmsoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkR1cmF0aW9uIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdSZW1haW5pbmdXb3JrJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JT2JqZWN0IGdldFJlbWFpbmluZ1dvcmsoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRSZW1haW5pbmdXb3JrIDxlbT5SZW1haW5pbmcgV29yazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UmVtYWluaW5nIFdvcms8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFJlbWFpbmluZ1dvcmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFJlbWFpbmluZ1dvcmsoT2JqZWN0IHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJlbWFpbmluZyBPdmVydGltZSBDb3N0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgcmVtYWluaW5nIG92ZXJ0aW1lIGNvc3QgcHJvamVjdGVkIHRvIGZpbmlzaCB0aGUgdGFzay4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZW1haW5pbmcgT3ZlcnRpbWUgQ29zdDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UmVtYWluaW5nT3ZlcnRpbWVDb3N0KEJpZ0RlY2ltYWwpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VGFza19SZW1haW5pbmdPdmVydGltZUNvc3QoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkRlY2ltYWwiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1JlbWFpbmluZ092ZXJ0aW1lQ29zdCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0RlY2ltYWwgZ2V0UmVtYWluaW5nT3ZlcnRpbWVDb3N0KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0UmVtYWluaW5nT3ZlcnRpbWVDb3N0IDxlbT5SZW1haW5pbmcgT3ZlcnRpbWUgQ29zdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UmVtYWluaW5nIE92ZXJ0aW1lIENvc3Q8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFJlbWFpbmluZ092ZXJ0aW1lQ29zdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UmVtYWluaW5nT3ZlcnRpbWVDb3N0KEJpZ0RlY2ltYWwgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmVtYWluaW5nIE92ZXJ0aW1lIFdvcms8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSByZW1haW5pbmcgb3ZlcnRpbWUgd29yayBzY2hlZHVsZWQgdG8gZmluaXNoIHRoZSB0YXNrLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJlbWFpbmluZyBPdmVydGltZSBXb3JrPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRSZW1haW5pbmdPdmVydGltZVdvcmsoT2JqZWN0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFRhc2tfUmVtYWluaW5nT3ZlcnRpbWVXb3JrKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EdXJhdGlvbiIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nUmVtYWluaW5nT3ZlcnRpbWVXb3JrJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JT2JqZWN0IGdldFJlbWFpbmluZ092ZXJ0aW1lV29yaygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldFJlbWFpbmluZ092ZXJ0aW1lV29yayA8ZW0+UmVtYWluaW5nIE92ZXJ0aW1lIFdvcms8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlJlbWFpbmluZyBPdmVydGltZSBXb3JrPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRSZW1haW5pbmdPdmVydGltZVdvcmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFJlbWFpbmluZ092ZXJ0aW1lV29yayhPYmplY3QgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QUNXUDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGFjdHVhbCBjb3N0IG9mIHdvcmsgcGVyZm9ybWVkIG9uIHRoZSB0YXNrIHRvLWRhdGUuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QUNXUDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRBQ1dQKCkKLQkgKiBAc2VlICN1bnNldEFDV1AoKQotCSAqIEBzZWUgI3NldEFDV1AoZmxvYXQpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VGFza19BQ1dQKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5GbG9hdCIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQUNXUCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWZsb2F0IGdldEFDV1AoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRBQ1dQIDxlbT5BQ1dQPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BQ1dQPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldEFDV1AoKQotCSAqIEBzZWUgI3Vuc2V0QUNXUCgpCi0JICogQHNlZSAjZ2V0QUNXUCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0QUNXUChmbG9hdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRBQ1dQIDxlbT5BQ1dQPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldEFDV1AoKQotCSAqIEBzZWUgI2dldEFDV1AoKQotCSAqIEBzZWUgI3NldEFDV1AoZmxvYXQpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRBQ1dQKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRBQ1dQIDxlbT5BQ1dQPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BQ1dQPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRBQ1dQKCkKLQkgKiBAc2VlICNnZXRBQ1dQKCkKLQkgKiBAc2VlICNzZXRBQ1dQKGZsb2F0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0QUNXUCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q1Y8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIEVhcm5lZCB2YWx1ZSBjb3N0IHZhcmlhbmNlLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNWPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldENWKCkKLQkgKiBAc2VlICN1bnNldENWKCkKLQkgKiBAc2VlICNzZXRDVihmbG9hdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRUYXNrX0NWKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5GbG9hdCIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQ1YnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlmbG9hdCBnZXRDVigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldENWIDxlbT5DVjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q1Y8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0Q1YoKQotCSAqIEBzZWUgI3Vuc2V0Q1YoKQotCSAqIEBzZWUgI2dldENWKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRDVihmbG9hdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRDViA8ZW0+Q1Y8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0Q1YoKQotCSAqIEBzZWUgI2dldENWKCkKLQkgKiBAc2VlICNzZXRDVihmbG9hdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldENWKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRDViA8ZW0+Q1Y8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNWPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRDVigpCi0JICogQHNlZSAjZ2V0Q1YoKQotCSAqIEBzZWUgI3NldENWKGZsb2F0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0Q1YoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNvbnN0cmFpbnQgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGNvbnN0cmFpbnQgb24gdGhlIHN0YXJ0IG9yIGZpbmlzaCBkYXRlIG9mIHRoZSB0YXNrLiAKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlcyBhcmU6IDA9QXMgU29vbiBBcyBQb3NzaWJsZSwgMT1BcyBMYXRlIEFzIFBvc3NpYmxlLCAyPU11c3QgU3RhcnQgT24sIDM9TXVzdCBGaW5pc2ggT24sIAotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgND1TdGFydCBObyBFYXJsaWVyIFRoYW4sIDU9U3RhcnQgTm8gTGF0ZXIgVGhhbiwgNj1GaW5pc2ggTm8gRWFybGllciBUaGFuIGFuZCA3PUZpbmlzaCBObyBMYXRlciBUaGFuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q29uc3RyYWludCBUeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRDb25zdHJhaW50VHlwZShCaWdJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFRhc2tfQ29uc3RyYWludFR5cGUoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Db25zdHJhaW50VHlwZVR5cGUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0NvbnN0cmFpbnRUeXBlJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnSW50ZWdlciBnZXRDb25zdHJhaW50VHlwZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldENvbnN0cmFpbnRUeXBlIDxlbT5Db25zdHJhaW50IFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNvbnN0cmFpbnQgVHlwZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0Q29uc3RyYWludFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldENvbnN0cmFpbnRUeXBlKEJpZ0ludGVnZXIgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q2FsZW5kYXIgVUlEPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgdGFzayBjYWxlbmRhci5SZWZlcnMgdG8gYSB2YWxpZCBVSUQgaW4gdGhlIENhbGVuZGFycyBlbGVtZW50IG9mIAotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIE1pY3Jvc29mdCBQcm9qZWN0IFhNTCBTY2hlbWEuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q2FsZW5kYXIgVUlEPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRDYWxlbmRhclVJRChCaWdJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFRhc2tfQ2FsZW5kYXJVSUQoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkludGVnZXIiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0NhbGVuZGFyVUlEJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnSW50ZWdlciBnZXRDYWxlbmRhclVJRCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldENhbGVuZGFyVUlEIDxlbT5DYWxlbmRhciBVSUQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNhbGVuZGFyIFVJRDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0Q2FsZW5kYXJVSUQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldENhbGVuZGFyVUlEKEJpZ0ludGVnZXIgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q29uc3RyYWludCBEYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgZGF0ZSBhcmd1bWVudCBmb3IgdGhlIHRhc2sgY29uc3RyYWludCB0eXBlLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNvbnN0cmFpbnQgRGF0ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0Q29uc3RyYWludERhdGUoT2JqZWN0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFRhc2tfQ29uc3RyYWludERhdGUoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkRhdGVUaW1lIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdDb25zdHJhaW50RGF0ZScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU9iamVjdCBnZXRDb25zdHJhaW50RGF0ZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldENvbnN0cmFpbnREYXRlIDxlbT5Db25zdHJhaW50IERhdGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNvbnN0cmFpbnQgRGF0ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0Q29uc3RyYWludERhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldENvbnN0cmFpbnREYXRlKE9iamVjdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EZWFkbGluZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGRlYWRsaW5lIGZvciB0aGUgdGFzayB0byBiZSBjb21wbGV0ZWQuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGVhZGxpbmU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldERlYWRsaW5lKE9iamVjdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRUYXNrX0RlYWRsaW5lKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EYXRlVGltZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nRGVhZGxpbmUnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlPYmplY3QgZ2V0RGVhZGxpbmUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXREZWFkbGluZSA8ZW0+RGVhZGxpbmU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkRlYWRsaW5lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXREZWFkbGluZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RGVhZGxpbmUoT2JqZWN0IHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkxldmVsIEFzc2lnbm1lbnRzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBXaGV0aGVyIGxldmVsaW5nIGNhbiBhZGp1c3QgYXNzaWdubWVudHMuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TGV2ZWwgQXNzaWdubWVudHM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0TGV2ZWxBc3NpZ25tZW50cygpCi0JICogQHNlZSAjdW5zZXRMZXZlbEFzc2lnbm1lbnRzKCkKLQkgKiBAc2VlICNzZXRMZXZlbEFzc2lnbm1lbnRzKGJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VGFza19MZXZlbEFzc2lnbm1lbnRzKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdMZXZlbEFzc2lnbm1lbnRzJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc0xldmVsQXNzaWdubWVudHMoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNpc0xldmVsQXNzaWdubWVudHMgPGVtPkxldmVsIEFzc2lnbm1lbnRzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5MZXZlbCBBc3NpZ25tZW50czwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRMZXZlbEFzc2lnbm1lbnRzKCkKLQkgKiBAc2VlICN1bnNldExldmVsQXNzaWdubWVudHMoKQotCSAqIEBzZWUgI2lzTGV2ZWxBc3NpZ25tZW50cygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TGV2ZWxBc3NpZ25tZW50cyhib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2lzTGV2ZWxBc3NpZ25tZW50cyA8ZW0+TGV2ZWwgQXNzaWdubWVudHM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0TGV2ZWxBc3NpZ25tZW50cygpCi0JICogQHNlZSAjaXNMZXZlbEFzc2lnbm1lbnRzKCkKLQkgKiBAc2VlICNzZXRMZXZlbEFzc2lnbm1lbnRzKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRMZXZlbEFzc2lnbm1lbnRzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNpc0xldmVsQXNzaWdubWVudHMgPGVtPkxldmVsIEFzc2lnbm1lbnRzPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5MZXZlbCBBc3NpZ25tZW50czwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0TGV2ZWxBc3NpZ25tZW50cygpCi0JICogQHNlZSAjaXNMZXZlbEFzc2lnbm1lbnRzKCkKLQkgKiBAc2VlICNzZXRMZXZlbEFzc2lnbm1lbnRzKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRMZXZlbEFzc2lnbm1lbnRzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5MZXZlbGluZyBDYW4gU3BsaXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFdoZXRoZXIgbGV2ZWxpbmcgY2FuIHNwbGl0IHRoZSB0YXNrLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkxldmVsaW5nIENhbiBTcGxpdDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRMZXZlbGluZ0NhblNwbGl0KCkKLQkgKiBAc2VlICN1bnNldExldmVsaW5nQ2FuU3BsaXQoKQotCSAqIEBzZWUgI3NldExldmVsaW5nQ2FuU3BsaXQoYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRUYXNrX0xldmVsaW5nQ2FuU3BsaXQoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW4iCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0xldmVsaW5nQ2FuU3BsaXQnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzTGV2ZWxpbmdDYW5TcGxpdCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2lzTGV2ZWxpbmdDYW5TcGxpdCA8ZW0+TGV2ZWxpbmcgQ2FuIFNwbGl0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5MZXZlbGluZyBDYW4gU3BsaXQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0TGV2ZWxpbmdDYW5TcGxpdCgpCi0JICogQHNlZSAjdW5zZXRMZXZlbGluZ0NhblNwbGl0KCkKLQkgKiBAc2VlICNpc0xldmVsaW5nQ2FuU3BsaXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldExldmVsaW5nQ2FuU3BsaXQoYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNpc0xldmVsaW5nQ2FuU3BsaXQgPGVtPkxldmVsaW5nIENhbiBTcGxpdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRMZXZlbGluZ0NhblNwbGl0KCkKLQkgKiBAc2VlICNpc0xldmVsaW5nQ2FuU3BsaXQoKQotCSAqIEBzZWUgI3NldExldmVsaW5nQ2FuU3BsaXQoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldExldmVsaW5nQ2FuU3BsaXQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2lzTGV2ZWxpbmdDYW5TcGxpdCA8ZW0+TGV2ZWxpbmcgQ2FuIFNwbGl0PC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5MZXZlbGluZyBDYW4gU3BsaXQ8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldExldmVsaW5nQ2FuU3BsaXQoKQotCSAqIEBzZWUgI2lzTGV2ZWxpbmdDYW5TcGxpdCgpCi0JICogQHNlZSAjc2V0TGV2ZWxpbmdDYW5TcGxpdChib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0TGV2ZWxpbmdDYW5TcGxpdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TGV2ZWxpbmcgRGVsYXk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBkZWxheSBjYXVzZWQgYnkgbGV2ZWxpbmcgdGhlIHRhc2suCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TGV2ZWxpbmcgRGVsYXk8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldExldmVsaW5nRGVsYXkoQmlnSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRUYXNrX0xldmVsaW5nRGVsYXkoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkludGVnZXIiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0xldmVsaW5nRGVsYXknIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdJbnRlZ2VyIGdldExldmVsaW5nRGVsYXkoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRMZXZlbGluZ0RlbGF5IDxlbT5MZXZlbGluZyBEZWxheTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TGV2ZWxpbmcgRGVsYXk8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldExldmVsaW5nRGVsYXkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldExldmVsaW5nRGVsYXkoQmlnSW50ZWdlciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5MZXZlbGluZyBEZWxheSBGb3JtYXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBmb3JtYXQgZm9yIGV4cHJlc3NpbmcgdGhlIGR1cmF0aW9uIG9mIHRoZSBkZWxheS4gIAotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVzIGFyZTogMz1tLCA0PWVtLCA1PWgsIDY9ZWgsIDc9ZCwgOD1lZCwgOT13LCAxMD1ldywgMTE9bW8sIDEyPWVtbywgMTk9JSwgCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMD1lJSwgMjE9bnVsbCwgMzU9bT8sIDM2PWVtPywgMzc9aD8sIDM4PWVoPywgMzk9ZD8sIDQwPWVkPywgNDE9dz8sIDQyPWV3PywgCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0Mz1tbz8sIDQ0PWVtbz8sIDUxPSU/LCA1Mj1lJT8gYW5kIDUzPW51bGwuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TGV2ZWxpbmcgRGVsYXkgRm9ybWF0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRMZXZlbGluZ0RlbGF5Rm9ybWF0KEJpZ0ludGVnZXIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VGFza19MZXZlbGluZ0RlbGF5Rm9ybWF0KCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTGV2ZWxpbmdEZWxheUZvcm1hdFR5cGUxIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdMZXZlbGluZ0RlbGF5Rm9ybWF0JyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnSW50ZWdlciBnZXRMZXZlbGluZ0RlbGF5Rm9ybWF0KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0TGV2ZWxpbmdEZWxheUZvcm1hdCA8ZW0+TGV2ZWxpbmcgRGVsYXkgRm9ybWF0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5MZXZlbGluZyBEZWxheSBGb3JtYXQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldExldmVsaW5nRGVsYXlGb3JtYXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldExldmVsaW5nRGVsYXlGb3JtYXQoQmlnSW50ZWdlciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QcmUgTGV2ZWxlZCBTdGFydDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHN0YXJ0IGRhdGUgb2YgdGhlIHRhc2sgYmVmb3JlIGl0IHdhcyBsZXZlbGVkLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlByZSBMZXZlbGVkIFN0YXJ0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRQcmVMZXZlbGVkU3RhcnQoT2JqZWN0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFRhc2tfUHJlTGV2ZWxlZFN0YXJ0KCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EYXRlVGltZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nUHJlTGV2ZWxlZFN0YXJ0JyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JT2JqZWN0IGdldFByZUxldmVsZWRTdGFydCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldFByZUxldmVsZWRTdGFydCA8ZW0+UHJlIExldmVsZWQgU3RhcnQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlByZSBMZXZlbGVkIFN0YXJ0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRQcmVMZXZlbGVkU3RhcnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFByZUxldmVsZWRTdGFydChPYmplY3QgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UHJlIExldmVsZWQgRmluaXNoPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgZmluaXNoIGRhdGUgb2YgdGhlIHRhc2sgYmVmb3JlIGl0IHdhcyBsZXZlbGVkLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlByZSBMZXZlbGVkIEZpbmlzaDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UHJlTGV2ZWxlZEZpbmlzaChPYmplY3QpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VGFza19QcmVMZXZlbGVkRmluaXNoKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EYXRlVGltZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nUHJlTGV2ZWxlZEZpbmlzaCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU9iamVjdCBnZXRQcmVMZXZlbGVkRmluaXNoKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0UHJlTGV2ZWxlZEZpbmlzaCA8ZW0+UHJlIExldmVsZWQgRmluaXNoPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5QcmUgTGV2ZWxlZCBGaW5pc2g8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFByZUxldmVsZWRGaW5pc2goKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFByZUxldmVsZWRGaW5pc2goT2JqZWN0IHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkh5cGVybGluazwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHRpdGxlIG9mIHRoZSBoeXBlcmxpbmsgYXNzb2NpYXRlZCB3aXRoIHRoZSB0YXNrLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkh5cGVybGluazwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0SHlwZXJsaW5rKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRUYXNrX0h5cGVybGluaygpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lkh5cGVybGlua1R5cGUyIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdIeXBlcmxpbmsnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0SHlwZXJsaW5rKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0SHlwZXJsaW5rIDxlbT5IeXBlcmxpbms8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkh5cGVybGluazwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0SHlwZXJsaW5rKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRIeXBlcmxpbmsoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkh5cGVybGluayBBZGRyZXNzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgaHlwZXJsaW5rIGFzc29jaWF0ZWQgd2l0aCB0aGUgdGFzay4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5IeXBlcmxpbmsgQWRkcmVzczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0SHlwZXJsaW5rQWRkcmVzcyhTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VGFza19IeXBlcmxpbmtBZGRyZXNzKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuSHlwZXJsaW5rQWRkcmVzc1R5cGUyIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdIeXBlcmxpbmtBZGRyZXNzJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldEh5cGVybGlua0FkZHJlc3MoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRIeXBlcmxpbmtBZGRyZXNzIDxlbT5IeXBlcmxpbmsgQWRkcmVzczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SHlwZXJsaW5rIEFkZHJlc3M8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEh5cGVybGlua0FkZHJlc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEh5cGVybGlua0FkZHJlc3MoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkh5cGVybGluayBTdWIgQWRkcmVzczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGRvY3VtZW50IGJvb2ttYXJrIG9mIHRoZSBoeXBlcmxpbmsgYXNzb2NpYXRlZCB3aXRoIHRoZSB0YXNrLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkh5cGVybGluayBTdWIgQWRkcmVzczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0SHlwZXJsaW5rU3ViQWRkcmVzcyhTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VGFza19IeXBlcmxpbmtTdWJBZGRyZXNzKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuSHlwZXJsaW5rU3ViQWRkcmVzc1R5cGUyIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdIeXBlcmxpbmtTdWJBZGRyZXNzJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldEh5cGVybGlua1N1YkFkZHJlc3MoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRIeXBlcmxpbmtTdWJBZGRyZXNzIDxlbT5IeXBlcmxpbmsgU3ViIEFkZHJlc3M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkh5cGVybGluayBTdWIgQWRkcmVzczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0SHlwZXJsaW5rU3ViQWRkcmVzcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0SHlwZXJsaW5rU3ViQWRkcmVzcyhTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SWdub3JlIFJlc291cmNlIENhbGVuZGFyPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBXaGV0aGVyIHRoZSB0YXNrIGlnbm9yZXMgdGhlIHJlc291cmNlIGNhbGVuZGFyLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPklnbm9yZSBSZXNvdXJjZSBDYWxlbmRhcjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRJZ25vcmVSZXNvdXJjZUNhbGVuZGFyKCkKLQkgKiBAc2VlICN1bnNldElnbm9yZVJlc291cmNlQ2FsZW5kYXIoKQotCSAqIEBzZWUgI3NldElnbm9yZVJlc291cmNlQ2FsZW5kYXIoYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRUYXNrX0lnbm9yZVJlc291cmNlQ2FsZW5kYXIoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW4iCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0lnbm9yZVJlc291cmNlQ2FsZW5kYXInIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzSWdub3JlUmVzb3VyY2VDYWxlbmRhcigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2lzSWdub3JlUmVzb3VyY2VDYWxlbmRhciA8ZW0+SWdub3JlIFJlc291cmNlIENhbGVuZGFyPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5JZ25vcmUgUmVzb3VyY2UgQ2FsZW5kYXI8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0SWdub3JlUmVzb3VyY2VDYWxlbmRhcigpCi0JICogQHNlZSAjdW5zZXRJZ25vcmVSZXNvdXJjZUNhbGVuZGFyKCkKLQkgKiBAc2VlICNpc0lnbm9yZVJlc291cmNlQ2FsZW5kYXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldElnbm9yZVJlc291cmNlQ2FsZW5kYXIoYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNpc0lnbm9yZVJlc291cmNlQ2FsZW5kYXIgPGVtPklnbm9yZSBSZXNvdXJjZSBDYWxlbmRhcjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRJZ25vcmVSZXNvdXJjZUNhbGVuZGFyKCkKLQkgKiBAc2VlICNpc0lnbm9yZVJlc291cmNlQ2FsZW5kYXIoKQotCSAqIEBzZWUgI3NldElnbm9yZVJlc291cmNlQ2FsZW5kYXIoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldElnbm9yZVJlc291cmNlQ2FsZW5kYXIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2lzSWdub3JlUmVzb3VyY2VDYWxlbmRhciA8ZW0+SWdub3JlIFJlc291cmNlIENhbGVuZGFyPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JZ25vcmUgUmVzb3VyY2UgQ2FsZW5kYXI8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldElnbm9yZVJlc291cmNlQ2FsZW5kYXIoKQotCSAqIEBzZWUgI2lzSWdub3JlUmVzb3VyY2VDYWxlbmRhcigpCi0JICogQHNlZSAjc2V0SWdub3JlUmVzb3VyY2VDYWxlbmRhcihib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0SWdub3JlUmVzb3VyY2VDYWxlbmRhcigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Tm90ZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRleHQgbm90ZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSB0YXNrLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk5vdGVzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXROb3RlcyhTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VGFza19Ob3RlcygpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdOb3RlcycgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXROb3RlcygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldE5vdGVzIDxlbT5Ob3RlczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Tm90ZXM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldE5vdGVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXROb3RlcyhTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SGlkZSBCYXI8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFdoZXRoZXIgdGhlIEdBTlRUIGJhciBvZiB0aGUgdGFzayBpcyBoaWRkZW4gd2hlbiBkaXNwbGF5ZWQgaW4gTWljcm9zb2Z0IFByb2plY3QuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SGlkZSBCYXI8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0SGlkZUJhcigpCi0JICogQHNlZSAjdW5zZXRIaWRlQmFyKCkKLQkgKiBAc2VlICNzZXRIaWRlQmFyKGJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VGFza19IaWRlQmFyKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdIaWRlQmFyJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc0hpZGVCYXIoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNpc0hpZGVCYXIgPGVtPkhpZGUgQmFyPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5IaWRlIEJhcjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRIaWRlQmFyKCkKLQkgKiBAc2VlICN1bnNldEhpZGVCYXIoKQotCSAqIEBzZWUgI2lzSGlkZUJhcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0SGlkZUJhcihib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2lzSGlkZUJhciA8ZW0+SGlkZSBCYXI8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0SGlkZUJhcigpCi0JICogQHNlZSAjaXNIaWRlQmFyKCkKLQkgKiBAc2VlICNzZXRIaWRlQmFyKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRIaWRlQmFyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNpc0hpZGVCYXIgPGVtPkhpZGUgQmFyPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5IaWRlIEJhcjwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0SGlkZUJhcigpCi0JICogQHNlZSAjaXNIaWRlQmFyKCkKLQkgKiBAc2VlICNzZXRIaWRlQmFyKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRIaWRlQmFyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Sb2xsdXA8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFdoZXRoZXIgdGhlIHRhc2sgaXMgcm9sbGVkIHVwLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJvbGx1cDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRSb2xsdXAoKQotCSAqIEBzZWUgI3Vuc2V0Um9sbHVwKCkKLQkgKiBAc2VlICNzZXRSb2xsdXAoYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRUYXNrX1JvbGx1cCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbiIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nUm9sbHVwJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1JvbGx1cCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2lzUm9sbHVwIDxlbT5Sb2xsdXA8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlJvbGx1cDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRSb2xsdXAoKQotCSAqIEBzZWUgI3Vuc2V0Um9sbHVwKCkKLQkgKiBAc2VlICNpc1JvbGx1cCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Um9sbHVwKGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjaXNSb2xsdXAgPGVtPlJvbGx1cDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRSb2xsdXAoKQotCSAqIEBzZWUgI2lzUm9sbHVwKCkKLQkgKiBAc2VlICNzZXRSb2xsdXAoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldFJvbGx1cCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjaXNSb2xsdXAgPGVtPlJvbGx1cDwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Um9sbHVwPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRSb2xsdXAoKQotCSAqIEBzZWUgI2lzUm9sbHVwKCkKLQkgKiBAc2VlICNzZXRSb2xsdXAoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldFJvbGx1cCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QkNXUzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGJ1ZGdldGVkIGNvc3Qgb2Ygd29yayBzY2hlZHVsZWQgZm9yIHRoZSB0YXNrLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkJDV1M8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0QkNXUygpCi0JICogQHNlZSAjdW5zZXRCQ1dTKCkKLQkgKiBAc2VlICNzZXRCQ1dTKGZsb2F0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFRhc2tfQkNXUygpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRmxvYXQiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0JDV1MnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlmbG9hdCBnZXRCQ1dTKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0QkNXUyA8ZW0+QkNXUzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QkNXUzwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRCQ1dTKCkKLQkgKiBAc2VlICN1bnNldEJDV1MoKQotCSAqIEBzZWUgI2dldEJDV1MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEJDV1MoZmxvYXQgdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0QkNXUyA8ZW0+QkNXUzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRCQ1dTKCkKLQkgKiBAc2VlICNnZXRCQ1dTKCkKLQkgKiBAc2VlICNzZXRCQ1dTKGZsb2F0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0QkNXUygpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0QkNXUyA8ZW0+QkNXUzwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QkNXUzwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0QkNXUygpCi0JICogQHNlZSAjZ2V0QkNXUygpCi0JICogQHNlZSAjc2V0QkNXUyhmbG9hdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldEJDV1MoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkJDV1A8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBidWRnZXRlZCBjb3N0IG9mIHdvcmsgcGVyZm9ybWVkIG9uIHRoZSB0YXNrIHRvLWRhdGUuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QkNXUDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRCQ1dQKCkKLQkgKiBAc2VlICN1bnNldEJDV1AoKQotCSAqIEBzZWUgI3NldEJDV1AoZmxvYXQpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VGFza19CQ1dQKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5GbG9hdCIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQkNXUCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWZsb2F0IGdldEJDV1AoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRCQ1dQIDxlbT5CQ1dQPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5CQ1dQPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldEJDV1AoKQotCSAqIEBzZWUgI3Vuc2V0QkNXUCgpCi0JICogQHNlZSAjZ2V0QkNXUCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0QkNXUChmbG9hdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRCQ1dQIDxlbT5CQ1dQPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldEJDV1AoKQotCSAqIEBzZWUgI2dldEJDV1AoKQotCSAqIEBzZWUgI3NldEJDV1AoZmxvYXQpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRCQ1dQKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRCQ1dQIDxlbT5CQ1dQPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5CQ1dQPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRCQ1dQKCkKLQkgKiBAc2VlICNnZXRCQ1dQKCkKLQkgKiBAc2VlICNzZXRCQ1dQKGZsb2F0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0QkNXUCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UGh5c2ljYWwgUGVyY2VudCBDb21wbGV0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHBlcmNlbnRhZ2UgY29tcGxldGUgdmFsdWUgZW50ZXJlZCBieSB0aGUgUHJvamVjdCBNYW5hZ2VyLiAgCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGNhbiBiZSB1c2VkIGFzIGFuIGFsdGVybmF0aXZlIGZvciBjYWxjdWxhdGluZyBCQ1dQLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlBoeXNpY2FsIFBlcmNlbnQgQ29tcGxldGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFBoeXNpY2FsUGVyY2VudENvbXBsZXRlKEJpZ0ludGVnZXIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VGFza19QaHlzaWNhbFBlcmNlbnRDb21wbGV0ZSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuSW50ZWdlciIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nUGh5c2ljYWxQZXJjZW50Q29tcGxldGUnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdJbnRlZ2VyIGdldFBoeXNpY2FsUGVyY2VudENvbXBsZXRlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0UGh5c2ljYWxQZXJjZW50Q29tcGxldGUgPGVtPlBoeXNpY2FsIFBlcmNlbnQgQ29tcGxldGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlBoeXNpY2FsIFBlcmNlbnQgQ29tcGxldGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFBoeXNpY2FsUGVyY2VudENvbXBsZXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRQaHlzaWNhbFBlcmNlbnRDb21wbGV0ZShCaWdJbnRlZ2VyIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkVhcm5lZCBWYWx1ZSBNZXRob2Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBtZXRob2QgZm9yIGNhbGN1bGF0aW5nIGVhcm5lZCB2YWx1ZS4gCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZXMgYXJlOiAwPVBlcmNlbnQgQ29tcGxldGUsIDE9UGh5c2ljYWwgUGVyY2VudCBDb21wbGV0ZQotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkVhcm5lZCBWYWx1ZSBNZXRob2Q8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEVhcm5lZFZhbHVlTWV0aG9kKEJpZ0ludGVnZXIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VGFza19FYXJuZWRWYWx1ZU1ldGhvZCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkVhcm5lZFZhbHVlTWV0aG9kVHlwZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nRWFybmVkVmFsdWVNZXRob2QnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdJbnRlZ2VyIGdldEVhcm5lZFZhbHVlTWV0aG9kKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0RWFybmVkVmFsdWVNZXRob2QgPGVtPkVhcm5lZCBWYWx1ZSBNZXRob2Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkVhcm5lZCBWYWx1ZSBNZXRob2Q8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEVhcm5lZFZhbHVlTWV0aG9kKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRFYXJuZWRWYWx1ZU1ldGhvZChCaWdJbnRlZ2VyIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlByZWRlY2Vzc29yIExpbms8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByZWRlY2Vzc29yTGlua30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBEZWZpbmVzIHRoZSBwcmVkZWNlc3NvciB0YXNrIG9mIHRoZSB0YXNrIHRoYXQgY29udGFpbnMgaXQuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UHJlZGVjZXNzb3IgTGluazwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRUYXNrX1ByZWRlY2Vzc29yTGluaygpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJlZGVjZXNzb3JMaW5rIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdQcmVkZWNlc3NvckxpbmsnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXRQcmVkZWNlc3NvckxpbmsoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkFjdHVhbCBXb3JrIFByb3RlY3RlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogU3BlY2lmaWVzIHRoZSBkdXJhdGlvbiB0aHJvdWdoIHdoaWNoIGFjdHVhbCB3b3JrIGlzIHByb3RlY3RlZC4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BY3R1YWwgV29yayBQcm90ZWN0ZWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEFjdHVhbFdvcmtQcm90ZWN0ZWQoT2JqZWN0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFRhc2tfQWN0dWFsV29ya1Byb3RlY3RlZCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRHVyYXRpb24iCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0FjdHVhbFdvcmtQcm90ZWN0ZWQnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlPYmplY3QgZ2V0QWN0dWFsV29ya1Byb3RlY3RlZCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldEFjdHVhbFdvcmtQcm90ZWN0ZWQgPGVtPkFjdHVhbCBXb3JrIFByb3RlY3RlZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QWN0dWFsIFdvcmsgUHJvdGVjdGVkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRBY3R1YWxXb3JrUHJvdGVjdGVkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRBY3R1YWxXb3JrUHJvdGVjdGVkKE9iamVjdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BY3R1YWwgT3ZlcnRpbWUgV29yayBQcm90ZWN0ZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFNwZWNpZmllcyB0aGUgZHVyYXRpb24gdGhyb3VnaCB3aGljaCBhY3R1YWwgb3ZlcnRpbWUgd29yayBpcyBwcm90ZWN0ZWQuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QWN0dWFsIE92ZXJ0aW1lIFdvcmsgUHJvdGVjdGVkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRBY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQoT2JqZWN0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFRhc2tfQWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EdXJhdGlvbiIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JT2JqZWN0IGdldEFjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldEFjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZCA8ZW0+QWN0dWFsIE92ZXJ0aW1lIFdvcmsgUHJvdGVjdGVkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BY3R1YWwgT3ZlcnRpbWUgV29yayBQcm90ZWN0ZWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEFjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0QWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkKE9iamVjdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FeHRlbmRlZCBBdHRyaWJ1dGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlMn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgdmFsdWUgb2YgYW4gZXh0ZW5kZWQgYXR0cmlidXRlLiAgVHdvIHBpZWNlcyBvZiBkYXRhIGFyZSBuZWNlc3NhcnkgLSAKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEgcG9pbnRlciBiYWNrIHRvIHRoZSBleHRlbmRlZCBhdHRyaWJ1dGUgdGFibGUgd2hpY2ggaXMgc3BlY2lmaWVkIGVpdGhlciBieSB0aGUgdW5pcXVlIElEIG9yIAotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIEZpZWxkIElELCBhbmQgdGhlIHZhbHVlIHdoaWNoIGlzIHNwZWNpZmllZCBlaXRoZXIgd2l0aCB0aGUgdmFsdWUsIG9yIGEgcG9pbnRlciBiYWNrIHRvIHRoZSB2YWx1ZSBsaXN0LgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkV4dGVuZGVkIEF0dHJpYnV0ZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRUYXNrX0V4dGVuZGVkQXR0cmlidXRlKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZTIiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0V4dGVuZGVkQXR0cmlidXRlJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkJhc2VsaW5lPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgY29sbGVjdGlvbiBvZiBiYXNlbGluZSB2YWx1ZXMgb2YgdGhlIHRhc2suCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QmFzZWxpbmU8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VGFza19CYXNlbGluZSgpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0Jhc2VsaW5lJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0QmFzZWxpbmUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk91dGxpbmUgQ29kZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGUyfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSB2YWx1ZSBvZiBhbiBvdXRsaW5lIGNvZGUuICBUd28gcGllY2VzIG9mIGRhdGEgYXJlIG5lY2Vzc2FyeSAtIAotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYSBwb2ludGVyIGJhY2sgdG8gdGhlIG91dGxpbmUgY29kZSB0YWJsZSB3aGljaCBpcyBzcGVjaWZpZWQgZWl0aGVyIGJ5IHRoZSB1bmlxdWUgSUQgb3IgdGhlIEZpZWxkIElELCAKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCB0aGUgdmFsdWUgd2hpY2ggaXMgc3BlY2lmaWVkIGVpdGhlciB3aXRoIHRoZSB2YWx1ZSwgb3IgYSBwb2ludGVyIGJhY2sgdG8gdGhlIHZhbHVlIGxpc3QuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+T3V0bGluZSBDb2RlPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFRhc2tfT3V0bGluZUNvZGUoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlMiIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nT3V0bGluZUNvZGUnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXRPdXRsaW5lQ29kZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VGltZXBoYXNlZCBEYXRhPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UaW1lcGhhc2VkRGF0YVR5cGV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHRpbWUgcGhhc2VkIGRhdGEgYmxvY2sgYXNzb2NpYXRlZCB3aXRoIHRoZSB0YXNrLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlRpbWVwaGFzZWQgRGF0YTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRUYXNrX1RpbWVwaGFzZWREYXRhKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UaW1lcGhhc2VkRGF0YVR5cGUiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1RpbWVwaGFzZWREYXRhJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0VGltZXBoYXNlZERhdGEoKTsKLQotfSAvLyBUYXNrCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L1Rhc2tzLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L1Rhc2tzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1YzQzYzAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9UYXNrcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBUYXNrcy5qYXZhLHYgMS4xIDIwMDgvMDEvMTUgMDg6NTI6NDYganRoYW0gRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5UYXNrczwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2tzI2dldFRhc2sgPGVtPlRhc2s8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRUYXNrcygpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nVGFza3NfLl90eXBlJyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgVGFza3MgZXh0ZW5kcyBFT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5UYXNrPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZXJlIG11c3QgYmUgYXQgbGVhc3Qgb25lIHRhc2sgaW4gZWFjaCBUYXNrcyBjb2xsZWN0aW9uLgotCSAqICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlRhc2s8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VGFza3NfVGFzaygpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nVGFzaycgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldFRhc2soKTsKLQotfSAvLyBUYXNrcwpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9UaW1lUGVyaW9kLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L1RpbWVQZXJpb2QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTc4Y2JhZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L1RpbWVQZXJpb2QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogVGltZVBlcmlvZC5qYXZhLHYgMS4xIDIwMDgvMDEvMTUgMDg6NTI6NDYganRoYW0gRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlRpbWUgUGVyaW9kPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGltZVBlcmlvZCNnZXRGcm9tRGF0ZSA8ZW0+RnJvbSBEYXRlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRpbWVQZXJpb2QjZ2V0VG9EYXRlIDxlbT5UbyBEYXRlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VGltZVBlcmlvZCgpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nVGltZVBlcmlvZF8uX3R5cGUnIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBUaW1lUGVyaW9kIGV4dGVuZHMgRU9iamVjdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RnJvbSBEYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgYmVnaW5uaW5nIG9mIHRoZSBleGNlcHRpb24gdGltZS4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RnJvbSBEYXRlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRGcm9tRGF0ZShPYmplY3QpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VGltZVBlcmlvZF9Gcm9tRGF0ZSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRGF0ZVRpbWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0Zyb21EYXRlJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JT2JqZWN0IGdldEZyb21EYXRlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRpbWVQZXJpb2QjZ2V0RnJvbURhdGUgPGVtPkZyb20gRGF0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RnJvbSBEYXRlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRGcm9tRGF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RnJvbURhdGUoT2JqZWN0IHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlRvIERhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBlbmQgb2YgdGhlIGV4Y2VwdGlvbiB0aW1lLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5UbyBEYXRlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRUb0RhdGUoT2JqZWN0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFRpbWVQZXJpb2RfVG9EYXRlKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EYXRlVGltZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nVG9EYXRlJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JT2JqZWN0IGdldFRvRGF0ZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UaW1lUGVyaW9kI2dldFRvRGF0ZSA8ZW0+VG8gRGF0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VG8gRGF0ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0VG9EYXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRUb0RhdGUoT2JqZWN0IHZhbHVlKTsKLQotfSAvLyBUaW1lUGVyaW9kCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L1RpbWVwaGFzZWREYXRhVHlwZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9UaW1lcGhhc2VkRGF0YVR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjZkZDBmNS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L1RpbWVwaGFzZWREYXRhVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjc2ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogVGltZXBoYXNlZERhdGFUeXBlLmphdmEsdiAxLjEgMjAwOC8wMS8xNSAwODo1Mjo0NiBqdGhhbSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Q7Ci0KLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5UaW1lcGhhc2VkIERhdGEgVHlwZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIFRoZSBkZWZpbml0aW9uIG9mIHRoZSB0aW1lIHBoYXNlZCBkYXRhIGJsb2NrLgotICogCQkgICAgICAgIAotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGltZXBoYXNlZERhdGFUeXBlI2dldFR5cGUgPGVtPlR5cGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGltZXBoYXNlZERhdGFUeXBlI2dldFVJRCA8ZW0+VUlEPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRpbWVwaGFzZWREYXRhVHlwZSNnZXRTdGFydCA8ZW0+U3RhcnQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGltZXBoYXNlZERhdGFUeXBlI2dldEZpbmlzaCA8ZW0+RmluaXNoPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRpbWVwaGFzZWREYXRhVHlwZSNnZXRVbml0IDxlbT5Vbml0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRpbWVwaGFzZWREYXRhVHlwZSNnZXRWYWx1ZSA8ZW0+VmFsdWU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRUaW1lcGhhc2VkRGF0YVR5cGUoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J1RpbWVwaGFzZWREYXRhVHlwZScga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFRpbWVwaGFzZWREYXRhVHlwZSBleHRlbmRzIEVPYmplY3QgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIAotCSAqICAgICAgICAgICAgICAgICBUaGUgdHlwZSBvZiB0YXNrIHRpbWVwaGFzZWQgZGF0YS4gVmFsdWVzIGFyZToKLQkgKiAgICAgICAgICAgICAgICAgICAgIDE9QXNzaWdubWVudCBSZW1haW5pbmcgV29yawotCSAqICAgICAgICAgICAgICAgICAgICAgMj1Bc3NpZ25tZW50IEFjdHVhbCBXb3JrCi0JICogICAgICAgICAgICAgICAgICAgICAzPUFzc2lnbm1lbnQgQWN0dWFsIE92ZXJ0aW1lIFdvcmsKLQkgKiAgICAgICAgICAgICAgICAgICAgIDQ9QXNzaWdubWVudCBCYXNlbGluZSBXb3JrCi0JICogICAgICAgICAgICAgICAgICAgICA1PUFzc2lnbm1lbnQgQmFzZWxpbmUgQ29zdAotCSAqICAgICAgICAgICAgICAgICAgICAgNj1Bc3NpZ25tZW50IEFjdHVhbCBDb3N0Ci0JICogICAgICAgICAgICAgICAgICAgICA3PVJlc291cmNlIEJhc2VsaW5lIFdvcmsKLQkgKiAgICAgICAgICAgICAgICAgICAgIDg9UmVzb3VyY2UgQmFzZWxpbmUgQ29zdAotCSAqICAgICAgICAgICAgICAgICAgICAgOT1UYXNrIEJhc2VsaW5lIFdvcmsKLQkgKiAgICAgICAgICAgICAgICAgICAgIDEwPVRhc2sgQmFzZWxpbmUgQ29zdAotCSAqICAgICAgICAgICAgICAgICAgICAgMTE9VGFzayBQZXJjZW50IENvbXBsZXRlCi0JICogICAgICAgICAgICAgICAgICAgICAxNj1Bc3NpZ25tZW50IEJhc2VsaW5lIDEgV29yawotCSAqICAgICAgICAgICAgICAgICAgICAgMTc9QXNzaWdubWVudCBCYXNlbGluZSAxIENvc3QKLQkgKiAgICAgICAgICAgICAgICAgICAgIDE4PVRhc2sgQmFzZWxpbmUgMSBXb3JrCi0JICogICAgICAgICAgICAgICAgICAgICAxOT1UYXNrIEJhc2VsaW5lIDEgQ29zdAotCSAqICAgICAgICAgICAgICAgICAgICAgMjA9UmVzb3VyY2UgQmFzZWxpbmUgMSBXb3JrCi0JICogICAgICAgICAgICAgICAgICAgICAyMT1SZXNvdXJjZSBCYXNlbGluZSAxIENvc3QKLQkgKiAgICAgICAgICAgICAgICAgICAgIDIyPUFzc2lnbm1lbnQgQmFzZWxpbmUgMiBXb3JrCi0JICogICAgICAgICAgICAgICAgICAgICAyMz1Bc3NpZ25tZW50IEJhc2VsaW5lIDIgQ29zdAotCSAqICAgICAgICAgICAgICAgICAgICAgMjQ9VGFzayBCYXNlbGluZSAyIFdvcmsKLQkgKiAgICAgICAgICAgICAgICAgICAgIDI1PVRhc2sgQmFzZWxpbmUgMiBDb3N0Ci0JICogICAgICAgICAgICAgICAgICAgICAyNj1SZXNvdXJjZSBCYXNlbGluZSAyIFdvcmsKLQkgKiAgICAgICAgICAgICAgICAgICAgIDI3PVJlc291cmNlIEJhc2VsaW5lIDIgQ29zdAotCSAqICAgICAgICAgICAgICAgICAgICAgMjg9QXNzaWdubWVudCBCYXNlbGluZSAzIFdvcmsKLQkgKiAgICAgICAgICAgICAgICAgICAgIDI5PUFzc2lnbm1lbnQgQmFzZWxpbmUgMyBDb3N0Ci0JICogICAgICAgICAgICAgICAgICAgICAzMD1UYXNrIEJhc2VsaW5lIDMgV29yawotCSAqICAgICAgICAgICAgICAgICAgICAgMzE9VGFzayBCYXNlbGluZSAzIENvc3QKLQkgKiAgICAgICAgICAgICAgICAgICAgIDMyPVJlc291cmNlIEJhc2VsaW5lIDMgV29yawotCSAqICAgICAgICAgICAgICAgICAgICAgMzM9UmVzb3VyY2UgQmFzZWxpbmUgMyBDb3N0Ci0JICogICAgICAgICAgICAgICAgICAgICAzND1Bc3NpZ25tZW50IEJhc2VsaW5lIDQgV29yawotCSAqICAgICAgICAgICAgICAgICAgICAgMzU9QXNzaWdubWVudCBCYXNlbGluZSA0IENvc3QKLQkgKiAgICAgICAgICAgICAgICAgICAgIDM2PVRhc2sgQmFzZWxpbmUgNCBXb3JrCi0JICogICAgICAgICAgICAgICAgICAgICAzNz1UYXNrIEJhc2VsaW5lIDQgQ29zdAotCSAqICAgICAgICAgICAgICAgICAgICAgMzg9UmVzb3VyY2UgQmFzZWxpbmUgNCBXb3JrCi0JICogICAgICAgICAgICAgICAgICAgICAzOT1SZXNvdXJjZSBCYXNlbGluZSA0IENvc3QKLQkgKiAgICAgICAgICAgICAgICAgICAgIDQwPUFzc2lnbm1lbnQgQmFzZWxpbmUgNSBXb3JrCi0JICogICAgICAgICAgICAgICAgICAgICA0MT1Bc3NpZ25tZW50IEJhc2VsaW5lIDUgQ29zdAotCSAqICAgICAgICAgICAgICAgICAgICAgNDI9VGFzayBCYXNlbGluZSA1IFdvcmsKLQkgKiAgICAgICAgICAgICAgICAgICAgIDQzPVRhc2sgQmFzZWxpbmUgNSBDb3N0Ci0JICogICAgICAgICAgICAgICAgICAgICA0ND1SZXNvdXJjZSBCYXNlbGluZSA1IFdvcmsKLQkgKiAgICAgICAgICAgICAgICAgICAgIDQ1PVJlc291cmNlIEJhc2VsaW5lIDUgQ29zdAotCSAqICAgICAgICAgICAgICAgICAgICAgNDY9QXNzaWdubWVudCBCYXNlbGluZSA2IFdvcmsKLQkgKiAgICAgICAgICAgICAgICAgICAgIDQ3PUFzc2lnbm1lbnQgQmFzZWxpbmUgNiBDb3N0Ci0JICogICAgICAgICAgICAgICAgICAgICA0OD1UYXNrIEJhc2VsaW5lIDYgV29yawotCSAqICAgICAgICAgICAgICAgICAgICAgNDk9VGFzayBCYXNlbGluZSA2IENvc3QKLQkgKiAgICAgICAgICAgICAgICAgICAgIDUwPVJlc291cmNlIEJhc2VsaW5lIDYgV29yawotCSAqICAgICAgICAgICAgICAgICAgICAgNTE9UmVzb3VyY2UgQmFzZWxpbmUgNiBDb3N0Ci0JICogICAgICAgICAgICAgICAgICAgICA1Mj1Bc3NpZ25tZW50IEJhc2VsaW5lIDcgV29yawotCSAqICAgICAgICAgICAgICAgICAgICAgNTM9QXNzaWdubWVudCBCYXNlbGluZSA3IENvc3QKLQkgKiAgICAgICAgICAgICAgICAgICAgIDU0PVRhc2sgQmFzZWxpbmUgNyBXb3JrCi0JICogICAgICAgICAgICAgICAgICAgICA1NT1UYXNrIEJhc2VsaW5lIDcgQ29zdAotCSAqICAgICAgICAgICAgICAgICAgICAgNTY9UmVzb3VyY2UgQmFzZWxpbmUgNyBXb3JrCi0JICogICAgICAgICAgICAgICAgICAgICA1Nz1SZXNvdXJjZSBCYXNlbGluZSA3IENvc3QKLQkgKiAgICAgICAgICAgICAgICAgICAgIDU4PUFzc2lnbm1lbnQgQmFzZWxpbmUgOCBXb3JrCi0JICogICAgICAgICAgICAgICAgICAgICA1OT1Bc3NpZ25tZW50IEJhc2VsaW5lIDggQ29zdAotCSAqICAgICAgICAgICAgICAgICAgICAgNjA9VGFzayBCYXNlbGluZSA4IFdvcmsKLQkgKiAgICAgICAgICAgICAgICAgICAgIDYxPVRhc2sgQmFzZWxpbmUgOCBDb3N0Ci0JICogICAgICAgICAgICAgICAgICAgICA2Mj1SZXNvdXJjZSBCYXNlbGluZSA4IFdvcmsKLQkgKiAgICAgICAgICAgICAgICAgICAgIDYzPVJlc291cmNlIEJhc2VsaW5lIDggQ29zdAotCSAqICAgICAgICAgICAgICAgICAgICAgNjQ9QXNzaWdubWVudCBCYXNlbGluZSA5IFdvcmsKLQkgKiAgICAgICAgICAgICAgICAgICAgIDY1PUFzc2lnbm1lbnQgQmFzZWxpbmUgOSBDb3N0Ci0JICogICAgICAgICAgICAgICAgICAgICA2Nj1UYXNrIEJhc2VsaW5lIDkgV29yawotCSAqICAgICAgICAgICAgICAgICAgICAgNjc9VGFzayBCYXNlbGluZSA5IENvc3QKLQkgKiAgICAgICAgICAgICAgICAgICAgIDY4PVJlc291cmNlIEJhc2VsaW5lIDkgV29yawotCSAqICAgICAgICAgICAgICAgICAgICAgNjk9UmVzb3VyY2UgQmFzZWxpbmUgOSBDb3N0Ci0JICogICAgICAgICAgICAgICAgICAgICA3MD1Bc3NpZ25tZW50IEJhc2VsaW5lIDEwIFdvcmsKLQkgKiAgICAgICAgICAgICAgICAgICAgIDcxPUFzc2lnbm1lbnQgQmFzZWxpbmUgMTAgQ29zdAotCSAqICAgICAgICAgICAgICAgICAgICAgNzI9VGFzayBCYXNlbGluZSAxMCBXb3JrCi0JICogICAgICAgICAgICAgICAgICAgICA3Mz1UYXNrIEJhc2VsaW5lIDEwIENvc3QKLQkgKiAgICAgICAgICAgICAgICAgICAgIDc0PVJlc291cmNlIEJhc2VsaW5lIDEwIFdvcmsKLQkgKiAgICAgICAgICAgICAgICAgICAgIDc1PVJlc291cmNlIEJhc2VsaW5lIDEwIENvc3QKLQkgKiAgICAgICAgICAgICAgICAgICAgIDc2PVBoeXNpY2FsIFBlcmNlbnQgQ29tcGxldGUKLQkgKiAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFR5cGUoQmlnSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRUaW1lcGhhc2VkRGF0YVR5cGVfVHlwZSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlR5cGVUeXBlMyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nVHlwZScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0ludGVnZXIgZ2V0VHlwZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UaW1lcGhhc2VkRGF0YVR5cGUjZ2V0VHlwZSA8ZW0+VHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VHlwZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VHlwZShCaWdJbnRlZ2VyIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlVJRDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSB0aW1lcGhhc2VkIGRhdGEgcmVjb3JkLgotCSAqICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VUlEPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRVSUQoQmlnSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRUaW1lcGhhc2VkRGF0YVR5cGVfVUlEKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5JbnRlZ2VyIiByZXF1aXJlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nVUlEJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnSW50ZWdlciBnZXRVSUQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGltZXBoYXNlZERhdGFUeXBlI2dldFVJRCA8ZW0+VUlEPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5VSUQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFVJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VUlEKEJpZ0ludGVnZXIgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U3RhcnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBzdGFydCBkYXRlIG9mIHRoZSB0aW1lcGhhc2VkIGRhdGEgcGVyaW9kLgotCSAqICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U3RhcnQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFN0YXJ0KE9iamVjdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRUaW1lcGhhc2VkRGF0YVR5cGVfU3RhcnQoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkRhdGVUaW1lIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdTdGFydCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU9iamVjdCBnZXRTdGFydCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UaW1lcGhhc2VkRGF0YVR5cGUjZ2V0U3RhcnQgPGVtPlN0YXJ0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TdGFydDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0U3RhcnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFN0YXJ0KE9iamVjdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5GaW5pc2g8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBmaW5pc2ggZGF0ZSBvZiB0aGUgdGltZXBoYXNlZCBkYXRhIHBlcmlvZC4KLQkgKiAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkZpbmlzaDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0RmluaXNoKE9iamVjdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRUaW1lcGhhc2VkRGF0YVR5cGVfRmluaXNoKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EYXRlVGltZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nRmluaXNoJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JT2JqZWN0IGdldEZpbmlzaCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UaW1lcGhhc2VkRGF0YVR5cGUjZ2V0RmluaXNoIDxlbT5GaW5pc2g8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkZpbmlzaDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0RmluaXNoKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRGaW5pc2goT2JqZWN0IHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlVuaXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSB0aW1lIHVuaXQgb2YgdGhlIHRpbWVwaGFzZWQgZGF0YSBwZXJpb2QuIAotCSAqICAgICAgICAgICAgICAgICBWYWx1ZXMgYXJlOiAwPW0sIDE9aCwgMj1kLCAzPXcsIDU9bW8sIDg9eQotCSAqICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VW5pdDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0VW5pdChCaWdJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFRpbWVwaGFzZWREYXRhVHlwZV9Vbml0KCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVW5pdFR5cGUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1VuaXQnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdJbnRlZ2VyIGdldFVuaXQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGltZXBoYXNlZERhdGFUeXBlI2dldFVuaXQgPGVtPlVuaXQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlVuaXQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFVuaXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFVuaXQoQmlnSW50ZWdlciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5WYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHZhbHVlIHBlciB1bml0IG9mIHRpbWUgZm9yIHRoZSB0aW1lcGhhc2VkIGRhdGEgcGVyaW9kLgotCSAqICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VmFsdWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFZhbHVlKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRUaW1lcGhhc2VkRGF0YVR5cGVfVmFsdWUoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nVmFsdWUnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0VmFsdWUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGltZXBoYXNlZERhdGFUeXBlI2dldFZhbHVlIDxlbT5WYWx1ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VmFsdWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFZhbHVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRWYWx1ZShTdHJpbmcgdmFsdWUpOwotCi19IC8vIFRpbWVwaGFzZWREYXRhVHlwZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9WYWx1ZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9WYWx1ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YTUzOGIwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvVmFsdWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNyArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFZhbHVlLmphdmEsdiAxLjEgMjAwOC8wMS8xNSAwODo1Mjo0NSBqdGhhbSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Q7Ci0KLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5WYWx1ZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlZhbHVlI2dldFZhbHVlSUQgPGVtPlZhbHVlIElEPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlZhbHVlI2dldFBhcmVudFZhbHVlSUQgPGVtPlBhcmVudCBWYWx1ZSBJRDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5WYWx1ZSNnZXRWYWx1ZSA8ZW0+VmFsdWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVmFsdWUjZ2V0RGVzY3JpcHRpb24gPGVtPkRlc2NyaXB0aW9uPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VmFsdWUoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J1ZhbHVlXy5fdHlwZScga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFZhbHVlIGV4dGVuZHMgRU9iamVjdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VmFsdWUgSUQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSB1bmlxdWUgSUQgb2YgdGhlIG91dGxpbmUgY29kZSB2YWx1ZSBhY3Jvc3MgdGhlIHByb2plY3QuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlZhbHVlIElEPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRWYWx1ZUlEKEJpZ0ludGVnZXIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VmFsdWVfVmFsdWVJRCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuSW50ZWdlciIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nVmFsdWVJRCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0ludGVnZXIgZ2V0VmFsdWVJRCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5WYWx1ZSNnZXRWYWx1ZUlEIDxlbT5WYWx1ZSBJRDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VmFsdWUgSUQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFZhbHVlSUQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFZhbHVlSUQoQmlnSW50ZWdlciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QYXJlbnQgVmFsdWUgSUQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSB2YWx1ZSBvZiB0aGUgcGFyZW50IG5vZGUgb2YgdGhlIG91dGxpbmUgY29kZS4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UGFyZW50IFZhbHVlIElEPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRQYXJlbnRWYWx1ZUlEKEJpZ0ludGVnZXIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VmFsdWVfUGFyZW50VmFsdWVJRCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuSW50ZWdlciIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nUGFyZW50VmFsdWVJRCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0ludGVnZXIgZ2V0UGFyZW50VmFsdWVJRCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5WYWx1ZSNnZXRQYXJlbnRWYWx1ZUlEIDxlbT5QYXJlbnQgVmFsdWUgSUQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlBhcmVudCBWYWx1ZSBJRDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UGFyZW50VmFsdWVJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UGFyZW50VmFsdWVJRChCaWdJbnRlZ2VyIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgYWN0dWFsIHZhbHVlLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5WYWx1ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0VmFsdWUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFZhbHVlX1ZhbHVlKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1ZhbHVlJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFZhbHVlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlZhbHVlI2dldFZhbHVlIDxlbT5WYWx1ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VmFsdWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFZhbHVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRWYWx1ZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIEEgZGVzY3JpcHRpb24gb2YgdGhpcyB2YWx1ZS4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldERlc2NyaXB0aW9uKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRWYWx1ZV9EZXNjcmlwdGlvbigpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdEZXNjcmlwdGlvbicgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXREZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5WYWx1ZSNnZXREZXNjcmlwdGlvbiA8ZW0+RGVzY3JpcHRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXREZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RGVzY3JpcHRpb24oU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBWYWx1ZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9WYWx1ZTIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvVmFsdWUyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhOTg5ZWQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9WYWx1ZTIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMiArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFZhbHVlMi5qYXZhLHYgMS4xIDIwMDgvMDEvMTUgMDg6NTI6NDUganRoYW0gRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0OwotCi1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+VmFsdWUyPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVmFsdWUyI2dldElEIDxlbT5JRDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5WYWx1ZTIjZ2V0VmFsdWUgPGVtPlZhbHVlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlZhbHVlMiNnZXREZXNjcmlwdGlvbiA8ZW0+RGVzY3JpcHRpb248L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRWYWx1ZTIoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J1ZhbHVlXy5fMV8uX3R5cGUnIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBWYWx1ZTIgZXh0ZW5kcyBFT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JRDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVW5pcXVlIElEIG9mIHZhbHVlIGFjcm9zcyAKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBwcm9qZWN0LgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JRDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0SUQoQmlnSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRWYWx1ZTJfSUQoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkludGVnZXIiIHJlcXVpcmVkPSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdJRCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0ludGVnZXIgZ2V0SUQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVmFsdWUyI2dldElEIDxlbT5JRDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SUQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldElEKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRJRChCaWdJbnRlZ2VyIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgYWN0dWFsIHZhbHVlLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5WYWx1ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0VmFsdWUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFZhbHVlMl9WYWx1ZSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdWYWx1ZScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRWYWx1ZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5WYWx1ZTIjZ2V0VmFsdWUgPGVtPlZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5WYWx1ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0VmFsdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFZhbHVlKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGRlc2NyaXB0aW9uIG9mIHRoZSB2YWx1ZSAKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIHRoZSBsaXN0LgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0RGVzY3JpcHRpb24oU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFZhbHVlMl9EZXNjcmlwdGlvbigpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdEZXNjcmlwdGlvbicgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXREZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5WYWx1ZTIjZ2V0RGVzY3JpcHRpb24gPGVtPkRlc2NyaXB0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0RGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyB2YWx1ZSk7Ci0KLX0gLy8gVmFsdWUyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L1ZhbHVlTGlzdC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9WYWx1ZUxpc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDA5MDJiOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L1ZhbHVlTGlzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBWYWx1ZUxpc3QuamF2YSx2IDEuMSAyMDA4LzAxLzE1IDA4OjUyOjQ2IGp0aGFtIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+VmFsdWUgTGlzdDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlZhbHVlTGlzdCNnZXRWYWx1ZSA8ZW0+VmFsdWU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRWYWx1ZUxpc3QoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J1ZhbHVlTGlzdF8uX3R5cGUnIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBWYWx1ZUxpc3QgZXh0ZW5kcyBFT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5WYWx1ZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVmFsdWUyfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSB2YWx1ZXMgdGhhdCBtYWtlIHVwIHRoZSB2YWx1ZSBsaXN0LgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlZhbHVlPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFZhbHVlTGlzdF9WYWx1ZSgpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVmFsdWUyIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIiByZXF1aXJlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nVmFsdWUnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXRWYWx1ZSgpOwotCi19IC8vIFZhbHVlTGlzdApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9WYWx1ZXMuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvVmFsdWVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0ZDFjZGQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9WYWx1ZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogVmFsdWVzLmphdmEsdiAxLjEgMjAwOC8wMS8xNSAwODo1Mjo0NSBqdGhhbSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+VmFsdWVzPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVmFsdWVzI2dldEdyb3VwIDxlbT5Hcm91cDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5WYWx1ZXMjZ2V0VmFsdWUgPGVtPlZhbHVlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VmFsdWVzKCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdWYWx1ZXNfLl90eXBlJyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgVmFsdWVzIGV4dGVuZHMgRU9iamVjdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+R3JvdXA8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwLkVudHJ5fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkdyb3VwPC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+R3JvdXA8L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VmFsdWVzX0dyb3VwKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRmVhdHVyZU1hcEVudHJ5IiBtYW55PSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdncm91cCcgbmFtZT0nZ3JvdXA6MCciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUZlYXR1cmVNYXAgZ2V0R3JvdXAoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlZhbHVlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5WYWx1ZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgaW5kaXZpZHVhbCB2YWx1ZXMuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlZhbHVlPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFZhbHVlc19WYWx1ZSgpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVmFsdWUiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiIHRyYW5zaWVudD0idHJ1ZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1ZhbHVlJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyBncm91cD0nI2dyb3VwOjAnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXRWYWx1ZSgpOwotCi19IC8vIFZhbHVlcwpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9XQlNNYXNrLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L1dCU01hc2suamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTk2OWZiMS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L1dCU01hc2suamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzOSArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFdCU01hc2suamF2YSx2IDEuMSAyMDA4LzAxLzE1IDA4OjUyOjQ2IGp0aGFtIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdDsKLQotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPldCUyBNYXNrPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV0JTTWFzayNnZXRMZXZlbCA8ZW0+TGV2ZWw8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV0JTTWFzayNnZXRUeXBlIDxlbT5UeXBlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldCU01hc2sjZ2V0TGVuZ3RoIDxlbT5MZW5ndGg8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV0JTTWFzayNnZXRTZXBhcmF0b3IgPGVtPlNlcGFyYXRvcjwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFdCU01hc2soKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J1dCU01hc2tfLl90eXBlJyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgV0JTTWFzayBleHRlbmRzIEVPYmplY3QgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkxldmVsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgbGV2ZWwgb2YgdGhlIG1hc2suCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkxldmVsPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRMZXZlbChCaWdJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFdCU01hc2tfTGV2ZWwoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkludGVnZXIiIHJlcXVpcmVkPSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdMZXZlbCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0ludGVnZXIgZ2V0TGV2ZWwoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV0JTTWFzayNnZXRMZXZlbCA8ZW0+TGV2ZWw8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkxldmVsPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRMZXZlbCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TGV2ZWwoQmlnSW50ZWdlciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5UeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgdHlwZSBvZiB0aGUgbm9kZSB2YWx1ZS4gCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgdmFsdWVzIGFyZTogMD1OdW1iZXJzLCAxPVVwcGVyY2FzZSBMZXR0ZXJzLCAyPUxvd2VyY2FzZSBMZXR0ZXJzLCAzPUNoYXJhY3RlcnMuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFR5cGUoQmlnSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRXQlNNYXNrX1R5cGUoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UeXBlVHlwZTIiIHJlcXVpcmVkPSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdUeXBlJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnSW50ZWdlciBnZXRUeXBlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldCU01hc2sjZ2V0VHlwZSA8ZW0+VHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VHlwZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VHlwZShCaWdJbnRlZ2VyIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkxlbmd0aDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIG1heGltdW0gbGVuZ3RoIGluIGNoYXJhY3RlcnMuICAKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZWxlbWVudCBpcyBvbWl0dGVkIHdoZW4gbGVuZ3RoIGlzICJhbnkiLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5MZW5ndGg8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldExlbmd0aChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0V0JTTWFza19MZW5ndGgoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIgcmVxdWlyZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0xlbmd0aCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRMZW5ndGgoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV0JTTWFzayNnZXRMZW5ndGggPGVtPkxlbmd0aDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TGVuZ3RoPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRMZW5ndGgoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldExlbmd0aChTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U2VwYXJhdG9yPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgc2VwYXJhdG9yIGNoYXJhY3RlciBvZiB0aGUgbm9kZS4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U2VwYXJhdG9yPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRTZXBhcmF0b3IoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFdCU01hc2tfU2VwYXJhdG9yKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciIHJlcXVpcmVkPSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdTZXBhcmF0b3InIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0U2VwYXJhdG9yKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldCU01hc2sjZ2V0U2VwYXJhdG9yIDxlbT5TZXBhcmF0b3I8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlNlcGFyYXRvcjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0U2VwYXJhdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRTZXBhcmF0b3IoU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBXQlNNYXNrCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L1dCU01hc2tzLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L1dCU01hc2tzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxMTY4ODcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9XQlNNYXNrcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgyICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogV0JTTWFza3MuamF2YSx2IDEuMSAyMDA4LzAxLzE1IDA4OjUyOjQ2IGp0aGFtIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+V0JTIE1hc2tzPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV0JTTWFza3MjaXNWZXJpZnlVbmlxdWVDb2RlcyA8ZW0+VmVyaWZ5IFVuaXF1ZSBDb2RlczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5XQlNNYXNrcyNpc0dlbmVyYXRlQ29kZXMgPGVtPkdlbmVyYXRlIENvZGVzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldCU01hc2tzI2dldFByZWZpeCA8ZW0+UHJlZml4PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldCU01hc2tzI2dldFdCU01hc2sgPGVtPldCUyBNYXNrPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0V0JTTWFza3MoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J1dCU01hc2tzXy5fdHlwZScga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFdCU01hc2tzIGV4dGVuZHMgRU9iamVjdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VmVyaWZ5IFVuaXF1ZSBDb2RlczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiJmYWxzZSI8L2NvZGU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogV2hldGhlciBXQlMgY29kZXMgYXJlIHVuaXF1ZSBmb3IgbmV3IHRhc2tzLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5WZXJpZnkgVW5pcXVlIENvZGVzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldFZlcmlmeVVuaXF1ZUNvZGVzKCkKLQkgKiBAc2VlICN1bnNldFZlcmlmeVVuaXF1ZUNvZGVzKCkKLQkgKiBAc2VlICNzZXRWZXJpZnlVbmlxdWVDb2Rlcyhib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFdCU01hc2tzX1ZlcmlmeVVuaXF1ZUNvZGVzKCkKLQkgKiBAbW9kZWwgZGVmYXVsdD0iZmFsc2UiIHVuaXF1ZT0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbiIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nVmVyaWZ5VW5pcXVlQ29kZXMnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzVmVyaWZ5VW5pcXVlQ29kZXMoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV0JTTWFza3MjaXNWZXJpZnlVbmlxdWVDb2RlcyA8ZW0+VmVyaWZ5IFVuaXF1ZSBDb2RlczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VmVyaWZ5IFVuaXF1ZSBDb2RlczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRWZXJpZnlVbmlxdWVDb2RlcygpCi0JICogQHNlZSAjdW5zZXRWZXJpZnlVbmlxdWVDb2RlcygpCi0JICogQHNlZSAjaXNWZXJpZnlVbmlxdWVDb2RlcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VmVyaWZ5VW5pcXVlQ29kZXMoYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV0JTTWFza3MjaXNWZXJpZnlVbmlxdWVDb2RlcyA8ZW0+VmVyaWZ5IFVuaXF1ZSBDb2RlczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRWZXJpZnlVbmlxdWVDb2RlcygpCi0JICogQHNlZSAjaXNWZXJpZnlVbmlxdWVDb2RlcygpCi0JICogQHNlZSAjc2V0VmVyaWZ5VW5pcXVlQ29kZXMoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldFZlcmlmeVVuaXF1ZUNvZGVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV0JTTWFza3MjaXNWZXJpZnlVbmlxdWVDb2RlcyA8ZW0+VmVyaWZ5IFVuaXF1ZSBDb2RlczwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VmVyaWZ5IFVuaXF1ZSBDb2RlczwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0VmVyaWZ5VW5pcXVlQ29kZXMoKQotCSAqIEBzZWUgI2lzVmVyaWZ5VW5pcXVlQ29kZXMoKQotCSAqIEBzZWUgI3NldFZlcmlmeVVuaXF1ZUNvZGVzKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRWZXJpZnlVbmlxdWVDb2RlcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+R2VuZXJhdGUgQ29kZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iZmFsc2UiPC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFdoZXRoZXIgV0JTIGNvZGVzIGFyZSBnZW5lcmF0ZWQgZm9yIG5ldyB0YXNrcy4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+R2VuZXJhdGUgQ29kZXM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0R2VuZXJhdGVDb2RlcygpCi0JICogQHNlZSAjdW5zZXRHZW5lcmF0ZUNvZGVzKCkKLQkgKiBAc2VlICNzZXRHZW5lcmF0ZUNvZGVzKGJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0V0JTTWFza3NfR2VuZXJhdGVDb2RlcygpCi0JICogQG1vZGVsIGRlZmF1bHQ9ImZhbHNlIiB1bmlxdWU9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW4iCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0dlbmVyYXRlQ29kZXMnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzR2VuZXJhdGVDb2RlcygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5XQlNNYXNrcyNpc0dlbmVyYXRlQ29kZXMgPGVtPkdlbmVyYXRlIENvZGVzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5HZW5lcmF0ZSBDb2RlczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRHZW5lcmF0ZUNvZGVzKCkKLQkgKiBAc2VlICN1bnNldEdlbmVyYXRlQ29kZXMoKQotCSAqIEBzZWUgI2lzR2VuZXJhdGVDb2RlcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0R2VuZXJhdGVDb2Rlcyhib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5XQlNNYXNrcyNpc0dlbmVyYXRlQ29kZXMgPGVtPkdlbmVyYXRlIENvZGVzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldEdlbmVyYXRlQ29kZXMoKQotCSAqIEBzZWUgI2lzR2VuZXJhdGVDb2RlcygpCi0JICogQHNlZSAjc2V0R2VuZXJhdGVDb2Rlcyhib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0R2VuZXJhdGVDb2RlcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldCU01hc2tzI2lzR2VuZXJhdGVDb2RlcyA8ZW0+R2VuZXJhdGUgQ29kZXM8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkdlbmVyYXRlIENvZGVzPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRHZW5lcmF0ZUNvZGVzKCkKLQkgKiBAc2VlICNpc0dlbmVyYXRlQ29kZXMoKQotCSAqIEBzZWUgI3NldEdlbmVyYXRlQ29kZXMoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldEdlbmVyYXRlQ29kZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlByZWZpeDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHByZWZpeCBmb3IgYWxsIFdCUyBjb2Rlcy4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UHJlZml4PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRQcmVmaXgoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFdCU01hc2tzX1ByZWZpeCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByZWZpeFR5cGUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1ByZWZpeCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRQcmVmaXgoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV0JTTWFza3MjZ2V0UHJlZml4IDxlbT5QcmVmaXg8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlByZWZpeDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UHJlZml4KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRQcmVmaXgoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPldCUyBNYXNrPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5XQlNNYXNrfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBXQlMgTWFzayB0aGF0IGlzIGFwcGxpZWQgdG8gYWxsIHRhc2tzIGluIHRoZSBQcm9qZWN0LgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5XQlMgTWFzazwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRXQlNNYXNrc19XQlNNYXNrKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5XQlNNYXNrIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdXQlNNYXNrJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0V0JTTWFzaygpOwotCi19IC8vIFdCU01hc2tzCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L1dlZWtEYXkuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvV2Vla0RheS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNWEzNDc2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvV2Vla0RheS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcxICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogV2Vla0RheS5qYXZhLHYgMS4xIDIwMDgvMDEvMTUgMDg6NTI6NDUganRoYW0gRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0OwotCi1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+V2VlayBEYXk8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5XZWVrRGF5I2dldERheVR5cGUgPGVtPkRheSBUeXBlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldlZWtEYXkjaXNEYXlXb3JraW5nIDxlbT5EYXkgV29ya2luZzwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5XZWVrRGF5I2dldFRpbWVQZXJpb2QgPGVtPlRpbWUgUGVyaW9kPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldlZWtEYXkjZ2V0V29ya2luZ1RpbWVzIDxlbT5Xb3JraW5nIFRpbWVzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0V2Vla0RheSgpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nV2Vla0RheV8uX3R5cGUnIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBXZWVrRGF5IGV4dGVuZHMgRU9iamVjdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGF5IFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSB0eXBlIG9mIGRheS4gCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVzIGFyZTogMD1FeGNlcHRpb24sIDE9TW9uZGF5LCAyPVR1ZXNkYXksIAotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDM9V2VkbmVzZGF5LCA0PVRodXJzZGF5LCA1PUZyaWRheSwgNj1TYXR1cmRheSwgCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNz1TdW5kYXkKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGF5IFR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldERheVR5cGUoQmlnSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRXZWVrRGF5X0RheVR5cGUoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5EYXlUeXBlVHlwZSIgcmVxdWlyZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0RheVR5cGUnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdJbnRlZ2VyIGdldERheVR5cGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV2Vla0RheSNnZXREYXlUeXBlIDxlbT5EYXkgVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RGF5IFR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldERheVR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldERheVR5cGUoQmlnSW50ZWdlciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EYXkgV29ya2luZzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogV2hldGhlciB0aGUgc3BlY2lmaWVkIGRhdGUgb3IgZGF5IAotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgaXMgd29ya2luZy4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGF5IFdvcmtpbmc8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0RGF5V29ya2luZygpCi0JICogQHNlZSAjdW5zZXREYXlXb3JraW5nKCkKLQkgKiBAc2VlICNzZXREYXlXb3JraW5nKGJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0V2Vla0RheV9EYXlXb3JraW5nKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdEYXlXb3JraW5nJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc0RheVdvcmtpbmcoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV2Vla0RheSNpc0RheVdvcmtpbmcgPGVtPkRheSBXb3JraW5nPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5EYXkgV29ya2luZzwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXREYXlXb3JraW5nKCkKLQkgKiBAc2VlICN1bnNldERheVdvcmtpbmcoKQotCSAqIEBzZWUgI2lzRGF5V29ya2luZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RGF5V29ya2luZyhib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5XZWVrRGF5I2lzRGF5V29ya2luZyA8ZW0+RGF5IFdvcmtpbmc8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0RGF5V29ya2luZygpCi0JICogQHNlZSAjaXNEYXlXb3JraW5nKCkKLQkgKiBAc2VlICNzZXREYXlXb3JraW5nKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXREYXlXb3JraW5nKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV2Vla0RheSNpc0RheVdvcmtpbmcgPGVtPkRheSBXb3JraW5nPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EYXkgV29ya2luZzwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0RGF5V29ya2luZygpCi0JICogQHNlZSAjaXNEYXlXb3JraW5nKCkKLQkgKiBAc2VlICNzZXREYXlXb3JraW5nKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXREYXlXb3JraW5nKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5UaW1lIFBlcmlvZDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogRGVmaW5lcyBhIGNvbnRpZ3VvdXMgc2V0IG9mIGV4Y2VwdGlvbiBkYXlzLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5UaW1lIFBlcmlvZDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0VGltZVBlcmlvZChUaW1lUGVyaW9kKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFdlZWtEYXlfVGltZVBlcmlvZCgpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1RpbWVQZXJpb2QnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlUaW1lUGVyaW9kIGdldFRpbWVQZXJpb2QoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV2Vla0RheSNnZXRUaW1lUGVyaW9kIDxlbT5UaW1lIFBlcmlvZDwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VGltZSBQZXJpb2Q8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldFRpbWVQZXJpb2QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFRpbWVQZXJpb2QoVGltZVBlcmlvZCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Xb3JraW5nIFRpbWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgY29sbGVjdGlvbiBvZiB3b3JraW5nIHRpbWVzIHRoYXQgZGVmaW5lIHRoZSB0aW1lIHdvcmtlZCAKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbiB0aGUgd2Vla2RheS4gIE9uZSBvZiB0aGVzZSBtdXN0IGJlIHByZXNlbnQsIGFuZCB0aGVyZSBtYXkgYmUgbm8gbW9yZSB0aGFuIGZpdmUuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPldvcmtpbmcgVGltZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFdvcmtpbmdUaW1lcyhXb3JraW5nVGltZXMpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0V2Vla0RheV9Xb3JraW5nVGltZXMoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdXb3JraW5nVGltZXMnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlXb3JraW5nVGltZXMgZ2V0V29ya2luZ1RpbWVzKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldlZWtEYXkjZ2V0V29ya2luZ1RpbWVzIDxlbT5Xb3JraW5nIFRpbWVzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Xb3JraW5nIFRpbWVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRXb3JraW5nVGltZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFdvcmtpbmdUaW1lcyhXb3JraW5nVGltZXMgdmFsdWUpOwotCi19IC8vIFdlZWtEYXkKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvV2Vla0RheXMuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvV2Vla0RheXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzMxY2FlYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L1dlZWtEYXlzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFdlZWtEYXlzLmphdmEsdiAxLjEgMjAwOC8wMS8xNSAwODo1Mjo0NSBqdGhhbSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPldlZWsgRGF5czwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldlZWtEYXlzI2dldFdlZWtEYXkgPGVtPldlZWsgRGF5PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0V2Vla0RheXMoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J1dlZWtEYXlzXy5fdHlwZScga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFdlZWtEYXlzIGV4dGVuZHMgRU9iamVjdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+V2VlayBEYXk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldlZWtEYXl9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogQSB3ZWVrZGF5IGVpdGhlciBkZWZpbmVzIHJlZ3VsYXIgZGF5cyAKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mIHRoZSB3ZWVrIG9yIGV4Y2VwdGlvbiBkYXlzIGluIHRoZSBjYWxlbmRhci4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+V2VlayBEYXk8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0V2Vla0RheXNfV2Vla0RheSgpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV2Vla0RheSIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nV2Vla0RheScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldFdlZWtEYXkoKTsKLQotfSAvLyBXZWVrRGF5cwpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9Xb3JraW5nVGltZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9Xb3JraW5nVGltZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNmE1MjBmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvV29ya2luZ1RpbWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogV29ya2luZ1RpbWUuamF2YSx2IDEuMSAyMDA4LzAxLzE1IDA4OjUyOjQ2IGp0aGFtIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Xb3JraW5nIFRpbWU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Xb3JraW5nVGltZSNnZXRGcm9tVGltZSA8ZW0+RnJvbSBUaW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldvcmtpbmdUaW1lI2dldFRvVGltZSA8ZW0+VG8gVGltZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFdvcmtpbmdUaW1lKCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdXb3JraW5nVGltZV8uX3R5cGUnIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBXb3JraW5nVGltZSBleHRlbmRzIEVPYmplY3QgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkZyb20gVGltZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGJlZ2lubmluZyBvZiB0aGUgd29ya2luZyB0aW1lLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RnJvbSBUaW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRGcm9tVGltZShPYmplY3QpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0V29ya2luZ1RpbWVfRnJvbVRpbWUoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlRpbWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0Zyb21UaW1lJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JT2JqZWN0IGdldEZyb21UaW1lKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldvcmtpbmdUaW1lI2dldEZyb21UaW1lIDxlbT5Gcm9tIFRpbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkZyb20gVGltZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0RnJvbVRpbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEZyb21UaW1lKE9iamVjdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5UbyBUaW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgZW5kIG9mIHRoZSB3b3JraW5nICB0aW1lLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VG8gVGltZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0VG9UaW1lKE9iamVjdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRXb3JraW5nVGltZV9Ub1RpbWUoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlRpbWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1RvVGltZScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU9iamVjdCBnZXRUb1RpbWUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV29ya2luZ1RpbWUjZ2V0VG9UaW1lIDxlbT5UbyBUaW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5UbyBUaW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRUb1RpbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFRvVGltZShPYmplY3QgdmFsdWUpOwotCi19IC8vIFdvcmtpbmdUaW1lCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L1dvcmtpbmdUaW1lcy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9Xb3JraW5nVGltZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzE4MDBhMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L1dvcmtpbmdUaW1lcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBXb3JraW5nVGltZXMuamF2YSx2IDEuMSAyMDA4LzAxLzE1IDA4OjUyOjQ2IGp0aGFtIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+V29ya2luZyBUaW1lczwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldvcmtpbmdUaW1lcyNnZXRXb3JraW5nVGltZSA8ZW0+V29ya2luZyBUaW1lPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0V29ya2luZ1RpbWVzKCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdXb3JraW5nVGltZXNfLl90eXBlJyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgV29ya2luZ1RpbWVzIGV4dGVuZHMgRU9iamVjdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+V29ya2luZyBUaW1lPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Xb3JraW5nVGltZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBEZWZpbmVzIHRoZSB3b3JraW5nIHRpbWUgZHVyaW5nIHRoZSB3ZWVrZGF5LgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+V29ya2luZyBUaW1lPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFdvcmtpbmdUaW1lc19Xb3JraW5nVGltZSgpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV29ya2luZ1RpbWUiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiIHVwcGVyPSI1IgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdXb3JraW5nVGltZScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldFdvcmtpbmdUaW1lKCk7Ci0KLX0gLy8gV29ya2luZ1RpbWVzCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvQXNzaWdubWVudEltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9Bc3NpZ25tZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOGNhZTVhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9Bc3NpZ25tZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcwMCArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IEFzc2lnbm1lbnRJbXBsLmphdmEsdiAxLjEgMjAwOC8wMS8xNSAwODo1MTo1MyBqdGhhbSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbDsKLQotaW1wb3J0IGphdmEubWF0aC5CaWdEZWNpbWFsOwotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lMzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlNDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UaW1lcGhhc2VkRGF0YVR5cGU7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Bc3NpZ25tZW50PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuQXNzaWdubWVudEltcGwjZ2V0VUlEIDxlbT5VSUQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Bc3NpZ25tZW50SW1wbCNnZXRUYXNrVUlEIDxlbT5UYXNrIFVJRDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkFzc2lnbm1lbnRJbXBsI2dldFJlc291cmNlVUlEIDxlbT5SZXNvdXJjZSBVSUQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Bc3NpZ25tZW50SW1wbCNnZXRQZXJjZW50V29ya0NvbXBsZXRlIDxlbT5QZXJjZW50IFdvcmsgQ29tcGxldGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Bc3NpZ25tZW50SW1wbCNnZXRBY3R1YWxDb3N0IDxlbT5BY3R1YWwgQ29zdDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkFzc2lnbm1lbnRJbXBsI2dldEFjdHVhbEZpbmlzaCA8ZW0+QWN0dWFsIEZpbmlzaDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkFzc2lnbm1lbnRJbXBsI2dldEFjdHVhbE92ZXJ0aW1lQ29zdCA8ZW0+QWN0dWFsIE92ZXJ0aW1lIENvc3Q8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Bc3NpZ25tZW50SW1wbCNnZXRBY3R1YWxPdmVydGltZVdvcmsgPGVtPkFjdHVhbCBPdmVydGltZSBXb3JrPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuQXNzaWdubWVudEltcGwjZ2V0QWN0dWFsU3RhcnQgPGVtPkFjdHVhbCBTdGFydDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkFzc2lnbm1lbnRJbXBsI2dldEFjdHVhbFdvcmsgPGVtPkFjdHVhbCBXb3JrPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuQXNzaWdubWVudEltcGwjZ2V0QUNXUCA8ZW0+QUNXUDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkFzc2lnbm1lbnRJbXBsI2lzQ29uZmlybWVkIDxlbT5Db25maXJtZWQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Bc3NpZ25tZW50SW1wbCNnZXRDb3N0IDxlbT5Db3N0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuQXNzaWdubWVudEltcGwjZ2V0Q29zdFJhdGVUYWJsZSA8ZW0+Q29zdCBSYXRlIFRhYmxlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuQXNzaWdubWVudEltcGwjZ2V0Q29zdFZhcmlhbmNlIDxlbT5Db3N0IFZhcmlhbmNlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuQXNzaWdubWVudEltcGwjZ2V0Q1YgPGVtPkNWPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuQXNzaWdubWVudEltcGwjZ2V0RGVsYXkgPGVtPkRlbGF5PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuQXNzaWdubWVudEltcGwjZ2V0RmluaXNoIDxlbT5GaW5pc2g8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Bc3NpZ25tZW50SW1wbCNnZXRGaW5pc2hWYXJpYW5jZSA8ZW0+RmluaXNoIFZhcmlhbmNlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuQXNzaWdubWVudEltcGwjZ2V0SHlwZXJsaW5rIDxlbT5IeXBlcmxpbms8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Bc3NpZ25tZW50SW1wbCNnZXRIeXBlcmxpbmtBZGRyZXNzIDxlbT5IeXBlcmxpbmsgQWRkcmVzczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkFzc2lnbm1lbnRJbXBsI2dldEh5cGVybGlua1N1YkFkZHJlc3MgPGVtPkh5cGVybGluayBTdWIgQWRkcmVzczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkFzc2lnbm1lbnRJbXBsI2dldFdvcmtWYXJpYW5jZSA8ZW0+V29yayBWYXJpYW5jZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkFzc2lnbm1lbnRJbXBsI2lzSGFzRml4ZWRSYXRlVW5pdHMgPGVtPkhhcyBGaXhlZCBSYXRlIFVuaXRzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuQXNzaWdubWVudEltcGwjaXNGaXhlZE1hdGVyaWFsIDxlbT5GaXhlZCBNYXRlcmlhbDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkFzc2lnbm1lbnRJbXBsI2dldExldmVsaW5nRGVsYXkgPGVtPkxldmVsaW5nIERlbGF5PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuQXNzaWdubWVudEltcGwjZ2V0TGV2ZWxpbmdEZWxheUZvcm1hdCA8ZW0+TGV2ZWxpbmcgRGVsYXkgRm9ybWF0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuQXNzaWdubWVudEltcGwjaXNMaW5rZWRGaWVsZHMgPGVtPkxpbmtlZCBGaWVsZHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Bc3NpZ25tZW50SW1wbCNpc01pbGVzdG9uZSA8ZW0+TWlsZXN0b25lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuQXNzaWdubWVudEltcGwjZ2V0Tm90ZXMgPGVtPk5vdGVzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuQXNzaWdubWVudEltcGwjaXNPdmVyYWxsb2NhdGVkIDxlbT5PdmVyYWxsb2NhdGVkPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuQXNzaWdubWVudEltcGwjZ2V0T3ZlcnRpbWVDb3N0IDxlbT5PdmVydGltZSBDb3N0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuQXNzaWdubWVudEltcGwjZ2V0T3ZlcnRpbWVXb3JrIDxlbT5PdmVydGltZSBXb3JrPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuQXNzaWdubWVudEltcGwjZ2V0UmVndWxhcldvcmsgPGVtPlJlZ3VsYXIgV29yazwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkFzc2lnbm1lbnRJbXBsI2dldFJlbWFpbmluZ0Nvc3QgPGVtPlJlbWFpbmluZyBDb3N0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuQXNzaWdubWVudEltcGwjZ2V0UmVtYWluaW5nT3ZlcnRpbWVDb3N0IDxlbT5SZW1haW5pbmcgT3ZlcnRpbWUgQ29zdDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkFzc2lnbm1lbnRJbXBsI2dldFJlbWFpbmluZ092ZXJ0aW1lV29yayA8ZW0+UmVtYWluaW5nIE92ZXJ0aW1lIFdvcms8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Bc3NpZ25tZW50SW1wbCNnZXRSZW1haW5pbmdXb3JrIDxlbT5SZW1haW5pbmcgV29yazwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkFzc2lnbm1lbnRJbXBsI2lzUmVzcG9uc2VQZW5kaW5nIDxlbT5SZXNwb25zZSBQZW5kaW5nPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuQXNzaWdubWVudEltcGwjZ2V0U3RhcnQgPGVtPlN0YXJ0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuQXNzaWdubWVudEltcGwjZ2V0U3RvcCA8ZW0+U3RvcDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkFzc2lnbm1lbnRJbXBsI2dldFJlc3VtZSA8ZW0+UmVzdW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuQXNzaWdubWVudEltcGwjZ2V0U3RhcnRWYXJpYW5jZSA8ZW0+U3RhcnQgVmFyaWFuY2U8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Bc3NpZ25tZW50SW1wbCNnZXRVbml0cyA8ZW0+VW5pdHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Bc3NpZ25tZW50SW1wbCNpc1VwZGF0ZU5lZWRlZCA8ZW0+VXBkYXRlIE5lZWRlZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkFzc2lnbm1lbnRJbXBsI2dldFZBQyA8ZW0+VkFDPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuQXNzaWdubWVudEltcGwjZ2V0V29yayA8ZW0+V29yazwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkFzc2lnbm1lbnRJbXBsI2dldFdvcmtDb250b3VyIDxlbT5Xb3JrIENvbnRvdXI8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Bc3NpZ25tZW50SW1wbCNnZXRCQ1dTIDxlbT5CQ1dTPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuQXNzaWdubWVudEltcGwjZ2V0QkNXUCA8ZW0+QkNXUDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkFzc2lnbm1lbnRJbXBsI2dldEJvb2tpbmdUeXBlIDxlbT5Cb29raW5nIFR5cGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Bc3NpZ25tZW50SW1wbCNnZXRBY3R1YWxXb3JrUHJvdGVjdGVkIDxlbT5BY3R1YWwgV29yayBQcm90ZWN0ZWQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Bc3NpZ25tZW50SW1wbCNnZXRBY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQgPGVtPkFjdHVhbCBPdmVydGltZSBXb3JrIFByb3RlY3RlZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkFzc2lnbm1lbnRJbXBsI2dldENyZWF0aW9uRGF0ZSA8ZW0+Q3JlYXRpb24gRGF0ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkFzc2lnbm1lbnRJbXBsI2dldEV4dGVuZGVkQXR0cmlidXRlIDxlbT5FeHRlbmRlZCBBdHRyaWJ1dGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Bc3NpZ25tZW50SW1wbCNnZXRCYXNlbGluZSA8ZW0+QmFzZWxpbmU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Bc3NpZ25tZW50SW1wbCNnZXRUaW1lcGhhc2VkRGF0YSA8ZW0+VGltZXBoYXNlZCBEYXRhPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQXNzaWdubWVudEltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIEFzc2lnbm1lbnQgewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRVSUQoKSA8ZW0+VUlEPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRVSUQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBVSURfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VUlEKCkgPGVtPlVJRDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VUlEKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnSW50ZWdlciB1SUQgPSBVSURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VGFza1VJRCgpIDxlbT5UYXNrIFVJRDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VGFza1VJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdJbnRlZ2VyIFRBU0tfVUlEX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFRhc2tVSUQoKSA8ZW0+VGFzayBVSUQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFRhc2tVSUQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdJbnRlZ2VyIHRhc2tVSUQgPSBUQVNLX1VJRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZXNvdXJjZVVJRCgpIDxlbT5SZXNvdXJjZSBVSUQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJlc291cmNlVUlEKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0ludGVnZXIgUkVTT1VSQ0VfVUlEX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlc291cmNlVUlEKCkgPGVtPlJlc291cmNlIFVJRDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmVzb3VyY2VVSUQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdJbnRlZ2VyIHJlc291cmNlVUlEID0gUkVTT1VSQ0VfVUlEX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBlcmNlbnRXb3JrQ29tcGxldGUoKSA8ZW0+UGVyY2VudCBXb3JrIENvbXBsZXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQZXJjZW50V29ya0NvbXBsZXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0ludGVnZXIgUEVSQ0VOVF9XT1JLX0NPTVBMRVRFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBlcmNlbnRXb3JrQ29tcGxldGUoKSA8ZW0+UGVyY2VudCBXb3JrIENvbXBsZXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQZXJjZW50V29ya0NvbXBsZXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnSW50ZWdlciBwZXJjZW50V29ya0NvbXBsZXRlID0gUEVSQ0VOVF9XT1JLX0NPTVBMRVRFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFjdHVhbENvc3QoKSA8ZW0+QWN0dWFsIENvc3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFjdHVhbENvc3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnRGVjaW1hbCBBQ1RVQUxfQ09TVF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBY3R1YWxDb3N0KCkgPGVtPkFjdHVhbCBDb3N0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBY3R1YWxDb3N0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnRGVjaW1hbCBhY3R1YWxDb3N0ID0gQUNUVUFMX0NPU1RfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QWN0dWFsRmluaXNoKCkgPGVtPkFjdHVhbCBGaW5pc2g8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFjdHVhbEZpbmlzaCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBPYmplY3QgQUNUVUFMX0ZJTklTSF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBY3R1YWxGaW5pc2goKSA8ZW0+QWN0dWFsIEZpbmlzaDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QWN0dWFsRmluaXNoKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGFjdHVhbEZpbmlzaCA9IEFDVFVBTF9GSU5JU0hfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QWN0dWFsT3ZlcnRpbWVDb3N0KCkgPGVtPkFjdHVhbCBPdmVydGltZSBDb3N0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBY3R1YWxPdmVydGltZUNvc3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnRGVjaW1hbCBBQ1RVQUxfT1ZFUlRJTUVfQ09TVF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBY3R1YWxPdmVydGltZUNvc3QoKSA8ZW0+QWN0dWFsIE92ZXJ0aW1lIENvc3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFjdHVhbE92ZXJ0aW1lQ29zdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0RlY2ltYWwgYWN0dWFsT3ZlcnRpbWVDb3N0ID0gQUNUVUFMX09WRVJUSU1FX0NPU1RfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QWN0dWFsT3ZlcnRpbWVXb3JrKCkgPGVtPkFjdHVhbCBPdmVydGltZSBXb3JrPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBY3R1YWxPdmVydGltZVdvcmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgT2JqZWN0IEFDVFVBTF9PVkVSVElNRV9XT1JLX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFjdHVhbE92ZXJ0aW1lV29yaygpIDxlbT5BY3R1YWwgT3ZlcnRpbWUgV29yazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QWN0dWFsT3ZlcnRpbWVXb3JrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGFjdHVhbE92ZXJ0aW1lV29yayA9IEFDVFVBTF9PVkVSVElNRV9XT1JLX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFjdHVhbFN0YXJ0KCkgPGVtPkFjdHVhbCBTdGFydDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QWN0dWFsU3RhcnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgT2JqZWN0IEFDVFVBTF9TVEFSVF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBY3R1YWxTdGFydCgpIDxlbT5BY3R1YWwgU3RhcnQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFjdHVhbFN0YXJ0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGFjdHVhbFN0YXJ0ID0gQUNUVUFMX1NUQVJUX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFjdHVhbFdvcmsoKSA8ZW0+QWN0dWFsIFdvcms8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFjdHVhbFdvcmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgT2JqZWN0IEFDVFVBTF9XT1JLX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFjdHVhbFdvcmsoKSA8ZW0+QWN0dWFsIFdvcms8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFjdHVhbFdvcmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgYWN0dWFsV29yayA9IEFDVFVBTF9XT1JLX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFDV1AoKSA8ZW0+QUNXUDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QUNXUCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBmbG9hdCBBQ1dQX0VERUZBVUxUID0gMC4wRjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFDV1AoKSA8ZW0+QUNXUDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QUNXUCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGZsb2F0IGFDV1AgPSBBQ1dQX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBBQ1dQIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBhQ1dQRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzQ29uZmlybWVkKCkgPGVtPkNvbmZpcm1lZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNDb25maXJtZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBDT05GSVJNRURfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzQ29uZmlybWVkKCkgPGVtPkNvbmZpcm1lZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNDb25maXJtZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGNvbmZpcm1lZCA9IENPTkZJUk1FRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgQ29uZmlybWVkIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBjb25maXJtZWRFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q29zdCgpIDxlbT5Db3N0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDb3N0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0RlY2ltYWwgQ09TVF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb3N0KCkgPGVtPkNvc3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENvc3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdEZWNpbWFsIGNvc3QgPSBDT1NUX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENvc3RSYXRlVGFibGUoKSA8ZW0+Q29zdCBSYXRlIFRhYmxlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDb3N0UmF0ZVRhYmxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0ludGVnZXIgQ09TVF9SQVRFX1RBQkxFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENvc3RSYXRlVGFibGUoKSA8ZW0+Q29zdCBSYXRlIFRhYmxlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDb3N0UmF0ZVRhYmxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnSW50ZWdlciBjb3N0UmF0ZVRhYmxlID0gQ09TVF9SQVRFX1RBQkxFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENvc3RWYXJpYW5jZSgpIDxlbT5Db3N0IFZhcmlhbmNlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDb3N0VmFyaWFuY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgZmxvYXQgQ09TVF9WQVJJQU5DRV9FREVGQVVMVCA9IDAuMEY7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb3N0VmFyaWFuY2UoKSA8ZW0+Q29zdCBWYXJpYW5jZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q29zdFZhcmlhbmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgZmxvYXQgY29zdFZhcmlhbmNlID0gQ09TVF9WQVJJQU5DRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgQ29zdCBWYXJpYW5jZSBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gY29zdFZhcmlhbmNlRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENWKCkgPGVtPkNWPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDVigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBmbG9hdCBDVl9FREVGQVVMVCA9IDAuMEY7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDVigpIDxlbT5DVjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q1YoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBmbG9hdCBjViA9IENWX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBDViBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gY1ZFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVsYXkoKSA8ZW0+RGVsYXk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERlbGF5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0ludGVnZXIgREVMQVlfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVsYXkoKSA8ZW0+RGVsYXk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERlbGF5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnSW50ZWdlciBkZWxheSA9IERFTEFZX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEZpbmlzaCgpIDxlbT5GaW5pc2g8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEZpbmlzaCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBPYmplY3QgRklOSVNIX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEZpbmlzaCgpIDxlbT5GaW5pc2g8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEZpbmlzaCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBmaW5pc2ggPSBGSU5JU0hfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RmluaXNoVmFyaWFuY2UoKSA8ZW0+RmluaXNoIFZhcmlhbmNlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRGaW5pc2hWYXJpYW5jZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdJbnRlZ2VyIEZJTklTSF9WQVJJQU5DRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRGaW5pc2hWYXJpYW5jZSgpIDxlbT5GaW5pc2ggVmFyaWFuY2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEZpbmlzaFZhcmlhbmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnSW50ZWdlciBmaW5pc2hWYXJpYW5jZSA9IEZJTklTSF9WQVJJQU5DRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRIeXBlcmxpbmsoKSA8ZW0+SHlwZXJsaW5rPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRIeXBlcmxpbmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEhZUEVSTElOS19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRIeXBlcmxpbmsoKSA8ZW0+SHlwZXJsaW5rPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRIeXBlcmxpbmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgaHlwZXJsaW5rID0gSFlQRVJMSU5LX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEh5cGVybGlua0FkZHJlc3MoKSA8ZW0+SHlwZXJsaW5rIEFkZHJlc3M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEh5cGVybGlua0FkZHJlc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEhZUEVSTElOS19BRERSRVNTX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEh5cGVybGlua0FkZHJlc3MoKSA8ZW0+SHlwZXJsaW5rIEFkZHJlc3M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEh5cGVybGlua0FkZHJlc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgaHlwZXJsaW5rQWRkcmVzcyA9IEhZUEVSTElOS19BRERSRVNTX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEh5cGVybGlua1N1YkFkZHJlc3MoKSA8ZW0+SHlwZXJsaW5rIFN1YiBBZGRyZXNzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRIeXBlcmxpbmtTdWJBZGRyZXNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBIWVBFUkxJTktfU1VCX0FERFJFU1NfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SHlwZXJsaW5rU3ViQWRkcmVzcygpIDxlbT5IeXBlcmxpbmsgU3ViIEFkZHJlc3M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEh5cGVybGlua1N1YkFkZHJlc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgaHlwZXJsaW5rU3ViQWRkcmVzcyA9IEhZUEVSTElOS19TVUJfQUREUkVTU19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRXb3JrVmFyaWFuY2UoKSA8ZW0+V29yayBWYXJpYW5jZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0V29ya1ZhcmlhbmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGZsb2F0IFdPUktfVkFSSUFOQ0VfRURFRkFVTFQgPSAwLjBGOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0V29ya1ZhcmlhbmNlKCkgPGVtPldvcmsgVmFyaWFuY2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFdvcmtWYXJpYW5jZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGZsb2F0IHdvcmtWYXJpYW5jZSA9IFdPUktfVkFSSUFOQ0VfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIFdvcmsgVmFyaWFuY2UgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHdvcmtWYXJpYW5jZUVTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0hhc0ZpeGVkUmF0ZVVuaXRzKCkgPGVtPkhhcyBGaXhlZCBSYXRlIFVuaXRzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0hhc0ZpeGVkUmF0ZVVuaXRzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gSEFTX0ZJWEVEX1JBVEVfVU5JVFNfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzSGFzRml4ZWRSYXRlVW5pdHMoKSA8ZW0+SGFzIEZpeGVkIFJhdGUgVW5pdHM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzSGFzRml4ZWRSYXRlVW5pdHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGhhc0ZpeGVkUmF0ZVVuaXRzID0gSEFTX0ZJWEVEX1JBVEVfVU5JVFNfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIEhhcyBGaXhlZCBSYXRlIFVuaXRzIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBoYXNGaXhlZFJhdGVVbml0c0VTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0ZpeGVkTWF0ZXJpYWwoKSA8ZW0+Rml4ZWQgTWF0ZXJpYWw8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzRml4ZWRNYXRlcmlhbCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIEZJWEVEX01BVEVSSUFMX0VERUZBVUxUID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0ZpeGVkTWF0ZXJpYWwoKSA8ZW0+Rml4ZWQgTWF0ZXJpYWw8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzRml4ZWRNYXRlcmlhbCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gZml4ZWRNYXRlcmlhbCA9IEZJWEVEX01BVEVSSUFMX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBGaXhlZCBNYXRlcmlhbCBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gZml4ZWRNYXRlcmlhbEVTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRMZXZlbGluZ0RlbGF5KCkgPGVtPkxldmVsaW5nIERlbGF5PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRMZXZlbGluZ0RlbGF5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0ludGVnZXIgTEVWRUxJTkdfREVMQVlfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TGV2ZWxpbmdEZWxheSgpIDxlbT5MZXZlbGluZyBEZWxheTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TGV2ZWxpbmdEZWxheSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0ludGVnZXIgbGV2ZWxpbmdEZWxheSA9IExFVkVMSU5HX0RFTEFZX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldExldmVsaW5nRGVsYXlGb3JtYXQoKSA8ZW0+TGV2ZWxpbmcgRGVsYXkgRm9ybWF0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRMZXZlbGluZ0RlbGF5Rm9ybWF0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0ludGVnZXIgTEVWRUxJTkdfREVMQVlfRk9STUFUX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldExldmVsaW5nRGVsYXlGb3JtYXQoKSA8ZW0+TGV2ZWxpbmcgRGVsYXkgRm9ybWF0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRMZXZlbGluZ0RlbGF5Rm9ybWF0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnSW50ZWdlciBsZXZlbGluZ0RlbGF5Rm9ybWF0ID0gTEVWRUxJTkdfREVMQVlfRk9STUFUX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzTGlua2VkRmllbGRzKCkgPGVtPkxpbmtlZCBGaWVsZHM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzTGlua2VkRmllbGRzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gTElOS0VEX0ZJRUxEU19FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNMaW5rZWRGaWVsZHMoKSA8ZW0+TGlua2VkIEZpZWxkczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNMaW5rZWRGaWVsZHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGxpbmtlZEZpZWxkcyA9IExJTktFRF9GSUVMRFNfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIExpbmtlZCBGaWVsZHMgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGxpbmtlZEZpZWxkc0VTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc01pbGVzdG9uZSgpIDxlbT5NaWxlc3RvbmU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzTWlsZXN0b25lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gTUlMRVNUT05FX0VERUZBVUxUID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc01pbGVzdG9uZSgpIDxlbT5NaWxlc3RvbmU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzTWlsZXN0b25lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBtaWxlc3RvbmUgPSBNSUxFU1RPTkVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIE1pbGVzdG9uZSBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gbWlsZXN0b25lRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5vdGVzKCkgPGVtPk5vdGVzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROb3RlcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9URVNfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Tm90ZXMoKSA8ZW0+Tm90ZXM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE5vdGVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIG5vdGVzID0gTk9URVNfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNPdmVyYWxsb2NhdGVkKCkgPGVtPk92ZXJhbGxvY2F0ZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzT3ZlcmFsbG9jYXRlZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIE9WRVJBTExPQ0FURURfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzT3ZlcmFsbG9jYXRlZCgpIDxlbT5PdmVyYWxsb2NhdGVkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc092ZXJhbGxvY2F0ZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIG92ZXJhbGxvY2F0ZWQgPSBPVkVSQUxMT0NBVEVEX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBPdmVyYWxsb2NhdGVkIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBvdmVyYWxsb2NhdGVkRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE92ZXJ0aW1lQ29zdCgpIDxlbT5PdmVydGltZSBDb3N0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRPdmVydGltZUNvc3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnRGVjaW1hbCBPVkVSVElNRV9DT1NUX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE92ZXJ0aW1lQ29zdCgpIDxlbT5PdmVydGltZSBDb3N0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRPdmVydGltZUNvc3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdEZWNpbWFsIG92ZXJ0aW1lQ29zdCA9IE9WRVJUSU1FX0NPU1RfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0T3ZlcnRpbWVXb3JrKCkgPGVtPk92ZXJ0aW1lIFdvcms8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE92ZXJ0aW1lV29yaygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBPYmplY3QgT1ZFUlRJTUVfV09SS19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRPdmVydGltZVdvcmsoKSA8ZW0+T3ZlcnRpbWUgV29yazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0T3ZlcnRpbWVXb3JrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IG92ZXJ0aW1lV29yayA9IE9WRVJUSU1FX1dPUktfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVndWxhcldvcmsoKSA8ZW0+UmVndWxhciBXb3JrPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZWd1bGFyV29yaygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBPYmplY3QgUkVHVUxBUl9XT1JLX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlZ3VsYXJXb3JrKCkgPGVtPlJlZ3VsYXIgV29yazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmVndWxhcldvcmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgcmVndWxhcldvcmsgPSBSRUdVTEFSX1dPUktfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVtYWluaW5nQ29zdCgpIDxlbT5SZW1haW5pbmcgQ29zdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmVtYWluaW5nQ29zdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdEZWNpbWFsIFJFTUFJTklOR19DT1NUX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlbWFpbmluZ0Nvc3QoKSA8ZW0+UmVtYWluaW5nIENvc3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJlbWFpbmluZ0Nvc3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdEZWNpbWFsIHJlbWFpbmluZ0Nvc3QgPSBSRU1BSU5JTkdfQ09TVF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZW1haW5pbmdPdmVydGltZUNvc3QoKSA8ZW0+UmVtYWluaW5nIE92ZXJ0aW1lIENvc3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJlbWFpbmluZ092ZXJ0aW1lQ29zdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdEZWNpbWFsIFJFTUFJTklOR19PVkVSVElNRV9DT1NUX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlbWFpbmluZ092ZXJ0aW1lQ29zdCgpIDxlbT5SZW1haW5pbmcgT3ZlcnRpbWUgQ29zdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmVtYWluaW5nT3ZlcnRpbWVDb3N0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnRGVjaW1hbCByZW1haW5pbmdPdmVydGltZUNvc3QgPSBSRU1BSU5JTkdfT1ZFUlRJTUVfQ09TVF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZW1haW5pbmdPdmVydGltZVdvcmsoKSA8ZW0+UmVtYWluaW5nIE92ZXJ0aW1lIFdvcms8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJlbWFpbmluZ092ZXJ0aW1lV29yaygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBPYmplY3QgUkVNQUlOSU5HX09WRVJUSU1FX1dPUktfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVtYWluaW5nT3ZlcnRpbWVXb3JrKCkgPGVtPlJlbWFpbmluZyBPdmVydGltZSBXb3JrPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZW1haW5pbmdPdmVydGltZVdvcmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgcmVtYWluaW5nT3ZlcnRpbWVXb3JrID0gUkVNQUlOSU5HX09WRVJUSU1FX1dPUktfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVtYWluaW5nV29yaygpIDxlbT5SZW1haW5pbmcgV29yazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmVtYWluaW5nV29yaygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBPYmplY3QgUkVNQUlOSU5HX1dPUktfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVtYWluaW5nV29yaygpIDxlbT5SZW1haW5pbmcgV29yazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmVtYWluaW5nV29yaygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCByZW1haW5pbmdXb3JrID0gUkVNQUlOSU5HX1dPUktfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNSZXNwb25zZVBlbmRpbmcoKSA8ZW0+UmVzcG9uc2UgUGVuZGluZzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNSZXNwb25zZVBlbmRpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBSRVNQT05TRV9QRU5ESU5HX0VERUZBVUxUID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1Jlc3BvbnNlUGVuZGluZygpIDxlbT5SZXNwb25zZSBQZW5kaW5nPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1Jlc3BvbnNlUGVuZGluZygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gcmVzcG9uc2VQZW5kaW5nID0gUkVTUE9OU0VfUEVORElOR19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgUmVzcG9uc2UgUGVuZGluZyBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gcmVzcG9uc2VQZW5kaW5nRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFN0YXJ0KCkgPGVtPlN0YXJ0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTdGFydCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBPYmplY3QgU1RBUlRfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U3RhcnQoKSA8ZW0+U3RhcnQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFN0YXJ0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IHN0YXJ0ID0gU1RBUlRfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U3RvcCgpIDxlbT5TdG9wPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTdG9wKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIE9iamVjdCBTVE9QX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFN0b3AoKSA8ZW0+U3RvcDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U3RvcCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBzdG9wID0gU1RPUF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZXN1bWUoKSA8ZW0+UmVzdW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZXN1bWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgT2JqZWN0IFJFU1VNRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZXN1bWUoKSA8ZW0+UmVzdW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZXN1bWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgcmVzdW1lID0gUkVTVU1FX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFN0YXJ0VmFyaWFuY2UoKSA8ZW0+U3RhcnQgVmFyaWFuY2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFN0YXJ0VmFyaWFuY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBTVEFSVF9WQVJJQU5DRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTdGFydFZhcmlhbmNlKCkgPGVtPlN0YXJ0IFZhcmlhbmNlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTdGFydFZhcmlhbmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnSW50ZWdlciBzdGFydFZhcmlhbmNlID0gU1RBUlRfVkFSSUFOQ0VfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VW5pdHMoKSA8ZW0+VW5pdHM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFVuaXRzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGZsb2F0IFVOSVRTX0VERUZBVUxUID0gMC4wRjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFVuaXRzKCkgPGVtPlVuaXRzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRVbml0cygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGZsb2F0IHVuaXRzID0gVU5JVFNfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIFVuaXRzIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiB1bml0c0VTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1VwZGF0ZU5lZWRlZCgpIDxlbT5VcGRhdGUgTmVlZGVkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1VwZGF0ZU5lZWRlZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIFVQREFURV9ORUVERURfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzVXBkYXRlTmVlZGVkKCkgPGVtPlVwZGF0ZSBOZWVkZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzVXBkYXRlTmVlZGVkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiB1cGRhdGVOZWVkZWQgPSBVUERBVEVfTkVFREVEX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBVcGRhdGUgTmVlZGVkIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiB1cGRhdGVOZWVkZWRFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VkFDKCkgPGVtPlZBQzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VkFDKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGZsb2F0IFZBQ19FREVGQVVMVCA9IDAuMEY7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWQUMoKSA8ZW0+VkFDPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRWQUMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBmbG9hdCB2QUMgPSBWQUNfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIFZBQyBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gdkFDRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFdvcmsoKSA8ZW0+V29yazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0V29yaygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBPYmplY3QgV09SS19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRXb3JrKCkgPGVtPldvcms8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFdvcmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3Qgd29yayA9IFdPUktfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0V29ya0NvbnRvdXIoKSA8ZW0+V29yayBDb250b3VyPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRXb3JrQ29udG91cigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdJbnRlZ2VyIFdPUktfQ09OVE9VUl9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRXb3JrQ29udG91cigpIDxlbT5Xb3JrIENvbnRvdXI8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFdvcmtDb250b3VyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnSW50ZWdlciB3b3JrQ29udG91ciA9IFdPUktfQ09OVE9VUl9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRCQ1dTKCkgPGVtPkJDV1M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEJDV1MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgZmxvYXQgQkNXU19FREVGQVVMVCA9IDAuMEY7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRCQ1dTKCkgPGVtPkJDV1M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEJDV1MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBmbG9hdCBiQ1dTID0gQkNXU19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgQkNXUyBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gYkNXU0VTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRCQ1dQKCkgPGVtPkJDV1A8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEJDV1AoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgZmxvYXQgQkNXUF9FREVGQVVMVCA9IDAuMEY7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRCQ1dQKCkgPGVtPkJDV1A8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEJDV1AoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBmbG9hdCBiQ1dQID0gQkNXUF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgQkNXUCBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gYkNXUEVTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRCb29raW5nVHlwZSgpIDxlbT5Cb29raW5nIFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEJvb2tpbmdUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0ludGVnZXIgQk9PS0lOR19UWVBFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEJvb2tpbmdUeXBlKCkgPGVtPkJvb2tpbmcgVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Qm9va2luZ1R5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdJbnRlZ2VyIGJvb2tpbmdUeXBlID0gQk9PS0lOR19UWVBFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFjdHVhbFdvcmtQcm90ZWN0ZWQoKSA8ZW0+QWN0dWFsIFdvcmsgUHJvdGVjdGVkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBY3R1YWxXb3JrUHJvdGVjdGVkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIE9iamVjdCBBQ1RVQUxfV09SS19QUk9URUNURURfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QWN0dWFsV29ya1Byb3RlY3RlZCgpIDxlbT5BY3R1YWwgV29yayBQcm90ZWN0ZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFjdHVhbFdvcmtQcm90ZWN0ZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgYWN0dWFsV29ya1Byb3RlY3RlZCA9IEFDVFVBTF9XT1JLX1BST1RFQ1RFRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQoKSA8ZW0+QWN0dWFsIE92ZXJ0aW1lIFdvcmsgUHJvdGVjdGVkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgT2JqZWN0IEFDVFVBTF9PVkVSVElNRV9XT1JLX1BST1RFQ1RFRF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQoKSA8ZW0+QWN0dWFsIE92ZXJ0aW1lIFdvcmsgUHJvdGVjdGVkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgYWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkID0gQUNUVUFMX09WRVJUSU1FX1dPUktfUFJPVEVDVEVEX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENyZWF0aW9uRGF0ZSgpIDxlbT5DcmVhdGlvbiBEYXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDcmVhdGlvbkRhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgT2JqZWN0IENSRUFUSU9OX0RBVEVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q3JlYXRpb25EYXRlKCkgPGVtPkNyZWF0aW9uIERhdGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENyZWF0aW9uRGF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBjcmVhdGlvbkRhdGUgPSBDUkVBVElPTl9EQVRFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUoKSA8ZW0+RXh0ZW5kZWQgQXR0cmlidXRlPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEV4dGVuZGVkQXR0cmlidXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgZXh0ZW5kZWRBdHRyaWJ1dGUgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QmFzZWxpbmUoKSA8ZW0+QmFzZWxpbmU8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QmFzZWxpbmUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBiYXNlbGluZSA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUaW1lcGhhc2VkRGF0YSgpIDxlbT5UaW1lcGhhc2VkIERhdGE8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VGltZXBoYXNlZERhdGEoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCB0aW1lcGhhc2VkRGF0YSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQXNzaWdubWVudEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXRBc3NpZ25tZW50KCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0VUlEKCkgewotCQlyZXR1cm4gdUlEOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFVJRChCaWdJbnRlZ2VyIG5ld1VJRCkgewotCQlCaWdJbnRlZ2VyIG9sZFVJRCA9IHVJRDsKLQkJdUlEID0gbmV3VUlEOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1VJRCwgb2xkVUlELCB1SUQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBnZXRUYXNrVUlEKCkgewotCQlyZXR1cm4gdGFza1VJRDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUYXNrVUlEKEJpZ0ludGVnZXIgbmV3VGFza1VJRCkgewotCQlCaWdJbnRlZ2VyIG9sZFRhc2tVSUQgPSB0YXNrVUlEOwotCQl0YXNrVUlEID0gbmV3VGFza1VJRDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19UQVNLX1VJRCwgb2xkVGFza1VJRCwgdGFza1VJRCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGdldFJlc291cmNlVUlEKCkgewotCQlyZXR1cm4gcmVzb3VyY2VVSUQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmVzb3VyY2VVSUQoQmlnSW50ZWdlciBuZXdSZXNvdXJjZVVJRCkgewotCQlCaWdJbnRlZ2VyIG9sZFJlc291cmNlVUlEID0gcmVzb3VyY2VVSUQ7Ci0JCXJlc291cmNlVUlEID0gbmV3UmVzb3VyY2VVSUQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fUkVTT1VSQ0VfVUlELCBvbGRSZXNvdXJjZVVJRCwgcmVzb3VyY2VVSUQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBnZXRQZXJjZW50V29ya0NvbXBsZXRlKCkgewotCQlyZXR1cm4gcGVyY2VudFdvcmtDb21wbGV0ZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQZXJjZW50V29ya0NvbXBsZXRlKEJpZ0ludGVnZXIgbmV3UGVyY2VudFdvcmtDb21wbGV0ZSkgewotCQlCaWdJbnRlZ2VyIG9sZFBlcmNlbnRXb3JrQ29tcGxldGUgPSBwZXJjZW50V29ya0NvbXBsZXRlOwotCQlwZXJjZW50V29ya0NvbXBsZXRlID0gbmV3UGVyY2VudFdvcmtDb21wbGV0ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19QRVJDRU5UX1dPUktfQ09NUExFVEUsIG9sZFBlcmNlbnRXb3JrQ29tcGxldGUsIHBlcmNlbnRXb3JrQ29tcGxldGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnRGVjaW1hbCBnZXRBY3R1YWxDb3N0KCkgewotCQlyZXR1cm4gYWN0dWFsQ29zdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBY3R1YWxDb3N0KEJpZ0RlY2ltYWwgbmV3QWN0dWFsQ29zdCkgewotCQlCaWdEZWNpbWFsIG9sZEFjdHVhbENvc3QgPSBhY3R1YWxDb3N0OwotCQlhY3R1YWxDb3N0ID0gbmV3QWN0dWFsQ29zdDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19BQ1RVQUxfQ09TVCwgb2xkQWN0dWFsQ29zdCwgYWN0dWFsQ29zdCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0QWN0dWFsRmluaXNoKCkgewotCQlyZXR1cm4gYWN0dWFsRmluaXNoOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFjdHVhbEZpbmlzaChPYmplY3QgbmV3QWN0dWFsRmluaXNoKSB7Ci0JCU9iamVjdCBvbGRBY3R1YWxGaW5pc2ggPSBhY3R1YWxGaW5pc2g7Ci0JCWFjdHVhbEZpbmlzaCA9IG5ld0FjdHVhbEZpbmlzaDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19BQ1RVQUxfRklOSVNILCBvbGRBY3R1YWxGaW5pc2gsIGFjdHVhbEZpbmlzaCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdEZWNpbWFsIGdldEFjdHVhbE92ZXJ0aW1lQ29zdCgpIHsKLQkJcmV0dXJuIGFjdHVhbE92ZXJ0aW1lQ29zdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBY3R1YWxPdmVydGltZUNvc3QoQmlnRGVjaW1hbCBuZXdBY3R1YWxPdmVydGltZUNvc3QpIHsKLQkJQmlnRGVjaW1hbCBvbGRBY3R1YWxPdmVydGltZUNvc3QgPSBhY3R1YWxPdmVydGltZUNvc3Q7Ci0JCWFjdHVhbE92ZXJ0aW1lQ29zdCA9IG5ld0FjdHVhbE92ZXJ0aW1lQ29zdDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19BQ1RVQUxfT1ZFUlRJTUVfQ09TVCwgb2xkQWN0dWFsT3ZlcnRpbWVDb3N0LCBhY3R1YWxPdmVydGltZUNvc3QpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEFjdHVhbE92ZXJ0aW1lV29yaygpIHsKLQkJcmV0dXJuIGFjdHVhbE92ZXJ0aW1lV29yazsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBY3R1YWxPdmVydGltZVdvcmsoT2JqZWN0IG5ld0FjdHVhbE92ZXJ0aW1lV29yaykgewotCQlPYmplY3Qgb2xkQWN0dWFsT3ZlcnRpbWVXb3JrID0gYWN0dWFsT3ZlcnRpbWVXb3JrOwotCQlhY3R1YWxPdmVydGltZVdvcmsgPSBuZXdBY3R1YWxPdmVydGltZVdvcms7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fQUNUVUFMX09WRVJUSU1FX1dPUkssIG9sZEFjdHVhbE92ZXJ0aW1lV29yaywgYWN0dWFsT3ZlcnRpbWVXb3JrKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRBY3R1YWxTdGFydCgpIHsKLQkJcmV0dXJuIGFjdHVhbFN0YXJ0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFjdHVhbFN0YXJ0KE9iamVjdCBuZXdBY3R1YWxTdGFydCkgewotCQlPYmplY3Qgb2xkQWN0dWFsU3RhcnQgPSBhY3R1YWxTdGFydDsKLQkJYWN0dWFsU3RhcnQgPSBuZXdBY3R1YWxTdGFydDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19BQ1RVQUxfU1RBUlQsIG9sZEFjdHVhbFN0YXJ0LCBhY3R1YWxTdGFydCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0QWN0dWFsV29yaygpIHsKLQkJcmV0dXJuIGFjdHVhbFdvcms7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QWN0dWFsV29yayhPYmplY3QgbmV3QWN0dWFsV29yaykgewotCQlPYmplY3Qgb2xkQWN0dWFsV29yayA9IGFjdHVhbFdvcms7Ci0JCWFjdHVhbFdvcmsgPSBuZXdBY3R1YWxXb3JrOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0FDVFVBTF9XT1JLLCBvbGRBY3R1YWxXb3JrLCBhY3R1YWxXb3JrKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGZsb2F0IGdldEFDV1AoKSB7Ci0JCXJldHVybiBhQ1dQOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFDV1AoZmxvYXQgbmV3QUNXUCkgewotCQlmbG9hdCBvbGRBQ1dQID0gYUNXUDsKLQkJYUNXUCA9IG5ld0FDV1A7Ci0JCWJvb2xlYW4gb2xkQUNXUEVTZXQgPSBhQ1dQRVNldDsKLQkJYUNXUEVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0FDV1AsIG9sZEFDV1AsIGFDV1AsICFvbGRBQ1dQRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0QUNXUCgpIHsKLQkJZmxvYXQgb2xkQUNXUCA9IGFDV1A7Ci0JCWJvb2xlYW4gb2xkQUNXUEVTZXQgPSBhQ1dQRVNldDsKLQkJYUNXUCA9IEFDV1BfRURFRkFVTFQ7Ci0JCWFDV1BFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19BQ1dQLCBvbGRBQ1dQLCBBQ1dQX0VERUZBVUxULCBvbGRBQ1dQRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0QUNXUCgpIHsKLQkJcmV0dXJuIGFDV1BFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQ29uZmlybWVkKCkgewotCQlyZXR1cm4gY29uZmlybWVkOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvbmZpcm1lZChib29sZWFuIG5ld0NvbmZpcm1lZCkgewotCQlib29sZWFuIG9sZENvbmZpcm1lZCA9IGNvbmZpcm1lZDsKLQkJY29uZmlybWVkID0gbmV3Q29uZmlybWVkOwotCQlib29sZWFuIG9sZENvbmZpcm1lZEVTZXQgPSBjb25maXJtZWRFU2V0OwotCQljb25maXJtZWRFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19DT05GSVJNRUQsIG9sZENvbmZpcm1lZCwgY29uZmlybWVkLCAhb2xkQ29uZmlybWVkRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0Q29uZmlybWVkKCkgewotCQlib29sZWFuIG9sZENvbmZpcm1lZCA9IGNvbmZpcm1lZDsKLQkJYm9vbGVhbiBvbGRDb25maXJtZWRFU2V0ID0gY29uZmlybWVkRVNldDsKLQkJY29uZmlybWVkID0gQ09ORklSTUVEX0VERUZBVUxUOwotCQljb25maXJtZWRFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19DT05GSVJNRUQsIG9sZENvbmZpcm1lZCwgQ09ORklSTUVEX0VERUZBVUxULCBvbGRDb25maXJtZWRFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRDb25maXJtZWQoKSB7Ci0JCXJldHVybiBjb25maXJtZWRFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdEZWNpbWFsIGdldENvc3QoKSB7Ci0JCXJldHVybiBjb3N0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvc3QoQmlnRGVjaW1hbCBuZXdDb3N0KSB7Ci0JCUJpZ0RlY2ltYWwgb2xkQ29zdCA9IGNvc3Q7Ci0JCWNvc3QgPSBuZXdDb3N0OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0NPU1QsIG9sZENvc3QsIGNvc3QpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBnZXRDb3N0UmF0ZVRhYmxlKCkgewotCQlyZXR1cm4gY29zdFJhdGVUYWJsZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb3N0UmF0ZVRhYmxlKEJpZ0ludGVnZXIgbmV3Q29zdFJhdGVUYWJsZSkgewotCQlCaWdJbnRlZ2VyIG9sZENvc3RSYXRlVGFibGUgPSBjb3N0UmF0ZVRhYmxlOwotCQljb3N0UmF0ZVRhYmxlID0gbmV3Q29zdFJhdGVUYWJsZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19DT1NUX1JBVEVfVEFCTEUsIG9sZENvc3RSYXRlVGFibGUsIGNvc3RSYXRlVGFibGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgZmxvYXQgZ2V0Q29zdFZhcmlhbmNlKCkgewotCQlyZXR1cm4gY29zdFZhcmlhbmNlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvc3RWYXJpYW5jZShmbG9hdCBuZXdDb3N0VmFyaWFuY2UpIHsKLQkJZmxvYXQgb2xkQ29zdFZhcmlhbmNlID0gY29zdFZhcmlhbmNlOwotCQljb3N0VmFyaWFuY2UgPSBuZXdDb3N0VmFyaWFuY2U7Ci0JCWJvb2xlYW4gb2xkQ29zdFZhcmlhbmNlRVNldCA9IGNvc3RWYXJpYW5jZUVTZXQ7Ci0JCWNvc3RWYXJpYW5jZUVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0NPU1RfVkFSSUFOQ0UsIG9sZENvc3RWYXJpYW5jZSwgY29zdFZhcmlhbmNlLCAhb2xkQ29zdFZhcmlhbmNlRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0Q29zdFZhcmlhbmNlKCkgewotCQlmbG9hdCBvbGRDb3N0VmFyaWFuY2UgPSBjb3N0VmFyaWFuY2U7Ci0JCWJvb2xlYW4gb2xkQ29zdFZhcmlhbmNlRVNldCA9IGNvc3RWYXJpYW5jZUVTZXQ7Ci0JCWNvc3RWYXJpYW5jZSA9IENPU1RfVkFSSUFOQ0VfRURFRkFVTFQ7Ci0JCWNvc3RWYXJpYW5jZUVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0NPU1RfVkFSSUFOQ0UsIG9sZENvc3RWYXJpYW5jZSwgQ09TVF9WQVJJQU5DRV9FREVGQVVMVCwgb2xkQ29zdFZhcmlhbmNlRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0Q29zdFZhcmlhbmNlKCkgewotCQlyZXR1cm4gY29zdFZhcmlhbmNlRVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgZmxvYXQgZ2V0Q1YoKSB7Ci0JCXJldHVybiBjVjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDVihmbG9hdCBuZXdDVikgewotCQlmbG9hdCBvbGRDViA9IGNWOwotCQljViA9IG5ld0NWOwotCQlib29sZWFuIG9sZENWRVNldCA9IGNWRVNldDsKLQkJY1ZFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19DViwgb2xkQ1YsIGNWLCAhb2xkQ1ZFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRDVigpIHsKLQkJZmxvYXQgb2xkQ1YgPSBjVjsKLQkJYm9vbGVhbiBvbGRDVkVTZXQgPSBjVkVTZXQ7Ci0JCWNWID0gQ1ZfRURFRkFVTFQ7Ci0JCWNWRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fQ1YsIG9sZENWLCBDVl9FREVGQVVMVCwgb2xkQ1ZFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRDVigpIHsKLQkJcmV0dXJuIGNWRVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBnZXREZWxheSgpIHsKLQkJcmV0dXJuIGRlbGF5OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlbGF5KEJpZ0ludGVnZXIgbmV3RGVsYXkpIHsKLQkJQmlnSW50ZWdlciBvbGREZWxheSA9IGRlbGF5OwotCQlkZWxheSA9IG5ld0RlbGF5OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0RFTEFZLCBvbGREZWxheSwgZGVsYXkpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEZpbmlzaCgpIHsKLQkJcmV0dXJuIGZpbmlzaDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGaW5pc2goT2JqZWN0IG5ld0ZpbmlzaCkgewotCQlPYmplY3Qgb2xkRmluaXNoID0gZmluaXNoOwotCQlmaW5pc2ggPSBuZXdGaW5pc2g7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fRklOSVNILCBvbGRGaW5pc2gsIGZpbmlzaCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGdldEZpbmlzaFZhcmlhbmNlKCkgewotCQlyZXR1cm4gZmluaXNoVmFyaWFuY2U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RmluaXNoVmFyaWFuY2UoQmlnSW50ZWdlciBuZXdGaW5pc2hWYXJpYW5jZSkgewotCQlCaWdJbnRlZ2VyIG9sZEZpbmlzaFZhcmlhbmNlID0gZmluaXNoVmFyaWFuY2U7Ci0JCWZpbmlzaFZhcmlhbmNlID0gbmV3RmluaXNoVmFyaWFuY2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fRklOSVNIX1ZBUklBTkNFLCBvbGRGaW5pc2hWYXJpYW5jZSwgZmluaXNoVmFyaWFuY2UpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEh5cGVybGluaygpIHsKLQkJcmV0dXJuIGh5cGVybGluazsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRIeXBlcmxpbmsoU3RyaW5nIG5ld0h5cGVybGluaykgewotCQlTdHJpbmcgb2xkSHlwZXJsaW5rID0gaHlwZXJsaW5rOwotCQloeXBlcmxpbmsgPSBuZXdIeXBlcmxpbms7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fSFlQRVJMSU5LLCBvbGRIeXBlcmxpbmssIGh5cGVybGluaykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SHlwZXJsaW5rQWRkcmVzcygpIHsKLQkJcmV0dXJuIGh5cGVybGlua0FkZHJlc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SHlwZXJsaW5rQWRkcmVzcyhTdHJpbmcgbmV3SHlwZXJsaW5rQWRkcmVzcykgewotCQlTdHJpbmcgb2xkSHlwZXJsaW5rQWRkcmVzcyA9IGh5cGVybGlua0FkZHJlc3M7Ci0JCWh5cGVybGlua0FkZHJlc3MgPSBuZXdIeXBlcmxpbmtBZGRyZXNzOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0hZUEVSTElOS19BRERSRVNTLCBvbGRIeXBlcmxpbmtBZGRyZXNzLCBoeXBlcmxpbmtBZGRyZXNzKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRIeXBlcmxpbmtTdWJBZGRyZXNzKCkgewotCQlyZXR1cm4gaHlwZXJsaW5rU3ViQWRkcmVzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRIeXBlcmxpbmtTdWJBZGRyZXNzKFN0cmluZyBuZXdIeXBlcmxpbmtTdWJBZGRyZXNzKSB7Ci0JCVN0cmluZyBvbGRIeXBlcmxpbmtTdWJBZGRyZXNzID0gaHlwZXJsaW5rU3ViQWRkcmVzczsKLQkJaHlwZXJsaW5rU3ViQWRkcmVzcyA9IG5ld0h5cGVybGlua1N1YkFkZHJlc3M7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fSFlQRVJMSU5LX1NVQl9BRERSRVNTLCBvbGRIeXBlcmxpbmtTdWJBZGRyZXNzLCBoeXBlcmxpbmtTdWJBZGRyZXNzKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGZsb2F0IGdldFdvcmtWYXJpYW5jZSgpIHsKLQkJcmV0dXJuIHdvcmtWYXJpYW5jZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRXb3JrVmFyaWFuY2UoZmxvYXQgbmV3V29ya1ZhcmlhbmNlKSB7Ci0JCWZsb2F0IG9sZFdvcmtWYXJpYW5jZSA9IHdvcmtWYXJpYW5jZTsKLQkJd29ya1ZhcmlhbmNlID0gbmV3V29ya1ZhcmlhbmNlOwotCQlib29sZWFuIG9sZFdvcmtWYXJpYW5jZUVTZXQgPSB3b3JrVmFyaWFuY2VFU2V0OwotCQl3b3JrVmFyaWFuY2VFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19XT1JLX1ZBUklBTkNFLCBvbGRXb3JrVmFyaWFuY2UsIHdvcmtWYXJpYW5jZSwgIW9sZFdvcmtWYXJpYW5jZUVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldFdvcmtWYXJpYW5jZSgpIHsKLQkJZmxvYXQgb2xkV29ya1ZhcmlhbmNlID0gd29ya1ZhcmlhbmNlOwotCQlib29sZWFuIG9sZFdvcmtWYXJpYW5jZUVTZXQgPSB3b3JrVmFyaWFuY2VFU2V0OwotCQl3b3JrVmFyaWFuY2UgPSBXT1JLX1ZBUklBTkNFX0VERUZBVUxUOwotCQl3b3JrVmFyaWFuY2VFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19XT1JLX1ZBUklBTkNFLCBvbGRXb3JrVmFyaWFuY2UsIFdPUktfVkFSSUFOQ0VfRURFRkFVTFQsIG9sZFdvcmtWYXJpYW5jZUVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldFdvcmtWYXJpYW5jZSgpIHsKLQkJcmV0dXJuIHdvcmtWYXJpYW5jZUVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNIYXNGaXhlZFJhdGVVbml0cygpIHsKLQkJcmV0dXJuIGhhc0ZpeGVkUmF0ZVVuaXRzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEhhc0ZpeGVkUmF0ZVVuaXRzKGJvb2xlYW4gbmV3SGFzRml4ZWRSYXRlVW5pdHMpIHsKLQkJYm9vbGVhbiBvbGRIYXNGaXhlZFJhdGVVbml0cyA9IGhhc0ZpeGVkUmF0ZVVuaXRzOwotCQloYXNGaXhlZFJhdGVVbml0cyA9IG5ld0hhc0ZpeGVkUmF0ZVVuaXRzOwotCQlib29sZWFuIG9sZEhhc0ZpeGVkUmF0ZVVuaXRzRVNldCA9IGhhc0ZpeGVkUmF0ZVVuaXRzRVNldDsKLQkJaGFzRml4ZWRSYXRlVW5pdHNFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19IQVNfRklYRURfUkFURV9VTklUUywgb2xkSGFzRml4ZWRSYXRlVW5pdHMsIGhhc0ZpeGVkUmF0ZVVuaXRzLCAhb2xkSGFzRml4ZWRSYXRlVW5pdHNFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRIYXNGaXhlZFJhdGVVbml0cygpIHsKLQkJYm9vbGVhbiBvbGRIYXNGaXhlZFJhdGVVbml0cyA9IGhhc0ZpeGVkUmF0ZVVuaXRzOwotCQlib29sZWFuIG9sZEhhc0ZpeGVkUmF0ZVVuaXRzRVNldCA9IGhhc0ZpeGVkUmF0ZVVuaXRzRVNldDsKLQkJaGFzRml4ZWRSYXRlVW5pdHMgPSBIQVNfRklYRURfUkFURV9VTklUU19FREVGQVVMVDsKLQkJaGFzRml4ZWRSYXRlVW5pdHNFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19IQVNfRklYRURfUkFURV9VTklUUywgb2xkSGFzRml4ZWRSYXRlVW5pdHMsIEhBU19GSVhFRF9SQVRFX1VOSVRTX0VERUZBVUxULCBvbGRIYXNGaXhlZFJhdGVVbml0c0VTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldEhhc0ZpeGVkUmF0ZVVuaXRzKCkgewotCQlyZXR1cm4gaGFzRml4ZWRSYXRlVW5pdHNFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRml4ZWRNYXRlcmlhbCgpIHsKLQkJcmV0dXJuIGZpeGVkTWF0ZXJpYWw7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Rml4ZWRNYXRlcmlhbChib29sZWFuIG5ld0ZpeGVkTWF0ZXJpYWwpIHsKLQkJYm9vbGVhbiBvbGRGaXhlZE1hdGVyaWFsID0gZml4ZWRNYXRlcmlhbDsKLQkJZml4ZWRNYXRlcmlhbCA9IG5ld0ZpeGVkTWF0ZXJpYWw7Ci0JCWJvb2xlYW4gb2xkRml4ZWRNYXRlcmlhbEVTZXQgPSBmaXhlZE1hdGVyaWFsRVNldDsKLQkJZml4ZWRNYXRlcmlhbEVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0ZJWEVEX01BVEVSSUFMLCBvbGRGaXhlZE1hdGVyaWFsLCBmaXhlZE1hdGVyaWFsLCAhb2xkRml4ZWRNYXRlcmlhbEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldEZpeGVkTWF0ZXJpYWwoKSB7Ci0JCWJvb2xlYW4gb2xkRml4ZWRNYXRlcmlhbCA9IGZpeGVkTWF0ZXJpYWw7Ci0JCWJvb2xlYW4gb2xkRml4ZWRNYXRlcmlhbEVTZXQgPSBmaXhlZE1hdGVyaWFsRVNldDsKLQkJZml4ZWRNYXRlcmlhbCA9IEZJWEVEX01BVEVSSUFMX0VERUZBVUxUOwotCQlmaXhlZE1hdGVyaWFsRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fRklYRURfTUFURVJJQUwsIG9sZEZpeGVkTWF0ZXJpYWwsIEZJWEVEX01BVEVSSUFMX0VERUZBVUxULCBvbGRGaXhlZE1hdGVyaWFsRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0Rml4ZWRNYXRlcmlhbCgpIHsKLQkJcmV0dXJuIGZpeGVkTWF0ZXJpYWxFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGdldExldmVsaW5nRGVsYXkoKSB7Ci0JCXJldHVybiBsZXZlbGluZ0RlbGF5OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExldmVsaW5nRGVsYXkoQmlnSW50ZWdlciBuZXdMZXZlbGluZ0RlbGF5KSB7Ci0JCUJpZ0ludGVnZXIgb2xkTGV2ZWxpbmdEZWxheSA9IGxldmVsaW5nRGVsYXk7Ci0JCWxldmVsaW5nRGVsYXkgPSBuZXdMZXZlbGluZ0RlbGF5OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0xFVkVMSU5HX0RFTEFZLCBvbGRMZXZlbGluZ0RlbGF5LCBsZXZlbGluZ0RlbGF5KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0TGV2ZWxpbmdEZWxheUZvcm1hdCgpIHsKLQkJcmV0dXJuIGxldmVsaW5nRGVsYXlGb3JtYXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGV2ZWxpbmdEZWxheUZvcm1hdChCaWdJbnRlZ2VyIG5ld0xldmVsaW5nRGVsYXlGb3JtYXQpIHsKLQkJQmlnSW50ZWdlciBvbGRMZXZlbGluZ0RlbGF5Rm9ybWF0ID0gbGV2ZWxpbmdEZWxheUZvcm1hdDsKLQkJbGV2ZWxpbmdEZWxheUZvcm1hdCA9IG5ld0xldmVsaW5nRGVsYXlGb3JtYXQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fTEVWRUxJTkdfREVMQVlfRk9STUFULCBvbGRMZXZlbGluZ0RlbGF5Rm9ybWF0LCBsZXZlbGluZ0RlbGF5Rm9ybWF0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNMaW5rZWRGaWVsZHMoKSB7Ci0JCXJldHVybiBsaW5rZWRGaWVsZHM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGlua2VkRmllbGRzKGJvb2xlYW4gbmV3TGlua2VkRmllbGRzKSB7Ci0JCWJvb2xlYW4gb2xkTGlua2VkRmllbGRzID0gbGlua2VkRmllbGRzOwotCQlsaW5rZWRGaWVsZHMgPSBuZXdMaW5rZWRGaWVsZHM7Ci0JCWJvb2xlYW4gb2xkTGlua2VkRmllbGRzRVNldCA9IGxpbmtlZEZpZWxkc0VTZXQ7Ci0JCWxpbmtlZEZpZWxkc0VTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0xJTktFRF9GSUVMRFMsIG9sZExpbmtlZEZpZWxkcywgbGlua2VkRmllbGRzLCAhb2xkTGlua2VkRmllbGRzRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0TGlua2VkRmllbGRzKCkgewotCQlib29sZWFuIG9sZExpbmtlZEZpZWxkcyA9IGxpbmtlZEZpZWxkczsKLQkJYm9vbGVhbiBvbGRMaW5rZWRGaWVsZHNFU2V0ID0gbGlua2VkRmllbGRzRVNldDsKLQkJbGlua2VkRmllbGRzID0gTElOS0VEX0ZJRUxEU19FREVGQVVMVDsKLQkJbGlua2VkRmllbGRzRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fTElOS0VEX0ZJRUxEUywgb2xkTGlua2VkRmllbGRzLCBMSU5LRURfRklFTERTX0VERUZBVUxULCBvbGRMaW5rZWRGaWVsZHNFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRMaW5rZWRGaWVsZHMoKSB7Ci0JCXJldHVybiBsaW5rZWRGaWVsZHNFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzTWlsZXN0b25lKCkgewotCQlyZXR1cm4gbWlsZXN0b25lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1pbGVzdG9uZShib29sZWFuIG5ld01pbGVzdG9uZSkgewotCQlib29sZWFuIG9sZE1pbGVzdG9uZSA9IG1pbGVzdG9uZTsKLQkJbWlsZXN0b25lID0gbmV3TWlsZXN0b25lOwotCQlib29sZWFuIG9sZE1pbGVzdG9uZUVTZXQgPSBtaWxlc3RvbmVFU2V0OwotCQltaWxlc3RvbmVFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19NSUxFU1RPTkUsIG9sZE1pbGVzdG9uZSwgbWlsZXN0b25lLCAhb2xkTWlsZXN0b25lRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0TWlsZXN0b25lKCkgewotCQlib29sZWFuIG9sZE1pbGVzdG9uZSA9IG1pbGVzdG9uZTsKLQkJYm9vbGVhbiBvbGRNaWxlc3RvbmVFU2V0ID0gbWlsZXN0b25lRVNldDsKLQkJbWlsZXN0b25lID0gTUlMRVNUT05FX0VERUZBVUxUOwotCQltaWxlc3RvbmVFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19NSUxFU1RPTkUsIG9sZE1pbGVzdG9uZSwgTUlMRVNUT05FX0VERUZBVUxULCBvbGRNaWxlc3RvbmVFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRNaWxlc3RvbmUoKSB7Ci0JCXJldHVybiBtaWxlc3RvbmVFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Tm90ZXMoKSB7Ci0JCXJldHVybiBub3RlczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXROb3RlcyhTdHJpbmcgbmV3Tm90ZXMpIHsKLQkJU3RyaW5nIG9sZE5vdGVzID0gbm90ZXM7Ci0JCW5vdGVzID0gbmV3Tm90ZXM7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fTk9URVMsIG9sZE5vdGVzLCBub3RlcykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzT3ZlcmFsbG9jYXRlZCgpIHsKLQkJcmV0dXJuIG92ZXJhbGxvY2F0ZWQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0T3ZlcmFsbG9jYXRlZChib29sZWFuIG5ld092ZXJhbGxvY2F0ZWQpIHsKLQkJYm9vbGVhbiBvbGRPdmVyYWxsb2NhdGVkID0gb3ZlcmFsbG9jYXRlZDsKLQkJb3ZlcmFsbG9jYXRlZCA9IG5ld092ZXJhbGxvY2F0ZWQ7Ci0JCWJvb2xlYW4gb2xkT3ZlcmFsbG9jYXRlZEVTZXQgPSBvdmVyYWxsb2NhdGVkRVNldDsKLQkJb3ZlcmFsbG9jYXRlZEVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX09WRVJBTExPQ0FURUQsIG9sZE92ZXJhbGxvY2F0ZWQsIG92ZXJhbGxvY2F0ZWQsICFvbGRPdmVyYWxsb2NhdGVkRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0T3ZlcmFsbG9jYXRlZCgpIHsKLQkJYm9vbGVhbiBvbGRPdmVyYWxsb2NhdGVkID0gb3ZlcmFsbG9jYXRlZDsKLQkJYm9vbGVhbiBvbGRPdmVyYWxsb2NhdGVkRVNldCA9IG92ZXJhbGxvY2F0ZWRFU2V0OwotCQlvdmVyYWxsb2NhdGVkID0gT1ZFUkFMTE9DQVRFRF9FREVGQVVMVDsKLQkJb3ZlcmFsbG9jYXRlZEVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX09WRVJBTExPQ0FURUQsIG9sZE92ZXJhbGxvY2F0ZWQsIE9WRVJBTExPQ0FURURfRURFRkFVTFQsIG9sZE92ZXJhbGxvY2F0ZWRFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRPdmVyYWxsb2NhdGVkKCkgewotCQlyZXR1cm4gb3ZlcmFsbG9jYXRlZEVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0RlY2ltYWwgZ2V0T3ZlcnRpbWVDb3N0KCkgewotCQlyZXR1cm4gb3ZlcnRpbWVDb3N0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE92ZXJ0aW1lQ29zdChCaWdEZWNpbWFsIG5ld092ZXJ0aW1lQ29zdCkgewotCQlCaWdEZWNpbWFsIG9sZE92ZXJ0aW1lQ29zdCA9IG92ZXJ0aW1lQ29zdDsKLQkJb3ZlcnRpbWVDb3N0ID0gbmV3T3ZlcnRpbWVDb3N0OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX09WRVJUSU1FX0NPU1QsIG9sZE92ZXJ0aW1lQ29zdCwgb3ZlcnRpbWVDb3N0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRPdmVydGltZVdvcmsoKSB7Ci0JCXJldHVybiBvdmVydGltZVdvcms7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0T3ZlcnRpbWVXb3JrKE9iamVjdCBuZXdPdmVydGltZVdvcmspIHsKLQkJT2JqZWN0IG9sZE92ZXJ0aW1lV29yayA9IG92ZXJ0aW1lV29yazsKLQkJb3ZlcnRpbWVXb3JrID0gbmV3T3ZlcnRpbWVXb3JrOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX09WRVJUSU1FX1dPUkssIG9sZE92ZXJ0aW1lV29yaywgb3ZlcnRpbWVXb3JrKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRSZWd1bGFyV29yaygpIHsKLQkJcmV0dXJuIHJlZ3VsYXJXb3JrOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlZ3VsYXJXb3JrKE9iamVjdCBuZXdSZWd1bGFyV29yaykgewotCQlPYmplY3Qgb2xkUmVndWxhcldvcmsgPSByZWd1bGFyV29yazsKLQkJcmVndWxhcldvcmsgPSBuZXdSZWd1bGFyV29yazsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19SRUdVTEFSX1dPUkssIG9sZFJlZ3VsYXJXb3JrLCByZWd1bGFyV29yaykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdEZWNpbWFsIGdldFJlbWFpbmluZ0Nvc3QoKSB7Ci0JCXJldHVybiByZW1haW5pbmdDb3N0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlbWFpbmluZ0Nvc3QoQmlnRGVjaW1hbCBuZXdSZW1haW5pbmdDb3N0KSB7Ci0JCUJpZ0RlY2ltYWwgb2xkUmVtYWluaW5nQ29zdCA9IHJlbWFpbmluZ0Nvc3Q7Ci0JCXJlbWFpbmluZ0Nvc3QgPSBuZXdSZW1haW5pbmdDb3N0OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1JFTUFJTklOR19DT1NULCBvbGRSZW1haW5pbmdDb3N0LCByZW1haW5pbmdDb3N0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0RlY2ltYWwgZ2V0UmVtYWluaW5nT3ZlcnRpbWVDb3N0KCkgewotCQlyZXR1cm4gcmVtYWluaW5nT3ZlcnRpbWVDb3N0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlbWFpbmluZ092ZXJ0aW1lQ29zdChCaWdEZWNpbWFsIG5ld1JlbWFpbmluZ092ZXJ0aW1lQ29zdCkgewotCQlCaWdEZWNpbWFsIG9sZFJlbWFpbmluZ092ZXJ0aW1lQ29zdCA9IHJlbWFpbmluZ092ZXJ0aW1lQ29zdDsKLQkJcmVtYWluaW5nT3ZlcnRpbWVDb3N0ID0gbmV3UmVtYWluaW5nT3ZlcnRpbWVDb3N0OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1JFTUFJTklOR19PVkVSVElNRV9DT1NULCBvbGRSZW1haW5pbmdPdmVydGltZUNvc3QsIHJlbWFpbmluZ092ZXJ0aW1lQ29zdCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0UmVtYWluaW5nT3ZlcnRpbWVXb3JrKCkgewotCQlyZXR1cm4gcmVtYWluaW5nT3ZlcnRpbWVXb3JrOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlbWFpbmluZ092ZXJ0aW1lV29yayhPYmplY3QgbmV3UmVtYWluaW5nT3ZlcnRpbWVXb3JrKSB7Ci0JCU9iamVjdCBvbGRSZW1haW5pbmdPdmVydGltZVdvcmsgPSByZW1haW5pbmdPdmVydGltZVdvcms7Ci0JCXJlbWFpbmluZ092ZXJ0aW1lV29yayA9IG5ld1JlbWFpbmluZ092ZXJ0aW1lV29yazsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19SRU1BSU5JTkdfT1ZFUlRJTUVfV09SSywgb2xkUmVtYWluaW5nT3ZlcnRpbWVXb3JrLCByZW1haW5pbmdPdmVydGltZVdvcmspKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFJlbWFpbmluZ1dvcmsoKSB7Ci0JCXJldHVybiByZW1haW5pbmdXb3JrOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlbWFpbmluZ1dvcmsoT2JqZWN0IG5ld1JlbWFpbmluZ1dvcmspIHsKLQkJT2JqZWN0IG9sZFJlbWFpbmluZ1dvcmsgPSByZW1haW5pbmdXb3JrOwotCQlyZW1haW5pbmdXb3JrID0gbmV3UmVtYWluaW5nV29yazsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19SRU1BSU5JTkdfV09SSywgb2xkUmVtYWluaW5nV29yaywgcmVtYWluaW5nV29yaykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUmVzcG9uc2VQZW5kaW5nKCkgewotCQlyZXR1cm4gcmVzcG9uc2VQZW5kaW5nOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlc3BvbnNlUGVuZGluZyhib29sZWFuIG5ld1Jlc3BvbnNlUGVuZGluZykgewotCQlib29sZWFuIG9sZFJlc3BvbnNlUGVuZGluZyA9IHJlc3BvbnNlUGVuZGluZzsKLQkJcmVzcG9uc2VQZW5kaW5nID0gbmV3UmVzcG9uc2VQZW5kaW5nOwotCQlib29sZWFuIG9sZFJlc3BvbnNlUGVuZGluZ0VTZXQgPSByZXNwb25zZVBlbmRpbmdFU2V0OwotCQlyZXNwb25zZVBlbmRpbmdFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19SRVNQT05TRV9QRU5ESU5HLCBvbGRSZXNwb25zZVBlbmRpbmcsIHJlc3BvbnNlUGVuZGluZywgIW9sZFJlc3BvbnNlUGVuZGluZ0VTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldFJlc3BvbnNlUGVuZGluZygpIHsKLQkJYm9vbGVhbiBvbGRSZXNwb25zZVBlbmRpbmcgPSByZXNwb25zZVBlbmRpbmc7Ci0JCWJvb2xlYW4gb2xkUmVzcG9uc2VQZW5kaW5nRVNldCA9IHJlc3BvbnNlUGVuZGluZ0VTZXQ7Ci0JCXJlc3BvbnNlUGVuZGluZyA9IFJFU1BPTlNFX1BFTkRJTkdfRURFRkFVTFQ7Ci0JCXJlc3BvbnNlUGVuZGluZ0VTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1JFU1BPTlNFX1BFTkRJTkcsIG9sZFJlc3BvbnNlUGVuZGluZywgUkVTUE9OU0VfUEVORElOR19FREVGQVVMVCwgb2xkUmVzcG9uc2VQZW5kaW5nRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0UmVzcG9uc2VQZW5kaW5nKCkgewotCQlyZXR1cm4gcmVzcG9uc2VQZW5kaW5nRVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFN0YXJ0KCkgewotCQlyZXR1cm4gc3RhcnQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0U3RhcnQoT2JqZWN0IG5ld1N0YXJ0KSB7Ci0JCU9iamVjdCBvbGRTdGFydCA9IHN0YXJ0OwotCQlzdGFydCA9IG5ld1N0YXJ0OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1NUQVJULCBvbGRTdGFydCwgc3RhcnQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFN0b3AoKSB7Ci0JCXJldHVybiBzdG9wOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFN0b3AoT2JqZWN0IG5ld1N0b3ApIHsKLQkJT2JqZWN0IG9sZFN0b3AgPSBzdG9wOwotCQlzdG9wID0gbmV3U3RvcDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19TVE9QLCBvbGRTdG9wLCBzdG9wKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRSZXN1bWUoKSB7Ci0JCXJldHVybiByZXN1bWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmVzdW1lKE9iamVjdCBuZXdSZXN1bWUpIHsKLQkJT2JqZWN0IG9sZFJlc3VtZSA9IHJlc3VtZTsKLQkJcmVzdW1lID0gbmV3UmVzdW1lOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1JFU1VNRSwgb2xkUmVzdW1lLCByZXN1bWUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBnZXRTdGFydFZhcmlhbmNlKCkgewotCQlyZXR1cm4gc3RhcnRWYXJpYW5jZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTdGFydFZhcmlhbmNlKEJpZ0ludGVnZXIgbmV3U3RhcnRWYXJpYW5jZSkgewotCQlCaWdJbnRlZ2VyIG9sZFN0YXJ0VmFyaWFuY2UgPSBzdGFydFZhcmlhbmNlOwotCQlzdGFydFZhcmlhbmNlID0gbmV3U3RhcnRWYXJpYW5jZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19TVEFSVF9WQVJJQU5DRSwgb2xkU3RhcnRWYXJpYW5jZSwgc3RhcnRWYXJpYW5jZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBmbG9hdCBnZXRVbml0cygpIHsKLQkJcmV0dXJuIHVuaXRzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFVuaXRzKGZsb2F0IG5ld1VuaXRzKSB7Ci0JCWZsb2F0IG9sZFVuaXRzID0gdW5pdHM7Ci0JCXVuaXRzID0gbmV3VW5pdHM7Ci0JCWJvb2xlYW4gb2xkVW5pdHNFU2V0ID0gdW5pdHNFU2V0OwotCQl1bml0c0VTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1VOSVRTLCBvbGRVbml0cywgdW5pdHMsICFvbGRVbml0c0VTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldFVuaXRzKCkgewotCQlmbG9hdCBvbGRVbml0cyA9IHVuaXRzOwotCQlib29sZWFuIG9sZFVuaXRzRVNldCA9IHVuaXRzRVNldDsKLQkJdW5pdHMgPSBVTklUU19FREVGQVVMVDsKLQkJdW5pdHNFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19VTklUUywgb2xkVW5pdHMsIFVOSVRTX0VERUZBVUxULCBvbGRVbml0c0VTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldFVuaXRzKCkgewotCQlyZXR1cm4gdW5pdHNFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzVXBkYXRlTmVlZGVkKCkgewotCQlyZXR1cm4gdXBkYXRlTmVlZGVkOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFVwZGF0ZU5lZWRlZChib29sZWFuIG5ld1VwZGF0ZU5lZWRlZCkgewotCQlib29sZWFuIG9sZFVwZGF0ZU5lZWRlZCA9IHVwZGF0ZU5lZWRlZDsKLQkJdXBkYXRlTmVlZGVkID0gbmV3VXBkYXRlTmVlZGVkOwotCQlib29sZWFuIG9sZFVwZGF0ZU5lZWRlZEVTZXQgPSB1cGRhdGVOZWVkZWRFU2V0OwotCQl1cGRhdGVOZWVkZWRFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19VUERBVEVfTkVFREVELCBvbGRVcGRhdGVOZWVkZWQsIHVwZGF0ZU5lZWRlZCwgIW9sZFVwZGF0ZU5lZWRlZEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldFVwZGF0ZU5lZWRlZCgpIHsKLQkJYm9vbGVhbiBvbGRVcGRhdGVOZWVkZWQgPSB1cGRhdGVOZWVkZWQ7Ci0JCWJvb2xlYW4gb2xkVXBkYXRlTmVlZGVkRVNldCA9IHVwZGF0ZU5lZWRlZEVTZXQ7Ci0JCXVwZGF0ZU5lZWRlZCA9IFVQREFURV9ORUVERURfRURFRkFVTFQ7Ci0JCXVwZGF0ZU5lZWRlZEVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1VQREFURV9ORUVERUQsIG9sZFVwZGF0ZU5lZWRlZCwgVVBEQVRFX05FRURFRF9FREVGQVVMVCwgb2xkVXBkYXRlTmVlZGVkRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0VXBkYXRlTmVlZGVkKCkgewotCQlyZXR1cm4gdXBkYXRlTmVlZGVkRVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgZmxvYXQgZ2V0VkFDKCkgewotCQlyZXR1cm4gdkFDOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZBQyhmbG9hdCBuZXdWQUMpIHsKLQkJZmxvYXQgb2xkVkFDID0gdkFDOwotCQl2QUMgPSBuZXdWQUM7Ci0JCWJvb2xlYW4gb2xkVkFDRVNldCA9IHZBQ0VTZXQ7Ci0JCXZBQ0VTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1ZBQywgb2xkVkFDLCB2QUMsICFvbGRWQUNFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRWQUMoKSB7Ci0JCWZsb2F0IG9sZFZBQyA9IHZBQzsKLQkJYm9vbGVhbiBvbGRWQUNFU2V0ID0gdkFDRVNldDsKLQkJdkFDID0gVkFDX0VERUZBVUxUOwotCQl2QUNFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19WQUMsIG9sZFZBQywgVkFDX0VERUZBVUxULCBvbGRWQUNFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRWQUMoKSB7Ci0JCXJldHVybiB2QUNFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0V29yaygpIHsKLQkJcmV0dXJuIHdvcms7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0V29yayhPYmplY3QgbmV3V29yaykgewotCQlPYmplY3Qgb2xkV29yayA9IHdvcms7Ci0JCXdvcmsgPSBuZXdXb3JrOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1dPUkssIG9sZFdvcmssIHdvcmspKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBnZXRXb3JrQ29udG91cigpIHsKLQkJcmV0dXJuIHdvcmtDb250b3VyOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFdvcmtDb250b3VyKEJpZ0ludGVnZXIgbmV3V29ya0NvbnRvdXIpIHsKLQkJQmlnSW50ZWdlciBvbGRXb3JrQ29udG91ciA9IHdvcmtDb250b3VyOwotCQl3b3JrQ29udG91ciA9IG5ld1dvcmtDb250b3VyOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1dPUktfQ09OVE9VUiwgb2xkV29ya0NvbnRvdXIsIHdvcmtDb250b3VyKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGZsb2F0IGdldEJDV1MoKSB7Ci0JCXJldHVybiBiQ1dTOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEJDV1MoZmxvYXQgbmV3QkNXUykgewotCQlmbG9hdCBvbGRCQ1dTID0gYkNXUzsKLQkJYkNXUyA9IG5ld0JDV1M7Ci0JCWJvb2xlYW4gb2xkQkNXU0VTZXQgPSBiQ1dTRVNldDsKLQkJYkNXU0VTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0JDV1MsIG9sZEJDV1MsIGJDV1MsICFvbGRCQ1dTRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0QkNXUygpIHsKLQkJZmxvYXQgb2xkQkNXUyA9IGJDV1M7Ci0JCWJvb2xlYW4gb2xkQkNXU0VTZXQgPSBiQ1dTRVNldDsKLQkJYkNXUyA9IEJDV1NfRURFRkFVTFQ7Ci0JCWJDV1NFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19CQ1dTLCBvbGRCQ1dTLCBCQ1dTX0VERUZBVUxULCBvbGRCQ1dTRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0QkNXUygpIHsKLQkJcmV0dXJuIGJDV1NFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBmbG9hdCBnZXRCQ1dQKCkgewotCQlyZXR1cm4gYkNXUDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRCQ1dQKGZsb2F0IG5ld0JDV1ApIHsKLQkJZmxvYXQgb2xkQkNXUCA9IGJDV1A7Ci0JCWJDV1AgPSBuZXdCQ1dQOwotCQlib29sZWFuIG9sZEJDV1BFU2V0ID0gYkNXUEVTZXQ7Ci0JCWJDV1BFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19CQ1dQLCBvbGRCQ1dQLCBiQ1dQLCAhb2xkQkNXUEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldEJDV1AoKSB7Ci0JCWZsb2F0IG9sZEJDV1AgPSBiQ1dQOwotCQlib29sZWFuIG9sZEJDV1BFU2V0ID0gYkNXUEVTZXQ7Ci0JCWJDV1AgPSBCQ1dQX0VERUZBVUxUOwotCQliQ1dQRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fQkNXUCwgb2xkQkNXUCwgQkNXUF9FREVGQVVMVCwgb2xkQkNXUEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldEJDV1AoKSB7Ci0JCXJldHVybiBiQ1dQRVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBnZXRCb29raW5nVHlwZSgpIHsKLQkJcmV0dXJuIGJvb2tpbmdUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEJvb2tpbmdUeXBlKEJpZ0ludGVnZXIgbmV3Qm9va2luZ1R5cGUpIHsKLQkJQmlnSW50ZWdlciBvbGRCb29raW5nVHlwZSA9IGJvb2tpbmdUeXBlOwotCQlib29raW5nVHlwZSA9IG5ld0Jvb2tpbmdUeXBlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0JPT0tJTkdfVFlQRSwgb2xkQm9va2luZ1R5cGUsIGJvb2tpbmdUeXBlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRBY3R1YWxXb3JrUHJvdGVjdGVkKCkgewotCQlyZXR1cm4gYWN0dWFsV29ya1Byb3RlY3RlZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBY3R1YWxXb3JrUHJvdGVjdGVkKE9iamVjdCBuZXdBY3R1YWxXb3JrUHJvdGVjdGVkKSB7Ci0JCU9iamVjdCBvbGRBY3R1YWxXb3JrUHJvdGVjdGVkID0gYWN0dWFsV29ya1Byb3RlY3RlZDsKLQkJYWN0dWFsV29ya1Byb3RlY3RlZCA9IG5ld0FjdHVhbFdvcmtQcm90ZWN0ZWQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fQUNUVUFMX1dPUktfUFJPVEVDVEVELCBvbGRBY3R1YWxXb3JrUHJvdGVjdGVkLCBhY3R1YWxXb3JrUHJvdGVjdGVkKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRBY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQoKSB7Ci0JCXJldHVybiBhY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkKE9iamVjdCBuZXdBY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQpIHsKLQkJT2JqZWN0IG9sZEFjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZCA9IGFjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZDsKLQkJYWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkID0gbmV3QWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0FDVFVBTF9PVkVSVElNRV9XT1JLX1BST1RFQ1RFRCwgb2xkQWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkLCBhY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldENyZWF0aW9uRGF0ZSgpIHsKLQkJcmV0dXJuIGNyZWF0aW9uRGF0ZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDcmVhdGlvbkRhdGUoT2JqZWN0IG5ld0NyZWF0aW9uRGF0ZSkgewotCQlPYmplY3Qgb2xkQ3JlYXRpb25EYXRlID0gY3JlYXRpb25EYXRlOwotCQljcmVhdGlvbkRhdGUgPSBuZXdDcmVhdGlvbkRhdGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fQ1JFQVRJT05fREFURSwgb2xkQ3JlYXRpb25EYXRlLCBjcmVhdGlvbkRhdGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUoKSB7Ci0JCWlmIChleHRlbmRlZEF0dHJpYnV0ZSA9PSBudWxsKSB7Ci0JCQlleHRlbmRlZEF0dHJpYnV0ZSA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChFeHRlbmRlZEF0dHJpYnV0ZTQuY2xhc3MsIHRoaXMsIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fRVhURU5ERURfQVRUUklCVVRFKTsKLQkJfQotCQlyZXR1cm4gZXh0ZW5kZWRBdHRyaWJ1dGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldEJhc2VsaW5lKCkgewotCQlpZiAoYmFzZWxpbmUgPT0gbnVsbCkgewotCQkJYmFzZWxpbmUgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoQmFzZWxpbmUzLmNsYXNzLCB0aGlzLCBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0JBU0VMSU5FKTsKLQkJfQotCQlyZXR1cm4gYmFzZWxpbmU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldFRpbWVwaGFzZWREYXRhKCkgewotCQlpZiAodGltZXBoYXNlZERhdGEgPT0gbnVsbCkgewotCQkJdGltZXBoYXNlZERhdGEgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoVGltZXBoYXNlZERhdGFUeXBlLmNsYXNzLCB0aGlzLCBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1RJTUVQSEFTRURfREFUQSk7Ci0JCX0KLQkJcmV0dXJuIHRpbWVwaGFzZWREYXRhOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19FWFRFTkRFRF9BVFRSSUJVVEU6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19CQVNFTElORToKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRCYXNlbGluZSgpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1RJTUVQSEFTRURfREFUQToKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRUaW1lcGhhc2VkRGF0YSgpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fVUlEOgotCQkJCXJldHVybiBnZXRVSUQoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19UQVNLX1VJRDoKLQkJCQlyZXR1cm4gZ2V0VGFza1VJRCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1JFU09VUkNFX1VJRDoKLQkJCQlyZXR1cm4gZ2V0UmVzb3VyY2VVSUQoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19QRVJDRU5UX1dPUktfQ09NUExFVEU6Ci0JCQkJcmV0dXJuIGdldFBlcmNlbnRXb3JrQ29tcGxldGUoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19BQ1RVQUxfQ09TVDoKLQkJCQlyZXR1cm4gZ2V0QWN0dWFsQ29zdCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0FDVFVBTF9GSU5JU0g6Ci0JCQkJcmV0dXJuIGdldEFjdHVhbEZpbmlzaCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0FDVFVBTF9PVkVSVElNRV9DT1NUOgotCQkJCXJldHVybiBnZXRBY3R1YWxPdmVydGltZUNvc3QoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19BQ1RVQUxfT1ZFUlRJTUVfV09SSzoKLQkJCQlyZXR1cm4gZ2V0QWN0dWFsT3ZlcnRpbWVXb3JrKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fQUNUVUFMX1NUQVJUOgotCQkJCXJldHVybiBnZXRBY3R1YWxTdGFydCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0FDVFVBTF9XT1JLOgotCQkJCXJldHVybiBnZXRBY3R1YWxXb3JrKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fQUNXUDoKLQkJCQlyZXR1cm4gbmV3IEZsb2F0KGdldEFDV1AoKSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fQ09ORklSTUVEOgotCQkJCXJldHVybiBpc0NvbmZpcm1lZCgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19DT1NUOgotCQkJCXJldHVybiBnZXRDb3N0KCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fQ09TVF9SQVRFX1RBQkxFOgotCQkJCXJldHVybiBnZXRDb3N0UmF0ZVRhYmxlKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fQ09TVF9WQVJJQU5DRToKLQkJCQlyZXR1cm4gbmV3IEZsb2F0KGdldENvc3RWYXJpYW5jZSgpKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19DVjoKLQkJCQlyZXR1cm4gbmV3IEZsb2F0KGdldENWKCkpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0RFTEFZOgotCQkJCXJldHVybiBnZXREZWxheSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0ZJTklTSDoKLQkJCQlyZXR1cm4gZ2V0RmluaXNoKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fRklOSVNIX1ZBUklBTkNFOgotCQkJCXJldHVybiBnZXRGaW5pc2hWYXJpYW5jZSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0hZUEVSTElOSzoKLQkJCQlyZXR1cm4gZ2V0SHlwZXJsaW5rKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fSFlQRVJMSU5LX0FERFJFU1M6Ci0JCQkJcmV0dXJuIGdldEh5cGVybGlua0FkZHJlc3MoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19IWVBFUkxJTktfU1VCX0FERFJFU1M6Ci0JCQkJcmV0dXJuIGdldEh5cGVybGlua1N1YkFkZHJlc3MoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19XT1JLX1ZBUklBTkNFOgotCQkJCXJldHVybiBuZXcgRmxvYXQoZ2V0V29ya1ZhcmlhbmNlKCkpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0hBU19GSVhFRF9SQVRFX1VOSVRTOgotCQkJCXJldHVybiBpc0hhc0ZpeGVkUmF0ZVVuaXRzKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0ZJWEVEX01BVEVSSUFMOgotCQkJCXJldHVybiBpc0ZpeGVkTWF0ZXJpYWwoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fTEVWRUxJTkdfREVMQVk6Ci0JCQkJcmV0dXJuIGdldExldmVsaW5nRGVsYXkoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19MRVZFTElOR19ERUxBWV9GT1JNQVQ6Ci0JCQkJcmV0dXJuIGdldExldmVsaW5nRGVsYXlGb3JtYXQoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19MSU5LRURfRklFTERTOgotCQkJCXJldHVybiBpc0xpbmtlZEZpZWxkcygpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19NSUxFU1RPTkU6Ci0JCQkJcmV0dXJuIGlzTWlsZXN0b25lKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX05PVEVTOgotCQkJCXJldHVybiBnZXROb3RlcygpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX09WRVJBTExPQ0FURUQ6Ci0JCQkJcmV0dXJuIGlzT3ZlcmFsbG9jYXRlZCgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19PVkVSVElNRV9DT1NUOgotCQkJCXJldHVybiBnZXRPdmVydGltZUNvc3QoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19PVkVSVElNRV9XT1JLOgotCQkJCXJldHVybiBnZXRPdmVydGltZVdvcmsoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19SRUdVTEFSX1dPUks6Ci0JCQkJcmV0dXJuIGdldFJlZ3VsYXJXb3JrKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fUkVNQUlOSU5HX0NPU1Q6Ci0JCQkJcmV0dXJuIGdldFJlbWFpbmluZ0Nvc3QoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19SRU1BSU5JTkdfT1ZFUlRJTUVfQ09TVDoKLQkJCQlyZXR1cm4gZ2V0UmVtYWluaW5nT3ZlcnRpbWVDb3N0KCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fUkVNQUlOSU5HX09WRVJUSU1FX1dPUks6Ci0JCQkJcmV0dXJuIGdldFJlbWFpbmluZ092ZXJ0aW1lV29yaygpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1JFTUFJTklOR19XT1JLOgotCQkJCXJldHVybiBnZXRSZW1haW5pbmdXb3JrKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fUkVTUE9OU0VfUEVORElORzoKLQkJCQlyZXR1cm4gaXNSZXNwb25zZVBlbmRpbmcoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fU1RBUlQ6Ci0JCQkJcmV0dXJuIGdldFN0YXJ0KCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fU1RPUDoKLQkJCQlyZXR1cm4gZ2V0U3RvcCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1JFU1VNRToKLQkJCQlyZXR1cm4gZ2V0UmVzdW1lKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fU1RBUlRfVkFSSUFOQ0U6Ci0JCQkJcmV0dXJuIGdldFN0YXJ0VmFyaWFuY2UoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19VTklUUzoKLQkJCQlyZXR1cm4gbmV3IEZsb2F0KGdldFVuaXRzKCkpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1VQREFURV9ORUVERUQ6Ci0JCQkJcmV0dXJuIGlzVXBkYXRlTmVlZGVkKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1ZBQzoKLQkJCQlyZXR1cm4gbmV3IEZsb2F0KGdldFZBQygpKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19XT1JLOgotCQkJCXJldHVybiBnZXRXb3JrKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fV09SS19DT05UT1VSOgotCQkJCXJldHVybiBnZXRXb3JrQ29udG91cigpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0JDV1M6Ci0JCQkJcmV0dXJuIG5ldyBGbG9hdChnZXRCQ1dTKCkpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0JDV1A6Ci0JCQkJcmV0dXJuIG5ldyBGbG9hdChnZXRCQ1dQKCkpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0JPT0tJTkdfVFlQRToKLQkJCQlyZXR1cm4gZ2V0Qm9va2luZ1R5cGUoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19BQ1RVQUxfV09SS19QUk9URUNURUQ6Ci0JCQkJcmV0dXJuIGdldEFjdHVhbFdvcmtQcm90ZWN0ZWQoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19BQ1RVQUxfT1ZFUlRJTUVfV09SS19QUk9URUNURUQ6Ci0JCQkJcmV0dXJuIGdldEFjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0NSRUFUSU9OX0RBVEU6Ci0JCQkJcmV0dXJuIGdldENyZWF0aW9uRGF0ZSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0VYVEVOREVEX0FUVFJJQlVURToKLQkJCQlyZXR1cm4gZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19CQVNFTElORToKLQkJCQlyZXR1cm4gZ2V0QmFzZWxpbmUoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19USU1FUEhBU0VEX0RBVEE6Ci0JCQkJcmV0dXJuIGdldFRpbWVwaGFzZWREYXRhKCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1VJRDoKLQkJCQlzZXRVSUQoKEJpZ0ludGVnZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19UQVNLX1VJRDoKLQkJCQlzZXRUYXNrVUlEKChCaWdJbnRlZ2VyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fUkVTT1VSQ0VfVUlEOgotCQkJCXNldFJlc291cmNlVUlEKChCaWdJbnRlZ2VyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fUEVSQ0VOVF9XT1JLX0NPTVBMRVRFOgotCQkJCXNldFBlcmNlbnRXb3JrQ29tcGxldGUoKEJpZ0ludGVnZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19BQ1RVQUxfQ09TVDoKLQkJCQlzZXRBY3R1YWxDb3N0KChCaWdEZWNpbWFsKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fQUNUVUFMX0ZJTklTSDoKLQkJCQlzZXRBY3R1YWxGaW5pc2goKE9iamVjdCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0FDVFVBTF9PVkVSVElNRV9DT1NUOgotCQkJCXNldEFjdHVhbE92ZXJ0aW1lQ29zdCgoQmlnRGVjaW1hbCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0FDVFVBTF9PVkVSVElNRV9XT1JLOgotCQkJCXNldEFjdHVhbE92ZXJ0aW1lV29yaygoT2JqZWN0KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fQUNUVUFMX1NUQVJUOgotCQkJCXNldEFjdHVhbFN0YXJ0KChPYmplY3QpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19BQ1RVQUxfV09SSzoKLQkJCQlzZXRBY3R1YWxXb3JrKChPYmplY3QpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19BQ1dQOgotCQkJCXNldEFDV1AoKChGbG9hdCluZXdWYWx1ZSkuZmxvYXRWYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fQ09ORklSTUVEOgotCQkJCXNldENvbmZpcm1lZCgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fQ09TVDoKLQkJCQlzZXRDb3N0KChCaWdEZWNpbWFsKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fQ09TVF9SQVRFX1RBQkxFOgotCQkJCXNldENvc3RSYXRlVGFibGUoKEJpZ0ludGVnZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19DT1NUX1ZBUklBTkNFOgotCQkJCXNldENvc3RWYXJpYW5jZSgoKEZsb2F0KW5ld1ZhbHVlKS5mbG9hdFZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19DVjoKLQkJCQlzZXRDVigoKEZsb2F0KW5ld1ZhbHVlKS5mbG9hdFZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19ERUxBWToKLQkJCQlzZXREZWxheSgoQmlnSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0ZJTklTSDoKLQkJCQlzZXRGaW5pc2goKE9iamVjdCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0ZJTklTSF9WQVJJQU5DRToKLQkJCQlzZXRGaW5pc2hWYXJpYW5jZSgoQmlnSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0hZUEVSTElOSzoKLQkJCQlzZXRIeXBlcmxpbmsoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0hZUEVSTElOS19BRERSRVNTOgotCQkJCXNldEh5cGVybGlua0FkZHJlc3MoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0hZUEVSTElOS19TVUJfQUREUkVTUzoKLQkJCQlzZXRIeXBlcmxpbmtTdWJBZGRyZXNzKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19XT1JLX1ZBUklBTkNFOgotCQkJCXNldFdvcmtWYXJpYW5jZSgoKEZsb2F0KW5ld1ZhbHVlKS5mbG9hdFZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19IQVNfRklYRURfUkFURV9VTklUUzoKLQkJCQlzZXRIYXNGaXhlZFJhdGVVbml0cygoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fRklYRURfTUFURVJJQUw6Ci0JCQkJc2V0Rml4ZWRNYXRlcmlhbCgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fTEVWRUxJTkdfREVMQVk6Ci0JCQkJc2V0TGV2ZWxpbmdEZWxheSgoQmlnSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0xFVkVMSU5HX0RFTEFZX0ZPUk1BVDoKLQkJCQlzZXRMZXZlbGluZ0RlbGF5Rm9ybWF0KChCaWdJbnRlZ2VyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fTElOS0VEX0ZJRUxEUzoKLQkJCQlzZXRMaW5rZWRGaWVsZHMoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX01JTEVTVE9ORToKLQkJCQlzZXRNaWxlc3RvbmUoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX05PVEVTOgotCQkJCXNldE5vdGVzKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19PVkVSQUxMT0NBVEVEOgotCQkJCXNldE92ZXJhbGxvY2F0ZWQoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX09WRVJUSU1FX0NPU1Q6Ci0JCQkJc2V0T3ZlcnRpbWVDb3N0KChCaWdEZWNpbWFsKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fT1ZFUlRJTUVfV09SSzoKLQkJCQlzZXRPdmVydGltZVdvcmsoKE9iamVjdCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1JFR1VMQVJfV09SSzoKLQkJCQlzZXRSZWd1bGFyV29yaygoT2JqZWN0KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fUkVNQUlOSU5HX0NPU1Q6Ci0JCQkJc2V0UmVtYWluaW5nQ29zdCgoQmlnRGVjaW1hbCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1JFTUFJTklOR19PVkVSVElNRV9DT1NUOgotCQkJCXNldFJlbWFpbmluZ092ZXJ0aW1lQ29zdCgoQmlnRGVjaW1hbCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1JFTUFJTklOR19PVkVSVElNRV9XT1JLOgotCQkJCXNldFJlbWFpbmluZ092ZXJ0aW1lV29yaygoT2JqZWN0KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fUkVNQUlOSU5HX1dPUks6Ci0JCQkJc2V0UmVtYWluaW5nV29yaygoT2JqZWN0KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fUkVTUE9OU0VfUEVORElORzoKLQkJCQlzZXRSZXNwb25zZVBlbmRpbmcoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1NUQVJUOgotCQkJCXNldFN0YXJ0KChPYmplY3QpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19TVE9QOgotCQkJCXNldFN0b3AoKE9iamVjdCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1JFU1VNRToKLQkJCQlzZXRSZXN1bWUoKE9iamVjdCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1NUQVJUX1ZBUklBTkNFOgotCQkJCXNldFN0YXJ0VmFyaWFuY2UoKEJpZ0ludGVnZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19VTklUUzoKLQkJCQlzZXRVbml0cygoKEZsb2F0KW5ld1ZhbHVlKS5mbG9hdFZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19VUERBVEVfTkVFREVEOgotCQkJCXNldFVwZGF0ZU5lZWRlZCgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fVkFDOgotCQkJCXNldFZBQygoKEZsb2F0KW5ld1ZhbHVlKS5mbG9hdFZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19XT1JLOgotCQkJCXNldFdvcmsoKE9iamVjdCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1dPUktfQ09OVE9VUjoKLQkJCQlzZXRXb3JrQ29udG91cigoQmlnSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0JDV1M6Ci0JCQkJc2V0QkNXUygoKEZsb2F0KW5ld1ZhbHVlKS5mbG9hdFZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19CQ1dQOgotCQkJCXNldEJDV1AoKChGbG9hdCluZXdWYWx1ZSkuZmxvYXRWYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fQk9PS0lOR19UWVBFOgotCQkJCXNldEJvb2tpbmdUeXBlKChCaWdJbnRlZ2VyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fQUNUVUFMX1dPUktfUFJPVEVDVEVEOgotCQkJCXNldEFjdHVhbFdvcmtQcm90ZWN0ZWQoKE9iamVjdCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0FDVFVBTF9PVkVSVElNRV9XT1JLX1BST1RFQ1RFRDoKLQkJCQlzZXRBY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQoKE9iamVjdCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0NSRUFUSU9OX0RBVEU6Ci0JCQkJc2V0Q3JlYXRpb25EYXRlKChPYmplY3QpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19FWFRFTkRFRF9BVFRSSUJVVEU6Ci0JCQkJZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUoKS5jbGVhcigpOwotCQkJCWdldEV4dGVuZGVkQXR0cmlidXRlKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fQkFTRUxJTkU6Ci0JCQkJZ2V0QmFzZWxpbmUoKS5jbGVhcigpOwotCQkJCWdldEJhc2VsaW5lKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fVElNRVBIQVNFRF9EQVRBOgotCQkJCWdldFRpbWVwaGFzZWREYXRhKCkuY2xlYXIoKTsKLQkJCQlnZXRUaW1lcGhhc2VkRGF0YSgpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19VSUQ6Ci0JCQkJc2V0VUlEKFVJRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1RBU0tfVUlEOgotCQkJCXNldFRhc2tVSUQoVEFTS19VSURfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19SRVNPVVJDRV9VSUQ6Ci0JCQkJc2V0UmVzb3VyY2VVSUQoUkVTT1VSQ0VfVUlEX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fUEVSQ0VOVF9XT1JLX0NPTVBMRVRFOgotCQkJCXNldFBlcmNlbnRXb3JrQ29tcGxldGUoUEVSQ0VOVF9XT1JLX0NPTVBMRVRFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fQUNUVUFMX0NPU1Q6Ci0JCQkJc2V0QWN0dWFsQ29zdChBQ1RVQUxfQ09TVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0FDVFVBTF9GSU5JU0g6Ci0JCQkJc2V0QWN0dWFsRmluaXNoKEFDVFVBTF9GSU5JU0hfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19BQ1RVQUxfT1ZFUlRJTUVfQ09TVDoKLQkJCQlzZXRBY3R1YWxPdmVydGltZUNvc3QoQUNUVUFMX09WRVJUSU1FX0NPU1RfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19BQ1RVQUxfT1ZFUlRJTUVfV09SSzoKLQkJCQlzZXRBY3R1YWxPdmVydGltZVdvcmsoQUNUVUFMX09WRVJUSU1FX1dPUktfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19BQ1RVQUxfU1RBUlQ6Ci0JCQkJc2V0QWN0dWFsU3RhcnQoQUNUVUFMX1NUQVJUX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fQUNUVUFMX1dPUks6Ci0JCQkJc2V0QWN0dWFsV29yayhBQ1RVQUxfV09SS19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0FDV1A6Ci0JCQkJdW5zZXRBQ1dQKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0NPTkZJUk1FRDoKLQkJCQl1bnNldENvbmZpcm1lZCgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19DT1NUOgotCQkJCXNldENvc3QoQ09TVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0NPU1RfUkFURV9UQUJMRToKLQkJCQlzZXRDb3N0UmF0ZVRhYmxlKENPU1RfUkFURV9UQUJMRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0NPU1RfVkFSSUFOQ0U6Ci0JCQkJdW5zZXRDb3N0VmFyaWFuY2UoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fQ1Y6Ci0JCQkJdW5zZXRDVigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19ERUxBWToKLQkJCQlzZXREZWxheShERUxBWV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0ZJTklTSDoKLQkJCQlzZXRGaW5pc2goRklOSVNIX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fRklOSVNIX1ZBUklBTkNFOgotCQkJCXNldEZpbmlzaFZhcmlhbmNlKEZJTklTSF9WQVJJQU5DRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0hZUEVSTElOSzoKLQkJCQlzZXRIeXBlcmxpbmsoSFlQRVJMSU5LX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fSFlQRVJMSU5LX0FERFJFU1M6Ci0JCQkJc2V0SHlwZXJsaW5rQWRkcmVzcyhIWVBFUkxJTktfQUREUkVTU19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0hZUEVSTElOS19TVUJfQUREUkVTUzoKLQkJCQlzZXRIeXBlcmxpbmtTdWJBZGRyZXNzKEhZUEVSTElOS19TVUJfQUREUkVTU19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1dPUktfVkFSSUFOQ0U6Ci0JCQkJdW5zZXRXb3JrVmFyaWFuY2UoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fSEFTX0ZJWEVEX1JBVEVfVU5JVFM6Ci0JCQkJdW5zZXRIYXNGaXhlZFJhdGVVbml0cygpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19GSVhFRF9NQVRFUklBTDoKLQkJCQl1bnNldEZpeGVkTWF0ZXJpYWwoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fTEVWRUxJTkdfREVMQVk6Ci0JCQkJc2V0TGV2ZWxpbmdEZWxheShMRVZFTElOR19ERUxBWV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0xFVkVMSU5HX0RFTEFZX0ZPUk1BVDoKLQkJCQlzZXRMZXZlbGluZ0RlbGF5Rm9ybWF0KExFVkVMSU5HX0RFTEFZX0ZPUk1BVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0xJTktFRF9GSUVMRFM6Ci0JCQkJdW5zZXRMaW5rZWRGaWVsZHMoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fTUlMRVNUT05FOgotCQkJCXVuc2V0TWlsZXN0b25lKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX05PVEVTOgotCQkJCXNldE5vdGVzKE5PVEVTX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fT1ZFUkFMTE9DQVRFRDoKLQkJCQl1bnNldE92ZXJhbGxvY2F0ZWQoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fT1ZFUlRJTUVfQ09TVDoKLQkJCQlzZXRPdmVydGltZUNvc3QoT1ZFUlRJTUVfQ09TVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX09WRVJUSU1FX1dPUks6Ci0JCQkJc2V0T3ZlcnRpbWVXb3JrKE9WRVJUSU1FX1dPUktfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19SRUdVTEFSX1dPUks6Ci0JCQkJc2V0UmVndWxhcldvcmsoUkVHVUxBUl9XT1JLX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fUkVNQUlOSU5HX0NPU1Q6Ci0JCQkJc2V0UmVtYWluaW5nQ29zdChSRU1BSU5JTkdfQ09TVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1JFTUFJTklOR19PVkVSVElNRV9DT1NUOgotCQkJCXNldFJlbWFpbmluZ092ZXJ0aW1lQ29zdChSRU1BSU5JTkdfT1ZFUlRJTUVfQ09TVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1JFTUFJTklOR19PVkVSVElNRV9XT1JLOgotCQkJCXNldFJlbWFpbmluZ092ZXJ0aW1lV29yayhSRU1BSU5JTkdfT1ZFUlRJTUVfV09SS19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1JFTUFJTklOR19XT1JLOgotCQkJCXNldFJlbWFpbmluZ1dvcmsoUkVNQUlOSU5HX1dPUktfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19SRVNQT05TRV9QRU5ESU5HOgotCQkJCXVuc2V0UmVzcG9uc2VQZW5kaW5nKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1NUQVJUOgotCQkJCXNldFN0YXJ0KFNUQVJUX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fU1RPUDoKLQkJCQlzZXRTdG9wKFNUT1BfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19SRVNVTUU6Ci0JCQkJc2V0UmVzdW1lKFJFU1VNRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1NUQVJUX1ZBUklBTkNFOgotCQkJCXNldFN0YXJ0VmFyaWFuY2UoU1RBUlRfVkFSSUFOQ0VfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19VTklUUzoKLQkJCQl1bnNldFVuaXRzKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1VQREFURV9ORUVERUQ6Ci0JCQkJdW5zZXRVcGRhdGVOZWVkZWQoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fVkFDOgotCQkJCXVuc2V0VkFDKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1dPUks6Ci0JCQkJc2V0V29yayhXT1JLX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fV09SS19DT05UT1VSOgotCQkJCXNldFdvcmtDb250b3VyKFdPUktfQ09OVE9VUl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0JDV1M6Ci0JCQkJdW5zZXRCQ1dTKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0JDV1A6Ci0JCQkJdW5zZXRCQ1dQKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0JPT0tJTkdfVFlQRToKLQkJCQlzZXRCb29raW5nVHlwZShCT09LSU5HX1RZUEVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19BQ1RVQUxfV09SS19QUk9URUNURUQ6Ci0JCQkJc2V0QWN0dWFsV29ya1Byb3RlY3RlZChBQ1RVQUxfV09SS19QUk9URUNURURfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19BQ1RVQUxfT1ZFUlRJTUVfV09SS19QUk9URUNURUQ6Ci0JCQkJc2V0QWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkKEFDVFVBTF9PVkVSVElNRV9XT1JLX1BST1RFQ1RFRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0NSRUFUSU9OX0RBVEU6Ci0JCQkJc2V0Q3JlYXRpb25EYXRlKENSRUFUSU9OX0RBVEVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19FWFRFTkRFRF9BVFRSSUJVVEU6Ci0JCQkJZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19CQVNFTElORToKLQkJCQlnZXRCYXNlbGluZSgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1RJTUVQSEFTRURfREFUQToKLQkJCQlnZXRUaW1lcGhhc2VkRGF0YSgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fVUlEOgotCQkJCXJldHVybiBVSURfRURFRkFVTFQgPT0gbnVsbCA/IHVJRCAhPSBudWxsIDogIVVJRF9FREVGQVVMVC5lcXVhbHModUlEKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19UQVNLX1VJRDoKLQkJCQlyZXR1cm4gVEFTS19VSURfRURFRkFVTFQgPT0gbnVsbCA/IHRhc2tVSUQgIT0gbnVsbCA6ICFUQVNLX1VJRF9FREVGQVVMVC5lcXVhbHModGFza1VJRCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fUkVTT1VSQ0VfVUlEOgotCQkJCXJldHVybiBSRVNPVVJDRV9VSURfRURFRkFVTFQgPT0gbnVsbCA/IHJlc291cmNlVUlEICE9IG51bGwgOiAhUkVTT1VSQ0VfVUlEX0VERUZBVUxULmVxdWFscyhyZXNvdXJjZVVJRCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fUEVSQ0VOVF9XT1JLX0NPTVBMRVRFOgotCQkJCXJldHVybiBQRVJDRU5UX1dPUktfQ09NUExFVEVfRURFRkFVTFQgPT0gbnVsbCA/IHBlcmNlbnRXb3JrQ29tcGxldGUgIT0gbnVsbCA6ICFQRVJDRU5UX1dPUktfQ09NUExFVEVfRURFRkFVTFQuZXF1YWxzKHBlcmNlbnRXb3JrQ29tcGxldGUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0FDVFVBTF9DT1NUOgotCQkJCXJldHVybiBBQ1RVQUxfQ09TVF9FREVGQVVMVCA9PSBudWxsID8gYWN0dWFsQ29zdCAhPSBudWxsIDogIUFDVFVBTF9DT1NUX0VERUZBVUxULmVxdWFscyhhY3R1YWxDb3N0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19BQ1RVQUxfRklOSVNIOgotCQkJCXJldHVybiBBQ1RVQUxfRklOSVNIX0VERUZBVUxUID09IG51bGwgPyBhY3R1YWxGaW5pc2ggIT0gbnVsbCA6ICFBQ1RVQUxfRklOSVNIX0VERUZBVUxULmVxdWFscyhhY3R1YWxGaW5pc2gpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0FDVFVBTF9PVkVSVElNRV9DT1NUOgotCQkJCXJldHVybiBBQ1RVQUxfT1ZFUlRJTUVfQ09TVF9FREVGQVVMVCA9PSBudWxsID8gYWN0dWFsT3ZlcnRpbWVDb3N0ICE9IG51bGwgOiAhQUNUVUFMX09WRVJUSU1FX0NPU1RfRURFRkFVTFQuZXF1YWxzKGFjdHVhbE92ZXJ0aW1lQ29zdCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fQUNUVUFMX09WRVJUSU1FX1dPUks6Ci0JCQkJcmV0dXJuIEFDVFVBTF9PVkVSVElNRV9XT1JLX0VERUZBVUxUID09IG51bGwgPyBhY3R1YWxPdmVydGltZVdvcmsgIT0gbnVsbCA6ICFBQ1RVQUxfT1ZFUlRJTUVfV09SS19FREVGQVVMVC5lcXVhbHMoYWN0dWFsT3ZlcnRpbWVXb3JrKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19BQ1RVQUxfU1RBUlQ6Ci0JCQkJcmV0dXJuIEFDVFVBTF9TVEFSVF9FREVGQVVMVCA9PSBudWxsID8gYWN0dWFsU3RhcnQgIT0gbnVsbCA6ICFBQ1RVQUxfU1RBUlRfRURFRkFVTFQuZXF1YWxzKGFjdHVhbFN0YXJ0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19BQ1RVQUxfV09SSzoKLQkJCQlyZXR1cm4gQUNUVUFMX1dPUktfRURFRkFVTFQgPT0gbnVsbCA/IGFjdHVhbFdvcmsgIT0gbnVsbCA6ICFBQ1RVQUxfV09SS19FREVGQVVMVC5lcXVhbHMoYWN0dWFsV29yayk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fQUNXUDoKLQkJCQlyZXR1cm4gaXNTZXRBQ1dQKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fQ09ORklSTUVEOgotCQkJCXJldHVybiBpc1NldENvbmZpcm1lZCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0NPU1Q6Ci0JCQkJcmV0dXJuIENPU1RfRURFRkFVTFQgPT0gbnVsbCA/IGNvc3QgIT0gbnVsbCA6ICFDT1NUX0VERUZBVUxULmVxdWFscyhjb3N0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19DT1NUX1JBVEVfVEFCTEU6Ci0JCQkJcmV0dXJuIENPU1RfUkFURV9UQUJMRV9FREVGQVVMVCA9PSBudWxsID8gY29zdFJhdGVUYWJsZSAhPSBudWxsIDogIUNPU1RfUkFURV9UQUJMRV9FREVGQVVMVC5lcXVhbHMoY29zdFJhdGVUYWJsZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fQ09TVF9WQVJJQU5DRToKLQkJCQlyZXR1cm4gaXNTZXRDb3N0VmFyaWFuY2UoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19DVjoKLQkJCQlyZXR1cm4gaXNTZXRDVigpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0RFTEFZOgotCQkJCXJldHVybiBERUxBWV9FREVGQVVMVCA9PSBudWxsID8gZGVsYXkgIT0gbnVsbCA6ICFERUxBWV9FREVGQVVMVC5lcXVhbHMoZGVsYXkpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0ZJTklTSDoKLQkJCQlyZXR1cm4gRklOSVNIX0VERUZBVUxUID09IG51bGwgPyBmaW5pc2ggIT0gbnVsbCA6ICFGSU5JU0hfRURFRkFVTFQuZXF1YWxzKGZpbmlzaCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fRklOSVNIX1ZBUklBTkNFOgotCQkJCXJldHVybiBGSU5JU0hfVkFSSUFOQ0VfRURFRkFVTFQgPT0gbnVsbCA/IGZpbmlzaFZhcmlhbmNlICE9IG51bGwgOiAhRklOSVNIX1ZBUklBTkNFX0VERUZBVUxULmVxdWFscyhmaW5pc2hWYXJpYW5jZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fSFlQRVJMSU5LOgotCQkJCXJldHVybiBIWVBFUkxJTktfRURFRkFVTFQgPT0gbnVsbCA/IGh5cGVybGluayAhPSBudWxsIDogIUhZUEVSTElOS19FREVGQVVMVC5lcXVhbHMoaHlwZXJsaW5rKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19IWVBFUkxJTktfQUREUkVTUzoKLQkJCQlyZXR1cm4gSFlQRVJMSU5LX0FERFJFU1NfRURFRkFVTFQgPT0gbnVsbCA/IGh5cGVybGlua0FkZHJlc3MgIT0gbnVsbCA6ICFIWVBFUkxJTktfQUREUkVTU19FREVGQVVMVC5lcXVhbHMoaHlwZXJsaW5rQWRkcmVzcyk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fSFlQRVJMSU5LX1NVQl9BRERSRVNTOgotCQkJCXJldHVybiBIWVBFUkxJTktfU1VCX0FERFJFU1NfRURFRkFVTFQgPT0gbnVsbCA/IGh5cGVybGlua1N1YkFkZHJlc3MgIT0gbnVsbCA6ICFIWVBFUkxJTktfU1VCX0FERFJFU1NfRURFRkFVTFQuZXF1YWxzKGh5cGVybGlua1N1YkFkZHJlc3MpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1dPUktfVkFSSUFOQ0U6Ci0JCQkJcmV0dXJuIGlzU2V0V29ya1ZhcmlhbmNlKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fSEFTX0ZJWEVEX1JBVEVfVU5JVFM6Ci0JCQkJcmV0dXJuIGlzU2V0SGFzRml4ZWRSYXRlVW5pdHMoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19GSVhFRF9NQVRFUklBTDoKLQkJCQlyZXR1cm4gaXNTZXRGaXhlZE1hdGVyaWFsKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fTEVWRUxJTkdfREVMQVk6Ci0JCQkJcmV0dXJuIExFVkVMSU5HX0RFTEFZX0VERUZBVUxUID09IG51bGwgPyBsZXZlbGluZ0RlbGF5ICE9IG51bGwgOiAhTEVWRUxJTkdfREVMQVlfRURFRkFVTFQuZXF1YWxzKGxldmVsaW5nRGVsYXkpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0xFVkVMSU5HX0RFTEFZX0ZPUk1BVDoKLQkJCQlyZXR1cm4gTEVWRUxJTkdfREVMQVlfRk9STUFUX0VERUZBVUxUID09IG51bGwgPyBsZXZlbGluZ0RlbGF5Rm9ybWF0ICE9IG51bGwgOiAhTEVWRUxJTkdfREVMQVlfRk9STUFUX0VERUZBVUxULmVxdWFscyhsZXZlbGluZ0RlbGF5Rm9ybWF0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19MSU5LRURfRklFTERTOgotCQkJCXJldHVybiBpc1NldExpbmtlZEZpZWxkcygpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX01JTEVTVE9ORToKLQkJCQlyZXR1cm4gaXNTZXRNaWxlc3RvbmUoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19OT1RFUzoKLQkJCQlyZXR1cm4gTk9URVNfRURFRkFVTFQgPT0gbnVsbCA/IG5vdGVzICE9IG51bGwgOiAhTk9URVNfRURFRkFVTFQuZXF1YWxzKG5vdGVzKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19PVkVSQUxMT0NBVEVEOgotCQkJCXJldHVybiBpc1NldE92ZXJhbGxvY2F0ZWQoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19PVkVSVElNRV9DT1NUOgotCQkJCXJldHVybiBPVkVSVElNRV9DT1NUX0VERUZBVUxUID09IG51bGwgPyBvdmVydGltZUNvc3QgIT0gbnVsbCA6ICFPVkVSVElNRV9DT1NUX0VERUZBVUxULmVxdWFscyhvdmVydGltZUNvc3QpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX09WRVJUSU1FX1dPUks6Ci0JCQkJcmV0dXJuIE9WRVJUSU1FX1dPUktfRURFRkFVTFQgPT0gbnVsbCA/IG92ZXJ0aW1lV29yayAhPSBudWxsIDogIU9WRVJUSU1FX1dPUktfRURFRkFVTFQuZXF1YWxzKG92ZXJ0aW1lV29yayk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fUkVHVUxBUl9XT1JLOgotCQkJCXJldHVybiBSRUdVTEFSX1dPUktfRURFRkFVTFQgPT0gbnVsbCA/IHJlZ3VsYXJXb3JrICE9IG51bGwgOiAhUkVHVUxBUl9XT1JLX0VERUZBVUxULmVxdWFscyhyZWd1bGFyV29yayk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fUkVNQUlOSU5HX0NPU1Q6Ci0JCQkJcmV0dXJuIFJFTUFJTklOR19DT1NUX0VERUZBVUxUID09IG51bGwgPyByZW1haW5pbmdDb3N0ICE9IG51bGwgOiAhUkVNQUlOSU5HX0NPU1RfRURFRkFVTFQuZXF1YWxzKHJlbWFpbmluZ0Nvc3QpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1JFTUFJTklOR19PVkVSVElNRV9DT1NUOgotCQkJCXJldHVybiBSRU1BSU5JTkdfT1ZFUlRJTUVfQ09TVF9FREVGQVVMVCA9PSBudWxsID8gcmVtYWluaW5nT3ZlcnRpbWVDb3N0ICE9IG51bGwgOiAhUkVNQUlOSU5HX09WRVJUSU1FX0NPU1RfRURFRkFVTFQuZXF1YWxzKHJlbWFpbmluZ092ZXJ0aW1lQ29zdCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fUkVNQUlOSU5HX09WRVJUSU1FX1dPUks6Ci0JCQkJcmV0dXJuIFJFTUFJTklOR19PVkVSVElNRV9XT1JLX0VERUZBVUxUID09IG51bGwgPyByZW1haW5pbmdPdmVydGltZVdvcmsgIT0gbnVsbCA6ICFSRU1BSU5JTkdfT1ZFUlRJTUVfV09SS19FREVGQVVMVC5lcXVhbHMocmVtYWluaW5nT3ZlcnRpbWVXb3JrKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19SRU1BSU5JTkdfV09SSzoKLQkJCQlyZXR1cm4gUkVNQUlOSU5HX1dPUktfRURFRkFVTFQgPT0gbnVsbCA/IHJlbWFpbmluZ1dvcmsgIT0gbnVsbCA6ICFSRU1BSU5JTkdfV09SS19FREVGQVVMVC5lcXVhbHMocmVtYWluaW5nV29yayk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fUkVTUE9OU0VfUEVORElORzoKLQkJCQlyZXR1cm4gaXNTZXRSZXNwb25zZVBlbmRpbmcoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19TVEFSVDoKLQkJCQlyZXR1cm4gU1RBUlRfRURFRkFVTFQgPT0gbnVsbCA/IHN0YXJ0ICE9IG51bGwgOiAhU1RBUlRfRURFRkFVTFQuZXF1YWxzKHN0YXJ0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19TVE9QOgotCQkJCXJldHVybiBTVE9QX0VERUZBVUxUID09IG51bGwgPyBzdG9wICE9IG51bGwgOiAhU1RPUF9FREVGQVVMVC5lcXVhbHMoc3RvcCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fUkVTVU1FOgotCQkJCXJldHVybiBSRVNVTUVfRURFRkFVTFQgPT0gbnVsbCA/IHJlc3VtZSAhPSBudWxsIDogIVJFU1VNRV9FREVGQVVMVC5lcXVhbHMocmVzdW1lKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19TVEFSVF9WQVJJQU5DRToKLQkJCQlyZXR1cm4gU1RBUlRfVkFSSUFOQ0VfRURFRkFVTFQgPT0gbnVsbCA/IHN0YXJ0VmFyaWFuY2UgIT0gbnVsbCA6ICFTVEFSVF9WQVJJQU5DRV9FREVGQVVMVC5lcXVhbHMoc3RhcnRWYXJpYW5jZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fVU5JVFM6Ci0JCQkJcmV0dXJuIGlzU2V0VW5pdHMoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19VUERBVEVfTkVFREVEOgotCQkJCXJldHVybiBpc1NldFVwZGF0ZU5lZWRlZCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1ZBQzoKLQkJCQlyZXR1cm4gaXNTZXRWQUMoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19XT1JLOgotCQkJCXJldHVybiBXT1JLX0VERUZBVUxUID09IG51bGwgPyB3b3JrICE9IG51bGwgOiAhV09SS19FREVGQVVMVC5lcXVhbHMod29yayk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fV09SS19DT05UT1VSOgotCQkJCXJldHVybiBXT1JLX0NPTlRPVVJfRURFRkFVTFQgPT0gbnVsbCA/IHdvcmtDb250b3VyICE9IG51bGwgOiAhV09SS19DT05UT1VSX0VERUZBVUxULmVxdWFscyh3b3JrQ29udG91cik7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fQkNXUzoKLQkJCQlyZXR1cm4gaXNTZXRCQ1dTKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fQkNXUDoKLQkJCQlyZXR1cm4gaXNTZXRCQ1dQKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fQk9PS0lOR19UWVBFOgotCQkJCXJldHVybiBCT09LSU5HX1RZUEVfRURFRkFVTFQgPT0gbnVsbCA/IGJvb2tpbmdUeXBlICE9IG51bGwgOiAhQk9PS0lOR19UWVBFX0VERUZBVUxULmVxdWFscyhib29raW5nVHlwZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fQUNUVUFMX1dPUktfUFJPVEVDVEVEOgotCQkJCXJldHVybiBBQ1RVQUxfV09SS19QUk9URUNURURfRURFRkFVTFQgPT0gbnVsbCA/IGFjdHVhbFdvcmtQcm90ZWN0ZWQgIT0gbnVsbCA6ICFBQ1RVQUxfV09SS19QUk9URUNURURfRURFRkFVTFQuZXF1YWxzKGFjdHVhbFdvcmtQcm90ZWN0ZWQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0FDVFVBTF9PVkVSVElNRV9XT1JLX1BST1RFQ1RFRDoKLQkJCQlyZXR1cm4gQUNUVUFMX09WRVJUSU1FX1dPUktfUFJPVEVDVEVEX0VERUZBVUxUID09IG51bGwgPyBhY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQgIT0gbnVsbCA6ICFBQ1RVQUxfT1ZFUlRJTUVfV09SS19QUk9URUNURURfRURFRkFVTFQuZXF1YWxzKGFjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fQ1JFQVRJT05fREFURToKLQkJCQlyZXR1cm4gQ1JFQVRJT05fREFURV9FREVGQVVMVCA9PSBudWxsID8gY3JlYXRpb25EYXRlICE9IG51bGwgOiAhQ1JFQVRJT05fREFURV9FREVGQVVMVC5lcXVhbHMoY3JlYXRpb25EYXRlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19FWFRFTkRFRF9BVFRSSUJVVEU6Ci0JCQkJcmV0dXJuIGV4dGVuZGVkQXR0cmlidXRlICE9IG51bGwgJiYgIWV4dGVuZGVkQXR0cmlidXRlLmlzRW1wdHkoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19CQVNFTElORToKLQkJCQlyZXR1cm4gYmFzZWxpbmUgIT0gbnVsbCAmJiAhYmFzZWxpbmUuaXNFbXB0eSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1RJTUVQSEFTRURfREFUQToKLQkJCQlyZXR1cm4gdGltZXBoYXNlZERhdGEgIT0gbnVsbCAmJiAhdGltZXBoYXNlZERhdGEuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAodUlEOiAiKTsKLQkJcmVzdWx0LmFwcGVuZCh1SUQpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHRhc2tVSUQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHRhc2tVSUQpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHJlc291cmNlVUlEOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChyZXNvdXJjZVVJRCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcGVyY2VudFdvcmtDb21wbGV0ZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQocGVyY2VudFdvcmtDb21wbGV0ZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgYWN0dWFsQ29zdDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoYWN0dWFsQ29zdCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgYWN0dWFsRmluaXNoOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChhY3R1YWxGaW5pc2gpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGFjdHVhbE92ZXJ0aW1lQ29zdDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoYWN0dWFsT3ZlcnRpbWVDb3N0KTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBhY3R1YWxPdmVydGltZVdvcms6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGFjdHVhbE92ZXJ0aW1lV29yayk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgYWN0dWFsU3RhcnQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGFjdHVhbFN0YXJ0KTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBhY3R1YWxXb3JrOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChhY3R1YWxXb3JrKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBhQ1dQOiAiKTsKLQkJaWYgKGFDV1BFU2V0KSByZXN1bHQuYXBwZW5kKGFDV1ApOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBjb25maXJtZWQ6ICIpOwotCQlpZiAoY29uZmlybWVkRVNldCkgcmVzdWx0LmFwcGVuZChjb25maXJtZWQpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBjb3N0OiAiKTsKLQkJcmVzdWx0LmFwcGVuZChjb3N0KTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBjb3N0UmF0ZVRhYmxlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChjb3N0UmF0ZVRhYmxlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBjb3N0VmFyaWFuY2U6ICIpOwotCQlpZiAoY29zdFZhcmlhbmNlRVNldCkgcmVzdWx0LmFwcGVuZChjb3N0VmFyaWFuY2UpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBjVjogIik7Ci0JCWlmIChjVkVTZXQpIHJlc3VsdC5hcHBlbmQoY1YpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBkZWxheTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZGVsYXkpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGZpbmlzaDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZmluaXNoKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBmaW5pc2hWYXJpYW5jZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZmluaXNoVmFyaWFuY2UpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGh5cGVybGluazogIik7Ci0JCXJlc3VsdC5hcHBlbmQoaHlwZXJsaW5rKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBoeXBlcmxpbmtBZGRyZXNzOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChoeXBlcmxpbmtBZGRyZXNzKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBoeXBlcmxpbmtTdWJBZGRyZXNzOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChoeXBlcmxpbmtTdWJBZGRyZXNzKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCB3b3JrVmFyaWFuY2U6ICIpOwotCQlpZiAod29ya1ZhcmlhbmNlRVNldCkgcmVzdWx0LmFwcGVuZCh3b3JrVmFyaWFuY2UpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBoYXNGaXhlZFJhdGVVbml0czogIik7Ci0JCWlmIChoYXNGaXhlZFJhdGVVbml0c0VTZXQpIHJlc3VsdC5hcHBlbmQoaGFzRml4ZWRSYXRlVW5pdHMpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBmaXhlZE1hdGVyaWFsOiAiKTsKLQkJaWYgKGZpeGVkTWF0ZXJpYWxFU2V0KSByZXN1bHQuYXBwZW5kKGZpeGVkTWF0ZXJpYWwpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBsZXZlbGluZ0RlbGF5OiAiKTsKLQkJcmVzdWx0LmFwcGVuZChsZXZlbGluZ0RlbGF5KTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBsZXZlbGluZ0RlbGF5Rm9ybWF0OiAiKTsKLQkJcmVzdWx0LmFwcGVuZChsZXZlbGluZ0RlbGF5Rm9ybWF0KTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBsaW5rZWRGaWVsZHM6ICIpOwotCQlpZiAobGlua2VkRmllbGRzRVNldCkgcmVzdWx0LmFwcGVuZChsaW5rZWRGaWVsZHMpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBtaWxlc3RvbmU6ICIpOwotCQlpZiAobWlsZXN0b25lRVNldCkgcmVzdWx0LmFwcGVuZChtaWxlc3RvbmUpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBub3RlczogIik7Ci0JCXJlc3VsdC5hcHBlbmQobm90ZXMpOwotCQlyZXN1bHQuYXBwZW5kKCIsIG92ZXJhbGxvY2F0ZWQ6ICIpOwotCQlpZiAob3ZlcmFsbG9jYXRlZEVTZXQpIHJlc3VsdC5hcHBlbmQob3ZlcmFsbG9jYXRlZCk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIG92ZXJ0aW1lQ29zdDogIik7Ci0JCXJlc3VsdC5hcHBlbmQob3ZlcnRpbWVDb3N0KTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBvdmVydGltZVdvcms6ICIpOwotCQlyZXN1bHQuYXBwZW5kKG92ZXJ0aW1lV29yayk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcmVndWxhcldvcms6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHJlZ3VsYXJXb3JrKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCByZW1haW5pbmdDb3N0OiAiKTsKLQkJcmVzdWx0LmFwcGVuZChyZW1haW5pbmdDb3N0KTsKLQkJcmVzdWx0LmFwcGVuZCgiLCByZW1haW5pbmdPdmVydGltZUNvc3Q6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHJlbWFpbmluZ092ZXJ0aW1lQ29zdCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcmVtYWluaW5nT3ZlcnRpbWVXb3JrOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChyZW1haW5pbmdPdmVydGltZVdvcmspOwotCQlyZXN1bHQuYXBwZW5kKCIsIHJlbWFpbmluZ1dvcms6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHJlbWFpbmluZ1dvcmspOwotCQlyZXN1bHQuYXBwZW5kKCIsIHJlc3BvbnNlUGVuZGluZzogIik7Ci0JCWlmIChyZXNwb25zZVBlbmRpbmdFU2V0KSByZXN1bHQuYXBwZW5kKHJlc3BvbnNlUGVuZGluZyk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHN0YXJ0OiAiKTsKLQkJcmVzdWx0LmFwcGVuZChzdGFydCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgc3RvcDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoc3RvcCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcmVzdW1lOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChyZXN1bWUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHN0YXJ0VmFyaWFuY2U6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHN0YXJ0VmFyaWFuY2UpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHVuaXRzOiAiKTsKLQkJaWYgKHVuaXRzRVNldCkgcmVzdWx0LmFwcGVuZCh1bml0cyk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHVwZGF0ZU5lZWRlZDogIik7Ci0JCWlmICh1cGRhdGVOZWVkZWRFU2V0KSByZXN1bHQuYXBwZW5kKHVwZGF0ZU5lZWRlZCk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHZBQzogIik7Ci0JCWlmICh2QUNFU2V0KSByZXN1bHQuYXBwZW5kKHZBQyk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHdvcms6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHdvcmspOwotCQlyZXN1bHQuYXBwZW5kKCIsIHdvcmtDb250b3VyOiAiKTsKLQkJcmVzdWx0LmFwcGVuZCh3b3JrQ29udG91cik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgYkNXUzogIik7Ci0JCWlmIChiQ1dTRVNldCkgcmVzdWx0LmFwcGVuZChiQ1dTKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgYkNXUDogIik7Ci0JCWlmIChiQ1dQRVNldCkgcmVzdWx0LmFwcGVuZChiQ1dQKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgYm9va2luZ1R5cGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGJvb2tpbmdUeXBlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBhY3R1YWxXb3JrUHJvdGVjdGVkOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChhY3R1YWxXb3JrUHJvdGVjdGVkKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBhY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGFjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgY3JlYXRpb25EYXRlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChjcmVhdGlvbkRhdGUpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9Bc3NpZ25tZW50SW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL0Fzc2lnbm1lbnRzSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL0Fzc2lnbm1lbnRzSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMDI1NjcyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9Bc3NpZ25tZW50c0ltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0OSArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IEFzc2lnbm1lbnRzSW1wbC5qYXZhLHYgMS4xIDIwMDgvMDEvMTUgMDg6NTE6NTMganRoYW0gRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkFzc2lnbm1lbnRzPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuQXNzaWdubWVudHNJbXBsI2dldEFzc2lnbm1lbnQgPGVtPkFzc2lnbm1lbnQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBBc3NpZ25tZW50c0ltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIEFzc2lnbm1lbnRzIHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBc3NpZ25tZW50KCkgPGVtPkFzc2lnbm1lbnQ8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QXNzaWdubWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGFzc2lnbm1lbnQgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEFzc2lnbm1lbnRzSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldEFzc2lnbm1lbnRzKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldEFzc2lnbm1lbnQoKSB7Ci0JCWlmIChhc3NpZ25tZW50ID09IG51bGwpIHsKLQkJCWFzc2lnbm1lbnQgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoQXNzaWdubWVudC5jbGFzcywgdGhpcywgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UU19fQVNTSUdOTUVOVCk7Ci0JCX0KLQkJcmV0dXJuIGFzc2lnbm1lbnQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRTX19BU1NJR05NRU5UOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEFzc2lnbm1lbnQoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRTX19BU1NJR05NRU5UOgotCQkJCXJldHVybiBnZXRBc3NpZ25tZW50KCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRTX19BU1NJR05NRU5UOgotCQkJCWdldEFzc2lnbm1lbnQoKS5jbGVhcigpOwotCQkJCWdldEFzc2lnbm1lbnQoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVFNfX0FTU0lHTk1FTlQ6Ci0JCQkJZ2V0QXNzaWdubWVudCgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVFNfX0FTU0lHTk1FTlQ6Ci0JCQkJcmV0dXJuIGFzc2lnbm1lbnQgIT0gbnVsbCAmJiAhYXNzaWdubWVudC5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotfSAvL0Fzc2lnbm1lbnRzSW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL0F2YWlsYWJpbGl0eVBlcmlvZEltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9BdmFpbGFiaWxpdHlQZXJpb2RJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4NjBiYWMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL0F2YWlsYWJpbGl0eVBlcmlvZEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwMSArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IEF2YWlsYWJpbGl0eVBlcmlvZEltcGwuamF2YSx2IDEuMSAyMDA4LzAxLzE1IDA4OjUxOjUzIGp0aGFtIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkF2YWlsYWJpbGl0eVBlcmlvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5BdmFpbGFiaWxpdHkgUGVyaW9kPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuQXZhaWxhYmlsaXR5UGVyaW9kSW1wbCNnZXRBdmFpbGFibGVGcm9tIDxlbT5BdmFpbGFibGUgRnJvbTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkF2YWlsYWJpbGl0eVBlcmlvZEltcGwjZ2V0QXZhaWxhYmxlVG8gPGVtPkF2YWlsYWJsZSBUbzwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkF2YWlsYWJpbGl0eVBlcmlvZEltcGwjZ2V0QXZhaWxhYmxlVW5pdHMgPGVtPkF2YWlsYWJsZSBVbml0czwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEF2YWlsYWJpbGl0eVBlcmlvZEltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIEF2YWlsYWJpbGl0eVBlcmlvZCB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEF2YWlsYWJsZUZyb20oKSA8ZW0+QXZhaWxhYmxlIEZyb208L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEF2YWlsYWJsZUZyb20oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgT2JqZWN0IEFWQUlMQUJMRV9GUk9NX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEF2YWlsYWJsZUZyb20oKSA8ZW0+QXZhaWxhYmxlIEZyb208L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEF2YWlsYWJsZUZyb20oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgYXZhaWxhYmxlRnJvbSA9IEFWQUlMQUJMRV9GUk9NX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEF2YWlsYWJsZVRvKCkgPGVtPkF2YWlsYWJsZSBUbzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QXZhaWxhYmxlVG8oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgT2JqZWN0IEFWQUlMQUJMRV9UT19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBdmFpbGFibGVUbygpIDxlbT5BdmFpbGFibGUgVG88L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEF2YWlsYWJsZVRvKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGF2YWlsYWJsZVRvID0gQVZBSUxBQkxFX1RPX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEF2YWlsYWJsZVVuaXRzKCkgPGVtPkF2YWlsYWJsZSBVbml0czwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QXZhaWxhYmxlVW5pdHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgZmxvYXQgQVZBSUxBQkxFX1VOSVRTX0VERUZBVUxUID0gMC4wRjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEF2YWlsYWJsZVVuaXRzKCkgPGVtPkF2YWlsYWJsZSBVbml0czwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QXZhaWxhYmxlVW5pdHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBmbG9hdCBhdmFpbGFibGVVbml0cyA9IEFWQUlMQUJMRV9VTklUU19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgQXZhaWxhYmxlIFVuaXRzIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBhdmFpbGFibGVVbml0c0VTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBBdmFpbGFiaWxpdHlQZXJpb2RJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0QXZhaWxhYmlsaXR5UGVyaW9kKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRBdmFpbGFibGVGcm9tKCkgewotCQlyZXR1cm4gYXZhaWxhYmxlRnJvbTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBdmFpbGFibGVGcm9tKE9iamVjdCBuZXdBdmFpbGFibGVGcm9tKSB7Ci0JCU9iamVjdCBvbGRBdmFpbGFibGVGcm9tID0gYXZhaWxhYmxlRnJvbTsKLQkJYXZhaWxhYmxlRnJvbSA9IG5ld0F2YWlsYWJsZUZyb207Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuQVZBSUxBQklMSVRZX1BFUklPRF9fQVZBSUxBQkxFX0ZST00sIG9sZEF2YWlsYWJsZUZyb20sIGF2YWlsYWJsZUZyb20pKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEF2YWlsYWJsZVRvKCkgewotCQlyZXR1cm4gYXZhaWxhYmxlVG87Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QXZhaWxhYmxlVG8oT2JqZWN0IG5ld0F2YWlsYWJsZVRvKSB7Ci0JCU9iamVjdCBvbGRBdmFpbGFibGVUbyA9IGF2YWlsYWJsZVRvOwotCQlhdmFpbGFibGVUbyA9IG5ld0F2YWlsYWJsZVRvOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkFWQUlMQUJJTElUWV9QRVJJT0RfX0FWQUlMQUJMRV9UTywgb2xkQXZhaWxhYmxlVG8sIGF2YWlsYWJsZVRvKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGZsb2F0IGdldEF2YWlsYWJsZVVuaXRzKCkgewotCQlyZXR1cm4gYXZhaWxhYmxlVW5pdHM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QXZhaWxhYmxlVW5pdHMoZmxvYXQgbmV3QXZhaWxhYmxlVW5pdHMpIHsKLQkJZmxvYXQgb2xkQXZhaWxhYmxlVW5pdHMgPSBhdmFpbGFibGVVbml0czsKLQkJYXZhaWxhYmxlVW5pdHMgPSBuZXdBdmFpbGFibGVVbml0czsKLQkJYm9vbGVhbiBvbGRBdmFpbGFibGVVbml0c0VTZXQgPSBhdmFpbGFibGVVbml0c0VTZXQ7Ci0JCWF2YWlsYWJsZVVuaXRzRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuQVZBSUxBQklMSVRZX1BFUklPRF9fQVZBSUxBQkxFX1VOSVRTLCBvbGRBdmFpbGFibGVVbml0cywgYXZhaWxhYmxlVW5pdHMsICFvbGRBdmFpbGFibGVVbml0c0VTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldEF2YWlsYWJsZVVuaXRzKCkgewotCQlmbG9hdCBvbGRBdmFpbGFibGVVbml0cyA9IGF2YWlsYWJsZVVuaXRzOwotCQlib29sZWFuIG9sZEF2YWlsYWJsZVVuaXRzRVNldCA9IGF2YWlsYWJsZVVuaXRzRVNldDsKLQkJYXZhaWxhYmxlVW5pdHMgPSBBVkFJTEFCTEVfVU5JVFNfRURFRkFVTFQ7Ci0JCWF2YWlsYWJsZVVuaXRzRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIE1zcHJvamVjdFBhY2thZ2UuQVZBSUxBQklMSVRZX1BFUklPRF9fQVZBSUxBQkxFX1VOSVRTLCBvbGRBdmFpbGFibGVVbml0cywgQVZBSUxBQkxFX1VOSVRTX0VERUZBVUxULCBvbGRBdmFpbGFibGVVbml0c0VTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldEF2YWlsYWJsZVVuaXRzKCkgewotCQlyZXR1cm4gYXZhaWxhYmxlVW5pdHNFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BVkFJTEFCSUxJVFlfUEVSSU9EX19BVkFJTEFCTEVfRlJPTToKLQkJCQlyZXR1cm4gZ2V0QXZhaWxhYmxlRnJvbSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFWQUlMQUJJTElUWV9QRVJJT0RfX0FWQUlMQUJMRV9UTzoKLQkJCQlyZXR1cm4gZ2V0QXZhaWxhYmxlVG8oKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BVkFJTEFCSUxJVFlfUEVSSU9EX19BVkFJTEFCTEVfVU5JVFM6Ci0JCQkJcmV0dXJuIG5ldyBGbG9hdChnZXRBdmFpbGFibGVVbml0cygpKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVZBSUxBQklMSVRZX1BFUklPRF9fQVZBSUxBQkxFX0ZST006Ci0JCQkJc2V0QXZhaWxhYmxlRnJvbSgoT2JqZWN0KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVZBSUxBQklMSVRZX1BFUklPRF9fQVZBSUxBQkxFX1RPOgotCQkJCXNldEF2YWlsYWJsZVRvKChPYmplY3QpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BVkFJTEFCSUxJVFlfUEVSSU9EX19BVkFJTEFCTEVfVU5JVFM6Ci0JCQkJc2V0QXZhaWxhYmxlVW5pdHMoKChGbG9hdCluZXdWYWx1ZSkuZmxvYXRWYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFWQUlMQUJJTElUWV9QRVJJT0RfX0FWQUlMQUJMRV9GUk9NOgotCQkJCXNldEF2YWlsYWJsZUZyb20oQVZBSUxBQkxFX0ZST01fRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BVkFJTEFCSUxJVFlfUEVSSU9EX19BVkFJTEFCTEVfVE86Ci0JCQkJc2V0QXZhaWxhYmxlVG8oQVZBSUxBQkxFX1RPX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVZBSUxBQklMSVRZX1BFUklPRF9fQVZBSUxBQkxFX1VOSVRTOgotCQkJCXVuc2V0QXZhaWxhYmxlVW5pdHMoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BVkFJTEFCSUxJVFlfUEVSSU9EX19BVkFJTEFCTEVfRlJPTToKLQkJCQlyZXR1cm4gQVZBSUxBQkxFX0ZST01fRURFRkFVTFQgPT0gbnVsbCA/IGF2YWlsYWJsZUZyb20gIT0gbnVsbCA6ICFBVkFJTEFCTEVfRlJPTV9FREVGQVVMVC5lcXVhbHMoYXZhaWxhYmxlRnJvbSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVZBSUxBQklMSVRZX1BFUklPRF9fQVZBSUxBQkxFX1RPOgotCQkJCXJldHVybiBBVkFJTEFCTEVfVE9fRURFRkFVTFQgPT0gbnVsbCA/IGF2YWlsYWJsZVRvICE9IG51bGwgOiAhQVZBSUxBQkxFX1RPX0VERUZBVUxULmVxdWFscyhhdmFpbGFibGVUbyk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVZBSUxBQklMSVRZX1BFUklPRF9fQVZBSUxBQkxFX1VOSVRTOgotCQkJCXJldHVybiBpc1NldEF2YWlsYWJsZVVuaXRzKCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChhdmFpbGFibGVGcm9tOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChhdmFpbGFibGVGcm9tKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBhdmFpbGFibGVUbzogIik7Ci0JCXJlc3VsdC5hcHBlbmQoYXZhaWxhYmxlVG8pOwotCQlyZXN1bHQuYXBwZW5kKCIsIGF2YWlsYWJsZVVuaXRzOiAiKTsKLQkJaWYgKGF2YWlsYWJsZVVuaXRzRVNldCkgcmVzdWx0LmFwcGVuZChhdmFpbGFibGVVbml0cyk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9BdmFpbGFiaWxpdHlQZXJpb2RJbXBsCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvQXZhaWxhYmlsaXR5UGVyaW9kc0ltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9BdmFpbGFiaWxpdHlQZXJpb2RzSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZTY1NDgxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9BdmFpbGFiaWxpdHlQZXJpb2RzSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ5ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogQXZhaWxhYmlsaXR5UGVyaW9kc0ltcGwuamF2YSx2IDEuMSAyMDA4LzAxLzE1IDA4OjUxOjUzIGp0aGFtIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkF2YWlsYWJpbGl0eVBlcmlvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkF2YWlsYWJpbGl0eVBlcmlvZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+QXZhaWxhYmlsaXR5IFBlcmlvZHM8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5BdmFpbGFiaWxpdHlQZXJpb2RzSW1wbCNnZXRBdmFpbGFiaWxpdHlQZXJpb2QgPGVtPkF2YWlsYWJpbGl0eSBQZXJpb2Q8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBBdmFpbGFiaWxpdHlQZXJpb2RzSW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgQXZhaWxhYmlsaXR5UGVyaW9kcyB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QXZhaWxhYmlsaXR5UGVyaW9kKCkgPGVtPkF2YWlsYWJpbGl0eSBQZXJpb2Q8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QXZhaWxhYmlsaXR5UGVyaW9kKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgYXZhaWxhYmlsaXR5UGVyaW9kID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBBdmFpbGFiaWxpdHlQZXJpb2RzSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldEF2YWlsYWJpbGl0eVBlcmlvZHMoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0QXZhaWxhYmlsaXR5UGVyaW9kKCkgewotCQlpZiAoYXZhaWxhYmlsaXR5UGVyaW9kID09IG51bGwpIHsKLQkJCWF2YWlsYWJpbGl0eVBlcmlvZCA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChBdmFpbGFiaWxpdHlQZXJpb2QuY2xhc3MsIHRoaXMsIE1zcHJvamVjdFBhY2thZ2UuQVZBSUxBQklMSVRZX1BFUklPRFNfX0FWQUlMQUJJTElUWV9QRVJJT0QpOwotCQl9Ci0JCXJldHVybiBhdmFpbGFiaWxpdHlQZXJpb2Q7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFWQUlMQUJJTElUWV9QRVJJT0RTX19BVkFJTEFCSUxJVFlfUEVSSU9EOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEF2YWlsYWJpbGl0eVBlcmlvZCgpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVZBSUxBQklMSVRZX1BFUklPRFNfX0FWQUlMQUJJTElUWV9QRVJJT0Q6Ci0JCQkJcmV0dXJuIGdldEF2YWlsYWJpbGl0eVBlcmlvZCgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BVkFJTEFCSUxJVFlfUEVSSU9EU19fQVZBSUxBQklMSVRZX1BFUklPRDoKLQkJCQlnZXRBdmFpbGFiaWxpdHlQZXJpb2QoKS5jbGVhcigpOwotCQkJCWdldEF2YWlsYWJpbGl0eVBlcmlvZCgpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BVkFJTEFCSUxJVFlfUEVSSU9EU19fQVZBSUxBQklMSVRZX1BFUklPRDoKLQkJCQlnZXRBdmFpbGFiaWxpdHlQZXJpb2QoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFWQUlMQUJJTElUWV9QRVJJT0RTX19BVkFJTEFCSUxJVFlfUEVSSU9EOgotCQkJCXJldHVybiBhdmFpbGFiaWxpdHlQZXJpb2QgIT0gbnVsbCAmJiAhYXZhaWxhYmlsaXR5UGVyaW9kLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi19IC8vQXZhaWxhYmlsaXR5UGVyaW9kc0ltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9CYXNlbGluZTJJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvQmFzZWxpbmUySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NGRjM2QxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9CYXNlbGluZTJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NzkgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBCYXNlbGluZTJJbXBsLmphdmEsdiAxLjEgMjAwOC8wMS8xNSAwODo1MTo1MyBqdGhhbSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbDsKLQotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lMjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5CYXNlbGluZTI8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5CYXNlbGluZTJJbXBsI2dldE51bWJlciA8ZW0+TnVtYmVyPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuQmFzZWxpbmUySW1wbCNnZXRXb3JrIDxlbT5Xb3JrPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuQmFzZWxpbmUySW1wbCNnZXRDb3N0IDxlbT5Db3N0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuQmFzZWxpbmUySW1wbCNnZXRCQ1dTIDxlbT5CQ1dTPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuQmFzZWxpbmUySW1wbCNnZXRCQ1dQIDxlbT5CQ1dQPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQmFzZWxpbmUySW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgQmFzZWxpbmUyIHsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TnVtYmVyKCkgPGVtPk51bWJlcjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TnVtYmVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0ludGVnZXIgTlVNQkVSX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE51bWJlcigpIDxlbT5OdW1iZXI8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE51bWJlcigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0ludGVnZXIgbnVtYmVyID0gTlVNQkVSX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFdvcmsoKSA8ZW0+V29yazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0V29yaygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBPYmplY3QgV09SS19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRXb3JrKCkgPGVtPldvcms8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFdvcmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3Qgd29yayA9IFdPUktfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q29zdCgpIDxlbT5Db3N0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDb3N0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGZsb2F0IENPU1RfRURFRkFVTFQgPSAwLjBGOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q29zdCgpIDxlbT5Db3N0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDb3N0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgZmxvYXQgY29zdCA9IENPU1RfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIENvc3QgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGNvc3RFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QkNXUygpIDxlbT5CQ1dTPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRCQ1dTKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGZsb2F0IEJDV1NfRURFRkFVTFQgPSAwLjBGOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QkNXUygpIDxlbT5CQ1dTPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRCQ1dTKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgZmxvYXQgYkNXUyA9IEJDV1NfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIEJDV1MgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGJDV1NFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QkNXUCgpIDxlbT5CQ1dQPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRCQ1dQKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGZsb2F0IEJDV1BfRURFRkFVTFQgPSAwLjBGOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QkNXUCgpIDxlbT5CQ1dQPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRCQ1dQKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgZmxvYXQgYkNXUCA9IEJDV1BfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIEJDV1AgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGJDV1BFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmFzZWxpbmUySW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldEJhc2VsaW5lMigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGdldE51bWJlcigpIHsKLQkJcmV0dXJuIG51bWJlcjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXROdW1iZXIoQmlnSW50ZWdlciBuZXdOdW1iZXIpIHsKLQkJQmlnSW50ZWdlciBvbGROdW1iZXIgPSBudW1iZXI7Ci0JCW51bWJlciA9IG5ld051bWJlcjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORTJfX05VTUJFUiwgb2xkTnVtYmVyLCBudW1iZXIpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFdvcmsoKSB7Ci0JCXJldHVybiB3b3JrOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFdvcmsoT2JqZWN0IG5ld1dvcmspIHsKLQkJT2JqZWN0IG9sZFdvcmsgPSB3b3JrOwotCQl3b3JrID0gbmV3V29yazsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORTJfX1dPUkssIG9sZFdvcmssIHdvcmspKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgZmxvYXQgZ2V0Q29zdCgpIHsKLQkJcmV0dXJuIGNvc3Q7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29zdChmbG9hdCBuZXdDb3N0KSB7Ci0JCWZsb2F0IG9sZENvc3QgPSBjb3N0OwotCQljb3N0ID0gbmV3Q29zdDsKLQkJYm9vbGVhbiBvbGRDb3N0RVNldCA9IGNvc3RFU2V0OwotCQljb3N0RVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkUyX19DT1NULCBvbGRDb3N0LCBjb3N0LCAhb2xkQ29zdEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldENvc3QoKSB7Ci0JCWZsb2F0IG9sZENvc3QgPSBjb3N0OwotCQlib29sZWFuIG9sZENvc3RFU2V0ID0gY29zdEVTZXQ7Ci0JCWNvc3QgPSBDT1NUX0VERUZBVUxUOwotCQljb3N0RVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkUyX19DT1NULCBvbGRDb3N0LCBDT1NUX0VERUZBVUxULCBvbGRDb3N0RVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0Q29zdCgpIHsKLQkJcmV0dXJuIGNvc3RFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBmbG9hdCBnZXRCQ1dTKCkgewotCQlyZXR1cm4gYkNXUzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRCQ1dTKGZsb2F0IG5ld0JDV1MpIHsKLQkJZmxvYXQgb2xkQkNXUyA9IGJDV1M7Ci0JCWJDV1MgPSBuZXdCQ1dTOwotCQlib29sZWFuIG9sZEJDV1NFU2V0ID0gYkNXU0VTZXQ7Ci0JCWJDV1NFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORTJfX0JDV1MsIG9sZEJDV1MsIGJDV1MsICFvbGRCQ1dTRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0QkNXUygpIHsKLQkJZmxvYXQgb2xkQkNXUyA9IGJDV1M7Ci0JCWJvb2xlYW4gb2xkQkNXU0VTZXQgPSBiQ1dTRVNldDsKLQkJYkNXUyA9IEJDV1NfRURFRkFVTFQ7Ci0JCWJDV1NFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORTJfX0JDV1MsIG9sZEJDV1MsIEJDV1NfRURFRkFVTFQsIG9sZEJDV1NFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRCQ1dTKCkgewotCQlyZXR1cm4gYkNXU0VTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGZsb2F0IGdldEJDV1AoKSB7Ci0JCXJldHVybiBiQ1dQOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEJDV1AoZmxvYXQgbmV3QkNXUCkgewotCQlmbG9hdCBvbGRCQ1dQID0gYkNXUDsKLQkJYkNXUCA9IG5ld0JDV1A7Ci0JCWJvb2xlYW4gb2xkQkNXUEVTZXQgPSBiQ1dQRVNldDsKLQkJYkNXUEVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FMl9fQkNXUCwgb2xkQkNXUCwgYkNXUCwgIW9sZEJDV1BFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRCQ1dQKCkgewotCQlmbG9hdCBvbGRCQ1dQID0gYkNXUDsKLQkJYm9vbGVhbiBvbGRCQ1dQRVNldCA9IGJDV1BFU2V0OwotCQliQ1dQID0gQkNXUF9FREVGQVVMVDsKLQkJYkNXUEVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FMl9fQkNXUCwgb2xkQkNXUCwgQkNXUF9FREVGQVVMVCwgb2xkQkNXUEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldEJDV1AoKSB7Ci0JCXJldHVybiBiQ1dQRVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkUyX19OVU1CRVI6Ci0JCQkJcmV0dXJuIGdldE51bWJlcigpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FMl9fV09SSzoKLQkJCQlyZXR1cm4gZ2V0V29yaygpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FMl9fQ09TVDoKLQkJCQlyZXR1cm4gbmV3IEZsb2F0KGdldENvc3QoKSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkUyX19CQ1dTOgotCQkJCXJldHVybiBuZXcgRmxvYXQoZ2V0QkNXUygpKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORTJfX0JDV1A6Ci0JCQkJcmV0dXJuIG5ldyBGbG9hdChnZXRCQ1dQKCkpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORTJfX05VTUJFUjoKLQkJCQlzZXROdW1iZXIoKEJpZ0ludGVnZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORTJfX1dPUks6Ci0JCQkJc2V0V29yaygoT2JqZWN0KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkUyX19DT1NUOgotCQkJCXNldENvc3QoKChGbG9hdCluZXdWYWx1ZSkuZmxvYXRWYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkUyX19CQ1dTOgotCQkJCXNldEJDV1MoKChGbG9hdCluZXdWYWx1ZSkuZmxvYXRWYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkUyX19CQ1dQOgotCQkJCXNldEJDV1AoKChGbG9hdCluZXdWYWx1ZSkuZmxvYXRWYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FMl9fTlVNQkVSOgotCQkJCXNldE51bWJlcihOVU1CRVJfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORTJfX1dPUks6Ci0JCQkJc2V0V29yayhXT1JLX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkUyX19DT1NUOgotCQkJCXVuc2V0Q29zdCgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORTJfX0JDV1M6Ci0JCQkJdW5zZXRCQ1dTKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FMl9fQkNXUDoKLQkJCQl1bnNldEJDV1AoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORTJfX05VTUJFUjoKLQkJCQlyZXR1cm4gTlVNQkVSX0VERUZBVUxUID09IG51bGwgPyBudW1iZXIgIT0gbnVsbCA6ICFOVU1CRVJfRURFRkFVTFQuZXF1YWxzKG51bWJlcik7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkUyX19XT1JLOgotCQkJCXJldHVybiBXT1JLX0VERUZBVUxUID09IG51bGwgPyB3b3JrICE9IG51bGwgOiAhV09SS19FREVGQVVMVC5lcXVhbHMod29yayk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkUyX19DT1NUOgotCQkJCXJldHVybiBpc1NldENvc3QoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORTJfX0JDV1M6Ci0JCQkJcmV0dXJuIGlzU2V0QkNXUygpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FMl9fQkNXUDoKLQkJCQlyZXR1cm4gaXNTZXRCQ1dQKCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChudW1iZXI6ICIpOwotCQlyZXN1bHQuYXBwZW5kKG51bWJlcik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgd29yazogIik7Ci0JCXJlc3VsdC5hcHBlbmQod29yayk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgY29zdDogIik7Ci0JCWlmIChjb3N0RVNldCkgcmVzdWx0LmFwcGVuZChjb3N0KTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgYkNXUzogIik7Ci0JCWlmIChiQ1dTRVNldCkgcmVzdWx0LmFwcGVuZChiQ1dTKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgYkNXUDogIik7Ci0JCWlmIChiQ1dQRVNldCkgcmVzdWx0LmFwcGVuZChiQ1dQKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL0Jhc2VsaW5lMkltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9CYXNlbGluZTNJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvQmFzZWxpbmUzSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NzVjZjQwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9CYXNlbGluZTNJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MTAgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBCYXNlbGluZTNJbXBsLmphdmEsdiAxLjEgMjAwOC8wMS8xNSAwODo1MTo1MyBqdGhhbSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRpbWVwaGFzZWREYXRhVHlwZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkJhc2VsaW5lMzwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkJhc2VsaW5lM0ltcGwjZ2V0VGltZXBoYXNlZERhdGEgPGVtPlRpbWVwaGFzZWQgRGF0YTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkJhc2VsaW5lM0ltcGwjZ2V0TnVtYmVyIDxlbT5OdW1iZXI8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5CYXNlbGluZTNJbXBsI2dldFN0YXJ0IDxlbT5TdGFydDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkJhc2VsaW5lM0ltcGwjZ2V0RmluaXNoIDxlbT5GaW5pc2g8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5CYXNlbGluZTNJbXBsI2dldFdvcmsgPGVtPldvcms8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5CYXNlbGluZTNJbXBsI2dldENvc3QgPGVtPkNvc3Q8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5CYXNlbGluZTNJbXBsI2dldEJDV1MgPGVtPkJDV1M8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5CYXNlbGluZTNJbXBsI2dldEJDV1AgPGVtPkJDV1A8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBCYXNlbGluZTNJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBCYXNlbGluZTMgewotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFRpbWVwaGFzZWREYXRhKCkgPGVtPlRpbWVwaGFzZWQgRGF0YTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUaW1lcGhhc2VkRGF0YSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IHRpbWVwaGFzZWREYXRhID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROdW1iZXIoKSA8ZW0+TnVtYmVyPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROdW1iZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE5VTUJFUl9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROdW1iZXIoKSA8ZW0+TnVtYmVyPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROdW1iZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgbnVtYmVyID0gTlVNQkVSX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFN0YXJ0KCkgPGVtPlN0YXJ0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTdGFydCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RBUlRfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U3RhcnQoKSA8ZW0+U3RhcnQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFN0YXJ0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHN0YXJ0ID0gU1RBUlRfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RmluaXNoKCkgPGVtPkZpbmlzaDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RmluaXNoKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBGSU5JU0hfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RmluaXNoKCkgPGVtPkZpbmlzaDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RmluaXNoKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGZpbmlzaCA9IEZJTklTSF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRXb3JrKCkgPGVtPldvcms8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFdvcmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgT2JqZWN0IFdPUktfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0V29yaygpIDxlbT5Xb3JrPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRXb3JrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IHdvcmsgPSBXT1JLX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENvc3QoKSA8ZW0+Q29zdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q29zdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09TVF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb3N0KCkgPGVtPkNvc3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENvc3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgY29zdCA9IENPU1RfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QkNXUygpIDxlbT5CQ1dTPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRCQ1dTKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGZsb2F0IEJDV1NfRURFRkFVTFQgPSAwLjBGOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QkNXUygpIDxlbT5CQ1dTPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRCQ1dTKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgZmxvYXQgYkNXUyA9IEJDV1NfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIEJDV1MgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGJDV1NFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QkNXUCgpIDxlbT5CQ1dQPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRCQ1dQKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGZsb2F0IEJDV1BfRURFRkFVTFQgPSAwLjBGOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QkNXUCgpIDxlbT5CQ1dQPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRCQ1dQKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgZmxvYXQgYkNXUCA9IEJDV1BfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIEJDV1AgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGJDV1BFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmFzZWxpbmUzSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldEJhc2VsaW5lMygpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRUaW1lcGhhc2VkRGF0YSgpIHsKLQkJaWYgKHRpbWVwaGFzZWREYXRhID09IG51bGwpIHsKLQkJCXRpbWVwaGFzZWREYXRhID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KFRpbWVwaGFzZWREYXRhVHlwZS5jbGFzcywgdGhpcywgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORTNfX1RJTUVQSEFTRURfREFUQSk7Ci0JCX0KLQkJcmV0dXJuIHRpbWVwaGFzZWREYXRhOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TnVtYmVyKCkgewotCQlyZXR1cm4gbnVtYmVyOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE51bWJlcihTdHJpbmcgbmV3TnVtYmVyKSB7Ci0JCVN0cmluZyBvbGROdW1iZXIgPSBudW1iZXI7Ci0JCW51bWJlciA9IG5ld051bWJlcjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORTNfX05VTUJFUiwgb2xkTnVtYmVyLCBudW1iZXIpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFN0YXJ0KCkgewotCQlyZXR1cm4gc3RhcnQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0U3RhcnQoU3RyaW5nIG5ld1N0YXJ0KSB7Ci0JCVN0cmluZyBvbGRTdGFydCA9IHN0YXJ0OwotCQlzdGFydCA9IG5ld1N0YXJ0OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FM19fU1RBUlQsIG9sZFN0YXJ0LCBzdGFydCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RmluaXNoKCkgewotCQlyZXR1cm4gZmluaXNoOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZpbmlzaChTdHJpbmcgbmV3RmluaXNoKSB7Ci0JCVN0cmluZyBvbGRGaW5pc2ggPSBmaW5pc2g7Ci0JCWZpbmlzaCA9IG5ld0ZpbmlzaDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORTNfX0ZJTklTSCwgb2xkRmluaXNoLCBmaW5pc2gpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFdvcmsoKSB7Ci0JCXJldHVybiB3b3JrOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFdvcmsoT2JqZWN0IG5ld1dvcmspIHsKLQkJT2JqZWN0IG9sZFdvcmsgPSB3b3JrOwotCQl3b3JrID0gbmV3V29yazsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORTNfX1dPUkssIG9sZFdvcmssIHdvcmspKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENvc3QoKSB7Ci0JCXJldHVybiBjb3N0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvc3QoU3RyaW5nIG5ld0Nvc3QpIHsKLQkJU3RyaW5nIG9sZENvc3QgPSBjb3N0OwotCQljb3N0ID0gbmV3Q29zdDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORTNfX0NPU1QsIG9sZENvc3QsIGNvc3QpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgZmxvYXQgZ2V0QkNXUygpIHsKLQkJcmV0dXJuIGJDV1M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QkNXUyhmbG9hdCBuZXdCQ1dTKSB7Ci0JCWZsb2F0IG9sZEJDV1MgPSBiQ1dTOwotCQliQ1dTID0gbmV3QkNXUzsKLQkJYm9vbGVhbiBvbGRCQ1dTRVNldCA9IGJDV1NFU2V0OwotCQliQ1dTRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkUzX19CQ1dTLCBvbGRCQ1dTLCBiQ1dTLCAhb2xkQkNXU0VTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldEJDV1MoKSB7Ci0JCWZsb2F0IG9sZEJDV1MgPSBiQ1dTOwotCQlib29sZWFuIG9sZEJDV1NFU2V0ID0gYkNXU0VTZXQ7Ci0JCWJDV1MgPSBCQ1dTX0VERUZBVUxUOwotCQliQ1dTRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkUzX19CQ1dTLCBvbGRCQ1dTLCBCQ1dTX0VERUZBVUxULCBvbGRCQ1dTRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0QkNXUygpIHsKLQkJcmV0dXJuIGJDV1NFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBmbG9hdCBnZXRCQ1dQKCkgewotCQlyZXR1cm4gYkNXUDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRCQ1dQKGZsb2F0IG5ld0JDV1ApIHsKLQkJZmxvYXQgb2xkQkNXUCA9IGJDV1A7Ci0JCWJDV1AgPSBuZXdCQ1dQOwotCQlib29sZWFuIG9sZEJDV1BFU2V0ID0gYkNXUEVTZXQ7Ci0JCWJDV1BFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORTNfX0JDV1AsIG9sZEJDV1AsIGJDV1AsICFvbGRCQ1dQRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0QkNXUCgpIHsKLQkJZmxvYXQgb2xkQkNXUCA9IGJDV1A7Ci0JCWJvb2xlYW4gb2xkQkNXUEVTZXQgPSBiQ1dQRVNldDsKLQkJYkNXUCA9IEJDV1BfRURFRkFVTFQ7Ci0JCWJDV1BFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORTNfX0JDV1AsIG9sZEJDV1AsIEJDV1BfRURFRkFVTFQsIG9sZEJDV1BFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRCQ1dQKCkgewotCQlyZXR1cm4gYkNXUEVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FM19fVElNRVBIQVNFRF9EQVRBOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldFRpbWVwaGFzZWREYXRhKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORTNfX1RJTUVQSEFTRURfREFUQToKLQkJCQlyZXR1cm4gZ2V0VGltZXBoYXNlZERhdGEoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORTNfX05VTUJFUjoKLQkJCQlyZXR1cm4gZ2V0TnVtYmVyKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkUzX19TVEFSVDoKLQkJCQlyZXR1cm4gZ2V0U3RhcnQoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORTNfX0ZJTklTSDoKLQkJCQlyZXR1cm4gZ2V0RmluaXNoKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkUzX19XT1JLOgotCQkJCXJldHVybiBnZXRXb3JrKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkUzX19DT1NUOgotCQkJCXJldHVybiBnZXRDb3N0KCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkUzX19CQ1dTOgotCQkJCXJldHVybiBuZXcgRmxvYXQoZ2V0QkNXUygpKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORTNfX0JDV1A6Ci0JCQkJcmV0dXJuIG5ldyBGbG9hdChnZXRCQ1dQKCkpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORTNfX1RJTUVQSEFTRURfREFUQToKLQkJCQlnZXRUaW1lcGhhc2VkRGF0YSgpLmNsZWFyKCk7Ci0JCQkJZ2V0VGltZXBoYXNlZERhdGEoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORTNfX05VTUJFUjoKLQkJCQlzZXROdW1iZXIoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FM19fU1RBUlQ6Ci0JCQkJc2V0U3RhcnQoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FM19fRklOSVNIOgotCQkJCXNldEZpbmlzaCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkUzX19XT1JLOgotCQkJCXNldFdvcmsoKE9iamVjdCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FM19fQ09TVDoKLQkJCQlzZXRDb3N0KChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORTNfX0JDV1M6Ci0JCQkJc2V0QkNXUygoKEZsb2F0KW5ld1ZhbHVlKS5mbG9hdFZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORTNfX0JDV1A6Ci0JCQkJc2V0QkNXUCgoKEZsb2F0KW5ld1ZhbHVlKS5mbG9hdFZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkUzX19USU1FUEhBU0VEX0RBVEE6Ci0JCQkJZ2V0VGltZXBoYXNlZERhdGEoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORTNfX05VTUJFUjoKLQkJCQlzZXROdW1iZXIoTlVNQkVSX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkUzX19TVEFSVDoKLQkJCQlzZXRTdGFydChTVEFSVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FM19fRklOSVNIOgotCQkJCXNldEZpbmlzaChGSU5JU0hfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORTNfX1dPUks6Ci0JCQkJc2V0V29yayhXT1JLX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkUzX19DT1NUOgotCQkJCXNldENvc3QoQ09TVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FM19fQkNXUzoKLQkJCQl1bnNldEJDV1MoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkUzX19CQ1dQOgotCQkJCXVuc2V0QkNXUCgpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FM19fVElNRVBIQVNFRF9EQVRBOgotCQkJCXJldHVybiB0aW1lcGhhc2VkRGF0YSAhPSBudWxsICYmICF0aW1lcGhhc2VkRGF0YS5pc0VtcHR5KCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkUzX19OVU1CRVI6Ci0JCQkJcmV0dXJuIE5VTUJFUl9FREVGQVVMVCA9PSBudWxsID8gbnVtYmVyICE9IG51bGwgOiAhTlVNQkVSX0VERUZBVUxULmVxdWFscyhudW1iZXIpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FM19fU1RBUlQ6Ci0JCQkJcmV0dXJuIFNUQVJUX0VERUZBVUxUID09IG51bGwgPyBzdGFydCAhPSBudWxsIDogIVNUQVJUX0VERUZBVUxULmVxdWFscyhzdGFydCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkUzX19GSU5JU0g6Ci0JCQkJcmV0dXJuIEZJTklTSF9FREVGQVVMVCA9PSBudWxsID8gZmluaXNoICE9IG51bGwgOiAhRklOSVNIX0VERUZBVUxULmVxdWFscyhmaW5pc2gpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FM19fV09SSzoKLQkJCQlyZXR1cm4gV09SS19FREVGQVVMVCA9PSBudWxsID8gd29yayAhPSBudWxsIDogIVdPUktfRURFRkFVTFQuZXF1YWxzKHdvcmspOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FM19fQ09TVDoKLQkJCQlyZXR1cm4gQ09TVF9FREVGQVVMVCA9PSBudWxsID8gY29zdCAhPSBudWxsIDogIUNPU1RfRURFRkFVTFQuZXF1YWxzKGNvc3QpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FM19fQkNXUzoKLQkJCQlyZXR1cm4gaXNTZXRCQ1dTKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkUzX19CQ1dQOgotCQkJCXJldHVybiBpc1NldEJDV1AoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKG51bWJlcjogIik7Ci0JCXJlc3VsdC5hcHBlbmQobnVtYmVyKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBzdGFydDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoc3RhcnQpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGZpbmlzaDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZmluaXNoKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCB3b3JrOiAiKTsKLQkJcmVzdWx0LmFwcGVuZCh3b3JrKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBjb3N0OiAiKTsKLQkJcmVzdWx0LmFwcGVuZChjb3N0KTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBiQ1dTOiAiKTsKLQkJaWYgKGJDV1NFU2V0KSByZXN1bHQuYXBwZW5kKGJDV1MpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBiQ1dQOiAiKTsKLQkJaWYgKGJDV1BFU2V0KSByZXN1bHQuYXBwZW5kKGJDV1ApOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vQmFzZWxpbmUzSW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL0Jhc2VsaW5lSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL0Jhc2VsaW5lSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNzA3MDU4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9CYXNlbGluZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg5NiArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IEJhc2VsaW5lSW1wbC5qYXZhLHYgMS4xIDIwMDgvMDEvMTUgMDg6NTE6NTMganRoYW0gRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGw7Ci0KLWltcG9ydCBqYXZhLm1hdGguQmlnRGVjaW1hbDsKLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRpbWVwaGFzZWREYXRhVHlwZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkJhc2VsaW5lPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuQmFzZWxpbmVJbXBsI2dldFRpbWVwaGFzZWREYXRhIDxlbT5UaW1lcGhhc2VkIERhdGE8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5CYXNlbGluZUltcGwjZ2V0TnVtYmVyIDxlbT5OdW1iZXI8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5CYXNlbGluZUltcGwjaXNJbnRlcmltIDxlbT5JbnRlcmltPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuQmFzZWxpbmVJbXBsI2dldFN0YXJ0IDxlbT5TdGFydDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkJhc2VsaW5lSW1wbCNnZXRGaW5pc2ggPGVtPkZpbmlzaDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkJhc2VsaW5lSW1wbCNnZXREdXJhdGlvbiA8ZW0+RHVyYXRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5CYXNlbGluZUltcGwjZ2V0RHVyYXRpb25Gb3JtYXQgPGVtPkR1cmF0aW9uIEZvcm1hdDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkJhc2VsaW5lSW1wbCNpc0VzdGltYXRlZER1cmF0aW9uIDxlbT5Fc3RpbWF0ZWQgRHVyYXRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5CYXNlbGluZUltcGwjZ2V0V29yayA8ZW0+V29yazwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkJhc2VsaW5lSW1wbCNnZXRDb3N0IDxlbT5Db3N0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuQmFzZWxpbmVJbXBsI2dldEJDV1MgPGVtPkJDV1M8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5CYXNlbGluZUltcGwjZ2V0QkNXUCA8ZW0+QkNXUDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEJhc2VsaW5lSW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgQmFzZWxpbmUgewotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFRpbWVwaGFzZWREYXRhKCkgPGVtPlRpbWVwaGFzZWQgRGF0YTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUaW1lcGhhc2VkRGF0YSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IHRpbWVwaGFzZWREYXRhID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROdW1iZXIoKSA8ZW0+TnVtYmVyPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROdW1iZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBOVU1CRVJfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TnVtYmVyKCkgPGVtPk51bWJlcjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TnVtYmVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnSW50ZWdlciBudW1iZXIgPSBOVU1CRVJfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNJbnRlcmltKCkgPGVtPkludGVyaW08L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzSW50ZXJpbSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIElOVEVSSU1fRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzSW50ZXJpbSgpIDxlbT5JbnRlcmltPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0ludGVyaW0oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGludGVyaW0gPSBJTlRFUklNX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBJbnRlcmltIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpbnRlcmltRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFN0YXJ0KCkgPGVtPlN0YXJ0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTdGFydCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBPYmplY3QgU1RBUlRfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U3RhcnQoKSA8ZW0+U3RhcnQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFN0YXJ0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IHN0YXJ0ID0gU1RBUlRfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RmluaXNoKCkgPGVtPkZpbmlzaDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RmluaXNoKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIE9iamVjdCBGSU5JU0hfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RmluaXNoKCkgPGVtPkZpbmlzaDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RmluaXNoKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGZpbmlzaCA9IEZJTklTSF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREdXJhdGlvbigpIDxlbT5EdXJhdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RHVyYXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgT2JqZWN0IERVUkFUSU9OX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldER1cmF0aW9uKCkgPGVtPkR1cmF0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREdXJhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBkdXJhdGlvbiA9IERVUkFUSU9OX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldER1cmF0aW9uRm9ybWF0KCkgPGVtPkR1cmF0aW9uIEZvcm1hdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RHVyYXRpb25Gb3JtYXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBEVVJBVElPTl9GT1JNQVRfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RHVyYXRpb25Gb3JtYXQoKSA8ZW0+RHVyYXRpb24gRm9ybWF0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREdXJhdGlvbkZvcm1hdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0ludGVnZXIgZHVyYXRpb25Gb3JtYXQgPSBEVVJBVElPTl9GT1JNQVRfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNFc3RpbWF0ZWREdXJhdGlvbigpIDxlbT5Fc3RpbWF0ZWQgRHVyYXRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzRXN0aW1hdGVkRHVyYXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBFU1RJTUFURURfRFVSQVRJT05fRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzRXN0aW1hdGVkRHVyYXRpb24oKSA8ZW0+RXN0aW1hdGVkIER1cmF0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0VzdGltYXRlZER1cmF0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBlc3RpbWF0ZWREdXJhdGlvbiA9IEVTVElNQVRFRF9EVVJBVElPTl9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgRXN0aW1hdGVkIER1cmF0aW9uIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBlc3RpbWF0ZWREdXJhdGlvbkVTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRXb3JrKCkgPGVtPldvcms8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFdvcmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgT2JqZWN0IFdPUktfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0V29yaygpIDxlbT5Xb3JrPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRXb3JrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IHdvcmsgPSBXT1JLX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENvc3QoKSA8ZW0+Q29zdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q29zdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdEZWNpbWFsIENPU1RfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q29zdCgpIDxlbT5Db3N0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDb3N0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnRGVjaW1hbCBjb3N0ID0gQ09TVF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRCQ1dTKCkgPGVtPkJDV1M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEJDV1MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgZmxvYXQgQkNXU19FREVGQVVMVCA9IDAuMEY7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRCQ1dTKCkgPGVtPkJDV1M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEJDV1MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBmbG9hdCBiQ1dTID0gQkNXU19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgQkNXUyBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gYkNXU0VTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRCQ1dQKCkgPGVtPkJDV1A8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEJDV1AoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgZmxvYXQgQkNXUF9FREVGQVVMVCA9IDAuMEY7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRCQ1dQKCkgPGVtPkJDV1A8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEJDV1AoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBmbG9hdCBiQ1dQID0gQkNXUF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgQkNXUCBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gYkNXUEVTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBCYXNlbGluZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXRCYXNlbGluZSgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRUaW1lcGhhc2VkRGF0YSgpIHsKLQkJaWYgKHRpbWVwaGFzZWREYXRhID09IG51bGwpIHsKLQkJCXRpbWVwaGFzZWREYXRhID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KFRpbWVwaGFzZWREYXRhVHlwZS5jbGFzcywgdGhpcywgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORV9fVElNRVBIQVNFRF9EQVRBKTsKLQkJfQotCQlyZXR1cm4gdGltZXBoYXNlZERhdGE7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0TnVtYmVyKCkgewotCQlyZXR1cm4gbnVtYmVyOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE51bWJlcihCaWdJbnRlZ2VyIG5ld051bWJlcikgewotCQlCaWdJbnRlZ2VyIG9sZE51bWJlciA9IG51bWJlcjsKLQkJbnVtYmVyID0gbmV3TnVtYmVyOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FX19OVU1CRVIsIG9sZE51bWJlciwgbnVtYmVyKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNJbnRlcmltKCkgewotCQlyZXR1cm4gaW50ZXJpbTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJbnRlcmltKGJvb2xlYW4gbmV3SW50ZXJpbSkgewotCQlib29sZWFuIG9sZEludGVyaW0gPSBpbnRlcmltOwotCQlpbnRlcmltID0gbmV3SW50ZXJpbTsKLQkJYm9vbGVhbiBvbGRJbnRlcmltRVNldCA9IGludGVyaW1FU2V0OwotCQlpbnRlcmltRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkVfX0lOVEVSSU0sIG9sZEludGVyaW0sIGludGVyaW0sICFvbGRJbnRlcmltRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0SW50ZXJpbSgpIHsKLQkJYm9vbGVhbiBvbGRJbnRlcmltID0gaW50ZXJpbTsKLQkJYm9vbGVhbiBvbGRJbnRlcmltRVNldCA9IGludGVyaW1FU2V0OwotCQlpbnRlcmltID0gSU5URVJJTV9FREVGQVVMVDsKLQkJaW50ZXJpbUVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FX19JTlRFUklNLCBvbGRJbnRlcmltLCBJTlRFUklNX0VERUZBVUxULCBvbGRJbnRlcmltRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0SW50ZXJpbSgpIHsKLQkJcmV0dXJuIGludGVyaW1FU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0U3RhcnQoKSB7Ci0JCXJldHVybiBzdGFydDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTdGFydChPYmplY3QgbmV3U3RhcnQpIHsKLQkJT2JqZWN0IG9sZFN0YXJ0ID0gc3RhcnQ7Ci0JCXN0YXJ0ID0gbmV3U3RhcnQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkVfX1NUQVJULCBvbGRTdGFydCwgc3RhcnQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEZpbmlzaCgpIHsKLQkJcmV0dXJuIGZpbmlzaDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGaW5pc2goT2JqZWN0IG5ld0ZpbmlzaCkgewotCQlPYmplY3Qgb2xkRmluaXNoID0gZmluaXNoOwotCQlmaW5pc2ggPSBuZXdGaW5pc2g7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkVfX0ZJTklTSCwgb2xkRmluaXNoLCBmaW5pc2gpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldER1cmF0aW9uKCkgewotCQlyZXR1cm4gZHVyYXRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RHVyYXRpb24oT2JqZWN0IG5ld0R1cmF0aW9uKSB7Ci0JCU9iamVjdCBvbGREdXJhdGlvbiA9IGR1cmF0aW9uOwotCQlkdXJhdGlvbiA9IG5ld0R1cmF0aW9uOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FX19EVVJBVElPTiwgb2xkRHVyYXRpb24sIGR1cmF0aW9uKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0RHVyYXRpb25Gb3JtYXQoKSB7Ci0JCXJldHVybiBkdXJhdGlvbkZvcm1hdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREdXJhdGlvbkZvcm1hdChCaWdJbnRlZ2VyIG5ld0R1cmF0aW9uRm9ybWF0KSB7Ci0JCUJpZ0ludGVnZXIgb2xkRHVyYXRpb25Gb3JtYXQgPSBkdXJhdGlvbkZvcm1hdDsKLQkJZHVyYXRpb25Gb3JtYXQgPSBuZXdEdXJhdGlvbkZvcm1hdDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORV9fRFVSQVRJT05fRk9STUFULCBvbGREdXJhdGlvbkZvcm1hdCwgZHVyYXRpb25Gb3JtYXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0VzdGltYXRlZER1cmF0aW9uKCkgewotCQlyZXR1cm4gZXN0aW1hdGVkRHVyYXRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RXN0aW1hdGVkRHVyYXRpb24oYm9vbGVhbiBuZXdFc3RpbWF0ZWREdXJhdGlvbikgewotCQlib29sZWFuIG9sZEVzdGltYXRlZER1cmF0aW9uID0gZXN0aW1hdGVkRHVyYXRpb247Ci0JCWVzdGltYXRlZER1cmF0aW9uID0gbmV3RXN0aW1hdGVkRHVyYXRpb247Ci0JCWJvb2xlYW4gb2xkRXN0aW1hdGVkRHVyYXRpb25FU2V0ID0gZXN0aW1hdGVkRHVyYXRpb25FU2V0OwotCQllc3RpbWF0ZWREdXJhdGlvbkVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FX19FU1RJTUFURURfRFVSQVRJT04sIG9sZEVzdGltYXRlZER1cmF0aW9uLCBlc3RpbWF0ZWREdXJhdGlvbiwgIW9sZEVzdGltYXRlZER1cmF0aW9uRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0RXN0aW1hdGVkRHVyYXRpb24oKSB7Ci0JCWJvb2xlYW4gb2xkRXN0aW1hdGVkRHVyYXRpb24gPSBlc3RpbWF0ZWREdXJhdGlvbjsKLQkJYm9vbGVhbiBvbGRFc3RpbWF0ZWREdXJhdGlvbkVTZXQgPSBlc3RpbWF0ZWREdXJhdGlvbkVTZXQ7Ci0JCWVzdGltYXRlZER1cmF0aW9uID0gRVNUSU1BVEVEX0RVUkFUSU9OX0VERUZBVUxUOwotCQllc3RpbWF0ZWREdXJhdGlvbkVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FX19FU1RJTUFURURfRFVSQVRJT04sIG9sZEVzdGltYXRlZER1cmF0aW9uLCBFU1RJTUFURURfRFVSQVRJT05fRURFRkFVTFQsIG9sZEVzdGltYXRlZER1cmF0aW9uRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0RXN0aW1hdGVkRHVyYXRpb24oKSB7Ci0JCXJldHVybiBlc3RpbWF0ZWREdXJhdGlvbkVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRXb3JrKCkgewotCQlyZXR1cm4gd29yazsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRXb3JrKE9iamVjdCBuZXdXb3JrKSB7Ci0JCU9iamVjdCBvbGRXb3JrID0gd29yazsKLQkJd29yayA9IG5ld1dvcms7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkVfX1dPUkssIG9sZFdvcmssIHdvcmspKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnRGVjaW1hbCBnZXRDb3N0KCkgewotCQlyZXR1cm4gY29zdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb3N0KEJpZ0RlY2ltYWwgbmV3Q29zdCkgewotCQlCaWdEZWNpbWFsIG9sZENvc3QgPSBjb3N0OwotCQljb3N0ID0gbmV3Q29zdDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORV9fQ09TVCwgb2xkQ29zdCwgY29zdCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBmbG9hdCBnZXRCQ1dTKCkgewotCQlyZXR1cm4gYkNXUzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRCQ1dTKGZsb2F0IG5ld0JDV1MpIHsKLQkJZmxvYXQgb2xkQkNXUyA9IGJDV1M7Ci0JCWJDV1MgPSBuZXdCQ1dTOwotCQlib29sZWFuIG9sZEJDV1NFU2V0ID0gYkNXU0VTZXQ7Ci0JCWJDV1NFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORV9fQkNXUywgb2xkQkNXUywgYkNXUywgIW9sZEJDV1NFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRCQ1dTKCkgewotCQlmbG9hdCBvbGRCQ1dTID0gYkNXUzsKLQkJYm9vbGVhbiBvbGRCQ1dTRVNldCA9IGJDV1NFU2V0OwotCQliQ1dTID0gQkNXU19FREVGQVVMVDsKLQkJYkNXU0VTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FX19CQ1dTLCBvbGRCQ1dTLCBCQ1dTX0VERUZBVUxULCBvbGRCQ1dTRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0QkNXUygpIHsKLQkJcmV0dXJuIGJDV1NFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBmbG9hdCBnZXRCQ1dQKCkgewotCQlyZXR1cm4gYkNXUDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRCQ1dQKGZsb2F0IG5ld0JDV1ApIHsKLQkJZmxvYXQgb2xkQkNXUCA9IGJDV1A7Ci0JCWJDV1AgPSBuZXdCQ1dQOwotCQlib29sZWFuIG9sZEJDV1BFU2V0ID0gYkNXUEVTZXQ7Ci0JCWJDV1BFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORV9fQkNXUCwgb2xkQkNXUCwgYkNXUCwgIW9sZEJDV1BFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRCQ1dQKCkgewotCQlmbG9hdCBvbGRCQ1dQID0gYkNXUDsKLQkJYm9vbGVhbiBvbGRCQ1dQRVNldCA9IGJDV1BFU2V0OwotCQliQ1dQID0gQkNXUF9FREVGQVVMVDsKLQkJYkNXUEVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FX19CQ1dQLCBvbGRCQ1dQLCBCQ1dQX0VERUZBVUxULCBvbGRCQ1dQRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0QkNXUCgpIHsKLQkJcmV0dXJuIGJDV1BFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORV9fVElNRVBIQVNFRF9EQVRBOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldFRpbWVwaGFzZWREYXRhKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORV9fVElNRVBIQVNFRF9EQVRBOgotCQkJCXJldHVybiBnZXRUaW1lcGhhc2VkRGF0YSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FX19OVU1CRVI6Ci0JCQkJcmV0dXJuIGdldE51bWJlcigpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FX19JTlRFUklNOgotCQkJCXJldHVybiBpc0ludGVyaW0oKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkVfX1NUQVJUOgotCQkJCXJldHVybiBnZXRTdGFydCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FX19GSU5JU0g6Ci0JCQkJcmV0dXJuIGdldEZpbmlzaCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FX19EVVJBVElPTjoKLQkJCQlyZXR1cm4gZ2V0RHVyYXRpb24oKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORV9fRFVSQVRJT05fRk9STUFUOgotCQkJCXJldHVybiBnZXREdXJhdGlvbkZvcm1hdCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FX19FU1RJTUFURURfRFVSQVRJT046Ci0JCQkJcmV0dXJuIGlzRXN0aW1hdGVkRHVyYXRpb24oKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkVfX1dPUks6Ci0JCQkJcmV0dXJuIGdldFdvcmsoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORV9fQ09TVDoKLQkJCQlyZXR1cm4gZ2V0Q29zdCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FX19CQ1dTOgotCQkJCXJldHVybiBuZXcgRmxvYXQoZ2V0QkNXUygpKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORV9fQkNXUDoKLQkJCQlyZXR1cm4gbmV3IEZsb2F0KGdldEJDV1AoKSk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FX19USU1FUEhBU0VEX0RBVEE6Ci0JCQkJZ2V0VGltZXBoYXNlZERhdGEoKS5jbGVhcigpOwotCQkJCWdldFRpbWVwaGFzZWREYXRhKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkVfX05VTUJFUjoKLQkJCQlzZXROdW1iZXIoKEJpZ0ludGVnZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORV9fSU5URVJJTToKLQkJCQlzZXRJbnRlcmltKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORV9fU1RBUlQ6Ci0JCQkJc2V0U3RhcnQoKE9iamVjdCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FX19GSU5JU0g6Ci0JCQkJc2V0RmluaXNoKChPYmplY3QpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORV9fRFVSQVRJT046Ci0JCQkJc2V0RHVyYXRpb24oKE9iamVjdCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FX19EVVJBVElPTl9GT1JNQVQ6Ci0JCQkJc2V0RHVyYXRpb25Gb3JtYXQoKEJpZ0ludGVnZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORV9fRVNUSU1BVEVEX0RVUkFUSU9OOgotCQkJCXNldEVzdGltYXRlZER1cmF0aW9uKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORV9fV09SSzoKLQkJCQlzZXRXb3JrKChPYmplY3QpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORV9fQ09TVDoKLQkJCQlzZXRDb3N0KChCaWdEZWNpbWFsKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkVfX0JDV1M6Ci0JCQkJc2V0QkNXUygoKEZsb2F0KW5ld1ZhbHVlKS5mbG9hdFZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORV9fQkNXUDoKLQkJCQlzZXRCQ1dQKCgoRmxvYXQpbmV3VmFsdWUpLmZsb2F0VmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORV9fVElNRVBIQVNFRF9EQVRBOgotCQkJCWdldFRpbWVwaGFzZWREYXRhKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkVfX05VTUJFUjoKLQkJCQlzZXROdW1iZXIoTlVNQkVSX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkVfX0lOVEVSSU06Ci0JCQkJdW5zZXRJbnRlcmltKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FX19TVEFSVDoKLQkJCQlzZXRTdGFydChTVEFSVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FX19GSU5JU0g6Ci0JCQkJc2V0RmluaXNoKEZJTklTSF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FX19EVVJBVElPTjoKLQkJCQlzZXREdXJhdGlvbihEVVJBVElPTl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FX19EVVJBVElPTl9GT1JNQVQ6Ci0JCQkJc2V0RHVyYXRpb25Gb3JtYXQoRFVSQVRJT05fRk9STUFUX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkVfX0VTVElNQVRFRF9EVVJBVElPTjoKLQkJCQl1bnNldEVzdGltYXRlZER1cmF0aW9uKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FX19XT1JLOgotCQkJCXNldFdvcmsoV09SS19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FX19DT1NUOgotCQkJCXNldENvc3QoQ09TVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FX19CQ1dTOgotCQkJCXVuc2V0QkNXUygpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORV9fQkNXUDoKLQkJCQl1bnNldEJDV1AoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORV9fVElNRVBIQVNFRF9EQVRBOgotCQkJCXJldHVybiB0aW1lcGhhc2VkRGF0YSAhPSBudWxsICYmICF0aW1lcGhhc2VkRGF0YS5pc0VtcHR5KCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkVfX05VTUJFUjoKLQkJCQlyZXR1cm4gTlVNQkVSX0VERUZBVUxUID09IG51bGwgPyBudW1iZXIgIT0gbnVsbCA6ICFOVU1CRVJfRURFRkFVTFQuZXF1YWxzKG51bWJlcik7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkVfX0lOVEVSSU06Ci0JCQkJcmV0dXJuIGlzU2V0SW50ZXJpbSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FX19TVEFSVDoKLQkJCQlyZXR1cm4gU1RBUlRfRURFRkFVTFQgPT0gbnVsbCA/IHN0YXJ0ICE9IG51bGwgOiAhU1RBUlRfRURFRkFVTFQuZXF1YWxzKHN0YXJ0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORV9fRklOSVNIOgotCQkJCXJldHVybiBGSU5JU0hfRURFRkFVTFQgPT0gbnVsbCA/IGZpbmlzaCAhPSBudWxsIDogIUZJTklTSF9FREVGQVVMVC5lcXVhbHMoZmluaXNoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORV9fRFVSQVRJT046Ci0JCQkJcmV0dXJuIERVUkFUSU9OX0VERUZBVUxUID09IG51bGwgPyBkdXJhdGlvbiAhPSBudWxsIDogIURVUkFUSU9OX0VERUZBVUxULmVxdWFscyhkdXJhdGlvbik7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkVfX0RVUkFUSU9OX0ZPUk1BVDoKLQkJCQlyZXR1cm4gRFVSQVRJT05fRk9STUFUX0VERUZBVUxUID09IG51bGwgPyBkdXJhdGlvbkZvcm1hdCAhPSBudWxsIDogIURVUkFUSU9OX0ZPUk1BVF9FREVGQVVMVC5lcXVhbHMoZHVyYXRpb25Gb3JtYXQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FX19FU1RJTUFURURfRFVSQVRJT046Ci0JCQkJcmV0dXJuIGlzU2V0RXN0aW1hdGVkRHVyYXRpb24oKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORV9fV09SSzoKLQkJCQlyZXR1cm4gV09SS19FREVGQVVMVCA9PSBudWxsID8gd29yayAhPSBudWxsIDogIVdPUktfRURFRkFVTFQuZXF1YWxzKHdvcmspOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FX19DT1NUOgotCQkJCXJldHVybiBDT1NUX0VERUZBVUxUID09IG51bGwgPyBjb3N0ICE9IG51bGwgOiAhQ09TVF9FREVGQVVMVC5lcXVhbHMoY29zdCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkVfX0JDV1M6Ci0JCQkJcmV0dXJuIGlzU2V0QkNXUygpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FX19CQ1dQOgotCQkJCXJldHVybiBpc1NldEJDV1AoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKG51bWJlcjogIik7Ci0JCXJlc3VsdC5hcHBlbmQobnVtYmVyKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBpbnRlcmltOiAiKTsKLQkJaWYgKGludGVyaW1FU2V0KSByZXN1bHQuYXBwZW5kKGludGVyaW0pOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBzdGFydDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoc3RhcnQpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGZpbmlzaDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZmluaXNoKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBkdXJhdGlvbjogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZHVyYXRpb24pOwotCQlyZXN1bHQuYXBwZW5kKCIsIGR1cmF0aW9uRm9ybWF0OiAiKTsKLQkJcmVzdWx0LmFwcGVuZChkdXJhdGlvbkZvcm1hdCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZXN0aW1hdGVkRHVyYXRpb246ICIpOwotCQlpZiAoZXN0aW1hdGVkRHVyYXRpb25FU2V0KSByZXN1bHQuYXBwZW5kKGVzdGltYXRlZER1cmF0aW9uKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgd29yazogIik7Ci0JCXJlc3VsdC5hcHBlbmQod29yayk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgY29zdDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoY29zdCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgYkNXUzogIik7Ci0JCWlmIChiQ1dTRVNldCkgcmVzdWx0LmFwcGVuZChiQ1dTKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgYkNXUDogIik7Ci0JCWlmIChiQ1dQRVNldCkgcmVzdWx0LmFwcGVuZChiQ1dQKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL0Jhc2VsaW5lSW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL0NhbGVuZGFySW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL0NhbGVuZGFySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1N2QwOGQ0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9DYWxlbmRhckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0MSArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IENhbGVuZGFySW1wbC5qYXZhLHYgMS4xIDIwMDgvMDEvMTUgMDg6NTE6NTMganRoYW0gRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGw7Ci0KLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkNhbGVuZGFyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldlZWtEYXlzOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Q2FsZW5kYXI8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5DYWxlbmRhckltcGwjZ2V0VUlEIDxlbT5VSUQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5DYWxlbmRhckltcGwjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkNhbGVuZGFySW1wbCNpc0lzQmFzZUNhbGVuZGFyIDxlbT5JcyBCYXNlIENhbGVuZGFyPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuQ2FsZW5kYXJJbXBsI2dldEJhc2VDYWxlbmRhclVJRCA8ZW0+QmFzZSBDYWxlbmRhciBVSUQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5DYWxlbmRhckltcGwjZ2V0V2Vla0RheXMgPGVtPldlZWsgRGF5czwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIENhbGVuZGFySW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgQ2FsZW5kYXIgewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRVSUQoKSA8ZW0+VUlEPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRVSUQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBVSURfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VUlEKCkgPGVtPlVJRDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VUlEKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnSW50ZWdlciB1SUQgPSBVSURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZSgpIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWUoKSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBuYW1lID0gTkFNRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0lzQmFzZUNhbGVuZGFyKCkgPGVtPklzIEJhc2UgQ2FsZW5kYXI8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzSXNCYXNlQ2FsZW5kYXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBJU19CQVNFX0NBTEVOREFSX0VERUZBVUxUID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0lzQmFzZUNhbGVuZGFyKCkgPGVtPklzIEJhc2UgQ2FsZW5kYXI8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzSXNCYXNlQ2FsZW5kYXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzQmFzZUNhbGVuZGFyID0gSVNfQkFTRV9DQUxFTkRBUl9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgSXMgQmFzZSBDYWxlbmRhciBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNCYXNlQ2FsZW5kYXJFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QmFzZUNhbGVuZGFyVUlEKCkgPGVtPkJhc2UgQ2FsZW5kYXIgVUlEPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRCYXNlQ2FsZW5kYXJVSUQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBCQVNFX0NBTEVOREFSX1VJRF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRCYXNlQ2FsZW5kYXJVSUQoKSA8ZW0+QmFzZSBDYWxlbmRhciBVSUQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEJhc2VDYWxlbmRhclVJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0ludGVnZXIgYmFzZUNhbGVuZGFyVUlEID0gQkFTRV9DQUxFTkRBUl9VSURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRXZWVrRGF5cygpIDxlbT5XZWVrIERheXM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFdlZWtEYXlzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgV2Vla0RheXMgd2Vla0RheXMgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENhbGVuZGFySW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldENhbGVuZGFyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0VUlEKCkgewotCQlyZXR1cm4gdUlEOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFVJRChCaWdJbnRlZ2VyIG5ld1VJRCkgewotCQlCaWdJbnRlZ2VyIG9sZFVJRCA9IHVJRDsKLQkJdUlEID0gbmV3VUlEOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkNBTEVOREFSX19VSUQsIG9sZFVJRCwgdUlEKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuZXdOYW1lKSB7Ci0JCVN0cmluZyBvbGROYW1lID0gbmFtZTsKLQkJbmFtZSA9IG5ld05hbWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuQ0FMRU5EQVJfX05BTUUsIG9sZE5hbWUsIG5hbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0lzQmFzZUNhbGVuZGFyKCkgewotCQlyZXR1cm4gaXNCYXNlQ2FsZW5kYXI7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SXNCYXNlQ2FsZW5kYXIoYm9vbGVhbiBuZXdJc0Jhc2VDYWxlbmRhcikgewotCQlib29sZWFuIG9sZElzQmFzZUNhbGVuZGFyID0gaXNCYXNlQ2FsZW5kYXI7Ci0JCWlzQmFzZUNhbGVuZGFyID0gbmV3SXNCYXNlQ2FsZW5kYXI7Ci0JCWJvb2xlYW4gb2xkSXNCYXNlQ2FsZW5kYXJFU2V0ID0gaXNCYXNlQ2FsZW5kYXJFU2V0OwotCQlpc0Jhc2VDYWxlbmRhckVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkNBTEVOREFSX19JU19CQVNFX0NBTEVOREFSLCBvbGRJc0Jhc2VDYWxlbmRhciwgaXNCYXNlQ2FsZW5kYXIsICFvbGRJc0Jhc2VDYWxlbmRhckVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldElzQmFzZUNhbGVuZGFyKCkgewotCQlib29sZWFuIG9sZElzQmFzZUNhbGVuZGFyID0gaXNCYXNlQ2FsZW5kYXI7Ci0JCWJvb2xlYW4gb2xkSXNCYXNlQ2FsZW5kYXJFU2V0ID0gaXNCYXNlQ2FsZW5kYXJFU2V0OwotCQlpc0Jhc2VDYWxlbmRhciA9IElTX0JBU0VfQ0FMRU5EQVJfRURFRkFVTFQ7Ci0JCWlzQmFzZUNhbGVuZGFyRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIE1zcHJvamVjdFBhY2thZ2UuQ0FMRU5EQVJfX0lTX0JBU0VfQ0FMRU5EQVIsIG9sZElzQmFzZUNhbGVuZGFyLCBJU19CQVNFX0NBTEVOREFSX0VERUZBVUxULCBvbGRJc0Jhc2VDYWxlbmRhckVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldElzQmFzZUNhbGVuZGFyKCkgewotCQlyZXR1cm4gaXNCYXNlQ2FsZW5kYXJFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGdldEJhc2VDYWxlbmRhclVJRCgpIHsKLQkJcmV0dXJuIGJhc2VDYWxlbmRhclVJRDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRCYXNlQ2FsZW5kYXJVSUQoQmlnSW50ZWdlciBuZXdCYXNlQ2FsZW5kYXJVSUQpIHsKLQkJQmlnSW50ZWdlciBvbGRCYXNlQ2FsZW5kYXJVSUQgPSBiYXNlQ2FsZW5kYXJVSUQ7Ci0JCWJhc2VDYWxlbmRhclVJRCA9IG5ld0Jhc2VDYWxlbmRhclVJRDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5DQUxFTkRBUl9fQkFTRV9DQUxFTkRBUl9VSUQsIG9sZEJhc2VDYWxlbmRhclVJRCwgYmFzZUNhbGVuZGFyVUlEKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFdlZWtEYXlzIGdldFdlZWtEYXlzKCkgewotCQlyZXR1cm4gd2Vla0RheXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0V2Vla0RheXMoV2Vla0RheXMgbmV3V2Vla0RheXMsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJV2Vla0RheXMgb2xkV2Vla0RheXMgPSB3ZWVrRGF5czsKLQkJd2Vla0RheXMgPSBuZXdXZWVrRGF5czsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5DQUxFTkRBUl9fV0VFS19EQVlTLCBvbGRXZWVrRGF5cywgbmV3V2Vla0RheXMpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFdlZWtEYXlzKFdlZWtEYXlzIG5ld1dlZWtEYXlzKSB7Ci0JCWlmIChuZXdXZWVrRGF5cyAhPSB3ZWVrRGF5cykgewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAod2Vla0RheXMgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3Qpd2Vla0RheXMpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBNc3Byb2plY3RQYWNrYWdlLkNBTEVOREFSX19XRUVLX0RBWVMsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld1dlZWtEYXlzICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld1dlZWtEYXlzKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gTXNwcm9qZWN0UGFja2FnZS5DQUxFTkRBUl9fV0VFS19EQVlTLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldFdlZWtEYXlzKG5ld1dlZWtEYXlzLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuQ0FMRU5EQVJfX1dFRUtfREFZUywgbmV3V2Vla0RheXMsIG5ld1dlZWtEYXlzKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkNBTEVOREFSX19XRUVLX0RBWVM6Ci0JCQkJCXJldHVybiBiYXNpY1NldFdlZWtEYXlzKG51bGwsIG1zZ3MpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkNBTEVOREFSX19VSUQ6Ci0JCQkJcmV0dXJuIGdldFVJRCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkNBTEVOREFSX19OQU1FOgotCQkJCXJldHVybiBnZXROYW1lKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQ0FMRU5EQVJfX0lTX0JBU0VfQ0FMRU5EQVI6Ci0JCQkJcmV0dXJuIGlzSXNCYXNlQ2FsZW5kYXIoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQ0FMRU5EQVJfX0JBU0VfQ0FMRU5EQVJfVUlEOgotCQkJCXJldHVybiBnZXRCYXNlQ2FsZW5kYXJVSUQoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5DQUxFTkRBUl9fV0VFS19EQVlTOgotCQkJCXJldHVybiBnZXRXZWVrRGF5cygpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5DQUxFTkRBUl9fVUlEOgotCQkJCXNldFVJRCgoQmlnSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkNBTEVOREFSX19OQU1FOgotCQkJCXNldE5hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkNBTEVOREFSX19JU19CQVNFX0NBTEVOREFSOgotCQkJCXNldElzQmFzZUNhbGVuZGFyKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5DQUxFTkRBUl9fQkFTRV9DQUxFTkRBUl9VSUQ6Ci0JCQkJc2V0QmFzZUNhbGVuZGFyVUlEKChCaWdJbnRlZ2VyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQ0FMRU5EQVJfX1dFRUtfREFZUzoKLQkJCQlzZXRXZWVrRGF5cygoV2Vla0RheXMpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQ0FMRU5EQVJfX1VJRDoKLQkJCQlzZXRVSUQoVUlEX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQ0FMRU5EQVJfX05BTUU6Ci0JCQkJc2V0TmFtZShOQU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQ0FMRU5EQVJfX0lTX0JBU0VfQ0FMRU5EQVI6Ci0JCQkJdW5zZXRJc0Jhc2VDYWxlbmRhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5DQUxFTkRBUl9fQkFTRV9DQUxFTkRBUl9VSUQ6Ci0JCQkJc2V0QmFzZUNhbGVuZGFyVUlEKEJBU0VfQ0FMRU5EQVJfVUlEX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQ0FMRU5EQVJfX1dFRUtfREFZUzoKLQkJCQlzZXRXZWVrRGF5cygoV2Vla0RheXMpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQ0FMRU5EQVJfX1VJRDoKLQkJCQlyZXR1cm4gVUlEX0VERUZBVUxUID09IG51bGwgPyB1SUQgIT0gbnVsbCA6ICFVSURfRURFRkFVTFQuZXF1YWxzKHVJRCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQ0FMRU5EQVJfX05BTUU6Ci0JCQkJcmV0dXJuIE5BTUVfRURFRkFVTFQgPT0gbnVsbCA/IG5hbWUgIT0gbnVsbCA6ICFOQU1FX0VERUZBVUxULmVxdWFscyhuYW1lKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5DQUxFTkRBUl9fSVNfQkFTRV9DQUxFTkRBUjoKLQkJCQlyZXR1cm4gaXNTZXRJc0Jhc2VDYWxlbmRhcigpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkNBTEVOREFSX19CQVNFX0NBTEVOREFSX1VJRDoKLQkJCQlyZXR1cm4gQkFTRV9DQUxFTkRBUl9VSURfRURFRkFVTFQgPT0gbnVsbCA/IGJhc2VDYWxlbmRhclVJRCAhPSBudWxsIDogIUJBU0VfQ0FMRU5EQVJfVUlEX0VERUZBVUxULmVxdWFscyhiYXNlQ2FsZW5kYXJVSUQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkNBTEVOREFSX19XRUVLX0RBWVM6Ci0JCQkJcmV0dXJuIHdlZWtEYXlzICE9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiICh1SUQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHVJRCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgbmFtZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQobmFtZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgaXNCYXNlQ2FsZW5kYXI6ICIpOwotCQlpZiAoaXNCYXNlQ2FsZW5kYXJFU2V0KSByZXN1bHQuYXBwZW5kKGlzQmFzZUNhbGVuZGFyKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgYmFzZUNhbGVuZGFyVUlEOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChiYXNlQ2FsZW5kYXJVSUQpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9DYWxlbmRhckltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9DYWxlbmRhcnNJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvQ2FsZW5kYXJzSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhY2Y1ZWU0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9DYWxlbmRhcnNJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDkgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBDYWxlbmRhcnNJbXBsLmphdmEsdiAxLjEgMjAwOC8wMS8xNSAwODo1MTo1MyBqdGhhbSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5DYWxlbmRhcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkNhbGVuZGFyczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5DYWxlbmRhcnM8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5DYWxlbmRhcnNJbXBsI2dldENhbGVuZGFyIDxlbT5DYWxlbmRhcjwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIENhbGVuZGFyc0ltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIENhbGVuZGFycyB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q2FsZW5kYXIoKSA8ZW0+Q2FsZW5kYXI8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q2FsZW5kYXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBjYWxlbmRhciA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ2FsZW5kYXJzSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldENhbGVuZGFycygpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRDYWxlbmRhcigpIHsKLQkJaWYgKGNhbGVuZGFyID09IG51bGwpIHsKLQkJCWNhbGVuZGFyID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KENhbGVuZGFyLmNsYXNzLCB0aGlzLCBNc3Byb2plY3RQYWNrYWdlLkNBTEVOREFSU19fQ0FMRU5EQVIpOwotCQl9Ci0JCXJldHVybiBjYWxlbmRhcjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQ0FMRU5EQVJTX19DQUxFTkRBUjoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRDYWxlbmRhcigpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQ0FMRU5EQVJTX19DQUxFTkRBUjoKLQkJCQlyZXR1cm4gZ2V0Q2FsZW5kYXIoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQ0FMRU5EQVJTX19DQUxFTkRBUjoKLQkJCQlnZXRDYWxlbmRhcigpLmNsZWFyKCk7Ci0JCQkJZ2V0Q2FsZW5kYXIoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQ0FMRU5EQVJTX19DQUxFTkRBUjoKLQkJCQlnZXRDYWxlbmRhcigpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQ0FMRU5EQVJTX19DQUxFTkRBUjoKLQkJCQlyZXR1cm4gY2FsZW5kYXIgIT0gbnVsbCAmJiAhY2FsZW5kYXIuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLX0gLy9DYWxlbmRhcnNJbXBsCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvRG9jdW1lbnRSb290SW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL0RvY3VtZW50Um9vdEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTcxMzAxZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvRG9jdW1lbnRSb290SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjgwICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogRG9jdW1lbnRSb290SW1wbC5qYXZhLHYgMS4xIDIwMDgvMDEvMTUgMDg6NTE6NTMganRoYW0gRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRWNvcmVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRVN0cmluZ1RvU3RyaW5nTWFwRW50cnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkJhc2ljRmVhdHVyZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZUVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRG9jdW1lbnRSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Eb2N1bWVudCBSb290PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuRG9jdW1lbnRSb290SW1wbCNnZXRNaXhlZCA8ZW0+TWl4ZWQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Eb2N1bWVudFJvb3RJbXBsI2dldFhNTE5TUHJlZml4TWFwIDxlbT5YTUxOUyBQcmVmaXggTWFwPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuRG9jdW1lbnRSb290SW1wbCNnZXRYU0lTY2hlbWFMb2NhdGlvbiA8ZW0+WFNJIFNjaGVtYSBMb2NhdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkRvY3VtZW50Um9vdEltcGwjZ2V0UHJvamVjdCA8ZW0+UHJvamVjdDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERvY3VtZW50Um9vdEltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIERvY3VtZW50Um9vdCB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWl4ZWQoKSA8ZW0+TWl4ZWQ8L2VtPn0nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TWl4ZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBGZWF0dXJlTWFwIG1peGVkID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFhNTE5TUHJlZml4TWFwKCkgPGVtPlhNTE5TIFByZWZpeCBNYXA8L2VtPn0nIG1hcC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFhNTE5TUHJlZml4TWFwKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRU1hcCB4TUxOU1ByZWZpeE1hcCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRYU0lTY2hlbWFMb2NhdGlvbigpIDxlbT5YU0kgU2NoZW1hIExvY2F0aW9uPC9lbT59JyBtYXAuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRYU0lTY2hlbWFMb2NhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVNYXAgeFNJU2NoZW1hTG9jYXRpb24gPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIERvY3VtZW50Um9vdEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXREb2N1bWVudFJvb3QoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRmVhdHVyZU1hcCBnZXRNaXhlZCgpIHsKLQkJaWYgKG1peGVkID09IG51bGwpIHsKLQkJCW1peGVkID0gbmV3IEJhc2ljRmVhdHVyZU1hcCh0aGlzLCBNc3Byb2plY3RQYWNrYWdlLkRPQ1VNRU5UX1JPT1RfX01JWEVEKTsKLQkJfQotCQlyZXR1cm4gbWl4ZWQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVNYXAgZ2V0WE1MTlNQcmVmaXhNYXAoKSB7Ci0JCWlmICh4TUxOU1ByZWZpeE1hcCA9PSBudWxsKSB7Ci0JCQl4TUxOU1ByZWZpeE1hcCA9IG5ldyBFY29yZUVNYXAoRWNvcmVQYWNrYWdlLmVJTlNUQU5DRS5nZXRFU3RyaW5nVG9TdHJpbmdNYXBFbnRyeSgpLCBFU3RyaW5nVG9TdHJpbmdNYXBFbnRyeUltcGwuY2xhc3MsIHRoaXMsIE1zcHJvamVjdFBhY2thZ2UuRE9DVU1FTlRfUk9PVF9fWE1MTlNfUFJFRklYX01BUCk7Ci0JCX0KLQkJcmV0dXJuIHhNTE5TUHJlZml4TWFwOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTWFwIGdldFhTSVNjaGVtYUxvY2F0aW9uKCkgewotCQlpZiAoeFNJU2NoZW1hTG9jYXRpb24gPT0gbnVsbCkgewotCQkJeFNJU2NoZW1hTG9jYXRpb24gPSBuZXcgRWNvcmVFTWFwKEVjb3JlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RVN0cmluZ1RvU3RyaW5nTWFwRW50cnkoKSwgRVN0cmluZ1RvU3RyaW5nTWFwRW50cnlJbXBsLmNsYXNzLCB0aGlzLCBNc3Byb2plY3RQYWNrYWdlLkRPQ1VNRU5UX1JPT1RfX1hTSV9TQ0hFTUFfTE9DQVRJT04pOwotCQl9Ci0JCXJldHVybiB4U0lTY2hlbWFMb2NhdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUHJvamVjdCBnZXRQcm9qZWN0KCkgewotCQlyZXR1cm4gKFByb2plY3QpZ2V0TWl4ZWQoKS5nZXQoTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0RG9jdW1lbnRSb290X1Byb2plY3QoKSwgdHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0UHJvamVjdChQcm9qZWN0IG5ld1Byb2plY3QsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJcmV0dXJuICgoRmVhdHVyZU1hcC5JbnRlcm5hbClnZXRNaXhlZCgpKS5iYXNpY0FkZChNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXREb2N1bWVudFJvb3RfUHJvamVjdCgpLCBuZXdQcm9qZWN0LCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQcm9qZWN0KFByb2plY3QgbmV3UHJvamVjdCkgewotCQkoKEZlYXR1cmVNYXAuSW50ZXJuYWwpZ2V0TWl4ZWQoKSkuc2V0KE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldERvY3VtZW50Um9vdF9Qcm9qZWN0KCksIG5ld1Byb2plY3QpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5ET0NVTUVOVF9ST09UX19NSVhFRDoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRNaXhlZCgpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkRPQ1VNRU5UX1JPT1RfX1hNTE5TX1BSRUZJWF9NQVA6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0WE1MTlNQcmVmaXhNYXAoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5ET0NVTUVOVF9ST09UX19YU0lfU0NIRU1BX0xPQ0FUSU9OOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldFhTSVNjaGVtYUxvY2F0aW9uKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRE9DVU1FTlRfUk9PVF9fUFJPSkVDVDoKLQkJCQkJcmV0dXJuIGJhc2ljU2V0UHJvamVjdChudWxsLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5ET0NVTUVOVF9ST09UX19NSVhFRDoKLQkJCQlyZXR1cm4gZ2V0TWl4ZWQoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5ET0NVTUVOVF9ST09UX19YTUxOU19QUkVGSVhfTUFQOgotCQkJCXJldHVybiBnZXRYTUxOU1ByZWZpeE1hcCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkRPQ1VNRU5UX1JPT1RfX1hTSV9TQ0hFTUFfTE9DQVRJT046Ci0JCQkJcmV0dXJuIGdldFhTSVNjaGVtYUxvY2F0aW9uKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRE9DVU1FTlRfUk9PVF9fUFJPSkVDVDoKLQkJCQlyZXR1cm4gZ2V0UHJvamVjdCgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5ET0NVTUVOVF9ST09UX19NSVhFRDoKLQkJCQlnZXRNaXhlZCgpLmNsZWFyKCk7Ci0JCQkJZ2V0TWl4ZWQoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5ET0NVTUVOVF9ST09UX19YTUxOU19QUkVGSVhfTUFQOgotCQkJCWdldFhNTE5TUHJlZml4TWFwKCkuY2xlYXIoKTsKLQkJCQlnZXRYTUxOU1ByZWZpeE1hcCgpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkRPQ1VNRU5UX1JPT1RfX1hTSV9TQ0hFTUFfTE9DQVRJT046Ci0JCQkJZ2V0WFNJU2NoZW1hTG9jYXRpb24oKS5jbGVhcigpOwotCQkJCWdldFhTSVNjaGVtYUxvY2F0aW9uKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRE9DVU1FTlRfUk9PVF9fUFJPSkVDVDoKLQkJCQlzZXRQcm9qZWN0KChQcm9qZWN0KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkRPQ1VNRU5UX1JPT1RfX01JWEVEOgotCQkJCWdldE1peGVkKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRE9DVU1FTlRfUk9PVF9fWE1MTlNfUFJFRklYX01BUDoKLQkJCQlnZXRYTUxOU1ByZWZpeE1hcCgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkRPQ1VNRU5UX1JPT1RfX1hTSV9TQ0hFTUFfTE9DQVRJT046Ci0JCQkJZ2V0WFNJU2NoZW1hTG9jYXRpb24oKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5ET0NVTUVOVF9ST09UX19QUk9KRUNUOgotCQkJCXNldFByb2plY3QoKFByb2plY3QpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRE9DVU1FTlRfUk9PVF9fTUlYRUQ6Ci0JCQkJcmV0dXJuIG1peGVkICE9IG51bGwgJiYgIW1peGVkLmlzRW1wdHkoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5ET0NVTUVOVF9ST09UX19YTUxOU19QUkVGSVhfTUFQOgotCQkJCXJldHVybiB4TUxOU1ByZWZpeE1hcCAhPSBudWxsICYmICF4TUxOU1ByZWZpeE1hcC5pc0VtcHR5KCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRE9DVU1FTlRfUk9PVF9fWFNJX1NDSEVNQV9MT0NBVElPTjoKLQkJCQlyZXR1cm4geFNJU2NoZW1hTG9jYXRpb24gIT0gbnVsbCAmJiAheFNJU2NoZW1hTG9jYXRpb24uaXNFbXB0eSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkRPQ1VNRU5UX1JPT1RfX1BST0pFQ1Q6Ci0JCQkJcmV0dXJuIGdldFByb2plY3QoKSAhPSBudWxsOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAobWl4ZWQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKG1peGVkKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vRG9jdW1lbnRSb290SW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL0V4dGVuZGVkQXR0cmlidXRlMkltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9FeHRlbmRlZEF0dHJpYnV0ZTJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlMTRlNDMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL0V4dGVuZGVkQXR0cmlidXRlMkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3NyArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IEV4dGVuZGVkQXR0cmlidXRlMkltcGwuamF2YSx2IDEuMSAyMDA4LzAxLzE1IDA4OjUxOjUzIGp0aGFtIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsOwotCi1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkV4dGVuZGVkIEF0dHJpYnV0ZTI8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5FeHRlbmRlZEF0dHJpYnV0ZTJJbXBsI2dldFVJRCA8ZW0+VUlEPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuRXh0ZW5kZWRBdHRyaWJ1dGUySW1wbCNnZXRGaWVsZElEIDxlbT5GaWVsZCBJRDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkV4dGVuZGVkQXR0cmlidXRlMkltcGwjZ2V0VmFsdWUgPGVtPlZhbHVlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuRXh0ZW5kZWRBdHRyaWJ1dGUySW1wbCNnZXRWYWx1ZUlEIDxlbT5WYWx1ZSBJRDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkV4dGVuZGVkQXR0cmlidXRlMkltcGwjZ2V0RHVyYXRpb25Gb3JtYXQgPGVtPkR1cmF0aW9uIEZvcm1hdDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEV4dGVuZGVkQXR0cmlidXRlMkltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIEV4dGVuZGVkQXR0cmlidXRlMiB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFVJRCgpIDxlbT5VSUQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFVJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdJbnRlZ2VyIFVJRF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRVSUQoKSA8ZW0+VUlEPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRVSUQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdJbnRlZ2VyIHVJRCA9IFVJRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRGaWVsZElEKCkgPGVtPkZpZWxkIElEPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRGaWVsZElEKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBGSUVMRF9JRF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRGaWVsZElEKCkgPGVtPkZpZWxkIElEPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRGaWVsZElEKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGZpZWxkSUQgPSBGSUVMRF9JRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWYWx1ZSgpIDxlbT5WYWx1ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VmFsdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTFVFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZhbHVlKCkgPGVtPlZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRWYWx1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyB2YWx1ZSA9IFZBTFVFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZhbHVlSUQoKSA8ZW0+VmFsdWUgSUQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFZhbHVlSUQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBWQUxVRV9JRF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWYWx1ZUlEKCkgPGVtPlZhbHVlIElEPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRWYWx1ZUlEKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnSW50ZWdlciB2YWx1ZUlEID0gVkFMVUVfSURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RHVyYXRpb25Gb3JtYXQoKSA8ZW0+RHVyYXRpb24gRm9ybWF0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREdXJhdGlvbkZvcm1hdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdJbnRlZ2VyIERVUkFUSU9OX0ZPUk1BVF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREdXJhdGlvbkZvcm1hdCgpIDxlbT5EdXJhdGlvbiBGb3JtYXQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldER1cmF0aW9uRm9ybWF0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnSW50ZWdlciBkdXJhdGlvbkZvcm1hdCA9IERVUkFUSU9OX0ZPUk1BVF9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFeHRlbmRlZEF0dHJpYnV0ZTJJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0VUlEKCkgewotCQlyZXR1cm4gdUlEOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFVJRChCaWdJbnRlZ2VyIG5ld1VJRCkgewotCQlCaWdJbnRlZ2VyIG9sZFVJRCA9IHVJRDsKLQkJdUlEID0gbmV3VUlEOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURTJfX1VJRCwgb2xkVUlELCB1SUQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEZpZWxkSUQoKSB7Ci0JCXJldHVybiBmaWVsZElEOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZpZWxkSUQoU3RyaW5nIG5ld0ZpZWxkSUQpIHsKLQkJU3RyaW5nIG9sZEZpZWxkSUQgPSBmaWVsZElEOwotCQlmaWVsZElEID0gbmV3RmllbGRJRDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEUyX19GSUVMRF9JRCwgb2xkRmllbGRJRCwgZmllbGRJRCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKSB7Ci0JCXJldHVybiB2YWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShTdHJpbmcgbmV3VmFsdWUpIHsKLQkJU3RyaW5nIG9sZFZhbHVlID0gdmFsdWU7Ci0JCXZhbHVlID0gbmV3VmFsdWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFMl9fVkFMVUUsIG9sZFZhbHVlLCB2YWx1ZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGdldFZhbHVlSUQoKSB7Ci0JCXJldHVybiB2YWx1ZUlEOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZhbHVlSUQoQmlnSW50ZWdlciBuZXdWYWx1ZUlEKSB7Ci0JCUJpZ0ludGVnZXIgb2xkVmFsdWVJRCA9IHZhbHVlSUQ7Ci0JCXZhbHVlSUQgPSBuZXdWYWx1ZUlEOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURTJfX1ZBTFVFX0lELCBvbGRWYWx1ZUlELCB2YWx1ZUlEKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0RHVyYXRpb25Gb3JtYXQoKSB7Ci0JCXJldHVybiBkdXJhdGlvbkZvcm1hdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREdXJhdGlvbkZvcm1hdChCaWdJbnRlZ2VyIG5ld0R1cmF0aW9uRm9ybWF0KSB7Ci0JCUJpZ0ludGVnZXIgb2xkRHVyYXRpb25Gb3JtYXQgPSBkdXJhdGlvbkZvcm1hdDsKLQkJZHVyYXRpb25Gb3JtYXQgPSBuZXdEdXJhdGlvbkZvcm1hdDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEUyX19EVVJBVElPTl9GT1JNQVQsIG9sZER1cmF0aW9uRm9ybWF0LCBkdXJhdGlvbkZvcm1hdCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEUyX19VSUQ6Ci0JCQkJcmV0dXJuIGdldFVJRCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURTJfX0ZJRUxEX0lEOgotCQkJCXJldHVybiBnZXRGaWVsZElEKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFMl9fVkFMVUU6Ci0JCQkJcmV0dXJuIGdldFZhbHVlKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFMl9fVkFMVUVfSUQ6Ci0JCQkJcmV0dXJuIGdldFZhbHVlSUQoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEUyX19EVVJBVElPTl9GT1JNQVQ6Ci0JCQkJcmV0dXJuIGdldER1cmF0aW9uRm9ybWF0KCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURTJfX1VJRDoKLQkJCQlzZXRVSUQoKEJpZ0ludGVnZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEUyX19GSUVMRF9JRDoKLQkJCQlzZXRGaWVsZElEKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEUyX19WQUxVRToKLQkJCQlzZXRWYWx1ZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFMl9fVkFMVUVfSUQ6Ci0JCQkJc2V0VmFsdWVJRCgoQmlnSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURTJfX0RVUkFUSU9OX0ZPUk1BVDoKLQkJCQlzZXREdXJhdGlvbkZvcm1hdCgoQmlnSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEUyX19VSUQ6Ci0JCQkJc2V0VUlEKFVJRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURTJfX0ZJRUxEX0lEOgotCQkJCXNldEZpZWxkSUQoRklFTERfSURfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEUyX19WQUxVRToKLQkJCQlzZXRWYWx1ZShWQUxVRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURTJfX1ZBTFVFX0lEOgotCQkJCXNldFZhbHVlSUQoVkFMVUVfSURfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEUyX19EVVJBVElPTl9GT1JNQVQ6Ci0JCQkJc2V0RHVyYXRpb25Gb3JtYXQoRFVSQVRJT05fRk9STUFUX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEUyX19VSUQ6Ci0JCQkJcmV0dXJuIFVJRF9FREVGQVVMVCA9PSBudWxsID8gdUlEICE9IG51bGwgOiAhVUlEX0VERUZBVUxULmVxdWFscyh1SUQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURTJfX0ZJRUxEX0lEOgotCQkJCXJldHVybiBGSUVMRF9JRF9FREVGQVVMVCA9PSBudWxsID8gZmllbGRJRCAhPSBudWxsIDogIUZJRUxEX0lEX0VERUZBVUxULmVxdWFscyhmaWVsZElEKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEUyX19WQUxVRToKLQkJCQlyZXR1cm4gVkFMVUVfRURFRkFVTFQgPT0gbnVsbCA/IHZhbHVlICE9IG51bGwgOiAhVkFMVUVfRURFRkFVTFQuZXF1YWxzKHZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEUyX19WQUxVRV9JRDoKLQkJCQlyZXR1cm4gVkFMVUVfSURfRURFRkFVTFQgPT0gbnVsbCA/IHZhbHVlSUQgIT0gbnVsbCA6ICFWQUxVRV9JRF9FREVGQVVMVC5lcXVhbHModmFsdWVJRCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFMl9fRFVSQVRJT05fRk9STUFUOgotCQkJCXJldHVybiBEVVJBVElPTl9GT1JNQVRfRURFRkFVTFQgPT0gbnVsbCA/IGR1cmF0aW9uRm9ybWF0ICE9IG51bGwgOiAhRFVSQVRJT05fRk9STUFUX0VERUZBVUxULmVxdWFscyhkdXJhdGlvbkZvcm1hdCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiICh1SUQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHVJRCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZmllbGRJRDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZmllbGRJRCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgdmFsdWU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHZhbHVlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCB2YWx1ZUlEOiAiKTsKLQkJcmVzdWx0LmFwcGVuZCh2YWx1ZUlEKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBkdXJhdGlvbkZvcm1hdDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZHVyYXRpb25Gb3JtYXQpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9FeHRlbmRlZEF0dHJpYnV0ZTJJbXBsCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvRXh0ZW5kZWRBdHRyaWJ1dGUzSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL0V4dGVuZGVkQXR0cmlidXRlM0ltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGVhNmE5NS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvRXh0ZW5kZWRBdHRyaWJ1dGUzSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzc3ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogRXh0ZW5kZWRBdHRyaWJ1dGUzSW1wbC5qYXZhLHYgMS4xIDIwMDgvMDEvMTUgMDg6NTE6NTMganRoYW0gRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGw7Ci0KLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZTM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RXh0ZW5kZWQgQXR0cmlidXRlMzwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkV4dGVuZGVkQXR0cmlidXRlM0ltcGwjZ2V0VUlEIDxlbT5VSUQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5FeHRlbmRlZEF0dHJpYnV0ZTNJbXBsI2dldEZpZWxkSUQgPGVtPkZpZWxkIElEPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuRXh0ZW5kZWRBdHRyaWJ1dGUzSW1wbCNnZXRWYWx1ZSA8ZW0+VmFsdWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5FeHRlbmRlZEF0dHJpYnV0ZTNJbXBsI2dldFZhbHVlSUQgPGVtPlZhbHVlIElEPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuRXh0ZW5kZWRBdHRyaWJ1dGUzSW1wbCNnZXREdXJhdGlvbkZvcm1hdCA8ZW0+RHVyYXRpb24gRm9ybWF0PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRXh0ZW5kZWRBdHRyaWJ1dGUzSW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgRXh0ZW5kZWRBdHRyaWJ1dGUzIHsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VUlEKCkgPGVtPlVJRDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VUlEKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0ludGVnZXIgVUlEX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFVJRCgpIDxlbT5VSUQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFVJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0ludGVnZXIgdUlEID0gVUlEX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEZpZWxkSUQoKSA8ZW0+RmllbGQgSUQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEZpZWxkSUQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEZJRUxEX0lEX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEZpZWxkSUQoKSA8ZW0+RmllbGQgSUQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEZpZWxkSUQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZmllbGRJRCA9IEZJRUxEX0lEX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZhbHVlKCkgPGVtPlZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRWYWx1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMVUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmFsdWUoKSA8ZW0+VmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFZhbHVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHZhbHVlID0gVkFMVUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmFsdWVJRCgpIDxlbT5WYWx1ZSBJRDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VmFsdWVJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdJbnRlZ2VyIFZBTFVFX0lEX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZhbHVlSUQoKSA8ZW0+VmFsdWUgSUQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFZhbHVlSUQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdJbnRlZ2VyIHZhbHVlSUQgPSBWQUxVRV9JRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREdXJhdGlvbkZvcm1hdCgpIDxlbT5EdXJhdGlvbiBGb3JtYXQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldER1cmF0aW9uRm9ybWF0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0ludGVnZXIgRFVSQVRJT05fRk9STUFUX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldER1cmF0aW9uRm9ybWF0KCkgPGVtPkR1cmF0aW9uIEZvcm1hdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RHVyYXRpb25Gb3JtYXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdJbnRlZ2VyIGR1cmF0aW9uRm9ybWF0ID0gRFVSQVRJT05fRk9STUFUX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEV4dGVuZGVkQXR0cmlidXRlM0ltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXRFeHRlbmRlZEF0dHJpYnV0ZTMoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBnZXRVSUQoKSB7Ci0JCXJldHVybiB1SUQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VUlEKEJpZ0ludGVnZXIgbmV3VUlEKSB7Ci0JCUJpZ0ludGVnZXIgb2xkVUlEID0gdUlEOwotCQl1SUQgPSBuZXdVSUQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFM19fVUlELCBvbGRVSUQsIHVJRCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RmllbGRJRCgpIHsKLQkJcmV0dXJuIGZpZWxkSUQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RmllbGRJRChTdHJpbmcgbmV3RmllbGRJRCkgewotCQlTdHJpbmcgb2xkRmllbGRJRCA9IGZpZWxkSUQ7Ci0JCWZpZWxkSUQgPSBuZXdGaWVsZElEOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURTNfX0ZJRUxEX0lELCBvbGRGaWVsZElELCBmaWVsZElEKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpIHsKLQkJcmV0dXJuIHZhbHVlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyBuZXdWYWx1ZSkgewotCQlTdHJpbmcgb2xkVmFsdWUgPSB2YWx1ZTsKLQkJdmFsdWUgPSBuZXdWYWx1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEUzX19WQUxVRSwgb2xkVmFsdWUsIHZhbHVlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0VmFsdWVJRCgpIHsKLQkJcmV0dXJuIHZhbHVlSUQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmFsdWVJRChCaWdJbnRlZ2VyIG5ld1ZhbHVlSUQpIHsKLQkJQmlnSW50ZWdlciBvbGRWYWx1ZUlEID0gdmFsdWVJRDsKLQkJdmFsdWVJRCA9IG5ld1ZhbHVlSUQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFM19fVkFMVUVfSUQsIG9sZFZhbHVlSUQsIHZhbHVlSUQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBnZXREdXJhdGlvbkZvcm1hdCgpIHsKLQkJcmV0dXJuIGR1cmF0aW9uRm9ybWF0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldER1cmF0aW9uRm9ybWF0KEJpZ0ludGVnZXIgbmV3RHVyYXRpb25Gb3JtYXQpIHsKLQkJQmlnSW50ZWdlciBvbGREdXJhdGlvbkZvcm1hdCA9IGR1cmF0aW9uRm9ybWF0OwotCQlkdXJhdGlvbkZvcm1hdCA9IG5ld0R1cmF0aW9uRm9ybWF0OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURTNfX0RVUkFUSU9OX0ZPUk1BVCwgb2xkRHVyYXRpb25Gb3JtYXQsIGR1cmF0aW9uRm9ybWF0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURTNfX1VJRDoKLQkJCQlyZXR1cm4gZ2V0VUlEKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFM19fRklFTERfSUQ6Ci0JCQkJcmV0dXJuIGdldEZpZWxkSUQoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEUzX19WQUxVRToKLQkJCQlyZXR1cm4gZ2V0VmFsdWUoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEUzX19WQUxVRV9JRDoKLQkJCQlyZXR1cm4gZ2V0VmFsdWVJRCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURTNfX0RVUkFUSU9OX0ZPUk1BVDoKLQkJCQlyZXR1cm4gZ2V0RHVyYXRpb25Gb3JtYXQoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFM19fVUlEOgotCQkJCXNldFVJRCgoQmlnSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURTNfX0ZJRUxEX0lEOgotCQkJCXNldEZpZWxkSUQoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURTNfX1ZBTFVFOgotCQkJCXNldFZhbHVlKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEUzX19WQUxVRV9JRDoKLQkJCQlzZXRWYWx1ZUlEKChCaWdJbnRlZ2VyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFM19fRFVSQVRJT05fRk9STUFUOgotCQkJCXNldER1cmF0aW9uRm9ybWF0KChCaWdJbnRlZ2VyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURTNfX1VJRDoKLQkJCQlzZXRVSUQoVUlEX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFM19fRklFTERfSUQ6Ci0JCQkJc2V0RmllbGRJRChGSUVMRF9JRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURTNfX1ZBTFVFOgotCQkJCXNldFZhbHVlKFZBTFVFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFM19fVkFMVUVfSUQ6Ci0JCQkJc2V0VmFsdWVJRChWQUxVRV9JRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURTNfX0RVUkFUSU9OX0ZPUk1BVDoKLQkJCQlzZXREdXJhdGlvbkZvcm1hdChEVVJBVElPTl9GT1JNQVRfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURTNfX1VJRDoKLQkJCQlyZXR1cm4gVUlEX0VERUZBVUxUID09IG51bGwgPyB1SUQgIT0gbnVsbCA6ICFVSURfRURFRkFVTFQuZXF1YWxzKHVJRCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFM19fRklFTERfSUQ6Ci0JCQkJcmV0dXJuIEZJRUxEX0lEX0VERUZBVUxUID09IG51bGwgPyBmaWVsZElEICE9IG51bGwgOiAhRklFTERfSURfRURFRkFVTFQuZXF1YWxzKGZpZWxkSUQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURTNfX1ZBTFVFOgotCQkJCXJldHVybiBWQUxVRV9FREVGQVVMVCA9PSBudWxsID8gdmFsdWUgIT0gbnVsbCA6ICFWQUxVRV9FREVGQVVMVC5lcXVhbHModmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURTNfX1ZBTFVFX0lEOgotCQkJCXJldHVybiBWQUxVRV9JRF9FREVGQVVMVCA9PSBudWxsID8gdmFsdWVJRCAhPSBudWxsIDogIVZBTFVFX0lEX0VERUZBVUxULmVxdWFscyh2YWx1ZUlEKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEUzX19EVVJBVElPTl9GT1JNQVQ6Ci0JCQkJcmV0dXJuIERVUkFUSU9OX0ZPUk1BVF9FREVGQVVMVCA9PSBudWxsID8gZHVyYXRpb25Gb3JtYXQgIT0gbnVsbCA6ICFEVVJBVElPTl9GT1JNQVRfRURFRkFVTFQuZXF1YWxzKGR1cmF0aW9uRm9ybWF0KTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHVJRDogIik7Ci0JCXJlc3VsdC5hcHBlbmQodUlEKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBmaWVsZElEOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChmaWVsZElEKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCB2YWx1ZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQodmFsdWUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHZhbHVlSUQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHZhbHVlSUQpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGR1cmF0aW9uRm9ybWF0OiAiKTsKLQkJcmVzdWx0LmFwcGVuZChkdXJhdGlvbkZvcm1hdCk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL0V4dGVuZGVkQXR0cmlidXRlM0ltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9FeHRlbmRlZEF0dHJpYnV0ZTRJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvRXh0ZW5kZWRBdHRyaWJ1dGU0SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZjQ4YjdlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9FeHRlbmRlZEF0dHJpYnV0ZTRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNzcgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBFeHRlbmRlZEF0dHJpYnV0ZTRJbXBsLmphdmEsdiAxLjEgMjAwOC8wMS8xNSAwODo1MTo1MyBqdGhhbSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbDsKLQotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlNDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5FeHRlbmRlZCBBdHRyaWJ1dGU0PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuRXh0ZW5kZWRBdHRyaWJ1dGU0SW1wbCNnZXRVSUQgPGVtPlVJRDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkV4dGVuZGVkQXR0cmlidXRlNEltcGwjZ2V0RmllbGRJRCA8ZW0+RmllbGQgSUQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5FeHRlbmRlZEF0dHJpYnV0ZTRJbXBsI2dldFZhbHVlIDxlbT5WYWx1ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkV4dGVuZGVkQXR0cmlidXRlNEltcGwjZ2V0VmFsdWVJRCA8ZW0+VmFsdWUgSUQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5FeHRlbmRlZEF0dHJpYnV0ZTRJbXBsI2dldER1cmF0aW9uRm9ybWF0IDxlbT5EdXJhdGlvbiBGb3JtYXQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBFeHRlbmRlZEF0dHJpYnV0ZTRJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBFeHRlbmRlZEF0dHJpYnV0ZTQgewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRVSUQoKSA8ZW0+VUlEPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRVSUQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBVSURfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VUlEKCkgPGVtPlVJRDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VUlEKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnSW50ZWdlciB1SUQgPSBVSURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RmllbGRJRCgpIDxlbT5GaWVsZCBJRDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RmllbGRJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklFTERfSURfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RmllbGRJRCgpIDxlbT5GaWVsZCBJRDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RmllbGRJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBmaWVsZElEID0gRklFTERfSURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmFsdWUoKSA8ZW0+VmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFZhbHVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxVRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWYWx1ZSgpIDxlbT5WYWx1ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VmFsdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgdmFsdWUgPSBWQUxVRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWYWx1ZUlEKCkgPGVtPlZhbHVlIElEPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRWYWx1ZUlEKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0ludGVnZXIgVkFMVUVfSURfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmFsdWVJRCgpIDxlbT5WYWx1ZSBJRDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VmFsdWVJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0ludGVnZXIgdmFsdWVJRCA9IFZBTFVFX0lEX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldER1cmF0aW9uRm9ybWF0KCkgPGVtPkR1cmF0aW9uIEZvcm1hdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RHVyYXRpb25Gb3JtYXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBEVVJBVElPTl9GT1JNQVRfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RHVyYXRpb25Gb3JtYXQoKSA8ZW0+RHVyYXRpb24gRm9ybWF0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREdXJhdGlvbkZvcm1hdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0ludGVnZXIgZHVyYXRpb25Gb3JtYXQgPSBEVVJBVElPTl9GT1JNQVRfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRXh0ZW5kZWRBdHRyaWJ1dGU0SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldEV4dGVuZGVkQXR0cmlidXRlNCgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGdldFVJRCgpIHsKLQkJcmV0dXJuIHVJRDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRVSUQoQmlnSW50ZWdlciBuZXdVSUQpIHsKLQkJQmlnSW50ZWdlciBvbGRVSUQgPSB1SUQ7Ci0JCXVJRCA9IG5ld1VJRDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEU0X19VSUQsIG9sZFVJRCwgdUlEKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRGaWVsZElEKCkgewotCQlyZXR1cm4gZmllbGRJRDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGaWVsZElEKFN0cmluZyBuZXdGaWVsZElEKSB7Ci0JCVN0cmluZyBvbGRGaWVsZElEID0gZmllbGRJRDsKLQkJZmllbGRJRCA9IG5ld0ZpZWxkSUQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFNF9fRklFTERfSUQsIG9sZEZpZWxkSUQsIGZpZWxkSUQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFZhbHVlKCkgewotCQlyZXR1cm4gdmFsdWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmFsdWUoU3RyaW5nIG5ld1ZhbHVlKSB7Ci0JCVN0cmluZyBvbGRWYWx1ZSA9IHZhbHVlOwotCQl2YWx1ZSA9IG5ld1ZhbHVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURTRfX1ZBTFVFLCBvbGRWYWx1ZSwgdmFsdWUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBnZXRWYWx1ZUlEKCkgewotCQlyZXR1cm4gdmFsdWVJRDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZUlEKEJpZ0ludGVnZXIgbmV3VmFsdWVJRCkgewotCQlCaWdJbnRlZ2VyIG9sZFZhbHVlSUQgPSB2YWx1ZUlEOwotCQl2YWx1ZUlEID0gbmV3VmFsdWVJRDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEU0X19WQUxVRV9JRCwgb2xkVmFsdWVJRCwgdmFsdWVJRCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGdldER1cmF0aW9uRm9ybWF0KCkgewotCQlyZXR1cm4gZHVyYXRpb25Gb3JtYXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RHVyYXRpb25Gb3JtYXQoQmlnSW50ZWdlciBuZXdEdXJhdGlvbkZvcm1hdCkgewotCQlCaWdJbnRlZ2VyIG9sZER1cmF0aW9uRm9ybWF0ID0gZHVyYXRpb25Gb3JtYXQ7Ci0JCWR1cmF0aW9uRm9ybWF0ID0gbmV3RHVyYXRpb25Gb3JtYXQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFNF9fRFVSQVRJT05fRk9STUFULCBvbGREdXJhdGlvbkZvcm1hdCwgZHVyYXRpb25Gb3JtYXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFNF9fVUlEOgotCQkJCXJldHVybiBnZXRVSUQoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEU0X19GSUVMRF9JRDoKLQkJCQlyZXR1cm4gZ2V0RmllbGRJRCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURTRfX1ZBTFVFOgotCQkJCXJldHVybiBnZXRWYWx1ZSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURTRfX1ZBTFVFX0lEOgotCQkJCXJldHVybiBnZXRWYWx1ZUlEKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFNF9fRFVSQVRJT05fRk9STUFUOgotCQkJCXJldHVybiBnZXREdXJhdGlvbkZvcm1hdCgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEU0X19VSUQ6Ci0JCQkJc2V0VUlEKChCaWdJbnRlZ2VyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFNF9fRklFTERfSUQ6Ci0JCQkJc2V0RmllbGRJRCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFNF9fVkFMVUU6Ci0JCQkJc2V0VmFsdWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURTRfX1ZBTFVFX0lEOgotCQkJCXNldFZhbHVlSUQoKEJpZ0ludGVnZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEU0X19EVVJBVElPTl9GT1JNQVQ6Ci0JCQkJc2V0RHVyYXRpb25Gb3JtYXQoKEJpZ0ludGVnZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFNF9fVUlEOgotCQkJCXNldFVJRChVSURfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEU0X19GSUVMRF9JRDoKLQkJCQlzZXRGaWVsZElEKEZJRUxEX0lEX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFNF9fVkFMVUU6Ci0JCQkJc2V0VmFsdWUoVkFMVUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEU0X19WQUxVRV9JRDoKLQkJCQlzZXRWYWx1ZUlEKFZBTFVFX0lEX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFNF9fRFVSQVRJT05fRk9STUFUOgotCQkJCXNldER1cmF0aW9uRm9ybWF0KERVUkFUSU9OX0ZPUk1BVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFNF9fVUlEOgotCQkJCXJldHVybiBVSURfRURFRkFVTFQgPT0gbnVsbCA/IHVJRCAhPSBudWxsIDogIVVJRF9FREVGQVVMVC5lcXVhbHModUlEKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEU0X19GSUVMRF9JRDoKLQkJCQlyZXR1cm4gRklFTERfSURfRURFRkFVTFQgPT0gbnVsbCA/IGZpZWxkSUQgIT0gbnVsbCA6ICFGSUVMRF9JRF9FREVGQVVMVC5lcXVhbHMoZmllbGRJRCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFNF9fVkFMVUU6Ci0JCQkJcmV0dXJuIFZBTFVFX0VERUZBVUxUID09IG51bGwgPyB2YWx1ZSAhPSBudWxsIDogIVZBTFVFX0VERUZBVUxULmVxdWFscyh2YWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFNF9fVkFMVUVfSUQ6Ci0JCQkJcmV0dXJuIFZBTFVFX0lEX0VERUZBVUxUID09IG51bGwgPyB2YWx1ZUlEICE9IG51bGwgOiAhVkFMVUVfSURfRURFRkFVTFQuZXF1YWxzKHZhbHVlSUQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURTRfX0RVUkFUSU9OX0ZPUk1BVDoKLQkJCQlyZXR1cm4gRFVSQVRJT05fRk9STUFUX0VERUZBVUxUID09IG51bGwgPyBkdXJhdGlvbkZvcm1hdCAhPSBudWxsIDogIURVUkFUSU9OX0ZPUk1BVF9FREVGQVVMVC5lcXVhbHMoZHVyYXRpb25Gb3JtYXQpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAodUlEOiAiKTsKLQkJcmVzdWx0LmFwcGVuZCh1SUQpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGZpZWxkSUQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGZpZWxkSUQpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHZhbHVlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZCh2YWx1ZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgdmFsdWVJRDogIik7Ci0JCXJlc3VsdC5hcHBlbmQodmFsdWVJRCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZHVyYXRpb25Gb3JtYXQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGR1cmF0aW9uRm9ybWF0KTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vRXh0ZW5kZWRBdHRyaWJ1dGU0SW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL0V4dGVuZGVkQXR0cmlidXRlSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL0V4dGVuZGVkQXR0cmlidXRlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OWYwZGMyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9FeHRlbmRlZEF0dHJpYnV0ZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg1MyArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IEV4dGVuZGVkQXR0cmlidXRlSW1wbC5qYXZhLHYgMS4xIDIwMDgvMDEvMTUgMDg6NTE6NTMganRoYW0gRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGw7Ci0KLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlZhbHVlTGlzdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkV4dGVuZGVkIEF0dHJpYnV0ZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkV4dGVuZGVkQXR0cmlidXRlSW1wbCNnZXRGaWVsZElEIDxlbT5GaWVsZCBJRDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkV4dGVuZGVkQXR0cmlidXRlSW1wbCNnZXRGaWVsZE5hbWUgPGVtPkZpZWxkIE5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5FeHRlbmRlZEF0dHJpYnV0ZUltcGwjZ2V0QWxpYXMgPGVtPkFsaWFzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuRXh0ZW5kZWRBdHRyaWJ1dGVJbXBsI2dldFBob25ldGljQWxpYXMgPGVtPlBob25ldGljIEFsaWFzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuRXh0ZW5kZWRBdHRyaWJ1dGVJbXBsI2dldFJvbGx1cFR5cGUgPGVtPlJvbGx1cCBUeXBlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuRXh0ZW5kZWRBdHRyaWJ1dGVJbXBsI2dldENhbGN1bGF0aW9uVHlwZSA8ZW0+Q2FsY3VsYXRpb24gVHlwZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkV4dGVuZGVkQXR0cmlidXRlSW1wbCNnZXRGb3JtdWxhIDxlbT5Gb3JtdWxhPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuRXh0ZW5kZWRBdHRyaWJ1dGVJbXBsI2lzUmVzdHJpY3RWYWx1ZXMgPGVtPlJlc3RyaWN0IFZhbHVlczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkV4dGVuZGVkQXR0cmlidXRlSW1wbCNnZXRWYWx1ZWxpc3RTb3J0T3JkZXIgPGVtPlZhbHVlbGlzdCBTb3J0IE9yZGVyPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuRXh0ZW5kZWRBdHRyaWJ1dGVJbXBsI2lzQXBwZW5kTmV3VmFsdWVzIDxlbT5BcHBlbmQgTmV3IFZhbHVlczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkV4dGVuZGVkQXR0cmlidXRlSW1wbCNnZXREZWZhdWx0IDxlbT5EZWZhdWx0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuRXh0ZW5kZWRBdHRyaWJ1dGVJbXBsI2dldFZhbHVlTGlzdCA8ZW0+VmFsdWUgTGlzdDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEV4dGVuZGVkQXR0cmlidXRlSW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgRXh0ZW5kZWRBdHRyaWJ1dGUgewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRGaWVsZElEKCkgPGVtPkZpZWxkIElEPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRGaWVsZElEKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBGSUVMRF9JRF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRGaWVsZElEKCkgPGVtPkZpZWxkIElEPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRGaWVsZElEKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGZpZWxkSUQgPSBGSUVMRF9JRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRGaWVsZE5hbWUoKSA8ZW0+RmllbGQgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RmllbGROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBGSUVMRF9OQU1FX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEZpZWxkTmFtZSgpIDxlbT5GaWVsZCBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRGaWVsZE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZmllbGROYW1lID0gRklFTERfTkFNRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBbGlhcygpIDxlbT5BbGlhczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QWxpYXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEFMSUFTX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFsaWFzKCkgPGVtPkFsaWFzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBbGlhcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBhbGlhcyA9IEFMSUFTX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBob25ldGljQWxpYXMoKSA8ZW0+UGhvbmV0aWMgQWxpYXM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFBob25ldGljQWxpYXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBIT05FVElDX0FMSUFTX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBob25ldGljQWxpYXMoKSA8ZW0+UGhvbmV0aWMgQWxpYXM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFBob25ldGljQWxpYXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgcGhvbmV0aWNBbGlhcyA9IFBIT05FVElDX0FMSUFTX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJvbGx1cFR5cGUoKSA8ZW0+Um9sbHVwIFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJvbGx1cFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBST0xMVVBfVFlQRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSb2xsdXBUeXBlKCkgPGVtPlJvbGx1cCBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSb2xsdXBUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnSW50ZWdlciByb2xsdXBUeXBlID0gUk9MTFVQX1RZUEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q2FsY3VsYXRpb25UeXBlKCkgPGVtPkNhbGN1bGF0aW9uIFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENhbGN1bGF0aW9uVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdJbnRlZ2VyIENBTENVTEFUSU9OX1RZUEVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q2FsY3VsYXRpb25UeXBlKCkgPGVtPkNhbGN1bGF0aW9uIFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENhbGN1bGF0aW9uVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0ludGVnZXIgY2FsY3VsYXRpb25UeXBlID0gQ0FMQ1VMQVRJT05fVFlQRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRGb3JtdWxhKCkgPGVtPkZvcm11bGE8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEZvcm11bGEoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEZPUk1VTEFfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Rm9ybXVsYSgpIDxlbT5Gb3JtdWxhPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRGb3JtdWxhKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGZvcm11bGEgPSBGT1JNVUxBX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzUmVzdHJpY3RWYWx1ZXMoKSA8ZW0+UmVzdHJpY3QgVmFsdWVzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1Jlc3RyaWN0VmFsdWVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gUkVTVFJJQ1RfVkFMVUVTX0VERUZBVUxUID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1Jlc3RyaWN0VmFsdWVzKCkgPGVtPlJlc3RyaWN0IFZhbHVlczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNSZXN0cmljdFZhbHVlcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gcmVzdHJpY3RWYWx1ZXMgPSBSRVNUUklDVF9WQUxVRVNfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIFJlc3RyaWN0IFZhbHVlcyBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gcmVzdHJpY3RWYWx1ZXNFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmFsdWVsaXN0U29ydE9yZGVyKCkgPGVtPlZhbHVlbGlzdCBTb3J0IE9yZGVyPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRWYWx1ZWxpc3RTb3J0T3JkZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBWQUxVRUxJU1RfU09SVF9PUkRFUl9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWYWx1ZWxpc3RTb3J0T3JkZXIoKSA8ZW0+VmFsdWVsaXN0IFNvcnQgT3JkZXI8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFZhbHVlbGlzdFNvcnRPcmRlcigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0ludGVnZXIgdmFsdWVsaXN0U29ydE9yZGVyID0gVkFMVUVMSVNUX1NPUlRfT1JERVJfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNBcHBlbmROZXdWYWx1ZXMoKSA8ZW0+QXBwZW5kIE5ldyBWYWx1ZXM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzQXBwZW5kTmV3VmFsdWVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gQVBQRU5EX05FV19WQUxVRVNfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzQXBwZW5kTmV3VmFsdWVzKCkgPGVtPkFwcGVuZCBOZXcgVmFsdWVzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0FwcGVuZE5ld1ZhbHVlcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gYXBwZW5kTmV3VmFsdWVzID0gQVBQRU5EX05FV19WQUxVRVNfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIEFwcGVuZCBOZXcgVmFsdWVzIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBhcHBlbmROZXdWYWx1ZXNFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVmYXVsdCgpIDxlbT5EZWZhdWx0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREZWZhdWx0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlZmF1bHQoKSA8ZW0+RGVmYXVsdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGVmYXVsdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBkZWZhdWx0XyA9IERFRkFVTFRfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWYWx1ZUxpc3QoKSA8ZW0+VmFsdWUgTGlzdDwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VmFsdWVMaXN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgVmFsdWVMaXN0IHZhbHVlTGlzdCA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRXh0ZW5kZWRBdHRyaWJ1dGVJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEZpZWxkSUQoKSB7Ci0JCXJldHVybiBmaWVsZElEOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZpZWxkSUQoU3RyaW5nIG5ld0ZpZWxkSUQpIHsKLQkJU3RyaW5nIG9sZEZpZWxkSUQgPSBmaWVsZElEOwotCQlmaWVsZElEID0gbmV3RmllbGRJRDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEVfX0ZJRUxEX0lELCBvbGRGaWVsZElELCBmaWVsZElEKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRGaWVsZE5hbWUoKSB7Ci0JCXJldHVybiBmaWVsZE5hbWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RmllbGROYW1lKFN0cmluZyBuZXdGaWVsZE5hbWUpIHsKLQkJU3RyaW5nIG9sZEZpZWxkTmFtZSA9IGZpZWxkTmFtZTsKLQkJZmllbGROYW1lID0gbmV3RmllbGROYW1lOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURV9fRklFTERfTkFNRSwgb2xkRmllbGROYW1lLCBmaWVsZE5hbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEFsaWFzKCkgewotCQlyZXR1cm4gYWxpYXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QWxpYXMoU3RyaW5nIG5ld0FsaWFzKSB7Ci0JCVN0cmluZyBvbGRBbGlhcyA9IGFsaWFzOwotCQlhbGlhcyA9IG5ld0FsaWFzOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURV9fQUxJQVMsIG9sZEFsaWFzLCBhbGlhcykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UGhvbmV0aWNBbGlhcygpIHsKLQkJcmV0dXJuIHBob25ldGljQWxpYXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UGhvbmV0aWNBbGlhcyhTdHJpbmcgbmV3UGhvbmV0aWNBbGlhcykgewotCQlTdHJpbmcgb2xkUGhvbmV0aWNBbGlhcyA9IHBob25ldGljQWxpYXM7Ci0JCXBob25ldGljQWxpYXMgPSBuZXdQaG9uZXRpY0FsaWFzOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURV9fUEhPTkVUSUNfQUxJQVMsIG9sZFBob25ldGljQWxpYXMsIHBob25ldGljQWxpYXMpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBnZXRSb2xsdXBUeXBlKCkgewotCQlyZXR1cm4gcm9sbHVwVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSb2xsdXBUeXBlKEJpZ0ludGVnZXIgbmV3Um9sbHVwVHlwZSkgewotCQlCaWdJbnRlZ2VyIG9sZFJvbGx1cFR5cGUgPSByb2xsdXBUeXBlOwotCQlyb2xsdXBUeXBlID0gbmV3Um9sbHVwVHlwZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEVfX1JPTExVUF9UWVBFLCBvbGRSb2xsdXBUeXBlLCByb2xsdXBUeXBlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0Q2FsY3VsYXRpb25UeXBlKCkgewotCQlyZXR1cm4gY2FsY3VsYXRpb25UeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENhbGN1bGF0aW9uVHlwZShCaWdJbnRlZ2VyIG5ld0NhbGN1bGF0aW9uVHlwZSkgewotCQlCaWdJbnRlZ2VyIG9sZENhbGN1bGF0aW9uVHlwZSA9IGNhbGN1bGF0aW9uVHlwZTsKLQkJY2FsY3VsYXRpb25UeXBlID0gbmV3Q2FsY3VsYXRpb25UeXBlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURV9fQ0FMQ1VMQVRJT05fVFlQRSwgb2xkQ2FsY3VsYXRpb25UeXBlLCBjYWxjdWxhdGlvblR5cGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEZvcm11bGEoKSB7Ci0JCXJldHVybiBmb3JtdWxhOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZvcm11bGEoU3RyaW5nIG5ld0Zvcm11bGEpIHsKLQkJU3RyaW5nIG9sZEZvcm11bGEgPSBmb3JtdWxhOwotCQlmb3JtdWxhID0gbmV3Rm9ybXVsYTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEVfX0ZPUk1VTEEsIG9sZEZvcm11bGEsIGZvcm11bGEpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1Jlc3RyaWN0VmFsdWVzKCkgewotCQlyZXR1cm4gcmVzdHJpY3RWYWx1ZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmVzdHJpY3RWYWx1ZXMoYm9vbGVhbiBuZXdSZXN0cmljdFZhbHVlcykgewotCQlib29sZWFuIG9sZFJlc3RyaWN0VmFsdWVzID0gcmVzdHJpY3RWYWx1ZXM7Ci0JCXJlc3RyaWN0VmFsdWVzID0gbmV3UmVzdHJpY3RWYWx1ZXM7Ci0JCWJvb2xlYW4gb2xkUmVzdHJpY3RWYWx1ZXNFU2V0ID0gcmVzdHJpY3RWYWx1ZXNFU2V0OwotCQlyZXN0cmljdFZhbHVlc0VTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURV9fUkVTVFJJQ1RfVkFMVUVTLCBvbGRSZXN0cmljdFZhbHVlcywgcmVzdHJpY3RWYWx1ZXMsICFvbGRSZXN0cmljdFZhbHVlc0VTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldFJlc3RyaWN0VmFsdWVzKCkgewotCQlib29sZWFuIG9sZFJlc3RyaWN0VmFsdWVzID0gcmVzdHJpY3RWYWx1ZXM7Ci0JCWJvb2xlYW4gb2xkUmVzdHJpY3RWYWx1ZXNFU2V0ID0gcmVzdHJpY3RWYWx1ZXNFU2V0OwotCQlyZXN0cmljdFZhbHVlcyA9IFJFU1RSSUNUX1ZBTFVFU19FREVGQVVMVDsKLQkJcmVzdHJpY3RWYWx1ZXNFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEVfX1JFU1RSSUNUX1ZBTFVFUywgb2xkUmVzdHJpY3RWYWx1ZXMsIFJFU1RSSUNUX1ZBTFVFU19FREVGQVVMVCwgb2xkUmVzdHJpY3RWYWx1ZXNFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRSZXN0cmljdFZhbHVlcygpIHsKLQkJcmV0dXJuIHJlc3RyaWN0VmFsdWVzRVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBnZXRWYWx1ZWxpc3RTb3J0T3JkZXIoKSB7Ci0JCXJldHVybiB2YWx1ZWxpc3RTb3J0T3JkZXI7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmFsdWVsaXN0U29ydE9yZGVyKEJpZ0ludGVnZXIgbmV3VmFsdWVsaXN0U29ydE9yZGVyKSB7Ci0JCUJpZ0ludGVnZXIgb2xkVmFsdWVsaXN0U29ydE9yZGVyID0gdmFsdWVsaXN0U29ydE9yZGVyOwotCQl2YWx1ZWxpc3RTb3J0T3JkZXIgPSBuZXdWYWx1ZWxpc3RTb3J0T3JkZXI7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFX19WQUxVRUxJU1RfU09SVF9PUkRFUiwgb2xkVmFsdWVsaXN0U29ydE9yZGVyLCB2YWx1ZWxpc3RTb3J0T3JkZXIpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0FwcGVuZE5ld1ZhbHVlcygpIHsKLQkJcmV0dXJuIGFwcGVuZE5ld1ZhbHVlczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBcHBlbmROZXdWYWx1ZXMoYm9vbGVhbiBuZXdBcHBlbmROZXdWYWx1ZXMpIHsKLQkJYm9vbGVhbiBvbGRBcHBlbmROZXdWYWx1ZXMgPSBhcHBlbmROZXdWYWx1ZXM7Ci0JCWFwcGVuZE5ld1ZhbHVlcyA9IG5ld0FwcGVuZE5ld1ZhbHVlczsKLQkJYm9vbGVhbiBvbGRBcHBlbmROZXdWYWx1ZXNFU2V0ID0gYXBwZW5kTmV3VmFsdWVzRVNldDsKLQkJYXBwZW5kTmV3VmFsdWVzRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFX19BUFBFTkRfTkVXX1ZBTFVFUywgb2xkQXBwZW5kTmV3VmFsdWVzLCBhcHBlbmROZXdWYWx1ZXMsICFvbGRBcHBlbmROZXdWYWx1ZXNFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRBcHBlbmROZXdWYWx1ZXMoKSB7Ci0JCWJvb2xlYW4gb2xkQXBwZW5kTmV3VmFsdWVzID0gYXBwZW5kTmV3VmFsdWVzOwotCQlib29sZWFuIG9sZEFwcGVuZE5ld1ZhbHVlc0VTZXQgPSBhcHBlbmROZXdWYWx1ZXNFU2V0OwotCQlhcHBlbmROZXdWYWx1ZXMgPSBBUFBFTkRfTkVXX1ZBTFVFU19FREVGQVVMVDsKLQkJYXBwZW5kTmV3VmFsdWVzRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFX19BUFBFTkRfTkVXX1ZBTFVFUywgb2xkQXBwZW5kTmV3VmFsdWVzLCBBUFBFTkRfTkVXX1ZBTFVFU19FREVGQVVMVCwgb2xkQXBwZW5kTmV3VmFsdWVzRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0QXBwZW5kTmV3VmFsdWVzKCkgewotCQlyZXR1cm4gYXBwZW5kTmV3VmFsdWVzRVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHQoKSB7Ci0JCXJldHVybiBkZWZhdWx0XzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZWZhdWx0KFN0cmluZyBuZXdEZWZhdWx0KSB7Ci0JCVN0cmluZyBvbGREZWZhdWx0ID0gZGVmYXVsdF87Ci0JCWRlZmF1bHRfID0gbmV3RGVmYXVsdDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEVfX0RFRkFVTFQsIG9sZERlZmF1bHQsIGRlZmF1bHRfKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFZhbHVlTGlzdCBnZXRWYWx1ZUxpc3QoKSB7Ci0JCXJldHVybiB2YWx1ZUxpc3Q7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0VmFsdWVMaXN0KFZhbHVlTGlzdCBuZXdWYWx1ZUxpc3QsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJVmFsdWVMaXN0IG9sZFZhbHVlTGlzdCA9IHZhbHVlTGlzdDsKLQkJdmFsdWVMaXN0ID0gbmV3VmFsdWVMaXN0OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURV9fVkFMVUVfTElTVCwgb2xkVmFsdWVMaXN0LCBuZXdWYWx1ZUxpc3QpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZhbHVlTGlzdChWYWx1ZUxpc3QgbmV3VmFsdWVMaXN0KSB7Ci0JCWlmIChuZXdWYWx1ZUxpc3QgIT0gdmFsdWVMaXN0KSB7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmICh2YWx1ZUxpc3QgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpdmFsdWVMaXN0KS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEVfX1ZBTFVFX0xJU1QsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld1ZhbHVlTGlzdCAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdWYWx1ZUxpc3QpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURV9fVkFMVUVfTElTVCwgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRWYWx1ZUxpc3QobmV3VmFsdWVMaXN0LCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFX19WQUxVRV9MSVNULCBuZXdWYWx1ZUxpc3QsIG5ld1ZhbHVlTGlzdCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEVfX1ZBTFVFX0xJU1Q6Ci0JCQkJCXJldHVybiBiYXNpY1NldFZhbHVlTGlzdChudWxsLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEVfX0ZJRUxEX0lEOgotCQkJCXJldHVybiBnZXRGaWVsZElEKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFX19GSUVMRF9OQU1FOgotCQkJCXJldHVybiBnZXRGaWVsZE5hbWUoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEVfX0FMSUFTOgotCQkJCXJldHVybiBnZXRBbGlhcygpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURV9fUEhPTkVUSUNfQUxJQVM6Ci0JCQkJcmV0dXJuIGdldFBob25ldGljQWxpYXMoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEVfX1JPTExVUF9UWVBFOgotCQkJCXJldHVybiBnZXRSb2xsdXBUeXBlKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFX19DQUxDVUxBVElPTl9UWVBFOgotCQkJCXJldHVybiBnZXRDYWxjdWxhdGlvblR5cGUoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEVfX0ZPUk1VTEE6Ci0JCQkJcmV0dXJuIGdldEZvcm11bGEoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEVfX1JFU1RSSUNUX1ZBTFVFUzoKLQkJCQlyZXR1cm4gaXNSZXN0cmljdFZhbHVlcygpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEVfX1ZBTFVFTElTVF9TT1JUX09SREVSOgotCQkJCXJldHVybiBnZXRWYWx1ZWxpc3RTb3J0T3JkZXIoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEVfX0FQUEVORF9ORVdfVkFMVUVTOgotCQkJCXJldHVybiBpc0FwcGVuZE5ld1ZhbHVlcygpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEVfX0RFRkFVTFQ6Ci0JCQkJcmV0dXJuIGdldERlZmF1bHQoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEVfX1ZBTFVFX0xJU1Q6Ci0JCQkJcmV0dXJuIGdldFZhbHVlTGlzdCgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEVfX0ZJRUxEX0lEOgotCQkJCXNldEZpZWxkSUQoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURV9fRklFTERfTkFNRToKLQkJCQlzZXRGaWVsZE5hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURV9fQUxJQVM6Ci0JCQkJc2V0QWxpYXMoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURV9fUEhPTkVUSUNfQUxJQVM6Ci0JCQkJc2V0UGhvbmV0aWNBbGlhcygoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFX19ST0xMVVBfVFlQRToKLQkJCQlzZXRSb2xsdXBUeXBlKChCaWdJbnRlZ2VyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFX19DQUxDVUxBVElPTl9UWVBFOgotCQkJCXNldENhbGN1bGF0aW9uVHlwZSgoQmlnSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURV9fRk9STVVMQToKLQkJCQlzZXRGb3JtdWxhKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEVfX1JFU1RSSUNUX1ZBTFVFUzoKLQkJCQlzZXRSZXN0cmljdFZhbHVlcygoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFX19WQUxVRUxJU1RfU09SVF9PUkRFUjoKLQkJCQlzZXRWYWx1ZWxpc3RTb3J0T3JkZXIoKEJpZ0ludGVnZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEVfX0FQUEVORF9ORVdfVkFMVUVTOgotCQkJCXNldEFwcGVuZE5ld1ZhbHVlcygoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFX19ERUZBVUxUOgotCQkJCXNldERlZmF1bHQoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURV9fVkFMVUVfTElTVDoKLQkJCQlzZXRWYWx1ZUxpc3QoKFZhbHVlTGlzdCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEVfX0ZJRUxEX0lEOgotCQkJCXNldEZpZWxkSUQoRklFTERfSURfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEVfX0ZJRUxEX05BTUU6Ci0JCQkJc2V0RmllbGROYW1lKEZJRUxEX05BTUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEVfX0FMSUFTOgotCQkJCXNldEFsaWFzKEFMSUFTX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFX19QSE9ORVRJQ19BTElBUzoKLQkJCQlzZXRQaG9uZXRpY0FsaWFzKFBIT05FVElDX0FMSUFTX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFX19ST0xMVVBfVFlQRToKLQkJCQlzZXRSb2xsdXBUeXBlKFJPTExVUF9UWVBFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFX19DQUxDVUxBVElPTl9UWVBFOgotCQkJCXNldENhbGN1bGF0aW9uVHlwZShDQUxDVUxBVElPTl9UWVBFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFX19GT1JNVUxBOgotCQkJCXNldEZvcm11bGEoRk9STVVMQV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURV9fUkVTVFJJQ1RfVkFMVUVTOgotCQkJCXVuc2V0UmVzdHJpY3RWYWx1ZXMoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFX19WQUxVRUxJU1RfU09SVF9PUkRFUjoKLQkJCQlzZXRWYWx1ZWxpc3RTb3J0T3JkZXIoVkFMVUVMSVNUX1NPUlRfT1JERVJfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEVfX0FQUEVORF9ORVdfVkFMVUVTOgotCQkJCXVuc2V0QXBwZW5kTmV3VmFsdWVzKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURV9fREVGQVVMVDoKLQkJCQlzZXREZWZhdWx0KERFRkFVTFRfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEVfX1ZBTFVFX0xJU1Q6Ci0JCQkJc2V0VmFsdWVMaXN0KChWYWx1ZUxpc3QpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFX19GSUVMRF9JRDoKLQkJCQlyZXR1cm4gRklFTERfSURfRURFRkFVTFQgPT0gbnVsbCA/IGZpZWxkSUQgIT0gbnVsbCA6ICFGSUVMRF9JRF9FREVGQVVMVC5lcXVhbHMoZmllbGRJRCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFX19GSUVMRF9OQU1FOgotCQkJCXJldHVybiBGSUVMRF9OQU1FX0VERUZBVUxUID09IG51bGwgPyBmaWVsZE5hbWUgIT0gbnVsbCA6ICFGSUVMRF9OQU1FX0VERUZBVUxULmVxdWFscyhmaWVsZE5hbWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURV9fQUxJQVM6Ci0JCQkJcmV0dXJuIEFMSUFTX0VERUZBVUxUID09IG51bGwgPyBhbGlhcyAhPSBudWxsIDogIUFMSUFTX0VERUZBVUxULmVxdWFscyhhbGlhcyk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFX19QSE9ORVRJQ19BTElBUzoKLQkJCQlyZXR1cm4gUEhPTkVUSUNfQUxJQVNfRURFRkFVTFQgPT0gbnVsbCA/IHBob25ldGljQWxpYXMgIT0gbnVsbCA6ICFQSE9ORVRJQ19BTElBU19FREVGQVVMVC5lcXVhbHMocGhvbmV0aWNBbGlhcyk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFX19ST0xMVVBfVFlQRToKLQkJCQlyZXR1cm4gUk9MTFVQX1RZUEVfRURFRkFVTFQgPT0gbnVsbCA/IHJvbGx1cFR5cGUgIT0gbnVsbCA6ICFST0xMVVBfVFlQRV9FREVGQVVMVC5lcXVhbHMocm9sbHVwVHlwZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFX19DQUxDVUxBVElPTl9UWVBFOgotCQkJCXJldHVybiBDQUxDVUxBVElPTl9UWVBFX0VERUZBVUxUID09IG51bGwgPyBjYWxjdWxhdGlvblR5cGUgIT0gbnVsbCA6ICFDQUxDVUxBVElPTl9UWVBFX0VERUZBVUxULmVxdWFscyhjYWxjdWxhdGlvblR5cGUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURV9fRk9STVVMQToKLQkJCQlyZXR1cm4gRk9STVVMQV9FREVGQVVMVCA9PSBudWxsID8gZm9ybXVsYSAhPSBudWxsIDogIUZPUk1VTEFfRURFRkFVTFQuZXF1YWxzKGZvcm11bGEpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURV9fUkVTVFJJQ1RfVkFMVUVTOgotCQkJCXJldHVybiBpc1NldFJlc3RyaWN0VmFsdWVzKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFX19WQUxVRUxJU1RfU09SVF9PUkRFUjoKLQkJCQlyZXR1cm4gVkFMVUVMSVNUX1NPUlRfT1JERVJfRURFRkFVTFQgPT0gbnVsbCA/IHZhbHVlbGlzdFNvcnRPcmRlciAhPSBudWxsIDogIVZBTFVFTElTVF9TT1JUX09SREVSX0VERUZBVUxULmVxdWFscyh2YWx1ZWxpc3RTb3J0T3JkZXIpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURV9fQVBQRU5EX05FV19WQUxVRVM6Ci0JCQkJcmV0dXJuIGlzU2V0QXBwZW5kTmV3VmFsdWVzKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFX19ERUZBVUxUOgotCQkJCXJldHVybiBERUZBVUxUX0VERUZBVUxUID09IG51bGwgPyBkZWZhdWx0XyAhPSBudWxsIDogIURFRkFVTFRfRURFRkFVTFQuZXF1YWxzKGRlZmF1bHRfKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEVfX1ZBTFVFX0xJU1Q6Ci0JCQkJcmV0dXJuIHZhbHVlTGlzdCAhPSBudWxsOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoZmllbGRJRDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZmllbGRJRCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZmllbGROYW1lOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChmaWVsZE5hbWUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGFsaWFzOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChhbGlhcyk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcGhvbmV0aWNBbGlhczogIik7Ci0JCXJlc3VsdC5hcHBlbmQocGhvbmV0aWNBbGlhcyk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcm9sbHVwVHlwZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQocm9sbHVwVHlwZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgY2FsY3VsYXRpb25UeXBlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChjYWxjdWxhdGlvblR5cGUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGZvcm11bGE6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGZvcm11bGEpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHJlc3RyaWN0VmFsdWVzOiAiKTsKLQkJaWYgKHJlc3RyaWN0VmFsdWVzRVNldCkgcmVzdWx0LmFwcGVuZChyZXN0cmljdFZhbHVlcyk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHZhbHVlbGlzdFNvcnRPcmRlcjogIik7Ci0JCXJlc3VsdC5hcHBlbmQodmFsdWVsaXN0U29ydE9yZGVyKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBhcHBlbmROZXdWYWx1ZXM6ICIpOwotCQlpZiAoYXBwZW5kTmV3VmFsdWVzRVNldCkgcmVzdWx0LmFwcGVuZChhcHBlbmROZXdWYWx1ZXMpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBkZWZhdWx0OiAiKTsKLQkJcmVzdWx0LmFwcGVuZChkZWZhdWx0Xyk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL0V4dGVuZGVkQXR0cmlidXRlSW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL0V4dGVuZGVkQXR0cmlidXRlc0ltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9FeHRlbmRlZEF0dHJpYnV0ZXNJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyZGUwOWIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL0V4dGVuZGVkQXR0cmlidXRlc0ltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0OSArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IEV4dGVuZGVkQXR0cmlidXRlc0ltcGwuamF2YSx2IDEuMSAyMDA4LzAxLzE1IDA4OjUxOjUzIGp0aGFtIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkV4dGVuZGVkIEF0dHJpYnV0ZXM8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5FeHRlbmRlZEF0dHJpYnV0ZXNJbXBsI2dldEV4dGVuZGVkQXR0cmlidXRlIDxlbT5FeHRlbmRlZCBBdHRyaWJ1dGU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBFeHRlbmRlZEF0dHJpYnV0ZXNJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBFeHRlbmRlZEF0dHJpYnV0ZXMgewotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEV4dGVuZGVkQXR0cmlidXRlKCkgPGVtPkV4dGVuZGVkIEF0dHJpYnV0ZTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRFeHRlbmRlZEF0dHJpYnV0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGV4dGVuZGVkQXR0cmlidXRlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFeHRlbmRlZEF0dHJpYnV0ZXNJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0RXh0ZW5kZWRBdHRyaWJ1dGVzKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldEV4dGVuZGVkQXR0cmlidXRlKCkgewotCQlpZiAoZXh0ZW5kZWRBdHRyaWJ1dGUgPT0gbnVsbCkgewotCQkJZXh0ZW5kZWRBdHRyaWJ1dGUgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoRXh0ZW5kZWRBdHRyaWJ1dGUuY2xhc3MsIHRoaXMsIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFU19fRVhURU5ERURfQVRUUklCVVRFKTsKLQkJfQotCQlyZXR1cm4gZXh0ZW5kZWRBdHRyaWJ1dGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURVNfX0VYVEVOREVEX0FUVFJJQlVURToKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRFeHRlbmRlZEF0dHJpYnV0ZSgpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFU19fRVhURU5ERURfQVRUUklCVVRFOgotCQkJCXJldHVybiBnZXRFeHRlbmRlZEF0dHJpYnV0ZSgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEVTX19FWFRFTkRFRF9BVFRSSUJVVEU6Ci0JCQkJZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUoKS5jbGVhcigpOwotCQkJCWdldEV4dGVuZGVkQXR0cmlidXRlKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURVNfX0VYVEVOREVEX0FUVFJJQlVURToKLQkJCQlnZXRFeHRlbmRlZEF0dHJpYnV0ZSgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFU19fRVhURU5ERURfQVRUUklCVVRFOgotCQkJCXJldHVybiBleHRlbmRlZEF0dHJpYnV0ZSAhPSBudWxsICYmICFleHRlbmRlZEF0dHJpYnV0ZS5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotfSAvL0V4dGVuZGVkQXR0cmlidXRlc0ltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9NYXNrSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL01hc2tJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2MzM2MzUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL01hc2tJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMjMgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBNYXNrSW1wbC5qYXZhLHYgMS4xIDIwMDgvMDEvMTUgMDg6NTE6NTMganRoYW0gRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGw7Ci0KLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5NYXNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk1hc2s8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5NYXNrSW1wbCNnZXRMZXZlbCA8ZW0+TGV2ZWw8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5NYXNrSW1wbCNnZXRUeXBlIDxlbT5UeXBlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTWFza0ltcGwjZ2V0TGVuZ3RoIDxlbT5MZW5ndGg8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5NYXNrSW1wbCNnZXRTZXBhcmF0b3IgPGVtPlNlcGFyYXRvcjwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIE1hc2tJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBNYXNrIHsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TGV2ZWwoKSA8ZW0+TGV2ZWw8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldExldmVsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0ludGVnZXIgTEVWRUxfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TGV2ZWwoKSA8ZW0+TGV2ZWw8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldExldmVsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnSW50ZWdlciBsZXZlbCA9IExFVkVMX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFR5cGUoKSA8ZW0+VHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdJbnRlZ2VyIFRZUEVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VHlwZSgpIDxlbT5UeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnSW50ZWdlciB0eXBlID0gVFlQRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRMZW5ndGgoKSA8ZW0+TGVuZ3RoPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRMZW5ndGgoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBMRU5HVEhfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TGVuZ3RoKCkgPGVtPkxlbmd0aDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TGVuZ3RoKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnSW50ZWdlciBsZW5ndGggPSBMRU5HVEhfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U2VwYXJhdG9yKCkgPGVtPlNlcGFyYXRvcjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U2VwYXJhdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBTRVBBUkFUT1JfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U2VwYXJhdG9yKCkgPGVtPlNlcGFyYXRvcjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U2VwYXJhdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHNlcGFyYXRvciA9IFNFUEFSQVRPUl9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBNYXNrSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldE1hc2soKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBnZXRMZXZlbCgpIHsKLQkJcmV0dXJuIGxldmVsOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExldmVsKEJpZ0ludGVnZXIgbmV3TGV2ZWwpIHsKLQkJQmlnSW50ZWdlciBvbGRMZXZlbCA9IGxldmVsOwotCQlsZXZlbCA9IG5ld0xldmVsOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLk1BU0tfX0xFVkVMLCBvbGRMZXZlbCwgbGV2ZWwpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBnZXRUeXBlKCkgewotCQlyZXR1cm4gdHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUeXBlKEJpZ0ludGVnZXIgbmV3VHlwZSkgewotCQlCaWdJbnRlZ2VyIG9sZFR5cGUgPSB0eXBlOwotCQl0eXBlID0gbmV3VHlwZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5NQVNLX19UWVBFLCBvbGRUeXBlLCB0eXBlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0TGVuZ3RoKCkgewotCQlyZXR1cm4gbGVuZ3RoOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExlbmd0aChCaWdJbnRlZ2VyIG5ld0xlbmd0aCkgewotCQlCaWdJbnRlZ2VyIG9sZExlbmd0aCA9IGxlbmd0aDsKLQkJbGVuZ3RoID0gbmV3TGVuZ3RoOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLk1BU0tfX0xFTkdUSCwgb2xkTGVuZ3RoLCBsZW5ndGgpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFNlcGFyYXRvcigpIHsKLQkJcmV0dXJuIHNlcGFyYXRvcjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTZXBhcmF0b3IoU3RyaW5nIG5ld1NlcGFyYXRvcikgewotCQlTdHJpbmcgb2xkU2VwYXJhdG9yID0gc2VwYXJhdG9yOwotCQlzZXBhcmF0b3IgPSBuZXdTZXBhcmF0b3I7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuTUFTS19fU0VQQVJBVE9SLCBvbGRTZXBhcmF0b3IsIHNlcGFyYXRvcikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5NQVNLX19MRVZFTDoKLQkJCQlyZXR1cm4gZ2V0TGV2ZWwoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5NQVNLX19UWVBFOgotCQkJCXJldHVybiBnZXRUeXBlKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuTUFTS19fTEVOR1RIOgotCQkJCXJldHVybiBnZXRMZW5ndGgoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5NQVNLX19TRVBBUkFUT1I6Ci0JCQkJcmV0dXJuIGdldFNlcGFyYXRvcigpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5NQVNLX19MRVZFTDoKLQkJCQlzZXRMZXZlbCgoQmlnSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk1BU0tfX1RZUEU6Ci0JCQkJc2V0VHlwZSgoQmlnSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk1BU0tfX0xFTkdUSDoKLQkJCQlzZXRMZW5ndGgoKEJpZ0ludGVnZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5NQVNLX19TRVBBUkFUT1I6Ci0JCQkJc2V0U2VwYXJhdG9yKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuTUFTS19fTEVWRUw6Ci0JCQkJc2V0TGV2ZWwoTEVWRUxfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5NQVNLX19UWVBFOgotCQkJCXNldFR5cGUoVFlQRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk1BU0tfX0xFTkdUSDoKLQkJCQlzZXRMZW5ndGgoTEVOR1RIX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuTUFTS19fU0VQQVJBVE9SOgotCQkJCXNldFNlcGFyYXRvcihTRVBBUkFUT1JfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk1BU0tfX0xFVkVMOgotCQkJCXJldHVybiBMRVZFTF9FREVGQVVMVCA9PSBudWxsID8gbGV2ZWwgIT0gbnVsbCA6ICFMRVZFTF9FREVGQVVMVC5lcXVhbHMobGV2ZWwpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk1BU0tfX1RZUEU6Ci0JCQkJcmV0dXJuIFRZUEVfRURFRkFVTFQgPT0gbnVsbCA/IHR5cGUgIT0gbnVsbCA6ICFUWVBFX0VERUZBVUxULmVxdWFscyh0eXBlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5NQVNLX19MRU5HVEg6Ci0JCQkJcmV0dXJuIExFTkdUSF9FREVGQVVMVCA9PSBudWxsID8gbGVuZ3RoICE9IG51bGwgOiAhTEVOR1RIX0VERUZBVUxULmVxdWFscyhsZW5ndGgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk1BU0tfX1NFUEFSQVRPUjoKLQkJCQlyZXR1cm4gU0VQQVJBVE9SX0VERUZBVUxUID09IG51bGwgPyBzZXBhcmF0b3IgIT0gbnVsbCA6ICFTRVBBUkFUT1JfRURFRkFVTFQuZXF1YWxzKHNlcGFyYXRvcik7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChsZXZlbDogIik7Ci0JCXJlc3VsdC5hcHBlbmQobGV2ZWwpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHR5cGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHR5cGUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGxlbmd0aDogIik7Ci0JCXJlc3VsdC5hcHBlbmQobGVuZ3RoKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBzZXBhcmF0b3I6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHNlcGFyYXRvcik7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL01hc2tJbXBsCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvTWFza3NJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvTWFza3NJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3YTdlZjguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL01hc2tzSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ5ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogTWFza3NJbXBsLmphdmEsdiAxLjEgMjAwOC8wMS8xNSAwODo1MTo1MyBqdGhhbSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5NYXNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTWFza3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+TWFza3M8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5NYXNrc0ltcGwjZ2V0TWFzayA8ZW0+TWFzazwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIE1hc2tzSW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgTWFza3MgewotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1hc2soKSA8ZW0+TWFzazwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRNYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgbWFzayA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTWFza3NJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWFza3MoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0TWFzaygpIHsKLQkJaWYgKG1hc2sgPT0gbnVsbCkgewotCQkJbWFzayA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChNYXNrLmNsYXNzLCB0aGlzLCBNc3Byb2plY3RQYWNrYWdlLk1BU0tTX19NQVNLKTsKLQkJfQotCQlyZXR1cm4gbWFzazsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuTUFTS1NfX01BU0s6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0TWFzaygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuTUFTS1NfX01BU0s6Ci0JCQkJcmV0dXJuIGdldE1hc2soKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuTUFTS1NfX01BU0s6Ci0JCQkJZ2V0TWFzaygpLmNsZWFyKCk7Ci0JCQkJZ2V0TWFzaygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5NQVNLU19fTUFTSzoKLQkJCQlnZXRNYXNrKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5NQVNLU19fTUFTSzoKLQkJCQlyZXR1cm4gbWFzayAhPSBudWxsICYmICFtYXNrLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi19IC8vTWFza3NJbXBsCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvTXNwcm9qZWN0RmFjdG9yeUltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9Nc3Byb2plY3RGYWN0b3J5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMTAyY2ZlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9Nc3Byb2plY3RGYWN0b3J5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjM0NCArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IE1zcHJvamVjdEZhY3RvcnlJbXBsLmphdmEsdiAxLjEgMjAwOC8wMS8xNSAwODo1MTo1MyBqdGhhbSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbDsKLQotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRURhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuWE1MVHlwZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlhNTFR5cGVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXZhaWxhYmlsaXR5UGVyaW9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXZhaWxhYmlsaXR5UGVyaW9kczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQ2FsZW5kYXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5DYWxlbmRhcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Eb2N1bWVudFJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlMjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlMzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlNDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1hc2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5NYXNrczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZTI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZTM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5QcmVkZWNlc3Nvckxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmF0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJhdGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFza3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UaW1lUGVyaW9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGltZXBoYXNlZERhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVmFsdWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5WYWx1ZTI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5WYWx1ZUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5WYWx1ZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5XQlNNYXNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV0JTTWFza3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5XZWVrRGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV2Vla0RheXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Xb3JraW5nVGltZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldvcmtpbmdUaW1lczsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIDxiPkZhY3Rvcnk8L2I+LgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBNc3Byb2plY3RGYWN0b3J5SW1wbCBleHRlbmRzIEVGYWN0b3J5SW1wbCBpbXBsZW1lbnRzIE1zcHJvamVjdEZhY3RvcnkgewotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGZhY3RvcnkuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE1zcHJvamVjdEZhY3RvcnlJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFT2JqZWN0IGNyZWF0ZShFQ2xhc3MgZUNsYXNzKSB7Ci0JCXN3aXRjaCAoZUNsYXNzLmdldENsYXNzaWZpZXJJRCgpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVDogcmV0dXJuIGNyZWF0ZUFzc2lnbm1lbnQoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UUzogcmV0dXJuIGNyZWF0ZUFzc2lnbm1lbnRzKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVZBSUxBQklMSVRZX1BFUklPRDogcmV0dXJuIGNyZWF0ZUF2YWlsYWJpbGl0eVBlcmlvZCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFWQUlMQUJJTElUWV9QRVJJT0RTOiByZXR1cm4gY3JlYXRlQXZhaWxhYmlsaXR5UGVyaW9kcygpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FOiByZXR1cm4gY3JlYXRlQmFzZWxpbmUoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORTI6IHJldHVybiBjcmVhdGVCYXNlbGluZTIoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORTM6IHJldHVybiBjcmVhdGVCYXNlbGluZTMoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5DQUxFTkRBUjogcmV0dXJuIGNyZWF0ZUNhbGVuZGFyKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQ0FMRU5EQVJTOiByZXR1cm4gY3JlYXRlQ2FsZW5kYXJzKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRE9DVU1FTlRfUk9PVDogcmV0dXJuIGNyZWF0ZURvY3VtZW50Um9vdCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURTogcmV0dXJuIGNyZWF0ZUV4dGVuZGVkQXR0cmlidXRlKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFMjogcmV0dXJuIGNyZWF0ZUV4dGVuZGVkQXR0cmlidXRlMigpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURTM6IHJldHVybiBjcmVhdGVFeHRlbmRlZEF0dHJpYnV0ZTMoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEU0OiByZXR1cm4gY3JlYXRlRXh0ZW5kZWRBdHRyaWJ1dGU0KCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFUzogcmV0dXJuIGNyZWF0ZUV4dGVuZGVkQXR0cmlidXRlcygpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk1BU0s6IHJldHVybiBjcmVhdGVNYXNrKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuTUFTS1M6IHJldHVybiBjcmVhdGVNYXNrcygpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERTogcmV0dXJuIGNyZWF0ZU91dGxpbmVDb2RlKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuT1VUTElORV9DT0RFMjogcmV0dXJuIGNyZWF0ZU91dGxpbmVDb2RlMigpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERTM6IHJldHVybiBjcmVhdGVPdXRsaW5lQ29kZTMoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREVTOiByZXR1cm4gY3JlYXRlT3V0bGluZUNvZGVzKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJFREVDRVNTT1JfTElOSzogcmV0dXJuIGNyZWF0ZVByZWRlY2Vzc29yTGluaygpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1Q6IHJldHVybiBjcmVhdGVQcm9qZWN0KCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkFURTogcmV0dXJuIGNyZWF0ZVJhdGUoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SQVRFUzogcmV0dXJuIGNyZWF0ZVJhdGVzKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0U6IHJldHVybiBjcmVhdGVSZXNvdXJjZSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFUzogcmV0dXJuIGNyZWF0ZVJlc291cmNlcygpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0s6IHJldHVybiBjcmVhdGVUYXNrKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS1M6IHJldHVybiBjcmVhdGVUYXNrcygpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRJTUVfUEVSSU9EOiByZXR1cm4gY3JlYXRlVGltZVBlcmlvZCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRJTUVQSEFTRURfREFUQV9UWVBFOiByZXR1cm4gY3JlYXRlVGltZXBoYXNlZERhdGFUeXBlKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVkFMVUU6IHJldHVybiBjcmVhdGVWYWx1ZSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlZBTFVFMjogcmV0dXJuIGNyZWF0ZVZhbHVlMigpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlZBTFVFX0xJU1Q6IHJldHVybiBjcmVhdGVWYWx1ZUxpc3QoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5WQUxVRVM6IHJldHVybiBjcmVhdGVWYWx1ZXMoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5XQlNfTUFTSzogcmV0dXJuIGNyZWF0ZVdCU01hc2soKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5XQlNfTUFTS1M6IHJldHVybiBjcmVhdGVXQlNNYXNrcygpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLldFRUtfREFZOiByZXR1cm4gY3JlYXRlV2Vla0RheSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLldFRUtfREFZUzogcmV0dXJuIGNyZWF0ZVdlZWtEYXlzKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuV09SS0lOR19USU1FOiByZXR1cm4gY3JlYXRlV29ya2luZ1RpbWUoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5XT1JLSU5HX1RJTUVTOiByZXR1cm4gY3JlYXRlV29ya2luZ1RpbWVzKCk7Ci0JCQlkZWZhdWx0OgotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBjbGFzcyAnIiArIGVDbGFzcy5nZXROYW1lKCkgKyAiJyBpcyBub3QgYSB2YWxpZCBjbGFzc2lmaWVyIik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNyZWF0ZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlzd2l0Y2ggKGVEYXRhVHlwZS5nZXRDbGFzc2lmaWVySUQoKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFDQ1JVRV9BVDoKLQkJCQlyZXR1cm4gY3JlYXRlQWNjcnVlQXRGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BQ1RJVkVfRElSRUNUT1JZX0dVSURfVFlQRToKLQkJCQlyZXR1cm4gY3JlYXRlQWN0aXZlRGlyZWN0b3J5R1VJRFR5cGVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BTElBU19UWVBFOgotCQkJCXJldHVybiBjcmVhdGVBbGlhc1R5cGVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BVVRIT1JfVFlQRToKLQkJCQlyZXR1cm4gY3JlYXRlQXV0aG9yVHlwZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FX0ZPUl9FQVJORURfVkFMVUVfVFlQRToKLQkJCQlyZXR1cm4gY3JlYXRlQmFzZWxpbmVGb3JFYXJuZWRWYWx1ZVR5cGVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CT09LSU5HX1RZUEVfVFlQRToKLQkJCQlyZXR1cm4gY3JlYXRlQm9va2luZ1R5cGVUeXBlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQk9PS0lOR19UWVBFX1RZUEUxOgotCQkJCXJldHVybiBjcmVhdGVCb29raW5nVHlwZVR5cGUxRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQ0FMQ1VMQVRJT05fVFlQRV9UWVBFOgotCQkJCXJldHVybiBjcmVhdGVDYWxjdWxhdGlvblR5cGVUeXBlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQ0FURUdPUllfVFlQRToKLQkJCQlyZXR1cm4gY3JlYXRlQ2F0ZWdvcnlUeXBlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQ09ERV9UWVBFOgotCQkJCXJldHVybiBjcmVhdGVDb2RlVHlwZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkNPTVBBTllfVFlQRToKLQkJCQlyZXR1cm4gY3JlYXRlQ29tcGFueVR5cGVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5DT05TVFJBSU5UX1RZUEVfVFlQRToKLQkJCQlyZXR1cm4gY3JlYXRlQ29uc3RyYWludFR5cGVUeXBlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQ09OVEFDVF9UWVBFOgotCQkJCXJldHVybiBjcmVhdGVDb250YWN0VHlwZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkNPU1RfUkFURV9UQUJMRV9UWVBFOgotCQkJCXJldHVybiBjcmVhdGVDb3N0UmF0ZVRhYmxlVHlwZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkNVUlJFTkNZX1NZTUJPTF9QT1NJVElPTl9UWVBFOgotCQkJCXJldHVybiBjcmVhdGVDdXJyZW5jeVN5bWJvbFBvc2l0aW9uVHlwZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkNVUlJFTkNZX1NZTUJPTF9UWVBFOgotCQkJCXJldHVybiBjcmVhdGVDdXJyZW5jeVN5bWJvbFR5cGVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5EQVlfVFlQRV9UWVBFOgotCQkJCXJldHVybiBjcmVhdGVEYXlUeXBlVHlwZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkRFRkFVTFRfRklYRURfQ09TVF9BQ0NSVUFMX1RZUEU6Ci0JCQkJcmV0dXJuIGNyZWF0ZURlZmF1bHRGaXhlZENvc3RBY2NydWFsVHlwZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkRFRkFVTFRfVEFTS19FVl9NRVRIT0RfVFlQRToKLQkJCQlyZXR1cm4gY3JlYXRlRGVmYXVsdFRhc2tFVk1ldGhvZFR5cGVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5ERUZBVUxUX1RBU0tfVFlQRV9UWVBFOgotCQkJCXJldHVybiBjcmVhdGVEZWZhdWx0VGFza1R5cGVUeXBlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRFVSQVRJT05fRk9STUFUX1RZUEU6Ci0JCQkJcmV0dXJuIGNyZWF0ZUR1cmF0aW9uRm9ybWF0VHlwZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkRVUkFUSU9OX0ZPUk1BVF9UWVBFMToKLQkJCQlyZXR1cm4gY3JlYXRlRHVyYXRpb25Gb3JtYXRUeXBlMUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkRVUkFUSU9OX0ZPUk1BVF9UWVBFMjoKLQkJCQlyZXR1cm4gY3JlYXRlRHVyYXRpb25Gb3JtYXRUeXBlMkZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkRVUkFUSU9OX0ZPUk1BVF9UWVBFMzoKLQkJCQlyZXR1cm4gY3JlYXRlRHVyYXRpb25Gb3JtYXRUeXBlM0Zyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkRVUkFUSU9OX0ZPUk1BVF9UWVBFNDoKLQkJCQlyZXR1cm4gY3JlYXRlRHVyYXRpb25Gb3JtYXRUeXBlNEZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkRVUkFUSU9OX0ZPUk1BVF9UWVBFNToKLQkJCQlyZXR1cm4gY3JlYXRlRHVyYXRpb25Gb3JtYXRUeXBlNUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVBUk5FRF9WQUxVRV9NRVRIT0RfVFlQRToKLQkJCQlyZXR1cm4gY3JlYXRlRWFybmVkVmFsdWVNZXRob2RUeXBlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRUFSTkVEX1ZBTFVFX01FVEhPRF9UWVBFMToKLQkJCQlyZXR1cm4gY3JlYXRlRWFybmVkVmFsdWVNZXRob2RUeXBlMUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVNQUlMX0FERFJFU1NfVFlQRToKLQkJCQlyZXR1cm4gY3JlYXRlRW1haWxBZGRyZXNzVHlwZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVSTkFMX1RBU0tfUFJPSkVDVF9UWVBFOgotCQkJCXJldHVybiBjcmVhdGVFeHRlcm5hbFRhc2tQcm9qZWN0VHlwZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkZJWEVEX0NPU1RfQUNDUlVBTF9UWVBFOgotCQkJCXJldHVybiBjcmVhdGVGaXhlZENvc3RBY2NydWFsVHlwZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkZZX1NUQVJUX0RBVEVfVFlQRToKLQkJCQlyZXR1cm4gY3JlYXRlRllTdGFydERhdGVUeXBlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuR1JPVVBfVFlQRToKLQkJCQlyZXR1cm4gY3JlYXRlR3JvdXBUeXBlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuSFlQRVJMSU5LX0FERFJFU1NfVFlQRToKLQkJCQlyZXR1cm4gY3JlYXRlSHlwZXJsaW5rQWRkcmVzc1R5cGVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5IWVBFUkxJTktfQUREUkVTU19UWVBFMToKLQkJCQlyZXR1cm4gY3JlYXRlSHlwZXJsaW5rQWRkcmVzc1R5cGUxRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuSFlQRVJMSU5LX0FERFJFU1NfVFlQRTI6Ci0JCQkJcmV0dXJuIGNyZWF0ZUh5cGVybGlua0FkZHJlc3NUeXBlMkZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkhZUEVSTElOS19TVUJfQUREUkVTU19UWVBFOgotCQkJCXJldHVybiBjcmVhdGVIeXBlcmxpbmtTdWJBZGRyZXNzVHlwZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkhZUEVSTElOS19TVUJfQUREUkVTU19UWVBFMToKLQkJCQlyZXR1cm4gY3JlYXRlSHlwZXJsaW5rU3ViQWRkcmVzc1R5cGUxRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuSFlQRVJMSU5LX1NVQl9BRERSRVNTX1RZUEUyOgotCQkJCXJldHVybiBjcmVhdGVIeXBlcmxpbmtTdWJBZGRyZXNzVHlwZTJGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5IWVBFUkxJTktfVFlQRToKLQkJCQlyZXR1cm4gY3JlYXRlSHlwZXJsaW5rVHlwZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkhZUEVSTElOS19UWVBFMToKLQkJCQlyZXR1cm4gY3JlYXRlSHlwZXJsaW5rVHlwZTFGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5IWVBFUkxJTktfVFlQRTI6Ci0JCQkJcmV0dXJuIGNyZWF0ZUh5cGVybGlua1R5cGUyRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuSU5JVElBTFNfVFlQRToKLQkJCQlyZXR1cm4gY3JlYXRlSW5pdGlhbHNUeXBlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuTEFHX0ZPUk1BVF9UWVBFOgotCQkJCXJldHVybiBjcmVhdGVMYWdGb3JtYXRUeXBlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuTEVWRUxJTkdfREVMQVlfRk9STUFUX1RZUEU6Ci0JCQkJcmV0dXJuIGNyZWF0ZUxldmVsaW5nRGVsYXlGb3JtYXRUeXBlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuTEVWRUxJTkdfREVMQVlfRk9STUFUX1RZUEUxOgotCQkJCXJldHVybiBjcmVhdGVMZXZlbGluZ0RlbGF5Rm9ybWF0VHlwZTFGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5NQU5BR0VSX1RZUEU6Ci0JCQkJcmV0dXJuIGNyZWF0ZU1hbmFnZXJUeXBlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuTUFURVJJQUxfTEFCRUxfVFlQRToKLQkJCQlyZXR1cm4gY3JlYXRlTWF0ZXJpYWxMYWJlbFR5cGVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5OQU1FX1RZUEU6Ci0JCQkJcmV0dXJuIGNyZWF0ZU5hbWVUeXBlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuTkFNRV9UWVBFMToKLQkJCQlyZXR1cm4gY3JlYXRlTmFtZVR5cGUxRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuTkFNRV9UWVBFMjoKLQkJCQlyZXR1cm4gY3JlYXRlTmFtZVR5cGUyRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuTkFNRV9UWVBFMzoKLQkJCQlyZXR1cm4gY3JlYXRlTmFtZVR5cGUzRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuTkVXX1RBU0tfU1RBUlRfREFURV9UWVBFOgotCQkJCXJldHVybiBjcmVhdGVOZXdUYXNrU3RhcnREYXRlVHlwZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk5UX0FDQ09VTlRfVFlQRToKLQkJCQlyZXR1cm4gY3JlYXRlTlRBY2NvdW50VHlwZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfTlVNQkVSX1RZUEU6Ci0JCQkJcmV0dXJuIGNyZWF0ZU91dGxpbmVOdW1iZXJUeXBlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuT1ZFUlRJTUVfUkFURV9GT1JNQVRfVFlQRToKLQkJCQlyZXR1cm4gY3JlYXRlT3ZlcnRpbWVSYXRlRm9ybWF0VHlwZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk9WRVJUSU1FX1JBVEVfRk9STUFUX1RZUEUxOgotCQkJCXJldHVybiBjcmVhdGVPdmVydGltZVJhdGVGb3JtYXRUeXBlMUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBIT05FVElDX0FMSUFTX1RZUEU6Ci0JCQkJcmV0dXJuIGNyZWF0ZVBob25ldGljQWxpYXNUeXBlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUEhPTkVUSUNTX1RZUEU6Ci0JCQkJcmV0dXJuIGNyZWF0ZVBob25ldGljc1R5cGVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUkVGSVhfVFlQRToKLQkJCQlyZXR1cm4gY3JlYXRlUHJlZml4VHlwZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJBVEVfVEFCTEVfVFlQRToKLQkJCQlyZXR1cm4gY3JlYXRlUmF0ZVRhYmxlVHlwZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJPTExVUF9UWVBFX1RZUEU6Ci0JCQkJcmV0dXJuIGNyZWF0ZVJvbGx1cFR5cGVUeXBlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuU1RBTkRBUkRfUkFURV9GT1JNQVRfVFlQRToKLQkJCQlyZXR1cm4gY3JlYXRlU3RhbmRhcmRSYXRlRm9ybWF0VHlwZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlNUQU5EQVJEX1JBVEVfRk9STUFUX1RZUEUxOgotCQkJCXJldHVybiBjcmVhdGVTdGFuZGFyZFJhdGVGb3JtYXRUeXBlMUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlNVQkpFQ1RfVFlQRToKLQkJCQlyZXR1cm4gY3JlYXRlU3ViamVjdFR5cGVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5TVUJQUk9KRUNUX05BTUVfVFlQRToKLQkJCQlyZXR1cm4gY3JlYXRlU3VicHJvamVjdE5hbWVUeXBlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVElUTEVfVFlQRToKLQkJCQlyZXR1cm4gY3JlYXRlVGl0bGVUeXBlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVFlQRV9UWVBFOgotCQkJCXJldHVybiBjcmVhdGVUeXBlVHlwZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRZUEVfVFlQRTE6Ci0JCQkJcmV0dXJuIGNyZWF0ZVR5cGVUeXBlMUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRZUEVfVFlQRTI6Ci0JCQkJcmV0dXJuIGNyZWF0ZVR5cGVUeXBlMkZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRZUEVfVFlQRTM6Ci0JCQkJcmV0dXJuIGNyZWF0ZVR5cGVUeXBlM0Zyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRZUEVfVFlQRTQ6Ci0JCQkJcmV0dXJuIGNyZWF0ZVR5cGVUeXBlNEZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRZUEVfVFlQRTU6Ci0JCQkJcmV0dXJuIGNyZWF0ZVR5cGVUeXBlNUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlVJRF9UWVBFOgotCQkJCXJldHVybiBjcmVhdGVVSURUeXBlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVU5JVF9UWVBFOgotCQkJCXJldHVybiBjcmVhdGVVbml0VHlwZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlZBTFVFTElTVF9TT1JUX09SREVSX1RZUEU6Ci0JCQkJcmV0dXJuIGNyZWF0ZVZhbHVlbGlzdFNvcnRPcmRlclR5cGVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5XRUVLX1NUQVJUX0RBWV9UWVBFOgotCQkJCXJldHVybiBjcmVhdGVXZWVrU3RhcnREYXlUeXBlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuV09SS19DT05UT1VSX1RZUEU6Ci0JCQkJcmV0dXJuIGNyZWF0ZVdvcmtDb250b3VyVHlwZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLldPUktfRk9STUFUX1RZUEU6Ci0JCQkJcmV0dXJuIGNyZWF0ZVdvcmtGb3JtYXRUeXBlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuV09SS19HUk9VUF9UWVBFOgotCQkJCXJldHVybiBjcmVhdGVXb3JrR3JvdXBUeXBlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQlkZWZhdWx0OgotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBkYXRhdHlwZSAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyBpcyBub3QgYSB2YWxpZCBjbGFzc2lmaWVyIik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlzd2l0Y2ggKGVEYXRhVHlwZS5nZXRDbGFzc2lmaWVySUQoKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFDQ1JVRV9BVDoKLQkJCQlyZXR1cm4gY29udmVydEFjY3J1ZUF0VG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BQ1RJVkVfRElSRUNUT1JZX0dVSURfVFlQRToKLQkJCQlyZXR1cm4gY29udmVydEFjdGl2ZURpcmVjdG9yeUdVSURUeXBlVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BTElBU19UWVBFOgotCQkJCXJldHVybiBjb252ZXJ0QWxpYXNUeXBlVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BVVRIT1JfVFlQRToKLQkJCQlyZXR1cm4gY29udmVydEF1dGhvclR5cGVUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FX0ZPUl9FQVJORURfVkFMVUVfVFlQRToKLQkJCQlyZXR1cm4gY29udmVydEJhc2VsaW5lRm9yRWFybmVkVmFsdWVUeXBlVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CT09LSU5HX1RZUEVfVFlQRToKLQkJCQlyZXR1cm4gY29udmVydEJvb2tpbmdUeXBlVHlwZVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQk9PS0lOR19UWVBFX1RZUEUxOgotCQkJCXJldHVybiBjb252ZXJ0Qm9va2luZ1R5cGVUeXBlMVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQ0FMQ1VMQVRJT05fVFlQRV9UWVBFOgotCQkJCXJldHVybiBjb252ZXJ0Q2FsY3VsYXRpb25UeXBlVHlwZVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQ0FURUdPUllfVFlQRToKLQkJCQlyZXR1cm4gY29udmVydENhdGVnb3J5VHlwZVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQ09ERV9UWVBFOgotCQkJCXJldHVybiBjb252ZXJ0Q29kZVR5cGVUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkNPTVBBTllfVFlQRToKLQkJCQlyZXR1cm4gY29udmVydENvbXBhbnlUeXBlVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5DT05TVFJBSU5UX1RZUEVfVFlQRToKLQkJCQlyZXR1cm4gY29udmVydENvbnN0cmFpbnRUeXBlVHlwZVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQ09OVEFDVF9UWVBFOgotCQkJCXJldHVybiBjb252ZXJ0Q29udGFjdFR5cGVUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkNPU1RfUkFURV9UQUJMRV9UWVBFOgotCQkJCXJldHVybiBjb252ZXJ0Q29zdFJhdGVUYWJsZVR5cGVUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkNVUlJFTkNZX1NZTUJPTF9QT1NJVElPTl9UWVBFOgotCQkJCXJldHVybiBjb252ZXJ0Q3VycmVuY3lTeW1ib2xQb3NpdGlvblR5cGVUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkNVUlJFTkNZX1NZTUJPTF9UWVBFOgotCQkJCXJldHVybiBjb252ZXJ0Q3VycmVuY3lTeW1ib2xUeXBlVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5EQVlfVFlQRV9UWVBFOgotCQkJCXJldHVybiBjb252ZXJ0RGF5VHlwZVR5cGVUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkRFRkFVTFRfRklYRURfQ09TVF9BQ0NSVUFMX1RZUEU6Ci0JCQkJcmV0dXJuIGNvbnZlcnREZWZhdWx0Rml4ZWRDb3N0QWNjcnVhbFR5cGVUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkRFRkFVTFRfVEFTS19FVl9NRVRIT0RfVFlQRToKLQkJCQlyZXR1cm4gY29udmVydERlZmF1bHRUYXNrRVZNZXRob2RUeXBlVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5ERUZBVUxUX1RBU0tfVFlQRV9UWVBFOgotCQkJCXJldHVybiBjb252ZXJ0RGVmYXVsdFRhc2tUeXBlVHlwZVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRFVSQVRJT05fRk9STUFUX1RZUEU6Ci0JCQkJcmV0dXJuIGNvbnZlcnREdXJhdGlvbkZvcm1hdFR5cGVUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkRVUkFUSU9OX0ZPUk1BVF9UWVBFMToKLQkJCQlyZXR1cm4gY29udmVydER1cmF0aW9uRm9ybWF0VHlwZTFUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkRVUkFUSU9OX0ZPUk1BVF9UWVBFMjoKLQkJCQlyZXR1cm4gY29udmVydER1cmF0aW9uRm9ybWF0VHlwZTJUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkRVUkFUSU9OX0ZPUk1BVF9UWVBFMzoKLQkJCQlyZXR1cm4gY29udmVydER1cmF0aW9uRm9ybWF0VHlwZTNUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkRVUkFUSU9OX0ZPUk1BVF9UWVBFNDoKLQkJCQlyZXR1cm4gY29udmVydER1cmF0aW9uRm9ybWF0VHlwZTRUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkRVUkFUSU9OX0ZPUk1BVF9UWVBFNToKLQkJCQlyZXR1cm4gY29udmVydER1cmF0aW9uRm9ybWF0VHlwZTVUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVBUk5FRF9WQUxVRV9NRVRIT0RfVFlQRToKLQkJCQlyZXR1cm4gY29udmVydEVhcm5lZFZhbHVlTWV0aG9kVHlwZVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRUFSTkVEX1ZBTFVFX01FVEhPRF9UWVBFMToKLQkJCQlyZXR1cm4gY29udmVydEVhcm5lZFZhbHVlTWV0aG9kVHlwZTFUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVNQUlMX0FERFJFU1NfVFlQRToKLQkJCQlyZXR1cm4gY29udmVydEVtYWlsQWRkcmVzc1R5cGVUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVSTkFMX1RBU0tfUFJPSkVDVF9UWVBFOgotCQkJCXJldHVybiBjb252ZXJ0RXh0ZXJuYWxUYXNrUHJvamVjdFR5cGVUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkZJWEVEX0NPU1RfQUNDUlVBTF9UWVBFOgotCQkJCXJldHVybiBjb252ZXJ0Rml4ZWRDb3N0QWNjcnVhbFR5cGVUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkZZX1NUQVJUX0RBVEVfVFlQRToKLQkJCQlyZXR1cm4gY29udmVydEZZU3RhcnREYXRlVHlwZVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuR1JPVVBfVFlQRToKLQkJCQlyZXR1cm4gY29udmVydEdyb3VwVHlwZVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuSFlQRVJMSU5LX0FERFJFU1NfVFlQRToKLQkJCQlyZXR1cm4gY29udmVydEh5cGVybGlua0FkZHJlc3NUeXBlVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5IWVBFUkxJTktfQUREUkVTU19UWVBFMToKLQkJCQlyZXR1cm4gY29udmVydEh5cGVybGlua0FkZHJlc3NUeXBlMVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuSFlQRVJMSU5LX0FERFJFU1NfVFlQRTI6Ci0JCQkJcmV0dXJuIGNvbnZlcnRIeXBlcmxpbmtBZGRyZXNzVHlwZTJUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkhZUEVSTElOS19TVUJfQUREUkVTU19UWVBFOgotCQkJCXJldHVybiBjb252ZXJ0SHlwZXJsaW5rU3ViQWRkcmVzc1R5cGVUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkhZUEVSTElOS19TVUJfQUREUkVTU19UWVBFMToKLQkJCQlyZXR1cm4gY29udmVydEh5cGVybGlua1N1YkFkZHJlc3NUeXBlMVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuSFlQRVJMSU5LX1NVQl9BRERSRVNTX1RZUEUyOgotCQkJCXJldHVybiBjb252ZXJ0SHlwZXJsaW5rU3ViQWRkcmVzc1R5cGUyVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5IWVBFUkxJTktfVFlQRToKLQkJCQlyZXR1cm4gY29udmVydEh5cGVybGlua1R5cGVUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkhZUEVSTElOS19UWVBFMToKLQkJCQlyZXR1cm4gY29udmVydEh5cGVybGlua1R5cGUxVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5IWVBFUkxJTktfVFlQRTI6Ci0JCQkJcmV0dXJuIGNvbnZlcnRIeXBlcmxpbmtUeXBlMlRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuSU5JVElBTFNfVFlQRToKLQkJCQlyZXR1cm4gY29udmVydEluaXRpYWxzVHlwZVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuTEFHX0ZPUk1BVF9UWVBFOgotCQkJCXJldHVybiBjb252ZXJ0TGFnRm9ybWF0VHlwZVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuTEVWRUxJTkdfREVMQVlfRk9STUFUX1RZUEU6Ci0JCQkJcmV0dXJuIGNvbnZlcnRMZXZlbGluZ0RlbGF5Rm9ybWF0VHlwZVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuTEVWRUxJTkdfREVMQVlfRk9STUFUX1RZUEUxOgotCQkJCXJldHVybiBjb252ZXJ0TGV2ZWxpbmdEZWxheUZvcm1hdFR5cGUxVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5NQU5BR0VSX1RZUEU6Ci0JCQkJcmV0dXJuIGNvbnZlcnRNYW5hZ2VyVHlwZVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuTUFURVJJQUxfTEFCRUxfVFlQRToKLQkJCQlyZXR1cm4gY29udmVydE1hdGVyaWFsTGFiZWxUeXBlVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5OQU1FX1RZUEU6Ci0JCQkJcmV0dXJuIGNvbnZlcnROYW1lVHlwZVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuTkFNRV9UWVBFMToKLQkJCQlyZXR1cm4gY29udmVydE5hbWVUeXBlMVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuTkFNRV9UWVBFMjoKLQkJCQlyZXR1cm4gY29udmVydE5hbWVUeXBlMlRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuTkFNRV9UWVBFMzoKLQkJCQlyZXR1cm4gY29udmVydE5hbWVUeXBlM1RvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuTkVXX1RBU0tfU1RBUlRfREFURV9UWVBFOgotCQkJCXJldHVybiBjb252ZXJ0TmV3VGFza1N0YXJ0RGF0ZVR5cGVUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk5UX0FDQ09VTlRfVFlQRToKLQkJCQlyZXR1cm4gY29udmVydE5UQWNjb3VudFR5cGVUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfTlVNQkVSX1RZUEU6Ci0JCQkJcmV0dXJuIGNvbnZlcnRPdXRsaW5lTnVtYmVyVHlwZVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuT1ZFUlRJTUVfUkFURV9GT1JNQVRfVFlQRToKLQkJCQlyZXR1cm4gY29udmVydE92ZXJ0aW1lUmF0ZUZvcm1hdFR5cGVUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk9WRVJUSU1FX1JBVEVfRk9STUFUX1RZUEUxOgotCQkJCXJldHVybiBjb252ZXJ0T3ZlcnRpbWVSYXRlRm9ybWF0VHlwZTFUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBIT05FVElDX0FMSUFTX1RZUEU6Ci0JCQkJcmV0dXJuIGNvbnZlcnRQaG9uZXRpY0FsaWFzVHlwZVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUEhPTkVUSUNTX1RZUEU6Ci0JCQkJcmV0dXJuIGNvbnZlcnRQaG9uZXRpY3NUeXBlVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUkVGSVhfVFlQRToKLQkJCQlyZXR1cm4gY29udmVydFByZWZpeFR5cGVUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJBVEVfVEFCTEVfVFlQRToKLQkJCQlyZXR1cm4gY29udmVydFJhdGVUYWJsZVR5cGVUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJPTExVUF9UWVBFX1RZUEU6Ci0JCQkJcmV0dXJuIGNvbnZlcnRSb2xsdXBUeXBlVHlwZVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuU1RBTkRBUkRfUkFURV9GT1JNQVRfVFlQRToKLQkJCQlyZXR1cm4gY29udmVydFN0YW5kYXJkUmF0ZUZvcm1hdFR5cGVUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlNUQU5EQVJEX1JBVEVfRk9STUFUX1RZUEUxOgotCQkJCXJldHVybiBjb252ZXJ0U3RhbmRhcmRSYXRlRm9ybWF0VHlwZTFUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlNVQkpFQ1RfVFlQRToKLQkJCQlyZXR1cm4gY29udmVydFN1YmplY3RUeXBlVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5TVUJQUk9KRUNUX05BTUVfVFlQRToKLQkJCQlyZXR1cm4gY29udmVydFN1YnByb2plY3ROYW1lVHlwZVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVElUTEVfVFlQRToKLQkJCQlyZXR1cm4gY29udmVydFRpdGxlVHlwZVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVFlQRV9UWVBFOgotCQkJCXJldHVybiBjb252ZXJ0VHlwZVR5cGVUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRZUEVfVFlQRTE6Ci0JCQkJcmV0dXJuIGNvbnZlcnRUeXBlVHlwZTFUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRZUEVfVFlQRTI6Ci0JCQkJcmV0dXJuIGNvbnZlcnRUeXBlVHlwZTJUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRZUEVfVFlQRTM6Ci0JCQkJcmV0dXJuIGNvbnZlcnRUeXBlVHlwZTNUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRZUEVfVFlQRTQ6Ci0JCQkJcmV0dXJuIGNvbnZlcnRUeXBlVHlwZTRUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRZUEVfVFlQRTU6Ci0JCQkJcmV0dXJuIGNvbnZlcnRUeXBlVHlwZTVUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlVJRF9UWVBFOgotCQkJCXJldHVybiBjb252ZXJ0VUlEVHlwZVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVU5JVF9UWVBFOgotCQkJCXJldHVybiBjb252ZXJ0VW5pdFR5cGVUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlZBTFVFTElTVF9TT1JUX09SREVSX1RZUEU6Ci0JCQkJcmV0dXJuIGNvbnZlcnRWYWx1ZWxpc3RTb3J0T3JkZXJUeXBlVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5XRUVLX1NUQVJUX0RBWV9UWVBFOgotCQkJCXJldHVybiBjb252ZXJ0V2Vla1N0YXJ0RGF5VHlwZVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuV09SS19DT05UT1VSX1RZUEU6Ci0JCQkJcmV0dXJuIGNvbnZlcnRXb3JrQ29udG91clR5cGVUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLldPUktfRk9STUFUX1RZUEU6Ci0JCQkJcmV0dXJuIGNvbnZlcnRXb3JrRm9ybWF0VHlwZVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuV09SS19HUk9VUF9UWVBFOgotCQkJCXJldHVybiBjb252ZXJ0V29ya0dyb3VwVHlwZVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQlkZWZhdWx0OgotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBkYXRhdHlwZSAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyBpcyBub3QgYSB2YWxpZCBjbGFzc2lmaWVyIik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQXNzaWdubWVudCBjcmVhdGVBc3NpZ25tZW50KCkgewotCQlBc3NpZ25tZW50SW1wbCBhc3NpZ25tZW50ID0gbmV3IEFzc2lnbm1lbnRJbXBsKCk7Ci0JCXJldHVybiBhc3NpZ25tZW50OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBc3NpZ25tZW50cyBjcmVhdGVBc3NpZ25tZW50cygpIHsKLQkJQXNzaWdubWVudHNJbXBsIGFzc2lnbm1lbnRzID0gbmV3IEFzc2lnbm1lbnRzSW1wbCgpOwotCQlyZXR1cm4gYXNzaWdubWVudHM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEF2YWlsYWJpbGl0eVBlcmlvZCBjcmVhdGVBdmFpbGFiaWxpdHlQZXJpb2QoKSB7Ci0JCUF2YWlsYWJpbGl0eVBlcmlvZEltcGwgYXZhaWxhYmlsaXR5UGVyaW9kID0gbmV3IEF2YWlsYWJpbGl0eVBlcmlvZEltcGwoKTsKLQkJcmV0dXJuIGF2YWlsYWJpbGl0eVBlcmlvZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQXZhaWxhYmlsaXR5UGVyaW9kcyBjcmVhdGVBdmFpbGFiaWxpdHlQZXJpb2RzKCkgewotCQlBdmFpbGFiaWxpdHlQZXJpb2RzSW1wbCBhdmFpbGFiaWxpdHlQZXJpb2RzID0gbmV3IEF2YWlsYWJpbGl0eVBlcmlvZHNJbXBsKCk7Ci0JCXJldHVybiBhdmFpbGFiaWxpdHlQZXJpb2RzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCYXNlbGluZSBjcmVhdGVCYXNlbGluZSgpIHsKLQkJQmFzZWxpbmVJbXBsIGJhc2VsaW5lID0gbmV3IEJhc2VsaW5lSW1wbCgpOwotCQlyZXR1cm4gYmFzZWxpbmU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJhc2VsaW5lMiBjcmVhdGVCYXNlbGluZTIoKSB7Ci0JCUJhc2VsaW5lMkltcGwgYmFzZWxpbmUyID0gbmV3IEJhc2VsaW5lMkltcGwoKTsKLQkJcmV0dXJuIGJhc2VsaW5lMjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmFzZWxpbmUzIGNyZWF0ZUJhc2VsaW5lMygpIHsKLQkJQmFzZWxpbmUzSW1wbCBiYXNlbGluZTMgPSBuZXcgQmFzZWxpbmUzSW1wbCgpOwotCQlyZXR1cm4gYmFzZWxpbmUzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDYWxlbmRhciBjcmVhdGVDYWxlbmRhcigpIHsKLQkJQ2FsZW5kYXJJbXBsIGNhbGVuZGFyID0gbmV3IENhbGVuZGFySW1wbCgpOwotCQlyZXR1cm4gY2FsZW5kYXI7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENhbGVuZGFycyBjcmVhdGVDYWxlbmRhcnMoKSB7Ci0JCUNhbGVuZGFyc0ltcGwgY2FsZW5kYXJzID0gbmV3IENhbGVuZGFyc0ltcGwoKTsKLQkJcmV0dXJuIGNhbGVuZGFyczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRG9jdW1lbnRSb290IGNyZWF0ZURvY3VtZW50Um9vdCgpIHsKLQkJRG9jdW1lbnRSb290SW1wbCBkb2N1bWVudFJvb3QgPSBuZXcgRG9jdW1lbnRSb290SW1wbCgpOwotCQlyZXR1cm4gZG9jdW1lbnRSb290OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFeHRlbmRlZEF0dHJpYnV0ZSBjcmVhdGVFeHRlbmRlZEF0dHJpYnV0ZSgpIHsKLQkJRXh0ZW5kZWRBdHRyaWJ1dGVJbXBsIGV4dGVuZGVkQXR0cmlidXRlID0gbmV3IEV4dGVuZGVkQXR0cmlidXRlSW1wbCgpOwotCQlyZXR1cm4gZXh0ZW5kZWRBdHRyaWJ1dGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEV4dGVuZGVkQXR0cmlidXRlMiBjcmVhdGVFeHRlbmRlZEF0dHJpYnV0ZTIoKSB7Ci0JCUV4dGVuZGVkQXR0cmlidXRlMkltcGwgZXh0ZW5kZWRBdHRyaWJ1dGUyID0gbmV3IEV4dGVuZGVkQXR0cmlidXRlMkltcGwoKTsKLQkJcmV0dXJuIGV4dGVuZGVkQXR0cmlidXRlMjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRXh0ZW5kZWRBdHRyaWJ1dGUzIGNyZWF0ZUV4dGVuZGVkQXR0cmlidXRlMygpIHsKLQkJRXh0ZW5kZWRBdHRyaWJ1dGUzSW1wbCBleHRlbmRlZEF0dHJpYnV0ZTMgPSBuZXcgRXh0ZW5kZWRBdHRyaWJ1dGUzSW1wbCgpOwotCQlyZXR1cm4gZXh0ZW5kZWRBdHRyaWJ1dGUzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFeHRlbmRlZEF0dHJpYnV0ZTQgY3JlYXRlRXh0ZW5kZWRBdHRyaWJ1dGU0KCkgewotCQlFeHRlbmRlZEF0dHJpYnV0ZTRJbXBsIGV4dGVuZGVkQXR0cmlidXRlNCA9IG5ldyBFeHRlbmRlZEF0dHJpYnV0ZTRJbXBsKCk7Ci0JCXJldHVybiBleHRlbmRlZEF0dHJpYnV0ZTQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEV4dGVuZGVkQXR0cmlidXRlcyBjcmVhdGVFeHRlbmRlZEF0dHJpYnV0ZXMoKSB7Ci0JCUV4dGVuZGVkQXR0cmlidXRlc0ltcGwgZXh0ZW5kZWRBdHRyaWJ1dGVzID0gbmV3IEV4dGVuZGVkQXR0cmlidXRlc0ltcGwoKTsKLQkJcmV0dXJuIGV4dGVuZGVkQXR0cmlidXRlczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTWFzayBjcmVhdGVNYXNrKCkgewotCQlNYXNrSW1wbCBtYXNrID0gbmV3IE1hc2tJbXBsKCk7Ci0JCXJldHVybiBtYXNrOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBNYXNrcyBjcmVhdGVNYXNrcygpIHsKLQkJTWFza3NJbXBsIG1hc2tzID0gbmV3IE1hc2tzSW1wbCgpOwotCQlyZXR1cm4gbWFza3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE91dGxpbmVDb2RlIGNyZWF0ZU91dGxpbmVDb2RlKCkgewotCQlPdXRsaW5lQ29kZUltcGwgb3V0bGluZUNvZGUgPSBuZXcgT3V0bGluZUNvZGVJbXBsKCk7Ci0JCXJldHVybiBvdXRsaW5lQ29kZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT3V0bGluZUNvZGUyIGNyZWF0ZU91dGxpbmVDb2RlMigpIHsKLQkJT3V0bGluZUNvZGUySW1wbCBvdXRsaW5lQ29kZTIgPSBuZXcgT3V0bGluZUNvZGUySW1wbCgpOwotCQlyZXR1cm4gb3V0bGluZUNvZGUyOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPdXRsaW5lQ29kZTMgY3JlYXRlT3V0bGluZUNvZGUzKCkgewotCQlPdXRsaW5lQ29kZTNJbXBsIG91dGxpbmVDb2RlMyA9IG5ldyBPdXRsaW5lQ29kZTNJbXBsKCk7Ci0JCXJldHVybiBvdXRsaW5lQ29kZTM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE91dGxpbmVDb2RlcyBjcmVhdGVPdXRsaW5lQ29kZXMoKSB7Ci0JCU91dGxpbmVDb2Rlc0ltcGwgb3V0bGluZUNvZGVzID0gbmV3IE91dGxpbmVDb2Rlc0ltcGwoKTsKLQkJcmV0dXJuIG91dGxpbmVDb2RlczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUHJlZGVjZXNzb3JMaW5rIGNyZWF0ZVByZWRlY2Vzc29yTGluaygpIHsKLQkJUHJlZGVjZXNzb3JMaW5rSW1wbCBwcmVkZWNlc3NvckxpbmsgPSBuZXcgUHJlZGVjZXNzb3JMaW5rSW1wbCgpOwotCQlyZXR1cm4gcHJlZGVjZXNzb3JMaW5rOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQcm9qZWN0IGNyZWF0ZVByb2plY3QoKSB7Ci0JCVByb2plY3RJbXBsIHByb2plY3QgPSBuZXcgUHJvamVjdEltcGwoKTsKLQkJcmV0dXJuIHByb2plY3Q7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJhdGUgY3JlYXRlUmF0ZSgpIHsKLQkJUmF0ZUltcGwgcmF0ZSA9IG5ldyBSYXRlSW1wbCgpOwotCQlyZXR1cm4gcmF0ZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUmF0ZXMgY3JlYXRlUmF0ZXMoKSB7Ci0JCVJhdGVzSW1wbCByYXRlcyA9IG5ldyBSYXRlc0ltcGwoKTsKLQkJcmV0dXJuIHJhdGVzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZSBjcmVhdGVSZXNvdXJjZSgpIHsKLQkJUmVzb3VyY2VJbXBsIHJlc291cmNlID0gbmV3IFJlc291cmNlSW1wbCgpOwotCQlyZXR1cm4gcmVzb3VyY2U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJlc291cmNlcyBjcmVhdGVSZXNvdXJjZXMoKSB7Ci0JCVJlc291cmNlc0ltcGwgcmVzb3VyY2VzID0gbmV3IFJlc291cmNlc0ltcGwoKTsKLQkJcmV0dXJuIHJlc291cmNlczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVGFzayBjcmVhdGVUYXNrKCkgewotCQlUYXNrSW1wbCB0YXNrID0gbmV3IFRhc2tJbXBsKCk7Ci0JCXJldHVybiB0YXNrOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUYXNrcyBjcmVhdGVUYXNrcygpIHsKLQkJVGFza3NJbXBsIHRhc2tzID0gbmV3IFRhc2tzSW1wbCgpOwotCQlyZXR1cm4gdGFza3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFRpbWVQZXJpb2QgY3JlYXRlVGltZVBlcmlvZCgpIHsKLQkJVGltZVBlcmlvZEltcGwgdGltZVBlcmlvZCA9IG5ldyBUaW1lUGVyaW9kSW1wbCgpOwotCQlyZXR1cm4gdGltZVBlcmlvZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVGltZXBoYXNlZERhdGFUeXBlIGNyZWF0ZVRpbWVwaGFzZWREYXRhVHlwZSgpIHsKLQkJVGltZXBoYXNlZERhdGFUeXBlSW1wbCB0aW1lcGhhc2VkRGF0YVR5cGUgPSBuZXcgVGltZXBoYXNlZERhdGFUeXBlSW1wbCgpOwotCQlyZXR1cm4gdGltZXBoYXNlZERhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBWYWx1ZSBjcmVhdGVWYWx1ZSgpIHsKLQkJVmFsdWVJbXBsIHZhbHVlID0gbmV3IFZhbHVlSW1wbCgpOwotCQlyZXR1cm4gdmFsdWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFZhbHVlMiBjcmVhdGVWYWx1ZTIoKSB7Ci0JCVZhbHVlMkltcGwgdmFsdWUyID0gbmV3IFZhbHVlMkltcGwoKTsKLQkJcmV0dXJuIHZhbHVlMjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVmFsdWVMaXN0IGNyZWF0ZVZhbHVlTGlzdCgpIHsKLQkJVmFsdWVMaXN0SW1wbCB2YWx1ZUxpc3QgPSBuZXcgVmFsdWVMaXN0SW1wbCgpOwotCQlyZXR1cm4gdmFsdWVMaXN0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBWYWx1ZXMgY3JlYXRlVmFsdWVzKCkgewotCQlWYWx1ZXNJbXBsIHZhbHVlcyA9IG5ldyBWYWx1ZXNJbXBsKCk7Ci0JCXJldHVybiB2YWx1ZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFdCU01hc2sgY3JlYXRlV0JTTWFzaygpIHsKLQkJV0JTTWFza0ltcGwgd2JzTWFzayA9IG5ldyBXQlNNYXNrSW1wbCgpOwotCQlyZXR1cm4gd2JzTWFzazsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgV0JTTWFza3MgY3JlYXRlV0JTTWFza3MoKSB7Ci0JCVdCU01hc2tzSW1wbCB3YnNNYXNrcyA9IG5ldyBXQlNNYXNrc0ltcGwoKTsKLQkJcmV0dXJuIHdic01hc2tzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBXZWVrRGF5IGNyZWF0ZVdlZWtEYXkoKSB7Ci0JCVdlZWtEYXlJbXBsIHdlZWtEYXkgPSBuZXcgV2Vla0RheUltcGwoKTsKLQkJcmV0dXJuIHdlZWtEYXk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFdlZWtEYXlzIGNyZWF0ZVdlZWtEYXlzKCkgewotCQlXZWVrRGF5c0ltcGwgd2Vla0RheXMgPSBuZXcgV2Vla0RheXNJbXBsKCk7Ci0JCXJldHVybiB3ZWVrRGF5czsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgV29ya2luZ1RpbWUgY3JlYXRlV29ya2luZ1RpbWUoKSB7Ci0JCVdvcmtpbmdUaW1lSW1wbCB3b3JraW5nVGltZSA9IG5ldyBXb3JraW5nVGltZUltcGwoKTsKLQkJcmV0dXJuIHdvcmtpbmdUaW1lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBXb3JraW5nVGltZXMgY3JlYXRlV29ya2luZ1RpbWVzKCkgewotCQlXb3JraW5nVGltZXNJbXBsIHdvcmtpbmdUaW1lcyA9IG5ldyBXb3JraW5nVGltZXNJbXBsKCk7Ci0JCXJldHVybiB3b3JraW5nVGltZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgY3JlYXRlQWNjcnVlQXRGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChCaWdJbnRlZ2VyKVhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGcm9tU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRJbnRlZ2VyKCksIGluaXRpYWxWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0QWNjcnVlQXRUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNvbnZlcnRUb1N0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SW50ZWdlcigpLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNyZWF0ZUFjdGl2ZURpcmVjdG9yeUdVSURUeXBlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoU3RyaW5nKVhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGcm9tU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJpbmcoKSwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRBY3RpdmVEaXJlY3RvcnlHVUlEVHlwZVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY29udmVydFRvU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJpbmcoKSwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjcmVhdGVBbGlhc1R5cGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChTdHJpbmcpWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZyb21TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldFN0cmluZygpLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydEFsaWFzVHlwZVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY29udmVydFRvU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJpbmcoKSwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjcmVhdGVBdXRob3JUeXBlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoU3RyaW5nKVhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGcm9tU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJpbmcoKSwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRBdXRob3JUeXBlVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIFhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jb252ZXJ0VG9TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldFN0cmluZygpLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBjcmVhdGVCYXNlbGluZUZvckVhcm5lZFZhbHVlVHlwZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlyZXR1cm4gKEJpZ0ludGVnZXIpWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZyb21TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldEludGVnZXIoKSwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRCYXNlbGluZUZvckVhcm5lZFZhbHVlVHlwZVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY29udmVydFRvU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRJbnRlZ2VyKCksIGluc3RhbmNlVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGNyZWF0ZUJvb2tpbmdUeXBlVHlwZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlyZXR1cm4gKEJpZ0ludGVnZXIpWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZyb21TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldEludGVnZXIoKSwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRCb29raW5nVHlwZVR5cGVUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNvbnZlcnRUb1N0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SW50ZWdlcigpLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBjcmVhdGVCb29raW5nVHlwZVR5cGUxRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoQmlnSW50ZWdlcilYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRnJvbVN0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SW50ZWdlcigpLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydEJvb2tpbmdUeXBlVHlwZTFUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNvbnZlcnRUb1N0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SW50ZWdlcigpLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBjcmVhdGVDYWxjdWxhdGlvblR5cGVUeXBlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoQmlnSW50ZWdlcilYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRnJvbVN0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SW50ZWdlcigpLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydENhbGN1bGF0aW9uVHlwZVR5cGVUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNvbnZlcnRUb1N0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SW50ZWdlcigpLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNyZWF0ZUNhdGVnb3J5VHlwZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlyZXR1cm4gKFN0cmluZylYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRnJvbVN0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U3RyaW5nKCksIGluaXRpYWxWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0Q2F0ZWdvcnlUeXBlVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIFhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jb252ZXJ0VG9TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldFN0cmluZygpLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNyZWF0ZUNvZGVUeXBlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoU3RyaW5nKVhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGcm9tU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJpbmcoKSwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRDb2RlVHlwZVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY29udmVydFRvU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJpbmcoKSwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjcmVhdGVDb21wYW55VHlwZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlyZXR1cm4gKFN0cmluZylYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRnJvbVN0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U3RyaW5nKCksIGluaXRpYWxWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0Q29tcGFueVR5cGVUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNvbnZlcnRUb1N0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U3RyaW5nKCksIGluc3RhbmNlVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGNyZWF0ZUNvbnN0cmFpbnRUeXBlVHlwZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlyZXR1cm4gKEJpZ0ludGVnZXIpWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZyb21TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldEludGVnZXIoKSwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRDb25zdHJhaW50VHlwZVR5cGVUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNvbnZlcnRUb1N0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SW50ZWdlcigpLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNyZWF0ZUNvbnRhY3RUeXBlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoU3RyaW5nKVhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGcm9tU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJpbmcoKSwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRDb250YWN0VHlwZVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY29udmVydFRvU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJpbmcoKSwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgY3JlYXRlQ29zdFJhdGVUYWJsZVR5cGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChCaWdJbnRlZ2VyKVhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGcm9tU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRJbnRlZ2VyKCksIGluaXRpYWxWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0Q29zdFJhdGVUYWJsZVR5cGVUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNvbnZlcnRUb1N0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SW50ZWdlcigpLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBjcmVhdGVDdXJyZW5jeVN5bWJvbFBvc2l0aW9uVHlwZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlyZXR1cm4gKEJpZ0ludGVnZXIpWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZyb21TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldEludGVnZXIoKSwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRDdXJyZW5jeVN5bWJvbFBvc2l0aW9uVHlwZVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY29udmVydFRvU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRJbnRlZ2VyKCksIGluc3RhbmNlVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY3JlYXRlQ3VycmVuY3lTeW1ib2xUeXBlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoU3RyaW5nKVhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGcm9tU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJpbmcoKSwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRDdXJyZW5jeVN5bWJvbFR5cGVUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNvbnZlcnRUb1N0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U3RyaW5nKCksIGluc3RhbmNlVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGNyZWF0ZURheVR5cGVUeXBlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoQmlnSW50ZWdlcilYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRnJvbVN0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SW50ZWdlcigpLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydERheVR5cGVUeXBlVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIFhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jb252ZXJ0VG9TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldEludGVnZXIoKSwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgY3JlYXRlRGVmYXVsdEZpeGVkQ29zdEFjY3J1YWxUeXBlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoQmlnSW50ZWdlcilYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRnJvbVN0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SW50ZWdlcigpLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydERlZmF1bHRGaXhlZENvc3RBY2NydWFsVHlwZVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY29udmVydFRvU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRJbnRlZ2VyKCksIGluc3RhbmNlVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGNyZWF0ZURlZmF1bHRUYXNrRVZNZXRob2RUeXBlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoQmlnSW50ZWdlcilYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRnJvbVN0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SW50ZWdlcigpLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydERlZmF1bHRUYXNrRVZNZXRob2RUeXBlVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIFhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jb252ZXJ0VG9TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldEludGVnZXIoKSwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgY3JlYXRlRGVmYXVsdFRhc2tUeXBlVHlwZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlyZXR1cm4gKEJpZ0ludGVnZXIpWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZyb21TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldEludGVnZXIoKSwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnREZWZhdWx0VGFza1R5cGVUeXBlVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIFhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jb252ZXJ0VG9TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldEludGVnZXIoKSwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgY3JlYXRlRHVyYXRpb25Gb3JtYXRUeXBlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoQmlnSW50ZWdlcilYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRnJvbVN0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SW50ZWdlcigpLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydER1cmF0aW9uRm9ybWF0VHlwZVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY29udmVydFRvU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRJbnRlZ2VyKCksIGluc3RhbmNlVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGNyZWF0ZUR1cmF0aW9uRm9ybWF0VHlwZTFGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChCaWdJbnRlZ2VyKVhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGcm9tU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRJbnRlZ2VyKCksIGluaXRpYWxWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0RHVyYXRpb25Gb3JtYXRUeXBlMVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY29udmVydFRvU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRJbnRlZ2VyKCksIGluc3RhbmNlVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGNyZWF0ZUR1cmF0aW9uRm9ybWF0VHlwZTJGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChCaWdJbnRlZ2VyKVhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGcm9tU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRJbnRlZ2VyKCksIGluaXRpYWxWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0RHVyYXRpb25Gb3JtYXRUeXBlMlRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY29udmVydFRvU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRJbnRlZ2VyKCksIGluc3RhbmNlVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGNyZWF0ZUR1cmF0aW9uRm9ybWF0VHlwZTNGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChCaWdJbnRlZ2VyKVhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGcm9tU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRJbnRlZ2VyKCksIGluaXRpYWxWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0RHVyYXRpb25Gb3JtYXRUeXBlM1RvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY29udmVydFRvU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRJbnRlZ2VyKCksIGluc3RhbmNlVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGNyZWF0ZUR1cmF0aW9uRm9ybWF0VHlwZTRGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChCaWdJbnRlZ2VyKVhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGcm9tU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRJbnRlZ2VyKCksIGluaXRpYWxWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0RHVyYXRpb25Gb3JtYXRUeXBlNFRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY29udmVydFRvU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRJbnRlZ2VyKCksIGluc3RhbmNlVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGNyZWF0ZUR1cmF0aW9uRm9ybWF0VHlwZTVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChCaWdJbnRlZ2VyKVhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGcm9tU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRJbnRlZ2VyKCksIGluaXRpYWxWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0RHVyYXRpb25Gb3JtYXRUeXBlNVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY29udmVydFRvU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRJbnRlZ2VyKCksIGluc3RhbmNlVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGNyZWF0ZUVhcm5lZFZhbHVlTWV0aG9kVHlwZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlyZXR1cm4gKEJpZ0ludGVnZXIpWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZyb21TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldEludGVnZXIoKSwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRFYXJuZWRWYWx1ZU1ldGhvZFR5cGVUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNvbnZlcnRUb1N0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SW50ZWdlcigpLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBjcmVhdGVFYXJuZWRWYWx1ZU1ldGhvZFR5cGUxRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoQmlnSW50ZWdlcilYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRnJvbVN0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SW50ZWdlcigpLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydEVhcm5lZFZhbHVlTWV0aG9kVHlwZTFUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNvbnZlcnRUb1N0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SW50ZWdlcigpLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNyZWF0ZUVtYWlsQWRkcmVzc1R5cGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChTdHJpbmcpWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZyb21TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldFN0cmluZygpLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydEVtYWlsQWRkcmVzc1R5cGVUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNvbnZlcnRUb1N0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U3RyaW5nKCksIGluc3RhbmNlVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY3JlYXRlRXh0ZXJuYWxUYXNrUHJvamVjdFR5cGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChTdHJpbmcpWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZyb21TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldFN0cmluZygpLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydEV4dGVybmFsVGFza1Byb2plY3RUeXBlVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIFhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jb252ZXJ0VG9TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldFN0cmluZygpLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNyZWF0ZUZpeGVkQ29zdEFjY3J1YWxUeXBlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoU3RyaW5nKVhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGcm9tU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJpbmcoKSwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRGaXhlZENvc3RBY2NydWFsVHlwZVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY29udmVydFRvU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJpbmcoKSwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgY3JlYXRlRllTdGFydERhdGVUeXBlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoQmlnSW50ZWdlcilYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRnJvbVN0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SW50ZWdlcigpLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydEZZU3RhcnREYXRlVHlwZVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY29udmVydFRvU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRJbnRlZ2VyKCksIGluc3RhbmNlVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY3JlYXRlR3JvdXBUeXBlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoU3RyaW5nKVhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGcm9tU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJpbmcoKSwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRHcm91cFR5cGVUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNvbnZlcnRUb1N0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U3RyaW5nKCksIGluc3RhbmNlVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY3JlYXRlSHlwZXJsaW5rQWRkcmVzc1R5cGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChTdHJpbmcpWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZyb21TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldFN0cmluZygpLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydEh5cGVybGlua0FkZHJlc3NUeXBlVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIFhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jb252ZXJ0VG9TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldFN0cmluZygpLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNyZWF0ZUh5cGVybGlua0FkZHJlc3NUeXBlMUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlyZXR1cm4gKFN0cmluZylYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRnJvbVN0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U3RyaW5nKCksIGluaXRpYWxWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0SHlwZXJsaW5rQWRkcmVzc1R5cGUxVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIFhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jb252ZXJ0VG9TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldFN0cmluZygpLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNyZWF0ZUh5cGVybGlua0FkZHJlc3NUeXBlMkZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlyZXR1cm4gKFN0cmluZylYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRnJvbVN0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U3RyaW5nKCksIGluaXRpYWxWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0SHlwZXJsaW5rQWRkcmVzc1R5cGUyVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIFhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jb252ZXJ0VG9TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldFN0cmluZygpLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNyZWF0ZUh5cGVybGlua1N1YkFkZHJlc3NUeXBlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoU3RyaW5nKVhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGcm9tU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJpbmcoKSwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRIeXBlcmxpbmtTdWJBZGRyZXNzVHlwZVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY29udmVydFRvU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJpbmcoKSwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjcmVhdGVIeXBlcmxpbmtTdWJBZGRyZXNzVHlwZTFGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChTdHJpbmcpWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZyb21TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldFN0cmluZygpLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydEh5cGVybGlua1N1YkFkZHJlc3NUeXBlMVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY29udmVydFRvU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJpbmcoKSwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjcmVhdGVIeXBlcmxpbmtTdWJBZGRyZXNzVHlwZTJGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChTdHJpbmcpWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZyb21TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldFN0cmluZygpLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydEh5cGVybGlua1N1YkFkZHJlc3NUeXBlMlRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY29udmVydFRvU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJpbmcoKSwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjcmVhdGVIeXBlcmxpbmtUeXBlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoU3RyaW5nKVhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGcm9tU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJpbmcoKSwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRIeXBlcmxpbmtUeXBlVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIFhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jb252ZXJ0VG9TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldFN0cmluZygpLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNyZWF0ZUh5cGVybGlua1R5cGUxRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoU3RyaW5nKVhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGcm9tU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJpbmcoKSwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRIeXBlcmxpbmtUeXBlMVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY29udmVydFRvU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJpbmcoKSwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjcmVhdGVIeXBlcmxpbmtUeXBlMkZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlyZXR1cm4gKFN0cmluZylYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRnJvbVN0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U3RyaW5nKCksIGluaXRpYWxWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0SHlwZXJsaW5rVHlwZTJUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNvbnZlcnRUb1N0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U3RyaW5nKCksIGluc3RhbmNlVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY3JlYXRlSW5pdGlhbHNUeXBlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoU3RyaW5nKVhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGcm9tU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJpbmcoKSwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRJbml0aWFsc1R5cGVUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNvbnZlcnRUb1N0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U3RyaW5nKCksIGluc3RhbmNlVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGNyZWF0ZUxhZ0Zvcm1hdFR5cGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChCaWdJbnRlZ2VyKVhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGcm9tU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRJbnRlZ2VyKCksIGluaXRpYWxWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0TGFnRm9ybWF0VHlwZVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY29udmVydFRvU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRJbnRlZ2VyKCksIGluc3RhbmNlVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGNyZWF0ZUxldmVsaW5nRGVsYXlGb3JtYXRUeXBlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoQmlnSW50ZWdlcilYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRnJvbVN0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SW50ZWdlcigpLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydExldmVsaW5nRGVsYXlGb3JtYXRUeXBlVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIFhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jb252ZXJ0VG9TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldEludGVnZXIoKSwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgY3JlYXRlTGV2ZWxpbmdEZWxheUZvcm1hdFR5cGUxRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoQmlnSW50ZWdlcilYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRnJvbVN0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SW50ZWdlcigpLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydExldmVsaW5nRGVsYXlGb3JtYXRUeXBlMVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY29udmVydFRvU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRJbnRlZ2VyKCksIGluc3RhbmNlVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY3JlYXRlTWFuYWdlclR5cGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChTdHJpbmcpWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZyb21TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldFN0cmluZygpLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydE1hbmFnZXJUeXBlVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIFhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jb252ZXJ0VG9TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldFN0cmluZygpLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNyZWF0ZU1hdGVyaWFsTGFiZWxUeXBlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoU3RyaW5nKVhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGcm9tU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJpbmcoKSwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRNYXRlcmlhbExhYmVsVHlwZVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY29udmVydFRvU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJpbmcoKSwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjcmVhdGVOYW1lVHlwZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlyZXR1cm4gKFN0cmluZylYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRnJvbVN0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U3RyaW5nKCksIGluaXRpYWxWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0TmFtZVR5cGVUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNvbnZlcnRUb1N0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U3RyaW5nKCksIGluc3RhbmNlVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY3JlYXRlTmFtZVR5cGUxRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoU3RyaW5nKVhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGcm9tU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJpbmcoKSwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnROYW1lVHlwZTFUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNvbnZlcnRUb1N0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U3RyaW5nKCksIGluc3RhbmNlVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY3JlYXRlTmFtZVR5cGUyRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoU3RyaW5nKVhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGcm9tU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJpbmcoKSwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnROYW1lVHlwZTJUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNvbnZlcnRUb1N0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U3RyaW5nKCksIGluc3RhbmNlVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY3JlYXRlTmFtZVR5cGUzRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoU3RyaW5nKVhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGcm9tU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJpbmcoKSwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnROYW1lVHlwZTNUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNvbnZlcnRUb1N0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U3RyaW5nKCksIGluc3RhbmNlVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGNyZWF0ZU5ld1Rhc2tTdGFydERhdGVUeXBlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoQmlnSW50ZWdlcilYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRnJvbVN0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SW50ZWdlcigpLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydE5ld1Rhc2tTdGFydERhdGVUeXBlVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIFhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jb252ZXJ0VG9TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldEludGVnZXIoKSwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjcmVhdGVOVEFjY291bnRUeXBlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoU3RyaW5nKVhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGcm9tU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJpbmcoKSwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnROVEFjY291bnRUeXBlVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIFhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jb252ZXJ0VG9TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldFN0cmluZygpLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNyZWF0ZU91dGxpbmVOdW1iZXJUeXBlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoU3RyaW5nKVhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGcm9tU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJpbmcoKSwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRPdXRsaW5lTnVtYmVyVHlwZVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY29udmVydFRvU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJpbmcoKSwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgY3JlYXRlT3ZlcnRpbWVSYXRlRm9ybWF0VHlwZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlyZXR1cm4gKEJpZ0ludGVnZXIpWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZyb21TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldEludGVnZXIoKSwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRPdmVydGltZVJhdGVGb3JtYXRUeXBlVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIFhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jb252ZXJ0VG9TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldEludGVnZXIoKSwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgY3JlYXRlT3ZlcnRpbWVSYXRlRm9ybWF0VHlwZTFGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChCaWdJbnRlZ2VyKVhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGcm9tU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRJbnRlZ2VyKCksIGluaXRpYWxWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0T3ZlcnRpbWVSYXRlRm9ybWF0VHlwZTFUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNvbnZlcnRUb1N0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SW50ZWdlcigpLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNyZWF0ZVBob25ldGljQWxpYXNUeXBlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoU3RyaW5nKVhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGcm9tU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJpbmcoKSwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRQaG9uZXRpY0FsaWFzVHlwZVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY29udmVydFRvU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJpbmcoKSwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjcmVhdGVQaG9uZXRpY3NUeXBlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoU3RyaW5nKVhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGcm9tU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJpbmcoKSwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRQaG9uZXRpY3NUeXBlVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIFhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jb252ZXJ0VG9TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldFN0cmluZygpLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNyZWF0ZVByZWZpeFR5cGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChTdHJpbmcpWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZyb21TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldFN0cmluZygpLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydFByZWZpeFR5cGVUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNvbnZlcnRUb1N0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U3RyaW5nKCksIGluc3RhbmNlVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGNyZWF0ZVJhdGVUYWJsZVR5cGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChCaWdJbnRlZ2VyKVhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGcm9tU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRJbnRlZ2VyKCksIGluaXRpYWxWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0UmF0ZVRhYmxlVHlwZVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY29udmVydFRvU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRJbnRlZ2VyKCksIGluc3RhbmNlVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGNyZWF0ZVJvbGx1cFR5cGVUeXBlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoQmlnSW50ZWdlcilYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRnJvbVN0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SW50ZWdlcigpLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydFJvbGx1cFR5cGVUeXBlVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIFhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jb252ZXJ0VG9TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldEludGVnZXIoKSwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgY3JlYXRlU3RhbmRhcmRSYXRlRm9ybWF0VHlwZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlyZXR1cm4gKEJpZ0ludGVnZXIpWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZyb21TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldEludGVnZXIoKSwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRTdGFuZGFyZFJhdGVGb3JtYXRUeXBlVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIFhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jb252ZXJ0VG9TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldEludGVnZXIoKSwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgY3JlYXRlU3RhbmRhcmRSYXRlRm9ybWF0VHlwZTFGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChCaWdJbnRlZ2VyKVhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGcm9tU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRJbnRlZ2VyKCksIGluaXRpYWxWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0U3RhbmRhcmRSYXRlRm9ybWF0VHlwZTFUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNvbnZlcnRUb1N0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SW50ZWdlcigpLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNyZWF0ZVN1YmplY3RUeXBlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoU3RyaW5nKVhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGcm9tU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJpbmcoKSwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRTdWJqZWN0VHlwZVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY29udmVydFRvU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJpbmcoKSwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjcmVhdGVTdWJwcm9qZWN0TmFtZVR5cGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChTdHJpbmcpWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZyb21TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldFN0cmluZygpLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydFN1YnByb2plY3ROYW1lVHlwZVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY29udmVydFRvU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJpbmcoKSwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjcmVhdGVUaXRsZVR5cGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChTdHJpbmcpWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZyb21TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldFN0cmluZygpLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydFRpdGxlVHlwZVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY29udmVydFRvU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJpbmcoKSwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgY3JlYXRlVHlwZVR5cGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChCaWdJbnRlZ2VyKVhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGcm9tU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRJbnRlZ2VyKCksIGluaXRpYWxWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0VHlwZVR5cGVUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNvbnZlcnRUb1N0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SW50ZWdlcigpLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBjcmVhdGVUeXBlVHlwZTFGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChCaWdJbnRlZ2VyKVhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGcm9tU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRJbnRlZ2VyKCksIGluaXRpYWxWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0VHlwZVR5cGUxVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIFhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jb252ZXJ0VG9TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldEludGVnZXIoKSwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgY3JlYXRlVHlwZVR5cGUyRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoQmlnSW50ZWdlcilYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRnJvbVN0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SW50ZWdlcigpLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydFR5cGVUeXBlMlRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY29udmVydFRvU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRJbnRlZ2VyKCksIGluc3RhbmNlVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGNyZWF0ZVR5cGVUeXBlM0Zyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlyZXR1cm4gKEJpZ0ludGVnZXIpWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZyb21TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldEludGVnZXIoKSwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRUeXBlVHlwZTNUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNvbnZlcnRUb1N0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SW50ZWdlcigpLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBjcmVhdGVUeXBlVHlwZTRGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChCaWdJbnRlZ2VyKVhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGcm9tU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRJbnRlZ2VyKCksIGluaXRpYWxWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0VHlwZVR5cGU0VG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIFhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jb252ZXJ0VG9TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldEludGVnZXIoKSwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgY3JlYXRlVHlwZVR5cGU1RnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoQmlnSW50ZWdlcilYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRnJvbVN0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SW50ZWdlcigpLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydFR5cGVUeXBlNVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY29udmVydFRvU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRJbnRlZ2VyKCksIGluc3RhbmNlVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY3JlYXRlVUlEVHlwZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlyZXR1cm4gKFN0cmluZylYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRnJvbVN0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U3RyaW5nKCksIGluaXRpYWxWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0VUlEVHlwZVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY29udmVydFRvU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJpbmcoKSwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgY3JlYXRlVW5pdFR5cGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChCaWdJbnRlZ2VyKVhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGcm9tU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRJbnRlZ2VyKCksIGluaXRpYWxWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0VW5pdFR5cGVUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNvbnZlcnRUb1N0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SW50ZWdlcigpLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBjcmVhdGVWYWx1ZWxpc3RTb3J0T3JkZXJUeXBlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoQmlnSW50ZWdlcilYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRnJvbVN0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SW50ZWdlcigpLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydFZhbHVlbGlzdFNvcnRPcmRlclR5cGVUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNvbnZlcnRUb1N0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SW50ZWdlcigpLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBjcmVhdGVXZWVrU3RhcnREYXlUeXBlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoQmlnSW50ZWdlcilYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRnJvbVN0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SW50ZWdlcigpLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydFdlZWtTdGFydERheVR5cGVUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNvbnZlcnRUb1N0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SW50ZWdlcigpLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBjcmVhdGVXb3JrQ29udG91clR5cGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChCaWdJbnRlZ2VyKVhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGcm9tU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRJbnRlZ2VyKCksIGluaXRpYWxWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0V29ya0NvbnRvdXJUeXBlVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIFhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jb252ZXJ0VG9TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldEludGVnZXIoKSwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgY3JlYXRlV29ya0Zvcm1hdFR5cGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChCaWdJbnRlZ2VyKVhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGcm9tU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRJbnRlZ2VyKCksIGluaXRpYWxWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0V29ya0Zvcm1hdFR5cGVUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNvbnZlcnRUb1N0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SW50ZWdlcigpLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBjcmVhdGVXb3JrR3JvdXBUeXBlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoQmlnSW50ZWdlcilYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRnJvbVN0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SW50ZWdlcigpLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydFdvcmtHcm91cFR5cGVUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNvbnZlcnRUb1N0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SW50ZWdlcigpLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTXNwcm9qZWN0UGFja2FnZSBnZXRNc3Byb2plY3RQYWNrYWdlKCkgewotCQlyZXR1cm4gKE1zcHJvamVjdFBhY2thZ2UpZ2V0RVBhY2thZ2UoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBkZXByZWNhdGVkCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgTXNwcm9qZWN0UGFja2FnZSBnZXRQYWNrYWdlKCkgewotCQlyZXR1cm4gTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0U7Ci0JfQotCi19IC8vTXNwcm9qZWN0RmFjdG9yeUltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9Nc3Byb2plY3RQYWNrYWdlSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL01zcHJvamVjdFBhY2thZ2VJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3YjJhMDQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL01zcHJvamVjdFBhY2thZ2VJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MzEzICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogTXNwcm9qZWN0UGFja2FnZUltcGwuamF2YSx2IDEuMSAyMDA4LzAxLzE1IDA4OjUxOjUzIGp0aGFtIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5XcmFwcGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVEYXRhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRVBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLmltcGwuRWNvcmVSZXNvdXJjZUZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5pbXBsLlhNTFR5cGVQYWNrYWdlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QudXRpbC5Nc3Byb2plY3RWYWxpZGF0b3I7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCA8Yj5QYWNrYWdlPC9iPi4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgTXNwcm9qZWN0UGFja2FnZUltcGwgZXh0ZW5kcyBFUGFja2FnZUltcGwgaW1wbGVtZW50cyBNc3Byb2plY3RQYWNrYWdlIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHBhY2thZ2VGaWxlbmFtZSA9ICJtc3Byb2plY3QuZWNvcmUiOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgYXNzaWdubWVudEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBhc3NpZ25tZW50c0VDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBhdmFpbGFiaWxpdHlQZXJpb2RFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgYXZhaWxhYmlsaXR5UGVyaW9kc0VDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBiYXNlbGluZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBiYXNlbGluZTJFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgYmFzZWxpbmUzRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGNhbGVuZGFyRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGNhbGVuZGFyc0VDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBkb2N1bWVudFJvb3RFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgZXh0ZW5kZWRBdHRyaWJ1dGVFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgZXh0ZW5kZWRBdHRyaWJ1dGUyRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGV4dGVuZGVkQXR0cmlidXRlM0VDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBleHRlbmRlZEF0dHJpYnV0ZTRFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgZXh0ZW5kZWRBdHRyaWJ1dGVzRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIG1hc2tFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgbWFza3NFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3Mgb3V0bGluZUNvZGVFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3Mgb3V0bGluZUNvZGUyRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIG91dGxpbmVDb2RlM0VDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBvdXRsaW5lQ29kZXNFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgcHJlZGVjZXNzb3JMaW5rRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHByb2plY3RFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgcmF0ZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyByYXRlc0VDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyByZXNvdXJjZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyByZXNvdXJjZXNFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgdGFza0VDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB0YXNrc0VDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB0aW1lUGVyaW9kRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHRpbWVwaGFzZWREYXRhVHlwZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB2YWx1ZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB2YWx1ZTJFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgdmFsdWVMaXN0RUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHZhbHVlc0VDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB3YnNNYXNrRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHdic01hc2tzRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHdlZWtEYXlFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3Mgd2Vla0RheXNFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3Mgd29ya2luZ1RpbWVFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3Mgd29ya2luZ1RpbWVzRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIGFjY3J1ZUF0RURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIGFjdGl2ZURpcmVjdG9yeUdVSURUeXBlRURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIGFsaWFzVHlwZUVEYXRhVHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSBhdXRob3JUeXBlRURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIGJhc2VsaW5lRm9yRWFybmVkVmFsdWVUeXBlRURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIGJvb2tpbmdUeXBlVHlwZUVEYXRhVHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSBib29raW5nVHlwZVR5cGUxRURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIGNhbGN1bGF0aW9uVHlwZVR5cGVFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgY2F0ZWdvcnlUeXBlRURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIGNvZGVUeXBlRURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIGNvbXBhbnlUeXBlRURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIGNvbnN0cmFpbnRUeXBlVHlwZUVEYXRhVHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSBjb250YWN0VHlwZUVEYXRhVHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSBjb3N0UmF0ZVRhYmxlVHlwZUVEYXRhVHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSBjdXJyZW5jeVN5bWJvbFBvc2l0aW9uVHlwZUVEYXRhVHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSBjdXJyZW5jeVN5bWJvbFR5cGVFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgZGF5VHlwZVR5cGVFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgZGVmYXVsdEZpeGVkQ29zdEFjY3J1YWxUeXBlRURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIGRlZmF1bHRUYXNrRVZNZXRob2RUeXBlRURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIGRlZmF1bHRUYXNrVHlwZVR5cGVFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgZHVyYXRpb25Gb3JtYXRUeXBlRURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIGR1cmF0aW9uRm9ybWF0VHlwZTFFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgZHVyYXRpb25Gb3JtYXRUeXBlMkVEYXRhVHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSBkdXJhdGlvbkZvcm1hdFR5cGUzRURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIGR1cmF0aW9uRm9ybWF0VHlwZTRFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgZHVyYXRpb25Gb3JtYXRUeXBlNUVEYXRhVHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSBlYXJuZWRWYWx1ZU1ldGhvZFR5cGVFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgZWFybmVkVmFsdWVNZXRob2RUeXBlMUVEYXRhVHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSBlbWFpbEFkZHJlc3NUeXBlRURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIGV4dGVybmFsVGFza1Byb2plY3RUeXBlRURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIGZpeGVkQ29zdEFjY3J1YWxUeXBlRURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIGZ5U3RhcnREYXRlVHlwZUVEYXRhVHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSBncm91cFR5cGVFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgaHlwZXJsaW5rQWRkcmVzc1R5cGVFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgaHlwZXJsaW5rQWRkcmVzc1R5cGUxRURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIGh5cGVybGlua0FkZHJlc3NUeXBlMkVEYXRhVHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSBoeXBlcmxpbmtTdWJBZGRyZXNzVHlwZUVEYXRhVHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSBoeXBlcmxpbmtTdWJBZGRyZXNzVHlwZTFFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgaHlwZXJsaW5rU3ViQWRkcmVzc1R5cGUyRURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIGh5cGVybGlua1R5cGVFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgaHlwZXJsaW5rVHlwZTFFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgaHlwZXJsaW5rVHlwZTJFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgaW5pdGlhbHNUeXBlRURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIGxhZ0Zvcm1hdFR5cGVFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgbGV2ZWxpbmdEZWxheUZvcm1hdFR5cGVFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgbGV2ZWxpbmdEZWxheUZvcm1hdFR5cGUxRURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIG1hbmFnZXJUeXBlRURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIG1hdGVyaWFsTGFiZWxUeXBlRURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIG5hbWVUeXBlRURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIG5hbWVUeXBlMUVEYXRhVHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSBuYW1lVHlwZTJFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgbmFtZVR5cGUzRURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIG5ld1Rhc2tTdGFydERhdGVUeXBlRURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIG50QWNjb3VudFR5cGVFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgb3V0bGluZU51bWJlclR5cGVFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgb3ZlcnRpbWVSYXRlRm9ybWF0VHlwZUVEYXRhVHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSBvdmVydGltZVJhdGVGb3JtYXRUeXBlMUVEYXRhVHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSBwaG9uZXRpY0FsaWFzVHlwZUVEYXRhVHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSBwaG9uZXRpY3NUeXBlRURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIHByZWZpeFR5cGVFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgcmF0ZVRhYmxlVHlwZUVEYXRhVHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSByb2xsdXBUeXBlVHlwZUVEYXRhVHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSBzdGFuZGFyZFJhdGVGb3JtYXRUeXBlRURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIHN0YW5kYXJkUmF0ZUZvcm1hdFR5cGUxRURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIHN1YmplY3RUeXBlRURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIHN1YnByb2plY3ROYW1lVHlwZUVEYXRhVHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSB0aXRsZVR5cGVFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgdHlwZVR5cGVFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgdHlwZVR5cGUxRURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIHR5cGVUeXBlMkVEYXRhVHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSB0eXBlVHlwZTNFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgdHlwZVR5cGU0RURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIHR5cGVUeXBlNUVEYXRhVHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSB1aWRUeXBlRURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIHVuaXRUeXBlRURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIHZhbHVlbGlzdFNvcnRPcmRlclR5cGVFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgd2Vla1N0YXJ0RGF5VHlwZUVEYXRhVHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSB3b3JrQ29udG91clR5cGVFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgd29ya0Zvcm1hdFR5cGVFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgd29ya0dyb3VwVHlwZUVEYXRhVHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBtb2RlbCA8Yj5QYWNrYWdlPC9iPiwgcmVnaXN0ZXJlZCB3aXRoCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZS5SZWdpc3RyeSBFUGFja2FnZS5SZWdpc3RyeX0gYnkgdGhlIHBhY2thZ2UKLQkgKiBwYWNrYWdlIFVSSSB2YWx1ZS4KLQkgKiA8cD5Ob3RlOiB0aGUgY29ycmVjdCB3YXkgdG8gY3JlYXRlIHRoZSBwYWNrYWdlIGlzIHZpYSB0aGUgc3RhdGljCi0JICogZmFjdG9yeSBtZXRob2Qge0BsaW5rICNpbml0IGluaXQoKX0sIHdoaWNoIGFsc28gcGVyZm9ybXMKLQkgKiBpbml0aWFsaXphdGlvbiBvZiB0aGUgcGFja2FnZSwgb3IgcmV0dXJucyB0aGUgcmVnaXN0ZXJlZCBwYWNrYWdlLAotCSAqIGlmIG9uZSBhbHJlYWR5IGV4aXN0cy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlLlJlZ2lzdHJ5Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZU5TX1VSSQotCSAqIEBzZWUgI2luaXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIE1zcHJvamVjdFBhY2thZ2VJbXBsKCkgewotCQlzdXBlcihlTlNfVVJJLCBNc3Byb2plY3RGYWN0b3J5LmVJTlNUQU5DRSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0luaXRlZCA9IGZhbHNlOwotCi0JLyoqCi0JICogQ3JlYXRlcywgcmVnaXN0ZXJzLCBhbmQgaW5pdGlhbGl6ZXMgdGhlIDxiPlBhY2thZ2U8L2I+IGZvciB0aGlzCi0JICogbW9kZWwsIGFuZCBmb3IgYW55IG90aGVycyB1cG9uIHdoaWNoIGl0IGRlcGVuZHMuICBTaW1wbGUKLQkgKiBkZXBlbmRlbmNpZXMgYXJlIHNhdGlzZmllZCBieSBjYWxsaW5nIHRoaXMgbWV0aG9kIG9uIGFsbAotCSAqIGRlcGVuZGVudCBwYWNrYWdlcyBiZWZvcmUgZG9pbmcgYW55dGhpbmcgZWxzZS4gIFRoaXMgbWV0aG9kIGRyaXZlcwotCSAqIGluaXRpYWxpemF0aW9uIGZvciBpbnRlcmRlcGVuZGVudCBwYWNrYWdlcyBkaXJlY3RseSwgaW4gcGFyYWxsZWwKLQkgKiB3aXRoIHRoaXMgcGFja2FnZSwgaXRzZWxmLgotCSAqIDxwPk9mIHRoaXMgcGFja2FnZSBhbmQgaXRzIGludGVyZGVwZW5kZW5jaWVzLCBhbGwgcGFja2FnZXMgd2hpY2gKLQkgKiBoYXZlIG5vdCB5ZXQgYmVlbiByZWdpc3RlcmVkIGJ5IHRoZWlyIFVSSSB2YWx1ZXMgYXJlIGZpcnN0IGNyZWF0ZWQKLQkgKiBhbmQgcmVnaXN0ZXJlZC4gIFRoZSBwYWNrYWdlcyBhcmUgdGhlbiBpbml0aWFsaXplZCBpbiB0d28gc3RlcHM6Ci0JICogbWV0YS1tb2RlbCBvYmplY3RzIGZvciBhbGwgb2YgdGhlIHBhY2thZ2VzIGFyZSBjcmVhdGVkIGJlZm9yZSBhbnkKLQkgKiBhcmUgaW5pdGlhbGl6ZWQsIHNpbmNlIG9uZSBwYWNrYWdlJ3MgbWV0YS1tb2RlbCBvYmplY3RzIG1heSByZWZlciB0bwotCSAqIHRob3NlIG9mIGFub3RoZXIuCi0JICogPHA+SW52b2NhdGlvbiBvZiB0aGlzIG1ldGhvZCB3aWxsIG5vdCBhZmZlY3QgYW55IHBhY2thZ2VzIHRoYXQgaGF2ZQotCSAqIGFscmVhZHkgYmVlbiBpbml0aWFsaXplZC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2VOU19VUkkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBNc3Byb2plY3RQYWNrYWdlIGluaXQoKSB7Ci0JCWlmIChpc0luaXRlZCkgcmV0dXJuIChNc3Byb2plY3RQYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSk7Ci0KLQkJLy8gT2J0YWluIG9yIGNyZWF0ZSBhbmQgcmVnaXN0ZXIgcGFja2FnZQotCQlNc3Byb2plY3RQYWNrYWdlSW1wbCB0aGVNc3Byb2plY3RQYWNrYWdlID0gKE1zcHJvamVjdFBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShlTlNfVVJJKSBpbnN0YW5jZW9mIE1zcHJvamVjdFBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoZU5TX1VSSSkgOiBuZXcgTXNwcm9qZWN0UGFja2FnZUltcGwoKSk7Ci0KLQkJaXNJbml0ZWQgPSB0cnVlOwotCi0JCS8vIEluaXRpYWxpemUgc2ltcGxlIGRlcGVuZGVuY2llcwotCQlYTUxUeXBlUGFja2FnZUltcGwuaW5pdCgpOwotCi0JCS8vIExvYWQgcGFja2FnZXMKLQkJdGhlTXNwcm9qZWN0UGFja2FnZS5sb2FkUGFja2FnZSgpOwotCi0JCS8vIEZpeCBsb2FkZWQgcGFja2FnZXMKLQkJdGhlTXNwcm9qZWN0UGFja2FnZS5maXhQYWNrYWdlQ29udGVudHMoKTsKLQotCQkvLyBSZWdpc3RlciBwYWNrYWdlIHZhbGlkYXRvcgotCQlFVmFsaWRhdG9yLlJlZ2lzdHJ5LklOU1RBTkNFLnB1dAotCQkJKHRoZU1zcHJvamVjdFBhY2thZ2UsIAotCQkJIG5ldyBFVmFsaWRhdG9yLkRlc2NyaXB0b3IoKSB7Ci0JCQkJIHB1YmxpYyBFVmFsaWRhdG9yIGdldEVWYWxpZGF0b3IoKSB7Ci0JCQkJCSByZXR1cm4gTXNwcm9qZWN0VmFsaWRhdG9yLklOU1RBTkNFOwotCQkJCSB9Ci0JCQkgfSk7Ci0KLQkJLy8gTWFyayBtZXRhLWRhdGEgdG8gaW5kaWNhdGUgaXQgY2FuJ3QgYmUgY2hhbmdlZAotCQl0aGVNc3Byb2plY3RQYWNrYWdlLmZyZWV6ZSgpOwotCi0JCXJldHVybiB0aGVNc3Byb2plY3RQYWNrYWdlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0QXNzaWdubWVudCgpIHsKLQkJaWYgKGFzc2lnbm1lbnRFQ2xhc3MgPT0gbnVsbCkgewotCQkJYXNzaWdubWVudEVDbGFzcyA9IChFQ2xhc3MpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoMyk7Ci0JCX0KLQkJcmV0dXJuIGFzc2lnbm1lbnRFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QXNzaWdubWVudF9VSUQoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRBc3NpZ25tZW50KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X1Rhc2tVSUQoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRBc3NpZ25tZW50KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X1Jlc291cmNlVUlEKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0QXNzaWdubWVudCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QXNzaWdubWVudF9QZXJjZW50V29ya0NvbXBsZXRlKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0QXNzaWdubWVudCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QXNzaWdubWVudF9BY3R1YWxDb3N0KCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0QXNzaWdubWVudCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QXNzaWdubWVudF9BY3R1YWxGaW5pc2goKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRBc3NpZ25tZW50KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X0FjdHVhbE92ZXJ0aW1lQ29zdCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEFzc2lnbm1lbnQoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDYpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEFzc2lnbm1lbnRfQWN0dWFsT3ZlcnRpbWVXb3JrKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0QXNzaWdubWVudCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QXNzaWdubWVudF9BY3R1YWxTdGFydCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEFzc2lnbm1lbnQoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEFzc2lnbm1lbnRfQWN0dWFsV29yaygpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEFzc2lnbm1lbnQoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEFzc2lnbm1lbnRfQUNXUCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEFzc2lnbm1lbnQoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X0NvbmZpcm1lZCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEFzc2lnbm1lbnQoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDExKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X0Nvc3QoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRBc3NpZ25tZW50KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QXNzaWdubWVudF9Db3N0UmF0ZVRhYmxlKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0QXNzaWdubWVudCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEFzc2lnbm1lbnRfQ29zdFZhcmlhbmNlKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0QXNzaWdubWVudCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEFzc2lnbm1lbnRfQ1YoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRBc3NpZ25tZW50KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxNSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QXNzaWdubWVudF9EZWxheSgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEFzc2lnbm1lbnQoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDE2KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X0ZpbmlzaCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEFzc2lnbm1lbnQoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDE3KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X0ZpbmlzaFZhcmlhbmNlKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0QXNzaWdubWVudCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEFzc2lnbm1lbnRfSHlwZXJsaW5rKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0QXNzaWdubWVudCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEFzc2lnbm1lbnRfSHlwZXJsaW5rQWRkcmVzcygpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEFzc2lnbm1lbnQoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X0h5cGVybGlua1N1YkFkZHJlc3MoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRBc3NpZ25tZW50KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QXNzaWdubWVudF9Xb3JrVmFyaWFuY2UoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRBc3NpZ25tZW50KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QXNzaWdubWVudF9IYXNGaXhlZFJhdGVVbml0cygpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEFzc2lnbm1lbnQoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X0ZpeGVkTWF0ZXJpYWwoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRBc3NpZ25tZW50KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyNCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QXNzaWdubWVudF9MZXZlbGluZ0RlbGF5KCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0QXNzaWdubWVudCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMjUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEFzc2lnbm1lbnRfTGV2ZWxpbmdEZWxheUZvcm1hdCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEFzc2lnbm1lbnQoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDI2KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X0xpbmtlZEZpZWxkcygpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEFzc2lnbm1lbnQoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDI3KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X01pbGVzdG9uZSgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEFzc2lnbm1lbnQoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDI4KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X05vdGVzKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0QXNzaWdubWVudCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMjkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEFzc2lnbm1lbnRfT3ZlcmFsbG9jYXRlZCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEFzc2lnbm1lbnQoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X092ZXJ0aW1lQ29zdCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEFzc2lnbm1lbnQoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X092ZXJ0aW1lV29yaygpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEFzc2lnbm1lbnQoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X1JlZ3VsYXJXb3JrKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0QXNzaWdubWVudCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMzMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEFzc2lnbm1lbnRfUmVtYWluaW5nQ29zdCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEFzc2lnbm1lbnQoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDM0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X1JlbWFpbmluZ092ZXJ0aW1lQ29zdCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEFzc2lnbm1lbnQoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDM1KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X1JlbWFpbmluZ092ZXJ0aW1lV29yaygpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEFzc2lnbm1lbnQoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDM2KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X1JlbWFpbmluZ1dvcmsoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRBc3NpZ25tZW50KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzNyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QXNzaWdubWVudF9SZXNwb25zZVBlbmRpbmcoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRBc3NpZ25tZW50KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzOCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QXNzaWdubWVudF9TdGFydCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEFzc2lnbm1lbnQoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDM5KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X1N0b3AoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRBc3NpZ25tZW50KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0MCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QXNzaWdubWVudF9SZXN1bWUoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRBc3NpZ25tZW50KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0MSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QXNzaWdubWVudF9TdGFydFZhcmlhbmNlKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0QXNzaWdubWVudCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEFzc2lnbm1lbnRfVW5pdHMoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRBc3NpZ25tZW50KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0Myk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QXNzaWdubWVudF9VcGRhdGVOZWVkZWQoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRBc3NpZ25tZW50KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0NCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QXNzaWdubWVudF9WQUMoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRBc3NpZ25tZW50KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0NSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QXNzaWdubWVudF9Xb3JrKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0QXNzaWdubWVudCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNDYpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEFzc2lnbm1lbnRfV29ya0NvbnRvdXIoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRBc3NpZ25tZW50KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0Nyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QXNzaWdubWVudF9CQ1dTKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0QXNzaWdubWVudCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNDgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEFzc2lnbm1lbnRfQkNXUCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEFzc2lnbm1lbnQoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQ5KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X0Jvb2tpbmdUeXBlKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0QXNzaWdubWVudCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNTApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEFzc2lnbm1lbnRfQWN0dWFsV29ya1Byb3RlY3RlZCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEFzc2lnbm1lbnQoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X0FjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEFzc2lnbm1lbnQoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X0NyZWF0aW9uRGF0ZSgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEFzc2lnbm1lbnQoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRBc3NpZ25tZW50X0V4dGVuZGVkQXR0cmlidXRlKCkgewotICAgICAgICByZXR1cm4gKEVSZWZlcmVuY2UpZ2V0QXNzaWdubWVudCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNTQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEFzc2lnbm1lbnRfQmFzZWxpbmUoKSB7Ci0gICAgICAgIHJldHVybiAoRVJlZmVyZW5jZSlnZXRBc3NpZ25tZW50KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1NSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0QXNzaWdubWVudF9UaW1lcGhhc2VkRGF0YSgpIHsKLSAgICAgICAgcmV0dXJuIChFUmVmZXJlbmNlKWdldEFzc2lnbm1lbnQoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDU2KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldEFzc2lnbm1lbnRzKCkgewotCQlpZiAoYXNzaWdubWVudHNFQ2xhc3MgPT0gbnVsbCkgewotCQkJYXNzaWdubWVudHNFQ2xhc3MgPSAoRUNsYXNzKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDQpOwotCQl9Ci0JCXJldHVybiBhc3NpZ25tZW50c0VDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRBc3NpZ25tZW50c19Bc3NpZ25tZW50KCkgewotICAgICAgICByZXR1cm4gKEVSZWZlcmVuY2UpZ2V0QXNzaWdubWVudHMoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0QXZhaWxhYmlsaXR5UGVyaW9kKCkgewotCQlpZiAoYXZhaWxhYmlsaXR5UGVyaW9kRUNsYXNzID09IG51bGwpIHsKLQkJCWF2YWlsYWJpbGl0eVBlcmlvZEVDbGFzcyA9IChFQ2xhc3MpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoNik7Ci0JCX0KLQkJcmV0dXJuIGF2YWlsYWJpbGl0eVBlcmlvZEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBdmFpbGFiaWxpdHlQZXJpb2RfQXZhaWxhYmxlRnJvbSgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEF2YWlsYWJpbGl0eVBlcmlvZCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QXZhaWxhYmlsaXR5UGVyaW9kX0F2YWlsYWJsZVRvKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0QXZhaWxhYmlsaXR5UGVyaW9kKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBdmFpbGFiaWxpdHlQZXJpb2RfQXZhaWxhYmxlVW5pdHMoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRBdmFpbGFiaWxpdHlQZXJpb2QoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0QXZhaWxhYmlsaXR5UGVyaW9kcygpIHsKLQkJaWYgKGF2YWlsYWJpbGl0eVBlcmlvZHNFQ2xhc3MgPT0gbnVsbCkgewotCQkJYXZhaWxhYmlsaXR5UGVyaW9kc0VDbGFzcyA9IChFQ2xhc3MpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoNyk7Ci0JCX0KLQkJcmV0dXJuIGF2YWlsYWJpbGl0eVBlcmlvZHNFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0QXZhaWxhYmlsaXR5UGVyaW9kc19BdmFpbGFiaWxpdHlQZXJpb2QoKSB7Ci0gICAgICAgIHJldHVybiAoRVJlZmVyZW5jZSlnZXRBdmFpbGFiaWxpdHlQZXJpb2RzKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldEJhc2VsaW5lKCkgewotCQlpZiAoYmFzZWxpbmVFQ2xhc3MgPT0gbnVsbCkgewotCQkJYmFzZWxpbmVFQ2xhc3MgPSAoRUNsYXNzKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDgpOwotCQl9Ci0JCXJldHVybiBiYXNlbGluZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRCYXNlbGluZV9UaW1lcGhhc2VkRGF0YSgpIHsKLSAgICAgICAgcmV0dXJuIChFUmVmZXJlbmNlKWdldEJhc2VsaW5lKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRCYXNlbGluZV9OdW1iZXIoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRCYXNlbGluZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QmFzZWxpbmVfSW50ZXJpbSgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEJhc2VsaW5lKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRCYXNlbGluZV9TdGFydCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEJhc2VsaW5lKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRCYXNlbGluZV9GaW5pc2goKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRCYXNlbGluZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QmFzZWxpbmVfRHVyYXRpb24oKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRCYXNlbGluZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QmFzZWxpbmVfRHVyYXRpb25Gb3JtYXQoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRCYXNlbGluZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QmFzZWxpbmVfRXN0aW1hdGVkRHVyYXRpb24oKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRCYXNlbGluZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QmFzZWxpbmVfV29yaygpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEJhc2VsaW5lKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg4KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRCYXNlbGluZV9Db3N0KCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0QmFzZWxpbmUoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEJhc2VsaW5lX0JDV1MoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRCYXNlbGluZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEJhc2VsaW5lX0JDV1AoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRCYXNlbGluZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0QmFzZWxpbmUyKCkgewotCQlpZiAoYmFzZWxpbmUyRUNsYXNzID09IG51bGwpIHsKLQkJCWJhc2VsaW5lMkVDbGFzcyA9IChFQ2xhc3MpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoOSk7Ci0JCX0KLQkJcmV0dXJuIGJhc2VsaW5lMkVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRCYXNlbGluZTJfTnVtYmVyKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0QmFzZWxpbmUyKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRCYXNlbGluZTJfV29yaygpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEJhc2VsaW5lMigpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QmFzZWxpbmUyX0Nvc3QoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRCYXNlbGluZTIoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEJhc2VsaW5lMl9CQ1dTKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0QmFzZWxpbmUyKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRCYXNlbGluZTJfQkNXUCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEJhc2VsaW5lMigpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRCYXNlbGluZTMoKSB7Ci0JCWlmIChiYXNlbGluZTNFQ2xhc3MgPT0gbnVsbCkgewotCQkJYmFzZWxpbmUzRUNsYXNzID0gKEVDbGFzcylFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNc3Byb2plY3RQYWNrYWdlLmVOU19VUkkpLmdldEVDbGFzc2lmaWVycygpLmdldCgxMCk7Ci0JCX0KLQkJcmV0dXJuIGJhc2VsaW5lM0VDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRCYXNlbGluZTNfVGltZXBoYXNlZERhdGEoKSB7Ci0gICAgICAgIHJldHVybiAoRVJlZmVyZW5jZSlnZXRCYXNlbGluZTMoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEJhc2VsaW5lM19OdW1iZXIoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRCYXNlbGluZTMoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEJhc2VsaW5lM19TdGFydCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEJhc2VsaW5lMygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QmFzZWxpbmUzX0ZpbmlzaCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEJhc2VsaW5lMygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QmFzZWxpbmUzX1dvcmsoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRCYXNlbGluZTMoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEJhc2VsaW5lM19Db3N0KCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0QmFzZWxpbmUzKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRCYXNlbGluZTNfQkNXUygpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEJhc2VsaW5lMygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QmFzZWxpbmUzX0JDV1AoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRCYXNlbGluZTMoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDcpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0Q2FsZW5kYXIoKSB7Ci0JCWlmIChjYWxlbmRhckVDbGFzcyA9PSBudWxsKSB7Ci0JCQljYWxlbmRhckVDbGFzcyA9IChFQ2xhc3MpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoMTUpOwotCQl9Ci0JCXJldHVybiBjYWxlbmRhckVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRDYWxlbmRhcl9VSUQoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRDYWxlbmRhcigpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0Q2FsZW5kYXJfTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldENhbGVuZGFyKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRDYWxlbmRhcl9Jc0Jhc2VDYWxlbmRhcigpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldENhbGVuZGFyKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRDYWxlbmRhcl9CYXNlQ2FsZW5kYXJVSUQoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRDYWxlbmRhcigpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0Q2FsZW5kYXJfV2Vla0RheXMoKSB7Ci0gICAgICAgIHJldHVybiAoRVJlZmVyZW5jZSlnZXRDYWxlbmRhcigpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRDYWxlbmRhcnMoKSB7Ci0JCWlmIChjYWxlbmRhcnNFQ2xhc3MgPT0gbnVsbCkgewotCQkJY2FsZW5kYXJzRUNsYXNzID0gKEVDbGFzcylFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNc3Byb2plY3RQYWNrYWdlLmVOU19VUkkpLmdldEVDbGFzc2lmaWVycygpLmdldCgxNik7Ci0JCX0KLQkJcmV0dXJuIGNhbGVuZGFyc0VDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRDYWxlbmRhcnNfQ2FsZW5kYXIoKSB7Ci0gICAgICAgIHJldHVybiAoRVJlZmVyZW5jZSlnZXRDYWxlbmRhcnMoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0RG9jdW1lbnRSb290KCkgewotCQlpZiAoZG9jdW1lbnRSb290RUNsYXNzID09IG51bGwpIHsKLQkJCWRvY3VtZW50Um9vdEVDbGFzcyA9IChFQ2xhc3MpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoMjkpOwotCQl9Ci0JCXJldHVybiBkb2N1bWVudFJvb3RFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RG9jdW1lbnRSb290X01peGVkKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0RG9jdW1lbnRSb290KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXREb2N1bWVudFJvb3RfWE1MTlNQcmVmaXhNYXAoKSB7Ci0gICAgICAgIHJldHVybiAoRVJlZmVyZW5jZSlnZXREb2N1bWVudFJvb3QoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldERvY3VtZW50Um9vdF9YU0lTY2hlbWFMb2NhdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIChFUmVmZXJlbmNlKWdldERvY3VtZW50Um9vdCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0RG9jdW1lbnRSb290X1Byb2plY3QoKSB7Ci0gICAgICAgIHJldHVybiAoRVJlZmVyZW5jZSlnZXREb2N1bWVudFJvb3QoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUoKSB7Ci0JCWlmIChleHRlbmRlZEF0dHJpYnV0ZUVDbGFzcyA9PSBudWxsKSB7Ci0JCQlleHRlbmRlZEF0dHJpYnV0ZUVDbGFzcyA9IChFQ2xhc3MpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoMzkpOwotCQl9Ci0JCXJldHVybiBleHRlbmRlZEF0dHJpYnV0ZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRFeHRlbmRlZEF0dHJpYnV0ZV9GaWVsZElEKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEV4dGVuZGVkQXR0cmlidXRlX0ZpZWxkTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEV4dGVuZGVkQXR0cmlidXRlKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRFeHRlbmRlZEF0dHJpYnV0ZV9BbGlhcygpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEV4dGVuZGVkQXR0cmlidXRlKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRFeHRlbmRlZEF0dHJpYnV0ZV9QaG9uZXRpY0FsaWFzKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEV4dGVuZGVkQXR0cmlidXRlX1JvbGx1cFR5cGUoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRFeHRlbmRlZEF0dHJpYnV0ZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RXh0ZW5kZWRBdHRyaWJ1dGVfQ2FsY3VsYXRpb25UeXBlKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEV4dGVuZGVkQXR0cmlidXRlX0Zvcm11bGEoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRFeHRlbmRlZEF0dHJpYnV0ZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RXh0ZW5kZWRBdHRyaWJ1dGVfUmVzdHJpY3RWYWx1ZXMoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRFeHRlbmRlZEF0dHJpYnV0ZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RXh0ZW5kZWRBdHRyaWJ1dGVfVmFsdWVsaXN0U29ydE9yZGVyKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEV4dGVuZGVkQXR0cmlidXRlX0FwcGVuZE5ld1ZhbHVlcygpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEV4dGVuZGVkQXR0cmlidXRlKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg5KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRFeHRlbmRlZEF0dHJpYnV0ZV9EZWZhdWx0KCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRFeHRlbmRlZEF0dHJpYnV0ZV9WYWx1ZUxpc3QoKSB7Ci0gICAgICAgIHJldHVybiAoRVJlZmVyZW5jZSlnZXRFeHRlbmRlZEF0dHJpYnV0ZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUyKCkgewotCQlpZiAoZXh0ZW5kZWRBdHRyaWJ1dGUyRUNsYXNzID09IG51bGwpIHsKLQkJCWV4dGVuZGVkQXR0cmlidXRlMkVDbGFzcyA9IChFQ2xhc3MpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoNDApOwotCQl9Ci0JCXJldHVybiBleHRlbmRlZEF0dHJpYnV0ZTJFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUyX1VJRCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEV4dGVuZGVkQXR0cmlidXRlMigpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUyX0ZpZWxkSUQoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRFeHRlbmRlZEF0dHJpYnV0ZTIoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEV4dGVuZGVkQXR0cmlidXRlMl9WYWx1ZSgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEV4dGVuZGVkQXR0cmlidXRlMigpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUyX1ZhbHVlSUQoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRFeHRlbmRlZEF0dHJpYnV0ZTIoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEV4dGVuZGVkQXR0cmlidXRlMl9EdXJhdGlvbkZvcm1hdCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEV4dGVuZGVkQXR0cmlidXRlMigpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRFeHRlbmRlZEF0dHJpYnV0ZTMoKSB7Ci0JCWlmIChleHRlbmRlZEF0dHJpYnV0ZTNFQ2xhc3MgPT0gbnVsbCkgewotCQkJZXh0ZW5kZWRBdHRyaWJ1dGUzRUNsYXNzID0gKEVDbGFzcylFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNc3Byb2plY3RQYWNrYWdlLmVOU19VUkkpLmdldEVDbGFzc2lmaWVycygpLmdldCg0MSk7Ci0JCX0KLQkJcmV0dXJuIGV4dGVuZGVkQXR0cmlidXRlM0VDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRFeHRlbmRlZEF0dHJpYnV0ZTNfVUlEKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUzKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRFeHRlbmRlZEF0dHJpYnV0ZTNfRmllbGRJRCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEV4dGVuZGVkQXR0cmlidXRlMygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUzX1ZhbHVlKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUzKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRFeHRlbmRlZEF0dHJpYnV0ZTNfVmFsdWVJRCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEV4dGVuZGVkQXR0cmlidXRlMygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUzX0R1cmF0aW9uRm9ybWF0KCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUzKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldEV4dGVuZGVkQXR0cmlidXRlNCgpIHsKLQkJaWYgKGV4dGVuZGVkQXR0cmlidXRlNEVDbGFzcyA9PSBudWxsKSB7Ci0JCQlleHRlbmRlZEF0dHJpYnV0ZTRFQ2xhc3MgPSAoRUNsYXNzKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDQyKTsKLQkJfQotCQlyZXR1cm4gZXh0ZW5kZWRBdHRyaWJ1dGU0RUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEV4dGVuZGVkQXR0cmlidXRlNF9VSUQoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRFeHRlbmRlZEF0dHJpYnV0ZTQoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEV4dGVuZGVkQXR0cmlidXRlNF9GaWVsZElEKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0RXh0ZW5kZWRBdHRyaWJ1dGU0KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRFeHRlbmRlZEF0dHJpYnV0ZTRfVmFsdWUoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRFeHRlbmRlZEF0dHJpYnV0ZTQoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEV4dGVuZGVkQXR0cmlidXRlNF9WYWx1ZUlEKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0RXh0ZW5kZWRBdHRyaWJ1dGU0KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRFeHRlbmRlZEF0dHJpYnV0ZTRfRHVyYXRpb25Gb3JtYXQoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRFeHRlbmRlZEF0dHJpYnV0ZTQoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0RXh0ZW5kZWRBdHRyaWJ1dGVzKCkgewotCQlpZiAoZXh0ZW5kZWRBdHRyaWJ1dGVzRUNsYXNzID09IG51bGwpIHsKLQkJCWV4dGVuZGVkQXR0cmlidXRlc0VDbGFzcyA9IChFQ2xhc3MpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoNDMpOwotCQl9Ci0JCXJldHVybiBleHRlbmRlZEF0dHJpYnV0ZXNFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0RXh0ZW5kZWRBdHRyaWJ1dGVzX0V4dGVuZGVkQXR0cmlidXRlKCkgewotICAgICAgICByZXR1cm4gKEVSZWZlcmVuY2UpZ2V0RXh0ZW5kZWRBdHRyaWJ1dGVzKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldE1hc2soKSB7Ci0JCWlmIChtYXNrRUNsYXNzID09IG51bGwpIHsKLQkJCW1hc2tFQ2xhc3MgPSAoRUNsYXNzKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDYyKTsKLQkJfQotCQlyZXR1cm4gbWFza0VDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRNYXNrX0xldmVsKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0TWFzaygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0TWFza19UeXBlKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0TWFzaygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0TWFza19MZW5ndGgoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRNYXNrKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRNYXNrX1NlcGFyYXRvcigpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldE1hc2soKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0TWFza3MoKSB7Ci0JCWlmIChtYXNrc0VDbGFzcyA9PSBudWxsKSB7Ci0JCQltYXNrc0VDbGFzcyA9IChFQ2xhc3MpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoNjMpOwotCQl9Ci0JCXJldHVybiBtYXNrc0VDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRNYXNrc19NYXNrKCkgewotICAgICAgICByZXR1cm4gKEVSZWZlcmVuY2UpZ2V0TWFza3MoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0T3V0bGluZUNvZGUoKSB7Ci0JCWlmIChvdXRsaW5lQ29kZUVDbGFzcyA9PSBudWxsKSB7Ci0JCQlvdXRsaW5lQ29kZUVDbGFzcyA9IChFQ2xhc3MpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoNzEpOwotCQl9Ci0JCXJldHVybiBvdXRsaW5lQ29kZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRPdXRsaW5lQ29kZV9GaWVsZElEKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0T3V0bGluZUNvZGUoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldE91dGxpbmVDb2RlX0ZpZWxkTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldE91dGxpbmVDb2RlKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRPdXRsaW5lQ29kZV9BbGlhcygpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldE91dGxpbmVDb2RlKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRPdXRsaW5lQ29kZV9QaG9uZXRpY0FsaWFzKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0T3V0bGluZUNvZGUoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldE91dGxpbmVDb2RlX1ZhbHVlcygpIHsKLSAgICAgICAgcmV0dXJuIChFUmVmZXJlbmNlKWdldE91dGxpbmVDb2RlKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRPdXRsaW5lQ29kZV9FbnRlcnByaXNlKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0T3V0bGluZUNvZGUoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldE91dGxpbmVDb2RlX0VudGVycHJpc2VPdXRsaW5lQ29kZUFsaWFzKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0T3V0bGluZUNvZGUoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDYpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldE91dGxpbmVDb2RlX1Jlc291cmNlU3Vic3RpdHV0aW9uRW5hYmxlZCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldE91dGxpbmVDb2RlKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg3KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRPdXRsaW5lQ29kZV9MZWFmT25seSgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldE91dGxpbmVDb2RlKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg4KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRPdXRsaW5lQ29kZV9BbGxMZXZlbHNSZXF1aXJlZCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldE91dGxpbmVDb2RlKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg5KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRPdXRsaW5lQ29kZV9Pbmx5VGFibGVWYWx1ZXNBbGxvd2VkKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0T3V0bGluZUNvZGUoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRPdXRsaW5lQ29kZV9NYXNrcygpIHsKLSAgICAgICAgcmV0dXJuIChFUmVmZXJlbmNlKWdldE91dGxpbmVDb2RlKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRPdXRsaW5lQ29kZTIoKSB7Ci0JCWlmIChvdXRsaW5lQ29kZTJFQ2xhc3MgPT0gbnVsbCkgewotCQkJb3V0bGluZUNvZGUyRUNsYXNzID0gKEVDbGFzcylFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNc3Byb2plY3RQYWNrYWdlLmVOU19VUkkpLmdldEVDbGFzc2lmaWVycygpLmdldCg3Mik7Ci0JCX0KLQkJcmV0dXJuIG91dGxpbmVDb2RlMkVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRPdXRsaW5lQ29kZTJfVUlEKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0T3V0bGluZUNvZGUyKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRPdXRsaW5lQ29kZTJfRmllbGRJRCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldE91dGxpbmVDb2RlMigpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0T3V0bGluZUNvZGUyX1ZhbHVlSUQoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRPdXRsaW5lQ29kZTIoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0T3V0bGluZUNvZGUzKCkgewotCQlpZiAob3V0bGluZUNvZGUzRUNsYXNzID09IG51bGwpIHsKLQkJCW91dGxpbmVDb2RlM0VDbGFzcyA9IChFQ2xhc3MpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoNzMpOwotCQl9Ci0JCXJldHVybiBvdXRsaW5lQ29kZTNFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0T3V0bGluZUNvZGUzX1VJRCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldE91dGxpbmVDb2RlMygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0T3V0bGluZUNvZGUzX0ZpZWxkSUQoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRPdXRsaW5lQ29kZTMoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldE91dGxpbmVDb2RlM19WYWx1ZUlEKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0T3V0bGluZUNvZGUzKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldE91dGxpbmVDb2RlcygpIHsKLQkJaWYgKG91dGxpbmVDb2Rlc0VDbGFzcyA9PSBudWxsKSB7Ci0JCQlvdXRsaW5lQ29kZXNFQ2xhc3MgPSAoRUNsYXNzKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDc0KTsKLQkJfQotCQlyZXR1cm4gb3V0bGluZUNvZGVzRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldE91dGxpbmVDb2Rlc19PdXRsaW5lQ29kZSgpIHsKLSAgICAgICAgcmV0dXJuIChFUmVmZXJlbmNlKWdldE91dGxpbmVDb2RlcygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRQcmVkZWNlc3NvckxpbmsoKSB7Ci0JCWlmIChwcmVkZWNlc3NvckxpbmtFQ2xhc3MgPT0gbnVsbCkgewotCQkJcHJlZGVjZXNzb3JMaW5rRUNsYXNzID0gKEVDbGFzcylFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNc3Byb2plY3RQYWNrYWdlLmVOU19VUkkpLmdldEVDbGFzc2lmaWVycygpLmdldCg4MCk7Ci0JCX0KLQkJcmV0dXJuIHByZWRlY2Vzc29yTGlua0VDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQcmVkZWNlc3NvckxpbmtfUHJlZGVjZXNzb3JVSUQoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRQcmVkZWNlc3NvckxpbmsoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByZWRlY2Vzc29yTGlua19UeXBlKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UHJlZGVjZXNzb3JMaW5rKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQcmVkZWNlc3NvckxpbmtfQ3Jvc3NQcm9qZWN0KCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UHJlZGVjZXNzb3JMaW5rKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQcmVkZWNlc3NvckxpbmtfQ3Jvc3NQcm9qZWN0TmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFByZWRlY2Vzc29yTGluaygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJlZGVjZXNzb3JMaW5rX0xpbmtMYWcoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRQcmVkZWNlc3NvckxpbmsoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByZWRlY2Vzc29yTGlua19MYWdGb3JtYXQoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRQcmVkZWNlc3NvckxpbmsoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0UHJvamVjdCgpIHsKLQkJaWYgKHByb2plY3RFQ2xhc3MgPT0gbnVsbCkgewotCQkJcHJvamVjdEVDbGFzcyA9IChFQ2xhc3MpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoODIpOwotCQl9Ci0JCXJldHVybiBwcm9qZWN0RUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByb2plY3RfVUlEKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UHJvamVjdCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9OYW1lKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UHJvamVjdCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9UaXRsZSgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFByb2plY3QoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByb2plY3RfU3ViamVjdCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFByb2plY3QoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByb2plY3RfQ2F0ZWdvcnkoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRQcm9qZWN0KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X0NvbXBhbnkoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRQcm9qZWN0KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X01hbmFnZXIoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRQcm9qZWN0KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg2KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X0F1dGhvcigpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFByb2plY3QoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDcpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByb2plY3RfQ3JlYXRpb25EYXRlKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UHJvamVjdCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoOCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9SZXZpc2lvbigpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFByb2plY3QoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByb2plY3RfTGFzdFNhdmVkKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UHJvamVjdCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByb2plY3RfU2NoZWR1bGVGcm9tU3RhcnQoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRQcm9qZWN0KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9TdGFydERhdGUoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRQcm9qZWN0KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9GaW5pc2hEYXRlKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UHJvamVjdCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByb2plY3RfRllTdGFydERhdGUoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRQcm9qZWN0KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxNCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9Dcml0aWNhbFNsYWNrTGltaXQoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRQcm9qZWN0KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxNSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9DdXJyZW5jeURpZ2l0cygpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFByb2plY3QoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDE2KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X0N1cnJlbmN5U3ltYm9sKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UHJvamVjdCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTcpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByb2plY3RfQ3VycmVuY3lTeW1ib2xQb3NpdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFByb2plY3QoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDE4KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X0NhbGVuZGFyVUlEKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UHJvamVjdCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByb2plY3RfRGVmYXVsdFN0YXJ0VGltZSgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFByb2plY3QoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X0RlZmF1bHRGaW5pc2hUaW1lKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UHJvamVjdCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMjEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByb2plY3RfTWludXRlc1BlckRheSgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFByb2plY3QoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X01pbnV0ZXNQZXJXZWVrKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UHJvamVjdCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMjMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByb2plY3RfRGF5c1Blck1vbnRoKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UHJvamVjdCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMjQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByb2plY3RfRGVmYXVsdFRhc2tUeXBlKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UHJvamVjdCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMjUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByb2plY3RfRGVmYXVsdEZpeGVkQ29zdEFjY3J1YWwoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRQcm9qZWN0KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyNik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9EZWZhdWx0U3RhbmRhcmRSYXRlKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UHJvamVjdCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMjcpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByb2plY3RfRGVmYXVsdE92ZXJ0aW1lUmF0ZSgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFByb2plY3QoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDI4KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X0R1cmF0aW9uRm9ybWF0KCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UHJvamVjdCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMjkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByb2plY3RfV29ya0Zvcm1hdCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFByb2plY3QoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X0VkaXRhYmxlQWN0dWFsQ29zdHMoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRQcm9qZWN0KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9Ib25vckNvbnN0cmFpbnRzKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UHJvamVjdCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMzIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByb2plY3RfRWFybmVkVmFsdWVNZXRob2QoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRQcm9qZWN0KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9JbnNlcnRlZFByb2plY3RzTGlrZVN1bW1hcnkoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRQcm9qZWN0KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzNCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9NdWx0aXBsZUNyaXRpY2FsUGF0aHMoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRQcm9qZWN0KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzNSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9OZXdUYXNrc0VmZm9ydERyaXZlbigpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFByb2plY3QoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDM2KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X05ld1Rhc2tzRXN0aW1hdGVkKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UHJvamVjdCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMzcpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByb2plY3RfU3BsaXRzSW5Qcm9ncmVzc1Rhc2tzKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UHJvamVjdCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMzgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByb2plY3RfU3ByZWFkQWN0dWFsQ29zdCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFByb2plY3QoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDM5KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X1NwcmVhZFBlcmNlbnRDb21wbGV0ZSgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFByb2plY3QoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X1Rhc2tVcGRhdGVzUmVzb3VyY2UoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRQcm9qZWN0KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0MSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9GaXNjYWxZZWFyU3RhcnQoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRQcm9qZWN0KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0Mik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9XZWVrU3RhcnREYXkoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRQcm9qZWN0KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0Myk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9Nb3ZlQ29tcGxldGVkRW5kc0JhY2soKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRQcm9qZWN0KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0NCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9Nb3ZlUmVtYWluaW5nU3RhcnRzQmFjaygpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFByb2plY3QoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQ1KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X01vdmVSZW1haW5pbmdTdGFydHNGb3J3YXJkKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UHJvamVjdCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNDYpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByb2plY3RfTW92ZUNvbXBsZXRlZEVuZHNGb3J3YXJkKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UHJvamVjdCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNDcpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByb2plY3RfQmFzZWxpbmVGb3JFYXJuZWRWYWx1ZSgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFByb2plY3QoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQ4KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X0F1dG9BZGROZXdSZXNvdXJjZXNBbmRUYXNrcygpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFByb2plY3QoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQ5KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X1N0YXR1c0RhdGUoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRQcm9qZWN0KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1MCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9DdXJyZW50RGF0ZSgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFByb2plY3QoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X01pY3Jvc29mdFByb2plY3RTZXJ2ZXJVUkwoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRQcm9qZWN0KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1Mik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9BdXRvbGluaygpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFByb2plY3QoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X05ld1Rhc2tTdGFydERhdGUoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRQcm9qZWN0KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1NCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9EZWZhdWx0VGFza0VWTWV0aG9kKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UHJvamVjdCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNTUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByb2plY3RfUHJvamVjdEV4dGVybmFsbHlFZGl0ZWQoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRQcm9qZWN0KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1Nik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9FeHRlbmRlZENyZWF0aW9uRGF0ZSgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFByb2plY3QoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDU3KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X0FjdHVhbHNJblN5bmMoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRQcm9qZWN0KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1OCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9SZW1vdmVGaWxlUHJvcGVydGllcygpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFByb2plY3QoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDU5KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X0FkbWluUHJvamVjdCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFByb2plY3QoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDYwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRQcm9qZWN0X091dGxpbmVDb2RlcygpIHsKLSAgICAgICAgcmV0dXJuIChFUmVmZXJlbmNlKWdldFByb2plY3QoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDYxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRQcm9qZWN0X1dCU01hc2tzKCkgewotICAgICAgICByZXR1cm4gKEVSZWZlcmVuY2UpZ2V0UHJvamVjdCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNjIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFByb2plY3RfRXh0ZW5kZWRBdHRyaWJ1dGVzKCkgewotICAgICAgICByZXR1cm4gKEVSZWZlcmVuY2UpZ2V0UHJvamVjdCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNjMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFByb2plY3RfQ2FsZW5kYXJzKCkgewotICAgICAgICByZXR1cm4gKEVSZWZlcmVuY2UpZ2V0UHJvamVjdCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNjQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFByb2plY3RfVGFza3MoKSB7Ci0gICAgICAgIHJldHVybiAoRVJlZmVyZW5jZSlnZXRQcm9qZWN0KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg2NSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0UHJvamVjdF9SZXNvdXJjZXMoKSB7Ci0gICAgICAgIHJldHVybiAoRVJlZmVyZW5jZSlnZXRQcm9qZWN0KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg2Nik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0UHJvamVjdF9Bc3NpZ25tZW50cygpIHsKLSAgICAgICAgcmV0dXJuIChFUmVmZXJlbmNlKWdldFByb2plY3QoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDY3KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFJhdGUoKSB7Ci0JCWlmIChyYXRlRUNsYXNzID09IG51bGwpIHsKLQkJCXJhdGVFQ2xhc3MgPSAoRUNsYXNzKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDgzKTsKLQkJfQotCQlyZXR1cm4gcmF0ZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRSYXRlX1JhdGVzRnJvbSgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFJhdGUoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFJhdGVfUmF0ZXNUbygpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFJhdGUoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFJhdGVfUmF0ZVRhYmxlKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UmF0ZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UmF0ZV9TdGFuZGFyZFJhdGUoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRSYXRlKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRSYXRlX1N0YW5kYXJkUmF0ZUZvcm1hdCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFJhdGUoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFJhdGVfT3ZlcnRpbWVSYXRlKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UmF0ZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UmF0ZV9PdmVydGltZVJhdGVGb3JtYXQoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRSYXRlKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg2KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRSYXRlX0Nvc3RQZXJVc2UoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRSYXRlKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg3KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFJhdGVzKCkgewotCQlpZiAocmF0ZXNFQ2xhc3MgPT0gbnVsbCkgewotCQkJcmF0ZXNFQ2xhc3MgPSAoRUNsYXNzKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDg0KTsKLQkJfQotCQlyZXR1cm4gcmF0ZXNFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0UmF0ZXNfUmF0ZSgpIHsKLSAgICAgICAgcmV0dXJuIChFUmVmZXJlbmNlKWdldFJhdGVzKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFJlc291cmNlKCkgewotCQlpZiAocmVzb3VyY2VFQ2xhc3MgPT0gbnVsbCkgewotCQkJcmVzb3VyY2VFQ2xhc3MgPSAoRUNsYXNzKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDg2KTsKLQkJfQotCQlyZXR1cm4gcmVzb3VyY2VFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfVUlEKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UmVzb3VyY2UoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFJlc291cmNlX0lEKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UmVzb3VyY2UoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFJlc291cmNlX05hbWUoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRSZXNvdXJjZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfVHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFJlc291cmNlKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9Jc051bGwoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRSZXNvdXJjZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfSW5pdGlhbHMoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRSZXNvdXJjZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfUGhvbmV0aWNzKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UmVzb3VyY2UoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDYpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFJlc291cmNlX05UQWNjb3VudCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFJlc291cmNlKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg3KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9NYXRlcmlhbExhYmVsKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UmVzb3VyY2UoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFJlc291cmNlX0NvZGUoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRSZXNvdXJjZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoOSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfR3JvdXAoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRSZXNvdXJjZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFJlc291cmNlX1dvcmtHcm91cCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFJlc291cmNlKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfRW1haWxBZGRyZXNzKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UmVzb3VyY2UoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9IeXBlcmxpbmsoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRSZXNvdXJjZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFJlc291cmNlX0h5cGVybGlua0FkZHJlc3MoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRSZXNvdXJjZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFJlc291cmNlX0h5cGVybGlua1N1YkFkZHJlc3MoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRSZXNvdXJjZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFJlc291cmNlX01heFVuaXRzKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UmVzb3VyY2UoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDE2KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9QZWFrVW5pdHMoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRSZXNvdXJjZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTcpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFJlc291cmNlX092ZXJBbGxvY2F0ZWQoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRSZXNvdXJjZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFJlc291cmNlX0F2YWlsYWJsZUZyb20oKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRSZXNvdXJjZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFJlc291cmNlX0F2YWlsYWJsZVRvKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UmVzb3VyY2UoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9TdGFydCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFJlc291cmNlKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfRmluaXNoKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UmVzb3VyY2UoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9DYW5MZXZlbCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFJlc291cmNlKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfQWNjcnVlQXQoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRSZXNvdXJjZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMjQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFJlc291cmNlX1dvcmsoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRSZXNvdXJjZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMjUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFJlc291cmNlX1JlZ3VsYXJXb3JrKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UmVzb3VyY2UoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDI2KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9PdmVydGltZVdvcmsoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRSZXNvdXJjZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMjcpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFJlc291cmNlX0FjdHVhbFdvcmsoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRSZXNvdXJjZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMjgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFJlc291cmNlX1JlbWFpbmluZ1dvcmsoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRSZXNvdXJjZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMjkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFJlc291cmNlX0FjdHVhbE92ZXJ0aW1lV29yaygpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFJlc291cmNlKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfUmVtYWluaW5nT3ZlcnRpbWVXb3JrKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UmVzb3VyY2UoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9QZXJjZW50V29ya0NvbXBsZXRlKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UmVzb3VyY2UoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9TdGFuZGFyZFJhdGUoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRSZXNvdXJjZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMzMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFJlc291cmNlX1N0YW5kYXJkUmF0ZUZvcm1hdCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFJlc291cmNlKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzNCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfQ29zdCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFJlc291cmNlKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzNSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfT3ZlcnRpbWVSYXRlKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UmVzb3VyY2UoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDM2KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9PdmVydGltZVJhdGVGb3JtYXQoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRSZXNvdXJjZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMzcpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFJlc291cmNlX092ZXJ0aW1lQ29zdCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFJlc291cmNlKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzOCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfQ29zdFBlclVzZSgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFJlc291cmNlKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzOSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfQWN0dWFsQ29zdCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFJlc291cmNlKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0MCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfQWN0dWFsT3ZlcnRpbWVDb3N0KCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UmVzb3VyY2UoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9SZW1haW5pbmdDb3N0KCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UmVzb3VyY2UoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9SZW1haW5pbmdPdmVydGltZUNvc3QoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRSZXNvdXJjZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFJlc291cmNlX1dvcmtWYXJpYW5jZSgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFJlc291cmNlKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0NCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfQ29zdFZhcmlhbmNlKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UmVzb3VyY2UoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQ1KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9TVigpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFJlc291cmNlKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0Nik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfQ1YoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRSZXNvdXJjZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNDcpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFJlc291cmNlX0FDV1AoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRSZXNvdXJjZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNDgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFJlc291cmNlX0NhbGVuZGFyVUlEKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UmVzb3VyY2UoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQ5KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9Ob3RlcygpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFJlc291cmNlKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1MCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfQkNXUygpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFJlc291cmNlKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1MSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfQkNXUCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFJlc291cmNlKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1Mik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfSXNHZW5lcmljKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UmVzb3VyY2UoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9Jc0luYWN0aXZlKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UmVzb3VyY2UoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDU0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9Jc0VudGVycHJpc2UoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRSZXNvdXJjZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNTUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFJlc291cmNlX0Jvb2tpbmdUeXBlKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UmVzb3VyY2UoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDU2KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9BY3R1YWxXb3JrUHJvdGVjdGVkKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UmVzb3VyY2UoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDU3KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9BY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRSZXNvdXJjZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNTgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFJlc291cmNlX0FjdGl2ZURpcmVjdG9yeUdVSUQoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRSZXNvdXJjZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNTkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFJlc291cmNlX0NyZWF0aW9uRGF0ZSgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFJlc291cmNlKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg2MCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0UmVzb3VyY2VfRXh0ZW5kZWRBdHRyaWJ1dGUoKSB7Ci0gICAgICAgIHJldHVybiAoRVJlZmVyZW5jZSlnZXRSZXNvdXJjZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNjEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFJlc291cmNlX0Jhc2VsaW5lKCkgewotICAgICAgICByZXR1cm4gKEVSZWZlcmVuY2UpZ2V0UmVzb3VyY2UoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDYyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRSZXNvdXJjZV9PdXRsaW5lQ29kZSgpIHsKLSAgICAgICAgcmV0dXJuIChFUmVmZXJlbmNlKWdldFJlc291cmNlKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg2Myk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0UmVzb3VyY2VfQXZhaWxhYmlsaXR5UGVyaW9kcygpIHsKLSAgICAgICAgcmV0dXJuIChFUmVmZXJlbmNlKWdldFJlc291cmNlKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg2NCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0UmVzb3VyY2VfUmF0ZXMoKSB7Ci0gICAgICAgIHJldHVybiAoRVJlZmVyZW5jZSlnZXRSZXNvdXJjZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNjUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFJlc291cmNlX1RpbWVwaGFzZWREYXRhKCkgewotICAgICAgICByZXR1cm4gKEVSZWZlcmVuY2UpZ2V0UmVzb3VyY2UoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDY2KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFJlc291cmNlcygpIHsKLQkJaWYgKHJlc291cmNlc0VDbGFzcyA9PSBudWxsKSB7Ci0JCQlyZXNvdXJjZXNFQ2xhc3MgPSAoRUNsYXNzKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDg3KTsKLQkJfQotCQlyZXR1cm4gcmVzb3VyY2VzRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFJlc291cmNlc19SZXNvdXJjZSgpIHsKLSAgICAgICAgcmV0dXJuIChFUmVmZXJlbmNlKWdldFJlc291cmNlcygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRUYXNrKCkgewotCQlpZiAodGFza0VDbGFzcyA9PSBudWxsKSB7Ci0JCQl0YXNrRUNsYXNzID0gKEVDbGFzcylFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNc3Byb2plY3RQYWNrYWdlLmVOU19VUkkpLmdldEVDbGFzc2lmaWVycygpLmdldCg5Myk7Ci0JCX0KLQkJcmV0dXJuIHRhc2tFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFza19VSUQoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRUYXNrKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrX0lEKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0VGFzaygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFza19OYW1lKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0VGFzaygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFza19UeXBlKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0VGFzaygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFza19Jc051bGwoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRUYXNrKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrX0NyZWF0ZURhdGUoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRUYXNrKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrX0NvbnRhY3QoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRUYXNrKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg2KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrX1dCUygpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFRhc2soKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDcpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhc2tfV0JTTGV2ZWwoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRUYXNrKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg4KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrX091dGxpbmVOdW1iZXIoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRUYXNrKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg5KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrX091dGxpbmVMZXZlbCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFRhc2soKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrX1ByaW9yaXR5KCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0VGFzaygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhc2tfU3RhcnQoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRUYXNrKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFza19GaW5pc2goKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRUYXNrKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFza19EdXJhdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFRhc2soKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDE0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrX0R1cmF0aW9uRm9ybWF0KCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0VGFzaygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhc2tfV29yaygpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFRhc2soKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDE2KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrX1N0b3AoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRUYXNrKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxNyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFza19SZXN1bWUoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRUYXNrKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxOCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFza19SZXN1bWVWYWxpZCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFRhc2soKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDE5KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrX0VmZm9ydERyaXZlbigpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFRhc2soKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrX1JlY3VycmluZygpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFRhc2soKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrX092ZXJBbGxvY2F0ZWQoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRUYXNrKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFza19Fc3RpbWF0ZWQoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRUYXNrKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFza19NaWxlc3RvbmUoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRUYXNrKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyNCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFza19TdW1tYXJ5KCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0VGFzaygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMjUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhc2tfQ3JpdGljYWwoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRUYXNrKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyNik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFza19Jc1N1YnByb2plY3QoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRUYXNrKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyNyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFza19Jc1N1YnByb2plY3RSZWFkT25seSgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFRhc2soKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDI4KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrX1N1YnByb2plY3ROYW1lKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0VGFzaygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMjkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhc2tfRXh0ZXJuYWxUYXNrKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0VGFzaygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMzApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhc2tfRXh0ZXJuYWxUYXNrUHJvamVjdCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFRhc2soKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrX0Vhcmx5U3RhcnQoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRUYXNrKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFza19FYXJseUZpbmlzaCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFRhc2soKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrX0xhdGVTdGFydCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFRhc2soKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDM0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrX0xhdGVGaW5pc2goKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRUYXNrKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzNSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFza19TdGFydFZhcmlhbmNlKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0VGFzaygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMzYpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhc2tfRmluaXNoVmFyaWFuY2UoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRUYXNrKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzNyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFza19Xb3JrVmFyaWFuY2UoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRUYXNrKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzOCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFza19GcmVlU2xhY2soKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRUYXNrKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzOSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFza19Ub3RhbFNsYWNrKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0VGFzaygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhc2tfRml4ZWRDb3N0KCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0VGFzaygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhc2tfRml4ZWRDb3N0QWNjcnVhbCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFRhc2soKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrX1BlcmNlbnRDb21wbGV0ZSgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFRhc2soKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrX1BlcmNlbnRXb3JrQ29tcGxldGUoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRUYXNrKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0NCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFza19Db3N0KCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0VGFzaygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNDUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhc2tfT3ZlcnRpbWVDb3N0KCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0VGFzaygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNDYpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhc2tfT3ZlcnRpbWVXb3JrKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0VGFzaygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNDcpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhc2tfQWN0dWFsU3RhcnQoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRUYXNrKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0OCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFza19BY3R1YWxGaW5pc2goKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRUYXNrKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0OSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFza19BY3R1YWxEdXJhdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFRhc2soKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrX0FjdHVhbENvc3QoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRUYXNrKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1MSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFza19BY3R1YWxPdmVydGltZUNvc3QoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRUYXNrKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1Mik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFza19BY3R1YWxXb3JrKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0VGFzaygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNTMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhc2tfQWN0dWFsT3ZlcnRpbWVXb3JrKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0VGFzaygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNTQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhc2tfUmVndWxhcldvcmsoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRUYXNrKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1NSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFza19SZW1haW5pbmdEdXJhdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFRhc2soKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDU2KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrX1JlbWFpbmluZ0Nvc3QoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRUYXNrKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1Nyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFza19SZW1haW5pbmdXb3JrKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0VGFzaygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNTgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhc2tfUmVtYWluaW5nT3ZlcnRpbWVDb3N0KCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0VGFzaygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNTkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhc2tfUmVtYWluaW5nT3ZlcnRpbWVXb3JrKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0VGFzaygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNjApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhc2tfQUNXUCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFRhc2soKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDYxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrX0NWKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0VGFzaygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNjIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhc2tfQ29uc3RyYWludFR5cGUoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRUYXNrKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg2Myk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFza19DYWxlbmRhclVJRCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFRhc2soKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDY0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrX0NvbnN0cmFpbnREYXRlKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0VGFzaygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNjUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhc2tfRGVhZGxpbmUoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRUYXNrKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg2Nik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFza19MZXZlbEFzc2lnbm1lbnRzKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0VGFzaygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNjcpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhc2tfTGV2ZWxpbmdDYW5TcGxpdCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFRhc2soKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDY4KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrX0xldmVsaW5nRGVsYXkoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRUYXNrKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg2OSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFza19MZXZlbGluZ0RlbGF5Rm9ybWF0KCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0VGFzaygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNzApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhc2tfUHJlTGV2ZWxlZFN0YXJ0KCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0VGFzaygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNzEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhc2tfUHJlTGV2ZWxlZEZpbmlzaCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFRhc2soKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDcyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrX0h5cGVybGluaygpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFRhc2soKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDczKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrX0h5cGVybGlua0FkZHJlc3MoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRUYXNrKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg3NCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFza19IeXBlcmxpbmtTdWJBZGRyZXNzKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0VGFzaygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNzUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhc2tfSWdub3JlUmVzb3VyY2VDYWxlbmRhcigpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFRhc2soKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDc2KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrX05vdGVzKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0VGFzaygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNzcpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhc2tfSGlkZUJhcigpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFRhc2soKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDc4KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrX1JvbGx1cCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFRhc2soKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDc5KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrX0JDV1MoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRUYXNrKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg4MCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFza19CQ1dQKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0VGFzaygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoODEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhc2tfUGh5c2ljYWxQZXJjZW50Q29tcGxldGUoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRUYXNrKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg4Mik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFza19FYXJuZWRWYWx1ZU1ldGhvZCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFRhc2soKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRUYXNrX1ByZWRlY2Vzc29yTGluaygpIHsKLSAgICAgICAgcmV0dXJuIChFUmVmZXJlbmNlKWdldFRhc2soKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDg0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrX0FjdHVhbFdvcmtQcm90ZWN0ZWQoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRUYXNrKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg4NSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFza19BY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRUYXNrKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg4Nik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0VGFza19FeHRlbmRlZEF0dHJpYnV0ZSgpIHsKLSAgICAgICAgcmV0dXJuIChFUmVmZXJlbmNlKWdldFRhc2soKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDg3KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRUYXNrX0Jhc2VsaW5lKCkgewotICAgICAgICByZXR1cm4gKEVSZWZlcmVuY2UpZ2V0VGFzaygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoODgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFRhc2tfT3V0bGluZUNvZGUoKSB7Ci0gICAgICAgIHJldHVybiAoRVJlZmVyZW5jZSlnZXRUYXNrKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg4OSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0VGFza19UaW1lcGhhc2VkRGF0YSgpIHsKLSAgICAgICAgcmV0dXJuIChFUmVmZXJlbmNlKWdldFRhc2soKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDkwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFRhc2tzKCkgewotCQlpZiAodGFza3NFQ2xhc3MgPT0gbnVsbCkgewotCQkJdGFza3NFQ2xhc3MgPSAoRUNsYXNzKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDk0KTsKLQkJfQotCQlyZXR1cm4gdGFza3NFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0VGFza3NfVGFzaygpIHsKLSAgICAgICAgcmV0dXJuIChFUmVmZXJlbmNlKWdldFRhc2tzKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFRpbWVQZXJpb2QoKSB7Ci0JCWlmICh0aW1lUGVyaW9kRUNsYXNzID09IG51bGwpIHsKLQkJCXRpbWVQZXJpb2RFQ2xhc3MgPSAoRUNsYXNzKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDk1KTsKLQkJfQotCQlyZXR1cm4gdGltZVBlcmlvZEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUaW1lUGVyaW9kX0Zyb21EYXRlKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0VGltZVBlcmlvZCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGltZVBlcmlvZF9Ub0RhdGUoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRUaW1lUGVyaW9kKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFRpbWVwaGFzZWREYXRhVHlwZSgpIHsKLQkJaWYgKHRpbWVwaGFzZWREYXRhVHlwZUVDbGFzcyA9PSBudWxsKSB7Ci0JCQl0aW1lcGhhc2VkRGF0YVR5cGVFQ2xhc3MgPSAoRUNsYXNzKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDk2KTsKLQkJfQotCQlyZXR1cm4gdGltZXBoYXNlZERhdGFUeXBlRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRpbWVwaGFzZWREYXRhVHlwZV9UeXBlKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0VGltZXBoYXNlZERhdGFUeXBlKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUaW1lcGhhc2VkRGF0YVR5cGVfVUlEKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0VGltZXBoYXNlZERhdGFUeXBlKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUaW1lcGhhc2VkRGF0YVR5cGVfU3RhcnQoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRUaW1lcGhhc2VkRGF0YVR5cGUoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRpbWVwaGFzZWREYXRhVHlwZV9GaW5pc2goKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRUaW1lcGhhc2VkRGF0YVR5cGUoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRpbWVwaGFzZWREYXRhVHlwZV9Vbml0KCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0VGltZXBoYXNlZERhdGFUeXBlKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUaW1lcGhhc2VkRGF0YVR5cGVfVmFsdWUoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRUaW1lcGhhc2VkRGF0YVR5cGUoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0VmFsdWUoKSB7Ci0JCWlmICh2YWx1ZUVDbGFzcyA9PSBudWxsKSB7Ci0JCQl2YWx1ZUVDbGFzcyA9IChFQ2xhc3MpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoMTA2KTsKLQkJfQotCQlyZXR1cm4gdmFsdWVFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VmFsdWVfVmFsdWVJRCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFZhbHVlKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRWYWx1ZV9QYXJlbnRWYWx1ZUlEKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0VmFsdWUoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFZhbHVlX1ZhbHVlKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0VmFsdWUoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFZhbHVlX0Rlc2NyaXB0aW9uKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0VmFsdWUoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0VmFsdWUyKCkgewotCQlpZiAodmFsdWUyRUNsYXNzID09IG51bGwpIHsKLQkJCXZhbHVlMkVDbGFzcyA9IChFQ2xhc3MpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoMTA3KTsKLQkJfQotCQlyZXR1cm4gdmFsdWUyRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFZhbHVlMl9JRCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFZhbHVlMigpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VmFsdWUyX1ZhbHVlKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0VmFsdWUyKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRWYWx1ZTJfRGVzY3JpcHRpb24oKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRWYWx1ZTIoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0VmFsdWVMaXN0KCkgewotCQlpZiAodmFsdWVMaXN0RUNsYXNzID09IG51bGwpIHsKLQkJCXZhbHVlTGlzdEVDbGFzcyA9IChFQ2xhc3MpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoMTA4KTsKLQkJfQotCQlyZXR1cm4gdmFsdWVMaXN0RUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFZhbHVlTGlzdF9WYWx1ZSgpIHsKLSAgICAgICAgcmV0dXJuIChFUmVmZXJlbmNlKWdldFZhbHVlTGlzdCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRWYWx1ZXMoKSB7Ci0JCWlmICh2YWx1ZXNFQ2xhc3MgPT0gbnVsbCkgewotCQkJdmFsdWVzRUNsYXNzID0gKEVDbGFzcylFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNc3Byb2plY3RQYWNrYWdlLmVOU19VUkkpLmdldEVDbGFzc2lmaWVycygpLmdldCgxMTApOwotCQl9Ci0JCXJldHVybiB2YWx1ZXNFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VmFsdWVzX0dyb3VwKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0VmFsdWVzKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRWYWx1ZXNfVmFsdWUoKSB7Ci0gICAgICAgIHJldHVybiAoRVJlZmVyZW5jZSlnZXRWYWx1ZXMoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0V0JTTWFzaygpIHsKLQkJaWYgKHdic01hc2tFQ2xhc3MgPT0gbnVsbCkgewotCQkJd2JzTWFza0VDbGFzcyA9IChFQ2xhc3MpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoMTExKTsKLQkJfQotCQlyZXR1cm4gd2JzTWFza0VDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRXQlNNYXNrX0xldmVsKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0V0JTTWFzaygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0V0JTTWFza19UeXBlKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0V0JTTWFzaygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0V0JTTWFza19MZW5ndGgoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRXQlNNYXNrKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRXQlNNYXNrX1NlcGFyYXRvcigpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFdCU01hc2soKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0V0JTTWFza3MoKSB7Ci0JCWlmICh3YnNNYXNrc0VDbGFzcyA9PSBudWxsKSB7Ci0JCQl3YnNNYXNrc0VDbGFzcyA9IChFQ2xhc3MpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoMTEyKTsKLQkJfQotCQlyZXR1cm4gd2JzTWFza3NFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0V0JTTWFza3NfVmVyaWZ5VW5pcXVlQ29kZXMoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRXQlNNYXNrcygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0V0JTTWFza3NfR2VuZXJhdGVDb2RlcygpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFdCU01hc2tzKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRXQlNNYXNrc19QcmVmaXgoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRXQlNNYXNrcygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0V0JTTWFza3NfV0JTTWFzaygpIHsKLSAgICAgICAgcmV0dXJuIChFUmVmZXJlbmNlKWdldFdCU01hc2tzKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFdlZWtEYXkoKSB7Ci0JCWlmICh3ZWVrRGF5RUNsYXNzID09IG51bGwpIHsKLQkJCXdlZWtEYXlFQ2xhc3MgPSAoRUNsYXNzKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDExMyk7Ci0JCX0KLQkJcmV0dXJuIHdlZWtEYXlFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0V2Vla0RheV9EYXlUeXBlKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0V2Vla0RheSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0V2Vla0RheV9EYXlXb3JraW5nKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0V2Vla0RheSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0V2Vla0RheV9UaW1lUGVyaW9kKCkgewotICAgICAgICByZXR1cm4gKEVSZWZlcmVuY2UpZ2V0V2Vla0RheSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0V2Vla0RheV9Xb3JraW5nVGltZXMoKSB7Ci0gICAgICAgIHJldHVybiAoRVJlZmVyZW5jZSlnZXRXZWVrRGF5KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFdlZWtEYXlzKCkgewotCQlpZiAod2Vla0RheXNFQ2xhc3MgPT0gbnVsbCkgewotCQkJd2Vla0RheXNFQ2xhc3MgPSAoRUNsYXNzKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDExNCk7Ci0JCX0KLQkJcmV0dXJuIHdlZWtEYXlzRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFdlZWtEYXlzX1dlZWtEYXkoKSB7Ci0gICAgICAgIHJldHVybiAoRVJlZmVyZW5jZSlnZXRXZWVrRGF5cygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRXb3JraW5nVGltZSgpIHsKLQkJaWYgKHdvcmtpbmdUaW1lRUNsYXNzID09IG51bGwpIHsKLQkJCXdvcmtpbmdUaW1lRUNsYXNzID0gKEVDbGFzcylFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNc3Byb2plY3RQYWNrYWdlLmVOU19VUkkpLmdldEVDbGFzc2lmaWVycygpLmdldCgxMTkpOwotCQl9Ci0JCXJldHVybiB3b3JraW5nVGltZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRXb3JraW5nVGltZV9Gcm9tVGltZSgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFdvcmtpbmdUaW1lKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRXb3JraW5nVGltZV9Ub1RpbWUoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRXb3JraW5nVGltZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRXb3JraW5nVGltZXMoKSB7Ci0JCWlmICh3b3JraW5nVGltZXNFQ2xhc3MgPT0gbnVsbCkgewotCQkJd29ya2luZ1RpbWVzRUNsYXNzID0gKEVDbGFzcylFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNc3Byb2plY3RQYWNrYWdlLmVOU19VUkkpLmdldEVDbGFzc2lmaWVycygpLmdldCgxMjApOwotCQl9Ci0JCXJldHVybiB3b3JraW5nVGltZXNFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0V29ya2luZ1RpbWVzX1dvcmtpbmdUaW1lKCkgewotICAgICAgICByZXR1cm4gKEVSZWZlcmVuY2UpZ2V0V29ya2luZ1RpbWVzKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldEFjY3J1ZUF0KCkgewotCQlpZiAoYWNjcnVlQXRFRGF0YVR5cGUgPT0gbnVsbCkgewotCQkJYWNjcnVlQXRFRGF0YVR5cGUgPSAoRURhdGFUeXBlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDApOwotCQl9Ci0JCXJldHVybiBhY2NydWVBdEVEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldEFjdGl2ZURpcmVjdG9yeUdVSURUeXBlKCkgewotCQlpZiAoYWN0aXZlRGlyZWN0b3J5R1VJRFR5cGVFRGF0YVR5cGUgPT0gbnVsbCkgewotCQkJYWN0aXZlRGlyZWN0b3J5R1VJRFR5cGVFRGF0YVR5cGUgPSAoRURhdGFUeXBlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDEpOwotCQl9Ci0JCXJldHVybiBhY3RpdmVEaXJlY3RvcnlHVUlEVHlwZUVEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldEFsaWFzVHlwZSgpIHsKLQkJaWYgKGFsaWFzVHlwZUVEYXRhVHlwZSA9PSBudWxsKSB7Ci0JCQlhbGlhc1R5cGVFRGF0YVR5cGUgPSAoRURhdGFUeXBlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDIpOwotCQl9Ci0JCXJldHVybiBhbGlhc1R5cGVFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXRBdXRob3JUeXBlKCkgewotCQlpZiAoYXV0aG9yVHlwZUVEYXRhVHlwZSA9PSBudWxsKSB7Ci0JCQlhdXRob3JUeXBlRURhdGFUeXBlID0gKEVEYXRhVHlwZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNc3Byb2plY3RQYWNrYWdlLmVOU19VUkkpLmdldEVDbGFzc2lmaWVycygpLmdldCg1KTsKLQkJfQotCQlyZXR1cm4gYXV0aG9yVHlwZUVEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldEJhc2VsaW5lRm9yRWFybmVkVmFsdWVUeXBlKCkgewotCQlpZiAoYmFzZWxpbmVGb3JFYXJuZWRWYWx1ZVR5cGVFRGF0YVR5cGUgPT0gbnVsbCkgewotCQkJYmFzZWxpbmVGb3JFYXJuZWRWYWx1ZVR5cGVFRGF0YVR5cGUgPSAoRURhdGFUeXBlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDExKTsKLQkJfQotCQlyZXR1cm4gYmFzZWxpbmVGb3JFYXJuZWRWYWx1ZVR5cGVFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXRCb29raW5nVHlwZVR5cGUoKSB7Ci0JCWlmIChib29raW5nVHlwZVR5cGVFRGF0YVR5cGUgPT0gbnVsbCkgewotCQkJYm9va2luZ1R5cGVUeXBlRURhdGFUeXBlID0gKEVEYXRhVHlwZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNc3Byb2plY3RQYWNrYWdlLmVOU19VUkkpLmdldEVDbGFzc2lmaWVycygpLmdldCgxMik7Ci0JCX0KLQkJcmV0dXJuIGJvb2tpbmdUeXBlVHlwZUVEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldEJvb2tpbmdUeXBlVHlwZTEoKSB7Ci0JCWlmIChib29raW5nVHlwZVR5cGUxRURhdGFUeXBlID09IG51bGwpIHsKLQkJCWJvb2tpbmdUeXBlVHlwZTFFRGF0YVR5cGUgPSAoRURhdGFUeXBlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDEzKTsKLQkJfQotCQlyZXR1cm4gYm9va2luZ1R5cGVUeXBlMUVEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldENhbGN1bGF0aW9uVHlwZVR5cGUoKSB7Ci0JCWlmIChjYWxjdWxhdGlvblR5cGVUeXBlRURhdGFUeXBlID09IG51bGwpIHsKLQkJCWNhbGN1bGF0aW9uVHlwZVR5cGVFRGF0YVR5cGUgPSAoRURhdGFUeXBlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDE0KTsKLQkJfQotCQlyZXR1cm4gY2FsY3VsYXRpb25UeXBlVHlwZUVEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldENhdGVnb3J5VHlwZSgpIHsKLQkJaWYgKGNhdGVnb3J5VHlwZUVEYXRhVHlwZSA9PSBudWxsKSB7Ci0JCQljYXRlZ29yeVR5cGVFRGF0YVR5cGUgPSAoRURhdGFUeXBlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDE3KTsKLQkJfQotCQlyZXR1cm4gY2F0ZWdvcnlUeXBlRURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0Q29kZVR5cGUoKSB7Ci0JCWlmIChjb2RlVHlwZUVEYXRhVHlwZSA9PSBudWxsKSB7Ci0JCQljb2RlVHlwZUVEYXRhVHlwZSA9IChFRGF0YVR5cGUpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoMTgpOwotCQl9Ci0JCXJldHVybiBjb2RlVHlwZUVEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldENvbXBhbnlUeXBlKCkgewotCQlpZiAoY29tcGFueVR5cGVFRGF0YVR5cGUgPT0gbnVsbCkgewotCQkJY29tcGFueVR5cGVFRGF0YVR5cGUgPSAoRURhdGFUeXBlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDE5KTsKLQkJfQotCQlyZXR1cm4gY29tcGFueVR5cGVFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXRDb25zdHJhaW50VHlwZVR5cGUoKSB7Ci0JCWlmIChjb25zdHJhaW50VHlwZVR5cGVFRGF0YVR5cGUgPT0gbnVsbCkgewotCQkJY29uc3RyYWludFR5cGVUeXBlRURhdGFUeXBlID0gKEVEYXRhVHlwZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNc3Byb2plY3RQYWNrYWdlLmVOU19VUkkpLmdldEVDbGFzc2lmaWVycygpLmdldCgyMCk7Ci0JCX0KLQkJcmV0dXJuIGNvbnN0cmFpbnRUeXBlVHlwZUVEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldENvbnRhY3RUeXBlKCkgewotCQlpZiAoY29udGFjdFR5cGVFRGF0YVR5cGUgPT0gbnVsbCkgewotCQkJY29udGFjdFR5cGVFRGF0YVR5cGUgPSAoRURhdGFUeXBlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDIxKTsKLQkJfQotCQlyZXR1cm4gY29udGFjdFR5cGVFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXRDb3N0UmF0ZVRhYmxlVHlwZSgpIHsKLQkJaWYgKGNvc3RSYXRlVGFibGVUeXBlRURhdGFUeXBlID09IG51bGwpIHsKLQkJCWNvc3RSYXRlVGFibGVUeXBlRURhdGFUeXBlID0gKEVEYXRhVHlwZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNc3Byb2plY3RQYWNrYWdlLmVOU19VUkkpLmdldEVDbGFzc2lmaWVycygpLmdldCgyMik7Ci0JCX0KLQkJcmV0dXJuIGNvc3RSYXRlVGFibGVUeXBlRURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0Q3VycmVuY3lTeW1ib2xQb3NpdGlvblR5cGUoKSB7Ci0JCWlmIChjdXJyZW5jeVN5bWJvbFBvc2l0aW9uVHlwZUVEYXRhVHlwZSA9PSBudWxsKSB7Ci0JCQljdXJyZW5jeVN5bWJvbFBvc2l0aW9uVHlwZUVEYXRhVHlwZSA9IChFRGF0YVR5cGUpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoMjMpOwotCQl9Ci0JCXJldHVybiBjdXJyZW5jeVN5bWJvbFBvc2l0aW9uVHlwZUVEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldEN1cnJlbmN5U3ltYm9sVHlwZSgpIHsKLQkJaWYgKGN1cnJlbmN5U3ltYm9sVHlwZUVEYXRhVHlwZSA9PSBudWxsKSB7Ci0JCQljdXJyZW5jeVN5bWJvbFR5cGVFRGF0YVR5cGUgPSAoRURhdGFUeXBlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDI0KTsKLQkJfQotCQlyZXR1cm4gY3VycmVuY3lTeW1ib2xUeXBlRURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0RGF5VHlwZVR5cGUoKSB7Ci0JCWlmIChkYXlUeXBlVHlwZUVEYXRhVHlwZSA9PSBudWxsKSB7Ci0JCQlkYXlUeXBlVHlwZUVEYXRhVHlwZSA9IChFRGF0YVR5cGUpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoMjUpOwotCQl9Ci0JCXJldHVybiBkYXlUeXBlVHlwZUVEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldERlZmF1bHRGaXhlZENvc3RBY2NydWFsVHlwZSgpIHsKLQkJaWYgKGRlZmF1bHRGaXhlZENvc3RBY2NydWFsVHlwZUVEYXRhVHlwZSA9PSBudWxsKSB7Ci0JCQlkZWZhdWx0Rml4ZWRDb3N0QWNjcnVhbFR5cGVFRGF0YVR5cGUgPSAoRURhdGFUeXBlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDI2KTsKLQkJfQotCQlyZXR1cm4gZGVmYXVsdEZpeGVkQ29zdEFjY3J1YWxUeXBlRURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0RGVmYXVsdFRhc2tFVk1ldGhvZFR5cGUoKSB7Ci0JCWlmIChkZWZhdWx0VGFza0VWTWV0aG9kVHlwZUVEYXRhVHlwZSA9PSBudWxsKSB7Ci0JCQlkZWZhdWx0VGFza0VWTWV0aG9kVHlwZUVEYXRhVHlwZSA9IChFRGF0YVR5cGUpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoMjcpOwotCQl9Ci0JCXJldHVybiBkZWZhdWx0VGFza0VWTWV0aG9kVHlwZUVEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldERlZmF1bHRUYXNrVHlwZVR5cGUoKSB7Ci0JCWlmIChkZWZhdWx0VGFza1R5cGVUeXBlRURhdGFUeXBlID09IG51bGwpIHsKLQkJCWRlZmF1bHRUYXNrVHlwZVR5cGVFRGF0YVR5cGUgPSAoRURhdGFUeXBlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDI4KTsKLQkJfQotCQlyZXR1cm4gZGVmYXVsdFRhc2tUeXBlVHlwZUVEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldER1cmF0aW9uRm9ybWF0VHlwZSgpIHsKLQkJaWYgKGR1cmF0aW9uRm9ybWF0VHlwZUVEYXRhVHlwZSA9PSBudWxsKSB7Ci0JCQlkdXJhdGlvbkZvcm1hdFR5cGVFRGF0YVR5cGUgPSAoRURhdGFUeXBlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDMwKTsKLQkJfQotCQlyZXR1cm4gZHVyYXRpb25Gb3JtYXRUeXBlRURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0RHVyYXRpb25Gb3JtYXRUeXBlMSgpIHsKLQkJaWYgKGR1cmF0aW9uRm9ybWF0VHlwZTFFRGF0YVR5cGUgPT0gbnVsbCkgewotCQkJZHVyYXRpb25Gb3JtYXRUeXBlMUVEYXRhVHlwZSA9IChFRGF0YVR5cGUpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoMzEpOwotCQl9Ci0JCXJldHVybiBkdXJhdGlvbkZvcm1hdFR5cGUxRURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0RHVyYXRpb25Gb3JtYXRUeXBlMigpIHsKLQkJaWYgKGR1cmF0aW9uRm9ybWF0VHlwZTJFRGF0YVR5cGUgPT0gbnVsbCkgewotCQkJZHVyYXRpb25Gb3JtYXRUeXBlMkVEYXRhVHlwZSA9IChFRGF0YVR5cGUpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoMzIpOwotCQl9Ci0JCXJldHVybiBkdXJhdGlvbkZvcm1hdFR5cGUyRURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0RHVyYXRpb25Gb3JtYXRUeXBlMygpIHsKLQkJaWYgKGR1cmF0aW9uRm9ybWF0VHlwZTNFRGF0YVR5cGUgPT0gbnVsbCkgewotCQkJZHVyYXRpb25Gb3JtYXRUeXBlM0VEYXRhVHlwZSA9IChFRGF0YVR5cGUpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoMzMpOwotCQl9Ci0JCXJldHVybiBkdXJhdGlvbkZvcm1hdFR5cGUzRURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0RHVyYXRpb25Gb3JtYXRUeXBlNCgpIHsKLQkJaWYgKGR1cmF0aW9uRm9ybWF0VHlwZTRFRGF0YVR5cGUgPT0gbnVsbCkgewotCQkJZHVyYXRpb25Gb3JtYXRUeXBlNEVEYXRhVHlwZSA9IChFRGF0YVR5cGUpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoMzQpOwotCQl9Ci0JCXJldHVybiBkdXJhdGlvbkZvcm1hdFR5cGU0RURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0RHVyYXRpb25Gb3JtYXRUeXBlNSgpIHsKLQkJaWYgKGR1cmF0aW9uRm9ybWF0VHlwZTVFRGF0YVR5cGUgPT0gbnVsbCkgewotCQkJZHVyYXRpb25Gb3JtYXRUeXBlNUVEYXRhVHlwZSA9IChFRGF0YVR5cGUpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoMzUpOwotCQl9Ci0JCXJldHVybiBkdXJhdGlvbkZvcm1hdFR5cGU1RURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0RWFybmVkVmFsdWVNZXRob2RUeXBlKCkgewotCQlpZiAoZWFybmVkVmFsdWVNZXRob2RUeXBlRURhdGFUeXBlID09IG51bGwpIHsKLQkJCWVhcm5lZFZhbHVlTWV0aG9kVHlwZUVEYXRhVHlwZSA9IChFRGF0YVR5cGUpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoMzYpOwotCQl9Ci0JCXJldHVybiBlYXJuZWRWYWx1ZU1ldGhvZFR5cGVFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXRFYXJuZWRWYWx1ZU1ldGhvZFR5cGUxKCkgewotCQlpZiAoZWFybmVkVmFsdWVNZXRob2RUeXBlMUVEYXRhVHlwZSA9PSBudWxsKSB7Ci0JCQllYXJuZWRWYWx1ZU1ldGhvZFR5cGUxRURhdGFUeXBlID0gKEVEYXRhVHlwZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNc3Byb2plY3RQYWNrYWdlLmVOU19VUkkpLmdldEVDbGFzc2lmaWVycygpLmdldCgzNyk7Ci0JCX0KLQkJcmV0dXJuIGVhcm5lZFZhbHVlTWV0aG9kVHlwZTFFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXRFbWFpbEFkZHJlc3NUeXBlKCkgewotCQlpZiAoZW1haWxBZGRyZXNzVHlwZUVEYXRhVHlwZSA9PSBudWxsKSB7Ci0JCQllbWFpbEFkZHJlc3NUeXBlRURhdGFUeXBlID0gKEVEYXRhVHlwZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNc3Byb2plY3RQYWNrYWdlLmVOU19VUkkpLmdldEVDbGFzc2lmaWVycygpLmdldCgzOCk7Ci0JCX0KLQkJcmV0dXJuIGVtYWlsQWRkcmVzc1R5cGVFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXRFeHRlcm5hbFRhc2tQcm9qZWN0VHlwZSgpIHsKLQkJaWYgKGV4dGVybmFsVGFza1Byb2plY3RUeXBlRURhdGFUeXBlID09IG51bGwpIHsKLQkJCWV4dGVybmFsVGFza1Byb2plY3RUeXBlRURhdGFUeXBlID0gKEVEYXRhVHlwZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNc3Byb2plY3RQYWNrYWdlLmVOU19VUkkpLmdldEVDbGFzc2lmaWVycygpLmdldCg0NCk7Ci0JCX0KLQkJcmV0dXJuIGV4dGVybmFsVGFza1Byb2plY3RUeXBlRURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0Rml4ZWRDb3N0QWNjcnVhbFR5cGUoKSB7Ci0JCWlmIChmaXhlZENvc3RBY2NydWFsVHlwZUVEYXRhVHlwZSA9PSBudWxsKSB7Ci0JCQlmaXhlZENvc3RBY2NydWFsVHlwZUVEYXRhVHlwZSA9IChFRGF0YVR5cGUpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoNDUpOwotCQl9Ci0JCXJldHVybiBmaXhlZENvc3RBY2NydWFsVHlwZUVEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldEZZU3RhcnREYXRlVHlwZSgpIHsKLQkJaWYgKGZ5U3RhcnREYXRlVHlwZUVEYXRhVHlwZSA9PSBudWxsKSB7Ci0JCQlmeVN0YXJ0RGF0ZVR5cGVFRGF0YVR5cGUgPSAoRURhdGFUeXBlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDQ2KTsKLQkJfQotCQlyZXR1cm4gZnlTdGFydERhdGVUeXBlRURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0R3JvdXBUeXBlKCkgewotCQlpZiAoZ3JvdXBUeXBlRURhdGFUeXBlID09IG51bGwpIHsKLQkJCWdyb3VwVHlwZUVEYXRhVHlwZSA9IChFRGF0YVR5cGUpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoNDcpOwotCQl9Ci0JCXJldHVybiBncm91cFR5cGVFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXRIeXBlcmxpbmtBZGRyZXNzVHlwZSgpIHsKLQkJaWYgKGh5cGVybGlua0FkZHJlc3NUeXBlRURhdGFUeXBlID09IG51bGwpIHsKLQkJCWh5cGVybGlua0FkZHJlc3NUeXBlRURhdGFUeXBlID0gKEVEYXRhVHlwZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNc3Byb2plY3RQYWNrYWdlLmVOU19VUkkpLmdldEVDbGFzc2lmaWVycygpLmdldCg0OCk7Ci0JCX0KLQkJcmV0dXJuIGh5cGVybGlua0FkZHJlc3NUeXBlRURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0SHlwZXJsaW5rQWRkcmVzc1R5cGUxKCkgewotCQlpZiAoaHlwZXJsaW5rQWRkcmVzc1R5cGUxRURhdGFUeXBlID09IG51bGwpIHsKLQkJCWh5cGVybGlua0FkZHJlc3NUeXBlMUVEYXRhVHlwZSA9IChFRGF0YVR5cGUpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoNDkpOwotCQl9Ci0JCXJldHVybiBoeXBlcmxpbmtBZGRyZXNzVHlwZTFFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXRIeXBlcmxpbmtBZGRyZXNzVHlwZTIoKSB7Ci0JCWlmIChoeXBlcmxpbmtBZGRyZXNzVHlwZTJFRGF0YVR5cGUgPT0gbnVsbCkgewotCQkJaHlwZXJsaW5rQWRkcmVzc1R5cGUyRURhdGFUeXBlID0gKEVEYXRhVHlwZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNc3Byb2plY3RQYWNrYWdlLmVOU19VUkkpLmdldEVDbGFzc2lmaWVycygpLmdldCg1MCk7Ci0JCX0KLQkJcmV0dXJuIGh5cGVybGlua0FkZHJlc3NUeXBlMkVEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldEh5cGVybGlua1N1YkFkZHJlc3NUeXBlKCkgewotCQlpZiAoaHlwZXJsaW5rU3ViQWRkcmVzc1R5cGVFRGF0YVR5cGUgPT0gbnVsbCkgewotCQkJaHlwZXJsaW5rU3ViQWRkcmVzc1R5cGVFRGF0YVR5cGUgPSAoRURhdGFUeXBlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDUxKTsKLQkJfQotCQlyZXR1cm4gaHlwZXJsaW5rU3ViQWRkcmVzc1R5cGVFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXRIeXBlcmxpbmtTdWJBZGRyZXNzVHlwZTEoKSB7Ci0JCWlmIChoeXBlcmxpbmtTdWJBZGRyZXNzVHlwZTFFRGF0YVR5cGUgPT0gbnVsbCkgewotCQkJaHlwZXJsaW5rU3ViQWRkcmVzc1R5cGUxRURhdGFUeXBlID0gKEVEYXRhVHlwZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNc3Byb2plY3RQYWNrYWdlLmVOU19VUkkpLmdldEVDbGFzc2lmaWVycygpLmdldCg1Mik7Ci0JCX0KLQkJcmV0dXJuIGh5cGVybGlua1N1YkFkZHJlc3NUeXBlMUVEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldEh5cGVybGlua1N1YkFkZHJlc3NUeXBlMigpIHsKLQkJaWYgKGh5cGVybGlua1N1YkFkZHJlc3NUeXBlMkVEYXRhVHlwZSA9PSBudWxsKSB7Ci0JCQloeXBlcmxpbmtTdWJBZGRyZXNzVHlwZTJFRGF0YVR5cGUgPSAoRURhdGFUeXBlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDUzKTsKLQkJfQotCQlyZXR1cm4gaHlwZXJsaW5rU3ViQWRkcmVzc1R5cGUyRURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0SHlwZXJsaW5rVHlwZSgpIHsKLQkJaWYgKGh5cGVybGlua1R5cGVFRGF0YVR5cGUgPT0gbnVsbCkgewotCQkJaHlwZXJsaW5rVHlwZUVEYXRhVHlwZSA9IChFRGF0YVR5cGUpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoNTQpOwotCQl9Ci0JCXJldHVybiBoeXBlcmxpbmtUeXBlRURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0SHlwZXJsaW5rVHlwZTEoKSB7Ci0JCWlmIChoeXBlcmxpbmtUeXBlMUVEYXRhVHlwZSA9PSBudWxsKSB7Ci0JCQloeXBlcmxpbmtUeXBlMUVEYXRhVHlwZSA9IChFRGF0YVR5cGUpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoNTUpOwotCQl9Ci0JCXJldHVybiBoeXBlcmxpbmtUeXBlMUVEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldEh5cGVybGlua1R5cGUyKCkgewotCQlpZiAoaHlwZXJsaW5rVHlwZTJFRGF0YVR5cGUgPT0gbnVsbCkgewotCQkJaHlwZXJsaW5rVHlwZTJFRGF0YVR5cGUgPSAoRURhdGFUeXBlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDU2KTsKLQkJfQotCQlyZXR1cm4gaHlwZXJsaW5rVHlwZTJFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXRJbml0aWFsc1R5cGUoKSB7Ci0JCWlmIChpbml0aWFsc1R5cGVFRGF0YVR5cGUgPT0gbnVsbCkgewotCQkJaW5pdGlhbHNUeXBlRURhdGFUeXBlID0gKEVEYXRhVHlwZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNc3Byb2plY3RQYWNrYWdlLmVOU19VUkkpLmdldEVDbGFzc2lmaWVycygpLmdldCg1Nyk7Ci0JCX0KLQkJcmV0dXJuIGluaXRpYWxzVHlwZUVEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldExhZ0Zvcm1hdFR5cGUoKSB7Ci0JCWlmIChsYWdGb3JtYXRUeXBlRURhdGFUeXBlID09IG51bGwpIHsKLQkJCWxhZ0Zvcm1hdFR5cGVFRGF0YVR5cGUgPSAoRURhdGFUeXBlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDU4KTsKLQkJfQotCQlyZXR1cm4gbGFnRm9ybWF0VHlwZUVEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldExldmVsaW5nRGVsYXlGb3JtYXRUeXBlKCkgewotCQlpZiAobGV2ZWxpbmdEZWxheUZvcm1hdFR5cGVFRGF0YVR5cGUgPT0gbnVsbCkgewotCQkJbGV2ZWxpbmdEZWxheUZvcm1hdFR5cGVFRGF0YVR5cGUgPSAoRURhdGFUeXBlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDU5KTsKLQkJfQotCQlyZXR1cm4gbGV2ZWxpbmdEZWxheUZvcm1hdFR5cGVFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXRMZXZlbGluZ0RlbGF5Rm9ybWF0VHlwZTEoKSB7Ci0JCWlmIChsZXZlbGluZ0RlbGF5Rm9ybWF0VHlwZTFFRGF0YVR5cGUgPT0gbnVsbCkgewotCQkJbGV2ZWxpbmdEZWxheUZvcm1hdFR5cGUxRURhdGFUeXBlID0gKEVEYXRhVHlwZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNc3Byb2plY3RQYWNrYWdlLmVOU19VUkkpLmdldEVDbGFzc2lmaWVycygpLmdldCg2MCk7Ci0JCX0KLQkJcmV0dXJuIGxldmVsaW5nRGVsYXlGb3JtYXRUeXBlMUVEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldE1hbmFnZXJUeXBlKCkgewotCQlpZiAobWFuYWdlclR5cGVFRGF0YVR5cGUgPT0gbnVsbCkgewotCQkJbWFuYWdlclR5cGVFRGF0YVR5cGUgPSAoRURhdGFUeXBlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDYxKTsKLQkJfQotCQlyZXR1cm4gbWFuYWdlclR5cGVFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXRNYXRlcmlhbExhYmVsVHlwZSgpIHsKLQkJaWYgKG1hdGVyaWFsTGFiZWxUeXBlRURhdGFUeXBlID09IG51bGwpIHsKLQkJCW1hdGVyaWFsTGFiZWxUeXBlRURhdGFUeXBlID0gKEVEYXRhVHlwZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNc3Byb2plY3RQYWNrYWdlLmVOU19VUkkpLmdldEVDbGFzc2lmaWVycygpLmdldCg2NCk7Ci0JCX0KLQkJcmV0dXJuIG1hdGVyaWFsTGFiZWxUeXBlRURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0TmFtZVR5cGUoKSB7Ci0JCWlmIChuYW1lVHlwZUVEYXRhVHlwZSA9PSBudWxsKSB7Ci0JCQluYW1lVHlwZUVEYXRhVHlwZSA9IChFRGF0YVR5cGUpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoNjUpOwotCQl9Ci0JCXJldHVybiBuYW1lVHlwZUVEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldE5hbWVUeXBlMSgpIHsKLQkJaWYgKG5hbWVUeXBlMUVEYXRhVHlwZSA9PSBudWxsKSB7Ci0JCQluYW1lVHlwZTFFRGF0YVR5cGUgPSAoRURhdGFUeXBlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDY2KTsKLQkJfQotCQlyZXR1cm4gbmFtZVR5cGUxRURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0TmFtZVR5cGUyKCkgewotCQlpZiAobmFtZVR5cGUyRURhdGFUeXBlID09IG51bGwpIHsKLQkJCW5hbWVUeXBlMkVEYXRhVHlwZSA9IChFRGF0YVR5cGUpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoNjcpOwotCQl9Ci0JCXJldHVybiBuYW1lVHlwZTJFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXROYW1lVHlwZTMoKSB7Ci0JCWlmIChuYW1lVHlwZTNFRGF0YVR5cGUgPT0gbnVsbCkgewotCQkJbmFtZVR5cGUzRURhdGFUeXBlID0gKEVEYXRhVHlwZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNc3Byb2plY3RQYWNrYWdlLmVOU19VUkkpLmdldEVDbGFzc2lmaWVycygpLmdldCg2OCk7Ci0JCX0KLQkJcmV0dXJuIG5hbWVUeXBlM0VEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldE5ld1Rhc2tTdGFydERhdGVUeXBlKCkgewotCQlpZiAobmV3VGFza1N0YXJ0RGF0ZVR5cGVFRGF0YVR5cGUgPT0gbnVsbCkgewotCQkJbmV3VGFza1N0YXJ0RGF0ZVR5cGVFRGF0YVR5cGUgPSAoRURhdGFUeXBlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDY5KTsKLQkJfQotCQlyZXR1cm4gbmV3VGFza1N0YXJ0RGF0ZVR5cGVFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXROVEFjY291bnRUeXBlKCkgewotCQlpZiAobnRBY2NvdW50VHlwZUVEYXRhVHlwZSA9PSBudWxsKSB7Ci0JCQludEFjY291bnRUeXBlRURhdGFUeXBlID0gKEVEYXRhVHlwZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNc3Byb2plY3RQYWNrYWdlLmVOU19VUkkpLmdldEVDbGFzc2lmaWVycygpLmdldCg3MCk7Ci0JCX0KLQkJcmV0dXJuIG50QWNjb3VudFR5cGVFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXRPdXRsaW5lTnVtYmVyVHlwZSgpIHsKLQkJaWYgKG91dGxpbmVOdW1iZXJUeXBlRURhdGFUeXBlID09IG51bGwpIHsKLQkJCW91dGxpbmVOdW1iZXJUeXBlRURhdGFUeXBlID0gKEVEYXRhVHlwZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNc3Byb2plY3RQYWNrYWdlLmVOU19VUkkpLmdldEVDbGFzc2lmaWVycygpLmdldCg3NSk7Ci0JCX0KLQkJcmV0dXJuIG91dGxpbmVOdW1iZXJUeXBlRURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0T3ZlcnRpbWVSYXRlRm9ybWF0VHlwZSgpIHsKLQkJaWYgKG92ZXJ0aW1lUmF0ZUZvcm1hdFR5cGVFRGF0YVR5cGUgPT0gbnVsbCkgewotCQkJb3ZlcnRpbWVSYXRlRm9ybWF0VHlwZUVEYXRhVHlwZSA9IChFRGF0YVR5cGUpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoNzYpOwotCQl9Ci0JCXJldHVybiBvdmVydGltZVJhdGVGb3JtYXRUeXBlRURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0T3ZlcnRpbWVSYXRlRm9ybWF0VHlwZTEoKSB7Ci0JCWlmIChvdmVydGltZVJhdGVGb3JtYXRUeXBlMUVEYXRhVHlwZSA9PSBudWxsKSB7Ci0JCQlvdmVydGltZVJhdGVGb3JtYXRUeXBlMUVEYXRhVHlwZSA9IChFRGF0YVR5cGUpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoNzcpOwotCQl9Ci0JCXJldHVybiBvdmVydGltZVJhdGVGb3JtYXRUeXBlMUVEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldFBob25ldGljQWxpYXNUeXBlKCkgewotCQlpZiAocGhvbmV0aWNBbGlhc1R5cGVFRGF0YVR5cGUgPT0gbnVsbCkgewotCQkJcGhvbmV0aWNBbGlhc1R5cGVFRGF0YVR5cGUgPSAoRURhdGFUeXBlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDc4KTsKLQkJfQotCQlyZXR1cm4gcGhvbmV0aWNBbGlhc1R5cGVFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXRQaG9uZXRpY3NUeXBlKCkgewotCQlpZiAocGhvbmV0aWNzVHlwZUVEYXRhVHlwZSA9PSBudWxsKSB7Ci0JCQlwaG9uZXRpY3NUeXBlRURhdGFUeXBlID0gKEVEYXRhVHlwZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNc3Byb2plY3RQYWNrYWdlLmVOU19VUkkpLmdldEVDbGFzc2lmaWVycygpLmdldCg3OSk7Ci0JCX0KLQkJcmV0dXJuIHBob25ldGljc1R5cGVFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXRQcmVmaXhUeXBlKCkgewotCQlpZiAocHJlZml4VHlwZUVEYXRhVHlwZSA9PSBudWxsKSB7Ci0JCQlwcmVmaXhUeXBlRURhdGFUeXBlID0gKEVEYXRhVHlwZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNc3Byb2plY3RQYWNrYWdlLmVOU19VUkkpLmdldEVDbGFzc2lmaWVycygpLmdldCg4MSk7Ci0JCX0KLQkJcmV0dXJuIHByZWZpeFR5cGVFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXRSYXRlVGFibGVUeXBlKCkgewotCQlpZiAocmF0ZVRhYmxlVHlwZUVEYXRhVHlwZSA9PSBudWxsKSB7Ci0JCQlyYXRlVGFibGVUeXBlRURhdGFUeXBlID0gKEVEYXRhVHlwZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNc3Byb2plY3RQYWNrYWdlLmVOU19VUkkpLmdldEVDbGFzc2lmaWVycygpLmdldCg4NSk7Ci0JCX0KLQkJcmV0dXJuIHJhdGVUYWJsZVR5cGVFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXRSb2xsdXBUeXBlVHlwZSgpIHsKLQkJaWYgKHJvbGx1cFR5cGVUeXBlRURhdGFUeXBlID09IG51bGwpIHsKLQkJCXJvbGx1cFR5cGVUeXBlRURhdGFUeXBlID0gKEVEYXRhVHlwZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNc3Byb2plY3RQYWNrYWdlLmVOU19VUkkpLmdldEVDbGFzc2lmaWVycygpLmdldCg4OCk7Ci0JCX0KLQkJcmV0dXJuIHJvbGx1cFR5cGVUeXBlRURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0U3RhbmRhcmRSYXRlRm9ybWF0VHlwZSgpIHsKLQkJaWYgKHN0YW5kYXJkUmF0ZUZvcm1hdFR5cGVFRGF0YVR5cGUgPT0gbnVsbCkgewotCQkJc3RhbmRhcmRSYXRlRm9ybWF0VHlwZUVEYXRhVHlwZSA9IChFRGF0YVR5cGUpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoODkpOwotCQl9Ci0JCXJldHVybiBzdGFuZGFyZFJhdGVGb3JtYXRUeXBlRURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0U3RhbmRhcmRSYXRlRm9ybWF0VHlwZTEoKSB7Ci0JCWlmIChzdGFuZGFyZFJhdGVGb3JtYXRUeXBlMUVEYXRhVHlwZSA9PSBudWxsKSB7Ci0JCQlzdGFuZGFyZFJhdGVGb3JtYXRUeXBlMUVEYXRhVHlwZSA9IChFRGF0YVR5cGUpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoOTApOwotCQl9Ci0JCXJldHVybiBzdGFuZGFyZFJhdGVGb3JtYXRUeXBlMUVEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldFN1YmplY3RUeXBlKCkgewotCQlpZiAoc3ViamVjdFR5cGVFRGF0YVR5cGUgPT0gbnVsbCkgewotCQkJc3ViamVjdFR5cGVFRGF0YVR5cGUgPSAoRURhdGFUeXBlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDkxKTsKLQkJfQotCQlyZXR1cm4gc3ViamVjdFR5cGVFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXRTdWJwcm9qZWN0TmFtZVR5cGUoKSB7Ci0JCWlmIChzdWJwcm9qZWN0TmFtZVR5cGVFRGF0YVR5cGUgPT0gbnVsbCkgewotCQkJc3VicHJvamVjdE5hbWVUeXBlRURhdGFUeXBlID0gKEVEYXRhVHlwZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNc3Byb2plY3RQYWNrYWdlLmVOU19VUkkpLmdldEVDbGFzc2lmaWVycygpLmdldCg5Mik7Ci0JCX0KLQkJcmV0dXJuIHN1YnByb2plY3ROYW1lVHlwZUVEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldFRpdGxlVHlwZSgpIHsKLQkJaWYgKHRpdGxlVHlwZUVEYXRhVHlwZSA9PSBudWxsKSB7Ci0JCQl0aXRsZVR5cGVFRGF0YVR5cGUgPSAoRURhdGFUeXBlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDk3KTsKLQkJfQotCQlyZXR1cm4gdGl0bGVUeXBlRURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0VHlwZVR5cGUoKSB7Ci0JCWlmICh0eXBlVHlwZUVEYXRhVHlwZSA9PSBudWxsKSB7Ci0JCQl0eXBlVHlwZUVEYXRhVHlwZSA9IChFRGF0YVR5cGUpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoOTgpOwotCQl9Ci0JCXJldHVybiB0eXBlVHlwZUVEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldFR5cGVUeXBlMSgpIHsKLQkJaWYgKHR5cGVUeXBlMUVEYXRhVHlwZSA9PSBudWxsKSB7Ci0JCQl0eXBlVHlwZTFFRGF0YVR5cGUgPSAoRURhdGFUeXBlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDk5KTsKLQkJfQotCQlyZXR1cm4gdHlwZVR5cGUxRURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0VHlwZVR5cGUyKCkgewotCQlpZiAodHlwZVR5cGUyRURhdGFUeXBlID09IG51bGwpIHsKLQkJCXR5cGVUeXBlMkVEYXRhVHlwZSA9IChFRGF0YVR5cGUpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoMTAwKTsKLQkJfQotCQlyZXR1cm4gdHlwZVR5cGUyRURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0VHlwZVR5cGUzKCkgewotCQlpZiAodHlwZVR5cGUzRURhdGFUeXBlID09IG51bGwpIHsKLQkJCXR5cGVUeXBlM0VEYXRhVHlwZSA9IChFRGF0YVR5cGUpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoMTAxKTsKLQkJfQotCQlyZXR1cm4gdHlwZVR5cGUzRURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0VHlwZVR5cGU0KCkgewotCQlpZiAodHlwZVR5cGU0RURhdGFUeXBlID09IG51bGwpIHsKLQkJCXR5cGVUeXBlNEVEYXRhVHlwZSA9IChFRGF0YVR5cGUpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoMTAyKTsKLQkJfQotCQlyZXR1cm4gdHlwZVR5cGU0RURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0VHlwZVR5cGU1KCkgewotCQlpZiAodHlwZVR5cGU1RURhdGFUeXBlID09IG51bGwpIHsKLQkJCXR5cGVUeXBlNUVEYXRhVHlwZSA9IChFRGF0YVR5cGUpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoMTAzKTsKLQkJfQotCQlyZXR1cm4gdHlwZVR5cGU1RURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0VUlEVHlwZSgpIHsKLQkJaWYgKHVpZFR5cGVFRGF0YVR5cGUgPT0gbnVsbCkgewotCQkJdWlkVHlwZUVEYXRhVHlwZSA9IChFRGF0YVR5cGUpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoMTA0KTsKLQkJfQotCQlyZXR1cm4gdWlkVHlwZUVEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldFVuaXRUeXBlKCkgewotCQlpZiAodW5pdFR5cGVFRGF0YVR5cGUgPT0gbnVsbCkgewotCQkJdW5pdFR5cGVFRGF0YVR5cGUgPSAoRURhdGFUeXBlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDEwNSk7Ci0JCX0KLQkJcmV0dXJuIHVuaXRUeXBlRURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0VmFsdWVsaXN0U29ydE9yZGVyVHlwZSgpIHsKLQkJaWYgKHZhbHVlbGlzdFNvcnRPcmRlclR5cGVFRGF0YVR5cGUgPT0gbnVsbCkgewotCQkJdmFsdWVsaXN0U29ydE9yZGVyVHlwZUVEYXRhVHlwZSA9IChFRGF0YVR5cGUpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoMTA5KTsKLQkJfQotCQlyZXR1cm4gdmFsdWVsaXN0U29ydE9yZGVyVHlwZUVEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldFdlZWtTdGFydERheVR5cGUoKSB7Ci0JCWlmICh3ZWVrU3RhcnREYXlUeXBlRURhdGFUeXBlID09IG51bGwpIHsKLQkJCXdlZWtTdGFydERheVR5cGVFRGF0YVR5cGUgPSAoRURhdGFUeXBlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDExNSk7Ci0JCX0KLQkJcmV0dXJuIHdlZWtTdGFydERheVR5cGVFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXRXb3JrQ29udG91clR5cGUoKSB7Ci0JCWlmICh3b3JrQ29udG91clR5cGVFRGF0YVR5cGUgPT0gbnVsbCkgewotCQkJd29ya0NvbnRvdXJUeXBlRURhdGFUeXBlID0gKEVEYXRhVHlwZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNc3Byb2plY3RQYWNrYWdlLmVOU19VUkkpLmdldEVDbGFzc2lmaWVycygpLmdldCgxMTYpOwotCQl9Ci0JCXJldHVybiB3b3JrQ29udG91clR5cGVFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXRXb3JrRm9ybWF0VHlwZSgpIHsKLQkJaWYgKHdvcmtGb3JtYXRUeXBlRURhdGFUeXBlID09IG51bGwpIHsKLQkJCXdvcmtGb3JtYXRUeXBlRURhdGFUeXBlID0gKEVEYXRhVHlwZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNc3Byb2plY3RQYWNrYWdlLmVOU19VUkkpLmdldEVDbGFzc2lmaWVycygpLmdldCgxMTcpOwotCQl9Ci0JCXJldHVybiB3b3JrRm9ybWF0VHlwZUVEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldFdvcmtHcm91cFR5cGUoKSB7Ci0JCWlmICh3b3JrR3JvdXBUeXBlRURhdGFUeXBlID09IG51bGwpIHsKLQkJCXdvcmtHcm91cFR5cGVFRGF0YVR5cGUgPSAoRURhdGFUeXBlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDExOCk7Ci0JCX0KLQkJcmV0dXJuIHdvcmtHcm91cFR5cGVFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE1zcHJvamVjdEZhY3RvcnkgZ2V0TXNwcm9qZWN0RmFjdG9yeSgpIHsKLQkJcmV0dXJuIChNc3Byb2plY3RGYWN0b3J5KWdldEVGYWN0b3J5SW5zdGFuY2UoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNMb2FkZWQgPSBmYWxzZTsKLQotCS8qKgotCSAqIExhb2RzIHRoZSBwYWNrYWdlIGFuZCBhbnkgc3ViLXBhY2thZ2VzIGZyb20gdGhlaXIgc2VyaWFsaXplZCBmb3JtLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGxvYWRQYWNrYWdlKCkgewotCQlpZiAoaXNMb2FkZWQpIHJldHVybjsKLQkJaXNMb2FkZWQgPSB0cnVlOwotCi0JCVVSTCB1cmwgPSBnZXRDbGFzcygpLmdldFJlc291cmNlKHBhY2thZ2VGaWxlbmFtZSk7Ci0JCWlmICh1cmwgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIk1pc3Npbmcgc2VyaWFsaXplZCBwYWNrYWdlOiAiICsgcGFja2FnZUZpbGVuYW1lKTsKLQkJfQotCQlSZXNvdXJjZSByZXNvdXJjZSA9IG5ldyBFY29yZVJlc291cmNlRmFjdG9yeUltcGwoKS5jcmVhdGVSZXNvdXJjZShVUkkuY3JlYXRlVVJJKHVybC50b1N0cmluZygpKSk7Ci0JCXRyeSB7Ci0JCQlyZXNvdXJjZS5sb2FkKG51bGwpOwotCQl9Ci0JCWNhdGNoIChJT0V4Y2VwdGlvbiBleGNlcHRpb24pIHsKLQkJCXRocm93IG5ldyBXcmFwcGVkRXhjZXB0aW9uKGV4Y2VwdGlvbik7Ci0JCX0KLQkJaW5pdGlhbGl6ZUZyb21Mb2FkZWRFUGFja2FnZSh0aGlzLCAoRVBhY2thZ2UpcmVzb3VyY2UuZ2V0Q29udGVudHMoKS5nZXQoMCkpOwotCQljcmVhdGVSZXNvdXJjZShlTlNfVVJJKTsKLQl9Ci0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc0ZpeGVkID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBGaXhlcyB1cCB0aGUgbG9hZGVkIHBhY2thZ2UsIHRvIG1ha2UgaXQgYXBwZWFyIGFzIGlmIGl0IGhhZCBiZWVuIHByb2dyYW1tYXRpY2FsbHkgYnVpbHQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZml4UGFja2FnZUNvbnRlbnRzKCkgewotCQlpZiAoaXNGaXhlZCkgcmV0dXJuOwotCQlpc0ZpeGVkID0gdHJ1ZTsKLQkJZml4RUNsYXNzaWZpZXJzKCk7Ci0JfQotfSAvL01zcHJvamVjdFBhY2thZ2VJbXBsCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvT3V0bGluZUNvZGUySW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL091dGxpbmVDb2RlMkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTAwNmIxMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvT3V0bGluZUNvZGUySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjY5ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogT3V0bGluZUNvZGUySW1wbC5qYXZhLHYgMS4xIDIwMDgvMDEvMTUgMDg6NTE6NTMganRoYW0gRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGw7Ci0KLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGUyOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+T3V0bGluZSBDb2RlMjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk91dGxpbmVDb2RlMkltcGwjZ2V0VUlEIDxlbT5VSUQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5PdXRsaW5lQ29kZTJJbXBsI2dldEZpZWxkSUQgPGVtPkZpZWxkIElEPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuT3V0bGluZUNvZGUySW1wbCNnZXRWYWx1ZUlEIDxlbT5WYWx1ZSBJRDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIE91dGxpbmVDb2RlMkltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIE91dGxpbmVDb2RlMiB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFVJRCgpIDxlbT5VSUQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFVJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdJbnRlZ2VyIFVJRF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRVSUQoKSA8ZW0+VUlEPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRVSUQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdJbnRlZ2VyIHVJRCA9IFVJRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRGaWVsZElEKCkgPGVtPkZpZWxkIElEPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRGaWVsZElEKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBGSUVMRF9JRF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRGaWVsZElEKCkgPGVtPkZpZWxkIElEPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRGaWVsZElEKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGZpZWxkSUQgPSBGSUVMRF9JRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWYWx1ZUlEKCkgPGVtPlZhbHVlIElEPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRWYWx1ZUlEKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0ludGVnZXIgVkFMVUVfSURfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmFsdWVJRCgpIDxlbT5WYWx1ZSBJRDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VmFsdWVJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0ludGVnZXIgdmFsdWVJRCA9IFZBTFVFX0lEX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE91dGxpbmVDb2RlMkltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXRPdXRsaW5lQ29kZTIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBnZXRVSUQoKSB7Ci0JCXJldHVybiB1SUQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VUlEKEJpZ0ludGVnZXIgbmV3VUlEKSB7Ci0JCUJpZ0ludGVnZXIgb2xkVUlEID0gdUlEOwotCQl1SUQgPSBuZXdVSUQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuT1VUTElORV9DT0RFMl9fVUlELCBvbGRVSUQsIHVJRCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RmllbGRJRCgpIHsKLQkJcmV0dXJuIGZpZWxkSUQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RmllbGRJRChTdHJpbmcgbmV3RmllbGRJRCkgewotCQlTdHJpbmcgb2xkRmllbGRJRCA9IGZpZWxkSUQ7Ci0JCWZpZWxkSUQgPSBuZXdGaWVsZElEOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERTJfX0ZJRUxEX0lELCBvbGRGaWVsZElELCBmaWVsZElEKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0VmFsdWVJRCgpIHsKLQkJcmV0dXJuIHZhbHVlSUQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmFsdWVJRChCaWdJbnRlZ2VyIG5ld1ZhbHVlSUQpIHsKLQkJQmlnSW50ZWdlciBvbGRWYWx1ZUlEID0gdmFsdWVJRDsKLQkJdmFsdWVJRCA9IG5ld1ZhbHVlSUQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuT1VUTElORV9DT0RFMl9fVkFMVUVfSUQsIG9sZFZhbHVlSUQsIHZhbHVlSUQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuT1VUTElORV9DT0RFMl9fVUlEOgotCQkJCXJldHVybiBnZXRVSUQoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREUyX19GSUVMRF9JRDoKLQkJCQlyZXR1cm4gZ2V0RmllbGRJRCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERTJfX1ZBTFVFX0lEOgotCQkJCXJldHVybiBnZXRWYWx1ZUlEKCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERTJfX1VJRDoKLQkJCQlzZXRVSUQoKEJpZ0ludGVnZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREUyX19GSUVMRF9JRDoKLQkJCQlzZXRGaWVsZElEKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREUyX19WQUxVRV9JRDoKLQkJCQlzZXRWYWx1ZUlEKChCaWdJbnRlZ2VyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERTJfX1VJRDoKLQkJCQlzZXRVSUQoVUlEX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuT1VUTElORV9DT0RFMl9fRklFTERfSUQ6Ci0JCQkJc2V0RmllbGRJRChGSUVMRF9JRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERTJfX1ZBTFVFX0lEOgotCQkJCXNldFZhbHVlSUQoVkFMVUVfSURfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERTJfX1VJRDoKLQkJCQlyZXR1cm4gVUlEX0VERUZBVUxUID09IG51bGwgPyB1SUQgIT0gbnVsbCA6ICFVSURfRURFRkFVTFQuZXF1YWxzKHVJRCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuT1VUTElORV9DT0RFMl9fRklFTERfSUQ6Ci0JCQkJcmV0dXJuIEZJRUxEX0lEX0VERUZBVUxUID09IG51bGwgPyBmaWVsZElEICE9IG51bGwgOiAhRklFTERfSURfRURFRkFVTFQuZXF1YWxzKGZpZWxkSUQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERTJfX1ZBTFVFX0lEOgotCQkJCXJldHVybiBWQUxVRV9JRF9FREVGQVVMVCA9PSBudWxsID8gdmFsdWVJRCAhPSBudWxsIDogIVZBTFVFX0lEX0VERUZBVUxULmVxdWFscyh2YWx1ZUlEKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHVJRDogIik7Ci0JCXJlc3VsdC5hcHBlbmQodUlEKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBmaWVsZElEOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChmaWVsZElEKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCB2YWx1ZUlEOiAiKTsKLQkJcmVzdWx0LmFwcGVuZCh2YWx1ZUlEKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vT3V0bGluZUNvZGUySW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL091dGxpbmVDb2RlM0ltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9PdXRsaW5lQ29kZTNJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwZmRhNzguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL091dGxpbmVDb2RlM0ltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2OSArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IE91dGxpbmVDb2RlM0ltcGwuamF2YSx2IDEuMSAyMDA4LzAxLzE1IDA4OjUxOjUzIGp0aGFtIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsOwotCi1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlMzsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk91dGxpbmUgQ29kZTM8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5PdXRsaW5lQ29kZTNJbXBsI2dldFVJRCA8ZW0+VUlEPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuT3V0bGluZUNvZGUzSW1wbCNnZXRGaWVsZElEIDxlbT5GaWVsZCBJRDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk91dGxpbmVDb2RlM0ltcGwjZ2V0VmFsdWVJRCA8ZW0+VmFsdWUgSUQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBPdXRsaW5lQ29kZTNJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBPdXRsaW5lQ29kZTMgewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRVSUQoKSA8ZW0+VUlEPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRVSUQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBVSURfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VUlEKCkgPGVtPlVJRDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VUlEKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnSW50ZWdlciB1SUQgPSBVSURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RmllbGRJRCgpIDxlbT5GaWVsZCBJRDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RmllbGRJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklFTERfSURfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RmllbGRJRCgpIDxlbT5GaWVsZCBJRDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RmllbGRJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBmaWVsZElEID0gRklFTERfSURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmFsdWVJRCgpIDxlbT5WYWx1ZSBJRDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VmFsdWVJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdJbnRlZ2VyIFZBTFVFX0lEX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZhbHVlSUQoKSA8ZW0+VmFsdWUgSUQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFZhbHVlSUQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdJbnRlZ2VyIHZhbHVlSUQgPSBWQUxVRV9JRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBPdXRsaW5lQ29kZTNJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0T3V0bGluZUNvZGUzKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0VUlEKCkgewotCQlyZXR1cm4gdUlEOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFVJRChCaWdJbnRlZ2VyIG5ld1VJRCkgewotCQlCaWdJbnRlZ2VyIG9sZFVJRCA9IHVJRDsKLQkJdUlEID0gbmV3VUlEOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERTNfX1VJRCwgb2xkVUlELCB1SUQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEZpZWxkSUQoKSB7Ci0JCXJldHVybiBmaWVsZElEOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZpZWxkSUQoU3RyaW5nIG5ld0ZpZWxkSUQpIHsKLQkJU3RyaW5nIG9sZEZpZWxkSUQgPSBmaWVsZElEOwotCQlmaWVsZElEID0gbmV3RmllbGRJRDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREUzX19GSUVMRF9JRCwgb2xkRmllbGRJRCwgZmllbGRJRCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGdldFZhbHVlSUQoKSB7Ci0JCXJldHVybiB2YWx1ZUlEOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZhbHVlSUQoQmlnSW50ZWdlciBuZXdWYWx1ZUlEKSB7Ci0JCUJpZ0ludGVnZXIgb2xkVmFsdWVJRCA9IHZhbHVlSUQ7Ci0JCXZhbHVlSUQgPSBuZXdWYWx1ZUlEOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERTNfX1ZBTFVFX0lELCBvbGRWYWx1ZUlELCB2YWx1ZUlEKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERTNfX1VJRDoKLQkJCQlyZXR1cm4gZ2V0VUlEKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuT1VUTElORV9DT0RFM19fRklFTERfSUQ6Ci0JCQkJcmV0dXJuIGdldEZpZWxkSUQoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREUzX19WQUxVRV9JRDoKLQkJCQlyZXR1cm4gZ2V0VmFsdWVJRCgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREUzX19VSUQ6Ci0JCQkJc2V0VUlEKChCaWdJbnRlZ2VyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuT1VUTElORV9DT0RFM19fRklFTERfSUQ6Ci0JCQkJc2V0RmllbGRJRCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuT1VUTElORV9DT0RFM19fVkFMVUVfSUQ6Ci0JCQkJc2V0VmFsdWVJRCgoQmlnSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREUzX19VSUQ6Ci0JCQkJc2V0VUlEKFVJRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERTNfX0ZJRUxEX0lEOgotCQkJCXNldEZpZWxkSUQoRklFTERfSURfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREUzX19WQUxVRV9JRDoKLQkJCQlzZXRWYWx1ZUlEKFZBTFVFX0lEX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREUzX19VSUQ6Ci0JCQkJcmV0dXJuIFVJRF9FREVGQVVMVCA9PSBudWxsID8gdUlEICE9IG51bGwgOiAhVUlEX0VERUZBVUxULmVxdWFscyh1SUQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERTNfX0ZJRUxEX0lEOgotCQkJCXJldHVybiBGSUVMRF9JRF9FREVGQVVMVCA9PSBudWxsID8gZmllbGRJRCAhPSBudWxsIDogIUZJRUxEX0lEX0VERUZBVUxULmVxdWFscyhmaWVsZElEKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREUzX19WQUxVRV9JRDoKLQkJCQlyZXR1cm4gVkFMVUVfSURfRURFRkFVTFQgPT0gbnVsbCA/IHZhbHVlSUQgIT0gbnVsbCA6ICFWQUxVRV9JRF9FREVGQVVMVC5lcXVhbHModmFsdWVJRCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiICh1SUQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHVJRCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZmllbGRJRDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZmllbGRJRCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgdmFsdWVJRDogIik7Ci0JCXJlc3VsdC5hcHBlbmQodmFsdWVJRCk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL091dGxpbmVDb2RlM0ltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9PdXRsaW5lQ29kZUltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9PdXRsaW5lQ29kZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDk5YWZjNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvT3V0bGluZUNvZGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NjggKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBPdXRsaW5lQ29kZUltcGwuamF2YSx2IDEuMSAyMDA4LzAxLzE1IDA4OjUxOjUzIGp0aGFtIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsOwotCi1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5NYXNrczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlZhbHVlczsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk91dGxpbmUgQ29kZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk91dGxpbmVDb2RlSW1wbCNnZXRGaWVsZElEIDxlbT5GaWVsZCBJRDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk91dGxpbmVDb2RlSW1wbCNnZXRGaWVsZE5hbWUgPGVtPkZpZWxkIE5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5PdXRsaW5lQ29kZUltcGwjZ2V0QWxpYXMgPGVtPkFsaWFzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuT3V0bGluZUNvZGVJbXBsI2dldFBob25ldGljQWxpYXMgPGVtPlBob25ldGljIEFsaWFzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuT3V0bGluZUNvZGVJbXBsI2dldFZhbHVlcyA8ZW0+VmFsdWVzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuT3V0bGluZUNvZGVJbXBsI2lzRW50ZXJwcmlzZSA8ZW0+RW50ZXJwcmlzZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk91dGxpbmVDb2RlSW1wbCNnZXRFbnRlcnByaXNlT3V0bGluZUNvZGVBbGlhcyA8ZW0+RW50ZXJwcmlzZSBPdXRsaW5lIENvZGUgQWxpYXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5PdXRsaW5lQ29kZUltcGwjaXNSZXNvdXJjZVN1YnN0aXR1dGlvbkVuYWJsZWQgPGVtPlJlc291cmNlIFN1YnN0aXR1dGlvbiBFbmFibGVkPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuT3V0bGluZUNvZGVJbXBsI2lzTGVhZk9ubHkgPGVtPkxlYWYgT25seTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk91dGxpbmVDb2RlSW1wbCNpc0FsbExldmVsc1JlcXVpcmVkIDxlbT5BbGwgTGV2ZWxzIFJlcXVpcmVkPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuT3V0bGluZUNvZGVJbXBsI2lzT25seVRhYmxlVmFsdWVzQWxsb3dlZCA8ZW0+T25seSBUYWJsZSBWYWx1ZXMgQWxsb3dlZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk91dGxpbmVDb2RlSW1wbCNnZXRNYXNrcyA8ZW0+TWFza3M8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBPdXRsaW5lQ29kZUltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIE91dGxpbmVDb2RlIHsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RmllbGRJRCgpIDxlbT5GaWVsZCBJRDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RmllbGRJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklFTERfSURfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RmllbGRJRCgpIDxlbT5GaWVsZCBJRDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RmllbGRJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBmaWVsZElEID0gRklFTERfSURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RmllbGROYW1lKCkgPGVtPkZpZWxkIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEZpZWxkTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklFTERfTkFNRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRGaWVsZE5hbWUoKSA8ZW0+RmllbGQgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RmllbGROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGZpZWxkTmFtZSA9IEZJRUxEX05BTUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QWxpYXMoKSA8ZW0+QWxpYXM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFsaWFzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBBTElBU19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBbGlhcygpIDxlbT5BbGlhczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QWxpYXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgYWxpYXMgPSBBTElBU19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQaG9uZXRpY0FsaWFzKCkgPGVtPlBob25ldGljIEFsaWFzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQaG9uZXRpY0FsaWFzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQSE9ORVRJQ19BTElBU19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQaG9uZXRpY0FsaWFzKCkgPGVtPlBob25ldGljIEFsaWFzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQaG9uZXRpY0FsaWFzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHBob25ldGljQWxpYXMgPSBQSE9ORVRJQ19BTElBU19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZhbHVlcygpIDxlbT5WYWx1ZXM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFZhbHVlcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFZhbHVlcyB2YWx1ZXMgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzRW50ZXJwcmlzZSgpIDxlbT5FbnRlcnByaXNlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0VudGVycHJpc2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBFTlRFUlBSSVNFX0VERUZBVUxUID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0VudGVycHJpc2UoKSA8ZW0+RW50ZXJwcmlzZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNFbnRlcnByaXNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBlbnRlcnByaXNlID0gRU5URVJQUklTRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgRW50ZXJwcmlzZSBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gZW50ZXJwcmlzZUVTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFbnRlcnByaXNlT3V0bGluZUNvZGVBbGlhcygpIDxlbT5FbnRlcnByaXNlIE91dGxpbmUgQ29kZSBBbGlhczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RW50ZXJwcmlzZU91dGxpbmVDb2RlQWxpYXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBFTlRFUlBSSVNFX09VVExJTkVfQ09ERV9BTElBU19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFbnRlcnByaXNlT3V0bGluZUNvZGVBbGlhcygpIDxlbT5FbnRlcnByaXNlIE91dGxpbmUgQ29kZSBBbGlhczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RW50ZXJwcmlzZU91dGxpbmVDb2RlQWxpYXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdJbnRlZ2VyIGVudGVycHJpc2VPdXRsaW5lQ29kZUFsaWFzID0gRU5URVJQUklTRV9PVVRMSU5FX0NPREVfQUxJQVNfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNSZXNvdXJjZVN1YnN0aXR1dGlvbkVuYWJsZWQoKSA8ZW0+UmVzb3VyY2UgU3Vic3RpdHV0aW9uIEVuYWJsZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzUmVzb3VyY2VTdWJzdGl0dXRpb25FbmFibGVkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gUkVTT1VSQ0VfU1VCU1RJVFVUSU9OX0VOQUJMRURfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzUmVzb3VyY2VTdWJzdGl0dXRpb25FbmFibGVkKCkgPGVtPlJlc291cmNlIFN1YnN0aXR1dGlvbiBFbmFibGVkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1Jlc291cmNlU3Vic3RpdHV0aW9uRW5hYmxlZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gcmVzb3VyY2VTdWJzdGl0dXRpb25FbmFibGVkID0gUkVTT1VSQ0VfU1VCU1RJVFVUSU9OX0VOQUJMRURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIFJlc291cmNlIFN1YnN0aXR1dGlvbiBFbmFibGVkIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiByZXNvdXJjZVN1YnN0aXR1dGlvbkVuYWJsZWRFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNMZWFmT25seSgpIDxlbT5MZWFmIE9ubHk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzTGVhZk9ubHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBMRUFGX09OTFlfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzTGVhZk9ubHkoKSA8ZW0+TGVhZiBPbmx5PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0xlYWZPbmx5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBsZWFmT25seSA9IExFQUZfT05MWV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgTGVhZiBPbmx5IGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBsZWFmT25seUVTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0FsbExldmVsc1JlcXVpcmVkKCkgPGVtPkFsbCBMZXZlbHMgUmVxdWlyZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzQWxsTGV2ZWxzUmVxdWlyZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBBTExfTEVWRUxTX1JFUVVJUkVEX0VERUZBVUxUID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0FsbExldmVsc1JlcXVpcmVkKCkgPGVtPkFsbCBMZXZlbHMgUmVxdWlyZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzQWxsTGV2ZWxzUmVxdWlyZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGFsbExldmVsc1JlcXVpcmVkID0gQUxMX0xFVkVMU19SRVFVSVJFRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgQWxsIExldmVscyBSZXF1aXJlZCBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gYWxsTGV2ZWxzUmVxdWlyZWRFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNPbmx5VGFibGVWYWx1ZXNBbGxvd2VkKCkgPGVtPk9ubHkgVGFibGUgVmFsdWVzIEFsbG93ZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzT25seVRhYmxlVmFsdWVzQWxsb3dlZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIE9OTFlfVEFCTEVfVkFMVUVTX0FMTE9XRURfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzT25seVRhYmxlVmFsdWVzQWxsb3dlZCgpIDxlbT5Pbmx5IFRhYmxlIFZhbHVlcyBBbGxvd2VkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc09ubHlUYWJsZVZhbHVlc0FsbG93ZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIG9ubHlUYWJsZVZhbHVlc0FsbG93ZWQgPSBPTkxZX1RBQkxFX1ZBTFVFU19BTExPV0VEX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBPbmx5IFRhYmxlIFZhbHVlcyBBbGxvd2VkIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBvbmx5VGFibGVWYWx1ZXNBbGxvd2VkRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWFza3MoKSA8ZW0+TWFza3M8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE1hc2tzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTWFza3MgbWFza3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE91dGxpbmVDb2RlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldE91dGxpbmVDb2RlKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRGaWVsZElEKCkgewotCQlyZXR1cm4gZmllbGRJRDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGaWVsZElEKFN0cmluZyBuZXdGaWVsZElEKSB7Ci0JCVN0cmluZyBvbGRGaWVsZElEID0gZmllbGRJRDsKLQkJZmllbGRJRCA9IG5ld0ZpZWxkSUQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuT1VUTElORV9DT0RFX19GSUVMRF9JRCwgb2xkRmllbGRJRCwgZmllbGRJRCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RmllbGROYW1lKCkgewotCQlyZXR1cm4gZmllbGROYW1lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZpZWxkTmFtZShTdHJpbmcgbmV3RmllbGROYW1lKSB7Ci0JCVN0cmluZyBvbGRGaWVsZE5hbWUgPSBmaWVsZE5hbWU7Ci0JCWZpZWxkTmFtZSA9IG5ld0ZpZWxkTmFtZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREVfX0ZJRUxEX05BTUUsIG9sZEZpZWxkTmFtZSwgZmllbGROYW1lKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRBbGlhcygpIHsKLQkJcmV0dXJuIGFsaWFzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFsaWFzKFN0cmluZyBuZXdBbGlhcykgewotCQlTdHJpbmcgb2xkQWxpYXMgPSBhbGlhczsKLQkJYWxpYXMgPSBuZXdBbGlhczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREVfX0FMSUFTLCBvbGRBbGlhcywgYWxpYXMpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFBob25ldGljQWxpYXMoKSB7Ci0JCXJldHVybiBwaG9uZXRpY0FsaWFzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBob25ldGljQWxpYXMoU3RyaW5nIG5ld1Bob25ldGljQWxpYXMpIHsKLQkJU3RyaW5nIG9sZFBob25ldGljQWxpYXMgPSBwaG9uZXRpY0FsaWFzOwotCQlwaG9uZXRpY0FsaWFzID0gbmV3UGhvbmV0aWNBbGlhczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREVfX1BIT05FVElDX0FMSUFTLCBvbGRQaG9uZXRpY0FsaWFzLCBwaG9uZXRpY0FsaWFzKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFZhbHVlcyBnZXRWYWx1ZXMoKSB7Ci0JCXJldHVybiB2YWx1ZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0VmFsdWVzKFZhbHVlcyBuZXdWYWx1ZXMsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJVmFsdWVzIG9sZFZhbHVlcyA9IHZhbHVlczsKLQkJdmFsdWVzID0gbmV3VmFsdWVzOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERV9fVkFMVUVTLCBvbGRWYWx1ZXMsIG5ld1ZhbHVlcyk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmFsdWVzKFZhbHVlcyBuZXdWYWx1ZXMpIHsKLQkJaWYgKG5ld1ZhbHVlcyAhPSB2YWx1ZXMpIHsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKHZhbHVlcyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCl2YWx1ZXMpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERV9fVkFMVUVTLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdWYWx1ZXMgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3VmFsdWVzKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREVfX1ZBTFVFUywgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRWYWx1ZXMobmV3VmFsdWVzLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuT1VUTElORV9DT0RFX19WQUxVRVMsIG5ld1ZhbHVlcywgbmV3VmFsdWVzKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNFbnRlcnByaXNlKCkgewotCQlyZXR1cm4gZW50ZXJwcmlzZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFbnRlcnByaXNlKGJvb2xlYW4gbmV3RW50ZXJwcmlzZSkgewotCQlib29sZWFuIG9sZEVudGVycHJpc2UgPSBlbnRlcnByaXNlOwotCQllbnRlcnByaXNlID0gbmV3RW50ZXJwcmlzZTsKLQkJYm9vbGVhbiBvbGRFbnRlcnByaXNlRVNldCA9IGVudGVycHJpc2VFU2V0OwotCQllbnRlcnByaXNlRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuT1VUTElORV9DT0RFX19FTlRFUlBSSVNFLCBvbGRFbnRlcnByaXNlLCBlbnRlcnByaXNlLCAhb2xkRW50ZXJwcmlzZUVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldEVudGVycHJpc2UoKSB7Ci0JCWJvb2xlYW4gb2xkRW50ZXJwcmlzZSA9IGVudGVycHJpc2U7Ci0JCWJvb2xlYW4gb2xkRW50ZXJwcmlzZUVTZXQgPSBlbnRlcnByaXNlRVNldDsKLQkJZW50ZXJwcmlzZSA9IEVOVEVSUFJJU0VfRURFRkFVTFQ7Ci0JCWVudGVycHJpc2VFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREVfX0VOVEVSUFJJU0UsIG9sZEVudGVycHJpc2UsIEVOVEVSUFJJU0VfRURFRkFVTFQsIG9sZEVudGVycHJpc2VFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRFbnRlcnByaXNlKCkgewotCQlyZXR1cm4gZW50ZXJwcmlzZUVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0RW50ZXJwcmlzZU91dGxpbmVDb2RlQWxpYXMoKSB7Ci0JCXJldHVybiBlbnRlcnByaXNlT3V0bGluZUNvZGVBbGlhczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFbnRlcnByaXNlT3V0bGluZUNvZGVBbGlhcyhCaWdJbnRlZ2VyIG5ld0VudGVycHJpc2VPdXRsaW5lQ29kZUFsaWFzKSB7Ci0JCUJpZ0ludGVnZXIgb2xkRW50ZXJwcmlzZU91dGxpbmVDb2RlQWxpYXMgPSBlbnRlcnByaXNlT3V0bGluZUNvZGVBbGlhczsKLQkJZW50ZXJwcmlzZU91dGxpbmVDb2RlQWxpYXMgPSBuZXdFbnRlcnByaXNlT3V0bGluZUNvZGVBbGlhczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREVfX0VOVEVSUFJJU0VfT1VUTElORV9DT0RFX0FMSUFTLCBvbGRFbnRlcnByaXNlT3V0bGluZUNvZGVBbGlhcywgZW50ZXJwcmlzZU91dGxpbmVDb2RlQWxpYXMpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1Jlc291cmNlU3Vic3RpdHV0aW9uRW5hYmxlZCgpIHsKLQkJcmV0dXJuIHJlc291cmNlU3Vic3RpdHV0aW9uRW5hYmxlZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZXNvdXJjZVN1YnN0aXR1dGlvbkVuYWJsZWQoYm9vbGVhbiBuZXdSZXNvdXJjZVN1YnN0aXR1dGlvbkVuYWJsZWQpIHsKLQkJYm9vbGVhbiBvbGRSZXNvdXJjZVN1YnN0aXR1dGlvbkVuYWJsZWQgPSByZXNvdXJjZVN1YnN0aXR1dGlvbkVuYWJsZWQ7Ci0JCXJlc291cmNlU3Vic3RpdHV0aW9uRW5hYmxlZCA9IG5ld1Jlc291cmNlU3Vic3RpdHV0aW9uRW5hYmxlZDsKLQkJYm9vbGVhbiBvbGRSZXNvdXJjZVN1YnN0aXR1dGlvbkVuYWJsZWRFU2V0ID0gcmVzb3VyY2VTdWJzdGl0dXRpb25FbmFibGVkRVNldDsKLQkJcmVzb3VyY2VTdWJzdGl0dXRpb25FbmFibGVkRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuT1VUTElORV9DT0RFX19SRVNPVVJDRV9TVUJTVElUVVRJT05fRU5BQkxFRCwgb2xkUmVzb3VyY2VTdWJzdGl0dXRpb25FbmFibGVkLCByZXNvdXJjZVN1YnN0aXR1dGlvbkVuYWJsZWQsICFvbGRSZXNvdXJjZVN1YnN0aXR1dGlvbkVuYWJsZWRFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRSZXNvdXJjZVN1YnN0aXR1dGlvbkVuYWJsZWQoKSB7Ci0JCWJvb2xlYW4gb2xkUmVzb3VyY2VTdWJzdGl0dXRpb25FbmFibGVkID0gcmVzb3VyY2VTdWJzdGl0dXRpb25FbmFibGVkOwotCQlib29sZWFuIG9sZFJlc291cmNlU3Vic3RpdHV0aW9uRW5hYmxlZEVTZXQgPSByZXNvdXJjZVN1YnN0aXR1dGlvbkVuYWJsZWRFU2V0OwotCQlyZXNvdXJjZVN1YnN0aXR1dGlvbkVuYWJsZWQgPSBSRVNPVVJDRV9TVUJTVElUVVRJT05fRU5BQkxFRF9FREVGQVVMVDsKLQkJcmVzb3VyY2VTdWJzdGl0dXRpb25FbmFibGVkRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIE1zcHJvamVjdFBhY2thZ2UuT1VUTElORV9DT0RFX19SRVNPVVJDRV9TVUJTVElUVVRJT05fRU5BQkxFRCwgb2xkUmVzb3VyY2VTdWJzdGl0dXRpb25FbmFibGVkLCBSRVNPVVJDRV9TVUJTVElUVVRJT05fRU5BQkxFRF9FREVGQVVMVCwgb2xkUmVzb3VyY2VTdWJzdGl0dXRpb25FbmFibGVkRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0UmVzb3VyY2VTdWJzdGl0dXRpb25FbmFibGVkKCkgewotCQlyZXR1cm4gcmVzb3VyY2VTdWJzdGl0dXRpb25FbmFibGVkRVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0xlYWZPbmx5KCkgewotCQlyZXR1cm4gbGVhZk9ubHk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGVhZk9ubHkoYm9vbGVhbiBuZXdMZWFmT25seSkgewotCQlib29sZWFuIG9sZExlYWZPbmx5ID0gbGVhZk9ubHk7Ci0JCWxlYWZPbmx5ID0gbmV3TGVhZk9ubHk7Ci0JCWJvb2xlYW4gb2xkTGVhZk9ubHlFU2V0ID0gbGVhZk9ubHlFU2V0OwotCQlsZWFmT25seUVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERV9fTEVBRl9PTkxZLCBvbGRMZWFmT25seSwgbGVhZk9ubHksICFvbGRMZWFmT25seUVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldExlYWZPbmx5KCkgewotCQlib29sZWFuIG9sZExlYWZPbmx5ID0gbGVhZk9ubHk7Ci0JCWJvb2xlYW4gb2xkTGVhZk9ubHlFU2V0ID0gbGVhZk9ubHlFU2V0OwotCQlsZWFmT25seSA9IExFQUZfT05MWV9FREVGQVVMVDsKLQkJbGVhZk9ubHlFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREVfX0xFQUZfT05MWSwgb2xkTGVhZk9ubHksIExFQUZfT05MWV9FREVGQVVMVCwgb2xkTGVhZk9ubHlFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRMZWFmT25seSgpIHsKLQkJcmV0dXJuIGxlYWZPbmx5RVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0FsbExldmVsc1JlcXVpcmVkKCkgewotCQlyZXR1cm4gYWxsTGV2ZWxzUmVxdWlyZWQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QWxsTGV2ZWxzUmVxdWlyZWQoYm9vbGVhbiBuZXdBbGxMZXZlbHNSZXF1aXJlZCkgewotCQlib29sZWFuIG9sZEFsbExldmVsc1JlcXVpcmVkID0gYWxsTGV2ZWxzUmVxdWlyZWQ7Ci0JCWFsbExldmVsc1JlcXVpcmVkID0gbmV3QWxsTGV2ZWxzUmVxdWlyZWQ7Ci0JCWJvb2xlYW4gb2xkQWxsTGV2ZWxzUmVxdWlyZWRFU2V0ID0gYWxsTGV2ZWxzUmVxdWlyZWRFU2V0OwotCQlhbGxMZXZlbHNSZXF1aXJlZEVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERV9fQUxMX0xFVkVMU19SRVFVSVJFRCwgb2xkQWxsTGV2ZWxzUmVxdWlyZWQsIGFsbExldmVsc1JlcXVpcmVkLCAhb2xkQWxsTGV2ZWxzUmVxdWlyZWRFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRBbGxMZXZlbHNSZXF1aXJlZCgpIHsKLQkJYm9vbGVhbiBvbGRBbGxMZXZlbHNSZXF1aXJlZCA9IGFsbExldmVsc1JlcXVpcmVkOwotCQlib29sZWFuIG9sZEFsbExldmVsc1JlcXVpcmVkRVNldCA9IGFsbExldmVsc1JlcXVpcmVkRVNldDsKLQkJYWxsTGV2ZWxzUmVxdWlyZWQgPSBBTExfTEVWRUxTX1JFUVVJUkVEX0VERUZBVUxUOwotCQlhbGxMZXZlbHNSZXF1aXJlZEVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERV9fQUxMX0xFVkVMU19SRVFVSVJFRCwgb2xkQWxsTGV2ZWxzUmVxdWlyZWQsIEFMTF9MRVZFTFNfUkVRVUlSRURfRURFRkFVTFQsIG9sZEFsbExldmVsc1JlcXVpcmVkRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0QWxsTGV2ZWxzUmVxdWlyZWQoKSB7Ci0JCXJldHVybiBhbGxMZXZlbHNSZXF1aXJlZEVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNPbmx5VGFibGVWYWx1ZXNBbGxvd2VkKCkgewotCQlyZXR1cm4gb25seVRhYmxlVmFsdWVzQWxsb3dlZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRPbmx5VGFibGVWYWx1ZXNBbGxvd2VkKGJvb2xlYW4gbmV3T25seVRhYmxlVmFsdWVzQWxsb3dlZCkgewotCQlib29sZWFuIG9sZE9ubHlUYWJsZVZhbHVlc0FsbG93ZWQgPSBvbmx5VGFibGVWYWx1ZXNBbGxvd2VkOwotCQlvbmx5VGFibGVWYWx1ZXNBbGxvd2VkID0gbmV3T25seVRhYmxlVmFsdWVzQWxsb3dlZDsKLQkJYm9vbGVhbiBvbGRPbmx5VGFibGVWYWx1ZXNBbGxvd2VkRVNldCA9IG9ubHlUYWJsZVZhbHVlc0FsbG93ZWRFU2V0OwotCQlvbmx5VGFibGVWYWx1ZXNBbGxvd2VkRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuT1VUTElORV9DT0RFX19PTkxZX1RBQkxFX1ZBTFVFU19BTExPV0VELCBvbGRPbmx5VGFibGVWYWx1ZXNBbGxvd2VkLCBvbmx5VGFibGVWYWx1ZXNBbGxvd2VkLCAhb2xkT25seVRhYmxlVmFsdWVzQWxsb3dlZEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldE9ubHlUYWJsZVZhbHVlc0FsbG93ZWQoKSB7Ci0JCWJvb2xlYW4gb2xkT25seVRhYmxlVmFsdWVzQWxsb3dlZCA9IG9ubHlUYWJsZVZhbHVlc0FsbG93ZWQ7Ci0JCWJvb2xlYW4gb2xkT25seVRhYmxlVmFsdWVzQWxsb3dlZEVTZXQgPSBvbmx5VGFibGVWYWx1ZXNBbGxvd2VkRVNldDsKLQkJb25seVRhYmxlVmFsdWVzQWxsb3dlZCA9IE9OTFlfVEFCTEVfVkFMVUVTX0FMTE9XRURfRURFRkFVTFQ7Ci0JCW9ubHlUYWJsZVZhbHVlc0FsbG93ZWRFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREVfX09OTFlfVEFCTEVfVkFMVUVTX0FMTE9XRUQsIG9sZE9ubHlUYWJsZVZhbHVlc0FsbG93ZWQsIE9OTFlfVEFCTEVfVkFMVUVTX0FMTE9XRURfRURFRkFVTFQsIG9sZE9ubHlUYWJsZVZhbHVlc0FsbG93ZWRFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRPbmx5VGFibGVWYWx1ZXNBbGxvd2VkKCkgewotCQlyZXR1cm4gb25seVRhYmxlVmFsdWVzQWxsb3dlZEVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE1hc2tzIGdldE1hc2tzKCkgewotCQlyZXR1cm4gbWFza3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0TWFza3MoTWFza3MgbmV3TWFza3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJTWFza3Mgb2xkTWFza3MgPSBtYXNrczsKLQkJbWFza3MgPSBuZXdNYXNrczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREVfX01BU0tTLCBvbGRNYXNrcywgbmV3TWFza3MpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1hc2tzKE1hc2tzIG5ld01hc2tzKSB7Ci0JCWlmIChuZXdNYXNrcyAhPSBtYXNrcykgewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAobWFza3MgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbWFza3MpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERV9fTUFTS1MsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld01hc2tzICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld01hc2tzKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREVfX01BU0tTLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldE1hc2tzKG5ld01hc2tzLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuT1VUTElORV9DT0RFX19NQVNLUywgbmV3TWFza3MsIG5ld01hc2tzKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERV9fVkFMVUVTOgotCQkJCQlyZXR1cm4gYmFzaWNTZXRWYWx1ZXMobnVsbCwgbXNncyk7Ci0JCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERV9fTUFTS1M6Ci0JCQkJCXJldHVybiBiYXNpY1NldE1hc2tzKG51bGwsIG1zZ3MpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERV9fRklFTERfSUQ6Ci0JCQkJcmV0dXJuIGdldEZpZWxkSUQoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREVfX0ZJRUxEX05BTUU6Ci0JCQkJcmV0dXJuIGdldEZpZWxkTmFtZSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERV9fQUxJQVM6Ci0JCQkJcmV0dXJuIGdldEFsaWFzKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuT1VUTElORV9DT0RFX19QSE9ORVRJQ19BTElBUzoKLQkJCQlyZXR1cm4gZ2V0UGhvbmV0aWNBbGlhcygpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERV9fVkFMVUVTOgotCQkJCXJldHVybiBnZXRWYWx1ZXMoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREVfX0VOVEVSUFJJU0U6Ci0JCQkJcmV0dXJuIGlzRW50ZXJwcmlzZSgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREVfX0VOVEVSUFJJU0VfT1VUTElORV9DT0RFX0FMSUFTOgotCQkJCXJldHVybiBnZXRFbnRlcnByaXNlT3V0bGluZUNvZGVBbGlhcygpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERV9fUkVTT1VSQ0VfU1VCU1RJVFVUSU9OX0VOQUJMRUQ6Ci0JCQkJcmV0dXJuIGlzUmVzb3VyY2VTdWJzdGl0dXRpb25FbmFibGVkKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERV9fTEVBRl9PTkxZOgotCQkJCXJldHVybiBpc0xlYWZPbmx5KCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERV9fQUxMX0xFVkVMU19SRVFVSVJFRDoKLQkJCQlyZXR1cm4gaXNBbGxMZXZlbHNSZXF1aXJlZCgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREVfX09OTFlfVEFCTEVfVkFMVUVTX0FMTE9XRUQ6Ci0JCQkJcmV0dXJuIGlzT25seVRhYmxlVmFsdWVzQWxsb3dlZCgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREVfX01BU0tTOgotCQkJCXJldHVybiBnZXRNYXNrcygpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREVfX0ZJRUxEX0lEOgotCQkJCXNldEZpZWxkSUQoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERV9fRklFTERfTkFNRToKLQkJCQlzZXRGaWVsZE5hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERV9fQUxJQVM6Ci0JCQkJc2V0QWxpYXMoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERV9fUEhPTkVUSUNfQUxJQVM6Ci0JCQkJc2V0UGhvbmV0aWNBbGlhcygoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuT1VUTElORV9DT0RFX19WQUxVRVM6Ci0JCQkJc2V0VmFsdWVzKChWYWx1ZXMpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREVfX0VOVEVSUFJJU0U6Ci0JCQkJc2V0RW50ZXJwcmlzZSgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuT1VUTElORV9DT0RFX19FTlRFUlBSSVNFX09VVExJTkVfQ09ERV9BTElBUzoKLQkJCQlzZXRFbnRlcnByaXNlT3V0bGluZUNvZGVBbGlhcygoQmlnSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERV9fUkVTT1VSQ0VfU1VCU1RJVFVUSU9OX0VOQUJMRUQ6Ci0JCQkJc2V0UmVzb3VyY2VTdWJzdGl0dXRpb25FbmFibGVkKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREVfX0xFQUZfT05MWToKLQkJCQlzZXRMZWFmT25seSgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuT1VUTElORV9DT0RFX19BTExfTEVWRUxTX1JFUVVJUkVEOgotCQkJCXNldEFsbExldmVsc1JlcXVpcmVkKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREVfX09OTFlfVEFCTEVfVkFMVUVTX0FMTE9XRUQ6Ci0JCQkJc2V0T25seVRhYmxlVmFsdWVzQWxsb3dlZCgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuT1VUTElORV9DT0RFX19NQVNLUzoKLQkJCQlzZXRNYXNrcygoTWFza3MpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuT1VUTElORV9DT0RFX19GSUVMRF9JRDoKLQkJCQlzZXRGaWVsZElEKEZJRUxEX0lEX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuT1VUTElORV9DT0RFX19GSUVMRF9OQU1FOgotCQkJCXNldEZpZWxkTmFtZShGSUVMRF9OQU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuT1VUTElORV9DT0RFX19BTElBUzoKLQkJCQlzZXRBbGlhcyhBTElBU19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERV9fUEhPTkVUSUNfQUxJQVM6Ci0JCQkJc2V0UGhvbmV0aWNBbGlhcyhQSE9ORVRJQ19BTElBU19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERV9fVkFMVUVTOgotCQkJCXNldFZhbHVlcygoVmFsdWVzKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREVfX0VOVEVSUFJJU0U6Ci0JCQkJdW5zZXRFbnRlcnByaXNlKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERV9fRU5URVJQUklTRV9PVVRMSU5FX0NPREVfQUxJQVM6Ci0JCQkJc2V0RW50ZXJwcmlzZU91dGxpbmVDb2RlQWxpYXMoRU5URVJQUklTRV9PVVRMSU5FX0NPREVfQUxJQVNfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREVfX1JFU09VUkNFX1NVQlNUSVRVVElPTl9FTkFCTEVEOgotCQkJCXVuc2V0UmVzb3VyY2VTdWJzdGl0dXRpb25FbmFibGVkKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERV9fTEVBRl9PTkxZOgotCQkJCXVuc2V0TGVhZk9ubHkoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuT1VUTElORV9DT0RFX19BTExfTEVWRUxTX1JFUVVJUkVEOgotCQkJCXVuc2V0QWxsTGV2ZWxzUmVxdWlyZWQoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuT1VUTElORV9DT0RFX19PTkxZX1RBQkxFX1ZBTFVFU19BTExPV0VEOgotCQkJCXVuc2V0T25seVRhYmxlVmFsdWVzQWxsb3dlZCgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREVfX01BU0tTOgotCQkJCXNldE1hc2tzKChNYXNrcyludWxsKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREVfX0ZJRUxEX0lEOgotCQkJCXJldHVybiBGSUVMRF9JRF9FREVGQVVMVCA9PSBudWxsID8gZmllbGRJRCAhPSBudWxsIDogIUZJRUxEX0lEX0VERUZBVUxULmVxdWFscyhmaWVsZElEKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREVfX0ZJRUxEX05BTUU6Ci0JCQkJcmV0dXJuIEZJRUxEX05BTUVfRURFRkFVTFQgPT0gbnVsbCA/IGZpZWxkTmFtZSAhPSBudWxsIDogIUZJRUxEX05BTUVfRURFRkFVTFQuZXF1YWxzKGZpZWxkTmFtZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuT1VUTElORV9DT0RFX19BTElBUzoKLQkJCQlyZXR1cm4gQUxJQVNfRURFRkFVTFQgPT0gbnVsbCA/IGFsaWFzICE9IG51bGwgOiAhQUxJQVNfRURFRkFVTFQuZXF1YWxzKGFsaWFzKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREVfX1BIT05FVElDX0FMSUFTOgotCQkJCXJldHVybiBQSE9ORVRJQ19BTElBU19FREVGQVVMVCA9PSBudWxsID8gcGhvbmV0aWNBbGlhcyAhPSBudWxsIDogIVBIT05FVElDX0FMSUFTX0VERUZBVUxULmVxdWFscyhwaG9uZXRpY0FsaWFzKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREVfX1ZBTFVFUzoKLQkJCQlyZXR1cm4gdmFsdWVzICE9IG51bGw7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuT1VUTElORV9DT0RFX19FTlRFUlBSSVNFOgotCQkJCXJldHVybiBpc1NldEVudGVycHJpc2UoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREVfX0VOVEVSUFJJU0VfT1VUTElORV9DT0RFX0FMSUFTOgotCQkJCXJldHVybiBFTlRFUlBSSVNFX09VVExJTkVfQ09ERV9BTElBU19FREVGQVVMVCA9PSBudWxsID8gZW50ZXJwcmlzZU91dGxpbmVDb2RlQWxpYXMgIT0gbnVsbCA6ICFFTlRFUlBSSVNFX09VVExJTkVfQ09ERV9BTElBU19FREVGQVVMVC5lcXVhbHMoZW50ZXJwcmlzZU91dGxpbmVDb2RlQWxpYXMpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERV9fUkVTT1VSQ0VfU1VCU1RJVFVUSU9OX0VOQUJMRUQ6Ci0JCQkJcmV0dXJuIGlzU2V0UmVzb3VyY2VTdWJzdGl0dXRpb25FbmFibGVkKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuT1VUTElORV9DT0RFX19MRUFGX09OTFk6Ci0JCQkJcmV0dXJuIGlzU2V0TGVhZk9ubHkoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREVfX0FMTF9MRVZFTFNfUkVRVUlSRUQ6Ci0JCQkJcmV0dXJuIGlzU2V0QWxsTGV2ZWxzUmVxdWlyZWQoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREVfX09OTFlfVEFCTEVfVkFMVUVTX0FMTE9XRUQ6Ci0JCQkJcmV0dXJuIGlzU2V0T25seVRhYmxlVmFsdWVzQWxsb3dlZCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERV9fTUFTS1M6Ci0JCQkJcmV0dXJuIG1hc2tzICE9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChmaWVsZElEOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChmaWVsZElEKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBmaWVsZE5hbWU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGZpZWxkTmFtZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgYWxpYXM6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGFsaWFzKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBwaG9uZXRpY0FsaWFzOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChwaG9uZXRpY0FsaWFzKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBlbnRlcnByaXNlOiAiKTsKLQkJaWYgKGVudGVycHJpc2VFU2V0KSByZXN1bHQuYXBwZW5kKGVudGVycHJpc2UpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBlbnRlcnByaXNlT3V0bGluZUNvZGVBbGlhczogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZW50ZXJwcmlzZU91dGxpbmVDb2RlQWxpYXMpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHJlc291cmNlU3Vic3RpdHV0aW9uRW5hYmxlZDogIik7Ci0JCWlmIChyZXNvdXJjZVN1YnN0aXR1dGlvbkVuYWJsZWRFU2V0KSByZXN1bHQuYXBwZW5kKHJlc291cmNlU3Vic3RpdHV0aW9uRW5hYmxlZCk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGxlYWZPbmx5OiAiKTsKLQkJaWYgKGxlYWZPbmx5RVNldCkgcmVzdWx0LmFwcGVuZChsZWFmT25seSk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGFsbExldmVsc1JlcXVpcmVkOiAiKTsKLQkJaWYgKGFsbExldmVsc1JlcXVpcmVkRVNldCkgcmVzdWx0LmFwcGVuZChhbGxMZXZlbHNSZXF1aXJlZCk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIG9ubHlUYWJsZVZhbHVlc0FsbG93ZWQ6ICIpOwotCQlpZiAob25seVRhYmxlVmFsdWVzQWxsb3dlZEVTZXQpIHJlc3VsdC5hcHBlbmQob25seVRhYmxlVmFsdWVzQWxsb3dlZCk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9PdXRsaW5lQ29kZUltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9PdXRsaW5lQ29kZXNJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvT3V0bGluZUNvZGVzSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNmNkM2M3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9PdXRsaW5lQ29kZXNJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDkgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBPdXRsaW5lQ29kZXNJbXBsLmphdmEsdiAxLjEgMjAwOC8wMS8xNSAwODo1MTo1MyBqdGhhbSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZXM7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5PdXRsaW5lIENvZGVzPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuT3V0bGluZUNvZGVzSW1wbCNnZXRPdXRsaW5lQ29kZSA8ZW0+T3V0bGluZSBDb2RlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgT3V0bGluZUNvZGVzSW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgT3V0bGluZUNvZGVzIHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRPdXRsaW5lQ29kZSgpIDxlbT5PdXRsaW5lIENvZGU8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0T3V0bGluZUNvZGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBvdXRsaW5lQ29kZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT3V0bGluZUNvZGVzSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldE91dGxpbmVDb2RlcygpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRPdXRsaW5lQ29kZSgpIHsKLQkJaWYgKG91dGxpbmVDb2RlID09IG51bGwpIHsKLQkJCW91dGxpbmVDb2RlID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KE91dGxpbmVDb2RlLmNsYXNzLCB0aGlzLCBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERVNfX09VVExJTkVfQ09ERSk7Ci0JCX0KLQkJcmV0dXJuIG91dGxpbmVDb2RlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREVTX19PVVRMSU5FX0NPREU6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0T3V0bGluZUNvZGUoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERVNfX09VVExJTkVfQ09ERToKLQkJCQlyZXR1cm4gZ2V0T3V0bGluZUNvZGUoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuT1VUTElORV9DT0RFU19fT1VUTElORV9DT0RFOgotCQkJCWdldE91dGxpbmVDb2RlKCkuY2xlYXIoKTsKLQkJCQlnZXRPdXRsaW5lQ29kZSgpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREVTX19PVVRMSU5FX0NPREU6Ci0JCQkJZ2V0T3V0bGluZUNvZGUoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERVNfX09VVExJTkVfQ09ERToKLQkJCQlyZXR1cm4gb3V0bGluZUNvZGUgIT0gbnVsbCAmJiAhb3V0bGluZUNvZGUuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLX0gLy9PdXRsaW5lQ29kZXNJbXBsCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvUHJlZGVjZXNzb3JMaW5rSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL1ByZWRlY2Vzc29yTGlua0ltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzc2YTM5OC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvUHJlZGVjZXNzb3JMaW5rSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDY1ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogUHJlZGVjZXNzb3JMaW5rSW1wbC5qYXZhLHYgMS4xIDIwMDgvMDEvMTUgMDg6NTE6NTMganRoYW0gRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGw7Ci0KLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJlZGVjZXNzb3JMaW5rOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UHJlZGVjZXNzb3IgTGluazwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlByZWRlY2Vzc29yTGlua0ltcGwjZ2V0UHJlZGVjZXNzb3JVSUQgPGVtPlByZWRlY2Vzc29yIFVJRDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlByZWRlY2Vzc29yTGlua0ltcGwjZ2V0VHlwZSA8ZW0+VHlwZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlByZWRlY2Vzc29yTGlua0ltcGwjaXNDcm9zc1Byb2plY3QgPGVtPkNyb3NzIFByb2plY3Q8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5QcmVkZWNlc3NvckxpbmtJbXBsI2dldENyb3NzUHJvamVjdE5hbWUgPGVtPkNyb3NzIFByb2plY3QgTmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlByZWRlY2Vzc29yTGlua0ltcGwjZ2V0TGlua0xhZyA8ZW0+TGluayBMYWc8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5QcmVkZWNlc3NvckxpbmtJbXBsI2dldExhZ0Zvcm1hdCA8ZW0+TGFnIEZvcm1hdDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFByZWRlY2Vzc29yTGlua0ltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIFByZWRlY2Vzc29yTGluayB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByZWRlY2Vzc29yVUlEKCkgPGVtPlByZWRlY2Vzc29yIFVJRDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UHJlZGVjZXNzb3JVSUQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBQUkVERUNFU1NPUl9VSURfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJlZGVjZXNzb3JVSUQoKSA8ZW0+UHJlZGVjZXNzb3IgVUlEPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQcmVkZWNlc3NvclVJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0ludGVnZXIgcHJlZGVjZXNzb3JVSUQgPSBQUkVERUNFU1NPUl9VSURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VHlwZSgpIDxlbT5UeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0ludGVnZXIgVFlQRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUeXBlKCkgPGVtPlR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdJbnRlZ2VyIHR5cGUgPSBUWVBFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzQ3Jvc3NQcm9qZWN0KCkgPGVtPkNyb3NzIFByb2plY3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzQ3Jvc3NQcm9qZWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gQ1JPU1NfUFJPSkVDVF9FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNDcm9zc1Byb2plY3QoKSA8ZW0+Q3Jvc3MgUHJvamVjdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNDcm9zc1Byb2plY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGNyb3NzUHJvamVjdCA9IENST1NTX1BST0pFQ1RfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIENyb3NzIFByb2plY3QgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGNyb3NzUHJvamVjdEVTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDcm9zc1Byb2plY3ROYW1lKCkgPGVtPkNyb3NzIFByb2plY3QgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q3Jvc3NQcm9qZWN0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1JPU1NfUFJPSkVDVF9OQU1FX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENyb3NzUHJvamVjdE5hbWUoKSA8ZW0+Q3Jvc3MgUHJvamVjdCBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDcm9zc1Byb2plY3ROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGNyb3NzUHJvamVjdE5hbWUgPSBDUk9TU19QUk9KRUNUX05BTUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TGlua0xhZygpIDxlbT5MaW5rIExhZzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TGlua0xhZygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdJbnRlZ2VyIExJTktfTEFHX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldExpbmtMYWcoKSA8ZW0+TGluayBMYWc8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldExpbmtMYWcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdJbnRlZ2VyIGxpbmtMYWcgPSBMSU5LX0xBR19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRMYWdGb3JtYXQoKSA8ZW0+TGFnIEZvcm1hdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TGFnRm9ybWF0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0ludGVnZXIgTEFHX0ZPUk1BVF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRMYWdGb3JtYXQoKSA8ZW0+TGFnIEZvcm1hdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TGFnRm9ybWF0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnSW50ZWdlciBsYWdGb3JtYXQgPSBMQUdfRk9STUFUX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFByZWRlY2Vzc29yTGlua0ltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXRQcmVkZWNlc3NvckxpbmsoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBnZXRQcmVkZWNlc3NvclVJRCgpIHsKLQkJcmV0dXJuIHByZWRlY2Vzc29yVUlEOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFByZWRlY2Vzc29yVUlEKEJpZ0ludGVnZXIgbmV3UHJlZGVjZXNzb3JVSUQpIHsKLQkJQmlnSW50ZWdlciBvbGRQcmVkZWNlc3NvclVJRCA9IHByZWRlY2Vzc29yVUlEOwotCQlwcmVkZWNlc3NvclVJRCA9IG5ld1ByZWRlY2Vzc29yVUlEOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlBSRURFQ0VTU09SX0xJTktfX1BSRURFQ0VTU09SX1VJRCwgb2xkUHJlZGVjZXNzb3JVSUQsIHByZWRlY2Vzc29yVUlEKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIHR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VHlwZShCaWdJbnRlZ2VyIG5ld1R5cGUpIHsKLQkJQmlnSW50ZWdlciBvbGRUeXBlID0gdHlwZTsKLQkJdHlwZSA9IG5ld1R5cGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJFREVDRVNTT1JfTElOS19fVFlQRSwgb2xkVHlwZSwgdHlwZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQ3Jvc3NQcm9qZWN0KCkgewotCQlyZXR1cm4gY3Jvc3NQcm9qZWN0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENyb3NzUHJvamVjdChib29sZWFuIG5ld0Nyb3NzUHJvamVjdCkgewotCQlib29sZWFuIG9sZENyb3NzUHJvamVjdCA9IGNyb3NzUHJvamVjdDsKLQkJY3Jvc3NQcm9qZWN0ID0gbmV3Q3Jvc3NQcm9qZWN0OwotCQlib29sZWFuIG9sZENyb3NzUHJvamVjdEVTZXQgPSBjcm9zc1Byb2plY3RFU2V0OwotCQljcm9zc1Byb2plY3RFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5QUkVERUNFU1NPUl9MSU5LX19DUk9TU19QUk9KRUNULCBvbGRDcm9zc1Byb2plY3QsIGNyb3NzUHJvamVjdCwgIW9sZENyb3NzUHJvamVjdEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldENyb3NzUHJvamVjdCgpIHsKLQkJYm9vbGVhbiBvbGRDcm9zc1Byb2plY3QgPSBjcm9zc1Byb2plY3Q7Ci0JCWJvb2xlYW4gb2xkQ3Jvc3NQcm9qZWN0RVNldCA9IGNyb3NzUHJvamVjdEVTZXQ7Ci0JCWNyb3NzUHJvamVjdCA9IENST1NTX1BST0pFQ1RfRURFRkFVTFQ7Ci0JCWNyb3NzUHJvamVjdEVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBNc3Byb2plY3RQYWNrYWdlLlBSRURFQ0VTU09SX0xJTktfX0NST1NTX1BST0pFQ1QsIG9sZENyb3NzUHJvamVjdCwgQ1JPU1NfUFJPSkVDVF9FREVGQVVMVCwgb2xkQ3Jvc3NQcm9qZWN0RVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0Q3Jvc3NQcm9qZWN0KCkgewotCQlyZXR1cm4gY3Jvc3NQcm9qZWN0RVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENyb3NzUHJvamVjdE5hbWUoKSB7Ci0JCXJldHVybiBjcm9zc1Byb2plY3ROYW1lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENyb3NzUHJvamVjdE5hbWUoU3RyaW5nIG5ld0Nyb3NzUHJvamVjdE5hbWUpIHsKLQkJU3RyaW5nIG9sZENyb3NzUHJvamVjdE5hbWUgPSBjcm9zc1Byb2plY3ROYW1lOwotCQljcm9zc1Byb2plY3ROYW1lID0gbmV3Q3Jvc3NQcm9qZWN0TmFtZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5QUkVERUNFU1NPUl9MSU5LX19DUk9TU19QUk9KRUNUX05BTUUsIG9sZENyb3NzUHJvamVjdE5hbWUsIGNyb3NzUHJvamVjdE5hbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBnZXRMaW5rTGFnKCkgewotCQlyZXR1cm4gbGlua0xhZzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMaW5rTGFnKEJpZ0ludGVnZXIgbmV3TGlua0xhZykgewotCQlCaWdJbnRlZ2VyIG9sZExpbmtMYWcgPSBsaW5rTGFnOwotCQlsaW5rTGFnID0gbmV3TGlua0xhZzsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5QUkVERUNFU1NPUl9MSU5LX19MSU5LX0xBRywgb2xkTGlua0xhZywgbGlua0xhZykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGdldExhZ0Zvcm1hdCgpIHsKLQkJcmV0dXJuIGxhZ0Zvcm1hdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMYWdGb3JtYXQoQmlnSW50ZWdlciBuZXdMYWdGb3JtYXQpIHsKLQkJQmlnSW50ZWdlciBvbGRMYWdGb3JtYXQgPSBsYWdGb3JtYXQ7Ci0JCWxhZ0Zvcm1hdCA9IG5ld0xhZ0Zvcm1hdDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5QUkVERUNFU1NPUl9MSU5LX19MQUdfRk9STUFULCBvbGRMYWdGb3JtYXQsIGxhZ0Zvcm1hdCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUkVERUNFU1NPUl9MSU5LX19QUkVERUNFU1NPUl9VSUQ6Ci0JCQkJcmV0dXJuIGdldFByZWRlY2Vzc29yVUlEKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJFREVDRVNTT1JfTElOS19fVFlQRToKLQkJCQlyZXR1cm4gZ2V0VHlwZSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBSRURFQ0VTU09SX0xJTktfX0NST1NTX1BST0pFQ1Q6Ci0JCQkJcmV0dXJuIGlzQ3Jvc3NQcm9qZWN0KCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBSRURFQ0VTU09SX0xJTktfX0NST1NTX1BST0pFQ1RfTkFNRToKLQkJCQlyZXR1cm4gZ2V0Q3Jvc3NQcm9qZWN0TmFtZSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBSRURFQ0VTU09SX0xJTktfX0xJTktfTEFHOgotCQkJCXJldHVybiBnZXRMaW5rTGFnKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJFREVDRVNTT1JfTElOS19fTEFHX0ZPUk1BVDoKLQkJCQlyZXR1cm4gZ2V0TGFnRm9ybWF0KCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBSRURFQ0VTU09SX0xJTktfX1BSRURFQ0VTU09SX1VJRDoKLQkJCQlzZXRQcmVkZWNlc3NvclVJRCgoQmlnSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBSRURFQ0VTU09SX0xJTktfX1RZUEU6Ci0JCQkJc2V0VHlwZSgoQmlnSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBSRURFQ0VTU09SX0xJTktfX0NST1NTX1BST0pFQ1Q6Ci0JCQkJc2V0Q3Jvc3NQcm9qZWN0KCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUkVERUNFU1NPUl9MSU5LX19DUk9TU19QUk9KRUNUX05BTUU6Ci0JCQkJc2V0Q3Jvc3NQcm9qZWN0TmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJFREVDRVNTT1JfTElOS19fTElOS19MQUc6Ci0JCQkJc2V0TGlua0xhZygoQmlnSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBSRURFQ0VTU09SX0xJTktfX0xBR19GT1JNQVQ6Ci0JCQkJc2V0TGFnRm9ybWF0KChCaWdJbnRlZ2VyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBSRURFQ0VTU09SX0xJTktfX1BSRURFQ0VTU09SX1VJRDoKLQkJCQlzZXRQcmVkZWNlc3NvclVJRChQUkVERUNFU1NPUl9VSURfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUkVERUNFU1NPUl9MSU5LX19UWVBFOgotCQkJCXNldFR5cGUoVFlQRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBSRURFQ0VTU09SX0xJTktfX0NST1NTX1BST0pFQ1Q6Ci0JCQkJdW5zZXRDcm9zc1Byb2plY3QoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJFREVDRVNTT1JfTElOS19fQ1JPU1NfUFJPSkVDVF9OQU1FOgotCQkJCXNldENyb3NzUHJvamVjdE5hbWUoQ1JPU1NfUFJPSkVDVF9OQU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJFREVDRVNTT1JfTElOS19fTElOS19MQUc6Ci0JCQkJc2V0TGlua0xhZyhMSU5LX0xBR19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBSRURFQ0VTU09SX0xJTktfX0xBR19GT1JNQVQ6Ci0JCQkJc2V0TGFnRm9ybWF0KExBR19GT1JNQVRfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBSRURFQ0VTU09SX0xJTktfX1BSRURFQ0VTU09SX1VJRDoKLQkJCQlyZXR1cm4gUFJFREVDRVNTT1JfVUlEX0VERUZBVUxUID09IG51bGwgPyBwcmVkZWNlc3NvclVJRCAhPSBudWxsIDogIVBSRURFQ0VTU09SX1VJRF9FREVGQVVMVC5lcXVhbHMocHJlZGVjZXNzb3JVSUQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBSRURFQ0VTU09SX0xJTktfX1RZUEU6Ci0JCQkJcmV0dXJuIFRZUEVfRURFRkFVTFQgPT0gbnVsbCA/IHR5cGUgIT0gbnVsbCA6ICFUWVBFX0VERUZBVUxULmVxdWFscyh0eXBlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUkVERUNFU1NPUl9MSU5LX19DUk9TU19QUk9KRUNUOgotCQkJCXJldHVybiBpc1NldENyb3NzUHJvamVjdCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBSRURFQ0VTU09SX0xJTktfX0NST1NTX1BST0pFQ1RfTkFNRToKLQkJCQlyZXR1cm4gQ1JPU1NfUFJPSkVDVF9OQU1FX0VERUZBVUxUID09IG51bGwgPyBjcm9zc1Byb2plY3ROYW1lICE9IG51bGwgOiAhQ1JPU1NfUFJPSkVDVF9OQU1FX0VERUZBVUxULmVxdWFscyhjcm9zc1Byb2plY3ROYW1lKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUkVERUNFU1NPUl9MSU5LX19MSU5LX0xBRzoKLQkJCQlyZXR1cm4gTElOS19MQUdfRURFRkFVTFQgPT0gbnVsbCA/IGxpbmtMYWcgIT0gbnVsbCA6ICFMSU5LX0xBR19FREVGQVVMVC5lcXVhbHMobGlua0xhZyk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJFREVDRVNTT1JfTElOS19fTEFHX0ZPUk1BVDoKLQkJCQlyZXR1cm4gTEFHX0ZPUk1BVF9FREVGQVVMVCA9PSBudWxsID8gbGFnRm9ybWF0ICE9IG51bGwgOiAhTEFHX0ZPUk1BVF9FREVGQVVMVC5lcXVhbHMobGFnRm9ybWF0KTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHByZWRlY2Vzc29yVUlEOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChwcmVkZWNlc3NvclVJRCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgdHlwZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQodHlwZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgY3Jvc3NQcm9qZWN0OiAiKTsKLQkJaWYgKGNyb3NzUHJvamVjdEVTZXQpIHJlc3VsdC5hcHBlbmQoY3Jvc3NQcm9qZWN0KTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgY3Jvc3NQcm9qZWN0TmFtZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoY3Jvc3NQcm9qZWN0TmFtZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgbGlua0xhZzogIik7Ci0JCXJlc3VsdC5hcHBlbmQobGlua0xhZyk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgbGFnRm9ybWF0OiAiKTsKLQkJcmVzdWx0LmFwcGVuZChsYWdGb3JtYXQpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9QcmVkZWNlc3NvckxpbmtJbXBsCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvUHJvamVjdEltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9Qcm9qZWN0SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNGY0ZDA3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9Qcm9qZWN0SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDc3MSArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFByb2plY3RJbXBsLmphdmEsdiAxLjEgMjAwOC8wMS8xNSAwODo1MTo1MyBqdGhhbSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbDsKLQotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5DYWxlbmRhcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2tzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV0JTTWFza3M7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Qcm9qZWN0PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUHJvamVjdEltcGwjZ2V0VUlEIDxlbT5VSUQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Qcm9qZWN0SW1wbCNnZXROYW1lIDxlbT5OYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUHJvamVjdEltcGwjZ2V0VGl0bGUgPGVtPlRpdGxlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUHJvamVjdEltcGwjZ2V0U3ViamVjdCA8ZW0+U3ViamVjdDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlByb2plY3RJbXBsI2dldENhdGVnb3J5IDxlbT5DYXRlZ29yeTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlByb2plY3RJbXBsI2dldENvbXBhbnkgPGVtPkNvbXBhbnk8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Qcm9qZWN0SW1wbCNnZXRNYW5hZ2VyIDxlbT5NYW5hZ2VyPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUHJvamVjdEltcGwjZ2V0QXV0aG9yIDxlbT5BdXRob3I8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Qcm9qZWN0SW1wbCNnZXRDcmVhdGlvbkRhdGUgPGVtPkNyZWF0aW9uIERhdGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Qcm9qZWN0SW1wbCNnZXRSZXZpc2lvbiA8ZW0+UmV2aXNpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Qcm9qZWN0SW1wbCNnZXRMYXN0U2F2ZWQgPGVtPkxhc3QgU2F2ZWQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Qcm9qZWN0SW1wbCNpc1NjaGVkdWxlRnJvbVN0YXJ0IDxlbT5TY2hlZHVsZSBGcm9tIFN0YXJ0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUHJvamVjdEltcGwjZ2V0U3RhcnREYXRlIDxlbT5TdGFydCBEYXRlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUHJvamVjdEltcGwjZ2V0RmluaXNoRGF0ZSA8ZW0+RmluaXNoIERhdGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Qcm9qZWN0SW1wbCNnZXRGWVN0YXJ0RGF0ZSA8ZW0+RlkgU3RhcnQgRGF0ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlByb2plY3RJbXBsI2dldENyaXRpY2FsU2xhY2tMaW1pdCA8ZW0+Q3JpdGljYWwgU2xhY2sgTGltaXQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Qcm9qZWN0SW1wbCNnZXRDdXJyZW5jeURpZ2l0cyA8ZW0+Q3VycmVuY3kgRGlnaXRzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUHJvamVjdEltcGwjZ2V0Q3VycmVuY3lTeW1ib2wgPGVtPkN1cnJlbmN5IFN5bWJvbDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlByb2plY3RJbXBsI2dldEN1cnJlbmN5U3ltYm9sUG9zaXRpb24gPGVtPkN1cnJlbmN5IFN5bWJvbCBQb3NpdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlByb2plY3RJbXBsI2dldENhbGVuZGFyVUlEIDxlbT5DYWxlbmRhciBVSUQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Qcm9qZWN0SW1wbCNnZXREZWZhdWx0U3RhcnRUaW1lIDxlbT5EZWZhdWx0IFN0YXJ0IFRpbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Qcm9qZWN0SW1wbCNnZXREZWZhdWx0RmluaXNoVGltZSA8ZW0+RGVmYXVsdCBGaW5pc2ggVGltZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlByb2plY3RJbXBsI2dldE1pbnV0ZXNQZXJEYXkgPGVtPk1pbnV0ZXMgUGVyIERheTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlByb2plY3RJbXBsI2dldE1pbnV0ZXNQZXJXZWVrIDxlbT5NaW51dGVzIFBlciBXZWVrPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUHJvamVjdEltcGwjZ2V0RGF5c1Blck1vbnRoIDxlbT5EYXlzIFBlciBNb250aDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlByb2plY3RJbXBsI2dldERlZmF1bHRUYXNrVHlwZSA8ZW0+RGVmYXVsdCBUYXNrIFR5cGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Qcm9qZWN0SW1wbCNnZXREZWZhdWx0Rml4ZWRDb3N0QWNjcnVhbCA8ZW0+RGVmYXVsdCBGaXhlZCBDb3N0IEFjY3J1YWw8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Qcm9qZWN0SW1wbCNnZXREZWZhdWx0U3RhbmRhcmRSYXRlIDxlbT5EZWZhdWx0IFN0YW5kYXJkIFJhdGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Qcm9qZWN0SW1wbCNnZXREZWZhdWx0T3ZlcnRpbWVSYXRlIDxlbT5EZWZhdWx0IE92ZXJ0aW1lIFJhdGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Qcm9qZWN0SW1wbCNnZXREdXJhdGlvbkZvcm1hdCA8ZW0+RHVyYXRpb24gRm9ybWF0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUHJvamVjdEltcGwjZ2V0V29ya0Zvcm1hdCA8ZW0+V29yayBGb3JtYXQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Qcm9qZWN0SW1wbCNpc0VkaXRhYmxlQWN0dWFsQ29zdHMgPGVtPkVkaXRhYmxlIEFjdHVhbCBDb3N0czwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlByb2plY3RJbXBsI2lzSG9ub3JDb25zdHJhaW50cyA8ZW0+SG9ub3IgQ29uc3RyYWludHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Qcm9qZWN0SW1wbCNnZXRFYXJuZWRWYWx1ZU1ldGhvZCA8ZW0+RWFybmVkIFZhbHVlIE1ldGhvZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlByb2plY3RJbXBsI2lzSW5zZXJ0ZWRQcm9qZWN0c0xpa2VTdW1tYXJ5IDxlbT5JbnNlcnRlZCBQcm9qZWN0cyBMaWtlIFN1bW1hcnk8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Qcm9qZWN0SW1wbCNpc011bHRpcGxlQ3JpdGljYWxQYXRocyA8ZW0+TXVsdGlwbGUgQ3JpdGljYWwgUGF0aHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Qcm9qZWN0SW1wbCNpc05ld1Rhc2tzRWZmb3J0RHJpdmVuIDxlbT5OZXcgVGFza3MgRWZmb3J0IERyaXZlbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlByb2plY3RJbXBsI2lzTmV3VGFza3NFc3RpbWF0ZWQgPGVtPk5ldyBUYXNrcyBFc3RpbWF0ZWQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Qcm9qZWN0SW1wbCNpc1NwbGl0c0luUHJvZ3Jlc3NUYXNrcyA8ZW0+U3BsaXRzIEluIFByb2dyZXNzIFRhc2tzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUHJvamVjdEltcGwjaXNTcHJlYWRBY3R1YWxDb3N0IDxlbT5TcHJlYWQgQWN0dWFsIENvc3Q8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Qcm9qZWN0SW1wbCNpc1NwcmVhZFBlcmNlbnRDb21wbGV0ZSA8ZW0+U3ByZWFkIFBlcmNlbnQgQ29tcGxldGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Qcm9qZWN0SW1wbCNpc1Rhc2tVcGRhdGVzUmVzb3VyY2UgPGVtPlRhc2sgVXBkYXRlcyBSZXNvdXJjZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlByb2plY3RJbXBsI2lzRmlzY2FsWWVhclN0YXJ0IDxlbT5GaXNjYWwgWWVhciBTdGFydDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlByb2plY3RJbXBsI2dldFdlZWtTdGFydERheSA8ZW0+V2VlayBTdGFydCBEYXk8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Qcm9qZWN0SW1wbCNpc01vdmVDb21wbGV0ZWRFbmRzQmFjayA8ZW0+TW92ZSBDb21wbGV0ZWQgRW5kcyBCYWNrPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUHJvamVjdEltcGwjaXNNb3ZlUmVtYWluaW5nU3RhcnRzQmFjayA8ZW0+TW92ZSBSZW1haW5pbmcgU3RhcnRzIEJhY2s8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Qcm9qZWN0SW1wbCNpc01vdmVSZW1haW5pbmdTdGFydHNGb3J3YXJkIDxlbT5Nb3ZlIFJlbWFpbmluZyBTdGFydHMgRm9yd2FyZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlByb2plY3RJbXBsI2lzTW92ZUNvbXBsZXRlZEVuZHNGb3J3YXJkIDxlbT5Nb3ZlIENvbXBsZXRlZCBFbmRzIEZvcndhcmQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Qcm9qZWN0SW1wbCNnZXRCYXNlbGluZUZvckVhcm5lZFZhbHVlIDxlbT5CYXNlbGluZSBGb3IgRWFybmVkIFZhbHVlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUHJvamVjdEltcGwjaXNBdXRvQWRkTmV3UmVzb3VyY2VzQW5kVGFza3MgPGVtPkF1dG8gQWRkIE5ldyBSZXNvdXJjZXMgQW5kIFRhc2tzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUHJvamVjdEltcGwjZ2V0U3RhdHVzRGF0ZSA8ZW0+U3RhdHVzIERhdGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Qcm9qZWN0SW1wbCNnZXRDdXJyZW50RGF0ZSA8ZW0+Q3VycmVudCBEYXRlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUHJvamVjdEltcGwjaXNNaWNyb3NvZnRQcm9qZWN0U2VydmVyVVJMIDxlbT5NaWNyb3NvZnQgUHJvamVjdCBTZXJ2ZXIgVVJMPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUHJvamVjdEltcGwjaXNBdXRvbGluayA8ZW0+QXV0b2xpbms8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Qcm9qZWN0SW1wbCNnZXROZXdUYXNrU3RhcnREYXRlIDxlbT5OZXcgVGFzayBTdGFydCBEYXRlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUHJvamVjdEltcGwjZ2V0RGVmYXVsdFRhc2tFVk1ldGhvZCA8ZW0+RGVmYXVsdCBUYXNrIEVWIE1ldGhvZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlByb2plY3RJbXBsI2lzUHJvamVjdEV4dGVybmFsbHlFZGl0ZWQgPGVtPlByb2plY3QgRXh0ZXJuYWxseSBFZGl0ZWQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Qcm9qZWN0SW1wbCNnZXRFeHRlbmRlZENyZWF0aW9uRGF0ZSA8ZW0+RXh0ZW5kZWQgQ3JlYXRpb24gRGF0ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlByb2plY3RJbXBsI2lzQWN0dWFsc0luU3luYyA8ZW0+QWN0dWFscyBJbiBTeW5jPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUHJvamVjdEltcGwjaXNSZW1vdmVGaWxlUHJvcGVydGllcyA8ZW0+UmVtb3ZlIEZpbGUgUHJvcGVydGllczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlByb2plY3RJbXBsI2lzQWRtaW5Qcm9qZWN0IDxlbT5BZG1pbiBQcm9qZWN0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUHJvamVjdEltcGwjZ2V0T3V0bGluZUNvZGVzIDxlbT5PdXRsaW5lIENvZGVzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUHJvamVjdEltcGwjZ2V0V0JTTWFza3MgPGVtPldCUyBNYXNrczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlByb2plY3RJbXBsI2dldEV4dGVuZGVkQXR0cmlidXRlcyA8ZW0+RXh0ZW5kZWQgQXR0cmlidXRlczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlByb2plY3RJbXBsI2dldENhbGVuZGFycyA8ZW0+Q2FsZW5kYXJzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUHJvamVjdEltcGwjZ2V0VGFza3MgPGVtPlRhc2tzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUHJvamVjdEltcGwjZ2V0UmVzb3VyY2VzIDxlbT5SZXNvdXJjZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Qcm9qZWN0SW1wbCNnZXRBc3NpZ25tZW50cyA8ZW0+QXNzaWdubWVudHM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9qZWN0SW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgUHJvamVjdCB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFVJRCgpIDxlbT5VSUQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFVJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVUlEX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFVJRCgpIDxlbT5VSUQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFVJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyB1SUQgPSBVSURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZSgpIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWUoKSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBuYW1lID0gTkFNRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUaXRsZSgpIDxlbT5UaXRsZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VGl0bGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFRJVExFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFRpdGxlKCkgPGVtPlRpdGxlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUaXRsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyB0aXRsZSA9IFRJVExFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFN1YmplY3QoKSA8ZW0+U3ViamVjdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U3ViamVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1VCSkVDVF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTdWJqZWN0KCkgPGVtPlN1YmplY3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFN1YmplY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgc3ViamVjdCA9IFNVQkpFQ1RfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q2F0ZWdvcnkoKSA8ZW0+Q2F0ZWdvcnk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENhdGVnb3J5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBDQVRFR09SWV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDYXRlZ29yeSgpIDxlbT5DYXRlZ29yeTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q2F0ZWdvcnkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgY2F0ZWdvcnkgPSBDQVRFR09SWV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb21wYW55KCkgPGVtPkNvbXBhbnk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENvbXBhbnkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIENPTVBBTllfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q29tcGFueSgpIDxlbT5Db21wYW55PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDb21wYW55KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGNvbXBhbnkgPSBDT01QQU5ZX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1hbmFnZXIoKSA8ZW0+TWFuYWdlcjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TWFuYWdlcigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFOQUdFUl9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNYW5hZ2VyKCkgPGVtPk1hbmFnZXI8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE1hbmFnZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgbWFuYWdlciA9IE1BTkFHRVJfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QXV0aG9yKCkgPGVtPkF1dGhvcjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QXV0aG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBBVVRIT1JfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QXV0aG9yKCkgPGVtPkF1dGhvcjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QXV0aG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGF1dGhvciA9IEFVVEhPUl9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDcmVhdGlvbkRhdGUoKSA8ZW0+Q3JlYXRpb24gRGF0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q3JlYXRpb25EYXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIE9iamVjdCBDUkVBVElPTl9EQVRFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENyZWF0aW9uRGF0ZSgpIDxlbT5DcmVhdGlvbiBEYXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDcmVhdGlvbkRhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgY3JlYXRpb25EYXRlID0gQ1JFQVRJT05fREFURV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZXZpc2lvbigpIDxlbT5SZXZpc2lvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmV2aXNpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBSRVZJU0lPTl9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZXZpc2lvbigpIDxlbT5SZXZpc2lvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmV2aXNpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdJbnRlZ2VyIHJldmlzaW9uID0gUkVWSVNJT05fRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TGFzdFNhdmVkKCkgPGVtPkxhc3QgU2F2ZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldExhc3RTYXZlZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBPYmplY3QgTEFTVF9TQVZFRF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRMYXN0U2F2ZWQoKSA8ZW0+TGFzdCBTYXZlZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TGFzdFNhdmVkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGxhc3RTYXZlZCA9IExBU1RfU0FWRURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNTY2hlZHVsZUZyb21TdGFydCgpIDxlbT5TY2hlZHVsZSBGcm9tIFN0YXJ0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NjaGVkdWxlRnJvbVN0YXJ0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gU0NIRURVTEVfRlJPTV9TVEFSVF9FREVGQVVMVCA9IHRydWU7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1NjaGVkdWxlRnJvbVN0YXJ0KCkgPGVtPlNjaGVkdWxlIEZyb20gU3RhcnQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2NoZWR1bGVGcm9tU3RhcnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHNjaGVkdWxlRnJvbVN0YXJ0ID0gU0NIRURVTEVfRlJPTV9TVEFSVF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgU2NoZWR1bGUgRnJvbSBTdGFydCBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gc2NoZWR1bGVGcm9tU3RhcnRFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U3RhcnREYXRlKCkgPGVtPlN0YXJ0IERhdGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFN0YXJ0RGF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBPYmplY3QgU1RBUlRfREFURV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTdGFydERhdGUoKSA8ZW0+U3RhcnQgRGF0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U3RhcnREYXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IHN0YXJ0RGF0ZSA9IFNUQVJUX0RBVEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RmluaXNoRGF0ZSgpIDxlbT5GaW5pc2ggRGF0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RmluaXNoRGF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBPYmplY3QgRklOSVNIX0RBVEVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RmluaXNoRGF0ZSgpIDxlbT5GaW5pc2ggRGF0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RmluaXNoRGF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBmaW5pc2hEYXRlID0gRklOSVNIX0RBVEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RllTdGFydERhdGUoKSA8ZW0+RlkgU3RhcnQgRGF0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RllTdGFydERhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBGWVNUQVJUX0RBVEVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RllTdGFydERhdGUoKSA8ZW0+RlkgU3RhcnQgRGF0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RllTdGFydERhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdJbnRlZ2VyIGZZU3RhcnREYXRlID0gRllTVEFSVF9EQVRFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENyaXRpY2FsU2xhY2tMaW1pdCgpIDxlbT5Dcml0aWNhbCBTbGFjayBMaW1pdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q3JpdGljYWxTbGFja0xpbWl0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0ludGVnZXIgQ1JJVElDQUxfU0xBQ0tfTElNSVRfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q3JpdGljYWxTbGFja0xpbWl0KCkgPGVtPkNyaXRpY2FsIFNsYWNrIExpbWl0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDcml0aWNhbFNsYWNrTGltaXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdJbnRlZ2VyIGNyaXRpY2FsU2xhY2tMaW1pdCA9IENSSVRJQ0FMX1NMQUNLX0xJTUlUX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEN1cnJlbmN5RGlnaXRzKCkgPGVtPkN1cnJlbmN5IERpZ2l0czwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q3VycmVuY3lEaWdpdHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBDVVJSRU5DWV9ESUdJVFNfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q3VycmVuY3lEaWdpdHMoKSA8ZW0+Q3VycmVuY3kgRGlnaXRzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDdXJyZW5jeURpZ2l0cygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0ludGVnZXIgY3VycmVuY3lEaWdpdHMgPSBDVVJSRU5DWV9ESUdJVFNfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q3VycmVuY3lTeW1ib2woKSA8ZW0+Q3VycmVuY3kgU3ltYm9sPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDdXJyZW5jeVN5bWJvbCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1VSUkVOQ1lfU1lNQk9MX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEN1cnJlbmN5U3ltYm9sKCkgPGVtPkN1cnJlbmN5IFN5bWJvbDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q3VycmVuY3lTeW1ib2woKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgY3VycmVuY3lTeW1ib2wgPSBDVVJSRU5DWV9TWU1CT0xfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q3VycmVuY3lTeW1ib2xQb3NpdGlvbigpIDxlbT5DdXJyZW5jeSBTeW1ib2wgUG9zaXRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEN1cnJlbmN5U3ltYm9sUG9zaXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBDVVJSRU5DWV9TWU1CT0xfUE9TSVRJT05fRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q3VycmVuY3lTeW1ib2xQb3NpdGlvbigpIDxlbT5DdXJyZW5jeSBTeW1ib2wgUG9zaXRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEN1cnJlbmN5U3ltYm9sUG9zaXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdJbnRlZ2VyIGN1cnJlbmN5U3ltYm9sUG9zaXRpb24gPSBDVVJSRU5DWV9TWU1CT0xfUE9TSVRJT05fRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q2FsZW5kYXJVSUQoKSA8ZW0+Q2FsZW5kYXIgVUlEPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDYWxlbmRhclVJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdJbnRlZ2VyIENBTEVOREFSX1VJRF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDYWxlbmRhclVJRCgpIDxlbT5DYWxlbmRhciBVSUQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENhbGVuZGFyVUlEKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnSW50ZWdlciBjYWxlbmRhclVJRCA9IENBTEVOREFSX1VJRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZWZhdWx0U3RhcnRUaW1lKCkgPGVtPkRlZmF1bHQgU3RhcnQgVGltZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGVmYXVsdFN0YXJ0VGltZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBPYmplY3QgREVGQVVMVF9TVEFSVF9USU1FX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlZmF1bHRTdGFydFRpbWUoKSA8ZW0+RGVmYXVsdCBTdGFydCBUaW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREZWZhdWx0U3RhcnRUaW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGRlZmF1bHRTdGFydFRpbWUgPSBERUZBVUxUX1NUQVJUX1RJTUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVmYXVsdEZpbmlzaFRpbWUoKSA8ZW0+RGVmYXVsdCBGaW5pc2ggVGltZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGVmYXVsdEZpbmlzaFRpbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgT2JqZWN0IERFRkFVTFRfRklOSVNIX1RJTUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVmYXVsdEZpbmlzaFRpbWUoKSA8ZW0+RGVmYXVsdCBGaW5pc2ggVGltZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGVmYXVsdEZpbmlzaFRpbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZGVmYXVsdEZpbmlzaFRpbWUgPSBERUZBVUxUX0ZJTklTSF9USU1FX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1pbnV0ZXNQZXJEYXkoKSA8ZW0+TWludXRlcyBQZXIgRGF5PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRNaW51dGVzUGVyRGF5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0ludGVnZXIgTUlOVVRFU19QRVJfREFZX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1pbnV0ZXNQZXJEYXkoKSA8ZW0+TWludXRlcyBQZXIgRGF5PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRNaW51dGVzUGVyRGF5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnSW50ZWdlciBtaW51dGVzUGVyRGF5ID0gTUlOVVRFU19QRVJfREFZX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1pbnV0ZXNQZXJXZWVrKCkgPGVtPk1pbnV0ZXMgUGVyIFdlZWs8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE1pbnV0ZXNQZXJXZWVrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0ludGVnZXIgTUlOVVRFU19QRVJfV0VFS19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNaW51dGVzUGVyV2VlaygpIDxlbT5NaW51dGVzIFBlciBXZWVrPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRNaW51dGVzUGVyV2VlaygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0ludGVnZXIgbWludXRlc1BlcldlZWsgPSBNSU5VVEVTX1BFUl9XRUVLX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERheXNQZXJNb250aCgpIDxlbT5EYXlzIFBlciBNb250aDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGF5c1Blck1vbnRoKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0ludGVnZXIgREFZU19QRVJfTU9OVEhfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGF5c1Blck1vbnRoKCkgPGVtPkRheXMgUGVyIE1vbnRoPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREYXlzUGVyTW9udGgoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdJbnRlZ2VyIGRheXNQZXJNb250aCA9IERBWVNfUEVSX01PTlRIX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlZmF1bHRUYXNrVHlwZSgpIDxlbT5EZWZhdWx0IFRhc2sgVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGVmYXVsdFRhc2tUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0ludGVnZXIgREVGQVVMVF9UQVNLX1RZUEVfRURFRkFVTFQgPSBuZXcgQmlnSW50ZWdlcigiMSIpOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVmYXVsdFRhc2tUeXBlKCkgPGVtPkRlZmF1bHQgVGFzayBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREZWZhdWx0VGFza1R5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdJbnRlZ2VyIGRlZmF1bHRUYXNrVHlwZSA9IERFRkFVTFRfVEFTS19UWVBFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBEZWZhdWx0IFRhc2sgVHlwZSBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gZGVmYXVsdFRhc2tUeXBlRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlZmF1bHRGaXhlZENvc3RBY2NydWFsKCkgPGVtPkRlZmF1bHQgRml4ZWQgQ29zdCBBY2NydWFsPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREZWZhdWx0Rml4ZWRDb3N0QWNjcnVhbCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdJbnRlZ2VyIERFRkFVTFRfRklYRURfQ09TVF9BQ0NSVUFMX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlZmF1bHRGaXhlZENvc3RBY2NydWFsKCkgPGVtPkRlZmF1bHQgRml4ZWQgQ29zdCBBY2NydWFsPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREZWZhdWx0Rml4ZWRDb3N0QWNjcnVhbCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0ludGVnZXIgZGVmYXVsdEZpeGVkQ29zdEFjY3J1YWwgPSBERUZBVUxUX0ZJWEVEX0NPU1RfQUNDUlVBTF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZWZhdWx0U3RhbmRhcmRSYXRlKCkgPGVtPkRlZmF1bHQgU3RhbmRhcmQgUmF0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGVmYXVsdFN0YW5kYXJkUmF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBmbG9hdCBERUZBVUxUX1NUQU5EQVJEX1JBVEVfRURFRkFVTFQgPSAwLjBGOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVmYXVsdFN0YW5kYXJkUmF0ZSgpIDxlbT5EZWZhdWx0IFN0YW5kYXJkIFJhdGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERlZmF1bHRTdGFuZGFyZFJhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBmbG9hdCBkZWZhdWx0U3RhbmRhcmRSYXRlID0gREVGQVVMVF9TVEFOREFSRF9SQVRFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBEZWZhdWx0IFN0YW5kYXJkIFJhdGUgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGRlZmF1bHRTdGFuZGFyZFJhdGVFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVmYXVsdE92ZXJ0aW1lUmF0ZSgpIDxlbT5EZWZhdWx0IE92ZXJ0aW1lIFJhdGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERlZmF1bHRPdmVydGltZVJhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgZmxvYXQgREVGQVVMVF9PVkVSVElNRV9SQVRFX0VERUZBVUxUID0gMC4wRjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlZmF1bHRPdmVydGltZVJhdGUoKSA8ZW0+RGVmYXVsdCBPdmVydGltZSBSYXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREZWZhdWx0T3ZlcnRpbWVSYXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgZmxvYXQgZGVmYXVsdE92ZXJ0aW1lUmF0ZSA9IERFRkFVTFRfT1ZFUlRJTUVfUkFURV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgRGVmYXVsdCBPdmVydGltZSBSYXRlIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBkZWZhdWx0T3ZlcnRpbWVSYXRlRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldER1cmF0aW9uRm9ybWF0KCkgPGVtPkR1cmF0aW9uIEZvcm1hdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RHVyYXRpb25Gb3JtYXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBEVVJBVElPTl9GT1JNQVRfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RHVyYXRpb25Gb3JtYXQoKSA8ZW0+RHVyYXRpb24gRm9ybWF0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREdXJhdGlvbkZvcm1hdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0ludGVnZXIgZHVyYXRpb25Gb3JtYXQgPSBEVVJBVElPTl9GT1JNQVRfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0V29ya0Zvcm1hdCgpIDxlbT5Xb3JrIEZvcm1hdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0V29ya0Zvcm1hdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdJbnRlZ2VyIFdPUktfRk9STUFUX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFdvcmtGb3JtYXQoKSA8ZW0+V29yayBGb3JtYXQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFdvcmtGb3JtYXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdJbnRlZ2VyIHdvcmtGb3JtYXQgPSBXT1JLX0ZPUk1BVF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0VkaXRhYmxlQWN0dWFsQ29zdHMoKSA8ZW0+RWRpdGFibGUgQWN0dWFsIENvc3RzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0VkaXRhYmxlQWN0dWFsQ29zdHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBFRElUQUJMRV9BQ1RVQUxfQ09TVFNfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzRWRpdGFibGVBY3R1YWxDb3N0cygpIDxlbT5FZGl0YWJsZSBBY3R1YWwgQ29zdHM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzRWRpdGFibGVBY3R1YWxDb3N0cygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gZWRpdGFibGVBY3R1YWxDb3N0cyA9IEVESVRBQkxFX0FDVFVBTF9DT1NUU19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgRWRpdGFibGUgQWN0dWFsIENvc3RzIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBlZGl0YWJsZUFjdHVhbENvc3RzRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzSG9ub3JDb25zdHJhaW50cygpIDxlbT5Ib25vciBDb25zdHJhaW50czwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNIb25vckNvbnN0cmFpbnRzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gSE9OT1JfQ09OU1RSQUlOVFNfRURFRkFVTFQgPSB0cnVlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNIb25vckNvbnN0cmFpbnRzKCkgPGVtPkhvbm9yIENvbnN0cmFpbnRzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0hvbm9yQ29uc3RyYWludHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGhvbm9yQ29uc3RyYWludHMgPSBIT05PUl9DT05TVFJBSU5UU19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgSG9ub3IgQ29uc3RyYWludHMgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGhvbm9yQ29uc3RyYWludHNFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RWFybmVkVmFsdWVNZXRob2QoKSA8ZW0+RWFybmVkIFZhbHVlIE1ldGhvZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RWFybmVkVmFsdWVNZXRob2QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBFQVJORURfVkFMVUVfTUVUSE9EX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEVhcm5lZFZhbHVlTWV0aG9kKCkgPGVtPkVhcm5lZCBWYWx1ZSBNZXRob2Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEVhcm5lZFZhbHVlTWV0aG9kKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnSW50ZWdlciBlYXJuZWRWYWx1ZU1ldGhvZCA9IEVBUk5FRF9WQUxVRV9NRVRIT0RfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNJbnNlcnRlZFByb2plY3RzTGlrZVN1bW1hcnkoKSA8ZW0+SW5zZXJ0ZWQgUHJvamVjdHMgTGlrZSBTdW1tYXJ5PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0luc2VydGVkUHJvamVjdHNMaWtlU3VtbWFyeSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIElOU0VSVEVEX1BST0pFQ1RTX0xJS0VfU1VNTUFSWV9FREVGQVVMVCA9IHRydWU7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0luc2VydGVkUHJvamVjdHNMaWtlU3VtbWFyeSgpIDxlbT5JbnNlcnRlZCBQcm9qZWN0cyBMaWtlIFN1bW1hcnk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzSW5zZXJ0ZWRQcm9qZWN0c0xpa2VTdW1tYXJ5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpbnNlcnRlZFByb2plY3RzTGlrZVN1bW1hcnkgPSBJTlNFUlRFRF9QUk9KRUNUU19MSUtFX1NVTU1BUllfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIEluc2VydGVkIFByb2plY3RzIExpa2UgU3VtbWFyeSBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaW5zZXJ0ZWRQcm9qZWN0c0xpa2VTdW1tYXJ5RVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzTXVsdGlwbGVDcml0aWNhbFBhdGhzKCkgPGVtPk11bHRpcGxlIENyaXRpY2FsIFBhdGhzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc011bHRpcGxlQ3JpdGljYWxQYXRocygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIE1VTFRJUExFX0NSSVRJQ0FMX1BBVEhTX0VERUZBVUxUID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc011bHRpcGxlQ3JpdGljYWxQYXRocygpIDxlbT5NdWx0aXBsZSBDcml0aWNhbCBQYXRoczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNNdWx0aXBsZUNyaXRpY2FsUGF0aHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIG11bHRpcGxlQ3JpdGljYWxQYXRocyA9IE1VTFRJUExFX0NSSVRJQ0FMX1BBVEhTX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBNdWx0aXBsZSBDcml0aWNhbCBQYXRocyBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gbXVsdGlwbGVDcml0aWNhbFBhdGhzRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzTmV3VGFza3NFZmZvcnREcml2ZW4oKSA8ZW0+TmV3IFRhc2tzIEVmZm9ydCBEcml2ZW48L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzTmV3VGFza3NFZmZvcnREcml2ZW4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBORVdfVEFTS1NfRUZGT1JUX0RSSVZFTl9FREVGQVVMVCA9IHRydWU7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc05ld1Rhc2tzRWZmb3J0RHJpdmVuKCkgPGVtPk5ldyBUYXNrcyBFZmZvcnQgRHJpdmVuPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc05ld1Rhc2tzRWZmb3J0RHJpdmVuKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBuZXdUYXNrc0VmZm9ydERyaXZlbiA9IE5FV19UQVNLU19FRkZPUlRfRFJJVkVOX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBOZXcgVGFza3MgRWZmb3J0IERyaXZlbiBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gbmV3VGFza3NFZmZvcnREcml2ZW5FU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNOZXdUYXNrc0VzdGltYXRlZCgpIDxlbT5OZXcgVGFza3MgRXN0aW1hdGVkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc05ld1Rhc2tzRXN0aW1hdGVkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gTkVXX1RBU0tTX0VTVElNQVRFRF9FREVGQVVMVCA9IHRydWU7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc05ld1Rhc2tzRXN0aW1hdGVkKCkgPGVtPk5ldyBUYXNrcyBFc3RpbWF0ZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzTmV3VGFza3NFc3RpbWF0ZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIG5ld1Rhc2tzRXN0aW1hdGVkID0gTkVXX1RBU0tTX0VTVElNQVRFRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgTmV3IFRhc2tzIEVzdGltYXRlZCBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gbmV3VGFza3NFc3RpbWF0ZWRFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNTcGxpdHNJblByb2dyZXNzVGFza3MoKSA8ZW0+U3BsaXRzIEluIFByb2dyZXNzIFRhc2tzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NwbGl0c0luUHJvZ3Jlc3NUYXNrcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIFNQTElUU19JTl9QUk9HUkVTU19UQVNLU19FREVGQVVMVCA9IHRydWU7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1NwbGl0c0luUHJvZ3Jlc3NUYXNrcygpIDxlbT5TcGxpdHMgSW4gUHJvZ3Jlc3MgVGFza3M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU3BsaXRzSW5Qcm9ncmVzc1Rhc2tzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBzcGxpdHNJblByb2dyZXNzVGFza3MgPSBTUExJVFNfSU5fUFJPR1JFU1NfVEFTS1NfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIFNwbGl0cyBJbiBQcm9ncmVzcyBUYXNrcyBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gc3BsaXRzSW5Qcm9ncmVzc1Rhc2tzRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzU3ByZWFkQWN0dWFsQ29zdCgpIDxlbT5TcHJlYWQgQWN0dWFsIENvc3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU3ByZWFkQWN0dWFsQ29zdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIFNQUkVBRF9BQ1RVQUxfQ09TVF9FREVGQVVMVCA9IHRydWU7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1NwcmVhZEFjdHVhbENvc3QoKSA8ZW0+U3ByZWFkIEFjdHVhbCBDb3N0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NwcmVhZEFjdHVhbENvc3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHNwcmVhZEFjdHVhbENvc3QgPSBTUFJFQURfQUNUVUFMX0NPU1RfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIFNwcmVhZCBBY3R1YWwgQ29zdCBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gc3ByZWFkQWN0dWFsQ29zdEVTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1NwcmVhZFBlcmNlbnRDb21wbGV0ZSgpIDxlbT5TcHJlYWQgUGVyY2VudCBDb21wbGV0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTcHJlYWRQZXJjZW50Q29tcGxldGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBTUFJFQURfUEVSQ0VOVF9DT01QTEVURV9FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNTcHJlYWRQZXJjZW50Q29tcGxldGUoKSA8ZW0+U3ByZWFkIFBlcmNlbnQgQ29tcGxldGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU3ByZWFkUGVyY2VudENvbXBsZXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBzcHJlYWRQZXJjZW50Q29tcGxldGUgPSBTUFJFQURfUEVSQ0VOVF9DT01QTEVURV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgU3ByZWFkIFBlcmNlbnQgQ29tcGxldGUgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHNwcmVhZFBlcmNlbnRDb21wbGV0ZUVTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1Rhc2tVcGRhdGVzUmVzb3VyY2UoKSA8ZW0+VGFzayBVcGRhdGVzIFJlc291cmNlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1Rhc2tVcGRhdGVzUmVzb3VyY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBUQVNLX1VQREFURVNfUkVTT1VSQ0VfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzVGFza1VwZGF0ZXNSZXNvdXJjZSgpIDxlbT5UYXNrIFVwZGF0ZXMgUmVzb3VyY2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzVGFza1VwZGF0ZXNSZXNvdXJjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gdGFza1VwZGF0ZXNSZXNvdXJjZSA9IFRBU0tfVVBEQVRFU19SRVNPVVJDRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgVGFzayBVcGRhdGVzIFJlc291cmNlIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiB0YXNrVXBkYXRlc1Jlc291cmNlRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzRmlzY2FsWWVhclN0YXJ0KCkgPGVtPkZpc2NhbCBZZWFyIFN0YXJ0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0Zpc2NhbFllYXJTdGFydCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIEZJU0NBTF9ZRUFSX1NUQVJUX0VERUZBVUxUID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0Zpc2NhbFllYXJTdGFydCgpIDxlbT5GaXNjYWwgWWVhciBTdGFydDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNGaXNjYWxZZWFyU3RhcnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGZpc2NhbFllYXJTdGFydCA9IEZJU0NBTF9ZRUFSX1NUQVJUX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBGaXNjYWwgWWVhciBTdGFydCBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gZmlzY2FsWWVhclN0YXJ0RVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFdlZWtTdGFydERheSgpIDxlbT5XZWVrIFN0YXJ0IERheTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0V2Vla1N0YXJ0RGF5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0ludGVnZXIgV0VFS19TVEFSVF9EQVlfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0V2Vla1N0YXJ0RGF5KCkgPGVtPldlZWsgU3RhcnQgRGF5PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRXZWVrU3RhcnREYXkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdJbnRlZ2VyIHdlZWtTdGFydERheSA9IFdFRUtfU1RBUlRfREFZX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzTW92ZUNvbXBsZXRlZEVuZHNCYWNrKCkgPGVtPk1vdmUgQ29tcGxldGVkIEVuZHMgQmFjazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNNb3ZlQ29tcGxldGVkRW5kc0JhY2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBNT1ZFX0NPTVBMRVRFRF9FTkRTX0JBQ0tfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzTW92ZUNvbXBsZXRlZEVuZHNCYWNrKCkgPGVtPk1vdmUgQ29tcGxldGVkIEVuZHMgQmFjazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNNb3ZlQ29tcGxldGVkRW5kc0JhY2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIG1vdmVDb21wbGV0ZWRFbmRzQmFjayA9IE1PVkVfQ09NUExFVEVEX0VORFNfQkFDS19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgTW92ZSBDb21wbGV0ZWQgRW5kcyBCYWNrIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBtb3ZlQ29tcGxldGVkRW5kc0JhY2tFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNNb3ZlUmVtYWluaW5nU3RhcnRzQmFjaygpIDxlbT5Nb3ZlIFJlbWFpbmluZyBTdGFydHMgQmFjazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNNb3ZlUmVtYWluaW5nU3RhcnRzQmFjaygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIE1PVkVfUkVNQUlOSU5HX1NUQVJUU19CQUNLX0VERUZBVUxUID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc01vdmVSZW1haW5pbmdTdGFydHNCYWNrKCkgPGVtPk1vdmUgUmVtYWluaW5nIFN0YXJ0cyBCYWNrPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc01vdmVSZW1haW5pbmdTdGFydHNCYWNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBtb3ZlUmVtYWluaW5nU3RhcnRzQmFjayA9IE1PVkVfUkVNQUlOSU5HX1NUQVJUU19CQUNLX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBNb3ZlIFJlbWFpbmluZyBTdGFydHMgQmFjayBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gbW92ZVJlbWFpbmluZ1N0YXJ0c0JhY2tFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNNb3ZlUmVtYWluaW5nU3RhcnRzRm9yd2FyZCgpIDxlbT5Nb3ZlIFJlbWFpbmluZyBTdGFydHMgRm9yd2FyZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNNb3ZlUmVtYWluaW5nU3RhcnRzRm9yd2FyZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIE1PVkVfUkVNQUlOSU5HX1NUQVJUU19GT1JXQVJEX0VERUZBVUxUID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc01vdmVSZW1haW5pbmdTdGFydHNGb3J3YXJkKCkgPGVtPk1vdmUgUmVtYWluaW5nIFN0YXJ0cyBGb3J3YXJkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc01vdmVSZW1haW5pbmdTdGFydHNGb3J3YXJkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBtb3ZlUmVtYWluaW5nU3RhcnRzRm9yd2FyZCA9IE1PVkVfUkVNQUlOSU5HX1NUQVJUU19GT1JXQVJEX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBNb3ZlIFJlbWFpbmluZyBTdGFydHMgRm9yd2FyZCBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gbW92ZVJlbWFpbmluZ1N0YXJ0c0ZvcndhcmRFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNNb3ZlQ29tcGxldGVkRW5kc0ZvcndhcmQoKSA8ZW0+TW92ZSBDb21wbGV0ZWQgRW5kcyBGb3J3YXJkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc01vdmVDb21wbGV0ZWRFbmRzRm9yd2FyZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIE1PVkVfQ09NUExFVEVEX0VORFNfRk9SV0FSRF9FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNNb3ZlQ29tcGxldGVkRW5kc0ZvcndhcmQoKSA8ZW0+TW92ZSBDb21wbGV0ZWQgRW5kcyBGb3J3YXJkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc01vdmVDb21wbGV0ZWRFbmRzRm9yd2FyZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gbW92ZUNvbXBsZXRlZEVuZHNGb3J3YXJkID0gTU9WRV9DT01QTEVURURfRU5EU19GT1JXQVJEX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBNb3ZlIENvbXBsZXRlZCBFbmRzIEZvcndhcmQgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIG1vdmVDb21wbGV0ZWRFbmRzRm9yd2FyZEVTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRCYXNlbGluZUZvckVhcm5lZFZhbHVlKCkgPGVtPkJhc2VsaW5lIEZvciBFYXJuZWQgVmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEJhc2VsaW5lRm9yRWFybmVkVmFsdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBCQVNFTElORV9GT1JfRUFSTkVEX1ZBTFVFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEJhc2VsaW5lRm9yRWFybmVkVmFsdWUoKSA8ZW0+QmFzZWxpbmUgRm9yIEVhcm5lZCBWYWx1ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QmFzZWxpbmVGb3JFYXJuZWRWYWx1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0ludGVnZXIgYmFzZWxpbmVGb3JFYXJuZWRWYWx1ZSA9IEJBU0VMSU5FX0ZPUl9FQVJORURfVkFMVUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNBdXRvQWRkTmV3UmVzb3VyY2VzQW5kVGFza3MoKSA8ZW0+QXV0byBBZGQgTmV3IFJlc291cmNlcyBBbmQgVGFza3M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzQXV0b0FkZE5ld1Jlc291cmNlc0FuZFRhc2tzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gQVVUT19BRERfTkVXX1JFU09VUkNFU19BTkRfVEFTS1NfRURFRkFVTFQgPSB0cnVlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNBdXRvQWRkTmV3UmVzb3VyY2VzQW5kVGFza3MoKSA8ZW0+QXV0byBBZGQgTmV3IFJlc291cmNlcyBBbmQgVGFza3M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzQXV0b0FkZE5ld1Jlc291cmNlc0FuZFRhc2tzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBhdXRvQWRkTmV3UmVzb3VyY2VzQW5kVGFza3MgPSBBVVRPX0FERF9ORVdfUkVTT1VSQ0VTX0FORF9UQVNLU19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgQXV0byBBZGQgTmV3IFJlc291cmNlcyBBbmQgVGFza3MgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGF1dG9BZGROZXdSZXNvdXJjZXNBbmRUYXNrc0VTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTdGF0dXNEYXRlKCkgPGVtPlN0YXR1cyBEYXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTdGF0dXNEYXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIE9iamVjdCBTVEFUVVNfREFURV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTdGF0dXNEYXRlKCkgPGVtPlN0YXR1cyBEYXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTdGF0dXNEYXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IHN0YXR1c0RhdGUgPSBTVEFUVVNfREFURV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDdXJyZW50RGF0ZSgpIDxlbT5DdXJyZW50IERhdGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEN1cnJlbnREYXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIE9iamVjdCBDVVJSRU5UX0RBVEVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q3VycmVudERhdGUoKSA8ZW0+Q3VycmVudCBEYXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDdXJyZW50RGF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBjdXJyZW50RGF0ZSA9IENVUlJFTlRfREFURV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc01pY3Jvc29mdFByb2plY3RTZXJ2ZXJVUkwoKSA8ZW0+TWljcm9zb2Z0IFByb2plY3QgU2VydmVyIFVSTDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNNaWNyb3NvZnRQcm9qZWN0U2VydmVyVVJMKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gTUlDUk9TT0ZUX1BST0pFQ1RfU0VSVkVSX1VSTF9FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNNaWNyb3NvZnRQcm9qZWN0U2VydmVyVVJMKCkgPGVtPk1pY3Jvc29mdCBQcm9qZWN0IFNlcnZlciBVUkw8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzTWljcm9zb2Z0UHJvamVjdFNlcnZlclVSTCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gbWljcm9zb2Z0UHJvamVjdFNlcnZlclVSTCA9IE1JQ1JPU09GVF9QUk9KRUNUX1NFUlZFUl9VUkxfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIE1pY3Jvc29mdCBQcm9qZWN0IFNlcnZlciBVUkwgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIG1pY3Jvc29mdFByb2plY3RTZXJ2ZXJVUkxFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNBdXRvbGluaygpIDxlbT5BdXRvbGluazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNBdXRvbGluaygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIEFVVE9MSU5LX0VERUZBVUxUID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0F1dG9saW5rKCkgPGVtPkF1dG9saW5rPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0F1dG9saW5rKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBhdXRvbGluayA9IEFVVE9MSU5LX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBBdXRvbGluayBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gYXV0b2xpbmtFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmV3VGFza1N0YXJ0RGF0ZSgpIDxlbT5OZXcgVGFzayBTdGFydCBEYXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROZXdUYXNrU3RhcnREYXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0ludGVnZXIgTkVXX1RBU0tfU1RBUlRfREFURV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROZXdUYXNrU3RhcnREYXRlKCkgPGVtPk5ldyBUYXNrIFN0YXJ0IERhdGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE5ld1Rhc2tTdGFydERhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdJbnRlZ2VyIG5ld1Rhc2tTdGFydERhdGUgPSBORVdfVEFTS19TVEFSVF9EQVRFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlZmF1bHRUYXNrRVZNZXRob2QoKSA8ZW0+RGVmYXVsdCBUYXNrIEVWIE1ldGhvZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGVmYXVsdFRhc2tFVk1ldGhvZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdJbnRlZ2VyIERFRkFVTFRfVEFTS19FVl9NRVRIT0RfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVmYXVsdFRhc2tFVk1ldGhvZCgpIDxlbT5EZWZhdWx0IFRhc2sgRVYgTWV0aG9kPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREZWZhdWx0VGFza0VWTWV0aG9kKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnSW50ZWdlciBkZWZhdWx0VGFza0VWTWV0aG9kID0gREVGQVVMVF9UQVNLX0VWX01FVEhPRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1Byb2plY3RFeHRlcm5hbGx5RWRpdGVkKCkgPGVtPlByb2plY3QgRXh0ZXJuYWxseSBFZGl0ZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzUHJvamVjdEV4dGVybmFsbHlFZGl0ZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBQUk9KRUNUX0VYVEVSTkFMTFlfRURJVEVEX0VERUZBVUxUID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1Byb2plY3RFeHRlcm5hbGx5RWRpdGVkKCkgPGVtPlByb2plY3QgRXh0ZXJuYWxseSBFZGl0ZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzUHJvamVjdEV4dGVybmFsbHlFZGl0ZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHByb2plY3RFeHRlcm5hbGx5RWRpdGVkID0gUFJPSkVDVF9FWFRFUk5BTExZX0VESVRFRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgUHJvamVjdCBFeHRlcm5hbGx5IEVkaXRlZCBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gcHJvamVjdEV4dGVybmFsbHlFZGl0ZWRFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RXh0ZW5kZWRDcmVhdGlvbkRhdGUoKSA8ZW0+RXh0ZW5kZWQgQ3JlYXRpb24gRGF0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RXh0ZW5kZWRDcmVhdGlvbkRhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgT2JqZWN0IEVYVEVOREVEX0NSRUFUSU9OX0RBVEVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RXh0ZW5kZWRDcmVhdGlvbkRhdGUoKSA8ZW0+RXh0ZW5kZWQgQ3JlYXRpb24gRGF0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RXh0ZW5kZWRDcmVhdGlvbkRhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZXh0ZW5kZWRDcmVhdGlvbkRhdGUgPSBFWFRFTkRFRF9DUkVBVElPTl9EQVRFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzQWN0dWFsc0luU3luYygpIDxlbT5BY3R1YWxzIEluIFN5bmM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzQWN0dWFsc0luU3luYygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIEFDVFVBTFNfSU5fU1lOQ19FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNBY3R1YWxzSW5TeW5jKCkgPGVtPkFjdHVhbHMgSW4gU3luYzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNBY3R1YWxzSW5TeW5jKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBhY3R1YWxzSW5TeW5jID0gQUNUVUFMU19JTl9TWU5DX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBBY3R1YWxzIEluIFN5bmMgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGFjdHVhbHNJblN5bmNFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNSZW1vdmVGaWxlUHJvcGVydGllcygpIDxlbT5SZW1vdmUgRmlsZSBQcm9wZXJ0aWVzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1JlbW92ZUZpbGVQcm9wZXJ0aWVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gUkVNT1ZFX0ZJTEVfUFJPUEVSVElFU19FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNSZW1vdmVGaWxlUHJvcGVydGllcygpIDxlbT5SZW1vdmUgRmlsZSBQcm9wZXJ0aWVzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1JlbW92ZUZpbGVQcm9wZXJ0aWVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiByZW1vdmVGaWxlUHJvcGVydGllcyA9IFJFTU9WRV9GSUxFX1BST1BFUlRJRVNfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIFJlbW92ZSBGaWxlIFByb3BlcnRpZXMgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHJlbW92ZUZpbGVQcm9wZXJ0aWVzRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzQWRtaW5Qcm9qZWN0KCkgPGVtPkFkbWluIFByb2plY3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzQWRtaW5Qcm9qZWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gQURNSU5fUFJPSkVDVF9FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNBZG1pblByb2plY3QoKSA8ZW0+QWRtaW4gUHJvamVjdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNBZG1pblByb2plY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGFkbWluUHJvamVjdCA9IEFETUlOX1BST0pFQ1RfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIEFkbWluIFByb2plY3QgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGFkbWluUHJvamVjdEVTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE91dGxpbmVDb2RlcygpIDxlbT5PdXRsaW5lIENvZGVzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRPdXRsaW5lQ29kZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBPdXRsaW5lQ29kZXMgb3V0bGluZUNvZGVzID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFdCU01hc2tzKCkgPGVtPldCUyBNYXNrczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0V0JTTWFza3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBXQlNNYXNrcyB3QlNNYXNrcyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFeHRlbmRlZEF0dHJpYnV0ZXMoKSA8ZW0+RXh0ZW5kZWQgQXR0cmlidXRlczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RXh0ZW5kZWRBdHRyaWJ1dGVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRXh0ZW5kZWRBdHRyaWJ1dGVzIGV4dGVuZGVkQXR0cmlidXRlcyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDYWxlbmRhcnMoKSA8ZW0+Q2FsZW5kYXJzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDYWxlbmRhcnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBDYWxlbmRhcnMgY2FsZW5kYXJzID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFRhc2tzKCkgPGVtPlRhc2tzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUYXNrcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFRhc2tzIHRhc2tzID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlc291cmNlcygpIDxlbT5SZXNvdXJjZXM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJlc291cmNlcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFJlc291cmNlcyByZXNvdXJjZXMgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QXNzaWdubWVudHMoKSA8ZW0+QXNzaWdubWVudHM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFzc2lnbm1lbnRzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQXNzaWdubWVudHMgYXNzaWdubWVudHMgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFByb2plY3RJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0UHJvamVjdCgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VUlEKCkgewotCQlyZXR1cm4gdUlEOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFVJRChTdHJpbmcgbmV3VUlEKSB7Ci0JCVN0cmluZyBvbGRVSUQgPSB1SUQ7Ci0JCXVJRCA9IG5ld1VJRDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19VSUQsIG9sZFVJRCwgdUlEKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuZXdOYW1lKSB7Ci0JCVN0cmluZyBvbGROYW1lID0gbmFtZTsKLQkJbmFtZSA9IG5ld05hbWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fTkFNRSwgb2xkTmFtZSwgbmFtZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGl0bGUoKSB7Ci0JCXJldHVybiB0aXRsZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUaXRsZShTdHJpbmcgbmV3VGl0bGUpIHsKLQkJU3RyaW5nIG9sZFRpdGxlID0gdGl0bGU7Ci0JCXRpdGxlID0gbmV3VGl0bGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fVElUTEUsIG9sZFRpdGxlLCB0aXRsZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U3ViamVjdCgpIHsKLQkJcmV0dXJuIHN1YmplY3Q7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0U3ViamVjdChTdHJpbmcgbmV3U3ViamVjdCkgewotCQlTdHJpbmcgb2xkU3ViamVjdCA9IHN1YmplY3Q7Ci0JCXN1YmplY3QgPSBuZXdTdWJqZWN0OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX1NVQkpFQ1QsIG9sZFN1YmplY3QsIHN1YmplY3QpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENhdGVnb3J5KCkgewotCQlyZXR1cm4gY2F0ZWdvcnk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q2F0ZWdvcnkoU3RyaW5nIG5ld0NhdGVnb3J5KSB7Ci0JCVN0cmluZyBvbGRDYXRlZ29yeSA9IGNhdGVnb3J5OwotCQljYXRlZ29yeSA9IG5ld0NhdGVnb3J5OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0NBVEVHT1JZLCBvbGRDYXRlZ29yeSwgY2F0ZWdvcnkpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENvbXBhbnkoKSB7Ci0JCXJldHVybiBjb21wYW55OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvbXBhbnkoU3RyaW5nIG5ld0NvbXBhbnkpIHsKLQkJU3RyaW5nIG9sZENvbXBhbnkgPSBjb21wYW55OwotCQljb21wYW55ID0gbmV3Q29tcGFueTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19DT01QQU5ZLCBvbGRDb21wYW55LCBjb21wYW55KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRNYW5hZ2VyKCkgewotCQlyZXR1cm4gbWFuYWdlcjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNYW5hZ2VyKFN0cmluZyBuZXdNYW5hZ2VyKSB7Ci0JCVN0cmluZyBvbGRNYW5hZ2VyID0gbWFuYWdlcjsKLQkJbWFuYWdlciA9IG5ld01hbmFnZXI7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fTUFOQUdFUiwgb2xkTWFuYWdlciwgbWFuYWdlcikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0QXV0aG9yKCkgewotCQlyZXR1cm4gYXV0aG9yOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEF1dGhvcihTdHJpbmcgbmV3QXV0aG9yKSB7Ci0JCVN0cmluZyBvbGRBdXRob3IgPSBhdXRob3I7Ci0JCWF1dGhvciA9IG5ld0F1dGhvcjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19BVVRIT1IsIG9sZEF1dGhvciwgYXV0aG9yKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRDcmVhdGlvbkRhdGUoKSB7Ci0JCXJldHVybiBjcmVhdGlvbkRhdGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q3JlYXRpb25EYXRlKE9iamVjdCBuZXdDcmVhdGlvbkRhdGUpIHsKLQkJT2JqZWN0IG9sZENyZWF0aW9uRGF0ZSA9IGNyZWF0aW9uRGF0ZTsKLQkJY3JlYXRpb25EYXRlID0gbmV3Q3JlYXRpb25EYXRlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0NSRUFUSU9OX0RBVEUsIG9sZENyZWF0aW9uRGF0ZSwgY3JlYXRpb25EYXRlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0UmV2aXNpb24oKSB7Ci0JCXJldHVybiByZXZpc2lvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZXZpc2lvbihCaWdJbnRlZ2VyIG5ld1JldmlzaW9uKSB7Ci0JCUJpZ0ludGVnZXIgb2xkUmV2aXNpb24gPSByZXZpc2lvbjsKLQkJcmV2aXNpb24gPSBuZXdSZXZpc2lvbjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19SRVZJU0lPTiwgb2xkUmV2aXNpb24sIHJldmlzaW9uKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRMYXN0U2F2ZWQoKSB7Ci0JCXJldHVybiBsYXN0U2F2ZWQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGFzdFNhdmVkKE9iamVjdCBuZXdMYXN0U2F2ZWQpIHsKLQkJT2JqZWN0IG9sZExhc3RTYXZlZCA9IGxhc3RTYXZlZDsKLQkJbGFzdFNhdmVkID0gbmV3TGFzdFNhdmVkOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0xBU1RfU0FWRUQsIG9sZExhc3RTYXZlZCwgbGFzdFNhdmVkKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTY2hlZHVsZUZyb21TdGFydCgpIHsKLQkJcmV0dXJuIHNjaGVkdWxlRnJvbVN0YXJ0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNjaGVkdWxlRnJvbVN0YXJ0KGJvb2xlYW4gbmV3U2NoZWR1bGVGcm9tU3RhcnQpIHsKLQkJYm9vbGVhbiBvbGRTY2hlZHVsZUZyb21TdGFydCA9IHNjaGVkdWxlRnJvbVN0YXJ0OwotCQlzY2hlZHVsZUZyb21TdGFydCA9IG5ld1NjaGVkdWxlRnJvbVN0YXJ0OwotCQlib29sZWFuIG9sZFNjaGVkdWxlRnJvbVN0YXJ0RVNldCA9IHNjaGVkdWxlRnJvbVN0YXJ0RVNldDsKLQkJc2NoZWR1bGVGcm9tU3RhcnRFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19TQ0hFRFVMRV9GUk9NX1NUQVJULCBvbGRTY2hlZHVsZUZyb21TdGFydCwgc2NoZWR1bGVGcm9tU3RhcnQsICFvbGRTY2hlZHVsZUZyb21TdGFydEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldFNjaGVkdWxlRnJvbVN0YXJ0KCkgewotCQlib29sZWFuIG9sZFNjaGVkdWxlRnJvbVN0YXJ0ID0gc2NoZWR1bGVGcm9tU3RhcnQ7Ci0JCWJvb2xlYW4gb2xkU2NoZWR1bGVGcm9tU3RhcnRFU2V0ID0gc2NoZWR1bGVGcm9tU3RhcnRFU2V0OwotCQlzY2hlZHVsZUZyb21TdGFydCA9IFNDSEVEVUxFX0ZST01fU1RBUlRfRURFRkFVTFQ7Ci0JCXNjaGVkdWxlRnJvbVN0YXJ0RVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fU0NIRURVTEVfRlJPTV9TVEFSVCwgb2xkU2NoZWR1bGVGcm9tU3RhcnQsIFNDSEVEVUxFX0ZST01fU1RBUlRfRURFRkFVTFQsIG9sZFNjaGVkdWxlRnJvbVN0YXJ0RVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0U2NoZWR1bGVGcm9tU3RhcnQoKSB7Ci0JCXJldHVybiBzY2hlZHVsZUZyb21TdGFydEVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRTdGFydERhdGUoKSB7Ci0JCXJldHVybiBzdGFydERhdGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0U3RhcnREYXRlKE9iamVjdCBuZXdTdGFydERhdGUpIHsKLQkJT2JqZWN0IG9sZFN0YXJ0RGF0ZSA9IHN0YXJ0RGF0ZTsKLQkJc3RhcnREYXRlID0gbmV3U3RhcnREYXRlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX1NUQVJUX0RBVEUsIG9sZFN0YXJ0RGF0ZSwgc3RhcnREYXRlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRGaW5pc2hEYXRlKCkgewotCQlyZXR1cm4gZmluaXNoRGF0ZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGaW5pc2hEYXRlKE9iamVjdCBuZXdGaW5pc2hEYXRlKSB7Ci0JCU9iamVjdCBvbGRGaW5pc2hEYXRlID0gZmluaXNoRGF0ZTsKLQkJZmluaXNoRGF0ZSA9IG5ld0ZpbmlzaERhdGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fRklOSVNIX0RBVEUsIG9sZEZpbmlzaERhdGUsIGZpbmlzaERhdGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBnZXRGWVN0YXJ0RGF0ZSgpIHsKLQkJcmV0dXJuIGZZU3RhcnREYXRlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZZU3RhcnREYXRlKEJpZ0ludGVnZXIgbmV3RllTdGFydERhdGUpIHsKLQkJQmlnSW50ZWdlciBvbGRGWVN0YXJ0RGF0ZSA9IGZZU3RhcnREYXRlOwotCQlmWVN0YXJ0RGF0ZSA9IG5ld0ZZU3RhcnREYXRlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0ZZU1RBUlRfREFURSwgb2xkRllTdGFydERhdGUsIGZZU3RhcnREYXRlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0Q3JpdGljYWxTbGFja0xpbWl0KCkgewotCQlyZXR1cm4gY3JpdGljYWxTbGFja0xpbWl0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENyaXRpY2FsU2xhY2tMaW1pdChCaWdJbnRlZ2VyIG5ld0NyaXRpY2FsU2xhY2tMaW1pdCkgewotCQlCaWdJbnRlZ2VyIG9sZENyaXRpY2FsU2xhY2tMaW1pdCA9IGNyaXRpY2FsU2xhY2tMaW1pdDsKLQkJY3JpdGljYWxTbGFja0xpbWl0ID0gbmV3Q3JpdGljYWxTbGFja0xpbWl0OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0NSSVRJQ0FMX1NMQUNLX0xJTUlULCBvbGRDcml0aWNhbFNsYWNrTGltaXQsIGNyaXRpY2FsU2xhY2tMaW1pdCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGdldEN1cnJlbmN5RGlnaXRzKCkgewotCQlyZXR1cm4gY3VycmVuY3lEaWdpdHM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q3VycmVuY3lEaWdpdHMoQmlnSW50ZWdlciBuZXdDdXJyZW5jeURpZ2l0cykgewotCQlCaWdJbnRlZ2VyIG9sZEN1cnJlbmN5RGlnaXRzID0gY3VycmVuY3lEaWdpdHM7Ci0JCWN1cnJlbmN5RGlnaXRzID0gbmV3Q3VycmVuY3lEaWdpdHM7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fQ1VSUkVOQ1lfRElHSVRTLCBvbGRDdXJyZW5jeURpZ2l0cywgY3VycmVuY3lEaWdpdHMpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEN1cnJlbmN5U3ltYm9sKCkgewotCQlyZXR1cm4gY3VycmVuY3lTeW1ib2w7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q3VycmVuY3lTeW1ib2woU3RyaW5nIG5ld0N1cnJlbmN5U3ltYm9sKSB7Ci0JCVN0cmluZyBvbGRDdXJyZW5jeVN5bWJvbCA9IGN1cnJlbmN5U3ltYm9sOwotCQljdXJyZW5jeVN5bWJvbCA9IG5ld0N1cnJlbmN5U3ltYm9sOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0NVUlJFTkNZX1NZTUJPTCwgb2xkQ3VycmVuY3lTeW1ib2wsIGN1cnJlbmN5U3ltYm9sKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0Q3VycmVuY3lTeW1ib2xQb3NpdGlvbigpIHsKLQkJcmV0dXJuIGN1cnJlbmN5U3ltYm9sUG9zaXRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q3VycmVuY3lTeW1ib2xQb3NpdGlvbihCaWdJbnRlZ2VyIG5ld0N1cnJlbmN5U3ltYm9sUG9zaXRpb24pIHsKLQkJQmlnSW50ZWdlciBvbGRDdXJyZW5jeVN5bWJvbFBvc2l0aW9uID0gY3VycmVuY3lTeW1ib2xQb3NpdGlvbjsKLQkJY3VycmVuY3lTeW1ib2xQb3NpdGlvbiA9IG5ld0N1cnJlbmN5U3ltYm9sUG9zaXRpb247Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fQ1VSUkVOQ1lfU1lNQk9MX1BPU0lUSU9OLCBvbGRDdXJyZW5jeVN5bWJvbFBvc2l0aW9uLCBjdXJyZW5jeVN5bWJvbFBvc2l0aW9uKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0Q2FsZW5kYXJVSUQoKSB7Ci0JCXJldHVybiBjYWxlbmRhclVJRDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDYWxlbmRhclVJRChCaWdJbnRlZ2VyIG5ld0NhbGVuZGFyVUlEKSB7Ci0JCUJpZ0ludGVnZXIgb2xkQ2FsZW5kYXJVSUQgPSBjYWxlbmRhclVJRDsKLQkJY2FsZW5kYXJVSUQgPSBuZXdDYWxlbmRhclVJRDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19DQUxFTkRBUl9VSUQsIG9sZENhbGVuZGFyVUlELCBjYWxlbmRhclVJRCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0RGVmYXVsdFN0YXJ0VGltZSgpIHsKLQkJcmV0dXJuIGRlZmF1bHRTdGFydFRpbWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGVmYXVsdFN0YXJ0VGltZShPYmplY3QgbmV3RGVmYXVsdFN0YXJ0VGltZSkgewotCQlPYmplY3Qgb2xkRGVmYXVsdFN0YXJ0VGltZSA9IGRlZmF1bHRTdGFydFRpbWU7Ci0JCWRlZmF1bHRTdGFydFRpbWUgPSBuZXdEZWZhdWx0U3RhcnRUaW1lOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0RFRkFVTFRfU1RBUlRfVElNRSwgb2xkRGVmYXVsdFN0YXJ0VGltZSwgZGVmYXVsdFN0YXJ0VGltZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0RGVmYXVsdEZpbmlzaFRpbWUoKSB7Ci0JCXJldHVybiBkZWZhdWx0RmluaXNoVGltZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZWZhdWx0RmluaXNoVGltZShPYmplY3QgbmV3RGVmYXVsdEZpbmlzaFRpbWUpIHsKLQkJT2JqZWN0IG9sZERlZmF1bHRGaW5pc2hUaW1lID0gZGVmYXVsdEZpbmlzaFRpbWU7Ci0JCWRlZmF1bHRGaW5pc2hUaW1lID0gbmV3RGVmYXVsdEZpbmlzaFRpbWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fREVGQVVMVF9GSU5JU0hfVElNRSwgb2xkRGVmYXVsdEZpbmlzaFRpbWUsIGRlZmF1bHRGaW5pc2hUaW1lKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0TWludXRlc1BlckRheSgpIHsKLQkJcmV0dXJuIG1pbnV0ZXNQZXJEYXk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TWludXRlc1BlckRheShCaWdJbnRlZ2VyIG5ld01pbnV0ZXNQZXJEYXkpIHsKLQkJQmlnSW50ZWdlciBvbGRNaW51dGVzUGVyRGF5ID0gbWludXRlc1BlckRheTsKLQkJbWludXRlc1BlckRheSA9IG5ld01pbnV0ZXNQZXJEYXk7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fTUlOVVRFU19QRVJfREFZLCBvbGRNaW51dGVzUGVyRGF5LCBtaW51dGVzUGVyRGF5KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0TWludXRlc1BlcldlZWsoKSB7Ci0JCXJldHVybiBtaW51dGVzUGVyV2VlazsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNaW51dGVzUGVyV2VlayhCaWdJbnRlZ2VyIG5ld01pbnV0ZXNQZXJXZWVrKSB7Ci0JCUJpZ0ludGVnZXIgb2xkTWludXRlc1BlcldlZWsgPSBtaW51dGVzUGVyV2VlazsKLQkJbWludXRlc1BlcldlZWsgPSBuZXdNaW51dGVzUGVyV2VlazsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19NSU5VVEVTX1BFUl9XRUVLLCBvbGRNaW51dGVzUGVyV2VlaywgbWludXRlc1BlcldlZWspKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBnZXREYXlzUGVyTW9udGgoKSB7Ci0JCXJldHVybiBkYXlzUGVyTW9udGg7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGF5c1Blck1vbnRoKEJpZ0ludGVnZXIgbmV3RGF5c1Blck1vbnRoKSB7Ci0JCUJpZ0ludGVnZXIgb2xkRGF5c1Blck1vbnRoID0gZGF5c1Blck1vbnRoOwotCQlkYXlzUGVyTW9udGggPSBuZXdEYXlzUGVyTW9udGg7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fREFZU19QRVJfTU9OVEgsIG9sZERheXNQZXJNb250aCwgZGF5c1Blck1vbnRoKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0RGVmYXVsdFRhc2tUeXBlKCkgewotCQlyZXR1cm4gZGVmYXVsdFRhc2tUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlZmF1bHRUYXNrVHlwZShCaWdJbnRlZ2VyIG5ld0RlZmF1bHRUYXNrVHlwZSkgewotCQlCaWdJbnRlZ2VyIG9sZERlZmF1bHRUYXNrVHlwZSA9IGRlZmF1bHRUYXNrVHlwZTsKLQkJZGVmYXVsdFRhc2tUeXBlID0gbmV3RGVmYXVsdFRhc2tUeXBlOwotCQlib29sZWFuIG9sZERlZmF1bHRUYXNrVHlwZUVTZXQgPSBkZWZhdWx0VGFza1R5cGVFU2V0OwotCQlkZWZhdWx0VGFza1R5cGVFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19ERUZBVUxUX1RBU0tfVFlQRSwgb2xkRGVmYXVsdFRhc2tUeXBlLCBkZWZhdWx0VGFza1R5cGUsICFvbGREZWZhdWx0VGFza1R5cGVFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXREZWZhdWx0VGFza1R5cGUoKSB7Ci0JCUJpZ0ludGVnZXIgb2xkRGVmYXVsdFRhc2tUeXBlID0gZGVmYXVsdFRhc2tUeXBlOwotCQlib29sZWFuIG9sZERlZmF1bHRUYXNrVHlwZUVTZXQgPSBkZWZhdWx0VGFza1R5cGVFU2V0OwotCQlkZWZhdWx0VGFza1R5cGUgPSBERUZBVUxUX1RBU0tfVFlQRV9FREVGQVVMVDsKLQkJZGVmYXVsdFRhc2tUeXBlRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fREVGQVVMVF9UQVNLX1RZUEUsIG9sZERlZmF1bHRUYXNrVHlwZSwgREVGQVVMVF9UQVNLX1RZUEVfRURFRkFVTFQsIG9sZERlZmF1bHRUYXNrVHlwZUVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldERlZmF1bHRUYXNrVHlwZSgpIHsKLQkJcmV0dXJuIGRlZmF1bHRUYXNrVHlwZUVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0RGVmYXVsdEZpeGVkQ29zdEFjY3J1YWwoKSB7Ci0JCXJldHVybiBkZWZhdWx0Rml4ZWRDb3N0QWNjcnVhbDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZWZhdWx0Rml4ZWRDb3N0QWNjcnVhbChCaWdJbnRlZ2VyIG5ld0RlZmF1bHRGaXhlZENvc3RBY2NydWFsKSB7Ci0JCUJpZ0ludGVnZXIgb2xkRGVmYXVsdEZpeGVkQ29zdEFjY3J1YWwgPSBkZWZhdWx0Rml4ZWRDb3N0QWNjcnVhbDsKLQkJZGVmYXVsdEZpeGVkQ29zdEFjY3J1YWwgPSBuZXdEZWZhdWx0Rml4ZWRDb3N0QWNjcnVhbDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19ERUZBVUxUX0ZJWEVEX0NPU1RfQUNDUlVBTCwgb2xkRGVmYXVsdEZpeGVkQ29zdEFjY3J1YWwsIGRlZmF1bHRGaXhlZENvc3RBY2NydWFsKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGZsb2F0IGdldERlZmF1bHRTdGFuZGFyZFJhdGUoKSB7Ci0JCXJldHVybiBkZWZhdWx0U3RhbmRhcmRSYXRlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlZmF1bHRTdGFuZGFyZFJhdGUoZmxvYXQgbmV3RGVmYXVsdFN0YW5kYXJkUmF0ZSkgewotCQlmbG9hdCBvbGREZWZhdWx0U3RhbmRhcmRSYXRlID0gZGVmYXVsdFN0YW5kYXJkUmF0ZTsKLQkJZGVmYXVsdFN0YW5kYXJkUmF0ZSA9IG5ld0RlZmF1bHRTdGFuZGFyZFJhdGU7Ci0JCWJvb2xlYW4gb2xkRGVmYXVsdFN0YW5kYXJkUmF0ZUVTZXQgPSBkZWZhdWx0U3RhbmRhcmRSYXRlRVNldDsKLQkJZGVmYXVsdFN0YW5kYXJkUmF0ZUVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0RFRkFVTFRfU1RBTkRBUkRfUkFURSwgb2xkRGVmYXVsdFN0YW5kYXJkUmF0ZSwgZGVmYXVsdFN0YW5kYXJkUmF0ZSwgIW9sZERlZmF1bHRTdGFuZGFyZFJhdGVFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXREZWZhdWx0U3RhbmRhcmRSYXRlKCkgewotCQlmbG9hdCBvbGREZWZhdWx0U3RhbmRhcmRSYXRlID0gZGVmYXVsdFN0YW5kYXJkUmF0ZTsKLQkJYm9vbGVhbiBvbGREZWZhdWx0U3RhbmRhcmRSYXRlRVNldCA9IGRlZmF1bHRTdGFuZGFyZFJhdGVFU2V0OwotCQlkZWZhdWx0U3RhbmRhcmRSYXRlID0gREVGQVVMVF9TVEFOREFSRF9SQVRFX0VERUZBVUxUOwotCQlkZWZhdWx0U3RhbmRhcmRSYXRlRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fREVGQVVMVF9TVEFOREFSRF9SQVRFLCBvbGREZWZhdWx0U3RhbmRhcmRSYXRlLCBERUZBVUxUX1NUQU5EQVJEX1JBVEVfRURFRkFVTFQsIG9sZERlZmF1bHRTdGFuZGFyZFJhdGVFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXREZWZhdWx0U3RhbmRhcmRSYXRlKCkgewotCQlyZXR1cm4gZGVmYXVsdFN0YW5kYXJkUmF0ZUVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGZsb2F0IGdldERlZmF1bHRPdmVydGltZVJhdGUoKSB7Ci0JCXJldHVybiBkZWZhdWx0T3ZlcnRpbWVSYXRlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlZmF1bHRPdmVydGltZVJhdGUoZmxvYXQgbmV3RGVmYXVsdE92ZXJ0aW1lUmF0ZSkgewotCQlmbG9hdCBvbGREZWZhdWx0T3ZlcnRpbWVSYXRlID0gZGVmYXVsdE92ZXJ0aW1lUmF0ZTsKLQkJZGVmYXVsdE92ZXJ0aW1lUmF0ZSA9IG5ld0RlZmF1bHRPdmVydGltZVJhdGU7Ci0JCWJvb2xlYW4gb2xkRGVmYXVsdE92ZXJ0aW1lUmF0ZUVTZXQgPSBkZWZhdWx0T3ZlcnRpbWVSYXRlRVNldDsKLQkJZGVmYXVsdE92ZXJ0aW1lUmF0ZUVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0RFRkFVTFRfT1ZFUlRJTUVfUkFURSwgb2xkRGVmYXVsdE92ZXJ0aW1lUmF0ZSwgZGVmYXVsdE92ZXJ0aW1lUmF0ZSwgIW9sZERlZmF1bHRPdmVydGltZVJhdGVFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXREZWZhdWx0T3ZlcnRpbWVSYXRlKCkgewotCQlmbG9hdCBvbGREZWZhdWx0T3ZlcnRpbWVSYXRlID0gZGVmYXVsdE92ZXJ0aW1lUmF0ZTsKLQkJYm9vbGVhbiBvbGREZWZhdWx0T3ZlcnRpbWVSYXRlRVNldCA9IGRlZmF1bHRPdmVydGltZVJhdGVFU2V0OwotCQlkZWZhdWx0T3ZlcnRpbWVSYXRlID0gREVGQVVMVF9PVkVSVElNRV9SQVRFX0VERUZBVUxUOwotCQlkZWZhdWx0T3ZlcnRpbWVSYXRlRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fREVGQVVMVF9PVkVSVElNRV9SQVRFLCBvbGREZWZhdWx0T3ZlcnRpbWVSYXRlLCBERUZBVUxUX09WRVJUSU1FX1JBVEVfRURFRkFVTFQsIG9sZERlZmF1bHRPdmVydGltZVJhdGVFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXREZWZhdWx0T3ZlcnRpbWVSYXRlKCkgewotCQlyZXR1cm4gZGVmYXVsdE92ZXJ0aW1lUmF0ZUVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0RHVyYXRpb25Gb3JtYXQoKSB7Ci0JCXJldHVybiBkdXJhdGlvbkZvcm1hdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREdXJhdGlvbkZvcm1hdChCaWdJbnRlZ2VyIG5ld0R1cmF0aW9uRm9ybWF0KSB7Ci0JCUJpZ0ludGVnZXIgb2xkRHVyYXRpb25Gb3JtYXQgPSBkdXJhdGlvbkZvcm1hdDsKLQkJZHVyYXRpb25Gb3JtYXQgPSBuZXdEdXJhdGlvbkZvcm1hdDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19EVVJBVElPTl9GT1JNQVQsIG9sZER1cmF0aW9uRm9ybWF0LCBkdXJhdGlvbkZvcm1hdCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGdldFdvcmtGb3JtYXQoKSB7Ci0JCXJldHVybiB3b3JrRm9ybWF0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFdvcmtGb3JtYXQoQmlnSW50ZWdlciBuZXdXb3JrRm9ybWF0KSB7Ci0JCUJpZ0ludGVnZXIgb2xkV29ya0Zvcm1hdCA9IHdvcmtGb3JtYXQ7Ci0JCXdvcmtGb3JtYXQgPSBuZXdXb3JrRm9ybWF0OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX1dPUktfRk9STUFULCBvbGRXb3JrRm9ybWF0LCB3b3JrRm9ybWF0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNFZGl0YWJsZUFjdHVhbENvc3RzKCkgewotCQlyZXR1cm4gZWRpdGFibGVBY3R1YWxDb3N0czsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFZGl0YWJsZUFjdHVhbENvc3RzKGJvb2xlYW4gbmV3RWRpdGFibGVBY3R1YWxDb3N0cykgewotCQlib29sZWFuIG9sZEVkaXRhYmxlQWN0dWFsQ29zdHMgPSBlZGl0YWJsZUFjdHVhbENvc3RzOwotCQllZGl0YWJsZUFjdHVhbENvc3RzID0gbmV3RWRpdGFibGVBY3R1YWxDb3N0czsKLQkJYm9vbGVhbiBvbGRFZGl0YWJsZUFjdHVhbENvc3RzRVNldCA9IGVkaXRhYmxlQWN0dWFsQ29zdHNFU2V0OwotCQllZGl0YWJsZUFjdHVhbENvc3RzRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fRURJVEFCTEVfQUNUVUFMX0NPU1RTLCBvbGRFZGl0YWJsZUFjdHVhbENvc3RzLCBlZGl0YWJsZUFjdHVhbENvc3RzLCAhb2xkRWRpdGFibGVBY3R1YWxDb3N0c0VTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldEVkaXRhYmxlQWN0dWFsQ29zdHMoKSB7Ci0JCWJvb2xlYW4gb2xkRWRpdGFibGVBY3R1YWxDb3N0cyA9IGVkaXRhYmxlQWN0dWFsQ29zdHM7Ci0JCWJvb2xlYW4gb2xkRWRpdGFibGVBY3R1YWxDb3N0c0VTZXQgPSBlZGl0YWJsZUFjdHVhbENvc3RzRVNldDsKLQkJZWRpdGFibGVBY3R1YWxDb3N0cyA9IEVESVRBQkxFX0FDVFVBTF9DT1NUU19FREVGQVVMVDsKLQkJZWRpdGFibGVBY3R1YWxDb3N0c0VTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0VESVRBQkxFX0FDVFVBTF9DT1NUUywgb2xkRWRpdGFibGVBY3R1YWxDb3N0cywgRURJVEFCTEVfQUNUVUFMX0NPU1RTX0VERUZBVUxULCBvbGRFZGl0YWJsZUFjdHVhbENvc3RzRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0RWRpdGFibGVBY3R1YWxDb3N0cygpIHsKLQkJcmV0dXJuIGVkaXRhYmxlQWN0dWFsQ29zdHNFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzSG9ub3JDb25zdHJhaW50cygpIHsKLQkJcmV0dXJuIGhvbm9yQ29uc3RyYWludHM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SG9ub3JDb25zdHJhaW50cyhib29sZWFuIG5ld0hvbm9yQ29uc3RyYWludHMpIHsKLQkJYm9vbGVhbiBvbGRIb25vckNvbnN0cmFpbnRzID0gaG9ub3JDb25zdHJhaW50czsKLQkJaG9ub3JDb25zdHJhaW50cyA9IG5ld0hvbm9yQ29uc3RyYWludHM7Ci0JCWJvb2xlYW4gb2xkSG9ub3JDb25zdHJhaW50c0VTZXQgPSBob25vckNvbnN0cmFpbnRzRVNldDsKLQkJaG9ub3JDb25zdHJhaW50c0VTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0hPTk9SX0NPTlNUUkFJTlRTLCBvbGRIb25vckNvbnN0cmFpbnRzLCBob25vckNvbnN0cmFpbnRzLCAhb2xkSG9ub3JDb25zdHJhaW50c0VTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldEhvbm9yQ29uc3RyYWludHMoKSB7Ci0JCWJvb2xlYW4gb2xkSG9ub3JDb25zdHJhaW50cyA9IGhvbm9yQ29uc3RyYWludHM7Ci0JCWJvb2xlYW4gb2xkSG9ub3JDb25zdHJhaW50c0VTZXQgPSBob25vckNvbnN0cmFpbnRzRVNldDsKLQkJaG9ub3JDb25zdHJhaW50cyA9IEhPTk9SX0NPTlNUUkFJTlRTX0VERUZBVUxUOwotCQlob25vckNvbnN0cmFpbnRzRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fSE9OT1JfQ09OU1RSQUlOVFMsIG9sZEhvbm9yQ29uc3RyYWludHMsIEhPTk9SX0NPTlNUUkFJTlRTX0VERUZBVUxULCBvbGRIb25vckNvbnN0cmFpbnRzRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0SG9ub3JDb25zdHJhaW50cygpIHsKLQkJcmV0dXJuIGhvbm9yQ29uc3RyYWludHNFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGdldEVhcm5lZFZhbHVlTWV0aG9kKCkgewotCQlyZXR1cm4gZWFybmVkVmFsdWVNZXRob2Q7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RWFybmVkVmFsdWVNZXRob2QoQmlnSW50ZWdlciBuZXdFYXJuZWRWYWx1ZU1ldGhvZCkgewotCQlCaWdJbnRlZ2VyIG9sZEVhcm5lZFZhbHVlTWV0aG9kID0gZWFybmVkVmFsdWVNZXRob2Q7Ci0JCWVhcm5lZFZhbHVlTWV0aG9kID0gbmV3RWFybmVkVmFsdWVNZXRob2Q7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fRUFSTkVEX1ZBTFVFX01FVEhPRCwgb2xkRWFybmVkVmFsdWVNZXRob2QsIGVhcm5lZFZhbHVlTWV0aG9kKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNJbnNlcnRlZFByb2plY3RzTGlrZVN1bW1hcnkoKSB7Ci0JCXJldHVybiBpbnNlcnRlZFByb2plY3RzTGlrZVN1bW1hcnk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SW5zZXJ0ZWRQcm9qZWN0c0xpa2VTdW1tYXJ5KGJvb2xlYW4gbmV3SW5zZXJ0ZWRQcm9qZWN0c0xpa2VTdW1tYXJ5KSB7Ci0JCWJvb2xlYW4gb2xkSW5zZXJ0ZWRQcm9qZWN0c0xpa2VTdW1tYXJ5ID0gaW5zZXJ0ZWRQcm9qZWN0c0xpa2VTdW1tYXJ5OwotCQlpbnNlcnRlZFByb2plY3RzTGlrZVN1bW1hcnkgPSBuZXdJbnNlcnRlZFByb2plY3RzTGlrZVN1bW1hcnk7Ci0JCWJvb2xlYW4gb2xkSW5zZXJ0ZWRQcm9qZWN0c0xpa2VTdW1tYXJ5RVNldCA9IGluc2VydGVkUHJvamVjdHNMaWtlU3VtbWFyeUVTZXQ7Ci0JCWluc2VydGVkUHJvamVjdHNMaWtlU3VtbWFyeUVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0lOU0VSVEVEX1BST0pFQ1RTX0xJS0VfU1VNTUFSWSwgb2xkSW5zZXJ0ZWRQcm9qZWN0c0xpa2VTdW1tYXJ5LCBpbnNlcnRlZFByb2plY3RzTGlrZVN1bW1hcnksICFvbGRJbnNlcnRlZFByb2plY3RzTGlrZVN1bW1hcnlFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRJbnNlcnRlZFByb2plY3RzTGlrZVN1bW1hcnkoKSB7Ci0JCWJvb2xlYW4gb2xkSW5zZXJ0ZWRQcm9qZWN0c0xpa2VTdW1tYXJ5ID0gaW5zZXJ0ZWRQcm9qZWN0c0xpa2VTdW1tYXJ5OwotCQlib29sZWFuIG9sZEluc2VydGVkUHJvamVjdHNMaWtlU3VtbWFyeUVTZXQgPSBpbnNlcnRlZFByb2plY3RzTGlrZVN1bW1hcnlFU2V0OwotCQlpbnNlcnRlZFByb2plY3RzTGlrZVN1bW1hcnkgPSBJTlNFUlRFRF9QUk9KRUNUU19MSUtFX1NVTU1BUllfRURFRkFVTFQ7Ci0JCWluc2VydGVkUHJvamVjdHNMaWtlU3VtbWFyeUVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0lOU0VSVEVEX1BST0pFQ1RTX0xJS0VfU1VNTUFSWSwgb2xkSW5zZXJ0ZWRQcm9qZWN0c0xpa2VTdW1tYXJ5LCBJTlNFUlRFRF9QUk9KRUNUU19MSUtFX1NVTU1BUllfRURFRkFVTFQsIG9sZEluc2VydGVkUHJvamVjdHNMaWtlU3VtbWFyeUVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldEluc2VydGVkUHJvamVjdHNMaWtlU3VtbWFyeSgpIHsKLQkJcmV0dXJuIGluc2VydGVkUHJvamVjdHNMaWtlU3VtbWFyeUVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNNdWx0aXBsZUNyaXRpY2FsUGF0aHMoKSB7Ci0JCXJldHVybiBtdWx0aXBsZUNyaXRpY2FsUGF0aHM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TXVsdGlwbGVDcml0aWNhbFBhdGhzKGJvb2xlYW4gbmV3TXVsdGlwbGVDcml0aWNhbFBhdGhzKSB7Ci0JCWJvb2xlYW4gb2xkTXVsdGlwbGVDcml0aWNhbFBhdGhzID0gbXVsdGlwbGVDcml0aWNhbFBhdGhzOwotCQltdWx0aXBsZUNyaXRpY2FsUGF0aHMgPSBuZXdNdWx0aXBsZUNyaXRpY2FsUGF0aHM7Ci0JCWJvb2xlYW4gb2xkTXVsdGlwbGVDcml0aWNhbFBhdGhzRVNldCA9IG11bHRpcGxlQ3JpdGljYWxQYXRoc0VTZXQ7Ci0JCW11bHRpcGxlQ3JpdGljYWxQYXRoc0VTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX01VTFRJUExFX0NSSVRJQ0FMX1BBVEhTLCBvbGRNdWx0aXBsZUNyaXRpY2FsUGF0aHMsIG11bHRpcGxlQ3JpdGljYWxQYXRocywgIW9sZE11bHRpcGxlQ3JpdGljYWxQYXRoc0VTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldE11bHRpcGxlQ3JpdGljYWxQYXRocygpIHsKLQkJYm9vbGVhbiBvbGRNdWx0aXBsZUNyaXRpY2FsUGF0aHMgPSBtdWx0aXBsZUNyaXRpY2FsUGF0aHM7Ci0JCWJvb2xlYW4gb2xkTXVsdGlwbGVDcml0aWNhbFBhdGhzRVNldCA9IG11bHRpcGxlQ3JpdGljYWxQYXRoc0VTZXQ7Ci0JCW11bHRpcGxlQ3JpdGljYWxQYXRocyA9IE1VTFRJUExFX0NSSVRJQ0FMX1BBVEhTX0VERUZBVUxUOwotCQltdWx0aXBsZUNyaXRpY2FsUGF0aHNFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19NVUxUSVBMRV9DUklUSUNBTF9QQVRIUywgb2xkTXVsdGlwbGVDcml0aWNhbFBhdGhzLCBNVUxUSVBMRV9DUklUSUNBTF9QQVRIU19FREVGQVVMVCwgb2xkTXVsdGlwbGVDcml0aWNhbFBhdGhzRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0TXVsdGlwbGVDcml0aWNhbFBhdGhzKCkgewotCQlyZXR1cm4gbXVsdGlwbGVDcml0aWNhbFBhdGhzRVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc05ld1Rhc2tzRWZmb3J0RHJpdmVuKCkgewotCQlyZXR1cm4gbmV3VGFza3NFZmZvcnREcml2ZW47Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TmV3VGFza3NFZmZvcnREcml2ZW4oYm9vbGVhbiBuZXdOZXdUYXNrc0VmZm9ydERyaXZlbikgewotCQlib29sZWFuIG9sZE5ld1Rhc2tzRWZmb3J0RHJpdmVuID0gbmV3VGFza3NFZmZvcnREcml2ZW47Ci0JCW5ld1Rhc2tzRWZmb3J0RHJpdmVuID0gbmV3TmV3VGFza3NFZmZvcnREcml2ZW47Ci0JCWJvb2xlYW4gb2xkTmV3VGFza3NFZmZvcnREcml2ZW5FU2V0ID0gbmV3VGFza3NFZmZvcnREcml2ZW5FU2V0OwotCQluZXdUYXNrc0VmZm9ydERyaXZlbkVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX05FV19UQVNLU19FRkZPUlRfRFJJVkVOLCBvbGROZXdUYXNrc0VmZm9ydERyaXZlbiwgbmV3VGFza3NFZmZvcnREcml2ZW4sICFvbGROZXdUYXNrc0VmZm9ydERyaXZlbkVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldE5ld1Rhc2tzRWZmb3J0RHJpdmVuKCkgewotCQlib29sZWFuIG9sZE5ld1Rhc2tzRWZmb3J0RHJpdmVuID0gbmV3VGFza3NFZmZvcnREcml2ZW47Ci0JCWJvb2xlYW4gb2xkTmV3VGFza3NFZmZvcnREcml2ZW5FU2V0ID0gbmV3VGFza3NFZmZvcnREcml2ZW5FU2V0OwotCQluZXdUYXNrc0VmZm9ydERyaXZlbiA9IE5FV19UQVNLU19FRkZPUlRfRFJJVkVOX0VERUZBVUxUOwotCQluZXdUYXNrc0VmZm9ydERyaXZlbkVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX05FV19UQVNLU19FRkZPUlRfRFJJVkVOLCBvbGROZXdUYXNrc0VmZm9ydERyaXZlbiwgTkVXX1RBU0tTX0VGRk9SVF9EUklWRU5fRURFRkFVTFQsIG9sZE5ld1Rhc2tzRWZmb3J0RHJpdmVuRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0TmV3VGFza3NFZmZvcnREcml2ZW4oKSB7Ci0JCXJldHVybiBuZXdUYXNrc0VmZm9ydERyaXZlbkVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNOZXdUYXNrc0VzdGltYXRlZCgpIHsKLQkJcmV0dXJuIG5ld1Rhc2tzRXN0aW1hdGVkOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE5ld1Rhc2tzRXN0aW1hdGVkKGJvb2xlYW4gbmV3TmV3VGFza3NFc3RpbWF0ZWQpIHsKLQkJYm9vbGVhbiBvbGROZXdUYXNrc0VzdGltYXRlZCA9IG5ld1Rhc2tzRXN0aW1hdGVkOwotCQluZXdUYXNrc0VzdGltYXRlZCA9IG5ld05ld1Rhc2tzRXN0aW1hdGVkOwotCQlib29sZWFuIG9sZE5ld1Rhc2tzRXN0aW1hdGVkRVNldCA9IG5ld1Rhc2tzRXN0aW1hdGVkRVNldDsKLQkJbmV3VGFza3NFc3RpbWF0ZWRFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19ORVdfVEFTS1NfRVNUSU1BVEVELCBvbGROZXdUYXNrc0VzdGltYXRlZCwgbmV3VGFza3NFc3RpbWF0ZWQsICFvbGROZXdUYXNrc0VzdGltYXRlZEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldE5ld1Rhc2tzRXN0aW1hdGVkKCkgewotCQlib29sZWFuIG9sZE5ld1Rhc2tzRXN0aW1hdGVkID0gbmV3VGFza3NFc3RpbWF0ZWQ7Ci0JCWJvb2xlYW4gb2xkTmV3VGFza3NFc3RpbWF0ZWRFU2V0ID0gbmV3VGFza3NFc3RpbWF0ZWRFU2V0OwotCQluZXdUYXNrc0VzdGltYXRlZCA9IE5FV19UQVNLU19FU1RJTUFURURfRURFRkFVTFQ7Ci0JCW5ld1Rhc2tzRXN0aW1hdGVkRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fTkVXX1RBU0tTX0VTVElNQVRFRCwgb2xkTmV3VGFza3NFc3RpbWF0ZWQsIE5FV19UQVNLU19FU1RJTUFURURfRURFRkFVTFQsIG9sZE5ld1Rhc2tzRXN0aW1hdGVkRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0TmV3VGFza3NFc3RpbWF0ZWQoKSB7Ci0JCXJldHVybiBuZXdUYXNrc0VzdGltYXRlZEVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTcGxpdHNJblByb2dyZXNzVGFza3MoKSB7Ci0JCXJldHVybiBzcGxpdHNJblByb2dyZXNzVGFza3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0U3BsaXRzSW5Qcm9ncmVzc1Rhc2tzKGJvb2xlYW4gbmV3U3BsaXRzSW5Qcm9ncmVzc1Rhc2tzKSB7Ci0JCWJvb2xlYW4gb2xkU3BsaXRzSW5Qcm9ncmVzc1Rhc2tzID0gc3BsaXRzSW5Qcm9ncmVzc1Rhc2tzOwotCQlzcGxpdHNJblByb2dyZXNzVGFza3MgPSBuZXdTcGxpdHNJblByb2dyZXNzVGFza3M7Ci0JCWJvb2xlYW4gb2xkU3BsaXRzSW5Qcm9ncmVzc1Rhc2tzRVNldCA9IHNwbGl0c0luUHJvZ3Jlc3NUYXNrc0VTZXQ7Ci0JCXNwbGl0c0luUHJvZ3Jlc3NUYXNrc0VTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX1NQTElUU19JTl9QUk9HUkVTU19UQVNLUywgb2xkU3BsaXRzSW5Qcm9ncmVzc1Rhc2tzLCBzcGxpdHNJblByb2dyZXNzVGFza3MsICFvbGRTcGxpdHNJblByb2dyZXNzVGFza3NFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRTcGxpdHNJblByb2dyZXNzVGFza3MoKSB7Ci0JCWJvb2xlYW4gb2xkU3BsaXRzSW5Qcm9ncmVzc1Rhc2tzID0gc3BsaXRzSW5Qcm9ncmVzc1Rhc2tzOwotCQlib29sZWFuIG9sZFNwbGl0c0luUHJvZ3Jlc3NUYXNrc0VTZXQgPSBzcGxpdHNJblByb2dyZXNzVGFza3NFU2V0OwotCQlzcGxpdHNJblByb2dyZXNzVGFza3MgPSBTUExJVFNfSU5fUFJPR1JFU1NfVEFTS1NfRURFRkFVTFQ7Ci0JCXNwbGl0c0luUHJvZ3Jlc3NUYXNrc0VTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX1NQTElUU19JTl9QUk9HUkVTU19UQVNLUywgb2xkU3BsaXRzSW5Qcm9ncmVzc1Rhc2tzLCBTUExJVFNfSU5fUFJPR1JFU1NfVEFTS1NfRURFRkFVTFQsIG9sZFNwbGl0c0luUHJvZ3Jlc3NUYXNrc0VTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldFNwbGl0c0luUHJvZ3Jlc3NUYXNrcygpIHsKLQkJcmV0dXJuIHNwbGl0c0luUHJvZ3Jlc3NUYXNrc0VTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTcHJlYWRBY3R1YWxDb3N0KCkgewotCQlyZXR1cm4gc3ByZWFkQWN0dWFsQ29zdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTcHJlYWRBY3R1YWxDb3N0KGJvb2xlYW4gbmV3U3ByZWFkQWN0dWFsQ29zdCkgewotCQlib29sZWFuIG9sZFNwcmVhZEFjdHVhbENvc3QgPSBzcHJlYWRBY3R1YWxDb3N0OwotCQlzcHJlYWRBY3R1YWxDb3N0ID0gbmV3U3ByZWFkQWN0dWFsQ29zdDsKLQkJYm9vbGVhbiBvbGRTcHJlYWRBY3R1YWxDb3N0RVNldCA9IHNwcmVhZEFjdHVhbENvc3RFU2V0OwotCQlzcHJlYWRBY3R1YWxDb3N0RVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fU1BSRUFEX0FDVFVBTF9DT1NULCBvbGRTcHJlYWRBY3R1YWxDb3N0LCBzcHJlYWRBY3R1YWxDb3N0LCAhb2xkU3ByZWFkQWN0dWFsQ29zdEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldFNwcmVhZEFjdHVhbENvc3QoKSB7Ci0JCWJvb2xlYW4gb2xkU3ByZWFkQWN0dWFsQ29zdCA9IHNwcmVhZEFjdHVhbENvc3Q7Ci0JCWJvb2xlYW4gb2xkU3ByZWFkQWN0dWFsQ29zdEVTZXQgPSBzcHJlYWRBY3R1YWxDb3N0RVNldDsKLQkJc3ByZWFkQWN0dWFsQ29zdCA9IFNQUkVBRF9BQ1RVQUxfQ09TVF9FREVGQVVMVDsKLQkJc3ByZWFkQWN0dWFsQ29zdEVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX1NQUkVBRF9BQ1RVQUxfQ09TVCwgb2xkU3ByZWFkQWN0dWFsQ29zdCwgU1BSRUFEX0FDVFVBTF9DT1NUX0VERUZBVUxULCBvbGRTcHJlYWRBY3R1YWxDb3N0RVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0U3ByZWFkQWN0dWFsQ29zdCgpIHsKLQkJcmV0dXJuIHNwcmVhZEFjdHVhbENvc3RFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU3ByZWFkUGVyY2VudENvbXBsZXRlKCkgewotCQlyZXR1cm4gc3ByZWFkUGVyY2VudENvbXBsZXRlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNwcmVhZFBlcmNlbnRDb21wbGV0ZShib29sZWFuIG5ld1NwcmVhZFBlcmNlbnRDb21wbGV0ZSkgewotCQlib29sZWFuIG9sZFNwcmVhZFBlcmNlbnRDb21wbGV0ZSA9IHNwcmVhZFBlcmNlbnRDb21wbGV0ZTsKLQkJc3ByZWFkUGVyY2VudENvbXBsZXRlID0gbmV3U3ByZWFkUGVyY2VudENvbXBsZXRlOwotCQlib29sZWFuIG9sZFNwcmVhZFBlcmNlbnRDb21wbGV0ZUVTZXQgPSBzcHJlYWRQZXJjZW50Q29tcGxldGVFU2V0OwotCQlzcHJlYWRQZXJjZW50Q29tcGxldGVFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19TUFJFQURfUEVSQ0VOVF9DT01QTEVURSwgb2xkU3ByZWFkUGVyY2VudENvbXBsZXRlLCBzcHJlYWRQZXJjZW50Q29tcGxldGUsICFvbGRTcHJlYWRQZXJjZW50Q29tcGxldGVFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRTcHJlYWRQZXJjZW50Q29tcGxldGUoKSB7Ci0JCWJvb2xlYW4gb2xkU3ByZWFkUGVyY2VudENvbXBsZXRlID0gc3ByZWFkUGVyY2VudENvbXBsZXRlOwotCQlib29sZWFuIG9sZFNwcmVhZFBlcmNlbnRDb21wbGV0ZUVTZXQgPSBzcHJlYWRQZXJjZW50Q29tcGxldGVFU2V0OwotCQlzcHJlYWRQZXJjZW50Q29tcGxldGUgPSBTUFJFQURfUEVSQ0VOVF9DT01QTEVURV9FREVGQVVMVDsKLQkJc3ByZWFkUGVyY2VudENvbXBsZXRlRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fU1BSRUFEX1BFUkNFTlRfQ09NUExFVEUsIG9sZFNwcmVhZFBlcmNlbnRDb21wbGV0ZSwgU1BSRUFEX1BFUkNFTlRfQ09NUExFVEVfRURFRkFVTFQsIG9sZFNwcmVhZFBlcmNlbnRDb21wbGV0ZUVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldFNwcmVhZFBlcmNlbnRDb21wbGV0ZSgpIHsKLQkJcmV0dXJuIHNwcmVhZFBlcmNlbnRDb21wbGV0ZUVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNUYXNrVXBkYXRlc1Jlc291cmNlKCkgewotCQlyZXR1cm4gdGFza1VwZGF0ZXNSZXNvdXJjZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUYXNrVXBkYXRlc1Jlc291cmNlKGJvb2xlYW4gbmV3VGFza1VwZGF0ZXNSZXNvdXJjZSkgewotCQlib29sZWFuIG9sZFRhc2tVcGRhdGVzUmVzb3VyY2UgPSB0YXNrVXBkYXRlc1Jlc291cmNlOwotCQl0YXNrVXBkYXRlc1Jlc291cmNlID0gbmV3VGFza1VwZGF0ZXNSZXNvdXJjZTsKLQkJYm9vbGVhbiBvbGRUYXNrVXBkYXRlc1Jlc291cmNlRVNldCA9IHRhc2tVcGRhdGVzUmVzb3VyY2VFU2V0OwotCQl0YXNrVXBkYXRlc1Jlc291cmNlRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fVEFTS19VUERBVEVTX1JFU09VUkNFLCBvbGRUYXNrVXBkYXRlc1Jlc291cmNlLCB0YXNrVXBkYXRlc1Jlc291cmNlLCAhb2xkVGFza1VwZGF0ZXNSZXNvdXJjZUVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldFRhc2tVcGRhdGVzUmVzb3VyY2UoKSB7Ci0JCWJvb2xlYW4gb2xkVGFza1VwZGF0ZXNSZXNvdXJjZSA9IHRhc2tVcGRhdGVzUmVzb3VyY2U7Ci0JCWJvb2xlYW4gb2xkVGFza1VwZGF0ZXNSZXNvdXJjZUVTZXQgPSB0YXNrVXBkYXRlc1Jlc291cmNlRVNldDsKLQkJdGFza1VwZGF0ZXNSZXNvdXJjZSA9IFRBU0tfVVBEQVRFU19SRVNPVVJDRV9FREVGQVVMVDsKLQkJdGFza1VwZGF0ZXNSZXNvdXJjZUVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX1RBU0tfVVBEQVRFU19SRVNPVVJDRSwgb2xkVGFza1VwZGF0ZXNSZXNvdXJjZSwgVEFTS19VUERBVEVTX1JFU09VUkNFX0VERUZBVUxULCBvbGRUYXNrVXBkYXRlc1Jlc291cmNlRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0VGFza1VwZGF0ZXNSZXNvdXJjZSgpIHsKLQkJcmV0dXJuIHRhc2tVcGRhdGVzUmVzb3VyY2VFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRmlzY2FsWWVhclN0YXJ0KCkgewotCQlyZXR1cm4gZmlzY2FsWWVhclN0YXJ0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZpc2NhbFllYXJTdGFydChib29sZWFuIG5ld0Zpc2NhbFllYXJTdGFydCkgewotCQlib29sZWFuIG9sZEZpc2NhbFllYXJTdGFydCA9IGZpc2NhbFllYXJTdGFydDsKLQkJZmlzY2FsWWVhclN0YXJ0ID0gbmV3RmlzY2FsWWVhclN0YXJ0OwotCQlib29sZWFuIG9sZEZpc2NhbFllYXJTdGFydEVTZXQgPSBmaXNjYWxZZWFyU3RhcnRFU2V0OwotCQlmaXNjYWxZZWFyU3RhcnRFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19GSVNDQUxfWUVBUl9TVEFSVCwgb2xkRmlzY2FsWWVhclN0YXJ0LCBmaXNjYWxZZWFyU3RhcnQsICFvbGRGaXNjYWxZZWFyU3RhcnRFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRGaXNjYWxZZWFyU3RhcnQoKSB7Ci0JCWJvb2xlYW4gb2xkRmlzY2FsWWVhclN0YXJ0ID0gZmlzY2FsWWVhclN0YXJ0OwotCQlib29sZWFuIG9sZEZpc2NhbFllYXJTdGFydEVTZXQgPSBmaXNjYWxZZWFyU3RhcnRFU2V0OwotCQlmaXNjYWxZZWFyU3RhcnQgPSBGSVNDQUxfWUVBUl9TVEFSVF9FREVGQVVMVDsKLQkJZmlzY2FsWWVhclN0YXJ0RVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fRklTQ0FMX1lFQVJfU1RBUlQsIG9sZEZpc2NhbFllYXJTdGFydCwgRklTQ0FMX1lFQVJfU1RBUlRfRURFRkFVTFQsIG9sZEZpc2NhbFllYXJTdGFydEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldEZpc2NhbFllYXJTdGFydCgpIHsKLQkJcmV0dXJuIGZpc2NhbFllYXJTdGFydEVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0V2Vla1N0YXJ0RGF5KCkgewotCQlyZXR1cm4gd2Vla1N0YXJ0RGF5OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFdlZWtTdGFydERheShCaWdJbnRlZ2VyIG5ld1dlZWtTdGFydERheSkgewotCQlCaWdJbnRlZ2VyIG9sZFdlZWtTdGFydERheSA9IHdlZWtTdGFydERheTsKLQkJd2Vla1N0YXJ0RGF5ID0gbmV3V2Vla1N0YXJ0RGF5OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX1dFRUtfU1RBUlRfREFZLCBvbGRXZWVrU3RhcnREYXksIHdlZWtTdGFydERheSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzTW92ZUNvbXBsZXRlZEVuZHNCYWNrKCkgewotCQlyZXR1cm4gbW92ZUNvbXBsZXRlZEVuZHNCYWNrOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1vdmVDb21wbGV0ZWRFbmRzQmFjayhib29sZWFuIG5ld01vdmVDb21wbGV0ZWRFbmRzQmFjaykgewotCQlib29sZWFuIG9sZE1vdmVDb21wbGV0ZWRFbmRzQmFjayA9IG1vdmVDb21wbGV0ZWRFbmRzQmFjazsKLQkJbW92ZUNvbXBsZXRlZEVuZHNCYWNrID0gbmV3TW92ZUNvbXBsZXRlZEVuZHNCYWNrOwotCQlib29sZWFuIG9sZE1vdmVDb21wbGV0ZWRFbmRzQmFja0VTZXQgPSBtb3ZlQ29tcGxldGVkRW5kc0JhY2tFU2V0OwotCQltb3ZlQ29tcGxldGVkRW5kc0JhY2tFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19NT1ZFX0NPTVBMRVRFRF9FTkRTX0JBQ0ssIG9sZE1vdmVDb21wbGV0ZWRFbmRzQmFjaywgbW92ZUNvbXBsZXRlZEVuZHNCYWNrLCAhb2xkTW92ZUNvbXBsZXRlZEVuZHNCYWNrRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0TW92ZUNvbXBsZXRlZEVuZHNCYWNrKCkgewotCQlib29sZWFuIG9sZE1vdmVDb21wbGV0ZWRFbmRzQmFjayA9IG1vdmVDb21wbGV0ZWRFbmRzQmFjazsKLQkJYm9vbGVhbiBvbGRNb3ZlQ29tcGxldGVkRW5kc0JhY2tFU2V0ID0gbW92ZUNvbXBsZXRlZEVuZHNCYWNrRVNldDsKLQkJbW92ZUNvbXBsZXRlZEVuZHNCYWNrID0gTU9WRV9DT01QTEVURURfRU5EU19CQUNLX0VERUZBVUxUOwotCQltb3ZlQ29tcGxldGVkRW5kc0JhY2tFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19NT1ZFX0NPTVBMRVRFRF9FTkRTX0JBQ0ssIG9sZE1vdmVDb21wbGV0ZWRFbmRzQmFjaywgTU9WRV9DT01QTEVURURfRU5EU19CQUNLX0VERUZBVUxULCBvbGRNb3ZlQ29tcGxldGVkRW5kc0JhY2tFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRNb3ZlQ29tcGxldGVkRW5kc0JhY2soKSB7Ci0JCXJldHVybiBtb3ZlQ29tcGxldGVkRW5kc0JhY2tFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzTW92ZVJlbWFpbmluZ1N0YXJ0c0JhY2soKSB7Ci0JCXJldHVybiBtb3ZlUmVtYWluaW5nU3RhcnRzQmFjazsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNb3ZlUmVtYWluaW5nU3RhcnRzQmFjayhib29sZWFuIG5ld01vdmVSZW1haW5pbmdTdGFydHNCYWNrKSB7Ci0JCWJvb2xlYW4gb2xkTW92ZVJlbWFpbmluZ1N0YXJ0c0JhY2sgPSBtb3ZlUmVtYWluaW5nU3RhcnRzQmFjazsKLQkJbW92ZVJlbWFpbmluZ1N0YXJ0c0JhY2sgPSBuZXdNb3ZlUmVtYWluaW5nU3RhcnRzQmFjazsKLQkJYm9vbGVhbiBvbGRNb3ZlUmVtYWluaW5nU3RhcnRzQmFja0VTZXQgPSBtb3ZlUmVtYWluaW5nU3RhcnRzQmFja0VTZXQ7Ci0JCW1vdmVSZW1haW5pbmdTdGFydHNCYWNrRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fTU9WRV9SRU1BSU5JTkdfU1RBUlRTX0JBQ0ssIG9sZE1vdmVSZW1haW5pbmdTdGFydHNCYWNrLCBtb3ZlUmVtYWluaW5nU3RhcnRzQmFjaywgIW9sZE1vdmVSZW1haW5pbmdTdGFydHNCYWNrRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0TW92ZVJlbWFpbmluZ1N0YXJ0c0JhY2soKSB7Ci0JCWJvb2xlYW4gb2xkTW92ZVJlbWFpbmluZ1N0YXJ0c0JhY2sgPSBtb3ZlUmVtYWluaW5nU3RhcnRzQmFjazsKLQkJYm9vbGVhbiBvbGRNb3ZlUmVtYWluaW5nU3RhcnRzQmFja0VTZXQgPSBtb3ZlUmVtYWluaW5nU3RhcnRzQmFja0VTZXQ7Ci0JCW1vdmVSZW1haW5pbmdTdGFydHNCYWNrID0gTU9WRV9SRU1BSU5JTkdfU1RBUlRTX0JBQ0tfRURFRkFVTFQ7Ci0JCW1vdmVSZW1haW5pbmdTdGFydHNCYWNrRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fTU9WRV9SRU1BSU5JTkdfU1RBUlRTX0JBQ0ssIG9sZE1vdmVSZW1haW5pbmdTdGFydHNCYWNrLCBNT1ZFX1JFTUFJTklOR19TVEFSVFNfQkFDS19FREVGQVVMVCwgb2xkTW92ZVJlbWFpbmluZ1N0YXJ0c0JhY2tFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRNb3ZlUmVtYWluaW5nU3RhcnRzQmFjaygpIHsKLQkJcmV0dXJuIG1vdmVSZW1haW5pbmdTdGFydHNCYWNrRVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc01vdmVSZW1haW5pbmdTdGFydHNGb3J3YXJkKCkgewotCQlyZXR1cm4gbW92ZVJlbWFpbmluZ1N0YXJ0c0ZvcndhcmQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TW92ZVJlbWFpbmluZ1N0YXJ0c0ZvcndhcmQoYm9vbGVhbiBuZXdNb3ZlUmVtYWluaW5nU3RhcnRzRm9yd2FyZCkgewotCQlib29sZWFuIG9sZE1vdmVSZW1haW5pbmdTdGFydHNGb3J3YXJkID0gbW92ZVJlbWFpbmluZ1N0YXJ0c0ZvcndhcmQ7Ci0JCW1vdmVSZW1haW5pbmdTdGFydHNGb3J3YXJkID0gbmV3TW92ZVJlbWFpbmluZ1N0YXJ0c0ZvcndhcmQ7Ci0JCWJvb2xlYW4gb2xkTW92ZVJlbWFpbmluZ1N0YXJ0c0ZvcndhcmRFU2V0ID0gbW92ZVJlbWFpbmluZ1N0YXJ0c0ZvcndhcmRFU2V0OwotCQltb3ZlUmVtYWluaW5nU3RhcnRzRm9yd2FyZEVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX01PVkVfUkVNQUlOSU5HX1NUQVJUU19GT1JXQVJELCBvbGRNb3ZlUmVtYWluaW5nU3RhcnRzRm9yd2FyZCwgbW92ZVJlbWFpbmluZ1N0YXJ0c0ZvcndhcmQsICFvbGRNb3ZlUmVtYWluaW5nU3RhcnRzRm9yd2FyZEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldE1vdmVSZW1haW5pbmdTdGFydHNGb3J3YXJkKCkgewotCQlib29sZWFuIG9sZE1vdmVSZW1haW5pbmdTdGFydHNGb3J3YXJkID0gbW92ZVJlbWFpbmluZ1N0YXJ0c0ZvcndhcmQ7Ci0JCWJvb2xlYW4gb2xkTW92ZVJlbWFpbmluZ1N0YXJ0c0ZvcndhcmRFU2V0ID0gbW92ZVJlbWFpbmluZ1N0YXJ0c0ZvcndhcmRFU2V0OwotCQltb3ZlUmVtYWluaW5nU3RhcnRzRm9yd2FyZCA9IE1PVkVfUkVNQUlOSU5HX1NUQVJUU19GT1JXQVJEX0VERUZBVUxUOwotCQltb3ZlUmVtYWluaW5nU3RhcnRzRm9yd2FyZEVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX01PVkVfUkVNQUlOSU5HX1NUQVJUU19GT1JXQVJELCBvbGRNb3ZlUmVtYWluaW5nU3RhcnRzRm9yd2FyZCwgTU9WRV9SRU1BSU5JTkdfU1RBUlRTX0ZPUldBUkRfRURFRkFVTFQsIG9sZE1vdmVSZW1haW5pbmdTdGFydHNGb3J3YXJkRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0TW92ZVJlbWFpbmluZ1N0YXJ0c0ZvcndhcmQoKSB7Ci0JCXJldHVybiBtb3ZlUmVtYWluaW5nU3RhcnRzRm9yd2FyZEVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNNb3ZlQ29tcGxldGVkRW5kc0ZvcndhcmQoKSB7Ci0JCXJldHVybiBtb3ZlQ29tcGxldGVkRW5kc0ZvcndhcmQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TW92ZUNvbXBsZXRlZEVuZHNGb3J3YXJkKGJvb2xlYW4gbmV3TW92ZUNvbXBsZXRlZEVuZHNGb3J3YXJkKSB7Ci0JCWJvb2xlYW4gb2xkTW92ZUNvbXBsZXRlZEVuZHNGb3J3YXJkID0gbW92ZUNvbXBsZXRlZEVuZHNGb3J3YXJkOwotCQltb3ZlQ29tcGxldGVkRW5kc0ZvcndhcmQgPSBuZXdNb3ZlQ29tcGxldGVkRW5kc0ZvcndhcmQ7Ci0JCWJvb2xlYW4gb2xkTW92ZUNvbXBsZXRlZEVuZHNGb3J3YXJkRVNldCA9IG1vdmVDb21wbGV0ZWRFbmRzRm9yd2FyZEVTZXQ7Ci0JCW1vdmVDb21wbGV0ZWRFbmRzRm9yd2FyZEVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX01PVkVfQ09NUExFVEVEX0VORFNfRk9SV0FSRCwgb2xkTW92ZUNvbXBsZXRlZEVuZHNGb3J3YXJkLCBtb3ZlQ29tcGxldGVkRW5kc0ZvcndhcmQsICFvbGRNb3ZlQ29tcGxldGVkRW5kc0ZvcndhcmRFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRNb3ZlQ29tcGxldGVkRW5kc0ZvcndhcmQoKSB7Ci0JCWJvb2xlYW4gb2xkTW92ZUNvbXBsZXRlZEVuZHNGb3J3YXJkID0gbW92ZUNvbXBsZXRlZEVuZHNGb3J3YXJkOwotCQlib29sZWFuIG9sZE1vdmVDb21wbGV0ZWRFbmRzRm9yd2FyZEVTZXQgPSBtb3ZlQ29tcGxldGVkRW5kc0ZvcndhcmRFU2V0OwotCQltb3ZlQ29tcGxldGVkRW5kc0ZvcndhcmQgPSBNT1ZFX0NPTVBMRVRFRF9FTkRTX0ZPUldBUkRfRURFRkFVTFQ7Ci0JCW1vdmVDb21wbGV0ZWRFbmRzRm9yd2FyZEVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX01PVkVfQ09NUExFVEVEX0VORFNfRk9SV0FSRCwgb2xkTW92ZUNvbXBsZXRlZEVuZHNGb3J3YXJkLCBNT1ZFX0NPTVBMRVRFRF9FTkRTX0ZPUldBUkRfRURFRkFVTFQsIG9sZE1vdmVDb21wbGV0ZWRFbmRzRm9yd2FyZEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldE1vdmVDb21wbGV0ZWRFbmRzRm9yd2FyZCgpIHsKLQkJcmV0dXJuIG1vdmVDb21wbGV0ZWRFbmRzRm9yd2FyZEVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0QmFzZWxpbmVGb3JFYXJuZWRWYWx1ZSgpIHsKLQkJcmV0dXJuIGJhc2VsaW5lRm9yRWFybmVkVmFsdWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QmFzZWxpbmVGb3JFYXJuZWRWYWx1ZShCaWdJbnRlZ2VyIG5ld0Jhc2VsaW5lRm9yRWFybmVkVmFsdWUpIHsKLQkJQmlnSW50ZWdlciBvbGRCYXNlbGluZUZvckVhcm5lZFZhbHVlID0gYmFzZWxpbmVGb3JFYXJuZWRWYWx1ZTsKLQkJYmFzZWxpbmVGb3JFYXJuZWRWYWx1ZSA9IG5ld0Jhc2VsaW5lRm9yRWFybmVkVmFsdWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fQkFTRUxJTkVfRk9SX0VBUk5FRF9WQUxVRSwgb2xkQmFzZWxpbmVGb3JFYXJuZWRWYWx1ZSwgYmFzZWxpbmVGb3JFYXJuZWRWYWx1ZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQXV0b0FkZE5ld1Jlc291cmNlc0FuZFRhc2tzKCkgewotCQlyZXR1cm4gYXV0b0FkZE5ld1Jlc291cmNlc0FuZFRhc2tzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEF1dG9BZGROZXdSZXNvdXJjZXNBbmRUYXNrcyhib29sZWFuIG5ld0F1dG9BZGROZXdSZXNvdXJjZXNBbmRUYXNrcykgewotCQlib29sZWFuIG9sZEF1dG9BZGROZXdSZXNvdXJjZXNBbmRUYXNrcyA9IGF1dG9BZGROZXdSZXNvdXJjZXNBbmRUYXNrczsKLQkJYXV0b0FkZE5ld1Jlc291cmNlc0FuZFRhc2tzID0gbmV3QXV0b0FkZE5ld1Jlc291cmNlc0FuZFRhc2tzOwotCQlib29sZWFuIG9sZEF1dG9BZGROZXdSZXNvdXJjZXNBbmRUYXNrc0VTZXQgPSBhdXRvQWRkTmV3UmVzb3VyY2VzQW5kVGFza3NFU2V0OwotCQlhdXRvQWRkTmV3UmVzb3VyY2VzQW5kVGFza3NFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19BVVRPX0FERF9ORVdfUkVTT1VSQ0VTX0FORF9UQVNLUywgb2xkQXV0b0FkZE5ld1Jlc291cmNlc0FuZFRhc2tzLCBhdXRvQWRkTmV3UmVzb3VyY2VzQW5kVGFza3MsICFvbGRBdXRvQWRkTmV3UmVzb3VyY2VzQW5kVGFza3NFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRBdXRvQWRkTmV3UmVzb3VyY2VzQW5kVGFza3MoKSB7Ci0JCWJvb2xlYW4gb2xkQXV0b0FkZE5ld1Jlc291cmNlc0FuZFRhc2tzID0gYXV0b0FkZE5ld1Jlc291cmNlc0FuZFRhc2tzOwotCQlib29sZWFuIG9sZEF1dG9BZGROZXdSZXNvdXJjZXNBbmRUYXNrc0VTZXQgPSBhdXRvQWRkTmV3UmVzb3VyY2VzQW5kVGFza3NFU2V0OwotCQlhdXRvQWRkTmV3UmVzb3VyY2VzQW5kVGFza3MgPSBBVVRPX0FERF9ORVdfUkVTT1VSQ0VTX0FORF9UQVNLU19FREVGQVVMVDsKLQkJYXV0b0FkZE5ld1Jlc291cmNlc0FuZFRhc2tzRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fQVVUT19BRERfTkVXX1JFU09VUkNFU19BTkRfVEFTS1MsIG9sZEF1dG9BZGROZXdSZXNvdXJjZXNBbmRUYXNrcywgQVVUT19BRERfTkVXX1JFU09VUkNFU19BTkRfVEFTS1NfRURFRkFVTFQsIG9sZEF1dG9BZGROZXdSZXNvdXJjZXNBbmRUYXNrc0VTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldEF1dG9BZGROZXdSZXNvdXJjZXNBbmRUYXNrcygpIHsKLQkJcmV0dXJuIGF1dG9BZGROZXdSZXNvdXJjZXNBbmRUYXNrc0VTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRTdGF0dXNEYXRlKCkgewotCQlyZXR1cm4gc3RhdHVzRGF0ZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTdGF0dXNEYXRlKE9iamVjdCBuZXdTdGF0dXNEYXRlKSB7Ci0JCU9iamVjdCBvbGRTdGF0dXNEYXRlID0gc3RhdHVzRGF0ZTsKLQkJc3RhdHVzRGF0ZSA9IG5ld1N0YXR1c0RhdGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fU1RBVFVTX0RBVEUsIG9sZFN0YXR1c0RhdGUsIHN0YXR1c0RhdGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEN1cnJlbnREYXRlKCkgewotCQlyZXR1cm4gY3VycmVudERhdGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q3VycmVudERhdGUoT2JqZWN0IG5ld0N1cnJlbnREYXRlKSB7Ci0JCU9iamVjdCBvbGRDdXJyZW50RGF0ZSA9IGN1cnJlbnREYXRlOwotCQljdXJyZW50RGF0ZSA9IG5ld0N1cnJlbnREYXRlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0NVUlJFTlRfREFURSwgb2xkQ3VycmVudERhdGUsIGN1cnJlbnREYXRlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNNaWNyb3NvZnRQcm9qZWN0U2VydmVyVVJMKCkgewotCQlyZXR1cm4gbWljcm9zb2Z0UHJvamVjdFNlcnZlclVSTDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNaWNyb3NvZnRQcm9qZWN0U2VydmVyVVJMKGJvb2xlYW4gbmV3TWljcm9zb2Z0UHJvamVjdFNlcnZlclVSTCkgewotCQlib29sZWFuIG9sZE1pY3Jvc29mdFByb2plY3RTZXJ2ZXJVUkwgPSBtaWNyb3NvZnRQcm9qZWN0U2VydmVyVVJMOwotCQltaWNyb3NvZnRQcm9qZWN0U2VydmVyVVJMID0gbmV3TWljcm9zb2Z0UHJvamVjdFNlcnZlclVSTDsKLQkJYm9vbGVhbiBvbGRNaWNyb3NvZnRQcm9qZWN0U2VydmVyVVJMRVNldCA9IG1pY3Jvc29mdFByb2plY3RTZXJ2ZXJVUkxFU2V0OwotCQltaWNyb3NvZnRQcm9qZWN0U2VydmVyVVJMRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fTUlDUk9TT0ZUX1BST0pFQ1RfU0VSVkVSX1VSTCwgb2xkTWljcm9zb2Z0UHJvamVjdFNlcnZlclVSTCwgbWljcm9zb2Z0UHJvamVjdFNlcnZlclVSTCwgIW9sZE1pY3Jvc29mdFByb2plY3RTZXJ2ZXJVUkxFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRNaWNyb3NvZnRQcm9qZWN0U2VydmVyVVJMKCkgewotCQlib29sZWFuIG9sZE1pY3Jvc29mdFByb2plY3RTZXJ2ZXJVUkwgPSBtaWNyb3NvZnRQcm9qZWN0U2VydmVyVVJMOwotCQlib29sZWFuIG9sZE1pY3Jvc29mdFByb2plY3RTZXJ2ZXJVUkxFU2V0ID0gbWljcm9zb2Z0UHJvamVjdFNlcnZlclVSTEVTZXQ7Ci0JCW1pY3Jvc29mdFByb2plY3RTZXJ2ZXJVUkwgPSBNSUNST1NPRlRfUFJPSkVDVF9TRVJWRVJfVVJMX0VERUZBVUxUOwotCQltaWNyb3NvZnRQcm9qZWN0U2VydmVyVVJMRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fTUlDUk9TT0ZUX1BST0pFQ1RfU0VSVkVSX1VSTCwgb2xkTWljcm9zb2Z0UHJvamVjdFNlcnZlclVSTCwgTUlDUk9TT0ZUX1BST0pFQ1RfU0VSVkVSX1VSTF9FREVGQVVMVCwgb2xkTWljcm9zb2Z0UHJvamVjdFNlcnZlclVSTEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldE1pY3Jvc29mdFByb2plY3RTZXJ2ZXJVUkwoKSB7Ci0JCXJldHVybiBtaWNyb3NvZnRQcm9qZWN0U2VydmVyVVJMRVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0F1dG9saW5rKCkgewotCQlyZXR1cm4gYXV0b2xpbms7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QXV0b2xpbmsoYm9vbGVhbiBuZXdBdXRvbGluaykgewotCQlib29sZWFuIG9sZEF1dG9saW5rID0gYXV0b2xpbms7Ci0JCWF1dG9saW5rID0gbmV3QXV0b2xpbms7Ci0JCWJvb2xlYW4gb2xkQXV0b2xpbmtFU2V0ID0gYXV0b2xpbmtFU2V0OwotCQlhdXRvbGlua0VTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0FVVE9MSU5LLCBvbGRBdXRvbGluaywgYXV0b2xpbmssICFvbGRBdXRvbGlua0VTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldEF1dG9saW5rKCkgewotCQlib29sZWFuIG9sZEF1dG9saW5rID0gYXV0b2xpbms7Ci0JCWJvb2xlYW4gb2xkQXV0b2xpbmtFU2V0ID0gYXV0b2xpbmtFU2V0OwotCQlhdXRvbGluayA9IEFVVE9MSU5LX0VERUZBVUxUOwotCQlhdXRvbGlua0VTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0FVVE9MSU5LLCBvbGRBdXRvbGluaywgQVVUT0xJTktfRURFRkFVTFQsIG9sZEF1dG9saW5rRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0QXV0b2xpbmsoKSB7Ci0JCXJldHVybiBhdXRvbGlua0VTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0TmV3VGFza1N0YXJ0RGF0ZSgpIHsKLQkJcmV0dXJuIG5ld1Rhc2tTdGFydERhdGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TmV3VGFza1N0YXJ0RGF0ZShCaWdJbnRlZ2VyIG5ld05ld1Rhc2tTdGFydERhdGUpIHsKLQkJQmlnSW50ZWdlciBvbGROZXdUYXNrU3RhcnREYXRlID0gbmV3VGFza1N0YXJ0RGF0ZTsKLQkJbmV3VGFza1N0YXJ0RGF0ZSA9IG5ld05ld1Rhc2tTdGFydERhdGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fTkVXX1RBU0tfU1RBUlRfREFURSwgb2xkTmV3VGFza1N0YXJ0RGF0ZSwgbmV3VGFza1N0YXJ0RGF0ZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGdldERlZmF1bHRUYXNrRVZNZXRob2QoKSB7Ci0JCXJldHVybiBkZWZhdWx0VGFza0VWTWV0aG9kOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlZmF1bHRUYXNrRVZNZXRob2QoQmlnSW50ZWdlciBuZXdEZWZhdWx0VGFza0VWTWV0aG9kKSB7Ci0JCUJpZ0ludGVnZXIgb2xkRGVmYXVsdFRhc2tFVk1ldGhvZCA9IGRlZmF1bHRUYXNrRVZNZXRob2Q7Ci0JCWRlZmF1bHRUYXNrRVZNZXRob2QgPSBuZXdEZWZhdWx0VGFza0VWTWV0aG9kOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0RFRkFVTFRfVEFTS19FVl9NRVRIT0QsIG9sZERlZmF1bHRUYXNrRVZNZXRob2QsIGRlZmF1bHRUYXNrRVZNZXRob2QpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1Byb2plY3RFeHRlcm5hbGx5RWRpdGVkKCkgewotCQlyZXR1cm4gcHJvamVjdEV4dGVybmFsbHlFZGl0ZWQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHJvamVjdEV4dGVybmFsbHlFZGl0ZWQoYm9vbGVhbiBuZXdQcm9qZWN0RXh0ZXJuYWxseUVkaXRlZCkgewotCQlib29sZWFuIG9sZFByb2plY3RFeHRlcm5hbGx5RWRpdGVkID0gcHJvamVjdEV4dGVybmFsbHlFZGl0ZWQ7Ci0JCXByb2plY3RFeHRlcm5hbGx5RWRpdGVkID0gbmV3UHJvamVjdEV4dGVybmFsbHlFZGl0ZWQ7Ci0JCWJvb2xlYW4gb2xkUHJvamVjdEV4dGVybmFsbHlFZGl0ZWRFU2V0ID0gcHJvamVjdEV4dGVybmFsbHlFZGl0ZWRFU2V0OwotCQlwcm9qZWN0RXh0ZXJuYWxseUVkaXRlZEVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX1BST0pFQ1RfRVhURVJOQUxMWV9FRElURUQsIG9sZFByb2plY3RFeHRlcm5hbGx5RWRpdGVkLCBwcm9qZWN0RXh0ZXJuYWxseUVkaXRlZCwgIW9sZFByb2plY3RFeHRlcm5hbGx5RWRpdGVkRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0UHJvamVjdEV4dGVybmFsbHlFZGl0ZWQoKSB7Ci0JCWJvb2xlYW4gb2xkUHJvamVjdEV4dGVybmFsbHlFZGl0ZWQgPSBwcm9qZWN0RXh0ZXJuYWxseUVkaXRlZDsKLQkJYm9vbGVhbiBvbGRQcm9qZWN0RXh0ZXJuYWxseUVkaXRlZEVTZXQgPSBwcm9qZWN0RXh0ZXJuYWxseUVkaXRlZEVTZXQ7Ci0JCXByb2plY3RFeHRlcm5hbGx5RWRpdGVkID0gUFJPSkVDVF9FWFRFUk5BTExZX0VESVRFRF9FREVGQVVMVDsKLQkJcHJvamVjdEV4dGVybmFsbHlFZGl0ZWRFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19QUk9KRUNUX0VYVEVSTkFMTFlfRURJVEVELCBvbGRQcm9qZWN0RXh0ZXJuYWxseUVkaXRlZCwgUFJPSkVDVF9FWFRFUk5BTExZX0VESVRFRF9FREVGQVVMVCwgb2xkUHJvamVjdEV4dGVybmFsbHlFZGl0ZWRFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRQcm9qZWN0RXh0ZXJuYWxseUVkaXRlZCgpIHsKLQkJcmV0dXJuIHByb2plY3RFeHRlcm5hbGx5RWRpdGVkRVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEV4dGVuZGVkQ3JlYXRpb25EYXRlKCkgewotCQlyZXR1cm4gZXh0ZW5kZWRDcmVhdGlvbkRhdGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RXh0ZW5kZWRDcmVhdGlvbkRhdGUoT2JqZWN0IG5ld0V4dGVuZGVkQ3JlYXRpb25EYXRlKSB7Ci0JCU9iamVjdCBvbGRFeHRlbmRlZENyZWF0aW9uRGF0ZSA9IGV4dGVuZGVkQ3JlYXRpb25EYXRlOwotCQlleHRlbmRlZENyZWF0aW9uRGF0ZSA9IG5ld0V4dGVuZGVkQ3JlYXRpb25EYXRlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0VYVEVOREVEX0NSRUFUSU9OX0RBVEUsIG9sZEV4dGVuZGVkQ3JlYXRpb25EYXRlLCBleHRlbmRlZENyZWF0aW9uRGF0ZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQWN0dWFsc0luU3luYygpIHsKLQkJcmV0dXJuIGFjdHVhbHNJblN5bmM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QWN0dWFsc0luU3luYyhib29sZWFuIG5ld0FjdHVhbHNJblN5bmMpIHsKLQkJYm9vbGVhbiBvbGRBY3R1YWxzSW5TeW5jID0gYWN0dWFsc0luU3luYzsKLQkJYWN0dWFsc0luU3luYyA9IG5ld0FjdHVhbHNJblN5bmM7Ci0JCWJvb2xlYW4gb2xkQWN0dWFsc0luU3luY0VTZXQgPSBhY3R1YWxzSW5TeW5jRVNldDsKLQkJYWN0dWFsc0luU3luY0VTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0FDVFVBTFNfSU5fU1lOQywgb2xkQWN0dWFsc0luU3luYywgYWN0dWFsc0luU3luYywgIW9sZEFjdHVhbHNJblN5bmNFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRBY3R1YWxzSW5TeW5jKCkgewotCQlib29sZWFuIG9sZEFjdHVhbHNJblN5bmMgPSBhY3R1YWxzSW5TeW5jOwotCQlib29sZWFuIG9sZEFjdHVhbHNJblN5bmNFU2V0ID0gYWN0dWFsc0luU3luY0VTZXQ7Ci0JCWFjdHVhbHNJblN5bmMgPSBBQ1RVQUxTX0lOX1NZTkNfRURFRkFVTFQ7Ci0JCWFjdHVhbHNJblN5bmNFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19BQ1RVQUxTX0lOX1NZTkMsIG9sZEFjdHVhbHNJblN5bmMsIEFDVFVBTFNfSU5fU1lOQ19FREVGQVVMVCwgb2xkQWN0dWFsc0luU3luY0VTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldEFjdHVhbHNJblN5bmMoKSB7Ci0JCXJldHVybiBhY3R1YWxzSW5TeW5jRVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1JlbW92ZUZpbGVQcm9wZXJ0aWVzKCkgewotCQlyZXR1cm4gcmVtb3ZlRmlsZVByb3BlcnRpZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmVtb3ZlRmlsZVByb3BlcnRpZXMoYm9vbGVhbiBuZXdSZW1vdmVGaWxlUHJvcGVydGllcykgewotCQlib29sZWFuIG9sZFJlbW92ZUZpbGVQcm9wZXJ0aWVzID0gcmVtb3ZlRmlsZVByb3BlcnRpZXM7Ci0JCXJlbW92ZUZpbGVQcm9wZXJ0aWVzID0gbmV3UmVtb3ZlRmlsZVByb3BlcnRpZXM7Ci0JCWJvb2xlYW4gb2xkUmVtb3ZlRmlsZVByb3BlcnRpZXNFU2V0ID0gcmVtb3ZlRmlsZVByb3BlcnRpZXNFU2V0OwotCQlyZW1vdmVGaWxlUHJvcGVydGllc0VTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX1JFTU9WRV9GSUxFX1BST1BFUlRJRVMsIG9sZFJlbW92ZUZpbGVQcm9wZXJ0aWVzLCByZW1vdmVGaWxlUHJvcGVydGllcywgIW9sZFJlbW92ZUZpbGVQcm9wZXJ0aWVzRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0UmVtb3ZlRmlsZVByb3BlcnRpZXMoKSB7Ci0JCWJvb2xlYW4gb2xkUmVtb3ZlRmlsZVByb3BlcnRpZXMgPSByZW1vdmVGaWxlUHJvcGVydGllczsKLQkJYm9vbGVhbiBvbGRSZW1vdmVGaWxlUHJvcGVydGllc0VTZXQgPSByZW1vdmVGaWxlUHJvcGVydGllc0VTZXQ7Ci0JCXJlbW92ZUZpbGVQcm9wZXJ0aWVzID0gUkVNT1ZFX0ZJTEVfUFJPUEVSVElFU19FREVGQVVMVDsKLQkJcmVtb3ZlRmlsZVByb3BlcnRpZXNFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19SRU1PVkVfRklMRV9QUk9QRVJUSUVTLCBvbGRSZW1vdmVGaWxlUHJvcGVydGllcywgUkVNT1ZFX0ZJTEVfUFJPUEVSVElFU19FREVGQVVMVCwgb2xkUmVtb3ZlRmlsZVByb3BlcnRpZXNFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRSZW1vdmVGaWxlUHJvcGVydGllcygpIHsKLQkJcmV0dXJuIHJlbW92ZUZpbGVQcm9wZXJ0aWVzRVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0FkbWluUHJvamVjdCgpIHsKLQkJcmV0dXJuIGFkbWluUHJvamVjdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBZG1pblByb2plY3QoYm9vbGVhbiBuZXdBZG1pblByb2plY3QpIHsKLQkJYm9vbGVhbiBvbGRBZG1pblByb2plY3QgPSBhZG1pblByb2plY3Q7Ci0JCWFkbWluUHJvamVjdCA9IG5ld0FkbWluUHJvamVjdDsKLQkJYm9vbGVhbiBvbGRBZG1pblByb2plY3RFU2V0ID0gYWRtaW5Qcm9qZWN0RVNldDsKLQkJYWRtaW5Qcm9qZWN0RVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fQURNSU5fUFJPSkVDVCwgb2xkQWRtaW5Qcm9qZWN0LCBhZG1pblByb2plY3QsICFvbGRBZG1pblByb2plY3RFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRBZG1pblByb2plY3QoKSB7Ci0JCWJvb2xlYW4gb2xkQWRtaW5Qcm9qZWN0ID0gYWRtaW5Qcm9qZWN0OwotCQlib29sZWFuIG9sZEFkbWluUHJvamVjdEVTZXQgPSBhZG1pblByb2plY3RFU2V0OwotCQlhZG1pblByb2plY3QgPSBBRE1JTl9QUk9KRUNUX0VERUZBVUxUOwotCQlhZG1pblByb2plY3RFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19BRE1JTl9QUk9KRUNULCBvbGRBZG1pblByb2plY3QsIEFETUlOX1BST0pFQ1RfRURFRkFVTFQsIG9sZEFkbWluUHJvamVjdEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldEFkbWluUHJvamVjdCgpIHsKLQkJcmV0dXJuIGFkbWluUHJvamVjdEVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE91dGxpbmVDb2RlcyBnZXRPdXRsaW5lQ29kZXMoKSB7Ci0JCXJldHVybiBvdXRsaW5lQ29kZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0T3V0bGluZUNvZGVzKE91dGxpbmVDb2RlcyBuZXdPdXRsaW5lQ29kZXMsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJT3V0bGluZUNvZGVzIG9sZE91dGxpbmVDb2RlcyA9IG91dGxpbmVDb2RlczsKLQkJb3V0bGluZUNvZGVzID0gbmV3T3V0bGluZUNvZGVzOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX09VVExJTkVfQ09ERVMsIG9sZE91dGxpbmVDb2RlcywgbmV3T3V0bGluZUNvZGVzKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRPdXRsaW5lQ29kZXMoT3V0bGluZUNvZGVzIG5ld091dGxpbmVDb2RlcykgewotCQlpZiAobmV3T3V0bGluZUNvZGVzICE9IG91dGxpbmVDb2RlcykgewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAob3V0bGluZUNvZGVzICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW91dGxpbmVDb2RlcykuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fT1VUTElORV9DT0RFUywgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3T3V0bGluZUNvZGVzICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld091dGxpbmVDb2RlcykuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fT1VUTElORV9DT0RFUywgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRPdXRsaW5lQ29kZXMobmV3T3V0bGluZUNvZGVzLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fT1VUTElORV9DT0RFUywgbmV3T3V0bGluZUNvZGVzLCBuZXdPdXRsaW5lQ29kZXMpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgV0JTTWFza3MgZ2V0V0JTTWFza3MoKSB7Ci0JCXJldHVybiB3QlNNYXNrczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRXQlNNYXNrcyhXQlNNYXNrcyBuZXdXQlNNYXNrcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlXQlNNYXNrcyBvbGRXQlNNYXNrcyA9IHdCU01hc2tzOwotCQl3QlNNYXNrcyA9IG5ld1dCU01hc2tzOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX1dCU19NQVNLUywgb2xkV0JTTWFza3MsIG5ld1dCU01hc2tzKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRXQlNNYXNrcyhXQlNNYXNrcyBuZXdXQlNNYXNrcykgewotCQlpZiAobmV3V0JTTWFza3MgIT0gd0JTTWFza3MpIHsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKHdCU01hc2tzICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KXdCU01hc2tzKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19XQlNfTUFTS1MsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld1dCU01hc2tzICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld1dCU01hc2tzKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19XQlNfTUFTS1MsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0V0JTTWFza3MobmV3V0JTTWFza3MsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19XQlNfTUFTS1MsIG5ld1dCU01hc2tzLCBuZXdXQlNNYXNrcykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFeHRlbmRlZEF0dHJpYnV0ZXMgZ2V0RXh0ZW5kZWRBdHRyaWJ1dGVzKCkgewotCQlyZXR1cm4gZXh0ZW5kZWRBdHRyaWJ1dGVzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldEV4dGVuZGVkQXR0cmlidXRlcyhFeHRlbmRlZEF0dHJpYnV0ZXMgbmV3RXh0ZW5kZWRBdHRyaWJ1dGVzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCUV4dGVuZGVkQXR0cmlidXRlcyBvbGRFeHRlbmRlZEF0dHJpYnV0ZXMgPSBleHRlbmRlZEF0dHJpYnV0ZXM7Ci0JCWV4dGVuZGVkQXR0cmlidXRlcyA9IG5ld0V4dGVuZGVkQXR0cmlidXRlczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19FWFRFTkRFRF9BVFRSSUJVVEVTLCBvbGRFeHRlbmRlZEF0dHJpYnV0ZXMsIG5ld0V4dGVuZGVkQXR0cmlidXRlcyk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RXh0ZW5kZWRBdHRyaWJ1dGVzKEV4dGVuZGVkQXR0cmlidXRlcyBuZXdFeHRlbmRlZEF0dHJpYnV0ZXMpIHsKLQkJaWYgKG5ld0V4dGVuZGVkQXR0cmlidXRlcyAhPSBleHRlbmRlZEF0dHJpYnV0ZXMpIHsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGV4dGVuZGVkQXR0cmlidXRlcyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClleHRlbmRlZEF0dHJpYnV0ZXMpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0VYVEVOREVEX0FUVFJJQlVURVMsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld0V4dGVuZGVkQXR0cmlidXRlcyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdFeHRlbmRlZEF0dHJpYnV0ZXMpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0VYVEVOREVEX0FUVFJJQlVURVMsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0RXh0ZW5kZWRBdHRyaWJ1dGVzKG5ld0V4dGVuZGVkQXR0cmlidXRlcywgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0VYVEVOREVEX0FUVFJJQlVURVMsIG5ld0V4dGVuZGVkQXR0cmlidXRlcywgbmV3RXh0ZW5kZWRBdHRyaWJ1dGVzKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENhbGVuZGFycyBnZXRDYWxlbmRhcnMoKSB7Ci0JCXJldHVybiBjYWxlbmRhcnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0Q2FsZW5kYXJzKENhbGVuZGFycyBuZXdDYWxlbmRhcnMsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJQ2FsZW5kYXJzIG9sZENhbGVuZGFycyA9IGNhbGVuZGFyczsKLQkJY2FsZW5kYXJzID0gbmV3Q2FsZW5kYXJzOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0NBTEVOREFSUywgb2xkQ2FsZW5kYXJzLCBuZXdDYWxlbmRhcnMpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENhbGVuZGFycyhDYWxlbmRhcnMgbmV3Q2FsZW5kYXJzKSB7Ci0JCWlmIChuZXdDYWxlbmRhcnMgIT0gY2FsZW5kYXJzKSB7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChjYWxlbmRhcnMgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpY2FsZW5kYXJzKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19DQUxFTkRBUlMsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld0NhbGVuZGFycyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdDYWxlbmRhcnMpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0NBTEVOREFSUywgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRDYWxlbmRhcnMobmV3Q2FsZW5kYXJzLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fQ0FMRU5EQVJTLCBuZXdDYWxlbmRhcnMsIG5ld0NhbGVuZGFycykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUYXNrcyBnZXRUYXNrcygpIHsKLQkJcmV0dXJuIHRhc2tzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldFRhc2tzKFRhc2tzIG5ld1Rhc2tzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCVRhc2tzIG9sZFRhc2tzID0gdGFza3M7Ci0JCXRhc2tzID0gbmV3VGFza3M7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fVEFTS1MsIG9sZFRhc2tzLCBuZXdUYXNrcyk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VGFza3MoVGFza3MgbmV3VGFza3MpIHsKLQkJaWYgKG5ld1Rhc2tzICE9IHRhc2tzKSB7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmICh0YXNrcyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCl0YXNrcykuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fVEFTS1MsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld1Rhc2tzICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld1Rhc2tzKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19UQVNLUywgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRUYXNrcyhuZXdUYXNrcywgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX1RBU0tTLCBuZXdUYXNrcywgbmV3VGFza3MpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VzIGdldFJlc291cmNlcygpIHsKLQkJcmV0dXJuIHJlc291cmNlczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRSZXNvdXJjZXMoUmVzb3VyY2VzIG5ld1Jlc291cmNlcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlSZXNvdXJjZXMgb2xkUmVzb3VyY2VzID0gcmVzb3VyY2VzOwotCQlyZXNvdXJjZXMgPSBuZXdSZXNvdXJjZXM7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fUkVTT1VSQ0VTLCBvbGRSZXNvdXJjZXMsIG5ld1Jlc291cmNlcyk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmVzb3VyY2VzKFJlc291cmNlcyBuZXdSZXNvdXJjZXMpIHsKLQkJaWYgKG5ld1Jlc291cmNlcyAhPSByZXNvdXJjZXMpIHsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKHJlc291cmNlcyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClyZXNvdXJjZXMpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX1JFU09VUkNFUywgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3UmVzb3VyY2VzICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld1Jlc291cmNlcykuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fUkVTT1VSQ0VTLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldFJlc291cmNlcyhuZXdSZXNvdXJjZXMsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19SRVNPVVJDRVMsIG5ld1Jlc291cmNlcywgbmV3UmVzb3VyY2VzKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFzc2lnbm1lbnRzIGdldEFzc2lnbm1lbnRzKCkgewotCQlyZXR1cm4gYXNzaWdubWVudHM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0QXNzaWdubWVudHMoQXNzaWdubWVudHMgbmV3QXNzaWdubWVudHMsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJQXNzaWdubWVudHMgb2xkQXNzaWdubWVudHMgPSBhc3NpZ25tZW50czsKLQkJYXNzaWdubWVudHMgPSBuZXdBc3NpZ25tZW50czsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19BU1NJR05NRU5UUywgb2xkQXNzaWdubWVudHMsIG5ld0Fzc2lnbm1lbnRzKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBc3NpZ25tZW50cyhBc3NpZ25tZW50cyBuZXdBc3NpZ25tZW50cykgewotCQlpZiAobmV3QXNzaWdubWVudHMgIT0gYXNzaWdubWVudHMpIHsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGFzc2lnbm1lbnRzICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KWFzc2lnbm1lbnRzKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19BU1NJR05NRU5UUywgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3QXNzaWdubWVudHMgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3QXNzaWdubWVudHMpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0FTU0lHTk1FTlRTLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldEFzc2lnbm1lbnRzKG5ld0Fzc2lnbm1lbnRzLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fQVNTSUdOTUVOVFMsIG5ld0Fzc2lnbm1lbnRzLCBuZXdBc3NpZ25tZW50cykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19PVVRMSU5FX0NPREVTOgotCQkJCQlyZXR1cm4gYmFzaWNTZXRPdXRsaW5lQ29kZXMobnVsbCwgbXNncyk7Ci0JCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX1dCU19NQVNLUzoKLQkJCQkJcmV0dXJuIGJhc2ljU2V0V0JTTWFza3MobnVsbCwgbXNncyk7Ci0JCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0VYVEVOREVEX0FUVFJJQlVURVM6Ci0JCQkJCXJldHVybiBiYXNpY1NldEV4dGVuZGVkQXR0cmlidXRlcyhudWxsLCBtc2dzKTsKLQkJCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fQ0FMRU5EQVJTOgotCQkJCQlyZXR1cm4gYmFzaWNTZXRDYWxlbmRhcnMobnVsbCwgbXNncyk7Ci0JCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX1RBU0tTOgotCQkJCQlyZXR1cm4gYmFzaWNTZXRUYXNrcyhudWxsLCBtc2dzKTsKLQkJCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fUkVTT1VSQ0VTOgotCQkJCQlyZXR1cm4gYmFzaWNTZXRSZXNvdXJjZXMobnVsbCwgbXNncyk7Ci0JCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0FTU0lHTk1FTlRTOgotCQkJCQlyZXR1cm4gYmFzaWNTZXRBc3NpZ25tZW50cyhudWxsLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19VSUQ6Ci0JCQkJcmV0dXJuIGdldFVJRCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX05BTUU6Ci0JCQkJcmV0dXJuIGdldE5hbWUoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19USVRMRToKLQkJCQlyZXR1cm4gZ2V0VGl0bGUoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19TVUJKRUNUOgotCQkJCXJldHVybiBnZXRTdWJqZWN0KCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fQ0FURUdPUlk6Ci0JCQkJcmV0dXJuIGdldENhdGVnb3J5KCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fQ09NUEFOWToKLQkJCQlyZXR1cm4gZ2V0Q29tcGFueSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX01BTkFHRVI6Ci0JCQkJcmV0dXJuIGdldE1hbmFnZXIoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19BVVRIT1I6Ci0JCQkJcmV0dXJuIGdldEF1dGhvcigpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0NSRUFUSU9OX0RBVEU6Ci0JCQkJcmV0dXJuIGdldENyZWF0aW9uRGF0ZSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX1JFVklTSU9OOgotCQkJCXJldHVybiBnZXRSZXZpc2lvbigpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0xBU1RfU0FWRUQ6Ci0JCQkJcmV0dXJuIGdldExhc3RTYXZlZCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX1NDSEVEVUxFX0ZST01fU1RBUlQ6Ci0JCQkJcmV0dXJuIGlzU2NoZWR1bGVGcm9tU3RhcnQoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fU1RBUlRfREFURToKLQkJCQlyZXR1cm4gZ2V0U3RhcnREYXRlKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fRklOSVNIX0RBVEU6Ci0JCQkJcmV0dXJuIGdldEZpbmlzaERhdGUoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19GWVNUQVJUX0RBVEU6Ci0JCQkJcmV0dXJuIGdldEZZU3RhcnREYXRlKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fQ1JJVElDQUxfU0xBQ0tfTElNSVQ6Ci0JCQkJcmV0dXJuIGdldENyaXRpY2FsU2xhY2tMaW1pdCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0NVUlJFTkNZX0RJR0lUUzoKLQkJCQlyZXR1cm4gZ2V0Q3VycmVuY3lEaWdpdHMoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19DVVJSRU5DWV9TWU1CT0w6Ci0JCQkJcmV0dXJuIGdldEN1cnJlbmN5U3ltYm9sKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fQ1VSUkVOQ1lfU1lNQk9MX1BPU0lUSU9OOgotCQkJCXJldHVybiBnZXRDdXJyZW5jeVN5bWJvbFBvc2l0aW9uKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fQ0FMRU5EQVJfVUlEOgotCQkJCXJldHVybiBnZXRDYWxlbmRhclVJRCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0RFRkFVTFRfU1RBUlRfVElNRToKLQkJCQlyZXR1cm4gZ2V0RGVmYXVsdFN0YXJ0VGltZSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0RFRkFVTFRfRklOSVNIX1RJTUU6Ci0JCQkJcmV0dXJuIGdldERlZmF1bHRGaW5pc2hUaW1lKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fTUlOVVRFU19QRVJfREFZOgotCQkJCXJldHVybiBnZXRNaW51dGVzUGVyRGF5KCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fTUlOVVRFU19QRVJfV0VFSzoKLQkJCQlyZXR1cm4gZ2V0TWludXRlc1BlcldlZWsoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19EQVlTX1BFUl9NT05USDoKLQkJCQlyZXR1cm4gZ2V0RGF5c1Blck1vbnRoKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fREVGQVVMVF9UQVNLX1RZUEU6Ci0JCQkJcmV0dXJuIGdldERlZmF1bHRUYXNrVHlwZSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0RFRkFVTFRfRklYRURfQ09TVF9BQ0NSVUFMOgotCQkJCXJldHVybiBnZXREZWZhdWx0Rml4ZWRDb3N0QWNjcnVhbCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0RFRkFVTFRfU1RBTkRBUkRfUkFURToKLQkJCQlyZXR1cm4gbmV3IEZsb2F0KGdldERlZmF1bHRTdGFuZGFyZFJhdGUoKSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fREVGQVVMVF9PVkVSVElNRV9SQVRFOgotCQkJCXJldHVybiBuZXcgRmxvYXQoZ2V0RGVmYXVsdE92ZXJ0aW1lUmF0ZSgpKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19EVVJBVElPTl9GT1JNQVQ6Ci0JCQkJcmV0dXJuIGdldER1cmF0aW9uRm9ybWF0KCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fV09SS19GT1JNQVQ6Ci0JCQkJcmV0dXJuIGdldFdvcmtGb3JtYXQoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19FRElUQUJMRV9BQ1RVQUxfQ09TVFM6Ci0JCQkJcmV0dXJuIGlzRWRpdGFibGVBY3R1YWxDb3N0cygpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19IT05PUl9DT05TVFJBSU5UUzoKLQkJCQlyZXR1cm4gaXNIb25vckNvbnN0cmFpbnRzKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0VBUk5FRF9WQUxVRV9NRVRIT0Q6Ci0JCQkJcmV0dXJuIGdldEVhcm5lZFZhbHVlTWV0aG9kKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fSU5TRVJURURfUFJPSkVDVFNfTElLRV9TVU1NQVJZOgotCQkJCXJldHVybiBpc0luc2VydGVkUHJvamVjdHNMaWtlU3VtbWFyeSgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19NVUxUSVBMRV9DUklUSUNBTF9QQVRIUzoKLQkJCQlyZXR1cm4gaXNNdWx0aXBsZUNyaXRpY2FsUGF0aHMoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fTkVXX1RBU0tTX0VGRk9SVF9EUklWRU46Ci0JCQkJcmV0dXJuIGlzTmV3VGFza3NFZmZvcnREcml2ZW4oKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fTkVXX1RBU0tTX0VTVElNQVRFRDoKLQkJCQlyZXR1cm4gaXNOZXdUYXNrc0VzdGltYXRlZCgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19TUExJVFNfSU5fUFJPR1JFU1NfVEFTS1M6Ci0JCQkJcmV0dXJuIGlzU3BsaXRzSW5Qcm9ncmVzc1Rhc2tzKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX1NQUkVBRF9BQ1RVQUxfQ09TVDoKLQkJCQlyZXR1cm4gaXNTcHJlYWRBY3R1YWxDb3N0KCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX1NQUkVBRF9QRVJDRU5UX0NPTVBMRVRFOgotCQkJCXJldHVybiBpc1NwcmVhZFBlcmNlbnRDb21wbGV0ZSgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19UQVNLX1VQREFURVNfUkVTT1VSQ0U6Ci0JCQkJcmV0dXJuIGlzVGFza1VwZGF0ZXNSZXNvdXJjZSgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19GSVNDQUxfWUVBUl9TVEFSVDoKLQkJCQlyZXR1cm4gaXNGaXNjYWxZZWFyU3RhcnQoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fV0VFS19TVEFSVF9EQVk6Ci0JCQkJcmV0dXJuIGdldFdlZWtTdGFydERheSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX01PVkVfQ09NUExFVEVEX0VORFNfQkFDSzoKLQkJCQlyZXR1cm4gaXNNb3ZlQ29tcGxldGVkRW5kc0JhY2soKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fTU9WRV9SRU1BSU5JTkdfU1RBUlRTX0JBQ0s6Ci0JCQkJcmV0dXJuIGlzTW92ZVJlbWFpbmluZ1N0YXJ0c0JhY2soKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fTU9WRV9SRU1BSU5JTkdfU1RBUlRTX0ZPUldBUkQ6Ci0JCQkJcmV0dXJuIGlzTW92ZVJlbWFpbmluZ1N0YXJ0c0ZvcndhcmQoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fTU9WRV9DT01QTEVURURfRU5EU19GT1JXQVJEOgotCQkJCXJldHVybiBpc01vdmVDb21wbGV0ZWRFbmRzRm9yd2FyZCgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19CQVNFTElORV9GT1JfRUFSTkVEX1ZBTFVFOgotCQkJCXJldHVybiBnZXRCYXNlbGluZUZvckVhcm5lZFZhbHVlKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fQVVUT19BRERfTkVXX1JFU09VUkNFU19BTkRfVEFTS1M6Ci0JCQkJcmV0dXJuIGlzQXV0b0FkZE5ld1Jlc291cmNlc0FuZFRhc2tzKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX1NUQVRVU19EQVRFOgotCQkJCXJldHVybiBnZXRTdGF0dXNEYXRlKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fQ1VSUkVOVF9EQVRFOgotCQkJCXJldHVybiBnZXRDdXJyZW50RGF0ZSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX01JQ1JPU09GVF9QUk9KRUNUX1NFUlZFUl9VUkw6Ci0JCQkJcmV0dXJuIGlzTWljcm9zb2Z0UHJvamVjdFNlcnZlclVSTCgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19BVVRPTElOSzoKLQkJCQlyZXR1cm4gaXNBdXRvbGluaygpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19ORVdfVEFTS19TVEFSVF9EQVRFOgotCQkJCXJldHVybiBnZXROZXdUYXNrU3RhcnREYXRlKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fREVGQVVMVF9UQVNLX0VWX01FVEhPRDoKLQkJCQlyZXR1cm4gZ2V0RGVmYXVsdFRhc2tFVk1ldGhvZCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX1BST0pFQ1RfRVhURVJOQUxMWV9FRElURUQ6Ci0JCQkJcmV0dXJuIGlzUHJvamVjdEV4dGVybmFsbHlFZGl0ZWQoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fRVhURU5ERURfQ1JFQVRJT05fREFURToKLQkJCQlyZXR1cm4gZ2V0RXh0ZW5kZWRDcmVhdGlvbkRhdGUoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19BQ1RVQUxTX0lOX1NZTkM6Ci0JCQkJcmV0dXJuIGlzQWN0dWFsc0luU3luYygpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19SRU1PVkVfRklMRV9QUk9QRVJUSUVTOgotCQkJCXJldHVybiBpc1JlbW92ZUZpbGVQcm9wZXJ0aWVzKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0FETUlOX1BST0pFQ1Q6Ci0JCQkJcmV0dXJuIGlzQWRtaW5Qcm9qZWN0KCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX09VVExJTkVfQ09ERVM6Ci0JCQkJcmV0dXJuIGdldE91dGxpbmVDb2RlcygpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX1dCU19NQVNLUzoKLQkJCQlyZXR1cm4gZ2V0V0JTTWFza3MoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19FWFRFTkRFRF9BVFRSSUJVVEVTOgotCQkJCXJldHVybiBnZXRFeHRlbmRlZEF0dHJpYnV0ZXMoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19DQUxFTkRBUlM6Ci0JCQkJcmV0dXJuIGdldENhbGVuZGFycygpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX1RBU0tTOgotCQkJCXJldHVybiBnZXRUYXNrcygpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX1JFU09VUkNFUzoKLQkJCQlyZXR1cm4gZ2V0UmVzb3VyY2VzKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fQVNTSUdOTUVOVFM6Ci0JCQkJcmV0dXJuIGdldEFzc2lnbm1lbnRzKCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX1VJRDoKLQkJCQlzZXRVSUQoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX05BTUU6Ci0JCQkJc2V0TmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fVElUTEU6Ci0JCQkJc2V0VGl0bGUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX1NVQkpFQ1Q6Ci0JCQkJc2V0U3ViamVjdCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fQ0FURUdPUlk6Ci0JCQkJc2V0Q2F0ZWdvcnkoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0NPTVBBTlk6Ci0JCQkJc2V0Q29tcGFueSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fTUFOQUdFUjoKLQkJCQlzZXRNYW5hZ2VyKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19BVVRIT1I6Ci0JCQkJc2V0QXV0aG9yKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19DUkVBVElPTl9EQVRFOgotCQkJCXNldENyZWF0aW9uRGF0ZSgoT2JqZWN0KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fUkVWSVNJT046Ci0JCQkJc2V0UmV2aXNpb24oKEJpZ0ludGVnZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19MQVNUX1NBVkVEOgotCQkJCXNldExhc3RTYXZlZCgoT2JqZWN0KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fU0NIRURVTEVfRlJPTV9TVEFSVDoKLQkJCQlzZXRTY2hlZHVsZUZyb21TdGFydCgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fU1RBUlRfREFURToKLQkJCQlzZXRTdGFydERhdGUoKE9iamVjdCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0ZJTklTSF9EQVRFOgotCQkJCXNldEZpbmlzaERhdGUoKE9iamVjdCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0ZZU1RBUlRfREFURToKLQkJCQlzZXRGWVN0YXJ0RGF0ZSgoQmlnSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0NSSVRJQ0FMX1NMQUNLX0xJTUlUOgotCQkJCXNldENyaXRpY2FsU2xhY2tMaW1pdCgoQmlnSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0NVUlJFTkNZX0RJR0lUUzoKLQkJCQlzZXRDdXJyZW5jeURpZ2l0cygoQmlnSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0NVUlJFTkNZX1NZTUJPTDoKLQkJCQlzZXRDdXJyZW5jeVN5bWJvbCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fQ1VSUkVOQ1lfU1lNQk9MX1BPU0lUSU9OOgotCQkJCXNldEN1cnJlbmN5U3ltYm9sUG9zaXRpb24oKEJpZ0ludGVnZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19DQUxFTkRBUl9VSUQ6Ci0JCQkJc2V0Q2FsZW5kYXJVSUQoKEJpZ0ludGVnZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19ERUZBVUxUX1NUQVJUX1RJTUU6Ci0JCQkJc2V0RGVmYXVsdFN0YXJ0VGltZSgoT2JqZWN0KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fREVGQVVMVF9GSU5JU0hfVElNRToKLQkJCQlzZXREZWZhdWx0RmluaXNoVGltZSgoT2JqZWN0KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fTUlOVVRFU19QRVJfREFZOgotCQkJCXNldE1pbnV0ZXNQZXJEYXkoKEJpZ0ludGVnZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19NSU5VVEVTX1BFUl9XRUVLOgotCQkJCXNldE1pbnV0ZXNQZXJXZWVrKChCaWdJbnRlZ2VyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fREFZU19QRVJfTU9OVEg6Ci0JCQkJc2V0RGF5c1Blck1vbnRoKChCaWdJbnRlZ2VyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fREVGQVVMVF9UQVNLX1RZUEU6Ci0JCQkJc2V0RGVmYXVsdFRhc2tUeXBlKChCaWdJbnRlZ2VyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fREVGQVVMVF9GSVhFRF9DT1NUX0FDQ1JVQUw6Ci0JCQkJc2V0RGVmYXVsdEZpeGVkQ29zdEFjY3J1YWwoKEJpZ0ludGVnZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19ERUZBVUxUX1NUQU5EQVJEX1JBVEU6Ci0JCQkJc2V0RGVmYXVsdFN0YW5kYXJkUmF0ZSgoKEZsb2F0KW5ld1ZhbHVlKS5mbG9hdFZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19ERUZBVUxUX09WRVJUSU1FX1JBVEU6Ci0JCQkJc2V0RGVmYXVsdE92ZXJ0aW1lUmF0ZSgoKEZsb2F0KW5ld1ZhbHVlKS5mbG9hdFZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19EVVJBVElPTl9GT1JNQVQ6Ci0JCQkJc2V0RHVyYXRpb25Gb3JtYXQoKEJpZ0ludGVnZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19XT1JLX0ZPUk1BVDoKLQkJCQlzZXRXb3JrRm9ybWF0KChCaWdJbnRlZ2VyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fRURJVEFCTEVfQUNUVUFMX0NPU1RTOgotCQkJCXNldEVkaXRhYmxlQWN0dWFsQ29zdHMoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0hPTk9SX0NPTlNUUkFJTlRTOgotCQkJCXNldEhvbm9yQ29uc3RyYWludHMoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0VBUk5FRF9WQUxVRV9NRVRIT0Q6Ci0JCQkJc2V0RWFybmVkVmFsdWVNZXRob2QoKEJpZ0ludGVnZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19JTlNFUlRFRF9QUk9KRUNUU19MSUtFX1NVTU1BUlk6Ci0JCQkJc2V0SW5zZXJ0ZWRQcm9qZWN0c0xpa2VTdW1tYXJ5KCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19NVUxUSVBMRV9DUklUSUNBTF9QQVRIUzoKLQkJCQlzZXRNdWx0aXBsZUNyaXRpY2FsUGF0aHMoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX05FV19UQVNLU19FRkZPUlRfRFJJVkVOOgotCQkJCXNldE5ld1Rhc2tzRWZmb3J0RHJpdmVuKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19ORVdfVEFTS1NfRVNUSU1BVEVEOgotCQkJCXNldE5ld1Rhc2tzRXN0aW1hdGVkKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19TUExJVFNfSU5fUFJPR1JFU1NfVEFTS1M6Ci0JCQkJc2V0U3BsaXRzSW5Qcm9ncmVzc1Rhc2tzKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19TUFJFQURfQUNUVUFMX0NPU1Q6Ci0JCQkJc2V0U3ByZWFkQWN0dWFsQ29zdCgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fU1BSRUFEX1BFUkNFTlRfQ09NUExFVEU6Ci0JCQkJc2V0U3ByZWFkUGVyY2VudENvbXBsZXRlKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19UQVNLX1VQREFURVNfUkVTT1VSQ0U6Ci0JCQkJc2V0VGFza1VwZGF0ZXNSZXNvdXJjZSgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fRklTQ0FMX1lFQVJfU1RBUlQ6Ci0JCQkJc2V0RmlzY2FsWWVhclN0YXJ0KCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19XRUVLX1NUQVJUX0RBWToKLQkJCQlzZXRXZWVrU3RhcnREYXkoKEJpZ0ludGVnZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19NT1ZFX0NPTVBMRVRFRF9FTkRTX0JBQ0s6Ci0JCQkJc2V0TW92ZUNvbXBsZXRlZEVuZHNCYWNrKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19NT1ZFX1JFTUFJTklOR19TVEFSVFNfQkFDSzoKLQkJCQlzZXRNb3ZlUmVtYWluaW5nU3RhcnRzQmFjaygoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fTU9WRV9SRU1BSU5JTkdfU1RBUlRTX0ZPUldBUkQ6Ci0JCQkJc2V0TW92ZVJlbWFpbmluZ1N0YXJ0c0ZvcndhcmQoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX01PVkVfQ09NUExFVEVEX0VORFNfRk9SV0FSRDoKLQkJCQlzZXRNb3ZlQ29tcGxldGVkRW5kc0ZvcndhcmQoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0JBU0VMSU5FX0ZPUl9FQVJORURfVkFMVUU6Ci0JCQkJc2V0QmFzZWxpbmVGb3JFYXJuZWRWYWx1ZSgoQmlnSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0FVVE9fQUREX05FV19SRVNPVVJDRVNfQU5EX1RBU0tTOgotCQkJCXNldEF1dG9BZGROZXdSZXNvdXJjZXNBbmRUYXNrcygoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fU1RBVFVTX0RBVEU6Ci0JCQkJc2V0U3RhdHVzRGF0ZSgoT2JqZWN0KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fQ1VSUkVOVF9EQVRFOgotCQkJCXNldEN1cnJlbnREYXRlKChPYmplY3QpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19NSUNST1NPRlRfUFJPSkVDVF9TRVJWRVJfVVJMOgotCQkJCXNldE1pY3Jvc29mdFByb2plY3RTZXJ2ZXJVUkwoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0FVVE9MSU5LOgotCQkJCXNldEF1dG9saW5rKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19ORVdfVEFTS19TVEFSVF9EQVRFOgotCQkJCXNldE5ld1Rhc2tTdGFydERhdGUoKEJpZ0ludGVnZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19ERUZBVUxUX1RBU0tfRVZfTUVUSE9EOgotCQkJCXNldERlZmF1bHRUYXNrRVZNZXRob2QoKEJpZ0ludGVnZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19QUk9KRUNUX0VYVEVSTkFMTFlfRURJVEVEOgotCQkJCXNldFByb2plY3RFeHRlcm5hbGx5RWRpdGVkKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19FWFRFTkRFRF9DUkVBVElPTl9EQVRFOgotCQkJCXNldEV4dGVuZGVkQ3JlYXRpb25EYXRlKChPYmplY3QpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19BQ1RVQUxTX0lOX1NZTkM6Ci0JCQkJc2V0QWN0dWFsc0luU3luYygoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fUkVNT1ZFX0ZJTEVfUFJPUEVSVElFUzoKLQkJCQlzZXRSZW1vdmVGaWxlUHJvcGVydGllcygoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fQURNSU5fUFJPSkVDVDoKLQkJCQlzZXRBZG1pblByb2plY3QoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX09VVExJTkVfQ09ERVM6Ci0JCQkJc2V0T3V0bGluZUNvZGVzKChPdXRsaW5lQ29kZXMpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19XQlNfTUFTS1M6Ci0JCQkJc2V0V0JTTWFza3MoKFdCU01hc2tzKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fRVhURU5ERURfQVRUUklCVVRFUzoKLQkJCQlzZXRFeHRlbmRlZEF0dHJpYnV0ZXMoKEV4dGVuZGVkQXR0cmlidXRlcyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0NBTEVOREFSUzoKLQkJCQlzZXRDYWxlbmRhcnMoKENhbGVuZGFycyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX1RBU0tTOgotCQkJCXNldFRhc2tzKChUYXNrcyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX1JFU09VUkNFUzoKLQkJCQlzZXRSZXNvdXJjZXMoKFJlc291cmNlcyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0FTU0lHTk1FTlRTOgotCQkJCXNldEFzc2lnbm1lbnRzKChBc3NpZ25tZW50cyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19VSUQ6Ci0JCQkJc2V0VUlEKFVJRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX05BTUU6Ci0JCQkJc2V0TmFtZShOQU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fVElUTEU6Ci0JCQkJc2V0VGl0bGUoVElUTEVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19TVUJKRUNUOgotCQkJCXNldFN1YmplY3QoU1VCSkVDVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0NBVEVHT1JZOgotCQkJCXNldENhdGVnb3J5KENBVEVHT1JZX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fQ09NUEFOWToKLQkJCQlzZXRDb21wYW55KENPTVBBTllfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19NQU5BR0VSOgotCQkJCXNldE1hbmFnZXIoTUFOQUdFUl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0FVVEhPUjoKLQkJCQlzZXRBdXRob3IoQVVUSE9SX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fQ1JFQVRJT05fREFURToKLQkJCQlzZXRDcmVhdGlvbkRhdGUoQ1JFQVRJT05fREFURV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX1JFVklTSU9OOgotCQkJCXNldFJldmlzaW9uKFJFVklTSU9OX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fTEFTVF9TQVZFRDoKLQkJCQlzZXRMYXN0U2F2ZWQoTEFTVF9TQVZFRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX1NDSEVEVUxFX0ZST01fU1RBUlQ6Ci0JCQkJdW5zZXRTY2hlZHVsZUZyb21TdGFydCgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19TVEFSVF9EQVRFOgotCQkJCXNldFN0YXJ0RGF0ZShTVEFSVF9EQVRFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fRklOSVNIX0RBVEU6Ci0JCQkJc2V0RmluaXNoRGF0ZShGSU5JU0hfREFURV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0ZZU1RBUlRfREFURToKLQkJCQlzZXRGWVN0YXJ0RGF0ZShGWVNUQVJUX0RBVEVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19DUklUSUNBTF9TTEFDS19MSU1JVDoKLQkJCQlzZXRDcml0aWNhbFNsYWNrTGltaXQoQ1JJVElDQUxfU0xBQ0tfTElNSVRfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19DVVJSRU5DWV9ESUdJVFM6Ci0JCQkJc2V0Q3VycmVuY3lEaWdpdHMoQ1VSUkVOQ1lfRElHSVRTX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fQ1VSUkVOQ1lfU1lNQk9MOgotCQkJCXNldEN1cnJlbmN5U3ltYm9sKENVUlJFTkNZX1NZTUJPTF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0NVUlJFTkNZX1NZTUJPTF9QT1NJVElPTjoKLQkJCQlzZXRDdXJyZW5jeVN5bWJvbFBvc2l0aW9uKENVUlJFTkNZX1NZTUJPTF9QT1NJVElPTl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0NBTEVOREFSX1VJRDoKLQkJCQlzZXRDYWxlbmRhclVJRChDQUxFTkRBUl9VSURfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19ERUZBVUxUX1NUQVJUX1RJTUU6Ci0JCQkJc2V0RGVmYXVsdFN0YXJ0VGltZShERUZBVUxUX1NUQVJUX1RJTUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19ERUZBVUxUX0ZJTklTSF9USU1FOgotCQkJCXNldERlZmF1bHRGaW5pc2hUaW1lKERFRkFVTFRfRklOSVNIX1RJTUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19NSU5VVEVTX1BFUl9EQVk6Ci0JCQkJc2V0TWludXRlc1BlckRheShNSU5VVEVTX1BFUl9EQVlfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19NSU5VVEVTX1BFUl9XRUVLOgotCQkJCXNldE1pbnV0ZXNQZXJXZWVrKE1JTlVURVNfUEVSX1dFRUtfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19EQVlTX1BFUl9NT05USDoKLQkJCQlzZXREYXlzUGVyTW9udGgoREFZU19QRVJfTU9OVEhfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19ERUZBVUxUX1RBU0tfVFlQRToKLQkJCQl1bnNldERlZmF1bHRUYXNrVHlwZSgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19ERUZBVUxUX0ZJWEVEX0NPU1RfQUNDUlVBTDoKLQkJCQlzZXREZWZhdWx0Rml4ZWRDb3N0QWNjcnVhbChERUZBVUxUX0ZJWEVEX0NPU1RfQUNDUlVBTF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0RFRkFVTFRfU1RBTkRBUkRfUkFURToKLQkJCQl1bnNldERlZmF1bHRTdGFuZGFyZFJhdGUoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fREVGQVVMVF9PVkVSVElNRV9SQVRFOgotCQkJCXVuc2V0RGVmYXVsdE92ZXJ0aW1lUmF0ZSgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19EVVJBVElPTl9GT1JNQVQ6Ci0JCQkJc2V0RHVyYXRpb25Gb3JtYXQoRFVSQVRJT05fRk9STUFUX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fV09SS19GT1JNQVQ6Ci0JCQkJc2V0V29ya0Zvcm1hdChXT1JLX0ZPUk1BVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0VESVRBQkxFX0FDVFVBTF9DT1NUUzoKLQkJCQl1bnNldEVkaXRhYmxlQWN0dWFsQ29zdHMoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fSE9OT1JfQ09OU1RSQUlOVFM6Ci0JCQkJdW5zZXRIb25vckNvbnN0cmFpbnRzKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0VBUk5FRF9WQUxVRV9NRVRIT0Q6Ci0JCQkJc2V0RWFybmVkVmFsdWVNZXRob2QoRUFSTkVEX1ZBTFVFX01FVEhPRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0lOU0VSVEVEX1BST0pFQ1RTX0xJS0VfU1VNTUFSWToKLQkJCQl1bnNldEluc2VydGVkUHJvamVjdHNMaWtlU3VtbWFyeSgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19NVUxUSVBMRV9DUklUSUNBTF9QQVRIUzoKLQkJCQl1bnNldE11bHRpcGxlQ3JpdGljYWxQYXRocygpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19ORVdfVEFTS1NfRUZGT1JUX0RSSVZFTjoKLQkJCQl1bnNldE5ld1Rhc2tzRWZmb3J0RHJpdmVuKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX05FV19UQVNLU19FU1RJTUFURUQ6Ci0JCQkJdW5zZXROZXdUYXNrc0VzdGltYXRlZCgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19TUExJVFNfSU5fUFJPR1JFU1NfVEFTS1M6Ci0JCQkJdW5zZXRTcGxpdHNJblByb2dyZXNzVGFza3MoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fU1BSRUFEX0FDVFVBTF9DT1NUOgotCQkJCXVuc2V0U3ByZWFkQWN0dWFsQ29zdCgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19TUFJFQURfUEVSQ0VOVF9DT01QTEVURToKLQkJCQl1bnNldFNwcmVhZFBlcmNlbnRDb21wbGV0ZSgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19UQVNLX1VQREFURVNfUkVTT1VSQ0U6Ci0JCQkJdW5zZXRUYXNrVXBkYXRlc1Jlc291cmNlKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0ZJU0NBTF9ZRUFSX1NUQVJUOgotCQkJCXVuc2V0RmlzY2FsWWVhclN0YXJ0KCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX1dFRUtfU1RBUlRfREFZOgotCQkJCXNldFdlZWtTdGFydERheShXRUVLX1NUQVJUX0RBWV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX01PVkVfQ09NUExFVEVEX0VORFNfQkFDSzoKLQkJCQl1bnNldE1vdmVDb21wbGV0ZWRFbmRzQmFjaygpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19NT1ZFX1JFTUFJTklOR19TVEFSVFNfQkFDSzoKLQkJCQl1bnNldE1vdmVSZW1haW5pbmdTdGFydHNCYWNrKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX01PVkVfUkVNQUlOSU5HX1NUQVJUU19GT1JXQVJEOgotCQkJCXVuc2V0TW92ZVJlbWFpbmluZ1N0YXJ0c0ZvcndhcmQoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fTU9WRV9DT01QTEVURURfRU5EU19GT1JXQVJEOgotCQkJCXVuc2V0TW92ZUNvbXBsZXRlZEVuZHNGb3J3YXJkKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0JBU0VMSU5FX0ZPUl9FQVJORURfVkFMVUU6Ci0JCQkJc2V0QmFzZWxpbmVGb3JFYXJuZWRWYWx1ZShCQVNFTElORV9GT1JfRUFSTkVEX1ZBTFVFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fQVVUT19BRERfTkVXX1JFU09VUkNFU19BTkRfVEFTS1M6Ci0JCQkJdW5zZXRBdXRvQWRkTmV3UmVzb3VyY2VzQW5kVGFza3MoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fU1RBVFVTX0RBVEU6Ci0JCQkJc2V0U3RhdHVzRGF0ZShTVEFUVVNfREFURV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0NVUlJFTlRfREFURToKLQkJCQlzZXRDdXJyZW50RGF0ZShDVVJSRU5UX0RBVEVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19NSUNST1NPRlRfUFJPSkVDVF9TRVJWRVJfVVJMOgotCQkJCXVuc2V0TWljcm9zb2Z0UHJvamVjdFNlcnZlclVSTCgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19BVVRPTElOSzoKLQkJCQl1bnNldEF1dG9saW5rKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX05FV19UQVNLX1NUQVJUX0RBVEU6Ci0JCQkJc2V0TmV3VGFza1N0YXJ0RGF0ZShORVdfVEFTS19TVEFSVF9EQVRFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fREVGQVVMVF9UQVNLX0VWX01FVEhPRDoKLQkJCQlzZXREZWZhdWx0VGFza0VWTWV0aG9kKERFRkFVTFRfVEFTS19FVl9NRVRIT0RfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19QUk9KRUNUX0VYVEVSTkFMTFlfRURJVEVEOgotCQkJCXVuc2V0UHJvamVjdEV4dGVybmFsbHlFZGl0ZWQoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fRVhURU5ERURfQ1JFQVRJT05fREFURToKLQkJCQlzZXRFeHRlbmRlZENyZWF0aW9uRGF0ZShFWFRFTkRFRF9DUkVBVElPTl9EQVRFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fQUNUVUFMU19JTl9TWU5DOgotCQkJCXVuc2V0QWN0dWFsc0luU3luYygpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19SRU1PVkVfRklMRV9QUk9QRVJUSUVTOgotCQkJCXVuc2V0UmVtb3ZlRmlsZVByb3BlcnRpZXMoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fQURNSU5fUFJPSkVDVDoKLQkJCQl1bnNldEFkbWluUHJvamVjdCgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19PVVRMSU5FX0NPREVTOgotCQkJCXNldE91dGxpbmVDb2RlcygoT3V0bGluZUNvZGVzKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19XQlNfTUFTS1M6Ci0JCQkJc2V0V0JTTWFza3MoKFdCU01hc2tzKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19FWFRFTkRFRF9BVFRSSUJVVEVTOgotCQkJCXNldEV4dGVuZGVkQXR0cmlidXRlcygoRXh0ZW5kZWRBdHRyaWJ1dGVzKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19DQUxFTkRBUlM6Ci0JCQkJc2V0Q2FsZW5kYXJzKChDYWxlbmRhcnMpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX1RBU0tTOgotCQkJCXNldFRhc2tzKChUYXNrcyludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fUkVTT1VSQ0VTOgotCQkJCXNldFJlc291cmNlcygoUmVzb3VyY2VzKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19BU1NJR05NRU5UUzoKLQkJCQlzZXRBc3NpZ25tZW50cygoQXNzaWdubWVudHMpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fVUlEOgotCQkJCXJldHVybiBVSURfRURFRkFVTFQgPT0gbnVsbCA/IHVJRCAhPSBudWxsIDogIVVJRF9FREVGQVVMVC5lcXVhbHModUlEKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19OQU1FOgotCQkJCXJldHVybiBOQU1FX0VERUZBVUxUID09IG51bGwgPyBuYW1lICE9IG51bGwgOiAhTkFNRV9FREVGQVVMVC5lcXVhbHMobmFtZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fVElUTEU6Ci0JCQkJcmV0dXJuIFRJVExFX0VERUZBVUxUID09IG51bGwgPyB0aXRsZSAhPSBudWxsIDogIVRJVExFX0VERUZBVUxULmVxdWFscyh0aXRsZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fU1VCSkVDVDoKLQkJCQlyZXR1cm4gU1VCSkVDVF9FREVGQVVMVCA9PSBudWxsID8gc3ViamVjdCAhPSBudWxsIDogIVNVQkpFQ1RfRURFRkFVTFQuZXF1YWxzKHN1YmplY3QpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0NBVEVHT1JZOgotCQkJCXJldHVybiBDQVRFR09SWV9FREVGQVVMVCA9PSBudWxsID8gY2F0ZWdvcnkgIT0gbnVsbCA6ICFDQVRFR09SWV9FREVGQVVMVC5lcXVhbHMoY2F0ZWdvcnkpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0NPTVBBTlk6Ci0JCQkJcmV0dXJuIENPTVBBTllfRURFRkFVTFQgPT0gbnVsbCA/IGNvbXBhbnkgIT0gbnVsbCA6ICFDT01QQU5ZX0VERUZBVUxULmVxdWFscyhjb21wYW55KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19NQU5BR0VSOgotCQkJCXJldHVybiBNQU5BR0VSX0VERUZBVUxUID09IG51bGwgPyBtYW5hZ2VyICE9IG51bGwgOiAhTUFOQUdFUl9FREVGQVVMVC5lcXVhbHMobWFuYWdlcik7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fQVVUSE9SOgotCQkJCXJldHVybiBBVVRIT1JfRURFRkFVTFQgPT0gbnVsbCA/IGF1dGhvciAhPSBudWxsIDogIUFVVEhPUl9FREVGQVVMVC5lcXVhbHMoYXV0aG9yKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19DUkVBVElPTl9EQVRFOgotCQkJCXJldHVybiBDUkVBVElPTl9EQVRFX0VERUZBVUxUID09IG51bGwgPyBjcmVhdGlvbkRhdGUgIT0gbnVsbCA6ICFDUkVBVElPTl9EQVRFX0VERUZBVUxULmVxdWFscyhjcmVhdGlvbkRhdGUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX1JFVklTSU9OOgotCQkJCXJldHVybiBSRVZJU0lPTl9FREVGQVVMVCA9PSBudWxsID8gcmV2aXNpb24gIT0gbnVsbCA6ICFSRVZJU0lPTl9FREVGQVVMVC5lcXVhbHMocmV2aXNpb24pOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0xBU1RfU0FWRUQ6Ci0JCQkJcmV0dXJuIExBU1RfU0FWRURfRURFRkFVTFQgPT0gbnVsbCA/IGxhc3RTYXZlZCAhPSBudWxsIDogIUxBU1RfU0FWRURfRURFRkFVTFQuZXF1YWxzKGxhc3RTYXZlZCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fU0NIRURVTEVfRlJPTV9TVEFSVDoKLQkJCQlyZXR1cm4gaXNTZXRTY2hlZHVsZUZyb21TdGFydCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX1NUQVJUX0RBVEU6Ci0JCQkJcmV0dXJuIFNUQVJUX0RBVEVfRURFRkFVTFQgPT0gbnVsbCA/IHN0YXJ0RGF0ZSAhPSBudWxsIDogIVNUQVJUX0RBVEVfRURFRkFVTFQuZXF1YWxzKHN0YXJ0RGF0ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fRklOSVNIX0RBVEU6Ci0JCQkJcmV0dXJuIEZJTklTSF9EQVRFX0VERUZBVUxUID09IG51bGwgPyBmaW5pc2hEYXRlICE9IG51bGwgOiAhRklOSVNIX0RBVEVfRURFRkFVTFQuZXF1YWxzKGZpbmlzaERhdGUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0ZZU1RBUlRfREFURToKLQkJCQlyZXR1cm4gRllTVEFSVF9EQVRFX0VERUZBVUxUID09IG51bGwgPyBmWVN0YXJ0RGF0ZSAhPSBudWxsIDogIUZZU1RBUlRfREFURV9FREVGQVVMVC5lcXVhbHMoZllTdGFydERhdGUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0NSSVRJQ0FMX1NMQUNLX0xJTUlUOgotCQkJCXJldHVybiBDUklUSUNBTF9TTEFDS19MSU1JVF9FREVGQVVMVCA9PSBudWxsID8gY3JpdGljYWxTbGFja0xpbWl0ICE9IG51bGwgOiAhQ1JJVElDQUxfU0xBQ0tfTElNSVRfRURFRkFVTFQuZXF1YWxzKGNyaXRpY2FsU2xhY2tMaW1pdCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fQ1VSUkVOQ1lfRElHSVRTOgotCQkJCXJldHVybiBDVVJSRU5DWV9ESUdJVFNfRURFRkFVTFQgPT0gbnVsbCA/IGN1cnJlbmN5RGlnaXRzICE9IG51bGwgOiAhQ1VSUkVOQ1lfRElHSVRTX0VERUZBVUxULmVxdWFscyhjdXJyZW5jeURpZ2l0cyk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fQ1VSUkVOQ1lfU1lNQk9MOgotCQkJCXJldHVybiBDVVJSRU5DWV9TWU1CT0xfRURFRkFVTFQgPT0gbnVsbCA/IGN1cnJlbmN5U3ltYm9sICE9IG51bGwgOiAhQ1VSUkVOQ1lfU1lNQk9MX0VERUZBVUxULmVxdWFscyhjdXJyZW5jeVN5bWJvbCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fQ1VSUkVOQ1lfU1lNQk9MX1BPU0lUSU9OOgotCQkJCXJldHVybiBDVVJSRU5DWV9TWU1CT0xfUE9TSVRJT05fRURFRkFVTFQgPT0gbnVsbCA/IGN1cnJlbmN5U3ltYm9sUG9zaXRpb24gIT0gbnVsbCA6ICFDVVJSRU5DWV9TWU1CT0xfUE9TSVRJT05fRURFRkFVTFQuZXF1YWxzKGN1cnJlbmN5U3ltYm9sUG9zaXRpb24pOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0NBTEVOREFSX1VJRDoKLQkJCQlyZXR1cm4gQ0FMRU5EQVJfVUlEX0VERUZBVUxUID09IG51bGwgPyBjYWxlbmRhclVJRCAhPSBudWxsIDogIUNBTEVOREFSX1VJRF9FREVGQVVMVC5lcXVhbHMoY2FsZW5kYXJVSUQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0RFRkFVTFRfU1RBUlRfVElNRToKLQkJCQlyZXR1cm4gREVGQVVMVF9TVEFSVF9USU1FX0VERUZBVUxUID09IG51bGwgPyBkZWZhdWx0U3RhcnRUaW1lICE9IG51bGwgOiAhREVGQVVMVF9TVEFSVF9USU1FX0VERUZBVUxULmVxdWFscyhkZWZhdWx0U3RhcnRUaW1lKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19ERUZBVUxUX0ZJTklTSF9USU1FOgotCQkJCXJldHVybiBERUZBVUxUX0ZJTklTSF9USU1FX0VERUZBVUxUID09IG51bGwgPyBkZWZhdWx0RmluaXNoVGltZSAhPSBudWxsIDogIURFRkFVTFRfRklOSVNIX1RJTUVfRURFRkFVTFQuZXF1YWxzKGRlZmF1bHRGaW5pc2hUaW1lKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19NSU5VVEVTX1BFUl9EQVk6Ci0JCQkJcmV0dXJuIE1JTlVURVNfUEVSX0RBWV9FREVGQVVMVCA9PSBudWxsID8gbWludXRlc1BlckRheSAhPSBudWxsIDogIU1JTlVURVNfUEVSX0RBWV9FREVGQVVMVC5lcXVhbHMobWludXRlc1BlckRheSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fTUlOVVRFU19QRVJfV0VFSzoKLQkJCQlyZXR1cm4gTUlOVVRFU19QRVJfV0VFS19FREVGQVVMVCA9PSBudWxsID8gbWludXRlc1BlcldlZWsgIT0gbnVsbCA6ICFNSU5VVEVTX1BFUl9XRUVLX0VERUZBVUxULmVxdWFscyhtaW51dGVzUGVyV2Vlayk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fREFZU19QRVJfTU9OVEg6Ci0JCQkJcmV0dXJuIERBWVNfUEVSX01PTlRIX0VERUZBVUxUID09IG51bGwgPyBkYXlzUGVyTW9udGggIT0gbnVsbCA6ICFEQVlTX1BFUl9NT05USF9FREVGQVVMVC5lcXVhbHMoZGF5c1Blck1vbnRoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19ERUZBVUxUX1RBU0tfVFlQRToKLQkJCQlyZXR1cm4gaXNTZXREZWZhdWx0VGFza1R5cGUoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19ERUZBVUxUX0ZJWEVEX0NPU1RfQUNDUlVBTDoKLQkJCQlyZXR1cm4gREVGQVVMVF9GSVhFRF9DT1NUX0FDQ1JVQUxfRURFRkFVTFQgPT0gbnVsbCA/IGRlZmF1bHRGaXhlZENvc3RBY2NydWFsICE9IG51bGwgOiAhREVGQVVMVF9GSVhFRF9DT1NUX0FDQ1JVQUxfRURFRkFVTFQuZXF1YWxzKGRlZmF1bHRGaXhlZENvc3RBY2NydWFsKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19ERUZBVUxUX1NUQU5EQVJEX1JBVEU6Ci0JCQkJcmV0dXJuIGlzU2V0RGVmYXVsdFN0YW5kYXJkUmF0ZSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0RFRkFVTFRfT1ZFUlRJTUVfUkFURToKLQkJCQlyZXR1cm4gaXNTZXREZWZhdWx0T3ZlcnRpbWVSYXRlKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fRFVSQVRJT05fRk9STUFUOgotCQkJCXJldHVybiBEVVJBVElPTl9GT1JNQVRfRURFRkFVTFQgPT0gbnVsbCA/IGR1cmF0aW9uRm9ybWF0ICE9IG51bGwgOiAhRFVSQVRJT05fRk9STUFUX0VERUZBVUxULmVxdWFscyhkdXJhdGlvbkZvcm1hdCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fV09SS19GT1JNQVQ6Ci0JCQkJcmV0dXJuIFdPUktfRk9STUFUX0VERUZBVUxUID09IG51bGwgPyB3b3JrRm9ybWF0ICE9IG51bGwgOiAhV09SS19GT1JNQVRfRURFRkFVTFQuZXF1YWxzKHdvcmtGb3JtYXQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0VESVRBQkxFX0FDVFVBTF9DT1NUUzoKLQkJCQlyZXR1cm4gaXNTZXRFZGl0YWJsZUFjdHVhbENvc3RzKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fSE9OT1JfQ09OU1RSQUlOVFM6Ci0JCQkJcmV0dXJuIGlzU2V0SG9ub3JDb25zdHJhaW50cygpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0VBUk5FRF9WQUxVRV9NRVRIT0Q6Ci0JCQkJcmV0dXJuIEVBUk5FRF9WQUxVRV9NRVRIT0RfRURFRkFVTFQgPT0gbnVsbCA/IGVhcm5lZFZhbHVlTWV0aG9kICE9IG51bGwgOiAhRUFSTkVEX1ZBTFVFX01FVEhPRF9FREVGQVVMVC5lcXVhbHMoZWFybmVkVmFsdWVNZXRob2QpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0lOU0VSVEVEX1BST0pFQ1RTX0xJS0VfU1VNTUFSWToKLQkJCQlyZXR1cm4gaXNTZXRJbnNlcnRlZFByb2plY3RzTGlrZVN1bW1hcnkoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19NVUxUSVBMRV9DUklUSUNBTF9QQVRIUzoKLQkJCQlyZXR1cm4gaXNTZXRNdWx0aXBsZUNyaXRpY2FsUGF0aHMoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19ORVdfVEFTS1NfRUZGT1JUX0RSSVZFTjoKLQkJCQlyZXR1cm4gaXNTZXROZXdUYXNrc0VmZm9ydERyaXZlbigpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX05FV19UQVNLU19FU1RJTUFURUQ6Ci0JCQkJcmV0dXJuIGlzU2V0TmV3VGFza3NFc3RpbWF0ZWQoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19TUExJVFNfSU5fUFJPR1JFU1NfVEFTS1M6Ci0JCQkJcmV0dXJuIGlzU2V0U3BsaXRzSW5Qcm9ncmVzc1Rhc2tzKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fU1BSRUFEX0FDVFVBTF9DT1NUOgotCQkJCXJldHVybiBpc1NldFNwcmVhZEFjdHVhbENvc3QoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19TUFJFQURfUEVSQ0VOVF9DT01QTEVURToKLQkJCQlyZXR1cm4gaXNTZXRTcHJlYWRQZXJjZW50Q29tcGxldGUoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19UQVNLX1VQREFURVNfUkVTT1VSQ0U6Ci0JCQkJcmV0dXJuIGlzU2V0VGFza1VwZGF0ZXNSZXNvdXJjZSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0ZJU0NBTF9ZRUFSX1NUQVJUOgotCQkJCXJldHVybiBpc1NldEZpc2NhbFllYXJTdGFydCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX1dFRUtfU1RBUlRfREFZOgotCQkJCXJldHVybiBXRUVLX1NUQVJUX0RBWV9FREVGQVVMVCA9PSBudWxsID8gd2Vla1N0YXJ0RGF5ICE9IG51bGwgOiAhV0VFS19TVEFSVF9EQVlfRURFRkFVTFQuZXF1YWxzKHdlZWtTdGFydERheSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fTU9WRV9DT01QTEVURURfRU5EU19CQUNLOgotCQkJCXJldHVybiBpc1NldE1vdmVDb21wbGV0ZWRFbmRzQmFjaygpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX01PVkVfUkVNQUlOSU5HX1NUQVJUU19CQUNLOgotCQkJCXJldHVybiBpc1NldE1vdmVSZW1haW5pbmdTdGFydHNCYWNrKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fTU9WRV9SRU1BSU5JTkdfU1RBUlRTX0ZPUldBUkQ6Ci0JCQkJcmV0dXJuIGlzU2V0TW92ZVJlbWFpbmluZ1N0YXJ0c0ZvcndhcmQoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19NT1ZFX0NPTVBMRVRFRF9FTkRTX0ZPUldBUkQ6Ci0JCQkJcmV0dXJuIGlzU2V0TW92ZUNvbXBsZXRlZEVuZHNGb3J3YXJkKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fQkFTRUxJTkVfRk9SX0VBUk5FRF9WQUxVRToKLQkJCQlyZXR1cm4gQkFTRUxJTkVfRk9SX0VBUk5FRF9WQUxVRV9FREVGQVVMVCA9PSBudWxsID8gYmFzZWxpbmVGb3JFYXJuZWRWYWx1ZSAhPSBudWxsIDogIUJBU0VMSU5FX0ZPUl9FQVJORURfVkFMVUVfRURFRkFVTFQuZXF1YWxzKGJhc2VsaW5lRm9yRWFybmVkVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0FVVE9fQUREX05FV19SRVNPVVJDRVNfQU5EX1RBU0tTOgotCQkJCXJldHVybiBpc1NldEF1dG9BZGROZXdSZXNvdXJjZXNBbmRUYXNrcygpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX1NUQVRVU19EQVRFOgotCQkJCXJldHVybiBTVEFUVVNfREFURV9FREVGQVVMVCA9PSBudWxsID8gc3RhdHVzRGF0ZSAhPSBudWxsIDogIVNUQVRVU19EQVRFX0VERUZBVUxULmVxdWFscyhzdGF0dXNEYXRlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19DVVJSRU5UX0RBVEU6Ci0JCQkJcmV0dXJuIENVUlJFTlRfREFURV9FREVGQVVMVCA9PSBudWxsID8gY3VycmVudERhdGUgIT0gbnVsbCA6ICFDVVJSRU5UX0RBVEVfRURFRkFVTFQuZXF1YWxzKGN1cnJlbnREYXRlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19NSUNST1NPRlRfUFJPSkVDVF9TRVJWRVJfVVJMOgotCQkJCXJldHVybiBpc1NldE1pY3Jvc29mdFByb2plY3RTZXJ2ZXJVUkwoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19BVVRPTElOSzoKLQkJCQlyZXR1cm4gaXNTZXRBdXRvbGluaygpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX05FV19UQVNLX1NUQVJUX0RBVEU6Ci0JCQkJcmV0dXJuIE5FV19UQVNLX1NUQVJUX0RBVEVfRURFRkFVTFQgPT0gbnVsbCA/IG5ld1Rhc2tTdGFydERhdGUgIT0gbnVsbCA6ICFORVdfVEFTS19TVEFSVF9EQVRFX0VERUZBVUxULmVxdWFscyhuZXdUYXNrU3RhcnREYXRlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19ERUZBVUxUX1RBU0tfRVZfTUVUSE9EOgotCQkJCXJldHVybiBERUZBVUxUX1RBU0tfRVZfTUVUSE9EX0VERUZBVUxUID09IG51bGwgPyBkZWZhdWx0VGFza0VWTWV0aG9kICE9IG51bGwgOiAhREVGQVVMVF9UQVNLX0VWX01FVEhPRF9FREVGQVVMVC5lcXVhbHMoZGVmYXVsdFRhc2tFVk1ldGhvZCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fUFJPSkVDVF9FWFRFUk5BTExZX0VESVRFRDoKLQkJCQlyZXR1cm4gaXNTZXRQcm9qZWN0RXh0ZXJuYWxseUVkaXRlZCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0VYVEVOREVEX0NSRUFUSU9OX0RBVEU6Ci0JCQkJcmV0dXJuIEVYVEVOREVEX0NSRUFUSU9OX0RBVEVfRURFRkFVTFQgPT0gbnVsbCA/IGV4dGVuZGVkQ3JlYXRpb25EYXRlICE9IG51bGwgOiAhRVhURU5ERURfQ1JFQVRJT05fREFURV9FREVGQVVMVC5lcXVhbHMoZXh0ZW5kZWRDcmVhdGlvbkRhdGUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0FDVFVBTFNfSU5fU1lOQzoKLQkJCQlyZXR1cm4gaXNTZXRBY3R1YWxzSW5TeW5jKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fUkVNT1ZFX0ZJTEVfUFJPUEVSVElFUzoKLQkJCQlyZXR1cm4gaXNTZXRSZW1vdmVGaWxlUHJvcGVydGllcygpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0FETUlOX1BST0pFQ1Q6Ci0JCQkJcmV0dXJuIGlzU2V0QWRtaW5Qcm9qZWN0KCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fT1VUTElORV9DT0RFUzoKLQkJCQlyZXR1cm4gb3V0bGluZUNvZGVzICE9IG51bGw7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fV0JTX01BU0tTOgotCQkJCXJldHVybiB3QlNNYXNrcyAhPSBudWxsOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0VYVEVOREVEX0FUVFJJQlVURVM6Ci0JCQkJcmV0dXJuIGV4dGVuZGVkQXR0cmlidXRlcyAhPSBudWxsOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0NBTEVOREFSUzoKLQkJCQlyZXR1cm4gY2FsZW5kYXJzICE9IG51bGw7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fVEFTS1M6Ci0JCQkJcmV0dXJuIHRhc2tzICE9IG51bGw7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fUkVTT1VSQ0VTOgotCQkJCXJldHVybiByZXNvdXJjZXMgIT0gbnVsbDsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19BU1NJR05NRU5UUzoKLQkJCQlyZXR1cm4gYXNzaWdubWVudHMgIT0gbnVsbDsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHVJRDogIik7Ci0JCXJlc3VsdC5hcHBlbmQodUlEKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBuYW1lOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChuYW1lKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCB0aXRsZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQodGl0bGUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHN1YmplY3Q6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHN1YmplY3QpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGNhdGVnb3J5OiAiKTsKLQkJcmVzdWx0LmFwcGVuZChjYXRlZ29yeSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgY29tcGFueTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoY29tcGFueSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgbWFuYWdlcjogIik7Ci0JCXJlc3VsdC5hcHBlbmQobWFuYWdlcik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgYXV0aG9yOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChhdXRob3IpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGNyZWF0aW9uRGF0ZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoY3JlYXRpb25EYXRlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCByZXZpc2lvbjogIik7Ci0JCXJlc3VsdC5hcHBlbmQocmV2aXNpb24pOwotCQlyZXN1bHQuYXBwZW5kKCIsIGxhc3RTYXZlZDogIik7Ci0JCXJlc3VsdC5hcHBlbmQobGFzdFNhdmVkKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBzY2hlZHVsZUZyb21TdGFydDogIik7Ci0JCWlmIChzY2hlZHVsZUZyb21TdGFydEVTZXQpIHJlc3VsdC5hcHBlbmQoc2NoZWR1bGVGcm9tU3RhcnQpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBzdGFydERhdGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHN0YXJ0RGF0ZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZmluaXNoRGF0ZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZmluaXNoRGF0ZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZllTdGFydERhdGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGZZU3RhcnREYXRlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBjcml0aWNhbFNsYWNrTGltaXQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGNyaXRpY2FsU2xhY2tMaW1pdCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgY3VycmVuY3lEaWdpdHM6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGN1cnJlbmN5RGlnaXRzKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBjdXJyZW5jeVN5bWJvbDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoY3VycmVuY3lTeW1ib2wpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGN1cnJlbmN5U3ltYm9sUG9zaXRpb246ICIpOwotCQlyZXN1bHQuYXBwZW5kKGN1cnJlbmN5U3ltYm9sUG9zaXRpb24pOwotCQlyZXN1bHQuYXBwZW5kKCIsIGNhbGVuZGFyVUlEOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChjYWxlbmRhclVJRCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZGVmYXVsdFN0YXJ0VGltZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZGVmYXVsdFN0YXJ0VGltZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZGVmYXVsdEZpbmlzaFRpbWU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGRlZmF1bHRGaW5pc2hUaW1lKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBtaW51dGVzUGVyRGF5OiAiKTsKLQkJcmVzdWx0LmFwcGVuZChtaW51dGVzUGVyRGF5KTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBtaW51dGVzUGVyV2VlazogIik7Ci0JCXJlc3VsdC5hcHBlbmQobWludXRlc1BlcldlZWspOwotCQlyZXN1bHQuYXBwZW5kKCIsIGRheXNQZXJNb250aDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZGF5c1Blck1vbnRoKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBkZWZhdWx0VGFza1R5cGU6ICIpOwotCQlpZiAoZGVmYXVsdFRhc2tUeXBlRVNldCkgcmVzdWx0LmFwcGVuZChkZWZhdWx0VGFza1R5cGUpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBkZWZhdWx0Rml4ZWRDb3N0QWNjcnVhbDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZGVmYXVsdEZpeGVkQ29zdEFjY3J1YWwpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGRlZmF1bHRTdGFuZGFyZFJhdGU6ICIpOwotCQlpZiAoZGVmYXVsdFN0YW5kYXJkUmF0ZUVTZXQpIHJlc3VsdC5hcHBlbmQoZGVmYXVsdFN0YW5kYXJkUmF0ZSk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGRlZmF1bHRPdmVydGltZVJhdGU6ICIpOwotCQlpZiAoZGVmYXVsdE92ZXJ0aW1lUmF0ZUVTZXQpIHJlc3VsdC5hcHBlbmQoZGVmYXVsdE92ZXJ0aW1lUmF0ZSk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGR1cmF0aW9uRm9ybWF0OiAiKTsKLQkJcmVzdWx0LmFwcGVuZChkdXJhdGlvbkZvcm1hdCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgd29ya0Zvcm1hdDogIik7Ci0JCXJlc3VsdC5hcHBlbmQod29ya0Zvcm1hdCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZWRpdGFibGVBY3R1YWxDb3N0czogIik7Ci0JCWlmIChlZGl0YWJsZUFjdHVhbENvc3RzRVNldCkgcmVzdWx0LmFwcGVuZChlZGl0YWJsZUFjdHVhbENvc3RzKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgaG9ub3JDb25zdHJhaW50czogIik7Ci0JCWlmIChob25vckNvbnN0cmFpbnRzRVNldCkgcmVzdWx0LmFwcGVuZChob25vckNvbnN0cmFpbnRzKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZWFybmVkVmFsdWVNZXRob2Q6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGVhcm5lZFZhbHVlTWV0aG9kKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBpbnNlcnRlZFByb2plY3RzTGlrZVN1bW1hcnk6ICIpOwotCQlpZiAoaW5zZXJ0ZWRQcm9qZWN0c0xpa2VTdW1tYXJ5RVNldCkgcmVzdWx0LmFwcGVuZChpbnNlcnRlZFByb2plY3RzTGlrZVN1bW1hcnkpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBtdWx0aXBsZUNyaXRpY2FsUGF0aHM6ICIpOwotCQlpZiAobXVsdGlwbGVDcml0aWNhbFBhdGhzRVNldCkgcmVzdWx0LmFwcGVuZChtdWx0aXBsZUNyaXRpY2FsUGF0aHMpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBuZXdUYXNrc0VmZm9ydERyaXZlbjogIik7Ci0JCWlmIChuZXdUYXNrc0VmZm9ydERyaXZlbkVTZXQpIHJlc3VsdC5hcHBlbmQobmV3VGFza3NFZmZvcnREcml2ZW4pOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBuZXdUYXNrc0VzdGltYXRlZDogIik7Ci0JCWlmIChuZXdUYXNrc0VzdGltYXRlZEVTZXQpIHJlc3VsdC5hcHBlbmQobmV3VGFza3NFc3RpbWF0ZWQpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBzcGxpdHNJblByb2dyZXNzVGFza3M6ICIpOwotCQlpZiAoc3BsaXRzSW5Qcm9ncmVzc1Rhc2tzRVNldCkgcmVzdWx0LmFwcGVuZChzcGxpdHNJblByb2dyZXNzVGFza3MpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBzcHJlYWRBY3R1YWxDb3N0OiAiKTsKLQkJaWYgKHNwcmVhZEFjdHVhbENvc3RFU2V0KSByZXN1bHQuYXBwZW5kKHNwcmVhZEFjdHVhbENvc3QpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBzcHJlYWRQZXJjZW50Q29tcGxldGU6ICIpOwotCQlpZiAoc3ByZWFkUGVyY2VudENvbXBsZXRlRVNldCkgcmVzdWx0LmFwcGVuZChzcHJlYWRQZXJjZW50Q29tcGxldGUpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCB0YXNrVXBkYXRlc1Jlc291cmNlOiAiKTsKLQkJaWYgKHRhc2tVcGRhdGVzUmVzb3VyY2VFU2V0KSByZXN1bHQuYXBwZW5kKHRhc2tVcGRhdGVzUmVzb3VyY2UpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBmaXNjYWxZZWFyU3RhcnQ6ICIpOwotCQlpZiAoZmlzY2FsWWVhclN0YXJ0RVNldCkgcmVzdWx0LmFwcGVuZChmaXNjYWxZZWFyU3RhcnQpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCB3ZWVrU3RhcnREYXk6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHdlZWtTdGFydERheSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgbW92ZUNvbXBsZXRlZEVuZHNCYWNrOiAiKTsKLQkJaWYgKG1vdmVDb21wbGV0ZWRFbmRzQmFja0VTZXQpIHJlc3VsdC5hcHBlbmQobW92ZUNvbXBsZXRlZEVuZHNCYWNrKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgbW92ZVJlbWFpbmluZ1N0YXJ0c0JhY2s6ICIpOwotCQlpZiAobW92ZVJlbWFpbmluZ1N0YXJ0c0JhY2tFU2V0KSByZXN1bHQuYXBwZW5kKG1vdmVSZW1haW5pbmdTdGFydHNCYWNrKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgbW92ZVJlbWFpbmluZ1N0YXJ0c0ZvcndhcmQ6ICIpOwotCQlpZiAobW92ZVJlbWFpbmluZ1N0YXJ0c0ZvcndhcmRFU2V0KSByZXN1bHQuYXBwZW5kKG1vdmVSZW1haW5pbmdTdGFydHNGb3J3YXJkKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgbW92ZUNvbXBsZXRlZEVuZHNGb3J3YXJkOiAiKTsKLQkJaWYgKG1vdmVDb21wbGV0ZWRFbmRzRm9yd2FyZEVTZXQpIHJlc3VsdC5hcHBlbmQobW92ZUNvbXBsZXRlZEVuZHNGb3J3YXJkKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgYmFzZWxpbmVGb3JFYXJuZWRWYWx1ZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoYmFzZWxpbmVGb3JFYXJuZWRWYWx1ZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgYXV0b0FkZE5ld1Jlc291cmNlc0FuZFRhc2tzOiAiKTsKLQkJaWYgKGF1dG9BZGROZXdSZXNvdXJjZXNBbmRUYXNrc0VTZXQpIHJlc3VsdC5hcHBlbmQoYXV0b0FkZE5ld1Jlc291cmNlc0FuZFRhc2tzKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgc3RhdHVzRGF0ZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoc3RhdHVzRGF0ZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgY3VycmVudERhdGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGN1cnJlbnREYXRlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBtaWNyb3NvZnRQcm9qZWN0U2VydmVyVVJMOiAiKTsKLQkJaWYgKG1pY3Jvc29mdFByb2plY3RTZXJ2ZXJVUkxFU2V0KSByZXN1bHQuYXBwZW5kKG1pY3Jvc29mdFByb2plY3RTZXJ2ZXJVUkwpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBhdXRvbGluazogIik7Ci0JCWlmIChhdXRvbGlua0VTZXQpIHJlc3VsdC5hcHBlbmQoYXV0b2xpbmspOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBuZXdUYXNrU3RhcnREYXRlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChuZXdUYXNrU3RhcnREYXRlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBkZWZhdWx0VGFza0VWTWV0aG9kOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChkZWZhdWx0VGFza0VWTWV0aG9kKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBwcm9qZWN0RXh0ZXJuYWxseUVkaXRlZDogIik7Ci0JCWlmIChwcm9qZWN0RXh0ZXJuYWxseUVkaXRlZEVTZXQpIHJlc3VsdC5hcHBlbmQocHJvamVjdEV4dGVybmFsbHlFZGl0ZWQpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBleHRlbmRlZENyZWF0aW9uRGF0ZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZXh0ZW5kZWRDcmVhdGlvbkRhdGUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGFjdHVhbHNJblN5bmM6ICIpOwotCQlpZiAoYWN0dWFsc0luU3luY0VTZXQpIHJlc3VsdC5hcHBlbmQoYWN0dWFsc0luU3luYyk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHJlbW92ZUZpbGVQcm9wZXJ0aWVzOiAiKTsKLQkJaWYgKHJlbW92ZUZpbGVQcm9wZXJ0aWVzRVNldCkgcmVzdWx0LmFwcGVuZChyZW1vdmVGaWxlUHJvcGVydGllcyk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGFkbWluUHJvamVjdDogIik7Ci0JCWlmIChhZG1pblByb2plY3RFU2V0KSByZXN1bHQuYXBwZW5kKGFkbWluUHJvamVjdCk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9Qcm9qZWN0SW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL1JhdGVJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvUmF0ZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmFjZGFmNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvUmF0ZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0MCArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFJhdGVJbXBsLmphdmEsdiAxLjEgMjAwOC8wMS8xNSAwODo1MTo1MyBqdGhhbSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbDsKLQotaW1wb3J0IGphdmEubWF0aC5CaWdEZWNpbWFsOwotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SYXRlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UmF0ZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlJhdGVJbXBsI2dldFJhdGVzRnJvbSA8ZW0+UmF0ZXMgRnJvbTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlJhdGVJbXBsI2dldFJhdGVzVG8gPGVtPlJhdGVzIFRvPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUmF0ZUltcGwjZ2V0UmF0ZVRhYmxlIDxlbT5SYXRlIFRhYmxlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUmF0ZUltcGwjZ2V0U3RhbmRhcmRSYXRlIDxlbT5TdGFuZGFyZCBSYXRlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUmF0ZUltcGwjZ2V0U3RhbmRhcmRSYXRlRm9ybWF0IDxlbT5TdGFuZGFyZCBSYXRlIEZvcm1hdDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlJhdGVJbXBsI2dldE92ZXJ0aW1lUmF0ZSA8ZW0+T3ZlcnRpbWUgUmF0ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlJhdGVJbXBsI2dldE92ZXJ0aW1lUmF0ZUZvcm1hdCA8ZW0+T3ZlcnRpbWUgUmF0ZSBGb3JtYXQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5SYXRlSW1wbCNnZXRDb3N0UGVyVXNlIDxlbT5Db3N0IFBlciBVc2U8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBSYXRlSW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgUmF0ZSB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJhdGVzRnJvbSgpIDxlbT5SYXRlcyBGcm9tPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSYXRlc0Zyb20oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgT2JqZWN0IFJBVEVTX0ZST01fRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmF0ZXNGcm9tKCkgPGVtPlJhdGVzIEZyb208L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJhdGVzRnJvbSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCByYXRlc0Zyb20gPSBSQVRFU19GUk9NX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJhdGVzVG8oKSA8ZW0+UmF0ZXMgVG88L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJhdGVzVG8oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgT2JqZWN0IFJBVEVTX1RPX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJhdGVzVG8oKSA8ZW0+UmF0ZXMgVG88L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJhdGVzVG8oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgcmF0ZXNUbyA9IFJBVEVTX1RPX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJhdGVUYWJsZSgpIDxlbT5SYXRlIFRhYmxlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSYXRlVGFibGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBSQVRFX1RBQkxFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJhdGVUYWJsZSgpIDxlbT5SYXRlIFRhYmxlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSYXRlVGFibGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdJbnRlZ2VyIHJhdGVUYWJsZSA9IFJBVEVfVEFCTEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U3RhbmRhcmRSYXRlKCkgPGVtPlN0YW5kYXJkIFJhdGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFN0YW5kYXJkUmF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdEZWNpbWFsIFNUQU5EQVJEX1JBVEVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U3RhbmRhcmRSYXRlKCkgPGVtPlN0YW5kYXJkIFJhdGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFN0YW5kYXJkUmF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0RlY2ltYWwgc3RhbmRhcmRSYXRlID0gU1RBTkRBUkRfUkFURV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTdGFuZGFyZFJhdGVGb3JtYXQoKSA8ZW0+U3RhbmRhcmQgUmF0ZSBGb3JtYXQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFN0YW5kYXJkUmF0ZUZvcm1hdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdJbnRlZ2VyIFNUQU5EQVJEX1JBVEVfRk9STUFUX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFN0YW5kYXJkUmF0ZUZvcm1hdCgpIDxlbT5TdGFuZGFyZCBSYXRlIEZvcm1hdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U3RhbmRhcmRSYXRlRm9ybWF0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnSW50ZWdlciBzdGFuZGFyZFJhdGVGb3JtYXQgPSBTVEFOREFSRF9SQVRFX0ZPUk1BVF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRPdmVydGltZVJhdGUoKSA8ZW0+T3ZlcnRpbWUgUmF0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0T3ZlcnRpbWVSYXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0RlY2ltYWwgT1ZFUlRJTUVfUkFURV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRPdmVydGltZVJhdGUoKSA8ZW0+T3ZlcnRpbWUgUmF0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0T3ZlcnRpbWVSYXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnRGVjaW1hbCBvdmVydGltZVJhdGUgPSBPVkVSVElNRV9SQVRFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE92ZXJ0aW1lUmF0ZUZvcm1hdCgpIDxlbT5PdmVydGltZSBSYXRlIEZvcm1hdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0T3ZlcnRpbWVSYXRlRm9ybWF0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0ludGVnZXIgT1ZFUlRJTUVfUkFURV9GT1JNQVRfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0T3ZlcnRpbWVSYXRlRm9ybWF0KCkgPGVtPk92ZXJ0aW1lIFJhdGUgRm9ybWF0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRPdmVydGltZVJhdGVGb3JtYXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdJbnRlZ2VyIG92ZXJ0aW1lUmF0ZUZvcm1hdCA9IE9WRVJUSU1FX1JBVEVfRk9STUFUX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENvc3RQZXJVc2UoKSA8ZW0+Q29zdCBQZXIgVXNlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDb3N0UGVyVXNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0RlY2ltYWwgQ09TVF9QRVJfVVNFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENvc3RQZXJVc2UoKSA8ZW0+Q29zdCBQZXIgVXNlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDb3N0UGVyVXNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnRGVjaW1hbCBjb3N0UGVyVXNlID0gQ09TVF9QRVJfVVNFX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFJhdGVJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0UmF0ZSgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0UmF0ZXNGcm9tKCkgewotCQlyZXR1cm4gcmF0ZXNGcm9tOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJhdGVzRnJvbShPYmplY3QgbmV3UmF0ZXNGcm9tKSB7Ci0JCU9iamVjdCBvbGRSYXRlc0Zyb20gPSByYXRlc0Zyb207Ci0JCXJhdGVzRnJvbSA9IG5ld1JhdGVzRnJvbTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5SQVRFX19SQVRFU19GUk9NLCBvbGRSYXRlc0Zyb20sIHJhdGVzRnJvbSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0UmF0ZXNUbygpIHsKLQkJcmV0dXJuIHJhdGVzVG87Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmF0ZXNUbyhPYmplY3QgbmV3UmF0ZXNUbykgewotCQlPYmplY3Qgb2xkUmF0ZXNUbyA9IHJhdGVzVG87Ci0JCXJhdGVzVG8gPSBuZXdSYXRlc1RvOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlJBVEVfX1JBVEVTX1RPLCBvbGRSYXRlc1RvLCByYXRlc1RvKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0UmF0ZVRhYmxlKCkgewotCQlyZXR1cm4gcmF0ZVRhYmxlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJhdGVUYWJsZShCaWdJbnRlZ2VyIG5ld1JhdGVUYWJsZSkgewotCQlCaWdJbnRlZ2VyIG9sZFJhdGVUYWJsZSA9IHJhdGVUYWJsZTsKLQkJcmF0ZVRhYmxlID0gbmV3UmF0ZVRhYmxlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlJBVEVfX1JBVEVfVEFCTEUsIG9sZFJhdGVUYWJsZSwgcmF0ZVRhYmxlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0RlY2ltYWwgZ2V0U3RhbmRhcmRSYXRlKCkgewotCQlyZXR1cm4gc3RhbmRhcmRSYXRlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFN0YW5kYXJkUmF0ZShCaWdEZWNpbWFsIG5ld1N0YW5kYXJkUmF0ZSkgewotCQlCaWdEZWNpbWFsIG9sZFN0YW5kYXJkUmF0ZSA9IHN0YW5kYXJkUmF0ZTsKLQkJc3RhbmRhcmRSYXRlID0gbmV3U3RhbmRhcmRSYXRlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlJBVEVfX1NUQU5EQVJEX1JBVEUsIG9sZFN0YW5kYXJkUmF0ZSwgc3RhbmRhcmRSYXRlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0U3RhbmRhcmRSYXRlRm9ybWF0KCkgewotCQlyZXR1cm4gc3RhbmRhcmRSYXRlRm9ybWF0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFN0YW5kYXJkUmF0ZUZvcm1hdChCaWdJbnRlZ2VyIG5ld1N0YW5kYXJkUmF0ZUZvcm1hdCkgewotCQlCaWdJbnRlZ2VyIG9sZFN0YW5kYXJkUmF0ZUZvcm1hdCA9IHN0YW5kYXJkUmF0ZUZvcm1hdDsKLQkJc3RhbmRhcmRSYXRlRm9ybWF0ID0gbmV3U3RhbmRhcmRSYXRlRm9ybWF0OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlJBVEVfX1NUQU5EQVJEX1JBVEVfRk9STUFULCBvbGRTdGFuZGFyZFJhdGVGb3JtYXQsIHN0YW5kYXJkUmF0ZUZvcm1hdCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdEZWNpbWFsIGdldE92ZXJ0aW1lUmF0ZSgpIHsKLQkJcmV0dXJuIG92ZXJ0aW1lUmF0ZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRPdmVydGltZVJhdGUoQmlnRGVjaW1hbCBuZXdPdmVydGltZVJhdGUpIHsKLQkJQmlnRGVjaW1hbCBvbGRPdmVydGltZVJhdGUgPSBvdmVydGltZVJhdGU7Ci0JCW92ZXJ0aW1lUmF0ZSA9IG5ld092ZXJ0aW1lUmF0ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5SQVRFX19PVkVSVElNRV9SQVRFLCBvbGRPdmVydGltZVJhdGUsIG92ZXJ0aW1lUmF0ZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGdldE92ZXJ0aW1lUmF0ZUZvcm1hdCgpIHsKLQkJcmV0dXJuIG92ZXJ0aW1lUmF0ZUZvcm1hdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRPdmVydGltZVJhdGVGb3JtYXQoQmlnSW50ZWdlciBuZXdPdmVydGltZVJhdGVGb3JtYXQpIHsKLQkJQmlnSW50ZWdlciBvbGRPdmVydGltZVJhdGVGb3JtYXQgPSBvdmVydGltZVJhdGVGb3JtYXQ7Ci0JCW92ZXJ0aW1lUmF0ZUZvcm1hdCA9IG5ld092ZXJ0aW1lUmF0ZUZvcm1hdDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5SQVRFX19PVkVSVElNRV9SQVRFX0ZPUk1BVCwgb2xkT3ZlcnRpbWVSYXRlRm9ybWF0LCBvdmVydGltZVJhdGVGb3JtYXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnRGVjaW1hbCBnZXRDb3N0UGVyVXNlKCkgewotCQlyZXR1cm4gY29zdFBlclVzZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb3N0UGVyVXNlKEJpZ0RlY2ltYWwgbmV3Q29zdFBlclVzZSkgewotCQlCaWdEZWNpbWFsIG9sZENvc3RQZXJVc2UgPSBjb3N0UGVyVXNlOwotCQljb3N0UGVyVXNlID0gbmV3Q29zdFBlclVzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5SQVRFX19DT1NUX1BFUl9VU0UsIG9sZENvc3RQZXJVc2UsIGNvc3RQZXJVc2UpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkFURV9fUkFURVNfRlJPTToKLQkJCQlyZXR1cm4gZ2V0UmF0ZXNGcm9tKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkFURV9fUkFURVNfVE86Ci0JCQkJcmV0dXJuIGdldFJhdGVzVG8oKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SQVRFX19SQVRFX1RBQkxFOgotCQkJCXJldHVybiBnZXRSYXRlVGFibGUoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SQVRFX19TVEFOREFSRF9SQVRFOgotCQkJCXJldHVybiBnZXRTdGFuZGFyZFJhdGUoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SQVRFX19TVEFOREFSRF9SQVRFX0ZPUk1BVDoKLQkJCQlyZXR1cm4gZ2V0U3RhbmRhcmRSYXRlRm9ybWF0KCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkFURV9fT1ZFUlRJTUVfUkFURToKLQkJCQlyZXR1cm4gZ2V0T3ZlcnRpbWVSYXRlKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkFURV9fT1ZFUlRJTUVfUkFURV9GT1JNQVQ6Ci0JCQkJcmV0dXJuIGdldE92ZXJ0aW1lUmF0ZUZvcm1hdCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJBVEVfX0NPU1RfUEVSX1VTRToKLQkJCQlyZXR1cm4gZ2V0Q29zdFBlclVzZSgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SQVRFX19SQVRFU19GUk9NOgotCQkJCXNldFJhdGVzRnJvbSgoT2JqZWN0KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkFURV9fUkFURVNfVE86Ci0JCQkJc2V0UmF0ZXNUbygoT2JqZWN0KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkFURV9fUkFURV9UQUJMRToKLQkJCQlzZXRSYXRlVGFibGUoKEJpZ0ludGVnZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SQVRFX19TVEFOREFSRF9SQVRFOgotCQkJCXNldFN0YW5kYXJkUmF0ZSgoQmlnRGVjaW1hbCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJBVEVfX1NUQU5EQVJEX1JBVEVfRk9STUFUOgotCQkJCXNldFN0YW5kYXJkUmF0ZUZvcm1hdCgoQmlnSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJBVEVfX09WRVJUSU1FX1JBVEU6Ci0JCQkJc2V0T3ZlcnRpbWVSYXRlKChCaWdEZWNpbWFsKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkFURV9fT1ZFUlRJTUVfUkFURV9GT1JNQVQ6Ci0JCQkJc2V0T3ZlcnRpbWVSYXRlRm9ybWF0KChCaWdJbnRlZ2VyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkFURV9fQ09TVF9QRVJfVVNFOgotCQkJCXNldENvc3RQZXJVc2UoKEJpZ0RlY2ltYWwpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkFURV9fUkFURVNfRlJPTToKLQkJCQlzZXRSYXRlc0Zyb20oUkFURVNfRlJPTV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJBVEVfX1JBVEVTX1RPOgotCQkJCXNldFJhdGVzVG8oUkFURVNfVE9fRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SQVRFX19SQVRFX1RBQkxFOgotCQkJCXNldFJhdGVUYWJsZShSQVRFX1RBQkxFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkFURV9fU1RBTkRBUkRfUkFURToKLQkJCQlzZXRTdGFuZGFyZFJhdGUoU1RBTkRBUkRfUkFURV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJBVEVfX1NUQU5EQVJEX1JBVEVfRk9STUFUOgotCQkJCXNldFN0YW5kYXJkUmF0ZUZvcm1hdChTVEFOREFSRF9SQVRFX0ZPUk1BVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJBVEVfX09WRVJUSU1FX1JBVEU6Ci0JCQkJc2V0T3ZlcnRpbWVSYXRlKE9WRVJUSU1FX1JBVEVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SQVRFX19PVkVSVElNRV9SQVRFX0ZPUk1BVDoKLQkJCQlzZXRPdmVydGltZVJhdGVGb3JtYXQoT1ZFUlRJTUVfUkFURV9GT1JNQVRfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SQVRFX19DT1NUX1BFUl9VU0U6Ci0JCQkJc2V0Q29zdFBlclVzZShDT1NUX1BFUl9VU0VfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJBVEVfX1JBVEVTX0ZST006Ci0JCQkJcmV0dXJuIFJBVEVTX0ZST01fRURFRkFVTFQgPT0gbnVsbCA/IHJhdGVzRnJvbSAhPSBudWxsIDogIVJBVEVTX0ZST01fRURFRkFVTFQuZXF1YWxzKHJhdGVzRnJvbSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkFURV9fUkFURVNfVE86Ci0JCQkJcmV0dXJuIFJBVEVTX1RPX0VERUZBVUxUID09IG51bGwgPyByYXRlc1RvICE9IG51bGwgOiAhUkFURVNfVE9fRURFRkFVTFQuZXF1YWxzKHJhdGVzVG8pOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJBVEVfX1JBVEVfVEFCTEU6Ci0JCQkJcmV0dXJuIFJBVEVfVEFCTEVfRURFRkFVTFQgPT0gbnVsbCA/IHJhdGVUYWJsZSAhPSBudWxsIDogIVJBVEVfVEFCTEVfRURFRkFVTFQuZXF1YWxzKHJhdGVUYWJsZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkFURV9fU1RBTkRBUkRfUkFURToKLQkJCQlyZXR1cm4gU1RBTkRBUkRfUkFURV9FREVGQVVMVCA9PSBudWxsID8gc3RhbmRhcmRSYXRlICE9IG51bGwgOiAhU1RBTkRBUkRfUkFURV9FREVGQVVMVC5lcXVhbHMoc3RhbmRhcmRSYXRlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SQVRFX19TVEFOREFSRF9SQVRFX0ZPUk1BVDoKLQkJCQlyZXR1cm4gU1RBTkRBUkRfUkFURV9GT1JNQVRfRURFRkFVTFQgPT0gbnVsbCA/IHN0YW5kYXJkUmF0ZUZvcm1hdCAhPSBudWxsIDogIVNUQU5EQVJEX1JBVEVfRk9STUFUX0VERUZBVUxULmVxdWFscyhzdGFuZGFyZFJhdGVGb3JtYXQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJBVEVfX09WRVJUSU1FX1JBVEU6Ci0JCQkJcmV0dXJuIE9WRVJUSU1FX1JBVEVfRURFRkFVTFQgPT0gbnVsbCA/IG92ZXJ0aW1lUmF0ZSAhPSBudWxsIDogIU9WRVJUSU1FX1JBVEVfRURFRkFVTFQuZXF1YWxzKG92ZXJ0aW1lUmF0ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkFURV9fT1ZFUlRJTUVfUkFURV9GT1JNQVQ6Ci0JCQkJcmV0dXJuIE9WRVJUSU1FX1JBVEVfRk9STUFUX0VERUZBVUxUID09IG51bGwgPyBvdmVydGltZVJhdGVGb3JtYXQgIT0gbnVsbCA6ICFPVkVSVElNRV9SQVRFX0ZPUk1BVF9FREVGQVVMVC5lcXVhbHMob3ZlcnRpbWVSYXRlRm9ybWF0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SQVRFX19DT1NUX1BFUl9VU0U6Ci0JCQkJcmV0dXJuIENPU1RfUEVSX1VTRV9FREVGQVVMVCA9PSBudWxsID8gY29zdFBlclVzZSAhPSBudWxsIDogIUNPU1RfUEVSX1VTRV9FREVGQVVMVC5lcXVhbHMoY29zdFBlclVzZSk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChyYXRlc0Zyb206ICIpOwotCQlyZXN1bHQuYXBwZW5kKHJhdGVzRnJvbSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcmF0ZXNUbzogIik7Ci0JCXJlc3VsdC5hcHBlbmQocmF0ZXNUbyk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcmF0ZVRhYmxlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChyYXRlVGFibGUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHN0YW5kYXJkUmF0ZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoc3RhbmRhcmRSYXRlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBzdGFuZGFyZFJhdGVGb3JtYXQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHN0YW5kYXJkUmF0ZUZvcm1hdCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgb3ZlcnRpbWVSYXRlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChvdmVydGltZVJhdGUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIG92ZXJ0aW1lUmF0ZUZvcm1hdDogIik7Ci0JCXJlc3VsdC5hcHBlbmQob3ZlcnRpbWVSYXRlRm9ybWF0KTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBjb3N0UGVyVXNlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChjb3N0UGVyVXNlKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vUmF0ZUltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9SYXRlc0ltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9SYXRlc0ltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTcyYzA1NC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvUmF0ZXNJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDkgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBSYXRlc0ltcGwuamF2YSx2IDEuMSAyMDA4LzAxLzE1IDA4OjUxOjUzIGp0aGFtIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmF0ZXM7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5SYXRlczwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlJhdGVzSW1wbCNnZXRSYXRlIDxlbT5SYXRlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUmF0ZXNJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBSYXRlcyB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmF0ZSgpIDxlbT5SYXRlPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCByYXRlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBSYXRlc0ltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXRSYXRlcygpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRSYXRlKCkgewotCQlpZiAocmF0ZSA9PSBudWxsKSB7Ci0JCQlyYXRlID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KFJhdGUuY2xhc3MsIHRoaXMsIE1zcHJvamVjdFBhY2thZ2UuUkFURVNfX1JBVEUpOwotCQl9Ci0JCXJldHVybiByYXRlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SQVRFU19fUkFURToKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRSYXRlKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SQVRFU19fUkFURToKLQkJCQlyZXR1cm4gZ2V0UmF0ZSgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SQVRFU19fUkFURToKLQkJCQlnZXRSYXRlKCkuY2xlYXIoKTsKLQkJCQlnZXRSYXRlKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJBVEVTX19SQVRFOgotCQkJCWdldFJhdGUoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJBVEVTX19SQVRFOgotCQkJCXJldHVybiByYXRlICE9IG51bGwgJiYgIXJhdGUuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLX0gLy9SYXRlc0ltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9SZXNvdXJjZUltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9SZXNvdXJjZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDUyN2Q3Yi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvUmVzb3VyY2VJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MjE1ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogUmVzb3VyY2VJbXBsLmphdmEsdiAxLjEgMjAwOC8wMS8xNSAwODo1MTo1MyBqdGhhbSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbDsKLQotaW1wb3J0IGphdmEubWF0aC5CaWdEZWNpbWFsOwotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXZhaWxhYmlsaXR5UGVyaW9kczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lMjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlMzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZTM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SYXRlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGltZXBoYXNlZERhdGFUeXBlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UmVzb3VyY2U8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5SZXNvdXJjZUltcGwjZ2V0VUlEIDxlbT5VSUQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5SZXNvdXJjZUltcGwjZ2V0SUQgPGVtPklEPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUmVzb3VyY2VJbXBsI2dldE5hbWUgPGVtPk5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5SZXNvdXJjZUltcGwjZ2V0VHlwZSA8ZW0+VHlwZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlJlc291cmNlSW1wbCNpc0lzTnVsbCA8ZW0+SXMgTnVsbDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlJlc291cmNlSW1wbCNnZXRJbml0aWFscyA8ZW0+SW5pdGlhbHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5SZXNvdXJjZUltcGwjZ2V0UGhvbmV0aWNzIDxlbT5QaG9uZXRpY3M8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5SZXNvdXJjZUltcGwjZ2V0TlRBY2NvdW50IDxlbT5OVCBBY2NvdW50PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUmVzb3VyY2VJbXBsI2dldE1hdGVyaWFsTGFiZWwgPGVtPk1hdGVyaWFsIExhYmVsPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUmVzb3VyY2VJbXBsI2dldENvZGUgPGVtPkNvZGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5SZXNvdXJjZUltcGwjZ2V0R3JvdXAgPGVtPkdyb3VwPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUmVzb3VyY2VJbXBsI2dldFdvcmtHcm91cCA8ZW0+V29yayBHcm91cDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlJlc291cmNlSW1wbCNnZXRFbWFpbEFkZHJlc3MgPGVtPkVtYWlsIEFkZHJlc3M8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5SZXNvdXJjZUltcGwjZ2V0SHlwZXJsaW5rIDxlbT5IeXBlcmxpbms8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5SZXNvdXJjZUltcGwjZ2V0SHlwZXJsaW5rQWRkcmVzcyA8ZW0+SHlwZXJsaW5rIEFkZHJlc3M8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5SZXNvdXJjZUltcGwjZ2V0SHlwZXJsaW5rU3ViQWRkcmVzcyA8ZW0+SHlwZXJsaW5rIFN1YiBBZGRyZXNzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUmVzb3VyY2VJbXBsI2dldE1heFVuaXRzIDxlbT5NYXggVW5pdHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5SZXNvdXJjZUltcGwjZ2V0UGVha1VuaXRzIDxlbT5QZWFrIFVuaXRzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUmVzb3VyY2VJbXBsI2lzT3ZlckFsbG9jYXRlZCA8ZW0+T3ZlciBBbGxvY2F0ZWQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5SZXNvdXJjZUltcGwjZ2V0QXZhaWxhYmxlRnJvbSA8ZW0+QXZhaWxhYmxlIEZyb208L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5SZXNvdXJjZUltcGwjZ2V0QXZhaWxhYmxlVG8gPGVtPkF2YWlsYWJsZSBUbzwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlJlc291cmNlSW1wbCNnZXRTdGFydCA8ZW0+U3RhcnQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5SZXNvdXJjZUltcGwjZ2V0RmluaXNoIDxlbT5GaW5pc2g8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5SZXNvdXJjZUltcGwjaXNDYW5MZXZlbCA8ZW0+Q2FuIExldmVsPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUmVzb3VyY2VJbXBsI2dldEFjY3J1ZUF0IDxlbT5BY2NydWUgQXQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5SZXNvdXJjZUltcGwjZ2V0V29yayA8ZW0+V29yazwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlJlc291cmNlSW1wbCNnZXRSZWd1bGFyV29yayA8ZW0+UmVndWxhciBXb3JrPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUmVzb3VyY2VJbXBsI2dldE92ZXJ0aW1lV29yayA8ZW0+T3ZlcnRpbWUgV29yazwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlJlc291cmNlSW1wbCNnZXRBY3R1YWxXb3JrIDxlbT5BY3R1YWwgV29yazwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlJlc291cmNlSW1wbCNnZXRSZW1haW5pbmdXb3JrIDxlbT5SZW1haW5pbmcgV29yazwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlJlc291cmNlSW1wbCNnZXRBY3R1YWxPdmVydGltZVdvcmsgPGVtPkFjdHVhbCBPdmVydGltZSBXb3JrPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUmVzb3VyY2VJbXBsI2dldFJlbWFpbmluZ092ZXJ0aW1lV29yayA8ZW0+UmVtYWluaW5nIE92ZXJ0aW1lIFdvcms8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5SZXNvdXJjZUltcGwjZ2V0UGVyY2VudFdvcmtDb21wbGV0ZSA8ZW0+UGVyY2VudCBXb3JrIENvbXBsZXRlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUmVzb3VyY2VJbXBsI2dldFN0YW5kYXJkUmF0ZSA8ZW0+U3RhbmRhcmQgUmF0ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlJlc291cmNlSW1wbCNnZXRTdGFuZGFyZFJhdGVGb3JtYXQgPGVtPlN0YW5kYXJkIFJhdGUgRm9ybWF0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUmVzb3VyY2VJbXBsI2dldENvc3QgPGVtPkNvc3Q8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5SZXNvdXJjZUltcGwjZ2V0T3ZlcnRpbWVSYXRlIDxlbT5PdmVydGltZSBSYXRlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUmVzb3VyY2VJbXBsI2dldE92ZXJ0aW1lUmF0ZUZvcm1hdCA8ZW0+T3ZlcnRpbWUgUmF0ZSBGb3JtYXQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5SZXNvdXJjZUltcGwjZ2V0T3ZlcnRpbWVDb3N0IDxlbT5PdmVydGltZSBDb3N0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUmVzb3VyY2VJbXBsI2dldENvc3RQZXJVc2UgPGVtPkNvc3QgUGVyIFVzZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlJlc291cmNlSW1wbCNnZXRBY3R1YWxDb3N0IDxlbT5BY3R1YWwgQ29zdDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlJlc291cmNlSW1wbCNnZXRBY3R1YWxPdmVydGltZUNvc3QgPGVtPkFjdHVhbCBPdmVydGltZSBDb3N0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUmVzb3VyY2VJbXBsI2dldFJlbWFpbmluZ0Nvc3QgPGVtPlJlbWFpbmluZyBDb3N0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUmVzb3VyY2VJbXBsI2dldFJlbWFpbmluZ092ZXJ0aW1lQ29zdCA8ZW0+UmVtYWluaW5nIE92ZXJ0aW1lIENvc3Q8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5SZXNvdXJjZUltcGwjZ2V0V29ya1ZhcmlhbmNlIDxlbT5Xb3JrIFZhcmlhbmNlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUmVzb3VyY2VJbXBsI2dldENvc3RWYXJpYW5jZSA8ZW0+Q29zdCBWYXJpYW5jZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlJlc291cmNlSW1wbCNnZXRTViA8ZW0+U1Y8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5SZXNvdXJjZUltcGwjZ2V0Q1YgPGVtPkNWPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUmVzb3VyY2VJbXBsI2dldEFDV1AgPGVtPkFDV1A8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5SZXNvdXJjZUltcGwjZ2V0Q2FsZW5kYXJVSUQgPGVtPkNhbGVuZGFyIFVJRDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlJlc291cmNlSW1wbCNnZXROb3RlcyA8ZW0+Tm90ZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5SZXNvdXJjZUltcGwjZ2V0QkNXUyA8ZW0+QkNXUzwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlJlc291cmNlSW1wbCNnZXRCQ1dQIDxlbT5CQ1dQPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUmVzb3VyY2VJbXBsI2lzSXNHZW5lcmljIDxlbT5JcyBHZW5lcmljPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUmVzb3VyY2VJbXBsI2lzSXNJbmFjdGl2ZSA8ZW0+SXMgSW5hY3RpdmU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5SZXNvdXJjZUltcGwjaXNJc0VudGVycHJpc2UgPGVtPklzIEVudGVycHJpc2U8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5SZXNvdXJjZUltcGwjZ2V0Qm9va2luZ1R5cGUgPGVtPkJvb2tpbmcgVHlwZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlJlc291cmNlSW1wbCNnZXRBY3R1YWxXb3JrUHJvdGVjdGVkIDxlbT5BY3R1YWwgV29yayBQcm90ZWN0ZWQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5SZXNvdXJjZUltcGwjZ2V0QWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkIDxlbT5BY3R1YWwgT3ZlcnRpbWUgV29yayBQcm90ZWN0ZWQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5SZXNvdXJjZUltcGwjZ2V0QWN0aXZlRGlyZWN0b3J5R1VJRCA8ZW0+QWN0aXZlIERpcmVjdG9yeSBHVUlEPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUmVzb3VyY2VJbXBsI2dldENyZWF0aW9uRGF0ZSA8ZW0+Q3JlYXRpb24gRGF0ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlJlc291cmNlSW1wbCNnZXRFeHRlbmRlZEF0dHJpYnV0ZSA8ZW0+RXh0ZW5kZWQgQXR0cmlidXRlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUmVzb3VyY2VJbXBsI2dldEJhc2VsaW5lIDxlbT5CYXNlbGluZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlJlc291cmNlSW1wbCNnZXRPdXRsaW5lQ29kZSA8ZW0+T3V0bGluZSBDb2RlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUmVzb3VyY2VJbXBsI2dldEF2YWlsYWJpbGl0eVBlcmlvZHMgPGVtPkF2YWlsYWJpbGl0eSBQZXJpb2RzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUmVzb3VyY2VJbXBsI2dldFJhdGVzIDxlbT5SYXRlczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlJlc291cmNlSW1wbCNnZXRUaW1lcGhhc2VkRGF0YSA8ZW0+VGltZXBoYXNlZCBEYXRhPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUmVzb3VyY2VJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBSZXNvdXJjZSB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFVJRCgpIDxlbT5VSUQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFVJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdJbnRlZ2VyIFVJRF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRVSUQoKSA8ZW0+VUlEPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRVSUQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdJbnRlZ2VyIHVJRCA9IFVJRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJRCgpIDxlbT5JRDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SUQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBJRF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJRCgpIDxlbT5JRDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SUQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdJbnRlZ2VyIGlEID0gSURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZSgpIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWUoKSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBuYW1lID0gTkFNRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUeXBlKCkgPGVtPlR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBUWVBFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFR5cGUoKSA8ZW0+VHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0ludGVnZXIgdHlwZSA9IFRZUEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNJc051bGwoKSA8ZW0+SXMgTnVsbDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNJc051bGwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBJU19OVUxMX0VERUZBVUxUID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0lzTnVsbCgpIDxlbT5JcyBOdWxsPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0lzTnVsbCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNOdWxsID0gSVNfTlVMTF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgSXMgTnVsbCBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNOdWxsRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEluaXRpYWxzKCkgPGVtPkluaXRpYWxzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJbml0aWFscygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5JVElBTFNfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SW5pdGlhbHMoKSA8ZW0+SW5pdGlhbHM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEluaXRpYWxzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGluaXRpYWxzID0gSU5JVElBTFNfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UGhvbmV0aWNzKCkgPGVtPlBob25ldGljczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UGhvbmV0aWNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQSE9ORVRJQ1NfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UGhvbmV0aWNzKCkgPGVtPlBob25ldGljczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UGhvbmV0aWNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHBob25ldGljcyA9IFBIT05FVElDU19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROVEFjY291bnQoKSA8ZW0+TlQgQWNjb3VudDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TlRBY2NvdW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBOVEFDQ09VTlRfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TlRBY2NvdW50KCkgPGVtPk5UIEFjY291bnQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE5UQWNjb3VudCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBuVEFjY291bnQgPSBOVEFDQ09VTlRfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWF0ZXJpYWxMYWJlbCgpIDxlbT5NYXRlcmlhbCBMYWJlbDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TWF0ZXJpYWxMYWJlbCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFURVJJQUxfTEFCRUxfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWF0ZXJpYWxMYWJlbCgpIDxlbT5NYXRlcmlhbCBMYWJlbDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TWF0ZXJpYWxMYWJlbCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBtYXRlcmlhbExhYmVsID0gTUFURVJJQUxfTEFCRUxfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q29kZSgpIDxlbT5Db2RlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDb2RlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBDT0RFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENvZGUoKSA8ZW0+Q29kZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q29kZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBjb2RlID0gQ09ERV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRHcm91cCgpIDxlbT5Hcm91cDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0R3JvdXAoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEdST1VQX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEdyb3VwKCkgPGVtPkdyb3VwPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRHcm91cCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBncm91cCA9IEdST1VQX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFdvcmtHcm91cCgpIDxlbT5Xb3JrIEdyb3VwPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRXb3JrR3JvdXAoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBXT1JLX0dST1VQX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFdvcmtHcm91cCgpIDxlbT5Xb3JrIEdyb3VwPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRXb3JrR3JvdXAoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdJbnRlZ2VyIHdvcmtHcm91cCA9IFdPUktfR1JPVVBfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RW1haWxBZGRyZXNzKCkgPGVtPkVtYWlsIEFkZHJlc3M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEVtYWlsQWRkcmVzcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU1BSUxfQUREUkVTU19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFbWFpbEFkZHJlc3MoKSA8ZW0+RW1haWwgQWRkcmVzczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RW1haWxBZGRyZXNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGVtYWlsQWRkcmVzcyA9IEVNQUlMX0FERFJFU1NfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SHlwZXJsaW5rKCkgPGVtPkh5cGVybGluazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SHlwZXJsaW5rKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBIWVBFUkxJTktfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SHlwZXJsaW5rKCkgPGVtPkh5cGVybGluazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SHlwZXJsaW5rKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGh5cGVybGluayA9IEhZUEVSTElOS19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRIeXBlcmxpbmtBZGRyZXNzKCkgPGVtPkh5cGVybGluayBBZGRyZXNzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRIeXBlcmxpbmtBZGRyZXNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBIWVBFUkxJTktfQUREUkVTU19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRIeXBlcmxpbmtBZGRyZXNzKCkgPGVtPkh5cGVybGluayBBZGRyZXNzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRIeXBlcmxpbmtBZGRyZXNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGh5cGVybGlua0FkZHJlc3MgPSBIWVBFUkxJTktfQUREUkVTU19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRIeXBlcmxpbmtTdWJBZGRyZXNzKCkgPGVtPkh5cGVybGluayBTdWIgQWRkcmVzczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SHlwZXJsaW5rU3ViQWRkcmVzcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgSFlQRVJMSU5LX1NVQl9BRERSRVNTX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEh5cGVybGlua1N1YkFkZHJlc3MoKSA8ZW0+SHlwZXJsaW5rIFN1YiBBZGRyZXNzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRIeXBlcmxpbmtTdWJBZGRyZXNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGh5cGVybGlua1N1YkFkZHJlc3MgPSBIWVBFUkxJTktfU1VCX0FERFJFU1NfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWF4VW5pdHMoKSA8ZW0+TWF4IFVuaXRzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRNYXhVbml0cygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBmbG9hdCBNQVhfVU5JVFNfRURFRkFVTFQgPSAxLjBGOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWF4VW5pdHMoKSA8ZW0+TWF4IFVuaXRzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRNYXhVbml0cygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGZsb2F0IG1heFVuaXRzID0gTUFYX1VOSVRTX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBNYXggVW5pdHMgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIG1heFVuaXRzRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBlYWtVbml0cygpIDxlbT5QZWFrIFVuaXRzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQZWFrVW5pdHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgZmxvYXQgUEVBS19VTklUU19FREVGQVVMVCA9IDAuMEY7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQZWFrVW5pdHMoKSA8ZW0+UGVhayBVbml0czwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UGVha1VuaXRzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgZmxvYXQgcGVha1VuaXRzID0gUEVBS19VTklUU19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgUGVhayBVbml0cyBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gcGVha1VuaXRzRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzT3ZlckFsbG9jYXRlZCgpIDxlbT5PdmVyIEFsbG9jYXRlZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNPdmVyQWxsb2NhdGVkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gT1ZFUl9BTExPQ0FURURfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzT3ZlckFsbG9jYXRlZCgpIDxlbT5PdmVyIEFsbG9jYXRlZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNPdmVyQWxsb2NhdGVkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBvdmVyQWxsb2NhdGVkID0gT1ZFUl9BTExPQ0FURURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIE92ZXIgQWxsb2NhdGVkIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBvdmVyQWxsb2NhdGVkRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEF2YWlsYWJsZUZyb20oKSA8ZW0+QXZhaWxhYmxlIEZyb208L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEF2YWlsYWJsZUZyb20oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgT2JqZWN0IEFWQUlMQUJMRV9GUk9NX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEF2YWlsYWJsZUZyb20oKSA8ZW0+QXZhaWxhYmxlIEZyb208L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEF2YWlsYWJsZUZyb20oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgYXZhaWxhYmxlRnJvbSA9IEFWQUlMQUJMRV9GUk9NX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEF2YWlsYWJsZVRvKCkgPGVtPkF2YWlsYWJsZSBUbzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QXZhaWxhYmxlVG8oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgT2JqZWN0IEFWQUlMQUJMRV9UT19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBdmFpbGFibGVUbygpIDxlbT5BdmFpbGFibGUgVG88L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEF2YWlsYWJsZVRvKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGF2YWlsYWJsZVRvID0gQVZBSUxBQkxFX1RPX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFN0YXJ0KCkgPGVtPlN0YXJ0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTdGFydCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBPYmplY3QgU1RBUlRfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U3RhcnQoKSA8ZW0+U3RhcnQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFN0YXJ0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IHN0YXJ0ID0gU1RBUlRfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RmluaXNoKCkgPGVtPkZpbmlzaDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RmluaXNoKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIE9iamVjdCBGSU5JU0hfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RmluaXNoKCkgPGVtPkZpbmlzaDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RmluaXNoKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGZpbmlzaCA9IEZJTklTSF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0NhbkxldmVsKCkgPGVtPkNhbiBMZXZlbDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNDYW5MZXZlbCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIENBTl9MRVZFTF9FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNDYW5MZXZlbCgpIDxlbT5DYW4gTGV2ZWw8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzQ2FuTGV2ZWwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGNhbkxldmVsID0gQ0FOX0xFVkVMX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBDYW4gTGV2ZWwgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGNhbkxldmVsRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFjY3J1ZUF0KCkgPGVtPkFjY3J1ZSBBdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QWNjcnVlQXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBBQ0NSVUVfQVRfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QWNjcnVlQXQoKSA8ZW0+QWNjcnVlIEF0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBY2NydWVBdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0ludGVnZXIgYWNjcnVlQXQgPSBBQ0NSVUVfQVRfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0V29yaygpIDxlbT5Xb3JrPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRXb3JrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIE9iamVjdCBXT1JLX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFdvcmsoKSA8ZW0+V29yazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0V29yaygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCB3b3JrID0gV09SS19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZWd1bGFyV29yaygpIDxlbT5SZWd1bGFyIFdvcms8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJlZ3VsYXJXb3JrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIE9iamVjdCBSRUdVTEFSX1dPUktfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVndWxhcldvcmsoKSA8ZW0+UmVndWxhciBXb3JrPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZWd1bGFyV29yaygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCByZWd1bGFyV29yayA9IFJFR1VMQVJfV09SS19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRPdmVydGltZVdvcmsoKSA8ZW0+T3ZlcnRpbWUgV29yazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0T3ZlcnRpbWVXb3JrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIE9iamVjdCBPVkVSVElNRV9XT1JLX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE92ZXJ0aW1lV29yaygpIDxlbT5PdmVydGltZSBXb3JrPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRPdmVydGltZVdvcmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3Qgb3ZlcnRpbWVXb3JrID0gT1ZFUlRJTUVfV09SS19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBY3R1YWxXb3JrKCkgPGVtPkFjdHVhbCBXb3JrPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBY3R1YWxXb3JrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIE9iamVjdCBBQ1RVQUxfV09SS19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBY3R1YWxXb3JrKCkgPGVtPkFjdHVhbCBXb3JrPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBY3R1YWxXb3JrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGFjdHVhbFdvcmsgPSBBQ1RVQUxfV09SS19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZW1haW5pbmdXb3JrKCkgPGVtPlJlbWFpbmluZyBXb3JrPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZW1haW5pbmdXb3JrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIE9iamVjdCBSRU1BSU5JTkdfV09SS19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZW1haW5pbmdXb3JrKCkgPGVtPlJlbWFpbmluZyBXb3JrPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZW1haW5pbmdXb3JrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IHJlbWFpbmluZ1dvcmsgPSBSRU1BSU5JTkdfV09SS19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBY3R1YWxPdmVydGltZVdvcmsoKSA8ZW0+QWN0dWFsIE92ZXJ0aW1lIFdvcms8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFjdHVhbE92ZXJ0aW1lV29yaygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBPYmplY3QgQUNUVUFMX09WRVJUSU1FX1dPUktfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QWN0dWFsT3ZlcnRpbWVXb3JrKCkgPGVtPkFjdHVhbCBPdmVydGltZSBXb3JrPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBY3R1YWxPdmVydGltZVdvcmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgYWN0dWFsT3ZlcnRpbWVXb3JrID0gQUNUVUFMX09WRVJUSU1FX1dPUktfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVtYWluaW5nT3ZlcnRpbWVXb3JrKCkgPGVtPlJlbWFpbmluZyBPdmVydGltZSBXb3JrPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZW1haW5pbmdPdmVydGltZVdvcmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgT2JqZWN0IFJFTUFJTklOR19PVkVSVElNRV9XT1JLX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlbWFpbmluZ092ZXJ0aW1lV29yaygpIDxlbT5SZW1haW5pbmcgT3ZlcnRpbWUgV29yazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmVtYWluaW5nT3ZlcnRpbWVXb3JrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IHJlbWFpbmluZ092ZXJ0aW1lV29yayA9IFJFTUFJTklOR19PVkVSVElNRV9XT1JLX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBlcmNlbnRXb3JrQ29tcGxldGUoKSA8ZW0+UGVyY2VudCBXb3JrIENvbXBsZXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQZXJjZW50V29ya0NvbXBsZXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0ludGVnZXIgUEVSQ0VOVF9XT1JLX0NPTVBMRVRFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBlcmNlbnRXb3JrQ29tcGxldGUoKSA8ZW0+UGVyY2VudCBXb3JrIENvbXBsZXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQZXJjZW50V29ya0NvbXBsZXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnSW50ZWdlciBwZXJjZW50V29ya0NvbXBsZXRlID0gUEVSQ0VOVF9XT1JLX0NPTVBMRVRFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFN0YW5kYXJkUmF0ZSgpIDxlbT5TdGFuZGFyZCBSYXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTdGFuZGFyZFJhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnRGVjaW1hbCBTVEFOREFSRF9SQVRFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFN0YW5kYXJkUmF0ZSgpIDxlbT5TdGFuZGFyZCBSYXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTdGFuZGFyZFJhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdEZWNpbWFsIHN0YW5kYXJkUmF0ZSA9IFNUQU5EQVJEX1JBVEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U3RhbmRhcmRSYXRlRm9ybWF0KCkgPGVtPlN0YW5kYXJkIFJhdGUgRm9ybWF0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTdGFuZGFyZFJhdGVGb3JtYXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBTVEFOREFSRF9SQVRFX0ZPUk1BVF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTdGFuZGFyZFJhdGVGb3JtYXQoKSA8ZW0+U3RhbmRhcmQgUmF0ZSBGb3JtYXQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFN0YW5kYXJkUmF0ZUZvcm1hdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0ludGVnZXIgc3RhbmRhcmRSYXRlRm9ybWF0ID0gU1RBTkRBUkRfUkFURV9GT1JNQVRfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q29zdCgpIDxlbT5Db3N0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDb3N0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0RlY2ltYWwgQ09TVF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb3N0KCkgPGVtPkNvc3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENvc3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdEZWNpbWFsIGNvc3QgPSBDT1NUX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE92ZXJ0aW1lUmF0ZSgpIDxlbT5PdmVydGltZSBSYXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRPdmVydGltZVJhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnRGVjaW1hbCBPVkVSVElNRV9SQVRFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE92ZXJ0aW1lUmF0ZSgpIDxlbT5PdmVydGltZSBSYXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRPdmVydGltZVJhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdEZWNpbWFsIG92ZXJ0aW1lUmF0ZSA9IE9WRVJUSU1FX1JBVEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0T3ZlcnRpbWVSYXRlRm9ybWF0KCkgPGVtPk92ZXJ0aW1lIFJhdGUgRm9ybWF0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRPdmVydGltZVJhdGVGb3JtYXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBPVkVSVElNRV9SQVRFX0ZPUk1BVF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRPdmVydGltZVJhdGVGb3JtYXQoKSA8ZW0+T3ZlcnRpbWUgUmF0ZSBGb3JtYXQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE92ZXJ0aW1lUmF0ZUZvcm1hdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0ludGVnZXIgb3ZlcnRpbWVSYXRlRm9ybWF0ID0gT1ZFUlRJTUVfUkFURV9GT1JNQVRfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0T3ZlcnRpbWVDb3N0KCkgPGVtPk92ZXJ0aW1lIENvc3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE92ZXJ0aW1lQ29zdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdEZWNpbWFsIE9WRVJUSU1FX0NPU1RfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0T3ZlcnRpbWVDb3N0KCkgPGVtPk92ZXJ0aW1lIENvc3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE92ZXJ0aW1lQ29zdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0RlY2ltYWwgb3ZlcnRpbWVDb3N0ID0gT1ZFUlRJTUVfQ09TVF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb3N0UGVyVXNlKCkgPGVtPkNvc3QgUGVyIFVzZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q29zdFBlclVzZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdEZWNpbWFsIENPU1RfUEVSX1VTRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb3N0UGVyVXNlKCkgPGVtPkNvc3QgUGVyIFVzZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q29zdFBlclVzZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0RlY2ltYWwgY29zdFBlclVzZSA9IENPU1RfUEVSX1VTRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBY3R1YWxDb3N0KCkgPGVtPkFjdHVhbCBDb3N0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBY3R1YWxDb3N0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0RlY2ltYWwgQUNUVUFMX0NPU1RfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QWN0dWFsQ29zdCgpIDxlbT5BY3R1YWwgQ29zdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QWN0dWFsQ29zdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0RlY2ltYWwgYWN0dWFsQ29zdCA9IEFDVFVBTF9DT1NUX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFjdHVhbE92ZXJ0aW1lQ29zdCgpIDxlbT5BY3R1YWwgT3ZlcnRpbWUgQ29zdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QWN0dWFsT3ZlcnRpbWVDb3N0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0RlY2ltYWwgQUNUVUFMX09WRVJUSU1FX0NPU1RfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QWN0dWFsT3ZlcnRpbWVDb3N0KCkgPGVtPkFjdHVhbCBPdmVydGltZSBDb3N0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBY3R1YWxPdmVydGltZUNvc3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdEZWNpbWFsIGFjdHVhbE92ZXJ0aW1lQ29zdCA9IEFDVFVBTF9PVkVSVElNRV9DT1NUX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlbWFpbmluZ0Nvc3QoKSA8ZW0+UmVtYWluaW5nIENvc3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJlbWFpbmluZ0Nvc3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnRGVjaW1hbCBSRU1BSU5JTkdfQ09TVF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZW1haW5pbmdDb3N0KCkgPGVtPlJlbWFpbmluZyBDb3N0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZW1haW5pbmdDb3N0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnRGVjaW1hbCByZW1haW5pbmdDb3N0ID0gUkVNQUlOSU5HX0NPU1RfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVtYWluaW5nT3ZlcnRpbWVDb3N0KCkgPGVtPlJlbWFpbmluZyBPdmVydGltZSBDb3N0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZW1haW5pbmdPdmVydGltZUNvc3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnRGVjaW1hbCBSRU1BSU5JTkdfT1ZFUlRJTUVfQ09TVF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZW1haW5pbmdPdmVydGltZUNvc3QoKSA8ZW0+UmVtYWluaW5nIE92ZXJ0aW1lIENvc3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJlbWFpbmluZ092ZXJ0aW1lQ29zdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0RlY2ltYWwgcmVtYWluaW5nT3ZlcnRpbWVDb3N0ID0gUkVNQUlOSU5HX09WRVJUSU1FX0NPU1RfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0V29ya1ZhcmlhbmNlKCkgPGVtPldvcmsgVmFyaWFuY2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFdvcmtWYXJpYW5jZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBmbG9hdCBXT1JLX1ZBUklBTkNFX0VERUZBVUxUID0gMC4wRjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFdvcmtWYXJpYW5jZSgpIDxlbT5Xb3JrIFZhcmlhbmNlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRXb3JrVmFyaWFuY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBmbG9hdCB3b3JrVmFyaWFuY2UgPSBXT1JLX1ZBUklBTkNFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBXb3JrIFZhcmlhbmNlIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiB3b3JrVmFyaWFuY2VFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q29zdFZhcmlhbmNlKCkgPGVtPkNvc3QgVmFyaWFuY2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENvc3RWYXJpYW5jZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBmbG9hdCBDT1NUX1ZBUklBTkNFX0VERUZBVUxUID0gMC4wRjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENvc3RWYXJpYW5jZSgpIDxlbT5Db3N0IFZhcmlhbmNlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDb3N0VmFyaWFuY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBmbG9hdCBjb3N0VmFyaWFuY2UgPSBDT1NUX1ZBUklBTkNFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBDb3N0IFZhcmlhbmNlIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBjb3N0VmFyaWFuY2VFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U1YoKSA8ZW0+U1Y8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFNWKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGZsb2F0IFNWX0VERUZBVUxUID0gMC4wRjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNWKCkgPGVtPlNWPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTVigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGZsb2F0IHNWID0gU1ZfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIFNWIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBzVkVTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDVigpIDxlbT5DVjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q1YoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgZmxvYXQgQ1ZfRURFRkFVTFQgPSAwLjBGOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q1YoKSA8ZW0+Q1Y8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENWKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgZmxvYXQgY1YgPSBDVl9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgQ1YgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGNWRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFDV1AoKSA8ZW0+QUNXUDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QUNXUCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBmbG9hdCBBQ1dQX0VERUZBVUxUID0gMC4wRjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFDV1AoKSA8ZW0+QUNXUDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QUNXUCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGZsb2F0IGFDV1AgPSBBQ1dQX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBBQ1dQIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBhQ1dQRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENhbGVuZGFyVUlEKCkgPGVtPkNhbGVuZGFyIFVJRDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q2FsZW5kYXJVSUQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBDQUxFTkRBUl9VSURfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q2FsZW5kYXJVSUQoKSA8ZW0+Q2FsZW5kYXIgVUlEPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDYWxlbmRhclVJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0ludGVnZXIgY2FsZW5kYXJVSUQgPSBDQUxFTkRBUl9VSURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Tm90ZXMoKSA8ZW0+Tm90ZXM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE5vdGVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBOT1RFU19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROb3RlcygpIDxlbT5Ob3RlczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Tm90ZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgbm90ZXMgPSBOT1RFU19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRCQ1dTKCkgPGVtPkJDV1M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEJDV1MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgZmxvYXQgQkNXU19FREVGQVVMVCA9IDAuMEY7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRCQ1dTKCkgPGVtPkJDV1M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEJDV1MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBmbG9hdCBiQ1dTID0gQkNXU19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgQkNXUyBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gYkNXU0VTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRCQ1dQKCkgPGVtPkJDV1A8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEJDV1AoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgZmxvYXQgQkNXUF9FREVGQVVMVCA9IDAuMEY7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRCQ1dQKCkgPGVtPkJDV1A8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEJDV1AoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBmbG9hdCBiQ1dQID0gQkNXUF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgQkNXUCBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gYkNXUEVTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0lzR2VuZXJpYygpIDxlbT5JcyBHZW5lcmljPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0lzR2VuZXJpYygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIElTX0dFTkVSSUNfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzSXNHZW5lcmljKCkgPGVtPklzIEdlbmVyaWM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzSXNHZW5lcmljKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0dlbmVyaWMgPSBJU19HRU5FUklDX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBJcyBHZW5lcmljIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0dlbmVyaWNFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNJc0luYWN0aXZlKCkgPGVtPklzIEluYWN0aXZlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0lzSW5hY3RpdmUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBJU19JTkFDVElWRV9FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNJc0luYWN0aXZlKCkgPGVtPklzIEluYWN0aXZlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0lzSW5hY3RpdmUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzSW5hY3RpdmUgPSBJU19JTkFDVElWRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgSXMgSW5hY3RpdmUgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzSW5hY3RpdmVFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNJc0VudGVycHJpc2UoKSA8ZW0+SXMgRW50ZXJwcmlzZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNJc0VudGVycHJpc2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBJU19FTlRFUlBSSVNFX0VERUZBVUxUID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0lzRW50ZXJwcmlzZSgpIDxlbT5JcyBFbnRlcnByaXNlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0lzRW50ZXJwcmlzZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNFbnRlcnByaXNlID0gSVNfRU5URVJQUklTRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgSXMgRW50ZXJwcmlzZSBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNFbnRlcnByaXNlRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEJvb2tpbmdUeXBlKCkgPGVtPkJvb2tpbmcgVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Qm9va2luZ1R5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBCT09LSU5HX1RZUEVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Qm9va2luZ1R5cGUoKSA8ZW0+Qm9va2luZyBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRCb29raW5nVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0ludGVnZXIgYm9va2luZ1R5cGUgPSBCT09LSU5HX1RZUEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QWN0dWFsV29ya1Byb3RlY3RlZCgpIDxlbT5BY3R1YWwgV29yayBQcm90ZWN0ZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFjdHVhbFdvcmtQcm90ZWN0ZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgT2JqZWN0IEFDVFVBTF9XT1JLX1BST1RFQ1RFRF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBY3R1YWxXb3JrUHJvdGVjdGVkKCkgPGVtPkFjdHVhbCBXb3JrIFByb3RlY3RlZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QWN0dWFsV29ya1Byb3RlY3RlZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBhY3R1YWxXb3JrUHJvdGVjdGVkID0gQUNUVUFMX1dPUktfUFJPVEVDVEVEX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZCgpIDxlbT5BY3R1YWwgT3ZlcnRpbWUgV29yayBQcm90ZWN0ZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBPYmplY3QgQUNUVUFMX09WRVJUSU1FX1dPUktfUFJPVEVDVEVEX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZCgpIDxlbT5BY3R1YWwgT3ZlcnRpbWUgV29yayBQcm90ZWN0ZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBhY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQgPSBBQ1RVQUxfT1ZFUlRJTUVfV09SS19QUk9URUNURURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QWN0aXZlRGlyZWN0b3J5R1VJRCgpIDxlbT5BY3RpdmUgRGlyZWN0b3J5IEdVSUQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFjdGl2ZURpcmVjdG9yeUdVSUQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElWRV9ESVJFQ1RPUllfR1VJRF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBY3RpdmVEaXJlY3RvcnlHVUlEKCkgPGVtPkFjdGl2ZSBEaXJlY3RvcnkgR1VJRDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QWN0aXZlRGlyZWN0b3J5R1VJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBhY3RpdmVEaXJlY3RvcnlHVUlEID0gQUNUSVZFX0RJUkVDVE9SWV9HVUlEX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENyZWF0aW9uRGF0ZSgpIDxlbT5DcmVhdGlvbiBEYXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDcmVhdGlvbkRhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgT2JqZWN0IENSRUFUSU9OX0RBVEVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q3JlYXRpb25EYXRlKCkgPGVtPkNyZWF0aW9uIERhdGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENyZWF0aW9uRGF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBjcmVhdGlvbkRhdGUgPSBDUkVBVElPTl9EQVRFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUoKSA8ZW0+RXh0ZW5kZWQgQXR0cmlidXRlPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEV4dGVuZGVkQXR0cmlidXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgZXh0ZW5kZWRBdHRyaWJ1dGUgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QmFzZWxpbmUoKSA8ZW0+QmFzZWxpbmU8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QmFzZWxpbmUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBiYXNlbGluZSA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRPdXRsaW5lQ29kZSgpIDxlbT5PdXRsaW5lIENvZGU8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0T3V0bGluZUNvZGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBvdXRsaW5lQ29kZSA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBdmFpbGFiaWxpdHlQZXJpb2RzKCkgPGVtPkF2YWlsYWJpbGl0eSBQZXJpb2RzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBdmFpbGFiaWxpdHlQZXJpb2RzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQXZhaWxhYmlsaXR5UGVyaW9kcyBhdmFpbGFiaWxpdHlQZXJpb2RzID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJhdGVzKCkgPGVtPlJhdGVzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSYXRlcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFJhdGVzIHJhdGVzID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFRpbWVwaGFzZWREYXRhKCkgPGVtPlRpbWVwaGFzZWQgRGF0YTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUaW1lcGhhc2VkRGF0YSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IHRpbWVwaGFzZWREYXRhID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBSZXNvdXJjZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXRSZXNvdXJjZSgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGdldFVJRCgpIHsKLQkJcmV0dXJuIHVJRDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRVSUQoQmlnSW50ZWdlciBuZXdVSUQpIHsKLQkJQmlnSW50ZWdlciBvbGRVSUQgPSB1SUQ7Ci0JCXVJRCA9IG5ld1VJRDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fVUlELCBvbGRVSUQsIHVJRCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGdldElEKCkgewotCQlyZXR1cm4gaUQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SUQoQmlnSW50ZWdlciBuZXdJRCkgewotCQlCaWdJbnRlZ2VyIG9sZElEID0gaUQ7Ci0JCWlEID0gbmV3SUQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0lELCBvbGRJRCwgaUQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBuYW1lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5ld05hbWUpIHsKLQkJU3RyaW5nIG9sZE5hbWUgPSBuYW1lOwotCQluYW1lID0gbmV3TmFtZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fTkFNRSwgb2xkTmFtZSwgbmFtZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGdldFR5cGUoKSB7Ci0JCXJldHVybiB0eXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFR5cGUoQmlnSW50ZWdlciBuZXdUeXBlKSB7Ci0JCUJpZ0ludGVnZXIgb2xkVHlwZSA9IHR5cGU7Ci0JCXR5cGUgPSBuZXdUeXBlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19UWVBFLCBvbGRUeXBlLCB0eXBlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNJc051bGwoKSB7Ci0JCXJldHVybiBpc051bGw7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SXNOdWxsKGJvb2xlYW4gbmV3SXNOdWxsKSB7Ci0JCWJvb2xlYW4gb2xkSXNOdWxsID0gaXNOdWxsOwotCQlpc051bGwgPSBuZXdJc051bGw7Ci0JCWJvb2xlYW4gb2xkSXNOdWxsRVNldCA9IGlzTnVsbEVTZXQ7Ci0JCWlzTnVsbEVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19JU19OVUxMLCBvbGRJc051bGwsIGlzTnVsbCwgIW9sZElzTnVsbEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldElzTnVsbCgpIHsKLQkJYm9vbGVhbiBvbGRJc051bGwgPSBpc051bGw7Ci0JCWJvb2xlYW4gb2xkSXNOdWxsRVNldCA9IGlzTnVsbEVTZXQ7Ci0JCWlzTnVsbCA9IElTX05VTExfRURFRkFVTFQ7Ci0JCWlzTnVsbEVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19JU19OVUxMLCBvbGRJc051bGwsIElTX05VTExfRURFRkFVTFQsIG9sZElzTnVsbEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldElzTnVsbCgpIHsKLQkJcmV0dXJuIGlzTnVsbEVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJbml0aWFscygpIHsKLQkJcmV0dXJuIGluaXRpYWxzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEluaXRpYWxzKFN0cmluZyBuZXdJbml0aWFscykgewotCQlTdHJpbmcgb2xkSW5pdGlhbHMgPSBpbml0aWFsczsKLQkJaW5pdGlhbHMgPSBuZXdJbml0aWFsczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fSU5JVElBTFMsIG9sZEluaXRpYWxzLCBpbml0aWFscykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UGhvbmV0aWNzKCkgewotCQlyZXR1cm4gcGhvbmV0aWNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBob25ldGljcyhTdHJpbmcgbmV3UGhvbmV0aWNzKSB7Ci0JCVN0cmluZyBvbGRQaG9uZXRpY3MgPSBwaG9uZXRpY3M7Ci0JCXBob25ldGljcyA9IG5ld1Bob25ldGljczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fUEhPTkVUSUNTLCBvbGRQaG9uZXRpY3MsIHBob25ldGljcykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TlRBY2NvdW50KCkgewotCQlyZXR1cm4gblRBY2NvdW50OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE5UQWNjb3VudChTdHJpbmcgbmV3TlRBY2NvdW50KSB7Ci0JCVN0cmluZyBvbGROVEFjY291bnQgPSBuVEFjY291bnQ7Ci0JCW5UQWNjb3VudCA9IG5ld05UQWNjb3VudDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fTlRBQ0NPVU5ULCBvbGROVEFjY291bnQsIG5UQWNjb3VudCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TWF0ZXJpYWxMYWJlbCgpIHsKLQkJcmV0dXJuIG1hdGVyaWFsTGFiZWw7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TWF0ZXJpYWxMYWJlbChTdHJpbmcgbmV3TWF0ZXJpYWxMYWJlbCkgewotCQlTdHJpbmcgb2xkTWF0ZXJpYWxMYWJlbCA9IG1hdGVyaWFsTGFiZWw7Ci0JCW1hdGVyaWFsTGFiZWwgPSBuZXdNYXRlcmlhbExhYmVsOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19NQVRFUklBTF9MQUJFTCwgb2xkTWF0ZXJpYWxMYWJlbCwgbWF0ZXJpYWxMYWJlbCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q29kZSgpIHsKLQkJcmV0dXJuIGNvZGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29kZShTdHJpbmcgbmV3Q29kZSkgewotCQlTdHJpbmcgb2xkQ29kZSA9IGNvZGU7Ci0JCWNvZGUgPSBuZXdDb2RlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19DT0RFLCBvbGRDb2RlLCBjb2RlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRHcm91cCgpIHsKLQkJcmV0dXJuIGdyb3VwOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEdyb3VwKFN0cmluZyBuZXdHcm91cCkgewotCQlTdHJpbmcgb2xkR3JvdXAgPSBncm91cDsKLQkJZ3JvdXAgPSBuZXdHcm91cDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fR1JPVVAsIG9sZEdyb3VwLCBncm91cCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGdldFdvcmtHcm91cCgpIHsKLQkJcmV0dXJuIHdvcmtHcm91cDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRXb3JrR3JvdXAoQmlnSW50ZWdlciBuZXdXb3JrR3JvdXApIHsKLQkJQmlnSW50ZWdlciBvbGRXb3JrR3JvdXAgPSB3b3JrR3JvdXA7Ci0JCXdvcmtHcm91cCA9IG5ld1dvcmtHcm91cDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fV09SS19HUk9VUCwgb2xkV29ya0dyb3VwLCB3b3JrR3JvdXApKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEVtYWlsQWRkcmVzcygpIHsKLQkJcmV0dXJuIGVtYWlsQWRkcmVzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFbWFpbEFkZHJlc3MoU3RyaW5nIG5ld0VtYWlsQWRkcmVzcykgewotCQlTdHJpbmcgb2xkRW1haWxBZGRyZXNzID0gZW1haWxBZGRyZXNzOwotCQllbWFpbEFkZHJlc3MgPSBuZXdFbWFpbEFkZHJlc3M7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0VNQUlMX0FERFJFU1MsIG9sZEVtYWlsQWRkcmVzcywgZW1haWxBZGRyZXNzKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRIeXBlcmxpbmsoKSB7Ci0JCXJldHVybiBoeXBlcmxpbms7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SHlwZXJsaW5rKFN0cmluZyBuZXdIeXBlcmxpbmspIHsKLQkJU3RyaW5nIG9sZEh5cGVybGluayA9IGh5cGVybGluazsKLQkJaHlwZXJsaW5rID0gbmV3SHlwZXJsaW5rOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19IWVBFUkxJTkssIG9sZEh5cGVybGluaywgaHlwZXJsaW5rKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRIeXBlcmxpbmtBZGRyZXNzKCkgewotCQlyZXR1cm4gaHlwZXJsaW5rQWRkcmVzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRIeXBlcmxpbmtBZGRyZXNzKFN0cmluZyBuZXdIeXBlcmxpbmtBZGRyZXNzKSB7Ci0JCVN0cmluZyBvbGRIeXBlcmxpbmtBZGRyZXNzID0gaHlwZXJsaW5rQWRkcmVzczsKLQkJaHlwZXJsaW5rQWRkcmVzcyA9IG5ld0h5cGVybGlua0FkZHJlc3M7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0hZUEVSTElOS19BRERSRVNTLCBvbGRIeXBlcmxpbmtBZGRyZXNzLCBoeXBlcmxpbmtBZGRyZXNzKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRIeXBlcmxpbmtTdWJBZGRyZXNzKCkgewotCQlyZXR1cm4gaHlwZXJsaW5rU3ViQWRkcmVzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRIeXBlcmxpbmtTdWJBZGRyZXNzKFN0cmluZyBuZXdIeXBlcmxpbmtTdWJBZGRyZXNzKSB7Ci0JCVN0cmluZyBvbGRIeXBlcmxpbmtTdWJBZGRyZXNzID0gaHlwZXJsaW5rU3ViQWRkcmVzczsKLQkJaHlwZXJsaW5rU3ViQWRkcmVzcyA9IG5ld0h5cGVybGlua1N1YkFkZHJlc3M7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0hZUEVSTElOS19TVUJfQUREUkVTUywgb2xkSHlwZXJsaW5rU3ViQWRkcmVzcywgaHlwZXJsaW5rU3ViQWRkcmVzcykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBmbG9hdCBnZXRNYXhVbml0cygpIHsKLQkJcmV0dXJuIG1heFVuaXRzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1heFVuaXRzKGZsb2F0IG5ld01heFVuaXRzKSB7Ci0JCWZsb2F0IG9sZE1heFVuaXRzID0gbWF4VW5pdHM7Ci0JCW1heFVuaXRzID0gbmV3TWF4VW5pdHM7Ci0JCWJvb2xlYW4gb2xkTWF4VW5pdHNFU2V0ID0gbWF4VW5pdHNFU2V0OwotCQltYXhVbml0c0VTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19NQVhfVU5JVFMsIG9sZE1heFVuaXRzLCBtYXhVbml0cywgIW9sZE1heFVuaXRzRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0TWF4VW5pdHMoKSB7Ci0JCWZsb2F0IG9sZE1heFVuaXRzID0gbWF4VW5pdHM7Ci0JCWJvb2xlYW4gb2xkTWF4VW5pdHNFU2V0ID0gbWF4VW5pdHNFU2V0OwotCQltYXhVbml0cyA9IE1BWF9VTklUU19FREVGQVVMVDsKLQkJbWF4VW5pdHNFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fTUFYX1VOSVRTLCBvbGRNYXhVbml0cywgTUFYX1VOSVRTX0VERUZBVUxULCBvbGRNYXhVbml0c0VTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldE1heFVuaXRzKCkgewotCQlyZXR1cm4gbWF4VW5pdHNFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBmbG9hdCBnZXRQZWFrVW5pdHMoKSB7Ci0JCXJldHVybiBwZWFrVW5pdHM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UGVha1VuaXRzKGZsb2F0IG5ld1BlYWtVbml0cykgewotCQlmbG9hdCBvbGRQZWFrVW5pdHMgPSBwZWFrVW5pdHM7Ci0JCXBlYWtVbml0cyA9IG5ld1BlYWtVbml0czsKLQkJYm9vbGVhbiBvbGRQZWFrVW5pdHNFU2V0ID0gcGVha1VuaXRzRVNldDsKLQkJcGVha1VuaXRzRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX1BFQUtfVU5JVFMsIG9sZFBlYWtVbml0cywgcGVha1VuaXRzLCAhb2xkUGVha1VuaXRzRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0UGVha1VuaXRzKCkgewotCQlmbG9hdCBvbGRQZWFrVW5pdHMgPSBwZWFrVW5pdHM7Ci0JCWJvb2xlYW4gb2xkUGVha1VuaXRzRVNldCA9IHBlYWtVbml0c0VTZXQ7Ci0JCXBlYWtVbml0cyA9IFBFQUtfVU5JVFNfRURFRkFVTFQ7Ci0JCXBlYWtVbml0c0VTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19QRUFLX1VOSVRTLCBvbGRQZWFrVW5pdHMsIFBFQUtfVU5JVFNfRURFRkFVTFQsIG9sZFBlYWtVbml0c0VTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldFBlYWtVbml0cygpIHsKLQkJcmV0dXJuIHBlYWtVbml0c0VTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNPdmVyQWxsb2NhdGVkKCkgewotCQlyZXR1cm4gb3ZlckFsbG9jYXRlZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRPdmVyQWxsb2NhdGVkKGJvb2xlYW4gbmV3T3ZlckFsbG9jYXRlZCkgewotCQlib29sZWFuIG9sZE92ZXJBbGxvY2F0ZWQgPSBvdmVyQWxsb2NhdGVkOwotCQlvdmVyQWxsb2NhdGVkID0gbmV3T3ZlckFsbG9jYXRlZDsKLQkJYm9vbGVhbiBvbGRPdmVyQWxsb2NhdGVkRVNldCA9IG92ZXJBbGxvY2F0ZWRFU2V0OwotCQlvdmVyQWxsb2NhdGVkRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX09WRVJfQUxMT0NBVEVELCBvbGRPdmVyQWxsb2NhdGVkLCBvdmVyQWxsb2NhdGVkLCAhb2xkT3ZlckFsbG9jYXRlZEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldE92ZXJBbGxvY2F0ZWQoKSB7Ci0JCWJvb2xlYW4gb2xkT3ZlckFsbG9jYXRlZCA9IG92ZXJBbGxvY2F0ZWQ7Ci0JCWJvb2xlYW4gb2xkT3ZlckFsbG9jYXRlZEVTZXQgPSBvdmVyQWxsb2NhdGVkRVNldDsKLQkJb3ZlckFsbG9jYXRlZCA9IE9WRVJfQUxMT0NBVEVEX0VERUZBVUxUOwotCQlvdmVyQWxsb2NhdGVkRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX09WRVJfQUxMT0NBVEVELCBvbGRPdmVyQWxsb2NhdGVkLCBPVkVSX0FMTE9DQVRFRF9FREVGQVVMVCwgb2xkT3ZlckFsbG9jYXRlZEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldE92ZXJBbGxvY2F0ZWQoKSB7Ci0JCXJldHVybiBvdmVyQWxsb2NhdGVkRVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEF2YWlsYWJsZUZyb20oKSB7Ci0JCXJldHVybiBhdmFpbGFibGVGcm9tOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEF2YWlsYWJsZUZyb20oT2JqZWN0IG5ld0F2YWlsYWJsZUZyb20pIHsKLQkJT2JqZWN0IG9sZEF2YWlsYWJsZUZyb20gPSBhdmFpbGFibGVGcm9tOwotCQlhdmFpbGFibGVGcm9tID0gbmV3QXZhaWxhYmxlRnJvbTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQVZBSUxBQkxFX0ZST00sIG9sZEF2YWlsYWJsZUZyb20sIGF2YWlsYWJsZUZyb20pKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEF2YWlsYWJsZVRvKCkgewotCQlyZXR1cm4gYXZhaWxhYmxlVG87Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QXZhaWxhYmxlVG8oT2JqZWN0IG5ld0F2YWlsYWJsZVRvKSB7Ci0JCU9iamVjdCBvbGRBdmFpbGFibGVUbyA9IGF2YWlsYWJsZVRvOwotCQlhdmFpbGFibGVUbyA9IG5ld0F2YWlsYWJsZVRvOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19BVkFJTEFCTEVfVE8sIG9sZEF2YWlsYWJsZVRvLCBhdmFpbGFibGVUbykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0U3RhcnQoKSB7Ci0JCXJldHVybiBzdGFydDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTdGFydChPYmplY3QgbmV3U3RhcnQpIHsKLQkJT2JqZWN0IG9sZFN0YXJ0ID0gc3RhcnQ7Ci0JCXN0YXJ0ID0gbmV3U3RhcnQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX1NUQVJULCBvbGRTdGFydCwgc3RhcnQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEZpbmlzaCgpIHsKLQkJcmV0dXJuIGZpbmlzaDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGaW5pc2goT2JqZWN0IG5ld0ZpbmlzaCkgewotCQlPYmplY3Qgb2xkRmluaXNoID0gZmluaXNoOwotCQlmaW5pc2ggPSBuZXdGaW5pc2g7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0ZJTklTSCwgb2xkRmluaXNoLCBmaW5pc2gpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0NhbkxldmVsKCkgewotCQlyZXR1cm4gY2FuTGV2ZWw7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q2FuTGV2ZWwoYm9vbGVhbiBuZXdDYW5MZXZlbCkgewotCQlib29sZWFuIG9sZENhbkxldmVsID0gY2FuTGV2ZWw7Ci0JCWNhbkxldmVsID0gbmV3Q2FuTGV2ZWw7Ci0JCWJvb2xlYW4gb2xkQ2FuTGV2ZWxFU2V0ID0gY2FuTGV2ZWxFU2V0OwotCQljYW5MZXZlbEVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19DQU5fTEVWRUwsIG9sZENhbkxldmVsLCBjYW5MZXZlbCwgIW9sZENhbkxldmVsRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0Q2FuTGV2ZWwoKSB7Ci0JCWJvb2xlYW4gb2xkQ2FuTGV2ZWwgPSBjYW5MZXZlbDsKLQkJYm9vbGVhbiBvbGRDYW5MZXZlbEVTZXQgPSBjYW5MZXZlbEVTZXQ7Ci0JCWNhbkxldmVsID0gQ0FOX0xFVkVMX0VERUZBVUxUOwotCQljYW5MZXZlbEVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19DQU5fTEVWRUwsIG9sZENhbkxldmVsLCBDQU5fTEVWRUxfRURFRkFVTFQsIG9sZENhbkxldmVsRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0Q2FuTGV2ZWwoKSB7Ci0JCXJldHVybiBjYW5MZXZlbEVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0QWNjcnVlQXQoKSB7Ci0JCXJldHVybiBhY2NydWVBdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBY2NydWVBdChCaWdJbnRlZ2VyIG5ld0FjY3J1ZUF0KSB7Ci0JCUJpZ0ludGVnZXIgb2xkQWNjcnVlQXQgPSBhY2NydWVBdDsKLQkJYWNjcnVlQXQgPSBuZXdBY2NydWVBdDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQUNDUlVFX0FULCBvbGRBY2NydWVBdCwgYWNjcnVlQXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFdvcmsoKSB7Ci0JCXJldHVybiB3b3JrOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFdvcmsoT2JqZWN0IG5ld1dvcmspIHsKLQkJT2JqZWN0IG9sZFdvcmsgPSB3b3JrOwotCQl3b3JrID0gbmV3V29yazsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fV09SSywgb2xkV29yaywgd29yaykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0UmVndWxhcldvcmsoKSB7Ci0JCXJldHVybiByZWd1bGFyV29yazsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZWd1bGFyV29yayhPYmplY3QgbmV3UmVndWxhcldvcmspIHsKLQkJT2JqZWN0IG9sZFJlZ3VsYXJXb3JrID0gcmVndWxhcldvcms7Ci0JCXJlZ3VsYXJXb3JrID0gbmV3UmVndWxhcldvcms7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX1JFR1VMQVJfV09SSywgb2xkUmVndWxhcldvcmssIHJlZ3VsYXJXb3JrKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRPdmVydGltZVdvcmsoKSB7Ci0JCXJldHVybiBvdmVydGltZVdvcms7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0T3ZlcnRpbWVXb3JrKE9iamVjdCBuZXdPdmVydGltZVdvcmspIHsKLQkJT2JqZWN0IG9sZE92ZXJ0aW1lV29yayA9IG92ZXJ0aW1lV29yazsKLQkJb3ZlcnRpbWVXb3JrID0gbmV3T3ZlcnRpbWVXb3JrOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19PVkVSVElNRV9XT1JLLCBvbGRPdmVydGltZVdvcmssIG92ZXJ0aW1lV29yaykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0QWN0dWFsV29yaygpIHsKLQkJcmV0dXJuIGFjdHVhbFdvcms7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QWN0dWFsV29yayhPYmplY3QgbmV3QWN0dWFsV29yaykgewotCQlPYmplY3Qgb2xkQWN0dWFsV29yayA9IGFjdHVhbFdvcms7Ci0JCWFjdHVhbFdvcmsgPSBuZXdBY3R1YWxXb3JrOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19BQ1RVQUxfV09SSywgb2xkQWN0dWFsV29yaywgYWN0dWFsV29yaykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0UmVtYWluaW5nV29yaygpIHsKLQkJcmV0dXJuIHJlbWFpbmluZ1dvcms7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmVtYWluaW5nV29yayhPYmplY3QgbmV3UmVtYWluaW5nV29yaykgewotCQlPYmplY3Qgb2xkUmVtYWluaW5nV29yayA9IHJlbWFpbmluZ1dvcms7Ci0JCXJlbWFpbmluZ1dvcmsgPSBuZXdSZW1haW5pbmdXb3JrOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19SRU1BSU5JTkdfV09SSywgb2xkUmVtYWluaW5nV29yaywgcmVtYWluaW5nV29yaykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0QWN0dWFsT3ZlcnRpbWVXb3JrKCkgewotCQlyZXR1cm4gYWN0dWFsT3ZlcnRpbWVXb3JrOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFjdHVhbE92ZXJ0aW1lV29yayhPYmplY3QgbmV3QWN0dWFsT3ZlcnRpbWVXb3JrKSB7Ci0JCU9iamVjdCBvbGRBY3R1YWxPdmVydGltZVdvcmsgPSBhY3R1YWxPdmVydGltZVdvcms7Ci0JCWFjdHVhbE92ZXJ0aW1lV29yayA9IG5ld0FjdHVhbE92ZXJ0aW1lV29yazsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQUNUVUFMX09WRVJUSU1FX1dPUkssIG9sZEFjdHVhbE92ZXJ0aW1lV29yaywgYWN0dWFsT3ZlcnRpbWVXb3JrKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRSZW1haW5pbmdPdmVydGltZVdvcmsoKSB7Ci0JCXJldHVybiByZW1haW5pbmdPdmVydGltZVdvcms7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmVtYWluaW5nT3ZlcnRpbWVXb3JrKE9iamVjdCBuZXdSZW1haW5pbmdPdmVydGltZVdvcmspIHsKLQkJT2JqZWN0IG9sZFJlbWFpbmluZ092ZXJ0aW1lV29yayA9IHJlbWFpbmluZ092ZXJ0aW1lV29yazsKLQkJcmVtYWluaW5nT3ZlcnRpbWVXb3JrID0gbmV3UmVtYWluaW5nT3ZlcnRpbWVXb3JrOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19SRU1BSU5JTkdfT1ZFUlRJTUVfV09SSywgb2xkUmVtYWluaW5nT3ZlcnRpbWVXb3JrLCByZW1haW5pbmdPdmVydGltZVdvcmspKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBnZXRQZXJjZW50V29ya0NvbXBsZXRlKCkgewotCQlyZXR1cm4gcGVyY2VudFdvcmtDb21wbGV0ZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQZXJjZW50V29ya0NvbXBsZXRlKEJpZ0ludGVnZXIgbmV3UGVyY2VudFdvcmtDb21wbGV0ZSkgewotCQlCaWdJbnRlZ2VyIG9sZFBlcmNlbnRXb3JrQ29tcGxldGUgPSBwZXJjZW50V29ya0NvbXBsZXRlOwotCQlwZXJjZW50V29ya0NvbXBsZXRlID0gbmV3UGVyY2VudFdvcmtDb21wbGV0ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fUEVSQ0VOVF9XT1JLX0NPTVBMRVRFLCBvbGRQZXJjZW50V29ya0NvbXBsZXRlLCBwZXJjZW50V29ya0NvbXBsZXRlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0RlY2ltYWwgZ2V0U3RhbmRhcmRSYXRlKCkgewotCQlyZXR1cm4gc3RhbmRhcmRSYXRlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFN0YW5kYXJkUmF0ZShCaWdEZWNpbWFsIG5ld1N0YW5kYXJkUmF0ZSkgewotCQlCaWdEZWNpbWFsIG9sZFN0YW5kYXJkUmF0ZSA9IHN0YW5kYXJkUmF0ZTsKLQkJc3RhbmRhcmRSYXRlID0gbmV3U3RhbmRhcmRSYXRlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19TVEFOREFSRF9SQVRFLCBvbGRTdGFuZGFyZFJhdGUsIHN0YW5kYXJkUmF0ZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGdldFN0YW5kYXJkUmF0ZUZvcm1hdCgpIHsKLQkJcmV0dXJuIHN0YW5kYXJkUmF0ZUZvcm1hdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTdGFuZGFyZFJhdGVGb3JtYXQoQmlnSW50ZWdlciBuZXdTdGFuZGFyZFJhdGVGb3JtYXQpIHsKLQkJQmlnSW50ZWdlciBvbGRTdGFuZGFyZFJhdGVGb3JtYXQgPSBzdGFuZGFyZFJhdGVGb3JtYXQ7Ci0JCXN0YW5kYXJkUmF0ZUZvcm1hdCA9IG5ld1N0YW5kYXJkUmF0ZUZvcm1hdDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fU1RBTkRBUkRfUkFURV9GT1JNQVQsIG9sZFN0YW5kYXJkUmF0ZUZvcm1hdCwgc3RhbmRhcmRSYXRlRm9ybWF0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0RlY2ltYWwgZ2V0Q29zdCgpIHsKLQkJcmV0dXJuIGNvc3Q7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29zdChCaWdEZWNpbWFsIG5ld0Nvc3QpIHsKLQkJQmlnRGVjaW1hbCBvbGRDb3N0ID0gY29zdDsKLQkJY29zdCA9IG5ld0Nvc3Q7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0NPU1QsIG9sZENvc3QsIGNvc3QpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnRGVjaW1hbCBnZXRPdmVydGltZVJhdGUoKSB7Ci0JCXJldHVybiBvdmVydGltZVJhdGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0T3ZlcnRpbWVSYXRlKEJpZ0RlY2ltYWwgbmV3T3ZlcnRpbWVSYXRlKSB7Ci0JCUJpZ0RlY2ltYWwgb2xkT3ZlcnRpbWVSYXRlID0gb3ZlcnRpbWVSYXRlOwotCQlvdmVydGltZVJhdGUgPSBuZXdPdmVydGltZVJhdGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX09WRVJUSU1FX1JBVEUsIG9sZE92ZXJ0aW1lUmF0ZSwgb3ZlcnRpbWVSYXRlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0T3ZlcnRpbWVSYXRlRm9ybWF0KCkgewotCQlyZXR1cm4gb3ZlcnRpbWVSYXRlRm9ybWF0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE92ZXJ0aW1lUmF0ZUZvcm1hdChCaWdJbnRlZ2VyIG5ld092ZXJ0aW1lUmF0ZUZvcm1hdCkgewotCQlCaWdJbnRlZ2VyIG9sZE92ZXJ0aW1lUmF0ZUZvcm1hdCA9IG92ZXJ0aW1lUmF0ZUZvcm1hdDsKLQkJb3ZlcnRpbWVSYXRlRm9ybWF0ID0gbmV3T3ZlcnRpbWVSYXRlRm9ybWF0OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19PVkVSVElNRV9SQVRFX0ZPUk1BVCwgb2xkT3ZlcnRpbWVSYXRlRm9ybWF0LCBvdmVydGltZVJhdGVGb3JtYXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnRGVjaW1hbCBnZXRPdmVydGltZUNvc3QoKSB7Ci0JCXJldHVybiBvdmVydGltZUNvc3Q7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0T3ZlcnRpbWVDb3N0KEJpZ0RlY2ltYWwgbmV3T3ZlcnRpbWVDb3N0KSB7Ci0JCUJpZ0RlY2ltYWwgb2xkT3ZlcnRpbWVDb3N0ID0gb3ZlcnRpbWVDb3N0OwotCQlvdmVydGltZUNvc3QgPSBuZXdPdmVydGltZUNvc3Q7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX09WRVJUSU1FX0NPU1QsIG9sZE92ZXJ0aW1lQ29zdCwgb3ZlcnRpbWVDb3N0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0RlY2ltYWwgZ2V0Q29zdFBlclVzZSgpIHsKLQkJcmV0dXJuIGNvc3RQZXJVc2U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29zdFBlclVzZShCaWdEZWNpbWFsIG5ld0Nvc3RQZXJVc2UpIHsKLQkJQmlnRGVjaW1hbCBvbGRDb3N0UGVyVXNlID0gY29zdFBlclVzZTsKLQkJY29zdFBlclVzZSA9IG5ld0Nvc3RQZXJVc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0NPU1RfUEVSX1VTRSwgb2xkQ29zdFBlclVzZSwgY29zdFBlclVzZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdEZWNpbWFsIGdldEFjdHVhbENvc3QoKSB7Ci0JCXJldHVybiBhY3R1YWxDb3N0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFjdHVhbENvc3QoQmlnRGVjaW1hbCBuZXdBY3R1YWxDb3N0KSB7Ci0JCUJpZ0RlY2ltYWwgb2xkQWN0dWFsQ29zdCA9IGFjdHVhbENvc3Q7Ci0JCWFjdHVhbENvc3QgPSBuZXdBY3R1YWxDb3N0OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19BQ1RVQUxfQ09TVCwgb2xkQWN0dWFsQ29zdCwgYWN0dWFsQ29zdCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdEZWNpbWFsIGdldEFjdHVhbE92ZXJ0aW1lQ29zdCgpIHsKLQkJcmV0dXJuIGFjdHVhbE92ZXJ0aW1lQ29zdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBY3R1YWxPdmVydGltZUNvc3QoQmlnRGVjaW1hbCBuZXdBY3R1YWxPdmVydGltZUNvc3QpIHsKLQkJQmlnRGVjaW1hbCBvbGRBY3R1YWxPdmVydGltZUNvc3QgPSBhY3R1YWxPdmVydGltZUNvc3Q7Ci0JCWFjdHVhbE92ZXJ0aW1lQ29zdCA9IG5ld0FjdHVhbE92ZXJ0aW1lQ29zdDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQUNUVUFMX09WRVJUSU1FX0NPU1QsIG9sZEFjdHVhbE92ZXJ0aW1lQ29zdCwgYWN0dWFsT3ZlcnRpbWVDb3N0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0RlY2ltYWwgZ2V0UmVtYWluaW5nQ29zdCgpIHsKLQkJcmV0dXJuIHJlbWFpbmluZ0Nvc3Q7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmVtYWluaW5nQ29zdChCaWdEZWNpbWFsIG5ld1JlbWFpbmluZ0Nvc3QpIHsKLQkJQmlnRGVjaW1hbCBvbGRSZW1haW5pbmdDb3N0ID0gcmVtYWluaW5nQ29zdDsKLQkJcmVtYWluaW5nQ29zdCA9IG5ld1JlbWFpbmluZ0Nvc3Q7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX1JFTUFJTklOR19DT1NULCBvbGRSZW1haW5pbmdDb3N0LCByZW1haW5pbmdDb3N0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0RlY2ltYWwgZ2V0UmVtYWluaW5nT3ZlcnRpbWVDb3N0KCkgewotCQlyZXR1cm4gcmVtYWluaW5nT3ZlcnRpbWVDb3N0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlbWFpbmluZ092ZXJ0aW1lQ29zdChCaWdEZWNpbWFsIG5ld1JlbWFpbmluZ092ZXJ0aW1lQ29zdCkgewotCQlCaWdEZWNpbWFsIG9sZFJlbWFpbmluZ092ZXJ0aW1lQ29zdCA9IHJlbWFpbmluZ092ZXJ0aW1lQ29zdDsKLQkJcmVtYWluaW5nT3ZlcnRpbWVDb3N0ID0gbmV3UmVtYWluaW5nT3ZlcnRpbWVDb3N0OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19SRU1BSU5JTkdfT1ZFUlRJTUVfQ09TVCwgb2xkUmVtYWluaW5nT3ZlcnRpbWVDb3N0LCByZW1haW5pbmdPdmVydGltZUNvc3QpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgZmxvYXQgZ2V0V29ya1ZhcmlhbmNlKCkgewotCQlyZXR1cm4gd29ya1ZhcmlhbmNlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFdvcmtWYXJpYW5jZShmbG9hdCBuZXdXb3JrVmFyaWFuY2UpIHsKLQkJZmxvYXQgb2xkV29ya1ZhcmlhbmNlID0gd29ya1ZhcmlhbmNlOwotCQl3b3JrVmFyaWFuY2UgPSBuZXdXb3JrVmFyaWFuY2U7Ci0JCWJvb2xlYW4gb2xkV29ya1ZhcmlhbmNlRVNldCA9IHdvcmtWYXJpYW5jZUVTZXQ7Ci0JCXdvcmtWYXJpYW5jZUVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19XT1JLX1ZBUklBTkNFLCBvbGRXb3JrVmFyaWFuY2UsIHdvcmtWYXJpYW5jZSwgIW9sZFdvcmtWYXJpYW5jZUVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldFdvcmtWYXJpYW5jZSgpIHsKLQkJZmxvYXQgb2xkV29ya1ZhcmlhbmNlID0gd29ya1ZhcmlhbmNlOwotCQlib29sZWFuIG9sZFdvcmtWYXJpYW5jZUVTZXQgPSB3b3JrVmFyaWFuY2VFU2V0OwotCQl3b3JrVmFyaWFuY2UgPSBXT1JLX1ZBUklBTkNFX0VERUZBVUxUOwotCQl3b3JrVmFyaWFuY2VFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fV09SS19WQVJJQU5DRSwgb2xkV29ya1ZhcmlhbmNlLCBXT1JLX1ZBUklBTkNFX0VERUZBVUxULCBvbGRXb3JrVmFyaWFuY2VFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRXb3JrVmFyaWFuY2UoKSB7Ci0JCXJldHVybiB3b3JrVmFyaWFuY2VFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBmbG9hdCBnZXRDb3N0VmFyaWFuY2UoKSB7Ci0JCXJldHVybiBjb3N0VmFyaWFuY2U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29zdFZhcmlhbmNlKGZsb2F0IG5ld0Nvc3RWYXJpYW5jZSkgewotCQlmbG9hdCBvbGRDb3N0VmFyaWFuY2UgPSBjb3N0VmFyaWFuY2U7Ci0JCWNvc3RWYXJpYW5jZSA9IG5ld0Nvc3RWYXJpYW5jZTsKLQkJYm9vbGVhbiBvbGRDb3N0VmFyaWFuY2VFU2V0ID0gY29zdFZhcmlhbmNlRVNldDsKLQkJY29zdFZhcmlhbmNlRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0NPU1RfVkFSSUFOQ0UsIG9sZENvc3RWYXJpYW5jZSwgY29zdFZhcmlhbmNlLCAhb2xkQ29zdFZhcmlhbmNlRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0Q29zdFZhcmlhbmNlKCkgewotCQlmbG9hdCBvbGRDb3N0VmFyaWFuY2UgPSBjb3N0VmFyaWFuY2U7Ci0JCWJvb2xlYW4gb2xkQ29zdFZhcmlhbmNlRVNldCA9IGNvc3RWYXJpYW5jZUVTZXQ7Ci0JCWNvc3RWYXJpYW5jZSA9IENPU1RfVkFSSUFOQ0VfRURFRkFVTFQ7Ci0JCWNvc3RWYXJpYW5jZUVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19DT1NUX1ZBUklBTkNFLCBvbGRDb3N0VmFyaWFuY2UsIENPU1RfVkFSSUFOQ0VfRURFRkFVTFQsIG9sZENvc3RWYXJpYW5jZUVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldENvc3RWYXJpYW5jZSgpIHsKLQkJcmV0dXJuIGNvc3RWYXJpYW5jZUVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGZsb2F0IGdldFNWKCkgewotCQlyZXR1cm4gc1Y7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0U1YoZmxvYXQgbmV3U1YpIHsKLQkJZmxvYXQgb2xkU1YgPSBzVjsKLQkJc1YgPSBuZXdTVjsKLQkJYm9vbGVhbiBvbGRTVkVTZXQgPSBzVkVTZXQ7Ci0JCXNWRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX1NWLCBvbGRTViwgc1YsICFvbGRTVkVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldFNWKCkgewotCQlmbG9hdCBvbGRTViA9IHNWOwotCQlib29sZWFuIG9sZFNWRVNldCA9IHNWRVNldDsKLQkJc1YgPSBTVl9FREVGQVVMVDsKLQkJc1ZFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fU1YsIG9sZFNWLCBTVl9FREVGQVVMVCwgb2xkU1ZFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRTVigpIHsKLQkJcmV0dXJuIHNWRVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgZmxvYXQgZ2V0Q1YoKSB7Ci0JCXJldHVybiBjVjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDVihmbG9hdCBuZXdDVikgewotCQlmbG9hdCBvbGRDViA9IGNWOwotCQljViA9IG5ld0NWOwotCQlib29sZWFuIG9sZENWRVNldCA9IGNWRVNldDsKLQkJY1ZFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQ1YsIG9sZENWLCBjViwgIW9sZENWRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0Q1YoKSB7Ci0JCWZsb2F0IG9sZENWID0gY1Y7Ci0JCWJvb2xlYW4gb2xkQ1ZFU2V0ID0gY1ZFU2V0OwotCQljViA9IENWX0VERUZBVUxUOwotCQljVkVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19DViwgb2xkQ1YsIENWX0VERUZBVUxULCBvbGRDVkVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldENWKCkgewotCQlyZXR1cm4gY1ZFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBmbG9hdCBnZXRBQ1dQKCkgewotCQlyZXR1cm4gYUNXUDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBQ1dQKGZsb2F0IG5ld0FDV1ApIHsKLQkJZmxvYXQgb2xkQUNXUCA9IGFDV1A7Ci0JCWFDV1AgPSBuZXdBQ1dQOwotCQlib29sZWFuIG9sZEFDV1BFU2V0ID0gYUNXUEVTZXQ7Ci0JCWFDV1BFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQUNXUCwgb2xkQUNXUCwgYUNXUCwgIW9sZEFDV1BFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRBQ1dQKCkgewotCQlmbG9hdCBvbGRBQ1dQID0gYUNXUDsKLQkJYm9vbGVhbiBvbGRBQ1dQRVNldCA9IGFDV1BFU2V0OwotCQlhQ1dQID0gQUNXUF9FREVGQVVMVDsKLQkJYUNXUEVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19BQ1dQLCBvbGRBQ1dQLCBBQ1dQX0VERUZBVUxULCBvbGRBQ1dQRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0QUNXUCgpIHsKLQkJcmV0dXJuIGFDV1BFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGdldENhbGVuZGFyVUlEKCkgewotCQlyZXR1cm4gY2FsZW5kYXJVSUQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q2FsZW5kYXJVSUQoQmlnSW50ZWdlciBuZXdDYWxlbmRhclVJRCkgewotCQlCaWdJbnRlZ2VyIG9sZENhbGVuZGFyVUlEID0gY2FsZW5kYXJVSUQ7Ci0JCWNhbGVuZGFyVUlEID0gbmV3Q2FsZW5kYXJVSUQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0NBTEVOREFSX1VJRCwgb2xkQ2FsZW5kYXJVSUQsIGNhbGVuZGFyVUlEKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROb3RlcygpIHsKLQkJcmV0dXJuIG5vdGVzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE5vdGVzKFN0cmluZyBuZXdOb3RlcykgewotCQlTdHJpbmcgb2xkTm90ZXMgPSBub3RlczsKLQkJbm90ZXMgPSBuZXdOb3RlczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fTk9URVMsIG9sZE5vdGVzLCBub3RlcykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBmbG9hdCBnZXRCQ1dTKCkgewotCQlyZXR1cm4gYkNXUzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRCQ1dTKGZsb2F0IG5ld0JDV1MpIHsKLQkJZmxvYXQgb2xkQkNXUyA9IGJDV1M7Ci0JCWJDV1MgPSBuZXdCQ1dTOwotCQlib29sZWFuIG9sZEJDV1NFU2V0ID0gYkNXU0VTZXQ7Ci0JCWJDV1NFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQkNXUywgb2xkQkNXUywgYkNXUywgIW9sZEJDV1NFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRCQ1dTKCkgewotCQlmbG9hdCBvbGRCQ1dTID0gYkNXUzsKLQkJYm9vbGVhbiBvbGRCQ1dTRVNldCA9IGJDV1NFU2V0OwotCQliQ1dTID0gQkNXU19FREVGQVVMVDsKLQkJYkNXU0VTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19CQ1dTLCBvbGRCQ1dTLCBCQ1dTX0VERUZBVUxULCBvbGRCQ1dTRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0QkNXUygpIHsKLQkJcmV0dXJuIGJDV1NFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBmbG9hdCBnZXRCQ1dQKCkgewotCQlyZXR1cm4gYkNXUDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRCQ1dQKGZsb2F0IG5ld0JDV1ApIHsKLQkJZmxvYXQgb2xkQkNXUCA9IGJDV1A7Ci0JCWJDV1AgPSBuZXdCQ1dQOwotCQlib29sZWFuIG9sZEJDV1BFU2V0ID0gYkNXUEVTZXQ7Ci0JCWJDV1BFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQkNXUCwgb2xkQkNXUCwgYkNXUCwgIW9sZEJDV1BFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRCQ1dQKCkgewotCQlmbG9hdCBvbGRCQ1dQID0gYkNXUDsKLQkJYm9vbGVhbiBvbGRCQ1dQRVNldCA9IGJDV1BFU2V0OwotCQliQ1dQID0gQkNXUF9FREVGQVVMVDsKLQkJYkNXUEVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19CQ1dQLCBvbGRCQ1dQLCBCQ1dQX0VERUZBVUxULCBvbGRCQ1dQRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0QkNXUCgpIHsKLQkJcmV0dXJuIGJDV1BFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzSXNHZW5lcmljKCkgewotCQlyZXR1cm4gaXNHZW5lcmljOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldElzR2VuZXJpYyhib29sZWFuIG5ld0lzR2VuZXJpYykgewotCQlib29sZWFuIG9sZElzR2VuZXJpYyA9IGlzR2VuZXJpYzsKLQkJaXNHZW5lcmljID0gbmV3SXNHZW5lcmljOwotCQlib29sZWFuIG9sZElzR2VuZXJpY0VTZXQgPSBpc0dlbmVyaWNFU2V0OwotCQlpc0dlbmVyaWNFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fSVNfR0VORVJJQywgb2xkSXNHZW5lcmljLCBpc0dlbmVyaWMsICFvbGRJc0dlbmVyaWNFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRJc0dlbmVyaWMoKSB7Ci0JCWJvb2xlYW4gb2xkSXNHZW5lcmljID0gaXNHZW5lcmljOwotCQlib29sZWFuIG9sZElzR2VuZXJpY0VTZXQgPSBpc0dlbmVyaWNFU2V0OwotCQlpc0dlbmVyaWMgPSBJU19HRU5FUklDX0VERUZBVUxUOwotCQlpc0dlbmVyaWNFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fSVNfR0VORVJJQywgb2xkSXNHZW5lcmljLCBJU19HRU5FUklDX0VERUZBVUxULCBvbGRJc0dlbmVyaWNFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRJc0dlbmVyaWMoKSB7Ci0JCXJldHVybiBpc0dlbmVyaWNFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzSXNJbmFjdGl2ZSgpIHsKLQkJcmV0dXJuIGlzSW5hY3RpdmU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SXNJbmFjdGl2ZShib29sZWFuIG5ld0lzSW5hY3RpdmUpIHsKLQkJYm9vbGVhbiBvbGRJc0luYWN0aXZlID0gaXNJbmFjdGl2ZTsKLQkJaXNJbmFjdGl2ZSA9IG5ld0lzSW5hY3RpdmU7Ci0JCWJvb2xlYW4gb2xkSXNJbmFjdGl2ZUVTZXQgPSBpc0luYWN0aXZlRVNldDsKLQkJaXNJbmFjdGl2ZUVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19JU19JTkFDVElWRSwgb2xkSXNJbmFjdGl2ZSwgaXNJbmFjdGl2ZSwgIW9sZElzSW5hY3RpdmVFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRJc0luYWN0aXZlKCkgewotCQlib29sZWFuIG9sZElzSW5hY3RpdmUgPSBpc0luYWN0aXZlOwotCQlib29sZWFuIG9sZElzSW5hY3RpdmVFU2V0ID0gaXNJbmFjdGl2ZUVTZXQ7Ci0JCWlzSW5hY3RpdmUgPSBJU19JTkFDVElWRV9FREVGQVVMVDsKLQkJaXNJbmFjdGl2ZUVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19JU19JTkFDVElWRSwgb2xkSXNJbmFjdGl2ZSwgSVNfSU5BQ1RJVkVfRURFRkFVTFQsIG9sZElzSW5hY3RpdmVFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRJc0luYWN0aXZlKCkgewotCQlyZXR1cm4gaXNJbmFjdGl2ZUVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNJc0VudGVycHJpc2UoKSB7Ci0JCXJldHVybiBpc0VudGVycHJpc2U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SXNFbnRlcnByaXNlKGJvb2xlYW4gbmV3SXNFbnRlcnByaXNlKSB7Ci0JCWJvb2xlYW4gb2xkSXNFbnRlcnByaXNlID0gaXNFbnRlcnByaXNlOwotCQlpc0VudGVycHJpc2UgPSBuZXdJc0VudGVycHJpc2U7Ci0JCWJvb2xlYW4gb2xkSXNFbnRlcnByaXNlRVNldCA9IGlzRW50ZXJwcmlzZUVTZXQ7Ci0JCWlzRW50ZXJwcmlzZUVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19JU19FTlRFUlBSSVNFLCBvbGRJc0VudGVycHJpc2UsIGlzRW50ZXJwcmlzZSwgIW9sZElzRW50ZXJwcmlzZUVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldElzRW50ZXJwcmlzZSgpIHsKLQkJYm9vbGVhbiBvbGRJc0VudGVycHJpc2UgPSBpc0VudGVycHJpc2U7Ci0JCWJvb2xlYW4gb2xkSXNFbnRlcnByaXNlRVNldCA9IGlzRW50ZXJwcmlzZUVTZXQ7Ci0JCWlzRW50ZXJwcmlzZSA9IElTX0VOVEVSUFJJU0VfRURFRkFVTFQ7Ci0JCWlzRW50ZXJwcmlzZUVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19JU19FTlRFUlBSSVNFLCBvbGRJc0VudGVycHJpc2UsIElTX0VOVEVSUFJJU0VfRURFRkFVTFQsIG9sZElzRW50ZXJwcmlzZUVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldElzRW50ZXJwcmlzZSgpIHsKLQkJcmV0dXJuIGlzRW50ZXJwcmlzZUVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0Qm9va2luZ1R5cGUoKSB7Ci0JCXJldHVybiBib29raW5nVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRCb29raW5nVHlwZShCaWdJbnRlZ2VyIG5ld0Jvb2tpbmdUeXBlKSB7Ci0JCUJpZ0ludGVnZXIgb2xkQm9va2luZ1R5cGUgPSBib29raW5nVHlwZTsKLQkJYm9va2luZ1R5cGUgPSBuZXdCb29raW5nVHlwZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQk9PS0lOR19UWVBFLCBvbGRCb29raW5nVHlwZSwgYm9va2luZ1R5cGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEFjdHVhbFdvcmtQcm90ZWN0ZWQoKSB7Ci0JCXJldHVybiBhY3R1YWxXb3JrUHJvdGVjdGVkOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFjdHVhbFdvcmtQcm90ZWN0ZWQoT2JqZWN0IG5ld0FjdHVhbFdvcmtQcm90ZWN0ZWQpIHsKLQkJT2JqZWN0IG9sZEFjdHVhbFdvcmtQcm90ZWN0ZWQgPSBhY3R1YWxXb3JrUHJvdGVjdGVkOwotCQlhY3R1YWxXb3JrUHJvdGVjdGVkID0gbmV3QWN0dWFsV29ya1Byb3RlY3RlZDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQUNUVUFMX1dPUktfUFJPVEVDVEVELCBvbGRBY3R1YWxXb3JrUHJvdGVjdGVkLCBhY3R1YWxXb3JrUHJvdGVjdGVkKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRBY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQoKSB7Ci0JCXJldHVybiBhY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkKE9iamVjdCBuZXdBY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQpIHsKLQkJT2JqZWN0IG9sZEFjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZCA9IGFjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZDsKLQkJYWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkID0gbmV3QWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19BQ1RVQUxfT1ZFUlRJTUVfV09SS19QUk9URUNURUQsIG9sZEFjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZCwgYWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRBY3RpdmVEaXJlY3RvcnlHVUlEKCkgewotCQlyZXR1cm4gYWN0aXZlRGlyZWN0b3J5R1VJRDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBY3RpdmVEaXJlY3RvcnlHVUlEKFN0cmluZyBuZXdBY3RpdmVEaXJlY3RvcnlHVUlEKSB7Ci0JCVN0cmluZyBvbGRBY3RpdmVEaXJlY3RvcnlHVUlEID0gYWN0aXZlRGlyZWN0b3J5R1VJRDsKLQkJYWN0aXZlRGlyZWN0b3J5R1VJRCA9IG5ld0FjdGl2ZURpcmVjdG9yeUdVSUQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0FDVElWRV9ESVJFQ1RPUllfR1VJRCwgb2xkQWN0aXZlRGlyZWN0b3J5R1VJRCwgYWN0aXZlRGlyZWN0b3J5R1VJRCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0Q3JlYXRpb25EYXRlKCkgewotCQlyZXR1cm4gY3JlYXRpb25EYXRlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENyZWF0aW9uRGF0ZShPYmplY3QgbmV3Q3JlYXRpb25EYXRlKSB7Ci0JCU9iamVjdCBvbGRDcmVhdGlvbkRhdGUgPSBjcmVhdGlvbkRhdGU7Ci0JCWNyZWF0aW9uRGF0ZSA9IG5ld0NyZWF0aW9uRGF0ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQ1JFQVRJT05fREFURSwgb2xkQ3JlYXRpb25EYXRlLCBjcmVhdGlvbkRhdGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUoKSB7Ci0JCWlmIChleHRlbmRlZEF0dHJpYnV0ZSA9PSBudWxsKSB7Ci0JCQlleHRlbmRlZEF0dHJpYnV0ZSA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChFeHRlbmRlZEF0dHJpYnV0ZTMuY2xhc3MsIHRoaXMsIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0VYVEVOREVEX0FUVFJJQlVURSk7Ci0JCX0KLQkJcmV0dXJuIGV4dGVuZGVkQXR0cmlidXRlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRCYXNlbGluZSgpIHsKLQkJaWYgKGJhc2VsaW5lID09IG51bGwpIHsKLQkJCWJhc2VsaW5lID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KEJhc2VsaW5lMi5jbGFzcywgdGhpcywgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQkFTRUxJTkUpOwotCQl9Ci0JCXJldHVybiBiYXNlbGluZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0T3V0bGluZUNvZGUoKSB7Ci0JCWlmIChvdXRsaW5lQ29kZSA9PSBudWxsKSB7Ci0JCQlvdXRsaW5lQ29kZSA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChPdXRsaW5lQ29kZTMuY2xhc3MsIHRoaXMsIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX09VVExJTkVfQ09ERSk7Ci0JCX0KLQkJcmV0dXJuIG91dGxpbmVDb2RlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBdmFpbGFiaWxpdHlQZXJpb2RzIGdldEF2YWlsYWJpbGl0eVBlcmlvZHMoKSB7Ci0JCXJldHVybiBhdmFpbGFiaWxpdHlQZXJpb2RzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldEF2YWlsYWJpbGl0eVBlcmlvZHMoQXZhaWxhYmlsaXR5UGVyaW9kcyBuZXdBdmFpbGFiaWxpdHlQZXJpb2RzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCUF2YWlsYWJpbGl0eVBlcmlvZHMgb2xkQXZhaWxhYmlsaXR5UGVyaW9kcyA9IGF2YWlsYWJpbGl0eVBlcmlvZHM7Ci0JCWF2YWlsYWJpbGl0eVBlcmlvZHMgPSBuZXdBdmFpbGFiaWxpdHlQZXJpb2RzOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19BVkFJTEFCSUxJVFlfUEVSSU9EUywgb2xkQXZhaWxhYmlsaXR5UGVyaW9kcywgbmV3QXZhaWxhYmlsaXR5UGVyaW9kcyk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QXZhaWxhYmlsaXR5UGVyaW9kcyhBdmFpbGFiaWxpdHlQZXJpb2RzIG5ld0F2YWlsYWJpbGl0eVBlcmlvZHMpIHsKLQkJaWYgKG5ld0F2YWlsYWJpbGl0eVBlcmlvZHMgIT0gYXZhaWxhYmlsaXR5UGVyaW9kcykgewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoYXZhaWxhYmlsaXR5UGVyaW9kcyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClhdmFpbGFiaWxpdHlQZXJpb2RzKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQVZBSUxBQklMSVRZX1BFUklPRFMsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld0F2YWlsYWJpbGl0eVBlcmlvZHMgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3QXZhaWxhYmlsaXR5UGVyaW9kcykuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0FWQUlMQUJJTElUWV9QRVJJT0RTLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldEF2YWlsYWJpbGl0eVBlcmlvZHMobmV3QXZhaWxhYmlsaXR5UGVyaW9kcywgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19BVkFJTEFCSUxJVFlfUEVSSU9EUywgbmV3QXZhaWxhYmlsaXR5UGVyaW9kcywgbmV3QXZhaWxhYmlsaXR5UGVyaW9kcykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSYXRlcyBnZXRSYXRlcygpIHsKLQkJcmV0dXJuIHJhdGVzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldFJhdGVzKFJhdGVzIG5ld1JhdGVzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCVJhdGVzIG9sZFJhdGVzID0gcmF0ZXM7Ci0JCXJhdGVzID0gbmV3UmF0ZXM7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX1JBVEVTLCBvbGRSYXRlcywgbmV3UmF0ZXMpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJhdGVzKFJhdGVzIG5ld1JhdGVzKSB7Ci0JCWlmIChuZXdSYXRlcyAhPSByYXRlcykgewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAocmF0ZXMgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpcmF0ZXMpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19SQVRFUywgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3UmF0ZXMgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3UmF0ZXMpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19SQVRFUywgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRSYXRlcyhuZXdSYXRlcywgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19SQVRFUywgbmV3UmF0ZXMsIG5ld1JhdGVzKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldFRpbWVwaGFzZWREYXRhKCkgewotCQlpZiAodGltZXBoYXNlZERhdGEgPT0gbnVsbCkgewotCQkJdGltZXBoYXNlZERhdGEgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoVGltZXBoYXNlZERhdGFUeXBlLmNsYXNzLCB0aGlzLCBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19USU1FUEhBU0VEX0RBVEEpOwotCQl9Ci0JCXJldHVybiB0aW1lcGhhc2VkRGF0YTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0VYVEVOREVEX0FUVFJJQlVURToKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRFeHRlbmRlZEF0dHJpYnV0ZSgpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19CQVNFTElORToKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRCYXNlbGluZSgpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19PVVRMSU5FX0NPREU6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0T3V0bGluZUNvZGUoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQVZBSUxBQklMSVRZX1BFUklPRFM6Ci0JCQkJCXJldHVybiBiYXNpY1NldEF2YWlsYWJpbGl0eVBlcmlvZHMobnVsbCwgbXNncyk7Ci0JCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19SQVRFUzoKLQkJCQkJcmV0dXJuIGJhc2ljU2V0UmF0ZXMobnVsbCwgbXNncyk7Ci0JCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19USU1FUEhBU0VEX0RBVEE6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0VGltZXBoYXNlZERhdGEoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19VSUQ6Ci0JCQkJcmV0dXJuIGdldFVJRCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19JRDoKLQkJCQlyZXR1cm4gZ2V0SUQoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fTkFNRToKLQkJCQlyZXR1cm4gZ2V0TmFtZSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19UWVBFOgotCQkJCXJldHVybiBnZXRUeXBlKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0lTX05VTEw6Ci0JCQkJcmV0dXJuIGlzSXNOdWxsKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19JTklUSUFMUzoKLQkJCQlyZXR1cm4gZ2V0SW5pdGlhbHMoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fUEhPTkVUSUNTOgotCQkJCXJldHVybiBnZXRQaG9uZXRpY3MoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fTlRBQ0NPVU5UOgotCQkJCXJldHVybiBnZXROVEFjY291bnQoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fTUFURVJJQUxfTEFCRUw6Ci0JCQkJcmV0dXJuIGdldE1hdGVyaWFsTGFiZWwoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQ09ERToKLQkJCQlyZXR1cm4gZ2V0Q29kZSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19HUk9VUDoKLQkJCQlyZXR1cm4gZ2V0R3JvdXAoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fV09SS19HUk9VUDoKLQkJCQlyZXR1cm4gZ2V0V29ya0dyb3VwKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0VNQUlMX0FERFJFU1M6Ci0JCQkJcmV0dXJuIGdldEVtYWlsQWRkcmVzcygpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19IWVBFUkxJTks6Ci0JCQkJcmV0dXJuIGdldEh5cGVybGluaygpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19IWVBFUkxJTktfQUREUkVTUzoKLQkJCQlyZXR1cm4gZ2V0SHlwZXJsaW5rQWRkcmVzcygpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19IWVBFUkxJTktfU1VCX0FERFJFU1M6Ci0JCQkJcmV0dXJuIGdldEh5cGVybGlua1N1YkFkZHJlc3MoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fTUFYX1VOSVRTOgotCQkJCXJldHVybiBuZXcgRmxvYXQoZ2V0TWF4VW5pdHMoKSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX1BFQUtfVU5JVFM6Ci0JCQkJcmV0dXJuIG5ldyBGbG9hdChnZXRQZWFrVW5pdHMoKSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX09WRVJfQUxMT0NBVEVEOgotCQkJCXJldHVybiBpc092ZXJBbGxvY2F0ZWQoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0FWQUlMQUJMRV9GUk9NOgotCQkJCXJldHVybiBnZXRBdmFpbGFibGVGcm9tKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0FWQUlMQUJMRV9UTzoKLQkJCQlyZXR1cm4gZ2V0QXZhaWxhYmxlVG8oKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fU1RBUlQ6Ci0JCQkJcmV0dXJuIGdldFN0YXJ0KCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0ZJTklTSDoKLQkJCQlyZXR1cm4gZ2V0RmluaXNoKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0NBTl9MRVZFTDoKLQkJCQlyZXR1cm4gaXNDYW5MZXZlbCgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQUNDUlVFX0FUOgotCQkJCXJldHVybiBnZXRBY2NydWVBdCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19XT1JLOgotCQkJCXJldHVybiBnZXRXb3JrKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX1JFR1VMQVJfV09SSzoKLQkJCQlyZXR1cm4gZ2V0UmVndWxhcldvcmsoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fT1ZFUlRJTUVfV09SSzoKLQkJCQlyZXR1cm4gZ2V0T3ZlcnRpbWVXb3JrKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0FDVFVBTF9XT1JLOgotCQkJCXJldHVybiBnZXRBY3R1YWxXb3JrKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX1JFTUFJTklOR19XT1JLOgotCQkJCXJldHVybiBnZXRSZW1haW5pbmdXb3JrKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0FDVFVBTF9PVkVSVElNRV9XT1JLOgotCQkJCXJldHVybiBnZXRBY3R1YWxPdmVydGltZVdvcmsoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fUkVNQUlOSU5HX09WRVJUSU1FX1dPUks6Ci0JCQkJcmV0dXJuIGdldFJlbWFpbmluZ092ZXJ0aW1lV29yaygpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19QRVJDRU5UX1dPUktfQ09NUExFVEU6Ci0JCQkJcmV0dXJuIGdldFBlcmNlbnRXb3JrQ29tcGxldGUoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fU1RBTkRBUkRfUkFURToKLQkJCQlyZXR1cm4gZ2V0U3RhbmRhcmRSYXRlKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX1NUQU5EQVJEX1JBVEVfRk9STUFUOgotCQkJCXJldHVybiBnZXRTdGFuZGFyZFJhdGVGb3JtYXQoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQ09TVDoKLQkJCQlyZXR1cm4gZ2V0Q29zdCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19PVkVSVElNRV9SQVRFOgotCQkJCXJldHVybiBnZXRPdmVydGltZVJhdGUoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fT1ZFUlRJTUVfUkFURV9GT1JNQVQ6Ci0JCQkJcmV0dXJuIGdldE92ZXJ0aW1lUmF0ZUZvcm1hdCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19PVkVSVElNRV9DT1NUOgotCQkJCXJldHVybiBnZXRPdmVydGltZUNvc3QoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQ09TVF9QRVJfVVNFOgotCQkJCXJldHVybiBnZXRDb3N0UGVyVXNlKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0FDVFVBTF9DT1NUOgotCQkJCXJldHVybiBnZXRBY3R1YWxDb3N0KCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0FDVFVBTF9PVkVSVElNRV9DT1NUOgotCQkJCXJldHVybiBnZXRBY3R1YWxPdmVydGltZUNvc3QoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fUkVNQUlOSU5HX0NPU1Q6Ci0JCQkJcmV0dXJuIGdldFJlbWFpbmluZ0Nvc3QoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fUkVNQUlOSU5HX09WRVJUSU1FX0NPU1Q6Ci0JCQkJcmV0dXJuIGdldFJlbWFpbmluZ092ZXJ0aW1lQ29zdCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19XT1JLX1ZBUklBTkNFOgotCQkJCXJldHVybiBuZXcgRmxvYXQoZ2V0V29ya1ZhcmlhbmNlKCkpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19DT1NUX1ZBUklBTkNFOgotCQkJCXJldHVybiBuZXcgRmxvYXQoZ2V0Q29zdFZhcmlhbmNlKCkpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19TVjoKLQkJCQlyZXR1cm4gbmV3IEZsb2F0KGdldFNWKCkpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19DVjoKLQkJCQlyZXR1cm4gbmV3IEZsb2F0KGdldENWKCkpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19BQ1dQOgotCQkJCXJldHVybiBuZXcgRmxvYXQoZ2V0QUNXUCgpKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQ0FMRU5EQVJfVUlEOgotCQkJCXJldHVybiBnZXRDYWxlbmRhclVJRCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19OT1RFUzoKLQkJCQlyZXR1cm4gZ2V0Tm90ZXMoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQkNXUzoKLQkJCQlyZXR1cm4gbmV3IEZsb2F0KGdldEJDV1MoKSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0JDV1A6Ci0JCQkJcmV0dXJuIG5ldyBGbG9hdChnZXRCQ1dQKCkpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19JU19HRU5FUklDOgotCQkJCXJldHVybiBpc0lzR2VuZXJpYygpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fSVNfSU5BQ1RJVkU6Ci0JCQkJcmV0dXJuIGlzSXNJbmFjdGl2ZSgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fSVNfRU5URVJQUklTRToKLQkJCQlyZXR1cm4gaXNJc0VudGVycHJpc2UoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0JPT0tJTkdfVFlQRToKLQkJCQlyZXR1cm4gZ2V0Qm9va2luZ1R5cGUoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQUNUVUFMX1dPUktfUFJPVEVDVEVEOgotCQkJCXJldHVybiBnZXRBY3R1YWxXb3JrUHJvdGVjdGVkKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0FDVFVBTF9PVkVSVElNRV9XT1JLX1BST1RFQ1RFRDoKLQkJCQlyZXR1cm4gZ2V0QWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0FDVElWRV9ESVJFQ1RPUllfR1VJRDoKLQkJCQlyZXR1cm4gZ2V0QWN0aXZlRGlyZWN0b3J5R1VJRCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19DUkVBVElPTl9EQVRFOgotCQkJCXJldHVybiBnZXRDcmVhdGlvbkRhdGUoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fRVhURU5ERURfQVRUUklCVVRFOgotCQkJCXJldHVybiBnZXRFeHRlbmRlZEF0dHJpYnV0ZSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19CQVNFTElORToKLQkJCQlyZXR1cm4gZ2V0QmFzZWxpbmUoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fT1VUTElORV9DT0RFOgotCQkJCXJldHVybiBnZXRPdXRsaW5lQ29kZSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19BVkFJTEFCSUxJVFlfUEVSSU9EUzoKLQkJCQlyZXR1cm4gZ2V0QXZhaWxhYmlsaXR5UGVyaW9kcygpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19SQVRFUzoKLQkJCQlyZXR1cm4gZ2V0UmF0ZXMoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fVElNRVBIQVNFRF9EQVRBOgotCQkJCXJldHVybiBnZXRUaW1lcGhhc2VkRGF0YSgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fVUlEOgotCQkJCXNldFVJRCgoQmlnSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19JRDoKLQkJCQlzZXRJRCgoQmlnSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19OQU1FOgotCQkJCXNldE5hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19UWVBFOgotCQkJCXNldFR5cGUoKEJpZ0ludGVnZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fSVNfTlVMTDoKLQkJCQlzZXRJc051bGwoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19JTklUSUFMUzoKLQkJCQlzZXRJbml0aWFscygoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX1BIT05FVElDUzoKLQkJCQlzZXRQaG9uZXRpY3MoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19OVEFDQ09VTlQ6Ci0JCQkJc2V0TlRBY2NvdW50KChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fTUFURVJJQUxfTEFCRUw6Ci0JCQkJc2V0TWF0ZXJpYWxMYWJlbCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0NPREU6Ci0JCQkJc2V0Q29kZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0dST1VQOgotCQkJCXNldEdyb3VwKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fV09SS19HUk9VUDoKLQkJCQlzZXRXb3JrR3JvdXAoKEJpZ0ludGVnZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fRU1BSUxfQUREUkVTUzoKLQkJCQlzZXRFbWFpbEFkZHJlc3MoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19IWVBFUkxJTks6Ci0JCQkJc2V0SHlwZXJsaW5rKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fSFlQRVJMSU5LX0FERFJFU1M6Ci0JCQkJc2V0SHlwZXJsaW5rQWRkcmVzcygoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0hZUEVSTElOS19TVUJfQUREUkVTUzoKLQkJCQlzZXRIeXBlcmxpbmtTdWJBZGRyZXNzKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fTUFYX1VOSVRTOgotCQkJCXNldE1heFVuaXRzKCgoRmxvYXQpbmV3VmFsdWUpLmZsb2F0VmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19QRUFLX1VOSVRTOgotCQkJCXNldFBlYWtVbml0cygoKEZsb2F0KW5ld1ZhbHVlKS5mbG9hdFZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fT1ZFUl9BTExPQ0FURUQ6Ci0JCQkJc2V0T3ZlckFsbG9jYXRlZCgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0FWQUlMQUJMRV9GUk9NOgotCQkJCXNldEF2YWlsYWJsZUZyb20oKE9iamVjdCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19BVkFJTEFCTEVfVE86Ci0JCQkJc2V0QXZhaWxhYmxlVG8oKE9iamVjdCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19TVEFSVDoKLQkJCQlzZXRTdGFydCgoT2JqZWN0KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0ZJTklTSDoKLQkJCQlzZXRGaW5pc2goKE9iamVjdCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19DQU5fTEVWRUw6Ci0JCQkJc2V0Q2FuTGV2ZWwoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19BQ0NSVUVfQVQ6Ci0JCQkJc2V0QWNjcnVlQXQoKEJpZ0ludGVnZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fV09SSzoKLQkJCQlzZXRXb3JrKChPYmplY3QpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fUkVHVUxBUl9XT1JLOgotCQkJCXNldFJlZ3VsYXJXb3JrKChPYmplY3QpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fT1ZFUlRJTUVfV09SSzoKLQkJCQlzZXRPdmVydGltZVdvcmsoKE9iamVjdCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19BQ1RVQUxfV09SSzoKLQkJCQlzZXRBY3R1YWxXb3JrKChPYmplY3QpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fUkVNQUlOSU5HX1dPUks6Ci0JCQkJc2V0UmVtYWluaW5nV29yaygoT2JqZWN0KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0FDVFVBTF9PVkVSVElNRV9XT1JLOgotCQkJCXNldEFjdHVhbE92ZXJ0aW1lV29yaygoT2JqZWN0KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX1JFTUFJTklOR19PVkVSVElNRV9XT1JLOgotCQkJCXNldFJlbWFpbmluZ092ZXJ0aW1lV29yaygoT2JqZWN0KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX1BFUkNFTlRfV09SS19DT01QTEVURToKLQkJCQlzZXRQZXJjZW50V29ya0NvbXBsZXRlKChCaWdJbnRlZ2VyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX1NUQU5EQVJEX1JBVEU6Ci0JCQkJc2V0U3RhbmRhcmRSYXRlKChCaWdEZWNpbWFsKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX1NUQU5EQVJEX1JBVEVfRk9STUFUOgotCQkJCXNldFN0YW5kYXJkUmF0ZUZvcm1hdCgoQmlnSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19DT1NUOgotCQkJCXNldENvc3QoKEJpZ0RlY2ltYWwpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fT1ZFUlRJTUVfUkFURToKLQkJCQlzZXRPdmVydGltZVJhdGUoKEJpZ0RlY2ltYWwpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fT1ZFUlRJTUVfUkFURV9GT1JNQVQ6Ci0JCQkJc2V0T3ZlcnRpbWVSYXRlRm9ybWF0KChCaWdJbnRlZ2VyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX09WRVJUSU1FX0NPU1Q6Ci0JCQkJc2V0T3ZlcnRpbWVDb3N0KChCaWdEZWNpbWFsKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0NPU1RfUEVSX1VTRToKLQkJCQlzZXRDb3N0UGVyVXNlKChCaWdEZWNpbWFsKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0FDVFVBTF9DT1NUOgotCQkJCXNldEFjdHVhbENvc3QoKEJpZ0RlY2ltYWwpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQUNUVUFMX09WRVJUSU1FX0NPU1Q6Ci0JCQkJc2V0QWN0dWFsT3ZlcnRpbWVDb3N0KChCaWdEZWNpbWFsKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX1JFTUFJTklOR19DT1NUOgotCQkJCXNldFJlbWFpbmluZ0Nvc3QoKEJpZ0RlY2ltYWwpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fUkVNQUlOSU5HX09WRVJUSU1FX0NPU1Q6Ci0JCQkJc2V0UmVtYWluaW5nT3ZlcnRpbWVDb3N0KChCaWdEZWNpbWFsKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX1dPUktfVkFSSUFOQ0U6Ci0JCQkJc2V0V29ya1ZhcmlhbmNlKCgoRmxvYXQpbmV3VmFsdWUpLmZsb2F0VmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19DT1NUX1ZBUklBTkNFOgotCQkJCXNldENvc3RWYXJpYW5jZSgoKEZsb2F0KW5ld1ZhbHVlKS5mbG9hdFZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fU1Y6Ci0JCQkJc2V0U1YoKChGbG9hdCluZXdWYWx1ZSkuZmxvYXRWYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0NWOgotCQkJCXNldENWKCgoRmxvYXQpbmV3VmFsdWUpLmZsb2F0VmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19BQ1dQOgotCQkJCXNldEFDV1AoKChGbG9hdCluZXdWYWx1ZSkuZmxvYXRWYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0NBTEVOREFSX1VJRDoKLQkJCQlzZXRDYWxlbmRhclVJRCgoQmlnSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19OT1RFUzoKLQkJCQlzZXROb3RlcygoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0JDV1M6Ci0JCQkJc2V0QkNXUygoKEZsb2F0KW5ld1ZhbHVlKS5mbG9hdFZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQkNXUDoKLQkJCQlzZXRCQ1dQKCgoRmxvYXQpbmV3VmFsdWUpLmZsb2F0VmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19JU19HRU5FUklDOgotCQkJCXNldElzR2VuZXJpYygoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0lTX0lOQUNUSVZFOgotCQkJCXNldElzSW5hY3RpdmUoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19JU19FTlRFUlBSSVNFOgotCQkJCXNldElzRW50ZXJwcmlzZSgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0JPT0tJTkdfVFlQRToKLQkJCQlzZXRCb29raW5nVHlwZSgoQmlnSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19BQ1RVQUxfV09SS19QUk9URUNURUQ6Ci0JCQkJc2V0QWN0dWFsV29ya1Byb3RlY3RlZCgoT2JqZWN0KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0FDVFVBTF9PVkVSVElNRV9XT1JLX1BST1RFQ1RFRDoKLQkJCQlzZXRBY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQoKE9iamVjdCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19BQ1RJVkVfRElSRUNUT1JZX0dVSUQ6Ci0JCQkJc2V0QWN0aXZlRGlyZWN0b3J5R1VJRCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0NSRUFUSU9OX0RBVEU6Ci0JCQkJc2V0Q3JlYXRpb25EYXRlKChPYmplY3QpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fRVhURU5ERURfQVRUUklCVVRFOgotCQkJCWdldEV4dGVuZGVkQXR0cmlidXRlKCkuY2xlYXIoKTsKLQkJCQlnZXRFeHRlbmRlZEF0dHJpYnV0ZSgpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19CQVNFTElORToKLQkJCQlnZXRCYXNlbGluZSgpLmNsZWFyKCk7Ci0JCQkJZ2V0QmFzZWxpbmUoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fT1VUTElORV9DT0RFOgotCQkJCWdldE91dGxpbmVDb2RlKCkuY2xlYXIoKTsKLQkJCQlnZXRPdXRsaW5lQ29kZSgpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19BVkFJTEFCSUxJVFlfUEVSSU9EUzoKLQkJCQlzZXRBdmFpbGFiaWxpdHlQZXJpb2RzKChBdmFpbGFiaWxpdHlQZXJpb2RzKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX1JBVEVTOgotCQkJCXNldFJhdGVzKChSYXRlcyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19USU1FUEhBU0VEX0RBVEE6Ci0JCQkJZ2V0VGltZXBoYXNlZERhdGEoKS5jbGVhcigpOwotCQkJCWdldFRpbWVwaGFzZWREYXRhKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19VSUQ6Ci0JCQkJc2V0VUlEKFVJRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19JRDoKLQkJCQlzZXRJRChJRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19OQU1FOgotCQkJCXNldE5hbWUoTkFNRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19UWVBFOgotCQkJCXNldFR5cGUoVFlQRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19JU19OVUxMOgotCQkJCXVuc2V0SXNOdWxsKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19JTklUSUFMUzoKLQkJCQlzZXRJbml0aWFscyhJTklUSUFMU19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19QSE9ORVRJQ1M6Ci0JCQkJc2V0UGhvbmV0aWNzKFBIT05FVElDU19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19OVEFDQ09VTlQ6Ci0JCQkJc2V0TlRBY2NvdW50KE5UQUNDT1VOVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19NQVRFUklBTF9MQUJFTDoKLQkJCQlzZXRNYXRlcmlhbExhYmVsKE1BVEVSSUFMX0xBQkVMX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0NPREU6Ci0JCQkJc2V0Q29kZShDT0RFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0dST1VQOgotCQkJCXNldEdyb3VwKEdST1VQX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX1dPUktfR1JPVVA6Ci0JCQkJc2V0V29ya0dyb3VwKFdPUktfR1JPVVBfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fRU1BSUxfQUREUkVTUzoKLQkJCQlzZXRFbWFpbEFkZHJlc3MoRU1BSUxfQUREUkVTU19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19IWVBFUkxJTks6Ci0JCQkJc2V0SHlwZXJsaW5rKEhZUEVSTElOS19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19IWVBFUkxJTktfQUREUkVTUzoKLQkJCQlzZXRIeXBlcmxpbmtBZGRyZXNzKEhZUEVSTElOS19BRERSRVNTX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0hZUEVSTElOS19TVUJfQUREUkVTUzoKLQkJCQlzZXRIeXBlcmxpbmtTdWJBZGRyZXNzKEhZUEVSTElOS19TVUJfQUREUkVTU19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19NQVhfVU5JVFM6Ci0JCQkJdW5zZXRNYXhVbml0cygpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fUEVBS19VTklUUzoKLQkJCQl1bnNldFBlYWtVbml0cygpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fT1ZFUl9BTExPQ0FURUQ6Ci0JCQkJdW5zZXRPdmVyQWxsb2NhdGVkKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19BVkFJTEFCTEVfRlJPTToKLQkJCQlzZXRBdmFpbGFibGVGcm9tKEFWQUlMQUJMRV9GUk9NX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0FWQUlMQUJMRV9UTzoKLQkJCQlzZXRBdmFpbGFibGVUbyhBVkFJTEFCTEVfVE9fRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fU1RBUlQ6Ci0JCQkJc2V0U3RhcnQoU1RBUlRfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fRklOSVNIOgotCQkJCXNldEZpbmlzaChGSU5JU0hfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQ0FOX0xFVkVMOgotCQkJCXVuc2V0Q2FuTGV2ZWwoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0FDQ1JVRV9BVDoKLQkJCQlzZXRBY2NydWVBdChBQ0NSVUVfQVRfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fV09SSzoKLQkJCQlzZXRXb3JrKFdPUktfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fUkVHVUxBUl9XT1JLOgotCQkJCXNldFJlZ3VsYXJXb3JrKFJFR1VMQVJfV09SS19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19PVkVSVElNRV9XT1JLOgotCQkJCXNldE92ZXJ0aW1lV29yayhPVkVSVElNRV9XT1JLX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0FDVFVBTF9XT1JLOgotCQkJCXNldEFjdHVhbFdvcmsoQUNUVUFMX1dPUktfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fUkVNQUlOSU5HX1dPUks6Ci0JCQkJc2V0UmVtYWluaW5nV29yayhSRU1BSU5JTkdfV09SS19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19BQ1RVQUxfT1ZFUlRJTUVfV09SSzoKLQkJCQlzZXRBY3R1YWxPdmVydGltZVdvcmsoQUNUVUFMX09WRVJUSU1FX1dPUktfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fUkVNQUlOSU5HX09WRVJUSU1FX1dPUks6Ci0JCQkJc2V0UmVtYWluaW5nT3ZlcnRpbWVXb3JrKFJFTUFJTklOR19PVkVSVElNRV9XT1JLX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX1BFUkNFTlRfV09SS19DT01QTEVURToKLQkJCQlzZXRQZXJjZW50V29ya0NvbXBsZXRlKFBFUkNFTlRfV09SS19DT01QTEVURV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19TVEFOREFSRF9SQVRFOgotCQkJCXNldFN0YW5kYXJkUmF0ZShTVEFOREFSRF9SQVRFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX1NUQU5EQVJEX1JBVEVfRk9STUFUOgotCQkJCXNldFN0YW5kYXJkUmF0ZUZvcm1hdChTVEFOREFSRF9SQVRFX0ZPUk1BVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19DT1NUOgotCQkJCXNldENvc3QoQ09TVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19PVkVSVElNRV9SQVRFOgotCQkJCXNldE92ZXJ0aW1lUmF0ZShPVkVSVElNRV9SQVRFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX09WRVJUSU1FX1JBVEVfRk9STUFUOgotCQkJCXNldE92ZXJ0aW1lUmF0ZUZvcm1hdChPVkVSVElNRV9SQVRFX0ZPUk1BVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19PVkVSVElNRV9DT1NUOgotCQkJCXNldE92ZXJ0aW1lQ29zdChPVkVSVElNRV9DT1NUX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0NPU1RfUEVSX1VTRToKLQkJCQlzZXRDb3N0UGVyVXNlKENPU1RfUEVSX1VTRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19BQ1RVQUxfQ09TVDoKLQkJCQlzZXRBY3R1YWxDb3N0KEFDVFVBTF9DT1NUX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0FDVFVBTF9PVkVSVElNRV9DT1NUOgotCQkJCXNldEFjdHVhbE92ZXJ0aW1lQ29zdChBQ1RVQUxfT1ZFUlRJTUVfQ09TVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19SRU1BSU5JTkdfQ09TVDoKLQkJCQlzZXRSZW1haW5pbmdDb3N0KFJFTUFJTklOR19DT1NUX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX1JFTUFJTklOR19PVkVSVElNRV9DT1NUOgotCQkJCXNldFJlbWFpbmluZ092ZXJ0aW1lQ29zdChSRU1BSU5JTkdfT1ZFUlRJTUVfQ09TVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19XT1JLX1ZBUklBTkNFOgotCQkJCXVuc2V0V29ya1ZhcmlhbmNlKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19DT1NUX1ZBUklBTkNFOgotCQkJCXVuc2V0Q29zdFZhcmlhbmNlKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19TVjoKLQkJCQl1bnNldFNWKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19DVjoKLQkJCQl1bnNldENWKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19BQ1dQOgotCQkJCXVuc2V0QUNXUCgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQ0FMRU5EQVJfVUlEOgotCQkJCXNldENhbGVuZGFyVUlEKENBTEVOREFSX1VJRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19OT1RFUzoKLQkJCQlzZXROb3RlcyhOT1RFU19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19CQ1dTOgotCQkJCXVuc2V0QkNXUygpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQkNXUDoKLQkJCQl1bnNldEJDV1AoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0lTX0dFTkVSSUM6Ci0JCQkJdW5zZXRJc0dlbmVyaWMoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0lTX0lOQUNUSVZFOgotCQkJCXVuc2V0SXNJbmFjdGl2ZSgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fSVNfRU5URVJQUklTRToKLQkJCQl1bnNldElzRW50ZXJwcmlzZSgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQk9PS0lOR19UWVBFOgotCQkJCXNldEJvb2tpbmdUeXBlKEJPT0tJTkdfVFlQRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19BQ1RVQUxfV09SS19QUk9URUNURUQ6Ci0JCQkJc2V0QWN0dWFsV29ya1Byb3RlY3RlZChBQ1RVQUxfV09SS19QUk9URUNURURfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQUNUVUFMX09WRVJUSU1FX1dPUktfUFJPVEVDVEVEOgotCQkJCXNldEFjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZChBQ1RVQUxfT1ZFUlRJTUVfV09SS19QUk9URUNURURfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQUNUSVZFX0RJUkVDVE9SWV9HVUlEOgotCQkJCXNldEFjdGl2ZURpcmVjdG9yeUdVSUQoQUNUSVZFX0RJUkVDVE9SWV9HVUlEX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0NSRUFUSU9OX0RBVEU6Ci0JCQkJc2V0Q3JlYXRpb25EYXRlKENSRUFUSU9OX0RBVEVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fRVhURU5ERURfQVRUUklCVVRFOgotCQkJCWdldEV4dGVuZGVkQXR0cmlidXRlKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0JBU0VMSU5FOgotCQkJCWdldEJhc2VsaW5lKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX09VVExJTkVfQ09ERToKLQkJCQlnZXRPdXRsaW5lQ29kZSgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19BVkFJTEFCSUxJVFlfUEVSSU9EUzoKLQkJCQlzZXRBdmFpbGFiaWxpdHlQZXJpb2RzKChBdmFpbGFiaWxpdHlQZXJpb2RzKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fUkFURVM6Ci0JCQkJc2V0UmF0ZXMoKFJhdGVzKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fVElNRVBIQVNFRF9EQVRBOgotCQkJCWdldFRpbWVwaGFzZWREYXRhKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fVUlEOgotCQkJCXJldHVybiBVSURfRURFRkFVTFQgPT0gbnVsbCA/IHVJRCAhPSBudWxsIDogIVVJRF9FREVGQVVMVC5lcXVhbHModUlEKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fSUQ6Ci0JCQkJcmV0dXJuIElEX0VERUZBVUxUID09IG51bGwgPyBpRCAhPSBudWxsIDogIUlEX0VERUZBVUxULmVxdWFscyhpRCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX05BTUU6Ci0JCQkJcmV0dXJuIE5BTUVfRURFRkFVTFQgPT0gbnVsbCA/IG5hbWUgIT0gbnVsbCA6ICFOQU1FX0VERUZBVUxULmVxdWFscyhuYW1lKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fVFlQRToKLQkJCQlyZXR1cm4gVFlQRV9FREVGQVVMVCA9PSBudWxsID8gdHlwZSAhPSBudWxsIDogIVRZUEVfRURFRkFVTFQuZXF1YWxzKHR5cGUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19JU19OVUxMOgotCQkJCXJldHVybiBpc1NldElzTnVsbCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19JTklUSUFMUzoKLQkJCQlyZXR1cm4gSU5JVElBTFNfRURFRkFVTFQgPT0gbnVsbCA/IGluaXRpYWxzICE9IG51bGwgOiAhSU5JVElBTFNfRURFRkFVTFQuZXF1YWxzKGluaXRpYWxzKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fUEhPTkVUSUNTOgotCQkJCXJldHVybiBQSE9ORVRJQ1NfRURFRkFVTFQgPT0gbnVsbCA/IHBob25ldGljcyAhPSBudWxsIDogIVBIT05FVElDU19FREVGQVVMVC5lcXVhbHMocGhvbmV0aWNzKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fTlRBQ0NPVU5UOgotCQkJCXJldHVybiBOVEFDQ09VTlRfRURFRkFVTFQgPT0gbnVsbCA/IG5UQWNjb3VudCAhPSBudWxsIDogIU5UQUNDT1VOVF9FREVGQVVMVC5lcXVhbHMoblRBY2NvdW50KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fTUFURVJJQUxfTEFCRUw6Ci0JCQkJcmV0dXJuIE1BVEVSSUFMX0xBQkVMX0VERUZBVUxUID09IG51bGwgPyBtYXRlcmlhbExhYmVsICE9IG51bGwgOiAhTUFURVJJQUxfTEFCRUxfRURFRkFVTFQuZXF1YWxzKG1hdGVyaWFsTGFiZWwpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19DT0RFOgotCQkJCXJldHVybiBDT0RFX0VERUZBVUxUID09IG51bGwgPyBjb2RlICE9IG51bGwgOiAhQ09ERV9FREVGQVVMVC5lcXVhbHMoY29kZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0dST1VQOgotCQkJCXJldHVybiBHUk9VUF9FREVGQVVMVCA9PSBudWxsID8gZ3JvdXAgIT0gbnVsbCA6ICFHUk9VUF9FREVGQVVMVC5lcXVhbHMoZ3JvdXApOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19XT1JLX0dST1VQOgotCQkJCXJldHVybiBXT1JLX0dST1VQX0VERUZBVUxUID09IG51bGwgPyB3b3JrR3JvdXAgIT0gbnVsbCA6ICFXT1JLX0dST1VQX0VERUZBVUxULmVxdWFscyh3b3JrR3JvdXApOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19FTUFJTF9BRERSRVNTOgotCQkJCXJldHVybiBFTUFJTF9BRERSRVNTX0VERUZBVUxUID09IG51bGwgPyBlbWFpbEFkZHJlc3MgIT0gbnVsbCA6ICFFTUFJTF9BRERSRVNTX0VERUZBVUxULmVxdWFscyhlbWFpbEFkZHJlc3MpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19IWVBFUkxJTks6Ci0JCQkJcmV0dXJuIEhZUEVSTElOS19FREVGQVVMVCA9PSBudWxsID8gaHlwZXJsaW5rICE9IG51bGwgOiAhSFlQRVJMSU5LX0VERUZBVUxULmVxdWFscyhoeXBlcmxpbmspOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19IWVBFUkxJTktfQUREUkVTUzoKLQkJCQlyZXR1cm4gSFlQRVJMSU5LX0FERFJFU1NfRURFRkFVTFQgPT0gbnVsbCA/IGh5cGVybGlua0FkZHJlc3MgIT0gbnVsbCA6ICFIWVBFUkxJTktfQUREUkVTU19FREVGQVVMVC5lcXVhbHMoaHlwZXJsaW5rQWRkcmVzcyk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0hZUEVSTElOS19TVUJfQUREUkVTUzoKLQkJCQlyZXR1cm4gSFlQRVJMSU5LX1NVQl9BRERSRVNTX0VERUZBVUxUID09IG51bGwgPyBoeXBlcmxpbmtTdWJBZGRyZXNzICE9IG51bGwgOiAhSFlQRVJMSU5LX1NVQl9BRERSRVNTX0VERUZBVUxULmVxdWFscyhoeXBlcmxpbmtTdWJBZGRyZXNzKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fTUFYX1VOSVRTOgotCQkJCXJldHVybiBpc1NldE1heFVuaXRzKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX1BFQUtfVU5JVFM6Ci0JCQkJcmV0dXJuIGlzU2V0UGVha1VuaXRzKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX09WRVJfQUxMT0NBVEVEOgotCQkJCXJldHVybiBpc1NldE92ZXJBbGxvY2F0ZWQoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQVZBSUxBQkxFX0ZST006Ci0JCQkJcmV0dXJuIEFWQUlMQUJMRV9GUk9NX0VERUZBVUxUID09IG51bGwgPyBhdmFpbGFibGVGcm9tICE9IG51bGwgOiAhQVZBSUxBQkxFX0ZST01fRURFRkFVTFQuZXF1YWxzKGF2YWlsYWJsZUZyb20pOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19BVkFJTEFCTEVfVE86Ci0JCQkJcmV0dXJuIEFWQUlMQUJMRV9UT19FREVGQVVMVCA9PSBudWxsID8gYXZhaWxhYmxlVG8gIT0gbnVsbCA6ICFBVkFJTEFCTEVfVE9fRURFRkFVTFQuZXF1YWxzKGF2YWlsYWJsZVRvKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fU1RBUlQ6Ci0JCQkJcmV0dXJuIFNUQVJUX0VERUZBVUxUID09IG51bGwgPyBzdGFydCAhPSBudWxsIDogIVNUQVJUX0VERUZBVUxULmVxdWFscyhzdGFydCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0ZJTklTSDoKLQkJCQlyZXR1cm4gRklOSVNIX0VERUZBVUxUID09IG51bGwgPyBmaW5pc2ggIT0gbnVsbCA6ICFGSU5JU0hfRURFRkFVTFQuZXF1YWxzKGZpbmlzaCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0NBTl9MRVZFTDoKLQkJCQlyZXR1cm4gaXNTZXRDYW5MZXZlbCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19BQ0NSVUVfQVQ6Ci0JCQkJcmV0dXJuIEFDQ1JVRV9BVF9FREVGQVVMVCA9PSBudWxsID8gYWNjcnVlQXQgIT0gbnVsbCA6ICFBQ0NSVUVfQVRfRURFRkFVTFQuZXF1YWxzKGFjY3J1ZUF0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fV09SSzoKLQkJCQlyZXR1cm4gV09SS19FREVGQVVMVCA9PSBudWxsID8gd29yayAhPSBudWxsIDogIVdPUktfRURFRkFVTFQuZXF1YWxzKHdvcmspOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19SRUdVTEFSX1dPUks6Ci0JCQkJcmV0dXJuIFJFR1VMQVJfV09SS19FREVGQVVMVCA9PSBudWxsID8gcmVndWxhcldvcmsgIT0gbnVsbCA6ICFSRUdVTEFSX1dPUktfRURFRkFVTFQuZXF1YWxzKHJlZ3VsYXJXb3JrKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fT1ZFUlRJTUVfV09SSzoKLQkJCQlyZXR1cm4gT1ZFUlRJTUVfV09SS19FREVGQVVMVCA9PSBudWxsID8gb3ZlcnRpbWVXb3JrICE9IG51bGwgOiAhT1ZFUlRJTUVfV09SS19FREVGQVVMVC5lcXVhbHMob3ZlcnRpbWVXb3JrKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQUNUVUFMX1dPUks6Ci0JCQkJcmV0dXJuIEFDVFVBTF9XT1JLX0VERUZBVUxUID09IG51bGwgPyBhY3R1YWxXb3JrICE9IG51bGwgOiAhQUNUVUFMX1dPUktfRURFRkFVTFQuZXF1YWxzKGFjdHVhbFdvcmspOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19SRU1BSU5JTkdfV09SSzoKLQkJCQlyZXR1cm4gUkVNQUlOSU5HX1dPUktfRURFRkFVTFQgPT0gbnVsbCA/IHJlbWFpbmluZ1dvcmsgIT0gbnVsbCA6ICFSRU1BSU5JTkdfV09SS19FREVGQVVMVC5lcXVhbHMocmVtYWluaW5nV29yayk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0FDVFVBTF9PVkVSVElNRV9XT1JLOgotCQkJCXJldHVybiBBQ1RVQUxfT1ZFUlRJTUVfV09SS19FREVGQVVMVCA9PSBudWxsID8gYWN0dWFsT3ZlcnRpbWVXb3JrICE9IG51bGwgOiAhQUNUVUFMX09WRVJUSU1FX1dPUktfRURFRkFVTFQuZXF1YWxzKGFjdHVhbE92ZXJ0aW1lV29yayk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX1JFTUFJTklOR19PVkVSVElNRV9XT1JLOgotCQkJCXJldHVybiBSRU1BSU5JTkdfT1ZFUlRJTUVfV09SS19FREVGQVVMVCA9PSBudWxsID8gcmVtYWluaW5nT3ZlcnRpbWVXb3JrICE9IG51bGwgOiAhUkVNQUlOSU5HX09WRVJUSU1FX1dPUktfRURFRkFVTFQuZXF1YWxzKHJlbWFpbmluZ092ZXJ0aW1lV29yayk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX1BFUkNFTlRfV09SS19DT01QTEVURToKLQkJCQlyZXR1cm4gUEVSQ0VOVF9XT1JLX0NPTVBMRVRFX0VERUZBVUxUID09IG51bGwgPyBwZXJjZW50V29ya0NvbXBsZXRlICE9IG51bGwgOiAhUEVSQ0VOVF9XT1JLX0NPTVBMRVRFX0VERUZBVUxULmVxdWFscyhwZXJjZW50V29ya0NvbXBsZXRlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fU1RBTkRBUkRfUkFURToKLQkJCQlyZXR1cm4gU1RBTkRBUkRfUkFURV9FREVGQVVMVCA9PSBudWxsID8gc3RhbmRhcmRSYXRlICE9IG51bGwgOiAhU1RBTkRBUkRfUkFURV9FREVGQVVMVC5lcXVhbHMoc3RhbmRhcmRSYXRlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fU1RBTkRBUkRfUkFURV9GT1JNQVQ6Ci0JCQkJcmV0dXJuIFNUQU5EQVJEX1JBVEVfRk9STUFUX0VERUZBVUxUID09IG51bGwgPyBzdGFuZGFyZFJhdGVGb3JtYXQgIT0gbnVsbCA6ICFTVEFOREFSRF9SQVRFX0ZPUk1BVF9FREVGQVVMVC5lcXVhbHMoc3RhbmRhcmRSYXRlRm9ybWF0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQ09TVDoKLQkJCQlyZXR1cm4gQ09TVF9FREVGQVVMVCA9PSBudWxsID8gY29zdCAhPSBudWxsIDogIUNPU1RfRURFRkFVTFQuZXF1YWxzKGNvc3QpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19PVkVSVElNRV9SQVRFOgotCQkJCXJldHVybiBPVkVSVElNRV9SQVRFX0VERUZBVUxUID09IG51bGwgPyBvdmVydGltZVJhdGUgIT0gbnVsbCA6ICFPVkVSVElNRV9SQVRFX0VERUZBVUxULmVxdWFscyhvdmVydGltZVJhdGUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19PVkVSVElNRV9SQVRFX0ZPUk1BVDoKLQkJCQlyZXR1cm4gT1ZFUlRJTUVfUkFURV9GT1JNQVRfRURFRkFVTFQgPT0gbnVsbCA/IG92ZXJ0aW1lUmF0ZUZvcm1hdCAhPSBudWxsIDogIU9WRVJUSU1FX1JBVEVfRk9STUFUX0VERUZBVUxULmVxdWFscyhvdmVydGltZVJhdGVGb3JtYXQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19PVkVSVElNRV9DT1NUOgotCQkJCXJldHVybiBPVkVSVElNRV9DT1NUX0VERUZBVUxUID09IG51bGwgPyBvdmVydGltZUNvc3QgIT0gbnVsbCA6ICFPVkVSVElNRV9DT1NUX0VERUZBVUxULmVxdWFscyhvdmVydGltZUNvc3QpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19DT1NUX1BFUl9VU0U6Ci0JCQkJcmV0dXJuIENPU1RfUEVSX1VTRV9FREVGQVVMVCA9PSBudWxsID8gY29zdFBlclVzZSAhPSBudWxsIDogIUNPU1RfUEVSX1VTRV9FREVGQVVMVC5lcXVhbHMoY29zdFBlclVzZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0FDVFVBTF9DT1NUOgotCQkJCXJldHVybiBBQ1RVQUxfQ09TVF9FREVGQVVMVCA9PSBudWxsID8gYWN0dWFsQ29zdCAhPSBudWxsIDogIUFDVFVBTF9DT1NUX0VERUZBVUxULmVxdWFscyhhY3R1YWxDb3N0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQUNUVUFMX09WRVJUSU1FX0NPU1Q6Ci0JCQkJcmV0dXJuIEFDVFVBTF9PVkVSVElNRV9DT1NUX0VERUZBVUxUID09IG51bGwgPyBhY3R1YWxPdmVydGltZUNvc3QgIT0gbnVsbCA6ICFBQ1RVQUxfT1ZFUlRJTUVfQ09TVF9FREVGQVVMVC5lcXVhbHMoYWN0dWFsT3ZlcnRpbWVDb3N0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fUkVNQUlOSU5HX0NPU1Q6Ci0JCQkJcmV0dXJuIFJFTUFJTklOR19DT1NUX0VERUZBVUxUID09IG51bGwgPyByZW1haW5pbmdDb3N0ICE9IG51bGwgOiAhUkVNQUlOSU5HX0NPU1RfRURFRkFVTFQuZXF1YWxzKHJlbWFpbmluZ0Nvc3QpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19SRU1BSU5JTkdfT1ZFUlRJTUVfQ09TVDoKLQkJCQlyZXR1cm4gUkVNQUlOSU5HX09WRVJUSU1FX0NPU1RfRURFRkFVTFQgPT0gbnVsbCA/IHJlbWFpbmluZ092ZXJ0aW1lQ29zdCAhPSBudWxsIDogIVJFTUFJTklOR19PVkVSVElNRV9DT1NUX0VERUZBVUxULmVxdWFscyhyZW1haW5pbmdPdmVydGltZUNvc3QpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19XT1JLX1ZBUklBTkNFOgotCQkJCXJldHVybiBpc1NldFdvcmtWYXJpYW5jZSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19DT1NUX1ZBUklBTkNFOgotCQkJCXJldHVybiBpc1NldENvc3RWYXJpYW5jZSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19TVjoKLQkJCQlyZXR1cm4gaXNTZXRTVigpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19DVjoKLQkJCQlyZXR1cm4gaXNTZXRDVigpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19BQ1dQOgotCQkJCXJldHVybiBpc1NldEFDV1AoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQ0FMRU5EQVJfVUlEOgotCQkJCXJldHVybiBDQUxFTkRBUl9VSURfRURFRkFVTFQgPT0gbnVsbCA/IGNhbGVuZGFyVUlEICE9IG51bGwgOiAhQ0FMRU5EQVJfVUlEX0VERUZBVUxULmVxdWFscyhjYWxlbmRhclVJRCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX05PVEVTOgotCQkJCXJldHVybiBOT1RFU19FREVGQVVMVCA9PSBudWxsID8gbm90ZXMgIT0gbnVsbCA6ICFOT1RFU19FREVGQVVMVC5lcXVhbHMobm90ZXMpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19CQ1dTOgotCQkJCXJldHVybiBpc1NldEJDV1MoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQkNXUDoKLQkJCQlyZXR1cm4gaXNTZXRCQ1dQKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0lTX0dFTkVSSUM6Ci0JCQkJcmV0dXJuIGlzU2V0SXNHZW5lcmljKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0lTX0lOQUNUSVZFOgotCQkJCXJldHVybiBpc1NldElzSW5hY3RpdmUoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fSVNfRU5URVJQUklTRToKLQkJCQlyZXR1cm4gaXNTZXRJc0VudGVycHJpc2UoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQk9PS0lOR19UWVBFOgotCQkJCXJldHVybiBCT09LSU5HX1RZUEVfRURFRkFVTFQgPT0gbnVsbCA/IGJvb2tpbmdUeXBlICE9IG51bGwgOiAhQk9PS0lOR19UWVBFX0VERUZBVUxULmVxdWFscyhib29raW5nVHlwZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0FDVFVBTF9XT1JLX1BST1RFQ1RFRDoKLQkJCQlyZXR1cm4gQUNUVUFMX1dPUktfUFJPVEVDVEVEX0VERUZBVUxUID09IG51bGwgPyBhY3R1YWxXb3JrUHJvdGVjdGVkICE9IG51bGwgOiAhQUNUVUFMX1dPUktfUFJPVEVDVEVEX0VERUZBVUxULmVxdWFscyhhY3R1YWxXb3JrUHJvdGVjdGVkKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQUNUVUFMX09WRVJUSU1FX1dPUktfUFJPVEVDVEVEOgotCQkJCXJldHVybiBBQ1RVQUxfT1ZFUlRJTUVfV09SS19QUk9URUNURURfRURFRkFVTFQgPT0gbnVsbCA/IGFjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZCAhPSBudWxsIDogIUFDVFVBTF9PVkVSVElNRV9XT1JLX1BST1RFQ1RFRF9FREVGQVVMVC5lcXVhbHMoYWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQUNUSVZFX0RJUkVDVE9SWV9HVUlEOgotCQkJCXJldHVybiBBQ1RJVkVfRElSRUNUT1JZX0dVSURfRURFRkFVTFQgPT0gbnVsbCA/IGFjdGl2ZURpcmVjdG9yeUdVSUQgIT0gbnVsbCA6ICFBQ1RJVkVfRElSRUNUT1JZX0dVSURfRURFRkFVTFQuZXF1YWxzKGFjdGl2ZURpcmVjdG9yeUdVSUQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19DUkVBVElPTl9EQVRFOgotCQkJCXJldHVybiBDUkVBVElPTl9EQVRFX0VERUZBVUxUID09IG51bGwgPyBjcmVhdGlvbkRhdGUgIT0gbnVsbCA6ICFDUkVBVElPTl9EQVRFX0VERUZBVUxULmVxdWFscyhjcmVhdGlvbkRhdGUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19FWFRFTkRFRF9BVFRSSUJVVEU6Ci0JCQkJcmV0dXJuIGV4dGVuZGVkQXR0cmlidXRlICE9IG51bGwgJiYgIWV4dGVuZGVkQXR0cmlidXRlLmlzRW1wdHkoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQkFTRUxJTkU6Ci0JCQkJcmV0dXJuIGJhc2VsaW5lICE9IG51bGwgJiYgIWJhc2VsaW5lLmlzRW1wdHkoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fT1VUTElORV9DT0RFOgotCQkJCXJldHVybiBvdXRsaW5lQ29kZSAhPSBudWxsICYmICFvdXRsaW5lQ29kZS5pc0VtcHR5KCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0FWQUlMQUJJTElUWV9QRVJJT0RTOgotCQkJCXJldHVybiBhdmFpbGFiaWxpdHlQZXJpb2RzICE9IG51bGw7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX1JBVEVTOgotCQkJCXJldHVybiByYXRlcyAhPSBudWxsOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19USU1FUEhBU0VEX0RBVEE6Ci0JCQkJcmV0dXJuIHRpbWVwaGFzZWREYXRhICE9IG51bGwgJiYgIXRpbWVwaGFzZWREYXRhLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHVJRDogIik7Ci0JCXJlc3VsdC5hcHBlbmQodUlEKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBpRDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoaUQpOwotCQlyZXN1bHQuYXBwZW5kKCIsIG5hbWU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKG5hbWUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHR5cGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHR5cGUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGlzTnVsbDogIik7Ci0JCWlmIChpc051bGxFU2V0KSByZXN1bHQuYXBwZW5kKGlzTnVsbCk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGluaXRpYWxzOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChpbml0aWFscyk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcGhvbmV0aWNzOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChwaG9uZXRpY3MpOwotCQlyZXN1bHQuYXBwZW5kKCIsIG5UQWNjb3VudDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoblRBY2NvdW50KTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBtYXRlcmlhbExhYmVsOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChtYXRlcmlhbExhYmVsKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBjb2RlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChjb2RlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBncm91cDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZ3JvdXApOwotCQlyZXN1bHQuYXBwZW5kKCIsIHdvcmtHcm91cDogIik7Ci0JCXJlc3VsdC5hcHBlbmQod29ya0dyb3VwKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBlbWFpbEFkZHJlc3M6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGVtYWlsQWRkcmVzcyk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgaHlwZXJsaW5rOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChoeXBlcmxpbmspOwotCQlyZXN1bHQuYXBwZW5kKCIsIGh5cGVybGlua0FkZHJlc3M6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGh5cGVybGlua0FkZHJlc3MpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGh5cGVybGlua1N1YkFkZHJlc3M6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGh5cGVybGlua1N1YkFkZHJlc3MpOwotCQlyZXN1bHQuYXBwZW5kKCIsIG1heFVuaXRzOiAiKTsKLQkJaWYgKG1heFVuaXRzRVNldCkgcmVzdWx0LmFwcGVuZChtYXhVbml0cyk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHBlYWtVbml0czogIik7Ci0JCWlmIChwZWFrVW5pdHNFU2V0KSByZXN1bHQuYXBwZW5kKHBlYWtVbml0cyk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIG92ZXJBbGxvY2F0ZWQ6ICIpOwotCQlpZiAob3ZlckFsbG9jYXRlZEVTZXQpIHJlc3VsdC5hcHBlbmQob3ZlckFsbG9jYXRlZCk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGF2YWlsYWJsZUZyb206ICIpOwotCQlyZXN1bHQuYXBwZW5kKGF2YWlsYWJsZUZyb20pOwotCQlyZXN1bHQuYXBwZW5kKCIsIGF2YWlsYWJsZVRvOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChhdmFpbGFibGVUbyk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgc3RhcnQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHN0YXJ0KTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBmaW5pc2g6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGZpbmlzaCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgY2FuTGV2ZWw6ICIpOwotCQlpZiAoY2FuTGV2ZWxFU2V0KSByZXN1bHQuYXBwZW5kKGNhbkxldmVsKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgYWNjcnVlQXQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGFjY3J1ZUF0KTsKLQkJcmVzdWx0LmFwcGVuZCgiLCB3b3JrOiAiKTsKLQkJcmVzdWx0LmFwcGVuZCh3b3JrKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCByZWd1bGFyV29yazogIik7Ci0JCXJlc3VsdC5hcHBlbmQocmVndWxhcldvcmspOwotCQlyZXN1bHQuYXBwZW5kKCIsIG92ZXJ0aW1lV29yazogIik7Ci0JCXJlc3VsdC5hcHBlbmQob3ZlcnRpbWVXb3JrKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBhY3R1YWxXb3JrOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChhY3R1YWxXb3JrKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCByZW1haW5pbmdXb3JrOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChyZW1haW5pbmdXb3JrKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBhY3R1YWxPdmVydGltZVdvcms6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGFjdHVhbE92ZXJ0aW1lV29yayk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcmVtYWluaW5nT3ZlcnRpbWVXb3JrOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChyZW1haW5pbmdPdmVydGltZVdvcmspOwotCQlyZXN1bHQuYXBwZW5kKCIsIHBlcmNlbnRXb3JrQ29tcGxldGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHBlcmNlbnRXb3JrQ29tcGxldGUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHN0YW5kYXJkUmF0ZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoc3RhbmRhcmRSYXRlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBzdGFuZGFyZFJhdGVGb3JtYXQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHN0YW5kYXJkUmF0ZUZvcm1hdCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgY29zdDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoY29zdCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgb3ZlcnRpbWVSYXRlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChvdmVydGltZVJhdGUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIG92ZXJ0aW1lUmF0ZUZvcm1hdDogIik7Ci0JCXJlc3VsdC5hcHBlbmQob3ZlcnRpbWVSYXRlRm9ybWF0KTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBvdmVydGltZUNvc3Q6ICIpOwotCQlyZXN1bHQuYXBwZW5kKG92ZXJ0aW1lQ29zdCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgY29zdFBlclVzZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoY29zdFBlclVzZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgYWN0dWFsQ29zdDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoYWN0dWFsQ29zdCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgYWN0dWFsT3ZlcnRpbWVDb3N0OiAiKTsKLQkJcmVzdWx0LmFwcGVuZChhY3R1YWxPdmVydGltZUNvc3QpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHJlbWFpbmluZ0Nvc3Q6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHJlbWFpbmluZ0Nvc3QpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHJlbWFpbmluZ092ZXJ0aW1lQ29zdDogIik7Ci0JCXJlc3VsdC5hcHBlbmQocmVtYWluaW5nT3ZlcnRpbWVDb3N0KTsKLQkJcmVzdWx0LmFwcGVuZCgiLCB3b3JrVmFyaWFuY2U6ICIpOwotCQlpZiAod29ya1ZhcmlhbmNlRVNldCkgcmVzdWx0LmFwcGVuZCh3b3JrVmFyaWFuY2UpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBjb3N0VmFyaWFuY2U6ICIpOwotCQlpZiAoY29zdFZhcmlhbmNlRVNldCkgcmVzdWx0LmFwcGVuZChjb3N0VmFyaWFuY2UpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBzVjogIik7Ci0JCWlmIChzVkVTZXQpIHJlc3VsdC5hcHBlbmQoc1YpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBjVjogIik7Ci0JCWlmIChjVkVTZXQpIHJlc3VsdC5hcHBlbmQoY1YpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBhQ1dQOiAiKTsKLQkJaWYgKGFDV1BFU2V0KSByZXN1bHQuYXBwZW5kKGFDV1ApOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBjYWxlbmRhclVJRDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoY2FsZW5kYXJVSUQpOwotCQlyZXN1bHQuYXBwZW5kKCIsIG5vdGVzOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChub3Rlcyk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgYkNXUzogIik7Ci0JCWlmIChiQ1dTRVNldCkgcmVzdWx0LmFwcGVuZChiQ1dTKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgYkNXUDogIik7Ci0JCWlmIChiQ1dQRVNldCkgcmVzdWx0LmFwcGVuZChiQ1dQKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgaXNHZW5lcmljOiAiKTsKLQkJaWYgKGlzR2VuZXJpY0VTZXQpIHJlc3VsdC5hcHBlbmQoaXNHZW5lcmljKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgaXNJbmFjdGl2ZTogIik7Ci0JCWlmIChpc0luYWN0aXZlRVNldCkgcmVzdWx0LmFwcGVuZChpc0luYWN0aXZlKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgaXNFbnRlcnByaXNlOiAiKTsKLQkJaWYgKGlzRW50ZXJwcmlzZUVTZXQpIHJlc3VsdC5hcHBlbmQoaXNFbnRlcnByaXNlKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgYm9va2luZ1R5cGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGJvb2tpbmdUeXBlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBhY3R1YWxXb3JrUHJvdGVjdGVkOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChhY3R1YWxXb3JrUHJvdGVjdGVkKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBhY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGFjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgYWN0aXZlRGlyZWN0b3J5R1VJRDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoYWN0aXZlRGlyZWN0b3J5R1VJRCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgY3JlYXRpb25EYXRlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChjcmVhdGlvbkRhdGUpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9SZXNvdXJjZUltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9SZXNvdXJjZXNJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvUmVzb3VyY2VzSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYWZlNjMwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9SZXNvdXJjZXNJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDkgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBSZXNvdXJjZXNJbXBsLmphdmEsdiAxLjEgMjAwOC8wMS8xNSAwODo1MTo1MyBqdGhhbSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZXM7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5SZXNvdXJjZXM8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5SZXNvdXJjZXNJbXBsI2dldFJlc291cmNlIDxlbT5SZXNvdXJjZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFJlc291cmNlc0ltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIFJlc291cmNlcyB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVzb3VyY2UoKSA8ZW0+UmVzb3VyY2U8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmVzb3VyY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCByZXNvdXJjZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUmVzb3VyY2VzSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldFJlc291cmNlcygpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRSZXNvdXJjZSgpIHsKLQkJaWYgKHJlc291cmNlID09IG51bGwpIHsKLQkJCXJlc291cmNlID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KFJlc291cmNlLmNsYXNzLCB0aGlzLCBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFU19fUkVTT1VSQ0UpOwotCQl9Ci0JCXJldHVybiByZXNvdXJjZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VTX19SRVNPVVJDRToKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRSZXNvdXJjZSgpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VTX19SRVNPVVJDRToKLQkJCQlyZXR1cm4gZ2V0UmVzb3VyY2UoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VTX19SRVNPVVJDRToKLQkJCQlnZXRSZXNvdXJjZSgpLmNsZWFyKCk7Ci0JCQkJZ2V0UmVzb3VyY2UoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VTX19SRVNPVVJDRToKLQkJCQlnZXRSZXNvdXJjZSgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VTX19SRVNPVVJDRToKLQkJCQlyZXR1cm4gcmVzb3VyY2UgIT0gbnVsbCAmJiAhcmVzb3VyY2UuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLX0gLy9SZXNvdXJjZXNJbXBsCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvVGFza0ltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9UYXNrSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OTg3ODQxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9UYXNrSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTc0MCArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFRhc2tJbXBsLmphdmEsdiAxLjEgMjAwOC8wMS8xNSAwODo1MTo1MyBqdGhhbSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbDsKLQotaW1wb3J0IGphdmEubWF0aC5CaWdEZWNpbWFsOwotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZTI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGUyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJlZGVjZXNzb3JMaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRpbWVwaGFzZWREYXRhVHlwZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlRhc2s8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5UYXNrSW1wbCNnZXRVSUQgPGVtPlVJRDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlRhc2tJbXBsI2dldElEIDxlbT5JRDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlRhc2tJbXBsI2dldE5hbWUgPGVtPk5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5UYXNrSW1wbCNnZXRUeXBlIDxlbT5UeXBlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVGFza0ltcGwjaXNJc051bGwgPGVtPklzIE51bGw8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5UYXNrSW1wbCNnZXRDcmVhdGVEYXRlIDxlbT5DcmVhdGUgRGF0ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlRhc2tJbXBsI2dldENvbnRhY3QgPGVtPkNvbnRhY3Q8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5UYXNrSW1wbCNnZXRXQlMgPGVtPldCUzwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlRhc2tJbXBsI2dldFdCU0xldmVsIDxlbT5XQlMgTGV2ZWw8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5UYXNrSW1wbCNnZXRPdXRsaW5lTnVtYmVyIDxlbT5PdXRsaW5lIE51bWJlcjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlRhc2tJbXBsI2dldE91dGxpbmVMZXZlbCA8ZW0+T3V0bGluZSBMZXZlbDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlRhc2tJbXBsI2dldFByaW9yaXR5IDxlbT5Qcmlvcml0eTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlRhc2tJbXBsI2dldFN0YXJ0IDxlbT5TdGFydDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlRhc2tJbXBsI2dldEZpbmlzaCA8ZW0+RmluaXNoPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVGFza0ltcGwjZ2V0RHVyYXRpb24gPGVtPkR1cmF0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVGFza0ltcGwjZ2V0RHVyYXRpb25Gb3JtYXQgPGVtPkR1cmF0aW9uIEZvcm1hdDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlRhc2tJbXBsI2dldFdvcmsgPGVtPldvcms8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5UYXNrSW1wbCNnZXRTdG9wIDxlbT5TdG9wPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVGFza0ltcGwjZ2V0UmVzdW1lIDxlbT5SZXN1bWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5UYXNrSW1wbCNpc1Jlc3VtZVZhbGlkIDxlbT5SZXN1bWUgVmFsaWQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5UYXNrSW1wbCNpc0VmZm9ydERyaXZlbiA8ZW0+RWZmb3J0IERyaXZlbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlRhc2tJbXBsI2lzUmVjdXJyaW5nIDxlbT5SZWN1cnJpbmc8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5UYXNrSW1wbCNpc092ZXJBbGxvY2F0ZWQgPGVtPk92ZXIgQWxsb2NhdGVkPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVGFza0ltcGwjaXNFc3RpbWF0ZWQgPGVtPkVzdGltYXRlZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlRhc2tJbXBsI2lzTWlsZXN0b25lIDxlbT5NaWxlc3RvbmU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5UYXNrSW1wbCNpc1N1bW1hcnkgPGVtPlN1bW1hcnk8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5UYXNrSW1wbCNpc0NyaXRpY2FsIDxlbT5Dcml0aWNhbDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlRhc2tJbXBsI2lzSXNTdWJwcm9qZWN0IDxlbT5JcyBTdWJwcm9qZWN0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVGFza0ltcGwjaXNJc1N1YnByb2plY3RSZWFkT25seSA8ZW0+SXMgU3VicHJvamVjdCBSZWFkIE9ubHk8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5UYXNrSW1wbCNnZXRTdWJwcm9qZWN0TmFtZSA8ZW0+U3VicHJvamVjdCBOYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVGFza0ltcGwjaXNFeHRlcm5hbFRhc2sgPGVtPkV4dGVybmFsIFRhc2s8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5UYXNrSW1wbCNnZXRFeHRlcm5hbFRhc2tQcm9qZWN0IDxlbT5FeHRlcm5hbCBUYXNrIFByb2plY3Q8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5UYXNrSW1wbCNnZXRFYXJseVN0YXJ0IDxlbT5FYXJseSBTdGFydDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlRhc2tJbXBsI2dldEVhcmx5RmluaXNoIDxlbT5FYXJseSBGaW5pc2g8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5UYXNrSW1wbCNnZXRMYXRlU3RhcnQgPGVtPkxhdGUgU3RhcnQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5UYXNrSW1wbCNnZXRMYXRlRmluaXNoIDxlbT5MYXRlIEZpbmlzaDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlRhc2tJbXBsI2dldFN0YXJ0VmFyaWFuY2UgPGVtPlN0YXJ0IFZhcmlhbmNlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVGFza0ltcGwjZ2V0RmluaXNoVmFyaWFuY2UgPGVtPkZpbmlzaCBWYXJpYW5jZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlRhc2tJbXBsI2dldFdvcmtWYXJpYW5jZSA8ZW0+V29yayBWYXJpYW5jZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlRhc2tJbXBsI2dldEZyZWVTbGFjayA8ZW0+RnJlZSBTbGFjazwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlRhc2tJbXBsI2dldFRvdGFsU2xhY2sgPGVtPlRvdGFsIFNsYWNrPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVGFza0ltcGwjZ2V0Rml4ZWRDb3N0IDxlbT5GaXhlZCBDb3N0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVGFza0ltcGwjZ2V0Rml4ZWRDb3N0QWNjcnVhbCA8ZW0+Rml4ZWQgQ29zdCBBY2NydWFsPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVGFza0ltcGwjZ2V0UGVyY2VudENvbXBsZXRlIDxlbT5QZXJjZW50IENvbXBsZXRlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVGFza0ltcGwjZ2V0UGVyY2VudFdvcmtDb21wbGV0ZSA8ZW0+UGVyY2VudCBXb3JrIENvbXBsZXRlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVGFza0ltcGwjZ2V0Q29zdCA8ZW0+Q29zdDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlRhc2tJbXBsI2dldE92ZXJ0aW1lQ29zdCA8ZW0+T3ZlcnRpbWUgQ29zdDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlRhc2tJbXBsI2dldE92ZXJ0aW1lV29yayA8ZW0+T3ZlcnRpbWUgV29yazwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlRhc2tJbXBsI2dldEFjdHVhbFN0YXJ0IDxlbT5BY3R1YWwgU3RhcnQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5UYXNrSW1wbCNnZXRBY3R1YWxGaW5pc2ggPGVtPkFjdHVhbCBGaW5pc2g8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5UYXNrSW1wbCNnZXRBY3R1YWxEdXJhdGlvbiA8ZW0+QWN0dWFsIER1cmF0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVGFza0ltcGwjZ2V0QWN0dWFsQ29zdCA8ZW0+QWN0dWFsIENvc3Q8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5UYXNrSW1wbCNnZXRBY3R1YWxPdmVydGltZUNvc3QgPGVtPkFjdHVhbCBPdmVydGltZSBDb3N0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVGFza0ltcGwjZ2V0QWN0dWFsV29yayA8ZW0+QWN0dWFsIFdvcms8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5UYXNrSW1wbCNnZXRBY3R1YWxPdmVydGltZVdvcmsgPGVtPkFjdHVhbCBPdmVydGltZSBXb3JrPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVGFza0ltcGwjZ2V0UmVndWxhcldvcmsgPGVtPlJlZ3VsYXIgV29yazwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlRhc2tJbXBsI2dldFJlbWFpbmluZ0R1cmF0aW9uIDxlbT5SZW1haW5pbmcgRHVyYXRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5UYXNrSW1wbCNnZXRSZW1haW5pbmdDb3N0IDxlbT5SZW1haW5pbmcgQ29zdDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlRhc2tJbXBsI2dldFJlbWFpbmluZ1dvcmsgPGVtPlJlbWFpbmluZyBXb3JrPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVGFza0ltcGwjZ2V0UmVtYWluaW5nT3ZlcnRpbWVDb3N0IDxlbT5SZW1haW5pbmcgT3ZlcnRpbWUgQ29zdDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlRhc2tJbXBsI2dldFJlbWFpbmluZ092ZXJ0aW1lV29yayA8ZW0+UmVtYWluaW5nIE92ZXJ0aW1lIFdvcms8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5UYXNrSW1wbCNnZXRBQ1dQIDxlbT5BQ1dQPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVGFza0ltcGwjZ2V0Q1YgPGVtPkNWPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVGFza0ltcGwjZ2V0Q29uc3RyYWludFR5cGUgPGVtPkNvbnN0cmFpbnQgVHlwZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlRhc2tJbXBsI2dldENhbGVuZGFyVUlEIDxlbT5DYWxlbmRhciBVSUQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5UYXNrSW1wbCNnZXRDb25zdHJhaW50RGF0ZSA8ZW0+Q29uc3RyYWludCBEYXRlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVGFza0ltcGwjZ2V0RGVhZGxpbmUgPGVtPkRlYWRsaW5lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVGFza0ltcGwjaXNMZXZlbEFzc2lnbm1lbnRzIDxlbT5MZXZlbCBBc3NpZ25tZW50czwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlRhc2tJbXBsI2lzTGV2ZWxpbmdDYW5TcGxpdCA8ZW0+TGV2ZWxpbmcgQ2FuIFNwbGl0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVGFza0ltcGwjZ2V0TGV2ZWxpbmdEZWxheSA8ZW0+TGV2ZWxpbmcgRGVsYXk8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5UYXNrSW1wbCNnZXRMZXZlbGluZ0RlbGF5Rm9ybWF0IDxlbT5MZXZlbGluZyBEZWxheSBGb3JtYXQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5UYXNrSW1wbCNnZXRQcmVMZXZlbGVkU3RhcnQgPGVtPlByZSBMZXZlbGVkIFN0YXJ0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVGFza0ltcGwjZ2V0UHJlTGV2ZWxlZEZpbmlzaCA8ZW0+UHJlIExldmVsZWQgRmluaXNoPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVGFza0ltcGwjZ2V0SHlwZXJsaW5rIDxlbT5IeXBlcmxpbms8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5UYXNrSW1wbCNnZXRIeXBlcmxpbmtBZGRyZXNzIDxlbT5IeXBlcmxpbmsgQWRkcmVzczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlRhc2tJbXBsI2dldEh5cGVybGlua1N1YkFkZHJlc3MgPGVtPkh5cGVybGluayBTdWIgQWRkcmVzczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlRhc2tJbXBsI2lzSWdub3JlUmVzb3VyY2VDYWxlbmRhciA8ZW0+SWdub3JlIFJlc291cmNlIENhbGVuZGFyPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVGFza0ltcGwjZ2V0Tm90ZXMgPGVtPk5vdGVzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVGFza0ltcGwjaXNIaWRlQmFyIDxlbT5IaWRlIEJhcjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlRhc2tJbXBsI2lzUm9sbHVwIDxlbT5Sb2xsdXA8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5UYXNrSW1wbCNnZXRCQ1dTIDxlbT5CQ1dTPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVGFza0ltcGwjZ2V0QkNXUCA8ZW0+QkNXUDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlRhc2tJbXBsI2dldFBoeXNpY2FsUGVyY2VudENvbXBsZXRlIDxlbT5QaHlzaWNhbCBQZXJjZW50IENvbXBsZXRlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVGFza0ltcGwjZ2V0RWFybmVkVmFsdWVNZXRob2QgPGVtPkVhcm5lZCBWYWx1ZSBNZXRob2Q8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5UYXNrSW1wbCNnZXRQcmVkZWNlc3NvckxpbmsgPGVtPlByZWRlY2Vzc29yIExpbms8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5UYXNrSW1wbCNnZXRBY3R1YWxXb3JrUHJvdGVjdGVkIDxlbT5BY3R1YWwgV29yayBQcm90ZWN0ZWQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5UYXNrSW1wbCNnZXRBY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQgPGVtPkFjdHVhbCBPdmVydGltZSBXb3JrIFByb3RlY3RlZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlRhc2tJbXBsI2dldEV4dGVuZGVkQXR0cmlidXRlIDxlbT5FeHRlbmRlZCBBdHRyaWJ1dGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5UYXNrSW1wbCNnZXRCYXNlbGluZSA8ZW0+QmFzZWxpbmU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5UYXNrSW1wbCNnZXRPdXRsaW5lQ29kZSA8ZW0+T3V0bGluZSBDb2RlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVGFza0ltcGwjZ2V0VGltZXBoYXNlZERhdGEgPGVtPlRpbWVwaGFzZWQgRGF0YTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFRhc2tJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBUYXNrIHsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VUlEKCkgPGVtPlVJRDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VUlEKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0ludGVnZXIgVUlEX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFVJRCgpIDxlbT5VSUQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFVJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0ludGVnZXIgdUlEID0gVUlEX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElEKCkgPGVtPklEPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdJbnRlZ2VyIElEX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElEKCkgPGVtPklEPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0ludGVnZXIgaUQgPSBJRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lKCkgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZSgpIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIG5hbWUgPSBOQU1FX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFR5cGUoKSA8ZW0+VHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdJbnRlZ2VyIFRZUEVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VHlwZSgpIDxlbT5UeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnSW50ZWdlciB0eXBlID0gVFlQRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0lzTnVsbCgpIDxlbT5JcyBOdWxsPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0lzTnVsbCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIElTX05VTExfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzSXNOdWxsKCkgPGVtPklzIE51bGw8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzSXNOdWxsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc051bGwgPSBJU19OVUxMX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBJcyBOdWxsIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc051bGxFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q3JlYXRlRGF0ZSgpIDxlbT5DcmVhdGUgRGF0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q3JlYXRlRGF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBPYmplY3QgQ1JFQVRFX0RBVEVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q3JlYXRlRGF0ZSgpIDxlbT5DcmVhdGUgRGF0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q3JlYXRlRGF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBjcmVhdGVEYXRlID0gQ1JFQVRFX0RBVEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q29udGFjdCgpIDxlbT5Db250YWN0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDb250YWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBDT05UQUNUX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENvbnRhY3QoKSA8ZW0+Q29udGFjdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q29udGFjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBjb250YWN0ID0gQ09OVEFDVF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRXQlMoKSA8ZW0+V0JTPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRXQlMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFdCU19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRXQlMoKSA8ZW0+V0JTPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRXQlMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgd0JTID0gV0JTX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFdCU0xldmVsKCkgPGVtPldCUyBMZXZlbDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0V0JTTGV2ZWwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFdCU19MRVZFTF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRXQlNMZXZlbCgpIDxlbT5XQlMgTGV2ZWw8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFdCU0xldmVsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHdCU0xldmVsID0gV0JTX0xFVkVMX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE91dGxpbmVOdW1iZXIoKSA8ZW0+T3V0bGluZSBOdW1iZXI8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE91dGxpbmVOdW1iZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE9VVExJTkVfTlVNQkVSX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE91dGxpbmVOdW1iZXIoKSA8ZW0+T3V0bGluZSBOdW1iZXI8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE91dGxpbmVOdW1iZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgb3V0bGluZU51bWJlciA9IE9VVExJTkVfTlVNQkVSX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE91dGxpbmVMZXZlbCgpIDxlbT5PdXRsaW5lIExldmVsPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRPdXRsaW5lTGV2ZWwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBPVVRMSU5FX0xFVkVMX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE91dGxpbmVMZXZlbCgpIDxlbT5PdXRsaW5lIExldmVsPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRPdXRsaW5lTGV2ZWwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdJbnRlZ2VyIG91dGxpbmVMZXZlbCA9IE9VVExJTkVfTEVWRUxfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJpb3JpdHkoKSA8ZW0+UHJpb3JpdHk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFByaW9yaXR5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0ludGVnZXIgUFJJT1JJVFlfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJpb3JpdHkoKSA8ZW0+UHJpb3JpdHk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFByaW9yaXR5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnSW50ZWdlciBwcmlvcml0eSA9IFBSSU9SSVRZX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFN0YXJ0KCkgPGVtPlN0YXJ0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTdGFydCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBPYmplY3QgU1RBUlRfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U3RhcnQoKSA8ZW0+U3RhcnQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFN0YXJ0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IHN0YXJ0ID0gU1RBUlRfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RmluaXNoKCkgPGVtPkZpbmlzaDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RmluaXNoKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIE9iamVjdCBGSU5JU0hfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RmluaXNoKCkgPGVtPkZpbmlzaDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RmluaXNoKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGZpbmlzaCA9IEZJTklTSF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREdXJhdGlvbigpIDxlbT5EdXJhdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RHVyYXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgT2JqZWN0IERVUkFUSU9OX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldER1cmF0aW9uKCkgPGVtPkR1cmF0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREdXJhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBkdXJhdGlvbiA9IERVUkFUSU9OX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldER1cmF0aW9uRm9ybWF0KCkgPGVtPkR1cmF0aW9uIEZvcm1hdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RHVyYXRpb25Gb3JtYXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBEVVJBVElPTl9GT1JNQVRfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RHVyYXRpb25Gb3JtYXQoKSA8ZW0+RHVyYXRpb24gRm9ybWF0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREdXJhdGlvbkZvcm1hdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0ludGVnZXIgZHVyYXRpb25Gb3JtYXQgPSBEVVJBVElPTl9GT1JNQVRfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0V29yaygpIDxlbT5Xb3JrPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRXb3JrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIE9iamVjdCBXT1JLX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFdvcmsoKSA8ZW0+V29yazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0V29yaygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCB3b3JrID0gV09SS19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTdG9wKCkgPGVtPlN0b3A8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFN0b3AoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgT2JqZWN0IFNUT1BfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U3RvcCgpIDxlbT5TdG9wPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTdG9wKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IHN0b3AgPSBTVE9QX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlc3VtZSgpIDxlbT5SZXN1bWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJlc3VtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBPYmplY3QgUkVTVU1FX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlc3VtZSgpIDxlbT5SZXN1bWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJlc3VtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCByZXN1bWUgPSBSRVNVTUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNSZXN1bWVWYWxpZCgpIDxlbT5SZXN1bWUgVmFsaWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzUmVzdW1lVmFsaWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBSRVNVTUVfVkFMSURfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzUmVzdW1lVmFsaWQoKSA8ZW0+UmVzdW1lIFZhbGlkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1Jlc3VtZVZhbGlkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiByZXN1bWVWYWxpZCA9IFJFU1VNRV9WQUxJRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgUmVzdW1lIFZhbGlkIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiByZXN1bWVWYWxpZEVTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0VmZm9ydERyaXZlbigpIDxlbT5FZmZvcnQgRHJpdmVuPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0VmZm9ydERyaXZlbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIEVGRk9SVF9EUklWRU5fRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzRWZmb3J0RHJpdmVuKCkgPGVtPkVmZm9ydCBEcml2ZW48L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzRWZmb3J0RHJpdmVuKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBlZmZvcnREcml2ZW4gPSBFRkZPUlRfRFJJVkVOX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBFZmZvcnQgRHJpdmVuIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBlZmZvcnREcml2ZW5FU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNSZWN1cnJpbmcoKSA8ZW0+UmVjdXJyaW5nPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1JlY3VycmluZygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIFJFQ1VSUklOR19FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNSZWN1cnJpbmcoKSA8ZW0+UmVjdXJyaW5nPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1JlY3VycmluZygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gcmVjdXJyaW5nID0gUkVDVVJSSU5HX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBSZWN1cnJpbmcgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHJlY3VycmluZ0VTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc092ZXJBbGxvY2F0ZWQoKSA8ZW0+T3ZlciBBbGxvY2F0ZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzT3ZlckFsbG9jYXRlZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIE9WRVJfQUxMT0NBVEVEX0VERUZBVUxUID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc092ZXJBbGxvY2F0ZWQoKSA8ZW0+T3ZlciBBbGxvY2F0ZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzT3ZlckFsbG9jYXRlZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gb3ZlckFsbG9jYXRlZCA9IE9WRVJfQUxMT0NBVEVEX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBPdmVyIEFsbG9jYXRlZCBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gb3ZlckFsbG9jYXRlZEVTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0VzdGltYXRlZCgpIDxlbT5Fc3RpbWF0ZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzRXN0aW1hdGVkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gRVNUSU1BVEVEX0VERUZBVUxUID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0VzdGltYXRlZCgpIDxlbT5Fc3RpbWF0ZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzRXN0aW1hdGVkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBlc3RpbWF0ZWQgPSBFU1RJTUFURURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIEVzdGltYXRlZCBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gZXN0aW1hdGVkRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzTWlsZXN0b25lKCkgPGVtPk1pbGVzdG9uZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNNaWxlc3RvbmUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBNSUxFU1RPTkVfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzTWlsZXN0b25lKCkgPGVtPk1pbGVzdG9uZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNNaWxlc3RvbmUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIG1pbGVzdG9uZSA9IE1JTEVTVE9ORV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgTWlsZXN0b25lIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBtaWxlc3RvbmVFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNTdW1tYXJ5KCkgPGVtPlN1bW1hcnk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU3VtbWFyeSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIFNVTU1BUllfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzU3VtbWFyeSgpIDxlbT5TdW1tYXJ5PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1N1bW1hcnkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHN1bW1hcnkgPSBTVU1NQVJZX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBTdW1tYXJ5IGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBzdW1tYXJ5RVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzQ3JpdGljYWwoKSA8ZW0+Q3JpdGljYWw8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzQ3JpdGljYWwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBDUklUSUNBTF9FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNDcml0aWNhbCgpIDxlbT5Dcml0aWNhbDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNDcml0aWNhbCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gY3JpdGljYWwgPSBDUklUSUNBTF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgQ3JpdGljYWwgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGNyaXRpY2FsRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzSXNTdWJwcm9qZWN0KCkgPGVtPklzIFN1YnByb2plY3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzSXNTdWJwcm9qZWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gSVNfU1VCUFJPSkVDVF9FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNJc1N1YnByb2plY3QoKSA8ZW0+SXMgU3VicHJvamVjdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNJc1N1YnByb2plY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzU3VicHJvamVjdCA9IElTX1NVQlBST0pFQ1RfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIElzIFN1YnByb2plY3QgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzU3VicHJvamVjdEVTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0lzU3VicHJvamVjdFJlYWRPbmx5KCkgPGVtPklzIFN1YnByb2plY3QgUmVhZCBPbmx5PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0lzU3VicHJvamVjdFJlYWRPbmx5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gSVNfU1VCUFJPSkVDVF9SRUFEX09OTFlfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzSXNTdWJwcm9qZWN0UmVhZE9ubHkoKSA8ZW0+SXMgU3VicHJvamVjdCBSZWFkIE9ubHk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzSXNTdWJwcm9qZWN0UmVhZE9ubHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzU3VicHJvamVjdFJlYWRPbmx5ID0gSVNfU1VCUFJPSkVDVF9SRUFEX09OTFlfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIElzIFN1YnByb2plY3QgUmVhZCBPbmx5IGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1N1YnByb2plY3RSZWFkT25seUVTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTdWJwcm9qZWN0TmFtZSgpIDxlbT5TdWJwcm9qZWN0IE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFN1YnByb2plY3ROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBTVUJQUk9KRUNUX05BTUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U3VicHJvamVjdE5hbWUoKSA8ZW0+U3VicHJvamVjdCBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTdWJwcm9qZWN0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBzdWJwcm9qZWN0TmFtZSA9IFNVQlBST0pFQ1RfTkFNRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0V4dGVybmFsVGFzaygpIDxlbT5FeHRlcm5hbCBUYXNrPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0V4dGVybmFsVGFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIEVYVEVSTkFMX1RBU0tfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzRXh0ZXJuYWxUYXNrKCkgPGVtPkV4dGVybmFsIFRhc2s8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzRXh0ZXJuYWxUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBleHRlcm5hbFRhc2sgPSBFWFRFUk5BTF9UQVNLX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBFeHRlcm5hbCBUYXNrIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBleHRlcm5hbFRhc2tFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RXh0ZXJuYWxUYXNrUHJvamVjdCgpIDxlbT5FeHRlcm5hbCBUYXNrIFByb2plY3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEV4dGVybmFsVGFza1Byb2plY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVEVSTkFMX1RBU0tfUFJPSkVDVF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFeHRlcm5hbFRhc2tQcm9qZWN0KCkgPGVtPkV4dGVybmFsIFRhc2sgUHJvamVjdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RXh0ZXJuYWxUYXNrUHJvamVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBleHRlcm5hbFRhc2tQcm9qZWN0ID0gRVhURVJOQUxfVEFTS19QUk9KRUNUX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEVhcmx5U3RhcnQoKSA8ZW0+RWFybHkgU3RhcnQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEVhcmx5U3RhcnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgT2JqZWN0IEVBUkxZX1NUQVJUX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEVhcmx5U3RhcnQoKSA8ZW0+RWFybHkgU3RhcnQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEVhcmx5U3RhcnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZWFybHlTdGFydCA9IEVBUkxZX1NUQVJUX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEVhcmx5RmluaXNoKCkgPGVtPkVhcmx5IEZpbmlzaDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RWFybHlGaW5pc2goKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgT2JqZWN0IEVBUkxZX0ZJTklTSF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFYXJseUZpbmlzaCgpIDxlbT5FYXJseSBGaW5pc2g8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEVhcmx5RmluaXNoKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGVhcmx5RmluaXNoID0gRUFSTFlfRklOSVNIX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldExhdGVTdGFydCgpIDxlbT5MYXRlIFN0YXJ0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRMYXRlU3RhcnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgT2JqZWN0IExBVEVfU1RBUlRfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TGF0ZVN0YXJ0KCkgPGVtPkxhdGUgU3RhcnQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldExhdGVTdGFydCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBsYXRlU3RhcnQgPSBMQVRFX1NUQVJUX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldExhdGVGaW5pc2goKSA8ZW0+TGF0ZSBGaW5pc2g8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldExhdGVGaW5pc2goKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgT2JqZWN0IExBVEVfRklOSVNIX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldExhdGVGaW5pc2goKSA8ZW0+TGF0ZSBGaW5pc2g8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldExhdGVGaW5pc2goKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgbGF0ZUZpbmlzaCA9IExBVEVfRklOSVNIX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFN0YXJ0VmFyaWFuY2UoKSA8ZW0+U3RhcnQgVmFyaWFuY2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFN0YXJ0VmFyaWFuY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBTVEFSVF9WQVJJQU5DRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTdGFydFZhcmlhbmNlKCkgPGVtPlN0YXJ0IFZhcmlhbmNlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTdGFydFZhcmlhbmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnSW50ZWdlciBzdGFydFZhcmlhbmNlID0gU1RBUlRfVkFSSUFOQ0VfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RmluaXNoVmFyaWFuY2UoKSA8ZW0+RmluaXNoIFZhcmlhbmNlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRGaW5pc2hWYXJpYW5jZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdJbnRlZ2VyIEZJTklTSF9WQVJJQU5DRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRGaW5pc2hWYXJpYW5jZSgpIDxlbT5GaW5pc2ggVmFyaWFuY2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEZpbmlzaFZhcmlhbmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnSW50ZWdlciBmaW5pc2hWYXJpYW5jZSA9IEZJTklTSF9WQVJJQU5DRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRXb3JrVmFyaWFuY2UoKSA8ZW0+V29yayBWYXJpYW5jZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0V29ya1ZhcmlhbmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGZsb2F0IFdPUktfVkFSSUFOQ0VfRURFRkFVTFQgPSAwLjBGOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0V29ya1ZhcmlhbmNlKCkgPGVtPldvcmsgVmFyaWFuY2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFdvcmtWYXJpYW5jZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGZsb2F0IHdvcmtWYXJpYW5jZSA9IFdPUktfVkFSSUFOQ0VfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIFdvcmsgVmFyaWFuY2UgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHdvcmtWYXJpYW5jZUVTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRGcmVlU2xhY2soKSA8ZW0+RnJlZSBTbGFjazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RnJlZVNsYWNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0ludGVnZXIgRlJFRV9TTEFDS19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRGcmVlU2xhY2soKSA8ZW0+RnJlZSBTbGFjazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RnJlZVNsYWNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnSW50ZWdlciBmcmVlU2xhY2sgPSBGUkVFX1NMQUNLX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFRvdGFsU2xhY2soKSA8ZW0+VG90YWwgU2xhY2s8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFRvdGFsU2xhY2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBUT1RBTF9TTEFDS19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUb3RhbFNsYWNrKCkgPGVtPlRvdGFsIFNsYWNrPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUb3RhbFNsYWNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnSW50ZWdlciB0b3RhbFNsYWNrID0gVE9UQUxfU0xBQ0tfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Rml4ZWRDb3N0KCkgPGVtPkZpeGVkIENvc3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEZpeGVkQ29zdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBmbG9hdCBGSVhFRF9DT1NUX0VERUZBVUxUID0gMC4wRjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEZpeGVkQ29zdCgpIDxlbT5GaXhlZCBDb3N0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRGaXhlZENvc3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBmbG9hdCBmaXhlZENvc3QgPSBGSVhFRF9DT1NUX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBGaXhlZCBDb3N0IGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBmaXhlZENvc3RFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Rml4ZWRDb3N0QWNjcnVhbCgpIDxlbT5GaXhlZCBDb3N0IEFjY3J1YWw8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEZpeGVkQ29zdEFjY3J1YWwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEZJWEVEX0NPU1RfQUNDUlVBTF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRGaXhlZENvc3RBY2NydWFsKCkgPGVtPkZpeGVkIENvc3QgQWNjcnVhbDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Rml4ZWRDb3N0QWNjcnVhbCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBmaXhlZENvc3RBY2NydWFsID0gRklYRURfQ09TVF9BQ0NSVUFMX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBlcmNlbnRDb21wbGV0ZSgpIDxlbT5QZXJjZW50IENvbXBsZXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQZXJjZW50Q29tcGxldGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBQRVJDRU5UX0NPTVBMRVRFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBlcmNlbnRDb21wbGV0ZSgpIDxlbT5QZXJjZW50IENvbXBsZXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQZXJjZW50Q29tcGxldGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdJbnRlZ2VyIHBlcmNlbnRDb21wbGV0ZSA9IFBFUkNFTlRfQ09NUExFVEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UGVyY2VudFdvcmtDb21wbGV0ZSgpIDxlbT5QZXJjZW50IFdvcmsgQ29tcGxldGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFBlcmNlbnRXb3JrQ29tcGxldGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBQRVJDRU5UX1dPUktfQ09NUExFVEVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UGVyY2VudFdvcmtDb21wbGV0ZSgpIDxlbT5QZXJjZW50IFdvcmsgQ29tcGxldGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFBlcmNlbnRXb3JrQ29tcGxldGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdJbnRlZ2VyIHBlcmNlbnRXb3JrQ29tcGxldGUgPSBQRVJDRU5UX1dPUktfQ09NUExFVEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q29zdCgpIDxlbT5Db3N0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDb3N0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0RlY2ltYWwgQ09TVF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb3N0KCkgPGVtPkNvc3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENvc3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdEZWNpbWFsIGNvc3QgPSBDT1NUX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE92ZXJ0aW1lQ29zdCgpIDxlbT5PdmVydGltZSBDb3N0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRPdmVydGltZUNvc3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnRGVjaW1hbCBPVkVSVElNRV9DT1NUX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE92ZXJ0aW1lQ29zdCgpIDxlbT5PdmVydGltZSBDb3N0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRPdmVydGltZUNvc3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdEZWNpbWFsIG92ZXJ0aW1lQ29zdCA9IE9WRVJUSU1FX0NPU1RfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0T3ZlcnRpbWVXb3JrKCkgPGVtPk92ZXJ0aW1lIFdvcms8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE92ZXJ0aW1lV29yaygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBPYmplY3QgT1ZFUlRJTUVfV09SS19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRPdmVydGltZVdvcmsoKSA8ZW0+T3ZlcnRpbWUgV29yazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0T3ZlcnRpbWVXb3JrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IG92ZXJ0aW1lV29yayA9IE9WRVJUSU1FX1dPUktfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QWN0dWFsU3RhcnQoKSA8ZW0+QWN0dWFsIFN0YXJ0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBY3R1YWxTdGFydCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBPYmplY3QgQUNUVUFMX1NUQVJUX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFjdHVhbFN0YXJ0KCkgPGVtPkFjdHVhbCBTdGFydDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QWN0dWFsU3RhcnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgYWN0dWFsU3RhcnQgPSBBQ1RVQUxfU1RBUlRfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QWN0dWFsRmluaXNoKCkgPGVtPkFjdHVhbCBGaW5pc2g8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFjdHVhbEZpbmlzaCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBPYmplY3QgQUNUVUFMX0ZJTklTSF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBY3R1YWxGaW5pc2goKSA8ZW0+QWN0dWFsIEZpbmlzaDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QWN0dWFsRmluaXNoKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGFjdHVhbEZpbmlzaCA9IEFDVFVBTF9GSU5JU0hfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QWN0dWFsRHVyYXRpb24oKSA8ZW0+QWN0dWFsIER1cmF0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBY3R1YWxEdXJhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBPYmplY3QgQUNUVUFMX0RVUkFUSU9OX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFjdHVhbER1cmF0aW9uKCkgPGVtPkFjdHVhbCBEdXJhdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QWN0dWFsRHVyYXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgYWN0dWFsRHVyYXRpb24gPSBBQ1RVQUxfRFVSQVRJT05fRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QWN0dWFsQ29zdCgpIDxlbT5BY3R1YWwgQ29zdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QWN0dWFsQ29zdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdEZWNpbWFsIEFDVFVBTF9DT1NUX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFjdHVhbENvc3QoKSA8ZW0+QWN0dWFsIENvc3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFjdHVhbENvc3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdEZWNpbWFsIGFjdHVhbENvc3QgPSBBQ1RVQUxfQ09TVF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBY3R1YWxPdmVydGltZUNvc3QoKSA8ZW0+QWN0dWFsIE92ZXJ0aW1lIENvc3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFjdHVhbE92ZXJ0aW1lQ29zdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdEZWNpbWFsIEFDVFVBTF9PVkVSVElNRV9DT1NUX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFjdHVhbE92ZXJ0aW1lQ29zdCgpIDxlbT5BY3R1YWwgT3ZlcnRpbWUgQ29zdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QWN0dWFsT3ZlcnRpbWVDb3N0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnRGVjaW1hbCBhY3R1YWxPdmVydGltZUNvc3QgPSBBQ1RVQUxfT1ZFUlRJTUVfQ09TVF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBY3R1YWxXb3JrKCkgPGVtPkFjdHVhbCBXb3JrPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBY3R1YWxXb3JrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIE9iamVjdCBBQ1RVQUxfV09SS19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBY3R1YWxXb3JrKCkgPGVtPkFjdHVhbCBXb3JrPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBY3R1YWxXb3JrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGFjdHVhbFdvcmsgPSBBQ1RVQUxfV09SS19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBY3R1YWxPdmVydGltZVdvcmsoKSA8ZW0+QWN0dWFsIE92ZXJ0aW1lIFdvcms8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFjdHVhbE92ZXJ0aW1lV29yaygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBPYmplY3QgQUNUVUFMX09WRVJUSU1FX1dPUktfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QWN0dWFsT3ZlcnRpbWVXb3JrKCkgPGVtPkFjdHVhbCBPdmVydGltZSBXb3JrPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBY3R1YWxPdmVydGltZVdvcmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgYWN0dWFsT3ZlcnRpbWVXb3JrID0gQUNUVUFMX09WRVJUSU1FX1dPUktfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVndWxhcldvcmsoKSA8ZW0+UmVndWxhciBXb3JrPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZWd1bGFyV29yaygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBPYmplY3QgUkVHVUxBUl9XT1JLX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlZ3VsYXJXb3JrKCkgPGVtPlJlZ3VsYXIgV29yazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmVndWxhcldvcmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgcmVndWxhcldvcmsgPSBSRUdVTEFSX1dPUktfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVtYWluaW5nRHVyYXRpb24oKSA8ZW0+UmVtYWluaW5nIER1cmF0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZW1haW5pbmdEdXJhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBPYmplY3QgUkVNQUlOSU5HX0RVUkFUSU9OX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlbWFpbmluZ0R1cmF0aW9uKCkgPGVtPlJlbWFpbmluZyBEdXJhdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmVtYWluaW5nRHVyYXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgcmVtYWluaW5nRHVyYXRpb24gPSBSRU1BSU5JTkdfRFVSQVRJT05fRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVtYWluaW5nQ29zdCgpIDxlbT5SZW1haW5pbmcgQ29zdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmVtYWluaW5nQ29zdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdEZWNpbWFsIFJFTUFJTklOR19DT1NUX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlbWFpbmluZ0Nvc3QoKSA8ZW0+UmVtYWluaW5nIENvc3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJlbWFpbmluZ0Nvc3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdEZWNpbWFsIHJlbWFpbmluZ0Nvc3QgPSBSRU1BSU5JTkdfQ09TVF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZW1haW5pbmdXb3JrKCkgPGVtPlJlbWFpbmluZyBXb3JrPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZW1haW5pbmdXb3JrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIE9iamVjdCBSRU1BSU5JTkdfV09SS19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZW1haW5pbmdXb3JrKCkgPGVtPlJlbWFpbmluZyBXb3JrPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZW1haW5pbmdXb3JrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IHJlbWFpbmluZ1dvcmsgPSBSRU1BSU5JTkdfV09SS19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZW1haW5pbmdPdmVydGltZUNvc3QoKSA8ZW0+UmVtYWluaW5nIE92ZXJ0aW1lIENvc3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJlbWFpbmluZ092ZXJ0aW1lQ29zdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdEZWNpbWFsIFJFTUFJTklOR19PVkVSVElNRV9DT1NUX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlbWFpbmluZ092ZXJ0aW1lQ29zdCgpIDxlbT5SZW1haW5pbmcgT3ZlcnRpbWUgQ29zdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmVtYWluaW5nT3ZlcnRpbWVDb3N0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnRGVjaW1hbCByZW1haW5pbmdPdmVydGltZUNvc3QgPSBSRU1BSU5JTkdfT1ZFUlRJTUVfQ09TVF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZW1haW5pbmdPdmVydGltZVdvcmsoKSA8ZW0+UmVtYWluaW5nIE92ZXJ0aW1lIFdvcms8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJlbWFpbmluZ092ZXJ0aW1lV29yaygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBPYmplY3QgUkVNQUlOSU5HX09WRVJUSU1FX1dPUktfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVtYWluaW5nT3ZlcnRpbWVXb3JrKCkgPGVtPlJlbWFpbmluZyBPdmVydGltZSBXb3JrPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZW1haW5pbmdPdmVydGltZVdvcmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgcmVtYWluaW5nT3ZlcnRpbWVXb3JrID0gUkVNQUlOSU5HX09WRVJUSU1FX1dPUktfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QUNXUCgpIDxlbT5BQ1dQPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBQ1dQKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGZsb2F0IEFDV1BfRURFRkFVTFQgPSAwLjBGOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QUNXUCgpIDxlbT5BQ1dQPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBQ1dQKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgZmxvYXQgYUNXUCA9IEFDV1BfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIEFDV1AgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGFDV1BFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q1YoKSA8ZW0+Q1Y8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENWKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGZsb2F0IENWX0VERUZBVUxUID0gMC4wRjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENWKCkgPGVtPkNWPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDVigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGZsb2F0IGNWID0gQ1ZfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIENWIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBjVkVTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb25zdHJhaW50VHlwZSgpIDxlbT5Db25zdHJhaW50IFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENvbnN0cmFpbnRUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0ludGVnZXIgQ09OU1RSQUlOVF9UWVBFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENvbnN0cmFpbnRUeXBlKCkgPGVtPkNvbnN0cmFpbnQgVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q29uc3RyYWludFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdJbnRlZ2VyIGNvbnN0cmFpbnRUeXBlID0gQ09OU1RSQUlOVF9UWVBFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENhbGVuZGFyVUlEKCkgPGVtPkNhbGVuZGFyIFVJRDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q2FsZW5kYXJVSUQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBDQUxFTkRBUl9VSURfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q2FsZW5kYXJVSUQoKSA8ZW0+Q2FsZW5kYXIgVUlEPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDYWxlbmRhclVJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0ludGVnZXIgY2FsZW5kYXJVSUQgPSBDQUxFTkRBUl9VSURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q29uc3RyYWludERhdGUoKSA8ZW0+Q29uc3RyYWludCBEYXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDb25zdHJhaW50RGF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBPYmplY3QgQ09OU1RSQUlOVF9EQVRFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENvbnN0cmFpbnREYXRlKCkgPGVtPkNvbnN0cmFpbnQgRGF0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q29uc3RyYWludERhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgY29uc3RyYWludERhdGUgPSBDT05TVFJBSU5UX0RBVEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVhZGxpbmUoKSA8ZW0+RGVhZGxpbmU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERlYWRsaW5lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIE9iamVjdCBERUFETElORV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZWFkbGluZSgpIDxlbT5EZWFkbGluZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGVhZGxpbmUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZGVhZGxpbmUgPSBERUFETElORV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0xldmVsQXNzaWdubWVudHMoKSA8ZW0+TGV2ZWwgQXNzaWdubWVudHM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzTGV2ZWxBc3NpZ25tZW50cygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIExFVkVMX0FTU0lHTk1FTlRTX0VERUZBVUxUID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0xldmVsQXNzaWdubWVudHMoKSA8ZW0+TGV2ZWwgQXNzaWdubWVudHM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzTGV2ZWxBc3NpZ25tZW50cygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gbGV2ZWxBc3NpZ25tZW50cyA9IExFVkVMX0FTU0lHTk1FTlRTX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBMZXZlbCBBc3NpZ25tZW50cyBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gbGV2ZWxBc3NpZ25tZW50c0VTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0xldmVsaW5nQ2FuU3BsaXQoKSA8ZW0+TGV2ZWxpbmcgQ2FuIFNwbGl0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0xldmVsaW5nQ2FuU3BsaXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBMRVZFTElOR19DQU5fU1BMSVRfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzTGV2ZWxpbmdDYW5TcGxpdCgpIDxlbT5MZXZlbGluZyBDYW4gU3BsaXQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzTGV2ZWxpbmdDYW5TcGxpdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gbGV2ZWxpbmdDYW5TcGxpdCA9IExFVkVMSU5HX0NBTl9TUExJVF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgTGV2ZWxpbmcgQ2FuIFNwbGl0IGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBsZXZlbGluZ0NhblNwbGl0RVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldExldmVsaW5nRGVsYXkoKSA8ZW0+TGV2ZWxpbmcgRGVsYXk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldExldmVsaW5nRGVsYXkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBMRVZFTElOR19ERUxBWV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRMZXZlbGluZ0RlbGF5KCkgPGVtPkxldmVsaW5nIERlbGF5PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRMZXZlbGluZ0RlbGF5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnSW50ZWdlciBsZXZlbGluZ0RlbGF5ID0gTEVWRUxJTkdfREVMQVlfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TGV2ZWxpbmdEZWxheUZvcm1hdCgpIDxlbT5MZXZlbGluZyBEZWxheSBGb3JtYXQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldExldmVsaW5nRGVsYXlGb3JtYXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBMRVZFTElOR19ERUxBWV9GT1JNQVRfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TGV2ZWxpbmdEZWxheUZvcm1hdCgpIDxlbT5MZXZlbGluZyBEZWxheSBGb3JtYXQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldExldmVsaW5nRGVsYXlGb3JtYXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdJbnRlZ2VyIGxldmVsaW5nRGVsYXlGb3JtYXQgPSBMRVZFTElOR19ERUxBWV9GT1JNQVRfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJlTGV2ZWxlZFN0YXJ0KCkgPGVtPlByZSBMZXZlbGVkIFN0YXJ0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQcmVMZXZlbGVkU3RhcnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgT2JqZWN0IFBSRV9MRVZFTEVEX1NUQVJUX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByZUxldmVsZWRTdGFydCgpIDxlbT5QcmUgTGV2ZWxlZCBTdGFydDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UHJlTGV2ZWxlZFN0YXJ0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IHByZUxldmVsZWRTdGFydCA9IFBSRV9MRVZFTEVEX1NUQVJUX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByZUxldmVsZWRGaW5pc2goKSA8ZW0+UHJlIExldmVsZWQgRmluaXNoPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQcmVMZXZlbGVkRmluaXNoKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIE9iamVjdCBQUkVfTEVWRUxFRF9GSU5JU0hfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJlTGV2ZWxlZEZpbmlzaCgpIDxlbT5QcmUgTGV2ZWxlZCBGaW5pc2g8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFByZUxldmVsZWRGaW5pc2goKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgcHJlTGV2ZWxlZEZpbmlzaCA9IFBSRV9MRVZFTEVEX0ZJTklTSF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRIeXBlcmxpbmsoKSA8ZW0+SHlwZXJsaW5rPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRIeXBlcmxpbmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEhZUEVSTElOS19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRIeXBlcmxpbmsoKSA8ZW0+SHlwZXJsaW5rPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRIeXBlcmxpbmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgaHlwZXJsaW5rID0gSFlQRVJMSU5LX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEh5cGVybGlua0FkZHJlc3MoKSA8ZW0+SHlwZXJsaW5rIEFkZHJlc3M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEh5cGVybGlua0FkZHJlc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEhZUEVSTElOS19BRERSRVNTX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEh5cGVybGlua0FkZHJlc3MoKSA8ZW0+SHlwZXJsaW5rIEFkZHJlc3M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEh5cGVybGlua0FkZHJlc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgaHlwZXJsaW5rQWRkcmVzcyA9IEhZUEVSTElOS19BRERSRVNTX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEh5cGVybGlua1N1YkFkZHJlc3MoKSA8ZW0+SHlwZXJsaW5rIFN1YiBBZGRyZXNzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRIeXBlcmxpbmtTdWJBZGRyZXNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBIWVBFUkxJTktfU1VCX0FERFJFU1NfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SHlwZXJsaW5rU3ViQWRkcmVzcygpIDxlbT5IeXBlcmxpbmsgU3ViIEFkZHJlc3M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEh5cGVybGlua1N1YkFkZHJlc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgaHlwZXJsaW5rU3ViQWRkcmVzcyA9IEhZUEVSTElOS19TVUJfQUREUkVTU19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0lnbm9yZVJlc291cmNlQ2FsZW5kYXIoKSA8ZW0+SWdub3JlIFJlc291cmNlIENhbGVuZGFyPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0lnbm9yZVJlc291cmNlQ2FsZW5kYXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBJR05PUkVfUkVTT1VSQ0VfQ0FMRU5EQVJfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzSWdub3JlUmVzb3VyY2VDYWxlbmRhcigpIDxlbT5JZ25vcmUgUmVzb3VyY2UgQ2FsZW5kYXI8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzSWdub3JlUmVzb3VyY2VDYWxlbmRhcigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaWdub3JlUmVzb3VyY2VDYWxlbmRhciA9IElHTk9SRV9SRVNPVVJDRV9DQUxFTkRBUl9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgSWdub3JlIFJlc291cmNlIENhbGVuZGFyIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpZ25vcmVSZXNvdXJjZUNhbGVuZGFyRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5vdGVzKCkgPGVtPk5vdGVzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROb3RlcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9URVNfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Tm90ZXMoKSA8ZW0+Tm90ZXM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE5vdGVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIG5vdGVzID0gTk9URVNfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNIaWRlQmFyKCkgPGVtPkhpZGUgQmFyPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0hpZGVCYXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBISURFX0JBUl9FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNIaWRlQmFyKCkgPGVtPkhpZGUgQmFyPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0hpZGVCYXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGhpZGVCYXIgPSBISURFX0JBUl9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgSGlkZSBCYXIgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGhpZGVCYXJFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNSb2xsdXAoKSA8ZW0+Um9sbHVwPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1JvbGx1cCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIFJPTExVUF9FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNSb2xsdXAoKSA8ZW0+Um9sbHVwPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1JvbGx1cCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gcm9sbHVwID0gUk9MTFVQX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBSb2xsdXAgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHJvbGx1cEVTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRCQ1dTKCkgPGVtPkJDV1M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEJDV1MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgZmxvYXQgQkNXU19FREVGQVVMVCA9IDAuMEY7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRCQ1dTKCkgPGVtPkJDV1M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEJDV1MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBmbG9hdCBiQ1dTID0gQkNXU19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgQkNXUyBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gYkNXU0VTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRCQ1dQKCkgPGVtPkJDV1A8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEJDV1AoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgZmxvYXQgQkNXUF9FREVGQVVMVCA9IDAuMEY7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRCQ1dQKCkgPGVtPkJDV1A8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEJDV1AoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBmbG9hdCBiQ1dQID0gQkNXUF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgQkNXUCBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gYkNXUEVTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQaHlzaWNhbFBlcmNlbnRDb21wbGV0ZSgpIDxlbT5QaHlzaWNhbCBQZXJjZW50IENvbXBsZXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQaHlzaWNhbFBlcmNlbnRDb21wbGV0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdJbnRlZ2VyIFBIWVNJQ0FMX1BFUkNFTlRfQ09NUExFVEVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UGh5c2ljYWxQZXJjZW50Q29tcGxldGUoKSA8ZW0+UGh5c2ljYWwgUGVyY2VudCBDb21wbGV0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UGh5c2ljYWxQZXJjZW50Q29tcGxldGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdJbnRlZ2VyIHBoeXNpY2FsUGVyY2VudENvbXBsZXRlID0gUEhZU0lDQUxfUEVSQ0VOVF9DT01QTEVURV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFYXJuZWRWYWx1ZU1ldGhvZCgpIDxlbT5FYXJuZWQgVmFsdWUgTWV0aG9kPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRFYXJuZWRWYWx1ZU1ldGhvZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdJbnRlZ2VyIEVBUk5FRF9WQUxVRV9NRVRIT0RfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RWFybmVkVmFsdWVNZXRob2QoKSA8ZW0+RWFybmVkIFZhbHVlIE1ldGhvZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RWFybmVkVmFsdWVNZXRob2QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdJbnRlZ2VyIGVhcm5lZFZhbHVlTWV0aG9kID0gRUFSTkVEX1ZBTFVFX01FVEhPRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByZWRlY2Vzc29yTGluaygpIDxlbT5QcmVkZWNlc3NvciBMaW5rPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFByZWRlY2Vzc29yTGluaygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IHByZWRlY2Vzc29yTGluayA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QWN0dWFsV29ya1Byb3RlY3RlZCgpIDxlbT5BY3R1YWwgV29yayBQcm90ZWN0ZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFjdHVhbFdvcmtQcm90ZWN0ZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgT2JqZWN0IEFDVFVBTF9XT1JLX1BST1RFQ1RFRF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBY3R1YWxXb3JrUHJvdGVjdGVkKCkgPGVtPkFjdHVhbCBXb3JrIFByb3RlY3RlZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QWN0dWFsV29ya1Byb3RlY3RlZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBhY3R1YWxXb3JrUHJvdGVjdGVkID0gQUNUVUFMX1dPUktfUFJPVEVDVEVEX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZCgpIDxlbT5BY3R1YWwgT3ZlcnRpbWUgV29yayBQcm90ZWN0ZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBPYmplY3QgQUNUVUFMX09WRVJUSU1FX1dPUktfUFJPVEVDVEVEX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZCgpIDxlbT5BY3R1YWwgT3ZlcnRpbWUgV29yayBQcm90ZWN0ZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBhY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQgPSBBQ1RVQUxfT1ZFUlRJTUVfV09SS19QUk9URUNURURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFeHRlbmRlZEF0dHJpYnV0ZSgpIDxlbT5FeHRlbmRlZCBBdHRyaWJ1dGU8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBleHRlbmRlZEF0dHJpYnV0ZSA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRCYXNlbGluZSgpIDxlbT5CYXNlbGluZTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRCYXNlbGluZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGJhc2VsaW5lID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE91dGxpbmVDb2RlKCkgPGVtPk91dGxpbmUgQ29kZTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRPdXRsaW5lQ29kZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IG91dGxpbmVDb2RlID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFRpbWVwaGFzZWREYXRhKCkgPGVtPlRpbWVwaGFzZWQgRGF0YTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUaW1lcGhhc2VkRGF0YSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IHRpbWVwaGFzZWREYXRhID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBUYXNrSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2soKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBnZXRVSUQoKSB7Ci0JCXJldHVybiB1SUQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VUlEKEJpZ0ludGVnZXIgbmV3VUlEKSB7Ci0JCUJpZ0ludGVnZXIgb2xkVUlEID0gdUlEOwotCQl1SUQgPSBuZXdVSUQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fVUlELCBvbGRVSUQsIHVJRCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGdldElEKCkgewotCQlyZXR1cm4gaUQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SUQoQmlnSW50ZWdlciBuZXdJRCkgewotCQlCaWdJbnRlZ2VyIG9sZElEID0gaUQ7Ci0JCWlEID0gbmV3SUQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fSUQsIG9sZElELCBpRCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmV3TmFtZSkgewotCQlTdHJpbmcgb2xkTmFtZSA9IG5hbWU7Ci0JCW5hbWUgPSBuZXdOYW1lOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX05BTUUsIG9sZE5hbWUsIG5hbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBnZXRUeXBlKCkgewotCQlyZXR1cm4gdHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUeXBlKEJpZ0ludGVnZXIgbmV3VHlwZSkgewotCQlCaWdJbnRlZ2VyIG9sZFR5cGUgPSB0eXBlOwotCQl0eXBlID0gbmV3VHlwZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19UWVBFLCBvbGRUeXBlLCB0eXBlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNJc051bGwoKSB7Ci0JCXJldHVybiBpc051bGw7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SXNOdWxsKGJvb2xlYW4gbmV3SXNOdWxsKSB7Ci0JCWJvb2xlYW4gb2xkSXNOdWxsID0gaXNOdWxsOwotCQlpc051bGwgPSBuZXdJc051bGw7Ci0JCWJvb2xlYW4gb2xkSXNOdWxsRVNldCA9IGlzTnVsbEVTZXQ7Ci0JCWlzTnVsbEVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0lTX05VTEwsIG9sZElzTnVsbCwgaXNOdWxsLCAhb2xkSXNOdWxsRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0SXNOdWxsKCkgewotCQlib29sZWFuIG9sZElzTnVsbCA9IGlzTnVsbDsKLQkJYm9vbGVhbiBvbGRJc051bGxFU2V0ID0gaXNOdWxsRVNldDsKLQkJaXNOdWxsID0gSVNfTlVMTF9FREVGQVVMVDsKLQkJaXNOdWxsRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fSVNfTlVMTCwgb2xkSXNOdWxsLCBJU19OVUxMX0VERUZBVUxULCBvbGRJc051bGxFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRJc051bGwoKSB7Ci0JCXJldHVybiBpc051bGxFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0Q3JlYXRlRGF0ZSgpIHsKLQkJcmV0dXJuIGNyZWF0ZURhdGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q3JlYXRlRGF0ZShPYmplY3QgbmV3Q3JlYXRlRGF0ZSkgewotCQlPYmplY3Qgb2xkQ3JlYXRlRGF0ZSA9IGNyZWF0ZURhdGU7Ci0JCWNyZWF0ZURhdGUgPSBuZXdDcmVhdGVEYXRlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0NSRUFURV9EQVRFLCBvbGRDcmVhdGVEYXRlLCBjcmVhdGVEYXRlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDb250YWN0KCkgewotCQlyZXR1cm4gY29udGFjdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb250YWN0KFN0cmluZyBuZXdDb250YWN0KSB7Ci0JCVN0cmluZyBvbGRDb250YWN0ID0gY29udGFjdDsKLQkJY29udGFjdCA9IG5ld0NvbnRhY3Q7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQ09OVEFDVCwgb2xkQ29udGFjdCwgY29udGFjdCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0V0JTKCkgewotCQlyZXR1cm4gd0JTOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFdCUyhTdHJpbmcgbmV3V0JTKSB7Ci0JCVN0cmluZyBvbGRXQlMgPSB3QlM7Ci0JCXdCUyA9IG5ld1dCUzsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19XQlMsIG9sZFdCUywgd0JTKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRXQlNMZXZlbCgpIHsKLQkJcmV0dXJuIHdCU0xldmVsOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFdCU0xldmVsKFN0cmluZyBuZXdXQlNMZXZlbCkgewotCQlTdHJpbmcgb2xkV0JTTGV2ZWwgPSB3QlNMZXZlbDsKLQkJd0JTTGV2ZWwgPSBuZXdXQlNMZXZlbDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19XQlNfTEVWRUwsIG9sZFdCU0xldmVsLCB3QlNMZXZlbCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0T3V0bGluZU51bWJlcigpIHsKLQkJcmV0dXJuIG91dGxpbmVOdW1iZXI7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0T3V0bGluZU51bWJlcihTdHJpbmcgbmV3T3V0bGluZU51bWJlcikgewotCQlTdHJpbmcgb2xkT3V0bGluZU51bWJlciA9IG91dGxpbmVOdW1iZXI7Ci0JCW91dGxpbmVOdW1iZXIgPSBuZXdPdXRsaW5lTnVtYmVyOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX09VVExJTkVfTlVNQkVSLCBvbGRPdXRsaW5lTnVtYmVyLCBvdXRsaW5lTnVtYmVyKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0T3V0bGluZUxldmVsKCkgewotCQlyZXR1cm4gb3V0bGluZUxldmVsOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE91dGxpbmVMZXZlbChCaWdJbnRlZ2VyIG5ld091dGxpbmVMZXZlbCkgewotCQlCaWdJbnRlZ2VyIG9sZE91dGxpbmVMZXZlbCA9IG91dGxpbmVMZXZlbDsKLQkJb3V0bGluZUxldmVsID0gbmV3T3V0bGluZUxldmVsOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX09VVExJTkVfTEVWRUwsIG9sZE91dGxpbmVMZXZlbCwgb3V0bGluZUxldmVsKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0UHJpb3JpdHkoKSB7Ci0JCXJldHVybiBwcmlvcml0eTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQcmlvcml0eShCaWdJbnRlZ2VyIG5ld1ByaW9yaXR5KSB7Ci0JCUJpZ0ludGVnZXIgb2xkUHJpb3JpdHkgPSBwcmlvcml0eTsKLQkJcHJpb3JpdHkgPSBuZXdQcmlvcml0eTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19QUklPUklUWSwgb2xkUHJpb3JpdHksIHByaW9yaXR5KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRTdGFydCgpIHsKLQkJcmV0dXJuIHN0YXJ0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFN0YXJ0KE9iamVjdCBuZXdTdGFydCkgewotCQlPYmplY3Qgb2xkU3RhcnQgPSBzdGFydDsKLQkJc3RhcnQgPSBuZXdTdGFydDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19TVEFSVCwgb2xkU3RhcnQsIHN0YXJ0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRGaW5pc2goKSB7Ci0JCXJldHVybiBmaW5pc2g7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RmluaXNoKE9iamVjdCBuZXdGaW5pc2gpIHsKLQkJT2JqZWN0IG9sZEZpbmlzaCA9IGZpbmlzaDsKLQkJZmluaXNoID0gbmV3RmluaXNoOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0ZJTklTSCwgb2xkRmluaXNoLCBmaW5pc2gpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldER1cmF0aW9uKCkgewotCQlyZXR1cm4gZHVyYXRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RHVyYXRpb24oT2JqZWN0IG5ld0R1cmF0aW9uKSB7Ci0JCU9iamVjdCBvbGREdXJhdGlvbiA9IGR1cmF0aW9uOwotCQlkdXJhdGlvbiA9IG5ld0R1cmF0aW9uOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0RVUkFUSU9OLCBvbGREdXJhdGlvbiwgZHVyYXRpb24pKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBnZXREdXJhdGlvbkZvcm1hdCgpIHsKLQkJcmV0dXJuIGR1cmF0aW9uRm9ybWF0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldER1cmF0aW9uRm9ybWF0KEJpZ0ludGVnZXIgbmV3RHVyYXRpb25Gb3JtYXQpIHsKLQkJQmlnSW50ZWdlciBvbGREdXJhdGlvbkZvcm1hdCA9IGR1cmF0aW9uRm9ybWF0OwotCQlkdXJhdGlvbkZvcm1hdCA9IG5ld0R1cmF0aW9uRm9ybWF0OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0RVUkFUSU9OX0ZPUk1BVCwgb2xkRHVyYXRpb25Gb3JtYXQsIGR1cmF0aW9uRm9ybWF0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRXb3JrKCkgewotCQlyZXR1cm4gd29yazsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRXb3JrKE9iamVjdCBuZXdXb3JrKSB7Ci0JCU9iamVjdCBvbGRXb3JrID0gd29yazsKLQkJd29yayA9IG5ld1dvcms7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fV09SSywgb2xkV29yaywgd29yaykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0U3RvcCgpIHsKLQkJcmV0dXJuIHN0b3A7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0U3RvcChPYmplY3QgbmV3U3RvcCkgewotCQlPYmplY3Qgb2xkU3RvcCA9IHN0b3A7Ci0JCXN0b3AgPSBuZXdTdG9wOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1NUT1AsIG9sZFN0b3AsIHN0b3ApKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFJlc3VtZSgpIHsKLQkJcmV0dXJuIHJlc3VtZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZXN1bWUoT2JqZWN0IG5ld1Jlc3VtZSkgewotCQlPYmplY3Qgb2xkUmVzdW1lID0gcmVzdW1lOwotCQlyZXN1bWUgPSBuZXdSZXN1bWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fUkVTVU1FLCBvbGRSZXN1bWUsIHJlc3VtZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUmVzdW1lVmFsaWQoKSB7Ci0JCXJldHVybiByZXN1bWVWYWxpZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZXN1bWVWYWxpZChib29sZWFuIG5ld1Jlc3VtZVZhbGlkKSB7Ci0JCWJvb2xlYW4gb2xkUmVzdW1lVmFsaWQgPSByZXN1bWVWYWxpZDsKLQkJcmVzdW1lVmFsaWQgPSBuZXdSZXN1bWVWYWxpZDsKLQkJYm9vbGVhbiBvbGRSZXN1bWVWYWxpZEVTZXQgPSByZXN1bWVWYWxpZEVTZXQ7Ci0JCXJlc3VtZVZhbGlkRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fUkVTVU1FX1ZBTElELCBvbGRSZXN1bWVWYWxpZCwgcmVzdW1lVmFsaWQsICFvbGRSZXN1bWVWYWxpZEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldFJlc3VtZVZhbGlkKCkgewotCQlib29sZWFuIG9sZFJlc3VtZVZhbGlkID0gcmVzdW1lVmFsaWQ7Ci0JCWJvb2xlYW4gb2xkUmVzdW1lVmFsaWRFU2V0ID0gcmVzdW1lVmFsaWRFU2V0OwotCQlyZXN1bWVWYWxpZCA9IFJFU1VNRV9WQUxJRF9FREVGQVVMVDsKLQkJcmVzdW1lVmFsaWRFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19SRVNVTUVfVkFMSUQsIG9sZFJlc3VtZVZhbGlkLCBSRVNVTUVfVkFMSURfRURFRkFVTFQsIG9sZFJlc3VtZVZhbGlkRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0UmVzdW1lVmFsaWQoKSB7Ci0JCXJldHVybiByZXN1bWVWYWxpZEVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNFZmZvcnREcml2ZW4oKSB7Ci0JCXJldHVybiBlZmZvcnREcml2ZW47Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RWZmb3J0RHJpdmVuKGJvb2xlYW4gbmV3RWZmb3J0RHJpdmVuKSB7Ci0JCWJvb2xlYW4gb2xkRWZmb3J0RHJpdmVuID0gZWZmb3J0RHJpdmVuOwotCQllZmZvcnREcml2ZW4gPSBuZXdFZmZvcnREcml2ZW47Ci0JCWJvb2xlYW4gb2xkRWZmb3J0RHJpdmVuRVNldCA9IGVmZm9ydERyaXZlbkVTZXQ7Ci0JCWVmZm9ydERyaXZlbkVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0VGRk9SVF9EUklWRU4sIG9sZEVmZm9ydERyaXZlbiwgZWZmb3J0RHJpdmVuLCAhb2xkRWZmb3J0RHJpdmVuRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0RWZmb3J0RHJpdmVuKCkgewotCQlib29sZWFuIG9sZEVmZm9ydERyaXZlbiA9IGVmZm9ydERyaXZlbjsKLQkJYm9vbGVhbiBvbGRFZmZvcnREcml2ZW5FU2V0ID0gZWZmb3J0RHJpdmVuRVNldDsKLQkJZWZmb3J0RHJpdmVuID0gRUZGT1JUX0RSSVZFTl9FREVGQVVMVDsKLQkJZWZmb3J0RHJpdmVuRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fRUZGT1JUX0RSSVZFTiwgb2xkRWZmb3J0RHJpdmVuLCBFRkZPUlRfRFJJVkVOX0VERUZBVUxULCBvbGRFZmZvcnREcml2ZW5FU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRFZmZvcnREcml2ZW4oKSB7Ci0JCXJldHVybiBlZmZvcnREcml2ZW5FU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUmVjdXJyaW5nKCkgewotCQlyZXR1cm4gcmVjdXJyaW5nOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlY3VycmluZyhib29sZWFuIG5ld1JlY3VycmluZykgewotCQlib29sZWFuIG9sZFJlY3VycmluZyA9IHJlY3VycmluZzsKLQkJcmVjdXJyaW5nID0gbmV3UmVjdXJyaW5nOwotCQlib29sZWFuIG9sZFJlY3VycmluZ0VTZXQgPSByZWN1cnJpbmdFU2V0OwotCQlyZWN1cnJpbmdFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19SRUNVUlJJTkcsIG9sZFJlY3VycmluZywgcmVjdXJyaW5nLCAhb2xkUmVjdXJyaW5nRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0UmVjdXJyaW5nKCkgewotCQlib29sZWFuIG9sZFJlY3VycmluZyA9IHJlY3VycmluZzsKLQkJYm9vbGVhbiBvbGRSZWN1cnJpbmdFU2V0ID0gcmVjdXJyaW5nRVNldDsKLQkJcmVjdXJyaW5nID0gUkVDVVJSSU5HX0VERUZBVUxUOwotCQlyZWN1cnJpbmdFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19SRUNVUlJJTkcsIG9sZFJlY3VycmluZywgUkVDVVJSSU5HX0VERUZBVUxULCBvbGRSZWN1cnJpbmdFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRSZWN1cnJpbmcoKSB7Ci0JCXJldHVybiByZWN1cnJpbmdFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzT3ZlckFsbG9jYXRlZCgpIHsKLQkJcmV0dXJuIG92ZXJBbGxvY2F0ZWQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0T3ZlckFsbG9jYXRlZChib29sZWFuIG5ld092ZXJBbGxvY2F0ZWQpIHsKLQkJYm9vbGVhbiBvbGRPdmVyQWxsb2NhdGVkID0gb3ZlckFsbG9jYXRlZDsKLQkJb3ZlckFsbG9jYXRlZCA9IG5ld092ZXJBbGxvY2F0ZWQ7Ci0JCWJvb2xlYW4gb2xkT3ZlckFsbG9jYXRlZEVTZXQgPSBvdmVyQWxsb2NhdGVkRVNldDsKLQkJb3ZlckFsbG9jYXRlZEVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX09WRVJfQUxMT0NBVEVELCBvbGRPdmVyQWxsb2NhdGVkLCBvdmVyQWxsb2NhdGVkLCAhb2xkT3ZlckFsbG9jYXRlZEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldE92ZXJBbGxvY2F0ZWQoKSB7Ci0JCWJvb2xlYW4gb2xkT3ZlckFsbG9jYXRlZCA9IG92ZXJBbGxvY2F0ZWQ7Ci0JCWJvb2xlYW4gb2xkT3ZlckFsbG9jYXRlZEVTZXQgPSBvdmVyQWxsb2NhdGVkRVNldDsKLQkJb3ZlckFsbG9jYXRlZCA9IE9WRVJfQUxMT0NBVEVEX0VERUZBVUxUOwotCQlvdmVyQWxsb2NhdGVkRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fT1ZFUl9BTExPQ0FURUQsIG9sZE92ZXJBbGxvY2F0ZWQsIE9WRVJfQUxMT0NBVEVEX0VERUZBVUxULCBvbGRPdmVyQWxsb2NhdGVkRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0T3ZlckFsbG9jYXRlZCgpIHsKLQkJcmV0dXJuIG92ZXJBbGxvY2F0ZWRFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRXN0aW1hdGVkKCkgewotCQlyZXR1cm4gZXN0aW1hdGVkOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVzdGltYXRlZChib29sZWFuIG5ld0VzdGltYXRlZCkgewotCQlib29sZWFuIG9sZEVzdGltYXRlZCA9IGVzdGltYXRlZDsKLQkJZXN0aW1hdGVkID0gbmV3RXN0aW1hdGVkOwotCQlib29sZWFuIG9sZEVzdGltYXRlZEVTZXQgPSBlc3RpbWF0ZWRFU2V0OwotCQllc3RpbWF0ZWRFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19FU1RJTUFURUQsIG9sZEVzdGltYXRlZCwgZXN0aW1hdGVkLCAhb2xkRXN0aW1hdGVkRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0RXN0aW1hdGVkKCkgewotCQlib29sZWFuIG9sZEVzdGltYXRlZCA9IGVzdGltYXRlZDsKLQkJYm9vbGVhbiBvbGRFc3RpbWF0ZWRFU2V0ID0gZXN0aW1hdGVkRVNldDsKLQkJZXN0aW1hdGVkID0gRVNUSU1BVEVEX0VERUZBVUxUOwotCQllc3RpbWF0ZWRFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19FU1RJTUFURUQsIG9sZEVzdGltYXRlZCwgRVNUSU1BVEVEX0VERUZBVUxULCBvbGRFc3RpbWF0ZWRFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRFc3RpbWF0ZWQoKSB7Ci0JCXJldHVybiBlc3RpbWF0ZWRFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzTWlsZXN0b25lKCkgewotCQlyZXR1cm4gbWlsZXN0b25lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1pbGVzdG9uZShib29sZWFuIG5ld01pbGVzdG9uZSkgewotCQlib29sZWFuIG9sZE1pbGVzdG9uZSA9IG1pbGVzdG9uZTsKLQkJbWlsZXN0b25lID0gbmV3TWlsZXN0b25lOwotCQlib29sZWFuIG9sZE1pbGVzdG9uZUVTZXQgPSBtaWxlc3RvbmVFU2V0OwotCQltaWxlc3RvbmVFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19NSUxFU1RPTkUsIG9sZE1pbGVzdG9uZSwgbWlsZXN0b25lLCAhb2xkTWlsZXN0b25lRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0TWlsZXN0b25lKCkgewotCQlib29sZWFuIG9sZE1pbGVzdG9uZSA9IG1pbGVzdG9uZTsKLQkJYm9vbGVhbiBvbGRNaWxlc3RvbmVFU2V0ID0gbWlsZXN0b25lRVNldDsKLQkJbWlsZXN0b25lID0gTUlMRVNUT05FX0VERUZBVUxUOwotCQltaWxlc3RvbmVFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19NSUxFU1RPTkUsIG9sZE1pbGVzdG9uZSwgTUlMRVNUT05FX0VERUZBVUxULCBvbGRNaWxlc3RvbmVFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRNaWxlc3RvbmUoKSB7Ci0JCXJldHVybiBtaWxlc3RvbmVFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU3VtbWFyeSgpIHsKLQkJcmV0dXJuIHN1bW1hcnk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0U3VtbWFyeShib29sZWFuIG5ld1N1bW1hcnkpIHsKLQkJYm9vbGVhbiBvbGRTdW1tYXJ5ID0gc3VtbWFyeTsKLQkJc3VtbWFyeSA9IG5ld1N1bW1hcnk7Ci0JCWJvb2xlYW4gb2xkU3VtbWFyeUVTZXQgPSBzdW1tYXJ5RVNldDsKLQkJc3VtbWFyeUVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1NVTU1BUlksIG9sZFN1bW1hcnksIHN1bW1hcnksICFvbGRTdW1tYXJ5RVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0U3VtbWFyeSgpIHsKLQkJYm9vbGVhbiBvbGRTdW1tYXJ5ID0gc3VtbWFyeTsKLQkJYm9vbGVhbiBvbGRTdW1tYXJ5RVNldCA9IHN1bW1hcnlFU2V0OwotCQlzdW1tYXJ5ID0gU1VNTUFSWV9FREVGQVVMVDsKLQkJc3VtbWFyeUVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1NVTU1BUlksIG9sZFN1bW1hcnksIFNVTU1BUllfRURFRkFVTFQsIG9sZFN1bW1hcnlFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRTdW1tYXJ5KCkgewotCQlyZXR1cm4gc3VtbWFyeUVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNDcml0aWNhbCgpIHsKLQkJcmV0dXJuIGNyaXRpY2FsOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENyaXRpY2FsKGJvb2xlYW4gbmV3Q3JpdGljYWwpIHsKLQkJYm9vbGVhbiBvbGRDcml0aWNhbCA9IGNyaXRpY2FsOwotCQljcml0aWNhbCA9IG5ld0NyaXRpY2FsOwotCQlib29sZWFuIG9sZENyaXRpY2FsRVNldCA9IGNyaXRpY2FsRVNldDsKLQkJY3JpdGljYWxFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19DUklUSUNBTCwgb2xkQ3JpdGljYWwsIGNyaXRpY2FsLCAhb2xkQ3JpdGljYWxFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRDcml0aWNhbCgpIHsKLQkJYm9vbGVhbiBvbGRDcml0aWNhbCA9IGNyaXRpY2FsOwotCQlib29sZWFuIG9sZENyaXRpY2FsRVNldCA9IGNyaXRpY2FsRVNldDsKLQkJY3JpdGljYWwgPSBDUklUSUNBTF9FREVGQVVMVDsKLQkJY3JpdGljYWxFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19DUklUSUNBTCwgb2xkQ3JpdGljYWwsIENSSVRJQ0FMX0VERUZBVUxULCBvbGRDcml0aWNhbEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldENyaXRpY2FsKCkgewotCQlyZXR1cm4gY3JpdGljYWxFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzSXNTdWJwcm9qZWN0KCkgewotCQlyZXR1cm4gaXNTdWJwcm9qZWN0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldElzU3VicHJvamVjdChib29sZWFuIG5ld0lzU3VicHJvamVjdCkgewotCQlib29sZWFuIG9sZElzU3VicHJvamVjdCA9IGlzU3VicHJvamVjdDsKLQkJaXNTdWJwcm9qZWN0ID0gbmV3SXNTdWJwcm9qZWN0OwotCQlib29sZWFuIG9sZElzU3VicHJvamVjdEVTZXQgPSBpc1N1YnByb2plY3RFU2V0OwotCQlpc1N1YnByb2plY3RFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19JU19TVUJQUk9KRUNULCBvbGRJc1N1YnByb2plY3QsIGlzU3VicHJvamVjdCwgIW9sZElzU3VicHJvamVjdEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldElzU3VicHJvamVjdCgpIHsKLQkJYm9vbGVhbiBvbGRJc1N1YnByb2plY3QgPSBpc1N1YnByb2plY3Q7Ci0JCWJvb2xlYW4gb2xkSXNTdWJwcm9qZWN0RVNldCA9IGlzU3VicHJvamVjdEVTZXQ7Ci0JCWlzU3VicHJvamVjdCA9IElTX1NVQlBST0pFQ1RfRURFRkFVTFQ7Ci0JCWlzU3VicHJvamVjdEVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0lTX1NVQlBST0pFQ1QsIG9sZElzU3VicHJvamVjdCwgSVNfU1VCUFJPSkVDVF9FREVGQVVMVCwgb2xkSXNTdWJwcm9qZWN0RVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0SXNTdWJwcm9qZWN0KCkgewotCQlyZXR1cm4gaXNTdWJwcm9qZWN0RVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0lzU3VicHJvamVjdFJlYWRPbmx5KCkgewotCQlyZXR1cm4gaXNTdWJwcm9qZWN0UmVhZE9ubHk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SXNTdWJwcm9qZWN0UmVhZE9ubHkoYm9vbGVhbiBuZXdJc1N1YnByb2plY3RSZWFkT25seSkgewotCQlib29sZWFuIG9sZElzU3VicHJvamVjdFJlYWRPbmx5ID0gaXNTdWJwcm9qZWN0UmVhZE9ubHk7Ci0JCWlzU3VicHJvamVjdFJlYWRPbmx5ID0gbmV3SXNTdWJwcm9qZWN0UmVhZE9ubHk7Ci0JCWJvb2xlYW4gb2xkSXNTdWJwcm9qZWN0UmVhZE9ubHlFU2V0ID0gaXNTdWJwcm9qZWN0UmVhZE9ubHlFU2V0OwotCQlpc1N1YnByb2plY3RSZWFkT25seUVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0lTX1NVQlBST0pFQ1RfUkVBRF9PTkxZLCBvbGRJc1N1YnByb2plY3RSZWFkT25seSwgaXNTdWJwcm9qZWN0UmVhZE9ubHksICFvbGRJc1N1YnByb2plY3RSZWFkT25seUVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldElzU3VicHJvamVjdFJlYWRPbmx5KCkgewotCQlib29sZWFuIG9sZElzU3VicHJvamVjdFJlYWRPbmx5ID0gaXNTdWJwcm9qZWN0UmVhZE9ubHk7Ci0JCWJvb2xlYW4gb2xkSXNTdWJwcm9qZWN0UmVhZE9ubHlFU2V0ID0gaXNTdWJwcm9qZWN0UmVhZE9ubHlFU2V0OwotCQlpc1N1YnByb2plY3RSZWFkT25seSA9IElTX1NVQlBST0pFQ1RfUkVBRF9PTkxZX0VERUZBVUxUOwotCQlpc1N1YnByb2plY3RSZWFkT25seUVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0lTX1NVQlBST0pFQ1RfUkVBRF9PTkxZLCBvbGRJc1N1YnByb2plY3RSZWFkT25seSwgSVNfU1VCUFJPSkVDVF9SRUFEX09OTFlfRURFRkFVTFQsIG9sZElzU3VicHJvamVjdFJlYWRPbmx5RVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0SXNTdWJwcm9qZWN0UmVhZE9ubHkoKSB7Ci0JCXJldHVybiBpc1N1YnByb2plY3RSZWFkT25seUVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTdWJwcm9qZWN0TmFtZSgpIHsKLQkJcmV0dXJuIHN1YnByb2plY3ROYW1lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFN1YnByb2plY3ROYW1lKFN0cmluZyBuZXdTdWJwcm9qZWN0TmFtZSkgewotCQlTdHJpbmcgb2xkU3VicHJvamVjdE5hbWUgPSBzdWJwcm9qZWN0TmFtZTsKLQkJc3VicHJvamVjdE5hbWUgPSBuZXdTdWJwcm9qZWN0TmFtZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19TVUJQUk9KRUNUX05BTUUsIG9sZFN1YnByb2plY3ROYW1lLCBzdWJwcm9qZWN0TmFtZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRXh0ZXJuYWxUYXNrKCkgewotCQlyZXR1cm4gZXh0ZXJuYWxUYXNrOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEV4dGVybmFsVGFzayhib29sZWFuIG5ld0V4dGVybmFsVGFzaykgewotCQlib29sZWFuIG9sZEV4dGVybmFsVGFzayA9IGV4dGVybmFsVGFzazsKLQkJZXh0ZXJuYWxUYXNrID0gbmV3RXh0ZXJuYWxUYXNrOwotCQlib29sZWFuIG9sZEV4dGVybmFsVGFza0VTZXQgPSBleHRlcm5hbFRhc2tFU2V0OwotCQlleHRlcm5hbFRhc2tFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19FWFRFUk5BTF9UQVNLLCBvbGRFeHRlcm5hbFRhc2ssIGV4dGVybmFsVGFzaywgIW9sZEV4dGVybmFsVGFza0VTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldEV4dGVybmFsVGFzaygpIHsKLQkJYm9vbGVhbiBvbGRFeHRlcm5hbFRhc2sgPSBleHRlcm5hbFRhc2s7Ci0JCWJvb2xlYW4gb2xkRXh0ZXJuYWxUYXNrRVNldCA9IGV4dGVybmFsVGFza0VTZXQ7Ci0JCWV4dGVybmFsVGFzayA9IEVYVEVSTkFMX1RBU0tfRURFRkFVTFQ7Ci0JCWV4dGVybmFsVGFza0VTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0VYVEVSTkFMX1RBU0ssIG9sZEV4dGVybmFsVGFzaywgRVhURVJOQUxfVEFTS19FREVGQVVMVCwgb2xkRXh0ZXJuYWxUYXNrRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0RXh0ZXJuYWxUYXNrKCkgewotCQlyZXR1cm4gZXh0ZXJuYWxUYXNrRVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEV4dGVybmFsVGFza1Byb2plY3QoKSB7Ci0JCXJldHVybiBleHRlcm5hbFRhc2tQcm9qZWN0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEV4dGVybmFsVGFza1Byb2plY3QoU3RyaW5nIG5ld0V4dGVybmFsVGFza1Byb2plY3QpIHsKLQkJU3RyaW5nIG9sZEV4dGVybmFsVGFza1Byb2plY3QgPSBleHRlcm5hbFRhc2tQcm9qZWN0OwotCQlleHRlcm5hbFRhc2tQcm9qZWN0ID0gbmV3RXh0ZXJuYWxUYXNrUHJvamVjdDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19FWFRFUk5BTF9UQVNLX1BST0pFQ1QsIG9sZEV4dGVybmFsVGFza1Byb2plY3QsIGV4dGVybmFsVGFza1Byb2plY3QpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEVhcmx5U3RhcnQoKSB7Ci0JCXJldHVybiBlYXJseVN0YXJ0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVhcmx5U3RhcnQoT2JqZWN0IG5ld0Vhcmx5U3RhcnQpIHsKLQkJT2JqZWN0IG9sZEVhcmx5U3RhcnQgPSBlYXJseVN0YXJ0OwotCQllYXJseVN0YXJ0ID0gbmV3RWFybHlTdGFydDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19FQVJMWV9TVEFSVCwgb2xkRWFybHlTdGFydCwgZWFybHlTdGFydCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0RWFybHlGaW5pc2goKSB7Ci0JCXJldHVybiBlYXJseUZpbmlzaDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFYXJseUZpbmlzaChPYmplY3QgbmV3RWFybHlGaW5pc2gpIHsKLQkJT2JqZWN0IG9sZEVhcmx5RmluaXNoID0gZWFybHlGaW5pc2g7Ci0JCWVhcmx5RmluaXNoID0gbmV3RWFybHlGaW5pc2g7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fRUFSTFlfRklOSVNILCBvbGRFYXJseUZpbmlzaCwgZWFybHlGaW5pc2gpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldExhdGVTdGFydCgpIHsKLQkJcmV0dXJuIGxhdGVTdGFydDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMYXRlU3RhcnQoT2JqZWN0IG5ld0xhdGVTdGFydCkgewotCQlPYmplY3Qgb2xkTGF0ZVN0YXJ0ID0gbGF0ZVN0YXJ0OwotCQlsYXRlU3RhcnQgPSBuZXdMYXRlU3RhcnQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fTEFURV9TVEFSVCwgb2xkTGF0ZVN0YXJ0LCBsYXRlU3RhcnQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldExhdGVGaW5pc2goKSB7Ci0JCXJldHVybiBsYXRlRmluaXNoOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExhdGVGaW5pc2goT2JqZWN0IG5ld0xhdGVGaW5pc2gpIHsKLQkJT2JqZWN0IG9sZExhdGVGaW5pc2ggPSBsYXRlRmluaXNoOwotCQlsYXRlRmluaXNoID0gbmV3TGF0ZUZpbmlzaDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19MQVRFX0ZJTklTSCwgb2xkTGF0ZUZpbmlzaCwgbGF0ZUZpbmlzaCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGdldFN0YXJ0VmFyaWFuY2UoKSB7Ci0JCXJldHVybiBzdGFydFZhcmlhbmNlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFN0YXJ0VmFyaWFuY2UoQmlnSW50ZWdlciBuZXdTdGFydFZhcmlhbmNlKSB7Ci0JCUJpZ0ludGVnZXIgb2xkU3RhcnRWYXJpYW5jZSA9IHN0YXJ0VmFyaWFuY2U7Ci0JCXN0YXJ0VmFyaWFuY2UgPSBuZXdTdGFydFZhcmlhbmNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1NUQVJUX1ZBUklBTkNFLCBvbGRTdGFydFZhcmlhbmNlLCBzdGFydFZhcmlhbmNlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0RmluaXNoVmFyaWFuY2UoKSB7Ci0JCXJldHVybiBmaW5pc2hWYXJpYW5jZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGaW5pc2hWYXJpYW5jZShCaWdJbnRlZ2VyIG5ld0ZpbmlzaFZhcmlhbmNlKSB7Ci0JCUJpZ0ludGVnZXIgb2xkRmluaXNoVmFyaWFuY2UgPSBmaW5pc2hWYXJpYW5jZTsKLQkJZmluaXNoVmFyaWFuY2UgPSBuZXdGaW5pc2hWYXJpYW5jZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19GSU5JU0hfVkFSSUFOQ0UsIG9sZEZpbmlzaFZhcmlhbmNlLCBmaW5pc2hWYXJpYW5jZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBmbG9hdCBnZXRXb3JrVmFyaWFuY2UoKSB7Ci0JCXJldHVybiB3b3JrVmFyaWFuY2U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0V29ya1ZhcmlhbmNlKGZsb2F0IG5ld1dvcmtWYXJpYW5jZSkgewotCQlmbG9hdCBvbGRXb3JrVmFyaWFuY2UgPSB3b3JrVmFyaWFuY2U7Ci0JCXdvcmtWYXJpYW5jZSA9IG5ld1dvcmtWYXJpYW5jZTsKLQkJYm9vbGVhbiBvbGRXb3JrVmFyaWFuY2VFU2V0ID0gd29ya1ZhcmlhbmNlRVNldDsKLQkJd29ya1ZhcmlhbmNlRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fV09SS19WQVJJQU5DRSwgb2xkV29ya1ZhcmlhbmNlLCB3b3JrVmFyaWFuY2UsICFvbGRXb3JrVmFyaWFuY2VFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRXb3JrVmFyaWFuY2UoKSB7Ci0JCWZsb2F0IG9sZFdvcmtWYXJpYW5jZSA9IHdvcmtWYXJpYW5jZTsKLQkJYm9vbGVhbiBvbGRXb3JrVmFyaWFuY2VFU2V0ID0gd29ya1ZhcmlhbmNlRVNldDsKLQkJd29ya1ZhcmlhbmNlID0gV09SS19WQVJJQU5DRV9FREVGQVVMVDsKLQkJd29ya1ZhcmlhbmNlRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fV09SS19WQVJJQU5DRSwgb2xkV29ya1ZhcmlhbmNlLCBXT1JLX1ZBUklBTkNFX0VERUZBVUxULCBvbGRXb3JrVmFyaWFuY2VFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRXb3JrVmFyaWFuY2UoKSB7Ci0JCXJldHVybiB3b3JrVmFyaWFuY2VFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGdldEZyZWVTbGFjaygpIHsKLQkJcmV0dXJuIGZyZWVTbGFjazsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGcmVlU2xhY2soQmlnSW50ZWdlciBuZXdGcmVlU2xhY2spIHsKLQkJQmlnSW50ZWdlciBvbGRGcmVlU2xhY2sgPSBmcmVlU2xhY2s7Ci0JCWZyZWVTbGFjayA9IG5ld0ZyZWVTbGFjazsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19GUkVFX1NMQUNLLCBvbGRGcmVlU2xhY2ssIGZyZWVTbGFjaykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGdldFRvdGFsU2xhY2soKSB7Ci0JCXJldHVybiB0b3RhbFNsYWNrOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRvdGFsU2xhY2soQmlnSW50ZWdlciBuZXdUb3RhbFNsYWNrKSB7Ci0JCUJpZ0ludGVnZXIgb2xkVG90YWxTbGFjayA9IHRvdGFsU2xhY2s7Ci0JCXRvdGFsU2xhY2sgPSBuZXdUb3RhbFNsYWNrOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1RPVEFMX1NMQUNLLCBvbGRUb3RhbFNsYWNrLCB0b3RhbFNsYWNrKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGZsb2F0IGdldEZpeGVkQ29zdCgpIHsKLQkJcmV0dXJuIGZpeGVkQ29zdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGaXhlZENvc3QoZmxvYXQgbmV3Rml4ZWRDb3N0KSB7Ci0JCWZsb2F0IG9sZEZpeGVkQ29zdCA9IGZpeGVkQ29zdDsKLQkJZml4ZWRDb3N0ID0gbmV3Rml4ZWRDb3N0OwotCQlib29sZWFuIG9sZEZpeGVkQ29zdEVTZXQgPSBmaXhlZENvc3RFU2V0OwotCQlmaXhlZENvc3RFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19GSVhFRF9DT1NULCBvbGRGaXhlZENvc3QsIGZpeGVkQ29zdCwgIW9sZEZpeGVkQ29zdEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldEZpeGVkQ29zdCgpIHsKLQkJZmxvYXQgb2xkRml4ZWRDb3N0ID0gZml4ZWRDb3N0OwotCQlib29sZWFuIG9sZEZpeGVkQ29zdEVTZXQgPSBmaXhlZENvc3RFU2V0OwotCQlmaXhlZENvc3QgPSBGSVhFRF9DT1NUX0VERUZBVUxUOwotCQlmaXhlZENvc3RFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19GSVhFRF9DT1NULCBvbGRGaXhlZENvc3QsIEZJWEVEX0NPU1RfRURFRkFVTFQsIG9sZEZpeGVkQ29zdEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldEZpeGVkQ29zdCgpIHsKLQkJcmV0dXJuIGZpeGVkQ29zdEVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRGaXhlZENvc3RBY2NydWFsKCkgewotCQlyZXR1cm4gZml4ZWRDb3N0QWNjcnVhbDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGaXhlZENvc3RBY2NydWFsKFN0cmluZyBuZXdGaXhlZENvc3RBY2NydWFsKSB7Ci0JCVN0cmluZyBvbGRGaXhlZENvc3RBY2NydWFsID0gZml4ZWRDb3N0QWNjcnVhbDsKLQkJZml4ZWRDb3N0QWNjcnVhbCA9IG5ld0ZpeGVkQ29zdEFjY3J1YWw7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fRklYRURfQ09TVF9BQ0NSVUFMLCBvbGRGaXhlZENvc3RBY2NydWFsLCBmaXhlZENvc3RBY2NydWFsKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0UGVyY2VudENvbXBsZXRlKCkgewotCQlyZXR1cm4gcGVyY2VudENvbXBsZXRlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBlcmNlbnRDb21wbGV0ZShCaWdJbnRlZ2VyIG5ld1BlcmNlbnRDb21wbGV0ZSkgewotCQlCaWdJbnRlZ2VyIG9sZFBlcmNlbnRDb21wbGV0ZSA9IHBlcmNlbnRDb21wbGV0ZTsKLQkJcGVyY2VudENvbXBsZXRlID0gbmV3UGVyY2VudENvbXBsZXRlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1BFUkNFTlRfQ09NUExFVEUsIG9sZFBlcmNlbnRDb21wbGV0ZSwgcGVyY2VudENvbXBsZXRlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0UGVyY2VudFdvcmtDb21wbGV0ZSgpIHsKLQkJcmV0dXJuIHBlcmNlbnRXb3JrQ29tcGxldGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UGVyY2VudFdvcmtDb21wbGV0ZShCaWdJbnRlZ2VyIG5ld1BlcmNlbnRXb3JrQ29tcGxldGUpIHsKLQkJQmlnSW50ZWdlciBvbGRQZXJjZW50V29ya0NvbXBsZXRlID0gcGVyY2VudFdvcmtDb21wbGV0ZTsKLQkJcGVyY2VudFdvcmtDb21wbGV0ZSA9IG5ld1BlcmNlbnRXb3JrQ29tcGxldGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fUEVSQ0VOVF9XT1JLX0NPTVBMRVRFLCBvbGRQZXJjZW50V29ya0NvbXBsZXRlLCBwZXJjZW50V29ya0NvbXBsZXRlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0RlY2ltYWwgZ2V0Q29zdCgpIHsKLQkJcmV0dXJuIGNvc3Q7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29zdChCaWdEZWNpbWFsIG5ld0Nvc3QpIHsKLQkJQmlnRGVjaW1hbCBvbGRDb3N0ID0gY29zdDsKLQkJY29zdCA9IG5ld0Nvc3Q7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQ09TVCwgb2xkQ29zdCwgY29zdCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdEZWNpbWFsIGdldE92ZXJ0aW1lQ29zdCgpIHsKLQkJcmV0dXJuIG92ZXJ0aW1lQ29zdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRPdmVydGltZUNvc3QoQmlnRGVjaW1hbCBuZXdPdmVydGltZUNvc3QpIHsKLQkJQmlnRGVjaW1hbCBvbGRPdmVydGltZUNvc3QgPSBvdmVydGltZUNvc3Q7Ci0JCW92ZXJ0aW1lQ29zdCA9IG5ld092ZXJ0aW1lQ29zdDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19PVkVSVElNRV9DT1NULCBvbGRPdmVydGltZUNvc3QsIG92ZXJ0aW1lQ29zdCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0T3ZlcnRpbWVXb3JrKCkgewotCQlyZXR1cm4gb3ZlcnRpbWVXb3JrOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE92ZXJ0aW1lV29yayhPYmplY3QgbmV3T3ZlcnRpbWVXb3JrKSB7Ci0JCU9iamVjdCBvbGRPdmVydGltZVdvcmsgPSBvdmVydGltZVdvcms7Ci0JCW92ZXJ0aW1lV29yayA9IG5ld092ZXJ0aW1lV29yazsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19PVkVSVElNRV9XT1JLLCBvbGRPdmVydGltZVdvcmssIG92ZXJ0aW1lV29yaykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0QWN0dWFsU3RhcnQoKSB7Ci0JCXJldHVybiBhY3R1YWxTdGFydDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBY3R1YWxTdGFydChPYmplY3QgbmV3QWN0dWFsU3RhcnQpIHsKLQkJT2JqZWN0IG9sZEFjdHVhbFN0YXJ0ID0gYWN0dWFsU3RhcnQ7Ci0JCWFjdHVhbFN0YXJ0ID0gbmV3QWN0dWFsU3RhcnQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQUNUVUFMX1NUQVJULCBvbGRBY3R1YWxTdGFydCwgYWN0dWFsU3RhcnQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEFjdHVhbEZpbmlzaCgpIHsKLQkJcmV0dXJuIGFjdHVhbEZpbmlzaDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBY3R1YWxGaW5pc2goT2JqZWN0IG5ld0FjdHVhbEZpbmlzaCkgewotCQlPYmplY3Qgb2xkQWN0dWFsRmluaXNoID0gYWN0dWFsRmluaXNoOwotCQlhY3R1YWxGaW5pc2ggPSBuZXdBY3R1YWxGaW5pc2g7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQUNUVUFMX0ZJTklTSCwgb2xkQWN0dWFsRmluaXNoLCBhY3R1YWxGaW5pc2gpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEFjdHVhbER1cmF0aW9uKCkgewotCQlyZXR1cm4gYWN0dWFsRHVyYXRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QWN0dWFsRHVyYXRpb24oT2JqZWN0IG5ld0FjdHVhbER1cmF0aW9uKSB7Ci0JCU9iamVjdCBvbGRBY3R1YWxEdXJhdGlvbiA9IGFjdHVhbER1cmF0aW9uOwotCQlhY3R1YWxEdXJhdGlvbiA9IG5ld0FjdHVhbER1cmF0aW9uOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0FDVFVBTF9EVVJBVElPTiwgb2xkQWN0dWFsRHVyYXRpb24sIGFjdHVhbER1cmF0aW9uKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0RlY2ltYWwgZ2V0QWN0dWFsQ29zdCgpIHsKLQkJcmV0dXJuIGFjdHVhbENvc3Q7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QWN0dWFsQ29zdChCaWdEZWNpbWFsIG5ld0FjdHVhbENvc3QpIHsKLQkJQmlnRGVjaW1hbCBvbGRBY3R1YWxDb3N0ID0gYWN0dWFsQ29zdDsKLQkJYWN0dWFsQ29zdCA9IG5ld0FjdHVhbENvc3Q7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQUNUVUFMX0NPU1QsIG9sZEFjdHVhbENvc3QsIGFjdHVhbENvc3QpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnRGVjaW1hbCBnZXRBY3R1YWxPdmVydGltZUNvc3QoKSB7Ci0JCXJldHVybiBhY3R1YWxPdmVydGltZUNvc3Q7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QWN0dWFsT3ZlcnRpbWVDb3N0KEJpZ0RlY2ltYWwgbmV3QWN0dWFsT3ZlcnRpbWVDb3N0KSB7Ci0JCUJpZ0RlY2ltYWwgb2xkQWN0dWFsT3ZlcnRpbWVDb3N0ID0gYWN0dWFsT3ZlcnRpbWVDb3N0OwotCQlhY3R1YWxPdmVydGltZUNvc3QgPSBuZXdBY3R1YWxPdmVydGltZUNvc3Q7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQUNUVUFMX09WRVJUSU1FX0NPU1QsIG9sZEFjdHVhbE92ZXJ0aW1lQ29zdCwgYWN0dWFsT3ZlcnRpbWVDb3N0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRBY3R1YWxXb3JrKCkgewotCQlyZXR1cm4gYWN0dWFsV29yazsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBY3R1YWxXb3JrKE9iamVjdCBuZXdBY3R1YWxXb3JrKSB7Ci0JCU9iamVjdCBvbGRBY3R1YWxXb3JrID0gYWN0dWFsV29yazsKLQkJYWN0dWFsV29yayA9IG5ld0FjdHVhbFdvcms7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQUNUVUFMX1dPUkssIG9sZEFjdHVhbFdvcmssIGFjdHVhbFdvcmspKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEFjdHVhbE92ZXJ0aW1lV29yaygpIHsKLQkJcmV0dXJuIGFjdHVhbE92ZXJ0aW1lV29yazsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBY3R1YWxPdmVydGltZVdvcmsoT2JqZWN0IG5ld0FjdHVhbE92ZXJ0aW1lV29yaykgewotCQlPYmplY3Qgb2xkQWN0dWFsT3ZlcnRpbWVXb3JrID0gYWN0dWFsT3ZlcnRpbWVXb3JrOwotCQlhY3R1YWxPdmVydGltZVdvcmsgPSBuZXdBY3R1YWxPdmVydGltZVdvcms7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQUNUVUFMX09WRVJUSU1FX1dPUkssIG9sZEFjdHVhbE92ZXJ0aW1lV29yaywgYWN0dWFsT3ZlcnRpbWVXb3JrKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRSZWd1bGFyV29yaygpIHsKLQkJcmV0dXJuIHJlZ3VsYXJXb3JrOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlZ3VsYXJXb3JrKE9iamVjdCBuZXdSZWd1bGFyV29yaykgewotCQlPYmplY3Qgb2xkUmVndWxhcldvcmsgPSByZWd1bGFyV29yazsKLQkJcmVndWxhcldvcmsgPSBuZXdSZWd1bGFyV29yazsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19SRUdVTEFSX1dPUkssIG9sZFJlZ3VsYXJXb3JrLCByZWd1bGFyV29yaykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0UmVtYWluaW5nRHVyYXRpb24oKSB7Ci0JCXJldHVybiByZW1haW5pbmdEdXJhdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZW1haW5pbmdEdXJhdGlvbihPYmplY3QgbmV3UmVtYWluaW5nRHVyYXRpb24pIHsKLQkJT2JqZWN0IG9sZFJlbWFpbmluZ0R1cmF0aW9uID0gcmVtYWluaW5nRHVyYXRpb247Ci0JCXJlbWFpbmluZ0R1cmF0aW9uID0gbmV3UmVtYWluaW5nRHVyYXRpb247Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fUkVNQUlOSU5HX0RVUkFUSU9OLCBvbGRSZW1haW5pbmdEdXJhdGlvbiwgcmVtYWluaW5nRHVyYXRpb24pKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnRGVjaW1hbCBnZXRSZW1haW5pbmdDb3N0KCkgewotCQlyZXR1cm4gcmVtYWluaW5nQ29zdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZW1haW5pbmdDb3N0KEJpZ0RlY2ltYWwgbmV3UmVtYWluaW5nQ29zdCkgewotCQlCaWdEZWNpbWFsIG9sZFJlbWFpbmluZ0Nvc3QgPSByZW1haW5pbmdDb3N0OwotCQlyZW1haW5pbmdDb3N0ID0gbmV3UmVtYWluaW5nQ29zdDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19SRU1BSU5JTkdfQ09TVCwgb2xkUmVtYWluaW5nQ29zdCwgcmVtYWluaW5nQ29zdCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0UmVtYWluaW5nV29yaygpIHsKLQkJcmV0dXJuIHJlbWFpbmluZ1dvcms7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmVtYWluaW5nV29yayhPYmplY3QgbmV3UmVtYWluaW5nV29yaykgewotCQlPYmplY3Qgb2xkUmVtYWluaW5nV29yayA9IHJlbWFpbmluZ1dvcms7Ci0JCXJlbWFpbmluZ1dvcmsgPSBuZXdSZW1haW5pbmdXb3JrOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1JFTUFJTklOR19XT1JLLCBvbGRSZW1haW5pbmdXb3JrLCByZW1haW5pbmdXb3JrKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0RlY2ltYWwgZ2V0UmVtYWluaW5nT3ZlcnRpbWVDb3N0KCkgewotCQlyZXR1cm4gcmVtYWluaW5nT3ZlcnRpbWVDb3N0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlbWFpbmluZ092ZXJ0aW1lQ29zdChCaWdEZWNpbWFsIG5ld1JlbWFpbmluZ092ZXJ0aW1lQ29zdCkgewotCQlCaWdEZWNpbWFsIG9sZFJlbWFpbmluZ092ZXJ0aW1lQ29zdCA9IHJlbWFpbmluZ092ZXJ0aW1lQ29zdDsKLQkJcmVtYWluaW5nT3ZlcnRpbWVDb3N0ID0gbmV3UmVtYWluaW5nT3ZlcnRpbWVDb3N0OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1JFTUFJTklOR19PVkVSVElNRV9DT1NULCBvbGRSZW1haW5pbmdPdmVydGltZUNvc3QsIHJlbWFpbmluZ092ZXJ0aW1lQ29zdCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0UmVtYWluaW5nT3ZlcnRpbWVXb3JrKCkgewotCQlyZXR1cm4gcmVtYWluaW5nT3ZlcnRpbWVXb3JrOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlbWFpbmluZ092ZXJ0aW1lV29yayhPYmplY3QgbmV3UmVtYWluaW5nT3ZlcnRpbWVXb3JrKSB7Ci0JCU9iamVjdCBvbGRSZW1haW5pbmdPdmVydGltZVdvcmsgPSByZW1haW5pbmdPdmVydGltZVdvcms7Ci0JCXJlbWFpbmluZ092ZXJ0aW1lV29yayA9IG5ld1JlbWFpbmluZ092ZXJ0aW1lV29yazsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19SRU1BSU5JTkdfT1ZFUlRJTUVfV09SSywgb2xkUmVtYWluaW5nT3ZlcnRpbWVXb3JrLCByZW1haW5pbmdPdmVydGltZVdvcmspKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgZmxvYXQgZ2V0QUNXUCgpIHsKLQkJcmV0dXJuIGFDV1A7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QUNXUChmbG9hdCBuZXdBQ1dQKSB7Ci0JCWZsb2F0IG9sZEFDV1AgPSBhQ1dQOwotCQlhQ1dQID0gbmV3QUNXUDsKLQkJYm9vbGVhbiBvbGRBQ1dQRVNldCA9IGFDV1BFU2V0OwotCQlhQ1dQRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQUNXUCwgb2xkQUNXUCwgYUNXUCwgIW9sZEFDV1BFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRBQ1dQKCkgewotCQlmbG9hdCBvbGRBQ1dQID0gYUNXUDsKLQkJYm9vbGVhbiBvbGRBQ1dQRVNldCA9IGFDV1BFU2V0OwotCQlhQ1dQID0gQUNXUF9FREVGQVVMVDsKLQkJYUNXUEVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0FDV1AsIG9sZEFDV1AsIEFDV1BfRURFRkFVTFQsIG9sZEFDV1BFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRBQ1dQKCkgewotCQlyZXR1cm4gYUNXUEVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGZsb2F0IGdldENWKCkgewotCQlyZXR1cm4gY1Y7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q1YoZmxvYXQgbmV3Q1YpIHsKLQkJZmxvYXQgb2xkQ1YgPSBjVjsKLQkJY1YgPSBuZXdDVjsKLQkJYm9vbGVhbiBvbGRDVkVTZXQgPSBjVkVTZXQ7Ci0JCWNWRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQ1YsIG9sZENWLCBjViwgIW9sZENWRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0Q1YoKSB7Ci0JCWZsb2F0IG9sZENWID0gY1Y7Ci0JCWJvb2xlYW4gb2xkQ1ZFU2V0ID0gY1ZFU2V0OwotCQljViA9IENWX0VERUZBVUxUOwotCQljVkVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0NWLCBvbGRDViwgQ1ZfRURFRkFVTFQsIG9sZENWRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0Q1YoKSB7Ci0JCXJldHVybiBjVkVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0Q29uc3RyYWludFR5cGUoKSB7Ci0JCXJldHVybiBjb25zdHJhaW50VHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb25zdHJhaW50VHlwZShCaWdJbnRlZ2VyIG5ld0NvbnN0cmFpbnRUeXBlKSB7Ci0JCUJpZ0ludGVnZXIgb2xkQ29uc3RyYWludFR5cGUgPSBjb25zdHJhaW50VHlwZTsKLQkJY29uc3RyYWludFR5cGUgPSBuZXdDb25zdHJhaW50VHlwZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19DT05TVFJBSU5UX1RZUEUsIG9sZENvbnN0cmFpbnRUeXBlLCBjb25zdHJhaW50VHlwZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGdldENhbGVuZGFyVUlEKCkgewotCQlyZXR1cm4gY2FsZW5kYXJVSUQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q2FsZW5kYXJVSUQoQmlnSW50ZWdlciBuZXdDYWxlbmRhclVJRCkgewotCQlCaWdJbnRlZ2VyIG9sZENhbGVuZGFyVUlEID0gY2FsZW5kYXJVSUQ7Ci0JCWNhbGVuZGFyVUlEID0gbmV3Q2FsZW5kYXJVSUQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQ0FMRU5EQVJfVUlELCBvbGRDYWxlbmRhclVJRCwgY2FsZW5kYXJVSUQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldENvbnN0cmFpbnREYXRlKCkgewotCQlyZXR1cm4gY29uc3RyYWludERhdGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29uc3RyYWludERhdGUoT2JqZWN0IG5ld0NvbnN0cmFpbnREYXRlKSB7Ci0JCU9iamVjdCBvbGRDb25zdHJhaW50RGF0ZSA9IGNvbnN0cmFpbnREYXRlOwotCQljb25zdHJhaW50RGF0ZSA9IG5ld0NvbnN0cmFpbnREYXRlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0NPTlNUUkFJTlRfREFURSwgb2xkQ29uc3RyYWludERhdGUsIGNvbnN0cmFpbnREYXRlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXREZWFkbGluZSgpIHsKLQkJcmV0dXJuIGRlYWRsaW5lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlYWRsaW5lKE9iamVjdCBuZXdEZWFkbGluZSkgewotCQlPYmplY3Qgb2xkRGVhZGxpbmUgPSBkZWFkbGluZTsKLQkJZGVhZGxpbmUgPSBuZXdEZWFkbGluZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19ERUFETElORSwgb2xkRGVhZGxpbmUsIGRlYWRsaW5lKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNMZXZlbEFzc2lnbm1lbnRzKCkgewotCQlyZXR1cm4gbGV2ZWxBc3NpZ25tZW50czsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMZXZlbEFzc2lnbm1lbnRzKGJvb2xlYW4gbmV3TGV2ZWxBc3NpZ25tZW50cykgewotCQlib29sZWFuIG9sZExldmVsQXNzaWdubWVudHMgPSBsZXZlbEFzc2lnbm1lbnRzOwotCQlsZXZlbEFzc2lnbm1lbnRzID0gbmV3TGV2ZWxBc3NpZ25tZW50czsKLQkJYm9vbGVhbiBvbGRMZXZlbEFzc2lnbm1lbnRzRVNldCA9IGxldmVsQXNzaWdubWVudHNFU2V0OwotCQlsZXZlbEFzc2lnbm1lbnRzRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fTEVWRUxfQVNTSUdOTUVOVFMsIG9sZExldmVsQXNzaWdubWVudHMsIGxldmVsQXNzaWdubWVudHMsICFvbGRMZXZlbEFzc2lnbm1lbnRzRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0TGV2ZWxBc3NpZ25tZW50cygpIHsKLQkJYm9vbGVhbiBvbGRMZXZlbEFzc2lnbm1lbnRzID0gbGV2ZWxBc3NpZ25tZW50czsKLQkJYm9vbGVhbiBvbGRMZXZlbEFzc2lnbm1lbnRzRVNldCA9IGxldmVsQXNzaWdubWVudHNFU2V0OwotCQlsZXZlbEFzc2lnbm1lbnRzID0gTEVWRUxfQVNTSUdOTUVOVFNfRURFRkFVTFQ7Ci0JCWxldmVsQXNzaWdubWVudHNFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19MRVZFTF9BU1NJR05NRU5UUywgb2xkTGV2ZWxBc3NpZ25tZW50cywgTEVWRUxfQVNTSUdOTUVOVFNfRURFRkFVTFQsIG9sZExldmVsQXNzaWdubWVudHNFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRMZXZlbEFzc2lnbm1lbnRzKCkgewotCQlyZXR1cm4gbGV2ZWxBc3NpZ25tZW50c0VTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNMZXZlbGluZ0NhblNwbGl0KCkgewotCQlyZXR1cm4gbGV2ZWxpbmdDYW5TcGxpdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMZXZlbGluZ0NhblNwbGl0KGJvb2xlYW4gbmV3TGV2ZWxpbmdDYW5TcGxpdCkgewotCQlib29sZWFuIG9sZExldmVsaW5nQ2FuU3BsaXQgPSBsZXZlbGluZ0NhblNwbGl0OwotCQlsZXZlbGluZ0NhblNwbGl0ID0gbmV3TGV2ZWxpbmdDYW5TcGxpdDsKLQkJYm9vbGVhbiBvbGRMZXZlbGluZ0NhblNwbGl0RVNldCA9IGxldmVsaW5nQ2FuU3BsaXRFU2V0OwotCQlsZXZlbGluZ0NhblNwbGl0RVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fTEVWRUxJTkdfQ0FOX1NQTElULCBvbGRMZXZlbGluZ0NhblNwbGl0LCBsZXZlbGluZ0NhblNwbGl0LCAhb2xkTGV2ZWxpbmdDYW5TcGxpdEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldExldmVsaW5nQ2FuU3BsaXQoKSB7Ci0JCWJvb2xlYW4gb2xkTGV2ZWxpbmdDYW5TcGxpdCA9IGxldmVsaW5nQ2FuU3BsaXQ7Ci0JCWJvb2xlYW4gb2xkTGV2ZWxpbmdDYW5TcGxpdEVTZXQgPSBsZXZlbGluZ0NhblNwbGl0RVNldDsKLQkJbGV2ZWxpbmdDYW5TcGxpdCA9IExFVkVMSU5HX0NBTl9TUExJVF9FREVGQVVMVDsKLQkJbGV2ZWxpbmdDYW5TcGxpdEVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0xFVkVMSU5HX0NBTl9TUExJVCwgb2xkTGV2ZWxpbmdDYW5TcGxpdCwgTEVWRUxJTkdfQ0FOX1NQTElUX0VERUZBVUxULCBvbGRMZXZlbGluZ0NhblNwbGl0RVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0TGV2ZWxpbmdDYW5TcGxpdCgpIHsKLQkJcmV0dXJuIGxldmVsaW5nQ2FuU3BsaXRFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGdldExldmVsaW5nRGVsYXkoKSB7Ci0JCXJldHVybiBsZXZlbGluZ0RlbGF5OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExldmVsaW5nRGVsYXkoQmlnSW50ZWdlciBuZXdMZXZlbGluZ0RlbGF5KSB7Ci0JCUJpZ0ludGVnZXIgb2xkTGV2ZWxpbmdEZWxheSA9IGxldmVsaW5nRGVsYXk7Ci0JCWxldmVsaW5nRGVsYXkgPSBuZXdMZXZlbGluZ0RlbGF5OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0xFVkVMSU5HX0RFTEFZLCBvbGRMZXZlbGluZ0RlbGF5LCBsZXZlbGluZ0RlbGF5KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0TGV2ZWxpbmdEZWxheUZvcm1hdCgpIHsKLQkJcmV0dXJuIGxldmVsaW5nRGVsYXlGb3JtYXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGV2ZWxpbmdEZWxheUZvcm1hdChCaWdJbnRlZ2VyIG5ld0xldmVsaW5nRGVsYXlGb3JtYXQpIHsKLQkJQmlnSW50ZWdlciBvbGRMZXZlbGluZ0RlbGF5Rm9ybWF0ID0gbGV2ZWxpbmdEZWxheUZvcm1hdDsKLQkJbGV2ZWxpbmdEZWxheUZvcm1hdCA9IG5ld0xldmVsaW5nRGVsYXlGb3JtYXQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fTEVWRUxJTkdfREVMQVlfRk9STUFULCBvbGRMZXZlbGluZ0RlbGF5Rm9ybWF0LCBsZXZlbGluZ0RlbGF5Rm9ybWF0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRQcmVMZXZlbGVkU3RhcnQoKSB7Ci0JCXJldHVybiBwcmVMZXZlbGVkU3RhcnQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHJlTGV2ZWxlZFN0YXJ0KE9iamVjdCBuZXdQcmVMZXZlbGVkU3RhcnQpIHsKLQkJT2JqZWN0IG9sZFByZUxldmVsZWRTdGFydCA9IHByZUxldmVsZWRTdGFydDsKLQkJcHJlTGV2ZWxlZFN0YXJ0ID0gbmV3UHJlTGV2ZWxlZFN0YXJ0OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1BSRV9MRVZFTEVEX1NUQVJULCBvbGRQcmVMZXZlbGVkU3RhcnQsIHByZUxldmVsZWRTdGFydCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0UHJlTGV2ZWxlZEZpbmlzaCgpIHsKLQkJcmV0dXJuIHByZUxldmVsZWRGaW5pc2g7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHJlTGV2ZWxlZEZpbmlzaChPYmplY3QgbmV3UHJlTGV2ZWxlZEZpbmlzaCkgewotCQlPYmplY3Qgb2xkUHJlTGV2ZWxlZEZpbmlzaCA9IHByZUxldmVsZWRGaW5pc2g7Ci0JCXByZUxldmVsZWRGaW5pc2ggPSBuZXdQcmVMZXZlbGVkRmluaXNoOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1BSRV9MRVZFTEVEX0ZJTklTSCwgb2xkUHJlTGV2ZWxlZEZpbmlzaCwgcHJlTGV2ZWxlZEZpbmlzaCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SHlwZXJsaW5rKCkgewotCQlyZXR1cm4gaHlwZXJsaW5rOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEh5cGVybGluayhTdHJpbmcgbmV3SHlwZXJsaW5rKSB7Ci0JCVN0cmluZyBvbGRIeXBlcmxpbmsgPSBoeXBlcmxpbms7Ci0JCWh5cGVybGluayA9IG5ld0h5cGVybGluazsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19IWVBFUkxJTkssIG9sZEh5cGVybGluaywgaHlwZXJsaW5rKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRIeXBlcmxpbmtBZGRyZXNzKCkgewotCQlyZXR1cm4gaHlwZXJsaW5rQWRkcmVzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRIeXBlcmxpbmtBZGRyZXNzKFN0cmluZyBuZXdIeXBlcmxpbmtBZGRyZXNzKSB7Ci0JCVN0cmluZyBvbGRIeXBlcmxpbmtBZGRyZXNzID0gaHlwZXJsaW5rQWRkcmVzczsKLQkJaHlwZXJsaW5rQWRkcmVzcyA9IG5ld0h5cGVybGlua0FkZHJlc3M7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fSFlQRVJMSU5LX0FERFJFU1MsIG9sZEh5cGVybGlua0FkZHJlc3MsIGh5cGVybGlua0FkZHJlc3MpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEh5cGVybGlua1N1YkFkZHJlc3MoKSB7Ci0JCXJldHVybiBoeXBlcmxpbmtTdWJBZGRyZXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEh5cGVybGlua1N1YkFkZHJlc3MoU3RyaW5nIG5ld0h5cGVybGlua1N1YkFkZHJlc3MpIHsKLQkJU3RyaW5nIG9sZEh5cGVybGlua1N1YkFkZHJlc3MgPSBoeXBlcmxpbmtTdWJBZGRyZXNzOwotCQloeXBlcmxpbmtTdWJBZGRyZXNzID0gbmV3SHlwZXJsaW5rU3ViQWRkcmVzczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19IWVBFUkxJTktfU1VCX0FERFJFU1MsIG9sZEh5cGVybGlua1N1YkFkZHJlc3MsIGh5cGVybGlua1N1YkFkZHJlc3MpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0lnbm9yZVJlc291cmNlQ2FsZW5kYXIoKSB7Ci0JCXJldHVybiBpZ25vcmVSZXNvdXJjZUNhbGVuZGFyOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldElnbm9yZVJlc291cmNlQ2FsZW5kYXIoYm9vbGVhbiBuZXdJZ25vcmVSZXNvdXJjZUNhbGVuZGFyKSB7Ci0JCWJvb2xlYW4gb2xkSWdub3JlUmVzb3VyY2VDYWxlbmRhciA9IGlnbm9yZVJlc291cmNlQ2FsZW5kYXI7Ci0JCWlnbm9yZVJlc291cmNlQ2FsZW5kYXIgPSBuZXdJZ25vcmVSZXNvdXJjZUNhbGVuZGFyOwotCQlib29sZWFuIG9sZElnbm9yZVJlc291cmNlQ2FsZW5kYXJFU2V0ID0gaWdub3JlUmVzb3VyY2VDYWxlbmRhckVTZXQ7Ci0JCWlnbm9yZVJlc291cmNlQ2FsZW5kYXJFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19JR05PUkVfUkVTT1VSQ0VfQ0FMRU5EQVIsIG9sZElnbm9yZVJlc291cmNlQ2FsZW5kYXIsIGlnbm9yZVJlc291cmNlQ2FsZW5kYXIsICFvbGRJZ25vcmVSZXNvdXJjZUNhbGVuZGFyRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0SWdub3JlUmVzb3VyY2VDYWxlbmRhcigpIHsKLQkJYm9vbGVhbiBvbGRJZ25vcmVSZXNvdXJjZUNhbGVuZGFyID0gaWdub3JlUmVzb3VyY2VDYWxlbmRhcjsKLQkJYm9vbGVhbiBvbGRJZ25vcmVSZXNvdXJjZUNhbGVuZGFyRVNldCA9IGlnbm9yZVJlc291cmNlQ2FsZW5kYXJFU2V0OwotCQlpZ25vcmVSZXNvdXJjZUNhbGVuZGFyID0gSUdOT1JFX1JFU09VUkNFX0NBTEVOREFSX0VERUZBVUxUOwotCQlpZ25vcmVSZXNvdXJjZUNhbGVuZGFyRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fSUdOT1JFX1JFU09VUkNFX0NBTEVOREFSLCBvbGRJZ25vcmVSZXNvdXJjZUNhbGVuZGFyLCBJR05PUkVfUkVTT1VSQ0VfQ0FMRU5EQVJfRURFRkFVTFQsIG9sZElnbm9yZVJlc291cmNlQ2FsZW5kYXJFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRJZ25vcmVSZXNvdXJjZUNhbGVuZGFyKCkgewotCQlyZXR1cm4gaWdub3JlUmVzb3VyY2VDYWxlbmRhckVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROb3RlcygpIHsKLQkJcmV0dXJuIG5vdGVzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE5vdGVzKFN0cmluZyBuZXdOb3RlcykgewotCQlTdHJpbmcgb2xkTm90ZXMgPSBub3RlczsKLQkJbm90ZXMgPSBuZXdOb3RlczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19OT1RFUywgb2xkTm90ZXMsIG5vdGVzKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNIaWRlQmFyKCkgewotCQlyZXR1cm4gaGlkZUJhcjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRIaWRlQmFyKGJvb2xlYW4gbmV3SGlkZUJhcikgewotCQlib29sZWFuIG9sZEhpZGVCYXIgPSBoaWRlQmFyOwotCQloaWRlQmFyID0gbmV3SGlkZUJhcjsKLQkJYm9vbGVhbiBvbGRIaWRlQmFyRVNldCA9IGhpZGVCYXJFU2V0OwotCQloaWRlQmFyRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fSElERV9CQVIsIG9sZEhpZGVCYXIsIGhpZGVCYXIsICFvbGRIaWRlQmFyRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0SGlkZUJhcigpIHsKLQkJYm9vbGVhbiBvbGRIaWRlQmFyID0gaGlkZUJhcjsKLQkJYm9vbGVhbiBvbGRIaWRlQmFyRVNldCA9IGhpZGVCYXJFU2V0OwotCQloaWRlQmFyID0gSElERV9CQVJfRURFRkFVTFQ7Ci0JCWhpZGVCYXJFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19ISURFX0JBUiwgb2xkSGlkZUJhciwgSElERV9CQVJfRURFRkFVTFQsIG9sZEhpZGVCYXJFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRIaWRlQmFyKCkgewotCQlyZXR1cm4gaGlkZUJhckVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNSb2xsdXAoKSB7Ci0JCXJldHVybiByb2xsdXA7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Um9sbHVwKGJvb2xlYW4gbmV3Um9sbHVwKSB7Ci0JCWJvb2xlYW4gb2xkUm9sbHVwID0gcm9sbHVwOwotCQlyb2xsdXAgPSBuZXdSb2xsdXA7Ci0JCWJvb2xlYW4gb2xkUm9sbHVwRVNldCA9IHJvbGx1cEVTZXQ7Ci0JCXJvbGx1cEVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1JPTExVUCwgb2xkUm9sbHVwLCByb2xsdXAsICFvbGRSb2xsdXBFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRSb2xsdXAoKSB7Ci0JCWJvb2xlYW4gb2xkUm9sbHVwID0gcm9sbHVwOwotCQlib29sZWFuIG9sZFJvbGx1cEVTZXQgPSByb2xsdXBFU2V0OwotCQlyb2xsdXAgPSBST0xMVVBfRURFRkFVTFQ7Ci0JCXJvbGx1cEVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1JPTExVUCwgb2xkUm9sbHVwLCBST0xMVVBfRURFRkFVTFQsIG9sZFJvbGx1cEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldFJvbGx1cCgpIHsKLQkJcmV0dXJuIHJvbGx1cEVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGZsb2F0IGdldEJDV1MoKSB7Ci0JCXJldHVybiBiQ1dTOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEJDV1MoZmxvYXQgbmV3QkNXUykgewotCQlmbG9hdCBvbGRCQ1dTID0gYkNXUzsKLQkJYkNXUyA9IG5ld0JDV1M7Ci0JCWJvb2xlYW4gb2xkQkNXU0VTZXQgPSBiQ1dTRVNldDsKLQkJYkNXU0VTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0JDV1MsIG9sZEJDV1MsIGJDV1MsICFvbGRCQ1dTRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0QkNXUygpIHsKLQkJZmxvYXQgb2xkQkNXUyA9IGJDV1M7Ci0JCWJvb2xlYW4gb2xkQkNXU0VTZXQgPSBiQ1dTRVNldDsKLQkJYkNXUyA9IEJDV1NfRURFRkFVTFQ7Ci0JCWJDV1NFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19CQ1dTLCBvbGRCQ1dTLCBCQ1dTX0VERUZBVUxULCBvbGRCQ1dTRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0QkNXUygpIHsKLQkJcmV0dXJuIGJDV1NFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBmbG9hdCBnZXRCQ1dQKCkgewotCQlyZXR1cm4gYkNXUDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRCQ1dQKGZsb2F0IG5ld0JDV1ApIHsKLQkJZmxvYXQgb2xkQkNXUCA9IGJDV1A7Ci0JCWJDV1AgPSBuZXdCQ1dQOwotCQlib29sZWFuIG9sZEJDV1BFU2V0ID0gYkNXUEVTZXQ7Ci0JCWJDV1BFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19CQ1dQLCBvbGRCQ1dQLCBiQ1dQLCAhb2xkQkNXUEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldEJDV1AoKSB7Ci0JCWZsb2F0IG9sZEJDV1AgPSBiQ1dQOwotCQlib29sZWFuIG9sZEJDV1BFU2V0ID0gYkNXUEVTZXQ7Ci0JCWJDV1AgPSBCQ1dQX0VERUZBVUxUOwotCQliQ1dQRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQkNXUCwgb2xkQkNXUCwgQkNXUF9FREVGQVVMVCwgb2xkQkNXUEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldEJDV1AoKSB7Ci0JCXJldHVybiBiQ1dQRVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBnZXRQaHlzaWNhbFBlcmNlbnRDb21wbGV0ZSgpIHsKLQkJcmV0dXJuIHBoeXNpY2FsUGVyY2VudENvbXBsZXRlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBoeXNpY2FsUGVyY2VudENvbXBsZXRlKEJpZ0ludGVnZXIgbmV3UGh5c2ljYWxQZXJjZW50Q29tcGxldGUpIHsKLQkJQmlnSW50ZWdlciBvbGRQaHlzaWNhbFBlcmNlbnRDb21wbGV0ZSA9IHBoeXNpY2FsUGVyY2VudENvbXBsZXRlOwotCQlwaHlzaWNhbFBlcmNlbnRDb21wbGV0ZSA9IG5ld1BoeXNpY2FsUGVyY2VudENvbXBsZXRlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1BIWVNJQ0FMX1BFUkNFTlRfQ09NUExFVEUsIG9sZFBoeXNpY2FsUGVyY2VudENvbXBsZXRlLCBwaHlzaWNhbFBlcmNlbnRDb21wbGV0ZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGdldEVhcm5lZFZhbHVlTWV0aG9kKCkgewotCQlyZXR1cm4gZWFybmVkVmFsdWVNZXRob2Q7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RWFybmVkVmFsdWVNZXRob2QoQmlnSW50ZWdlciBuZXdFYXJuZWRWYWx1ZU1ldGhvZCkgewotCQlCaWdJbnRlZ2VyIG9sZEVhcm5lZFZhbHVlTWV0aG9kID0gZWFybmVkVmFsdWVNZXRob2Q7Ci0JCWVhcm5lZFZhbHVlTWV0aG9kID0gbmV3RWFybmVkVmFsdWVNZXRob2Q7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fRUFSTkVEX1ZBTFVFX01FVEhPRCwgb2xkRWFybmVkVmFsdWVNZXRob2QsIGVhcm5lZFZhbHVlTWV0aG9kKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldFByZWRlY2Vzc29yTGluaygpIHsKLQkJaWYgKHByZWRlY2Vzc29yTGluayA9PSBudWxsKSB7Ci0JCQlwcmVkZWNlc3NvckxpbmsgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoUHJlZGVjZXNzb3JMaW5rLmNsYXNzLCB0aGlzLCBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1BSRURFQ0VTU09SX0xJTkspOwotCQl9Ci0JCXJldHVybiBwcmVkZWNlc3Nvckxpbms7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRBY3R1YWxXb3JrUHJvdGVjdGVkKCkgewotCQlyZXR1cm4gYWN0dWFsV29ya1Byb3RlY3RlZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBY3R1YWxXb3JrUHJvdGVjdGVkKE9iamVjdCBuZXdBY3R1YWxXb3JrUHJvdGVjdGVkKSB7Ci0JCU9iamVjdCBvbGRBY3R1YWxXb3JrUHJvdGVjdGVkID0gYWN0dWFsV29ya1Byb3RlY3RlZDsKLQkJYWN0dWFsV29ya1Byb3RlY3RlZCA9IG5ld0FjdHVhbFdvcmtQcm90ZWN0ZWQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQUNUVUFMX1dPUktfUFJPVEVDVEVELCBvbGRBY3R1YWxXb3JrUHJvdGVjdGVkLCBhY3R1YWxXb3JrUHJvdGVjdGVkKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRBY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQoKSB7Ci0JCXJldHVybiBhY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkKE9iamVjdCBuZXdBY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQpIHsKLQkJT2JqZWN0IG9sZEFjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZCA9IGFjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZDsKLQkJYWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkID0gbmV3QWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0FDVFVBTF9PVkVSVElNRV9XT1JLX1BST1RFQ1RFRCwgb2xkQWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkLCBhY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUoKSB7Ci0JCWlmIChleHRlbmRlZEF0dHJpYnV0ZSA9PSBudWxsKSB7Ci0JCQlleHRlbmRlZEF0dHJpYnV0ZSA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChFeHRlbmRlZEF0dHJpYnV0ZTIuY2xhc3MsIHRoaXMsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fRVhURU5ERURfQVRUUklCVVRFKTsKLQkJfQotCQlyZXR1cm4gZXh0ZW5kZWRBdHRyaWJ1dGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldEJhc2VsaW5lKCkgewotCQlpZiAoYmFzZWxpbmUgPT0gbnVsbCkgewotCQkJYmFzZWxpbmUgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoQmFzZWxpbmUuY2xhc3MsIHRoaXMsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQkFTRUxJTkUpOwotCQl9Ci0JCXJldHVybiBiYXNlbGluZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0T3V0bGluZUNvZGUoKSB7Ci0JCWlmIChvdXRsaW5lQ29kZSA9PSBudWxsKSB7Ci0JCQlvdXRsaW5lQ29kZSA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChPdXRsaW5lQ29kZTIuY2xhc3MsIHRoaXMsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fT1VUTElORV9DT0RFKTsKLQkJfQotCQlyZXR1cm4gb3V0bGluZUNvZGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldFRpbWVwaGFzZWREYXRhKCkgewotCQlpZiAodGltZXBoYXNlZERhdGEgPT0gbnVsbCkgewotCQkJdGltZXBoYXNlZERhdGEgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoVGltZXBoYXNlZERhdGFUeXBlLmNsYXNzLCB0aGlzLCBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1RJTUVQSEFTRURfREFUQSk7Ci0JCX0KLQkJcmV0dXJuIHRpbWVwaGFzZWREYXRhOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19QUkVERUNFU1NPUl9MSU5LOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldFByZWRlY2Vzc29yTGluaygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0VYVEVOREVEX0FUVFJJQlVURToKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRFeHRlbmRlZEF0dHJpYnV0ZSgpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0JBU0VMSU5FOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEJhc2VsaW5lKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fT1VUTElORV9DT0RFOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldE91dGxpbmVDb2RlKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fVElNRVBIQVNFRF9EQVRBOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldFRpbWVwaGFzZWREYXRhKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19VSUQ6Ci0JCQkJcmV0dXJuIGdldFVJRCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0lEOgotCQkJCXJldHVybiBnZXRJRCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX05BTUU6Ci0JCQkJcmV0dXJuIGdldE5hbWUoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19UWVBFOgotCQkJCXJldHVybiBnZXRUeXBlKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fSVNfTlVMTDoKLQkJCQlyZXR1cm4gaXNJc051bGwoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQ1JFQVRFX0RBVEU6Ci0JCQkJcmV0dXJuIGdldENyZWF0ZURhdGUoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19DT05UQUNUOgotCQkJCXJldHVybiBnZXRDb250YWN0KCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fV0JTOgotCQkJCXJldHVybiBnZXRXQlMoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19XQlNfTEVWRUw6Ci0JCQkJcmV0dXJuIGdldFdCU0xldmVsKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fT1VUTElORV9OVU1CRVI6Ci0JCQkJcmV0dXJuIGdldE91dGxpbmVOdW1iZXIoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19PVVRMSU5FX0xFVkVMOgotCQkJCXJldHVybiBnZXRPdXRsaW5lTGV2ZWwoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19QUklPUklUWToKLQkJCQlyZXR1cm4gZ2V0UHJpb3JpdHkoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19TVEFSVDoKLQkJCQlyZXR1cm4gZ2V0U3RhcnQoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19GSU5JU0g6Ci0JCQkJcmV0dXJuIGdldEZpbmlzaCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0RVUkFUSU9OOgotCQkJCXJldHVybiBnZXREdXJhdGlvbigpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0RVUkFUSU9OX0ZPUk1BVDoKLQkJCQlyZXR1cm4gZ2V0RHVyYXRpb25Gb3JtYXQoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19XT1JLOgotCQkJCXJldHVybiBnZXRXb3JrKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fU1RPUDoKLQkJCQlyZXR1cm4gZ2V0U3RvcCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1JFU1VNRToKLQkJCQlyZXR1cm4gZ2V0UmVzdW1lKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fUkVTVU1FX1ZBTElEOgotCQkJCXJldHVybiBpc1Jlc3VtZVZhbGlkKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0VGRk9SVF9EUklWRU46Ci0JCQkJcmV0dXJuIGlzRWZmb3J0RHJpdmVuKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1JFQ1VSUklORzoKLQkJCQlyZXR1cm4gaXNSZWN1cnJpbmcoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fT1ZFUl9BTExPQ0FURUQ6Ci0JCQkJcmV0dXJuIGlzT3ZlckFsbG9jYXRlZCgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19FU1RJTUFURUQ6Ci0JCQkJcmV0dXJuIGlzRXN0aW1hdGVkKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX01JTEVTVE9ORToKLQkJCQlyZXR1cm4gaXNNaWxlc3RvbmUoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fU1VNTUFSWToKLQkJCQlyZXR1cm4gaXNTdW1tYXJ5KCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0NSSVRJQ0FMOgotCQkJCXJldHVybiBpc0NyaXRpY2FsKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0lTX1NVQlBST0pFQ1Q6Ci0JCQkJcmV0dXJuIGlzSXNTdWJwcm9qZWN0KCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0lTX1NVQlBST0pFQ1RfUkVBRF9PTkxZOgotCQkJCXJldHVybiBpc0lzU3VicHJvamVjdFJlYWRPbmx5KCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1NVQlBST0pFQ1RfTkFNRToKLQkJCQlyZXR1cm4gZ2V0U3VicHJvamVjdE5hbWUoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19FWFRFUk5BTF9UQVNLOgotCQkJCXJldHVybiBpc0V4dGVybmFsVGFzaygpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19FWFRFUk5BTF9UQVNLX1BST0pFQ1Q6Ci0JCQkJcmV0dXJuIGdldEV4dGVybmFsVGFza1Byb2plY3QoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19FQVJMWV9TVEFSVDoKLQkJCQlyZXR1cm4gZ2V0RWFybHlTdGFydCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0VBUkxZX0ZJTklTSDoKLQkJCQlyZXR1cm4gZ2V0RWFybHlGaW5pc2goKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19MQVRFX1NUQVJUOgotCQkJCXJldHVybiBnZXRMYXRlU3RhcnQoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19MQVRFX0ZJTklTSDoKLQkJCQlyZXR1cm4gZ2V0TGF0ZUZpbmlzaCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1NUQVJUX1ZBUklBTkNFOgotCQkJCXJldHVybiBnZXRTdGFydFZhcmlhbmNlKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fRklOSVNIX1ZBUklBTkNFOgotCQkJCXJldHVybiBnZXRGaW5pc2hWYXJpYW5jZSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1dPUktfVkFSSUFOQ0U6Ci0JCQkJcmV0dXJuIG5ldyBGbG9hdChnZXRXb3JrVmFyaWFuY2UoKSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fRlJFRV9TTEFDSzoKLQkJCQlyZXR1cm4gZ2V0RnJlZVNsYWNrKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fVE9UQUxfU0xBQ0s6Ci0JCQkJcmV0dXJuIGdldFRvdGFsU2xhY2soKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19GSVhFRF9DT1NUOgotCQkJCXJldHVybiBuZXcgRmxvYXQoZ2V0Rml4ZWRDb3N0KCkpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0ZJWEVEX0NPU1RfQUNDUlVBTDoKLQkJCQlyZXR1cm4gZ2V0Rml4ZWRDb3N0QWNjcnVhbCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1BFUkNFTlRfQ09NUExFVEU6Ci0JCQkJcmV0dXJuIGdldFBlcmNlbnRDb21wbGV0ZSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1BFUkNFTlRfV09SS19DT01QTEVURToKLQkJCQlyZXR1cm4gZ2V0UGVyY2VudFdvcmtDb21wbGV0ZSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0NPU1Q6Ci0JCQkJcmV0dXJuIGdldENvc3QoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19PVkVSVElNRV9DT1NUOgotCQkJCXJldHVybiBnZXRPdmVydGltZUNvc3QoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19PVkVSVElNRV9XT1JLOgotCQkJCXJldHVybiBnZXRPdmVydGltZVdvcmsoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19BQ1RVQUxfU1RBUlQ6Ci0JCQkJcmV0dXJuIGdldEFjdHVhbFN0YXJ0KCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQUNUVUFMX0ZJTklTSDoKLQkJCQlyZXR1cm4gZ2V0QWN0dWFsRmluaXNoKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQUNUVUFMX0RVUkFUSU9OOgotCQkJCXJldHVybiBnZXRBY3R1YWxEdXJhdGlvbigpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0FDVFVBTF9DT1NUOgotCQkJCXJldHVybiBnZXRBY3R1YWxDb3N0KCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQUNUVUFMX09WRVJUSU1FX0NPU1Q6Ci0JCQkJcmV0dXJuIGdldEFjdHVhbE92ZXJ0aW1lQ29zdCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0FDVFVBTF9XT1JLOgotCQkJCXJldHVybiBnZXRBY3R1YWxXb3JrKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQUNUVUFMX09WRVJUSU1FX1dPUks6Ci0JCQkJcmV0dXJuIGdldEFjdHVhbE92ZXJ0aW1lV29yaygpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1JFR1VMQVJfV09SSzoKLQkJCQlyZXR1cm4gZ2V0UmVndWxhcldvcmsoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19SRU1BSU5JTkdfRFVSQVRJT046Ci0JCQkJcmV0dXJuIGdldFJlbWFpbmluZ0R1cmF0aW9uKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fUkVNQUlOSU5HX0NPU1Q6Ci0JCQkJcmV0dXJuIGdldFJlbWFpbmluZ0Nvc3QoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19SRU1BSU5JTkdfV09SSzoKLQkJCQlyZXR1cm4gZ2V0UmVtYWluaW5nV29yaygpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1JFTUFJTklOR19PVkVSVElNRV9DT1NUOgotCQkJCXJldHVybiBnZXRSZW1haW5pbmdPdmVydGltZUNvc3QoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19SRU1BSU5JTkdfT1ZFUlRJTUVfV09SSzoKLQkJCQlyZXR1cm4gZ2V0UmVtYWluaW5nT3ZlcnRpbWVXb3JrKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQUNXUDoKLQkJCQlyZXR1cm4gbmV3IEZsb2F0KGdldEFDV1AoKSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQ1Y6Ci0JCQkJcmV0dXJuIG5ldyBGbG9hdChnZXRDVigpKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19DT05TVFJBSU5UX1RZUEU6Ci0JCQkJcmV0dXJuIGdldENvbnN0cmFpbnRUeXBlKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQ0FMRU5EQVJfVUlEOgotCQkJCXJldHVybiBnZXRDYWxlbmRhclVJRCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0NPTlNUUkFJTlRfREFURToKLQkJCQlyZXR1cm4gZ2V0Q29uc3RyYWludERhdGUoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19ERUFETElORToKLQkJCQlyZXR1cm4gZ2V0RGVhZGxpbmUoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19MRVZFTF9BU1NJR05NRU5UUzoKLQkJCQlyZXR1cm4gaXNMZXZlbEFzc2lnbm1lbnRzKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0xFVkVMSU5HX0NBTl9TUExJVDoKLQkJCQlyZXR1cm4gaXNMZXZlbGluZ0NhblNwbGl0KCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0xFVkVMSU5HX0RFTEFZOgotCQkJCXJldHVybiBnZXRMZXZlbGluZ0RlbGF5KCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fTEVWRUxJTkdfREVMQVlfRk9STUFUOgotCQkJCXJldHVybiBnZXRMZXZlbGluZ0RlbGF5Rm9ybWF0KCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fUFJFX0xFVkVMRURfU1RBUlQ6Ci0JCQkJcmV0dXJuIGdldFByZUxldmVsZWRTdGFydCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1BSRV9MRVZFTEVEX0ZJTklTSDoKLQkJCQlyZXR1cm4gZ2V0UHJlTGV2ZWxlZEZpbmlzaCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0hZUEVSTElOSzoKLQkJCQlyZXR1cm4gZ2V0SHlwZXJsaW5rKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fSFlQRVJMSU5LX0FERFJFU1M6Ci0JCQkJcmV0dXJuIGdldEh5cGVybGlua0FkZHJlc3MoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19IWVBFUkxJTktfU1VCX0FERFJFU1M6Ci0JCQkJcmV0dXJuIGdldEh5cGVybGlua1N1YkFkZHJlc3MoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19JR05PUkVfUkVTT1VSQ0VfQ0FMRU5EQVI6Ci0JCQkJcmV0dXJuIGlzSWdub3JlUmVzb3VyY2VDYWxlbmRhcigpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19OT1RFUzoKLQkJCQlyZXR1cm4gZ2V0Tm90ZXMoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19ISURFX0JBUjoKLQkJCQlyZXR1cm4gaXNIaWRlQmFyKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1JPTExVUDoKLQkJCQlyZXR1cm4gaXNSb2xsdXAoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQkNXUzoKLQkJCQlyZXR1cm4gbmV3IEZsb2F0KGdldEJDV1MoKSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQkNXUDoKLQkJCQlyZXR1cm4gbmV3IEZsb2F0KGdldEJDV1AoKSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fUEhZU0lDQUxfUEVSQ0VOVF9DT01QTEVURToKLQkJCQlyZXR1cm4gZ2V0UGh5c2ljYWxQZXJjZW50Q29tcGxldGUoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19FQVJORURfVkFMVUVfTUVUSE9EOgotCQkJCXJldHVybiBnZXRFYXJuZWRWYWx1ZU1ldGhvZCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1BSRURFQ0VTU09SX0xJTks6Ci0JCQkJcmV0dXJuIGdldFByZWRlY2Vzc29yTGluaygpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0FDVFVBTF9XT1JLX1BST1RFQ1RFRDoKLQkJCQlyZXR1cm4gZ2V0QWN0dWFsV29ya1Byb3RlY3RlZCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0FDVFVBTF9PVkVSVElNRV9XT1JLX1BST1RFQ1RFRDoKLQkJCQlyZXR1cm4gZ2V0QWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fRVhURU5ERURfQVRUUklCVVRFOgotCQkJCXJldHVybiBnZXRFeHRlbmRlZEF0dHJpYnV0ZSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0JBU0VMSU5FOgotCQkJCXJldHVybiBnZXRCYXNlbGluZSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX09VVExJTkVfQ09ERToKLQkJCQlyZXR1cm4gZ2V0T3V0bGluZUNvZGUoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19USU1FUEhBU0VEX0RBVEE6Ci0JCQkJcmV0dXJuIGdldFRpbWVwaGFzZWREYXRhKCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1VJRDoKLQkJCQlzZXRVSUQoKEJpZ0ludGVnZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19JRDoKLQkJCQlzZXRJRCgoQmlnSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX05BTUU6Ci0JCQkJc2V0TmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fVFlQRToKLQkJCQlzZXRUeXBlKChCaWdJbnRlZ2VyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fSVNfTlVMTDoKLQkJCQlzZXRJc051bGwoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0NSRUFURV9EQVRFOgotCQkJCXNldENyZWF0ZURhdGUoKE9iamVjdCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0NPTlRBQ1Q6Ci0JCQkJc2V0Q29udGFjdCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fV0JTOgotCQkJCXNldFdCUygoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fV0JTX0xFVkVMOgotCQkJCXNldFdCU0xldmVsKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19PVVRMSU5FX05VTUJFUjoKLQkJCQlzZXRPdXRsaW5lTnVtYmVyKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19PVVRMSU5FX0xFVkVMOgotCQkJCXNldE91dGxpbmVMZXZlbCgoQmlnSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1BSSU9SSVRZOgotCQkJCXNldFByaW9yaXR5KChCaWdJbnRlZ2VyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fU1RBUlQ6Ci0JCQkJc2V0U3RhcnQoKE9iamVjdCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0ZJTklTSDoKLQkJCQlzZXRGaW5pc2goKE9iamVjdCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0RVUkFUSU9OOgotCQkJCXNldER1cmF0aW9uKChPYmplY3QpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19EVVJBVElPTl9GT1JNQVQ6Ci0JCQkJc2V0RHVyYXRpb25Gb3JtYXQoKEJpZ0ludGVnZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19XT1JLOgotCQkJCXNldFdvcmsoKE9iamVjdCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1NUT1A6Ci0JCQkJc2V0U3RvcCgoT2JqZWN0KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fUkVTVU1FOgotCQkJCXNldFJlc3VtZSgoT2JqZWN0KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fUkVTVU1FX1ZBTElEOgotCQkJCXNldFJlc3VtZVZhbGlkKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19FRkZPUlRfRFJJVkVOOgotCQkJCXNldEVmZm9ydERyaXZlbigoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fUkVDVVJSSU5HOgotCQkJCXNldFJlY3VycmluZygoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fT1ZFUl9BTExPQ0FURUQ6Ci0JCQkJc2V0T3ZlckFsbG9jYXRlZCgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fRVNUSU1BVEVEOgotCQkJCXNldEVzdGltYXRlZCgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fTUlMRVNUT05FOgotCQkJCXNldE1pbGVzdG9uZSgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fU1VNTUFSWToKLQkJCQlzZXRTdW1tYXJ5KCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19DUklUSUNBTDoKLQkJCQlzZXRDcml0aWNhbCgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fSVNfU1VCUFJPSkVDVDoKLQkJCQlzZXRJc1N1YnByb2plY3QoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0lTX1NVQlBST0pFQ1RfUkVBRF9PTkxZOgotCQkJCXNldElzU3VicHJvamVjdFJlYWRPbmx5KCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19TVUJQUk9KRUNUX05BTUU6Ci0JCQkJc2V0U3VicHJvamVjdE5hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0VYVEVSTkFMX1RBU0s6Ci0JCQkJc2V0RXh0ZXJuYWxUYXNrKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19FWFRFUk5BTF9UQVNLX1BST0pFQ1Q6Ci0JCQkJc2V0RXh0ZXJuYWxUYXNrUHJvamVjdCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fRUFSTFlfU1RBUlQ6Ci0JCQkJc2V0RWFybHlTdGFydCgoT2JqZWN0KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fRUFSTFlfRklOSVNIOgotCQkJCXNldEVhcmx5RmluaXNoKChPYmplY3QpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19MQVRFX1NUQVJUOgotCQkJCXNldExhdGVTdGFydCgoT2JqZWN0KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fTEFURV9GSU5JU0g6Ci0JCQkJc2V0TGF0ZUZpbmlzaCgoT2JqZWN0KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fU1RBUlRfVkFSSUFOQ0U6Ci0JCQkJc2V0U3RhcnRWYXJpYW5jZSgoQmlnSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0ZJTklTSF9WQVJJQU5DRToKLQkJCQlzZXRGaW5pc2hWYXJpYW5jZSgoQmlnSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1dPUktfVkFSSUFOQ0U6Ci0JCQkJc2V0V29ya1ZhcmlhbmNlKCgoRmxvYXQpbmV3VmFsdWUpLmZsb2F0VmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0ZSRUVfU0xBQ0s6Ci0JCQkJc2V0RnJlZVNsYWNrKChCaWdJbnRlZ2VyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fVE9UQUxfU0xBQ0s6Ci0JCQkJc2V0VG90YWxTbGFjaygoQmlnSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0ZJWEVEX0NPU1Q6Ci0JCQkJc2V0Rml4ZWRDb3N0KCgoRmxvYXQpbmV3VmFsdWUpLmZsb2F0VmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0ZJWEVEX0NPU1RfQUNDUlVBTDoKLQkJCQlzZXRGaXhlZENvc3RBY2NydWFsKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19QRVJDRU5UX0NPTVBMRVRFOgotCQkJCXNldFBlcmNlbnRDb21wbGV0ZSgoQmlnSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1BFUkNFTlRfV09SS19DT01QTEVURToKLQkJCQlzZXRQZXJjZW50V29ya0NvbXBsZXRlKChCaWdJbnRlZ2VyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQ09TVDoKLQkJCQlzZXRDb3N0KChCaWdEZWNpbWFsKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fT1ZFUlRJTUVfQ09TVDoKLQkJCQlzZXRPdmVydGltZUNvc3QoKEJpZ0RlY2ltYWwpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19PVkVSVElNRV9XT1JLOgotCQkJCXNldE92ZXJ0aW1lV29yaygoT2JqZWN0KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQUNUVUFMX1NUQVJUOgotCQkJCXNldEFjdHVhbFN0YXJ0KChPYmplY3QpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19BQ1RVQUxfRklOSVNIOgotCQkJCXNldEFjdHVhbEZpbmlzaCgoT2JqZWN0KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQUNUVUFMX0RVUkFUSU9OOgotCQkJCXNldEFjdHVhbER1cmF0aW9uKChPYmplY3QpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19BQ1RVQUxfQ09TVDoKLQkJCQlzZXRBY3R1YWxDb3N0KChCaWdEZWNpbWFsKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQUNUVUFMX09WRVJUSU1FX0NPU1Q6Ci0JCQkJc2V0QWN0dWFsT3ZlcnRpbWVDb3N0KChCaWdEZWNpbWFsKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQUNUVUFMX1dPUks6Ci0JCQkJc2V0QWN0dWFsV29yaygoT2JqZWN0KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQUNUVUFMX09WRVJUSU1FX1dPUks6Ci0JCQkJc2V0QWN0dWFsT3ZlcnRpbWVXb3JrKChPYmplY3QpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19SRUdVTEFSX1dPUks6Ci0JCQkJc2V0UmVndWxhcldvcmsoKE9iamVjdCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1JFTUFJTklOR19EVVJBVElPTjoKLQkJCQlzZXRSZW1haW5pbmdEdXJhdGlvbigoT2JqZWN0KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fUkVNQUlOSU5HX0NPU1Q6Ci0JCQkJc2V0UmVtYWluaW5nQ29zdCgoQmlnRGVjaW1hbCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1JFTUFJTklOR19XT1JLOgotCQkJCXNldFJlbWFpbmluZ1dvcmsoKE9iamVjdCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1JFTUFJTklOR19PVkVSVElNRV9DT1NUOgotCQkJCXNldFJlbWFpbmluZ092ZXJ0aW1lQ29zdCgoQmlnRGVjaW1hbCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1JFTUFJTklOR19PVkVSVElNRV9XT1JLOgotCQkJCXNldFJlbWFpbmluZ092ZXJ0aW1lV29yaygoT2JqZWN0KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQUNXUDoKLQkJCQlzZXRBQ1dQKCgoRmxvYXQpbmV3VmFsdWUpLmZsb2F0VmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0NWOgotCQkJCXNldENWKCgoRmxvYXQpbmV3VmFsdWUpLmZsb2F0VmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0NPTlNUUkFJTlRfVFlQRToKLQkJCQlzZXRDb25zdHJhaW50VHlwZSgoQmlnSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0NBTEVOREFSX1VJRDoKLQkJCQlzZXRDYWxlbmRhclVJRCgoQmlnSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0NPTlNUUkFJTlRfREFURToKLQkJCQlzZXRDb25zdHJhaW50RGF0ZSgoT2JqZWN0KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fREVBRExJTkU6Ci0JCQkJc2V0RGVhZGxpbmUoKE9iamVjdCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0xFVkVMX0FTU0lHTk1FTlRTOgotCQkJCXNldExldmVsQXNzaWdubWVudHMoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0xFVkVMSU5HX0NBTl9TUExJVDoKLQkJCQlzZXRMZXZlbGluZ0NhblNwbGl0KCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19MRVZFTElOR19ERUxBWToKLQkJCQlzZXRMZXZlbGluZ0RlbGF5KChCaWdJbnRlZ2VyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fTEVWRUxJTkdfREVMQVlfRk9STUFUOgotCQkJCXNldExldmVsaW5nRGVsYXlGb3JtYXQoKEJpZ0ludGVnZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19QUkVfTEVWRUxFRF9TVEFSVDoKLQkJCQlzZXRQcmVMZXZlbGVkU3RhcnQoKE9iamVjdCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1BSRV9MRVZFTEVEX0ZJTklTSDoKLQkJCQlzZXRQcmVMZXZlbGVkRmluaXNoKChPYmplY3QpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19IWVBFUkxJTks6Ci0JCQkJc2V0SHlwZXJsaW5rKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19IWVBFUkxJTktfQUREUkVTUzoKLQkJCQlzZXRIeXBlcmxpbmtBZGRyZXNzKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19IWVBFUkxJTktfU1VCX0FERFJFU1M6Ci0JCQkJc2V0SHlwZXJsaW5rU3ViQWRkcmVzcygoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fSUdOT1JFX1JFU09VUkNFX0NBTEVOREFSOgotCQkJCXNldElnbm9yZVJlc291cmNlQ2FsZW5kYXIoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX05PVEVTOgotCQkJCXNldE5vdGVzKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19ISURFX0JBUjoKLQkJCQlzZXRIaWRlQmFyKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19ST0xMVVA6Ci0JCQkJc2V0Um9sbHVwKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19CQ1dTOgotCQkJCXNldEJDV1MoKChGbG9hdCluZXdWYWx1ZSkuZmxvYXRWYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQkNXUDoKLQkJCQlzZXRCQ1dQKCgoRmxvYXQpbmV3VmFsdWUpLmZsb2F0VmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1BIWVNJQ0FMX1BFUkNFTlRfQ09NUExFVEU6Ci0JCQkJc2V0UGh5c2ljYWxQZXJjZW50Q29tcGxldGUoKEJpZ0ludGVnZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19FQVJORURfVkFMVUVfTUVUSE9EOgotCQkJCXNldEVhcm5lZFZhbHVlTWV0aG9kKChCaWdJbnRlZ2VyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fUFJFREVDRVNTT1JfTElOSzoKLQkJCQlnZXRQcmVkZWNlc3NvckxpbmsoKS5jbGVhcigpOwotCQkJCWdldFByZWRlY2Vzc29yTGluaygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0FDVFVBTF9XT1JLX1BST1RFQ1RFRDoKLQkJCQlzZXRBY3R1YWxXb3JrUHJvdGVjdGVkKChPYmplY3QpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19BQ1RVQUxfT1ZFUlRJTUVfV09SS19QUk9URUNURUQ6Ci0JCQkJc2V0QWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkKChPYmplY3QpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19FWFRFTkRFRF9BVFRSSUJVVEU6Ci0JCQkJZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUoKS5jbGVhcigpOwotCQkJCWdldEV4dGVuZGVkQXR0cmlidXRlKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQkFTRUxJTkU6Ci0JCQkJZ2V0QmFzZWxpbmUoKS5jbGVhcigpOwotCQkJCWdldEJhc2VsaW5lKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fT1VUTElORV9DT0RFOgotCQkJCWdldE91dGxpbmVDb2RlKCkuY2xlYXIoKTsKLQkJCQlnZXRPdXRsaW5lQ29kZSgpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1RJTUVQSEFTRURfREFUQToKLQkJCQlnZXRUaW1lcGhhc2VkRGF0YSgpLmNsZWFyKCk7Ci0JCQkJZ2V0VGltZXBoYXNlZERhdGEoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fVUlEOgotCQkJCXNldFVJRChVSURfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19JRDoKLQkJCQlzZXRJRChJRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX05BTUU6Ci0JCQkJc2V0TmFtZShOQU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fVFlQRToKLQkJCQlzZXRUeXBlKFRZUEVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19JU19OVUxMOgotCQkJCXVuc2V0SXNOdWxsKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0NSRUFURV9EQVRFOgotCQkJCXNldENyZWF0ZURhdGUoQ1JFQVRFX0RBVEVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19DT05UQUNUOgotCQkJCXNldENvbnRhY3QoQ09OVEFDVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1dCUzoKLQkJCQlzZXRXQlMoV0JTX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fV0JTX0xFVkVMOgotCQkJCXNldFdCU0xldmVsKFdCU19MRVZFTF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX09VVExJTkVfTlVNQkVSOgotCQkJCXNldE91dGxpbmVOdW1iZXIoT1VUTElORV9OVU1CRVJfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19PVVRMSU5FX0xFVkVMOgotCQkJCXNldE91dGxpbmVMZXZlbChPVVRMSU5FX0xFVkVMX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fUFJJT1JJVFk6Ci0JCQkJc2V0UHJpb3JpdHkoUFJJT1JJVFlfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19TVEFSVDoKLQkJCQlzZXRTdGFydChTVEFSVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0ZJTklTSDoKLQkJCQlzZXRGaW5pc2goRklOSVNIX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fRFVSQVRJT046Ci0JCQkJc2V0RHVyYXRpb24oRFVSQVRJT05fRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19EVVJBVElPTl9GT1JNQVQ6Ci0JCQkJc2V0RHVyYXRpb25Gb3JtYXQoRFVSQVRJT05fRk9STUFUX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fV09SSzoKLQkJCQlzZXRXb3JrKFdPUktfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19TVE9QOgotCQkJCXNldFN0b3AoU1RPUF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1JFU1VNRToKLQkJCQlzZXRSZXN1bWUoUkVTVU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fUkVTVU1FX1ZBTElEOgotCQkJCXVuc2V0UmVzdW1lVmFsaWQoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fRUZGT1JUX0RSSVZFTjoKLQkJCQl1bnNldEVmZm9ydERyaXZlbigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19SRUNVUlJJTkc6Ci0JCQkJdW5zZXRSZWN1cnJpbmcoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fT1ZFUl9BTExPQ0FURUQ6Ci0JCQkJdW5zZXRPdmVyQWxsb2NhdGVkKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0VTVElNQVRFRDoKLQkJCQl1bnNldEVzdGltYXRlZCgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19NSUxFU1RPTkU6Ci0JCQkJdW5zZXRNaWxlc3RvbmUoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fU1VNTUFSWToKLQkJCQl1bnNldFN1bW1hcnkoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQ1JJVElDQUw6Ci0JCQkJdW5zZXRDcml0aWNhbCgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19JU19TVUJQUk9KRUNUOgotCQkJCXVuc2V0SXNTdWJwcm9qZWN0KCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0lTX1NVQlBST0pFQ1RfUkVBRF9PTkxZOgotCQkJCXVuc2V0SXNTdWJwcm9qZWN0UmVhZE9ubHkoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fU1VCUFJPSkVDVF9OQU1FOgotCQkJCXNldFN1YnByb2plY3ROYW1lKFNVQlBST0pFQ1RfTkFNRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0VYVEVSTkFMX1RBU0s6Ci0JCQkJdW5zZXRFeHRlcm5hbFRhc2soKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fRVhURVJOQUxfVEFTS19QUk9KRUNUOgotCQkJCXNldEV4dGVybmFsVGFza1Byb2plY3QoRVhURVJOQUxfVEFTS19QUk9KRUNUX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fRUFSTFlfU1RBUlQ6Ci0JCQkJc2V0RWFybHlTdGFydChFQVJMWV9TVEFSVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0VBUkxZX0ZJTklTSDoKLQkJCQlzZXRFYXJseUZpbmlzaChFQVJMWV9GSU5JU0hfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19MQVRFX1NUQVJUOgotCQkJCXNldExhdGVTdGFydChMQVRFX1NUQVJUX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fTEFURV9GSU5JU0g6Ci0JCQkJc2V0TGF0ZUZpbmlzaChMQVRFX0ZJTklTSF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1NUQVJUX1ZBUklBTkNFOgotCQkJCXNldFN0YXJ0VmFyaWFuY2UoU1RBUlRfVkFSSUFOQ0VfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19GSU5JU0hfVkFSSUFOQ0U6Ci0JCQkJc2V0RmluaXNoVmFyaWFuY2UoRklOSVNIX1ZBUklBTkNFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fV09SS19WQVJJQU5DRToKLQkJCQl1bnNldFdvcmtWYXJpYW5jZSgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19GUkVFX1NMQUNLOgotCQkJCXNldEZyZWVTbGFjayhGUkVFX1NMQUNLX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fVE9UQUxfU0xBQ0s6Ci0JCQkJc2V0VG90YWxTbGFjayhUT1RBTF9TTEFDS19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0ZJWEVEX0NPU1Q6Ci0JCQkJdW5zZXRGaXhlZENvc3QoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fRklYRURfQ09TVF9BQ0NSVUFMOgotCQkJCXNldEZpeGVkQ29zdEFjY3J1YWwoRklYRURfQ09TVF9BQ0NSVUFMX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fUEVSQ0VOVF9DT01QTEVURToKLQkJCQlzZXRQZXJjZW50Q29tcGxldGUoUEVSQ0VOVF9DT01QTEVURV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1BFUkNFTlRfV09SS19DT01QTEVURToKLQkJCQlzZXRQZXJjZW50V29ya0NvbXBsZXRlKFBFUkNFTlRfV09SS19DT01QTEVURV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0NPU1Q6Ci0JCQkJc2V0Q29zdChDT1NUX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fT1ZFUlRJTUVfQ09TVDoKLQkJCQlzZXRPdmVydGltZUNvc3QoT1ZFUlRJTUVfQ09TVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX09WRVJUSU1FX1dPUks6Ci0JCQkJc2V0T3ZlcnRpbWVXb3JrKE9WRVJUSU1FX1dPUktfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19BQ1RVQUxfU1RBUlQ6Ci0JCQkJc2V0QWN0dWFsU3RhcnQoQUNUVUFMX1NUQVJUX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQUNUVUFMX0ZJTklTSDoKLQkJCQlzZXRBY3R1YWxGaW5pc2goQUNUVUFMX0ZJTklTSF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0FDVFVBTF9EVVJBVElPTjoKLQkJCQlzZXRBY3R1YWxEdXJhdGlvbihBQ1RVQUxfRFVSQVRJT05fRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19BQ1RVQUxfQ09TVDoKLQkJCQlzZXRBY3R1YWxDb3N0KEFDVFVBTF9DT1NUX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQUNUVUFMX09WRVJUSU1FX0NPU1Q6Ci0JCQkJc2V0QWN0dWFsT3ZlcnRpbWVDb3N0KEFDVFVBTF9PVkVSVElNRV9DT1NUX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQUNUVUFMX1dPUks6Ci0JCQkJc2V0QWN0dWFsV29yayhBQ1RVQUxfV09SS19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0FDVFVBTF9PVkVSVElNRV9XT1JLOgotCQkJCXNldEFjdHVhbE92ZXJ0aW1lV29yayhBQ1RVQUxfT1ZFUlRJTUVfV09SS19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1JFR1VMQVJfV09SSzoKLQkJCQlzZXRSZWd1bGFyV29yayhSRUdVTEFSX1dPUktfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19SRU1BSU5JTkdfRFVSQVRJT046Ci0JCQkJc2V0UmVtYWluaW5nRHVyYXRpb24oUkVNQUlOSU5HX0RVUkFUSU9OX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fUkVNQUlOSU5HX0NPU1Q6Ci0JCQkJc2V0UmVtYWluaW5nQ29zdChSRU1BSU5JTkdfQ09TVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1JFTUFJTklOR19XT1JLOgotCQkJCXNldFJlbWFpbmluZ1dvcmsoUkVNQUlOSU5HX1dPUktfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19SRU1BSU5JTkdfT1ZFUlRJTUVfQ09TVDoKLQkJCQlzZXRSZW1haW5pbmdPdmVydGltZUNvc3QoUkVNQUlOSU5HX09WRVJUSU1FX0NPU1RfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19SRU1BSU5JTkdfT1ZFUlRJTUVfV09SSzoKLQkJCQlzZXRSZW1haW5pbmdPdmVydGltZVdvcmsoUkVNQUlOSU5HX09WRVJUSU1FX1dPUktfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19BQ1dQOgotCQkJCXVuc2V0QUNXUCgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19DVjoKLQkJCQl1bnNldENWKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0NPTlNUUkFJTlRfVFlQRToKLQkJCQlzZXRDb25zdHJhaW50VHlwZShDT05TVFJBSU5UX1RZUEVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19DQUxFTkRBUl9VSUQ6Ci0JCQkJc2V0Q2FsZW5kYXJVSUQoQ0FMRU5EQVJfVUlEX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQ09OU1RSQUlOVF9EQVRFOgotCQkJCXNldENvbnN0cmFpbnREYXRlKENPTlNUUkFJTlRfREFURV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0RFQURMSU5FOgotCQkJCXNldERlYWRsaW5lKERFQURMSU5FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fTEVWRUxfQVNTSUdOTUVOVFM6Ci0JCQkJdW5zZXRMZXZlbEFzc2lnbm1lbnRzKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0xFVkVMSU5HX0NBTl9TUExJVDoKLQkJCQl1bnNldExldmVsaW5nQ2FuU3BsaXQoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fTEVWRUxJTkdfREVMQVk6Ci0JCQkJc2V0TGV2ZWxpbmdEZWxheShMRVZFTElOR19ERUxBWV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0xFVkVMSU5HX0RFTEFZX0ZPUk1BVDoKLQkJCQlzZXRMZXZlbGluZ0RlbGF5Rm9ybWF0KExFVkVMSU5HX0RFTEFZX0ZPUk1BVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1BSRV9MRVZFTEVEX1NUQVJUOgotCQkJCXNldFByZUxldmVsZWRTdGFydChQUkVfTEVWRUxFRF9TVEFSVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1BSRV9MRVZFTEVEX0ZJTklTSDoKLQkJCQlzZXRQcmVMZXZlbGVkRmluaXNoKFBSRV9MRVZFTEVEX0ZJTklTSF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0hZUEVSTElOSzoKLQkJCQlzZXRIeXBlcmxpbmsoSFlQRVJMSU5LX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fSFlQRVJMSU5LX0FERFJFU1M6Ci0JCQkJc2V0SHlwZXJsaW5rQWRkcmVzcyhIWVBFUkxJTktfQUREUkVTU19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0hZUEVSTElOS19TVUJfQUREUkVTUzoKLQkJCQlzZXRIeXBlcmxpbmtTdWJBZGRyZXNzKEhZUEVSTElOS19TVUJfQUREUkVTU19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0lHTk9SRV9SRVNPVVJDRV9DQUxFTkRBUjoKLQkJCQl1bnNldElnbm9yZVJlc291cmNlQ2FsZW5kYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fTk9URVM6Ci0JCQkJc2V0Tm90ZXMoTk9URVNfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19ISURFX0JBUjoKLQkJCQl1bnNldEhpZGVCYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fUk9MTFVQOgotCQkJCXVuc2V0Um9sbHVwKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0JDV1M6Ci0JCQkJdW5zZXRCQ1dTKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0JDV1A6Ci0JCQkJdW5zZXRCQ1dQKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1BIWVNJQ0FMX1BFUkNFTlRfQ09NUExFVEU6Ci0JCQkJc2V0UGh5c2ljYWxQZXJjZW50Q29tcGxldGUoUEhZU0lDQUxfUEVSQ0VOVF9DT01QTEVURV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0VBUk5FRF9WQUxVRV9NRVRIT0Q6Ci0JCQkJc2V0RWFybmVkVmFsdWVNZXRob2QoRUFSTkVEX1ZBTFVFX01FVEhPRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1BSRURFQ0VTU09SX0xJTks6Ci0JCQkJZ2V0UHJlZGVjZXNzb3JMaW5rKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQUNUVUFMX1dPUktfUFJPVEVDVEVEOgotCQkJCXNldEFjdHVhbFdvcmtQcm90ZWN0ZWQoQUNUVUFMX1dPUktfUFJPVEVDVEVEX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQUNUVUFMX09WRVJUSU1FX1dPUktfUFJPVEVDVEVEOgotCQkJCXNldEFjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZChBQ1RVQUxfT1ZFUlRJTUVfV09SS19QUk9URUNURURfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19FWFRFTkRFRF9BVFRSSUJVVEU6Ci0JCQkJZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19CQVNFTElORToKLQkJCQlnZXRCYXNlbGluZSgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX09VVExJTkVfQ09ERToKLQkJCQlnZXRPdXRsaW5lQ29kZSgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1RJTUVQSEFTRURfREFUQToKLQkJCQlnZXRUaW1lcGhhc2VkRGF0YSgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fVUlEOgotCQkJCXJldHVybiBVSURfRURFRkFVTFQgPT0gbnVsbCA/IHVJRCAhPSBudWxsIDogIVVJRF9FREVGQVVMVC5lcXVhbHModUlEKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19JRDoKLQkJCQlyZXR1cm4gSURfRURFRkFVTFQgPT0gbnVsbCA/IGlEICE9IG51bGwgOiAhSURfRURFRkFVTFQuZXF1YWxzKGlEKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19OQU1FOgotCQkJCXJldHVybiBOQU1FX0VERUZBVUxUID09IG51bGwgPyBuYW1lICE9IG51bGwgOiAhTkFNRV9FREVGQVVMVC5lcXVhbHMobmFtZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fVFlQRToKLQkJCQlyZXR1cm4gVFlQRV9FREVGQVVMVCA9PSBudWxsID8gdHlwZSAhPSBudWxsIDogIVRZUEVfRURFRkFVTFQuZXF1YWxzKHR5cGUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0lTX05VTEw6Ci0JCQkJcmV0dXJuIGlzU2V0SXNOdWxsKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQ1JFQVRFX0RBVEU6Ci0JCQkJcmV0dXJuIENSRUFURV9EQVRFX0VERUZBVUxUID09IG51bGwgPyBjcmVhdGVEYXRlICE9IG51bGwgOiAhQ1JFQVRFX0RBVEVfRURFRkFVTFQuZXF1YWxzKGNyZWF0ZURhdGUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0NPTlRBQ1Q6Ci0JCQkJcmV0dXJuIENPTlRBQ1RfRURFRkFVTFQgPT0gbnVsbCA/IGNvbnRhY3QgIT0gbnVsbCA6ICFDT05UQUNUX0VERUZBVUxULmVxdWFscyhjb250YWN0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19XQlM6Ci0JCQkJcmV0dXJuIFdCU19FREVGQVVMVCA9PSBudWxsID8gd0JTICE9IG51bGwgOiAhV0JTX0VERUZBVUxULmVxdWFscyh3QlMpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1dCU19MRVZFTDoKLQkJCQlyZXR1cm4gV0JTX0xFVkVMX0VERUZBVUxUID09IG51bGwgPyB3QlNMZXZlbCAhPSBudWxsIDogIVdCU19MRVZFTF9FREVGQVVMVC5lcXVhbHMod0JTTGV2ZWwpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX09VVExJTkVfTlVNQkVSOgotCQkJCXJldHVybiBPVVRMSU5FX05VTUJFUl9FREVGQVVMVCA9PSBudWxsID8gb3V0bGluZU51bWJlciAhPSBudWxsIDogIU9VVExJTkVfTlVNQkVSX0VERUZBVUxULmVxdWFscyhvdXRsaW5lTnVtYmVyKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19PVVRMSU5FX0xFVkVMOgotCQkJCXJldHVybiBPVVRMSU5FX0xFVkVMX0VERUZBVUxUID09IG51bGwgPyBvdXRsaW5lTGV2ZWwgIT0gbnVsbCA6ICFPVVRMSU5FX0xFVkVMX0VERUZBVUxULmVxdWFscyhvdXRsaW5lTGV2ZWwpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1BSSU9SSVRZOgotCQkJCXJldHVybiBQUklPUklUWV9FREVGQVVMVCA9PSBudWxsID8gcHJpb3JpdHkgIT0gbnVsbCA6ICFQUklPUklUWV9FREVGQVVMVC5lcXVhbHMocHJpb3JpdHkpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1NUQVJUOgotCQkJCXJldHVybiBTVEFSVF9FREVGQVVMVCA9PSBudWxsID8gc3RhcnQgIT0gbnVsbCA6ICFTVEFSVF9FREVGQVVMVC5lcXVhbHMoc3RhcnQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0ZJTklTSDoKLQkJCQlyZXR1cm4gRklOSVNIX0VERUZBVUxUID09IG51bGwgPyBmaW5pc2ggIT0gbnVsbCA6ICFGSU5JU0hfRURFRkFVTFQuZXF1YWxzKGZpbmlzaCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fRFVSQVRJT046Ci0JCQkJcmV0dXJuIERVUkFUSU9OX0VERUZBVUxUID09IG51bGwgPyBkdXJhdGlvbiAhPSBudWxsIDogIURVUkFUSU9OX0VERUZBVUxULmVxdWFscyhkdXJhdGlvbik7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fRFVSQVRJT05fRk9STUFUOgotCQkJCXJldHVybiBEVVJBVElPTl9GT1JNQVRfRURFRkFVTFQgPT0gbnVsbCA/IGR1cmF0aW9uRm9ybWF0ICE9IG51bGwgOiAhRFVSQVRJT05fRk9STUFUX0VERUZBVUxULmVxdWFscyhkdXJhdGlvbkZvcm1hdCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fV09SSzoKLQkJCQlyZXR1cm4gV09SS19FREVGQVVMVCA9PSBudWxsID8gd29yayAhPSBudWxsIDogIVdPUktfRURFRkFVTFQuZXF1YWxzKHdvcmspOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1NUT1A6Ci0JCQkJcmV0dXJuIFNUT1BfRURFRkFVTFQgPT0gbnVsbCA/IHN0b3AgIT0gbnVsbCA6ICFTVE9QX0VERUZBVUxULmVxdWFscyhzdG9wKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19SRVNVTUU6Ci0JCQkJcmV0dXJuIFJFU1VNRV9FREVGQVVMVCA9PSBudWxsID8gcmVzdW1lICE9IG51bGwgOiAhUkVTVU1FX0VERUZBVUxULmVxdWFscyhyZXN1bWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1JFU1VNRV9WQUxJRDoKLQkJCQlyZXR1cm4gaXNTZXRSZXN1bWVWYWxpZCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0VGRk9SVF9EUklWRU46Ci0JCQkJcmV0dXJuIGlzU2V0RWZmb3J0RHJpdmVuKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fUkVDVVJSSU5HOgotCQkJCXJldHVybiBpc1NldFJlY3VycmluZygpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX09WRVJfQUxMT0NBVEVEOgotCQkJCXJldHVybiBpc1NldE92ZXJBbGxvY2F0ZWQoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19FU1RJTUFURUQ6Ci0JCQkJcmV0dXJuIGlzU2V0RXN0aW1hdGVkKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fTUlMRVNUT05FOgotCQkJCXJldHVybiBpc1NldE1pbGVzdG9uZSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1NVTU1BUlk6Ci0JCQkJcmV0dXJuIGlzU2V0U3VtbWFyeSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0NSSVRJQ0FMOgotCQkJCXJldHVybiBpc1NldENyaXRpY2FsKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fSVNfU1VCUFJPSkVDVDoKLQkJCQlyZXR1cm4gaXNTZXRJc1N1YnByb2plY3QoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19JU19TVUJQUk9KRUNUX1JFQURfT05MWToKLQkJCQlyZXR1cm4gaXNTZXRJc1N1YnByb2plY3RSZWFkT25seSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1NVQlBST0pFQ1RfTkFNRToKLQkJCQlyZXR1cm4gU1VCUFJPSkVDVF9OQU1FX0VERUZBVUxUID09IG51bGwgPyBzdWJwcm9qZWN0TmFtZSAhPSBudWxsIDogIVNVQlBST0pFQ1RfTkFNRV9FREVGQVVMVC5lcXVhbHMoc3VicHJvamVjdE5hbWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0VYVEVSTkFMX1RBU0s6Ci0JCQkJcmV0dXJuIGlzU2V0RXh0ZXJuYWxUYXNrKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fRVhURVJOQUxfVEFTS19QUk9KRUNUOgotCQkJCXJldHVybiBFWFRFUk5BTF9UQVNLX1BST0pFQ1RfRURFRkFVTFQgPT0gbnVsbCA/IGV4dGVybmFsVGFza1Byb2plY3QgIT0gbnVsbCA6ICFFWFRFUk5BTF9UQVNLX1BST0pFQ1RfRURFRkFVTFQuZXF1YWxzKGV4dGVybmFsVGFza1Byb2plY3QpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0VBUkxZX1NUQVJUOgotCQkJCXJldHVybiBFQVJMWV9TVEFSVF9FREVGQVVMVCA9PSBudWxsID8gZWFybHlTdGFydCAhPSBudWxsIDogIUVBUkxZX1NUQVJUX0VERUZBVUxULmVxdWFscyhlYXJseVN0YXJ0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19FQVJMWV9GSU5JU0g6Ci0JCQkJcmV0dXJuIEVBUkxZX0ZJTklTSF9FREVGQVVMVCA9PSBudWxsID8gZWFybHlGaW5pc2ggIT0gbnVsbCA6ICFFQVJMWV9GSU5JU0hfRURFRkFVTFQuZXF1YWxzKGVhcmx5RmluaXNoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19MQVRFX1NUQVJUOgotCQkJCXJldHVybiBMQVRFX1NUQVJUX0VERUZBVUxUID09IG51bGwgPyBsYXRlU3RhcnQgIT0gbnVsbCA6ICFMQVRFX1NUQVJUX0VERUZBVUxULmVxdWFscyhsYXRlU3RhcnQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0xBVEVfRklOSVNIOgotCQkJCXJldHVybiBMQVRFX0ZJTklTSF9FREVGQVVMVCA9PSBudWxsID8gbGF0ZUZpbmlzaCAhPSBudWxsIDogIUxBVEVfRklOSVNIX0VERUZBVUxULmVxdWFscyhsYXRlRmluaXNoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19TVEFSVF9WQVJJQU5DRToKLQkJCQlyZXR1cm4gU1RBUlRfVkFSSUFOQ0VfRURFRkFVTFQgPT0gbnVsbCA/IHN0YXJ0VmFyaWFuY2UgIT0gbnVsbCA6ICFTVEFSVF9WQVJJQU5DRV9FREVGQVVMVC5lcXVhbHMoc3RhcnRWYXJpYW5jZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fRklOSVNIX1ZBUklBTkNFOgotCQkJCXJldHVybiBGSU5JU0hfVkFSSUFOQ0VfRURFRkFVTFQgPT0gbnVsbCA/IGZpbmlzaFZhcmlhbmNlICE9IG51bGwgOiAhRklOSVNIX1ZBUklBTkNFX0VERUZBVUxULmVxdWFscyhmaW5pc2hWYXJpYW5jZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fV09SS19WQVJJQU5DRToKLQkJCQlyZXR1cm4gaXNTZXRXb3JrVmFyaWFuY2UoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19GUkVFX1NMQUNLOgotCQkJCXJldHVybiBGUkVFX1NMQUNLX0VERUZBVUxUID09IG51bGwgPyBmcmVlU2xhY2sgIT0gbnVsbCA6ICFGUkVFX1NMQUNLX0VERUZBVUxULmVxdWFscyhmcmVlU2xhY2spOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1RPVEFMX1NMQUNLOgotCQkJCXJldHVybiBUT1RBTF9TTEFDS19FREVGQVVMVCA9PSBudWxsID8gdG90YWxTbGFjayAhPSBudWxsIDogIVRPVEFMX1NMQUNLX0VERUZBVUxULmVxdWFscyh0b3RhbFNsYWNrKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19GSVhFRF9DT1NUOgotCQkJCXJldHVybiBpc1NldEZpeGVkQ29zdCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0ZJWEVEX0NPU1RfQUNDUlVBTDoKLQkJCQlyZXR1cm4gRklYRURfQ09TVF9BQ0NSVUFMX0VERUZBVUxUID09IG51bGwgPyBmaXhlZENvc3RBY2NydWFsICE9IG51bGwgOiAhRklYRURfQ09TVF9BQ0NSVUFMX0VERUZBVUxULmVxdWFscyhmaXhlZENvc3RBY2NydWFsKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19QRVJDRU5UX0NPTVBMRVRFOgotCQkJCXJldHVybiBQRVJDRU5UX0NPTVBMRVRFX0VERUZBVUxUID09IG51bGwgPyBwZXJjZW50Q29tcGxldGUgIT0gbnVsbCA6ICFQRVJDRU5UX0NPTVBMRVRFX0VERUZBVUxULmVxdWFscyhwZXJjZW50Q29tcGxldGUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1BFUkNFTlRfV09SS19DT01QTEVURToKLQkJCQlyZXR1cm4gUEVSQ0VOVF9XT1JLX0NPTVBMRVRFX0VERUZBVUxUID09IG51bGwgPyBwZXJjZW50V29ya0NvbXBsZXRlICE9IG51bGwgOiAhUEVSQ0VOVF9XT1JLX0NPTVBMRVRFX0VERUZBVUxULmVxdWFscyhwZXJjZW50V29ya0NvbXBsZXRlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19DT1NUOgotCQkJCXJldHVybiBDT1NUX0VERUZBVUxUID09IG51bGwgPyBjb3N0ICE9IG51bGwgOiAhQ09TVF9FREVGQVVMVC5lcXVhbHMoY29zdCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fT1ZFUlRJTUVfQ09TVDoKLQkJCQlyZXR1cm4gT1ZFUlRJTUVfQ09TVF9FREVGQVVMVCA9PSBudWxsID8gb3ZlcnRpbWVDb3N0ICE9IG51bGwgOiAhT1ZFUlRJTUVfQ09TVF9FREVGQVVMVC5lcXVhbHMob3ZlcnRpbWVDb3N0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19PVkVSVElNRV9XT1JLOgotCQkJCXJldHVybiBPVkVSVElNRV9XT1JLX0VERUZBVUxUID09IG51bGwgPyBvdmVydGltZVdvcmsgIT0gbnVsbCA6ICFPVkVSVElNRV9XT1JLX0VERUZBVUxULmVxdWFscyhvdmVydGltZVdvcmspOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0FDVFVBTF9TVEFSVDoKLQkJCQlyZXR1cm4gQUNUVUFMX1NUQVJUX0VERUZBVUxUID09IG51bGwgPyBhY3R1YWxTdGFydCAhPSBudWxsIDogIUFDVFVBTF9TVEFSVF9FREVGQVVMVC5lcXVhbHMoYWN0dWFsU3RhcnQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0FDVFVBTF9GSU5JU0g6Ci0JCQkJcmV0dXJuIEFDVFVBTF9GSU5JU0hfRURFRkFVTFQgPT0gbnVsbCA/IGFjdHVhbEZpbmlzaCAhPSBudWxsIDogIUFDVFVBTF9GSU5JU0hfRURFRkFVTFQuZXF1YWxzKGFjdHVhbEZpbmlzaCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQUNUVUFMX0RVUkFUSU9OOgotCQkJCXJldHVybiBBQ1RVQUxfRFVSQVRJT05fRURFRkFVTFQgPT0gbnVsbCA/IGFjdHVhbER1cmF0aW9uICE9IG51bGwgOiAhQUNUVUFMX0RVUkFUSU9OX0VERUZBVUxULmVxdWFscyhhY3R1YWxEdXJhdGlvbik7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQUNUVUFMX0NPU1Q6Ci0JCQkJcmV0dXJuIEFDVFVBTF9DT1NUX0VERUZBVUxUID09IG51bGwgPyBhY3R1YWxDb3N0ICE9IG51bGwgOiAhQUNUVUFMX0NPU1RfRURFRkFVTFQuZXF1YWxzKGFjdHVhbENvc3QpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0FDVFVBTF9PVkVSVElNRV9DT1NUOgotCQkJCXJldHVybiBBQ1RVQUxfT1ZFUlRJTUVfQ09TVF9FREVGQVVMVCA9PSBudWxsID8gYWN0dWFsT3ZlcnRpbWVDb3N0ICE9IG51bGwgOiAhQUNUVUFMX09WRVJUSU1FX0NPU1RfRURFRkFVTFQuZXF1YWxzKGFjdHVhbE92ZXJ0aW1lQ29zdCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQUNUVUFMX1dPUks6Ci0JCQkJcmV0dXJuIEFDVFVBTF9XT1JLX0VERUZBVUxUID09IG51bGwgPyBhY3R1YWxXb3JrICE9IG51bGwgOiAhQUNUVUFMX1dPUktfRURFRkFVTFQuZXF1YWxzKGFjdHVhbFdvcmspOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0FDVFVBTF9PVkVSVElNRV9XT1JLOgotCQkJCXJldHVybiBBQ1RVQUxfT1ZFUlRJTUVfV09SS19FREVGQVVMVCA9PSBudWxsID8gYWN0dWFsT3ZlcnRpbWVXb3JrICE9IG51bGwgOiAhQUNUVUFMX09WRVJUSU1FX1dPUktfRURFRkFVTFQuZXF1YWxzKGFjdHVhbE92ZXJ0aW1lV29yayk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fUkVHVUxBUl9XT1JLOgotCQkJCXJldHVybiBSRUdVTEFSX1dPUktfRURFRkFVTFQgPT0gbnVsbCA/IHJlZ3VsYXJXb3JrICE9IG51bGwgOiAhUkVHVUxBUl9XT1JLX0VERUZBVUxULmVxdWFscyhyZWd1bGFyV29yayk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fUkVNQUlOSU5HX0RVUkFUSU9OOgotCQkJCXJldHVybiBSRU1BSU5JTkdfRFVSQVRJT05fRURFRkFVTFQgPT0gbnVsbCA/IHJlbWFpbmluZ0R1cmF0aW9uICE9IG51bGwgOiAhUkVNQUlOSU5HX0RVUkFUSU9OX0VERUZBVUxULmVxdWFscyhyZW1haW5pbmdEdXJhdGlvbik7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fUkVNQUlOSU5HX0NPU1Q6Ci0JCQkJcmV0dXJuIFJFTUFJTklOR19DT1NUX0VERUZBVUxUID09IG51bGwgPyByZW1haW5pbmdDb3N0ICE9IG51bGwgOiAhUkVNQUlOSU5HX0NPU1RfRURFRkFVTFQuZXF1YWxzKHJlbWFpbmluZ0Nvc3QpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1JFTUFJTklOR19XT1JLOgotCQkJCXJldHVybiBSRU1BSU5JTkdfV09SS19FREVGQVVMVCA9PSBudWxsID8gcmVtYWluaW5nV29yayAhPSBudWxsIDogIVJFTUFJTklOR19XT1JLX0VERUZBVUxULmVxdWFscyhyZW1haW5pbmdXb3JrKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19SRU1BSU5JTkdfT1ZFUlRJTUVfQ09TVDoKLQkJCQlyZXR1cm4gUkVNQUlOSU5HX09WRVJUSU1FX0NPU1RfRURFRkFVTFQgPT0gbnVsbCA/IHJlbWFpbmluZ092ZXJ0aW1lQ29zdCAhPSBudWxsIDogIVJFTUFJTklOR19PVkVSVElNRV9DT1NUX0VERUZBVUxULmVxdWFscyhyZW1haW5pbmdPdmVydGltZUNvc3QpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1JFTUFJTklOR19PVkVSVElNRV9XT1JLOgotCQkJCXJldHVybiBSRU1BSU5JTkdfT1ZFUlRJTUVfV09SS19FREVGQVVMVCA9PSBudWxsID8gcmVtYWluaW5nT3ZlcnRpbWVXb3JrICE9IG51bGwgOiAhUkVNQUlOSU5HX09WRVJUSU1FX1dPUktfRURFRkFVTFQuZXF1YWxzKHJlbWFpbmluZ092ZXJ0aW1lV29yayk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQUNXUDoKLQkJCQlyZXR1cm4gaXNTZXRBQ1dQKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQ1Y6Ci0JCQkJcmV0dXJuIGlzU2V0Q1YoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19DT05TVFJBSU5UX1RZUEU6Ci0JCQkJcmV0dXJuIENPTlNUUkFJTlRfVFlQRV9FREVGQVVMVCA9PSBudWxsID8gY29uc3RyYWludFR5cGUgIT0gbnVsbCA6ICFDT05TVFJBSU5UX1RZUEVfRURFRkFVTFQuZXF1YWxzKGNvbnN0cmFpbnRUeXBlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19DQUxFTkRBUl9VSUQ6Ci0JCQkJcmV0dXJuIENBTEVOREFSX1VJRF9FREVGQVVMVCA9PSBudWxsID8gY2FsZW5kYXJVSUQgIT0gbnVsbCA6ICFDQUxFTkRBUl9VSURfRURFRkFVTFQuZXF1YWxzKGNhbGVuZGFyVUlEKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19DT05TVFJBSU5UX0RBVEU6Ci0JCQkJcmV0dXJuIENPTlNUUkFJTlRfREFURV9FREVGQVVMVCA9PSBudWxsID8gY29uc3RyYWludERhdGUgIT0gbnVsbCA6ICFDT05TVFJBSU5UX0RBVEVfRURFRkFVTFQuZXF1YWxzKGNvbnN0cmFpbnREYXRlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19ERUFETElORToKLQkJCQlyZXR1cm4gREVBRExJTkVfRURFRkFVTFQgPT0gbnVsbCA/IGRlYWRsaW5lICE9IG51bGwgOiAhREVBRExJTkVfRURFRkFVTFQuZXF1YWxzKGRlYWRsaW5lKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19MRVZFTF9BU1NJR05NRU5UUzoKLQkJCQlyZXR1cm4gaXNTZXRMZXZlbEFzc2lnbm1lbnRzKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fTEVWRUxJTkdfQ0FOX1NQTElUOgotCQkJCXJldHVybiBpc1NldExldmVsaW5nQ2FuU3BsaXQoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19MRVZFTElOR19ERUxBWToKLQkJCQlyZXR1cm4gTEVWRUxJTkdfREVMQVlfRURFRkFVTFQgPT0gbnVsbCA/IGxldmVsaW5nRGVsYXkgIT0gbnVsbCA6ICFMRVZFTElOR19ERUxBWV9FREVGQVVMVC5lcXVhbHMobGV2ZWxpbmdEZWxheSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fTEVWRUxJTkdfREVMQVlfRk9STUFUOgotCQkJCXJldHVybiBMRVZFTElOR19ERUxBWV9GT1JNQVRfRURFRkFVTFQgPT0gbnVsbCA/IGxldmVsaW5nRGVsYXlGb3JtYXQgIT0gbnVsbCA6ICFMRVZFTElOR19ERUxBWV9GT1JNQVRfRURFRkFVTFQuZXF1YWxzKGxldmVsaW5nRGVsYXlGb3JtYXQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1BSRV9MRVZFTEVEX1NUQVJUOgotCQkJCXJldHVybiBQUkVfTEVWRUxFRF9TVEFSVF9FREVGQVVMVCA9PSBudWxsID8gcHJlTGV2ZWxlZFN0YXJ0ICE9IG51bGwgOiAhUFJFX0xFVkVMRURfU1RBUlRfRURFRkFVTFQuZXF1YWxzKHByZUxldmVsZWRTdGFydCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fUFJFX0xFVkVMRURfRklOSVNIOgotCQkJCXJldHVybiBQUkVfTEVWRUxFRF9GSU5JU0hfRURFRkFVTFQgPT0gbnVsbCA/IHByZUxldmVsZWRGaW5pc2ggIT0gbnVsbCA6ICFQUkVfTEVWRUxFRF9GSU5JU0hfRURFRkFVTFQuZXF1YWxzKHByZUxldmVsZWRGaW5pc2gpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0hZUEVSTElOSzoKLQkJCQlyZXR1cm4gSFlQRVJMSU5LX0VERUZBVUxUID09IG51bGwgPyBoeXBlcmxpbmsgIT0gbnVsbCA6ICFIWVBFUkxJTktfRURFRkFVTFQuZXF1YWxzKGh5cGVybGluayk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fSFlQRVJMSU5LX0FERFJFU1M6Ci0JCQkJcmV0dXJuIEhZUEVSTElOS19BRERSRVNTX0VERUZBVUxUID09IG51bGwgPyBoeXBlcmxpbmtBZGRyZXNzICE9IG51bGwgOiAhSFlQRVJMSU5LX0FERFJFU1NfRURFRkFVTFQuZXF1YWxzKGh5cGVybGlua0FkZHJlc3MpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0hZUEVSTElOS19TVUJfQUREUkVTUzoKLQkJCQlyZXR1cm4gSFlQRVJMSU5LX1NVQl9BRERSRVNTX0VERUZBVUxUID09IG51bGwgPyBoeXBlcmxpbmtTdWJBZGRyZXNzICE9IG51bGwgOiAhSFlQRVJMSU5LX1NVQl9BRERSRVNTX0VERUZBVUxULmVxdWFscyhoeXBlcmxpbmtTdWJBZGRyZXNzKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19JR05PUkVfUkVTT1VSQ0VfQ0FMRU5EQVI6Ci0JCQkJcmV0dXJuIGlzU2V0SWdub3JlUmVzb3VyY2VDYWxlbmRhcigpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX05PVEVTOgotCQkJCXJldHVybiBOT1RFU19FREVGQVVMVCA9PSBudWxsID8gbm90ZXMgIT0gbnVsbCA6ICFOT1RFU19FREVGQVVMVC5lcXVhbHMobm90ZXMpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0hJREVfQkFSOgotCQkJCXJldHVybiBpc1NldEhpZGVCYXIoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19ST0xMVVA6Ci0JCQkJcmV0dXJuIGlzU2V0Um9sbHVwKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQkNXUzoKLQkJCQlyZXR1cm4gaXNTZXRCQ1dTKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQkNXUDoKLQkJCQlyZXR1cm4gaXNTZXRCQ1dQKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fUEhZU0lDQUxfUEVSQ0VOVF9DT01QTEVURToKLQkJCQlyZXR1cm4gUEhZU0lDQUxfUEVSQ0VOVF9DT01QTEVURV9FREVGQVVMVCA9PSBudWxsID8gcGh5c2ljYWxQZXJjZW50Q29tcGxldGUgIT0gbnVsbCA6ICFQSFlTSUNBTF9QRVJDRU5UX0NPTVBMRVRFX0VERUZBVUxULmVxdWFscyhwaHlzaWNhbFBlcmNlbnRDb21wbGV0ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fRUFSTkVEX1ZBTFVFX01FVEhPRDoKLQkJCQlyZXR1cm4gRUFSTkVEX1ZBTFVFX01FVEhPRF9FREVGQVVMVCA9PSBudWxsID8gZWFybmVkVmFsdWVNZXRob2QgIT0gbnVsbCA6ICFFQVJORURfVkFMVUVfTUVUSE9EX0VERUZBVUxULmVxdWFscyhlYXJuZWRWYWx1ZU1ldGhvZCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fUFJFREVDRVNTT1JfTElOSzoKLQkJCQlyZXR1cm4gcHJlZGVjZXNzb3JMaW5rICE9IG51bGwgJiYgIXByZWRlY2Vzc29yTGluay5pc0VtcHR5KCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQUNUVUFMX1dPUktfUFJPVEVDVEVEOgotCQkJCXJldHVybiBBQ1RVQUxfV09SS19QUk9URUNURURfRURFRkFVTFQgPT0gbnVsbCA/IGFjdHVhbFdvcmtQcm90ZWN0ZWQgIT0gbnVsbCA6ICFBQ1RVQUxfV09SS19QUk9URUNURURfRURFRkFVTFQuZXF1YWxzKGFjdHVhbFdvcmtQcm90ZWN0ZWQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0FDVFVBTF9PVkVSVElNRV9XT1JLX1BST1RFQ1RFRDoKLQkJCQlyZXR1cm4gQUNUVUFMX09WRVJUSU1FX1dPUktfUFJPVEVDVEVEX0VERUZBVUxUID09IG51bGwgPyBhY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQgIT0gbnVsbCA6ICFBQ1RVQUxfT1ZFUlRJTUVfV09SS19QUk9URUNURURfRURFRkFVTFQuZXF1YWxzKGFjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fRVhURU5ERURfQVRUUklCVVRFOgotCQkJCXJldHVybiBleHRlbmRlZEF0dHJpYnV0ZSAhPSBudWxsICYmICFleHRlbmRlZEF0dHJpYnV0ZS5pc0VtcHR5KCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQkFTRUxJTkU6Ci0JCQkJcmV0dXJuIGJhc2VsaW5lICE9IG51bGwgJiYgIWJhc2VsaW5lLmlzRW1wdHkoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19PVVRMSU5FX0NPREU6Ci0JCQkJcmV0dXJuIG91dGxpbmVDb2RlICE9IG51bGwgJiYgIW91dGxpbmVDb2RlLmlzRW1wdHkoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19USU1FUEhBU0VEX0RBVEE6Ci0JCQkJcmV0dXJuIHRpbWVwaGFzZWREYXRhICE9IG51bGwgJiYgIXRpbWVwaGFzZWREYXRhLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHVJRDogIik7Ci0JCXJlc3VsdC5hcHBlbmQodUlEKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBpRDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoaUQpOwotCQlyZXN1bHQuYXBwZW5kKCIsIG5hbWU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKG5hbWUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHR5cGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHR5cGUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGlzTnVsbDogIik7Ci0JCWlmIChpc051bGxFU2V0KSByZXN1bHQuYXBwZW5kKGlzTnVsbCk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGNyZWF0ZURhdGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGNyZWF0ZURhdGUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGNvbnRhY3Q6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGNvbnRhY3QpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHdCUzogIik7Ci0JCXJlc3VsdC5hcHBlbmQod0JTKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCB3QlNMZXZlbDogIik7Ci0JCXJlc3VsdC5hcHBlbmQod0JTTGV2ZWwpOwotCQlyZXN1bHQuYXBwZW5kKCIsIG91dGxpbmVOdW1iZXI6ICIpOwotCQlyZXN1bHQuYXBwZW5kKG91dGxpbmVOdW1iZXIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIG91dGxpbmVMZXZlbDogIik7Ci0JCXJlc3VsdC5hcHBlbmQob3V0bGluZUxldmVsKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBwcmlvcml0eTogIik7Ci0JCXJlc3VsdC5hcHBlbmQocHJpb3JpdHkpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHN0YXJ0OiAiKTsKLQkJcmVzdWx0LmFwcGVuZChzdGFydCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZmluaXNoOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChmaW5pc2gpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGR1cmF0aW9uOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChkdXJhdGlvbik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZHVyYXRpb25Gb3JtYXQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGR1cmF0aW9uRm9ybWF0KTsKLQkJcmVzdWx0LmFwcGVuZCgiLCB3b3JrOiAiKTsKLQkJcmVzdWx0LmFwcGVuZCh3b3JrKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBzdG9wOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChzdG9wKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCByZXN1bWU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHJlc3VtZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcmVzdW1lVmFsaWQ6ICIpOwotCQlpZiAocmVzdW1lVmFsaWRFU2V0KSByZXN1bHQuYXBwZW5kKHJlc3VtZVZhbGlkKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZWZmb3J0RHJpdmVuOiAiKTsKLQkJaWYgKGVmZm9ydERyaXZlbkVTZXQpIHJlc3VsdC5hcHBlbmQoZWZmb3J0RHJpdmVuKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcmVjdXJyaW5nOiAiKTsKLQkJaWYgKHJlY3VycmluZ0VTZXQpIHJlc3VsdC5hcHBlbmQocmVjdXJyaW5nKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgb3ZlckFsbG9jYXRlZDogIik7Ci0JCWlmIChvdmVyQWxsb2NhdGVkRVNldCkgcmVzdWx0LmFwcGVuZChvdmVyQWxsb2NhdGVkKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZXN0aW1hdGVkOiAiKTsKLQkJaWYgKGVzdGltYXRlZEVTZXQpIHJlc3VsdC5hcHBlbmQoZXN0aW1hdGVkKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgbWlsZXN0b25lOiAiKTsKLQkJaWYgKG1pbGVzdG9uZUVTZXQpIHJlc3VsdC5hcHBlbmQobWlsZXN0b25lKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgc3VtbWFyeTogIik7Ci0JCWlmIChzdW1tYXJ5RVNldCkgcmVzdWx0LmFwcGVuZChzdW1tYXJ5KTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgY3JpdGljYWw6ICIpOwotCQlpZiAoY3JpdGljYWxFU2V0KSByZXN1bHQuYXBwZW5kKGNyaXRpY2FsKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgaXNTdWJwcm9qZWN0OiAiKTsKLQkJaWYgKGlzU3VicHJvamVjdEVTZXQpIHJlc3VsdC5hcHBlbmQoaXNTdWJwcm9qZWN0KTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgaXNTdWJwcm9qZWN0UmVhZE9ubHk6ICIpOwotCQlpZiAoaXNTdWJwcm9qZWN0UmVhZE9ubHlFU2V0KSByZXN1bHQuYXBwZW5kKGlzU3VicHJvamVjdFJlYWRPbmx5KTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgc3VicHJvamVjdE5hbWU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHN1YnByb2plY3ROYW1lKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBleHRlcm5hbFRhc2s6ICIpOwotCQlpZiAoZXh0ZXJuYWxUYXNrRVNldCkgcmVzdWx0LmFwcGVuZChleHRlcm5hbFRhc2spOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBleHRlcm5hbFRhc2tQcm9qZWN0OiAiKTsKLQkJcmVzdWx0LmFwcGVuZChleHRlcm5hbFRhc2tQcm9qZWN0KTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBlYXJseVN0YXJ0OiAiKTsKLQkJcmVzdWx0LmFwcGVuZChlYXJseVN0YXJ0KTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBlYXJseUZpbmlzaDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZWFybHlGaW5pc2gpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGxhdGVTdGFydDogIik7Ci0JCXJlc3VsdC5hcHBlbmQobGF0ZVN0YXJ0KTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBsYXRlRmluaXNoOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChsYXRlRmluaXNoKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBzdGFydFZhcmlhbmNlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChzdGFydFZhcmlhbmNlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBmaW5pc2hWYXJpYW5jZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZmluaXNoVmFyaWFuY2UpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHdvcmtWYXJpYW5jZTogIik7Ci0JCWlmICh3b3JrVmFyaWFuY2VFU2V0KSByZXN1bHQuYXBwZW5kKHdvcmtWYXJpYW5jZSk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGZyZWVTbGFjazogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZnJlZVNsYWNrKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCB0b3RhbFNsYWNrOiAiKTsKLQkJcmVzdWx0LmFwcGVuZCh0b3RhbFNsYWNrKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBmaXhlZENvc3Q6ICIpOwotCQlpZiAoZml4ZWRDb3N0RVNldCkgcmVzdWx0LmFwcGVuZChmaXhlZENvc3QpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBmaXhlZENvc3RBY2NydWFsOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChmaXhlZENvc3RBY2NydWFsKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBwZXJjZW50Q29tcGxldGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHBlcmNlbnRDb21wbGV0ZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcGVyY2VudFdvcmtDb21wbGV0ZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQocGVyY2VudFdvcmtDb21wbGV0ZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgY29zdDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoY29zdCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgb3ZlcnRpbWVDb3N0OiAiKTsKLQkJcmVzdWx0LmFwcGVuZChvdmVydGltZUNvc3QpOwotCQlyZXN1bHQuYXBwZW5kKCIsIG92ZXJ0aW1lV29yazogIik7Ci0JCXJlc3VsdC5hcHBlbmQob3ZlcnRpbWVXb3JrKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBhY3R1YWxTdGFydDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoYWN0dWFsU3RhcnQpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGFjdHVhbEZpbmlzaDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoYWN0dWFsRmluaXNoKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBhY3R1YWxEdXJhdGlvbjogIik7Ci0JCXJlc3VsdC5hcHBlbmQoYWN0dWFsRHVyYXRpb24pOwotCQlyZXN1bHQuYXBwZW5kKCIsIGFjdHVhbENvc3Q6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGFjdHVhbENvc3QpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGFjdHVhbE92ZXJ0aW1lQ29zdDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoYWN0dWFsT3ZlcnRpbWVDb3N0KTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBhY3R1YWxXb3JrOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChhY3R1YWxXb3JrKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBhY3R1YWxPdmVydGltZVdvcms6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGFjdHVhbE92ZXJ0aW1lV29yayk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcmVndWxhcldvcms6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHJlZ3VsYXJXb3JrKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCByZW1haW5pbmdEdXJhdGlvbjogIik7Ci0JCXJlc3VsdC5hcHBlbmQocmVtYWluaW5nRHVyYXRpb24pOwotCQlyZXN1bHQuYXBwZW5kKCIsIHJlbWFpbmluZ0Nvc3Q6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHJlbWFpbmluZ0Nvc3QpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHJlbWFpbmluZ1dvcms6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHJlbWFpbmluZ1dvcmspOwotCQlyZXN1bHQuYXBwZW5kKCIsIHJlbWFpbmluZ092ZXJ0aW1lQ29zdDogIik7Ci0JCXJlc3VsdC5hcHBlbmQocmVtYWluaW5nT3ZlcnRpbWVDb3N0KTsKLQkJcmVzdWx0LmFwcGVuZCgiLCByZW1haW5pbmdPdmVydGltZVdvcms6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHJlbWFpbmluZ092ZXJ0aW1lV29yayk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgYUNXUDogIik7Ci0JCWlmIChhQ1dQRVNldCkgcmVzdWx0LmFwcGVuZChhQ1dQKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgY1Y6ICIpOwotCQlpZiAoY1ZFU2V0KSByZXN1bHQuYXBwZW5kKGNWKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgY29uc3RyYWludFR5cGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGNvbnN0cmFpbnRUeXBlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBjYWxlbmRhclVJRDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoY2FsZW5kYXJVSUQpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGNvbnN0cmFpbnREYXRlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChjb25zdHJhaW50RGF0ZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZGVhZGxpbmU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGRlYWRsaW5lKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBsZXZlbEFzc2lnbm1lbnRzOiAiKTsKLQkJaWYgKGxldmVsQXNzaWdubWVudHNFU2V0KSByZXN1bHQuYXBwZW5kKGxldmVsQXNzaWdubWVudHMpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBsZXZlbGluZ0NhblNwbGl0OiAiKTsKLQkJaWYgKGxldmVsaW5nQ2FuU3BsaXRFU2V0KSByZXN1bHQuYXBwZW5kKGxldmVsaW5nQ2FuU3BsaXQpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBsZXZlbGluZ0RlbGF5OiAiKTsKLQkJcmVzdWx0LmFwcGVuZChsZXZlbGluZ0RlbGF5KTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBsZXZlbGluZ0RlbGF5Rm9ybWF0OiAiKTsKLQkJcmVzdWx0LmFwcGVuZChsZXZlbGluZ0RlbGF5Rm9ybWF0KTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBwcmVMZXZlbGVkU3RhcnQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHByZUxldmVsZWRTdGFydCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcHJlTGV2ZWxlZEZpbmlzaDogIik7Ci0JCXJlc3VsdC5hcHBlbmQocHJlTGV2ZWxlZEZpbmlzaCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgaHlwZXJsaW5rOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChoeXBlcmxpbmspOwotCQlyZXN1bHQuYXBwZW5kKCIsIGh5cGVybGlua0FkZHJlc3M6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGh5cGVybGlua0FkZHJlc3MpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGh5cGVybGlua1N1YkFkZHJlc3M6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGh5cGVybGlua1N1YkFkZHJlc3MpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGlnbm9yZVJlc291cmNlQ2FsZW5kYXI6ICIpOwotCQlpZiAoaWdub3JlUmVzb3VyY2VDYWxlbmRhckVTZXQpIHJlc3VsdC5hcHBlbmQoaWdub3JlUmVzb3VyY2VDYWxlbmRhcik7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIG5vdGVzOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChub3Rlcyk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgaGlkZUJhcjogIik7Ci0JCWlmIChoaWRlQmFyRVNldCkgcmVzdWx0LmFwcGVuZChoaWRlQmFyKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcm9sbHVwOiAiKTsKLQkJaWYgKHJvbGx1cEVTZXQpIHJlc3VsdC5hcHBlbmQocm9sbHVwKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgYkNXUzogIik7Ci0JCWlmIChiQ1dTRVNldCkgcmVzdWx0LmFwcGVuZChiQ1dTKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgYkNXUDogIik7Ci0JCWlmIChiQ1dQRVNldCkgcmVzdWx0LmFwcGVuZChiQ1dQKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcGh5c2ljYWxQZXJjZW50Q29tcGxldGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHBoeXNpY2FsUGVyY2VudENvbXBsZXRlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBlYXJuZWRWYWx1ZU1ldGhvZDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZWFybmVkVmFsdWVNZXRob2QpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGFjdHVhbFdvcmtQcm90ZWN0ZWQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGFjdHVhbFdvcmtQcm90ZWN0ZWQpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGFjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoYWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vVGFza0ltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9UYXNrc0ltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9UYXNrc0ltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzdmNWVlZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvVGFza3NJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDkgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBUYXNrc0ltcGwuamF2YSx2IDEuMSAyMDA4LzAxLzE1IDA4OjUxOjUzIGp0aGFtIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFza3M7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5UYXNrczwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlRhc2tzSW1wbCNnZXRUYXNrIDxlbT5UYXNrPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgVGFza3NJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBUYXNrcyB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VGFzaygpIDxlbT5UYXNrPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCB0YXNrID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBUYXNrc0ltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrcygpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRUYXNrKCkgewotCQlpZiAodGFzayA9PSBudWxsKSB7Ci0JCQl0YXNrID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KFRhc2suY2xhc3MsIHRoaXMsIE1zcHJvamVjdFBhY2thZ2UuVEFTS1NfX1RBU0spOwotCQl9Ci0JCXJldHVybiB0YXNrOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLU19fVEFTSzoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRUYXNrKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLU19fVEFTSzoKLQkJCQlyZXR1cm4gZ2V0VGFzaygpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLU19fVEFTSzoKLQkJCQlnZXRUYXNrKCkuY2xlYXIoKTsKLQkJCQlnZXRUYXNrKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tTX19UQVNLOgotCQkJCWdldFRhc2soKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tTX19UQVNLOgotCQkJCXJldHVybiB0YXNrICE9IG51bGwgJiYgIXRhc2suaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLX0gLy9UYXNrc0ltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9UaW1lUGVyaW9kSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL1RpbWVQZXJpb2RJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0ZTcxOGMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL1RpbWVQZXJpb2RJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTMgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBUaW1lUGVyaW9kSW1wbC5qYXZhLHYgMS4xIDIwMDgvMDEvMTUgMDg6NTE6NTMganRoYW0gRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRpbWVQZXJpb2Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5UaW1lIFBlcmlvZDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlRpbWVQZXJpb2RJbXBsI2dldEZyb21EYXRlIDxlbT5Gcm9tIERhdGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5UaW1lUGVyaW9kSW1wbCNnZXRUb0RhdGUgPGVtPlRvIERhdGU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBUaW1lUGVyaW9kSW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgVGltZVBlcmlvZCB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEZyb21EYXRlKCkgPGVtPkZyb20gRGF0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RnJvbURhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgT2JqZWN0IEZST01fREFURV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRGcm9tRGF0ZSgpIDxlbT5Gcm9tIERhdGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEZyb21EYXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGZyb21EYXRlID0gRlJPTV9EQVRFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFRvRGF0ZSgpIDxlbT5UbyBEYXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUb0RhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgT2JqZWN0IFRPX0RBVEVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VG9EYXRlKCkgPGVtPlRvIERhdGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFRvRGF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCB0b0RhdGUgPSBUT19EQVRFX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFRpbWVQZXJpb2RJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGltZVBlcmlvZCgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0RnJvbURhdGUoKSB7Ci0JCXJldHVybiBmcm9tRGF0ZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGcm9tRGF0ZShPYmplY3QgbmV3RnJvbURhdGUpIHsKLQkJT2JqZWN0IG9sZEZyb21EYXRlID0gZnJvbURhdGU7Ci0JCWZyb21EYXRlID0gbmV3RnJvbURhdGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVElNRV9QRVJJT0RfX0ZST01fREFURSwgb2xkRnJvbURhdGUsIGZyb21EYXRlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRUb0RhdGUoKSB7Ci0JCXJldHVybiB0b0RhdGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VG9EYXRlKE9iamVjdCBuZXdUb0RhdGUpIHsKLQkJT2JqZWN0IG9sZFRvRGF0ZSA9IHRvRGF0ZTsKLQkJdG9EYXRlID0gbmV3VG9EYXRlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlRJTUVfUEVSSU9EX19UT19EQVRFLCBvbGRUb0RhdGUsIHRvRGF0ZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5USU1FX1BFUklPRF9fRlJPTV9EQVRFOgotCQkJCXJldHVybiBnZXRGcm9tRGF0ZSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRJTUVfUEVSSU9EX19UT19EQVRFOgotCQkJCXJldHVybiBnZXRUb0RhdGUoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVElNRV9QRVJJT0RfX0ZST01fREFURToKLQkJCQlzZXRGcm9tRGF0ZSgoT2JqZWN0KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVElNRV9QRVJJT0RfX1RPX0RBVEU6Ci0JCQkJc2V0VG9EYXRlKChPYmplY3QpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVElNRV9QRVJJT0RfX0ZST01fREFURToKLQkJCQlzZXRGcm9tRGF0ZShGUk9NX0RBVEVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5USU1FX1BFUklPRF9fVE9fREFURToKLQkJCQlzZXRUb0RhdGUoVE9fREFURV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVElNRV9QRVJJT0RfX0ZST01fREFURToKLQkJCQlyZXR1cm4gRlJPTV9EQVRFX0VERUZBVUxUID09IG51bGwgPyBmcm9tRGF0ZSAhPSBudWxsIDogIUZST01fREFURV9FREVGQVVMVC5lcXVhbHMoZnJvbURhdGUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRJTUVfUEVSSU9EX19UT19EQVRFOgotCQkJCXJldHVybiBUT19EQVRFX0VERUZBVUxUID09IG51bGwgPyB0b0RhdGUgIT0gbnVsbCA6ICFUT19EQVRFX0VERUZBVUxULmVxdWFscyh0b0RhdGUpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoZnJvbURhdGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGZyb21EYXRlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCB0b0RhdGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHRvRGF0ZSk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL1RpbWVQZXJpb2RJbXBsCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvVGltZXBoYXNlZERhdGFUeXBlSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL1RpbWVwaGFzZWREYXRhVHlwZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDcyYTBjYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvVGltZXBoYXNlZERhdGFUeXBlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMxICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogVGltZXBoYXNlZERhdGFUeXBlSW1wbC5qYXZhLHYgMS4xIDIwMDgvMDEvMTUgMDg6NTE6NTMganRoYW0gRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGw7Ci0KLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGltZXBoYXNlZERhdGFUeXBlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+VGltZXBoYXNlZCBEYXRhIFR5cGU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5UaW1lcGhhc2VkRGF0YVR5cGVJbXBsI2dldFR5cGUgPGVtPlR5cGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5UaW1lcGhhc2VkRGF0YVR5cGVJbXBsI2dldFVJRCA8ZW0+VUlEPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVGltZXBoYXNlZERhdGFUeXBlSW1wbCNnZXRTdGFydCA8ZW0+U3RhcnQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5UaW1lcGhhc2VkRGF0YVR5cGVJbXBsI2dldEZpbmlzaCA8ZW0+RmluaXNoPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVGltZXBoYXNlZERhdGFUeXBlSW1wbCNnZXRVbml0IDxlbT5Vbml0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVGltZXBoYXNlZERhdGFUeXBlSW1wbCNnZXRWYWx1ZSA8ZW0+VmFsdWU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBUaW1lcGhhc2VkRGF0YVR5cGVJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBUaW1lcGhhc2VkRGF0YVR5cGUgewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUeXBlKCkgPGVtPlR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBUWVBFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFR5cGUoKSA8ZW0+VHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0ludGVnZXIgdHlwZSA9IFRZUEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VUlEKCkgPGVtPlVJRDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VUlEKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0ludGVnZXIgVUlEX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFVJRCgpIDxlbT5VSUQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFVJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0ludGVnZXIgdUlEID0gVUlEX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFN0YXJ0KCkgPGVtPlN0YXJ0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTdGFydCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBPYmplY3QgU1RBUlRfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U3RhcnQoKSA8ZW0+U3RhcnQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFN0YXJ0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IHN0YXJ0ID0gU1RBUlRfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RmluaXNoKCkgPGVtPkZpbmlzaDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RmluaXNoKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIE9iamVjdCBGSU5JU0hfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RmluaXNoKCkgPGVtPkZpbmlzaDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RmluaXNoKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGZpbmlzaCA9IEZJTklTSF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRVbml0KCkgPGVtPlVuaXQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFVuaXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBVTklUX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFVuaXQoKSA8ZW0+VW5pdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VW5pdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0ludGVnZXIgdW5pdCA9IFVOSVRfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmFsdWUoKSA8ZW0+VmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFZhbHVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxVRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWYWx1ZSgpIDxlbT5WYWx1ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VmFsdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgdmFsdWUgPSBWQUxVRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBUaW1lcGhhc2VkRGF0YVR5cGVJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGltZXBoYXNlZERhdGFUeXBlKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIHR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VHlwZShCaWdJbnRlZ2VyIG5ld1R5cGUpIHsKLQkJQmlnSW50ZWdlciBvbGRUeXBlID0gdHlwZTsKLQkJdHlwZSA9IG5ld1R5cGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVElNRVBIQVNFRF9EQVRBX1RZUEVfX1RZUEUsIG9sZFR5cGUsIHR5cGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBnZXRVSUQoKSB7Ci0JCXJldHVybiB1SUQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VUlEKEJpZ0ludGVnZXIgbmV3VUlEKSB7Ci0JCUJpZ0ludGVnZXIgb2xkVUlEID0gdUlEOwotCQl1SUQgPSBuZXdVSUQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVElNRVBIQVNFRF9EQVRBX1RZUEVfX1VJRCwgb2xkVUlELCB1SUQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFN0YXJ0KCkgewotCQlyZXR1cm4gc3RhcnQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0U3RhcnQoT2JqZWN0IG5ld1N0YXJ0KSB7Ci0JCU9iamVjdCBvbGRTdGFydCA9IHN0YXJ0OwotCQlzdGFydCA9IG5ld1N0YXJ0OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlRJTUVQSEFTRURfREFUQV9UWVBFX19TVEFSVCwgb2xkU3RhcnQsIHN0YXJ0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRGaW5pc2goKSB7Ci0JCXJldHVybiBmaW5pc2g7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RmluaXNoKE9iamVjdCBuZXdGaW5pc2gpIHsKLQkJT2JqZWN0IG9sZEZpbmlzaCA9IGZpbmlzaDsKLQkJZmluaXNoID0gbmV3RmluaXNoOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlRJTUVQSEFTRURfREFUQV9UWVBFX19GSU5JU0gsIG9sZEZpbmlzaCwgZmluaXNoKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0VW5pdCgpIHsKLQkJcmV0dXJuIHVuaXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VW5pdChCaWdJbnRlZ2VyIG5ld1VuaXQpIHsKLQkJQmlnSW50ZWdlciBvbGRVbml0ID0gdW5pdDsKLQkJdW5pdCA9IG5ld1VuaXQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVElNRVBIQVNFRF9EQVRBX1RZUEVfX1VOSVQsIG9sZFVuaXQsIHVuaXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFZhbHVlKCkgewotCQlyZXR1cm4gdmFsdWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmFsdWUoU3RyaW5nIG5ld1ZhbHVlKSB7Ci0JCVN0cmluZyBvbGRWYWx1ZSA9IHZhbHVlOwotCQl2YWx1ZSA9IG5ld1ZhbHVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlRJTUVQSEFTRURfREFUQV9UWVBFX19WQUxVRSwgb2xkVmFsdWUsIHZhbHVlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRJTUVQSEFTRURfREFUQV9UWVBFX19UWVBFOgotCQkJCXJldHVybiBnZXRUeXBlKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVElNRVBIQVNFRF9EQVRBX1RZUEVfX1VJRDoKLQkJCQlyZXR1cm4gZ2V0VUlEKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVElNRVBIQVNFRF9EQVRBX1RZUEVfX1NUQVJUOgotCQkJCXJldHVybiBnZXRTdGFydCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRJTUVQSEFTRURfREFUQV9UWVBFX19GSU5JU0g6Ci0JCQkJcmV0dXJuIGdldEZpbmlzaCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRJTUVQSEFTRURfREFUQV9UWVBFX19VTklUOgotCQkJCXJldHVybiBnZXRVbml0KCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVElNRVBIQVNFRF9EQVRBX1RZUEVfX1ZBTFVFOgotCQkJCXJldHVybiBnZXRWYWx1ZSgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5USU1FUEhBU0VEX0RBVEFfVFlQRV9fVFlQRToKLQkJCQlzZXRUeXBlKChCaWdJbnRlZ2VyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVElNRVBIQVNFRF9EQVRBX1RZUEVfX1VJRDoKLQkJCQlzZXRVSUQoKEJpZ0ludGVnZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5USU1FUEhBU0VEX0RBVEFfVFlQRV9fU1RBUlQ6Ci0JCQkJc2V0U3RhcnQoKE9iamVjdCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRJTUVQSEFTRURfREFUQV9UWVBFX19GSU5JU0g6Ci0JCQkJc2V0RmluaXNoKChPYmplY3QpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5USU1FUEhBU0VEX0RBVEFfVFlQRV9fVU5JVDoKLQkJCQlzZXRVbml0KChCaWdJbnRlZ2VyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVElNRVBIQVNFRF9EQVRBX1RZUEVfX1ZBTFVFOgotCQkJCXNldFZhbHVlKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVElNRVBIQVNFRF9EQVRBX1RZUEVfX1RZUEU6Ci0JCQkJc2V0VHlwZShUWVBFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVElNRVBIQVNFRF9EQVRBX1RZUEVfX1VJRDoKLQkJCQlzZXRVSUQoVUlEX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVElNRVBIQVNFRF9EQVRBX1RZUEVfX1NUQVJUOgotCQkJCXNldFN0YXJ0KFNUQVJUX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVElNRVBIQVNFRF9EQVRBX1RZUEVfX0ZJTklTSDoKLQkJCQlzZXRGaW5pc2goRklOSVNIX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVElNRVBIQVNFRF9EQVRBX1RZUEVfX1VOSVQ6Ci0JCQkJc2V0VW5pdChVTklUX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVElNRVBIQVNFRF9EQVRBX1RZUEVfX1ZBTFVFOgotCQkJCXNldFZhbHVlKFZBTFVFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5USU1FUEhBU0VEX0RBVEFfVFlQRV9fVFlQRToKLQkJCQlyZXR1cm4gVFlQRV9FREVGQVVMVCA9PSBudWxsID8gdHlwZSAhPSBudWxsIDogIVRZUEVfRURFRkFVTFQuZXF1YWxzKHR5cGUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRJTUVQSEFTRURfREFUQV9UWVBFX19VSUQ6Ci0JCQkJcmV0dXJuIFVJRF9FREVGQVVMVCA9PSBudWxsID8gdUlEICE9IG51bGwgOiAhVUlEX0VERUZBVUxULmVxdWFscyh1SUQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRJTUVQSEFTRURfREFUQV9UWVBFX19TVEFSVDoKLQkJCQlyZXR1cm4gU1RBUlRfRURFRkFVTFQgPT0gbnVsbCA/IHN0YXJ0ICE9IG51bGwgOiAhU1RBUlRfRURFRkFVTFQuZXF1YWxzKHN0YXJ0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5USU1FUEhBU0VEX0RBVEFfVFlQRV9fRklOSVNIOgotCQkJCXJldHVybiBGSU5JU0hfRURFRkFVTFQgPT0gbnVsbCA/IGZpbmlzaCAhPSBudWxsIDogIUZJTklTSF9FREVGQVVMVC5lcXVhbHMoZmluaXNoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5USU1FUEhBU0VEX0RBVEFfVFlQRV9fVU5JVDoKLQkJCQlyZXR1cm4gVU5JVF9FREVGQVVMVCA9PSBudWxsID8gdW5pdCAhPSBudWxsIDogIVVOSVRfRURFRkFVTFQuZXF1YWxzKHVuaXQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRJTUVQSEFTRURfREFUQV9UWVBFX19WQUxVRToKLQkJCQlyZXR1cm4gVkFMVUVfRURFRkFVTFQgPT0gbnVsbCA/IHZhbHVlICE9IG51bGwgOiAhVkFMVUVfRURFRkFVTFQuZXF1YWxzKHZhbHVlKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHR5cGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHR5cGUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHVJRDogIik7Ci0JCXJlc3VsdC5hcHBlbmQodUlEKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBzdGFydDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoc3RhcnQpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGZpbmlzaDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZmluaXNoKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCB1bml0OiAiKTsKLQkJcmVzdWx0LmFwcGVuZCh1bml0KTsKLQkJcmVzdWx0LmFwcGVuZCgiLCB2YWx1ZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQodmFsdWUpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9UaW1lcGhhc2VkRGF0YVR5cGVJbXBsCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvVmFsdWUySW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL1ZhbHVlMkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzA5NDQ5My4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvVmFsdWUySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjY5ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogVmFsdWUySW1wbC5qYXZhLHYgMS4xIDIwMDgvMDEvMTUgMDg6NTE6NTMganRoYW0gRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGw7Ci0KLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVmFsdWUyOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+VmFsdWUyPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVmFsdWUySW1wbCNnZXRJRCA8ZW0+SUQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5WYWx1ZTJJbXBsI2dldFZhbHVlIDxlbT5WYWx1ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlZhbHVlMkltcGwjZ2V0RGVzY3JpcHRpb24gPGVtPkRlc2NyaXB0aW9uPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgVmFsdWUySW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgVmFsdWUyIHsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SUQoKSA8ZW0+SUQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldElEKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0ludGVnZXIgSURfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SUQoKSA8ZW0+SUQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldElEKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnSW50ZWdlciBpRCA9IElEX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZhbHVlKCkgPGVtPlZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRWYWx1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMVUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmFsdWUoKSA8ZW0+VmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFZhbHVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHZhbHVlID0gVkFMVUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVzY3JpcHRpb24oKSA8ZW0+RGVzY3JpcHRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBERVNDUklQVElPTl9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZXNjcmlwdGlvbigpIDxlbT5EZXNjcmlwdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZGVzY3JpcHRpb24gPSBERVNDUklQVElPTl9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBWYWx1ZTJJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0VmFsdWUyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0SUQoKSB7Ci0JCXJldHVybiBpRDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJRChCaWdJbnRlZ2VyIG5ld0lEKSB7Ci0JCUJpZ0ludGVnZXIgb2xkSUQgPSBpRDsKLQkJaUQgPSBuZXdJRDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5WQUxVRTJfX0lELCBvbGRJRCwgaUQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFZhbHVlKCkgewotCQlyZXR1cm4gdmFsdWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmFsdWUoU3RyaW5nIG5ld1ZhbHVlKSB7Ci0JCVN0cmluZyBvbGRWYWx1ZSA9IHZhbHVlOwotCQl2YWx1ZSA9IG5ld1ZhbHVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlZBTFVFMl9fVkFMVUUsIG9sZFZhbHVlLCB2YWx1ZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBkZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZXNjcmlwdGlvbihTdHJpbmcgbmV3RGVzY3JpcHRpb24pIHsKLQkJU3RyaW5nIG9sZERlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247Ci0JCWRlc2NyaXB0aW9uID0gbmV3RGVzY3JpcHRpb247Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVkFMVUUyX19ERVNDUklQVElPTiwgb2xkRGVzY3JpcHRpb24sIGRlc2NyaXB0aW9uKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlZBTFVFMl9fSUQ6Ci0JCQkJcmV0dXJuIGdldElEKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVkFMVUUyX19WQUxVRToKLQkJCQlyZXR1cm4gZ2V0VmFsdWUoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5WQUxVRTJfX0RFU0NSSVBUSU9OOgotCQkJCXJldHVybiBnZXREZXNjcmlwdGlvbigpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5WQUxVRTJfX0lEOgotCQkJCXNldElEKChCaWdJbnRlZ2VyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVkFMVUUyX19WQUxVRToKLQkJCQlzZXRWYWx1ZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVkFMVUUyX19ERVNDUklQVElPTjoKLQkJCQlzZXREZXNjcmlwdGlvbigoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlZBTFVFMl9fSUQ6Ci0JCQkJc2V0SUQoSURfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5WQUxVRTJfX1ZBTFVFOgotCQkJCXNldFZhbHVlKFZBTFVFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVkFMVUUyX19ERVNDUklQVElPTjoKLQkJCQlzZXREZXNjcmlwdGlvbihERVNDUklQVElPTl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVkFMVUUyX19JRDoKLQkJCQlyZXR1cm4gSURfRURFRkFVTFQgPT0gbnVsbCA/IGlEICE9IG51bGwgOiAhSURfRURFRkFVTFQuZXF1YWxzKGlEKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5WQUxVRTJfX1ZBTFVFOgotCQkJCXJldHVybiBWQUxVRV9FREVGQVVMVCA9PSBudWxsID8gdmFsdWUgIT0gbnVsbCA6ICFWQUxVRV9FREVGQVVMVC5lcXVhbHModmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlZBTFVFMl9fREVTQ1JJUFRJT046Ci0JCQkJcmV0dXJuIERFU0NSSVBUSU9OX0VERUZBVUxUID09IG51bGwgPyBkZXNjcmlwdGlvbiAhPSBudWxsIDogIURFU0NSSVBUSU9OX0VERUZBVUxULmVxdWFscyhkZXNjcmlwdGlvbik7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChpRDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoaUQpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHZhbHVlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZCh2YWx1ZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZGVzY3JpcHRpb246ICIpOwotCQlyZXN1bHQuYXBwZW5kKGRlc2NyaXB0aW9uKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vVmFsdWUySW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL1ZhbHVlSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL1ZhbHVlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMGUxZGVjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9WYWx1ZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyMyArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFZhbHVlSW1wbC5qYXZhLHYgMS4xIDIwMDgvMDEvMTUgMDg6NTE6NTMganRoYW0gRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGw7Ci0KLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVmFsdWU7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5WYWx1ZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlZhbHVlSW1wbCNnZXRWYWx1ZUlEIDxlbT5WYWx1ZSBJRDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlZhbHVlSW1wbCNnZXRQYXJlbnRWYWx1ZUlEIDxlbT5QYXJlbnQgVmFsdWUgSUQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5WYWx1ZUltcGwjZ2V0VmFsdWUgPGVtPlZhbHVlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVmFsdWVJbXBsI2dldERlc2NyaXB0aW9uIDxlbT5EZXNjcmlwdGlvbjwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFZhbHVlSW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgVmFsdWUgewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWYWx1ZUlEKCkgPGVtPlZhbHVlIElEPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRWYWx1ZUlEKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0ludGVnZXIgVkFMVUVfSURfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmFsdWVJRCgpIDxlbT5WYWx1ZSBJRDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VmFsdWVJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0ludGVnZXIgdmFsdWVJRCA9IFZBTFVFX0lEX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBhcmVudFZhbHVlSUQoKSA8ZW0+UGFyZW50IFZhbHVlIElEPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQYXJlbnRWYWx1ZUlEKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0ludGVnZXIgUEFSRU5UX1ZBTFVFX0lEX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBhcmVudFZhbHVlSUQoKSA8ZW0+UGFyZW50IFZhbHVlIElEPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQYXJlbnRWYWx1ZUlEKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnSW50ZWdlciBwYXJlbnRWYWx1ZUlEID0gUEFSRU5UX1ZBTFVFX0lEX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZhbHVlKCkgPGVtPlZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRWYWx1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMVUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmFsdWUoKSA8ZW0+VmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFZhbHVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHZhbHVlID0gVkFMVUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVzY3JpcHRpb24oKSA8ZW0+RGVzY3JpcHRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBERVNDUklQVElPTl9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZXNjcmlwdGlvbigpIDxlbT5EZXNjcmlwdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZGVzY3JpcHRpb24gPSBERVNDUklQVElPTl9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBWYWx1ZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXRWYWx1ZSgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGdldFZhbHVlSUQoKSB7Ci0JCXJldHVybiB2YWx1ZUlEOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZhbHVlSUQoQmlnSW50ZWdlciBuZXdWYWx1ZUlEKSB7Ci0JCUJpZ0ludGVnZXIgb2xkVmFsdWVJRCA9IHZhbHVlSUQ7Ci0JCXZhbHVlSUQgPSBuZXdWYWx1ZUlEOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlZBTFVFX19WQUxVRV9JRCwgb2xkVmFsdWVJRCwgdmFsdWVJRCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGdldFBhcmVudFZhbHVlSUQoKSB7Ci0JCXJldHVybiBwYXJlbnRWYWx1ZUlEOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBhcmVudFZhbHVlSUQoQmlnSW50ZWdlciBuZXdQYXJlbnRWYWx1ZUlEKSB7Ci0JCUJpZ0ludGVnZXIgb2xkUGFyZW50VmFsdWVJRCA9IHBhcmVudFZhbHVlSUQ7Ci0JCXBhcmVudFZhbHVlSUQgPSBuZXdQYXJlbnRWYWx1ZUlEOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlZBTFVFX19QQVJFTlRfVkFMVUVfSUQsIG9sZFBhcmVudFZhbHVlSUQsIHBhcmVudFZhbHVlSUQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFZhbHVlKCkgewotCQlyZXR1cm4gdmFsdWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmFsdWUoU3RyaW5nIG5ld1ZhbHVlKSB7Ci0JCVN0cmluZyBvbGRWYWx1ZSA9IHZhbHVlOwotCQl2YWx1ZSA9IG5ld1ZhbHVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlZBTFVFX19WQUxVRSwgb2xkVmFsdWUsIHZhbHVlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIGRlc2NyaXB0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyBuZXdEZXNjcmlwdGlvbikgewotCQlTdHJpbmcgb2xkRGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjsKLQkJZGVzY3JpcHRpb24gPSBuZXdEZXNjcmlwdGlvbjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5WQUxVRV9fREVTQ1JJUFRJT04sIG9sZERlc2NyaXB0aW9uLCBkZXNjcmlwdGlvbikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5WQUxVRV9fVkFMVUVfSUQ6Ci0JCQkJcmV0dXJuIGdldFZhbHVlSUQoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5WQUxVRV9fUEFSRU5UX1ZBTFVFX0lEOgotCQkJCXJldHVybiBnZXRQYXJlbnRWYWx1ZUlEKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVkFMVUVfX1ZBTFVFOgotCQkJCXJldHVybiBnZXRWYWx1ZSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlZBTFVFX19ERVNDUklQVElPTjoKLQkJCQlyZXR1cm4gZ2V0RGVzY3JpcHRpb24oKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVkFMVUVfX1ZBTFVFX0lEOgotCQkJCXNldFZhbHVlSUQoKEJpZ0ludGVnZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5WQUxVRV9fUEFSRU5UX1ZBTFVFX0lEOgotCQkJCXNldFBhcmVudFZhbHVlSUQoKEJpZ0ludGVnZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5WQUxVRV9fVkFMVUU6Ci0JCQkJc2V0VmFsdWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlZBTFVFX19ERVNDUklQVElPTjoKLQkJCQlzZXREZXNjcmlwdGlvbigoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlZBTFVFX19WQUxVRV9JRDoKLQkJCQlzZXRWYWx1ZUlEKFZBTFVFX0lEX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVkFMVUVfX1BBUkVOVF9WQUxVRV9JRDoKLQkJCQlzZXRQYXJlbnRWYWx1ZUlEKFBBUkVOVF9WQUxVRV9JRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlZBTFVFX19WQUxVRToKLQkJCQlzZXRWYWx1ZShWQUxVRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlZBTFVFX19ERVNDUklQVElPTjoKLQkJCQlzZXREZXNjcmlwdGlvbihERVNDUklQVElPTl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVkFMVUVfX1ZBTFVFX0lEOgotCQkJCXJldHVybiBWQUxVRV9JRF9FREVGQVVMVCA9PSBudWxsID8gdmFsdWVJRCAhPSBudWxsIDogIVZBTFVFX0lEX0VERUZBVUxULmVxdWFscyh2YWx1ZUlEKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5WQUxVRV9fUEFSRU5UX1ZBTFVFX0lEOgotCQkJCXJldHVybiBQQVJFTlRfVkFMVUVfSURfRURFRkFVTFQgPT0gbnVsbCA/IHBhcmVudFZhbHVlSUQgIT0gbnVsbCA6ICFQQVJFTlRfVkFMVUVfSURfRURFRkFVTFQuZXF1YWxzKHBhcmVudFZhbHVlSUQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlZBTFVFX19WQUxVRToKLQkJCQlyZXR1cm4gVkFMVUVfRURFRkFVTFQgPT0gbnVsbCA/IHZhbHVlICE9IG51bGwgOiAhVkFMVUVfRURFRkFVTFQuZXF1YWxzKHZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5WQUxVRV9fREVTQ1JJUFRJT046Ci0JCQkJcmV0dXJuIERFU0NSSVBUSU9OX0VERUZBVUxUID09IG51bGwgPyBkZXNjcmlwdGlvbiAhPSBudWxsIDogIURFU0NSSVBUSU9OX0VERUZBVUxULmVxdWFscyhkZXNjcmlwdGlvbik7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiICh2YWx1ZUlEOiAiKTsKLQkJcmVzdWx0LmFwcGVuZCh2YWx1ZUlEKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBwYXJlbnRWYWx1ZUlEOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChwYXJlbnRWYWx1ZUlEKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCB2YWx1ZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQodmFsdWUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGRlc2NyaXB0aW9uOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChkZXNjcmlwdGlvbik7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL1ZhbHVlSW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL1ZhbHVlTGlzdEltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9WYWx1ZUxpc3RJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4ZTc3ZTMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL1ZhbHVlTGlzdEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0OSArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFZhbHVlTGlzdEltcGwuamF2YSx2IDEuMSAyMDA4LzAxLzE1IDA4OjUxOjUzIGp0aGFtIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5WYWx1ZTI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5WYWx1ZUxpc3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5WYWx1ZSBMaXN0PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVmFsdWVMaXN0SW1wbCNnZXRWYWx1ZSA8ZW0+VmFsdWU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBWYWx1ZUxpc3RJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBWYWx1ZUxpc3QgewotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZhbHVlKCkgPGVtPlZhbHVlPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFZhbHVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgdmFsdWUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFZhbHVlTGlzdEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXRWYWx1ZUxpc3QoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0VmFsdWUoKSB7Ci0JCWlmICh2YWx1ZSA9PSBudWxsKSB7Ci0JCQl2YWx1ZSA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChWYWx1ZTIuY2xhc3MsIHRoaXMsIE1zcHJvamVjdFBhY2thZ2UuVkFMVUVfTElTVF9fVkFMVUUpOwotCQl9Ci0JCXJldHVybiB2YWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVkFMVUVfTElTVF9fVkFMVUU6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0VmFsdWUoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlZBTFVFX0xJU1RfX1ZBTFVFOgotCQkJCXJldHVybiBnZXRWYWx1ZSgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5WQUxVRV9MSVNUX19WQUxVRToKLQkJCQlnZXRWYWx1ZSgpLmNsZWFyKCk7Ci0JCQkJZ2V0VmFsdWUoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVkFMVUVfTElTVF9fVkFMVUU6Ci0JCQkJZ2V0VmFsdWUoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlZBTFVFX0xJU1RfX1ZBTFVFOgotCQkJCXJldHVybiB2YWx1ZSAhPSBudWxsICYmICF2YWx1ZS5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotfSAvL1ZhbHVlTGlzdEltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9WYWx1ZXNJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvVmFsdWVzSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZGU4NTI1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9WYWx1ZXNJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODcgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBWYWx1ZXNJbXBsLmphdmEsdiAxLjEgMjAwOC8wMS8xNSAwODo1MTo1MyBqdGhhbSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkJhc2ljRmVhdHVyZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVmFsdWVzOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+VmFsdWVzPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVmFsdWVzSW1wbCNnZXRHcm91cCA8ZW0+R3JvdXA8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5WYWx1ZXNJbXBsI2dldFZhbHVlIDxlbT5WYWx1ZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFZhbHVlc0ltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIFZhbHVlcyB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0R3JvdXAoKSA8ZW0+R3JvdXA8L2VtPn0nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0R3JvdXAoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBGZWF0dXJlTWFwIGdyb3VwID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBWYWx1ZXNJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0VmFsdWVzKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEZlYXR1cmVNYXAgZ2V0R3JvdXAoKSB7Ci0JCWlmIChncm91cCA9PSBudWxsKSB7Ci0JCQlncm91cCA9IG5ldyBCYXNpY0ZlYXR1cmVNYXAodGhpcywgTXNwcm9qZWN0UGFja2FnZS5WQUxVRVNfX0dST1VQKTsKLQkJfQotCQlyZXR1cm4gZ3JvdXA7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldFZhbHVlKCkgewotCQlyZXR1cm4gKChGZWF0dXJlTWFwKWdldEdyb3VwKCkpLmxpc3QoTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0VmFsdWVzX1ZhbHVlKCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5WQUxVRVNfX0dST1VQOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEdyb3VwKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVkFMVUVTX19WQUxVRToKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRWYWx1ZSgpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVkFMVUVTX19HUk9VUDoKLQkJCQlyZXR1cm4gZ2V0R3JvdXAoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5WQUxVRVNfX1ZBTFVFOgotCQkJCXJldHVybiBnZXRWYWx1ZSgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5WQUxVRVNfX0dST1VQOgotCQkJCWdldEdyb3VwKCkuY2xlYXIoKTsKLQkJCQlnZXRHcm91cCgpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlZBTFVFU19fVkFMVUU6Ci0JCQkJZ2V0VmFsdWUoKS5jbGVhcigpOwotCQkJCWdldFZhbHVlKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlZBTFVFU19fR1JPVVA6Ci0JCQkJZ2V0R3JvdXAoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5WQUxVRVNfX1ZBTFVFOgotCQkJCWdldFZhbHVlKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5WQUxVRVNfX0dST1VQOgotCQkJCXJldHVybiBncm91cCAhPSBudWxsICYmICFncm91cC5pc0VtcHR5KCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVkFMVUVTX19WQUxVRToKLQkJCQlyZXR1cm4gIWdldFZhbHVlKCkuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoZ3JvdXA6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGdyb3VwKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vVmFsdWVzSW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL1dCU01hc2tJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvV0JTTWFza0ltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzY1YWEwMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvV0JTTWFza0ltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyMyArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFdCU01hc2tJbXBsLmphdmEsdiAxLjEgMjAwOC8wMS8xNSAwODo1MTo1MyBqdGhhbSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbDsKLQotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5XQlNNYXNrOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+V0JTIE1hc2s8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5XQlNNYXNrSW1wbCNnZXRMZXZlbCA8ZW0+TGV2ZWw8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5XQlNNYXNrSW1wbCNnZXRUeXBlIDxlbT5UeXBlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuV0JTTWFza0ltcGwjZ2V0TGVuZ3RoIDxlbT5MZW5ndGg8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5XQlNNYXNrSW1wbCNnZXRTZXBhcmF0b3IgPGVtPlNlcGFyYXRvcjwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFdCU01hc2tJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBXQlNNYXNrIHsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TGV2ZWwoKSA8ZW0+TGV2ZWw8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldExldmVsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0ludGVnZXIgTEVWRUxfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TGV2ZWwoKSA8ZW0+TGV2ZWw8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldExldmVsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnSW50ZWdlciBsZXZlbCA9IExFVkVMX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFR5cGUoKSA8ZW0+VHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdJbnRlZ2VyIFRZUEVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VHlwZSgpIDxlbT5UeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnSW50ZWdlciB0eXBlID0gVFlQRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRMZW5ndGgoKSA8ZW0+TGVuZ3RoPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRMZW5ndGgoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIExFTkdUSF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRMZW5ndGgoKSA8ZW0+TGVuZ3RoPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRMZW5ndGgoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgbGVuZ3RoID0gTEVOR1RIX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNlcGFyYXRvcigpIDxlbT5TZXBhcmF0b3I8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFNlcGFyYXRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VQQVJBVE9SX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNlcGFyYXRvcigpIDxlbT5TZXBhcmF0b3I8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFNlcGFyYXRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBzZXBhcmF0b3IgPSBTRVBBUkFUT1JfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgV0JTTWFza0ltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXRXQlNNYXNrKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0TGV2ZWwoKSB7Ci0JCXJldHVybiBsZXZlbDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMZXZlbChCaWdJbnRlZ2VyIG5ld0xldmVsKSB7Ci0JCUJpZ0ludGVnZXIgb2xkTGV2ZWwgPSBsZXZlbDsKLQkJbGV2ZWwgPSBuZXdMZXZlbDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5XQlNfTUFTS19fTEVWRUwsIG9sZExldmVsLCBsZXZlbCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGdldFR5cGUoKSB7Ci0JCXJldHVybiB0eXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFR5cGUoQmlnSW50ZWdlciBuZXdUeXBlKSB7Ci0JCUJpZ0ludGVnZXIgb2xkVHlwZSA9IHR5cGU7Ci0JCXR5cGUgPSBuZXdUeXBlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLldCU19NQVNLX19UWVBFLCBvbGRUeXBlLCB0eXBlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMZW5ndGgoKSB7Ci0JCXJldHVybiBsZW5ndGg7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGVuZ3RoKFN0cmluZyBuZXdMZW5ndGgpIHsKLQkJU3RyaW5nIG9sZExlbmd0aCA9IGxlbmd0aDsKLQkJbGVuZ3RoID0gbmV3TGVuZ3RoOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLldCU19NQVNLX19MRU5HVEgsIG9sZExlbmd0aCwgbGVuZ3RoKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTZXBhcmF0b3IoKSB7Ci0JCXJldHVybiBzZXBhcmF0b3I7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2VwYXJhdG9yKFN0cmluZyBuZXdTZXBhcmF0b3IpIHsKLQkJU3RyaW5nIG9sZFNlcGFyYXRvciA9IHNlcGFyYXRvcjsKLQkJc2VwYXJhdG9yID0gbmV3U2VwYXJhdG9yOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLldCU19NQVNLX19TRVBBUkFUT1IsIG9sZFNlcGFyYXRvciwgc2VwYXJhdG9yKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLldCU19NQVNLX19MRVZFTDoKLQkJCQlyZXR1cm4gZ2V0TGV2ZWwoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5XQlNfTUFTS19fVFlQRToKLQkJCQlyZXR1cm4gZ2V0VHlwZSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLldCU19NQVNLX19MRU5HVEg6Ci0JCQkJcmV0dXJuIGdldExlbmd0aCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLldCU19NQVNLX19TRVBBUkFUT1I6Ci0JCQkJcmV0dXJuIGdldFNlcGFyYXRvcigpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5XQlNfTUFTS19fTEVWRUw6Ci0JCQkJc2V0TGV2ZWwoKEJpZ0ludGVnZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5XQlNfTUFTS19fVFlQRToKLQkJCQlzZXRUeXBlKChCaWdJbnRlZ2VyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuV0JTX01BU0tfX0xFTkdUSDoKLQkJCQlzZXRMZW5ndGgoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLldCU19NQVNLX19TRVBBUkFUT1I6Ci0JCQkJc2V0U2VwYXJhdG9yKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuV0JTX01BU0tfX0xFVkVMOgotCQkJCXNldExldmVsKExFVkVMX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuV0JTX01BU0tfX1RZUEU6Ci0JCQkJc2V0VHlwZShUWVBFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuV0JTX01BU0tfX0xFTkdUSDoKLQkJCQlzZXRMZW5ndGgoTEVOR1RIX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuV0JTX01BU0tfX1NFUEFSQVRPUjoKLQkJCQlzZXRTZXBhcmF0b3IoU0VQQVJBVE9SX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5XQlNfTUFTS19fTEVWRUw6Ci0JCQkJcmV0dXJuIExFVkVMX0VERUZBVUxUID09IG51bGwgPyBsZXZlbCAhPSBudWxsIDogIUxFVkVMX0VERUZBVUxULmVxdWFscyhsZXZlbCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuV0JTX01BU0tfX1RZUEU6Ci0JCQkJcmV0dXJuIFRZUEVfRURFRkFVTFQgPT0gbnVsbCA/IHR5cGUgIT0gbnVsbCA6ICFUWVBFX0VERUZBVUxULmVxdWFscyh0eXBlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5XQlNfTUFTS19fTEVOR1RIOgotCQkJCXJldHVybiBMRU5HVEhfRURFRkFVTFQgPT0gbnVsbCA/IGxlbmd0aCAhPSBudWxsIDogIUxFTkdUSF9FREVGQVVMVC5lcXVhbHMobGVuZ3RoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5XQlNfTUFTS19fU0VQQVJBVE9SOgotCQkJCXJldHVybiBTRVBBUkFUT1JfRURFRkFVTFQgPT0gbnVsbCA/IHNlcGFyYXRvciAhPSBudWxsIDogIVNFUEFSQVRPUl9FREVGQVVMVC5lcXVhbHMoc2VwYXJhdG9yKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGxldmVsOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChsZXZlbCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgdHlwZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQodHlwZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgbGVuZ3RoOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChsZW5ndGgpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHNlcGFyYXRvcjogIik7Ci0JCXJlc3VsdC5hcHBlbmQoc2VwYXJhdG9yKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vV0JTTWFza0ltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9XQlNNYXNrc0ltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9XQlNNYXNrc0ltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGNmZDcxMy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvV0JTTWFza3NJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOTQgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBXQlNNYXNrc0ltcGwuamF2YSx2IDEuMSAyMDA4LzAxLzE1IDA4OjUxOjUzIGp0aGFtIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV0JTTWFzazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldCU01hc2tzOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+V0JTIE1hc2tzPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuV0JTTWFza3NJbXBsI2lzVmVyaWZ5VW5pcXVlQ29kZXMgPGVtPlZlcmlmeSBVbmlxdWUgQ29kZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5XQlNNYXNrc0ltcGwjaXNHZW5lcmF0ZUNvZGVzIDxlbT5HZW5lcmF0ZSBDb2RlczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLldCU01hc2tzSW1wbCNnZXRQcmVmaXggPGVtPlByZWZpeDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLldCU01hc2tzSW1wbCNnZXRXQlNNYXNrIDxlbT5XQlMgTWFzazwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFdCU01hc2tzSW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgV0JTTWFza3MgewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1ZlcmlmeVVuaXF1ZUNvZGVzKCkgPGVtPlZlcmlmeSBVbmlxdWUgQ29kZXM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzVmVyaWZ5VW5pcXVlQ29kZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBWRVJJRllfVU5JUVVFX0NPREVTX0VERUZBVUxUID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1ZlcmlmeVVuaXF1ZUNvZGVzKCkgPGVtPlZlcmlmeSBVbmlxdWUgQ29kZXM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzVmVyaWZ5VW5pcXVlQ29kZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHZlcmlmeVVuaXF1ZUNvZGVzID0gVkVSSUZZX1VOSVFVRV9DT0RFU19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgVmVyaWZ5IFVuaXF1ZSBDb2RlcyBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gdmVyaWZ5VW5pcXVlQ29kZXNFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNHZW5lcmF0ZUNvZGVzKCkgPGVtPkdlbmVyYXRlIENvZGVzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0dlbmVyYXRlQ29kZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBHRU5FUkFURV9DT0RFU19FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNHZW5lcmF0ZUNvZGVzKCkgPGVtPkdlbmVyYXRlIENvZGVzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0dlbmVyYXRlQ29kZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGdlbmVyYXRlQ29kZXMgPSBHRU5FUkFURV9DT0RFU19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgR2VuZXJhdGUgQ29kZXMgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGdlbmVyYXRlQ29kZXNFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJlZml4KCkgPGVtPlByZWZpeDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UHJlZml4KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGSVhfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJlZml4KCkgPGVtPlByZWZpeDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UHJlZml4KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHByZWZpeCA9IFBSRUZJWF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFdCU01hc2soKSA8ZW0+V0JTIE1hc2s8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0V0JTTWFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IHdCU01hc2sgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFdCU01hc2tzSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldFdCU01hc2tzKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNWZXJpZnlVbmlxdWVDb2RlcygpIHsKLQkJcmV0dXJuIHZlcmlmeVVuaXF1ZUNvZGVzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZlcmlmeVVuaXF1ZUNvZGVzKGJvb2xlYW4gbmV3VmVyaWZ5VW5pcXVlQ29kZXMpIHsKLQkJYm9vbGVhbiBvbGRWZXJpZnlVbmlxdWVDb2RlcyA9IHZlcmlmeVVuaXF1ZUNvZGVzOwotCQl2ZXJpZnlVbmlxdWVDb2RlcyA9IG5ld1ZlcmlmeVVuaXF1ZUNvZGVzOwotCQlib29sZWFuIG9sZFZlcmlmeVVuaXF1ZUNvZGVzRVNldCA9IHZlcmlmeVVuaXF1ZUNvZGVzRVNldDsKLQkJdmVyaWZ5VW5pcXVlQ29kZXNFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5XQlNfTUFTS1NfX1ZFUklGWV9VTklRVUVfQ09ERVMsIG9sZFZlcmlmeVVuaXF1ZUNvZGVzLCB2ZXJpZnlVbmlxdWVDb2RlcywgIW9sZFZlcmlmeVVuaXF1ZUNvZGVzRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0VmVyaWZ5VW5pcXVlQ29kZXMoKSB7Ci0JCWJvb2xlYW4gb2xkVmVyaWZ5VW5pcXVlQ29kZXMgPSB2ZXJpZnlVbmlxdWVDb2RlczsKLQkJYm9vbGVhbiBvbGRWZXJpZnlVbmlxdWVDb2Rlc0VTZXQgPSB2ZXJpZnlVbmlxdWVDb2Rlc0VTZXQ7Ci0JCXZlcmlmeVVuaXF1ZUNvZGVzID0gVkVSSUZZX1VOSVFVRV9DT0RFU19FREVGQVVMVDsKLQkJdmVyaWZ5VW5pcXVlQ29kZXNFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgTXNwcm9qZWN0UGFja2FnZS5XQlNfTUFTS1NfX1ZFUklGWV9VTklRVUVfQ09ERVMsIG9sZFZlcmlmeVVuaXF1ZUNvZGVzLCBWRVJJRllfVU5JUVVFX0NPREVTX0VERUZBVUxULCBvbGRWZXJpZnlVbmlxdWVDb2Rlc0VTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldFZlcmlmeVVuaXF1ZUNvZGVzKCkgewotCQlyZXR1cm4gdmVyaWZ5VW5pcXVlQ29kZXNFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzR2VuZXJhdGVDb2RlcygpIHsKLQkJcmV0dXJuIGdlbmVyYXRlQ29kZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0R2VuZXJhdGVDb2Rlcyhib29sZWFuIG5ld0dlbmVyYXRlQ29kZXMpIHsKLQkJYm9vbGVhbiBvbGRHZW5lcmF0ZUNvZGVzID0gZ2VuZXJhdGVDb2RlczsKLQkJZ2VuZXJhdGVDb2RlcyA9IG5ld0dlbmVyYXRlQ29kZXM7Ci0JCWJvb2xlYW4gb2xkR2VuZXJhdGVDb2Rlc0VTZXQgPSBnZW5lcmF0ZUNvZGVzRVNldDsKLQkJZ2VuZXJhdGVDb2Rlc0VTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLldCU19NQVNLU19fR0VORVJBVEVfQ09ERVMsIG9sZEdlbmVyYXRlQ29kZXMsIGdlbmVyYXRlQ29kZXMsICFvbGRHZW5lcmF0ZUNvZGVzRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0R2VuZXJhdGVDb2RlcygpIHsKLQkJYm9vbGVhbiBvbGRHZW5lcmF0ZUNvZGVzID0gZ2VuZXJhdGVDb2RlczsKLQkJYm9vbGVhbiBvbGRHZW5lcmF0ZUNvZGVzRVNldCA9IGdlbmVyYXRlQ29kZXNFU2V0OwotCQlnZW5lcmF0ZUNvZGVzID0gR0VORVJBVEVfQ09ERVNfRURFRkFVTFQ7Ci0JCWdlbmVyYXRlQ29kZXNFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgTXNwcm9qZWN0UGFja2FnZS5XQlNfTUFTS1NfX0dFTkVSQVRFX0NPREVTLCBvbGRHZW5lcmF0ZUNvZGVzLCBHRU5FUkFURV9DT0RFU19FREVGQVVMVCwgb2xkR2VuZXJhdGVDb2Rlc0VTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldEdlbmVyYXRlQ29kZXMoKSB7Ci0JCXJldHVybiBnZW5lcmF0ZUNvZGVzRVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFByZWZpeCgpIHsKLQkJcmV0dXJuIHByZWZpeDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQcmVmaXgoU3RyaW5nIG5ld1ByZWZpeCkgewotCQlTdHJpbmcgb2xkUHJlZml4ID0gcHJlZml4OwotCQlwcmVmaXggPSBuZXdQcmVmaXg7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuV0JTX01BU0tTX19QUkVGSVgsIG9sZFByZWZpeCwgcHJlZml4KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldFdCU01hc2soKSB7Ci0JCWlmICh3QlNNYXNrID09IG51bGwpIHsKLQkJCXdCU01hc2sgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoV0JTTWFzay5jbGFzcywgdGhpcywgTXNwcm9qZWN0UGFja2FnZS5XQlNfTUFTS1NfX1dCU19NQVNLKTsKLQkJfQotCQlyZXR1cm4gd0JTTWFzazsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuV0JTX01BU0tTX19XQlNfTUFTSzoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRXQlNNYXNrKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5XQlNfTUFTS1NfX1ZFUklGWV9VTklRVUVfQ09ERVM6Ci0JCQkJcmV0dXJuIGlzVmVyaWZ5VW5pcXVlQ29kZXMoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuV0JTX01BU0tTX19HRU5FUkFURV9DT0RFUzoKLQkJCQlyZXR1cm4gaXNHZW5lcmF0ZUNvZGVzKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLldCU19NQVNLU19fUFJFRklYOgotCQkJCXJldHVybiBnZXRQcmVmaXgoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5XQlNfTUFTS1NfX1dCU19NQVNLOgotCQkJCXJldHVybiBnZXRXQlNNYXNrKCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLldCU19NQVNLU19fVkVSSUZZX1VOSVFVRV9DT0RFUzoKLQkJCQlzZXRWZXJpZnlVbmlxdWVDb2RlcygoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuV0JTX01BU0tTX19HRU5FUkFURV9DT0RFUzoKLQkJCQlzZXRHZW5lcmF0ZUNvZGVzKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5XQlNfTUFTS1NfX1BSRUZJWDoKLQkJCQlzZXRQcmVmaXgoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLldCU19NQVNLU19fV0JTX01BU0s6Ci0JCQkJZ2V0V0JTTWFzaygpLmNsZWFyKCk7Ci0JCQkJZ2V0V0JTTWFzaygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5XQlNfTUFTS1NfX1ZFUklGWV9VTklRVUVfQ09ERVM6Ci0JCQkJdW5zZXRWZXJpZnlVbmlxdWVDb2RlcygpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5XQlNfTUFTS1NfX0dFTkVSQVRFX0NPREVTOgotCQkJCXVuc2V0R2VuZXJhdGVDb2RlcygpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5XQlNfTUFTS1NfX1BSRUZJWDoKLQkJCQlzZXRQcmVmaXgoUFJFRklYX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuV0JTX01BU0tTX19XQlNfTUFTSzoKLQkJCQlnZXRXQlNNYXNrKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5XQlNfTUFTS1NfX1ZFUklGWV9VTklRVUVfQ09ERVM6Ci0JCQkJcmV0dXJuIGlzU2V0VmVyaWZ5VW5pcXVlQ29kZXMoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5XQlNfTUFTS1NfX0dFTkVSQVRFX0NPREVTOgotCQkJCXJldHVybiBpc1NldEdlbmVyYXRlQ29kZXMoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5XQlNfTUFTS1NfX1BSRUZJWDoKLQkJCQlyZXR1cm4gUFJFRklYX0VERUZBVUxUID09IG51bGwgPyBwcmVmaXggIT0gbnVsbCA6ICFQUkVGSVhfRURFRkFVTFQuZXF1YWxzKHByZWZpeCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuV0JTX01BU0tTX19XQlNfTUFTSzoKLQkJCQlyZXR1cm4gd0JTTWFzayAhPSBudWxsICYmICF3QlNNYXNrLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHZlcmlmeVVuaXF1ZUNvZGVzOiAiKTsKLQkJaWYgKHZlcmlmeVVuaXF1ZUNvZGVzRVNldCkgcmVzdWx0LmFwcGVuZCh2ZXJpZnlVbmlxdWVDb2Rlcyk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGdlbmVyYXRlQ29kZXM6ICIpOwotCQlpZiAoZ2VuZXJhdGVDb2Rlc0VTZXQpIHJlc3VsdC5hcHBlbmQoZ2VuZXJhdGVDb2Rlcyk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHByZWZpeDogIik7Ci0JCXJlc3VsdC5hcHBlbmQocHJlZml4KTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vV0JTTWFza3NJbXBsCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvV2Vla0RheUltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9XZWVrRGF5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhY2U0OWMwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9XZWVrRGF5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAwICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogV2Vla0RheUltcGwuamF2YSx2IDEuMSAyMDA4LzAxLzE1IDA4OjUxOjUzIGp0aGFtIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsOwotCi1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGltZVBlcmlvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldlZWtEYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Xb3JraW5nVGltZXM7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5XZWVrIERheTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLldlZWtEYXlJbXBsI2dldERheVR5cGUgPGVtPkRheSBUeXBlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuV2Vla0RheUltcGwjaXNEYXlXb3JraW5nIDxlbT5EYXkgV29ya2luZzwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLldlZWtEYXlJbXBsI2dldFRpbWVQZXJpb2QgPGVtPlRpbWUgUGVyaW9kPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuV2Vla0RheUltcGwjZ2V0V29ya2luZ1RpbWVzIDxlbT5Xb3JraW5nIFRpbWVzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgV2Vla0RheUltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIFdlZWtEYXkgewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREYXlUeXBlKCkgPGVtPkRheSBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREYXlUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0ludGVnZXIgREFZX1RZUEVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGF5VHlwZSgpIDxlbT5EYXkgVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGF5VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0ludGVnZXIgZGF5VHlwZSA9IERBWV9UWVBFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzRGF5V29ya2luZygpIDxlbT5EYXkgV29ya2luZzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNEYXlXb3JraW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gREFZX1dPUktJTkdfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzRGF5V29ya2luZygpIDxlbT5EYXkgV29ya2luZzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNEYXlXb3JraW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBkYXlXb3JraW5nID0gREFZX1dPUktJTkdfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIERheSBXb3JraW5nIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBkYXlXb3JraW5nRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VGltZVBlcmlvZCgpIDxlbT5UaW1lIFBlcmlvZDwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VGltZVBlcmlvZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFRpbWVQZXJpb2QgdGltZVBlcmlvZCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRXb3JraW5nVGltZXMoKSA8ZW0+V29ya2luZyBUaW1lczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0V29ya2luZ1RpbWVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgV29ya2luZ1RpbWVzIHdvcmtpbmdUaW1lcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgV2Vla0RheUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXRXZWVrRGF5KCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0RGF5VHlwZSgpIHsKLQkJcmV0dXJuIGRheVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGF5VHlwZShCaWdJbnRlZ2VyIG5ld0RheVR5cGUpIHsKLQkJQmlnSW50ZWdlciBvbGREYXlUeXBlID0gZGF5VHlwZTsKLQkJZGF5VHlwZSA9IG5ld0RheVR5cGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuV0VFS19EQVlfX0RBWV9UWVBFLCBvbGREYXlUeXBlLCBkYXlUeXBlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNEYXlXb3JraW5nKCkgewotCQlyZXR1cm4gZGF5V29ya2luZzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREYXlXb3JraW5nKGJvb2xlYW4gbmV3RGF5V29ya2luZykgewotCQlib29sZWFuIG9sZERheVdvcmtpbmcgPSBkYXlXb3JraW5nOwotCQlkYXlXb3JraW5nID0gbmV3RGF5V29ya2luZzsKLQkJYm9vbGVhbiBvbGREYXlXb3JraW5nRVNldCA9IGRheVdvcmtpbmdFU2V0OwotCQlkYXlXb3JraW5nRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuV0VFS19EQVlfX0RBWV9XT1JLSU5HLCBvbGREYXlXb3JraW5nLCBkYXlXb3JraW5nLCAhb2xkRGF5V29ya2luZ0VTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldERheVdvcmtpbmcoKSB7Ci0JCWJvb2xlYW4gb2xkRGF5V29ya2luZyA9IGRheVdvcmtpbmc7Ci0JCWJvb2xlYW4gb2xkRGF5V29ya2luZ0VTZXQgPSBkYXlXb3JraW5nRVNldDsKLQkJZGF5V29ya2luZyA9IERBWV9XT1JLSU5HX0VERUZBVUxUOwotCQlkYXlXb3JraW5nRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIE1zcHJvamVjdFBhY2thZ2UuV0VFS19EQVlfX0RBWV9XT1JLSU5HLCBvbGREYXlXb3JraW5nLCBEQVlfV09SS0lOR19FREVGQVVMVCwgb2xkRGF5V29ya2luZ0VTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldERheVdvcmtpbmcoKSB7Ci0JCXJldHVybiBkYXlXb3JraW5nRVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVGltZVBlcmlvZCBnZXRUaW1lUGVyaW9kKCkgewotCQlyZXR1cm4gdGltZVBlcmlvZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRUaW1lUGVyaW9kKFRpbWVQZXJpb2QgbmV3VGltZVBlcmlvZCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlUaW1lUGVyaW9kIG9sZFRpbWVQZXJpb2QgPSB0aW1lUGVyaW9kOwotCQl0aW1lUGVyaW9kID0gbmV3VGltZVBlcmlvZDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5XRUVLX0RBWV9fVElNRV9QRVJJT0QsIG9sZFRpbWVQZXJpb2QsIG5ld1RpbWVQZXJpb2QpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRpbWVQZXJpb2QoVGltZVBlcmlvZCBuZXdUaW1lUGVyaW9kKSB7Ci0JCWlmIChuZXdUaW1lUGVyaW9kICE9IHRpbWVQZXJpb2QpIHsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKHRpbWVQZXJpb2QgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpdGltZVBlcmlvZCkuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIE1zcHJvamVjdFBhY2thZ2UuV0VFS19EQVlfX1RJTUVfUEVSSU9ELCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdUaW1lUGVyaW9kICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld1RpbWVQZXJpb2QpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBNc3Byb2plY3RQYWNrYWdlLldFRUtfREFZX19USU1FX1BFUklPRCwgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRUaW1lUGVyaW9kKG5ld1RpbWVQZXJpb2QsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5XRUVLX0RBWV9fVElNRV9QRVJJT0QsIG5ld1RpbWVQZXJpb2QsIG5ld1RpbWVQZXJpb2QpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgV29ya2luZ1RpbWVzIGdldFdvcmtpbmdUaW1lcygpIHsKLQkJcmV0dXJuIHdvcmtpbmdUaW1lczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRXb3JraW5nVGltZXMoV29ya2luZ1RpbWVzIG5ld1dvcmtpbmdUaW1lcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlXb3JraW5nVGltZXMgb2xkV29ya2luZ1RpbWVzID0gd29ya2luZ1RpbWVzOwotCQl3b3JraW5nVGltZXMgPSBuZXdXb3JraW5nVGltZXM7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuV0VFS19EQVlfX1dPUktJTkdfVElNRVMsIG9sZFdvcmtpbmdUaW1lcywgbmV3V29ya2luZ1RpbWVzKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRXb3JraW5nVGltZXMoV29ya2luZ1RpbWVzIG5ld1dvcmtpbmdUaW1lcykgewotCQlpZiAobmV3V29ya2luZ1RpbWVzICE9IHdvcmtpbmdUaW1lcykgewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAod29ya2luZ1RpbWVzICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KXdvcmtpbmdUaW1lcykuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIE1zcHJvamVjdFBhY2thZ2UuV0VFS19EQVlfX1dPUktJTkdfVElNRVMsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld1dvcmtpbmdUaW1lcyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdXb3JraW5nVGltZXMpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBNc3Byb2plY3RQYWNrYWdlLldFRUtfREFZX19XT1JLSU5HX1RJTUVTLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldFdvcmtpbmdUaW1lcyhuZXdXb3JraW5nVGltZXMsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5XRUVLX0RBWV9fV09SS0lOR19USU1FUywgbmV3V29ya2luZ1RpbWVzLCBuZXdXb3JraW5nVGltZXMpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuV0VFS19EQVlfX1RJTUVfUEVSSU9EOgotCQkJCQlyZXR1cm4gYmFzaWNTZXRUaW1lUGVyaW9kKG51bGwsIG1zZ3MpOwotCQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5XRUVLX0RBWV9fV09SS0lOR19USU1FUzoKLQkJCQkJcmV0dXJuIGJhc2ljU2V0V29ya2luZ1RpbWVzKG51bGwsIG1zZ3MpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLldFRUtfREFZX19EQVlfVFlQRToKLQkJCQlyZXR1cm4gZ2V0RGF5VHlwZSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLldFRUtfREFZX19EQVlfV09SS0lORzoKLQkJCQlyZXR1cm4gaXNEYXlXb3JraW5nKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLldFRUtfREFZX19USU1FX1BFUklPRDoKLQkJCQlyZXR1cm4gZ2V0VGltZVBlcmlvZCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLldFRUtfREFZX19XT1JLSU5HX1RJTUVTOgotCQkJCXJldHVybiBnZXRXb3JraW5nVGltZXMoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuV0VFS19EQVlfX0RBWV9UWVBFOgotCQkJCXNldERheVR5cGUoKEJpZ0ludGVnZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5XRUVLX0RBWV9fREFZX1dPUktJTkc6Ci0JCQkJc2V0RGF5V29ya2luZygoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuV0VFS19EQVlfX1RJTUVfUEVSSU9EOgotCQkJCXNldFRpbWVQZXJpb2QoKFRpbWVQZXJpb2QpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5XRUVLX0RBWV9fV09SS0lOR19USU1FUzoKLQkJCQlzZXRXb3JraW5nVGltZXMoKFdvcmtpbmdUaW1lcyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5XRUVLX0RBWV9fREFZX1RZUEU6Ci0JCQkJc2V0RGF5VHlwZShEQVlfVFlQRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLldFRUtfREFZX19EQVlfV09SS0lORzoKLQkJCQl1bnNldERheVdvcmtpbmcoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuV0VFS19EQVlfX1RJTUVfUEVSSU9EOgotCQkJCXNldFRpbWVQZXJpb2QoKFRpbWVQZXJpb2QpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLldFRUtfREFZX19XT1JLSU5HX1RJTUVTOgotCQkJCXNldFdvcmtpbmdUaW1lcygoV29ya2luZ1RpbWVzKW51bGwpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLldFRUtfREFZX19EQVlfVFlQRToKLQkJCQlyZXR1cm4gREFZX1RZUEVfRURFRkFVTFQgPT0gbnVsbCA/IGRheVR5cGUgIT0gbnVsbCA6ICFEQVlfVFlQRV9FREVGQVVMVC5lcXVhbHMoZGF5VHlwZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuV0VFS19EQVlfX0RBWV9XT1JLSU5HOgotCQkJCXJldHVybiBpc1NldERheVdvcmtpbmcoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5XRUVLX0RBWV9fVElNRV9QRVJJT0Q6Ci0JCQkJcmV0dXJuIHRpbWVQZXJpb2QgIT0gbnVsbDsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5XRUVLX0RBWV9fV09SS0lOR19USU1FUzoKLQkJCQlyZXR1cm4gd29ya2luZ1RpbWVzICE9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChkYXlUeXBlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChkYXlUeXBlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBkYXlXb3JraW5nOiAiKTsKLQkJaWYgKGRheVdvcmtpbmdFU2V0KSByZXN1bHQuYXBwZW5kKGRheVdvcmtpbmcpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vV2Vla0RheUltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9XZWVrRGF5c0ltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9XZWVrRGF5c0ltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmMwYmRhYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvV2Vla0RheXNJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDkgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBXZWVrRGF5c0ltcGwuamF2YSx2IDEuMSAyMDA4LzAxLzE1IDA4OjUxOjUzIGp0aGFtIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5XZWVrRGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV2Vla0RheXM7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5XZWVrIERheXM8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5XZWVrRGF5c0ltcGwjZ2V0V2Vla0RheSA8ZW0+V2VlayBEYXk8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBXZWVrRGF5c0ltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIFdlZWtEYXlzIHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRXZWVrRGF5KCkgPGVtPldlZWsgRGF5PC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFdlZWtEYXkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCB3ZWVrRGF5ID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBXZWVrRGF5c0ltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXRXZWVrRGF5cygpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRXZWVrRGF5KCkgewotCQlpZiAod2Vla0RheSA9PSBudWxsKSB7Ci0JCQl3ZWVrRGF5ID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KFdlZWtEYXkuY2xhc3MsIHRoaXMsIE1zcHJvamVjdFBhY2thZ2UuV0VFS19EQVlTX19XRUVLX0RBWSk7Ci0JCX0KLQkJcmV0dXJuIHdlZWtEYXk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLldFRUtfREFZU19fV0VFS19EQVk6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0V2Vla0RheSgpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuV0VFS19EQVlTX19XRUVLX0RBWToKLQkJCQlyZXR1cm4gZ2V0V2Vla0RheSgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5XRUVLX0RBWVNfX1dFRUtfREFZOgotCQkJCWdldFdlZWtEYXkoKS5jbGVhcigpOwotCQkJCWdldFdlZWtEYXkoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuV0VFS19EQVlTX19XRUVLX0RBWToKLQkJCQlnZXRXZWVrRGF5KCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5XRUVLX0RBWVNfX1dFRUtfREFZOgotCQkJCXJldHVybiB3ZWVrRGF5ICE9IG51bGwgJiYgIXdlZWtEYXkuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLX0gLy9XZWVrRGF5c0ltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9Xb3JraW5nVGltZUltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9Xb3JraW5nVGltZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGNhNTZjMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvV29ya2luZ1RpbWVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTMgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBXb3JraW5nVGltZUltcGwuamF2YSx2IDEuMSAyMDA4LzAxLzE1IDA4OjUxOjUzIGp0aGFtIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Xb3JraW5nVGltZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPldvcmtpbmcgVGltZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLldvcmtpbmdUaW1lSW1wbCNnZXRGcm9tVGltZSA8ZW0+RnJvbSBUaW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuV29ya2luZ1RpbWVJbXBsI2dldFRvVGltZSA8ZW0+VG8gVGltZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFdvcmtpbmdUaW1lSW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgV29ya2luZ1RpbWUgewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRGcm9tVGltZSgpIDxlbT5Gcm9tIFRpbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEZyb21UaW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIE9iamVjdCBGUk9NX1RJTUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RnJvbVRpbWUoKSA8ZW0+RnJvbSBUaW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRGcm9tVGltZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBmcm9tVGltZSA9IEZST01fVElNRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUb1RpbWUoKSA8ZW0+VG8gVGltZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VG9UaW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIE9iamVjdCBUT19USU1FX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFRvVGltZSgpIDxlbT5UbyBUaW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUb1RpbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgdG9UaW1lID0gVE9fVElNRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBXb3JraW5nVGltZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXRXb3JraW5nVGltZSgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0RnJvbVRpbWUoKSB7Ci0JCXJldHVybiBmcm9tVGltZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGcm9tVGltZShPYmplY3QgbmV3RnJvbVRpbWUpIHsKLQkJT2JqZWN0IG9sZEZyb21UaW1lID0gZnJvbVRpbWU7Ci0JCWZyb21UaW1lID0gbmV3RnJvbVRpbWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuV09SS0lOR19USU1FX19GUk9NX1RJTUUsIG9sZEZyb21UaW1lLCBmcm9tVGltZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0VG9UaW1lKCkgewotCQlyZXR1cm4gdG9UaW1lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRvVGltZShPYmplY3QgbmV3VG9UaW1lKSB7Ci0JCU9iamVjdCBvbGRUb1RpbWUgPSB0b1RpbWU7Ci0JCXRvVGltZSA9IG5ld1RvVGltZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5XT1JLSU5HX1RJTUVfX1RPX1RJTUUsIG9sZFRvVGltZSwgdG9UaW1lKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLldPUktJTkdfVElNRV9fRlJPTV9USU1FOgotCQkJCXJldHVybiBnZXRGcm9tVGltZSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLldPUktJTkdfVElNRV9fVE9fVElNRToKLQkJCQlyZXR1cm4gZ2V0VG9UaW1lKCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLldPUktJTkdfVElNRV9fRlJPTV9USU1FOgotCQkJCXNldEZyb21UaW1lKChPYmplY3QpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5XT1JLSU5HX1RJTUVfX1RPX1RJTUU6Ci0JCQkJc2V0VG9UaW1lKChPYmplY3QpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuV09SS0lOR19USU1FX19GUk9NX1RJTUU6Ci0JCQkJc2V0RnJvbVRpbWUoRlJPTV9USU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuV09SS0lOR19USU1FX19UT19USU1FOgotCQkJCXNldFRvVGltZShUT19USU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5XT1JLSU5HX1RJTUVfX0ZST01fVElNRToKLQkJCQlyZXR1cm4gRlJPTV9USU1FX0VERUZBVUxUID09IG51bGwgPyBmcm9tVGltZSAhPSBudWxsIDogIUZST01fVElNRV9FREVGQVVMVC5lcXVhbHMoZnJvbVRpbWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLldPUktJTkdfVElNRV9fVE9fVElNRToKLQkJCQlyZXR1cm4gVE9fVElNRV9FREVGQVVMVCA9PSBudWxsID8gdG9UaW1lICE9IG51bGwgOiAhVE9fVElNRV9FREVGQVVMVC5lcXVhbHModG9UaW1lKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGZyb21UaW1lOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChmcm9tVGltZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgdG9UaW1lOiAiKTsKLQkJcmVzdWx0LmFwcGVuZCh0b1RpbWUpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9Xb3JraW5nVGltZUltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9Xb3JraW5nVGltZXNJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvV29ya2luZ1RpbWVzSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZmYyNGU2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9Xb3JraW5nVGltZXNJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDkgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBXb3JraW5nVGltZXNJbXBsLmphdmEsdiAxLjEgMjAwOC8wMS8xNSAwODo1MTo1MyBqdGhhbSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV29ya2luZ1RpbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Xb3JraW5nVGltZXM7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Xb3JraW5nIFRpbWVzPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuV29ya2luZ1RpbWVzSW1wbCNnZXRXb3JraW5nVGltZSA8ZW0+V29ya2luZyBUaW1lPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgV29ya2luZ1RpbWVzSW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgV29ya2luZ1RpbWVzIHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRXb3JraW5nVGltZSgpIDxlbT5Xb3JraW5nIFRpbWU8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0V29ya2luZ1RpbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCB3b3JraW5nVGltZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgV29ya2luZ1RpbWVzSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldFdvcmtpbmdUaW1lcygpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRXb3JraW5nVGltZSgpIHsKLQkJaWYgKHdvcmtpbmdUaW1lID09IG51bGwpIHsKLQkJCXdvcmtpbmdUaW1lID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KFdvcmtpbmdUaW1lLmNsYXNzLCB0aGlzLCBNc3Byb2plY3RQYWNrYWdlLldPUktJTkdfVElNRVNfX1dPUktJTkdfVElNRSk7Ci0JCX0KLQkJcmV0dXJuIHdvcmtpbmdUaW1lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5XT1JLSU5HX1RJTUVTX19XT1JLSU5HX1RJTUU6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0V29ya2luZ1RpbWUoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLldPUktJTkdfVElNRVNfX1dPUktJTkdfVElNRToKLQkJCQlyZXR1cm4gZ2V0V29ya2luZ1RpbWUoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuV09SS0lOR19USU1FU19fV09SS0lOR19USU1FOgotCQkJCWdldFdvcmtpbmdUaW1lKCkuY2xlYXIoKTsKLQkJCQlnZXRXb3JraW5nVGltZSgpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5XT1JLSU5HX1RJTUVTX19XT1JLSU5HX1RJTUU6Ci0JCQkJZ2V0V29ya2luZ1RpbWUoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLldPUktJTkdfVElNRVNfX1dPUktJTkdfVElNRToKLQkJCQlyZXR1cm4gd29ya2luZ1RpbWUgIT0gbnVsbCAmJiAhd29ya2luZ1RpbWUuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLX0gLy9Xb3JraW5nVGltZXNJbXBsCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvbXNwcm9qZWN0LmVjb3JlIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL21zcHJvamVjdC5lY29yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzFlYmQyMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvbXNwcm9qZWN0LmVjb3JlCisrKyAvZGV2L251bGwKQEAgLTEsNTUxMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGVjb3JlOkVQYWNrYWdlIHhtaTp2ZXJzaW9uPSIyLjAiCi0gICAgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICAgIHhtbG5zOmVjb3JlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIiBuYW1lPSJtc3Byb2plY3QiCi0gICAgbnNVUkk9Imh0dHA6Ly9lcGYuZWNsaXBzZS5vcmcvbXNwcm9qZWN0IiBuc1ByZWZpeD0ibXNwcm9qZWN0Ij4KLSAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBmdWxsIHByb2plY3Qgc2NoZW1hIGRlZmluaXRpb24gZnJvbSB0aGUgcHJvamVjdCBsZXZlbCBkb3duLCAmI3hEOyYjeEE7JiN4OTsmI3g5O3N0YXJ0aW5nIHdpdGggZGF0YSB0eXBlIGRlZmluaXRpb25zLiIvPgotICA8L2VBbm5vdGF0aW9ucz4KLSAgPGVBbm5vdGF0aW9ucz4KLSAgICA8ZGV0YWlscyBrZXk9ImFwcGluZm8iIHZhbHVlPSJUaGUgTWljcm9zb2Z0IFByb2plY3QgRGF0YSBJbnRlcmNoYW5nZSBTY2hlbWEgZm9yIE1pY3Jvc29mdCBQcm9qZWN0IDEwLiYjeEQ7JiN4QTsmI3g5OyYjeDk7Ii8+Ci0gIDwvZUFubm90YXRpb25zPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IkFjY3J1ZUF0IiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5tYXRoLkJpZ0ludGVnZXIiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQWNjcnVlQXRfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXIiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iZW51bWVyYXRpb24iIHZhbHVlPSIxIDIgMyIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJBY3RpdmVEaXJlY3RvcnlHVUlEVHlwZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubGFuZy5TdHJpbmciPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQWN0aXZlRGlyZWN0b3J5R1VJRF8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjc3RyaW5nIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im1heExlbmd0aCIgdmFsdWU9IjE2Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IkFsaWFzVHlwZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubGFuZy5TdHJpbmciPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQWxpYXNfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3N0cmluZyIvPgotICAgICAgPGRldGFpbHMga2V5PSJtYXhMZW5ndGgiIHZhbHVlPSI1MCIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJBc3NpZ25tZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkFzc2lnbm1lbnRfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ1SUQiIHVuaXF1ZT0iZmFsc2UiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vSW50ZWdlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgYXNzaWdubWVudC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJVSUQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ0YXNrVUlEIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0ludGVnZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIHRhc2suJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVGFza1VJRCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJlc291cmNlVUlEIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0ludGVnZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIHJlc291cmNlLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlJlc291cmNlVUlEIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icGVyY2VudFdvcmtDb21wbGV0ZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9JbnRlZ2VyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGFtb3VudCBvZiB3b3JrIGNvbXBsZXRlZCBvbiB0aGUgYXNzaWdubWVudC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJQZXJjZW50V29ya0NvbXBsZXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYWN0dWFsQ29zdCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EZWNpbWFsIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGFjdHVhbCBjb3N0IGluY3VycmVkIG9uIHRoZSBhc3NpZ25tZW50LiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkFjdHVhbENvc3QiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhY3R1YWxGaW5pc2giIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGF0ZVRpbWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYWN0dWFsIGZpbmlzaCBkYXRlIG9mIHRoZSBhc3NpZ25tZW50LiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkFjdHVhbEZpbmlzaCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFjdHVhbE92ZXJ0aW1lQ29zdCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EZWNpbWFsIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGFjdHVhbCBvdmVydGltZSBjb3N0IGluY3VycmVkIG9uIHRoZSBhc3NpZ25tZW50LiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkFjdHVhbE92ZXJ0aW1lQ29zdCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFjdHVhbE92ZXJ0aW1lV29yayIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EdXJhdGlvbiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBhY3R1YWwgYW1vdW50IG9mIG92ZXJ0aW1lIHdvcmsgaW5jdXJyZWQgb24gdGhlIGFzc2lnbm1lbnQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQWN0dWFsT3ZlcnRpbWVXb3JrIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYWN0dWFsU3RhcnQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGF0ZVRpbWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYWN0dWFsIHN0YXJ0IGRhdGUgb2YgdGhlIGFzc2lnbm1lbnQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQWN0dWFsU3RhcnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhY3R1YWxXb3JrIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0R1cmF0aW9uIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGFjdHVhbCBhbW91bnQgb2Ygd29yayBpbmN1cnJlZCBvbiB0aGUgYXNzaWdubWVudC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJBY3R1YWxXb3JrIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYUNXUCIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9GbG9hdCIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBhY3R1YWwgY29zdCBvZiB3b3JrIHBlcmZvcm1lZCBvbiB0aGUgYXNzaWdubWVudCB0by1kYXRlLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkFDV1AiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjb25maXJtZWQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldoZXRoZXIgdGhlIFJlc291cmNlIGhhcyBhY2NlcHRlZCBhbGwgb2YgaGlzIG9yIGhlciBhc3NpZ25tZW50cy4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDb25maXJtZWQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjb3N0IiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RlY2ltYWwiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgcHJvamVjdGVkIG9yIHNjaGVkdWxlZCBjb3N0IG9mIHRoZSBhc3NpZ25tZW50LiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkNvc3QiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjb3N0UmF0ZVRhYmxlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vQ29zdFJhdGVUYWJsZVR5cGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgY29zdCByYXRlIHRhYmxlIHVzZWQgZm9yIHRoZSBhc3NpZ25tZW50LiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkNvc3RSYXRlVGFibGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjb3N0VmFyaWFuY2UiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRmxvYXQiIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBjb3N0IGFuZCBiYXNlbGluZSBjb3N0IGZvciBhIHJlc291cmNlLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkNvc3RWYXJpYW5jZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNWIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Zsb2F0IgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRWFybmVkIHZhbHVlIGNvc3QgdmFyaWFuY2UuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ1YiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJkZWxheSIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9JbnRlZ2VyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGFtb3VudCB0aGF0IHRoZSBhc3NpZ25tZW50IGlzIGRlbGF5ZWQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRGVsYXkiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJmaW5pc2giIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGF0ZVRpbWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgc2NoZWR1bGVkIGZpbmlzaCBkYXRlIG9mIHRoZSBhc3NpZ25tZW50LiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkZpbmlzaCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImZpbmlzaFZhcmlhbmNlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0ludGVnZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdmFyaWFuY2Ugb2YgdGhlIGFzc2lnbm1lbnQgZmluaXNoIGRhdGUgZnJvbSB0aGUgYmFzZWxpbmUgZmluaXNoIGRhdGUuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRmluaXNoVmFyaWFuY2UiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJoeXBlcmxpbmsiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9IeXBlcmxpbmtUeXBlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHRpdGxlIG9mIHRoZSBoeXBlcmxpbmsgYXNzb2NpYXRlZCB3aXRoIHRoZSBhc3NpZ25tZW50LiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ikh5cGVybGluayIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Imh5cGVybGlua0FkZHJlc3MiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9IeXBlcmxpbmtBZGRyZXNzVHlwZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBoeXBlcmxpbmsgYXNzb2NpYXRlZCB3aXRoIHRoZSBhc3NpZ25tZW50LiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ikh5cGVybGlua0FkZHJlc3MiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJoeXBlcmxpbmtTdWJBZGRyZXNzIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vSHlwZXJsaW5rU3ViQWRkcmVzc1R5cGUxIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGRvY3VtZW50IGJvb2ttYXJrIG9mIHRoZSBoeXBlcmxpbmsgYXNzb2NpYXRlZCB3aXRoIHRoZSBhc3NpZ25tZW50LiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ikh5cGVybGlua1N1YkFkZHJlc3MiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ3b3JrVmFyaWFuY2UiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRmxvYXQiIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdmFyaWFuY2Ugb2YgYXNzaWdubWVudCB3b3JrIGZyb20gdGhlIGJhc2VsaW5lIHdvcmsgYXMgbWludXRlcyB4IDEwMDAuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iV29ya1ZhcmlhbmNlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaGFzRml4ZWRSYXRlVW5pdHMiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldoZXRoZXIgdGhlIFVuaXRzIGFyZSBGaXhlZCBSYXRlLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ikhhc0ZpeGVkUmF0ZVVuaXRzIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZml4ZWRNYXRlcmlhbCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV2hldGhlciB0aGUgY29uc3VtcHRpb24gb2YgdGhlIGFzc2lnbmVkIG1hdGVyaWFsIHJlc291cmNlIG9jY3VycyBpbiBhIHNpbmdsZSwgZml4ZWQgYW1vdW50LiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkZpeGVkTWF0ZXJpYWwiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJsZXZlbGluZ0RlbGF5IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0ludGVnZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZGVsYXkgY2F1c2VkIGJ5IGxldmVsaW5nLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkxldmVsaW5nRGVsYXkiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJsZXZlbGluZ0RlbGF5Rm9ybWF0IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vTGV2ZWxpbmdEZWxheUZvcm1hdFR5cGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZm9ybWF0IGZvciBleHByZXNzaW5nIHRoZSBkdXJhdGlvbiBvZiB0aGUgZGVsYXkuICAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlcyBhcmU6IDM9bSwgND1lbSwgNT1oLCA2PWVoLCA3PWQsIDg9ZWQsIDk9dywgMTA9ZXcsIDExPW1vLCAxMj1lbW8sIDE5PSUsIDIwPWUlLCAyMT1udWxsLCAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDM1PW0/LCAzNj1lbT8sIDM3PWg/LCAzOD1laD8sIDM5PWQ/LCA0MD1lZD8sIDQxPXc/LCA0Mj1ldz8sIDQzPW1vPywgNDQ9ZW1vPywgNTE9JT8sIDUyPWUlPyBhbmQgNTM9bnVsbC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJMZXZlbGluZ0RlbGF5Rm9ybWF0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibGlua2VkRmllbGRzIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXaGV0aGVyIHRoZSBQcm9qZWN0IGlzIGxpbmtlZCB0byBhbm90aGVyIE9MRSBvYmplY3QuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTGlua2VkRmllbGRzIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibWlsZXN0b25lIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXaGV0aGVyIHRoZSBhc3NpZ25tZW50IGlzIGEgbWlsZXN0b25lLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik1pbGVzdG9uZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im5vdGVzIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRleHQgbm90ZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBhc3NpZ25tZW50LiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik5vdGVzIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ib3ZlcmFsbG9jYXRlZCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV2hldGhlciB0aGUgYXNzaWdubWVudCBpcyBvdmVyYWxsb2NhdGVkLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik92ZXJhbGxvY2F0ZWQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJvdmVydGltZUNvc3QiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGVjaW1hbCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBzdW0gb2YgdGhlIGFjdHVhbCBhbmQgcmVtYWluaW5nIG92ZXJ0aW1lIGNvc3Qgb2YgdGhlIGFzc2lnbm1lbnQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iT3ZlcnRpbWVDb3N0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ib3ZlcnRpbWVXb3JrIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0R1cmF0aW9uIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHNjaGVkdWxlZCBvdmVydGltZSB3b3JrIHNjaGVkdWxlZCBmb3IgdGhlIGFzc2lnbm1lbnQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iT3ZlcnRpbWVXb3JrIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmVndWxhcldvcmsiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRHVyYXRpb24iPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYW1vdW50IG9mIG5vbi1vdmVydGltZSB3b3JrIHNjaGVkdWxlZCBmb3IgdGhlIGFzc2lnbm1lbnQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUmVndWxhcldvcmsiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyZW1haW5pbmdDb3N0IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RlY2ltYWwiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgcmVtYWluaW5nIHByb2plY3RlZCBjb3N0IG9mIGNvbXBsZXRpbmcgdGhlIGFzc2lnbm1lbnQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUmVtYWluaW5nQ29zdCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJlbWFpbmluZ092ZXJ0aW1lQ29zdCIKLSAgICAgICAgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EZWNpbWFsIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHJlbWFpbmluZyBwcm9qZWN0ZWQgb3ZlcnRpbWUgY29zdCBvZiBjb21wbGV0aW5nIHRoZSBhc3NpZ25tZW50LiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlJlbWFpbmluZ092ZXJ0aW1lQ29zdCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJlbWFpbmluZ092ZXJ0aW1lV29yayIKLSAgICAgICAgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EdXJhdGlvbiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSByZW1haW5pbmcgb3ZlcnRpbWUgd29yayBzY2hlZHVsZWQgdG8gY29tcGxldGUgdGhlIGFzc2lnbm1lbnQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUmVtYWluaW5nT3ZlcnRpbWVXb3JrIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmVtYWluaW5nV29yayIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EdXJhdGlvbiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSByZW1haW5pbmcgd29yayBzY2hlZHVsZWQgdG8gY29tcGxldGUgdGhlIGFzc2lnbm1lbnQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUmVtYWluaW5nV29yayIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJlc3BvbnNlUGVuZGluZyIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVHJ1ZSBpZiBhIHJlc3BvbnNlIGhhcyBub3QgYmVlbiByZWNlaXZlZCBmb3IgYSBUZWFtQXNzaWduIG1lc3NhZ2UuICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlJlc3BvbnNlUGVuZGluZyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InN0YXJ0IiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RhdGVUaW1lIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHNjaGVkdWxlZCBzdGFydCBkYXRlIG9mIHRoZSBhc3NpZ25tZW50LiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlN0YXJ0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic3RvcCIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EYXRlVGltZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBkYXRlIHRoYXQgdGhlIGFzc2lnbm1lbnQgd2FzIHN0b3BwZWQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iU3RvcCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJlc3VtZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EYXRlVGltZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBkYXRlIHRoYXQgdGhlIGFzc2lnbm1lbnQgcmVzdW1lZC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJSZXN1bWUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzdGFydFZhcmlhbmNlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0ludGVnZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdmFyaWFuY2Ugb2YgdGhlIGFzc2lnbm1lbnQgc3RhcnQgZGF0ZSBmcm9tIHRoZSBiYXNlbGluZSBzdGFydCBkYXRlLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlN0YXJ0VmFyaWFuY2UiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ1bml0cyIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9GbG9hdCIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBudW1iZXIgb2YgdW5pdHMgZm9yIHRoZSBhc3NpZ25tZW50LiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlVuaXRzIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idXBkYXRlTmVlZGVkIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUcnVlIGlmIHRoZSByZXNvdXJjZSBhc3NpZ25lZCB0byBhIHRhc2sgbmVlZHMgdG8gYmUgdXBkYXRlZCBhcyB0byB0aGUgc3RhdHVzIG9mIHRoZSB0YXNrLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlVwZGF0ZU5lZWRlZCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InZBQyIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9GbG9hdCIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBkaWZmZXJlbmNlIGJldHdlZW4gYmFzbGluZSBjb3N0IGFuZCB0b3RhbCBjb3N0LiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlZBQyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9IndvcmsiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRHVyYXRpb24iPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYW1vdW50IG9mIHNjaGVkdWxlZCB3b3JrIGZvciB0aGUgYXNzaWdubWVudC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJXb3JrIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0id29ya0NvbnRvdXIiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9Xb3JrQ29udG91clR5cGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgd29yayBjb250b3VyIG9mIHRoZSBhc3NpZ25tZW50LiAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlcyBhcmU6IDA9RmxhdCwgMT1CYWNrIExvYWRlZCwgMj1Gcm9udCBMb2FkZWQsIDM9RG91YmxlIFBlYWssIDQ9RWFybHkgUGVhaywgNT1MYXRlIFBlYWssICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgNj1CZWxsLCA3PVR1cnRsZSwgOD1Db250b3VyZWQmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJXb3JrQ29udG91ciIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImJDV1MiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRmxvYXQiCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYnVkZ2V0ZWQgY29zdCBvZiB3b3JrIG9uIHRoZSBhc3NpZ25tZW50LiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkJDV1MiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJiQ1dQIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Zsb2F0IgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGJ1ZGdldGVkIGNvc3Qgb2Ygd29yayBwZXJmb3JtZWQgb24gdGhlIGFzc2lnbm1lbnQgdG8tZGF0ZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJCQ1dQIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYm9va2luZ1R5cGUiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9Cb29raW5nVHlwZVR5cGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJTcGVjaWZpZXMgdGhlIGJvb2tpbmcgdHlwZSBvZiB0aGUgYXNzaWdubWVudC4gMT1Db21taXRlZCwgMj1Qcm9wb3NlZCYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkJvb2tpbmdUeXBlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYWN0dWFsV29ya1Byb3RlY3RlZCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EdXJhdGlvbiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlNwZWNpZmllcyB0aGUgZHVyYXRpb24gdGhyb3VnaCB3aGljaCBhY3R1YWwgd29yayBpcyBwcm90ZWN0ZWQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQWN0dWFsV29ya1Byb3RlY3RlZCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZCIKLSAgICAgICAgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EdXJhdGlvbiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlNwZWNpZmllcyB0aGUgZHVyYXRpb24gdGhyb3VnaCB3aGljaCBhY3R1YWwgb3ZlcnRpbWUgd29yayBpcyBwcm90ZWN0ZWQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY3JlYXRpb25EYXRlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RhdGVUaW1lIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGRhdGUgdGhhdCB0aGUgYXNzaWdubWVudCB3YXMgY3JlYXRlZC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ3JlYXRpb25EYXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZXh0ZW5kZWRBdHRyaWJ1dGUiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vRXh0ZW5kZWRBdHRyaWJ1dGU0IiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHZhbHVlIG9mIGFuIGV4dGVuZGVkIGF0dHJpYnV0ZS4gIFR3byBwaWVjZXMgb2YgZGF0YSBhcmUgbmVjZXNzYXJ5IC0gJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhIHBvaW50ZXIgYmFjayB0byB0aGUgZXh0ZW5kZWQgYXR0cmlidXRlIHRhYmxlIHdoaWNoIGlzIHNwZWNpZmllZCBlaXRoZXIgYnkgdGhlIHVuaXF1ZSBJRCBvciB0aGUgJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWVsZCBJRCwgYW5kIHRoZSB2YWx1ZSB3aGljaCBpcyBzcGVjaWZpZWQgZWl0aGVyIHdpdGggdGhlIHZhbHVlLCBvciBhIHBvaW50ZXIgYmFjayB0byB0aGUgdmFsdWUgbGlzdC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJFeHRlbmRlZEF0dHJpYnV0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImJhc2VsaW5lIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL0Jhc2VsaW5lMyIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBjb2xsZWN0aW9uIG9mIGJhc2VsaW5lIHZhbHVlcyBhc3NvY2lhdGVkIHdpdGggdGhlIGFzc2lnbm1lbnQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQmFzZWxpbmUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ0aW1lcGhhc2VkRGF0YSIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9UaW1lcGhhc2VkRGF0YVR5cGUiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdGltZSBwaGFzZWQgZGF0YSBhc3NvY2lhdGVkIHdpdGggdGhlIGFzc2lnbm1lbnQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVGltZXBoYXNlZERhdGEiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJBc3NpZ25tZW50cyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJBc3NpZ25tZW50c18uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImFzc2lnbm1lbnQiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vQXNzaWdubWVudCIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZXJlIG11c3QgYmUgYXQgbGVhc3Qgb25lIGFzc2lnbm1lbnQgaW4gZWFjaCBBc3NpZ25tZW50cyBjb2xsZWN0aW9uLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkFzc2lnbm1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJBdXRob3JUeXBlIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5sYW5nLlN0cmluZyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJBdXRob3JfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3N0cmluZyIvPgotICAgICAgPGRldGFpbHMga2V5PSJtYXhMZW5ndGgiIHZhbHVlPSI1MTIiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQXZhaWxhYmlsaXR5UGVyaW9kIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkF2YWlsYWJpbGl0eVBlcmlvZF8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImF2YWlsYWJsZUZyb20iIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGF0ZVRpbWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZGF0ZSB0aGF0IHRoZSByZXNvdXJjZSBiZWNvbWVzIGF2YWlsYWJsZSBmb3IgdGhlIHNwZWNpZmllZCBwZXJpb2QuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkF2YWlsYWJsZUZyb20iLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhdmFpbGFibGVUbyIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EYXRlVGltZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBsYXN0IGRhdGUgdGhhdCB0aGUgcmVzb3VyY2UgaXMgYXZhaWxhYmxlIGZvciB0aGUgc3BlY2lmaWVkIHBlcmlvZC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQXZhaWxhYmxlVG8iLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhdmFpbGFibGVVbml0cyIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9GbG9hdCIgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBwZXJjZW50YWdlIHRoYXQgdGhlIHJlc291cmNlIGlzIGF2YWlsYWJsZSBkdXJpbmcgdGhlIHNwZWNpZmllZCBwZXJpb2QuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkF2YWlsYWJsZVVuaXRzIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQXZhaWxhYmlsaXR5UGVyaW9kcyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJBdmFpbGFiaWxpdHlQZXJpb2RzXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iYXZhaWxhYmlsaXR5UGVyaW9kIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL0F2YWlsYWJpbGl0eVBlcmlvZCIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBwZXJpb2QgdGhlIHJlc291cmNlIGlzIGF2YWlsYWJsZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQXZhaWxhYmlsaXR5UGVyaW9kIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQmFzZWxpbmUiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQmFzZWxpbmVfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ0aW1lcGhhc2VkRGF0YSIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9UaW1lcGhhc2VkRGF0YVR5cGUiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdGltZSBwaGFzZWQgZGF0YSBibG9jayBhc3NvY2lhdGVkIHdpdGggdGhlIHRhc2sgYmFzZWxpbmUuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlRpbWVwaGFzZWREYXRhIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibnVtYmVyIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0ludGVnZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdW5pcXVlIG51bWJlciBvZiB0aGUgYmFzZWxpbmUgZGF0YSByZWNvcmQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik51bWJlciIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImludGVyaW0iIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXaGV0aGVyIHRoaXMgaXMgYW4gSW50ZXJpbSBCYXNlbGluZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iSW50ZXJpbSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InN0YXJ0IiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RhdGVUaW1lIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHNjaGVkdWxlZCBzdGFydCBkYXRlIG9mIHRoZSB0YXNrIHdoZW4gdGhlIGJhc2VsaW5lIHdhcyBzYXZlZC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iU3RhcnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJmaW5pc2giIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGF0ZVRpbWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgc2NoZWR1bGVkIGZpbmlzaCBkYXRlIG9mIHRoZSB0YXNrIHdoZW4gdGhlIGJhc2VsaW5lIHdhcyBzYXZlZC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRmluaXNoIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZHVyYXRpb24iIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRHVyYXRpb24iPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgc2NoZWR1bGVkIGR1cmF0aW9uIG9mIHRoZSB0YXNrIHdoZW4gdGhlIGJhc2VsaW5lIHdhcyBzYXZlZC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRHVyYXRpb24iLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJkdXJhdGlvbkZvcm1hdCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL0R1cmF0aW9uRm9ybWF0VHlwZTEiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZm9ybWF0IGZvciBleHByZXNzaW5nIHRoZSBEdXJhdGlvbiBvZiB0aGUgVGFzayBiYXNlbGluZS4gICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlcyBhcmU6IDM9bSwgND1lbSwgNT1oLCA2PWVoLCA3PWQsIDg9ZWQsIDk9dywgMTA9ZXcsIDExPW1vLCAxMj1lbW8sIDE5PSUsIDIwPWUlLCAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMT1udWxsLCAzNT1tPywgMzY9ZW0/LCAzNz1oPywgMzg9ZWg/LCAzOT1kPywgNDA9ZWQ/LCA0MT13PywgNDI9ZXc/LCA0Mz1tbz8sIDQ0PWVtbz8sICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUxPSU/LCA1Mj1lJT8gYW5kIDUzPW51bGwuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkR1cmF0aW9uRm9ybWF0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZXN0aW1hdGVkRHVyYXRpb24iIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldoZXRoZXIgdGhlIGJhc2VsaW5lIGR1cmF0aW9uIG9mIHRoZSB0YXNrIHdhcyBlc3RpbWF0ZWQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkVzdGltYXRlZER1cmF0aW9uIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0id29yayIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EdXJhdGlvbiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBzY2hlZHVsZWQgd29yayBvZiB0aGUgdGFzayB3aGVuIHRoZSBiYXNlbGluZSB3YXMgc2F2ZWQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IldvcmsiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjb3N0IiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RlY2ltYWwiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgcHJvamVjdGVkIGNvc3Qgb2YgdGhlIHRhc2sgd2hlbiB0aGUgYmFzZWxpbmUgd2FzIHNhdmVkLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDb3N0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYkNXUyIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9GbG9hdCIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBidWRnZXRlZCBjb3N0IG9mIHdvcmsgc2NoZWR1bGVkIGZvciB0aGUgdGFzay4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQkNXUyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImJDV1AiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRmxvYXQiCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYnVkZ2V0ZWQgY29zdCBvZiB3b3JrIHBlcmZvcm1lZCBvbiB0aGUgdGFzayB0by1kYXRlLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJCQ1dQIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQmFzZWxpbmUyIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkJhc2VsaW5lXy5fMV8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im51bWJlciIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgbG93ZXJCb3VuZD0iMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9JbnRlZ2VyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHVuaXF1ZSBudW1iZXIgb2YgdGhlIGJhc2VsaW5lIGRhdGEgcmVjb3JkLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJOdW1iZXIiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ3b3JrIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0R1cmF0aW9uIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHdvcmsgYXNzaWduZWQgdGhlIHJlc291cmNlIHdoZW4gdGhlIGJhc2VsaW5lIGlzIHNhdmVkLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJXb3JrIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY29zdCIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9GbG9hdCIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBwcm9qZWN0ZWQgY29zdCBmb3IgdGhlIHJlc291cmNlIHdoZW4gdGhlIGJhc2VsaW5lIHdhcyBzYXZlZC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ29zdCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImJDV1MiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRmxvYXQiCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYnVkZ2V0IGNvc3Qgb2Ygd29yayBzY2hlZHVsZWQgZm9yIHRoZSByZXNvdXJjZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQkNXUyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImJDV1AiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRmxvYXQiCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYnVkZ2V0ZWQgY29zdCBvZiBvZiB0aGUgd29yayBwZXJmb3JtZWQgYnkgdGhlIHJlc291cmNlIGZvciB0aGUgcHJvamVjdCB0by1kYXRlLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJCQ1dQIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQmFzZWxpbmUzIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkJhc2VsaW5lXy5fMl8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InRpbWVwaGFzZWREYXRhIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL1RpbWVwaGFzZWREYXRhVHlwZSIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB0aW1lIHBoYXNlZCBkYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGUgQmFzZWxpbmUuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVGltZXBoYXNlZERhdGEiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJudW1iZXIiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGxvd2VyQm91bmQ9IjEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHVuaXF1ZSBudW1iZXIgb2YgdGhlIGJhc2VsaW5lIGRhdGEgcmVjb3JkLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik51bWJlciIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InN0YXJ0IiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBzY2hlZHVsZWQgc3RhcnQgZGF0ZSBvZiB0aGUgYXNzaWdubWVudCB3aGVuIHRoZSBiYXNlbGluZSB3YXMgc2F2ZWQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iU3RhcnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJmaW5pc2giIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHNjaGVkdWxlZCBmaW5pc2ggZGF0ZSBvZiB0aGUgYXNzaWdubWVudCB3aGVuIHRoZSBiYXNlbGluZSB3YXMgc2F2ZWQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRmluaXNoIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0id29yayIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EdXJhdGlvbiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB0b3RhbCBhbW91bnQgb2Ygd29yayBzY2hlZHVsZWQgb24gdGhlIGFzc2lnbm1lbnQgd2hlbiB0aGUgYmFzZWxpbmUgd2FzIHNhdmVkLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IldvcmsiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjb3N0IiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB0b3RhbCBwcm9qZWN0ZWQgY29zdCBvZiB0aGUgYXNzaWdubWVudCB3aGVuIHRoZSBiYXNlbGluZSB3YXMgc2F2ZWQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ29zdCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImJDV1MiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRmxvYXQiCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYnVkZ2V0ZWQgY29zdCBvZiB3b3JrIG9uIHRoZSBhc3NpZ25tZW50LiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkJDV1MiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJiQ1dQIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Zsb2F0IgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGJ1ZGdldGVkIGNvc3Qgb2Ygd29yayBwZXJmb3JtZWQgb24gdGhlIGFzc2lnbm1lbnQgdG8tZGF0ZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJCQ1dQIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iQmFzZWxpbmVGb3JFYXJuZWRWYWx1ZVR5cGUiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLm1hdGguQmlnSW50ZWdlciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJCYXNlbGluZUZvckVhcm5lZFZhbHVlXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImVudW1lcmF0aW9uIiB2YWx1ZT0iMCAxIDIgMyA0IDUgNiA3IDggOSAxMCIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJCb29raW5nVHlwZVR5cGUiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLm1hdGguQmlnSW50ZWdlciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJCb29raW5nVHlwZV8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjaW50ZWdlciIvPgotICAgICAgPGRldGFpbHMga2V5PSJlbnVtZXJhdGlvbiIgdmFsdWU9IjAgMSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJCb29raW5nVHlwZVR5cGUxIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5tYXRoLkJpZ0ludGVnZXIiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQm9va2luZ1R5cGVfLl8xXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImVudW1lcmF0aW9uIiB2YWx1ZT0iMCAxIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IkNhbGN1bGF0aW9uVHlwZVR5cGUiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLm1hdGguQmlnSW50ZWdlciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDYWxjdWxhdGlvblR5cGVfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXIiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iZW51bWVyYXRpb24iIHZhbHVlPSIwIDEgMiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJDYWxlbmRhciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDYWxlbmRhcl8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InVJRCIgdW5pcXVlPSJmYWxzZSIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9JbnRlZ2VyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBjYWxlbmRhci4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVUlEIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibmFtZSIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9IiMvL05hbWVUeXBlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIG5hbWUgb2YgdGhlIGNhbGVuZGFyLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJOYW1lIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaXNCYXNlQ2FsZW5kYXIiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldoZXRoZXIgdGhlIGNhbGVuZGFyIGlzIGEgYmFzZSBjYWxlbmRhci4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iSXNCYXNlQ2FsZW5kYXIiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJiYXNlQ2FsZW5kYXJVSUQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vSW50ZWdlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgYmFzZSBjYWxlbmRhciAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbiB3aGljaCB0aGlzIGNhbGVuZGFyIGRlcGVuZHMuIE9ubHkgYXBwbGljYWJsZSBpZiB0aGUgY2FsZW5kYXIgaXMgJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90IGEgYmFzZSBjYWxlbmRhci4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQmFzZUNhbGVuZGFyVUlEIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0id2Vla0RheXMiIGVUeXBlPSIjLy9XZWVrRGF5cyIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBjb2xsZWN0aW9uIG9mIFdlZWtkYXlzIHRoYXQgZGVmaW5lcyB0aGlzIGNhbGVuZGFyLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJXZWVrRGF5cyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkNhbGVuZGFycyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDYWxlbmRhcnNfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJjYWxlbmRhciIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9DYWxlbmRhciIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkNhbGVuZGFycyBhcmUgdXNlZCB0byBkZWZpbmUgc3RhbmRhcmQgd29ya2luZyBhbmQgJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgbm9uLXdvcmtpbmcgdGltZXMuIFByb2plY3RzIG11c3QgaGF2ZSBvbmUgYmFzZSBjYWxlbmRhci4gVGFza3MgYW5kIHJlc291cmNlcyAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICBtYXkgaGF2ZSB0aGVpciBvd24gbm9uLWJhc2UgY2FsZW5kYXJzIHdoaWNoIGFyZSBiYXNlZCBvbiBhIGJhc2UgY2FsZW5kYXIuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkNhbGVuZGFyIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iQ2F0ZWdvcnlUeXBlIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5sYW5nLlN0cmluZyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDYXRlZ29yeV8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjc3RyaW5nIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im1heExlbmd0aCIgdmFsdWU9IjUxMiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJDb2RlVHlwZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubGFuZy5TdHJpbmciPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ29kZV8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjc3RyaW5nIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im1heExlbmd0aCIgdmFsdWU9IjUxMiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJDb21wYW55VHlwZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubGFuZy5TdHJpbmciPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ29tcGFueV8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjc3RyaW5nIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im1heExlbmd0aCIgdmFsdWU9IjUxMiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJDb25zdHJhaW50VHlwZVR5cGUiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLm1hdGguQmlnSW50ZWdlciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDb25zdHJhaW50VHlwZV8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjaW50ZWdlciIvPgotICAgICAgPGRldGFpbHMga2V5PSJlbnVtZXJhdGlvbiIgdmFsdWU9IjAgMSAyIDMgNCA1IDYgNyIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJDb250YWN0VHlwZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubGFuZy5TdHJpbmciPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ29udGFjdF8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjc3RyaW5nIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im1heExlbmd0aCIgdmFsdWU9IjUxMiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJDb3N0UmF0ZVRhYmxlVHlwZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubWF0aC5CaWdJbnRlZ2VyIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkNvc3RSYXRlVGFibGVfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXIiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iZW51bWVyYXRpb24iIHZhbHVlPSIwIDEgMiAzIDQiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iQ3VycmVuY3lTeW1ib2xQb3NpdGlvblR5cGUiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLm1hdGguQmlnSW50ZWdlciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDdXJyZW5jeVN5bWJvbFBvc2l0aW9uXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImVudW1lcmF0aW9uIiB2YWx1ZT0iMCAxIDIgMyIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJDdXJyZW5jeVN5bWJvbFR5cGUiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLmxhbmcuU3RyaW5nIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkN1cnJlbmN5U3ltYm9sXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNzdHJpbmciLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ibWF4TGVuZ3RoIiB2YWx1ZT0iMjAiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iRGF5VHlwZVR5cGUiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLm1hdGguQmlnSW50ZWdlciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJEYXlUeXBlXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImVudW1lcmF0aW9uIiB2YWx1ZT0iMCAxIDIgMyA0IDUgNiA3Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IkRlZmF1bHRGaXhlZENvc3RBY2NydWFsVHlwZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubWF0aC5CaWdJbnRlZ2VyIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkRlZmF1bHRGaXhlZENvc3RBY2NydWFsXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImVudW1lcmF0aW9uIiB2YWx1ZT0iMSAyIDMiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iRGVmYXVsdFRhc2tFVk1ldGhvZFR5cGUiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLm1hdGguQmlnSW50ZWdlciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJEZWZhdWx0VGFza0VWTWV0aG9kXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImVudW1lcmF0aW9uIiB2YWx1ZT0iMCAxIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IkRlZmF1bHRUYXNrVHlwZVR5cGUiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLm1hdGguQmlnSW50ZWdlciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJEZWZhdWx0VGFza1R5cGVfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXIiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iZW51bWVyYXRpb24iIHZhbHVlPSIwIDEgMiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJEb2N1bWVudFJvb3QiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJtaXhlZCIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJtaXhlZCIgdW5pcXVlPSJmYWxzZSIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VGZWF0dXJlTWFwRW50cnkiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRXaWxkY2FyZCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSI6bWl4ZWQiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ieE1MTlNQcmVmaXhNYXAiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iZWNvcmU6RUNsYXNzIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nVG9TdHJpbmdNYXBFbnRyeSIKLSAgICAgICAgdHJhbnNpZW50PSJ0cnVlIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJhdHRyaWJ1dGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0ieG1sbnM6cHJlZml4Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InhTSVNjaGVtYUxvY2F0aW9uIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVDbGFzcyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZ1RvU3RyaW5nTWFwRW50cnkiCi0gICAgICAgIHRyYW5zaWVudD0idHJ1ZSIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iYXR0cmlidXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9InhzaTpzY2hlbWFMb2NhdGlvbiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJwcm9qZWN0IiB1cHBlckJvdW5kPSItMiIKLSAgICAgICAgZVR5cGU9IiMvL1Byb2plY3QiIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIGRlcml2ZWQ9InRydWUiIGNvbnRhaW5tZW50PSJ0cnVlIgotICAgICAgICByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgcHJvamVjdCBpcyB0aGUgdG9wIGxldmVsIGVsZW1lbnQgb2YgdGhlIGRvY3VtZW50LiYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4OTsiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUHJvamVjdCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IkR1cmF0aW9uRm9ybWF0VHlwZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubWF0aC5CaWdJbnRlZ2VyIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkR1cmF0aW9uRm9ybWF0Xy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImVudW1lcmF0aW9uIiB2YWx1ZT0iMyA0IDUgNiA3IDggOSAxMCAxMSAxMiAxOSAyMCAyMSAzNSAzNiAzNyAzOCAzOSA0MCA0MSA0MiA0MyA0NCA1MSA1MiA1MyIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJEdXJhdGlvbkZvcm1hdFR5cGUxIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5tYXRoLkJpZ0ludGVnZXIiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRHVyYXRpb25Gb3JtYXRfLl8xXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImVudW1lcmF0aW9uIiB2YWx1ZT0iMyA0IDUgNiA3IDggOSAxMCAxMSAxMiAxOSAyMCAyMSAzNSAzNiAzNyAzOCAzOSA0MCA0MSA0MiA0MyA0NCA1MSA1MiA1MyIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJEdXJhdGlvbkZvcm1hdFR5cGUyIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5tYXRoLkJpZ0ludGVnZXIiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRHVyYXRpb25Gb3JtYXRfLl8yXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImVudW1lcmF0aW9uIiB2YWx1ZT0iMyA0IDUgNiA3IDggOSAxMCAxMSAxMiAxOSAyMCAyMSAzNSAzNiAzNyAzOCAzOSA0MCA0MSA0MiA0MyA0NCA1MSA1MiA1MyIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJEdXJhdGlvbkZvcm1hdFR5cGUzIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5tYXRoLkJpZ0ludGVnZXIiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRHVyYXRpb25Gb3JtYXRfLl8zXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImVudW1lcmF0aW9uIiB2YWx1ZT0iMyA0IDUgNiA3IDggOSAxMCAxMSAxMiAxOSAyMCAyMSAzNSAzNiAzNyAzOCAzOSA0MCA0MSA0MiA0MyA0NCA1MSA1MiA1MyIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJEdXJhdGlvbkZvcm1hdFR5cGU0IiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5tYXRoLkJpZ0ludGVnZXIiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRHVyYXRpb25Gb3JtYXRfLl80Xy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImVudW1lcmF0aW9uIiB2YWx1ZT0iMyA0IDUgNiA3IDggOSAxMCAxMSAxMiAxOSAyMCAyMSAzNSAzNiAzNyAzOCAzOSA0MCA0MSA0MiA0MyA0NCA1MSA1MiA1MyIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJEdXJhdGlvbkZvcm1hdFR5cGU1IiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5tYXRoLkJpZ0ludGVnZXIiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRHVyYXRpb25Gb3JtYXRfLl81Xy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImVudW1lcmF0aW9uIiB2YWx1ZT0iMyA0IDUgNiA3IDggOSAxMCAxMSAxMiAxOSAyMCAyMSAzNSAzNiAzNyAzOCAzOSA0MCA0MSA0MiA0MyA0NCA1MSA1MiA1MyIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJFYXJuZWRWYWx1ZU1ldGhvZFR5cGUiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLm1hdGguQmlnSW50ZWdlciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJFYXJuZWRWYWx1ZU1ldGhvZF8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjaW50ZWdlciIvPgotICAgICAgPGRldGFpbHMga2V5PSJlbnVtZXJhdGlvbiIgdmFsdWU9IjAgMSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJFYXJuZWRWYWx1ZU1ldGhvZFR5cGUxIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5tYXRoLkJpZ0ludGVnZXIiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRWFybmVkVmFsdWVNZXRob2RfLl8xXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImVudW1lcmF0aW9uIiB2YWx1ZT0iMCAxIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IkVtYWlsQWRkcmVzc1R5cGUiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLmxhbmcuU3RyaW5nIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkVtYWlsQWRkcmVzc18uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjc3RyaW5nIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im1heExlbmd0aCIgdmFsdWU9IjUxMiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJFeHRlbmRlZEF0dHJpYnV0ZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJFeHRlbmRlZEF0dHJpYnV0ZV8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImZpZWxkSUQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhpcyBjb3JyZXNwb25kcyB0byB0aGUgUElEIG9mIHRoZSBjdXN0b20gZmllbGQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkZpZWxkSUQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJmaWVsZE5hbWUiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIG5hbWUgb2YgdGhlIGN1c3RvbSBmaWVsZC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRmllbGROYW1lIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYWxpYXMiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSIjLy9BbGlhc1R5cGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYWxpYXMgb2YgdGhlIGN1c3RvbSBmaWVsZCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJBbGlhcyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InBob25ldGljQWxpYXMiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9QaG9uZXRpY0FsaWFzVHlwZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBwaG9uZXRpYyBwcm9udW5jaWF0aW9uIG9mIHRoZSBhbGlhcyBvZiB0aGUgJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VzdG9tIGZpZWxkIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlBob25ldGljQWxpYXMiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyb2xsdXBUeXBlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vUm9sbHVwVHlwZVR5cGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJIb3cgcm9sbHVwcyBhcmUgY2FsY3VsYXRlZC4gVmFsdWVzIGFyZTogMD1NYXhpbXVtICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChPUiBmb3IgZmxhZyBmaWVsZHMpLCAxPU1pbmltdW0gKEFORCBmb3IgZmxhZyBmaWVsZHMpLCAyPUNvdW50IGFsbCwgMz1TdW0sICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ9QXZlcmFnZSwgNT1BdmVyYWdlIEZpcnN0IFN1YmxldmVsLCA2PUNvdW50IEZpcnN0IFN1YmxldmVsLCA3PUNvdW50ICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vbnN1bW1hcmllcyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJSb2xsdXBUeXBlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY2FsY3VsYXRpb25UeXBlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vQ2FsY3VsYXRpb25UeXBlVHlwZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldoZXRoZXIgcm9sbHVwcyBhcmUgY2FsY3VsYXRlZCBmb3IgdGFzayBhbmQgZ3JvdXAgc3VtbWFyeSByb3dzLiAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZXMgYXJlOiAwPU5vbmUsIDE9Um9sbHVwLCAyPUNhbGN1bGF0aW9uIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkNhbGN1bGF0aW9uVHlwZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImZvcm11bGEiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGZvcm11bGEgdGhhdCBNaWNyb3NvZnQgUHJvamVjdCB1c2VzIHRvIHBvcHVsYXRlIHRoZSAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXN0b20gdGFzayBmaWVsZC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRm9ybXVsYSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJlc3RyaWN0VmFsdWVzIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJJZiBSZXN0cmljdFZhbHVlcz1UcnVlIHRoZW4gb25seSB2YWx1ZXMgaW4gdGhlIGxpc3QgYXJlICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93ZWQgaW4gdGhlIGZpbGUiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUmVzdHJpY3RWYWx1ZXMiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ2YWx1ZWxpc3RTb3J0T3JkZXIiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9WYWx1ZWxpc3RTb3J0T3JkZXJUeXBlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iSG93IHZhbHVlIGxpc3RzIGFyZSBzb3J0ZWQuIFZhbHVlcyBhcmU6ICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDA9RGVzY2VuZGluZywgMT1Bc2NlbmRpbmciLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVmFsdWVsaXN0U29ydE9yZGVyIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYXBwZW5kTmV3VmFsdWVzIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJJZiBBcHBlbmROZXdWYWx1ZXM9VHJ1ZSB0aGVuIGFueSBuZXcgdmFsdWVzIGFkZGVkIGluIGEgcHJvamVjdCAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmUgYXV0b21hdGljYWxseSBhcHBlbmRlZCB0byB0aGUgbGlzdC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQXBwZW5kTmV3VmFsdWVzIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZGVmYXVsdCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGlzIHBvaW50cyB0byB0aGUgZGVmYXVsdCB2YWx1ZSBpbiB0aGUgbGlzdC4gJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm90IHByZXNlbnQgaWYgbm8gZGVmYXVsdCBpcyBzZXQuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkRlZmF1bHQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ2YWx1ZUxpc3QiIGVUeXBlPSIjLy9WYWx1ZUxpc3QiCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXaGVuIHZhbHVlcyBvZiBleHRlbmRlZCBhdHRyaWJ1dGVzIGFyZSBzcGVjaWZpZWQgYXMgJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydGllcyBvZiBlbGVtZW50cyBpbiB0aGUgc2NoZW1hLCB0aGV5IG1heSBlaXRoZXIgYmUgc3BlY2lmaWVkIGJ5IHZhbHVlcyAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvciBieSByZWZlcmVuY2VzIHRvIHRoZSB2YWx1ZXMgY29udGFpbmVkIGluIHRoaXMgbGlzdC4gIEFwcGxpY2F0aW9ucyBtYXkgJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNzdW1lIG9yZGVyaW5nIG9mIHRoZSBsaXN0IGJ5IG9yZGVyaW5nIHNwZWNpZmllZCBoZXJlLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJWYWx1ZUxpc3QiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJFeHRlbmRlZEF0dHJpYnV0ZTIiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRXh0ZW5kZWRBdHRyaWJ1dGVfLl8xXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idUlEIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0ludGVnZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdW5pcXVlIElEIG9mIHRoZSB2YWx1ZSBpbiB0aGUgZXh0ZW5kZWQgYXR0cmlidXRlIGNvbGxlY3Rpb24uJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlVJRCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImZpZWxkSUQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIFBJRCBvZiB0aGUgY3VzdG9tIGZpZWxkLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJGaWVsZElEIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idmFsdWUiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGFjdHVhbCB2YWx1ZSBvZiB0aGUgZXh0ZW5kZWQgYXR0cmlidXRlLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJWYWx1ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InZhbHVlSUQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vSW50ZWdlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBJRCBvZiB0aGUgdmFsdWUgaW4gdGhlIGV4dGVuZGVkIGF0dHJpYnV0IGxvb2t1cCB0YWJsZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVmFsdWVJRCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImR1cmF0aW9uRm9ybWF0IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vRHVyYXRpb25Gb3JtYXRUeXBlMiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBmb3JtYXQgZm9yIGV4cHJlc3NpbmcgdGhlIGJ1bGsgZHVyYXRpb24uICAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZXMgYXJlOiAzPW0sIDQ9ZW0sIDU9aCwgNj1laCwgNz1kLCA4PWVkLCA5PXcsIDEwPWV3LCAxMT1tbywgMTI9ZW1vLCAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxOT0lLCAyMD1lJSwgMjE9bnVsbCwgMzU9bT8sIDM2PWVtPywgMzc9aD8sIDM4PWVoPywgMzk9ZD8sIDQwPWVkPywgNDE9dz8sICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQyPWV3PywgNDM9bW8/LCA0ND1lbW8/LCA1MT0lPywgNTI9ZSU/IGFuZCA1Mz1udWxsLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJEdXJhdGlvbkZvcm1hdCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkV4dGVuZGVkQXR0cmlidXRlMyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJFeHRlbmRlZEF0dHJpYnV0ZV8uXzJfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ1SUQiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vSW50ZWdlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB1bmlxdWUgSUQgb2YgdGhlIHZhbHVlIGluIHRoZSBleHRlbmRlZCBhdHRyaWJ1dGUgY29sbGVjdGlvbi4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVUlEIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZmllbGRJRCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgUElEIG9mIHRoZSBjdXN0b20gZmllbGQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkZpZWxkSUQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ2YWx1ZSIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYWN0dWFsIHZhbHVlIG9mIHRoZSBleHRlbmRlZCBhdHRyaWJ1dGUuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlZhbHVlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idmFsdWVJRCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9JbnRlZ2VyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIElEIG9mIHRoZSB2YWx1ZSBpbiB0aGUgZXh0ZW5kZWQgYXR0cmlidXQgbG9va3VwIHRhYmxlLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJWYWx1ZUlEIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZHVyYXRpb25Gb3JtYXQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9EdXJhdGlvbkZvcm1hdFR5cGUzIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGZvcm1hdCBmb3IgZXhwcmVzc2luZyB0aGUgYnVsayBkdXJhdGlvbi4gICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlcyBhcmU6IDM9bSwgND1lbSwgNT1oLCA2PWVoLCA3PWQsIDg9ZWQsIDk9dywgMTA9ZXcsIDExPW1vLCAxMj1lbW8sIDE5PSUsICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIwPWUlLCAyMT1udWxsLCAzNT1tPywgMzY9ZW0/LCAzNz1oPywgMzg9ZWg/LCAzOT1kPywgNDA9ZWQ/LCA0MT13PywgNDI9ZXc/LCAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0Mz1tbz8sIDQ0PWVtbz8sIDUxPSU/LCA1Mj1lJT8gYW5kIDUzPW51bGwuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkR1cmF0aW9uRm9ybWF0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRXh0ZW5kZWRBdHRyaWJ1dGU0Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkV4dGVuZGVkQXR0cmlidXRlXy5fM18uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InVJRCIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9JbnRlZ2VyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHVuaXF1ZSBJRCBvZiB0aGUgdmFsdWUgaW4gdGhlIGV4dGVuZGVkIGF0dHJpYnV0ZSBjb2xsZWN0aW9uLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlVJRCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImZpZWxkSUQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGZpZWxkIElEIGluIHRoZSBsb2NhbGlzZWQgbGFuZ3VhZ2UuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRmllbGRJRCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InZhbHVlIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBhY3R1YWwgdmFsdWUgb2YgdGhlIGV4dGVuZGVkIGF0dHJpYnV0ZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJWYWx1ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InZhbHVlSUQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vSW50ZWdlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBJRCBvZiB0aGUgdmFsdWUgaW4gdGhlIGV4dGVuZGVkIGF0dHJpYnV0IGxvb2t1cCB0YWJsZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJWYWx1ZUlEIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZHVyYXRpb25Gb3JtYXQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9EdXJhdGlvbkZvcm1hdFR5cGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZm9ybWF0IGZvciBleHByZXNzaW5nIHRoZSBidWxrIGR1cmF0aW9uLiAgJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZXMgYXJlOiAzPW0sIDQ9ZW0sIDU9aCwgNj1laCwgNz1kLCA4PWVkLCA5PXcsIDEwPWV3LCAxMT1tbywgMTI9ZW1vLCAxOT0lLCAyMD1lJSwgJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMT1udWxsLCAzNT1tPywgMzY9ZW0/LCAzNz1oPywgMzg9ZWg/LCAzOT1kPywgNDA9ZWQ/LCA0MT13PywgNDI9ZXc/LCA0Mz1tbz8sIDQ0PWVtbz8sICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTE9JT8sIDUyPWUlPyBhbmQgNTM9bnVsbC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJEdXJhdGlvbkZvcm1hdCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkV4dGVuZGVkQXR0cmlidXRlcyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJFeHRlbmRlZEF0dHJpYnV0ZXNfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJleHRlbmRlZEF0dHJpYnV0ZSIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9FeHRlbmRlZEF0dHJpYnV0ZSIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkVhY2ggb2YgdGhlIGluZGl2aWR1YWwgZW50cmllcyBpbiB0aGUgZXh0ZW5kZWQgYXR0cmlidXRlcyBkZWZpbml0aW9uICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIGNvbGxlY3Rpb24uICBUaGVyZSBhcmUgbm8gbGltaXRzIHRvIHRoZSBudW1iZXIgb2YgY2hpbGRyZW4gdGhhdCBtYXkgYXBwZWFyLCBidXQgcHJvamVjdCAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICB3aWxsIG9ubHkgdW5kZXJzdGFuZCBGbGFnMS1GbGFnMTAsIGV0Yy4gIFRoaXMgbXVzdCBhcHBlYXIgb25jZSBpbiBlYWNoIEV4dGVuZGVkQXR0cmlidXRlcyAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICBjb2xsZWN0aW9uLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJFeHRlbmRlZEF0dHJpYnV0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IkV4dGVybmFsVGFza1Byb2plY3RUeXBlIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5sYW5nLlN0cmluZyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJFeHRlcm5hbFRhc2tQcm9qZWN0Xy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNzdHJpbmciLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ibWF4TGVuZ3RoIiB2YWx1ZT0iNTEyIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IkZpeGVkQ29zdEFjY3J1YWxUeXBlIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5sYW5nLlN0cmluZyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJGaXhlZENvc3RBY2NydWFsXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNzdHJpbmciLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iZW51bWVyYXRpb24iIHZhbHVlPSIxIDIgMyIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJGWVN0YXJ0RGF0ZVR5cGUiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLm1hdGguQmlnSW50ZWdlciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJGWVN0YXJ0RGF0ZV8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjaW50ZWdlciIvPgotICAgICAgPGRldGFpbHMga2V5PSJlbnVtZXJhdGlvbiIgdmFsdWU9IjEgMiAzIDQgNSA2IDcgOCA5IDEwIDExIDEyIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9Ikdyb3VwVHlwZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubGFuZy5TdHJpbmciPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iR3JvdXBfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3N0cmluZyIvPgotICAgICAgPGRldGFpbHMga2V5PSJtYXhMZW5ndGgiIHZhbHVlPSI1MTIiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iSHlwZXJsaW5rQWRkcmVzc1R5cGUiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLmxhbmcuU3RyaW5nIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ikh5cGVybGlua0FkZHJlc3NfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3N0cmluZyIvPgotICAgICAgPGRldGFpbHMga2V5PSJtYXhMZW5ndGgiIHZhbHVlPSI1MTIiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iSHlwZXJsaW5rQWRkcmVzc1R5cGUxIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5sYW5nLlN0cmluZyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJIeXBlcmxpbmtBZGRyZXNzXy5fMV8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjc3RyaW5nIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im1heExlbmd0aCIgdmFsdWU9IjUxMiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJIeXBlcmxpbmtBZGRyZXNzVHlwZTIiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLmxhbmcuU3RyaW5nIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ikh5cGVybGlua0FkZHJlc3NfLl8yXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNzdHJpbmciLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ibWF4TGVuZ3RoIiB2YWx1ZT0iNTEyIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9Ikh5cGVybGlua1N1YkFkZHJlc3NUeXBlIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5sYW5nLlN0cmluZyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJIeXBlcmxpbmtTdWJBZGRyZXNzXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNzdHJpbmciLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ibWF4TGVuZ3RoIiB2YWx1ZT0iNTEyIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9Ikh5cGVybGlua1N1YkFkZHJlc3NUeXBlMSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubGFuZy5TdHJpbmciPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iSHlwZXJsaW5rU3ViQWRkcmVzc18uXzFfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3N0cmluZyIvPgotICAgICAgPGRldGFpbHMga2V5PSJtYXhMZW5ndGgiIHZhbHVlPSI1MTIiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iSHlwZXJsaW5rU3ViQWRkcmVzc1R5cGUyIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5sYW5nLlN0cmluZyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJIeXBlcmxpbmtTdWJBZGRyZXNzXy5fMl8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjc3RyaW5nIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im1heExlbmd0aCIgdmFsdWU9IjUxMiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJIeXBlcmxpbmtUeXBlIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5sYW5nLlN0cmluZyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJIeXBlcmxpbmtfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3N0cmluZyIvPgotICAgICAgPGRldGFpbHMga2V5PSJtYXhMZW5ndGgiIHZhbHVlPSI1MTIiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iSHlwZXJsaW5rVHlwZTEiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLmxhbmcuU3RyaW5nIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ikh5cGVybGlua18uXzFfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3N0cmluZyIvPgotICAgICAgPGRldGFpbHMga2V5PSJtYXhMZW5ndGgiIHZhbHVlPSI1MTIiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iSHlwZXJsaW5rVHlwZTIiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLmxhbmcuU3RyaW5nIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ikh5cGVybGlua18uXzJfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3N0cmluZyIvPgotICAgICAgPGRldGFpbHMga2V5PSJtYXhMZW5ndGgiIHZhbHVlPSI1MTIiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iSW5pdGlhbHNUeXBlIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5sYW5nLlN0cmluZyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJJbml0aWFsc18uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjc3RyaW5nIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im1heExlbmd0aCIgdmFsdWU9IjUxMiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJMYWdGb3JtYXRUeXBlIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5tYXRoLkJpZ0ludGVnZXIiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTGFnRm9ybWF0Xy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImVudW1lcmF0aW9uIiB2YWx1ZT0iMyA0IDUgNiA3IDggOSAxMCAxMSAxMiAxOSAyMCAzNSAzNiAzNyAzOCAzOSA0MCA0MSA0MiA0MyA0NCA1MSA1MiA1MyIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJMZXZlbGluZ0RlbGF5Rm9ybWF0VHlwZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubWF0aC5CaWdJbnRlZ2VyIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkxldmVsaW5nRGVsYXlGb3JtYXRfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXIiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iZW51bWVyYXRpb24iIHZhbHVlPSIzIDQgNSA2IDcgOCA5IDEwIDExIDEyIDE5IDIwIDIxIDM1IDM2IDM3IDM4IDM5IDQwIDQxIDQyIDQzIDQ0IDUxIDUyIDUzIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IkxldmVsaW5nRGVsYXlGb3JtYXRUeXBlMSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubWF0aC5CaWdJbnRlZ2VyIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkxldmVsaW5nRGVsYXlGb3JtYXRfLl8xXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImVudW1lcmF0aW9uIiB2YWx1ZT0iMyA0IDUgNiA3IDggOSAxMCAxMSAxMiAxOSAyMCAyMSAzNSAzNiAzNyAzOCAzOSA0MCA0MSA0MiA0MyA0NCA1MSA1MiA1MyIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJNYW5hZ2VyVHlwZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubGFuZy5TdHJpbmciPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTWFuYWdlcl8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjc3RyaW5nIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im1heExlbmd0aCIgdmFsdWU9IjUxMiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJNYXNrIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik1hc2tfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJsZXZlbCIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9JbnRlZ2VyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGxldmVsIG9mIHRoZSBtYXNrLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJMZXZlbCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InR5cGUiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSIjLy9UeXBlVHlwZTUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdHlwZSBvZiBtYXNrLiBWYWx1ZXMgYXJlOiAwPU51bWJlcnMsIDE9VXBwZXIgQ2FzZSBMZXR0ZXJzLCAyPUxvd2VyIENhc2UgTGV0dGVycywgMz1DaGFyYWN0ZXJzIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlR5cGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJsZW5ndGgiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vSW50ZWdlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBtYXhpbXVtIGxlbmd0aCBpbiBjaGFyYWN0ZXJzIG9mIHRoZSBvdXRsaW5lIGNvZGUgdmFsdWVzLiAgSWYgbGVuZ3RoIGlzIGFueSwgdGhlIHZhbHVlIGlzIHplcm8uIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ikxlbmd0aCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InNlcGFyYXRvciIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgc2VwYXJhdG9yIHZhbHVlIG9mIHRoZSBjb2RlIHZhbHVlcy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iU2VwYXJhdG9yIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iTWFza3MiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTWFza3NfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJtYXNrIiB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL01hc2siCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZm91ciBlbGVtZW50cyBvZiB0aGUgbWFzayBjb25zdGl0dXRlIHRoZSBmb3JtYXQgaW4gd2hpY2ggdGhlIG91dGxpbmUgY29kZSBtdXN0IGFwcGVhci4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTWFzayIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9Ik1hdGVyaWFsTGFiZWxUeXBlIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5sYW5nLlN0cmluZyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJNYXRlcmlhbExhYmVsXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNzdHJpbmciLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ibWF4TGVuZ3RoIiB2YWx1ZT0iNTEyIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9Ik5hbWVUeXBlIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5sYW5nLlN0cmluZyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJOYW1lXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNzdHJpbmciLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ibWF4TGVuZ3RoIiB2YWx1ZT0iNTEyIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9Ik5hbWVUeXBlMSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubGFuZy5TdHJpbmciPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTmFtZV8uXzFfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3N0cmluZyIvPgotICAgICAgPGRldGFpbHMga2V5PSJtYXhMZW5ndGgiIHZhbHVlPSI1MTIiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iTmFtZVR5cGUyIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5sYW5nLlN0cmluZyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJOYW1lXy5fMl8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjc3RyaW5nIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im1heExlbmd0aCIgdmFsdWU9IjUxMiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJOYW1lVHlwZTMiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLmxhbmcuU3RyaW5nIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik5hbWVfLl8zXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNzdHJpbmciLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ibWF4TGVuZ3RoIiB2YWx1ZT0iMjU1Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9Ik5ld1Rhc2tTdGFydERhdGVUeXBlIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5tYXRoLkJpZ0ludGVnZXIiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTmV3VGFza1N0YXJ0RGF0ZV8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjaW50ZWdlciIvPgotICAgICAgPGRldGFpbHMga2V5PSJlbnVtZXJhdGlvbiIgdmFsdWU9IjAgMSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJOVEFjY291bnRUeXBlIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5sYW5nLlN0cmluZyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJOVEFjY291bnRfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3N0cmluZyIvPgotICAgICAgPGRldGFpbHMga2V5PSJtYXhMZW5ndGgiIHZhbHVlPSI1MTIiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iT3V0bGluZUNvZGUiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iT3V0bGluZUNvZGVfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJmaWVsZElEIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkNvcmVzcG9uZHMgdG8gdGhlIGZpZWxkIG51bWJlciBvZiBvdXRsaW5lIGNvZGUuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkZpZWxkSUQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJmaWVsZE5hbWUiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIG5hbWUgb2YgdGhlIGN1c3RvbSBvdXRsaW5lIGNvZGUuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkZpZWxkTmFtZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFsaWFzIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBhbGlhcyBvZiB0aGUgY3VzdG9tIG91dGxpbmUgY29kZS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQWxpYXMiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwaG9uZXRpY0FsaWFzIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBwaG9uZXRpYyBwcm9udW5jaWF0aW9uIG9mIHRoZSBhbGlhcyBvZiB0aGUgY3VzdG9tIG91dGxpbmUgY29kZS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUGhvbmV0aWNBbGlhcyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InZhbHVlcyIgZVR5cGU9IiMvL1ZhbHVlcyIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB2YWx1ZXMgb2YgdGhlIHRhYmxlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIG91dGxpbmUgY29kZS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVmFsdWVzIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZW50ZXJwcmlzZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGN1c3RvbSBvdXRsaW5lIGNvZGUgaXMgYW4gZW50ZXJwcmlzZSBjdXN0b20gb3V0bGluZSBjb2RlLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJFbnRlcnByaXNlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZW50ZXJwcmlzZU91dGxpbmVDb2RlQWxpYXMiCi0gICAgICAgIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vSW50ZWdlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgcmVmZXJlbmNlIHRvIGFub3RoZXIgY3VzdG9tIGZpZWxkIGZvciB3aGljaCB0aGlzIGlzIGFuIGFsaWFzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJFbnRlcnByaXNlT3V0bGluZUNvZGVBbGlhcyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJlc291cmNlU3Vic3RpdHV0aW9uRW5hYmxlZCIKLSAgICAgICAgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV2hldGhlciB0aGUgY3VzdG9tIG91dGxpbmUgY29kZSBjYW4gYmUgdXNlZCBieSB0aGUgUmVzb3VyY2UgU3Vic3RpdHV0aW9uIFdpemFyZCBpbiBNaWNyb3NvZnQgUHJvamVjdC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUmVzb3VyY2VTdWJzdGl0dXRpb25FbmFibGVkIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibGVhZk9ubHkiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldoZXRoZXIgb3Igbm90IHZhbHVlcyBzcGVjaWZpZWQgaW4gdGhpcyBvdXRsaW5lIGNvZGUgZmllbGQgbXVzdCBiZSBsZWFmIHZhbHVlcy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTGVhZk9ubHkiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhbGxMZXZlbHNSZXF1aXJlZCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iTmV3IGNvZGVzIG11c3QgaGF2ZSBhbGwgbGV2ZWxzIHByZXNlbnQuICBOb3QgYXZhaWxhYmxlIGZvciBFbnRlcnByaXNlIENvZGVzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJBbGxMZXZlbHNSZXF1aXJlZCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im9ubHlUYWJsZVZhbHVlc0FsbG93ZWQiCi0gICAgICAgIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldoZXRoZXIgdmFsdWVzIHNwZWNpZmllZCBtdXN0IGNvbWUgZnJvbSB2YWx1ZXMgdGFibGUuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik9ubHlUYWJsZVZhbHVlc0FsbG93ZWQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJtYXNrcyIgZVR5cGU9IiMvL01hc2tzIgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHRhYmxlIG9mIGVudHJpZXMgdGhhdCBkZWZpbmUgdGhlIG91dGxpbmUgY29kZSBtYXNrLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJNYXNrcyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ik91dGxpbmVDb2RlMiI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJPdXRsaW5lQ29kZV8uXzFfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ1SUQiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vSW50ZWdlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB1bmlxdWUgSUQgb2YgdGhlIHZhbHVlIGluIHRoZSBvdXRsaW5lIGNvZGUgY29sbGVjdGlvbi4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVUlEIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZmllbGRJRCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZmllbGQgSUQgaW4gdGhlIGxvY2FsaXNlZCBsYW5ndWFnZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRmllbGRJRCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InZhbHVlSUQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vSW50ZWdlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB1bmlxdWUgSUQgaW4gdGhlIHZhbHVlIGxpc3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBkZWZpbml0aW9uIGluIHRoZSAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRsaW5lIGNvZGUgY29sbGVjdGlvbi4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVmFsdWVJRCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ik91dGxpbmVDb2RlMyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJPdXRsaW5lQ29kZV8uXzJfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ1SUQiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vSW50ZWdlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB1bmlxdWUgSUQgb2YgdGhlIHZhbHVlIGluIHRoZSBvdXRsaW5lIGNvZGUgY29sbGVjdGlvbi4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVUlEIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZmllbGRJRCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZmllbGQgSUQgaW4gdGhlIGxvY2FsaXNlZCBsYW5ndWFnZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRmllbGRJRCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InZhbHVlSUQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vSW50ZWdlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB1bmlxdWUgSUQgaW4gdGhlIHZhbHVlIGxpc3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBkZWZpbml0aW9uICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIHRoZSBvdXRsaW5lIGNvZGUgY29sbGVjdGlvbi4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVmFsdWVJRCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ik91dGxpbmVDb2RlcyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJPdXRsaW5lQ29kZXNfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJvdXRsaW5lQ29kZSIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9PdXRsaW5lQ29kZSIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBpbmRpdmlkdWFsIG91dGxpbmUgY29kZXMuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik91dGxpbmVDb2RlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iT3V0bGluZU51bWJlclR5cGUiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLmxhbmcuU3RyaW5nIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik91dGxpbmVOdW1iZXJfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3N0cmluZyIvPgotICAgICAgPGRldGFpbHMga2V5PSJtYXhMZW5ndGgiIHZhbHVlPSI1MTIiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iT3ZlcnRpbWVSYXRlRm9ybWF0VHlwZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubWF0aC5CaWdJbnRlZ2VyIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik92ZXJ0aW1lUmF0ZUZvcm1hdF8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjaW50ZWdlciIvPgotICAgICAgPGRldGFpbHMga2V5PSJlbnVtZXJhdGlvbiIgdmFsdWU9IjEgMiAzIDQgNSA3Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9Ik92ZXJ0aW1lUmF0ZUZvcm1hdFR5cGUxIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5tYXRoLkJpZ0ludGVnZXIiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iT3ZlcnRpbWVSYXRlRm9ybWF0Xy5fMV8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjaW50ZWdlciIvPgotICAgICAgPGRldGFpbHMga2V5PSJlbnVtZXJhdGlvbiIgdmFsdWU9IjEgMiAzIDQgNSA3Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IlBob25ldGljQWxpYXNUeXBlIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5sYW5nLlN0cmluZyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJQaG9uZXRpY0FsaWFzXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNzdHJpbmciLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ibWF4TGVuZ3RoIiB2YWx1ZT0iNTAiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iUGhvbmV0aWNzVHlwZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubGFuZy5TdHJpbmciPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUGhvbmV0aWNzXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNzdHJpbmciLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ibWF4TGVuZ3RoIiB2YWx1ZT0iNTEyIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlByZWRlY2Vzc29yTGluayI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJQcmVkZWNlc3NvckxpbmtfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwcmVkZWNlc3NvclVJRCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9JbnRlZ2VyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBwcmVkZWNlc3NvciB0YXNrLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJQcmVkZWNlc3NvclVJRCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InR5cGUiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSIjLy9UeXBlVHlwZTEiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgbGluayB0eXBlLiAgVmFsdWVzIGFyZSAwPUZGLCAxPUZTLCAyPVNGIGFuZCAzPVNTJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlR5cGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjcm9zc1Byb2plY3QiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldoZXRoZXIgdGhlIHByZWRlY2Vzc29yIGlzIHBhcnQgb2YgYW5vdGhlciBwcm9qZWN0LiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDcm9zc1Byb2plY3QiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjcm9zc1Byb2plY3ROYW1lIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBleHRlcm5hbCBwcmVkZWNlc3NvciBwcm9qZWN0LiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDcm9zc1Byb2plY3ROYW1lIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibGlua0xhZyIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9JbnRlZ2VyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGFtb3VudCBvZiBsYWcgaW4gdGVudGhzIG9mIGEgbWludXRlLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJMaW5rTGFnIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibGFnRm9ybWF0IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vTGFnRm9ybWF0VHlwZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBmb3JtYXQgZm9yIGV4cHJlc3NpbmcgdGhlIGxhZyBmb3JtYXQuICAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZXMgYXJlOiAzPW0sIDQ9ZW0sIDU9aCwgNj1laCwgNz1kLCA4PWVkLCA5PXcsIDEwPWV3LCAxMT1tbywgMTI9ZW1vLCAxOT0lLCAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMD1lJSwgMzU9bT8sIDM2PWVtPywgMzc9aD8sIDM4PWVoPywgMzk9ZD8sIDQwPWVkPywgNDE9dz8sIDQyPWV3PywgNDM9bW8/LCAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0ND1lbW8/LCA1MT0lPywgNTI9ZSU/IGFuZCA1Mz1udWxsLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJMYWdGb3JtYXQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJQcmVmaXhUeXBlIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5sYW5nLlN0cmluZyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJQcmVmaXhfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3N0cmluZyIvPgotICAgICAgPGRldGFpbHMga2V5PSJtYXhMZW5ndGgiIHZhbHVlPSI1MCIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQcm9qZWN0Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlByb2plY3RfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ1SUQiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSIjLy9VSURUeXBlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHVuaXF1ZSBJRCBvZiB0aGUgcHJvamVjdC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVUlEIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibmFtZSIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9IiMvL05hbWVUeXBlMyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBuYW1lIG9mIHRoZSBwcm9qZWN0LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJOYW1lIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idGl0bGUiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSIjLy9UaXRsZVR5cGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdGl0bGUgb2YgdGhlIHByb2plY3QuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlRpdGxlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic3ViamVjdCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL1N1YmplY3RUeXBlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHN1YmplY3Qgb2YgdGhlIHByb2plY3QuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlN1YmplY3QiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjYXRlZ29yeSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL0NhdGVnb3J5VHlwZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBjYXRlZ29yeSBvZiB0aGUgcHJvamVjdC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ2F0ZWdvcnkiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjb21wYW55IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vQ29tcGFueVR5cGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgY29tcGFueSB0aGF0IG93bnMgdGhlIHByb2plY3QuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkNvbXBhbnkiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJtYW5hZ2VyIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vTWFuYWdlclR5cGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgbWFuYWdlciBvZiB0aGUgcHJvamVjdC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTWFuYWdlciIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImF1dGhvciIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL0F1dGhvclR5cGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYXV0aG9yIG9mIHRoZSBwcm9qZWN0LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJBdXRob3IiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjcmVhdGlvbkRhdGUiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGF0ZVRpbWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZGF0ZSB0aGF0IHRoZSBwcm9qZWN0IHdhcyBjcmVhdGVkLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDcmVhdGlvbkRhdGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyZXZpc2lvbiIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9JbnRlZ2VyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIG51bWJlciBvZiB0aW1lcyBhIHByb2plY3QgaGFzIGJlZW4gc2F2ZWQuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlJldmlzaW9uIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibGFzdFNhdmVkIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RhdGVUaW1lIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGRhdGUgdGhhdCB0aGUgcHJvamVjdCB3YXMgbGFzdCBzYXZlZC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTGFzdFNhdmVkIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic2NoZWR1bGVGcm9tU3RhcnQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0idHJ1ZSIgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldoZXRoZXIgdGhlIHByb2plY3QgaXMgc2NoZHVsZWQgZnJvbSB0aGUgc3RhcnQgZGF0ZSBvciBmaW5pc2ggZGF0ZS4mI3hEOyYjeEE7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlNjaGVkdWxlRnJvbVN0YXJ0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic3RhcnREYXRlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RhdGVUaW1lIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHN0YXJ0IGRhdGUgb2YgdGhlIHByb2plY3QuIFJlcXVpcmVkIGlmIFNjaGVkdWxlRnJvbVN0YXJ0IGlzIHRydWUuJiN4RDsmI3hBOyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJTdGFydERhdGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJmaW5pc2hEYXRlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RhdGVUaW1lIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGZpbmlzaCBkYXRlIG9mIHRoZSBwcm9qZWN0LiBSZXF1aXJlZCBpZiBTY2hlZHVsZUZyb21TdGFydCBpcyBmYWxzZS4mI3hEOyYjeEE7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkZpbmlzaERhdGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJmWVN0YXJ0RGF0ZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL0ZZU3RhcnREYXRlVHlwZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkZpc2NhbCBZZWFyIHN0YXJ0aW5nIG1vbnRoLiBWYWx1ZXMgYXJlOiAmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7MT1KYW51YXJ5LCAyPUZlYnJ1YXJ5LCAzPU1hcmNoLCA0PUFwcmlsLCA1PU1heSwgNj1KdW5lLCA3PUp1bHksICYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTs4PUF1Z3VzdCwgOT1TZXB0ZW1iZXIsIDEwPU9jdG9iZXIsIDExPU5vdmVtYmVyLCAxMj1EZWNlbWJlciAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRllTdGFydERhdGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjcml0aWNhbFNsYWNrTGltaXQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vSW50ZWdlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBudW1iZXIgb2YgZGF5cyBwYXN0IGl0cyBlbmQgZGF0ZSB0aGF0IGEgdGFzayBjYW4gZ28gJiN4RDsmI3hBOyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5O2JlZm9yZSBNaWNyb3NvZnQgUHJvamVjdCBtYXJrcyB0aGF0IHRhc2sgYXMgYSBjcml0aWNhbCB0YXNrLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDcml0aWNhbFNsYWNrTGltaXQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjdXJyZW5jeURpZ2l0cyIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9JbnRlZ2VyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIG51bWJlciBvZiBkaWdpdHMgYWZ0ZXIgdGhlIGRlY2ltYWwgc3ltYm9sLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDdXJyZW5jeURpZ2l0cyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImN1cnJlbmN5U3ltYm9sIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vQ3VycmVuY3lTeW1ib2xUeXBlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGN1cnJlbmN5IHN5bWJvbCB1c2VkIGluIHRoZSBwcm9qZWN0LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDdXJyZW5jeVN5bWJvbCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImN1cnJlbmN5U3ltYm9sUG9zaXRpb24iCi0gICAgICAgIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSIjLy9DdXJyZW5jeVN5bWJvbFBvc2l0aW9uVHlwZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBwb3NpdGlvbiBvZiB0aGUgY3VycmVuY3kgc3ltYm9sLiAgVmFsdWVzIGFyZTogJiN4RDsmI3hBOyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OzA9QmVmb3JlLCAxPUFmdGVyLCAyPUJlZm9yZSBXaXRoIFNwYWNlLCAzPUFmdGVyIHdpdGggc3BhY2UuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkN1cnJlbmN5U3ltYm9sUG9zaXRpb24iLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjYWxlbmRhclVJRCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9JbnRlZ2VyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHByb2plY3QgY2FsZW5kYXIuICBSZWZlcnMgdG8gYSB2YWxpZCBVSUQgaW4gdGhlICYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTtDYWxlbmRhcnMgZWxlbWVudCBvZiB0aGUgTWljcm9zb2Z0IFByb2plY3QgWE1MIFNjaGVtYS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ2FsZW5kYXJVSUQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJkZWZhdWx0U3RhcnRUaW1lIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1RpbWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZGVmYXVsdCBzdGFydCB0aW1lIG9mIG5ldyB0YXNrcy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRGVmYXVsdFN0YXJ0VGltZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImRlZmF1bHRGaW5pc2hUaW1lIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1RpbWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZGVmYXVsdCBmaW5pc2ggdGltZSBvZiBuZXcgdGFza3MuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkRlZmF1bHRGaW5pc2hUaW1lIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibWludXRlc1BlckRheSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9JbnRlZ2VyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIG51bWJlciBvZiBtaW51dGVzIHBlciBkYXkuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik1pbnV0ZXNQZXJEYXkiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJtaW51dGVzUGVyV2VlayIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9JbnRlZ2VyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIG51bWJlciBvZiBtaW51dGVzIHBlciB3ZWVrLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJNaW51dGVzUGVyV2VlayIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImRheXNQZXJNb250aCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9JbnRlZ2VyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIG51bWJlciBvZiBkYXlzIHBlciBtb250aC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRGF5c1Blck1vbnRoIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZGVmYXVsdFRhc2tUeXBlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vRGVmYXVsdFRhc2tUeXBlVHlwZSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iMSIgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBkZWZhdWx0IHR5cGUgb2YgbmV3IHRhc2tzLiBWYWx1ZXMgYXJlOiAmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7MD1GaXhlZCBVbml0cywgMT1GaXhlZCBEdXJhdGlvbiwgMj1GaXhlZCBXb3JrLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJEZWZhdWx0VGFza1R5cGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJkZWZhdWx0Rml4ZWRDb3N0QWNjcnVhbCIKLSAgICAgICAgdW5pcXVlPSJmYWxzZSIgZVR5cGU9IiMvL0RlZmF1bHRGaXhlZENvc3RBY2NydWFsVHlwZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBkZWZhdWx0IGZyb20gd2hlcmUgZml4ZWQgY29zdHMgYXJlIGFjY3J1ZWQuICBWYWx1ZXMgYXJlOiAmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7MT1TdGFydCwgMj1Qcm9yYXRlZCwgMz1FbmQiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRGVmYXVsdEZpeGVkQ29zdEFjY3J1YWwiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJkZWZhdWx0U3RhbmRhcmRSYXRlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Zsb2F0IiB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGRlZmF1bHQgc3RhbmRhcmQgcmF0ZSBmb3IgbmV3IHJlc291cmNlcy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRGVmYXVsdFN0YW5kYXJkUmF0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImRlZmF1bHRPdmVydGltZVJhdGUiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRmxvYXQiIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZGVmYXVsdCBvdmVydGltZSByYXRlIGZvciBuZXcgcmVzb3VyY2VzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJEZWZhdWx0T3ZlcnRpbWVSYXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZHVyYXRpb25Gb3JtYXQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9EdXJhdGlvbkZvcm1hdFR5cGU1Ij4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGZvcm1hdCBmb3IgZXhwcmVzc2luZyB0aGUgYnVsayBkdXJhdGlvbi4gIFZhbHVlcyBhcmU6ICYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTszPW0sIDQ9ZW0sIDU9aCwgNj1laCwgNz1kLCA4PWVkLCA5PXcsIDEwPWV3LCAxMT1tbywgMTI9ZW1vLCAxOT0lLCAyMD1lJSwgMjE9bnVsbCwgJiN4RDsmI3hBOyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OzM1PW0/LCAzNj1lbT8sIDM3PWg/LCAzOD1laD8sIDM5PWQ/LCA0MD1lZD8sIDQxPXc/LCA0Mj1ldz8sIDQzPW1vPywgNDQ9ZW1vPywgNTE9JT8sIDUyPWUlPyBhbmQgJiN4RDsmI3hBOyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OzUzPW51bGwuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkR1cmF0aW9uRm9ybWF0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0id29ya0Zvcm1hdCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL1dvcmtGb3JtYXRUeXBlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGRlZmF1bHQgd29yayB1bml0IGZvcm1hdC4gVmFsdWVzIGFyZTogJiN4RDsmI3hBOyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OzE9bSwgMj1oLCAzPWQsIDQ9dywgNT1tbyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJXb3JrRm9ybWF0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZWRpdGFibGVBY3R1YWxDb3N0cyIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldoZXRoZXIgb3Igbm90IGFjdHVhbCBjb3N0cyBhcmUgZWRpdGFibGUuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkVkaXRhYmxlQWN0dWFsQ29zdHMiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJob25vckNvbnN0cmFpbnRzIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9InRydWUiIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXaGV0aGVyIHRhc2tzIGhvbm91ciB0aGVpciBjb25zdHJhaW50IGRhdGVzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJIb25vckNvbnN0cmFpbnRzIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZWFybmVkVmFsdWVNZXRob2QiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9FYXJuZWRWYWx1ZU1ldGhvZFR5cGUxIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGRlZmF1bHQgbWV0aG9kIGZvciBjYWxjdWxhdGluZyBlYXJuZWQgdmFsdWUuIFZhbHVlcyBhcmU6ICYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTswPVBlcmNlbnQgQ29tcGxldGUsIDE9UGh5c2ljYWwgUGVyY2VudCBDb21wbGV0ZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJFYXJuZWRWYWx1ZU1ldGhvZCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Imluc2VydGVkUHJvamVjdHNMaWtlU3VtbWFyeSIKLSAgICAgICAgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSJ0cnVlIiB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV2hldGhlciB0byBjYWxjdWxhdGUgc3VidGFza3MgYXMgc3VtbWFyeSB0YXNrcy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iSW5zZXJ0ZWRQcm9qZWN0c0xpa2VTdW1tYXJ5Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibXVsdGlwbGVDcml0aWNhbFBhdGhzIgotICAgICAgICB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV2hldGhlciBtdWx0aXBsZSBjcml0aWNhbCBwYXRocyBhcmUgY2FsY3VsYXRlZC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTXVsdGlwbGVDcml0aWNhbFBhdGhzIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibmV3VGFza3NFZmZvcnREcml2ZW4iIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0idHJ1ZSIgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldoZXRoZXIgbmV3IHRhc2tzIGFyZSBlZmZvcnQgZHJpdmVuLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJOZXdUYXNrc0VmZm9ydERyaXZlbiIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im5ld1Rhc2tzRXN0aW1hdGVkIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9InRydWUiIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXaGV0aGVyIHRvIHNob3cgdGhlIGVzdGltYXRlZCBkdXJhdGlvbiBieSBkZWZhdWx0LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJOZXdUYXNrc0VzdGltYXRlZCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InNwbGl0c0luUHJvZ3Jlc3NUYXNrcyIKLSAgICAgICAgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSJ0cnVlIiB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV2hldGhlciBpbi1wcm9ncmVzcyB0YXNrcyBjYW4gYmUgc3BsaXQuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlNwbGl0c0luUHJvZ3Jlc3NUYXNrcyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InNwcmVhZEFjdHVhbENvc3QiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0idHJ1ZSIgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldoZXRoZXIgYWN0dWFsIGNvc3RzIGFyZSBzcHJlYWQgdG8gdGhlIHN0YXR1cyBkYXRlLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJTcHJlYWRBY3R1YWxDb3N0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic3ByZWFkUGVyY2VudENvbXBsZXRlIgotICAgICAgICB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV2hldGhlciBwZXJjZW50IGNvbXBsZXRlIGlzIHNwcmVhZCB0byB0aGUgc3RhdHVzIGRhdGUuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlNwcmVhZFBlcmNlbnRDb21wbGV0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InRhc2tVcGRhdGVzUmVzb3VyY2UiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldoZXRoZXIgdXBkYXRlcyB0byB0YXNrcyB1cGRhdGUgcmVzb3VyY2VzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJUYXNrVXBkYXRlc1Jlc291cmNlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZmlzY2FsWWVhclN0YXJ0IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJTcGVjaWZpZXMgd2hldGhlciB0byB1c2UgZmlzY2FsIHllYXIgbnVtYmVyaW5nIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkZpc2NhbFllYXJTdGFydCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9IndlZWtTdGFydERheSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL1dlZWtTdGFydERheVR5cGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJTdGFydCBkYXkgb2YgdGhlIHdlZWsuIFZhbHVlcyBhcmU6ICYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTswPVN1bmRheSwgMT1Nb25kYXksIDI9VHVlc2RheSwgMz1XZWRuZXNkYXksIDQ9VGh1cnNkYXksIDU9RnJpZGF5LCA2PVNhdHVyZGF5Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IldlZWtTdGFydERheSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im1vdmVDb21wbGV0ZWRFbmRzQmFjayIKLSAgICAgICAgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IiYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5O1NwZWNpZmllcyB3aGV0aGVyIHRoZSBlbmQgb2YgY29tcGxldGVkIHBvcnRpb25zIG9mIHRhc2tzIHNjaGVkdWxlZCB0byBiZWdpbiBhZnRlciB0aGUgJiN4RDsmI3hBOyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7c3RhdHVzIGRhdGUgYnV0IGJlZ3VuIGVhcmx5IHNob3VsZCBiZSBtb3ZlZCBiYWNrIHRvIHRoZSBzdGF0dXMgZGF0ZS4mI3hEOyYjeEE7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik1vdmVDb21wbGV0ZWRFbmRzQmFjayIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im1vdmVSZW1haW5pbmdTdGFydHNCYWNrIgotICAgICAgICB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iJiN4RDsmI3hBOyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7U3BlY2lmaWVzIHdoZXRoZXIgdGhlIGJlZ2lubmluZyBvZiByZW1haW5pbmcgcG9ydGlvbnMgb2YgdGFza3Mgc2NoZWR1bGVkIHRvIGJlZ2luIGFmdGVyIHRoZSAmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTtzdGF0dXMgZGF0ZSBidXQgYmVndW4gZWFybHkgc2hvdWxkIGJlIG1vdmVkIGJhY2sgdG8gdGhlIHN0YXR1cyBkYXRlLiYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTsiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTW92ZVJlbWFpbmluZ1N0YXJ0c0JhY2siLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJtb3ZlUmVtYWluaW5nU3RhcnRzRm9yd2FyZCIKLSAgICAgICAgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IiYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5O1NwZWNpZmllcyB3aGV0aGVyIHRoZSBiZWdpbm5pbmcgb2YgcmVtYWluaW5nIHBvcnRpb25zIG9mIHRhc2tzIHNjaGVkdWxlZCB0byBoYXZlIGJlZ3VuIGxhdGUgJiN4RDsmI3hBOyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7c2hvdWxkIGJlIG1vdmVkIHVwIHRvIHRoZSBzdGF0dXMgZGF0ZS4mI3hEOyYjeEE7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik1vdmVSZW1haW5pbmdTdGFydHNGb3J3YXJkIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibW92ZUNvbXBsZXRlZEVuZHNGb3J3YXJkIgotICAgICAgICB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iJiN4RDsmI3hBOyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7U3BlY2lmaWVzIHdoZXRoZXIgdGhlIGVuZCBvZiBjb21wbGV0ZWQgcG9ydGlvbnMgb2YgdGFza3Mgc2NoZWR1bGVkIHRvIGhhdmUgYmVlbiBjb21wbGV0ZWQgJiN4RDsmI3hBOyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7YmVmb3JlIHRoZSBzdGF0dXMgZGF0ZSBidXQgYmVndW4gbGF0ZSBzaG91bGQgYmUgbW92ZWQgdXAgdG8gdGhlIHN0YXR1cyBkYXRlLiYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTsiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTW92ZUNvbXBsZXRlZEVuZHNGb3J3YXJkIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYmFzZWxpbmVGb3JFYXJuZWRWYWx1ZSIKLSAgICAgICAgdW5pcXVlPSJmYWxzZSIgZVR5cGU9IiMvL0Jhc2VsaW5lRm9yRWFybmVkVmFsdWVUeXBlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHNwZWNpZmljIGJhc2VsaW5lIHVzZWQgdG8gY2FsY3VsYXRlIFZhcmlhbmNlIHZhbHVlcy4gIFZhbHVlcyBhcmU6ICYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTswPUJhc2VsaW5lLCAxPUJhc2VsaW5lIDEsIDI9QmFzZWxpbmUgMiwgMz1CYXNlbGluZSAzLCA0PUJhc2VsaW5lIDQsIDU9QmFzZWxpbmUgNSwgNj1CYXNlbGluZSA2LCAmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7Nz1CYXNlbGluZSA3LCA4PUJhc2VsaW5lIDgsIDk9QmFzZWxpbmUgOSwgMTA9QmFzZWxpbmUgMTAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQmFzZWxpbmVGb3JFYXJuZWRWYWx1ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImF1dG9BZGROZXdSZXNvdXJjZXNBbmRUYXNrcyIKLSAgICAgICAgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSJ0cnVlIiB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV2hldGhlciB0byBhdXRvbWF0aWNhbGx5IGFkZCBuZXcgcmVzb3VyY2VzIHRvIHRoZSByZXNvdXJjZSBwb29sLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJBdXRvQWRkTmV3UmVzb3VyY2VzQW5kVGFza3MiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzdGF0dXNEYXRlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RhdGVUaW1lIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRGF0ZSB1c2VkIGZvciBjYWxjdWxhdGlvbiBhbmQgcmVwb3J0aW5nLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJTdGF0dXNEYXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY3VycmVudERhdGUiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGF0ZVRpbWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgc3lzdGVtIGRhdGUgdGhhdCB0aGUgWE1MIHdhcyBnZW5lcmF0ZWQuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkN1cnJlbnREYXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibWljcm9zb2Z0UHJvamVjdFNlcnZlclVSTCIKLSAgICAgICAgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV2hldGhlciB0aGUgcHJvamVjdCB3YXMgY3JlYXRlZCBieSBhIFByb2plY3QgU2VydmVyIHVzZXIgYXMgb3Bwb3NlZCB0byBhbiBOVCB1c2VyLiYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTsiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTWljcm9zb2Z0UHJvamVjdFNlcnZlclVSTCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImF1dG9saW5rIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXaGV0aGVyIHRvIGF1dG9saW5rIGluc2VydGVkIG9yIG1vdmVkIHRhc2tzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJBdXRvbGluayIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im5ld1Rhc2tTdGFydERhdGUiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9OZXdUYXNrU3RhcnREYXRlVHlwZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBkZWZhdWx0IGRhdGUgZm9yIG5ldyB0YXNrcyBzdGFydC4gIFZhbHVlcyBhcmU6ICYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTswPVByb2plY3QgU3RhcnQgRGF0ZSwgMT1DdXJyZW50IERhdGUiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTmV3VGFza1N0YXJ0RGF0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImRlZmF1bHRUYXNrRVZNZXRob2QiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9EZWZhdWx0VGFza0VWTWV0aG9kVHlwZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBkZWZhdWx0IGVhcm5lZCB2YWx1ZSBtZXRob2QgZm9yIHRhc2tzLiAgVmFsdWVzIGFyZTogJiN4RDsmI3hBOyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OzA9UGVyY2VudCBDb21wbGV0ZSwgMT1QaHlzaWNhbCBQZXJjZW50IENvbXBsZXRlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkRlZmF1bHRUYXNrRVZNZXRob2QiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwcm9qZWN0RXh0ZXJuYWxseUVkaXRlZCIKLSAgICAgICAgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV2hldGhlciB0aGUgcHJvamVjdCBYTUwgd2FzIGVkaXRlZC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUHJvamVjdEV4dGVybmFsbHlFZGl0ZWQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJleHRlbmRlZENyZWF0aW9uRGF0ZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EYXRlVGltZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkRhdGUgdXNlZCBmb3IgY2FsY3VsYXRpb24gYW5kIHJlcG9ydGluZy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRXh0ZW5kZWRDcmVhdGlvbkRhdGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhY3R1YWxzSW5TeW5jIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXaGV0aGVyIGFsbCBhY3R1YWwgd29yayBoYXMgYmVlbiBzeW5jaHJvbml6ZWQgd2l0aCB0aGUgcHJvamVjdC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQWN0dWFsc0luU3luYyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJlbW92ZUZpbGVQcm9wZXJ0aWVzIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXaGV0aGVyIHRvIHJlbW92ZSBhbGwgZmlsZSBwcm9wZXJ0aWVzIG9uIHNhdmUuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlJlbW92ZUZpbGVQcm9wZXJ0aWVzIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYWRtaW5Qcm9qZWN0IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXaGV0aGVyIHRoZSBwcm9qZWN0IGlzIGFuIGFkbWluaXN0cmF0aXZlIHByb2plY3QuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkFkbWluUHJvamVjdCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im91dGxpbmVDb2RlcyIgZVR5cGU9IiMvL091dGxpbmVDb2RlcyIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBjb2xsZWN0aW9uIG9mIG91dGxpbmUgY29kZSBkZWZpbml0aW9ucyBhc3NvY2lhdGVkIHdpdGggdGhlIHByb2plY3QuICBUaGVzZSBjb2RlcyBtYXkgYmUgYXNzb2NpYXRlZCBvbmx5IHdpdGggdGhpcyBwcm9qZWN0LCBvciBtYXkgYmUgY29tbW9uIGFtb25nIHNldmVyYWwgcHJvamVjdHMgKGVudGVycHJpc2UgY29kZXMpLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJPdXRsaW5lQ29kZXMiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ3QlNNYXNrcyIgZVR5cGU9IiMvL1dCU01hc2tzIgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHRhYmxlIG9mIGVudHJpZXMgdGhhdCBkZWZpbmUgdGhlIG91dGxpbmUgY29kZSBtYXNrLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJXQlNNYXNrcyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImV4dGVuZGVkQXR0cmlidXRlcyIgZVR5cGU9IiMvL0V4dGVuZGVkQXR0cmlidXRlcyIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBjb2xsZWN0aW9uIG9mIGV4dGVuZGVkIGF0dHJpYnV0ZSAoY3VzdG9tIGZpZWxkKSBkZWZpbml0aW9ucyAmI3hEOyYjeEE7ICAgICAgICBhc3NvY2lhdGVkIHdpdGggdGhlIHByb2plY3QuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkV4dGVuZGVkQXR0cmlidXRlcyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImNhbGVuZGFycyIgZVR5cGU9IiMvL0NhbGVuZGFycyIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBjb2xsZWN0aW9uIG9mIGNhbGVuZGFycyB0aGF0IGlzIGFzc29jaWF0ZWQgd2l0aCB0aGUgJiN4RDsmI3hBOyAgICAgICAgcHJvamVjdC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ2FsZW5kYXJzIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0idGFza3MiIGVUeXBlPSIjLy9UYXNrcyIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBjb2xsZWN0aW9uIG9mIHRhc2tzIHRoYXQgbWFrZSB1cCB0aGUgcHJvamVjdC4mI3hEOyYjeEE7ICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVGFza3MiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJyZXNvdXJjZXMiIGVUeXBlPSIjLy9SZXNvdXJjZXMiCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgY29sbGVjdGlvbiBvZiByZXNvdXJjZXMgdGhhdCBtYWtlIHVwIHRoZSBwcm9qZWN0LiYjeEQ7JiN4QTsgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJSZXNvdXJjZXMiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJhc3NpZ25tZW50cyIgZVR5cGU9IiMvL0Fzc2lnbm1lbnRzIgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGNvbGxlY3Rpb24gb2YgYXNzaWdubWVudHMgdGhhdCBtYWtlIHVwIHRoZSBwcm9qZWN0LiYjeEQ7JiN4QTsgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkFzc2lnbm1lbnRzIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUmF0ZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJSYXRlXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmF0ZXNGcm9tIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBsb3dlckJvdW5kPSIxIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RhdGVUaW1lIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGRhdGUgdGhhdCB0aGUgcmF0ZSBiZWNvbWVzIGVmZmVjdGl2ZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUmF0ZXNGcm9tIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmF0ZXNUbyIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgbG93ZXJCb3VuZD0iMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EYXRlVGltZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBsYXN0IGRhdGUgdGhhdCB0aGUgcmF0ZSBpcyBlZmZlY3RpdmUuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlJhdGVzVG8iLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyYXRlVGFibGUiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9SYXRlVGFibGVUeXBlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSByYXRlIHRhYmxlIGZvciB0aGUgcmVzb3VyY2UuICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlcyBhcmU6IDA9QSwgMT1CLCAyPUMsIDM9RCwgND1FIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlJhdGVUYWJsZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InN0YW5kYXJkUmF0ZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EZWNpbWFsIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHN0YW5kYXJkIHJhdGUgZm9yIHRoZSByZXNvdXJjZSBmb3IgdGhlIHBlcmlvZCBzcGVjaWZpZWQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlN0YW5kYXJkUmF0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InN0YW5kYXJkUmF0ZUZvcm1hdCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL1N0YW5kYXJkUmF0ZUZvcm1hdFR5cGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdW5pdHMgdXNlZCBieSBNaWNyb3NvZnQgUHJvamVjdCB0byBkaXNwbGF5IHRoZSBzdGFuZGFyZCByYXRlLiAgJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMT1tLCAyPWgsIDM9ZCwgND13LCA1PW1vLCA3PXkmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iU3RhbmRhcmRSYXRlRm9ybWF0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ib3ZlcnRpbWVSYXRlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RlY2ltYWwiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgb3ZlcnRpbWUgcmF0ZSBmb3IgdGhlIHJlc291cmNlIGZvciB0aGUgcGVyaW9kIHNwZWNpZmllZC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iT3ZlcnRpbWVSYXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ib3ZlcnRpbWVSYXRlRm9ybWF0IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vT3ZlcnRpbWVSYXRlRm9ybWF0VHlwZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB1bml0cyB1c2VkIGJ5IE1pY3Jvc29mdCBQcm9qZWN0IHRvIGRpc3BsYXkgdGhlIG92ZXJ0aW1lIHJhdGUuICAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxPW0sIDI9aCwgMz1kLCA0PXcsIDU9bW8sIDc9eSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJPdmVydGltZVJhdGVGb3JtYXQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjb3N0UGVyVXNlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RlY2ltYWwiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgY29zdCBwZXIgdXNlIG9mIHRoZSByZXNvdXJjZS4gJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyB2YWx1ZSBpcyBhcyBvZiB0aGUgY3VycmVudCBkYXRlIGlmIGEgcmF0ZSB0YWJsZSBleGlzdHMgZm9yIHRoZSByZXNvdXJjZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ29zdFBlclVzZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlJhdGVzIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlJhdGVzXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icmF0ZSIgdXBwZXJCb3VuZD0iMjUiIGVUeXBlPSIjLy9SYXRlIgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGRlZmluaXRpb24gb2YgYSB0aW1lIHBlcmlvZCwgYW5kIHRoZSByYXRlcyBhcHBsaWNhYmxlIGZvciAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgcmVzb3VyY2UgZHVyaW5nIHRoYXQgcGVyaW9kLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJSYXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iUmF0ZVRhYmxlVHlwZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubWF0aC5CaWdJbnRlZ2VyIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlJhdGVUYWJsZV8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjaW50ZWdlciIvPgotICAgICAgPGRldGFpbHMga2V5PSJlbnVtZXJhdGlvbiIgdmFsdWU9IjAgMSAyIDMgNCIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJSZXNvdXJjZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJSZXNvdXJjZV8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InVJRCIgdW5pcXVlPSJmYWxzZSIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9JbnRlZ2VyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSByZXNvdXJjZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVUlEIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaUQiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vSW50ZWdlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBwb3NpdGlvbiBpZGVudGlmaWVyIG9mIHRoZSByZXNvdXJjZSB3aXRoaW4gdGhlIGxpc3Qgb2YgcmVzb3VyY2VzLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJJRCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im5hbWUiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSIjLy9OYW1lVHlwZTEiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgbmFtZSBvZiB0aGUgcmVzb3VyY2UuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik5hbWUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ0eXBlIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iIy8vVHlwZVR5cGU0Ij4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHR5cGUgb2YgcmVzb3VyY2UuIFZhbHVlcyBhcmU6IDA9TWF0ZXJpYWwsIDE9V29yayYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJUeXBlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaXNOdWxsIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJTcGVjaWZpZXMgd2hldGhlciB0aGUgcmVzb3VyY2UgaXMgbnVsbC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iSXNOdWxsIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaW5pdGlhbHMiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9Jbml0aWFsc1R5cGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgaW5pdGlhbHMgb2YgdGhlIHJlc291cmNlLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJJbml0aWFscyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InBob25ldGljcyIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL1Bob25ldGljc1R5cGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgcGhvbmV0aWMgc3BlbGxpbmcgb2YgdGhlIHJlc291cmNlIG5hbWUuICAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGb3IgdXNlIHdpdGggSmFwYW5lc2Ugb25seS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUGhvbmV0aWNzIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iblRBY2NvdW50IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vTlRBY2NvdW50VHlwZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBOVCBhY2NvdW50IGFzc29jaWF0ZWQgd2l0aCB0aGUgcmVzb3VyY2UuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik5UQWNjb3VudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im1hdGVyaWFsTGFiZWwiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9NYXRlcmlhbExhYmVsVHlwZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB1bml0IG9mIG1lYXN1cmUgZm9yIHRoZSBtYXRlcmlhbCByZXNvdXJjZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTWF0ZXJpYWxMYWJlbCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNvZGUiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSIjLy9Db2RlVHlwZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBjb2RlIG9yIG90aGVyIGluZm9ybWF0aW9uIGFib3V0IHRoZSByZXNvdXJjZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ29kZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Imdyb3VwIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iIy8vR3JvdXBUeXBlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGdyb3VwIHRvIHdoaWNoIHRoZSByZXNvdXJjZSBiZWxvbmdzLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJHcm91cCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9IndvcmtHcm91cCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL1dvcmtHcm91cFR5cGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdHlwZSBvZiB3b3JrZ3JvdXAgdG8gd2hpY2ggdGhlIHJlc291cmNlIGJlbG9uZ3MuICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlcyBhcmU6IDA9RGVmYXVsdCwgMT1Ob25lLCAyPUVtYWlsLCAzPVdlYiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJXb3JrR3JvdXAiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJlbWFpbEFkZHJlc3MiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9FbWFpbEFkZHJlc3NUeXBlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGVtYWlsIGFkZHJlc3Mgb2YgdGhlIHJlc291cmNlLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJFbWFpbEFkZHJlc3MiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJoeXBlcmxpbmsiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9IeXBlcmxpbmtUeXBlMSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB0aXRsZSBvZiB0aGUgaHlwZXJsaW5rIGFzc29jaWF0ZWQgd2l0aCB0aGUgcmVzb3VyY2UuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ikh5cGVybGluayIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Imh5cGVybGlua0FkZHJlc3MiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9IeXBlcmxpbmtBZGRyZXNzVHlwZTEiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgaHlwZXJsaW5rIGFzc29jaWF0ZWQgd2l0aCB0aGUgcmVzb3VyY2UuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ikh5cGVybGlua0FkZHJlc3MiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJoeXBlcmxpbmtTdWJBZGRyZXNzIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vSHlwZXJsaW5rU3ViQWRkcmVzc1R5cGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZG9jdW1lbnQgYm9va21hcmsgb2YgdGhlIGh5cGVybGluayBhc3NvY2lhdGVkIHdpdGggdGhlIHJlc291cmNlLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJIeXBlcmxpbmtTdWJBZGRyZXNzIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibWF4VW5pdHMiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRmxvYXQiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IjEuMCIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBtYXhpbXVtIG51bWJlciBvZiB1bml0cyB0aGF0IHRoZSByZXNvdXJjZSBpcyBhdmFpbGFibGUuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik1heFVuaXRzIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icGVha1VuaXRzIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Zsb2F0IiB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGxhcmdlc3QgbnVtYmVyIG9mIHVuaXRzIGFzc2lnbmVkIHRvIHRoZSByZXNvdXJjZSBhdCBhbnkgdGltZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUGVha1VuaXRzIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ib3ZlckFsbG9jYXRlZCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV2hldGhlciB0aGUgcmVzb3VyY2UgaXMgb3ZlcmFsbG9jYXRlZC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iT3ZlckFsbG9jYXRlZCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImF2YWlsYWJsZUZyb20iIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGF0ZVRpbWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZmlyc3QgZGF0ZSB0aGF0IHRoZSByZXNvdXJjZSBpcyBhdmFpbGFibGUuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkF2YWlsYWJsZUZyb20iLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhdmFpbGFibGVUbyIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EYXRlVGltZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBsYXN0IGRhdGUgdGhlIHJlc291cmNlIGlzIGF2YWlsYWJsZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQXZhaWxhYmxlVG8iLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzdGFydCIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EYXRlVGltZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBzY2hlZHVsZWQgc3RhcnQgZGF0ZSBvZiB0aGUgcmVzb3VyY2UuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlN0YXJ0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZmluaXNoIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RhdGVUaW1lIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHNjaGVkdWxlZCBmaW5pc2ggZGF0ZSBvZiB0aGUgcmVzb3VyY2UuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkZpbmlzaCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNhbkxldmVsIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXaGV0aGVyIHRoZSByZXNvdXJjZSBjYW4gYmUgbGV2ZWxlZC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ2FuTGV2ZWwiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhY2NydWVBdCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL0FjY3J1ZUF0Ij4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iSG93IGNvc3QgaXMgYWNjcnVlZCBhZ2FpbnN0IHRoZSByZXNvdXJjZS4gJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVzIGFyZTogMT1TdGFydCwgMj1FbmQsIDM9UHJvcmF0ZWQmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQWNjcnVlQXQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ3b3JrIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0R1cmF0aW9uIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHRvdGFsIHdvcmsgYXNzaWduZWQgdG8gdGhlIHJlc291cmNlIGFjcm9zcyBhbGwgYXNzaWduZWQgdGFza3MuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IldvcmsiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyZWd1bGFyV29yayIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EdXJhdGlvbiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBhbW91bnQgb2Ygbm9uLW92ZXJ0aW1lIHdvcmsgYXNzaWduZWQgdG8gdGhlIHJlc291cmNlLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJSZWd1bGFyV29yayIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im92ZXJ0aW1lV29yayIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EdXJhdGlvbiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBhbW91bnQgb2Ygb3ZlcnRpbWUgd29yayBhc3NpZ25lZCB0byB0aGUgcmVzb3VyY2UuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik92ZXJ0aW1lV29yayIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFjdHVhbFdvcmsiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRHVyYXRpb24iPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYW1vdW50IG9mIGFjdHVhbCB3b3JrIHBlcmZvcm1lZCBieSB0aGUgcmVzb3VyY2UuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkFjdHVhbFdvcmsiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyZW1haW5pbmdXb3JrIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0R1cmF0aW9uIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGFtb3VudCBvZiByZW1haW5pbmcgd29yayByZXF1aXJlZCB0byBjb21wbGV0ZSBhbGwgYXNzaWduZWQgdGFza3MuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlJlbWFpbmluZ1dvcmsiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhY3R1YWxPdmVydGltZVdvcmsiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRHVyYXRpb24iPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYW1vdW50IG9mIGFjdHVhbCBvdmVydGltZSB3b3JrIHBlcmZvcm1lZCBieSB0aGUgcmVzb3VyY2UuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkFjdHVhbE92ZXJ0aW1lV29yayIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJlbWFpbmluZ092ZXJ0aW1lV29yayIKLSAgICAgICAgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EdXJhdGlvbiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBhbW91bnQgb2YgcmVtYWluaW5nIG92ZXJ0aW1lIHdvcmsgcmVxdWlyZWQgdG8gY29tcGxldGUgYWxsIHRhc2tzLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJSZW1haW5pbmdPdmVydGltZVdvcmsiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwZXJjZW50V29ya0NvbXBsZXRlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0ludGVnZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgcGVyY2VudGFnZSBvZiB3b3JrIGNvbXBsZXRlZCBhY3Jvc3MgYWxsIHRhc2tzLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJQZXJjZW50V29ya0NvbXBsZXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic3RhbmRhcmRSYXRlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RlY2ltYWwiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgc3RhbmRhcmQgcmF0ZSBvZiB0aGUgcmVzb3VyY2UuICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgdmFsdWUgaXMgYXMgb2YgdGhlIGN1cnJlbnQgZGF0ZSBpZiBhIHJhdGUgdGFibGUgZXhpc3RzIGZvciB0aGUgcmVzb3VyY2UuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlN0YW5kYXJkUmF0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InN0YW5kYXJkUmF0ZUZvcm1hdCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL1N0YW5kYXJkUmF0ZUZvcm1hdFR5cGUxIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHVuaXRzIHVzZWQgYnkgTWljcm9zb2Z0IFByb2plY3QgdG8gZGlzcGxheSB0aGUgc3RhbmRhcmQgcmF0ZS4gICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE9bSwgMj1oLCAzPWQsIDQ9dywgNT1tbywgNz15LCA4PW1hdGVyaWFsIHJlc291cmNlIHJhdGUgKG9yIGJsYW5rIHN5bWJvbCBzcGVjaWZpZWQpJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlN0YW5kYXJkUmF0ZUZvcm1hdCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNvc3QiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGVjaW1hbCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB0b3RhbCBwcm9qZWN0IGNvc3QgZm9yIHRoZSByZXNvdXJjZSBhY3Jvc3MgYWxsIGFzc2lnbmVkIHRhc2tzLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDb3N0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ib3ZlcnRpbWVSYXRlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RlY2ltYWwiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgb3ZlcnRpbWUgcmF0ZSBvZiB0aGUgcmVzb3VyY2UuICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgdmFsdWUgaXMgYXMgb2YgdGhlIGN1cnJlbnQgZGF0ZSBpZiBhIHJhdGUgdGFibGUgZXhpc3RzIGZvciB0aGUgcmVzb3VyY2UuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik92ZXJ0aW1lUmF0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im92ZXJ0aW1lUmF0ZUZvcm1hdCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL092ZXJ0aW1lUmF0ZUZvcm1hdFR5cGUxIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHVuaXRzIHVzZWQgYnkgTWljcm9zb2Z0IFByb2plY3QgdG8gZGlzcGxheSB0aGUgb3ZlcnRpbWUgcmF0ZS4gICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE9bSwgMj1oLCAzPWQsIDQ9dywgNT1tbywgNz15JiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik92ZXJ0aW1lUmF0ZUZvcm1hdCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im92ZXJ0aW1lQ29zdCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EZWNpbWFsIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHRvdGFsIG92ZXJ0aW1lIGNvc3QgZm9yIHRoZSByZXNvdXJjZSBpbmNsdWRpbmcgYWN0dWFsIGFuZCByZW1haW5pbmcgb3ZlcnRpbWUgY29zdHMuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik92ZXJ0aW1lQ29zdCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNvc3RQZXJVc2UiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGVjaW1hbCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBjb3N0IHBlciB1c2Ugb2YgdGhlIHJlc291cmNlLiBUaGlzIHZhbHVlIGlzIGFzIG9mIHRoZSBjdXJyZW50IGRhdGUgaWYgYSByYXRlIHRhYmxlICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXN0cyBmb3IgdGhlIHJlc291cmNlLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDb3N0UGVyVXNlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYWN0dWFsQ29zdCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EZWNpbWFsIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGFjdHVhbCBjb3N0IGluY3VycmVkIGJ5IHRoZSByZXNvdXJjZSBhY3Jvc3MgYWxsIGFzc2lnbmVkIHRhc2tzLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJBY3R1YWxDb3N0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYWN0dWFsT3ZlcnRpbWVDb3N0IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RlY2ltYWwiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYWN0dWFsIG92ZXJ0aW1lIGNvc3QgaW5jdXJyZWQgYnkgdGhlIHJlc291cmNlIGFjcm9zcyBhbGwgYXNzaWduZWQgdGFza3MuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkFjdHVhbE92ZXJ0aW1lQ29zdCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJlbWFpbmluZ0Nvc3QiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGVjaW1hbCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSByZW1haW5pbmcgcHJvamVjdGVkIGNvc3Qgb2YgdGhlIHJlc291cmNlIHRvIGNvbXBsZXRlIGFsbCBhc3NpZ25lZCB0YXNrcy4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUmVtYWluaW5nQ29zdCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJlbWFpbmluZ092ZXJ0aW1lQ29zdCIKLSAgICAgICAgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EZWNpbWFsIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHJlbWFpbmluZyBwcm9qZWN0ZWQgb3ZlcnRpbWUgY29zdCBvZiB0aGUgcmVzb3VyY2UgdG8gY29tcGxldGUgYWxsIGFzc2lnbmVkIHRhc2tzLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJSZW1haW5pbmdPdmVydGltZUNvc3QiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ3b3JrVmFyaWFuY2UiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRmxvYXQiIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBiYXNlbGluZSB3b3JrIGFuZCB0aGUgd29yayBhcyBtaW51dGVzIHggMTAwMC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iV29ya1ZhcmlhbmNlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY29zdFZhcmlhbmNlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Zsb2F0IiB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgYmFzZWxpbmUgY29zdCBhbmQgdGhlIGNvc3QuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkNvc3RWYXJpYW5jZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InNWIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Zsb2F0IgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRWFybmVkIHZhbHVlIHNjaGVkdWxlIHZhcmlhbmNlLCB0aHJvdWdoIHRoZSBwcm9qZWN0IHN0YXR1cyBkYXRlLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJTViIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNWIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Zsb2F0IgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRWFybmVkIHZhbHVlIGNvc3QgdmFyaWFuY2UsIHRocm91Z2ggdGhlIHByb2plY3Qgc3RhdHVzIGRhdGUuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkNWIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYUNXUCIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9GbG9hdCIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBhY3R1YWwgY29zdCBvZiB0aGUgd29yayBwZXJmb3JtZWQgYnkgdGhlIHJlc291cmNlIGZvciB0aGUgcHJvamVjdCB0by1kYXRlLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJBQ1dQIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY2FsZW5kYXJVSUQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vSW50ZWdlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSByZXNvdXJjZSBjYWxlbmRhci5SZWZlcnMgdG8gYSB2YWxpZCBVSUQgaW4gdGhlIENhbGVuZGFycyBlbGVtZW50IG9mICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBNaWNyb3NvZnQgUHJvamVjdCBYTUwgU2NoZW1hLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDYWxlbmRhclVJRCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im5vdGVzIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRleHQgbm90ZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSByZXNvdXJjZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTm90ZXMiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJiQ1dTIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Zsb2F0IgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGJ1ZGdldCBjb3N0IG9mIHdvcmsgc2NoZWR1bGVkIGZvciB0aGUgcmVzb3VyY2UuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkJDV1MiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJiQ1dQIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Zsb2F0IgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGJ1ZGdldGVkIGNvc3Qgb2Ygb2YgdGhlIHdvcmsgcGVyZm9ybWVkIGJ5IHRoZSByZXNvdXJjZSBmb3IgdGhlIHByb2plY3QgdG8tZGF0ZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQkNXUCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImlzR2VuZXJpYyIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iU3BlY2lmaWVzIHdoZXRoZXIgdGhlIHJlc291cmNlIGlzIGdlbmVyaWMuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IklzR2VuZXJpYyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImlzSW5hY3RpdmUiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlNwZWNpZmllcyB3aGV0aGVyIHRoZSByZXNvdXJjZSBpcyBzZXQgdG8gaW5hY3RpdmUuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IklzSW5hY3RpdmUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpc0VudGVycHJpc2UiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlNwZWNpZmllcyB3aGV0aGVyIHRoZSByZXNvdXJjZSBpcyBhbiBFbnRlcnByaXNlIHJlc291cmNlLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJJc0VudGVycHJpc2UiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJib29raW5nVHlwZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL0Jvb2tpbmdUeXBlVHlwZTEiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJTcGVjaWZpZXMgdGhlIGJvb2tpbmcgdHlwZSBvZiB0aGUgcmVzb3VyY2UuIDE9Q29tbWl0ZWQsIDI9UHJvcG9zZWQmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQm9va2luZ1R5cGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhY3R1YWxXb3JrUHJvdGVjdGVkIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0R1cmF0aW9uIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iU3BlY2lmaWVzIHRoZSBkdXJhdGlvbiB0aHJvdWdoIHdoaWNoIGFjdHVhbCB3b3JrIGlzIHByb3RlY3RlZC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQWN0dWFsV29ya1Byb3RlY3RlZCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZCIKLSAgICAgICAgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EdXJhdGlvbiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlNwZWNpZmllcyB0aGUgZHVyYXRpb24gdGhyb3VnaCB3aGljaCBhY3R1YWwgb3ZlcnRpbWUgd29yayBpcyBwcm90ZWN0ZWQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkFjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFjdGl2ZURpcmVjdG9yeUdVSUQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9BY3RpdmVEaXJlY3RvcnlHVUlEVHlwZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBBY3RpdmUgRGlyZWN0b3J5IEdVSUQgZm9yIHRoZSByZXNvdXJjZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQWN0aXZlRGlyZWN0b3J5R1VJRCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNyZWF0aW9uRGF0ZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EYXRlVGltZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBkYXRlIHRoYXQgdGhlIHJlc291cmNlIHdhcyBjcmVhdGVkLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDcmVhdGlvbkRhdGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJleHRlbmRlZEF0dHJpYnV0ZSIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9FeHRlbmRlZEF0dHJpYnV0ZTMiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdmFsdWUgb2YgYW4gZXh0ZW5kZWQgYXR0cmlidXRlLiAgVHdvIHBpZWNlcyBvZiBkYXRhIGFyZSBuZWNlc3NhcnkgLSAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhIHBvaW50ZXIgYmFjayB0byB0aGUgZXh0ZW5kZWQgYXR0cmlidXRlIHRhYmxlIHdoaWNoIGlzIHNwZWNpZmllZCBlaXRoZXIgYnkgdGhlIHVuaXF1ZSBJRCBvciB0aGUgRmllbGQgSUQsICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCB0aGUgdmFsdWUgd2hpY2ggaXMgc3BlY2lmaWVkIGVpdGhlciB3aXRoIHRoZSB2YWx1ZSwgb3IgYSBwb2ludGVyIGJhY2sgdG8gdGhlIHZhbHVlIGxpc3QuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkV4dGVuZGVkQXR0cmlidXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iYmFzZWxpbmUiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vQmFzZWxpbmUyIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGJhc2VsaW5lIHZhbHVlcyBmb3IgdGhlIHJlc291cmNlcy4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQmFzZWxpbmUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJvdXRsaW5lQ29kZSIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9PdXRsaW5lQ29kZTMiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdmFsdWUgb2YgYW4gb3V0bGluZSBjb2RlLiAgVHdvIHBpZWNlcyBvZiBkYXRhIGFyZSBuZWNlc3NhcnkgLSBhIHBvaW50ZXIgYmFjayB0byAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgb3V0bGluZSBjb2RlIHRhYmxlIHdoaWNoIGlzIHNwZWNpZmllZCBlaXRoZXIgYnkgdGhlIHVuaXF1ZSBJRCBvciB0aGUgRmllbGQgSUQsIGFuZCB0aGUgdmFsdWUgd2hpY2ggaXMgJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BlY2lmaWVkIGVpdGhlciB3aXRoIHRoZSB2YWx1ZSwgb3IgYSBwb2ludGVyIGJhY2sgdG8gdGhlIHZhbHVlIGxpc3QuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik91dGxpbmVDb2RlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iYXZhaWxhYmlsaXR5UGVyaW9kcyIgZVR5cGU9IiMvL0F2YWlsYWJpbGl0eVBlcmlvZHMiCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIGNvbGxlY3Rpb24gb2YgcGVyaW9kcyBkdXJpbmcgd2hpY2ggdGhlIHJlc291cmNlIGlzIGF2YWlsYWJsZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQXZhaWxhYmlsaXR5UGVyaW9kcyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InJhdGVzIiBlVHlwZT0iIy8vUmF0ZXMiCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIGNvbGxlY3Rpb24gb2YgcGVyaW9kcyBhbmQgdGhlIHJhdGVzIGFzc29jaWF0ZWQgd2l0aCBlYWNoIG9uZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUmF0ZXMiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ0aW1lcGhhc2VkRGF0YSIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9UaW1lcGhhc2VkRGF0YVR5cGUiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdGltZSBwaGFzZWQgZGF0YSYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJUaW1lcGhhc2VkRGF0YSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlJlc291cmNlcyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJSZXNvdXJjZXNfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJyZXNvdXJjZSIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9SZXNvdXJjZSIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZXJlIG11c3QgYmUgYXQgbGVhc3Qgb25lIHJlc291cmNlIGluIGVhY2ggUmVzb3VyY2VzIGNvbGxlY3Rpb24uJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlJlc291cmNlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iUm9sbHVwVHlwZVR5cGUiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLm1hdGguQmlnSW50ZWdlciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJSb2xsdXBUeXBlXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImVudW1lcmF0aW9uIiB2YWx1ZT0iMCAxIDIgMyA0IDUgNiA3Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IlN0YW5kYXJkUmF0ZUZvcm1hdFR5cGUiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLm1hdGguQmlnSW50ZWdlciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJTdGFuZGFyZFJhdGVGb3JtYXRfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXIiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iZW51bWVyYXRpb24iIHZhbHVlPSIxIDIgMyA0IDUgNyIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJTdGFuZGFyZFJhdGVGb3JtYXRUeXBlMSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubWF0aC5CaWdJbnRlZ2VyIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlN0YW5kYXJkUmF0ZUZvcm1hdF8uXzFfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXIiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iZW51bWVyYXRpb24iIHZhbHVlPSIxIDIgMyA0IDUgNyA4Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IlN1YmplY3RUeXBlIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5sYW5nLlN0cmluZyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJTdWJqZWN0Xy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNzdHJpbmciLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ibWF4TGVuZ3RoIiB2YWx1ZT0iNTEyIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IlN1YnByb2plY3ROYW1lVHlwZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubGFuZy5TdHJpbmciPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iU3VicHJvamVjdE5hbWVfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3N0cmluZyIvPgotICAgICAgPGRldGFpbHMga2V5PSJtYXhMZW5ndGgiIHZhbHVlPSI1MTIiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iVGFzayI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJUYXNrXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idUlEIiB1bmlxdWU9ImZhbHNlIiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0ludGVnZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdW5pcXVlIElEIG9mIHRoZSB0YXNrLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJVSUQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpRCIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9JbnRlZ2VyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHBvc2l0aW9uIGlkZW50aWZpZXIgb2YgdGhlIHRhc2sgd2l0aGluIHRoZSBsaXN0IG9mIHRhc2tzLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJJRCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im5hbWUiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSIjLy9OYW1lVHlwZTIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgbmFtZSBvZiB0aGUgdGFzay4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTmFtZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InR5cGUiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSIjLy9UeXBlVHlwZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB0eXBlIG9mIHRhc2suICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlcyBhcmU6IDA9Rml4ZWQgVW5pdHMsIDE9Rml4ZWQgRHVyYXRpb24sIDI9Rml4ZWQgV29yay4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVHlwZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImlzTnVsbCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iU3BlY2lmaWVzIHdoZXRoZXIgdGhlIHRhc2sgaXMgbnVsbC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iSXNOdWxsIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY3JlYXRlRGF0ZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EYXRlVGltZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBkYXRlIHRoYXQgdGhlIHRhc2sgd2FzIGNyZWF0ZWQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkNyZWF0ZURhdGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjb250YWN0IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vQ29udGFjdFR5cGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgY29udGFjdCBwZXJzb24gZm9yIHRoZSB0YXNrLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDb250YWN0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0id0JTIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB3b3JrIGJyZWFrZG93biBzdHJ1Y3R1cmUgY29kZSBvZiB0aGUgdGFzay4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iV0JTIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0id0JTTGV2ZWwiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHJpZ2h0bW9zdCBXQlMgbGV2ZWwgb2YgdGhlIHRhc2suICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJXQlNMZXZlbCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im91dGxpbmVOdW1iZXIiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9PdXRsaW5lTnVtYmVyVHlwZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBvdXRsaW5lIG51bWJlciBvZiB0aGUgdGFzay4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iT3V0bGluZU51bWJlciIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im91dGxpbmVMZXZlbCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9JbnRlZ2VyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIG91dGxpbmUgbGV2ZWwgb2YgdGhlIHRhc2suJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik91dGxpbmVMZXZlbCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InByaW9yaXR5IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0ludGVnZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgcHJpb3JpdHkgb2YgdGhlIHRhc2sgZnJvbSAwIHRvIDEwMDAuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlByaW9yaXR5Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic3RhcnQiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGF0ZVRpbWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgc2NoZWR1bGVkIHN0YXJ0IGRhdGUgb2YgdGhlIHRhc2suJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlN0YXJ0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZmluaXNoIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RhdGVUaW1lIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHNjaGVkdWxlZCBmaW5pc2ggZGF0ZSBvZiB0aGUgdGFzay4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRmluaXNoIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZHVyYXRpb24iIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRHVyYXRpb24iPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgcGxhbm5lZCBkdXJhdGlvbiBvZiB0aGUgdGFzay4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRHVyYXRpb24iLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJkdXJhdGlvbkZvcm1hdCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL0R1cmF0aW9uRm9ybWF0VHlwZTQiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZm9ybWF0IGZvciBleHByZXNzaW5nIHRoZSBEdXJhdGlvbiBvZiB0aGUgVGFzay4gICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlcyBhcmU6IDM9bSwgND1lbSwgNT1oLCA2PWVoLCA3PWQsIDg9ZWQsIDk9dywgMTA9ZXcsIDExPW1vLCAxMj1lbW8sIDE5PSUsICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIwPWUlLCAyMT1udWxsLCAzNT1tPywgMzY9ZW0/LCAzNz1oPywgMzg9ZWg/LCAzOT1kPywgNDA9ZWQ/LCA0MT13PywgNDI9ZXc/LCAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0Mz1tbz8sIDQ0PWVtbz8sIDUxPSU/LCA1Mj1lJT8gYW5kIDUzPW51bGwuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkR1cmF0aW9uRm9ybWF0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0id29yayIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EdXJhdGlvbiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBhbW91bnQgb2Ygc2NoZWR1bGVkIHdvcmsgZm9yIHRoZSB0YXNrLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJXb3JrIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic3RvcCIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EYXRlVGltZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBkYXRlIHRoYXQgdGhlIHRhc2sgd2FzIHN0b3BwZWQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlN0b3AiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyZXN1bWUiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGF0ZVRpbWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZGF0ZSB0aGF0IHRoZSB0YXNrIHJlc3VtZWQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlJlc3VtZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJlc3VtZVZhbGlkIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXaGV0aGVyIHRoZSB0YXNrIGNhbiBiZSByZXN1bWVkLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJSZXN1bWVWYWxpZCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImVmZm9ydERyaXZlbiIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV2hldGhlciB0aGUgdGFzayBpcyBlZmZvcnQtZHJpdmVuLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJFZmZvcnREcml2ZW4iLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyZWN1cnJpbmciIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldoZXRoZXIgdGhlIHRhc2sgaXMgYSByZWN1cnJpbmcgdGFzay4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUmVjdXJyaW5nIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ib3ZlckFsbG9jYXRlZCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV2hldGhlciB0aGUgdGFzayBpcyBvdmVyYWxsb2NhdGVkLiAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGVsZW1lbnQgaXMgaW5mb3JtYXRpb25hbCBvbmx5LiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJPdmVyQWxsb2NhdGVkIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZXN0aW1hdGVkIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXaGV0aGVyIHRoZSB0YXNrIGlzIGVzdGltYXRlZC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRXN0aW1hdGVkIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibWlsZXN0b25lIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXaGV0aGVyIHRoZSB0YXNrIGlzIGEgbWlsZXN0b25lLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJNaWxlc3RvbmUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzdW1tYXJ5IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXaGV0aGVyIHRoZSB0YXNrIGlzIGEgc3VtbWFyeSB0YXNrLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJTdW1tYXJ5Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY3JpdGljYWwiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldoZXRoZXIgdGhlIHRhc2sgaXMgaW4gdGhlIGNyaXRpY2FsIGNoYWluLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDcml0aWNhbCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImlzU3VicHJvamVjdCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV2hldGhlciB0aGUgdGFzayBpcyBhbiBpbnNlcnRlZCBwcm9qZWN0LiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJJc1N1YnByb2plY3QiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpc1N1YnByb2plY3RSZWFkT25seSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV2hldGhlciB0aGUgaW5zZXJ0ZWQgcHJvamVjdCBpcyByZWFkLW9ubHkuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IklzU3VicHJvamVjdFJlYWRPbmx5Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic3VicHJvamVjdE5hbWUiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9TdWJwcm9qZWN0TmFtZVR5cGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgc291cmNlIGxvY2F0aW9uIG9mIHRoZSBpbnNlcnRlZCBwcm9qZWN0LiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJTdWJwcm9qZWN0TmFtZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImV4dGVybmFsVGFzayIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV2hldGhlciB0aGUgdGFzayBpcyBleHRlcm5hbC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRXh0ZXJuYWxUYXNrIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZXh0ZXJuYWxUYXNrUHJvamVjdCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL0V4dGVybmFsVGFza1Byb2plY3RUeXBlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHNvdXJjZSBsb2NhdGlvbiBhbmQgdGFzayBpZGVudGlmaWVyIG9mIHRoZSBleHRlcm5hbCB0YXNrLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJFeHRlcm5hbFRhc2tQcm9qZWN0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZWFybHlTdGFydCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EYXRlVGltZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBlYXJseSBzdGFydCBkYXRlIG9mIHRoZSB0YXNrLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJFYXJseVN0YXJ0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZWFybHlGaW5pc2giIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGF0ZVRpbWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZWFybHkgZmluaXNoIGRhdGUgb2YgdGhlIHRhc2suJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkVhcmx5RmluaXNoIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibGF0ZVN0YXJ0IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RhdGVUaW1lIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGxhdGUgc3RhcnQgZGF0ZSBvZiB0aGUgdGFzay4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTGF0ZVN0YXJ0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibGF0ZUZpbmlzaCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EYXRlVGltZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBsYXRlIGZpbmlzaCBkYXRlIG9mIHRoZSB0YXNrLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJMYXRlRmluaXNoIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic3RhcnRWYXJpYW5jZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9JbnRlZ2VyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHZhcmlhbmNlIG9mIHRoZSB0YXNrIHN0YXJ0IGRhdGUgZnJvbSAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgYmFzZWxpbmUgc3RhcnQgZGF0ZSBhcyBtaW51dGVzIHggMTAwMC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iU3RhcnRWYXJpYW5jZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImZpbmlzaFZhcmlhbmNlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0ludGVnZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdmFyaWFuY2Ugb2YgdGhlIHRhc2sgZmluaXNoIGRhdGUgZnJvbSAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgYmFzZWxpbmUgZmluaXNoIGRhdGUgYXMgbWludXRlcyB4IDEwMDAuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkZpbmlzaFZhcmlhbmNlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0id29ya1ZhcmlhbmNlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Zsb2F0IiB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHZhcmlhbmNlIG9mIHRhc2sgd29yayBmcm9tIHRoZSBiYXNlbGluZSAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXNrIHdvcmsgYXMgbWludXRlcyB4IDEwMDAuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IldvcmtWYXJpYW5jZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImZyZWVTbGFjayIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9JbnRlZ2VyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGFtb3VudCBvZiBmcmVlIHNsYWNrLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJGcmVlU2xhY2siLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ0b3RhbFNsYWNrIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0ludGVnZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYW1vdW50IG9mIHRvdGFsIHNsYWNrLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJUb3RhbFNsYWNrIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZml4ZWRDb3N0IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Zsb2F0IiB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGZpeGVkIGNvc3Qgb2YgdGhlIHRhc2suJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkZpeGVkQ29zdCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImZpeGVkQ29zdEFjY3J1YWwiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9GaXhlZENvc3RBY2NydWFsVHlwZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkhvdyB0aGUgZml4ZWQgY29zdCBpcyBhY2NydWVkIGFnYWluc3QgdGhlIHRhc2suICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlcyBhcmU6IDE9U3RhcnQsIDI9UHJvcmF0ZWQgYW5kIDM9RW5kLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJGaXhlZENvc3RBY2NydWFsIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icGVyY2VudENvbXBsZXRlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0ludGVnZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgcGVyY2VudGFnZSBvZiB0aGUgdGFzayBkdXJhdGlvbiBjb21wbGV0ZWQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlBlcmNlbnRDb21wbGV0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InBlcmNlbnRXb3JrQ29tcGxldGUiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vSW50ZWdlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBwZXJjZW50YWdlIG9mIHRoZSB0YXNrIHdvcmsgY29tcGxldGVkLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJQZXJjZW50V29ya0NvbXBsZXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY29zdCIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EZWNpbWFsIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHByb2plY3RlZCBvciBzY2hlZHVsZWQgY29zdCBvZiB0aGUgdGFzay4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ29zdCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im92ZXJ0aW1lQ29zdCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EZWNpbWFsIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHN1bSBvZiB0aGUgYWN0dWFsIGFuZCByZW1haW5pbmcgb3ZlcnRpbWUgY29zdCBvZiB0aGUgdGFzay4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iT3ZlcnRpbWVDb3N0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ib3ZlcnRpbWVXb3JrIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0R1cmF0aW9uIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGFtb3VudCBvZiBvdmVydGltZSB3b3JrIHNjaGVkdWxlZCBmb3IgdGhlIHRhc2suJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik92ZXJ0aW1lV29yayIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFjdHVhbFN0YXJ0IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RhdGVUaW1lIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGFjdHVhbCBzdGFydCBkYXRlIG9mIHRoZSB0YXNrLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJBY3R1YWxTdGFydCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFjdHVhbEZpbmlzaCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EYXRlVGltZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBhY3R1YWwgZmluaXNoIGRhdGUgb2YgdGhlIHRhc2suJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkFjdHVhbEZpbmlzaCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFjdHVhbER1cmF0aW9uIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0R1cmF0aW9uIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGFjdHVhbCBkdXJhdGlvbiBvZiB0aGUgdGFzay4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQWN0dWFsRHVyYXRpb24iLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhY3R1YWxDb3N0IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RlY2ltYWwiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYWN0dWFsIGNvc3Qgb2YgdGhlIHRhc2suJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkFjdHVhbENvc3QiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhY3R1YWxPdmVydGltZUNvc3QiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGVjaW1hbCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBhY3R1YWwgb3ZlcnRpbWUgY29zdCBvZiB0aGUgdGFzay4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQWN0dWFsT3ZlcnRpbWVDb3N0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYWN0dWFsV29yayIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EdXJhdGlvbiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBhY3R1YWwgd29yayBmb3IgdGhlIHRhc2suJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkFjdHVhbFdvcmsiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhY3R1YWxPdmVydGltZVdvcmsiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRHVyYXRpb24iPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYWN0dWFsIG92ZXJ0aW1lIHdvcmsgZm9yIHRoZSB0YXNrLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJBY3R1YWxPdmVydGltZVdvcmsiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyZWd1bGFyV29yayIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EdXJhdGlvbiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBhbW91bnQgb2Ygbm9uLW92ZXJ0aW1lIHdvcmsgc2NoZWR1bGVkIGZvciB0aGUgdGFzay4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUmVndWxhcldvcmsiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyZW1haW5pbmdEdXJhdGlvbiIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EdXJhdGlvbiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBhbW91bnQgb2YgdGltZSByZXF1aXJlZCB0byBjb21wbGV0ZSB0aGUgdW5maW5pc2hlZCBwb3J0aW9uIG9mIHRoZSB0YXNrLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJSZW1haW5pbmdEdXJhdGlvbiIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJlbWFpbmluZ0Nvc3QiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGVjaW1hbCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSByZW1haW5pbmcgcHJvamVjdGVkIGNvc3Qgb2YgY29tcGxldGluZyB0aGUgdGFzay4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUmVtYWluaW5nQ29zdCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJlbWFpbmluZ1dvcmsiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRHVyYXRpb24iPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgcmVtYWluaW5nIHdvcmsgc2NoZWR1bGVkIHRvIGNvbXBsZXRlIHRoZSB0YXNrLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJSZW1haW5pbmdXb3JrIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmVtYWluaW5nT3ZlcnRpbWVDb3N0IgotICAgICAgICB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RlY2ltYWwiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgcmVtYWluaW5nIG92ZXJ0aW1lIGNvc3QgcHJvamVjdGVkIHRvIGZpbmlzaCB0aGUgdGFzay4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUmVtYWluaW5nT3ZlcnRpbWVDb3N0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmVtYWluaW5nT3ZlcnRpbWVXb3JrIgotICAgICAgICB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0R1cmF0aW9uIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHJlbWFpbmluZyBvdmVydGltZSB3b3JrIHNjaGVkdWxlZCB0byBmaW5pc2ggdGhlIHRhc2suJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlJlbWFpbmluZ092ZXJ0aW1lV29yayIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFDV1AiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRmxvYXQiCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYWN0dWFsIGNvc3Qgb2Ygd29yayBwZXJmb3JtZWQgb24gdGhlIHRhc2sgdG8tZGF0ZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQUNXUCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNWIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Zsb2F0IgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRWFybmVkIHZhbHVlIGNvc3QgdmFyaWFuY2UuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkNWIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY29uc3RyYWludFR5cGUiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9Db25zdHJhaW50VHlwZVR5cGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgY29uc3RyYWludCBvbiB0aGUgc3RhcnQgb3IgZmluaXNoIGRhdGUgb2YgdGhlIHRhc2suICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlcyBhcmU6IDA9QXMgU29vbiBBcyBQb3NzaWJsZSwgMT1BcyBMYXRlIEFzIFBvc3NpYmxlLCAyPU11c3QgU3RhcnQgT24sIDM9TXVzdCBGaW5pc2ggT24sICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ9U3RhcnQgTm8gRWFybGllciBUaGFuLCA1PVN0YXJ0IE5vIExhdGVyIFRoYW4sIDY9RmluaXNoIE5vIEVhcmxpZXIgVGhhbiBhbmQgNz1GaW5pc2ggTm8gTGF0ZXIgVGhhbiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDb25zdHJhaW50VHlwZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNhbGVuZGFyVUlEIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0ludGVnZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdGFzayBjYWxlbmRhci5SZWZlcnMgdG8gYSB2YWxpZCBVSUQgaW4gdGhlIENhbGVuZGFycyBlbGVtZW50IG9mICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBNaWNyb3NvZnQgUHJvamVjdCBYTUwgU2NoZW1hLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDYWxlbmRhclVJRCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNvbnN0cmFpbnREYXRlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RhdGVUaW1lIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGRhdGUgYXJndW1lbnQgZm9yIHRoZSB0YXNrIGNvbnN0cmFpbnQgdHlwZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ29uc3RyYWludERhdGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJkZWFkbGluZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EYXRlVGltZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBkZWFkbGluZSBmb3IgdGhlIHRhc2sgdG8gYmUgY29tcGxldGVkLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJEZWFkbGluZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImxldmVsQXNzaWdubWVudHMiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldoZXRoZXIgbGV2ZWxpbmcgY2FuIGFkanVzdCBhc3NpZ25tZW50cy4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTGV2ZWxBc3NpZ25tZW50cyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImxldmVsaW5nQ2FuU3BsaXQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldoZXRoZXIgbGV2ZWxpbmcgY2FuIHNwbGl0IHRoZSB0YXNrLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJMZXZlbGluZ0NhblNwbGl0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibGV2ZWxpbmdEZWxheSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9JbnRlZ2VyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGRlbGF5IGNhdXNlZCBieSBsZXZlbGluZyB0aGUgdGFzay4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTGV2ZWxpbmdEZWxheSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImxldmVsaW5nRGVsYXlGb3JtYXQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9MZXZlbGluZ0RlbGF5Rm9ybWF0VHlwZTEiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZm9ybWF0IGZvciBleHByZXNzaW5nIHRoZSBkdXJhdGlvbiBvZiB0aGUgZGVsYXkuICAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZXMgYXJlOiAzPW0sIDQ9ZW0sIDU9aCwgNj1laCwgNz1kLCA4PWVkLCA5PXcsIDEwPWV3LCAxMT1tbywgMTI9ZW1vLCAxOT0lLCAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMD1lJSwgMjE9bnVsbCwgMzU9bT8sIDM2PWVtPywgMzc9aD8sIDM4PWVoPywgMzk9ZD8sIDQwPWVkPywgNDE9dz8sIDQyPWV3PywgJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDM9bW8/LCA0ND1lbW8/LCA1MT0lPywgNTI9ZSU/IGFuZCA1Mz1udWxsLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJMZXZlbGluZ0RlbGF5Rm9ybWF0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icHJlTGV2ZWxlZFN0YXJ0IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RhdGVUaW1lIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHN0YXJ0IGRhdGUgb2YgdGhlIHRhc2sgYmVmb3JlIGl0IHdhcyBsZXZlbGVkLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJQcmVMZXZlbGVkU3RhcnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwcmVMZXZlbGVkRmluaXNoIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RhdGVUaW1lIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGZpbmlzaCBkYXRlIG9mIHRoZSB0YXNrIGJlZm9yZSBpdCB3YXMgbGV2ZWxlZC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUHJlTGV2ZWxlZEZpbmlzaCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Imh5cGVybGluayIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL0h5cGVybGlua1R5cGUyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHRpdGxlIG9mIHRoZSBoeXBlcmxpbmsgYXNzb2NpYXRlZCB3aXRoIHRoZSB0YXNrLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJIeXBlcmxpbmsiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJoeXBlcmxpbmtBZGRyZXNzIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vSHlwZXJsaW5rQWRkcmVzc1R5cGUyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGh5cGVybGluayBhc3NvY2lhdGVkIHdpdGggdGhlIHRhc2suJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ikh5cGVybGlua0FkZHJlc3MiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJoeXBlcmxpbmtTdWJBZGRyZXNzIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vSHlwZXJsaW5rU3ViQWRkcmVzc1R5cGUyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGRvY3VtZW50IGJvb2ttYXJrIG9mIHRoZSBoeXBlcmxpbmsgYXNzb2NpYXRlZCB3aXRoIHRoZSB0YXNrLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJIeXBlcmxpbmtTdWJBZGRyZXNzIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaWdub3JlUmVzb3VyY2VDYWxlbmRhciIKLSAgICAgICAgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV2hldGhlciB0aGUgdGFzayBpZ25vcmVzIHRoZSByZXNvdXJjZSBjYWxlbmRhci4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iSWdub3JlUmVzb3VyY2VDYWxlbmRhciIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im5vdGVzIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRleHQgbm90ZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSB0YXNrLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJOb3RlcyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImhpZGVCYXIiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldoZXRoZXIgdGhlIEdBTlRUIGJhciBvZiB0aGUgdGFzayBpcyBoaWRkZW4gd2hlbiBkaXNwbGF5ZWQgaW4gTWljcm9zb2Z0IFByb2plY3QuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkhpZGVCYXIiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyb2xsdXAiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldoZXRoZXIgdGhlIHRhc2sgaXMgcm9sbGVkIHVwLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJSb2xsdXAiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJiQ1dTIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Zsb2F0IgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGJ1ZGdldGVkIGNvc3Qgb2Ygd29yayBzY2hlZHVsZWQgZm9yIHRoZSB0YXNrLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJCQ1dTIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYkNXUCIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9GbG9hdCIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBidWRnZXRlZCBjb3N0IG9mIHdvcmsgcGVyZm9ybWVkIG9uIHRoZSB0YXNrIHRvLWRhdGUuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkJDV1AiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwaHlzaWNhbFBlcmNlbnRDb21wbGV0ZSIKLSAgICAgICAgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9JbnRlZ2VyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHBlcmNlbnRhZ2UgY29tcGxldGUgdmFsdWUgZW50ZXJlZCBieSB0aGUgUHJvamVjdCBNYW5hZ2VyLiAgJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBjYW4gYmUgdXNlZCBhcyBhbiBhbHRlcm5hdGl2ZSBmb3IgY2FsY3VsYXRpbmcgQkNXUC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUGh5c2ljYWxQZXJjZW50Q29tcGxldGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJlYXJuZWRWYWx1ZU1ldGhvZCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL0Vhcm5lZFZhbHVlTWV0aG9kVHlwZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBtZXRob2QgZm9yIGNhbGN1bGF0aW5nIGVhcm5lZCB2YWx1ZS4gJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVzIGFyZTogMD1QZXJjZW50IENvbXBsZXRlLCAxPVBoeXNpY2FsIFBlcmNlbnQgQ29tcGxldGUmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRWFybmVkVmFsdWVNZXRob2QiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJwcmVkZWNlc3NvckxpbmsiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vUHJlZGVjZXNzb3JMaW5rIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRGVmaW5lcyB0aGUgcHJlZGVjZXNzb3IgdGFzayBvZiB0aGUgdGFzayB0aGF0IGNvbnRhaW5zIGl0LiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJQcmVkZWNlc3NvckxpbmsiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhY3R1YWxXb3JrUHJvdGVjdGVkIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0R1cmF0aW9uIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iU3BlY2lmaWVzIHRoZSBkdXJhdGlvbiB0aHJvdWdoIHdoaWNoIGFjdHVhbCB3b3JrIGlzIHByb3RlY3RlZC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQWN0dWFsV29ya1Byb3RlY3RlZCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZCIKLSAgICAgICAgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EdXJhdGlvbiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlNwZWNpZmllcyB0aGUgZHVyYXRpb24gdGhyb3VnaCB3aGljaCBhY3R1YWwgb3ZlcnRpbWUgd29yayBpcyBwcm90ZWN0ZWQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkFjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImV4dGVuZGVkQXR0cmlidXRlIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL0V4dGVuZGVkQXR0cmlidXRlMiIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB2YWx1ZSBvZiBhbiBleHRlbmRlZCBhdHRyaWJ1dGUuICBUd28gcGllY2VzIG9mIGRhdGEgYXJlIG5lY2Vzc2FyeSAtICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEgcG9pbnRlciBiYWNrIHRvIHRoZSBleHRlbmRlZCBhdHRyaWJ1dGUgdGFibGUgd2hpY2ggaXMgc3BlY2lmaWVkIGVpdGhlciBieSB0aGUgdW5pcXVlIElEIG9yICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBGaWVsZCBJRCwgYW5kIHRoZSB2YWx1ZSB3aGljaCBpcyBzcGVjaWZpZWQgZWl0aGVyIHdpdGggdGhlIHZhbHVlLCBvciBhIHBvaW50ZXIgYmFjayB0byB0aGUgdmFsdWUgbGlzdC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRXh0ZW5kZWRBdHRyaWJ1dGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJiYXNlbGluZSIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9CYXNlbGluZSIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBjb2xsZWN0aW9uIG9mIGJhc2VsaW5lIHZhbHVlcyBvZiB0aGUgdGFzay4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQmFzZWxpbmUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJvdXRsaW5lQ29kZSIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9PdXRsaW5lQ29kZTIiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdmFsdWUgb2YgYW4gb3V0bGluZSBjb2RlLiAgVHdvIHBpZWNlcyBvZiBkYXRhIGFyZSBuZWNlc3NhcnkgLSAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhIHBvaW50ZXIgYmFjayB0byB0aGUgb3V0bGluZSBjb2RlIHRhYmxlIHdoaWNoIGlzIHNwZWNpZmllZCBlaXRoZXIgYnkgdGhlIHVuaXF1ZSBJRCBvciB0aGUgRmllbGQgSUQsICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCB0aGUgdmFsdWUgd2hpY2ggaXMgc3BlY2lmaWVkIGVpdGhlciB3aXRoIHRoZSB2YWx1ZSwgb3IgYSBwb2ludGVyIGJhY2sgdG8gdGhlIHZhbHVlIGxpc3QuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik91dGxpbmVDb2RlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0idGltZXBoYXNlZERhdGEiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vVGltZXBoYXNlZERhdGFUeXBlIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHRpbWUgcGhhc2VkIGRhdGEgYmxvY2sgYXNzb2NpYXRlZCB3aXRoIHRoZSB0YXNrLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJUaW1lcGhhc2VkRGF0YSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlRhc2tzIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlRhc2tzXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0idGFzayIgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9UYXNrIgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlcmUgbXVzdCBiZSBhdCBsZWFzdCBvbmUgdGFzayBpbiBlYWNoIFRhc2tzIGNvbGxlY3Rpb24uJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlRhc2siLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJUaW1lUGVyaW9kIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlRpbWVQZXJpb2RfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJmcm9tRGF0ZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EYXRlVGltZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBiZWdpbm5pbmcgb2YgdGhlIGV4Y2VwdGlvbiB0aW1lLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRnJvbURhdGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ0b0RhdGUiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGF0ZVRpbWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZW5kIG9mIHRoZSBleGNlcHRpb24gdGltZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlRvRGF0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlRpbWVwaGFzZWREYXRhVHlwZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGRlZmluaXRpb24gb2YgdGhlIHRpbWUgcGhhc2VkIGRhdGEgYmxvY2suJiN4RDsmI3hBOyYjeDk7JiN4OTsgICAgICAgICIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVGltZXBoYXNlZERhdGFUeXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ0eXBlIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iIy8vVHlwZVR5cGUzIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iJiN4RDsmI3hBOyAgICAgICAgICAgICAgICBUaGUgdHlwZSBvZiB0YXNrIHRpbWVwaGFzZWQgZGF0YS4gVmFsdWVzIGFyZTomI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAxPUFzc2lnbm1lbnQgUmVtYWluaW5nIFdvcmsmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAyPUFzc2lnbm1lbnQgQWN0dWFsIFdvcmsmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAzPUFzc2lnbm1lbnQgQWN0dWFsIE92ZXJ0aW1lIFdvcmsmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICA0PUFzc2lnbm1lbnQgQmFzZWxpbmUgV29yayYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDU9QXNzaWdubWVudCBCYXNlbGluZSBDb3N0JiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgNj1Bc3NpZ25tZW50IEFjdHVhbCBDb3N0JiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgNz1SZXNvdXJjZSBCYXNlbGluZSBXb3JrJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgOD1SZXNvdXJjZSBCYXNlbGluZSBDb3N0JiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgOT1UYXNrIEJhc2VsaW5lIFdvcmsmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAxMD1UYXNrIEJhc2VsaW5lIENvc3QmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAxMT1UYXNrIFBlcmNlbnQgQ29tcGxldGUmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAxNj1Bc3NpZ25tZW50IEJhc2VsaW5lIDEgV29yayYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDE3PUFzc2lnbm1lbnQgQmFzZWxpbmUgMSBDb3N0JiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgMTg9VGFzayBCYXNlbGluZSAxIFdvcmsmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAxOT1UYXNrIEJhc2VsaW5lIDEgQ29zdCYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDIwPVJlc291cmNlIEJhc2VsaW5lIDEgV29yayYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDIxPVJlc291cmNlIEJhc2VsaW5lIDEgQ29zdCYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDIyPUFzc2lnbm1lbnQgQmFzZWxpbmUgMiBXb3JrJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgMjM9QXNzaWdubWVudCBCYXNlbGluZSAyIENvc3QmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAyND1UYXNrIEJhc2VsaW5lIDIgV29yayYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDI1PVRhc2sgQmFzZWxpbmUgMiBDb3N0JiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgMjY9UmVzb3VyY2UgQmFzZWxpbmUgMiBXb3JrJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgMjc9UmVzb3VyY2UgQmFzZWxpbmUgMiBDb3N0JiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgMjg9QXNzaWdubWVudCBCYXNlbGluZSAzIFdvcmsmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAyOT1Bc3NpZ25tZW50IEJhc2VsaW5lIDMgQ29zdCYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDMwPVRhc2sgQmFzZWxpbmUgMyBXb3JrJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgMzE9VGFzayBCYXNlbGluZSAzIENvc3QmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAzMj1SZXNvdXJjZSBCYXNlbGluZSAzIFdvcmsmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAzMz1SZXNvdXJjZSBCYXNlbGluZSAzIENvc3QmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAzND1Bc3NpZ25tZW50IEJhc2VsaW5lIDQgV29yayYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDM1PUFzc2lnbm1lbnQgQmFzZWxpbmUgNCBDb3N0JiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgMzY9VGFzayBCYXNlbGluZSA0IFdvcmsmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAzNz1UYXNrIEJhc2VsaW5lIDQgQ29zdCYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDM4PVJlc291cmNlIEJhc2VsaW5lIDQgV29yayYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDM5PVJlc291cmNlIEJhc2VsaW5lIDQgQ29zdCYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDQwPUFzc2lnbm1lbnQgQmFzZWxpbmUgNSBXb3JrJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgNDE9QXNzaWdubWVudCBCYXNlbGluZSA1IENvc3QmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICA0Mj1UYXNrIEJhc2VsaW5lIDUgV29yayYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDQzPVRhc2sgQmFzZWxpbmUgNSBDb3N0JiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgNDQ9UmVzb3VyY2UgQmFzZWxpbmUgNSBXb3JrJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgNDU9UmVzb3VyY2UgQmFzZWxpbmUgNSBDb3N0JiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgNDY9QXNzaWdubWVudCBCYXNlbGluZSA2IFdvcmsmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICA0Nz1Bc3NpZ25tZW50IEJhc2VsaW5lIDYgQ29zdCYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDQ4PVRhc2sgQmFzZWxpbmUgNiBXb3JrJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgNDk9VGFzayBCYXNlbGluZSA2IENvc3QmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICA1MD1SZXNvdXJjZSBCYXNlbGluZSA2IFdvcmsmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICA1MT1SZXNvdXJjZSBCYXNlbGluZSA2IENvc3QmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICA1Mj1Bc3NpZ25tZW50IEJhc2VsaW5lIDcgV29yayYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDUzPUFzc2lnbm1lbnQgQmFzZWxpbmUgNyBDb3N0JiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgNTQ9VGFzayBCYXNlbGluZSA3IFdvcmsmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICA1NT1UYXNrIEJhc2VsaW5lIDcgQ29zdCYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDU2PVJlc291cmNlIEJhc2VsaW5lIDcgV29yayYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDU3PVJlc291cmNlIEJhc2VsaW5lIDcgQ29zdCYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDU4PUFzc2lnbm1lbnQgQmFzZWxpbmUgOCBXb3JrJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgNTk9QXNzaWdubWVudCBCYXNlbGluZSA4IENvc3QmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICA2MD1UYXNrIEJhc2VsaW5lIDggV29yayYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDYxPVRhc2sgQmFzZWxpbmUgOCBDb3N0JiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgNjI9UmVzb3VyY2UgQmFzZWxpbmUgOCBXb3JrJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgNjM9UmVzb3VyY2UgQmFzZWxpbmUgOCBDb3N0JiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgNjQ9QXNzaWdubWVudCBCYXNlbGluZSA5IFdvcmsmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICA2NT1Bc3NpZ25tZW50IEJhc2VsaW5lIDkgQ29zdCYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDY2PVRhc2sgQmFzZWxpbmUgOSBXb3JrJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgNjc9VGFzayBCYXNlbGluZSA5IENvc3QmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICA2OD1SZXNvdXJjZSBCYXNlbGluZSA5IFdvcmsmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICA2OT1SZXNvdXJjZSBCYXNlbGluZSA5IENvc3QmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICA3MD1Bc3NpZ25tZW50IEJhc2VsaW5lIDEwIFdvcmsmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICA3MT1Bc3NpZ25tZW50IEJhc2VsaW5lIDEwIENvc3QmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICA3Mj1UYXNrIEJhc2VsaW5lIDEwIFdvcmsmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICA3Mz1UYXNrIEJhc2VsaW5lIDEwIENvc3QmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICA3ND1SZXNvdXJjZSBCYXNlbGluZSAxMCBXb3JrJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgNzU9UmVzb3VyY2UgQmFzZWxpbmUgMTAgQ29zdCYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDc2PVBoeXNpY2FsIFBlcmNlbnQgQ29tcGxldGUmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJUeXBlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idUlEIiB1bmlxdWU9ImZhbHNlIiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0ludGVnZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIHRpbWVwaGFzZWQgZGF0YSByZWNvcmQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVUlEIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic3RhcnQiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGF0ZVRpbWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgc3RhcnQgZGF0ZSBvZiB0aGUgdGltZXBoYXNlZCBkYXRhIHBlcmlvZC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJTdGFydCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImZpbmlzaCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EYXRlVGltZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBmaW5pc2ggZGF0ZSBvZiB0aGUgdGltZXBoYXNlZCBkYXRhIHBlcmlvZC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJGaW5pc2giLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ1bml0IiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iIy8vVW5pdFR5cGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdGltZSB1bml0IG9mIHRoZSB0aW1lcGhhc2VkIGRhdGEgcGVyaW9kLiAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgIFZhbHVlcyBhcmU6IDA9bSwgMT1oLCAyPWQsIDM9dywgNT1tbywgOD15JiN4RDsmI3hBOyAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVW5pdCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InZhbHVlIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB2YWx1ZSBwZXIgdW5pdCBvZiB0aW1lIGZvciB0aGUgdGltZXBoYXNlZCBkYXRhIHBlcmlvZC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJWYWx1ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IlRpdGxlVHlwZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubGFuZy5TdHJpbmciPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVGl0bGVfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3N0cmluZyIvPgotICAgICAgPGRldGFpbHMga2V5PSJtYXhMZW5ndGgiIHZhbHVlPSI1MTIiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iVHlwZVR5cGUiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLm1hdGguQmlnSW50ZWdlciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJUeXBlXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImVudW1lcmF0aW9uIiB2YWx1ZT0iMCAxIDIiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iVHlwZVR5cGUxIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5tYXRoLkJpZ0ludGVnZXIiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVHlwZV8uXzFfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXIiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iZW51bWVyYXRpb24iIHZhbHVlPSIwIDEgMiAzIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IlR5cGVUeXBlMiIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubWF0aC5CaWdJbnRlZ2VyIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlR5cGVfLl8yXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImVudW1lcmF0aW9uIiB2YWx1ZT0iMCAxIDIgMyIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJUeXBlVHlwZTMiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLm1hdGguQmlnSW50ZWdlciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJUeXBlXy5fM18uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjaW50ZWdlciIvPgotICAgICAgPGRldGFpbHMga2V5PSJlbnVtZXJhdGlvbiIgdmFsdWU9IjEgMiAzIDQgNSA2IDcgOCA5IDEwIDExIDE2IDE3IDE4IDE5IDIwIDIxIDIyIDIzIDI0IDI1IDI2IDI3IDI4IDI5IDMwIDMxIDMyIDMzIDM0IDM1IDM2IDM3IDM4IDM5IDQwIDQxIDQyIDQzIDQ0IDQ1IDQ2IDQ3IDQ4IDQ5IDUwIDUxIDUyIDUzIDU0IDU1IDU2IDU3IDU4IDU5IDYwIDYxIDYyIDYzIDY0IDY1IDY2IDY3IDY4IDY5IDcwIDcxIDcyIDczIDc0IDc1IDc2Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IlR5cGVUeXBlNCIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubWF0aC5CaWdJbnRlZ2VyIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlR5cGVfLl80Xy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImVudW1lcmF0aW9uIiB2YWx1ZT0iMCAxIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IlR5cGVUeXBlNSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubWF0aC5CaWdJbnRlZ2VyIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlR5cGVfLl81Xy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImVudW1lcmF0aW9uIiB2YWx1ZT0iMCAxIDIgMyIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJVSURUeXBlIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5sYW5nLlN0cmluZyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJVSURfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3N0cmluZyIvPgotICAgICAgPGRldGFpbHMga2V5PSJtYXhMZW5ndGgiIHZhbHVlPSIxNiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJVbml0VHlwZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubWF0aC5CaWdJbnRlZ2VyIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlVuaXRfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXIiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iZW51bWVyYXRpb24iIHZhbHVlPSIwIDEgMiAzIDUgOCIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJWYWx1ZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJWYWx1ZV8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InZhbHVlSUQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vSW50ZWdlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB1bmlxdWUgSUQgb2YgdGhlIG91dGxpbmUgY29kZSB2YWx1ZSBhY3Jvc3MgdGhlIHByb2plY3QuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlZhbHVlSUQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwYXJlbnRWYWx1ZUlEIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0ludGVnZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdmFsdWUgb2YgdGhlIHBhcmVudCBub2RlIG9mIHRoZSBvdXRsaW5lIGNvZGUuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlBhcmVudFZhbHVlSUQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ2YWx1ZSIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYWN0dWFsIHZhbHVlLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJWYWx1ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImRlc2NyaXB0aW9uIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgZGVzY3JpcHRpb24gb2YgdGhpcyB2YWx1ZS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRGVzY3JpcHRpb24iLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJWYWx1ZTIiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVmFsdWVfLl8xXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaUQiIHVuaXF1ZT0iZmFsc2UiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vSW50ZWdlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlVuaXF1ZSBJRCBvZiB2YWx1ZSBhY3Jvc3MgJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHByb2plY3QuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IklEIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idmFsdWUiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGFjdHVhbCB2YWx1ZS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVmFsdWUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJkZXNjcmlwdGlvbiIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZGVzY3JpcHRpb24gb2YgdGhlIHZhbHVlICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIHRoZSBsaXN0LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJEZXNjcmlwdGlvbiIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlZhbHVlTGlzdCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJWYWx1ZUxpc3RfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ2YWx1ZSIgbG93ZXJCb3VuZD0iMSIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9WYWx1ZTIiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdmFsdWVzIHRoYXQgbWFrZSB1cCB0aGUgdmFsdWUgbGlzdC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVmFsdWUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJWYWx1ZWxpc3RTb3J0T3JkZXJUeXBlIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5tYXRoLkJpZ0ludGVnZXIiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVmFsdWVsaXN0U29ydE9yZGVyXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImVudW1lcmF0aW9uIiB2YWx1ZT0iMCAxIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlZhbHVlcyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJWYWx1ZXNfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJncm91cCIgdW5pcXVlPSJmYWxzZSIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VGZWF0dXJlTWFwRW50cnkiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9Imdyb3VwIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Imdyb3VwOjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0idmFsdWUiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vVmFsdWUiIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIGRlcml2ZWQ9InRydWUiIGNvbnRhaW5tZW50PSJ0cnVlIgotICAgICAgICByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgaW5kaXZpZHVhbCB2YWx1ZXMuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlZhbHVlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJncm91cCIgdmFsdWU9IiNncm91cDowIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IldCU01hc2siPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iV0JTTWFza18uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImxldmVsIiB1bmlxdWU9ImZhbHNlIiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0ludGVnZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgbGV2ZWwgb2YgdGhlIG1hc2suIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkxldmVsIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idHlwZSIgdW5pcXVlPSJmYWxzZSIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9IiMvL1R5cGVUeXBlMiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB0eXBlIG9mIHRoZSBub2RlIHZhbHVlLiAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgdmFsdWVzIGFyZTogMD1OdW1iZXJzLCAxPVVwcGVyY2FzZSBMZXR0ZXJzLCAyPUxvd2VyY2FzZSBMZXR0ZXJzLCAzPUNoYXJhY3RlcnMuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlR5cGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJsZW5ndGgiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGxvd2VyQm91bmQ9IjEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIG1heGltdW0gbGVuZ3RoIGluIGNoYXJhY3RlcnMuICAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGVsZW1lbnQgaXMgb21pdHRlZCB3aGVuIGxlbmd0aCBpcyAmcXVvdDthbnkmcXVvdDsuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ikxlbmd0aCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InNlcGFyYXRvciIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgbG93ZXJCb3VuZD0iMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgc2VwYXJhdG9yIGNoYXJhY3RlciBvZiB0aGUgbm9kZS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iU2VwYXJhdG9yIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iV0JTTWFza3MiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iV0JTTWFza3NfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ2ZXJpZnlVbmlxdWVDb2RlcyIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldoZXRoZXIgV0JTIGNvZGVzIGFyZSB1bmlxdWUgZm9yIG5ldyB0YXNrcy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVmVyaWZ5VW5pcXVlQ29kZXMiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJnZW5lcmF0ZUNvZGVzIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV2hldGhlciBXQlMgY29kZXMgYXJlIGdlbmVyYXRlZCBmb3IgbmV3IHRhc2tzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJHZW5lcmF0ZUNvZGVzIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icHJlZml4IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vUHJlZml4VHlwZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBwcmVmaXggZm9yIGFsbCBXQlMgY29kZXMuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlByZWZpeCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9IndCU01hc2siIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vV0JTTWFzayIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBXQlMgTWFzayB0aGF0IGlzIGFwcGxpZWQgdG8gYWxsIHRhc2tzIGluIHRoZSBQcm9qZWN0LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJXQlNNYXNrIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iV2Vla0RheSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJXZWVrRGF5Xy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZGF5VHlwZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgbG93ZXJCb3VuZD0iMSIgZVR5cGU9IiMvL0RheVR5cGVUeXBlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHR5cGUgb2YgZGF5LiAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVzIGFyZTogMD1FeGNlcHRpb24sIDE9TW9uZGF5LCAyPVR1ZXNkYXksICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzPVdlZG5lc2RheSwgND1UaHVyc2RheSwgNT1GcmlkYXksIDY9U2F0dXJkYXksICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3PVN1bmRheSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJEYXlUeXBlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZGF5V29ya2luZyIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV2hldGhlciB0aGUgc3BlY2lmaWVkIGRhdGUgb3IgZGF5ICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlIGlzIHdvcmtpbmcuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkRheVdvcmtpbmciLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ0aW1lUGVyaW9kIiBlVHlwZT0iIy8vVGltZVBlcmlvZCIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkRlZmluZXMgYSBjb250aWd1b3VzIHNldCBvZiBleGNlcHRpb24gZGF5cy4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlRpbWVQZXJpb2QiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ3b3JraW5nVGltZXMiIGVUeXBlPSIjLy9Xb3JraW5nVGltZXMiCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgY29sbGVjdGlvbiBvZiB3b3JraW5nIHRpbWVzIHRoYXQgZGVmaW5lIHRoZSB0aW1lIHdvcmtlZCAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb24gdGhlIHdlZWtkYXkuICBPbmUgb2YgdGhlc2UgbXVzdCBiZSBwcmVzZW50LCBhbmQgdGhlcmUgbWF5IGJlIG5vIG1vcmUgdGhhbiBmaXZlLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iV29ya2luZ1RpbWVzIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iV2Vla0RheXMiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iV2Vla0RheXNfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ3ZWVrRGF5IiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL1dlZWtEYXkiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIHdlZWtkYXkgZWl0aGVyIGRlZmluZXMgcmVndWxhciBkYXlzICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mIHRoZSB3ZWVrIG9yIGV4Y2VwdGlvbiBkYXlzIGluIHRoZSBjYWxlbmRhci4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iV2Vla0RheSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IldlZWtTdGFydERheVR5cGUiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLm1hdGguQmlnSW50ZWdlciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJXZWVrU3RhcnREYXlfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXIiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iZW51bWVyYXRpb24iIHZhbHVlPSIwIDEgMiAzIDQgNSA2Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IldvcmtDb250b3VyVHlwZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubWF0aC5CaWdJbnRlZ2VyIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IldvcmtDb250b3VyXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImVudW1lcmF0aW9uIiB2YWx1ZT0iMCAxIDIgMyA0IDUgNiA3IDgiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iV29ya0Zvcm1hdFR5cGUiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLm1hdGguQmlnSW50ZWdlciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJXb3JrRm9ybWF0Xy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImVudW1lcmF0aW9uIiB2YWx1ZT0iMSAyIDMgNCA1Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IldvcmtHcm91cFR5cGUiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLm1hdGguQmlnSW50ZWdlciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJXb3JrR3JvdXBfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXIiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iZW51bWVyYXRpb24iIHZhbHVlPSIwIDEgMiAzIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IldvcmtpbmdUaW1lIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IldvcmtpbmdUaW1lXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZnJvbVRpbWUiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vVGltZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBiZWdpbm5pbmcgb2YgdGhlIHdvcmtpbmcgdGltZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJGcm9tVGltZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InRvVGltZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9UaW1lIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGVuZCBvZiB0aGUgd29ya2luZyAgdGltZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJUb1RpbWUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJXb3JraW5nVGltZXMiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iV29ya2luZ1RpbWVzXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0id29ya2luZ1RpbWUiIHVwcGVyQm91bmQ9IjUiCi0gICAgICAgIGVUeXBlPSIjLy9Xb3JraW5nVGltZSIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkRlZmluZXMgdGhlIHdvcmtpbmcgdGltZSBkdXJpbmcgdGhlIHdlZWtkYXkuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iV29ya2luZ1RpbWUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLTwvZWNvcmU6RVBhY2thZ2U+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvcGFja2FnZS5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzE2N2ZkOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgdGhlIGltcGxlbWVudGF0aW9uIGZvciB0aGUgTWljcm9zb2Z0IFByb2plY3QgbW9kZWwgb2JqZWN0cy4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L3BhY2thZ2UuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZTNiODBjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgdGhlIGludGVyZmFjZXMgZm9yIHRoZSBNaWNyb3NvZnQgUHJvamVjdCBtb2RlbCBvYmplY3RzLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvdXRpbC9Nc3Byb2plY3RBZGFwdGVyRmFjdG9yeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC91dGlsL01zcHJvamVjdEFkYXB0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxMjUzZGYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC91dGlsL01zcHJvamVjdEFkYXB0ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MzggKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBNc3Byb2plY3RBZGFwdGVyRmFjdG9yeS5qYXZhLHYgMS4xIDIwMDgvMDEvMTUgMDg6NTI6NDEganRoYW0gRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXZhaWxhYmlsaXR5UGVyaW9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXZhaWxhYmlsaXR5UGVyaW9kczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQ2FsZW5kYXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5DYWxlbmRhcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Eb2N1bWVudFJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlMjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlMzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlNDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1hc2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5NYXNrczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlMjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlMzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByZWRlY2Vzc29yTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmF0ZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRpbWVQZXJpb2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UaW1lcGhhc2VkRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5WYWx1ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlZhbHVlMjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlZhbHVlTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlZhbHVlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldCU01hc2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5XQlNNYXNrczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldlZWtEYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5XZWVrRGF5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldvcmtpbmdUaW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV29ya2luZ1RpbWVzOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBUaGUgPGI+QWRhcHRlciBGYWN0b3J5PC9iPiBmb3IgdGhlIG1vZGVsLgotICogSXQgcHJvdmlkZXMgYW4gYWRhcHRlciA8Y29kZT5jcmVhdGVYWFg8L2NvZGU+IG1ldGhvZCBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBNc3Byb2plY3RBZGFwdGVyRmFjdG9yeSBleHRlbmRzIEFkYXB0ZXJGYWN0b3J5SW1wbCB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCBtb2RlbCBwYWNrYWdlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgTXNwcm9qZWN0UGFja2FnZSBtb2RlbFBhY2thZ2U7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBhZGFwdGVyIGZhY3RvcnkuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE1zcHJvamVjdEFkYXB0ZXJGYWN0b3J5KCkgewotCQlpZiAobW9kZWxQYWNrYWdlID09IG51bGwpIHsKLQkJCW1vZGVsUGFja2FnZSA9IE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoaXMgZmFjdG9yeSBpcyBhcHBsaWNhYmxlIGZvciB0aGUgdHlwZSBvZiB0aGUgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBvYmplY3QgaXMgZWl0aGVyIHRoZSBtb2RlbCdzIHBhY2thZ2Ugb3IgaXMgYW4gaW5zdGFuY2Ugb2JqZWN0IG9mIHRoZSBtb2RlbC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhpcyBmYWN0b3J5IGlzIGFwcGxpY2FibGUgZm9yIHRoZSB0eXBlIG9mIHRoZSBvYmplY3QuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRmFjdG9yeUZvclR5cGUoT2JqZWN0IG9iamVjdCkgewotCQlpZiAob2JqZWN0ID09IG1vZGVsUGFja2FnZSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIEVPYmplY3QpIHsKLQkJCXJldHVybiAoKEVPYmplY3Qpb2JqZWN0KS5lQ2xhc3MoKS5nZXRFUGFja2FnZSgpID09IG1vZGVsUGFja2FnZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogVGhlIHN3aXRjaCB0aGUgZGVsZWdhdGVzIHRvIHRoZSA8Y29kZT5jcmVhdGVYWFg8L2NvZGU+IG1ldGhvZHMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE1zcHJvamVjdFN3aXRjaCBtb2RlbFN3aXRjaCA9Ci0JCW5ldyBNc3Byb2plY3RTd2l0Y2goKSB7Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VBc3NpZ25tZW50KEFzc2lnbm1lbnQgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUFzc2lnbm1lbnRBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VBc3NpZ25tZW50cyhBc3NpZ25tZW50cyBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlQXNzaWdubWVudHNBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VBdmFpbGFiaWxpdHlQZXJpb2QoQXZhaWxhYmlsaXR5UGVyaW9kIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVBdmFpbGFiaWxpdHlQZXJpb2RBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VBdmFpbGFiaWxpdHlQZXJpb2RzKEF2YWlsYWJpbGl0eVBlcmlvZHMgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUF2YWlsYWJpbGl0eVBlcmlvZHNBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VCYXNlbGluZShCYXNlbGluZSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlQmFzZWxpbmVBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VCYXNlbGluZTIoQmFzZWxpbmUyIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVCYXNlbGluZTJBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VCYXNlbGluZTMoQmFzZWxpbmUzIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVCYXNlbGluZTNBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VDYWxlbmRhcihDYWxlbmRhciBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlQ2FsZW5kYXJBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VDYWxlbmRhcnMoQ2FsZW5kYXJzIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVDYWxlbmRhcnNBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VEb2N1bWVudFJvb3QoRG9jdW1lbnRSb290IG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVEb2N1bWVudFJvb3RBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VFeHRlbmRlZEF0dHJpYnV0ZShFeHRlbmRlZEF0dHJpYnV0ZSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlRXh0ZW5kZWRBdHRyaWJ1dGVBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VFeHRlbmRlZEF0dHJpYnV0ZTIoRXh0ZW5kZWRBdHRyaWJ1dGUyIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVFeHRlbmRlZEF0dHJpYnV0ZTJBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VFeHRlbmRlZEF0dHJpYnV0ZTMoRXh0ZW5kZWRBdHRyaWJ1dGUzIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVFeHRlbmRlZEF0dHJpYnV0ZTNBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VFeHRlbmRlZEF0dHJpYnV0ZTQoRXh0ZW5kZWRBdHRyaWJ1dGU0IG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVFeHRlbmRlZEF0dHJpYnV0ZTRBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VFeHRlbmRlZEF0dHJpYnV0ZXMoRXh0ZW5kZWRBdHRyaWJ1dGVzIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVFeHRlbmRlZEF0dHJpYnV0ZXNBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VNYXNrKE1hc2sgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZU1hc2tBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VNYXNrcyhNYXNrcyBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlTWFza3NBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VPdXRsaW5lQ29kZShPdXRsaW5lQ29kZSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlT3V0bGluZUNvZGVBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VPdXRsaW5lQ29kZTIoT3V0bGluZUNvZGUyIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVPdXRsaW5lQ29kZTJBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VPdXRsaW5lQ29kZTMoT3V0bGluZUNvZGUzIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVPdXRsaW5lQ29kZTNBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VPdXRsaW5lQ29kZXMoT3V0bGluZUNvZGVzIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVPdXRsaW5lQ29kZXNBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VQcmVkZWNlc3NvckxpbmsoUHJlZGVjZXNzb3JMaW5rIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVQcmVkZWNlc3NvckxpbmtBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VQcm9qZWN0KFByb2plY3Qgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVByb2plY3RBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VSYXRlKFJhdGUgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVJhdGVBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VSYXRlcyhSYXRlcyBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlUmF0ZXNBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VSZXNvdXJjZShSZXNvdXJjZSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlUmVzb3VyY2VBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VSZXNvdXJjZXMoUmVzb3VyY2VzIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVSZXNvdXJjZXNBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VUYXNrKFRhc2sgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVRhc2tBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VUYXNrcyhUYXNrcyBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlVGFza3NBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VUaW1lUGVyaW9kKFRpbWVQZXJpb2Qgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVRpbWVQZXJpb2RBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VUaW1lcGhhc2VkRGF0YVR5cGUoVGltZXBoYXNlZERhdGFUeXBlIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVUaW1lcGhhc2VkRGF0YVR5cGVBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VWYWx1ZShWYWx1ZSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlVmFsdWVBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VWYWx1ZTIoVmFsdWUyIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVWYWx1ZTJBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VWYWx1ZUxpc3QoVmFsdWVMaXN0IG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVWYWx1ZUxpc3RBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VWYWx1ZXMoVmFsdWVzIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVWYWx1ZXNBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VXQlNNYXNrKFdCU01hc2sgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVdCU01hc2tBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VXQlNNYXNrcyhXQlNNYXNrcyBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlV0JTTWFza3NBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VXZWVrRGF5KFdlZWtEYXkgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVdlZWtEYXlBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VXZWVrRGF5cyhXZWVrRGF5cyBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlV2Vla0RheXNBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VXb3JraW5nVGltZShXb3JraW5nVGltZSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlV29ya2luZ1RpbWVBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VXb3JraW5nVGltZXMoV29ya2luZ1RpbWVzIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVXb3JraW5nVGltZXNBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGRlZmF1bHRDYXNlKEVPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUVPYmplY3RBZGFwdGVyKCk7Ci0JCQl9Ci0JCX07Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIHRoZSA8Y29kZT50YXJnZXQ8L2NvZGU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHRhcmdldCB0aGUgb2JqZWN0IHRvIGFkYXB0LgotCSAqIEByZXR1cm4gdGhlIGFkYXB0ZXIgZm9yIHRoZSA8Y29kZT50YXJnZXQ8L2NvZGU+LgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVBZGFwdGVyKE5vdGlmaWVyIHRhcmdldCkgewotCQlyZXR1cm4gKEFkYXB0ZXIpbW9kZWxTd2l0Y2guZG9Td2l0Y2goKEVPYmplY3QpdGFyZ2V0KTsKLQl9Ci0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50IDxlbT5Bc3NpZ25tZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVBc3NpZ25tZW50QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnRzIDxlbT5Bc3NpZ25tZW50czwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnRzCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUFzc2lnbm1lbnRzQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkF2YWlsYWJpbGl0eVBlcmlvZCA8ZW0+QXZhaWxhYmlsaXR5IFBlcmlvZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkF2YWlsYWJpbGl0eVBlcmlvZAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVBdmFpbGFiaWxpdHlQZXJpb2RBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXZhaWxhYmlsaXR5UGVyaW9kcyA8ZW0+QXZhaWxhYmlsaXR5IFBlcmlvZHM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5BdmFpbGFiaWxpdHlQZXJpb2RzCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUF2YWlsYWJpbGl0eVBlcmlvZHNBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUgPGVtPkJhc2VsaW5lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQmFzZWxpbmVBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUyIDxlbT5CYXNlbGluZTI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZTIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQmFzZWxpbmUyQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lMyA8ZW0+QmFzZWxpbmUzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUzCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUJhc2VsaW5lM0FkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5DYWxlbmRhciA8ZW0+Q2FsZW5kYXI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5DYWxlbmRhcgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVDYWxlbmRhckFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5DYWxlbmRhcnMgPGVtPkNhbGVuZGFyczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkNhbGVuZGFycwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVDYWxlbmRhcnNBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRG9jdW1lbnRSb290IDxlbT5Eb2N1bWVudCBSb290PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRG9jdW1lbnRSb290Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZURvY3VtZW50Um9vdEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZSA8ZW0+RXh0ZW5kZWQgQXR0cmlidXRlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRXh0ZW5kZWRBdHRyaWJ1dGVBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUyIDxlbT5FeHRlbmRlZCBBdHRyaWJ1dGUyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUyCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUV4dGVuZGVkQXR0cmlidXRlMkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZTMgPGVtPkV4dGVuZGVkIEF0dHJpYnV0ZTM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZTMKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRXh0ZW5kZWRBdHRyaWJ1dGUzQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlNCA8ZW0+RXh0ZW5kZWQgQXR0cmlidXRlNDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlNAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVFeHRlbmRlZEF0dHJpYnV0ZTRBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGVzIDxlbT5FeHRlbmRlZCBBdHRyaWJ1dGVzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGVzCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUV4dGVuZGVkQXR0cmlidXRlc0FkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5NYXNrIDxlbT5NYXNrPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTWFzawotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVNYXNrQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1hc2tzIDxlbT5NYXNrczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1hc2tzCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZU1hc2tzQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlIDxlbT5PdXRsaW5lIENvZGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVPdXRsaW5lQ29kZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZTIgPGVtPk91dGxpbmUgQ29kZTI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZTIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlT3V0bGluZUNvZGUyQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlMyA8ZW0+T3V0bGluZSBDb2RlMzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlMwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVPdXRsaW5lQ29kZTNBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGVzIDxlbT5PdXRsaW5lIENvZGVzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGVzCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZU91dGxpbmVDb2Rlc0FkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5QcmVkZWNlc3NvckxpbmsgPGVtPlByZWRlY2Vzc29yIExpbms8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5QcmVkZWNlc3NvckxpbmsKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUHJlZGVjZXNzb3JMaW5rQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QgPGVtPlByb2plY3Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVByb2plY3RBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmF0ZSA8ZW0+UmF0ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJhdGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUmF0ZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SYXRlcyA8ZW0+UmF0ZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SYXRlcwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVSYXRlc0FkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSA8ZW0+UmVzb3VyY2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVSZXNvdXJjZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZXMgPGVtPlJlc291cmNlczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlcwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVSZXNvdXJjZXNBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayA8ZW0+VGFzazwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlVGFza0FkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrcyA8ZW0+VGFza3M8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrcwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVUYXNrc0FkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UaW1lUGVyaW9kIDxlbT5UaW1lIFBlcmlvZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRpbWVQZXJpb2QKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlVGltZVBlcmlvZEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UaW1lcGhhc2VkRGF0YVR5cGUgPGVtPlRpbWVwaGFzZWQgRGF0YSBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGltZXBoYXNlZERhdGFUeXBlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVRpbWVwaGFzZWREYXRhVHlwZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5WYWx1ZSA8ZW0+VmFsdWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5WYWx1ZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVWYWx1ZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5WYWx1ZTIgPGVtPlZhbHVlMjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlZhbHVlMgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVWYWx1ZTJBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVmFsdWVMaXN0IDxlbT5WYWx1ZSBMaXN0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVmFsdWVMaXN0Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVZhbHVlTGlzdEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5WYWx1ZXMgPGVtPlZhbHVlczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlZhbHVlcwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVWYWx1ZXNBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV0JTTWFzayA8ZW0+V0JTIE1hc2s8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5XQlNNYXNrCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVdCU01hc2tBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV0JTTWFza3MgPGVtPldCUyBNYXNrczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldCU01hc2tzCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVdCU01hc2tzQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldlZWtEYXkgPGVtPldlZWsgRGF5PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV2Vla0RheQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVXZWVrRGF5QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldlZWtEYXlzIDxlbT5XZWVrIERheXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5XZWVrRGF5cwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVXZWVrRGF5c0FkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Xb3JraW5nVGltZSA8ZW0+V29ya2luZyBUaW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV29ya2luZ1RpbWUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlV29ya2luZ1RpbWVBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV29ya2luZ1RpbWVzIDxlbT5Xb3JraW5nIFRpbWVzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV29ya2luZ1RpbWVzCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVdvcmtpbmdUaW1lc0FkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgdGhlIGRlZmF1bHQgY2FzZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUVPYmplY3RBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0gLy9Nc3Byb2plY3RBZGFwdGVyRmFjdG9yeQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC91dGlsL01zcHJvamVjdFJlc291cmNlRmFjdG9yeUltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvdXRpbC9Nc3Byb2plY3RSZXNvdXJjZUZhY3RvcnlJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhOTdiOTcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC91dGlsL01zcHJvamVjdFJlc291cmNlRmFjdG9yeUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogTXNwcm9qZWN0UmVzb3VyY2VGYWN0b3J5SW1wbC5qYXZhLHYgMS4xIDIwMDgvMDEvMTUgMDg6NTI6NDEganRoYW0gRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuaW1wbC5SZXNvdXJjZUZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuWE1MUmVzb3VyY2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIFRoZSA8Yj5SZXNvdXJjZSBGYWN0b3J5PC9iPiBhc3NvY2lhdGVkIHdpdGggdGhlIHBhY2thZ2UuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC51dGlsLk1zcHJvamVjdFJlc291cmNlSW1wbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgTXNwcm9qZWN0UmVzb3VyY2VGYWN0b3J5SW1wbCBleHRlbmRzIFJlc291cmNlRmFjdG9yeUltcGwgewotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIHJlc291cmNlIGZhY3RvcnkuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE1zcHJvamVjdFJlc291cmNlRmFjdG9yeUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgcmVzb3VyY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJlc291cmNlIGNyZWF0ZVJlc291cmNlKFVSSSB1cmkpIHsKLQkJWE1MUmVzb3VyY2UgcmVzdWx0ID0gbmV3IE1zcHJvamVjdFJlc291cmNlSW1wbCh1cmkpOwotCQlyZXN1bHQuZ2V0RGVmYXVsdFNhdmVPcHRpb25zKCkucHV0KFhNTFJlc291cmNlLk9QVElPTl9FWFRFTkRFRF9NRVRBX0RBVEEsIEJvb2xlYW4uVFJVRSk7Ci0JCXJlc3VsdC5nZXREZWZhdWx0TG9hZE9wdGlvbnMoKS5wdXQoWE1MUmVzb3VyY2UuT1BUSU9OX0VYVEVOREVEX01FVEFfREFUQSwgQm9vbGVhbi5UUlVFKTsKLQotCQlyZXN1bHQuZ2V0RGVmYXVsdFNhdmVPcHRpb25zKCkucHV0KFhNTFJlc291cmNlLk9QVElPTl9TQ0hFTUFfTE9DQVRJT04sIEJvb2xlYW4uVFJVRSk7Ci0JCXJlc3VsdC5nZXREZWZhdWx0U2F2ZU9wdGlvbnMoKS5wdXQoWE1MUmVzb3VyY2UuT1BUSU9OX1VTRV9FTkNPREVEX0FUVFJJQlVURV9TVFlMRSwgQm9vbGVhbi5UUlVFKTsKLQotCQlyZXN1bHQuZ2V0RGVmYXVsdExvYWRPcHRpb25zKCkucHV0KFhNTFJlc291cmNlLk9QVElPTl9VU0VfTEVYSUNBTF9IQU5ETEVSLCBCb29sZWFuLlRSVUUpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotfSAvL01zcHJvamVjdFJlc291cmNlRmFjdG9yeUltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvdXRpbC9Nc3Byb2plY3RSZXNvdXJjZUltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvdXRpbC9Nc3Byb2plY3RSZXNvdXJjZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWY3ZTEwNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L3V0aWwvTXNwcm9qZWN0UmVzb3VyY2VJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IE1zcHJvamVjdFJlc291cmNlSW1wbC5qYXZhLHYgMS4xIDIwMDgvMDEvMTUgMDg6NTI6NDEganRoYW0gRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuWE1MSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuaW1wbC5YTUxSZXNvdXJjZUltcGw7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIFRoZSA8Yj5SZXNvdXJjZSA8L2I+IGFzc29jaWF0ZWQgd2l0aCB0aGUgcGFja2FnZS4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LnV0aWwuTXNwcm9qZWN0UmVzb3VyY2VGYWN0b3J5SW1wbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgTXNwcm9qZWN0UmVzb3VyY2VJbXBsIGV4dGVuZHMgWE1MUmVzb3VyY2VJbXBsIHsKLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSByZXNvdXJjZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB1cmkgdGhlIFVSSSBvZiB0aGUgbmV3IHJlc291cmNlLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTXNwcm9qZWN0UmVzb3VyY2VJbXBsKFVSSSB1cmkpIHsKLQkJc3VwZXIodXJpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgWE1MSGVscGVyIGNyZWF0ZVhNTEhlbHBlcigpewotCSAgICByZXR1cm4gbmV3IE1zcHJvamVjdFhNTEhlbHBlckltcGwodGhpcyk7Ci0JfQotfSAvL01zcHJvamVjdFJlc291cmNlSW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC91dGlsL01zcHJvamVjdFN3aXRjaC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC91dGlsL01zcHJvamVjdFN3aXRjaC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OGE5MGI4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvdXRpbC9Nc3Byb2plY3RTd2l0Y2guamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMTAgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBNc3Byb2plY3RTd2l0Y2guamF2YSx2IDEuMSAyMDA4LzAxLzE1IDA4OjUyOjQxIGp0aGFtIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXZhaWxhYmlsaXR5UGVyaW9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXZhaWxhYmlsaXR5UGVyaW9kczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQ2FsZW5kYXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5DYWxlbmRhcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Eb2N1bWVudFJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlMjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlMzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlNDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1hc2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5NYXNrczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlMjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlMzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByZWRlY2Vzc29yTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmF0ZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRpbWVQZXJpb2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UaW1lcGhhc2VkRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5WYWx1ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlZhbHVlMjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlZhbHVlTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlZhbHVlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldCU01hc2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5XQlNNYXNrczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldlZWtEYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5XZWVrRGF5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldvcmtpbmdUaW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV29ya2luZ1RpbWVzOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBUaGUgPGI+U3dpdGNoPC9iPiBmb3IgdGhlIG1vZGVsJ3MgaW5oZXJpdGFuY2UgaGllcmFyY2h5LgotICogSXQgc3VwcG9ydHMgdGhlIGNhbGwge0BsaW5rICNkb1N3aXRjaChFT2JqZWN0KSBkb1N3aXRjaChvYmplY3QpfQotICogdG8gaW52b2tlIHRoZSA8Y29kZT5jYXNlWFhYPC9jb2RlPiBtZXRob2QgZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsLAotICogc3RhcnRpbmcgd2l0aCB0aGUgYWN0dWFsIGNsYXNzIG9mIHRoZSBvYmplY3QKLSAqIGFuZCBwcm9jZWVkaW5nIHVwIHRoZSBpbmhlcml0YW5jZSBoaWVyYXJjaHkKLSAqIHVudGlsIGEgbm9uLW51bGwgcmVzdWx0IGlzIHJldHVybmVkLAotICogd2hpY2ggaXMgdGhlIHJlc3VsdCBvZiB0aGUgc3dpdGNoLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZQotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgTXNwcm9qZWN0U3dpdGNoIHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIG1vZGVsIHBhY2thZ2UKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIE1zcHJvamVjdFBhY2thZ2UgbW9kZWxQYWNrYWdlOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgc3dpdGNoLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBNc3Byb2plY3RTd2l0Y2goKSB7Ci0JCWlmIChtb2RlbFBhY2thZ2UgPT0gbnVsbCkgewotCQkJbW9kZWxQYWNrYWdlID0gTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0U7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDYWxscyA8Y29kZT5jYXNlWFhYPC9jb2RlPiBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwgdW50aWwgb25lIHJldHVybnMgYSBub24gbnVsbCByZXN1bHQ7IGl0IHlpZWxkcyB0aGF0IHJlc3VsdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIGZpcnN0IG5vbi1udWxsIHJlc3VsdCByZXR1cm5lZCBieSBhIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGNhbGwuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZG9Td2l0Y2goRU9iamVjdCB0aGVFT2JqZWN0KSB7Ci0JCXJldHVybiBkb1N3aXRjaCh0aGVFT2JqZWN0LmVDbGFzcygpLCB0aGVFT2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBDYWxscyA8Y29kZT5jYXNlWFhYPC9jb2RlPiBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwgdW50aWwgb25lIHJldHVybnMgYSBub24gbnVsbCByZXN1bHQ7IGl0IHlpZWxkcyB0aGF0IHJlc3VsdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIGZpcnN0IG5vbi1udWxsIHJlc3VsdCByZXR1cm5lZCBieSBhIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGNhbGwuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZG9Td2l0Y2goRUNsYXNzIHRoZUVDbGFzcywgRU9iamVjdCB0aGVFT2JqZWN0KSB7Ci0JCWlmICh0aGVFQ2xhc3MuZUNvbnRhaW5lcigpID09IG1vZGVsUGFja2FnZSkgewotCQkJcmV0dXJuIGRvU3dpdGNoKHRoZUVDbGFzcy5nZXRDbGFzc2lmaWVySUQoKSwgdGhlRU9iamVjdCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlMaXN0IGVTdXBlclR5cGVzID0gdGhlRUNsYXNzLmdldEVTdXBlclR5cGVzKCk7Ci0JCQlyZXR1cm4KLQkJCQllU3VwZXJUeXBlcy5pc0VtcHR5KCkgPwotCQkJCQlkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KSA6Ci0JCQkJCWRvU3dpdGNoKChFQ2xhc3MpZVN1cGVyVHlwZXMuZ2V0KDApLCB0aGVFT2JqZWN0KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENhbGxzIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbCB1bnRpbCBvbmUgcmV0dXJucyBhIG5vbiBudWxsIHJlc3VsdDsgaXQgeWllbGRzIHRoYXQgcmVzdWx0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgZmlyc3Qgbm9uLW51bGwgcmVzdWx0IHJldHVybmVkIGJ5IGEgPGNvZGU+Y2FzZVhYWDwvY29kZT4gY2FsbC4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBkb1N3aXRjaChpbnQgY2xhc3NpZmllcklELCBFT2JqZWN0IHRoZUVPYmplY3QpIHsKLQkJc3dpdGNoIChjbGFzc2lmaWVySUQpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UOiB7Ci0JCQkJQXNzaWdubWVudCBhc3NpZ25tZW50ID0gKEFzc2lnbm1lbnQpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZUFzc2lnbm1lbnQoYXNzaWdubWVudCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRTOiB7Ci0JCQkJQXNzaWdubWVudHMgYXNzaWdubWVudHMgPSAoQXNzaWdubWVudHMpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZUFzc2lnbm1lbnRzKGFzc2lnbm1lbnRzKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVZBSUxBQklMSVRZX1BFUklPRDogewotCQkJCUF2YWlsYWJpbGl0eVBlcmlvZCBhdmFpbGFiaWxpdHlQZXJpb2QgPSAoQXZhaWxhYmlsaXR5UGVyaW9kKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VBdmFpbGFiaWxpdHlQZXJpb2QoYXZhaWxhYmlsaXR5UGVyaW9kKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVZBSUxBQklMSVRZX1BFUklPRFM6IHsKLQkJCQlBdmFpbGFiaWxpdHlQZXJpb2RzIGF2YWlsYWJpbGl0eVBlcmlvZHMgPSAoQXZhaWxhYmlsaXR5UGVyaW9kcyl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlQXZhaWxhYmlsaXR5UGVyaW9kcyhhdmFpbGFiaWxpdHlQZXJpb2RzKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkU6IHsKLQkJCQlCYXNlbGluZSBiYXNlbGluZSA9IChCYXNlbGluZSl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlQmFzZWxpbmUoYmFzZWxpbmUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORTI6IHsKLQkJCQlCYXNlbGluZTIgYmFzZWxpbmUyID0gKEJhc2VsaW5lMil0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlQmFzZWxpbmUyKGJhc2VsaW5lMik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FMzogewotCQkJCUJhc2VsaW5lMyBiYXNlbGluZTMgPSAoQmFzZWxpbmUzKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VCYXNlbGluZTMoYmFzZWxpbmUzKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQ0FMRU5EQVI6IHsKLQkJCQlDYWxlbmRhciBjYWxlbmRhciA9IChDYWxlbmRhcil0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlQ2FsZW5kYXIoY2FsZW5kYXIpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5DQUxFTkRBUlM6IHsKLQkJCQlDYWxlbmRhcnMgY2FsZW5kYXJzID0gKENhbGVuZGFycyl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlQ2FsZW5kYXJzKGNhbGVuZGFycyk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkRPQ1VNRU5UX1JPT1Q6IHsKLQkJCQlEb2N1bWVudFJvb3QgZG9jdW1lbnRSb290ID0gKERvY3VtZW50Um9vdCl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlRG9jdW1lbnRSb290KGRvY3VtZW50Um9vdCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURTogewotCQkJCUV4dGVuZGVkQXR0cmlidXRlIGV4dGVuZGVkQXR0cmlidXRlID0gKEV4dGVuZGVkQXR0cmlidXRlKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VFeHRlbmRlZEF0dHJpYnV0ZShleHRlbmRlZEF0dHJpYnV0ZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURTI6IHsKLQkJCQlFeHRlbmRlZEF0dHJpYnV0ZTIgZXh0ZW5kZWRBdHRyaWJ1dGUyID0gKEV4dGVuZGVkQXR0cmlidXRlMil0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlRXh0ZW5kZWRBdHRyaWJ1dGUyKGV4dGVuZGVkQXR0cmlidXRlMik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURTM6IHsKLQkJCQlFeHRlbmRlZEF0dHJpYnV0ZTMgZXh0ZW5kZWRBdHRyaWJ1dGUzID0gKEV4dGVuZGVkQXR0cmlidXRlMyl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlRXh0ZW5kZWRBdHRyaWJ1dGUzKGV4dGVuZGVkQXR0cmlidXRlMyk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURTQ6IHsKLQkJCQlFeHRlbmRlZEF0dHJpYnV0ZTQgZXh0ZW5kZWRBdHRyaWJ1dGU0ID0gKEV4dGVuZGVkQXR0cmlidXRlNCl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlRXh0ZW5kZWRBdHRyaWJ1dGU0KGV4dGVuZGVkQXR0cmlidXRlNCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURVM6IHsKLQkJCQlFeHRlbmRlZEF0dHJpYnV0ZXMgZXh0ZW5kZWRBdHRyaWJ1dGVzID0gKEV4dGVuZGVkQXR0cmlidXRlcyl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlRXh0ZW5kZWRBdHRyaWJ1dGVzKGV4dGVuZGVkQXR0cmlidXRlcyk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk1BU0s6IHsKLQkJCQlNYXNrIG1hc2sgPSAoTWFzayl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlTWFzayhtYXNrKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuTUFTS1M6IHsKLQkJCQlNYXNrcyBtYXNrcyA9IChNYXNrcyl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlTWFza3MobWFza3MpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREU6IHsKLQkJCQlPdXRsaW5lQ29kZSBvdXRsaW5lQ29kZSA9IChPdXRsaW5lQ29kZSl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlT3V0bGluZUNvZGUob3V0bGluZUNvZGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREUyOiB7Ci0JCQkJT3V0bGluZUNvZGUyIG91dGxpbmVDb2RlMiA9IChPdXRsaW5lQ29kZTIpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZU91dGxpbmVDb2RlMihvdXRsaW5lQ29kZTIpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREUzOiB7Ci0JCQkJT3V0bGluZUNvZGUzIG91dGxpbmVDb2RlMyA9IChPdXRsaW5lQ29kZTMpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZU91dGxpbmVDb2RlMyhvdXRsaW5lQ29kZTMpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREVTOiB7Ci0JCQkJT3V0bGluZUNvZGVzIG91dGxpbmVDb2RlcyA9IChPdXRsaW5lQ29kZXMpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZU91dGxpbmVDb2RlcyhvdXRsaW5lQ29kZXMpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUkVERUNFU1NPUl9MSU5LOiB7Ci0JCQkJUHJlZGVjZXNzb3JMaW5rIHByZWRlY2Vzc29yTGluayA9IChQcmVkZWNlc3NvckxpbmspdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZVByZWRlY2Vzc29yTGluayhwcmVkZWNlc3NvckxpbmspOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUOiB7Ci0JCQkJUHJvamVjdCBwcm9qZWN0ID0gKFByb2plY3QpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZVByb2plY3QocHJvamVjdCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJBVEU6IHsKLQkJCQlSYXRlIHJhdGUgPSAoUmF0ZSl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlUmF0ZShyYXRlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkFURVM6IHsKLQkJCQlSYXRlcyByYXRlcyA9IChSYXRlcyl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlUmF0ZXMocmF0ZXMpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRTogewotCQkJCVJlc291cmNlIHJlc291cmNlID0gKFJlc291cmNlKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VSZXNvdXJjZShyZXNvdXJjZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFUzogewotCQkJCVJlc291cmNlcyByZXNvdXJjZXMgPSAoUmVzb3VyY2VzKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VSZXNvdXJjZXMocmVzb3VyY2VzKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTSzogewotCQkJCVRhc2sgdGFzayA9IChUYXNrKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VUYXNrKHRhc2spOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLUzogewotCQkJCVRhc2tzIHRhc2tzID0gKFRhc2tzKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VUYXNrcyh0YXNrcyk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRJTUVfUEVSSU9EOiB7Ci0JCQkJVGltZVBlcmlvZCB0aW1lUGVyaW9kID0gKFRpbWVQZXJpb2QpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZVRpbWVQZXJpb2QodGltZVBlcmlvZCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRJTUVQSEFTRURfREFUQV9UWVBFOiB7Ci0JCQkJVGltZXBoYXNlZERhdGFUeXBlIHRpbWVwaGFzZWREYXRhVHlwZSA9IChUaW1lcGhhc2VkRGF0YVR5cGUpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZVRpbWVwaGFzZWREYXRhVHlwZSh0aW1lcGhhc2VkRGF0YVR5cGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5WQUxVRTogewotCQkJCVZhbHVlIHZhbHVlID0gKFZhbHVlKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VWYWx1ZSh2YWx1ZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlZBTFVFMjogewotCQkJCVZhbHVlMiB2YWx1ZTIgPSAoVmFsdWUyKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VWYWx1ZTIodmFsdWUyKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVkFMVUVfTElTVDogewotCQkJCVZhbHVlTGlzdCB2YWx1ZUxpc3QgPSAoVmFsdWVMaXN0KXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VWYWx1ZUxpc3QodmFsdWVMaXN0KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVkFMVUVTOiB7Ci0JCQkJVmFsdWVzIHZhbHVlcyA9IChWYWx1ZXMpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZVZhbHVlcyh2YWx1ZXMpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5XQlNfTUFTSzogewotCQkJCVdCU01hc2sgd2JzTWFzayA9IChXQlNNYXNrKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VXQlNNYXNrKHdic01hc2spOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5XQlNfTUFTS1M6IHsKLQkJCQlXQlNNYXNrcyB3YnNNYXNrcyA9IChXQlNNYXNrcyl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlV0JTTWFza3Mod2JzTWFza3MpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5XRUVLX0RBWTogewotCQkJCVdlZWtEYXkgd2Vla0RheSA9IChXZWVrRGF5KXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VXZWVrRGF5KHdlZWtEYXkpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5XRUVLX0RBWVM6IHsKLQkJCQlXZWVrRGF5cyB3ZWVrRGF5cyA9IChXZWVrRGF5cyl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlV2Vla0RheXMod2Vla0RheXMpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5XT1JLSU5HX1RJTUU6IHsKLQkJCQlXb3JraW5nVGltZSB3b3JraW5nVGltZSA9IChXb3JraW5nVGltZSl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlV29ya2luZ1RpbWUod29ya2luZ1RpbWUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5XT1JLSU5HX1RJTUVTOiB7Ci0JCQkJV29ya2luZ1RpbWVzIHdvcmtpbmdUaW1lcyA9IChXb3JraW5nVGltZXMpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZVdvcmtpbmdUaW1lcyh3b3JraW5nVGltZXMpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWRlZmF1bHQ6IHJldHVybiBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Bc3NpZ25tZW50PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkFzc2lnbm1lbnQ8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUFzc2lnbm1lbnQoQXNzaWdubWVudCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkFzc2lnbm1lbnRzPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkFzc2lnbm1lbnRzPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VBc3NpZ25tZW50cyhBc3NpZ25tZW50cyBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkF2YWlsYWJpbGl0eSBQZXJpb2Q8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+QXZhaWxhYmlsaXR5IFBlcmlvZDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlQXZhaWxhYmlsaXR5UGVyaW9kKEF2YWlsYWJpbGl0eVBlcmlvZCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkF2YWlsYWJpbGl0eSBQZXJpb2RzPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkF2YWlsYWJpbGl0eSBQZXJpb2RzPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VBdmFpbGFiaWxpdHlQZXJpb2RzKEF2YWlsYWJpbGl0eVBlcmlvZHMgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5CYXNlbGluZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5CYXNlbGluZTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlQmFzZWxpbmUoQmFzZWxpbmUgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5CYXNlbGluZTI8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+QmFzZWxpbmUyPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VCYXNlbGluZTIoQmFzZWxpbmUyIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+QmFzZWxpbmUzPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkJhc2VsaW5lMzwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlQmFzZWxpbmUzKEJhc2VsaW5lMyBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkNhbGVuZGFyPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkNhbGVuZGFyPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VDYWxlbmRhcihDYWxlbmRhciBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkNhbGVuZGFyczwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5DYWxlbmRhcnM8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUNhbGVuZGFycyhDYWxlbmRhcnMgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Eb2N1bWVudCBSb290PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkRvY3VtZW50IFJvb3Q8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZURvY3VtZW50Um9vdChEb2N1bWVudFJvb3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FeHRlbmRlZCBBdHRyaWJ1dGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RXh0ZW5kZWQgQXR0cmlidXRlPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VFeHRlbmRlZEF0dHJpYnV0ZShFeHRlbmRlZEF0dHJpYnV0ZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkV4dGVuZGVkIEF0dHJpYnV0ZTI8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RXh0ZW5kZWQgQXR0cmlidXRlMjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlRXh0ZW5kZWRBdHRyaWJ1dGUyKEV4dGVuZGVkQXR0cmlidXRlMiBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkV4dGVuZGVkIEF0dHJpYnV0ZTM8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RXh0ZW5kZWQgQXR0cmlidXRlMzwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlRXh0ZW5kZWRBdHRyaWJ1dGUzKEV4dGVuZGVkQXR0cmlidXRlMyBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkV4dGVuZGVkIEF0dHJpYnV0ZTQ8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RXh0ZW5kZWQgQXR0cmlidXRlNDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlRXh0ZW5kZWRBdHRyaWJ1dGU0KEV4dGVuZGVkQXR0cmlidXRlNCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkV4dGVuZGVkIEF0dHJpYnV0ZXM8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RXh0ZW5kZWQgQXR0cmlidXRlczwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlRXh0ZW5kZWRBdHRyaWJ1dGVzKEV4dGVuZGVkQXR0cmlidXRlcyBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk1hc2s8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TWFzazwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlTWFzayhNYXNrIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TWFza3M8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TWFza3M8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZU1hc2tzKE1hc2tzIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+T3V0bGluZSBDb2RlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk91dGxpbmUgQ29kZTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlT3V0bGluZUNvZGUoT3V0bGluZUNvZGUgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5PdXRsaW5lIENvZGUyPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk91dGxpbmUgQ29kZTI8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZU91dGxpbmVDb2RlMihPdXRsaW5lQ29kZTIgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5PdXRsaW5lIENvZGUzPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk91dGxpbmUgQ29kZTM8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZU91dGxpbmVDb2RlMyhPdXRsaW5lQ29kZTMgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5PdXRsaW5lIENvZGVzPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk91dGxpbmUgQ29kZXM8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZU91dGxpbmVDb2RlcyhPdXRsaW5lQ29kZXMgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5QcmVkZWNlc3NvciBMaW5rPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlByZWRlY2Vzc29yIExpbms8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZVByZWRlY2Vzc29yTGluayhQcmVkZWNlc3Nvckxpbmsgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Qcm9qZWN0PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlByb2plY3Q8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZVByb2plY3QoUHJvamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlJhdGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UmF0ZTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlUmF0ZShSYXRlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UmF0ZXM8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UmF0ZXM8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZVJhdGVzKFJhdGVzIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UmVzb3VyY2U8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UmVzb3VyY2U8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZVJlc291cmNlKFJlc291cmNlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UmVzb3VyY2VzPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlJlc291cmNlczwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlUmVzb3VyY2VzKFJlc291cmNlcyBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlRhc2s8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+VGFzazwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlVGFzayhUYXNrIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+VGFza3M8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+VGFza3M8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZVRhc2tzKFRhc2tzIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+VGltZSBQZXJpb2Q8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+VGltZSBQZXJpb2Q8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZVRpbWVQZXJpb2QoVGltZVBlcmlvZCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlRpbWVwaGFzZWQgRGF0YSBUeXBlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlRpbWVwaGFzZWQgRGF0YSBUeXBlPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VUaW1lcGhhc2VkRGF0YVR5cGUoVGltZXBoYXNlZERhdGFUeXBlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+VmFsdWU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+VmFsdWU8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZVZhbHVlKFZhbHVlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+VmFsdWUyPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlZhbHVlMjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlVmFsdWUyKFZhbHVlMiBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlZhbHVlIExpc3Q8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+VmFsdWUgTGlzdDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlVmFsdWVMaXN0KFZhbHVlTGlzdCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlZhbHVlczwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5WYWx1ZXM8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZVZhbHVlcyhWYWx1ZXMgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5XQlMgTWFzazwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5XQlMgTWFzazwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlV0JTTWFzayhXQlNNYXNrIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+V0JTIE1hc2tzPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPldCUyBNYXNrczwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlV0JTTWFza3MoV0JTTWFza3Mgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5XZWVrIERheTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5XZWVrIERheTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlV2Vla0RheShXZWVrRGF5IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+V2VlayBEYXlzPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPldlZWsgRGF5czwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlV2Vla0RheXMoV2Vla0RheXMgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Xb3JraW5nIFRpbWU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+V29ya2luZyBUaW1lPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VXb3JraW5nVGltZShXb3JraW5nVGltZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPldvcmtpbmcgVGltZXM8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+V29ya2luZyBUaW1lczwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlV29ya2luZ1RpbWVzKFdvcmtpbmdUaW1lcyBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVPYmplY3Q8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaCwgYnV0IHRoaXMgaXMgdGhlIGxhc3QgY2FzZSBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVPYmplY3Q8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZGVmYXVsdENhc2UoRU9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19IC8vTXNwcm9qZWN0U3dpdGNoCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L3V0aWwvTXNwcm9qZWN0VmFsaWRhdG9yLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L3V0aWwvTXNwcm9qZWN0VmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2NGMwOGIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC91dGlsL01zcHJvamVjdFZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzU4MyArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IE1zcHJvamVjdFZhbGlkYXRvci5qYXZhLHYgMS4xIDIwMDgvMDEvMTUgMDg6NTI6NDEganRoYW0gRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LnV0aWw7Ci0KLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkRpYWdub3N0aWNDaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdFZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUudXRpbC5YTUxUeXBlVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXZhaWxhYmlsaXR5UGVyaW9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXZhaWxhYmlsaXR5UGVyaW9kczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQ2FsZW5kYXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5DYWxlbmRhcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Eb2N1bWVudFJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlMjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlMzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlNDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1hc2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5NYXNrczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlMjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlMzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByZWRlY2Vzc29yTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmF0ZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRpbWVQZXJpb2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UaW1lcGhhc2VkRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5WYWx1ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlZhbHVlMjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlZhbHVlTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlZhbHVlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldCU01hc2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5XQlNNYXNrczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldlZWtEYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5XZWVrRGF5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldvcmtpbmdUaW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV29ya2luZ1RpbWVzOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBUaGUgPGI+VmFsaWRhdG9yPC9iPiBmb3IgdGhlIG1vZGVsLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZQotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgTXNwcm9qZWN0VmFsaWRhdG9yIGV4dGVuZHMgRU9iamVjdFZhbGlkYXRvciB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCBtb2RlbCBwYWNrYWdlCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBNc3Byb2plY3RWYWxpZGF0b3IgSU5TVEFOQ0UgPSBuZXcgTXNwcm9qZWN0VmFsaWRhdG9yKCk7Ci0KLQkvKioKLQkgKiBBIGNvbnN0YW50IGZvciB0aGUge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5EaWFnbm9zdGljI2dldFNvdXJjZSgpIHNvdXJjZX0gb2YgZGlhZ25vc3RpYyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkRpYWdub3N0aWMjZ2V0Q29kZSgpIGNvZGVzfSBmcm9tIHRoaXMgcGFja2FnZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkRpYWdub3N0aWMjZ2V0U291cmNlKCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5EaWFnbm9zdGljI2dldENvZGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBESUFHTk9TVElDX1NPVVJDRSA9ICJvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0IjsKLQotCS8qKgotCSAqIEEgY29uc3RhbnQgd2l0aCBhIGZpeGVkIG5hbWUgdGhhdCBjYW4gYmUgdXNlZCBhcyB0aGUgYmFzZSB2YWx1ZSBmb3IgYWRkaXRpb25hbCBoYW5kIHdyaXR0ZW4gY29uc3RhbnRzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBHRU5FUkFURURfRElBR05PU1RJQ19DT0RFX0NPVU5UID0gMDsKLQotCS8qKgotCSAqIEEgY29uc3RhbnQgd2l0aCBhIGZpeGVkIG5hbWUgdGhhdCBjYW4gYmUgdXNlZCBhcyB0aGUgYmFzZSB2YWx1ZSBmb3IgYWRkaXRpb25hbCBoYW5kIHdyaXR0ZW4gY29uc3RhbnRzIGluIGEgZGVyaXZlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBESUFHTk9TVElDX0NPREVfQ09VTlQgPSBHRU5FUkFURURfRElBR05PU1RJQ19DT0RFX0NPVU5UOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCBiYXNlIHBhY2thZ2UgdmFsaWRhdG9yLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBYTUxUeXBlVmFsaWRhdG9yIHhtbFR5cGVWYWxpZGF0b3I7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBzd2l0Y2guCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE1zcHJvamVjdFZhbGlkYXRvcigpIHsKLQkJc3VwZXIoKTsKLQkJeG1sVHlwZVZhbGlkYXRvciA9IFhNTFR5cGVWYWxpZGF0b3IuSU5TVEFOQ0U7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcGFja2FnZSBvZiB0aGlzIHZhbGlkYXRvciBzd2l0Y2guCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVQYWNrYWdlIGdldEVQYWNrYWdlKCkgewotCSAgcmV0dXJuIE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFOwotCX0KLQotCS8qKgotCSAqIENhbGxzIDxjb2RlPnZhbGlkYXRlWFhYPC9jb2RlPiBmb3IgdGhlIGNvcnJlc29uZGluZyBjbGFzc2lmaWVyIG9mIHRoZSBtb2RlbC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiB2YWxpZGF0ZShpbnQgY2xhc3NpZmllcklELCBPYmplY3QgdmFsdWUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJc3dpdGNoIChjbGFzc2lmaWVySUQpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UOgotCQkJCXJldHVybiB2YWxpZGF0ZUFzc2lnbm1lbnQoKEFzc2lnbm1lbnQpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UUzoKLQkJCQlyZXR1cm4gdmFsaWRhdGVBc3NpZ25tZW50cygoQXNzaWdubWVudHMpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BVkFJTEFCSUxJVFlfUEVSSU9EOgotCQkJCXJldHVybiB2YWxpZGF0ZUF2YWlsYWJpbGl0eVBlcmlvZCgoQXZhaWxhYmlsaXR5UGVyaW9kKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVZBSUxBQklMSVRZX1BFUklPRFM6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlQXZhaWxhYmlsaXR5UGVyaW9kcygoQXZhaWxhYmlsaXR5UGVyaW9kcyl2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FOgotCQkJCXJldHVybiB2YWxpZGF0ZUJhc2VsaW5lKChCYXNlbGluZSl2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FMjoKLQkJCQlyZXR1cm4gdmFsaWRhdGVCYXNlbGluZTIoKEJhc2VsaW5lMil2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FMzoKLQkJCQlyZXR1cm4gdmFsaWRhdGVCYXNlbGluZTMoKEJhc2VsaW5lMyl2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkNBTEVOREFSOgotCQkJCXJldHVybiB2YWxpZGF0ZUNhbGVuZGFyKChDYWxlbmRhcil2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkNBTEVOREFSUzoKLQkJCQlyZXR1cm4gdmFsaWRhdGVDYWxlbmRhcnMoKENhbGVuZGFycyl2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkRPQ1VNRU5UX1JPT1Q6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlRG9jdW1lbnRSb290KChEb2N1bWVudFJvb3QpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEU6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlRXh0ZW5kZWRBdHRyaWJ1dGUoKEV4dGVuZGVkQXR0cmlidXRlKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFMjoKLQkJCQlyZXR1cm4gdmFsaWRhdGVFeHRlbmRlZEF0dHJpYnV0ZTIoKEV4dGVuZGVkQXR0cmlidXRlMil2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURTM6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlRXh0ZW5kZWRBdHRyaWJ1dGUzKChFeHRlbmRlZEF0dHJpYnV0ZTMpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEU0OgotCQkJCXJldHVybiB2YWxpZGF0ZUV4dGVuZGVkQXR0cmlidXRlNCgoRXh0ZW5kZWRBdHRyaWJ1dGU0KXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFUzoKLQkJCQlyZXR1cm4gdmFsaWRhdGVFeHRlbmRlZEF0dHJpYnV0ZXMoKEV4dGVuZGVkQXR0cmlidXRlcyl2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk1BU0s6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlTWFzaygoTWFzayl2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk1BU0tTOgotCQkJCXJldHVybiB2YWxpZGF0ZU1hc2tzKChNYXNrcyl2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERToKLQkJCQlyZXR1cm4gdmFsaWRhdGVPdXRsaW5lQ29kZSgoT3V0bGluZUNvZGUpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREUyOgotCQkJCXJldHVybiB2YWxpZGF0ZU91dGxpbmVDb2RlMigoT3V0bGluZUNvZGUyKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuT1VUTElORV9DT0RFMzoKLQkJCQlyZXR1cm4gdmFsaWRhdGVPdXRsaW5lQ29kZTMoKE91dGxpbmVDb2RlMyl2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERVM6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlT3V0bGluZUNvZGVzKChPdXRsaW5lQ29kZXMpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUkVERUNFU1NPUl9MSU5LOgotCQkJCXJldHVybiB2YWxpZGF0ZVByZWRlY2Vzc29yTGluaygoUHJlZGVjZXNzb3JMaW5rKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVDoKLQkJCQlyZXR1cm4gdmFsaWRhdGVQcm9qZWN0KChQcm9qZWN0KXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkFURToKLQkJCQlyZXR1cm4gdmFsaWRhdGVSYXRlKChSYXRlKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkFURVM6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlUmF0ZXMoKFJhdGVzKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0U6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlUmVzb3VyY2UoKFJlc291cmNlKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VTOgotCQkJCXJldHVybiB2YWxpZGF0ZVJlc291cmNlcygoUmVzb3VyY2VzKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTSzoKLQkJCQlyZXR1cm4gdmFsaWRhdGVUYXNrKChUYXNrKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS1M6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlVGFza3MoKFRhc2tzKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVElNRV9QRVJJT0Q6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlVGltZVBlcmlvZCgoVGltZVBlcmlvZCl2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRJTUVQSEFTRURfREFUQV9UWVBFOgotCQkJCXJldHVybiB2YWxpZGF0ZVRpbWVwaGFzZWREYXRhVHlwZSgoVGltZXBoYXNlZERhdGFUeXBlKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVkFMVUU6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlVmFsdWUoKFZhbHVlKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVkFMVUUyOgotCQkJCXJldHVybiB2YWxpZGF0ZVZhbHVlMigoVmFsdWUyKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVkFMVUVfTElTVDoKLQkJCQlyZXR1cm4gdmFsaWRhdGVWYWx1ZUxpc3QoKFZhbHVlTGlzdCl2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlZBTFVFUzoKLQkJCQlyZXR1cm4gdmFsaWRhdGVWYWx1ZXMoKFZhbHVlcyl2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLldCU19NQVNLOgotCQkJCXJldHVybiB2YWxpZGF0ZVdCU01hc2soKFdCU01hc2spdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5XQlNfTUFTS1M6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlV0JTTWFza3MoKFdCU01hc2tzKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuV0VFS19EQVk6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlV2Vla0RheSgoV2Vla0RheSl2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLldFRUtfREFZUzoKLQkJCQlyZXR1cm4gdmFsaWRhdGVXZWVrRGF5cygoV2Vla0RheXMpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5XT1JLSU5HX1RJTUU6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlV29ya2luZ1RpbWUoKFdvcmtpbmdUaW1lKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuV09SS0lOR19USU1FUzoKLQkJCQlyZXR1cm4gdmFsaWRhdGVXb3JraW5nVGltZXMoKFdvcmtpbmdUaW1lcyl2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFDQ1JVRV9BVDoKLQkJCQlyZXR1cm4gdmFsaWRhdGVBY2NydWVBdCgoQmlnSW50ZWdlcil2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFDVElWRV9ESVJFQ1RPUllfR1VJRF9UWVBFOgotCQkJCXJldHVybiB2YWxpZGF0ZUFjdGl2ZURpcmVjdG9yeUdVSURUeXBlKChTdHJpbmcpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BTElBU19UWVBFOgotCQkJCXJldHVybiB2YWxpZGF0ZUFsaWFzVHlwZSgoU3RyaW5nKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVVUSE9SX1RZUEU6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlQXV0aG9yVHlwZSgoU3RyaW5nKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkVfRk9SX0VBUk5FRF9WQUxVRV9UWVBFOgotCQkJCXJldHVybiB2YWxpZGF0ZUJhc2VsaW5lRm9yRWFybmVkVmFsdWVUeXBlKChCaWdJbnRlZ2VyKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQk9PS0lOR19UWVBFX1RZUEU6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlQm9va2luZ1R5cGVUeXBlKChCaWdJbnRlZ2VyKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQk9PS0lOR19UWVBFX1RZUEUxOgotCQkJCXJldHVybiB2YWxpZGF0ZUJvb2tpbmdUeXBlVHlwZTEoKEJpZ0ludGVnZXIpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5DQUxDVUxBVElPTl9UWVBFX1RZUEU6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlQ2FsY3VsYXRpb25UeXBlVHlwZSgoQmlnSW50ZWdlcil2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkNBVEVHT1JZX1RZUEU6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlQ2F0ZWdvcnlUeXBlKChTdHJpbmcpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5DT0RFX1RZUEU6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlQ29kZVR5cGUoKFN0cmluZyl2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkNPTVBBTllfVFlQRToKLQkJCQlyZXR1cm4gdmFsaWRhdGVDb21wYW55VHlwZSgoU3RyaW5nKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQ09OU1RSQUlOVF9UWVBFX1RZUEU6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlQ29uc3RyYWludFR5cGVUeXBlKChCaWdJbnRlZ2VyKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQ09OVEFDVF9UWVBFOgotCQkJCXJldHVybiB2YWxpZGF0ZUNvbnRhY3RUeXBlKChTdHJpbmcpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5DT1NUX1JBVEVfVEFCTEVfVFlQRToKLQkJCQlyZXR1cm4gdmFsaWRhdGVDb3N0UmF0ZVRhYmxlVHlwZSgoQmlnSW50ZWdlcil2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkNVUlJFTkNZX1NZTUJPTF9QT1NJVElPTl9UWVBFOgotCQkJCXJldHVybiB2YWxpZGF0ZUN1cnJlbmN5U3ltYm9sUG9zaXRpb25UeXBlKChCaWdJbnRlZ2VyKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQ1VSUkVOQ1lfU1lNQk9MX1RZUEU6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlQ3VycmVuY3lTeW1ib2xUeXBlKChTdHJpbmcpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5EQVlfVFlQRV9UWVBFOgotCQkJCXJldHVybiB2YWxpZGF0ZURheVR5cGVUeXBlKChCaWdJbnRlZ2VyKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuREVGQVVMVF9GSVhFRF9DT1NUX0FDQ1JVQUxfVFlQRToKLQkJCQlyZXR1cm4gdmFsaWRhdGVEZWZhdWx0Rml4ZWRDb3N0QWNjcnVhbFR5cGUoKEJpZ0ludGVnZXIpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5ERUZBVUxUX1RBU0tfRVZfTUVUSE9EX1RZUEU6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlRGVmYXVsdFRhc2tFVk1ldGhvZFR5cGUoKEJpZ0ludGVnZXIpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5ERUZBVUxUX1RBU0tfVFlQRV9UWVBFOgotCQkJCXJldHVybiB2YWxpZGF0ZURlZmF1bHRUYXNrVHlwZVR5cGUoKEJpZ0ludGVnZXIpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5EVVJBVElPTl9GT1JNQVRfVFlQRToKLQkJCQlyZXR1cm4gdmFsaWRhdGVEdXJhdGlvbkZvcm1hdFR5cGUoKEJpZ0ludGVnZXIpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5EVVJBVElPTl9GT1JNQVRfVFlQRTE6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlRHVyYXRpb25Gb3JtYXRUeXBlMSgoQmlnSW50ZWdlcil2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkRVUkFUSU9OX0ZPUk1BVF9UWVBFMjoKLQkJCQlyZXR1cm4gdmFsaWRhdGVEdXJhdGlvbkZvcm1hdFR5cGUyKChCaWdJbnRlZ2VyKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRFVSQVRJT05fRk9STUFUX1RZUEUzOgotCQkJCXJldHVybiB2YWxpZGF0ZUR1cmF0aW9uRm9ybWF0VHlwZTMoKEJpZ0ludGVnZXIpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5EVVJBVElPTl9GT1JNQVRfVFlQRTQ6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlRHVyYXRpb25Gb3JtYXRUeXBlNCgoQmlnSW50ZWdlcil2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkRVUkFUSU9OX0ZPUk1BVF9UWVBFNToKLQkJCQlyZXR1cm4gdmFsaWRhdGVEdXJhdGlvbkZvcm1hdFR5cGU1KChCaWdJbnRlZ2VyKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRUFSTkVEX1ZBTFVFX01FVEhPRF9UWVBFOgotCQkJCXJldHVybiB2YWxpZGF0ZUVhcm5lZFZhbHVlTWV0aG9kVHlwZSgoQmlnSW50ZWdlcil2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVBUk5FRF9WQUxVRV9NRVRIT0RfVFlQRTE6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlRWFybmVkVmFsdWVNZXRob2RUeXBlMSgoQmlnSW50ZWdlcil2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVNQUlMX0FERFJFU1NfVFlQRToKLQkJCQlyZXR1cm4gdmFsaWRhdGVFbWFpbEFkZHJlc3NUeXBlKChTdHJpbmcpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFUk5BTF9UQVNLX1BST0pFQ1RfVFlQRToKLQkJCQlyZXR1cm4gdmFsaWRhdGVFeHRlcm5hbFRhc2tQcm9qZWN0VHlwZSgoU3RyaW5nKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRklYRURfQ09TVF9BQ0NSVUFMX1RZUEU6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlRml4ZWRDb3N0QWNjcnVhbFR5cGUoKFN0cmluZyl2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkZZX1NUQVJUX0RBVEVfVFlQRToKLQkJCQlyZXR1cm4gdmFsaWRhdGVGWVN0YXJ0RGF0ZVR5cGUoKEJpZ0ludGVnZXIpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5HUk9VUF9UWVBFOgotCQkJCXJldHVybiB2YWxpZGF0ZUdyb3VwVHlwZSgoU3RyaW5nKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuSFlQRVJMSU5LX0FERFJFU1NfVFlQRToKLQkJCQlyZXR1cm4gdmFsaWRhdGVIeXBlcmxpbmtBZGRyZXNzVHlwZSgoU3RyaW5nKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuSFlQRVJMSU5LX0FERFJFU1NfVFlQRTE6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlSHlwZXJsaW5rQWRkcmVzc1R5cGUxKChTdHJpbmcpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5IWVBFUkxJTktfQUREUkVTU19UWVBFMjoKLQkJCQlyZXR1cm4gdmFsaWRhdGVIeXBlcmxpbmtBZGRyZXNzVHlwZTIoKFN0cmluZyl2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkhZUEVSTElOS19TVUJfQUREUkVTU19UWVBFOgotCQkJCXJldHVybiB2YWxpZGF0ZUh5cGVybGlua1N1YkFkZHJlc3NUeXBlKChTdHJpbmcpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5IWVBFUkxJTktfU1VCX0FERFJFU1NfVFlQRTE6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlSHlwZXJsaW5rU3ViQWRkcmVzc1R5cGUxKChTdHJpbmcpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5IWVBFUkxJTktfU1VCX0FERFJFU1NfVFlQRTI6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlSHlwZXJsaW5rU3ViQWRkcmVzc1R5cGUyKChTdHJpbmcpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5IWVBFUkxJTktfVFlQRToKLQkJCQlyZXR1cm4gdmFsaWRhdGVIeXBlcmxpbmtUeXBlKChTdHJpbmcpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5IWVBFUkxJTktfVFlQRTE6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlSHlwZXJsaW5rVHlwZTEoKFN0cmluZyl2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkhZUEVSTElOS19UWVBFMjoKLQkJCQlyZXR1cm4gdmFsaWRhdGVIeXBlcmxpbmtUeXBlMigoU3RyaW5nKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuSU5JVElBTFNfVFlQRToKLQkJCQlyZXR1cm4gdmFsaWRhdGVJbml0aWFsc1R5cGUoKFN0cmluZyl2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkxBR19GT1JNQVRfVFlQRToKLQkJCQlyZXR1cm4gdmFsaWRhdGVMYWdGb3JtYXRUeXBlKChCaWdJbnRlZ2VyKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuTEVWRUxJTkdfREVMQVlfRk9STUFUX1RZUEU6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlTGV2ZWxpbmdEZWxheUZvcm1hdFR5cGUoKEJpZ0ludGVnZXIpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5MRVZFTElOR19ERUxBWV9GT1JNQVRfVFlQRTE6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlTGV2ZWxpbmdEZWxheUZvcm1hdFR5cGUxKChCaWdJbnRlZ2VyKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuTUFOQUdFUl9UWVBFOgotCQkJCXJldHVybiB2YWxpZGF0ZU1hbmFnZXJUeXBlKChTdHJpbmcpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5NQVRFUklBTF9MQUJFTF9UWVBFOgotCQkJCXJldHVybiB2YWxpZGF0ZU1hdGVyaWFsTGFiZWxUeXBlKChTdHJpbmcpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5OQU1FX1RZUEU6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlTmFtZVR5cGUoKFN0cmluZyl2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk5BTUVfVFlQRTE6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlTmFtZVR5cGUxKChTdHJpbmcpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5OQU1FX1RZUEUyOgotCQkJCXJldHVybiB2YWxpZGF0ZU5hbWVUeXBlMigoU3RyaW5nKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuTkFNRV9UWVBFMzoKLQkJCQlyZXR1cm4gdmFsaWRhdGVOYW1lVHlwZTMoKFN0cmluZyl2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk5FV19UQVNLX1NUQVJUX0RBVEVfVFlQRToKLQkJCQlyZXR1cm4gdmFsaWRhdGVOZXdUYXNrU3RhcnREYXRlVHlwZSgoQmlnSW50ZWdlcil2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk5UX0FDQ09VTlRfVFlQRToKLQkJCQlyZXR1cm4gdmFsaWRhdGVOVEFjY291bnRUeXBlKChTdHJpbmcpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX05VTUJFUl9UWVBFOgotCQkJCXJldHVybiB2YWxpZGF0ZU91dGxpbmVOdW1iZXJUeXBlKChTdHJpbmcpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5PVkVSVElNRV9SQVRFX0ZPUk1BVF9UWVBFOgotCQkJCXJldHVybiB2YWxpZGF0ZU92ZXJ0aW1lUmF0ZUZvcm1hdFR5cGUoKEJpZ0ludGVnZXIpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5PVkVSVElNRV9SQVRFX0ZPUk1BVF9UWVBFMToKLQkJCQlyZXR1cm4gdmFsaWRhdGVPdmVydGltZVJhdGVGb3JtYXRUeXBlMSgoQmlnSW50ZWdlcil2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBIT05FVElDX0FMSUFTX1RZUEU6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlUGhvbmV0aWNBbGlhc1R5cGUoKFN0cmluZyl2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBIT05FVElDU19UWVBFOgotCQkJCXJldHVybiB2YWxpZGF0ZVBob25ldGljc1R5cGUoKFN0cmluZyl2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBSRUZJWF9UWVBFOgotCQkJCXJldHVybiB2YWxpZGF0ZVByZWZpeFR5cGUoKFN0cmluZyl2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJBVEVfVEFCTEVfVFlQRToKLQkJCQlyZXR1cm4gdmFsaWRhdGVSYXRlVGFibGVUeXBlKChCaWdJbnRlZ2VyKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUk9MTFVQX1RZUEVfVFlQRToKLQkJCQlyZXR1cm4gdmFsaWRhdGVSb2xsdXBUeXBlVHlwZSgoQmlnSW50ZWdlcil2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlNUQU5EQVJEX1JBVEVfRk9STUFUX1RZUEU6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlU3RhbmRhcmRSYXRlRm9ybWF0VHlwZSgoQmlnSW50ZWdlcil2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlNUQU5EQVJEX1JBVEVfRk9STUFUX1RZUEUxOgotCQkJCXJldHVybiB2YWxpZGF0ZVN0YW5kYXJkUmF0ZUZvcm1hdFR5cGUxKChCaWdJbnRlZ2VyKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuU1VCSkVDVF9UWVBFOgotCQkJCXJldHVybiB2YWxpZGF0ZVN1YmplY3RUeXBlKChTdHJpbmcpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5TVUJQUk9KRUNUX05BTUVfVFlQRToKLQkJCQlyZXR1cm4gdmFsaWRhdGVTdWJwcm9qZWN0TmFtZVR5cGUoKFN0cmluZyl2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRJVExFX1RZUEU6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlVGl0bGVUeXBlKChTdHJpbmcpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UWVBFX1RZUEU6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlVHlwZVR5cGUoKEJpZ0ludGVnZXIpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UWVBFX1RZUEUxOgotCQkJCXJldHVybiB2YWxpZGF0ZVR5cGVUeXBlMSgoQmlnSW50ZWdlcil2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRZUEVfVFlQRTI6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlVHlwZVR5cGUyKChCaWdJbnRlZ2VyKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVFlQRV9UWVBFMzoKLQkJCQlyZXR1cm4gdmFsaWRhdGVUeXBlVHlwZTMoKEJpZ0ludGVnZXIpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UWVBFX1RZUEU0OgotCQkJCXJldHVybiB2YWxpZGF0ZVR5cGVUeXBlNCgoQmlnSW50ZWdlcil2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRZUEVfVFlQRTU6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlVHlwZVR5cGU1KChCaWdJbnRlZ2VyKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVUlEX1RZUEU6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlVUlEVHlwZSgoU3RyaW5nKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVU5JVF9UWVBFOgotCQkJCXJldHVybiB2YWxpZGF0ZVVuaXRUeXBlKChCaWdJbnRlZ2VyKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVkFMVUVMSVNUX1NPUlRfT1JERVJfVFlQRToKLQkJCQlyZXR1cm4gdmFsaWRhdGVWYWx1ZWxpc3RTb3J0T3JkZXJUeXBlKChCaWdJbnRlZ2VyKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuV0VFS19TVEFSVF9EQVlfVFlQRToKLQkJCQlyZXR1cm4gdmFsaWRhdGVXZWVrU3RhcnREYXlUeXBlKChCaWdJbnRlZ2VyKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuV09SS19DT05UT1VSX1RZUEU6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlV29ya0NvbnRvdXJUeXBlKChCaWdJbnRlZ2VyKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuV09SS19GT1JNQVRfVFlQRToKLQkJCQlyZXR1cm4gdmFsaWRhdGVXb3JrRm9ybWF0VHlwZSgoQmlnSW50ZWdlcil2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLldPUktfR1JPVVBfVFlQRToKLQkJCQlyZXR1cm4gdmFsaWRhdGVXb3JrR3JvdXBUeXBlKChCaWdJbnRlZ2VyKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQlkZWZhdWx0OiAKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlQXNzaWdubWVudChBc3NpZ25tZW50IGFzc2lnbm1lbnQsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJcmV0dXJuIHZhbGlkYXRlX0V2ZXJ5RGVmYXVsdENvbnN0cmFpbnQoYXNzaWdubWVudCwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlQXNzaWdubWVudHMoQXNzaWdubWVudHMgYXNzaWdubWVudHMsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJcmV0dXJuIHZhbGlkYXRlX0V2ZXJ5RGVmYXVsdENvbnN0cmFpbnQoYXNzaWdubWVudHMsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUF2YWlsYWJpbGl0eVBlcmlvZChBdmFpbGFiaWxpdHlQZXJpb2QgYXZhaWxhYmlsaXR5UGVyaW9kLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCXJldHVybiB2YWxpZGF0ZV9FdmVyeURlZmF1bHRDb25zdHJhaW50KGF2YWlsYWJpbGl0eVBlcmlvZCwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlQXZhaWxhYmlsaXR5UGVyaW9kcyhBdmFpbGFiaWxpdHlQZXJpb2RzIGF2YWlsYWJpbGl0eVBlcmlvZHMsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJcmV0dXJuIHZhbGlkYXRlX0V2ZXJ5RGVmYXVsdENvbnN0cmFpbnQoYXZhaWxhYmlsaXR5UGVyaW9kcywgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlQmFzZWxpbmUoQmFzZWxpbmUgYmFzZWxpbmUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJcmV0dXJuIHZhbGlkYXRlX0V2ZXJ5RGVmYXVsdENvbnN0cmFpbnQoYmFzZWxpbmUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUJhc2VsaW5lMihCYXNlbGluZTIgYmFzZWxpbmUyLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCXJldHVybiB2YWxpZGF0ZV9FdmVyeURlZmF1bHRDb25zdHJhaW50KGJhc2VsaW5lMiwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlQmFzZWxpbmUzKEJhc2VsaW5lMyBiYXNlbGluZTMsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJcmV0dXJuIHZhbGlkYXRlX0V2ZXJ5RGVmYXVsdENvbnN0cmFpbnQoYmFzZWxpbmUzLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVDYWxlbmRhcihDYWxlbmRhciBjYWxlbmRhciwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlyZXR1cm4gdmFsaWRhdGVfRXZlcnlEZWZhdWx0Q29uc3RyYWludChjYWxlbmRhciwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlQ2FsZW5kYXJzKENhbGVuZGFycyBjYWxlbmRhcnMsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJcmV0dXJuIHZhbGlkYXRlX0V2ZXJ5RGVmYXVsdENvbnN0cmFpbnQoY2FsZW5kYXJzLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVEb2N1bWVudFJvb3QoRG9jdW1lbnRSb290IGRvY3VtZW50Um9vdCwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlyZXR1cm4gdmFsaWRhdGVfRXZlcnlEZWZhdWx0Q29uc3RyYWludChkb2N1bWVudFJvb3QsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUV4dGVuZGVkQXR0cmlidXRlKEV4dGVuZGVkQXR0cmlidXRlIGV4dGVuZGVkQXR0cmlidXRlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCXJldHVybiB2YWxpZGF0ZV9FdmVyeURlZmF1bHRDb25zdHJhaW50KGV4dGVuZGVkQXR0cmlidXRlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVFeHRlbmRlZEF0dHJpYnV0ZTIoRXh0ZW5kZWRBdHRyaWJ1dGUyIGV4dGVuZGVkQXR0cmlidXRlMiwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlyZXR1cm4gdmFsaWRhdGVfRXZlcnlEZWZhdWx0Q29uc3RyYWludChleHRlbmRlZEF0dHJpYnV0ZTIsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUV4dGVuZGVkQXR0cmlidXRlMyhFeHRlbmRlZEF0dHJpYnV0ZTMgZXh0ZW5kZWRBdHRyaWJ1dGUzLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCXJldHVybiB2YWxpZGF0ZV9FdmVyeURlZmF1bHRDb25zdHJhaW50KGV4dGVuZGVkQXR0cmlidXRlMywgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlRXh0ZW5kZWRBdHRyaWJ1dGU0KEV4dGVuZGVkQXR0cmlidXRlNCBleHRlbmRlZEF0dHJpYnV0ZTQsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJcmV0dXJuIHZhbGlkYXRlX0V2ZXJ5RGVmYXVsdENvbnN0cmFpbnQoZXh0ZW5kZWRBdHRyaWJ1dGU0LCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVFeHRlbmRlZEF0dHJpYnV0ZXMoRXh0ZW5kZWRBdHRyaWJ1dGVzIGV4dGVuZGVkQXR0cmlidXRlcywgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlyZXR1cm4gdmFsaWRhdGVfRXZlcnlEZWZhdWx0Q29uc3RyYWludChleHRlbmRlZEF0dHJpYnV0ZXMsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZU1hc2soTWFzayBtYXNrLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCXJldHVybiB2YWxpZGF0ZV9FdmVyeURlZmF1bHRDb25zdHJhaW50KG1hc2ssIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZU1hc2tzKE1hc2tzIG1hc2tzLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCXJldHVybiB2YWxpZGF0ZV9FdmVyeURlZmF1bHRDb25zdHJhaW50KG1hc2tzLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVPdXRsaW5lQ29kZShPdXRsaW5lQ29kZSBvdXRsaW5lQ29kZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlyZXR1cm4gdmFsaWRhdGVfRXZlcnlEZWZhdWx0Q29uc3RyYWludChvdXRsaW5lQ29kZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlT3V0bGluZUNvZGUyKE91dGxpbmVDb2RlMiBvdXRsaW5lQ29kZTIsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJcmV0dXJuIHZhbGlkYXRlX0V2ZXJ5RGVmYXVsdENvbnN0cmFpbnQob3V0bGluZUNvZGUyLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVPdXRsaW5lQ29kZTMoT3V0bGluZUNvZGUzIG91dGxpbmVDb2RlMywgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlyZXR1cm4gdmFsaWRhdGVfRXZlcnlEZWZhdWx0Q29uc3RyYWludChvdXRsaW5lQ29kZTMsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZU91dGxpbmVDb2RlcyhPdXRsaW5lQ29kZXMgb3V0bGluZUNvZGVzLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCXJldHVybiB2YWxpZGF0ZV9FdmVyeURlZmF1bHRDb25zdHJhaW50KG91dGxpbmVDb2RlcywgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlUHJlZGVjZXNzb3JMaW5rKFByZWRlY2Vzc29yTGluayBwcmVkZWNlc3NvckxpbmssIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJcmV0dXJuIHZhbGlkYXRlX0V2ZXJ5RGVmYXVsdENvbnN0cmFpbnQocHJlZGVjZXNzb3JMaW5rLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVQcm9qZWN0KFByb2plY3QgcHJvamVjdCwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlyZXR1cm4gdmFsaWRhdGVfRXZlcnlEZWZhdWx0Q29uc3RyYWludChwcm9qZWN0LCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVSYXRlKFJhdGUgcmF0ZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlyZXR1cm4gdmFsaWRhdGVfRXZlcnlEZWZhdWx0Q29uc3RyYWludChyYXRlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVSYXRlcyhSYXRlcyByYXRlcywgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlyZXR1cm4gdmFsaWRhdGVfRXZlcnlEZWZhdWx0Q29uc3RyYWludChyYXRlcywgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlUmVzb3VyY2UoUmVzb3VyY2UgcmVzb3VyY2UsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJcmV0dXJuIHZhbGlkYXRlX0V2ZXJ5RGVmYXVsdENvbnN0cmFpbnQocmVzb3VyY2UsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZVJlc291cmNlcyhSZXNvdXJjZXMgcmVzb3VyY2VzLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCXJldHVybiB2YWxpZGF0ZV9FdmVyeURlZmF1bHRDb25zdHJhaW50KHJlc291cmNlcywgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlVGFzayhUYXNrIHRhc2ssIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJcmV0dXJuIHZhbGlkYXRlX0V2ZXJ5RGVmYXVsdENvbnN0cmFpbnQodGFzaywgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlVGFza3MoVGFza3MgdGFza3MsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJcmV0dXJuIHZhbGlkYXRlX0V2ZXJ5RGVmYXVsdENvbnN0cmFpbnQodGFza3MsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZVRpbWVQZXJpb2QoVGltZVBlcmlvZCB0aW1lUGVyaW9kLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCXJldHVybiB2YWxpZGF0ZV9FdmVyeURlZmF1bHRDb25zdHJhaW50KHRpbWVQZXJpb2QsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZVRpbWVwaGFzZWREYXRhVHlwZShUaW1lcGhhc2VkRGF0YVR5cGUgdGltZXBoYXNlZERhdGFUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCXJldHVybiB2YWxpZGF0ZV9FdmVyeURlZmF1bHRDb25zdHJhaW50KHRpbWVwaGFzZWREYXRhVHlwZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlVmFsdWUoVmFsdWUgdmFsdWUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJcmV0dXJuIHZhbGlkYXRlX0V2ZXJ5RGVmYXVsdENvbnN0cmFpbnQodmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZVZhbHVlMihWYWx1ZTIgdmFsdWUyLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCXJldHVybiB2YWxpZGF0ZV9FdmVyeURlZmF1bHRDb25zdHJhaW50KHZhbHVlMiwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlVmFsdWVMaXN0KFZhbHVlTGlzdCB2YWx1ZUxpc3QsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJcmV0dXJuIHZhbGlkYXRlX0V2ZXJ5RGVmYXVsdENvbnN0cmFpbnQodmFsdWVMaXN0LCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVWYWx1ZXMoVmFsdWVzIHZhbHVlcywgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlyZXR1cm4gdmFsaWRhdGVfRXZlcnlEZWZhdWx0Q29uc3RyYWludCh2YWx1ZXMsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZVdCU01hc2soV0JTTWFzayB3YnNNYXNrLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCXJldHVybiB2YWxpZGF0ZV9FdmVyeURlZmF1bHRDb25zdHJhaW50KHdic01hc2ssIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZVdCU01hc2tzKFdCU01hc2tzIHdic01hc2tzLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCXJldHVybiB2YWxpZGF0ZV9FdmVyeURlZmF1bHRDb25zdHJhaW50KHdic01hc2tzLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVXZWVrRGF5KFdlZWtEYXkgd2Vla0RheSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlyZXR1cm4gdmFsaWRhdGVfRXZlcnlEZWZhdWx0Q29uc3RyYWludCh3ZWVrRGF5LCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVXZWVrRGF5cyhXZWVrRGF5cyB3ZWVrRGF5cywgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlyZXR1cm4gdmFsaWRhdGVfRXZlcnlEZWZhdWx0Q29uc3RyYWludCh3ZWVrRGF5cywgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlV29ya2luZ1RpbWUoV29ya2luZ1RpbWUgd29ya2luZ1RpbWUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJcmV0dXJuIHZhbGlkYXRlX0V2ZXJ5RGVmYXVsdENvbnN0cmFpbnQod29ya2luZ1RpbWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZVdvcmtpbmdUaW1lcyhXb3JraW5nVGltZXMgd29ya2luZ1RpbWVzLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCXJldHVybiB2YWxpZGF0ZV9FdmVyeURlZmF1bHRDb25zdHJhaW50KHdvcmtpbmdUaW1lcywgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlQWNjcnVlQXQoQmlnSW50ZWdlciBhY2NydWVBdCwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IHZhbGlkYXRlQWNjcnVlQXRfRW51bWVyYXRpb24oYWNjcnVlQXQsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAc2VlICN2YWxpZGF0ZUFjY3J1ZUF0X0VudW1lcmF0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDb2xsZWN0aW9uIEFDQ1JVRV9BVF9fRU5VTUVSQVRJT05fX1ZBTFVFUyA9Ci0JCXdyYXBFbnVtZXJhdGlvblZhbHVlcwotCQkJKG5ldyBPYmplY3RbXSB7Ci0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIxIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIyIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIzIikKLQkJCSB9KTsKLQotCS8qKgotCSAqIFZhbGlkYXRlcyB0aGUgRW51bWVyYXRpb24gY29uc3RyYWludCBvZiAnPGVtPkFjY3J1ZSBBdDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUFjY3J1ZUF0X0VudW1lcmF0aW9uKEJpZ0ludGVnZXIgYWNjcnVlQXQsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBBQ0NSVUVfQVRfX0VOVU1FUkFUSU9OX19WQUxVRVMuY29udGFpbnMoYWNjcnVlQXQpOwotCQlpZiAoIXJlc3VsdCAmJiBkaWFnbm9zdGljcyAhPSBudWxsKSAKLQkJCXJlcG9ydEVudW1lcmF0aW9uVmlvbGF0aW9uKE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldEFjY3J1ZUF0KCksIGFjY3J1ZUF0LCBBQ0NSVUVfQVRfX0VOVU1FUkFUSU9OX19WQUxVRVMsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsgCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVBY3RpdmVEaXJlY3RvcnlHVUlEVHlwZShTdHJpbmcgYWN0aXZlRGlyZWN0b3J5R1VJRFR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSB2YWxpZGF0ZUFjdGl2ZURpcmVjdG9yeUdVSURUeXBlX01heExlbmd0aChhY3RpdmVEaXJlY3RvcnlHVUlEVHlwZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFZhbGlkYXRlcyB0aGUgTWF4TGVuZ3RoIGNvbnN0cmFpbnQgb2YgJzxlbT5BY3RpdmUgRGlyZWN0b3J5IEdVSUQgVHlwZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUFjdGl2ZURpcmVjdG9yeUdVSURUeXBlX01heExlbmd0aChTdHJpbmcgYWN0aXZlRGlyZWN0b3J5R1VJRFR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJaW50IGxlbmd0aCA9IGFjdGl2ZURpcmVjdG9yeUdVSURUeXBlLmxlbmd0aCgpOyAgCi0JCWJvb2xlYW4gcmVzdWx0ID0gbGVuZ3RoIDw9IDE2OwotCQlpZiAoIXJlc3VsdCAmJiBkaWFnbm9zdGljcyAhPSBudWxsKSAKLQkJCXJlcG9ydE1heExlbmd0aFZpb2xhdGlvbihNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXRBY3RpdmVEaXJlY3RvcnlHVUlEVHlwZSgpLCBhY3RpdmVEaXJlY3RvcnlHVUlEVHlwZSwgbGVuZ3RoLCAxNiwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlQWxpYXNUeXBlKFN0cmluZyBhbGlhc1R5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSB2YWxpZGF0ZUFsaWFzVHlwZV9NYXhMZW5ndGgoYWxpYXNUeXBlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogVmFsaWRhdGVzIHRoZSBNYXhMZW5ndGggY29uc3RyYWludCBvZiAnPGVtPkFsaWFzIFR5cGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVBbGlhc1R5cGVfTWF4TGVuZ3RoKFN0cmluZyBhbGlhc1R5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJaW50IGxlbmd0aCA9IGFsaWFzVHlwZS5sZW5ndGgoKTsgIAotCQlib29sZWFuIHJlc3VsdCA9IGxlbmd0aCA8PSA1MDsKLQkJaWYgKCFyZXN1bHQgJiYgZGlhZ25vc3RpY3MgIT0gbnVsbCkgCi0JCQlyZXBvcnRNYXhMZW5ndGhWaW9sYXRpb24oTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0QWxpYXNUeXBlKCksIGFsaWFzVHlwZSwgbGVuZ3RoLCA1MCwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlQXV0aG9yVHlwZShTdHJpbmcgYXV0aG9yVHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IHZhbGlkYXRlQXV0aG9yVHlwZV9NYXhMZW5ndGgoYXV0aG9yVHlwZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFZhbGlkYXRlcyB0aGUgTWF4TGVuZ3RoIGNvbnN0cmFpbnQgb2YgJzxlbT5BdXRob3IgVHlwZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUF1dGhvclR5cGVfTWF4TGVuZ3RoKFN0cmluZyBhdXRob3JUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWludCBsZW5ndGggPSBhdXRob3JUeXBlLmxlbmd0aCgpOyAgCi0JCWJvb2xlYW4gcmVzdWx0ID0gbGVuZ3RoIDw9IDUxMjsKLQkJaWYgKCFyZXN1bHQgJiYgZGlhZ25vc3RpY3MgIT0gbnVsbCkgCi0JCQlyZXBvcnRNYXhMZW5ndGhWaW9sYXRpb24oTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0QXV0aG9yVHlwZSgpLCBhdXRob3JUeXBlLCBsZW5ndGgsIDUxMiwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlQmFzZWxpbmVGb3JFYXJuZWRWYWx1ZVR5cGUoQmlnSW50ZWdlciBiYXNlbGluZUZvckVhcm5lZFZhbHVlVHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IHZhbGlkYXRlQmFzZWxpbmVGb3JFYXJuZWRWYWx1ZVR5cGVfRW51bWVyYXRpb24oYmFzZWxpbmVGb3JFYXJuZWRWYWx1ZVR5cGUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAc2VlICN2YWxpZGF0ZUJhc2VsaW5lRm9yRWFybmVkVmFsdWVUeXBlX0VudW1lcmF0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDb2xsZWN0aW9uIEJBU0VMSU5FX0ZPUl9FQVJORURfVkFMVUVfVFlQRV9fRU5VTUVSQVRJT05fX1ZBTFVFUyA9Ci0JCXdyYXBFbnVtZXJhdGlvblZhbHVlcwotCQkJKG5ldyBPYmplY3RbXSB7Ci0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIwIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIxIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIyIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIzIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI0IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI1IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI2IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI3IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI4IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI5IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIxMCIpCi0JCQkgfSk7Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZXMgdGhlIEVudW1lcmF0aW9uIGNvbnN0cmFpbnQgb2YgJzxlbT5CYXNlbGluZSBGb3IgRWFybmVkIFZhbHVlIFR5cGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVCYXNlbGluZUZvckVhcm5lZFZhbHVlVHlwZV9FbnVtZXJhdGlvbihCaWdJbnRlZ2VyIGJhc2VsaW5lRm9yRWFybmVkVmFsdWVUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gQkFTRUxJTkVfRk9SX0VBUk5FRF9WQUxVRV9UWVBFX19FTlVNRVJBVElPTl9fVkFMVUVTLmNvbnRhaW5zKGJhc2VsaW5lRm9yRWFybmVkVmFsdWVUeXBlKTsKLQkJaWYgKCFyZXN1bHQgJiYgZGlhZ25vc3RpY3MgIT0gbnVsbCkgCi0JCQlyZXBvcnRFbnVtZXJhdGlvblZpb2xhdGlvbihNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXRCYXNlbGluZUZvckVhcm5lZFZhbHVlVHlwZSgpLCBiYXNlbGluZUZvckVhcm5lZFZhbHVlVHlwZSwgQkFTRUxJTkVfRk9SX0VBUk5FRF9WQUxVRV9UWVBFX19FTlVNRVJBVElPTl9fVkFMVUVTLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7IAotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlQm9va2luZ1R5cGVUeXBlKEJpZ0ludGVnZXIgYm9va2luZ1R5cGVUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gdmFsaWRhdGVCb29raW5nVHlwZVR5cGVfRW51bWVyYXRpb24oYm9va2luZ1R5cGVUeXBlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQHNlZSAjdmFsaWRhdGVCb29raW5nVHlwZVR5cGVfRW51bWVyYXRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENvbGxlY3Rpb24gQk9PS0lOR19UWVBFX1RZUEVfX0VOVU1FUkFUSU9OX19WQUxVRVMgPQotCQl3cmFwRW51bWVyYXRpb25WYWx1ZXMKLQkJCShuZXcgT2JqZWN0W10gewotCQkJCSBuZXcgQmlnSW50ZWdlcigiMCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMSIpCi0JCQkgfSk7Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZXMgdGhlIEVudW1lcmF0aW9uIGNvbnN0cmFpbnQgb2YgJzxlbT5Cb29raW5nIFR5cGUgVHlwZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUJvb2tpbmdUeXBlVHlwZV9FbnVtZXJhdGlvbihCaWdJbnRlZ2VyIGJvb2tpbmdUeXBlVHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IEJPT0tJTkdfVFlQRV9UWVBFX19FTlVNRVJBVElPTl9fVkFMVUVTLmNvbnRhaW5zKGJvb2tpbmdUeXBlVHlwZSk7Ci0JCWlmICghcmVzdWx0ICYmIGRpYWdub3N0aWNzICE9IG51bGwpIAotCQkJcmVwb3J0RW51bWVyYXRpb25WaW9sYXRpb24oTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0Qm9va2luZ1R5cGVUeXBlKCksIGJvb2tpbmdUeXBlVHlwZSwgQk9PS0lOR19UWVBFX1RZUEVfX0VOVU1FUkFUSU9OX19WQUxVRVMsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsgCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVCb29raW5nVHlwZVR5cGUxKEJpZ0ludGVnZXIgYm9va2luZ1R5cGVUeXBlMSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IHZhbGlkYXRlQm9va2luZ1R5cGVUeXBlMV9FbnVtZXJhdGlvbihib29raW5nVHlwZVR5cGUxLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQHNlZSAjdmFsaWRhdGVCb29raW5nVHlwZVR5cGUxX0VudW1lcmF0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDb2xsZWN0aW9uIEJPT0tJTkdfVFlQRV9UWVBFMV9fRU5VTUVSQVRJT05fX1ZBTFVFUyA9Ci0JCXdyYXBFbnVtZXJhdGlvblZhbHVlcwotCQkJKG5ldyBPYmplY3RbXSB7Ci0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIwIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIxIikKLQkJCSB9KTsKLQotCS8qKgotCSAqIFZhbGlkYXRlcyB0aGUgRW51bWVyYXRpb24gY29uc3RyYWludCBvZiAnPGVtPkJvb2tpbmcgVHlwZSBUeXBlMTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUJvb2tpbmdUeXBlVHlwZTFfRW51bWVyYXRpb24oQmlnSW50ZWdlciBib29raW5nVHlwZVR5cGUxLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gQk9PS0lOR19UWVBFX1RZUEUxX19FTlVNRVJBVElPTl9fVkFMVUVTLmNvbnRhaW5zKGJvb2tpbmdUeXBlVHlwZTEpOwotCQlpZiAoIXJlc3VsdCAmJiBkaWFnbm9zdGljcyAhPSBudWxsKSAKLQkJCXJlcG9ydEVudW1lcmF0aW9uVmlvbGF0aW9uKE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldEJvb2tpbmdUeXBlVHlwZTEoKSwgYm9va2luZ1R5cGVUeXBlMSwgQk9PS0lOR19UWVBFX1RZUEUxX19FTlVNRVJBVElPTl9fVkFMVUVTLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7IAotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlQ2FsY3VsYXRpb25UeXBlVHlwZShCaWdJbnRlZ2VyIGNhbGN1bGF0aW9uVHlwZVR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSB2YWxpZGF0ZUNhbGN1bGF0aW9uVHlwZVR5cGVfRW51bWVyYXRpb24oY2FsY3VsYXRpb25UeXBlVHlwZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBzZWUgI3ZhbGlkYXRlQ2FsY3VsYXRpb25UeXBlVHlwZV9FbnVtZXJhdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29sbGVjdGlvbiBDQUxDVUxBVElPTl9UWVBFX1RZUEVfX0VOVU1FUkFUSU9OX19WQUxVRVMgPQotCQl3cmFwRW51bWVyYXRpb25WYWx1ZXMKLQkJCShuZXcgT2JqZWN0W10gewotCQkJCSBuZXcgQmlnSW50ZWdlcigiMCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMiIpCi0JCQkgfSk7Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZXMgdGhlIEVudW1lcmF0aW9uIGNvbnN0cmFpbnQgb2YgJzxlbT5DYWxjdWxhdGlvbiBUeXBlIFR5cGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVDYWxjdWxhdGlvblR5cGVUeXBlX0VudW1lcmF0aW9uKEJpZ0ludGVnZXIgY2FsY3VsYXRpb25UeXBlVHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IENBTENVTEFUSU9OX1RZUEVfVFlQRV9fRU5VTUVSQVRJT05fX1ZBTFVFUy5jb250YWlucyhjYWxjdWxhdGlvblR5cGVUeXBlKTsKLQkJaWYgKCFyZXN1bHQgJiYgZGlhZ25vc3RpY3MgIT0gbnVsbCkgCi0JCQlyZXBvcnRFbnVtZXJhdGlvblZpb2xhdGlvbihNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXRDYWxjdWxhdGlvblR5cGVUeXBlKCksIGNhbGN1bGF0aW9uVHlwZVR5cGUsIENBTENVTEFUSU9OX1RZUEVfVFlQRV9fRU5VTUVSQVRJT05fX1ZBTFVFUywgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OyAKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUNhdGVnb3J5VHlwZShTdHJpbmcgY2F0ZWdvcnlUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gdmFsaWRhdGVDYXRlZ29yeVR5cGVfTWF4TGVuZ3RoKGNhdGVnb3J5VHlwZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFZhbGlkYXRlcyB0aGUgTWF4TGVuZ3RoIGNvbnN0cmFpbnQgb2YgJzxlbT5DYXRlZ29yeSBUeXBlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlQ2F0ZWdvcnlUeXBlX01heExlbmd0aChTdHJpbmcgY2F0ZWdvcnlUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWludCBsZW5ndGggPSBjYXRlZ29yeVR5cGUubGVuZ3RoKCk7ICAKLQkJYm9vbGVhbiByZXN1bHQgPSBsZW5ndGggPD0gNTEyOwotCQlpZiAoIXJlc3VsdCAmJiBkaWFnbm9zdGljcyAhPSBudWxsKSAKLQkJCXJlcG9ydE1heExlbmd0aFZpb2xhdGlvbihNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXRDYXRlZ29yeVR5cGUoKSwgY2F0ZWdvcnlUeXBlLCBsZW5ndGgsIDUxMiwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlQ29kZVR5cGUoU3RyaW5nIGNvZGVUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gdmFsaWRhdGVDb2RlVHlwZV9NYXhMZW5ndGgoY29kZVR5cGUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZXMgdGhlIE1heExlbmd0aCBjb25zdHJhaW50IG9mICc8ZW0+Q29kZSBUeXBlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlQ29kZVR5cGVfTWF4TGVuZ3RoKFN0cmluZyBjb2RlVHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlpbnQgbGVuZ3RoID0gY29kZVR5cGUubGVuZ3RoKCk7ICAKLQkJYm9vbGVhbiByZXN1bHQgPSBsZW5ndGggPD0gNTEyOwotCQlpZiAoIXJlc3VsdCAmJiBkaWFnbm9zdGljcyAhPSBudWxsKSAKLQkJCXJlcG9ydE1heExlbmd0aFZpb2xhdGlvbihNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb2RlVHlwZSgpLCBjb2RlVHlwZSwgbGVuZ3RoLCA1MTIsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUNvbXBhbnlUeXBlKFN0cmluZyBjb21wYW55VHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IHZhbGlkYXRlQ29tcGFueVR5cGVfTWF4TGVuZ3RoKGNvbXBhbnlUeXBlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogVmFsaWRhdGVzIHRoZSBNYXhMZW5ndGggY29uc3RyYWludCBvZiAnPGVtPkNvbXBhbnkgVHlwZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUNvbXBhbnlUeXBlX01heExlbmd0aChTdHJpbmcgY29tcGFueVR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJaW50IGxlbmd0aCA9IGNvbXBhbnlUeXBlLmxlbmd0aCgpOyAgCi0JCWJvb2xlYW4gcmVzdWx0ID0gbGVuZ3RoIDw9IDUxMjsKLQkJaWYgKCFyZXN1bHQgJiYgZGlhZ25vc3RpY3MgIT0gbnVsbCkgCi0JCQlyZXBvcnRNYXhMZW5ndGhWaW9sYXRpb24oTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29tcGFueVR5cGUoKSwgY29tcGFueVR5cGUsIGxlbmd0aCwgNTEyLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVDb25zdHJhaW50VHlwZVR5cGUoQmlnSW50ZWdlciBjb25zdHJhaW50VHlwZVR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSB2YWxpZGF0ZUNvbnN0cmFpbnRUeXBlVHlwZV9FbnVtZXJhdGlvbihjb25zdHJhaW50VHlwZVR5cGUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAc2VlICN2YWxpZGF0ZUNvbnN0cmFpbnRUeXBlVHlwZV9FbnVtZXJhdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29sbGVjdGlvbiBDT05TVFJBSU5UX1RZUEVfVFlQRV9fRU5VTUVSQVRJT05fX1ZBTFVFUyA9Ci0JCXdyYXBFbnVtZXJhdGlvblZhbHVlcwotCQkJKG5ldyBPYmplY3RbXSB7Ci0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIwIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIxIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIyIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIzIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI0IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI1IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI2IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI3IikKLQkJCSB9KTsKLQotCS8qKgotCSAqIFZhbGlkYXRlcyB0aGUgRW51bWVyYXRpb24gY29uc3RyYWludCBvZiAnPGVtPkNvbnN0cmFpbnQgVHlwZSBUeXBlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlQ29uc3RyYWludFR5cGVUeXBlX0VudW1lcmF0aW9uKEJpZ0ludGVnZXIgY29uc3RyYWludFR5cGVUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gQ09OU1RSQUlOVF9UWVBFX1RZUEVfX0VOVU1FUkFUSU9OX19WQUxVRVMuY29udGFpbnMoY29uc3RyYWludFR5cGVUeXBlKTsKLQkJaWYgKCFyZXN1bHQgJiYgZGlhZ25vc3RpY3MgIT0gbnVsbCkgCi0JCQlyZXBvcnRFbnVtZXJhdGlvblZpb2xhdGlvbihNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb25zdHJhaW50VHlwZVR5cGUoKSwgY29uc3RyYWludFR5cGVUeXBlLCBDT05TVFJBSU5UX1RZUEVfVFlQRV9fRU5VTUVSQVRJT05fX1ZBTFVFUywgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OyAKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUNvbnRhY3RUeXBlKFN0cmluZyBjb250YWN0VHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IHZhbGlkYXRlQ29udGFjdFR5cGVfTWF4TGVuZ3RoKGNvbnRhY3RUeXBlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogVmFsaWRhdGVzIHRoZSBNYXhMZW5ndGggY29uc3RyYWludCBvZiAnPGVtPkNvbnRhY3QgVHlwZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUNvbnRhY3RUeXBlX01heExlbmd0aChTdHJpbmcgY29udGFjdFR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJaW50IGxlbmd0aCA9IGNvbnRhY3RUeXBlLmxlbmd0aCgpOyAgCi0JCWJvb2xlYW4gcmVzdWx0ID0gbGVuZ3RoIDw9IDUxMjsKLQkJaWYgKCFyZXN1bHQgJiYgZGlhZ25vc3RpY3MgIT0gbnVsbCkgCi0JCQlyZXBvcnRNYXhMZW5ndGhWaW9sYXRpb24oTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29udGFjdFR5cGUoKSwgY29udGFjdFR5cGUsIGxlbmd0aCwgNTEyLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVDb3N0UmF0ZVRhYmxlVHlwZShCaWdJbnRlZ2VyIGNvc3RSYXRlVGFibGVUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gdmFsaWRhdGVDb3N0UmF0ZVRhYmxlVHlwZV9FbnVtZXJhdGlvbihjb3N0UmF0ZVRhYmxlVHlwZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBzZWUgI3ZhbGlkYXRlQ29zdFJhdGVUYWJsZVR5cGVfRW51bWVyYXRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENvbGxlY3Rpb24gQ09TVF9SQVRFX1RBQkxFX1RZUEVfX0VOVU1FUkFUSU9OX19WQUxVRVMgPQotCQl3cmFwRW51bWVyYXRpb25WYWx1ZXMKLQkJCShuZXcgT2JqZWN0W10gewotCQkJCSBuZXcgQmlnSW50ZWdlcigiMCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMiIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMyIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNCIpCi0JCQkgfSk7Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZXMgdGhlIEVudW1lcmF0aW9uIGNvbnN0cmFpbnQgb2YgJzxlbT5Db3N0IFJhdGUgVGFibGUgVHlwZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUNvc3RSYXRlVGFibGVUeXBlX0VudW1lcmF0aW9uKEJpZ0ludGVnZXIgY29zdFJhdGVUYWJsZVR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBDT1NUX1JBVEVfVEFCTEVfVFlQRV9fRU5VTUVSQVRJT05fX1ZBTFVFUy5jb250YWlucyhjb3N0UmF0ZVRhYmxlVHlwZSk7Ci0JCWlmICghcmVzdWx0ICYmIGRpYWdub3N0aWNzICE9IG51bGwpIAotCQkJcmVwb3J0RW51bWVyYXRpb25WaW9sYXRpb24oTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29zdFJhdGVUYWJsZVR5cGUoKSwgY29zdFJhdGVUYWJsZVR5cGUsIENPU1RfUkFURV9UQUJMRV9UWVBFX19FTlVNRVJBVElPTl9fVkFMVUVTLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7IAotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlQ3VycmVuY3lTeW1ib2xQb3NpdGlvblR5cGUoQmlnSW50ZWdlciBjdXJyZW5jeVN5bWJvbFBvc2l0aW9uVHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IHZhbGlkYXRlQ3VycmVuY3lTeW1ib2xQb3NpdGlvblR5cGVfRW51bWVyYXRpb24oY3VycmVuY3lTeW1ib2xQb3NpdGlvblR5cGUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAc2VlICN2YWxpZGF0ZUN1cnJlbmN5U3ltYm9sUG9zaXRpb25UeXBlX0VudW1lcmF0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDb2xsZWN0aW9uIENVUlJFTkNZX1NZTUJPTF9QT1NJVElPTl9UWVBFX19FTlVNRVJBVElPTl9fVkFMVUVTID0KLQkJd3JhcEVudW1lcmF0aW9uVmFsdWVzCi0JCQkobmV3IE9iamVjdFtdIHsKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjAiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjEiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjIiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjMiKQotCQkJIH0pOwotCi0JLyoqCi0JICogVmFsaWRhdGVzIHRoZSBFbnVtZXJhdGlvbiBjb25zdHJhaW50IG9mICc8ZW0+Q3VycmVuY3kgU3ltYm9sIFBvc2l0aW9uIFR5cGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVDdXJyZW5jeVN5bWJvbFBvc2l0aW9uVHlwZV9FbnVtZXJhdGlvbihCaWdJbnRlZ2VyIGN1cnJlbmN5U3ltYm9sUG9zaXRpb25UeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gQ1VSUkVOQ1lfU1lNQk9MX1BPU0lUSU9OX1RZUEVfX0VOVU1FUkFUSU9OX19WQUxVRVMuY29udGFpbnMoY3VycmVuY3lTeW1ib2xQb3NpdGlvblR5cGUpOwotCQlpZiAoIXJlc3VsdCAmJiBkaWFnbm9zdGljcyAhPSBudWxsKSAKLQkJCXJlcG9ydEVudW1lcmF0aW9uVmlvbGF0aW9uKE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldEN1cnJlbmN5U3ltYm9sUG9zaXRpb25UeXBlKCksIGN1cnJlbmN5U3ltYm9sUG9zaXRpb25UeXBlLCBDVVJSRU5DWV9TWU1CT0xfUE9TSVRJT05fVFlQRV9fRU5VTUVSQVRJT05fX1ZBTFVFUywgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OyAKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUN1cnJlbmN5U3ltYm9sVHlwZShTdHJpbmcgY3VycmVuY3lTeW1ib2xUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gdmFsaWRhdGVDdXJyZW5jeVN5bWJvbFR5cGVfTWF4TGVuZ3RoKGN1cnJlbmN5U3ltYm9sVHlwZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFZhbGlkYXRlcyB0aGUgTWF4TGVuZ3RoIGNvbnN0cmFpbnQgb2YgJzxlbT5DdXJyZW5jeSBTeW1ib2wgVHlwZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUN1cnJlbmN5U3ltYm9sVHlwZV9NYXhMZW5ndGgoU3RyaW5nIGN1cnJlbmN5U3ltYm9sVHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlpbnQgbGVuZ3RoID0gY3VycmVuY3lTeW1ib2xUeXBlLmxlbmd0aCgpOyAgCi0JCWJvb2xlYW4gcmVzdWx0ID0gbGVuZ3RoIDw9IDIwOwotCQlpZiAoIXJlc3VsdCAmJiBkaWFnbm9zdGljcyAhPSBudWxsKSAKLQkJCXJlcG9ydE1heExlbmd0aFZpb2xhdGlvbihNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXRDdXJyZW5jeVN5bWJvbFR5cGUoKSwgY3VycmVuY3lTeW1ib2xUeXBlLCBsZW5ndGgsIDIwLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVEYXlUeXBlVHlwZShCaWdJbnRlZ2VyIGRheVR5cGVUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gdmFsaWRhdGVEYXlUeXBlVHlwZV9FbnVtZXJhdGlvbihkYXlUeXBlVHlwZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBzZWUgI3ZhbGlkYXRlRGF5VHlwZVR5cGVfRW51bWVyYXRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENvbGxlY3Rpb24gREFZX1RZUEVfVFlQRV9fRU5VTUVSQVRJT05fX1ZBTFVFUyA9Ci0JCXdyYXBFbnVtZXJhdGlvblZhbHVlcwotCQkJKG5ldyBPYmplY3RbXSB7Ci0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIwIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIxIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIyIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIzIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI0IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI1IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI2IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI3IikKLQkJCSB9KTsKLQotCS8qKgotCSAqIFZhbGlkYXRlcyB0aGUgRW51bWVyYXRpb24gY29uc3RyYWludCBvZiAnPGVtPkRheSBUeXBlIFR5cGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVEYXlUeXBlVHlwZV9FbnVtZXJhdGlvbihCaWdJbnRlZ2VyIGRheVR5cGVUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gREFZX1RZUEVfVFlQRV9fRU5VTUVSQVRJT05fX1ZBTFVFUy5jb250YWlucyhkYXlUeXBlVHlwZSk7Ci0JCWlmICghcmVzdWx0ICYmIGRpYWdub3N0aWNzICE9IG51bGwpIAotCQkJcmVwb3J0RW51bWVyYXRpb25WaW9sYXRpb24oTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0RGF5VHlwZVR5cGUoKSwgZGF5VHlwZVR5cGUsIERBWV9UWVBFX1RZUEVfX0VOVU1FUkFUSU9OX19WQUxVRVMsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsgCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVEZWZhdWx0Rml4ZWRDb3N0QWNjcnVhbFR5cGUoQmlnSW50ZWdlciBkZWZhdWx0Rml4ZWRDb3N0QWNjcnVhbFR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSB2YWxpZGF0ZURlZmF1bHRGaXhlZENvc3RBY2NydWFsVHlwZV9FbnVtZXJhdGlvbihkZWZhdWx0Rml4ZWRDb3N0QWNjcnVhbFR5cGUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAc2VlICN2YWxpZGF0ZURlZmF1bHRGaXhlZENvc3RBY2NydWFsVHlwZV9FbnVtZXJhdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29sbGVjdGlvbiBERUZBVUxUX0ZJWEVEX0NPU1RfQUNDUlVBTF9UWVBFX19FTlVNRVJBVElPTl9fVkFMVUVTID0KLQkJd3JhcEVudW1lcmF0aW9uVmFsdWVzCi0JCQkobmV3IE9iamVjdFtdIHsKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjEiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjIiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjMiKQotCQkJIH0pOwotCi0JLyoqCi0JICogVmFsaWRhdGVzIHRoZSBFbnVtZXJhdGlvbiBjb25zdHJhaW50IG9mICc8ZW0+RGVmYXVsdCBGaXhlZCBDb3N0IEFjY3J1YWwgVHlwZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZURlZmF1bHRGaXhlZENvc3RBY2NydWFsVHlwZV9FbnVtZXJhdGlvbihCaWdJbnRlZ2VyIGRlZmF1bHRGaXhlZENvc3RBY2NydWFsVHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IERFRkFVTFRfRklYRURfQ09TVF9BQ0NSVUFMX1RZUEVfX0VOVU1FUkFUSU9OX19WQUxVRVMuY29udGFpbnMoZGVmYXVsdEZpeGVkQ29zdEFjY3J1YWxUeXBlKTsKLQkJaWYgKCFyZXN1bHQgJiYgZGlhZ25vc3RpY3MgIT0gbnVsbCkgCi0JCQlyZXBvcnRFbnVtZXJhdGlvblZpb2xhdGlvbihNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXREZWZhdWx0Rml4ZWRDb3N0QWNjcnVhbFR5cGUoKSwgZGVmYXVsdEZpeGVkQ29zdEFjY3J1YWxUeXBlLCBERUZBVUxUX0ZJWEVEX0NPU1RfQUNDUlVBTF9UWVBFX19FTlVNRVJBVElPTl9fVkFMVUVTLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7IAotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlRGVmYXVsdFRhc2tFVk1ldGhvZFR5cGUoQmlnSW50ZWdlciBkZWZhdWx0VGFza0VWTWV0aG9kVHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IHZhbGlkYXRlRGVmYXVsdFRhc2tFVk1ldGhvZFR5cGVfRW51bWVyYXRpb24oZGVmYXVsdFRhc2tFVk1ldGhvZFR5cGUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAc2VlICN2YWxpZGF0ZURlZmF1bHRUYXNrRVZNZXRob2RUeXBlX0VudW1lcmF0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDb2xsZWN0aW9uIERFRkFVTFRfVEFTS19FVl9NRVRIT0RfVFlQRV9fRU5VTUVSQVRJT05fX1ZBTFVFUyA9Ci0JCXdyYXBFbnVtZXJhdGlvblZhbHVlcwotCQkJKG5ldyBPYmplY3RbXSB7Ci0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIwIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIxIikKLQkJCSB9KTsKLQotCS8qKgotCSAqIFZhbGlkYXRlcyB0aGUgRW51bWVyYXRpb24gY29uc3RyYWludCBvZiAnPGVtPkRlZmF1bHQgVGFzayBFViBNZXRob2QgVHlwZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZURlZmF1bHRUYXNrRVZNZXRob2RUeXBlX0VudW1lcmF0aW9uKEJpZ0ludGVnZXIgZGVmYXVsdFRhc2tFVk1ldGhvZFR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBERUZBVUxUX1RBU0tfRVZfTUVUSE9EX1RZUEVfX0VOVU1FUkFUSU9OX19WQUxVRVMuY29udGFpbnMoZGVmYXVsdFRhc2tFVk1ldGhvZFR5cGUpOwotCQlpZiAoIXJlc3VsdCAmJiBkaWFnbm9zdGljcyAhPSBudWxsKSAKLQkJCXJlcG9ydEVudW1lcmF0aW9uVmlvbGF0aW9uKE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldERlZmF1bHRUYXNrRVZNZXRob2RUeXBlKCksIGRlZmF1bHRUYXNrRVZNZXRob2RUeXBlLCBERUZBVUxUX1RBU0tfRVZfTUVUSE9EX1RZUEVfX0VOVU1FUkFUSU9OX19WQUxVRVMsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsgCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVEZWZhdWx0VGFza1R5cGVUeXBlKEJpZ0ludGVnZXIgZGVmYXVsdFRhc2tUeXBlVHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IHZhbGlkYXRlRGVmYXVsdFRhc2tUeXBlVHlwZV9FbnVtZXJhdGlvbihkZWZhdWx0VGFza1R5cGVUeXBlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQHNlZSAjdmFsaWRhdGVEZWZhdWx0VGFza1R5cGVUeXBlX0VudW1lcmF0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDb2xsZWN0aW9uIERFRkFVTFRfVEFTS19UWVBFX1RZUEVfX0VOVU1FUkFUSU9OX19WQUxVRVMgPQotCQl3cmFwRW51bWVyYXRpb25WYWx1ZXMKLQkJCShuZXcgT2JqZWN0W10gewotCQkJCSBuZXcgQmlnSW50ZWdlcigiMCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMiIpCi0JCQkgfSk7Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZXMgdGhlIEVudW1lcmF0aW9uIGNvbnN0cmFpbnQgb2YgJzxlbT5EZWZhdWx0IFRhc2sgVHlwZSBUeXBlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlRGVmYXVsdFRhc2tUeXBlVHlwZV9FbnVtZXJhdGlvbihCaWdJbnRlZ2VyIGRlZmF1bHRUYXNrVHlwZVR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBERUZBVUxUX1RBU0tfVFlQRV9UWVBFX19FTlVNRVJBVElPTl9fVkFMVUVTLmNvbnRhaW5zKGRlZmF1bHRUYXNrVHlwZVR5cGUpOwotCQlpZiAoIXJlc3VsdCAmJiBkaWFnbm9zdGljcyAhPSBudWxsKSAKLQkJCXJlcG9ydEVudW1lcmF0aW9uVmlvbGF0aW9uKE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldERlZmF1bHRUYXNrVHlwZVR5cGUoKSwgZGVmYXVsdFRhc2tUeXBlVHlwZSwgREVGQVVMVF9UQVNLX1RZUEVfVFlQRV9fRU5VTUVSQVRJT05fX1ZBTFVFUywgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OyAKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUR1cmF0aW9uRm9ybWF0VHlwZShCaWdJbnRlZ2VyIGR1cmF0aW9uRm9ybWF0VHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IHZhbGlkYXRlRHVyYXRpb25Gb3JtYXRUeXBlX0VudW1lcmF0aW9uKGR1cmF0aW9uRm9ybWF0VHlwZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBzZWUgI3ZhbGlkYXRlRHVyYXRpb25Gb3JtYXRUeXBlX0VudW1lcmF0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDb2xsZWN0aW9uIERVUkFUSU9OX0ZPUk1BVF9UWVBFX19FTlVNRVJBVElPTl9fVkFMVUVTID0KLQkJd3JhcEVudW1lcmF0aW9uVmFsdWVzCi0JCQkobmV3IE9iamVjdFtdIHsKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjMiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjQiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjUiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjYiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjciKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjgiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjkiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjEwIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIxMSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMTIiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjE5IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIyMCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMjEiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjM1IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIzNiIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMzciKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjM4IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIzOSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNDAiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjQxIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI0MiIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNDMiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjQ0IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI1MSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNTIiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjUzIikKLQkJCSB9KTsKLQotCS8qKgotCSAqIFZhbGlkYXRlcyB0aGUgRW51bWVyYXRpb24gY29uc3RyYWludCBvZiAnPGVtPkR1cmF0aW9uIEZvcm1hdCBUeXBlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlRHVyYXRpb25Gb3JtYXRUeXBlX0VudW1lcmF0aW9uKEJpZ0ludGVnZXIgZHVyYXRpb25Gb3JtYXRUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gRFVSQVRJT05fRk9STUFUX1RZUEVfX0VOVU1FUkFUSU9OX19WQUxVRVMuY29udGFpbnMoZHVyYXRpb25Gb3JtYXRUeXBlKTsKLQkJaWYgKCFyZXN1bHQgJiYgZGlhZ25vc3RpY3MgIT0gbnVsbCkgCi0JCQlyZXBvcnRFbnVtZXJhdGlvblZpb2xhdGlvbihNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXREdXJhdGlvbkZvcm1hdFR5cGUoKSwgZHVyYXRpb25Gb3JtYXRUeXBlLCBEVVJBVElPTl9GT1JNQVRfVFlQRV9fRU5VTUVSQVRJT05fX1ZBTFVFUywgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OyAKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUR1cmF0aW9uRm9ybWF0VHlwZTEoQmlnSW50ZWdlciBkdXJhdGlvbkZvcm1hdFR5cGUxLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gdmFsaWRhdGVEdXJhdGlvbkZvcm1hdFR5cGUxX0VudW1lcmF0aW9uKGR1cmF0aW9uRm9ybWF0VHlwZTEsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAc2VlICN2YWxpZGF0ZUR1cmF0aW9uRm9ybWF0VHlwZTFfRW51bWVyYXRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENvbGxlY3Rpb24gRFVSQVRJT05fRk9STUFUX1RZUEUxX19FTlVNRVJBVElPTl9fVkFMVUVTID0KLQkJd3JhcEVudW1lcmF0aW9uVmFsdWVzCi0JCQkobmV3IE9iamVjdFtdIHsKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjMiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjQiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjUiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjYiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjciKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjgiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjkiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjEwIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIxMSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMTIiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjE5IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIyMCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMjEiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjM1IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIzNiIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMzciKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjM4IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIzOSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNDAiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjQxIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI0MiIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNDMiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjQ0IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI1MSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNTIiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjUzIikKLQkJCSB9KTsKLQotCS8qKgotCSAqIFZhbGlkYXRlcyB0aGUgRW51bWVyYXRpb24gY29uc3RyYWludCBvZiAnPGVtPkR1cmF0aW9uIEZvcm1hdCBUeXBlMTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUR1cmF0aW9uRm9ybWF0VHlwZTFfRW51bWVyYXRpb24oQmlnSW50ZWdlciBkdXJhdGlvbkZvcm1hdFR5cGUxLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gRFVSQVRJT05fRk9STUFUX1RZUEUxX19FTlVNRVJBVElPTl9fVkFMVUVTLmNvbnRhaW5zKGR1cmF0aW9uRm9ybWF0VHlwZTEpOwotCQlpZiAoIXJlc3VsdCAmJiBkaWFnbm9zdGljcyAhPSBudWxsKSAKLQkJCXJlcG9ydEVudW1lcmF0aW9uVmlvbGF0aW9uKE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldER1cmF0aW9uRm9ybWF0VHlwZTEoKSwgZHVyYXRpb25Gb3JtYXRUeXBlMSwgRFVSQVRJT05fRk9STUFUX1RZUEUxX19FTlVNRVJBVElPTl9fVkFMVUVTLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7IAotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlRHVyYXRpb25Gb3JtYXRUeXBlMihCaWdJbnRlZ2VyIGR1cmF0aW9uRm9ybWF0VHlwZTIsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSB2YWxpZGF0ZUR1cmF0aW9uRm9ybWF0VHlwZTJfRW51bWVyYXRpb24oZHVyYXRpb25Gb3JtYXRUeXBlMiwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBzZWUgI3ZhbGlkYXRlRHVyYXRpb25Gb3JtYXRUeXBlMl9FbnVtZXJhdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29sbGVjdGlvbiBEVVJBVElPTl9GT1JNQVRfVFlQRTJfX0VOVU1FUkFUSU9OX19WQUxVRVMgPQotCQl3cmFwRW51bWVyYXRpb25WYWx1ZXMKLQkJCShuZXcgT2JqZWN0W10gewotCQkJCSBuZXcgQmlnSW50ZWdlcigiMyIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNiIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNyIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiOCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiOSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMTAiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjExIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIxMiIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMTkiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjIwIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIyMSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMzUiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjM2IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIzNyIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMzgiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjM5IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI0MCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNDEiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjQyIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI0MyIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNDQiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjUxIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI1MiIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNTMiKQotCQkJIH0pOwotCi0JLyoqCi0JICogVmFsaWRhdGVzIHRoZSBFbnVtZXJhdGlvbiBjb25zdHJhaW50IG9mICc8ZW0+RHVyYXRpb24gRm9ybWF0IFR5cGUyPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlRHVyYXRpb25Gb3JtYXRUeXBlMl9FbnVtZXJhdGlvbihCaWdJbnRlZ2VyIGR1cmF0aW9uRm9ybWF0VHlwZTIsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBEVVJBVElPTl9GT1JNQVRfVFlQRTJfX0VOVU1FUkFUSU9OX19WQUxVRVMuY29udGFpbnMoZHVyYXRpb25Gb3JtYXRUeXBlMik7Ci0JCWlmICghcmVzdWx0ICYmIGRpYWdub3N0aWNzICE9IG51bGwpIAotCQkJcmVwb3J0RW51bWVyYXRpb25WaW9sYXRpb24oTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0RHVyYXRpb25Gb3JtYXRUeXBlMigpLCBkdXJhdGlvbkZvcm1hdFR5cGUyLCBEVVJBVElPTl9GT1JNQVRfVFlQRTJfX0VOVU1FUkFUSU9OX19WQUxVRVMsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsgCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVEdXJhdGlvbkZvcm1hdFR5cGUzKEJpZ0ludGVnZXIgZHVyYXRpb25Gb3JtYXRUeXBlMywgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IHZhbGlkYXRlRHVyYXRpb25Gb3JtYXRUeXBlM19FbnVtZXJhdGlvbihkdXJhdGlvbkZvcm1hdFR5cGUzLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQHNlZSAjdmFsaWRhdGVEdXJhdGlvbkZvcm1hdFR5cGUzX0VudW1lcmF0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDb2xsZWN0aW9uIERVUkFUSU9OX0ZPUk1BVF9UWVBFM19fRU5VTUVSQVRJT05fX1ZBTFVFUyA9Ci0JCXdyYXBFbnVtZXJhdGlvblZhbHVlcwotCQkJKG5ldyBPYmplY3RbXSB7Ci0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIzIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI0IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI1IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI2IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI3IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI4IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI5IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIxMCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMTEiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjEyIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIxOSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMjAiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjIxIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIzNSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMzYiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjM3IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIzOCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMzkiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjQwIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI0MSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNDIiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjQzIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI0NCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNTEiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjUyIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI1MyIpCi0JCQkgfSk7Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZXMgdGhlIEVudW1lcmF0aW9uIGNvbnN0cmFpbnQgb2YgJzxlbT5EdXJhdGlvbiBGb3JtYXQgVHlwZTM8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVEdXJhdGlvbkZvcm1hdFR5cGUzX0VudW1lcmF0aW9uKEJpZ0ludGVnZXIgZHVyYXRpb25Gb3JtYXRUeXBlMywgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IERVUkFUSU9OX0ZPUk1BVF9UWVBFM19fRU5VTUVSQVRJT05fX1ZBTFVFUy5jb250YWlucyhkdXJhdGlvbkZvcm1hdFR5cGUzKTsKLQkJaWYgKCFyZXN1bHQgJiYgZGlhZ25vc3RpY3MgIT0gbnVsbCkgCi0JCQlyZXBvcnRFbnVtZXJhdGlvblZpb2xhdGlvbihNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXREdXJhdGlvbkZvcm1hdFR5cGUzKCksIGR1cmF0aW9uRm9ybWF0VHlwZTMsIERVUkFUSU9OX0ZPUk1BVF9UWVBFM19fRU5VTUVSQVRJT05fX1ZBTFVFUywgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OyAKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUR1cmF0aW9uRm9ybWF0VHlwZTQoQmlnSW50ZWdlciBkdXJhdGlvbkZvcm1hdFR5cGU0LCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gdmFsaWRhdGVEdXJhdGlvbkZvcm1hdFR5cGU0X0VudW1lcmF0aW9uKGR1cmF0aW9uRm9ybWF0VHlwZTQsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAc2VlICN2YWxpZGF0ZUR1cmF0aW9uRm9ybWF0VHlwZTRfRW51bWVyYXRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENvbGxlY3Rpb24gRFVSQVRJT05fRk9STUFUX1RZUEU0X19FTlVNRVJBVElPTl9fVkFMVUVTID0KLQkJd3JhcEVudW1lcmF0aW9uVmFsdWVzCi0JCQkobmV3IE9iamVjdFtdIHsKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjMiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjQiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjUiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjYiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjciKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjgiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjkiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjEwIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIxMSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMTIiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjE5IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIyMCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMjEiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjM1IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIzNiIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMzciKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjM4IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIzOSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNDAiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjQxIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI0MiIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNDMiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjQ0IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI1MSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNTIiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjUzIikKLQkJCSB9KTsKLQotCS8qKgotCSAqIFZhbGlkYXRlcyB0aGUgRW51bWVyYXRpb24gY29uc3RyYWludCBvZiAnPGVtPkR1cmF0aW9uIEZvcm1hdCBUeXBlNDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUR1cmF0aW9uRm9ybWF0VHlwZTRfRW51bWVyYXRpb24oQmlnSW50ZWdlciBkdXJhdGlvbkZvcm1hdFR5cGU0LCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gRFVSQVRJT05fRk9STUFUX1RZUEU0X19FTlVNRVJBVElPTl9fVkFMVUVTLmNvbnRhaW5zKGR1cmF0aW9uRm9ybWF0VHlwZTQpOwotCQlpZiAoIXJlc3VsdCAmJiBkaWFnbm9zdGljcyAhPSBudWxsKSAKLQkJCXJlcG9ydEVudW1lcmF0aW9uVmlvbGF0aW9uKE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldER1cmF0aW9uRm9ybWF0VHlwZTQoKSwgZHVyYXRpb25Gb3JtYXRUeXBlNCwgRFVSQVRJT05fRk9STUFUX1RZUEU0X19FTlVNRVJBVElPTl9fVkFMVUVTLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7IAotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlRHVyYXRpb25Gb3JtYXRUeXBlNShCaWdJbnRlZ2VyIGR1cmF0aW9uRm9ybWF0VHlwZTUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSB2YWxpZGF0ZUR1cmF0aW9uRm9ybWF0VHlwZTVfRW51bWVyYXRpb24oZHVyYXRpb25Gb3JtYXRUeXBlNSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBzZWUgI3ZhbGlkYXRlRHVyYXRpb25Gb3JtYXRUeXBlNV9FbnVtZXJhdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29sbGVjdGlvbiBEVVJBVElPTl9GT1JNQVRfVFlQRTVfX0VOVU1FUkFUSU9OX19WQUxVRVMgPQotCQl3cmFwRW51bWVyYXRpb25WYWx1ZXMKLQkJCShuZXcgT2JqZWN0W10gewotCQkJCSBuZXcgQmlnSW50ZWdlcigiMyIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNiIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNyIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiOCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiOSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMTAiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjExIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIxMiIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMTkiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjIwIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIyMSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMzUiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjM2IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIzNyIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMzgiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjM5IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI0MCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNDEiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjQyIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI0MyIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNDQiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjUxIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI1MiIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNTMiKQotCQkJIH0pOwotCi0JLyoqCi0JICogVmFsaWRhdGVzIHRoZSBFbnVtZXJhdGlvbiBjb25zdHJhaW50IG9mICc8ZW0+RHVyYXRpb24gRm9ybWF0IFR5cGU1PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlRHVyYXRpb25Gb3JtYXRUeXBlNV9FbnVtZXJhdGlvbihCaWdJbnRlZ2VyIGR1cmF0aW9uRm9ybWF0VHlwZTUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBEVVJBVElPTl9GT1JNQVRfVFlQRTVfX0VOVU1FUkFUSU9OX19WQUxVRVMuY29udGFpbnMoZHVyYXRpb25Gb3JtYXRUeXBlNSk7Ci0JCWlmICghcmVzdWx0ICYmIGRpYWdub3N0aWNzICE9IG51bGwpIAotCQkJcmVwb3J0RW51bWVyYXRpb25WaW9sYXRpb24oTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0RHVyYXRpb25Gb3JtYXRUeXBlNSgpLCBkdXJhdGlvbkZvcm1hdFR5cGU1LCBEVVJBVElPTl9GT1JNQVRfVFlQRTVfX0VOVU1FUkFUSU9OX19WQUxVRVMsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsgCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVFYXJuZWRWYWx1ZU1ldGhvZFR5cGUoQmlnSW50ZWdlciBlYXJuZWRWYWx1ZU1ldGhvZFR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSB2YWxpZGF0ZUVhcm5lZFZhbHVlTWV0aG9kVHlwZV9FbnVtZXJhdGlvbihlYXJuZWRWYWx1ZU1ldGhvZFR5cGUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAc2VlICN2YWxpZGF0ZUVhcm5lZFZhbHVlTWV0aG9kVHlwZV9FbnVtZXJhdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29sbGVjdGlvbiBFQVJORURfVkFMVUVfTUVUSE9EX1RZUEVfX0VOVU1FUkFUSU9OX19WQUxVRVMgPQotCQl3cmFwRW51bWVyYXRpb25WYWx1ZXMKLQkJCShuZXcgT2JqZWN0W10gewotCQkJCSBuZXcgQmlnSW50ZWdlcigiMCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMSIpCi0JCQkgfSk7Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZXMgdGhlIEVudW1lcmF0aW9uIGNvbnN0cmFpbnQgb2YgJzxlbT5FYXJuZWQgVmFsdWUgTWV0aG9kIFR5cGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVFYXJuZWRWYWx1ZU1ldGhvZFR5cGVfRW51bWVyYXRpb24oQmlnSW50ZWdlciBlYXJuZWRWYWx1ZU1ldGhvZFR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBFQVJORURfVkFMVUVfTUVUSE9EX1RZUEVfX0VOVU1FUkFUSU9OX19WQUxVRVMuY29udGFpbnMoZWFybmVkVmFsdWVNZXRob2RUeXBlKTsKLQkJaWYgKCFyZXN1bHQgJiYgZGlhZ25vc3RpY3MgIT0gbnVsbCkgCi0JCQlyZXBvcnRFbnVtZXJhdGlvblZpb2xhdGlvbihNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXRFYXJuZWRWYWx1ZU1ldGhvZFR5cGUoKSwgZWFybmVkVmFsdWVNZXRob2RUeXBlLCBFQVJORURfVkFMVUVfTUVUSE9EX1RZUEVfX0VOVU1FUkFUSU9OX19WQUxVRVMsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsgCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVFYXJuZWRWYWx1ZU1ldGhvZFR5cGUxKEJpZ0ludGVnZXIgZWFybmVkVmFsdWVNZXRob2RUeXBlMSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IHZhbGlkYXRlRWFybmVkVmFsdWVNZXRob2RUeXBlMV9FbnVtZXJhdGlvbihlYXJuZWRWYWx1ZU1ldGhvZFR5cGUxLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQHNlZSAjdmFsaWRhdGVFYXJuZWRWYWx1ZU1ldGhvZFR5cGUxX0VudW1lcmF0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDb2xsZWN0aW9uIEVBUk5FRF9WQUxVRV9NRVRIT0RfVFlQRTFfX0VOVU1FUkFUSU9OX19WQUxVRVMgPQotCQl3cmFwRW51bWVyYXRpb25WYWx1ZXMKLQkJCShuZXcgT2JqZWN0W10gewotCQkJCSBuZXcgQmlnSW50ZWdlcigiMCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMSIpCi0JCQkgfSk7Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZXMgdGhlIEVudW1lcmF0aW9uIGNvbnN0cmFpbnQgb2YgJzxlbT5FYXJuZWQgVmFsdWUgTWV0aG9kIFR5cGUxPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlRWFybmVkVmFsdWVNZXRob2RUeXBlMV9FbnVtZXJhdGlvbihCaWdJbnRlZ2VyIGVhcm5lZFZhbHVlTWV0aG9kVHlwZTEsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBFQVJORURfVkFMVUVfTUVUSE9EX1RZUEUxX19FTlVNRVJBVElPTl9fVkFMVUVTLmNvbnRhaW5zKGVhcm5lZFZhbHVlTWV0aG9kVHlwZTEpOwotCQlpZiAoIXJlc3VsdCAmJiBkaWFnbm9zdGljcyAhPSBudWxsKSAKLQkJCXJlcG9ydEVudW1lcmF0aW9uVmlvbGF0aW9uKE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldEVhcm5lZFZhbHVlTWV0aG9kVHlwZTEoKSwgZWFybmVkVmFsdWVNZXRob2RUeXBlMSwgRUFSTkVEX1ZBTFVFX01FVEhPRF9UWVBFMV9fRU5VTUVSQVRJT05fX1ZBTFVFUywgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OyAKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUVtYWlsQWRkcmVzc1R5cGUoU3RyaW5nIGVtYWlsQWRkcmVzc1R5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSB2YWxpZGF0ZUVtYWlsQWRkcmVzc1R5cGVfTWF4TGVuZ3RoKGVtYWlsQWRkcmVzc1R5cGUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZXMgdGhlIE1heExlbmd0aCBjb25zdHJhaW50IG9mICc8ZW0+RW1haWwgQWRkcmVzcyBUeXBlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlRW1haWxBZGRyZXNzVHlwZV9NYXhMZW5ndGgoU3RyaW5nIGVtYWlsQWRkcmVzc1R5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJaW50IGxlbmd0aCA9IGVtYWlsQWRkcmVzc1R5cGUubGVuZ3RoKCk7ICAKLQkJYm9vbGVhbiByZXN1bHQgPSBsZW5ndGggPD0gNTEyOwotCQlpZiAoIXJlc3VsdCAmJiBkaWFnbm9zdGljcyAhPSBudWxsKSAKLQkJCXJlcG9ydE1heExlbmd0aFZpb2xhdGlvbihNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXRFbWFpbEFkZHJlc3NUeXBlKCksIGVtYWlsQWRkcmVzc1R5cGUsIGxlbmd0aCwgNTEyLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVFeHRlcm5hbFRhc2tQcm9qZWN0VHlwZShTdHJpbmcgZXh0ZXJuYWxUYXNrUHJvamVjdFR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSB2YWxpZGF0ZUV4dGVybmFsVGFza1Byb2plY3RUeXBlX01heExlbmd0aChleHRlcm5hbFRhc2tQcm9qZWN0VHlwZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFZhbGlkYXRlcyB0aGUgTWF4TGVuZ3RoIGNvbnN0cmFpbnQgb2YgJzxlbT5FeHRlcm5hbCBUYXNrIFByb2plY3QgVHlwZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUV4dGVybmFsVGFza1Byb2plY3RUeXBlX01heExlbmd0aChTdHJpbmcgZXh0ZXJuYWxUYXNrUHJvamVjdFR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJaW50IGxlbmd0aCA9IGV4dGVybmFsVGFza1Byb2plY3RUeXBlLmxlbmd0aCgpOyAgCi0JCWJvb2xlYW4gcmVzdWx0ID0gbGVuZ3RoIDw9IDUxMjsKLQkJaWYgKCFyZXN1bHQgJiYgZGlhZ25vc3RpY3MgIT0gbnVsbCkgCi0JCQlyZXBvcnRNYXhMZW5ndGhWaW9sYXRpb24oTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0RXh0ZXJuYWxUYXNrUHJvamVjdFR5cGUoKSwgZXh0ZXJuYWxUYXNrUHJvamVjdFR5cGUsIGxlbmd0aCwgNTEyLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVGaXhlZENvc3RBY2NydWFsVHlwZShTdHJpbmcgZml4ZWRDb3N0QWNjcnVhbFR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSB2YWxpZGF0ZUZpeGVkQ29zdEFjY3J1YWxUeXBlX0VudW1lcmF0aW9uKGZpeGVkQ29zdEFjY3J1YWxUeXBlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQHNlZSAjdmFsaWRhdGVGaXhlZENvc3RBY2NydWFsVHlwZV9FbnVtZXJhdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29sbGVjdGlvbiBGSVhFRF9DT1NUX0FDQ1JVQUxfVFlQRV9fRU5VTUVSQVRJT05fX1ZBTFVFUyA9Ci0JCXdyYXBFbnVtZXJhdGlvblZhbHVlcwotCQkJKG5ldyBPYmplY3RbXSB7Ci0JCQkJICIxIiwKLQkJCQkgIjIiLAotCQkJCSAiMyIKLQkJCSB9KTsKLQotCS8qKgotCSAqIFZhbGlkYXRlcyB0aGUgRW51bWVyYXRpb24gY29uc3RyYWludCBvZiAnPGVtPkZpeGVkIENvc3QgQWNjcnVhbCBUeXBlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlRml4ZWRDb3N0QWNjcnVhbFR5cGVfRW51bWVyYXRpb24oU3RyaW5nIGZpeGVkQ29zdEFjY3J1YWxUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gRklYRURfQ09TVF9BQ0NSVUFMX1RZUEVfX0VOVU1FUkFUSU9OX19WQUxVRVMuY29udGFpbnMoZml4ZWRDb3N0QWNjcnVhbFR5cGUpOwotCQlpZiAoIXJlc3VsdCAmJiBkaWFnbm9zdGljcyAhPSBudWxsKSAKLQkJCXJlcG9ydEVudW1lcmF0aW9uVmlvbGF0aW9uKE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldEZpeGVkQ29zdEFjY3J1YWxUeXBlKCksIGZpeGVkQ29zdEFjY3J1YWxUeXBlLCBGSVhFRF9DT1NUX0FDQ1JVQUxfVFlQRV9fRU5VTUVSQVRJT05fX1ZBTFVFUywgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OyAKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUZZU3RhcnREYXRlVHlwZShCaWdJbnRlZ2VyIGZ5U3RhcnREYXRlVHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IHZhbGlkYXRlRllTdGFydERhdGVUeXBlX0VudW1lcmF0aW9uKGZ5U3RhcnREYXRlVHlwZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBzZWUgI3ZhbGlkYXRlRllTdGFydERhdGVUeXBlX0VudW1lcmF0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDb2xsZWN0aW9uIEZZX1NUQVJUX0RBVEVfVFlQRV9fRU5VTUVSQVRJT05fX1ZBTFVFUyA9Ci0JCXdyYXBFbnVtZXJhdGlvblZhbHVlcwotCQkJKG5ldyBPYmplY3RbXSB7Ci0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIxIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIyIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIzIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI0IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI1IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI2IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI3IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI4IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI5IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIxMCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMTEiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjEyIikKLQkJCSB9KTsKLQotCS8qKgotCSAqIFZhbGlkYXRlcyB0aGUgRW51bWVyYXRpb24gY29uc3RyYWludCBvZiAnPGVtPkZZIFN0YXJ0IERhdGUgVHlwZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUZZU3RhcnREYXRlVHlwZV9FbnVtZXJhdGlvbihCaWdJbnRlZ2VyIGZ5U3RhcnREYXRlVHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IEZZX1NUQVJUX0RBVEVfVFlQRV9fRU5VTUVSQVRJT05fX1ZBTFVFUy5jb250YWlucyhmeVN0YXJ0RGF0ZVR5cGUpOwotCQlpZiAoIXJlc3VsdCAmJiBkaWFnbm9zdGljcyAhPSBudWxsKSAKLQkJCXJlcG9ydEVudW1lcmF0aW9uVmlvbGF0aW9uKE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldEZZU3RhcnREYXRlVHlwZSgpLCBmeVN0YXJ0RGF0ZVR5cGUsIEZZX1NUQVJUX0RBVEVfVFlQRV9fRU5VTUVSQVRJT05fX1ZBTFVFUywgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OyAKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUdyb3VwVHlwZShTdHJpbmcgZ3JvdXBUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gdmFsaWRhdGVHcm91cFR5cGVfTWF4TGVuZ3RoKGdyb3VwVHlwZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFZhbGlkYXRlcyB0aGUgTWF4TGVuZ3RoIGNvbnN0cmFpbnQgb2YgJzxlbT5Hcm91cCBUeXBlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlR3JvdXBUeXBlX01heExlbmd0aChTdHJpbmcgZ3JvdXBUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWludCBsZW5ndGggPSBncm91cFR5cGUubGVuZ3RoKCk7ICAKLQkJYm9vbGVhbiByZXN1bHQgPSBsZW5ndGggPD0gNTEyOwotCQlpZiAoIXJlc3VsdCAmJiBkaWFnbm9zdGljcyAhPSBudWxsKSAKLQkJCXJlcG9ydE1heExlbmd0aFZpb2xhdGlvbihNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXRHcm91cFR5cGUoKSwgZ3JvdXBUeXBlLCBsZW5ndGgsIDUxMiwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlSHlwZXJsaW5rQWRkcmVzc1R5cGUoU3RyaW5nIGh5cGVybGlua0FkZHJlc3NUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gdmFsaWRhdGVIeXBlcmxpbmtBZGRyZXNzVHlwZV9NYXhMZW5ndGgoaHlwZXJsaW5rQWRkcmVzc1R5cGUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZXMgdGhlIE1heExlbmd0aCBjb25zdHJhaW50IG9mICc8ZW0+SHlwZXJsaW5rIEFkZHJlc3MgVHlwZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUh5cGVybGlua0FkZHJlc3NUeXBlX01heExlbmd0aChTdHJpbmcgaHlwZXJsaW5rQWRkcmVzc1R5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJaW50IGxlbmd0aCA9IGh5cGVybGlua0FkZHJlc3NUeXBlLmxlbmd0aCgpOyAgCi0JCWJvb2xlYW4gcmVzdWx0ID0gbGVuZ3RoIDw9IDUxMjsKLQkJaWYgKCFyZXN1bHQgJiYgZGlhZ25vc3RpY3MgIT0gbnVsbCkgCi0JCQlyZXBvcnRNYXhMZW5ndGhWaW9sYXRpb24oTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0SHlwZXJsaW5rQWRkcmVzc1R5cGUoKSwgaHlwZXJsaW5rQWRkcmVzc1R5cGUsIGxlbmd0aCwgNTEyLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVIeXBlcmxpbmtBZGRyZXNzVHlwZTEoU3RyaW5nIGh5cGVybGlua0FkZHJlc3NUeXBlMSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IHZhbGlkYXRlSHlwZXJsaW5rQWRkcmVzc1R5cGUxX01heExlbmd0aChoeXBlcmxpbmtBZGRyZXNzVHlwZTEsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZXMgdGhlIE1heExlbmd0aCBjb25zdHJhaW50IG9mICc8ZW0+SHlwZXJsaW5rIEFkZHJlc3MgVHlwZTE8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVIeXBlcmxpbmtBZGRyZXNzVHlwZTFfTWF4TGVuZ3RoKFN0cmluZyBoeXBlcmxpbmtBZGRyZXNzVHlwZTEsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJaW50IGxlbmd0aCA9IGh5cGVybGlua0FkZHJlc3NUeXBlMS5sZW5ndGgoKTsgIAotCQlib29sZWFuIHJlc3VsdCA9IGxlbmd0aCA8PSA1MTI7Ci0JCWlmICghcmVzdWx0ICYmIGRpYWdub3N0aWNzICE9IG51bGwpIAotCQkJcmVwb3J0TWF4TGVuZ3RoVmlvbGF0aW9uKE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldEh5cGVybGlua0FkZHJlc3NUeXBlMSgpLCBoeXBlcmxpbmtBZGRyZXNzVHlwZTEsIGxlbmd0aCwgNTEyLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVIeXBlcmxpbmtBZGRyZXNzVHlwZTIoU3RyaW5nIGh5cGVybGlua0FkZHJlc3NUeXBlMiwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IHZhbGlkYXRlSHlwZXJsaW5rQWRkcmVzc1R5cGUyX01heExlbmd0aChoeXBlcmxpbmtBZGRyZXNzVHlwZTIsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZXMgdGhlIE1heExlbmd0aCBjb25zdHJhaW50IG9mICc8ZW0+SHlwZXJsaW5rIEFkZHJlc3MgVHlwZTI8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVIeXBlcmxpbmtBZGRyZXNzVHlwZTJfTWF4TGVuZ3RoKFN0cmluZyBoeXBlcmxpbmtBZGRyZXNzVHlwZTIsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJaW50IGxlbmd0aCA9IGh5cGVybGlua0FkZHJlc3NUeXBlMi5sZW5ndGgoKTsgIAotCQlib29sZWFuIHJlc3VsdCA9IGxlbmd0aCA8PSA1MTI7Ci0JCWlmICghcmVzdWx0ICYmIGRpYWdub3N0aWNzICE9IG51bGwpIAotCQkJcmVwb3J0TWF4TGVuZ3RoVmlvbGF0aW9uKE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldEh5cGVybGlua0FkZHJlc3NUeXBlMigpLCBoeXBlcmxpbmtBZGRyZXNzVHlwZTIsIGxlbmd0aCwgNTEyLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVIeXBlcmxpbmtTdWJBZGRyZXNzVHlwZShTdHJpbmcgaHlwZXJsaW5rU3ViQWRkcmVzc1R5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSB2YWxpZGF0ZUh5cGVybGlua1N1YkFkZHJlc3NUeXBlX01heExlbmd0aChoeXBlcmxpbmtTdWJBZGRyZXNzVHlwZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFZhbGlkYXRlcyB0aGUgTWF4TGVuZ3RoIGNvbnN0cmFpbnQgb2YgJzxlbT5IeXBlcmxpbmsgU3ViIEFkZHJlc3MgVHlwZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUh5cGVybGlua1N1YkFkZHJlc3NUeXBlX01heExlbmd0aChTdHJpbmcgaHlwZXJsaW5rU3ViQWRkcmVzc1R5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJaW50IGxlbmd0aCA9IGh5cGVybGlua1N1YkFkZHJlc3NUeXBlLmxlbmd0aCgpOyAgCi0JCWJvb2xlYW4gcmVzdWx0ID0gbGVuZ3RoIDw9IDUxMjsKLQkJaWYgKCFyZXN1bHQgJiYgZGlhZ25vc3RpY3MgIT0gbnVsbCkgCi0JCQlyZXBvcnRNYXhMZW5ndGhWaW9sYXRpb24oTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0SHlwZXJsaW5rU3ViQWRkcmVzc1R5cGUoKSwgaHlwZXJsaW5rU3ViQWRkcmVzc1R5cGUsIGxlbmd0aCwgNTEyLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVIeXBlcmxpbmtTdWJBZGRyZXNzVHlwZTEoU3RyaW5nIGh5cGVybGlua1N1YkFkZHJlc3NUeXBlMSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IHZhbGlkYXRlSHlwZXJsaW5rU3ViQWRkcmVzc1R5cGUxX01heExlbmd0aChoeXBlcmxpbmtTdWJBZGRyZXNzVHlwZTEsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZXMgdGhlIE1heExlbmd0aCBjb25zdHJhaW50IG9mICc8ZW0+SHlwZXJsaW5rIFN1YiBBZGRyZXNzIFR5cGUxPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlSHlwZXJsaW5rU3ViQWRkcmVzc1R5cGUxX01heExlbmd0aChTdHJpbmcgaHlwZXJsaW5rU3ViQWRkcmVzc1R5cGUxLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWludCBsZW5ndGggPSBoeXBlcmxpbmtTdWJBZGRyZXNzVHlwZTEubGVuZ3RoKCk7ICAKLQkJYm9vbGVhbiByZXN1bHQgPSBsZW5ndGggPD0gNTEyOwotCQlpZiAoIXJlc3VsdCAmJiBkaWFnbm9zdGljcyAhPSBudWxsKSAKLQkJCXJlcG9ydE1heExlbmd0aFZpb2xhdGlvbihNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXRIeXBlcmxpbmtTdWJBZGRyZXNzVHlwZTEoKSwgaHlwZXJsaW5rU3ViQWRkcmVzc1R5cGUxLCBsZW5ndGgsIDUxMiwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlSHlwZXJsaW5rU3ViQWRkcmVzc1R5cGUyKFN0cmluZyBoeXBlcmxpbmtTdWJBZGRyZXNzVHlwZTIsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSB2YWxpZGF0ZUh5cGVybGlua1N1YkFkZHJlc3NUeXBlMl9NYXhMZW5ndGgoaHlwZXJsaW5rU3ViQWRkcmVzc1R5cGUyLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogVmFsaWRhdGVzIHRoZSBNYXhMZW5ndGggY29uc3RyYWludCBvZiAnPGVtPkh5cGVybGluayBTdWIgQWRkcmVzcyBUeXBlMjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUh5cGVybGlua1N1YkFkZHJlc3NUeXBlMl9NYXhMZW5ndGgoU3RyaW5nIGh5cGVybGlua1N1YkFkZHJlc3NUeXBlMiwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlpbnQgbGVuZ3RoID0gaHlwZXJsaW5rU3ViQWRkcmVzc1R5cGUyLmxlbmd0aCgpOyAgCi0JCWJvb2xlYW4gcmVzdWx0ID0gbGVuZ3RoIDw9IDUxMjsKLQkJaWYgKCFyZXN1bHQgJiYgZGlhZ25vc3RpY3MgIT0gbnVsbCkgCi0JCQlyZXBvcnRNYXhMZW5ndGhWaW9sYXRpb24oTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0SHlwZXJsaW5rU3ViQWRkcmVzc1R5cGUyKCksIGh5cGVybGlua1N1YkFkZHJlc3NUeXBlMiwgbGVuZ3RoLCA1MTIsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUh5cGVybGlua1R5cGUoU3RyaW5nIGh5cGVybGlua1R5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSB2YWxpZGF0ZUh5cGVybGlua1R5cGVfTWF4TGVuZ3RoKGh5cGVybGlua1R5cGUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZXMgdGhlIE1heExlbmd0aCBjb25zdHJhaW50IG9mICc8ZW0+SHlwZXJsaW5rIFR5cGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVIeXBlcmxpbmtUeXBlX01heExlbmd0aChTdHJpbmcgaHlwZXJsaW5rVHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlpbnQgbGVuZ3RoID0gaHlwZXJsaW5rVHlwZS5sZW5ndGgoKTsgIAotCQlib29sZWFuIHJlc3VsdCA9IGxlbmd0aCA8PSA1MTI7Ci0JCWlmICghcmVzdWx0ICYmIGRpYWdub3N0aWNzICE9IG51bGwpIAotCQkJcmVwb3J0TWF4TGVuZ3RoVmlvbGF0aW9uKE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldEh5cGVybGlua1R5cGUoKSwgaHlwZXJsaW5rVHlwZSwgbGVuZ3RoLCA1MTIsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUh5cGVybGlua1R5cGUxKFN0cmluZyBoeXBlcmxpbmtUeXBlMSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IHZhbGlkYXRlSHlwZXJsaW5rVHlwZTFfTWF4TGVuZ3RoKGh5cGVybGlua1R5cGUxLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogVmFsaWRhdGVzIHRoZSBNYXhMZW5ndGggY29uc3RyYWludCBvZiAnPGVtPkh5cGVybGluayBUeXBlMTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUh5cGVybGlua1R5cGUxX01heExlbmd0aChTdHJpbmcgaHlwZXJsaW5rVHlwZTEsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJaW50IGxlbmd0aCA9IGh5cGVybGlua1R5cGUxLmxlbmd0aCgpOyAgCi0JCWJvb2xlYW4gcmVzdWx0ID0gbGVuZ3RoIDw9IDUxMjsKLQkJaWYgKCFyZXN1bHQgJiYgZGlhZ25vc3RpY3MgIT0gbnVsbCkgCi0JCQlyZXBvcnRNYXhMZW5ndGhWaW9sYXRpb24oTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0SHlwZXJsaW5rVHlwZTEoKSwgaHlwZXJsaW5rVHlwZTEsIGxlbmd0aCwgNTEyLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVIeXBlcmxpbmtUeXBlMihTdHJpbmcgaHlwZXJsaW5rVHlwZTIsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSB2YWxpZGF0ZUh5cGVybGlua1R5cGUyX01heExlbmd0aChoeXBlcmxpbmtUeXBlMiwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFZhbGlkYXRlcyB0aGUgTWF4TGVuZ3RoIGNvbnN0cmFpbnQgb2YgJzxlbT5IeXBlcmxpbmsgVHlwZTI8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVIeXBlcmxpbmtUeXBlMl9NYXhMZW5ndGgoU3RyaW5nIGh5cGVybGlua1R5cGUyLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWludCBsZW5ndGggPSBoeXBlcmxpbmtUeXBlMi5sZW5ndGgoKTsgIAotCQlib29sZWFuIHJlc3VsdCA9IGxlbmd0aCA8PSA1MTI7Ci0JCWlmICghcmVzdWx0ICYmIGRpYWdub3N0aWNzICE9IG51bGwpIAotCQkJcmVwb3J0TWF4TGVuZ3RoVmlvbGF0aW9uKE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldEh5cGVybGlua1R5cGUyKCksIGh5cGVybGlua1R5cGUyLCBsZW5ndGgsIDUxMiwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlSW5pdGlhbHNUeXBlKFN0cmluZyBpbml0aWFsc1R5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSB2YWxpZGF0ZUluaXRpYWxzVHlwZV9NYXhMZW5ndGgoaW5pdGlhbHNUeXBlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogVmFsaWRhdGVzIHRoZSBNYXhMZW5ndGggY29uc3RyYWludCBvZiAnPGVtPkluaXRpYWxzIFR5cGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVJbml0aWFsc1R5cGVfTWF4TGVuZ3RoKFN0cmluZyBpbml0aWFsc1R5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJaW50IGxlbmd0aCA9IGluaXRpYWxzVHlwZS5sZW5ndGgoKTsgIAotCQlib29sZWFuIHJlc3VsdCA9IGxlbmd0aCA8PSA1MTI7Ci0JCWlmICghcmVzdWx0ICYmIGRpYWdub3N0aWNzICE9IG51bGwpIAotCQkJcmVwb3J0TWF4TGVuZ3RoVmlvbGF0aW9uKE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldEluaXRpYWxzVHlwZSgpLCBpbml0aWFsc1R5cGUsIGxlbmd0aCwgNTEyLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVMYWdGb3JtYXRUeXBlKEJpZ0ludGVnZXIgbGFnRm9ybWF0VHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IHZhbGlkYXRlTGFnRm9ybWF0VHlwZV9FbnVtZXJhdGlvbihsYWdGb3JtYXRUeXBlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQHNlZSAjdmFsaWRhdGVMYWdGb3JtYXRUeXBlX0VudW1lcmF0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDb2xsZWN0aW9uIExBR19GT1JNQVRfVFlQRV9fRU5VTUVSQVRJT05fX1ZBTFVFUyA9Ci0JCXdyYXBFbnVtZXJhdGlvblZhbHVlcwotCQkJKG5ldyBPYmplY3RbXSB7Ci0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIzIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI0IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI1IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI2IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI3IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI4IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI5IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIxMCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMTEiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjEyIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIxOSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMjAiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjM1IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIzNiIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMzciKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjM4IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIzOSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNDAiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjQxIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI0MiIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNDMiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjQ0IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI1MSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNTIiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjUzIikKLQkJCSB9KTsKLQotCS8qKgotCSAqIFZhbGlkYXRlcyB0aGUgRW51bWVyYXRpb24gY29uc3RyYWludCBvZiAnPGVtPkxhZyBGb3JtYXQgVHlwZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUxhZ0Zvcm1hdFR5cGVfRW51bWVyYXRpb24oQmlnSW50ZWdlciBsYWdGb3JtYXRUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gTEFHX0ZPUk1BVF9UWVBFX19FTlVNRVJBVElPTl9fVkFMVUVTLmNvbnRhaW5zKGxhZ0Zvcm1hdFR5cGUpOwotCQlpZiAoIXJlc3VsdCAmJiBkaWFnbm9zdGljcyAhPSBudWxsKSAKLQkJCXJlcG9ydEVudW1lcmF0aW9uVmlvbGF0aW9uKE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldExhZ0Zvcm1hdFR5cGUoKSwgbGFnRm9ybWF0VHlwZSwgTEFHX0ZPUk1BVF9UWVBFX19FTlVNRVJBVElPTl9fVkFMVUVTLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7IAotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlTGV2ZWxpbmdEZWxheUZvcm1hdFR5cGUoQmlnSW50ZWdlciBsZXZlbGluZ0RlbGF5Rm9ybWF0VHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IHZhbGlkYXRlTGV2ZWxpbmdEZWxheUZvcm1hdFR5cGVfRW51bWVyYXRpb24obGV2ZWxpbmdEZWxheUZvcm1hdFR5cGUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAc2VlICN2YWxpZGF0ZUxldmVsaW5nRGVsYXlGb3JtYXRUeXBlX0VudW1lcmF0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDb2xsZWN0aW9uIExFVkVMSU5HX0RFTEFZX0ZPUk1BVF9UWVBFX19FTlVNRVJBVElPTl9fVkFMVUVTID0KLQkJd3JhcEVudW1lcmF0aW9uVmFsdWVzCi0JCQkobmV3IE9iamVjdFtdIHsKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjMiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjQiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjUiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjYiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjciKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjgiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjkiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjEwIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIxMSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMTIiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjE5IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIyMCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMjEiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjM1IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIzNiIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMzciKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjM4IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIzOSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNDAiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjQxIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI0MiIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNDMiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjQ0IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI1MSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNTIiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjUzIikKLQkJCSB9KTsKLQotCS8qKgotCSAqIFZhbGlkYXRlcyB0aGUgRW51bWVyYXRpb24gY29uc3RyYWludCBvZiAnPGVtPkxldmVsaW5nIERlbGF5IEZvcm1hdCBUeXBlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlTGV2ZWxpbmdEZWxheUZvcm1hdFR5cGVfRW51bWVyYXRpb24oQmlnSW50ZWdlciBsZXZlbGluZ0RlbGF5Rm9ybWF0VHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IExFVkVMSU5HX0RFTEFZX0ZPUk1BVF9UWVBFX19FTlVNRVJBVElPTl9fVkFMVUVTLmNvbnRhaW5zKGxldmVsaW5nRGVsYXlGb3JtYXRUeXBlKTsKLQkJaWYgKCFyZXN1bHQgJiYgZGlhZ25vc3RpY3MgIT0gbnVsbCkgCi0JCQlyZXBvcnRFbnVtZXJhdGlvblZpb2xhdGlvbihNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXRMZXZlbGluZ0RlbGF5Rm9ybWF0VHlwZSgpLCBsZXZlbGluZ0RlbGF5Rm9ybWF0VHlwZSwgTEVWRUxJTkdfREVMQVlfRk9STUFUX1RZUEVfX0VOVU1FUkFUSU9OX19WQUxVRVMsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsgCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVMZXZlbGluZ0RlbGF5Rm9ybWF0VHlwZTEoQmlnSW50ZWdlciBsZXZlbGluZ0RlbGF5Rm9ybWF0VHlwZTEsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSB2YWxpZGF0ZUxldmVsaW5nRGVsYXlGb3JtYXRUeXBlMV9FbnVtZXJhdGlvbihsZXZlbGluZ0RlbGF5Rm9ybWF0VHlwZTEsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAc2VlICN2YWxpZGF0ZUxldmVsaW5nRGVsYXlGb3JtYXRUeXBlMV9FbnVtZXJhdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29sbGVjdGlvbiBMRVZFTElOR19ERUxBWV9GT1JNQVRfVFlQRTFfX0VOVU1FUkFUSU9OX19WQUxVRVMgPQotCQl3cmFwRW51bWVyYXRpb25WYWx1ZXMKLQkJCShuZXcgT2JqZWN0W10gewotCQkJCSBuZXcgQmlnSW50ZWdlcigiMyIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNiIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNyIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiOCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiOSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMTAiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjExIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIxMiIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMTkiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjIwIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIyMSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMzUiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjM2IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIzNyIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMzgiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjM5IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI0MCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNDEiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjQyIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI0MyIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNDQiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjUxIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI1MiIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNTMiKQotCQkJIH0pOwotCi0JLyoqCi0JICogVmFsaWRhdGVzIHRoZSBFbnVtZXJhdGlvbiBjb25zdHJhaW50IG9mICc8ZW0+TGV2ZWxpbmcgRGVsYXkgRm9ybWF0IFR5cGUxPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlTGV2ZWxpbmdEZWxheUZvcm1hdFR5cGUxX0VudW1lcmF0aW9uKEJpZ0ludGVnZXIgbGV2ZWxpbmdEZWxheUZvcm1hdFR5cGUxLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gTEVWRUxJTkdfREVMQVlfRk9STUFUX1RZUEUxX19FTlVNRVJBVElPTl9fVkFMVUVTLmNvbnRhaW5zKGxldmVsaW5nRGVsYXlGb3JtYXRUeXBlMSk7Ci0JCWlmICghcmVzdWx0ICYmIGRpYWdub3N0aWNzICE9IG51bGwpIAotCQkJcmVwb3J0RW51bWVyYXRpb25WaW9sYXRpb24oTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0TGV2ZWxpbmdEZWxheUZvcm1hdFR5cGUxKCksIGxldmVsaW5nRGVsYXlGb3JtYXRUeXBlMSwgTEVWRUxJTkdfREVMQVlfRk9STUFUX1RZUEUxX19FTlVNRVJBVElPTl9fVkFMVUVTLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7IAotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlTWFuYWdlclR5cGUoU3RyaW5nIG1hbmFnZXJUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gdmFsaWRhdGVNYW5hZ2VyVHlwZV9NYXhMZW5ndGgobWFuYWdlclR5cGUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZXMgdGhlIE1heExlbmd0aCBjb25zdHJhaW50IG9mICc8ZW0+TWFuYWdlciBUeXBlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlTWFuYWdlclR5cGVfTWF4TGVuZ3RoKFN0cmluZyBtYW5hZ2VyVHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlpbnQgbGVuZ3RoID0gbWFuYWdlclR5cGUubGVuZ3RoKCk7ICAKLQkJYm9vbGVhbiByZXN1bHQgPSBsZW5ndGggPD0gNTEyOwotCQlpZiAoIXJlc3VsdCAmJiBkaWFnbm9zdGljcyAhPSBudWxsKSAKLQkJCXJlcG9ydE1heExlbmd0aFZpb2xhdGlvbihNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXRNYW5hZ2VyVHlwZSgpLCBtYW5hZ2VyVHlwZSwgbGVuZ3RoLCA1MTIsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZU1hdGVyaWFsTGFiZWxUeXBlKFN0cmluZyBtYXRlcmlhbExhYmVsVHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IHZhbGlkYXRlTWF0ZXJpYWxMYWJlbFR5cGVfTWF4TGVuZ3RoKG1hdGVyaWFsTGFiZWxUeXBlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogVmFsaWRhdGVzIHRoZSBNYXhMZW5ndGggY29uc3RyYWludCBvZiAnPGVtPk1hdGVyaWFsIExhYmVsIFR5cGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVNYXRlcmlhbExhYmVsVHlwZV9NYXhMZW5ndGgoU3RyaW5nIG1hdGVyaWFsTGFiZWxUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWludCBsZW5ndGggPSBtYXRlcmlhbExhYmVsVHlwZS5sZW5ndGgoKTsgIAotCQlib29sZWFuIHJlc3VsdCA9IGxlbmd0aCA8PSA1MTI7Ci0JCWlmICghcmVzdWx0ICYmIGRpYWdub3N0aWNzICE9IG51bGwpIAotCQkJcmVwb3J0TWF4TGVuZ3RoVmlvbGF0aW9uKE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldE1hdGVyaWFsTGFiZWxUeXBlKCksIG1hdGVyaWFsTGFiZWxUeXBlLCBsZW5ndGgsIDUxMiwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlTmFtZVR5cGUoU3RyaW5nIG5hbWVUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gdmFsaWRhdGVOYW1lVHlwZV9NYXhMZW5ndGgobmFtZVR5cGUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZXMgdGhlIE1heExlbmd0aCBjb25zdHJhaW50IG9mICc8ZW0+TmFtZSBUeXBlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlTmFtZVR5cGVfTWF4TGVuZ3RoKFN0cmluZyBuYW1lVHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlpbnQgbGVuZ3RoID0gbmFtZVR5cGUubGVuZ3RoKCk7ICAKLQkJYm9vbGVhbiByZXN1bHQgPSBsZW5ndGggPD0gNTEyOwotCQlpZiAoIXJlc3VsdCAmJiBkaWFnbm9zdGljcyAhPSBudWxsKSAKLQkJCXJlcG9ydE1heExlbmd0aFZpb2xhdGlvbihNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXROYW1lVHlwZSgpLCBuYW1lVHlwZSwgbGVuZ3RoLCA1MTIsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZU5hbWVUeXBlMShTdHJpbmcgbmFtZVR5cGUxLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gdmFsaWRhdGVOYW1lVHlwZTFfTWF4TGVuZ3RoKG5hbWVUeXBlMSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFZhbGlkYXRlcyB0aGUgTWF4TGVuZ3RoIGNvbnN0cmFpbnQgb2YgJzxlbT5OYW1lIFR5cGUxPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlTmFtZVR5cGUxX01heExlbmd0aChTdHJpbmcgbmFtZVR5cGUxLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWludCBsZW5ndGggPSBuYW1lVHlwZTEubGVuZ3RoKCk7ICAKLQkJYm9vbGVhbiByZXN1bHQgPSBsZW5ndGggPD0gNTEyOwotCQlpZiAoIXJlc3VsdCAmJiBkaWFnbm9zdGljcyAhPSBudWxsKSAKLQkJCXJlcG9ydE1heExlbmd0aFZpb2xhdGlvbihNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXROYW1lVHlwZTEoKSwgbmFtZVR5cGUxLCBsZW5ndGgsIDUxMiwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlTmFtZVR5cGUyKFN0cmluZyBuYW1lVHlwZTIsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSB2YWxpZGF0ZU5hbWVUeXBlMl9NYXhMZW5ndGgobmFtZVR5cGUyLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogVmFsaWRhdGVzIHRoZSBNYXhMZW5ndGggY29uc3RyYWludCBvZiAnPGVtPk5hbWUgVHlwZTI8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVOYW1lVHlwZTJfTWF4TGVuZ3RoKFN0cmluZyBuYW1lVHlwZTIsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJaW50IGxlbmd0aCA9IG5hbWVUeXBlMi5sZW5ndGgoKTsgIAotCQlib29sZWFuIHJlc3VsdCA9IGxlbmd0aCA8PSA1MTI7Ci0JCWlmICghcmVzdWx0ICYmIGRpYWdub3N0aWNzICE9IG51bGwpIAotCQkJcmVwb3J0TWF4TGVuZ3RoVmlvbGF0aW9uKE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldE5hbWVUeXBlMigpLCBuYW1lVHlwZTIsIGxlbmd0aCwgNTEyLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVOYW1lVHlwZTMoU3RyaW5nIG5hbWVUeXBlMywgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IHZhbGlkYXRlTmFtZVR5cGUzX01heExlbmd0aChuYW1lVHlwZTMsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZXMgdGhlIE1heExlbmd0aCBjb25zdHJhaW50IG9mICc8ZW0+TmFtZSBUeXBlMzwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZU5hbWVUeXBlM19NYXhMZW5ndGgoU3RyaW5nIG5hbWVUeXBlMywgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlpbnQgbGVuZ3RoID0gbmFtZVR5cGUzLmxlbmd0aCgpOyAgCi0JCWJvb2xlYW4gcmVzdWx0ID0gbGVuZ3RoIDw9IDI1NTsKLQkJaWYgKCFyZXN1bHQgJiYgZGlhZ25vc3RpY3MgIT0gbnVsbCkgCi0JCQlyZXBvcnRNYXhMZW5ndGhWaW9sYXRpb24oTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0TmFtZVR5cGUzKCksIG5hbWVUeXBlMywgbGVuZ3RoLCAyNTUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZU5ld1Rhc2tTdGFydERhdGVUeXBlKEJpZ0ludGVnZXIgbmV3VGFza1N0YXJ0RGF0ZVR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSB2YWxpZGF0ZU5ld1Rhc2tTdGFydERhdGVUeXBlX0VudW1lcmF0aW9uKG5ld1Rhc2tTdGFydERhdGVUeXBlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQHNlZSAjdmFsaWRhdGVOZXdUYXNrU3RhcnREYXRlVHlwZV9FbnVtZXJhdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29sbGVjdGlvbiBORVdfVEFTS19TVEFSVF9EQVRFX1RZUEVfX0VOVU1FUkFUSU9OX19WQUxVRVMgPQotCQl3cmFwRW51bWVyYXRpb25WYWx1ZXMKLQkJCShuZXcgT2JqZWN0W10gewotCQkJCSBuZXcgQmlnSW50ZWdlcigiMCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMSIpCi0JCQkgfSk7Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZXMgdGhlIEVudW1lcmF0aW9uIGNvbnN0cmFpbnQgb2YgJzxlbT5OZXcgVGFzayBTdGFydCBEYXRlIFR5cGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVOZXdUYXNrU3RhcnREYXRlVHlwZV9FbnVtZXJhdGlvbihCaWdJbnRlZ2VyIG5ld1Rhc2tTdGFydERhdGVUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gTkVXX1RBU0tfU1RBUlRfREFURV9UWVBFX19FTlVNRVJBVElPTl9fVkFMVUVTLmNvbnRhaW5zKG5ld1Rhc2tTdGFydERhdGVUeXBlKTsKLQkJaWYgKCFyZXN1bHQgJiYgZGlhZ25vc3RpY3MgIT0gbnVsbCkgCi0JCQlyZXBvcnRFbnVtZXJhdGlvblZpb2xhdGlvbihNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXROZXdUYXNrU3RhcnREYXRlVHlwZSgpLCBuZXdUYXNrU3RhcnREYXRlVHlwZSwgTkVXX1RBU0tfU1RBUlRfREFURV9UWVBFX19FTlVNRVJBVElPTl9fVkFMVUVTLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7IAotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlTlRBY2NvdW50VHlwZShTdHJpbmcgbnRBY2NvdW50VHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IHZhbGlkYXRlTlRBY2NvdW50VHlwZV9NYXhMZW5ndGgobnRBY2NvdW50VHlwZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFZhbGlkYXRlcyB0aGUgTWF4TGVuZ3RoIGNvbnN0cmFpbnQgb2YgJzxlbT5OVCBBY2NvdW50IFR5cGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVOVEFjY291bnRUeXBlX01heExlbmd0aChTdHJpbmcgbnRBY2NvdW50VHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlpbnQgbGVuZ3RoID0gbnRBY2NvdW50VHlwZS5sZW5ndGgoKTsgIAotCQlib29sZWFuIHJlc3VsdCA9IGxlbmd0aCA8PSA1MTI7Ci0JCWlmICghcmVzdWx0ICYmIGRpYWdub3N0aWNzICE9IG51bGwpIAotCQkJcmVwb3J0TWF4TGVuZ3RoVmlvbGF0aW9uKE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldE5UQWNjb3VudFR5cGUoKSwgbnRBY2NvdW50VHlwZSwgbGVuZ3RoLCA1MTIsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZU91dGxpbmVOdW1iZXJUeXBlKFN0cmluZyBvdXRsaW5lTnVtYmVyVHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IHZhbGlkYXRlT3V0bGluZU51bWJlclR5cGVfTWF4TGVuZ3RoKG91dGxpbmVOdW1iZXJUeXBlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogVmFsaWRhdGVzIHRoZSBNYXhMZW5ndGggY29uc3RyYWludCBvZiAnPGVtPk91dGxpbmUgTnVtYmVyIFR5cGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVPdXRsaW5lTnVtYmVyVHlwZV9NYXhMZW5ndGgoU3RyaW5nIG91dGxpbmVOdW1iZXJUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWludCBsZW5ndGggPSBvdXRsaW5lTnVtYmVyVHlwZS5sZW5ndGgoKTsgIAotCQlib29sZWFuIHJlc3VsdCA9IGxlbmd0aCA8PSA1MTI7Ci0JCWlmICghcmVzdWx0ICYmIGRpYWdub3N0aWNzICE9IG51bGwpIAotCQkJcmVwb3J0TWF4TGVuZ3RoVmlvbGF0aW9uKE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldE91dGxpbmVOdW1iZXJUeXBlKCksIG91dGxpbmVOdW1iZXJUeXBlLCBsZW5ndGgsIDUxMiwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlT3ZlcnRpbWVSYXRlRm9ybWF0VHlwZShCaWdJbnRlZ2VyIG92ZXJ0aW1lUmF0ZUZvcm1hdFR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSB2YWxpZGF0ZU92ZXJ0aW1lUmF0ZUZvcm1hdFR5cGVfRW51bWVyYXRpb24ob3ZlcnRpbWVSYXRlRm9ybWF0VHlwZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBzZWUgI3ZhbGlkYXRlT3ZlcnRpbWVSYXRlRm9ybWF0VHlwZV9FbnVtZXJhdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29sbGVjdGlvbiBPVkVSVElNRV9SQVRFX0ZPUk1BVF9UWVBFX19FTlVNRVJBVElPTl9fVkFMVUVTID0KLQkJd3JhcEVudW1lcmF0aW9uVmFsdWVzCi0JCQkobmV3IE9iamVjdFtdIHsKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjEiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjIiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjMiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjQiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjUiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjciKQotCQkJIH0pOwotCi0JLyoqCi0JICogVmFsaWRhdGVzIHRoZSBFbnVtZXJhdGlvbiBjb25zdHJhaW50IG9mICc8ZW0+T3ZlcnRpbWUgUmF0ZSBGb3JtYXQgVHlwZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZU92ZXJ0aW1lUmF0ZUZvcm1hdFR5cGVfRW51bWVyYXRpb24oQmlnSW50ZWdlciBvdmVydGltZVJhdGVGb3JtYXRUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gT1ZFUlRJTUVfUkFURV9GT1JNQVRfVFlQRV9fRU5VTUVSQVRJT05fX1ZBTFVFUy5jb250YWlucyhvdmVydGltZVJhdGVGb3JtYXRUeXBlKTsKLQkJaWYgKCFyZXN1bHQgJiYgZGlhZ25vc3RpY3MgIT0gbnVsbCkgCi0JCQlyZXBvcnRFbnVtZXJhdGlvblZpb2xhdGlvbihNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXRPdmVydGltZVJhdGVGb3JtYXRUeXBlKCksIG92ZXJ0aW1lUmF0ZUZvcm1hdFR5cGUsIE9WRVJUSU1FX1JBVEVfRk9STUFUX1RZUEVfX0VOVU1FUkFUSU9OX19WQUxVRVMsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsgCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVPdmVydGltZVJhdGVGb3JtYXRUeXBlMShCaWdJbnRlZ2VyIG92ZXJ0aW1lUmF0ZUZvcm1hdFR5cGUxLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gdmFsaWRhdGVPdmVydGltZVJhdGVGb3JtYXRUeXBlMV9FbnVtZXJhdGlvbihvdmVydGltZVJhdGVGb3JtYXRUeXBlMSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBzZWUgI3ZhbGlkYXRlT3ZlcnRpbWVSYXRlRm9ybWF0VHlwZTFfRW51bWVyYXRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENvbGxlY3Rpb24gT1ZFUlRJTUVfUkFURV9GT1JNQVRfVFlQRTFfX0VOVU1FUkFUSU9OX19WQUxVRVMgPQotCQl3cmFwRW51bWVyYXRpb25WYWx1ZXMKLQkJCShuZXcgT2JqZWN0W10gewotCQkJCSBuZXcgQmlnSW50ZWdlcigiMSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMiIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMyIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNyIpCi0JCQkgfSk7Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZXMgdGhlIEVudW1lcmF0aW9uIGNvbnN0cmFpbnQgb2YgJzxlbT5PdmVydGltZSBSYXRlIEZvcm1hdCBUeXBlMTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZU92ZXJ0aW1lUmF0ZUZvcm1hdFR5cGUxX0VudW1lcmF0aW9uKEJpZ0ludGVnZXIgb3ZlcnRpbWVSYXRlRm9ybWF0VHlwZTEsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBPVkVSVElNRV9SQVRFX0ZPUk1BVF9UWVBFMV9fRU5VTUVSQVRJT05fX1ZBTFVFUy5jb250YWlucyhvdmVydGltZVJhdGVGb3JtYXRUeXBlMSk7Ci0JCWlmICghcmVzdWx0ICYmIGRpYWdub3N0aWNzICE9IG51bGwpIAotCQkJcmVwb3J0RW51bWVyYXRpb25WaW9sYXRpb24oTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0T3ZlcnRpbWVSYXRlRm9ybWF0VHlwZTEoKSwgb3ZlcnRpbWVSYXRlRm9ybWF0VHlwZTEsIE9WRVJUSU1FX1JBVEVfRk9STUFUX1RZUEUxX19FTlVNRVJBVElPTl9fVkFMVUVTLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7IAotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlUGhvbmV0aWNBbGlhc1R5cGUoU3RyaW5nIHBob25ldGljQWxpYXNUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gdmFsaWRhdGVQaG9uZXRpY0FsaWFzVHlwZV9NYXhMZW5ndGgocGhvbmV0aWNBbGlhc1R5cGUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZXMgdGhlIE1heExlbmd0aCBjb25zdHJhaW50IG9mICc8ZW0+UGhvbmV0aWMgQWxpYXMgVHlwZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZVBob25ldGljQWxpYXNUeXBlX01heExlbmd0aChTdHJpbmcgcGhvbmV0aWNBbGlhc1R5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJaW50IGxlbmd0aCA9IHBob25ldGljQWxpYXNUeXBlLmxlbmd0aCgpOyAgCi0JCWJvb2xlYW4gcmVzdWx0ID0gbGVuZ3RoIDw9IDUwOwotCQlpZiAoIXJlc3VsdCAmJiBkaWFnbm9zdGljcyAhPSBudWxsKSAKLQkJCXJlcG9ydE1heExlbmd0aFZpb2xhdGlvbihNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXRQaG9uZXRpY0FsaWFzVHlwZSgpLCBwaG9uZXRpY0FsaWFzVHlwZSwgbGVuZ3RoLCA1MCwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlUGhvbmV0aWNzVHlwZShTdHJpbmcgcGhvbmV0aWNzVHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IHZhbGlkYXRlUGhvbmV0aWNzVHlwZV9NYXhMZW5ndGgocGhvbmV0aWNzVHlwZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFZhbGlkYXRlcyB0aGUgTWF4TGVuZ3RoIGNvbnN0cmFpbnQgb2YgJzxlbT5QaG9uZXRpY3MgVHlwZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZVBob25ldGljc1R5cGVfTWF4TGVuZ3RoKFN0cmluZyBwaG9uZXRpY3NUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWludCBsZW5ndGggPSBwaG9uZXRpY3NUeXBlLmxlbmd0aCgpOyAgCi0JCWJvb2xlYW4gcmVzdWx0ID0gbGVuZ3RoIDw9IDUxMjsKLQkJaWYgKCFyZXN1bHQgJiYgZGlhZ25vc3RpY3MgIT0gbnVsbCkgCi0JCQlyZXBvcnRNYXhMZW5ndGhWaW9sYXRpb24oTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0UGhvbmV0aWNzVHlwZSgpLCBwaG9uZXRpY3NUeXBlLCBsZW5ndGgsIDUxMiwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlUHJlZml4VHlwZShTdHJpbmcgcHJlZml4VHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IHZhbGlkYXRlUHJlZml4VHlwZV9NYXhMZW5ndGgocHJlZml4VHlwZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFZhbGlkYXRlcyB0aGUgTWF4TGVuZ3RoIGNvbnN0cmFpbnQgb2YgJzxlbT5QcmVmaXggVHlwZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZVByZWZpeFR5cGVfTWF4TGVuZ3RoKFN0cmluZyBwcmVmaXhUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWludCBsZW5ndGggPSBwcmVmaXhUeXBlLmxlbmd0aCgpOyAgCi0JCWJvb2xlYW4gcmVzdWx0ID0gbGVuZ3RoIDw9IDUwOwotCQlpZiAoIXJlc3VsdCAmJiBkaWFnbm9zdGljcyAhPSBudWxsKSAKLQkJCXJlcG9ydE1heExlbmd0aFZpb2xhdGlvbihNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXRQcmVmaXhUeXBlKCksIHByZWZpeFR5cGUsIGxlbmd0aCwgNTAsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZVJhdGVUYWJsZVR5cGUoQmlnSW50ZWdlciByYXRlVGFibGVUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gdmFsaWRhdGVSYXRlVGFibGVUeXBlX0VudW1lcmF0aW9uKHJhdGVUYWJsZVR5cGUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAc2VlICN2YWxpZGF0ZVJhdGVUYWJsZVR5cGVfRW51bWVyYXRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENvbGxlY3Rpb24gUkFURV9UQUJMRV9UWVBFX19FTlVNRVJBVElPTl9fVkFMVUVTID0KLQkJd3JhcEVudW1lcmF0aW9uVmFsdWVzCi0JCQkobmV3IE9iamVjdFtdIHsKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjAiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjEiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjIiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjMiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjQiKQotCQkJIH0pOwotCi0JLyoqCi0JICogVmFsaWRhdGVzIHRoZSBFbnVtZXJhdGlvbiBjb25zdHJhaW50IG9mICc8ZW0+UmF0ZSBUYWJsZSBUeXBlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlUmF0ZVRhYmxlVHlwZV9FbnVtZXJhdGlvbihCaWdJbnRlZ2VyIHJhdGVUYWJsZVR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBSQVRFX1RBQkxFX1RZUEVfX0VOVU1FUkFUSU9OX19WQUxVRVMuY29udGFpbnMocmF0ZVRhYmxlVHlwZSk7Ci0JCWlmICghcmVzdWx0ICYmIGRpYWdub3N0aWNzICE9IG51bGwpIAotCQkJcmVwb3J0RW51bWVyYXRpb25WaW9sYXRpb24oTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0UmF0ZVRhYmxlVHlwZSgpLCByYXRlVGFibGVUeXBlLCBSQVRFX1RBQkxFX1RZUEVfX0VOVU1FUkFUSU9OX19WQUxVRVMsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsgCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVSb2xsdXBUeXBlVHlwZShCaWdJbnRlZ2VyIHJvbGx1cFR5cGVUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gdmFsaWRhdGVSb2xsdXBUeXBlVHlwZV9FbnVtZXJhdGlvbihyb2xsdXBUeXBlVHlwZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBzZWUgI3ZhbGlkYXRlUm9sbHVwVHlwZVR5cGVfRW51bWVyYXRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENvbGxlY3Rpb24gUk9MTFVQX1RZUEVfVFlQRV9fRU5VTUVSQVRJT05fX1ZBTFVFUyA9Ci0JCXdyYXBFbnVtZXJhdGlvblZhbHVlcwotCQkJKG5ldyBPYmplY3RbXSB7Ci0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIwIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIxIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIyIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIzIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI0IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI1IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI2IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI3IikKLQkJCSB9KTsKLQotCS8qKgotCSAqIFZhbGlkYXRlcyB0aGUgRW51bWVyYXRpb24gY29uc3RyYWludCBvZiAnPGVtPlJvbGx1cCBUeXBlIFR5cGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVSb2xsdXBUeXBlVHlwZV9FbnVtZXJhdGlvbihCaWdJbnRlZ2VyIHJvbGx1cFR5cGVUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gUk9MTFVQX1RZUEVfVFlQRV9fRU5VTUVSQVRJT05fX1ZBTFVFUy5jb250YWlucyhyb2xsdXBUeXBlVHlwZSk7Ci0JCWlmICghcmVzdWx0ICYmIGRpYWdub3N0aWNzICE9IG51bGwpIAotCQkJcmVwb3J0RW51bWVyYXRpb25WaW9sYXRpb24oTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0Um9sbHVwVHlwZVR5cGUoKSwgcm9sbHVwVHlwZVR5cGUsIFJPTExVUF9UWVBFX1RZUEVfX0VOVU1FUkFUSU9OX19WQUxVRVMsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsgCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVTdGFuZGFyZFJhdGVGb3JtYXRUeXBlKEJpZ0ludGVnZXIgc3RhbmRhcmRSYXRlRm9ybWF0VHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IHZhbGlkYXRlU3RhbmRhcmRSYXRlRm9ybWF0VHlwZV9FbnVtZXJhdGlvbihzdGFuZGFyZFJhdGVGb3JtYXRUeXBlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQHNlZSAjdmFsaWRhdGVTdGFuZGFyZFJhdGVGb3JtYXRUeXBlX0VudW1lcmF0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDb2xsZWN0aW9uIFNUQU5EQVJEX1JBVEVfRk9STUFUX1RZUEVfX0VOVU1FUkFUSU9OX19WQUxVRVMgPQotCQl3cmFwRW51bWVyYXRpb25WYWx1ZXMKLQkJCShuZXcgT2JqZWN0W10gewotCQkJCSBuZXcgQmlnSW50ZWdlcigiMSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMiIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMyIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNyIpCi0JCQkgfSk7Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZXMgdGhlIEVudW1lcmF0aW9uIGNvbnN0cmFpbnQgb2YgJzxlbT5TdGFuZGFyZCBSYXRlIEZvcm1hdCBUeXBlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlU3RhbmRhcmRSYXRlRm9ybWF0VHlwZV9FbnVtZXJhdGlvbihCaWdJbnRlZ2VyIHN0YW5kYXJkUmF0ZUZvcm1hdFR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBTVEFOREFSRF9SQVRFX0ZPUk1BVF9UWVBFX19FTlVNRVJBVElPTl9fVkFMVUVTLmNvbnRhaW5zKHN0YW5kYXJkUmF0ZUZvcm1hdFR5cGUpOwotCQlpZiAoIXJlc3VsdCAmJiBkaWFnbm9zdGljcyAhPSBudWxsKSAKLQkJCXJlcG9ydEVudW1lcmF0aW9uVmlvbGF0aW9uKE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldFN0YW5kYXJkUmF0ZUZvcm1hdFR5cGUoKSwgc3RhbmRhcmRSYXRlRm9ybWF0VHlwZSwgU1RBTkRBUkRfUkFURV9GT1JNQVRfVFlQRV9fRU5VTUVSQVRJT05fX1ZBTFVFUywgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OyAKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZVN0YW5kYXJkUmF0ZUZvcm1hdFR5cGUxKEJpZ0ludGVnZXIgc3RhbmRhcmRSYXRlRm9ybWF0VHlwZTEsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSB2YWxpZGF0ZVN0YW5kYXJkUmF0ZUZvcm1hdFR5cGUxX0VudW1lcmF0aW9uKHN0YW5kYXJkUmF0ZUZvcm1hdFR5cGUxLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQHNlZSAjdmFsaWRhdGVTdGFuZGFyZFJhdGVGb3JtYXRUeXBlMV9FbnVtZXJhdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29sbGVjdGlvbiBTVEFOREFSRF9SQVRFX0ZPUk1BVF9UWVBFMV9fRU5VTUVSQVRJT05fX1ZBTFVFUyA9Ci0JCXdyYXBFbnVtZXJhdGlvblZhbHVlcwotCQkJKG5ldyBPYmplY3RbXSB7Ci0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIxIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIyIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIzIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI0IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI1IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI3IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI4IikKLQkJCSB9KTsKLQotCS8qKgotCSAqIFZhbGlkYXRlcyB0aGUgRW51bWVyYXRpb24gY29uc3RyYWludCBvZiAnPGVtPlN0YW5kYXJkIFJhdGUgRm9ybWF0IFR5cGUxPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlU3RhbmRhcmRSYXRlRm9ybWF0VHlwZTFfRW51bWVyYXRpb24oQmlnSW50ZWdlciBzdGFuZGFyZFJhdGVGb3JtYXRUeXBlMSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IFNUQU5EQVJEX1JBVEVfRk9STUFUX1RZUEUxX19FTlVNRVJBVElPTl9fVkFMVUVTLmNvbnRhaW5zKHN0YW5kYXJkUmF0ZUZvcm1hdFR5cGUxKTsKLQkJaWYgKCFyZXN1bHQgJiYgZGlhZ25vc3RpY3MgIT0gbnVsbCkgCi0JCQlyZXBvcnRFbnVtZXJhdGlvblZpb2xhdGlvbihNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdGFuZGFyZFJhdGVGb3JtYXRUeXBlMSgpLCBzdGFuZGFyZFJhdGVGb3JtYXRUeXBlMSwgU1RBTkRBUkRfUkFURV9GT1JNQVRfVFlQRTFfX0VOVU1FUkFUSU9OX19WQUxVRVMsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsgCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVTdWJqZWN0VHlwZShTdHJpbmcgc3ViamVjdFR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSB2YWxpZGF0ZVN1YmplY3RUeXBlX01heExlbmd0aChzdWJqZWN0VHlwZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFZhbGlkYXRlcyB0aGUgTWF4TGVuZ3RoIGNvbnN0cmFpbnQgb2YgJzxlbT5TdWJqZWN0IFR5cGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVTdWJqZWN0VHlwZV9NYXhMZW5ndGgoU3RyaW5nIHN1YmplY3RUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWludCBsZW5ndGggPSBzdWJqZWN0VHlwZS5sZW5ndGgoKTsgIAotCQlib29sZWFuIHJlc3VsdCA9IGxlbmd0aCA8PSA1MTI7Ci0JCWlmICghcmVzdWx0ICYmIGRpYWdub3N0aWNzICE9IG51bGwpIAotCQkJcmVwb3J0TWF4TGVuZ3RoVmlvbGF0aW9uKE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldFN1YmplY3RUeXBlKCksIHN1YmplY3RUeXBlLCBsZW5ndGgsIDUxMiwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlU3VicHJvamVjdE5hbWVUeXBlKFN0cmluZyBzdWJwcm9qZWN0TmFtZVR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSB2YWxpZGF0ZVN1YnByb2plY3ROYW1lVHlwZV9NYXhMZW5ndGgoc3VicHJvamVjdE5hbWVUeXBlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogVmFsaWRhdGVzIHRoZSBNYXhMZW5ndGggY29uc3RyYWludCBvZiAnPGVtPlN1YnByb2plY3QgTmFtZSBUeXBlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlU3VicHJvamVjdE5hbWVUeXBlX01heExlbmd0aChTdHJpbmcgc3VicHJvamVjdE5hbWVUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWludCBsZW5ndGggPSBzdWJwcm9qZWN0TmFtZVR5cGUubGVuZ3RoKCk7ICAKLQkJYm9vbGVhbiByZXN1bHQgPSBsZW5ndGggPD0gNTEyOwotCQlpZiAoIXJlc3VsdCAmJiBkaWFnbm9zdGljcyAhPSBudWxsKSAKLQkJCXJlcG9ydE1heExlbmd0aFZpb2xhdGlvbihNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdWJwcm9qZWN0TmFtZVR5cGUoKSwgc3VicHJvamVjdE5hbWVUeXBlLCBsZW5ndGgsIDUxMiwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlVGl0bGVUeXBlKFN0cmluZyB0aXRsZVR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSB2YWxpZGF0ZVRpdGxlVHlwZV9NYXhMZW5ndGgodGl0bGVUeXBlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogVmFsaWRhdGVzIHRoZSBNYXhMZW5ndGggY29uc3RyYWludCBvZiAnPGVtPlRpdGxlIFR5cGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVUaXRsZVR5cGVfTWF4TGVuZ3RoKFN0cmluZyB0aXRsZVR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJaW50IGxlbmd0aCA9IHRpdGxlVHlwZS5sZW5ndGgoKTsgIAotCQlib29sZWFuIHJlc3VsdCA9IGxlbmd0aCA8PSA1MTI7Ci0JCWlmICghcmVzdWx0ICYmIGRpYWdub3N0aWNzICE9IG51bGwpIAotCQkJcmVwb3J0TWF4TGVuZ3RoVmlvbGF0aW9uKE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldFRpdGxlVHlwZSgpLCB0aXRsZVR5cGUsIGxlbmd0aCwgNTEyLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVUeXBlVHlwZShCaWdJbnRlZ2VyIHR5cGVUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gdmFsaWRhdGVUeXBlVHlwZV9FbnVtZXJhdGlvbih0eXBlVHlwZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBzZWUgI3ZhbGlkYXRlVHlwZVR5cGVfRW51bWVyYXRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENvbGxlY3Rpb24gVFlQRV9UWVBFX19FTlVNRVJBVElPTl9fVkFMVUVTID0KLQkJd3JhcEVudW1lcmF0aW9uVmFsdWVzCi0JCQkobmV3IE9iamVjdFtdIHsKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjAiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjEiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjIiKQotCQkJIH0pOwotCi0JLyoqCi0JICogVmFsaWRhdGVzIHRoZSBFbnVtZXJhdGlvbiBjb25zdHJhaW50IG9mICc8ZW0+VHlwZSBUeXBlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlVHlwZVR5cGVfRW51bWVyYXRpb24oQmlnSW50ZWdlciB0eXBlVHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IFRZUEVfVFlQRV9fRU5VTUVSQVRJT05fX1ZBTFVFUy5jb250YWlucyh0eXBlVHlwZSk7Ci0JCWlmICghcmVzdWx0ICYmIGRpYWdub3N0aWNzICE9IG51bGwpIAotCQkJcmVwb3J0RW51bWVyYXRpb25WaW9sYXRpb24oTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0VHlwZVR5cGUoKSwgdHlwZVR5cGUsIFRZUEVfVFlQRV9fRU5VTUVSQVRJT05fX1ZBTFVFUywgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OyAKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZVR5cGVUeXBlMShCaWdJbnRlZ2VyIHR5cGVUeXBlMSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IHZhbGlkYXRlVHlwZVR5cGUxX0VudW1lcmF0aW9uKHR5cGVUeXBlMSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBzZWUgI3ZhbGlkYXRlVHlwZVR5cGUxX0VudW1lcmF0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDb2xsZWN0aW9uIFRZUEVfVFlQRTFfX0VOVU1FUkFUSU9OX19WQUxVRVMgPQotCQl3cmFwRW51bWVyYXRpb25WYWx1ZXMKLQkJCShuZXcgT2JqZWN0W10gewotCQkJCSBuZXcgQmlnSW50ZWdlcigiMCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMiIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMyIpCi0JCQkgfSk7Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZXMgdGhlIEVudW1lcmF0aW9uIGNvbnN0cmFpbnQgb2YgJzxlbT5UeXBlIFR5cGUxPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlVHlwZVR5cGUxX0VudW1lcmF0aW9uKEJpZ0ludGVnZXIgdHlwZVR5cGUxLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gVFlQRV9UWVBFMV9fRU5VTUVSQVRJT05fX1ZBTFVFUy5jb250YWlucyh0eXBlVHlwZTEpOwotCQlpZiAoIXJlc3VsdCAmJiBkaWFnbm9zdGljcyAhPSBudWxsKSAKLQkJCXJlcG9ydEVudW1lcmF0aW9uVmlvbGF0aW9uKE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldFR5cGVUeXBlMSgpLCB0eXBlVHlwZTEsIFRZUEVfVFlQRTFfX0VOVU1FUkFUSU9OX19WQUxVRVMsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsgCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVUeXBlVHlwZTIoQmlnSW50ZWdlciB0eXBlVHlwZTIsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSB2YWxpZGF0ZVR5cGVUeXBlMl9FbnVtZXJhdGlvbih0eXBlVHlwZTIsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAc2VlICN2YWxpZGF0ZVR5cGVUeXBlMl9FbnVtZXJhdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29sbGVjdGlvbiBUWVBFX1RZUEUyX19FTlVNRVJBVElPTl9fVkFMVUVTID0KLQkJd3JhcEVudW1lcmF0aW9uVmFsdWVzCi0JCQkobmV3IE9iamVjdFtdIHsKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjAiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjEiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjIiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjMiKQotCQkJIH0pOwotCi0JLyoqCi0JICogVmFsaWRhdGVzIHRoZSBFbnVtZXJhdGlvbiBjb25zdHJhaW50IG9mICc8ZW0+VHlwZSBUeXBlMjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZVR5cGVUeXBlMl9FbnVtZXJhdGlvbihCaWdJbnRlZ2VyIHR5cGVUeXBlMiwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IFRZUEVfVFlQRTJfX0VOVU1FUkFUSU9OX19WQUxVRVMuY29udGFpbnModHlwZVR5cGUyKTsKLQkJaWYgKCFyZXN1bHQgJiYgZGlhZ25vc3RpY3MgIT0gbnVsbCkgCi0JCQlyZXBvcnRFbnVtZXJhdGlvblZpb2xhdGlvbihNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXRUeXBlVHlwZTIoKSwgdHlwZVR5cGUyLCBUWVBFX1RZUEUyX19FTlVNRVJBVElPTl9fVkFMVUVTLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7IAotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlVHlwZVR5cGUzKEJpZ0ludGVnZXIgdHlwZVR5cGUzLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gdmFsaWRhdGVUeXBlVHlwZTNfRW51bWVyYXRpb24odHlwZVR5cGUzLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQHNlZSAjdmFsaWRhdGVUeXBlVHlwZTNfRW51bWVyYXRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENvbGxlY3Rpb24gVFlQRV9UWVBFM19fRU5VTUVSQVRJT05fX1ZBTFVFUyA9Ci0JCXdyYXBFbnVtZXJhdGlvblZhbHVlcwotCQkJKG5ldyBPYmplY3RbXSB7Ci0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIxIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIyIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIzIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI0IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI1IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI2IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI3IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI4IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI5IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIxMCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMTEiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjE2IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIxNyIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMTgiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjE5IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIyMCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMjEiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjIyIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIyMyIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMjQiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjI1IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIyNiIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMjciKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjI4IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIyOSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMzAiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjMxIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIzMiIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMzMiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjM0IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIzNSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMzYiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjM3IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIzOCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMzkiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjQwIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI0MSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNDIiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjQzIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI0NCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNDUiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjQ2IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI0NyIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNDgiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjQ5IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI1MCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNTEiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjUyIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI1MyIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNTQiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjU1IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI1NiIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNTciKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjU4IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI1OSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNjAiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjYxIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI2MiIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNjMiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjY0IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI2NSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNjYiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjY3IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI2OCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNjkiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjcwIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI3MSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNzIiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjczIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI3NCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNzUiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjc2IikKLQkJCSB9KTsKLQotCS8qKgotCSAqIFZhbGlkYXRlcyB0aGUgRW51bWVyYXRpb24gY29uc3RyYWludCBvZiAnPGVtPlR5cGUgVHlwZTM8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVUeXBlVHlwZTNfRW51bWVyYXRpb24oQmlnSW50ZWdlciB0eXBlVHlwZTMsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBUWVBFX1RZUEUzX19FTlVNRVJBVElPTl9fVkFMVUVTLmNvbnRhaW5zKHR5cGVUeXBlMyk7Ci0JCWlmICghcmVzdWx0ICYmIGRpYWdub3N0aWNzICE9IG51bGwpIAotCQkJcmVwb3J0RW51bWVyYXRpb25WaW9sYXRpb24oTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0VHlwZVR5cGUzKCksIHR5cGVUeXBlMywgVFlQRV9UWVBFM19fRU5VTUVSQVRJT05fX1ZBTFVFUywgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OyAKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZVR5cGVUeXBlNChCaWdJbnRlZ2VyIHR5cGVUeXBlNCwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IHZhbGlkYXRlVHlwZVR5cGU0X0VudW1lcmF0aW9uKHR5cGVUeXBlNCwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBzZWUgI3ZhbGlkYXRlVHlwZVR5cGU0X0VudW1lcmF0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDb2xsZWN0aW9uIFRZUEVfVFlQRTRfX0VOVU1FUkFUSU9OX19WQUxVRVMgPQotCQl3cmFwRW51bWVyYXRpb25WYWx1ZXMKLQkJCShuZXcgT2JqZWN0W10gewotCQkJCSBuZXcgQmlnSW50ZWdlcigiMCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMSIpCi0JCQkgfSk7Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZXMgdGhlIEVudW1lcmF0aW9uIGNvbnN0cmFpbnQgb2YgJzxlbT5UeXBlIFR5cGU0PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlVHlwZVR5cGU0X0VudW1lcmF0aW9uKEJpZ0ludGVnZXIgdHlwZVR5cGU0LCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gVFlQRV9UWVBFNF9fRU5VTUVSQVRJT05fX1ZBTFVFUy5jb250YWlucyh0eXBlVHlwZTQpOwotCQlpZiAoIXJlc3VsdCAmJiBkaWFnbm9zdGljcyAhPSBudWxsKSAKLQkJCXJlcG9ydEVudW1lcmF0aW9uVmlvbGF0aW9uKE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldFR5cGVUeXBlNCgpLCB0eXBlVHlwZTQsIFRZUEVfVFlQRTRfX0VOVU1FUkFUSU9OX19WQUxVRVMsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsgCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVUeXBlVHlwZTUoQmlnSW50ZWdlciB0eXBlVHlwZTUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSB2YWxpZGF0ZVR5cGVUeXBlNV9FbnVtZXJhdGlvbih0eXBlVHlwZTUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAc2VlICN2YWxpZGF0ZVR5cGVUeXBlNV9FbnVtZXJhdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29sbGVjdGlvbiBUWVBFX1RZUEU1X19FTlVNRVJBVElPTl9fVkFMVUVTID0KLQkJd3JhcEVudW1lcmF0aW9uVmFsdWVzCi0JCQkobmV3IE9iamVjdFtdIHsKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjAiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjEiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjIiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjMiKQotCQkJIH0pOwotCi0JLyoqCi0JICogVmFsaWRhdGVzIHRoZSBFbnVtZXJhdGlvbiBjb25zdHJhaW50IG9mICc8ZW0+VHlwZSBUeXBlNTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZVR5cGVUeXBlNV9FbnVtZXJhdGlvbihCaWdJbnRlZ2VyIHR5cGVUeXBlNSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IFRZUEVfVFlQRTVfX0VOVU1FUkFUSU9OX19WQUxVRVMuY29udGFpbnModHlwZVR5cGU1KTsKLQkJaWYgKCFyZXN1bHQgJiYgZGlhZ25vc3RpY3MgIT0gbnVsbCkgCi0JCQlyZXBvcnRFbnVtZXJhdGlvblZpb2xhdGlvbihNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXRUeXBlVHlwZTUoKSwgdHlwZVR5cGU1LCBUWVBFX1RZUEU1X19FTlVNRVJBVElPTl9fVkFMVUVTLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7IAotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlVUlEVHlwZShTdHJpbmcgdWlkVHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IHZhbGlkYXRlVUlEVHlwZV9NYXhMZW5ndGgodWlkVHlwZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFZhbGlkYXRlcyB0aGUgTWF4TGVuZ3RoIGNvbnN0cmFpbnQgb2YgJzxlbT5VSUQgVHlwZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZVVJRFR5cGVfTWF4TGVuZ3RoKFN0cmluZyB1aWRUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWludCBsZW5ndGggPSB1aWRUeXBlLmxlbmd0aCgpOyAgCi0JCWJvb2xlYW4gcmVzdWx0ID0gbGVuZ3RoIDw9IDE2OwotCQlpZiAoIXJlc3VsdCAmJiBkaWFnbm9zdGljcyAhPSBudWxsKSAKLQkJCXJlcG9ydE1heExlbmd0aFZpb2xhdGlvbihNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXRVSURUeXBlKCksIHVpZFR5cGUsIGxlbmd0aCwgMTYsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZVVuaXRUeXBlKEJpZ0ludGVnZXIgdW5pdFR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSB2YWxpZGF0ZVVuaXRUeXBlX0VudW1lcmF0aW9uKHVuaXRUeXBlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQHNlZSAjdmFsaWRhdGVVbml0VHlwZV9FbnVtZXJhdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29sbGVjdGlvbiBVTklUX1RZUEVfX0VOVU1FUkFUSU9OX19WQUxVRVMgPQotCQl3cmFwRW51bWVyYXRpb25WYWx1ZXMKLQkJCShuZXcgT2JqZWN0W10gewotCQkJCSBuZXcgQmlnSW50ZWdlcigiMCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMiIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMyIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiOCIpCi0JCQkgfSk7Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZXMgdGhlIEVudW1lcmF0aW9uIGNvbnN0cmFpbnQgb2YgJzxlbT5Vbml0IFR5cGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVVbml0VHlwZV9FbnVtZXJhdGlvbihCaWdJbnRlZ2VyIHVuaXRUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gVU5JVF9UWVBFX19FTlVNRVJBVElPTl9fVkFMVUVTLmNvbnRhaW5zKHVuaXRUeXBlKTsKLQkJaWYgKCFyZXN1bHQgJiYgZGlhZ25vc3RpY3MgIT0gbnVsbCkgCi0JCQlyZXBvcnRFbnVtZXJhdGlvblZpb2xhdGlvbihNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXRVbml0VHlwZSgpLCB1bml0VHlwZSwgVU5JVF9UWVBFX19FTlVNRVJBVElPTl9fVkFMVUVTLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7IAotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlVmFsdWVsaXN0U29ydE9yZGVyVHlwZShCaWdJbnRlZ2VyIHZhbHVlbGlzdFNvcnRPcmRlclR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSB2YWxpZGF0ZVZhbHVlbGlzdFNvcnRPcmRlclR5cGVfRW51bWVyYXRpb24odmFsdWVsaXN0U29ydE9yZGVyVHlwZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBzZWUgI3ZhbGlkYXRlVmFsdWVsaXN0U29ydE9yZGVyVHlwZV9FbnVtZXJhdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29sbGVjdGlvbiBWQUxVRUxJU1RfU09SVF9PUkRFUl9UWVBFX19FTlVNRVJBVElPTl9fVkFMVUVTID0KLQkJd3JhcEVudW1lcmF0aW9uVmFsdWVzCi0JCQkobmV3IE9iamVjdFtdIHsKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjAiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjEiKQotCQkJIH0pOwotCi0JLyoqCi0JICogVmFsaWRhdGVzIHRoZSBFbnVtZXJhdGlvbiBjb25zdHJhaW50IG9mICc8ZW0+VmFsdWVsaXN0IFNvcnQgT3JkZXIgVHlwZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZVZhbHVlbGlzdFNvcnRPcmRlclR5cGVfRW51bWVyYXRpb24oQmlnSW50ZWdlciB2YWx1ZWxpc3RTb3J0T3JkZXJUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gVkFMVUVMSVNUX1NPUlRfT1JERVJfVFlQRV9fRU5VTUVSQVRJT05fX1ZBTFVFUy5jb250YWlucyh2YWx1ZWxpc3RTb3J0T3JkZXJUeXBlKTsKLQkJaWYgKCFyZXN1bHQgJiYgZGlhZ25vc3RpY3MgIT0gbnVsbCkgCi0JCQlyZXBvcnRFbnVtZXJhdGlvblZpb2xhdGlvbihNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXRWYWx1ZWxpc3RTb3J0T3JkZXJUeXBlKCksIHZhbHVlbGlzdFNvcnRPcmRlclR5cGUsIFZBTFVFTElTVF9TT1JUX09SREVSX1RZUEVfX0VOVU1FUkFUSU9OX19WQUxVRVMsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsgCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVXZWVrU3RhcnREYXlUeXBlKEJpZ0ludGVnZXIgd2Vla1N0YXJ0RGF5VHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IHZhbGlkYXRlV2Vla1N0YXJ0RGF5VHlwZV9FbnVtZXJhdGlvbih3ZWVrU3RhcnREYXlUeXBlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQHNlZSAjdmFsaWRhdGVXZWVrU3RhcnREYXlUeXBlX0VudW1lcmF0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDb2xsZWN0aW9uIFdFRUtfU1RBUlRfREFZX1RZUEVfX0VOVU1FUkFUSU9OX19WQUxVRVMgPQotCQl3cmFwRW51bWVyYXRpb25WYWx1ZXMKLQkJCShuZXcgT2JqZWN0W10gewotCQkJCSBuZXcgQmlnSW50ZWdlcigiMCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMiIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMyIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNiIpCi0JCQkgfSk7Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZXMgdGhlIEVudW1lcmF0aW9uIGNvbnN0cmFpbnQgb2YgJzxlbT5XZWVrIFN0YXJ0IERheSBUeXBlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlV2Vla1N0YXJ0RGF5VHlwZV9FbnVtZXJhdGlvbihCaWdJbnRlZ2VyIHdlZWtTdGFydERheVR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBXRUVLX1NUQVJUX0RBWV9UWVBFX19FTlVNRVJBVElPTl9fVkFMVUVTLmNvbnRhaW5zKHdlZWtTdGFydERheVR5cGUpOwotCQlpZiAoIXJlc3VsdCAmJiBkaWFnbm9zdGljcyAhPSBudWxsKSAKLQkJCXJlcG9ydEVudW1lcmF0aW9uVmlvbGF0aW9uKE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldFdlZWtTdGFydERheVR5cGUoKSwgd2Vla1N0YXJ0RGF5VHlwZSwgV0VFS19TVEFSVF9EQVlfVFlQRV9fRU5VTUVSQVRJT05fX1ZBTFVFUywgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OyAKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZVdvcmtDb250b3VyVHlwZShCaWdJbnRlZ2VyIHdvcmtDb250b3VyVHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IHZhbGlkYXRlV29ya0NvbnRvdXJUeXBlX0VudW1lcmF0aW9uKHdvcmtDb250b3VyVHlwZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBzZWUgI3ZhbGlkYXRlV29ya0NvbnRvdXJUeXBlX0VudW1lcmF0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDb2xsZWN0aW9uIFdPUktfQ09OVE9VUl9UWVBFX19FTlVNRVJBVElPTl9fVkFMVUVTID0KLQkJd3JhcEVudW1lcmF0aW9uVmFsdWVzCi0JCQkobmV3IE9iamVjdFtdIHsKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjAiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjEiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjIiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjMiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjQiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjUiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjYiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjciKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjgiKQotCQkJIH0pOwotCi0JLyoqCi0JICogVmFsaWRhdGVzIHRoZSBFbnVtZXJhdGlvbiBjb25zdHJhaW50IG9mICc8ZW0+V29yayBDb250b3VyIFR5cGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVXb3JrQ29udG91clR5cGVfRW51bWVyYXRpb24oQmlnSW50ZWdlciB3b3JrQ29udG91clR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBXT1JLX0NPTlRPVVJfVFlQRV9fRU5VTUVSQVRJT05fX1ZBTFVFUy5jb250YWlucyh3b3JrQ29udG91clR5cGUpOwotCQlpZiAoIXJlc3VsdCAmJiBkaWFnbm9zdGljcyAhPSBudWxsKSAKLQkJCXJlcG9ydEVudW1lcmF0aW9uVmlvbGF0aW9uKE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldFdvcmtDb250b3VyVHlwZSgpLCB3b3JrQ29udG91clR5cGUsIFdPUktfQ09OVE9VUl9UWVBFX19FTlVNRVJBVElPTl9fVkFMVUVTLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7IAotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlV29ya0Zvcm1hdFR5cGUoQmlnSW50ZWdlciB3b3JrRm9ybWF0VHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IHZhbGlkYXRlV29ya0Zvcm1hdFR5cGVfRW51bWVyYXRpb24od29ya0Zvcm1hdFR5cGUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAc2VlICN2YWxpZGF0ZVdvcmtGb3JtYXRUeXBlX0VudW1lcmF0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDb2xsZWN0aW9uIFdPUktfRk9STUFUX1RZUEVfX0VOVU1FUkFUSU9OX19WQUxVRVMgPQotCQl3cmFwRW51bWVyYXRpb25WYWx1ZXMKLQkJCShuZXcgT2JqZWN0W10gewotCQkJCSBuZXcgQmlnSW50ZWdlcigiMSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMiIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMyIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNSIpCi0JCQkgfSk7Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZXMgdGhlIEVudW1lcmF0aW9uIGNvbnN0cmFpbnQgb2YgJzxlbT5Xb3JrIEZvcm1hdCBUeXBlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlV29ya0Zvcm1hdFR5cGVfRW51bWVyYXRpb24oQmlnSW50ZWdlciB3b3JrRm9ybWF0VHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IFdPUktfRk9STUFUX1RZUEVfX0VOVU1FUkFUSU9OX19WQUxVRVMuY29udGFpbnMod29ya0Zvcm1hdFR5cGUpOwotCQlpZiAoIXJlc3VsdCAmJiBkaWFnbm9zdGljcyAhPSBudWxsKSAKLQkJCXJlcG9ydEVudW1lcmF0aW9uVmlvbGF0aW9uKE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldFdvcmtGb3JtYXRUeXBlKCksIHdvcmtGb3JtYXRUeXBlLCBXT1JLX0ZPUk1BVF9UWVBFX19FTlVNRVJBVElPTl9fVkFMVUVTLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7IAotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlV29ya0dyb3VwVHlwZShCaWdJbnRlZ2VyIHdvcmtHcm91cFR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSB2YWxpZGF0ZVdvcmtHcm91cFR5cGVfRW51bWVyYXRpb24od29ya0dyb3VwVHlwZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBzZWUgI3ZhbGlkYXRlV29ya0dyb3VwVHlwZV9FbnVtZXJhdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29sbGVjdGlvbiBXT1JLX0dST1VQX1RZUEVfX0VOVU1FUkFUSU9OX19WQUxVRVMgPQotCQl3cmFwRW51bWVyYXRpb25WYWx1ZXMKLQkJCShuZXcgT2JqZWN0W10gewotCQkJCSBuZXcgQmlnSW50ZWdlcigiMCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMiIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMyIpCi0JCQkgfSk7Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZXMgdGhlIEVudW1lcmF0aW9uIGNvbnN0cmFpbnQgb2YgJzxlbT5Xb3JrIEdyb3VwIFR5cGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVXb3JrR3JvdXBUeXBlX0VudW1lcmF0aW9uKEJpZ0ludGVnZXIgd29ya0dyb3VwVHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IFdPUktfR1JPVVBfVFlQRV9fRU5VTUVSQVRJT05fX1ZBTFVFUy5jb250YWlucyh3b3JrR3JvdXBUeXBlKTsKLQkJaWYgKCFyZXN1bHQgJiYgZGlhZ25vc3RpY3MgIT0gbnVsbCkgCi0JCQlyZXBvcnRFbnVtZXJhdGlvblZpb2xhdGlvbihNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXRXb3JrR3JvdXBUeXBlKCksIHdvcmtHcm91cFR5cGUsIFdPUktfR1JPVVBfVFlQRV9fRU5VTUVSQVRJT05fX1ZBTFVFUywgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OyAKLQl9Ci0KLX0gLy9Nc3Byb2plY3RWYWxpZGF0b3IKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvdXRpbC9Nc3Byb2plY3RYTUxIZWxwZXJJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L3V0aWwvTXNwcm9qZWN0WE1MSGVscGVySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NWNkNzdkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvdXRpbC9Nc3Byb2plY3RYTUxIZWxwZXJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24uICBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC51dGlsOwotCi1pbXBvcnQgamF2YS50ZXh0LkZpZWxkUG9zaXRpb247Ci1pbXBvcnQgamF2YS50ZXh0LlBhcnNlRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5EYXRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVEYXRhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5YTUxIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5YTUxSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLmltcGwuWE1MSGVscGVySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuaW50ZXJuYWwuWE1MQ2FsZW5kYXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLnV0aWwuWE1MVHlwZVV0aWw7Ci0KLWltcG9ydCBjb20uaWJtLmljdS50ZXh0LkRhdGVGb3JtYXQ7Ci1pbXBvcnQgY29tLmlibS5pY3UudGV4dC5TaW1wbGVEYXRlRm9ybWF0OwotCi0vKioKLSAqIENyZWF0ZSBhIHNsaWdodGx5IGN1c3RvbWl6ZWQgWE1MSGVscGVySW1wbCBjbGFzcwotICogCi0gKiBAYXV0aG9yIEJpbmd4dWUgWHUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIE1zcHJvamVjdFhNTEhlbHBlckltcGwgZXh0ZW5kcyBYTUxIZWxwZXJJbXBsIGltcGxlbWVudHMgWE1MSGVscGVyIHsKLQotCSBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIERhdGVGb3JtYXQgW10gRURBVEVfRk9STUFUUyA9Ci0JICB7Ci0JCW5ldyBTYWZlU2ltcGxlRGF0ZUZvcm1hdCgieXl5eS1NTS1kZCdUJ0hIOm1tOnNzIiksCi0JICAgIG5ldyBTYWZlU2ltcGxlRGF0ZUZvcm1hdCgieXl5eS1NTS1kZCdUJ0hIOm1tOnNzWiIpLAotCSAgICBuZXcgU2FmZVNpbXBsZURhdGVGb3JtYXQoInl5eXktTU0tZGRaIikKLQkgIH07Ci0JIAotCSAvKioKLQkgICogQ29uc3RydWN0b3IKLQkgICogQHBhcmFtIHJlc291cmNlCi0JICAqLwotCXB1YmxpYyBNc3Byb2plY3RYTUxIZWxwZXJJbXBsKFhNTFJlc291cmNlIHJlc291cmNlKSB7Ci0JCXN1cGVyKHJlc291cmNlKTsKLQl9Ci0JCi0JLyoqCi0JICogQ29udmVydCBib29sZWFuIHZhbHVlIHRvIGVpdGhlciAiMCIgb3IgIjEiCi0JICogQ29udmVydCBEYXRlVGltZSB2YWx1ZSB0byBiZSBjb21wYXRpYmxlIHdpdGggTVMgcHJvamVjdAotCSAqLwotCSBwdWJsaWMgU3RyaW5nIGNvbnZlcnRUb1N0cmluZyhFRmFjdG9yeSBmYWN0b3J5LCBFRGF0YVR5cGUgZGF0YVR5cGUsIE9iamVjdCB2YWx1ZSkKLQkgIHsKLQkJIAotLy8JCSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuaW1wbC5YTUxUeXBlRmFjdG9yeUltcGwgYUZhY3RvcnkgPSBuZXcgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLmltcGwuWE1MVHlwZUZhY3RvcnlJbXBsKCk7Ci0vLwkJIFN5c3RlbS5vdXQucHJpbnRsbigiJCQkJCQgZGF0YVR5cGUgbmFtZSA9ICIgKyBkYXRhVHlwZS5nZXROYW1lKCkpOwotCQkgCi0JCSBpZiAoIkJvb2xlYW4iLmVxdWFsc0lnbm9yZUNhc2UoZGF0YVR5cGUuZ2V0TmFtZSgpKSkgewotLy8JCQkgU3lzdGVtLm91dC5wcmludGxuKCIkJCQgbmVlZCB0byBvdmVycmlkZSB0aGUgQm9vbGVhbjogIiArIHZhbHVlKTsKLQkJCSBpZiAodmFsdWUgIT0gbnVsbCkgewotCQkJCSBTdHJpbmcgcnMgPSAiMCI7Ci0JCQkJIHRyeSB7Ci0JCQkJCSBCb29sZWFuIGJPYmplY3QgPSAoQm9vbGVhbil2YWx1ZTsKLQkJCQkJIGlmIChiT2JqZWN0LmJvb2xlYW5WYWx1ZSgpKQotCQkJCQkJIHJzID0gIjEiOwotCQkJCSB9IGNhdGNoIChFeGNlcHRpb24gZSkge30KLS8vCQkJCSBTeXN0ZW0ub3V0LnByaW50bG4oIiQkJCBjb252ZXJ0ZWQgc3RyaW5nID0gIiArIHJzKTsKLQkJCQkgcmV0dXJuIHJzOwotCQkJIH0KLQkJCSByZXR1cm4gbnVsbDsgCi0JCSB9IGVsc2UgaWYgKCJEYXRlVGltZSIuZXF1YWxzSWdub3JlQ2FzZShkYXRhVHlwZS5nZXROYW1lKCkpKSB7Ci0vLwkJCSBTeXN0ZW0ub3V0LnByaW50bG4oIiQkJCBuZWVkIHRvIG92ZXJyaWRlIHRoZSBEYXRlVGltZTogIiArIHZhbHVlLmdldENsYXNzKCkgKyAiLCIgKyB2YWx1ZSk7Ci0JCQkgaWYgKHZhbHVlICE9IG51bGwpIHsKLQkJCQkgICBTdHJpbmcgcnMgPSB2YWx1ZS50b1N0cmluZygpOwotCQkJCSAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIERhdGUpCi0JCQkJICAgIHsKLQkJCQkgICAgICBycyA9IEVEQVRFX0ZPUk1BVFNbMF0uZm9ybWF0KChEYXRlKXZhbHVlKTsKLQkJCQkgICAgfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFhNTENhbGVuZGFyKXsKLQkJCQkJICBycyA9ICgoWE1MQ2FsZW5kYXIpdmFsdWUpLnRvU3RyaW5nKCk7Ci0JCQkJCSAgaW50IGlkeCA9IHJzLmluZGV4T2YoJy4nKTsKLQkJCQkJICBpZiAoaWR4ID4gMCkKLQkJCQkJCSAgcnMgPSBycy5zdWJzdHJpbmcoMCwgaWR4KTsKLQkJCQkJfQotLy8JCQkJICAgU3lzdGVtLm91dC5wcmludGxuKCIkJCQgY29udmVydGVkIHN0cmluZyA9ICIgKyBycyk7Ci0JCQkJICAgcmV0dXJuIHJzOwotCQkJIH0KLQkJCSByZXR1cm4gbnVsbDsgCi0JCSB9Ci0JCSAKLS8vCQkgU3lzdGVtLm91dC5wcmludGxuKCIkJCQgRUZhY3RvcnksIEVEYXRhVHlwZSwgdmFsdWUgPSAiICsgZmFjdG9yeSArICIsIiArIGRhdGFUeXBlICsgIiwiICsgdmFsdWUpOwotCQkgU3RyaW5nIHJzID0gc3VwZXIuY29udmVydFRvU3RyaW5nKCBmYWN0b3J5LCAgZGF0YVR5cGUsICB2YWx1ZSk7Ci0vLwkJIFN5c3RlbS5vdXQucHJpbnRsbigiJCQkIGNvbnZlcnRlZCBzdHJpbmcgKG91dCkgPSAiICsgcnMpOwotCQkgcmV0dXJuIHJzOwotCSAgfQotCSAKLQkgLyoqCi0JICAqIENvbnZlcnQgdGhlIDEgb3IgMCBib29sZWFuIHZhbHVlIHRvIGFuIEJvb2xlYW4gT2JqZWN0Ci0JICAqIGNvbnZlcnQgdGhlIGRhdGV0aW1lIHN0cmluZyBpbnRvIFhNTENhbGVuZGFyIG9iamVjdC4KLQkgICovCi0JIHByb3RlY3RlZCBPYmplY3QgY3JlYXRlRnJvbVN0cmluZyhFRmFjdG9yeSBlRmFjdG9yeSwgRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIHZhbHVlKQotCSAgewotCQkgaWYgKCJCb29sZWFuIi5lcXVhbHNJZ25vcmVDYXNlKGVEYXRhVHlwZS5nZXROYW1lKCkpKSB7Ci0vLwkJCSBTeXN0ZW0ub3V0LnByaW50bG4oIiQkJCBuZWVkIHRvIGNvbnZlcnQgZnJvbSBCb29sZWFuOiAiICsgdmFsdWUpOwotCQkJIGlmICh2YWx1ZSAhPSBudWxsKSB7Ci0JCQkJIGlmICh2YWx1ZS5lcXVhbHNJZ25vcmVDYXNlKCJ0cnVlIikgfHwgdmFsdWUuZXF1YWxzSWdub3JlQ2FzZSgiMSIpKQotCQkJCQkgcmV0dXJuIEJvb2xlYW4uVFJVRTsKLQkJCQkgZWxzZQotCQkJCQkgcmV0dXJuIEJvb2xlYW4uRkFMU0U7Ci0JCQkgfQotCQkJIHJldHVybiBudWxsOyAKLQkJIH0gZWxzZSBpZiAoIkRhdGVUaW1lIi5lcXVhbHNJZ25vcmVDYXNlKGVEYXRhVHlwZS5nZXROYW1lKCkpKSB7Ci0vLwkJCSBTeXN0ZW0ub3V0LnByaW50bG4oIiQkJCBuZWVkIHRvIGNvbnZlcnQgZnJvbSBEYXRlVGltZTogIiArIHZhbHVlKTsKLQkJCSBpZiAodmFsdWUgIT0gbnVsbCkgewotCQkJCSAgIHJldHVybiBuZXcgWE1MQ2FsZW5kYXIoY29sbGFwc2VXaGl0ZVNwYWNlKHZhbHVlKSwgWE1MQ2FsZW5kYXIuREFURVRJTUUpOwotCQkJIH0KLQkJCSByZXR1cm4gbnVsbDsgCi0JCSB9Ci0JCSAKLS8vCQkgU3lzdGVtLm91dC5wcmludGxuKCIkJCQgRUZhY3RvcnksIEVEYXRhVHlwZSwgdmFsdWUgPSAiICsgZUZhY3RvcnkgKyAiLCIgKyBlRGF0YVR5cGUgKyAiLCIgKyB2YWx1ZSk7Ci0JCSBPYmplY3Qgcm8gPSBzdXBlci5jcmVhdGVGcm9tU3RyaW5nKCBlRmFjdG9yeSwgIGVEYXRhVHlwZSwgIHZhbHVlKTsKLS8vCQkgU3lzdGVtLm91dC5wcmludGxuKCIkJCQgY29udmVydGVkIG9iamVjdCAoaW4pID0gIiArIHJvKTsKLQkJIHJldHVybiBybzsKLQkgIH0KLQkgCi0JIHByb3RlY3RlZCBTdHJpbmcgY29sbGFwc2VXaGl0ZVNwYWNlKFN0cmluZyB2YWx1ZSkKLQkgewotCQkgcmV0dXJuIFhNTFR5cGVVdGlsLm5vcm1hbGl6ZSh2YWx1ZSwgdHJ1ZSk7Ci0JIH0KLQkgIAotCSBwcml2YXRlIHN0YXRpYyBjbGFzcyBTYWZlU2ltcGxlRGF0ZUZvcm1hdCBleHRlbmRzIFNpbXBsZURhdGVGb3JtYXQKLQkgewotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCQlwdWJsaWMgU2FmZVNpbXBsZURhdGVGb3JtYXQoU3RyaW5nIHBhdHRlcm4pCi0JICAgIHsKLQkgICAgICBzdXBlcihwYXR0ZXJuKTsKLQkgICAgfQotCi0JICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgRGF0ZSBwYXJzZShTdHJpbmcgc291cmNlKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24KLQkgICAgewotCSAgICAgIHJldHVybiBzdXBlci5wYXJzZShzb3VyY2UpOwotCSAgICB9Ci0KLQkgICAgcHVibGljIFN0cmluZ0J1ZmZlciBmb3JtYXQoRGF0ZSBkYXRlLCBTdHJpbmdCdWZmZXIgdG9BcHBlbmRUbywgRmllbGRQb3NpdGlvbiBwb3MpCi0JICAgIHsKLQkgICAgICBTdHJpbmdCdWZmZXIgcmVzdWx0ID0gc3VwZXIuZm9ybWF0KGRhdGUsIHRvQXBwZW5kVG8sIHBvcyk7Ci0vLwkgICAgICByZXN1bHQuaW5zZXJ0KHJlc3VsdC5sZW5ndGgoKSAtIDIsICI6Iik7Ci0JICAgICAgcmV0dXJuIHJlc3VsdDsKLQkgICAgfQotCSAgfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC91dGlsL3BhY2thZ2UuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvdXRpbC9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmMDNkODguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC91dGlsL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIGltcGxlbWVudGF0aW9uIHN1cHBvcnQgZm9yIGFjY2Vzc2luZyB0aGUgTWljcm9zb2Z0IFByb2plY3QgbW9kZWwgb2JqZWN0cy4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0vLnByb2plY3QgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0vLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlZTc0MDQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtL01FVEEtSU5GL01BTklGRVNULk1GIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MDRmYjgwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJWZlYXR1cmVQbHVnaW5OYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5lcGYucGxhdGZvcm07IHNpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuMi4wLnF1YWxpZmllcgotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1FY2xpcHNlLUxhenlTdGFydDogdHJ1ZQotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0vYWJvdXQuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Yzk5MDg2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLSAKLTxwPkZlYnJ1YXJ5IDI0LCAyMDA1PC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudC48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0vYWJvdXQuaW5pIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtL2Fib3V0LmluaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzdkNDk2ZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0vYWJvdXQuaW5pCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotIyBhYm91dC5pbmkKLSMgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgYSBmZWF0dXJlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jICIla2V5IiBhcmUgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZGVmaW5lZCBpbiBhYm91dC5wcm9wZXJ0aWVzCi0jIFRoaXMgZmlsZSBkb2VzIG5vdCBuZWVkIHRvIGJlIHRyYW5zbGF0ZWQuCi0KLSMgUHJvcGVydHkgImFib3V0VGV4dCIgY29udGFpbnMgYmx1cmIgZm9yICJBYm91dCIgZGlhbG9nICh0cmFuc2xhdGVkKQotYWJvdXRUZXh0PSVibHVyYgotCi0jIFByb3BlcnR5ICJhcHBOYW1lIiBjb250YWlucyBuYW1lIG9mIHRoZSBhcHBsaWNhdGlvbiAodHJhbnNsYXRlZCkKLWFwcE5hbWU9JWZlYXR1cmVOYW1lCi0KLSMgUHJvcGVydHkgImZlYXR1cmVJbWFnZSIgY29udGFpbnMgcGF0aCB0byBmZWF0dXJlIGltYWdlICgzMngzMikKLWZlYXR1cmVJbWFnZT1lY2xpcHNlMzIuZ2lmCi0KLSMgUHJvcGVydHkgIndlbGNvbWVQYWdlIiBjb250YWlucyBwYXRoIHRvIHdlbGNvbWUgcGFnZSAoc3BlY2lhbCBYTUwtYmFzZWQgZm9ybWF0KQotIyAoJG5sJC8gcHJlZml4IHRvIHBlcm1pdCBsb2NhbGUtc3BlY2lmaWMgdHJhbnNsYXRpb25zIG9mIGVudGlyZSBmaWxlKQotd2VsY29tZVBhZ2U9JG5sJC93ZWxjb21lLnhtbAotCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0vYWJvdXQucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS9hYm91dC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwODFhODhlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS9hYm91dC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbkNvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLSMgYWJvdXQucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgYWJvdXQuaW5pCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIGZpbGwtaW5zIGFyZSBzdXBwbGllZCBieSBhYm91dC5tYXBwaW5ncwotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0jCi0jIERvIG5vdCB0cmFuc2xhdGUgYW55IHZhbHVlcyBzdXJyb3VuZGVkIGJ5IHt9Ci0KLWZlYXR1cmVOYW1lPUVjbGlwc2UgUGxhdGZvcm0gMy4zLjAgd2l0aCBFTUYgR0VGIEdNRgotCi1ibHVyYj1FY2xpcHNlIFBsYXRmb3JtXG5cCi1cblwKLVZlcnNpb246IDMuMy4wXG5cCi1CdWlsZCBpZDogSTIwMDcwNjI1LTE1MDBcblwKLVxuXAotKGMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyBhbmQgb3RoZXJzIDIwMDAsIDIwMDcuICBBbGwgcmlnaHRzIHJlc2VydmVkLlxuXAotVmlzaXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9wbGF0Zm9ybVxuXAotXG5cCi1UaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZVxuXAotQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gaHR0cDovL3d3dy5hcGFjaGUub3JnLwpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtL2J1aWxkLnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0vYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTVkOGIzMS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0vYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotYmluLmluY2x1ZGVzID0gLixcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICBhYm91dC5pbmksXAotICAgICAgICAgICAgICAgYWJvdXQucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBlY2xpcHNlMzIuZ2lmLFwKLSAgICAgICAgICAgICAgIHdlbGNvbWUueG1sLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIG5sLwpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtL2VjbGlwc2UzMi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0vZWNsaXBzZTMyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTZhZDdjYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0vZWNsaXBzZTMyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS9ubC9kYS9hYm91dC5wcm9wZXJ0aWVzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtL25sL2RhL2Fib3V0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhM2ZiZmIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtL25sL2RhL2Fib3V0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUgotIyBhYm91dC5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBhYm91dC5pbmkKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgZmlsbC1pbnMgYXJlIHN1cHBsaWVkIGJ5IGFib3V0Lm1hcHBpbmdzCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLSMKLSMgRG8gbm90IHRyYW5zbGF0ZSBhbnkgdmFsdWVzIHN1cnJvdW5kZWQgYnkge30KLQotZmVhdHVyZU5hbWU9RWNsaXBzZSBQbGF0Zm9ybSAzLjMuMCBtZWQgRU1GIEdFRiBHTUYKLQotYmx1cmI9RWNsaXBzZS1wbGF0Zm9ybVxuXAotXG5cCi1WZXJzaW9uOiAzLjMuMFxuXAotQnlnLWlkOiBJMjAwNzA2MjUtMTUwMFxuXAotXG5cCi0oYykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIGFuZCBvdGhlcnMgMjAwMCwgMjAwNy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cblwKLUJlc1x1MDBmOGcgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9wbGF0Zm9ybVxuXAotXG5cCi1EZXR0ZSBwcm9kdWt0IGluZGVob2xkZXIgc29mdHdhcmUsIGRlciBlciB1ZHZpa2xldCBhZlxuXAotQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gaHR0cDovL3d3dy5hcGFjaGUub3JnLwpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtL25sL2RlL2Fib3V0LnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0vbmwvZGUvYWJvdXQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTQ3N2ZhYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0vbmwvZGUvYWJvdXQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb25Db3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSCi0jIGFib3V0LnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGFib3V0LmluaQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBmaWxsLWlucyBhcmUgc3VwcGxpZWQgYnkgYWJvdXQubWFwcGluZ3MKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotIwotIyBEbyBub3QgdHJhbnNsYXRlIGFueSB2YWx1ZXMgc3Vycm91bmRlZCBieSB7fQotCi1mZWF0dXJlTmFtZT1FY2xpcHNlIFBsYXRmb3JtIDMuMy4wIG1pdCBFTUYgR0VGIEdNRgotCi1ibHVyYj1FY2xpcHNlIFBsYXRmb3JtXG5cCi1cblwKLVZlcnNpb246IDMuMy4wXG5cCi1CdWlsZC1JRDogSTIwMDcwNjI1LTE1MDBcblwKLVxuXAotKGMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyBhbmQgb3RoZXJzIDIwMDAsIDIwMDcuICBBbGwgcmlnaHRzIHJlc2VydmVkLlxuXAotQmVzdWNoZW4gU2llIGRpZSBXZWJzZWl0ZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3BsYXRmb3JtLlxuXAotXG5cCi1EaWVzZXMgUHJvZHVrdCBlbnRoXHUwMGU0bHQgU29mdHdhcmUsIGRpZSB2b24gZGVyXG5cCi1BcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykgZW50d2lja2VsdCB3dXJkZS4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS9ubC9lcy9hYm91dC5wcm9wZXJ0aWVzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtL25sL2VzL2Fib3V0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmYzM4YTQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtL25sL2VzL2Fib3V0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUgotIyBhYm91dC5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBhYm91dC5pbmkKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgZmlsbC1pbnMgYXJlIHN1cHBsaWVkIGJ5IGFib3V0Lm1hcHBpbmdzCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLSMKLSMgRG8gbm90IHRyYW5zbGF0ZSBhbnkgdmFsdWVzIHN1cnJvdW5kZWQgYnkge30KLQotZmVhdHVyZU5hbWU9RWNsaXBzZSBQbGF0Zm9ybSAzLjMuMCBjb24gRU1GIEdFRiBHTUYKLQotYmx1cmI9UGxhdGFmb3JtYSBFY2xpcHNlXG5cCi1cblwKLVZlcnNpXHUwMGYzbjogMy4zLjBcblwKLUlEIGRlIGJ1aWxkOiBJMjAwNzA2MjUtMTUwMFxuXAotXG5cCi0oYykgQ29weXJpZ2h0IENvbGFib3JhZG9yZXMgZGUgRWNsaXBzZSB5IG90cm9zIDIwMDAsIDIwMDcuICBSZXNlcnZhZG9zIHRvZG9zIGxvcyBkZXJlY2hvcy5cblwKLVZpc2l0ZSBsYSBwXHUwMGUxZ2luYSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3BsYXRmb3JtXG5cCi1cblwKLUVzdGUgcHJvZHVjdG8gaW5jbHV5ZSBzb2Z0d2FyZSBkZXNhcnJvbGxhZG8gcG9yIGxhXG5cCi1BcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0vbmwvZnIvYWJvdXQucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS9ubC9mci9hYm91dC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNTgyNDdkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS9ubC9mci9hYm91dC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbkNvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLSMgYWJvdXQucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgYWJvdXQuaW5pCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIGZpbGwtaW5zIGFyZSBzdXBwbGllZCBieSBhYm91dC5tYXBwaW5ncwotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0jCi0jIERvIG5vdCB0cmFuc2xhdGUgYW55IHZhbHVlcyBzdXJyb3VuZGVkIGJ5IHt9Ci0KLWZlYXR1cmVOYW1lPUVjbGlwc2UgUGxhdGZvcm0gMy4zLjAgYXZlYyBFTUYgR0VGIEdNRgotCi1ibHVyYj1FY2xpcHNlIFBsYXRmb3JtXG5cCi1cblwKLVZlcnNpb24gOiAzLjMuMFxuXAotSUQgZGUgY29uc3RydWN0aW9uIDogSTIwMDcwNjI1LTE1MDBcblwKLVxuXAotKGMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyBhbmQgb3RoZXJzIDIwMDAsIDIwMDcuICBBbGwgcmlnaHRzIHJlc2VydmVkLlxuXAotVmlzaXRleiBsYSBwYWdlIHN1aXZhbnRlIDogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9wbGF0Zm9ybVxuXAotXG5cCi1DZSBwcm9kdWl0IGNvbnRpZW50IGRlcyBsb2dpY2llbHMgZFx1MDBlOXZlbG9wcFx1MDBlOXMgcGFyXG5cCi1BcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0vbmwvaXQvYWJvdXQucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS9ubC9pdC9hYm91dC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YjU1YjNmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS9ubC9pdC9hYm91dC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbkNvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLSMgYWJvdXQucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgYWJvdXQuaW5pCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIGZpbGwtaW5zIGFyZSBzdXBwbGllZCBieSBhYm91dC5tYXBwaW5ncwotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0jCi0jIERvIG5vdCB0cmFuc2xhdGUgYW55IHZhbHVlcyBzdXJyb3VuZGVkIGJ5IHt9Ci0KLWZlYXR1cmVOYW1lPVBpYXR0YWZvcm1hIEVjbGlwc2UgMy4zLjAgY29uIEVNRiBHRUYgR01GCi0KLWJsdXJiPVBpYXR0YWZvcm1hIEVjbGlwc2VcblwKLVxuXAotVmVyc2lvbmU6IDMuMy4wXG5cCi1JZCBidWlsZDogSTIwMDcwNjI1LTE1MDBcblwKLVxuXAotKGMpIENvcHlyaWdodCBjb250cmlidXRvciBFY2xpcHNlIGUgYWx0cmkgMjAwMCwgMjAwNy4gIFR1dHRpIGkgZGlyaXR0aSByaXNlcnZhdGkuXG5cCi1WaXNpdGFyZSBsJ2luZGlyaXp6byBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3BsYXRmb3JtXG5cCi1cblwKLVF1ZXN0byBwcm9kb3R0byBpbmNsdWRlIHNvZnR3YXJlIHN2aWx1cHBhdG8gZGFcblwKLUFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS9ubC9qYS9hYm91dC5wcm9wZXJ0aWVzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtL25sL2phL2Fib3V0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmODM2OTQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtL25sL2phL2Fib3V0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUgotIyBhYm91dC5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBhYm91dC5pbmkKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgZmlsbC1pbnMgYXJlIHN1cHBsaWVkIGJ5IGFib3V0Lm1hcHBpbmdzCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLSMKLSMgRG8gbm90IHRyYW5zbGF0ZSBhbnkgdmFsdWVzIHN1cnJvdW5kZWQgYnkge30KLQotZmVhdHVyZU5hbWU9RWNsaXBzZSBQbGF0Zm9ybSAzLjMuMCB3aXRoIEVNRiBHRUYgR01GCi0KLWJsdXJiPUVjbGlwc2UgUGxhdGZvcm1cblwKLVxuXAotXHUzMGQwXHUzMGZjXHUzMGI4XHUzMGU3XHUzMGYzOiAzLjMuMFxuXAotXHUzMGQzXHUzMGViXHUzMGM5IElEOiBJMjAwNzA2MjUtMTUwMFxuXAotXG5cCi0oYykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIGFuZCBvdGhlcnMgMjAwMCwgMjAwNy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG5cCi1odHRwOi8vd3d3LmVjbGlwc2Uub3JnL3BsYXRmb3JtIFx1MzA5Mlx1NTNjMlx1NzE2N1x1MzAwMlxuXAotXG5cCi1cdTMwNTNcdTMwNmVcdTg4ZmRcdTU0YzFcdTMwNmJcdTMwNmZcdTMwMDFBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLylcblwKLVx1MzA2Ylx1MzA4OFx1MzA4YVx1OTU4Ylx1NzY3YVx1MzA1NVx1MzA4Y1x1MzA1Zlx1MzBiZFx1MzBkNVx1MzBjOFx1MzBhNlx1MzBhN1x1MzBhMlx1MzA0Y1x1NTQyYlx1MzA3ZVx1MzA4Y1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1OVx1MzAwMgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtL25sL2tvL2Fib3V0LnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0vbmwva28vYWJvdXQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTRhZjlkYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0vbmwva28vYWJvdXQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb25Db3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSCi0jIGFib3V0LnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGFib3V0LmluaQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBmaWxsLWlucyBhcmUgc3VwcGxpZWQgYnkgYWJvdXQubWFwcGluZ3MKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotIwotIyBEbyBub3QgdHJhbnNsYXRlIGFueSB2YWx1ZXMgc3Vycm91bmRlZCBieSB7fQotCi1mZWF0dXJlTmFtZT1FY2xpcHNlIFx1ZDUwY1x1YjdhYlx1ZDNmYyAzLjMuMChFTUYgR0VGIEdNRiBcdWQzZWNcdWQ1NjgpCi0KLWJsdXJiPUVjbGlwc2UgXHVkNTBjXHViN2FiXHVkM2ZjXG5cCi1cblwKLVx1YmM4NFx1YzgwNDogMy4zLjBcblwKLVx1YmU0Y1x1YjRkYyBJRDogSTIwMDcwNjI1LTE1MDBcblwKLVxuXAotKGMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyBhbmQgb3RoZXJzIDIwMDAsIDIwMDcuICBBbGwgcmlnaHRzIHJlc2VydmVkLlxuXAotaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9wbGF0Zm9ybSBcdWM2ZjlcdWMwYWNcdWM3NzRcdWQyYjhcdWI5N2MgXHViYzI5XHViYjM4XHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0LlxuXAotXG5cCi1cdWM3NzQgXHVjODFjXHVkNDg4XHVjNWQwXHViMjk0IEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pXHVjNWQwXHVjMTFjIFxuXAotXHVhYzFjXHViYzFjXHVkNTVjIFx1YzE4Y1x1ZDUwNFx1ZDJiOFx1YzZlOFx1YzViNFx1YWMwMCBcdWQzZWNcdWQ1NjhcdWI0MThcdWM1YjQgXHVjNzg4XHVjMmI1XHViMmM4XHViMmU0LgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtL25sL3B0L0JSL2Fib3V0LnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0vbmwvcHQvQlIvYWJvdXQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTU0YjMyNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0vbmwvcHQvQlIvYWJvdXQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb25Db3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSCi0jIGFib3V0LnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGFib3V0LmluaQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBmaWxsLWlucyBhcmUgc3VwcGxpZWQgYnkgYWJvdXQubWFwcGluZ3MKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotIwotIyBEbyBub3QgdHJhbnNsYXRlIGFueSB2YWx1ZXMgc3Vycm91bmRlZCBieSB7fQotCi1mZWF0dXJlTmFtZT1FY2xpcHNlIFBsYXRmb3JtIDMuMy4wIGNvbSBFTUYgR0VGIEdNRgotCi1ibHVyYj1FY2xpcHNlIFBsYXRmb3JtXG5cCi1cblwKLVZlcnNcdTAwZTNvOiAzLjMuMFxuXAotSUQgZGEgQ29uc3RydVx1MDBlN1x1MDBlM286IEkyMDA3MDYyNS0xNTAwXG5cCi1cblwKLShjKSBDb3B5cmlnaHQgY29udHJpYnVpZG9yZXMgRWNsaXBzZSBlIG91dHJvcyAyMDAwLCAyMDA3LiBUb2RvcyBvcyBkaXJlaXRvcyByZXNlcnZhZG9zLlxuXAotVmlzaXRlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvcGxhdGZvcm1cblwKLVxuXAotRXN0ZSBwcm9kdXRvIGluY2x1aSBzb2Z0d2FyZSBkZXNlbnZvbHZpZG8gcGVsYVxuXAotQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gaHR0cDovL3d3dy5hcGFjaGUub3JnLwpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtL25sL3J1L2Fib3V0LnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0vbmwvcnUvYWJvdXQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmI4MWYwNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0vbmwvcnUvYWJvdXQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb25Db3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSCi0jIGFib3V0LnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGFib3V0LmluaQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBmaWxsLWlucyBhcmUgc3VwcGxpZWQgYnkgYWJvdXQubWFwcGluZ3MKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotIwotIyBEbyBub3QgdHJhbnNsYXRlIGFueSB2YWx1ZXMgc3Vycm91bmRlZCBieSB7fQotCi1mZWF0dXJlTmFtZT1cdTA0MWZcdTA0M2JcdTA0MzBcdTA0NDJcdTA0NDRcdTA0M2VcdTA0NDBcdTA0M2NcdTA0MzAgRWNsaXBzZSAzLjMuMCBcdTA0NDEgRU1GIEdFRiBHTUYKLQotYmx1cmI9XHUwNDFmXHUwNDNiXHUwNDMwXHUwNDQyXHUwNDQ0XHUwNDNlXHUwNDQwXHUwNDNjXHUwNDMwIEVjbGlwc2VcblwKLVxuXAotXHUwNDEyXHUwNDM1XHUwNDQwXHUwNDQxXHUwNDM4XHUwNDRmOiAzLjMuMFxuXAotXHUwNDE4XHUwNDE0IFx1MDQzYVx1MDQzZVx1MDQzY1x1MDQzZlx1MDQzZVx1MDQzZFx1MDQzZVx1MDQzMlx1MDQzYVx1MDQzODogSTIwMDcwNjI1LTE1MDBcblwKLVxuXAotKGMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyBhbmQgb3RoZXJzIDIwMDAsIDIwMDcuICBcdTA0MTJcdTA0NDFcdTA0MzUgXHUwNDNmXHUwNDQwXHUwNDMwXHUwNDMyXHUwNDMwIFx1MDQzN1x1MDQzMFx1MDQ0OVx1MDQzOFx1MDQ0OVx1MDQzNVx1MDQzZFx1MDQ0Yi5cblwKLVx1MDQxZlx1MDQzZVx1MDQ0MVx1MDQzNVx1MDQ0Mlx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0NDFcdTA0NDJcdTA0NDBcdTA0MzBcdTA0M2RcdTA0MzhcdTA0NDZcdTA0NDMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9wbGF0Zm9ybVxuXAotXG5cCi1cdTA0MTIgXHUwNDQxXHUwNDNlXHUwNDQxXHUwNDQyXHUwNDMwXHUwNDMyIFx1MDQzNFx1MDQzMFx1MDQzZFx1MDQzZFx1MDQzZVx1MDQzM1x1MDQzZSBcdTA0M2ZcdTA0NDBcdTA0M2VcdTA0MzRcdTA0NDNcdTA0M2FcdTA0NDJcdTA0MzAgXHUwNDMyXHUwNDQ1XHUwNDNlXHUwNDM0XHUwNDM4XHUwNDQyIFx1MDQzYVx1MDQzZVx1MDQzNCwgXHUwNDQwXHUwNDMwXHUwNDM3XHUwNDQwXHUwNDMwXHUwNDMxXHUwNDNlXHUwNDQyXHUwNDMwXHUwNDNkXHUwNDNkXHUwNDRiXHUwNDM5XG5cCi1BcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0vbmwvemgvQ04vYWJvdXQucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS9ubC96aC9DTi9hYm91dC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZDlhZTQ1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS9ubC96aC9DTi9hYm91dC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbkNvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLSMgYWJvdXQucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgYWJvdXQuaW5pCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIGZpbGwtaW5zIGFyZSBzdXBwbGllZCBieSBhYm91dC5tYXBwaW5ncwotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0jCi0jIERvIG5vdCB0cmFuc2xhdGUgYW55IHZhbHVlcyBzdXJyb3VuZGVkIGJ5IHt9Ci0KLWZlYXR1cmVOYW1lPVx1NWUyNlx1NjcwOSBFTUYgR0VGIEdNRiBcdTc2ODQgRWNsaXBzZSBQbGF0Zm9ybSAzLjMuMAotCi1ibHVyYj1FY2xpcHNlIFBsYXRmb3JtXG5cCi1cblwKLVx1NzI0OFx1NjcyY1x1ZmYxYTMuMy4wXG5cCi1cdTVkZTVcdTRmNWNcdTcyNDhcdTY3MmNcdTY4MDdcdThiYzZcdWZmMWFJMjAwNzA2MjUtMTUwMFxuXAotXG5cCi0oYykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIGFuZCBvdGhlcnMgMjAwMCwgMjAwNy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG5cCi1cdThiZjdcdThiYmZcdTk1ZWUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9wbGF0Zm9ybVxuXAotXG5cCi1cdTY3MmNcdTRlYTdcdTU0YzFcdTUzMDVcdTU0MmJcdTc1MzEgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb25cdWZmMDhodHRwOi8vd3d3LmFwYWNoZS5vcmcvXHVmZjA5XHU1ZjAwXHU1M2QxXHU3Njg0XHU4ZjZmXHU0ZWY2XG4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS9ubC96aC9UVy9hYm91dC5wcm9wZXJ0aWVzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtL25sL3poL1RXL2Fib3V0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyNzUxYzUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtL25sL3poL1RXL2Fib3V0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUgotIyBhYm91dC5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBhYm91dC5pbmkKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgZmlsbC1pbnMgYXJlIHN1cHBsaWVkIGJ5IGFib3V0Lm1hcHBpbmdzCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLSMKLSMgRG8gbm90IHRyYW5zbGF0ZSBhbnkgdmFsdWVzIHN1cnJvdW5kZWQgYnkge30KLQotZmVhdHVyZU5hbWU9RWNsaXBzZSBQbGF0Zm9ybSAzLjMuMCB3aXRoIEVNRiBHRUYgR01GCi0KLWJsdXJiPUVjbGlwc2UgXHU1ZTczXHU1M2YwXG5cCi1cblwKLVx1NzI0OFx1NjcyY1x1ZmYxYTMuMy4wXG5cCi1cdTVlZmFcdTdmNmUgSURcdWZmMWFJMjAwNzA2MjUtMTUwMFxuXAotXG5cCi0oYykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIGFuZCBvdGhlcnMgMjAwMCwgMjAwNy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG5cCi1cdThhY2JcdTkwMjBcdThhMmEgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9wbGF0Zm9ybVxuXAotXG5cCi1cdTY3MmNcdTc1MjJcdTU0YzFcdTUzMDVcdTU0MmIgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gaHR0cDovL3d3dy5hcGFjaGUub3JnL1xuXAotXHU2MjQwXHU5NThiXHU3NjdjXHU3Njg0XHU4ZWRmXHU5YWQ0CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0vcGx1Z2luLnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0vcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3ZTQ2NTkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLQotIyBQbHVnLWluCi1mZWF0dXJlUGx1Z2luTmFtZT1FUEYgUGxhdGZvcm0gRmVhdHVyZQotZmVhdHVyZVBsdWdpbk5hbWVOTD1FUEYgUGxhdGZvcm0gRmVhdHVyZQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtL3dlbGNvbWUueG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtL3dlbGNvbWUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMDA5MjQ1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS93ZWxjb21lLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiA/PiAKLTx3ZWxjb21lUGFnZSAKLQl0aXRsZT0iRWNsaXBzZSBNb2RlbGluZyBGcmFtZXdvcmsgKEVNRikiPgotCi08aW50cm8+RU1GIGlzIGEgSmF2YS9YTUwgZnJhbWV3b3JrIGZvciBnZW5lcmF0aW5nIHRvb2xzIGFuZCBvdGhlciBhcHBsaWNhdGlvbnMKLWJhc2VkIG9uIHNpbXBsZSBjbGFzcyBtb2RlbHMuCi08L2ludHJvPgotCi08aXRlbT48Yj5XaGF0IGlzIEVNRj88L2I+Ci0JUmVhZCB0aGUgPHRvcGljIGhyZWY9Ii9vcmcuZWNsaXBzZS5lbWYuZG9jL3JlZmVyZW5jZXMvb3ZlcnZpZXcvRU1GLmh0bWwiPm92ZXJ2aWV3PC90b3BpYz4gYXJ0aWNsZSB0byBsZWFybiBhYm91dCBFTUYuCi0JVGhlbiwgZm9sbG93IHRoZSA8dG9waWMgaHJlZj0iL29yZy5lY2xpcHNlLmVtZi5kb2MvdHV0b3JpYWxzL2NsaWJtb2QvY2xpYm1vZC5odG1sIj50dXRvcmlhbDwvdG9waWM+IHRvIHNlZSBob3cgZWFzeSBpdCBpcyB0byBnZW5lcmF0ZSBhIG1vZGVsLgotPC9pdGVtPgotCi08aXRlbT48Yj5MZWFybiBNb3JlPC9iPgotCVRoaXMgaXMgdGhlIG9mZmljaWFsIHNpdGUgb2YgRU1GOiA8dG9waWMgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mPC90b3BpYz4KLTwvaXRlbT4KLQotPC93ZWxjb21lUGFnZT4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLy5jbGFzc3BhdGggYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNjVhYzA2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS8ucHJvamVjdCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzY2U2ZTZjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWk8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjA3MTg3Yy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aTsgc2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS41LjAucXVhbGlmaWVyCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS5QdWJsaXNoaW5nVUlQbHVnaW4KLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLAotIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZSwKLSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpO3Zpc2liaWxpdHk6PXJlZXhwb3J0LAotIG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nO3Zpc2liaWxpdHk6PXJlZXhwb3J0LAotIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQsCi0gb3JnLmVjbGlwc2UuaGVscC5iYXNlLAotIG9yZy5lY2xpcHNlLnVpLmJyb3dzZXIsCi0gb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aSwKLSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnVpCi1FY2xpcHNlLUxhenlTdGFydDogdHJ1ZQotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLAotIG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLnByZWZlcmVuY2VzLAotIG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLndpemFyZHMKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvYnVpbGQucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0YjgyNDkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotc291cmNlLi4gPSBzcmMvCi1vdXRwdXQuLiA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IC4sXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIGljb25zLyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIHNjaGVtYS8KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpL2ljb25zL1JlcG9ydGluZy5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS9pY29ucy9SZXBvcnRpbmcuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMzhjYzhhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpL2ljb25zL1JlcG9ydGluZy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS9pY29ucy9XZWJQdWJsaXNoLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpL2ljb25zL1dlYlB1Ymxpc2guZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NmRjZjBmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpL2ljb25zL1dlYlB1Ymxpc2guZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvaWNvbnMvZnVsbC93aXpiYW4vUHVibGlzaENvbmZpZ3VyYXRpb24uZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvaWNvbnMvZnVsbC93aXpiYW4vUHVibGlzaENvbmZpZ3VyYXRpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMjQ5ODMxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpL2ljb25zL2Z1bGwvd2l6YmFuL1B1Ymxpc2hDb25maWd1cmF0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpL3BsdWdpbi5wcm9wZXJ0aWVzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzZmU2ODIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUgotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBCRUdJTiBOTyBUUkFOU0xBVElPTgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgRGVmYXVsdCBQdWJsaXNoIFBhdGgKLSMgISEgRE8gTk9UIFRSQU5TTEFURSBUSEUgRk9MTE9XSU5HIExJTkUgISEKLXB1Ymxpc2hQYXRoPTx1c2VyLmhvbWU+LzxhcHAubmFtZT4vUHVibGlzaAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgRU5EIE5PIFRSQU5TTEFUSU9OCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jIFBsdWctaW4KLXBsdWdpbk5hbWU9RVBGIFB1Ymxpc2hpbmcgVUkKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotCi0jIERlZmF1bHQgRmVlZGJhY2sgVVJMCi1mZWVkYmFja1VSTD1odHRwOi8vd3d3LnB1Ymxpc2hlZF93ZWJzaXRlLmNvbS9mZWVkYmFjawotCi0jIFB1Ymxpc2ggQ29uZmlndXJhdGlvbiBBY3Rpb24KLXB1Ymxpc2hDb25maWdBY3Rpb249JlB1Ymxpc2guLi4KLXB1Ymxpc2hDb25maWdBY3Rpb25Ub29sdGlwPVB1Ymxpc2ggYSB3ZWIgc2l0ZSBmb3IgYSBjb25maWd1cmF0aW9uCi0KLSMgUHJlZmVyZW5jZSBQYWdlCi1yb290UGFnZU5hbWU9UHVibGlzaGluZy9Ccm93c2luZwotcm9sZURpYWdyYW1QYWdlTmFtZT1Sb2xlIERpYWdyYW0KLWFjdGl2aXR5RGlhZ3JhbVBhZ2VOYW1lPUFjdGl2aXR5IERpYWdyYW1zCi1zdXBwb3J0aW5nUGx1Z2luUGFnZU5hbWU9U3VwcG9ydGluZyBQbHVnaW5zCi1wdWJsaXNoaW5nT3B0aW9ucz1QdWJsaXNoaW5nIE9wdGlvbnMKLQotIyBQdWJsaXNoaW5nIEFjdGlvbnMKLWNvbmZpZ0FjdGlvblNldD1Db25maWd1cmF0aW9uCi1jb25maWdNZW51PSZDb25maWd1cmF0aW9uCi0KLSMgUHJpbnQgQ29uZmlndXJhdGlvbiBBY3Rpb24KLXByaW50Q29uZmlnQWN0aW9uPVByaW50Ci0KLSMgdGhlIHRpdGxlIGZvciB0aGUgcHVibGlzaGVkIHNpdGUKLSNkb24ndCBkZWZpbmUgaGVyZSwgbGV0IHVzZXIgc3BlY2lmeSBpdC4KLSN0aXRsZT1PcGVuVVAvQmFzaWMKLQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvcGx1Z2luLnhtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxYzQ2NmEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08cGx1Z2luPgotCi0gICA8ZXh0ZW5zaW9uLXBvaW50Ci0gICAgICAgICBpZD0icHVibGlzaENvbmZpZ1dpemFyZCIKLSAgICAgICAgIG5hbWU9IlB1Ymxpc2ggTWV0aG9kIENvbmZpZ3VyYWl0b24gV2l6YXJkIEV4dGVuc2lvbiIKLSAgICAgICAgIHNjaGVtYT0ic2NoZW1hL1B1Ymxpc2hDb25maWdXaXphcmQuZXhzZCIgLz4KLQotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmFjdGlvblNldHMiPgotICAgICAgPGFjdGlvblNldAotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkNvbmZpZ0FjdGlvblNldCIKLSAgICAgICAgICAgIGxhYmVsPSIlY29uZmlnQWN0aW9uU2V0IgotICAgICAgICAgICAgdmlzaWJsZT0iZmFsc2UiPgotICAgICAgICAgPG1lbnUKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS5tZW51LmNvbmZpZ3VyYXRpb24iCi0gICAgICAgICAgICAgICBsYWJlbD0iJWNvbmZpZ01lbnUiCi0gICAgICAgICAgICAgICBwYXRoPSJhZGRpdGlvbnMiLz4gIAotICAgICAgICAgPGFjdGlvbgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLmFjdGlvbnMuUHVibGlzaENvbmZpZ0FjdGlvbiIKLSAgICAgICAgICAgICAgIGhlbHBDb250ZXh0SWQ9Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuY29uZmlndXJhdGlvbl9wdWJsaXNoX2NvbnRleHQiCi0gICAgICAgICAgICAgICBpY29uPSJpY29ucy9XZWJQdWJsaXNoLmdpZiIKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5hY3Rpb25zLlB1Ymxpc2giCi0gICAgICAgICAgICAgICBsYWJlbD0iJXB1Ymxpc2hDb25maWdBY3Rpb24iCi0gICAgICAgICAgICAgICBtZW51YmFyUGF0aD0ib3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkubWVudS5jb25maWd1cmF0aW9uL2FkZGl0aW9ucyIKLSAgICAgICAgICAgICAgIHN0eWxlPSJwdXNoIi8+Ci0gICAgICA8L2FjdGlvblNldD4KLSAgIDwvZXh0ZW5zaW9uPgotCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkucGVyc3BlY3RpdmVFeHRlbnNpb25zIj4KLSAgICAgIDxwZXJzcGVjdGl2ZUV4dGVuc2lvbgotICAgICAgICAgICAgdGFyZ2V0SUQ9Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nUGVyc3BlY3RpdmUiPgotICAgICAgICAgPGFjdGlvblNldAotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkNvbmZpZ0FjdGlvblNldCI+Ci0gICAgICAgICA8L2FjdGlvblNldD4KLSAgICAgIDwvcGVyc3BlY3RpdmVFeHRlbnNpb24+Ci0gICAgICA8cGVyc3BlY3RpdmVFeHRlbnNpb24KLSAgICAgICAgICAgIHRhcmdldElEPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkJyb3dzaW5nUGVyc3BlY3RpdmUiPgotICAgICAgICAgPGFjdGlvblNldAotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkNvbmZpZ0FjdGlvblNldCI+Ci0gICAgICAgICA8L2FjdGlvblNldD4KLSAgICAgIDwvcGVyc3BlY3RpdmVFeHRlbnNpb24+ICAgICAgCi0gICA8L2V4dGVuc2lvbj4KLQotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmFjdGlvblNldFBhcnRBc3NvY2lhdGlvbnMiPgotICAgICAgPGFjdGlvblNldFBhcnRBc3NvY2lhdGlvbgotICAgICAgICAgICAgdGFyZ2V0SUQ9Im9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkNvbmZpZ0FjdGlvblNldCI+Ci0gICAgICAgICA8cGFydAotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5Db25maWd1cmF0aW9uRWRpdG9yIj4KLSAgICAgICAgIDwvcGFydD4KLSAgICAgIDwvYWN0aW9uU2V0UGFydEFzc29jaWF0aW9uPgotICAgPC9leHRlbnNpb24+Ci0KLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnByZWZlcmVuY2VQYWdlcyI+Ci0gICAgICA8cGFnZQotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLnByZWZlcmVuY2VzLlB1Ymxpc2hpbmdQcmVmZXJlbmNlUGFnZSIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS5wcmVmZXJlbmNlcy5QdWJsaXNoaW5nUHJlZmVyZW5jZVBhZ2UiCi0gICAgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2UuZXBmLnVpLnByZWZlcmVuY2VzLlJvb3RQcmVmZXJlbmNlUGFnZSIKLSAgICAgICAgICAgIG5hbWU9IiVyb290UGFnZU5hbWUiLz4KLSAgICAgIDxwYWdlCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkucHJlZmVyZW5jZXMuUm9sZURpYWdyYW1QcmVmZXJlbmNlUGFnZSIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS5wcmVmZXJlbmNlcy5Sb2xlRGlhZ3JhbVByZWZlcmVuY2VQYWdlIgotICAgICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLnByZWZlcmVuY2VzLlB1Ymxpc2hpbmdQcmVmZXJlbmNlUGFnZSIKLSAgICAgICAgICAgIG5hbWU9IiVyb2xlRGlhZ3JhbVBhZ2VOYW1lIi8+Ci0gICAgICA8cGFnZQotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLnByZWZlcmVuY2VzLkFjdGl2aXR5RGlhZ3JhbVByZWZlcmVuY2VQYWdlIgotCSAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLnByZWZlcmVuY2VzLkFjdGl2aXR5RGlhZ3JhbVByZWZlcmVuY2VQYWdlIgotCQkgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLnByZWZlcmVuY2VzLlB1Ymxpc2hpbmdQcmVmZXJlbmNlUGFnZSIKLQkJICAgIG5hbWU9IiVhY3Rpdml0eURpYWdyYW1QYWdlTmFtZSIvPgotCSAgPHBhZ2UKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS5wcmVmZXJlbmNlcy5TdXBwb3J0aW5nUGx1Z2luc1ByZWZlcmVuY2VQYWdlIgotCSAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLnByZWZlcmVuY2VzLlN1cHBvcnRpbmdQbHVnaW5QcmVmZXJlbmNlUGFnZSIKLQkJICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS5wcmVmZXJlbmNlcy5QdWJsaXNoaW5nUHJlZmVyZW5jZVBhZ2UiCi0gICAgICAgICAgICBuYW1lPSIlc3VwcG9ydGluZ1BsdWdpblBhZ2VOYW1lIi8+ICAgIAotICAgPC9leHRlbnNpb24+Ci0KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmRMaXN0ZW5lcnMiPgotICAgICAgPGNvbW1hbmRMaXN0ZW5lciBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkucHJlZmVyZW5jZXMuRGVsZXRlQ29uZmlnQ29tbWFuZExpc3RlbmVyIi8+Ci0gICA8L2V4dGVuc2lvbj4KLQotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS9zY2hlbWEvUHVibGlzaENvbmZpZ1dpemFyZC5leHNkIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvc2NoZW1hL1B1Ymxpc2hDb25maWdXaXphcmQuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWU1Yjg5Ni4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS9zY2hlbWEvUHVibGlzaENvbmZpZ1dpemFyZC5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTcwICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpIj4KLTxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aSIgaWQ9InB1Ymxpc2hDb25maWdXaXphcmQiIG5hbWU9IlB1Ymxpc2ggTWV0aG9kIENvbmZndXJhdGlvbiBXaXphcmQgRXh0ZW5zaW9uIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIEVuYWJsZXMgYSBwbHVnLWluIHRvIGV4dGVuZCB0aGUgUHVibGlzaCBNZXRob2QgQ29uZmlndXJhdGlvbiB3aXphcmQgYnkgcmVwbGFjaW5nIGV4aXN0aW5nIHdpemFyZCBwYWdlcyBvciBhZGRpbmcgbmV3IG9uZXMuCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9IndpemFyZEV4dGVuZGVyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgQSBmdWxseSBxdWFsaWZpZWQgaWRlbnRpZmllciBvZiB0aGUgdGFyZ2V0IGV4dGVuc2lvbiBwb2ludC4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBBbiBvcHRpb25hbCBpZGVudGlmaWVyIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBBbiBvcHRpb25hbCBuYW1lIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9IndpemFyZEV4dGVuZGVyIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0id2l6YXJkUGFnZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJwdWJsaXNoZXIiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgSmF2YSBjbGFzcyB0aGF0IGltcGxlbWVudHMgdGhlIHdpemFyZCBleHRlbmRlci4gVGhpcyBjbGFzcyBtdXN0IGltcGxlbWVudHMgJmx0O2NvZGUmZ3Q7b3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkud2l6YXJkcy5JUHVibGlzaENvbmZpZ1dpemFyZEV4dGVuZGVyJmx0Oy9jb2RlJmd0Oy4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0id2l6YXJkUGFnZSI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSBKYXZhIGNsYXNzIHRoYXQgaW1wbGVtZW50cyB0aGUgd2l6YXJkIHBhZ2UuIFRoaXMgY2xhc3MgbXVzdCBpbXBsZW1lbnRzICZsdDtjb2RlJmd0O29yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkUGFnZSZsdDsvY29kZSZndDsuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idHlwZSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgdHlwZSBvZiBleHRlbnNpb24gLSAmcXVvdDtyZXBsYWNlJnF1b3Q7IG9yICZxdW90O25ldyZxdW90Oy4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ0YXJnZXQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhlIG5hbWUgb2YgdGhlIGJhc2Ugd2l6YXJkIHBhZ2UgdG8gYmUgcmVwbGFjZWQgb3IgdXNlZCBhcyBhIHJlZmVyZW5jZSBmb3IgaW5zZXJ0aW5nIGEgbmV3IHdpemFyZCBwYWdlLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Imluc2VydCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgaW5zZXJ0aW9uIHR5cGUgZm9yIGEgbmV3IHdpemFyZCBwYWdlIC0gJnF1b3Q7YmVmb3JlJnF1b3Q7IG9yICZxdW90O2FmdGVyJnF1b3Q7LgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJwdWJsaXNoZXIiPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgSmF2YSBjbGFzcyB0aGF0IGltcGxlbWVudHMgdGhlIGNvbmZpZ3VyYXRpb24gcHVibGlzaGVyLiBUaGlzIGNsYXNzIG11c3QgZXh0ZW5kcyAmbHQ7Y29kZSZndDtvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5zZWZydmljZXMuQWJzdHJhY3RQdWJsaXNoTWFuYWdlciZsdDsvY29kZSZndDsuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIDEuMAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBUaGUgZm9sbG93aW5nIGlzIGFuIGV4YW1wbGUgb2YgaG93IHRoZSBleHRlbnNpb24gcG9pbnQgY2FuIGJlIHVzZWQ6IAotJmx0O3AmZ3Q7Ci0mbHQ7cHJlJmd0OwotICAgJmx0O2V4dGVuc2lvbiBwb2ludD0mcXVvdDtvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS5wdWJsaXNoQ29uZmlnV2l6YXJkJnF1b3Q7Jmd0OwotICAgICAgJmx0O3dpemFyZEV4dGVuZGVyCi0gICAgICAgICAgICBjbGFzcz0mcXVvdDtvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS53aXphcmRzLk15UHVibGlzaENvbmZpZ1dpemFyZEV4dGVuZGVyJnF1b3Q7Jmd0OwotICAgICAgICAgJmx0O3dpemFyZFBhZ2UKLSAgICAgICAgICAgICAgIGNsYXNzPSZxdW90O29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLndpemFyZHMuTXlTZWxlY3RQdWJsaXNoT3B0aW9uc1BhZ2UmcXVvdDsKLSAgICAgICAgICAgICAgIHR5cGU9JnF1b3Q7cmVwbGFjZSZxdW90OwotICAgICAgICAgICAgICAgdGFyZ2V0PSZxdW90O29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLndpemFyZHMuU2VsZWN0UHVibGlzaE9wdGlvbnNQYWdlJnF1b3Q7LyZndDsKLSAgICAgICAgICZsdDt3aXphcmRQYWdlCi0gICAgICAgICAgICAgICBjbGFzcz0mcXVvdDtvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS53aXphcmRzLk15TmV3UHVibGlzaFBhZ2UmcXVvdDsKLSAgICAgICAgICAgICAgIHR5cGU9JnF1b3Q7bmV3JnF1b3Q7Ci0gICAgICAgICAgICAgICB0YXJnZXQ9JnF1b3Q7b3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkud2l6YXJkcy5TZWxlY3RQdWJsaXNoT3B0aW9uc1BhZ2UmcXVvdDsgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIGluc2VydD0mcXVvdDthZnRlciZxdW90Oy8mZ3Q7ICAgICAgICAgICAgICAgCi0gICAgICAgICAmbHQ7cHVibGlzaGVyCi0gICAgICAgICAgICAgICBjbGFzcz0mcXVvdDtvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5NeUNvbmZpZ1B1Ymxpc2hlciZxdW90Oy8mZ3Q7Ci0gICAgICAmbHQ7L3dpemFyZEV4dGVuZGVyJmd0OwotICAgJmx0Oy9leHRlbnNpb24mZ3Q7Ci0mbHQ7L3ByZSZndDsKLSZsdDsvcCZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuJmx0O2JyJmd0OwotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgJmx0O2EgCi1ocmVmPSZxdW90O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJnF1b3Q7Jmd0O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJmx0Oy9hJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy91aS9QdWJsaXNoZXJFbGVtZW50LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvdWkvUHVibGlzaGVyRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MWI2ODdhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy91aS9QdWJsaXNoZXJFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWk7Ci0KLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5zZXJ2aWNlcy5BYnN0cmFjdFB1Ymxpc2hNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLndpemFyZHMuQWJzdHJhY3RQdWJsaXNoV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgZGVmaW5lcyB0aGUgYXR0cmlidXRlcyBmb3IgYSBwdWJsaXNoZXIgZXh0ZW5zaW9uIHBvaW50Ci0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKgotICovCi1wdWJsaWMgY2xhc3MgUHVibGlzaGVyRWxlbWVudCB7Ci0JQnVuZGxlIGJ1bmRsZTsKLQlwcml2YXRlIFN0cmluZyBpZDsKLQlwcml2YXRlIFN0cmluZyBsYWJlbDsKLQlwcml2YXRlIFN0cmluZyBpY29uOwotCXByaXZhdGUgU3RyaW5nIHdpemFyZENsYXNzOwotCXByaXZhdGUgU3RyaW5nIG1hbmFnZXJDbGFzczsJCi0JCi0JLyoqCi0JICogY29uc3RydWN0b3IgZm9yIFB1Ymxpc2hlckVsZW1lbnQgZXh0ZW5zaW9uIHBvaW50Ci0JICogQHBhcmFtIGJ1bmRsZSBCdW5kbGUgdGhlIGJ1bmRsZSB0aGF0IGxhb2QgdGhlIGVsZW1lbnQgZGVmaW5pdGlvbiBmaWxlCi0JICogQHBhcmFtIGlkIFN0cmluZwotCSAqIEBwYXJhbSBsYWJlbCBTdHJpbmcKLQkgKiBAcGFyYW0gaWNvbiBTdHJpbmcgaWNvbiBwYXRoCi0JICogQHBhcmFtIHdpemFyZENsYXNzIFN0cmluZyB0aGUgcHVibGlzaGluZyB3aXphcmQgY2xhc3MuIAotCSAqIFRoaXMgY2xhc3MgbXVzdCBleHRlbmRzIG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLndpemFyZHMuQWJzdHJhY3RQdWJsaXNoV2l6YXJkIGNsYXNzCi0JICogQHBhcmFtIG1hbmFnZXJDbGFzcyBTdHJpbmcgdGhlIHB1Ymxpc2ggbWFtYWdlciBjbGFzcy4gCi0JICogdGhpcyBjbGFzcyBtdXN0IGV4dGVuZHMgdGhlIG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnNlcnZpY2VzLkFic3RyYWN0UHVibGlzaE1hbmFnZXIgY2xhc3MuCi0JICovCi0JcHVibGljIFB1Ymxpc2hlckVsZW1lbnQoQnVuZGxlIGJ1bmRsZSwgU3RyaW5nIGlkLCBTdHJpbmcgbGFiZWwsIFN0cmluZyBpY29uLCBTdHJpbmcgd2l6YXJkQ2xhc3MsIFN0cmluZyBtYW5hZ2VyQ2xhc3MpIHsKLQkJdGhpcy5idW5kbGUgPSBidW5kbGU7IAotCQl0aGlzLmlkID0gaWQ7Ci0JCXRoaXMubGFiZWwgPSBsYWJlbDsKLQkJdGhpcy5pY29uID0gaWNvbjsKLQkJdGhpcy53aXphcmRDbGFzcyA9IHdpemFyZENsYXNzOwotCQl0aGlzLm1hbmFnZXJDbGFzcyA9IG1hbmFnZXJDbGFzczsJCQotCX0KLQkKLQkvKioKLQkgKiBnZXQgdGhlIHB1Ymxpc2ggd2l6YXJkCi0JICogCi0JICogQHJldHVybiBBYnN0cmFjdFB1Ymxpc2hXaXphcmQKLQkgKiBAdGhyb3dzIEV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBBYnN0cmFjdFB1Ymxpc2hXaXphcmQgZ2V0UHVibGlzaFdpemFyZCgpIHRocm93cyBFeGNlcHRpb24gewotCQlDbGFzcyBjbGF6eiA9IGJ1bmRsZS5sb2FkQ2xhc3Mod2l6YXJkQ2xhc3MpOwotCQlyZXR1cm4gKEFic3RyYWN0UHVibGlzaFdpemFyZCkgY2xhenoubmV3SW5zdGFuY2UoKTsKLQl9Ci0JCi0JLyoqCi0JICogZ2V0IHRoZSBwdWJsaXNoIG1hbmFnZXIKLQkgKiAKLQkgKiBAcmV0dXJuIEFic3RyYWN0UHVibGlzaE1hbmFnZXIKLQkgKiBAdGhyb3dzIEV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBBYnN0cmFjdFB1Ymxpc2hNYW5hZ2VyIGdldFB1Ymxpc2hNYW5hZ2VyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUNsYXNzIGNsYXp6ID0gYnVuZGxlLmxvYWRDbGFzcyhtYW5hZ2VyQ2xhc3MpOwotCQlyZXR1cm4gKEFic3RyYWN0UHVibGlzaE1hbmFnZXIpIGNsYXp6Lm5ld0luc3RhbmNlKCk7Ci0JfQotCQotCS8qKgotCSAqIGdldCB0aGUgaWQgb2YgdGhlIHB1Ymxpc2hlcgotCSAqIAotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJZCgpIHsgCi0JCXJldHVybiBpZDsgCi0JfQotCQotCS8qKgotCSAqIGdldCB0aGUgbGFiZWwgb2YgdGhlIHB1Ymxpc2hlcgotCSAqIAotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMYWJlbCgpIHsKLQkJcmV0dXJuIGxhYmVsOwotCX0KLQkKLQkvKioKLQkgKiBnZXQgdGhlIGltYWdlIGRlc2NyaXB0b3IgZm9yIHRoZSBwdWJsaXNoZXIgaWNvbi4KLQkgKiAKLQkgKiBAcmV0dXJuIEltYWdlRGVzY3JpcHRvcgotCSAqLwotCXB1YmxpYyBJbWFnZURlc2NyaXB0b3IgZ2V0SW1hZ2VEZXNjcmlwdG9yKCkgewotCQlpZiAoIGljb24gPT0gbnVsbCB8fCBpY29uLmxlbmd0aCgpID09IDAgKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQkKLQkJdHJ5IHsKLQkJCVVSTCBpbnN0YWxsVVJMID0gYnVuZGxlLmdldEVudHJ5KCIvIik7IC8vJE5PTi1OTFMtMSQKLQkJCVVSTCBpY29uVVJMID0gbmV3IFVSTChpbnN0YWxsVVJMLCBpY29uKTsKLQkJCXJldHVybiBJbWFnZURlc2NyaXB0b3IuY3JlYXRlRnJvbVVSTChpY29uVVJMKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJfQotCQkKLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3VpL1B1Ymxpc2hpbmdVSVBsdWdpbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3VpL1B1Ymxpc2hpbmdVSVBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NjAzOTQ0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy91aS9QdWJsaXNoaW5nVUlQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS5BYnN0cmFjdFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuQnJvd3NpbmdMYXlvdXRTZXR0aW5nczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wcmVmZXJlbmNlcy5MaWJyYXJ5UHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuTGlicmFyeVVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLnByZWZlcmVuY2VzLkxpYnJhcnlVSVByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLnByZWZlcmVuY2VzLlB1Ymxpc2hpbmdVSVByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotCi0KLS8qKgotICogVGhlIG1haW4gcGx1Z2luIGNsYXNzIGZvciB0aGUgcHVibGlzaGluZyBVSSBwbHVnaW4uCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBQdWJsaXNoaW5nVUlQbHVnaW4gZXh0ZW5kcyBBYnN0cmFjdFBsdWdpbiB7Ci0KLQkvLyBUaGUgc2hhcmVkIGluc3RhbmNlLgotCXByaXZhdGUgc3RhdGljIFB1Ymxpc2hpbmdVSVBsdWdpbiBwbHVnaW47Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBQdWJsaXNoaW5nVUlQbHVnaW4oKSB7Ci0JCXN1cGVyKCk7Ci0JCXBsdWdpbiA9IHRoaXM7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmNvcmUucGx1Z2luLkFic3RyYWN0UGx1Z2luI3N0YXJ0KEJ1bmRsZUNvbnRleHQpCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RhcnQoY29udGV4dCk7Ci0JCQotCQl1cGRhdGVMYXlvdXRTZXR0aW5ncygpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5jb3JlLnBsdWdpbi5BYnN0cmFjdFBsdWdpbiNzdGFydChCdW5kbGVDb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RvcChjb250ZXh0KTsKLQkJcGx1Z2luID0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaGFyZWQgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBQdWJsaXNoaW5nVUlQbHVnaW4gZ2V0RGVmYXVsdCgpIHsKLQkJcmV0dXJuIHBsdWdpbjsKLQl9Ci0KLQkvKioKLQkgKiB1cGRhdGUgdGhlIHB1Ymxpc2hpbmcvYnJvd3NpbmcgbGF5b3V0IHNldHRpbmdzLgotCSAqIENhbGwgdGhpcyBtZXRob2Qgd2hlbiBldmVyIHB1Ymxpc2hpbmcvYnJvd3NpbmcgcmVsYXRlZCBwcmVmZXJlbmNlcyBhcmUgY2hhbmdlZC4KLQkgKgotCSAqLwotCXB1YmxpYyB2b2lkIHVwZGF0ZUxheW91dFNldHRpbmdzKCkgCi0JewotCQkvLyBjYWxsIHRoZSBsaWJyYXJ5IFVJIHRvIHVwZGF0ZSB0aGUgc2V0dGluZ3MgZmlyc3QKLQkJTGlicmFyeVVJUGx1Z2luLmdldERlZmF1bHQoKS51cGRhdGVMYXlvdXRTZXR0aW5ncygpOwotCQkKLQkJLy8gZ2V0IHRoZSBza2luIHNldHRpbmcgZnJvbSBwcmVmZXJlbmNlCi0JCS8vYm9vbGVhbiBwdWJsaXNoVW5vcGVuQWN0aXZpdHlkZCA9IExpYnJhcnlVSVByZWZlcmVuY2VzLmdldFB1Ymxpc2hVbm9wZW5BY3Rpdml0eWRkKCk7CQotCQkvL2Jvb2xlYW4gcHVibGlzaEFERm9yQWN0aXZpdHlFeHRlbnNpb24gPSBMaWJyYXJ5VUlQcmVmZXJlbmNlcy5nZXRQdWJsaXNoQURGb3JBY3Rpdml0eUV4dGVuc2lvbigpOwotCQlib29sZWFuIGV4dHJhRGVzY3JpcHRvckluZm8gPSBQdWJsaXNoaW5nVUlQcmVmZXJlbmNlcy5nZXRFeHRyYURlc2NyaXB0b3JJbmZvKCk7Ci0JCS8vYm9vbGVhbiB1c2VuZXdFeHRlbmRzID0gTGlicmFyeVByZWZlcmVuY2VzLmdldFVzZU5ld0V4dGVuZHNTZW1hbnRpY3MoKTsKLQkJCi0JCS8vQnJvd3NpbmdMYXlvdXRTZXR0aW5ncy5JTlNUQU5DRS5zZXRQdWJsaXNoQURGb3JBY3Rpdml0eUV4dGVuc2lvbihwdWJsaXNoQURGb3JBY3Rpdml0eUV4dGVuc2lvbik7Ci0JCS8vQnJvd3NpbmdMYXlvdXRTZXR0aW5ncy5JTlNUQU5DRS5zZXRQdWJsaXNoVW5vcGVuQWN0aXZpdHlkZChwdWJsaXNoVW5vcGVuQWN0aXZpdHlkZCk7Ci0JCUJyb3dzaW5nTGF5b3V0U2V0dGluZ3MuSU5TVEFOQ0Uuc2V0U2hvd0V4dHJhSW5mb0ZvckRlc2NyaXB0b3JzKGV4dHJhRGVzY3JpcHRvckluZm8pOwotCQkKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvdWkvUHVibGlzaGluZ1VJUmVzb3VyY2VzLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvdWkvUHVibGlzaGluZ1VJUmVzb3VyY2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiNzJkOTkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3VpL1B1Ymxpc2hpbmdVSVJlc291cmNlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLS8qKgotICogVGhlIFB1Ymxpc2hpbmcgVUkgcmVzb3VyY2UgYnVuZGxlLgotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBQdWJsaXNoaW5nVUlSZXNvdXJjZXMgZXh0ZW5kcyBOTFMgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gUHVibGlzaGluZ1VJUmVzb3VyY2VzLmNsYXNzCi0JCQkuZ2V0UGFja2FnZSgpLmdldE5hbWUoKQotCQkJKyAiLlJlc291cmNlcyI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgUHVibGlzaGluZ1VJUmVzb3VyY2VzKCkgewotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHB1Ymxpc2hDb25maWdXaXphcmRfdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzZWxlY3RDb25maWdXaXphcmRQYWdlX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VsZWN0Q29uZmlnV2l6YXJkUGFnZV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29uZmlnTGFiZWxfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlbGVjdENvbnRlbnRXaXphcmRQYWdlX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VsZWN0Q29udGVudFdpemFyZFBhZ2VfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHB1Ymxpc2hDb25maWdSYWRpb0J1dHRvbl90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHVibGlzaFByb2Nlc3Nlc1JhZGlvQnV0dG9uX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBpbmNsdWRlQmFzZVByb2Nlc3Nlc0NoZWNrYm94TGFiZWxfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlbGVjdFB1Ymxpc2hpbmdPcHRpb25zV2l6YXJkUGFnZV90aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlbGVjdFB1Ymxpc2hpbmdPcHRpb25zV2l6YXJkUGFnZV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHVibGlzaFdlYlNpdGVHcm91cF90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGJyb3dzaW5nTGF5b3V0R3JvdXBfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRpdGxlQW5kTGlua3NHcm91cF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbG9va0FuZEZlZWxHcm91cF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdGl0bGVMYWJlbF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgYmFubmVySW1hZ2VMYWJlbF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgYWJvdXRIVE1MTGFiZWxfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGZlZWRiYWNrVVJMTGFiZWxfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdsb3NzYXJ5QW5kSW5kZXhHcm91cF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHVibGlzaEdsb3NzYXJ5TGFiZWxfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHB1Ymxpc2hJbmRleExhYmVsX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB2YWxpZGF0aW9uR3JvdXBfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNoZWNrRXh0ZXJuYWxMaW5rc0xhYmVsX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb252ZXJ0QnJva2VuTGlua3NMYWJlbF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGlhZ3JhbUdyb3VwX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwdWJsaXNoQWN0aXZpdHlEZXRhaWxEaWFncmFtc0xhYmVsX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwdWJsaXNoRXh0ZW5kZWRBY3Rpdml0eURpYWdyYW1zTGFiZWxfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGxheW91dEdyb3VwX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwdWJsaXNoTGlnaHRXZWlnaHRUcmVlTGFiZWxfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHB1Ymxpc2hFeHRyYURlc2NyaXB0b3JJbmZvTGFiZWxfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHB1Ymxpc2hFbXB0eUNhdGVnb3JpZXNMYWJlbF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VsZWN0RGVzdGluYXRpb25XaXphcmRQYWdlX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VsZWN0RGVzdGluYXRpb25XaXphcmRQYWdlX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkaXJMYWJlbF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgd2ViQXBwR3JvdXBfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHN0YXRpY1dlYlNpdGVSYWRpb0J1dHRvbl90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZHluYW1pY1dlYkFwcFJhZGlvQnV0dG9uX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBpbmNsdWRlU2VhcmNoQ2hlY2tib3hfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdlYkFwcGxpY2F0aW9uTmFtZUxhYmVsX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkZXN0aW5hdGlvbkRpcmVjdG9yeUdyb3VwX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwYXRoTGFiZWxfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHVzZURlZmF1bHRQYXRoQ2hlY2tib3hfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHVzZURlZmF1bHRGZWVkYmFja0xhYmVsX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBpbmNsdWRlU2VhcmNoZXNMYWJlbF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2xpZW50U2lkZVNlYXJjaFJhZGlvQnV0dG9uX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzZXJ2ZXJTaWRlU2VhcmNoUmFkaW9CdXR0b25fdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdlbmVyYXRlV0FSRmlsZUxhYmVsX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB1c2VBcHBsZXRDaGVja2JveF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2l0ZUN1c3RvbWl6YXRpb25XaXphcmRQYWdlX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2l0ZUN1c3RvbWl6YXRpb25XaXphcmRQYWdlX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0aGVtZUFuZFNraW5Hcm91cF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2hvd0Jhbm5lckNoZWNrYm94X3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzZWxlY3RTa2luTGFiZWxfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNhcGFiaWxpdHlQYXR0ZXJuc190ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGVsaXZlcnlQcm9jZXNzZXNfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGludmFsaWRWaWV3c0luZm9fbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgaW52YWxpZFZpZXdDb250cmlidXRvckluZm9fbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgaW52YWxpZFZpZXdTYW1lVmlld0luZm9fbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHJlZmVyZW5jZVBhZ2VfZGVmYXVsdFBhdGhfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVsZW1lbnRTcGFjaW5nR3JvdXBfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRhc2tzSG9yaXpvbmFsU3BhY2luZ0xhYmVsX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0YXNrc1ZlcnRpY2FsU3BhY2luZ0xhYmVsX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlbGVtZW50VGV4dExhYmVsR3JvdXBfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG1heExpbmVPZlRleHRMYWJlbF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgaW52YWxpZEhvcml6b25hbFNwYWNpbmdFcnJvcl9tc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBpbnZhbGlkVmVydGljYWxTcGFjaW5nRXJyb3JfbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgaW52YWxpZFRleHRMaW5lc0Vycm9yX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHB1Ymxpc2hDb25maWdEaWFsb2dfdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb25maXJtUGF0aERpYWxvZ190ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgb3ZlcndyaXRlRGlhbG9nX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjYW5jZWxQdWJsaXNoQ29uZmlnX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHByZXZpZXdDb25maWdFcnJvcl90aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHZpZXdSZXBvcnRFcnJvcl90aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG1pc3NpbmdWaWV3RXJyb3JfbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2Fubm90UHVibGlzaEVycm9yX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGludmFsaWRQYXRoRXJyb3JfbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgaW52YWxpZFBhdGhDaGFyc0Vycm9yX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHB1Ymxpc2hDb25maWdFcnJvcl9tc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwcmV2aWV3Q29uZmlnRXJyb3JfbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdmlld1JlcG9ydEVycm9yX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHB1Ymxpc2hDb25maWdFcnJvcl9yZWFzb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkZWxldGVGaWxlc0Vycm9yX3JlYXNvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNyZWF0ZURpckVycm9yX3JlYXNvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG9wZW5Ccm93c2VyRXJyb3JfcmVhc29uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgd2ViQXBwTmFtZUVycm9yX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdlYkFwcE5hbWVDaGFyc0Vycm9yX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNob3dSZWxhdGVkRGVzY3JpcHRvcnNfdGV4dDsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzaG93UmVsYXRlZERlc2NyaXB0b3JzX29wdGlvbl90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2hvd0Rlc2NyaXB0b3JzSW5OYXZpZ2F0aW9uVHJlZV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgaW52YWxpZEFib3V0UGF0aEVycm9yX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGludmFsaWRBYm91dFBhdGhDaGFyc0Vycm9yX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlbGVjdERlZmF1bHRBY3Rpdml0eVRhYl90ZXh0OwotCi0Jc3RhdGljIHsKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgUHVibGlzaGluZ1VJUmVzb3VyY2VzLmNsYXNzKTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvdWkvUmVzb3VyY2VzLnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvdWkvUmVzb3VyY2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3NWVhZjcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3VpL1Jlc291cmNlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTM3ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSCi0KLSMgUHVibGlzaCBNZXRob2QgQ29uZmlndXJhdGlvbiBXaXphcmQKLXB1Ymxpc2hDb25maWdXaXphcmRfdGl0bGU9UHVibGlzaCBNZXRob2QgQ29uZmlndXJhdGlvbgotCi0jIFNlbGVjdCBNZXRob2QgQ29uZmlndXJhdGlvbiBXaXphcmQgUGFnZQotc2VsZWN0Q29uZmlnV2l6YXJkUGFnZV90aXRsZT1TZWxlY3QgbWV0aG9kIGNvbmZpZ3VyYXRpb24KLXNlbGVjdENvbmZpZ1dpemFyZFBhZ2VfdGV4dD1TZWxlY3QgYSBtZXRob2QgY29uZmlndXJhdGlvbiB0aGF0IGNvbnRhaW5zIHRoZSBtZXRob2QgY29udGVudCBhbmQgcHJvY2Vzc2VzIHdoaWNoIHlvdSB3b3VsZCBsaWtlIHRvIHB1Ymxpc2guCi1jb25maWdMYWJlbF90ZXh0PU1ldGhvZCBjb25maWd1cmF0aW9uOgotCi0jIFNlbGVjdCBNZXRob2QgQ29uZmlndXJhdGlvbiBDb250ZW50IFdpemFyZCBQYWdlCi1zZWxlY3RDb250ZW50V2l6YXJkUGFnZV90aXRsZT1TZWxlY3QgbWV0aG9kIGNvbmZpZ3VyYXRpb24gY29udGVudAotc2VsZWN0Q29udGVudFdpemFyZFBhZ2VfdGV4dD1TZWxlY3QgdGhlIG1ldGhvZCBjb25maWd1cmF0aW9uIGNvbnRlbnQgdG8gcHVibGlzaC4gWW91IGNhbiBjaG9vc2UgdG8gcHVibGlzaCB0aGUgZW50aXJlIGNvbmZpZ3VyYXRpb24gb3Igb25seSBhIGZldyBzZWxlY3QgcHJvY2Vzc2VzIGluIHRoZSBjb25maWd1cmF0aW9uLgotcHVibGlzaENvbmZpZ1JhZGlvQnV0dG9uX3RleHQ9UHVibGlzaCB0aGUgZW50aXJlIGNvbmZpZ3VyYXRpb24KLXB1Ymxpc2hQcm9jZXNzZXNSYWRpb0J1dHRvbl90ZXh0PVB1Ymxpc2ggc2VsZWN0ZWQgcHJvY2Vzc2VzOgotaW5jbHVkZUJhc2VQcm9jZXNzZXNDaGVja2JveExhYmVsX3RleHQ9UHVibGlzaCByZWZlcmVuY2VkIGJhc2UgcHJvY2Vzc2VzCi0KLSMgU2VsZWN0IFB1Ymxpc2hpbmcgT3B0aW9ucyBXaXphcmQgUGFnZQotc2VsZWN0UHVibGlzaGluZ09wdGlvbnNXaXphcmRQYWdlX3RpdGxlPVNlbGVjdCBwdWJsaXNoaW5nIG9wdGlvbnMKLXNlbGVjdFB1Ymxpc2hpbmdPcHRpb25zV2l6YXJkUGFnZV90ZXh0PVNlbGVjdCB0aGUgcHVibGlzaGluZyBvcHRpb25zLiBUaGVzZSBvcHRpb25zIHdpbGwgYmUgdXNlZCB0byBjdXN0b21pemUgdGhlIGxvb2sgYW5kIGJlaGF2aW9yIG9mIHRoZSBwdWJsaXNoZWQgd2Vic2l0ZS4KLXRpdGxlQW5kTGlua3NHcm91cF90ZXh0PVRpdGxlIGFuZCBsaW5rcwotdGl0bGVMYWJlbF90ZXh0PVRpdGxlOgotYWJvdXRIVE1MTGFiZWxfdGV4dD1BYm91dCBjb250ZW50OgotZmVlZGJhY2tVUkxMYWJlbF90ZXh0PUZlZWRiYWNrIFVSTDoKLWdsb3NzYXJ5QW5kSW5kZXhHcm91cF90ZXh0PUdsb3NzYXJ5IGFuZCBpbmRleAotcHVibGlzaEdsb3NzYXJ5TGFiZWxfdGV4dD1QdWJsaXNoIGdsb3NzYXJ5Ci1wdWJsaXNoSW5kZXhMYWJlbF90ZXh0PVB1Ymxpc2ggaW5kZXgKLWxvb2tBbmRGZWVsR3JvdXBfdGV4dD1Mb29rIGFuZCBmZWVsCi1iYW5uZXJJbWFnZUxhYmVsX3RleHQ9QmFubmVyIGltYWdlOgotdmFsaWRhdGlvbkdyb3VwX3RleHQ9VmFsaWRhdGlvbgotY2hlY2tFeHRlcm5hbExpbmtzTGFiZWxfdGV4dD1DaGVjayBleHRlcm5hbCBoeXBlcmxpbmtzCi1jb252ZXJ0QnJva2VuTGlua3NMYWJlbF90ZXh0PUNvbnZlcnQgYnJva2VuIGh5cGVybGlua3MgdG8gcGxhaW4gdGV4dAotZGlhZ3JhbUdyb3VwX3RleHQ9RGlhZ3JhbXMKLXB1Ymxpc2hBY3Rpdml0eURldGFpbERpYWdyYW1zTGFiZWxfdGV4dD1QdWJsaXNoIGFjdGl2aXR5IGRldGFpbCBkaWFncmFtcyB0aGF0IGhhdmUgbm90IGJlZW4gbWFudWFsbHkgY3JlYXRlZAotcHVibGlzaEV4dGVuZGVkQWN0aXZpdHlEaWFncmFtc0xhYmVsX3RleHQ9UHVibGlzaCBhY3Rpdml0eSBkaWFncmFtcyBmb3IgdW5tb2RpZmllZCBhY3Rpdml0eSBleHRlbnNpb25zCi1sYXlvdXRHcm91cF90ZXh0PUxheW91dAotcHVibGlzaExpZ2h0V2VpZ2h0VHJlZUxhYmVsX3RleHQ9U2hvdyByZWxhdGlvbnNoaXAgc3ViLWZvbGRlcnMgaW4gbmF2aWdhdGlvbiB0cmVlcwotcHVibGlzaEV4dHJhRGVzY3JpcHRvckluZm9MYWJlbF90ZXh0PUluY2x1ZGUgbWV0aG9kIGNvbnRlbnQgaW4gZGVzY3JpcHRvciBwYWdlcwotcHVibGlzaEVtcHR5Q2F0ZWdvcmllc0xhYmVsX3RleHQ9UHVibGlzaCBjYXRlZ29yaWVzIHdpdGggbm8gY2F0ZWdvcml6ZWQgZWxlbWVudHMKLXB1Ymxpc2hXZWJTaXRlR3JvdXBfdGV4dD1QdWJsaXNoZWQgd2Vic2l0ZQotYnJvd3NpbmdMYXlvdXRHcm91cF90ZXh0PUJyb3dzaW5nIExheW91dAotc2hvd1JlbGF0ZWREZXNjcmlwdG9yc190ZXh0PVB1Ymxpc2ggcHJvY2VzcyB1c2FnZSBpbiByb2xlLCB0YXNrIGFuZCB3b3JrIHByb2R1Y3QgcGFnZXMgbGlua2luZyB0byByZWxhdGVkIGRlc2NyaXB0b3JzCi1zaG93UmVsYXRlZERlc2NyaXB0b3JzX29wdGlvbl90ZXh0PVNob3cgYWxsIGluZGlyZWN0IChncmVlbikgb2NjdXJyZW5jZXMgaW4gZXh0ZW5kZWQgcGF0dGVybnMKLXNob3dEZXNjcmlwdG9yc0luTmF2aWdhdGlvblRyZWVfdGV4dD1TaG93IHRhc2sgZGVzY3JpcHRvcnMgaW4gbmF2aWdhdGlvbiB0cmVlcwotc2VsZWN0RGVmYXVsdEFjdGl2aXR5VGFiX3RleHQ9RGVmYXVsdCB0YWIgZm9yIGFjdGl2aXR5IHBhZ2VzOgotCi0jIFNlbGVjdCBEZXN0aW5hdGlvbiBXaXphcmQgUGFnZQotc2VsZWN0RGVzdGluYXRpb25XaXphcmRQYWdlX3RpdGxlPVNlbGVjdCBkZXN0aW5hdGlvbiBkaXJlY3RvcnkgYW5kIHdlYnNpdGUgZm9ybWF0Ci1zZWxlY3REZXN0aW5hdGlvbldpemFyZFBhZ2VfdGV4dD1TZWxlY3QgdGhlIGRlc3RpbmF0aW9uIGRpcmVjdG9yeSBhbmQgZm9ybWF0IGZvciB0aGUgcHVibGlzaGVkIHdlYnNpdGUuCi1kaXJMYWJlbF90ZXh0PURpcmVjdG9yeToKLXdlYkFwcEdyb3VwX3RleHQ9V2Vic2l0ZSBmb3JtYXQKLXN0YXRpY1dlYlNpdGVSYWRpb0J1dHRvbl90ZXh0PVN0YXRpYyB3ZWIgc2l0ZQotZHluYW1pY1dlYkFwcFJhZGlvQnV0dG9uX3RleHQ9SmF2YSBFRSB3ZWIgYXBwbGljYXRpb24gcGFja2FnZWQgaW4gYSBXQVIgZmlsZSAocmVxdWlyZXMgSmF2YSBTZXJ2bGV0IDIuMyBvciBhYm92ZSBjb21wbGlhbnQgc2VydmxldCBjb250YWluZXIpCi1pbmNsdWRlU2VhcmNoQ2hlY2tib3hfdGV4dD1JbmNsdWRlIHNlYXJjaCBjYXBhYmlsaXR5Ci13ZWJBcHBsaWNhdGlvbk5hbWVMYWJlbF90ZXh0PVdlYiBhcHBsaWNhdGlvbiBuYW1lOgotCi1kZXN0aW5hdGlvbkRpcmVjdG9yeUdyb3VwX3RleHQ9RGVzdGluYXRpb24gZGlyZWN0b3J5Ci1wYXRoTGFiZWxfdGV4dD1QYXRoOgotdXNlRGVmYXVsdFBhdGhDaGVja2JveF90ZXh0PVVzZSBkZWZhdWx0IHBhdGgKLXVzZURlZmF1bHRGZWVkYmFja0xhYmVsX3RleHQ9VXNlIGRlZmF1bHQgZmVlZGJhY2sgVVJMCi0KLWluY2x1ZGVTZWFyY2hDaGVja2JveF90ZXh0PUluY2x1ZGUgc2VhcmNoIGNhcGFiaWxpdHkgKHJlcXVpcmVzIGNvbnRhaW5lciBmb3Igc2VydmxldCkKLWluY2x1ZGVTZWFyY2hlc0xhYmVsX3RleHQ9SW5jbHVkZSBzZWFyY2ggY2FwYWJpbGl0eQotY2xpZW50U2lkZVNlYXJjaFJhZGlvQnV0dG9uX3RleHQ9IENsaWVudCBzaWRlIHNlYXJjaCAocmVxdWlyZXMgSmF2YSBhcHBsZXQgc3VwcG9ydCBpbiBicm93c2VyKQotc2VydmVyU2lkZVNlYXJjaFJhZGlvQnV0dG9uX3RleHQ9IFNlcnZlciBzaWRlIHNlYXJjaCAocmVxdWlyZXMgQ29udGFpbmVyIGZvciBzZXJ2bGV0KQotZ2VuZXJhdGVXQVJGaWxlTGFiZWxfdGV4dD1HZW5lcmF0ZSBXQVIgKFdlYiBBUmNoaXZlKSBmaWxlCi0KLXVzZUFwcGxldENoZWNrYm94X3RleHQ9U3VwcG9ydCB2aWV3IGN1c3RvbWl6YXRpb24gKHJlcXVpcmVzIEphdmEgYXBwbGV0IHN1cHBvcnQgaW4gYnJvd3NlcikKLQotc2l0ZUN1c3RvbWl6YXRpb25XaXphcmRQYWdlX3RpdGxlPUN1c3RvbWl6ZSBXZWJzaXRlCi1zaXRlQ3VzdG9taXphdGlvbldpemFyZFBhZ2VfdGV4dD1DdXN0b21pemUgV2Vic2l0ZSBsb29rIGFuZCBmZWVsCi10aGVtZUFuZFNraW5Hcm91cF90ZXh0PVRoZW1lIGFuZCBTa2luCi1zaG93QmFubmVyQ2hlY2tib3hfdGV4dD1TaG93IGJhbm5lcgotc2VsZWN0U2tpbkxhYmVsX3RleHQ9U2VsZWN0IHNraW46Ci0KLSMgRklYTUUhIFNob3VsZCB0aGVzZSBiZSB3YXJuaW5nIG1lc3NhZ2VzPwotIyBJbmZvcm1hdGlvbiBNZXNzYWdlCi1pbnZhbGlkVmlld3NJbmZvX21zZz1UaGUgZm9sbG93aW5nIHZpZXcocykgaW4gY29uZmlndXJhdGlvbiAnJ3swfScnIHdpbGwgbm90IGJlIHB1Ymxpc2hlZDoKLWludmFsaWRWaWV3Q29udHJpYnV0b3JJbmZvX21zZz17MH06IFRoZSB2aWV3IGlzIGEgY29udHJpYnV0b3IKLWludmFsaWRWaWV3U2FtZVZpZXdJbmZvX21zZz17MH06IFRoaXMgdmlldyBpcyBhIGR1cGxpY2F0ZSBvZiBhbm90aGVyIHZpZXcKLQotY2FwYWJpbGl0eVBhdHRlcm5zX3RleHQ9Q2FwYWJpbGl0eSBQYXR0ZXJucwotZGVsaXZlcnlQcm9jZXNzZXNfdGV4dD1EZWxpdmVyeSBQcm9jZXNzZXMKLQotIyBQdWJsaXNoaW5nIFByZWZlcmVuY2UgUGFnZQotcHJlZmVyZW5jZVBhZ2VfZGVmYXVsdFBhdGhfdGV4dD1EZWZhdWx0IHBhdGg6Ci0KLSMgUm9sZSBEaWFncmFtIFByZWZlcmVuY2UgUGFnZQotZWxlbWVudFNwYWNpbmdHcm91cF90ZXh0PVNwYWNpbmcgYmV0d2VlbiB0YXNrIGFuZCB3b3JrIHByb2R1Y3QgZWxlbWVudHMKLXRhc2tzSG9yaXpvbmFsU3BhY2luZ0xhYmVsX3RleHQ9SG9yaXpvbnRhbCBzcGFjaW5nOgotdGFza3NWZXJ0aWNhbFNwYWNpbmdMYWJlbF90ZXh0PVZlcnRpY2FsIHNwYWNpbmc6Ci1lbGVtZW50VGV4dExhYmVsR3JvdXBfdGV4dD1FbGVtZW50IGxhYmVscwotbWF4TGluZU9mVGV4dExhYmVsX3RleHQ9TWF4aW11bSBsaW5lIG9mIHRleHQ6Ci0KLSMgUm9sZSBEaWFncmFtIFByZWZlcmVuY2UgUGFnZSBFcnJvciBNZXNzYWdlcwotaW52YWxpZEhvcml6b25hbFNwYWNpbmdFcnJvcl9tc2c9SG9yaXpvbnRhbCBzcGFjaW5nIG11c3QgYmUgYW4gaW50ZWdlciB3aXRoIHZhbHVlIHJhbmdpbmcgZnJvbSB7MH0gdG8gezF9LgotaW52YWxpZFZlcnRpY2FsU3BhY2luZ0Vycm9yX21zZz1WZXJ0aWNhbCBzcGFjaW5nIG11c3QgYmUgYW4gaW50ZWdlciB3aXRoIHZhbHVlIHJhbmdpbmcgZnJvbSB7MH0gdG8gezF9LgotaW52YWxpZFRleHRMaW5lc0Vycm9yX21zZz1OdW1iZXIgb2YgdGV4dCBsaW5lcyBtdXN0IGJlIGFuIGludGVnZXIgd2l0aCB2YWx1ZSByYW5naW5nIGZyb20gezB9IHRvIHsxfS4KLQotIyBDb25maXJtYXRpb24gRGlhbG9ncwotcHVibGlzaENvbmZpZ0RpYWxvZ190aXRsZT1QdWJsaXNoIE1ldGhvZCBDb25maWd1cmF0aW9uCi1jb25maXJtUGF0aERpYWxvZ190ZXh0PVRoZSBkZXN0aW5hdGlvbiBwYXRoIGhhcyBiZWVuIHJlc29sdmVkIHRvICcnezB9JycuIERvIHlvdSB3YW50IHRvIHByb2NlZWQ/Ci1vdmVyd3JpdGVEaWFsb2dfdGV4dD1UaGUgZGVzdGluYXRpb24gcGF0aCAnJ3swfScnIGFscmVhZHkgZXhpc3RzLiBBbGwgZmlsZXMgaW4gdGhlIGZvbGRlciB3aWxsIGJlIGRlbGV0ZWQuIERvIHlvdSB3YW50IHRvIHByb2NlZWQ/Ci1jYW5jZWxQdWJsaXNoQ29uZmlnX21zZz1UaGUgcHVibGlzaGluZyBvcGVyYXRpb24gaGFzIGJlZW4gY2FuY2VsbGVkLgotCi0jIEVycm9yIERpYWxvZ3MKLXByZXZpZXdDb25maWdFcnJvcl90aXRsZT1QcmV2aWV3IFB1Ymxpc2hlZCBNZXRob2QgQ29uZmlndXJhdGlvbgotdmlld1JlcG9ydEVycm9yX3RpdGxlPVZpZXcgUHVibGlzaGluZyBSZXBvcnQKLQotIyBFcnJvciBNZXNzYWdlcwotbWlzc2luZ1ZpZXdFcnJvcl9tc2c9SVVQUDAxMDBFOiBUaGUgc2VsZWN0ZWQgY29uZmlndXJhdGlvbiBkb2VzIG5vdCBjb250YWluIGEgdmFsaWQgdmlldy4gRWRpdCB0aGUgY29uZmlndXJhdGlvbiBhbmQgYWRkIGEgdmlldywgb3Igc2VsZWN0IGFub3RoZXIgY29uZmlndXJhdGlvbi4KLWNhbm5vdFB1Ymxpc2hFcnJvcl9tc2c9SVVQUDAxMDFFOiBUaGUgc2VsZWN0ZWQgY29uZmlndXJhdGlvbiBjYW5ub3QgYmUgcHVibGlzaGVkLgotaW52YWxpZFBhdGhFcnJvcl9tc2c9SVVQUDAxMDJFOiBUaGUgZGVzdGluYXRpb24gcGF0aCBpcyBibGFuayBvciBpbnZhbGlkLgotaW52YWxpZFBhdGhDaGFyc0Vycm9yX21zZz1JVVBQMDEwM0U6IFRoZSBkZXN0aW5hdGlvbiBwYXRoIGNhbm5vdCBjb250YWluIHRoZXNlIGNoYXJhY3RlcnM6IFxcICMgKiA/ICIgPCA+IHwgISAlIC8KLXB1Ymxpc2hDb25maWdFcnJvcl9tc2c9SVVQUDAxMDRFOiBUaGUgc2VsZWN0ZWQgY29uZmlndXJhdGlvbiB3YXMgbm90IHB1Ymxpc2hlZCBzdWNjZXNzZnVsbHkuCi1wcmV2aWV3Q29uZmlnRXJyb3JfbXNnPUlVUFAwMTA1RTogVW5hYmxlIHRvIG9wZW4gYW4gSFRNTCBicm93c2VyIHRvIHByZXZpZXcgdGhlIHB1Ymxpc2hlZCBjb25maWd1cmF0aW9uLgotdmlld1JlcG9ydEVycm9yX21zZz1JVVBQMDEwNkU6IFVuYWJsZSB0byBvcGVuIGFuIEhUTUwgYnJvd3NlciB0byB2aWV3IHRoZSBwdWJsaXNoaW5nIHJlcG9ydC4KLXdlYkFwcE5hbWVFcnJvcl9tc2c9SVVQUDAxMDdFOiBUaGUgd2ViIGFwcGxpY2F0aW9uIG5hbWUgbXVzdCBiZSBzcGVjaWZpZWQuCi13ZWJBcHBOYW1lQ2hhcnNFcnJvcl9tc2c9SVVQUDAxMDhFOiBUaGUgd2ViIGFwcGxpY2F0aW9uIG5hbWUgY2Fubm90IGNvbnRhaW4gdGhlc2UgY2hhcmFjdGVyczogXFwgIyAqID8gIiA8ID4gfCAhICUgLwotaW52YWxpZEFib3V0UGF0aEVycm9yX21zZz1JVVBQMDEwOUU6IFRoZSBwYXRoIGlzIGludmFsaWQuCi1pbnZhbGlkQWJvdXRQYXRoQ2hhcnNFcnJvcl9tc2c9SVVQUDAxMTBFOiBUaGUgcGF0aCBjYW5ub3QgY29udGFpbiB0aGVzZSBjaGFyYWN0ZXJzOiAjICogPyAiIDwgPiB8ICEgJSAvCi0KLSMgRXJyb3IgUmVhc29ucyAmIFJlY29tbWVuZGVkIEFjdGlvbnMKLXB1Ymxpc2hDb25maWdFcnJvcl9yZWFzb249Q2xpY2sgRGV0YWlscyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLWRlbGV0ZUZpbGVzRXJyb3JfcmVhc29uPVRoZSBkZXN0aW5hdGlvbiBwYXRoICcnezB9JycgY29udGFpbnMgZmlsZXMgdGhhdCBjYW5ub3QgYmUgZGVsZXRlZC5cblxuQ2xvc2UgdGhpcyBkaWFsb2cgYW5kIHNwZWNpZnkgYW5vdGhlciBwYXRoLgotY3JlYXRlRGlyRXJyb3JfcmVhc29uPVRoZSBkZXN0aW5hdGlvbiBwYXRoICcnezB9JycgY2Fubm90IGJlIGNyZWF0ZWQuXG5cbkNsb3NlIHRoaXMgZGlhbG9nIGFuZCBzcGVjaWZ5IGFub3RoZXIgcGF0aC4KLW9wZW5Ccm93c2VyRXJyb3JfcmVhc29uPVRoZSBkZWZhdWx0IEhUTUwgYnJvd3NlciBvbiB0aGlzIHN5c3RlbSBjYW5ub3QgYmUgZGV0ZWN0ZWQgb3IgbG9jYXRlZC5cblxuQ2xvc2UgdGhpcyBkaWFsb2cgYW5kIG9wZW4gdGhlIGZpbGUgJyd7MH0nJyBtYW51YWxseSB3aXRoIGFuIEhUTUwgYnJvd3Nlci4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvdWkvYWN0aW9ucy9QdWJsaXNoQ29uZmlnQWN0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvdWkvYWN0aW9ucy9QdWJsaXNoQ29uZmlnQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlYTk5MTkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3VpL2FjdGlvbnMvUHVibGlzaENvbmZpZ0FjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLlB1Ymxpc2hpbmdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS53aXphcmRzLlB1Ymxpc2hDb25maWdXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmREaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3dBY3Rpb25EZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotCi0vKioKLSAqIEludm9rZXMgdGhlIFB1Ymxpc2ggTWV0aG9kIENvbmZpZ3VyYXRpb24gd2l6YXJkLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBQdWJsaXNoQ29uZmlnQWN0aW9uIGltcGxlbWVudHMgSVdvcmtiZW5jaFdpbmRvd0FjdGlvbkRlbGVnYXRlIHsKLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvd0FjdGlvbkRlbGVnYXRlI2luaXQoSVdvcmtiZW5jaFdpbmRvdykKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2hXaW5kb3cgd2luZG93KSB7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JQWN0aW9uRGVsZWdhdGUjcnVuKElBY3Rpb24pCi0JICovCi0JcHVibGljIHZvaWQgcnVuKElBY3Rpb24gYWN0aW9uKSB7Ci0JCXRyeSB7Ci0JCQkvLyBJbnN0YW50aWF0ZSBhbmQgaW5pdGlhbGl6ZSB0aGUgUHVibGlzaCBNZXRob2QgQ29uZmlndXJhaXRvbgotCQkJLy8gd2l6YXJkLgotCQkJUHVibGlzaENvbmZpZ1dpemFyZCB3aXphcmQgPSBuZXcgUHVibGlzaENvbmZpZ1dpemFyZCgpOwotCQkJd2l6YXJkLmluaXQoUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKSwgbnVsbCk7Ci0KLQkJCS8vIEluc3RhbnRpYXRlIHRoZSB3aXphcmQgY29udGFpbmVyIHdpdGggdGhlIHdpemFyZCBhbmQgb3BlbiBpdC4KLQkJCVdpemFyZERpYWxvZyBkaWFsb2cgPSBuZXcgV2l6YXJkRGlhbG9nKERpc3BsYXkuZ2V0Q3VycmVudCgpCi0JCQkJCS5nZXRBY3RpdmVTaGVsbCgpLCB3aXphcmQpOwotCQkJZGlhbG9nLmNyZWF0ZSgpOwotCQkJZGlhbG9nLm9wZW4oKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVB1Ymxpc2hpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoCi0JCQkJCSJFcnJvciBwdWJsaXNoaW5nIGNvbnRlbnQiLCBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JQWN0aW9uRGVsZWdhdGUjc2VsZWN0aW9uQ2hhbmdlZChJQWN0aW9uLCBJU2VsZWN0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoSUFjdGlvbiBhY3Rpb24sIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93QWN0aW9uRGVsZWdhdGUjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy91aS9hY3Rpb25zL3BhY2thZ2UuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy91aS9hY3Rpb25zL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDU4ZWUwNy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvdWkvYWN0aW9ucy9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyBhY3Rpb25zIGZvciB0aGUgcHVibGlzaGluZyBVSS4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvdWkvaW50ZXJuYWwvd2l6YXJkcy9QdWJsaXNoQ29uZmlnT3BlcmF0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvdWkvaW50ZXJuYWwvd2l6YXJkcy9QdWJsaXNoQ29uZmlnT3BlcmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmMzczOWYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3VpL2ludGVybmFsL3dpemFyZHMvUHVibGlzaENvbmZpZ09wZXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLmludGVybmFsLndpemFyZHM7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS51dGlsLk1zZ0RpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5zZXJ2aWNlcy5TYWZlVXBkYXRlQ29udHJvbGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5QdWJsaXNoaW5nUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnNlcnZpY2VzLkFic3RyYWN0UHVibGlzaE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcuc2VydmljZXMuQWJzdHJhY3RWaWV3QnVpbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5zZXJ2aWNlcy5QdWJsaXNoSFRNTE9wdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcuc2VydmljZXMuUHVibGlzaE9wdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkuUHVibGlzaGluZ1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLlB1Ymxpc2hpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uSVJ1bm5hYmxlV2l0aFByb2dyZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmJyb3dzZXIuQnJvd3NlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QucHJvZ3JhbS5Qcm9ncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci0KLS8qKgotICogVGhlIHB1Ymxpc2ggY29uZmlndXJhdGlvbiBvcGVyYXRpb24uCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFB1Ymxpc2hDb25maWdPcGVyYXRpb24gaW1wbGVtZW50cyBJUnVubmFibGVXaXRoUHJvZ3Jlc3MgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBVQkxJU0hfQ09ORklHX0VSUk9SX1RJVExFID0gUHVibGlzaGluZ1VJUmVzb3VyY2VzLnB1Ymxpc2hDb25maWdEaWFsb2dfdGl0bGU7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQVUJMSVNIX0NPTkZJR19FUlJPUl9NU0cgPSBQdWJsaXNoaW5nVUlSZXNvdXJjZXMucHVibGlzaENvbmZpZ0Vycm9yX21zZzsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBVQkxJU0hfQ09ORklHX0VSUk9SX1JFQVNPTiA9IFB1Ymxpc2hpbmdVSVJlc291cmNlcy5wdWJsaXNoQ29uZmlnRXJyb3JfcmVhc29uOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFVklFV19DT05GSUdfRVJST1JfVElUTEUgPSBQdWJsaXNoaW5nVUlSZXNvdXJjZXMucHJldmlld0NvbmZpZ0Vycm9yX3RpdGxlOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFVklFV19DT05GSUdfRVJST1JfTVNHID0gUHVibGlzaGluZ1VJUmVzb3VyY2VzLnByZXZpZXdDb25maWdFcnJvcl9tc2c7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBWSUVXX1JFUE9SVF9FUlJPUl9USVRMRSA9IFB1Ymxpc2hpbmdVSVJlc291cmNlcy52aWV3UmVwb3J0RXJyb3JfdGl0bGU7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBWSUVXX1JFUE9SVF9FUlJPUl9NU0cgPSBQdWJsaXNoaW5nVUlSZXNvdXJjZXMudmlld1JlcG9ydEVycm9yX21zZzsgLy8kTk9OLU5MUy0xJAkKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBPUEVOX0JST1dTRVJfRVJST1JfUkVBU09OID0gUHVibGlzaGluZ1VJUmVzb3VyY2VzLm9wZW5Ccm93c2VyRXJyb3JfcmVhc29uOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFVCTElTSF9DT05GSUdfQ0FOQ0VMX01TRyA9IFB1Ymxpc2hpbmdVSVJlc291cmNlcy5jYW5jZWxQdWJsaXNoQ29uZmlnX21zZzsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBBYnN0cmFjdFB1Ymxpc2hNYW5hZ2VyIHB1Ymxpc2hNZ3I7Ci0KLQlwcml2YXRlIFN0cmluZyBwdWJsaXNoZWRfdXJsOwotCi0JcHJpdmF0ZSBTdHJpbmcgcmVwb3J0X3VybDsKLQotCXByaXZhdGUgTXNnRGlhbG9nIG1zZ0RpYWxvZzsKLQotCXByaXZhdGUgRXhjZXB0aW9uIHJ1bkV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFB1Ymxpc2hDb25maWdPcGVyYXRpb24oQWJzdHJhY3RQdWJsaXNoTWFuYWdlciBwdWJsaXNoTWdyKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMucHVibGlzaE1nciA9IHB1Ymxpc2hNZ3I7Ci0JCXRoaXMubXNnRGlhbG9nID0gUHVibGlzaGluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKTsKLQl9Ci0KLQkvKioKLQkgKiBnZXQgdGhlIHZpZXcgYnVpbGRlci4KLQkgKiAKLQkgKiBAcmV0dXJuIEFic3RyYWN0Vmlld0J1aWxkZXIKLQkgKi8KLQlwdWJsaWMgQWJzdHJhY3RWaWV3QnVpbGRlciBnZXRWaWV3QnVpbGRlcigpIHsKLQkJcmV0dXJuIHRoaXMucHVibGlzaE1nci5nZXRWaWV3QnVpbGRlcigpOwotCX0KLQotCS8qKgotCSAqIGdldCB0aGUgdXJsIGZvciB0aGUgcHVibGlzaGVkIHNpdGUKLQkgKiAKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UHVibGlzaGVkVXJsKCkgewotCQlyZXR1cm4gcHVibGlzaGVkX3VybDsKLQl9Ci0KLQkvKioKLQkgKiBydW4gdGhlIG9wZXJhdGlvbiB0byBwZXJmb3JtIHRoZSBwdWJsaXNoaW5nIHRhc2suCi0JICogCi0JICogQHBhcmFtIG1vbml0b3IKLQkgKiAgICAgICAgICAgIElQcm9ncmVzc01vbml0b3IKLQkgKiBAdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwKLQkJCUludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJcnVuRXhjZXB0aW9uID0gbnVsbDsKLQkJdHJ5IHsKLQkJCW1vbml0b3IKLQkJCQkJLnNldFRhc2tOYW1lKFB1Ymxpc2hpbmdSZXNvdXJjZXMucHVibGlzaGluZ0NvbmZpZ3VyYXRpb25UYXNrX25hbWUpOyAvLyROT04tTkxTLTEkCQkJCi0JCQlwdWJsaXNoTWdyLnB1Ymxpc2gobW9uaXRvcik7Ci0KLQkJCXB1Ymxpc2hlZF91cmwgPSBwdWJsaXNoTWdyLmdldFB1Ymxpc2hlZFVybCgpOwotCQkJcmVwb3J0X3VybCA9IHB1Ymxpc2hNZ3IuZ2V0UHVibGlzaFJlcG9ydFVybCgpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJcnVuRXhjZXB0aW9uID0gZTsKLQkJfQotCi0JCWZpbmFsIGJvb2xlYW4gY2FuY2VsZWQgPSBtb25pdG9yLmlzQ2FuY2VsZWQoKTsKLQotCQlTYWZlVXBkYXRlQ29udHJvbGxlci5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJaWYgKGNhbmNlbGVkKSB7Ci0JCQkJCW1zZ0RpYWxvZy5kaXNwbGF5SW5mbyhQVUJMSVNIX0NPTkZJR19FUlJPUl9USVRMRSwKLQkJCQkJCQlQVUJMSVNIX0NPTkZJR19DQU5DRUxfTVNHKTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQotCQkJCWlmIChwdWJsaXNoZWRfdXJsID09IG51bGwgfHwgcmVwb3J0X3VybCA9PSBudWxsKSB7Ci0JCQkJCW1zZ0RpYWxvZy5kaXNwbGF5RXJyb3IoUFVCTElTSF9DT05GSUdfRVJST1JfVElUTEUsCi0JCQkJCQkJUFVCTElTSF9DT05GSUdfRVJST1JfTVNHLAotCQkJCQkJCVBVQkxJU0hfQ09ORklHX0VSUk9SX1JFQVNPTiwgcnVuRXhjZXB0aW9uKTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQotCQkJCVB1Ymxpc2hPcHRpb25zIG9wdGlvbnMgPSBwdWJsaXNoTWdyLmdldFZpZXdCdWlsZGVyKCkKLQkJCQkJCS5nZXRPcHRpb25zKCk7Ci0JCQkJaWYgKG9wdGlvbnMgaW5zdGFuY2VvZiBQdWJsaXNoSFRNTE9wdGlvbnMpIHsKLQkJCQkJaWYgKCEoKFB1Ymxpc2hIVE1MT3B0aW9ucykgb3B0aW9ucykKLQkJCQkJCQkuaXNQdWJsaXNoRHluYW1pY1dlYkFwcCgpKSB7Ci0JCQkJCQkvLyBMYXVuY2ggYSBIVE1MIGJyb3dzZXIgdG8gdmlldyB0aGUgcHVibGlzaGVkIHNpdGUuCi0JCQkJCQlpZiAob3BlbkJyb3dzZXIocHVibGlzaGVkX3VybCkgPT0gZmFsc2UpIHsKLQkJCQkJCQlTdHJpbmcgcmVhc29uID0gTWVzc2FnZUZvcm1hdC5mb3JtYXQoCi0JCQkJCQkJCQlPUEVOX0JST1dTRVJfRVJST1JfUkVBU09OLAotCQkJCQkJCQkJbmV3IE9iamVjdFtdIHsgcHVibGlzaGVkX3VybCB9KTsKLQkJCQkJCQltc2dEaWFsb2cuZGlzcGxheUVycm9yKFBSRVZJRVdfQ09ORklHX0VSUk9SX1RJVExFLAotCQkJCQkJCQkJUFJFVklFV19DT05GSUdfRVJST1JfTVNHLCByZWFzb24pOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCi0JCQkJLy8gTGF1bmNoIGEgSFRNTCBicm93c2VyIHRvIHZpZXcgdGhlIHJlcG9ydCBvbiB0aGUgcHVibGlzaGVkCi0JCQkJLy8gc2l0ZS4KLQkJCQlpZiAob3BlbkJyb3dzZXIocmVwb3J0X3VybCkgPT0gZmFsc2UpIHsKLQkJCQkJU3RyaW5nIHJlYXNvbiA9IE1lc3NhZ2VGb3JtYXQuZm9ybWF0KAotCQkJCQkJCU9QRU5fQlJPV1NFUl9FUlJPUl9SRUFTT04sCi0JCQkJCQkJbmV3IE9iamVjdFtdIHsgcmVwb3J0X3VybCB9KTsKLQkJCQkJbXNnRGlhbG9nLmRpc3BsYXlFcnJvcihWSUVXX1JFUE9SVF9FUlJPUl9USVRMRSwKLQkJCQkJCQlWSUVXX1JFUE9SVF9FUlJPUl9NU0csIHJlYXNvbik7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQl9Ci0KLQkvKioKLQkgKiBvcGVuIGEgYnJvd3NlciB0byBzaG93IHRoZSBwdWJsaXNoZWQgY29udGVudC4KLQkgKiAKLQkgKiBAcGFyYW0gdXJsCi0JICogICAgICAgICAgICBTdHJpbmcgdGhlIHNpdGUgdXJsCi0JICogQHJldHVybiBib29sZWFuIHRydWUgaWYgYnJvd3NlciBvcGVuZWQgc3VjY2Vzc2Z1bGx5LgotCSAqLwotCXB1YmxpYyBib29sZWFuIG9wZW5Ccm93c2VyKGZpbmFsIFN0cmluZyB1cmwpIHsKLQkJYm9vbGVhbiBzdWNjZXNzID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQkvLyBMYXVuY2ggdGhlIGRlZmF1bHQgSFRNTCB2aWV3ZXIgdG8gZGlzcGxheSB0aGUgSFRNTCBwYWdlLgotCQkJLy8gT24gTGludXgsIHRoaXMgY2FuJ3QgbGF1bmNoIHVybHMsIG9ubHkgbG9jYWwgZmlsZXMgY2FuIGJlCi0JCQkvLyBsYXVuY2hlZC4KLQkJCS8vIFNvcnJ5IEkgaGF2ZSB1c2UgaW50ZXJuYWwgY2xhc3MgaGVyZS4KLQkJCS8vIGhvcGUgRWNsaXBzZS5vcmcgY2FuIGhhdmUgYSBwdWJsaWMgYXBpIHRvIGRvIHNvLgotCQkJaWYgKFNXVC5nZXRQbGF0Zm9ybSgpLmVxdWFscygid2luMzIiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJc3VjY2VzcyA9IFByb2dyYW0ubGF1bmNoKHVybCk7Ci0JCQl9IGVsc2UgewotCQkJCS8vIElCcm93c2VyIGJyb3dzZXIgPQotCQkJCS8vIG9yZy5lY2xpcHNlLmhlbHAuaW50ZXJuYWwuYnJvd3Nlci5Ccm93c2VyTWFuYWdlcgotCQkJCS8vIC5nZXRJbnN0YW5jZSgpLmNyZWF0ZUJyb3dzZXIodHJ1ZSk7Ci0JCQkJLy8gaWYgKGJyb3dzZXIgPT0gbnVsbCkgewotCQkJCS8vIHRyeSB7Ci0JCQkJLy8gYnJvd3Nlci5kaXNwbGF5VVJMKHVybCk7Ci0JCQkJLy8gc3VjY2VzcyA9IHRydWU7Ci0JCQkJLy8gfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBlLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCS8vIH0KLQkJCQkvLyB9Ci0KLQkJCQkvLyAxNTU0OTAgLSBDYW5ub3QgZGV0ZWN0ZWQgZGVmYXVsdCBicm93c2VyIHdoZW4gcHJldmlldwotCQkJCS8vIHB1Ymxpc2hlZCBjb25maWd1cmF0aW9uIG9uIExpbnV4Ci0JCQkJLy8gY2hhbmdlZCB0byB1c2Ugc3d0IGJyb3dzZXIKLQkJCQlzdWNjZXNzID0gdHJ1ZTsKLQkJCQlEaXNwbGF5LmdldEN1cnJlbnQoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkvLyAvLyBvcGVuIGFub3RoZXIgc3d0IGJyb3dzZXIgc2luY2Ugd2UgaGF2ZSBubyAoc2ltcGxlKQotCQkJCQkJLy8gd2F5IG9mIGNyZWF0aW5nIGEgc3lzdGVtIGRlZmF1bHQgYnJvd3NlcgotCQkJCQkJLy8gLy8gdGhlIEVjbGlwc2UgZ3V5cyBoaWRlIGFsbCB0aGUgZ29vZCBhcGlzIGFzCi0JCQkJCQkvLyBpbnRlcm5hbAotCQkJCQkJU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoKTsKLQkJCQkJCXNoZWxsLnNldFRleHQodXJsKTsKLQkJCQkJCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJCQkJCWxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCQkJCQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJCQkJCXNoZWxsLnNldExheW91dChsYXlvdXQpOwotCQkJCQkJQnJvd3NlciBwb3B1cF9icm93c2VyID0gbmV3IEJyb3dzZXIoc2hlbGwsIFNXVC5OT05FKTsKLQkJCQkJCXBvcHVwX2Jyb3dzZXIuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoCi0JCQkJCQkJCUdyaWREYXRhLkZJTExfQk9USCB8IEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTAotCQkJCQkJCQkJCXwgR3JpZERhdGEuR1JBQl9WRVJUSUNBTCkpOwotCQkJCQkJcG9wdXBfYnJvd3Nlci5zZXRVcmwodXJsKTsKLQkJCQkJCXNoZWxsLm9wZW4oKTsKLQkJCQkJfQotCQkJCX0pOwotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCXN1Y2Nlc3MgPSBmYWxzZTsKLQkJfQotCi0JCXJldHVybiBzdWNjZXNzOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3VpL3BhY2thZ2UuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy91aS9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiNzM4ZmMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3VpL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIHRoZSBpbXBsZW1lbnRhdGlvbiBmb3IgbWFuYWdpbmcgdGhlIHB1Ymxpc2hpbmcgVUkuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3VpL3ByZWZlcmVuY2VzL0FjdGl2aXR5RGlhZ3JhbVByZWZlcmVuY2VQYWdlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvdWkvcHJlZmVyZW5jZXMvQWN0aXZpdHlEaWFncmFtUHJlZmVyZW5jZVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjU5MzM2Mi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvdWkvcHJlZmVyZW5jZXMvQWN0aXZpdHlEaWFncmFtUHJlZmVyZW5jZVBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxNCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS5wcmVmZXJlbmNlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByZWZlcmVuY2VzLkF1dGhvcmluZ1VJUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5TdHJVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLkxpYnJhcnlVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5wcmVmZXJlbmNlcy5MaWJyYXJ5VUlQcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS5QdWJsaXNoaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVpLnByZWZlcmVuY2VzLkJhc2VQcmVmZXJlbmNlUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZTsKLQotLyoqCi0gKiBQcmVmZXJlbmNlIHBhZ2UgZm9yIGRpYWdyYW0gb3B0aW9ucwotICogCi0gKiBAYXV0aG9yIFBob25nIExlCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMAotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eURpYWdyYW1QcmVmZXJlbmNlUGFnZSBleHRlbmRzIEJhc2VQcmVmZXJlbmNlUGFnZSBpbXBsZW1lbnRzCi0JCUlXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZSwgU2VsZWN0aW9uTGlzdGVuZXIsIE1vZGlmeUxpc3RlbmVyIHsKLQlDb21wb3NpdGUgY29tcG9zaXRlOwotCi0JaW50IE5VTV9DT0xVTU4gPSAzOwotCi0JcHJpdmF0ZSBzdGF0aWMgaW50IE1JTl9UQVNLU19QRVJfUk9XID0gMTsKLQotCXByaXZhdGUgc3RhdGljIGludCBNQVhfVEFTS1NfUEVSX1JPVyA9IDIwOwotCi0JcHJpdmF0ZSBCdXR0b24gY3RybF9wdWJsaXNoX3Vub3Blbl9hY3Rpdml0eWRkOwotCi0JcHJpdmF0ZSBCdXR0b24gY3RybF9wdWJsaXNoX2FkX2Zvcl9hY3Rpdml0eV9leHRlbnNpb247Ci0KLQlwcml2YXRlIFRleHQgdGFza3NQZXJSb3dUZXh0OwotCi0JcHVibGljIEFjdGl2aXR5RGlhZ3JhbVByZWZlcmVuY2VQYWdlKCkgewotCQlzdXBlcigpOwotCX0KLQotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQljb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDEsIGZhbHNlKSk7Ci0KLQkJLy8gQ3JlYXRlIGFjdGl2aXR5IGRpYWdyYW0gZ3JvdXAuCi0JCUdyb3VwIGFjdGl2aXR5RGlhZ3JhbUdyb3VwID0gY3JlYXRlR3JpZExheW91dEdyb3VwKGNvbXBvc2l0ZSwKLQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5wcmVmZXJlbmNlX0FjdGl2aXR5X0RpYWdyYW0sIDEpOwotCi0JCWN0cmxfcHVibGlzaF9hZF9mb3JfYWN0aXZpdHlfZXh0ZW5zaW9uID0gY3JlYXRlQ2hlY2tib3goCi0JCQkJYWN0aXZpdHlEaWFncmFtR3JvdXAsCi0JCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMucHJvbXB0X2Zvcl9wdWJsaXNoX2V4dGVuZF9hY3Rpdml0eV9kaWFncmFtKTsKLQotCQkvLyBDcmVhdGUgYWN0aXZpdHkgZGV0YXRpbCBkaWFncmFtIGdyb3VwLgotCi0JCUdyb3VwIGFjdGl2aXR5RGV0YWlsRGlhZ3JhbUdyb3VwID0gY3JlYXRlR3JpZExheW91dEdyb3VwKGNvbXBvc2l0ZSwKLQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5wcmVmZXJlbmNlX0FjdGl2aXR5X0RldGFpbF9EaWFncmFtLCAyKTsKLQotCQljdHJsX3B1Ymxpc2hfdW5vcGVuX2FjdGl2aXR5ZGQgPSBjcmVhdGVDaGVja2JveCgKLQkJCQlhY3Rpdml0eURldGFpbERpYWdyYW1Hcm91cCwKLQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5wcm9tcHRmb3JfcHVibGlzaF91bm9wZW5fYWN0aXZpdHlkZF90ZXh0LAotCQkJCTIpOwotCi0JCWNyZWF0ZUxhYmVsKGFjdGl2aXR5RGV0YWlsRGlhZ3JhbUdyb3VwLAotCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLmFkZF9UYXNrc3BlclJvdyk7Ci0JCXRhc2tzUGVyUm93VGV4dCA9IGNyZWF0ZUVkaXRhYmxlVGV4dChhY3Rpdml0eURldGFpbERpYWdyYW1Hcm91cCwgIiIpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdGlhbGl6ZVZhbHVlcygpOwotCi0JCWFkZExpc3RlbmVycygpOwotCi0JCXJldHVybiBjb21wb3NpdGU7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoIHdvcmtiZW5jaCkgewotCi0JfQotCi0JcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCi0JfQotCi0JcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykgTWV0aG9kIGRlY2xhcmVkIG9uIFByZWZlcmVuY2VQYWdlCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURlZmF1bHRzKCkgewotCQlzdXBlci5wZXJmb3JtRGVmYXVsdHMoKTsKLQkJaW5pdGlhbGl6ZURlZmF1bHRzKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpIE1ldGhvZCBkZWNsYXJlZCBvbiBQcmVmZXJlbmNlUGFnZQotCSAqLwotCXB1YmxpYyBib29sZWFuIHBlcmZvcm1PaygpIHsKLQkJc3RvcmVWYWx1ZXMoKTsKLQkJTGlicmFyeVVJUGx1Z2luLmdldERlZmF1bHQoKS5zYXZlUGx1Z2luUHJlZmVyZW5jZXMoKTsKLQotCQkvLyB1cGRhdGUgdGhlIHNldHRpbmdzIGZvciBicm93c2luZwotCQlQdWJsaXNoaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLnVwZGF0ZUxheW91dFNldHRpbmdzKCk7Ci0KLQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLnNhdmVQbHVnaW5QcmVmZXJlbmNlcygpOwotCi0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIFN0b3JlcyB0aGUgdmFsdWVzIG9mIHRoZSBjb250cm9scyBiYWNrIHRvIHRoZSBwcmVmZXJlbmNlIHN0b3JlLgotCSAqLwotCXByaXZhdGUgdm9pZCBzdG9yZVZhbHVlcygpIHsKLQkJLy8gc2V0IEFERCB0YXNrcyBwZXIgcm93Ci0JCUF1dGhvcmluZ1VJUHJlZmVyZW5jZXMuc2V0QUREVGFza3NQZXJSb3coZ2V0VGFza3NQZXJSb3coKSk7Ci0KLQkJTGlicmFyeVVJUHJlZmVyZW5jZXMKLQkJCQkuc2V0UHVibGlzaFVub3BlbkFjdGl2aXR5ZGQoY3RybF9wdWJsaXNoX3Vub3Blbl9hY3Rpdml0eWRkCi0JCQkJCQkuZ2V0U2VsZWN0aW9uKCkpOwotCQlMaWJyYXJ5VUlQcmVmZXJlbmNlcwotCQkJCS5zZXRQdWJsaXNoQURGb3JBY3Rpdml0eUV4dGVuc2lvbihjdHJsX3B1Ymxpc2hfYWRfZm9yX2FjdGl2aXR5X2V4dGVuc2lvbgotCQkJCQkJLmdldFNlbGVjdGlvbigpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZURlZmF1bHRzKCkgewotCQkvLyBJUHJlZmVyZW5jZVN0b3JlIHN0b3JlID0gZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JCWN0cmxfcHVibGlzaF91bm9wZW5fYWN0aXZpdHlkZC5zZXRTZWxlY3Rpb24oZmFsc2UpOwotCQljdHJsX3B1Ymxpc2hfYWRfZm9yX2FjdGl2aXR5X2V4dGVuc2lvbi5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0KLQkJdGFza3NQZXJSb3dUZXh0LnNldFRleHQoU3RyaW5nLnZhbHVlT2YoQXV0aG9yaW5nVUlQcmVmZXJlbmNlcwotCQkJCS5nZXREZWZhdWx0QUREVGFza3NQZXJSb3coKSkpOwotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemVzIHN0YXRlcyBvZiB0aGUgY29udHJvbHMgZnJvbSB0aGUgcHJlZmVyZW5jZSBzdG9yZS4KLQkgKi8KLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZVZhbHVlcygpIHsKLQkJY3RybF9wdWJsaXNoX3Vub3Blbl9hY3Rpdml0eWRkLnNldFNlbGVjdGlvbihMaWJyYXJ5VUlQcmVmZXJlbmNlcwotCQkJCS5nZXRQdWJsaXNoVW5vcGVuQWN0aXZpdHlkZCgpKTsKLQkJY3RybF9wdWJsaXNoX2FkX2Zvcl9hY3Rpdml0eV9leHRlbnNpb24KLQkJCQkuc2V0U2VsZWN0aW9uKExpYnJhcnlVSVByZWZlcmVuY2VzCi0JCQkJCQkuZ2V0UHVibGlzaEFERm9yQWN0aXZpdHlFeHRlbnNpb24oKSk7Ci0KLQkJdGFza3NQZXJSb3dUZXh0LnNldFRleHQoU3RyaW5nLnZhbHVlT2YoQXV0aG9yaW5nVUlQcmVmZXJlbmNlcwotCQkJCS5nZXRBRERfVGFza3NQZXJSb3coKSkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcmVmZXJlbmNlcy5Db21tb25QcmVmUGFnZSNkb0dldFByZWZlcmVuY2VTdG9yZSgpCi0JICovCi0JcHJvdGVjdGVkIElQcmVmZXJlbmNlU3RvcmUgZG9HZXRQcmVmZXJlbmNlU3RvcmUoKSB7Ci0JCXJldHVybiBMaWJyYXJ5VUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpOwotCX0KLQotCS8qKgotCSAqIEFkZHMgZXZlbnQgbGlzdGVuZXJzIHRvIHRoZSBwcmVmZXJlbmNlIHBhZ2UgY29udHJvbHMuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkTGlzdGVuZXJzKCkgewotCQl0YXNrc1BlclJvd1RleHQuYWRkTW9kaWZ5TGlzdGVuZXIodGhpcyk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyI21vZGlmeVRleHQoTW9kaWZ5RXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0JCXNldEVycm9yTWVzc2FnZShudWxsKTsKLQkJc2V0VmFsaWQodHJ1ZSk7Ci0KLQkJaW50IHZhbHVlID0gMDsKLQkJaWYgKGUud2lkZ2V0ID09IHRhc2tzUGVyUm93VGV4dCkgewotCQkJdmFsdWUgPSBnZXRUYXNrc1BlclJvdygpOwotCQkJaWYgKHZhbHVlIDwgTUlOX1RBU0tTX1BFUl9ST1cgfHwgdmFsdWUgPiBNQVhfVEFTS1NfUEVSX1JPVykgewotCQkJCXNldEVycm9yTWVzc2FnZShBdXRob3JpbmdVSVJlc291cmNlcy5iaW5kKAotCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuaW52YWxpZFRhc2twZXJSb3dfbXNnLAotCQkJCQkJbmV3IE9iamVjdFtdIHsgbmV3IEludGVnZXIoTUlOX1RBU0tTX1BFUl9ST1cpLAotCQkJCQkJCQluZXcgSW50ZWdlcihNQVhfVEFTS1NfUEVSX1JPVykgfSkpOwotCQkJCXNldFZhbGlkKGZhbHNlKTsKLQkJCX0KLQkJfQotCi0JCXVwZGF0ZUFwcGx5QnV0dG9uKCk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgdXNlciBzcGVjaWZpZWQgdGFza3MgcGVyIHJvd24KLQkgKi8KLQlwcm90ZWN0ZWQgaW50IGdldFRhc2tzUGVyUm93KCkgewotCQlyZXR1cm4gU3RyVXRpbC5nZXRJbnRWYWx1ZSh0YXNrc1BlclJvd1RleHQuZ2V0VGV4dCgpLnRyaW0oKSwgMCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3VpL3ByZWZlcmVuY2VzL0RlbGV0ZUNvbmZpZ0NvbW1hbmRMaXN0ZW5lci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3VpL3ByZWZlcmVuY2VzL0RlbGV0ZUNvbmZpZ0NvbW1hbmRMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OTZmOTZlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy91aS9wcmVmZXJlbmNlcy9EZWxldGVDb25maWdDb21tYW5kTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLnByZWZlcmVuY2VzOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5EZWxldGVNZXRob2RFbGVtZW50Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSURlbGV0ZU1ldGhvZEVsZW1lbnRDb21tYW5kTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLQotLyoqCi0gKiBDb21tYW5kIGxpc3RlbmVyIGZvciBEZWxldGVNZXRob2RFbGVtZW50Q29tbWFuZAotICogQ2xlYW4gYWxsIGNvbmZpZ3VyYXRpb24gc3BlY2lmaWMgcHVibGlzaGluZyBwcmVmZXJlbmNlcyB3aGVuIHRoZSBjb25maWd1cmF0aW9uIGlzIGRlbGV0ZWQKLSAqIEBhdXRob3IgWGlhbmcgRG9uZyBIdQotICogQHNpbmNlIDEuMgotICogaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE4MTQ4NwotICovCi1wdWJsaWMgY2xhc3MgRGVsZXRlQ29uZmlnQ29tbWFuZExpc3RlbmVyIGltcGxlbWVudHMKLQkJSURlbGV0ZU1ldGhvZEVsZW1lbnRDb21tYW5kTGlzdGVuZXIgewotCi0JcHVibGljIHZvaWQgY29sbGVjdE9iamVjdHNUb0RlbGV0ZUNvbnRlbnQoQ29sbGVjdGlvbiBjb2xsZWN0ZWRPYmplY3RzLAotCQkJTWV0aG9kRWxlbWVudCBlbGVtZW50KSB7Ci0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjb2xsZWN0T2JqZWN0c1RvUmVtb3ZlKENvbGxlY3Rpb24gb2JqZWN0c1RvUmVtb3ZlLAotCQkJRU9iamVjdCBlbGVtZW50VG9EZWxldGUsIEVPYmplY3QgcmVmZXJlbmNlciwgQ29sbGVjdGlvbiByZWZlcmVuY2VzKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgQ2xhc3MgZ2V0Q29tbWFuZFR5cGUoKSB7Ci0JCXJldHVybiBEZWxldGVNZXRob2RFbGVtZW50Q29tbWFuZC5jbGFzczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBub3RpZnlFeGVjdXRlZChDb21tYW5kIGNvbW1hbmQpIHsKLQkJQ29sbGVjdGlvbiByZXN1bHQgPSAoKERlbGV0ZU1ldGhvZEVsZW1lbnRDb21tYW5kKWNvbW1hbmQpLmdldFJlc3VsdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gcmVzdWx0Lml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspewotCQkJT2JqZWN0IGVsZW1lbnQgPSBpdC5uZXh0KCk7Ci0JCQlpZihlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kQ29uZmlndXJhdGlvbil7Ci0JCQkJU3RyaW5nIGNvbmZpZ0lkID0gKChNZXRob2RDb25maWd1cmF0aW9uKWVsZW1lbnQpLmdldEd1aWQoKTsKLQkJCQlyZW1vdmVQdWJsaXNoUHJlZmVyZW5jZXMoY29uZmlnSWQpOwotCQkJfQotCQl9Ci0JCVB1Ymxpc2hpbmdVSVByZWZlcmVuY2VzLnNhdmVBbGxQcmVmZXJlbmNlcygpOwotCX0KLQotCXB1YmxpYyB2b2lkIHByZUV4ZWN1dGUoQ29tbWFuZCBjb21tYW5kKSB7Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBwcmVVbmRvKENvbW1hbmQgY29tbWFuZCkgewotCi0JfQotCQotCXByb3RlY3RlZCB2b2lkIHJlbW92ZVB1Ymxpc2hQcmVmZXJlbmNlcyhTdHJpbmcgY29uZmlnSWQpewotCQlQdWJsaXNoaW5nVUlQcmVmZXJlbmNlcy5yZW1vdmVBYm91dEhUTUwoY29uZmlnSWQpOwotCQlQdWJsaXNoaW5nVUlQcmVmZXJlbmNlcy5yZW1vdmVCYW5uZXJJbWFnZShjb25maWdJZCk7Ci0JCVB1Ymxpc2hpbmdVSVByZWZlcmVuY2VzLnJlbW92ZUNoZWNrRXh0ZXJuYWxMaW5rcyhjb25maWdJZCk7Ci0JCVB1Ymxpc2hpbmdVSVByZWZlcmVuY2VzLnJlbW92ZUNvbmZpZ1ByZWZJbml0aWFsaXplZChjb25maWdJZCk7Ci0JCVB1Ymxpc2hpbmdVSVByZWZlcmVuY2VzLnJlbW92ZUNvbnZlcnRCcm9rZW5MaW5rcyhjb25maWdJZCk7Ci0JCVB1Ymxpc2hpbmdVSVByZWZlcmVuY2VzLnJlbW92ZUV4dHJhRGVzY3JpcHRvckluZm8oY29uZmlnSWQpOwotCQlQdWJsaXNoaW5nVUlQcmVmZXJlbmNlcy5yZW1vdmVGZWVkYmFja1VSTChjb25maWdJZCk7Ci0JCVB1Ymxpc2hpbmdVSVByZWZlcmVuY2VzLnJlbW92ZUluY2x1ZGVHbG9zc2FyeShjb25maWdJZCk7Ci0JCVB1Ymxpc2hpbmdVSVByZWZlcmVuY2VzLnJlbW92ZUluY2x1ZGVJbmRleChjb25maWdJZCk7Ci0JCVB1Ymxpc2hpbmdVSVByZWZlcmVuY2VzLnJlbW92ZUluY2x1ZGVTZWFyY2goY29uZmlnSWQpOwotCQlQdWJsaXNoaW5nVUlQcmVmZXJlbmNlcy5yZW1vdmVJbmNsdWRlU2VydmxldFNlYXJjaChjb25maWdJZCk7Ci0JCVB1Ymxpc2hpbmdVSVByZWZlcmVuY2VzLnJlbW92ZUxpZ2h0V2VpZ2h0VHJlZShjb25maWdJZCk7Ci0JCVB1Ymxpc2hpbmdVSVByZWZlcmVuY2VzLnJlbW92ZVB1Ymxpc2hFbnRpcmVDb25maWcoY29uZmlnSWQpOwotCQlQdWJsaXNoaW5nVUlQcmVmZXJlbmNlcy5yZW1vdmVQdWJsaXNoQURGb3JBY3Rpdml0eUV4dGVuc2lvbihjb25maWdJZCk7Ci0JCVB1Ymxpc2hpbmdVSVByZWZlcmVuY2VzLnJlbW92ZVB1Ymxpc2hQYXRoKGNvbmZpZ0lkKTsKLQkJUHVibGlzaGluZ1VJUHJlZmVyZW5jZXMucmVtb3ZlUHVibGlzaFN0YXRpY1dlYlNpdGUoY29uZmlnSWQpOwotCQlQdWJsaXNoaW5nVUlQcmVmZXJlbmNlcy5yZW1vdmVQdWJsaXNoVW5vcGVuQWN0aXZpdHlERChjb25maWdJZCk7Ci0JCVB1Ymxpc2hpbmdVSVByZWZlcmVuY2VzLnJlbW92ZVRpdGxlKGNvbmZpZ0lkKTsKLQkJUHVibGlzaGluZ1VJUHJlZmVyZW5jZXMucmVtb3ZlV2ViQXBwTmFtZShjb25maWdJZCk7Ci0JCVB1Ymxpc2hpbmdVSVByZWZlcmVuY2VzLnJlbW92ZVNob3dSZWxhdGVkRGVzY3JpcHRvcnMoY29uZmlnSWQpOwotCQlQdWJsaXNoaW5nVUlQcmVmZXJlbmNlcy5yZW1vdmVTaG93RGVzY3JpcHRvcnNJbk5hdmlnYXRpb25UcmVlKGNvbmZpZ0lkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBwb3N0VW5kbyhDb21tYW5kIGNvbW1hbmQpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQkKLQl9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3VpL3ByZWZlcmVuY2VzL1B1Ymxpc2hpbmdQcmVmZXJlbmNlUGFnZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3VpL3ByZWZlcmVuY2VzL1B1Ymxpc2hpbmdQcmVmZXJlbmNlUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYTU5Y2VhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy91aS9wcmVmZXJlbmNlcy9QdWJsaXNoaW5nUHJlZmVyZW5jZVBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyNCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS5wcmVmZXJlbmNlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLlN0clV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkuUHVibGlzaGluZ1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLlB1Ymxpc2hpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudWkucHJlZmVyZW5jZXMuQmFzZVByZWZlcmVuY2VQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlyZWN0b3J5RGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci0KLS8qKgotICogVGhlIFB1Ymxpc2hpbmcgcHJlZmVyZW5jZSBwYWdlLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqIAotICogQnVncyBmaXhlZDoKLSAqIDx1bD4KLSAqIDxsaT5odHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTU2OTU3PC9saT4KLSAqIDwvdWw+Ci0gKi8KLXB1YmxpYyBjbGFzcyBQdWJsaXNoaW5nUHJlZmVyZW5jZVBhZ2UgZXh0ZW5kcyBCYXNlUHJlZmVyZW5jZVBhZ2UgewotCi0JcHJpdmF0ZSBDb21wb3NpdGUgY29tcG9zaXRlOwotCi0JcHJpdmF0ZSBUZXh0IGRlc3RpbmF0aW9uUGF0aFRleHQ7Ci0KLQlwcml2YXRlIFRleHQgZmVlZGJhY2tVUkxUZXh0OwotCi0JcHJpdmF0ZSBCdXR0b24gYnJvd3NlQnV0dG9uOwotCi0JcHJpdmF0ZSBCdXR0b24gZXh0cmFEZXNjcmlwdG9ySW5mb0NoZWNrYm94OwotCi0JLyoqCi0JICogQ3JlYXRlcyBhbmQgcmV0dXJucyB0aGUgU1dUIGNvbnRyb2wgZm9yIHRoZSBjdXN0b21pemVkIGJvZHkgb2YgdGhpcwotCSAqIHByZWZlcmVuY2UgcGFnZSB1bmRlciB0aGUgZ2l2ZW4gcGFyZW50IGNvbXBvc2l0ZS4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IGNvbXBvc2l0ZQotCSAqIEByZXR1cm4gdGhlIG5ldyBjb250cm9sCi0JICovCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkgewotCQljb21wb3NpdGUgPSBjcmVhdGVHcmlkTGF5b3V0Q29tcG9zaXRlKHBhcmVudCwgMSk7Ci0KLQkJLy8gQ3JlYXRlIHRoZSBEZXN0aW5hdGlvbiBwYXRoIGdyb3VwLgotCQkvKgotCQkgKiBHcm91cCBkZXN0aW5hdGlvbkdyb3VwID0gY3JlYXRlR3JpZExheW91dEdyb3VwKGNvbXBvc2l0ZSwKLQkJICogUHVibGlzaGluZ1VJUmVzb3VyY2VzLmRlc3RpbmF0aW9uRGlyZWN0b3J5R3JvdXBfdGV4dCwgMyk7Ci0JCSAqLwotCi0JCS8vIENyZWF0ZSB0aGUgUHVibGlzaGVkIFdlYnNpdGUgZ3JvdXAuCi0JCUdyb3VwIHdlYlNpdGVHcm91cCA9IGNyZWF0ZUdyaWRMYXlvdXRHcm91cChjb21wb3NpdGUsCi0JCQkJUHVibGlzaGluZ1VJUmVzb3VyY2VzLnB1Ymxpc2hXZWJTaXRlR3JvdXBfdGV4dCwgMyk7Ci0JCWNyZWF0ZUxhYmVsKHdlYlNpdGVHcm91cCwKLQkJCQlQdWJsaXNoaW5nVUlSZXNvdXJjZXMucHJlZmVyZW5jZVBhZ2VfZGVmYXVsdFBhdGhfdGV4dCk7Ci0JCWRlc3RpbmF0aW9uUGF0aFRleHQgPSBjcmVhdGVFZGl0YWJsZVRleHQod2ViU2l0ZUdyb3VwKTsKLQkJYnJvd3NlQnV0dG9uID0gY3JlYXRlQnV0dG9uKHdlYlNpdGVHcm91cCwKLQkJCQlBdXRob3JpbmdVSVRleHQuQlJPV1NFX0JVVFRPTl9URVhUKTsKLQkJY3JlYXRlTGFiZWwod2ViU2l0ZUdyb3VwLCBQdWJsaXNoaW5nVUlSZXNvdXJjZXMuZmVlZGJhY2tVUkxMYWJlbF90ZXh0KTsKLQkJZmVlZGJhY2tVUkxUZXh0ID0gY3JlYXRlRWRpdGFibGVUZXh0KHdlYlNpdGVHcm91cCwgMik7Ci0KLQkJLy8gQ3JlYXRlIHRoZSBCcm93c2luZyBncm91cC4KLQkJR3JvdXAgYnJvd3NpbmdHcm91cCA9IGNyZWF0ZUdyaWRMYXlvdXRHcm91cChjb21wb3NpdGUsIFB1Ymxpc2hpbmdVSVJlc291cmNlcy5icm93c2luZ0xheW91dEdyb3VwX3RleHQsIDEpOwotCQlleHRyYURlc2NyaXB0b3JJbmZvQ2hlY2tib3ggPSBjcmVhdGVDaGVja2JveChicm93c2luZ0dyb3VwLAotCQkJCVB1Ymxpc2hpbmdVSVJlc291cmNlcy5wdWJsaXNoRXh0cmFEZXNjcmlwdG9ySW5mb0xhYmVsX3RleHQsIDEpOwotCi0JCWluaXRDb250cm9scygpOwotCi0JCWFkZExpc3RlbmVycygpOwotCi0JCXJldHVybiBjb21wb3NpdGU7Ci0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZXMgdGhlIHByZWZlcmVuY2UgcGFnZSBjb250cm9scyB3aXRoIGRhdGEuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdENvbnRyb2xzKCkgewotCQlkZXN0aW5hdGlvblBhdGhUZXh0LnNldFRleHQoUHVibGlzaGluZ1VJUHJlZmVyZW5jZXMuZ2V0UHVibGlzaFBhdGgoKSk7Ci0JCWZlZWRiYWNrVVJMVGV4dC5zZXRUZXh0KFB1Ymxpc2hpbmdVSVByZWZlcmVuY2VzLmdldEZlZWRiYWNrVVJMKCkpOwotCQlleHRyYURlc2NyaXB0b3JJbmZvQ2hlY2tib3guc2V0U2VsZWN0aW9uKFB1Ymxpc2hpbmdVSVByZWZlcmVuY2VzCi0JCQkJLmdldEV4dHJhRGVzY3JpcHRvckluZm8oKSk7Ci0JfQotCi0JLyoqCi0JICogQWRkcyBldmVudCBsaXN0ZW5lcnMgdG8gdGhlIHByZWZlcmVuY2UgcGFnZSBjb250cm9scy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRMaXN0ZW5lcnMoKSB7Ci0JCWRlc3RpbmF0aW9uUGF0aFRleHQuYWRkTW9kaWZ5TGlzdGVuZXIobmV3IE1vZGlmeUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0JCQkJaWYgKCFpc1BhdGhWYWxpZChkZXN0aW5hdGlvblBhdGhUZXh0LmdldFRleHQoKSkpIHsKLQkJCQkJc2V0VmFsaWQoZmFsc2UpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXNldFZhbGlkKHRydWUpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJYnJvd3NlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCW9wZW5EaXJlY3RvcnlEaWFsb2coKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VQYWdlI3BlcmZvcm1EZWZhdWx0cygpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURlZmF1bHRzKCkgewotCQlzdXBlci5wZXJmb3JtRGVmYXVsdHMoKTsKLQkJaW5pdGlhbGl6ZURlZmF1bHRzKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VQYWdlI3BlcmZvcm1PaygpCi0JICovCi0JcHVibGljIGJvb2xlYW4gcGVyZm9ybU9rKCkgewotCQlzdG9yZVZhbHVlcygpOwotCQlQdWJsaXNoaW5nVUlQcmVmZXJlbmNlcy5zYXZlQWxsUHJlZmVyZW5jZXMoKTsKLQkJCi0JCS8vIHVwZGF0ZSB0aGUgc2V0dGluZ3MgZm9yIGJyb3dzaW5nCi0JCVB1Ymxpc2hpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkudXBkYXRlTGF5b3V0U2V0dGluZ3MoKTsKLQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBTdG9yZXMgdGhlIHZhbHVlcyBvZiB0aGUgY29udHJvbHMgYmFjayB0byB0aGUgcHJlZmVyZW5jZSBzdG9yZS4KLQkgKi8KLQlwcml2YXRlIHZvaWQgc3RvcmVWYWx1ZXMoKSB7Ci0JCVB1Ymxpc2hpbmdVSVByZWZlcmVuY2VzLnNldFB1Ymxpc2hQYXRoKGRlc3RpbmF0aW9uUGF0aFRleHQuZ2V0VGV4dCgpCi0JCQkJLnRyaW0oKSk7Ci0JCVB1Ymxpc2hpbmdVSVByZWZlcmVuY2VzCi0JCQkJLnNldEZlZWRiYWNrVVJMKGZlZWRiYWNrVVJMVGV4dC5nZXRUZXh0KCkudHJpbSgpKTsKLQkJUHVibGlzaGluZ1VJUHJlZmVyZW5jZXMKLQkJCQkuc2V0RXh0cmFEZXNjcmlwdG9ySW5mbyhleHRyYURlc2NyaXB0b3JJbmZvQ2hlY2tib3gKLQkJCQkJCS5nZXRTZWxlY3Rpb24oKSk7Ci0KLS8vCQkvLyBGSVhNRSEgUmV2aWV3IGltcGxlbWVudGF0aW9uLgotLy8JCS8vIGFsbG93IHRvIHBhc3MgdGhlIHZhbHVlIHRvIHRoZSBsaWJyYXJ5IGJyb3dzaW5nCi0vLwkJLy8gU3lzdGVtLnNldFByb3BlcnR5KEVYVFJBX0RFU0NSSVBUT1JfSU5GTywKLS8vCQkvLyBleHRyYURlc2NyaXB0b3JJbmZvQ3RyLmdldFNlbGVjdGlvbigpID8gInRydWUiIDogImZhbHNlIik7Ci0vLwkJRGVmYXVsdENvbnRlbnRWYWxpZGF0b3IKLS8vCQkJCS5zZXREZWZhdWx0U2hvd0V4dHJhSW5mb0ZvckRlc2NyaXB0b3JzKGV4dHJhRGVzY3JpcHRvckluZm9DaGVja2JveAotLy8JCQkJCQkuZ2V0U2VsZWN0aW9uKCkpOwotCX0KLQotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplRGVmYXVsdHMoKSB7Ci0JCWRlc3RpbmF0aW9uUGF0aFRleHQuc2V0VGV4dChQdWJsaXNoaW5nVUlQcmVmZXJlbmNlcwotCQkJCS5nZXREZWZhdWx0UHVibGlzaFBhdGgoKSk7Ci0JCWZlZWRiYWNrVVJMVGV4dAotCQkJCS5zZXRUZXh0KFB1Ymxpc2hpbmdVSVByZWZlcmVuY2VzLmdldERlZmF1bHRGZWVkYmFja1VSTCgpKTsKLQkJZXh0cmFEZXNjcmlwdG9ySW5mb0NoZWNrYm94LnNldFNlbGVjdGlvbihQdWJsaXNoaW5nVUlQcmVmZXJlbmNlcwotCQkJCS5nZXREZWZhdWx0RXh0cmFEZXNjcmlwdG9ySW5mbygpKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZVBhZ2UjZG9HZXRQcmVmZXJlbmNlU3RvcmUoKQotCSAqLwotCXByb3RlY3RlZCBJUHJlZmVyZW5jZVN0b3JlIGRvR2V0UHJlZmVyZW5jZVN0b3JlKCkgewotCQlyZXR1cm4gUHVibGlzaGluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQl9Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZXMgdGhlIHVzZXIgc3BlY2lmaWVkIGRlc3RpbmF0aW9uIHBhdGguCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzUGF0aFZhbGlkKFN0cmluZyBwYXRoKSB7Ci0JCWlmIChwYXRoID09IG51bGwgfHwgcGF0aC5sZW5ndGgoKSA8PSAwKSB7Ci0JCQlzZXRFcnJvck1lc3NhZ2UoUHVibGlzaGluZ1VJUmVzb3VyY2VzLmludmFsaWRQYXRoRXJyb3JfbXNnKTsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJSVBhdGggZWNQYXRoID0gUGF0aC5mcm9tT1NTdHJpbmcocGF0aCk7Ci0JCWJvb2xlYW4gaXNWYWxpZCA9IGVjUGF0aC5pc1ZhbGlkUGF0aChwYXRoKTsKLQkJaWYgKCFpc1ZhbGlkKSB7Ci0JCQlzZXRFcnJvck1lc3NhZ2UoUHVibGlzaGluZ1VJUmVzb3VyY2VzLmludmFsaWRQYXRoRXJyb3JfbXNnKTsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIGZhbHNlOwotCQl9IGVsc2UgaWYgKCFTdHJVdGlsLmlzVmFsaWRQdWJsaXNoUGF0aChwYXRoKSkgewotCQkJc2V0RXJyb3JNZXNzYWdlKFB1Ymxpc2hpbmdVSVJlc291cmNlcy5pbnZhbGlkUGF0aENoYXJzRXJyb3JfbXNnKTsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJc2V0RXJyb3JNZXNzYWdlKG51bGwpOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBPcGVucyB0aGUgZGlyZWN0b3J5IGRpYWxvZy4KLQkgKi8KLQlwcml2YXRlIHZvaWQgb3BlbkRpcmVjdG9yeURpYWxvZygpIHsKLQkJdHJ5IHsKLQkJCURpcmVjdG9yeURpYWxvZyBkZCA9IG5ldyBEaXJlY3RvcnlEaWFsb2coY29tcG9zaXRlLmdldFNoZWxsKCksCi0JCQkJCVNXVC5OT05FKTsKLQkJCVN0cmluZyBkZXN0aW5hdGlvbiA9IGRkLm9wZW4oKTsKLQkJCWlmIChkZXN0aW5hdGlvbiAhPSBudWxsKSB7Ci0JCQkJZGVzdGluYXRpb25QYXRoVGV4dC5zZXRUZXh0KGRlc3RpbmF0aW9uKTsKLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVB1Ymxpc2hpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy91aS9wcmVmZXJlbmNlcy9QdWJsaXNoaW5nVUlQcmVmZXJlbmNlcy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3VpL3ByZWZlcmVuY2VzL1B1Ymxpc2hpbmdVSVByZWZlcmVuY2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiMmEzOTguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3VpL3ByZWZlcmVuY2VzL1B1Ymxpc2hpbmdVSVByZWZlcmVuY2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTcwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLnByZWZlcmVuY2VzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5GaWxlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuZWxlbWVudHMuQWN0aXZpdHlMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkucHJlZmVyZW5jZXMuTGlicmFyeVVJUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkuUHVibGlzaGluZ1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLQotLyoqCi0gKiBNYW5hZ2VzIHRoZSBQdWJsaXNoaW5nIFVJIHByZWZlcmVuY2VzLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBQdWJsaXNoaW5nVUlQcmVmZXJlbmNlcyB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFVCTElTSF9FTlRJUkVfQ09ORklHID0gInB1Ymxpc2hFbnRpcmVDb25maWciOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVElUTEUgPSAidGl0bGUiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkFOTkVSX0lNQUdFID0gImJhbm5lckltYWdlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFCT1VUX0hUTUwgPSAiYWJvdXRIVE1MIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZFRURCQUNLX1VSTCA9ICJmZWVkYmFja1VSTCI7IC8vJE5PTi1OTFMtMSQJCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5DTFVERV9HTE9TU0FSWSA9ICJpbmNsdWRlR2xvc3NhcnkiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5DTFVERV9JTkRFWCA9ICJpbmNsdWRlSW5kZXgiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hFQ0tfRVhURVJOQUxfTElOS1MgPSAiY2hlY2tFeHRlcm5hbExpbmtzIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlZFUlRfQlJPS0VOX0xJTktTID0gImNvbnZlcnRCcm9rZW5MaW5rcyI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMSUdIVF9XRUlHSFRfVFJFRSA9ICJsaWdodFdlaWdodFRyZWUiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUUkFfREVTQ1JJUFRPUl9JTkZPID0gImV4dHJhRGVzY3JpcHRvckluZm8iOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFVCTElTSF9VTk9QRU5fQUNUSVZJVFlfREQgPSAicHVibGlzaFVub3BlbkFjdGl2aXR5REQiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFVCTElTSF9BRF9GT1JfQUNUSVZJVFlfRVhURU5TSU9OID0gInB1Ymxpc2hBREZvckFjdGl2aXR5RXh0ZW5zaW9uIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBVQkxJU0hfUEFUSCA9ICJwdWJsaXNoUGF0aCI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQVUJMSVNIX1NUQVRJQ19XRUJfU0lURSA9ICJwdWJsaXNoU3RhdGljV2ViU2l0ZSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJTkNMVURFX1NFUlZMRVRfU0VBUkNIID0gImluY2x1ZGVTZXJ2bGV0U2VhcmNoIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFdFQkFQUF9OQU1FID0gIndlYkFwcE5hbWUiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5DTFVERV9TRUFSQ0ggPSAiaW5jbHVkZVNlYXJjaCI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJTklUSUFMSVpFRCA9ICJpbml0aWFsaXplZCI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTSE9XX1JFTEFURURfREVTQ1JJUFRPUlMgPSAic2hvd1JlbGF0ZWREZXNjcmlwdG9ycyI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0hPV19SRUxBVEVEX0RFU0NSSVBUT1JTX09QVElPTiA9ICJzaG93UmVsYXRlZERlc2NyaXB0b3JzT3B0aW9uIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNIT1dfREVTQ1JJUFRPUlNfSU5fTkFWSUdBVElPTlRSRUUgPSAic2hvd0Rlc2NyaXB0b3JzSW5OYXZpZ2F0aW9uVHJlZSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0FDVElWSVRZX1RBQiA9ICJkZWZhdWx0QWN0aXZpdHlUYWIiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9QVUJMSVNIX0ZPTERFUl9OQU1FID0gIlB1Ymxpc2giOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZGVmYXVsdFRpdGxlID0gbnVsbDsKLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBkZWZhdWx0QmFubmVySW1hZ2UgPSBudWxsOwotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGRlZmF1bHRBYm91dEhUTUwgPSBudWxsOwotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGRlZmF1bHRGZWVkYmFja1VSTCA9IG51bGw7Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZGVmYXVsdFB1Ymxpc2hQYXRoID0gbnVsbDsKLQotCS8vIFRoZSBwbHVnLWluIHNwZWNpZmljIHByZWZlcmVuY2Ugc3RvcmUuCi0JcHJpdmF0ZSBzdGF0aWMgSVByZWZlcmVuY2VTdG9yZSBwcmVmU3RvcmUgPSBQdWJsaXNoaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpCi0JCQkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0KLQlzdGF0aWMgewotCQkvLyBJbml0aWFsaXplIHRoZSBkZWZhdWx0IHByZWZlcmVuY2UgdmFsdWVzLgotCQlwcmVmU3RvcmUuc2V0RGVmYXVsdChQVUJMSVNIX0VOVElSRV9DT05GSUcsIHRydWUpOwotCi0JCXByZWZTdG9yZS5zZXREZWZhdWx0KFRJVExFLCBnZXREZWZhdWx0VGl0bGUoKSk7Ci0JCXByZWZTdG9yZS5zZXREZWZhdWx0KEJBTk5FUl9JTUFHRSwgZ2V0RGVmYXVsdEJhbm5lckltYWdlKCkpOwotCQlwcmVmU3RvcmUuc2V0RGVmYXVsdChBQk9VVF9IVE1MLCBnZXREZWZhdWx0QWJvdXRIVE1MKCkpOwotCQlwcmVmU3RvcmUuc2V0RGVmYXVsdChGRUVEQkFDS19VUkwsIGdldERlZmF1bHRGZWVkYmFja1VSTCgpKTsKLQkJcHJlZlN0b3JlLnNldERlZmF1bHQoSU5DTFVERV9HTE9TU0FSWSwgZmFsc2UpOwotCQlwcmVmU3RvcmUuc2V0RGVmYXVsdChJTkNMVURFX0lOREVYLCBmYWxzZSk7Ci0JCXByZWZTdG9yZS5zZXREZWZhdWx0KENIRUNLX0VYVEVSTkFMX0xJTktTLCBmYWxzZSk7Ci0JCXByZWZTdG9yZS5zZXREZWZhdWx0KENPTlZFUlRfQlJPS0VOX0xJTktTLCBmYWxzZSk7Ci0JCXByZWZTdG9yZS5zZXREZWZhdWx0KFBVQkxJU0hfVU5PUEVOX0FDVElWSVRZX0RELCBmYWxzZSk7Ci0JCXByZWZTdG9yZS5zZXREZWZhdWx0KFBVQkxJU0hfQURfRk9SX0FDVElWSVRZX0VYVEVOU0lPTiwgZmFsc2UpOwotCQlwcmVmU3RvcmUuc2V0RGVmYXVsdChMSUdIVF9XRUlHSFRfVFJFRSwgdHJ1ZSk7Ci0JCXByZWZTdG9yZS5zZXREZWZhdWx0KEVYVFJBX0RFU0NSSVBUT1JfSU5GTywKLQkJCQlnZXREZWZhdWx0RXh0cmFEZXNjcmlwdG9ySW5mbygpKTsKLQkJcHJlZlN0b3JlLnNldERlZmF1bHQoREVGQVVMVF9BQ1RJVklUWV9UQUIsCi0JCQkJQWN0aXZpdHlMYXlvdXQuVEFCX05BTUVfQUNUSVZJVFlfV0JTKTsKLQotCQlwcmVmU3RvcmUuc2V0RGVmYXVsdChQVUJMSVNIX1BBVEgsIGdldERlZmF1bHRQdWJsaXNoUGF0aCgpKTsKLQkJcHJlZlN0b3JlLnNldERlZmF1bHQoUFVCTElTSF9TVEFUSUNfV0VCX1NJVEUsIHRydWUpOwotCQlwcmVmU3RvcmUuc2V0RGVmYXVsdChJTkNMVURFX1NFUlZMRVRfU0VBUkNILCB0cnVlKTsKLQkJcHJlZlN0b3JlLnNldERlZmF1bHQoV0VCQVBQX05BTUUsICIiKTsgLy8kTk9OLU5MUy0xJAkJCQotCQlwcmVmU3RvcmUuc2V0RGVmYXVsdChJTkNMVURFX1NFQVJDSCwgdHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgcHVibGlzaCBlbnRpcmUgY29uZmlndXJhdGlvbiBwcmVmZXJlbmNlIHZhbHVlLgotCSAqIAotCSAqIEBwYXJhbSBjb25maWdJZAotCSAqICAgICAgICAgICAgYSBtZXRob2QgY29uZmlndXJhdGlvbiBHVUlECi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgcHJlZmVyZW5jZSBpcyBzZXQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gZ2V0UHVibGlzaEVudGlyZUNvbmZpZyhTdHJpbmcgY29uZmlnSWQpIHsKLQkJaWYgKGdldENvbmZpZ1ByZWZJbml0aWFsaXplZChjb25maWdJZCkpIHsKLQkJCXJldHVybiBwcmVmU3RvcmUuZ2V0Qm9vbGVhbihnZXRDb25maWdQcmVmUHJlZml4KGNvbmZpZ0lkKQotCQkJCQkrIFBVQkxJU0hfRU5USVJFX0NPTkZJRyk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gcHJlZlN0b3JlLmdldEJvb2xlYW4oUFVCTElTSF9FTlRJUkVfQ09ORklHKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHB1Ymxpc2ggZW50aXJlIGNvbmZpZ3VyYXRpb25wcmVmZXJlbmNlIHZhbHVlLgotCSAqIAotCSAqIEBwYXJhbSBjb25maWdJZAotCSAqICAgICAgICAgICAgYSBtZXRob2QgY29uZmlndXJhdGlvbiBHVUlECi0JICogQHBhcmFtIHZhbHVlCi0JICogICAgICAgICAgICB0aGUgcHJlZmVyZW5jZSB2YWx1ZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRQdWJsaXNoRW50aXJlQ29uZmlnKFN0cmluZyBjb25maWdJZCwgYm9vbGVhbiB2YWx1ZSkgewotCQlwcmVmU3RvcmUuc2V0VmFsdWUoZ2V0Q29uZmlnUHJlZlByZWZpeChjb25maWdJZCkKLQkJCQkrIFBVQkxJU0hfRU5USVJFX0NPTkZJRywgdmFsdWUpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHB1Ymxpc2ggZW50aXJlIGNvbmZpZ3VyYXRpb24gcHJlZmVyZW5jZSB0byBiZSBkZWZhdWx0IHZhbHVlCi0JICogCi0JICogQHBhcmFtIGNvbmZpZ0lkCi0JICogICAgICAgICAgICBhIG1ldGhvZCBjb25maWd1cmF0aW9uIEdVSUQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVtb3ZlUHVibGlzaEVudGlyZUNvbmZpZyhTdHJpbmcgY29uZmlnSWQpIHsKLQkJcHJlZlN0b3JlLnNldFRvRGVmYXVsdChnZXRDb25maWdQcmVmUHJlZml4KGNvbmZpZ0lkKQotCQkJCSsgUFVCTElTSF9FTlRJUkVfQ09ORklHKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBkZWZhdWx0IHRpdGxlIGZvciBhIHB1Ymxpc2hlZCB3ZWJzaXRlLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGRlZmF1bHQgdGl0bGUgZm9yIGEgcHVibGlzaGVkIHdlYnNpdGUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXREZWZhdWx0VGl0bGUoKSB7Ci0JCWlmIChkZWZhdWx0VGl0bGUgPT0gbnVsbCkgewotCQkJU3RyaW5nIHVybCA9IFB1Ymxpc2hpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0U3RyaW5nKCJ0aXRsZSIpOyAvLyROT04tTkxTLTEkCi0JCQlpZiAodXJsID09IG51bGwgfHwgdXJsLmxlbmd0aCgpID09IDAgfHwgdXJsLnN0YXJ0c1dpdGgoIlsiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJdXJsID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWRlZmF1bHRUaXRsZSA9IHVybDsKLQkJfQotCQlyZXR1cm4gZGVmYXVsdFRpdGxlOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHdlYiBzaXRlIHRpdGxlIHByZWZlcmVuY2UgdmFsdWUuCi0JICogCi0JICogQHBhcmFtIGNvbmZpZ0lkCi0JICogICAgICAgICAgICBhIG1ldGhvZCBjb25maWd1cmF0aW9uIEdVSUQKLQkgKiBAcmV0dXJuIHRoZSB3ZWIgc2l0ZSB0aXRsZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFRpdGxlKFN0cmluZyBjb25maWdJZCkgewotCQlpZiAoZ2V0Q29uZmlnUHJlZkluaXRpYWxpemVkKGNvbmZpZ0lkKSkgewotCQkJcmV0dXJuIHByZWZTdG9yZS5nZXRTdHJpbmcoZ2V0Q29uZmlnUHJlZlByZWZpeChjb25maWdJZCkgKyBUSVRMRSk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gcHJlZlN0b3JlLmdldFN0cmluZyhUSVRMRSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB3ZWIgc2l0ZSB0aXRsZSBwcmVmZXJlbmNlIHZhbHVlLgotCSAqIAotCSAqIEBwYXJhbSBjb25maWdJZAotCSAqICAgICAgICAgICAgYSBtZXRob2QgY29uZmlndXJhdGlvbiBHVUlECi0JICogQHBhcmFtIHRpdGxlCi0JICogICAgICAgICAgICB0aGUgd2ViIHNpdGUgdGl0bGUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0VGl0bGUoU3RyaW5nIGNvbmZpZ0lkLCBTdHJpbmcgdGl0bGUpIHsKLQkJcHJlZlN0b3JlLnNldFZhbHVlKGdldENvbmZpZ1ByZWZQcmVmaXgoY29uZmlnSWQpICsgVElUTEUsIHRpdGxlKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB3ZWIgc2l0ZSB0aXRsZSBwcmVmZXJlbmNlIHRvIGJlIGRlZmF1bHQgdmFsdWUuCi0JICogCi0JICogQHBhcmFtIGNvbmZpZ0lkCi0JICogICAgICAgICAgICBhIG1ldGhvZCBjb25maWd1cmF0aW9uIEdVSUQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVtb3ZlVGl0bGUoU3RyaW5nIGNvbmZpZ0lkKSB7Ci0JCXByZWZTdG9yZS5zZXRUb0RlZmF1bHQoZ2V0Q29uZmlnUHJlZlByZWZpeChjb25maWdJZCkgKyBUSVRMRSk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgZGVmYXVsdCBiYW5uZXIgaW1hZ2UgZm9yIGEgcHVibGlzaGVkIHdlYnNpdGUuCi0JICogCi0JICogQHJldHVybiB0aGUgZGVmYXVsdCBiYW5uZXIgaW1hZ2UgZm9yIGEgcHVibGlzaGVkIHdlYnNpdGUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXREZWZhdWx0QmFubmVySW1hZ2UoKSB7Ci0JCWlmIChkZWZhdWx0QmFubmVySW1hZ2UgPT0gbnVsbCkgewotCQkJU3RyaW5nIGltYWdlID0gUHVibGlzaGluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRTdHJpbmcoCi0JCQkJCSJiYW5uZXJJbWFnZSIpOyAvLyROT04tTkxTLTEkCi0JCQlpZiAoaW1hZ2UgPT0gbnVsbCB8fCBpbWFnZS5sZW5ndGgoKSA9PSAwIHx8IGltYWdlLnN0YXJ0c1dpdGgoIlsiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJaW1hZ2UgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJZGVmYXVsdEJhbm5lckltYWdlID0gaW1hZ2U7Ci0JCX0KLQkJcmV0dXJuIGRlZmF1bHRCYW5uZXJJbWFnZTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBiYW5uZXIgaW1hZ2UgcHJlZmVyZW5jZSB2YWx1ZS4KLQkgKiAKLQkgKiBAcGFyYW0gY29uZmlnSWQKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24gR1VJRAotCSAqIEByZXR1cm4gdGhlIGJhbm5lciBpbWFnZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEJhbm5lckltYWdlKFN0cmluZyBjb25maWdJZCkgewotCQlpZiAoZ2V0Q29uZmlnUHJlZkluaXRpYWxpemVkKGNvbmZpZ0lkKSkgewotCQkJcmV0dXJuIHByZWZTdG9yZS5nZXRTdHJpbmcoZ2V0Q29uZmlnUHJlZlByZWZpeChjb25maWdJZCkKLQkJCQkJKyBCQU5ORVJfSU1BR0UpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIHByZWZTdG9yZS5nZXRTdHJpbmcoQkFOTkVSX0lNQUdFKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGJhbm5lciBpbWFnZSBwcmVmZXJlbmNlIHZhbHVlLgotCSAqIAotCSAqIEBwYXJhbSBjb25maWdJZAotCSAqICAgICAgICAgICAgYSBtZXRob2QgY29uZmlndXJhdGlvbiBHVUlECi0JICogQHBhcmFtIGltYWdlCi0JICogICAgICAgICAgICB0aGUgYmFubmVyIGltYWdlIFVSTAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRCYW5uZXJJbWFnZShTdHJpbmcgY29uZmlnSWQsIFN0cmluZyBpbWFnZSkgewotCQlwcmVmU3RvcmUuc2V0VmFsdWUoZ2V0Q29uZmlnUHJlZlByZWZpeChjb25maWdJZCkgKyBCQU5ORVJfSU1BR0UsIGltYWdlKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBiYW5uZXIgaW1hZ2UgcHJlZmVyZW5jZSB0byBiZSBkZWZhdWx0IHZhbHVlLgotCSAqIAotCSAqIEBwYXJhbSBjb25maWdJZAotCSAqICAgICAgICAgICAgYSBtZXRob2QgY29uZmlndXJhdGlvbiBHVUlECi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZUJhbm5lckltYWdlKFN0cmluZyBjb25maWdJZCkgewotCQlwcmVmU3RvcmUuc2V0VG9EZWZhdWx0KGdldENvbmZpZ1ByZWZQcmVmaXgoY29uZmlnSWQpICsgQkFOTkVSX0lNQUdFKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBkZWZhdWx0IGFib3V0IEhUTUwgZm9yIGEgcHVibGlzaGVkIHdlYnNpdGUuCi0JICogCi0JICogQHJldHVybiB0aGUgZGVmYXVsdCBhYm91dCBIVE1MIGZvciBhIHB1Ymxpc2hlZCB3ZWJzaXRlCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RGVmYXVsdEFib3V0SFRNTCgpIHsKLQkJaWYgKGRlZmF1bHRBYm91dEhUTUwgPT0gbnVsbCkgewotCQkJU3RyaW5nIGZpbGUgPSBQdWJsaXNoaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpCi0JCQkJCS5nZXRTdHJpbmcoImFib3V0SFRNTCIpOyAvLyROT04tTkxTLTEkCi0JCQlpZiAoZmlsZSA9PSBudWxsIHx8IGZpbGUubGVuZ3RoKCkgPT0gMCB8fCBmaWxlLnN0YXJ0c1dpdGgoIlsiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJZmlsZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlkZWZhdWx0QWJvdXRIVE1MID0gZmlsZTsKLQkJfQotCQlyZXR1cm4gZGVmYXVsdEFib3V0SFRNTDsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBhYm91dCBIVE1MIHByZWZlcmVuY2UgdmFsdWUuCi0JICogCi0JICogQHBhcmFtIGNvbmZpZ0lkCi0JICogICAgICAgICAgICBhIG1ldGhvZCBjb25maWd1cmF0aW9uIEdVSUQKLQkgKiBAcmV0dXJuIHRoZSBhYm91dCBIVE1MIGZpbGUgcGF0aAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEFib3V0SFRNTChTdHJpbmcgY29uZmlnSWQpIHsKLQkJaWYgKGdldENvbmZpZ1ByZWZJbml0aWFsaXplZChjb25maWdJZCkpIHsKLQkJCXJldHVybiBwcmVmU3RvcmUuZ2V0U3RyaW5nKGdldENvbmZpZ1ByZWZQcmVmaXgoY29uZmlnSWQpCi0JCQkJCSsgQUJPVVRfSFRNTCk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gcHJlZlN0b3JlLmdldFN0cmluZyhBQk9VVF9IVE1MKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGFib3V0IEhUTUwgcHJlZmVyZW5jZSB2YWx1ZS4KLQkgKiAKLQkgKiBAcGFyYW0gY29uZmlnSWQKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24gR1VJRAotCSAqIEBwYXJhbSBwYXRoCi0JICogICAgICAgICAgICB0aGUgYWJvdXQgSFRNTCBmaWxlIHBhdGgKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0QWJvdXRIVE1MKFN0cmluZyBjb25maWdJZCwgU3RyaW5nIHBhdGgpIHsKLQkJcHJlZlN0b3JlLnNldFZhbHVlKGdldENvbmZpZ1ByZWZQcmVmaXgoY29uZmlnSWQpICsgQUJPVVRfSFRNTCwgcGF0aCk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgYWJvdXQgSFRNTCBwcmVmZXJlbmNlIHRvIGJlIGRlZmF1bHQgdmFsdWUuCi0JICogCi0JICogQHBhcmFtIGNvbmZpZ0lkCi0JICogICAgICAgICAgICBhIG1ldGhvZCBjb25maWd1cmF0aW9uIEdVSUQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVtb3ZlQWJvdXRIVE1MKFN0cmluZyBjb25maWdJZCkgewotCQlwcmVmU3RvcmUuc2V0VG9EZWZhdWx0KGdldENvbmZpZ1ByZWZQcmVmaXgoY29uZmlnSWQpICsgQUJPVVRfSFRNTCk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgZGVmYXVsdCBmZWVkYmFjayBVUkwgZm9yIGEgcHVibGlzaGVkIHdlYnNpdGUuCi0JICogCi0JICogQHJldHVybiB0aGUgZGVmYXVsdCBmZWVkYmFjayBVUkwgZm9yIGEgcHVibGlzaGVkIHdlYnNpdGUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXREZWZhdWx0RmVlZGJhY2tVUkwoKSB7Ci0JCWlmIChkZWZhdWx0RmVlZGJhY2tVUkwgPT0gbnVsbCkgewotCQkJZGVmYXVsdEZlZWRiYWNrVVJMID0gImh0dHA6Ly93d3cucHVibGlzaGVkX3dlYnNpdGUuY29tL2ZlZWRiYWNrIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBkZWZhdWx0RmVlZGJhY2tVUkw7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgZmVlZGJhY2sgVVJMIHByZWZlcmVuY2UgdmFsdWUuCi0JICogCi0JICogQHJldHVybiB0aGUgZmVlZGJhY2sgVVJMCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RmVlZGJhY2tVUkwoKSB7Ci0JCXJldHVybiBwcmVmU3RvcmUuZ2V0U3RyaW5nKEZFRURCQUNLX1VSTCk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgZmVlZGJhY2sgVVJMIHByZWZlcmVuY2UgdmFsdWUuCi0JICogCi0JICogQHBhcmFtIHVybAotCSAqICAgICAgICAgICAgdGhlIGZlZWRiYWNrIFVSTAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRGZWVkYmFja1VSTChTdHJpbmcgdXJsKSB7Ci0JCXByZWZTdG9yZS5zZXRWYWx1ZShGRUVEQkFDS19VUkwsIHVybCk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgZmVlZGJhY2sgVVJMIHByZWZlcmVuY2UgdmFsdWUuCi0JICogCi0JICogQHBhcmFtIGNvbmZpZ0lkCi0JICogICAgICAgICAgICBhIG1ldGhvZCBjb25maWd1cmF0aW9uIEdVSUQKLQkgKiBAcmV0dXJuIHRoZSBmZWVkYmFjayBVUkwKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRGZWVkYmFja1VSTChTdHJpbmcgY29uZmlnSWQpIHsKLQkJaWYgKGdldENvbmZpZ1ByZWZJbml0aWFsaXplZChjb25maWdJZCkpIHsKLQkJCXJldHVybiBwcmVmU3RvcmUuZ2V0U3RyaW5nKGdldENvbmZpZ1ByZWZQcmVmaXgoY29uZmlnSWQpCi0JCQkJCSsgRkVFREJBQ0tfVVJMKTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBwcmVmU3RvcmUuZ2V0U3RyaW5nKEZFRURCQUNLX1VSTCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBmZWVkYmFjayBVUkwgcHJlZmVyZW5jZSB2YWx1ZS4KLQkgKiAKLQkgKiBAcGFyYW0gY29uZmlnSWQKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24gR1VJRAotCSAqIEBwYXJhbSB1cmwKLQkgKiAgICAgICAgICAgIHRoZSBmZWVkYmFjayBVUkwKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0RmVlZGJhY2tVUkwoU3RyaW5nIGNvbmZpZ0lkLCBTdHJpbmcgdXJsKSB7Ci0JCXByZWZTdG9yZS5zZXRWYWx1ZShnZXRDb25maWdQcmVmUHJlZml4KGNvbmZpZ0lkKSArIEZFRURCQUNLX1VSTCwgdXJsKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBmZWVkYmFjayBVUkwgcHJlZmVyZW5jZSB0byBiZSBkZWZhdWx0IHZhbHVlLgotCSAqIAotCSAqIEBwYXJhbSBjb25maWdJZAotCSAqICAgICAgICAgICAgYSBtZXRob2QgY29uZmlndXJhdGlvbiBHVUlECi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZUZlZWRiYWNrVVJMKFN0cmluZyBjb25maWdJZCkgewotCQlwcmVmU3RvcmUuc2V0VG9EZWZhdWx0KGdldENvbmZpZ1ByZWZQcmVmaXgoY29uZmlnSWQpICsgRkVFREJBQ0tfVVJMKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBpbmNsdWRlIGdsb3NzYXJ5IHByZWZlcmVuY2UgdmFsdWUuCi0JICogCi0JICogQHBhcmFtIGNvbmZpZ0lkCi0JICogICAgICAgICAgICBhIG1ldGhvZCBjb25maWd1cmF0aW9uIEdVSUQKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBwcmVmZXJlbmNlIGlzIHNldAotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBnZXRJbmNsdWRlR2xvc3NhcnkoU3RyaW5nIGNvbmZpZ0lkKSB7Ci0JCWlmIChnZXRDb25maWdQcmVmSW5pdGlhbGl6ZWQoY29uZmlnSWQpKSB7Ci0JCQlyZXR1cm4gcHJlZlN0b3JlLmdldEJvb2xlYW4oZ2V0Q29uZmlnUHJlZlByZWZpeChjb25maWdJZCkKLQkJCQkJKyBJTkNMVURFX0dMT1NTQVJZKTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBwcmVmU3RvcmUuZ2V0Qm9vbGVhbihJTkNMVURFX0dMT1NTQVJZKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGluY2x1ZGUgZ2xvc3NhcnkgcHJlZmVyZW5jZSB2YWx1ZS4KLQkgKiAKLQkgKiBAcGFyYW0gY29uZmlnSWQKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24gR1VJRAotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgdGhlIHByZWZlcmVuY2UgdmFsdWUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0SW5jbHVkZUdsb3NzYXJ5KFN0cmluZyBjb25maWdJZCwgYm9vbGVhbiB2YWx1ZSkgewotCQlwcmVmU3RvcmUuc2V0VmFsdWUoZ2V0Q29uZmlnUHJlZlByZWZpeChjb25maWdJZCkgKyBJTkNMVURFX0dMT1NTQVJZLAotCQkJCXZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBpbmNsdWRlIGdsb3NzYXJ5IHByZWZlcmVuY2UgdG8gYmUgZGVmYXVsdCB2YWx1ZS4KLQkgKiAKLQkgKiBAcGFyYW0gY29uZmlnSWQKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24gR1VJRAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVJbmNsdWRlR2xvc3NhcnkoU3RyaW5nIGNvbmZpZ0lkKSB7Ci0JCXByZWZTdG9yZQotCQkJCS5zZXRUb0RlZmF1bHQoZ2V0Q29uZmlnUHJlZlByZWZpeChjb25maWdJZCkgKyBJTkNMVURFX0dMT1NTQVJZKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBpbmNsdWRlIGluZGV4IHByZWZlcmVuY2UgdmFsdWUuCi0JICogCi0JICogQHBhcmFtIGNvbmZpZ0lkCi0JICogICAgICAgICAgICBhIG1ldGhvZCBjb25maWd1cmF0aW9uIEdVSUQKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBwcmVmZXJlbmNlIGlzIHNldAotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBnZXRJbmNsdWRlSW5kZXgoU3RyaW5nIGNvbmZpZ0lkKSB7Ci0JCWlmIChnZXRDb25maWdQcmVmSW5pdGlhbGl6ZWQoY29uZmlnSWQpKSB7Ci0JCQlyZXR1cm4gcHJlZlN0b3JlLmdldEJvb2xlYW4oZ2V0Q29uZmlnUHJlZlByZWZpeChjb25maWdJZCkKLQkJCQkJKyBJTkNMVURFX0lOREVYKTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBwcmVmU3RvcmUuZ2V0Qm9vbGVhbihJTkNMVURFX0lOREVYKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGluY2x1ZGUgaW5kZXggcHJlZmVyZW5jZSB2YWx1ZS4KLQkgKiAKLQkgKiBAcGFyYW0gY29uZmlnSWQKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24gR1VJRAotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgdGhlIHByZWZlcmVuY2UgdmFsdWUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0SW5jbHVkZUluZGV4KFN0cmluZyBjb25maWdJZCwgYm9vbGVhbiB2YWx1ZSkgewotCQlwcmVmU3RvcmUKLQkJCQkuc2V0VmFsdWUoZ2V0Q29uZmlnUHJlZlByZWZpeChjb25maWdJZCkgKyBJTkNMVURFX0lOREVYLCB2YWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgaW5jbHVkZSBpbmRleCBwcmVmZXJlbmNlIHRvIGJlIGRlZmF1bHQgdmFsdWUuCi0JICogCi0JICogQHBhcmFtIGNvbmZpZ0lkCi0JICogICAgICAgICAgICBhIG1ldGhvZCBjb25maWd1cmF0aW9uIEdVSUQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVtb3ZlSW5jbHVkZUluZGV4KFN0cmluZyBjb25maWdJZCkgewotCQlwcmVmU3RvcmUuc2V0VG9EZWZhdWx0KGdldENvbmZpZ1ByZWZQcmVmaXgoY29uZmlnSWQpICsgSU5DTFVERV9JTkRFWCk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgY2hlY2sgZXh0ZXJuYWwgbGlua3MgcHJlZmVyZW5jZSB2YWx1ZS4KLQkgKiAKLQkgKiBAcGFyYW0gY29uZmlnSWQKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24gR1VJRAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHByZWZlcmVuY2UgaXMgc2V0Ci0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGdldENoZWNrRXh0ZXJuYWxMaW5rcyhTdHJpbmcgY29uZmlnSWQpIHsKLQkJaWYgKGdldENvbmZpZ1ByZWZJbml0aWFsaXplZChjb25maWdJZCkpIHsKLQkJCXJldHVybiBwcmVmU3RvcmUuZ2V0Qm9vbGVhbihnZXRDb25maWdQcmVmUHJlZml4KGNvbmZpZ0lkKQotCQkJCQkrIENIRUNLX0VYVEVSTkFMX0xJTktTKTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBwcmVmU3RvcmUuZ2V0Qm9vbGVhbihDSEVDS19FWFRFUk5BTF9MSU5LUyk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBjaGVjayBleHRlcm5hbCBsaW5rcyBwcmVmZXJlbmNlIHZhbHVlLgotCSAqIAotCSAqIEBwYXJhbSBjb25maWdJZAotCSAqICAgICAgICAgICAgYSBtZXRob2QgY29uZmlndXJhdGlvbiBHVUlECi0JICogQHBhcmFtIHZhbHVlCi0JICogICAgICAgICAgICB0aGUgcHJlZmVyZW5jZSB2YWx1ZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRDaGVja0V4dGVybmFsTGlua3MoU3RyaW5nIGNvbmZpZ0lkLCBib29sZWFuIHZhbHVlKSB7Ci0JCXByZWZTdG9yZS5zZXRWYWx1ZSgKLQkJCQlnZXRDb25maWdQcmVmUHJlZml4KGNvbmZpZ0lkKSArIENIRUNLX0VYVEVSTkFMX0xJTktTLCB2YWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgY2hlY2sgZXh0ZXJuYWwgbGlua3MgcHJlZmVyZW5jZSB0byBiZSBkZWZhdWx0IHZhbHVlLgotCSAqIAotCSAqIEBwYXJhbSBjb25maWdJZAotCSAqICAgICAgICAgICAgYSBtZXRob2QgY29uZmlndXJhdGlvbiBHVUlECi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZUNoZWNrRXh0ZXJuYWxMaW5rcyhTdHJpbmcgY29uZmlnSWQpIHsKLQkJcHJlZlN0b3JlLnNldFRvRGVmYXVsdChnZXRDb25maWdQcmVmUHJlZml4KGNvbmZpZ0lkKQotCQkJCSsgQ0hFQ0tfRVhURVJOQUxfTElOS1MpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGNvbnZlcnQgYnJva2VuIGxpbmtzIHByZWZlcmVuY2UgdmFsdWUuCi0JICogCi0JICogQHBhcmFtIGNvbmZpZ0lkCi0JICogICAgICAgICAgICBhIG1ldGhvZCBjb25maWd1cmF0aW9uIEdVSUQKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBwcmVmZXJlbmNlIGlzIHNldAotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBnZXRDb252ZXJ0QnJva2VuTGlua3MoU3RyaW5nIGNvbmZpZ0lkKSB7Ci0JCWlmIChnZXRDb25maWdQcmVmSW5pdGlhbGl6ZWQoY29uZmlnSWQpKSB7Ci0JCQlyZXR1cm4gcHJlZlN0b3JlLmdldEJvb2xlYW4oZ2V0Q29uZmlnUHJlZlByZWZpeChjb25maWdJZCkKLQkJCQkJKyBDT05WRVJUX0JST0tFTl9MSU5LUyk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gcHJlZlN0b3JlLmdldEJvb2xlYW4oQ09OVkVSVF9CUk9LRU5fTElOS1MpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgY29udmVydCBicm9rZW4gbGlua3MgcHJlZmVyZW5jZSB2YWx1ZS4KLQkgKiAKLQkgKiBAcGFyYW0gY29uZmlnSWQKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24gR1VJRAotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgdGhlIHByZWZlcmVuY2UgdmFsdWUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0Q29udmVydEJyb2tlbkxpbmtzKFN0cmluZyBjb25maWdJZCwgYm9vbGVhbiB2YWx1ZSkgewotCQlwcmVmU3RvcmUuc2V0VmFsdWUoCi0JCQkJZ2V0Q29uZmlnUHJlZlByZWZpeChjb25maWdJZCkgKyBDT05WRVJUX0JST0tFTl9MSU5LUywgdmFsdWUpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGNvbnZlcnQgYnJva2VuIGxpbmtzIHByZWZlcmVuY2UgdG8gYmUgZGVmYXVsdCB2YWx1ZS4KLQkgKiAKLQkgKiBAcGFyYW0gY29uZmlnSWQKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24gR1VJRAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVDb252ZXJ0QnJva2VuTGlua3MoU3RyaW5nIGNvbmZpZ0lkKSB7Ci0JCXByZWZTdG9yZS5zZXRUb0RlZmF1bHQoZ2V0Q29uZmlnUHJlZlByZWZpeChjb25maWdJZCkKLQkJCQkrIENPTlZFUlRfQlJPS0VOX0xJTktTKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBwdWJsaXNoIHVub3BlbiBhY3Rpdml0eSBkZXRhaWwgZGlhZ3JhbXMgcHJlZmVyZW5jZSB2YWx1ZS4KLQkgKiAKLQkgKiBAcGFyYW0gY29uZmlnSWQKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24gR1VJRAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHByZWZlcmVuY2UgaXMgc2V0Ci0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGdldFB1Ymxpc2hVbm9wZW5BY3Rpdml0eUREKFN0cmluZyBjb25maWdJZCkgewotCQlpZiAoZ2V0Q29uZmlnUHJlZkluaXRpYWxpemVkKGNvbmZpZ0lkKSkgewotCQkJcmV0dXJuIHByZWZTdG9yZS5nZXRCb29sZWFuKGdldENvbmZpZ1ByZWZQcmVmaXgoY29uZmlnSWQpCi0JCQkJCSsgUFVCTElTSF9VTk9QRU5fQUNUSVZJVFlfREQpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIHByZWZTdG9yZS5nZXRCb29sZWFuKFBVQkxJU0hfVU5PUEVOX0FDVElWSVRZX0REKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHB1Ymxpc2ggdW5vcGVuIGFjdGl2aXR5IGRldGFpbCBkaWFncmFtcyBwcmVmZXJlbmNlIHZhbHVlLgotCSAqIAotCSAqIEBwYXJhbSBjb25maWdJZAotCSAqICAgICAgICAgICAgYSBtZXRob2QgY29uZmlndXJhdGlvbiBHVUlECi0JICogQHBhcmFtIHZhbHVlCi0JICogICAgICAgICAgICB0aGUgcHJlZmVyZW5jZSB2YWx1ZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRQdWJsaXNoVW5vcGVuQWN0aXZpdHlERChTdHJpbmcgY29uZmlnSWQsIGJvb2xlYW4gdmFsdWUpIHsKLQkJcHJlZlN0b3JlLnNldFZhbHVlKGdldENvbmZpZ1ByZWZQcmVmaXgoY29uZmlnSWQpCi0JCQkJKyBQVUJMSVNIX1VOT1BFTl9BQ1RJVklUWV9ERCwgdmFsdWUpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHB1Ymxpc2ggdW5vcGVuIGFjdGl2aXR5IGRldGFpbCBkaWFncmFtcyBwcmVmZXJlbmNlIHRvIGJlIGRlZmF1bHQKLQkgKiB2YWx1ZS4KLQkgKiAKLQkgKiBAcGFyYW0gY29uZmlnSWQKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24gR1VJRAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVQdWJsaXNoVW5vcGVuQWN0aXZpdHlERChTdHJpbmcgY29uZmlnSWQpIHsKLQkJcHJlZlN0b3JlLnNldFRvRGVmYXVsdChnZXRDb25maWdQcmVmUHJlZml4KGNvbmZpZ0lkKQotCQkJCSsgUFVCTElTSF9VTk9QRU5fQUNUSVZJVFlfREQpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHB1Ymxpc2ggYWN0aXZpeSBkaWFncmFtcyBmb3IgYmFzZSBhY3Rpdml0aWVzIHdpdGggdW5tb2RpZmllZAotCSAqIGV4dGVuc2lvbiBwcmVmZXJlbmNlIHZhbHVlLgotCSAqIAotCSAqIEBwYXJhbSBjb25maWdJZAotCSAqICAgICAgICAgICAgYSBtZXRob2QgY29uZmlndXJhdGlvbiBHVUlECi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgcHJlZmVyZW5jZSBpcyBzZXQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gZ2V0UHVibGlzaEFERm9yQWN0aXZpdHlFeHRlbnNpb24oU3RyaW5nIGNvbmZpZ0lkKSB7Ci0JCWlmIChnZXRDb25maWdQcmVmSW5pdGlhbGl6ZWQoY29uZmlnSWQpKSB7Ci0JCQlyZXR1cm4gcHJlZlN0b3JlLmdldEJvb2xlYW4oZ2V0Q29uZmlnUHJlZlByZWZpeChjb25maWdJZCkKLQkJCQkJKyBQVUJMSVNIX0FEX0ZPUl9BQ1RJVklUWV9FWFRFTlNJT04pOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIHByZWZTdG9yZS5nZXRCb29sZWFuKFBVQkxJU0hfQURfRk9SX0FDVElWSVRZX0VYVEVOU0lPTik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBwdWJsaXNoIGFjdGl2aXkgZGlhZ3JhbXMgZm9yIGJhc2UgYWN0aXZpdGllcyB3aXRoIHVubW9kaWZpZWQKLQkgKiBleHRlbnNpb24gcHJlZmVyZW5jZSB2YWx1ZS4KLQkgKiAKLQkgKiBAcGFyYW0gY29uZmlnSWQKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24gR1VJRAotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgdGhlIHByZWZlcmVuY2UgdmFsdWUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0UHVibGlzaEFERm9yQWN0aXZpdHlFeHRlbnNpb24oU3RyaW5nIGNvbmZpZ0lkLAotCQkJYm9vbGVhbiB2YWx1ZSkgewotCQlwcmVmU3RvcmUuc2V0VmFsdWUoZ2V0Q29uZmlnUHJlZlByZWZpeChjb25maWdJZCkKLQkJCQkrIFBVQkxJU0hfQURfRk9SX0FDVElWSVRZX0VYVEVOU0lPTiwgdmFsdWUpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHB1Ymxpc2ggYWN0aXZpeSBkaWFncmFtcyBmb3IgYmFzZSBhY3Rpdml0aWVzIHdpdGggdW5tb2RpZmllZAotCSAqIGV4dGVuc2lvbiBwcmVmZXJlbmNlIHRvIGJlIGRlZmF1bHQgdmFsdWUuCi0JICogCi0JICogQHBhcmFtIGNvbmZpZ0lkCi0JICogICAgICAgICAgICBhIG1ldGhvZCBjb25maWd1cmF0aW9uIEdVSUQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVtb3ZlUHVibGlzaEFERm9yQWN0aXZpdHlFeHRlbnNpb24oU3RyaW5nIGNvbmZpZ0lkKSB7Ci0JCXByZWZTdG9yZS5zZXRUb0RlZmF1bHQoZ2V0Q29uZmlnUHJlZlByZWZpeChjb25maWdJZCkKLQkJCQkrIFBVQkxJU0hfQURfRk9SX0FDVElWSVRZX0VYVEVOU0lPTik7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgbGlnaHQgd2VpZ2h0IHRyZWUgcHJlZmVyZW5jZSB2YWx1ZS4KLQkgKiAKLQkgKiBAcGFyYW0gY29uZmlnSWQKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24gR1VJRAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHByZWZlcmVuY2UgaXMgc2V0Ci0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGdldExpZ2h0V2VpZ2h0VHJlZShTdHJpbmcgY29uZmlnSWQpIHsKLQkJaWYgKGdldENvbmZpZ1ByZWZJbml0aWFsaXplZChjb25maWdJZCkpIHsKLQkJCXJldHVybiBwcmVmU3RvcmUuZ2V0Qm9vbGVhbihnZXRDb25maWdQcmVmUHJlZml4KGNvbmZpZ0lkKQotCQkJCQkrIExJR0hUX1dFSUdIVF9UUkVFKTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBwcmVmU3RvcmUuZ2V0Qm9vbGVhbihMSUdIVF9XRUlHSFRfVFJFRSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBsaWdodCB3ZWlnaHQgdHJlZSBwcmVmZXJlbmNlIHZhbHVlLgotCSAqIAotCSAqIEBwYXJhbSBjb25maWdJZAotCSAqICAgICAgICAgICAgYSBtZXRob2QgY29uZmlndXJhdGlvbiBHVUlECi0JICogQHBhcmFtIHZhbHVlCi0JICogICAgICAgICAgICB0aGUgcHJlZmVyZW5jZSB2YWx1ZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRMaWdodFdlaWdodFRyZWUoU3RyaW5nIGNvbmZpZ0lkLCBib29sZWFuIHZhbHVlKSB7Ci0JCXByZWZTdG9yZS5zZXRWYWx1ZShnZXRDb25maWdQcmVmUHJlZml4KGNvbmZpZ0lkKSArIExJR0hUX1dFSUdIVF9UUkVFLAotCQkJCXZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBsaWdodCB3ZWlnaHQgdHJlZSBwcmVmZXJlbmNlIHRvIGJlIGRlZmF1bHQgdmFsdWUuCi0JICogCi0JICogQHBhcmFtIGNvbmZpZ0lkCi0JICogICAgICAgICAgICBhIG1ldGhvZCBjb25maWd1cmF0aW9uIEdVSUQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVtb3ZlTGlnaHRXZWlnaHRUcmVlKFN0cmluZyBjb25maWdJZCkgewotCQlwcmVmU3RvcmUuc2V0VG9EZWZhdWx0KGdldENvbmZpZ1ByZWZQcmVmaXgoY29uZmlnSWQpCi0JCQkJKyBMSUdIVF9XRUlHSFRfVFJFRSk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgZGVmYXVsdCBleHRyYSBkZXNjcmlwdG9yIGluZm8gcHJlZmVyZW5jZSB2YWx1ZS4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBwcmVmZXJlbmNlIGlzIHNldAotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBnZXREZWZhdWx0RXh0cmFEZXNjcmlwdG9ySW5mbygpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGV4dHJhIGRlc2NyaXB0b3IgaW5mbyBwcmVmZXJlbmNlIHZhbHVlLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHByZWZlcmVuY2UgdmFsdWUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gZ2V0RXh0cmFEZXNjcmlwdG9ySW5mbygpIHsKLQkJcmV0dXJuIHByZWZTdG9yZS5nZXRCb29sZWFuKEVYVFJBX0RFU0NSSVBUT1JfSU5GTyk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgZGVmYXVsdCBleHRyYSBkZXNjcmlwdG9yIGluZm8gcHJlZmVyZW5jZSB2YWx1ZS4KLQkgKiAKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiAgICAgICAgICAgIHRoZSBwcmVmZXJlbmNlIHZhbHVlCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldEV4dHJhRGVzY3JpcHRvckluZm8oYm9vbGVhbiB2YWx1ZSkgewotCQlwcmVmU3RvcmUuc2V0VmFsdWUoRVhUUkFfREVTQ1JJUFRPUl9JTkZPLCB2YWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgZXh0cmEgZGVzY3JpcHRvciBpbmZvIHByZWZlcmVuY2UgdmFsdWUuCi0JICogCi0JICogQHBhcmFtIGNvbmZpZ0lkCi0JICogICAgICAgICAgICBhIG1ldGhvZCBjb25maWd1cmF0aW9uIEdVSUQKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBwcmVmZXJlbmNlIGlzIHNldAotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBnZXRFeHRyYURlc2NyaXB0b3JJbmZvKFN0cmluZyBjb25maWdJZCkgewotCQlpZiAoZ2V0Q29uZmlnUHJlZkluaXRpYWxpemVkKGNvbmZpZ0lkKSkgewotCQkJcmV0dXJuIHByZWZTdG9yZS5nZXRCb29sZWFuKGdldENvbmZpZ1ByZWZQcmVmaXgoY29uZmlnSWQpCi0JCQkJCSsgRVhUUkFfREVTQ1JJUFRPUl9JTkZPKTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBwcmVmU3RvcmUuZ2V0Qm9vbGVhbihFWFRSQV9ERVNDUklQVE9SX0lORk8pOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgZXh0cmEgZGVzY3JpcHRvciBpbmZvIHByZWZlcmVuY2UgdmFsdWUuCi0JICogCi0JICogQHBhcmFtIGNvbmZpZ0lkCi0JICogICAgICAgICAgICBhIG1ldGhvZCBjb25maWd1cmF0aW9uIEdVSUQKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiAgICAgICAgICAgIHRoZSBwcmVmZXJlbmNlIHZhbHVlCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldEV4dHJhRGVzY3JpcHRvckluZm8oU3RyaW5nIGNvbmZpZ0lkLCBib29sZWFuIHZhbHVlKSB7Ci0JCXByZWZTdG9yZS5zZXRWYWx1ZShnZXRDb25maWdQcmVmUHJlZml4KGNvbmZpZ0lkKQotCQkJCSsgRVhUUkFfREVTQ1JJUFRPUl9JTkZPLCB2YWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgZXh0cmEgZGVzY3JpcHRvciBpbmZvIHByZWZlcmVuY2UgdG8gYmUgZGVmYXVsdCB2YWx1ZS4KLQkgKiAKLQkgKiBAcGFyYW0gY29uZmlnSWQKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24gR1VJRAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVFeHRyYURlc2NyaXB0b3JJbmZvKFN0cmluZyBjb25maWdJZCkgewotCQlwcmVmU3RvcmUuc2V0VG9EZWZhdWx0KGdldENvbmZpZ1ByZWZQcmVmaXgoY29uZmlnSWQpCi0JCQkJKyBFWFRSQV9ERVNDUklQVE9SX0lORk8pOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGRlZmF1bHQgcGF0aCBmb3IgYSBwdWJsaXNoZWQgd2ViIHNpdGUuCi0JICogCi0JICogQHJldHVybiB0aGUgZGVmYXVsdCBwYXRoIGZvciBhIHB1Ymxpc2hlZCB3ZWIgc2l0ZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXREZWZhdWx0UHVibGlzaFBhdGgoKSB7Ci0JCWlmIChkZWZhdWx0UHVibGlzaFBhdGggPT0gbnVsbCkgewotCQkJZGVmYXVsdFB1Ymxpc2hQYXRoID0gU3lzdGVtLmdldFByb3BlcnR5KCJ1c2VyLmhvbWUiKTsgLy8kTk9OLU5MUy0xJAotCQkJU3RyaW5nIGFwcE5hbWUgPSBMaWJyYXJ5VUlQcmVmZXJlbmNlcy5nZXRBcHBsaWNhdGlvblNob3J0TmFtZSgpOwotCQkJaWYgKGFwcE5hbWUgIT0gbnVsbCAmJiBhcHBOYW1lLmxlbmd0aCgpID4gMCkgewotCQkJCWRlZmF1bHRQdWJsaXNoUGF0aCA9IGRlZmF1bHRQdWJsaXNoUGF0aCArIEZpbGVVdGlsLkZJTEVfU0VQCi0JCQkJCQkrIGFwcE5hbWUgKyBGaWxlVXRpbC5GSUxFX1NFUAotCQkJCQkJKyBERUZBVUxUX1BVQkxJU0hfRk9MREVSX05BTUU7Ci0JCQl9IGVsc2UgewotCQkJCWRlZmF1bHRQdWJsaXNoUGF0aCA9IGRlZmF1bHRQdWJsaXNoUGF0aCArIEZpbGVVdGlsLkZJTEVfU0VQCi0JCQkJCQkrIERFRkFVTFRfUFVCTElTSF9GT0xERVJfTkFNRTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZGVmYXVsdFB1Ymxpc2hQYXRoOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHB1Ymxpc2ggcGF0aCBwcmVmZXJlbmNlIHZhbHVlLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHB1Ymxpc2ggcGF0aAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFB1Ymxpc2hQYXRoKCkgewotCQlyZXR1cm4gcHJlZlN0b3JlLmdldFN0cmluZyhQVUJMSVNIX1BBVEgpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHB1Ymxpc2ggcGF0aCBwcmVmZXJlbmNlIHZhbHVlLgotCSAqIAotCSAqIEBwYXJhbSBwYXRoCi0JICogICAgICAgICAgICB0aGUgcHVibGlzaCBwYXRoCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldFB1Ymxpc2hQYXRoKFN0cmluZyBwYXRoKSB7Ci0JCXByZWZTdG9yZS5zZXRWYWx1ZShQVUJMSVNIX1BBVEgsIHBhdGgpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHB1Ymxpc2ggcGF0aCBwcmVmZXJlbmNlIHZhbHVlLgotCSAqIAotCSAqIEBwYXJhbSBjb25maWdJZAotCSAqICAgICAgICAgICAgYSBtZXRob2QgY29uZmlndXJhdGlvbiBHVUlECi0JICogQHJldHVybiB0aGUgcHVibGlzaCBwYXRoCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UHVibGlzaFBhdGgoU3RyaW5nIGNvbmZpZ0lkKSB7Ci0JCWlmIChnZXRDb25maWdQcmVmSW5pdGlhbGl6ZWQoY29uZmlnSWQpKSB7Ci0JCQlyZXR1cm4gcHJlZlN0b3JlLmdldFN0cmluZyhnZXRDb25maWdQcmVmUHJlZml4KGNvbmZpZ0lkKQotCQkJCQkrIFBVQkxJU0hfUEFUSCk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gcHJlZlN0b3JlLmdldFN0cmluZyhQVUJMSVNIX1BBVEgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgcHVibGlzaCBwYXRoIHByZWZlcmVuY2UgdmFsdWUuCi0JICogCi0JICogQHBhcmFtIGNvbmZpZ0lkCi0JICogICAgICAgICAgICBhIG1ldGhvZCBjb25maWd1cmF0aW9uIEdVSUQKLQkgKiBAcGFyYW0gcGF0aAotCSAqICAgICAgICAgICAgdGhlIHB1Ymxpc2ggcGF0aAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRQdWJsaXNoUGF0aChTdHJpbmcgY29uZmlnSWQsIFN0cmluZyBwYXRoKSB7Ci0JCXByZWZTdG9yZS5zZXRWYWx1ZShnZXRDb25maWdQcmVmUHJlZml4KGNvbmZpZ0lkKSArIFBVQkxJU0hfUEFUSCwgcGF0aCk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgcHVibGlzaCBwYXRoIHByZWZlcmVuY2UgdG8gYmUgZGVmYXVsdCB2YWx1ZS4KLQkgKiAKLQkgKiBAcGFyYW0gY29uZmlnSWQKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24gR1VJRAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVQdWJsaXNoUGF0aChTdHJpbmcgY29uZmlnSWQpIHsKLQkJcHJlZlN0b3JlLnNldFRvRGVmYXVsdChnZXRDb25maWdQcmVmUHJlZml4KGNvbmZpZ0lkKSArIFBVQkxJU0hfUEFUSCk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgcHVibGlzaCBzdGF0aWMgd2ViIHNpdGUgcHJlZmVyZW5jZSB2YWx1ZS4KLQkgKiAKLQkgKiBAcGFyYW0gY29uZmlnSWQKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24gR1VJRAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHByZWZlcmVuY2UgaXMgc2V0Ci0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGdldFB1Ymxpc2hTdGF0aWNXZWJTaXRlKFN0cmluZyBjb25maWdJZCkgewotCQlpZiAoZ2V0Q29uZmlnUHJlZkluaXRpYWxpemVkKGNvbmZpZ0lkKSkgewotCQkJcmV0dXJuIHByZWZTdG9yZS5nZXRCb29sZWFuKGdldENvbmZpZ1ByZWZQcmVmaXgoY29uZmlnSWQpCi0JCQkJCSsgUFVCTElTSF9TVEFUSUNfV0VCX1NJVEUpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIHByZWZTdG9yZS5nZXRCb29sZWFuKFBVQkxJU0hfU1RBVElDX1dFQl9TSVRFKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHB1Ymxpc2ggc3RhdGljIHdlYiBzaXRlIHByZWZlcmVuY2UgdmFsdWUuCi0JICogCi0JICogQHBhcmFtIGNvbmZpZ0lkCi0JICogICAgICAgICAgICBhIG1ldGhvZCBjb25maWd1cmF0aW9uIEdVSUQKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiAgICAgICAgICAgIHRoZSBwcmVmZXJlbmNlIHZhbHVlCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldFB1Ymxpc2hTdGF0aWNXZWJTaXRlKFN0cmluZyBjb25maWdJZCwgYm9vbGVhbiB2YWx1ZSkgewotCQlwcmVmU3RvcmUuc2V0VmFsdWUoZ2V0Q29uZmlnUHJlZlByZWZpeChjb25maWdJZCkKLQkJCQkrIFBVQkxJU0hfU1RBVElDX1dFQl9TSVRFLCB2YWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgcHVibGlzaCBzdGF0aWMgd2ViIHNpdGUgcHJlZmVyZW5jZSB0byBiZSBkZWZhdWx0IHZhbHVlLgotCSAqIAotCSAqIEBwYXJhbSBjb25maWdJZAotCSAqICAgICAgICAgICAgYSBtZXRob2QgY29uZmlndXJhdGlvbiBHVUlECi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZVB1Ymxpc2hTdGF0aWNXZWJTaXRlKFN0cmluZyBjb25maWdJZCkgewotCQlwcmVmU3RvcmUuc2V0VG9EZWZhdWx0KGdldENvbmZpZ1ByZWZQcmVmaXgoY29uZmlnSWQpCi0JCQkJKyBQVUJMSVNIX1NUQVRJQ19XRUJfU0lURSk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgaW5jbHVkZSBhcHBsZXQgc2VhcmNoIHByZWZlcmVuY2UgdmFsdWUuCi0JICogCi0JICogQHBhcmFtIGNvbmZpZ0lkCi0JICogICAgICAgICAgICBhIG1ldGhvZCBjb25maWd1cmF0aW9uIEdVSUQKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBwcmVmZXJlbmNlIGlzIHNldAotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBnZXRJbmNsdWRlU2VydmxldFNlYXJjaChTdHJpbmcgY29uZmlnSWQpIHsKLQkJaWYgKGdldENvbmZpZ1ByZWZJbml0aWFsaXplZChjb25maWdJZCkpIHsKLQkJCXJldHVybiBwcmVmU3RvcmUuZ2V0Qm9vbGVhbihnZXRDb25maWdQcmVmUHJlZml4KGNvbmZpZ0lkKQotCQkJCQkrIElOQ0xVREVfU0VSVkxFVF9TRUFSQ0gpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIHByZWZTdG9yZS5nZXRCb29sZWFuKElOQ0xVREVfU0VSVkxFVF9TRUFSQ0gpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgaW5jbHVkZSBzZXJ2bGV0IHNlYXJjaCBwcmVmZXJlbmNlIHZhbHVlLi4KLQkgKiAKLQkgKiBAcGFyYW0gY29uZmlnSWQKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24gR1VJRAotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgdGhlIHByZWZlcmVuY2UgdmFsdWUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0SW5jbHVkZVNlcnZsZXRTZWFyY2goU3RyaW5nIGNvbmZpZ0lkLCBib29sZWFuIHZhbHVlKSB7Ci0JCXByZWZTdG9yZS5zZXRWYWx1ZShnZXRDb25maWdQcmVmUHJlZml4KGNvbmZpZ0lkKQotCQkJCSsgSU5DTFVERV9TRVJWTEVUX1NFQVJDSCwgdmFsdWUpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGluY2x1ZGUgc2VydmxldCBzZWFyY2ggcHJlZmVyZW5jZSB0byBiZSBkZWZhdWx0IHZhbHVlLi4KLQkgKiAKLQkgKiBAcGFyYW0gY29uZmlnSWQKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24gR1VJRAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVJbmNsdWRlU2VydmxldFNlYXJjaChTdHJpbmcgY29uZmlnSWQpIHsKLQkJcHJlZlN0b3JlLnNldFRvRGVmYXVsdChnZXRDb25maWdQcmVmUHJlZml4KGNvbmZpZ0lkKQotCQkJCSsgSU5DTFVERV9TRVJWTEVUX1NFQVJDSCk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgaW5jbHVkZSBzZWFyY2ggcHJlZmVyZW5jZSB2YWx1ZS4KLQkgKiAKLQkgKiBAcGFyYW0gY29uZmlnSWQKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24gR1VJRAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHByZWZlcmVuY2UgaXMgc2V0Ci0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGdldEluY2x1ZGVTZWFyY2goU3RyaW5nIGNvbmZpZ0lkKSB7Ci0JCWlmIChnZXRDb25maWdQcmVmSW5pdGlhbGl6ZWQoY29uZmlnSWQpKSB7Ci0JCQlyZXR1cm4gcHJlZlN0b3JlLmdldEJvb2xlYW4oZ2V0Q29uZmlnUHJlZlByZWZpeChjb25maWdJZCkKLQkJCQkJKyBJTkNMVURFX1NFQVJDSCk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gcHJlZlN0b3JlLmdldEJvb2xlYW4oSU5DTFVERV9TRUFSQ0gpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgaW5jbHVkZSBzZWFyY2ggcHJlZmVyZW5jZSB2YWx1ZS4KLQkgKiAKLQkgKiBAcGFyYW0gY29uZmlnSWQKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24gR1VJRAotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgdGhlIHByZWZlcmVuY2UgdmFsdWUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0SW5jbHVkZVNlYXJjaChTdHJpbmcgY29uZmlnSWQsIGJvb2xlYW4gdmFsdWUpIHsKLQkJcHJlZlN0b3JlLnNldFZhbHVlKGdldENvbmZpZ1ByZWZQcmVmaXgoY29uZmlnSWQpICsgSU5DTFVERV9TRUFSQ0gsCi0JCQkJdmFsdWUpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGluY2x1ZGUgc2VhcmNoIHByZWZlcmVuY2UgdG8gYmUgZGVmYXVsdCB2YWx1ZS4KLQkgKiAKLQkgKiBAcGFyYW0gY29uZmlnSWQKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24gR1VJRAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVJbmNsdWRlU2VhcmNoKFN0cmluZyBjb25maWdJZCkgewotCQlwcmVmU3RvcmUuc2V0VG9EZWZhdWx0KGdldENvbmZpZ1ByZWZQcmVmaXgoY29uZmlnSWQpICsgSU5DTFVERV9TRUFSQ0gpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHdlYiBhcHBsaWNhdGlvbiBuYW1lIHByZWZlcmVuY2UgdmFsdWUuCi0JICogCi0JICogQHBhcmFtIGNvbmZpZ0lkCi0JICogICAgICAgICAgICBhIG1ldGhvZCBjb25maWd1cmF0aW9uIEdVSUQKLQkgKiBAcmV0dXJuIHRoZSBwcmVmZXJlbmNlIHZhbHVlCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0V2ViQXBwTmFtZShTdHJpbmcgY29uZmlnSWQpIHsKLQkJaWYgKGdldENvbmZpZ1ByZWZJbml0aWFsaXplZChjb25maWdJZCkpIHsKLQkJCXJldHVybiBwcmVmU3RvcmUuZ2V0U3RyaW5nKGdldENvbmZpZ1ByZWZQcmVmaXgoY29uZmlnSWQpCi0JCQkJCSsgV0VCQVBQX05BTUUpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIHByZWZTdG9yZS5nZXRTdHJpbmcoV0VCQVBQX05BTUUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgd2ViIGFwcGxpY2F0aW9uIG5hbWUgcHJlZmVyZW5jZSB2YWx1ZS4KLQkgKiAKLQkgKiBAcGFyYW0gY29uZmlnSWQKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24gR1VJRAotCSAqIEBwYXJhbSBuYW1lCi0JICogICAgICAgICAgICB0aGUgd2ViIGFwcGxpY2F0aW9uIG5hbWUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0V2ViQXBwTmFtZShTdHJpbmcgY29uZmlnSWQsIFN0cmluZyBuYW1lKSB7Ci0JCXByZWZTdG9yZS5zZXRWYWx1ZShnZXRDb25maWdQcmVmUHJlZml4KGNvbmZpZ0lkKSArIFdFQkFQUF9OQU1FLCBuYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB3ZWIgYXBwbGljYXRpb24gbmFtZSBwcmVmZXJlbmNlIHRvIGJlIGRlZmF1bHQgdmFsdWUuCi0JICogCi0JICogQHBhcmFtIGNvbmZpZ0lkCi0JICogICAgICAgICAgICBhIG1ldGhvZCBjb25maWd1cmF0aW9uIEdVSUQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVtb3ZlV2ViQXBwTmFtZShTdHJpbmcgY29uZmlnSWQpIHsKLQkJcHJlZlN0b3JlLnNldFRvRGVmYXVsdChnZXRDb25maWdQcmVmUHJlZml4KGNvbmZpZ0lkKSArIFdFQkFQUF9OQU1FKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBtZXRob2QgY29uZmlndXJhdGlvbiBzcGVjaWZpYyBwcmVmZXJlbmNlIHByZWZpeC4KLQkgKiAKLQkgKiBAcGFyYW0gY29uZmlnSWQKLQkgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24KLQkgKiBAcmV0dXJuIGEgcHJlZmVyZW5jZSBwcmVmaXggYXNzaWduZWQgdG8gdGhlIGNvbmZpZ3VyYXRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRDb25maWdQcmVmUHJlZml4KFN0cmluZyBjb25maWdJZCkgewotCQlyZXR1cm4gY29uZmlnSWQgKyAiLiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBjb25maWd1cmF0aW9uIHNwZWNpZmljIHByZWZlcmVuY2VzIGluaXRpYWxpemVkIHByZWZlcmVuY2UgdmFsdWUuCi0JICogCi0JICogQHBhcmFtIGNvbmZpZ0lkCi0JICogICAgICAgICAgICBhIG1ldGhvZCBjb25maWd1cmF0aW9uIEdVSUQKLQkgKiBAcmV0dXJuIHRoZSBwcmVmZXJlbmNlIHZhbHVlCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGdldENvbmZpZ1ByZWZJbml0aWFsaXplZChTdHJpbmcgY29uZmlnSWQpIHsKLQkJcmV0dXJuIHByZWZTdG9yZQotCQkJCS5nZXRCb29sZWFuKGdldENvbmZpZ1ByZWZQcmVmaXgoY29uZmlnSWQpICsgSU5JVElBTElaRUQpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGNvbmZpZ3VyYXRpb24gc3BlY2lmaWMgcHJlZmVyZW5jZXMgaW5pdGlhbGl6ZWQgcHJlZmVyZW5jZSB2YWx1ZS4KLQkgKiAKLQkgKiBAcGFyYW0gY29uZmlnSWQKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24gR1VJRAotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgdGhlIHByZWZlcmVuY2UgdmFsdWUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0Q29uZmlnUHJlZkluaXRpYWxpemVkKFN0cmluZyBjb25maWdJZCwgYm9vbGVhbiB2YWx1ZSkgewotCQlwcmVmU3RvcmUuc2V0VmFsdWUoZ2V0Q29uZmlnUHJlZlByZWZpeChjb25maWdJZCkgKyBJTklUSUFMSVpFRCwgdmFsdWUpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGNvbmZpZ3VyYXRpb24gc3BlY2lmaWMgcHJlZmVyZW5jZXMgaW5pdGlhbGl6ZWQgcHJlZmVyZW5jZSB0byBiZQotCSAqIGRlZmF1bHQgdmFsdWUuCi0JICogCi0JICogQHBhcmFtIGNvbmZpZ0lkCi0JICogICAgICAgICAgICBhIG1ldGhvZCBjb25maWd1cmF0aW9uIEdVSUQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVtb3ZlQ29uZmlnUHJlZkluaXRpYWxpemVkKFN0cmluZyBjb25maWdJZCkgewotCQlwcmVmU3RvcmUuc2V0VG9EZWZhdWx0KGdldENvbmZpZ1ByZWZQcmVmaXgoY29uZmlnSWQpICsgSU5JVElBTElaRUQpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHNob3cgcmVsYXRlZCBkZXNjcmlwdG9ycyBpbiBjb250ZW50IHBhZ2UgcHJlZmVyZW5jZSB2YWx1ZS4KLQkgKiAKLQkgKiBAcGFyYW0gY29uZmlnSWQKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24gR1VJRAotCSAqIEByZXR1cm4gdGhlIHByZWZlcmVuY2UgdmFsdWUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gZ2V0U2hvd1JlbGF0ZWREZXNjcmlwdG9ycyhTdHJpbmcgY29uZmlnSWQpIHsKLQkJcmV0dXJuIHByZWZTdG9yZS5nZXRCb29sZWFuKGdldENvbmZpZ1ByZWZQcmVmaXgoY29uZmlnSWQpCi0JCQkJKyBTSE9XX1JFTEFURURfREVTQ1JJUFRPUlMpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHNob3cgcmVsYXRlZCBkZXNjcmlwdG9ycyBpbiBjb250ZW50IHBhZ2UgcHJlZmVyZW5jZSB2YWx1ZS4KLQkgKiAKLQkgKiBAcGFyYW0gY29uZmlnSWQKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24gR1VJRAotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgdGhlIHByZWZlcmVuY2UgdmFsdWUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0U2hvd1JlbGF0ZWREZXNjcmlwdG9ycyhTdHJpbmcgY29uZmlnSWQsIGJvb2xlYW4gdmFsdWUpIHsKLQkJcHJlZlN0b3JlLnNldFZhbHVlKGdldENvbmZpZ1ByZWZQcmVmaXgoY29uZmlnSWQpCi0JCQkJKyBTSE9XX1JFTEFURURfREVTQ1JJUFRPUlMsIHZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBzaG93IHJlbGF0ZWQgZGVzY3JpcHRvcnMgaW4gY29udGVudCBwYWdlIHByZWZlcmVuY2UgdG8gYmUKLQkgKiBkZWZhdWx0IHZhbHVlLgotCSAqIAotCSAqIEBwYXJhbSBjb25maWdJZAotCSAqICAgICAgICAgICAgYSBtZXRob2QgY29uZmlndXJhdGlvbiBHVUlECi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZVNob3dSZWxhdGVkRGVzY3JpcHRvcnMoU3RyaW5nIGNvbmZpZ0lkKSB7Ci0JCXByZWZTdG9yZS5zZXRUb0RlZmF1bHQoZ2V0Q29uZmlnUHJlZlByZWZpeChjb25maWdJZCkKLQkJCQkrIFNIT1dfUkVMQVRFRF9ERVNDUklQVE9SUyk7Ci0JfQotCQotCS8qKgotCSAqIEdldHMgdGhlIHNob3cgcmVsYXRlZCBkZXNjcmlwdG9ycyBvcHRpb24gaW4gY29udGVudCBwYWdlIHByZWZlcmVuY2UgdmFsdWUuCi0JICogCi0JICogQHBhcmFtIGNvbmZpZ0lkCi0JICogICAgICAgICAgICBhIG1ldGhvZCBjb25maWd1cmF0aW9uIEdVSUQKLQkgKiBAcmV0dXJuIHRoZSBwcmVmZXJlbmNlIHZhbHVlCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGdldFNob3dSZWxhdGVkRGVzY3JpcHRvcnNPcHRpb24oU3RyaW5nIGNvbmZpZ0lkKSB7Ci0JCXJldHVybiBwcmVmU3RvcmUuZ2V0Qm9vbGVhbihnZXRDb25maWdQcmVmUHJlZml4KGNvbmZpZ0lkKQotCQkJCSsgU0hPV19SRUxBVEVEX0RFU0NSSVBUT1JTX09QVElPTik7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgc2hvdyByZWxhdGVkIGRlc2NyaXB0b3JzIG9wdGlvbiBpbiBjb250ZW50IHBhZ2UgcHJlZmVyZW5jZSB2YWx1ZS4KLQkgKiAKLQkgKiBAcGFyYW0gY29uZmlnSWQKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24gR1VJRAotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgdGhlIHByZWZlcmVuY2UgdmFsdWUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0U2hvd1JlbGF0ZWREZXNjcmlwdG9yc09wdGlvbihTdHJpbmcgY29uZmlnSWQsIGJvb2xlYW4gdmFsdWUpIHsKLQkJcHJlZlN0b3JlLnNldFZhbHVlKGdldENvbmZpZ1ByZWZQcmVmaXgoY29uZmlnSWQpCi0JCQkJKyBTSE9XX1JFTEFURURfREVTQ1JJUFRPUlNfT1BUSU9OLCB2YWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgc2hvdyByZWxhdGVkIGRlc2NyaXB0b3JzIG9wdGlvbiBpbiBjb250ZW50IHBhZ2UgcHJlZmVyZW5jZSB0byBiZQotCSAqIGRlZmF1bHQgdmFsdWUuCi0JICogCi0JICogQHBhcmFtIGNvbmZpZ0lkCi0JICogICAgICAgICAgICBhIG1ldGhvZCBjb25maWd1cmF0aW9uIEdVSUQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVtb3ZlU2hvd1JlbGF0ZWREZXNjcmlwdG9yc09wdGlvbihTdHJpbmcgY29uZmlnSWQpIHsKLQkJcHJlZlN0b3JlLnNldFRvRGVmYXVsdChnZXRDb25maWdQcmVmUHJlZml4KGNvbmZpZ0lkKQotCQkJCSsgU0hPV19SRUxBVEVEX0RFU0NSSVBUT1JTX09QVElPTik7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgc2hvdyBkZXNjcmlwdG9ycyBpbiBuYXZpZ2F0aW9uIHRyZWUgcHJlZmVyZW5jZSB2YWx1ZS4KLQkgKiAKLQkgKiBAcGFyYW0gY29uZmlnSWQKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24gR1VJRAotCSAqIEByZXR1cm4gdGhlIHByZWZlcmVuY2UgdmFsdWUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gZ2V0U2hvd0Rlc2NyaXB0b3JzSW5OYXZpZ2F0aW9uVHJlZShTdHJpbmcgY29uZmlnSWQpIHsKLQkJcmV0dXJuIHByZWZTdG9yZS5nZXRCb29sZWFuKGdldENvbmZpZ1ByZWZQcmVmaXgoY29uZmlnSWQpCi0JCQkJKyBTSE9XX0RFU0NSSVBUT1JTX0lOX05BVklHQVRJT05UUkVFKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBzaG93IGRlc2NyaXB0b3JzIGluIG5hdmlnYXRpb24gdHJlZSBwcmVmZXJlbmNlIHZhbHVlLgotCSAqIAotCSAqIEBwYXJhbSBjb25maWdJZAotCSAqICAgICAgICAgICAgYSBtZXRob2QgY29uZmlndXJhdGlvbiBHVUlECi0JICogQHBhcmFtIHZhbHVlCi0JICogICAgICAgICAgICB0aGUgcHJlZmVyZW5jZSB2YWx1ZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRTaG93RGVzY3JpcHRvcnNJbk5hdmlnYXRpb25UcmVlKFN0cmluZyBjb25maWdJZCwKLQkJCWJvb2xlYW4gdmFsdWUpIHsKLQkJcHJlZlN0b3JlLnNldFZhbHVlKGdldENvbmZpZ1ByZWZQcmVmaXgoY29uZmlnSWQpCi0JCQkJKyBTSE9XX0RFU0NSSVBUT1JTX0lOX05BVklHQVRJT05UUkVFLCB2YWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgc2hvdyBkZXNjcmlwdG9ycyBpbiBuYXZpZ2F0aW9uIHRyZWUgcHJlZmVyZW5jZSB0byBiZSBkZWZhdWx0Ci0JICogdmFsdWUuCi0JICogCi0JICogQHBhcmFtIGNvbmZpZ0lkCi0JICogICAgICAgICAgICBhIG1ldGhvZCBjb25maWd1cmF0aW9uIEdVSUQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVtb3ZlU2hvd0Rlc2NyaXB0b3JzSW5OYXZpZ2F0aW9uVHJlZShTdHJpbmcgY29uZmlnSWQpIHsKLQkJcHJlZlN0b3JlLnNldFRvRGVmYXVsdChnZXRDb25maWdQcmVmUHJlZml4KGNvbmZpZ0lkKQotCQkJCSsgU0hPV19ERVNDUklQVE9SU19JTl9OQVZJR0FUSU9OVFJFRSk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgZGVmYXVsdCBhY3Rpdml0eSB0YWIgcHJlZmVyZW5jZSB2YWx1ZS4KLQkgKiAKLQkgKiBAcGFyYW0gY29uZmlnSWQKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24gR1VJRAotCSAqIEByZXR1cm4gdGhlIGRlZmF1bHQgYWN0aXZpdHkgdGFiIG5hbWUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXREZWZhdWx0QWN0aXZpdHlUYWIoU3RyaW5nIGNvbmZpZ0lkKSB7Ci0JCWlmIChnZXRDb25maWdQcmVmSW5pdGlhbGl6ZWQoY29uZmlnSWQpKSB7Ci0JCQlyZXR1cm4gcHJlZlN0b3JlLmdldFN0cmluZyhnZXRDb25maWdQcmVmUHJlZml4KGNvbmZpZ0lkKQotCQkJCQkrIERFRkFVTFRfQUNUSVZJVFlfVEFCKTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBwcmVmU3RvcmUuZ2V0U3RyaW5nKERFRkFVTFRfQUNUSVZJVFlfVEFCKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGRlZmF1bHQgYWN0aXZpdHkgdGFiIHByZWZlcmVuY2UgdmFsdWUuCi0JICogCi0JICogQHBhcmFtIGNvbmZpZ0lkCi0JICogICAgICAgICAgICBhIG1ldGhvZCBjb25maWd1cmF0aW9uIEdVSUQKLQkgKiBAcGFyYW0gdGFiTmFtZQotCSAqICAgICAgICAgICAgdGhlIGRlZmF1bHQgYWN0aXZpdHkgdGFiIG5hbWUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0RGVmYXVsdEFjdGl2aXR5VGFiKFN0cmluZyBjb25maWdJZCwgU3RyaW5nIHRhYk5hbWUpIHsKLQkJcHJlZlN0b3JlLnNldFZhbHVlKAotCQkJCWdldENvbmZpZ1ByZWZQcmVmaXgoY29uZmlnSWQpICsgREVGQVVMVF9BQ1RJVklUWV9UQUIsIHRhYk5hbWUpOwotCX0KLQotCS8qKgotCSAqIFNhdmVzIGFsbCB0aGUgcHJlZmVyZW5jZXMuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNhdmVBbGxQcmVmZXJlbmNlcygpIHsKLQkJUHVibGlzaGluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5zYXZlUGx1Z2luUHJlZmVyZW5jZXMoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy91aS9wcmVmZXJlbmNlcy9Sb2xlRGlhZ3JhbVByZWZlcmVuY2VQYWdlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvdWkvcHJlZmVyZW5jZXMvUm9sZURpYWdyYW1QcmVmZXJlbmNlUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDhlNDQzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy91aS9wcmVmZXJlbmNlcy9Sb2xlRGlhZ3JhbVByZWZlcmVuY2VQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkucHJlZmVyZW5jZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLlN0clV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucHJlZmVyZW5jZXMuTGlicmFyeVByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLlB1Ymxpc2hpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudWkucHJlZmVyZW5jZXMuQmFzZVByZWZlcmVuY2VQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotCi0vKioKLSAqIFRoZSBQdWJsaXNoaW5nIHByZWZlcmVuY2UgcGFnZS4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKiAKLSAqIEJ1Z3MgZml4ZWQ6Ci0gKiA8dWw+Ci0gKiA8bGk+aHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE1Njk1NzwvbGk+Ci0gKiA8L3VsPgotICovCi1wdWJsaWMgY2xhc3MgUm9sZURpYWdyYW1QcmVmZXJlbmNlUGFnZSBleHRlbmRzIEJhc2VQcmVmZXJlbmNlUGFnZSBpbXBsZW1lbnRzCi0JCU1vZGlmeUxpc3RlbmVyIHsKLQotCXByaXZhdGUgc3RhdGljIGludCBNSU5fSE9SSVpPTlRBTF9TUEFDSU5HID0gNTA7Ci0KLQlwcml2YXRlIHN0YXRpYyBpbnQgTUFYX0hPUklaT05UQUxfU1BBQ0lORyA9IDIwMDsKLQotCXByaXZhdGUgc3RhdGljIGludCBNSU5fVkVSVElDQUxfU1BBQ0lORyA9IDI1OwotCi0JcHJpdmF0ZSBzdGF0aWMgaW50IE1BWF9WRVJUSUNBTF9TUEFDSU5HID0gMTAwOwotCi0JcHJpdmF0ZSBzdGF0aWMgaW50IE1JTl9URVhUX0xJTkVTID0gMTsKLQotCXByaXZhdGUgc3RhdGljIGludCBNQVhfVEVYVF9MSU5FUyA9IDU7Ci0KLQlwcml2YXRlIENvbXBvc2l0ZSBjb21wb3NpdGU7Ci0KLQlwcml2YXRlIFRleHQgaG9yaXpvbmFsU3BhY2luZ1RleHQ7Ci0KLQlwcml2YXRlIFRleHQgdmVydGljYWxTcGFjaW5nVGV4dDsKLQotCXByaXZhdGUgVGV4dCB0ZXh0TGluZXNUZXh0OwotCi0JLyoqCi0JICogQ3JlYXRlcyBhbmQgcmV0dXJucyB0aGUgU1dUIGNvbnRyb2wgZm9yIHRoZSBjdXN0b21pemVkIGJvZHkgb2YgdGhpcwotCSAqIHByZWZlcmVuY2UgcGFnZSB1bmRlciB0aGUgZ2l2ZW4gcGFyZW50IGNvbXBvc2l0ZS4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IGNvbXBvc2l0ZQotCSAqIEByZXR1cm4gdGhlIG5ldyBjb250cm9sCi0JICovCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkgewotCQljb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDEsIGZhbHNlKSk7Ci0KLQkJLy8gQ3JlYXRlIFNwYWNpbmcgYmV0d2VlbiB0YXNrIGFuZCB3b3JrIHByb2R1Y3QgZWxlbWVudHMgZ3JvdXAuCi0JCUdyb3VwIGVsZW1lbnRTcGFjaW5nR3JvdXAgPSBjcmVhdGVHcmlkTGF5b3V0R3JvdXAoY29tcG9zaXRlLAotCQkJCVB1Ymxpc2hpbmdVSVJlc291cmNlcy5lbGVtZW50U3BhY2luZ0dyb3VwX3RleHQsIDIpOwotCi0JCWNyZWF0ZUxhYmVsKGVsZW1lbnRTcGFjaW5nR3JvdXAsCi0JCQkJUHVibGlzaGluZ1VJUmVzb3VyY2VzLnRhc2tzSG9yaXpvbmFsU3BhY2luZ0xhYmVsX3RleHQpOwotCQlob3Jpem9uYWxTcGFjaW5nVGV4dCA9IGNyZWF0ZUVkaXRhYmxlVGV4dChlbGVtZW50U3BhY2luZ0dyb3VwLCAiIiwgMjUpOyAvLyROT04tTkxTLTEkCi0KLQkJY3JlYXRlTGFiZWwoZWxlbWVudFNwYWNpbmdHcm91cCwKLQkJCQlQdWJsaXNoaW5nVUlSZXNvdXJjZXMudGFza3NWZXJ0aWNhbFNwYWNpbmdMYWJlbF90ZXh0KTsKLQkJdmVydGljYWxTcGFjaW5nVGV4dCA9IGNyZWF0ZUVkaXRhYmxlVGV4dChlbGVtZW50U3BhY2luZ0dyb3VwLCAiIiwgMjUpOyAvLyROT04tTkxTLTEkCi0KLQkJLy8gQ3JlYXRlIEVsZW1lbnQgdGV4dCBsYWJlbCBncm91cC4KLQkJR3JvdXAgZWxlbWVudFRleHRMYWJlbEdyb3VwID0gY3JlYXRlR3JpZExheW91dEdyb3VwKGNvbXBvc2l0ZSwKLQkJCQlQdWJsaXNoaW5nVUlSZXNvdXJjZXMuZWxlbWVudFRleHRMYWJlbEdyb3VwX3RleHQsIDIpOwotCi0JCWNyZWF0ZUxhYmVsKGVsZW1lbnRUZXh0TGFiZWxHcm91cCwKLQkJCQlQdWJsaXNoaW5nVUlSZXNvdXJjZXMubWF4TGluZU9mVGV4dExhYmVsX3RleHQpOwotCQl0ZXh0TGluZXNUZXh0ID0gY3JlYXRlRWRpdGFibGVUZXh0KGVsZW1lbnRUZXh0TGFiZWxHcm91cCwgIiIsIDE1KTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRDb250cm9scygpOwotCi0JCWFkZExpc3RlbmVycygpOwotCi0JCXJldHVybiBjb21wb3NpdGU7Ci0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZXMgdGhlIHByZWZlcmVuY2UgcGFnZSBjb250cm9scyB3aXRoIGRhdGEuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdENvbnRyb2xzKCkgewotCQlob3Jpem9uYWxTcGFjaW5nVGV4dC5zZXRUZXh0KFN0cmluZy52YWx1ZU9mKExpYnJhcnlQcmVmZXJlbmNlcwotCQkJCS5nZXRSb2xlRGlhZ3JhbUhvcml6b250YWxTcGFjaW5nKCkpKTsKLQkJdmVydGljYWxTcGFjaW5nVGV4dC5zZXRUZXh0KFN0cmluZy52YWx1ZU9mKExpYnJhcnlQcmVmZXJlbmNlcwotCQkJCS5nZXRSb2xlRGlhZ3JhbVZlcnRpY2FsU3BhY2luZygpKSk7Ci0JCXRleHRMaW5lc1RleHQuc2V0VGV4dChTdHJpbmcudmFsdWVPZihMaWJyYXJ5UHJlZmVyZW5jZXMKLQkJCQkuZ2V0Um9sZURpYWdyYW1NYXhpbXVtVGV4dExpbmVzKCkpKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIGV2ZW50IGxpc3RlbmVycyB0byB0aGUgcHJlZmVyZW5jZSBwYWdlIGNvbnRyb2xzLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZExpc3RlbmVycygpIHsKLQkJaG9yaXpvbmFsU3BhY2luZ1RleHQuYWRkTW9kaWZ5TGlzdGVuZXIodGhpcyk7Ci0JCXZlcnRpY2FsU3BhY2luZ1RleHQuYWRkTW9kaWZ5TGlzdGVuZXIodGhpcyk7Ci0JCXRleHRMaW5lc1RleHQuYWRkTW9kaWZ5TGlzdGVuZXIodGhpcyk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyI21vZGlmeVRleHQoTW9kaWZ5RXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0JCXNldEVycm9yTWVzc2FnZShudWxsKTsKLQkJc2V0VmFsaWQodHJ1ZSk7Ci0KLQkJaW50IHZhbHVlID0gMDsKLQkJaWYgKGUud2lkZ2V0ID09IGhvcml6b25hbFNwYWNpbmdUZXh0KSB7Ci0JCQl2YWx1ZSA9IGdldEhvcml6b250YWxTcGFjaW5nKCk7Ci0JCQlpZiAodmFsdWUgPCBNSU5fSE9SSVpPTlRBTF9TUEFDSU5HCi0JCQkJCXx8IHZhbHVlID4gTUFYX0hPUklaT05UQUxfU1BBQ0lORykgewotCQkJCXNldEVycm9yTWVzc2FnZShQdWJsaXNoaW5nVUlSZXNvdXJjZXMuYmluZCgKLQkJCQkJCVB1Ymxpc2hpbmdVSVJlc291cmNlcy5pbnZhbGlkSG9yaXpvbmFsU3BhY2luZ0Vycm9yX21zZywKLQkJCQkJCW5ldyBPYmplY3RbXSB7IG5ldyBJbnRlZ2VyKE1JTl9IT1JJWk9OVEFMX1NQQUNJTkcpLAotCQkJCQkJCQluZXcgSW50ZWdlcihNQVhfSE9SSVpPTlRBTF9TUEFDSU5HKSB9KSk7Ci0JCQkJc2V0VmFsaWQoZmFsc2UpOwotCQkJfQotCQl9IGVsc2UgaWYgKGUud2lkZ2V0ID09IHZlcnRpY2FsU3BhY2luZ1RleHQpIHsKLQkJCXZhbHVlID0gZ2V0VmVydGljYWxTcGFjaW5nKCk7Ci0JCQlpZiAodmFsdWUgPCBNSU5fVkVSVElDQUxfU1BBQ0lORyB8fCB2YWx1ZSA+IE1BWF9WRVJUSUNBTF9TUEFDSU5HKSB7Ci0JCQkJc2V0RXJyb3JNZXNzYWdlKFB1Ymxpc2hpbmdVSVJlc291cmNlcy5iaW5kKAotCQkJCQkJUHVibGlzaGluZ1VJUmVzb3VyY2VzLmludmFsaWRWZXJ0aWNhbFNwYWNpbmdFcnJvcl9tc2csCi0JCQkJCQluZXcgT2JqZWN0W10geyBuZXcgSW50ZWdlcihNSU5fVkVSVElDQUxfU1BBQ0lORyksCi0JCQkJCQkJCW5ldyBJbnRlZ2VyKE1BWF9WRVJUSUNBTF9TUEFDSU5HKSB9KSk7Ci0JCQkJc2V0VmFsaWQoZmFsc2UpOwotCQkJfQotCQl9IGVsc2UgaWYgKGUud2lkZ2V0ID09IHRleHRMaW5lc1RleHQpIHsKLQkJCXZhbHVlID0gZ2V0TWF4aW11bVRleHRMaW5lcygpOwotCQkJaWYgKHZhbHVlIDwgTUlOX1RFWFRfTElORVMgfHwgdmFsdWUgPiBNQVhfVEVYVF9MSU5FUykgewotCQkJCXNldEVycm9yTWVzc2FnZShQdWJsaXNoaW5nVUlSZXNvdXJjZXMuYmluZCgKLQkJCQkJCVB1Ymxpc2hpbmdVSVJlc291cmNlcy5pbnZhbGlkVGV4dExpbmVzRXJyb3JfbXNnLAotCQkJCQkJbmV3IE9iamVjdFtdIHsgbmV3IEludGVnZXIoTUlOX1RFWFRfTElORVMpLAotCQkJCQkJCQluZXcgSW50ZWdlcihNQVhfVEVYVF9MSU5FUykgfSkpOwotCQkJCXNldFZhbGlkKGZhbHNlKTsKLQkJCX0KLQkJfQotCi0JCXVwZGF0ZUFwcGx5QnV0dG9uKCk7Ci0JfQotCi0JLyoqCi0JICogUGVyZm9ybXMgc3BlY2lhbCBwcm9jZXNzaW5nIHdoZW4gdGhpcyBwYWdlJ3MgRGVmYXVsdHMgYnV0dG9uIGhhcyBiZWVuCi0JICogcHJlc3NlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGVmYXVsdHMoKSB7Ci0JCXN1cGVyLnBlcmZvcm1EZWZhdWx0cygpOwotCQlob3Jpem9uYWxTcGFjaW5nVGV4dC5zZXRUZXh0KCIiIC8vJE5PTi1OTFMtMSQKLQkJCQkrIExpYnJhcnlQcmVmZXJlbmNlcy5nZXREZWZhdWx0Um9sZURpYWdyYW1Ib3Jpem9udGFsU3BhY2luZygpKTsKLQkJdmVydGljYWxTcGFjaW5nVGV4dC5zZXRUZXh0KCIiIC8vJE5PTi1OTFMtMSQKLQkJCQkrIExpYnJhcnlQcmVmZXJlbmNlcy5nZXREZWZhdWx0Um9sZURpYWdyYW1WZXJ0aWNhbFNwYWNpbmcoKSk7Ci0JCXRleHRMaW5lc1RleHQuc2V0VGV4dCgiIiAvLyROT04tTkxTLTEkCi0JCQkJKyBMaWJyYXJ5UHJlZmVyZW5jZXMuZ2V0RGVmYXVsdFJvbGVEaWFncmFtTWF4aW11bVRleHRMaW5lcygpKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZVBhZ2UjcGVyZm9ybU9rKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtT2soKSB7Ci0JCUxpYnJhcnlQcmVmZXJlbmNlcwotCQkJCS5zZXRSb2xlRGlhZ3JhbUhvcml6b250YWxTcGFjaW5nKGdldEhvcml6b250YWxTcGFjaW5nKCkpOwotCQlMaWJyYXJ5UHJlZmVyZW5jZXMuc2V0Um9sZURpYWdyYW1WZXJ0aWNhbFNwYWNpbmcoZ2V0VmVydGljYWxTcGFjaW5nKCkpOwotCQlMaWJyYXJ5UHJlZmVyZW5jZXMKLQkJCQkuc2V0Um9sZURpYWdyYW1NYXhpbXVtVGV4dExpbmVzKGdldE1heGltdW1UZXh0TGluZXMoKSk7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHVzZXIgc3BlY2lmaWVkIGhvcml6b250YWwgc3BhY2luZyBiZXR3ZWVuIHRhc2tzIGFuZCByb2xlcy4KLQkgKi8KLQlwcm90ZWN0ZWQgaW50IGdldEhvcml6b250YWxTcGFjaW5nKCkgewotCQlyZXR1cm4gU3RyVXRpbC5nZXRJbnRWYWx1ZShob3Jpem9uYWxTcGFjaW5nVGV4dC5nZXRUZXh0KCkudHJpbSgpLCAwKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSB1c2VyIHNwZWNpZmllZCB2ZXJ0aWNhbCBzcGFjaW5nIGJldHdlZW4gdGFza3MgYW5kIHJvbGVzLgotCSAqLwotCXByb3RlY3RlZCBpbnQgZ2V0VmVydGljYWxTcGFjaW5nKCkgewotCQlyZXR1cm4gU3RyVXRpbC5nZXRJbnRWYWx1ZSh2ZXJ0aWNhbFNwYWNpbmdUZXh0LmdldFRleHQoKS50cmltKCksIDApOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHVzZXIgc3BlY2lmaWVkIGVsZW1lbnQgbGFiZWwgdGV4dCBsaW5lcy4KLQkgKi8KLQlwcm90ZWN0ZWQgaW50IGdldE1heGltdW1UZXh0TGluZXMoKSB7Ci0JCXJldHVybiBTdHJVdGlsLmdldEludFZhbHVlKHRleHRMaW5lc1RleHQuZ2V0VGV4dCgpLnRyaW0oKSwgMCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvdWkvcHJlZmVyZW5jZXMvU3VwcG9ydGluZ1BsdWdpblByZWZlcmVuY2VQYWdlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvdWkvcHJlZmVyZW5jZXMvU3VwcG9ydGluZ1BsdWdpblByZWZlcmVuY2VQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhYTlhOTguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3VpL3ByZWZlcmVuY2VzL1N1cHBvcnRpbmdQbHVnaW5QcmVmZXJlbmNlUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA4IElCTSBDb3Jwb3JhdGlvbi4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkucHJlZmVyZW5jZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udWkuUHJlZmVyZW5jZVN0b3JlV3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5MaWJyYXJ5VUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkucHJlZmVyZW5jZXMuTGlicmFyeVVJUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVpLnByZWZlcmVuY2VzLkJhc2VQcmVmZXJlbmNlUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFByZWZlcmVuY2VQYWdlOwotCi0vKioKLSAqIFRoZSBzdXBwb3JpdGluZyBwbHVnaW5zIFByZWZlcmVuY2UgcGFnZQotICogCi0gKiBAYXV0aG9yIFdlaXBpbmcgTHUKLSAqIEBzaW5jZSA3LjUKLSAqLwotcHVibGljIGNsYXNzIFN1cHBvcnRpbmdQbHVnaW5QcmVmZXJlbmNlUGFnZSBleHRlbmRzIEJhc2VQcmVmZXJlbmNlUGFnZQotCQlpbXBsZW1lbnRzIElXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZSwgU2VsZWN0aW9uTGlzdGVuZXIgewotCi0JcHJpdmF0ZSBCdXR0b24gaW5jbHVkZURlc2NyaXB0b3JCdXR0b247Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgU3VwcG9ydGluZ1BsdWdpblByZWZlcmVuY2VQYWdlKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlUGFnZSNjcmVhdGVDb250ZW50cyhvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCi0JICovCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0KLQkJR3JvdXAgbGF5b3V0R3JvdXAgPSBjcmVhdGVHcmlkTGF5b3V0R3JvdXAoY29tcG9zaXRlLAotCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLnByZWZlcmVuY2VfRGVzY3JpcHRvcnMsIDEpOwotCQlsYXlvdXRHcm91cC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JCWxheW91dEdyb3VwLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCi0JCWluY2x1ZGVEZXNjcmlwdG9yQnV0dG9uID0gY3JlYXRlQ2hlY2tib3goCi0JCQkJbGF5b3V0R3JvdXAsCi0JCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMucHJlZmVyZW5jZV9pbmNsdWRlRGVzY3JpcHRvckJ1dHRvbl90ZXh0LCAxKTsKLQotCQkvLyBJbml0aWFsaXplIHZhbHVlcwotCQlpbml0aWFsaXplVmFsdWVzKCk7Ci0KLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51aS5wcmVmZXJlbmNlcy5CYXNlUHJlZmVyZW5jZVBhZ2UjaW5pdChvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoKQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaCB3b3JrYmVuY2gpIHsKLQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lciN3aWRnZXRTZWxlY3RlZChvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lciN3aWRnZXREZWZhdWx0U2VsZWN0ZWQob3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlUGFnZSNwZXJmb3JtRGVmYXVsdHMoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EZWZhdWx0cygpIHsKLQkJc3VwZXIucGVyZm9ybURlZmF1bHRzKCk7Ci0JCWluY2x1ZGVEZXNjcmlwdG9yQnV0dG9uLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VQYWdlI3BlcmZvcm1PaygpCi0JICovCi0JcHVibGljIGJvb2xlYW4gcGVyZm9ybU9rKCkgewotCQlMaWJyYXJ5VUlQcmVmZXJlbmNlcy5zZXRJbmNsdWRlRGVzY3JpcHRvcnMoZ2V0SW5jbHVkZURlc2NyaXB0b3JzKCkpOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gZ2V0SW5jbHVkZURlc2NyaXB0b3JzKCkgewotCQlyZXR1cm4gaW5jbHVkZURlc2NyaXB0b3JCdXR0b24uZ2V0U2VsZWN0aW9uKCk7Ci0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZXMgc3RhdGVzIG9mIHRoZSBjb250cm9scyBmcm9tIHRoZSBwcmVmZXJlbmNlIHN0b3JlLgotCSAqLwotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplVmFsdWVzKCkgewotCQlpbmNsdWRlRGVzY3JpcHRvckJ1dHRvbi5zZXRTZWxlY3Rpb24oTGlicmFyeVVJUHJlZmVyZW5jZXMuZ2V0SW5jbHVkZURlc2NyaXB0b3JzKCkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlUGFnZSNkb0dldFByZWZlcmVuY2VTdG9yZSgpCi0JICovCi0JcHJvdGVjdGVkIElQcmVmZXJlbmNlU3RvcmUgZG9HZXRQcmVmZXJlbmNlU3RvcmUoKSB7Ci0JCUlQcmVmZXJlbmNlU3RvcmUgd3JhcHBlciA9IExpYnJhcnlVSVBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCQkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0KLQkJaWYgKHdyYXBwZXIgaW5zdGFuY2VvZiBQcmVmZXJlbmNlU3RvcmVXcmFwcGVyKSB7Ci0JCQlyZXR1cm4gKChQcmVmZXJlbmNlU3RvcmVXcmFwcGVyKSB3cmFwcGVyKS5nZXRTdG9yZSgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3VpL3ByZWZlcmVuY2VzL3BhY2thZ2UuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy91aS9wcmVmZXJlbmNlcy9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyNThjMjEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3VpL3ByZWZlcmVuY2VzL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIHByZWZlcmVuY2Ugc3VwcG9ydCBmb3IgdGhlIHB1Ymxpc2hpbmcgVUkuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3VpL3dpemFyZHMvQWJzdHJhY3RQdWJsaXNoV2l6YXJkLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvdWkvd2l6YXJkcy9BYnN0cmFjdFB1Ymxpc2hXaXphcmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzhmNzljNS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvdWkvd2l6YXJkcy9BYnN0cmFjdFB1Ymxpc2hXaXphcmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLndpemFyZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5zZXJ2aWNlcy5QdWJsaXNoT3B0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSU5ld1dpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotCi0vKioKLSAqIEFic3RyYWN0IHB1Ymxpc2hpbmcgd2l6YXJkIGNsYXNzLiAKLSAqIHVzZSB0aGUgb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkucHVibGlzaGVycyBleHRlbnNpb24gcG9pbnQgdG8gZXh0ZW5kIHRoaXMgY2xhc3MgCi0gKiBpZiB5b3UgbmVlZCB0byBjdXN0b21pemUgdGhlIHB1Ymxpc2hpbmcgdWkuCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RQdWJsaXNoV2l6YXJkIGV4dGVuZHMgV2l6YXJkIGltcGxlbWVudHMgSU5ld1dpemFyZCB7Ci0KLQkvLyBUaGUgcHVibGlzaGluZyBvcHRpb25zLgotCXByb3RlY3RlZCBQdWJsaXNoT3B0aW9ucyBkYXRhTW9kZWwgPSBudWxsOwotCi0JLyoqCi0JICogY29uc3RydWN0b3IKLQkgKgotCSAqLwotCXB1YmxpYyBBYnN0cmFjdFB1Ymxpc2hXaXphcmQoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCS8qKgotCSAqIGZpbmlzaCB0aGUgd2l6YXJkCi0JICogCi0JICogQHJldHVybiBib29sZWFuIHJldHVybiB0cnVlIGlmIHN1Y2Nlc3NmdWwKLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBwZXJmb3JtRmluaXNoKCk7Ci0KLQkvKioKLQkgKiBpbml0aWFsaXplIHRoZSB3aXphcmQuCi0JICogCi0JICogQHBhcmFtIHdvcmtiZW5jaCBJV29ya2JlbmNoCi0JICogQHBhcmFtIHNlbGVjdGlvbiBJU3RydWN0dXJlZFNlbGVjdGlvbgotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCB2b2lkIGluaXQoSVdvcmtiZW5jaCB3b3JrYmVuY2gsIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbik7Ci0JCi0JLyoqCi0JICogZ2V0IHRoZSBwdWJsaXNoIG9wdGlvbnMKLQkgKiAKLQkgKiBAcmV0dXJuIFB1Ymxpc2hPcHRpb25zCi0JICovCi0JcHVibGljIGFic3RyYWN0IFB1Ymxpc2hPcHRpb25zIGdldFB1Ymxpc2hPcHRpb25zKCk7Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvdWkvd2l6YXJkcy9QdWJsaXNoQ29uZmlnV2l6YXJkLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvdWkvd2l6YXJkcy9QdWJsaXNoQ29uZmlnV2l6YXJkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhZGFkMDcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3VpL3dpemFyZHMvUHVibGlzaENvbmZpZ1dpemFyZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLndpemFyZHM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLkZpbGVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnVpLlVJSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnNlcnZpY2VzLlB1Ymxpc2hIVE1MT3B0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5zZXJ2aWNlcy5QdWJsaXNoTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5zZXJ2aWNlcy5QdWJsaXNoT3B0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS5QdWJsaXNoaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkuUHVibGlzaGluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLnByZWZlcmVuY2VzLlB1Ymxpc2hpbmdVSVByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51aS53aXphcmRzLkJhc2VXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklOZXdXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLQotLyoqCi0gKiBBIHdpemFyZCB0aGF0IGd1aWRlcyB0aGUgdXNlciB0byBwdWJsaXNoIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24gdG8gYSB3ZWIKLSAqIHNpdGUuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQGF1dGhvciBCaW5neHVlIFh1Ci0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUHVibGlzaENvbmZpZ1dpemFyZCBleHRlbmRzIEJhc2VXaXphcmQgaW1wbGVtZW50cyBJTmV3V2l6YXJkIHsKLQotCS8qKgotCSAqIFRoZSB3aXphcmQgSUQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0laQVJEX0lEID0gUHVibGlzaENvbmZpZ1dpemFyZC5jbGFzcy5nZXROYW1lKCk7Ci0KLQkvKioKLQkgKiBUaGUgUHVibGlzaCBDb25maWd1cmF0aW9uIHdpemFyZCBleHRlbnNpb24gcG9pbnQgSUQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0laQVJEX0VYVEVOU0lPTl9QT0lOVF9JRCA9ICJvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS5wdWJsaXNoQ29uZmlnV2l6YXJkIjsgLy8kTk9OLU5MUy0xJAkKLQotCS8vIFRoZSBzZWxlY3QgY29uZmlndXJhdGlvbiB3aXphcmQgcGFnZS4KLQlwcm90ZWN0ZWQgU2VsZWN0Q29uZmlnUGFnZSBzZWxlY3RDb25maWdQYWdlOwotCi0JLy8gVGhlIHNlbGVjdCBjb25maWd1cmF0aW9uIGNvbnRlbnQgd2l6YXJkIHBhZ2UuCi0JcHJvdGVjdGVkIFNlbGVjdENvbnRlbnRQYWdlIHNlbGVjdENvbnRlbnRQYWdlOwotCi0JLy8gVGhlIHNlbGVjdCBwdWJsaXNoaW5nIG9wdGlvbnMgd2l6YXJkIHBhZ2UuCi0JcHJvdGVjdGVkIFNlbGVjdFB1Ymxpc2hpbmdPcHRpb25zUGFnZSBzZWxlY3RQdWJsaXNoaW5nT3B0aW9uc1BhZ2U7Ci0KLQkvLyBUaGUgc2VsZWN0IGRlc3RpbmF0aW9uIHdpemFyZCBwYWdlLgotCXByb3RlY3RlZCBTZWxlY3REZXN0aW5hdGlvblBhZ2Ugc2VsZWN0RGVzdGluYXRpb25QYWdlOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgUHVibGlzaENvbmZpZ1dpemFyZCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51aS53aXphcmRzLkJhc2VXaXphcmQjaW5pdChJV29ya2JlbmNoLAotCSAqICAgICAgSVN0cnVjdHVyZWRTZWxlY3Rpb24pCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoIHdvcmtiZW5jaCwgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCXN1cGVyLmluaXQod29ya2JlbmNoLCBzZWxlY3Rpb24pOwotCQlzZXRXaW5kb3dUaXRsZShQdWJsaXNoaW5nVUlSZXNvdXJjZXMucHVibGlzaENvbmZpZ1dpemFyZF90aXRsZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudWkud2l6YXJkcy5CYXNlV2l6YXJkI2dldFdpemFyZEV4dGVuZGVyRXh0ZW5zaW9uUG9pbnRJZCgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRXaXphcmRFeHRlbmRlckV4dGVuc2lvblBvaW50SWQoKSB7Ci0JCXJldHVybiBXSVpBUkRfRVhURU5TSU9OX1BPSU5UX0lEOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZCNhZGRQYWdlcygpCi0JICovCi0JcHVibGljIHZvaWQgYWRkUGFnZXMoKSB7Ci0JCWlmICh3aXphcmRFeHRlbmRlciA9PSBudWxsKSB7Ci0JCQlzZWxlY3RDb25maWdQYWdlID0gbmV3IFNlbGVjdENvbmZpZ1BhZ2UoKTsKLQkJCXNlbGVjdENvbnRlbnRQYWdlID0gbmV3IFNlbGVjdENvbnRlbnRQYWdlKCk7Ci0JCQlzZWxlY3RQdWJsaXNoaW5nT3B0aW9uc1BhZ2UgPSBuZXcgU2VsZWN0UHVibGlzaGluZ09wdGlvbnNQYWdlKCk7Ci0JCQlzZWxlY3REZXN0aW5hdGlvblBhZ2UgPSBuZXcgU2VsZWN0RGVzdGluYXRpb25QYWdlKCk7Ci0JCQlzdXBlci5hZGRQYWdlKHNlbGVjdENvbmZpZ1BhZ2UpOwotCQkJc3VwZXIuYWRkUGFnZShzZWxlY3RDb250ZW50UGFnZSk7Ci0JCQlzdXBlci5hZGRQYWdlKHNlbGVjdFB1Ymxpc2hpbmdPcHRpb25zUGFnZSk7Ci0JCQlzdXBlci5hZGRQYWdlKHNlbGVjdERlc3RpbmF0aW9uUGFnZSk7Ci0JCX0gZWxzZSB7Ci0JCQlMaXN0PElXaXphcmRQYWdlPiB3aXphcmRQYWdlcyA9IG5ldyBBcnJheUxpc3Q8SVdpemFyZFBhZ2U+KCk7Ci0KLQkJCUlXaXphcmRQYWdlIHBhZ2UgPSB3aXphcmRFeHRlbmRlcgotCQkJCQkuZ2V0UmVwbGFjZVdpemFyZFBhZ2UoU2VsZWN0Q29uZmlnUGFnZS5QQUdFX05BTUUpOwotCQkJaWYgKHBhZ2UgIT0gbnVsbCkgewotCQkJCXdpemFyZFBhZ2VzLmFkZChwYWdlKTsKLQkJCX0gZWxzZSB7Ci0JCQkJc2VsZWN0Q29uZmlnUGFnZSA9IG5ldyBTZWxlY3RDb25maWdQYWdlKCk7Ci0JCQkJd2l6YXJkUGFnZXMuYWRkKHNlbGVjdENvbmZpZ1BhZ2UpOwotCQkJfQotCi0JCQlwYWdlID0gd2l6YXJkRXh0ZW5kZXIKLQkJCQkJLmdldFJlcGxhY2VXaXphcmRQYWdlKFNlbGVjdENvbnRlbnRQYWdlLlBBR0VfTkFNRSk7Ci0JCQlpZiAocGFnZSAhPSBudWxsKSB7Ci0JCQkJd2l6YXJkUGFnZXMuYWRkKHBhZ2UpOwotCQkJfSBlbHNlIHsKLQkJCQlzZWxlY3RDb250ZW50UGFnZSA9IG5ldyBTZWxlY3RDb250ZW50UGFnZSgpOwotCQkJCXdpemFyZFBhZ2VzLmFkZChzZWxlY3RDb250ZW50UGFnZSk7Ci0JCQl9Ci0KLQkJCXBhZ2UgPSB3aXphcmRFeHRlbmRlcgotCQkJCQkuZ2V0UmVwbGFjZVdpemFyZFBhZ2UoU2VsZWN0UHVibGlzaGluZ09wdGlvbnNQYWdlLlBBR0VfTkFNRSk7Ci0JCQlpZiAocGFnZSAhPSBudWxsKSB7Ci0JCQkJd2l6YXJkUGFnZXMuYWRkKHBhZ2UpOwotCQkJfSBlbHNlIHsKLQkJCQlzZWxlY3RQdWJsaXNoaW5nT3B0aW9uc1BhZ2UgPSBuZXcgU2VsZWN0UHVibGlzaGluZ09wdGlvbnNQYWdlKCk7Ci0JCQkJd2l6YXJkUGFnZXMuYWRkKHNlbGVjdFB1Ymxpc2hpbmdPcHRpb25zUGFnZSk7Ci0JCQl9Ci0KLQkJCXBhZ2UgPSB3aXphcmRFeHRlbmRlcgotCQkJCQkuZ2V0UmVwbGFjZVdpemFyZFBhZ2UoU2VsZWN0RGVzdGluYXRpb25QYWdlLlBBR0VfTkFNRSk7Ci0JCQlpZiAocGFnZSAhPSBudWxsKSB7Ci0JCQkJd2l6YXJkUGFnZXMuYWRkKHBhZ2UpOwotCQkJfSBlbHNlIHsKLQkJCQlzZWxlY3REZXN0aW5hdGlvblBhZ2UgPSBuZXcgU2VsZWN0RGVzdGluYXRpb25QYWdlKCk7Ci0JCQkJd2l6YXJkUGFnZXMuYWRkKHNlbGVjdERlc3RpbmF0aW9uUGFnZSk7Ci0JCQl9Ci0KLQkJCXN1cGVyLmdldE5ld1dpemFyZFBhZ2VzKHdpemFyZFBhZ2VzKTsKLQotCQkJZm9yIChJdGVyYXRvciBpdCA9IHdpemFyZFBhZ2VzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlJV2l6YXJkUGFnZSB3aXphcmRQYWdlID0gKElXaXphcmRQYWdlKSBpdC5uZXh0KCk7Ci0JCQkJc3VwZXIuYWRkUGFnZSh3aXphcmRQYWdlKTsKLQkJCX0KLQotCQkJd2l6YXJkRXh0ZW5kZXIuaW5pdFdpemFyZFBhZ2VzKHdpemFyZFBhZ2VzKTsKLQkJfQotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBJV2l6YXJkUGFnZSBnZXROZXh0UGFnZShJV2l6YXJkUGFnZSBwYWdlKSB7Ci0JCS8vb3ZlcnJpZGUgdGhlIGJhc2Ugd2l6YXJkJ3MgbG9naWMsIAotCQkvL2xldCB0aGUgd2l6YXJkIGV4dGVuZGVyIGRyaXZlIHRoZSBwYWdlIGZsb3cgd2hlbiB0aGVyZSBpcyBhIHdpemFyZCBleHRlbmRlcgotCQlJV2l6YXJkUGFnZSBuZXh0UGFnZSA9IG51bGw7Ci0JCWlmICh3aXphcmRFeHRlbmRlciAhPSBudWxsKSB7Ci0JCQluZXh0UGFnZSA9IHdpemFyZEV4dGVuZGVyLmdldE5leHRQYWdlKHBhZ2UpOwotCQl9Ci0JCWVsc2UgewotCQkJbmV4dFBhZ2UgPSBzdXBlci5nZXROZXh0UGFnZShwYWdlKTsKLQkJfQotCQlyZXR1cm4gbmV4dFBhZ2U7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkI2NyZWF0ZVBhZ2VDb250cm9scyhDb21wb3NpdGUpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlUGFnZUNvbnRyb2xzKENvbXBvc2l0ZSBwYWdlQ29udGFpbmVyKSB7Ci0JCXN1cGVyLmNyZWF0ZVBhZ2VDb250cm9scyhwYWdlQ29udGFpbmVyKTsKLQkJcGFnZUNvbnRhaW5lci5nZXRTaGVsbCgpLnNldEltYWdlKAotCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRTaGFyZWRJbWFnZSgKLQkJCQkJCSJmdWxsL29iajE2L01ldGhvZENvbmZpZ3VyYXRpb24uZ2lmIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkI3BlcmZvcm1GaW5pc2goKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHBlcmZvcm1GaW5pc2goKSB7Ci0JCWlmICh3aXphcmRFeHRlbmRlciAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gd2l6YXJkRXh0ZW5kZXIuZG9GaW5pc2goKTsKLQkJfSBlbHNlIHsKLQkJCVB1Ymxpc2hNYW5hZ2VyIHB1Ymxpc2hlciA9IG5ldyBQdWJsaXNoTWFuYWdlcigpOwotCQkJYm9vbGVhbiBzdWNjZXNzID0gcHVibGlzaENvbmZpZyhzZWxlY3RDb25maWdQYWdlLmdldFNlbGVjdGVkQ29uZmlnKCksCi0JCQkJCWdldFB1Ymxpc2hpbmdPcHRpb25zKCksIHB1Ymxpc2hlcik7Ci0JCQlpZiAocHVibGlzaGVyICE9IG51bGwpIHsKLQkJCQlwdWJsaXNoZXIuZGlzcG9zZSgpOwotCQkJfQotCQkJcmV0dXJuIHN1Y2Nlc3M7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBQdWJsaXNoZXMgdGhlIHNlbGVjdGVkIG1ldGhvZCBjb25maWd1cmF0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBjb25maWdOYW1lCi0JICogICAgICAgICAgICB0aGUgbWV0aG9kIGNvbmZpZ3VyYXRpb24gbmFtZQotCSAqIEBwYXJhbSBvcHRpb25zCi0JICogICAgICAgICAgICB0aGUgcHVibGlzaGluZyBvcHRpb25zCi0JICovCi0JcHVibGljIGJvb2xlYW4gcHVibGlzaENvbmZpZyhNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZywgUHVibGlzaE9wdGlvbnMgb3B0aW9ucywKLQkJCVB1Ymxpc2hNYW5hZ2VyIHB1Ymxpc2hlcikgewotCQl0cnkgewotCQkJaWYgKGNoZWNrQW5kQ3JlYXRlRGlyKG9wdGlvbnMpKSB7Ci0JCQkJcHVibGlzaGVyLmluaXQob3B0aW9ucy5nZXRQdWJsaXNoRGlyKCksIGNvbmZpZywgb3B0aW9ucyk7Ci0JCQkJUHVibGlzaGluZ09wZXJhdGlvbiBvcGVyYXRpb24gPSBuZXcgUHVibGlzaGluZ09wZXJhdGlvbigKLQkJCQkJCXB1Ymxpc2hlcik7Ci0KLQkJCQlQdWJsaXNoUHJvZ3Jlc3NNb25pdG9yRGlhbG9nIGRsZyA9IG5ldyBQdWJsaXNoUHJvZ3Jlc3NNb25pdG9yRGlhbG9nKAotCQkJCQkJRGlzcGxheS5nZXRDdXJyZW50KCkuZ2V0QWN0aXZlU2hlbGwoKSwgcHVibGlzaGVyCi0JCQkJCQkJCS5nZXRWaWV3QnVpbGRlcigpKTsKLQotCQkJCVVJSGVscGVyLnJ1bldpdGhQcm9ncmVzcyhvcGVyYXRpb24sIGRsZywgdHJ1ZSwKLQkJCQkJCVB1Ymxpc2hpbmdVSVJlc291cmNlcy5wdWJsaXNoQ29uZmlnV2l6YXJkX3RpdGxlKTsKLQotCQkJCXJldHVybiB0cnVlOwotCQkJfSBlbHNlIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlQdWJsaXNoaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpLmRpc3BsYXlFcnJvcigKLQkJCQkJUHVibGlzaGluZ1VJUmVzb3VyY2VzLnB1Ymxpc2hDb25maWdXaXphcmRfdGl0bGUsCi0JCQkJCVB1Ymxpc2hpbmdVSVJlc291cmNlcy5wdWJsaXNoQ29uZmlnRXJyb3JfbXNnLAotCQkJCQlQdWJsaXNoaW5nVUlSZXNvdXJjZXMucHVibGlzaENvbmZpZ0Vycm9yX3JlYXNvbiwgZSk7Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAoc2VsZWN0UHVibGlzaGluZ09wdGlvbnNQYWdlICE9IG51bGwpIHsKLQkJCQlzZWxlY3RQdWJsaXNoaW5nT3B0aW9uc1BhZ2Uuc2F2ZVByZWZlcmVuY2VzKCk7Ci0JCQl9Ci0JCQlpZiAoc2VsZWN0RGVzdGluYXRpb25QYWdlICE9IG51bGwpIHsKLQkJCQlzZWxlY3REZXN0aW5hdGlvblBhZ2Uuc2F2ZVByZWZlcmVuY2VzKCk7Ci0JCQl9Ci0JCQlTdHJpbmcgY29uZmlnSWQgPSBjb25maWcuZ2V0R3VpZCgpOwotCQkJUHVibGlzaGluZ1VJUHJlZmVyZW5jZXMuc2V0Q29uZmlnUHJlZkluaXRpYWxpemVkKGNvbmZpZ0lkLCB0cnVlKTsKLQkJCVB1Ymxpc2hpbmdVSVByZWZlcmVuY2VzLnNhdmVBbGxQcmVmZXJlbmNlcygpOwotCQl9Ci0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgdXNlciBzcGVjaWZpZWQgcHVibGlzaGluZyBvcHRpb25zLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHVzZXIgc3BlY2lmaWVkIHB1Ymxpc2hpbmcgb3B0aW9ucy4KLQkgKi8KLQlwdWJsaWMgUHVibGlzaE9wdGlvbnMgZ2V0UHVibGlzaGluZ09wdGlvbnMoKSB7Ci0JCVB1Ymxpc2hPcHRpb25zIG9wdGlvbnM7Ci0JCQotCQlpZiAoc2VsZWN0UHVibGlzaGluZ09wdGlvbnNQYWdlICE9IG51bGwpIHsKLQkJCW9wdGlvbnMgPSBzZWxlY3RQdWJsaXNoaW5nT3B0aW9uc1BhZ2UuZ2V0UHVibGlzaGluZ09wdGlvbnMoKTsKLQkJfQotCQllbHNlIHsKLQkJCW9wdGlvbnMgPSBuZXcgUHVibGlzaE9wdGlvbnMoKTsKLQkJfQotCi0JCWlmIChzZWxlY3RDb250ZW50UGFnZSAhPSBudWxsKSB7Ci0JCQlib29sZWFuIHB1Ymxpc2hDb25maWcgPSBzZWxlY3RDb250ZW50UGFnZS5nZXRQdWJsaXNoQ29uZmlnU2VsZWN0aW9uKCk7Ci0JCQlvcHRpb25zLnNldFB1Ymxpc2hDb25maWd1cmF0aW9uKHB1Ymxpc2hDb25maWcpOwotCQkJb3B0aW9ucy5zZXRQdWJsaXNoUHJvY2VzcyghcHVibGlzaENvbmZpZyk7Ci0JCQlpZiAoIXB1Ymxpc2hDb25maWcpIHsKLQkJCQlvcHRpb25zLnNldFByb2Nlc3NlcyhzZWxlY3RDb250ZW50UGFnZS5nZXRTZWxlY3RlZFByb2Nlc3NlcygpKTsKLQkJCX0KLQkJfQotCQkKLQkJaWYgKHNlbGVjdERlc3RpbmF0aW9uUGFnZSAhPSBudWxsKSB7Ci0JCQlvcHRpb25zLnNldFB1Ymxpc2hEaXIoc2VsZWN0RGVzdGluYXRpb25QYWdlLmdldFB1Ymxpc2hEaXJlY3RvcnkoKSk7Ci0KLQkJCWlmICghc2VsZWN0RGVzdGluYXRpb25QYWdlLmdldFN0YXRpY1dlYlNpdGVTZWxlY3Rpb24oKQotCQkJCQkmJiBvcHRpb25zIGluc3RhbmNlb2YgUHVibGlzaEhUTUxPcHRpb25zKSB7Ci0JCQkJUHVibGlzaEhUTUxPcHRpb25zIGh0bWxPcHRpb25zID0gKFB1Ymxpc2hIVE1MT3B0aW9ucykgb3B0aW9uczsKLQkJCQlodG1sT3B0aW9ucy5zZXRQdWJsaXNoRHluYW1pY1dlYkFwcCh0cnVlKTsKLQkJCQlodG1sT3B0aW9ucy5zZXREeW5hbWljV2ViQXBwTmFtZShzZWxlY3REZXN0aW5hdGlvblBhZ2UKLQkJCQkJCS5nZXRXZWJBcHBOYW1lKCkpOwotCQkJCWh0bWxPcHRpb25zLnNldEluY2x1ZGVTZXJ2bGV0U2VhcmNoKHNlbGVjdERlc3RpbmF0aW9uUGFnZQotCQkJCQkJLmdldEluY2x1ZGVTZWFyY2hTZWxlY3Rpb24oKSk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gb3B0aW9uczsKLQl9Ci0KLQkvKioKLQkgKiBDaGVja3MgYW5kIGNyZWF0ZXMgdGhlIGRlc3RpbmF0aW9uIHBhdGggd2hlcmUgdGhlIG1ldGhvZCBjb25maWd1cmF0aW9uCi0JICogd2lsbCBiZSBwdWJsaXNoZWQuCi0JICogCi0JICogQHBhcmFtIG9wdGlvbnMKLQkgKiAgICAgICAgICAgIHRoZSBwdWJsaXNoaW5nIG9wdGlvbnMKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBkZXN0aW5hdGlvbiBwYXRoIGlzIHZhbGlkLAotCSAqICAgICAgICAgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotCSAqLwotCXB1YmxpYyBib29sZWFuIGNoZWNrQW5kQ3JlYXRlRGlyKFB1Ymxpc2hPcHRpb25zIG9wdGlvbnMpIHsKLQkJU3RyaW5nIGRpciA9IG9wdGlvbnMuZ2V0UHVibGlzaERpcigpOwotCQlTdHJpbmcgZGVmYXVsdFB1Ymxpc2hQYXRoID0gUHVibGlzaGluZ1VJUHJlZmVyZW5jZXMKLQkJCQkuZ2V0RGVmYXVsdFB1Ymxpc2hQYXRoKCk7Ci0JCWJvb2xlYW4gYW5zd2VyID0gZmFsc2U7Ci0KLQkJSVBhdGggZWNQYXRoID0gUGF0aC5mcm9tT1NTdHJpbmcoZGlyKTsKLQkJaWYgKCFlY1BhdGguaXNBYnNvbHV0ZSgpKSB7Ci0JCQlTdHJpbmcgcGF0aCA9IGRlZmF1bHRQdWJsaXNoUGF0aAotCQkJCQkrIFN5c3RlbS5nZXRQcm9wZXJ0eSgiZmlsZS5zZXBhcmF0b3IiKSArIGRpcjsgLy8kTk9OLU5MUy0xJAotCQkJYW5zd2VyID0gUHVibGlzaGluZ1VJUGx1Z2luCi0JCQkJCS5nZXREZWZhdWx0KCkKLQkJCQkJLmdldE1zZ0RpYWxvZygpCi0JCQkJCS5kaXNwbGF5UHJvbXB0KAotCQkJCQkJCVB1Ymxpc2hpbmdVSVJlc291cmNlcy5wdWJsaXNoQ29uZmlnRGlhbG9nX3RpdGxlLAotCQkJCQkJCVB1Ymxpc2hpbmdVSVJlc291cmNlcwotCQkJCQkJCQkJLmJpbmQoCi0JCQkJCQkJCQkJCVB1Ymxpc2hpbmdVSVJlc291cmNlcy5jb25maXJtUGF0aERpYWxvZ190ZXh0LAotCQkJCQkJCQkJCQlwYXRoKSk7Ci0KLQkJCWlmIChhbnN3ZXIpIHsKLQkJCQlvcHRpb25zLnNldFB1Ymxpc2hEaXIoZGlyKTsKLQkJCX0gZWxzZSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0KLQkJRmlsZSBmaWxlID0gbmV3IEZpbGUoZGlyKTsKLQotCQlpZiAoZmlsZS5leGlzdHMoKSkgewotCQkJRmlsZVtdIGZpbGVzID0gZmlsZS5saXN0RmlsZXMoKTsKLQkJCWlmIChmaWxlcyAhPSBudWxsICYmIGZpbGVzLmxlbmd0aCA+IDApIHsKLQkJCQlhbnN3ZXIgPSBQdWJsaXNoaW5nVUlQbHVnaW4KLQkJCQkJCS5nZXREZWZhdWx0KCkKLQkJCQkJCS5nZXRNc2dEaWFsb2coKQotCQkJCQkJLmRpc3BsYXlDb25maXJtYXRpb24oCi0JCQkJCQkJCVB1Ymxpc2hpbmdVSVJlc291cmNlcy5wdWJsaXNoQ29uZmlnRGlhbG9nX3RpdGxlLAotCQkJCQkJCQlQdWJsaXNoaW5nVUlSZXNvdXJjZXMKLQkJCQkJCQkJCQkuYmluZCgKLQkJCQkJCQkJCQkJCVB1Ymxpc2hpbmdVSVJlc291cmNlcy5vdmVyd3JpdGVEaWFsb2dfdGV4dCwKLQkJCQkJCQkJCQkJCWRpcikpOwotCi0JCQkJaWYgKGFuc3dlciA9PSB0cnVlKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlhbnN3ZXIgPSBGaWxlVXRpbAotCQkJCQkJCQkuZGVsZXRlQWxsRmlsZXMoZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0JCQkJCQlpZiAoYW5zd2VyID09IGZhbHNlKSB7Ci0JCQkJCQkJUHVibGlzaGluZ1VJUGx1Z2luCi0JCQkJCQkJCQkuZ2V0RGVmYXVsdCgpCi0JCQkJCQkJCQkuZ2V0TXNnRGlhbG9nKCkKLQkJCQkJCQkJCS5kaXNwbGF5RXJyb3IoCi0JCQkJCQkJCQkJCVB1Ymxpc2hpbmdVSVJlc291cmNlcy5wdWJsaXNoQ29uZmlnRGlhbG9nX3RpdGxlLAotCQkJCQkJCQkJCQlQdWJsaXNoaW5nVUlSZXNvdXJjZXMuY2Fubm90UHVibGlzaEVycm9yX21zZywKLQkJCQkJCQkJCQkJUHVibGlzaGluZ1VJUmVzb3VyY2VzCi0JCQkJCQkJCQkJCQkJLmJpbmQoCi0JCQkJCQkJCQkJCQkJCQlQdWJsaXNoaW5nVUlSZXNvdXJjZXMuZGVsZXRlRmlsZXNFcnJvcl9yZWFzb24sCi0JCQkJCQkJCQkJCQkJCQlkaXIpKTsKLQkJCQkJCQlyZXR1cm4gZmFsc2U7Ci0KLQkJCQkJCX0KLQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCVB1Ymxpc2hpbmdVSVBsdWdpbgotCQkJCQkJCQkuZ2V0RGVmYXVsdCgpCi0JCQkJCQkJCS5nZXRNc2dEaWFsb2coKQotCQkJCQkJCQkuZGlzcGxheUVycm9yKAotCQkJCQkJCQkJCVB1Ymxpc2hpbmdVSVJlc291cmNlcy5wdWJsaXNoQ29uZmlnRGlhbG9nX3RpdGxlLAotCQkJCQkJCQkJCVB1Ymxpc2hpbmdVSVJlc291cmNlcy5jYW5ub3RQdWJsaXNoRXJyb3JfbXNnLAotCQkJCQkJCQkJCVB1Ymxpc2hpbmdVSVJlc291cmNlcwotCQkJCQkJCQkJCQkJLmJpbmQoCi0JCQkJCQkJCQkJCQkJCVB1Ymxpc2hpbmdVSVJlc291cmNlcy5kZWxldGVGaWxlc0Vycm9yX3JlYXNvbiwKLQkJCQkJCQkJCQkJCQkJZGlyKSwgZSk7Ci0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9IGVsc2UgewotCQkJdHJ5IHsKLQkJCQlhbnN3ZXIgPSBmaWxlLm1rZGlycygpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlQdWJsaXNoaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpLmRpc3BsYXlFcnJvcigKLQkJCQkJCVB1Ymxpc2hpbmdVSVJlc291cmNlcy5wdWJsaXNoQ29uZmlnRGlhbG9nX3RpdGxlLAotCQkJCQkJUHVibGlzaGluZ1VJUmVzb3VyY2VzLmNhbm5vdFB1Ymxpc2hFcnJvcl9tc2csCi0JCQkJCQlQdWJsaXNoaW5nVUlSZXNvdXJjZXMuYmluZCgKLQkJCQkJCQkJUHVibGlzaGluZ1VJUmVzb3VyY2VzLmNyZWF0ZURpckVycm9yX3JlYXNvbiwKLQkJCQkJCQkJZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSksIGUpOwotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCWlmICghYW5zd2VyKSB7Ci0JCQkJUHVibGlzaGluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKS5kaXNwbGF5RXJyb3IoCi0JCQkJCQlQdWJsaXNoaW5nVUlSZXNvdXJjZXMucHVibGlzaENvbmZpZ0RpYWxvZ190aXRsZSwKLQkJCQkJCVB1Ymxpc2hpbmdVSVJlc291cmNlcy5jYW5ub3RQdWJsaXNoRXJyb3JfbXNnLAotCQkJCQkJUHVibGlzaGluZ1VJUmVzb3VyY2VzLmJpbmQoCi0JCQkJCQkJCVB1Ymxpc2hpbmdVSVJlc291cmNlcy5jcmVhdGVEaXJFcnJvcl9yZWFzb24sCi0JCQkJCQkJCWZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpKTsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gYW5zd2VyOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy91aS93aXphcmRzL1B1Ymxpc2hPcHRpb25Db250cmlidXRpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy91aS93aXphcmRzL1B1Ymxpc2hPcHRpb25Db250cmlidXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWY4YjNiNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvdWkvd2l6YXJkcy9QdWJsaXNoT3B0aW9uQ29udHJpYnV0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS53aXphcmRzOwotCi0vKioKLSAqIE1vZGVscyBhICJwdWJsaXNoT3B0aW9uIiBjb25maWd1cmF0aW9uIGVsZW1lbnQgaW4gdGhlCi0gKiAib3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkucHVibGlzaENvbmZpZ3VyYXRpb25XaXphcmQiIGV4dGVuc2lvbiBwb2ludC4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBQdWJsaXNoT3B0aW9uQ29udHJpYnV0aW9uIHsKLQotCXByaXZhdGUgU3RyaW5nIG5hbWU7Ci0KLQlwcml2YXRlIFN0cmluZyBkZXNjcmlwdGlvbjsKLQotCXByaXZhdGUgYm9vbGVhbiBkZWZhdWx0U2VsZWN0aW9uOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gbmFtZQotCSAqICAgICAgICAgICAgdGhlIGV4cG9ydCBvcHRpb24gbmFtZQotCSAqIEBwYXJhbSBkZXNjcmlwdGlvbgotCSAqICAgICAgICAgICAgdGhlIGV4cG9ydCBvcHRpb24gZGVzY3JpcHRpb24KLQkgKiBAcGFyYW0gZGVmYXVsdFNlbGVjdGlvbgotCSAqICAgICAgICAgICAgaWYgPGNvZGU+dHJ1ZTwvY29kZT4sIHRoaXMgb3B0aW9uIGlzIHNlbGVjdGVkIGJ5IGRlZmF1bHQKLQkgKi8KLQlwdWJsaWMgUHVibGlzaE9wdGlvbkNvbnRyaWJ1dGlvbihTdHJpbmcgbmFtZSwgU3RyaW5nIGRlc2NyaXB0aW9uLAotCQkJYm9vbGVhbiBkZWZhdWx0U2VsZWN0aW9uKSB7Ci0JCXRoaXMubmFtZSA9IG5hbWU7Ci0JCXRoaXMuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjsKLQkJdGhpcy5kZWZhdWx0U2VsZWN0aW9uID0gZGVmYXVsdFNlbGVjdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoaXMgZXhwb3J0IG9wdGlvbi4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBleHBvcnQgb3B0aW9uIG5hbWUKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBuYW1lOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGRlc2NyaXB0aW9uIG9mIHRoaXMgZXhwb3J0IG9wdGlvbi4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBleHBvcnQgb3B0aW9uIGRlc2NyaXB0aW9uCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIGRlc2NyaXB0aW9uOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGRlZmF1bHQgc2VsZWNpdG9uIG9mIHRoaXMgZXhwb3J0IG9wdGlvbi4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgb3B0aW9uIHNob3VsZCBiZSBzZWxlY3RlZCBieSBkZWZhdWx0Ci0JICovCi0JcHVibGljIGJvb2xlYW4gZ2V0RGVmYXVsdFNlbGVjdGlvbigpIHsKLQkJcmV0dXJuIGRlZmF1bHRTZWxlY3Rpb247Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvdWkvd2l6YXJkcy9QdWJsaXNoUHJvZ3Jlc3NNb25pdG9yRGlhbG9nLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvdWkvd2l6YXJkcy9QdWJsaXNoUHJvZ3Jlc3NNb25pdG9yRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiOGUwOTMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3VpL3dpemFyZHMvUHVibGlzaFByb2dyZXNzTW9uaXRvckRpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLndpemFyZHM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi52aWV3ZXIuQWN0aXZpdHlEaWFncmFtU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLnVpLnNlcnZpY2UuRGlhZ3JhbUltYWdlU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuRWxlbWVudExheW91dE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcuc2VydmljZXMuQWJzdHJhY3RWaWV3QnVpbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLlByb2dyZXNzTW9uaXRvckRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotCi0KLS8qKgotICogVGhlIHB1Ymxpc2ggY29uZmlndXJhdGlvbiBwcm9ncmVzcyBkaWFsb2cuCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFB1Ymxpc2hQcm9ncmVzc01vbml0b3JEaWFsb2cgZXh0ZW5kcyBQcm9ncmVzc01vbml0b3JEaWFsb2cgewotCi0JcHJpdmF0ZSBDb21wb3NpdGUgZGlhZ3JhbVZpZXdlckhvbGRlcjsKLQotCXByaXZhdGUgQWJzdHJhY3RWaWV3QnVpbGRlciB2aWV3QnVpbGRlcjsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFB1Ymxpc2hQcm9ncmVzc01vbml0b3JEaWFsb2coU2hlbGwgcGFyZW50LAotCQkJQWJzdHJhY3RWaWV3QnVpbGRlciB2aWV3QnVpbGRlcikgewotCQlzdXBlcihwYXJlbnQpOwotCQl0aGlzLnZpZXdCdWlsZGVyID0gdmlld0J1aWxkZXI7Ci0JfQotCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbnRyb2wgY3RybCA9IHN1cGVyLmNyZWF0ZURpYWxvZ0FyZWEocGFyZW50KTsKLQotCQlpZiAodmlld0J1aWxkZXIgIT0gbnVsbCkgewotCQkJLy8gQ3JlYXRlIHRoZSBkaWFncmFtIHZpZXdlciBob2xkZXIgYW5kIHRoZSBkaWFncmFtIHNlcnZpY2UuCi0JCQlkaWFncmFtVmlld2VySG9sZGVyID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJCWRpYWdyYW1WaWV3ZXJIb2xkZXIuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoMSwgMSkpOwotCQkJZGlhZ3JhbVZpZXdlckhvbGRlci5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JCQlkaWFncmFtVmlld2VySG9sZGVyLnNldFZpc2libGUoZmFsc2UpOwotCi0JCQlFbGVtZW50TGF5b3V0TWFuYWdlciBsYXlvdXRNZ3IgPSB2aWV3QnVpbGRlci5nZXRMYXlvdXRNZ3IoKTsKLQkJCVN0cmluZyBuZXdEaWFncmFtcyA9IEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKS5nZXRTdHJpbmcoIlBVQkxJU0hfTkVXX0RJQUdSQU0iKTsgLy8kTk9OLU5MUy0xJAotCQkJQm9vbGVhbiBuZXdEaWFncmFtID0gbmV3IEJvb2xlYW4odHJ1ZSk7Ci0JCQlpZihuZXdEaWFncmFtcyAhPSBudWxsICYmIG5ld0RpYWdyYW1zLmxlbmd0aCgpID4gMCl7Ci0JCQkJbmV3RGlhZ3JhbSA9IG5ldyBCb29sZWFuKG5ld0RpYWdyYW1zKTsKLQkJCX0KLQkJCWlmIChuZXdEaWFncmFtLmJvb2xlYW5WYWx1ZSgpKSB7Ci0JCQkJRGlhZ3JhbUltYWdlU2VydmljZSBkaWFncmFtU2VydmljZSA9IG5ldyBEaWFncmFtSW1hZ2VTZXJ2aWNlKAotCQkJCQkJZGlhZ3JhbVZpZXdlckhvbGRlciwKLQkJCQkJCW5ldyBGaWxlKGxheW91dE1nci5nZXRQdWJsaXNoRGlyKCkpKTsKLQkJCQlkaWFncmFtU2VydmljZS5zZXRDb25maWcobGF5b3V0TWdyLmdldENvbmZpZ3VyYXRpb24oKSk7Ci0JCQkJZGlhZ3JhbVNlcnZpY2Uuc2V0UHVibGlzaGVkVW5DcmVhdGVkQUREKHZpZXdCdWlsZGVyCi0JCQkJCQkuZ2V0T3B0aW9ucygpLmlzUHVibGlzaFVub3BlbkFERCgpKTsKLQkJCQlkaWFncmFtU2VydmljZS5zZXRQdWJsaXNoQURGb3JBY3Rpdml0eUV4dGVuc2lvbih2aWV3QnVpbGRlcgotCQkJCQkJLmdldE9wdGlvbnMoKS5pc1B1Ymxpc2hCYXNlQUQoKSk7Ci0JCQkJbGF5b3V0TWdyLnNldEFjdGl2aXR5RGlhZ3JhbVNlcnZpY2UoZGlhZ3JhbVNlcnZpY2UpOwotCQkJfSBlbHNlIHsKLQkJCQlBY3Rpdml0eURpYWdyYW1TZXJ2aWNlIGRpYWdyYW1TZXJ2aWNlID0gbmV3IEFjdGl2aXR5RGlhZ3JhbVNlcnZpY2UoCi0JCQkJCQlkaWFncmFtVmlld2VySG9sZGVyLAotCQkJCQkJbmV3IEZpbGUobGF5b3V0TWdyLmdldFB1Ymxpc2hEaXIoKSkpOwotCQkJCWRpYWdyYW1TZXJ2aWNlLnNldFB1Ymxpc2hlZFVuQ3JlYXRlZEFERCh2aWV3QnVpbGRlcgotCQkJCQkJLmdldE9wdGlvbnMoKS5pc1B1Ymxpc2hVbm9wZW5BREQoKSk7Ci0JCQkJZGlhZ3JhbVNlcnZpY2Uuc2V0UHVibGlzaEFERm9yQWN0aXZpdHlFeHRlbnNpb24odmlld0J1aWxkZXIKLQkJCQkJCS5nZXRPcHRpb25zKCkuaXNQdWJsaXNoQmFzZUFEKCkpOwotCQkJCWxheW91dE1nci5zZXRBY3Rpdml0eURpYWdyYW1TZXJ2aWNlKGRpYWdyYW1TZXJ2aWNlKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBjdHJsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKSBNZXRob2QgZGVjbGFyZWQgb24gV2luZG93LgotCSAqLwotCXB1YmxpYyBib29sZWFuIGNsb3NlKCkgewotCQkKLQkJdmlld0J1aWxkZXIgPSBudWxsOwotCQlyZXR1cm4gc3VwZXIuY2xvc2UoKTsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvdWkvd2l6YXJkcy9QdWJsaXNoaW5nT3BlcmF0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvdWkvd2l6YXJkcy9QdWJsaXNoaW5nT3BlcmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0MTA5NDYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3VpL3dpemFyZHMvUHVibGlzaGluZ09wZXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjY3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLndpemFyZHM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS51dGlsLk1zZ0RpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5zZXJ2aWNlcy5TYWZlVXBkYXRlQ29udHJvbGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5QdWJsaXNoaW5nUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnNlcnZpY2VzLkFic3RyYWN0UHVibGlzaE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcuc2VydmljZXMuQWJzdHJhY3RWaWV3QnVpbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5zZXJ2aWNlcy5QdWJsaXNoSFRNTE9wdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcuc2VydmljZXMuUHVibGlzaE9wdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkuUHVibGlzaGluZ1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLlB1Ymxpc2hpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uSVJ1bm5hYmxlV2l0aFByb2dyZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmJyb3dzZXIuQnJvd3NlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QucHJvZ3JhbS5Qcm9ncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGFydEluaXRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5icm93c2VyLklXZWJCcm93c2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmJyb3dzZXIuSVdvcmtiZW5jaEJyb3dzZXJTdXBwb3J0OwotCi0vKioKLSAqIFBlcmZvcm1zIHRoZSByZWFsIHdvcmsgb2YgcHVibGlzaGluZyBhIE1ldGhvZCBDb25maWd1cmF0aW9uLgotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBQdWJsaXNoaW5nT3BlcmF0aW9uIGltcGxlbWVudHMgSVJ1bm5hYmxlV2l0aFByb2dyZXNzLCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuSVJ1bm5hYmxlV2l0aFByb2dyZXNzIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQVUJMSVNIX0NPTkZJR19FUlJPUl9USVRMRSA9IFB1Ymxpc2hpbmdVSVJlc291cmNlcy5wdWJsaXNoQ29uZmlnRGlhbG9nX3RpdGxlOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFVCTElTSF9DT05GSUdfRVJST1JfTVNHID0gUHVibGlzaGluZ1VJUmVzb3VyY2VzLnB1Ymxpc2hDb25maWdFcnJvcl9tc2c7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQVUJMSVNIX0NPTkZJR19FUlJPUl9SRUFTT04gPSBQdWJsaXNoaW5nVUlSZXNvdXJjZXMucHVibGlzaENvbmZpZ0Vycm9yX3JlYXNvbjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRVZJRVdfQ09ORklHX0VSUk9SX1RJVExFID0gUHVibGlzaGluZ1VJUmVzb3VyY2VzLnByZXZpZXdDb25maWdFcnJvcl90aXRsZTsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRVZJRVdfQ09ORklHX0VSUk9SX01TRyA9IFB1Ymxpc2hpbmdVSVJlc291cmNlcy5wcmV2aWV3Q29uZmlnRXJyb3JfbXNnOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVklFV19SRVBPUlRfRVJST1JfVElUTEUgPSBQdWJsaXNoaW5nVUlSZXNvdXJjZXMudmlld1JlcG9ydEVycm9yX3RpdGxlOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVklFV19SRVBPUlRfRVJST1JfTVNHID0gUHVibGlzaGluZ1VJUmVzb3VyY2VzLnZpZXdSZXBvcnRFcnJvcl9tc2c7IC8vJE5PTi1OTFMtMSQJCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1BFTl9CUk9XU0VSX0VSUk9SX1JFQVNPTiA9IFB1Ymxpc2hpbmdVSVJlc291cmNlcy5vcGVuQnJvd3NlckVycm9yX3JlYXNvbjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBVQkxJU0hfQ09ORklHX0NBTkNFTF9NU0cgPSBQdWJsaXNoaW5nVUlSZXNvdXJjZXMuY2FuY2VsUHVibGlzaENvbmZpZ19tc2c7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgQWJzdHJhY3RQdWJsaXNoTWFuYWdlciBwdWJsaXNoTWdyOwotCi0JcHJpdmF0ZSBTdHJpbmcgcHVibGlzaGVkX3VybDsKLQotCXByaXZhdGUgU3RyaW5nIHJlcG9ydF91cmw7Ci0KLQlwcml2YXRlIE1zZ0RpYWxvZyBtc2dEaWFsb2c7Ci0KLQlwcml2YXRlIEV4Y2VwdGlvbiBydW5FeGNlcHRpb247Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBQdWJsaXNoaW5nT3BlcmF0aW9uKEFic3RyYWN0UHVibGlzaE1hbmFnZXIgcHVibGlzaE1ncikgewotCQlzdXBlcigpOwotCQl0aGlzLnB1Ymxpc2hNZ3IgPSBwdWJsaXNoTWdyOwotCQl0aGlzLm1zZ0RpYWxvZyA9IFB1Ymxpc2hpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCk7Ci0JfQotCi0JLyoqCi0JICogZ2V0IHRoZSB2aWV3IGJ1aWxkZXIuCi0JICogCi0JICogQHJldHVybiBBYnN0cmFjdFZpZXdCdWlsZGVyCi0JICovCi0JcHVibGljIEFic3RyYWN0Vmlld0J1aWxkZXIgZ2V0Vmlld0J1aWxkZXIoKSB7Ci0JCXJldHVybiB0aGlzLnB1Ymxpc2hNZ3IuZ2V0Vmlld0J1aWxkZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBnZXQgdGhlIHVybCBmb3IgdGhlIHB1Ymxpc2hlZCBzaXRlCi0JICogCi0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFB1Ymxpc2hlZFVybCgpIHsKLQkJcmV0dXJuIHB1Ymxpc2hlZF91cmw7Ci0JfQotCi0JLyoqCi0JICogcnVuIHRoZSBvcGVyYXRpb24gdG8gcGVyZm9ybSB0aGUgcHVibGlzaGluZyB0YXNrLgotCSAqIAotCSAqIEBwYXJhbSBtb25pdG9yCi0JICogICAgICAgICAgICBJUHJvZ3Jlc3NNb25pdG9yCi0JICogQHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uCi0JICovCi0JcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sCi0JCQlJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCQotCQl0cnkgewotCQkJX3J1bkl0KG1vbml0b3IpOwotCQl9IGZpbmFsbHkgewotCQkJdGhpcy5wdWJsaXNoTWdyID0gbnVsbDsKLQkJCXRoaXMubXNnRGlhbG9nID0gbnVsbDsKLQkJfQotCX0KLQotCS8qKgotCSAqIHJ1biB0aGUgb3BlcmF0aW9uIHRvIHBlcmZvcm0gdGhlIHB1Ymxpc2hpbmcgdGFzay4KLQkgKiAKLQkgKiBAcGFyYW0gbW9uaXRvcgotCSAqICAgICAgICAgICAgSVByb2dyZXNzTW9uaXRvcgotCSAqIEB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbgotCSAqLwotCXByaXZhdGUgdm9pZCBfcnVuSXQoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwKLQkJCUludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJcnVuRXhjZXB0aW9uID0gbnVsbDsKLQkJdHJ5IHsKLQkJCW1vbml0b3IKLQkJCQkJLnNldFRhc2tOYW1lKFB1Ymxpc2hpbmdSZXNvdXJjZXMucHVibGlzaGluZ0NvbmZpZ3VyYXRpb25UYXNrX25hbWUpOyAvLyROT04tTkxTLTEkCQkJCi0JCQlwdWJsaXNoTWdyLnB1Ymxpc2gobW9uaXRvcik7Ci0KLQkJCXB1Ymxpc2hlZF91cmwgPSBwdWJsaXNoTWdyLmdldFB1Ymxpc2hlZFVybCgpOwotCQkJcmVwb3J0X3VybCA9IHB1Ymxpc2hNZ3IuZ2V0UHVibGlzaFJlcG9ydFVybCgpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJcnVuRXhjZXB0aW9uID0gZTsKLQkJfQotCi0JCWZpbmFsIGJvb2xlYW4gY2FuY2VsZWQgPSBtb25pdG9yLmlzQ2FuY2VsZWQoKTsKLQotCQlTYWZlVXBkYXRlQ29udHJvbGxlci5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJaWYgKGNhbmNlbGVkKSB7Ci0JCQkJCW1zZ0RpYWxvZy5kaXNwbGF5SW5mbyhQVUJMSVNIX0NPTkZJR19FUlJPUl9USVRMRSwKLQkJCQkJCQlQVUJMSVNIX0NPTkZJR19DQU5DRUxfTVNHKTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQotCQkJCWlmIChyZXBvcnRfdXJsID09IG51bGwpIHsKLQkJCQkJbXNnRGlhbG9nLmRpc3BsYXlFcnJvcihQVUJMSVNIX0NPTkZJR19FUlJPUl9USVRMRSwKLQkJCQkJCQlQVUJMSVNIX0NPTkZJR19FUlJPUl9NU0csCi0JCQkJCQkJUFVCTElTSF9DT05GSUdfRVJST1JfUkVBU09OLCBydW5FeGNlcHRpb24pOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCi0JCQkJUHVibGlzaE9wdGlvbnMgb3B0aW9ucyA9IHB1Ymxpc2hNZ3IuZ2V0Vmlld0J1aWxkZXIoKQotCQkJCQkJLmdldE9wdGlvbnMoKTsKLQkJCQlib29sZWFuIHRvT3BlblB1Ymxpc2hlZFVyaSA9IGZhbHNlOwotCQkJCWlmIChvcHRpb25zIGluc3RhbmNlb2YgUHVibGlzaEhUTUxPcHRpb25zKSB7Ci0JCQkJCWlmICghKChQdWJsaXNoSFRNTE9wdGlvbnMpIG9wdGlvbnMpCi0JCQkJCQkJLmlzUHVibGlzaER5bmFtaWNXZWJBcHAoKSkgewotCQkJCQkJdG9PcGVuUHVibGlzaGVkVXJpID0gdHJ1ZTsKLQkJCQkJCWlmIChwdWJsaXNoZWRfdXJsID09IG51bGwpIHsKLQkJCQkJCQltc2dEaWFsb2cuZGlzcGxheUVycm9yKFBVQkxJU0hfQ09ORklHX0VSUk9SX1RJVExFLAotCQkJCQkJCQkJUFVCTElTSF9DT05GSUdfRVJST1JfTVNHLAotCQkJCQkJCQkJUFVCTElTSF9DT05GSUdfRVJST1JfUkVBU09OLCBydW5FeGNlcHRpb24pOwotCQkJCQkJCXJldHVybjsKLQkJCQkJCX0KLQotCQkJCQl9Ci0JCQkJfQotCQkJCQotCQkJCS8vIHJlbW92ZWQgbGF1bmNoIG9mIHB1Ymxpc2hlZF91cmwKLQkJCQkvLyBiZWNhdXNlIGxhdW5jaGluZyAyIFVSTFMgYXQgbmVhcmx5IHRoZSBzYW1lIHRpbWUgCi0JCQkJLy8gd2FzIGNhdXNpbmcgcHJvYmxlbXMgd2l0aCBJRTcgJiBGaXJlZm94Ci0JCQkJLy8gaW5zdGVhZCwgdGhlIHJlcG9ydCBIVE1MIGZpbGUgaGFzIGFuCi0JCQkJLy8gb25sb2FkIHNjcmlwdCBvZiB0aGUgYm9keSBlbGVtZW50IHRoYXQgd2lsbAotCQkJCS8vIGxvYWQgdGhlIHB1Ymxpc2hlZCB1cmwKLQkJCQkKLQkJCQkvLyBMYXVuY2ggYSBIVE1MIGJyb3dzZXIgdG8gdmlldyB0aGUgcHVibGlzaGVkIHNpdGUuCi0JCQkJaWYgKHRvT3BlblB1Ymxpc2hlZFVyaSAmJiBvcGVuQnJvd3NlcihwdWJsaXNoZWRfdXJsKSA9PSBmYWxzZSkgewotCQkJCQlTdHJpbmcgcmVhc29uID0gTWVzc2FnZUZvcm1hdC5mb3JtYXQoCi0JCQkJCQkJT1BFTl9CUk9XU0VSX0VSUk9SX1JFQVNPTiwKLQkJCQkJCQluZXcgT2JqZWN0W10geyBwdWJsaXNoZWRfdXJsIH0pOwotCQkJCQltc2dEaWFsb2cuZGlzcGxheUVycm9yKFBSRVZJRVdfQ09ORklHX0VSUk9SX1RJVExFLAotCQkJCQkJCVBSRVZJRVdfQ09ORklHX0VSUk9SX01TRywgcmVhc29uKTsKLQkJCQl9Ci0KLQotCQkJCS8vIExhdW5jaCBhIEhUTUwgYnJvd3NlciB0byB2aWV3IHRoZSByZXBvcnQgb24gdGhlIHB1Ymxpc2hlZAotCQkJCS8vIHNpdGUuCi0JCQkJaWYgKG9wZW5TV1RCcm93c2VyKHJlcG9ydF91cmwpID09IGZhbHNlKSB7Ci0JCQkJCVN0cmluZyByZWFzb24gPSBNZXNzYWdlRm9ybWF0LmZvcm1hdCgKLQkJCQkJCQlPUEVOX0JST1dTRVJfRVJST1JfUkVBU09OLAotCQkJCQkJCW5ldyBPYmplY3RbXSB7IHJlcG9ydF91cmwgfSk7Ci0JCQkJCW1zZ0RpYWxvZy5kaXNwbGF5RXJyb3IoVklFV19SRVBPUlRfRVJST1JfVElUTEUsCi0JCQkJCQkJVklFV19SRVBPUlRfRVJST1JfTVNHLCByZWFzb24pOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JCQotCi0JfQotCQotCXB1YmxpYyBib29sZWFuIG9wZW5TV1RCcm93c2VyKGZpbmFsIFN0cmluZyB1cmxTdHJpbmcpIHsKLQkJYm9vbGVhbiBzdWNjZXNzID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChEaXNwbGF5LmdldERlZmF1bHQoKSwgU1dULlNIRUxMX1RSSU0pOwotCQkJc2hlbGwuc2V0VGV4dCh1cmxTdHJpbmcpOwotCQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQkJc2hlbGwuc2V0TGF5b3V0KGxheW91dCk7Ci0JCQlCcm93c2VyIHBvcHVwX2Jyb3dzZXIgPSBuZXcgQnJvd3NlcihzaGVsbCwgU1dULk5PTkUpOwotCQkJcG9wdXBfYnJvd3Nlci5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIHRydWUpKTsKLQkJCXBvcHVwX2Jyb3dzZXIuc2V0VXJsKHVybFN0cmluZyk7Ci0JCQlzaGVsbC5vcGVuKCk7Ci0JCQlzdWNjZXNzID0gdHJ1ZTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQlQdWJsaXNoaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGV4KTsKLQkJfQotCQlyZXR1cm4gc3VjY2VzczsKLQl9Ci0KLQkvKioKLQkgKiBvcGVuIGEgYnJvd3NlciB0byBzaG93IHRoZSBwdWJsaXNoZWQgY29udGVudC4KLQkgKiAKLQkgKiBAcGFyYW0gdXJsU3RyaW5nCi0JICogICAgICAgICAgICBTdHJpbmcgdGhlIHNpdGUgdXJsCi0JICogQHJldHVybiBib29sZWFuIHRydWUgaWYgYnJvd3NlciBvcGVuZWQgc3VjY2Vzc2Z1bGx5LgotCSAqLwotCXB1YmxpYyBib29sZWFuIG9wZW5Ccm93c2VyKGZpbmFsIFN0cmluZyB1cmxTdHJpbmcpIHsKLQkJYm9vbGVhbiBzdWNjZXNzID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlpZiAoU1dULmdldFBsYXRmb3JtKCkuZXF1YWxzKCJ3aW4zMiIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQlzdWNjZXNzID0gUHJvZ3JhbS5sYXVuY2godXJsU3RyaW5nKTsKLQkJCX0gZWxzZSB7Ci0JCQkJc3VjY2VzcyA9IHRydWU7Ci0JCQkJSVdlYkJyb3dzZXIgYnJvd3NlciA9IG51bGw7Ci0JCQkJSVdvcmtiZW5jaEJyb3dzZXJTdXBwb3J0IGJyb3dzZXJTdXBwb3J0ID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRCcm93c2VyU3VwcG9ydCgpOwotCQkJCXRyeSB7Ci0JCQkJCWJyb3dzZXIgPSBicm93c2VyU3VwcG9ydC5nZXRFeHRlcm5hbEJyb3dzZXIoKTsKLQkJCQkJaWYgKGJyb3dzZXIgIT0gbnVsbCkgewotCQkJCQkJVVJMIHVybCA9IG5ldyBGaWxlKHVybFN0cmluZykudG9VUkwoKTsKLQkJCQkJCWJyb3dzZXIub3BlblVSTCh1cmwpOwotCQkJCQl9Ci0JCQkJfSBjYXRjaCAoUGFydEluaXRFeGNlcHRpb24gZXgpIHsKLQkJCQkJUHVibGlzaGluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihleCk7Ci0JCQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCVB1Ymxpc2hpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZXgpOwotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVB1Ymxpc2hpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQlzdWNjZXNzID0gZmFsc2U7Ci0JCX0KLQotCQlyZXR1cm4gc3VjY2VzczsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvdWkvd2l6YXJkcy9TZWxlY3RDb25maWdQYWdlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvdWkvd2l6YXJkcy9TZWxlY3RDb25maWdQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2Yzg3NzYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3VpL3dpemFyZHMvU2VsZWN0Q29uZmlnUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLndpemFyZHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJSGVscENvbnRleHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuU3RyVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkNvbXBhcmF0b3JzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLkxpYnJhcnlVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS5QdWJsaXNoaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkuUHVibGlzaGluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51aS53aXphcmRzLkJhc2VXaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudENhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkFycmF5Q29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRhYmxlTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLQotLyoqCi0gKiBBIHdpemFyZCBwYWdlIHRoYXQgcHJvbXB0cyB0aGUgdXNlciB0byBzZWxlY3QgYSBtZXRob2QgY29uZmlndXJhdGlvbiB0bwotICogcHVibGlzaC4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAYXV0aG9yIEJpbmd4dWUgWHUKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBTZWxlY3RDb25maWdQYWdlIGV4dGVuZHMgQmFzZVdpemFyZFBhZ2UgewotCi0JLyoqCi0JICogVGhlIHdpemFyZCBwYWdlIG5hbWUuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFHRV9OQU1FID0gU2VsZWN0Q29uZmlnUGFnZS5jbGFzcy5nZXROYW1lKCk7Ci0KLQlwcm90ZWN0ZWQgVGFibGUgdGFibGU7Ci0KLQlwcm90ZWN0ZWQgVGFibGVWaWV3ZXIgY29uZmlnVmlld2VyOwotCi0JcHJvdGVjdGVkIFRleHQgYnJpZWZEZXNjVGV4dDsKLQotCXByb3RlY3RlZCBMaXN0IHByb2Nlc3NWaWV3czsKLQotCXByb3RlY3RlZCBTdHJpbmcgc2VsZWN0ZWRDb25maWdOYW1lOwotCQotCXByaXZhdGUgTWV0aG9kQ29uZmlndXJhdGlvbiBzZWxlY3RlZENvbmZpZzsKLQotCS8qKgotCSAqIAotCSAqIEBhdXRob3Igc2thbm5vb3IKLQkgKiBAZGVwcmVjYXRlZCAoc2VlIGJlbG93IEFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlci4pCi0JICovCi0JcHJvdGVjdGVkIGNsYXNzIENvbmZpZ3VyYXRpb25UYWJsZUxhYmVsUHJvdmlkZXIgZXh0ZW5kcyBMYWJlbFByb3ZpZGVyCi0JCQlpbXBsZW1lbnRzIElUYWJsZUxhYmVsUHJvdmlkZXIgewotCi0JCXB1YmxpYyBJbWFnZSBnZXRDb2x1bW5JbWFnZShPYmplY3QgZWxlbWVudCwgaW50IGluZGV4KSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uVGV4dChPYmplY3QgZWxlbWVudCwgaW50IGluZGV4KSB7Ci0JCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IChNZXRob2RDb25maWd1cmF0aW9uKSBlbGVtZW50OwotCQkJcmV0dXJuIGNvbmZpZy5nZXROYW1lKCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgSUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlciA9IG5ldyBBZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIoCi0JCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpIHsKLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uVGV4dChPYmplY3Qgb2JqZWN0LCBpbnQgY29sdW1uSW5kZXgpIHsKLQkJCXJldHVybiBzdXBlci5nZXRDb2x1bW5UZXh0KG9iamVjdCwgY29sdW1uSW5kZXgpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBJbWFnZSBnZXRDb2x1bW5JbWFnZShPYmplY3Qgb2JqZWN0LCBpbnQgY29sdW1uSW5kZXgpIHsKLQkJCXJldHVybiBzdXBlci5nZXRDb2x1bW5JbWFnZShvYmplY3QsIGNvbHVtbkluZGV4KTsKLQkJfQotCX07Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBTZWxlY3RDb25maWdQYWdlKCkgewotCQlzdXBlcihQQUdFX05BTUUpOwotCQlzZXRUaXRsZShQdWJsaXNoaW5nVUlSZXNvdXJjZXMuc2VsZWN0Q29uZmlnV2l6YXJkUGFnZV90aXRsZSk7Ci0JCXNldERlc2NyaXB0aW9uKFB1Ymxpc2hpbmdVSVJlc291cmNlcy5zZWxlY3RDb25maWdXaXphcmRQYWdlX3RleHQpOwotCQlzZXRJbWFnZURlc2NyaXB0b3IoUHVibGlzaGluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoCi0JCQkJImZ1bGwvd2l6YmFuL1B1Ymxpc2hDb25maWd1cmF0aW9uLmdpZiIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nUGFnZSNjcmVhdGVDb250cm9sKENvbXBvc2l0ZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IGNyZWF0ZUdyaWRMYXlvdXRDb21wb3NpdGUocGFyZW50LCAxKTsKLQotCQljcmVhdGVMYWJlbChjb21wb3NpdGUsIFB1Ymxpc2hpbmdVSVJlc291cmNlcy5jb25maWdMYWJlbF90ZXh0KTsKLQotCQl0YWJsZSA9IG5ldyBUYWJsZShjb21wb3NpdGUsIFNXVC5CT1JERVIgfCBTV1QuVl9TQ1JPTEwpOwotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQlncmlkRGF0YS5oZWlnaHRIaW50ID0gMTIwOwotCQlncmlkRGF0YS53aWR0aEhpbnQgPSAyODA7Ci0JCXRhYmxlLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0JCWNvbmZpZ1ZpZXdlciA9IG5ldyBUYWJsZVZpZXdlcih0YWJsZSk7Ci0KLQkJY3JlYXRlTGFiZWwoY29tcG9zaXRlLCBBdXRob3JpbmdVSVRleHQuREVTQ1JJUFRJT05fVEVYVCk7Ci0KLQkJYnJpZWZEZXNjVGV4dCA9IGNyZWF0ZU11bHRpTGluZVRleHQoY29tcG9zaXRlLCAiIiwgMzYwLCA4MCwgMSk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0Q29udHJvbHMoKTsKLQotCQlhZGRMaXN0ZW5lcnMoKTsKLQotCQlzZXRDb250cm9sKGNvbXBvc2l0ZSk7Ci0KLQkJUGxhdGZvcm1VSQotCQkJCS5nZXRXb3JrYmVuY2goKQotCQkJCS5nZXRIZWxwU3lzdGVtKCkKLQkJCQkuc2V0SGVscCgKLQkJCQkJCWNvbXBvc2l0ZSwKLQkJCQkJCUF1dGhvcmluZ1VJSGVscENvbnRleHRzLkNPTkZJR1VSQVRJT05fUFVCTElTSF9XSVpBUkRfQUxMX1BBR0VTX0NPTlRFWFQpOwotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemVzIHRoZSB3aXphcmQgcGFnZSBjb250cm9scyB3aXRoIGRhdGEuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdENvbnRyb2xzKCkgewotCQkvLyBjb25maWdWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihuZXcgQ29uZmlndXJhdGlvblRhYmxlTGFiZWxQcm92aWRlcigpKTsKLQkJY29uZmlnVmlld2VyLnNldExhYmVsUHJvdmlkZXIobGFiZWxQcm92aWRlcik7Ci0JCWNvbmZpZ1ZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIobmV3IEFycmF5Q29udGVudFByb3ZpZGVyKCkpOwotCQlNZXRob2RDb25maWd1cmF0aW9uW10gY29uZmlncyA9IExpYnJhcnlTZXJ2aWNlVXRpbAotCQkJCS5nZXRNZXRob2RDb25maWd1cmF0aW9ucyhMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJCQkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKSk7Ci0JCUxpc3Q8T2JqZWN0PiBjb25maWdzTGlzdCA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PigpOwotCQljb25maWdzTGlzdC5hZGRBbGwoQXJyYXlzLmFzTGlzdChjb25maWdzKSk7Ci0JCUNvbGxlY3Rpb25zLnNvcnQoY29uZmlnc0xpc3QsIENvbXBhcmF0b3JzLkRFRkFVTFRfQ09NUEFSQVRPUik7Ci0JCWNvbmZpZ1ZpZXdlci5zZXRJbnB1dChjb25maWdzTGlzdC50b0FycmF5KCkpOwotCQkvLyBjb25maWdWaWV3ZXIuc2V0SW5wdXQoY29uZmlncyk7Ci0KLQkJaWYgKGNvbmZpZ3MubGVuZ3RoID4gMCkgewotCQkJLy8gU2VsZWN0IHRoZSBmaXJzdCBjb25maWcgYW5kIGRpc3BsYXkgaXRzIGJyaWVmIGRlc2NyaXB0aW9uLgotCQkJdGFibGUuc2VsZWN0KDApOwotCQkJc2V0QnJpZWZEZXNjcmlwdGlvbihjb25maWdzWzBdKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEFkZHMgZXZlbnQgaGFuZGxlcnMgdG8gdGhlIHdpemFyZCBwYWdlIGNvbnRyb2xzLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZExpc3RlbmVycygpIHsKLQkJY29uZmlnVmlld2VyCi0JCQkJLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQkJCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQkJCVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKFN0cnVjdHVyZWRTZWxlY3Rpb24pIGV2ZW50Ci0JCQkJCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQkJCQkJCWlmICghc2VsZWN0aW9uLmlzRW1wdHkoKSkgewotCQkJCQkJCU9iamVjdFtdIGNvbmZpZ3MgPSBzZWxlY3Rpb24udG9BcnJheSgpOwotCQkJCQkJCXNldEJyaWVmRGVzY3JpcHRpb24oKE1ldGhvZENvbmZpZ3VyYXRpb24pIGNvbmZpZ3NbMF0pOwotCQkJCQkJfQotCQkJCQkJc2V0UGFnZUNvbXBsZXRlKGlzUGFnZUNvbXBsZXRlKCkpOwotCQkJCQkJZ2V0V2l6YXJkKCkuZ2V0Q29udGFpbmVyKCkudXBkYXRlQnV0dG9ucygpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkUGFnZSNpc0NvbXBsZXRlZCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNQYWdlQ29tcGxldGUoKSB7Ci0JCWlmIChMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCkgPT0gbnVsbCkgewotCQkJc2V0RXJyb3JNZXNzYWdlKExpYnJhcnlVSVJlc291cmNlcy5ub09wZW5MaWJyYXJ5V2FybmluZ19tc2cpOwotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJc2V0RXJyb3JNZXNzYWdlKG51bGwpOwotCi0JCWlmICh0YWJsZS5nZXRTZWxlY3Rpb25Db3VudCgpID4gMCkgewotCQkJVGFibGVJdGVtW10gaXRlbXMgPSB0YWJsZS5nZXRTZWxlY3Rpb24oKTsKLQkJCXNlbGVjdGVkQ29uZmlnTmFtZSA9IGl0ZW1zWzBdLmdldFRleHQoKTsKLQkJCS8qTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSBMaWJyYXJ5U2VydmljZVV0aWwKLQkJCQkJLmdldE1ldGhvZENvbmZpZ3VyYXRpb24oTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKQotCQkJCQkJCS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpLCBzZWxlY3RlZENvbmZpZ05hbWUpOyovCi0JCQkKLQkJCQotCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSAgaXRlbXNbMF0uZ2V0RGF0YSgpIGluc3RhbmNlb2YgTWV0aG9kQ29uZmlndXJhdGlvbiA/Ci0JCQkJCShNZXRob2RDb25maWd1cmF0aW9uKSBpdGVtc1swXS5nZXREYXRhKCkgOiBudWxsOwotCQkJc2V0U2VsZWN0ZWRDb25maWcoY29uZmlnKTsKLQkJCQkJCi0JCQlwcm9jZXNzVmlld3MgPSBudWxsOwotCQkJaWYgKGNvbmZpZyAhPSBudWxsKSB7Ci0JCQkJcHJvY2Vzc1ZpZXdzID0gZ2V0VmFsaWRDb25maWdWaWV3cyhjb25maWcpOwotCQkJfQotCi0JCQlpZiAocHJvY2Vzc1ZpZXdzICE9IG51bGwgJiYgcHJvY2Vzc1ZpZXdzLnNpemUoKSA+IDApIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0gZWxzZSB7Ci0JCQkJc2V0RXJyb3JNZXNzYWdlKFB1Ymxpc2hpbmdVSVJlc291cmNlcy5taXNzaW5nVmlld0Vycm9yX21zZyk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudWkud2l6YXJkcy5CYXNlV2l6YXJkUGFnZSNnZXROZXh0UGFnZURhdGEoKQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0TmV4dFBhZ2VEYXRhKCkgewotCQlyZXR1cm4gZ2V0Q29uZmlnTmFtZSgpOwotCX0KLQotCS8qKgotCSAqIEdldHMgYSBsaXN0IG9mIHZhbGlkIGNvbmZpZ3VyYXRpb24gdmlld3MuCi0JICogCi0JICogQHBhcmFtIGNvbmZpZwotCSAqICAgICAgICAgICAgYSBtZXRob2QgY29uZmlndXJhdGlvbgotCSAqIEByZXR1cm4gYSBsaXN0IG9mIGNvbmZpZ3VyYXRpb24gdmlld3MKLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdDxDb250ZW50Q2F0ZWdvcnk+IGdldFZhbGlkQ29uZmlnVmlld3MoCi0JCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZykgewotCQlTdHJpbmcgbXNnOwotCQlTdHJpbmdCdWZmZXIgbWVzc2FnZSA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJTGlzdDxDb250ZW50Q2F0ZWdvcnk+IHZpZXdzID0gbmV3IEFycmF5TGlzdDxDb250ZW50Q2F0ZWdvcnk+KCk7Ci0JCWZvciAoSXRlcmF0b3I8Q29udGVudENhdGVnb3J5PiBpdCA9IGNvbmZpZy5nZXRQcm9jZXNzVmlld3MoKS5pdGVyYXRvcigpOyBpdAotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQlDb250ZW50Q2F0ZWdvcnkgdmlldyA9IGl0Lm5leHQoKTsKLQkJCWlmIChDb25maWd1cmF0aW9uSGVscGVyLmlzQ29udHJpYnV0b3IodmlldykpIHsKLQkJCQltc2cgPSBQdWJsaXNoaW5nVUlSZXNvdXJjZXMuYmluZCgKLQkJCQkJCVB1Ymxpc2hpbmdVSVJlc291cmNlcy5pbnZhbGlkVmlld0NvbnRyaWJ1dG9ySW5mb19tc2csCi0JCQkJCQl2aWV3LmdldFByZXNlbnRhdGlvbk5hbWUoKSk7Ci0JCQkJbWVzc2FnZS5hcHBlbmQoU3RyVXRpbC5UQUIpLmFwcGVuZChtc2cpLmFwcGVuZCgKLQkJCQkJCVN0clV0aWwuTElORV9GRUVEKTsKLQkJCX0gZWxzZSB7Ci0JCQkJdmlldyA9IChDb250ZW50Q2F0ZWdvcnkpIENvbmZpZ3VyYXRpb25IZWxwZXIKLQkJCQkJCS5nZXRDYWxjdWxhdGVkRWxlbWVudCh2aWV3LCBjb25maWcpOwotCQkJCWlmICh2aWV3ICE9IG51bGwpIHsKLQkJCQkJaWYgKHZpZXdzLmNvbnRhaW5zKHZpZXcpKSB7Ci0JCQkJCQltc2cgPSBQdWJsaXNoaW5nVUlSZXNvdXJjZXMKLQkJCQkJCQkJLmJpbmQoCi0JCQkJCQkJCQkJUHVibGlzaGluZ1VJUmVzb3VyY2VzLmludmFsaWRWaWV3U2FtZVZpZXdJbmZvX21zZywKLQkJCQkJCQkJCQl2aWV3LmdldFByZXNlbnRhdGlvbk5hbWUoKSk7Ci0JCQkJCQltZXNzYWdlLmFwcGVuZChTdHJVdGlsLlRBQikuYXBwZW5kKG1zZykuYXBwZW5kKAotCQkJCQkJCQlTdHJVdGlsLkxJTkVfRkVFRCk7Ci0KLQkJCQkJfSBlbHNlIHsKLQkJCQkJCXZpZXdzLmFkZCh2aWV3KTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWlmIChtZXNzYWdlLmxlbmd0aCgpID4gMCkgewotCQkJbXNnID0gUHVibGlzaGluZ1VJUmVzb3VyY2VzLmJpbmQoCi0JCQkJCVB1Ymxpc2hpbmdVSVJlc291cmNlcy5pbnZhbGlkVmlld3NJbmZvX21zZywgY29uZmlnCi0JCQkJCQkJLmdldE5hbWUoKSk7Ci0JCQltZXNzYWdlLmluc2VydCgwLCBtc2cgKyBTdHJVdGlsLkxJTkVfRkVFRCArIFN0clV0aWwuTElORV9GRUVEKTsKLQotCQkJLy8gRklYTUUhIFNob3VsZCBub3QgZGlzcGxheSB3YXJuaW5nIG1lc3NhZ2VzIGluIHRoZSBicmllZgotCQkJLy8gZGVzY3JpcHRpb24gZmllbGQuCi0JCQlicmllZkRlc2NUZXh0LnNldFRleHQobWVzc2FnZS50b1N0cmluZygpKTsKLQkJfQotCi0JCXJldHVybiB2aWV3czsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSB1c2VyIHNlbGVjdGVkIG1ldGhvZCBjb25maWd1cmF0aW9uLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG5hbWUgb2YgdGhlIHVzZXIgc2VsZWN0ZWQgY29uZmlndXJhdGlvbiBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q29uZmlnTmFtZSgpIHsKLQkJcmV0dXJuIHNlbGVjdGVkQ29uZmlnLmdldE5hbWUoKTsKLQl9Ci0KLQkvKioKLQkgKiBQb3B1bGF0ZXMgdGhlIEJyaWVmIERlc2NyaXB0aW9uIHRleHQgY29udHJvbCB3aXRoIHRoZSBnaXZlbgotCSAqIGNvbmZpZ3VyYXRpb24ncyBicmllZiBkZXNjcmlwdGlvbi4KLQkgKi8KLQlwcml2YXRlIHZvaWQgc2V0QnJpZWZEZXNjcmlwdGlvbihNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZykgewotCQlicmllZkRlc2NUZXh0LnNldFRleHQoY29uZmlnLmdldEJyaWVmRGVzY3JpcHRpb24oKSk7Ci0JfQotCi0JcHVibGljIE1ldGhvZENvbmZpZ3VyYXRpb24gZ2V0U2VsZWN0ZWRDb25maWcoKSB7Ci0JCXJldHVybiBzZWxlY3RlZENvbmZpZzsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0U2VsZWN0ZWRDb25maWcoTWV0aG9kQ29uZmlndXJhdGlvbiBzZWxlY3RlZENvbmZpZykgewotCQl0aGlzLnNlbGVjdGVkQ29uZmlnID0gc2VsZWN0ZWRDb25maWc7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvdWkvd2l6YXJkcy9TZWxlY3RDb250ZW50UGFnZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3VpL3dpemFyZHMvU2VsZWN0Q29udGVudFBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjlkNGEyYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvdWkvd2l6YXJkcy9TZWxlY3RDb250ZW50UGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzY4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLndpemFyZHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkudmlld3MuUHJvY2Vzc1RyZWVDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkudmlld3MuUHJvY2Vzc1RyZWVMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLnZpZXdzLlByb2Nlc3NUcmVlVUlGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkuUHVibGlzaGluZ1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLlB1Ymxpc2hpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS5wcmVmZXJlbmNlcy5QdWJsaXNoaW5nVUlQcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudWkud2l6YXJkcy5CYXNlV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ2FwYWJpbGl0eVBhdHRlcm47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyeVByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNoZWNrU3RhdGVDaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DaGVja2JveFRyZWVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ2hlY2tTdGF0ZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRyZWVDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci0KLS8qKgotICogQSB3aXphcmQgcGFnZSB0aGF0IHByb21wdHMgdGhlIHVzZXIgdG8gcHVibGlzaCB0aGUgZW50aXJlIG1ldGhvZAotICogY29uZmlndXJhdGlvbiBvciBvbmx5IHNwZWNpZmljIHByb2Nlc3NlcyBpbiB0aGUgY29uZmlndXJhdGlvbi4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAYXV0aG9yIEJpbmd4dWUgWHUKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBTZWxlY3RDb250ZW50UGFnZSBleHRlbmRzIEJhc2VXaXphcmRQYWdlIGltcGxlbWVudHMgTGlzdGVuZXIgewotCi0JLyoqCi0JICogVGhlIHdpemFyZCBwYWdlIG5hbWUuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFHRV9OQU1FID0gU2VsZWN0Q29udGVudFBhZ2UuY2xhc3MuZ2V0TmFtZSgpOwotCi0JcHJvdGVjdGVkIEJ1dHRvbiBwdWJsaXNoQ29uZmlnUmFkaW9CdXR0b247Ci0KLQlwcm90ZWN0ZWQgQnV0dG9uIHB1Ymxpc2hQcm9jZXNzZXNSYWRpb0J1dHRvbjsKLQotCXByb3RlY3RlZCBDaGVja2JveFRyZWVWaWV3ZXIgcHJvY2Vzc1ZpZXdlcjsKLQotCXByb3RlY3RlZCBCdXR0b24gaW5jbHVkZUJhc2VQcm9jZXNzZXNDaGVja2JveDsKLQotCXByb3RlY3RlZCBNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZzsKLQotCXByb3RlY3RlZCBjbGFzcyBQcm9jZXNzVmlld2VyQ29udGVudFByb3ZpZGVyIGV4dGVuZHMKLQkJCVByb2Nlc3NUcmVlQ29udGVudFByb3ZpZGVyIHsKLQotCQlwcml2YXRlIExpc3Q8TWV0aG9kUGFja2FnZT4gcGFja2FnZXMgPSBuZXcgQXJyYXlMaXN0PE1ldGhvZFBhY2thZ2U+KCk7Ci0KLQkJLyoqCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVHJlZUNvbnRlbnRQcm92aWRlciNpbnB1dENoYW5nZWQoVmlld2VyLAotCQkgKiAgICAgIE9iamVjdCwgT2JqZWN0KQotCQkgKi8KLQkJcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvbGRJbnB1dCwgT2JqZWN0IG5ld0lucHV0KSB7Ci0JCQlzdXBlci5pbnB1dENoYW5nZWQodmlld2VyLCBvbGRJbnB1dCwgbmV3SW5wdXQpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVHJlZUNvbnRlbnRQcm92aWRlciNnZXRDaGlsZHJlbihPYmplY3QpCi0JCSAqLwotCQlwdWJsaWMgT2JqZWN0W10gZ2V0Q2hpbGRyZW4oT2JqZWN0IHBhcmVudEVsZW1lbnQpIHsKLQkJCWlmIChwYXJlbnRFbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kQ29uZmlndXJhdGlvbikgewotCQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gKE1ldGhvZENvbmZpZ3VyYXRpb24pIHBhcmVudEVsZW1lbnQ7Ci0JCQkJTGlzdDxPYmplY3Q+IGNoaWxkcmVuID0gbmV3IEFycmF5TGlzdDxPYmplY3Q+KCk7Ci0JCQkJcGFja2FnZXMgPSBjb25maWcuZ2V0TWV0aG9kUGFja2FnZVNlbGVjdGlvbigpOwotCQkJCUxpc3Q8TWV0aG9kUGx1Z2luPiBwbHVnaW5zID0gY29uZmlnLmdldE1ldGhvZFBsdWdpblNlbGVjdGlvbigpOwotCQkJCWZvciAoSXRlcmF0b3I8TWV0aG9kUGx1Z2luPiBpdCA9IHBsdWdpbnMuaXRlcmF0b3IoKTsgaXQKLQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSBpdC5uZXh0KCk7Ci0JCQkJCUxpc3Q8UHJvY2Vzcz4gcHJvY2Vzc2VzID0gVG5nVXRpbC5nZXRBbGxQcm9jZXNzZXMocGx1Z2luKTsKLQkJCQkJaWYgKHByb2Nlc3Nlcy5zaXplKCkgPiAwKSB7Ci0JCQkJCQljaGlsZHJlbi5hZGQocGx1Z2luKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlyZXR1cm4gY2hpbGRyZW4udG9BcnJheSgpOwotCQkJfSBlbHNlIGlmIChwYXJlbnRFbGVtZW50IGluc3RhbmNlb2YgUHJvY2Vzc1RyZWVVSUZvbGRlcikgewotCQkJCVByb2Nlc3NUcmVlVUlGb2xkZXIgdWlGb2xkZXIgPSAoUHJvY2Vzc1RyZWVVSUZvbGRlcikgcGFyZW50RWxlbWVudDsKLQkJCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gKE1ldGhvZFBsdWdpbikgdWlGb2xkZXIuZ2V0UGFyZW50KCk7Ci0JCQkJaWYgKHVpRm9sZGVyLmdldE5hbWUoKSA9PSBDQVBBQklMSVRZX1BBVFRFUk5TKSB7Ci0JCQkJCUxpc3Q8Q2FwYWJpbGl0eVBhdHRlcm4+IHNlbGVjdGVkQ2FwYWJpbGl0eVBhdHRlcm5zID0gbmV3IEFycmF5TGlzdDxDYXBhYmlsaXR5UGF0dGVybj4oKTsKLQkJCQkJTGlzdDxDYXBhYmlsaXR5UGF0dGVybj4gY2FwYWJpbGl0eVBhdHRlcm5zID0gTGlicmFyeVNlcnZpY2VVdGlsCi0JCQkJCQkJLmdldENhcGFiaWxpdHlQYXR0ZXJucyhwbHVnaW4pOwotCQkJCQlmb3IgKEl0ZXJhdG9yPENhcGFiaWxpdHlQYXR0ZXJuPiBpdCA9IGNhcGFiaWxpdHlQYXR0ZXJucwotCQkJCQkJCS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlDYXBhYmlsaXR5UGF0dGVybiBjcCA9IGl0Lm5leHQoKTsKLQkJCQkJCVByb2Nlc3NQYWNrYWdlIHBrZyA9IFVtYVV0aWwuZ2V0UHJvY2Vzc1BhY2thZ2UoY3ApOwotCQkJCQkJaWYgKHBhY2thZ2VzLmNvbnRhaW5zKHBrZykpIHsKLQkJCQkJCQlzZWxlY3RlZENhcGFiaWxpdHlQYXR0ZXJucy5hZGQoY3ApOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCXJldHVybiBzZWxlY3RlZENhcGFiaWxpdHlQYXR0ZXJucy50b0FycmF5KCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJTGlzdDxEZWxpdmVyeVByb2Nlc3M+IHNlbGVjdGVkRGVsaXZlcnlQcm9jZXNzZXMgPSBuZXcgQXJyYXlMaXN0PERlbGl2ZXJ5UHJvY2Vzcz4oKTsKLQkJCQkJTGlzdDxEZWxpdmVyeVByb2Nlc3M+IGRlbGl2ZXJ5UHJvY2Vzc2VzID0gTGlicmFyeVNlcnZpY2VVdGlsCi0JCQkJCQkJLmdldERlbGl2ZXJ5UHJvY2Vzc2VzKHBsdWdpbik7Ci0JCQkJCWZvciAoSXRlcmF0b3I8RGVsaXZlcnlQcm9jZXNzPiBpdCA9IGRlbGl2ZXJ5UHJvY2Vzc2VzCi0JCQkJCQkJLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQkJCURlbGl2ZXJ5UHJvY2VzcyBkcCA9IGl0Lm5leHQoKTsKLQkJCQkJCVByb2Nlc3NQYWNrYWdlIHBrZyA9IFVtYVV0aWwuZ2V0UHJvY2Vzc1BhY2thZ2UoZHApOwotCQkJCQkJaWYgKHBhY2thZ2VzLmNvbnRhaW5zKHBrZykpIHsKLQkJCQkJCQlzZWxlY3RlZERlbGl2ZXJ5UHJvY2Vzc2VzLmFkZChkcCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIHNlbGVjdGVkRGVsaXZlcnlQcm9jZXNzZXMudG9BcnJheSgpOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJcmV0dXJuIHN1cGVyLmdldENoaWxkcmVuKHBhcmVudEVsZW1lbnQpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgU2VsZWN0Q29udGVudFBhZ2UoKSB7Ci0JCXN1cGVyKFBBR0VfTkFNRSk7Ci0JCXNldFRpdGxlKFB1Ymxpc2hpbmdVSVJlc291cmNlcy5zZWxlY3RDb250ZW50V2l6YXJkUGFnZV90aXRsZSk7Ci0JCXNldERlc2NyaXB0aW9uKFB1Ymxpc2hpbmdVSVJlc291cmNlcy5zZWxlY3RDb250ZW50V2l6YXJkUGFnZV90ZXh0KTsKLQkJc2V0SW1hZ2VEZXNjcmlwdG9yKFB1Ymxpc2hpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKAotCQkJCSJmdWxsL3dpemJhbi9QdWJsaXNoQ29uZmlndXJhdGlvbi5naWYiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ1BhZ2UjY3JlYXRlQ29udHJvbChDb21wb3NpdGUpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBjcmVhdGVHcmlkTGF5b3V0Q29tcG9zaXRlKHBhcmVudCwgMSk7Ci0KLQkJcHVibGlzaENvbmZpZ1JhZGlvQnV0dG9uID0gY3JlYXRlUmFkaW9CdXR0b24oY29tcG9zaXRlLAotCQkJCVB1Ymxpc2hpbmdVSVJlc291cmNlcy5wdWJsaXNoQ29uZmlnUmFkaW9CdXR0b25fdGV4dCwgMSwgdHJ1ZSk7Ci0KLQkJcHVibGlzaFByb2Nlc3Nlc1JhZGlvQnV0dG9uID0gY3JlYXRlUmFkaW9CdXR0b24oY29tcG9zaXRlLAotCQkJCVB1Ymxpc2hpbmdVSVJlc291cmNlcy5wdWJsaXNoUHJvY2Vzc2VzUmFkaW9CdXR0b25fdGV4dCwgMSwKLQkJCQlmYWxzZSk7Ci0KLQkJQ29tcG9zaXRlIHByb2Nlc3NDb21wb3NpdGUgPSBjcmVhdGVDaGlsZEdyaWRMYXlvdXRDb21wb3NpdGUoY29tcG9zaXRlLAotCQkJCTEpOwotCi0JCXByb2Nlc3NWaWV3ZXIgPSBuZXcgQ2hlY2tib3hUcmVlVmlld2VyKHByb2Nlc3NDb21wb3NpdGUpOwotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgKLQkJCQl8IEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTCk7Ci0JCWdyaWREYXRhLmhlaWdodEhpbnQgPSAzMDA7Ci0JCXByb2Nlc3NWaWV3ZXIuZ2V0VHJlZSgpLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0JCWluY2x1ZGVCYXNlUHJvY2Vzc2VzQ2hlY2tib3ggPSBjcmVhdGVDaGVja2JveChwcm9jZXNzQ29tcG9zaXRlLAotCQkJCVB1Ymxpc2hpbmdVSVJlc291cmNlcy5pbmNsdWRlQmFzZVByb2Nlc3Nlc0NoZWNrYm94TGFiZWxfdGV4dCk7Ci0KLQkJaW5pdENvbnRyb2xzKCk7Ci0KLQkJYWRkTGlzdGVuZXJzKCk7Ci0KLQkJc2V0Q29udHJvbChjb21wb3NpdGUpOwotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemVzIHRoZSB3aXphcmQgcGFnZSBjb250cm9scyB3aXRoIGRhdGEuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdENvbnRyb2xzKCkgewotCQlwcm9jZXNzVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgUHJvY2Vzc1ZpZXdlckNvbnRlbnRQcm92aWRlcigpKTsKLQkJcHJvY2Vzc1ZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKG5ldyBQcm9jZXNzVHJlZUxhYmVsUHJvdmlkZXIoKSk7Ci0KLQkJU3RyaW5nIGNvbmZpZ0lkID0gY29uZmlnICE9IG51bGwgPyBjb25maWcuZ2V0R3VpZCgpIDogIiI7IC8vJE5PTi1OTFMtMSQKLQkJYm9vbGVhbiBwdWJsaXNoQ29uZmlnID0gUHVibGlzaGluZ1VJUHJlZmVyZW5jZXMKLQkJCQkuZ2V0UHVibGlzaEVudGlyZUNvbmZpZyhjb25maWdJZCk7Ci0JCXB1Ymxpc2hDb25maWdSYWRpb0J1dHRvbi5zZXRTZWxlY3Rpb24ocHVibGlzaENvbmZpZyk7Ci0JCXB1Ymxpc2hQcm9jZXNzZXNSYWRpb0J1dHRvbi5zZXRTZWxlY3Rpb24oIXB1Ymxpc2hDb25maWcpOwotCQlwcm9jZXNzVmlld2VyLmdldENvbnRyb2woKS5zZXRFbmFibGVkKCFwdWJsaXNoQ29uZmlnKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIGV2ZW50IGhhbmRsZXJzIHRvIHRoZSB3aXphcmQgcGFnZSBjb250cm9scy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRMaXN0ZW5lcnMoKSB7Ci0JCXB1Ymxpc2hDb25maWdSYWRpb0J1dHRvbi5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCB0aGlzKTsKLQkJcHVibGlzaFByb2Nlc3Nlc1JhZGlvQnV0dG9uLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIHRoaXMpOwotCQlpbmNsdWRlQmFzZVByb2Nlc3Nlc0NoZWNrYm94LmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIHRoaXMpOwotCi0JCXByb2Nlc3NWaWV3ZXIuYWRkQ2hlY2tTdGF0ZUxpc3RlbmVyKG5ldyBJQ2hlY2tTdGF0ZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgY2hlY2tTdGF0ZUNoYW5nZWQoQ2hlY2tTdGF0ZUNoYW5nZWRFdmVudCBldmVudCkgewotCQkJCU9iamVjdCBjaGVja2VkRWxlbWVudCA9IGV2ZW50LmdldEVsZW1lbnQoKTsKLQkJCQlib29sZWFuIGNoZWNrZWQgPSBldmVudC5nZXRDaGVja2VkKCk7Ci0KLQkJCQlwcm9jZXNzVmlld2VyLnNldENoZWNrZWQoY2hlY2tlZEVsZW1lbnQsIGNoZWNrZWQpOwotCQkJCXByb2Nlc3NWaWV3ZXIuc2V0U3VidHJlZUNoZWNrZWQoY2hlY2tlZEVsZW1lbnQsIGNoZWNrZWQpOwotCQkJCWlmIChpbmNsdWRlQmFzZVByb2Nlc3Nlc0NoZWNrYm94LmdldFNlbGVjdGlvbigpKSB7Ci0JCQkJCXNlbGVjdEJhc2VQcm9jZXNzZXMoKTsKLQkJCQl9Ci0JCQkJdXBkYXRlQ2hlY2tlZFN0YXRlcygpOwotCi0JCQkJc2V0UGFnZUNvbXBsZXRlKGlzUGFnZUNvbXBsZXRlKCkpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQkvKioKLQkgKiBVcGRhdGVzIHRoZSBjaGVjayBzdGF0ZXMgb2YgcHJvY2VzcyB0cmVlIHZpZXdlci4KLQkgKi8KLQlwcml2YXRlIHZvaWQgdXBkYXRlQ2hlY2tlZFN0YXRlcygpIHsKLQkJSVRyZWVDb250ZW50UHJvdmlkZXIgY3AgPSAoSVRyZWVDb250ZW50UHJvdmlkZXIpIHByb2Nlc3NWaWV3ZXIKLQkJCQkuZ2V0Q29udGVudFByb3ZpZGVyKCk7Ci0JCWlmIChjb25maWcgIT0gbnVsbCkgewotCQkJT2JqZWN0W10gcGx1Z2lucyA9IGNwLmdldENoaWxkcmVuKGNvbmZpZyk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHBsdWdpbnMubGVuZ3RoOyBpKyspIHsKLQkJCQlPYmplY3RbXSB1aUZvbGRlcnMgPSBjcC5nZXRDaGlsZHJlbihwbHVnaW5zW2ldKTsKLQkJCQlpbnQgdG90YWxVSUZvbGRlcnMgPSB1aUZvbGRlcnMubGVuZ3RoOwotCQkJCWludCBjaGVja2VkVUlGb2xkZXJzID0gMDsKLQkJCQlmb3IgKGludCBqID0gMDsgaiA8IHVpRm9sZGVycy5sZW5ndGg7IGorKykgewotCQkJCQlPYmplY3RbXSBwcm9jZXNzZXMgPSBjcC5nZXRDaGlsZHJlbih1aUZvbGRlcnNbal0pOwotCQkJCQlpbnQgdG90YWxQcm9jZXNzZXMgPSBwcm9jZXNzZXMubGVuZ3RoOwotCQkJCQlpbnQgY2hlY2tlZFByb2Nlc3NlcyA9IDA7Ci0JCQkJCWZvciAoaW50IGsgPSAwOyBrIDwgcHJvY2Vzc2VzLmxlbmd0aDsgaysrKSB7Ci0JCQkJCQlpZiAocHJvY2Vzc1ZpZXdlci5nZXRDaGVja2VkKHByb2Nlc3Nlc1trXSkpIHsKLQkJCQkJCQljaGVja2VkUHJvY2Vzc2VzKys7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJaWYgKGNoZWNrZWRQcm9jZXNzZXMgPT0gMCkgewotCQkJCQkJcHJvY2Vzc1ZpZXdlci5zZXRHcmF5Q2hlY2tlZCh1aUZvbGRlcnNbal0sIGZhbHNlKTsKLQkJCQkJfSBlbHNlIGlmIChjaGVja2VkUHJvY2Vzc2VzID09IHRvdGFsUHJvY2Vzc2VzKSB7Ci0JCQkJCQlwcm9jZXNzVmlld2VyLnNldEdyYXllZCh1aUZvbGRlcnNbal0sIGZhbHNlKTsKLQkJCQkJCXByb2Nlc3NWaWV3ZXIuc2V0Q2hlY2tlZCh1aUZvbGRlcnNbal0sIHRydWUpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJcHJvY2Vzc1ZpZXdlci5zZXRHcmF5Q2hlY2tlZCh1aUZvbGRlcnNbal0sIHRydWUpOwotCQkJCQl9Ci0JCQkJCWlmIChwcm9jZXNzVmlld2VyLmdldENoZWNrZWQodWlGb2xkZXJzW2pdKSkgewotCQkJCQkJY2hlY2tlZFVJRm9sZGVycysrOwotCQkJCQl9Ci0JCQkJfQotCQkJCWlmIChjaGVja2VkVUlGb2xkZXJzID09IHRvdGFsVUlGb2xkZXJzKSB7Ci0JCQkJCXByb2Nlc3NWaWV3ZXIuc2V0R3JheWVkKHBsdWdpbnNbaV0sIGZhbHNlKTsKLQkJCQkJcHJvY2Vzc1ZpZXdlci5zZXRDaGVja2VkKHBsdWdpbnNbaV0sIHRydWUpOwotCQkJCX0gZWxzZSBpZiAoY2hlY2tlZFVJRm9sZGVycyA9PSAwKSB7Ci0JCQkJCXByb2Nlc3NWaWV3ZXIuc2V0R3JheUNoZWNrZWQocGx1Z2luc1tpXSwgZmFsc2UpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXByb2Nlc3NWaWV3ZXIuc2V0R3JheUNoZWNrZWQocGx1Z2luc1tpXSwgdHJ1ZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogU2VsZWN0cyB0aGUgcmVmZXJlbmNlZCBiYXNlIHByb2Nlc3NlcyBpbiB0aGUgcHJvY2VzcyB0cmVlIHZpZXdlci4KLQkgKi8KLQlwcml2YXRlIHZvaWQgc2VsZWN0QmFzZVByb2Nlc3NlcygpIHsKLQkJLy8gR2V0IHRoZSByZWZlcmVuY2VkIGJhc2UgcHJvY2Vzc2VzLgotCQlMaXN0PFByb2Nlc3M+IHByb2Nlc3NlcyA9IGdldFNlbGVjdGVkUHJvY2Vzc2VzKCk7Ci0JCUxpc3Q8UHJvY2Vzcz4gYmFzZVByb2Nlc3NlcyA9IG5ldyBBcnJheUxpc3Q8UHJvY2Vzcz4oKTsKLQkJZm9yIChJdGVyYXRvciBpdCA9IHByb2Nlc3Nlcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlDb25maWd1cmF0aW9uSGVscGVyLmdldEJhc2VQcm9jZXNzZXMoKEFjdGl2aXR5KSBpdC5uZXh0KCksIGNvbmZpZywKLQkJCQkJYmFzZVByb2Nlc3Nlcyk7Ci0JCX0KLQotCQkvLyBVcGRhdGUgdGhlIHByb2Nlc3MgdHJlZSB2aWV3ZXIuCi0JCWZvciAoSXRlcmF0b3IgaXQgPSBiYXNlUHJvY2Vzc2VzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gaXQubmV4dCgpOwotCQkJcHJvY2Vzc1ZpZXdlci5zZXRDaGVja2VkKGVsZW1lbnQsIHRydWUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lciNoYW5kbGVFdmVudChFdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQlwcm9jZXNzVmlld2VyLmdldENvbnRyb2woKS5zZXRFbmFibGVkKAotCQkJCXB1Ymxpc2hQcm9jZXNzZXNSYWRpb0J1dHRvbi5nZXRTZWxlY3Rpb24oKSk7Ci0KLQkJaWYgKGV2ZW50LndpZGdldCA9PSBpbmNsdWRlQmFzZVByb2Nlc3Nlc0NoZWNrYm94KSB7Ci0JCQkvLyBJZiBzZWxlY3RlZCwgc2VsZWN0IGFsbCByZWZlcmVuY2VkIGJhc2UgcHJvY2Vzc2VzLgotCQkJc2VsZWN0QmFzZVByb2Nlc3NlcygpOwotCQkJdXBkYXRlQ2hlY2tlZFN0YXRlcygpOwotCQl9Ci0KLQkJc2V0UGFnZUNvbXBsZXRlKGlzUGFnZUNvbXBsZXRlKCkpOwotCQlnZXRXaXphcmQoKS5nZXRDb250YWluZXIoKS51cGRhdGVCdXR0b25zKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudWkud2l6YXJkcy5CYXNlV2l6YXJkUGFnZSNvbkVudGVyUGFnZShPYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgb25FbnRlclBhZ2UoT2JqZWN0IG9iaikgewotCQlpZiAob2JqICE9IG51bGwgJiYgb2JqIGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0JCQlTdHJpbmcgY29uZmlnTmFtZSA9IChTdHJpbmcpIG9iajsKLQkJCWNvbmZpZyA9IExpYnJhcnlTZXJ2aWNlVXRpbC5nZXRNZXRob2RDb25maWd1cmF0aW9uKExpYnJhcnlTZXJ2aWNlCi0JCQkJCS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCksIGNvbmZpZ05hbWUpOwotCQkJaWYgKGNvbmZpZyAhPSBudWxsKSB7Ci0JCQkJcHJvY2Vzc1ZpZXdlci5zZXRJbnB1dChjb25maWcpOwotCQkJCXByb2Nlc3NWaWV3ZXIuZXhwYW5kQWxsKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlI2lzUGFnZUNvbXBsZXRlZCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNQYWdlQ29tcGxldGUoKSB7Ci0JCWlmIChnZXRFcnJvck1lc3NhZ2UoKSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJaWYgKHB1Ymxpc2hDb25maWdSYWRpb0J1dHRvbi5nZXRTZWxlY3Rpb24oKSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGdldFNlbGVjdGVkUHJvY2Vzc2VzKCkuc2l6ZSgpID4gMDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51aS53aXphcmRzLkJhc2VXaXphcmRQYWdlI2dldE5leHRQYWdlRGF0YSgpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXROZXh0UGFnZURhdGEoKSB7Ci0JCXJldHVybiBjb25maWc7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgdXNlciBzcGVjaWZpZWQgc2VsZWN0ZWQgcHJvY2Vzc2VzIHRvIGJlIHB1Ymxpc2hlZC4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgbGlzdCBvZiA8Y29kZT5Qcm9jZXNzPC9jb2RlPgotCSAqLwotCXB1YmxpYyBib29sZWFuIGdldFB1Ymxpc2hDb25maWdTZWxlY3Rpb24oKSB7Ci0JCXJldHVybiBwdWJsaXNoQ29uZmlnUmFkaW9CdXR0b24uZ2V0U2VsZWN0aW9uKCk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyBhbGwgdGhlIHVzZXIgc2VsZWN0ZWQgcHJvY2Vzc2VzIHRvIGJlIHB1Ymxpc2hlZC4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgbGlzdCBvZiA8Y29kZT5Qcm9jZXNzPC9jb2RlPgotCSAqLwotCXB1YmxpYyBMaXN0PFByb2Nlc3M+IGdldFNlbGVjdGVkUHJvY2Vzc2VzKCkgewotCQlMaXN0PFByb2Nlc3M+IHByb2Nlc3NlcyA9IG5ldyBBcnJheUxpc3Q8UHJvY2Vzcz4oKTsKLQkJT2JqZWN0W10gc2VsZWN0ZWQgPSBwcm9jZXNzVmlld2VyLmdldENoZWNrZWRFbGVtZW50cygpOwotCQlpZiAoc2VsZWN0ZWQgIT0gbnVsbCAmJiBzZWxlY3RlZC5sZW5ndGggPiAwKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNlbGVjdGVkLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKHNlbGVjdGVkW2ldIGluc3RhbmNlb2YgUHJvY2VzcykgewotCQkJCQlwcm9jZXNzZXMuYWRkKChQcm9jZXNzKSBzZWxlY3RlZFtpXSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBwcm9jZXNzZXM7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvdWkvd2l6YXJkcy9TZWxlY3REZXN0aW5hdGlvblBhZ2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy91aS93aXphcmRzL1NlbGVjdERlc3RpbmF0aW9uUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZDc3YjQzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy91aS93aXphcmRzL1NlbGVjdERlc3RpbmF0aW9uUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzk0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLndpemFyZHM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpLnV0aWwuQ29tbW9uUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5TdHJVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLlB1Ymxpc2hpbmdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS5QdWJsaXNoaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkucHJlZmVyZW5jZXMuUHVibGlzaGluZ1VJUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVpLndpemFyZHMuQmFzZVdpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpcmVjdG9yeURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLQotLyoqCi0gKiBBIHdpemFyZCBwYWdlIHRoYXQgcHJvbXB0cyB0aGUgdXNlciB0byBzZWxlY3QgdGhlIGRlc3RpbmF0aW9uIGRpcmVjdG9yeSBhbmQKLSAqIGZvcm1hdCBmb3IgdGhlIHB1Ymxpc2hlZCB3ZWIgc2l0ZS4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4yCi0gKi8KLXB1YmxpYyBjbGFzcyBTZWxlY3REZXN0aW5hdGlvblBhZ2UgZXh0ZW5kcyBCYXNlV2l6YXJkUGFnZSB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQUdFX05BTUUgPSBTZWxlY3REZXN0aW5hdGlvblBhZ2UuY2xhc3MKLQkJCS5nZXROYW1lKCk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGRVJFTkNFX0RFTElNSVRFUiA9ICJ8IjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1BMSVRfUFJFRkVSRU5DRV9ERUxJTUlURVIgPSAiXFwiICsgUFJFRkVSRU5DRV9ERUxJTUlURVI7Ly8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBTdHJpbmcgZGVmYXVsdFBhdGggPSBQdWJsaXNoaW5nVUlQcmVmZXJlbmNlcwotCQkJLmdldERlZmF1bHRQdWJsaXNoUGF0aCgpOwotCi0JcHJvdGVjdGVkIFNoZWxsIHNoZWxsOwotCi0JcHJvdGVjdGVkIENvbWJvIGRpckNvbWJvOwotCi0JcHJvdGVjdGVkIEJ1dHRvbiBicm93c2VCdXR0b247Ci0KLQlwcm90ZWN0ZWQgR3JvdXAgd2ViQXBwR3JvdXA7Ci0KLQlwcm90ZWN0ZWQgQnV0dG9uIHN0YXRpY1dlYlNpdGVSYWRpb0J1dHRvbjsKLQotCXByb3RlY3RlZCBDb21wb3NpdGUgc3RhdGljV2ViU2l0ZUNvbXBvc2l0ZTsKLQotCXByb3RlY3RlZCBCdXR0b24gamF2YVdlYkFwcFJhZGlvQnV0dG9uOwotCi0JcHJvdGVjdGVkIENvbXBvc2l0ZSBqYXZhV2ViQXBwQ29tcG9zaXRlOwotCi0JcHJvdGVjdGVkIExhYmVsIHdlYkFwcE5hbWVMYWJlbDsKLQotCXByb3RlY3RlZCBDb21ibyB3ZWJBcHBOYW1lQ29tYm87Ci0KLQlwcm90ZWN0ZWQgQnV0dG9uIGluY2x1ZGVTZWFyY2hDaGVja2JveDsKLQotCXByb3RlY3RlZCBNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZzsKLQkKLQlwcm90ZWN0ZWQgQ29tcG9zaXRlIGNvbXBvc2l0ZTsKLQotCXByb3RlY3RlZCBMaXN0PE1ldGhvZENvbmZpZ3VyYXRpb24+IHNlbGVjdGVkQ29uZmlncyA9IG5ldyBBcnJheUxpc3Q8TWV0aG9kQ29uZmlndXJhdGlvbj4oKTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFNlbGVjdERlc3RpbmF0aW9uUGFnZShTdHJpbmcgcGFnZU5hbWUpIHsKLQkJc3VwZXIocGFnZU5hbWUsCi0JCQkJUHVibGlzaGluZ1VJUmVzb3VyY2VzLnNlbGVjdERlc3RpbmF0aW9uV2l6YXJkUGFnZV90aXRsZSwKLQkJCQlQdWJsaXNoaW5nVUlSZXNvdXJjZXMuc2VsZWN0RGVzdGluYXRpb25XaXphcmRQYWdlX3RleHQsCi0JCQkJUHVibGlzaGluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoCi0JCQkJCQkiZnVsbC93aXpiYW4vUHVibGlzaENvbmZpZ3VyYXRpb24uZ2lmIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgU2VsZWN0RGVzdGluYXRpb25QYWdlKCkgewotCQl0aGlzKFBBR0VfTkFNRSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dQYWdlI2NyZWF0ZUNvbnRyb2woQ29tcG9zaXRlKQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCQlzaGVsbCA9IHBhcmVudC5nZXRTaGVsbCgpOwotCi0JCWNvbXBvc2l0ZSA9IGNyZWF0ZUdyaWRMYXlvdXRDb21wb3NpdGUocGFyZW50LCAxKTsKLQotCQlDb21wb3NpdGUgZGlyQ29tcG9zaXRlID0gY3JlYXRlR3JpZExheW91dENvbXBvc2l0ZShjb21wb3NpdGUsIDMpOwotCi0JCWNyZWF0ZUxhYmVsKGRpckNvbXBvc2l0ZSwgUHVibGlzaGluZ1VJUmVzb3VyY2VzLmRpckxhYmVsX3RleHQpOwotCi0JCWRpckNvbWJvID0gY3JlYXRlQ29tYm9ib3goZGlyQ29tcG9zaXRlKTsKLQotCQlicm93c2VCdXR0b24gPSBjcmVhdGVCdXR0b24oZGlyQ29tcG9zaXRlLAotCQkJCUF1dGhvcmluZ1VJVGV4dC5CUk9XU0VfQlVUVE9OX1RFWFQpOwotCi0JCXdlYkFwcEdyb3VwID0gc3VwZXIuY3JlYXRlR3JpZExheW91dEdyb3VwKGNvbXBvc2l0ZSwKLQkJCQlQdWJsaXNoaW5nVUlSZXNvdXJjZXMud2ViQXBwR3JvdXBfdGV4dCwgMSk7Ci0KLQkJc3RhdGljV2ViU2l0ZVJhZGlvQnV0dG9uID0gY3JlYXRlUmFkaW9CdXR0b24od2ViQXBwR3JvdXAsCi0JCQkJUHVibGlzaGluZ1VJUmVzb3VyY2VzLnN0YXRpY1dlYlNpdGVSYWRpb0J1dHRvbl90ZXh0KTsKLQotCQlzdGF0aWNXZWJTaXRlQ29tcG9zaXRlID0gY3JlYXRlQ2hpbGRHcmlkTGF5b3V0Q29tcG9zaXRlKHdlYkFwcEdyb3VwLCAxKTsKLQotCQlqYXZhV2ViQXBwUmFkaW9CdXR0b24gPSBjcmVhdGVSYWRpb0J1dHRvbih3ZWJBcHBHcm91cCwKLQkJCQlQdWJsaXNoaW5nVUlSZXNvdXJjZXMuZHluYW1pY1dlYkFwcFJhZGlvQnV0dG9uX3RleHQpOwotCi0JCWphdmFXZWJBcHBDb21wb3NpdGUgPSBjcmVhdGVDaGlsZEdyaWRMYXlvdXRDb21wb3NpdGUod2ViQXBwR3JvdXAsIDMpOwotCi0JCWluY2x1ZGVTZWFyY2hDaGVja2JveCA9IGNyZWF0ZUNoZWNrYm94KGphdmFXZWJBcHBDb21wb3NpdGUsCi0JCQkJUHVibGlzaGluZ1VJUmVzb3VyY2VzLmluY2x1ZGVTZWFyY2hDaGVja2JveF90ZXh0LCAzKTsKLQotCQl3ZWJBcHBOYW1lTGFiZWwgPSBjcmVhdGVMYWJlbChqYXZhV2ViQXBwQ29tcG9zaXRlLAotCQkJCVB1Ymxpc2hpbmdVSVJlc291cmNlcy53ZWJBcHBsaWNhdGlvbk5hbWVMYWJlbF90ZXh0KTsKLQotCQl3ZWJBcHBOYW1lQ29tYm8gPSBjcmVhdGVDb21ib2JveChqYXZhV2ViQXBwQ29tcG9zaXRlLCAyKTsKLQotCQlpbml0Q29udHJvbHMoKTsKLQotCQlhZGRMaXN0ZW5lcnMoKTsKLQotCQlzZXRDb250cm9sKGNvbXBvc2l0ZSk7Ci0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZXMgdGhlIHdpemFyZCBwYWdlIGNvbnRyb2xzIHdpdGggZGF0YS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0Q29udHJvbHMoKSB7Ci0JCVN0cmluZyBjb25maWdJZCA9IGNvbmZpZyAhPSBudWxsID8gY29uZmlnLmdldEd1aWQoKSA6ICIiOyAvLyROT04tTkxTLTEkCi0KLQkJU3RyaW5nIGRpciA9IFB1Ymxpc2hpbmdVSVByZWZlcmVuY2VzLmdldFB1Ymxpc2hQYXRoKGNvbmZpZ0lkKTsKLQkJaWYgKGRpciAhPSBudWxsICYmIGRpci5sZW5ndGgoKSA+IDApIHsKLQkJCWRpckNvbWJvLnNldEl0ZW1zKHN1YkFycmF5KGNvdmVyU3RyaW5nVG9BcnJheShkaXIpKSk7Ci0JCQlkaXJDb21iby5zZWxlY3QoMCk7Ci0JCX0KLQotCQlib29sZWFuIHB1Ymxpc2hTdGF0aWNXZWJTaXRlID0gUHVibGlzaGluZ1VJUHJlZmVyZW5jZXMKLQkJCQkuZ2V0UHVibGlzaFN0YXRpY1dlYlNpdGUoY29uZmlnSWQpOwotCQlzdGF0aWNXZWJTaXRlUmFkaW9CdXR0b24uc2V0U2VsZWN0aW9uKHB1Ymxpc2hTdGF0aWNXZWJTaXRlKTsKLQkJamF2YVdlYkFwcFJhZGlvQnV0dG9uLnNldFNlbGVjdGlvbighcHVibGlzaFN0YXRpY1dlYlNpdGUpOwotCi0JCWluY2x1ZGVTZWFyY2hDaGVja2JveC5zZXRTZWxlY3Rpb24oUHVibGlzaGluZ1VJUHJlZmVyZW5jZXMKLQkJCQkuZ2V0SW5jbHVkZVNlYXJjaChjb25maWdJZCkpOwotCi0JCVN0cmluZyB3ZWJBcHBOYW1lID0gUHVibGlzaGluZ1VJUHJlZmVyZW5jZXMuZ2V0V2ViQXBwTmFtZShjb25maWdJZCk7Ci0JCWlmICh3ZWJBcHBOYW1lICE9IG51bGwgJiYgd2ViQXBwTmFtZS5sZW5ndGgoKSA+IDApIHsKLQkJCXdlYkFwcE5hbWVDb21iby5zZXRJdGVtcyhuZXcgU3RyaW5nW10geyB3ZWJBcHBOYW1lIH0pOwotCQkJd2ViQXBwTmFtZUNvbWJvLnNldFRleHQod2ViQXBwTmFtZSk7Ci0JCX0KLQotCQl1cGRhdGVDb250cm9scygpOwotCX0KLQotCS8qKgotCSAqIEFkZHMgZXZlbnQgaGFuZGxlcnMgdG8gdGhlIHdpemFyZCBwYWdlIGNvbnRyb2xzLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZExpc3RlbmVycygpIHsKLQkJZGlyQ29tYm8uYWRkTW9kaWZ5TGlzdGVuZXIobmV3IE1vZGlmeUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0JCQkJc2V0UGFnZUNvbXBsZXRlKGlzUGFnZUNvbXBsZXRlKCkpOwotCQkJfQotCQl9KTsKLQotCQlicm93c2VCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCXRyeSB7Ci0JCQkJCURpcmVjdG9yeURpYWxvZyBkaWFsb2cgPSBuZXcgRGlyZWN0b3J5RGlhbG9nKHNoZWxsLAotCQkJCQkJCVNXVC5OT05FKTsKLQkJCQkJU3RyaW5nIHNlbGVjdGVkRGlyID0gZGlhbG9nLm9wZW4oKTsKLQkJCQkJaWYgKHNlbGVjdGVkRGlyICE9IG51bGwpIHsKLQkJCQkJCWRpckNvbWJvLnNldFRleHQoc2VsZWN0ZWREaXIpOwotCQkJCQl9Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJUHVibGlzaGluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JCXN0YXRpY1dlYlNpdGVSYWRpb0J1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJdXBkYXRlQ29udHJvbHMoKTsKLQkJCX0KLQkJfSk7Ci0KLQkJamF2YVdlYkFwcFJhZGlvQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQl1cGRhdGVDb250cm9scygpOwotCQkJfQotCQl9KTsKLQotCQl3ZWJBcHBOYW1lQ29tYm8uYWRkTW9kaWZ5TGlzdGVuZXIobmV3IE1vZGlmeUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0JCQkJc2V0UGFnZUNvbXBsZXRlKGlzUGFnZUNvbXBsZXRlKCkpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nW10gc3ViQXJyYXkoU3RyaW5nW10gYXJyKSB7Ci0JCWludCBsbCA9IENvbW1vblByZWZlcmVuY2VzLmdldFByZWZlcmVuY2VIaXN0b3J5U2l6ZSgpOwotCQlpZiAobGwgPCAxKQotCQkJbGwgPSBDb21tb25QcmVmZXJlbmNlcy5nZXREZWZhdWx0UHJlZmVyZW5jZUhpc3RvcnlTaXplKCk7Ci0KLQkJaW50IGFyckxlbmd0aCA9IGFyci5sZW5ndGg7Ci0KLQkJaWYgKGFyckxlbmd0aCA8IGxsICYmIGFyclswXS5lcXVhbHMoZGVmYXVsdFBhdGgpKQotCQkJcmV0dXJuIGFycjsKLQotCQlsbCA9IGFyckxlbmd0aCA+PSBsbCA/IGxsIDogYXJyTGVuZ3RoICsgMTsKLQkJU3RyaW5nW10gcmVzdWx0ID0gbmV3IFN0cmluZ1tsbF07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGwgLSAxOyBpKyspIHsKLQkJCXJlc3VsdFtpXSA9IGFycltpXTsKLQkJfQotCQlyZXN1bHRbbGwgLSAxXSA9IGFyclswXS5lcXVhbHMoZGVmYXVsdFBhdGgpID8gYXJyW2xsXSA6IGRlZmF1bHRQYXRoOwotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZ1tdIGNvdmVyU3RyaW5nVG9BcnJheShTdHJpbmcgcHJlZmVyZW5jZVN0cikgewotCQlyZXR1cm4gcHJlZmVyZW5jZVN0ci5zcGxpdChTUExJVF9QUkVGRVJFTkNFX0RFTElNSVRFUik7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBjb252ZXJ0QXJyYXlUb1N0cmluZyhTdHJpbmdbXSBhcnIpIHsKLQkJU3RyaW5nQnVmZmVyIHNCdWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWlmIChhcnIgPT0gbnVsbCB8fCBhcnIubGVuZ3RoID09IDApCi0JCQlyZXR1cm4gc0J1ZmZlci50b1N0cmluZygpOwotCQlzQnVmZmVyLmFwcGVuZChhcnJbMF0pOwotCQlmb3IgKGludCBpID0gMTsgaSA8IGFyci5sZW5ndGg7IGkrKykgewotCQkJc0J1ZmZlci5hcHBlbmQoUFJFRkVSRU5DRV9ERUxJTUlURVIpOwotCQkJc0J1ZmZlci5hcHBlbmQoYXJyW2ldKTsKLQkJfQotCQlyZXR1cm4gc0J1ZmZlci50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIFVwZGF0ZXMgdGhlIGNvbnRyb2wuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlQ29udHJvbHMoKSB7Ci0JCWJvb2xlYW4gcHVibGlzaFN0YXRpY1dlYlNpdGUgPSBnZXRTdGF0aWNXZWJTaXRlU2VsZWN0aW9uKCk7Ci0JCXdlYkFwcE5hbWVMYWJlbC5zZXRFbmFibGVkKCFwdWJsaXNoU3RhdGljV2ViU2l0ZSk7Ci0JCXdlYkFwcE5hbWVDb21iby5zZXRFbmFibGVkKCFwdWJsaXNoU3RhdGljV2ViU2l0ZSk7Ci0JCWluY2x1ZGVTZWFyY2hDaGVja2JveC5zZXRFbmFibGVkKCFwdWJsaXNoU3RhdGljV2ViU2l0ZSk7Ci0JCXNldFBhZ2VDb21wbGV0ZShpc1BhZ2VDb21wbGV0ZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51aS53aXphcmRzLkJhc2VXaXphcmRQYWdlI29uRW50ZXJQYWdlKE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBvbkVudGVyUGFnZShPYmplY3Qgb2JqKSB7Ci0JCWlmIChvYmogIT0gbnVsbCAmJiBvYmogaW5zdGFuY2VvZiBNZXRob2RDb25maWd1cmF0aW9uKSB7Ci0JCQljb25maWcgPSAoTWV0aG9kQ29uZmlndXJhdGlvbikgb2JqOwotCQkJaWYgKCFzZWxlY3RlZENvbmZpZ3MuY29udGFpbnMoY29uZmlnKSkgewotCQkJCXNlbGVjdGVkQ29uZmlncy5hZGQoY29uZmlnKTsKLQkJCQlpbml0Q29udHJvbHMoKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2UjaXNDb21wbGV0ZWQoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUGFnZUNvbXBsZXRlKCkgewotCQlTdHJpbmcgcGF0aCA9IGdldFB1Ymxpc2hEaXJlY3RvcnkoKTsKLQkJSVBhdGggZWNQYXRoID0gUGF0aC5mcm9tT1NTdHJpbmcocGF0aCk7Ci0JCWJvb2xlYW4gaXNWYWxpZCA9IGVjUGF0aC5pc1ZhbGlkUGF0aChwYXRoKTsKLQkJaWYgKCFpc1ZhbGlkKSB7Ci0JCQlzZXRFcnJvck1lc3NhZ2UoUHVibGlzaGluZ1VJUmVzb3VyY2VzLmludmFsaWRQYXRoRXJyb3JfbXNnKTsKLQkJCXJldHVybiBmYWxzZTsKLQkJfSBlbHNlIGlmICghU3RyVXRpbC5pc1ZhbGlkUHVibGlzaFBhdGgocGF0aCkpIHsKLQkJCXNldEVycm9yTWVzc2FnZShQdWJsaXNoaW5nVUlSZXNvdXJjZXMuaW52YWxpZFBhdGhDaGFyc0Vycm9yX21zZyk7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0gZWxzZSB7Ci0JCQlzZXRFcnJvck1lc3NhZ2UobnVsbCk7Ci0JCX0KLQkJaWYgKHBhdGgubGVuZ3RoKCkgPT0gMCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJaWYgKCFnZXRTdGF0aWNXZWJTaXRlU2VsZWN0aW9uKCkpIHsKLQkJCVN0cmluZyB3ZWJBcHBOYW1lID0gZ2V0V2ViQXBwTmFtZSgpOwotCQkJaWYgKHdlYkFwcE5hbWUubGVuZ3RoKCkgPT0gMCkgewotCQkJCXNldEVycm9yTWVzc2FnZShQdWJsaXNoaW5nVUlSZXNvdXJjZXMud2ViQXBwTmFtZUVycm9yX21zZyk7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfSBlbHNlIGlmICghU3RyVXRpbC5pc1ZhbGlkTmFtZSh3ZWJBcHBOYW1lKSkgewotCQkJCXNldEVycm9yTWVzc2FnZShQdWJsaXNoaW5nVUlSZXNvdXJjZXMud2ViQXBwTmFtZUNoYXJzRXJyb3JfbXNnKTsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9IGVsc2UgewotCQkJCXNldEVycm9yTWVzc2FnZShudWxsKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHVzZXIgc3BlY2lmaWVkIHB1Ymxpc2ggZGlyZWN0b3J5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UHVibGlzaERpcmVjdG9yeSgpIHsKLQkJU3RyaW5nIGRpclRleHQgPSBkaXJDb21iby5nZXRUZXh0KCkudHJpbSgpOwotCQlpZiAoZGlyVGV4dC5sZW5ndGgoKSA+IDApIHsKLQkJCUZpbGUgZGlyID0gbmV3IEZpbGUoZGlyQ29tYm8uZ2V0VGV4dCgpLnRyaW0oKSk7Ci0JCQlyZXR1cm4gZGlyLmdldEFic29sdXRlUGF0aCgpOwotCQl9Ci0JCXJldHVybiBkaXJUZXh0OwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmdbXSBnZXRQdWJsaXNoRGlyZWN0b3J5QXJyYXkoKSB7Ci0JCVN0cmluZyBzZWxlY3RlZHRleHQgPSBkaXJDb21iby5nZXRUZXh0KCk7Ci0KLQkJaWYgKGRpckNvbWJvLmluZGV4T2Yoc2VsZWN0ZWR0ZXh0KSA+IDApIHsKLQkJCWRpckNvbWJvLnJlbW92ZShzZWxlY3RlZHRleHQpOwotCQl9Ci0KLQkJaWYgKGRpckNvbWJvLmluZGV4T2Yoc2VsZWN0ZWR0ZXh0KSA8IDApIHsKLQkJCWRpckNvbWJvLmFkZChzZWxlY3RlZHRleHQsIDApOwotCQl9Ci0KLQkJaWYgKGRpckNvbWJvLmluZGV4T2YoZGVmYXVsdFBhdGgpID4gMCkgewotCQkJZGlyQ29tYm8ucmVtb3ZlKGRlZmF1bHRQYXRoKTsKLQkJfQotCi0JCXJldHVybiBkaXJDb21iby5nZXRJdGVtcygpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHVzZXIgc3BlY2lmaWVkIHN0YXRpYyB3ZWIgc2l0ZSBzZWxlY3Rpb24uCi0JICovCi0JcHVibGljIGJvb2xlYW4gZ2V0U3RhdGljV2ViU2l0ZVNlbGVjdGlvbigpIHsKLQkJcmV0dXJuIHN0YXRpY1dlYlNpdGVSYWRpb0J1dHRvbi5nZXRTZWxlY3Rpb24oKTsKLQl9Ci0JCi0JLyoqCi0JICogR2V0cyB0aGUgdXNlciBzcGVjaWZpZWQgamF2YSB3ZWIgYXBwbGljYXRpb24gc2VsZWN0aW9uLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGdldEphdmFXZWJBcHBTZWxlY3Rpb24oKSB7Ci0JCXJldHVybiBqYXZhV2ViQXBwUmFkaW9CdXR0b24uZ2V0U2VsZWN0aW9uKCk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgdXNlciBzcGVjaWZpZWQgaW5jbHVkZSBzZWFyY2ggc2VsZWN0aW9uLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGdldEluY2x1ZGVTZWFyY2hTZWxlY3Rpb24oKSB7Ci0JCXJldHVybiBpbmNsdWRlU2VhcmNoQ2hlY2tib3guZ2V0U2VsZWN0aW9uKCk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgd2ViIGFwbGljYXRpb24gbmFtZS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFdlYkFwcE5hbWUoKSB7Ci0JCXJldHVybiB3ZWJBcHBOYW1lQ29tYm8uZ2V0VGV4dCgpLnRyaW0oKTsKLQl9Ci0KLQkvKioKLQkgKiBTYXZlcyB0aGUgdXNlciBzZWxlY3Rpb25zIGluIHRoaXMgd2l6YXJkIHBhZ2UgdG8gcHJlZmVyZW5jZSBzdG9yZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzYXZlUHJlZmVyZW5jZXMoKSB7Ci0JCWlmIChjb25maWcgIT0gbnVsbCkgewotCQkJU3RyaW5nIGNvbmZpZ0lkID0gY29uZmlnLmdldEd1aWQoKTsKLQkJCVB1Ymxpc2hpbmdVSVByZWZlcmVuY2VzLnNldFB1Ymxpc2hQYXRoKGNvbmZpZ0lkLAotCQkJCQljb252ZXJ0QXJyYXlUb1N0cmluZyhnZXRQdWJsaXNoRGlyZWN0b3J5QXJyYXkoKSkpOwotCQkJUHVibGlzaGluZ1VJUHJlZmVyZW5jZXMuc2V0UHVibGlzaFN0YXRpY1dlYlNpdGUoY29uZmlnSWQsCi0JCQkJCWdldFN0YXRpY1dlYlNpdGVTZWxlY3Rpb24oKSk7Ci0JCQlQdWJsaXNoaW5nVUlQcmVmZXJlbmNlcy5zZXRJbmNsdWRlU2VhcmNoKGNvbmZpZ0lkLAotCQkJCQlnZXRJbmNsdWRlU2VhcmNoU2VsZWN0aW9uKCkpOwotCQkJUHVibGlzaGluZ1VJUHJlZmVyZW5jZXMuc2V0V2ViQXBwTmFtZShjb25maWdJZCwgZ2V0V2ViQXBwTmFtZSgpKTsKLQkJfQotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy91aS93aXphcmRzL1NlbGVjdFB1Ymxpc2hpbmdPcHRpb25zUGFnZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3VpL3dpemFyZHMvU2VsZWN0UHVibGlzaGluZ09wdGlvbnNQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3ZWU4NTAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3VpL3dpemFyZHMvU2VsZWN0UHVibGlzaGluZ09wdGlvbnNQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NTEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkud2l6YXJkczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuVHJlZU1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJSGVscENvbnRleHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5TdHJVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5lbGVtZW50cy5BYnN0cmFjdEVsZW1lbnRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LmVsZW1lbnRzLkFjdGl2aXR5TGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnNlcnZpY2VzLlB1Ymxpc2hIVE1MT3B0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5zZXJ2aWNlcy5QdWJsaXNoT3B0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS5QdWJsaXNoaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkuUHVibGlzaGluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLnByZWZlcmVuY2VzLlB1Ymxpc2hpbmdVSVByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51aS53aXphcmRzLkJhc2VXaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNvbWJvVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5GaWxlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLQotLyoqCi0gKiBBIHdpemFyZCBwYWdlIHRoYXQgcHJvbXB0cyB0aGUgdXNlciB0byBzZWxlY3QgdGhlIHB1Ymxpc2hpbmcgb3B0aW9ucyBmb3IgdGhlCi0gKiBnZW5lcmF0ZWQgd2ViIHNpdGUuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQGF1dGhvciBCaW5neHVlIFh1Ci0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICogZml4IGZvciBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjA2NTY3Ci0gKi8KLXB1YmxpYyBjbGFzcyBTZWxlY3RQdWJsaXNoaW5nT3B0aW9uc1BhZ2UgZXh0ZW5kcyBCYXNlV2l6YXJkUGFnZSB7Ci0KLQkvKioKLQkgKiBUaGUgd2l6YXJkIHBhZ2UgbmFtZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQUdFX05BTUUgPSBTZWxlY3RQdWJsaXNoaW5nT3B0aW9uc1BhZ2UuY2xhc3MKLQkJCS5nZXROYW1lKCk7Ci0KLQlwcm90ZWN0ZWQgU2hlbGwgc2hlbGw7Ci0JCi0JcHJvdGVjdGVkIEdyb3VwIGxheW91dEdyb3VwOwotCi0JcHJvdGVjdGVkIFRleHQgdGl0bGVUZXh0OwotCi0JcHJvdGVjdGVkIFRleHQgYWJvdXRIVE1MVGV4dDsKLQotCXByb3RlY3RlZCBUZXh0IGZlZWRiYWNrVVJMVGV4dDsKLQotCXByb3RlY3RlZCBCdXR0b24gc2VsZWN0SFRNTEJ1dHRvbjsKLQotCXByb3RlY3RlZCBCdXR0b24gcHVibGlzaEdsb3NzYXJ5Q2hlY2tib3g7Ci0KLQlwcm90ZWN0ZWQgQnV0dG9uIHB1Ymxpc2hJbmRleENoZWNrYm94OwotCi0JcHJvdGVjdGVkIFRleHQgYmFubmVySW1hZ2VUZXh0OwotCi0JcHJvdGVjdGVkIEJ1dHRvbiBzZWxlY3RJbWFnZUJ1dHRvbjsKLQotCXByb3RlY3RlZCBCdXR0b24gY2hlY2tFeHRlcm5hbExpbmtzQ2hlY2tib3g7Ci0KLQlwcm90ZWN0ZWQgQnV0dG9uIGNvbnZlcnRCcm9rZW5MaW5rc0NoZWNrYm94OwotCi0JcHJvdGVjdGVkIEJ1dHRvbiBwdWJsaXNoVW5vcGVuQUREQ2hlY2tib3g7Ci0KLQlwcm90ZWN0ZWQgQnV0dG9uIHB1Ymxpc2hCYXNlQURDaGVja2JveDsKLQotCXByb3RlY3RlZCBCdXR0b24gcHVibGlzaExpZ2h0V2VpZ2h0VHJlZUNoZWNrYm94OwotCi0JcHJvdGVjdGVkIEJ1dHRvbiBleHRyYURlc2NyaXB0b3JJbmZvQ3RyOwotCi0JcHJvdGVjdGVkIEJ1dHRvbiBzaG93UmVsYXRlZERlc2NyaXB0b3JzOwotCQotCXByb3RlY3RlZCBCdXR0b24gc2hvd1JlbGF0ZWREZXNjcmlwdG9yc09wdGlvbjsKLQotCXByb3RlY3RlZCBCdXR0b24gc2hvd0Rlc2NyaXB0b3JzSW5OYXZpZ2F0aW9uVHJlZTsKLQotCXByb3RlY3RlZCBDb21ib1ZpZXdlciBhY3Rpdml0eVRhYlZpZXdlcjsKLQotCXByb3RlY3RlZCBNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZzsKLQotCXByb3RlY3RlZCBMaXN0PE1ldGhvZENvbmZpZ3VyYXRpb24+IHNlbGVjdGVkQ29uZmlncyA9IG5ldyBBcnJheUxpc3Q8TWV0aG9kQ29uZmlndXJhdGlvbj4oKTsKLQotCXB1YmxpYyBzdGF0aWMgTWFwPFN0cmluZywgU3RyaW5nPiBhY3Rpdml0eVRhYk1hcCA9IG5ldyBUcmVlTWFwPFN0cmluZywgU3RyaW5nPigpOwotCi0Jc3RhdGljIHsKLQkJYWN0aXZpdHlUYWJNYXAucHV0KEFjdGl2aXR5TGF5b3V0LlRBQl9OQU1FX0FDVElWSVRZX0RFU0MsCi0JCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuZGVzY3JpcHRpb25QYWdlX3RpdGxlKTsKLQkJYWN0aXZpdHlUYWJNYXAucHV0KEFjdGl2aXR5TGF5b3V0LlRBQl9OQU1FX0FDVElWSVRZX1dCUywKLQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5Qcm9jZXNzRWRpdG9yX1dvcmtCcmVha2Rvd25TdHJ1Y3R1cmUpOwotCQlhY3Rpdml0eVRhYk1hcC5wdXQoQWN0aXZpdHlMYXlvdXQuVEFCX05BTUVfQUNUSVZJVFlfVEJTLAotCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLlByb2Nlc3NFZGl0b3JfVGVhbUFsbG9jYXRpb24pOwotCQlhY3Rpdml0eVRhYk1hcC5wdXQoQWN0aXZpdHlMYXlvdXQuVEFCX05BTUVfQUNUSVZJVFlfV1BCUywKLQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5Qcm9jZXNzRWRpdG9yX1dvcmtQcm9kdWN0VXNhZ2UpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFNlbGVjdFB1Ymxpc2hpbmdPcHRpb25zUGFnZShTdHJpbmcgcGFnZU5hbWUpIHsKLQkJc3VwZXIocGFnZU5hbWUsCi0JCQkJUHVibGlzaGluZ1VJUmVzb3VyY2VzLnNlbGVjdFB1Ymxpc2hpbmdPcHRpb25zV2l6YXJkUGFnZV90aXRsZSwKLQkJCQlQdWJsaXNoaW5nVUlSZXNvdXJjZXMuc2VsZWN0UHVibGlzaGluZ09wdGlvbnNXaXphcmRQYWdlX3RleHQsCi0JCQkJUHVibGlzaGluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoCi0JCQkJCQkiZnVsbC93aXpiYW4vUHVibGlzaENvbmZpZ3VyYXRpb24uZ2lmIikpOyAvLyROT04tTkxTLTEkCQkJCi0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgU2VsZWN0UHVibGlzaGluZ09wdGlvbnNQYWdlKCkgewotCQl0aGlzKFBBR0VfTkFNRSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dQYWdlI2NyZWF0ZUNvbnRyb2woQ29tcG9zaXRlKQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCQlzaGVsbCA9IHBhcmVudC5nZXRTaGVsbCgpOwotCi0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBjcmVhdGVHcmlkTGF5b3V0Q29tcG9zaXRlKHBhcmVudCwgMSk7Ci0KLQkJY3JlYXRlVGl0bGVBbmRMaW5rc0dyb3VwKGNvbXBvc2l0ZSk7Ci0JCWNyZWF0ZUdsb3NzYXJ5QW5kSW5kZXhHcm91cChjb21wb3NpdGUpOwotCQljcmVhdGVMb29rQW5kRmVlbEdyb3VwKGNvbXBvc2l0ZSk7Ci0JCWNyZWF0ZVZhbGlkYXRpb24oY29tcG9zaXRlKTsKLQkJY3JlYXRlRGlhZ3JhbUdlbmVyYXRpb25Hcm91cChjb21wb3NpdGUpOwotCQljcmVhdGVMYXlvdXRHcm91cChjb21wb3NpdGUpOwotCi0JCWluaXRDb250cm9scygpOwotCi0JCWFkZExpc3RlbmVycygpOwotCi0JCXNldENvbnRyb2woY29tcG9zaXRlKTsKLQotCQlQbGF0Zm9ybVVJCi0JCQkJLmdldFdvcmtiZW5jaCgpCi0JCQkJLmdldEhlbHBTeXN0ZW0oKQotCQkJCS5zZXRIZWxwKAotCQkJCQkJY29tcG9zaXRlLAotCQkJCQkJQXV0aG9yaW5nVUlIZWxwQ29udGV4dHMuQ09ORklHVVJBVElPTl9QVUJMSVNIX1dJWkFSRF9BTExfUEFHRVNfQ09OVEVYVCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgVGl0bGUgYW5kIGxpbmtzIGdyb3VwLgotCSAqIAotCSAqIEBwYXJhbSBjb21wb3NpdGUKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgY29tcG9zaXRlCi0JICogQHJldHVybiB0aGUgZ3JvdXAgY29tcG9zaXRlCi0JICovCi0JcHJvdGVjdGVkIEdyb3VwIGNyZWF0ZVRpdGxlQW5kTGlua3NHcm91cChDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JCUdyb3VwIHRpdGxlQW5kTGlua3NHcm91cCA9IGNyZWF0ZUdyaWRMYXlvdXRHcm91cChjb21wb3NpdGUsCi0JCQkJUHVibGlzaGluZ1VJUmVzb3VyY2VzLnRpdGxlQW5kTGlua3NHcm91cF90ZXh0LCAzKTsKLQotCQljcmVhdGVMYWJlbCh0aXRsZUFuZExpbmtzR3JvdXAsIFB1Ymxpc2hpbmdVSVJlc291cmNlcy50aXRsZUxhYmVsX3RleHQpOwotCQl0aXRsZVRleHQgPSBjcmVhdGVFZGl0YWJsZVRleHQodGl0bGVBbmRMaW5rc0dyb3VwLCAiIiwgMzYwLCAxKTsgLy8kTk9OLU5MUy0xJAotCQljcmVhdGVMYWJlbCh0aXRsZUFuZExpbmtzR3JvdXAsICIiKTsgLy8kTk9OLU5MUy0xJAotCi0JCWNyZWF0ZUxhYmVsKHRpdGxlQW5kTGlua3NHcm91cCwKLQkJCQlQdWJsaXNoaW5nVUlSZXNvdXJjZXMuYWJvdXRIVE1MTGFiZWxfdGV4dCk7Ci0JCWFib3V0SFRNTFRleHQgPSBjcmVhdGVFZGl0YWJsZVRleHQodGl0bGVBbmRMaW5rc0dyb3VwLCAiIiwgMzYwLCAxKTsgLy8kTk9OLU5MUy0xJAotCQlzZWxlY3RIVE1MQnV0dG9uID0gbmV3IEJ1dHRvbih0aXRsZUFuZExpbmtzR3JvdXAsIFNXVC5OT05FKTsKLQkJc2VsZWN0SFRNTEJ1dHRvbi5zZXRUZXh0KEF1dGhvcmluZ1VJVGV4dC5TRUxFQ1RfQlVUVE9OX1RFWFQpOwotCi0JCWNyZWF0ZUxhYmVsKHRpdGxlQW5kTGlua3NHcm91cCwKLQkJCQlQdWJsaXNoaW5nVUlSZXNvdXJjZXMuZmVlZGJhY2tVUkxMYWJlbF90ZXh0KTsKLQkJZmVlZGJhY2tVUkxUZXh0ID0gY3JlYXRlRWRpdGFibGVUZXh0KHRpdGxlQW5kTGlua3NHcm91cCwgIiIsIDM2MCwgMSk7IC8vJE5PTi1OTFMtMSQKLQkJY3JlYXRlTGFiZWwodGl0bGVBbmRMaW5rc0dyb3VwLCAiIik7IC8vJE5PTi1OTFMtMSQKLQotCQlyZXR1cm4gdGl0bGVBbmRMaW5rc0dyb3VwOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIExvb2sgYW5kIGZlZWwgZ3JvdXAuCi0JICogCi0JICogQHBhcmFtIGNvbXBvc2l0ZQotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBjb21wb3NpdGUKLQkgKiBAcmV0dXJuIHRoZSBncm91cCBjb21wb3NpdGUKLQkgKi8KLQlwcm90ZWN0ZWQgR3JvdXAgY3JlYXRlTG9va0FuZEZlZWxHcm91cChDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JCUdyb3VwIGxvb2tBbmRGZWVsR3JvdXAgPSBjcmVhdGVHcmlkTGF5b3V0R3JvdXAoY29tcG9zaXRlLAotCQkJCVB1Ymxpc2hpbmdVSVJlc291cmNlcy5sb29rQW5kRmVlbEdyb3VwX3RleHQsIDMpOwotCi0JCWNyZWF0ZUxhYmVsKGxvb2tBbmRGZWVsR3JvdXAsCi0JCQkJUHVibGlzaGluZ1VJUmVzb3VyY2VzLmJhbm5lckltYWdlTGFiZWxfdGV4dCk7Ci0JCWJhbm5lckltYWdlVGV4dCA9IGNyZWF0ZUVkaXRhYmxlVGV4dChsb29rQW5kRmVlbEdyb3VwLCAiIiwgMzYwLCAxKTsgLy8kTk9OLU5MUy0xJAotCQlzZWxlY3RJbWFnZUJ1dHRvbiA9IG5ldyBCdXR0b24obG9va0FuZEZlZWxHcm91cCwgU1dULk5PTkUpOwotCQlzZWxlY3RJbWFnZUJ1dHRvbi5zZXRUZXh0KEF1dGhvcmluZ1VJVGV4dC5TRUxFQ1RfQlVUVE9OX1RFWFQpOwotCi0JCXJldHVybiBsb29rQW5kRmVlbEdyb3VwOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIEdsb3NhcnkgYW5kIGluZGV4IGdyb3VwLgotCSAqIAotCSAqIEBwYXJhbSBjb21wb3NpdGUKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgY29tcG9zaXRlCi0JICogQHJldHVybiB0aGUgZ3JvdXAgY29tcG9zaXRlCi0JICovCi0JcHJvdGVjdGVkIEdyb3VwIGNyZWF0ZUdsb3NzYXJ5QW5kSW5kZXhHcm91cChDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JCUdyb3VwIGdsb3NzYXJ5QW5kSW5kZXhHcm91cCA9IGNyZWF0ZUdyaWRMYXlvdXRHcm91cChjb21wb3NpdGUsCi0JCQkJUHVibGlzaGluZ1VJUmVzb3VyY2VzLmdsb3NzYXJ5QW5kSW5kZXhHcm91cF90ZXh0LCAyKTsKLQotCQlwdWJsaXNoR2xvc3NhcnlDaGVja2JveCA9IGNyZWF0ZUNoZWNrYm94KGdsb3NzYXJ5QW5kSW5kZXhHcm91cCwKLQkJCQlQdWJsaXNoaW5nVUlSZXNvdXJjZXMucHVibGlzaEdsb3NzYXJ5TGFiZWxfdGV4dCk7Ci0JCXB1Ymxpc2hJbmRleENoZWNrYm94ID0gY3JlYXRlQ2hlY2tib3goZ2xvc3NhcnlBbmRJbmRleEdyb3VwLAotCQkJCVB1Ymxpc2hpbmdVSVJlc291cmNlcy5wdWJsaXNoSW5kZXhMYWJlbF90ZXh0KTsKLQotCQlyZXR1cm4gZ2xvc3NhcnlBbmRJbmRleEdyb3VwOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIFZhbGlkYXRpb24gZ3JvdXAuCi0JICogCi0JICogQHBhcmFtIGNvbXBvc2l0ZQotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBjb21wb3NpdGUKLQkgKiBAcmV0dXJuIHRoZSBncm91cCBjb21wb3NpdGUKLQkgKi8KLQlwcm90ZWN0ZWQgR3JvdXAgY3JlYXRlVmFsaWRhdGlvbihDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JCUdyb3VwIHZhbGlkYXRpb25Hcm91cCA9IGNyZWF0ZUdyaWRMYXlvdXRHcm91cChjb21wb3NpdGUsCi0JCQkJUHVibGlzaGluZ1VJUmVzb3VyY2VzLnZhbGlkYXRpb25Hcm91cF90ZXh0LCAyKTsKLQotCQljaGVja0V4dGVybmFsTGlua3NDaGVja2JveCA9IGNyZWF0ZUNoZWNrYm94KHZhbGlkYXRpb25Hcm91cCwKLQkJCQlQdWJsaXNoaW5nVUlSZXNvdXJjZXMuY2hlY2tFeHRlcm5hbExpbmtzTGFiZWxfdGV4dCk7Ci0KLQkJY29udmVydEJyb2tlbkxpbmtzQ2hlY2tib3ggPSBjcmVhdGVDaGVja2JveCh2YWxpZGF0aW9uR3JvdXAsCi0JCQkJUHVibGlzaGluZ1VJUmVzb3VyY2VzLmNvbnZlcnRCcm9rZW5MaW5rc0xhYmVsX3RleHQpOwotCi0JCXJldHVybiB2YWxpZGF0aW9uR3JvdXA7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgRGlhZ3JhbSBHZW5lcmF0aW9uIGdyb3VwLgotCSAqIAotCSAqIEBwYXJhbSBjb21wb3NpdGUKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgY29tcG9zaXRlCi0JICogQHJldHVybiB0aGUgZ3JvdXAgY29tcG9zaXRlCi0JICovCi0JcHJvdGVjdGVkIEdyb3VwIGNyZWF0ZURpYWdyYW1HZW5lcmF0aW9uR3JvdXAoQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotCQlHcm91cCBkaWFncmFtR3JvdXAgPSBjcmVhdGVHcmlkTGF5b3V0R3JvdXAoY29tcG9zaXRlLAotCQkJCVB1Ymxpc2hpbmdVSVJlc291cmNlcy5kaWFncmFtR3JvdXBfdGV4dCwgMSk7Ci0KLQkJcHVibGlzaFVub3BlbkFERENoZWNrYm94ID0gY3JlYXRlQ2hlY2tib3goZGlhZ3JhbUdyb3VwLAotCQkJCVB1Ymxpc2hpbmdVSVJlc291cmNlcy5wdWJsaXNoQWN0aXZpdHlEZXRhaWxEaWFncmFtc0xhYmVsX3RleHQpOwotCi0JCXB1Ymxpc2hCYXNlQURDaGVja2JveCA9IGNyZWF0ZUNoZWNrYm94KGRpYWdyYW1Hcm91cCwKLQkJCQlQdWJsaXNoaW5nVUlSZXNvdXJjZXMucHVibGlzaEV4dGVuZGVkQWN0aXZpdHlEaWFncmFtc0xhYmVsX3RleHQpOwotCi0JCXJldHVybiBkaWFncmFtR3JvdXA7Ci0JfQotCi0JcHVibGljIEdyb3VwIGdldExheW91dEdyb3VwKCkgewotCQlyZXR1cm4gbGF5b3V0R3JvdXA7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TGF5b3V0R3JvdXAoR3JvdXAgbGF5b3V0R3JvdXApIHsKLQkJdGhpcy5sYXlvdXRHcm91cCA9IGxheW91dEdyb3VwOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIExheW91dCBncm91cC4KLQkgKiAKLQkgKiBAcGFyYW0gY29tcG9zaXRlCi0JICogICAgICAgICAgICB0aGUgcGFyZW50IGNvbXBvc2l0ZQotCSAqIEByZXR1cm4gdGhlIGdyb3VwIGNvbXBvc2l0ZQotCSAqLwotCXByb3RlY3RlZCBHcm91cCBjcmVhdGVMYXlvdXRHcm91cChDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JCWxheW91dEdyb3VwID0gY3JlYXRlR3JpZExheW91dEdyb3VwKGNvbXBvc2l0ZSwKLQkJCQlQdWJsaXNoaW5nVUlSZXNvdXJjZXMubGF5b3V0R3JvdXBfdGV4dCwgMSk7Ci0KLQkJcHVibGlzaExpZ2h0V2VpZ2h0VHJlZUNoZWNrYm94ID0gY3JlYXRlQ2hlY2tib3gobGF5b3V0R3JvdXAsCi0JCQkJUHVibGlzaGluZ1VJUmVzb3VyY2VzLnB1Ymxpc2hMaWdodFdlaWdodFRyZWVMYWJlbF90ZXh0KTsKLQotCQlzaG93RGVzY3JpcHRvcnNJbk5hdmlnYXRpb25UcmVlID0gY3JlYXRlQ2hlY2tib3gobGF5b3V0R3JvdXAsCi0JCQkJUHVibGlzaGluZ1VJUmVzb3VyY2VzLnNob3dEZXNjcmlwdG9yc0luTmF2aWdhdGlvblRyZWVfdGV4dCk7Ci0KLQkJZXh0cmFEZXNjcmlwdG9ySW5mb0N0ciA9IGNyZWF0ZUNoZWNrYm94KGxheW91dEdyb3VwLAotCQkJCVB1Ymxpc2hpbmdVSVJlc291cmNlcy5wdWJsaXNoRXh0cmFEZXNjcmlwdG9ySW5mb0xhYmVsX3RleHQpOwotCi0JCXNob3dSZWxhdGVkRGVzY3JpcHRvcnMgPSBjcmVhdGVDaGVja2JveChsYXlvdXRHcm91cCwKLQkJCQlQdWJsaXNoaW5nVUlSZXNvdXJjZXMuc2hvd1JlbGF0ZWREZXNjcmlwdG9yc190ZXh0KTsJCQotCQlDb21wb3NpdGUgZGVzY3JpcHRvckNvbXBvc2l0ZSA9IGNyZWF0ZUNoaWxkR3JpZExheW91dENvbXBvc2l0ZShsYXlvdXRHcm91cCwgMSk7Ci0JCXNob3dSZWxhdGVkRGVzY3JpcHRvcnNPcHRpb24gPSBjcmVhdGVDaGVja2JveChkZXNjcmlwdG9yQ29tcG9zaXRlLAotCQkJCVB1Ymxpc2hpbmdVSVJlc291cmNlcy5zaG93UmVsYXRlZERlc2NyaXB0b3JzX29wdGlvbl90ZXh0KTsKLQkJCi0JCUNvbXBvc2l0ZSBhY3Rpdml0eVRhYkNvbXBvc2l0ZSA9IGNyZWF0ZUdyaWRMYXlvdXRDb21wb3NpdGUobGF5b3V0R3JvdXAsCi0JCQkJMik7Ci0JCSgoR3JpZExheW91dCkgYWN0aXZpdHlUYWJDb21wb3NpdGUuZ2V0TGF5b3V0KCkpLm1hcmdpblRvcCA9IC01OwotCQkoKEdyaWRMYXlvdXQpIGFjdGl2aXR5VGFiQ29tcG9zaXRlLmdldExheW91dCgpKS5tYXJnaW5MZWZ0ID0gLTU7Ci0KLQkJY3JlYXRlTGFiZWwoYWN0aXZpdHlUYWJDb21wb3NpdGUsCi0JCQkJUHVibGlzaGluZ1VJUmVzb3VyY2VzLnNlbGVjdERlZmF1bHRBY3Rpdml0eVRhYl90ZXh0KTsKLQotCQlhY3Rpdml0eVRhYlZpZXdlciA9IG5ldyBDb21ib1ZpZXdlcihhY3Rpdml0eVRhYkNvbXBvc2l0ZSwgU1dULkJPUkRFUgotCQkJCXwgU1dULlJFQURfT05MWSk7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkJFR0lOTklORwotCQkJCXwgR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJYWN0aXZpdHlUYWJWaWV3ZXIuZ2V0Q29tYm8oKS5zZXRMYXlvdXREYXRhKGdkKTsKLQotCQlJTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyID0gbmV3IExhYmVsUHJvdmlkZXIoKSB7Ci0JCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IHBhcmFtKSB7Ci0JCQkJaWYgKHBhcmFtIGluc3RhbmNlb2YgTWFwLkVudHJ5KSB7Ci0JCQkJCXJldHVybiAoU3RyaW5nKSAoKE1hcC5FbnRyeSkgcGFyYW0pLmdldFZhbHVlKCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJcmV0dXJuIHBhcmFtLnRvU3RyaW5nKCk7Ci0JCQkJfQotCQkJfQotCQl9OwotCQlhY3Rpdml0eVRhYlZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKGxhYmVsUHJvdmlkZXIpOwotCi0JCXJldHVybiBsYXlvdXRHcm91cDsKLQl9Ci0KLQkvKioKLQkgKiBQcm92aWRlIGEgbWVhbnMgdG8gYWRkIGFkZGl0aW9uYWwgb3B0aW9ucyB0byB0aGUgcHVibGlzaGVkIHdlYiBzaXRlCi0JICogZ3JvdXAuCi0JICogCi0JICogQHBhcmFtIGNvbXBvc2l0ZQotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBjb21wb3NpdGUKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbmNsdWRlQWRkaXRpb25hbFB1Ymxpc2hpbmdPcHRpb25zKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBwdWJsaXNoaW5nIG9wdGlvbnMgZ3JvdXBzIHRvIHRoaXMgd2l6YXJkIHBhZ2UuCi0JICogCi0JICogQHBhcmFtIGNvbXBvc2l0ZQotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBjb21wb3NpdGUKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVQdWJsaXNoaW5nT3B0aW9uc0dyb3VwcyhDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZXMgdGhlIHdpemFyZCBwYWdlIGNvbnRyb2xzIHdpdGggZGF0YS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0Q29udHJvbHMoKSB7Ci0JCVN0cmluZyBjb25maWdJZCA9IGNvbmZpZyAhPSBudWxsID8gY29uZmlnLmdldEd1aWQoKSA6ICIiOyAvLyROT04tTkxTLTEkCi0KLQkJdGl0bGVUZXh0LnNldFRleHQoUHVibGlzaGluZ1VJUHJlZmVyZW5jZXMuZ2V0VGl0bGUoY29uZmlnSWQpKTsKLQkJYmFubmVySW1hZ2VUZXh0LnNldFRleHQoUHVibGlzaGluZ1VJUHJlZmVyZW5jZXMKLQkJCQkuZ2V0QmFubmVySW1hZ2UoY29uZmlnSWQpKTsKLQkJYWJvdXRIVE1MVGV4dC5zZXRUZXh0KFB1Ymxpc2hpbmdVSVByZWZlcmVuY2VzLmdldEFib3V0SFRNTChjb25maWdJZCkpOwotCQlmZWVkYmFja1VSTFRleHQuc2V0VGV4dChQdWJsaXNoaW5nVUlQcmVmZXJlbmNlcwotCQkJCS5nZXRGZWVkYmFja1VSTChjb25maWdJZCkpOwotCQlwdWJsaXNoR2xvc3NhcnlDaGVja2JveC5zZXRTZWxlY3Rpb24oUHVibGlzaGluZ1VJUHJlZmVyZW5jZXMKLQkJCQkuZ2V0SW5jbHVkZUdsb3NzYXJ5KGNvbmZpZ0lkKSk7Ci0JCXB1Ymxpc2hJbmRleENoZWNrYm94LnNldFNlbGVjdGlvbihQdWJsaXNoaW5nVUlQcmVmZXJlbmNlcwotCQkJCS5nZXRJbmNsdWRlSW5kZXgoY29uZmlnSWQpKTsKLQkJY2hlY2tFeHRlcm5hbExpbmtzQ2hlY2tib3guc2V0U2VsZWN0aW9uKFB1Ymxpc2hpbmdVSVByZWZlcmVuY2VzCi0JCQkJLmdldENoZWNrRXh0ZXJuYWxMaW5rcyhjb25maWdJZCkpOwotCQljb252ZXJ0QnJva2VuTGlua3NDaGVja2JveC5zZXRTZWxlY3Rpb24oUHVibGlzaGluZ1VJUHJlZmVyZW5jZXMKLQkJCQkuZ2V0Q29udmVydEJyb2tlbkxpbmtzKGNvbmZpZ0lkKSk7Ci0JCXB1Ymxpc2hVbm9wZW5BRERDaGVja2JveC5zZXRTZWxlY3Rpb24oUHVibGlzaGluZ1VJUHJlZmVyZW5jZXMKLQkJCQkuZ2V0UHVibGlzaFVub3BlbkFjdGl2aXR5REQoY29uZmlnSWQpKTsKLQkJcHVibGlzaEJhc2VBRENoZWNrYm94LnNldFNlbGVjdGlvbihQdWJsaXNoaW5nVUlQcmVmZXJlbmNlcwotCQkJCS5nZXRQdWJsaXNoQURGb3JBY3Rpdml0eUV4dGVuc2lvbihjb25maWdJZCkpOwotCQlwdWJsaXNoTGlnaHRXZWlnaHRUcmVlQ2hlY2tib3guc2V0U2VsZWN0aW9uKCFQdWJsaXNoaW5nVUlQcmVmZXJlbmNlcwotCQkJCS5nZXRMaWdodFdlaWdodFRyZWUoY29uZmlnSWQpKTsKLQkJZXh0cmFEZXNjcmlwdG9ySW5mb0N0ci5zZXRTZWxlY3Rpb24oUHVibGlzaGluZ1VJUHJlZmVyZW5jZXMKLQkJCQkuZ2V0RXh0cmFEZXNjcmlwdG9ySW5mbyhjb25maWdJZCkpOwotCQlzaG93UmVsYXRlZERlc2NyaXB0b3JzLnNldFNlbGVjdGlvbihQdWJsaXNoaW5nVUlQcmVmZXJlbmNlcwotCQkJCS5nZXRTaG93UmVsYXRlZERlc2NyaXB0b3JzKGNvbmZpZ0lkKSk7Ci0JCXNob3dSZWxhdGVkRGVzY3JpcHRvcnNPcHRpb24uc2V0U2VsZWN0aW9uKFB1Ymxpc2hpbmdVSVByZWZlcmVuY2VzCi0JCQkJLmdldFNob3dSZWxhdGVkRGVzY3JpcHRvcnNPcHRpb24oY29uZmlnSWQpKTsKLQkJaWYgKHNob3dSZWxhdGVkRGVzY3JpcHRvcnMuZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCXNob3dSZWxhdGVkRGVzY3JpcHRvcnNPcHRpb24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJfSBlbHNlIHsKLQkJCXNob3dSZWxhdGVkRGVzY3JpcHRvcnNPcHRpb24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCX0KLQkJaWYgKHNob3dSZWxhdGVkRGVzY3JpcHRvcnNPcHRpb24uZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCUFic3RyYWN0RWxlbWVudExheW91dC5wcm9jZXNzRGVzY3JpdG9yc05ld09wdGlvbiA9IHRydWU7Ci0JCX0gZWxzZSB7Ci0JCQlBYnN0cmFjdEVsZW1lbnRMYXlvdXQucHJvY2Vzc0Rlc2NyaXRvcnNOZXdPcHRpb24gPSBmYWxzZTsKLQkJfQotCQlzaG93RGVzY3JpcHRvcnNJbk5hdmlnYXRpb25UcmVlLnNldFNlbGVjdGlvbihQdWJsaXNoaW5nVUlQcmVmZXJlbmNlcwotCQkJCS5nZXRTaG93RGVzY3JpcHRvcnNJbk5hdmlnYXRpb25UcmVlKGNvbmZpZ0lkKSk7Ci0KLQkJaWYgKGFjdGl2aXR5VGFiVmlld2VyLmdldENvbWJvKCkuZ2V0SXRlbUNvdW50KCkgPT0gMCkgewotCQkJYWN0aXZpdHlUYWJWaWV3ZXIuYWRkKGFjdGl2aXR5VGFiTWFwLmVudHJ5U2V0KCkudG9BcnJheSgpKTsKLQkJfQotCQlhY3Rpdml0eVRhYlZpZXdlci5nZXRDb21ibygpLnNldFRleHQoCi0JCQkJYWN0aXZpdHlUYWJNYXAuZ2V0KFB1Ymxpc2hpbmdVSVByZWZlcmVuY2VzCi0JCQkJCQkuZ2V0RGVmYXVsdEFjdGl2aXR5VGFiKGNvbmZpZ0lkKSkpOwotCi0JfQotCi0JLyoqCi0JICogQWRkcyB0aGUgbGlzdGVuZXJzIGZvciB0aGUgY29udHJvbHMgb24gdGhpcyBwYWdlLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZExpc3RlbmVycygpIHsKLQkJc2VsZWN0SW1hZ2VCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCXRyeSB7Ci0JCQkJCUZpbGVEaWFsb2cgZGlhbG9nID0gbmV3IEZpbGVEaWFsb2coc2hlbGwsIFNXVC5PUEVOKTsKLQkJCQkJZGlhbG9nLnNldEZpbHRlckV4dGVuc2lvbnMobmV3IFN0cmluZ1tdIHsKLQkJCQkJCQkiKi5naWYiLCAiKi5qcGciLCAiKi5ibXAiIH0pOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlTdHJpbmcgaW1hZ2VGaWxlID0gZGlhbG9nLm9wZW4oKTsKLQkJCQkJaWYgKGltYWdlRmlsZSAhPSBudWxsKSB7Ci0JCQkJCQliYW5uZXJJbWFnZVRleHQuc2V0VGV4dChpbWFnZUZpbGUpOwotCQkJCQl9Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJUHVibGlzaGluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JCXNlbGVjdEhUTUxCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCXRyeSB7Ci0JCQkJCUZpbGVEaWFsb2cgZGlhbG9nID0gbmV3IEZpbGVEaWFsb2coc2hlbGwsIFNXVC5PUEVOKTsKLQkJCQkJZGlhbG9nCi0JCQkJCQkJLnNldEZpbHRlckV4dGVuc2lvbnMobmV3IFN0cmluZ1tdIHsKLQkJCQkJCQkJCSIqLmh0bSIsICIqLmh0bWwiIH0pOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJU3RyaW5nIGh0bWxGaWxlID0gZGlhbG9nLm9wZW4oKTsKLQkJCQkJaWYgKGh0bWxGaWxlICE9IG51bGwpIHsKLQkJCQkJCWFib3V0SFRNTFRleHQuc2V0VGV4dChodG1sRmlsZSk7Ci0JCQkJCX0KLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQlQdWJsaXNoaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJYWJvdXRIVE1MVGV4dC5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJCQlzZXRQYWdlQ29tcGxldGUoaXNQYWdlQ29tcGxldGUoKSk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJc2hvd1JlbGF0ZWREZXNjcmlwdG9ycy5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJaWYgKHNob3dSZWxhdGVkRGVzY3JpcHRvcnMuZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCQkJc2hvd1JlbGF0ZWREZXNjcmlwdG9yc09wdGlvbi5zZXRFbmFibGVkKHRydWUpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXNob3dSZWxhdGVkRGVzY3JpcHRvcnNPcHRpb24uc2V0U2VsZWN0aW9uKGZhbHNlKTsKLQkJCQkJQWJzdHJhY3RFbGVtZW50TGF5b3V0LnByb2Nlc3NEZXNjcml0b3JzTmV3T3B0aW9uID0gZmFsc2U7Ci0JCQkJCXNob3dSZWxhdGVkRGVzY3JpcHRvcnNPcHRpb24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQkJCi0JCXNob3dSZWxhdGVkRGVzY3JpcHRvcnNPcHRpb24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCWlmIChzaG93UmVsYXRlZERlc2NyaXB0b3JzT3B0aW9uLmdldFNlbGVjdGlvbigpKSB7Ci0JCQkJCUFic3RyYWN0RWxlbWVudExheW91dC5wcm9jZXNzRGVzY3JpdG9yc05ld09wdGlvbiA9IHRydWU7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJQWJzdHJhY3RFbGVtZW50TGF5b3V0LnByb2Nlc3NEZXNjcml0b3JzTmV3T3B0aW9uID0gZmFsc2U7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51aS53aXphcmRzLkJhc2VXaXphcmRQYWdlI29uRW50ZXJQYWdlKE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBvbkVudGVyUGFnZShPYmplY3Qgb2JqKSB7Ci0JCWlmIChvYmogIT0gbnVsbCAmJiBvYmogaW5zdGFuY2VvZiBNZXRob2RDb25maWd1cmF0aW9uKSB7Ci0JCQlNZXRob2RDb25maWd1cmF0aW9uIHNlbGVjdGVkQ29uZmlnID0gKE1ldGhvZENvbmZpZ3VyYXRpb24pIG9iajsKLQkJCWlmICghc2VsZWN0ZWRDb25maWdzLmNvbnRhaW5zKHNlbGVjdGVkQ29uZmlnKSkgewotCQkJCXNlbGVjdGVkQ29uZmlncy5hZGQoc2VsZWN0ZWRDb25maWcpOwotCQkJfQotCQkJaWYgKHNlbGVjdGVkQ29uZmlnICE9IGNvbmZpZykgewotCQkJCWNvbmZpZyA9IHNlbGVjdGVkQ29uZmlnOwotCQkJCWluaXRDb250cm9scygpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkUGFnZSNpc1BhZ2VDb21wbGV0ZSgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNQYWdlQ29tcGxldGUoKSB7Ci0JCVN0cmluZyBwYXRoID0gYWJvdXRIVE1MVGV4dC5nZXRUZXh0KCk7Ci0JCUlQYXRoIGVjUGF0aCA9IFBhdGguZnJvbU9TU3RyaW5nKHBhdGgpOwotCQlib29sZWFuIGlzVmFsaWQgPSBlY1BhdGguaXNWYWxpZFBhdGgocGF0aCk7Ci0JCWlmICghaXNWYWxpZCkgewotCQkJc2V0RXJyb3JNZXNzYWdlKFB1Ymxpc2hpbmdVSVJlc291cmNlcy5pbnZhbGlkQWJvdXRQYXRoRXJyb3JfbXNnKTsKLQkJCXJldHVybiBmYWxzZTsKLQkJfSBlbHNlIGlmICghU3RyVXRpbC5pc1ZhbGlkUHVibGlzaFBhdGgocGF0aCkpIHsKLQkJCXNldEVycm9yTWVzc2FnZShQdWJsaXNoaW5nVUlSZXNvdXJjZXMuaW52YWxpZEFib3V0UGF0aENoYXJzRXJyb3JfbXNnKTsKLQkJCXJldHVybiBmYWxzZTsKLQkJfSBlbHNlIHsKLQkJCXNldEVycm9yTWVzc2FnZShudWxsKTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51aS53aXphcmRzLkJhc2VXaXphcmRQYWdlI2dldE5leHRQYWdlRGF0YSgpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXROZXh0UGFnZURhdGEoKSB7Ci0JCXJldHVybiBjb25maWc7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgdXNlciBzZWxlY3RlZCBwdWJsaXNoaW5nIG9wdGlvbnMuCi0JICogCi0JICogQHJldHVybiBhIDxjb2RlPlB1Ymxpc2hPcHRpb25zPC9jb2RlPiBvYmplY3QKLQkgKi8KLQlwdWJsaWMgUHVibGlzaE9wdGlvbnMgZ2V0UHVibGlzaGluZ09wdGlvbnMoKSB7Ci0JCVB1Ymxpc2hIVE1MT3B0aW9ucyBvcHRpb25zID0gbmV3IFB1Ymxpc2hIVE1MT3B0aW9ucygpOwotCi0JCW9wdGlvbnMuc2V0VGl0bGUoZ2V0V2ViU2l0ZVRpdGxlKCkpOwotCQlvcHRpb25zLnNldEJhbm5lckltYWdlKGdldEJhbm5lckltYWdlUGF0aCgpKTsKLQkJb3B0aW9ucy5zZXRBYm91dEhUTUwoZ2V0QWJvdXRIVE1MUGF0aCgpKTsKLQkJb3B0aW9ucy5zZXRGZWVkYmFja1VSTChnZXRGZWVkYmFja1VSTCgpKTsKLQkJb3B0aW9ucy5zZXRQdWJsaXNoR2xvc3NhcnkoZ2V0UHVibGlzaEdsb3NzYXJ5U2VsZWN0aW9uKCkpOwotCQlvcHRpb25zLnNldFB1Ymxpc2hJbmRleChnZXRQdWJsaXNoSW5kZXhTZWxlY3Rpb24oKSk7Ci0JCW9wdGlvbnMuc2V0Q2hlY2tFeHRlcm5hbExpbmtzKGdldENoZWNrRXh0ZXJuYWxMaW5rc1NlbGVjdGlvbigpKTsKLQkJb3B0aW9ucy5zZXRQdWJsaXNoVW5vcGVuQUREKGdldFB1Ymxpc2hVbm9wZW5BRERTZWxlY3Rpb24oKSk7Ci0JCW9wdGlvbnMuc2V0UHVibGlzaEJhc2VBRChnZXRQdWJsaXNoQmFzZUFEU2VsZWN0aW9uKCkpOwotCQlvcHRpb25zLnNldENvbnZlcnRCcm9rZW5MaW5rcyhnZXRDb252ZXJ0QnJva2VuTGlua3NTZWxlY3Rpb24oKSk7Ci0JCW9wdGlvbnMuc2V0UHVibGlzaExpZ2h0V2VpZ2h0VHJlZShnZXRQdWJsaXNoTGlnaHRXZWlnaHRUcmVlU2VsZWN0aW9uKCkpOwotCQlvcHRpb25zLnNldFNob3dNZXRob2RDb250ZW50SW5EZXNjcmlwdG9ycyhnZXRTaG93RXh0cmFEZXNjcmlwdG9ySW5mb1NlbGVjdGlvbigpKTsKLQkJb3B0aW9ucy5zZXRTaG93UmVsYXRlZERlc2NyaXB0b3JzKHNob3dSZWxhdGVkRGVzY3JpcHRvcnMuZ2V0U2VsZWN0aW9uKCkpOwotCQlvcHRpb25zLnNldFNob3dSZWxhdGVkRGVzY3JpcHRvcnNPcHRpb24oc2hvd1JlbGF0ZWREZXNjcmlwdG9yc09wdGlvbi5nZXRTZWxlY3Rpb24oKSk7CQkKLQkJb3B0aW9ucy5zZXRTaG93RGVzY3JpcHRvcnNJbk5hdmlnYXRpb25UcmVlKHNob3dEZXNjcmlwdG9yc0luTmF2aWdhdGlvblRyZWUuZ2V0U2VsZWN0aW9uKCkpOwotCi0JCVN0cmluZyBkZWZhdWx0QWN0aXZpdHlUYWIgPSBnZXREZWZhdWx0QWN0aXZpdHlUYWJTZWxlY3Rpb24oKTsKLQkJaWYgKGRlZmF1bHRBY3Rpdml0eVRhYiAhPSBudWxsKSB7Ci0JCQlvcHRpb25zLnNldERlZmF1bHRBY3Rpdml0eVRhYihkZWZhdWx0QWN0aXZpdHlUYWIpOwotCQl9Ci0KLQkJcmV0dXJuIG9wdGlvbnM7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgdXNlciBzcGVjaWZpZWQgd2ViIHNpdGUgdGl0bGUuCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRXZWJTaXRlVGl0bGUoKSB7Ci0JCXJldHVybiB0aXRsZVRleHQuZ2V0VGV4dCgpLnRyaW0oKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSB1c2VyIHNwZWNpZmllZCBiYW5uZXIgaW1hZ2UgcGF0aC4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEJhbm5lckltYWdlUGF0aCgpIHsKLQkJcmV0dXJuIGJhbm5lckltYWdlVGV4dC5nZXRUZXh0KCkudHJpbSgpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHVzZXIgc3BlY2lmaWVkIGFib3V0IEhUTUwgcGF0aC4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEFib3V0SFRNTFBhdGgoKSB7Ci0JCXJldHVybiBhYm91dEhUTUxUZXh0LmdldFRleHQoKS50cmltKCk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgdXNlciBzcGVjaWZpZWQgZmVlZGJhY2sgVVJMLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RmVlZGJhY2tVUkwoKSB7Ci0JCXJldHVybiBmZWVkYmFja1VSTFRleHQuZ2V0VGV4dCgpLnRyaW0oKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSB1c2VyIHNwZWNpZmllZCBwdWJsaXNoIGdsb3NzYXJ5IHNlbGVjdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBnZXRQdWJsaXNoR2xvc3NhcnlTZWxlY3Rpb24oKSB7Ci0JCXJldHVybiBwdWJsaXNoR2xvc3NhcnlDaGVja2JveC5nZXRTZWxlY3Rpb24oKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSB1c2VyIHNwZWNpZmllZCBwdWJsaXNoIGluZGV4IHNlbGVjdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBnZXRQdWJsaXNoSW5kZXhTZWxlY3Rpb24oKSB7Ci0JCXJldHVybiBwdWJsaXNoSW5kZXhDaGVja2JveC5nZXRTZWxlY3Rpb24oKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSB1c2VyIHNwZWNpZmllZCBjaGVjayBleHRlcm5hbCBsaW5rcyBzZWxlY3Rpb24uCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gZ2V0Q2hlY2tFeHRlcm5hbExpbmtzU2VsZWN0aW9uKCkgewotCQlyZXR1cm4gY2hlY2tFeHRlcm5hbExpbmtzQ2hlY2tib3guZ2V0U2VsZWN0aW9uKCk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgdXNlciBzcGVjaWZpZWQgY29udmVydCBicm9rZW4gbGlua3Mgc2VsZWN0aW9uLgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGdldENvbnZlcnRCcm9rZW5MaW5rc1NlbGVjdGlvbigpIHsKLQkJcmV0dXJuIGNvbnZlcnRCcm9rZW5MaW5rc0NoZWNrYm94LmdldFNlbGVjdGlvbigpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHVzZXIgc3BlY2lmaWVkIGF1dG8gZ2VuZXJhdGUgYWN0aXZpdHkgZGV0YWlsIGRpYWdyYW1zIHNlbGVjdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBnZXRQdWJsaXNoVW5vcGVuQUREU2VsZWN0aW9uKCkgewotCQlyZXR1cm4gcHVibGlzaFVub3BlbkFERENoZWNrYm94LmdldFNlbGVjdGlvbigpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHVzZXIgc3BlY2lmaWVkIHB1Ymxpc2ggYWN0aXZpdHkgZGlhZ3JhbSBmb3IgYmFzZSBhY3RpdnRpZXMgd2l0aAotCSAqIHVubW9kaWZpZWQgZXh0ZW5zaW9ucy4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBnZXRQdWJsaXNoQmFzZUFEU2VsZWN0aW9uKCkgewotCQlyZXR1cm4gcHVibGlzaEJhc2VBRENoZWNrYm94LmdldFNlbGVjdGlvbigpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHVzZXIgc3BlY2lmaWVkIGdlbmVyYXRlIGxpZ2h0IHdlaWdodCB0cmVlIHNlbGVjdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBnZXRQdWJsaXNoTGlnaHRXZWlnaHRUcmVlU2VsZWN0aW9uKCkgewotCQlyZXR1cm4gIXB1Ymxpc2hMaWdodFdlaWdodFRyZWVDaGVja2JveC5nZXRTZWxlY3Rpb24oKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSB1c2VyIHNwZWNpZmllZCBzaG93IGV4dHJhIGRlc2NyaXB0b3IgaW5mbyBzZWxlY3Rpb24uCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gZ2V0U2hvd0V4dHJhRGVzY3JpcHRvckluZm9TZWxlY3Rpb24oKSB7Ci0JCXJldHVybiBleHRyYURlc2NyaXB0b3JJbmZvQ3RyLmdldFNlbGVjdGlvbigpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHVzZXIgc3BlY2lmaWVkIHNob3cgcmVsYXRlZCBkZXNjcmlwdG9yIGluIGNvbnRlbnQgcGFnZQotCSAqIHNlbGVjdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBnZXRTaG93UmVsYXRlZERlc2NyaXB0b3JzU2VsZWN0aW9uKCkgewotCQlyZXR1cm4gc2hvd1JlbGF0ZWREZXNjcmlwdG9ycy5nZXRTZWxlY3Rpb24oKTsKLQl9Ci0JCi0JLyoqCi0JICogR2V0cyB0aGUgdXNlciBzcGVjaWZpZWQgU2hvdyBhbGwgaW5kaXJlY3QgKGdyZWVuKSBvY2N1cnJlbmNlcyAKLQkgKiBpbiBleHRlbmRlZCBwYXR0ZXJucwotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGdldFNob3dSZWxhdGVkRGVzY3JpcHRvcnNPcHRpb25TZWxlY3Rpb24oKSB7Ci0JCXJldHVybiBzaG93UmVsYXRlZERlc2NyaXB0b3JzT3B0aW9uLmdldFNlbGVjdGlvbigpOwotCX0KLQkKLQkvKioKLQkgKiBHZXRzIHRoZSB1c2VyIHNwZWNpZmllZCBzaG93IGRlc2NyaXB0b3JzIGluIG5hdmlnYXRpb24gdHJlZSBzZWxlY3Rpb24uCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gZ2V0U2hvd0Rlc2NyaXB0b3JzSW5OYXZpZ2F0aW9uVHJlZVNlbGVjdGlvbigpIHsKLQkJcmV0dXJuIHNob3dEZXNjcmlwdG9yc0luTmF2aWdhdGlvblRyZWUuZ2V0U2VsZWN0aW9uKCk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgdXNlciBzcGVjaWZpZWQgZGVmYXVsdCBhY3Rpdml0eSB0YWIgc2VsZWN0aW9uLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGVmYXVsdEFjdGl2aXR5VGFiU2VsZWN0aW9uKCkgewotCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWwgPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGFjdGl2aXR5VGFiVmlld2VyCi0JCQkJLmdldFNlbGVjdGlvbigpOwotCQlNYXAuRW50cnkgaXRlbSA9IChNYXAuRW50cnkpIHNlbC5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJaWYgKGl0ZW0gPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gKFN0cmluZykgaXRlbS5nZXRLZXkoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNhdmVzIHRoZSB1c2VyIHNlbGVjdGlvbnMgaW4gdGhpcyB3aXphcmQgcGFnZSB0byBwcmVmZXJlbmNlIHN0b3JlLgotCSAqLwotCXB1YmxpYyB2b2lkIHNhdmVQcmVmZXJlbmNlcygpIHsKLQkJaWYgKGNvbmZpZyAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgY29uZmlnSWQgPSBjb25maWcuZ2V0R3VpZCgpOwotCQkJc2F2ZVRpdGxlQW5kTGlua3NQcmVmZXJlbmNlcyhjb25maWdJZCk7Ci0JCQlzYXZlR2xvc3NhcnlBbmRJbmRleFByZWZlcmVuY2VzKGNvbmZpZ0lkKTsKLQkJCXNhdmVWYWxpZGF0aW9uUHJlZmVyZW5jZXMoY29uZmlnSWQpOwotCQkJc2F2ZURpYWdyYW1HZW5lcmF0aW9uUHJlZmVyZW5jZXMoY29uZmlnSWQpOwotCQkJc2F2ZUxheW91dFByZWZlcmVuY2VzKGNvbmZpZ0lkKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNhdmVzIHRoZSB0aXRsZSBhbmQgbGlua3MgcHJlZmVyZW5jZXMuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2F2ZVRpdGxlQW5kTGlua3NQcmVmZXJlbmNlcyhTdHJpbmcgY29uZmlnSWQpIHsKLQkJUHVibGlzaGluZ1VJUHJlZmVyZW5jZXMuc2V0VGl0bGUoY29uZmlnSWQsIGdldFdlYlNpdGVUaXRsZSgpKTsKLQkJUHVibGlzaGluZ1VJUHJlZmVyZW5jZXMuc2V0QmFubmVySW1hZ2UoY29uZmlnSWQsIGdldEJhbm5lckltYWdlUGF0aCgpKTsKLQkJUHVibGlzaGluZ1VJUHJlZmVyZW5jZXMuc2V0QWJvdXRIVE1MKGNvbmZpZ0lkLCBnZXRBYm91dEhUTUxQYXRoKCkpOwotCQlQdWJsaXNoaW5nVUlQcmVmZXJlbmNlcy5zZXRGZWVkYmFja1VSTChjb25maWdJZCwgZ2V0RmVlZGJhY2tVUkwoKSk7Ci0JfQotCi0JLyoqCi0JICogU2F2ZXMgdGhlIGdsb3NhYXJ5IGFuZCBpbmRleCBwcmVmZXJlbmNlcy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzYXZlR2xvc3NhcnlBbmRJbmRleFByZWZlcmVuY2VzKFN0cmluZyBjb25maWdJZCkgewotCQlQdWJsaXNoaW5nVUlQcmVmZXJlbmNlcy5zZXRJbmNsdWRlR2xvc3NhcnkoY29uZmlnSWQsCi0JCQkJZ2V0UHVibGlzaEdsb3NzYXJ5U2VsZWN0aW9uKCkpOwotCQlQdWJsaXNoaW5nVUlQcmVmZXJlbmNlcy5zZXRJbmNsdWRlSW5kZXgoY29uZmlnSWQsCi0JCQkJZ2V0UHVibGlzaEluZGV4U2VsZWN0aW9uKCkpOwotCX0KLQotCS8qKgotCSAqIFNhdmVzIHRoZSB2YWxpZGF0aW9uIHByZWZlcmVuY2VzLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNhdmVWYWxpZGF0aW9uUHJlZmVyZW5jZXMoU3RyaW5nIGNvbmZpZ0lkKSB7Ci0JCVB1Ymxpc2hpbmdVSVByZWZlcmVuY2VzLnNldENoZWNrRXh0ZXJuYWxMaW5rcyhjb25maWdJZCwKLQkJCQlnZXRDaGVja0V4dGVybmFsTGlua3NTZWxlY3Rpb24oKSk7Ci0JCVB1Ymxpc2hpbmdVSVByZWZlcmVuY2VzLnNldENvbnZlcnRCcm9rZW5MaW5rcyhjb25maWdJZCwKLQkJCQlnZXRDb252ZXJ0QnJva2VuTGlua3NTZWxlY3Rpb24oKSk7Ci0JfQotCi0JLyoqCi0JICogU2F2ZXMgdGhlIGRpYWdyYW0gZ2VuZXJhdGlvbiBwcmVmZXJlbmNlcy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzYXZlRGlhZ3JhbUdlbmVyYXRpb25QcmVmZXJlbmNlcyhTdHJpbmcgY29uZmlnSWQpIHsKLQkJUHVibGlzaGluZ1VJUHJlZmVyZW5jZXMuc2V0UHVibGlzaFVub3BlbkFjdGl2aXR5REQoY29uZmlnSWQsCi0JCQkJZ2V0UHVibGlzaFVub3BlbkFERFNlbGVjdGlvbigpKTsKLQkJUHVibGlzaGluZ1VJUHJlZmVyZW5jZXMuc2V0UHVibGlzaEFERm9yQWN0aXZpdHlFeHRlbnNpb24oY29uZmlnSWQsCi0JCQkJZ2V0UHVibGlzaEJhc2VBRFNlbGVjdGlvbigpKTsKLQl9Ci0KLQkvKioKLQkgKiBTYXZlcyB0aGUgbGF5b3V0IHByZWZlcmVuY2VzLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNhdmVMYXlvdXRQcmVmZXJlbmNlcyhTdHJpbmcgY29uZmlnSWQpIHsKLQkJUHVibGlzaGluZ1VJUHJlZmVyZW5jZXMuc2V0TGlnaHRXZWlnaHRUcmVlKGNvbmZpZ0lkLAotCQkJCWdldFB1Ymxpc2hMaWdodFdlaWdodFRyZWVTZWxlY3Rpb24oKSk7Ci0JCVB1Ymxpc2hpbmdVSVByZWZlcmVuY2VzLnNldEV4dHJhRGVzY3JpcHRvckluZm8oY29uZmlnSWQsCi0JCQkJZ2V0U2hvd0V4dHJhRGVzY3JpcHRvckluZm9TZWxlY3Rpb24oKSk7Ci0JCVB1Ymxpc2hpbmdVSVByZWZlcmVuY2VzLnNldFNob3dSZWxhdGVkRGVzY3JpcHRvcnMoY29uZmlnSWQsCi0JCQkJZ2V0U2hvd1JlbGF0ZWREZXNjcmlwdG9yc1NlbGVjdGlvbigpKTsKLQkJUHVibGlzaGluZ1VJUHJlZmVyZW5jZXMuc2V0U2hvd1JlbGF0ZWREZXNjcmlwdG9yc09wdGlvbihjb25maWdJZCwKLQkJCQlnZXRTaG93UmVsYXRlZERlc2NyaXB0b3JzT3B0aW9uU2VsZWN0aW9uKCkpOwotCQlQdWJsaXNoaW5nVUlQcmVmZXJlbmNlcy5zZXRTaG93RGVzY3JpcHRvcnNJbk5hdmlnYXRpb25UcmVlKGNvbmZpZ0lkLAotCQkJCWdldFNob3dEZXNjcmlwdG9yc0luTmF2aWdhdGlvblRyZWVTZWxlY3Rpb24oKSk7Ci0JCVB1Ymxpc2hpbmdVSVByZWZlcmVuY2VzLnNldERlZmF1bHRBY3Rpdml0eVRhYihjb25maWdJZCwKLQkJCQlnZXREZWZhdWx0QWN0aXZpdHlUYWJTZWxlY3Rpb24oKSk7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvLmNsYXNzcGF0aCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2NWFjMDYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLy5vcHRpb25zIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvLm9wdGlvbnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhYTk3NGQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvLm9wdGlvbnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSMgVHVybiBvbiBkZWJ1ZyB0cmFjZSBmb3IgdGhlIFB1Ymxpc2hpbmcgcGx1Zy1pbgotb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZGVidWc9dHJ1ZQotb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvcHJvZmlsaW5nPXRydWUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLy5wcm9qZWN0IGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5ZWQ1NTcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZzwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9NRVRBLUlORi9NQU5JRkVTVC5NRiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYmVkYzJiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nCi1CdW5kbGUtVmVyc2lvbjogMS41LjAucXVhbGlmaWVyCi1CdW5kbGUtQ2xhc3NQYXRoOiBwdWJsaXNoaW5nLmphciwgbGliL3Jwd2NvcmUuamFyCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5QdWJsaXNoaW5nUGx1Z2luCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5lcGYuc2VhcmNoO3Zpc2liaWxpdHk6PXJlZXhwb3J0LAotIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZSwKLSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLAotIG9yZy5lY2xpcHNlLmNvcmUubmV0Ci1FY2xpcHNlLUxhenlTdGFydDogdHJ1ZQotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLAotIG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnNlcnZpY2VzLAotIG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnNlcnZpY2VzLmluZGV4LAotIG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnNlcnZpY2VzLnNlYXJjaCwKLSBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51dGlsLAotIG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnV0aWwuaHR0cAotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9idWlsZC5wcm9wZXJ0aWVzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGQ4MmZjMS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotc291cmNlLnB1Ymxpc2hpbmcuamFyID0gc3JjLwotb3V0cHV0LnB1Ymxpc2hpbmcuamFyID0gYmluLwotYmluLmluY2x1ZGVzID0gcHVibGlzaGluZy5qYXIsXAotICAgICAgICAgICAgICAgLm9wdGlvbnMsXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIGRvY3Jvb3QvLFwKLSAgICAgICAgICAgICAgIGljb25zLyxcCi0gICAgICAgICAgICAgICBpbWFnZXMvLFwKLSAgICAgICAgICAgICAgIGtleXdvcmRpbmRleGRlZi50eHQsXAotICAgICAgICAgICAgICAga2V5d29yZHBvc3RhbWJsZS50eHQsXAotICAgICAgICAgICAgICAga2V5d29yZHByZWFtYmxlLnR4dCxcCi0gICAgICAgICAgICAgICBrZXl3b3Jkcy50eHQsXAotICAgICAgICAgICAgICAgeHNsLwotCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L1dFQi1JTkYvbGliL2VwZi13ZWItc2VhcmNoLmphciBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3QvV0VCLUlORi9saWIvZXBmLXdlYi1zZWFyY2guamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMGVkMzE5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3QvV0VCLUlORi9saWIvZXBmLXdlYi1zZWFyY2guamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9XRUItSU5GL2xpYi9lcGYtd2ViLmphciBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3QvV0VCLUlORi9saWIvZXBmLXdlYi5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyYWEwNWQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9XRUItSU5GL2xpYi9lcGYtd2ViLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3QvV0VCLUlORi9saWIvaWN1NGpfM180LmphciBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3QvV0VCLUlORi9saWIvaWN1NGpfM180LmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDM1ZTNjMy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L1dFQi1JTkYvbGliL2ljdTRqXzNfNC5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L1dFQi1JTkYvbGliL2x1Y2VuZS1jb3JlLTEuOS4xLmphciBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3QvV0VCLUlORi9saWIvbHVjZW5lLWNvcmUtMS45LjEuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMTQzZTlkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3QvV0VCLUlORi9saWIvbHVjZW5lLWNvcmUtMS45LjEuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9XRUItSU5GL3dlYi54bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L1dFQi1JTkYvd2ViLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2Y0YTJlNy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L1dFQi1JTkYvd2ViLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IklTTy04ODU5LTEiPz4KLQotPCFET0NUWVBFIHdlYi1hcHAKLSAgICBQVUJMSUMgIi0vL1N1biBNaWNyb3N5c3RlbXMsIEluYy4vL0RURCBXZWIgQXBwbGljYXRpb24gMi4zLy9FTiIKLSAgICAiaHR0cDovL2phdmEuc3VuLmNvbS9kdGQvd2ViLWFwcF8yXzMuZHRkIj4KLQotPHdlYi1hcHA+Ci0gIDxzZXJ2bGV0PgotICAJPHNlcnZsZXQtbmFtZT5TZWFyY2hTZXJ2bGV0PC9zZXJ2bGV0LW5hbWU+Ci0gIAk8c2VydmxldC1jbGFzcz5vcmcuZWNsaXBzZS5lcGYud2ViLnNlcnZsZXQuU2VhcmNoU2VydmxldDwvc2VydmxldC1jbGFzcz4KLSAgCTxpbml0LXBhcmFtPgotICAJCTxwYXJhbS1uYW1lPnNlYXJjaEluZGV4PC9wYXJhbS1uYW1lPgotICAJCTxwYXJhbS12YWx1ZT5zZWFyY2gvaW5kZXg8L3BhcmFtLXZhbHVlPgotICAJPC9pbml0LXBhcmFtPgotICAJPGluaXQtcGFyYW0+Ci0gIAkJPHBhcmFtLW5hbWU+eHNsRmlsZTwvcGFyYW0tbmFtZT4KLSAgCQk8cGFyYW0tdmFsdWU+L3NlYXJjaC9zZWFyY2hfcmVzdWx0LnhzbDwvcGFyYW0tdmFsdWU+Ci0gIAk8L2luaXQtcGFyYW0+Ci0gIDwvc2VydmxldD4KLSAgPHNlcnZsZXQtbWFwcGluZz4KLSAgPCEtLSBub3RlOiBkb24ndCBjaGFuZ2UgdGhlIHNlcnZsZXQgbWFwcGluZyBoZXJlIHNpbmNlIHRoZSBzdHJpbmcgaXMgdXNlZCBpbiBvdGhlciBmaWxlcyBhcyB3ZWxsIC0tPgotICAJPHNlcnZsZXQtbmFtZT5TZWFyY2hTZXJ2bGV0PC9zZXJ2bGV0LW5hbWU+Ci0gIAk8dXJsLXBhdHRlcm4+L1NlYXJjaFNlcnZsZXQ8L3VybC1wYXR0ZXJuPgotICA8L3NlcnZsZXQtbWFwcGluZz4KLTwvd2ViLWFwcD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3QvYWJvdXQuaHRtIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9hYm91dC5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmNmNkYjUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9hYm91dC5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotCSJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLQotCi08aHRtbCBsYW5nPSJlbiIgeG1sOmxhbmc9ImVuIj4KLTwhLS0KLSAgICBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiLz4KLQk8dGl0bGU+QWJvdXQ8L3RpdGxlPgotPHNjcmlwdCBzcmM9InNjcmlwdHMvY29tbW9uLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij48L3NjcmlwdD4KLQk8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgotCQlib2R5IHsKLQkJCW1hcmdpbjogOHB4OwotCQl9Ci0JPC9zdHlsZT4KLTwvaGVhZD4KLQotPGJvZHk+Ci0KLQk8aW1nIHNyYz0iLi9pbWFnZXMvaWNvbl9hYm91dC5naWYiIHdpZHRoPSIzMiIgaGVpZ2h0PSIzMiIgYWx0PSJhYm91dCBpY29uIiBib3JkZXI9IjAiLz48YnIgLz48YnIgLz4KLTxzcGFuIGNsYXNzPSJwb3AiPkVjbGlwc2UgUHJvY2VzcyBGcmFtZXdvcms8YnIgLz4KLVZlcnNpb24gMS41PGJyIC8+Ci08YnIgLz4KLShjKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgYW5kIG90aGVycyAyMDA0LCAyMDA4LjxiciAvPgotQWxsIFJpZ2h0cyBSZXNlcnZlZC48L3NwYW4+PGJyIC8+PGJyIC8+Ci0JPHRhYmxlIHN1bW1hcnk9IiIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiPgotCSAgPHRyPgotCSAgICA8dGQ+PGltZyBzcmM9Ii4vaW1hZ2VzL3NoaW0uZ2lmIiBhbHQ9IiIgd2lkdGg9IjEiIGhlaWdodD0iMSIgLz48L3RkPgotCSAgICA8dGQgY2xhc3M9ImJ1dHRvbmJvZHkiIGNvbHNwYW49IjIiPjxpbWcgc3JjPSIuL2ltYWdlcy9zaGltLmdpZiIgYWx0PSIiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIC8+PC90ZD4KLQkgICAgPHRkIGNvbHNwYW49IjIiPjxpbWcgc3JjPSIuL2ltYWdlcy9zaGltLmdpZiIgYWx0PSIiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIC8+PC90ZD4KLQkgIDwvdHI+Ci0JICA8dHI+Ci0JICAgIDx0ZCBjbGFzcz0iYnV0dG9uYm9keSIgY29sc3Bhbj0iNCIgcm93c3Bhbj0iMiI+PGltZyBzcmM9Ii4vaW1hZ2VzL3NoaW0uZ2lmIiBhbHQ9IiIgd2lkdGg9IjEiIGhlaWdodD0iMSIgLz48L3RkPgotCSAgICA8dGQ+PGltZyBzcmM9Ii4vaW1hZ2VzL3NoaW0uZ2lmIiBhbHQ9IiIgd2lkdGg9IjEiIGhlaWdodD0iMSIgLz48L3RkPgotCSAgPC90cj4KLQkgIDx0cj4KLQkgICAgPHRkIGNsYXNzPSJidXR0b25zaGFkb3ciPjxpbWcgc3JjPSIuL2ltYWdlcy9zaGltLmdpZiIgYWx0PSIiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIC8+PC90ZD4KLQkgIDwvdHI+Ci0JICA8dHI+Ci0JICAgIDx0ZCBjbGFzcz0iYnV0dG9uYm9keSIgY29sc3Bhbj0iMiIgcm93c3Bhbj0iMiI+PGltZyBzcmM9Ii4vaW1hZ2VzL3NoaW0uZ2lmIiBhbHQ9IiIgd2lkdGg9IjEiIGhlaWdodD0iMSIgLz48L3RkPgotCSAgICA8dGQgY2xhc3M9ImJ1dHRvbmJvZHkiPjxhIGNsYXNzPSJidXR0b24iIGhyZWY9ImphdmFzY3JpcHQ6c2VsZi5jbG9zZSgpOyI+PHNwYW4gY2xhc3M9ImJ1dHRvbnR4dCI+Jm5ic3A7Q2xvc2UmbmJzcDs8L3NwYW4+PC9hPjwvdGQ+Ci0JICAgIDx0ZCBjbGFzcz0iYnV0dG9uYm9keSIgcm93c3Bhbj0iMiI+PGltZyBzcmM9Ii4vaW1hZ2VzL3NoaW0uZ2lmIiBhbHQ9IiIgd2lkdGg9IjEiIGhlaWdodD0iMSIgLz48L3RkPgotCSAgICA8dGQgY2xhc3M9ImJ1dHRvbnNoYWRvdyIgIHJvd3NwYW49IjIiPjxpbWcgc3JjPSIuL2ltYWdlcy9zaGltLmdpZiIgYWx0PSIiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIC8+PC90ZD4KLQkgIDwvdHI+Ci0JICA8dHI+Ci0JICAgIDx0ZCBjbGFzcz0iYnV0dG9uYm9keSI+PGltZyBzcmM9Ii4vaW1hZ2VzL3NoaW0uZ2lmIiBhbHQ9IiIgd2lkdGg9IjEiIGhlaWdodD0iMSIgLz48L3RkPgotCSAgPC90cj4KLQkgIDx0cj4KLQkgICAgPHRkPjxpbWcgc3JjPSIuL2ltYWdlcy9zaGltLmdpZiIgYWx0PSIiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIC8+PC90ZD4KLQkgICAgPHRkIGNsYXNzPSJidXR0b25ib2R5Ij48aW1nIHNyYz0iLi9pbWFnZXMvc2hpbS5naWYiIGFsdD0iIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiAvPjwvdGQ+Ci0JICAgIDx0ZCBjbGFzcz0iYnV0dG9uYm9keSI+PGltZyBzcmM9Ii4vaW1hZ2VzL3NoaW0uZ2lmIiBhbHQ9IiIgd2lkdGg9IjEiIGhlaWdodD0iMSIgLz48L3RkPgotCSAgICA8dGQgY2xhc3M9ImJ1dHRvbnNoYWRvdyI+PGltZyBzcmM9Ii4vaW1hZ2VzL3NoaW0uZ2lmIiBhbHQ9IiIgd2lkdGg9IjEiIGhlaWdodD0iMSIgLz48L3RkPgotCSAgICA8dGQ+PGltZyBzcmM9Ii4vaW1hZ2VzL3NoaW0uZ2lmIiBhbHQ9IiIgd2lkdGg9IjEiIGhlaWdodD0iMSIgLz48L3RkPgotCSAgPC90cj4KLQkgIDx0cj4KLQkgICAgPHRkIGNvbHNwYW49IjIiPjxpbWcgc3JjPSIuL2ltYWdlcy9zaGltLmdpZiIgYWx0PSIiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIC8+PC90ZD4KLQkgICAgPHRkIGNsYXNzPSJidXR0b25zaGFkb3ciPjxpbWcgc3JjPSIuL2ltYWdlcy9zaGltLmdpZiIgYWx0PSIiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIC8+PC90ZD4KLQkgICAgPHRkIGNvbHNwYW49IjIiPjxpbWcgc3JjPSIuL2ltYWdlcy9zaGltLmdpZiIgYWx0PSIiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIC8+PC90ZD4KLQkgIDwvdHI+Ci0JPC90YWJsZT4KLQotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9lcGYuaWNvIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9lcGYuaWNvCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0M2M4YmI5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3QvZXBmLmljbworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3QvaW1hZ2VzL0VQRkNfYmFubmVyLmpwZyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3QvaW1hZ2VzL0VQRkNfYmFubmVyLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDJlM2RkYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L2ltYWdlcy9FUEZDX2Jhbm5lci5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L2ltYWdlcy9iYW5uZXIuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9pbWFnZXMvYmFubmVyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODMzMDBlOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L2ltYWdlcy9iYW5uZXIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9pbWFnZXMvY29sbGFwc2VfYWxsLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3QvaW1hZ2VzL2NvbGxhcHNlX2FsbC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4ZjcwMTkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9pbWFnZXMvY29sbGFwc2VfYWxsLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3QvaW1hZ2VzL2RvY19lbGVtX2Nsb3NlLmpwZyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3QvaW1hZ2VzL2RvY19lbGVtX2Nsb3NlLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjZkMjAyNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L2ltYWdlcy9kb2NfZWxlbV9jbG9zZS5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L2ltYWdlcy9kb2NfZWxlbV9jbG9zZV9zbWFsbC5qcGcgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L2ltYWdlcy9kb2NfZWxlbV9jbG9zZV9zbWFsbC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2NmI4MTQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9pbWFnZXMvZG9jX2VsZW1fY2xvc2Vfc21hbGwuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9pbWFnZXMvZG9jX2VsZW1fY2xvc2Vfc21hbGxfcmlnaHQuanBnIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9pbWFnZXMvZG9jX2VsZW1fY2xvc2Vfc21hbGxfcmlnaHQuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNzA2YzkxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3QvaW1hZ2VzL2RvY19lbGVtX2Nsb3NlX3NtYWxsX3JpZ2h0LmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3QvaW1hZ2VzL2RvY19lbGVtX29wZW4uanBnIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9pbWFnZXMvZG9jX2VsZW1fb3Blbi5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2OTA0ZWUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9pbWFnZXMvZG9jX2VsZW1fb3Blbi5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L2ltYWdlcy9kb2NfZWxlbV9vcGVuX3NtYWxsLmpwZyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3QvaW1hZ2VzL2RvY19lbGVtX29wZW5fc21hbGwuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYTYzNWIxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3QvaW1hZ2VzL2RvY19lbGVtX29wZW5fc21hbGwuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9pbWFnZXMvZG9jX2VsZW1fb3Blbl9zbWFsbF9yaWdodC5qcGcgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L2ltYWdlcy9kb2NfZWxlbV9vcGVuX3NtYWxsX3JpZ2h0LmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTViN2Q0ZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L2ltYWdlcy9kb2NfZWxlbV9vcGVuX3NtYWxsX3JpZ2h0LmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3QvaW1hZ2VzL2Rvd25fYXJyb3cuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9pbWFnZXMvZG93bl9hcnJvdy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2OGM0MmUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9pbWFnZXMvZG93bl9hcnJvdy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L2ltYWdlcy9leHBhbmRfYWxsLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3QvaW1hZ2VzL2V4cGFuZF9hbGwuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YTE4YTM5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3QvaW1hZ2VzL2V4cGFuZF9hbGwuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9pbWFnZXMvaWNvbl9hYm91dC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L2ltYWdlcy9pY29uX2Fib3V0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTExM2U1Zi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L2ltYWdlcy9pY29uX2Fib3V0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3QvaW1hZ2VzL25pX2Fib3V0LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3QvaW1hZ2VzL25pX2Fib3V0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzhhYTE0Yy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L2ltYWdlcy9uaV9hYm91dC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L2ltYWdlcy9uaV9kaXNwbGF5VHJlZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L2ltYWdlcy9uaV9kaXNwbGF5VHJlZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4YmNiYWIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9pbWFnZXMvbmlfZGlzcGxheVRyZWUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9pbWFnZXMvbmlfZmVlZGJhY2suZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9pbWFnZXMvbmlfZmVlZGJhY2suZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNWQ1MmY0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3QvaW1hZ2VzL25pX2ZlZWRiYWNrLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3QvaW1hZ2VzL25pX2dldFN0YXJ0ZWQuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9pbWFnZXMvbmlfZ2V0U3RhcnRlZC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3ZDhjYTAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9pbWFnZXMvbmlfZ2V0U3RhcnRlZC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L2ltYWdlcy9uaV9nbG9zc2FyeS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L2ltYWdlcy9uaV9nbG9zc2FyeS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzMmEyM2YuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9pbWFnZXMvbmlfZ2xvc3NhcnkuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9pbWFnZXMvbmlfaGFuZGxlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3QvaW1hZ2VzL25pX2hhbmRsZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwOGQwOWMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9pbWFnZXMvbmlfaGFuZGxlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3QvaW1hZ2VzL25pX2luZGV4LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3QvaW1hZ2VzL25pX2luZGV4LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmQ2ZDMxZi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L2ltYWdlcy9uaV9pbmRleC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L2ltYWdlcy9uaV9wcmludC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L2ltYWdlcy9uaV9wcmludC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0YWExZDcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9pbWFnZXMvbmlfcHJpbnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9pbWFnZXMvbmlfc2VhcmNoLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3QvaW1hZ2VzL25pX3NlYXJjaC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2NzcwZjIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9pbWFnZXMvbmlfc2VhcmNoLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3QvaW1hZ2VzL25pX3NpdGVNYXAuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9pbWFnZXMvbmlfc2l0ZU1hcC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmMjEyYjUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9pbWFnZXMvbmlfc2l0ZU1hcC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L2ltYWdlcy9zaGltLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3QvaW1hZ2VzL3NoaW0uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYWJhNzkwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3QvaW1hZ2VzL3NoaW0uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9pbWFnZXMvc3BsYXNoLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3QvaW1hZ2VzL3NwbGFzaC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyMzk1NmUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9pbWFnZXMvc3BsYXNoLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3QvaW1hZ2VzL3RpdGxlYmFja19sZWZ0LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3QvaW1hZ2VzL3RpdGxlYmFja19sZWZ0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzBlY2EwYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L2ltYWdlcy90aXRsZWJhY2tfbGVmdC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L2ltYWdlcy90aXRsZWJhY2tfcmlnaHQuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9pbWFnZXMvdGl0bGViYWNrX3JpZ2h0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOThiODljMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L2ltYWdlcy90aXRsZWJhY2tfcmlnaHQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9pbWFnZXMvdG9wLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3QvaW1hZ2VzL3RvcC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxNWFjZjQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9pbWFnZXMvdG9wLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3QvaW1hZ2VzL3RvcF9zbS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L2ltYWdlcy90b3Bfc20uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZTdmYmEyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3QvaW1hZ2VzL3RvcF9zbS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L2ltYWdlcy91cF9hcnJvdy5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L2ltYWdlcy91cF9hcnJvdy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxZTVjY2MuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9pbWFnZXMvdXBfYXJyb3cuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9pbmRleC9pbmRleC5jc3MgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L2luZGV4L2luZGV4LmNzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjNiOGU1ZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L2luZGV4L2luZGV4LmNzcworKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKgotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKi8KLQotcC5pbmRleGhlYWRpbmcKLXsKLWZvbnQtZmFtaWx5OiBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotIGZvbnQtd2VpZ2h0OiBib2xkOwotbWFyZ2luLXRvcDogKzJweDsgCi1tYXJnaW4tYm90dG9tOiAtMnB4OwotfQotCi1wLmluZGV4bGV2ZWwxCi17Ci1mb250LWZhbWlseTogQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsKLSBmb250LXNpemU6IHNtYWxsZXI7Ci0gbWFyZ2luLXRvcDogLTBweDsgCi1tYXJnaW4tYm90dG9tOiAtMnB4OwotfQotCi1wLmluZGV4bGV2ZWwyCi17Ci1mb250LWZhbWlseTogQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsKLSBmb250LXNpemU6IHNtYWxsZXI7Ci0gbWFyZ2luLWxlZnQ6ICsxNnB4OwotIG1hcmdpbi10b3A6IC0xcHg7IAotbWFyZ2luLWJvdHRvbTogLTJweDsKLX0KLQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9pbmRleC9pbmRleC5odG0gYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L2luZGV4L2luZGV4Lmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODZhMmE5MS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L2luZGV4L2luZGV4Lmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0JImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotCQotPGh0bWwgbGFuZz0iZW4iIHhtbDpsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04Ii8+Ci08dGl0bGU+SW5kZXggLSBFY2xpcHNlIFByb2Nlc3MgRnJhbWV3b3JrPC90aXRsZT4KLTwvaGVhZD4KLTxmcmFtZXNldCByb3dzPSIyNSwqIj4KLTxmcmFtZSBuYW1lPSJpbmRleF90IiB0aXRsZT0iTmF2aWdhdGlvbiBiYXIiIHNyYz0ibmF2aWcuaHRtIiBzY3JvbGxpbmc9Im5vIiBtYXJnaW5oZWlnaHQ9IjIiIG1hcmdpbndpZHRoPSIyIi8+Ci08ZnJhbWUgbmFtZT0ia2V5d29yZF90IiB0aXRsZT0iQ29udGVudHMiIHNyYz0iY29udGVudHMuaHRtIiBtYXJnaW5oZWlnaHQ9IjAiIG1hcmdpbndpZHRoPSIyIiBzY3JvbGxpbmc9ImF1dG8iLz4KLTwvZnJhbWVzZXQ+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L2luZGV4L2xvYWRpbmcuaHRtIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9pbmRleC9sb2FkaW5nLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDFiMTgzZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L2luZGV4L2xvYWRpbmcuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsMTYxICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDL0RURCBIVE1MIDQuMDEvL0VOIgotICAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLTxodG1sIGxhbmc9ImVuIiB4bWw6bGFuZz0iZW4iPgotCi08aGVhZD4KLTxtZXRhIEhUVFAtRVFVSVY9InJlZnJlc2giIENPTlRFTlQ9IjE7IHVybD1jb250ZW50cy5odG0iPgotPHRpdGxlPjwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCI+Ci08L2hlYWQ+Ci0KLTxib2R5IGJnY29sb3I9IiNGRkZGRkYiIHRleHQ9IiMwMDAwMDAiIGxpbms9IiMwMDQwODAiIHZsaW5rPSIjNjY2NjY2IiBhbGluaz0iIzAwMDBGRiI+Ci0KLQotPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiB3aWR0aD0iMTAwJSI+PHRyPjx0ZCB2YWxpZ249InRvcCI+Ci0KLQotCi0KLQotCi08aDMgYWxpZ249ImNlbnRlciI+SW5kZXg8L2gzPgotCi08cD48YnI+Ci08L3A+Ci0KLTxoNCBhbGlnbj0iY2VudGVyIj5QbGVhc2Ugd2FpdCB3aGlsZSBpbmRleCBwYWdlIGlzIGxvYWRpbmcuLi48L2g0PgotPHByZSBtc25hdmlnYXRpb24+IDwvcHJlPjwvdGQ+PHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iMjQiPgotCi0KLSAgICAgIDxwPiA8c21hbGw+PHNtYWxsPkNvcHlyaWdodCZuYnNwOwotICAgICAgICAmY29weTsgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVyczwvc21hbGw+PC9zbWFsbD48L3A+Ci0KLTwvdGQ+PHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iMjQiPjwvdGQ+PHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iMSUiPgotPHA+Ci08YSBocmVmPSIuLi9pbmRleC5odG0iPjwvYT4KLTwvcD4KLQotPHNjcmlwdCBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+Ci12YXIgYWxyZWFkeV91c2luZ19mcmFtZXNfTVNHPSJUaGUgRWNsaXBzZSBQcm9jZXNzIEZyYW1ld29yayBpcyBhbHJlYWR5IGRpc3BsYXllZCB1c2luZyBmcmFtZXMiOwotLy8gPCEtLQotZnVuY3Rpb24gbG9hZFRvcCgpCi17Ci0gIGlmKHBhcmVudC5mcmFtZXMubGVuZ3RoIT0wICYmIHBhcmVudC5mcmFtZXNbMV0ubmFtZT09Im9yeV90b2MiKQotICB7Ci0gICAgIGFsZXJ0KGFscmVhZHlfdXNpbmdfZnJhbWVzX01TRyk7Ci0gIH0KLSAgZWxzZQotICB7Ci0gICAgdmFyIGV4cGlyZXMgPSBuZXcgRGF0ZSgpOwotICAgIGV4cGlyZXMuc2V0VGltZSAoZXhwaXJlcy5nZXRUaW1lKCkgKyAoMTAwMCAqIDIwKSk7Ci0gICAgZG9jdW1lbnQuY29va2llID0gInJ1cF9vcnlfZG9jPSIgKyBlc2NhcGUgKGRvY3VtZW50LlVSTCkgKwotICAgICI7IGV4cGlyZXM9IiArIGV4cGlyZXMudG9VVENTdHJpbmcoKSArICAiOyBwYXRoPS8iOwotCi0gICAgdmFyIG5ld19vcnlfZG9jX2xvYyA9IG51bGw7Ci0KLSAgICBmb3IoaT1kb2N1bWVudC5saW5rcy5sZW5ndGgtMTtpPj0wO2ktLSkKLSAgICB7Ci0gICAgICAgaWYoZG9jdW1lbnQubGlua3NbaV0uaHJlZi5pbmRleE9mKCJpbmRleC5odG0iKSE9LTEpCi0gICAgICAgewotICAgICAgICAgbmV3X29yeV9kb2NfbG9jID0gZG9jdW1lbnQubGlua3NbaV0uaHJlZjsKLSAgICAgICAgIGJyZWFrOwotICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZihuZXdfb3J5X2RvY19sb2MhPW51bGwpCi0gICAgewotCWlmKCBzZWxmLm5hbWUgPT0gIm9yeV9kb2MiICkKLQl7Ci0JCXdpbmRvdy5jbG9zZSgpOwotCQl3aW5kb3cub3BlbiggbmV3X29yeV9kb2NfbG9jICk7Ci0JfQotCWVsc2UKLQl7Ci0JICAgICAgIAl0b3AubG9jYXRpb24gPSBuZXdfb3J5X2RvY19sb2M7Ci0JfQotICAgIH0KLSAgIH0KLX0KLS8vIC0tPgotPC9zY3JpcHQ+Ci08c2NyaXB0IGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij4KLS8vIDwhLS0KLSAgZnVuY3Rpb24gZ2V0SW1hZ2VVcmwoaW1hZ2UpCi0gIHsKLSAgICB2YXIgbmV3X29yeV9kb2NfbG9jPW51bGw7Ci0gICAgZm9yKGk9ZG9jdW1lbnQubGlua3MubGVuZ3RoLTE7aT49MDtpLS0pCi0gICAgewotICAgICAgIGlmKGRvY3VtZW50LmxpbmtzW2ldLmhyZWYuaW5kZXhPZigiaW5kZXguaHRtIikhPS0xKQotICAgICAgIHsKLSAgICAgICAgIG5ld19vcnlfZG9jX2xvYyA9IGRvY3VtZW50LmxpbmtzW2ldLmhyZWYuc3Vic3RyaW5nKDAsZG9jdW1lbnQubGlua3NbaV0uaHJlZi5sYXN0SW5kZXhPZigiLyIpKTsKLSAgICAgICAgIG5ld19vcnlfZG9jX2xvYyA9IG5ld19vcnlfZG9jX2xvYyArICIiICsgaW1hZ2U7Ci0gICAgICAgICByZXR1cm4gbmV3X29yeV9kb2NfbG9jOwotICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLS8vIC0tPgotPC9zY3JpcHQ+Ci08c2NyaXB0IGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij4KLS8vIDwhLS0KLU1TRlBob3ZlciA9Ci0oKChuYXZpZ2F0b3IuYXBwTmFtZSA9PSAiTmV0c2NhcGUiKSAmJgotICAocGFyc2VJbnQobmF2aWdhdG9yLmFwcFZlcnNpb24pID49IDMgKSkgfHwKLSAgKChuYXZpZ2F0b3IuYXBwTmFtZSA9PSAiTWljcm9zb2Z0IEludGVybmV0IEV4cGxvcmVyIikgJiYKLSAgKHBhcnNlSW50KG5hdmlnYXRvci5hcHBWZXJzaW9uKSA+PSA0ICkpKTsKLQotICBmdW5jdGlvbiBNU0ZQcHJlbG9hZChpbWcpCi0gIHsKLSAgICAgdmFyIGE9bmV3IEltYWdlKCk7Ci0gICAgIGEuc3JjPWltZzsKLSAgICAgcmV0dXJuIGE7Ci0gIH0KLS8vIC0tPgotPC9zY3JpcHQ+Ci08c2NyaXB0IGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij4KLS8vIDwhLS0KLSAgICBpZihNU0ZQaG92ZXIpCi0gICAgewotICAgICAgICBSdXBHcmF5PU1TRlBwcmVsb2FkKGdldEltYWdlVXJsKCcvaW1hZ2VzL2Rpc3BsYXlfdmlld3MuZ2lmJykpOwotICAgICAgICBSdXBCbHVlPU1TRlBwcmVsb2FkKGdldEltYWdlVXJsKCcvaW1hZ2VzL2Rpc3BsYXlfdmlld3NfYS5naWYnKSk7Ci0gICAgfQotLy8gLS0+Ci08L3NjcmlwdD4KLQotPHNjcmlwdCBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+Ci0gICB2YXIgZGlzcGxheUZyYW1lc01zZz0iRGlzcGxheSBFY2xpcHNlIFByb2Nlc3MgRnJhbWV3b3JrIHVzaW5nIGZyYW1lcyI7Ci0vLyA8IS0tCi0gICBmdW5jdGlvbiBtb3VzZU92ZXIoKQotICAgewotICAgCQlpZihNU0ZQaG92ZXIpIAotICAgCQkJZG9jdW1lbnRbJ0hvbWUnXS5zcmM9UnVwQmx1ZS5zcmM7IAotICAgCQlzZWxmLnN0YXR1cz1kaXNwbGF5RnJhbWVzTXNnOyAKLSAgIAkJcmV0dXJuIHRydWU7Ci0gICB9Ci0vLyAtLT4KLTwvc2NyaXB0PgotCi08c2NyaXB0IGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij4KLXZhciBjbGVhclN0YXR1c01zZz0iICI7Ci0vLyA8IS0tCi1mdW5jdGlvbiBtb3VzZU91dCgpCi17Ci1pZihNU0ZQaG92ZXIpIAotZG9jdW1lbnRbJ0hvbWUnXS5zcmM9UnVwR3JheS5zcmM7IAotc2VsZi5zdGF0dXM9Y2xlYXJTdGF0dXNNc2c7Ci1yZXR1cm4gdHJ1ZTsKLX0KLS8vIC0tPgotPC9zY3JpcHQ+Ci0KLTxhIGhyZWY9IkphdmFTY3JpcHQ6bG9hZFRvcCgpOyIgb25tb3VzZW92ZXI9IkphdmFTY3JpcHQ6bW91c2VPdmVyKCk7IiBvbm1vdXNlb3V0PSJKYXZhU2NyaXB0Om1vdXNlT3V0KCk7Ij4KLQotPHA+Ci08aW1nIHNyYz0iLi4vaW1hZ2VzL3J1cDEuZ2lmIiBib3JkZXI9IjAiIGFsdD0iRGlzcGxheSBFY2xpcHNlIFByb2Nlc3MgRnJhbWV3b3JrIHVzaW5nIGZyYW1lcyIgbmFtZT0iSG9tZSIgd2lkdGg9IjIwIiBoZWlnaHQ9IjExMCI+PC9wPjwvYT4KLTwvdGQ+PC90cj48L3RhYmxlPjx0YWJsZSBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgd2lkdGg9IjEwMCUiPjx0cj48dGQ+Ci08cCBhbGlnbj0icmlnaHQiPjxzbWFsbD48c21hbGw+RWNsaXBzZSBQcm9jZXNzIEZyYW1ld29yayZuYnNwOyZuYnNwOzwvc21hbGw+PC9zbWFsbD4KLTwvdGQ+PC90cj48L3RhYmxlPgotCi0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvbm9hcHBsZXQvYm9va21hcmt2aWV3cy5qcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvbm9hcHBsZXQvYm9va21hcmt2aWV3cy5qcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2Y0YmYxNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L25vYXBwbGV0L2Jvb2ttYXJrdmlld3MuanMKKysrIC9kZXYvbnVsbApAQCAtMSwxODMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLyAKLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS8vIGphdmFzY3JpcHQgZm9yIHRoZSBib29rbWFya3MgZnJhbWUgKCB0aGUgb3J5X3RvY19mcmFtZSBmcmFtZSkKLS8vIHRoaXMgZnJhbWUgY29udGFpbnMgYSBjaGlsZCBpZnJhbWUgKG9yeV90b2MpCi0KLS8vIG1lc3NhZ2VzIHRvIGJlIGV4dGVybml6ZWQKLS8vIGhlcmUgZGVmaW5lcyBhbGwgdGhlIEkxOE4gc3BlY2lmaWMgbWVzc2FnZXMgdXNlZCBpbiB0aGUgamF2YXNjcmlwdHMKLXZhciBib29rbWFya3ZpZXdzX2pzX01FU1NBR0UxID0gIlRoaXMgcGFnZSBjb3VsZCBub3QgYmUgZm91bmQgaW4gdGhlIG5hdmlnYXRpb24gdHJlZSB2aWV3LiI7Ci0KLWZ1bmN0aW9uIGRpc3BsYXlUcmVlKHRhYikKLXsKLQl1cmwgPSB0YWIuZ2V0QXR0cmlidXRlKCd1cmwnKTsKLQotCWlmICggc2VsZWN0ZWRUYWIgIT0gbnVsbCApCi0JewotCQlzZWxlY3RlZFRhYi5jbGFzc05hbWUgPSAidGFiIgotCX0KLQl0YWIuY2xhc3NOYW1lID0gInNlbGVjdGVkVGFiIgotCXNlbGVjdGVkVGFiID0gdGFiOwotCi0JbG9hZElmcmFtZSgib3J5X3RvYyIsIHVybCk7Ci19Ci0KLWZ1bmN0aW9uIGxvYWRJZnJhbWUoaWZyYW1lTmFtZSwgdXJsKQotewotCWlmICggd2luZG93LmZyYW1lc1tpZnJhbWVOYW1lXSApCi0JewotCQl3aW5kb3cuZnJhbWVzW2lmcmFtZU5hbWVdLnRvY19sb2FkZWQgPSBmYWxzZTsKLQkJd2luZG93LmZyYW1lc1tpZnJhbWVOYW1lXS5sb2NhdGlvbiA9IHVybDsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCWVsc2UgcmV0dXJuIGZhbHNlOwotfQotCi1mdW5jdGlvbiBzaG93UGFnZSgpCi17Ci0KLQlwYXJlbnQuZnJhbWVzWyJvcnlfZG9jIl0ubG9jYXRpb24uaHJlZiA9IGRlY29kZVVSSSh0b3BpY1RvRGlzcGxheSk7Ci19Ci0KLQotLyoqCi0gKiBmaW5kIGEgdG9waWMgaW4gdGhlIHRyZWU6IHRoZSB0b3BpYyBpcyBzZXQgaW4gdG9waWNUb0Rpc3BsYXkKLSAqIHJldHVybnMgdHJ1ZSBpZiBzdWNjZXNzCi0gKi8KLWZ1bmN0aW9uIGZpbmRUb2NUb3BpYygpCi17Ci0JdmFyIHRvY193aW5kb3cgPSB3aW5kb3cuZnJhbWVzWyJvcnlfdG9jIl07Ci0KLQkvLyBjaGVjayBmb3IgZmFsc2UgaXMgbm90IHNhZmUgc2luY2UgdGhlIHZhbHVlIG1pZ2h0IGJlIHVuZGVmaW5lZCBpZiB0aGUgZnJhbWUgaXMgbm90IGxvYWRlZCB5ZXQKLQkvL2lmICh0b2Nfd2luZG93LnRvY19sb2FkZWQgPT0gZmFsc2UgKQotCWlmICggdG9jX3dpbmRvdy50b2NfbG9hZGVkICE9IHRydWUgKQotCXsKLQkJLy9pZiAoIHRvY193aW5kb3cudG9jX2xvYWRlZCA9PSB1bmRlZmluZWQgKQotCQkvL3sKLQkJLy8JYWxlcnQoImdvdCBpdCEiKTsKLQkJLy99Ci0JCXdpbmRvdy5zZXRUaW1lb3V0KCJmaW5kVG9jVG9waWMoKSIsIDIwMCk7Ci0JfQotCWVsc2UKLQl7Ci0JCWlmICggdG9waWNUb0Rpc3BsYXkgPT0gbnVsbCApCi0JCXsKLQkJCXRvcGljVG9EaXNwbGF5ID0gdG9jX3dpbmRvdy5nZXRGaXJzdFRvcGljVXJsKCk7Ci0JCX0KLQkKLQkJdmFyIHRvcGljID0gdG9waWNUb0Rpc3BsYXk7Ci0JCXZhciBmb3VuZCA9IHRvY193aW5kb3cuc2VsZWN0VG9waWModG9waWMpOwotCQlpZiAoIGZvdW5kID09IGZhbHNlICkKLQkJewotCQkJdmFyIGFuY2hvckluZGV4ID0gdG9waWMubGFzdEluZGV4T2YoIiMiKTsKLQkJCWlmIChhbmNob3JJbmRleCA+IDApCi0JCQl7Ci0JCQkJdG9waWMgPSB0b3BpYy5zdWJzdHJpbmcoMCwgYW5jaG9ySW5kZXgpOwotCQkJfQotCQkJZm91bmQgPSB0b2Nfd2luZG93LnNlbGVjdFRvcGljKHRvcGljKTsKLQkJfQkJCQkJCQotCi0JCS8vIGZpbmQgdGhlIHRvcGljIGluIHRoZSBjdXJyZW50IHZpZXcsIGlmIG5vdCwgbG9vayBmb3IgdGhlIG5leHQgdmlldwotCQlpZiAoIGZvdW5kID09IGZhbHNlICkKLQkJewotCQkJaWYgKCBsb2FkaW5nVGFiSW5kZXggPCB2aWV3VGFicy5sZW5ndGggKQotCQkJewotCQkJCWRpc3BsYXlUcmVlKHZpZXdUYWJzW2xvYWRpbmdUYWJJbmRleCsrXSk7Ci0JCQkJZmluZFRvY1RvcGljKCk7Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJLy8gZW5kIGZpbmRpbmcgYW5kIGdvdCBub3RoaW5nCi0JCQkJLy8gZGlzcGxheSB0aGUgZGVmYXVsdAotCQkJCWFsZXJ0KGJvb2ttYXJrdmlld3NfanNfTUVTU0FHRTEpOwotCQkJCWxvYWRpbmdUYWJJbmRleCA9IDA7Ci0JCQkJc2hvd1BhZ2UoKTsKLQkJCX0KLQkJfQotCQllbHNlCi0JCXsKLQkJCWxvYWRpbmdUYWJJbmRleCA9IDA7Ci0JCQkvLyBmaW5kIHN1Y2Nlc3NmdWwsIGRpc3BsYXkgdGhlIHRvcGljIHBhZ2UKLQkJCXNob3dQYWdlKCk7Ci0JCX0KLQl9Ci19Ci0KLS8vIGZpbmQgdGhlIHRvcGljIGluIHRoZSBjdXJyZW50IHRhYgotZnVuY3Rpb24gd2hlcmVBbUkoKQotewotCXZhciB1cmwgPSBwYXJlbnQuZnJhbWVzWyJvcnlfZG9jIl0uZG9jdW1lbnQuVVJMOwotCQotCWlmICggdXJsICE9IG51bGwgKQotCXsKLQkJdG9waWNUb0Rpc3BsYXkgPSB1cmw7Ci0JCWZpbmRUb2NUb3BpYygpOwotCX0KLX0KLQotCi1mdW5jdGlvbiB0b2dWaWV3cygpCi17Ci0JLy8gaWYgY3VycmVudGx5IHZpc2libGUsIGhpZGUgYWxsIGV4Y2VwdCB0aGUgY3VycmVudGx5IHNlbGVjdGVkCi0JaXNWaWV3c1Zpc2libGUgPSAoIWlzVmlld3NWaXNpYmxlKTsKLQkKLQlmb3IgKCB2YXIgaSA9IDA7ICBpIDwgdmlld1RhYnMubGVuZ3RoOyBpKyspCi0JewotCQl2YXIgc2hvdyA9IGlzVmlld3NWaXNpYmxlIHx8ICh2aWV3VGFic1tpXSA9PSBzZWxlY3RlZFRhYik7Ci0JCWlmICggc2hvdyApCi0JCXsJCQotCQkJLy92aWV3VGFic1tpXS5zdHlsZS52aXNpYmlsaXR5ID0gInZpc2libGUiOwotCQkJdmlld1RhYnNbaV0uc3R5bGUuZGlzcGxheSA9ICcnOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJLy92aWV3VGFic1tpXS5zdHlsZS52aXNpYmlsaXR5ID0gImhpZGRlbiI7Ci0JCQl2aWV3VGFic1tpXS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOwotCQl9Ci0JfQotCQkKLQkJCi0KLX0KLQotCi0vLyBkaXNwbGF5IHRoZSBkZWZhdWx0IHBhZ2UgYW5kIG5hdmlnYXRlIHRvIHRoZSBub2RlCi0vLyBpZiBubyBkZWZhdWx0IHBhZ2UgaXMgc2V0LCBkaXNwbGF5IHRoZSBmaXJzdCBub2RlIG9mIHRoZSBmaXJzdCB2aWV3Ci1mdW5jdGlvbiBpbml0KCkKLXsKLQlsb2FkaW5nVGFiSW5kZXggPSAwOwotCXZhciB0YWJzID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNwYW4iKTsKLQl2YXIgdGFiY291bnQgPSAwOwotCWZvciAodmFyIGk9MDsgaTx0YWJzLmxlbmd0aDsgaSsrKQotCXsKLQkJaWYgKCB0YWJzW2ldLmdldEF0dHJpYnV0ZSgndXJsJykgIT0gbnVsbCApCi0JCXsJCQkKLQkJCXZhciBpc0RlZmF1bHRWaWV3ID0gdGFic1tpXS5nZXRBdHRyaWJ1dGUoJ2lzRGVmYXVsdFZpZXcnKTsKLQkJCWlmICggaXNEZWZhdWx0VmlldyA9PSAidHJ1ZSIgKQotCQkJewotCQkJCWxvYWRpbmdUYWJJbmRleCA9IHRhYmNvdW50OwotCQkJfQotCQkJCi0JCQl2aWV3VGFic1t0YWJjb3VudCsrXSA9IHRhYnNbaV07Ci0JCX0KLQl9Ci0KLQl0b3BpY1RvRGlzcGxheSA9IHBhcmVudC5nZXRDb29raWUoInJ1cF9vcnlfZG9jIik7Ci0JZGlzcGxheVRyZWUodmlld1RhYnNbbG9hZGluZ1RhYkluZGV4XSk7Ci0JZmluZFRvY1RvcGljKCk7Ci19Ci0KLQotdmFyIHNlbGVjdGVkVGFiID0gbnVsbDsKLXZhciB2aWV3VGFicyA9IG5ldyBBcnJheSgpOzsKLXZhciBsb2FkaW5nVGFiSW5kZXggPSAwOwotdmFyIHRvcGljVG9EaXNwbGF5ID0gbnVsbDsKLXZhciBpc1ZpZXdzVmlzaWJsZSA9IHRydWU7CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L25vYXBwbGV0L2ltYWdlcy9hY3Rpb25faGlkZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L25vYXBwbGV0L2ltYWdlcy9hY3Rpb25faGlkZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1ZmNkZTIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9ub2FwcGxldC9pbWFnZXMvYWN0aW9uX2hpZGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9ub2FwcGxldC9pbWFnZXMvYWN0aW9uX3VuaGlkZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L25vYXBwbGV0L2ltYWdlcy9hY3Rpb25fdW5oaWRlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODRhNGNmZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L25vYXBwbGV0L2ltYWdlcy9hY3Rpb25fdW5oaWRlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvbm9hcHBsZXQvaW1hZ2VzL2ZpbGUuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9ub2FwcGxldC9pbWFnZXMvZmlsZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlYTllNzMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9ub2FwcGxldC9pbWFnZXMvZmlsZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L25vYXBwbGV0L2ltYWdlcy9mb2xkZXIuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9ub2FwcGxldC9pbWFnZXMvZm9sZGVyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDY0MTlkOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L25vYXBwbGV0L2ltYWdlcy9mb2xkZXIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9ub2FwcGxldC9pbWFnZXMvbWludXMuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9ub2FwcGxldC9pbWFnZXMvbWludXMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MGQxZDM0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvbm9hcHBsZXQvaW1hZ2VzL21pbnVzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvbm9hcHBsZXQvaW1hZ2VzL25pX3doZXJlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvbm9hcHBsZXQvaW1hZ2VzL25pX3doZXJlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDFhNGZkNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L25vYXBwbGV0L2ltYWdlcy9uaV93aGVyZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L25vYXBwbGV0L2ltYWdlcy9ub3BsdXMuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9ub2FwcGxldC9pbWFnZXMvbm9wbHVzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGQ5ZTExNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L25vYXBwbGV0L2ltYWdlcy9ub3BsdXMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9ub2FwcGxldC9pbWFnZXMvcGx1cy5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L25vYXBwbGV0L2ltYWdlcy9wbHVzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDE0NjcxZi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L25vYXBwbGV0L2ltYWdlcy9wbHVzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvbm9hcHBsZXQvdG9jLmpzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9ub2FwcGxldC90b2MuanMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhOWNhMjIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9ub2FwcGxldC90b2MuanMKKysrIC9kZXYvbnVsbApAQCAtMSw5NzAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLyAKLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gCi0vLyBDb21tb24gc2NyaXB0cyBmb3IgSUUgYW5kIE1vemlsbGEuCi0KLXZhciBpc01vemlsbGEgPSBuYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoJ01vemlsbGEnKSAhPSAtMSAmJiBwYXJzZUludChuYXZpZ2F0b3IuYXBwVmVyc2lvbi5zdWJzdHJpbmcoMCwxKSkgPj0gNTsKLXZhciBpc0lFID0gbmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCdNU0lFJykgIT0gLTE7Ci0KLS8vIHRoaXMgaXMgdGhlIHNlbGVjdGVkIG5vZGUKLXZhciBvbGRBY3RpdmU7Ci12YXIgb2xkQWN0aXZlQ2xhc3MgPSAiIjsKLXZhciB0b2NfbG9hZGVkID0gZmFsc2U7Ci0KLWZ1bmN0aW9uIHNldExvYWRlZCgpCi17Ci0JdG9jX2xvYWRlZCA9IHRydWU7Ci0Jc2VsZWN0Rmlyc3RUb3BpYygpOwotfQotCi0vLyBQcmVsb2FkIGltYWdlcwotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gTm90ZTogY29kZSBtb3ZlZCBpbnRvIHRoZSBqc3AsIGZvciBkeW5hbWljIGltYWdlIHByZWZlcmVuY2VzCi0KLS8qKgotICogUmV0dXJucyB0aGUgdGFyZ2V0IG5vZGUgb2YgYW4gZXZlbnQKLSAqLwotZnVuY3Rpb24gZ2V0VGFyZ2V0KGUpIHsKLQl2YXIgdGFyZ2V0OwotICAJaWYgKGlzTW96aWxsYSkKLSAgCQl0YXJnZXQgPSBlLnRhcmdldDsKLSAgCWVsc2UgaWYgKGlzSUUpCi0gICAJCXRhcmdldCA9IHdpbmRvdy5ldmVudC5zcmNFbGVtZW50OwotCi0JcmV0dXJuIHRhcmdldDsKLX0KLQotLyoqCi0gKiBSZXR1cm5zIHRoZSBuZXh0IHRyZWUgbm9kZSAiZG93biIgZnJvbSBjdXJyZW50IG9uZQotICovCi1mdW5jdGlvbiBnZXROZXh0RG93bihub2RlKQotewotCXZhciBhID0gZ2V0QW5jaG9yTm9kZShub2RlKTsKLQlpZiAoIWEpIHJldHVybiBudWxsOwotCQkKLQkvLyBUcnkgdmlzaWJsZSBjaGlsZCBmaXJzdAotCXZhciBsaSA9IGEucGFyZW50Tm9kZTsKLQl2YXIgdWwgPSBnZXRDaGlsZE5vZGUobGksICJVTCIpOwotCWlmICh1bCAmJiB1bC5jbGFzc05hbWUgPT0gImV4cGFuZGVkIikKLQkJcmV0dXJuIGdldERlc2NlbmRhbnROb2RlKHVsLCAiQSIpOwotCQotCS8vIFRyeSBuZXh0IHNpYmxpbmcKLQl2YXIgbGlfc2liID0gZ2V0TmV4dFNpYmxpbmcobGkpOwotCWlmIChsaV9zaWIgIT0gbnVsbCkKLQkJcmV0dXJuIGdldERlc2NlbmRhbnROb2RlKGxpX3NpYiwgIkEiKTsKLQkJCi0JLy8gVHJ5IGxvb2tpbmcgdG8gcGFyZW50J3Mgc2libGluZwotCXdoaWxlKGxpX3NpYiA9PSBudWxsKSB7Ci0JCXZhciB1bCA9IGxpLnBhcmVudE5vZGU7Ci0JCWxpID0gdWwucGFyZW50Tm9kZTsKLQkJaWYgKGxpLnRhZ05hbWUgIT0gIkxJIikgLy8gcmVhY2hlZCB0aGUgdG9wLCBub3RoaW5nIGVsc2UgdG8gZG8KLQkJCXJldHVybiBudWxsOwotCQkJCi0JCWxpX3NpYiA9IGdldE5leHRTaWJsaW5nKGxpKTsJCQotCX0KLQkJCi0JLy8gZm91bmQgdGhlIG5leHQgZG93biBzaWJsaW5nCi0JcmV0dXJuIGdldERlc2NlbmRhbnROb2RlKGxpX3NpYiwgIkEiKTsJCQotfQotCi0vKioKLSAqIFJldHVybnMgdGhlIG5leHQgdHJlZSBub2RlICJkb3duIiBmcm9tIGN1cnJlbnQgb25lCi0gKi8KLWZ1bmN0aW9uIGdldE5leHRVcChub2RlKQotewotCXZhciBhID0gZ2V0QW5jaG9yTm9kZShub2RlKTsKLQlpZiAoIWEpIHJldHVybiBudWxsOwotCQkKLQkvLyBHZXQgcHJldmlvdXMgc2libGluZyBmaXJzdAotCXZhciBsaSA9IGEucGFyZW50Tm9kZTsKLQl2YXIgbGlfc2liID0gZ2V0UHJldlNpYmxpbmcobGkpOwotCWlmIChsaV9zaWIgIT0gbnVsbCkgewotCQkvLyB0cnkgdG8gZ2V0IHRoZSBkZWVwZXN0IG5vZGUgdGhhdCBwcmVjZWVkcyB0aGlzIGN1cnJlbnQgbm9kZQotCQl2YXIgY2FuZGlkYXRlID0gZ2V0RGVzY2VuZGFudE5vZGUobGlfc2liLCAiQSIpOwotCQl2YXIgbmV4dERvd24gPSBnZXROZXh0RG93bihjYW5kaWRhdGUpOwotCQl3aGlsZShuZXh0RG93biAhPSBudWxsICYmIG5leHREb3duICE9IG5vZGUpewotCQkJY2FuZGlkYXRlID0gbmV4dERvd247Ci0JCQluZXh0RG93biA9IGdldE5leHREb3duKG5leHREb3duKTsKLQkJfQotCQlyZXR1cm4gZ2V0RGVzY2VuZGFudE5vZGUoY2FuZGlkYXRlLCAiQSIpOwk7Ci0JfSBlbHNlIHsKLQkJLy8gZ2V0IHRoZSBwYXJlbnQKLQkJdmFyIGxpID0gbGkucGFyZW50Tm9kZS5wYXJlbnROb2RlOwotCQlpZiAobGkgJiYgbGkudGFnTmFtZSA9PSAiTEkiKQotCQkJcmV0dXJuIGdldERlc2NlbmRhbnROb2RlKGxpLCAiQSIpOwotCQllbHNlCi0JCQlyZXR1cm4gbnVsbDsKLQl9Ci19Ci0KLS8qKgotICogUmV0dXJucyB0aGUgbmV4dCBzaWJsaW5nIGVsZW1lbnQKLSAqLwotZnVuY3Rpb24gZ2V0TmV4dFNpYmxpbmcobm9kZSkgCi17Ci0JdmFyIHNpYiA9IG5vZGUubmV4dFNpYmxpbmc7Ci0Jd2hpbGUgKHNpYiAmJiAoc2liLm5vZGVUeXBlID09IDMgfHwgc2liLnRhZ05hbWU9PSJTQ1JJUFQiKSkgLy8gdGV4dCBvciBzY3JpcHQgbm9kZQotCQlzaWIgPSBzaWIubmV4dFNpYmxpbmc7Ci0JcmV0dXJuIHNpYjsKLX0KLQotLyoqCi0gKiBSZXR1cm5zIHRoZSBuZXh0IHNpYmxpbmcgZWxlbWVudAotICovCi1mdW5jdGlvbiBnZXRQcmV2U2libGluZyhub2RlKSAKLXsKLQl2YXIgc2liID0gbm9kZS5wcmV2aW91c1NpYmxpbmc7Ci0Jd2hpbGUgKHNpYiAmJiAoc2liLm5vZGVUeXBlID09IDMgfHwgc2liLnRhZ05hbWU9PSJTQ1JJUFQiKSkgLy8gdGV4dCBvciBzY3JpcHQgbm9kZQotCQlzaWIgPSBzaWIucHJldmlvdXNTaWJsaW5nOwotCXJldHVybiBzaWI7Ci19Ci0KLQotLyoqCi0gKiBSZXR1cm5zIHRoZSBjaGlsZCBub2RlIHdpdGggc3BlY2lmaWVkIHRhZwotICovCi1mdW5jdGlvbiBnZXRDaGlsZE5vZGUocGFyZW50LCBjaGlsZFRhZykKLXsKLQl2YXIgbGlzdCA9IHBhcmVudC5jaGlsZE5vZGVzOwotCWlmIChsaXN0ID09IG51bGwpIHJldHVybiBudWxsOwotCWZvciAodmFyIGk9MDsgaTxsaXN0Lmxlbmd0aDsgaSsrKQotCQlpZiAobGlzdC5pdGVtKGkpLnRhZ05hbWUgPT0gY2hpbGRUYWcpCi0JCQlyZXR1cm4gbGlzdC5pdGVtKGkpOwotCXJldHVybiBudWxsOwotfQotCi0vKioKLSAqIFJldHVybnMgdGhlIGRlc2NlbmRhdCBub2RlIHdpdGggc3BlY2lmaWVkIHRhZyAoZGVwdGgtZmlyc3Qgc2VhcmNoZXMpCi0gKi8KLWZ1bmN0aW9uIGdldERlc2NlbmRhbnROb2RlKHBhcmVudCwgY2hpbGRUYWcpCi17CQotCWlmIChwYXJlbnQgPT0gbnVsbCkgcmV0dXJuIG51bGw7Ci0JCi0JaWYgKHBhcmVudC50YWdOYW1lID09IGNoaWxkVGFnKQotCQlyZXR1cm4gcGFyZW50OwotCQkKLQl2YXIgbGlzdCA9IHBhcmVudC5jaGlsZE5vZGVzOwotCWlmIChsaXN0ID09IG51bGwpIHJldHVybiBudWxsOwotCWZvciAodmFyIGk9MDsgaTxsaXN0Lmxlbmd0aDsgaSsrKSB7Ci0JCXZhciBjaGlsZCA9IGxpc3QuaXRlbShpKTsKLQkJaWYoY2hpbGQudGFnTmFtZSA9PSBjaGlsZFRhZykKLQkJCXJldHVybiBjaGlsZDsKLQkJCi0JCWNoaWxkID0gZ2V0RGVzY2VuZGFudE5vZGUoY2hpbGQsIGNoaWxkVGFnKTsKLQkJaWYgKGNoaWxkICE9IG51bGwpCi0JCQlyZXR1cm4gY2hpbGQ7Ci0JfQotCXJldHVybiBudWxsOwotfQotCi0KLS8qKgotICogUmV0dXJucyB0aGUgYW5jaG9yIG9mIHRoaXMgY2xpY2sKLSAqIE5PVEU6IE1PWklMTEEgQlVHIFdJVEggQTpmb2N1cyBhbmQgQTphY3RpdmUgc3R5bGVzCi0gKi8KLWZ1bmN0aW9uIGdldEFuY2hvck5vZGUobm9kZSkgewotICBpZiAobm9kZSA9PSBudWxsKSByZXR1cm4gbnVsbDsKLSAgIAotICBpZiAobm9kZS5ub2RlVHlwZSA9PSAzKSAgLy8iTm9kZS5URVhUX05PREUiKSAKLQlyZXR1cm4gbm9kZS5wYXJlbnROb2RlOwotICBlbHNlIGlmIChub2RlLnRhZ05hbWUgPT0gIkEiKSAKLSAgICByZXR1cm4gbm9kZTsKLSAgZWxzZSBpZiAobm9kZS50YWdOYW1lID09ICJJTUciKQotICAJcmV0dXJuIGdldENoaWxkTm9kZShub2RlLnBhcmVudE5vZGUsICJBIik7Ci0gIHJldHVybiBudWxsOwotfQotCi0vKioKLSAqIFJldHVybnMgdGhlIHBsdXMvbWludXMgaWNvbiBmb3IgdGhpcyB0cmVlIG5vZGUKLSAqLwotZnVuY3Rpb24gZ2V0UGx1c01pbnVzKG5vZGUpCi17Ci0JaWYgKGlzUGx1c01pbnVzKG5vZGUpKQotCQlyZXR1cm4gbm9kZTsKLSAgCWVsc2UgaWYgKG5vZGUubm9kZVR5cGUgPT0gMykgIC8vIk5vZGUuVEVYVF9OT0RFIikgCi0JCXJldHVybiBnZXRDaGlsZE5vZGUobm9kZS5wYXJlbnROb2RlLnBhcmVudE5vZGUsICJJTUciKTsKLQllbHNlIGlmIChub2RlLnRhZ05hbWUgPT0gIklNRyIpCi0gICAgCXJldHVybiBnZXRDaGlsZE5vZGUobm9kZS5wYXJlbnROb2RlLnBhcmVudE5vZGUsICJJTUciKTsKLSAgCWVsc2UgaWYgKG5vZGUudGFnTmFtZSA9PSAiQSIpIAotICAgIAlyZXR1cm4gZ2V0Q2hpbGROb2RlKG5vZGUucGFyZW50Tm9kZSwgIklNRyIpOwotCi0gCXJldHVybiBudWxsOwotfQotCi0KLS8qKgotICogUmV0dXJucyB0cnVlIHdoZW4gdGhlIG5vZGUgaXMgdGhlIHBsdXMgb3IgbWludXMgaWNvbgotICovCi1mdW5jdGlvbiBpc1BsdXNNaW51cyhub2RlKQotewotCXJldHVybiAobm9kZS5ub2RlVHlwZSAhPSAzICYmIG5vZGUudGFnTmFtZSA9PSAiSU1HIiAmJiAobm9kZS5jbGFzc05hbWUgPT0gImV4cGFuZGVkIiB8fCBub2RlLmNsYXNzTmFtZSA9PSAiY29sbGFwc2VkIikpOwotfQotCi0vKioKLSAqIENvbGxhcHNlcyBhIHRyZWUgcm9vdGVkIGF0IHRoZSBzcGVjaWZpZWQgZWxlbWVudAotICovCi1mdW5jdGlvbiBjb2xsYXBzZShub2RlKSB7Ci0gIG5vZGUuY2xhc3NOYW1lID0gImNvbGxhcHNlZCI7Ci0gIG5vZGUuc3JjID0gcGx1cy5zcmM7Ci0gIG5vZGUuYWx0ID0gYWx0VG9waWNDbG9zZWQ7Ci0gIC8vIHNldCB0aGUgVUwgYXMgd2VsbAotICB2YXIgdWwgPSBnZXRDaGlsZE5vZGUobm9kZS5wYXJlbnROb2RlLCAiVUwiKTsKLSAgaWYgKHVsICE9IG51bGwpIHVsLmNsYXNzTmFtZSA9ICJjb2xsYXBzZWQiOwotfQotCi0vKioKLSAqIEV4cGFuZHMgYSB0cmVlIHJvb3RlZCBhdCB0aGUgc3BlY2lmaWVkIGVsZW1lbnQKLSAqLwotZnVuY3Rpb24gZXhwYW5kKG5vZGUpIHsKLSAgCW5vZGUuY2xhc3NOYW1lID0gImV4cGFuZGVkIjsKLSAgCW5vZGUuc3JjID0gbWludXMuc3JjOwotICAgIG5vZGUuYWx0ID0gYWx0VG9waWNPcGVuOwotICAJLy8gc2V0IHRoZSBVTCBhcyB3ZWxsCi0gIAl2YXIgdWwgPSBnZXRDaGlsZE5vZGUobm9kZS5wYXJlbnROb2RlLCAiVUwiKTsKLSAgCWlmICh1bCAhPSBudWxsKXsKLSAgCQl1bC5jbGFzc05hbWUgPSAiZXhwYW5kZWQiOwotICAJCWlmICh1bC5pZC5sZW5ndGggPiAwKXsKLSAgCQkJaWYgKCFmcmFtZXMuZHluTG9hZEZyYW1lKSB7Ci0gIAkJCQlyZXR1cm47Ci0gIAkJCX0KLSAgCQkJdmFyIGl4ID0gd2luZG93LmxvY2F0aW9uLmhyZWYuaW5kZXhPZignPycpOwotICAJCQlpZiAoaXggPCAwKSB7Ci0gIAkJCQlyZXR1cm47Ci0gIAkJCX0KLSAgCQkJdmFyIHF1ZXJ5ID0gd2luZG93LmxvY2F0aW9uLmhyZWYuc3Vic3RyKGl4KTsKLSAgCQkJZnJhbWVzLmR5bkxvYWRGcmFtZS5sb2NhdGlvbiA9ICJ0b2NGcmFnbWVudC5qc3AiICsgcXVlcnkgKyAiJnBhdGg9IiArIHVsLmlkOwotICAJCX0KLSAgCX0KLX0KLQotLyoqCi0gKiBFeHBhbmRzIHRoZSBub2RlcyBmcm9tIHJvb3QgdG8gdGhlIHNwZWNpZmllZCBub2RlCi0gKi8KLWZ1bmN0aW9uIGV4cGFuZFBhdGhUbyhub2RlLCBpbmNsdXNpdmUpCi17Ci0KLQkvLyB3aGVuIHRoZSBub2RlIGlzIGEgbGluaywgZ2V0IHRoZSBwbHVzL21pbnVzIGltYWdlCi0JaWYgKG5vZGUudGFnTmFtZSA9PSAiQSIpIAotCXsKLQkJdmFyIGltZyA9IGdldENoaWxkTm9kZShub2RlLnBhcmVudE5vZGUsICJJTUciKQotCQlpZiAoaW1nICE9IG51bGwpCi0JCXsJCQkKLQkJCWV4cGFuZFBhdGhUbyhpbWcsIGluY2x1c2l2ZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQl9Ci0JCi0JaWYgKGluY2x1c2l2ZSAmJiBpc0NvbGxhcHNlZChub2RlKSkKLQkJZXhwYW5kKG5vZGUpOwotCQkKLQl2YXIgbGkgPSBub2RlLnBhcmVudE5vZGU7Ci0JaWYgKGxpID09IG51bGwpIHJldHVybjsKLQl2YXIgdWwgPSBsaS5wYXJlbnROb2RlOwotCWlmICh1bCA9PSBudWxsKSByZXR1cm47Ci0JbGkgPSB1bC5wYXJlbnROb2RlOwotCWlmIChsaSA9PSBudWxsKSByZXR1cm47Ci0JdmFyIGltZyA9IGdldENoaWxkTm9kZShsaSwgIklNRyIpOwotCWlmIChpbWcgPT0gbnVsbCkgcmV0dXJuOwotCQkKLQlleHBhbmRQYXRoVG8oaW1nLCB0cnVlKTsKLX0KLQotLyoqCi0gKiBSZXR1cm5zIHRydWUgd2hlbiB0aGlzIGlzIGFuIGV4cGFuZGVkIHRyZWUgbm9kZQotICovCi1mdW5jdGlvbiBpc0V4cGFuZGVkKG5vZGUpIHsKLSAgcmV0dXJuIG5vZGUuY2xhc3NOYW1lID09ICJleHBhbmRlZCI7Ci19Ci0KLS8qKgotICogUmV0dXJucyB0cnVlIHdoZW4gdGhpcyBpcyBhIGNvbGxhcHNlZCB0cmVlIG5vZGUKLSAqLwotZnVuY3Rpb24gaXNDb2xsYXBzZWQobm9kZSkgewotICByZXR1cm4gIG5vZGUuY2xhc3NOYW1lID09ICJjb2xsYXBzZWQiOwotfQotCi0vKioKLSAqIEhpZ2hsaWdodHMgbGluawotICovCi1mdW5jdGlvbiBoaWdobGlnaHRUb3BpYyh0b3BpYykKLXsKLQlpZiAoaXNNb3ppbGxhKQotCQl3aW5kb3cuZ2V0U2VsZWN0aW9uKCkucmVtb3ZlQWxsUmFuZ2VzKCk7Ci0KLSAgCXZhciBhID0gZ2V0QW5jaG9yTm9kZSh0b3BpYyk7IAotICAJaWYgKGEgIT0gbnVsbCkKLSAgCXsKLSAgCSAvLyAJcGFyZW50LnBhcmVudC5wYXJlbnQuc2V0Q29udGVudFRvb2xiYXJUaXRsZSh0b2NUaXRsZSk7Ci0gIAkgIAlpZiAob2xkQWN0aXZlKSAKLSAgCSAgCQlvbGRBY3RpdmUuY2xhc3NOYW1lID0gb2xkQWN0aXZlQ2xhc3M7Ci0KLSAgCQlvbGRBY3RpdmUgPSBhOwotICAJCW9sZEFjdGl2ZUNsYXNzID0gYS5jbGFzc05hbWU7Ci0gIAkJYS5jbGFzc05hbWUgPSAiYWN0aXZlIjsKLSAgCQkvLyBpdCBsb29rcyBsaWtlIHRoZSBvbmNsaWNrIGV2ZW50IGlzIG5vdCBoYW5kbGVkIGluIG1vemlsbGEKLSAgCQkvLyAqKiogVE8gRE86IGhhbmRsZSBmYWlsZWQgc3luY2hyb25pemF0aW9uLCBkbyBub3Qgc2VsZWN0IGluIHRoYXQgY2FzZQotICAJCWlmIChpc01vemlsbGEgJiYgYS5vbmNsaWNrKSAKLSAgCQkJYS5vbmNsaWNrKCkKLSAgCQkvL2lmIChpc0lFKQotICAJCS8vCWEuaGlkZUZvY3VzID0gInRydWUiOwotICAJCQotICAJfQotfQotCi0KLWZ1bmN0aW9uIGdldEZpcnN0VG9waWNVcmwoKQotewotCXZhciBsaW5rcyA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJhIik7Ci0JaWYgKCBsaW5rcy5sZW5ndGggPiAwICkKLQl7Ci0JCXJldHVybiBsaW5rc1swXS5ocmVmOwotCX0KLQkKLQlyZXR1cm4gbnVsbDsKLX0KLQotZnVuY3Rpb24gc2VsZWN0Rmlyc3RUb3BpYygpIHsKLQkvL3ZhciB1cmwgPSBnZXRGaXJzdFRvcGljVXJsKCk7Ci0JLy9zZWxlY3RUb3BpYyh1cmwpOwotCi0JdmFyIGxpbmtzID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImEiKTsKLQlpZiAoIGxpbmtzLmxlbmd0aCA+IDAgKQotCXsKLQkJaGlnaGxpZ2h0VG9waWMobGlua3NbMF0pOwotCQlwYXJlbnQucGFyZW50LmZyYW1lc1sib3J5X2RvYyJdLmxvY2F0aW9uLmhyZWYgPSBsaW5rc1swXS5ocmVmOwotCX0KLQotCi19Ci0KLQotLyoqCi0gKiBTZWxlY3RzIGEgdG9waWMgaW4gdGhlIHRyZWU6IGV4cGFuZCB0cmVlIGFuZCBoaWdobGlnaHQgaXQKLSAqIHJldHVybnMgdHJ1ZSBpZiBzdWNjZXNzCi0gKi8KLWZ1bmN0aW9uIHNlbGVjdFRvcGljKHRvcGljKQotewotCWlmICghdG9waWMpCi0JCXJldHVybiBmYWxzZTsKLQkJCi0JdG9waWMgPSBwYXJlbnQucGFyZW50LmZpeFVybCh0b3BpYyk7Ci0JCi0JLy8gcmVtb3ZlIHRoZSBxdWVyeSwgaWYgYW55Ci0JdmFyIGkgPSB0b3BpYy5pbmRleE9mKCc/Jyk7Ci0JaWYgKGkgIT0gLTEpCi0JCXRvcGljID0gdG9waWMuc3Vic3RyaW5nKDAsIGkpOwotCi0KLQl2YXIgbGlua3MgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYSIpOwotCi0JZm9yICh2YXIgaT0wOyBpPGxpbmtzLmxlbmd0aDsgaSsrKQotCXsJCQkKLQkJdmFyIGZpeGVkX2hyZWYgPSBwYXJlbnQucGFyZW50LmZpeFVybChsaW5rc1tpXS5ocmVmKTsKLQkJCi0JCS8vIHJlbW92ZSB0aGUgcXVlcnksIGlmIGFueQotCQl2YXIgaW5keCA9IGZpeGVkX2hyZWYuaW5kZXhPZignPycpOwotCQlpZiAoaW5keCAhPSAtMSkgewotCQkJZml4ZWRfaHJlZiA9IGZpeGVkX2hyZWYuc3Vic3RyaW5nKDAsIGluZHgpOwotCQl9Ci0KLQkJLy9hbGVydCgiZml4ZWQgaHJlZj0iICsgZml4ZWRfaHJlZik7Ci0JCWlmICh0b3BpYyA9PSBmaXhlZF9ocmVmKQotCQl7Ci0JCQlleHBhbmRQYXRoVG8obGlua3NbaV0sIGZhbHNlKTsKLQkJCWhpZ2hsaWdodFRvcGljKGxpbmtzW2ldKTsKLQkJCXNjcm9sbEludG9WaWV3KGxpbmtzW2ldKTsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JfQotCXJldHVybiBmYWxzZTsKLX0KLQotLyoqCi0gKiBTZWxlY3RzIGEgdG9waWMgaW4gdGhlIHRyZWU6IGV4cGFuZCB0cmVlIGFuZCBoaWdobGlnaHQgaXQKLSAqIHJldHVybnMgdHJ1ZSBpZiBzdWNjZXNzCi0gKi8KLWZ1bmN0aW9uIHNlbGVjdFRvcGljQnlJZChpZCkKLXsKLQl2YXIgdG9waWMgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCk7Ci0JaWYgKHRvcGljKQotCXsKLQkJZXhwYW5kUGF0aFRvKHRvcGljLCBmYWxzZSk7Ci0JCWhpZ2hsaWdodFRvcGljKHRvcGljKTsKLQkJc2Nyb2xsSW50b1ZpZXcodG9waWMpOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JcmV0dXJuIGZhbHNlOwotfQotCi0vKioKLSAqIFNjcm9sbHMgdGhlIHBhZ2UgdG8gc2hvdyB0aGUgc3BlY2lmaWVkIGVsZW1lbnQKLSAqLwotZnVuY3Rpb24gc2Nyb2xsSW50b1ZpZXcobm9kZSkKLXsKLQl2YXIgc2Nyb2xsID0gZ2V0VmVydGljYWxTY3JvbGwobm9kZSk7Ci0JaWYgKHNjcm9sbCAhPSAwKQotCQl3aW5kb3cuc2Nyb2xsQnkoMCwgc2Nyb2xsKTsKLX0KLQotLyoqCi0gKiBTY3JvbGxzIHRoZSBwYWdlIHRvIHNob3cgdGhlIHNwZWNpZmllZCBlbGVtZW50Ci0gKi8KLWZ1bmN0aW9uIGdldFZlcnRpY2FsU2Nyb2xsKG5vZGUpCi17Ci0JdmFyIG5vZGVUb3AgPSBub2RlLm9mZnNldFRvcDsKLQl2YXIgbm9kZUJvdHRvbSA9IG5vZGVUb3AgKyBub2RlLm9mZnNldEhlaWdodDsKLQl2YXIgcGFnZVRvcCA9IDA7Ci0JdmFyIHBhZ2VCb3R0b20gPSAwOwotCQotCWlmIChpc0lFKQotCXsKLQkJcGFnZVRvcCA9IGRvY3VtZW50LmJvZHkuc2Nyb2xsVG9wOyAKLQkJcGFnZUJvdHRvbSA9IHBhZ2VUb3AgKyBkb2N1bWVudC5ib2R5LmNsaWVudEhlaWdodDsKLQkKLQl9IAotCWVsc2UgaWYgKGlzTW96aWxsYSkKLQl7Ci0JCXBhZ2VUb3AgPSB3aW5kb3cucGFnZVlPZmZzZXQ7Ci0JCXBhZ2VCb3R0b20gPSBwYWdlVG9wICsgd2luZG93LmlubmVySGVpZ2h0IC0gbm9kZS5vZmZzZXRIZWlnaHQ7Ci0JfQotCQotCXZhciBzY3JvbGwgPSAwOwotCWlmIChub2RlVG9wID49IHBhZ2VUb3AgKQotCXsKLQkJaWYgKG5vZGVCb3R0b20gPD0gcGFnZUJvdHRvbSkKLQkJCXNjcm9sbCA9IDA7IC8vIGFscmVhZHkgaW4gdmlldwotCQllbHNlCi0JCQlzY3JvbGwgPSBub2RlQm90dG9tIC0gcGFnZUJvdHRvbTsKLQl9Ci0JZWxzZQotCXsKLQkJc2Nyb2xsID0gbm9kZVRvcCAtIHBhZ2VUb3A7Ci0JfQotCQotCXJldHVybiBzY3JvbGw7Ci19Ci0KLS8qCi0gKiBDdXJyZW50bHkgY2FsbGVkIG9uIElFIG9ubHkKLSAqLwotZnVuY3Rpb24gZm9jdXNIYW5kbGVyKGUpCi17Ci0JLyppZiAoaXNNb3ppbGxhKQotCQlyZXR1cm47Ci0JKi8KLQkJCi0JdHJ5ewotCQlpZiAob2xkQWN0aXZlKXsKLQkJCS8vIG9ubHkgZm9jdXMgd2hlbiB0aGUgZWxlbWVudCBpcyB2aXNpYmxlCi0JCQl2YXIgc2Nyb2xsID0gZ2V0VmVydGljYWxTY3JvbGwob2xkQWN0aXZlKTsKLQkJCWlmIChzY3JvbGwgPT0gMCkKLQkJCQlvbGRBY3RpdmUuZm9jdXMoKTsKLQkJfQkJCi0JfQotCWNhdGNoKGUpe30KLX0KLQotCi0vKioKLSAqIGRpc3BsYXkgdG9waWMgbGFiZWwgaW4gdGhlIHN0YXR1cyBsaW5lIG9uIG1vdXNlIG92ZXIgdG9waWMKLSAqLwotZnVuY3Rpb24gbW91c2VNb3ZlSGFuZGxlcihlKSB7Ci0JdmFyIG92ZXJOb2RlID0gZ2V0VGFyZ2V0KGUpOwotIAlpZiAoIW92ZXJOb2RlKSByZXR1cm47Ci0gIAkKLQlvdmVyTm9kZSA9IGdldEFuY2hvck5vZGUob3Zlck5vZGUpOwotCSAgaWYgKG92ZXJOb2RlID09IG51bGwpewotCSAgIHdpbmRvdy5zdGF0dXMgPSAiIjsKLQkgICByZXR1cm47Ci0JICB9Ci0gCi0JaWYgKGlzTW96aWxsYSkKLQkJZS5jYW5jZWxCdWJibGUgPSBmYWxzZTsKLSAgCSAKLQlpZiAob3Zlck5vZGUudGl0bGUgPT0gIiIpIHsKLQkJaWYgKG92ZXJOb2RlLmlubmVyVGV4dCkKLQkJCW92ZXJOb2RlLnRpdGxlID0gb3Zlck5vZGUuaW5uZXJUZXh0OwotCQllbHNlIGlmIChvdmVyTm9kZS50ZXh0KQotCQkJb3Zlck5vZGUudGl0bGUgPSBvdmVyTm9kZS50ZXh0OwotCX0KLQl3aW5kb3cuc3RhdHVzID0gb3Zlck5vZGUudGl0bGU7Ci19Ci0KLS8qKgotICogaGFuZGxlciBmb3IgZXhwYW5kaW5nIC8gY29sbGFwc2luZyB0b3BpYyB0cmVlCi0gKi8KLWZ1bmN0aW9uIG1vdXNlQ2xpY2tIYW5kbGVyKGUpIHsKLQotICAJdmFyIGNsaWNrZWROb2RlID0gZ2V0VGFyZ2V0KGUpOwotCi0gIAlpZiAoaXNQbHVzTWludXMoY2xpY2tlZE5vZGUpICkKLSAgCXsJCi0gICAgCWlmIChpc0NvbGxhcHNlZChjbGlja2VkTm9kZSkpIAotICAgCQkJZXhwYW5kKGNsaWNrZWROb2RlKTsKLSAgCQllbHNlIGlmIChpc0V4cGFuZGVkKGNsaWNrZWROb2RlKSkgCi0gIAkgIAkJY29sbGFwc2UoY2xpY2tlZE5vZGUpOwotICAJfQotICAJZWxzZQotICAJewotICAJCXZhciBwbHVzX21pbnVzID0gZ2V0UGx1c01pbnVzKGNsaWNrZWROb2RlKTsKLSAgCQlpZiAocGx1c19taW51cyAhPSBudWxsKQotICAJCQloaWdobGlnaHRUb3BpYyhwbHVzX21pbnVzKTsKLSAgCX0KLSAgCQotICAJaWYgKGlzTW96aWxsYSkKLSAgCQllLmNhbmNlbEJ1YmJsZSA9IHRydWU7Ci0gIAllbHNlIGlmIChpc0lFKQotICAJCXdpbmRvdy5ldmVudC5jYW5jZWxCdWJibGUgPSB0cnVlOwotfQotCi0vKioKLSAqIGhhbmRsZXIgZm9yIGV4cGFuZGluZyAvIGNvbGxhcHNpbmcgdG9waWMgdHJlZQotICovCi1mdW5jdGlvbiBtb3VzZURibENsaWNrSGFuZGxlcihlKSB7Ci0KLSAgCXZhciBjbGlja2VkTm9kZSA9IGdldFRhcmdldChlKTsKLSAgCWlmICghY2xpY2tlZE5vZGUpIHJldHVybjsKLQotICAJdmFyIHBsdXNfbWludXMgPSBnZXRQbHVzTWludXMoY2xpY2tlZE5vZGUpOwotICAJaWYgKHBsdXNfbWludXMgIT0gbnVsbCkKLSAgCXsJCi0gICAgCWlmIChjbGlja2VkTm9kZS50YWdOYW1lID09ICJBIiAmJiBnZXRDaGlsZE5vZGUoY2xpY2tlZE5vZGUucGFyZW50Tm9kZSwgIlVMIikgPT0gbnVsbCkgCi0gIAkJewotICAJCQloaWdobGlnaHRUb3BpYyhwbHVzX21pbnVzKTsKLSAgCQl9Ci0gIAkJZWxzZQotICAJCXsgIAkJCi0gICAgCQlpZiAoaXNDb2xsYXBzZWQocGx1c19taW51cykpIAotICAgCQkJCWV4cGFuZChwbHVzX21pbnVzKTsKLSAgCQkJZWxzZSBpZiAoaXNFeHBhbmRlZChwbHVzX21pbnVzKSkgCi0gIAkgIAkJCWNvbGxhcHNlKHBsdXNfbWludXMpOyAgCSAgCQkgIAkJICAKLSAgCSAgCQkJCi0gIAkJCWhpZ2hsaWdodFRvcGljKHBsdXNfbWludXMpOwotICAJCX0KLSAgCX0KLSAgCi0gIAlpZiAoaXNNb3ppbGxhKQotICAJCWUuY2FuY2VsQnViYmxlID0gdHJ1ZTsKLSAgCWVsc2UgaWYgKGlzSUUpCi0gIAkJd2luZG93LmV2ZW50LmNhbmNlbEJ1YmJsZSA9IHRydWU7Ci19Ci0KLS8qKgotICogSGFuZGxlciBmb3Iga2V5IGRvd24gKGFycm93cykKLSAqLwotZnVuY3Rpb24ga2V5RG93bkhhbmRsZXIoZSkKLXsKLQl2YXIga2V5OwotCi0JaWYgKGlzSUUpIHsKLQkJa2V5ID0gd2luZG93LmV2ZW50LmtleUNvZGU7Ci0JfSBlbHNlIGlmIChpc01vemlsbGEpIHsKLQkJa2V5ID0gZS5rZXlDb2RlOwotCX0KLQkJCi0JaWYgKGtleSA8MzcgfHwga2V5ID4gNDApIAotCQlyZXR1cm4gdHJ1ZTsKLQkKLQlpZiAoaXNNb3ppbGxhKQotICAJCWUuY2FuY2VsQnViYmxlID0gdHJ1ZTsKLSAgCWVsc2UgaWYgKGlzSUUpCi0gIAkJd2luZG93LmV2ZW50LmNhbmNlbEJ1YmJsZSA9IHRydWU7Ci0gIAkJCi0gIAlpZiAoa2V5ID09IDM5KSB7IC8vIFJpZ2h0IGFycm93LCBleHBhbmQKLQkJdmFyIGNsaWNrZWROb2RlID0gZ2V0VGFyZ2V0KGUpOwotICAJCWlmICghY2xpY2tlZE5vZGUpIHJldHVybjsKLSAgCQlpZiAoaXNJRSl7Ci0JCQlpZihjbGlja2VkTm9kZS5pZCE9bnVsbCl7Ci0JCQkJaWYoY2xpY2tlZE5vZGUuaWQuY2hhckF0KDApPT0nYicpewotCQkJCQlpZihjbGlja2VkTm9kZS5uYW1lIT0ib3BlbmVkIil7Ci0JCQkJCQlsb2FkVE9DKGNsaWNrZWROb2RlLm5hbWUpOwotCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotICAJCXZhciBwbHVzX21pbnVzID0gZ2V0UGx1c01pbnVzKGNsaWNrZWROb2RlKTsKLSAgCQlpZiAocGx1c19taW51cyAhPSBudWxsKQotICAJCXsJCi0gICAgCQlpZiAoaXNDb2xsYXBzZWQocGx1c19taW51cykpIAotICAgCQkJCWV4cGFuZChwbHVzX21pbnVzKTsKLSAgCQkJCi0gIAkJCWhpZ2hsaWdodFRvcGljKHBsdXNfbWludXMpOwotICAJCQlzY3JvbGxJbnRvVmlldyhjbGlja2VkTm9kZSk7Ci0gIAkJfQotICAJfSBlbHNlIGlmIChrZXkgPT0gMzcpIHsgLy8gTGVmdCBhcnJvdyxjb2xsYXBzZQotCQl2YXIgY2xpY2tlZE5vZGUgPSBnZXRUYXJnZXQoZSk7Ci0gIAkJaWYgKCFjbGlja2VkTm9kZSkgcmV0dXJuOwotICAJCQotICAJCWlmKGNsaWNrZWROb2RlLmlkIT1udWxsKXsKLSAgCQkJaWYoY2xpY2tlZE5vZGUuaWQuY2hhckF0KDApPT0nYicpewotCQkJCWlmKGNsaWNrZWROb2RlLm5hbWU9PSJvcGVuZWQiKXsKLQkJCQkJbG9hZFRPQygiICIpOwotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQkJZWxzZXsgCQotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJfQotCi0gIAkJdmFyIHBsdXNfbWludXMgPSBnZXRQbHVzTWludXMoY2xpY2tlZE5vZGUpOwotICAJCWlmIChwbHVzX21pbnVzICE9IG51bGwpCi0gIAkJewkKLSAgICAJCWlmIChpc0V4cGFuZGVkKHBsdXNfbWludXMpKSAKLSAgIAkJCQljb2xsYXBzZShwbHVzX21pbnVzKTsKLSAgCQkJCi0gIAkJCWhpZ2hsaWdodFRvcGljKHBsdXNfbWludXMpOwotICAJCQlzY3JvbGxJbnRvVmlldyhjbGlja2VkTm9kZSk7Ci0gIAkJfQotICAJfSBlbHNlIGlmIChrZXkgPT0gNDAgKSB7IC8vIGRvd24gYXJyb3cKLSAgCQl2YXIgY2xpY2tlZE5vZGUgPSBnZXRUYXJnZXQoZSk7Ci0gIAkJaWYgKCFjbGlja2VkTm9kZSkgcmV0dXJuOwotCi0JCXZhciBuZXh0ID0gZ2V0TmV4dERvd24oY2xpY2tlZE5vZGUpOwotCQlpZiAobmV4dCkKLQkJCW5leHQuZm9jdXMoKTsKLQotICAJfSBlbHNlIGlmIChrZXkgPT0gMzggKSB7IC8vIHVwIGFycm93Ci0gIAkJdmFyIGNsaWNrZWROb2RlID0gZ2V0VGFyZ2V0KGUpOwotICAJCWlmICghY2xpY2tlZE5vZGUpIHJldHVybjsKLQotCQl2YXIgbmV4dCA9IGdldE5leHRVcChjbGlja2VkTm9kZSk7Ci0JCWlmIChuZXh0KQotCQkJbmV4dC5mb2N1cygpOwotICAJfQotICAJCi0gIAkgCQkJCi0gIAlyZXR1cm4gdHJ1ZTsKLX0KLQotaWYgKGlzTW96aWxsYSkgewotICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIG1vdXNlQ2xpY2tIYW5kbGVyLCB0cnVlKTsKLSAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignZGJsY2xpY2snLCBtb3VzZURibENsaWNrSGFuZGxlciwgdHJ1ZSk7Ci0gIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIG1vdXNlTW92ZUhhbmRsZXIsIHRydWUpOwotICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywga2V5RG93bkhhbmRsZXIsIHRydWUpOwotfQotZWxzZSBpZiAoaXNJRSl7Ci0gIGRvY3VtZW50Lm9uY2xpY2sgPSBtb3VzZUNsaWNrSGFuZGxlcjsKLSAgZG9jdW1lbnQub25kYmxjbGljayA9IG1vdXNlRGJsQ2xpY2tIYW5kbGVyOwotICBkb2N1bWVudC5vbm1vdXNlbW92ZSA9IG1vdXNlTW92ZUhhbmRsZXI7Ci0gIGRvY3VtZW50Lm9ua2V5ZG93biA9IGtleURvd25IYW5kbGVyOwotICAvL3dpbmRvdy5vbmZvY3VzID0gZm9jdXNIYW5kbGVyOwotfQotCi1mdW5jdGlvbiBzZXRDb29raWUoIG5hbWUsIHZhbHVlLCBleHBpcmVzLCBwYXRoLCBkb21haW4sIHNlY3VyZSApIAotewotCS8vIHNldCB0aW1lLCBpdCdzIGluIG1pbGxpc2Vjb25kcwotCXZhciB0b2RheSA9IG5ldyBEYXRlKCk7Ci0JdG9kYXkuc2V0VGltZSggdG9kYXkuZ2V0VGltZSgpICk7Ci0KLQkvKgotCWlmIHRoZSBleHBpcmVzIHZhcmlhYmxlIGlzIHNldCwgbWFrZSB0aGUgY29ycmVjdCAKLQlleHBpcmVzIHRpbWUsIHRoZSBjdXJyZW50IHNjcmlwdCBiZWxvdyB3aWxsIHNldCAKLQlpdCBmb3IgeCBudW1iZXIgb2YgZGF5cywgdG8gbWFrZSBpdCBmb3IgaG91cnMsIAotCWRlbGV0ZSAqIDI0LCBmb3IgbWludXRlcywgZGVsZXRlICogNjAgKiAyNAotCSovCi0JaWYgKCBleHBpcmVzICkKLQl7Ci0JZXhwaXJlcyA9IGV4cGlyZXMgKiAxMDAwICogNjAgKiA2MCAqIDI0OwotCX0KLQl2YXIgZXhwaXJlc19kYXRlID0gbmV3IERhdGUoIHRvZGF5LmdldFRpbWUoKSArIChleHBpcmVzKSApOwotCi0JZG9jdW1lbnQuY29va2llID0gbmFtZSArICI9IiArZXNjYXBlKCB2YWx1ZSApICsKLQkoICggZXhwaXJlcyApID8gIjtleHBpcmVzPSIgKyBleHBpcmVzX2RhdGUudG9HTVRTdHJpbmcoKSA6ICIiICkgKyAKLQkoICggcGF0aCApID8gIjtwYXRoPSIgKyBwYXRoIDogIiIgKSArIAotCSggKCBkb21haW4gKSA/ICI7ZG9tYWluPSIgKyBkb21haW4gOiAiIiApICsKLQkoICggc2VjdXJlICkgPyAiO3NlY3VyZSIgOiAiIiApOwotfQotCi0KLWZ1bmN0aW9uIGdldENvb2tpZSggbmFtZSApIHsJCi0JdmFyIHN0YXJ0ID0gZG9jdW1lbnQuY29va2llLmluZGV4T2YoIG5hbWUgKyAiPSIgKTsKLQl2YXIgbGVuID0gc3RhcnQgKyBuYW1lLmxlbmd0aCArIDE7Ci0JaWYgKCAoICFzdGFydCApICYmCi0JKCBuYW1lICE9IGRvY3VtZW50LmNvb2tpZS5zdWJzdHJpbmcoIDAsIG5hbWUubGVuZ3RoICkgKSApCi0JewotCXJldHVybiBudWxsOwotCX0KLQlpZiAoIHN0YXJ0ID09IC0xICkgcmV0dXJuIG51bGw7Ci0JdmFyIGVuZCA9IGRvY3VtZW50LmNvb2tpZS5pbmRleE9mKCAiOyIsIGxlbiApOwotCWlmICggZW5kID09IC0xICkgZW5kID0gZG9jdW1lbnQuY29va2llLmxlbmd0aDsKLQlyZXR1cm4gdW5lc2NhcGUoIGRvY3VtZW50LmNvb2tpZS5zdWJzdHJpbmcoIGxlbiwgZW5kICkgKTsKLX0KLQotCi1mdW5jdGlvbiBEZWxldGVfQ29va2llKCBuYW1lLCBwYXRoLCBkb21haW4gKSB7Ci0JaWYgKCBHZXRfQ29va2llKCBuYW1lICkgKSBkb2N1bWVudC5jb29raWUgPSBuYW1lICsgIj0iICsKLQkoICggcGF0aCApID8gIjtwYXRoPSIgKyBwYXRoIDogIiIpICsKLQkoICggZG9tYWluICkgPyAiO2RvbWFpbj0iICsgZG9tYWluIDogIiIgKSArCi0JIjtleHBpcmVzPVRodSwgMDEtSmFuLTE5NzAgMDA6MDA6MDEgR01UIjsKLX0KLQotZnVuY3Rpb24gZml4VG9waWNVcmwodXJsKSB7Ci0KLQl2YXIgZml4ZWRfaHJlZiA9IHBhcmVudC5wYXJlbnQuZml4VXJsKHVybCk7Ci0JLy8gcmVtb3ZlIHRoZSBxdWVyeSwgaWYgYW55Ci0JdmFyIGluZHggPSBmaXhlZF9ocmVmLmluZGV4T2YoJz8nKTsKLQlpZiAoaW5keCAhPSAtMSkgewotCQlmaXhlZF9ocmVmID0gZml4ZWRfaHJlZi5zdWJzdHJpbmcoMCwgaW5keCk7Ci0JfQotCi0JcmV0dXJuIGZpeGVkX2hyZWY7Ci19Ci0KLS8qIGZpbmQgdGhlIG5vZGUgd2l0aCB0aGUgZ2l2ZW4gdXJsIGFuZCByZXR1cm4gdGhlIEEgZWxlbWVudCAqLwkKLWZ1bmN0aW9uIGZpbmROb2RlKHRvcGljKSB7Ci0JaWYgKCF0b3BpYykgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JdG9waWMgPSBmaXhUb3BpY1VybCh0b3BpYyk7CQotCXZhciBsaW5rcyA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJhIik7Ci0JZm9yICh2YXIgaT0wOyBpPGxpbmtzLmxlbmd0aDsgaSsrKQotCXsJCQkKLQkJdmFyIGZpeGVkX2hyZWYgPSBmaXhUb3BpY1VybChsaW5rc1tpXS5ocmVmKTsJCQkKLQkJaWYgKHRvcGljID09IGZpeGVkX2hyZWYpCi0JCXsKLQkJCS8vYWxlcnQodG9waWMgKyAiXG4iICsgbGlua3NbaV0uaHJlZik7Ci0JCQlyZXR1cm4gbGlua3NbaV07Ci0JCX0KLQl9Ci0JCi0JcmV0dXJuIG51bGw7Ci19Ci0KLQotZnVuY3Rpb24gZ2V0Tm9kZUlkRnJvbVVybCh1cmwpIHsKLQotCXZhciBpbmR4ID0gdXJsLmluZGV4T2YoIj8iKTsKLQlpZiAoIGluZHggPCAwICkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcXVlcnlTdHIgPSB1cmwuc3Vic3RyaW5nKGluZHgrMSk7Ci0JdmFyIHBhaXJzID0gcXVlcnlTdHIuc3BsaXQoIiYiKTsKLSAgIAlmb3IgKHZhciBpID0gMDsgaSA8IHBhaXJzLmxlbmd0aDsgaSsrKSB7Ci0gICAgIAkJdmFyIHBvcyA9IHBhaXJzW2ldLmluZGV4T2YoJz0nKTsKLSAgICAgCQlpZiAocG9zID09IC0xKSBjb250aW51ZTsKLSAgICAgCQl2YXIgYXJnbmFtZSA9IHBhaXJzW2ldLnN1YnN0cmluZygwLHBvcyk7Ci0gICAgIAkJdmFyIHZhbHVlID0gcGFpcnNbaV0uc3Vic3RyaW5nKHBvcysxKTsgICAgCQotICAgICAJCWlmICggYXJnbmFtZSA9PSAibm9kZUlkIiApIHsKLSAgICAgCQkJcmV0dXJuIHZhbHVlOwotICAgICAJCX0KLQl9Ci0JCi0JcmV0dXJuIG51bGw7Ci19Ci0KLWZ1bmN0aW9uIGdldEJyZWFkY3J1bWJzQnlHdWlkKGd1aWQpIHsKLQotCXZhciBub2RlID0gZ2V0Tm9kZUJ5R3VpZChndWlkKTsKLQlpZiAobm9kZSAhPSBudWxsKSB7Ci0JCWlkID0gbm9kZS5nZXRBdHRyaWJ1dGUoImlkIik7Ci0JCXJldHVybiBnZXRCcmVhZGNydW1ic0J5Tm9kZUlkKGlkKTsKLQl9Ci0JCi0JcmV0dXJuICIiOwkKLX0KLQotZnVuY3Rpb24gZ2V0Tm9kZUJ5R3VpZChndWlkKSB7Ci0KLQl2YXIgbGlua3MgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYSIpOwotCWZvciAodmFyIGk9MDsgaTxsaW5rcy5sZW5ndGg7IGkrKykKLQl7CQotCQl2YXIgbm9kZSA9IGxpbmtzW2ldOwotCQlpZiAoZ3VpZCA9PSBub2RlLmdldEF0dHJpYnV0ZSgiZ3VpZCIpICkgewotCQkJcmV0dXJuIG5vZGU7Ci0JCX0KLQl9Ci0JCi0JcmV0dXJuIG51bGw7CQotfQotCi1mdW5jdGlvbiBnZXRCcmVhZGNydW1icyh1cmwpIHsKLQotCXZhciBpZCA9IGdldE5vZGVJZEZyb21VcmwodXJsKTsKLQkvL2FsZXJ0KCJpZDogdXJsIDogIiArIGlkICsgIiwgIiArIHVybCk7Ci0KLQlpZiAoIGlkID09IG51bGwgfHwgaWQgPT0gIiIgKSB7Ci0JCS8qCi0JCS8vIGdldCB0aGUgcGFyZW50IG5vZGUsIGFzc3VtaW5nIHRoZSBjdXJyZW50IG5vZGUgaXMgbmF2aWdhdGVkIGZyb20gdGhlIHByZXZpb3VzIG5vZGUKLQkJdmFyIHByZXZpb3VzQnJlYWRDcnVtYklkID0gZ2V0Q29va2llKCJwcmV2aW91c0JyZWFkQ3J1bWJJZCIpOwotCQkKLQkJLy9hbGVydCgicHJldmlvdXNCcmVhZENydW1iSWQ9IiArIHByZXZpb3VzQnJlYWRDcnVtYklkKTsKLQkJdmFyIHBOb2RlID0gbnVsbDsKLQkJaWYgKCBwcmV2aW91c0JyZWFkQ3J1bWJJZCAhPSBudWxsICkgewotCQkJcE5vZGUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChwcmV2aW91c0JyZWFkQ3J1bWJJZCk7Ci0JCQlpZiAoIHBOb2RlICE9IG51bGwgKSB7Ci0JCQkJLy8gZ2V0IHRoZSBwYXJlbnQgbm9kIG9mIHRoZSBsaW5rCi0JCQkJcE5vZGUgPSBwTm9kZS5wYXJlbnROb2RlOwotCQkJCS8vYWxlcnQocE5vZGUudGFnTmFtZSk7Ci0JCQl9Ci0JCX0KLQkJKi8KLQkJCi0JCXZhciBub2RlID0gZmluZE5vZGUodXJsKTsJCQotCQlpZiAoIG5vZGUgIT0gbnVsbCApIHsKLQkJCWlkID0gbm9kZS5nZXRBdHRyaWJ1dGUoImlkIik7Ci0JCX0KLQkJCi0JCWlmICggaWQgPT0gbnVsbCApIHsKLQkJCXJldHVybiAiIjsKLQkJfQotCQkKLQkJLy8gc2F2ZSB0aGUgY3VycmVudCBpZAotCQkvLyBzZXRDb29raWUoInByZXZpb3VzQnJlYWRDcnVtYklkIiwgaWQpOwotCX0KLQkKLQlzZWxlY3RUb3BpY0J5SWQoaWQpOwotCi0JcmV0dXJuIGdldEJyZWFkY3J1bWJzQnlOb2RlSWQoaWQpOwotfQotCi0KLWZ1bmN0aW9uIGdldEJyZWFkY3J1bWJzQnlOb2RlSWQoaWQpIHsKLQotCXZhciBiY3MgPSBbXTsKLQl2YXIgY291bnQgPSAwOwotCXZhciBwSWQgPSBpZDsKLQl3aGlsZSAoIHBJZCAhPSAiIiApIHsKLQkJdmFyIHRvcGljID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQocElkKTsKLQkJaWYgKCB0b3BpYyA9PSBudWxsICkgewotCQkJYnJlYWs7Ci0JCX0KLQotCQliY3NbY291bnQrK10gPSBfY29uc3RydWN0QnJlYWRjcnVtYih0b3BpYyk7Ci0JCQotCQlwSWQgPSB0b3BpYy5nZXRBdHRyaWJ1dGUoInBhcmVudElkIik7Ci0JfQotCQotCXJldHVybiBiY3MucmV2ZXJzZSgpOwotCi19Ci0KLWZ1bmN0aW9uIF9jb25zdHJ1Y3RCcmVhZGNydW1iKG5vZGUpIHsKLQotCi0JdmFyIHN0ciA9IG5vZGUuaW5uZXJIVE1MOwotCXZhciB1cmwgPSBub2RlLmhyZWY7Ci0JdmFyIGd1aWQgPSBub2RlLmdldEF0dHJpYnV0ZSgiZ3VpZCIpOwotCQotCXZhciBpID0gc3RyLmluZGV4T2YoIj4iKTsKLQlpZiAoIGkgPiAwICkgewotCQlzdHIgPSBzdHIuc3Vic3RyaW5nKGkrMSk7Ci0JfQotCi0JcmV0dXJuIHtpZDogZ3VpZCwgdXJsOiB1cmwsIHRpdGxlOiBzdHJ9OwotCi19Ci0KLQotCi1mdW5jdGlvbiBnZXRCYXNlVXJsKCkgewotCXZhciB1cmwgPSBwYXJlbnQucGFyZW50LmxvY2F0aW9uLmhyZWY7Ci0JdmFyIGkgPSB1cmwubGFzdEluZGV4T2YoIi8iKTsKLQlyZXR1cm4gdXJsLnN1YnN0cmluZygwLCBpKzEpOwotfQotCi1mdW5jdGlvbiBnZXRDdXJyZW50U2VsZWN0aW9uKCkgewotCXJldHVybiBvbGRBY3RpdmU7Ci19Ci0KLS8qIGdpdmUgdGhlIExJIG5vZGUgYXMgcGFyZW50LCBmaW5kIHRoZSBjaGlsZCA8QSBub2RlIHdpdGggdGhlIGdpdmVuIGd1aWQqLwotZnVuY3Rpb24gZ2V0Q2hpbGROb2RlV2l0aEd1aWQoLypMSSovcE5vZGUsIGd1aWQpCi17Ci0JLy9hbGVydCgicGFyZW50IExpbms6ICIgKyBwTm9kZS50YWdOYW1lKTsKLQotCWlmICggcE5vZGUgPT0gbnVsbCApIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCWlmICggcE5vZGUudGFnTmFtZSA9PSAiQSIgKSB7Ci0JCXBOb2RlID0gcE5vZGUucGFyZW50Tm9kZTsKLQl9Ci0JCi0JdmFyIHVsID0gZ2V0Q2hpbGROb2RlKHBOb2RlLCAiVUwiKTsKLQkJCi0JaWYgKCB1bCA9PSBudWxsICkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCQotCXZhciBsaXN0ID0gdWwuY2hpbGROb2RlczsKLQlpZiAobGlzdCA9PSBudWxsKSByZXR1cm4gbnVsbDsKLQkKLQlmb3IgKHZhciBpPTA7IGk8bGlzdC5sZW5ndGg7IGkrKykgewotCQl2YXIgdGFnID0gbGlzdC5pdGVtKGkpOwotCQlpZiAodGFnLnRhZ05hbWUgPT0gIkxJIiApIHsKLQkJCXZhciBhID0gZ2V0Q2hpbGROb2RlKHRhZywgIkEiKTsKLQkJCWlmICggYSAhPSBudWxsICYmIGEuZ2V0QXR0cmlidXRlKCJndWlkIikgPT0gZ3VpZCkgewkJCi0JCQkJcmV0dXJuIGE7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcmV0dXJuIG51bGw7Ci19Ci0KLQotLyogZ2l2ZSBhbiBhcnJheSBvZiBndWlkcywgcmV0dXJucyB0aGUgYnJlYWRjcnVtYnMqLwotZnVuY3Rpb24gZ2V0QnJlYWRjcnVtYnNCeVBhdGgoZ3VpZHMpIHsKLQotCWlmICggZ3VpZHMgPT0gbnVsbCB8fCBndWlkcy5sZW5ndGggPT0gMCApIHsKLQkJcmV0dXJuIFtdOwotCX0KLQkKLQkvLyBzdGFydCBmcm9tIHRoZSBmaXJzdCBndWlkLCBvciBmcm9tIHRoZSBjdXJyZW50IHNlbGVjdGlvbgotCXZhciBzdGFydCA9IDA7Ci0JdmFyIHBOb2RlID0gbnVsbDsKLQl2YXIgY3VyTm9kZSA9IGdldEN1cnJlbnRTZWxlY3Rpb24oKTsKLQlpZiAoIGN1ck5vZGUgIT0gbnVsbCApIHsKLQkJdmFyIGN1ckd1aWQgPSBjdXJOb2RlLmdldEF0dHJpYnV0ZSgiZ3VpZCIpOwotCQlmb3IgKCB2YXIgaSA9IDA7IGkgPCBndWlkcy5sZW5ndGgtMTsgaSsrICkgewotCQkJdmFyIGd1aWQgPSBndWlkc1tpXTsKLQkJCWlmICggZ3VpZCA9PSBjdXJHdWlkICkgewotCQkJCXN0YXJ0ID0gaTsKLQkJCQlwTm9kZSA9IGN1ck5vZGU7Ci0JCQkJYnJlYWs7Ci0JCQl9CQkJCi0JCX0KLQl9Ci0JCi0KLQlpZiAoIHBOb2RlID09IG51bGwgKSB7Ci0JCXBOb2RlID0gZ2V0Tm9kZUJ5R3VpZChndWlkc1swXSk7Ci0JfQotCQotCWlmICggcE5vZGUgPT0gbnVsbCApIHsKLQkJcmV0dXJuIFtdOwotCX0KLQkKLQl2YXIgYmNzID0gZ2V0QnJlYWRjcnVtYnNCeU5vZGVJZCggcE5vZGUuZ2V0QXR0cmlidXRlKCJpZCIpICk7Ci0JCQotCWZvciAoIHZhciBpID0gc3RhcnQrMTsgaSA8IGd1aWRzLmxlbmd0aDsgaSsrICkgewotCQl2YXIgbm9kZSA9IGdldENoaWxkTm9kZVdpdGhHdWlkKHBOb2RlLCBndWlkW2ldKTsKLQkJaWYgKCBub2RlID09IG51bGwgKSB7Ci0JCQlicmVhazsKLQkJfQotCQkKLQkJYmNzLnB1c2goX2NvbnN0cnVjdEJyZWFkY3J1bWIobm9kZSkpOwkJCi0JCXBOb2RlID0gbm9kZTsKLQl9Ci0KLQkvLyBzZWxlY3QgdGhlIG5vZGUKLQkvL3NlbGVjdFRvcGljQnlJZChwTm9kZS5nZXRBdHRyaWJ1dGUoImlkIikgKTsKLQotCXJldHVybiBiY3M7CQotfQotCi0KLQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9ub2FwcGxldC90cmVlLmpzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9ub2FwcGxldC90cmVlLmpzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMGYyZTNlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvbm9hcHBsZXQvdHJlZS5qcworKysgL2Rldi9udWxsCkBAIC0xLDEwMyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vIAotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotLyoqCi0gKiBMb2FkcyB0aGUgc3BlY2lmaWVkIHRhYmxlIG9mIGNvbnRlbnRzCi0gKi8KLWZ1bmN0aW9uIGxvYWRUT0ModG9jSHJlZikKLXsKLQkvLyBuYXZpZ2F0ZSB0byB0aGlzIHRvYywgaWYgbm90IGFscmVhZHkgbG9hZGVkCi0JaWYgKHdpbmRvdy5sb2NhdGlvbi5ocmVmLmluZGV4T2YoInRvY1ZpZXcuanNwP3RvYz0iK3RvY0hyZWYpICE9IC0xKQotCQlyZXR1cm47Ci0Jd2luZG93LmxvY2F0aW9uLnJlcGxhY2UoInRvY1ZpZXcuanNwP3RvYz0iK3RvY0hyZWYpOwotfQotCi12YXIgdG9jVGl0bGUgPSAiIjsKLXZhciB0b2NJZCA9ICIiOwotCi1mdW5jdGlvbiBvbmxvYWRIYW5kbGVyKCkKLXsKLQlyZXR1cm47Ci0JdG9jVGl0bGUgPSAnV29ya2JlbmNoXHUwMDIwVXNlclx1MDAyMEd1aWRlJzsKLQl2YXIgdG9jVG9waWMgPSAiYWJvdXQ6YmxhbmsiOwotCi0JLy8gc2V0IHRpdGxlIG9uIHRoZSBjb250ZW50IHRvb2xiYXIKLQlwYXJlbnQucGFyZW50LnBhcmVudC5zZXRDb250ZW50VG9vbGJhclRpdGxlKHRvY1RpdGxlKTsKLQotCXZhciB0b3BpY1NlbGVjdGVkPWZhbHNlOwotCS8vIHNlbGVjdCBzcGVjaWZpZWQgdG9waWMsIG9yIGVsc2UgdGhlIGJvb2sKLQl2YXIgdG9waWMgPSAiYWJvdXQ6YmxhbmsiOwotCWlmICh0b3BpYyAhPSAiYWJvdXQ6YmxhbmsiICYmIHRvcGljICE9IHRvY1RvcGljKSB7Ci0JCWlmICh0b3BpYy5pbmRleE9mKHdpbmRvdy5sb2NhdGlvbi5wcm90b2NvbCkgIT0gMCAmJiB0b3BpYy5sZW5ndGggPiAyKSB7Ci0JCQkvLyByZW1vdmUgdGhlIC4uIGZyb20gdG9waWMKLQkJCXRvcGljID0gdG9waWMuc3Vic3RyaW5nKDIpOwotCQkJLy8gcmVtb3ZlIGFkdmFuY2VkL3RvY1ZpZXcuanNwIGZyb20gcGF0aCB0byBvYnRhaW4gY29udGV4dFBhdGgKLQkJCXZhciBjb250ZXh0UGF0aCA9IHdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZTsKLQkJCXZhciBzbGFzaCA9IGNvbnRleHRQYXRoLmxhc3RJbmRleE9mKCcvJyk7Ci0JCQlpZihzbGFzaCA+IDApIHsKLQkJCQlzbGFzaCA9IGNvbnRleHRQYXRoLmxhc3RJbmRleE9mKCcvJywgc2xhc2gtMSk7Ci0JCQkJaWYoc2xhc2ggPj0gMCkgewotCQkJCQljb250ZXh0UGF0aCA9IGNvbnRleHRQYXRoLnN1YnN0cigwLCBzbGFzaCk7Ci0JCQkJCXRvcGljID0gd2luZG93LmxvY2F0aW9uLnByb3RvY29sICsgIi8vIiArd2luZG93LmxvY2F0aW9uLmhvc3QgKyBjb250ZXh0UGF0aCArIHRvcGljOwotCQkJCX0KLQkJCX0KLQkJfQotCQl0b3BpY1NlbGVjdGVkID0gc2VsZWN0VG9waWModG9waWMpOwotCX0gZWxzZSB7Ci0JCXRvcGljU2VsZWN0ZWQgPSBzZWxlY3RUb3BpY0J5SWQodG9jSWQpOwotCX0KLQotCWlmKCF0b3BpY1NlbGVjdGVkKXsKLQkJaWYocGFyZW50LnBhcmVudC5hY3Rpdml0eUZpbHRlcmluZyl7Ci0JCQlhc2tTaG93QWxsKCk7Ci0JCX0KLQl9Ci0KLQotCWZvY3VzSGFuZGxlcigiZSIpOwotfQotCi12YXIgYXNrU2hvd0FsbERpYWxvZzsKLXZhciB3ID0gNDcwOwotdmFyIGggPSAyNzA7Ci0KLWZ1bmN0aW9uIGFza1Nob3dBbGwoKXsKLQotCXZhciBsID0gdG9wLnNjcmVlbkxlZnQgKyAodG9wLmRvY3VtZW50LmJvZHkuY2xpZW50V2lkdGggLSB3KSAvIDI7Ci0JdmFyIHQgPSB0b3Auc2NyZWVuVG9wICsgKHRvcC5kb2N1bWVudC5ib2R5LmNsaWVudEhlaWdodCAtIGgpIC8gMjsKLQotCS8vIG1vdmUgdGhlIGRpYWxvZyBqdXN0IGEgYml0IGhpZ2hlciB0aGFuIHRoZSBtaWRkbGUKLQlpZiAodC01MCA+IDApIHQgPSB0LTUwOwotCi0Jd2luZG93LmxvY2F0aW9uPSJqYXZhc2NyaXB0Oi8vbmVlZE1vZGFsIjsKLQlhc2tTaG93QWxsRGlhbG9nID0gd2luZG93Lm9wZW4oImFza1Nob3dBbGwuanNwIiwgImFza1Nob3dBbGxEaWFsb2ciLCAicmVzaXplYWJsZT1ubyxoZWlnaHQ9IitoKyIsd2lkdGg9Iit3KyIsbGVmdD0iK2wrIix0b3A9Iit0ICk7Ci0JYXNrU2hvd0FsbERpYWxvZy5mb2N1cygpOwotfQotCi1mdW5jdGlvbiB5ZXNTaG93QWxsKCl7Ci0Jd2luZG93LnBhcmVudC5wYXJlbnQuc2hvd0FsbCgpOwotfQotCi1mdW5jdGlvbiBjbG9zZUFza1Nob3dBbGxEaWFsb2coKXsKLQl0cnkgewotCQlpZiAoYXNrU2hvd0FsbERpYWxvZyl7Ci0JCQlhc2tTaG93QWxsRGlhbG9nLmNsb3NlKCk7Ci0JCX0KLQl9Ci0JY2F0Y2goZSkge30KLX0KLQotZnVuY3Rpb24gb251bmxvYWRIYW5kbGVyKCkgewotCWNsb3NlQXNrU2hvd0FsbERpYWxvZygpOwotCi0JZG9jdW1lbnQuYm9keS5pbm5lckhUTUwgPSAiIjsKLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9wcm9jZXNzL2dsb3NzYXJ5L2luZGV4Lmh0bSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3QvcHJvY2Vzcy9nbG9zc2FyeS9pbmRleC5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwYmJiZjQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9wcm9jZXNzL2dsb3NzYXJ5L2luZGV4Lmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDL0RURCBIVE1MIDQuMDEvL0VOIgotICAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLTxodG1sIGxhbmc9ImVuIiB4bWw6bGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTxtZXRhIG5hbWU9Im1ldGFfdGFnZ2VkIiBjb250ZW50PSJ0cnVlIj4KLTx0aXRsZT5HbG9zc2FyeSAtIEVjbGlwc2UgUHJvY2VzcyBGcmFtZXdvcms8L3RpdGxlPgotPC9oZWFkPgotPGZyYW1lc2V0IHJvd3M9IjI1LCoiPgotPGZyYW1lIG5hbWU9Imdsb3NzYXJ5X25hdiIgc3JjPSJuYXZpZy5odG0iIHNjcm9sbGluZz0ibm8iIG1hcmdpbmhlaWdodD0iMiIgbWFyZ2lud2lkdGg9IjIiIHRpdGxlPSJOYXZpZ2F0aW9uIEFyZWEiPgotPGZyYW1lIG5hbWU9Imdsb3NzYXJ5X2RvYyIgc3JjPSIuLi9nbG9zc2FyeS5odG0iIG1hcmdpbmhlaWdodD0iMCIgbWFyZ2lud2lkdGg9IjIiIHNjcm9sbGluZz0iYXV0byIgdGl0bGU9IkNvbnRlbnQgQXJlYSI+Ci08L2ZyYW1lc2V0PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9yb3AuY3NzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9yb3AuY3NzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NDIyMGU2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvcm9wLmNzcworKysgL2Rldi9udWxsCkBAIC0xLDE2ODUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqLwotCi1ib2R5Ci17Ci0JYmFja2dyb3VuZC1pbWFnZTogbm9uZTsKLQliYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTsKLSAJZm9udC1mYW1pbHk6IEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0gCWZvbnQtc2l6ZTogMTBwdAotfQotCi1ib2R5Lm5hdmJ1dHRvbnMKLXsKLQltYXJnaW4tbGVmdDogMHB4OwotCW1hcmdpbi10b3A6IDBweDsKLQltYXJnaW4tcmlnaHQ6IDBweAotfQotCi0uYmd3aGl0ZQoteyAKLQkgYmFja2dyb3VuZC1jb2xvcjogI2ZmZmZmZgotfSAKLQotLmJ1dHRvbnMKLXsKLSAgIAliYWNrZ3JvdW5kLWNvbG9yOiAjZWZlZmVmOwotCWNvbG9yOiAjMDAwMDAwOwotCWZvbnQtZmFtaWx5OiBWZXJkYW5hLCBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOwkKLQlmb250LXNpemU6IDEwcHg7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lCQotfQotCi0uYnV0dG9ub24gCi17Ci0JYmFja2dyb3VuZC1jb2xvcjogI2RlZGVkZTsKLQljb2xvcjogIzAwMDAwMDsKLQlmb250LWZhbWlseTogVmVyZGFuYSwgQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsJCi0JZm9udC1zaXplOiAxMHB4OwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLQl2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlCi19IAotCi10ZC5idXR0b25zCi17Ci0JdmVydGljYWwtYWxpZ246IG1pZGRsZTsKLQlmb250LWZhbWlseTogQXJpYWwsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxMHB0Ci19Ci0KLS5pY29uYm9yZGVyCi17IAotCSBiYWNrZ3JvdW5kLWNvbG9yOiAjZGVkZWRlCi19Ci0KLWEuYnV0dG9uczpsaW5rIAoteyAKLQljb2xvcjogIzAwMDAwMAotfQotCi1hLmJ1dHRvbnM6dmlzaXRlZCAKLXsgCi0JY29sb3I6ICMwMDAwMDAKLX0KLQotYS5idXR0b25zOmhvdmVyIAoteyAKLQljb2xvcjogI2NjMDAwMAotfQotCi1hLmJ1dHRvbnM6YWN0aXZlCi17IAotCWNvbG9yOiAjY2MwMDAwCi19Ci0KLS8qZm9yIHBhZ2VzIHdpdGggYnV0dG9uIG5hdmlnYXRpb24gb24gdG9wKi8gIAotZGl2Lm1hcmdpbnMyMCAKLXsgCQotCW1hcmdpbi1sZWZ0OiA3cHg7Ci0JbWFyZ2luLXRvcDogMjBweDsKLQltYXJnaW4tcmlnaHQ6IDdweAotfSAgIAotCi0KLWgxCi17Ci0JZm9udC1mYW1pbHk6IEFyaWFsLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogbGFyZ2UKLX0KLSAgICAgICAgCi1oMS5iYW5uZXIKLXsKLSAgICAgICAgdGV4dC1hbGlnbjogbGVmdDsKLSAgICAgICAgZm9udC1mYW1pbHk6IEFyaWFsLCBzYW5zLXNlcmlmOwotCSAgCWZvbnQtc2l6ZTogbGFyZ2U7Ci0JICAJdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmUKLX0KLQotaDIKLXsKLSAgICAgICAgZm9udC1mYW1pbHk6IEFyaWFsLCBzYW5zLXNlcmlmOwotICAgICAgICBmb250LXNpemU6IDE1MCUJCi19Ci0gICAgICAgIAotaDIuYmFubmVyCi17Ci0gICAgICAgIHRleHQtYWxpZ246IGxlZnQ7Ci0gICAgICAgIGZvbnQtZmFtaWx5OiBBcmlhbCwgc2Fucy1zZXJpZjsKLSAgICAgICAgZm9udC1zaXplOiAxNTAlOwotICAgICAgICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZQotfQotCi1oMwotewotICAgICAgICBmb250LWZhbWlseTogQXJpYWwsIHNhbnMtc2VyaWYKLX0KLQotaDQsIGg1LCBoNgotewotICAgICAgICBmb250LWZhbWlseTogQXJpYWwsIHNhbnMtc2VyaWY7Ci0gICAgICAgIG1hcmdpbi1sZWZ0OiAwcHgKLX0KLSAgCi0gICAgCi1hOmxpbmsKLXsKLSAgICBjb2xvcjogIzAwMzM5OQotfQotCi1hOmFjdGl2ZQotewotICAgIGNvbG9yOiAjMDAwMGZmCi19Ci0KLWE6dmlzaXRlZAotewotICAgIGNvbG9yOiAjNjYwMDY2Ci19Ci0KLWRsCi17Ci0JZm9udC1mYW1pbHk6IEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JIGZvbnQtc2l6ZTogMTBwdDsKLX0KLQotZHQKLXsKLQlmb250LWZhbWlseTogQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQkgZm9udC1zaXplOiAxMHB0OwotfQotCi1kZAotewotCWZvbnQtZmFtaWx5OiBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCSBmb250LXNpemU6IDEwcHQ7Ci19Ci0KLXAKLXsKLSAgICAgICAgZm9udC1mYW1pbHk6IEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0gICAgICAgIGZvbnQtc2l6ZTogMTBwdDsKLSAgICAgICAgbWFyZ2luLWxlZnQ6IDBweAotfQotCi1wLm5vZGUKLXsKLSAgICAgICAgZm9udC1mYW1pbHk6IEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0gICAgICAgIGZvbnQtc2l6ZTogMTBwdDsKLSAgICAgICAgbWFyZ2luLWxlZnQ6IDE1cHgKLSAgICAgICAgCi19Ci0KLXAuZXhhbXBsZWhlYWRpbmcKLXsKLSAgICAgICAgZm9udC1mYW1pbHk6IEFyaWFsLCBzYW5zLXNlcmlmOwotICAgICAgICBmb250LXdlaWdodDogYm9sZDsKLSAgICAgICAgZm9udC1zaXplOiAxMHB0OwotICAgICAgICBtYXJnaW4tbGVmdDogMTVweAotfQotCi1wLmV4YW1wbGUKLXsKLQlmb250LWZhbWlseTogQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQltYXJnaW4tbGVmdDogNzBweDsKLX0KLQotcC5waWN0dXJldGV4dAotewotCXRleHQtYWxpZ246IGNlbnRlcjsKLQlmb250LWZhbWlseTogc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDgwJTsKLSAgICAgICAgbWFyZ2luLWxlZnQ6IDcwcHg7Ci0gICAgICAgIG1hcmdpbi1yaWdodDogNTBweAotfQotCi1wLmRlZmluaXRpb24KLXsKLQliYWNrZ3JvdW5kOiAjZmZmZmNjOwotCWJvcmRlcjogdGhpbiBkb3VibGUgYmxhY2sKLX0KLQotcC50YWJsZWhlYWRpbmcKLXsKLQlmb250LXdlaWdodDogYm9sZDsKLSAgICAgICAgbWFyZ2luLWxlZnQ6IDAKLX0KLQotcC50YWJsZXRleHQKLXsKLSAgICAgICAgbWFyZ2luLWxlZnQ6IDAKLX0KLQotcC5wYXJhbW5hbWUKLXsKLSAgIHRleHQtYWxpZ246IGxlZnQKLX0KLQotcC5wYXJhbWV4YW1wbGUKLXsKLSAgIHRleHQtYWxpZ246IGxlZnQ7Ci0gICBjb2xvcjogcmVkCi19Ci0KLXAucGFyYW1kZXNjcmlwdGlvbgotewotICAgdGV4dC1hbGlnbjogbGVmdAotfQotCi1vbAotewotICAgICAgICBmb250LWZhbWlseTogQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsKLSAgICAgICAgZm9udC1zaXplOiAxMHB0OwotICAgICAgICBtYXJnaW4tbGVmdDogKzQ1cHgKLX0KLQotb2wgb2wKLXsKLSAgICAgICAgZm9udC1mYW1pbHk6IEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0gICAgICAgIGZvbnQtc2l6ZTogMTBwdDsKLSAgICAgICAgbWFyZ2luLWxlZnQ6ICsyM3B4Ci19Ci0KLW9sIG9sIG9sCi17Ci0gICAgICAgIGZvbnQtZmFtaWx5OiBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotICAgICAgICBmb250LXNpemU6IDEwcHQ7Ci0gICAgICAgIG1hcmdpbi1sZWZ0OiArMjNweAotfQotCi1vbC5hbHBoYQotewotCWxpc3Qtc3R5bGUtdHlwZTogbG93ZXItYWxwaGEKLX0KLQotdWwKLXsKLSAgICAgICAgZm9udC1mYW1pbHk6IEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0gICAgICAgIGZvbnQtc2l6ZTogMTBwdDsKLX0KLQotdWwgbGkKLXsKLSAgICAgICAgZm9udC1mYW1pbHk6IEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0gICAgICAgIGZvbnQtc2l6ZTogMTBwdDsKLSAgICAgICAgdGV4dC1pbmRlbnQ6ICsyMHB4Ci0JdGV4dC1hbGlnbjoganVzdGlmeQotfQotCi0KLXVsIHVsIGxpCi17Ci0gICAgICAgIGZvbnQtZmFtaWx5OiBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotICAgICAgICBmb250LXNpemU6IDEwcHQ7Ci0gICAgICAgIHRleHQtaW5kZW50OiArMTBweAotCXRleHQtYWxpZ246IGp1c3RpZnkKLX0KLQotCi11bCB1bCB1bCBsaQotewotICAgICAgICBmb250LWZhbWlseTogQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsKLSAgICAgICAgZm9udC1zaXplOiAxMHB0OwotICAgICAgICB0ZXh0LWluZGVudDogKzEwcHgKLQl0ZXh0LWFsaWduOiBqdXN0aWZ5Ci19Ci0KLQotdWwgbGkubm9kZQotewotICAgICAgICB0ZXh0LWluZGVudDogKzEwcHgKLQl0ZXh0LWFsaWduOiBqdXN0aWZ5Ci19Ci0KLXVsIGxpLmNrCi17Ci0gICAgICAgIGZvbnQtZmFtaWx5OiBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotICAgICAgICBmb250LXNpemU6IDEwcHQ7Ci0gICAgICAgIHRleHQtaW5kZW50OiArMTBweAotCXRleHQtYWxpZ246IGp1c3RpZnkKLX0KLQotCi11bCB1bCBsaS5jawotewotICAgICAgICBmb250LWZhbWlseTogQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsKLSAgICAgICAgZm9udC1zaXplOiAxMHB0OwotICAgICAgICB0ZXh0LWluZGVudDogKzEwcHgKLQl0ZXh0LWFsaWduOiBqdXN0aWZ5Ci19Ci0KLQotdWwgdWwgdWwgbGkuY2sKLXsKLSAgICAgICAgZm9udC1mYW1pbHk6IEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0gICAgICAgIGZvbnQtc2l6ZTogMTBwdDsKLSAgICAgICAgdGV4dC1pbmRlbnQ6ICsxMHB4OwotICAgIAl0ZXh0LWFsaWduOiBqdXN0aWZ5Ci19Ci0KLQotdWwucGx1cwotewotICAgICAgICBsaXN0LXN0eWxlLWltYWdlOiAKLX0KLQotdWwubWludXMKLXsKLSAgICAgICAgbGlzdC1zdHlsZS1pbWFnZTogCi19Ci0KLXVsLmNrCi17Ci0KLX0KLQotdGFibGUKLXsKLS8qCWJvcmRlcjogMTsqLwotLyoJd2lkdGg6IDg1JTsqLwotLyoJY2VsbHNwYWNpbmc6IDA7Ki8KLS8qCWNlbGxwYWRkaW5nOiA0OyovCi0vKglzdHlsZT0iYm9yZGVyOiAxcHggc29saWQgcmdiKDEyOCwxMjgsMTI4KSI7Ki8KLS8qCWJvcmRlcmNvbG9yPSIjODA4MDgwIjsqLwotLyoJYm9yZGVyY29sb3JsaWdodDogIzgwODA4MDsqLwotLyoJYm9yZGVyY29sb3JkYXJrOiAjODA4MDgwKi8KLX0KLQotdGJvZHkKLXsKLQl2YWxpZ246IGJhc2VsaW5lOwotCWZvbnQtZmFtaWx5OiBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmCi19Ci0KLXRoCi17Ci0JZm9udC1zaXplOiBzbWFsbGVyCi19Ci0KLXRkCi17Ci0JdmVydGljYWwtYWxpZ246IHRvcDsKLQlmb250LWZhbWlseTogQXJpYWwsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxMHB0Ci19Ci0KLXRkIHVsCi17Ci0JbWFyZ2luLWxlZnQ6ICsyMHB4OwotCWZvbnQtZmFtaWx5OiBBcmlhbCwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDEwcHQKLX0KLQotZm9udC5wYXJhbWV4YW1wbGUKLXsKLSAgIGNvbG9yOiByZWQKLX0KLQotZm9udC5pbWFnZWV4YW1wbGUKLXsKLSAgIGZvbnQtc2l6ZTogc21hbGxlcgotfQotCi0vKiB1c2VkIGZvciBub3QtaW5jbHVkZWQgcGx1Z2lucyovCi1oMS5ub3RpbmNsdWRlZGJhbm5lcgotewotICAgICAgICBiYWNrZ3JvdW5kOiAjRkZGRkNDOwotICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7Ci0gICAgICAgIGZvbnQtZmFtaWx5OiBBcmlhbCwgc2Fucy1zZXJpZjsKLQkgIGZvbnQtc2l6ZTogbGFyZ2U7Ci19Ci0KLQotLyp0aGUgZm9sbG93aW5nIGlzIHVzZWQgZm9yIGlibSBjb250ZW50Ki8KLQotaDEuaWJtCi17Ci0gICAgICAgIGZvbnQtZmFtaWx5OiBBcmlhbCwgc2Fucy1zZXJpZjsKLX0KLSAgICAgICAgCi1oMS5pYm1iYW5uZXIKLXsKLSAgICAgICAgdGV4dC1hbGlnbjogbGVmdDsKLSAgICAgICAgZm9udC1mYW1pbHk6IEFyaWFsLCBzYW5zLXNlcmlmOwotCSAgZm9udC1zaXplOiBsYXJnZTsKLQkgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmUKLX0KLQotCi0gICAgCi0KLWgyLmlibQotewotICAgICAgICBmb250LWZhbWlseTogQXJpYWwsIHNhbnMtc2VyaWY7Ci19Ci0gICAgICAgIAotaDIuaWJtYmFubmVyCi17Ci0gICAgICAgIHRleHQtYWxpZ246IGxlZnQ7Ci0gICAgICAgIGZvbnQtZmFtaWx5OiBBcmlhbCwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDE1MCU7IAotCXRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOwotfQotCi1oMy5pYm0KLXsKLSAgICAgICAgZm9udC1mYW1pbHk6IEFyaWFsLCBzYW5zLXNlcmlmOwotfQotCi1oNC5pYm0sIGg1LmlibSwgaDYuaWJtCi17Ci0gICAgICAgIGZvbnQtZmFtaWx5OiBBcmlhbCwgc2Fucy1zZXJpZjsKLSAgICAgICAgbWFyZ2luLWxlZnQ6IDBweAotfQotCi1kbC5pYm0KLXsKLQlmb250LWZhbWlseTogQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQkgZm9udC1zaXplOiAxMHB0OwotfQotCi1kdC5pYm0KLXsKLQlmb250LWZhbWlseTogQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQkgZm9udC1zaXplOiAxMHB0OwotfQotCi1kZC5pYm0KLXsKLQlmb250LWZhbWlseTogQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQkgZm9udC1zaXplOiAxMHB0OwotfQotICAgCi1wLmlibQotewotCWZvbnQtZmFtaWx5OiBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCSBmb250LXNpemU6IDEwcHQ7Ci0gICAgICAgCSBtYXJnaW4tbGVmdDogMHB4Ci19Ci0KLXAuaWJtbm9kZQotewotICAgICAgICBtYXJnaW4tbGVmdDogMTVweAotICAgICAgICBsZWZ0TWFyZ2luOiAxNXB4Ci19Ci0KLXAuaWJtZXhhbXBsZWhlYWRpbmcKLXsKLSAgICAgICAgZm9udC1mYW1pbHk6IEFyaWFsLCBzYW5zLXNlcmlmOwotICAgICAgICBmb250LXdlaWdodDogYm9sZDsKLSAgICAgICAgZm9udC1zaXplOiAxMHB0OwotICAgICAgICBtYXJnaW4tbGVmdDogMTVweAotfQotCi1wLmlibWV4YW1wbGUKLXsKLQltYXJnaW4tbGVmdDogNzBweDsKLX0KLQotcC5pYm1waWN0dXJldGV4dAotewotCXRleHQtYWxpZ246IGNlbnRlcjsKLQlmb250LWZhbWlseTogc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDgwJTsKLSAgICAgICAgbWFyZ2luLWxlZnQ6IDcwcHg7Ci0gICAgICAgIG1hcmdpbi1yaWdodDogNTBweAotfQotCi1wLmlibWRlZmluaXRpb24KLXsKLQliYWNrZ3JvdW5kOiAjZmZmZmNjOwotCWJvcmRlcjogdGhpbiBkb3VibGUgYmxhY2sKLX0KLQotcC5pYm10YWJsZWhlYWRpbmcKLXsKLQlmb250LXdlaWdodDogYm9sZDsKLSAgICAgICAgbWFyZ2luLWxlZnQ6IDAKLX0KLQotcC5pYm10YWJsZXRleHQKLXsKLSAgICAgICAgbWFyZ2luLWxlZnQ6IDAKLX0KLQotcC5pYm1wYXJhbW5hbWUKLXsKLSAgIHRleHQtYWxpZ246IGxlZnQKLX0KLQotcC5pYm1wYXJhbWV4YW1wbGUKLXsKLSAgIHRleHQtYWxpZ246IGxlZnQ7Ci0gICBjb2xvcjogcmVkCi19Ci0KLXAuaWJtcGFyYW1kZXNjcmlwdGlvbgotewotICAgdGV4dC1hbGlnbjogbGVmdAotfQotCi1vbC5pYm0KLXsKLSAgICAgICAgbWFyZ2luLWxlZnQ6ICs0NXB4Ci19Ci0KLW9sIG9sLmlibQotewotICAgICAgICBtYXJnaW4tbGVmdDogKzIzcHgKLX0KLQotb2wgb2wgb2wuaWJtCi17Ci0gICAgICAgIG1hcmdpbi1sZWZ0OiArMjNweAotfQotCi1vbC5pYm1hbHBoYQotewotCWxpc3Qtc3R5bGUtdHlwZTogbG93ZXItYWxwaGEKLX0KLQotCi0KLXVsIGxpLmlibQotewotICAgICAgICB0ZXh0LWluZGVudDogKzIwcHgKLQl0ZXh0LWFsaWduOiBqdXN0aWZ5Ci19Ci0KLQotdWwgdWwgbGkuaWJtCi17Ci0gICAgICAgIHRleHQtaW5kZW50OiArMTBweAotCSAgdGV4dC1hbGlnbjoganVzdGlmeQotfQotCi0KLXVsIHVsIHVsIGxpLmlibQotewotICAgICAgICB0ZXh0LWluZGVudDogKzEwcHgKLQkgIHRleHQtYWxpZ246IGp1c3RpZnkKLX0KLQotdWwgbGkuaWJtbm9kZQotewotICAgICAgICB0ZXh0LWluZGVudDogKzEwcHgKLQl0ZXh0LWFsaWduOiBqdXN0aWZ5Ci19Ci0KLXVsIGxpLmlibWNrCi17Ci0gICAgICAgIHRleHQtaW5kZW50OiArMTBweAotCXRleHQtYWxpZ246IGp1c3RpZnkKLX0KLQotCi11bCB1bCBsaS5pYm1jawotewotICAgICAgICB0ZXh0LWluZGVudDogKzEwcHgKLQl0ZXh0LWFsaWduOiBqdXN0aWZ5Ci19Ci0KLQotdWwgdWwgdWwgbGkuaWJtY2sKLXsKLSAgICAgICAgdGV4dC1pbmRlbnQ6ICsxMHB4Ci0JdGV4dC1hbGlnbjoganVzdGlmeQotfQotCi11bC5pYm1wbHVzCi17Ci0gICAgICAgIGxpc3Qtc3R5bGUtaW1hZ2U6IAotfQotCi11bC5pYm1taW51cwotewotICAgICAgICBsaXN0LXN0eWxlLWltYWdlOiAKLX0KLQotCi11bC5pYm1jawotewotCi19Ci0KLXRhYmxlLmlibQotewotfQotCi10ci5pYm0KLXsKLX0KLQotdGQuaWJtCi17Ci0gICAgICAgIHZlcnRpY2FsLWFsaWduOiB0b3AKLX0KLQotdGQgdWwuaWJtCi17Ci0gICAgICAgIG1hcmdpbi1sZWZ0OiArMjBweAotfQotCi1mb250LmlibXBhcmFtZXhhbXBsZQotewotICAgY29sb3I6IHJlZAotfQotCi1mb250LmlibWltYWdlZXhhbXBsZQotewotICAgZm9udC1zaXplOiBzbWFsbGVyCi19Ci0KLS8qdGhlIGZvbGxvd2luZyBpcyB1c2VkIGZvciByZWFsIHRpbWUgY29udGVudCovCi0KLWgxLnJlYWN0aXZlCi17Ci0gICAgICAgIGZvbnQtZmFtaWx5OiBBcmlhbCwgc2Fucy1zZXJpZjsKLX0KLSAgICAgICAgCi1oMS5yZWFjdGl2ZWJhbm5lcgotewotICAgICAgICAKLSAgICAgICAgdGV4dC1hbGlnbjogbGVmdDsKLSAgICAgICAgZm9udC1mYW1pbHk6IEFyaWFsLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogbGFyZ2U7Ci0JdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7Ci19Ci0KLWgyLnJlYWN0aXZlCi17Ci0gICAgICAgIGZvbnQtZmFtaWx5OiBBcmlhbCwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDE1MCU7Ci19Ci0gICAgICAgIAotaDIucmVhY3RpdmViYW5uZXIKLXsKLSAgICAgICAgdGV4dC1hbGlnbjogbGVmdDsKLSAgICAgICAgZm9udC1mYW1pbHk6IEFyaWFsLCBzYW5zLXNlcmlmOwotICAgICAgICBmb250LXNpemU6IDE1MCU7Ci0gICAgICAgIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOwotfQotCi1oMy5yZWFjdGl2ZQotewotICAgICAgICBmb250LWZhbWlseTogQXJpYWwsIHNhbnMtc2VyaWY7Ci19Ci0KLWg0LnJlYWN0aXZlLCBoNS5yZWFjdGl2ZSwgaDYucmVhY3RpdmUKLXsKLSAgICAgICAgZm9udC1mYW1pbHk6IEFyaWFsLCBzYW5zLXNlcmlmOwotICAgICAgICBtYXJnaW4tbGVmdDogMHB4Ci19Ci0KLWRsLnJlYWN0aXZlCi17Ci0JZm9udC1mYW1pbHk6IEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JIGZvbnQtc2l6ZTogMTBwdDsKLX0KLQotZHQucmVhY3RpdmUKLXsKLQlmb250LWZhbWlseTogQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQkgZm9udC1zaXplOiAxMHB0OwotfQotICAgICAgCi1kZC5yZWFjdGl2ZQotewotCWZvbnQtZmFtaWx5OiBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCSBmb250LXNpemU6IDEwcHQ7Ci19Ci0KLXAucmVhY3RpdmUKLXsKLQlmb250LWZhbWlseTogQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsKLSAgICAgICAgZm9udC1zaXplOiAxMHB0OwotICAgICAgICBtYXJnaW4tbGVmdDogMHB4Ci19Ci0KLXAucmVhY3RpdmVub2RlCi17Ci0gICAgICAgIG1hcmdpbi1sZWZ0OiAxNXB4Ci0gICAgICAgIGxlZnRNYXJnaW46IDE1cHgKLX0KLQotcC5yZWFjdGl2ZWV4YW1wbGVoZWFkaW5nCi17Ci0gICAgICAgIGZvbnQtZmFtaWx5OiBBcmlhbCwgc2Fucy1zZXJpZjsKLSAgICAgICAgZm9udC13ZWlnaHQ6IGJvbGQ7Ci0gICAgICAgIGZvbnQtc2l6ZTogMTBwdDsKLSAgICAgICAgbWFyZ2luLWxlZnQ6IDE1cHgKLX0KLQotcC5yZWFjdGl2ZWV4YW1wbGUKLXsKLQltYXJnaW4tbGVmdDogNzBweDsKLX0KLQotcC5yZWFjdGl2ZXBpY3R1cmV0ZXh0Ci17Ci0JdGV4dC1hbGlnbjogY2VudGVyOwotCWZvbnQtZmFtaWx5OiBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogODAlOwotICAgICAgICBtYXJnaW4tbGVmdDogNzBweDsKLSAgICAgICAgbWFyZ2luLXJpZ2h0OiA1MHB4Ci19Ci0KLXAucmVhY3RpdmVkZWZpbml0aW9uCi17Ci0JYmFja2dyb3VuZDogI2ZmZmZjYzsKLQlib3JkZXI6IHRoaW4gZG91YmxlIGJsYWNrCi19Ci0KLXAucmVhY3RpdmV0YWJsZWhlYWRpbmcKLXsKLQlmb250LXdlaWdodDogYm9sZDsKLSAgICAgICAgbWFyZ2luLWxlZnQ6IDAKLX0KLQotcC5yZWFjdGl2ZXRhYmxldGV4dAotewotICAgICAgICBtYXJnaW4tbGVmdDogMAotfQotCi1wLnJlYWN0aXZlcGFyYW1uYW1lCi17Ci0gICB0ZXh0LWFsaWduOiBsZWZ0Ci19Ci0KLXAucmVhY3RpdmVwYXJhbWV4YW1wbGUKLXsKLSAgIHRleHQtYWxpZ246IGxlZnQ7Ci0gICBjb2xvcjogcmVkCi19Ci0KLXAucmVhY3RpdmVwYXJhbWRlc2NyaXB0aW9uCi17Ci0gICB0ZXh0LWFsaWduOiBsZWZ0Ci19Ci0KLW9sLnJlYWN0aXZlCi17Ci0gICAgICAgIG1hcmdpbi1sZWZ0OiArNDVweAotfQotCi1vbCBvbC5yZWFjdGl2ZQotewotICAgICAgICBtYXJnaW4tbGVmdDogKzIzcHgKLX0KLQotb2wgb2wgb2wucmVhY3RpdmUKLXsKLSAgICAgICAgbWFyZ2luLWxlZnQ6ICsyM3B4Ci19Ci0KLW9sLnJlYWN0aXZlYWxwaGEKLXsKLQlsaXN0LXN0eWxlLXR5cGU6IGxvd2VyLWFscGhhCi19Ci0KLQotCi11bCBsaS5yZWFjdGl2ZQotewotCWZvbnQtZmFtaWx5OiBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotICAgICAgICBmb250LXNpemU6IDEwcHQ7Ci0gICAgICAgIHRleHQtaW5kZW50OiArMjBweAotCXRleHQtYWxpZ246IGp1c3RpZnkKLX0KLQotCi11bCB1bCBsaS5yZWFjdGl2ZQotewotCWZvbnQtZmFtaWx5OiBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotICAgICAgICBmb250LXNpemU6IDEwcHQ7Ci0gICAgICAgIHRleHQtaW5kZW50OiArMTBweAotCSAgdGV4dC1hbGlnbjoganVzdGlmeQotfQotCi0KLXVsIHVsIHVsIGxpLnJlYWN0aXZlCi17Ci0JZm9udC1mYW1pbHk6IEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0gICAgICAgIGZvbnQtc2l6ZTogMTBwdDsKLSAgICAgICAgdGV4dC1pbmRlbnQ6ICsxMHB4Ci0JICB0ZXh0LWFsaWduOiBqdXN0aWZ5Ci19Ci0KLXVsIGxpLnJlYWN0aXZlbm9kZQotewotICAgICAgICB0ZXh0LWluZGVudDogKzEwcHgKLQl0ZXh0LWFsaWduOiBqdXN0aWZ5Ci19Ci0KLXVsIGxpLnJlYWN0aXZlY2sKLXsKLSAgICAgICAgdGV4dC1pbmRlbnQ6ICsxMHB4Ci0JdGV4dC1hbGlnbjoganVzdGlmeQotfQotCi0KLXVsIHVsIGxpLnJlYWN0aXZlY2sKLXsKLSAgICAgICAgdGV4dC1pbmRlbnQ6ICsxMHB4Ci0JdGV4dC1hbGlnbjoganVzdGlmeQotfQotCi0KLXVsIHVsIHVsIGxpLnJlYWN0aXZlY2sKLXsKLSAgICAgICAgdGV4dC1pbmRlbnQ6ICsxMHB4Ci0JdGV4dC1hbGlnbjoganVzdGlmeQotfQotCi11bC5yZWFjdGl2ZXBsdXMKLXsKLSAgICAgICAgbGlzdC1zdHlsZS1pbWFnZTogCi19Ci0KLXVsLnJlYWN0aXZlbWludXMKLXsKLSAgICAgICAgbGlzdC1zdHlsZS1pbWFnZTogCi19Ci0KLQotdWwucmVhY3RpdmVjawotewotfQotCi10YWJsZS5yZWFjdGl2ZQotewotfQotCi10ci5yZWFjdGl2ZQotewotfQotCi10ZC5yZWFjdGl2ZQotewotICAgICAgICB2ZXJ0aWNhbC1hbGlnbjogdG9wCi19Ci0KLXRkIHVsLnJlYWN0aXZlCi17Ci0gICAgICAgIG1hcmdpbi1sZWZ0OiArMjBweAotfQotCi1mb250LnJlYWN0aXZlcGFyYW1leGFtcGxlCi17Ci0gICBjb2xvcjogcmVkCi19Ci0KLWZvbnQucmVhY3RpdmVpbWFnZWV4YW1wbGUKLXsKLSAgIGZvbnQtc2l6ZTogc21hbGxlcgotfQotCi0vKnRoZSBmb2xsb3dpbmcgaXMgdXNlZCBmb3IgTWljcm9zb2Z0IGNvbnRlbnQqLwotCi1oMS5tc2Z0Ci17Ci0gICAgICAgIGZvbnQtZmFtaWx5OiBBcmlhbCwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IGxhcmdlOwotfQotICAgICAgICAKLWgxLm1zZnRiYW5uZXIKLXsKLSAgICAgICAgdGV4dC1hbGlnbjogbGVmdDsKLSAgICAgICAgZm9udC1mYW1pbHk6IEFyaWFsLCBzYW5zLXNlcmlmOwotCSAgCSBmb250LXNpemU6IGxhcmdlOwotCSAgCSB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKLX0KLQotaDIubXNmdAotewotICAgICAgICAgICAgIGZvbnQtZmFtaWx5OiBBcmlhbCwgc2Fucy1zZXJpZjsKLSAgICAgICAgZm9udC1zaXplOiAxNTAlOwkKLX0KLSAgICAgICAgCi1oMi5tc2Z0YmFubmVyCi17Ci0gICAgIHRleHQtYWxpZ246IGxlZnQ7Ci0gICAgICAgIGZvbnQtZmFtaWx5OiBBcmlhbCwgc2Fucy1zZXJpZjsKLQkgZm9udC1zaXplOiAxNTAlOwotCSB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKLQkgIAkKLX0KLQotaDMubXNmdAotewotICAgICAgICBmb250LWZhbWlseTogQXJpYWwsIHNhbnMtc2VyaWY7Ci19Ci0KLWg0Lm1zZnQsIGg1Lm1zZnQsIGg2Lm1zZnQKLXsKLSAgICAgICAgZm9udC1mYW1pbHk6IEFyaWFsLCBzYW5zLXNlcmlmOwotICAgICAgICBtYXJnaW4tbGVmdDogMHB4Ci19Ci0KLWRsLm1zZnQKLXsKLQlmb250LWZhbWlseTogQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQkgZm9udC1zaXplOiAxMHB0OwotfQotCi1kdC5tc2Z0Ci17Ci0JZm9udC1mYW1pbHk6IEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JIGZvbnQtc2l6ZTogMTBwdDsKLX0KLSAgICAgIAotZGQubXNmdAotewotCWZvbnQtZmFtaWx5OiBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCSBmb250LXNpemU6IDEwcHQ7Ci19Ci0KLXAubXNmdAotewotCWZvbnQtZmFtaWx5OiBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCSBmb250LXNpemU6IDEwcHQ7Ci19Ci0KLXAubXNmdG5vZGUKLXsKLSAgICAgICAgbWFyZ2luLWxlZnQ6IDE1cHgKLSAgICAgICAgbGVmdE1hcmdpbjogMTVweAotfQotCi1wLm1zZnRleGFtcGxlaGVhZGluZwotewotICAgICAgICBmb250LWZhbWlseTogQXJpYWwsIHNhbnMtc2VyaWY7Ci0gICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkOwotICAgICAgICBmb250LXNpemU6IDEwcHQ7Ci0gICAgICAgIG1hcmdpbi1sZWZ0OiAxNXB4Ci19Ci0KLXAubXNmdGV4YW1wbGUKLXsKLQltYXJnaW4tbGVmdDogNzBweDsKLX0KLQotcC5tc2Z0cGljdHVyZXRleHQKLXsKLQl0ZXh0LWFsaWduOiBjZW50ZXI7Ci0JZm9udC1mYW1pbHk6IHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiA4MCU7Ci0gICAgICAgIG1hcmdpbi1sZWZ0OiA3MHB4OwotICAgICAgICBtYXJnaW4tcmlnaHQ6IDUwcHgKLX0KLQotcC5tc2Z0ZGVmaW5pdGlvbgotewotCWJhY2tncm91bmQ6ICNmZmZmY2M7Ci0JYm9yZGVyOiB0aGluIGRvdWJsZSBibGFjawotfQotCi1wLm1zZnR0YWJsZWhlYWRpbmcKLXsKLQlmb250LXdlaWdodDogYm9sZDsKLSAgICAgICAgbWFyZ2luLWxlZnQ6IDAKLX0KLQotcC5tc2Z0dGFibGV0ZXh0Ci17Ci0gICAgICAgIG1hcmdpbi1sZWZ0OiAwCi19Ci0KLXAubXNmdHBhcmFtbmFtZQotewotICAgdGV4dC1hbGlnbjogbGVmdAotfQotCi1wLm1zZnRwYXJhbWV4YW1wbGUKLXsKLSAgIHRleHQtYWxpZ246IGxlZnQ7Ci0gICBjb2xvcjogcmVkCi19Ci0KLXAubXNmdHBhcmFtZGVzY3JpcHRpb24KLXsKLSAgIHRleHQtYWxpZ246IGxlZnQKLX0KLQotb2wubXNmdAotewotICAgICAgICBtYXJnaW4tbGVmdDogKzQ1cHgKLX0KLQotb2wgb2wubXNmdAotewotICAgICAgICBtYXJnaW4tbGVmdDogKzIzcHgKLX0KLQotb2wgb2wgb2wubXNmdAotewotICAgICAgICBtYXJnaW4tbGVmdDogKzIzcHgKLX0KLQotb2wubXNmdGFscGhhCi17Ci0JbGlzdC1zdHlsZS10eXBlOiBsb3dlci1hbHBoYQotfQotCi0KLQotdWwgbGkubXNmdAotewotICAgICAgICB0ZXh0LWluZGVudDogKzIwcHgKLQl0ZXh0LWFsaWduOiBqdXN0aWZ5Ci19Ci0KLQotdWwgdWwgbGkubXNmdAotewotICAgICAgICB0ZXh0LWluZGVudDogKzEwcHgKLQkgIHRleHQtYWxpZ246IGp1c3RpZnkKLX0KLQotCi11bCB1bCB1bCBsaS5tc2Z0Ci17Ci0gICAgICAgIHRleHQtaW5kZW50OiArMTBweAotCSAgdGV4dC1hbGlnbjoganVzdGlmeQotfQotCi11bCBsaS5tc2Z0bm9kZQotewotICAgICAgICB0ZXh0LWluZGVudDogKzEwcHgKLQl0ZXh0LWFsaWduOiBqdXN0aWZ5Ci19Ci0KLXVsIGxpLm1zZnRjawotewotICAgICAgICB0ZXh0LWluZGVudDogKzEwcHgKLQl0ZXh0LWFsaWduOiBqdXN0aWZ5Ci19Ci0KLQotdWwgdWwgbGkubXNmdGNrCi17Ci0gICAgICAgIHRleHQtaW5kZW50OiArMTBweAotCXRleHQtYWxpZ246IGp1c3RpZnkKLX0KLQotCi11bCB1bCB1bCBsaS5tc2Z0Y2sKLXsKLSAgICAgICAgdGV4dC1pbmRlbnQ6ICsxMHB4Ci0JdGV4dC1hbGlnbjoganVzdGlmeQotfQotCi11bC5tc2Z0cGx1cwotewotICAgICAgICBsaXN0LXN0eWxlLWltYWdlOiAKLX0KLQotdWwubXNmdG1pbnVzCi17Ci0gICAgICAgIGxpc3Qtc3R5bGUtaW1hZ2U6IAotfQotCi0KLXVsLm1zZnRjawotewotfQotCi10YWJsZS5tc2Z0Ci17Ci19Ci0KLXRyLm1zZnQKLXsKLX0KLQotdGQubXNmdAotewotICAgICAgICB2ZXJ0aWNhbC1hbGlnbjogdG9wCi19Ci0KLXRkIHVsLm1zZnQKLXsKLSAgICAgICAgbWFyZ2luLWxlZnQ6ICsyMHB4Ci19Ci0KLWZvbnQubXNmdHBhcmFtZXhhbXBsZQotewotICAgY29sb3I6IHJlZAotfQotCi1mb250Lm1zZnRpbWFnZWV4YW1wbGUKLXsKLSAgIGZvbnQtc2l6ZTogc21hbGxlcgotfQotCi0vKnRoZSBmb2xsb3dpbmcgaXMgdXNlZCBmb3IgZGF0YWJhc2UgY29udGVudCovCi0KLWgxLmRibXMKLXsKLSAgICAgICAgZm9udC1mYW1pbHk6IEFyaWFsLCBzYW5zLXNlcmlmOwotfQotICAgICAgICAKLWgxLmRibXNiYW5uZXIKLXsKLSAgICAgICAgYmFja2dyb3VuZDogIzZhOGZiZDsKLSAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyOwotICAgICAgICBmb250LWZhbWlseTogQXJpYWwsIHNhbnMtc2VyaWY7Ci0JICBmb250LXNpemU6IGxhcmdlOwotfQotCi1oMi5kYm1zCi17Ci0gICAgICAgIGZvbnQtZmFtaWx5OiBBcmlhbCwgc2Fucy1zZXJpZjsKLX0KLSAgICAgICAgCi1oMi5kYm1zYmFubmVyCi17Ci0gICAgICAgIGJhY2tncm91bmQ6ICM2YThmYmQ7Ci0gICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjsKLSAgICAgICAgZm9udC1mYW1pbHk6IEFyaWFsLCBzYW5zLXNlcmlmOwotfQotCi1oMy5kYm1zCi17Ci0gICAgICAgIGZvbnQtZmFtaWx5OiBBcmlhbCwgc2Fucy1zZXJpZjsKLX0KLQotaDQuZGJtcywgaDUuZGJtcywgaDYuZGJtcwotewotICAgICAgICBmb250LWZhbWlseTogQXJpYWwsIHNhbnMtc2VyaWY7Ci0gICAgICAgIG1hcmdpbi1sZWZ0OiAwcHgKLX0KLQotZGwuZGJtcwotewotfQotCi1kdC5kYm1zCi17Ci19Ci0gICAgICAKLWRkLmRibXMKLXsKLX0KLQotcC5kYm1zCi17Ci0gICAgICAgIG1hcmdpbi1sZWZ0OiAwcHgKLX0KLQotcC5kYm1zbm9kZQotewotICAgICAgICBtYXJnaW4tbGVmdDogMTVweAotICAgICAgICBsZWZ0TWFyZ2luOiAxNXB4Ci19Ci0KLXAuZGJtc2V4YW1wbGVoZWFkaW5nCi17Ci0gICAgICAgIGZvbnQtZmFtaWx5OiBBcmlhbCwgc2Fucy1zZXJpZjsKLSAgICAgICAgZm9udC13ZWlnaHQ6IGJvbGQ7Ci0gICAgICAgIGZvbnQtc2l6ZTogMTBwdDsKLSAgICAgICAgbWFyZ2luLWxlZnQ6IDE1cHgKLX0KLQotcC5kYm1zZXhhbXBsZQotewotCW1hcmdpbi1sZWZ0OiA3MHB4OwotfQotCi1wLmRibXNwaWN0dXJldGV4dAotewotCXRleHQtYWxpZ246IGNlbnRlcjsKLQlmb250LWZhbWlseTogc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDgwJTsKLSAgICAgICAgbWFyZ2luLWxlZnQ6IDcwcHg7Ci0gICAgICAgIG1hcmdpbi1yaWdodDogNTBweAotfQotCi1wLmRibXNkZWZpbml0aW9uCi17Ci0JYmFja2dyb3VuZDogI2ZmZmZjYzsKLQlib3JkZXI6IHRoaW4gZG91YmxlIGJsYWNrCi19Ci0KLXAuZGJtc3RhYmxlaGVhZGluZwotewotCWZvbnQtd2VpZ2h0OiBib2xkOwotICAgICAgICBtYXJnaW4tbGVmdDogMAotfQotCi1wLmRibXN0YWJsZXRleHQKLXsKLSAgICAgICAgbWFyZ2luLWxlZnQ6IDAKLX0KLQotcC5kYm1zcGFyYW1uYW1lCi17Ci0gICB0ZXh0LWFsaWduOiBsZWZ0Ci19Ci0KLXAuZGJtc3BhcmFtZXhhbXBsZQotewotICAgdGV4dC1hbGlnbjogbGVmdDsKLSAgIGNvbG9yOiByZWQKLX0KLQotcC5kYm1zcGFyYW1kZXNjcmlwdGlvbgotewotICAgdGV4dC1hbGlnbjogbGVmdAotfQotCi1vbC5kYm1zCi17Ci0gICAgICAgIG1hcmdpbi1sZWZ0OiArNDVweAotfQotCi1vbCBvbC5kYm1zCi17Ci0gICAgICAgIG1hcmdpbi1sZWZ0OiArMjNweAotfQotCi1vbCBvbCBvbC5kYm1zCi17Ci0gICAgICAgIG1hcmdpbi1sZWZ0OiArMjNweAotfQotCi1vbC5kYm1zYWxwaGEKLXsKLQlsaXN0LXN0eWxlLXR5cGU6IGxvd2VyLWFscGhhCi19Ci0KLQotCi11bCBsaS5kYm1zCi17Ci0gICAgICAgIHRleHQtaW5kZW50OiArMjBweAotCXRleHQtYWxpZ246IGp1c3RpZnkKLX0KLQotCi11bCB1bCBsaS5kYm1zCi17Ci0gICAgICAgIHRleHQtaW5kZW50OiArMTBweAotCSAgdGV4dC1hbGlnbjoganVzdGlmeQotfQotCi0KLXVsIHVsIHVsIGxpLmRibXMKLXsKLSAgICAgICAgdGV4dC1pbmRlbnQ6ICsxMHB4Ci0JICB0ZXh0LWFsaWduOiBqdXN0aWZ5Ci19Ci0KLXVsIGxpLmRibXNub2RlCi17Ci0gICAgICAgIHRleHQtaW5kZW50OiArMTBweAotCXRleHQtYWxpZ246IGp1c3RpZnkKLX0KLQotdWwgbGkuZGJtc2NrCi17Ci0gICAgICAgIHRleHQtaW5kZW50OiArMTBweAotCXRleHQtYWxpZ246IGp1c3RpZnkKLX0KLQotCi11bCB1bCBsaS5kYm1zY2sKLXsKLSAgICAgICAgdGV4dC1pbmRlbnQ6ICsxMHB4Ci0JdGV4dC1hbGlnbjoganVzdGlmeQotfQotCi0KLXVsIHVsIHVsIGxpLmRibXNjawotewotICAgICAgICB0ZXh0LWluZGVudDogKzEwcHgKLQl0ZXh0LWFsaWduOiBqdXN0aWZ5Ci19Ci0KLXVsLmRibXNwbHVzCi17Ci0gICAgICAgIGxpc3Qtc3R5bGUtaW1hZ2U6IAotfQotCi11bC5kYm1zbWludXMKLXsKLSAgICAgICAgbGlzdC1zdHlsZS1pbWFnZTogCi19Ci0KLQotdWwuZGJtc2NrCi17Ci19Ci0KLXRhYmxlLmRibXMKLXsKLX0KLQotdHIuZGJtcwotewotfQotCi10ZC5kYm1zCi17Ci0gICAgICAgIHZlcnRpY2FsLWFsaWduOiB0b3AKLX0KLQotdGQgdWwuZGJtcwotewotICAgICAgICBtYXJnaW4tbGVmdDogKzIwcHgKLX0KLQotZm9udC5kYm1zcGFyYW1leGFtcGxlCi17Ci0gICBjb2xvcjogcmVkCi19Ci0KLWZvbnQuZGJtc2ltYWdlZXhhbXBsZQotewotICAgZm9udC1zaXplOiBzbWFsbGVyCi19Ci0KLS8qdGhlIGZvbGxvd2luZyBpcyB1c2VkIGZvciBsYXJnZS1zY2FsZSBkZXZlbG9wbWVudCBjb250ZW50Ki8KLQotaDEubGFyZ2UKLXsKLSAgICAgICAgZm9udC1mYW1pbHk6IEFyaWFsLCBzYW5zLXNlcmlmOwotfQotICAgICAgICAKLWgxLmxhcmdlYmFubmVyCi17Ci0gICAgICAgIGJhY2tncm91bmQ6ICM2YThmYmQ7Ci0gICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjsKLSAgICAgICAgZm9udC1mYW1pbHk6IEFyaWFsLCBzYW5zLXNlcmlmOwotCSAgZm9udC1zaXplOiBsYXJnZTsKLX0KLQotaDIubGFyZ2UKLXsKLSAgICAgICAgZm9udC1mYW1pbHk6IEFyaWFsLCBzYW5zLXNlcmlmOwotfQotICAgICAgICAKLWgyLmxhcmdlYmFubmVyCi17Ci0gICAgICAgIGJhY2tncm91bmQ6ICM2YThmYmQ7Ci0gICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjsKLSAgICAgICAgZm9udC1mYW1pbHk6IEFyaWFsLCBzYW5zLXNlcmlmOwotfQotCi1oMy5sYXJnZQotewotICAgICAgICBmb250LWZhbWlseTogQXJpYWwsIHNhbnMtc2VyaWY7Ci19Ci0KLWg0LmxhcmdlLCBoNS5sYXJnZSwgaDYubGFyZ2UKLXsKLSAgICAgICAgZm9udC1mYW1pbHk6IEFyaWFsLCBzYW5zLXNlcmlmOwotICAgICAgICBtYXJnaW4tbGVmdDogMHB4Ci19Ci0KLWRsLmxhcmdlCi17Ci19Ci0KLWR0LmxhcmdlCi17Ci19Ci0gICAgICAKLWRkLmxhcmdlCi17Ci19Ci0KLXAubGFyZ2UKLXsKLSAgICAgICAgbWFyZ2luLWxlZnQ6IDBweAotfQotCi1wLmxhcmdlbm9kZQotewotICAgICAgICBtYXJnaW4tbGVmdDogMTVweAotICAgICAgICBsZWZ0TWFyZ2luOiAxNXB4Ci19Ci0KLXAubGFyZ2VleGFtcGxlaGVhZGluZwotewotICAgICAgICBmb250LWZhbWlseTogQXJpYWwsIHNhbnMtc2VyaWY7Ci0gICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkOwotICAgICAgICBmb250LXNpemU6IDEwcHQ7Ci0gICAgICAgIG1hcmdpbi1sZWZ0OiAxNXB4Ci19Ci0KLXAubGFyZ2VleGFtcGxlCi17Ci0JbWFyZ2luLWxlZnQ6IDcwcHg7Ci19Ci0KLXAubGFyZ2VwaWN0dXJldGV4dAotewotCXRleHQtYWxpZ246IGNlbnRlcjsKLQlmb250LWZhbWlseTogc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDgwJTsKLSAgICAgICAgbWFyZ2luLWxlZnQ6IDcwcHg7Ci0gICAgICAgIG1hcmdpbi1yaWdodDogNTBweAotfQotCi1wLmxhcmdlZGVmaW5pdGlvbgotewotCWJhY2tncm91bmQ6ICNmZmZmY2M7Ci0JYm9yZGVyOiB0aGluIGRvdWJsZSBibGFjawotfQotCi1wLmxhcmdldGFibGVoZWFkaW5nCi17Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci0gICAgICAgIG1hcmdpbi1sZWZ0OiAwCi19Ci0KLXAubGFyZ2V0YWJsZXRleHQKLXsKLSAgICAgICAgbWFyZ2luLWxlZnQ6IDAKLX0KLQotcC5sYXJnZXBhcmFtbmFtZQotewotICAgdGV4dC1hbGlnbjogbGVmdAotfQotCi1wLmxhcmdlcGFyYW1leGFtcGxlCi17Ci0gICB0ZXh0LWFsaWduOiBsZWZ0OwotICAgY29sb3I6IHJlZAotfQotCi1wLmxhcmdlcGFyYW1kZXNjcmlwdGlvbgotewotICAgdGV4dC1hbGlnbjogbGVmdAotfQotCi1vbC5sYXJnZQotewotICAgICAgICBtYXJnaW4tbGVmdDogKzQ1cHgKLX0KLQotb2wgb2wubGFyZ2UKLXsKLSAgICAgICAgbWFyZ2luLWxlZnQ6ICsyM3B4Ci19Ci0KLW9sIG9sIG9sLmxhcmdlCi17Ci0gICAgICAgIG1hcmdpbi1sZWZ0OiArMjNweAotfQotCi1vbC5sYXJnZWFscGhhCi17Ci0JbGlzdC1zdHlsZS10eXBlOiBsb3dlci1hbHBoYQotfQotCi0KLQotdWwgbGkubGFyZ2UKLXsKLSAgICB0ZXh0LWluZGVudDogKzIwcHg7Ci0JdGV4dC1hbGlnbjoganVzdGlmeQotfQotCi0KLXVsIHVsIGxpLmxhcmdlCi17Ci0gICAgdGV4dC1pbmRlbnQ6ICsxMHB4OwotCXRleHQtYWxpZ246IGp1c3RpZnkKLX0KLQotCi11bCB1bCB1bCBsaS5sYXJnZQotewotICAgIHRleHQtaW5kZW50OiArMTBweDsKLQl0ZXh0LWFsaWduOiBqdXN0aWZ5Ci19Ci0KLXVsIGxpLmxhcmdlbm9kZQotewotICAgIHRleHQtaW5kZW50OiArMTBweDsKLQl0ZXh0LWFsaWduOiBqdXN0aWZ5Ci19Ci0KLXVsIGxpLmxhcmdlY2sKLXsKLSAgICB0ZXh0LWluZGVudDogKzEwcHg7Ci0JdGV4dC1hbGlnbjoganVzdGlmeQotfQotCi0KLXVsIHVsIGxpLmxhcmdlY2sKLXsKLSAgICB0ZXh0LWluZGVudDogKzEwcHg7Ci0JdGV4dC1hbGlnbjoganVzdGlmeQotfQotCi0KLXVsIHVsIHVsIGxpLmxhcmdlY2sKLXsKLSAgICB0ZXh0LWluZGVudDogKzEwcHg7Ci0JdGV4dC1hbGlnbjoganVzdGlmeQotfQotCi11bC5sYXJnZXBsdXMKLXsKLSAgICBsaXN0LXN0eWxlLWltYWdlOiAKLX0KLQotdWwubGFyZ2VtaW51cwotewotICAgIGxpc3Qtc3R5bGUtaW1hZ2U6IAotfQotCi0KLXVsLmxhcmdlY2sKLXsKLX0KLQotdGFibGUubGFyZ2UKLXsKLX0KLQotdHIubGFyZ2UKLXsKLX0KLQotdGQubGFyZ2UKLXsKLSAgICAgICAgdmVydGljYWwtYWxpZ246IHRvcAotfQotCi10ZCB1bC5sYXJnZQotewotICAgICAgICBtYXJnaW4tbGVmdDogKzIwcHgKLX0KLQotZm9udC5sYXJnZXBhcmFtZXhhbXBsZQotewotICAgY29sb3I6IHJlZAotfQotCi1mb250LmxhcmdlaW1hZ2VleGFtcGxlCi17Ci0gICBmb250LXNpemU6IHNtYWxsZXIKLX0KLQotcnB3Ci17Ci0gIGNvbG9yOiAjMDAwMDY2Ci19Ci0KLXJwdy5wcm9jZXNzX2NvbXBvbmVudAotewotICBjb2xvcjogZ3JlZW4KLX0KLQotcnB3LnByb2Nlc3NfY29tcG9uZW50LnJlbW92ZV90ZXh0Ci17Ci0gIGNvbG9yOiBncmVlbjsKLSAgYmFja2dyb3VuZC1jb2xvcjogI0NDQ0NDQzsKLSAgdGV4dC1kZWNvcmF0aW9uOiBsaW5lLXRocm91Z2gKLX0KLS8qd2FzIGNvbG9yOiAjRkZDQzk5Ki8gCi0KLXJwdy5yZW1vdmVfdGV4dAotewotICBjb2xvcjogZ3JlZW47Ci0gIGJhY2tncm91bmQtY29sb3I6ICNDQ0NDQ0M7Ci0gIHRleHQtZGVjb3JhdGlvbjogbGluZS10aHJvdWdoCi19Ci0KLXJwdy5wbHVnaW5fcHJvY2Vzc19jb21wb25lbnQKLXsKLSAgY29sb3I6IHJlZAotfQotCi1ycHcucGx1Z2luX3JlbW92ZV90ZXh0Ci17Ci0gIGNvbG9yOiByZWQ7Ci0gIGJhY2tncm91bmQtY29sb3I6ICNDQ0NDQ0M7Ci0gIHRleHQtZGVjb3JhdGlvbjogbGluZS10aHJvdWdoCi19Ci0KLXJwdy5ycHdfY29tbWVudAotewotICBjb2xvcjogZ3JheTsKLSAgZm9udC1zdHlsZTogb2JsaXF1ZQotfQotCi0KLXJwdy5tc2Z0Ci17Ci0gIGNvbG9yOiBibHVlCi19Ci0KLXJwdy5pYm0KLXsKLSAgY29sb3I6IGJsdWUKLX0KLQotcnB3LnJlYWN0aXZlCi17Ci0gIGNvbG9yOiByZWQKLX0KLQotcnB3LmJ1c21vZAotewotICBjb2xvcjogcmVkCi19Ci0KLXJwdy5ydXBfcnRfZGVzaWduCi17Ci0gIGNvbG9yOiBncmVlbgotfQotCi1ycHcucnVwX2RiX2Rlc2lnbgotewotICBjb2xvcjogZ3JlZW4KLX0KLQotcnB3LnJ1cF9ndWlfZGVzaWduCi17Ci0gIGNvbG9yOiBncmVlbgotfQotCi0uaG90dGV4dAotewkKLQljb2xvcjogIzAwMDAwMDsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDEwcHg7Ci0JdGV4dC1kZWNvcmF0aW9uOm5vbmU7Ci19Ci1hLmhvdHRleHQ6bGluayAKLXsgCi0JY29sb3I6ICMwMDAwMDA7Ci0JdGV4dC1kZWNvcmF0aW9uOm5vbmU7IAotfQotCi1hLmhvdHRleHQ6dmlzaXRlZCAKLXsgCi0JY29sb3I6ICMwMDAwMDA7Ci0JdGV4dC1kZWNvcmF0aW9uOm5vbmU7IAotfQotCi1hLmhvdHRleHQ6aG92ZXIgCi17IAotCWNvbG9yOiAjMDAwMDAwOwotCXRleHQtZGVjb3JhdGlvbjpub25lOyAKLX0KLQotYS5ob3R0ZXh0OmFjdGl2ZQoteyAKLQljb2xvcjogIzAwMDAwMDsKLQl0ZXh0LWRlY29yYXRpb246bm9uZTsgCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L3NjcmlwdHMvY29tbW9uLmpzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9zY3JpcHRzL2NvbW1vbi5qcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWFjYWNiNS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L3NjcmlwdHMvY29tbW9uLmpzCisrKyAvZGV2L251bGwKQEAgLTEsNDk0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8gCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi12YXIgZ2xvYmFsTGF5ZXIgPSAiIjsKLQotLy9mb3IgcG9wdXAgc3VibWVudSB3aXRoIHJlZCBhcnJvd3MKLXZhciBjaGVja2VkID0gZmFsc2U7Ci0KLS8qIEJyb3dzZXIgc2Vuc2luZyAqLwotLyogU2V0IHVwIGJvb2xpYW4gdmFyaWFibGVzIHRvIHJlY29yZCB0aGUgYnJvd3NlciB0eXBlICovCi12YXIgaXNOUzQgPSAwOwotdmFyIGlzSUU0ID0gMDsKLXZhciBpc05ldyA9IDA7Ci12YXIgZG9jT2JqLCBzdHlsZU9iaiwgY3Vyck9iaiwgbGF5T24sIGxheU9mZiwgZG9tOwotLyogRGV0ZXJtaW5lcyB0aGUgYnJvd3NlciBuYW1lIGFuZCBicm93c2VyIHZlcnNpb24gKi8KLXZhciBicm93ID0gKChuYXZpZ2F0b3IuYXBwTmFtZSkgKyAocGFyc2VJbnQobmF2aWdhdG9yLmFwcFZlcnNpb24pKSk7Ci0vKiByZWFzc2lnbiB2YXJpYWJsZSBkZXBlbmRpbmcgb24gdGhlIGJyb3dzZXIgKi8KLQotCi0KLS8vY2FwdHVyZSBldmVudAotTlM0ID0gKGRvY3VtZW50LmNhcHR1cmVFdmVudHMpOwotaWYgKE5TNCkgeyBkb2N1bWVudC5jYXB0dXJlRXZlbnRzKEV2ZW50Lk1PVVNFRE9XTik7IH0KLWRvY3VtZW50Lm9ubW91c2Vkb3duID0gZG9BY2Nlc3NLZXlzOwkKLQotCi0KLWlmIChwYXJzZUludChuYXZpZ2F0b3IuYXBwVmVyc2lvbiA+PSA1KSkge2lzTmV3ID0gMX0KLQllbHNlIGlmIChicm93ID09ICJOZXRzY2FwZTQiKSAKLQl7aXNOUzQgPSAxO30KLQkJZWxzZSBpZiAoYnJvdyA9PSAiTWljcm9zb2Z0IEludGVybmV0IEV4cGxvcmVyNCIpIAotCQl7aXNJRTQgPSAxO30KLQkJCQkKLWlmIChpc05TNHx8aXNJRTR8fGlzTmV3KSB7Ci0JZG9jT2JqID0gKGlzTlM0KSA/ICdkb2N1bWVudCcgOiAnZG9jdW1lbnQuYWxsJzsKLQlzdHlsZU9iaiA9IChpc05TNCkgPyAnJyA6ICcuc3R5bGUnOwotCX0KLQotCi0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vL1NOSUZGRVIgQkVHSU5TIEhFUkUvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLXZhciBjPScuY3NzIiAvPic7Ci12YXIgbD0nPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi9zdHlsZXNoZWV0cy8nOwotCi0vL1NuaWZmZXIgdmFyaWFibGVzIGJlZ2lucwotLy9jb252ZXJ0aW5nIHRvIGxvd2VyY2FzZQotdmFyIHNubiA9IG5hdmlnYXRvcjsKLXZhciBzbnBsID0gc25uLnBsYXRmb3JtLnRvTG93ZXJDYXNlKCk7IC8vIG5vdCBzdXBwb3J0ZWQgaW4gTlMzLjAKLXZhciBzbnVhID0gJyAnICsgc25uLnVzZXJBZ2VudC50b0xvd2VyQ2FzZSgpOwotdmFyIHNudW4gPSBzbm4uYXBwTmFtZS50b0xvd2VyQ2FzZSgpOwotCi0vLyBwbGF0Zm9ybQotdmFyIHNudnBsX21hYyA9IHNudWEuaW5kZXhPZignbWFjJykgPiAwOwotdmFyIHNudnBsX3VuaXggPSBzbnVhLmluZGV4T2YoIngxMSIpID4gMDsKLXZhciBzbnZwbF93aW4gPSBzbnVhLmluZGV4T2YoJ3dpbicpID4gMDsKLQotLy8gYnJvd3NlciB2ZXJzaW9uCi12YXIgc252dl9pZSA9IHNudWEuaW5kZXhPZignbXNpZScpID4gMDsKLXZhciBzbnZ2X25uID0gc251YS5pbmRleE9mKCdtb3ppbGxhJykgPiAwOwotdmFyIHNudnZlcnNpb24gPSBzbm4uYXBwVmVyc2lvbjsKLQotCi0vLyAnY29tcGF0aWJsZScgdmVyc2lvbnMgb2YgIm1vemlsbGEiIGFyZW4ndCBuYXZpZ2F0b3IKLWlmKHNudWEuaW5kZXhPZignY29tcGF0aWJsZScpID4gMCkgewotCXNubnZ2X25uID0gZmFsc2U7Ci19Ci0vL0VuZHMgc25pZmZlciB2YXJpYWJsZXMgCi0JCi0JCQotLyogVGhpcyBpcyBhIGJhc2ljIHNuaWZmZXIgKi8KLSAgCi1pZihzbnZwbF93aW4pLy93aW5kb3dzCi0KLXsgIAotICBpZihzbnZ2X2llKSAgICAKLSAgewotICAgIGlmIChzbnVhLmluZGV4T2YoJ2llIDUnKSE9LTEpZG9jdW1lbnQud3JpdGUobCsnY29tbW9uX2Jhc2UnK2MpOwotICAgIGVsc2UgaWYoc251YS5pbmRleE9mKCdpZSA1LjUnKSE9LTEpZG9jdW1lbnQud3JpdGUobCsnY29tbW9uX2Jhc2UnK2MpOwotICAgIGVsc2UgaWYoc251YS5pbmRleE9mKCdpZSA2JykhPS0xKWRvY3VtZW50LndyaXRlKGwrJ2NvbW1vbl9hZHYnK2MpOwotICAgIGVsc2UKLQkgIHsKLQkgICAgZG9jdW1lbnQud3JpdGUobCsnY29tbW9uX2FkdicrYyk7Ci0JICB9Ci0gIH0KLSAgZWxzZSBpZiAoc252dl9ubikgCi0gIHsKLSAgCi0gIGlmIChzbnVhLmluZGV4T2YoIi80IikhPS0xKWRvY3VtZW50LndyaXRlKGwrJ2NvbW1vbl9iYXNlJytjKTsKLSAgZWxzZSBpZihzbnVhLmluZGV4T2YoIi81IikhPS0xKWRvY3VtZW50LndyaXRlKGwrJ2NvbW1vbl9hZHYnK2MpOwotICBlbHNlIGlmKHNudWEuaW5kZXhPZigiLzYiKSE9LTEpZG9jdW1lbnQud3JpdGUobCsnY29tbW9uX2FkdicrYyk7Ci0gIGVsc2UKLQkgIHsKLQkgICBkb2N1bWVudC53cml0ZShsKydjb21tb25fYWR2JytjKTsKLQkgIH0KLSAgfQotICBlbHNlCi0gIHsKLSAgIGRvY3VtZW50LndyaXRlKGwrJ2NvbW1vbl9hZHYnK2MpOwotICB9Ci19Ci1lbHNlIGlmKHNudnBsX3VuaXgpLy91bml4Ci0gIHsgIAotICBpZihzbnZ2X2llKSAgICAKLSAgewotICAgIGlmIChzbnVhLmluZGV4T2YoJ2llIDUnKSE9LTEpZG9jdW1lbnQud3JpdGUobCsnY29tbW9uX2Jhc2VVTlgnK2MpOwotICAgIGVsc2UgaWYoc251YS5pbmRleE9mKCdpZSA1LjUnKSE9LTEpZG9jdW1lbnQud3JpdGUobCsnY29tbW9uX2Jhc2VVTlgnK2MpOwotICAgIGVsc2UgaWYoc251YS5pbmRleE9mKCdpZSA2JykhPS0xKWRvY3VtZW50LndyaXRlKGwrJ2NvbW1vbl9hZHZVTlgnK2MpOwotICAgIGVsc2UKLQkgIHsKLQkgIGRvY3VtZW50LndyaXRlKGwrJ2NvbW1vbl9hZHYnK2MpOwotCSAgfQotICB9Ci0KLSAgZWxzZSBpZiAoc252dl9ubikgCi0gIHsKLSAgaWYgKHNudWEuaW5kZXhPZigiLzQiKSE9LTEpZG9jdW1lbnQud3JpdGUobCsnY29tbW9uX2Jhc2VVTlgnK2MpOwotICBlbHNlIGlmKHNudWEuaW5kZXhPZigiLzUiKSE9LTEpZG9jdW1lbnQud3JpdGUobCsnY29tbW9uX2FkdlVOWCcrYyk7Ci0gIGVsc2UgaWYoc251YS5pbmRleE9mKCIvNiIpIT0tMSlkb2N1bWVudC53cml0ZShsKydjb21tb25fYWR2VU5YJytjKTsKLSAgZWxzZQotCSAgewotCSAgZG9jdW1lbnQud3JpdGUobCsnY29tbW9uX2FkdlVOWCcrYyk7Ci0JICB9Ci0gIH0gCi0gIGVsc2UKLSAgewotICBkb2N1bWVudC53cml0ZShsKydjb21tb25fYWR2VU5YJytjKTsKLSAgfQotfQotCi1lbHNlIGlmKHNudnBsX21hYykvL21hYwotICB7ICAKLSAgaWYoc252dl9pZSkgICAgCi0gIHsKLSAgICBpZiAoc251YS5pbmRleE9mKCdpZSA1JykhPS0xKWRvY3VtZW50LndyaXRlKGwrJ2NvbW1vbl9iYXNlJytjKTsKLSAgICBlbHNlIGlmKHNudWEuaW5kZXhPZignaWUgNS41JykhPS0xKWRvY3VtZW50LndyaXRlKGwrJ2NvbW1vbl9iYXNlJytjKTsKLSAgICBlbHNlIGlmKHNudWEuaW5kZXhPZignaWUgNicpIT0tMSlkb2N1bWVudC53cml0ZShsKydjb21tb25fYWR2JytjKTsKLSAgICBlbHNlCi0JICB7Ci0JICAgZG9jdW1lbnQud3JpdGUobCsnY29tbW9uX2FkdicrYyk7Ci0JICB9Ci0gIH0KLQotICBlbHNlIGlmIChzbnZ2X25uKSAKLSAgewotICBpZiAoc251YS5pbmRleE9mKCIvNCIpIT0tMSlkb2N1bWVudC53cml0ZShsKydjb21tb25fYmFzZScrYyk7Ci0gIGVsc2UgaWYoc251YS5pbmRleE9mKCIvNiIpIT0tMSlkb2N1bWVudC53cml0ZShsKydjb21tb25fYWR2TWFjJytjKTsKLSAgZWxzZQotCSAgewotCSAgIGRvY3VtZW50LndyaXRlKGwrJ2NvbW1vbl9hZHYnK2MpOwotCSAgfQotICB9IAotICBlbHNlCi0gIHsKLSBkb2N1bWVudC53cml0ZShsKydjb21tb25fYWR2JytjKTsKLSAgfQotfQotCi1lbHNlLy9vdGhlcnMgCi17Ci0gIGRvY3VtZW50LndyaXRlKGwrJ2NvbW1vbl9hZHYnK2MpOwotCi19Ci0KLS8vU05JRkZFUiBFTkRTIEhFUkUKLQotCi1mdW5jdGlvbiBuc19yZWxvYWQoaW5pdCkgeyAgLy9yZWxvYWRzIHRoZSB3aW5kb3cgaWYgTmF2NCByZXNpemVkCi0gIGlmIChpbml0PT10cnVlKSB3aXRoIChuYXZpZ2F0b3IpIHtpZiAoKGFwcE5hbWU9PSJOZXRzY2FwZSIpJiYocGFyc2VJbnQoYXBwVmVyc2lvbik9PTQpKSB7Ci0gICAgZG9jdW1lbnQuTlNXPWlubmVyV2lkdGg7IGRvY3VtZW50Lk5TSD1pbm5lckhlaWdodDsgb25yZXNpemU9bnNfcmVsb2FkOyB9fQotICBlbHNlIGlmIChpbm5lcldpZHRoIT1kb2N1bWVudC5OU1cgfHwgaW5uZXJIZWlnaHQhPWRvY3VtZW50Lk5TSCkgbG9jYXRpb24ucmVsb2FkKCk7Ci19Ci1uc19yZWxvYWQodHJ1ZSk7Ci0KLQotCi0KLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9TTklGRkVSIEVORFMgSEVSRS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi0KLS8vbG9vcCB0byBjaGFuZ2UgYmFja2dyb3VuZCBjb2xvciBmb3IgaWUKLWZ1bmN0aW9uIGJjb2xvcihiY29sLGRfbmFtZSkKLXsKLWlmIChkb2N1bWVudC5hbGwpCi17Ci0gdmFyIHRoZXN0eWxlPSBldmFsICgnZG9jdW1lbnQuYWxsLicrZF9uYW1lKycuc3R5bGUnKTsKLSB0aGVzdHlsZS5iYWNrZ3JvdW5kQ29sb3I9YmNvbDsKLSB9Ci19Ci0KLS8vIG5ldyBwYWdlIHRvIGxvYWQgaW4gZnJhbWUKLWZ1bmN0aW9uIGNoYW5nZWZyYW1lKHVybCkgewotdG9wLmNoZWNraW5ib3R0b20ubG9jYXRpb24uaHJlZj0gdXJsIAotfQotCi0vLyBjaGVja2VkIGFsbCBjaGVja2JveGVzCi1mdW5jdGlvbiBjaGVja0FsbChmaWVsZCkgewotICAgICBpZiAoIWNoZWNrZWQpIHsgLy8gaWYgY2hlY2tib3hlcyBhcmUgbm90IGNoZWNrZWQgdGhlbiBjaGVjayB0aGVtCi0gICAgICAgICAgZm9yIChpID0gMDsgaSA8IGZpZWxkLmxlbmd0aDsgaSsrKSB7IC8vIGxvb3AgdGhyb3VnaCB0aGUgYXJyYXkgb2YgY2hlY2tib3hlcyAmIGNoZWNrIHRoZW0KLSAgICAgICAgICAgICAgIGZpZWxkW2ldLmNoZWNrZWQgPSB0cnVlOwotICAgICAgICAgIH0KLSAgICAgICAgICBjaGVja2VkID0gdHJ1ZTsKLSAgICAgfQotfSAKLQotZnVuY3Rpb24gY2hlY2tlZEluKGlkKSB7Ci0gIGlmIChkb2N1bWVudC5hbGwpIHsKLSAgICByZXR1cm4gZG9jdW1lbnQuYWxsW2lkXS5zdHlsZTsKLSAgfSBlbHNlIGlmKGRvY3VtZW50LmxheWVycykgewotICAgIHJldHVybiBkb2N1bWVudC5sYXllcnNbaWRdOwotICB9Ci19Ci0KLS8vIEZvciBJRSBPbmx5OiB0byBlbmFibGUgbGlua2luZyBiZWZvcmUgcG9wLXVwcyBkaXNzYXBwZWFyIHdoZW4gY2xpY2tlZC4KLWZ1bmN0aW9uIGRpc2FibGVjYXB0dXJlKCkgewotZG9jdW1lbnQub25tb3VzZWRvd24gPSBudWxsOwotfQotCi0KLS8vIGhpZGUgbGF5ZXJzIHdoZW4gY2xpY2tlZAotZnVuY3Rpb24gZG9BY2Nlc3NLZXlzKGV2KSB7Ci0JaWYoZ2xvYmFsTGF5ZXIgIT0gIiIpIHsKLQkJaWYoZG9jdW1lbnQubGF5ZXJzKSB7IGRvY3VtZW50LmxheWVyc1tnbG9iYWxMYXllcl0udmlzaWJpbGl0eSA9ICJoaWRkZW4iOyB9CQotCQllbHNlIHsgZG9jdW1lbnQuYWxsW2dsb2JhbExheWVyXS5zdHlsZS52aXNpYmlsaXR5ID0gImhpZGRlbiI7IH0KLQl9Ci19Ci0KLQotCi0vL2FsbG93cyB0d28gYm90dG9tIGZyYW1lcyB0byBsaW5rIHRvIG5ldyBwYWdlcyBhdCB0aGUgc2FtZSB0aW1lCi1mdW5jdGlvbiBmcmFtZWRpcmVjdCgpIHsKLXBhZ2UgPSBkb2N1bWVudC5mb3JtVG9wZnJhbWUubmV3TG9jYXRpb24ub3B0aW9uc1tkb2N1bWVudC5mb3JtVG9wZnJhbWUubmV3TG9jYXRpb24uc2VsZWN0ZWRJbmRleF0udmFsdWU7Ci10ZW1wSW5kZXggPSBwYWdlLmluZGV4T2YoJz8nKTsKLWZpcnN0VVJMID0gcGFnZS5zdWJzdHJpbmcoMCx0ZW1wSW5kZXgpOwotc2Vjb25kVVJMID0gcGFnZS5zdWJzdHJpbmcodGVtcEluZGV4ICsgMSxwYWdlLmxlbmd0aCk7Ci0KLXRvcC50cmVlRnJhbWUubG9jYXRpb24uaHJlZiA9IGZpcnN0VVJMOwotdG9wLnZpZXdGcmFtZS5sb2NhdGlvbi5ocmVmID0gc2Vjb25kVVJMOwotfQotCi0KLWZ1bmN0aW9uIE1NX3JlbG9hZFBhZ2UoaW5pdCkgeyAgLy9yZWxvYWRzIHRoZSB3aW5kb3cgaWYgTmF2NCByZXNpemVkCi0gIGlmIChpbml0PT10cnVlKSB3aXRoIChuYXZpZ2F0b3IpIHtpZiAoKGFwcE5hbWU9PSJOZXRzY2FwZSIpJiYocGFyc2VJbnQoYXBwVmVyc2lvbik9PTQpKSB7Ci0gICAgZG9jdW1lbnQuTU1fcGdXPWlubmVyV2lkdGg7IGRvY3VtZW50Lk1NX3BnSD1pbm5lckhlaWdodDsgb25yZXNpemU9TU1fcmVsb2FkUGFnZTsgfX0KLSAgZWxzZSBpZiAoaW5uZXJXaWR0aCE9ZG9jdW1lbnQuTU1fcGdXIHx8IGlubmVySGVpZ2h0IT1kb2N1bWVudC5NTV9wZ0gpIGxvY2F0aW9uLnJlbG9hZCgpOwotfQotTU1fcmVsb2FkUGFnZSh0cnVlKTsKLQotCi1mdW5jdGlvbiBNTV9maW5kT2JqKG4sIGQpIHsgLy92NC4wMQotICB2YXIgcCxpLHg7ICBpZighZCkgZD1kb2N1bWVudDsgaWYoKHA9bi5pbmRleE9mKCI/IikpPjAmJnBhcmVudC5mcmFtZXMubGVuZ3RoKSB7Ci0gICAgZD1wYXJlbnQuZnJhbWVzW24uc3Vic3RyaW5nKHArMSldLmRvY3VtZW50OyBuPW4uc3Vic3RyaW5nKDAscCk7fQotICBpZighKHg9ZFtuXSkmJmQuYWxsKSB4PWQuYWxsW25dOyBmb3IgKGk9MDsheCYmaTxkLmZvcm1zLmxlbmd0aDtpKyspIHg9ZC5mb3Jtc1tpXVtuXTsKLSAgZm9yKGk9MDsheCYmZC5sYXllcnMmJmk8ZC5sYXllcnMubGVuZ3RoO2krKykgeD1NTV9maW5kT2JqKG4sZC5sYXllcnNbaV0uZG9jdW1lbnQpOwotICBpZigheCAmJiBkLmdldEVsZW1lbnRCeUlkKSB4PWQuZ2V0RWxlbWVudEJ5SWQobik7IHJldHVybiB4OwotfQotCi1mdW5jdGlvbiBNTV9nb1RvVVJMKCkgeyAvL3YzLjAKLSAgdmFyIGksIGFyZ3M9TU1fZ29Ub1VSTC5hcmd1bWVudHM7IGRvY3VtZW50Lk1NX3JldHVyblZhbHVlID0gZmFsc2U7Ci0gIGZvciAoaT0wOyBpPChhcmdzLmxlbmd0aC0xKTsgaSs9MikgZXZhbChhcmdzW2ldKyIubG9jYXRpb249JyIrYXJnc1tpKzFdKyInIik7Ci19Ci0KLQotZnVuY3Rpb24gTU1fcHJlbG9hZEltYWdlcygpIHsgLy92My4wCi0gIHZhciBkPWRvY3VtZW50OyBpZihkLmltYWdlcyl7IGlmKCFkLk1NX3ApIGQuTU1fcD1uZXcgQXJyYXkoKTsKLSAgICB2YXIgaSxqPWQuTU1fcC5sZW5ndGgsYT1NTV9wcmVsb2FkSW1hZ2VzLmFyZ3VtZW50czsgZm9yKGk9MDsgaTxhLmxlbmd0aDsgaSsrKQotICAgIGlmIChhW2ldLmluZGV4T2YoIiMiKSE9MCl7IGQuTU1fcFtqXT1uZXcgSW1hZ2U7IGQuTU1fcFtqKytdLnNyYz1hW2ldO319Ci19Ci0KLQotZnVuY3Rpb24gTU1fc3dhcEltYWdlKCkgeyAvL3YzLjAKLSAgdmFyIGksaj0wLHgsYT1NTV9zd2FwSW1hZ2UuYXJndW1lbnRzOyBkb2N1bWVudC5NTV9zcj1uZXcgQXJyYXk7IGZvcihpPTA7aTwoYS5sZW5ndGgtMik7aSs9MykKLSAgIGlmICgoeD1NTV9maW5kT2JqKGFbaV0pKSE9bnVsbCl7ZG9jdW1lbnQuTU1fc3JbaisrXT14OyBpZigheC5vU3JjKSB4Lm9TcmM9eC5zcmM7IHguc3JjPWFbaSsyXTt9Ci19Ci0KLQotZnVuY3Rpb24gTU1fb3BlbkJyV2luZG93KHRoZVVSTCx3aW5OYW1lLGZlYXR1cmVzKSB7IC8vdjIuMAotICB3aW5kb3cub3Blbih0aGVVUkwsd2luTmFtZSxmZWF0dXJlcyk7Ci19Ci0KLQotCi1mdW5jdGlvbiBNTV9zaG93SGlkZUxheWVycygpIHsgLy92My4wCi0gIHZhciBpLHAsdixvYmosYXJncz1NTV9zaG93SGlkZUxheWVycy5hcmd1bWVudHM7Ci0gIGZvciAoaT0wOyBpPChhcmdzLmxlbmd0aC0yKTsgaSs9MykgaWYgKChvYmo9TU1fZmluZE9iaihhcmdzW2ldKSkhPW51bGwpIHsgdj1hcmdzW2krMl07Ci0gICAgaWYgKG9iai5zdHlsZSkgeyBvYmo9b2JqLnN0eWxlOyB2PSh2PT0nc2hvdycpPyd2aXNpYmxlJzoodj0naGlkZScpPydoaWRkZW4nOnY7IH0KLSAgICBvYmoudmlzaWJpbGl0eT12OyB9Ci19Ci0KLQotZnVuY3Rpb24gbXNjaGFuZ2VmcmFtZSh1cmwpIHsKLXRvcC5jb250ZW50RnJhbWUubG9jYXRpb24uaHJlZj0gdXJsIAotfQotCi0vL2NoYW5nZXMgbWlkZGxlIG5hdiBhbmQgY29udGVudCBmcmFtZSwgY3VycmVudGx5IHVzZWQgaW4gbXVsdGlzaXRlCi1mdW5jdGlvbiBNU2ZyYW1lQ2hhbmdlKCkgewotcGFnZSA9IGRvY3VtZW50LmZvcm1CYW5uZXJGcmFtZS5uZXdMb2NhdGlvbi5vcHRpb25zW2RvY3VtZW50LmZvcm1CYW5uZXJGcmFtZS5uZXdMb2NhdGlvbi5zZWxlY3RlZEluZGV4XS52YWx1ZTsKLXRlbXBJbmRleCA9IHBhZ2UuaW5kZXhPZignPycpOwotZmlyc3RVUkwgPSBwYWdlLnN1YnN0cmluZygwLHRlbXBJbmRleCk7Ci1zZWNvbmRVUkwgPSBwYWdlLnN1YnN0cmluZyh0ZW1wSW5kZXggKyAxLHBhZ2UubGVuZ3RoKTsKLQotdG9wLm1pZGRsZU5hdi5sb2NhdGlvbi5ocmVmID0gZmlyc3RVUkw7Ci10b3AuY29udGVudEZyYW1lLmxvY2F0aW9uLmhyZWYgPSBzZWNvbmRVUkw7Ci19Ci0KLQotCi0vL29wZW5zIHVwIGEgZHluYW1pYyB3aW5kb3cKLWZ1bmN0aW9uIG9wZW5faGVscChoZWxwZmlsZSkgewotICAgIHZhciB3aW5sZWZ0LCB3aW50b3A7Ci0gICAgdmFyIGhlbHBsZWZ0LCBoZWxwdG9wOwotICAgIHZhciBoZWxwd2lkdGgsIGhlbHBoZWlnaHQ7Ci0gICAgaWYgKGRvY3VtZW50LmxheWVycykgewotICAgICAgICB3aW5sZWZ0ID0gdG9wLnNjcmVlblg7Ci0gICAgICAgIHdpbnRvcCA9IHRvcC5zY3JlZW5ZOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICAgd2lubGVmdCA9IHRvcC5zY3JlZW5MZWZ0OwotICAgICAgICB3aW50b3AgPSB0b3Auc2NyZWVuVG9wOwotICAgIH0KLSAgICBoZWxwd2lkdGggPSBNYXRoLm1pbihzY3JlZW4uYXZhaWxXaWR0aCk7Ci0gICAgaGVscGhlaWdodCA9IE1hdGgubWluKHNjcmVlbi5hdmFpbEhlaWdodCk7Ci0gCWhlbHB3aWR0aD1oZWxwd2lkdGggKi42OwotCWhlbHBoZWlnaHQ9aGVscGhlaWdodCAqLjg1OwkKLQloZWxwdG9wID0gMDsKLSAgICBpZiAod2lubGVmdCA+IDIwKQotICAgICAgICBoZWxwbGVmdCA9IDA7Ci0gICAgZWxzZQotICAgICAgICBoZWxwbGVmdCA9IHNjcmVlbi53aWR0aCAtIGhlbHB3aWR0aCAtIDEwOwotICAgIHRvcC5vcGVuKGhlbHBmaWxlLCAnY2N3ZWJfaGVscCcsCi0gICAgICAgICAgICAgJ2xlZnQ9JytoZWxwbGVmdCsnLHRvcD0nK2hlbHB0b3ArJyx3aWR0aD0nK2hlbHB3aWR0aCsnLGhlaWdodD0nK2hlbHBoZWlnaHQrJyxyZXNpemFibGU9MSxzY3JvbGxiYXJzPTEnKTsKLX0KLQotCi0KLS8vIHJlZ3VsYXIgcG9wdXAgdXAgbGF5ZXIgYWNjb3JkaW5nIHRvIGV2ZW50Ci1mdW5jdGlvbiBwb3BMZWZ0TWVudShldnQsY3VyckVsZW0sdXBDaGspewotCS8vIGNoZWNrcyB0byBzZWUgaWYgdGhpcyBpcyBhIERIVE1MIGJyb3dzZXIgCi0JLy8gYW5kIHRoYXQgY3VyckVsZW0gaXMgbm90IHNldCB0byAwIGluIHdoaWNoIGNhc2UgCi0JLy8gdGhpcyB3YXMgdHJpZ2dlcmVkIGJ5IHRoZSBIUkVGIGFuZCBjYW5ub3QgYmUgdHJlYXRlZCBhcyBhbiBldmVudAotCS8vdXBDaGsgc2hvdWxkIGJlIHNldCB0byAxIGZvciBOUyA0IGZvcm0gZml4IGlmIHlvdSB3YW50IHRoZSBwb3Bkb3duIHRvIHBvcCB1cCBpbnN0ZWFkLCBzbyB0aGF0IGl0IGRvZXNuJ3QgYXBwZWFyIG92ZXIgZm9ybXMuCQotCWdsb2JhbExheWVyID0gY3VyckVsZW07Ci0JCi0JaWYgKChpc05TNCAmJiBjdXJyRWxlbSAhPSAwKSB8fCAoaXNJRTQgJiYgY3VyckVsZW0gIT0gMCkpewotCQlkb20gPSBldmFsKGRvY09iaiArICAnLicgKyBjdXJyRWxlbSArIHN0eWxlT2JqKTsKLQkJc3RhdGUgPSBkb20udmlzaWJpbGl0eTsKLQkJaWYgKHN0YXRlID09ICJ2aXNpYmxlIiB8fCBzdGF0ZSA9PSAic2hvdyIpCi0JCQl7ZG9tLnZpc2liaWxpdHkgPSAiaGlkZGVuIjt9Ci0JCQllbHNlIAotCQkJLy8gZmluZHMgdGhlIHBvc2l0aW9uIG9mIHRoZSBtb3VzZSAKLQkJCS8vIGFuZCB0aGVuIG9mZnNldHMgdGhlIGNvb3JkaW5hdGVzIHNsaWdodGx5Ci0JCQkJewotCQlpZiAoaXNOUzQpewotCQkJCSBpZiAoKHVwQ2hrID09IDEpICYmICh3aW5kb3cuaW5uZXJXaWR0aCA8IDY3MCkpIHsKLQkJCXRvcFZhbCA9IGV2YWwoZXZ0LnBhZ2VZIC0gNTApOwotCQkJbGVmdFZhbCA9IGV2YWwoZXZ0LnBhZ2VYIC0gOSk7Ci0JCQl9CQkJCSAgCi0JCQkJZWxzZSB7Ci0JCQkJdG9wVmFsID0gZXZhbChldnQucGFnZVkgLSAwKTsKLQkJCQlsZWZ0VmFsID0gZXZhbChldnQucGFnZVggLSAwKTsKLQkJCQl9Ci0JCX0JCQotCQkJZWxzZSBpZiAoaXNJRTQpIHsKLQkJCQl7Ci0JCQkJdG9wVmFsID0gZXZhbChldmVudC55K2RvY3VtZW50LmJvZHkuc2Nyb2xsVG9wIC0gMCk7Ci0JCQkJbGVmdFZhbCA9IGV2YWwoZXZlbnQueCtkb2N1bWVudC5ib2R5LnNjcm9sbExlZnQgLSAwKTsKLQkJCQkvL2JvdHRvbVZhbCA9IGV2YWwoZXZlbnQueStkb2N1bWVudC5ib2R5LnNjcm9sbEJvdHRvbSArIDIpOwotCQkJCX0KLQkJCSAgICB9Ci0JCQkvLyBrZWVwcyB0aGUgZWxlbWVudCBmcm9tIGdvaW5nIG9mZiBzY3JlZW4gdG8gdGhlIGxlZnQKLQkJCWlmKGxlZnRWYWwgPCAyKSB7bGVmdFZhbCA9IDI7fQotCQkJaWYodG9wVmFsIDwgMikge3RvcFZhbCA9IC01O30JCQkJCi0JCQlkb20udG9wID0gdG9wVmFsOwotCQkJZG9tLmxlZnQgPSBsZWZ0VmFsOwotCQkJZG9tLnZpc2liaWxpdHkgPSAidmlzaWJsZSI7CQkJCQkKLQkJCQl9Ci0JfSAKLQotfQotCi0KLQotLy8gc3BlY2lhbCBwdXB1cCBsYXllciB0byBrZWVwIGl0IGZyb20gZ29pbmcgb2ZmIHRoZSBwYWdlCi0KLWZ1bmN0aW9uIHBvcExlZnRNZW51U3BlY2lhbChldnQsY3VyckVsZW0pewotCS8vIGNoZWNrcyB0byBzZWUgaWYgdGhpcyBpcyBhIERIVE1MIGJyb3dzZXIgCi0JLy8gYW5kIHRoYXQgY3VyckVsZW0gaXMgbm90IHNldCB0byAwIGluIHdoaWNoIGNhc2UgCi0JLy8gdGhpcyB3YXMgdHJpZ2dlcmVkIGJ5IHRoZSBIUkVGIGFuZCBjYW5ub3QgYmUgdHJlYXRlZCBhcyBhbiBldmVudAotCS8vdXBDaGsgc2hvdWxkIGJlIHNldCB0byAxIGZvciBOUyA0IGZvcm0gZml4IGlmIHlvdSB3YW50IHRoZSBwb3Bkb3duIHRvIHBvcCB1cCBpbnN0ZWFkLCBzbyB0aGF0IGl0IGRvZXNuJ3QgYXBwZWFyIG92ZXIgZm9ybXMuCQotCWdsb2JhbExheWVyID0gY3VyckVsZW07Ci0JCi0JaWYgKChpc05TNCAmJiBjdXJyRWxlbSAhPSAwKSB8fCAoaXNJRTQgJiYgY3VyckVsZW0gIT0gMCkpewotCQlkb20gPSBldmFsKGRvY09iaiArICAnLicgKyBjdXJyRWxlbSArIHN0eWxlT2JqKTsKLQkJc3RhdGUgPSBkb20udmlzaWJpbGl0eTsKLQkJaWYgKHN0YXRlID09ICJ2aXNpYmxlIiB8fCBzdGF0ZSA9PSAic2hvdyIpCi0JCQl7ZG9tLnZpc2liaWxpdHkgPSAiaGlkZGVuIjt9Ci0JCQllbHNlIAotCQkJLy8gZmluZHMgdGhlIHBvc2l0aW9uIG9mIHRoZSBtb3VzZSAKLQkJCS8vIGFuZCB0aGVuIG9mZnNldHMgdGhlIGNvb3JkaW5hdGVzIHNsaWdodGx5Ci0JCQkJewotCQlpZiAoaXNOUzQpewotCQkJIGlmICh3aW5kb3cuaW5uZXJXaWR0aCA8IDYwMCkgewotCQkJdG9wVmFsID0gZXZhbChldnQucGFnZVkgLSAwKTsKLQkJCWxlZnRWYWwgPSBldmFsKGV2dC5wYWdlWCAtIDExMCk7Ci0JCQl9CQkKLQkJCQkKLQkJCQllbHNlIHsKLQkJCQl0b3BWYWwgPSBldmFsKGV2dC5wYWdlWSAtIDApOwotCQkJCWxlZnRWYWwgPSBldmFsKGV2dC5wYWdlWCAtIDApOwotCQkJCX0KLQkJfQkJCi0JCQllbHNlIGlmIChpc0lFNCkgewotCQkJCWlmIChkb2N1bWVudC5ib2R5LmNsaWVudFdpZHRoIDwgNjAwKSB7Ci0JCQkJICB0b3BWYWwgPSBldmFsKGV2ZW50LnkrZG9jdW1lbnQuYm9keS5zY3JvbGxUb3AgLSAwKTsKLQkJCQlsZWZ0VmFsID0gZXZhbChldmVudC54K2RvY3VtZW50LmJvZHkuc2Nyb2xsTGVmdCAtIDExMCk7Ci0JCQkJfQotCQkJCQotCQkJCWVsc2V7Ci0JCQkJdG9wVmFsID0gZXZhbChldmVudC55K2RvY3VtZW50LmJvZHkuc2Nyb2xsVG9wIC0gMCk7Ci0JCQkJbGVmdFZhbCA9IGV2YWwoZXZlbnQueCtkb2N1bWVudC5ib2R5LnNjcm9sbExlZnQgLSAwKTsKLQkJCQkvL2JvdHRvbVZhbCA9IGV2YWwoZXZlbnQueStkb2N1bWVudC5ib2R5LnNjcm9sbEJvdHRvbSArIDIpOwotCQkJCX0KLQkJCSAgICB9Ci0JCQkvLyBrZWVwcyB0aGUgZWxlbWVudCBmcm9tIGdvaW5nIG9mZiBzY3JlZW4gdG8gdGhlIGxlZnQKLQkJCWlmKGxlZnRWYWwgPCAyKSB7bGVmdFZhbCA9IDI7fQotCQkJaWYodG9wVmFsIDwgMikge3RvcFZhbCA9IC01O30JCQkJCi0JCQlkb20udG9wID0gdG9wVmFsOwotCQkJZG9tLmxlZnQgPSBsZWZ0VmFsOwotCQkJZG9tLnZpc2liaWxpdHkgPSAidmlzaWJsZSI7CQkJCQkKLQkJCQl9Ci0JfSAKLQkJCi19Ci0KLQotCi0KLWZ1bmN0aW9uIHNlYXJjaE9wdGlvbnMobmV3TG9jKSB7IC8vT3BlbnMgbmV3IHBhZ2UgaW4gdGhlIHJpZ2h0IGZyYW1lIGRlcGVuZGluZyBvbiB0aGUgIkFkdmFuY2VkIFNlYXJjaCBmb3I6IiBzZWxlY3Rpb24KLQkJCW5ld1BhZ2UgPSBuZXdMb2Mub3B0aW9uc1tuZXdMb2Muc2VsZWN0ZWRJbmRleF0udmFsdWUKLQkKLQkJCWlmIChuZXdQYWdlICE9ICIiKSB7Ci0JCQkJcGFyZW50LnZpZXdGcmFtZS5sb2NhdGlvbi5ocmVmID0gbmV3UGFnZQotCQkJfQotCQl9Ci0KLQotLy91bmNoZWNrIGNoZWNrYm94ZXMKLWZ1bmN0aW9uIHVuY2hlY2tBbGwoZmllbGQpIHsKLSAgICAgaWYgKGNoZWNrZWQpIHsgLy8gaWYgY2hlY2tib3hlcyBhcmUgY2hlY2tlZCB0aGVuIGNoZWNrIHRoZW0KLSAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZmllbGQubGVuZ3RoOyBpKyspIHsgLy8gbG9vcCB0aHJvdWdoIHRoZSBhcnJheSBvZiBjaGVja2JveGVzICYgdW5jaGVjayB0aGVtCi0gICAgICAgICAgICAgICBmaWVsZFtpXS5jaGVja2VkID0gZmFsc2U7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNoZWNrZWQgPSBmYWxzZTsKLSAgICAgfQotfSAKLQotLy8gc2hvdyBoaWRlIGxheWVycyBmb3IgQ1EgZGVmbGVjdF9sb2dpbl9lcnIKLW5zNCA9IChkb2N1bWVudC5sYXllcnMpPyB0cnVlOmZhbHNlCi1pZTQgPSAoZG9jdW1lbnQuYWxsKT8gdHJ1ZTpmYWxzZQotCi1mdW5jdGlvbiBzaG93KGlkKSB7Ci1pZiAobnM0KSBkb2N1bWVudC5sYXllcnNbaWRdLnZpc2liaWxpdHkgPSAic2hvdyIKLWlmIChpZTQpIGRvY3VtZW50LmFsbFtpZF0uc3R5bGUudmlzaWJpbGl0eSA9ICJ2aXNpYmxlIgotfQotCi1mdW5jdGlvbiBoaWRlKGlkKSB7Ci1pZiAobnM0KSBkb2N1bWVudC5sYXllcnNbaWRdLnZpc2liaWxpdHkgPSAiaGlkZSIKLWlmIChpZTQpIGRvY3VtZW50LmFsbFtpZF0uc3R5bGUudmlzaWJpbGl0eSA9ICJoaWRkZW4iCi19Ci0KLS8vIHBvcCB1cCB3aW5kb3cgYWNjb3JkaW5nIHRvIG1vdXNlIGV2ZW50Ci1mdW5jdGlvbiBzaG93V2luZG93KGUsdXJsKSB7Ci0gICAgdmFyIHg9eT0wOwotCQotCWlmIChlICE9ICcnKSB7Ci0gICAgICAgIHggPSBlLnNjcmVlblg7Ci0gICAgICAgIHkgPSBlLnNjcmVlblk7Ci0gICAgfQotCi0gICAgbXlXaW5kb3c9d2luZG93Lm9wZW4odXJsLCd3aW5kb3dOYW1lJywnd2lkdGg9MjAwLGhlaWdodD0xNTAsc2NyZWVuWD0nICsgeCArICcsc2NyZWVuWT0nICsgeSArICcsbGVmdD0nICsgeCArICcsdG9wPScgKyB5KTsKLX0KLQotCi0KLQotCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L3NjcmlwdHMvc2NyaXB0cy5qcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvc2NyaXB0cy9zY3JpcHRzLmpzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ODZlZDM4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvc2NyaXB0cy9zY3JpcHRzLmpzCisrKyAvZGV2L251bGwKQEAgLTEsMTM0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8gCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi12YXIgYz0nLmNzcyIgLz4nOwotdmFyIGw9JzxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9XCIuL3N0eWxlc2hlZXRzLyc7Ci0KLS8vU25pZmZlciB2YXJpYWJsZXMgYmVnaW5zCi0vL2NvbnZlcnRpbmcgdG8gbG93ZXJjYXNlCi12YXIgc25uID0gbmF2aWdhdG9yOwotdmFyIHNucGwgPSBzbm4ucGxhdGZvcm0udG9Mb3dlckNhc2UoKTsgLy8gbm90IHN1cHBvcnRlZCBpbiBOUzMuMAotdmFyIHNudWEgPSAnICcgKyBzbm4udXNlckFnZW50LnRvTG93ZXJDYXNlKCk7Ci12YXIgc251biA9IHNubi5hcHBOYW1lLnRvTG93ZXJDYXNlKCk7Ci0KLS8vIHBsYXRmb3JtCi12YXIgc252cGxfbWFjID0gc251YS5pbmRleE9mKCdtYWMnKSA+IDA7Ci12YXIgc252cGxfdW5peCA9IHNudWEuaW5kZXhPZigieDExIikgPiAwOwotdmFyIHNudnBsX3dpbiA9IHNudWEuaW5kZXhPZignd2luJykgPiAwOwotCi0vLyBicm93c2VyIHZlcnNpb24KLXZhciBzbnZ2X2llID0gc251YS5pbmRleE9mKCdtc2llJykgPiAwOwotdmFyIHNudnZfbm4gPSBzbnVhLmluZGV4T2YoJ21vemlsbGEnKSA+IDA7Ci12YXIgc252dmVyc2lvbiA9IHNubi5hcHBWZXJzaW9uOwotCi0KLS8vICdjb21wYXRpYmxlJyB2ZXJzaW9ucyBvZiAibW96aWxsYSIgYXJlbid0IG5hdmlnYXRvcgotaWYoc251YS5pbmRleE9mKCdjb21wYXRpYmxlJykgPiAwKSB7Ci0Jc25udnZfbm4gPSBmYWxzZTsKLX0KLS8vRW5kcyBzbmlmZmVyIHZhcmlhYmxlcyAKLQkKLQkJCi0vKiBUaGlzIGlzIGEgYmFzaWMgc25pZmZlciAqLwotICAKLWlmKHNudnBsX3dpbikvL3dpbmRvd3MKLQoteyAgCi0gIGlmKHNudnZfaWUpICAgIAotICB7Ci0gICAgaWYgKHNudWEuaW5kZXhPZignaWUgNScpIT0tMSlkb2N1bWVudC53cml0ZShsKydkZXNpZ24nK2MpOwotICAgIGVsc2UgaWYoc251YS5pbmRleE9mKCdpZSA1LjUnKSE9LTEpZG9jdW1lbnQud3JpdGUobCsnZGVzaWduJytjKTsKLSAgICBlbHNlIGlmKHNudWEuaW5kZXhPZignaWUgNicpIT0tMSlkb2N1bWVudC53cml0ZShsKydkZXNpZ24nK2MpOwotICAgIGVsc2UKLQkgIHsKLQkgICBkb2N1bWVudC53cml0ZShsKydkZXNpZ24nK2MpOwotCSAgfQotICB9Ci0gIGVsc2UgaWYgKHNudnZfbm4pIAotICB7Ci0gIAotICBpZiAoc251YS5pbmRleE9mKCIvNCIpIT0tMSlkb2N1bWVudC53cml0ZShsKydkZXNpZ25fbnMnK2MpOwotICBlbHNlIGlmKHNudWEuaW5kZXhPZigiLzUiKSE9LTEpZG9jdW1lbnQud3JpdGUobCsnZGVzaWduX25zJytjKTsKLSAgZWxzZSBpZihzbnVhLmluZGV4T2YoIi82IikhPS0xKWRvY3VtZW50LndyaXRlKGwrJ2Rlc2lnbl9ucycrYyk7Ci0gIGVsc2UKLQkgIHsKLQkgICBkb2N1bWVudC53cml0ZShsKydkZXNpZ25fbnMnK2MpOwotCSAgfQotICB9Ci0gIGVsc2UKLSAgewotICAgZG9jdW1lbnQud3JpdGUobCsnZGVzaWduJytjKTsKLSAgfQotfQotZWxzZSBpZihzbnZwbF91bml4KS8vdW5peAotICB7ICAKLSAgaWYoc252dl9pZSkgICAgCi0gIHsKLSAgICBpZiAoc251YS5pbmRleE9mKCdpZSA1JykhPS0xKWRvY3VtZW50LndyaXRlKGwrJ2Rlc2lnbicrYyk7Ci0gICAgZWxzZSBpZihzbnVhLmluZGV4T2YoJ2llIDUuNScpIT0tMSlkb2N1bWVudC53cml0ZShsKydkZXNpZ24nK2MpOwotICAgIGVsc2UgaWYoc251YS5pbmRleE9mKCdpZSA2JykhPS0xKWRvY3VtZW50LndyaXRlKGwrJ2Rlc2lnbicrYyk7Ci0gICAgZWxzZQotCSAgewotCSAgZG9jdW1lbnQud3JpdGUobCsnZGVzaWduJytjKTsKLQkgIH0KLSAgfQotCi0gIGVsc2UgaWYgKHNudnZfbm4pIAotICB7Ci0gIGlmIChzbnVhLmluZGV4T2YoIi80IikhPS0xKWRvY3VtZW50LndyaXRlKGwrJ2Rlc2lnbl9ucycrYyk7Ci0gIGVsc2UgaWYoc251YS5pbmRleE9mKCIvNSIpIT0tMSlkb2N1bWVudC53cml0ZShsKydkZXNpZ25fbnMnK2MpOwotICBlbHNlIGlmKHNudWEuaW5kZXhPZigiLzYiKSE9LTEpZG9jdW1lbnQud3JpdGUobCsnZGVzaWduX25zJytjKTsKLSAgZWxzZQotCSAgewotCSAgZG9jdW1lbnQud3JpdGUobCsnZGVzaWduX25zJytjKTsKLQkgIH0KLSAgfSAKLSAgZWxzZQotICB7Ci0gIGRvY3VtZW50LndyaXRlKGwrJ2Rlc2lnbl9ucycrYyk7Ci0gIH0KLX0KLQotZWxzZSBpZihzbnZwbF9tYWMpLy9tYWMKLSAgeyAgCi0gIGlmKHNudnZfaWUpICAgIAotICB7Ci0gICAgaWYgKHNudWEuaW5kZXhPZignaWUgNScpIT0tMSlkb2N1bWVudC53cml0ZShsKydkZXNpZ24nK2MpOwotICAgIGVsc2UgaWYoc251YS5pbmRleE9mKCdpZSA1LjUnKSE9LTEpZG9jdW1lbnQud3JpdGUobCsnZGVzaWduJytjKTsKLSAgICBlbHNlIGlmKHNudWEuaW5kZXhPZignaWUgNicpIT0tMSlkb2N1bWVudC53cml0ZShsKydkZXNpZ24nK2MpOwotICAgIGVsc2UKLQkgIHsKLQkgICBkb2N1bWVudC53cml0ZShsKydkZXNpZ24nK2MpOwotCSAgfQotICB9Ci0KLSAgZWxzZSBpZiAoc252dl9ubikgCi0gIHsKLSAgaWYgKHNudWEuaW5kZXhPZigiLzQiKSE9LTEpZG9jdW1lbnQud3JpdGUobCsnZGVzaWduX25zJytjKTsKLSAgZWxzZSBpZihzbnVhLmluZGV4T2YoIi82IikhPS0xKWRvY3VtZW50LndyaXRlKGwrJ2Rlc2lnbl9ucycrYyk7Ci0gIGVsc2UKLQkgIHsKLQkgICBkb2N1bWVudC53cml0ZShsKydkZXNpZ25fbnMnK2MpOwotCSAgfQotICB9IAotICBlbHNlCi0gIHsKLSBkb2N1bWVudC53cml0ZShsKydkZXNpZ25fbnMnK2MpOwotICB9Ci19Ci0KLWVsc2UvL290aGVycyAKLXsKLSAgZG9jdW1lbnQud3JpdGUobCsnZGVzaWduX25zJytjKTsKLQotfQotCi0vL1NOSUZGRVIgRU5EUyBIRVJFCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L3NjcmlwdHMvc2NyaXB0c191bml4RnJhbWUuanMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L3NjcmlwdHMvc2NyaXB0c191bml4RnJhbWUuanMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjNDA3NjcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9zY3JpcHRzL3NjcmlwdHNfdW5peEZyYW1lLmpzCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLyAKLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWlmKHNubnZ2X25uICYmIHNudnBsX3VuaXgpIHsJICB3aW5kb3cubG9jYXRpb24gPSAidW5peF9mcmFtZXMuaHRtbCIJfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9zY3JpcHRzL3RvcG5hdi5qcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvc2NyaXB0cy90b3BuYXYuanMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhMTMyYTQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9zY3JpcHRzL3RvcG5hdi5qcworKysgL2Rldi9udWxsCkBAIC0xLDgwOSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vIAotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotLy8gbWVzc2FnZXMgdG8gYmUgZXh0ZXJuaXplZAotLy8gaGVyZSBkZWZpbmVzIGFsbCB0aGUgSTE4TiBzcGVjaWZpYyBtZXNzYWdlcyB1c2VkIGluIHRoZSBqYXZhc2NyaXB0cwotCi12YXIgdG9wbmF2X2pzX01FU1NBR0UxID0gIlRoZSBUcmVlQnJvd3NlIGlzIG5vdCB5ZXQgbG9hZGVkIVxuUGxlYXNlIHdhaXQhIjsKLXZhciB0b3BuYXZfanNfTUVTU0FHRTIgPSAiVGhlcmUgaXMgbm8gJ3swfScgcGFnZSBmb3IgdGhpcyBwYWdlLlxuVHJ5IG9uZSBvZiB0aGUgb3RoZXIgbmF2aWdhdGlvbiBidXR0b25zLiI7Ci12YXIgdG9wbmF2X2pzX01FU1NBR0UzID0gIlRoZXJlIGlzIG5vIHswfSBwYWdlISI7Ci12YXIgdG9wbmF2X2pzX01FU1NBR0VfcHJldiA9ICJwcmV2aW91cyI7Ci12YXIgdG9wbmF2X2pzX01FU1NBR0VfbmV4dCA9ICJuZXh0IjsKLXZhciB0b3BuYXZfanNfTUVTU0FHRV91cCA9ICJ1cCI7Ci12YXIgdG9wbmF2X2pzX01FU1NBR0U0ID0gIlRoZSBjdXJyZW50IGZpbGUgaXMgbm90IGluIHRoZSB0cmVlIGJyb3dzZXIuIjsKLXZhciB0b3BuYXZfanNfTUVTU0FHRTUgPSAiVGhlIHB1Ymxpc2hlZCBzaXRlIGlzIGFscmVhZHkgZGlzcGxheWVkIHVzaW5nIGZyYW1lcyI7Ci0KLWZ1bmN0aW9uIGZvcm1hdFN0cmluZyhtZXNzYWdlLCByZXBsYWNlMCkKLXsKLSAgIAlyZXR1cm4gbWVzc2FnZS5yZXBsYWNlKC9cezBcfS8sIHJlcGxhY2UwKTsKLX0gCi0KLS8vIHRoaXMgc2NyaXB0IGlzIGZvciB0aGUgdG9wbmF2Lmh0bWwKLS8vIHRoaXMgaXMgTk9UIGZvciBnZW5lcmFsIHVzZQotTVNGUGhvdmVyID0KLSgoKG5hdmlnYXRvci5hcHBOYW1lID09ICJOZXRzY2FwZSIpICYmCi0gIChwYXJzZUludChuYXZpZ2F0b3IuYXBwVmVyc2lvbikgPj0gMyApKSB8fAotICAoKG5hdmlnYXRvci5hcHBOYW1lID09ICJNaWNyb3NvZnQgSW50ZXJuZXQgRXhwbG9yZXIiKSAmJgotICAocGFyc2VJbnQobmF2aWdhdG9yLmFwcFZlcnNpb24pID49IDQgKSkpOwotCi0gIGZ1bmN0aW9uIE1TRlBwcmVsb2FkKGltZykKLSAgewotICAgICB2YXIgYT1uZXcgSW1hZ2UoKTsKLSAgICAgYS5zcmM9aW1nOwotICAgICByZXR1cm4gYTsKLSAgfQotICAKLXZhciB0b3VyID0gMDsKLQotZnVuY3Rpb24gb3BlbkZpcnN0VG91ciAoKQotLy8gb3BlbiB0aGUgZ3VpZGVkIHRvdXIgL2hhYWthbiA5OTAzMjQKLXsKLWlmKCF0b3VyIHx8IHRvdXI9PW51bGwgfHwgdG91ci5jbG9zZWQpCi0gICAgewotICAgICAgdG91ciA9IG9wZW4oIi4vdG91ci90b3VyLmh0bSIsInRvdXJfcGFnZSIsInRvb2xiYXI9bm8sZGlyZWN0b3JpZXM9bm8sbWVudWJhcj1ubyxzY3JvbGxiYXJzPXllcyx3aWR0aD0zNTAsaGVpZ2h0PTcwMCxyZXNpemFibGU9eWVzIik7Ci0gICAgICB0b3VyLmZvY3VzKCk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICB0b3VyLmZvY3VzKCk7Ci0gICAgfQotfQotCi1mdW5jdGlvbiBvcGVuVG91ciAoKQotLy8gb3BlbiB0aGUgZ3VpZGVkIHRvdXIgL2hhYWthbiA5OTAzMjQKLXsKLWlmKCF0b3VyIHx8IHRvdXI9PW51bGwgfHwgdG91ci5jbG9zZWQpCi0gICAgewotICAgICAgdG91ciA9IG9wZW4oIi4vdG91ci90b3VyLmh0bSIsInRvdXJfcGFnZSIsInRvb2xiYXI9bm8sZGlyZWN0b3JpZXM9bm8sbWVudWJhcj1ubyxzY3JvbGxiYXJzPXllcyx3aWR0aD0zNTAsaGVpZ2h0PTcwMCxyZXNpemFibGU9eWVzIik7Ci0gICAgICB0b3VyLmZvY3VzKCk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICB0b3VyLmZvY3VzKCk7Ci0gICAgfQotfQotCi0vL0FkZGl0aW9uIGJ5IENoaW5oIFZvIDAzLzI4LzAwCi0gZnVuY3Rpb24gZGlzcGxheUdldHRpbmdTdGFydGVkKCkKLSB7Ci0gCXZhciBwYWdlUGF0dGVybiA9IC9vdnVfcHJvYy87Ci0gCXZhciBtYWluUGFnZSA9IHdpbmRvdy5wYXJlbnQub3J5X2RvYy5sb2NhdGlvbjsKLQotIAlpZiAoIHBhZ2VQYXR0ZXJuLnRlc3QoIG1haW5QYWdlICkgKSB7Ci0gICAgCWlmIChnZXRDb29raWUoIlJVUCIpICE9ICJjaGVja2VkIikgeyBvcGVuRmlyc3RUb3VyKCk7IH0KLQl9Ci0JZWxzZSB7Ci0JCXNldFRpbWVvdXQoICJkaXNwbGF5R2V0dGluZ1N0YXJ0ZWQoKSIsIDEwMDAgKTsKLQl9Ci19Ci0KLWZ1bmN0aW9uIGdldENvb2tpZSAobmFtZSkKLXsKLSAgdmFyIGRjb29raWUgPSBkb2N1bWVudC5jb29raWU7Ci0gIHZhciBjbmFtZSA9IG5hbWUgKyAiPSI7Ci0gIHZhciBjbGVuID0gZGNvb2tpZS5sZW5ndGg7Ci0gIHZhciBjYmVnaW4gPSAwOwotICB3aGlsZSAoY2JlZ2luIDwgY2xlbikKLSAgewotICAgIHZhciB2YmVnaW4gPSBjYmVnaW4gKyBjbmFtZS5sZW5ndGg7Ci0gICAgaWYgKGRjb29raWUuc3Vic3RyaW5nKGNiZWdpbiwgdmJlZ2luKSA9PSBjbmFtZSkKLSAgICB7Ci0gICAgICB2YXIgdmVuZCA9IGRjb29raWUuaW5kZXhPZiAoIjsiLCB2YmVnaW4pOwotICAgICAgaWYgKHZlbmQgPT0gLTEpCi0gICAgICB7Ci0gICAgICAgIHZlbmQgPSBjbGVuOwotICAgICAgfQotICAgICAgcmV0dXJuIHVuZXNjYXBlKGRjb29raWUuc3Vic3RyaW5nKHZiZWdpbiwgdmVuZCkpOwotICAgIH0KLSAgICBjYmVnaW4gPSBkY29va2llLmluZGV4T2YoIiAiLCBjYmVnaW4pICsgMTsKLSAgICBpZiAoY2JlZ2luID09IDApCi0gICAgewotICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci0gIHJldHVybiBudWxsOwotIH0KLQotCi0gIHZhciBpbmRleD1udWxsOwotICB2YXIgdG91cj1udWxsOwotICB2YXIgc2VhcmNoPW51bGw7Ci0gIHZhciBnbG9zc2FyeT1udWxsOwotICB2YXIgZmVlZGJhY2s9bnVsbDsKLSAgdmFyIHRyZWVMb2FkZWQ9ZmFsc2U7Ci0gIGZ1bmN0aW9uIGNoZWNrVHJlZUxvYWRlZCgpCi0gIHsKLSAgICBpZih0cmVlTG9hZGVkKQotICAgIHsKLSAgICAgIHJldHVybiB0cmVlTG9hZGVkOwotICAgIH0KLQotICAgIC8qCi0gICAgIGlmKHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LlJ1cFByZXNlbnRlckFwcGxldCAhPSBudWxsCi0gICAgICAgICYmIHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LlJ1cFByZXNlbnRlckFwcGxldC5pc1JlYWR5KCkpCi0gICAgIHsKLSAgICAgICB0cmVlTG9hZGVkID0gdHJ1ZTsKLSAgICAgfQotICAgICAqLwotICAgICBpZihwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5SdXBQcmVzZW50ZXJBcHBsZXQgIT0gbnVsbCkKLSAgICAgewotICAgICAgCXZhciBtZXRob2QgPSB0eXBlb2YgcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuUnVwUHJlc2VudGVyQXBwbGV0LmlzUmVhZHk7Ci0JIGlmIChtZXRob2QgIT0gInVuZGVmaW5lZCIpIHsKLQkJaWYgKHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LlJ1cFByZXNlbnRlckFwcGxldC5pc1JlYWR5KCkpCi0JCXsKLSAgICAgICAJCQl0cmVlTG9hZGVkID0gdHJ1ZTsKLQkJfQotCi0JICB9Ci0KLSAgICAgfQotCi0gICAgIHJldHVybiB0cmVlTG9hZGVkOwotICAgfQotCi0KLSAgICBmdW5jdGlvbiBzaG93QWxlcnROb3RMb2FkZWQoKQotICAgIHsKLSAgICAgIGFsZXJ0KHRvcG5hdl9qc19NRVNTQUdFMSk7Ci0gICAgfQotCi1mdW5jdGlvbiBzaG93U3RhdHVzTm90TG9hZGVkKCkKLSAgewotICAgIC8vcmV0dXJuICJUaGUgVHJlZUJyb3dzZSBpcyBub3QgeWV0IGxvYWRlZCFcblBsZWFzZSB3YWl0ISI7Ci0gICAgcmV0dXJuIHRvcG5hdl9qc19NRVNTQUdFMTsKLSAgfQotCi0gIGZ1bmN0aW9uIHNob3dBbGVydE5vUGFnZSh0ZXh0KQotICB7Ci0gICAgIHZhciBwYXJlbnRMYWJlbCA9IHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS5nZXRQYXJlbnRMYWJlbChwYXJlbnQub3J5X2RvYy5kb2N1bWVudC5VUkwpOwotICAgICBpZihwYXJlbnRMYWJlbCE9IiIgJiYgcGFyZW50TGFiZWwhPW51bGwpCi0gICAgIHsKLSAgICAgICAgICAvL2FsZXJ0KCJUaGVyZSBpcyBubyAnIiArIHRleHQgKyAiJyBwYWdlIGZvciB0aGlzIHBhZ2UuXG5Ucnkgb25lIG9mIHRoZSBvdGhlciBuYXZpZ2F0aW9uIGJ1dHRvbnMuIik7Ci0gICAgICAgICAgYWxlcnQoZm9ybWF0U3RyaW5nKHRvcG5hdl9qc19NRVNTQUdFMiwgdGV4dCkpOwotICAgICB9Ci0gICAgIGVsc2UKLSAgICAgewotICAgICAgICAgLy9hbGVydCgiVGhlcmUgaXMgbm8gJyIgKyB0ZXh0ICsgIicgcGFnZSBmb3IgdGhpcyBwYWdlLlxuVHJ5IG9uZSBvZiB0aGUgb3RoZXIgbmF2aWdhdGlvbiBidXR0b25zIik7Ci0gICAgICAgICBhbGVydChmb3JtYXRTdHJpbmcodG9wbmF2X2pzX01FU1NBR0UyLCB0ZXh0KSk7Ci0gICAgIH0KLSAgfQotCi0gIGZ1bmN0aW9uIHNob3dTdGF0dXNOb1BhZ2UodGV4dCkKLSAgewotCi0gICAgIHZhciBwYXJlbnRMYWJlbCA9IHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS5nZXRQYXJlbnRMYWJlbChwYXJlbnQub3J5X2RvYy5kb2N1bWVudC5VUkwpOwotICAgICB2YXIgbXNnOwotICAgICBpZihwYXJlbnRMYWJlbCE9IiIgJiYgcGFyZW50TGFiZWwhPW51bGwpCi0gICAgIHsKLSAgICAgICAgLy9tc2cgPSAiVGhlcmUgaXMgbm8gIiArIHRleHQgKyAiIHBhZ2UhIjsKLSAgICAgICAgbXNnID0gZm9ybWF0U3RyaW5nKHRvcG5hdl9qc19NRVNTQUdFMywgdGV4dCk7Ci0gICAgIH0KLSAgICAgZWxzZQotICAgICB7Ci0gICAgICAgIC8vbXNnID0gIlRoZXJlIGlzIG5vICIgKyB0ZXh0ICsgIiBwYWdlISI7Ci0gICAgICAgIG1zZyA9IGZvcm1hdFN0cmluZyh0b3BuYXZfanNfTUVTU0FHRTMsIHRleHQpOwotICAgICB9Ci0KLSAgICAgcmV0dXJuIG1zZzsKLSAgfQotCi0gIGZ1bmN0aW9uIHNob3dQYXJlbnRMYWJlbCgpCi0gIHsKLSAgICBpZihjaGVja1RyZWVMb2FkZWQoKSkKLSAgICB7Ci0gICAgICB2YXIgbGFiZWwgPSBwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5hcHBsZXRzLlRyZWUuZ2V0UGFyZW50TGFiZWwocGFyZW50Lm9yeV9kb2MuZG9jdW1lbnQuVVJMKTsKLSAgICAgIHZhciBwYXJlbnR1cmwgPSBwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5hcHBsZXRzLlRyZWUuZ2V0UGFyZW50VXJsKHBhcmVudC5vcnlfZG9jLmRvY3VtZW50LlVSTCk7Ci0KLSAgICAgaWYobGFiZWwhPSIiICYmIGxhYmVsIT1udWxsICYmIHBhcmVudHVybCE9IiIgJiYgcGFyZW50dXJsIT1udWxsKQotICAgICB7Ci0gICAgICAgc2VsZi5zdGF0dXMgPSBsYWJlbDsKLSAgICAgfQotICAgICBlbHNlCi0gICAgIHsKLSAgICAgICBzZWxmLnN0YXR1cyA9IHNob3dTdGF0dXNOb1BhZ2UoInVwIik7Ci0gICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgc2VsZi5zdGF0dXMgPSBzaG93U3RhdHVzTm90TG9hZGVkKCk7Ci0gICAgfQotICB9Ci0KLSAgZnVuY3Rpb24gc2hvd0hvbWVMYWJlbCgpCi0gIHsKLSAgICBzZWxmLnN0YXR1cyA9ICJIb21lIjsKLSAgfQotCi0gIGZ1bmN0aW9uIHNob3dQcmV2aW91c0xhYmVsKCkKLSAgewotICAgIGlmKGNoZWNrVHJlZUxvYWRlZCgpKQotICAgIHsKLSAgICAgIHZhciBsYWJlbCA9IHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS5nZXRQcmV2aW91c0xhYmVsKHBhcmVudC5vcnlfZG9jLmRvY3VtZW50LlVSTCk7Ci0gICAgICB2YXIgcHJldnVybCA9IHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS5nZXRQcmV2aW91c1VybChwYXJlbnQub3J5X2RvYy5kb2N1bWVudC5VUkwpOwotCi0gICAgIGlmKGxhYmVsIT0iIiAmJiBsYWJlbCE9bnVsbCAmJiBwcmV2dXJsIT0iIiAmJiBwcmV2dXJsIT1udWxsKQotICAgICB7Ci0gICAgICAgc2VsZi5zdGF0dXMgPSBsYWJlbDsKLSAgICAgfQotICAgICBlbHNlCi0gICAgIHsKLSAgICAgICAgc2VsZi5zdGF0dXMgPSBzaG93U3RhdHVzTm9QYWdlKCJwcmV2aW91cyIpOwotICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHNlbGYuc3RhdHVzID0gc2hvd1N0YXR1c05vdExvYWRlZCgpOwotICAgIH0KLSAgfQotCi0gIGZ1bmN0aW9uIHNob3dOZXh0TGFiZWwoKQotICB7Ci0gICAgaWYoY2hlY2tUcmVlTG9hZGVkKCkpCi0gICAgewotICAgICAgdmFyIGxhYmVsID0gcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuYXBwbGV0cy5UcmVlLmdldE5leHRMYWJlbChwYXJlbnQub3J5X2RvYy5kb2N1bWVudC5VUkwpOwotICAgICAgdmFyIG5leHR1cmwgPSBwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5hcHBsZXRzLlRyZWUuZ2V0TmV4dFVybChwYXJlbnQub3J5X2RvYy5kb2N1bWVudC5VUkwpOwotICAgICAgaWYobGFiZWwhPSIiICYmIGxhYmVsIT1udWxsICYmIG5leHR1cmwhPSIiICYmIG5leHR1cmwhPW51bGwpCi0gICAgICB7Ci0gICAgICAgIHNlbGYuc3RhdHVzID0gbGFiZWw7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIHNlbGYuc3RhdHVzID0gIHNob3dTdGF0dXNOb1BhZ2UoIm5leHQiKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICBzZWxmLnN0YXR1cyA9ICBzaG93U3RhdHVzTm90TG9hZGVkKCk7Ci0gICAgfQotICB9Ci0KLSAgZnVuY3Rpb24gbG9hZFByZXZpb3VzKCkKLSAgewotICAgIGlmKGNoZWNrVHJlZUxvYWRlZCgpKQotICAgIHsKLSAgICAgdmFyIG5ld0xhYmVsID0gcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuYXBwbGV0cy5UcmVlLmdldFByZXZpb3VzTGFiZWwocGFyZW50Lm9yeV9kb2MuZG9jdW1lbnQuVVJMKTsKLSAgICAgdmFyIG5ld0xvY2F0aW9uID0gcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuYXBwbGV0cy5UcmVlLmdldFByZXZpb3VzVXJsKHBhcmVudC5vcnlfZG9jLmRvY3VtZW50LlVSTCk7Ci0KLSAgICAgaWYobmV3TG9jYXRpb24hPSIiICYmIG5ld0xvY2F0aW9uIT1udWxsKQotICAgICB7Ci0KLQlpZiAoKG5ld0xvY2F0aW9uLmluZGV4T2YoImFwcGxldCIpPT0tMSkgJiYgKG5ld0xvY2F0aW9uLmluZGV4T2YoInd3dyIpPT0tMSkpCi0JewotCQlwYXJlbnQub3J5X2RvYy5sb2NhdGlvbiA9IG5ld0xvY2F0aW9uOwotCX0KLQllbHNlIGlmIChuZXdMb2NhdGlvbi5pbmRleE9mKCJhcHBsZXQiKSE9LTEpCi0JewotCSAJcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuYXBwbGV0cy5UcmVlLmdldEFwcGxldFBhZ2UobmV3TG9jYXRpb24sIG5ld0xhYmVsKTsKLQl9Ci0JZWxzZSBpZiAobmV3TG9jYXRpb24uaW5kZXhPZigid3d3IikhPS0xKQotCXsKLQkJbmV3TG9jYXRpb24gPSBwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5hcHBsZXRzLlRyZWUuZ2V0SHR0cFBhZ2UobmV3TG9jYXRpb24sIG5ld0xhYmVsLCAiUHJldmlvdXMiKTsKLQl9Ci0JICAgICAgCXBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS5zZWxlY3ROb2RlKG5ld0xvY2F0aW9uKTsKLSAgICAgfQotICAgICBlbHNlCi0gICAgIHsKLSAgICAgICBzaG93QWxlcnROb1BhZ2UodG9wbmF2X2pzX01FU1NBR0VfcHJldik7Ci0gICAgIH0KLSAgICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHNob3dBbGVydE5vdExvYWRlZCgpOwotICAgIH0KLSAgICAgcmV0dXJuOwotICB9Ci0KLSAgZnVuY3Rpb24gbG9hZE5leHQoKQotICB7Ci0gICAgaWYoY2hlY2tUcmVlTG9hZGVkKCkpCi0gICAgewotICAgICB2YXIgbmV3TGFiZWwgPSBwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5hcHBsZXRzLlRyZWUuZ2V0TmV4dExhYmVsKHBhcmVudC5vcnlfZG9jLmRvY3VtZW50LlVSTCk7Ci0gICAgIHZhciBuZXdMb2NhdGlvbiA9IHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS5nZXROZXh0VXJsKHBhcmVudC5vcnlfZG9jLmRvY3VtZW50LlVSTCk7Ci0gICAgIGlmKG5ld0xvY2F0aW9uIT0iIiAmJiBuZXdMb2NhdGlvbiE9bnVsbCkKLSAgICAgewotCi0JaWYgKChuZXdMb2NhdGlvbi5pbmRleE9mKCJhcHBsZXQiKT09LTEpICYmIChuZXdMb2NhdGlvbi5pbmRleE9mKCJ3d3ciKT09LTEpKQotCXsKLQkJcGFyZW50Lm9yeV9kb2MubG9jYXRpb24gPSBuZXdMb2NhdGlvbjsKLQl9Ci0JZWxzZSBpZiAobmV3TG9jYXRpb24uaW5kZXhPZigiYXBwbGV0IikhPS0xKQotCXsKLQkgCXBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS5nZXRBcHBsZXRQYWdlKG5ld0xvY2F0aW9uLCBuZXdMYWJlbCk7Ci0JfQotCWVsc2UgaWYgKG5ld0xvY2F0aW9uLmluZGV4T2YoInd3dyIpIT0tMSkKLQl7Ci0JCW5ld0xvY2F0aW9uID0gcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuYXBwbGV0cy5UcmVlLmdldEh0dHBQYWdlKG5ld0xvY2F0aW9uLCBuZXdMYWJlbCwgIk5leHQiKTsKLQl9Ci0gICAgICAgcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuYXBwbGV0cy5UcmVlLnNlbGVjdE5vZGUobmV3TG9jYXRpb24pOwotCi0gICAgIH0KLSAgICAgZWxzZQotICAgICB7Ci0gICAgICAgIHNob3dBbGVydE5vUGFnZSh0b3BuYXZfanNfTUVTU0FHRV9uZXh0KTsKLSAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgc2hvd0FsZXJ0Tm90TG9hZGVkKCk7Ci0gICAgfQotCi0gICAgIHJldHVybjsKLSAgfQotCi0gIGZ1bmN0aW9uIGxvYWRQYXJlbnQoKQotICB7Ci0gICAgaWYoY2hlY2tUcmVlTG9hZGVkKCkpCi0gICAgewotICAgICB2YXIgbmV3TG9jYXRpb24gPSBwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5hcHBsZXRzLlRyZWUuZ2V0UGFyZW50VXJsKHBhcmVudC5vcnlfZG9jLmRvY3VtZW50LlVSTCk7Ci0gICAgIGlmKG5ld0xvY2F0aW9uIT0iIiAmJiBuZXdMb2NhdGlvbiE9bnVsbCkKLSAgICAgewotICAgICAgIHBhcmVudC5vcnlfZG9jLmxvY2F0aW9uID0gbmV3TG9jYXRpb247Ci0gICAgICAgcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuYXBwbGV0cy5UcmVlLnNlbGVjdE5vZGUobmV3TG9jYXRpb24pOwotICAgICB9Ci0gICAgIGVsc2UKLSAgICAgewotICAgICAgIHNob3dBbGVydE5vUGFnZSh0b3BuYXZfanNfTUVTU0FHRV91cCk7Ci0gICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICBzaG93QWxlcnROb3RMb2FkZWQoKTsKLSAgICB9Ci0KLSAgICAgcmV0dXJuOwotICB9Ci0KLWZ1bmN0aW9uIHdoZXJlQW1JKCkKLSAgewotICAgIGlmKGNoZWNrVHJlZUxvYWRlZCgpKQotICAgIHsKLQl2YXIgc3RhdHVzID0gcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuYXBwbGV0cy5UcmVlLnNlbGVjdE5vZGUocGFyZW50Lm9yeV9kb2MuZG9jdW1lbnQuVVJMKTsKLSAgICAJaWYoIHN0YXR1cyA9PSBmYWxzZSApCi0JewotCQlhbGVydCggdG9wbmF2X2pzX01FU1NBR0U0ICk7Ci0JfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgc2hvd0FsZXJ0Tm90TG9hZGVkKCk7Ci0gICAgfQotICAgICByZXR1cm47Ci0gIH0KLQotICBmdW5jdGlvbiB1cEFycm93KCkKLSAgewotICAgIGlmKGNoZWNrVHJlZUxvYWRlZCgpKQotICAgIHsKLSAgICAgIHZhciBuZXdMb2NhdGlvbiA9IHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS51cEFycm93KCk7Ci0gICAgICBpZihuZXdMb2NhdGlvbiE9IiIgJiYgbmV3TG9jYXRpb24hPW51bGwpCi0gICAgICB7Ci0gICAgICAgcGFyZW50Lm9yeV9kb2MubG9jYXRpb24gPSBuZXdMb2NhdGlvbjsKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHNob3dBbGVydE5vdExvYWRlZCgpOwotICAgIH0KLSAgICAgcmV0dXJuOwotICB9Ci0KLSAgZnVuY3Rpb24gZG93bkFycm93KCkKLSAgewotICAgIGlmKGNoZWNrVHJlZUxvYWRlZCgpKQotICAgIHsKLSAgICAgIHZhciBuZXdMb2NhdGlvbiA9IHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS5kb3duQXJyb3coKTsKLSAgICAgIGlmKG5ld0xvY2F0aW9uIT0iIiAmJiBuZXdMb2NhdGlvbiE9bnVsbCkKLSAgICAgIHsKLSAgICAgICBwYXJlbnQub3J5X2RvYy5sb2NhdGlvbiA9IG5ld0xvY2F0aW9uOwotICAgICAgfQotCi0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBzaG93QWxlcnROb3RMb2FkZWQoKTsKLSAgICB9Ci0gICAgIHJldHVybjsKLSAgfQotCi0gICAgZnVuY3Rpb24gbGVmdEFycm93KCkKLSAgewotICAgIGlmKGNoZWNrVHJlZUxvYWRlZCgpKQotICAgIHsKLSAgICAgcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuYXBwbGV0cy5UcmVlLmxlZnRBcnJvdygpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgc2hvd0FsZXJ0Tm90TG9hZGVkKCk7Ci0gICAgfQotICAgICByZXR1cm47Ci0gIH0KLQotICAgIGZ1bmN0aW9uIHJpZ2h0QXJyb3coKQotICB7Ci0gICAgaWYoY2hlY2tUcmVlTG9hZGVkKCkpCi0gICAgewotICAgICBwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5hcHBsZXRzLlRyZWUucmlnaHRBcnJvdygpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgc2hvd0FsZXJ0Tm90TG9hZGVkKCk7Ci0gICAgfQotICAgICByZXR1cm47Ci0gIH0KLQotCi1mdW5jdGlvbiBsb2FkVG9wKCkKLXsKLSAgaWYocGFyZW50LmZyYW1lcy5sZW5ndGghPTAgJiYgcGFyZW50LmZyYW1lc1sxXS5uYW1lPT0ib3J5X3RvYyIpCi0gIHsKLSAgICAgYWxlcnQodG9wbmF2X2pzX01FU1NBR0U1KTsKLSAgfQotICBlbHNlCi0gIHsKLSAgICB2YXIgZXhwaXJlcyA9IG5ldyBEYXRlKCk7Ci0gICAgZXhwaXJlcy5zZXRUaW1lIChleHBpcmVzLmdldFRpbWUoKSArICgxMDAwICogMjApKTsKLSAgICBkb2N1bWVudC5jb29raWUgPSAicnVwX29yeV9kb2M9IiArIGVzY2FwZSAoZG9jdW1lbnQuVVJMKSArCi0gICAgIjsgZXhwaXJlcz0iICsgZXhwaXJlcy50b1VUQ1N0cmluZygpICsgICI7IHBhdGg9LyI7Ci0KLSAgICB2YXIgbmV3X29yeV9kb2NfbG9jID0gbnVsbDsKLQotICAgIGZvcihpPWRvY3VtZW50LmxpbmtzLmxlbmd0aC0xO2k+PTA7aS0tKQotICAgIHsKLSAgICAgICBpZihkb2N1bWVudC5saW5rc1tpXS5ocmVmLmluZGV4T2YoImluZGV4Lmh0bSIpIT0tMSkKLSAgICAgICB7Ci0gICAgICAgICBuZXdfb3J5X2RvY19sb2MgPSBkb2N1bWVudC5saW5rc1tpXS5ocmVmOwotICAgICAgICAgYnJlYWs7Ci0gICAgICAgfQotICAgIH0KLQotICAgIGlmKG5ld19vcnlfZG9jX2xvYyE9bnVsbCkKLSAgICB7Ci0JaWYoIHNlbGYubmFtZSA9PSAib3J5X2RvYyIgKQotCXsKLQkJd2luZG93LmNsb3NlKCk7Ci0JCXdpbmRvdy5vcGVuKCBuZXdfb3J5X2RvY19sb2MgKTsKLQl9Ci0JZWxzZQotCXsKLQkgICAgICAgCXRvcC5sb2NhdGlvbiA9IG5ld19vcnlfZG9jX2xvYzsKLQl9Ci0gICAgfQotICAgfQotfQotCi0KLWZ1bmN0aW9uIG9wZW5PcnkgKHBhZ2UsIHRhcmdldCkKLXsKLSAgICBpZighaW5kZXggfHwgaW5kZXguY2xvc2VkKQotICAgIHsKLSAgICAgIGluZGV4ID0gb3BlbihwYWdlLHRhcmdldCwidG9vbGJhcj1ubyxkaXJlY3Rvcmllcz1ubyxtZW51YmFyPW5vLHNjcm9sbGJhcnM9eWVzLHdpZHRoPTM5NSxoZWlnaHQ9NTAwLHJlc2l6YWJsZT15ZXMiKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGluZGV4LmZvY3VzKCk7Ci0gICAgfQotfQotCi1mdW5jdGlvbiBvcGVuU2VhcmNoKCkKLXsKLSAgICBpZighc2VhcmNoIHx8IHNlYXJjaC5jbG9zZWQpCi0gICAgewotICAgICAgc2VhcmNoID0gb3BlbigiLi9hcHBsZXQvc2VhcmNoLmh0bSIsInNlYXJjaF9wYWdlIiwidG9vbGJhcj1ubyxkaXJlY3Rvcmllcz1ubyxtZW51YmFyPW5vLHNjcm9sbGJhcnM9bm8sd2lkdGg9NjMwLGhlaWdodD00NTAscmVzaXphYmxlPXllcyIpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgc2VhcmNoLmZvY3VzKCk7Ci0gICAgfQotfQotCi1mdW5jdGlvbiBvcGVuUHJvY2Vzc1NlYXJjaCgpCi17Ci0gICAgaWYoIXNlYXJjaCB8fCBzZWFyY2guY2xvc2VkKQotICAgIHsKLSAgICAgIHNlYXJjaCA9IG9wZW4oIi4vc2VhcmNoL3NlYXJjaC5odG1sIiwic2VhcmNoX3BhZ2UiLCJ0b29sYmFyPW5vLGRpcmVjdG9yaWVzPW5vLG1lbnViYXI9bm8sc2Nyb2xsYmFycz15ZXMsd2lkdGg9NjMwLGhlaWdodD00NTAscmVzaXphYmxlPXllcyIpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgc2VhcmNoLmZvY3VzKCk7Ci0gICAgfQotICAgCi19Ci0KLWZ1bmN0aW9uIGdldEJhc2VVcmwoKSB7Ci0KLSAgICAvLyBnZXQgdGhlIHVybCBiYXNlIGZvciB0aGUgc2VhcmNoIHVybAotCXZhciB1cmwgPSBsb2NhdGlvbi5ocmVmOwotCXZhciBpID0gdXJsLmxhc3RJbmRleE9mKCIvIik7Ci0JdXJsID0gdXJsLnN1YnN0cmluZygwLCBpKTsKLQkKLQlyZXR1cm4gdXJsOwotfQotCi1mdW5jdGlvbiBvcGVuSW5kZXgoKQotewotICAgb3Blbk9yeSgiLi9pbmRleC9pbmRleC5odG0iLCJpbmRleF93aW4iKTsKLX0KLQotZnVuY3Rpb24gb3Blbkdsb3NzYXJ5KCkKLXsKLSBpZighZ2xvc3NhcnkgfHwgZ2xvc3NhcnkuY2xvc2VkKQotICAgIHsKLSAgICAgIGdsb3NzYXJ5ID0gb3BlbigiLi9wcm9jZXNzL2dsb3NzYXJ5L2luZGV4Lmh0bSIsImdsb3NzYXJ5X3dpbiIsInRvb2xiYXI9bm8sZGlyZWN0b3JpZXM9bm8sbWVudWJhcj1ubyxzY3JvbGxiYXJzPXllcyx3aWR0aD0zODUsaGVpZ2h0PTUwMCxyZXNpemFibGU9eWVzIik7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBnbG9zc2FyeS5mb2N1cygpOwotICAgIH0KLX0KLQotZnVuY3Rpb24gcHJpbnRQYWdlKCkKLXsKLSBwYXJlbnQub3J5X2RvYy5mb2N1cygpOwotIHBhcmVudC5vcnlfZG9jLnByaW50KCk7Ci19Ci0KLQotZnVuY3Rpb24gc2VuZEZlZWRiYWNrKHVybCkKLXsKLQlpZiAoIHVybCA9PSBudWxsIHx8IHVybCA9PSAnJyApCi0JewotCQlyZXR1cm47Ci0JfQotCQotCWlmICggdXJsLmluZGV4T2YoIm1haWx0bzoiKSA+PSAwICkKLQl7Ci0JCXNlbmRtYWlsKHVybCk7Ci0JfQotCWVsc2UKLQl7Ci0JCQotIAkgICAgaWYoIWZlZWRiYWNrIHx8IGZlZWRiYWNrLmNsb3NlZCkKLQkgICAgewotCSAgICAgIGZlZWRiYWNrID0gb3Blbih1cmwsImZlZWRiYWNrX3dpbiIsInRvb2xiYXI9bm8sZGlyZWN0b3JpZXM9bm8sbWVudWJhcj1ubyxzY3JvbGxiYXJzPXllcyx3aWR0aD02MDAsaGVpZ2h0PTUwMCxyZXNpemFibGU9eWVzIik7Ci0JICAgIH0KLQkgICAgZWxzZQotCSAgICB7Ci0JICAgICAgZmVlZGJhY2suZm9jdXMoKTsKLQkgICAgfQotICAgIAl9Ci0gICAgCQotfQotCi0KLWZ1bmN0aW9uIHNlbmRtYWlsKHVybCkKLXsKLQlpZiAoIHVybC5pbmRleE9mKCI/c3ViamVjdCIpID09IC0xICkKLQl7Ci0JCXZhciBsaW5rPXBhcmVudC5vcnlfZG9jLmxvY2F0aW9uOwotCQl1cmwgPSB1cmwgKyAnP3N1YmplY3Q9RmVlZGJhY2s6IC0gJytsaW5rOwotCX0KLQlsb2NhdGlvbi5yZXBsYWNlKHVybCk7Ci19Ci0KLS8vY2FsY3VsYXRlcyByZWxhdGl2ZSBwYXRoCi0vL3BhdGggbXVzdCBiZSBhbGwgcmVsYXRpdmUgZnJvbSB3ZWJzaXRlIGJhc2Ugb3IgY29udGFpbiBmdWxsIHVybHMKLWZ1bmN0aW9uIGNhbGN1bGF0ZVJlbGF0aXZlUGF0aChzb3VyY2VQYXRoLCB0YXJnZXRQYXRoKQotewotCWlmICh0YXJnZXRQYXRoLmluZGV4T2YoImh0dHA6LyIpICE9IC0xKQotCXsKLQkJcmV0dXJuIHRhcmdldFBhdGg7Ci0JfQotCi0JLy9yZXBsYWNlIGFsbCAnXCcgd2l0aCAnLycKLQlzb3VyY2VQYXRoID0gc291cmNlUGF0aC5yZXBsYWNlKC9cXC9nLCIkMS8kMiIpOwotCXRhcmdldFBhdGggPSB0YXJnZXRQYXRoLnJlcGxhY2UoL1xcL2csIi8iKTsKLQotCS8vYWxlcnQoIlJlcGxhY2UoU291cmNlKT0+IiArIHNvdXJjZVBhdGgpOwotCS8vYWxlcnQoIlJlcGxhY2UodGFyZ2V0KT0+IiArIHRhcmdldFBhdGgpOwotCi0KLQlzb3VyY2VBcnJheSA9IHNvdXJjZVBhdGguc3BsaXQoIi8iKTsKLQl0YXJnZXRBcnJheSA9IHRhcmdldFBhdGguc3BsaXQoIi8iKTsKLQotCXZhciB0aGVSZWxQYXRoID0gIiI7Ci0KLQkvL2xvb3AgdW50aWwgd2UgZmluZCBhIGRpZmZlcmVuY2UKLQl2YXIgaWR4ID0gMDsKLQlmb3IoaWR4ID0gMDsgaWR4IDwgc291cmNlQXJyYXkubGVuZ3RoOyBpZHgrKykKLQl7Ci0JCWlmIChpZHggPiB0YXJnZXRQYXRoLmxlbmd0aCkKLQkJewotCQkJYnJlYWs7Ci0JCX0KLQotCQlpZiAoc291cmNlQXJyYXlbaWR4XSAhPSB0YXJnZXRBcnJheVtpZHhdKQotCQl7Ci0JCQlicmVhazsKLQkJfQotCX0KLQotCS8vYXBwZW5kIHRoZSBhcHByb3ByaWF0ZSBudW1iZXIgb2YgLi8KLQl2YXIgbWF4SWR4ID0gc291cmNlQXJyYXkubGVuZ3RoIC0gMTsKLQlmb3IgKHZhciBpID0gaWR4OyBpIDwgbWF4SWR4OyBpKyspCi0JewotCQl0aGVSZWxQYXRoID0gdGhlUmVsUGF0aCArICIuLyI7Ci0KLQkJLy9hbGVydCgiUmVsUGF0aD0+IiArIHRoZVJlbFBhdGgpOwotCX0KLQotCS8vYXBwZW5kIGFueSByZW1haW5pbmcgdGFyZ2V0IHBhdGgKLQl3aGlsZShpZHggPCB0YXJnZXRBcnJheS5sZW5ndGgpCi0JewotCQl0aGVSZWxQYXRoID0gdGhlUmVsUGF0aCArIHRhcmdldEFycmF5W2lkeCsrXSArICIvIjsKLQkJLy9hbGVydCgiUmVsUGF0aChmaW5hbCk9PiIgKyB0aGVSZWxQYXRoKTsKLQl9Ci0KLQkvL3JlbW92ZSB0aGUgbGFzdCBwYXRoIHNlcGFyYXRvcgotCWlmICh0aGVSZWxQYXRoLmxlbmd0aCA+IDApCi0JewotCQkvL2FsZXJ0KCJSZWxQYXRoKFRyaW0xKT0+IiArIHRoZVJlbFBhdGgpOwotCQl0aGVSZWxQYXRoID0gdGhlUmVsUGF0aC5zdWJzdHJpbmcoMCwgKHRoZVJlbFBhdGgubGVuZ3RoIC0gMSkpOwotCQkvL2FsZXJ0KCJSZWxQYXRoKFRyaW0xKT0+IiArIHRoZVJlbFBhdGgpOwotCX0KLQotCS8vYWxlcnQoIlJldHVybiBSZWxhdGl2ZSBQYXRoID0+ICIgKyB0aGVSZWxQYXRoKTsKLQotCXJldHVybiB0aGVSZWxQYXRoOwotfQotCi1mdW5jdGlvbiBnZXRUcmVlUGF0aCgpCi17Ci0JcmV0dXJuIGJ1aWxkVHJlZVBhdGhMb2NhdGlvbigpOwotfQotCi0vL1RoaXMgbWV0aG9kIHdpbGwgcmVtb3ZlIHRoZSB3ZWJzaXRlIGJhc2UgZnJvbSB0aGUgdXJsCi1mdW5jdGlvbiBjYWxjdWxhdEN1cnJlbnRQYWdlKGN1cnJVUkwpIHsKLQotCXZhciB0aGVDdXJyZW50TG9jYXRpb24gPSBkb2N1bWVudC5sb2NhdGlvbi5ocmVmOwotCS8vcmVwbGFjZSBhbGwgJ1wnIHdpdGggJy8nCi0JdGhlQ3VycmVudExvY2F0aW9uID0gdGhlQ3VycmVudExvY2F0aW9uLnJlcGxhY2UoL1xcL2csIiQxLyQyIik7Ci0JY3VyclVSTCA9IGN1cnJVUkwucmVwbGFjZSgvXFwvZywiJDEvJDIiKTsKLQotCXZhciBzb3VyY2VBcnJheSA9IHRoZUN1cnJlbnRMb2NhdGlvbi5zcGxpdCgiLyIpOwotCXZhciBjdXJyQXJyYXkgPSBjdXJyVVJMLnNwbGl0KCIvIik7Ci0KLQl2YXIgbnVtVG9SZW1vdmUgPSBzb3VyY2VBcnJheS5sZW5ndGggLSAyOwotCXZhciBpZHggPSAwOwotCXZhciB0aGVSZXR1cm5QYXRoID0gIiI7Ci0JZm9yIChpZHggPSBudW1Ub1JlbW92ZTsgaWR4IDwgY3VyckFycmF5Lmxlbmd0aDsgaWR4KyspIHsKLQkJaWYgKHRoZVJldHVyblBhdGggIT0gIiIpIHsKLQkJCXRoZVJldHVyblBhdGggPSB0aGVSZXR1cm5QYXRoICsgIi8iOwotCQl9Ci0JCXRoZVJldHVyblBhdGggPSB0aGVSZXR1cm5QYXRoICsgY3VyckFycmF5W2lkeF07Ci0JfQotCi0JLy9hbGVydCgiQXJyYXlUZXN0PT4iICsgY3VyclVSTCArICIsIiArIHRoZVJldHVyblBhdGgpOwotCXJldHVybiB0aGVSZXR1cm5QYXRoOwotfQotCi0vL2J1aWxkcyB0cmVlIHBhdGgKLWZ1bmN0aW9uIGJ1aWxkVHJlZVBhdGhMb2NhdGlvbigpCi17Ci0JdmFyIHRoZURlbGltaXRlciA9ICIjIyoiOwotCXZhciB0aGlzUGFnZSA9ICJhcHBsZXQvcnVwX3RvcG5hdi5odG0iOwotCXZhciB0aGVMb2MgPSAiIjsKLQotCi0KLQlpZihjaGVja1RyZWVMb2FkZWQoKSkKLQl7Ci0JCXZhciB0aGVDdXJyZW50TG9jYXRpb24gPSBwYXJlbnQub3J5X2RvYy5kb2N1bWVudC5sb2NhdGlvbi5ocmVmOwotCQl0aGlzUGFnZSA9IGNhbGN1bGF0Q3VycmVudFBhZ2UodGhlQ3VycmVudExvY2F0aW9uKTsKLQotCQkvL2FsZXJ0KCJQYXRoTmFtZToiICsgdGhpc1BhZ2UpOwotCi0JCS8vYWxlcnQoIlRyeWluZyB0byBmaW5kIHRoZSBwYXRoIGZvciA9PiIgKyB0aGVDdXJyZW50TG9jYXRpb24pOwotCi0JCXZhciB0aGVQYXRoID0gcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuUnVwUHJlc2VudGVyQXBwbGV0LmdldFRyZWVQYXRoQXJyYXkodGhlQ3VycmVudExvY2F0aW9uKTsKLQotCQkvL2FsZXJ0KCJUaGUgVHJlZSBQYXRoOiAiICsgdGhlUGF0aCk7Ci0KLQkJdGhlUGF0aFN0cmluZyA9IHRoZVBhdGggKyAiIjsKLSAgICAJCWFycmF5RnJvbVN0cmluZyA9IHRoZVBhdGhTdHJpbmcuc3BsaXQodGhlRGVsaW1pdGVyKTsKLQotCQkvL2J1aWxkIHRoZSBwYXRoIGZyb20gdGhlIGFycmF5Ci0JCS8vcGFyYW0gMSA9IHBhdGggdG8gaWNvbiwgcGFyYW0gMiAtIGxhYmVsLCBwYXJhbSAzIC0gcGF0aCB0byBmaWxlCi0JCXZhciBjb3VudGVyID0gMDsKLQkJdmFyIHRoZUxhYmVsOwotCQl2YXIgdGhlUmVsUGF0aDsKLQkJaWYgKGFycmF5RnJvbVN0cmluZy5sZW5ndGggPiAyKQotCQl7Ci0JCSAgIHRoZUxvYyA9ICIiOwotCQkgICBmb3IodmFyIGkgPSAwOyBpIDwgKGFycmF5RnJvbVN0cmluZy5sZW5ndGggLSAxKSA7IGkrKykKLQkJICAgewotCQkJLy9pdCdzIHRoZSBpY29uIHBhdGgKLQkJCWlmIChjb3VudGVyIDwgMikKLQkJCXsKLQkJCQlpZiAoY291bnRlciA+IDApCi0JCQkJewotCQkJCQl0aGVMb2MgPSB0aGVMb2MgKyAiICZndDsgIjsKLQkJCQl9Ci0KLQkJCQkvL2FsZXJ0KCJDYWxjdWxhdGluZyBwYXRoIGZyb20oMSkgIiArIHRoaXNQYWdlICsgIiA9PiAiICsgYXJyYXlGcm9tU3RyaW5nW2ldKTsKLQotCQkJCWlmIChhcnJheUZyb21TdHJpbmdbaV0uaW5kZXhPZigiXFwiKSA9PSAtMSAmJiBhcnJheUZyb21TdHJpbmdbaV0uaW5kZXhPZigiLyIpID09IC0xKQotCQkJCXsKLQkJCQkJaWYgKGFycmF5RnJvbVN0cmluZ1tpXSAhPSAibnVsbCIpCi0JCQkJCXsKLQkJCQkJCXRoZVJlbFBhdGggPSAiYXBwbGV0L2ltYWdlcy8iICsgYXJyYXlGcm9tU3RyaW5nW2ldOwotCQkJCQkJdGhlUmVsUGF0aCA9IGNhbGN1bGF0ZVJlbGF0aXZlUGF0aCh0aGlzUGFnZSwgdGhlUmVsUGF0aCk7Ci0JCQkJCX0KLQkJCQkJLy9hbGVydCgiTW9kaWZ5aW5nIFBhdGggPT4gIiArIHRoZVJlbFBhdGgpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJdGhlUmVsUGF0aCA9IGNhbGN1bGF0ZVJlbGF0aXZlUGF0aCh0aGlzUGFnZSwgYXJyYXlGcm9tU3RyaW5nW2ldKTsKLQkJCQl9Ci0KLQkJCQlpZiAodGhlUmVsUGF0aCAhPSAibnVsbCIpCi0JCQkJewotCQkJCQl0aGVMb2MgPSB0aGVMb2MgKwotCQkJCQkJICI8aW1nIGJvcmRlcj0wIHNyYz1cIiIgKwotCQkJCQkJIHRoZVJlbFBhdGggICsKLQkJCQkJCSAiXCI+IjsKLQkJCQl9Ci0KLQkJCQkvL2FsZXJ0KCJ0aGUgY3VyciBwYXRoPT4iICsgdGhlTG9jKTsKLQkJCQljb3VudGVyID0gMjsKLQkJCX0KLQkJCS8vIGl0J3MgdGhlIGxhYmVsCi0JCQllbHNlIGlmIChjb3VudGVyID09IDIpCi0JCQl7Ci0JCQkJdGhlTGFiZWwgPSBhcnJheUZyb21TdHJpbmdbaV07Ci0JCQkJY291bnRlciA9IDM7Ci0JCQl9Ci0JCQllbHNlIGlmIChjb3VudGVyID09IDMpCi0JCQl7Ci0JCQkJLy9hbGVydCgiQ2FsY3VsYXRpbmcgcGF0aCBmcm9tKDMpICIgKyB0aGlzUGFnZSArICIgPT4gIiArIGFycmF5RnJvbVN0cmluZ1tpXSk7Ci0JCQkJaWYgKGFycmF5RnJvbVN0cmluZ1tpXSAhPSAibnVsbCIpCi0JCQkJewotCQkJCQl0aGVSZWxQYXRoID0gY2FsY3VsYXRlUmVsYXRpdmVQYXRoKHRoaXNQYWdlLCBhcnJheUZyb21TdHJpbmdbaV0pOwotCQkJCQlpZiAodGhlUmVsUGF0aCAhPSAiIikgewotCQkJCQkJdGhlTG9jID0gdGhlTG9jICsKLQkJCQkJIAkJIjxhIGNsYXNzPVwiaG90dGV4dFwiIHRhcmdldD1cIm9yeV9kb2NcIiBocmVmPVwiIiArCi0JCQkJCQkJIHRoZVJlbFBhdGggKwotCQkJCQkgCQkiXCI+IiArCi0JCQkJCSAJCXRoZUxhYmVsICsKLQkJCQkJIAkJIjxcL2E+XG4iOwotCQkJCQkgfQotCQkJCQkgZWxzZSB7Ci0JCQkJCSAJdGhlTG9jID0gdGhlTG9jICsKLQkJCQkJIAkJIjxhIGNsYXNzPVwiaG90dGV4dFwiPiIgICsKLQkJCQkJIAkJdGhlTGFiZWwgKwotCQkJCQkgCQkiPFwvYT5cbiI7Ci0JCQkJCSB9Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQl7Ci0JCQkJCXRoZUxvYyA9IHRoZUxvYyArCi0JCQkJCSAJIjxhIGNsYXNzPVwiaG90dGV4dFwiPiIgICsKLQkJCQkJIAl0aGVMYWJlbCArCi0JCQkJCSAJIjxcL2E+XG4iOwotCQkJCX0KLQkJCQkvL2FsZXJ0KCJ0aGUgY3VyciBwYXRoPT4iICsgdGhlTG9jKTsKLQkJCQljb3VudGVyID0gMTsKLQkJCQl0aGVSZWxQYXRoID0gIm51bGwiOwotCQkJCXRoZUxhYmVsID0gIm51bGwiOwotCQkJfQotCQkgICB9Ci0KLQkJLy9hbGVydCgiRmluaXNoZWQgQnVpbGRpbmcgPT4gIiArIHRoZUxvYyk7Ci0JCX0KLQotCX0KLQotCS8vdGhlTG9jID0gIkN1cnJlbnQgTG9jYXRpb24mbmJzcDsmIzA0NTsmbmJzcDsiICsgdGhlTG9jOwotCi0JLy9hbGVydCgidGhlIEZpbmFsIFN0cmluZz0+IiArIHRoZUxvYyk7Ci0KLQkvL2RvY3VtZW50LndyaXRlKHRoZUxvYyk7Ci0JcmV0dXJuIHRoZUxvYzsKLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9zY3JpcHRzL3RyZWVicm93c2VyLmpzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9zY3JpcHRzL3RyZWVicm93c2VyLmpzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NjI0NmVlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvc2NyaXB0cy90cmVlYnJvd3Nlci5qcworKysgL2Rldi9udWxsCkBAIC0xLDk1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8gCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0vLyBIZXJlIGRlZmluZXMgYWxsIHRoZSBJMThOIHNwZWNpZmljIG1lc3NhZ2VzIHVzZWQgaW4gdGhlIGphdmFzY3JpcHRzCi12YXIgdHJlZWJyb3dzZXJfanNfTUVTU0FHRTEgPSAiVGhlIGNvbmZpZ3VyYXRpb24gaXMgYWxyZWFkeSBkaXNwbGF5ZWQgdXNpbmcgdmlld3MiOwotdmFyIHRyZWVicm93c2VyX2pzX01FU1NBR0UyID0gIkRpc3BsYXkgdmlld3MiOwotdmFyIHRyZWVicm93c2VyX2pzX01FU1NBR0UzID0gIkhvbWUiOwotCi1mdW5jdGlvbiBsb2FkVG9wKCkKLXsKLSAgaWYocGFyZW50LmZyYW1lcy5sZW5ndGghPTAgJiYgKHBhcmVudC5mcmFtZXNbMV0ubmFtZT09Im9yeV90b2MiIHx8IHBhcmVudC5mcmFtZXNbMV0ubmFtZT09Im9yeV90b2NfZnJhbWUiKSApCi0gIHsKLSAgICAgYWxlcnQodHJlZWJyb3dzZXJfanNfTUVTU0FHRTEpOwotICB9Ci0gIGVsc2UKLSAgewotICAgIHZhciBleHBpcmVzID0gbmV3IERhdGUoKTsKLSAgICBleHBpcmVzLnNldFRpbWUgKGV4cGlyZXMuZ2V0VGltZSgpICsgKDEwMDAgKiAyMCkpOwotICAgIGRvY3VtZW50LmNvb2tpZSA9ICJydXBfb3J5X2RvYz0iICsgZXNjYXBlIChkb2N1bWVudC5VUkwpICsKLSAgICAiOyBleHBpcmVzPSIgKyBleHBpcmVzLnRvVVRDU3RyaW5nKCkgKyAgIjsgcGF0aD0vIjsKLSAgICAJCi0gICAgdmFyIG1haW5JbmRleF9hID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeU5hbWUoIm1haW5JbmRleCIpOyAKLQl2YXIgbmV3X29yeV9kb2NfbG9jID0gbnVsbDsgCi0JaWYgKCAgbWFpbkluZGV4X2EgIT0gbnVsbCApIHsgCi0gICAgICAgIG5ld19vcnlfZG9jX2xvYyA9IG1haW5JbmRleF9hLml0ZW0oMCkuaHJlZjsgCi0JfSAKLQotICAgIGlmKG5ld19vcnlfZG9jX2xvYyE9bnVsbCkKLSAgICB7Ci0JaWYoIHNlbGYubmFtZSA9PSAib3J5X2RvYyIgKQotCXsKLQkJd2luZG93LmNsb3NlKCk7Ci0JCXdpbmRvdy5vcGVuKCBuZXdfb3J5X2RvY19sb2MgKTsJCQotCX0KLQllbHNlCi0JewotCSAgICAgICAJdG9wLmxvY2F0aW9uID0gbmV3X29yeV9kb2NfbG9jOwotCX0KLSAgICB9Ci0gICB9Ci19Ci0KLQotICBmdW5jdGlvbiBnZXRJbWFnZVVybChpbWFnZSkKLSAgewotICAgIHZhciBuZXdfb3J5X2RvY19sb2M9bnVsbDsgICAgCi0gICAgdmFyIG1haW5JbmRleF9hID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeU5hbWUoIm1haW5JbmRleCIpOyAKLSAgICBuZXdfb3J5X2RvY19sb2MgPSBtYWluSW5kZXhfYS5pdGVtKDApLmhyZWYuc3Vic3RyaW5nKDAsbWFpbkluZGV4X2EuaXRlbSgwKS5ocmVmLmxhc3RJbmRleE9mKCIvIikpOwotICAgIG5ld19vcnlfZG9jX2xvYyA9IG5ld19vcnlfZG9jX2xvYyArICIiICsgaW1hZ2U7Ci0gICAgcmV0dXJuIG5ld19vcnlfZG9jX2xvYzsgICAgCi0gIH0KLQotTVNGUGhvdmVyID0KLSgoKG5hdmlnYXRvci5hcHBOYW1lID09ICJOZXRzY2FwZSIpICYmCi0gIChwYXJzZUludChuYXZpZ2F0b3IuYXBwVmVyc2lvbikgPj0gMyApKSB8fAotICAoKG5hdmlnYXRvci5hcHBOYW1lID09ICJNaWNyb3NvZnQgSW50ZXJuZXQgRXhwbG9yZXIiKSAmJgotICAocGFyc2VJbnQobmF2aWdhdG9yLmFwcFZlcnNpb24pID49IDQgKSkpOwotCi0gIGZ1bmN0aW9uIE1TRlBwcmVsb2FkKGltZykKLSAgewotICAgICB2YXIgYT1uZXcgSW1hZ2UoKTsKLSAgICAgYS5zcmM9aW1nOwotICAgICByZXR1cm4gYTsKLSAgfQotCi0gICAgaWYoTVNGUGhvdmVyKQotICAgIHsKLSAgICAgICAgUnVwR3JheT1NU0ZQcHJlbG9hZChnZXRJbWFnZVVybCgnL2ltYWdlcy9kaXNwbGF5X3ZpZXdzLmdpZicpKTsKLSAgICAgICAgUnVwQmx1ZT1NU0ZQcHJlbG9hZChnZXRJbWFnZVVybCgnL2ltYWdlcy9kaXNwbGF5X3ZpZXdzX2EuZ2lmJykpOwotICAgIH0KLQotCi0vL25ldyBjb2RlIHRvIGRpc3BsYXkgdGhlIGxvYWQgYnV0dG9uIG9yIG5vdAotdmFyIG9yeV90b2NfZXhpc3QgPSB0eXBlb2YgcGFyZW50Lm9yeV90b2M7Ci1pZiAob3J5X3RvY19leGlzdCA9PSAidW5kZWZpbmVkIikgewotICAgb3J5X3RvY19leGlzdCA9IHR5cGVvZiBwYXJlbnQub3J5X3RvY19mcmFtZTsKLX0KLQotaWYgKG9yeV90b2NfZXhpc3QgPT0gInVuZGVmaW5lZCIpIHsKLQlkb2N1bWVudC53cml0ZSgiPGEgY2xhc3M9XCJleHBhbmRDb2xsYXBzZUxpbmtcIiBocmVmPVwiSmF2YVNjcmlwdDpsb2FkVG9wKCk7XCIgb25tb3VzZW92ZXI9XCJpZihNU0ZQaG92ZXIpIGRvY3VtZW50WydIb21lJ10uc3JjPVJ1cEJsdWUuc3JjOyBzZWxmLnN0YXR1cz10cmVlYnJvd3Nlcl9qc19NRVNTQUdFMjsgcmV0dXJuIHRydWVcIiBvbm1vdXNlb3V0PVwiaWYoTVNGUGhvdmVyKSBkb2N1bWVudFsnSG9tZSddLnNyYz1SdXBHcmF5LnNyYzsgc2VsZi5zdGF0dXM9ICcgJztyZXR1cm4gdHJ1ZVwiPiA8YnI+IDxpbWcgc3JjPVwiIiArIGJhY2tQYXRoICsgImltYWdlcy9kaXNwbGF5X3ZpZXdzLmdpZiIpOwotLy9TVEFSVCBOT04tVFJBTlNMQVRBQkxFCi0JZG9jdW1lbnQud3JpdGUoIlwiICBib3JkZXI9XCIwXCIgYWxpZ249XCJhYnNtaWRkbGVcIiBhbHQ9XCIiICsgdHJlZWJyb3dzZXJfanNfTUVTU0FHRTIgKyAiXCIgbmFtZT1cIiIgKyB0cmVlYnJvd3Nlcl9qc19NRVNTQUdFMyArICJcIiB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIj4iICsgdHJlZWJyb3dzZXJfanNfTUVTU0FHRTIgKyAiPFwvYT4iKTsKLS8vRU5EIE5PTi1UUkFOU0xBVEFCTEUKLX0KLWVsc2UgewotCWRvY3VtZW50LndyaXRlKCImbmJzcDsiKTsKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvc2VydmVyX3NlYXJjaC9zZWFyY2gvaW1hZ2VzL0FjdGl2aXR5LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvc2VydmVyX3NlYXJjaC9zZWFyY2gvaW1hZ2VzL0FjdGl2aXR5LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2YyMGRlYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L3NlcnZlcl9zZWFyY2gvc2VhcmNoL2ltYWdlcy9BY3Rpdml0eS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L3NlcnZlcl9zZWFyY2gvc2VhcmNoL2ltYWdlcy9BcnRpZmFjdC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L3NlcnZlcl9zZWFyY2gvc2VhcmNoL2ltYWdlcy9BcnRpZmFjdC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwMWQyMTkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9zZXJ2ZXJfc2VhcmNoL3NlYXJjaC9pbWFnZXMvQXJ0aWZhY3QuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9zZXJ2ZXJfc2VhcmNoL3NlYXJjaC9pbWFnZXMvQ2FwYWJpbGl0eVBhdHRlcm4uZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9zZXJ2ZXJfc2VhcmNoL3NlYXJjaC9pbWFnZXMvQ2FwYWJpbGl0eVBhdHRlcm4uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNWZmYmIwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvc2VydmVyX3NlYXJjaC9zZWFyY2gvaW1hZ2VzL0NhcGFiaWxpdHlQYXR0ZXJuLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvc2VydmVyX3NlYXJjaC9zZWFyY2gvaW1hZ2VzL0NoZWNrbGlzdC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L3NlcnZlcl9zZWFyY2gvc2VhcmNoL2ltYWdlcy9DaGVja2xpc3QuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OGY2ZDhiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvc2VydmVyX3NlYXJjaC9zZWFyY2gvaW1hZ2VzL0NoZWNrbGlzdC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L3NlcnZlcl9zZWFyY2gvc2VhcmNoL2ltYWdlcy9Db25jZXB0LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvc2VydmVyX3NlYXJjaC9zZWFyY2gvaW1hZ2VzL0NvbmNlcHQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZGY4NGRhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvc2VydmVyX3NlYXJjaC9zZWFyY2gvaW1hZ2VzL0NvbmNlcHQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9zZXJ2ZXJfc2VhcmNoL3NlYXJjaC9pbWFnZXMvQ3VzdG9tQ2F0ZWdvcnkuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9zZXJ2ZXJfc2VhcmNoL3NlYXJjaC9pbWFnZXMvQ3VzdG9tQ2F0ZWdvcnkuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZjQ3OTgwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvc2VydmVyX3NlYXJjaC9zZWFyY2gvaW1hZ2VzL0N1c3RvbUNhdGVnb3J5LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvc2VydmVyX3NlYXJjaC9zZWFyY2gvaW1hZ2VzL0RlbGl2ZXJhYmxlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvc2VydmVyX3NlYXJjaC9zZWFyY2gvaW1hZ2VzL0RlbGl2ZXJhYmxlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWFlMjIyYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L3NlcnZlcl9zZWFyY2gvc2VhcmNoL2ltYWdlcy9EZWxpdmVyYWJsZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L3NlcnZlcl9zZWFyY2gvc2VhcmNoL2ltYWdlcy9EZWxpdmVyeVByb2Nlc3MuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9zZXJ2ZXJfc2VhcmNoL3NlYXJjaC9pbWFnZXMvRGVsaXZlcnlQcm9jZXNzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2I0MDM2Mi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L3NlcnZlcl9zZWFyY2gvc2VhcmNoL2ltYWdlcy9EZWxpdmVyeVByb2Nlc3MuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9zZXJ2ZXJfc2VhcmNoL3NlYXJjaC9pbWFnZXMvRGlzY2lwbGluZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L3NlcnZlcl9zZWFyY2gvc2VhcmNoL2ltYWdlcy9EaXNjaXBsaW5lLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzViZDQ3Ni4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L3NlcnZlcl9zZWFyY2gvc2VhcmNoL2ltYWdlcy9EaXNjaXBsaW5lLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvc2VydmVyX3NlYXJjaC9zZWFyY2gvaW1hZ2VzL0Rpc2NpcGxpbmVHcm91cGluZy5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L3NlcnZlcl9zZWFyY2gvc2VhcmNoL2ltYWdlcy9EaXNjaXBsaW5lR3JvdXBpbmcuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZWU4MDg5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvc2VydmVyX3NlYXJjaC9zZWFyY2gvaW1hZ2VzL0Rpc2NpcGxpbmVHcm91cGluZy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L3NlcnZlcl9zZWFyY2gvc2VhcmNoL2ltYWdlcy9Eb21haW4uZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9zZXJ2ZXJfc2VhcmNoL3NlYXJjaC9pbWFnZXMvRG9tYWluLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2YyODkyNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L3NlcnZlcl9zZWFyY2gvc2VhcmNoL2ltYWdlcy9Eb21haW4uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9zZXJ2ZXJfc2VhcmNoL3NlYXJjaC9pbWFnZXMvRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvc2VydmVyX3NlYXJjaC9zZWFyY2gvaW1hZ2VzL0VzdGltYXRpb25Db25zaWRlcmF0aW9ucy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmYzg0ZTQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9zZXJ2ZXJfc2VhcmNoL3NlYXJjaC9pbWFnZXMvRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvc2VydmVyX3NlYXJjaC9zZWFyY2gvaW1hZ2VzL0V4YW1wbGUuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9zZXJ2ZXJfc2VhcmNoL3NlYXJjaC9pbWFnZXMvRXhhbXBsZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiOTQ0ZmQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9zZXJ2ZXJfc2VhcmNoL3NlYXJjaC9pbWFnZXMvRXhhbXBsZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L3NlcnZlcl9zZWFyY2gvc2VhcmNoL2ltYWdlcy9HdWlkZWxpbmUuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9zZXJ2ZXJfc2VhcmNoL3NlYXJjaC9pbWFnZXMvR3VpZGVsaW5lLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjZmNDRmNS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L3NlcnZlcl9zZWFyY2gvc2VhcmNoL2ltYWdlcy9HdWlkZWxpbmUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9zZXJ2ZXJfc2VhcmNoL3NlYXJjaC9pbWFnZXMvSXRlcmF0aW9uLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvc2VydmVyX3NlYXJjaC9zZWFyY2gvaW1hZ2VzL0l0ZXJhdGlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2ZjVmZjAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9zZXJ2ZXJfc2VhcmNoL3NlYXJjaC9pbWFnZXMvSXRlcmF0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvc2VydmVyX3NlYXJjaC9zZWFyY2gvaW1hZ2VzL01pbGVzdG9uZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L3NlcnZlcl9zZWFyY2gvc2VhcmNoL2ltYWdlcy9NaWxlc3RvbmUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYjhmNWQ5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvc2VydmVyX3NlYXJjaC9zZWFyY2gvaW1hZ2VzL01pbGVzdG9uZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L3NlcnZlcl9zZWFyY2gvc2VhcmNoL2ltYWdlcy9PdGhlci5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L3NlcnZlcl9zZWFyY2gvc2VhcmNoL2ltYWdlcy9PdGhlci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2M2Q4MDEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9zZXJ2ZXJfc2VhcmNoL3NlYXJjaC9pbWFnZXMvT3RoZXIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9zZXJ2ZXJfc2VhcmNoL3NlYXJjaC9pbWFnZXMvT3V0Y29tZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L3NlcnZlcl9zZWFyY2gvc2VhcmNoL2ltYWdlcy9PdXRjb21lLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDkwM2RhMy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L3NlcnZlcl9zZWFyY2gvc2VhcmNoL2ltYWdlcy9PdXRjb21lLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvc2VydmVyX3NlYXJjaC9zZWFyY2gvaW1hZ2VzL1BoYXNlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvc2VydmVyX3NlYXJjaC9zZWFyY2gvaW1hZ2VzL1BoYXNlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWQ2MGJkOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L3NlcnZlcl9zZWFyY2gvc2VhcmNoL2ltYWdlcy9QaGFzZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L3NlcnZlcl9zZWFyY2gvc2VhcmNoL2ltYWdlcy9QcmFjdGljZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L3NlcnZlcl9zZWFyY2gvc2VhcmNoL2ltYWdlcy9QcmFjdGljZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlODA3NWEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9zZXJ2ZXJfc2VhcmNoL3NlYXJjaC9pbWFnZXMvUHJhY3RpY2UuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9zZXJ2ZXJfc2VhcmNoL3NlYXJjaC9pbWFnZXMvUmVwb3J0LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvc2VydmVyX3NlYXJjaC9zZWFyY2gvaW1hZ2VzL1JlcG9ydC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyMmM4NWUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9zZXJ2ZXJfc2VhcmNoL3NlYXJjaC9pbWFnZXMvUmVwb3J0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvc2VydmVyX3NlYXJjaC9zZWFyY2gvaW1hZ2VzL1JldXNhYmxlQXNzZXQuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9zZXJ2ZXJfc2VhcmNoL3NlYXJjaC9pbWFnZXMvUmV1c2FibGVBc3NldC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5MjI3ZjMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9zZXJ2ZXJfc2VhcmNoL3NlYXJjaC9pbWFnZXMvUmV1c2FibGVBc3NldC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L3NlcnZlcl9zZWFyY2gvc2VhcmNoL2ltYWdlcy9Sb2FkbWFwLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvc2VydmVyX3NlYXJjaC9zZWFyY2gvaW1hZ2VzL1JvYWRtYXAuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZWU5MTI2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvc2VydmVyX3NlYXJjaC9zZWFyY2gvaW1hZ2VzL1JvYWRtYXAuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9zZXJ2ZXJfc2VhcmNoL3NlYXJjaC9pbWFnZXMvUm9sZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L3NlcnZlcl9zZWFyY2gvc2VhcmNoL2ltYWdlcy9Sb2xlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzZlODg5Ni4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L3NlcnZlcl9zZWFyY2gvc2VhcmNoL2ltYWdlcy9Sb2xlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvc2VydmVyX3NlYXJjaC9zZWFyY2gvaW1hZ2VzL1JvbGVEZXNjcmlwdG9yLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvc2VydmVyX3NlYXJjaC9zZWFyY2gvaW1hZ2VzL1JvbGVEZXNjcmlwdG9yLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzU1MjRhYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L3NlcnZlcl9zZWFyY2gvc2VhcmNoL2ltYWdlcy9Sb2xlRGVzY3JpcHRvci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L3NlcnZlcl9zZWFyY2gvc2VhcmNoL2ltYWdlcy9Sb2xlU2V0LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvc2VydmVyX3NlYXJjaC9zZWFyY2gvaW1hZ2VzL1JvbGVTZXQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MDk5ZmVhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvc2VydmVyX3NlYXJjaC9zZWFyY2gvaW1hZ2VzL1JvbGVTZXQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9zZXJ2ZXJfc2VhcmNoL3NlYXJjaC9pbWFnZXMvUm9sZVNldEdyb3VwaW5nLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvc2VydmVyX3NlYXJjaC9zZWFyY2gvaW1hZ2VzL1JvbGVTZXRHcm91cGluZy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0YTNmNjcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9zZXJ2ZXJfc2VhcmNoL3NlYXJjaC9pbWFnZXMvUm9sZVNldEdyb3VwaW5nLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvc2VydmVyX3NlYXJjaC9zZWFyY2gvaW1hZ2VzL1N1bW1hcnkuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9zZXJ2ZXJfc2VhcmNoL3NlYXJjaC9pbWFnZXMvU3VtbWFyeS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1YTg4ZjYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9zZXJ2ZXJfc2VhcmNoL3NlYXJjaC9pbWFnZXMvU3VtbWFyeS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L3NlcnZlcl9zZWFyY2gvc2VhcmNoL2ltYWdlcy9TdXBwb3J0aW5nTWF0ZXJpYWwuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9zZXJ2ZXJfc2VhcmNoL3NlYXJjaC9pbWFnZXMvU3VwcG9ydGluZ01hdGVyaWFsLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDVhMjFlYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L3NlcnZlcl9zZWFyY2gvc2VhcmNoL2ltYWdlcy9TdXBwb3J0aW5nTWF0ZXJpYWwuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9zZXJ2ZXJfc2VhcmNoL3NlYXJjaC9pbWFnZXMvVGFzay5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L3NlcnZlcl9zZWFyY2gvc2VhcmNoL2ltYWdlcy9UYXNrLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWMzYjJiOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L3NlcnZlcl9zZWFyY2gvc2VhcmNoL2ltYWdlcy9UYXNrLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvc2VydmVyX3NlYXJjaC9zZWFyY2gvaW1hZ2VzL1Rhc2tEZXNjcmlwdG9yLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvc2VydmVyX3NlYXJjaC9zZWFyY2gvaW1hZ2VzL1Rhc2tEZXNjcmlwdG9yLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTQ5ZWZlMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L3NlcnZlcl9zZWFyY2gvc2VhcmNoL2ltYWdlcy9UYXNrRGVzY3JpcHRvci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L3NlcnZlcl9zZWFyY2gvc2VhcmNoL2ltYWdlcy9UZW1wbGF0ZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L3NlcnZlcl9zZWFyY2gvc2VhcmNoL2ltYWdlcy9UZW1wbGF0ZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhNWY4MjIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9zZXJ2ZXJfc2VhcmNoL3NlYXJjaC9pbWFnZXMvVGVtcGxhdGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9zZXJ2ZXJfc2VhcmNoL3NlYXJjaC9pbWFnZXMvVGVybURlZmluaXRpb24uZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9zZXJ2ZXJfc2VhcmNoL3NlYXJjaC9pbWFnZXMvVGVybURlZmluaXRpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjY2IzZTc1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvc2VydmVyX3NlYXJjaC9zZWFyY2gvaW1hZ2VzL1Rlcm1EZWZpbml0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvc2VydmVyX3NlYXJjaC9zZWFyY2gvaW1hZ2VzL1Rvb2wuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9zZXJ2ZXJfc2VhcmNoL3NlYXJjaC9pbWFnZXMvVG9vbC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmMWI4NWEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9zZXJ2ZXJfc2VhcmNoL3NlYXJjaC9pbWFnZXMvVG9vbC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L3NlcnZlcl9zZWFyY2gvc2VhcmNoL2ltYWdlcy9Ub29sTWVudG9yLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvc2VydmVyX3NlYXJjaC9zZWFyY2gvaW1hZ2VzL1Rvb2xNZW50b3IuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZjFiODVhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvc2VydmVyX3NlYXJjaC9zZWFyY2gvaW1hZ2VzL1Rvb2xNZW50b3IuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9zZXJ2ZXJfc2VhcmNoL3NlYXJjaC9pbWFnZXMvV2hpdGVwYXBlci5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L3NlcnZlcl9zZWFyY2gvc2VhcmNoL2ltYWdlcy9XaGl0ZXBhcGVyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTViNDgwMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L3NlcnZlcl9zZWFyY2gvc2VhcmNoL2ltYWdlcy9XaGl0ZXBhcGVyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvc2VydmVyX3NlYXJjaC9zZWFyY2gvaW1hZ2VzL1dvcmtQcm9kdWN0RGVzY3JpcHRvci5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L3NlcnZlcl9zZWFyY2gvc2VhcmNoL2ltYWdlcy9Xb3JrUHJvZHVjdERlc2NyaXB0b3IuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZWVhOGNjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvc2VydmVyX3NlYXJjaC9zZWFyY2gvaW1hZ2VzL1dvcmtQcm9kdWN0RGVzY3JpcHRvci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L3NlcnZlcl9zZWFyY2gvc2VhcmNoL2ltYWdlcy9Xb3JrUHJvZHVjdFR5cGUuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9zZXJ2ZXJfc2VhcmNoL3NlYXJjaC9pbWFnZXMvV29ya1Byb2R1Y3RUeXBlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTdlY2FjMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L3NlcnZlcl9zZWFyY2gvc2VhcmNoL2ltYWdlcy9Xb3JrUHJvZHVjdFR5cGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9zZXJ2ZXJfc2VhcmNoL3NlYXJjaC9pbWFnZXMvbmV3X3RvcGljLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvc2VydmVyX3NlYXJjaC9zZWFyY2gvaW1hZ2VzL25ld190b3BpYy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkMzkyOTIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9zZXJ2ZXJfc2VhcmNoL3NlYXJjaC9pbWFnZXMvbmV3X3RvcGljLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvc2VydmVyX3NlYXJjaC9zZWFyY2gvaW1hZ2VzL25leHQuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9zZXJ2ZXJfc2VhcmNoL3NlYXJjaC9pbWFnZXMvbmV4dC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5MjdmZDAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9zZXJ2ZXJfc2VhcmNoL3NlYXJjaC9pbWFnZXMvbmV4dC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L3NlcnZlcl9zZWFyY2gvc2VhcmNoL2ltYWdlcy9ub19uZXh0LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvc2VydmVyX3NlYXJjaC9zZWFyY2gvaW1hZ2VzL25vX25leHQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYTc4OGMxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvc2VydmVyX3NlYXJjaC9zZWFyY2gvaW1hZ2VzL25vX25leHQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9zZXJ2ZXJfc2VhcmNoL3NlYXJjaC9pbWFnZXMvbm9fcHJldmlvdXMuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9zZXJ2ZXJfc2VhcmNoL3NlYXJjaC9pbWFnZXMvbm9fcHJldmlvdXMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhODA3ODJiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvc2VydmVyX3NlYXJjaC9zZWFyY2gvaW1hZ2VzL25vX3ByZXZpb3VzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvc2VydmVyX3NlYXJjaC9zZWFyY2gvaW1hZ2VzL3ByZXZpb3VzLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvc2VydmVyX3NlYXJjaC9zZWFyY2gvaW1hZ2VzL3ByZXZpb3VzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWU5OTkwNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L3NlcnZlcl9zZWFyY2gvc2VhcmNoL2ltYWdlcy9wcmV2aW91cy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L3NlcnZlcl9zZWFyY2gvc2VhcmNoL2ltYWdlcy9zZWFyY2hyZWNvcmQuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9zZXJ2ZXJfc2VhcmNoL3NlYXJjaC9pbWFnZXMvc2VhcmNocmVjb3JkLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTYzZDgwMS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L3NlcnZlcl9zZWFyY2gvc2VhcmNoL2ltYWdlcy9zZWFyY2hyZWNvcmQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9zZXJ2ZXJfc2VhcmNoL3NlYXJjaC9pbWFnZXMvdGFiX3BlbmNpbC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L3NlcnZlcl9zZWFyY2gvc2VhcmNoL2ltYWdlcy90YWJfcGVuY2lsLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDQ0ODRjZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L3NlcnZlcl9zZWFyY2gvc2VhcmNoL2ltYWdlcy90YWJfcGVuY2lsLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvc2VydmVyX3NlYXJjaC9zZWFyY2gvc2VhcmNoX3Jlc3VsdC54c2wgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L3NlcnZlcl9zZWFyY2gvc2VhcmNoL3NlYXJjaF9yZXN1bHQueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MzdmNzRmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvc2VydmVyX3NlYXJjaC9zZWFyY2gvc2VhcmNoX3Jlc3VsdC54c2wKKysrIC9kZXYvbnVsbApAQCAtMSwxMDggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gCi0gTGljZW5zZWQgTWF0ZXJpYWxzIC0gUHJvcGVydHkgb2YgSUJNCi0gUmVzdHJpY3RlZCBNYXRlcmlhbHMgb2YgSUJNICAtIE1vZGlmaWNhdGlvbiBpcyBwcm9oaWJpdGVkLgotCi0gKGMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwNCwgMjAwNy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gCi0KLSBOb3RlIHRvIFUuUy4gR292ZXJubWVudCBVc2VycyBSZXN0cmljdGVkIFJpZ2h0czogIFVzZSwgZHVwbGljYXRpb24gb3IKLSBkaXNjbG9zdXJlIHJlc3RyaWN0ZWQgYnkgR1NBIEFEUCAgU2NoZWR1bGUgQ29udHJhY3Qgd2l0aCBJQk0gQ29ycC4KLS0tPgotPHhzbDpzdHlsZXNoZWV0IHZlcnNpb249IjEuMCIKLQl4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIKLQl4bWxuczp4YWxhbj0iaHR0cDovL3htbC5hcGFjaGUub3JnL3hhbGFuIgotCWV4Y2x1ZGUtcmVzdWx0LXByZWZpeGVzPSJ4YWxhbiI+Ci0JCi08eHNsOm91dHB1dCBtZXRob2Q9Imh0bWwiIHhhbGFuOm9taXQtbWV0YS10YWc9InllcyIgeGFsYW46dXNlLXVybC1lc2NhcGluZz0ibm8iLz4KLQkKLTx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii9TZWFyY2hSZXN1bHQiPgotCTx4c2w6dmFyaWFibGUgbmFtZT0iaW5pdFBhZ2VOdW0iIHNlbGVjdD0iQGluaXRQYWdlTnVtIi8+Ci0JPHhzbDp2YXJpYWJsZSBuYW1lPSJtYXhQYWdlTnVtIiBzZWxlY3Q9IkBtYXhQYWdlTnVtIi8+Ci0JPHhzbDp2YXJpYWJsZSBuYW1lPSJuZXh0RW5hYmxlZCIgc2VsZWN0PSJAbmV4dEVuYWJsZWQiLz4KLQk8eHNsOnZhcmlhYmxlIG5hbWU9InByZXZFbmFibGVkIiBzZWxlY3Q9IkBwcmV2RW5hYmxlZCIvPgotCTx4c2w6dmFyaWFibGUgbmFtZT0ibmV4dFRleHQiIHNlbGVjdD0iQG5leHRUZXh0Ii8+Ci0JPHhzbDp2YXJpYWJsZSBuYW1lPSJwcmV2VGV4dCIgc2VsZWN0PSJAcHJldlRleHQiLz4JCi0JPHhzbDp2YXJpYWJsZSBuYW1lPSJpbWFnZVBhdGgiIHNlbGVjdD0iQGltYWdlUGF0aCIvPgotCTx4c2w6dmFyaWFibGUgbmFtZT0ic2VhcmNoU3RyaW5nIiBzZWxlY3Q9IkBzZWFyY2hTdHJpbmciLz4JCi0JPHhzbDp2YXJpYWJsZSBuYW1lPSJuZXh0SHJlZiIgc2VsZWN0PSJAbmV4dEhyZWYiLz4JCi0JPHhzbDp2YXJpYWJsZSBuYW1lPSJwcmV2SHJlZiIgc2VsZWN0PSJAcHJldkhyZWYiLz4JCi0JPHhzbDp2YXJpYWJsZSBuYW1lPSJpY29uIiBzZWxlY3Q9IkBpY29uIi8+CQotCi0JPGRpdiBjbGFzcz0ic2VhcmNoUmVzdWx0UGFuZSI+Ci0JCTx0YWJsZSBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgd2lkdGg9IjEwMCUiID4KLQkJCTx0ciBhbGlnbj0idG9wIj4KLQkJCQk8dGQgYWxpZ249InJpZ2h0IiBub3dyYXA9Im5vd3JhcCI+Ci0JCQkJCSg8Yj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGluaXRQYWdlTnVtIi8+IC0gPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBtYXhQYWdlTnVtIi8+PC9iPjx4c2w6dGV4dD4gLyA8L3hzbDp0ZXh0Pjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAdG90YWxIaXRzIi8+KQotCQkJCQk8eHNsOmNob29zZT4KLQkJCQkJCTx4c2w6d2hlbiB0ZXN0PSIkcHJldkVuYWJsZWQgPSAndHJ1ZSciPgotCQkJCQkJCTxpbWcgb25jbGljaz0iamF2YXNjcmlwdDpnZXRQcmV2TmV4dFBhZ2UoJ3skcHJldkhyZWZ9Jyk7IHJldHVybiBmYWxzZTsiIG9ubW91c2VvdmVyPSJzdHlsZS5jdXJzb3I9J3BvaW50ZXInOyIgYWx0PSJ7JHByZXZUZXh0fSIgc3JjPSJ7JGltYWdlUGF0aH1wcmV2aW91cy5naWYiLz48eHNsOnRleHQ+IDwveHNsOnRleHQ+Ci0JCQkJCQk8L3hzbDp3aGVuPgotCQkJCQkJPHhzbDpvdGhlcndpc2U+Ci0JCQkJCQkJPGltZyBvbmNsaWNrPSIiIG9ubW91c2VvdmVyPSJzdHlsZS5jdXJzb3I9J3BvaW50ZXInOyIgYWx0PSJ7JHByZXZUZXh0fSIgc3JjPSJ7JGltYWdlUGF0aH1ub19wcmV2aW91cy5naWYiLz48eHNsOnRleHQ+IDwveHNsOnRleHQ+Ci0JCQkJCQk8L3hzbDpvdGhlcndpc2U+Ci0JCQkJCTwveHNsOmNob29zZT4KLQkJCQkJPHhzbDpjaG9vc2U+Ci0JCQkJCQk8eHNsOndoZW4gdGVzdD0iJG5leHRFbmFibGVkID0gJ3RydWUnIj4KLQkJCQkJCQk8aW1nIG9uY2xpY2s9ImphdmFzY3JpcHQ6Z2V0UHJldk5leHRQYWdlKCd7JG5leHRIcmVmfScpOyByZXR1cm4gZmFsc2U7IiBvbm1vdXNlb3Zlcj0ic3R5bGUuY3Vyc29yPSdwb2ludGVyJzsiIGFsdD0ieyRuZXh0VGV4dH0iIHNyYz0ieyRpbWFnZVBhdGh9bmV4dC5naWYiLz4KLQkJCQkJCTwveHNsOndoZW4+Ci0JCQkJCQk8eHNsOm90aGVyd2lzZT4KLQkJCQkJCQk8aW1nIG9uY2xpY2s9IiIgb25tb3VzZW92ZXI9InN0eWxlLmN1cnNvcj0ncG9pbnRlcic7IiBhbHQ9InskbmV4dFRleHR9IiBzcmM9InskaW1hZ2VQYXRofW5vX25leHQuZ2lmIi8+PHhzbDp0ZXh0PiA8L3hzbDp0ZXh0PgotCQkJCQkJPC94c2w6b3RoZXJ3aXNlPgotCQkJCQk8L3hzbDpjaG9vc2U+Ci0JCQkJCSYjMTYwOwkmIzE2MDsKLQkJCQk8L3RkPgkJCQotCQkJPC90cj4KLQkJPC90YWJsZT4JCi0JPC9kaXY+PGJyIC8+Ci0JPHhzbDpmb3ItZWFjaCBzZWxlY3Q9IlNlYXJjaEhpdCI+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0idXJsIiBzZWxlY3Q9IkB1cmwiLz4KLQkJPGRpdiBjbGFzcz0ic2VhcmNoSGl0Ij4KLQkJCTx0YWJsZSBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgPgotCQkJCTx0cj4KLQkJCQkJPHRkIGFsaWduPSJyaWdodCI+Ci0JCQkJCQk8eHNsOmNob29zZT4KLQkJCQkJCQk8eHNsOndoZW4gdGVzdD0iQGljb24gIT0gJyciPgotCQkJCQkJCQk8aW1nIHNyYz0ieyRpbWFnZVBhdGh9e0BpY29ufSIgYWx0PSIiLz4KLQkJCQkJCQk8L3hzbDp3aGVuPgotCQkJCQkJCTx4c2w6b3RoZXJ3aXNlPgotCQkJCQkJCQk8aW1nIHNyYz0ieyRpbWFnZVBhdGh9c2VhcmNocmVjb3JkLmdpZiIgYWx0PSIiLz4KLQkJCQkJCQk8L3hzbDpvdGhlcndpc2U+Ci0JCQkJCQk8L3hzbDpjaG9vc2U+CQkJCQkJCi0JCQkJCTwvdGQ+Ci0JCQkJCTx0ZCBhbGlnbj0ibGVmdCI+Ci0JCQkJCQk8YSBocmVmPSJ7JHVybH0iIHRhcmdldD0ib3J5X2RvYyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkB0aXRsZSIvPjwvYT4KLQkJCQkJPC90ZD4KLQkJCQk8L3RyPgotCQkJCTx0cj4KLQkJCQkJPHRkIGFsaWduPSJyaWdodCI+PC90ZD4KLQkJCQkJPHRkIGFsaWduPSJsZWZ0Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHN1bW1hcnkiLz48L3RkPgotCQkJCTwvdHI+Ci0JCQk8L3RhYmxlPgotCQk8L2Rpdj4KLQk8L3hzbDpmb3ItZWFjaD4KLQk8YnIvPgotCTx0YWJsZSBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgd2lkdGg9IjEwMCUiPgotCQk8dHIgdmFsaWduPSJtaWRkbGUiPgotCQkJPHRkIGFsaWduPSJyaWdodCIgbm93cmFwPSJub3dyYXAiPgkJCQkKLQkJCQk8eHNsOmNob29zZT4KLQkJCQkJPHhzbDp3aGVuIHRlc3Q9IiRwcmV2RW5hYmxlZCA9ICd0cnVlJyI+Ci0JCQkJCQk8aW1nIG9uY2xpY2s9ImphdmFzY3JpcHQ6Z2V0UHJldk5leHRQYWdlKCd7JHByZXZIcmVmfScpOyByZXR1cm4gZmFsc2U7IiBvbm1vdXNlb3Zlcj0ic3R5bGUuY3Vyc29yPSdwb2ludGVyJzsiIGFsdD0ieyRwcmV2VGV4dH0iIHNyYz0ieyRpbWFnZVBhdGh9cHJldmlvdXMuZ2lmIi8+PHhzbDp0ZXh0PiA8L3hzbDp0ZXh0PgotCQkJCQk8L3hzbDp3aGVuPgotCQkJCQk8eHNsOm90aGVyd2lzZT4KLQkJCQkJCTxpbWcgb25jbGljaz0iIiBvbm1vdXNlb3Zlcj0ic3R5bGUuY3Vyc29yPSdwb2ludGVyJzsiIGFsdD0ieyRwcmV2VGV4dH0iIHNyYz0ieyRpbWFnZVBhdGh9bm9fcHJldmlvdXMuZ2lmIi8+PHhzbDp0ZXh0PiA8L3hzbDp0ZXh0PgotCQkJCQk8L3hzbDpvdGhlcndpc2U+Ci0JCQkJPC94c2w6Y2hvb3NlPgotCQkJCTx4c2w6Y2hvb3NlPgotCQkJCQk8eHNsOndoZW4gdGVzdD0iJG5leHRFbmFibGVkID0gJ3RydWUnIj4KLQkJCQkJCTxpbWcgb25jbGljaz0iamF2YXNjcmlwdDpnZXRQcmV2TmV4dFBhZ2UoJ3skbmV4dEhyZWZ9Jyk7IHJldHVybiBmYWxzZTsiIG9ubW91c2VvdmVyPSJzdHlsZS5jdXJzb3I9J3BvaW50ZXInOyIgYWx0PSJ7JG5leHRUZXh0fSIgc3JjPSJ7JGltYWdlUGF0aH1uZXh0LmdpZiIvPgotCQkJCQk8L3hzbDp3aGVuPgotCQkJCQk8eHNsOm90aGVyd2lzZT4KLQkJCQkJCTxpbWcgb25jbGljaz0iIiBvbm1vdXNlb3Zlcj0ic3R5bGUuY3Vyc29yPSdwb2ludGVyJzsiIGFsdD0ieyRuZXh0VGV4dH0iIHNyYz0ieyRpbWFnZVBhdGh9bm9fbmV4dC5naWYiLz48eHNsOnRleHQ+IDwveHNsOnRleHQ+Ci0JCQkJCTwveHNsOm90aGVyd2lzZT4KLQkJCQk8L3hzbDpjaG9vc2U+Ci0JCQkJJiMxNjA7CSYjMTYwOwotCQkJPC90ZD4JCi0JCTwvdHI+Ci0JPC90YWJsZT4gICAgCi08L3hzbDp0ZW1wbGF0ZT4KLTwveHNsOnN0eWxlc2hlZXQ+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9zcHNjcmVlbi5odG0gYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L3Nwc2NyZWVuLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTdhZDZhOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L3Nwc2NyZWVuLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0JImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotCi0KLTwhLS0gUlBXIE1FVEEgREFUQSBTVEFSVCAtLQotCi0KLS0tIFJQVyBNRVRBIERBVEEgRU5EIC0tPgotCi08aHRtbCBsYW5nPSJlbiIgeG1sOmxhbmc9ImVuIj4KLQotPGhlYWQ+Ci08bGluayByZWw9IlN0eWxlU2hlZXQiIGhyZWY9InJvcC5jc3MiIHR5cGU9InRleHQvY3NzIi8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIi8+Ci08dGl0bGU+U3BsYXNoIFNjcmVlbjwvdGl0bGU+Ci08L2hlYWQ+Ci0KLTxib2R5PgotCi0KLQotPHAgYWxpZ249ImNlbnRlciI+Jm5ic3A7PC9wPgotPGgyIGFsaWduPSJjZW50ZXIiPlBsZWFzZSB3YWl0IHdoaWxlIHRoZSB0cmVlIGJyb3dzZXIgaXMgYmVpbmcgbG9hZGVkLi4uPGJyLz48L2gyPgotPHAgYWxpZ249ImNlbnRlciI+Jm5ic3A7PC9wPgotPCEtLQotPHAgYWxpZ249ImNlbnRlciI+PGltZyBzcmM9ImltYWdlcy9zcGxhc2guZ2lmIiBhbHQ9IldlbGNvbWUgdG8gdGhlIEVjbGlwc2UgUHJvY2VzcyBGcmFtZXdvcmsiLz48L3A+Ci0gLS0+Ci08YnIvPgotPGJyLz4KLQotCi08L2JvZHk+Ci0KLTwvaHRtbD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvc3R5bGVzaGVldHMvY29tbW9uLmNzcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvc3R5bGVzaGVldHMvY29tbW9uLmNzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDkwYTBhNS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L3N0eWxlc2hlZXRzL2NvbW1vbi5jc3MKKysrIC9kZXYvbnVsbApAQCAtMSw1OTQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqLwotCi1hCi17CQotCWNvbG9yOiAjMzM2Njk5OwotfQotCi1hLnRvcHJpZ2h0bmF2OmFjdGl2ZSB7Ci0JY29sb3I6ICM5OUNDQ0M7Ci19Ci0KLWEudG9wcmlnaHRuYXZncmV5OmFjdGl2ZSB7Ci0JY29sb3I6ICNDQzAwMDA7Ci19Ci0KLQotYS5iYXNpYwoteyAJCi0gICAgY29sb3I6ICMwMDAwMDA7Ci19Ci0JCi1hLnRvcHJpZ2h0bmF2Z3JleTpob3ZlciB7Ci0JY29sb3I6ICNDQzAwMDA7Ci19IAotYS50b3ByaWdodG5hdjpob3ZlciB7Ci0JY29sb3I6ICM5OUNDQ0M7Ci19IC8qIGZvbnQgZm9yIGFjdGlvbiBvbiBjb250ZW50IHBhZ2UgdXN1YWxseSBsb2NhdGVkIG9uIHRvcCBvZiBwYWdlIDtpZS4sIHNlbGVjdCBhbGwqLwotYS5hY3Rpb24KLXsgIAotCWNvbG9yOiAjMzMzMzMzOwotCWZvbnQtc2l6ZTogMTFweDsJCi19IAotCi1hLmNvcHlyaWdodAoteyAJCi0gICBjb2xvcjogIzMzNjY5OTsgICAgCi0JZm9udC1zaXplIDogMTBweDsKLSB9ICAKLSAKLWEubmF2dHJlZQoteyAJCi0gICAgY29sb3I6ICMwMDAwMDA7Ci0JZm9udC1zaXplIDogMTFweDsKLQlmb250LXdlaWdodDogNjAwOwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0gCi0gCi0vKiBiZWNhdXNlIG9mIGFuIGludGVydmVuaW5nIGxpbmsgdGFnLCB0ZXh0IG9wdGlvbnMgd2VyZSBhdHRhY2hlZCB0byB0aGlzIGVsZW1lbnQgaW5zdGVhZCBvZiB0aGUgb3V0ZXJtb3N0IGNlbGwgKi8gCi1hLmFjdGl2ZXRhYgotIHsgCi0gCWNvbG9yOiAjMDAwMDAwOwotIAlmb250LXNpemU6IDEycHg7Ci0gIAl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci0gIH0KLSAKLSAvKiBiZWNhdXNlIG9mIGFuIGludGVydmVuaW5nIGxpbmsgdGFnLCB0ZXh0IG9wdGlvbnMgd2VyZSBhdHRhY2hlZCB0byB0aGlzIGVsZW1lbnQgaW5zdGVhZCBvZiB0aGUgb3V0ZXJtb3N0IGNlbGwgKi8KLSBhLm5vbmFjdGl2ZXRhYgotIHsKLQljb2xvcjogI2I0YjRiNDsKLQlmb250LXNpemU6IDEycHg7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotIAotIGEucmVkCi17Ci0JY29sb3I6ICNjYzMzMDA7Ci19Ci0KLWEudG9wYmFyCi17Ci0gIGNvbG9yOiAjNjY2NjY2OwotICBmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLSAgZm9udC1zaXplOiAxMXB4OwotICB0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLSAvKiBiZ2NvbG9yICBmb3IgYWN0aW9uIHRleHQgdXN1YWxseSBsb2NhdGVkIG9uIHRvcCBvZiBwYWdlO2llLiwgc2VsZWN0IGFsbCovCi0uYWN0aW9uYmcKLXsgCi1iYWNrZ3JvdW5kLWNvbG9yOiAjZWZlZmVmOwotIH0KLSAKLS5iZ2JsYWNrCi17IAotIGJhY2tncm91bmQtY29sb3I6ICMwMDAwMDA7Ci0gfQotIAotLmJnd2hpdGUKLXsgCi0gYmFja2dyb3VuZC1jb2xvcjogI2ZmZmZmZjsKLSB9IAotICAKLWJvZHkgCi17Ci0JYmFja2dyb3VuZC1jb2xvciA6ICNmZmZmZmY7ICAgCi0JY29sb3I6ICMzMzMzMzM7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JdGV4dC1kZWNvcmF0aW9uIDogbm9uZTsJCi19Ci0KLS5ib2xkCi17IAotICAgZm9udC13ZWlnaHQgOiA2MDA7Ci0gfQotCi0gLmJvdHRvbWJhcmRyawoteyAKLQliYWNrZ3JvdW5kLWNvbG9yOiAjMDAzMzY2OwotIH0KLQotCi0uYm90dG9tYmFybGlnaHQKLXsgCi0JYmFja2dyb3VuZC1jb2xvcjogIzMzOTljYzsKLSB9Ci0KLS5ib3R0b21iYXJzaGFkb3cKLXsgCi0JYmFja2dyb3VuZC1jb2xvcjogIzAwMDAwMDsKLSB9Ci0gCi0uYnV0dG9ucwotIHsKLSAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZWZlZmVmOwotICAgIGNvbG9yOiAjMDAwMDAwOwotCWZvbnQtZmFtaWx5OiBWZXJkYW5hLCBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOwkKLQlmb250LXNpemU6IDEwcHg7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwkKLX0KLQotLmNvZGUKLXsgCi0gICBmb250LWZhbWlseTogQ291cmllciBOZXcsIENvdXJpZXIsIG1vbm87ICAgCi0gICBmb250LXNpemU6IDEycHg7Ci0gfQotCi0gLyptZWRpdW0gZ3JleSBjZWxsIGJhY2tncm91bmQqLwotLmNvbnRlbnRib3JkZXIKLSB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI2RlZGVkZTsKLX0KLQotIC8qIGZvbnQgZm9yIHJlZ3VsYXIgY29udGVudCB0ZXh0ICovCi0uY29tbWVudHMKLXsgCQotCWZvbnQtc2l6ZTogMTFweDsJCi0JYmFja2dyb3VuZC1jb2xvcjogI2VmZWZlZjsKLX0KLQotLmNvcHlyaWdodAoteyAKLQljb2xvciA6ICM5OTk5OTk7Ci0JZm9udC1zaXplIDogMTBweDsKLSB9Ci0gCi0gLmRpYWxnYnhzaGFkb3cyIAoteyAgCi1iYWNrZ3JvdW5kLWNvbG9yOiAjODQ4NDg0OwotfQotCi0gLmRpYWxvZ3VlYm94Ym9yZGVyCi17IAotIGJhY2tncm91bmQtY29sb3I6ICMzMzMzMzMKLSB9Ci0gCi0gLmRpYWxvZ3VlYm94YmcgCi17ICBiYWNrZ3JvdW5kLWNvbG9yOiAjZDJkMmQyCi19Ci0gCi0uZGlhbG9ndWVib3hoaWdobGlnaHQgCi0gewotCWJhY2tncm91bmQtY29sb3I6ICNlZmVmZWY7Ci19Ci0KLSAuZGlhbG9ndWVib3hNZWRpdW0KLXsgCi0gYmFja2dyb3VuZC1jb2xvcjogIzhiOGI4YgotIH0KLSAKLSAuZGlhbG9ndWVib3hUaXRsZQotIHsJICAgCi0JZm9udC1zaXplOiAxNHB4OwotCWZvbnQtd2VpZ2h0IDogYm9sZDsKLX0KLSAKLS5kaXZpZGVyCi0gewotCWJhY2tncm91bmQtY29sb3I6ICNmNmY5ZjA7Ci19Ci0gCi1oMQoteyAgCi0JY29sb3I6ICMzMzMzMzM7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxN3B4OwkKLQlmb250LXdlaWdodDogNjAwOwotfQotCi0vKm1haW4gaGVhZGVyIGZvciBmcmFtZSBuYXZpZ2F0aW9uLCBpZSwgY2xlYXJjYXNlIG1lcmdlIGZpbGVzKi8KLS5oZWFkZXJtYWluCi17ICAKLQljb2xvcjogIzMzMzMzMzsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDE3cHg7CQotCWZvbnQtd2VpZ2h0OiA2MDA7Ci19Ci0KLS8qcmVwbGFjaW5nIHNpZGVtZW51X2JvbGRsZWZ0IG1vdmluZyBmb3J3YXJkKi8KLS5uYXZsZWZ0Ym9sZAotewotCWNvbG9yOiAjMDAwMDAwOwotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTFweDsKLQlmb250LXdlaWdodCA6IDYwMDsKLQl0ZXh0LWRlY29yYXRpb24gOiBub25lOwotfQotCi0vKmxlZnQgbmF2IHN1Ym1lbnUqLwotLm5hdmxlZnRzdWIKLXsKLQljb2xvcjogIzY3Njc2NzsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDExcHg7Ci0JZm9udC13ZWlnaHQgOiA0MDA7Ci0JbGluZS1oZWlnaHQgOiAxMzUlOwotCXRleHQtZGVjb3JhdGlvbiA6IG5vbmU7Ci19Ci0KLS8qLmxlZnRtZW51YWN0aXZlKi8KLS5zaWRlbWVudV9ib2xkbGVmdF9zZWxlY3RlZAotewotCWNvbG9yOiAjY2MwMDAwOwotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTFweDsKLQlmb250LXdlaWdodCA6IDYwMDsKLQl0ZXh0LWRlY29yYXRpb24gOiBub25lOwotfQotCi0vKnVzZSBuYXZsZWZ0Ym9sZCBpbnN0ZWFkIHRvIHdvcmsgaW4gTlM2Ki8KLS5zaWRlbWVudV9ib2xkbGVmdAotewotCWNvbG9yOiAjMDAwMDAwOwotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTFweDsKLQlmb250LXdlaWdodCA6IDYwMDsKLQl0ZXh0LWRlY29yYXRpb24gOiBub25lOwotfQotCi0uc2lkZW1lbnVfYnVsbGV0X2NvbG9yZWQKLSB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI2NkMzMwMTsKLX0KLQotLmxlZnRtZW51Ci0gewotCWJhY2tncm91bmQtY29sb3I6ICM5OTk5OTk7Ci19Ci0KLS5zaWRlbWVudV9idWxsZXRfZ3JleQotIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjOTk5OTk5OwotfQotCi0uc2lkZW1lbnVfc3RhbmRhcmQKLXsKLQljb2xvcjogIzY3Njc2NzsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDExcHg7Ci0JZm9udC13ZWlnaHQgOiA0MDA7Ci0JbGluZS1oZWlnaHQgOiAxMzUlOwotCXRleHQtZGVjb3JhdGlvbiA6IG5vbmU7Ci19Ci0KLS5zaWRlbWVudV9zdGFuZGFyZF9zZWxlY3RlZAotewotCWNvbG9yOiAjY2MwMDAwOwotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTFweDsKLQlmb250LXdlaWdodCA6IDQwMDsKLQlsaW5lLWhlaWdodCA6IDEzNSU7Ci0JdGV4dC1kZWNvcmF0aW9uIDogbm9uZTsKLX0KLQotLnRleHRncmF5Ci17ICAKLQljb2xvcjogIzk5OTk5OTsJCi19Ci0KLS5oMQoteyAgCi0JY29sb3I6ICMzMzMzMzM7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAyMHB4OwkKLQlmb250LXdlaWdodDogNDAwOwotfQotCi0uaGVhZGVyYmx1ZQotewotCWNvbG9yOiAjMDA2Njk5OwkKLQlmb250LXdlaWdodCA6IDYwMDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLWkKLXsKLQlmb250LXN0eWxlIDogaXRhbGljOwotfQotCi0uaWNvbmJvcmRlcgoteyAKLSBiYWNrZ3JvdW5kLWNvbG9yOiAjZGVkZWRlOwotfQotCi1pbnB1dAotewotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwkKLQlmb250LXNpemU6IDEycHg7Ci19IAotCi1pbnB1dC5weDI1Ci17Ci0gICAgd2lkdGg6IDI1cHgKLX0KLQotaW5wdXQucHg0NQotewotICAgIHdpZHRoOiA0NXB4Ci19Ci0KLS8qCi0xLGJ1c2luZXNzIHN0YW5kYXJkIG11bHRpbGluZSBpbnB1dCBib3ggCi0yLHRoaXMgc3R5bGUgb25seSBhY3RpdmF0ZSBpbiBJRSwgYnV0IE5TCi0qLwotaW5wdXQubWF4NTAKLXsKLQl3aWR0aDogMzYwcHg7Ci19Ci0KLWlucHV0LnB4ODUKLXsKLSAgICB3aWR0aDogODVweAotfQotCi1pbnB1dC5weDEzNQotewotICAgIHdpZHRoOiAxMzVweAotfQotCi0KLWlucHV0LnB4MTU1Ci17Ci0gICAgd2lkdGg6IDE1NXB4Ci19Ci0KLWlucHV0LnB4MjMwCi17Ci0gICAgd2lkdGg6IDIzMHB4Ci19Ci0KLQotaW5wdXQucHgzMDUKLXsKLSAgICB3aWR0aDogMzA1cHg7Ci19Ci0KLS5sZWZ0bmF2aGVhZCAKLSB7Ci0gICBjb2xvcjogIzAwMDAwMDsKLQlmb250LXdlaWdodDogYm9sZDsJCi0JZm9udC1zaXplOiAxM3B4OwkKLX0gCi0KLS5sZWZ0bmF2bGFiZWwKLXsKLWNvbG9yOiAjMDAwMDAwOwotZm9udC13ZWlnaHQgOiA2MDA7Ci1mb250LXNpemU6IDExcHg7Ci0gfQotIAotLyp0b3BuYXYqLyAKLS5taWRiYXJsaWdodAoteyAKLQliYWNrZ3JvdW5kLWNvbG9yOiAjMzM5OWNjOwotIH0KLQotLyp0b3BuYXYqLyAKLSAubWlkYmFybWVkCi17IAotCWJhY2tncm91bmQtY29sb3I6ICMwMDY2OTk7Ci0gfQotICAKLS5wYWdlYm9sZAoteyAKLQljb2xvcjogIzAwMDAwMDsKLQlmb250LXdlaWdodCA6IDYwMDsJCi0gfQotCi0gLypmb250IGZvciBwcmV2aW91cyAmIG5leHQgaW4gcGFnaW5hdGlvbiovCi0ucGFnZXN0ZXBzCi17IAotCWNvbG9yOiAjNjc2NzY3OwkKLQlmb250LXNpemU6IDExcHg7Ci0JIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKLSB9Ci0KLSAvKnVzZSBmb3IgcG9wdXBtZW51cyBidXQgbm90IGluY2x1ZGluZyB0b3AgbmF2Ki8KLS5wb3B1cHRleHQKLXsKLQljb2xvcjogIzMzMzMzMzsKLQlmb250LXNpemU6IDExcHg7Ci0JdGV4dC1kZWNvcmF0aW9uIDogbm9uZTsKLX0gCi0gCi1zZWxlY3QKLXsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsJCi0JZm9udC1zaXplOiAxMnB4OwotfQotCi1zZWxlY3Quc2VscHgxNDQKLXsKLSAgICB3aWR0aDogMTQ0cHg7Ci19Ci0KLS5zbWFsbHRleHQKLXsKLQlmb250LWZhbWlseTogVmVyZGFuYSwgQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDEwcHg7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotCWNvbG9yOiAjMDAwMDAwOwotfQotCi0udGFibGVoZWFkZXIKLXsgIAotCWNvbG9yOiAjMzMzMzMzOwkKLQlmb250LXNpemU6IDEzcHg7CQotICAgIGZvbnQtd2VpZ2h0OiBib2xkCi19Ci0KLS8qIGZvbnQgZm9yIHJlZ3VsYXIgY29udGVudCB0ZXh0ICovCi10ZAotewotICBjb2xvcjogIzMzMzMzMzsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDEycHg7CQotfQotCi10ZC5hY3RpdmV0YWIKLS8qIGJlY2F1c2Ugb2YgYW4gaW50ZXJ2ZW5pbmcgbGluayB0YWcsIHRleHQgb3B0aW9ucyB3ZXJlIGF0dGFjaGVkIHRvIGEgc2ltaWxhciBlbGVtZW50IGZvciBsaW5rcyAqLwotIHsgCi0gCWJhY2tncm91bmQtY29sb3I6ICNjNGM0YzQ7Ci0gIH0KLSAKLSB0ZC5ub25hY3RpdmV0YWIKLSAvKiBiZWNhdXNlIG9mIGFuIGludGVydmVuaW5nIGxpbmsgdGFnLCB0ZXh0IG9wdGlvbnMgd2VyZSBhdHRhY2hlZCB0byBhIHNpbWlsYXIgZWxlbWVudCBmb3IgbGlua3MgKi8KLSB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI2VmZWZlZjsKLX0KLQotLnRkTGlnaHQKLSB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI2VmZWZlZjsKLX0KLQotLypkYXJrIGdyZXkgY2VsbCBiYWNrZ3JvdW5kIGFuZCBib2xkIHRleHQgKi8KLSAudGREYXJrQm9sZAotIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjY2NjY2NjOwotCWZvbnQtd2VpZ2h0IDogNjAwOwotfQotCi0udG9wZnJhbWViZyAKLXsgIGJhY2tncm91bmQtY29sb3I6ICNkMmQyZDI7Ci19Ci0KLS50b3BmcmFtZWJnR3JleWVkCi17ICBiYWNrZ3JvdW5kLWNvbG9yOiAjZWRlZGVkOwotfQotCi0udG9wZnJhbWVoaWdobGlnaHQgCi17ICAKLWJhY2tncm91bmQtY29sb3I6ICNiNmI1YjU7Ci19Ci0KLS50b3BmcmFtZWhpZ2hsaWdodEdyZXllZAoteyAgCi1iYWNrZ3JvdW5kLWNvbG9yOiAjZTFlMWUxOwotfQotCi0udG9wZnJhbWVzaGFkb3cgCi17ICAKLWJhY2tncm91bmQtY29sb3I6ICM4NDg0ODQ7Ci19Ci0KLS50b3BmcmFtZXNoYWRvd0dyZXllZAoteyAgCi1iYWNrZ3JvdW5kLWNvbG9yOiAjY2VjZWNlOwotfQotCi0udG9wZnJhbWVoaWdobGlnaHQyIAoteyAKLSBiYWNrZ3JvdW5kLWNvbG9yOiAjZWZlZmVmOwotIH0KLSAKLSAudG9wZnJhbWVoaWdobGlnaHQyR3JleWVkCi17IAotIGJhY2tncm91bmQtY29sb3I6ICNmOWY5Zjk7Ci0gfSAKLSAKLSAudG9wZnJhbWVsb2dvYmcgCi17ICAKLWJhY2tncm91bmQtY29sb3I6ICMwMDY2OTk7Ci19Ci0KLS50b3BmcmFtZWxvZ29iZ0dyZXllZAoteyAgCi1iYWNrZ3JvdW5kLWNvbG9yOiAjOTljMmQ2OwotfQotCi0udG9wbGVmdG5hdgotewkKLSAgICBmb250LWZhbWlseTogVmVyZGFuYSwgQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDEwcHg7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotCWNvbG9yOiAjMDAwMDAwOwotfQotCi0udG9wbGVmdG5hdkdyZXllZAotewkKLSAgIGZvbnQtZmFtaWx5OiBWZXJkYW5hLCBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotICAgY29sb3I6ICM5OTk5OTk7Ci0JZm9udC1zaXplOiAxMHB4OwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLQl9Ci0KLS50b3BsZWZ0bmF2Ym9sZCAKLXsgCi1mb250LWZhbWlseTogVmVyZGFuYSwgQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsKLWZvbnQtc2l6ZTogMTBweDsgCi10ZXh0LWRlY29yYXRpb246IG5vbmU7IAotZm9udC13ZWlnaHQ6IGJvbGQ7Ci19Ci0KLS50b3BsZWZ0bmF2Ym9sZEdyZXllZAoteyAKLWZvbnQtZmFtaWx5OiBWZXJkYW5hLCBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOyAKLWZvbnQtc2l6ZTogMTBweDsgCi1jb2xvcjogIzk5OTk5OTsKLXRleHQtZGVjb3JhdGlvbjogbm9uZTsgCi1mb250LXdlaWdodDogYm9sZDsKLX0KLQotLnRvcHJpZ2h0bmF2Ci17Ci0JZm9udC1mYW1pbHk6IFZlcmRhbmEsIEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxMHB4OwotCWNvbG9yOiAjZmZmZmZmOwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotLnRvcHJpZ2h0bmF2Z3JleQotewotCWZvbnQtZmFtaWx5OiBWZXJkYW5hLCBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTBweDsKLQljb2xvcjogIzAwMDAwMDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLS50b3BiYXJkaXZpZGVyCi0geyAKLSBiYWNrZ3JvdW5kLWNvbG9yOiAjMzM5OWNjIAotIH0KLQotIC50b3BiYXJkaXZpZGVyR3JleWVkCi0geyAKLSBiYWNrZ3JvdW5kLWNvbG9yOiAjYWRkNmViCi0gfSAgCi0KLSB0ci5iZ21pZGZyYW1lCi0gLyogdGhpcyB3YXMgaW5pdGlhbGx5IGRlY2xhcmVkIHRoZSBzYW1lIGNvbG91ciBhcyB0aGUgY2xhc3MgdG9wZnJhbWUgYmcgYnV0IGJlY2F1c2UgaXQgbGllcyBpbiBhIGRpZmZlcmVudCBmdW5jdGlvbmFsIGFyZWEsIGhhcyBiZWVuIHJlY3JlYXRlZCBoZXJlICAqLwotewotCWJhY2tncm91bmQtY29sb3I6ICNkMmQyZDI7Ci19Ci0gCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L3N0eWxlc2hlZXRzL2NvbW1vbl9hZHYuY3NzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9zdHlsZXNoZWV0cy9jb21tb25fYWR2LmNzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTQ1OTJhNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L3N0eWxlc2hlZXRzL2NvbW1vbl9hZHYuY3NzCisrKyAvZGV2L251bGwKQEAgLTEsNjEyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKgotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKi8KLQotLyptdXN0IGFkZCBmb250IHR5cGUgaWYgY2xhc3MgaXMgYmVpbmcgdXNlZCBhcyBib3RoIGxpbmsgYW5kICBuby1saW5rIHRleHQqLwotCi1hIHsKLQljb2xvcjogIzMzNjY5OTsKLX0KLQotLyogYWN0aW9uIHRleHQgdXN1YWxseSBsb2NhdGVkIG9uIHRvcCBvZiBwYWdlO2llLiwgc2VsZWN0IGFsbCovCi1hLmFjdGlvbmxpbmsgewotCWNvbG9yOiAjMzM2Njk5OwotCWZvbnQtc2l6ZTogMTFweDsKLQl0ZXh0LWRlY29yYXRpb24gOiBub25lOwotfQotCi0vKiBmb250IGZvciBhY3Rpb247aWUuLCBzZWxlY3QgYWxsKi8KLWEuYWN0aW9uc2VsZWN0b3IgewotCWNvbG9yOiAjMDAwMDAwOwotCWZvbnQtc2l6ZTogMTFweDsKLX0KLQotYS50b3ByaWdodG5hdjphY3RpdmUgewotCWNvbG9yOiAjOTlDQ0NDOwotfQotCi1hLnRvcHJpZ2h0bmF2Z3JleTphY3RpdmUgewotCWNvbG9yOiAjQ0MwMDAwOwotfQotCi0KLWEuYmFzaWMgewotCWNvbG9yOiAjMDAwMDAwOwotfQotCi1hLmJyZWFkY3J1bWJzIHsJCi0JY29sb3I6ICMwMDAwMDA7Ci0JZm9udC1zaXplOiAxMXB4OwotfQotCi0vKiBmb3Igbm9uLWltYWdlIGJ1dHRvbnMsIGZvciBpbnRlcm5hdGlvbmFsaXphdGlvbiAqLwotYS5idXR0b24gewotCWNvbG9yOiAjMzMzMzMzOwotCWZvbnQtZmFtaWx5OiB2ZXJkYW5hLCBoZWx2ZXRpY2EsIGFyaWFsLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTBweDsKLQlmb250LXdlaWdodDogNjAwOwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotLyogRGVzY29wZWQsIEl0J3Mgbm90IHVzZWQgaW4gY3VycmVudCBwcm9qZWN0cywgdG8gYmUgYXJjaGl2ZWQgYWZ0ZXIgNiBtb250aHMuIEFsaSBSb2tuaSwgMDkvMDkvMDIgKi8KLS8qIGZvciBjb250ZXh0IHRvb2xiYXIgYnV0dG9ucyBpbiBNdWx0aXNpdGUsIGZvciBpbnRlcm5hdGlvbmFsaXphdGlvbiAqLwotYS5idXR0b24yIHsKLQljb2xvcjogIzAwMDAwMDsKLQlmb250LXNpemUgOiAxMXB4OwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsJCi19Ci0KLWEuYnV0dG9uOmFjdGl2ZSB7Ci0JY29sb3I6ICMzMzMzMzM7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi0vKiBmb3Igbm9uLWltYWdlIGJ1dHRvbnMsIGZvciBpbnRlcm5hdGlvbmFsaXphdGlvbiAqLwotYS5idXR0b246aG92ZXIgewotCWNvbG9yOiAjMzMzMzMzOwotfQotCi1hLmNvcHlyaWdodCB7Ci0JY29sb3I6ICM5OTk5OTk7Ci0JZm9udC1zaXplOiAxMHB4OwotfSAKLQotLyphY3Rpb25iYXIgb24gd2hpdGUgYmFja2dyb3VuZCovCi0uYWN0aW9uc2VsZWN0MiB7Ci0JY29sb3I6ICMwMDAwMDA7Ci0JZm9udC1zaXplOiAxMXB4OwotfQotCi0vKmFjdGlvbmJhciBhcHBlYXJzIG9uIHRvcCBhbmQvb3IgYm90dG9tIG9mIHBhZ2UqLwotLmFjdGlvbnNlbGVjdG9yIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjRTlFOUU5OwotCWNvbG9yOiAjMDAwMDAwOwotCWZvbnQtc2l6ZTogMTFweDsKLX0KLQotLypjb2x1bW4gaGVhZGluZ3MqLwotYS5mb3JtdGJsaGVhZCB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI0NDQ0NDQzsKLQljb2xvcjogIzAwMDAwMDsKLQlmb250LXNpemU6IDExcHg7Ci0JZm9udC13ZWlnaHQgOiA2MDA7Ci19Ci0KLWEudG9wcmlnaHRuYXZncmV5OmhvdmVyIHsKLQljb2xvcjogI0NDMDAwMDsKLX0gCi1hLnRvcHJpZ2h0bmF2OmhvdmVyIHsKLQljb2xvcjogIzk5Q0NDQzsKLX0gCi0KLS8qbmF2dHJlZSBpdGVtIG9yIGRvYyovCi1hLm5hdnRyZWVpdGVtIHsKLQljb2xvcjogIzAwMDAwMDsKLQlmb250LXNpemUgOiAxMXB4OwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0gCi0KLS8qc2l0ZW1hcCBoZWFkZXIqLwotYS5zaXRlbWFwaCB7Ci0JZm9udC1zaXplOiAxN3B4OwotCWZvbnQtd2VpZ2h0OiA2MDA7Ci19Ci0KLS8qdXNlZCBpbiBmb3Jnb3QgcGFzc3dvcmQsIGFueSBvdGhlciBzbWFsbCB0ZXh0IGxpbmtzKi8KLWEuc21hbGwgewotCWZvbnQtc2l6ZTogMTFweDsKLX0KLQotYiB7Ci0JZm9udC13ZWlnaHQgOiA2MDA7Ci19Ci0KLS8qc3RhbmRhcmQgdGV4dCovICAKLS5iYXNpYyB7Ci0JY29sb3I6ICMwMDAwMDA7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxMnB4OwotCWZvbnQtd2VpZ2h0OiA0MDA7Ci19Ci0KLS5iZ2Jhc2ljIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjRkZGRkZGOwotfQotCi0vKmRlc2NvcGVkIChyZW1vdmUgYWZ0ZXIgd2EtbHQgcmVsZWFzZSk7IHVzZSBiZ2Jhc2ljICovCi0uYmd3aGl0ZSB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI0ZGRkZGRjsKLX0KLQotLyogc2l6ZSBpbnB1dCBmb3IgYmFzaWMgdGFncyBzdWNoIGFzIHAgYW5kIGxpIHRoYXQgZG8gbm90IGluaGVyaXQgZnJvbSB0ZCAqLyAgCi1ib2R5IHsKLQliYWNrZ3JvdW5kLWNvbG9yIDogI0ZGRkZGRjsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDExcHg7Ci0JbWFyZ2luLWxlZnQ6IDBweDsKLQltYXJnaW4tdG9wOiAwcHg7Ci0JbWFyZ2luLXJpZ2h0OiAwcHg7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi0uYm9sZCB7Ci0JZm9udC13ZWlnaHQ6IDYwMDsKLX0KLQotLmJvcmRlcmRyayB7Ci0JYmFja2dyb3VuZC1jb2xvcjogIzAwMDAwMDsKLX0KLQotLyp1c2UgaW4gcG9wdXBzIGFzIGJvcmRlcnMgaW4gTXVsdGlzaXRlKi8gCi0uYm9yZGVycG9wdXAgewotCWJhY2tncm91bmQtY29sb3I6ICNERURFREU7Ci19Ci0KLS8qYm9yZGVycyB1c2VkIGFyb3VuZCBkYXRhLCBzZWUgUlVQKi8gCi0uYm9yZGVydGJsIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjRTlFOUU5OwotfQotCi0vKmRlc2lnbiBlbGVtZW50IHNpbXVsYXRpbmcgYSBkaW1lbnNpb25hbCBib3VuZGFyeSB0byBhIHRhYmxlICovIAotLmJvcmRlcnRibDIgewotCWJhY2tncm91bmQtY29sb3I6ICNCREJEQkQ7Ci19Ci0KLS8qdXNlZCBpbiBjb250ZW50IGFyZWEgYXMgYSBob3Jpem9udGFsIGRpdiBpbiBNdWx0aXNpdGUqLwotLmJvcmRlcnRibDMgewotCWJhY2tncm91bmQtY29sb3I6ICNFREVERUQ7Ci19Ci0KLS5icmVhZGNydW1icyB7Ci0JZm9udC1zaXplOiAxMXB4OwotfQotCi0vKnVzZWQgaW4gdG9wbmF2ICwgc2ltaWxhciB0byBjb250ZXh0IHRvb2xiYXIqLwotLmJ1dHRvbiB7Ci0JY29sb3I6ICMwMDAwMDA7Ci0JZm9udC1mYW1pbHk6IHZlcmRhbmEsIGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxMHB4OwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotLypkZXNjb3BlZDsgdXNlIGJ1dHRvbiBpbnN0ZWFkOyB1c2VkIGluIHRvcG5hdiAsIHNpbWlsYXIgdG8gY29udGV4dCB0b29sYmFyKi8KLS5idXR0b24zIHsKLQljb2xvcjogIzAwMDAwMDsKLQlmb250LWZhbWlseTogdmVyZGFuYSwgYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDEwcHg7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi0vKmFjdGl2ZSBuYXZpZ2F0aW9uIGJ1dHRvbiwgbm90IGZvcm0gYnV0dG9ucyovIAotLmJ1dHRvbm9uIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjREVERURFOwotCWNvbG9yOiAjMDAwMDAwOwotCWZvbnQtZmFtaWx5OiBWZXJkYW5hLCBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTBweDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLS8qbmF2aWdhdGlvbiBidXR0b25zLCBub3QgZm9ybSBidXR0b25zKi8gCi0uYnV0dG9ucyB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI0VGRUZFRjsKLQljb2xvcjogIzAwMDAwMDsKLQlmb250LWZhbWlseTogdmVyZGFuYSwgYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDEwcHg7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi0vKmRlc2NvcGVkIChyZW1vdmUgYWZ0ZXIgd2EtbHQgcmVsZWFzZSktLXVzZSBhLmJ1dHRvbjsgdGhlc2UgYnV0dG9uIHN0eWxlcyBhcmUgZm9yIHRoZSB0ZXh0dWFsIGJ1dHRvbnMgaW50ZW5kZWQgdG8gcmVwbGFjZSBpbWFnZSBjb25zdHJ1Y3RzIGZvciBpbnRlcm5hdGlvbmFsaXphdGlvbiAqLyAKLS5idXR0b250eHQgewotCWNvbG9yOiAjMzMzMzMzOwotCWZvbnQtZmFtaWx5OiB2ZXJkYW5hLCBoZWx2ZXRpY2EsIGFyaWFsLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTBweDsKLQlmb250LXdlaWdodDogNjAwOwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotLyogZGlzYWJsZWQgc3RhdGUgb2Ygbm9uLWltYWdlIGJ1dHRvbiovIAotLmJ1dHRvbnR4dGRzYmwgewotCWNvbG9yOiAjN0U3RTdFOwotCWZvbnQtZmFtaWx5OiB2ZXJkYW5hLCBoZWx2ZXRpY2EsIGFyaWFsLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTBweDsKLQlmb250LXdlaWdodDogNjAwOwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotLmNvcHlyaWdodCB7IAotCWNvbG9yOiAjOTk5OTk5OwotCWZvbnQtc2l6ZTogMTBweDsKLX0KLQotLypibGFjayBjb3B5cmlnaHQgdXNlZCBpbiBSVVAqLwotLmNvcHlyaWdodGIgewotCWNvbG9yOiAjMDAwMDAwOwotCWZvbnQtc2l6ZTogMTBweDsKLX0KLQotZGQgewotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTJweDsKLQltYXJnaW4tbGVmdDogLTFweDsKLX0KLQotLypkZWZlY3QgcGFnZSBzdWJoZWFkICwgdXNlZCBpbiBwcm9qZWN0IGNvbnNvbGUqLwotLmRlZmVjdHN1YmhkIHsKLQljb2xvcjogIzAwNjY5OTsKLQlmb250LXdlaWdodCA6IDYwMDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLS5kaWFsZ2J4c2hhZG93MiB7Ci0JYmFja2dyb3VuZC1jb2xvcjogIzg0ODQ4NDsKLX0KLQotLmRpYWxvZ3VlYm94YmcgewotCWJhY2tncm91bmQtY29sb3I6ICNEMkQyRDI7Ci19Ci0KLS8qYmFja2dyb3VuZCBmb3IgbG9naW4gcGFnZXMqLwotLmRpYWxvZ3VlYm94YmcyIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjOTk5OTk5OwotfQotCi0uZGlhbG9ndWVib3hib3JkZXIgewotCWJhY2tncm91bmQtY29sb3I6ICMzMzMzMzM7Ci19Ci0KLS5kaWFsb2d1ZWJveGhpZ2hsaWdodCB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI0VGRUZFRjsKLX0KLQotLmRpYWxvZ3VlYm94bWVkaXVtIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjOEI4QjhCOwotfQotCi1kaXYgeyAKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLX0gCi0KLS8qdXNlZCB0byBhZmZlY3QgcmlnaHQgbWFyZ2luKi8gCi1kaXYubWFyZ2lucnQgewotCWNsZWFyOiByaWdodDsKLQlmbG9hdDogcmlnaHQ7Ci0Jd2lkdGg6IDdweDsKLX0KLQotZGl2Lm1hcmdpbnMgeyAKLQlmbG9hdDogbGVmdDsKLQltYXJnaW4tbGVmdDogN3B4OwotCW1hcmdpbi10b3A6IDI1cHg7Ci0JbWFyZ2luLXJpZ2h0OiA3cHg7Ci19Ci0KLS8qZm9yIHBhZ2VzIHdpdGggYnV0dG9uIG5hdmlnYXRpb24gb24gdG9wKi8gIAotZGl2Lm1hcmdpbnMyMCB7Ci0JZmxvYXQ6IGxlZnQ7Ci0JbWFyZ2luLWxlZnQ6IDdweDsKLQltYXJnaW4tdG9wOiAyMHB4OwotCW1hcmdpbi1yaWdodDogN3B4OwotfQotCi0vKmFkZHMgMTAgcHggcGFkZGluZyBhcm91bmQgdGV4dCovCi1kaXYucGFkMTAgewotCXBhZGRpbmc6IDEwcHg7Ci19Ci0KLWRsIHsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDEycHg7Ci19Ci0KLS8qcmVtb3ZlcyBkZWZhdWx0IGJvdHRvbSBtYXJnaW4sIGRvZXNuJ3Qgd29yayBpbiBOUzQuN3ggKi8gIAotZGwuZGF0YSB7Ci0JbWFyZ2luLWJvdHRvbTogLTFweDsKLX0KLQotLyp0aXRsZSBmb3IgZXJyb3IgbWVzc2FnZXMqLwotLmVycm9yIHsKLQljb2xvcjogI0NDMDAwMDsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDI3cHg7Ci0JZm9udC13ZWlnaHQ6IDgwMDsKLX0KLQotLmZvcm10YmxoZWFkIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjQ0NDQ0NDOwotCWNvbG9yOiAjMDAwMDAwOwotCWZvbnQtc2l6ZTogMTFweDsKLQlmb250LXdlaWdodCA6IDYwMDsKLX0KLQotLypjdXJyZW50IHNvcnRlZCBjb2x1bW4qLwotLmZvcm10YmxoZWFkYyB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI0U0RTRFNDsKLQljb2xvcjogIzAwMDAwMDsKLQlmb250LXNpemU6IDExcHg7Ci0JZm9udC13ZWlnaHQgOiA2MDA7Ci19Ci0KLS8qdG8gcmVwbGFjZSBoMSBhbmQgY29udGVudGhlYWRlciBsYXJnZSovCi0uaGVhZGVyMSB7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAyMnB4OwotCWZvbnQtd2VpZ2h0OiA4MDA7Ci19Ci0KLS8qaGVhZGVycyB3aXRoaW4gcGFnZSovCi0uaGVhZGVyMiB7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxOXB4OwotCWZvbnQtd2VpZ2h0OiA0MDA7Ci19Ci0KLS8qdXN1YWxseSB1c2VkIG5leHQgdG8gaGVhZGVyMSwgZm9yIGRvY3VtZW50IHJvb3QgZm9sZGVyKi8KLS5oZWFkZXIzIHsKLQljb2xvcjogIzk5OTk5OTsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDIycHg7Ci0JZm9udC13ZWlnaHQ6IDgwMDsKLX0KLQotaSB7Ci0JZm9udC1zdHlsZSA6IGl0YWxpYzsKLX0KLQotLmljb25ib3JkZXIgewotCWJhY2tncm91bmQtY29sb3I6ICNERURFREU7Ci19Ci0KLS8qdXNlZCBpbiBjb250cm9sc3RyaXAqLwotLmljb25vZmYgewotCWZsb2F0OiByaWdodDsKLQlwb3NpdGlvbjogYWJzb2x1dGU7Ci0JdG9wOjFweDsKLQl2aXNpYmlsaXR5OmhpZGRlbjsKLQl3aWR0aDoxMDAlOwotfQotCi0vKnVzZWQgaW4gY29udHJvbHN0cmlwKi8KLS5pY29ub24gewotCWZsb2F0OiByaWdodDsKLQlwb3NpdGlvbjogYWJzb2x1dGU7Ci0JdG9wOjFweDsKLQl2aXNpYmlsaXR5OnNob3c7Ci0Jd2lkdGg6IDEwMCU7Ci19Ci0KLS8qZm9udCBzaXplIHNldHVwIHNob3duIGluIHRoZSBpbnB1dCBib3ggd2hpY2ggaXMgaW5oZXJpdGVkIGJ5IGlucHV0WFgqLwotaW5wdXQgewotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTFweDsKLX0KLQotLyogMSxidXNpbmVzcyBzdGFuZGFyZCBtdWx0aWxpbmUgaW5wdXQgYm94IAotMix0aGlzIHN0eWxlIG9ubHkgYWN0aXZhdGUgaW4gSUUgKi8KLWlucHV0Lm1heDUwIHsKLQl3aWR0aDogMzYwcHg7Ci19Ci0KLS8qCi0xLGJ1c2luZXNzIHN0YW5kYXJkIG11bHRpbGluZSBpbnB1dCBib3ggCi0yLHRoaXMgc3R5bGUgb25seSBhY3RpdmF0ZSBpbiBJRQotKi8KLWlucHV0LnB4ODUgewotCXdpZHRoOiA4NXB4Ci19Ci0KLWlucHV0LnJhZGlvIHsKLQotfQotCi0vKnVzZWQgaW4gdHJlZXNjcmlwdHMsIGxlZnRuYXYqLwotLmxlZnRtZW51IHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjOTk5OTk5OwotfQotCi0ubm90ZXMgewotCWZvbnQtc2l6ZTogMTFweDsKLQlmb250LXdlaWdodCA6IDQwMDsKLX0KLQotcCB7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxMnB4OwotfQotCi0vKmZvbnQgZm9yIHRoZSBudW1iZXJzIGluIHBhZ2luYXRpb24gbGlicmFyeSovCi0ucGFnZW51bWJlciB7Ci0JY29sb3I6ICM2NzY3Njc7Ci0JZm9udC1zaXplOiAxMXB4OwotCWZvbnQtd2VpZ2h0OiA0MDA7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi0vKmZvbnQgZm9yIHByZXZpb3VzICYgbmV4dCBpbiBwYWdpbmF0aW9uKi8KLS5wYWdlc3RlcHMgewotCWNvbG9yOiAjMDAwMDAwOwotCWZvbnQtc2l6ZTogMTFweDsKLQlmb250LXdlaWdodCA6IDYwMDsKLX0KLQotLypwb3B1cCBoZWFkZXIqLwotLnBvcGgxIHsKLQlmb250LXNpemU6IDE2cHg7Ci0JZm9udC13ZWlnaHQgOiBib2xkOwotfQotCi0vKnVzZWQgaW4gdHJlZXNjcmlwdHMqLwotLnBvcGxlZnRtZW51IHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjRjBGMEYwOwotCWJvcmRlcjogdGhpbiBzb2xpZCAjQ0NDQ0NDOwotCWxlZnQ6IDIxMHB4OwkvKiBpdCdzIG5vdCB3b3JraW5nIG9uIG5zIDYuMiwgaWUgNS41LCBpZSA2IGFuZCBucyA3LCBwb3NzaWJseSBjYW4gYmUgcmVtb3ZlZCBzYWZlbHksIEFsaSBSb2tuaSwgMDkvMTgvMDIqLwotCXBhZGRpbmc6IDJweDsKLQlwb3NpdGlvbjogYWJzb2x1dGU7Ci0JdG9wOiAyNXB4OwkvKiBpdCdzIG5vdCB3b3JraW5nIG9uIG5zIDYuMiwgaWUgNS41LCBpZSA2IGFuZCBucyA3LCBwb3NzaWJseSBjYW4gYmUgcmVtb3ZlZCBzYWZlbHksIEFsaSBSb2tuaSwgMDkvMTgvMDIqLwotCXZpc2liaWxpdHk6IGhpZGRlbjsKLQl3aWR0aDogYXV0bzsKLQl6LWluZGV4OiAxMDsKLX0KLQotLypwcm9ncmVzc2JhciBib3JkZXJzIGluIE11bHRpc2l0ZSovCi0ucHJvZ3Jlc3NiYXJicmQgewotCWJhY2tncm91bmQtY29sb3I6ICM2NjY2NjY7Ci19Ci0KLXNlbGVjdCB7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxMXB4OwotfQotCi0vKmRlc2NvcGVkIChyZW1vdmUgYWZ0ZXIgd2EtbHQgcmVsZWFzZSktLXVzZSBidXR0b25zMzsgdXNlZCBpbiB0b3BuYXYqLwotLnNtYWxsdGV4dCB7Ci0JY29sb3I6ICMwMDAwMDA7Ci0JZm9udC1mYW1pbHk6IHZlcmRhbmEsIGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxMHB4OwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotLyogZm9udCBmb3IgcmVndWxhciBjb250ZW50IHRleHQgKi8KLXRkIHsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDEycHg7Ci19Ci0KLS8qIHRoZXNlIGJ1dHRvbiBzdHlsZXMgYXJlIGZvciB0aGUgdGV4dHVhbCBidXR0b25zIGludGVuZGVkIHRvIHJlcGxhY2UgaW1hZ2UgY29uc3RydWN0cyBmb3IgaW50ZXJuYXRpb25hbGl6YXRpb24gKi8gCi10ZC5idXR0b25ib2R5IHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjRDRENEQ0OwotfQotCi0vKiBkaXNhYmxlZCB2ZXJzaW9uICovIAotdGQuYnV0dG9uYm9keWRzYmwgewotCWJhY2tncm91bmQtY29sb3I6ICNEQURBREE7Ci19Ci0KLS8qIGRlc2NvcGVkIChyZW1vdmUgYWZ0ZXIgd2EtbHQgcmVsZWFzZSk7IHVzZSBiZ2Jhc2ljICovCi10ZC5idXR0b25oaWdobGlnaHQgewotCWJhY2tncm91bmQtY29sb3I6ICNGRkZGRkY7Ci19Ci0KLS8qbm9uLWltYWdlIGJ1dHRvbiovCi10ZC5idXR0b25zaGFkb3cgewotCWJhY2tncm91bmQtY29sb3I6ICM2RDZENkQ7Ci19Ci0KLS8qIG5vbi1pbWFnZSBidXR0b24tLWRpc2FibGVkIHZlcnNpb24gKi8KLXRkLmJ1dHRvbnNoYWRvd2RzYmwgewotCWJhY2tncm91bmQtY29sb3I6ICNBMkEyQTI7Ci19Ci0KLS8qIGRhdGEgd2l0aGluIGEgdGFibGUgaGlnaGxpZ2h0ZWQgaW4gbGlnaHQgZ3JheSovCi10ZC50YmxoaWdobHQzIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjRTlFOUU5OwotfSAgIAotCi0vKmdyYXkgZGF0YSBoaWdobGlnaHQgb3IgcGFnZSBiYWNrZ3JvdW5kKi8gCi0udGRsaWdodDEgewotCWJhY2tncm91bmQtY29sb3I6ICNFRkVGRUY7Ci19Ci0KLXRleHRhcmVhIHsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDExcHg7Ci19Ci0KLS8qZ2xvYmFsIG5hdiovCi0udG9wYmFyZGl2aWRlciB7Ci0JYmFja2dyb3VuZC1jb2xvcjogIzMzOTlDQzsKLX0KLQotLypnbG9iYWwgbmF2Ki8KLS50b3BmcmFtZWJnIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjRDJEMkQyOwotfQotCi0vKmRlc2NvcGVkIChyZW1vdmUgYWZ0ZXIgd2EtbHQgcmVsZWFzZSktLXVzZSBib3JkZXJ0YmwzOyB1c2VkIGluIGNvbnRlbnQgYXJlYSBhcyBhIGhvcml6b250YWwgZGl2IGluIE11bHRpc2l0ZSovCi0udG9wZnJhbWViZ2dyZXllZCB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI0VERURFRDsKLX0KLQotLypnbG9iYWwgbmF2Ki8KLS50b3BmcmFtZWhpZ2hsaWdodCB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI0I2QjVCNTsKLX0KLQotLypnbG9iYWwgbmF2Ki8KLS50b3BmcmFtZWhpZ2hsaWdodDIgewotCWJhY2tncm91bmQtY29sb3I6ICNFRkVGRUY7Ci19Ci0KLS8qZ2xvYmFsIG5hdiovCi0udG9wZnJhbWVsb2dvYmcgewotCWJhY2tncm91bmQtY29sb3I6ICMwMDY2OTk7Ci19Ci0KLS8qZ2xvYmFsIG5hdiovCi0udG9wZnJhbWVzaGFkb3cgewotCWJhY2tncm91bmQtY29sb3I6ICM4NDg0ODQ7Ci19Ci0KLS8qZ2xvYmFsIGljb24gb3BlcmF0aW9ucyB0b29sYmFyKi8KLS50b3BsZWZ0bmF2IHsJCi0JY29sb3I6ICMwMDAwMDA7Ci0JZm9udC1mYW1pbHk6IHZlcmRhbmEsIGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxMHB4OwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotLypnbG9iYWwgaW5wdXQgb3BlcmF0aW9ucyB0b29sYmFyKi8KLS50b3BsZWZ0bmF2Ym9sZCB7Ci0JZm9udC1mYW1pbHk6IHZlcmRhbmEsIGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxMHB4OwotCWZvbnQtd2VpZ2h0OiA2MDA7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi0vKnRleHQgb24gdG9wbmF2LCB0b3AgcmlnaHQgc2VjdGlvbiovCi0udG9wcmlnaHRuYXYgewotCWNvbG9yOiAjRkZGRkZGOwotCWZvbnQtZmFtaWx5OiB2ZXJkYW5hLCBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTBweDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLS50b3ByaWdodG5hdmdyZXkgCi17Ci0JY29sb3I6ICMwMDAwMDA7Ci0JZm9udC1mYW1pbHk6IHZlcmRhbmEsIGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxMHB4OwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotLypsaXN0LXN0eWxlLWltYWdlOiB1cmwoaW1hZ2VzL2Rvd25idXR0b24uZ2lmKTsqLwotdWwgewotCWxpc3Qtc3R5bGUtdHlwZTogc3F1YXJlOwotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9zdHlsZXNoZWV0cy9jb21tb25fYWR2VU5YLmNzcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvc3R5bGVzaGVldHMvY29tbW9uX2FkdlVOWC5jc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1OTUwYTcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9zdHlsZXNoZWV0cy9jb21tb25fYWR2VU5YLmNzcworKysgL2Rldi9udWxsCkBAIC0xLDYxMSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICovCi0KLS8qbXVzdCBhZGQgZm9udCB0eXBlIGlmIGNsYXNzIGlzIGJlaW5nIHVzZWQgYXMgYSBsaW5rIGFzIHdlbGwgYXMgbm8tbGluayovCi0KLWEgewotCWNvbG9yOiAjMzM2Njk5OwotfQotCi1hLnRvcHJpZ2h0bmF2OmFjdGl2ZSB7Ci0JY29sb3I6ICM5OUNDQ0M7Ci19Ci0KLWEudG9wcmlnaHRuYXZncmV5OmFjdGl2ZSB7Ci0JY29sb3I6ICNDQzAwMDA7Ci19Ci0KLQotLyogYWN0aW9uIHRleHQgdXN1YWxseSBsb2NhdGVkIG9uIHRvcCBvZiBwYWdlO2llLiwgc2VsZWN0IGFsbCovCi1hLmFjdGlvbmxpbmsgewotCWNvbG9yOiAjMzM2Njk5OwotCWZvbnQtc2l6ZTogMTZweDsKLQl0ZXh0LWRlY29yYXRpb24gOiBub25lOwotfQotIAotLyogZm9udCBmb3IgYWN0aW9uO2llLiwgc2VsZWN0IGFsbCovCi1hLmFjdGlvbnNlbGVjdG9yIHsKLQljb2xvcjogIzAwMDAwMDsKLQlmb250LXNpemU6IDE2cHg7Ci19Ci0KLWEuYmFzaWMgewotCWNvbG9yOiAjMDAwMDAwOwotfQotCi1hLmJyZWFkY3J1bWJzIHsKLQljb2xvcjogIzAwMDAwMDsKLQlmb250LXNpemU6IDE2cHg7Ci19Ci0KLS8qIGZvciBub24taW1hZ2UgYnV0dG9ucywgZm9yIGludGVybmF0aW9uYWxpemF0aW9uICovCi1hLmJ1dHRvbiB7Ci0JY29sb3I6ICMzMzMzMzM7Ci0JZm9udC1mYW1pbHk6IHZlcmRhbmEsIGhlbHZldGljYSwgYXJpYWwsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxNXB4OwotCWZvbnQtd2VpZ2h0OiA2MDA7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi0vKiBEZXNjb3BlZCwgSXQncyBub3QgdXNlZCBpbiBjdXJyZW50IHByb2plY3RzLCB0byBiZSBhcmNoaXZlZCBhZnRlciA2IG1vbnRocy4gQWxpIFJva25pLCAwOS8wOS8wMiAqLwotLyogZm9yIGNvbnRleHQgdG9vbGJhciBidXR0b25zIGluIE11bHRpc2l0ZSwgZm9yIGludGVybmF0aW9uYWxpemF0aW9uICovCi1hLmJ1dHRvbjIgewotCWNvbG9yOiAjMDAwMDAwOwotCWZvbnQtc2l6ZTogMTZweDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLWEuYnV0dG9uOmFjdGl2ZSB7Ci0JY29sb3I6ICMzMzMzMzM7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi0vKiBmb3Igbm9uLWltYWdlIGJ1dHRvbnMsIGZvciBpbnRlcm5hdGlvbmFsaXphdGlvbiAqLwotYS5idXR0b246aG92ZXIgewotCWNvbG9yOiAjMzMzMzMzOwotfQotCi1hLmNvcHlyaWdodCB7Ci0JY29sb3I6ICMzMzY2OTk7Ci0JZm9udC1zaXplOiAxNXB4OwotfQotCi0vKmFjdGlvbmJhciBvbiB3aGl0ZSBiYWNrZ3JvdW5kKi8KLS5hY3Rpb25zZWxlY3QyIHsKLQljb2xvcjogIzAwMDAwMDsKLQlmb250LXNpemU6IDE2cHg7Ci19Ci0KLS8qYWN0aW9uYmFyIGFwcGVhcnMgb24gdG9wIGFuZC9vciBib3R0b20gb2YgcGFnZSovCi0uYWN0aW9uc2VsZWN0b3IgewotCWJhY2tncm91bmQtY29sb3I6ICNFOUU5RTk7Ci0JY29sb3I6ICMwMDAwMDA7Ci0JZm9udC1zaXplOiAxNnB4OwotfQotCi0vKmNvbHVtbiBoZWFkaW5ncyovCi1hLmZvcm10YmxoZWFkIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjQ0NDQ0NDOwotCWNvbG9yOiAjMDAwMDAwOwotCWZvbnQtc2l6ZTogMTZweDsKLQlmb250LXdlaWdodDogNjAwOwotfQotCi1hLnRvcHJpZ2h0bmF2Z3JleTpob3ZlciB7Ci0JY29sb3I6ICNDQzAwMDA7Ci19IAotYS50b3ByaWdodG5hdjpob3ZlciB7Ci0JY29sb3I6ICM5OUNDQ0M7Ci19IC8qbmF2dHJlZSBpdGVtIG9yIGRvYyovCi1hLm5hdnRyZWVpdGVtIHsKLQljb2xvcjogIzAwMDAwMDsKLQlmb250LXNpemU6IDE2cHg7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi0vKnNpdGVtYXAgaGVhZGVyKi8KLWEuc2l0ZW1hcGggewotCWZvbnQtc2l6ZTogMjVweDsKLQlmb250LXdlaWdodDogNjAwOwotfQotCi0vKnVzZWQgaW4gZm9yZ290IHBhc3N3b3JkLCBhbnkgb3RoZXIgc21hbGwgdGV4dCBsaW5rcyovCi1hLnNtYWxsIHsKLQlmb250LXNpemU6IDE2cHg7Ci19Ci0KLWIgewotCWZvbnQtd2VpZ2h0OiA2MDA7Ci19Ci0KLS8qc3RhbmRhcmQgdGV4dCovCi0uYmFzaWMgewotCWNvbG9yOiAjMDAwMDAwOwotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMThweDsKLQlmb250LXdlaWdodDogNDAwOwotfQotCi0uYmdiYXNpYyB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI0ZGRkZGRjsKLX0KLQotLypkZXNjb3BlZCAocmVtb3ZlIGFmdGVyIHdhLWx0IHJlbGVhc2UpOyB1c2UgYmdiYXNpYyAqLwotLmJnd2hpdGUgewotCWJhY2tncm91bmQtY29sb3I6ICNGRkZGRkY7Ci19Ci0KLS8qIHNpemUgaW5wdXQgZm9yIGJhc2ljIHRhZ3Mgc3VjaCBhcyBwIGFuZCBsaSB0aGF0IGRvIG5vdCBpbmhlcml0IGZyb20gdGQgKi8gCi1ib2R5IHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjRkZGRkZGOwotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMThweDsKLQltYXJnaW4tbGVmdDogMHB4OwotCW1hcmdpbi1yaWdodDogMHB4OwotCW1hcmdpbi10b3A6IDBweDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLS5ib2xkIHsKLQlmb250LXdlaWdodDogNjAwOwotfQotCi0uYm9yZGVyZHJrIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjMDAwMDAwOwotfQotCi0vKnVzZSBpbiBwb3B1cHMgYXMgYm9yZGVycyBpbiBNdWx0aXNpdGUqLyAKLS5ib3JkZXJwb3B1cCB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI0RFREVERTsKLX0KLQotLypib3JkZXJzIHVzZWQgYXJvdW5kIGRhdGEsIHNlZSBSVVAqLwotLmJvcmRlcnRibCB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI0U5RTlFOTsKLX0KLQotLypkZXNpZ24gZWxlbWVudCBzaW11bGF0aW5nIGEgZGltZW5zaW9uYWwgYm91bmRhcnkgdG8gYSB0YWJsZSAqLyAKLS5ib3JkZXJ0YmwyewotCWJhY2tncm91bmQtY29sb3I6ICNCREJEQkQ7Ci19Ci0KLS8qdXNlZCBpbiBjb250ZW50IGFyZWEgYXMgYSBob3Jpem9udGFsIGRpdiBpbiBNdWx0aXNpdGUqLwotLmJvcmRlcnRibDMgewotCWJhY2tncm91bmQtY29sb3I6ICNFREVERUQ7Ci19Ci0KLS5icmVhZGNydW1ic3sKLWZvbnQtc2l6ZTogMTFweDsKLX0KLQotLyp1c2VkIGluIHRvcG5hdiAsIHNpbWlsYXIgdG8gY29udGV4dCB0b29sYmFyKi8KLS5idXR0b24gewotCWNvbG9yOiAjMDAwMDAwOwotCWZvbnQtZmFtaWx5OiB2ZXJkYW5hLCBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTVweDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLS8qZGVzY3BlZDsgdXNlIGJ1dHRvbiBpbnN0ZWFkOyB1c2VkIGluIHRvcG5hdiAsIHNpbWlsYXIgdG8gY29udGV4dCB0b29sYmFyKi8KLS5idXR0b24zIHsKLQljb2xvcjogIzAwMDAwMDsKLQlmb250LWZhbWlseTogdmVyZGFuYSwgYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDE1cHg7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi0vKmFjdGl2ZSBzdGF0ZSBvZiBuYXZpZ2F0aW9uIGJ1dHRvbiBpbiBjb250ZXh0IHRvb2xiYXIqLyAKLS5idXR0b25vbiB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI0RFREVERTsKLQljb2xvcjogIzAwMDAwMDsKLQlmb250LWZhbWlseTogVmVyZGFuYSwgQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsJCi0JZm9udC1zaXplOiAxNXB4OwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotLypuYXZpZ2F0aW9uIGJ1dHRvbnMgaW4gY29udGV4dCB0b29sYmFyKi8KLS5idXR0b25zIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjRUZFRkVGOwotCWNvbG9yOiAjMDAwMDAwOwotCWZvbnQtZmFtaWx5OiBWZXJkYW5hLCBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOwkKLQlmb250LXNpemU6IDE1cHg7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwkKLX0KLQotLyogZGVzY29wZWQgKHJlbW92ZSBhZnRlciB3YS1sdCByZWxlYXNlKS0tdXNlIGEuYnV0dG9uOyB0aGVzZSBidXR0b24gc3R5bGVzIGFyZSBmb3IgdGhlIHRleHR1YWwgYnV0dG9ucyBpbnRlbmRlZCB0byByZXBsYWNlIGltYWdlIGNvbnN0cnVjdHMgZm9yIGludGVybmFsaXphdGlvbiovCi0uYnV0dG9udHh0IHsKLQljb2xvcjogIzMzMzMzMzsKLQlmb250LWZhbWlseTogdmVyZGFuYSwgaGVsdmV0aWNhLCBhcmlhbCwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDE1cHg7Ci0JZm9udC13ZWlnaHQ6IDYwMDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLS8qIGRpc2FibGVkIHN0YXRlIG9mIG5vbi1pbWFnZSBidXR0b24qLyAKLS5idXR0b250eHRkc2JsIHsKLQljb2xvcjogIzdFN0U3RTsKLQlmb250LWZhbWlseTogdmVyZGFuYSwgaGVsdmV0aWNhLCBhcmlhbCwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDE1cHg7Ci0JZm9udC13ZWlnaHQ6IDYwMDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLS5jb3B5cmlnaHQgewotCWNvbG9yOiAjOTk5OTk5OwotCWZvbnQtc2l6ZTogMTVweDsKLX0KLQotLypibGFjayBjb3B5cmlnaHQgdXNlZCBpbiBSVVAqLwotLmNvcHlyaWdodGIgewotCWNvbG9yOiAjMDAwMDAwOwotCWZvbnQtc2l6ZTogMTVweDsKLX0KLQotZGQgewotZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxOHB4OwotCW1hcmdpbi1sZWZ0OiAtMXB4OwotfQotCi0vKmRlZmVjdCBwYWdlIHN1YmhlYWQgLCB1c2VkIGluIHByb2plY3QgY29uc29sZSovCi0uZGVmZWN0c3ViaGQgewotCWNvbG9yOiAjMDA2Njk5OwotCWZvbnQtd2VpZ2h0OiA2MDA7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi0uZGlhbGdieHNoYWRvdzIgewotCWJhY2tncm91bmQtY29sb3I6ICM4NDg0ODQ7Ci19Ci0KLS5kaWFsb2d1ZWJveGJnIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjRDJEMkQyOwotfQotCi0vKmJhY2tncm91bmQgZm9yIGxvZ2luIHBhZ2VzKi8KLS5kaWFsb2d1ZWJveGJnMiB7Ci0JYmFja2dyb3VuZC1jb2xvcjogIzk5OTk5OTsKLX0KLQotLmRpYWxvZ3VlYm94Ym9yZGVyIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjMzMzMzMzOwotfQotCi0uZGlhbG9ndWVib3hoaWdobGlnaHQgewotCWJhY2tncm91bmQtY29sb3I6ICNFRkVGRUY7Ci19Ci0KLS5kaWFsb2d1ZWJveG1lZGl1bSB7Ci0JYmFja2dyb3VuZC1jb2xvcjogIzhCOEI4QjsKLX0KLQotZGl2IHsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLX0KLQotLyp1c2VkIHRvIGFmZmVjdCByaWdodCBtYXJnaW4qLwotZGl2Lm1hcmdpbnJ0IHsKLQljbGVhcjogcmlnaHQ7Ci0JZmxvYXQ6IHJpZ2h0OwotCXdpZHRoOiA3cHg7Ci19Ci0KLWRpdi5tYXJnaW5zIHsKLQlmbG9hdDogbGVmdDsKLQltYXJnaW4tbGVmdDogN3B4OwotCW1hcmdpbi1yaWdodDogN3B4OwotCW1hcmdpbi10b3A6IDI1cHg7Ci19Ci0KLS8qZm9yIHBhZ2VzIHdpdGggYnV0dG9uIG5hdmlnYXRpb24gb24gdG9wKi8gCi1kaXYubWFyZ2luczIwIHsKLQlmbG9hdDogbGVmdDsKLQltYXJnaW4tbGVmdDogN3B4OwotCW1hcmdpbi1yaWdodDogN3B4OwotCW1hcmdpbi10b3A6IDIwcHg7Ci19Ci0KLS8qYWRkcyAxMCBweCBwYWRkaW5nIGFyb3VuZCB0ZXh0Ki8KLWRpdi5wYWQxMCB7Ci0JcGFkZGluZzogMTBweDsKLX0KLQotZGwgewotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMThweDsKLX0KLQotLypyZW1vdmVzIGRlZmF1bHQgYm90dG9tIG1hcmdpbiwgZG9lc24ndCB3b3JrIGluIE5TNC43eCAqLyAKLWRsLmRhdGEgewotCW1hcmdpbi1ib3R0b206IC0xcHg7Ci19Ci0KLS8qdGl0bGUgZm9yIGVycm9yIG1lc3NhZ2VzKi8KLS5lcnJvciB7Ci0JY29sb3I6ICNDQzAwMDA7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAzMHB4OwotCWZvbnQtd2VpZ2h0OiA4MDA7Ci19Ci0KLS5mb3JtdGJsaGVhZCB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI0NDQ0NDQzsKLQljb2xvcjogIzAwMDAwMDsKLQlmb250LXNpemU6IDE2cHg7Ci0JZm9udC13ZWlnaHQ6IDYwMDsKLX0KLQotLypjdXJyZW50IHNvcnRlZCBjb2x1bW4qLwotLmZvcm10YmxoZWFkYyB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI0U0RTRFNDsKLQljb2xvcjogIzAwMDAwMDsKLQlmb250LXNpemU6IDE2cHg7Ci0JZm9udC13ZWlnaHQ6IDYwMDsKLX0KLQotLyp0byByZXBsYWNlIGgxIGFuZCBjb250ZW50aGVhZGVyIGxhcmdlKi8KLS5oZWFkZXIxIHsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDMzcHg7Ci0JZm9udC13ZWlnaHQ6IDgwMDsKLX0KLQotLypoZWFkZXJzIHdpdGhpbiBwYWdlKi8KLS5oZWFkZXIyIHsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDI4cHg7Ci0JZm9udC13ZWlnaHQ6IDQwMDsKLX0KLQotLyp1c3VhbGx5IHVzZWQgbmV4dCB0byBoZWFkZXIxOyBmb3IgZG9jdW1lbnQgcm9vdCBmb2xkZXIqLwotLmhlYWRlcjMgewotCWNvbG9yOiAjOTk5OTk5OwotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMzNweDsKLQlmb250LXdlaWdodDogODAwOwotfQotCi1pIHsKLQlmb250LXN0eWxlOiBpdGFsaWM7Ci19Ci0KLS5pY29uYm9yZGVyIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjREVERURFOwotfQotCi0vKnVzZWQgaW4gY29udHJvbHN0cmlwKi8KLS5pY29ub2ZmIHsKLQlmbG9hdDogcmlnaHQ7Ci0JcG9zaXRpb246IGFic29sdXRlOwotCXRvcDogMXB4OwotCXZpc2liaWxpdHk6IGhpZGRlbjsKLQl3aWR0aDogMTAwJTsKLX0KLQotLyp1c2VkIGluIGNvbnRyb2xzdHJpcCovCi0uaWNvbm9uIHsKLQlmbG9hdDogcmlnaHQ7Ci0JcG9zaXRpb246IGFic29sdXRlOwotCXRvcDogMXB4OwotCXZpc2liaWxpdHk6c2hvdzsKLQl3aWR0aDogMTAwJTsKLX0KLQotCi0vKmZvbnQgc2l6ZSBzZXR1cCBzaG93biBpbiB0aGUgaW5wdXQgYm94IHdoaWNoIGlzIGluaGVyaXRlZCBieSBpbnB1dFhYKi8KLWlucHV0IHsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDE2cHg7Ci19Ci0KLS8qIDEsYnVzaW5lc3Mgc3RhbmRhcmQgbXVsdGlsaW5lIGlucHV0IGJveCAKLTIsdGhpcyBzdHlsZSBvbmx5IGFjdGl2YXRlIGluIElFICovCi1pbnB1dC5tYXg1MCB7Ci0Jd2lkdGg6IDM2MHB4OwotfQotCi0vKgotMSxidXNpbmVzcyBzdGFuZGFyZCBtdWx0aWxpbmUgaW5wdXQgYm94IAotMix0aGlzIHN0eWxlIG9ubHkgYWN0aXZhdGUgaW4gSUUKLSovCi1pbnB1dC5weDg1IHsKLQl3aWR0aDogODVweDsKLX0KLQotaW5wdXQucmFkaW8geyAKLQotfQotCi0gLyp1c2VkIGluIHRyZWVzY3JpcHRzLCBsZWZ0bmF2Ki8KLS5sZWZ0bWVudSB7Ci0JYmFja2dyb3VuZC1jb2xvcjogIzk5OTk5OTsKLX0KLQotLm5vdGVzIHsKLQlmb250LXNpemU6IDE2cHg7Ci0JZm9udC13ZWlnaHQgOiA0MDA7Ci19Ci0KLXAgewotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMThweDsKLX0KLQotLypmb250IGZvciB0aGUgbnVtYmVycyBpbiBwYWdpbmF0aW9uIGxpYnJhcnkqLwotLnBhZ2VudW1iZXIgewotCWNvbG9yOiAjNjc2NzY3OwotCWZvbnQtc2l6ZTogMTZweDsKLQlmb250LXdlaWdodCA6IDQwMDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLS8qZm9udCBmb3IgcHJldmlvdXMgJiBuZXh0IGluIHBhZ2luYXRpb24qLwotLnBhZ2VzdGVwcyB7Ci0JY29sb3I6ICMwMDAwMDA7Ci0JZm9udC1zaXplOiAxNnB4OwotCWZvbnQtd2VpZ2h0IDogNjAwOwotfQotCi0vKnBvcHVwIGhlYWRlciovCi0ucG9waDEgewotCWZvbnQtc2l6ZTogMjRweDsKLQlmb250LXdlaWdodDogYm9sZDsKLX0KLQotLyp1c2VkIGluIHRyZWVzY3JpcHRzKi8KLS5wb3BsZWZ0bWVudSB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI0YwRjBGMDsKLQlib3JkZXI6IHRoaW4gc29saWQgI0NDQ0NDQzsKLQlsZWZ0OiAyMTBweDsJLyogaXQncyBub3Qgd29ya2luZyBvbiBucyA2LjIsIGllIDUuNSwgaWUgNiBhbmQgbnMgNywgcG9zc2libHkgY2FuIGJlIHJlbW92ZWQgc2FmZWx5LCBBbGkgUm9rbmksIDA5LzE4LzAyKi8KLQlwYWRkaW5nOiAycHg7Ci0JcG9zaXRpb246IGFic29sdXRlOwotCXRvcDogMjVweDsJLyogaXQncyBub3Qgd29ya2luZyBvbiBucyA2LjIsIGllIDUuNSwgaWUgNiBhbmQgbnMgNywgcG9zc2libHkgY2FuIGJlIHJlbW92ZWQgc2FmZWx5LCBBbGkgUm9rbmksIDA5LzE4LzAyKi8KLQl2aXNpYmlsaXR5OiBoaWRkZW47IAotCXdpZHRoOjc1cHg7Ci0Jei1pbmRleDoxMDsJCi19Ci0KLS8qcHJvZ3Jlc3NiYXIgYm9yZGVycyBpbiBNdWx0aXNpdGUqLwotLnByb2dyZXNzYmFyYnJkIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjNjY2NjY2OwotfQotCi1zZWxlY3QgewotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTZweDsKLX0KLQotLypkZXNjb3BlZCAocmVtb3ZlIGFmdGVyIHdhLWx0IHJlbGVhc2UpLS11c2UgYnV0dG9uczM7IHVzZWQgaW4gdG9wbmF2Ki8KLS5zbWFsbHRleHQgewotCWNvbG9yOiAjMDAwMDAwOwotCWZvbnQtZmFtaWx5OiB2ZXJkYW5hLCBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTVweDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLS8qIGZvbnQgZm9yIHJlZ3VsYXIgY29udGVudCB0ZXh0ICovCi10ZCB7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxNHB4OwotfQotCi0gLyogdGhlc2UgYnV0dG9uIHN0eWxlcyBhcmUgZm9yIHRoZSB0ZXh0dWFsIGJ1dHRvbnMgaW50ZW5kZWQgdG8gcmVwbGFjZSBpbWFnZSBjb25zdHJ1Y3RzIGZvciBpbnRlcm5hdGlvbmFsaXphdGlvbiAqLyAKLXRkLmJ1dHRvbmJvZHkgewotCWJhY2tncm91bmQtY29sb3I6ICNENEQ0RDQ7Ci19Ci0KLS8qIGRpc2FibGVkIHZlcnNpb24gKi8KLXRkLmJ1dHRvbmJvZHlkc2JsIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjREFEQURBOwotfQotCi0vKiBkZXNjb3BlZCAocmVtb3ZlIGFmdGVyIHdhLWx0IHJlbGVhc2UpOyB1c2UgYmdiYXNpYyAqLwotdGQuYnV0dG9uaGlnaGxpZ2h0IHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjRkZGRkZGOwotfQotCi0vKm5vbi1pbWFnZSBidXR0b24qLwotdGQuYnV0dG9uc2hhZG93IHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjNkQ2RDZEOwotfQotCi0vKiBub24taW1hZ2UgYnV0dG9uLS1kaXNhYmxlZCB2ZXJzaW9uICovCi10ZC5idXR0b25zaGFkb3dkc2JsIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjQTJBMkEyOwotfQotCi0gLyogZGF0YSB3aXRoaW4gYSB0YWJsZSBoaWdobGlnaHRlZCBpbiBsaWdodCBncmF5Ki8KLXRkLnRibGhpZ2hsdDMgewotCWJhY2tncm91bmQtY29sb3I6ICNFOUU5RTk7Ci19Ci0KLS8qZ3JheSBkYXRhIGhpZ2hsaWdodCBvciBwYWdlIGJhY2tncm91bmQqLyAKLS50ZGxpZ2h0MSB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI0VGRUZFRjsKLX0KLQotdGV4dGFyZWEgewotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTZweDsKLX0KLQotLypnbG9iYWwgbmF2Ki8KLS50b3BiYXJkaXZpZGVyIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjMzM5OUNDOwotfQotCi0vKmdsb2JhbCBuYXYqLwotLnRvcGZyYW1lYmcgewotCWJhY2tncm91bmQtY29sb3I6ICNEMkQyRDI7Ci19Ci0KLS8qZGVzY29wZWQgKHJlbW92ZSBhZnRlciB3YS1sdCByZWxlYXNlKS11c2UgYm9yZGVydGJsMzsgdXNlZCBpbiBjb250ZW50IGFyZWEgYXMgYSBob3Jpem9udGFsIGRpdiBpbiBNdWx0aXNpdGUqLwotLnRvcGZyYW1lYmdncmV5ZWQgewotCWJhY2tncm91bmQtY29sb3I6ICNFREVERUQ7Ci19Ci0KLS8qZ2xvYmFsIG5hdiovCi0udG9wZnJhbWVoaWdobGlnaHQgewotCWJhY2tncm91bmQtY29sb3I6ICNCNkI1QjU7Ci19Ci0KLS8qZ2xvYmFsIG5hdiovCi0udG9wZnJhbWVoaWdobGlnaHQyIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjRUZFRkVGOwotfQotCi0vKmdsb2JhbCBuYXYqLwotLnRvcGZyYW1lbG9nb2JnIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjMDA2Njk5OwotfQotCi0vKmdsb2JhbCBuYXYqLwotLnRvcGZyYW1lc2hhZG93IHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjODQ4NDg0OwotfQotCi0vKmdsb2JhbCBpY29uIG9wZXJhdGlvbnMgdG9vbGJhciovCi0udG9wbGVmdG5hdiB7Ci0JY29sb3I6ICMwMDAwMDA7Ci0JZm9udC1mYW1pbHk6IHZlcmRhbmEsIGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxNXB4OwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotLypnbG9iYWwgaW5wdXQgb3BlcmF0aW9ucyB0b29sYmFyKi8KLS50b3BsZWZ0bmF2Ym9sZCB7Ci0JZm9udC1mYW1pbHk6IHZlcmRhbmEsIGJyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxNXB4OwotCWZvbnQtd2VpZ2h0OiA2MDA7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi0vKnRleHQgb24gdG9wbmF2LCB0b3AgcmlnaHQgc2VjdGlvbiovCi0udG9wcmlnaHRuYXYgewotCWNvbG9yOiAjRkZGRkZGOwotCWZvbnQtZmFtaWx5OiB2ZXJkYW5hLCBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTRweDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLS50b3ByaWdodG5hdmdyZXkKLXsKLQlmb250LWZhbWlseTogVmVyZGFuYSwgQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDEwcHg7Ci0JY29sb3I6ICMwMDAwMDA7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi0vKmxpc3Qtc3R5bGUtaW1hZ2U6IHVybChpbWFnZXMvZG93bmJ1dHRvbi5naWYpOyBkb2Vzbid0IHdvcmsgZm9yIG5zNCovCi11bCB7Ci0JbGlzdC1zdHlsZS10eXBlOiBzcXVhcmU7Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L3N0eWxlc2hlZXRzL2NvbW1vbl9iYXNlLmNzcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvc3R5bGVzaGVldHMvY29tbW9uX2Jhc2UuY3NzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NWJiNTE2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvc3R5bGVzaGVldHMvY29tbW9uX2Jhc2UuY3NzCisrKyAvZGV2L251bGwKQEAgLTEsNjE3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKgotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKi8KLQotLyptdXN0IGFkZCBmb250IHR5cGUgaWYgY2xhc3MgaXMgYmVpbmcgdXNlZCBhcyBhIGxpbmsgYXMgd2VsbCBhcyBuby1saW5rKi8KLQotYSB7Ci0JY29sb3I6ICMzMzY2OTk7Ci19Ci0KLWEudG9wcmlnaHRuYXY6YWN0aXZlIHsKLQljb2xvcjogIzk5Q0NDQzsKLX0KLQotYS50b3ByaWdodG5hdmdyZXk6YWN0aXZlIHsKLQljb2xvcjogI0NDMDAwMDsKLX0KLQotCi1hLnRvcHJpZ2h0bmF2Z3JleTpob3ZlciB7Ci0JY29sb3I6ICNDQzAwMDA7Ci19IAotYS50b3ByaWdodG5hdjpob3ZlciB7Ci0JY29sb3I6ICM5OUNDQ0M7Ci19IC8qIERlc2NvcGVkLCBJdCdzIG5vdCB1c2VkIGluIGN1cnJlbnQgcHJvamVjdHMsIHRvIGJlIGFyY2hpdmVkIGFmdGVyIDYgbW9udGhzLiBBbGkgUm9rbmksIDA5LzA5LzAyICovCi0vKiBhY3Rpb24gdGV4dCB1c3VhbGx5IGxvY2F0ZWQgb24gdG9wIG9mIHBhZ2U7aWUuLCBzZWxlY3QgYWxsKi8KLWEuYWN0aW9ubGluayB7Ci0JY29sb3I6ICMzMzY2OTk7Ci0JZm9udC1zaXplOiAxMXB4OwotCXRleHQtZGVjb3JhdGlvbiA6IG5vbmU7Ci19Ci0KLS8qIGZvbnQgZm9yIGFjdGlvbjtpZS4sIHNlbGVjdCBhbGwqLwotYS5hY3Rpb25zZWxlY3RvciB7Ci0JY29sb3I6ICMwMDAwMDA7Ci0JZm9udC1zaXplOiAxMXB4OwotfQotCi1hLmJhc2ljIHsKLQljb2xvcjogIzAwMDAwMDsKLX0KLQotYS5icmVhZGNydW1icyB7Ci0JY29sb3I6ICMwMDAwMDA7Ci0JZm9udC1zaXplOiAxMXB4OwotfQotCi0vKiBmb3Igbm9uLWltYWdlIGJ1dHRvbnMsIGZvciBpbnRlcm5hdGlvbmFsaXphdGlvbiAqLwotYS5idXR0b24gewotCWNvbG9yOiAjMzMzMzMzOwotCWZvbnQtZmFtaWx5OiB2ZXJkYW5hLCBoZWx2ZXRpY2EsIGFyaWFsLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTBweDsKLQlmb250LXdlaWdodDogNjAwOwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotLyogZm9yIGNvbnRleHQgdG9vbGJhciBidXR0b25zIGluIE11bHRpc2l0ZSwgZm9yIGludGVybmF0aW9uYWxpemF0aW9uICovCi1hLmJ1dHRvbjIgewotCWNvbG9yOiAjMDAwMDAwOwotCWZvbnQtc2l6ZTogMTFweDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLWEuYnV0dG9uOmFjdGl2ZSB7Ci0JY29sb3I6IDMzMzMzMzsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLS8qIGZvciBub24taW1hZ2UgYnV0dG9ucywgZm9yIGludGVybmF0aW9uYWxpemF0aW9uICovCi1hLmJ1dHRvbjpob3ZlciB7Ci0JY29sb3I6IDMzMzMzMzsKLX0KLQotYS5jb3B5cmlnaHQgewotCWNvbG9yOiAjOTk5OTk5OwotCWZvbnQtc2l6ZTogMTBweDsKLX0KLQotLyphY3Rpb25iYXIgb24gd2hpdGUgYmFja2dyb3VuZCovCi0uYWN0aW9uc2VsZWN0MiB7Ci0JY29sb3I6ICMwMDAwMDA7Ci0JZm9udC1zaXplOiAxMXB4OwotfQotCi0vKmFjdGlvbmJhciBhcHBlYXJzIG9uIHRvcCBhbmQvb3IgYm90dG9tIG9mIHBhZ2UqLwotLmFjdGlvbnNlbGVjdG9yIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjRTlFOUU5OwotCWNvbG9yOiAjMDAwMDAwOwotCWZvbnQtc2l6ZTogMTFweDsKLX0KLQotLypjb2x1bW4gaGVhZGluZ3MqLwotYS5mb3JtdGJsaGVhZCB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI0NDQ0NDQzsKLQljb2xvcjogIzAwMDAwMDsKLQlmb250LXNpemU6IDExcHg7Ci0JZm9udC13ZWlnaHQgOiA2MDA7Ci19Ci0KLS8qbmF2dHJlZSBpdGVtIG9yIGRvYyovCi1hLm5hdnRyZWVpdGVtIHsKLQljb2xvcjogIzAwMDAwMDsKLQlmb250LXNpemU6IDExcHg7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi0vKnNpdGVtYXAgaGVhZGVyKi8KLWEuc2l0ZW1hcGggewotCWZvbnQtc2l6ZTogMTdweDsKLQlmb250LXdlaWdodDogNjAwOwotfQotCi0vKnVzZWQgaW4gZm9yZ290IHBhc3N3b3JkLCBhbnkgb3RoZXIgc21hbGwgdGV4dCBsaW5rcyovCi1hLnNtYWxsIHsKLQlmb250LXNpemU6IDExcHg7Ci19Ci0KLWIgewotCWZvbnQtd2VpZ2h0IDogNjAwOwotfQotCi0vKnN0YW5kYXJkIHRleHQqLwotLmJhc2ljIHsKLWNvbG9yOiAjMDAwMDAwOwotZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci1mb250LXNpemU6IDEycHg7Ci1mb250LXdlaWdodDogNDAwOwotfQotCi0uYmdiYXNpYyB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI0ZGRkZGRjsKLX0KLQotLypkZXNjb3BlZCAocmVtb3ZlIGFmdGVyIHdhLWx0IHJlbGVhc2UpOyB1c2UgYmdiYXNpYyAqLwotLmJnd2hpdGUgewotCWJhY2tncm91bmQtY29sb3I6ICNGRkZGRkY7Ci19Ci0KLS8qIHNpemUgaW5wdXQgZm9yIGJhc2ljIHRhZ3Mgc3VjaCBhcyBwIGFuZCBsaSB0aGF0IGRvIG5vdCBpbmhlcml0IGZyb20gdGQgKi8gCi1ib2R5IHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjRkZGRkZGOwotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTJweDsKLQltYXJnaW4tbGVmdDogMHB4OwotCW1hcmdpbi1yaWdodDogMHB4OwotCW1hcmdpbi10b3A6IDBweDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLS5ib2xkIHsKLQlmb250LXdlaWdodCA6IDYwMDsKLX0KLQotLmJvcmRlcmRyayB7Ci0JYmFja2dyb3VuZC1jb2xvcjogIzAwMDAwMDsKLX0KLQotLyp1c2UgaW4gcG9wdXBzIGFzIGJvcmRlcnMgaW4gTXVsdGlzaXRlKi8gCi0uYm9yZGVycG9wdXAgewotCWJhY2tncm91bmQtY29sb3I6ICNERURFREU7Ci19Ci0KLS8qYm9yZGVycyB1c2VkIGFyb3VuZCBkYXRhLCBzZWUgUlVQKi8gCi0uYm9yZGVydGJsIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjRTlFOUU5OwotfQotCi0vKmRlc2lnbiBlbGVtZW50IHNpbXVsYXRpbmcgYSBkaW1lbnNpb25hbCBib3VuZGFyeSB0byBhIHRhYmxlICovIAotLmJvcmRlcnRibDJ7Ci0JYmFja2dyb3VuZC1jb2xvcjogI0JEQkRCRDsKLX0KLQotLyp1c2VkIGluIGNvbnRlbnQgYXJlYSBhcyBhIGhvcml6b250YWwgZGl2IGluIE11bHRpc2l0ZSovCi0uYm9yZGVydGJsMyB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI0VERURFRDsKLX0KLQotLmJyZWFkY3J1bWJzeyAKLWZvbnQtc2l6ZTogMTFweDsKLX0KLQotLyp1c2VkIGluIHRvcG5hdiAsIHNpbWlsYXIgdG8gY29udGV4dCB0b29sYmFyKi8KLS5idXR0b24gewotCWNvbG9yOiAjMDAwMDAwOwotCWZvbnQtZmFtaWx5OiB2ZXJkYW5hLCBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTBweDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLS8qZGVzY29wZWQ7IHVzZSBidXR0b24gaW5zdGVhZDsgdXNlZCBpbiB0b3BuYXYgLCBzaW1pbGFyIHRvIGNvbnRleHQgdG9vbGJhciovCi0uYnV0dG9uMyB7Ci0JY29sb3I6ICMwMDAwMDA7Ci0JZm9udC1mYW1pbHk6IHZlcmRhbmEsIGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxMHB4OwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotLyphY3RpdmUgc3RhdGUgb2YgbmF2aWdhdGlvbiBidXR0b24gaW4gY29udGV4dCB0b29sYmFyKi8gCi0uYnV0dG9ub24gewotCWJhY2tncm91bmQtY29sb3I6ICNERURFREU7Ci0JY29sb3I6ICMwMDAwMDA7Ci0JZm9udC1mYW1pbHk6IFZlcmRhbmEsIEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxMHB4OwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotLypuYXZpZ2F0aW9uIGJ1dHRvbnMgaW4gY29udGV4dCB0b29sYmFyKi8gCi0uYnV0dG9ucyB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI0VGRUZFRjsKLQljb2xvcjogIzAwMDAwMDsKLQlmb250LWZhbWlseTogVmVyZGFuYSwgQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDEwcHg7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi0vKiBkZXNjb3BlZCAocmVtb3ZlIGFmdGVyIHdhLWx0IHJlbGVhc2UpLS11c2UgYS5idXR0b247IHRoZXNlIGJ1dHRvbiBzdHlsZXMgYXJlIGZvciB0aGUgdGV4dHVhbCBidXR0b25zIGludGVuZGVkIHRvIHJlcGxhY2UgaW1hZ2UgY29uc3RydWN0cyBmb3IgaW50ZXJuYXRpb25hbGl6YXRpb24gKi8gCi0uYnV0dG9udHh0IHsKLQljb2xvcjogIzMzMzMzMzsKLQlmb250LWZhbWlseTogdmVyZGFuYSwgaGVsdmV0aWNhLCBhcmlhbCwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDEwcHg7Ci0JZm9udC13ZWlnaHQ6IDYwMDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLS8qIGRpc2FibGVkIHN0YXRlIG9mIG5vbi1pbWFnZSBidXR0b24qLyAKLS5idXR0b250eHRkc2JsIHsKLQljb2xvcjogIzdFN0U3RTsKLQlmb250LWZhbWlseTogdmVyZGFuYSwgaGVsdmV0aWNhLCBhcmlhbCwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDEwcHg7Ci0JZm9udC13ZWlnaHQ6IDYwMDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLS5jb3B5cmlnaHQgewotCWNvbG9yOiAjOTk5OTk5OwotCWZvbnQtc2l6ZTogMTBweDsKLX0KLQotLypibGFjayBjb3B5cmlnaHQgdXNlZCBpbiBSVVAqLwotLmNvcHlyaWdodGIgewotCWNvbG9yOiAjMDAwMDAwOwotCWZvbnQtc2l6ZTogMTBweDsKLX0KLQotZGQgewotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTJweDsKLQltYXJnaW4tbGVmdDogLTFweDsKLX0KLSAKLS8qZGVmZWN0IHBhZ2Ugc3ViaGVhZCAsIHVzZWQgaW4gcHJvamVjdCBjb25zb2xlKi8KLS5kZWZlY3RzdWJoZCB7Ci0JY29sb3I6ICMwMDY2OTk7Ci0JZm9udC13ZWlnaHQ6IDYwMDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0gCi0uZGlhbGdieHNoYWRvdzIgewotCWJhY2tncm91bmQtY29sb3I6ICM4NDg0ODQ7Ci19Ci0KLS5kaWFsb2d1ZWJveGJnIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjRDJEMkQyOwotfQotCi0vKmJhY2tncm91bmQgZm9yIGxvZ2luIHBhZ2VzKi8KLS5kaWFsb2d1ZWJveGJnMiB7Ci0JYmFja2dyb3VuZC1jb2xvcjogIzk5OTk5OTsKLX0KLQotLmRpYWxvZ3VlYm94Ym9yZGVyIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjMzMzMzMzOwotfQotIAotLmRpYWxvZ3VlYm94aGlnaGxpZ2h0IHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjRUZFRkVGOwotfQotCi0gLmRpYWxvZ3VlYm94bWVkaXVtIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjOEI4QjhCOwotfQotCi1kaXYgewotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotfQotCi0vKnVzZWQgdG8gYWZmZWN0IHJpZ2h0IG1hcmdpbiovIAotZGl2Lm1hcmdpbnJ0IHsKLQljbGVhcjogcmlnaHQ7Ci0JZmxvYXQ6IHJpZ2h0OwotCXdpZHRoOiA3cHg7Ci19Ci0KLWRpdi5tYXJnaW5zIHsKLQlmbG9hdDogbGVmdDsKLQltYXJnaW4tbGVmdDogN3B4OwotCW1hcmdpbi1yaWdodDogN3B4OwotCW1hcmdpbi10b3A6IDI1cHg7Ci19Ci0KLS8qZm9yIHBhZ2VzIHdpdGggYnV0dG9uIG5hdmlnYXRpb24gb24gdG9wKi8gCi1kaXYubWFyZ2luczIwIHsKLQlmbG9hdDogbGVmdDsKLQltYXJnaW4tbGVmdDogN3B4OwotCW1hcmdpbi1yaWdodDogN3B4OwotCW1hcmdpbi10b3A6IDIwcHg7Ci19Ci0KLS8qYWRkcyAxMCBweCBwYWRkaW5nIGFyb3VuZCB0ZXh0Ki8KLWRpdi5wYWQxMCB7Ci0JcGFkZGluZzogMTBweDsKLX0KLQotZGwgewotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTJweDsKLX0KLQotLypyZW1vdmVzIGRlZmF1bHQgYm90dG9tIG1hcmdpbiwgZG9lc24ndCB3b3JrIGluIE5TNC43eCAqLwotZGwuZGF0YSB7Ci0JbWFyZ2luLWJvdHRvbTogLTFweDsKLX0KLQotLyp0aXRsZSBmb3IgZXJyb3IgbWVzc2FnZXMqLwotLmVycm9yIHsKLQljb2xvcjogI0NDMDAwMDsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDI3cHg7Ci0JZm9udC13ZWlnaHQ6IDgwMDsKLX0KLSAKLS5mb3JtdGJsaGVhZCB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI0NDQ0NDQzsKLQljb2xvcjogIzAwMDAwMDsKLQlmb250LXNpemU6IDExcHg7Ci0JZm9udC13ZWlnaHQ6IDYwMDsKLX0KLQotLypjdXJyZW50IHNvcnRlZCBjb2x1bW4qLwotLmZvcm10YmxoZWFkYyB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI0U0RTRFNDsKLQljb2xvcjogIzAwMDAwMDsKLQlmb250LXNpemU6IDExcHg7Ci0JZm9udC13ZWlnaHQ6IDYwMDsKLX0KLQotLyp0byByZXBsYWNlIGgxIGFuZCBjb250ZW50aGVhZGVyIGxhcmdlKi8KLS5oZWFkZXIxIHsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDIycHg7Ci0JZm9udC13ZWlnaHQ6IDgwMDsKLX0KLQotLypoZWFkZXJzIHdpdGhpbiBwYWdlKi8KLS5oZWFkZXIyIHsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDE5cHg7Ci0JZm9udC13ZWlnaHQ6IDQwMDsKLX0KLQotLyp1c3VhbGx5IHVzZWQgbmV4dCB0byBoZWFkZXIxIGZvciBkb2N1bWVudCByb290IGZvbGRlciovCi0uaGVhZGVyMyB7Ci0JY29sb3I6ICM5OTk5OTk7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAyMnB4OwotCWZvbnQtd2VpZ2h0OiA4MDA7Ci19Ci0KLWkgewotCWZvbnQtc3R5bGU6IGl0YWxpYzsKLX0KLQotLmljb25ib3JkZXIgewotCWJhY2tncm91bmQtY29sb3I6ICNERURFREU7Ci19Ci0KLS8qdXNlZCBpbiBjb250cm9sc3RyaXAqLwotLmljb25vZmYgewotCXBvc2l0aW9uOiBhYnNvbHV0ZTsKLQl0b3A6IDFweDsKLQl2aXNpYmlsaXR5OiBoaWRkZW47Ci19Ci0KLS8qdXNlZCBpbiBjb250cm9sc3RyaXAqLwotLmljb25vbiB7Ci0JcG9zaXRpb246IGFic29sdXRlOwotCXRvcDogMXB4OwotCXZpc2liaWxpdHk6IHNob3c7Ci19Ci0KLS8qZm9udCBzaXplIHNldHVwIHNob3duIGluIHRoZSBpbnB1dCBib3ggd2hpY2ggaXMgaW5oZXJpdGVkIGJ5IGlucHV0WFgqLwotaW5wdXQgewotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTFweDsKLX0KLQotLyogMSxidXNpbmVzcyBzdGFuZGFyZCBtdWx0aWxpbmUgaW5wdXQgYm94IAotMix0aGlzIHN0eWxlIG9ubHkgYWN0aXZhdGUgaW4gSUUgKi8KLWlucHV0Lm1heDUwIHsKLQl3aWR0aDogMzYwcHg7Ci19Ci0KLS8qCi0xLGJ1c2luZXNzIHN0YW5kYXJkIG11bHRpbGluZSBpbnB1dCBib3ggCi0yLHRoaXMgc3R5bGUgb25seSBhY3RpdmF0ZSBpbiBJRQotKi8KLWlucHV0LnB4ODUgewotCXdpZHRoOiA4NXB4OwotfQotCi1pbnB1dC5yYWRpb3sKLQltYXJnaW4tdG9wOiAtMnB4OwotfQotCi0gLyp1c2VkIGluIHRyZWVzY3JpcHRzLCBsZWZ0bmF2Ki8KLS5sZWZ0bWVudSB7Ci0JYmFja2dyb3VuZC1jb2xvcjogIzk5OTk5OTsKLX0KLQotLyphZGRlZCBmb3IgeHNsX3Byb2Nlc3MtLXJlbW92ZSAxMi8wMiovCi0ubGVmdG5hdnRyZWUgewotCXBvc2l0aW9uOiBhYnNvbHV0ZTsKLQl3aWR0aDogMjAwcHg7Ci0JaGVpZ2h0OiAxMTVweDsKLQlsZWZ0OiA1OwotCXRvcDogMjU7Ci0JdmlzaWJpbGl0eTogdmlzaWJsZTsKLQl6LWluZGV4OiAwOwotfQotCi0ubm90ZXMgewotCWZvbnQtc2l6ZTogMTFweDsKLQlmb250LXdlaWdodDogNDAwOwkKLX0KLQotcCB7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxMnB4OwotfQotCi0vKmZvbnQgZm9yIHRoZSBudW1iZXJzIGluIHBhZ2luYXRpb24gbGlicmFyeSovCi0ucGFnZW51bWJlciB7Ci0JY29sb3I6ICM2NzY3Njc7CQotCWZvbnQtc2l6ZTogMTFweDsKLQlmb250LXdlaWdodDogNDAwOwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotIC8qZm9udCBmb3IgcHJldmlvdXMgJiBuZXh0IGluIHBhZ2luYXRpb24qLwotLnBhZ2VzdGVwcyB7Ci0JY29sb3I6ICMwMDAwMDA7Ci0JZm9udC1zaXplOiAxMXB4OwotCWZvbnQtd2VpZ2h0OiA2MDA7Ci0gfQotCi0vKnBvcHVwIGhlYWRlciovCi0ucG9waDEgewotCWZvbnQtc2l6ZTogMTZweDsKLQlmb250LXdlaWdodDogYm9sZDsKLX0KLQotLyp1c2VkIGluIHRyZWVzY3JpcHRzKi8KLS5wb3BsZWZ0bWVudSB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI0YwRjBGMDsKLQlib3JkZXI6IHRoaW4gc29saWQgI0NDQ0NDQzsKLQlsZWZ0OiAyMTBweDsJLyogaXQncyBub3Qgd29ya2luZyBvbiBucyA2LjIsIGllIDUuNSwgaWUgNiBhbmQgbnMgNywgcG9zc2libHkgY2FuIGJlIHJlbW92ZWQgc2FmZWx5LCBBbGkgUm9rbmksIDA5LzE4LzAyKi8KLQlwYWRkaW5nOiAycHg7Ci0JcG9zaXRpb246YWJzb2x1dGU7IAotCXRvcDogMjVweDsJLyogaXQncyBub3Qgd29ya2luZyBvbiBucyA2LjIsIGllIDUuNSwgaWUgNiBhbmQgbnMgNywgcG9zc2libHkgY2FuIGJlIHJlbW92ZWQgc2FmZWx5LCBBbGkgUm9rbmksIDA5LzE4LzAyKi8KLQl2aXNpYmlsaXR5OiBoaWRkZW47Ci0Jd2lkdGg6YXV0bzsKLQl6LWluZGV4OjEwOwkKLX0KLQotLypwcm9ncmVzc2JhciBib3JkZXJzIGluIE11bHRpc2l0ZSovCi0ucHJvZ3Jlc3NiYXJicmR7Ci0JYmFja2dyb3VuZC1jb2xvcjogIzY2NjY2NjsKLX0KLSAKLXNlbGVjdCB7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxMXB4OwotfQotCi0vKmRlc2NvcGVkIChyZW1vdmUgYWZ0ZXIgd2EtbHQgcmVsZWFzZSktLXVzZSBidXR0b24zOyB1c2VkIGluIHRvcG5hdiovCi0uc21hbGx0ZXh0IHsKLQljb2xvcjogIzAwMDAwMDsKLQlmb250LWZhbWlseTogdmVyZGFuYSwgYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDEwcHg7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi0vKiBmb250IGZvciByZWd1bGFyIGNvbnRlbnQgdGV4dCAqLwotdGQgewotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTJweDsKLX0KLQotLyogdGhlc2UgYnV0dG9uIHN0eWxlcyBhcmUgZm9yIHRoZSB0ZXh0dWFsIGJ1dHRvbnMgaW50ZW5kZWQgdG8gcmVwbGFjZSBpbWFnZSBjb25zdHJ1Y3RzIGZvciBpbnRlcm5hdGlvbmFsaXphdGlvbiAqLyAKLXRkLmJ1dHRvbmJvZHkgewotCWJhY2tncm91bmQtY29sb3I6ICNENEQ0RDQ7Ci19Ci0KLSAvKiBkaXNhYmxlZCB2ZXJzaW9uICovIAotdGQuYnV0dG9uYm9keWRzYmwgewotCWJhY2tncm91bmQtY29sb3I6ICNEQURBREE7Ci19Ci0KLS8qIGRlc2NvcGVkIChyZW1vdmUgYWZ0ZXIgd2EtbHQgcmVsZWFzZSk7IHVzZSBiZ2Jhc2ljICovCi10ZC5idXR0b25oaWdobGlnaHQgewotCWJhY2tncm91bmQtY29sb3I6ICNGRkZGRkY7Ci19Ci0KLS8qbm9uLWltYWdlIGJ1dHRvbiovCi10ZC5idXR0b25zaGFkb3cgewotCWJhY2tncm91bmQtY29sb3I6ICM2RDZENkQ7Ci19Ci0KLS8qIG5vbi1pbWFnZSBidXR0b24tLWRpc2FibGVkIHZlcnNpb24gKi8KLXRkLmJ1dHRvbnNoYWRvd2RzYmwgewotCWJhY2tncm91bmQtY29sb3I6ICNBMkEyQTI7Ci19Ci0KLS8qIGRhdGEgd2l0aGluIGEgdGFibGUgaGlnaGxpZ2h0ZWQgaW4gbGlnaHQgZ3JheSovCi10ZC50YmxoaWdobHQzIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjRTlFOUU5OwotfQotCi0gLypncmF5IGRhdGEgaGlnaGxpZ2h0IG9yIHBhZ2UgYmFja2dyb3VuZCovIAotLnRkbGlnaHQxIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjRUZFRkVGOwotfQotCi10ZXh0YXJlYSB7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxMXB4OwotfQotCi0vKmdsb2JhbCBuYXYqLwotLnRvcGJhcmRpdmlkZXIgewotCWJhY2tncm91bmQtY29sb3I6ICMzMzk5Q0M7Ci19Ci0gCi0gLypnbG9iYWwgbmF2Ki8KLS50b3BmcmFtZWJnIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjRDJEMkQyOwotfQotCi0vKmRlc2NvcGVkIChyZW1vdmUgYWZ0ZXIgd2EtbHQgcmVsZWFzZSktLXVzZWQgYm9yZGVydGJsMzsgdXNlZCBpbiBjb250ZW50IGFyZWEgYXMgYSBob3Jpem9udGFsIGRpdiBpbiBNdWx0aXNpdGUqLwotLnRvcGZyYW1lYmdncmV5ZWQgewotCWJhY2tncm91bmQtY29sb3I6ICNFREVERUQ7Ci19Ci0KLS8qZ2xvYmFsIG5hdiovCi0udG9wZnJhbWVoaWdobGlnaHQgewotCWJhY2tncm91bmQtY29sb3I6ICNCNkI1QjU7Ci19Ci0KLS8qZ2xvYmFsIG5hdiovCi0udG9wZnJhbWVoaWdobGlnaHQyIHsgCi0JYmFja2dyb3VuZC1jb2xvcjogI0VGRUZFRjsKLX0KLQotLypnbG9iYWwgbmF2Ki8KLS50b3BmcmFtZWxvZ29iZyB7Ci0JYmFja2dyb3VuZC1jb2xvcjogIzAwNjY5OTsKLX0KLQotLypnbG9iYWwgbmF2Ki8KLS50b3BmcmFtZXNoYWRvdyB7Ci0JYmFja2dyb3VuZC1jb2xvcjogIzg0ODQ4NDsKLX0KLQotLypnbG9iYWwgaWNvbiBvcGVyYXRpb25zIHRvb2xiYXIqLwotLnRvcGxlZnRuYXYgewotCWNvbG9yOiAjMDAwMDAwOwotCWZvbnQtZmFtaWx5OiB2ZXJkYW5hLCBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTBweDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLS8qZ2xvYmFsIGlucHV0IG9wZXJhdGlvbnMgdG9vbGJhciovCi0udG9wbGVmdG5hdmJvbGQgewotCWZvbnQtZmFtaWx5OiB2ZXJkYW5hLCBicmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTBweDsgCi0JZm9udC13ZWlnaHQ6IDYwMDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLS8qdGV4dCBvbiB0b3BuYXYsIHRvcCByaWdodCBzZWN0aW9uKi8KLS50b3ByaWdodG5hdiB7Ci0JY29sb3I6ICNGRkZGRkY7Ci0JZm9udC1mYW1pbHk6IHZlcmRhbmEsIGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxMHB4OwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotLnRvcHJpZ2h0bmF2Z3JleQotewotCWZvbnQtZmFtaWx5OiBWZXJkYW5hLCBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTBweDsKLQljb2xvcjogIzAwMDAwMDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLS8qbGlzdC1zdHlsZS1pbWFnZTogdXJsKGltYWdlcy9kb3duYnV0dG9uLmdpZik7IGRvZXNuJ3Qgd29yayBmb3IgbnM0Ki8KLXVsIHsKLQlsaXN0LXN0eWxlLXR5cGU6IHNxdWFyZTsKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvc3R5bGVzaGVldHMvY29tbW9uX2Jhc2VVTlguY3NzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9zdHlsZXNoZWV0cy9jb21tb25fYmFzZVVOWC5jc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0ZWM5MWMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9zdHlsZXNoZWV0cy9jb21tb25fYmFzZVVOWC5jc3MKKysrIC9kZXYvbnVsbApAQCAtMSw2MTUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqLwotCi0vKm11c3QgYWRkIGZvbnQgdHlwZSBpZiBjbGFzcyBpcyBiZWluZyB1c2VkIGFzIGEgbGluayBhcyB3ZWxsIGFzIG5vLWxpbmsqLwotCi1hIHsKLQljb2xvcjogIzMzNjY5OTsKLX0KLQotYS50b3ByaWdodG5hdjphY3RpdmUgewotCWNvbG9yOiAjOTlDQ0NDOwotfQotCi1hLnRvcHJpZ2h0bmF2Z3JleTphY3RpdmUgewotCWNvbG9yOiAjQ0MwMDAwOwotfQotCi0KLS8qIGFjdGlvbiB0ZXh0IHVzdWFsbHkgbG9jYXRlZCBvbiB0b3Agb2YgcGFnZTtpZS4sIHNlbGVjdCBhbGwqLwotYS5hY3Rpb25saW5rIHsKLQljb2xvcjogIzMzNjY5OTsKLQlmb250LXNpemU6IDE2cHg7Ci0JdGV4dC1kZWNvcmF0aW9uIDogbm9uZTsJCi19Ci0gCi0vKiBmb250IGZvciBhY3Rpb247aWUuLCBzZWxlY3QgYWxsKi8KLWEuYWN0aW9uc2VsZWN0b3IgewotCWNvbG9yOiAjMDAwMDAwOwotCWZvbnQtZmFtaWx5OiB2ZXJkYW5hLCBoZWx2ZXRpY2EsIGFyaWFsLCBzYW5zLXNlcmlmOwkKLQlmb250LXNpemU6IDE2cHg7Ci19Ci0KLWEuYmFzaWMgewotCWNvbG9yOiAjMDAwMDAwOwotfQotCi1hLmJyZWFkY3J1bWJzIHsKLQljb2xvcjogIzAwMDAwMDsKLQlmb250LXNpemU6IDE2cHg7Ci19Ci0KLS8qIGZvciBub24taW1hZ2UgYnV0dG9ucywgZm9yIGludGVybmF0aW9uYWxpemF0aW9uICovCi1hLmJ1dHRvbiB7Ci0JY29sb3I6ICMzMzMzMzM7Ci0JZm9udC1mYW1pbHk6IHZlcmRhbmEsIGhlbHZldGljYSwgYXJpYWwsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxNXB4OwotCWZvbnQtd2VpZ2h0OiA2MDA7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi0vKiBEZXNjb3BlZCwgSXQncyBub3QgdXNlZCBpbiBjdXJyZW50IHByb2plY3RzLCB0byBiZSBhcmNoaXZlZCBhZnRlciA2IG1vbnRocy4gQWxpIFJva25pLCAwOS8wOS8wMiAqLwotLyogZm9yIGNvbnRleHQgdG9vbGJhciBidXR0b25zIGluIE11bHRpc2l0ZSwgZm9yIGludGVybmF0aW9uYWxpemF0aW9uICovCi1hLmJ1dHRvbjIgewotCWNvbG9yOiAjMDAwMDAwOwotCWZvbnQtZmFtaWx5OiB2ZXJkYW5hLCBoZWx2ZXRpY2EsIGFyaWFsLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTZweDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLWEuYnV0dG9uOmFjdGl2ZSB7Ci0JY29sb3I6ICMzMzMzMzM7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi0vKiBmb3Igbm9uLWltYWdlIGJ1dHRvbnMsIGZvciBpbnRlcm5hdGlvbmFsaXphdGlvbiAqLwotYS5idXR0b246aG92ZXIgewotCWNvbG9yOiAjMzMzMzMzOwotfQotCi1hLmNvcHlyaWdodCB7Ci0JY29sb3I6ICMzMzY2OTk7Ci0JZm9udC1mYW1pbHk6IHZlcmRhbmEsIGhlbHZldGljYSwgYXJpYWwsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxNXB4OwotfQotCi0vKmFjdGlvbmJhciBvbiB3aGl0ZSBiYWNrZ3JvdW5kKi8KLS5hY3Rpb25zZWxlY3QyIHsKLQljb2xvcjogIzAwMDAwMDsKLQlmb250LWZhbWlseTogdmVyZGFuYSwgaGVsdmV0aWNhLCBhcmlhbCwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDE2cHg7Ci19Ci0KLS8qYWN0aW9uYmFyIGFwcGVhcnMgb24gdG9wIGFuZC9vciBib3R0b20gb2YgcGFnZSovCi0uYWN0aW9uc2VsZWN0b3IgewotCWJhY2tncm91bmQtY29sb3I6ICNFOUU5RTk7Ci0JY29sb3I6ICMwMDAwMDA7Ci0JZm9udC1mYW1pbHk6IHZlcmRhbmEsIGhlbHZldGljYSwgYXJpYWwsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxNnB4OwotfQotCi0vKmNvbHVtbiBoZWFkaW5ncyovCi1hLmZvcm10YmxoZWFkIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjQ0NDQ0NDOwotCWNvbG9yOiAjMDAwMDAwOwotCWZvbnQtZmFtaWx5OiB2ZXJkYW5hLCBoZWx2ZXRpY2EsIGFyaWFsLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTZweDsKLQlmb250LXdlaWdodCA6IDYwMDsKLX0KLQotYS50b3ByaWdodG5hdmdyZXk6aG92ZXIgewotCWNvbG9yOiAjQ0MwMDAwOwotfSAKLWEudG9wcmlnaHRuYXY6aG92ZXIgewotCWNvbG9yOiAjOTlDQ0NDOwotfSAvKm5hdnRyZWUgaXRlbSBvciBkb2MqLwotYS5uYXZ0cmVlaXRlbSB7Ci0JY29sb3I6ICMwMDAwMDA7Ci0JZm9udC1mYW1pbHk6IHZlcmRhbmEsIGhlbHZldGljYSwgYXJpYWwsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxNnB4OwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotLypzaXRlbWFwIGhlYWRlciovCi1hLnNpdGVtYXBoewotCWZvbnQtZmFtaWx5OiB2ZXJkYW5hLCBoZWx2ZXRpY2EsIGFyaWFsLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMjVweDsKLQlmb250LXdlaWdodDogNjAwOwotfQotCi0vKnVzZWQgaW4gZm9yZ290IHBhc3N3b3JkLCBhbnkgb3RoZXIgc21hbGwgdGV4dCBsaW5rcyovCi1hLnNtYWxsIHsKLQlmb250LWZhbWlseTogdmVyZGFuYSwgaGVsdmV0aWNhLCBhcmlhbCwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDE2cHg7Ci19Ci0KLWIgewotCWZvbnQtZmFtaWx5OiB2ZXJkYW5hLCBoZWx2ZXRpY2EsIGFyaWFsLCBzYW5zLXNlcmlmOwotCWZvbnQtd2VpZ2h0OiA2MDA7Ci19Ci0KLS8qc3RhbmRhcmQgdGV4dCovCi0uYmFzaWMgewotCWNvbG9yOiAjMDAwMDAwOwotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMThweDsKLQlmb250LXdlaWdodDogNDAwOwotfQotCi0uYmdiYXNpYyB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI0ZGRkZGRjsKLX0KLQotLypkZXNjb3BlZCAocmVtb3ZlIGFmdGVyIHdhLWx0IHJlbGVhc2UpOyB1c2UgYmdiYXNpYyAqLwotLmJnd2hpdGUgewotCWJhY2tncm91bmQtY29sb3I6ICNGRkZGRkY7Ci19Ci0KLS8qIHNpemUgaW5wdXQgZm9yIGJhc2ljIHRhZ3Mgc3VjaCBhcyBwIGFuZCBsaSB0aGF0IGRvIG5vdCBpbmhlcml0IGZyb20gdGQgKi8gCi1ib2R5IHsKLQliYWNrZ3JvdW5kLWNvbG9yIDogI0ZGRkZGRjsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDE4cHg7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotCW1hcmdpbi1sZWZ0OiAwcHg7Ci0JbWFyZ2luLXJpZ2h0OiAwcHg7Ci0JbWFyZ2luLXRvcDogMHB4OwotfQotCi0uYm9sZCB7Ci0JZm9udC13ZWlnaHQ6IDYwMDsKLX0KLQotLmJvcmRlcmRyayB7Ci0JYmFja2dyb3VuZC1jb2xvcjogIzAwMDAwMDsKLX0KLQotLyp1c2UgaW4gcG9wdXBzIGFzIGJvcmRlcnMgaW4gTXVsdGlzaXRlKi8gCi0uYm9yZGVycG9wdXAgewotCWJhY2tncm91bmQtY29sb3I6ICNERURFREU7Ci19Ci0KLS8qYm9yZGVycyB1c2VkIGFyb3VuZCBkYXRhLCBzZWUgUlVQKi8KLS5ib3JkZXJ0YmwgewotCWJhY2tncm91bmQtY29sb3I6ICNFOUU5RTk7Ci19Ci0KLS8qZGVzaWduIGVsZW1lbnQgc2ltdWxhdGluZyBhIGRpbWVuc2lvbmFsIGJvdW5kYXJ5IHRvIGEgdGFibGUgKi8gCi0uYm9yZGVydGJsMiB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI0JEQkRCRDsKLX0KLQotLyp1c2VkIGluIGNvbnRlbnQgYXJlYSBhcyBhIGhvcml6b250YWwgZGl2IGluIE11bHRpc2l0ZSovCi0uYm9yZGVydGJsMyB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI0VERURFRDsKLX0KLQotLmJyZWFkY3J1bWJzIHsKLWZvbnQtc2l6ZTogMTFweDsKLX0KLQotLyp1c2VkIGluIHRvcG5hdiAsIHNpbWlsYXIgdG8gY29udGV4dCB0b29sYmFyKi8KLS5idXR0b24gewotCWNvbG9yOiAjMDAwMDAwOwotCWZvbnQtZmFtaWx5OiB2ZXJkYW5hLCBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTVweDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLS8qZGVzY29wZWQ7IHVzZSBidXR0b24gaW5zdGVhZDsgdXNlZCBpbiB0b3BuYXYgLCBzaW1pbGFyIHRvIGNvbnRleHQgdG9vbGJhciovCi0uYnV0dG9uMyB7Ci0JY29sb3I6ICMwMDAwMDA7Ci0JZm9udC1mYW1pbHk6IHZlcmRhbmEsIGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxNXB4OwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotLyphY3RpdmUgc3RhdGUgb2YgbmF2aWdhdGlvbiBidXR0b24gaW4gY29udGV4dCB0b29sYmFyKi8gCi0uYnV0dG9ub24gewotCWJhY2tncm91bmQtY29sb3I6ICNERURFREU7Ci0JY29sb3I6ICMwMDAwMDA7Ci0JZm9udC1mYW1pbHk6IFZlcmRhbmEsIEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7CQotCWZvbnQtc2l6ZTogMTVweDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLS8qbmF2aWdhdGlvbiBidXR0b25zIGluIGNvbnRleHQgdG9vbGJhciovCi0uYnV0dG9ucyB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI0VGRUZFRjsKLQljb2xvcjogIzAwMDAwMDsKLQlmb250LWZhbWlseTogVmVyZGFuYSwgQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsJCi0JZm9udC1zaXplOiAxNXB4OwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotLyogZGVzY29wZWQgKHJlbW92ZSBhZnRlciB3YS1sdCByZWxlYXNlKS0tdXNlIGEuYnV0dG9uOyB0aGVzZSBidXR0b24gc3R5bGVzIGFyZSBmb3IgdGhlIHRleHR1YWwgYnV0dG9ucyBpbnRlbmRlZCB0byByZXBsYWNlIGltYWdlIGNvbnN0cnVjdHMgZm9yIGludGVybmFsaXphdGlvbiovCi0uYnV0dG9udHh0IHsKLQljb2xvcjogIzMzMzMzMzsKLQlmb250LWZhbWlseTogdmVyZGFuYSwgaGVsdmV0aWNhLCBhcmlhbCwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDE1cHg7Ci0JZm9udC13ZWlnaHQ6IDYwMDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLS8qIGRpc2FibGVkIHN0YXRlIG9mIG5vbi1pbWFnZSBidXR0b24qLyAKLS5idXR0b250eHRkc2JsIHsKLQljb2xvcjogIzdFN0U3RTsKLQlmb250LWZhbWlseTogdmVyZGFuYSwgaGVsdmV0aWNhLCBhcmlhbCwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDE1cHg7Ci0JZm9udC13ZWlnaHQ6IDYwMDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLS5jb3B5cmlnaHQgewotCWNvbG9yOiAjOTk5OTk5OwotCWZvbnQtc2l6ZTogMTVweDsKLX0KLQotLypibGFjayBjb3B5cmlnaHQgdXNlZCBpbiBSVVAqLwotLmNvcHlyaWdodGIgewotCWNvbG9yOiAjMDAwMDAwOwotCWZvbnQtc2l6ZTogMTVweDsKLX0KLQotZGQgewotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMThweDsKLQltYXJnaW4tbGVmdDogLTFweDsKLX0KLQotLypkZWZlY3QgcGFnZSBzdWJoZWFkICwgdXNlZCBpbiBwcm9qZWN0IGNvbnNvbGUqLwotLmRlZmVjdHN1YmhkIHsKLQljb2xvcjogIzAwNjY5OTsKLQlmb250LXdlaWdodDogNjAwOwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotLmRpYWxnYnhzaGFkb3cyIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjODQ4NDg0OwotfQotCi0uZGlhbG9ndWVib3hiZyB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI0QyRDJEMjsKLX0KLQotLypiYWNrZ3JvdW5kIGZvciBsb2dpbiBwYWdlcyovCi0uZGlhbG9ndWVib3hiZzIgewotCWJhY2tncm91bmQtY29sb3I6ICM5OTk5OTk7Ci19Ci0KLS5kaWFsb2d1ZWJveGJvcmRlciB7Ci0JYmFja2dyb3VuZC1jb2xvcjogIzMzMzMzMzsKLX0KLQotLmRpYWxvZ3VlYm94aGlnaGxpZ2h0IHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjRUZFRkVGOwotfQotCi0uZGlhbG9ndWVib3htZWRpdW0gewotCWJhY2tncm91bmQtY29sb3I6ICM4QjhCOEI7Ci19Ci0KLWRpdiB7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci19Ci0KLS8qdXNlZCB0byBhZmZlY3QgcmlnaHQgbWFyZ2luKi8gCi1kaXYubWFyZ2lucnQgewotCWNsZWFyOiByaWdodDsKLQlmbG9hdDogcmlnaHQ7Ci0Jd2lkdGg6IDdweDsKLX0KLQotZGl2Lm1hcmdpbnMgewotCWZsb2F0OiBsZWZ0OwotCW1hcmdpbi1sZWZ0OiA3cHg7Ci0JbWFyZ2luLXJpZ2h0OiA3cHg7Ci0JbWFyZ2luLXRvcDogMjVweDsKLX0KLQotLypmb3IgcGFnZXMgd2l0aCBidXR0b24gbmF2aWdhdGlvbiBvbiB0b3AqLyAKLWRpdi5tYXJnaW5zMjAgewotCWZsb2F0OiBsZWZ0OwotCW1hcmdpbi1sZWZ0OiA3cHg7Ci0JbWFyZ2luLXJpZ2h0OiA3cHg7Ci0JbWFyZ2luLXRvcDogMjBweDsJCi19Ci0KLS8qYWRkcyAxMCBweCBwYWRkaW5nIGFyb3VuZCB0ZXh0Ki8KLWRpdi5wYWQxMCB7Ci0JcGFkZGluZzogMTBweDsKLX0KLQotZGwgewotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMThweDsKLX0KLQotLypyZW1vdmVzIGRlZmF1bHQgYm90dG9tIG1hcmdpbiwgZG9lc24ndCB3b3JrIGluIE5TNC43eCAqLyAKLWRsLmRhdGEgeyAKLQltYXJnaW4tYm90dG9tOiAtMXB4OwotfQotCi0vKnRpdGxlIGZvciBlcnJvciBtZXNzYWdlcyovCi0uZXJyb3IgewotCWNvbG9yOiAjQ0MwMDAwOwotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMzBweDsKLQlmb250LXdlaWdodDogODAwOwotfQotCi0uZm9ybXRibGhlYWQgewotCWJhY2tncm91bmQtY29sb3I6ICNDQ0NDQ0M7Ci0JY29sb3I6ICMwMDAwMDA7Ci0JZm9udC1zaXplOiAxNnB4OwotCWZvbnQtd2VpZ2h0OiA2MDA7Ci19Ci0KLS8qY3VycmVudCBzb3J0ZWQgY29sdW1uKi8KLS5mb3JtdGJsaGVhZGMgewotCWJhY2tncm91bmQtY29sb3I6ICNFNEU0RTQ7Ci0JY29sb3I6ICMwMDAwMDA7Ci0JZm9udC1zaXplOiAxNnB4OwotCWZvbnQtd2VpZ2h0OiA2MDA7Ci19Ci0KLS8qdG8gcmVwbGFjZSBoMSBhbmQgY29udGVudGhlYWRlciBsYXJnZSovCi0uaGVhZGVyMSB7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAzM3B4OwotCWZvbnQtd2VpZ2h0OiA4MDA7Ci19Ci0KLS8qaGVhZGVycyB3aXRoaW4gcGFnZSovCi0uaGVhZGVyMiB7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAyOHB4OwotCWZvbnQtd2VpZ2h0OiA0MDA7Ci19Ci0KLS8qdXN1YWxseSB1c2VkIG5leHQgdG8gaGVhZGVyMTsgZm9yIGRvY3VtZW50IHJvb3QgZm9sZGVyKi8KLS5oZWFkZXIzIHsKLQljb2xvcjogIzk5OTk5OTsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDMzcHg7Ci0JZm9udC13ZWlnaHQ6IDgwMDsKLX0KLQotaSB7Ci0JZm9udC1zdHlsZTogaXRhbGljOwotfQotCi0uaWNvbmJvcmRlciB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI0RFREVERTsKLX0KLQotLyp1c2VkIGluIGNvbnRyb2xzdHJpcCovCi0uaWNvbm9mZiB7Ci0JcG9zaXRpb246IGFic29sdXRlOyAKLQl0b3A6IDFweDsKLQl2aXNpYmlsaXR5OiBoaWRkZW47Ci19Ci0KLS8qdXNlZCBpbiBjb250cm9sc3RyaXAqLwotLmljb25vbiB7Ci0JcG9zaXRpb246IGFic29sdXRlOwotCXRvcDogMXB4OwotCXZpc2liaWxpdHk6IHNob3c7Ci19Ci0KLS8qZm9udCBzaXplIHNldHVwIHNob3duIGluIHRoZSBpbnB1dCBib3ggd2hpY2ggaXMgaW5oZXJpdGVkIGJ5IGlucHV0WFgqLwotaW5wdXQgewotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTZweDsKLX0KLQotLyogMSxidXNpbmVzcyBzdGFuZGFyZCBtdWx0aWxpbmUgaW5wdXQgYm94IAotMix0aGlzIHN0eWxlIG9ubHkgYWN0aXZhdGUgaW4gSUUgKi8KLWlucHV0Lm1heDUwIHsKLQl3aWR0aDogMzYwcHg7Ci19Ci0KLS8qCi0xLGJ1c2luZXNzIHN0YW5kYXJkIG11bHRpbGluZSBpbnB1dCBib3ggCi0yLHRoaXMgc3R5bGUgb25seSBhY3RpdmF0ZSBpbiBJRQotKi8KLWlucHV0LnB4ODUgewotCXdpZHRoOiA4NXB4OwotfQotCi1pbnB1dC5yYWRpbyB7Ci0KLX0KLQotIC8qdXNlZCBpbiB0cmVlc2NyaXB0cywgbGVmdG5hdiovCi0ubGVmdG1lbnUgewotCWJhY2tncm91bmQtY29sb3I6ICM5OTk5OTk7Ci19Ci0KLS5ub3RlcyB7Ci0JZm9udC1zaXplOiAxNnB4OwotCWZvbnQtd2VpZ2h0OiA0MDA7Ci19Ci0KLXAgewotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMThweDsKLX0KLQotLypmb250IGZvciB0aGUgbnVtYmVycyBpbiBwYWdpbmF0aW9uIGxpYnJhcnkqLwotLnBhZ2VudW1iZXIgewotCWNvbG9yOiAjNjc2NzY3OwotCWZvbnQtc2l6ZTogMTZweDsKLQlmb250LXdlaWdodCA6IDQwMDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLSAvKmZvbnQgZm9yIHByZXZpb3VzICYgbmV4dCBpbiBwYWdpbmF0aW9uKi8KLS5wYWdlc3RlcHMgewotCWNvbG9yOiAjMDAwMDAwOwotCWZvbnQtc2l6ZTogMTZweDsKLQlmb250LXdlaWdodDogNjAwOwotfQotCi0vKnBvcHVwIGhlYWRlciovCi0ucG9waDEgewotCWZvbnQtc2l6ZTogMjRweDsKLQlmb250LXdlaWdodDogYm9sZDsKLX0KLQotLyp1c2VkIGluIHRyZWVzY3JpcHRzKi8KLS5wb3BsZWZ0bWVudSB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI0YwRjBGMDsKLQlib3JkZXI6IHRoaW4gc29saWQgI0NDQ0NDQzsgCi0JbGVmdDogMjEwcHg7CS8qIGl0J3Mgbm90IHdvcmtpbmcgb24gbnMgNi4yLCBpZSA1LjUsIGllIDYgYW5kIG5zIDcsIHBvc3NpYmx5IGNhbiBiZSByZW1vdmVkIHNhZmVseSwgQWxpIFJva25pLCAwOS8xOC8wMiovCi0JcGFkZGluZzogMnB4OwotCXBvc2l0aW9uOiBhYnNvbHV0ZTsgCi0JdG9wOiAyNXB4OwkvKiBpdCdzIG5vdCB3b3JraW5nIG9uIG5zIDYuMiwgaWUgNS41LCBpZSA2IGFuZCBucyA3LCBwb3NzaWJseSBjYW4gYmUgcmVtb3ZlZCBzYWZlbHksIEFsaSBSb2tuaSwgMDkvMTgvMDIqLwotCXZpc2liaWxpdHk6IGhpZGRlbjsgCi0Jd2lkdGg6NzVweDsKLQl6LWluZGV4OjEwOwotfQotCi0vKnByb2dyZXNzYmFyIGJvcmRlcnMgaW4gTXVsdGlzaXRlKi8KLS5wcm9ncmVzc2JhcmJyZCB7Ci0JYmFja2dyb3VuZC1jb2xvcjogIzY2NjY2NjsKLX0KLQotc2VsZWN0IHsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDE2cHg7Ci19Ci0KLS8qZGVzY29wZWQgKHJlbW92ZSBhZnRlciB3YS1sdCByZWxlYXNlKS0tdXNlIGJ1dHRvbnMzOyB1c2VkIGluIHRvcG5hdiovCi0uc21hbGx0ZXh0IHsKLQljb2xvcjogIzAwMDAwMDsKLQlmb250LWZhbWlseTogdmVyZGFuYSwgYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDE1cHg7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi0vKiBmb250IGZvciByZWd1bGFyIGNvbnRlbnQgdGV4dCAqLwotdGQgewotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTZweDsKLX0KLQotLyogdGhlc2UgYnV0dG9uIHN0eWxlcyBhcmUgZm9yIHRoZSB0ZXh0dWFsIGJ1dHRvbnMgaW50ZW5kZWQgdG8gcmVwbGFjZSBpbWFnZSBjb25zdHJ1Y3RzIGZvciBpbnRlcm5hdGlvbmFsaXphdGlvbiAqLyAKLXRkLmJ1dHRvbmJvZHkgewotCWJhY2tncm91bmQtY29sb3I6ICNENEQ0RDQ7Ci19Ci0KLS8qIGRpc2FibGVkIHZlcnNpb24gKi8KLXRkLmJ1dHRvbmJvZHlkc2JsIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjREFEQURBOwotfQotCi0vKiBkZXNjb3BlZCAocmVtb3ZlIGFmdGVyIHdhLWx0IHJlbGVhc2UpOyB1c2UgYmdiYXNpYyAqLwotdGQuYnV0dG9uaGlnaGxpZ2h0IHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjRkZGRkZGOwotfQotCi0vKm5vbi1pbWFnZSBidXR0b24qLwotdGQuYnV0dG9uc2hhZG93IHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjNkQ2RDZEOwotfQotCi0vKiBub24taW1hZ2UgYnV0dG9uLS1kaXNhYmxlZCB2ZXJzaW9uICovCi10ZC5idXR0b25zaGFkb3dkc2JsIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjQTJBMkEyOwotfQotCi0vKiBkYXRhIHdpdGhpbiBhIHRhYmxlIGhpZ2hsaWdodGVkIGluIGxpZ2h0IGdyYXkqLwotdGQudGJsaGlnaGx0MyB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI0U5RTlFOTsKLX0KLQotLypncmF5IGRhdGEgaGlnaGxpZ2h0IG9yIHBhZ2UgYmFja2dyb3VuZCovIAotLnRkbGlnaHQxIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjRUZFRkVGOwotfQotCi10ZXh0YXJlYSB7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxNnB4OwotfQotCi0vKmdsb2JhbCBuYXYqLwotLnRvcGJhcmRpdmlkZXIgewotCWJhY2tncm91bmQtY29sb3I6ICMzMzk5Q0M7Ci19Ci0KLS8qZ2xvYmFsIG5hdiovCi0udG9wZnJhbWViZyB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI0QyRDJEMjsKLX0KLQotLypkZXNjb3BlZCAocmVtb3ZlIGFmdGVyIHdhLWx0IHJlbGVhc2UpLXVzZSBib3JkZXJ0YmwzOyB1c2VkIGluIGNvbnRlbnQgYXJlYSBhcyBhIGhvcml6b250YWwgZGl2IGluIE11bHRpc2l0ZSovCi0udG9wZnJhbWViZ2dyZXllZCB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI0VERURFRDsKLX0KLQotLypnbG9iYWwgbmF2Ki8KLS50b3BmcmFtZWhpZ2hsaWdodCB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI0I2QjVCNTsKLX0KLQotLypnbG9iYWwgbmF2Ki8KLS50b3BmcmFtZWhpZ2hsaWdodDIgewotCWJhY2tncm91bmQtY29sb3I6ICNFRkVGRUY7Ci19Ci0KLS8qZ2xvYmFsIG5hdiovCi0udG9wZnJhbWVsb2dvYmcgewotCWJhY2tncm91bmQtY29sb3I6ICMwMDY2OTk7Ci19Ci0KLS8qZ2xvYmFsIG5hdiovCi0udG9wZnJhbWVzaGFkb3cgewotCWJhY2tncm91bmQtY29sb3I6ICM4NDg0ODQ7Ci19Ci0KLS8qZ2xvYmFsIGljb24gb3BlcmF0aW9ucyB0b29sYmFyKi8KLS50b3BsZWZ0bmF2IHsKLQljb2xvcjogIzAwMDAwMDsKLQlmb250LWZhbWlseTogdmVyZGFuYSwgYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDE1cHg7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi0vKmdsb2JhbCBpbnB1dCBvcGVyYXRpb25zIHRvb2xiYXIqLwotLnRvcGxlZnRuYXZib2xkIHsKLQlmb250LWZhbWlseTogdmVyZGFuYSwgYnJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDE1cHg7IAotCWZvbnQtd2VpZ2h0OiA2MDA7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOyAKLX0KLQotLyp0ZXh0IG9uIHRvcG5hdiwgdG9wIHJpZ2h0IHNlY3Rpb24qLwotLnRvcHJpZ2h0bmF2IHsKLQljb2xvcjogI0ZGRkZGRjsKLQlmb250LWZhbWlseTogdmVyZGFuYSwgYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDE0cHg7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotLnRvcHJpZ2h0bmF2Z3JleQotewotCWZvbnQtZmFtaWx5OiBWZXJkYW5hLCBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTBweDsKLQljb2xvcjogIzAwMDAwMDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLS8qbGlzdC1zdHlsZS1pbWFnZTogdXJsKGltYWdlcy9kb3duYnV0dG9uLmdpZik7IGRvZXNuJ3Qgd29yayBmb3IgbnM0Ki8KLXVsIHsKLQlsaXN0LXN0eWxlLXR5cGU6IHNxdWFyZTsKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvc3R5bGVzaGVldHMvZGVzaWduLmNzcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvc3R5bGVzaGVldHMvZGVzaWduLmNzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDhkOTI0Ni4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L3N0eWxlc2hlZXRzL2Rlc2lnbi5jc3MKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICovCi0KLSAvKiB0aGlzIGlzIGEgYm9yZGVyIHN0eWxlIGZvciB0aGUgdG9wIG1lbnUgYm94ICovCi0gLmJveHRoaW4gewotCWJvcmRlci1jb2xvcjogI0U5RTlFOTsKLQlib3JkZXItc3R5bGU6IHNvbGlkOwotCWJvcmRlci13aWR0aDogdGhpbjsKLQlmbG9hdDogbGVmdDsKLQltYXJnaW4tYm90dG9tOiAxZW07Ci0JbWFyZ2luLXRvcDogMWVtOwotCXBhZGRpbmc6IDFlbTsKLQl3aWR0aDogMjc1cHg7Ci19Ci0KLSAvKiB0aGlzIGlzIGEgY29udGFpbmVyIHRvIGtlZXAgdGhlIHRvcCBtZW51IGlzb2xhdGVkIGZyb20gbWF0ZXJpYWwgYmVsb3cgaXQgKi8KLS5jb250YWluZXIgewotCWNsZWFyOiBib3RoOwotCXdpZHRoOiAxMDAlOwotfQotCi0gLyogYSBzaW1wbGUgaW5zZXQgZm9yIGJsb2NrZWQgZWxlbWVudHMgdG8gaW5kZW50ICovCi0uaW5zZXQgewotCWNsZWFyOiBib3RoOwotCW1hcmdpbi1sZWZ0OiAxM3B4OwotCW1hcmdpbi10b3A6IDRweDsKLQl3aWR0aDogMTAwJTsKLX0KLQotLm1pZGFsaWduIHsKLQl2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOwotfQotCi0gLyogYW4gZW1wdHkgZWxlbWVudCBmb3IgdGhlIGJlbmVmaXQgb2YgSS5FLiA1KyBzbyB0aGF0IHRoZSB0b3AgbWVudSBpcyBjb25zdHJhaW5lZCB0byBsZWZ0ICovCi0uc3BhY2luZyB7Ci0JY2xlYXI6IHJpZ2h0OwotCWZsb2F0OiByaWdodDsKLQl3aWR0aDogMTAwcHg7Ci19Ci0KLSAvKiBUaGUgY2xhc3NlcyBiZWxvdyBhbGwgcmVsYXRlIHRvIHRoZSB1cHBlciByaWdodCBidXR0b24gb24gdGhlIG5hdiBmcmFtZSovCi0KLS53aHJidG4gewotCXBvc2l0aW9uOiBhYnNvbHV0ZTsKLQlyaWdodDogMDsKLQl0b3A6IDA7Ci0Jd2lkdGg6IDEwMCU7Ci19Ci0KLS53aHJidXR0b25iZyB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI0ZCRkJGQjsKLQlmb250LWZhbWlseTogdmVyZGFuYSwgYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDlweDsKLQlmb250LXdlaWdodDogNjAwOwotfQotCi0ud2hyYnV0dG9uaGlnaGxpZ2h0IHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjQ0JDQkNCOwotfQotCi0ud2hyYnV0dG9uc2hhZG93IHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjNjg2ODY4OwotfQotCi0ud2hybWFyZ2luewotCWJhY2tncm91bmQtY29sb3I6ICNFRkVGRUY7Ci19Ci0KLS53aHJtYXJnaW5icmRyIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjREVERURFOwotfQotCi0gLyogVGhpcyBjbGFzcyBpcyBwcm92aWRlZCBmb3IgbmV0c2NhcGUgc28gdGhhdCB0aGUgc2Nyb2xsIGJhciBkb2Vzbid0IGNvdmVyIHRoZSBidXR0b24uIEFuIGltYWdlIGluc2lkZSBvZiBhIGRpdiBoZWxwcyBwdXNoIHRoZSBidXR0b24gdG8gdGhlIGxlZnQuIEhlcmUgdGhlIGRpdiBpcyBzaW1wbHkgdHVybmVkIG9mZiBzaW5jZSBpdCBpcyB1bm5lZWRlZCAqLwotLndocnNwYWNlciB7Ci0JcG9zaXRpb246IGFic29sdXRlOwotCXZpc2liaWxpdHk6IGhpZGRlbjsKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvc3R5bGVzaGVldHMvZGVzaWduX25zLmNzcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvc3R5bGVzaGVldHMvZGVzaWduX25zLmNzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYThlNjBlNy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L3N0eWxlc2hlZXRzL2Rlc2lnbl9ucy5jc3MKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi3vu78vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICovCi0KLS5ib3h0aGluIHsKLQlib3JkZXItY29sb3I6ICNFOUU5RTk7Ci0JYm9yZGVyLXN0eWxlOiBzb2xpZDsKLQlib3JkZXItd2lkdGg6IHRoaW47Ci0Jd2lkdGg6IDI3NXB4OwotfQotCi0uY29udGFpbmVyIHsKLQltYXJnaW4tbGVmdDogMTJweDsKLQl3aWR0aDogMTAwJTsKLX0KLQotLmNvbnRlbnQgewotCW1hcmdpbi1sZWZ0OiAxMnB4OwotCXdpZHRoOiAxMDAlOwotfQotCi0gLyogYSBzaW1wbGUgaW5zZXQgZm9yIGJsb2NrZWQgZWxlbWVudHMgdG8gaW5kZW50ICovCi0uaW5zZXQgewotCWNsZWFyOiBib3RoOwotCW1hcmdpbi1sZWZ0OiAxM3B4OwotCW1hcmdpbi10b3A6IDRweDsKLQl3aWR0aDogMTAwJTsKLX0KLQotLm1pZGFsaWduIHsKLQl2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOwotfQotCi0uc3BhY2luZyB7Ci19Ci0KLSAvKiBUaGUgY2xhc3NlcyBiZWxvdyBhbGwgcmVsYXRlIHRvIHRoZSB1cHBlciByaWdodCBidXR0b24gb24gdGhlIG5hdiBmcmFtZSovCi0KLS53aHJidG4gewotCXBvc2l0aW9uOiBhYnNvbHV0ZTsKLQl0b3A6IDA7Ci0Jd2lkdGg6IDkwJTsKLX0KLQotLndocmJ1dHRvbmJnIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjRkJGQkZCOwotCWZvbnQtZmFtaWx5OiB2ZXJkYW5hLCBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTBweDsKLQlmb250LXdlaWdodDogNjAwOwotfQotCi0ud2hyYnV0dG9uaGlnaGxpZ2h0IHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjQ0JDQkNCOwotfQotCi0ud2hyYnV0dG9uc2hhZG93IHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjNjg2ODY4OwotfQotCi0ud2hybWFyZ2luewotCWJhY2tncm91bmQtY29sb3I6ICNFRkVGRUY7Ci19Ci0KLS53aHJtYXJnaW5icmRyIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjREVERURFOwotfQotCi0gLyogVGhpcyBjbGFzcyBpcyBwcm92aWRlZCBmb3IgbmV0c2NhcGUgc28gdGhhdCB0aGUgc2Nyb2xsIGJhciBkb2Vzbid0IGNvdmVyIHRoZSBidXR0b24uIFRoZSBzcGFjaW5nIGlzIHByb3ZpZGVkIGJ5IGFuIGltYWdlIGluc2lkZSBhIGRpdi4gSW4gb3RoZXIgYnJvd3NlcnMsIGl0IGlzIHNpbXBseSB0dXJuZWQgb2ZmICovCi0ud2hyc3BhY2VyIHsKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvc3R5bGVzaGVldHMvc3R5bGVzX2V4cGxvcmVyLmNzcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvc3R5bGVzaGVldHMvc3R5bGVzX2V4cGxvcmVyLmNzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzlkOWVhZi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L3N0eWxlc2hlZXRzL3N0eWxlc19leHBsb3Jlci5jc3MKKysrIC9kZXYvbnVsbApAQCAtMSwxMzQ1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKgotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKi8KLQotYQotewotICAgIGNvbG9yOiAjMzM2Njk5OwotfQotLmFjY2VudGNvbG9yCi0vKnVzZWQgYXMgaGlnaGxpZ2h0ZWQgZGVzY3JpcHRpb24gYWJvdmUgdGFibGVzKi8KLXsKLQljb2xvciA6ICNjYzMzMDA7Ci0JZm9udC1zaXplIDogMWVtOwotCWZvbnQtd2VpZ2h0IDogNjAwOwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLWEudG9wcmlnaHRuYXY6YWN0aXZlIHsKLQljb2xvcjogIzk5Q0NDQzsKLX0KLQotYS50b3ByaWdodG5hdmdyZXk6YWN0aXZlIHsKLQljb2xvcjogI0NDMDAwMDsKLX0KLQotYS50b3ByaWdodG5hdmdyZXk6aG92ZXIgewotCWNvbG9yOiAjQ0MwMDAwOwotfSAKLWEudG9wcmlnaHRuYXY6aG92ZXIgewotCWNvbG9yOiAjOTlDQ0NDOwotfSBhLmJyZWFkY3J1bWJzCi0vKmxpbmtlZCBicmVhZGNydW1icyovCi17Ci0JY29sb3I6ICNmZmZmZmY7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxMXB4OwotCWZvbnQtd2VpZ2h0OiA0MDA7Ci0JdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmUKLQotYS5icmVhZGNydW1iczpob3ZlcgotewotICBjb2xvcjogI2ZmZmZmZgotfQotCi0KLWEubGlua19jb250YWluZXJfZWRpdG9yCi0vKkVESVQgbGluayB1bmRlciBjb250YWluZXIgYmFubmVyKi8KLXsKLQlmb250LXNpemU6IDExcHg7Ci0JdGV4dC1kZWNvcmF0aW9uIDogbm9uZTsKLX0KLQotCi1hLmxpbmtfYnlsaW5lCi0vKndyaXR0ZW4gYnkgWFggYXV0aG9yIGluIGNvbnRlbnQqLwotewotCWZvbnQtc2l6ZTogLjllbTsKLQljb2xvcjogIzMzNjY5OTsKLX0KLQotCi1hLmxpbmtfZnVuY19vcHRpb24KLS8qQWR2YW5jZWQgbGluayBpbiBzZWFyY2ggY29udGFpbmVyKi8KLXsKLQlmb250LXdlaWdodDogYm9sZDsKLX0KLQotCi1hLmxpbmt0eXBlZAotLyp2aWV3IGFsbCBsaW5rIHVuZGVyIGNvbnRhaW5lciovCi17Ci0JZm9udC1zaXplOiAxMXB4OwotfQotCi0KLWEubWVudWJhcl9saW5rCi0vKgotd2hpdGUgZm9udCBmb3IgdGhlIHRleHQgaW4gdGhlIHRhYmxlIGhlYWRlciwgdXN1YWxseSBpbiB0aGUgMW5kIGxldmVsIG9mIHRoZSB0YWJsZSBoZWFkZXIgaWYgdGhlcmUgYXJlIDIKLTFzdCBsZXZlbDogcmVndWxhciAKLTJuZCBsZXZlbDogYm9sZAotKi8KLXsKLQljb2xvcjogI2ZmZmZmZjsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDExcHg7Ci0JZm9udC13ZWlnaHQ6IDQwMDsKLQl0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZQotfQotCi0KLWEubWVudWJhcl9saW5rOmhvdmVyCi17Ci0JY29sb3I6ICNmZmZmZmY7Ci19Ci0KLWEubmF2dHJlZQoteyAJCi0gICAgY29sb3I6ICMwMDAwMDA7Ci0JZm9udC1zaXplIDogMTFweDsKLQlmb250LXdlaWdodDogNjAwOwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0gCi0KLWEucHJvamVjdF9uYXYKLS8qcHJvamVjdCBleHBsb3JlciBtZW51YmFyIG9wdGlvbiBsaW5rcyBpbiBsZWZ0IG5hdiovCi17Ci0JY29sb3I6ICMwMDY2OTk7Ci0JZm9udC1mYW1pbHkgOiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTFweDsKLQlmb250LXdlaWdodCA6IDYwMDsKLQl0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKLX0KLWEucHJvamVjdF9uYXZ0cmVlCi0vKnRvcE5hdiB0cmVlIHN1Ym1lbnUqLwotewotICBjb2xvcjogIzAwMDAwMDsKLSAgZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0gIGZvbnQtc2l6ZTogLjllbTsKLSAgdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotYS50b3BiYXIKLS8qdG9wTmF2Ki8KLXsKLSAgY29sb3I6ICM2NjY2NjY7Ci0gIGZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotICBmb250LXNpemU6IC45ZW07Ci0gIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotCi1ib2R5Ci0vKm9yaWdpbmFsIGJvZHkgYmFja2dyb3VuZCBzZXR1cCovCi17Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiA5cHg7Ci0JYmFja2dyb3VuZC1jb2xvciA6IGZmZmZmZjsKLX0KLQotCi0uYm9yZGVyX2RlY29yYXRpb24KLS8qZG90dGVkIGxpbmUgYm9yZGVyIG9mIHRhYmxlcyBpbiBjb250ZW50Ki8KLXsKLQlib3JkZXIgOiB0aGluIGRvdHRlZCAjNjY2NjY2OwotCWZsb2F0IDogcmlnaHQ7Ci0JbWFyZ2luLWJvdHRvbSA6IDE1cHg7Ci0JbWFyZ2luLWxlZnQgOiAxNXB4OwotCXBhZGRpbmc6IDVweDsKLX0KLQotCi0uYm90dG9tYmFyX2RhcmsKLS8qYmFja2dyb3VuZCBjb2xvciBiZWhpbmQgYnJlYWRjcnVtYnMqLwotewotCWJhY2tncm91bmQ6ICMwMDMzNjY7Ci19Ci0KLQotLmJvdHRvbWJhcl9saWdodAotLyp0aGluIGxpbmUgYmV0d2VlbiBkcm9wZG93biBtZW51ICYgYnJlYWRjcnVtYiBiYXIqLyAKLXsKLQliYWNrZ3JvdW5kOiAjMzM5OWNjOwotIH0KLQotCi0gLmJvdHRvbWJhcl9tZWRpdW0KLSAvKnRoaW4gbGluZSBiZXR3ZWVuIGRyb3Bkb3duIG1lbnUgJiBzaGFkb3cgY29sb3IgKi8KLXsgCi0JYmFja2dyb3VuZDogIzAwNjY5OTsKLSB9Ci0KLQotIC5ib3R0b21iYXJfc2hhZG93Ci0gIC8qZGFyayBsaW5lcyB1bmRlciBicmVhZGNydW1iYmFyICYgIGRyb3Bkb3dubWVudSBiYXIgKi8KLXsKLQliYWNrZ3JvdW5kOiAjMDAwMDAwOwotfQotCi0KLWNvZGUKLS8qY29kZSBhc3NldCBpbiBjb250ZW50Ki8KLXsKLQljb2xvcjogIzY3Njc2NzsKLX0KLQotLmNvZGUyCi0vKmluZGVudCBjb2RlIGFzc2V0IGluIGNvbnRlbnQqLwotewotICAgCW1hcmdpbi1sZWZ0IDogMTVweDsKLQltYXJnaW4tcmlnaHQgOiAxNXB4OwotfQotCi0uY29weXJpZ2h0Ci0vKmNvcHlyaWdodCBsaW5lIGF0IHRoZSBib3R0b20gb2YgdGhlIHBhZ2UqLwoteyAKLQljb2xvciA6ICM5OTk5OTk7Ci0JZm9udC1mYW1pbHkgOiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZSA6IDg2JTsKLSB9Ci0gCi0uY29udGVudF9iYXNpYwotLyoKLWZvbnQgZm9yIHJlZ3VsYXIgY29udGVudCB0ZXh0cwotZm9udCBmb3IgcmVndWxhciBjb250YWluZXIgdGV4dHMKLWZvbnQgZm9yIHJlZ3VsYXIgZm9ybSB0ZXh0cwotKi8KLXsKLQljb2xvcjogIzMzMzMzMzsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDFlbTsKLQlmb250LXdlaWdodCA6IDQwMDsKLQlsaW5lLWhlaWdodCA6IDEzNSU7Ci0JdGV4dC1kZWNvcmF0aW9uIDogbm9uZTsKLX0KLQotCi0uY29udGVudF9iYXNpY19lbXBoYXNpcwotLyoKLWJvbGQgZm9udCBmb3IgcmVndWxhciBjb250ZW50IHRleHRzCi1ib2xkIGZvbnQgZm9yIHJlZ3VsYXIgY29udGFpbmVyIHRleHRzCi1ib2xkIGZvbnQgZm9yIHJlZ3VsYXIgZm9ybSB0ZXh0cwotKi8KLXsgCi0JY29sb3I6ICM2NzY3Njc7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAuOWVtOwotCWZvbnQtd2VpZ2h0IDogNjAwOwotCWxpbmUtaGVpZ2h0IDogMTM1JTsKLQl0ZXh0LWRlY29yYXRpb24gOiBub25lOwotIH0KLQotCi0gLmNvbnRlbnRfY29sb3JlZAotIC8qY29udGVudCovCi17Ci0JY29sb3I6ICMzMzY2OTk7Ci0JZm9udC1mYW1pbHkgOiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZSA6IDFlbTsKLX0KLQotCi0gLmNvbnRlbnRfY29udGFpbmVyCi0gLypib3R0b20gbWFyZ2luIHlpZWxkIHRoZSBzcGFjZSBiZXR3ZWVuIGJ5bGluZSAmIHBhcmFncmFwaCovCi0gewotCW1hcmdpbi1ib3R0b20gOiAxNXB4OwotfQotCi0gLmNvbnRlbnRfZGlhZ3JhbQotIC8qZGlhZ3JhbSBkZXNjcmlwdGlvbiwgZWcuIiBmaWd1cmUgMS4uLiIqLwotIHsKLQljb2xvcjogIzY3Njc2NzsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDkwJTsKLQlmb250LXN0eWxlIDogaXRhbGljOwkKLQl9Ci0KLS5oZWFkZXJfb2ZfYXJ0aWNsZV90YWJsZQotLypjb2xvcmVkIHRhYmxlIGhlYWRlciBpbiBjb250ZW50Ki8KLXsKLQljb2xvcjogIzMzNjY5OTsKLQlmb250LWZhbWlseTogQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDEycHg7Ci0JZm9udC1zdHlsZSA6IGl0YWxpYzsKLX0KLQotIC5jb250ZW50X2VtcGhhc2lzCi0gLypib2xkIGZvbnQgaW4gY29udGVudCovCi0gewotCWNvbG9yOiAjMDAwMDAwOwotCWZvbnQtd2VpZ2h0IDogNjAwOwotfQotCi0KLS5jb250ZW50X2dyZXlfbWlkCi0vKndlbGNvbWUgY29udGFpbmVyKi8KLXsKLQljb2xvcjogIzY3Njc2NzsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDFlbTsKLQlmb250LXdlaWdodCA6IDQwMDsKLQlsaW5lLWhlaWdodCA6IDEzNSU7Ci0JdGV4dC1kZWNvcmF0aW9uIDogbm9uZTsKLX0KLQotLmNvbnRlbnRfZ3JleV9taWQyCi0vKmZvbnQgaW4gZmxvYXRpbmcgYm94Ki8KLXsKLQljb2xvcjogIzMzMzMzMzsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDEwMCU7Ci0JZm9udC13ZWlnaHQgOiA0MDA7Ci0JbGluZS1oZWlnaHQgOiAxMzUlOwotCXRleHQtZGVjb3JhdGlvbiA6IG5vbmU7Ci19Ci0KLSAuY29udGVudF9oZWFkZXIKLSAvKmhlYWRlciBvZiBjb250ZW50IHBhcmFncmFwaCovCi0gewotCWNvbG9yOiAjMDA2Njk5OwotCWZvbnQtZmFtaWx5IDogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXdlaWdodCA6IDYwMDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLSAuY29udGVudF9oZWFkZXJfbGFyZ2UKLSAvKmZvbnQgZm9yIHBhZ2UgaGVhZGVyIGV4Y2VwdCBmb3IgYXJ0aWNsZSBwYWdlcywgKHNlZSBoZWFkZXJfb2ZfYXJ0aWNsZSkqLwotIHsKLQljb2xvcjogIzMzMzMzMzsKLQlmb250LWZhbWlseSA6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxLjhlbTsKLQlmb250LXdlaWdodCA6IDQwMDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLQotIC5jb250ZW50X2hlYWRlcl9jb2xvcmVkCi0gIC8qY29sb3JlZCB0aXRsZSBvZiB0aGUgcGFnZSB1c2VkIHdpdGggY29udGVudF9oZWFkZXJfbGFyZ2UqLwotIHsKLQljb2xvcjogIzY3Njc2Nzt6Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi0KLS5jb250ZW50X3JlZmVyZW5jZQotLypmb3JudCBmb3IgcmVmZXJlbmNlLCBlZy4gInNlZSAuLi4uIiovIAotewotCWZvbnQtc3R5bGUgOiBpdGFsaWM7Ci0JZm9udC1zaXplOiAxZW07Ci19Ci0KLSAuY29udGVudF9yaWdodAotICAvKmZsb2F0aW5nIHRhYmxlIG9uIHRoZSByaWdodCBvZiB0aGUgY29udGVudCovCi17Ci0JZmxvYXQgOiByaWdodDsKLQltYXJnaW4tbGVmdCA6IDVweDsKLQltYXJnaW4tcmlnaHQgOiAxMHB4OwotCW1hcmdpbi10b3AgOiAxMHB4OwotCXdpZHRoOiAxNzI7Ci19Ci0KLSAuY29udGVudF9yaWdodF90YWJsZQotIC8qaW5uZXIgdGFibGUgb2YgY29udGVudF9yaWdodCovCi17Ci0Jd2lkdGg6IDEwMCU7Ci19Ci0KLQotIC5jb250ZW50X3NtYWxsCi0gLypzbWFsbGVyIGZvbnQgdGhhbiBjb250ZW50X2Jhc2ljKi8KLXsKLQlmb250LWZhbWlseSA6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplIDogLjllbTsKLQl0ZXh0LWRlY29yYXRpb24gOiBub25lOwotfQotCi0KLSAuY29udGVudF9zbWFsbF9jb2xvcmVkCi0gLypzbWFsbCBibHVlIGZvbnQqLwotewotCWNvbG9yIDogIzk5OTk5OTsKLQlmb250LWZhbWlseSA6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplIDogLjllbTsKLX0KLQotCi0gLmNvbnRlbnRfc21hbGxfY29sb3JlZF8yCi0gLypkYXRlIGluIHJhdGluZyBiYXIqLwotewotCWNvbG9yOiAjMzM2Njk5OwotCWZvbnQtZmFtaWx5IDogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemUgOiAuOWVtOwotCWZvbnQtd2VpZ2h0OiA0MDA7Ci0JdGV4dC1kZWNvcmF0aW9uIDogbm9uZTsKLX0KLQotCi0uY29udGVudF9zbWFsbF9jb2xvcmVkXzMKLS8qYXZlcmFnZSBpbiByYXRpbmcgYmFyKi8KLXsKLQljb2xvcjogIzMzNjY5OTsKLQlmb250LWZhbWlseSA6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplIDogLjllbTsKLX0KLQotCi0uY29udGVudF9lbXBoYXNpcwotLypib2xkIGZvbnQqLwotIHsKLQlmb250LXdlaWdodCA6IDYwMDsKLQlmb250LXNpemUgOiAuOWVtOwotfQotCi0KLS5jb250ZW50X3N1YmhlYWRlcgotLypib2xkIGZvbnQgYmlnZ2VyIHRoYW4gY29udGVudF9iYXNpYyovCi17Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci0JZm9udC1zaXplIDogMWVtOwotfQotCi0KLS5jb250ZW50X3N1YmhlYWRlcl8yCi0vKmJsYWNrIGNvbnRlbnQgdGl0bGUgaW4gY29udGFpbmVycyovCi17Ci0JY29sb3I6ICMwMDAwMDA7Ci0JZm9udC1zaXplOiAxZW07Ci0JZm9udC13ZWlnaHQ6IDUwMDsKLX0KLQotCi0uZGlzY3Vzc2lvbl9jb250ZW50Ci0vKmJsYWNrIHRleHRzIGluIHRhYmxlcyovCi17Ci0JY29sb3I6IDAwMDAwMDsKLQlmb250LXNpemU6IC45ZW07Ci0JbWFyZ2luLWxlZnQ6IDVweDsKLX0KLQotCi0KLS5kaXNjdXNzaW9uX2NvbnRlbnRfZW1waGFzaXMKLS8qYm9sZCB0ZXh0cyBpbiB0YWJsZXMqLwotewotCWNvbG9yOiAwMDAwMDA7Ci0JZm9udC1zaXplOiAuOWVtOwotCW1hcmdpbi1sZWZ0OiA1cHg7Ci0JZm9udC13ZWlnaHQgOiA2MDA7Ci19Ci0KLQotIC5kaXNjdXNzaW9uX2Rlc2NyaXB0aW9uCi0gLypibGFjayB0ZXh0cyBpbiB0YWJsZXMgZm9yIGRlc2NyaXB0aW9ucyovCi0geyAKLQljb2xvcjogNjY2NjY2OwotCWZvbnQtc2l6ZTogLjllbTsKLQltYXJnaW4tbGVmdDogNXB4OwotICB9Ci0KLQotLmVkaXRvcm5vdGUKLS8qbm90IHVzZWQqLwotIHsgCi0gIGZvbnQtc3R5bGU6IGl0YWxpYwotIH0KLSAKLSAvKnRoZSBmb2xsb3dpbmcgdHdvIGNsYXNzZXMgYXJlIHVzZWQgZXhwcmVzc2x5IGluIHRoZSBrbm93bGVkZ2VfYW5ub3VuY2VtZW50c192aWV3Ki8KLSAKLSAuZmxvYXRjbGVhcgotewotCXBhZGRpbmc6IDVweDsKLQlwYWRkaW5nLWJvdHRvbTogMHB4OwotCXBhZGRpbmctcmlnaHQ6IDAgcHg7Ci0Jd2lkdGg6IDEwMCU7Ci19Ci0KLS5mbG9hdGdyZXkKLXsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjZWZlZmVmOwotCXBhZGRpbmc6IDVweDsKLQl3aWR0aDogNjVweDsKLX0KLQotCi0uZm9vdG5vdGUKLS8qZm9vdCBub3RlIGF0IHRoZSBib3R0b20gb2YgY29udGVudCAqLwoteyAKLQljb2xvcjogIzY3Njc2NzsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IC45ZW07Ci0JZm9udC13ZWlnaHQgOiA0MDA7Ci0JbGluZS1oZWlnaHQgOiAxMzUlOwotCXRleHQtZGVjb3JhdGlvbiA6IG5vbmU7Ci0gfQotCi0KLS5mb290X3N0YXJpbmRleAotLyp0aGUgKiBzeW1ib2wgaW5kaWNhdGUgdGhlIHJlcXVpcmVkIGZpZWxkICovCi17Ci0JY29sb3IgOiBjYzAwMDA7Ci0JZm9udC1mYW1pbHk6IHZlcmRhbmEsIGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiA4cHQ7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci19Ci0KLQotLmZvb3RfZGVzY3JpcHRpb24KLS8qCi1jb2xvcmVkIGZvbnQKLWRlc2NyaXB0aW9uIGFib3V0IHRoZSB1c2VyIHN0YXR1cy4gZXEuICJzdWJzY3JpcHRpb25zIGFyZSB1cGRhdGVkIgotaXQncyB1c3VhbGx5IG9uIHRoZSB1cHBlciBwYXJ0IG9mIHRoZSBwYWdlcwotKi8KLXsKLQljb2xvciA6ICNmZjY1MDA7Ci0JZm9udC1mYW1pbHk6IHZlcmRhbmEsIGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiA4cHQ7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci19Ci0KLQotLmZvb3RfdGV4dAotLyp0aGUgZGVzY3JpcHRpb25zIGZvciAqIHN5bWJvbCAsIGVnLiByZXF1aXJlZCBmaWVsZCovCi17Ci0JY29sb3I6ICNiNGI0YjQ7Ci0JZm9udC1mYW1pbHk6IHZlcmRhbmEsIGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiA4cHQ7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci19Ci0KLQotLmZvb3RfdGl0bGUKLS8qZm9vdCBpbmRleCBhc2lkZSB0aGUgcGFnZSBoZWFkZXIsIGVnLiAqIHN5bWJvbCAqLwotewotCWNvbG9yIDogI2ZmNjUwMDsKLQlmb250LWZhbWlseTogdmVyZGFuYSwgYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDhwdDsKLX0KLS5mb3JtZmllbGRfZGVzYyAKLS8qZm9ybSBvYmplY3QgZGVzY3JpcHRpb24gb3IgaW5zdHJ1Y3Rpb24qLwotewotY29sb3I6ICMzMzMzMzM7IAotZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7IAotZm9udC1zaXplOiAxZW07IAotZm9udC13ZWlnaHQgOiA0MDA7IAotIGZvbnQtc3R5bGU6IGl0YWxpYwotfQotLmZvcm1maWVsZF90aXRsZQotLypmb3JtIG9iamVjdCB0aXRsZSovCi17Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci0JZm9udC1zaXplIDogMWVtOwotfQotLmZsb3djaGFydAotLypub3QgdXNlZCovCi17ICAKLQlmb250LXNpemU6IDhwdDsgY29sb3I6ICM2NjY2NjYKLX0KLQotLmdyZXlfZGFyawotLypkYXJrIGdyZXkgY2VsbCBiYWNrZ3JvdW5kKi8KLSB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI2NjY2NjYzsKLX0KLQotLmdyZXlfbWVkaXVtCi0vKm1lZGl1bSBncmV5IGNlbGwgYmFja2dyb3VuZCovCi0gewotCWJhY2tncm91bmQtY29sb3I6ICNkZWRlZGU7Ci19Ci0KLS5oZWFkZXJfZGlzY3Vzc2lvbl9saW5rCi0vKgotc2FtZSBhcyBtZW51YmFyX2xpbmsKLXdoaXRlIGZvbnQgZm9yIHRoZSB0ZXh0IGluIHRoZSB0YWJsZSBoZWFkZXIsIHVzdWFsbHkgaW4gdGhlIDFuZCBsZXZlbCBvZiB0aGUgdGFibGUgaGVhZGVyIGlmIHRoZXJlIGFyZSAyCi0xc3QgbGV2ZWw6IHJlZ3VsYXIgCi0ybmQgbGV2ZWw6IGJvbGQKLSovCi0gewotCWNvbG9yOiAJZmZmZmZmOwotCWZvbnQtc2l6ZTogMC45ZW07Ci19Ci0KLS5oZWFkZXJfZGlzY3Vzc2lvbl9saW5rZGsKLXsKLQljb2xvcjogCTAwMDAwMDsKLQlmb250LXNpemU6IDAuOWVtOwotfQotCi0uaGVhZGVyX2Rpc2N1c3Npb25fdGl0bGUKLS8qCi10YWJsZSB0aXRsZXMKLXdoaXRlIGJvbGQgZm9udCBmb3IgdGhlIHRleHQgaW4gdGhlIHRhYmxlIGhlYWRlciwgdXN1YWxseSBpbiB0aGUgMm5kIGxldmVsIG9mIHRoZSB0YWJsZSBoZWFkZXIgaWYgdGhlcmUgYXJlIDIKLTFzdCBsZXZlbDogcmVndWxhciAKLTJuZCBsZXZlbDogYm9sZAotKi8KLSB7Ci0JY29sb3I6IGZmZmZmZjsKLQlmb250LXNpemU6IC45ZW07Ci0JZm9udC13ZWlnaHQ6IDYwMDsKLQltYXJnaW4tbGVmdCA6IDVweDsKLX0KLQotCi0uaGVhZGVyYgotLypub3QgdXNlZCovCi17Ci0gICAgY29sb3I6ICNmZjY2MDA7Ci0gICAgZm9udC1mYW1pbHk6IGFyaWFsLHZlcmRhbmEsaGVsdmV0aWNhLHNhbnMtc2VyaWY7Ci0gICAgZm9udC1zaXplOiAxMnB0OwotICAgIGZvbnQtd2VpZ2h0OiBib2xkOwotfQotCi0KLS5oZWFkZXJfb2ZfY29udGFpbmVyCi0vKmNvbG9yZWQgZm9udCBmb3IgdGhlIHRpdGxlIG9mIHRoZSBjb250YWluZXIgZWcuIEZlYXR1cmUqLwotewotCWNvbG9yOiAjY2QzMzAxOwotCWZvbnQtZmFtaWx5OiB2ZXJkYW5hLCBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMWVtOwotCWZvbnQtd2VpZ2h0OiBib2xkOwotCXRleHQtZGVjb3JhdGlvbiA6IG5vbmU7Ci19Ci0KLQotLmhlYWRlcl9jb2xvcmVkCi0vKmNvbG9yZWQgaGVhZGVyIGluIGxvZ2luIHBhZ2UqLwotewotCWNvbG9yOiAjY2MzMzAwOwotCWZvbnQtZmFtaWx5OiB2ZXJkYW5hLCBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMWVtOwotCWZvbnQtd2VpZ2h0OiBib2xkOwotfQotCi0KLS5oZWFkZXJfb2ZfYXJ0aWNsZQotLypjb2xvcmVkIGFydGljbGUgaGVhZGVyKi8KLXsKLQljb2xvcjogI2NkMzMwMTsKLQlmb250LWZhbWlseTogdmVyZGFuYSwgYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDEuMjNlbTsKLQlmb250LXdlaWdodDogYm9sZDsKLX0KLQotLmhlYWRlcl9vZl9hcnRpY2xlMgotLyphcnRpY2xlIGhlYWRlciovCi17Ci0JY29sb3I6ICMzMzMzMzM7Ci0JZm9udC1mYW1pbHk6IEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxOHB4OwotCWZvbnQtd2VpZ2h0OiA1MDA7Ci19Ci0KLS5zdWJoZWFkMV9vZl9hcnRpY2xlMgotLyphcnRpY2xlIHNlY29uZCBsZXZlbCBoZWFkKi8KLXsKLQljb2xvcjogIzMzMzMzMzsKLQlmb250LWZhbWlseTogQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDEzcHg7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci19Ci0KLS5zdWJoZWFkMl9vZl9hcnRpY2xlMgotLyphcnRpY2xlIHRoaXJkIGxldmVsIGhlYWQqLwotewotCWNvbG9yOiAjMzM2Njk5OwotCWZvbnQtZmFtaWx5OiBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTMgcHg7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci0JbWFyZ2luLWJvdHRvbTogNXB4OwotfQotCi0uc3ViaGVhZDNfb2ZfYXJ0aWNsZTIKLS8qYXJ0aWNsZSA0dGggbGV2ZWwgaGVhZCovCi0gewotCWZvbnQtd2VpZ2h0IDogNjAwOwotCWNvbG9yOiAjMzMzMzMzOwotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTFweDsKLX0KLQotLmhlYWRlcl9vZl9zdGVwcwotLypmb3JudCBmb3Igc3RlcHMgdGl0bGUgaW4gZm9ybXMqLwoteyAKLQljb2xvcjogI2E0YTRhNDsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDEycHQ7Ci0JZm9udC13ZWlnaHQ6IDYwMDsKLX0KLQotCi0uaGVhZGVyX29mX3NpdGVtYXAKLS8qaGVhZGVyIG9mIHNpdGVtYXAgcGFnZSovCi17Ci0JY29sb3I6ICM2Njk5Y2M7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxMnB0OwotCWZvbnQtd2VpZ2h0OiA2MDA7Ci0JdGV4dC1kZWNvcmF0aW9uIDogbm9uZTsKLX0KLQotCi0uaGVhZGVyX29mX3NpdGVtYXA6aG92ZXIKLXsKLQljb2xvcjogI2NjMDAwMDsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDEycHQ7Ci0JZm9udC13ZWlnaHQ6IDYwMDsKLQl0ZXh0LWRlY29yYXRpb24gOiBub25lOwotfQotCi0KLS5oZWFkZXJfb2ZfdGFibGUKLS8qaGVhZGVyIG9mIHRhYmxlcyBpbiBjb250ZW50IHVzdWFsbHkgaGFzIGEgYmFja2dyb3VuZCBjb2xvciBhc3NpZ25lZCB0byB0aGUgY2VsbCovCi17Ci0JY29sb3I6ICNmZmZmZmY7Ci0JZm9udC1mYW1pbHk6IHZlcmRhbmEsIGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxNHB4OwotCWZvbnQtd2VpZ2h0OiBib2xkOwotfQotCi0uaGVhZGVyX3JpZ2h0Ci17Ci0JY29sb3I6IDAwMDAwMDsKLQlmb250LWZhbWlseTogVmVyZGFuYSwgQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDEycHg7Ci0JZm9udC13ZWlnaHQ6IDgwMDsKLX0KLQotLmltYWdlY2FwdGlvbgotLyppbWFnZSBjYXB0aW9uIGluIGNvbnRlbnQgcGFnZSovCi17IAotIGZvbnQtc2l6ZTogOXB0OyBjb2xvcjogIzAwMzM2NgotIH0KLQotCi0uc2lkZWJhciAKLS8qbm90IHVzZWQqLwoteyAgCi0JYmFja2dyb3VuZC1jb2xvcjogI2Y0ZjRmNDsKLX0KLQotCi1pbnB1dAotLypmb250IHNpemUgc2V0dXAgc2hvd24gaW4gdGhlIGlucHV0IGJveCB3aGljaCBpcyBpbmhlcml0ZWQgYnkgaW5wdXRYWCovCi17Ci0JZm9udC1zaXplOiAxMXB4OwotCWZvbnQtZmFtaWx5IDogQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsKLX0KLQotCi1pbnB1dC5pbnB1dDI1Ci17Ci0gICAgd2lkdGg6IDI1cHgKLX0KLQotCi1pbnB1dC5pbnB1dDQ1Ci17Ci0gICAgd2lkdGg6IDQ1cHgKLX0KLQotCi1pbnB1dC5pbnB1dG1heDUwCi0vKgotMSxidXNpbmVzcyBzdGFuZGFyZCBtdWx0aWxpbmUgaW5wdXQgYm94IAotMix0aGlzIHN0eWxlIG9ubHkgYWN0aXZhdGUgaW4gSUUsIGJ1dCBOUwotKi8KLXsKLQl3aWR0aDogMzYwcHg7Ci19Ci0KLQotaW5wdXQuaW5wdXQ4NQotewotICAgIHdpZHRoOiA4NXB4Ci19Ci0KLQotaW5wdXQuaW5wdXQxMzUKLXsKLSAgICB3aWR0aDogMTM1cHgKLX0KLQotCi1pbnB1dC5pbnB1dDE1NQotewotICAgIHdpZHRoOiAxNTVweAotfQotCi0KLWlucHV0LmlucHV0MjMwCi17Ci0gICAgd2lkdGg6IDIzMHB4Ci19Ci0KLQotaW5wdXQuaW5wdXQzMDUKLXsKLSAgICB3aWR0aDogMzA1cHg7Ci19Ci0KLQotLm1lbnViYXIKLS8qCi13aGl0ZSBmb250IGZvciB0aGUgdGV4dCBpbiB0aGUgdGFibGUgaGVhZGVyLCB1c3VhbGx5IGluIHRoZSAxbmQgbGV2ZWwgb2YgdGhlIHRhYmxlIGhlYWRlciBpZiBodGVyZSBhcmUgMgotMXN0IGxldmVsOiByZWd1bGFyIAotMm5kIGxldmVsOiBib2xkCi0qLwotewotCWNvbG9yOiAjZmZmZmZmOwotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTFweDsKLQlmb250LXdlaWdodDogNDAwOwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotCi0ubWVudWJhcjpob3ZlcgotewotICBjb2xvcjogI2ZmZmZmZgotfQotCi0KLS5tZW51YmFyX2JnCi0vKmJhY2tncm91bmQgb2YgdGFibGUgaGVhZGVyKi8KLXsgICAKLWJhY2tncm91bmQtY29sb3I6IzAwMzM2NjsgCi19Ci0KLQotLm1lbnViYXJfZW1waGFzaXMKLS8qCi0xLGJvbGQgZm9udCBmb3IgdGhlIGxhc3QgaXRlbSBvZiB0aGUgYnJlYWRjcnVtYnMKLTIsYm9sZCBmb250IG9mIHRhYmxlIGhlYWRlciB3aXRoIG1lbnViYXJfYmcoYmx1ZSkgYXMgYmFja2dyb3VuZCBjb2xvciAKLTMsYm9sZCB0ZXh0IG9uIGNvbG9yZWQgYmFja2dyb3VuZCBlZy4gTG9nZ2VkIEluCi0qLwotewotICBjb2xvcjogI2ZmZmZmZjsKLSAgZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0gIGZvbnQtc2l6ZTogMTFweDsKLSAgZm9udC13ZWlnaHQ6IDYwMDsKLSAgdGV4dC1kZWNvcmF0aW9uOiBub25lCi19Ci0KLS5tZW51YmFyX2VtcGhhc2lzZGsKLQotewotICBjb2xvcjogIzAwMDAwMDsKLSAgZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0gIGZvbnQtc2l6ZTogMTFweDsKLSAgZm9udC13ZWlnaHQ6IDYwMDsKLSAgdGV4dC1kZWNvcmF0aW9uOiBub25lCi19Ci0KLQotLm1pZGJhcl9iZwotLyp0aGUgbGlnaHQgcG9pbnQgYWJvdmUgdGhlIHRhYnMgKi8KLXsKLQliYWNrZ3JvdW5kOiAjZmZmZmZmOwotfQotCi0KLS5taWRiYXJfZGFyawotLypkYXJrIGNvbG9yIGJldHdlZW4gdGFicyovCi17IAotCWJhY2tncm91bmQ6ICMwMDMzNjY7Ci0gfQotCi0KLS5taWRiYXJfbGlnaHQKLS8qCi0xLGxpZ2h0IGNvbG9yIG9uIHRoZSBsZWZ0IGhhbmQgc2lkZSBvZiB0aGUgdGFicwotMixsaWdodCBjb2xvciBhYm92ZSB0YWJzCi0qLwoteyAKLQliYWNrZ3JvdW5kOiAjMzM5OWNjOwotIH0KLQotIAotIC5taWRiYXJfbWVkaXVtCi0gLypiYWNrZ3JvdW5kICBvZiAgdGFicyovCi17IAotCWJhY2tncm91bmQ6ICMwMDY2OTk7Ci0gfQotCi0vKnNoYWRvdyBjb2xvciBiZXR3ZWVuIHRhYnMqLwotIC5taWRiYXJfc2hhZG93Ci17Ci0JYmFja2dyb3VuZDogIzY2NjY2NjsKLX0KLQotCi0ucGFnZV9udW1iZXIKLS8qZm9udCBmb3IgdGhlIG51bWJlcnMgaW4gcGFnaW5hdGlvbiBsaWJyYXJ5Ki8KLXsKLQljb2xvcjogIzY3Njc2NzsKLQlmb250LXdlaWdodCA6IDQwMDsKLX0KLQotCi0ucGFnZV9zdGVwcwotLypmb250IGZvciBwcmV2aW91cyAmIG5leHQgaW4gcGFnaW5hdGlvbiovCi17IAotCWNvbG9yOiAjNjc2NzY3OwotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogLjllbTsKLQlmb250LXdlaWdodCA6IDQwMDsKLQlsaW5lLWhlaWdodCA6IDEzNSU7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotIH0KLQotCi0gLnBhZ2VoZWFkZXIKLSAvKnNhbWUgYXMgY29udGVudF9oZWFkZXJfbGFyZ2UqLwotewotCWNvbG9yOiAjMDA2Njk5OwotCWZvbnQtZmFtaWx5IDogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDExNSU7Ci0JZm9udC13ZWlnaHQgOiA2MDA7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi0KLSAucGFnZWhlYWRlcl9jb2xvcmVkCi0gLypjb2xvcmVkIHRpdGxlIG9mIHRoZSBwYWdlIHVzZWQgd2l0aCBjb250ZW50X2hlYWRlcl9sYXJnZSovCi17Ci0gICAgY29sb3I6ICM5OTk5OTk7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0gICAgZm9udC1zaXplOiAxNnB0OwotICAgIGZvbnQtd2VpZ2h0OiA0MDA7Ci19Ci0KLS5wb3B1cF9ib3JkZXIKLXsKLQliYWNrZ3JvdW5kOiAjZjBmMGYwOwotCWJvcmRlciA6IHRoaW4gc29saWQgY2NjY2NjOwotCXBhZGRpbmcgOiAycHg7Ci19Ci0KLS5wb3B1cF90ZXh0Ci17Ci0JY29sb3I6ICMzMzMzMzM7Ci0JZm9udCA6IDExcHg7Ci0JdGV4dC1kZWNvcmF0aW9uIDogbm9uZTsKLX0KLQotLnBvcHVwX3RleHQgOiBhY3RpdmUKLXsKLQljb2xvcjogI2NjMDAwMDsKLX0KLQotLnBvcHVwX3RleHQgOiBob3ZlcgotewotCWNvbG9yOiAjY2MwMDAwOwotfQotCi0ucHJvamVjdF9tZW51X2JvcmRlcjEKLS8qcHJvamVjdCBleHBsb3JlciBtZW51IG9wdGlvbnMgYmFja2dyb3VuZCBzdHlsZSBpbiBsZWZ0IG5hdiovCi0gewotCWJvcmRlci10b3AgOiAxcHggc29saWQgI2NjY2NjYzsKLQlib3JkZXItcmlnaHQgOiAxcHggc29saWQgI2NjY2NjYzsKLQliYWNrZ3JvdW5kIDogI2VmZWZlZjsKLX0KLS5wcm9qZWN0X21lbnVfdG9wYm9yZGVyCi0vKnByb2plY3QgZXhwbG9yZXIgbWVudSBvcHRpb25zIGJhY2tncm91bmQgc3R5bGUgaW4gbGVmdCBuYXYqLwotIHsKLQlib3JkZXItdG9wIDogMXB4IHNvbGlkICNjY2NjY2M7CQotCWJhY2tncm91bmQgOiAjZWZlZmVmOwotfQotLnByb2plY3RfbmF2Ci0vKmZpZWxkIHRpdGxlcyBmb3IgcHJvamVjdCBleHBsb3JlciBtZW51IGxvY2F0ZWQgaW4gbGVmdCBuYXYqLwotewotCWNvbG9yOiAjMDA2Njk5OwotCWZvbnQtZmFtaWx5IDogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDExcHg7Ci0JZm9udC13ZWlnaHQgOiA2MDA7Ci19Ci0KLXNlbGVjdAotLypmb250IHNpemUgc2V0dXAgc2hvd24gaW4gdGhlIHNlbGVjdCBib3ggd2hpY2ggaXMgaW5oZXJpdGVkIGJ5IGlucHV0WFgqLwotewotCWZvbnQtc2l6ZTogMTFweDsKLQlmb250LWZhbWlseSA6IEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci19Ci0KLQotc2VsZWN0LmlucHV0MjUKLXsKLSAgICB3aWR0aDogMjVweAotfQotCi0KLXNlbGVjdC5pbnB1dDQ1Ci17Ci0gICAgd2lkdGg6IDQ1cHgKLX0KLQotCi1zZWxlY3QuaW5wdXQ4NQotewotICAgIHdpZHRoOiA4NXB4Ci19Ci0KLQotc2VsZWN0LmlucHV0MTU1Ci17Ci0gICAgd2lkdGg6IDE1NXB4Ci19Ci0KLQotc2VsZWN0LmlucHV0MjMwCi17Ci0gICAgd2lkdGg6IDIzMHB4Ci19Ci0KLQotc2VsZWN0LmlucHV0MzA1Ci17Ci0gICAgd2lkdGg6IDMwNXB4OwotfQotCi0vKiBBbGwgc2hpbSBjbGFzc2VzIGFyZSBmb3Igc3BhY2luZyBlbGVtZW50cyB1c2VkIHRvIGNvbnRyb2wgbGF5b3V0LCBlc3BlY2lhbGx5IGluIG9sZGVyIGJyb3dzZXJzIHRoYXQgZG9uJ3QgdW5kZXJzdGFuZCBtYXJnaW5zIGFuZCBwYWRkaW5nICovCi0KLS5zaGltM3gxcHgKLXsKLQlmb250LXNpemU6IDFweDsKLQloZWlnaHQgOiAxcHg7Ci19Ci0KLWEuc2lkZW1lbnVfaGVhZGVyCi0vKm5vdCB1c2VkPyovCi17Ci0gICAgY29sb3I6ICM2NjY2NjY7Ci0gICAgZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0gICAgdGV4dC1kZWNvcmF0aW9uOiBub25lOwotICAgIGZvbnQtd2VpZ2h0OiBib2xkOwotfQotCi0KLWEuc2lkZW1lbnVfaGVhZGVyOmhvdmVyCi0vKm5vdCB1c2VkPyovCi17Ci0gIGNvbG9yOiAjY2MwMDAwCi19Ci0KLQotLnNpZGVtZW51X2JvbGRsZWZ0Ci0vKgotMSxib2xkIGZvbnQgZm9yIHRoZSBpdGVtcyBpbiBzZWFyY2ggY29udGFpbmVyCi0yLGJvbGQgbGVmTmF2IHVuc2VsZWN0ZWQKLSovCi17Ci0JY29sb3I6ICMwMDAwMDA7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAuOWVtOwotCWZvbnQtd2VpZ2h0IDogNjAwOwotCXRleHQtZGVjb3JhdGlvbiA6IG5vbmU7Ci19Ci0KLQotLnNpZGVtZW51X2JvbGRsZWZ0X3NlbGVjdGVkCi0vKmJvbGQgZm9udCBsZWZOYXYgc2VsZWN0ZWQqLwotewotCWNvbG9yOiAjQ0MwMDAwOwotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogLjllbTsKLQlmb250LXdlaWdodCA6IDYwMDsKLQl0ZXh0LWRlY29yYXRpb24gOiBub25lOwotfQotCi0KLS5zaWRlbWVudV9ib2xkcmlnaHQKLS8qCi0xLGJvbGQgZm9udCBmb3IgdGhlIGl0ZW1zIGluIHJpZ2h0IGhhbmQgc2lkZQotMixzYW1lIGFzIHNpZGVtZW51X2JvbGRyaWdodAotKi8KLXsKLQljb2xvcjogIzAwMDAwMDsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IC45ZW07Ci0JZm9udC13ZWlnaHQgOiA2MDA7Ci0JdGV4dC1kZWNvcmF0aW9uIDogbm9uZTsKLX0KLQotCi0uc2lkZW1lbnVfYm9sZHJpZ2h0OmhvdmVyCi17Ci0JY29sb3I6ICNjYzAwMDA7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAuOWVtOwotCWZvbnQtd2VpZ2h0IDogNjAwOwotCXRleHQtZGVjb3JhdGlvbiA6IG5vbmU7Ci19Ci0KLQotLnNpZGVtZW51X2JvbGRyaWdodF9jb3Vyc2VjYXRhbG9nCi0vKm5vdCB1c2VkKi8KLXsKLQljb2xvcjogIzYzOTYwMjsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IC45ZW07Ci0JZm9udC13ZWlnaHQgOiA2MDA7Ci0JdGV4dC1hbGlnbjogcmlnaHQ7Ci19Ci0KLQotLnNpZGVtZW51X3N0YW5kYXJkCi0vKmxlZnROYXYgc3RhZGFyZCovCi17Ci0JY29sb3I6ICM2NzY3Njc7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAuOWVtOwotCWZvbnQtd2VpZ2h0IDogNDAwOwotCWxpbmUtaGVpZ2h0IDogMTM1JTsKLQl0ZXh0LWRlY29yYXRpb24gOiBub25lOwotfQotCi0KLS5zaWRlbWVudV9zdGFuZGFyZF9zZWxlY3RlZAotLypsZWZ0TmF2IHNlbGVjdGVkKi8KLXsKLQljb2xvcjogI0NDMDAwMDsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IC45ZW07Ci0JZm9udC13ZWlnaHQgOiA0MDA7Ci0JbGluZS1oZWlnaHQgOiAxMzUlOwotCXRleHQtZGVjb3JhdGlvbiA6IG5vbmU7Ci19Ci0KLQotCi10ZAotewotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogNzUlOwotfQotCi0KLQotIHRkLmJnX2Rpc2N1c3Npb25fMQotIC8qc2FtZSBhcyBncmV5X21lZGl1bSovCi17Ci0JYmFja2dyb3VuZC1jb2xvcjogI2RlZGVkZTsKLX0KLQotCi10ZC5iZ19kaXNjdXNzaW9uXzIKLSAvKnNhbWUgYXMgZ3JleV9saWdodCovCi17IAotCWJhY2tncm91bmQtY29sb3I6ICNlZmVmZWY7Ci0gfQotIAotdGQuY29udGVudF9jZWxsCi0vKmZvciBlbGltaW5hdGUgdGFibGUgc3RydWN0dXJlICYga2VlcCB0aGUgY2VsbHBhZGRpbmcgaW4gY29udGVudCovCi0gewotCXBhZGRpbmc6IDVweDsKLX0KLQotCi10ZC5kaXZpZGVyCi0vKnRoaW4gbGluZSBkaXZpZGUgdGhlIHBhZ2UgY29sdW1ucyovCi0gewotCWJhY2tncm91bmQtY29sb3I6ICNmNmY5ZjA7Ci19Ci0KLXRkLmRpdmlkZXIyCi0vKnRoaW4gbGluZSBkaXZpZGUgdGhlIHBhZ2UgY29sdW1ucyAtIHVzZWQgaW4gdGhlIHZpZXdmcmFtZSBmcmFtZSBwYWdlKi8KLSB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI2NjY2NjYzsKLX0KLQotCi0uZ3JleV9kYXJrCi0vKmRhcmsgZ3JleSBjZWxsIGJhY2tncm91bmQqLwotIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjY2NjY2NjOwotfQotCi10ZC5ncmV5X21lZGl1bTIKLS8qbWVkaXVtIGdyZXkgY2VsbCBiYWNrZ3JvdW5kIHcvIGNlbGwgcGFkZGluZyovCi0gewotCWJhY2tncm91bmQtY29sb3I6ICNkZWRlZGU7Ci0JcGFkZGluZzogNSBweDsKLX0KLQotdGQuZ3JleV9saWdodDIKLS8qbGlnaHQgZ3JleSBjZWxsIGJhY2tncm91bmQgdy8gY2VsbCBwYWRkaW5nKi8KLSB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI2VmZWZlZjsKLQlwYWRkaW5nOiA1cHg7Ci19Ci0KLS5ncmV5X2xpZ2h0Ci0vKmxpZ2h0IGdyZXkgY2VsbCBiYWNrZ3JvdW5kKi8KLSB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI2VmZWZlZjsKLX0KLQotCi10ZC5jZWxsY29sb3JfbGlnaHQKLS8qbGlnaHQgY2VsbCBiYWNrZ3JvdW5kIGNvbG9yIGZvciBzcGVjaWZpYyBjb2xvciBzY2hlbWUqLwotIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjOTljYzAwOwotfQotCi0KLXRkLmNlbGxjb2xvcl9kYXJrCi0vKmRhcmsgY2VsbCBiYWNrZ3JvdW5kIGNvbG9yIGZvciBzcGVjaWZpYyBjb2xvciBzY2hlbWUqLwotewotCWJhY2tncm91bmQtY29sb3I6ICM2MzljMDA7Ci19Ci0KLQotdGQuY2VsbGNvbG9yX3doaXRlCi0vKndoaXRlIGNlbGwgYmFja2dyb3VuZCBjb2xvciovCi0gewotCWJhY2tncm91bmQtY29sb3I6ICNmZmZmZmY7Ci19Ci0KLQotdGQuc2lkZW1lbnVfYnVsbGV0X2NvbG9yZWQKLS8qYnVsbGV0IGNvbG9yIGZvciB0aGUgbGVmdE5hdiovCi0gewotCWJhY2tncm91bmQtY29sb3I6ICNjZDMzMDE7Ci19Ci0KLQotdGQuc2lkZW1lbnVfYnVsbGV0X2dyZXkKLS8qZ3JleSBidWxsZXQgY29sb3IgZm9yIHRoZSBsZWZ0TmF2Ki8KLSB7Ci0JYmFja2dyb3VuZC1jb2xvcjogIzk5OTk5OTsKLX0KLQotCi10ZXh0YXJlYQotLypmb250IHNpemUgc2V0dXAgc2hvd24gaW4gdGhlIG11bHRpbGluZSB0ZXh0YXJlYSB3aGljaCBpcyBpbmhlcml0ZWQgYnkgaW5wdXRYWCovCi17Ci0JZm9udC1zaXplOiAxMXB4OwotCWZvbnQtZmFtaWx5IDogQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsKLX0KLQotCi10ZXh0YXJlYS50ZXh0YXJlYTQ1Ci17Ci0gICAgd2lkdGg6IDQ1cHgKLX0KLQotCi10ZXh0YXJlYS5pbnB1dG1heDUwCi0vKgotMSxidXNpbmVzcyBzdGFuZGFyZCBtdWx0aWxpbmUgaW5wdXQgYm94IAotMix0aGlzIHN0eWxlIG9ubHkgYWN0aXZhdGUgaW4gSUUsIGJ1dCBOUwotKi8KLXsKLQl3aWR0aDogMzYwcHgKLX0KLQotCi10ZXh0YXJlYS5pbnB1dDE5MAotewotICAgIHdpZHRoOiAxOTBweAotfQotCi0KLXRleHRhcmVhLmlucHV0MjMwCi17Ci0gICAgd2lkdGg6IDIzMHB4Ci19Ci0KLQotdGV4dGFyZWEuaW5wdXQzNTAKLXsKLSAgICB3aWR0aDogMzUwcHgKLX0KLQotCi0udG9wYmFyX3NlcGFyYXRvcgotLypzZXBhcmF0b3Igb2YgdGhlIHRvcE5hdiovCi17Ci0gIGNvbG9yOiAjY2MzMzAwOwotICBmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLSAgZm9udC1zaXplOiAuOWVtOwotICB0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLQotLnRvcGxpbmVfY29sb3IKLS8qdGhlIHRoaW4gY29sb3IgbGluZSBvbiB0aGUgdG9wIG9mIHRoZSBicm93c2VyIHdpbmRvdyovCi17IAotCWJhY2tncm91bmQ6ICMwMDY2OTk7Ci0gfQotIAotIC8qIGJvcnJvd2VkIHN0eWxlcyBmcm9tIGNvbW1vbi5jc3MgdG8gYmUgdHJpbW1lZCBsYXRlciAqLwotIAotIC50b3BmcmFtZWJnIAoteyAgYmFja2dyb3VuZC1jb2xvcjogI2QyZDJkMgotfQotCi0udG9wZnJhbWViZ2xpZ2h0IAoteyAgCi1iYWNrZ3JvdW5kLWNvbG9yOiAjYjZiNWI1Ci19Ci0KLS50b3BmcmFtZWJnZGFyayAKLXsgIAotYmFja2dyb3VuZC1jb2xvcjogIzg0ODQ4NAotfQotCi0udG9wZnJhbWViZ2xpZ2h0MiAKLXsgCi0gYmFja2dyb3VuZC1jb2xvcjogI2VmZWZlZgotIH0KLSAgIAotIC50b3BmcmFtZWxvZ29iZyAKLXsgIAotYmFja2dyb3VuZC1jb2xvcjogIzAwNjY5OQotfQotCi0udG9wbGVmdG5hdgotewotCWZvbnQtZmFtaWx5OiBWZXJkYW5hLCBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTBweDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLS50b3BsZWZ0bmF2Ym9sZCAKLXsgCi1mb250LWZhbWlseTogVmVyZGFuYSwgQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsgCi1mb250LXNpemU6IDEwcHg7IAotdGV4dC1kZWNvcmF0aW9uOiBub25lOyAKLWZvbnQtd2VpZ2h0OiBib2xkOwotfQotCi0udG9wcmlnaHRuYXYKLXsKLQlmb250LWZhbWlseTogVmVyZGFuYSwgQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDEwcHg7Ci0JY29sb3I6ICNmZmZmZmY7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi0udG9wcmlnaHRuYXZncmV5Ci17Ci0JZm9udC1mYW1pbHk6IFZlcmRhbmEsIEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxMHB4OwotCWNvbG9yOiAjMDAwMDAwOwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotLnZlcnRpY2FsYmx1ZQotIHsgCi0gYmFja2dyb3VuZDogIzMzOTljYyAKLSB9Ci0KLSAud2hpdGViZwoteyAKLSBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmZmZmOwotIH0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvc3R5bGVzaGVldHMvc3R5bGVzX2llNW5zNC5jc3MgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L3N0eWxlc2hlZXRzL3N0eWxlc19pZTVuczQuY3NzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZGM1MGZiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvc3R5bGVzaGVldHMvc3R5bGVzX2llNW5zNC5jc3MKKysrIC9kZXYvbnVsbApAQCAtMSwxMTkwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKgotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKi8KLQotLyptdXN0IGFkZCBmb250IHR5cGUgaWYgY2xhc3MgaXMgYmVpbmcgdXNlZCBhcyBhIGxpbmsgYXMgd2VsbCBhcyBuby1saW5rKi8KLQotYSB7CQotCWNvbG9yOiAjMzM2Njk5OwotfQotCi1hLnRvcHJpZ2h0bmF2OmFjdGl2ZSB7Ci0JY29sb3I6ICM5OUNDQ0M7Ci19Ci0KLWEudG9wcmlnaHRuYXZncmV5OmFjdGl2ZSB7Ci0JY29sb3I6ICNDQzAwMDA7Ci19Ci0KLQotYS50b3ByaWdodG5hdmdyZXk6aG92ZXIgewotCWNvbG9yOiAjQ0MwMDAwOwotfSAKLWEudG9wcmlnaHRuYXY6aG92ZXIgewotCWNvbG9yOiAjOTlDQ0NDOwotfSAvKiBmb250IGZvciBhY3Rpb24gb24gY29udGVudCBwYWdlIHVzdWFsbHkgbG9jYXRlZCBvbiB0b3Agb2YgcGFnZSA7aWUuLCBzZWxlY3QgYWxsKi8KLWEuYWN0aW9uIHsgIAotCWNvbG9yOiAjMzMzMzMzOwotCWZvbnQtc2l6ZTogMTFweDsJCi19IAotCi1hLmFjdGlvbnNlbGVjdG9yIHsKLSAgIAotCWNvbG9yOiAjMDAwMDAwOwotCWZvbnQtc2l6ZTogMTFweDsKLX0KLQotIC8qIGJlY2F1c2Ugb2YgYW4gaW50ZXJ2ZW5pbmcgbGluayB0YWcsIHRleHQgb3B0aW9ucyB3ZXJlIGF0dGFjaGVkIHRvIHRoaXMgZWxlbWVudCBpbnN0ZWFkIG9mIHRoZSBvdXRlcm1vc3QgY2VsbCAqLwotYS5hY3RpdmV0YWIgeyAKLSAJY29sb3I6ICMwMDAwMDA7Ci0gCWZvbnQtc2l6ZTogMTJweDsKLSAgCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotIC8qIGJlY2F1c2Ugb2YgYW4gaW50ZXJ2ZW5pbmcgbGluayB0YWcsIHRleHQgb3B0aW9ucyB3ZXJlIGF0dGFjaGVkIHRvIHRoaXMgZWxlbWVudCBpbnN0ZWFkIG9mIHRoZSBvdXRlcm1vc3QgY2VsbCAqLwotYS5hY3RpdmV0YWJzZWxlY3RlZCB7IAotIAljb2xvcjogIzJjMmMyYzsKLSAJZm9udC1zaXplOiAxMnB4OwotICAJdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi1hLmJhc2ljIHsgCQotICAgIGNvbG9yOiAjMDAwMDAwOwotfQotCi0vKiBmb3Igbm9uLWltYWdlIGJ1dHRvbnMsIGZvciBpbnRlcm5hdGlvbmFsaXphdGlvbiAqLwotYS5idXR0b24gewotCWNvbG9yOiAjMzMzMzMzOwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotYS5idXR0b246YWN0aXZlIHsKLQljb2xvcjogMzMzMzMzOwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotLyogZm9yIG5vbi1pbWFnZSBidXR0b25zLCBmb3IgaW50ZXJuYXRpb25hbGl6YXRpb24gKi8KLWEuYnV0dG9uOmhvdmVyIHsKLQljb2xvcjogMzMzMzMzOwotfQotCi0vKiBmb3Igbm9uLWltYWdlIGJ1dHRvbnMgaW4gTXVsdGlzaXRlLCBmb3IgaW50ZXJuYXRpb25hbGl6YXRpb24gKi8KLWEuYnV0dG9uMiB7Ci0JY29sb3I6ICMwMDAwMDA7Ci0JZm9udC1zaXplIDogMTFweDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7CQotfQotCi0vKm1haW4gY29udGFpbmVyICBhY3Rpb25zL2xpbmtzIGZvciBlZGl0aW5nKi8KLWEuY29ubGlua2VkaXQgewotCXRleHQtZGVjb3JhdGlvbiA6IG5vbmU7Ci0JZm9udC1zaXplIDogMTFweDsKLX0KLQotYS5jb3B5cmlnaHQgeyAJCi0JY29sb3IgOiAjOTk5OTk5OwotCWZvbnQtc2l6ZSA6IDEwcHg7Ci19IAotCi1hLmZvcm10YmxoZWFkIHsKLSAgIGJhY2tncm91bmQtY29sb3I6ICNjY2NjY2M7Ci0JY29sb3I6ICMwMDAwMDA7Ci0JZm9udC1zaXplOiAxMXB4OwotCWZvbnQtd2VpZ2h0IDogNjAwOwotfQotCi0vKiBsaWdodCBjb2xvdXJlZCBoZWFkaW5nIGxpbmsgZm9yIGRpc2N1c3Npb24gYW5kIHNpbWlsYXIgdXNlcyAtIHdhcyBoZWFkZXJfZGlzY3Vzc2lvbl9saW5rIGluIHByZXZpb3VzIHZlcnNpb25zICovCi0gYS5oZWFkZXJsaW5rbGlnaHQgewotCWNvbG9yOiAJZmZmZmZmOwotCWZvbnQtc2l6ZTogMC45ZW07Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQkKLQotLypib2xkIGxpbmssIGllLCBhZHZhbmNlZCBzZWFyY2ggbGluayBpbiBwZSovCi1hLmxpbmtmdW5jb3B0aW9uIHsgIAkKLQlmb250LXNpemU6IDExcHg7Ci0JZm9udC13ZWlnaHQ6IDYwMDsKLX0KLQotIGEubmF2dHJlZSB7IAkKLSAgICBjb2xvcjogIzAwMDAwMDsKLQlmb250LXNpemUgOiAxMXB4OwotCWZvbnQtd2VpZ2h0OiA2MDA7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfSAKLQotLypuYXZ0cmVlIGl0ZW0gb3IgZG9jLCBub2RlcyB0aGF0IGRvbid0IGV4cGFuZCovCi1hLm5hdnRyZWVpdGVtIHsgCQotICAgIGNvbG9yOiAjMDAwMDAwOwotCWZvbnQtc2l6ZSA6IDExcHg7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfSAKLSAKLSAvKiBzaW1wbGUgbWVjaGFuaXNtIHRvIHR1cm4gdGV4dCBkZWNvcmF0aW9uIG9mZiAqLyAgCi1hLm5vbGluZSB7Ci0gCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLSB9Ci0KLWEucG9wdXB0ZXh0IHsJCi0gICBjb2xvcjogIzMzMzMzMzsKLQlmb250LXNpemU6IDExcHg7CQotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotYS5wb3B0ZXh0IHsKLQljb2xvcjogIzMzMzMzMzsKLQlmb250IDogMTFweDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLWEucG9wdXB0ZXh0OiBhY3RpdmUgewotCWNvbG9yOiAjY2MwMDAwOwotfQotCi0KLWEuc21hbGwgewkKLQlmb250LXNpemU6IDExcHg7CQotfQotCi1hLnNtYWxsYiB7CQotICAgY29sb3I6ICMwMDAwMDA7Ci0JZm9udC1zaXplOiAxMXB4OwkKLX0KLQotYS50b3BiYXIgewotICBjb2xvcjogIzY2NjY2NjsKLSAgZm9udC1zaXplOiAxMXB4OwotICB0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLS8qdXNlZCBhcyBoaWdobGlnaHRlZCBkZXNjcmlwdGlvbiBhYm92ZSB0YWJsZXMqLwotLmFjY2VudGNvbG9yIHsKLQljb2xvciA6ICNjYzMzMDA7Ci0JZm9udC13ZWlnaHQgOiA2MDA7Ci19Ci0KLSAvKiBiZ2NvbG9yICBmb3IgYWN0aW9uIHRleHQgdXN1YWxseSBsb2NhdGVkIG9uIHRvcCBvZiBwYWdlO2llLiwgc2VsZWN0IGFsbCovCi0uYWN0aW9uYmcgeyAKLQliYWNrZ3JvdW5kLWNvbG9yOiAjZWZlZmVmOwotfQotCi0uYWN0aW9uc2VsZWN0b3IgewotICAgYmFja2dyb3VuZC1jb2xvcjogI2U5ZTllOTsKLQljb2xvcjogIzAwMDAwMDsKLQlmb250LXNpemU6IDExcHg7Ci19Ci0KLS5hY3Rpb25zZWxlY3RvcmRpcyB7Ci1iYWNrZ3JvdW5kLWNvbG9yOiAjZTllOWU5OwotCWNvbG9yOiAjY2NjY2NjOwotCWZvbnQtc2l6ZTogMTFweDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLWIgeyAKLSAgIGZvbnQtd2VpZ2h0IDogYm9sZDsKLSB9Ci0gIAotLmJhc2VsaW5laXRhbGljcyB7Ci0JY29sb3I6ICM2NjY2NjY7Ci0JZm9udC1zaXplOiAxMXB4OwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotLmJnYmxhY2sgeyAKLQliYWNrZ3JvdW5kLWNvbG9yOiAjMDAwMDAwOwotIH0KLSAKLSAvKiBiYXNpYyBjb2x1bW4gYmFja2dyb3VuZCBjb2xvdXIgZm9yIGRpc2N1c3Npb25zLCBmaWxlcywgb3RoZXIgc3VjaCB0YWJ1bGF0ZWQgZGF0YSAqLwotLmJnY29sdW1uYmFzaWMgeyAKLQliYWNrZ3JvdW5kLWNvbG9yOiAjZWZlZmVmOwotIH0KLSAKLS5iZ3doaXRlIHsgCi0JYmFja2dyb3VuZC1jb2xvcjogI2ZmZmZmZjsKLSB9IAotIAotLyogc2l6ZSBpbnB1dCBmb3IgYmFzaWMgdGFncyBzdWNoIGFzIHAgYW5kIGxpIHRoYXQgZG8gbm90IGluaGVyaXQgZnJvbSB0ZCAqLyAKLWJvZHkgewotCWJhY2tncm91bmQtY29sb3IgOiAjZmZmZmZmOyAgIAotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTJweDsKLQl0ZXh0LWRlY29yYXRpb24gOiBub25lOwkJCi0JbWFyZ2luLWxlZnQ6IDBweDsKLQltYXJnaW4tcmlnaHQ6IDBweDsKLQltYXJnaW4tdG9wOiAwcHg7CQotfQotCi0uYm9sZCB7IAotICAgZm9udC13ZWlnaHQgOiA2MDA7Ci0gfQotCi0uYm9yZGVyZ3JheSB7IAotCWJhY2tncm91bmQtY29sb3I6ICNlOWU5ZTk7Ci0gfQotCi0uYm90dG9tYmFyZGFyayB7IAotCWJhY2tncm91bmQtY29sb3I6ICMwMDMzNjY7Ci0gfQotICAKLS5ib3R0b21iYXJsaWdodCB7IAotCWJhY2tncm91bmQtY29sb3I6ICMzMzk5Y2M7Ci0gfQotCi0uYm90dG9tYmFyc2hhZG93IHsgCi0JYmFja2dyb3VuZC1jb2xvcjogIzAwMDAwMDsKLSB9Ci0KLS5icmVhZGNydW1ic3sgCi1jb2xvcjogIzMzNjY5OTsKLWZvbnQtd2VpZ2h0OiA2MDA7Ci0gfQotCi0uYnJlYWRjcnVtYnMyeyAKLWNvbG9yOiAjZmZmZmZmOwotZm9udC1zaXplOiAxMXB4OwotIH0gCi0KLS8qbmF2aWdhdGlvbiBidXR0b25zLCBub3QgZm9ybSBidXR0b25zKi8gCi0uYnV0dG9ucyB7Ci0gICAgYmFja2dyb3VuZC1jb2xvcjogI2VmZWZlZjsKLSAgICBjb2xvcjogIzAwMDAwMDsKLQlmb250LWZhbWlseTogVmVyZGFuYSwgQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsJCi0JZm9udC1zaXplOiAxMHB4OwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsJCi19Ci0KLS8qYWN0aXZlIG5hdmlnYXRpb24gYnV0dG9uLCBub3QgZm9ybSBidXR0b25zKi8gCi0uYnV0dG9ub24gewotICAgIGJhY2tncm91bmQtY29sb3I6ICNkZWRlZGU7Ci0gICAgY29sb3I6ICMwMDAwMDA7Ci0JZm9udC1mYW1pbHk6IFZlcmRhbmEsIEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7CQotCWZvbnQtc2l6ZTogMTBweDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7CQotfSAKLQotLyogdGhlc2UgYnV0dG9uIHN0eWxlcyBhcmUgZm9yIHRoZSB0ZXh0dWFsIGJ1dHRvbnMgaW50ZW5kZWQgdG8gcmVwbGFjZSBpbWFnZSBjb25zdHJ1Y3RzIGZvciBpbnRlcm5hdGlvbmFsaXphdGlvbiAqLyAKLS5idXR0b250eHQgewotCWNvbG9yOiAjMzMzMzMzOwotCWZvbnQtZmFtaWx5OiB2ZXJkYW5hLCBoZWx2ZXRpY2EsIGFyaWFsLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTBweDsKLQlmb250LXdlaWdodDogNjAwOwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotLmNvZGUgeyAKLSAgIGZvbnQtZmFtaWx5OiBDb3VyaWVyIE5ldywgQ291cmllciwgbW9ubzsgICAKLSAgIGZvbnQtc2l6ZTogMTJweDsKLSB9Ci0gCi0gIC8qIGZvbnQgZm9yIHJlZ3VsYXIgY29udGVudCB0ZXh0ICovCi0uY29tbWVudHMgeyAJCi0JZm9udC1zaXplOiAxMXB4OwkKLQliYWNrZ3JvdW5kLWNvbG9yOiAjZWZlZmVmOwotfQotCi0vKm1haW4gY29udGFpbmVyIGhlYWRlciovCi0uY29uaGVhZCB7IAotY29sb3I6ICNjYzMzMDA7Ci1mb250LXdlaWdodDogNjAwOwotdGV4dC1kZWNvcmF0aW9uIDogbm9uZTsKLSB9Ci0gCi0gLyptYWluIGNvbnRhaW5lciBkYXRhIGxhYmVscyovCi0uY29ubGFiZWwgeyAKLWJhY2tncm91bmQtY29sb3I6ICNlZmVmZWY7Ci0gfSAKLSAKLS8qbWFpbiBjb250YWluZXIgZGF0YSBsYWJlbHMgaW4gYm9sZCovCi0uY29ubGFiZWxib2xkIHsgCi1iYWNrZ3JvdW5kLWNvbG9yOiAjZTFlMWUxOwotZm9udC13ZWlnaHQ6IGJvbGQ7Ci0gfSAgCi0gCi0vKnJlcGxhY2luZyBzaWRlbWVudV9ib2xkcmlnaHQgbW92aW5nIGZvcndhcmQqLwotLmNvbnJib2xkIHsKLQljb2xvcjogIzAwMDAwMDsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDExcHg7Ci0JZm9udC13ZWlnaHQgOiA2MDA7Ci0JdGV4dC1kZWNvcmF0aW9uIDogbm9uZTsKLX0KLQotLypoZWFkZXIgZm9yIHJpZ2h0IGhhbmQgY29udGFpbmVyKi8KLS5jb25yaGVhZCB7Ci0JY29sb3I6IDAwMDAwMDsKLQlmb250LWZhbWlseTogVmVyZGFuYSwgQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDEycHg7Ci0JZm9udC13ZWlnaHQ6IDgwMDsKLX0KLQotLyptYWluIGNvbnRhaW5lciB0YWJsZSBoZWFkZXIqLwotLmNvbnRibGhlYWQgeyAgCi0gICBiYWNrZ3JvdW5kLWNvbG9yOiAjY2NjY2NjOwotCWNvbG9yOiAjMzMzMzMzOwkKLQlmb250LXNpemU6IDExcHg7CQotICAgIGZvbnQtd2VpZ2h0OiA2MDA7Ci19Ci0KLS5jb250ZW50eyAKLWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTJweDsJCi0gfQotCi0gLyptZWRpdW0gZ3JleSBjZWxsIGJhY2tncm91bmQqLwotLmNvbnRlbnRib3JkZXIgewotCWJhY2tncm91bmQtY29sb3I6ICNkZWRlZGU7Ci19Ci0KLS8qIGFkZGVkIGZvciB0ZXh0IHJlcHJlc2VudGluZyBkaXNhYmxlZCBmdW5jdGlvbnMuICovCi0uY29udGVudGRpc2FibGVkIHsKLQljb2xvcjogI2NjY2NjYzsKLX0KLQotLyogZm9udCBmb3IgYm9sZCB0ZXh0ICovCi0uY29udGVudGVtcGhhc2lzIHsKLQljb2xvcjogIzAwMDAwMDsKLQlmb250LXdlaWdodCA6IDYwMDsKLX0KLQotLyogdXNlZCB0ZXh0IHJlbWluZGluZyB1c2VyIHRoYXQgdGhlcmUgaXMgcmVxdWlyZWQgY29udGVudCAqLwotLmNvbnRlbnRyZXF1aXJlZCB7Ci0JY29sb3I6ICNiNGI0YjQ7Ci0JZm9udC13ZWlnaHQ6IDUwMDsKLX0KLQotLmNvcHlyaWdodCB7IAotY29sb3IgOiAjOTk5OTk5OwotCWZvbnQtc2l6ZSA6IDEwcHg7Ci19Ci0KLS8qYmxhY2sgY29weXJpZ2h0Ki8KLS5jb3B5cmlnaHRiIHsgCi1jb2xvciA6ICMwMDAwMDA7Ci0JZm9udC1zaXplIDogMTBweDsKLX0KLQotZGQgeyAKLWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTJweDsJCi1tYXJnaW4tbGVmdDogLTFweDsKLSB9Ci0gCi0uZGlhbGdieHNoYWRvdzIgeyAgCi0JYmFja2dyb3VuZC1jb2xvcjogIzg0ODQ4NDsKLX0KLQotLmRpYWxvZ3VlYm94YmcgeyAgCi0JYmFja2dyb3VuZC1jb2xvcjogI2QyZDJkMjsKLX0KLQotLypiYWNrZ3JvdW5kIGZvciBsb2dpbiBwYWdlcyovCi0uZGlhbG9ndWVib3hiZzIgeyAgCi0JYmFja2dyb3VuZC1jb2xvcjogIzk5OTk5OTsKLX0KLQotLmRpYWxvZ3VlYm94Ym9yZGVyIHsgCi0JYmFja2dyb3VuZC1jb2xvcjogIzMzMzMzMzsKLSB9Ci0gCi0uZGlhbG9ndWVib3hoaWdobGlnaHQgewotCWJhY2tncm91bmQtY29sb3I6ICNlZmVmZWY7Ci19Ci0KLSAuZGlhbG9ndWVib3htZWRpdW0geyAKLQliYWNrZ3JvdW5kLWNvbG9yOiAjOGI4YjhiOwotIH0KLSAKLSAuZGlhbG9ndWVib3h0aXRsZSB7CSAgIAotCWZvbnQtc2l6ZTogMTRweDsKLQlmb250LXNpemU6IDExcHg7CQotCWZvbnQtd2VpZ2h0IDogYm9sZDsKLX0KLQotLyp0ZXh0IGZvciBkaXNhYmxlZCBidXR0b25zKi8KLS5kaXNhYmxleyAKLWNvbG9yOiAjOTk5OTk5OwotZm9udC1mYW1pbHk6IHZlcmRhbmEsIGhlbHZldGljYSwgYXJpYWwsIHNhbnMtc2VyaWY7Ci1mb250LXNpemU6IDExcHg7ICAKLQlmb250LXdlaWdodDogNjAwOwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLSB9Ci0gCi1kaXZ7IAotZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0gfSAKLSAKLS8qdXNlZCB0byBhZmZlY3QgcmlnaHQgbWFyZ2luKi8gCi1kaXYubWFyZ2lucnR7IAotCWNsZWFyOiByaWdodDsKLQlmbG9hdDogcmlnaHQ7Ci0Jd2lkdGg6IDdweDsKLSB9ICAKLSAKLWRpdi5tYXJnaW5zIHsgCi1mbG9hdDogbGVmdDsKLW1hcmdpbi1sZWZ0OiA3cHg7Ci1tYXJnaW4tdG9wOiAyNXB4OwkKLW1hcmdpbi1yaWdodDogN3B4OwotIH0gICAKLQotLypmb3IgcGFnZXMgd2l0aCBidXR0b24gbmF2aWdhdGlvbiBvbiB0b3AqLyAKLWRpdi5tYXJnaW5zMjAgeyAKLWZsb2F0OiBsZWZ0OwotbWFyZ2luLWxlZnQ6IDdweDsKLW1hcmdpbi10b3A6IDIwcHg7CQotbWFyZ2luLXJpZ2h0OiA3cHg7Ci0gfSAgICAKLSAKLSAvKmFkZHMgMTAgcHggcGFkZGluZyovCi0gZGl2LnBhZDEweyAKLSBwYWRkaW5nOiAxMHB4OyAKLSAgfQotCi0uZGl2aWRlciB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI2Y2ZjlmMDsKLX0KLQotZGx7ICAKLWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotZm9udC1zaXplOiAxMnB4OyAgIAotCX0KLQotLypyZW1vdmVzIGRlZmF1bHQgYm90dG9tIG1hcmdpbiwgZG9lc24ndCB3b3JrIGluIE5TNC43eCAqLyAKLWRsLmRhdGEgeyAKLW1hcmdpbi1ib3R0b206IC0xcHg7Ci0gfSAgCi0KLS5kb2Nib2xkIHsKLQljb2xvcjogIzAwMDAwMDsKLQlmb250LWZhbWlseTogdmVyZGFuYSwgYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDExcHg7ICAgICAgIAotCWZvbnQtd2VpZ2h0IDogNjAwOwotfQotCi0vKmZvciBhcHBsZXQgZG93bmxvYWQgc3BsYXNoIHBhZ2UqLwotLmRvd25sb2FkeyAKLWJhY2tncm91bmQtY29sb3I6ICNlZmVlZWU7Ci0gfQotCi0uZXJyb3Jtc2cgewotCWNvbG9yIDogI2NjMDAwMDsJCi19IAotIAotLyoKLWNvbG9yZWQgZm9udAotZGVzY3JpcHRpb24gYWJvdXQgdGhlIHVzZXIgc3RhdHVzLiBlcS4gInN1YnNjcmlwdGlvbnMgYXJlIHVwZGF0ZWQiCi1pdCdzIHVzdWFsbHkgb24gdGhlIHVwcGVyIHBhcnQgb2YgdGhlIHBhZ2VzCi0qLwotLmZvb3RlcmJvbGQgewotCWNvbG9yIDogI2E0YTRhNDsKLQlmb250LXNpemU6IDkwJTsKLQlmb250LXdlaWdodDogNjAwOwotfQotCi0vKnRoZSAqIHN5bWJvbCBpbmRpY2F0ZSB0aGUgcmVxdWlyZWQgZmllbGQgKi8KLS5mb290ZXJib2xkY29sb3JlZCB7Ci0JY29sb3IgOiAjZmY2NTAwOwotCWZvbnQtc2l6ZTogOTAlOwotCWZvbnQtd2VpZ2h0OiA2MDA7Ci19Ci0KLS5mb290aW5kaWNhdG9yIHsKLQljb2xvcjogIzk5OTk5OTsKLQlmb250LWZhbWlseTogdmVyZGFuYSwgYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDExcHg7ICAgICAgIAotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotLyp0aGUgKiBzeW1ib2wgaW5kaWNhdGUgdGhlIHJlcXVpcmVkIGZpZWxkICovCi0uZm9vdHN0YXJpbmRleCB7Ci0JY29sb3IgOiAjY2MwMDAwOwotCWZvbnQtZmFtaWx5OiB2ZXJkYW5hLCBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogOHB0OwotCWZvbnQtd2VpZ2h0OiBib2xkOwotfQotCi0vKm1vdmUgdG8gZGVzaWduX3BlKi8KLS5mb3JtbGFiZWwgewotCWNvbG9yOiAjMDAwMDAwOwotCWZvbnQtc2l6ZTogMTFweDsKLQlmb250LXdlaWdodCA6IDYwMDsKLQl0ZXh0LWRlY29yYXRpb24gOiBub25lOwotfQotCi0uZm9ybXRibGhlYWQgewotICAgYmFja2dyb3VuZC1jb2xvcjogI2NjY2NjYzsKLQljb2xvcjogIzAwMDAwMDsKLQlmb250LXNpemU6IDExcHg7Ci0JZm9udC13ZWlnaHQgOiA2MDA7Ci19Ci0KLS5ncmV5bWVkaXVtIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjZGVkZWRlOwotfQotCi0uZ3JheWZvbGQgewotCWNvbG9yOiAjY2NjY2NjOwkKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci0JZm9udC1zaXplOiAxNXB4OwotfQotCi0vKk5vdGU6IHJlbW92ZSB0aGlzIG5vdGUgaWYgdXNpbmcgdGhpcyBzdHlsZSBvciB3aWxsIGJlIGRlbGV0ZWQqLwotCS8qIEN1cnJlbnRseSB1c2VkIGluIGNxX2RlZmxlY3RfbG9naW5fZXJyLmh0bWwgLSBzaG91bGQgYmUgcmVuYW1lZCB0byBzb21ldGhpbmcgdGhhdCBoYXMgbGVzcyBkZXNjcmlwdGl2ZSBuYW1lICovCi0uaGVhZGVyYmx1ZSB7Ci0JY29sb3I6ICMwMDY2OTk7CQotCWZvbnQtd2VpZ2h0IDogNjAwOwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotLyp1c2VkIGluIGNjIGZvciBmcmFtZXNldCBkaXNwbGF5Ki8gCi0uaGVhZGVyaW5mcmFtZXMgeyAgCi0JY29sb3I6ICMzMzMzMzM7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxMHB4OwkKLQlmb250LXdlaWdodDogNjAwOwotCW1hcmdpbi1ib3R0b206IDJweDsKLQltYXJnaW4tdG9wOiAwcHg7Ci19Ci0KLSAvKmZvbnQgZm9yIHBhZ2UgaGVhZGVyIGV4Y2VwdCBmb3IgYXJ0aWNsZSBwYWdlcywgKHNlZSBoZWFkZXJfb2ZfYXJ0aWNsZSkqLwotLmhlYWRlcmxhcmdlIHsKLQljb2xvcjogIzMzMzMzMzsKLQlmb250LXNpemU6IDE2MCU7Ci0JZm9udC13ZWlnaHQgOiA0MDA7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi0vKm1haW4gaGVhZGVyIGZvciBmcmFtZSBuYXZpZ2F0aW9uLCBpZSwgY2xlYXJjYXNlIG1lcmdlIGZpbGVzKi8KLS5oZWFkZXJtYWluIHsgIAotCWNvbG9yOiAjMzMzMzMzOwotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTdweDsJCi0JZm9udC13ZWlnaHQ6IDYwMDsKLX0KLQotLyogaGVhZGVyIGVsZW1lbnQgZm9yIGZvcm0gdGFibGVzIGNvbnRhaW5pbmcgbWlkLXNpemUgZml4ZWQgaGVpZ2h0IHRleHQgKi8KLS5oZWFkZXJtZWRsaXN0IHsKLQlmb250LXNpemU6IDExcHg7Ci19Ci0KLS8qZm9ybnQgZm9yIHN0ZXBzIHRpdGxlIGluIGZvcm1zKi8KLS5oZWFkZXJvZnN0ZXBzIHsgCi0JY29sb3I6ICM2NjY2NjY7Ci0JZm9udC1zaXplOiAxN3B4OwotCWZvbnQtd2VpZ2h0OiBib2xkOwotfQotCi0uaGVhZGVyb2ZzdGVwc25vbiB7IAotCWNvbG9yOiAjNjY2NjY2OwotCWZvbnQtc2l6ZTogMTdweDsKLQlmb250LXdlaWdodDogYm9sZDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLS8qdXNlIGhlYWRlcjEgaW5zdGVhZCovCi0uaDEgeyAgCi0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAyMnB4OwkKLQlmb250LXdlaWdodDogODAwOwotfQotCi0vKnRvIHJlcGxhY2UgaDEgYW5kIGNvbnRlbnRoZWFkZXIgbGFyZ2UqLwotLmhlYWRlcjEgeyAgCi0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAyMnB4OwkKLQlmb250LXdlaWdodDogODAwOwotfQotCi0vKmRvY3VtZW50IHJvb3QgZm9sZGVyKi8KLS5oMXJvb3R7ICAKLQljb2xvcjogIzk5OTk5OTsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDIycHg7CQotCWZvbnQtd2VpZ2h0OiA0MDA7Ci19Ci0KLQotLyp1c2VkIGluIGNjLCBjcSwgc2wqLyAKLWgxIHsgIAotCWNvbG9yOiAjMzMzMzMzOwotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTdweDsJCi0JZm9udC13ZWlnaHQ6IDYwMDsKLX0KLQotLy8qdXNlIGhlYWRlcjIgaW5zdGVhZCovCi0uaDIgeyAKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDE5cHg7Ci0JZm9udC13ZWlnaHQ6IDQwMDsJIAkKLX0KLQotLypoZWFkZXJzIHdpdGhpbiBwYWdlKi8KLS5oZWFkZXIyIHsgCi0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxOXB4OwotCWZvbnQtd2VpZ2h0OiA0MDA7CSAJCi19Ci0KLWkgewotCWZvbnQtc3R5bGUgOiBpdGFsaWM7Ci19Ci0KLS5pY29uYm9yZGVyIHsgCi0JYmFja2dyb3VuZC1jb2xvcjogI2RlZGVkZTsKLX0KLQotLypmb250IHNpemUgc2V0dXAgc2hvd24gaW4gdGhlIGlucHV0IGJveCB3aGljaCBpcyBpbmhlcml0ZWQgYnkgaW5wdXRYWCovCi1pbnB1dCB7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7CQotCWZvbnQtc2l6ZTogMTFweDsKLX0gCi0KLWlucHV0LmlucHV0MTM1IHsKLQl3aWR0aDogMTM1cHgKLX0gCi0KLS8qIDEsYnVzaW5lc3Mgc3RhbmRhcmQgbXVsdGlsaW5lIGlucHV0IGJveCAKLTIsdGhpcyBzdHlsZSBvbmx5IGFjdGl2YXRlIGluIElFICovCi1pbnB1dC5tYXg1MCB7Ci0Jd2lkdGg6IDM2MHB4OwotfQotCi1pbnB1dC5weDI1IHsKLSAgICB3aWR0aDogMjVweDsKLX0KLQotaW5wdXQucHg0NSB7Ci0gICAgd2lkdGg6IDQ1cHg7Ci19Ci0KLS8qCi0xLGJ1c2luZXNzIHN0YW5kYXJkIG11bHRpbGluZSBpbnB1dCBib3ggCi0yLHRoaXMgc3R5bGUgb25seSBhY3RpdmF0ZSBpbiBJRQotKi8KLWlucHV0LnB4ODUgewotICAgIHdpZHRoOiA4NXB4OwotfQotCi1pbnB1dC5weDEzNSB7Ci0gICAgd2lkdGg6IDEzNXB4OwotfQotCi1pbnB1dC5weDE1NSB7Ci0gICAgd2lkdGg6IDE1NXB4OwotfQotCi1pbnB1dC5weDIzMCB7Ci0gICAgd2lkdGg6IDIzMHB4OwotfQotCi1pbnB1dC5weDMwNSB7Ci0gICAgd2lkdGg6IDMwNXB4OwotfQotCi0ubGVmdG1lbnUgewotCWJhY2tncm91bmQtY29sb3I6ICM5OTk5OTk7Ci19Ci0KLS5sZWZ0bWVudWJ1bGxldCB7IAotYmFja2dyb3VuZC1jb2xvcjogIzk5OTk5OTsKLSB9Ci0KLS5sZWZ0bWVudWJ1bGxldGFjdGl2ZSB7IAotYmFja2dyb3VuZC1jb2xvcjogI2NkMzMwMTsKLSB9Ci0JCi0KLS5sZWZ0bmF2aGVhZCB7Ci0JY29sb3I6ICMwMDAwMDA7Ci0JZm9udC1zaXplOiAxM3B4OwkKLQlmb250LXdlaWdodDogYm9sZDsJCi19IAotCi0ubGVmdG5hdmxhYmVsIHsKLWNvbG9yOiAjMDAwMDAwOwotZm9udC13ZWlnaHQgOiA2MDA7Ci1mb250LXNpemU6IDExcHg7Ci0gfQotCi0ubGlnaHRncmF5IHsgCi1iYWNrZ3JvdW5kLWNvbG9yOiAjZTRlNGU0OwotIH0KLSAKLS5tZW51YmFyIHsKLSAgY29sb3I6ICNmZmZmZmY7Ci0gIGZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotICBmb250LXNpemU6IDExcHg7Ci0gIGZvbnQtd2VpZ2h0OiA0MDA7Ci0gIHRleHQtZGVjb3JhdGlvbjogbm9uZQotfQotCi0vKm1lbnViYXIgd2l0aGluIHRvcCBvZiBjb250ZW50IHBhZ2UgICovCi0ubWVudWJhcm1pZHsgCi1mb250LXNpemU6IDExcHg7Ci0gIGZvbnQtd2VpZ2h0OiA2MDA7Ci0gIHRleHQtZGVjb3JhdGlvbjogbm9uZQotIH0KLQotLyoKLTEsYm9sZCBmb250IGZvciB0aGUgbGFzdCBpdGVtIG9mIHRoZSBicmVhZGNydW1icwotMixib2xkIGZvbnQgb2YgdGFibGUgaGVhZGVyIHdpdGggbWVudWJhcl9iZyhibHVlKSBhcyBiYWNrZ3JvdW5kIGNvbG9yIAotMyxib2xkIHRleHQgb24gY29sb3JlZCBiYWNrZ3JvdW5kIGVnLiBMb2dnZWQgSW4KLSovCi0ubWVudWJhcmVtcGhhc2lzIHsKLSAgY29sb3I6ICNmZmZmZmY7Ci0gIGZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotICBmb250LXNpemU6IDExcHg7Ci0gIGZvbnQtd2VpZ2h0OiA2MDA7Ci0gIHRleHQtZGVjb3JhdGlvbjogbm9uZQotfQotCi0ubWVudWJhcjpob3ZlciB7Ci0gIGNvbG9yOiAjZmZmZmZmCi19IAotIAotLm1pZGJhcmJnIHsgCi0JYmFja2dyb3VuZC1jb2xvcjogI2ZmZmZmZjsKLSB9IAotIAotLyp0b3BuYXYqLyAKLS5taWRiYXJsaWdodCB7IAotCWJhY2tncm91bmQtY29sb3I6ICMzMzk5Y2M7Ci0gfQotIAotLypkYXJrIGNvbG9yIGJldHdlZW4gdGFicyovCi0gLm1pZGJhcmRhcmsgeyAKLQliYWNrZ3JvdW5kOiAjMDAzMzY2OwotIH0KLSAKLSAvKnRvcG5hdiovIAotIC5taWRiYXJtZWQgeyAKLQliYWNrZ3JvdW5kLWNvbG9yOiAjMDA2Njk5OwotIH0KLSAKLSAvKmJhY2tncm91bmQgIG9mICB0YWJzKi8gCi0gLm1pZGJhcm1lZGl1bSB7IAotCWJhY2tncm91bmQ6ICMwMDY2OTk7Ci0gfQotIAotIC5taWRiYXJzaGFkb3cgeyAKLQliYWNrZ3JvdW5kLWNvbG9yOiAjNjY2NjY2OwotIH0gCi0gIAotLypyZXBsYWNpbmcgc2lkZW1lbnVfYm9sZGxlZnQgbW92aW5nIGZvcndhcmQqLwotLm5hdmxlZnRib2xkIHsKLQljb2xvcjogIzAwMDAwMDsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDExcHg7Ci0JZm9udC13ZWlnaHQgOiA2MDA7Ci0JdGV4dC1kZWNvcmF0aW9uIDogbm9uZTsKLX0KLQotLypsZWZ0IG5hdiBzdWJtZW51Ki8KLS5uYXZsZWZ0c3ViIHsKLQljb2xvcjogIzY3Njc2NzsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDExcHg7Ci0JZm9udC13ZWlnaHQgOiA0MDA7Ci0JbGluZS1oZWlnaHQgOiAxMzUlOwotCXRleHQtZGVjb3JhdGlvbiA6IG5vbmU7Ci19Ci0gCi0vKiBiZWNhdXNlIG9mIGFuIGludGVydmVuaW5nIGxpbmsgdGFnLCB0ZXh0IG9wdGlvbnMgd2VyZSBhdHRhY2hlZCB0byB0aGlzIGVsZW1lbnQgaW5zdGVhZCBvZiB0aGUgb3V0ZXJtb3N0IGNlbGwgKi8KLS5ub25hY3RpdmV0YWIgewotCWNvbG9yOiAjYjRiNGI0OwotCWZvbnQtc2l6ZTogMTJweDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLS8qbm90ZXMvIGRlc2NyaXB0aW9uIG9mIGljb24gKi8KLS5ub3Rlc3sgIAotIGZvbnQtc2l6ZTogMTFweDsKLSBmb250LXdlaWdodCA6IDQwMDsJCi19Ci0KLXAgewotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTJweDsJCi19Ci0KLS5wYWdlYm9sZCB7IAotCWNvbG9yOiAjMDAwMDAwOwotCWZvbnQtd2VpZ2h0IDogNjAwOwkKLSB9Ci0gCi0vKmZvbnQgZm9yIHRoZSBudW1iZXJzIGluIHBhZ2luYXRpb24gbGlicmFyeSovCi0gLnBhZ2VudW1iZXIgewotCWNvbG9yOiAjNjc2NzY3OwotCWZvbnQtd2VpZ2h0IDogNDAwOwotfQotCi0gLypmb250IGZvciBwcmV2aW91cyAmIG5leHQgaW4gcGFnaW5hdGlvbiovCi0ucGFnZXN0ZXBzIHsgCi0JY29sb3I6ICM2NzY3Njc7CQotCWZvbnQtc2l6ZTogMTFweDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci0gfQotCi0ucG9wIHsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsgCi0JZm9udC1zaXplIDogMTJweDsKLQlmb250LXdlaWdodCA6IDIwMDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLS5wb3BiYWNrZ3JvdW5kIHsKLQotCWJhY2tncm91bmQ6ICNkNmQzY2U7Ci19Ci0KLS5wb3BoMSB7Ci0JZm9udC1zaXplOiAxNnB4OwotCWZvbnQtd2VpZ2h0IDogYm9sZDsKLX0KLQotLnBvcGxlZnRtZW51IHsKLQliYWNrZ3JvdW5kOiAjZjBmMGYwOwotCWJvcmRlcjogdGhpbiBzb2xpZCBjY2NjY2M7IAotCWxlZnQ6IDIxMHB4OyAKLQlwYWRkaW5nOiAycHg7Ci0JcG9zaXRpb246YWJzb2x1dGU7IAotCXRvcDogMjVweDsKLQl2aXNpYmlsaXR5OiBoaWRkZW47IAotCXdpZHRoOjc1cHg7Ci0Jei1pbmRleDoxMDsJCi0gfQotCi0gLyogdXNlIHBvcGxlZnRtZW51IGluc3RlYWQgb2YgdGhpcyBvbmUqLwotLnBvcHVwYm9yZGVyIHsKLQliYWNrZ3JvdW5kOiAjZjBmMGYwOwotCWJvcmRlciA6IHRoaW4gc29saWQgY2NjY2NjOwotCXBhZGRpbmcgOiAycHg7Ci19Ci0KLS5wb3B1cHRleHQgewkKLSAgIGNvbG9yOiAjMzMzMzMzOwotCWZvbnQtc2l6ZTogMTFweDsJCi0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi0ucHJvamVjdGF0dCB7IAotCWZvbnQtZmFtaWx5OiB2ZXJkYW5hLCBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTJweDsgCi0JZm9udC13ZWlnaHQ6IDYwMDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7IAotCWNvbG9yOiAjY2QzMzAxOwotfQotCi0vKmRhdGUgYXNzb2NpYXRlZCB3aXRoIGFydGljbGUgcmF0aW5ncyovCi0ucmF0aW5nc2RhdGUKLXsKLQljb2xvcjogIzMzNjY5OTsKLQlmb250LXNpemUgOiAxMXB4OwotCXRleHQtZGVjb3JhdGlvbiA6IG5vbmU7Ci0JdGV4dC1hbGlnbjogcmlnaHQ7Ci19Ci0KLXNlbGVjdCB7Ci0gICAgZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7CQotCWZvbnQtc2l6ZTogMTFweDsKLX0KLQotc2VsZWN0LnNlbHB4MTQ0IHsKLSAgICB3aWR0aDogMTQ0cHg7Ci19Ci0KLS8qIC5zaWRlbWVudV9ib2xkbGVmdCByZXBsYWNlIHdpdGggLmxlZnRtZW51Ym9sZCovIAotCi0vKiAuc2lkZW1lbnVfYm9sZGxlZnRfc2VsZWN0ZWQgcmVwbGFjZSB3aXRoIC5sZWZ0bWVudWFjdGl2ZSovCi0KLS8qIC5zaWRlbWVudV9idWxsZXRfY29sb3JlZCByZXBsYWNlIHdpdGggLmxlZnRtZW51YnVsbGV0YWN0aXZlKi8KLSAKLS8qLnNpZGVtZW51X2J1bGxldF9ncmV5IHJlcGxhY2Ugd2l0aCBsZWZ0bWVudWJ1bGxldCovCi0KLS5zaWRlbWVudWJvbGRsZWZ0IHsKLQljb2xvcjogIzAwMDAwMDsJCi0JZm9udC1zaXplOiAxMXB4OwotCWZvbnQtd2VpZ2h0IDogNjAwOwotCXRleHQtZGVjb3JhdGlvbiA6IG5vbmU7Ci19IAotCi0uc2lkZW1lbnVib2xkbGVmdHNlbGVjdGVkIHsKLQljb2xvcjogI2NjMDAwMDsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDExcHg7Ci0JZm9udC13ZWlnaHQgOiA2MDA7Ci0JdGV4dC1kZWNvcmF0aW9uIDogbm9uZTsKLX0KLQotLnNpZGVtZW51c3RhbmRhcmQgewotCWNvbG9yOiAjNjc2NzY3OwotCWZvbnQtc2l6ZTogMTFweDsKLQlmb250LXdlaWdodCA6IDQwMDsKLQlsaW5lLWhlaWdodCA6IDEzNSU7Ci0JdGV4dC1kZWNvcmF0aW9uIDogbm9uZTsKLX0KLQotLnNpZGVtZW51c3RhbmRhcmRzZWxlY3RlZCB7Ci0JY29sb3I6ICNjYzAwMDA7Ci0JZm9udC1zaXplOiAxMXB4OwotCWZvbnQtd2VpZ2h0IDogNDAwOwotCWxpbmUtaGVpZ2h0IDogMTM1JTsKLQl0ZXh0LWRlY29yYXRpb24gOiBub25lOwotfQotCi0uc21hbGx0ZXh0IHsKLQlmb250LWZhbWlseTogdmVyZGFuYSwgYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDEwcHg7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotCWNvbG9yOiAjMDAwMDAwOwotfQotCi0udGFibGVoZWFkZXIgeyAKLQotCWNvbG9yOiAjMDAwMDAwOwkKLQlmb250LXNpemU6IDEzcHg7CQotICAgIGZvbnQtd2VpZ2h0OiBib2xkCi19Ci0KLQotLyogZm9udCBmb3IgcmVndWxhciBjb250ZW50IHRleHQgKi8KLXRkIHsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDEycHg7CQotfQotCi0vKiBiZWNhdXNlIG9mIGFuIGludGVydmVuaW5nIGxpbmsgdGFnLCB0ZXh0IG9wdGlvbnMgd2VyZSBhdHRhY2hlZCB0byBhIHNpbWlsYXIgZWxlbWVudCBmb3IgbGlua3MgKi8KLXRkLmFjdGl2ZXRhYiB7IAotIAliYWNrZ3JvdW5kLWNvbG9yOiAjYzRjNGM0OwotICB9Ci0gCi0vKiBiZWNhdXNlIG9mIGFuIGludGVydmVuaW5nIGxpbmsgdGFnLCB0ZXh0IG9wdGlvbnMgd2VyZSBhdHRhY2hlZCB0byBhIHNpbWlsYXIgZWxlbWVudCBmb3IgbGlua3MgKi8KLXRkLmFjdGl2ZXRhYnNlbGVjdGVkIHsgCi0gCWJhY2tncm91bmQtY29sb3I6ICNkZGRkZGQ7Ci0gIH0KLSAgCi0gLyogdGhlc2UgYnV0dG9uIHN0eWxlcyBhcmUgZm9yIHRoZSB0ZXh0dWFsIGJ1dHRvbnMgaW50ZW5kZWQgdG8gcmVwbGFjZSBpbWFnZSBjb25zdHJ1Y3RzIGZvciBpbnRlcm5hdGlvbmFsaXphdGlvbiAqLyAKLXRkLmJ1dHRvbmJvZHkgewotCWJhY2tncm91bmQtY29sb3I6ICNkNGQ0ZDQ7Ci19Ci0KLXRkLmJ1dHRvbmhpZ2hsaWdodCB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI2ZmZmZmZjsKLX0KLQotdGQuYnV0dG9uc2hhZG93IHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjNmQ2ZDZkOwotfQotIAotLyogZGVzaWduIGVsZW1lbnQgcmFyZWx5IHVzZWQgZm9yIGxpbmUgY29sb3VyIGluIGNlcnRhaW4gZGVjb3JhdGl2ZSB0YWJsZXMgKi8KLXRkLmRlc2lnbjEgewotCWJhY2tncm91bmQtY29sb3I6ICNkNGQ0ZDQ7Ci19Ci0gCi0vKmRlc2lnbiBlbGVtZW50IHNpbXVsYXRpbmcgYSBkaW1lbnNpb25hbCBib3VuZGFyeSB0byBhIHRhYmxlICovCi10ZC5kaXZpZGVyZGltZW5zIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjYmRiZGJkOwotfQotIAotIC8qIGJlY2F1c2Ugb2YgYW4gaW50ZXJ2ZW5pbmcgbGluayB0YWcsIHRleHQgb3B0aW9ucyB3ZXJlIGF0dGFjaGVkIHRvIGEgc2ltaWxhciBlbGVtZW50IGZvciBsaW5rcyAqLwotdGQubm9uYWN0aXZldGFiIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjZWZlZmVmOwotfQotCi0vKiBkYXRhIHdpdGhpbiBhIHRhYmxlIGhpZ2hsaWdodGVkIGluIGdyYXkqLwotdGQudGJsaGlnaGx0IHsgCi0gICBiYWNrZ3JvdW5kLWNvbG9yOiAjZGVkZWRlOwotICAgcGFkZGluZzogMnB4OwotIH0KLSAKLSB0ZC50YmxoaWdobHQxIHsgCi0gICBiYWNrZ3JvdW5kLWNvbG9yOiAjZGVkZWRlOwotIH0KLSAKLS8qIGRhdGEgd2l0aGluIGEgdGFibGUgaGlnaGxpZ2h0ZWQgaW4gbGlnaHQgZ3JheSovCi10ZC50YmxoaWdobHQyIHsgCi0gICBiYWNrZ3JvdW5kLWNvbG9yOiAjZWZlZmVmOwotIH0gCi0KLS8qZGFyayBncmV5IGNlbGwgYmFja2dyb3VuZCBhbmQgYm9sZCB0ZXh0ICovCi0udGRkYXJrYm9sZCB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI2NjY2NjYzsJCi0JZm9udC13ZWlnaHQgOiA2MDA7Ci19Ci0KLS50ZGxpZ2h0IHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjZWZlZmVmOwotCXBhZGRpbmc6IDJweDsKLX0KLQotLnRkbGlnaHQxIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjZWZlZmVmOwotfQotIAotIAotdGV4dGFyZWEgewotICAgIGZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwkKLQlmb250LXNpemU6IDExcHg7Ci19Ci0KLXRleHRhcmVhLnB4MzgwewotIHdpZHRoOiAzODBweDsgCi0gfQotCi0udGV4dGVycm9ybXNnIHsKLQljb2xvciA6IGNjMDAwMDsKLQlmb250LWZhbWlseTogdmVyZGFuYSwgYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDExMCU7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci19Ci0KLS50ZXh0Z3JheSB7ICAKLQljb2xvcjogIzk5OTk5OTsJCi19Ci0KLS50b3BiYXJkaXZpZGVyIHsgCi0JYmFja2dyb3VuZDogIzMzOTljYyAKLX0KLQotLnRvcGJhcmRpdmlkZXJncmV5ZWQgeyAKLQliYWNrZ3JvdW5kOiAjYWRkNmViCi0gfSAgCi0KLS50b3BiYXJzZXBhcmF0b3IgewotICBjb2xvcjogI2NjMzMwMDsgIAotICBmb250LXNpemU6IDExcHg7Ci0gIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0gCi0gCi0udG9wZnJhbWViZyB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI2QyZDJkMjsKLX0KLQotLnRvcGZyYW1lYmdncmV5ZWQgewotCWJhY2tncm91bmQtY29sb3I6ICNlZGVkZWQ7Ci19Ci0KLS50b3BmcmFtZWhpZ2hsaWdodCB7ICAKLQliYWNrZ3JvdW5kLWNvbG9yOiAjYjZiNWI1OwotfQotCi0udG9wZnJhbWVoaWdobGlnaHRncmV5ZWQgeyAgCi0JYmFja2dyb3VuZC1jb2xvcjogI2UxZTFlMTsKLX0KLQotLnRvcGZyYW1laGlnaGxpZ2h0MiB7IAotCWJhY2tncm91bmQtY29sb3I6ICNlZmVmZWY7Ci19Ci0KLS50b3BmcmFtZWhpZ2hsaWdodDJncmV5ZWQgeyAKLQliYWNrZ3JvdW5kLWNvbG9yOiAjZjlmOWY5OwotIH0gCi0gCi0udG9wZnJhbWVsb2dvYmcgeyAgCi0JYmFja2dyb3VuZC1jb2xvcjogIzAwNjY5OTsKLX0KLQotLnRvcGZyYW1lbG9nb2JnZ3JleWVkIHsgIAotCWJhY2tncm91bmQtY29sb3I6ICM5OWMyZDY7Ci19Ci0KLS50b3BmcmFtZXNoYWRvdyB7ICAKLQliYWNrZ3JvdW5kLWNvbG9yOiAjODQ4NDg0OwotfQotCi0udG9wZnJhbWVzaGFkb3dncmV5ZWQgeyAgCi1iYWNrZ3JvdW5kLWNvbG9yOiAjY2VjZWNlOwotfQotCi0udG9wbGVmdG5hdiB7CQotICAgIGNvbG9yOiAjMDAwMDAwOwotCWZvbnQtZmFtaWx5OiB2ZXJkYW5hLCBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTBweDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLS50b3BsZWZ0bmF2Ym9sZCB7IAotCWZvbnQtZmFtaWx5OiB2ZXJkYW5hLCBicmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTBweDsgCi0JZm9udC13ZWlnaHQ6IDYwMDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7IAotfQotCi0udG9wbGVmdG5hdmJvbGRncmV5ZWQgeyAKLQljb2xvcjogIzk5OTk5OTsKLQlmb250LWZhbWlseTogdmVyZGFuYSwgYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsgCi0JZm9udC1zaXplOiAxMHB4OyAKLQlmb250LXdlaWdodDogYm9sZDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7IAotfQotCi0udG9wbGVmdG5hdmdyZXllZCB7CQotCWNvbG9yOiAjOTk5OTk5OwotCWZvbnQtZmFtaWx5OiB2ZXJkYW5hLCBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTBweDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci0JfQotCi0udG9wbGluZWNvbG9yIHsgCi0JYmFja2dyb3VuZC1jb2xvcjogIzAwNjY5OTsKLSB9CQotCQotLnRvcHJpZ2h0bmF2IHsKLQljb2xvcjogI2ZmZmZmZjsKLQlmb250LWZhbWlseTogdmVyZGFuYSwgYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDEwcHg7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi0KLS50b3ByaWdodG5hdmdyZXkKLXsKLQlmb250LWZhbWlseTogVmVyZGFuYSwgQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDEwcHg7Ci0JY29sb3I6ICMwMDAwMDA7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi0gLyogdGhpcyB3YXMgaW5pdGlhbGx5IGRlY2xhcmVkIHRoZSBzYW1lIGNvbG91ciBhcyB0aGUgY2xhc3MgdG9wZnJhbWUgYmcgYnV0IGJlY2F1c2UgaXQgbGllcyBpbiBhIGRpZmZlcmVudCBmdW5jdGlvbmFsIGFyZWEsIGhhcyBiZWVuIHJlY3JlYXRlZCBoZXJlICAqLwotdHIuYmdtaWRmcmFtZSB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI2QyZDJkMjsKLX0KLQotdGQuc2lkZW1lbnVidWxsZXRncmV5IHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjOTk5OTk5OwotfQotCi0KLXRkLnNpZGVtZW51YnVsbGV0Y29sb3JlZCB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI2NkMzMwMTsKLX0KLQotLypsaXN0LXN0eWxlLWltYWdlOiB1cmwoaW1hZ2VzL2Rvd25idXR0b24uZ2lmKTsqLwotdWwgewkKLQlsaXN0LXN0eWxlLXR5cGU6IHNxdWFyZTsKLX0KLSAKLQotLnZvYiB7Ci0JZm9udC1mYW1pbHk6IEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxNTAlOwotCWNvbG9yOiAjMDA2Njk5OwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLQlmb250LXdlaWdodDogNDAwOwotfQotCi0udm9iYm90dG9tIHsKLQlmb250LWZhbWlseTogQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDE0cHg7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9zdHlsZXNoZWV0cy9zdHlsZXNfaWU2bnM2LmNzcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvc3R5bGVzaGVldHMvc3R5bGVzX2llNm5zNi5jc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwZGM0NmQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9zdHlsZXNoZWV0cy9zdHlsZXNfaWU2bnM2LmNzcworKysgL2Rldi9udWxsCkBAIC0xLDExODQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqLwotCi0vKm11c3QgYWRkIGZvbnQgdHlwZSBpZiBjbGFzcyBpcyBiZWluZyB1c2VkIGFzIGEgbGluayBhcyB3ZWxsIGFzICBuby1saW5rICovCi0KLWEgewkKLQljb2xvcjogIzMzNjY5OTsKLX0KLQotYS50b3ByaWdodG5hdjphY3RpdmUgewotCWNvbG9yOiAjOTlDQ0NDOwotfQotCi1hLnRvcHJpZ2h0bmF2Z3JleTphY3RpdmUgewotCWNvbG9yOiAjQ0MwMDAwOwotfQotCi0KLWEudG9wcmlnaHRuYXZncmV5OmhvdmVyIHsKLQljb2xvcjogI0NDMDAwMDsKLX0gCi1hLnRvcHJpZ2h0bmF2OmhvdmVyIHsKLQljb2xvcjogIzk5Q0NDQzsKLX0gLyogZm9udCBmb3IgYWN0aW9uIG9uIGNvbnRlbnQgcGFnZSB1c3VhbGx5IGxvY2F0ZWQgb24gdG9wIG9mIHBhZ2UgO2llLiwgc2VsZWN0IGFsbCovCi1hLmFjdGlvbiB7ICAKLQljb2xvcjogIzMzMzMzMzsKLQlmb250LXNpemU6IDExcHg7CQotfSAKLQotYS5hY3Rpb25zZWxlY3RvciB7ICAKLQljb2xvcjogIzAwMDAwMDsKLQlmb250LXNpemU6IDExcHg7CQotfQotCi0vKiBiZWNhdXNlIG9mIGFuIGludGVydmVuaW5nIGxpbmsgdGFnLCB0ZXh0IG9wdGlvbnMgd2VyZSBhdHRhY2hlZCB0byB0aGlzIGVsZW1lbnQgaW5zdGVhZCBvZiB0aGUgb3V0ZXJtb3N0IGNlbGwgKi8KLWEuYWN0aXZldGFiIHsgCi0gCWNvbG9yOiAjMDAwMDAwOwotIAlmb250LXNpemU6IDEycHg7Ci0gIAl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLS8qIGJlY2F1c2Ugb2YgYW4gaW50ZXJ2ZW5pbmcgbGluayB0YWcsIHRleHQgb3B0aW9ucyB3ZXJlIGF0dGFjaGVkIHRvIHRoaXMgZWxlbWVudCBpbnN0ZWFkIG9mIHRoZSBvdXRlcm1vc3QgY2VsbCAqLwotYS5hY3RpdmV0YWJzZWxlY3RlZCB7IAotIAljb2xvcjogIzJjMmMyYzsKLSAJZm9udC1zaXplOiAxMnB4OwotICAJdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi1hLmJhc2ljIHsgCQotICAgIGNvbG9yOiAjMDAwMDAwOwotfQotCi0vKiBmb3Igbm9uLWltYWdlIGJ1dHRvbnMsIGZvciBpbnRlcm5hdGlvbmFsaXphdGlvbiAqLwotYS5idXR0b24gewotCWNvbG9yOiAjMzMzMzMzOwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotYS5idXR0b246YWN0aXZlIHsKLQljb2xvcjogMzMzMzMzOwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotLyogZm9yIG5vbi1pbWFnZSBidXR0b25zLCBmb3IgaW50ZXJuYXRpb25hbGl6YXRpb24gKi8KLWEuYnV0dG9uOmhvdmVyIHsKLQljb2xvcjogMzMzMzMzOwotfQotCi0vKiBmb3Igbm9uLWltYWdlIGJ1dHRvbnMgaW4gTXVsdGlzaXRlLCBmb3IgaW50ZXJuYXRpb25hbGl6YXRpb24gKi8KLWEuYnV0dG9uMiB7Ci0JY29sb3I6ICMwMDAwMDA7Ci0JZm9udC1zaXplIDogMTFweDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7CQotfQotCi0vKm1haW4gY29udGFpbmVyICBhY3Rpb25zL2xpbmtzIGZvciBlZGl0aW5nKi8KLWEuY29ubGlua2VkaXQKLXsKLQl0ZXh0LWRlY29yYXRpb24gOiBub25lOwotCWZvbnQtc2l6ZSA6IDExcHg7Ci19Ci0KLWEuY29weXJpZ2h0IHsgCQotCWNvbG9yIDogIzk5OTk5OTsKLQlmb250LXNpemUgOiAxMHB4OwotfSAKLQotYS5mb3JtdGJsaGVhZCB7Ci0gICBiYWNrZ3JvdW5kLWNvbG9yOiAjY2NjY2NjOwotCWNvbG9yOiAjMDAwMDAwOwotCWZvbnQtc2l6ZTogMTFweDsKLQlmb250LXdlaWdodCA6IDYwMDsKLX0KLQotLyogbGlnaHQgY29sb3VyZWQgaGVhZGluZyBsaW5rIGZvciBkaXNjdXNzaW9uIGFuZCBzaW1pbGFyIHVzZXMgLSB3YXMgaGVhZGVyX2Rpc2N1c3Npb25fbGluayBpbiBwcmV2aW91cyB2ZXJzaW9ucyAqLwotIGEuaGVhZGVybGlua2xpZ2h0IHsKLQljb2xvcjogCWZmZmZmZjsKLQlmb250LXNpemU6IDAuOWVtOwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0JCi0KLS8qYm9sZCBsaW5rLCBpZSwgYWR2YW5jZWQgc2VhcmNoIGxpbmsgaW4gcGUqLwotYS5saW5rZnVuY29wdGlvbiB7ICAJCQotCWZvbnQtc2l6ZTogMTFweDsKLQlmb250LXdlaWdodDogNjAwOwotfQotCQotYS5uYXZ0cmVleyAJCi0gICAgY29sb3I6ICMwMDAwMDA7Ci0JZm9udC1zaXplIDogMTFweDsKLQlmb250LXdlaWdodDogNjAwOwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0gCi0KLS8qbmF2dHJlZSBpdGVtIG9yIGRvYywgbm9kZXMgdGhhdCBkb24ndCBleHBhbmQqLwotYS5uYXZ0cmVlaXRlbXsgCQotICAgIGNvbG9yOiAjMDAwMDAwOwotCWZvbnQtc2l6ZSA6IDExcHg7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfSAKLQotLyogc2ltcGxlIG1lY2hhbmlzbSB0byB0dXJuIHRleHQgZGVjb3JhdGlvbiBvZmYgKi8KLWEubm9saW5lIHsKLSAJdGV4dC1kZWNvcmF0aW9uOiBub25lOwotIH0KLQotYS5wb3B1cHRleHQgewkKLSAgIGNvbG9yOiAjMzMzMzMzOwotCWZvbnQtc2l6ZTogMTFweDsJCi0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi1hLnBvcHRleHQgewotCWNvbG9yOiAjMzMzMzMzOwotCWZvbnQgOiAxMXB4OwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotYS5wb3B1cHRleHQ6YWN0aXZlewkKLWNvbG9yOiAjY2MwMDAwOwotfQotCi1hLnNtYWxsIHsJCi0JZm9udC1zaXplOiAxMXB4OwkKLX0KLQotYS5zbWFsbGIgewkKLSAgIGNvbG9yOiAjMDAwMDAwOwotCWZvbnQtc2l6ZTogMTFweDsJCi19Ci0KLWEudG9wYmFyewotICBjb2xvcjogIzY2NjY2NjsKLSAgIGZvbnQtc2l6ZTogMTFweDsKLSAgdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfSAKLQotLyp1c2VkIGFzIGhpZ2hsaWdodGVkIGRlc2NyaXB0aW9uIGFib3ZlIHRhYmxlcyovCi0uYWNjZW50Y29sb3IgewotCWNvbG9yIDogI2NjMzMwMDsKLQlmb250LXdlaWdodCA6IDYwMDsKLX0KLQotIC8qIGJnY29sb3IgIGZvciBhY3Rpb24gdGV4dCB1c3VhbGx5IGxvY2F0ZWQgb24gdG9wIG9mIHBhZ2U7aWUuLCBzZWxlY3QgYWxsKi8KLS5hY3Rpb25iZyB7IAotYmFja2dyb3VuZC1jb2xvcjogI2VmZWZlZjsKLX0KLQotLmFjdGlvbnNlbGVjdG9yIHsKLSAgIGJhY2tncm91bmQtY29sb3I6ICNlOWU5ZTk7Ci0JY29sb3I6ICMwMDAwMDA7Ci0JZm9udC1zaXplOiAxMXB4OwotfQotCi0uYWN0aW9uc2VsZWN0b3JkaXMgewotYmFja2dyb3VuZC1jb2xvcjogI2U5ZTllOTsKLQljb2xvcjogI2NjY2NjYzsKLQlmb250LXNpemU6IDExcHg7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi1iIHsgCi0gICBmb250LXdlaWdodCA6IGJvbGQ7Ci0gfQotIAotLmJhc2VsaW5laXRhbGljcyB7Ci0JY29sb3I6ICM2NjY2NjY7Ci0JZm9udC1zaXplOiAxMXB4OwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotLmJnYmxhY2sgeyAKLQliYWNrZ3JvdW5kLWNvbG9yOiAjMDAwMDAwOwotfQotCi0gLyogYmFzaWMgY29sdW1uIGJhY2tncm91bmQgY29sb3VyIGZvciBkaXNjdXNzaW9ucywgZmlsZXMsIG90aGVyIHN1Y2ggdGFidWxhdGVkIGRhdGEgKi8KLS5iZ2NvbHVtbmJhc2ljIHsgCi0JYmFja2dyb3VuZC1jb2xvcjogI2VmZWZlZjsKLSB9Ci0gCi0uYmd3aGl0ZSB7IAotCWJhY2tncm91bmQtY29sb3I6ICNmZmZmZmY7Ci0gfSAKLSAKLSAvKiBzaXplIGlucHV0IGZvciBiYXNpYyB0YWdzIHN1Y2ggYXMgcCBhbmQgbGkgdGhhdCBkbyBub3QgaW5oZXJpdCBmcm9tIHRkICovICAKLWJvZHkgewotCWJhY2tncm91bmQtY29sb3IgOiAjZmZmZmZmOyAgIAotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTFweDsKLQl0ZXh0LWRlY29yYXRpb24gOiBub25lOwkJCi0JbWFyZ2luLWxlZnQ6IDBweDsKLQltYXJnaW4tdG9wOiAwcHg7Ci19Ci0KLS5ib2xkIHsgCi0gICBmb250LXdlaWdodCA6IDYwMDsKLSB9Ci0KLSAuYm9yZGVyZ3JheSB7IAotCWJhY2tncm91bmQtY29sb3I6ICNlOWU5ZTk7Ci0gfQotIAotIC5ib3R0b21iYXJkYXJreyAKLQliYWNrZ3JvdW5kLWNvbG9yOiAjMDAzMzY2OwotIH0KLSAKLS5ib3R0b21iYXJsaWdodHsgCi0JYmFja2dyb3VuZC1jb2xvcjogIzMzOTljYzsKLSB9Ci0KLS5ib3R0b21iYXJzaGFkb3d7IAotCWJhY2tncm91bmQtY29sb3I6ICMwMDAwMDA7Ci0gfQotCi0uYnJlYWRjcnVtYnN7IAotY29sb3I6ICMzMzY2OTk7Ci1mb250LXdlaWdodDogNjAwOwotIH0gCi0gCi0uYnJlYWRjcnVtYnMyeyAKLWNvbG9yOiAjZmZmZmZmOwotZm9udC1zaXplOiAxMXB4OwotIH0gCi0gIAotIC8qbmF2aWdhdGlvbiBidXR0b25zLCBub3QgZm9ybSBidXR0b25zKi8gCi0uYnV0dG9ucyB7Ci0gICAgYmFja2dyb3VuZC1jb2xvcjogI2VmZWZlZjsKLSAgICBjb2xvcjogIzAwMDAwMDsKLQlmb250LWZhbWlseTogdmVyZGFuYSwgYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsJCi0JZm9udC1zaXplOiAxMHB4OwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsJCi19Ci0KLS8qYWN0aXZlIG5hdmlnYXRpb24gYnV0dG9uLCBub3QgZm9ybSBidXR0b25zKi8gCi0uYnV0dG9ub24gewotICAgIGJhY2tncm91bmQtY29sb3I6ICNkZWRlZGU7Ci0gICAgY29sb3I6ICMwMDAwMDA7Ci0JZm9udC1mYW1pbHk6IFZlcmRhbmEsIEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7CQotCWZvbnQtc2l6ZTogMTBweDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7CQotfSAKLQotLyogdGhlc2UgYnV0dG9uIHN0eWxlcyBhcmUgZm9yIHRoZSB0ZXh0dWFsIGJ1dHRvbnMgaW50ZW5kZWQgdG8gcmVwbGFjZSBpbWFnZSBjb25zdHJ1Y3RzIGZvciBpbnRlcm5hdGlvbmFsaXphdGlvbiAqLyAKLS5idXR0b250eHQgewotCWNvbG9yOiAjMzMzMzMzOwotCWZvbnQtZmFtaWx5OiB2ZXJkYW5hLCBoZWx2ZXRpY2EsIGFyaWFsLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTBweDsKLQlmb250LXdlaWdodDogNjAwOwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotLmNvZGUgeyAKLSAgIGZvbnQtZmFtaWx5OiBDb3VyaWVyIE5ldywgQ291cmllciwgbW9ubzsgICAKLSAgIGZvbnQtc2l6ZTogMTJweDsKLX0KLQotLyogZm9udCBmb3IgcmVndWxhciBjb250ZW50IHRleHQgKi8KLS5jb21tZW50cyB7IAkKLQliYWNrZ3JvdW5kLWNvbG9yOiAjZWZlZmVmOwotCWZvbnQtc2l6ZTogMTFweDsJCi19Ci0KLS8qbWFpbiBjb250YWluZXIgaGVhZGVyKi8KLS5jb25oZWFkeyAKLWNvbG9yOiAjY2MzMzAwOwotZm9udC13ZWlnaHQ6IDYwMDsKLXRleHQtZGVjb3JhdGlvbiA6IG5vbmU7Ci0gfQotCi0gLyptYWluIGNvbnRhaW5lciBkYXRhIGxhYmVscyovCi0uY29ubGFiZWx7IAotYmFja2dyb3VuZC1jb2xvcjogI2VmZWZlZjsKLSB9IAotCi0vKm1haW4gY29udGFpbmVyIGRhdGEgbGFiZWxzIGluIGJvbGQqLwotLmNvbmxhYmVsYm9sZCB7IAotYmFja2dyb3VuZC1jb2xvcjogI2UxZTFlMTsKLWZvbnQtd2VpZ2h0OiBib2xkOwotIH0gIAotIAotLypyZXBsYWNpbmcgc2lkZW1lbnVfYm9sZHJpZ2h0IG1vdmluZyBmb3J3YXJkLCB1c2UgZm9yIGxpbmtzIGFuZCBub24tbGlua3MqLwotLmNvbnJib2xkCi17Ci0JY29sb3I6ICMwMDAwMDA7CQotCWZvbnQtc2l6ZTogMTFweDsKLQlmb250LXdlaWdodCA6IDYwMDsKLQl0ZXh0LWRlY29yYXRpb24gOiBub25lOwotfSAKLSAKLSAKLS8qaGVhZGVyIGZvciByaWdodCBoYW5kIGNvbnRhaW5lciovCi0uY29ucmhlYWQgewotCWNvbG9yOiAwMDAwMDA7Ci0JZm9udC1mYW1pbHk6IFZlcmRhbmEsIEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxMnB4OwotCWZvbnQtd2VpZ2h0OiA4MDA7Ci19Ci0KLS8qbWFpbiBjb250YWluZXIgdGFibGUgaGVhZGVyKi8KLS5jb250YmxoZWFkIHsgCi0gICBiYWNrZ3JvdW5kLWNvbG9yOiAjY2NjY2NjOwotCWNvbG9yOiAjMzMzMzMzOwkKLQlmb250LXNpemU6IDcwJTsJCi0gICAgZm9udC13ZWlnaHQ6IDYwMDsKLX0KLQotLmNvbnRlbnR7IAotZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxMnB4OwkKLSB9Ci0KLSAvKm1lZGl1bSBncmV5IGNlbGwgYmFja2dyb3VuZCovCi0uY29udGVudGJvcmRlciB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI2RlZGVkZTsKLX0KLQotLyogYWRkZWQgZm9yIHRleHQgcmVwcmVzZW50aW5nIGRpc2FibGVkIGZ1bmN0aW9ucy4gKi8KLS5jb250ZW50ZGlzYWJsZWQgewotCWNvbG9yOiAjY2NjY2NjOwotfQotCi0vKiBmb250IGZvciBib2xkIHRleHQgKi8KLS5jb250ZW50ZW1waGFzaXMgewotCWNvbG9yOiAjMDAwMDAwOwotCWZvbnQtd2VpZ2h0IDogNjAwOwotfQotCi0vKiB1c2VkIHRleHQgcmVtaW5kaW5nIHVzZXIgdGhhdCB0aGVyZSBpcyByZXF1aXJlZCBjb250ZW50ICovCi0uY29udGVudHJlcXVpcmVkIHsKLQljb2xvcjogI2I0YjRiNDsKLQlmb250LXdlaWdodDogNTAwOwotfQotCi0uY29weXJpZ2h0IHsgCi0JY29sb3IgOiAjOTk5OTk5OwotCWZvbnQtc2l6ZSA6IDEwcHg7Ci19Ci0KLS8qYmxhY2sgY29weXJpZ2h0Ki8KLS5jb3B5cmlnaHRiIHsgCi1jb2xvciA6ICMwMDAwMDA7Ci0JZm9udC1zaXplIDogMTBweDsKLX0KLQotZGQgeyAKLWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTJweDsJCi1tYXJnaW4tbGVmdDogLTFweDsKLSB9Ci0gCi0uZGlhbGdieHNoYWRvdzIgeyAgCi0JYmFja2dyb3VuZC1jb2xvcjogIzg0ODQ4NDsKLX0KLQotLmRpYWxvZ3VlYm94YmcgewotIAliYWNrZ3JvdW5kLWNvbG9yOiAjZDJkMmQyCi19Ci0KLS8qYmFja2dyb3VuZCBmb3IgbG9naW4gcGFnZXMqLwotLmRpYWxvZ3VlYm94YmcyIHsgIAotCWJhY2tncm91bmQtY29sb3I6ICM5OTk5OTk7Ci19Ci0KLS5kaWFsb2d1ZWJveGJvcmRlciB7IAotCWJhY2tncm91bmQtY29sb3I6ICMzMzMzMzMKLSB9Ci0gCi0uZGlhbG9ndWVib3hoaWdobGlnaHQgewotCWJhY2tncm91bmQtY29sb3I6ICNlZmVmZWY7Ci19Ci0KLS5kaWFsb2d1ZWJveG1lZGl1bSB7IAotCWJhY2tncm91bmQtY29sb3I6ICM4YjhiOGIKLSB9Ci0gCi0uZGlhbG9ndWVib3h0aXRsZSB7CSAgIAotCWZvbnQtc2l6ZTogMTRweDsKLQlmb250LXdlaWdodCA6IGJvbGQ7Ci19Ci0KLS8qdGV4dCBmb3IgZGlzYWJsZWQgYnV0dG9ucyovCi0uZGlzYWJsZXsgCi1jb2xvcjogIzk5OTk5OTsKLWZvbnQtZmFtaWx5OiB2ZXJkYW5hLCBoZWx2ZXRpY2EsIGFyaWFsLCBzYW5zLXNlcmlmOwotZm9udC1zaXplOiAxMXB4OyAgCi0JZm9udC13ZWlnaHQ6IDYwMDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci0gfSAKLQotIGRpdnsgCi1mb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLSB9IAotCi0vKnVzZWQgdG8gYWZmZWN0IHJpZ2h0IG1hcmdpbiovIAotZGl2Lm1hcmdpbnJ0eyAKLQljbGVhcjogcmlnaHQ7Ci0JZmxvYXQ6IHJpZ2h0OwotCXdpZHRoOiA3cHg7Ci0gfSAKLSAKLWRpdi5tYXJnaW5zIHsgCi1mbG9hdDogbGVmdDsKLW1hcmdpbi1sZWZ0OiA3cHg7Ci1tYXJnaW4tdG9wOiAyNXB4OwkKLW1hcmdpbi1yaWdodDogN3B4OwotIH0gICAKLQotLypmb3IgcGFnZXMgd2l0aCBidXR0b24gbmF2aWdhdGlvbiBvbiB0b3AqLyAgCi1kaXYubWFyZ2luczIwIHsgCi1mbG9hdDogbGVmdDsKLW1hcmdpbi1sZWZ0OiA3cHg7Ci1tYXJnaW4tdG9wOiAyMHB4OwkKLW1hcmdpbi1yaWdodDogN3B4OwotIH0gICAKLQotIC8qYWRkcyAxMCBweCBwYWRkaW5nKi8KLSBkaXYucGFkMTB7IAotIHBhZGRpbmc6IDEwcHg7IAotICB9Ci0gIAotLmRpdmlkZXIgewotCWJhY2tncm91bmQtY29sb3I6ICNmNmY5ZjA7Ci19Ci0KLWRseyAgCi1mb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLWZvbnQtc2l6ZTogMTJweDsgICAKLQl9Ci0JCi0vKnJlbW92ZXMgZGVmYXVsdCBib3R0b20gbWFyZ2luLCBkb2Vzbid0IHdvcmsgaW4gTlM0Ljd4ICovICAKLSBkbC5kYXRhIHsgCi1tYXJnaW4tYm90dG9tOiAtMXB4OwotIH0gCi0gCi0uZG9jYm9sZCB7Ci0JY29sb3I6ICMwMDAwMDA7Ci0JZm9udC1mYW1pbHk6IHZlcmRhbmEsIGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxMXB4OyAgICAgICAKLQlmb250LXdlaWdodCA6IDYwMDsKLX0KLQotLypmb3IgYXBwbGV0IGRvd25sb2FkIHNwbGFzaCBwYWdlKi8KLS5kb3dubG9hZHsgCi1iYWNrZ3JvdW5kLWNvbG9yOiAjZWZlZWVlOwotIH0KLSAKLS5lcnJvcm1zZyB7Ci0JY29sb3IgOiAjY2MwMDAwOwkKLX0gIAotCi0vKgotY29sb3JlZCBmb250Ci1kZXNjcmlwdGlvbiBhYm91dCB0aGUgdXNlciBzdGF0dXMuIGVxLiAic3Vic2NyaXB0aW9ucyBhcmUgdXBkYXRlZCIKLWl0J3MgdXN1YWxseSBvbiB0aGUgdXBwZXIgcGFydCBvZiB0aGUgcGFnZXMKLSovCi0uZm9vdGVyYm9sZCB7Ci0JY29sb3IgOiAjYTRhNGE0OwotCWZvbnQtc2l6ZTogOTAlOwotCWZvbnQtd2VpZ2h0OiA2MDA7Ci19Ci0KLS8qdGhlICogc3ltYm9sIGluZGljYXRlIHRoZSByZXF1aXJlZCBmaWVsZCAqLwotLmZvb3RlcmJvbGRjb2xvcmVkIHsKLQljb2xvciA6ICNmZjY1MDA7Ci0JZm9udC1zaXplOiA5MCU7Ci0JZm9udC13ZWlnaHQ6IDYwMDsKLX0KLQotLmZvb3RpbmRpY2F0b3IgewotCWNvbG9yOiAjOTk5OTk5OwotCWZvbnQtZmFtaWx5OiB2ZXJkYW5hLCBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTFweDsgICAgICAgCi0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi0vKnRoZSAqIHN5bWJvbCBpbmRpY2F0ZSB0aGUgcmVxdWlyZWQgZmllbGQgKi8KLS5mb290c3RhcmluZGV4IHsKLQljb2xvciA6ICNjYzAwMDA7Ci0JZm9udC1mYW1pbHk6IHZlcmRhbmEsIGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiA4cHQ7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci19Ci0KLS5mb3JtbGFiZWwgewotCWNvbG9yOiAjMDAwMDAwOwotCWZvbnQtc2l6ZTogMTFweDsKLQlmb250LXdlaWdodCA6IDYwMDsKLQl0ZXh0LWRlY29yYXRpb24gOiBub25lOwotfQotCi0uZm9ybXRibGhlYWQgewotICAgYmFja2dyb3VuZC1jb2xvcjogI2NjY2NjYzsKLQljb2xvcjogIzAwMDAwMDsKLQlmb250LXNpemU6IDExcHg7Ci0JZm9udC13ZWlnaHQgOiA2MDA7Ci19Ci0KLS5ncmV5bWVkaXVtIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjZGVkZWRlOwotfQotCi0uZ3JheWZvbGQgewotCWNvbG9yOiAjY2NjY2NjOwkKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci0JZm9udC1zaXplOiAxNXB4OwotfQotCi0vKk5vdGU6IHJlbW92ZSB0aGlzIG5vdGUgaWYgdXNpbmcgdGhpcyBzdHlsZSBvciB3aWxsIGJlIGRlbGV0ZWQqLwotCS8qIEN1cnJlbnRseSB1c2VkIGluIGNxX2RlZmxlY3RfbG9naW5fZXJyLmh0bWwgLSBzaG91bGQgYmUgcmVuYW1lZCB0byBzb21ldGhpbmcgdGhhdCBoYXMgbGVzcyBkZXNjcmlwdGl2ZSBuYW1lICovCi0uaGVhZGVyYmx1ZSB7Ci0JY29sb3I6ICMwMDY2OTk7CQotCWZvbnQtd2VpZ2h0IDogNjAwOwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotLyp1c2VkIGluIGNjIGZvciBmcmFtZXNldCBkaXNwbGF5Ki8gCi0uaGVhZGVyaW5mcmFtZXMgeyAgCi0JY29sb3I6ICMzMzMzMzM7Ci0JZm9udC1zaXplOiA5MCU7Ci0JZm9udC13ZWlnaHQ6IDYwMDsKLQltYXJnaW4tYm90dG9tOiAycHg7Ci0JbWFyZ2luLXRvcDogMHB4OwotfQotCi0KLSAvKmZvbnQgZm9yIHBhZ2UgaGVhZGVyIGV4Y2VwdCBmb3IgYXJ0aWNsZSBwYWdlcywgKHNlZSBoZWFkZXJfb2ZfYXJ0aWNsZSkqLwotLmhlYWRlcmxhcmdlIHsKLQljb2xvcjogIzMzMzMzMzsKLQlmb250LXNpemU6IDE2MCU7Ci0JZm9udC13ZWlnaHQgOiA0MDA7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi0vKm1haW4gaGVhZGVyIGZvciBmcmFtZSBuYXZpZ2F0aW9uLCBpZSwgY2xlYXJjYXNlIG1lcmdlIGZpbGVzKi8KLS5oZWFkZXJtYWluIHsgIAotCWNvbG9yOiAjMzMzMzMzOwotCWZvbnQtc2l6ZTogMTdweDsJCi0JZm9udC13ZWlnaHQ6IDYwMDsKLX0KLQotLyogaGVhZGVyIGVsZW1lbnQgZm9yIGZvcm0gdGFibGVzIGNvbnRhaW5pbmcgbWlkLXNpemUgZml4ZWQgaGVpZ2h0IHRleHQgKi8KLS5oZWFkZXJtZWRsaXN0IHsKLQlmb250LXNpemU6IDExcHg7Ci19Ci0KLS8qZm9ybnQgZm9yIHN0ZXBzIHRpdGxlIGluIGZvcm1zKi8KLS5oZWFkZXJvZnN0ZXBzIHsgCi0JY29sb3I6ICM2NjY2NjY7Ci0JZm9udC1zaXplOiAxN3B4OwotCWZvbnQtd2VpZ2h0OiBib2xkOwotfQotCi0uaGVhZGVyb2ZzdGVwc25vbiB7IAotCWNvbG9yOiAjNjY2NjY2OwotCWZvbnQtc2l6ZTogMTZweDsKLQlmb250LXdlaWdodDogYm9sZDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLS8qdXNlIGhlYWRlcjEgaW5zdGVhZCovCi0uaDEgeyAgCi0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAyMnB4OwkKLQlmb250LXdlaWdodDogODAwOwotfQotCi0vKnRvIHJlcGxhY2UgaDEgYW5kIGNvbnRlbnRoZWFkZXIgbGFyZ2UqLwotLmhlYWRlcjEgeyAgCi0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAyMnB4OwkKLQlmb250LXdlaWdodDogODAwOwotfQotCi0vKmRvY3VtZW50IHJvb3QgZm9sZGVyKi8KLS5oMXJvb3R7ICAKLQljb2xvcjogIzk5OTk5OTsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDIycHg7CQotCWZvbnQtd2VpZ2h0OiA0MDA7Ci19Ci0KLS8qdXNlZCBpbiBjYywgY3EsIHNsKi8gIAotaDEgeyAgCi0JY29sb3I6ICMzMzMzMzM7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxN3B4OwkKLQlmb250LXdlaWdodDogNjAwOwotfQotCi0vKnVzZSBoZWFkZXIyIGluc3RlYWQqLwotLmgyIHsgCi0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxOXB4OwotCWZvbnQtd2VpZ2h0OiA0MDA7CSAJCi19Ci0KLS8qaGVhZGVycyB3aXRoaW4gcGFnZSovCi0uaGVhZGVyMiB7IAotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTlweDsKLQlmb250LXdlaWdodDogNDAwOwkgCQotfQotCi1pIHsKLQlmb250LXN0eWxlIDogaXRhbGljOwotfQotCi0uaWNvbmJvcmRlciB7IAotIGJhY2tncm91bmQtY29sb3I6ICNkZWRlZGU7Ci19Ci0KLS8qZm9udCBzaXplIHNldHVwIHNob3duIGluIHRoZSBpbnB1dCBib3ggd2hpY2ggaXMgaW5oZXJpdGVkIGJ5IGlucHV0WFgqLwotaW5wdXQgewotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwkKLQlmb250LXNpemU6IDExcHg7Ci19IAotCi0vKiAxLGJ1c2luZXNzIHN0YW5kYXJkIG11bHRpbGluZSBpbnB1dCBib3ggCi0yLHRoaXMgc3R5bGUgb25seSBhY3RpdmF0ZSBpbiBJRSAqLwotaW5wdXQubWF4NTAgewotCXdpZHRoOiAzNjBweDsKLX0KLQotaW5wdXQucHgyNSB7Ci0gICAgd2lkdGg6IDI1cHgKLX0KLQotaW5wdXQucHg0NSB7Ci0KLSAgICB3aWR0aDogNDVweAotfQotCi0vKgotMSxidXNpbmVzcyBzdGFuZGFyZCBtdWx0aWxpbmUgaW5wdXQgYm94IAotMix0aGlzIHN0eWxlIG9ubHkgYWN0aXZhdGUgaW4gSUUKLSovCi1pbnB1dC5weDg1IHsKLSAgICB3aWR0aDogODVweAotfQotCi1pbnB1dC5pbnB1dDEzNSB7Ci0Jd2lkdGg6IDEzNXB4Ci19Ci0KLWlucHV0LnB4MTM1IHsKLSAgICB3aWR0aDogMTM1cHgKLX0KLQotaW5wdXQucHgxNTUgewotICAgIHdpZHRoOiAxNTVweAotfQotCi1pbnB1dC5weDIzMCB7Ci0gICAgd2lkdGg6IDIzMHB4Ci19Ci0KLWlucHV0LnB4MzA1IHsKLSAgICB3aWR0aDogMzA1cHg7Ci19Ci0KLQotLmxlZnRtZW51IHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjOTk5OTk5OwotfQotCi0ubGVmdG1lbnVidWxsZXQgeyAKLWJhY2tncm91bmQtY29sb3I6ICM5OTk5OTk7Ci0gfQotIAotLmxlZnRtZW51YnVsbGV0YWN0aXZlIHsgCi1iYWNrZ3JvdW5kLWNvbG9yOiAjY2QzMzAxOwotIH0gCi0gCi0ubGVmdG5hdmhlYWQgewotCWNvbG9yOiAjMDAwMDAwOwotCWZvbnQtd2VpZ2h0OiBib2xkOwkKLQlmb250LXNpemU6IDEzcHg7CQotfSAKLQotLmxlZnRuYXZsYWJlbCB7Ci1jb2xvcjogIzAwMDAwMDsKLWZvbnQtd2VpZ2h0IDogNjAwOwotZm9udC1zaXplOiAxMXB4OwotIH0KLQotIC5saWdodGdyYXkgeyAKLWJhY2tncm91bmQtY29sb3I6ICNlNGU0ZTQ7Ci0gfQotCi0ubWVudWJhciB7Ci0gIGNvbG9yOiAjZmZmZmZmOwotICBmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLSAgZm9udC1zaXplOiAxMXB4OwotICBmb250LXdlaWdodDogNDAwOwotICB0ZXh0LWRlY29yYXRpb246IG5vbmUKLX0KLQotCi0ubWVudWJhcjpob3ZlciB7Ci0gIGNvbG9yOiAjZmZmZmZmCi19IAotCi0vKm1lbnViYXIgd2l0aGluIHRvcCBvZiBjb250ZW50IHBhZ2UgICovCi0ubWVudWJhcm1pZHsgCi1mb250LXNpemU6IDExcHg7Ci0gIGZvbnQtd2VpZ2h0OiA2MDA7Ci0gIHRleHQtZGVjb3JhdGlvbjogbm9uZQotIH0KLSAKLS8qCi0xLGJvbGQgZm9udCBmb3IgdGhlIGxhc3QgaXRlbSBvZiB0aGUgYnJlYWRjcnVtYnMKLTIsYm9sZCBmb250IG9mIHRhYmxlIGhlYWRlciB3aXRoIG1lbnViYXJfYmcoYmx1ZSkgYXMgYmFja2dyb3VuZCBjb2xvciAKLTMsYm9sZCB0ZXh0IG9uIGNvbG9yZWQgYmFja2dyb3VuZCBlZy4gTG9nZ2VkIEluCi0qLwotIC5tZW51YmFyZW1waGFzaXMgewotICBjb2xvcjogI2ZmZmZmZjsKLSAgZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0gIGZvbnQtc2l6ZTogMTFweDsKLSAgZm9udC13ZWlnaHQ6IDYwMDsKLSAgdGV4dC1kZWNvcmF0aW9uOiBub25lCi19Ci0KLS5tZW51YmFyOmhvdmVyIHsKLSAgY29sb3I6ICNmZmZmZmYKLX0gCi0KLS5taWRiYXJiZyB7IAotCWJhY2tncm91bmQtY29sb3I6ICNmZmZmZmY7Ci0gfQotICAKLS8qdG9wbmF2Ki8gCi0ubWlkYmFybGlnaHQgeyAKLQliYWNrZ3JvdW5kLWNvbG9yOiAjMzM5OWNjOwotIH0KLQotLypkYXJrIGNvbG9yIGJldHdlZW4gdGFicyovCi0ubWlkYmFyZGFyayB7IAotCWJhY2tncm91bmQ6ICMwMDMzNjY7Ci0gfQotIAotLyp0b3BuYXYqLyAKLSAubWlkYmFybWVkIHsgCi0JYmFja2dyb3VuZC1jb2xvcjogIzAwNjY5OTsKLSB9Ci0gCi0gLypiYWNrZ3JvdW5kICBvZiAgdGFicyovCi0ubWlkYmFybWVkaXVtIHsgCi0JYmFja2dyb3VuZDogIzAwNjY5OTsKLSB9Ci0gCi0gLm1pZGJhcnNoYWRvdyB7IAotCWJhY2tncm91bmQtY29sb3I6ICM2NjY2NjY7Ci0gfQotIAotLypyZXBsYWNpbmcgc2lkZW1lbnVfYm9sZGxlZnQgbW92aW5nIGZvcndhcmQqLwotLm5hdmxlZnRib2xkIHsKLQljb2xvcjogIzAwMDAwMDsKLQlmb250LXNpemU6IDExcHg7Ci0JZm9udC13ZWlnaHQgOiA2MDA7Ci0JdGV4dC1kZWNvcmF0aW9uIDogbm9uZTsKLX0KLQotLypsZWZ0IG5hdiBzdWJtZW51Ki8KLS5uYXZsZWZ0c3ViCi17Ci0JY29sb3I6ICM2NzY3Njc7Ci0JZm9udC1zaXplOiAxMXB4OwotCWZvbnQtd2VpZ2h0IDogNDAwOwotCWxpbmUtaGVpZ2h0IDogMTM1JTsKLQl0ZXh0LWRlY29yYXRpb24gOiBub25lOwotfQotICAKLS8qIGJlY2F1c2Ugb2YgYW4gaW50ZXJ2ZW5pbmcgbGluayB0YWcsIHRleHQgb3B0aW9ucyB3ZXJlIGF0dGFjaGVkIHRvIHRoaXMgZWxlbWVudCBpbnN0ZWFkIG9mIHRoZSBvdXRlcm1vc3QgY2VsbCAqLwotLm5vbmFjdGl2ZXRhYiB7Ci0JY29sb3I6ICNiNGI0YjQ7Ci0JZm9udC1zaXplOiAxMnB4OwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotLypub3Rlcy8gZGVzY3JpcHRpb24gb2YgaWNvbiAqLwotLm5vdGVzeyAgCi0gZm9udC1zaXplOiAxMXB4OwotIGZvbnQtd2VpZ2h0IDogNDAwOwkKLX0KLQotcCB7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxMnB4OwkKLX0KLQotLnBhZ2Vib2xkIHsgCi0JY29sb3I6ICMwMDAwMDA7Ci0JZm9udC13ZWlnaHQgOiA2MDA7CQotIH0KLSAKLSAvKmZvbnQgZm9yIHRoZSBudW1iZXJzIGluIHBhZ2luYXRpb24gbGlicmFyeSovCi0gLnBhZ2VudW1iZXIgewotCWNvbG9yOiAjNjc2NzY3OwotCWZvbnQtd2VpZ2h0IDogNDAwOwotfQotCi0gLypmb250IGZvciBwcmV2aW91cyAmIG5leHQgaW4gcGFnaW5hdGlvbiovCi0ucGFnZXN0ZXBzIHsgCi0JY29sb3I6ICM2NzY3Njc7CQotCWZvbnQtc2l6ZTogMTFweDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci0gfQotCi0ucG9wIHsKLQlmb250LXNpemUgOiAxMnB4OwotCWZvbnQtd2VpZ2h0IDogMjAwOwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotLnBvcGJhY2tncm91bmQgewotCWJhY2tncm91bmQ6ICNkNmQzY2U7Ci19Ci0KLS5wb3BoMSB7Ci0JZm9udC1zaXplOiAxNnB4OwotCWZvbnQtd2VpZ2h0IDogYm9sZDsKLX0KLQotLnBvcGxlZnRtZW51IHsKLQliYWNrZ3JvdW5kOiAjZjBmMGYwOwotCWJvcmRlcjogdGhpbiBzb2xpZCBjY2NjY2M7IAotCWxlZnQ6IDIxMHB4OyAKLQlwYWRkaW5nOiAycHg7Ci0JcG9zaXRpb246YWJzb2x1dGU7IAotCXRvcDogMjVweDsKLQl2aXNpYmlsaXR5OiBoaWRkZW47IAotCXdpZHRoOjc1cHg7Ci0Jei1pbmRleDoxMDsKLSB9Ci0KLSAvKiB1c2UgcG9wbGVmdG1lbnUgaW5zdGVhZCBvZiB0aGlzIG9uZSovCi0gLnBvcHVwYm9yZGVyIHsJCi0JYmFja2dyb3VuZDogI2YwZjBmMDsKLQlib3JkZXIgOiB0aGluIHNvbGlkIGNjY2NjYzsKLQlwYWRkaW5nIDogMnB4OwotfQotCi0ucG9wdXB0ZXh0IHsJCi0gICBjb2xvcjogIzMzMzMzMzsKLQlmb250LXNpemU6IDExcHg7CQotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotIAotLnByb2plY3RhdHQgeyAKLQlmb250LWZhbWlseTogdmVyZGFuYSwgYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDEycHg7IAotCWZvbnQtd2VpZ2h0OiA2MDA7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOyAKLQljb2xvcjogI2NkMzMwMTsKLX0KLQotLypkYXRlIGFzc29jaWF0ZWQgd2l0aCBhcnRpY2xlIHJhdGluZ3MqLwotLnJhdGluZ3NkYXRlCi17Ci0JY29sb3I6ICMzMzY2OTk7Ci0JZm9udC1zaXplIDogMTFweDsKLQl0ZXh0LWRlY29yYXRpb24gOiBub25lOwotCXRleHQtYWxpZ246IHJpZ2h0OwotfQotCi1zZWxlY3QgewotICAgIGZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwkKLQlmb250LXNpemU6IDExcHg7Ci19Ci0KLXNlbGVjdC5zZWxweDE0NCB7Ci0gICAgd2lkdGg6IDE0NHB4OwotfQotCi0vKiAuc2lkZW1lbnVfYm9sZGxlZnQgcmVwbGFjZSB3aXRoIC5sZWZ0bWVudWJvbGQqLyAKLQotLyogLnNpZGVtZW51X2JvbGRsZWZ0X3NlbGVjdGVkIHJlcGxhY2Ugd2l0aCAubGVmdG1lbnVhY3RpdmUqLwotIAotLyogLnNpZGVtZW51X2J1bGxldF9jb2xvcmVkIHJlcGxhY2Ugd2l0aCAubGVmdG1lbnVidWxsZXRhY3RpdmUqLwotIAotLyouc2lkZW1lbnVfYnVsbGV0X2dyZXkgcmVwbGFjZSB3aXRoIGxlZnRtZW51YnVsbGV0Ki8KLSAKLS5zaWRlbWVudWJvbGRsZWZ0IHsKLQljb2xvcjogIzAwMDAwMDsJCi0JZm9udC1zaXplOiAxMXB4OwotCWZvbnQtd2VpZ2h0IDogNjAwOwotCXRleHQtZGVjb3JhdGlvbiA6IG5vbmU7Ci19IAotCi0uc2lkZW1lbnVib2xkbGVmdHNlbGVjdGVkIHsKLQljb2xvcjogI2NjMDAwMDsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDExcHg7Ci0JZm9udC13ZWlnaHQgOiA2MDA7Ci0JdGV4dC1kZWNvcmF0aW9uIDogbm9uZTsKLX0KLQotLnNpZGVtZW51c3RhbmRhcmQgewotCWNvbG9yOiAjNjc2NzY3OwotCWZvbnQtc2l6ZTogMTFweDsKLQlmb250LXdlaWdodCA6IDQwMDsKLQlsaW5lLWhlaWdodCA6IDEzNSU7Ci0JdGV4dC1kZWNvcmF0aW9uIDogbm9uZTsKLX0KLQotLnNpZGVtZW51c3RhbmRhcmRzZWxlY3RlZCB7Ci0JY29sb3I6ICNjYzAwMDA7Ci0JZm9udC1zaXplOiAxMXB4OwotCWZvbnQtd2VpZ2h0IDogNDAwOwotCWxpbmUtaGVpZ2h0IDogMTM1JTsKLQl0ZXh0LWRlY29yYXRpb24gOiBub25lOwotfQotCi0uc21hbGx0ZXh0IHsKLQlmb250LXNpemU6IDEwcHg7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotCWNvbG9yOiAjMDAwMDAwOwotfQotCi0udGFibGVoZWFkZXIgeyAgCi0JY29sb3I6ICMwMDAwMDA7CQotCWZvbnQtc2l6ZTogMTNweDsJCi0gICAgZm9udC13ZWlnaHQ6IGJvbGQKLX0KLQotLyogZm9udCBmb3IgcmVndWxhciBjb250ZW50IHRleHQgKi8KLS8qIGZvbnQgZm9yIHJlZ3VsYXIgY29udGVudCB0ZXh0ICovCi10ZCB7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxMnB4OwkKLX0JCi0KLS8qIGJlY2F1c2Ugb2YgYW4gaW50ZXJ2ZW5pbmcgbGluayB0YWcsIHRleHQgb3B0aW9ucyB3ZXJlIGF0dGFjaGVkIHRvIGEgc2ltaWxhciBlbGVtZW50IGZvciBsaW5rcyAqLwotdGQuYWN0aXZldGFiIHsgCi0gCWJhY2tncm91bmQtY29sb3I6ICNjNGM0YzQ7Ci19Ci0KLS8qIGJlY2F1c2Ugb2YgYW4gaW50ZXJ2ZW5pbmcgbGluayB0YWcsIHRleHQgb3B0aW9ucyB3ZXJlIGF0dGFjaGVkIHRvIGEgc2ltaWxhciBlbGVtZW50IGZvciBsaW5rcyAqLwotdGQuYWN0aXZldGFic2VsZWN0ZWQgeyAKLSAJYmFja2dyb3VuZC1jb2xvcjogI2RkZGRkZDsKLSAgfQotCi0vKiB0aGVzZSBidXR0b24gc3R5bGVzIGFyZSBmb3IgdGhlIHRleHR1YWwgYnV0dG9ucyBpbnRlbmRlZCB0byByZXBsYWNlIGltYWdlIGNvbnN0cnVjdHMgZm9yIGludGVybmF0aW9uYWxpemF0aW9uICovIAotdGQuYnV0dG9uYm9keSB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI2Q0ZDRkNDsKLX0KLQotdGQuYnV0dG9uaGlnaGxpZ2h0IHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjZmZmZmZmOwotfQotCi10ZC5idXR0b25zaGFkb3cgewotCWJhY2tncm91bmQtY29sb3I6ICM2ZDZkNmQ7Ci19Ci0gIAotLyogZGVzaWduIGVsZW1lbnQgcmFyZWx5IHVzZWQgZm9yIGxpbmUgY29sb3VyIGluIGNlcnRhaW4gZGVjb3JhdGl2ZSB0YWJsZXMgKi8KLXRkLmRlc2lnbjEgewotCWJhY2tncm91bmQtY29sb3I6ICNkNGQ0ZDQ7Ci19Ci0KLS8qZGVzaWduIGVsZW1lbnQgc2ltdWxhdGluZyBhIGRpbWVuc2lvbmFsIGJvdW5kYXJ5IHRvIGEgdGFibGUgKi8KLXRkLmRpdmlkZXJkaW1lbnMgewotCWJhY2tncm91bmQtY29sb3I6ICNiZGJkYmQ7Ci19Ci0KLSAvKiBiZWNhdXNlIG9mIGFuIGludGVydmVuaW5nIGxpbmsgdGFnLCB0ZXh0IG9wdGlvbnMgd2VyZSBhdHRhY2hlZCB0byBhIHNpbWlsYXIgZWxlbWVudCBmb3IgbGlua3MgKi8KLSB0ZC5ub25hY3RpdmV0YWIgewotCWJhY2tncm91bmQtY29sb3I6ICNlZmVmZWY7Ci19Ci0KLS8qIGRhdGEgd2l0aGluIGEgdGFibGUgaGlnaGxpZ2h0ZWQgaW4gZ3JheSovCi10ZC50YmxoaWdobHQgeyAKLSAgIGJhY2tncm91bmQtY29sb3I6ICNkZWRlZGU7Ci0gICBwYWRkaW5nOiAycHg7Ci0gfQotIAotIHRkLnRibGhpZ2hsdDEgeyAKLSAgIGJhY2tncm91bmQtY29sb3I6ICNkZWRlZGU7Ci0gfQotIAotLyogZGF0YSB3aXRoaW4gYSB0YWJsZSBoaWdobGlnaHRlZCBpbiBsaWdodCBncmF5Ki8KLXRkLnRibGhpZ2hsdDIgeyAKLSAgIGJhY2tncm91bmQtY29sb3I6ICNlZmVmZWY7Ci0gfSAKLQotLypkYXJrIGdyZXkgY2VsbCBiYWNrZ3JvdW5kIGFuZCBib2xkIHRleHQgKi8KLS50ZGRhcmtib2xkIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjY2NjY2NjOwotCWZvbnQtd2VpZ2h0IDogNjAwOwotfQotCi0udGRsaWdodCB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI2VmZWZlZjsKLQlwYWRkaW5nOiAycHg7Ci19Ci0KLS50ZGxpZ2h0MSB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI2VmZWZlZjsKLX0KLQotdGV4dGFyZWEgewotICAgIGZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwkKLQlmb250LXNpemU6IDExcHg7Ci19Ci0KLXRleHRhcmVhLnB4MzgwewotIHdpZHRoOiAzODBweDsgCi0gfQotCi0udGV4dGVycm9ybXNnIHsKLQljb2xvciA6IGNjMDAwMDsKLQlmb250LWZhbWlseTogdmVyZGFuYSwgYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDExMCU7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci19Ci0KLS50ZXh0Z3JheSB7ICAKLQljb2xvcjogIzk5OTk5OTsJCi19Ci0KLS50b3BiYXJkaXZpZGVyIHsgCi0JYmFja2dyb3VuZDogIzMzOTljYyAKLX0KLQotLnRvcGJhcmRpdmlkZXJncmV5ZWQgeyAKLQliYWNrZ3JvdW5kOiAjYWRkNmViCi19ICAKLQotLnRvcGJhcnNlcGFyYXRvciB7Ci0gIGNvbG9yOiAjY2MzMzAwOyAgCi0gIGZvbnQtc2l6ZTogMTFweDsKLSAgdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi0udG9wZnJhbWViZyB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI2QyZDJkMjsKLX0KLQotLnRvcGZyYW1lYmdncmV5ZWQgewotCWJhY2tncm91bmQtY29sb3I6ICNlZGVkZWQ7Ci19Ci0KLS50b3BmcmFtZWhpZ2hsaWdodCB7ICAKLQliYWNrZ3JvdW5kLWNvbG9yOiAjYjZiNWI1OwotfQotCi0udG9wZnJhbWVoaWdobGlnaHRncmV5ZWQgeyAgCi0JYmFja2dyb3VuZC1jb2xvcjogI2UxZTFlMTsKLX0KLQotLnRvcGZyYW1laGlnaGxpZ2h0MiB7IAotCWJhY2tncm91bmQtY29sb3I6ICNlZmVmZWY7Ci19Ci0gCi0udG9wZnJhbWVoaWdobGlnaHQyZ3JleWVkIHsgCi0JYmFja2dyb3VuZC1jb2xvcjogI2Y5ZjlmOTsKLX0gCi0KLS50b3BmcmFtZWxvZ29iZyB7ICAKLQliYWNrZ3JvdW5kLWNvbG9yOiAjMDA2Njk5OwotfQotCi0udG9wZnJhbWVsb2dvYmdncmV5ZWQgeyAgCi0JYmFja2dyb3VuZC1jb2xvcjogIzk5YzJkNjsKLX0KLQotLnRvcGZyYW1lc2hhZG93IHsgIAotCWJhY2tncm91bmQtY29sb3I6ICM4NDg0ODQ7Ci19Ci0KLS50b3BmcmFtZXNoYWRvd2dyZXllZCB7ICAKLQliYWNrZ3JvdW5kLWNvbG9yOiAjY2VjZWNlOwotfQotCi0udG9wbGVmdG5hdiB7CQotICAgIGZvbnQtZmFtaWx5OiBWZXJkYW5hLCBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTBweDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci0JY29sb3I6ICMwMDAwMDA7Ci19Ci0KLS50b3BsZWZ0bmF2Ym9sZCB7IAotCWZvbnQtZmFtaWx5OiB2ZXJkYW5hLCBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTBweDsgCi0JZm9udC13ZWlnaHQ6IDYwMDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7IAotfQotCi0udG9wbGVmdG5hdmJvbGRncmV5ZWQgeyAKLQljb2xvcjogIzk5OTk5OTsKLQlmb250LWZhbWlseTogdmVyZGFuYSwgYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsgCi0JZm9udC1zaXplOiAxMHB4OyAKLQlmb250LXdlaWdodDogYm9sZDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7IAotfQotCi0udG9wbGVmdG5hdmdyZXllZCB7CQotCWNvbG9yOiAjOTk5OTk5OwotCWZvbnQtZmFtaWx5OiB2ZXJkYW5hLCBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTBweDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLS50b3BsaW5lY29sb3IgeyAKLQliYWNrZ3JvdW5kLWNvbG9yOiAjMDA2Njk5OwotIH0KLQotLnRvcHJpZ2h0bmF2IHsKLQljb2xvcjogI2ZmZmZmZjsKLQlmb250LWZhbWlseTogdmVyZGFuYSwgYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDEwcHg7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi0udG9wcmlnaHRuYXZncmV5IAotewotCWNvbG9yOiAjMDAwMDAwOwotCWZvbnQtZmFtaWx5OiB2ZXJkYW5hLCBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTBweDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLS8qIHRoaXMgd2FzIGluaXRpYWxseSBkZWNsYXJlZCB0aGUgc2FtZSBjb2xvdXIgYXMgdGhlIGNsYXNzIHRvcGZyYW1lIGJnIGJ1dCBiZWNhdXNlIGl0IGxpZXMgaW4gYSBkaWZmZXJlbnQgZnVuY3Rpb25hbCBhcmVhLCBoYXMgYmVlbiByZWNyZWF0ZWQgaGVyZSAgKi8KLXRyLmJnbWlkZnJhbWUgewotCWJhY2tncm91bmQtY29sb3I6ICNkMmQyZDI7Ci19Ci0KLXRkLnNpZGVtZW51X2J1bGxldF9ncmV5IHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjOTk5OTk5OwotfQotCi0KLXRkLnNpZGVtZW51X2J1bGxldF9jb2xvcmVkIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjY2QzMzAxOwotfQotCi0vKmxpc3Qtc3R5bGUtaW1hZ2U6IHVybChpbWFnZXMvZG93bmJ1dHRvbi5naWYpOyovCi11bCB7Ci0JbGlzdC1zdHlsZS10eXBlOiBzcXVhcmU7Ci19Ci0KLS52b2IKLXsKLQlmb250LXNpemU6IDE1MCU7Ci0JY29sb3I6ICMwMDY2OTk7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotCWZvbnQtd2VpZ2h0OiA0MDA7Ci19Ci0KLS52b2Jib3R0b20KLXsKLQlmb250LXNpemU6IDE0cHg7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9zdHlsZXNoZWV0cy9zdHlsZXNfbmV0c2NhcGU0LmNzcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvc3R5bGVzaGVldHMvc3R5bGVzX25ldHNjYXBlNC5jc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1NzVkNDAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9zdHlsZXNoZWV0cy9zdHlsZXNfbmV0c2NhcGU0LmNzcworKysgL2Rldi9udWxsCkBAIC0xLDExNTMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqLwotCi10ZC5zcGFuLmNvbnRlbnRfYmFzaWMKLSB7Ci0JcGFkZGluZy1sZWZ0IDogNXB4OwotfQotCi1hCi17Ci0JY29sb3I6ICMzMzY2OTk7Ci19Ci0KLQotLmFjY2VudGNvbG9yCi17Ci0JY29sb3IgOiAjY2MzMzAwOwotCWZvbnQtc2l6ZSA6IDEycHg7Ci0JZm9udC13ZWlnaHQgOiA2MDA7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotYS50b3ByaWdodG5hdjphY3RpdmUgewotCWNvbG9yOiAjOTlDQ0NDOwotfQotCi1hLnRvcHJpZ2h0bmF2Z3JleTphY3RpdmUgewotCWNvbG9yOiAjQ0MwMDAwOwotfQotCi1hLnRvcHJpZ2h0bmF2Z3JleTpob3ZlciB7Ci0JY29sb3I6ICNDQzAwMDA7Ci19IAotYS50b3ByaWdodG5hdjpob3ZlciB7Ci0JY29sb3I6ICM5OUNDQ0M7Ci19IGEuYnJlYWRjcnVtYnMKLXsKLQljb2xvcjogI2ZmZmZmZjsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDExcHg7Ci0JZm9udC13ZWlnaHQ6IDQwMDsKLQl0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZQotfQotCi0KLWEuYnJlYWRjcnVtYnM6aG92ZXIKLXsKLSAgY29sb3I6ICNmZmZmZmYKLX0KLQotCi1hLmxpbmtfcmV2ZXJzZTpob3ZlcgotewotICAgIGJhY2tncm91bmQ6ICNkY2RjZGM7Ci19Ci0KLQotYS5saW5rX2NvbnRhaW5lcl9lZGl0b3IKLXsKLQl0ZXh0LWRlY29yYXRpb24gOiBub25lOwotCWZvbnQtc2l6ZSA6IDExcHg7Ci19Ci0KLQotYS5saW5rX2J5bGluZQotewotCWNvbG9yOiAjMzM2Njk5OwotCWZvbnQtc2l6ZSA6IC45ZW07Ci19Ci0KLQotYS5saW5rX2Z1bmNfb3B0aW9uCi17Ci0gIAlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQljb2xvcjogIzMzNjY5OTsKLQlmb250LXNpemU6IDExcHg7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci19Ci0KLQotYS5saW5rdHlwZWQKLXsKLQlmb250LXNpemU6IDExcHg7Ci19Ci0KLWEubWVudWJhcl9saW5rCi17Ci0JY29sb3I6ICNmZmZmZmY7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxMXB4OwotCWZvbnQtd2VpZ2h0OiA0MDA7Ci0JdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmUKLX0KLQotYS5tZW51YmFyX2xpbms6aG92ZXIKLXsKLQljb2xvcjogI2ZmZmZmZjsKLX0KLQotYS5uYXZ0cmVlCi17IAkKLSAgICBjb2xvcjogIzAwMDAwMDsKLQlmb250LXNpemUgOiAxMXB4OwotCWZvbnQtd2VpZ2h0OiA2MDA7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfSAKLQotYS5wcm9qZWN0X25hdgotewotCWNvbG9yOiAjMDA2Njk5OwotCWZvbnQtZmFtaWx5IDogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDExcHg7Ci0JZm9udC13ZWlnaHQgOiA2MDA7Ci0JdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7Ci19Ci1hLnByb2plY3RfbmF2dHJlZQotewotICBjb2xvcjogIzAwMDAwMDsKLSAgZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0gIGZvbnQtc2l6ZTogMTFweDsKLSAgdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotYS50b3BiYXIKLXsKLSAgY29sb3I6ICM2NjY2NjY7Ci0gIGZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotICBmb250LXNpemU6IDExcHg7Ci0gIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotYm9keSAKLXsKLQlmb250LWZhbWlseTogQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDlweDsKLQliYWNrZ3JvdW5kLWNvbG9yIDogV2hpdGU7Ci19Ci0KLQotLmJvcmRlcl9kZWNvcmF0aW9uCi17Ci0JYm9yZGVyIDogdGhpbiBkb3R0ZWQgIzY2NjY2NjsKLX0KLQotCi0uYm90dG9tYmFyX2RhcmsKLXsgCi0JYmFja2dyb3VuZDogIzAwMzM2NjsKLSB9Ci0KLQotLmJvdHRvbWJhcl9saWdodAoteyAKLQliYWNrZ3JvdW5kOiAjMzM5OWNjOwotIH0KLQotCi0gLmJvdHRvbV9tZWRpdW0KLXsgCi0JYmFja2dyb3VuZDogIzAwNjY5OTsKLSB9Ci0KLQotIC5ib3R0b21iYXJfc2hhZG93Ci17IAotCWJhY2tncm91bmQ6ICMwMDAwMDA7Ci0gfQotCi0KLWNvZGUgCi17Ci0JY29sb3I6ICM2NzY3Njc7CQotfQotCi0uY29kZTIKLXsKLSAgIAltYXJnaW4tbGVmdCA6IDE1cHg7Ci0JbWFyZ2luLXJpZ2h0IDogMTVweDsKLX0KLQotLmNvcHlyaWdodAoteyAKLQljb2xvciA6ICM5OTk5OTk7Ci0JZm9udC1mYW1pbHkgOiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZSA6IDYwJTsKLSB9Ci0KLQotLmNvbnRlbnRfYmFzaWMKLXsKLQljb2xvcjogIzMzMzMzMzsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDEycHg7Ci0JZm9udC13ZWlnaHQgOiA0MDA7Ci0JdGV4dC1kZWNvcmF0aW9uIDogbm9uZTsKLX0KLQotCi0uY29udGVudF9iYXNpY19lbXBoYXNpcwotewotCWNvbG9yOiAjMzMzMzMzOwotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTFweDsKLQlmb250LXdlaWdodCA6IDYwMDsKLQlsaW5lLWhlaWdodCA6IDEzNSU7Ci0JdGV4dC1kZWNvcmF0aW9uIDogbm9uZTsKLX0KLQotCi0uY29udGVudF9jb2xvcmVkCi17Ci0JY29sb3I6ICMzMzY2OTk7Ci0JZm9udC1mYW1pbHkgOiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZSA6IDEycHg7Ci19Ci0KLQotLmNvbnRlbnRfY29udGFpbmVyCi0gewotCW1hcmdpbi1ib3R0b20gOiAxNXB4OwotfQotCi0gLmNvbnRlbnRfZGlhZ3JhbQotIHsKLQljb2xvcjogIzY3Njc2NzsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6NjAlOwotCWZvbnQtc3R5bGUgOiBpdGFsaWM7Ci0JCi19Ci0KLS5jb250ZW50X2dyZXlfbWlkCi17Ci0JY29sb3I6ICM2NzY3Njc7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxMnB4OwotCWZvbnQtd2VpZ2h0IDogNDAwOwotCWxpbmUtaGVpZ2h0IDogMTM1JTsKLQl0ZXh0LWRlY29yYXRpb24gOiBub25lOwotfQotCi0uY29udGVudF9ncmV5X21pZDIKLXsKLQljb2xvcjogIzMzMzMzMzsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDEycHg7Ci0JZm9udC13ZWlnaHQgOiA0MDA7Ci0JdGV4dC1kZWNvcmF0aW9uIDogbm9uZTsKLX0KLQotCi0uY29udGVudF9lbXBoYXNpcwotIHsKLQljb2xvcjogIzAwMDAwMDsKLQlmb250LXdlaWdodCA6IDYwMDsKLQlmb250LXNpemUgOiAxMXB4OwotfQotCi0uY29udGVudF9oZWFkZXIKLXsKLQljb2xvcjogIzAwNjY5OTsKLQlmb250LWZhbWlseSA6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxMTAlOwotCWZvbnQtd2VpZ2h0IDogNjAwOwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotLmNvbnRlbnRfaGVhZGVyX2xhcmdlCi17Ci0JZm9udC1mYW1pbHkgOiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMS4yZW07Ci0JZm9udC13ZWlnaHQgOiA2MDA7Ci0JY29sb3I6ICMzMzMzMzM7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi0KLSAuY29udGVudF9oZWFkZXJfY29sb3JlZAotewotCWNvbG9yOiAjNjc2NzY3OwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotCi0gLmNvbnRlbnRfcmVmZXJlbmNlCi0gewotCWZvbnQtc3R5bGUgOiBpdGFsaWM7Ci19Ci0KLSAuY29udGVudF9yaWdodAotewotCWZsb2F0OiByaWdodDsKLQltYXJnaW4tdG9wIDogNXB4OwotCXdpZHRoOiAxNjY7Ci19Ci0KLSAuY29udGVudF9yaWdodF90YWJsZQotewotCXdpZHRoOiAxMDAlOwotfQotCi0KLSAuY29udGVudF9zbWFsbAotewotCWNvbG9yOiAjMDAwMDAwOwotCWZvbnQtZmFtaWx5IDogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemUgOiAxMXB4OwotCXRleHQtZGVjb3JhdGlvbiA6IG5vbmU7Ci19Ci0KLQotIC5jb250ZW50X3NtYWxsX2NvbG9yZWQKLXsKLQljb2xvciA6ICM5OTk5OTk7Ci0JZm9udC1mYW1pbHkgOiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZSA6IDExcHg7Ci19Ci0KLQotIC5jb250ZW50X3NtYWxsX2NvbG9yZWRfMgotewotCWNvbG9yOiAjMzM2Njk5OwotCWZvbnQtZmFtaWx5IDogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemUgOiAxMXB4OwotCXRleHQtZGVjb3JhdGlvbiA6IG5vbmU7Ci19Ci0KLQotICAuY29udGVudF9zbWFsbF9jb2xvcmVkXzMKLXsKLQljb2xvcjogIzMzNjY5OTsKLQlmb250LWZhbWlseSA6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplIDogMTFweDsKLX0KLQotCi0uY29udGVudF9zbWFsbF9lbXBoYXNpcwotIHsKLSAJZm9udC1zaXplIDogMTFweDsKLQlmb250LXdlaWdodCA6IDYwMDsKLX0KLQotCi0uY29udGVudF9zdWJoZWFkZXIKLXsKLSAgICBmb250LXNpemUgOiAxMnB4OwotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwkKLQlmb250LXdlaWdodDogIGJvbGQ7Ci19Ci0KLQotLmNvbnRlbnRfc3ViaGVhZGVyXzIKLXsgCi0JY29sb3I6ICMwMDAwMDA7Ci0JZm9udC1zaXplOiAxMnB4OwotCWZvbnQtd2VpZ2h0OiA0MDA7Ci0gfQotCi0KLSAuZGlzY3Vzc2lvbl9jb250ZW50Ci17IAotCWNvbG9yOiAwMDAwMDA7Ci0JZm9udC1zaXplOiAxMXB4OwotCW1hcmdpbi1sZWZ0OiA1cHg7Ci0gfQotCi0KLS5kaXNjdXNzaW9uX2NvbnRlbnRfZW1waGFzaXMKLXsKLQljb2xvcjogMDAwMDAwOwotCWZvbnQtc2l6ZTogMTFweDsKLQltYXJnaW4tbGVmdDogNXB4OwotCWZvbnQtd2VpZ2h0IDogNjAwOwotfQotCi0KLSAuZGlzY3Vzc2lvbl9kZXNjcmlwdGlvbgotIHsgCi0JY29sb3I6IDY2NjY2NjsKLQlmb250LXNpemU6IDExcHg7Ci0JbWFyZ2luLWxlZnQ6IDVweDsKLSAgfQotCi0KLS5lZGl0b3Jub3RlIAoteyAgCi0JZm9udC1zdHlsZTogaXRhbGljCi19Ci0KLSAvKnRoZSBmb2xsb3dpbmcgdHdvIGNsYXNzZXMgYXJlIHVzZWQgZXhwcmVzc2x5IGluIHRoZSBrbm93bGVkZ2VfYW5ub3VuY2VtZW50c192aWV3Ki8KLSAKLSAuZmxvYXRjbGVhcgotewotCXBhZGRpbmc6IDVweDsKLQlwYWRkaW5nLWJvdHRvbTogMHB4OwotCXBhZGRpbmctcmlnaHQ6IDAgcHg7Ci0Jd2lkdGg6IDEwMCU7Ci19Ci0KLS5mbG9hdGdyZXkKLXsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjZWZlZmVmOwotCXBhZGRpbmc6IDVweDsKLQl3aWR0aDogNjVweDsKLX0KLQotCi0uZm9vdG5vdGUKLXsgCi0JY29sb3I6ICM2NzY3Njc7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAuOWVtOwotCWZvbnQtd2VpZ2h0IDogNDAwOwotCWxpbmUtaGVpZ2h0IDogMTM1JTsKLQl0ZXh0LWRlY29yYXRpb24gOiBub25lOwotIH0KLS5mb3JtZmllbGRfZGVzYyAKLXsKLWNvbG9yOiAjMzMzMzMzOyAKLWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOyAKLWZvbnQtc2l6ZTogMWVtOyAKLWZvbnQtd2VpZ2h0IDogNDAwOyAKLSBmb250LXN0eWxlOiBpdGFsaWMKLX0KLS5mb3JtZmllbGRfdGl0bGUKLXsKLSAgICBmb250LXNpemUgOiAxMnB4OwotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwkKLQlmb250LXdlaWdodDogIGJvbGQ7Ci19Ci0uZm9vdF9zdGFyaW5kZXgKLXsKLQljb2xvciA6ICNjYzAwMDA7Ci0JZm9udC1mYW1pbHk6IHZlcmRhbmEsIGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiA4cHQ7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci19Ci0KLQotLmZvb3RfZGVzY3JpcHRpb24KLXsKLQljb2xvciA6ICNmZjY1MDA7Ci0JZm9udC1mYW1pbHk6IHZlcmRhbmEsIGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiA4cHQ7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci19Ci0KLQotLmZvb3RfdGV4dAotewotCWNvbG9yOiAjYjRiNGI0OwotCWZvbnQtZmFtaWx5OiB2ZXJkYW5hLCBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogOHB0OwotCWZvbnQtd2VpZ2h0OiBib2xkOwotfQotCi0KLS5mb290X3RpdGxlCi17Ci0JY29sb3IgOiAjZmY2NTAwOwotCWZvbnQtZmFtaWx5OiB2ZXJkYW5hLCBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogOHB0OwotfQotCi0KLS5mbG93Y2hhcnQgCi17ICAKLQlmb250LXNpemU6IDhwdDsgY29sb3I6ICM2NjY2NjYKLX0KLQotCi0uaGVhZGVyX2Rpc2N1c3Npb25fbGluawotIHsKLQljb2xvcjogZmZmZmZmOwotCWZvbnQtc2l6ZTogMTFweDsKLX0KLQotLmhlYWRlcl9kaXNjdXNzaW9uX2xpbmtkawotIHsKLQljb2xvcjogMDAwMDAwOwotCWZvbnQtc2l6ZTogMTFweDsKLX0KLQotCi0uaGVhZGVyX2Rpc2N1c3Npb25fdGl0bGUKLSB7Ci0JY29sb3I6IGZmZmZmZjsKLQlmb250LXNpemU6IDExcHg7Ci0JZm9udC13ZWlnaHQ6IDYwMDsKLQltYXJnaW4tbGVmdCA6IDVweDsKLQltYXJnaW4tcmlnaHQ6IDVweDsKLX0KLQotCi0uaGVhZGVybGlua19vZl9jb250YWluZXIKLXsKLQljb2xvcjogIzY2OTljYzsKLQlmb250LWZhbWlseTogYXJpYWwsdmVyZGFuYSxoZWx2ZXRpY2Esc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDE0cHQ7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci0JdGV4dC1kZWNvcmF0aW9uIDogbm9uZTsKLX0KLQotCi0uaGVhZGVyYgotewotICAgIGNvbG9yOiAjZmY2NjAwOwotICAgIGZvbnQtZmFtaWx5OiBhcmlhbCx2ZXJkYW5hLGhlbHZldGljYSxzYW5zLXNlcmlmOwotICAgIGZvbnQtc2l6ZTogMTJwdDsKLSAgICBmb250LXdlaWdodDogYm9sZDsKLX0KLQotCi0uaGVhZGVyX2NvbG9yZWQKLXsKLQljb2xvcjogI2NjMzMwMDsKLQlmb250LWZhbWlseTogdmVyZGFuYSwgYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDFlbTsKLQlmb250LXdlaWdodDogYm9sZDsKLX0KLQotCi0uaGVhZGVyX29mX2FydGljbGUKLXsKLQljb2xvcjogI2NkMzMwMTsKLQlmb250LWZhbWlseTogdmVyZGFuYSwgYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDE2cHg7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci0JfQotCi0uaGVhZGVyX29mX2FydGljbGVfdGFibGUKLXsKLQljb2xvcjogIzMzNjY5OTsKLQlmb250LWZhbWlseTogQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDEycHg7Ci0JZm9udC1zdHlsZSA6IGl0YWxpYzsKLX0KLQkKLS5oZWFkZXJfb2ZfYXJ0aWNsZTIKLXsKLQljb2xvcjogIzMzMzMzMzsKLQlmb250LWZhbWlseTogQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDE4cHg7Ci0JZm9udC13ZWlnaHQ6IDgwMDsKLX0KLQotLmhlYWRlcl9yaWdodAotewotCWNvbG9yOiAwMDAwMDA7Ci0JZm9udC1mYW1pbHk6IFZlcmRhbmEsIEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxMnB4OwotCWZvbnQtd2VpZ2h0OiA4MDA7Ci19Ci0KLS5zdWJoZWFkMV9vZl9hcnRpY2xlMgotewotCWNvbG9yOiAjMzMzMzMzOwotCWZvbnQtZmFtaWx5OiBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTRweDsKLQlmb250LXdlaWdodDogYm9sZDsKLX0KLQotLnN1YmhlYWQyX29mX2FydGljbGUyCi17Ci0JY29sb3I6ICMzMzY2OTk7Ci0JZm9udC1mYW1pbHk6IEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxNHB4OwotCWZvbnQtd2VpZ2h0OiBib2xkOwotCW1hcmdpbi1ib3R0b206IDVweDsKLX0KLQotLnN1YmhlYWQzX29mX2FydGljbGUyCi0gewotCWZvbnQtd2VpZ2h0IDogNjAwOwotCWNvbG9yOiAjMzMzMzMzOwotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogODAlOwotfQotCi0uaGVhZGVyX29mX3N0ZXBzCi17Ci0JY29sb3I6ICNBNEE0QTQ7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxMnB0OwotCWZvbnQtd2VpZ2h0OiBib2xkOwotfQotCi0KLQotLmhlYWRlcl9vZl9zaXRlbWFwCi17Ci0JY29sb3I6IyA2Njk5Y2M7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxMnB0OwotCWZvbnQtd2VpZ2h0OiBib2xkOwotCXRleHQtZGVjb3JhdGlvbiA6IG5vbmU7Ci19Ci0KLQotLmhlYWRlcl9vZl9zaXRlbWFwOmhvdmVyCi17Ci0JY29sb3I6ICNjYzAwMDA7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxMnB0OwotCWZvbnQtd2VpZ2h0OiBib2xkOwotCXRleHQtZGVjb3JhdGlvbiA6IG5vbmU7Ci19Ci0KLQotLmhlYWRlcl9vZl90YWJsZQotewotCWNvbG9yOiAjZmZmZmZmOwotCWZvbnQtZmFtaWx5OiB2ZXJkYW5hLCBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTRweDsKLQlmb250LXdlaWdodDogNDAwOwotfQotCi0KLS5pbWFnZV9jYXB0aW9uIAoteyAgCi0JZm9udC1zaXplOiA5cHQ7IGNvbG9yOiAjMDAzMzY2Ci19Ci0KLQotLnNpZGViYXIKLXsgIAotCWJhY2tncm91bmQtY29sb3I6ICNmNGY0ZjQ7Ci19Ci0KLWlucHV0Ci17Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7CQotCWZvbnQtc2l6ZTogMTFweDsKLX0KLQotCi1pbnB1dC5pbnB1dDI1Ci17Ci0gICAgd2lkdGg6IDI1cHgKLX0KLQotCi1pbnB1dC5pbnB1dDQ1Ci17IAotICAgIHdpZHRoOiA0NXB4Ci19Ci0KLQotaW5wdXQuaW5wdXQ4NQotewotICAgIHdpZHRoOiA4NXB4Ci19Ci0KLQotaW5wdXQuaW5wdXRtYXg1MAotewotCXdpZHRoOiAzNjBweAotfQotCi0KLWlucHV0LmlucHV0MTM1Ci17Ci0Jd2lkdGg6IDEzNXB4Ci19Ci0KLQotaW5wdXQuaW5wdXQxNTUKLXsKLSAgCSB3aWR0aDogMTU1cHgKLX0KLQotaW5wdXQuaW5wdXQyMzAKLXsKLSAgICB3aWR0aDogMjMwcHg7Ci19Ci0KLQotaW5wdXQuaW5wdXQzMDUKLXsgCi0gICAgd2lkdGg6IDMwNXB4Ci19Ci0KLQotLm1lbnViYXIKLXsKLSAgY29sb3I6ICNmZmZmZmY7Ci0gIGZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotICBmb250LXNpemU6IDExcHg7Ci0gIGZvbnQtd2VpZ2h0OiA0MDA7Ci0gIHRleHQtZGVjb3JhdGlvbjogbm9uZQotfQotCi0KLS5tZW51YmFyOmhvdmVyCi17Ci0gIGNvbG9yOiAjZmZmZmZmCi19Ci0KLQotLm1lbnViYXJfYmcKLXsgICAKLWJhY2tncm91bmQtY29sb3I6IzAwMzM2NjsgCi19Ci0KLQotLm1lbnViYXJfZW1waGFzaXMKLXsgCi0gIGNvbG9yOiAjZmZmZmZmOwotICBmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLSAgZm9udC1zaXplOiAxMXB4OwotICBmb250LXdlaWdodDogNjAwOwotICB0ZXh0LWRlY29yYXRpb246IG5vbmUKLX0KLQotLm1lbnViYXJfZW1waGFzaXNkawoteyAKLSAgY29sb3I6ICMwMDAwMDA7Ci0gIGZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotICBmb250LXNpemU6IDExcHg7Ci0gIGZvbnQtd2VpZ2h0OiA2MDA7Ci0gIHRleHQtZGVjb3JhdGlvbjogbm9uZQotfQotCi0KLS5taWRiYXJfYmcKLXsgCi0JYmFja2dyb3VuZDogI2ZmZmZmZjsKLSB9Ci0KLQotLm1pZGJhcl9kYXJrCi17IAotCWJhY2tncm91bmQ6ICMwMDMzNjY7Ci0gfQotCi0KLS5taWRiYXJfbGlnaHQKLXsgCi0JYmFja2dyb3VuZDogIzMzOTljYzsKLSB9Ci0KLQotIC5taWRiYXJfbWVkaXVtCi17IAotCWJhY2tncm91bmQ6ICMwMDY2OTk7Ci0gfQotCi0KLSAubWlkYmFyX3NoYWRvdwoteyAKLQliYWNrZ3JvdW5kOiAjNjY2NjY2OwotIH0KLQotCi0ucGFnZV9udW1iZXIKLXsKLQljb2xvcjogIzY3Njc2NzsKLQlmb250LXdlaWdodCA6IDQwMDsKLX0KLQotCi0ucGFnZV9zdGVwcwoteyAKLQljb2xvcjogIzY3Njc2NzsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDExcHg7Ci0JZm9udC13ZWlnaHQgOiA0MDA7Ci0JIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKLSB9Ci0ucGFnZWhlYWRlcgotewotICAgIGZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotICAgIGZvbnQtc2l6ZTogMTZwdDsKLSAgICBmb250LXdlaWdodDogYm9sZAotfQotIC5wYWdlaGVhZGVyX2NvbG9yZWQKLXsKLQljb2xvcjogIzk5OTk5OTsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDE2cHQ7Ci0JZm9udC13ZWlnaHQ6IDQwMDsKLX0KLQotLnBvcHVwX3RleHQgOiBhY3RpdmUKLXsKLQljb2xvcjogI2NjMDAwMDsKLX0KLQotLnBvcHVwX3RleHQgOiBob3ZlcgotewotCWNvbG9yOiAjY2MwMDAwOwotfQotCi0ucHJvamVjdF9tZW51X2JvcmRlcjEKLSB7Ci0JYm9yZGVyLXRvcCA6IDFweCBzb2xpZCAjY2NjY2NjOwotCWJvcmRlci1yaWdodCA6IDFweCBzb2xpZCAjY2NjY2NjOwotCWJhY2tncm91bmQgOiAjZWZlZmVmOwotfQotLnByb2plY3RfbWVudV90b3Bib3JkZXIKLSB7Ci0JYm9yZGVyLXRvcCA6IDFweCBzb2xpZCAjY2NjY2NjOwkKLQliYWNrZ3JvdW5kIDogI2VmZWZlZjsKLX0KLS5wcm9qZWN0X25hdgotewotCWNvbG9yOiAjMDA2Njk5OwotCWZvbnQtZmFtaWx5IDogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDExcHg7Ci0JZm9udC13ZWlnaHQgOiA2MDA7Ci19Ci1zZWxlY3QKLXsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsJCi0JZm9udC1zaXplOiAxMXB4OwotfQotCi0KLXNlbGVjdC5pbnB1dDI1Ci17IAotICAgIHdpZHRoOiAyNXB4Ci19Ci0KLQotc2VsZWN0LmlucHV0NDUKLXsKLSAgICB3aWR0aDogNDVweAotfQotCi0KLXNlbGVjdC5pbnB1dDg1Ci17Ci0gICAgd2lkdGg6IDg1cHgKLX0KLQotCi1zZWxlY3QuaW5wdXQxNTUKLXsKLSAgIHdpZHRoOiAxNTVweAotfQotCi0KLXNlbGVjdC5pbnB1dDIzMAotewotICAgIHdpZHRoOiAyMzBweAotfQotCi0KLXNlbGVjdC5pbnB1dDMwNQotewotICAgIHdpZHRoOiAzMDVweDsKLX0KLQotLyogQWxsIHNoaW0gY2xhc3NlcyBhcmUgZm9yIHNwYWNpbmcgZWxlbWVudHMgdXNlZCB0byBjb250cm9sIGxheW91dCwgZXNwZWNpYWxseSBpbiBvbGRlciBicm93c2VycyB0aGF0IGRvbid0IHVuZGVyc3RhbmQgbWFyZ2lucyBhbmQgcGFkZGluZyAqLwotCi0uc2hpbTN4MXB4Ci17Ci0JaGVpZ2h0OiAxcHg7Ci0Jd2lkdGg6IDNweDsKLX0KLQotYS5zaWRlbWVudV9oZWFkZXIKLXsKLSAgICBjb2xvcjogIzY2NjY2NjsKLSAgICBmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLSAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci0gICAgZm9udC13ZWlnaHQ6IGJvbGQ7Ci19Ci0KLQotYS5zaWRlbWVudV9oZWFkZXI6aG92ZXIKLXsKLSAgY29sb3I6ICNjYzAwMDAKLX0KLQotCi0uc2lkZW1lbnVfYm9sZGxlZnQKLXsKLQljb2xvcjogIzAwMDAwMDsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDExcHg7Ci0JZm9udC13ZWlnaHQgOiA2MDA7Ci0JdGV4dC1kZWNvcmF0aW9uIDogbm9uZTsKLX0KLQotCi0uc2lkZW1lbnVfYm9sZGxlZnRfc2VsZWN0ZWQKLXsKLQljb2xvcjogI2NjMDAwMDsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDExcHg7Ci0JZm9udC13ZWlnaHQgOiA2MDA7Ci0JdGV4dC1kZWNvcmF0aW9uIDogbm9uZTsKLX0KLQotCi0uc2lkZW1lbnVfYm9sZHJpZ2h0Ci17Ci0JY29sb3I6ICMwMDAwMDA7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxMXB4OwotCWZvbnQtd2VpZ2h0IDogNjAwOwotCXRleHQtZGVjb3JhdGlvbiA6IG5vbmU7Ci19Ci0KLQotLnNpZGVtZW51X2JvbGRyaWdodDpob3ZlcgotewotCWNvbG9yOiAjY2MwMDAwOwotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTFweDsKLQlmb250LXdlaWdodCA6IDYwMDsKLQl0ZXh0LWRlY29yYXRpb24gOiBub25lOwotfQotCi0KLS5zaWRlbWVudV9zdGFuZGFyZAotewotCWNvbG9yOiAjNjc2NzY3OwotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTFweDsKLQlmb250LXdlaWdodCA6IDQwMDsKLQlsaW5lLWhlaWdodCA6IDEzNSU7Ci0JdGV4dC1kZWNvcmF0aW9uIDogbm9uZTsKLX0KLQotCi0uc2lkZW1lbnVfc3RhbmRhcmRfc2VsZWN0ZWQKLXsKLQljb2xvcjogI2NjMDAwMDsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDExcHg7Ci0JZm9udC13ZWlnaHQgOiA0MDA7Ci0JbGluZS1oZWlnaHQgOiAxMzUlOwotCXRleHQtZGVjb3JhdGlvbiA6IG5vbmU7Ci19Ci0KLXRkCi17Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7CQotCWZvbnQtc2l6ZTogNzAlCi19Ci0KLXRkLnNlYXJjaGJveAotewotCWZvbnQtZmFtaWx5OiBjb3VyaWVyOwotfQotCi0KLSB0ZC5iZ19kaXNjdXNzaW9uXzEKLXsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjZGVkZWRlOwotCQotfQotCi0KLXRkLmJnX2Rpc2N1c3Npb25fMgoteyAKLQliYWNrZ3JvdW5kLWNvbG9yOiAjZWZlZmVmOwotIH0KLSAKLSB0ZC5jb250ZW50X2NlbGwKLSB7Ci0gCi19Ci0KLQotdGQuZGl2aWRlcgotIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjZjZmOWYwOwotfQotCi0KLS5ncmV5X2RhcmsKLXsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjY2NjY2NjOwotfQotCi10ZC5ncmV5X21lZGl1bTIKLSB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI2RlZGVkZTsKLX0KLQotdGQuZ3JleV9saWdodDIKLSB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI2VmZWZlZjsKLX0KLQotLmdyZXlfbGlnaHQKLSB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI2VmZWZlZjsKLX0KLQotLmdyZXlfbWVkaXVtCi0gewotCWJhY2tncm91bmQtY29sb3I6ICNkZWRlZGU7Ci19Ci0KLQotdGQuY2VsbGNvbG9yX2xpZ2h0Ci0gewotCWJhY2tncm91bmQtY29sb3I6ICM5OWNjMDA7Ci19Ci0KLQotCi10ZC5jZWxsY29sb3JfZGFyawotIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjNjM5YzAwOwotfQotCi0KLXRkLmNlbGxjb2xvcl93aGl0ZQotIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjZmZmZmZmOwotfQotCi0KLXRkLnNpZGVtZW51X2J1bGxldF9ncmV5Ci0gewotCWJhY2tncm91bmQtY29sb3I6ICM5OTk5OTk7Ci19Ci0KLQotdGQuc2lkZW1lbnVfYnVsbGV0X2NvbG9yZWQKLSB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI2NkMzMwMTsKLX0KLQotCi10ZXh0YXJlYQotewotCWZvbnQtc2l6ZTogMTFweDsKLQlmb250LWZhbWlseSA6IEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci19Ci0KLQotdGV4dGFyZWEuaW5wdXQ0NQotewotICAgIHdpZHRoOiA0NXB4Ci19Ci0KLQotdGV4dGFyZWEuaW5wdXRtYXg1MAotewotCXdpZHRoOiAzNjBweAotfQotCi0KLXRleHRhcmVhLmlucHV0MTkwCi17Ci0gICAgd2lkdGg6IDE5MHB4Ci19Ci0KLQotdGV4dGFyZWEuaW5wdXQyMzAKLXsKLSAgICB3aWR0aDogMjMwcHgKLX0KLQotCi10ZXh0YXJlYS5pbnB1dDM1MAotewotICAgIHdpZHRoOiAzNTBweAotfQotCi0KLS50b3BiYXJfc2VwYXJhdG9yCi17Ci0gIGNvbG9yOiAjY2MzMzAwOwotICBmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLSAgZm9udC1zaXplOiAxMXB4OwotICB0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLQotLnRvcGxpbmVfY29sb3IKLXsgCi0JYmFja2dyb3VuZDogIzAwNjY5OTsKLSB9Ci0gCi0vKiBib3Jyb3dlZCBzdHlsZXMgZnJvbSBjb21tb24uY3NzIHRvIGJlIHRyaW1tZWQgbGF0ZXIgKi8KLSAKLSAudG9wZnJhbWViZyAKLXsgIGJhY2tncm91bmQtY29sb3I6ICNkMmQyZDIKLX0KLQotLnRvcGZyYW1lYmdsaWdodCAKLXsgIAotYmFja2dyb3VuZC1jb2xvcjogI2I2YjViNQotfQotCi0udG9wZnJhbWViZ2RhcmsgCi17ICAKLWJhY2tncm91bmQtY29sb3I6ICM4NDg0ODQKLX0KLQotLnRvcGZyYW1lYmdsaWdodDIgCi17IAotIGJhY2tncm91bmQtY29sb3I6ICNlZmVmZWYKLSB9Ci0gICAKLSAudG9wZnJhbWVsb2dvYmcgCi17ICAKLWJhY2tncm91bmQtY29sb3I6ICMwMDY2OTkKLX0KLQotLnRvcGxlZnRuYXYKLXsKLQlmb250LWZhbWlseTogVmVyZGFuYSwgQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDEwcHg7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi0udG9wbGVmdG5hdmJvbGQgCi17IAotZm9udC1mYW1pbHk6IFZlcmRhbmEsIEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7IAotZm9udC1zaXplOiAxMHB4OyAKLXRleHQtZGVjb3JhdGlvbjogbm9uZTsgCi1mb250LXdlaWdodDogYm9sZDsKLX0KLQotLnRvcHJpZ2h0bmF2Ci17Ci0JZm9udC1mYW1pbHk6IFZlcmRhbmEsIEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxMHB4OwotCWNvbG9yOiAjZmZmZmZmOwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLS50b3ByaWdodG5hdmdyZXkKLXsKLQlmb250LWZhbWlseTogVmVyZGFuYSwgQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDEwcHg7Ci0JY29sb3I6ICMwMDAwMDA7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi0udmVydGljYWxibHVlCi0geyAKLSBiYWNrZ3JvdW5kOiAjMzM5OWNjIAotIH0KLQotIC53aGl0ZWJnCi17IAotIGJhY2tncm91bmQtY29sb3I6ICNmZmZmZmY7Ci0gfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9zdHlsZXNoZWV0cy9zdHlsZXNfdW5peC5jc3MgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L3N0eWxlc2hlZXRzL3N0eWxlc191bml4LmNzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTEwMDA4MS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L3N0eWxlc2hlZXRzL3N0eWxlc191bml4LmNzcworKysgL2Rldi9udWxsCkBAIC0xLDEyNDQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqLwotCi0vKm11c3QgYWRkIGZvbnQgdHlwZSBpZiBjbGFzcyBpcyBiZWluZyB1c2VkIGFzIGEgbGluayBhcyB3ZWxsIGFzIG5vLWxpbmsqLwotCi1hIHsJCi0JY29sb3I6ICMzMzY2OTk7Ci19Ci0KLWEudG9wcmlnaHRuYXY6YWN0aXZlIHsKLQljb2xvcjogIzk5Q0NDQzsKLX0KLQotYS50b3ByaWdodG5hdmdyZXk6YWN0aXZlIHsKLQljb2xvcjogI0NDMDAwMDsKLX0KLQotCi0vKiBhY3Rpb24gdGV4dCB1c3VhbGx5IGxvY2F0ZWQgb24gdG9wIG9mIHBhZ2U7aWUuLCBzZWxlY3QgYWxsKi8KLWEuYWN0aW9ubGluawoteyAKLWNvbG9yOiAjMzM2Njk5OwotZm9udC1zaXplOiAxMXB4OwotdGV4dC1kZWNvcmF0aW9uIDogbm9uZTsJCi0gfQotIAotIGEuYWN0aW9ubGluazphY3RpdmUgeyAKLSBjb2xvcjogIzMzNjY5OTsKLSBmb250LXdlaWdodDogYm9sZDsKLSAgfQotCi1hLnRvcHJpZ2h0bmF2Z3JleTpob3ZlciB7Ci0JY29sb3I6ICNDQzAwMDA7Ci19IAotYS50b3ByaWdodG5hdjpob3ZlciB7Ci0JY29sb3I6ICM5OUNDQ0M7Ci19IC8qIGZvbnQgZm9yIGFjdGlvbiBvbiBjb250ZW50IHBhZ2UgdXN1YWxseSBsb2NhdGVkIG9uIHRvcCBvZiBwYWdlIDtpZS4sIHNlbGVjdCBhbGwqLwotYS5hY3Rpb24geyAgCi0JY29sb3I6ICMzMzMzMzM7Ci0JZm9udC1zaXplOiAxNnB4OwkKLX0gCi0KLWEuYWN0aW9uc2VsZWN0b3IgewotICAgCi0JY29sb3I6ICMwMDAwMDA7Ci0JZm9udC1zaXplOiAxNnB4OwotfQotCi0gLyogYmVjYXVzZSBvZiBhbiBpbnRlcnZlbmluZyBsaW5rIHRhZywgdGV4dCBvcHRpb25zIHdlcmUgYXR0YWNoZWQgdG8gdGhpcyBlbGVtZW50IGluc3RlYWQgb2YgdGhlIG91dGVybW9zdCBjZWxsICovCi1hLmFjdGl2ZXRhYiB7IAotIAljb2xvcjogIzAwMDAwMDsKLSAJZm9udC1zaXplOiAxOHB4OwotICAJdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi0gLyogYmVjYXVzZSBvZiBhbiBpbnRlcnZlbmluZyBsaW5rIHRhZywgdGV4dCBvcHRpb25zIHdlcmUgYXR0YWNoZWQgdG8gdGhpcyBlbGVtZW50IGluc3RlYWQgb2YgdGhlIG91dGVybW9zdCBjZWxsICovCi1hLmFjdGl2ZXRhYnNlbGVjdGVkIHsgCi0gCWNvbG9yOiAjMmMyYzJjOwotIAlmb250LXNpemU6IDE4cHg7Ci0gIAl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLWEuYmFzaWMgeyAJCi0gICAgY29sb3I6ICMwMDAwMDA7Ci19Ci0KLS8qIGZvciBub24taW1hZ2UgYnV0dG9ucywgZm9yIGludGVybmF0aW9uYWxpemF0aW9uICovCi1hLmJ1dHRvbiB7Ci0JY29sb3I6ICMzMzMzMzM7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi1hLmJ1dHRvbjphY3RpdmUgewotCWNvbG9yOiAzMzMzMzM7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi0vKiBmb3Igbm9uLWltYWdlIGJ1dHRvbnMsIGZvciBpbnRlcm5hdGlvbmFsaXphdGlvbiAqLwotYS5idXR0b246aG92ZXIgewotCWNvbG9yOiAzMzMzMzM7Ci19Ci0KLS8qIGZvciBub24taW1hZ2UgYnV0dG9ucyBpbiBNdWx0aXNpdGUsIGZvciBpbnRlcm5hdGlvbmFsaXphdGlvbiAqLwotYS5idXR0b24yIHsKLQljb2xvcjogIzAwMDAwMDsKLQlmb250LXNpemUgOiAxNnB4OwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsJCi19Ci0KLS8qbWFpbiBjb250YWluZXIgIGFjdGlvbnMvbGlua3MgZm9yIGVkaXRpbmcqLwotYS5jb25saW5rZWRpdCB7Ci0JdGV4dC1kZWNvcmF0aW9uIDogbm9uZTsKLQlmb250LXNpemUgOiAxNnB4OwotfQotCi1hLmNvcHlyaWdodCB7IAkKLQljb2xvcjogIzMzNjY5OTsgICAgCi0JZm9udC1zaXplIDogMTVweDsKLX0gCi0KLWEuZm9ybXRibGhlYWQgewotICAgYmFja2dyb3VuZC1jb2xvcjogI2NjY2NjYzsKLQljb2xvcjogIzAwMDAwMDsKLQlmb250LXNpemU6IDE2cHg7Ci0JZm9udC13ZWlnaHQgOiA2MDA7Ci19Ci0KLS8qIGxpZ2h0IGNvbG91cmVkIGhlYWRpbmcgbGluayBmb3IgZGlzY3Vzc2lvbiBhbmQgc2ltaWxhciB1c2VzIC0gd2FzIGhlYWRlcl9kaXNjdXNzaW9uX2xpbmsgaW4gcHJldmlvdXMgdmVyc2lvbnMgKi8KLSBhLmhlYWRlcmxpbmtsaWdodCB7Ci0JY29sb3I6IAlmZmZmZmY7Ci0JZm9udC1zaXplOiAwLjllbTsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19CQotCi0vKmJvbGQgbGluaywgaWUsIGFkdmFuY2VkIHNlYXJjaCBsaW5rIGluIHBlKi8KLWEubGlua2Z1bmNvcHRpb24geyAgCQotCWZvbnQtc2l6ZTogMTZweDsKLQlmb250LXdlaWdodDogNjAwOwotfQotCi0gYS5uYXZ0cmVlIHsgCQotICAgIGNvbG9yOiAjMDAwMDAwOwotCWZvbnQtc2l6ZSA6IDE2cHg7Ci0JZm9udC13ZWlnaHQ6IDYwMDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19IAotCi0vKm5hdnRyZWUgaXRlbSBvciBkb2MsIG5vZGVzIHRoYXQgZG9uJ3QgZXhwYW5kKi8KLWEubmF2dHJlZWl0ZW0geyAJCi0gICAgY29sb3I6ICMwMDAwMDA7Ci0JZm9udC1zaXplIDogMTZweDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19IAotIAotIC8qIHNpbXBsZSBtZWNoYW5pc20gdG8gdHVybiB0ZXh0IGRlY29yYXRpb24gb2ZmICovICAKLWEubm9saW5lIHsKLSAJdGV4dC1kZWNvcmF0aW9uOiBub25lOwotIH0KLQotYS5wb3B1cHRleHQgewkKLSAgIGNvbG9yOiAjMzMzMzMzOwotCWZvbnQtc2l6ZTogMTZweDsJCi0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi1hLnBvcHRleHQgewotCWNvbG9yOiAjMzMzMzMzOwotCWZvbnQgOiAxNnB4OwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotYS5wb3B1cHRleHQ6IGFjdGl2ZSB7Ci0JY29sb3I6ICNjYzAwMDA7Ci19Ci0KLQotYS5zbWFsbCB7CQotCWZvbnQtc2l6ZTogMTZweDsJCi19Ci0KLWEuc21hbGxiIHsJCi0gICBjb2xvcjogIzAwMDAwMDsKLQlmb250LXNpemU6IDE2cHg7CQotfQotCi1hLnRvcGJhciB7Ci0gIGNvbG9yOiAjNjY2NjY2OwotICBmb250LXNpemU6IDE2cHg7Ci0gIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotLyp1c2VkIGFzIGhpZ2hsaWdodGVkIGRlc2NyaXB0aW9uIGFib3ZlIHRhYmxlcyovCi0uYWNjZW50Y29sb3IgewotCWNvbG9yIDogI2NjMzMwMDsKLQlmb250LXdlaWdodCA6IDYwMDsKLX0KLQotIC8qIGJnY29sb3IgIGZvciBhY3Rpb24gdGV4dCB1c3VhbGx5IGxvY2F0ZWQgb24gdG9wIG9mIHBhZ2U7aWUuLCBzZWxlY3QgYWxsKi8KLS5hY3Rpb25iZyB7IAotCWJhY2tncm91bmQtY29sb3I6ICNlZmVmZWY7Ci19Ci0KLS8qYWN0aW9uYmFyIGFwcGVhcnMgb24gdG9wIGFuZC9vciBib3R0b20gb2YgcGFnZSovCi0uYWN0aW9uc2VsZWN0b3IgewotICAgYmFja2dyb3VuZC1jb2xvcjogI2U5ZTllOTsKLQljb2xvcjogIzAwMDAwMDsKLQlmb250LXNpemU6IDE2cHg7Ci19Ci0KLS8qYWN0aW9uYmFyIG9uIHdoaXRlIGJhY2tncm91bmQqLwotLmFjdGlvbnNlbGVjdDIgeyAgIAotCWNvbG9yOiAjMDAwMDAwOwotCWZvbnQtc2l6ZTogMTZweDsKLX0KLQotLmFjdGlvbnNlbGVjdG9yZGlzIHsKLWJhY2tncm91bmQtY29sb3I6ICNlOWU5ZTk7Ci0JY29sb3I6ICNjY2NjY2M7Ci0JZm9udC1zaXplOiAxNnB4OwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotYiB7IAotICAgZm9udC13ZWlnaHQgOiBib2xkOwotIH0KLSAgCi0uYmFzZWxpbmVpdGFsaWNzIHsKLQljb2xvcjogIzY2NjY2NjsKLQlmb250LXNpemU6IDE2cHg7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi0uYmdibGFjayB7IAotCWJhY2tncm91bmQtY29sb3I6ICMwMDAwMDA7Ci0gfQotIAotIC8qIGJhc2ljIGNvbHVtbiBiYWNrZ3JvdW5kIGNvbG91ciBmb3IgZGlzY3Vzc2lvbnMsIGZpbGVzLCBvdGhlciBzdWNoIHRhYnVsYXRlZCBkYXRhICovCi0uYmdjb2x1bW5iYXNpYyB7IAotCWJhY2tncm91bmQtY29sb3I6ICNlZmVmZWY7Ci0gfQotIAotLmJnd2hpdGUgeyAKLQliYWNrZ3JvdW5kLWNvbG9yOiAjZmZmZmZmOwotIH0gCi0gCi0vKiBzaXplIGlucHV0IGZvciBiYXNpYyB0YWdzIHN1Y2ggYXMgcCBhbmQgbGkgdGhhdCBkbyBub3QgaW5oZXJpdCBmcm9tIHRkICovIAotYm9keSB7Ci0JYmFja2dyb3VuZC1jb2xvciA6ICNmZmZmZmY7ICAgCi0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxOHB4OwotCXRleHQtZGVjb3JhdGlvbiA6IG5vbmU7CQkKLQltYXJnaW4tbGVmdDogMHB4OwotCW1hcmdpbi10b3A6IDBweDsJCi0JbWFyZ2luLXJpZ2h0OiAwcHg7Ci19Ci0KLS5ib2xkIHsgCi0gICBmb250LXdlaWdodCA6IDYwMDsKLSB9Ci0KLS5ib3JkZXJncmF5IHsgCi0JYmFja2dyb3VuZC1jb2xvcjogI2U5ZTllOTsKLSB9Ci0KLS5ib3R0b21iYXJkYXJrIHsgCi0JYmFja2dyb3VuZC1jb2xvcjogIzAwMzM2NjsKLSB9Ci0gIAotLmJvdHRvbWJhcmxpZ2h0IHsgCi0JYmFja2dyb3VuZC1jb2xvcjogIzMzOTljYzsKLSB9Ci0KLS5ib3R0b21iYXJzaGFkb3cgeyAKLQliYWNrZ3JvdW5kLWNvbG9yOiAjMDAwMDAwOwotIH0KLQotLmJyZWFkY3J1bWJzeyAKLWNvbG9yOiAjMzM2Njk5OwotZm9udC13ZWlnaHQ6IDYwMDsKLSB9Ci0KLS5icmVhZGNydW1iczJ7IAotY29sb3I6ICNmZmZmZmY7Ci1mb250LXNpemU6IDE2cHg7Ci0gfSAKLSAKLS8qYWN0aXZlIG5hdmlnYXRpb24gYnV0dG9uLCBub3QgZm9ybSBidXR0b25zKi8gCi0uYnV0dG9ub24gewotICAgIGJhY2tncm91bmQtY29sb3I6ICNkZWRlZGU7Ci0gICAgY29sb3I6ICMwMDAwMDA7Ci0JZm9udC1mYW1pbHk6IFZlcmRhbmEsIEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7CQotCWZvbnQtc2l6ZTogMTVweDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7CQotfQotICAKLS8qbmF2aWdhdGlvbiBidXR0b25zLCBub3QgZm9ybSBidXR0b25zKi8gCi0uYnV0dG9ucyB7Ci0gICAgYmFja2dyb3VuZC1jb2xvcjogI2VmZWZlZjsKLSAgICBjb2xvcjogIzAwMDAwMDsKLQlmb250LWZhbWlseTogVmVyZGFuYSwgQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsJCi0JZm9udC1zaXplOiAxNXB4OwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsJCi19Ci0KLS8qIGRpc2FibGVkIHN0YXRlICovIAotLmJ1dHRvbnR4dCB7Ci0JY29sb3I6ICMzMzMzMzM7Ci0JZm9udC1mYW1pbHk6IHZlcmRhbmEsIGhlbHZldGljYSwgYXJpYWwsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxNXB4OwotCWZvbnQtd2VpZ2h0OiA2MDA7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi0vKiB0aGVzZSBidXR0b24gc3R5bGVzIGFyZSBmb3IgdGhlIHRleHR1YWwgYnV0dG9ucyBpbnRlbmRlZCB0byByZXBsYWNlIGltYWdlIGNvbnN0cnVjdHMgZm9yIGludGVybmF0aW9uYWxpemF0aW9uIC0gdGhpcyBpcyBmb3IgdGhlIGRpc2FibGVkIHN0YXRlICovIAotLmJ1dHRvbnR4dGRzYmwgewotCWNvbG9yOiAjN0U3RTdFOwotCWZvbnQtZmFtaWx5OiB2ZXJkYW5hLCBoZWx2ZXRpY2EsIGFyaWFsLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTVweDsKLQlmb250LXdlaWdodDogNjAwOwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotLmNvZGUgeyAKLSAgIGZvbnQtZmFtaWx5OiBDb3VyaWVyIE5ldywgQ291cmllciwgbW9ubzsgICAKLSAgIGZvbnQtc2l6ZTogMThweDsKLSB9Ci0gCi0gIC8qIGZvbnQgZm9yIHJlZ3VsYXIgY29udGVudCB0ZXh0ICovCi0uY29tbWVudHMgeyAJCi0JZm9udC1zaXplOiAxNnB4OwkKLQliYWNrZ3JvdW5kLWNvbG9yOiAjZWZlZmVmOwotfQotCi0vKm1haW4gY29udGFpbmVyIGhlYWRlciovCi0uY29uaGVhZCB7IAotY29sb3I6ICNjYzMzMDA7Ci1mb250LXdlaWdodDogNjAwOwotdGV4dC1kZWNvcmF0aW9uIDogbm9uZTsKLSB9Ci0gCi0gLyptYWluIGNvbnRhaW5lciBkYXRhIGxhYmVscyovCi0uY29ubGFiZWwgeyAKLWJhY2tncm91bmQtY29sb3I6ICNlZmVmZWY7Ci0gfSAKLSAKLS8qbWFpbiBjb250YWluZXIgZGF0YSBsYWJlbHMgaW4gYm9sZCovCi0uY29ubGFiZWxib2xkIHsgCi1iYWNrZ3JvdW5kLWNvbG9yOiAjZTFlMWUxOwotZm9udC13ZWlnaHQ6IGJvbGQ7Ci0gfSAgCi0gCi0vKnJlcGxhY2luZyBzaWRlbWVudV9ib2xkcmlnaHQgbW92aW5nIGZvcndhcmQqLwotLmNvbnJib2xkIHsKLQljb2xvcjogIzAwMDAwMDsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDE2cHg7Ci0JZm9udC13ZWlnaHQgOiA2MDA7Ci0JdGV4dC1kZWNvcmF0aW9uIDogbm9uZTsKLX0KLQotLypoZWFkZXIgZm9yIHJpZ2h0IGhhbmQgY29udGFpbmVyKi8KLS5jb25yaGVhZCB7Ci0JY29sb3I6IDAwMDAwMDsKLQlmb250LWZhbWlseTogVmVyZGFuYSwgQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDE4cHg7Ci0JZm9udC13ZWlnaHQ6IDgwMDsKLX0KLQotLyptYWluIGNvbnRhaW5lciB0YWJsZSBoZWFkZXIqLwotLmNvbnRibGhlYWQgeyAgCi0gICBiYWNrZ3JvdW5kLWNvbG9yOiAjY2NjY2NjOwotCWNvbG9yOiAjMzMzMzMzOwkKLQlmb250LXNpemU6IDE2cHg7CQotICAgIGZvbnQtd2VpZ2h0OiA2MDA7Ci19Ci0KLS5jb250ZW50eyAKLWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMThweDsJCi0gfQotCi0gLyptZWRpdW0gZ3JleSBjZWxsIGJhY2tncm91bmQqLwotLmNvbnRlbnRib3JkZXIgewotCWJhY2tncm91bmQtY29sb3I6ICNkZWRlZGU7Ci19Ci0KLS8qIGFkZGVkIGZvciB0ZXh0IHJlcHJlc2VudGluZyBkaXNhYmxlZCBmdW5jdGlvbnMuICovCi0uY29udGVudGRpc2FibGVkIHsKLQljb2xvcjogI2NjY2NjYzsKLX0KLQotLyogZm9udCBmb3IgYm9sZCB0ZXh0ICovCi0uY29udGVudGVtcGhhc2lzIHsKLQljb2xvcjogIzAwMDAwMDsKLQlmb250LXdlaWdodCA6IDYwMDsKLX0KLQotLyogdXNlZCB0ZXh0IHJlbWluZGluZyB1c2VyIHRoYXQgdGhlcmUgaXMgcmVxdWlyZWQgY29udGVudCAqLwotLmNvbnRlbnRyZXF1aXJlZCB7Ci0JY29sb3I6ICNiNGI0YjQ7Ci0JZm9udC13ZWlnaHQ6IDUwMDsKLX0KLQotLmNvcHlyaWdodCB7IAotCWNvbG9yIDogIzk5OTk5OTsKLQlmb250LXNpemUgOiAxNXB4OwotfQotCi0vKmJsYWNrIGNvcHlyaWdodCovCi0uY29weXJpZ2h0YiB7IAotY29sb3IgOiAjMDAwMDAwOwotCWZvbnQtc2l6ZSA6IDE1cHg7Ci19Ci0KLWRkIHsgCi1mb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDE4cHg7CQotbWFyZ2luLWxlZnQ6IC0xcHg7Ci0gfQotIAotLmRpYWxnYnhzaGFkb3cyIHsgIAotCWJhY2tncm91bmQtY29sb3I6ICM4NDg0ODQ7Ci19Ci0KLS5kaWFsb2d1ZWJveGJnIHsgIAotCWJhY2tncm91bmQtY29sb3I6ICNkMmQyZDI7Ci19Ci0KLS8qYmFja2dyb3VuZCBmb3IgbG9naW4gcGFnZXMqLwotLmRpYWxvZ3VlYm94YmcyIHsgIAotCWJhY2tncm91bmQtY29sb3I6ICM5OTk5OTk7Ci19Ci0KLS5kaWFsb2d1ZWJveGJvcmRlciB7IAotCWJhY2tncm91bmQtY29sb3I6ICMzMzMzMzM7Ci0gfQotIAotLmRpYWxvZ3VlYm94aGlnaGxpZ2h0IHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjZWZlZmVmOwotfQotCi0gLmRpYWxvZ3VlYm94bWVkaXVtIHsgCi0JYmFja2dyb3VuZC1jb2xvcjogIzhiOGI4YjsKLSB9Ci0gCi0gLmRpYWxvZ3VlYm94dGl0bGUgewkgICAKLQlmb250LXNpemU6IDIxcHg7Ci0JZm9udC13ZWlnaHQgOiBib2xkOwotfQotCi0vKnRleHQgZm9yIGRpc2FibGVkIGJ1dHRvbnMqLwotLmRpc2FibGV7IAotY29sb3I6ICM5OTk5OTk7Ci1mb250LWZhbWlseTogdmVyZGFuYSwgaGVsdmV0aWNhLCBhcmlhbCwgc2Fucy1zZXJpZjsKLWZvbnQtc2l6ZTogMTZweDsgIAotCWZvbnQtd2VpZ2h0OiA2MDA7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotIH0KLSAKLWRpdnsgCi1mb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLSB9IAotIAotLyp1c2VkIHRvIGFmZmVjdCByaWdodCBtYXJnaW4qLyAKLWRpdi5tYXJnaW5ydHsgCi0JY2xlYXI6IHJpZ2h0OwotCWZsb2F0OiByaWdodDsKLQl3aWR0aDogN3B4OwotIH0gIAotIAotZGl2Lm1hcmdpbnMgeyAKLWZsb2F0OiBsZWZ0OwotbWFyZ2luLWxlZnQ6IDdweDsKLW1hcmdpbi10b3A6IDI1cHg7CQotbWFyZ2luLXJpZ2h0OiA3cHg7Ci0gfSAgIAotCi0vKmZvciBwYWdlcyB3aXRoIGJ1dHRvbiBuYXZpZ2F0aW9uIG9uIHRvcCovIAotZGl2Lm1hcmdpbnMyMCB7IAotZmxvYXQ6IGxlZnQ7Ci1tYXJnaW4tbGVmdDogN3B4OwotbWFyZ2luLXRvcDogMjBweDsJCi1tYXJnaW4tcmlnaHQ6IDdweDsKLSB9ICAgIAotIAotIC8qYWRkcyAxMCBweCBwYWRkaW5nKi8KLSBkaXYucGFkMTB7IAotIHBhZGRpbmc6IDEwcHg7IAotICB9Ci0KLS5kaXZpZGVyIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjZjZmOWYwOwotfQotCi1kbHsgIAotZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci1mb250LXNpemU6IDE4cHg7ICAgCi0JfQotCi0vKnJlbW92ZXMgZGVmYXVsdCBib3R0b20gbWFyZ2luLCBkb2Vzbid0IHdvcmsgaW4gTlM0Ljd4ICovIAotZGwuZGF0YSB7IAotbWFyZ2luLWJvdHRvbTogLTFweDsKLSB9ICAKLQotLmRvY2JvbGQgewotCWNvbG9yOiAjMDAwMDAwOwotCWZvbnQtZmFtaWx5OiB2ZXJkYW5hLCBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTZweDsgICAgICAgCi0JZm9udC13ZWlnaHQgOiA2MDA7Ci19Ci0KLS8qZm9yIGFwcGxldCBkb3dubG9hZCBzcGxhc2ggcGFnZSovCi0uZG93bmxvYWR7IAotYmFja2dyb3VuZC1jb2xvcjogI2VmZWVlZTsKLSB9Ci0KLSAuZXJyb3Jtc2cgewotCWNvbG9yIDogI2NjMDAwMDsJCi19IAotCi0vKgotY29sb3JlZCBmb250Ci1kZXNjcmlwdGlvbiBhYm91dCB0aGUgdXNlciBzdGF0dXMuIGVxLiAic3Vic2NyaXB0aW9ucyBhcmUgdXBkYXRlZCIKLWl0J3MgdXN1YWxseSBvbiB0aGUgdXBwZXIgcGFydCBvZiB0aGUgcGFnZXMKLSovCi0uZm9vdGVyYm9sZCB7Ci0JY29sb3IgOiAjYTRhNGE0OwotCWZvbnQtc2l6ZTogOTAlOwotCWZvbnQtd2VpZ2h0OiA2MDA7Ci19Ci0KLS8qdGhlICogc3ltYm9sIGluZGljYXRlIHRoZSByZXF1aXJlZCBmaWVsZCAqLwotLmZvb3RlcmJvbGRjb2xvcmVkIHsKLQljb2xvciA6ICNmZjY1MDA7Ci0JZm9udC1zaXplOiA5MCU7Ci0JZm9udC13ZWlnaHQ6IDYwMDsKLX0KLQotLmZvb3RpbmRpY2F0b3IgewotCWNvbG9yOiAjOTk5OTk5OwotCWZvbnQtZmFtaWx5OiB2ZXJkYW5hLCBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTZweDsgICAgICAgCi0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi0vKnRoZSAqIHN5bWJvbCBpbmRpY2F0ZSB0aGUgcmVxdWlyZWQgZmllbGQgKi8KLS5mb290c3RhcmluZGV4IHsKLQljb2xvciA6ICNjYzAwMDA7Ci0JZm9udC1mYW1pbHk6IHZlcmRhbmEsIGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxMnB0OwotCWZvbnQtd2VpZ2h0OiBib2xkOwotfQotCi0vKm1vdmUgdG8gZGVzaWduX3BlKi8KLS5mb3JtbGFiZWwgewotCWNvbG9yOiAjMDAwMDAwOwotCWZvbnQtc2l6ZTogMTZweDsKLQlmb250LXdlaWdodCA6IDYwMDsKLQl0ZXh0LWRlY29yYXRpb24gOiBub25lOwotfQotCi0uZm9ybXRibGhlYWQgewotICAgYmFja2dyb3VuZC1jb2xvcjogI2NjY2NjYzsKLQljb2xvcjogIzAwMDAwMDsKLQlmb250LXNpemU6IDE2cHg7Ci0JZm9udC13ZWlnaHQgOiA2MDA7Ci19Ci0KLS5ncmV5bWVkaXVtIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjZGVkZWRlOwotfQotCi0uZ3JheWZvbGQgewotCWNvbG9yOiAjY2NjY2NjOwkKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci0JZm9udC1zaXplOiAyMnB4OwotfQotCi0vKk5vdGU6IHJlbW92ZSB0aGlzIG5vdGUgaWYgdXNpbmcgdGhpcyBzdHlsZSBvciB3aWxsIGJlIGRlbGV0ZWQqLwotCS8qIEN1cnJlbnRseSB1c2VkIGluIGNxX2RlZmxlY3RfbG9naW5fZXJyLmh0bWwgLSBzaG91bGQgYmUgcmVuYW1lZCB0byBzb21ldGhpbmcgdGhhdCBoYXMgbGVzcyBkZXNjcmlwdGl2ZSBuYW1lICovCi0uaGVhZGVyYmx1ZSB7Ci0JY29sb3I6ICMwMDY2OTk7CQotCWZvbnQtd2VpZ2h0IDogNjAwOwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotLyp1c2VkIGluIGNjIGZvciBmcmFtZXNldCBkaXNwbGF5Ki8gCi0uaGVhZGVyaW5mcmFtZXMgeyAgCi0JY29sb3I6ICMzMzMzMzM7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxNXB4OwkKLQlmb250LXdlaWdodDogNjAwOwotCW1hcmdpbi1ib3R0b206IDJweDsKLQltYXJnaW4tdG9wOiAwcHg7Ci19Ci0KLSAvKmZvbnQgZm9yIHBhZ2UgaGVhZGVyIGV4Y2VwdCBmb3IgYXJ0aWNsZSBwYWdlcywgKHNlZSBoZWFkZXJfb2ZfYXJ0aWNsZSkqLwotLmhlYWRlcmxhcmdlIHsKLQljb2xvcjogIzMzMzMzMzsKLQlmb250LXNpemU6IDE2MCU7Ci0JZm9udC13ZWlnaHQgOiA0MDA7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi0vKm1haW4gaGVhZGVyIGZvciBmcmFtZSBuYXZpZ2F0aW9uLCBpZSwgY2xlYXJjYXNlIG1lcmdlIGZpbGVzKi8KLS5oZWFkZXJtYWluIHsgIAotCWNvbG9yOiAjMzMzMzMzOwotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMjVweDsJCi0JZm9udC13ZWlnaHQ6IDYwMDsKLX0KLQotLyogaGVhZGVyIGVsZW1lbnQgZm9yIGZvcm0gdGFibGVzIGNvbnRhaW5pbmcgbWlkLXNpemUgZml4ZWQgaGVpZ2h0IHRleHQgKi8KLS5oZWFkZXJtZWRsaXN0IHsKLQlmb250LXNpemU6IDE2cHg7Ci19Ci0KLS8qZm9ybnQgZm9yIHN0ZXBzIHRpdGxlIGluIGZvcm1zKi8KLS5oZWFkZXJvZnN0ZXBzIHsgCi0JY29sb3I6ICM2NjY2NjY7Ci0JZm9udC1zaXplOiAyNXB4OwotCWZvbnQtd2VpZ2h0OiBib2xkOwotfQotCi0uaGVhZGVyb2ZzdGVwc25vbiB7IAotCWNvbG9yOiAjNjY2NjY2OwotCWZvbnQtc2l6ZTogMjVweDsKLQlmb250LXdlaWdodDogYm9sZDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLQotLyp1c2UgaGVhZGVyMSBpbnN0ZWFkKi8KLS5oMSB7ICAKLQotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMzNweDsJCi0JZm9udC13ZWlnaHQ6IDgwMDsKLX0KLQotLyp0byByZXBsYWNlIGgxIGFuZCBjb250ZW50aGVhZGVyIGxhcmdlKi8KLS5oZWFkZXIxIHsgIAotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMzNweDsJCi0JZm9udC13ZWlnaHQ6IDgwMDsKLX0KLQotLyp1c2Ugc3ViaGVhZDEgaW5zdGVhZCovCi0uaDFyb290eyAgCi0JY29sb3I6ICM5OTk5OTk7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAzM3B4OwkKLQlmb250LXdlaWdodDogNDAwOwotfQotCi0KLS8qdXNlZCBpbiBjYywgY3EsIHNsKi8gCi1oMSB7ICAKLQljb2xvcjogIzMzMzMzMzsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDI1cHg7CQotCWZvbnQtd2VpZ2h0OiA2MDA7Ci19Ci0KLS8qdXNlIGhlYWRlcjIgaW5zdGVhZCovCi0uaDIgeyAKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDI4cHg7Ci0JZm9udC13ZWlnaHQ6IDQwMDsJIAkKLX0KLQotLypoZWFkZXJzIHdpdGhpbiBwYWdlKi8KLS5oZWFkZXIyIHsgCi0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAyOHB4OwotCWZvbnQtd2VpZ2h0OiA0MDA7CSAJCi19Ci0KLQotaSB7Ci0JZm9udC1zdHlsZSA6IGl0YWxpYzsKLX0KLQotLmljb25ib3JkZXIgeyAKLQliYWNrZ3JvdW5kLWNvbG9yOiAjZGVkZWRlOwotfQotCi0vKmZvbnQgc2l6ZSBzZXR1cCBzaG93biBpbiB0aGUgaW5wdXQgYm94IHdoaWNoIGlzIGluaGVyaXRlZCBieSBpbnB1dFhYKi8KLWlucHV0IHsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsJCi0JZm9udC1zaXplOiAxNnB4OwotfSAKLQotaW5wdXQuaW5wdXQxMzUgewotCXdpZHRoOiAxMzVweAotfSAKLQotLyogMSxidXNpbmVzcyBzdGFuZGFyZCBtdWx0aWxpbmUgaW5wdXQgYm94IAotMix0aGlzIHN0eWxlIG9ubHkgYWN0aXZhdGUgaW4gSUUgKi8KLWlucHV0Lm1heDUwIHsKLQl3aWR0aDogMzYwcHg7Ci19Ci0KLWlucHV0LnB4MjUgewotICAgIHdpZHRoOiAyNXB4OwotfQotCi1pbnB1dC5weDQ1IHsKLSAgICB3aWR0aDogNDVweDsKLX0KLQotLyoKLTEsYnVzaW5lc3Mgc3RhbmRhcmQgbXVsdGlsaW5lIGlucHV0IGJveCAKLTIsdGhpcyBzdHlsZSBvbmx5IGFjdGl2YXRlIGluIElFCi0qLwotaW5wdXQucHg4NSB7Ci0gICAgd2lkdGg6IDg1cHg7Ci19Ci0KLWlucHV0LnB4MTM1IHsKLSAgICB3aWR0aDogMTM1cHg7Ci19Ci0KLWlucHV0LnB4MTU1IHsKLSAgICB3aWR0aDogMTU1cHg7Ci19Ci0KLWlucHV0LnB4MjMwIHsKLSAgICB3aWR0aDogMjMwcHg7Ci19Ci0KLWlucHV0LnB4MzA1IHsKLSAgICB3aWR0aDogMzA1cHg7Ci19Ci0KLS5sZWZ0bWVudSB7Ci0JYmFja2dyb3VuZC1jb2xvcjogIzk5OTk5OTsKLX0KLQotLmxlZnRtZW51YnVsbGV0IHsgCi1iYWNrZ3JvdW5kLWNvbG9yOiAjOTk5OTk5OwotIH0KLQotLmxlZnRtZW51YnVsbGV0YWN0aXZlIHsgCi1iYWNrZ3JvdW5kLWNvbG9yOiAjY2QzMzAxOwotIH0KLQkKLQotLmxlZnRuYXZoZWFkIHsKLQljb2xvcjogIzAwMDAwMDsKLQlmb250LXNpemU6IDE5cHg7CQotCWZvbnQtd2VpZ2h0OiBib2xkOwkKLX0gCi0KLS5sZWZ0bmF2bGFiZWwgewotY29sb3I6ICMwMDAwMDA7Ci1mb250LXdlaWdodCA6IDYwMDsKLWZvbnQtc2l6ZTogMTZweDsKLSB9Ci0KLS5saWdodGdyYXkgeyAKLWJhY2tncm91bmQtY29sb3I6ICNlNGU0ZTQ7Ci0gfQotIAotLm1lbnViYXIgewotICBjb2xvcjogI2ZmZmZmZjsKLSAgZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0gIGZvbnQtc2l6ZTogMTZweDsKLSAgZm9udC13ZWlnaHQ6IDQwMDsKLSAgdGV4dC1kZWNvcmF0aW9uOiBub25lCi19Ci0KLS8qbWVudWJhciB3aXRoaW4gdG9wIG9mIGNvbnRlbnQgcGFnZSAgKi8KLS5tZW51YmFybWlkeyAKLWZvbnQtc2l6ZTogMTZweDsKLSAgZm9udC13ZWlnaHQ6IDYwMDsKLSAgdGV4dC1kZWNvcmF0aW9uOiBub25lCi0gfQotCi0vKgotMSxib2xkIGZvbnQgZm9yIHRoZSBsYXN0IGl0ZW0gb2YgdGhlIGJyZWFkY3J1bWJzCi0yLGJvbGQgZm9udCBvZiB0YWJsZSBoZWFkZXIgd2l0aCBtZW51YmFyX2JnKGJsdWUpIGFzIGJhY2tncm91bmQgY29sb3IgCi0zLGJvbGQgdGV4dCBvbiBjb2xvcmVkIGJhY2tncm91bmQgZWcuIExvZ2dlZCBJbgotKi8KLS5tZW51YmFyZW1waGFzaXMgewotICBjb2xvcjogI2ZmZmZmZjsKLSAgZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0gIGZvbnQtc2l6ZTogMTZweDsKLSAgZm9udC13ZWlnaHQ6IDYwMDsKLSAgdGV4dC1kZWNvcmF0aW9uOiBub25lCi19Ci0KLS5tZW51YmFyOmhvdmVyIHsKLSAgY29sb3I6ICNmZmZmZmYKLX0gCi0gCi0ubWlkYmFyYmcgeyAKLQliYWNrZ3JvdW5kLWNvbG9yOiAjZmZmZmZmOwotIH0gCi0gCi0vKnRvcG5hdiovIAotLm1pZGJhcmxpZ2h0IHsgCi0JYmFja2dyb3VuZC1jb2xvcjogIzMzOTljYzsKLSB9Ci0gCi0vKmRhcmsgY29sb3IgYmV0d2VlbiB0YWJzKi8KLSAubWlkYmFyZGFyayB7IAotCWJhY2tncm91bmQ6ICMwMDMzNjY7Ci0gfQotIAotIC8qdG9wbmF2Ki8gCi0gLm1pZGJhcm1lZCB7IAotCWJhY2tncm91bmQtY29sb3I6ICMwMDY2OTk7Ci0gfQotIAotIC8qYmFja2dyb3VuZCAgb2YgIHRhYnMqLyAKLSAubWlkYmFybWVkaXVtIHsgCi0JYmFja2dyb3VuZDogIzAwNjY5OTsKLSB9Ci0gCi0gLm1pZGJhcnNoYWRvdyB7IAotCWJhY2tncm91bmQtY29sb3I6ICM2NjY2NjY7Ci0gfSAKLSAgCi0vKnJlcGxhY2luZyBzaWRlbWVudV9ib2xkbGVmdCBtb3ZpbmcgZm9yd2FyZCovCi0ubmF2bGVmdGJvbGQgewotCWNvbG9yOiAjMDAwMDAwOwotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTZweDsKLQlmb250LXdlaWdodCA6IDYwMDsKLQl0ZXh0LWRlY29yYXRpb24gOiBub25lOwotfQotCi0vKmxlZnQgbmF2IHN1Ym1lbnUqLwotLm5hdmxlZnRzdWIgewotCWNvbG9yOiAjNjc2NzY3OwotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTZweDsKLQlmb250LXdlaWdodCA6IDQwMDsKLQlsaW5lLWhlaWdodCA6IDEzNSU7Ci0JdGV4dC1kZWNvcmF0aW9uIDogbm9uZTsKLX0KLSAKLS8qIGJlY2F1c2Ugb2YgYW4gaW50ZXJ2ZW5pbmcgbGluayB0YWcsIHRleHQgb3B0aW9ucyB3ZXJlIGF0dGFjaGVkIHRvIHRoaXMgZWxlbWVudCBpbnN0ZWFkIG9mIHRoZSBvdXRlcm1vc3QgY2VsbCAqLwotLm5vbmFjdGl2ZXRhYiB7Ci0JY29sb3I6ICNiNGI0YjQ7Ci0JZm9udC1zaXplOiAxOHB4OwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotLypub3Rlcy8gZGVzY3JpcHRpb24gb2YgaWNvbiAqLwotLm5vdGVzeyAgCi0gZm9udC1zaXplOiAxNnB4OwotIGZvbnQtd2VpZ2h0IDogNDAwOwkKLX0KLQotcCB7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxOHB4OwkKLX0KLQotLnBhZ2Vib2xkIHsgCi0JY29sb3I6ICMwMDAwMDA7Ci0JZm9udC13ZWlnaHQgOiA2MDA7CQotIH0KLSAKLS8qZm9udCBmb3IgdGhlIG51bWJlcnMgaW4gcGFnaW5hdGlvbiBsaWJyYXJ5Ki8KLSAucGFnZW51bWJlciB7Ci0JY29sb3I6ICM2NzY3Njc7Ci0JZm9udC13ZWlnaHQgOiA0MDA7Ci19Ci0KLSAvKmZvbnQgZm9yIHByZXZpb3VzICYgbmV4dCBpbiBwYWdpbmF0aW9uKi8KLS5wYWdlc3RlcHMgeyAKLQljb2xvcjogIzY3Njc2NzsJCi0JZm9udC1zaXplOiAxNnB4OwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLSB9Ci0KLS5wb3AgewotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOyAKLQlmb250LXNpemUgOiAxOHB4OwotCWZvbnQtd2VpZ2h0IDogMjAwOwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotLnBvcGJhY2tncm91bmQgewotCi0JYmFja2dyb3VuZDogI2Q2ZDNjZTsKLX0KLQotLnBvcGgxIHsKLQlmb250LXNpemU6IDI0cHg7Ci0JZm9udC13ZWlnaHQgOiBib2xkOwotfQotCi0ucG9wbGVmdG1lbnUgewotCWJhY2tncm91bmQ6ICNmMGYwZjA7Ci0JYm9yZGVyOiB0aGluIHNvbGlkIGNjY2NjYzsgCi0JbGVmdDogMjEwcHg7IAotCXBhZGRpbmc6IDJweDsKLQlwb3NpdGlvbjphYnNvbHV0ZTsgCi0JdG9wOiAyNXB4OwotCXZpc2liaWxpdHk6IGhpZGRlbjsgCi0Jd2lkdGg6NzVweDsKLQl6LWluZGV4OjEwOwkKLSB9Ci0KLSAvKiB1c2UgcG9wbGVmdG1lbnUgaW5zdGVhZCBvZiB0aGlzIG9uZSovCi0ucG9wdXBib3JkZXIgewotCWJhY2tncm91bmQ6ICNmMGYwZjA7Ci0JYm9yZGVyIDogdGhpbiBzb2xpZCBjY2NjY2M7Ci0JcGFkZGluZyA6IDJweDsKLX0KLQotLnBvcHVwdGV4dCB7CQotICAgY29sb3I6ICMzMzMzMzM7Ci0JZm9udC1zaXplOiAxNnB4OwkKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLS5wcm9qZWN0YXR0IHsgCi0JZm9udC1mYW1pbHk6IHZlcmRhbmEsIGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxOHB4OyAKLQlmb250LXdlaWdodDogNjAwOwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsgCi0JY29sb3I6ICNjZDMzMDE7Ci19Ci0KLS8qZGF0ZSBhc3NvY2lhdGVkIHdpdGggYXJ0aWNsZSByYXRpbmdzKi8KLS5yYXRpbmdzZGF0ZQotewotCWNvbG9yOiAjMzM2Njk5OwotCWZvbnQtc2l6ZSA6IDE2cHg7Ci0JdGV4dC1kZWNvcmF0aW9uIDogbm9uZTsKLQl0ZXh0LWFsaWduOiByaWdodDsKLX0KLQotc2VsZWN0IHsKLSAgICBmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsJCi0JZm9udC1zaXplOiAxNnB4OwotfQotCi1zZWxlY3Quc2VscHgxNDQgewotICAgIHdpZHRoOiAxNDRweDsKLX0KLQotLyogLnNpZGVtZW51X2JvbGRsZWZ0IHJlcGxhY2Ugd2l0aCAubGVmdG1lbnVib2xkKi8gCi0KLS8qIC5zaWRlbWVudV9ib2xkbGVmdF9zZWxlY3RlZCByZXBsYWNlIHdpdGggLmxlZnRtZW51YWN0aXZlKi8KLQotLyogLnNpZGVtZW51X2J1bGxldF9jb2xvcmVkIHJlcGxhY2Ugd2l0aCAubGVmdG1lbnVidWxsZXRhY3RpdmUqLwotIAotLyouc2lkZW1lbnVfYnVsbGV0X2dyZXkgcmVwbGFjZSB3aXRoIGxlZnRtZW51YnVsbGV0Ki8KLQotLnNpZGVtZW51Ym9sZGxlZnQgewotCWNvbG9yOiAjMDAwMDAwOwkKLQlmb250LXNpemU6IDE2cHg7Ci0JZm9udC13ZWlnaHQgOiA2MDA7Ci0JdGV4dC1kZWNvcmF0aW9uIDogbm9uZTsKLX0gCi0KLS5zaWRlbWVudWJvbGRsZWZ0c2VsZWN0ZWQgewotCWNvbG9yOiAjY2MwMDAwOwotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTZweDsKLQlmb250LXdlaWdodCA6IDYwMDsKLQl0ZXh0LWRlY29yYXRpb24gOiBub25lOwotfQotCi0uc2lkZW1lbnVzdGFuZGFyZCB7Ci0JY29sb3I6ICM2NzY3Njc7Ci0JZm9udC1zaXplOiAxNnB4OwotCWZvbnQtd2VpZ2h0IDogNDAwOwotCWxpbmUtaGVpZ2h0IDogMTM1JTsKLQl0ZXh0LWRlY29yYXRpb24gOiBub25lOwotfQotCi0uc2lkZW1lbnVzdGFuZGFyZHNlbGVjdGVkIHsKLQljb2xvcjogI2NjMDAwMDsKLQlmb250LXNpemU6IDE2cHg7Ci0JZm9udC13ZWlnaHQgOiA0MDA7Ci0JbGluZS1oZWlnaHQgOiAxMzUlOwotCXRleHQtZGVjb3JhdGlvbiA6IG5vbmU7Ci19Ci0KLS5zbWFsbHRleHQgewotCWZvbnQtZmFtaWx5OiB2ZXJkYW5hLCBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTVweDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci0JY29sb3I6ICMwMDAwMDA7Ci19Ci0KLS8qdG8gcmVwbGFjZSBoMXJvb3QsICBmb3IgZG9jdW1lbnQgcm9vdCBmb2xkZXIqLwotLnN1YmhlYWQxIHsgIAotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMzNweDsJCi0JZm9udC13ZWlnaHQ6IDgwMDsKLX0KLQotLnRhYmxlaGVhZGVyIHsgCi0KLQljb2xvcjogIzAwMDAwMDsJCi0JZm9udC1zaXplOiAxOXB4OwkKLSAgICBmb250LXdlaWdodDogYm9sZAotfQotCi0vKiBmb250IGZvciByZWd1bGFyIGNvbnRlbnQgdGV4dCAqLwotdGQgewotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMThweDsJCi19Ci0KLS8qIGJlY2F1c2Ugb2YgYW4gaW50ZXJ2ZW5pbmcgbGluayB0YWcsIHRleHQgb3B0aW9ucyB3ZXJlIGF0dGFjaGVkIHRvIGEgc2ltaWxhciBlbGVtZW50IGZvciBsaW5rcyAqLwotdGQuYWN0aXZldGFiIHsgCi0gCWJhY2tncm91bmQtY29sb3I6ICNjNGM0YzQ7Ci0gIH0KLSAKLS8qIGJlY2F1c2Ugb2YgYW4gaW50ZXJ2ZW5pbmcgbGluayB0YWcsIHRleHQgb3B0aW9ucyB3ZXJlIGF0dGFjaGVkIHRvIGEgc2ltaWxhciBlbGVtZW50IGZvciBsaW5rcyAqLwotdGQuYWN0aXZldGFic2VsZWN0ZWQgeyAKLSAJYmFja2dyb3VuZC1jb2xvcjogI2RkZGRkZDsKLSAgfQotICAKLSAvKiB0aGVzZSBidXR0b24gc3R5bGVzIGFyZSBmb3IgdGhlIHRleHR1YWwgYnV0dG9ucyBpbnRlbmRlZCB0byByZXBsYWNlIGltYWdlIGNvbnN0cnVjdHMgZm9yIGludGVybmF0aW9uYWxpemF0aW9uICovIAotdGQuYnV0dG9uYm9keSB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI0RBREFEQTsKLX0KLQotIC8qIGRpc2FibGVkIHZlcnNpb24gKi8gCi10ZC5idXR0b25ib2R5ZHNibCB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI0RBREFEQTsKLX0KLQotLyogdGhpcyBzdHlsZSBpcyBkZXNjb3BlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGluIGZ1dHVyZSAqLwotdGQuYnV0dG9uaGlnaGxpZ2h0IHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjZmZmZmZmOwotfQotCi10ZC5idXR0b25zaGFkb3cgewotCWJhY2tncm91bmQtY29sb3I6ICM2ZDZkNmQ7Ci19Ci0KLS8qIGRpc2FibGVkIHZlcnNpb24gKi8KLXRkLmJ1dHRvbnNoYWRvd2RzYmwgewotCWJhY2tncm91bmQtY29sb3I6ICNBMkEyQTI7Ci19Ci0gCi0vKiBkZXNpZ24gZWxlbWVudCByYXJlbHkgdXNlZCBmb3IgbGluZSBjb2xvdXIgaW4gY2VydGFpbiBkZWNvcmF0aXZlIHRhYmxlcyAqLwotdGQuZGVzaWduMSB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI2Q0ZDRkNDsKLX0KLSAKLS8qZGVzaWduIGVsZW1lbnQgc2ltdWxhdGluZyBhIGRpbWVuc2lvbmFsIGJvdW5kYXJ5IHRvIGEgdGFibGUgKi8KLXRkLmRpdmlkZXJkaW1lbnMgewotCWJhY2tncm91bmQtY29sb3I6ICNiZGJkYmQ7Ci19Ci0gCi0gLyogYmVjYXVzZSBvZiBhbiBpbnRlcnZlbmluZyBsaW5rIHRhZywgdGV4dCBvcHRpb25zIHdlcmUgYXR0YWNoZWQgdG8gYSBzaW1pbGFyIGVsZW1lbnQgZm9yIGxpbmtzICovCi10ZC5ub25hY3RpdmV0YWIgewotCWJhY2tncm91bmQtY29sb3I6ICNlZmVmZWY7Ci19Ci0KLS8qIGRhdGEgd2l0aGluIGEgdGFibGUgaGlnaGxpZ2h0ZWQgaW4gZ3JheSovCi10ZC50YmxoaWdobHQgeyAKLSAgIGJhY2tncm91bmQtY29sb3I6ICNkZWRlZGU7Ci0gICBwYWRkaW5nOiAycHg7Ci0gfQotIAotIHRkLnRibGhpZ2hsdDEgeyAKLSAgIGJhY2tncm91bmQtY29sb3I6ICNkZWRlZGU7Ci0gfQotIAotLyogZGF0YSB3aXRoaW4gYSB0YWJsZSBoaWdobGlnaHRlZCBpbiBsaWdodCBncmF5Ki8KLXRkLnRibGhpZ2hsdDIgeyAKLSAgIGJhY2tncm91bmQtY29sb3I6ICNlZmVmZWY7Ci0gfSAKLQotIC8qIGRhdGEgd2l0aGluIGEgdGFibGUgaGlnaGxpZ2h0ZWQgaW4gbGlnaHQgZ3JheSovCi10ZC50YmxoaWdobHQzIHsgCi0gICBiYWNrZ3JvdW5kLWNvbG9yOiAjZTllOWU5OwotIH0gIAotIAotLypkYXJrIGdyZXkgY2VsbCBiYWNrZ3JvdW5kIGFuZCBib2xkIHRleHQgKi8KLS50ZGRhcmtib2xkIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjY2NjY2NjOwkKLQlmb250LXdlaWdodCA6IDYwMDsKLX0KLQotLnRkbGlnaHQgewotCWJhY2tncm91bmQtY29sb3I6ICNlZmVmZWY7Ci0JcGFkZGluZzogMnB4OwotfQotCi0udGRsaWdodDEgewotCWJhY2tncm91bmQtY29sb3I6ICNlZmVmZWY7Ci19Ci0gCi0gCi10ZXh0YXJlYSB7Ci0gICAgZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7CQotCWZvbnQtc2l6ZTogMTZweDsKLX0KLQotdGV4dGFyZWEucHgzODB7Ci0gd2lkdGg6IDM4MHB4OyAKLSB9Ci0KLS50ZXh0ZXJyb3Jtc2cgewotCWNvbG9yIDogY2MwMDAwOwotCWZvbnQtZmFtaWx5OiB2ZXJkYW5hLCBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTEwJTsKLQlmb250LXdlaWdodDogYm9sZDsKLX0KLQotLnRleHRncmF5IHsgIAotCWNvbG9yOiAjOTk5OTk5OwkKLX0KLQotLnRvcGJhcmRpdmlkZXIgeyAKLQliYWNrZ3JvdW5kOiAjMzM5OWNjIAotfQotCi0udG9wYmFyZGl2aWRlcmdyZXllZCB7IAotCWJhY2tncm91bmQ6ICNhZGQ2ZWIKLSB9ICAKLQotLnRvcGJhcnNlcGFyYXRvciB7Ci0gIGNvbG9yOiAjY2MzMzAwOyAgCi0gIGZvbnQtc2l6ZTogMTZweDsKLSAgdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfSAKLSAKLS50b3BmcmFtZWJnIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjZDJkMmQyOwotfQotCi0udG9wZnJhbWViZ2dyZXllZCB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI2VkZWRlZDsKLX0KLQotLnRvcGZyYW1laGlnaGxpZ2h0IHsgIAotCWJhY2tncm91bmQtY29sb3I6ICNiNmI1YjU7Ci19Ci0KLS50b3BmcmFtZWhpZ2hsaWdodGdyZXllZCB7ICAKLQliYWNrZ3JvdW5kLWNvbG9yOiAjZTFlMWUxOwotfQotCi0udG9wZnJhbWVoaWdobGlnaHQyIHsgCi0JYmFja2dyb3VuZC1jb2xvcjogI2VmZWZlZjsKLX0KLQotLnRvcGZyYW1laGlnaGxpZ2h0MmdyZXllZCB7IAotCWJhY2tncm91bmQtY29sb3I6ICNmOWY5Zjk7Ci0gfSAKLSAKLS50b3BmcmFtZWxvZ29iZyB7ICAKLQliYWNrZ3JvdW5kLWNvbG9yOiAjMDA2Njk5OwotfQotCi0udG9wZnJhbWVsb2dvYmdncmV5ZWQgeyAgCi0JYmFja2dyb3VuZC1jb2xvcjogIzk5YzJkNjsKLX0KLQotLnRvcGZyYW1lc2hhZG93IHsgIAotCWJhY2tncm91bmQtY29sb3I6ICM4NDg0ODQ7Ci19Ci0KLS50b3BmcmFtZXNoYWRvd2dyZXllZCB7ICAKLWJhY2tncm91bmQtY29sb3I6ICNjZWNlY2U7Ci19Ci0KLS50b3BsZWZ0bmF2IHsJCi0gICAgY29sb3I6ICMwMDAwMDA7Ci0JZm9udC1mYW1pbHk6IHZlcmRhbmEsIGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxNXB4OwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotLnRvcGxlZnRuYXZib2xkIHsgCi0JZm9udC1mYW1pbHk6IHZlcmRhbmEsIGJyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxNXB4OyAKLQlmb250LXdlaWdodDogNjAwOwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsgCi19Ci0KLS50b3BsZWZ0bmF2Ym9sZGdyZXllZCB7IAotCWNvbG9yOiAjOTk5OTk5OwotCWZvbnQtZmFtaWx5OiB2ZXJkYW5hLCBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOyAKLQlmb250LXNpemU6IDE1cHg7IAotCWZvbnQtd2VpZ2h0OiBib2xkOwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsgCi19Ci0KLS50b3BsZWZ0bmF2Z3JleWVkIHsJCi0JY29sb3I6ICM5OTk5OTk7Ci0JZm9udC1mYW1pbHk6IHZlcmRhbmEsIGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxNXB4OwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLQl9Ci0KLS50b3BsaW5lY29sb3IgeyAKLQliYWNrZ3JvdW5kLWNvbG9yOiAjMDA2Njk5OwotIH0JCi0JCi0udG9wcmlnaHRuYXYgewotCWNvbG9yOiAjZmZmZmZmOwotCWZvbnQtZmFtaWx5OiB2ZXJkYW5hLCBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTRweDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLS50b3ByaWdodG5hdmdyZXkKLXsKLQlmb250LWZhbWlseTogVmVyZGFuYSwgQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDEwcHg7Ci0JY29sb3I6ICMwMDAwMDA7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi0KLSAvKiB0aGlzIHdhcyBpbml0aWFsbHkgZGVjbGFyZWQgdGhlIHNhbWUgY29sb3VyIGFzIHRoZSBjbGFzcyB0b3BmcmFtZSBiZyBidXQgYmVjYXVzZSBpdCBsaWVzIGluIGEgZGlmZmVyZW50IGZ1bmN0aW9uYWwgYXJlYSwgaGFzIGJlZW4gcmVjcmVhdGVkIGhlcmUgICovCi10ci5iZ21pZGZyYW1lIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjZDJkMmQyOwotfQotCi10ZC5zaWRlbWVudWJ1bGxldGdyZXkgewotCWJhY2tncm91bmQtY29sb3I6ICM5OTk5OTk7Ci19Ci0KLQotdGQuc2lkZW1lbnVidWxsZXRjb2xvcmVkIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjY2QzMzAxOwotfQotCi0vKmxpc3Qtc3R5bGUtaW1hZ2U6IHVybChpbWFnZXMvZG93bmJ1dHRvbi5naWYpOyovCi11bCB7CQotCi0JbGlzdC1zdHlsZS10eXBlOiBzcXVhcmU7Ci19Ci0gCi0KLS52b2IgewotCWZvbnQtZmFtaWx5OiBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTUwJTsKLQljb2xvcjogIzAwNjY5OTsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci0JZm9udC13ZWlnaHQ6IDQwMDsKLX0KLQotLnZvYmJvdHRvbSB7Ci0JZm9udC1mYW1pbHk6IEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAyMXB4OwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2ljb25zL1B1Ymxpc2hpbmcuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvaWNvbnMvUHVibGlzaGluZy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzMWJhZjIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvaWNvbnMvUHVibGlzaGluZy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9pbWFnZXMvQXJ0aWZhY3QuanBnIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvaW1hZ2VzL0FydGlmYWN0LmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjczOTEyNy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9pbWFnZXMvQXJ0aWZhY3QuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvaW1hZ2VzL1JvbGUuanBnIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvaW1hZ2VzL1JvbGUuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZjE4M2EyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2ltYWdlcy9Sb2xlLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2ltYWdlcy9UYXNrLmpwZyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2ltYWdlcy9UYXNrLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjVhYzJjNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9pbWFnZXMvVGFzay5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9pbWFnZXMvdG9wLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2ltYWdlcy90b3AuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MTVhY2Y0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2ltYWdlcy90b3AuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcva2V5d29yZGluZGV4ZGVmLnR4dCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2tleXdvcmRpbmRleGRlZi50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0MTcxOGMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcva2V5d29yZGluZGV4ZGVmLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLXJlbGF0aXZlcGF0aAkuLgotd3d3cm9vdAkuLgotbWFpbnJlc3VsdGZpbGUJL2luZGV4L2luZGV4Lmh0bQotaW5kZXhyZXN1bHRmaWxlCS9pbmRleC9uYXZpZy5odG0KLWtleXdvcmRyZXN1bHRmaWxlCS9pbmRleC9jb250ZW50cy5odG0KLW1haW50aXRsZQlJbmRleCAtIEJhc2ljIFVuaWZpZWQgUHJvY2VzcwotdGFyZ2V0CW9yeV9kb2MKLWluZGV4dGFyZ2V0CWluZGV4X3QKLWtleXdvcmR0YXJnZXQJa2V5d29yZF90Ci1pbmRleGhlaWdodAkyNQotaGVhZGVyZmlsZQlrZXl3b3JkcHJlYW1ibGUudHh0Ci1mb290ZXJmaWxlCWtleXdvcmRwb3N0YW1ibGUudHh0Ci1rZXl3b3JkZmlsZQlrZXl3b3Jkcy50eHQKLWxlYXZlRGlyCV9ib3JkZXJzCi1tdWxpdGRvY3VtZW50a2V5d29yZAlmYWxzZQotc2hvd2RvY3VtZW50dGl0bGUJZmFsc2UKLXByZWZpeAlYRV8KLWxldmVsc2VwYXJhdG9yCV9fCi1zZWUJLCBTZWUKLXNlZWFsc28JLCBTZWUgYWxzbwotbGV2ZWxzdHlsZQlkZWZhdWx0c3R5bGUJaW5kZXhsZXZlbDIKLWxldmVsc3R5bGUJMQlpbmRleGxldmVsMQotbGV2ZWxzdHlsZQkyCWluZGV4bGV2ZWwyCi1sZXZlbHN0eWxlCWhlYWRsaW5lc3R5bGUJaW5kZXhoZWFkaW5nIApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcva2V5d29yZHBvc3RhbWJsZS50eHQgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9rZXl3b3JkcG9zdGFtYmxlLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTFhMDljYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9rZXl3b3JkcG9zdGFtYmxlLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9rZXl3b3JkcHJlYW1ibGUudHh0IGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcva2V5d29yZHByZWFtYmxlLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTYyZTc1MS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9rZXl3b3JkcHJlYW1ibGUudHh0CisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi08aHRtbD4KLTxoZWFkPgotPE1FVEEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiPgotPGxpbmsgcmVsPSJTdHlsZVNoZWV0IiBocmVmPSJpbmRleC5jc3MiIHR5cGU9InRleHQvY3NzIj4KLTx0aXRsZT5JbmRleCAtIEJhc2ljIFVuaWZpZWQgUHJvY2VzczwvdGl0bGU+Ci0KLTwvaGVhZD4KLTxib2R5IGJnY29sb3I9IiNGRkZGRkYiIHRleHQ9IiMwMDAwMDAiIGxpbms9IiMwMDQwODAiIHZsaW5rPSIjODAwMEZGIiBhbGluaz0iIzAwMDBGRiI+Ci0gIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2tleXdvcmRzLnR4dCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2tleXdvcmRzLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2RkMjU3ZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9rZXl3b3Jkcy50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLVhFX0tleVdvcmRJbmRleF9fQ29weXJpZ2h0CVhFX0NvcHlyaWdodAotWEVfU2l0ZU1hcF9fQ29weXJpZ2h0CVhFX0NvcHlyaWdodAotWEVfU2VhcmNoRW5naW5lX19Db3B5cmlnaHQJWEVfQ29weXJpZ2h0Ci1YRV9UcmVlQnJvd3Nlcl9fQ29weXJpZ2h0CVhFX0NvcHlyaWdodAotWEVfVHJlZUJyb3dzZXJfX0V4YW1wbGUJWEVfU3lzdGVtX3JlcXVpcmVtZW50cwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2xpYi9ycHdjb3JlLmphciBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2xpYi9ycHdjb3JlLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWY5MTQ5NC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9saWIvcnB3Y29yZS5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9wbHVnaW4ucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MzU5N2MwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLQotIyBQbHVnLWluCi1wbHVnaW5OYW1lPUVQRiBQdWJsaXNoaW5nCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKLQotCi0KLSAgICAgICAgICAgICAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy9QdWJsaXNoaW5nUGx1Z2luLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvUHVibGlzaGluZ1BsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ODM4ODU0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy9QdWJsaXNoaW5nUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24uQWJzdHJhY3RBY3RpdmF0b3I7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0KLS8qKgotICogVGhlIFB1Ymxpc2hpbmcgcGx1Zy1pbiBhY3RpdmF0b3IuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFB1Ymxpc2hpbmdQbHVnaW4gZXh0ZW5kcyBBYnN0cmFjdEFjdGl2YXRvciB7Ci0KLQkvKioKLQkgKiBUaGUgcGx1Zy1pbiBJRC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgPSBQdWJsaXNoaW5nUGx1Z2luLmNsYXNzLmdldE5hbWUoKTsKLQotCS8qKgotCSAqIFRoZSBzaGFyZWQgcGx1Zy1pbiBpbnN0YW5jZS4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBQdWJsaXNoaW5nUGx1Z2luIHBsdWdpbjsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFB1Ymxpc2hpbmdQbHVnaW4oKSB7Ci0JCXN1cGVyKCk7Ci0JCXBsdWdpbiA9IHRoaXM7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpLkFic3RyYWN0UGx1Z2luI3N0YXJ0KEJ1bmRsZUNvbnRleHQpCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RhcnQoY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpLkFic3RyYWN0UGx1Z2luI3N0b3AoQnVuZGxlQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0b3AoY29udGV4dCk7Ci0JCXBsdWdpbiA9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2hhcmVkIHBsdWctaW4gaW5zdGFuY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBQdWJsaXNoaW5nUGx1Z2luIGdldERlZmF1bHQoKSB7Ci0JCXJldHVybiBwbHVnaW47Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvUHVibGlzaGluZ1Jlc291cmNlcy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL1B1Ymxpc2hpbmdSZXNvdXJjZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDVhZmVjMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvUHVibGlzaGluZ1Jlc291cmNlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotLyoqCi0gKiBUaGUgUHVibGlzaGluZyByZXNvdXJjZSBidW5kbGUuCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBQdWJsaXNoaW5nUmVzb3VyY2VzIGV4dGVuZHMgTkxTIHsKLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBCVU5ETEVfTkFNRSA9IFB1Ymxpc2hpbmdSZXNvdXJjZXMuY2xhc3MuZ2V0UGFja2FnZSgpCi0JCQkuZ2V0TmFtZSgpCi0JCQkrICIuUmVzb3VyY2VzIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBQdWJsaXNoaW5nUmVzb3VyY2VzKCkgewotCQkvLyBEbyBub3QgaW5zdGFudGlhdGUKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwdWJsaXNoaW5nQ29uZmlndXJhdGlvblRhc2tfbmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGluaXRpYWxpemluZ0RpclRhc2tfbmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvcHlpbmdGaWxlc1Rhc2tfbmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdlbmVyYXRpbmdCb29rbWFya3NUYXNrX25hbWU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZW5lcmF0aW5nQm9va21hcmtUYXNrX25hbWU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZW5lcmF0aW5nQm9va21hcmtJbmRleFRhc2tfbmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHB1Ymxpc2hpbmdMaW5rZWRFbGVtZW50VGFza19uYW1lOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHVibGlzaGluZ0VsZW1lbnRUYXNrX25hbWU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZW5lcmF0aW5nR2xvc3NhcnlUYXNrX25hbWU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZW5lcmF0aW5nU2VhcmNoSW5kZXhUYXNrX25hbWU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZW5lcmF0aW5nV0FSRmlsZVRhc2tfbmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGJ1aWxkaW5nUHJvY2Vzc0Nsb3N1cmVUYXNrX25hbWU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBidWlsZGluZ0VsZW1lbnRDbG9zdXJlVGFza19uYW1lOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbG9hZExpYnJhcnlUYXNrX25hbWU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwdWJsaXNoRWxlbWVudEVycm9yX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlcnZlckVycm9yX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGludmFsaWRIdHRwUmVzcG9uc2VFcnJvcl9tc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBpbnZhbGlkRWxlbWVudFdhcm5pbmdfbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgaW52YWxpZE1ldGhvZEVsZW1lbnRXYXJuaW5nX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvcHlGaWxlV2FybmluZ19tc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBtaXNzaW5nSWNvbkZpbGVXYXJuaW5nX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG1pc3NpbmdJY29uTmFtZVdhcm5pbmdfbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXh0ZXJuYWxVcmxfbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY3JlYXRlU2VhcmNoSW5kZXhFcnJvcl9tc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZWZlcmVuY2VXb3JrZmxvd3NOb2RlX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0YXNrTm9kZV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHJpbWFyaWx5UGVyZm9ybXNOb2RlX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhZGRpdGlvbmFsbHlQZXJmb3Jtc05vZGVfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHBlcmZvcm1pbmdSb2xlc05vZGVfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGlucHV0V29ya1Byb2R1Y3RzTm9kZV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgb3V0cHV0V29ya1Byb2R1Y3RzTm9kZV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVzcG9uc2libGVGb3JOb2RlX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBtb2RpZmllc05vZGVfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlc3BvbnNpYmxlUm9sZU5vZGVfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbnRhaW5pbmdXb3JrUHJvZHVjdE5vZGVfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbnRhaW5lZFdvcmtQcm9kdWN0c05vZGVfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGd1aWRhbmNlTm9kZV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgaW5wdXRUb05vZGVfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG91dHB1dEZyb21Ob2RlX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBpbmRleExhYmVsX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkaXNjYXJlZENhdGVnb3J5V2FybmluZ19tc2c7Ci0KLQlzdGF0aWMgewotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBQdWJsaXNoaW5nUmVzb3VyY2VzLmNsYXNzKTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvUmVzb3VyY2VzLnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvUmVzb3VyY2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyOTUyNWYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL1Jlc291cmNlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLSMKLSMgTWVzc2FnZSBJRCBSYW5nZTogSVVQUDAwMDBFIC0gSVVQUDAwOTlFCi0jCi0KLSMgUHJvZ3Jlc3MgTWVzc2FnZXMKLXB1Ymxpc2hpbmdDb25maWd1cmF0aW9uVGFza19uYW1lPVB1Ymxpc2hpbmcgY29uZmlndXJhdGlvbi4uLgotaW5pdGlhbGl6aW5nRGlyVGFza19uYW1lPUluaXRpYWxpemluZyBkZXN0aW5hdGlvbiBkaXJlY3RvcnkuLi4KLWNvcHlpbmdGaWxlc1Rhc2tfbmFtZT1Db3B5aW5nIGZpbGVzLi4uCi1nZW5lcmF0aW5nQm9va21hcmtzVGFza19uYW1lPUdlbmVyYXRpbmcgYm9va21hcmtzLi4uCi1nZW5lcmF0aW5nQm9va21hcmtUYXNrX25hbWU9R2VuZXJhdGluZyBib29rbWFyayAnJ3swfScnLi4uCi1nZW5lcmF0aW5nQm9va21hcmtJbmRleFRhc2tfbmFtZT1HZW5lcmF0aW5nIGJvb2ttYXJrIGluZGV4Li4uCi1wdWJsaXNoaW5nTGlua2VkRWxlbWVudFRhc2tfbmFtZT1QdWJsaXNoaW5nIG1ldGhvZCBlbGVtZW50czogezB9IHB1Ymxpc2hlZCwgezF9IHJlbWFpbmluZwotcHVibGlzaGluZ0VsZW1lbnRUYXNrX25hbWU9UHVibGlzaGluZyBtZXRob2QgZWxlbWVudDogezB9OnsxfQotZ2VuZXJhdGluZ0dsb3NzYXJ5VGFza19uYW1lPUdlbmVyYXRpbmcgZ2xvc3NhcnkuLi4KLWdlbmVyYXRpbmdTZWFyY2hJbmRleFRhc2tfbmFtZT1HZW5lcmF0aW5nIHNlYXJjaCBpbmRleC4uLgotZ2VuZXJhdGluZ1dBUkZpbGVUYXNrX25hbWU9R2VuZXJhdGluZyBXQVIgZmlsZS4uLgotYnVpbGRpbmdQcm9jZXNzQ2xvc3VyZVRhc2tfbmFtZT1CdWlsZGluZyBwcm9jZXNzIGNsb3N1cmUuLi4KLWJ1aWxkaW5nRWxlbWVudENsb3N1cmVUYXNrX25hbWU9QnVpbGRpbmcgZWxlbWVudCBjbG9zdXJlIGZvciAnJ3swfScnLi4uCi1sb2FkTGlicmFyeVRhc2tfbmFtZT1Mb2FkaW5nIGxpYnJhcnkgY29udGVudHMuLi4KLQotIyBFcnJvciBNZXNzYWdlcyBsb2dnZWQgaW4gdGhlIFB1Ymxpc2hpbmcgUmVwb3J0Ci1wdWJsaXNoRWxlbWVudEVycm9yX21zZz1JVVBQMDAwMEU6IEVycm9yIHB1Ymxpc2hpbmcgZWxlbWVudDogezB9Ci1zZXJ2ZXJFcnJvcl9tc2c9SVVQUDAwMDFFOiBObyBkYXRhIHJldHVybmVkIGZyb20gc2VydmVyLgotaW52YWxpZEh0dHBSZXNwb25zZUVycm9yX21zZz1JVVBQMDAwMkU6IEludmFsaWQgcmVzcG9uc2UgZnJvbSBodHRwOi8vezB9OnsxfTp7Mn0KLQotIyBXYXJuaW5nIE1lc3NhZ2VzIGxvZ2dlZCBpbiB0aGUgUHVibGlzaGluZyBSZXBvcnQKLWludmFsaWRFbGVtZW50V2FybmluZ19tc2c9SVVQUDAwMDNXOiBFbGVtZW50IHdhcyBub3QgcHVibGlzaGVkIGJlY2F1c2UgaXQgaXMgbm90IGEgdmFsaWQgZWxlbWVudCBpbiB0aGUgY29uZmlndXJhdGlvbi4KLWludmFsaWRNZXRob2RFbGVtZW50V2FybmluZ19tc2c9SVVQUDAwMDRXOiBFbGVtZW50IHdhcyBub3QgcHVibGlzaGVkIGJlY2F1c2UgaXQgaXMgbm90IGEgbWV0aG9kIGVsZW1lbnQ6IHswfQotY29weUZpbGVXYXJuaW5nX21zZz1JVVBQMDAwNVc6IFVuYWJsZSB0byBjb3B5IGZpbGUgZnJvbSAnJ3swfScnIHRvICcnezF9JycuCi1taXNzaW5nSWNvbkZpbGVXYXJuaW5nX21zZz1JVVBQMDAwNlc6IE5vZGUgaWNvbiBmaWxlICcnezB9JycgZG9lcyBub3QgZXhpc3RzLgotbWlzc2luZ0ljb25OYW1lV2FybmluZ19tc2c9SVVQUDAwMDdXOiBVbmFibGUgdG8gcmV0cmlldmUgdGhlIG5hbWUgb2YgdGhlIHRoZSBub2RlIGljb24uCi1leHRlcm5hbFVybF9tc2c9ezB9IG1pbmktc2Vjb25kcyByZWZlcmVuY2luZyBleHRlcm5hbCBVUkw6IHsxfQotZGlzY2FyZWRDYXRlZ29yeVdhcm5pbmdfbXNnPUVtcHR5IGNvbnRlbnQgY2F0ZWdvcnkgZWxlbWVudCBub3QgcHVibGlzaGVkLgotCi0jIEVycm9yIERldGFpbHMKLWNyZWF0ZVNlYXJjaEluZGV4RXJyb3JfbXNnPUlVUFAwMDA4RTogVGhlIHNlYXJjaCBpbmRleCBmaWxlIHdhcyBub3QgY3JlYXRlZC4KLQotIyBQcm9jZXNzIFRyZWUgTm9kZXMKLXJlZmVyZW5jZVdvcmtmbG93c05vZGVfdGV4dD1SZWZlcmVuY2UgV29ya2Zsb3dzCi10YXNrTm9kZV90ZXh0PVRhc2tzCi1wcmltYXJpbHlQZXJmb3Jtc05vZGVfdGV4dD1QcmltYXJpbHkgUGVyZm9ybXMKLWFkZGl0aW9uYWxseVBlcmZvcm1zTm9kZV90ZXh0PUFkZGl0aW9uYWxseSBQZXJmb3JtcwotcGVyZm9ybWluZ1JvbGVzTm9kZV90ZXh0PVBlcmZvcm1pbmcgUm9sZXMKLWlucHV0V29ya1Byb2R1Y3RzTm9kZV90ZXh0PUlucHV0IFdvcmsgUHJvZHVjdHMKLW91dHB1dFdvcmtQcm9kdWN0c05vZGVfdGV4dD1PdXRwdXQgV29yayBQcm9kdWN0cwotcmVzcG9uc2libGVGb3JOb2RlX3RleHQ9UmVzcG9uc2libGUgRm9yCi1tb2RpZmllc05vZGVfdGV4dD1Nb2RpZmllcwotcmVzcG9uc2libGVSb2xlTm9kZV90ZXh0PVJlc3BvbnNpYmxlIFJvbGUKLWNvbnRhaW5pbmdXb3JrUHJvZHVjdE5vZGVfdGV4dD1Db250YWluaW5nIFdvcmsgUHJvZHVjdAotY29udGFpbmVkV29ya1Byb2R1Y3RzTm9kZV90ZXh0PUNvbnRhaW5lZCBXb3JrIFByb2R1Y3RzCi1ndWlkYW5jZU5vZGVfdGV4dD1HdWlkYW5jZQotaW5wdXRUb05vZGVfdGV4dD1JbnB1dCB0bwotb3V0cHV0RnJvbU5vZGVfdGV4dD1PdXRwdXQgZnJvbQotCi0jIEhUTUwgVGl0bGUgZm9yIEluZGV4IFBhZ2UKLWluZGV4TGFiZWxfdGV4dD1JbmRleApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3BhY2thZ2UuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3YzQyYzguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIHRoZSBhY3RpdmF0b3IgZm9yIG1hbmFnaW5nIHRoZSBQdWJsaXNoaW5nIHBsdWctaW4ncyBsaWZlIGN5Y2xlLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy9zZXJ2aWNlcy9BYnN0cmFjdFB1Ymxpc2hNYW5hZ2VyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvc2VydmljZXMvQWJzdHJhY3RQdWJsaXNoTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNzUzMzE4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy9zZXJ2aWNlcy9BYnN0cmFjdFB1Ymxpc2hNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcuc2VydmljZXM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5zZXJ2aWNlYWJpbGl0eS5EZWJ1Z1RyYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuRmlsZU5hbWVHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5MaWJyYXJ5VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5QdWJsaXNoaW5nUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLlB1Ymxpc2hpbmdSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLQotLyoqCi0gKiBUaGUgYWJzdHJhY3QgYmFzZSBjbGFzcyBmb3IgYWxsIFB1Ymxpc2ggTWFuYWdlcnMuCi0gKiA8cD4KLSAqIFVzZSB0aGUgb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkucHVibGlzaGVycyBleHRlbnNpb24gcG9pbnQgdG8gZXh0ZW5kCi0gKiB0aGlzIGNsYXNzIGlmIHlvdSBuZWVkIHRvIGN1c3RvbWl6ZSB0aGUgcHVibGlzaGluZy4KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0UHVibGlzaE1hbmFnZXIgewotCi0JcHJvdGVjdGVkIHN0YXRpYyBib29sZWFuIGRlYnVnID0gUHVibGlzaGluZ1BsdWdpbi5nZXREZWZhdWx0KCkKLQkJCS5pc0RlYnVnZ2luZygpOwotCi0JcHJvdGVjdGVkIHN0YXRpYyBib29sZWFuIHByb2ZpbGluZyA9IFB1Ymxpc2hpbmdQbHVnaW4uZ2V0RGVmYXVsdCgpCi0JCQkuaXNQcm9maWxpbmcoKTsKLQotCXByb3RlY3RlZCBTdHJpbmcgcHViRGlyOwotCi0JcHJvdGVjdGVkIE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnOwotCi0JcHJvdGVjdGVkIFB1Ymxpc2hIVE1MT3B0aW9ucyBvcHRpb25zOwotCi0JcHJvdGVjdGVkIEFic3RyYWN0Vmlld0J1aWxkZXIgdmlld0J1aWxkZXI7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBzdWNjZXNzID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBBYnN0cmFjdFB1Ymxpc2hNYW5hZ2VyKCkgewotCX0KLQotCS8qKgotCSAqIEluaXRpbGl6ZXMgdGhlIHB1Ymxpc2hpbmcgbWFuYWdlci4KLQkgKiAKLQkgKiBAcGFyYW0gcHViRGlyCi0JICogICAgICAgICAgICB0aGUgcHVibGlzaCBkaXJlY3RvcnkKLQkgKiBAcGFyYW0gY29uZmlnCi0JICogICAgICAgICAgICBhIG1ldGhvZCBjb25maWd1cmF0aW9uCi0JICogQHBhcmFtIG9wdGlvbnMKLQkgKiAgICAgICAgICAgIHRoZSBwdWJsaXNoaW5nIG9wdGlvbnMKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KFN0cmluZyBwdWJEaXIsIE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnLAotCQkJUHVibGlzaE9wdGlvbnMgb3B0aW9ucykgewotCQl0aGlzLnB1YkRpciA9IHB1YkRpcjsKLQotCQlpZiAoIXRoaXMucHViRGlyLmVuZHNXaXRoKEZpbGUuc2VwYXJhdG9yKSkgewotCQkJdGhpcy5wdWJEaXIgKz0gRmlsZS5zZXBhcmF0b3I7Ci0JCX0KLQotCQl0aGlzLmNvbmZpZyA9IGNvbmZpZzsKLQkJaWYgKG9wdGlvbnMgaW5zdGFuY2VvZiBQdWJsaXNoSFRNTE9wdGlvbnMpIHsKLQkJCXRoaXMub3B0aW9ucyA9IChQdWJsaXNoSFRNTE9wdGlvbnMpIG9wdGlvbnM7Ci0JCX0gZWxzZSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0JCX0KLQkJdGhpcy52aWV3QnVpbGRlciA9IGNyZWF0ZVZpZXdCdWlsZGVyKCk7Ci0KLQkJLy8gY2xlYXIgdGhlIGZpbGUgbmFtZSBjYWNoZQotCQkvLyBOYW1lQ2FjaGUuZ2V0SW5zdGFuY2UoKS5jbGVhcigpOwotCX0KLQotCS8qKgotCSAqIGdldCB0aGUgcHVibGlzaGluZyB2aWV3IGJ1aWxkZXIuIFRoZSB2aWV3IGJ1aWxkZXIgaXMgcmVzcG9uc2libGUgdG8gYnVpbGQKLQkgKiB0aGUgcHVibGlzaGluZyB2aWV3cyBhbmQgY29udGVudHMuCi0JICogCi0JICogQHJldHVybiBBYnN0cmFjdFZpZXdCdWlsZGVyCi0JICovCi0JcHVibGljIEFic3RyYWN0Vmlld0J1aWxkZXIgZ2V0Vmlld0J1aWxkZXIoKSB7Ci0JCXJldHVybiB0aGlzLnZpZXdCdWlsZGVyOwotCX0KLQotCXB1YmxpYyBJU2l0ZUdlbmVyYXRvciBnZXRTaXRlR2VuZXJhdG9yKCkgewotCQlyZXR1cm4gdmlld0J1aWxkZXIuZ2V0U2l0ZUdlbmVyYXRvcigpOwotCX0KLQotCS8qKgotCSAqIGRvIHB1Ymxpc2hpbmcuIFRoZSBwdWJsaXNoaW5nIHByb2Nlc3MgaXMgZGVmaW5lZCBpbiB0aHJlZSBzdGVwcy4KLQkgKiBwcmVQdWJsaXNoIHRvIGRvIHNvbWUgcHJlcGFyYXRpb24gYmVmb3JlIHRoZSBhY3R1YWwgcHVibGlzaGluZyBkb1B1Ymxpc2gKLQkgKiB0byBwdWJsaXNoIHRoZSB2aWV3cyBhbmQgY29udGVudHMgcG9zdFB1Ymxpc2ggdG8gZG8gc29tZSBjbGVhbnVwIHdvcmsKLQkgKiBhZnRlciBwdWJsaXNoLiBFeHRlbmRlZCBjbGFzc2VzIGNhbiBvdmVycmlkZSB0aGVzZSBtZXRob2RzIHRvIGFjaGlldmUKLQkgKiBhZGRpdGlvbmFsIHB1Ymxpc2hpbmcgcmVzdWx0cy4KLQkgKiAKLQkgKiBAcGFyYW0gbW9uaXRvcgotCSAqICAgICAgICAgICAgSVByb2dyZXNzTW9uaXRvcgotCSAqIEB0aHJvd3MgUHVibGlzaGluZ1NlcnZpY2VFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBwdWJsaXNoKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLQkJCXRocm93cyBQdWJsaXNoaW5nU2VydmljZUV4Y2VwdGlvbiB7Ci0KLQkJaWYgKG9wdGlvbnMgIT0gbnVsbCkgewotCQkJb3B0aW9ucy52YWxpZGF0ZSgpOwotCQl9Ci0KLQkJLy8gY2xlYXIgdGhlIGZpbGUgbmFtZSBjYWNoZSBzbyB0aGF0IHRoZSBmaWxlIG5hbWUgd2lsbCBiZSBiYXNlZCBvbiB0aGUgbGF0ZXN0IGxpYnJhcnkgZGF0YQotCQkvLyB0aGlzIGNhbiBhdm9pZCB0aGUgY2FzZXMgd2hlcmUgZWxlbWVudCBuYW1lIGNoYW5nZWQgYmVmb3JlIHB1Ymxpc2hpbmcKLQkJRmlsZU5hbWVHZW5lcmF0b3IuSU5TVEFOQ0UuY2xlYXIoKTsKLQkJCi0JCWxvbmcgYmVnaW5UaW1lID0gMEw7Ci0JCWxvbmcgc3RhcnRUaW1lID0gMEw7Ci0KLQkJLy8gZG8gYSBnYyBiZWZvcmUgZ2V0dGluZyBzdGFyZWQKLQkJUnVudGltZS5nZXRSdW50aW1lKCkuZ2MoKTsKLQkJCi0JCXRyeSB7Ci0JCQlpZiAocHJvZmlsaW5nKSB7Ci0JCQkJYmVnaW5UaW1lID0gc3RhcnRUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCQl9Ci0JCQkKLQkJCXByZVB1Ymxpc2gobW9uaXRvcik7Ci0JCQlpZiAocHJvZmlsaW5nKSB7Ci0JCQkJRGVidWdUcmFjZS5wcmludCh0aGlzLCAicHJlUHVibGlzaCIsIC8vJE5PTi1OTFMtMSQKLQkJCQkJCShTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHN0YXJ0VGltZSkgKyAiIG1zIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQotCQkJaWYgKHByb2ZpbGluZykgewotCQkJCXN0YXJ0VGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQkJfQotCQkJCQkJCi0JCQlkb1B1Ymxpc2gobW9uaXRvcik7Ci0JCQlpZiAocHJvZmlsaW5nKSB7Ci0JCQkJRGVidWdUcmFjZS5wcmludCh0aGlzLCAiZG9QdWJsaXNoIiwgLy8kTk9OLU5MUy0xJAotCQkJCQkJKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gc3RhcnRUaW1lKSArICIgbXMiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCi0JCQlpZiAocHJvZmlsaW5nKSB7Ci0JCQkJc3RhcnRUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCQl9Ci0JCQlwb3N0UHVibGlzaChtb25pdG9yKTsKLQkJCWlmIChwcm9maWxpbmcpIHsKLQkJCQlEZWJ1Z1RyYWNlLnByaW50KHRoaXMsICJwb3N0UHVibGlzaCIsIC8vJE5PTi1OTFMtMSQKLQkJCQkJCShTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHN0YXJ0VGltZSkgKyAiIG1zIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQotCQkJc3VjY2VzcyA9IHRydWU7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgUHVibGlzaGluZ1NlcnZpY2VFeGNlcHRpb24oZSk7Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAocHJvZmlsaW5nKSB7Ci0JCQkJU3lzdGVtLm91dAotCQkJCQkJLnByaW50bG4oIlRpbWUgdGFrZW4gdG8gcHVibGlzaCBjb25maWd1cmF0aW9uICciICsgY29uZmlnLmdldE5hbWUoKSAvLyROT04tTkxTLTEkCi0JCQkJCQkJCSsgIic6ICIgKyAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBiZWdpblRpbWUpICsgIiBtcyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCBDb2xsZWN0aW9uPFJlc291cmNlPiBsb2FkTGlicmFyeShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJLy8gZmlyc3Qgb2YgYWxsLCB3ZSBuZWVkIHRvIGxvYWQgdGhlIGxpYnJhcnksCi0JCS8vIG90aGVyd2lzZSwgc29tZSByZWxhdGlvbnNoaXBzIGFuZCBvcHBvc2l0ZSBmZWF0dXJlcyBhcmUgbm90Ci0JCS8vIGVzdGFibGlzaGVkCi0JCWxvbmcgc3RhcnRUaW1lID0gMEw7Ci0JCW1vbml0b3Iuc3ViVGFzayhQdWJsaXNoaW5nUmVzb3VyY2VzLmxvYWRMaWJyYXJ5VGFza19uYW1lKTsKLQkJaWYgKHByb2ZpbGluZykgewotCQkJc3RhcnRUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCX0KLQkJCi0JCUNvbGxlY3Rpb248UmVzb3VyY2U+IGNoYW5nZWRSZXNvdXJjZXMgPSBMaWJyYXJ5VXRpbC5sb2FkQWxsKChNZXRob2RMaWJyYXJ5KSBjb25maWcuZUNvbnRhaW5lcigpKTsKLQkJaWYgKHByb2ZpbGluZykgewotCQkJRGVidWdUcmFjZS5wcmludCh0aGlzLCAibG9hZExpYnJhcnkiLCAiTGlicmFyeVV0aWwubG9hZEFsbDogIiAvLyROT04tTkxTLTEkICAvLyROT04tTkxTLTIkCi0JCQkJCQkJKyAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBzdGFydFRpbWUpCi0JCQkJCQkJKyAiIG1zIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCXJldHVybiBjaGFuZ2VkUmVzb3VyY2VzOwotCX0KLQkKLS8vCXByb3RlY3RlZCB2b2lkIHVubG9hZFJlc291cmNlcyhDb2xsZWN0aW9uPFJlc291cmNlPiByZXNvdXJjZXMpIHsKLS8vCQkKLS8vCQkvL1J1bnRpbWUuZ2V0UnVudGltZSgpLmdjKCk7Ci0vLwkJLy9sb25nIG0xID0gUnVudGltZS5nZXRSdW50aW1lKCkuZnJlZU1lbW9yeSgpLzEwMDAwMDA7Ci0vLwkJUGVyc2lzdGVuY2VVdGlsLnVubG9hZChyZXNvdXJjZXMpOwotLy8JCS8vUnVudGltZS5nZXRSdW50aW1lKCkuZ2MoKTsJCQotLy8JCS8vbG9uZyBtMiA9IFJ1bnRpbWUuZ2V0UnVudGltZSgpLmZyZWVNZW1vcnkoKS8xMDAwMDAwOwotLy8JCS8vU3lzdGVtLm91dC5wcmludGxuKCIqKiogIiArIExvbmcudG9TdHJpbmcobTItbTEpICsgIiBNQiBmcmVlZCBieSB1bmxvYWRpbmcgcmVzb3VyY2VzIik7Ci0vLwl9Ci0vLwotLy8JcHJvdGVjdGVkIHZvaWQgZGlzcG9zZURpYWdyYW1NYW5hZ2VycyhDb2xsZWN0aW9uPERpYWdyYW1NYW5hZ2VyPiBtZ3JzLCBDb2xsZWN0aW9uPERpYWdyYW1NYW5hZ2VyPiBrZWVwbGlzdCkgewotLy8JCWZvciAoIEl0ZXJhdG9yPERpYWdyYW1NYW5hZ2VyPiBpdCA9IG1ncnMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOyApIHsKLS8vCQkJRGlhZ3JhbU1hbmFnZXIgbWdyID0gaXQubmV4dCgpOwotLy8JCQlpZiAoIGtlZXBsaXN0ID09IG51bGwgfHwgIWtlZXBsaXN0LmNvbnRhaW5zKG1ncikgKSB7Ci0vLwkJCQltZ3IuZGlzcG9zZSgpOwotLy8JCQl9Ci0vLwkJfQotLy8JfQotCQotCS8qKgotCSAqIERpc3Bvc2VzIHRoZSBvYmplY3QuIE9uY2UgZGlzcG9zZWQsIHRoZSBvYmplY3QgaXMgbm90IHZhbGlkIGFueSBtb3JlLgotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWlmICh2aWV3QnVpbGRlciAhPSBudWxsKSB7Ci0JCQl2aWV3QnVpbGRlci5kaXNwb3NlKCk7Ci0JCQl2aWV3QnVpbGRlciA9IG51bGw7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBhYnN0cmFjdCBtZXRob2QgdG8gZ2V0IHRoZSB1cmwgdG8gdGhlIHB1Ymxpc2hlZCBzaXRlCi0JICogCi0JICogQHJldHVybiBTdHJpbmcgdGhlIHVybAotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0UHVibGlzaGVkVXJsKCk7Ci0KLQkvKioKLQkgKiBhYnN0cmFjdCBtZXRob2QgdG8gZ2V0IHRoZSB1cmwgdG8gdGhlIHB1Ymxpc2ggcmVwb3J0Ci0JICogCi0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldFB1Ymxpc2hSZXBvcnRVcmwoKTsKLQotCXByb3RlY3RlZCBhYnN0cmFjdCBBYnN0cmFjdFZpZXdCdWlsZGVyIGNyZWF0ZVZpZXdCdWlsZGVyKCk7Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBwcmVQdWJsaXNoKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLQkJCXRocm93cyBFeGNlcHRpb247Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBkb1B1Ymxpc2goSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQotCQkJdGhyb3dzIEV4Y2VwdGlvbjsKLQotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIHBvc3RQdWJsaXNoKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLQkJCXRocm93cyBFeGNlcHRpb247Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy9zZXJ2aWNlcy9BYnN0cmFjdFNpdGVHZW5lcmF0b3IuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy9zZXJ2aWNlcy9BYnN0cmFjdFNpdGVHZW5lcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTA0ODA0Zi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvc2VydmljZXMvQWJzdHJhY3RTaXRlR2VuZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcuc2VydmljZXM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkZpbGVMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuRmlsZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LkJvb2ttYXJrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5IdG1sQnVpbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuTGF5b3V0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLlB1Ymxpc2hpbmdQbHVnaW47Ci0KLS8qKgotICogVGhlIGFic3RyYWN0IGJhc2UgY2xhc3MgZm9yIGEgU2l0ZSBHZW5lcmF0b3IuCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFNpdGVHZW5lcmF0b3IgaW1wbGVtZW50cyBJU2l0ZUdlbmVyYXRvciB7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRE9DX1JPT1QgPSAiZG9jcm9vdC8iOyAvLyROT04tTkxTLTEkOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFdFQl9JTkZfUEFUSCA9ICJkb2Nyb290L1dFQi1JTkYiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFdFQl9JTkZfRElSID0gIldFQi1JTkYiOyAvLyROT04tTkxTLTEkCi0JCi0JcHJvdGVjdGVkIFN0cmluZyBwdWJEaXI7Ci0JcHJvdGVjdGVkIFB1Ymxpc2hIVE1MT3B0aW9ucyBvcHRpb25zOwotCXByb3RlY3RlZCBIdG1sQnVpbGRlciBidWlsZGVyOwotCQotCXB1YmxpYyBBYnN0cmFjdFNpdGVHZW5lcmF0b3IoSHRtbEJ1aWxkZXIgYnVpbGRlciwgUHVibGlzaEhUTUxPcHRpb25zIG9wdGlvbnMpIHsKLQkJdGhpcy5vcHRpb25zID0gb3B0aW9uczsKLQkJdGhpcy5idWlsZGVyID0gYnVpbGRlcjsKLQkJdGhpcy5wdWJEaXIgPSBidWlsZGVyLmdldFB1Ymxpc2hEaXIoKTsKLQl9Ci0KLQlwdWJsaWMgYWJzdHJhY3QgSHRtbEJ1aWxkZXIgZ2V0SHRtbEJ1aWxkZXIoKTsKLQotCXB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0SW5kZXhGaWxlUGF0aCgpOwotCi0JcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXROb2RlSWNvblBhdGgoKTsgCi0KLQlwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldERlZmF1bHRCYW5uZXJJbWFnZUZpbGUoKTsKLQkKLQlwdWJsaWMgYWJzdHJhY3QgUHVibGlzaE9wdGlvbnMgZ2V0UHVibGlzaE9wdGlvbnMoKTsKLQotCXB1YmxpYyBhYnN0cmFjdCB2b2lkIHBvc3RQdWJsaXNoKCkgdGhyb3dzIEV4Y2VwdGlvbjsKLQotCXB1YmxpYyBhYnN0cmFjdCB2b2lkIHByZVB1Ymxpc2goKSB0aHJvd3MgRXhjZXB0aW9uOwotCQotCXB1YmxpYyBhYnN0cmFjdCB2b2lkIHdyaXRlUHVibGlzaGVkQm9va21hcmtzKExpc3QgYm9va21hcmtzLCBCb29rbWFyayBkZWZhdWx0VmlldykKLQkJCXRocm93cyBFeGNlcHRpb247Ci0JCi0JcHJvdGVjdGVkIHZvaWQgY29weUN1c3RvbWl6ZWRGaWxlcygpIHRocm93cyBFeGNlcHRpb24gewotCQlpZiAob3B0aW9ucy5iYW5uZXJJbWFnZSAhPSBudWxsICYmIG9wdGlvbnMuYmFubmVySW1hZ2UubGVuZ3RoKCkgPiAwKSB7Ci0JCQlGaWxlVXRpbC5jb3B5RmlsZShvcHRpb25zLmJhbm5lckltYWdlLCBwdWJEaXIgKyAiaW1hZ2VzIik7IC8vJE5PTi1OTFMtMSQKLQkJCW9wdGlvbnMuYmFubmVySW1hZ2UgPSBGaWxlVXRpbC5nZXRGaWxlTmFtZShvcHRpb25zLmJhbm5lckltYWdlKTsKLQkJfSBlbHNlIHsKLQkJCW9wdGlvbnMuYmFubmVySW1hZ2UgPSBnZXREZWZhdWx0QmFubmVySW1hZ2VGaWxlKCk7Ci0JCX0KLQkJCi0JCWlmIChvcHRpb25zLmlzUHVibGlzaER5bmFtaWNXZWJBcHAoKSkgewotCQkJVVJMIHBsdWdpbl91cmwgPSBQdWJsaXNoaW5nUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbnN0YWxsVVJMKCk7Ci0JCQlTdHJpbmcgcGF0aCA9IEZpbGVMb2NhdG9yLnJlc29sdmUobmV3IFVSTChwbHVnaW5fdXJsLCBXRUJfSU5GX1BBVEgpKS5nZXRQYXRoKCk7Ci0JCQlTdHJpbmcgaW5jbHVkZXMgPSAiKi4qLCAqKi8iOyAvLyROT04tTkxTLTEkCi0JCQlMYXlvdXRSZXNvdXJjZXMuY29weURpcihwYXRoLCBwdWJEaXIgKyBXRUJfSU5GX0RJUiwgaW5jbHVkZXMsIG51bGwpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY29weUxvY2FsaXplZEZpbGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJLy8gY29weSBzY3JpcHRzLCByZW5hbWUgdGhlIGxvY2Fsc2Ugc3BlY2lmaWMgbmFtZSB0byB0aGUgZGVmYXVsdAotCQkvLyBuYW1lCi0JCVB1Ymxpc2hpbmdQbHVnaW4KLQkJCQkuZ2V0RGVmYXVsdCgpCi0JCQkJLmNvcHlMb2NhbGl6ZWRGaWxlcygKLQkJCQkJCURPQ19ST09UICsgInNjcmlwdHMvIiwgbmV3IEZpbGUocHViRGlyLCAic2NyaXB0cy8iKSwgdHJ1ZSwgZmFsc2UpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCQlQdWJsaXNoaW5nUGx1Z2luLmdldERlZmF1bHQoKS5jb3B5TG9jYWxpemVkRmlsZXMoCi0JCQkJRE9DX1JPT1QgKyAiaW1hZ2VzLyIsIG5ldyBGaWxlKHB1YkRpciwgImltYWdlcy8iKSwgdHJ1ZSwgZmFsc2UpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCQlQdWJsaXNoaW5nUGx1Z2luLmdldERlZmF1bHQoKS5jb3B5TG9jYWxpemVkRmlsZXMoRE9DX1JPT1QsCi0JCQkJbmV3IEZpbGUocHViRGlyLCAiLyIpLCBmYWxzZSwgZmFsc2UpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCX0KLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFZpZXdEYXRhRmlsZU5hbWUoQm9va21hcmsgYiwgU3RyaW5nIGV4dCkgewotCQlGaWxlIGYgPSBuZXcgRmlsZShiLmdldEZpbGVOYW1lKCkpOwotCQlTdHJpbmcgZmlsZU5hbWUgPSBmLmdldE5hbWUoKTsKLQkJaW50IGkgPSBmaWxlTmFtZS5sYXN0SW5kZXhPZigiLiIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChpID49IDApIHsKLQkJCWZpbGVOYW1lID0gZmlsZU5hbWUuc3Vic3RyaW5nKDAsIGkpOwotCQl9Ci0KLQkJcmV0dXJuIGZpbGVOYW1lICsgZXh0OyAvLyROT04tTkxTLTEkCi0JfQotCQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWlmICggYnVpbGRlciAhPSBudWxsICkgewotCQkJYnVpbGRlci5nZXRMYXlvdXRNYW5hZ2VyKCkuY2xlYXIoKTsKLQkJCWJ1aWxkZXIuZGlzcG9zZSgpOwotCQkJYnVpbGRlciA9IG51bGw7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvc2VydmljZXMvQWJzdHJhY3RWaWV3QnVpbGRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3NlcnZpY2VzL0Fic3RyYWN0Vmlld0J1aWxkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTVmNjFjYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvc2VydmljZXMvQWJzdHJhY3RWaWV3QnVpbGRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQ5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnNlcnZpY2VzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEubmV0LlVSSTsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS5uZXQuVVJMRGVjb2RlcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLkZpbGVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuQm9va21hcms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LkVsZW1lbnRMYXlvdXRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5IdG1sQnVpbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuSUVsZW1lbnRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5JY29uVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5QdWJsaXNoaW5nUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLlB1Ymxpc2hpbmdSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50Q2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmliYWJsZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLnV0aWwuT3Bwb3NpdGVGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLS8qKgotICogVGhlIGFic3RyYWN0IGJhc2UgY2xhc3MgZm9yIGFsbCBwdWJsaXNoaW5nIHZpZXcgYnVpbGRlcnMuCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBhdXRob3IgV2VpcGluZyBMdQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RWaWV3QnVpbGRlciB7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBUSU1FT1VUX0lOVEVSVkFMID0gNjAwMDAwOyAvLyBpbiBtaWxsaXNlY29uZHMKLQotCXByb3RlY3RlZCBzdGF0aWMgYm9vbGVhbiBwcm9maWxpbmcgPSBQdWJsaXNoaW5nUGx1Z2luLmdldERlZmF1bHQoKQotCQkJLmlzUHJvZmlsaW5nKCk7Ci0KLQlwcm90ZWN0ZWQgSVNpdGVHZW5lcmF0b3Igc2l0ZUdlbmVyYXRvcjsKLQotCXByb3RlY3RlZCBQdWJsaXNoT3B0aW9ucyBvcHRpb25zOwotCi0JcHJvdGVjdGVkIE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnOwotCi0JcHJvdGVjdGVkIEJvb2ttYXJrIGRlZmF1bHRWaWV3OwotCi0JUHVibGlzaGluZ1J1bm5hYmxlIHJ1bm5hYmxlID0gbnVsbDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICogCi0JICogQHBhcmFtIGdlbmVyYXRvcgotCSAqICAgICAgICAgICAgYSBzaXRlIGdlbmVyYXRvcgotCSAqLwotCXB1YmxpYyBBYnN0cmFjdFZpZXdCdWlsZGVyKElTaXRlR2VuZXJhdG9yIGdlbmVyYXRvcikgewotCQl0aGlzLnNpdGVHZW5lcmF0b3IgPSBnZW5lcmF0b3I7Ci0JCXRoaXMub3B0aW9ucyA9IGdlbmVyYXRvci5nZXRQdWJsaXNoT3B0aW9ucygpOwotCQl0aGlzLmNvbmZpZyA9IGdlbmVyYXRvci5nZXRIdG1sQnVpbGRlcigpLmdldExheW91dE1hbmFnZXIoKQotCQkJCS5nZXRDb25maWd1cmF0aW9uKCk7Ci0JCXRoaXMucnVubmFibGUgPSBuZXcgUHVibGlzaGluZ1J1bm5hYmxlKGdlbmVyYXRvci5nZXRIdG1sQnVpbGRlcigpLCBUSU1FT1VUX0lOVEVSVkFMKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBzaXRlIGdlbmVyYXRvci4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBzaXRlIGdlbmVyYXRvciBhc3NpZ25lZCB0byB0aGlzIHZpZXcgYnVpbGRlcgotCSAqLwotCXB1YmxpYyBJU2l0ZUdlbmVyYXRvciBnZXRTaXRlR2VuZXJhdG9yKCkgewotCQlyZXR1cm4gdGhpcy5zaXRlR2VuZXJhdG9yOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIEhUTUwgYnVpbGRlci4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBIVE1MIGJ1aWxkZXIgYXNzaWduZWQgdG8gdGhpcyB2aWV3IGJ1aWxkZXIKLQkgKi8KLQlwdWJsaWMgSHRtbEJ1aWxkZXIgZ2V0SHRtbEJ1aWxkZXIoKSB7Ci0JCXJldHVybiB0aGlzLnNpdGVHZW5lcmF0b3IuZ2V0SHRtbEJ1aWxkZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBwdWJsaXNoaW5nIG9wdGlvbnMuCi0JICogCi0JICogQHJldHVybiB0aGUgcHVibGlzaGluZyBvcHRpb25zIGFzc2lnbmVkIHRvIHRoaXMgdmlldyBidWlsZGVyCi0JICovCi0JcHVibGljIFB1Ymxpc2hPcHRpb25zIGdldE9wdGlvbnMoKSB7Ci0JCXJldHVybiB0aGlzLnNpdGVHZW5lcmF0b3IuZ2V0UHVibGlzaE9wdGlvbnMoKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBsYXlvdXQgbWFuYWdlci4KLQkgKiAKLQkgKiBAcmV0dXJuIGFuIGVsZW1lbnQgbGF5b3V0IG1hbmFnZXIgYXNzaWduZWQgdG8gdGhpcyB2aWV3IGJ1aWxkZXIKLQkgKi8KLQlwdWJsaWMgRWxlbWVudExheW91dE1hbmFnZXIgZ2V0TGF5b3V0TWdyKCkgewotCQlyZXR1cm4gZ2V0SHRtbEJ1aWxkZXIoKS5nZXRMYXlvdXRNYW5hZ2VyKCk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgY29udGVudCB2YWxpZGF0b3IuCi0JICogCi0JICogQHJldHVybiBhbiBlbGVtZW50IGxheW91dCBtYW5hZ2VyIGFzc2lnbmVkIHRvIHRoaXMgdmlldyBidWlsZGVyCi0JICovCi0JcHVibGljIFB1Ymxpc2hpbmdDb250ZW50VmFsaWRhdG9yIGdldFZhbGlkYXRvcigpIHsKLQkJcmV0dXJuIChQdWJsaXNoaW5nQ29udGVudFZhbGlkYXRvcikgZ2V0SHRtbEJ1aWxkZXIoKS5nZXRWYWxpZGF0b3IoKTsKLQl9Ci0KLQkvKioKLQkgKiBDaGVja3Mgd2hldGhlciBhIG1ldGhvZCBlbGVtZW50IGNhbiBiZSBwdWJsaXNoZWQgb3Igbm90LgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogICAgICAgICAgICBhIG1ldGhvZCBlbGVtZW50Ci0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgbWV0aG9kIGVsZW1lbnQgY2FuIGJlIHB1Ymxpc2hlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGNhblB1Ymxpc2goTWV0aG9kRWxlbWVudCBlbGVtZW50KSB7Ci0JCXJldHVybiBpc1Zpc2libGUoZWxlbWVudCk7Ci0JfQotCi0JLyoqCi0JICogQ2hlY2tzIHdoZXRoZXIgYSBtZXRob2QgZWxlbWVudCB3aWxsIGJlIHZpc2libGUgaW4gdGhlIHB1Ymxpc2hlZCB3ZWIKLQkgKiBzaXRlLgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogICAgICAgICAgICBhIG1ldGhvZCBlbGVtZW50Ci0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgbWV0aG9kIGVsZW1lbnQgd2lsbCBiZSB2aXNpYmxlIGluIHRoZQotCSAqICAgICAgICAgcHVibGlzaGVkIHdlYiBzaXRlCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNWaXNpYmxlKE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgewotCQlpZiAoZWxlbWVudCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlpZiAoZ2V0VmFsaWRhdG9yKCkuaXNEaXNjYXJkZWQobnVsbCwgbnVsbCwgZWxlbWVudCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCWlmICghQ29uZmlndXJhdGlvbkhlbHBlci5jYW5TaG93KGVsZW1lbnQsIGNvbmZpZykpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCWlmIChvcHRpb25zLmlzUHVibGlzaFByb2Nlc3MoKSkgewotCQkJcmV0dXJuIGdldFZhbGlkYXRvcigpLmluQ2xvc3VyZShlbGVtZW50KTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZGlzY2FyZEVtcHR5Q2F0ZWdvcnkoQ29udGVudENhdGVnb3J5IGVsZW1lbnQsIGJvb2xlYW4gZGlzY2FyZCkgewotCQlpZiAoZGlzY2FyZCkgewotCQkJZ2V0VmFsaWRhdG9yKCkuc2V0RGlzY2FyZGVkRWxlbWVudChlbGVtZW50KTsKLQkJCWdldFZhbGlkYXRvcigpLmxvZ1dhcm5pbmcoZWxlbWVudCwKLQkJCQkJUHVibGlzaGluZ1Jlc291cmNlcy5kaXNjYXJlZENhdGVnb3J5V2FybmluZ19tc2cpOwotCQl9IGVsc2UgewotCQkJZ2V0VmFsaWRhdG9yKCkuYWRkVmFsaWRDYXRlZ29yeSgoQ29udGVudENhdGVnb3J5KSBlbGVtZW50KTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBNZXRob2RFbGVtZW50IGNhbGMwMUZlYXR1cmVWYWx1ZShNZXRob2RFbGVtZW50IGVsZW1lbnQsCi0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSkgewotCQlyZXR1cm4gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMDFGZWF0dXJlVmFsdWUoZWxlbWVudCwgZmVhdHVyZSwKLQkJCQlnZXRMYXlvdXRNZ3IoKS5nZXRFbGVtZW50UmVhbGl6ZXIoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIExpc3QgY2FsYzBuRmVhdHVyZVZhbHVlKE1ldGhvZEVsZW1lbnQgZWxlbWVudCwKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKSB7Ci0JCXJldHVybiBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwbkZlYXR1cmVWYWx1ZShlbGVtZW50LCBmZWF0dXJlLAotCQkJCWdldExheW91dE1ncigpLmdldEVsZW1lbnRSZWFsaXplcigpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgTWV0aG9kRWxlbWVudCBjYWxjMDFGZWF0dXJlVmFsdWUoTWV0aG9kRWxlbWVudCBlbGVtZW50LAotCQkJT3Bwb3NpdGVGZWF0dXJlIGZlYXR1cmUpIHsKLQkJcmV0dXJuIENvbmZpZ3VyYXRpb25IZWxwZXIuY2FsYzAxRmVhdHVyZVZhbHVlKGVsZW1lbnQsIGZlYXR1cmUsCi0JCQkJZ2V0TGF5b3V0TWdyKCkuZ2V0RWxlbWVudFJlYWxpemVyKCkpOwotCX0KLQotCXByb3RlY3RlZCBMaXN0IGNhbGMwbkZlYXR1cmVWYWx1ZShNZXRob2RFbGVtZW50IGVsZW1lbnQsCi0JCQlPcHBvc2l0ZUZlYXR1cmUgZmVhdHVyZSkgewotCQlyZXR1cm4gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMG5GZWF0dXJlVmFsdWUoZWxlbWVudCwgZmVhdHVyZSwKLQkJCQlnZXRMYXlvdXRNZ3IoKS5nZXRFbGVtZW50UmVhbGl6ZXIoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIExpc3QgZ2V0UHVibGlzaGVkRWxlbWVudHMoKSB7Ci0JCXJldHVybiBnZXRWYWxpZGF0b3IoKS5nZXRQdWJsaXNoZWRFbGVtZW50cygpOwotCX0KLQotCQotCS8qKgotCSAqIFB1Ymxpc2hlcyB0aGUgZWxlbWVudCwgY29sbGVjdHMgdGhlIGxpbmtlZCBlbGVtZW50cyBpbiB0aGUgcHVibGlzaGVkCi0JICogY29udGVudC4KLQkgKiAKLQkgKiBAcGFyYW0gbW9uaXRvcgotCSAqICAgICAgICAgICAgYSBwcm9ncmVzcyBtb25pdG9yCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGVsZW1lbnQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwdWJsaXNoKGZpbmFsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwKLQkJCWZpbmFsIE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgewotCQkKLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCItLS0gQmVnaW4gcHVibGlzaGluZyBlbGVtZW50ICIgKwotCQkvLyBlbGVtZW50LmdldEd1aWQoKSArICI6IiArIGVsZW1lbnQuZ2V0VHlwZSgpLmdldE5hbWUoKSArICI6IiArCi0JCS8vIGVsZW1lbnQuZ2V0TmFtZSgpICk7Ci0JCXRyeSB7Ci0JCQlMaXN0IGxpbmtlZEVsZW1lbnRzID0gZ2V0VmFsaWRhdG9yKCkKLQkJCQkJLmdldFJlZmVyZW5jZWRFbGVtZW50cygpOwotCQkJTGlzdCBwdWJsaXNoZWRFbGVtZW50cyA9IGdldFZhbGlkYXRvcigpCi0JCQkJCS5nZXRQdWJsaXNoZWRFbGVtZW50cygpOwkJCQkJCi0JCQlIdG1sQnVpbGRlciBodG1sQnVpbGRlciA9IGdldEh0bWxCdWlsZGVyKCk7Ci0JCQlpZiAoIWNhblB1Ymxpc2goZWxlbWVudCkpIHsKLQkJCQlodG1sQnVpbGRlci5nZXRWYWxpZGF0b3IoKS5sb2dXYXJuaW5nKGVsZW1lbnQsCi0JCQkJCQlQdWJsaXNoaW5nUmVzb3VyY2VzLmludmFsaWRFbGVtZW50V2FybmluZ19tc2cpOwotCQkJfSBlbHNlIGlmICghcHVibGlzaGVkRWxlbWVudHMuY29udGFpbnMoZWxlbWVudCkpIHsKLQkJCQl0cnkgewotCQkJCQlpZiAobW9uaXRvciAhPSBudWxsKSB7Ci0JCQkJCQlTdHJpbmcgc3RyOwotCQkJCQkJaWYgKGxpbmtlZEVsZW1lbnRzICE9IG51bGwpIHsKLQkJCQkJCQlzdHIgPSBOTFMKLQkJCQkJCQkJCS5iaW5kKAotCQkJCQkJCQkJCQlQdWJsaXNoaW5nUmVzb3VyY2VzLnB1Ymxpc2hpbmdMaW5rZWRFbGVtZW50VGFza19uYW1lLAotCQkJCQkJCQkJCQlJbnRlZ2VyCi0JCQkJCQkJCQkJCQkJLnRvU3RyaW5nKHB1Ymxpc2hlZEVsZW1lbnRzCi0JCQkJCQkJCQkJCQkJCQkuc2l6ZSgpKSwKLQkJCQkJCQkJCQkJSW50ZWdlcgotCQkJCQkJCQkJCQkJCS50b1N0cmluZyhsaW5rZWRFbGVtZW50cwotCQkJCQkJCQkJCQkJCQkJLnNpemUoKSkpOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlzdHIgPSBOTFMKLQkJCQkJCQkJCS5iaW5kKAotCQkJCQkJCQkJCQlQdWJsaXNoaW5nUmVzb3VyY2VzLnB1Ymxpc2hpbmdFbGVtZW50VGFza19uYW1lLAotCQkJCQkJCQkJCQllbGVtZW50LmdldFR5cGUoKS5nZXROYW1lKCksCi0JCQkJCQkJCQkJCWVsZW1lbnQuZ2V0TmFtZSgpKTsKLQkJCQkJCX0KLQkJCQkJCW1vbml0b3Iuc3ViVGFzayhzdHIpOwotCi0JCQkJCX0KLQkJCQkJSUVsZW1lbnRMYXlvdXQgbGF5b3V0ID0gaHRtbEJ1aWxkZXIKLQkJCQkJCQkuZ2V0TGF5b3V0TWFuYWdlcigpCi0JCQkJCQkJLmdldExheW91dChlbGVtZW50LCB0cnVlKTsKLS8vCQkJCQlTdHJpbmcgaHRtbGZpbGUgPSBodG1sQnVpbGRlci5nZW5lcmF0ZUh0bWwobGF5b3V0KTsKLQkJCQkJU3RyaW5nIGh0bWxmaWxlID0gcnVubmFibGUuZ2VuZXJhdGVIdG1sKGxheW91dCk7Ci0JCQkJCWVsZW1lbnRQdWJsaXNoZWQobGF5b3V0LCBodG1sZmlsZSk7Ci0KLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCQkJaHRtbEJ1aWxkZXIKLQkJCQkJCQkuZ2V0VmFsaWRhdG9yKCkKLQkJCQkJCQkubG9nRXJyb3IoCi0JCQkJCQkJCQllbGVtZW50LAotCQkJCQkJCQkJTkxTCi0JCQkJCQkJCQkJCS5iaW5kKAotCQkJCQkJCQkJCQkJCVB1Ymxpc2hpbmdSZXNvdXJjZXMucHVibGlzaEVsZW1lbnRFcnJvcl9tc2csCi0JCQkJCQkJCQkJCQkJZXguZ2V0TWVzc2FnZSgpKSwKLQkJCQkJCQkJCWV4KTsKLQkJCQl9Ci0JCQkJcHVibGlzaGVkRWxlbWVudHMuYWRkKGVsZW1lbnQpOwotCQkJfSBlbHNlIHsKLQkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkFscmVhZHkgZ2VuZXJhdGVkOiAiICsKLQkJCQkvLyBnZXRVUkwoZWxlbWVudCkgKTsKLQkJCX0KLQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCQlnZXRIdG1sQnVpbGRlcigpCi0JCQkJCS5nZXRWYWxpZGF0b3IoKQotCQkJCQkubG9nRXJyb3IoCi0JCQkJCQkJZWxlbWVudCwKLQkJCQkJCQlOTFMKLQkJCQkJCQkJCS5iaW5kKAotCQkJCQkJCQkJCQlQdWJsaXNoaW5nUmVzb3VyY2VzLnB1Ymxpc2hFbGVtZW50RXJyb3JfbXNnLAotCQkJCQkJCQkJCQllLmdldE1lc3NhZ2UoKSksIGUpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZWxlbWVudFB1Ymxpc2hlZChJRWxlbWVudExheW91dCBsYXlvdXQsIFN0cmluZyBodG1sZmlsZSkgewotCX0KLQotCXByaXZhdGUgdm9pZCBjb3B5Tm9kZUljb24oRmlsZSBzb3VyY2UpIHsKLQkJU3RyaW5nIG5hbWUgPSBzb3VyY2UuZ2V0TmFtZSgpOwotCi0JCUZpbGUgZGVzdCA9IG5ldyBGaWxlKHNpdGVHZW5lcmF0b3IuZ2V0Tm9kZUljb25QYXRoKCksIG5hbWUpOwotCQlpZiAoRmlsZVV0aWwuY29weUZpbGUoc291cmNlLCBkZXN0KSA9PSBmYWxzZSkgewotCQkJZ2V0SHRtbEJ1aWxkZXIoKS5nZXRWYWxpZGF0b3IoKS5sb2dXYXJuaW5nKAotCQkJCQlOTFMuYmluZChQdWJsaXNoaW5nUmVzb3VyY2VzLmNvcHlGaWxlV2FybmluZ19tc2csIHNvdXJjZQotCQkJCQkJCS5nZXRBYnNvbHV0ZVBhdGgoKSwgZGVzdC5nZXRBYnNvbHV0ZVBhdGgoKSkpOwotCQl9Ci0KLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBnZXROb2RlSWNvbk5hbWUoT2JqZWN0IG9iaikgewotCQlGaWxlIGljb25GaWxlID0gbnVsbDsKLQkJU3RyaW5nIGljb25OYW1lID0gbnVsbDsKLQotCQlpZiAob2JqIGluc3RhbmNlb2YgRGVzY3JpYmFibGVFbGVtZW50KSB7Ci0JCQlVUkkgdXJpID0gKChEZXNjcmliYWJsZUVsZW1lbnQpIG9iaikuZ2V0Tm9kZWljb24oKTsKLQkJCQotCQkJVmFyaWFiaWxpdHlFbGVtZW50IHVyaUluaGVyaXRpbmdCYXNlID0gbnVsbDsKLQkJCWlmICh1cmkgPT0gbnVsbCAmJiBjb25maWcgIT0gbnVsbCAmJiBvYmogaW5zdGFuY2VvZiBWYXJpYWJpbGl0eUVsZW1lbnQpIHsKLQkJCQlWYXJpYWJpbGl0eUVsZW1lbnRbXSB1cmlJbmhlcml0aW5nQmFzZXMgPSBuZXcgVmFyaWFiaWxpdHlFbGVtZW50WzFdOwotCQkJCXVyaSA9IENvbmZpZ3VyYXRpb25IZWxwZXIuZ2V0SW5oZXJpdGluZ1VyaSgoRGVzY3JpYmFibGVFbGVtZW50KSBvYmosIHVyaSwgdXJpSW5oZXJpdGluZ0Jhc2VzLCBjb25maWcsIDApOwotCQkJCXVyaUluaGVyaXRpbmdCYXNlID0gdXJpSW5oZXJpdGluZ0Jhc2VzWzBdOwotCQkJfQotCi0JCQlTdHJpbmcgZWxlbWVudE5hbWUgPSAoKERlc2NyaWJhYmxlRWxlbWVudCkgb2JqKS5nZXRUeXBlKCkuZ2V0TmFtZSgpCi0JCQkJCS50b0xvd2VyQ2FzZSgpOwotCQkJaWYgKERlZmF1bHRFbGVtZW50VHlwZVJlc291cmNlcy51c2VEZWZhdWx0SWNvbihlbGVtZW50TmFtZSkpCi0JCQkJdXJpID0gbnVsbDsKLQotCQkJaWYgKHVyaSAhPSBudWxsKSB7Ci0JCQkJLy8gdHJ5IGlmIHRoaXMgaXMgYSB2YWxpZCBVUkwgb3Igbm90Ci0JCQkJYm9vbGVhbiBpc0Z1bGxQYXRoID0gZmFsc2U7Ci0JCQkJdHJ5IHsKLQkJCQkJVVJMIHVybCA9IHVyaS50b1VSTCgpOwotCQkJCQlpZiAodXJsICE9IG51bGwpIHsKLQkJCQkJCWljb25GaWxlID0gbmV3IEZpbGUoVVJMRGVjb2Rlci5kZWNvZGUodXJsLmdldEZpbGUoKSwKLQkJCQkJCQkJIlVURi04IikpOyAvLyROT04tTkxTLTEkCi0JCQkJCQlpc0Z1bGxQYXRoID0gdHJ1ZTsKLQkJCQkJfQotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJCQkvLyBub3QgYSB2YWxpZCB1cmwsIG1heWJlIGEgcmVsYXRpdmUgcGF0aAotCQkJCX0KLQotCQkJCWlmICghaXNGdWxsUGF0aCkgewotCQkJCQkvLyBpY29uRmlsZSA9IG5ldwotCQkJCQkvLyBGaWxlKExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnlQYXRoKCksCi0JCQkJCS8vIFVSTERlY29kZXIuZGVjb2RlKHVyaS50b1N0cmluZygpKSk7Ci0JCQkJCS8vIFRvIGhhbmRsZSB0aGUgbm9kZUljb24gdXJpLCBFUEYgMS4yLCBpdHMgY2hhbmdlZCBub3cgaXQKLQkJCQkJLy8gaXMgcmVsYXRpdmUgdG8gcGx1Z2luIHBhdGguCi0JCQkJCWljb25GaWxlID0gbmV3IEZpbGUoCi0JCQkJCQkJVG5nVXRpbC5nZXRGdWxsUGF0aG9mTm9kZW9yU2hhcGVJY29uVVJJKAotCQkJCQkJCQkJdXJpSW5oZXJpdGluZ0Jhc2UgPT0gbnVsbCA/IChFT2JqZWN0KSBvYmogOiB1cmlJbmhlcml0aW5nQmFzZSwgdXJpKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJaWYgKChpY29uRmlsZSAhPSBudWxsKSAmJiAhaWNvbkZpbGUuZXhpc3RzKCkpIHsKLQkJCWljb25GaWxlID0gbnVsbDsKLQkJfQotCi0JCWlmIChpY29uRmlsZSA9PSBudWxsKSB7Ci0JCQkvLyBnZXQgdGhlIGRlZmF1bHQgaWNvbiBuYW1lCi0JCQlpZiAob2JqIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJCVN0cmluZyB0eXBlID0gKChNZXRob2RFbGVtZW50KSBvYmopLmdldFR5cGUoKS5nZXROYW1lKCkKLQkJCQkJCS50b0xvd2VyQ2FzZSgpOwotCQkJCWljb25GaWxlID0gSWNvblV0aWwuZ2V0Tm9kZUljb25GaWxlKHR5cGUpOwotCQkJfQotCQl9Ci0KLQkJaWYgKGljb25GaWxlICE9IG51bGwpIHsKLQkJCS8vIG5lZWQgdG8gY29weSB0aGUgZmlsZSB0b2dldGhlciBhbmQgemlwIGZvciB0aGUgYXBwbGV0Ci0JCQlpZiAoIWljb25GaWxlLmV4aXN0cygpKSB7Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCQkJZ2V0SHRtbEJ1aWxkZXIoKQotCQkJCQkJCS5nZXRWYWxpZGF0b3IoKQotCQkJCQkJCS5sb2dXYXJuaW5nKAotCQkJCQkJCQkJKE1ldGhvZEVsZW1lbnQpIG9iaiwKLQkJCQkJCQkJCU5MUwotCQkJCQkJCQkJCQkuYmluZCgKLQkJCQkJCQkJCQkJCQlQdWJsaXNoaW5nUmVzb3VyY2VzLm1pc3NpbmdJY29uRmlsZVdhcm5pbmdfbXNnLAotCQkJCQkJCQkJCQkJCWljb25GaWxlLmdldEFic29sdXRlUGF0aCgpKSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJZ2V0SHRtbEJ1aWxkZXIoKQotCQkJCQkJCS5nZXRWYWxpZGF0b3IoKQotCQkJCQkJCS5sb2dXYXJuaW5nKAotCQkJCQkJCQkJTkxTCi0JCQkJCQkJCQkJCS5iaW5kKAotCQkJCQkJCQkJCQkJCVB1Ymxpc2hpbmdSZXNvdXJjZXMubWlzc2luZ0ljb25GaWxlV2FybmluZ19tc2csCi0JCQkJCQkJCQkJCQkJaWNvbkZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCWNvcHlOb2RlSWNvbihpY29uRmlsZSk7Ci0JCQlpY29uTmFtZSA9IGljb25GaWxlLmdldE5hbWUoKTsKLQkJfQotCi0JCWlmIChpY29uTmFtZSA9PSBudWxsIHx8IGljb25OYW1lLmxlbmd0aCgpID09IDApIHsKLQkJCVN0cmluZyBuYW1lOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCQluYW1lID0gKChNZXRob2RFbGVtZW50KSBvYmopLmdldE5hbWUoKTsKLQkJCX0gZWxzZSB7Ci0JCQkJbmFtZSA9IG9iai50b1N0cmluZygpOwotCQkJfQotCi0JCQlnZXRIdG1sQnVpbGRlcigpLmdldFZhbGlkYXRvcigpLmxvZ1dhcm5pbmcoCi0JCQkJCU5MUy5iaW5kKFB1Ymxpc2hpbmdSZXNvdXJjZXMubWlzc2luZ0ljb25OYW1lV2FybmluZ19tc2csCi0JCQkJCQkJbmFtZSkpOwotCQl9Ci0KLQkJcmV0dXJuIGljb25OYW1lOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGRpc3BsYXkgbmFtZSBmb3IgYSBtZXRob2QgZWxlbWVudCBvciBpdGVybSBwcm92aWRlciBhZGFwdGVyLgotCSAqIAotCSAqIEBwYXJhbSBvYmoKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGVsZW1lbnQgb3IgaXRlcm0gcHJvdmlkZXIgYWRhcHRlcgotCSAqIEByZXR1cm4gdGhlIGRpc3BsYXkgbmFtZSBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldE5hbWUoT2JqZWN0IG9iaikgewotCQlTdHJpbmcgbmFtZSA9IG51bGw7Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQlNZXRob2RFbGVtZW50IGUgPSAoTWV0aG9kRWxlbWVudCkgb2JqOwotCi0JCQkvLyBjYWxjdWxhdGUgdGhlIHByZXNlbnRhdGlvbiBuYW1lLCBmb3IgZXh0ZW5kZXJzLCBnZXQgZnJvbSBiYXNlIGlmCi0JCQkvLyBuZWVkZWQKLQkJCW5hbWUgPSBDb25maWd1cmF0aW9uSGVscGVyLmdldFByZXNlbnRhdGlvbk5hbWUoZSwgY29uZmlnKTsKLQkJCWlmIChuYW1lID09IG51bGwgfHwgbmFtZS5lcXVhbHMoIiIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQluYW1lID0gZS5nZXRDbGFzcygpLmdldE5hbWUoKTsKLQkJCQlpbnQgaW5kZXggPSBuYW1lLmxhc3RJbmRleE9mKCIuIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlpZiAoaW5kZXggPj0gMCkgewotCQkJCQluYW1lID0gbmFtZS5zdWJzdHJpbmcoaW5kZXggKyAxKTsKLQkJCQkJaWYgKG5hbWUuZW5kc1dpdGgoIkltcGwiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCQluYW1lID0gbmFtZS5zdWJzdHJpbmcoMCwgbmFtZS5sZW5ndGgoKSAtIDQpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIEl0ZW1Qcm92aWRlckFkYXB0ZXIpIHsKLQkJCUl0ZW1Qcm92aWRlckFkYXB0ZXIgcHJvdmlkZXIgPSAoSXRlbVByb3ZpZGVyQWRhcHRlcikgb2JqOwotCQkJbmFtZSA9IHByb3ZpZGVyLmdldFRleHQob2JqKTsKLQkJfQotCQlyZXR1cm4gbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBHVUlEIGZvciBhIG1ldGhvZCBlbGVtZW50LgotCSAqIAotCSAqIEBwYXJhbSBvYmoKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGVsZW1lbnQKLQkgKiBAcmV0dXJuIHRoZSBHVUlEIGZvciBhIG1ldGhvZCBlbGVtZW50IG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0R1VJRChPYmplY3Qgb2JqKSB7Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQlyZXR1cm4gKChNZXRob2RFbGVtZW50KSBvYmopLmdldEd1aWQoKTsKLQkJfSBlbHNlCi0JCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRociBVUkwgZm9yIGEgbWV0aG9kIGVsZW1lbnQuCi0JICogCi0JICogQHBhcmFtIG9iagotCSAqICAgICAgICAgICAgYSBtZXRob2QgZWxlbWVudAotCSAqIEByZXR1cm4gdGhlIFVSTCBmb3IgYSBtZXRob2QgZWxlbWVudCBvciBhIGJsYW5rIEhUTUwKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXRVUkwoT2JqZWN0IG9iaikgewotCQlpZiAob2JqIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJcmV0dXJuIGdldExheW91dE1ncigpLmdldExheW91dCgoTWV0aG9kRWxlbWVudCkgb2JqLCB0cnVlKS5nZXRVcmwoKTsKLQkJfSBlbHNlIHsKLQkJCS8vIEZJWE1FOiBsYXlvdXQgbmVlZHMgdG8gYmUgcHJvdmlkZWQgZm9yIHVuY2F0ZWdvcml6ZWQgYW5kIGNhdGVnb3J5Ci0JCQkvLyBvYmplY3QKLQkJCXJldHVybiAiYXBwbGV0Ly9lbXB0eS5odG0iOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgYm9va21hcmsgZm9yIGEgbWV0aG9kIGVsZW1lbnQKLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqICAgICAgICAgICAgYSBtZXRob2QgZWxlbWVudAotCSAqIEByZXR1cm4gYSA8Y29kZT5Cb29rbWFyazwvY29kZT4KLQkgKi8KLQlwcm90ZWN0ZWQgQm9va21hcmsgY3JlYXRlQm9va21hcmsoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBPYmplY3QgZWxlbWVudCkgewotCQkvLyBwdWJsaXNoIHRoaXMgZWxlbWVudAotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCS8vIGRlbGF5IHRoZSBwdWJsaXNoaW5nIHRpbGwgdGhlIGJvb2ttYXJrcyBhcmUgY3JlYXRlZC4KLQkJCWdldEh0bWxCdWlsZGVyKCkuZ2V0VmFsaWRhdG9yKCkuYWRkUmVmZXJlbmNlZEVsZW1lbnQobnVsbCwKLQkJCQkJKE1ldGhvZEVsZW1lbnQpIGVsZW1lbnQpOwotCQl9Ci0KLQkJLy8gY3JlYXRlIGEgYm9va21hcmsgZm9yIHRoaXMgZWxlbWVudAotCQlTdHJpbmcgbmFtZSA9IGdldE5hbWUoZWxlbWVudCk7Ci0JCVN0cmluZyBndWlkID0gZ2V0R1VJRChlbGVtZW50KTsKLQkJU3RyaW5nIHVybCA9IGdldFVSTChlbGVtZW50KTsKLQkJU3RyaW5nIG5vZGVJY29uID0gZ2V0Tm9kZUljb25OYW1lKGVsZW1lbnQpOwotCi0JCVN0cmluZyBtc2cgPSBOTFMuYmluZChQdWJsaXNoaW5nUmVzb3VyY2VzLmdlbmVyYXRpbmdCb29rbWFya1Rhc2tfbmFtZSwKLQkJCQluYW1lKTsKLQkJbW9uaXRvci5zdWJUYXNrKG1zZyk7Ci0JCXJldHVybiBjcmVhdGVCb29rbWFyayhuYW1lLCBndWlkLCB1cmwsIG5vZGVJY29uLCBub2RlSWNvbiwgZWxlbWVudCk7Ci0JfQotCi0JcHJvdGVjdGVkIEJvb2ttYXJrIGNyZWF0ZUJvb2ttYXJrKFN0cmluZyBuYW1lLCBTdHJpbmcgZ3VpZCwgU3RyaW5nIHVybCwKLQkJCVN0cmluZyBjbG9zZUljb24sIFN0cmluZyBvcGVuSWNvbiwgT2JqZWN0IG93bmVyKSB7Ci0KLQkJQm9va21hcmsgYiA9IG5ldyBCb29rbWFyayhuYW1lKTsKLQkJYi5zZXRQcmVzZW50YXRpb25OYW1lKG5hbWUpOwotCQliLnNldFVuaXF1ZUlkKGd1aWQpOwotCQliLnNldENsb3NlZEljb25OYW1lKGNsb3NlSWNvbik7Ci0JCWIuc2V0T3Blbkljb25OYW1lKG9wZW5JY29uKTsKLQkJYi5zZXRGaWxlTmFtZSh1cmwpOwotCQliLnNldEZyb21Db250ZW50TGlicmFyeSh0cnVlKTsKLQkJYi5zZXRFbmFibGVkKHRydWUpOwotCQliLnNldEV4aXN0KHRydWUpOwotCQliLnNldFZpc2libGUodHJ1ZSk7Ci0JCWIuc2V0VHJhbnNwYXJlbmN5KGZhbHNlKTsKLQkJYi5zZXREZWZhdWx0KHRydWUpOwotCQliLnNldEN1cnJlbnQoZmFsc2UpOwotCQliLnNldE93bmVyKG93bmVyKTsKLQkJcmV0dXJuIGI7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgZGVmYXVsdCB2aWV3LgotCSAqIAotCSAqIEByZXR1cm4gYSA8Y29kZT5Cb29rbWFyazwvY29kZT4gdGhhdCBlbmNhcHN1bGF0ZXMgdGhlIGRlZmF1bHQgdmlldwotCSAqLwotCXB1YmxpYyBCb29rbWFyayBnZXREZWZhdWx0VmlldygpIHsKLQkJcmV0dXJuIGRlZmF1bHRWaWV3OwotCX0KLQotCS8qKgotCSAqIEJ1aWxkcyB0aGUgdmlld3MgYW5kIHJldHVybnMgYSBsaXN0IG9mIGJvb2ttYXJrIG9iamVjdHMuCi0JICogCi0JICogQHBhcmFtIG1vbml0b3IKLQkgKiAgICAgICAgICAgIGEgcHJvZ3Jlc3MgbW9uaXRvcgotCSAqIEByZXR1cm4gYSBsaXN0IG9mIDxjb2RlPkJvb2ttYXJrPC9jb2RlPgotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBMaXN0PEJvb2ttYXJrPiBidWlsZFZpZXdzKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcik7Ci0KLQkvKioKLQkgKiBEaXNwb3NlcyB0aGlzIG9iamVjdC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCi0JCWNvbmZpZyA9IG51bGw7Ci0JCWlmICggcnVubmFibGUgIT0gbnVsbCApIHsKLQkJCXJ1bm5hYmxlLmRpc3Bvc2UoKTsKLQkJCXJ1bm5hYmxlID0gbnVsbDsKLQkJfQotCQkKLQkJaWYgKCBzaXRlR2VuZXJhdG9yICE9IG51bGwgKSB7Ci0JCQlzaXRlR2VuZXJhdG9yLmRpc3Bvc2UoKTsKLQkJCXNpdGVHZW5lcmF0b3IgPSBudWxsOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvc2VydmljZXMvQ29uZmlndXJhdGlvblZpZXdCdWlsZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvc2VydmljZXMvQ29uZmlndXJhdGlvblZpZXdCdWlsZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2MGI4NmEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3NlcnZpY2VzL0NvbmZpZ3VyYXRpb25WaWV3QnVpbGRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcyNiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5zZXJ2aWNlczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW1Xcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VkQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24uc2VydmljZWFiaWxpdHkuRGVidWdUcmFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLkZpbGVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuU3RyVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLlRpbWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbkZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb25maWd1cmF0aW9uLlByYWN0aWNlU3ViZ3JvdXBJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLklCU0l0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuUHJvY2Vzc1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlN1cHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5Cb29rbWFyazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuSUVsZW1lbnRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LmVsZW1lbnRzLkFjdGl2aXR5TGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5lbGVtZW50cy5Qcm9jZXNzRWxlbWVudEl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LmVsZW1lbnRzLlByb2Nlc3NMYXlvdXREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5lbGVtZW50cy5TdW1tYXJ5UGFnZUxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQudXRpbC5YbWxFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuTGlicmFyeVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcuUHVibGlzaGluZ1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5QdWJsaXNoaW5nUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnV0aWwuUHVibGlzaGluZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFydGlmYWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudENhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcnlQcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpc2NpcGxpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HdWlkYW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJhY3RpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0VsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuU3VwcG9ydGluZ01hdGVyaWFsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFzazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRvb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkFzc29jaWF0aW9uSGVscGVyOwotCi0vKioKLSAqIEJ1aWxkcyB0aGUgdmlld3MgZGVmaW5lZCBmb3IgYSBtZXRob2QgY29uZmlndXJhdGlvbi4KLSAqIAotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIENvbmZpZ3VyYXRpb25WaWV3QnVpbGRlciBleHRlbmRzIEFic3RyYWN0Vmlld0J1aWxkZXIgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZJWF9SZWZlcmVuY2VfV29ya2Zsb3dzID0gIlJlZmVyZW5jZV9Xb3JrZmxvd3MiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRklYX1Rhc2tzID0gIlRhc2tzIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZJWF9SZXNwb25zaWJsZUZvcl9UYXNrcyA9ICJQcmltYXJpbHlfUGVyZm9ybXMiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRklYX1BhcnRpY2lwYXRlc0luX1Rhc2tzID0gIkFkZGl0aW9uYWxseV9QZXJmb3JtcyI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGSVhfUGVyZm9ybWluZ19Sb2xlcyA9ICJQZXJmb3JtaW5nX1JvbGVzIjsgLy8kTk9OLU5MUy0xJAotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGSVhfSW5wdXRfV29ya19Qcm9kdWN0cyA9ICJJbnB1dF9Xb3JrX1Byb2R1Y3RzIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZJWF9PdXRwdXRfV29ya19Qcm9kdWN0cyA9ICJPdXRwdXRfV29ya19Qcm9kdWN0cyI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGSVhfV29ya19Qcm9kdWN0c19DcmVhdGVkID0gIlJlc3BvbnNpYmxlX0ZvciI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGSVhfV29ya19Qcm9kdWN0c19Nb2RpZmllZCA9ICJNb2RpZmllcyI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGSVhfUmVzcG9uc2libGVfUm9sZSA9ICJSZXNwb25zaWJsZV9Sb2xlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZJWF9Db250YWluaW5nX1dvcmtfUHJvZHVjdCA9ICJDb250YWluaW5nX1dvcmtfUHJvZHVjdCI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGSVhfQ29udGFpbmVkX1dvcmtfUHJvZHVjdHMgPSAiQ29udGFpbmVkX1dvcmtfUHJvZHVjdHMiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRklYX0d1aWRhbmNlcyA9ICJHdWlkYW5jZSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGSVhfSW5wdXRUb19UYXNrID0gIklucHV0X3RvIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZJWF9PdXRwdXRPZl9UYXNrID0gIk91dHB1dF9mcm9tIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElDT05fRk9MREVSID0gRGVmYXVsdE5vZGVJY29uUmVzb3VyY2VzCi0JCQkuZ2V0SWNvbk5hbWUoImZvbGRlciIpOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9ERV9SZWZlcmVuY2VfV29ya2Zsb3dzID0gUHVibGlzaGluZ1Jlc291cmNlcy5yZWZlcmVuY2VXb3JrZmxvd3NOb2RlX3RleHQ7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBOT0RFX1Rhc2tzID0gUHVibGlzaGluZ1Jlc291cmNlcy50YXNrTm9kZV90ZXh0OyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9ERV9SZXNwb25zaWJsZUZvcl9UYXNrcyA9IFB1Ymxpc2hpbmdSZXNvdXJjZXMucHJpbWFyaWx5UGVyZm9ybXNOb2RlX3RleHQ7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBOT0RFX1BhcnRpY2lwYXRlc0luX1Rhc2tzID0gUHVibGlzaGluZ1Jlc291cmNlcy5hZGRpdGlvbmFsbHlQZXJmb3Jtc05vZGVfdGV4dDsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5PREVfUGVyZm9ybWluZ19Sb2xlcyA9IFB1Ymxpc2hpbmdSZXNvdXJjZXMucGVyZm9ybWluZ1JvbGVzTm9kZV90ZXh0OyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9ERV9JbnB1dF9Xb3JrX1Byb2R1Y3RzID0gUHVibGlzaGluZ1Jlc291cmNlcy5pbnB1dFdvcmtQcm9kdWN0c05vZGVfdGV4dDsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5PREVfT3V0cHV0X1dvcmtfUHJvZHVjdHMgPSBQdWJsaXNoaW5nUmVzb3VyY2VzLm91dHB1dFdvcmtQcm9kdWN0c05vZGVfdGV4dDsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5PREVfV29ya19Qcm9kdWN0c19DcmVhdGVkID0gUHVibGlzaGluZ1Jlc291cmNlcy5yZXNwb25zaWJsZUZvck5vZGVfdGV4dDsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5PREVfV29ya19Qcm9kdWN0c19Nb2RpZmllZCA9IFB1Ymxpc2hpbmdSZXNvdXJjZXMubW9kaWZpZXNOb2RlX3RleHQ7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBOT0RFX1Jlc3BvbnNpYmxlX1JvbGUgPSBQdWJsaXNoaW5nUmVzb3VyY2VzLnJlc3BvbnNpYmxlUm9sZU5vZGVfdGV4dDsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5PREVfQ29udGFpbmluZ19Xb3JrX1Byb2R1Y3QgPSBQdWJsaXNoaW5nUmVzb3VyY2VzLmNvbnRhaW5pbmdXb3JrUHJvZHVjdE5vZGVfdGV4dDsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5PREVfQ29udGFpbmVkX1dvcmtfUHJvZHVjdHMgPSBQdWJsaXNoaW5nUmVzb3VyY2VzLmNvbnRhaW5lZFdvcmtQcm9kdWN0c05vZGVfdGV4dDsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5PREVfR3VpZGFuY2VzID0gUHVibGlzaGluZ1Jlc291cmNlcy5ndWlkYW5jZU5vZGVfdGV4dDsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5PREVfSW5wdXRUb19UYXNrID0gUHVibGlzaGluZ1Jlc291cmNlcy5pbnB1dFRvTm9kZV90ZXh0OyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9ERV9PdXRwdXRPZl9UYXNrID0gUHVibGlzaGluZ1Jlc291cmNlcy5vdXRwdXRGcm9tTm9kZV90ZXh0OyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPQ0VTU19MQVlPVVRfREFUQV9GSUxFID0gIi9zY3JpcHRzL3Byb2Nlc3NFbGVtZW50RGF0YS5qcyI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIENsYXNzIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlckNsYXNzID0gSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzOwotCi0JcHJvdGVjdGVkIHN0YXRpYyBib29sZWFuIGRlYnVnID0gUHVibGlzaGluZ1BsdWdpbi5nZXREZWZhdWx0KCkKLQkJCS5pc0RlYnVnZ2luZygpOwotCi0JcHJvdGVjdGVkIExpc3Q8Qm9va21hcms+IGJvb2ttYXJrcyA9IG5ldyBBcnJheUxpc3Q8Qm9va21hcms+KCk7Ci0KLQlwcm90ZWN0ZWQgQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3Rvcnk7Ci0KLQlwcm90ZWN0ZWQgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yID0gbnVsbDsKLQotCXByb3RlY3RlZCBFT2JqZWN0Q29tcGFyYXRvciBuYW1lQ29tcGFyYXRvciA9IG5ldyBFT2JqZWN0Q29tcGFyYXRvcigpOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgQ29uZmlndXJhdGlvblZpZXdCdWlsZGVyKElTaXRlR2VuZXJhdG9yIHNpdGVHZW5lcmF0b3IpIHsKLQkJc3VwZXIoc2l0ZUdlbmVyYXRvcik7Ci0JfQotCi0JLyoqCi0JICogQnVpbGQgdGhlIHZpZXdzIGRlZmluZWQgaW4gdGhlIGNvbmZpZ3VyYXRpb24gYW5kIHB1Ymxpc2ggdGhlIHJlbGF0ZWQKLQkgKiBjb250ZW50cy4KLQkgKiAKLQkgKiBAcGFyYW0gbW9uaXRvcgotCSAqICAgICAgICAgICAgSVByb2dyZXNzTW9uaXRvcgotCSAqIEByZXR1cm4gTGlzdCBhIGxpc3Qgb2YgQm9va21hcmtzIGZvciB0aGUgdmlld3MKLQkgKi8KLQlwdWJsaWMgTGlzdDxCb29rbWFyaz4gYnVpbGRWaWV3cyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJdGhpcy5tb25pdG9yID0gbW9uaXRvcjsKLQotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkJ1aWxkaW5nIHZpZXdzLi4uIik7IC8vJE5PTi1OTFMtMSQKLQotCQlsb25nIHN0YXJ0VGltZSA9IDBMOwotCi0JCWlmIChjb25maWcgIT0gbnVsbCkgewotCQkJCi0vLyBhbHJlYWR5IGRvbmUgaW4gUHVibGlzaE1hbmFnZXIKLS8vCQkJLy8gZmlyc3Qgb2YgYWxsLCB3ZSBuZWVkIHRvIGxvYWQgdGhlIGxpYnJhcnksCi0vLwkJCS8vIG90aGVyd2lzZSwgc29tZSByZWxhdGlvbnNoaXBzIGFuZCBvcHBvc2l0ZSBmZWF0dXJlcyBhcmUgbm90Ci0vLwkJCS8vIGVzdGFibGlzaGVkCi0vLwkJCW1vbml0b3Iuc3ViVGFzayhQdWJsaXNoaW5nUmVzb3VyY2VzLmxvYWRMaWJyYXJ5VGFza19uYW1lKTsKLS8vCQkJaWYgKHByb2ZpbGluZykgewotLy8JCQkJc3RhcnRUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0vLwkJCX0KLS8vCQkJTGlicmFyeVV0aWwubG9hZEFsbCgoTWV0aG9kTGlicmFyeSkgY29uZmlnLmVDb250YWluZXIoKSk7Ci0vLwkJCWlmIChwcm9maWxpbmcpIHsKLS8vCQkJCURlYnVnVHJhY2UucHJpbnQodGhpcywgImJ1aWxkVmlld3MiLCAiTGlicmFyeVV0aWwubG9hZEFsbDogIiAvLyROT04tTkxTLTEkICAvLyROT04tTkxTLTIkCi0vLwkJCQkJCQkJKyAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBzdGFydFRpbWUpCi0vLwkJCQkJCQkJKyAiIG1zIik7IC8vJE5PTi1OTFMtMSQKLS8vCQkJfQotCi0JCQkvLyBjcmVhdGUgYSBmaWx0ZXIgdGhhdCBkb2VzIG5vdCBkaXNjYXJkIHRoZSBjb250cmlidXRvcnMuCi0JCQkvLyBzbyB3ZSBnZXQgdGhlIGNvbnRyaWJ1dG9ycyBpbiB0byBzaG93IGluIHRoZSBuYXZpZ2F0aW9uIHRyZWUKLQkJCUlGaWx0ZXIgY29uZmlnRmlsdGVyID0gbmV3IENvbmZpZ3VyYXRpb25GaWx0ZXIoY29uZmlnLCBmYWxzZSk7Ci0JCQlhZGFwdGVyRmFjdG9yeSA9IFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCS5nZXRDb25maWd1cmF0aW9uVmlld19BZGFwdGVyRmFjdG9yeShjb25maWdGaWx0ZXIpOwotCi0JCQlpZiAob3B0aW9ucyAhPSBudWxsICYmIG9wdGlvbnMuaXNQdWJsaXNoUHJvY2VzcygpKSB7Ci0JCQkJbWFrZVByb2Nlc3NDbG9zdXJlKCk7Ci0JCQl9Ci0KLQkJCS8vIHB1Ymxpc2ggYWxsIHRoZSB2aWV3cyBpbiB0aGUgY29uZmlndXJhdGlvbgotCQkJaWYgKHByb2ZpbGluZykgewotCQkJCXN0YXJ0VGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQkJfQotCQkJTGlzdCB2aWV3cyA9IExpYnJhcnlVdGlsLmdldFZhbGlkVmlld3MoY29uZmlnKTsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSB2aWV3cy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKSB7Ci0JCQkJCXJldHVybiBudWxsOwotCQkJCX0KLQotCQkJCUNvbnRlbnRDYXRlZ29yeSB2ID0gKENvbnRlbnRDYXRlZ29yeSkgaXQubmV4dCgpOwotCQkJCWlmICghQ29uZmlndXJhdGlvbkhlbHBlci5jYW5TaG93KHYsIGNvbmZpZykpIHsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCi0JCQkJT2JqZWN0IGVsZW1lbnQgPSBMaWJyYXJ5VXRpbC51bndyYXAodik7Ci0JCQkJQm9va21hcmsgYiA9IGNyZWF0ZUJvb2ttYXJrKHRoaXMubW9uaXRvciwgZWxlbWVudCk7Ci0KLQkJCQlpZiAodiA9PSBjb25maWcuZ2V0RGVmYXVsdFZpZXcoKSkgewotCQkJCQlzdXBlci5kZWZhdWx0VmlldyA9IGI7Ci0JCQkJfQotCi0JCQkJLy8gaXRlcmF0ZSB0aHJ1IGNvbmZpZ3VyYXRpb24gdG8gYnVpbGQgdGhlIHZpZXcKLQkJCQlpdGVyYXRlKHYsIGIpOwotCQkJCWlmIChiLmdldENoaWxkQ291bnQoKSA+IDApIHsKLQkJCQkJYm9va21hcmtzLmFkZChiKTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAocHJvZmlsaW5nKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJUaW1lIHRha2VuIHRvIHB1Ymxpc2ggYm9va21hcmtzOiAiIC8vJE5PTi1OTFMtMSQKLQkJCQkJCSsgKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gc3RhcnRUaW1lKSArICIgbXMiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCi0JCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJfQotCi0JCWlmIChwcm9maWxpbmcpIHsKLQkJCXN0YXJ0VGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQl9Ci0JCXB1Ymxpc2hSZWZlcmVuY2VFbGVtZW50cygpOwotCQlpZiAocHJvZmlsaW5nKSB7Ci0JCQlEZWJ1Z1RyYWNlLnByaW50KHRoaXMsICJwdWJsaXNoUmVmZXJlbmNlRWxlbWVudHMiLCAvLyROT04tTkxTLTEkCi0JCQkJCShTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHN0YXJ0VGltZSkgKyAiIG1zIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCS8vIGNvcHlJY29uc0Zvck5vbkFwcGxldCgpOwotCi0JCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQkvLyBzYXZlIHB1Ymxpc2hlZCBlbGVtZW50IHVybHMKLQkJaWYgKHByb2ZpbGluZykgewotCQkJc3RhcnRUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCX0KLQkJc2F2ZUVsZW1lbnRVcmxzKCk7Ci0JCWlmIChwcm9maWxpbmcpIHsKLQkJCURlYnVnVHJhY2UucHJpbnQodGhpcywgInNhdmVFbGVtZW50VXJscyIsIC8vJE5PTi1OTFMtMSQKLQkJCQkJKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gc3RhcnRUaW1lKSArICIgbXMiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJcmV0dXJuIGJvb2ttYXJrczsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgcHJvY2VzcyBlbGVtZW50IGNsb3N1cmUgaXMgZ2VuZXJhdGVkIGFzIGZvbGxvd3M6Ci0JICogPHA+Ci0JICogMS4gcHVibGlzaCB0aGUgc2VsZWN0ZWQgcHJvY2Vzc3Nlcywgd2hpY2ggYnJpbmdzIGluIGFsbCB0aGUgcmVsYXRlZAotCSAqIHByb2Nlc3MgZWxlbWVudHMKLQkgKiA8cD4KLQkgKiAyLiBwdWJsaXNoIGFsbCB0aGUgcmVmZXJlbmNlZCBwcm9jZXNzIGVsZW1lbnRzIGZyb20gc3RlcCAxLCB0aGlzIGJyaW5ncwotCSAqIGluIGFsbCB0aGUgZGlyZWN0bHkgcmVmZXJlbmNlZCBjb250ZW50IGVsZW1lbnRzLiBtYWtlIGEgZmlyc3QgbGV2ZWwKLQkgKiBjbG9zdXJlIHRvIGluY2x1ZGUgdGhlIHB1Ymxpc2hlZCBlbGVtZW50cyBhbmQgdGhlIHJlZmVyZW5jZWQgZWxlbWVudHMuCi0JICogQW55IGRpcmVjdCByZWZlcmVuY2VzIHRvIGFueSB0eXBlIG9mIGd1aWRhbmNlcyBhcmUgYWxzbyBpbiB0aGlzIGNsb3N1cmUuCi0JICogPHA+Ci0JICogMy4gcHVibGlzaCBhbGwgdGhlIHJlZmVyZW5lZCBub24tQ29udGVudENhdGVnb3J5IGNvbnRlbnQgZWxlbWVudHMgZnJvbQotCSAqIHN0ZXAgMi4gYmFzZWQgb24gdGhlIGZpcnN0IGxldmVsIGNsb3N1cmUuIFRoZSBwdXJwb3NlIG9mIHRoZSBmaXJzdCBsZXZlbAotCSAqIGNsb3N1cmUgaXMgdG8gYWxsb3cgYnJpbmcgaW4gZ3VpZGFuY2VzIHdpdGggdmFsaWQgZWxlbWVudCBsaW5rIGFuZCBhbnkKLQkgKiBvdGhlciByZWZlcmVuY2VzIHN1Y2ggYXMgYSBUYXNrIG9yIFJvbGUsIGJlaW5nIGxpbmtlZCB3aXRoIGEgbWlzc2luZwotCSAqIGVsZW1lbnQgbGluay4gVGhpcyBhZ2FpbiBicmluZ3MgaW4gYWxsIHRoZSBkaXJlY3QgcmVmZXJlbmNlcwotCSAqIDxwPgotCSAqIDQuTWFrZSB0aGUgZmluYWwgY2xvc3VyZSBieSBpbmNsdWRpbmcgdGhlIGZvbGxvd2luZyBlbGVtZW50czoKLQkgKiA8cD4KLQkgKiBhLiBhbGwgcHVibGlzaGVkIGVsZW1lbnRzIGZyb20gc3RlcCAxLDIsMy4KLQkgKiA8cD4KLQkgKiBiLiBhbGwgcmVmZXJlbmNlZCBHdWlkYW5jZXMgZnJvbSBzdGVwIDMKLQkgKiA8cD4KLQkgKiBjLiBhbGwgR3VpZGFuY2VzIG9mIHR5cGUgUHJhY3RpY2UsIFJvYWRNYXAsIFN1cG9ydGluZyBNYXRlcmlhbCwgYW5kIFRlcm0KLQkgKiBEZWZpbml0aW9uLCBpbiB0aGUgY29uZmlndXJhdGlvbgotCSAqIDxwPgotCSAqIGQuIGFsbCBDb250ZW50IENhdGVnb3JpZXMgdGhhdCBjb250YWlucyBhdCBsZWFzdCBvbmUgZWxlbWVudCBvZiB0eXBlIGEsCi0JICogYiwgb3IgYy4gYW5kIHRoZWlyIHBhcmVudCBjYXRlZ29yaWVzCi0JICogPHA+Ci0JICogVGhlIHNlbGVjdGVkIHZpZXcgaXMgcHVibGlzaGVkIGJhc2VkIG9uIHRoZSBlbGVtZW50IGNsb3N1cmUgZGVmaW5lZAotCSAqIGFib3ZlLgotCSAqLwotCXByaXZhdGUgdm9pZCBtYWtlUHJvY2Vzc0Nsb3N1cmUoKSB7Ci0JCW1vbml0b3Iuc3ViVGFzayhQdWJsaXNoaW5nUmVzb3VyY2VzLmJ1aWxkaW5nUHJvY2Vzc0Nsb3N1cmVUYXNrX25hbWUpOwotCi0JCS8vIHB1Ymxpc2ggdGhlIHNlbGVjdGVkIHByb2Nlc3NlcwotCQkvLyBuZWVkIHRvIGJ1aWxkIGEgY2xvc3VyZSBvZiBhbGwgdGhlIGVsZW1lbnRzIGludm9sdmVkIGluIHRoZQotCQkvLyBwcm9jZXNzZXMKLQkJTGlzdDxQcm9jZXNzPiBwcm9jZXNzZXMgPSBvcHRpb25zLmdldFByb2Nlc3NlcygpOwotCQlpZiAocHJvY2Vzc2VzICE9IG51bGwgJiYgcHJvY2Vzc2VzLnNpemUoKSA+IDApIHsKLQkJCWZvciAoSXRlcmF0b3I8UHJvY2Vzcz4gaXQgPSBwcm9jZXNzZXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCW1ha2VQcm9jZXNzQ2xvc3VyZShpdC5uZXh0KCkpOwotCQkJCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJLy8gbWFrZSB0aGUgZmlyc3QgbGV2ZWwgY2xvc3VyZSB0byBpbmNsdWRlIGFsbCB0aGUgcHJvY2VzcyBlbGVtZW50cyBhbmQKLQkJLy8gaXQncyByZWZlcmVuY2VkIGVsZW1lbnRzCi0JCS8vIGFueSB0aGluZyBleGNlcHQgR3VpZGFuY2VzIGFuZCBDb250ZW50Q2F0ZWdvcmllcyBvdXRzaWRlIHRoZSBjbG9zdXJlCi0JCS8vIGlzIGZpbHRlcmVkCi0JCWdldFZhbGlkYXRvcigpCi0JCQkJLmFkZENsb3N1cmVFbGVtZW50cyhnZXRWYWxpZGF0b3IoKS5nZXRQdWJsaXNoZWRFbGVtZW50cygpKTsKLQkJZ2V0VmFsaWRhdG9yKCkuYWRkQ2xvc3VyZUVsZW1lbnRzKAotCQkJCWdldFZhbGlkYXRvcigpLmdldFJlZmVyZW5jZWRFbGVtZW50cygpKTsKLQotCQkvLyBub3cgcHVibGlzaCBhbGwgcmVmZXJlbmNlZCBlbGVtZW50cywgYW55IGRpcmVjdCByZWZlcmVuY2VzIGluIHRoZQotCQkvLyBwcm9jZXNzIGVsZW1lbnRzIGFyZQotCQkvLyBwYXJ0IG9mIHRoZSBjbG9zdXJlCi0JCS8vIGRvbid0IHB1Ymxpc2ggY29udGVudCBjYXRlZ29yaWVzIGZvciBub3cgc2luY2UgdGhleSBtaWdodCBiZSBlbXB0eQotCQkvLyBhbmQgZGlzY2FyZGVkIGxhdGVyCi0JCUxpc3QgcmVmcyA9IG5ldyBBcnJheUxpc3QoZ2V0VmFsaWRhdG9yKCkuZ2V0UmVmZXJlbmNlZEVsZW1lbnRzKCkpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gcmVmcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlNZXRob2RFbGVtZW50IGUgPSAoTWV0aG9kRWxlbWVudCkgaXQubmV4dCgpOwotCQkJaWYgKCEoZSBpbnN0YW5jZW9mIENvbnRlbnRDYXRlZ29yeSkpIHsKLQkJCQlzdXBlci5wdWJsaXNoKG1vbml0b3IsIGUpOwotCi0JCQkJLy8gY29sbGVjdCBwcm9jZXNzIHNwZWNpZmljIGxheW91dCBpbmZvIHdpdGggc3VwcHJlc3Npb24gc3RhdHVzCi0JCQkJLy8gdGhpcyB3aWxsIGluY2xkdWUgdGhlIGRpYWdyYW1zIGFuZCB0aGUgc3VwcmVzc2lvbiBzdGF0ZXMgb2YKLQkJCQkvLyBlYWNoIGl0ZW0gdW5kZXIgdGhlIGN1cnJlbnQgcHJvY2VlCi0JCQkJaWYgKExpYnJhcnlVdGlsLmlzUHJvY2VzcyhlKSkgewotCQkJCQlwdWJsaXNoUHJvY2Vzc0xheW91dCgob3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzKSBlKTsKLQkJCQl9Ci0KLQkJCX0KLQkJfQotCi0JCS8vIG5vdywgYW55IHJlZmVyZW5jZWQgZ3VpZGFuY2Ugc2hvdWxkIGJlIGluIHRoZSBjbG9zdXJlLAotCQkvLyBzbyBpbmNsdWRlIHRoZW0gYW5kIG1ha2UgdGhlIGZpbmFsIGNsb3N1cmUKLQkJcmVmcy5jbGVhcigpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gZ2V0VmFsaWRhdG9yKCkuZ2V0UmVmZXJlbmNlZEVsZW1lbnRzKCkuaXRlcmF0b3IoKTsgaXQKLQkJCQkuaGFzTmV4dCgpOykgewotCQkJTWV0aG9kRWxlbWVudCBlID0gKE1ldGhvZEVsZW1lbnQpIGl0Lm5leHQoKTsKLQkJCWlmIChlIGluc3RhbmNlb2YgR3VpZGFuY2UpIHsKLQkJCQlyZWZzLmFkZChlKTsKLQkJCX0KLQkJfQotCi0JCWlmIChyZWZzLnNpemUoKSA+IDApIHsKLQkJCWdldFZhbGlkYXRvcigpLmFkZENsb3N1cmVFbGVtZW50cyhyZWZzKTsKLQkJfQotCi0JCS8vIG5vdyBhbGwgdGhlIHB1Ymxpc2hlZCBlbGVtZW50cyBhcmUgdGhlIGVsZW1lbnQgY2xvc3VyZSwgbWFrZSB0aGUKLQkJLy8gZmluYWwgY2xvc3VyZQotCQlnZXRWYWxpZGF0b3IoKS5tYWtlRWxlbWVudENsb3N1cmUoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgbWFrZVByb2Nlc3NDbG9zdXJlKG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzcyBwcm9jKSB7Ci0KLQkJaWYgKHByb2MgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJaWYgKENvbmZpZ3VyYXRpb25IZWxwZXIuY2FuU2hvdyhwcm9jLCBjb25maWcpKSB7Ci0JCQlBY3Rpdml0eUxheW91dCBsID0gbmV3IEFjdGl2aXR5TGF5b3V0KCk7Ci0JCQlsLmluaXQoZ2V0TGF5b3V0TWdyKCksIHByb2MsIHByb2MsIG51bGwpOwotCQkJbC5maW5kQWxsTGlua2VkRWxlbWVudHMoKTsKLQkJfQotCi0JCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJaWYgKENvbmZpZ3VyYXRpb25IZWxwZXIuaXNFeHRlbmRlcihwcm9jKSkgewotCQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzIGJhc2VQcm9jID0gKG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzcykgcHJvYwotCQkJCQkuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpOwotCQkJaWYgKENvbmZpZ3VyYXRpb25IZWxwZXIuaW5Db25maWcoYmFzZVByb2MsIGNvbmZpZykpIHsKLQkJCQltYWtlUHJvY2Vzc0Nsb3N1cmUoYmFzZVByb2MpOwotCQkJfQotCQl9Ci0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgcHVibGlzaFJlZmVyZW5jZUVsZW1lbnRzKCkgewotCQkvLyBub3cgcHJvY2VzcyB0aGUgcmVmZXJlbmNlZCBlbGVtZW50cyBhbmQgcHVibGlzaCB0aGUgY29udGVudHMKLQkJd2hpbGUgKGdldFZhbGlkYXRvcigpLmdldFJlZmVyZW5jZWRFbGVtZW50cygpLnNpemUoKSA+IDApIHsKLQkJCU1ldGhvZEVsZW1lbnQgZSA9IChNZXRob2RFbGVtZW50KSBnZXRWYWxpZGF0b3IoKQotCQkJCQkuZ2V0UmVmZXJlbmNlZEVsZW1lbnRzKCkucmVtb3ZlKDApOwotCi0JCQl0cnkgewotCQkJCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCi0JCQkJLy8gcmVmZXJlbmNlcyB0byBtZXRob2QgcGx1Z2lucyBhbmQgbWV0aG9kIHBhY2thZ2VzIGNhbiBiZQotCQkJCS8vIGlnbm9yZWQKLQkJCQlpZiAoZSBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbiB8fCBlIGluc3RhbmNlb2YgTWV0aG9kUGFja2FnZSkgewotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0KLQkJCQlsb25nIHN0YXJ0VGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCi0JCQkJc3VwZXIucHVibGlzaChtb25pdG9yLCBlKTsKLQotCQkJCS8vIGNvbGxlY3QgcHJvY2VzcyBzcGVjaWZpYyBsYXlvdXQgaW5mbyB3aXRoIHN1cHByZXNzaW9uIHN0YXR1cwotCQkJCS8vIHRoaXMgd2lsbCBpbmNsZHVlIHRoZSBkaWFncmFtcyBhbmQgdGhlIHN1cHJlc3Npb24gc3RhdGVzIG9mCi0JCQkJLy8gZWFjaCBpdGVtIHVuZGVyIHRoZSBjdXJyZW50IHByb2NlZQotCQkJCWlmIChMaWJyYXJ5VXRpbC5pc1Byb2Nlc3MoZSkpIHsKLQkJCQkJLy8gbG9uZyBzdGFydFRpbWUxID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCQkJCXB1Ymxpc2hQcm9jZXNzTGF5b3V0KChvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3MpIGUpOwotCQkJCQkvLyBsb25nIGVuZFRpbWUxID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiUHVibGlzaGVkIHByb2Nlc3MgIiArIGUuZ2V0TmFtZSgpICsKLQkJCQkJLy8gIjogIiArIChlbmRUaW1lMSAtIHN0YXJ0VGltZTEpICsgIiBtcyIpOwotCQkJCX0KLQotCQkJCWxvbmcgZW5kVGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQkJCWxvbmcgdGltZVRha2VuID0gZW5kVGltZSAtIHN0YXJ0VGltZTsKLQkJCQlpZiAodGltZVRha2VuID49IDUwMDApIHsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJQdWJsaXNoZWQgIiArIGUuZ2V0TmFtZSgpICsgIjogIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCQkrIHRpbWVUYWtlbiArICIgbXMiKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQkJZXgucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJZ2V0VmFsaWRhdG9yKCkubG9nRXJyb3IoZSwgIkVycm9yIHB1Ymxpc2hpbmcgZWxlbWVudCIsIGV4KTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHB1Ymxpc2hQcm9jZXNzTGF5b3V0KGZpbmFsIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzcyBlKSB7Ci0KLQkJUnVubmFibGUgcnVubmFibGUgPSBuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJQWN0aXZpdHlMYXlvdXQgbGF5b3V0ID0gbmV3IEFjdGl2aXR5TGF5b3V0KCk7Ci0JCQkJCWxheW91dC5pbml0KGdldExheW91dE1ncigpLAotCQkJCQkJCShvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3MpIGUsIG51bGwsIG51bGwpOwotCQkJCQlQcm9jZXNzTGF5b3V0RGF0YSBwZCA9IG5ldyBQcm9jZXNzTGF5b3V0RGF0YShlLmdldEd1aWQoKSk7Ci0JCQkJCWxheW91dC5sb2FkTGF5b3V0RGF0YShwZCwgdHJ1ZSwgdHJ1ZSwgdHJ1ZSk7Ci0JCQkJCXByaW50TGF5b3V0U2NyaXB0KHBkKTsKLQkJCQkJcGQuY2xlYXIoKTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZTEpIHsKLQkJCQkJZ2V0VmFsaWRhdG9yKCkKLQkJCQkJCQkubG9nRXJyb3IoCi0JCQkJCQkJCQllLAotCQkJCQkJCQkJIkVycm9yIHB1Ymxpc2hpbmcgcHJvY2VzcyBzcGVjaWZpYyBsYXlvdXQgZGF0YSIsIGUxKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQotCQkJfQotCQl9OwotCi0JCVRpbWVyIHRpbWVyID0gbmV3IFRpbWVyKCk7Ci0JCXRyeSB7Ci0KLQkJCS8vIHJ1biB0aGUgcHVibGlzaGluZyBhbmQgY2hlY2sgdGhlIHRpbWUsIGlmIHRpbWVvdXQsIHRlcm1pbmF0ZSBpdAotCQkJVGhyZWFkIHQgPSBuZXcgVGhyZWFkKHJ1bm5hYmxlKTsKLQkJCXQuc3RhcnQoKTsKLQkJCXQuam9pbihUSU1FT1VUX0lOVEVSVkFMKTsKLQkJCWlmICh0LmlzQWxpdmUoKSkgewotCQkJCS8vIHdhaXQgZm9yIHRoZSB0aHJlYWQgdG8gZGllIGFuZCBsb2cgYW4gZXJyb3IKLQkJCQl0aW1lci5zdG9wKCk7Ci0JCQkJZ2V0VmFsaWRhdG9yKCkKLQkJCQkJCS5sb2dJbmZvKAotCQkJCQkJCQllLAotCQkJCQkJCQkicHVibGlzaGluZyBwcm9jZXNzIHNwZWNpZmljIGxheW91dCBkYXRhIHRha2VzICIgKyB0aW1lci5nZXRUaW1lKCkgKyAiIG1pbmkgc2Vjb25kcyBhbHJlYWR5IGFuZCBpcyBzdGlsbCBub3QgZG9uZSB5ZXQgLi4uIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCXRpbWVyLnN0YXJ0KCk7Ci0JCQkJdC5qb2luKCk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUxKSB7Ci0JCQllMS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfSBmaW5hbGx5IHsKLQkJCXRpbWVyLnN0b3AoKTsKLQkJCWdldFZhbGlkYXRvcigpCi0JCQkJCS5sb2dJbmZvKAotCQkJCQkJCWUsCi0JCQkJCQkJdGltZXIuZ2V0VG90YWxUaW1lKCkKLQkJCQkJCQkJCSsgIiBtaW5pIHNlY29uZHMgcHVibGlzaGluZyBwcm9jZXNzIHNwZWNpZmljIGxheW91dCBkYXRhIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JfQotCi0JcHJpdmF0ZSB2b2lkIHByaW50TGF5b3V0U2NyaXB0KFByb2Nlc3NMYXlvdXREYXRhIGRhdGEpIHsKLQkJRmlsZSBvdXRwdXRGaWxlID0gbmV3IEZpbGUoZ2V0TGF5b3V0TWdyKCkuZ2V0UHVibGlzaERpcigpLAotCQkJCVBST0NFU1NfTEFZT1VUX0RBVEFfRklMRSk7IC8vJE5PTi1OTFMtMSQKLQkJUHJpbnRXcml0ZXIgcHcgPSBudWxsOwotCQl0cnkgewotCQkJLy8gY3JlYXRlIGEgc3RyZWFtIHdpdGggYXBwZW5kIGVuYWJsZWQKLQkJCUZpbGVPdXRwdXRTdHJlYW0gb3MgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShvdXRwdXRGaWxlLCB0cnVlKTsKLQotCQkJLy8gY3JlYXRlIGEgd3JpdGUgd2l0aCB1dGYtOCBlbmNvZGluZwotCQkJT3V0cHV0U3RyZWFtV3JpdGVyIHdyaXRlciA9IG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIob3MsICJ1dGYtOCIpOyAvLyROT04tTkxTLTEkCi0KLQkJCS8vIGNyZWF0ZSBhIHByaW50IHdyaXRlciB3aXRoIGF1dG8gZmx1c2gKLQkJCXB3ID0gbmV3IFByaW50V3JpdGVyKHdyaXRlciwgdHJ1ZSk7Ci0JCQlkYXRhLnByaW50KHB3KTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWdldFZhbGlkYXRvcigpLmxvZ0Vycm9yKCJ1bmFibGUgdG8gc2F2ZSBwcm9jZXNzIGxheW91dCBkYXRhIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQotCQl9IGZpbmFsbHkgewotCQkJaWYgKHB3ICE9IG51bGwpIHsKLQkJCQlwdy5mbHVzaCgpOwotCQkJCXB3LmNsb3NlKCk7Ci0JCQl9Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIEl0ZXJhdGUgdGhydSB0dWVlCi0JICogCi0JICogQHBhcmFtIG9iagotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKi8KLQlwcml2YXRlIHZvaWQgaXRlcmF0ZShPYmplY3Qgb2JqLCBCb29rbWFyayBwYXJlbnQpIHsKLQkJdHJ5IHsKLQkJCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkgewotCQkJCXJldHVybjsKLQkJCX0KLQotCQkJLy8gR2V0IHRoZSBhZGFwdGVyIGZyb20gdGhlIGZhY3RvcnkuCi0JCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIgdHJlZUl0ZW1Db250ZW50UHJvdmlkZXIgPSBudWxsOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlcikgewotCQkJCXRyZWVJdGVtQ29udGVudFByb3ZpZGVyID0gKElUcmVlSXRlbUNvbnRlbnRQcm92aWRlcikgb2JqOwotCQkJfSBlbHNlIHsKLQkJCQl0cmVlSXRlbUNvbnRlbnRQcm92aWRlciA9IChJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIpIGFkYXB0ZXJGYWN0b3J5Ci0JCQkJCQkuYWRhcHQob2JqLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkJfQotCQkKLQkJCS8vIEVpdGhlciBkZWxlZ2F0ZSB0aGUgY2FsbCBvciByZXR1cm4gbm90aGluZy4KLQkJCWlmICh0cmVlSXRlbUNvbnRlbnRQcm92aWRlciAhPSBudWxsKSB7Ci0JCQkJQ29sbGVjdGlvbiBpdGVtcyA9IHRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmdldENoaWxkcmVuKG9iaik7Ci0JCQkJZm9yIChJdGVyYXRvciBpdCA9IGl0ZW1zLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKSB7Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCX0KLQotCQkJCQkvLyBjcmVhdGUgYm9va21hcmsKLQkJCQkJT2JqZWN0IGl0b3JPYmogPSBpdC5uZXh0KCk7Ci0JCQkJCU9iamVjdCBlbGVtZW50ID0gTGlicmFyeVV0aWwudW53cmFwKGl0b3JPYmopOwotCi0JCQkJCWlmICgoZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpKSB7Ci0JCQkJCQlNZXRob2RFbGVtZW50IG1lID0gKE1ldGhvZEVsZW1lbnQpIGVsZW1lbnQ7Ci0JCQkJCQl0cnkgewotCQkJCQkJCWlmIChDb25maWd1cmF0aW9uSGVscGVyLmNhblNob3cobWUsIGNvbmZpZykpIHsKLQkJCQkJCQkJbWUgPSBDb25maWd1cmF0aW9uSGVscGVyCi0JCQkJCQkJCQkJLmdldENhbGN1bGF0ZWRFbGVtZW50KG1lLAotCQkJCQkJCQkJCQkJZ2V0TGF5b3V0TWdyKCkKLQkJCQkJCQkJCQkJCQkJLmdldEVsZW1lbnRSZWFsaXplcigpKTsKLQkJCQkJCQkJaWYgKG1lICE9IG51bGwpIHsKLQkJCQkJCQkJCWlmIChtZSBpbnN0YW5jZW9mIFRvb2wpIHsKLQkJCQkJCQkJCQlidWlsZFRvb2xTdWJUcmVlKChUb29sKSBtZSwgcGFyZW50KTsKLQkJCQkJCQkJCX0gZWxzZSBpZiAobWUgaW5zdGFuY2VvZiBEaXNjaXBsaW5lKSB7Ci0JCQkJCQkJCQkJYnVpbGREaXNjaXBsaW5lU3ViVHJlZSgoRGlzY2lwbGluZSkgbWUsCi0JCQkJCQkJCQkJCQlwYXJlbnQpOwotCQkJCQkJCQkJfQotCi0JCQkJCQkJCQkvLyBlbHNlIGlmIChtZSBpbnN0YW5jZW9mIERpc2NpcGxpbmVHcm91cGluZwotCQkJCQkJCQkJLy8gfHwgbWUgaW5zdGFuY2VvZiBEb21haW4gfHwgbWUgaW5zdGFuY2VvZgotCQkJCQkJCQkJLy8gV29ya1Byb2R1Y3RUeXBlCi0JCQkJCQkJCQkvLyB8fCBtZSBpbnN0YW5jZW9mIFJvbGVTZXRHcm91cGluZyB8fCBtZQotCQkJCQkJCQkJLy8gaW5zdGFuY2VvZiBSb2xlU2V0ICkKLQkJCQkJCQkJCWVsc2UgaWYgKG1lIGluc3RhbmNlb2YgQ29udGVudENhdGVnb3J5KSB7Ci0KLQkJCQkJCQkJCQlDb250ZW50Q2F0ZWdvcnkgY2MgPSAoQ29udGVudENhdGVnb3J5KSBtZTsKLQotCQkJCQkJCQkJCS8vIGlmIHRoZSBjb250ZW50IGNhdGVnb3J5IGlzIGVtcHR5LAotCQkJCQkJCQkJCS8vIGRvbid0IGFkZCB0byB0aGUgcGFyZW50Ci0JCQkJCQkJCQkJQm9va21hcmsgYiA9IGNyZWF0ZUJvb2ttYXJrKAotCQkJCQkJCQkJCQkJdGhpcy5tb25pdG9yLCBjYyk7Ci0JCQkJCQkJCQkJaXRlcmF0ZShpdG9yT2JqLCBiKTsKLQkJCQkJCQkJCQlpZiAob3B0aW9ucy5pc1B1Ymxpc2hFbXB0eUNhdGVnb3JpZXMoKQotCQkJCQkJCQkJCQkJfHwgYi5nZXRDaGlsZENvdW50KCkgPiAwKSB7Ci0JCQkJCQkJCQkJCXBhcmVudC5hZGRDaGlsZChiKTsKLQkJCQkJCQkJCQkJZGlzY2FyZEVtcHR5Q2F0ZWdvcnkoY2MsIGZhbHNlKTsKLQkJCQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQkJCQlkaXNjYXJkRW1wdHlDYXRlZ29yeShjYywgdHJ1ZSk7Ci0JCQkJCQkJCQkJfQotCQkJCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJCQlpZiAoaXRvck9iaiBpbnN0YW5jZW9mIFByYWN0aWNlU3ViZ3JvdXBJdGVtUHJvdmlkZXIpIHsKLQkJCQkJCQkJCQkJYnVpbGRQcmFjdGljZVN1Ymdyb3VwVHJlZShvYmosIHBhcmVudCwKLQkJCQkJCQkJCQkJCQkoUHJhY3RpY2VTdWJncm91cEl0ZW1Qcm92aWRlcikgaXRvck9iaik7Ci0JCQkJCQkJCQkJfSBlbHNlIHsJCQkJCQkJCQkJCi0JCQkJCQkJCQkJCUJvb2ttYXJrIGIgPSBjcmVhdGVCb29rbWFyayhtZSwgcGFyZW50KTsKLQkJCQkJCQkJCQkJaWYgKCFidWlsZFN1YlRyZWUoaXRvck9iaiwgbWUsIGIpKSB7Ci0JCQkJCQkJCQkJCQlpdGVyYXRlKGl0b3JPYmosIGIpOwotCQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQkJfQotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQlTdHJpbmcgbWVzc2FnZSA9ICJFcnJvciBidWlsZGluZyBuYXZpZ2F0aW9uIHRyZWUgZm9yICIgKyBMaWJyYXJ5VXRpbC5nZXRUeXBlTmFtZShtZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQlnZXRIdG1sQnVpbGRlcigpLmdldFZhbGlkYXRvcigpCi0JCQkJCQkJCQkubG9nRXJyb3IobWVzc2FnZSwgZSk7Ci0JCQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQkJCX0KLQkJCQkJfSBlbHNlIHsKLQkJCQkJCWlmIChpdG9yT2JqIGluc3RhbmNlb2YgUHJhY3RpY2VTdWJncm91cEl0ZW1Qcm92aWRlcikgewotCQkJCQkJCWJ1aWxkUHJhY3RpY2VTdWJncm91cFRyZWUob2JqLCBwYXJlbnQsIChQcmFjdGljZVN1Ymdyb3VwSXRlbVByb3ZpZGVyKSBpdG9yT2JqKTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJaXRlcmF0ZShpdG9yT2JqLCBwYXJlbnQpOwotCQkJCQkJfQotCQkJCQl9Ci0KLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlTdHJpbmcgbWVzc2FnZSA9ICJFcnJvciBidWlsZGluZyBuYXZpZ2F0aW9uIHRyZWUiOyAvLyROT04tTkxTLTEkCi0JCQlnZXRIdG1sQnVpbGRlcigpLmdldFZhbGlkYXRvcigpLmxvZ0Vycm9yKG1lc3NhZ2UsIGUpOwotCi0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogY3JlYXRlIGEgYm9va21hcmsgdW5kZXIgdGhlIHNwZWNpZmllZCBwYXJlbnQuIElmIG5vIHBhcmVudCBpcyBzcGVjaWZpZWQsCi0JICogCi0JICogQHBhcmFtIG1vbml0b3IKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIEJvb2ttYXJrIGNyZWF0ZUJvb2ttYXJrKE9iamVjdCBlbGVtZW50LCBCb29rbWFyayBwYXJlbnQpIHsKLQkJQm9va21hcmsgYiA9IGNyZWF0ZUJvb2ttYXJrKHRoaXMubW9uaXRvciwgZWxlbWVudCk7Ci0JCWlmIChwYXJlbnQgPT0gbnVsbCkgewotCQkJYm9va21hcmtzLmFkZChiKTsKLQkJfSBlbHNlIHsKLQkJCXBhcmVudC5hZGRDaGlsZChiKTsKLQkJfQotCi0JCXJldHVybiBiOwotCX0KLQotCS8qKgotCSAqIGJ1aWxkIHRoZSBzdWIgdHJlZSBmb3IgdGhlIGdpdmVuIGVsZW1lbnQuIHJldHVybiB0cnVlIGlmIHRoZSBlbGVtZW50IGlzCi0JICogaGFuZGxlZCwgZmFsc2Ugb3RoZXJ3aXNlCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiBAcGFyYW0gYm0KLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gYnVpbGRTdWJUcmVlKE9iamVjdCBvYmosIE1ldGhvZEVsZW1lbnQgZWxlbWVudCwgQm9va21hcmsgYm0pIHsKLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBUYXNrKSB7Ci0JCQlidWlsZFRhc2tTdWJUcmVlKChUYXNrKSBlbGVtZW50LCBibSk7Ci0JCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFJvbGUpIHsKLQkJCWJ1aWxkUm9sZVN1YlRyZWUoKFJvbGUpIGVsZW1lbnQsIGJtKTsKLQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgV29ya1Byb2R1Y3QpIHsKLQkJCWJ1aWxkV29ya1Byb2R1Y3RTdWJUcmVlKChXb3JrUHJvZHVjdCkgZWxlbWVudCwgYm0pOwotCQl9IGVsc2UgaWYgKExpYnJhcnlVdGlsLmlzUHJvY2VzcyhlbGVtZW50KSkgewotCQkJYnVpbGRQcm9jZXNzU3ViVHJlZShvYmosIChvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3MpIGVsZW1lbnQsIGJtKTsKLQkJfSBlbHNlIHsKLQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiTm90IGhhbmRsZWQ6ICIgKyBlbGVtZW50KTsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCXJldHVybiB0cnVlOwotCX0KLQotCXByaXZhdGUgdm9pZCBidWlsZEl0ZW1zKExpc3QgZWxlbWVudHMsIEJvb2ttYXJrIGJtKSB7Ci0JCWJ1aWxkSXRlbXMoZWxlbWVudHMsIGJtLCBmYWxzZSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkSXRlbXMoTGlzdCBlbGVtZW50cywgQm9va21hcmsgYm0sIGJvb2xlYW4gYnVpbGRTdWJUcmVlKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSBlbGVtZW50cy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0KLQkJCU1ldGhvZEVsZW1lbnQgZWxlbWVudCA9IChNZXRob2RFbGVtZW50KSBpdC5uZXh0KCk7Ci0KLQkJCS8vIGZpbHRlciBhd2F5IHRoZSBjb250YWlubWVudCBjaGlsZC1lbGVtZW50IGlmIGFueSBvZiB0aGUgcGFyZW50KHMpCi0JCQkvLyBhcmUgaW4gdGhlIGxpc3QKLQkJCS8vIDAwMzg0NjE5IC0gUHVibGlzaGVkIHNpdGU6IERpc3BsYXkgb2YgV1BzIHVuZGVyIHJlc3BvbnNpYmxlIHJvbGUKLQkJCS8vIGlmIHRoZSBjb250YWluZXIgb2YgdGhlIGVsZW1lbnQgaXMgaW4gdGhlIGxpc3QsIGlnbm9yZSBpdAotCQkJaWYgKENvbmZpZ3VyYXRpb25IZWxwZXIuaXNDb250YWlubWVudEVsZW1lbnQoZWxlbWVudCkKLQkJCQkJJiYgQ29uZmlndXJhdGlvbkhlbHBlci5pc0NvbnRhaW5lckluTGlzdChlbGVtZW50LCBlbGVtZW50cywKLQkJCQkJCQljb25maWcpKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0KLQkJCWJ1aWxkSXRlbShlbGVtZW50LCBibSwgYnVpbGRTdWJUcmVlKTsKLQkJfQotCX0KLQotCXByaXZhdGUgQm9va21hcmsgYnVpbGRJdGVtKE1ldGhvZEVsZW1lbnQgZWxlbWVudCwgQm9va21hcmsgcGFyZW50LAotCQkJYm9vbGVhbiBidWlsZFN1YlRyZWUpIHsKLQkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCUJvb2ttYXJrIGIgPSBudWxsOwotCi0JCS8vIG1ha2Ugc3VyZSB0aGUgZWxlbWVudCBpcyBzaG93YWJsZQotCQlNZXRob2RFbGVtZW50IGUgPSBDb25maWd1cmF0aW9uSGVscGVyLmdldENhbGN1bGF0ZWRFbGVtZW50KGVsZW1lbnQsCi0JCQkJZ2V0TGF5b3V0TWdyKCkuZ2V0RWxlbWVudFJlYWxpemVyKCkpOwotCQlpZiAoaXNWaXNpYmxlKGUpKSB7Ci0JCQliID0gY3JlYXRlQm9va21hcmsodGhpcy5tb25pdG9yLCBlKTsKLQkJCWlmIChiID09IG51bGwpIHsKLQkJCQlyZXR1cm4gYjsKLQkJCX0KLQotCQkJcGFyZW50LmFkZENoaWxkKGIpOwotCi0JCQlpZiAoYnVpbGRTdWJUcmVlKSB7Ci0JCQkJaWYgKGUgaW5zdGFuY2VvZiBBcnRpZmFjdCkgewotCQkJCQlidWlsZENvbnRhaW5lZEFydGlmYWN0c1N1YlRyZWUoKEFydGlmYWN0KSBlLCBiLCB0cnVlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gYjsKLQl9Ci0KLS8vCS8qKgotLy8JICogY3JlYXRlIHRoZSBmb2xkZXIgYm9va21hcmsgYW5kIGl0J3MgY2hpbGRyZW4uIGdlbmVyYXRlIHRoZSBmb2xkZXIgc3VtbWFyeQotLy8JICogcGFnZQotLy8JICogCi0vLwkgKiBAcGFyYW0gZWxlbWVudAotLy8JICogQHBhcmFtIGJtCi0vLwkgKiBAcGFyYW0gbm9kZU5hbWUKLS8vCSAqIEBwYXJhbSBpdGVtcwotLy8JICovCi0vLwotLy8JcHJpdmF0ZSBCb29rbWFyayBjcmVhdGVGb2xkZXJCb29rbWFyayhNZXRob2RFbGVtZW50IGVsZW1lbnQsIEJvb2ttYXJrIGJtLAotLy8JCQlTdHJpbmcgbm9kZU5hbWUsIExpc3QgaXRlbXMsIGJvb2xlYW4gY3JlYXRlQ2hpbGRyZW4pIHsKLS8vCQlCb29rbWFyayBiID0gbnVsbDsKLS8vCQlpZiAoaXRlbXMuc2l6ZSgpID4gMCkgewotLy8JCQlJRWxlbWVudExheW91dCBsID0gbmV3IFN1bW1hcnlQYWdlTGF5b3V0KGdldEh0bWxCdWlsZGVyKCkKLS8vCQkJCQkuZ2V0TGF5b3V0TWFuYWdlcigpLCBlbGVtZW50LCBub2RlTmFtZSwgaXRlbXMpOwotLy8JCQlTdHJpbmcgdXJsID0gbC5nZXRVcmwoKTsKLS8vCQkJZ2V0SHRtbEJ1aWxkZXIoKS5nZW5lcmF0ZUh0bWwobCk7Ci0vLwkJCWIgPSBjcmVhdGVCb29rbWFyayhub2RlTmFtZSwgRWNvcmVVdGlsLmdlbmVyYXRlVVVJRCgpLCB1cmwsCi0vLwkJCQkJSUNPTl9GT0xERVIsIElDT05fRk9MREVSLCBudWxsKTsKLS8vCQkJYm0uYWRkQ2hpbGQoYik7Ci0vLwkJCWlmIChjcmVhdGVDaGlsZHJlbikgewotLy8JCQkJYnVpbGRJdGVtcyhpdGVtcywgYik7Ci0vLwkJCX0KLS8vCQl9Ci0vLwotLy8JCXJldHVybiBiOwotLy8JfQotCi0JU2V0PFN0cmluZz4gc3VtbWFyeVBhZ2VzR2VuZXJhdGVkID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOwotCQotCXByaXZhdGUgQm9va21hcmsgY3JlYXRlRm9sZGVyQm9va21hcmsoTWV0aG9kRWxlbWVudCBlbGVtZW50LCBCb29rbWFyayBibSwKLQkJCVN0cmluZyBwcmVmaXhOYW1lLCBTdHJpbmcgbm9kZU5hbWUsIExpc3QgaXRlbXMsCi0JCQlib29sZWFuIGNyZWF0ZUNoaWxkcmVuKSB7Ci0JCUJvb2ttYXJrIGIgPSBudWxsOwotCQlpZiAoaXRlbXMuc2l6ZSgpID4gMCkgewotCQkJSUVsZW1lbnRMYXlvdXQgbCA9IG5ldyBTdW1tYXJ5UGFnZUxheW91dChnZXRIdG1sQnVpbGRlcigpCi0JCQkJCS5nZXRMYXlvdXRNYW5hZ2VyKCksIGVsZW1lbnQsIHByZWZpeE5hbWUsIG5vZGVOYW1lLCBpdGVtcyk7Ci0JCQlTdHJpbmcgdXJsID0gbC5nZXRVcmwoKTsKLQkJCQotCQkJLy8gZG9uJ3QgcmVnZW5lcmF0ZSB0aGUgcGFnZQotCQkJLy8gMjAwNjE5IC0gU3VtbWFyeSBwYWdlIGh0bWwgd2FzIGdlbmVyYXRlZCBtdWx0aXBsZSB0aW1lcyB3aGVuIHB1Ymxpc2hpbmcKLQkJCWlmICggIXN1bW1hcnlQYWdlc0dlbmVyYXRlZC5jb250YWlucyh1cmwpICkgewotCQkJCWdldEh0bWxCdWlsZGVyKCkuZ2VuZXJhdGVIdG1sKGwpOwotCQkJCXN1bW1hcnlQYWdlc0dlbmVyYXRlZC5hZGQodXJsKTsKLQkJCX0KLQkJCQotCQkJYiA9IGNyZWF0ZUJvb2ttYXJrKG5vZGVOYW1lLCBFY29yZVV0aWwuZ2VuZXJhdGVVVUlEKCksIHVybCwKLQkJCQkJSUNPTl9GT0xERVIsIElDT05fRk9MREVSLCBudWxsKTsKLQkJCWJtLmFkZENoaWxkKGIpOwotCQkJaWYgKGNyZWF0ZUNoaWxkcmVuKSB7Ci0JCQkJYnVpbGRJdGVtcyhpdGVtcywgYik7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gYjsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkUHJhY3RpY2VTdWJncm91cFRyZWUoT2JqZWN0IHByb3ZpZGVyUGFyZW50LAotCQkJQm9va21hcmsgcGFyZW50LCBQcmFjdGljZVN1Ymdyb3VwSXRlbVByb3ZpZGVyIHByb3ZpZGVyKSB7Ci0JCUNvbGxlY3Rpb24gY2hpbGRyZW4gPSBwcm92aWRlci5nZXRDaGlsZHJlbihudWxsKTsKLQkJTGlzdCBpdGVtcyA9IGNoaWxkcmVuIGluc3RhbmNlb2YgTGlzdCA/IChMaXN0KSBjaGlsZHJlbgotCQkJCTogbmV3IEFycmF5TGlzdChjaGlsZHJlbik7Ci0KLQkJaWYgKGl0ZW1zICE9IG51bGwgJiYgaXRlbXMuc2l6ZSgpID4gMCkgewotCQkJUHJhY3RpY2UgcHJhY3RpY2UgPSBwcm92aWRlci5nZXRQcmFjdGljZSgpOwotCQkJaWYgKHByYWN0aWNlID09IG51bGwpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0KLQkJCUlFbGVtZW50TGF5b3V0IGwgPSBuZXcgU3VtbWFyeVBhZ2VMYXlvdXQoZ2V0SHRtbEJ1aWxkZXIoKQotCQkJCQkuZ2V0TGF5b3V0TWFuYWdlcigpLCBwcmFjdGljZSwgcHJvdmlkZXIuZ2V0VGV4dChudWxsKSwKLQkJCQkJcHJvdmlkZXIuZ2V0VGV4dChudWxsKSwgaXRlbXMsIHByb3ZpZGVyLmdldFRleHQobnVsbCkpOwotCQkJU3RyaW5nIHVybCA9IGwuZ2V0VXJsKCk7Ci0KLQkJCWlmICghc3VtbWFyeVBhZ2VzR2VuZXJhdGVkLmNvbnRhaW5zKHVybCkpIHsKLQkJCQlnZXRIdG1sQnVpbGRlcigpLmdlbmVyYXRlSHRtbChsKTsKLQkJCQlzdW1tYXJ5UGFnZXNHZW5lcmF0ZWQuYWRkKHVybCk7Ci0JCQl9Ci0KLQkJCUJvb2ttYXJrIGIgPSBjcmVhdGVCb29rbWFyayhwcm92aWRlci5nZXRUZXh0KG51bGwpLCBFY29yZVV0aWwKLQkJCQkJLmdlbmVyYXRlVVVJRCgpLCB1cmwsIElDT05fRk9MREVSLCBJQ09OX0ZPTERFUiwgbnVsbCk7Ci0JCQlwYXJlbnQuYWRkQ2hpbGQoYik7Ci0JCQl0aGlzLml0ZXJhdGUocHJvdmlkZXIsIGIpOwotCQl9Ci0KLQl9Ci0KLQlwcml2YXRlIEJvb2ttYXJrIGJ1aWxkRGlzY2lwbGluZVN1YlRyZWUoRGlzY2lwbGluZSBlbGVtZW50LCBCb29rbWFyayBwYXJlbnQpIHsKLQkJU3RyaW5nIHVybCA9ICIiOyAvLyROT04tTkxTLTEkCi0JCUJvb2ttYXJrIGI7Ci0KLQkJLy8gbmVlZCB0byBjYWxjdWxhdGUgdGhlIHJlYWxpemVkIHZhbHVlIG9mIHRoZSBmZWF0dXJlCi0JCUxpc3QgaXRlbXNfd29ya2Zsb3cgPSBjYWxjMG5GZWF0dXJlVmFsdWUoZWxlbWVudCwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0RGlzY2lwbGluZV9SZWZlcmVuY2VXb3JrZmxvd3MoKSk7Ci0KLQkJLy8gVGFza3MgaW4gcHVibGlzaGVkIHNpdGUgdW5kZXIgRGlzY2lwbGluZXMgYXJlIGluCi0JCS8vIHJhbmRvbSBvcmRlcgotCQkvLyB1c2UgdGhlIGFkYXB0b3IgZmFjdG9yeSB0byBnZXQgdGhlIGNoaWxkcmVucwotCQkvLyBMaXN0IGl0ZW1zX3Rhc2sgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwbkZlYXR1cmVWYWx1ZShlbGVtZW50LAotCQkvLyBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXREaXNjaXBsaW5lX1Rhc2tzKCksIGNvbmZpZyk7Ci0JCUxpc3QgaXRlbXNfdGFzayA9IG5ldyBBcnJheUxpc3QoKTsKLQkJTGlzdCBpdGVtX3N1YkRpc2NpcGxpZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciB0cmVlSXRlbUNvbnRlbnRQcm92aWRlciA9IChJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIpIGFkYXB0ZXJGYWN0b3J5Ci0JCQkJLmFkYXB0KGVsZW1lbnQsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCWlmICh0cmVlSXRlbUNvbnRlbnRQcm92aWRlciAhPSBudWxsKSB7Ci0JCQlDb2xsZWN0aW9uIGl0ZW1zID0gdHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuZ2V0Q2hpbGRyZW4oZWxlbWVudCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gaXRlbXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkgewotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0KLQkJCQkvLyBjcmVhdGUgYm9va21hcmsKLQkJCQlPYmplY3QgaXRvck9iaiA9IGl0Lm5leHQoKTsKLQkJCQlPYmplY3QgZSA9IExpYnJhcnlVdGlsLnVud3JhcChpdG9yT2JqKTsKLQkJCQlpZiAoKGUgaW5zdGFuY2VvZiBUYXNrKSkgewotCQkJCQlNZXRob2RFbGVtZW50IHQgPSBDb25maWd1cmF0aW9uSGVscGVyLmdldENhbGN1bGF0ZWRFbGVtZW50KAotCQkJCQkJCShNZXRob2RFbGVtZW50KSBlLCBnZXRMYXlvdXRNZ3IoKQotCQkJCQkJCQkJLmdldEVsZW1lbnRSZWFsaXplcigpKTsKLQkJCQkJaWYgKHQgIT0gbnVsbCkgewotCQkJCQkJaXRlbXNfdGFzay5hZGQodCk7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgaWYgKGUgaW5zdGFuY2VvZiBEaXNjaXBsaW5lKSB7Ci0JCQkJCU1ldGhvZEVsZW1lbnQgZCA9IENvbmZpZ3VyYXRpb25IZWxwZXIuZ2V0Q2FsY3VsYXRlZEVsZW1lbnQoCi0JCQkJCQkJKE1ldGhvZEVsZW1lbnQpIGUsIGdldExheW91dE1ncigpCi0JCQkJCQkJCQkuZ2V0RWxlbWVudFJlYWxpemVyKCkpOwotCQkJCQlpZiAoZCAhPSBudWxsKSB7Ci0JCQkJCQlpdGVtX3N1YkRpc2NpcGxpZXMuYWRkKGQpOwotCQkJCQl9Ci0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJLy8gYWxsIGd1aWRhbmNlcwotCQlMaXN0IGl0ZW1zX2d1aWRhbmNlID0gbmV3IEFycmF5TGlzdCgpOwotCQlpdGVtc19ndWlkYW5jZS5hZGRBbGwoY2FsYzBuRmVhdHVyZVZhbHVlKGVsZW1lbnQsIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldENvbnRlbnRFbGVtZW50X0Fzc2V0cygpKSk7Ci0JCWl0ZW1zX2d1aWRhbmNlLmFkZEFsbChjYWxjMG5GZWF0dXJlVmFsdWUoZWxlbWVudCwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0Q29udGVudEVsZW1lbnRfQ2hlY2tsaXN0cygpKSk7Ci0JCWl0ZW1zX2d1aWRhbmNlLmFkZEFsbChjYWxjMG5GZWF0dXJlVmFsdWUoZWxlbWVudCwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0Q29udGVudEVsZW1lbnRfQ29uY2VwdHNBbmRQYXBlcnMoKSkpOwotCQlpdGVtc19ndWlkYW5jZS5hZGRBbGwoY2FsYzBuRmVhdHVyZVZhbHVlKGVsZW1lbnQsIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldENvbnRlbnRFbGVtZW50X0V4YW1wbGVzKCkpKTsKLQkJaXRlbXNfZ3VpZGFuY2UuYWRkQWxsKGNhbGMwbkZlYXR1cmVWYWx1ZShlbGVtZW50LCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRDb250ZW50RWxlbWVudF9HdWlkZWxpbmVzKCkpKTsKLQkJaXRlbXNfZ3VpZGFuY2UuYWRkQWxsKGNhbGMwbkZlYXR1cmVWYWx1ZShlbGVtZW50LCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRDb250ZW50RWxlbWVudF9TdXBwb3J0aW5nTWF0ZXJpYWxzKCkpKTsKLQotCQlpZiAoIW9wdGlvbnMuaXNQdWJsaXNoRW1wdHlDYXRlZ29yaWVzKCkKLQkJCQkmJiBpdGVtc193b3JrZmxvdy5zaXplKCkgKyBpdGVtc190YXNrLnNpemUoKQotCQkJCQkJKyBpdGVtc19ndWlkYW5jZS5zaXplKCkgKyBpdGVtX3N1YkRpc2NpcGxpZXMuc2l6ZSgpID09IDApIHsKLQkJCS8vIGRvIG5vdGhpbmcsIGRvbid0IHNob3cgdGhlIGZvbGRlcgotCQkJZGlzY2FyZEVtcHR5Q2F0ZWdvcnkoZWxlbWVudCwgdHJ1ZSk7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQkvLyBjcmVhdGUgdGhlIGl0ZW0gYm9va21hcmsKLQkJLy8gZG9uJ3Qgc2V0IHRvIHRoZSBwYXJlbnQgeWV0LiBtYWtlIHN1cmUgaXQncyBub3QgZW1wdHkKLQkJLy8gbmVlZCB0byBjaGVjayB0aGUgc3ViLWRpc2NpcGxpbmVzCi0JCS8vIDE1MDk4NCAtIFB1Ymxpc2hpbmc6IE5lc3RlZCBkaXNjaXBsaW5lIGlzIG5vdCBkaXNwbGF5IGluIHRoZSBwdWJsaXNoCi0JCS8vIHBhZ2UKLQkJLy8gQm9va21hcmsgYm0gPSBjcmVhdGVCb29rbWFyayhlbGVtZW50LCBwYXJlbnQpOwotCQlCb29rbWFyayBibSA9IGNyZWF0ZUJvb2ttYXJrKHRoaXMubW9uaXRvciwgZWxlbWVudCk7Ci0KLQkJLy8gc3ViLWRpc2NpcGxpbmVzIGNvbWUgZmlyc3QKLQkJaWYgKGl0ZW1fc3ViRGlzY2lwbGllcy5zaXplKCkgPiAwKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gaXRlbV9zdWJEaXNjaXBsaWVzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlEaXNjaXBsaW5lIGQgPSAoRGlzY2lwbGluZSkgaXQubmV4dCgpOwotCQkJCWJ1aWxkRGlzY2lwbGluZVN1YlRyZWUoZCwgYm0pOwotCQkJfQotCQl9Ci0KLQkJaWYgKG9wdGlvbnMuaXNQdWJsaXNoTGlnaHRXZWlnaHRUcmVlKCkpIHsKLQotCQkJQ29sbGVjdGlvbnMuc29ydChpdGVtc193b3JrZmxvdywgbmFtZUNvbXBhcmF0b3IpOwotCQkJQ29sbGVjdGlvbnMuc29ydChpdGVtc190YXNrLCBuYW1lQ29tcGFyYXRvcik7Ci0JCQlDb2xsZWN0aW9ucy5zb3J0KGl0ZW1zX2d1aWRhbmNlLCBuYW1lQ29tcGFyYXRvcik7Ci0KLQkJCWJ1aWxkSXRlbXMoaXRlbXNfd29ya2Zsb3csIGJtKTsKLQkJCWJ1aWxkSXRlbXMoaXRlbXNfdGFzaywgYm0pOwotCQkJYnVpbGRJdGVtcyhpdGVtc19ndWlkYW5jZSwgYm0pOwotCQl9IGVsc2UgewotCQkJaWYgKGl0ZW1zX3dvcmtmbG93LnNpemUoKSA+IDApIHsKLQkJCQlCb29rbWFyayB3ZkZvbGRlciA9IGNyZWF0ZUZvbGRlckJvb2ttYXJrKGVsZW1lbnQsIGJtLAotCQkJCQkJUFJFRklYX1JlZmVyZW5jZV9Xb3JrZmxvd3MsIE5PREVfUmVmZXJlbmNlX1dvcmtmbG93cywKLQkJCQkJCWl0ZW1zX3dvcmtmbG93LCBmYWxzZSk7Ci0KLQkJCQkvLyBDYXBhYmlsaXR5IFBhdHRlcm5zIGluIHRyZWVicm93c2VyIHVuZGVyCi0JCQkJLy8gZGlzY2lwbGluZXMtcmVmZXJlbmNlIHdvcmtmbG93cyBjYW5ub3QgYmUgZXhwYW5kZWQKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ID0gaXRlbXNfd29ya2Zsb3cuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpIHsKLQkJCQkJCXJldHVybiBudWxsOwotCQkJCQl9Ci0KLQkJCQkJLy8gMTc5NjA5IC0gRXhjZXB0aW9uIHdoZW4gYXNzaWduIGFjdGl2aXR5IGFzIGRpc2NpcGxpbmUncwotCQkJCQkvLyByZWZlcmVuY2VkIHdvcmtmbG93Ci0JCQkJCS8vIHRoaXMgaXMgYSBtb2RlbCBjaGFuZ2UsIHJlZmVyZW5jZWQgd29ya2Zsb3cgY2FuIGJlCi0JCQkJCS8vIEFjdGl2aXR5LAotCQkJCQkvLyBvbGQgbW9kZWwgcmVmZXJlbmNlcyBQcm9jZXNzCi0JCQkJCUFjdGl2aXR5IGFjdCA9IChBY3Rpdml0eSkgaXQubmV4dCgpOwotCQkJCQlCb29rbWFyayBibVdvcmtmbG93ID0gYnVpbGRJdGVtKGFjdCwgd2ZGb2xkZXIsIGZhbHNlKTsKLQkJCQkJYnVpbGRBY3Rpdml0eVN1YlRyZWUoYWN0LCBhY3QsIGJtV29ya2Zsb3cpOwotCQkJCX0KLQkJCX0KLQotCQkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0KLQkJCWlmIChpdGVtc190YXNrLnNpemUoKSA+IDApIHsKLQkJCQljcmVhdGVGb2xkZXJCb29rbWFyayhlbGVtZW50LCBibSwgUFJFRklYX1Rhc2tzLCBOT0RFX1Rhc2tzLAotCQkJCQkJaXRlbXNfdGFzaywgdHJ1ZSk7Ci0JCQl9Ci0KLQkJCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCi0JCQlpZiAoaXRlbXNfZ3VpZGFuY2Uuc2l6ZSgpID4gMCkgewotCQkJCWNyZWF0ZUZvbGRlckJvb2ttYXJrKGVsZW1lbnQsIGJtLCBQUkVGSVhfR3VpZGFuY2VzLAotCQkJCQkJTk9ERV9HdWlkYW5jZXMsIGl0ZW1zX2d1aWRhbmNlLCB0cnVlKTsKLQkJCX0KLQkJfQotCi0JCWlmIChvcHRpb25zLmlzUHVibGlzaEVtcHR5Q2F0ZWdvcmllcygpIHx8IGJtLmdldENoaWxkQ291bnQoKSA+IDApIHsKLQkJCXBhcmVudC5hZGRDaGlsZChibSk7Ci0JCQlkaXNjYXJkRW1wdHlDYXRlZ29yeShlbGVtZW50LCBmYWxzZSk7Ci0JCX0gZWxzZSB7Ci0JCQlkaXNjYXJkRW1wdHlDYXRlZ29yeShlbGVtZW50LCB0cnVlKTsKLQkJfQotCi0JCXJldHVybiBibTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYnVpbGRBY3Rpdml0eVN1YlRyZWUoT2JqZWN0IG9iaiwgQWN0aXZpdHkgZWxlbWVudCwgQm9va21hcmsgYm0pIHsKLQkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlMaXN0IGl0ZW1zID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCW9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzcyBwcm9jID0gVG5nVXRpbC5nZXRPd25pbmdQcm9jZXNzKGVsZW1lbnQpOwotCQlQcm9jZXNzRWxlbWVudEl0ZW0gcHJvY0l0ZW0gPSBuZXcgUHJvY2Vzc0VsZW1lbnRJdGVtKG9iaiwgZWxlbWVudCwKLQkJCQllbGVtZW50LmdldEd1aWQoKSk7Ci0KLQkJQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSA9IHN1cGVyLmdldExheW91dE1ncigpCi0JCQkJLmdldFdCU0FkYXB0ZXJGYWN0b3J5KCk7Ci0JCVN1cHByZXNzaW9uIHN1cCA9IG5ldyBTdXBwcmVzc2lvbihwcm9jKTsKLQkJaXRlcmF0ZUFjdGl2aXR5KHByb2NJdGVtLCBibSwgYWRhcHRlckZhY3RvcnksIHN1cCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkVG9vbFN1YlRyZWUoVG9vbCBlbGVtZW50LCBCb29rbWFyayBwYXJlbnQpIHsKLQkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlMaXN0IGl0ZW1zID0gY2FsYzBuRmVhdHVyZVZhbHVlKGVsZW1lbnQsIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldFRvb2xfVG9vbE1lbnRvcnMoKSk7Ci0JCWlmIChvcHRpb25zLmlzUHVibGlzaEVtcHR5Q2F0ZWdvcmllcygpIHx8IGl0ZW1zLnNpemUoKSA+IDApIHsKLQkJCUJvb2ttYXJrIGIgPSBjcmVhdGVCb29rbWFyayhlbGVtZW50LCBwYXJlbnQpOwotCQkJYnVpbGRJdGVtcyhpdGVtcywgYik7Ci0JCQlkaXNjYXJkRW1wdHlDYXRlZ29yeShlbGVtZW50LCBmYWxzZSk7Ci0JCX0gZWxzZSB7Ci0JCQlkaXNjYXJkRW1wdHlDYXRlZ29yeShlbGVtZW50LCB0cnVlKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBidWlsZFRhc2tTdWJUcmVlKFRhc2sgZWxlbWVudCwgQm9va21hcmsgYm0pIHsKLQotCQlTdHJpbmcgdXJsOwotCQlCb29rbWFyayBiOwotCi0JCUxpc3QgYWxsSXRlbXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJLy8gcGVyZm9ybWluZyByb2xlcwotCQlMaXN0IGl0ZW1zID0gbmV3IEFycmF5TGlzdCgpOwotCQlMaXN0IHJMaXN0ID0gKExpc3QpIGNhbGMwbkZlYXR1cmVWYWx1ZShlbGVtZW50LCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRUYXNrX1BlcmZvcm1lZEJ5KCkpOwotCQlpZiAockxpc3QgIT0gbnVsbCkgewotCQkJaXRlbXMuYWRkQWxsKHJMaXN0KTsKLQkJfQotCQlpdGVtcy5hZGRBbGwoY2FsYzBuRmVhdHVyZVZhbHVlKGVsZW1lbnQsIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldFRhc2tfQWRkaXRpb25hbGx5UGVyZm9ybWVkQnkoKSkpOwotCi0JCWlmIChpdGVtcy5zaXplKCkgPiAwKSB7Ci0JCQlpZiAob3B0aW9ucy5pc1B1Ymxpc2hMaWdodFdlaWdodFRyZWUoKSkgewotCQkJCUNvbGxlY3Rpb25zLnNvcnQoaXRlbXMsIG5hbWVDb21wYXJhdG9yKTsKLQkJCQlhbGxJdGVtcy5hZGRBbGwoaXRlbXMpOwotCQkJfSBlbHNlIHsKLQkJCQljcmVhdGVGb2xkZXJCb29rbWFyayhlbGVtZW50LCBibSwgUFJFRklYX1BlcmZvcm1pbmdfUm9sZXMsCi0JCQkJCQlOT0RFX1BlcmZvcm1pbmdfUm9sZXMsIGl0ZW1zLCB0cnVlKTsKLQkJCX0KLQkJfQotCi0JCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJaWYgKCFvcHRpb25zLmlzUHVibGlzaExpZ2h0V2VpZ2h0VHJlZSgpKSB7Ci0JCQkvLyBpbnB1dCB3b3JrIHByb2R1Y3RzLCBuZWVkIGEgc3VtbWFyeSBwYWdlLAotCQkJaXRlbXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlpdGVtcy5hZGRBbGwoY2FsYzBuRmVhdHVyZVZhbHVlKGVsZW1lbnQsIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCS5nZXRUYXNrX01hbmRhdG9yeUlucHV0KCkpKTsKLQkJCWl0ZW1zLmFkZEFsbChjYWxjMG5GZWF0dXJlVmFsdWUoZWxlbWVudCwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJLmdldFRhc2tfT3B0aW9uYWxJbnB1dCgpKSk7Ci0KLQkJCWlmIChpdGVtcy5zaXplKCkgPiAwKSB7Ci0JCQkJY3JlYXRlRm9sZGVyQm9va21hcmsoZWxlbWVudCwgYm0sIFBSRUZJWF9JbnB1dF9Xb3JrX1Byb2R1Y3RzLAotCQkJCQkJTk9ERV9JbnB1dF9Xb3JrX1Byb2R1Y3RzLCBpdGVtcywgdHJ1ZSk7Ci0JCQl9Ci0KLQkJCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkgewotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCi0JCS8vIG91dHB1dCB3b3JrIHByb2R1Y3RzLCBuZWVkIGEgc3VtbWFyeSBwYWdlLCBUT0RPCi0JCWl0ZW1zID0gY2FsYzBuRmVhdHVyZVZhbHVlKGVsZW1lbnQsIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldFRhc2tfT3V0cHV0KCkpOwotCi0JCWlmIChpdGVtcy5zaXplKCkgPiAwKSB7Ci0JCQlpZiAob3B0aW9ucy5pc1B1Ymxpc2hMaWdodFdlaWdodFRyZWUoKSkgewotCQkJCUNvbGxlY3Rpb25zLnNvcnQoaXRlbXMsIG5hbWVDb21wYXJhdG9yKTsKLQkJCQlhbGxJdGVtcy5hZGRBbGwoaXRlbXMpOwotCQkJfSBlbHNlIHsKLQkJCQljcmVhdGVGb2xkZXJCb29rbWFyayhlbGVtZW50LCBibSwgUFJFRklYX091dHB1dF9Xb3JrX1Byb2R1Y3RzLAotCQkJCQkJTk9ERV9PdXRwdXRfV29ya19Qcm9kdWN0cywgaXRlbXMsIHRydWUpOwotCQkJfQotCQl9Ci0KLQkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQkvLyBhbGwgZ3VpZGFuY2VzCi0JCWl0ZW1zLmNsZWFyKCk7Ci0JCWl0ZW1zLmFkZEFsbChjYWxjMG5GZWF0dXJlVmFsdWUoZWxlbWVudCwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0Q29udGVudEVsZW1lbnRfQXNzZXRzKCkpKTsKLQkJaXRlbXMuYWRkQWxsKGNhbGMwbkZlYXR1cmVWYWx1ZShlbGVtZW50LCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRDb250ZW50RWxlbWVudF9DaGVja2xpc3RzKCkpKTsKLQkJaXRlbXMuYWRkQWxsKGNhbGMwbkZlYXR1cmVWYWx1ZShlbGVtZW50LCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRDb250ZW50RWxlbWVudF9Db25jZXB0c0FuZFBhcGVycygpKSk7Ci0JCWl0ZW1zLmFkZEFsbChjYWxjMG5GZWF0dXJlVmFsdWUoZWxlbWVudCwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0Q29udGVudEVsZW1lbnRfRXhhbXBsZXMoKSkpOwotCQlpdGVtcy5hZGRBbGwoY2FsYzBuRmVhdHVyZVZhbHVlKGVsZW1lbnQsIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldENvbnRlbnRFbGVtZW50X0d1aWRlbGluZXMoKSkpOwotCQlpdGVtcy5hZGRBbGwoY2FsYzBuRmVhdHVyZVZhbHVlKGVsZW1lbnQsIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldENvbnRlbnRFbGVtZW50X1N1cHBvcnRpbmdNYXRlcmlhbHMoKSkpOwotCQkvLyBPYmplY3QgZSA9IGNhbGMwMUZlYXR1cmVWYWx1ZShlbGVtZW50LCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkvLyAuZ2V0VGFza19Fc3RpbWF0ZSgpKTsKLQkJLy8gaWYgKGUgIT0gbnVsbCkgewotCQkvLyBpdGVtcy5hZGQoZSk7Ci0JCS8vIH0KLQkJaXRlbXMuYWRkQWxsKGNhbGMwbkZlYXR1cmVWYWx1ZShlbGVtZW50LCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRUYXNrX1Rvb2xNZW50b3JzKCkpKTsKLQotCQlpZiAoaXRlbXMuc2l6ZSgpID4gMCkgewotCQkJaWYgKG9wdGlvbnMuaXNQdWJsaXNoTGlnaHRXZWlnaHRUcmVlKCkpIHsKLQkJCQlDb2xsZWN0aW9ucy5zb3J0KGl0ZW1zLCBuYW1lQ29tcGFyYXRvcik7Ci0JCQkJYWxsSXRlbXMuYWRkQWxsKGl0ZW1zKTsKLQkJCX0gZWxzZSB7Ci0JCQkJY3JlYXRlRm9sZGVyQm9va21hcmsoZWxlbWVudCwgYm0sIFBSRUZJWF9HdWlkYW5jZXMsCi0JCQkJCQlOT0RFX0d1aWRhbmNlcywgaXRlbXMsIHRydWUpOwotCQkJfQotCQl9Ci0KLQkJaWYgKG9wdGlvbnMuaXNQdWJsaXNoTGlnaHRXZWlnaHRUcmVlKCkpIHsKLQkJCWJ1aWxkSXRlbXMoYWxsSXRlbXMsIGJtKTsKLQkJfQotCi0JfQotCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkUm9sZVN1YlRyZWUoUm9sZSBlbGVtZW50LCBCb29rbWFyayBibSkgewotCQlTdHJpbmcgdXJsOwotCQlCb29rbWFyayBiOwotCi0JCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJTGlzdCBhbGxJdGVtcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQkvLyB0YXNrcywgLy8gbmVlZCBhIGdlbmVyYWwgb3ZlcnZpZXcgcGFnZSwgVE9ETwotCQkvLyBMaXN0IGl0ZW1zID0gQXNzb2NpYXRpb25IZWxwZXIuZ2V0UHJpbWFyeVRhc2tzKGVsZW1lbnQpOwotCQlMaXN0IGl0ZW1zID0gY2FsYzBuRmVhdHVyZVZhbHVlKGVsZW1lbnQsCi0JCQkJQXNzb2NpYXRpb25IZWxwZXIuUm9sZV9QcmltYXJ5X1Rhc2tzKTsKLQkJaWYgKGl0ZW1zLnNpemUoKSA+IDApIHsKLQkJCWlmIChvcHRpb25zLmlzUHVibGlzaExpZ2h0V2VpZ2h0VHJlZSgpKSB7Ci0JCQkJQ29sbGVjdGlvbnMuc29ydChpdGVtcywgbmFtZUNvbXBhcmF0b3IpOwotCQkJCWFsbEl0ZW1zLmFkZEFsbChpdGVtcyk7Ci0JCQl9IGVsc2UgewotCQkJCWNyZWF0ZUZvbGRlckJvb2ttYXJrKGVsZW1lbnQsIGJtLCBQUkVGSVhfUmVzcG9uc2libGVGb3JfVGFza3MsCi0JCQkJCQlOT0RFX1Jlc3BvbnNpYmxlRm9yX1Rhc2tzLCBpdGVtcywgdHJ1ZSk7Ci0JCQl9Ci0JCX0KLQotCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCWlmICghb3B0aW9ucy5pc1B1Ymxpc2hMaWdodFdlaWdodFRyZWUoKSkgewotCQkJLy8gc2Vjb25kYXJ5IHRhc2tzCi0JCQlpdGVtcyA9IGNhbGMwbkZlYXR1cmVWYWx1ZShlbGVtZW50LAotCQkJCQlBc3NvY2lhdGlvbkhlbHBlci5Sb2xlX1NlY29uZGFyeV9UYXNrcyk7Ci0JCQlpZiAoaXRlbXMuc2l6ZSgpID4gMCkgewotCQkJCWNyZWF0ZUZvbGRlckJvb2ttYXJrKGVsZW1lbnQsIGJtLCBQUkVGSVhfUGFydGljaXBhdGVzSW5fVGFza3MsCi0JCQkJCQlOT0RFX1BhcnRpY2lwYXRlc0luX1Rhc2tzLCBpdGVtcywgdHJ1ZSk7Ci0JCQl9Ci0JCX0KLQotCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCS8vIHJlc3BvbnNpYmxlIGZvciB3b3JrIHByb2R1Y3RzLAotCQlpdGVtcyA9IGNhbGMwbkZlYXR1cmVWYWx1ZShlbGVtZW50LCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRSb2xlX1Jlc3BvbnNpYmxlRm9yKCkpOwotCi0JCWlmIChpdGVtcy5zaXplKCkgPiAwKSB7Ci0JCQlpZiAob3B0aW9ucy5pc1B1Ymxpc2hMaWdodFdlaWdodFRyZWUoKSkgewotCQkJCUNvbGxlY3Rpb25zLnNvcnQoaXRlbXMsIG5hbWVDb21wYXJhdG9yKTsKLQkJCQlhbGxJdGVtcy5hZGRBbGwoaXRlbXMpOwotCQkJfSBlbHNlIHsKLQkJCQliID0gY3JlYXRlRm9sZGVyQm9va21hcmsoZWxlbWVudCwgYm0sCi0JCQkJCQlQUkVGSVhfV29ya19Qcm9kdWN0c19DcmVhdGVkLAotCQkJCQkJTk9ERV9Xb3JrX1Byb2R1Y3RzX0NyZWF0ZWQsIGl0ZW1zLCBmYWxzZSk7Ci0JCQkJYnVpbGRJdGVtcyhpdGVtcywgYiwgdHJ1ZSk7Ci0JCQl9Ci0JCX0KLQotCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCWlmICghb3B0aW9ucy5pc1B1Ymxpc2hMaWdodFdlaWdodFRyZWUoKSkgewotCQkJLy8gbW9kaWZpZXMgd29yayBwcm9kdWN0cywgbmVlZCBhIHN1bW1hcnkgcGFnZSwgVE9ETwotCQkJaXRlbXMgPSBjYWxjMG5GZWF0dXJlVmFsdWUoZWxlbWVudCwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJLmdldFJvbGVfTW9kaWZpZXMoKSk7Ci0JCQlpZiAoaXRlbXMuc2l6ZSgpID4gMCkgewotCQkJCWIgPSBjcmVhdGVGb2xkZXJCb29rbWFyayhlbGVtZW50LCBibSwKLQkJCQkJCVBSRUZJWF9Xb3JrX1Byb2R1Y3RzX01vZGlmaWVkLAotCQkJCQkJTk9ERV9Xb3JrX1Byb2R1Y3RzX01vZGlmaWVkLCBpdGVtcywgZmFsc2UpOwotCQkJCWJ1aWxkSXRlbXMoaXRlbXMsIGIsIHRydWUpOwotCQkJfQotCi0JCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQotCQkvLyBhbGwgZ3VpZGFuY2VzCi0JCWl0ZW1zLmNsZWFyKCk7Ci0JCWl0ZW1zLmFkZEFsbChjYWxjMG5GZWF0dXJlVmFsdWUoZWxlbWVudCwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0Q29udGVudEVsZW1lbnRfQXNzZXRzKCkpKTsKLQkJaXRlbXMuYWRkQWxsKGNhbGMwbkZlYXR1cmVWYWx1ZShlbGVtZW50LCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRDb250ZW50RWxlbWVudF9DaGVja2xpc3RzKCkpKTsKLQkJaXRlbXMuYWRkQWxsKGNhbGMwbkZlYXR1cmVWYWx1ZShlbGVtZW50LCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRDb250ZW50RWxlbWVudF9Db25jZXB0c0FuZFBhcGVycygpKSk7Ci0JCWl0ZW1zLmFkZEFsbChjYWxjMG5GZWF0dXJlVmFsdWUoZWxlbWVudCwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0Q29udGVudEVsZW1lbnRfRXhhbXBsZXMoKSkpOwotCQlpdGVtcy5hZGRBbGwoY2FsYzBuRmVhdHVyZVZhbHVlKGVsZW1lbnQsIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldENvbnRlbnRFbGVtZW50X0d1aWRlbGluZXMoKSkpOwotCQlpdGVtcy5hZGRBbGwoY2FsYzBuRmVhdHVyZVZhbHVlKGVsZW1lbnQsIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldENvbnRlbnRFbGVtZW50X1N1cHBvcnRpbmdNYXRlcmlhbHMoKSkpOwotCi0JCWlmIChpdGVtcy5zaXplKCkgPiAwKSB7Ci0JCQlpZiAob3B0aW9ucy5pc1B1Ymxpc2hMaWdodFdlaWdodFRyZWUoKSkgewotCQkJCUNvbGxlY3Rpb25zLnNvcnQoaXRlbXMsIG5hbWVDb21wYXJhdG9yKTsKLQkJCQlhbGxJdGVtcy5hZGRBbGwoaXRlbXMpOwotCQkJfSBlbHNlIHsKLQkJCQljcmVhdGVGb2xkZXJCb29rbWFyayhlbGVtZW50LCBibSwgUFJFRklYX0d1aWRhbmNlcywgTk9ERV9HdWlkYW5jZXMsIGl0ZW1zLCB0cnVlKTsKLQkJCX0KLQkJfQotCi0JCWlmIChvcHRpb25zLmlzUHVibGlzaExpZ2h0V2VpZ2h0VHJlZSgpKSB7Ci0JCQkvLyBsaWdodCB3ZWlnaHQgdHJlZSwgbm8gc3ViIGZvbGRlcnMKLQkJCWJ1aWxkSXRlbXMoYWxsSXRlbXMsIGJtKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBidWlsZFdvcmtQcm9kdWN0U3ViVHJlZShXb3JrUHJvZHVjdCBlbGVtZW50LCBCb29rbWFyayBibSkgewotCQlMaXN0IGl0ZW1zOwotCQlTdHJpbmcgdXJsID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJLy8gQm9va21hcmsgYjsKLQotCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCUxpc3QgYWxsSXRlbXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJLy8gcGVyZm9ybWluZyByb2xlcywgMC4xIHJlZmVyZW5jZSBlbGVtZW50IHdpbGwgYmUgcmVhbGl6ZWQgaW4gYnVpbGRJdGVtCi0JCS8vIG11bHRpcGxpY2l0eSBjaGFuZ2UgZm9yIG9wcG9zaXRlIGZlYXR1cmVzCi0JCS8vIFJvbGUgciA9IEFzc29jaWF0aW9uSGVscGVyLmdldFJlc3BvbnNpYmxlUm9sZShlbGVtZW50KTsKLQkJaXRlbXMgPSBjYWxjMG5GZWF0dXJlVmFsdWUoZWxlbWVudCwKLQkJCQlBc3NvY2lhdGlvbkhlbHBlci5Xb3JrUHJvZHVjdF9SZXNwb25zaWJsZVJvbGVzKTsKLQkJaWYgKGl0ZW1zLnNpemUoKSA+IDApIHsKLQkJCWlmIChvcHRpb25zLmlzUHVibGlzaExpZ2h0V2VpZ2h0VHJlZSgpKSB7Ci0JCQkJQ29sbGVjdGlvbnMuc29ydChpdGVtcywgbmFtZUNvbXBhcmF0b3IpOwotCQkJCWFsbEl0ZW1zLmFkZEFsbChpdGVtcyk7Ci0JCQl9IGVsc2UgewotCQkJCWNyZWF0ZUZvbGRlckJvb2ttYXJrKGVsZW1lbnQsIGJtLCBQUkVGSVhfUmVzcG9uc2libGVfUm9sZSwKLQkJCQkJCU5PREVfUmVzcG9uc2libGVfUm9sZSwgaXRlbXMsIHRydWUpOwotCQkJfQotCQl9Ci0KLQkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQkvLyBjb250YWluaW5nIHdvcmsgcHJvZHVjdHMsIG5lZWQgYSBzdW1tYXJ5IHBhZ2UsIFRPRE8KLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBBcnRpZmFjdCkgewotCi0JCQlpZiAoIW9wdGlvbnMuaXNQdWJsaXNoTGlnaHRXZWlnaHRUcmVlKCkpIHsKLQkJCQlXb3JrUHJvZHVjdCB3cCA9ICgoQXJ0aWZhY3QpIGVsZW1lbnQpLmdldENvbnRhaW5lckFydGlmYWN0KCk7Ci0JCQkJLy8gY3JlYXRlQm9va21hcmsoTk9ERV9Db250YWluaW5nX1dvcmtfUHJvZHVjdCwKLQkJCQkvLyBOT0RFX0NvbnRhaW5pbmdfV29ya19Qcm9kdWN0LCB1cmwsICIiLCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkvLyAvLyROT04tTkxTLTIkCi0JCQkJaWYgKHdwICE9IG51bGwpIHsKLQkJCQkJaXRlbXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCWl0ZW1zLmFkZCh3cCk7Ci0JCQkJCWNyZWF0ZUZvbGRlckJvb2ttYXJrKGVsZW1lbnQsIGJtLAotCQkJCQkJCVBSRUZJWF9Db250YWluaW5nX1dvcmtfUHJvZHVjdCwKLQkJCQkJCQlOT0RFX0NvbnRhaW5pbmdfV29ya19Qcm9kdWN0LCBpdGVtcywgdHJ1ZSk7Ci0JCQkJfQotCi0JCQkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQl9Ci0KLQkJCS8vIGNvbnRhaW5lZCB3b3JrIHByb2R1Y3RzLCBuZWVkIGEgc3VtbWFyeSBwYWdlLCBUT0RPCi0JCQkvLyBpdGVtcyA9ICgoQXJ0aWZhY3QpZWxlbWVudCkuZ2V0Q29udGFpbmVkQXJ0aWZhY3RzKCk7Ci0JCQlpdGVtcyA9IGNhbGMwbkZlYXR1cmVWYWx1ZShlbGVtZW50LCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkuZ2V0QXJ0aWZhY3RfQ29udGFpbmVkQXJ0aWZhY3RzKCkpOwotCi0JCQkvLyBtYWtlIHN1cmUgdGhlIGNvbnRhaW5lZCBlbGVtZW50cyBkb2VzIG5vdCBjb250YWluIHRoZSBjb250YWluZXIsCi0JCQkvLyB0aGlzIGlzIHBvc3NpYmxlIGR1ZSB0byByZWFsaXphdGlvbiwgc2F5LCB0aGUgY29udGFpbmluZyBlbGVtZW50Ci0JCQkvLyBjb250cmlidXRlIHRvIHRoZSBjb250YWluZXIKLQkJCWl0ZW1zLnJlbW92ZShlbGVtZW50KTsKLQotCQkJaWYgKGl0ZW1zLnNpemUoKSA+IDApIHsKLQkJCQlpZiAob3B0aW9ucy5pc1B1Ymxpc2hMaWdodFdlaWdodFRyZWUoKSkgewotCQkJCQlDb2xsZWN0aW9ucy5zb3J0KGl0ZW1zLCBuYW1lQ29tcGFyYXRvcik7Ci0JCQkJCWFsbEl0ZW1zLmFkZEFsbChpdGVtcyk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJQm9va21hcmsgYiA9IGNyZWF0ZUZvbGRlckJvb2ttYXJrKGVsZW1lbnQsIGJtLAotCQkJCQkJCVBSRUZJWF9Db250YWluZWRfV29ya19Qcm9kdWN0cywKLQkJCQkJCQlOT0RFX0NvbnRhaW5lZF9Xb3JrX1Byb2R1Y3RzLCBpdGVtcywgZmFsc2UpOwotCi0JCQkJCS8vIGZvciBlYWNoIGNvbnRhaW5lZCB3b3JrIHByb2R1Y3QsIGNyZWF0ZSB0aGUgbmVzdGVkIHN1YgotCQkJCQkvLyB0cmVlCi0JCQkJCWJ1aWxkSXRlbXMoaXRlbXMsIGIsIHRydWUpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJaWYgKCFvcHRpb25zLmlzUHVibGlzaExpZ2h0V2VpZ2h0VHJlZSgpKSB7Ci0JCQkvLyBpbnB1dCB0byB0YXNrcwotCQkJaXRlbXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlpdGVtcy5hZGRBbGwoY2FsYzBuRmVhdHVyZVZhbHVlKGVsZW1lbnQsCi0JCQkJCUFzc29jaWF0aW9uSGVscGVyLldvcmtQcm9kdWN0X01hbmRhdG9yeUlucHV0VG9fVGFza3MpKTsKLQkJCWl0ZW1zLmFkZEFsbChjYWxjMG5GZWF0dXJlVmFsdWUoZWxlbWVudCwKLQkJCQkJQXNzb2NpYXRpb25IZWxwZXIuV29ya1Byb2R1Y3RfT3B0aW9uYWxJbnB1dFRvX1Rhc2tzKSk7Ci0JCQlpZiAoaXRlbXMuc2l6ZSgpID4gMCkgewotCQkJCWNyZWF0ZUZvbGRlckJvb2ttYXJrKGVsZW1lbnQsIGJtLCBQUkVGSVhfSW5wdXRUb19UYXNrLAotCQkJCQkJTk9ERV9JbnB1dFRvX1Rhc2ssIGl0ZW1zLCB0cnVlKTsKLQkJCX0KLQotCQkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCi0JCQkvLyBvdXRwdXQgZnJvbSB0YXNrcwotCQkJaXRlbXMgPSBjYWxjMG5GZWF0dXJlVmFsdWUoZWxlbWVudCwKLQkJCQkJQXNzb2NpYXRpb25IZWxwZXIuV29ya1Byb2R1Y3RfT3V0cHV0RnJvbV9UYXNrcyk7Ci0JCQlpZiAoaXRlbXMuc2l6ZSgpID4gMCkgewotCQkJCWNyZWF0ZUZvbGRlckJvb2ttYXJrKGVsZW1lbnQsIGJtLCBQUkVGSVhfT3V0cHV0T2ZfVGFzaywKLQkJCQkJCU5PREVfT3V0cHV0T2ZfVGFzaywgaXRlbXMsIHRydWUpOwotCQkJfQotCi0JCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQotCQkvLyBhbGwgZ3VpZGFuY2VzCi0JCWl0ZW1zID0gbmV3IEFycmF5TGlzdCgpOwotCQlpdGVtcy5hZGRBbGwoY2FsYzBuRmVhdHVyZVZhbHVlKGVsZW1lbnQsIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldENvbnRlbnRFbGVtZW50X0Fzc2V0cygpKSk7Ci0JCWl0ZW1zLmFkZEFsbChjYWxjMG5GZWF0dXJlVmFsdWUoZWxlbWVudCwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0Q29udGVudEVsZW1lbnRfQ2hlY2tsaXN0cygpKSk7Ci0JCWl0ZW1zLmFkZEFsbChjYWxjMG5GZWF0dXJlVmFsdWUoZWxlbWVudCwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0Q29udGVudEVsZW1lbnRfQ29uY2VwdHNBbmRQYXBlcnMoKSkpOwotCQlpdGVtcy5hZGRBbGwoY2FsYzBuRmVhdHVyZVZhbHVlKGVsZW1lbnQsIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldENvbnRlbnRFbGVtZW50X0V4YW1wbGVzKCkpKTsKLQkJaXRlbXMuYWRkQWxsKGNhbGMwbkZlYXR1cmVWYWx1ZShlbGVtZW50LCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRDb250ZW50RWxlbWVudF9HdWlkZWxpbmVzKCkpKTsKLQkJaXRlbXMuYWRkQWxsKGNhbGMwbkZlYXR1cmVWYWx1ZShlbGVtZW50LCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRDb250ZW50RWxlbWVudF9TdXBwb3J0aW5nTWF0ZXJpYWxzKCkpKTsKLQkJLy8gT2JqZWN0IGUgPSBjYWxjMDFGZWF0dXJlVmFsdWUoZWxlbWVudCwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJLy8gLmdldFdvcmtQcm9kdWN0X0VzdGltYXRlKCkpOwotCQkvLyBpZiAoZSAhPSBudWxsKSB7Ci0JCS8vIGl0ZW1zLmFkZChlKTsKLQkJLy8gfQotCQlpdGVtcy5hZGRBbGwoY2FsYzBuRmVhdHVyZVZhbHVlKGVsZW1lbnQsIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldFdvcmtQcm9kdWN0X1JlcG9ydHMoKSkpOwotCQlpdGVtcy5hZGRBbGwoY2FsYzBuRmVhdHVyZVZhbHVlKGVsZW1lbnQsIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldFdvcmtQcm9kdWN0X1RlbXBsYXRlcygpKSk7Ci0JCWl0ZW1zLmFkZEFsbChjYWxjMG5GZWF0dXJlVmFsdWUoZWxlbWVudCwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0V29ya1Byb2R1Y3RfVG9vbE1lbnRvcnMoKSkpOwotCi0JCWlmIChpdGVtcy5zaXplKCkgPiAwKSB7Ci0JCQlpZiAob3B0aW9ucy5pc1B1Ymxpc2hMaWdodFdlaWdodFRyZWUoKSkgewotCQkJCUNvbGxlY3Rpb25zLnNvcnQoaXRlbXMsIG5hbWVDb21wYXJhdG9yKTsKLQkJCQlhbGxJdGVtcy5hZGRBbGwoaXRlbXMpOwotCQkJfSBlbHNlIHsKLQkJCQljcmVhdGVGb2xkZXJCb29rbWFyayhlbGVtZW50LCBibSwgUFJFRklYX0d1aWRhbmNlcywKLQkJCQkJCU5PREVfR3VpZGFuY2VzLCBpdGVtcywgdHJ1ZSk7Ci0JCQl9Ci0JCX0KLQotCQlpZiAob3B0aW9ucy5pc1B1Ymxpc2hMaWdodFdlaWdodFRyZWUoKSkgewotCQkJYnVpbGRJdGVtcyhhbGxJdGVtcywgYm0pOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkQ29udGFpbmVkQXJ0aWZhY3RzU3ViVHJlZShBcnRpZmFjdCBlbGVtZW50LCBCb29rbWFyayBibSwKLQkJCWJvb2xlYW4gc2hvd0d1aWRhbmNlcykgewotCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCUxpc3QgaXRlbXM7Ci0JCVN0cmluZyB1cmwgPSAiIjsgLy8kTk9OLU5MUy0xJAotCi0JCS8vIGNvbnRhaW5lZCB3b3JrIHByb2R1Y3RzLCBuZWVkIGEgc3VtbWFyeSBwYWdlLCBUT0RPCi0JCS8vIGl0ZW1zID0gKChBcnRpZmFjdCllbGVtZW50KS5nZXRDb250YWluZWRBcnRpZmFjdHMoKTsKLQkJaXRlbXMgPSBjYWxjMG5GZWF0dXJlVmFsdWUoZWxlbWVudCwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0QXJ0aWZhY3RfQ29udGFpbmVkQXJ0aWZhY3RzKCkpOwotCi0JCS8vIG1ha2Ugc3VyZSB0aGUgY29udGFpbmVkIGVsZW1lbnRzIGRvZXMgbm90IGNvbnRhaW4gdGhlIGNvbnRhaW5lciwKLQkJLy8gdGhpcyBpcyBwb3NzaWJsZSBkdWUgdG8gcmVhbGl6YXRpb24sIHNheSwgdGhlIGNvbnRhaW5pbmcgZWxlbWVudAotCQkvLyBjb250cmlidXRlIHRvIHRoZSBjb250YWluZXIKLQkJaXRlbXMucmVtb3ZlKGVsZW1lbnQpOwotCi0JCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJaWYgKGl0ZW1zLnNpemUoKSA+IDApIHsKLQkJCS8vIEJvb2ttYXJrIGIgPSBjcmVhdGVGb2xkZXJCb29rbWFyayhlbGVtZW50LCBibSwKLQkJCS8vIE5PREVfQ29udGFpbmVkX1dvcmtfUHJvZHVjdHMsIGl0ZW1zLCBmYWxzZSk7Ci0KLQkJCS8vIGZvciBlYWNoIGNvbnRhaW5lZCB3b3JrIHByb2R1Y3QsIGNyZWF0ZSB0aGUgbmVzdGVkIHN1YiB0cmVlCi0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gaXRlbXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCi0JCQkJQXJ0aWZhY3QgZSA9IChBcnRpZmFjdCkgaXQubmV4dCgpOwotCQkJCWJ1aWxkSXRlbShlLCBibSwgdHJ1ZSk7Ci0JCQl9Ci0JCX0KLQotCQlpZiAoIXNob3dHdWlkYW5jZXMpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJLy8gYWxsIGd1aWRhbmNlcwotCQlpdGVtcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJaXRlbXMuYWRkQWxsKGNhbGMwbkZlYXR1cmVWYWx1ZShlbGVtZW50LCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRDb250ZW50RWxlbWVudF9Bc3NldHMoKSkpOwotCQlpdGVtcy5hZGRBbGwoY2FsYzBuRmVhdHVyZVZhbHVlKGVsZW1lbnQsIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldENvbnRlbnRFbGVtZW50X0NoZWNrbGlzdHMoKSkpOwotCQlpdGVtcy5hZGRBbGwoY2FsYzBuRmVhdHVyZVZhbHVlKGVsZW1lbnQsIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldENvbnRlbnRFbGVtZW50X0NvbmNlcHRzQW5kUGFwZXJzKCkpKTsKLQkJaXRlbXMuYWRkQWxsKGNhbGMwbkZlYXR1cmVWYWx1ZShlbGVtZW50LCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRDb250ZW50RWxlbWVudF9FeGFtcGxlcygpKSk7Ci0JCWl0ZW1zLmFkZEFsbChjYWxjMG5GZWF0dXJlVmFsdWUoZWxlbWVudCwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0Q29udGVudEVsZW1lbnRfR3VpZGVsaW5lcygpKSk7Ci0JCWl0ZW1zLmFkZEFsbChjYWxjMG5GZWF0dXJlVmFsdWUoZWxlbWVudCwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0Q29udGVudEVsZW1lbnRfU3VwcG9ydGluZ01hdGVyaWFscygpKSk7Ci0JCS8vIE9iamVjdCBlID0gY2FsYzAxRmVhdHVyZVZhbHVlKGVsZW1lbnQsIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCS8vIC5nZXRXb3JrUHJvZHVjdF9Fc3RpbWF0ZSgpKTsKLQkJLy8gaWYgKGUgIT0gbnVsbCkgewotCQkvLyBpdGVtcy5hZGQoZSk7Ci0JCS8vIH0KLQkJaXRlbXMuYWRkQWxsKGNhbGMwbkZlYXR1cmVWYWx1ZShlbGVtZW50LCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRXb3JrUHJvZHVjdF9SZXBvcnRzKCkpKTsKLQkJaXRlbXMuYWRkQWxsKGNhbGMwbkZlYXR1cmVWYWx1ZShlbGVtZW50LCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRXb3JrUHJvZHVjdF9UZW1wbGF0ZXMoKSkpOwotCQlpdGVtcy5hZGRBbGwoY2FsYzBuRmVhdHVyZVZhbHVlKGVsZW1lbnQsIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldFdvcmtQcm9kdWN0X1Rvb2xNZW50b3JzKCkpKTsKLQotCQlpZiAoaXRlbXMuc2l6ZSgpID4gMCkgewotCQkJLy8gY3JlYXRlRm9sZGVyQm9va21hcmsoZWxlbWVudCwgYm0sIE5PREVfR3VpZGFuY2VzLCBpdGVtcywgdHJ1ZSk7Ci0JCQlidWlsZEl0ZW1zKGl0ZW1zLCBibSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBpdGVyYXRlIHRoZSBicmVhayBkb3duIHN0cnVjdHVyZSBhbmQgYnVpbGQgdGhlIHhtbCBkb2N1bWVudAotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnRPYmoKLQkgKiAgICAgICAgICAgIFRoZSBvYmplY3QgdG8gaXRlcmF0ZS4gSXQgY2FuIGJlIGEgYnJlYWtkb3duIGVsZW1lbnQsIG9yIGl0J3MKLQkgKiAgICAgICAgICAgIGFkYXB0b3IKLQkgKiBAcGFyYW0gcGFyZW50WG1sCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICovCi0JcHJpdmF0ZSB2b2lkIGl0ZXJhdGVBY3Rpdml0eShQcm9jZXNzRWxlbWVudEl0ZW0gcGFyZW50SXRlbSwKLQkJCUJvb2ttYXJrIHBhcmVudEJtLCBDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LAotCQkJU3VwcHJlc3Npb24gc3VwKSB7Ci0JCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyIHByb3ZpZGVyID0gbnVsbDsKLQkJT2JqZWN0IHBhcmVudE9iaiA9IHBhcmVudEl0ZW0ucmF3SXRlbTsKLQotCQlpZiAocGFyZW50T2JqIGluc3RhbmNlb2YgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyKSB7Ci0JCQlwcm92aWRlciA9IChJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIpIHBhcmVudE9iajsKLQkJfSBlbHNlIHsKLQkJCXByb3ZpZGVyID0gKElUcmVlSXRlbUNvbnRlbnRQcm92aWRlcikgYWRhcHRlckZhY3RvcnkuYWRhcHQoCi0JCQkJCXBhcmVudE9iaiwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJfQotCi0JCWlmIChwcm92aWRlciAhPSBudWxsKSB7Ci0JCQkvLyBTdHJpbmcgZGlzcGxheU5hbWUgPSBQcm9jZXNzVXRpbC5nZXRBdHRyaWJ1dGUocGFyZW50T2JqLAotCQkJLy8gSUJTSXRlbVByb3ZpZGVyLkNPTF9QUkVTRU5UQVRJT05fTkFNRSwgcHJvdmlkZXIpOwotCQkJLy8gcGFyZW50WG1sLnNldEF0dHJpYnV0ZSgiRGlzcGxheU5hbWUiLCBkaXNwbGF5TmFtZSk7Ci0KLQkJCUNvbGxlY3Rpb24gY2hpbGRyZW4gPSBwcm92aWRlci5nZXRDaGlsZHJlbihwYXJlbnRPYmopOwotCQkJZm9yIChJdGVyYXRvciBpdCA9IGNoaWxkcmVuLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQotCQkJCU9iamVjdCByYXdpdGVtID0gaXQubmV4dCgpOwotCQkJCWlmIChzdXAuaXNTdXBwcmVzc2VkKHJhd2l0ZW0pKSB7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQotCQkJCU1ldGhvZEVsZW1lbnQgaXRlbSA9IChNZXRob2RFbGVtZW50KSBMaWJyYXJ5VXRpbAotCQkJCQkJLnVud3JhcChyYXdpdGVtKTsKLQotCQkJCWlmICghb3B0aW9ucy5zaG93RGVzY3JpcHRvcnNJbk5hdmlnYXRpb25UcmVlCi0JCQkJCQkmJiAoaXRlbSBpbnN0YW5jZW9mIERlc2NyaXB0b3IpKSB7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQotCQkJCVByb2Nlc3NFbGVtZW50SXRlbSBlbGVtZW50SXRlbSA9IG5ldyBQcm9jZXNzRWxlbWVudEl0ZW0oCi0JCQkJCQlyYXdpdGVtLCBpdGVtLCBwYXJlbnRJdGVtKTsKLQotCQkJCUJvb2ttYXJrIGNoaWxkID0gYnVpbGRJdGVtKGVsZW1lbnRJdGVtLmVsZW1lbnQsIHBhcmVudEJtLCBmYWxzZSk7Ci0JCQkJaWYgKGNoaWxkICE9IG51bGwpIHsKLQkJCQkJLy8gc2V0IHRoZSBxdWVyeSBzdHJpbmcKLQkJCQkJY2hpbGQuc2V0UXVlcnlTdHJpbmcoZWxlbWVudEl0ZW0uZ2V0UXVlcnlTdHJpbmcoKSk7Ci0KLQkJCQkJSUJTSXRlbVByb3ZpZGVyIGFkYXB0ZXIgPSBudWxsOwotCQkJCQlpZiAocmF3aXRlbSBpbnN0YW5jZW9mIElCU0l0ZW1Qcm92aWRlcikgewotCQkJCQkJYWRhcHRlciA9IChJQlNJdGVtUHJvdmlkZXIpIHJhd2l0ZW07Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlhZGFwdGVyID0gKElCU0l0ZW1Qcm92aWRlcikgYWRhcHRlckZhY3RvcnkuYWRhcHQoaXRlbSwKLQkJCQkJCQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCQkJCTsKLQkJCQkJfQotCi0JCQkJCVN0cmluZyBkaXNwbGF5TmFtZSA9IFByb2Nlc3NVdGlsLmdldEF0dHJpYnV0ZShpdGVtLAotCQkJCQkJCUlCU0l0ZW1Qcm92aWRlci5DT0xfUFJFU0VOVEFUSU9OX05BTUUsIGFkYXB0ZXIpOwotCQkJCQljaGlsZC5zZXRQcmVzZW50YXRpb25OYW1lKGRpc3BsYXlOYW1lKTsKLQotCQkJCQlpZiAoaXRlbSBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJCQlpdGVyYXRlQWN0aXZpdHkoZWxlbWVudEl0ZW0sIGNoaWxkLCBhZGFwdGVyRmFjdG9yeSwgc3VwKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBidWlsZFByb2Nlc3NTdWJUcmVlKE9iamVjdCBvYmosCi0JCQlvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3MgZWxlbWVudCwgQm9va21hcmsgYm0pIHsKLQkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlMaXN0IGl0ZW1zID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCVByb2Nlc3NFbGVtZW50SXRlbSBwcm9jSXRlbSA9IG5ldyBQcm9jZXNzRWxlbWVudEl0ZW0ob2JqLCBlbGVtZW50LAotCQkJCWVsZW1lbnQuZ2V0R3VpZCgpKTsKLQotCQlDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5ID0gc3VwZXIuZ2V0TGF5b3V0TWdyKCkKLQkJCQkuZ2V0V0JTQWRhcHRlckZhY3RvcnkoKTsKLQkJU3VwcHJlc3Npb24gc3VwID0gbmV3IFN1cHByZXNzaW9uKGVsZW1lbnQpOwotCQlpdGVyYXRlQWN0aXZpdHkocHJvY0l0ZW0sIGJtLCBhZGFwdGVyRmFjdG9yeSwgc3VwKTsKLQotCQlTdHJpbmcgdXJsOwotCQlCb29rbWFyayBiOwotCi0JCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJLy8gYWxsIGd1aWRhbmNlcwotCQlpdGVtcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJaXRlbXMuYWRkQWxsKGNhbGMwbkZlYXR1cmVWYWx1ZShlbGVtZW50LCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRCcmVha2Rvd25FbGVtZW50X0NoZWNrbGlzdHMoKSkpOwotCQlpdGVtcy5hZGRBbGwoY2FsYzBuRmVhdHVyZVZhbHVlKGVsZW1lbnQsIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldEJyZWFrZG93bkVsZW1lbnRfQ29uY2VwdHMoKSkpOwotCQlpdGVtcy5hZGRBbGwoY2FsYzBuRmVhdHVyZVZhbHVlKGVsZW1lbnQsIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldEJyZWFrZG93bkVsZW1lbnRfRXhhbXBsZXMoKSkpOwotCQlpdGVtcy5hZGRBbGwoY2FsYzBuRmVhdHVyZVZhbHVlKGVsZW1lbnQsIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldEJyZWFrZG93bkVsZW1lbnRfR3VpZGVsaW5lcygpKSk7Ci0JCWl0ZW1zLmFkZEFsbChjYWxjMG5GZWF0dXJlVmFsdWUoZWxlbWVudCwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0QnJlYWtkb3duRWxlbWVudF9SZXVzYWJsZUFzc2V0cygpKSk7Ci0JCWl0ZW1zLmFkZEFsbChjYWxjMG5GZWF0dXJlVmFsdWUoZWxlbWVudCwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0QWN0aXZpdHlfUm9hZG1hcHMoKSkpOwotCi0JCS8vIG5lZWQgdG8gaW5jbHVkZSBzdXBwb3J0aW5nIG1hdGVyaWFscyBhcyB3ZWxsCi0JCS8vIGZpeCBidWc6IHN1cHBvcnRpbmcgbWF0ZXJpYWwgc2VydmVkIGFzIHVzZXIgZGVmaW5lZCBkaWFncmFtIHNob3VsZCBub3QgCi0JCS8vIHNob3cgdXAgaW4gdGhlIG5hdmlnYXRpb24gdHJlZSBvZiBhIHB1Ymxpc2hlZCBwcm9jZXNzLgkKLQkJb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwudXRpbC5EaWFncmFtSW5mbyB1c2VyRGlhZ3JhbUluZm8gPSAKLQkJCQluZXcgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwudXRpbC5EaWFncmFtSW5mbyhlbGVtZW50KTsKLQkJTGlzdCB2ID0gY2FsYzBuRmVhdHVyZVZhbHVlKGVsZW1lbnQsIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldEJyZWFrZG93bkVsZW1lbnRfU3VwcG9ydGluZ01hdGVyaWFscygpKTsKLQkJZm9yICggSXRlcmF0b3IgaXQgPSB2Lml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTsgKSB7Ci0JCQlTdXBwb3J0aW5nTWF0ZXJpYWwgcyA9IChTdXBwb3J0aW5nTWF0ZXJpYWwpaXQubmV4dCgpOwotCQkJaWYgKCAhdXNlckRpYWdyYW1JbmZvLmlzRGlhZ3JhbSggKFN1cHBvcnRpbmdNYXRlcmlhbClzICkgKSB7Ci0JCQkJaXRlbXMuYWRkKHMpOwotCQkJfQotCQl9Ci0KLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBEZWxpdmVyeVByb2Nlc3MpIHsKLQkJCURlbGl2ZXJ5UHJvY2VzcyBkcCA9IChEZWxpdmVyeVByb2Nlc3MpIGVsZW1lbnQ7Ci0JCQlpdGVtcy5hZGRBbGwoY2FsYzBuRmVhdHVyZVZhbHVlKGVsZW1lbnQsIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCS5nZXREZWxpdmVyeVByb2Nlc3NfQ29tbXVuaWNhdGlvbnNNYXRlcmlhbHMoKSkpOwotCQkJaXRlbXMuYWRkQWxsKGNhbGMwbkZlYXR1cmVWYWx1ZShlbGVtZW50LCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkuZ2V0RGVsaXZlcnlQcm9jZXNzX0VkdWNhdGlvbk1hdGVyaWFscygpKSk7Ci0JCX0KLQotCQlpZiAoaXRlbXMuc2l6ZSgpID4gMCkgewotCQkJY3JlYXRlRm9sZGVyQm9va21hcmsoZWxlbWVudCwgYm0sIFBSRUZJWF9HdWlkYW5jZXMsIE5PREVfR3VpZGFuY2VzLAotCQkJCQlpdGVtcywgdHJ1ZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBkaXNwb3NlIHRoZSBvYmplY3QKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlzdXBlci5kaXNwb3NlKCk7Ci0KLQkJYWRhcHRlckZhY3RvcnkgPSBudWxsOwotCQluYW1lQ29tcGFyYXRvciA9IG51bGw7Ci0JCWJvb2ttYXJrcy5jbGVhcigpOwotCQllbGVtZW50VXJscy5jbGVhcigpOwotCQlzdW1tYXJ5UGFnZXNHZW5lcmF0ZWQuY2xlYXIoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU2V0IGVsZW1lbnRVcmxzID0gbmV3IEhhc2hTZXQoKTsKLQotCXByb3RlY3RlZCB2b2lkIGVsZW1lbnRQdWJsaXNoZWQoSUVsZW1lbnRMYXlvdXQgbGF5b3V0LCBTdHJpbmcgaHRtbGZpbGUpIHsKLQkJLy8gb25seSBmb3IgcHJvY2VzcyBlbGVtZW50IGZvciBub3cKLQkJLy8gbWF5IGNvdmVyIGFsbCBtZXRob2QgZWxlbWVudHMgbGF0ZXIKLQkJaWYgKGxheW91dC5nZXRFbGVtZW50KCkgaW5zdGFuY2VvZiBQcm9jZXNzRWxlbWVudCkgewotCQkJRWxlbWVudFVybCB1cmwgPSBuZXcgRWxlbWVudFVybChsYXlvdXQuZ2V0RWxlbWVudCgpLmdldEd1aWQoKSwKLQkJCQkJbGF5b3V0LmdldFVybCgpLCBsYXlvdXQuZ2V0RGlzcGxheU5hbWUoKSk7Ci0JCQllbGVtZW50VXJscy5hZGQodXJsKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBzYXZlRWxlbWVudFVybHMoKSB7Ci0JCS8vIHNhdmUgcHVibGlzaGVkIGVsZW1lbnQgdXJscwotCQkvLyBuZWVkIHRvIGVzY2FwZSB0aGUgdXJsIGFuZCB0ZXh0IHNpbmNlIGl0IHdpbGwgYmUgYXNzaWduZWQgdG8gYQotCQkvLyBqYXZhc2NyaXB0IHZhcmlhYmxlIGFzIGxpdGVyYWwKLQkJWG1sRWxlbWVudCB4bWwgPSBuZXcgWG1sRWxlbWVudCgiRWxlbWVudFVybHMiKTsgLy8kTk9OLU5MUy0xJAotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gZWxlbWVudFVybHMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJRWxlbWVudFVybCB1cmwgPSAoRWxlbWVudFVybCkgaXQubmV4dCgpOwotCQkJeG1sLm5ld0NoaWxkKCJlbGVtZW50VXJsIiwgdXJsLmd1aWQpIC8vJE5PTi1OTFMtMSQKLQkJCQkJLnNldEF0dHJpYnV0ZSgidGV4dCIsIFN0clV0aWwuZXNjYXBlKHVybC50ZXh0KSkgLy8kTk9OLU5MUy0xJAotCQkJCQkuc2V0QXR0cmlidXRlKCJ1cmwiLCBTdHJVdGlsLmVzY2FwZSh1cmwudXJsKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCS8vIFN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCS8vIGJ1ZmZlci5hcHBlbmQoWG1sSGVscGVyLlhNTF9IRUFERVIpLmFwcGVuZCh4bWwudG9YbWwoKSk7Ci0JCS8vIEZpbGUgZiA9IG5ldyBGaWxlKGdldExheW91dE1ncigpLmdldFB1Ymxpc2hEaXIoKSwgIkVsZW1lbnRVcmxzLnhtbCIpOwotCQkvLyAvLyROT04tTkxTLTEkCi0JCS8vIEZpbGVVdGlsLndyaXRlVVRGOEZpbGUoZi5nZXRBYnNvbHV0ZVBhdGgoKSwgYnVmZmVyLnRvU3RyaW5nKCkpOwotCi0JCVN0cmluZyBodG1sID0gUHVibGlzaGluZ1V0aWwuZ2V0SHRtbCh4bWwsICJ4c2wvZWxlbWVudFVybHMueHNsIik7IC8vJE5PTi1OTFMtMSQKLQkJRmlsZSBmID0gbmV3IEZpbGUoZ2V0TGF5b3V0TWdyKCkuZ2V0UHVibGlzaERpcigpLAotCQkJCVBST0NFU1NfTEFZT1VUX0RBVEFfRklMRSk7IC8vJE5PTi1OTFMtMSQKLQkJRmlsZVV0aWwud3JpdGVVVEY4RmlsZShmLmdldEFic29sdXRlUGF0aCgpLCBodG1sLCB0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiBkYXRhIHN0cnVjdHVyZSB0byBkZWZpbmUgdXJsIG9mIGFuIGVsZW1lbnQKLQkgKiAKLQkgKiBAYXV0aG9yIEppbmh1YSBYaQotCSAqIAotCSAqLwotCXB1YmxpYyBjbGFzcyBFbGVtZW50VXJsIHsKLQotCQlTdHJpbmcgZ3VpZDsKLQkJU3RyaW5nIHVybDsKLQkJU3RyaW5nIHRleHQ7Ci0KLQkJLyoqCi0JCSAqIGNvbnN0cnVjdG9yCi0JCSAqIAotCQkgKiBAcGFyYW0gZ3VpZAotCQkgKiAgICAgICAgICAgIFN0cmluZyB0aGUgZ3VpZCBvZiB0aGUgZWxlbWVudAotCQkgKiBAcGFyYW0gdXJsCi0JCSAqICAgICAgICAgICAgU3RyaW5nIHRoZSB1cmwgb2YgdGhlIGVsZW1lbnQKLQkJICogQHBhcmFtIHRleHQKLQkJICogICAgICAgICAgICBTdHJpbmcgdGhlIHRleHQgYWxvbmUgd2l0aCB0aGUgdXJsCi0JCSAqLwotCQlwdWJsaWMgRWxlbWVudFVybChTdHJpbmcgZ3VpZCwgU3RyaW5nIHVybCwgU3RyaW5nIHRleHQpIHsKLQkJCXRoaXMuZ3VpZCA9IGd1aWQ7Ci0JCQl0aGlzLnVybCA9IHVybDsKLQkJCXRoaXMudGV4dCA9IHRleHQ7Ci0JCX0KLQl9Ci0KLQljbGFzcyBFT2JqZWN0Q29tcGFyYXRvciBpbXBsZW1lbnRzIENvbXBhcmF0b3IgewotCQlwcml2YXRlIEVTdHJ1Y3R1cmFsRmVhdHVyZSBwTmFtZSA9IFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldE1ldGhvZEVsZW1lbnRfUHJlc2VudGF0aW9uTmFtZSgpOwotCQlwcml2YXRlIEVTdHJ1Y3R1cmFsRmVhdHVyZSBuYW1lID0gVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0TmFtZWRFbGVtZW50X05hbWUoKTsKLQotCQlwdWJsaWMgRU9iamVjdENvbXBhcmF0b3IoKSB7Ci0KLQkJfQotCi0JCXB1YmxpYyBpbnQgY29tcGFyZShPYmplY3QgZTEsIE9iamVjdCBlMikgewotCQkJaWYgKGUxIGluc3RhbmNlb2YgRU9iamVjdCAmJiBlMiBpbnN0YW5jZW9mIEVPYmplY3QpIHsKLQkJCQlPYmplY3QgdjEgPSBnZXRWYWx1ZShlMSk7Ci0JCQkJT2JqZWN0IHYyID0gZ2V0VmFsdWUoZTIpOwotCi0JCQkJaWYgKHYxID09IG51bGwgJiYgdjIgPT0gbnVsbCkgewotCQkJCQlyZXR1cm4gZTEudG9TdHJpbmcoKS5jb21wYXJlVG8oZTIudG9TdHJpbmcoKSk7Ci0JCQkJfSBlbHNlIGlmICh2MSA9PSBudWxsKSB7Ci0JCQkJCXJldHVybiAtMTsKLQkJCQl9IGVsc2UgaWYgKHYyID09IG51bGwpIHsKLQkJCQkJcmV0dXJuIDE7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJcmV0dXJuIHYxLnRvU3RyaW5nKCkuY29tcGFyZVRvKHYyLnRvU3RyaW5nKCkpOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJcmV0dXJuIGUxLnRvU3RyaW5nKCkuY29tcGFyZVRvKGUyLnRvU3RyaW5nKCkpOwotCQkJfQotCQl9Ci0KLQkJcHJpdmF0ZSBPYmplY3QgZ2V0VmFsdWUoT2JqZWN0IGUpIHsKLQkJCU9iamVjdCB2ID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJdiA9ICgoRU9iamVjdCkgZSkuZUdldChwTmFtZSk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQotCQkJfQotCQkJOwotCi0JCQlpZiAodiA9PSBudWxsIHx8IHYudG9TdHJpbmcoKS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJdiA9ICgoRU9iamVjdCkgZSkuZUdldChuYW1lKTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQotCQkJCX0KLQkJCQk7Ci0JCQl9Ci0KLQkJCXJldHVybiB2OwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3NlcnZpY2VzL0RlZmF1bHRFbGVtZW50VHlwZVJlc291cmNlcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy9zZXJ2aWNlcy9EZWZhdWx0RWxlbWVudFR5cGVSZXNvdXJjZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5NzcyODQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3NlcnZpY2VzL0RlZmF1bHRFbGVtZW50VHlwZVJlc291cmNlcworKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbi4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jCi0jIGRlZmluZXMgd2hpY2ggZWxlbWVudHMgd2lsbCB1c2UgdGhlIGRlZmF1bHQgaWNvbgotIwotZGlzY2lwbGluZT10cnVlCi1jYXBhYmlsaXR5UGF0dGVybj10cnVlCi1yb2xlPXRydWUKLXRhc2s9dHJ1ZQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy9zZXJ2aWNlcy9EZWZhdWx0RWxlbWVudFR5cGVSZXNvdXJjZXMuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy9zZXJ2aWNlcy9EZWZhdWx0RWxlbWVudFR5cGVSZXNvdXJjZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTBjM2ZjZi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvc2VydmljZXMvRGVmYXVsdEVsZW1lbnRUeXBlUmVzb3VyY2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vIAotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcuc2VydmljZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLQotcHVibGljIGNsYXNzIERlZmF1bHRFbGVtZW50VHlwZVJlc291cmNlcyAKLXsKLQlwcml2YXRlIHN0YXRpYyBSZXNvdXJjZUJ1bmRsZSByZXNvdXJjZUJ1bmRsZTsKLQlzdGF0aWMKLQl7Ci0JCXRyeSAKLQkJewotCQkJU3RyaW5nIHJlc291cmNlID0gRGVmYXVsdEVsZW1lbnRUeXBlUmVzb3VyY2VzLmNsYXNzLmdldE5hbWUoKTsKLQkJICAgIHJlc291cmNlQnVuZGxlID0gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKHJlc291cmNlKTsKLQkJCSAgICAJCSAgICAKLQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIHgpIHsKLQkJICAgIHgucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQlyZXNvdXJjZUJ1bmRsZSA9IG51bGw7Ci0JCX0KLQl9Ci0JCi0KLQkKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXkpCi0JewotCQl0cnkgCi0JCXsKLQkJCXJldHVybiAocmVzb3VyY2VCdW5kbGUgIT0gbnVsbCkgPyByZXNvdXJjZUJ1bmRsZS5nZXRTdHJpbmcoa2V5KSA6IG51bGw7Ci0JCX0gCi0JCWNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgCi0JCXsKLQkJCXJldHVybiBudWxsOwotCQl9CQkKLQl9Ci0JCi0JLyoqCi0JICogY2hlY2sgaWYgYSBkZWZhdWx0IGljb24gaXMgaXNlZCBvciBub3QgZm9yIHRoZSBzcGVjaWZpZWQga2V5Ci0JICogCi0JICogQHBhcmFtIGtleSBTdHJpbmcKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gdXNlRGVmYXVsdEljb24oU3RyaW5nIGtleSkKLQl7Ci0JCVN0cmluZyBib29sZWFuUmVzdWx0ID0gZ2V0U3RyaW5nKGtleSk7Ci0JCWlmICggYm9vbGVhblJlc3VsdCA9PSBudWxsICkKLQkJewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCQotCQlyZXR1cm4gKGJvb2xlYW5SZXN1bHQudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJ0cnVlIikgPiAtMSkgPyB0cnVlIDogZmFsc2U7IC8vJE5PTi1OTFMtMSQKLQl9CQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy9zZXJ2aWNlcy9EZWZhdWx0RWxlbWVudFR5cGVSZXNvdXJjZXMucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy9zZXJ2aWNlcy9EZWZhdWx0RWxlbWVudFR5cGVSZXNvdXJjZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzkyMmY4NC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvc2VydmljZXMvRGVmYXVsdEVsZW1lbnRUeXBlUmVzb3VyY2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIwotIyBkZWZpbmVzIHdoaWNoIGVsZW1lbnRzIHdpbGwgdXNlIHRoZSBkZWZhdWx0IGljb24KLSMKLWRpc2NpcGxpbmU9dHJ1ZQotY2FwYWJpbGl0eVBhdHRlcm49dHJ1ZQotcm9sZT10cnVlCi10YXNrPXRydWUKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvc2VydmljZXMvRGVmYXVsdE5vZGVJY29uUmVzb3VyY2VzLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvc2VydmljZXMvRGVmYXVsdE5vZGVJY29uUmVzb3VyY2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiN2Q2OGIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3NlcnZpY2VzL0RlZmF1bHROb2RlSWNvblJlc291cmNlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5zZXJ2aWNlczsKLQotaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotCi0vKioKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBEZWZhdWx0Tm9kZUljb25SZXNvdXJjZXMgewotCi0JcHJpdmF0ZSBzdGF0aWMgUmVzb3VyY2VCdW5kbGUgcmVzb3VyY2VCdW5kbGU7Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgREVGQVVMVF9JQ09OX05BTUUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyB7Ci0JCXRyeSB7Ci0JCQlTdHJpbmcgcmVzb3VyY2UgPSBEZWZhdWx0Tm9kZUljb25SZXNvdXJjZXMuY2xhc3MuZ2V0TmFtZSgpOwotCQkJcmVzb3VyY2VCdW5kbGUgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUocmVzb3VyY2UpOwotCQkJREVGQVVMVF9JQ09OX05BTUUgPSBnZXRTdHJpbmcoImZvbGRlciIpOyAvLyROT04tTkxTLTEkCi0KLQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIHgpIHsKLQkJCXgucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQlyZXNvdXJjZUJ1bmRsZSA9IG51bGw7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXkpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiAocmVzb3VyY2VCdW5kbGUgIT0gbnVsbCkgPyByZXNvdXJjZUJ1bmRsZS5nZXRTdHJpbmcoa2V5KQotCQkJCQk6IG51bGw7Ci0JCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCS8qKgotCSAqIGdldCB0aGUgaWNvbiBuYW1lIGZvciB0aGUgc3BlY2lmaWVkIGtleQotCSAqIAotCSAqIEBwYXJhbSBrZXkgU3RyaW5nCi0JICogQHJldHVybiBTdHJpbmcgdGhlIGljb24gbmFtZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRJY29uTmFtZShTdHJpbmcga2V5KSB7Ci0JCVN0cmluZyBpY29uTmFtZSA9IGdldFN0cmluZyhrZXkpOwotCQlpZiAoaWNvbk5hbWUgPT0gbnVsbCkgewotCQkJaWNvbk5hbWUgPSBERUZBVUxUX0lDT05fTkFNRTsKLQkJfQotCi0JCXJldHVybiBpY29uTmFtZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy9zZXJ2aWNlcy9EZWZhdWx0Tm9kZUljb25SZXNvdXJjZXMucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy9zZXJ2aWNlcy9EZWZhdWx0Tm9kZUljb25SZXNvdXJjZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGFmMWNlMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvc2VydmljZXMvRGVmYXVsdE5vZGVJY29uUmVzb3VyY2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIwotIyBkZWZpbmVzIHRoZSBkZWZhdWx0IG5vZGUgaWNvbiBuYW1lcwotIwotYWN0aXZpdHk9YWN0aXZpdHkuZ2lmCi1hcnRpZmFjdD1hcnRpZmFjdC5naWYKLXJvbGU9d29ya2VyLmdpZgotdGFzaz1hY3Rpdml0eS5naWYKLWd1aWRlbGluZT1ndWlkZWxpbmUuZ2lmCi1jaGVja2xpc3Q9Y2hlY2tsaXN0LmdpZgotY29uY2VwdD1jb25jZXB0LmdpZgotZXhhbXBsZT1leGFtcGxlLmdpZgotcmVwb3J0PQotc3VwcG9ydGluZ21hdGVyaWFsPQotdGVjaG5pcXVlPQotdGVtcGxhdGU9Ci10ZXJtZGVmaW5pdGlvbj0KLXRvb2xtZW50b3I9Ci10cmFpbmluZ21vZHVsZT0KLXdoaXRlcGFwZXI9Ci13b3JrcHJvZHVjdGd1aWRlbGluZT0KLWdlbmVyYWw9Ci1wcm9jZXNzPQotY2FwYWJpbGl0eXBhdHRlcm49Ci1kZWxpdmVyeXByb2Nlc3M9Ci1mb2xkZXI9Zm9sZGVyLmdpZgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3NlcnZpY2VzL0RlZmF1bHRTaXRlR2VuZXJhdG9yLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvc2VydmljZXMvRGVmYXVsdFNpdGVHZW5lcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjYyYTU3Yy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvc2VydmljZXMvRGVmYXVsdFNpdGVHZW5lcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxMCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5zZXJ2aWNlczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkZpbGVMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLkZpbGVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuU3RyVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuQm9va21hcms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LkJvb2ttYXJrTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuSHRtbEJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LkxheW91dFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQudXRpbC5YbWxFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLlB1Ymxpc2hpbmdQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudXRpbC5QdWJsaXNoaW5nVXRpbDsKLQotCi0vKioKLSAqIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgdGhlIHNpdGUgZ2VuZXJhdG9yLgotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICoKLSAqLwotcHVibGljIGNsYXNzIERlZmF1bHRTaXRlR2VuZXJhdG9yIGV4dGVuZHMgQWJzdHJhY3RTaXRlR2VuZXJhdG9yIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5PX0FQUExFVF9ESVJFQ1RPUlkgPSAibm9hcHBsZXQiOyAvLyROT04tTkxTLTEkCi0KLQkvLyBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCT09LTUFSS19TVUZGSVggPSAiLmJrbSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCT09LTUFSS19TVUZGSVhfWE1MID0gIi54bWwiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCT09LTUFSS19TVUZGSVhfSFRNTCA9ICIuaHRtbCI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNQQUNFX1JFUExBQ0VNRU5UID0gIl8iOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTUEFDRV9TVFJJTkcgPSAiICI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfQk9PS01BUktfQ0ZHX05BTUUgPQotCS8vICJEZWZhdWx0Qm9va21hcmsuY2ZnIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBVQkxJU0hFRF9CT09LTUFSS1NfQ0ZHX05BTUUgPSAiUHVibGlzaGVkQm9va21hcmtzLnhtbCI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBVQkxJU0hFRF9CT09LTUFSS1NfREVMSU1JVEVSID0gIioiOyAvLyROT04tTkxTLTEkCi0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBCT09LTUFSS19YU0xfRklMRSA9ICJ4c2wvYm9va21hcmsueHNsIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQk9PS01BUktTX1hTTF9GSUxFID0gInhzbC9QdWJsaXNoZWRCb29rbWFya3MueHNsIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5ERVhfWFNMX0ZJTEUgPSAieHNsL2luZGV4LnhzbCI7IC8vJE5PTi1OTFMtMSQKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFRPUE5BVl9YU0xfRklMRSA9ICJ4c2wvdG9wbmF2LnhzbCI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBTRUFSQ0hfWFNMX0ZJTEUgPSAieHNsL3NlYXJjaC54c2wiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVBQTEVUX1BBVEggPSAiYXBwbGV0IiArIEZpbGUuc2VwYXJhdG9yQ2hhcjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBOT19BUFBMRVRfUEFUSCA9ICJub2FwcGxldCIgKyBGaWxlLnNlcGFyYXRvckNoYXI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUNPTl9QQVRIID0gImltYWdlcyIgKyBGaWxlLnNlcGFyYXRvckNoYXI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VSVkVSX1NFQVJDSF9QQVRIID0gImRvY3Jvb3Qvc2VydmVyX3NlYXJjaCI7IC8vJE5PTi1OTFMtMSQJCi0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfQkFOTkVSX0ZJTEUgPSAiRVBGQ19iYW5uZXIuanBnIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJvdGVjdGVkIEZpbGUgaWNvblBhdGg7Ci0KLQlwdWJsaWMgRGVmYXVsdFNpdGVHZW5lcmF0b3IoSHRtbEJ1aWxkZXIgYnVpbGRlciwgUHVibGlzaEhUTUxPcHRpb25zIG9wdGlvbnMpIHsKLQkJc3VwZXIoYnVpbGRlciwgb3B0aW9ucyk7Ci0KLQkJaWNvblBhdGggPSBuZXcgRmlsZShwdWJEaXIsIChvcHRpb25zLmlzUHVibGlzaER5bmFtaWNXZWJBcHAoKSApID8gTk9fQVBQTEVUX1BBVEggICsgSUNPTl9QQVRIIAotCQkJCTogQVBQTEVUX1BBVEggKyBJQ09OX1BBVEgpOwotCX0KLQkKLQlwdWJsaWMgSHRtbEJ1aWxkZXIgZ2V0SHRtbEJ1aWxkZXIoKSB7Ci0JCXJldHVybiBidWlsZGVyOwotCX0KLQkKLQlwdWJsaWMgUHVibGlzaE9wdGlvbnMgZ2V0UHVibGlzaE9wdGlvbnMoKSB7Ci0JCXJldHVybiBvcHRpb25zOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0Tm9kZUljb25QYXRoKCkgewotCQlyZXR1cm4gaWNvblBhdGguZ2V0QWJzb2x1dGVQYXRoKCk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdEJhbm5lckltYWdlRmlsZSgpIHsKLQkJLy9yZXR1cm4gImJhbm5lci5naWYiOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBERUZBVUxUX0JBTk5FUl9GSUxFOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBwcmVQdWJsaXNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNvcHlGaWxlcygpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBwb3N0UHVibGlzaCgpIHRocm93cyBFeGNlcHRpb24gewotCQljb3B5SWNvbnNGb3JOb25BcHBsZXQoKTsKLQkJd3JpdGVJbmRleEFuZFRvcE5hdkh0bWwoKTsKLQkJd3JpdGVTZWFyY2hIdG1sKCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGNvcHlGaWxlcygpIHRocm93cyBFeGNlcHRpb24gewotCi0JCWNvcHlEb2NSb290RmlsZXMoKTsKLQotCQkvLyBjb3B5IGxvY2FsaXplZCBmaWxlcwotCQljb3B5TG9jYWxpemVkRmlsZXMoKTsKLQotCQkvLyBjb3B5IHVzZXIgY3VzdG9taXplZCBmaWxlcyBsYXN0Ci0JCWNvcHlDdXN0b21pemVkRmlsZXMoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjb3B5RG9jUm9vdEZpbGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJVVJMIHBsdWdpbl91cmwgPSBQdWJsaXNoaW5nUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbnN0YWxsVVJMKCk7Ci0JCVVSTCB1cmwgPSBuZXcgVVJMKHBsdWdpbl91cmwsIERPQ19ST09UKTsKLQkJU3RyaW5nIGZyb21QYXRoID0gUGxhdGZvcm0ucmVzb2x2ZSh1cmwpLmdldFBhdGgoKTsKLQotCQkvLyBmb2xkZXJzIHRoYXQgYXBwbHkgdG8gYWxsCi0JCS8vIE5PVEU6IGFwcGxldCBpbWFnZXMgc2hvdWxkIGFsd2F5cyBiZSBpbmNsdWRlZCBzaW5jZSBpdCdzIHVzZWQgaW4KLQkJLy8gQXRsYW50aWMgY29uZmlndXJhdGlvbgotCQkvLyBhcHBsZXQvaGVscC5odG0gaXMgdXNlZCBpbiBSU0EgdG8gY2hlY2sgY2hhcmFjdGVyIGVuY29kaW5nLCBzbwotCQkvLyBuZWVkIHRvIGluY2x1ZGUgdGhpcyBmaWxlCi0JCS8vIFByb2Nlc3MgQWR2aXNvcjogRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGluIFJTQSBsb2cKLQkJLy8gd2hlbiBpbmRleGluZyBzdGFydCBvbiBhIG5vbi1hcHBsZXQgcHVibGlzaGVkIHNpdGUKLQkJU3RyaW5nIGluY2x1ZGVzID0gIiouKiwgcHJvY2Vzcy8qKiwgaW1hZ2VzLyoqLCBpbmRleC8qKiwgc2NyaXB0cy8qKiwgc3R5bGVzaGVldHMvKioiOyAvLyROT04tTkxTLTEkCi0KLQkJU3RyaW5nIGV4Y2x1ZGVzID0gIiI7IC8vJE5PTi1OTFMtMSQKLQotCQkvLyBiYXNlZCBvbiB0aGUgc2VsZWN0aW9uLCBjb3B5IHRoZSBvdGhlciBmb2xkZXJzCi0JCWlmIChvcHRpb25zLmlzUHVibGlzaEphdmFTY3JpcHRUcmVlKCkpIHsKLQkJCWluY2x1ZGVzICs9ICIsIG5vYXBwbGV0LyoqIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJLy8gU3RyaW5nIHB1Ymxpc2hEaXIgPSB2aWV3QnVpbGRlci5nZXRIdG1sQnVpbGRlcigpLmdldFB1Ymxpc2hEaXIoKTsKLQotCQlMYXlvdXRSZXNvdXJjZXMuY29weURpcihmcm9tUGF0aCwgcHViRGlyLCBpbmNsdWRlcywgZXhjbHVkZXMpOwkJCi0JCQotCQlTdHJpbmcgcGF0aCA9IEZpbGVMb2NhdG9yLnJlc29sdmUobmV3IFVSTChwbHVnaW5fdXJsLCBTRVJWRVJfU0VBUkNIX1BBVEgpKS5nZXRQYXRoKCk7Ci0JCWluY2x1ZGVzID0gIiouKiwgc2VhcmNoLyoqIjsgLy8kTk9OLU5MUy0xJAotCQlMYXlvdXRSZXNvdXJjZXMuY29weURpcihwYXRoLCBwdWJEaXIsIGluY2x1ZGVzLCBudWxsKTsJCQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNvcHlDdXN0b21pemVkRmlsZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuY29weUN1c3RvbWl6ZWRGaWxlcygpOwotCi0JCWlmIChvcHRpb25zLmFib3V0SFRNTCAhPSBudWxsICYmIG9wdGlvbnMuYWJvdXRIVE1MLmxlbmd0aCgpID4gMCkgewotCQkJRmlsZVV0aWwuY29weUZpbGUob3B0aW9ucy5hYm91dEhUTUwsIHB1YkRpciArICJhYm91dC5odG0iKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQkKLQotCXByb3RlY3RlZCB2b2lkIGNvcHlMb2NhbGl6ZWRGaWxlcygpIHRocm93cyBFeGNlcHRpb24gewotCi0JCXN1cGVyLmNvcHlMb2NhbGl6ZWRGaWxlcygpOwotCi0JCWlmIChvcHRpb25zLmlzUHVibGlzaEphdmFTY3JpcHRUcmVlKCkpIHsKLQkJCS8vIGNvcHkgdGhlIGFwcGxldCBodG1sIGZpbGVzLCByZW5hbWUgbG9jYWxlIHNwZWNpZmljIG5hbWVzCi0JCQlQdWJsaXNoaW5nUGx1Z2luCi0JCQkJCS5nZXREZWZhdWx0KCkKLQkJCQkJLmNvcHlMb2NhbGl6ZWRGaWxlcygKLQkJCQkJCQlET0NfUk9PVCArICJub2FwcGxldC8iLCBuZXcgRmlsZShwdWJEaXIsICJub2FwcGxldC8iKSwgZmFsc2UsIGZhbHNlKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBjb3B5SWNvbnNGb3JOb25BcHBsZXQoKQotCXsKLQkJdHJ5Ci0JCXsKLQkJCS8vIGRvbid0IGphciBpdC4gY29weSB0aGUgaWNvbnMgdG8gdGhlIGltYWdlcwotLy8JCQlGaWxlIGphckZpbGUgPSBuZXcgRmlsZShidWlsZGVyLmdldFB1Ymxpc2hEaXIoKSwgQVBQTEVUX1BBVEggKyBJQ09OX1pJUF9GSUxFKTsKLS8vCQkJUHVibGlzaGluZ1V0aWwuamFyRmlsZXMoaWNvblBhdGgsIGphckZpbGUpOwotCi0JCQlpZiAoIG9wdGlvbnMuaXNQdWJsaXNoSmF2YVNjcmlwdFRyZWUoKSApCi0JCQl7Ci0JCQkJLy8gYWxzbyBjb3B5IHRoZSBpY29ucyB0byB0aGUgbm8tYXBwbGV0IGZvbGRlcgotCQkJCUxheW91dFJlc291cmNlcy5jb3B5RGlyKGljb25QYXRoLmdldEFic29sdXRlUGF0aCgpLCBwdWJEaXIgKyBOT19BUFBMRVRfUEFUSCArIElDT05fUEFUSCk7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBleCkKLQkJewotCQkJZXgucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIFN0cmluZyB3cml0ZUJvb2ttYXJrKEJvb2ttYXJrIGIpIHsKLQotCQkvLyBnZXQgdGhlIGJvb2ttYXJrIG5hbWUgZnJvbSB0aGUgYm9va21hcmsgdXJsCi0JCVN0cmluZyBib29rbWFya0ZpbGVOYW1lID0gc3VwZXIuZ2V0Vmlld0RhdGFGaWxlTmFtZShiLCBCT09LTUFSS19TVUZGSVhfWE1MKTsKLQkJWG1sRWxlbWVudCB4bWwgPSBiLmdldFhtbEVsZW1lbnQoKTsKLQotCQlTdHJpbmcgYnVmZmVyID0gUHVibGlzaGluZ1V0aWwuZ2V0SHRtbCh4bWwsIEJPT0tNQVJLX1hTTF9GSUxFKTsKLQkJaWYgKGJ1ZmZlciAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgaHRtbFBhdGggPSBnZXRCb29rbWFya0h0bWxQYXRoKGJvb2ttYXJrRmlsZU5hbWUpOwotCQkJRmlsZVV0aWwud3JpdGVVVEY4RmlsZShodG1sUGF0aCwgYnVmZmVyLnRvU3RyaW5nKCkpOwotCQl9Ci0KLQkJcmV0dXJuIGJvb2ttYXJrRmlsZU5hbWU7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHdyaXRlUHVibGlzaGVkQm9va21hcmtzKExpc3QgYm9va21hcmtzLCBCb29rbWFyayBkZWZhdWx0VmlldykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCQotCQkvLyBmaXJzdCB3cml0ZSB4bWwgZm9yIGVhY2ggaW5kaXZpZHVhbCB2aWV3IAotCQlCb29rbWFya0xpc3QgbGlzdCA9IG5ldyBCb29rbWFya0xpc3QoKTsKLQotCQlpZiAoKGRlZmF1bHRWaWV3ID09IG51bGwpICYmIChib29rbWFya3Muc2l6ZSgpID4gMCkpIHsKLQkJCWRlZmF1bHRWaWV3ID0gKEJvb2ttYXJrKSBib29rbWFya3MuZ2V0KDApOwotCQl9Ci0KLQkJZm9yIChJdGVyYXRvciBpdCA9IGJvb2ttYXJrcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlCb29rbWFyayBiID0gKEJvb2ttYXJrKSBpdC5uZXh0KCk7Ci0JCQlTdHJpbmcgZmlsZU5hbWUgPSB3cml0ZUJvb2ttYXJrKGIpOwotCQkJbGlzdC5hZGRCb29rbWFyayhiLmdldFByZXNlbnRhdGlvbk5hbWUoKSwgZmlsZU5hbWUsCi0JCQkJCShkZWZhdWx0VmlldyA9PSBiKSk7Ci0JCX0KLQkJCi0JCS8vIHRoZW4gd3JpdGUgdGhlIHRvcCBsZXZlbCBib29rbWFyayB4bWwKLQkJWG1sRWxlbWVudCB4bWwgPSBsaXN0LmdldFhtbEVsZW1lbnQoKTsKLQotCQlTdHJpbmcgYnVmZmVyID0gUHVibGlzaGluZ1V0aWwuZ2V0SHRtbCh4bWwsIEJPT0tNQVJLU19YU0xfRklMRSk7Ci0JCWlmIChidWZmZXIgIT0gbnVsbCkgewotCQkJU3RyaW5nIGh0bWxQYXRoID0gZ2V0Qm9va21hcmtIdG1sUGF0aChQVUJMSVNIRURfQk9PS01BUktTX0NGR19OQU1FKTsKLQkJCUZpbGVVdGlsLndyaXRlVVRGOEZpbGUoaHRtbFBhdGgsIGJ1ZmZlci50b1N0cmluZygpKTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCB3cml0ZUluZGV4QW5kVG9wTmF2SHRtbCgpIHsKLQkJCQkKLQkJWG1sRWxlbWVudCBvcHRpb25YbWwgPSBnZXRPcHRpb25YbWwoKTsJCQotCQkJCQotCQlTdHJpbmcgYnVmZmVyID0gUHVibGlzaGluZ1V0aWwuZ2V0SHRtbChvcHRpb25YbWwsIElOREVYX1hTTF9GSUxFKTsKLQkJaWYgKGJ1ZmZlciAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgaHRtbFBhdGggPSBnZXRJbmRleEZpbGVQYXRoKCk7Ci0JCQlGaWxlVXRpbC53cml0ZVVURjhGaWxlKGh0bWxQYXRoLCBidWZmZXIudG9TdHJpbmcoKSk7Ci0JCX0KLQotCQlidWZmZXIgPSBQdWJsaXNoaW5nVXRpbC5nZXRIdG1sKG9wdGlvblhtbCwgVE9QTkFWX1hTTF9GSUxFKTsKLQkJaWYgKGJ1ZmZlciAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgaHRtbFBhdGggPSBwdWJEaXIgKyAidG9wbmF2Lmh0bSI7IC8vJE5PTi1OTFMtMSQKLQkJCUZpbGVVdGlsLndyaXRlVVRGOEZpbGUoaHRtbFBhdGgsIGJ1ZmZlci50b1N0cmluZygpKTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCB3cml0ZVNlYXJjaEh0bWwoKSB7Ci0KLQkJYm9vbGVhbiBzZXJ2ZXJTaWRlU2VhcmNoID0gKG9wdGlvbnMgPT0gbnVsbCkgfHwgb3B0aW9ucy5pc0luY2x1ZGVTZXJ2bGV0U2VhcmNoKCk7Ci0JCQotCQlTdHJpbmcgd2ViQXBwTmFtZSA9IG9wdGlvbnMuZ2V0RHluYW1pY1dlYkFwcE5hbWUoKTsKLQkJCi0JCWlmICh3ZWJBcHBOYW1lICE9IG51bGwgJiYgd2ViQXBwTmFtZS5sZW5ndGgoKSA+IDAgJiYgc2VydmVyU2lkZVNlYXJjaCkgewotCQkKLQkJCVhtbEVsZW1lbnQgc2VhcmNoWG1sID0gbmV3IFhtbEVsZW1lbnQoIlNlYXJjaCIpLnNldEF0dHJpYnV0ZSggLy8kTk9OLU5MUy0xJAotCQkJCQkid2ViQXBwTmFtZSIsIHdlYkFwcE5hbWUpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCi0JCQlTdHJpbmcgYnVmZmVyID0gUHVibGlzaGluZ1V0aWwuZ2V0SHRtbChzZWFyY2hYbWwsIFNFQVJDSF9YU0xfRklMRSk7Ci0JCQlpZiAoYnVmZmVyICE9IG51bGwpIHsKLQkJCQlTdHJpbmcgaHRtbFBhdGggPSBnZXRTZWFyY2hGaWxlUGF0aCgpOwotCQkJCUZpbGVVdGlsLndyaXRlVVRGOEZpbGUoaHRtbFBhdGggKyAic2VhcmNoLmh0bWwiLCBidWZmZXIudG9TdHJpbmcoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEJvb2ttYXJrSHRtbFBhdGgoU3RyaW5nIGJvb21rYXJrRmlsZSkgewotCQlpbnQgaW5keCA9IGJvb21rYXJrRmlsZS5sYXN0SW5kZXhPZihCT09LTUFSS19TVUZGSVhfWE1MKTsKLQkJcmV0dXJuIHB1YkRpcgotCQkJCSsgTk9fQVBQTEVUX0RJUkVDVE9SWSArIEZpbGUuc2VwYXJhdG9yQ2hhcgotCQkJCSsgYm9vbWthcmtGaWxlLnN1YnN0cmluZygwLCBpbmR4KSArIEJPT0tNQVJLX1NVRkZJWF9IVE1MOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldEluZGV4RmlsZVBhdGgoKSB7Ci0JCXJldHVybiBwdWJEaXIgKyAiaW5kZXguaHRtIjsgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQlwcml2YXRlIFN0cmluZyBnZXRTZWFyY2hGaWxlUGF0aCgpIHsKLQkJcmV0dXJuIHB1YkRpciArIEZpbGUuc2VwYXJhdG9yQ2hhciArICJzZWFyY2giICsgRmlsZS5zZXBhcmF0b3JDaGFyOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJvdGVjdGVkIFhtbEVsZW1lbnQgZ2V0T3B0aW9uWG1sKCkgewotCQlib29sZWFuIHNob3dHbG9zc2FyeSA9IChvcHRpb25zID09IG51bGwpIHx8IG9wdGlvbnMuaXNQdWJsaXNoR2xvc3NhcnkoKTsKLQkJYm9vbGVhbiBzaG93SW5kZXggPSAob3B0aW9ucyA9PSBudWxsKSB8fCBvcHRpb25zLmlzUHVibGlzaEluZGV4KCk7Ci0KLQkJWG1sRWxlbWVudCBvcHRpb25YbWwgPSBuZXcgWG1sRWxlbWVudCgiUHVibGlzaGluZ09wdGlvbiIpOyAvLyROT04tTkxTLTEkCi0JCWlmICggb3B0aW9ucyAhPSBudWxsICkgewkJCi0JCQlvcHRpb25YbWwuc2V0QXR0cmlidXRlKCJ0aXRsZSIsIG9wdGlvbnMuZ2V0VGl0bGUoKSkgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkuc2V0QXR0cmlidXRlKCJiYW5uZXJJbWFnZSIsIG9wdGlvbnMuYmFubmVySW1hZ2UpIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJLnNldEF0dHJpYnV0ZSgiYmFubmVySW1hZ2VIZWlnaHQiLCBJbnRlZ2VyLnRvU3RyaW5nKG9wdGlvbnMuZ2V0QmFubmVySW1hZ2VIZWlnaHQoKSkpIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJLnNldEF0dHJpYnV0ZSgKLQkJCQkJImZlZWRiYWNrVXJsIiwgb3B0aW9ucy5mZWVkYmFja1VSTCkgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkuc2V0QXR0cmlidXRlKCJzaG93R2xvc3NhcnkiLCAoc2hvd0dsb3NzYXJ5ID8gInRydWUiIDogImZhbHNlIikpIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkuc2V0QXR0cmlidXRlKCJzaG93SW5kZXgiLCAoc2hvd0luZGV4ID8gInRydWUiIDogImZhbHNlIikpIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkuc2V0QXR0cmlidXRlKCJzZXJ2ZXJTaWRlU2VhcmNoIiwgb3B0aW9ucy5pc0luY2x1ZGVTZXJ2bGV0U2VhcmNoKCkgPyAidHJ1ZSIgOiAiZmFsc2UiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQotCQl9Ci0JCQotCQlyZXR1cm4gb3B0aW9uWG1sOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3NlcnZpY2VzL0dsb3NzYXJ5QnVpbGRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3NlcnZpY2VzL0dsb3NzYXJ5QnVpbGRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MWIxZTk0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy9zZXJ2aWNlcy9HbG9zc2FyeUJ1aWxkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5zZXJ2aWNlczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLlN0cmluZ1dyaXRlcjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwotaW1wb3J0IGphdmEudXRpbC5yZWdleC5NYXRjaGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLkZpbGVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24ueG1sLlhTTFRQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuSUxpYnJhcnlNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbkZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbmZpZ3VyYXRpb24uR3VpZGFuY2VHcm91cGluZ0l0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbmZpZ3VyYXRpb24uR3VpZGFuY2VJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5MaWJyYXJ5VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLlJlc291cmNlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLlB1Ymxpc2hpbmdQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRlcm1EZWZpbml0aW9uOwotCi0vKioKLSAqIEJ1aWxkIHRoZSBnbG9zc2FyeSBmaWxlIGZvciB0aGUgcHVibGlzaGVkIGNvbmZpZ3VyYXRpb24uCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBHbG9zc2FyeUJ1aWxkZXIgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgR0xPU1NBUllfQkFDS1BBVEggPSAiLi8uLi8iOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5OwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ2xhc3MgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyQ2xhc3MgPSBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3M7Ci0KLQkvLyBnZW5lcmF0ZWQgZ2xvc3NhcnkgaHRtbCBmaWxlIHJlbGF0aXZlIHRvIHRoZSBwdWJsaXNoaW5nIGRpcgotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBHTE9TU0FSWV9IVE1MX0ZJTEUgPSAicHJvY2Vzcy9nbG9zc2FyeS5odG0iOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgR0xPU1NBUllfSU5ERVhfSFRNTF9GSUxFID0gInByb2Nlc3MvZ2xvc3NhcnkvaW5kZXguaHRtIjsgLy8kTk9OLU5MUy0xJAkKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBHTE9TU0FSWV9OQVZJR19IVE1MX0ZJTEUgPSAicHJvY2Vzcy9nbG9zc2FyeS9uYXZpZy5odG0iOyAvLyROT04tTkxTLTEkCi0KLQkvLyB4c2wgdGVtcGxhdGUKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgR0xPU1NBUllfWFNMX0ZJTEUgPSAieHNsL2dsb3NzYXJ5LnhzbCI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBHTE9TU0FSWV9JTkRFWF9YU0xfRklMRSA9ICJ4c2wvZ2xvc3NhcnlfaW5kZXgueHNsIjsgLy8kTk9OLU5MUy0xJAkKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBHTE9TU0FSWV9OQVZJR19YU0xfRklMRSA9ICJ4c2wvZ2xvc3NhcnlfbmF2aWcueHNsIjsgLy8kTk9OLU5MUy0xJAotCi0JLy8gbGlzdCB0byBob2xkIGFsbCBnbG9zc2FyeSBpdGVtcy4KLQlwcml2YXRlIEdsb3NzYXJ5TGlzdCBnbG9zc2FyeUl0ZW1zOwotCi0JLyoqCi0JICogZGVmYXVsdCBjb25zdHJ1Y3RvcgotCSAqCi0JICovCi0JcHVibGljIEdsb3NzYXJ5QnVpbGRlcigpIHsKLQotCX0KLQotCS8qKgotCSAqIGJ1aWxkIHRoZSBnbG9zc2FyeSBhbmQgZ2VuZXJhdGUgdGhlIHJlbGF0ZWQgZmlsZXMuCi0JICogCi0JICogQHBhcmFtIGNvbmZpZyBNZXRob2RDb25maWd1cmF0aW9uCi0JICogQHBhcmFtIHB1YkRpciBTdHJpbmcKLQkgKiBAcGFyYW0gdGl0bGUgU3RyaW5nIHRoZSB0aXRsZSBvZiB0aGUgZ2xvc3NhcnkgcGFnZQotCSAqIEBwYXJhbSBtb25pdG9yIElQcm9ncmVzc01vbml0b3IKLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnLCBTdHJpbmcgcHViRGlyLAotCQkJU3RyaW5nIHRpdGxlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlnbG9zc2FyeUl0ZW1zID0gbmV3IEdsb3NzYXJ5TGlzdChwdWJEaXIpOwotCQkKLQkJZ2xvc3NhcnlJdGVtcy5jbGVhcigpOwotCQlJRmlsdGVyIGNvbmZpZ0ZpbHRlciA9IG5ldyBDb25maWd1cmF0aW9uRmlsdGVyKGNvbmZpZyk7Ci0JCWFkYXB0ZXJGYWN0b3J5ID0gVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkuZ2V0Q29uZmlndXJhdGlvblZpZXdfQWRhcHRlckZhY3RvcnkoY29uZmlnRmlsdGVyKTsKLQkJLy8gaXRlcmF0ZSB0aHJ1IGNvbmZpZ3VyYXRpb24gdG8gZ2V0IGFsbCBnbG9zc2FyeSBpdGVtcwotCQlpdGVyYXRlKGNvbmZpZywgbW9uaXRvcik7Ci0KLQkJLy8gY3JlYXRlIHRoZSBnbG9zc2FyeSBmaWxlCi0JCWNyZWF0ZUdsb3NzYXJ5KHB1YkRpciwgdGl0bGUpOwotCi0JfQotCi0JLyoqCi0JICogSXRlcmF0ZSB0aHJ1IHRoZSBjb25maWd1cmF0aW9uIHRyZWUgYW5kIGZpbmQgYWxsIHRlcm0gZGVmaW5pdGlvbiBlbGVtZW50cwotCSAqIGluIHRoZSBjb25maWd1cmF0aW9uCi0JICogCi0JICogQHBhcmFtIG9iagotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKi8KLQlwcml2YXRlIHZvaWQgaXRlcmF0ZShPYmplY3Qgb2JqLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQkvLyBHZXQgdGhlIGFkYXB0ZXIgZnJvbSB0aGUgZmFjdG9yeS4KLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyIHRyZWVJdGVtQ29udGVudFByb3ZpZGVyID0gKElUcmVlSXRlbUNvbnRlbnRQcm92aWRlcikgYWRhcHRlckZhY3RvcnkKLQkJCQkuYWRhcHQob2JqLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXJDbGFzcyk7Ci0KLQkJLy8gRWl0aGVyIGRlbGVnYXRlIHRoZSBjYWxsIG9yIHJldHVybiBub3RoaW5nLgotCQlpZiAodHJlZUl0ZW1Db250ZW50UHJvdmlkZXIgIT0gbnVsbCkgewotCQkJQ29sbGVjdGlvbiBpdGVtcyA9IHRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmdldENoaWxkcmVuKG9iaik7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gaXRlbXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCi0JCQkJLy8gY3JlYXRlIGJvb2ttYXJrCi0JCQkJT2JqZWN0IGl0b3JPYmogPSBMaWJyYXJ5VXRpbC51bndyYXAoaXQubmV4dCgpKTsKLQkJCQlpZiAoaXRvck9iaiBpbnN0YW5jZW9mIEd1aWRhbmNlR3JvdXBpbmdJdGVtUHJvdmlkZXIpIHsKLQkJCQkJaXRlcmF0ZShpdG9yT2JqLCBtb25pdG9yKTsKLQkJCQl9IGVsc2UgaWYgKGl0b3JPYmogaW5zdGFuY2VvZiBHdWlkYW5jZUl0ZW1Qcm92aWRlcikgewotCQkJCQlpdGVyYXRlKGl0b3JPYmosIG1vbml0b3IpOwotCQkJCX0gZWxzZSBpZiAoaXRvck9iaiBpbnN0YW5jZW9mIFRlcm1EZWZpbml0aW9uKSB7Ci0JCQkJCS8vIGNyZWF0ZSBhIGdsb3NzYXJ5IGVudHJ5IGZvciB0aGUgVGVybURlZmluaXRpb24KLQkJCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKGl0b3JPYmopOwotCQkJCQlnbG9zc2FyeUl0ZW1zLmFkZCgoVGVybURlZmluaXRpb24pIGl0b3JPYmopOwotCQkJCX0KLQotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUdsb3NzYXJ5KFN0cmluZyBwdWJEaXIsIFN0cmluZyB0aXRsZSkgewotCQl0cnkgewotCQkJVVJMIHVybCA9IG5ldyBVUkwoUHVibGlzaGluZ1BsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW5zdGFsbFVSTCgpLAotCQkJCQlHTE9TU0FSWV9YU0xfRklMRSk7Ci0JCQlpZiAodXJsID09IG51bGwpIHsKLQkJCQlTeXN0ZW0ub3V0Ci0JCQkJCQkucHJpbnRsbigiVW5hYmxlIHRvIGdldCBnbG9zc2FyeSB4c2wgdGVtcGxhdGUgIiArIEdMT1NTQVJZX1hTTF9GSUxFKTsgLy8kTk9OLU5MUy0xJAotCQkJCXJldHVybjsKLQkJCX0KLQotCQkJU3RyaW5nIHhzbF91cmkgPSBQbGF0Zm9ybS5yZXNvbHZlKHVybCkuZ2V0UGF0aCgpOwotCQkJU3RyaW5nQnVmZmVyIHhtbCA9IGdsb3NzYXJ5SXRlbXMuZ2V0WG1sKCk7Ci0KLQkJCUZpbGUgZiA9IG5ldyBGaWxlKHB1YkRpciwgR0xPU1NBUllfSFRNTF9GSUxFKTsKLQkJCUZpbGUgcGFyZW50ID0gZi5nZXRQYXJlbnRGaWxlKCk7Ci0JCQlpZiAoIXBhcmVudC5leGlzdHMoKSkgewotCQkJCXBhcmVudC5ta2RpcnMoKTsKLQkJCX0KLQotCQkJLy8gZ2VlbnJhdGUgdGhlIGh0bWwKLQkJCVByb3BlcnRpZXMgeHNsUGFyYW1zID0gUHVibGlzaGluZ1BsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJvcGVydGllcygKLQkJCQkJIi94c2wvcmVzb3VyY2VzLnByb3BlcnRpZXMiKTsgLy8kTk9OLU5MUy0xJAotCQkJLy8gUHJvcGVydGllcyB4c2xQYXJhbXMgPSBuZXcgUHJvcGVydGllcygpOwotCQkJeHNsUGFyYW1zLnNldFByb3BlcnR5KCJ0aXRsZSIsIHRpdGxlKTsgLy8kTk9OLU5MUy0xJAkJCQotCQkJU3RyaW5nV3JpdGVyIHN3ID0gbmV3IFN0cmluZ1dyaXRlcigpOwotCQkJWFNMVFByb2Nlc3Nvci50cmFuc2Zvcm0oeHNsX3VyaSwgeG1sLnRvU3RyaW5nKCksIHhzbFBhcmFtcywgc3cpOwotCQkJc3cuZmx1c2goKTsKLQkJCS8vIFN0cmluZyBjb250ZW50ID0gc3cuZ2V0QnVmZmVyKCkudG9TdHJpbmcoKTsKLQotCQkJLy8gbmVlZCB0byBkZWNvZGUgdGhlIHVybHMKLQkJCVN0cmluZyBjb250ZW50ID0gUmVzb3VyY2VIZWxwZXIuZGVjb2RlVXJsc0luQ29udGVudChzdy5nZXRCdWZmZXIoKQotCQkJCQkudG9TdHJpbmcoKSk7Ci0JCQlGaWxlVXRpbC53cml0ZVVURjhGaWxlKGYuZ2V0QWJzb2x1dGVQYXRoKCksIGZpeENvbnRlbnQoY29udGVudCkpOwotCi0JCQkvLyAvLyBmaXggdGhlIGVsZW1lbnQgbGlua3MKLQkJCS8vIEZpbGVXcml0ZXIgb3V0cHV0ID0gbmV3IEZpbGVXcml0ZXIoZik7Ci0JCQkvLyBvdXRwdXQud3JpdGUoZml4Q29udGVudChjb250ZW50KSk7Ci0JCQkvLyBvdXRwdXQuZmx1c2goKTsKLQkJCS8vIG91dHB1dC5jbG9zZSgpOwotCQkJc3cuY2xvc2UoKTsKLQotCQkJLy8gYWxzbyBzYXZlIHRoZSBnbG9zc2FyeSBuYXZpZ2F0aW9uIGhlYWRlciBodG1sIGZpbGUKLQkJCXVybCA9IG5ldyBVUkwoUHVibGlzaGluZ1BsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW5zdGFsbFVSTCgpLAotCQkJCQlHTE9TU0FSWV9JTkRFWF9YU0xfRklMRSk7Ci0JCQlpZiAodXJsID09IG51bGwpIHsKLQkJCQlTeXN0ZW0ub3V0Ci0JCQkJCQkucHJpbnRsbigiVW5hYmxlIHRvIGdldCBnbG9zc2FyeSB4c2wgdGVtcGxhdGUgIiArIEdMT1NTQVJZX0lOREVYX1hTTF9GSUxFKTsgLy8kTk9OLU5MUy0xJAotCQkJCXJldHVybjsKLQkJCX0KLQotCQkJeHNsX3VyaSA9IFBsYXRmb3JtLnJlc29sdmUodXJsKS5nZXRQYXRoKCk7Ci0JCQlmID0gbmV3IEZpbGUocHViRGlyLCBHTE9TU0FSWV9JTkRFWF9IVE1MX0ZJTEUpOwotCQkJc3cgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0JCQlYU0xUUHJvY2Vzc29yLnRyYW5zZm9ybSh4c2xfdXJpLCB4bWwudG9TdHJpbmcoKSwgeHNsUGFyYW1zLCBzdyk7Ci0JCQlzdy5mbHVzaCgpOwotCi0JCQkvLyBtYWtlIHN1cmUgdGhlIGZpbGUgaXMgY3JlYXRlZC4KLQkJCWlmICggIWYuZXhpc3RzKCkgKSB7Ci0JCQkJRmlsZSBwZiA9IGYuZ2V0UGFyZW50RmlsZSgpOwotCQkJCWlmICghcGYuZXhpc3RzKCkpIHsKLQkJCQkJcGYubWtkaXJzKCk7Ci0JCQkJfQotCQkJCWYuY3JlYXRlTmV3RmlsZSgpOwotCQkJfQotCQkJCi0JCQlGaWxlVXRpbC53cml0ZVVURjhGaWxlKGYuZ2V0QWJzb2x1dGVQYXRoKCksIHN3LnRvU3RyaW5nKCkpOwotCi0JCQlzdy5jbG9zZSgpOwotCi0JCQkvLyBhbHNvIHNhdmUgdGhlIGdsb3NzYXJ5IG5hdmlnYXRpb24gaGVhZGVyIGh0bWwgZmlsZQotCQkJdXJsID0gbmV3IFVSTChQdWJsaXNoaW5nUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbnN0YWxsVVJMKCksCi0JCQkJCUdMT1NTQVJZX05BVklHX1hTTF9GSUxFKTsKLQkJCWlmICh1cmwgPT0gbnVsbCkgewotCQkJCVN5c3RlbS5vdXQKLQkJCQkJCS5wcmludGxuKCJVbmFibGUgdG8gZ2V0IGdsb3NzYXJ5IHhzbCB0ZW1wbGF0ZSAiICsgR0xPU1NBUllfTkFWSUdfWFNMX0ZJTEUpOyAvLyROT04tTkxTLTEkCi0JCQkJcmV0dXJuOwotCQkJfQotCi0JCQl4c2xfdXJpID0gUGxhdGZvcm0ucmVzb2x2ZSh1cmwpLmdldFBhdGgoKTsKLQkJCWYgPSBuZXcgRmlsZShwdWJEaXIsIEdMT1NTQVJZX05BVklHX0hUTUxfRklMRSk7Ci0JCQlzdyA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLQkJCVhTTFRQcm9jZXNzb3IudHJhbnNmb3JtKHhzbF91cmksIHhtbC50b1N0cmluZygpLCB4c2xQYXJhbXMsIHN3KTsKLQkJCXN3LmZsdXNoKCk7Ci0KLQkJCUZpbGVVdGlsLndyaXRlVVRGOEZpbGUoZi5nZXRBYnNvbHV0ZVBhdGgoKSwgc3cudG9TdHJpbmcoKSk7Ci0KLQkJCXN3LmNsb3NlKCk7Ci0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQlleC5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0KLQotCXByaXZhdGUgU3RyaW5nIGZpeENvbnRlbnQoU3RyaW5nIHNvdXJjZSkgewotCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCU1hdGNoZXIgbSA9IFJlc291cmNlSGVscGVyLnBfbGlua19yZWYubWF0Y2hlcihzb3VyY2UpOwotCi0JCXdoaWxlIChtLmZpbmQoKSkgewotCQkJU3RyaW5nIHVybHRleHQgPSBtLmdyb3VwKDEpOwotCQkJU3RyaW5nIGxpbmtlZFRleHQgPSBtLmdyb3VwKDIpOwotCi0JCQl1cmx0ZXh0ID0gZml4VXJsVGV4dCh1cmx0ZXh0KTsKLQotCQkJLy8gdXBkYXRlIHRoZSB1cmwgdGV4dAotCQkJU3RyaW5nIHRleHQgPSAiPGEgIiArIHVybHRleHQgKyAiPiIgKyBsaW5rZWRUZXh0ICsgIjwvYT4iOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCi0JCQltLmFwcGVuZFJlcGxhY2VtZW50KHNiLCBSZXNvdXJjZUhlbHBlci5yZWdFeHBFc2NhcGUodGV4dCkpOwotCQl9Ci0KLQkJbS5hcHBlbmRUYWlsKHNiKTsKLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZml4VXJsVGV4dChTdHJpbmcgdXJsdGV4dCkgewotCQlTdHJpbmcgZ3VpZCA9IFJlc291cmNlSGVscGVyLmdldEd1aWRGcm9tVXJsKHVybHRleHQpOwotCQlpZiAoZ3VpZCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gdXJsdGV4dDsKLQkJfQotCi0JCUlMaWJyYXJ5TWFuYWdlciBtYW5hZ2VyID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKQotCQkJCS5nZXRDdXJyZW50TGlicmFyeU1hbmFnZXIoKTsKLQkJTWV0aG9kRWxlbWVudCBlID0gbWFuYWdlciAhPSBudWxsID8gbWFuYWdlci5nZXRNZXRob2RFbGVtZW50KGd1aWQpCi0JCQkJOiBudWxsOwotCQlpZiAoZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gdXJsdGV4dDsKLQkJfQotCi0JCS8vIGlmIHRoZSBlbGVtZW50IGlzIGEgVGVybURlZmluaXRpb24sIHVzZSB0aGUgYm9va21hcmsgaW4gdGhlIGZpbGUKLQkJLy8gb3RoZXJ3aXNlLCBmaW5kIHRoZSBwYXRoIHRvIHRoZSBlbGVtZW50Ci0JCVN0cmluZyBocmVmID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKGUgaW5zdGFuY2VvZiBUZXJtRGVmaW5pdGlvbikgewotCQkJaHJlZiA9ICIjIiArIGUuZ2V0TmFtZSgpOyAvLyROT04tTkxTLTEkCi0JCX0gZWxzZSB7Ci0JCQkvLyBvbmUgbGV2ZWwgYmFjawotCQkJaHJlZiA9ICIuLi8iICsgUmVzb3VyY2VIZWxwZXIuZ2V0RWxlbWVudFBhdGgoZSkucmVwbGFjZShGaWxlLnNlcGFyYXRvckNoYXIsICcvJykgKyBSZXNvdXJjZUhlbHBlci5nZXRGaWxlTmFtZShlLCAiLmh0bWwiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlNYXRjaGVyIG0gPSBSZXNvdXJjZUhlbHBlci5wX2xpbmtfaHJlZl9waWNrZXIKLQkJCQkubWF0Y2hlcigiICIgKyB1cmx0ZXh0ICsgIiAiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWlmIChtLmZpbmQoKSkgewotCQkJbS5hcHBlbmRSZXBsYWNlbWVudChzYiwgIiBocmVmPVwiIiArIGhyZWYgKyAiXCIgIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJbS5hcHBlbmRUYWlsKHNiKTsKLQotCQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JCX0KLQotCQlyZXR1cm4gdXJsdGV4dDsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvc2VydmljZXMvR2xvc3NhcnlMaXN0LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvc2VydmljZXMvR2xvc3NhcnlMaXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1ZTA3NTguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3NlcnZpY2VzL0dsb3NzYXJ5TGlzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnNlcnZpY2VzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuVHJlZU1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LklMaWJyYXJ5UmVzb3VyY2VNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC51dGlsLlhtbEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5Db250ZW50UmVzb3VyY2VTY2FubmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuUmVzb3VyY2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGVybURlZmluaXRpb247Ci0KLQotLyoqCi0gKiBIb2xkcyBhbGwgZ2xvc3NhcnkgaXRlbXMgYW5kIHNvcnQgdGhlbSBpbiBkZXNpcmVkIG9yZGVyIGdyb3VwZWQgYnkgZmlyc3QKLSAqIGxldHRlciBvZiB0aGUgZ2xvc3NhcnkgbmFtZSBUT0RPOiBBZGQgYSBicmllZiBkZXNjcmlwdGlvbiBmb3IgdGhpcyBjbGFzcy4KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEdsb3NzYXJ5TGlzdCB7Ci0KLQkvLyB1c2luZyB0aGUgZGVmYXVsdCBvcmRlciBmcm9tIHRoZSBjb25maWd1cmF0aW9uIGV4cGxvcmVyLgotCS8vIG1heWJlIGEgc3BlY2lhbCBzb3J0ZWQgbGlzdCBsYXRlciwKLQkvLyBUcmVlTWFwIG9mIHRoZSBmaXJzdCBsZXR0ZXIgb2YgdGhlIGdsb3NzYXJ5IG1hcCB0byBhIChTb3J0ZWQpIExpc3Qgb2YKLQkvLyBnbG9zc2FyeSBJdGVtcwotCXByaXZhdGUgVHJlZU1hcCBpdGVtTWFwID0gbmV3IFRyZWVNYXAoKTsKLQotCXByaXZhdGUgU3RyaW5nIHB1YkRpcjsKLQkKLQkvKioKLQkgKiBkZWZhdWx0IGNvbnN0cnVjdG9yCi0JICoKLQkgKi8KLQlwdWJsaWMgR2xvc3NhcnlMaXN0KFN0cmluZyBwdWJEaXIpIHsKLQkJdGhpcy5wdWJEaXIgPSBwdWJEaXI7Ci0JfQotCi0JLyoqCi0JICogaW5pdGlhbGl6ZSB0aGUgbGlzdAotCSAqCi0JICovCi0JcHVibGljIHZvaWQgY2xlYXIoKSB7Ci0JCWl0ZW1NYXAuY2xlYXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBhZGQgYSBUZXJtRGVmaW5pdGlvbiBpbnRvIHRoZSBnbG9zc2FyeSBsaXN0Ci0JICogCi0JICogQHBhcmFtIGVsZW1lbnQgVGVybURlZmluaXRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGQoVGVybURlZmluaXRpb24gZWxlbWVudCkgewotCQlTdHJpbmcgbmFtZSA9IFRuZ1V0aWwuZ2V0UHJlc2VudGF0aW9uTmFtZShlbGVtZW50KTsKLQkJU3RyaW5nIGdyb3VwID0gIiIgKyBuYW1lLmNoYXJBdCgwKTsgLy8kTk9OLU5MUy0xJAotCQlnZXRJdGVtTGlzdChncm91cCkuYWRkKGVsZW1lbnQpOwotCX0KLQotCXByaXZhdGUgTGlzdCBnZXRJdGVtTGlzdChTdHJpbmcgZ3JvdXApIHsKLQkJZ3JvdXAgPSBncm91cC50b1VwcGVyQ2FzZSgpOwotCQlMaXN0IGwgPSAoTGlzdCkgaXRlbU1hcC5nZXQoZ3JvdXApOwotCQlpZiAobCA9PSBudWxsKSB7Ci0JCQlsID0gbmV3IEFycmF5TGlzdCgpOwotCQkJaXRlbU1hcC5wdXQoZ3JvdXAsIGwpOwotCQl9Ci0KLQkJcmV0dXJuIGw7Ci0JfQotCi0JLyoqCi0JICogZ2V0IHRoZSB4bWwgZG9jdW1lbnQgZm9yIHRoZSBsaXN0Ci0JICogCi0JICogQHJldHVybiBTdHJpbmdCdWZmZXIKLQkgKi8KLQlwdWJsaWMgU3RyaW5nQnVmZmVyIGdldFhtbCgpIHsKLQkJWG1sRWxlbWVudCB4ZSA9IG5ldyBYbWxFbGVtZW50KCJHbG9zc2FyeSIpOyAvLyROT04tTkxTLTEkCi0KLQkJLy8gc2V0IHRoZSBsYW5ndWFnZSBhdHRyaWJ1dGUKLQkJTG9jYWxlIGxvY2FsZSA9IExvY2FsZS5nZXREZWZhdWx0KCk7Ci0JCVN0cmluZyBsYW5nID0gbG9jYWxlLmdldExhbmd1YWdlKCk7Ci0JCXhlLnNldEF0dHJpYnV0ZSgibGFuZyIsIGxhbmcpOyAvLyROT04tTkxTLTEkCi0KLQkJZm9yIChJdGVyYXRvciBpdCA9IGl0ZW1NYXAuZW50cnlTZXQoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBpdC5uZXh0KCk7Ci0JCQlTdHJpbmcgZ3JvdXAgPSAoU3RyaW5nKSBlbnRyeS5nZXRLZXkoKTsKLQkJCUxpc3QgaXRlbXMgPSAoTGlzdCkgZW50cnkuZ2V0VmFsdWUoKTsKLQotCQkJLy8gY3JlYXRlIGEgYm9va21hcmsgZm9yIHRoZSBncm91cAotCQkJeGUubmV3Q2hpbGQoIml0ZW0iKSAvLyROT04tTkxTLTEkCi0JCQkJCS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCBncm91cCkgLy8kTk9OLU5MUy0xJAotCQkJCQkuc2V0QXR0cmlidXRlKCJwcmVzZW50YXRpb25OYW1lIiwgZ3JvdXApIC8vJE5PTi1OTFMtMSQKLQkJCQkJLnNldEF0dHJpYnV0ZSgibmF2aWdhdGlvbi1tYXJrIiwgInRydWUiKSAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJLnNldEF0dHJpYnV0ZSgiY29udGVudCIsICIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkJCS8vIHRoZW4gY3JlYXRlIGVudHJ5IGZvciBlYWNoIGl0ZW0KLQkJCWZvciAoSXRlcmF0b3IgaXRJdGVtID0gaXRlbXMuaXRlcmF0b3IoKTsgaXRJdGVtLmhhc05leHQoKTspIHsKLQkJCQlUZXJtRGVmaW5pdGlvbiBlbGVtZW50ID0gKFRlcm1EZWZpbml0aW9uKSBpdEl0ZW0ubmV4dCgpOwotCQkJCVN0cmluZyBuYW1lID0gZWxlbWVudC5nZXROYW1lKCk7Ci0JCQkJU3RyaW5nIHByZXNlbnRhdGlvbk5hbWUgPSBUbmdVdGlsLmdldFByZXNlbnRhdGlvbk5hbWUoZWxlbWVudCk7Ci0JCQkJU3RyaW5nIGNvbnRlbnQgPSBlbGVtZW50LmdldFByZXNlbnRhdGlvbigpLmdldE1haW5EZXNjcmlwdGlvbigpOwotCi0JCQkJLy8gc2NhbiB0aGUgY29udGVudCBhbmQgY29weSBpbWFnZXMgaWYgYW55Ci0JCQkJc2NhbkNvbnRlbnRGb3JSZXNvdXJjZXMoZWxlbWVudCwgY29udGVudCwgUmVzb3VyY2VIZWxwZXIuZ2V0RWxlbWVudFBhdGgoZWxlbWVudCkpOwotCi0JCQkJLy8gZml4IHRoZSBsaW5rcyBpbiB0aGUgY29udGVudAotCQkJCWNvbnRlbnQgPSBSZXNvdXJjZUhlbHBlci5maXhDb250ZW50VXJsUGF0aChjb250ZW50LAotCQkJCQkJUmVzb3VyY2VIZWxwZXIuZ2V0RWxlbWVudFBhdGgoZWxlbWVudCksCi0JCQkJCQlHbG9zc2FyeUJ1aWxkZXIuR0xPU1NBUllfQkFDS1BBVEgpOwotCQkJCQotCQkJCXhlLm5ld0NoaWxkKCJpdGVtIikgLy8kTk9OLU5MUy0xJAotCQkJCQkJLnNldEF0dHJpYnV0ZSgibmFtZSIsIG5hbWUpIC8vJE5PTi1OTFMtMSQKLQkJCQkJCS5zZXRBdHRyaWJ1dGUoInByZXNlbnRhdGlvbk5hbWUiLCBwcmVzZW50YXRpb25OYW1lKSAvLyROT04tTkxTLTEkCi0JCQkJCQkuc2V0QXR0cmlidXRlKCJjb250ZW50IiwgY29udGVudCk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCi0JCXJldHVybiB4ZS50b1htbCgpOwotCX0KLQotCS8qKgotCSAqIFNjYW5zIHRoZSBjb250ZW50IGZvciByZXNvdXJjZSByZWZlcmVuY2VzLgotCSAqLwotCXByaXZhdGUgdm9pZCBzY2FuQ29udGVudEZvclJlc291cmNlcyhNZXRob2RFbGVtZW50IG93bmVyLCBTdHJpbmcgY29udGVudCwKLQkJCVN0cmluZyBjb250ZW50UGF0aCkgewotCQlDb250ZW50UmVzb3VyY2VTY2FubmVyIHNjYW5uZXIgPSBnZXRTY2FubmVyKG93bmVyKTsKLQkJaWYgKCBzY2FubmVyICE9IG51bGwgKSB7Ci0JCQlzY2FubmVyLnJlc29sdmVSZXNvdXJjZXMob3duZXIsIGNvbnRlbnQsIGNvbnRlbnRQYXRoKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjb250ZW50IHJlc291cmNlIHNjYW5uZXIgZm9yIHRoZSBlbGVtZW50LgotCSAqLwotCXByaXZhdGUgQ29udGVudFJlc291cmNlU2Nhbm5lciBnZXRTY2FubmVyKE1ldGhvZEVsZW1lbnQgb3duZXIpIHsKLQkJSUxpYnJhcnlSZXNvdXJjZU1hbmFnZXIgcmVzTWdyID0gUmVzb3VyY2VIZWxwZXIuZ2V0UmVzb3VyY2VNZ3Iob3duZXIpOwotCQlpZiAoIHJlc01nciA9PSBudWxsICkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJCi0JCVN0cmluZyByb290Q29udGVudFBhdGggPSByZXNNZ3IuZ2V0TG9naWNhbFBsdWdpblBhdGgob3duZXIpOwotCQlGaWxlIHNyY19yb290ID0gbmV3IEZpbGUocmVzTWdyLmdldFBoeXNpY2FsUGx1Z2luUGF0aChvd25lcikpOwotCQlGaWxlIHRndF9yb290ID0gbmV3IEZpbGUodGhpcy5wdWJEaXIsIHJvb3RDb250ZW50UGF0aCk7Ci0JCUNvbnRlbnRSZXNvdXJjZVNjYW5uZXIgc2Nhbm5lciA9IG5ldyBDb250ZW50UmVzb3VyY2VTY2FubmVyKHNyY19yb290LCB0Z3Rfcm9vdCwgcm9vdENvbnRlbnRQYXRoLCBudWxsKTsKLQotCQlyZXR1cm4gc2Nhbm5lcjsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvc2VydmljZXMvSVNpdGVHZW5lcmF0b3IuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy9zZXJ2aWNlcy9JU2l0ZUdlbmVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MjZkZTE2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy9zZXJ2aWNlcy9JU2l0ZUdlbmVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcuc2VydmljZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5Cb29rbWFyazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuSHRtbEJ1aWxkZXI7Ci0KLS8qKgotICogZGVmaW5lIHRoZSBpbnRlcmZhY2UgZm9yIHNpdGUgZ2VuZXJhdG9yLiAKLSAqIEVhY2ggcHVibGlzaGVyIHNob3VsZCBpbXBsZW1lbnQgYSBzaXRlIGdlbmVyYXRvciB0byBoYW5kbGUgdGhlIHNpdGUgZ2VuZXJhdGlvbiBwcm9wZXJseS4KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVNpdGVHZW5lcmF0b3IgewotCQkJCi0JcHVibGljIHZvaWQgcHJlUHVibGlzaCgpIHRocm93cyBFeGNlcHRpb247Ci0JcHVibGljIHZvaWQgcG9zdFB1Ymxpc2goKSB0aHJvd3MgRXhjZXB0aW9uOwotCi0JcHVibGljIHZvaWQgd3JpdGVQdWJsaXNoZWRCb29rbWFya3MoTGlzdCBib29rbWFya3MsIEJvb2ttYXJrIGRlZmF1bHRWaWV3KSB0aHJvd3MgRXhjZXB0aW9uOwotCi0JcHVibGljIEh0bWxCdWlsZGVyIGdldEh0bWxCdWlsZGVyKCk7Ci0JcHVibGljIFB1Ymxpc2hPcHRpb25zIGdldFB1Ymxpc2hPcHRpb25zKCk7Ci0JcHVibGljIFN0cmluZyBnZXRJbmRleEZpbGVQYXRoKCk7Ci0JcHVibGljIFN0cmluZyBnZXROb2RlSWNvblBhdGgoKTsgCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpOwotCQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3NlcnZpY2VzL0luZGV4QnVpbGRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3NlcnZpY2VzL0luZGV4QnVpbGRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MmY5YjBiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy9zZXJ2aWNlcy9JbmRleEJ1aWxkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5zZXJ2aWNlczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVXcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5TdHJpbmdXcml0ZXI7Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi54bWwuWFNMVFByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb25GaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb25maWd1cmF0aW9uLkd1aWRhbmNlR3JvdXBpbmdJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb25maWd1cmF0aW9uLkd1aWRhbmNlSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuTGlicmFyeVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcuUHVibGlzaGluZ1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZXJtRGVmaW5pdGlvbjsKLQotCi0vKioKLSAqIEJ1aWxkIHRoZSBnbG9zc2FyeSBmaWxlIGZvciB0aGUgcHVibGlzaGVkIGNvbmZpZ3VyYXRpb24uCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBJbmRleEJ1aWxkZXIgewotCi0JcHJpdmF0ZSBBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIENsYXNzIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlckNsYXNzID0gSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzOwotCi0JLy8gZ2VuZXJhdGVkIGdsb3NzYXJ5IGh0bWwgZmlsZSByZWxhdGl2ZSB0byB0aGUgcHVibGlzaGluZyBkaXIKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5ERVhfSFRNTF9GSUxFID0gImluZGV4L2NvbnRlbnRzLmh0bSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJTkRFWF9OQVZJR19IVE1MX0ZJTEUgPSAiaW5kZXgvbmF2aWcuaHRtIjsgLy8kTk9OLU5MUy0xJAotCi0JLy8geHNsIHRlbXBsYXRlCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElOREVYX1hTTF9GSUxFID0gInhzbC9pbmRleF9jb250ZW50cy54c2wiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5ERVhfTkFWSUdfWFNMX0ZJTEUgPSAieHNsL2luZGV4X25hdmlnLnhzbCI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIGxpc3QgdG8gaG9sZCBhbGwgZ2xvc3NhcnkgaXRlbXMuCi0JcHJpdmF0ZSBJbmRleExpc3QgaW5kZXhJdGVtcyA9IG5ldyBJbmRleExpc3QoKTsKLQotCS8qKgotCSAqIGRlZmF1bHQgY29uc3RydWN0b3IKLQkgKgotCSAqLwotCXB1YmxpYyBJbmRleEJ1aWxkZXIoKSB7Ci0KLQl9Ci0KLQkvKioKLQkgKiBidWlsZCB0aGUgaW5kZXggZm9yIHRoZSBwdWJsaXNoZWQgc2l0ZS4KLQkgKiAKLQkgKiBAcGFyYW0gY29uZmlnIE1ldGhvZENvbmZpZ3VyYXRpb24KLQkgKiBAcGFyYW0gcHViRGlyIFN0cmluZwotCSAqIEBwYXJhbSB0aXRsZSBTdHJpbmcgdGhlIHRpdGxlIGZvciB0aGUgZ2xvc3NhcnkgaW5kZXggcGFnZQotCSAqIEBwYXJhbSBtb25pdG9yIElQcm9ncmVzc01vbml0b3IKLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnLCBTdHJpbmcgcHViRGlyLAotCQkJU3RyaW5nIHRpdGxlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJaW5kZXhJdGVtcy5jbGVhcigpOwotCQlJRmlsdGVyIGNvbmZpZ0ZpbHRlciA9IG5ldyBDb25maWd1cmF0aW9uRmlsdGVyKGNvbmZpZyk7Ci0JCWFkYXB0ZXJGYWN0b3J5ID0gVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkuZ2V0Q29uZmlndXJhdGlvblZpZXdfQWRhcHRlckZhY3RvcnkoY29uZmlnRmlsdGVyKTsKLQkJLy8gaXRlcmF0ZSB0aHJ1IGNvbmZpZ3VyYXRpb24gdG8gZ2V0IGFsbCBnbG9zc2FyeSBpdGVtcwotCQlpdGVyYXRlKGNvbmZpZyk7Ci0KLQkJLy8gY3JlYXRlIHRoZSBnbG9zc2FyeSBmaWxlCi0JCWNyZWF0ZUluZGV4KHB1YkRpciwgdGl0bGUpOwotCi0JfQotCi0JLyoqCi0JICogSXRlcmF0ZSB0aHJ1IHRoZSBjb25maWd1cmF0aW9uIHRyZWUgYW5kIGZpbmQgYWxsIHRlcm0gZGVmaW5pdGlvbiBlbGVtZW50cwotCSAqIGluIHRoZSBjb25maWd1cmF0aW9uCi0JICogCi0JICogQHBhcmFtIG9iagotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKi8KLQlwcml2YXRlIHZvaWQgaXRlcmF0ZShPYmplY3Qgb2JqKSB7Ci0JCS8vIEdldCB0aGUgYWRhcHRlciBmcm9tIHRoZSBmYWN0b3J5LgotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIgdHJlZUl0ZW1Db250ZW50UHJvdmlkZXIgPSAoSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyKSBhZGFwdGVyRmFjdG9yeQotCQkJCS5hZGFwdChvYmosIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlckNsYXNzKTsKLQotCQkvLyBFaXRoZXIgZGVsZWdhdGUgdGhlIGNhbGwgb3IgcmV0dXJuIG5vdGhpbmcuCi0JCWlmICh0cmVlSXRlbUNvbnRlbnRQcm92aWRlciAhPSBudWxsKSB7Ci0JCQlDb2xsZWN0aW9uIGl0ZW1zID0gdHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuZ2V0Q2hpbGRyZW4ob2JqKTsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBpdGVtcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJLy8gY3JlYXRlIGJvb2ttYXJrCi0JCQkJT2JqZWN0IGl0b3JPYmogPSBMaWJyYXJ5VXRpbC51bndyYXAoaXQubmV4dCgpKTsKLQkJCQlpZiAoaXRvck9iaiBpbnN0YW5jZW9mIEd1aWRhbmNlR3JvdXBpbmdJdGVtUHJvdmlkZXIpIHsKLQkJCQkJaXRlcmF0ZShpdG9yT2JqKTsKLQkJCQl9IGVsc2UgaWYgKGl0b3JPYmogaW5zdGFuY2VvZiBHdWlkYW5jZUl0ZW1Qcm92aWRlcikgewotCQkJCQlpdGVyYXRlKGl0b3JPYmopOwotCQkJCX0gZWxzZSBpZiAoaXRvck9iaiBpbnN0YW5jZW9mIFRlcm1EZWZpbml0aW9uKSB7Ci0JCQkJCS8vIGluZGV4IHRoZSB0ZXJtIGRlZmluaXRpb24gb2JqZWN0cwotCQkJCQlUZXJtRGVmaW5pdGlvbiB0ZXJtID0gKFRlcm1EZWZpbml0aW9uKSBpdG9yT2JqOwotCQkJCQlTdHJpbmcgbmFtZSA9IHRlcm0uZ2V0TmFtZSgpOwotCQkJCQlTdHJpbmcgY29udGVudCA9ICJkZWZpbml0aW9uIGluIGdsb3NzYXJ5IjsgLy8kTk9OLU5MUy0xJAotCQkJCQlTdHJpbmcgdXJsID0gIi4uL2dsb3NzYXJ5L2dsb3NzYXJ5Lmh0bSMiICsgdGVybS5nZXROYW1lKCk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJaW5kZXhJdGVtcy5hZGQobmFtZSwgY29udGVudCwgdXJsKTsKLQkJCQl9Ci0KLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVJbmRleChTdHJpbmcgcHViRGlyLCBTdHJpbmcgdGl0bGUpIHsKLQkJdHJ5IHsKLQkJCVVSTCB1cmwgPSBuZXcgVVJMKFB1Ymxpc2hpbmdQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEluc3RhbGxVUkwoKSwKLQkJCQkJSU5ERVhfWFNMX0ZJTEUpOwotCQkJaWYgKHVybCA9PSBudWxsKSB7Ci0JCQkJU3lzdGVtLm91dAotCQkJCQkJLnByaW50bG4oIlVuYWJsZSB0byBnZXQgaW5kZXggeHNsIHRlbXBsYXRlICIgKyBJTkRFWF9YU0xfRklMRSk7IC8vJE5PTi1OTFMtMSQKLQkJCQlyZXR1cm47Ci0JCQl9Ci0KLQkJCVN0cmluZyB4c2xfdXJpID0gUGxhdGZvcm0ucmVzb2x2ZSh1cmwpLmdldFBhdGgoKTsKLQkJCVN0cmluZ0J1ZmZlciB4bWwgPSBpbmRleEl0ZW1zLmdldFhtbCgpOwotCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKHhtbCk7Ci0KLQkJCUZpbGUgZiA9IG5ldyBGaWxlKHB1YkRpciwgSU5ERVhfSFRNTF9GSUxFKTsKLQkJCUZpbGUgcGFyZW50ID0gZi5nZXRQYXJlbnRGaWxlKCk7Ci0JCQlpZiAoIXBhcmVudC5leGlzdHMoKSkgewotCQkJCXBhcmVudC5ta2RpcnMoKTsKLQkJCX0KLQotCQkJLy8gZ2VlbnJhdGUgdGhlIGh0bWwKLQkJCVByb3BlcnRpZXMgeHNsUGFyYW1zID0gbmV3IFByb3BlcnRpZXMoKTsKLQkJCXhzbFBhcmFtcy5zZXRQcm9wZXJ0eSgidGl0bGUiLCB0aXRsZSk7IC8vJE5PTi1OTFMtMSQJCQkKLQkJCVN0cmluZ1dyaXRlciBzdyA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLQkJCVhTTFRQcm9jZXNzb3IudHJhbnNmb3JtKHhzbF91cmksIHhtbC50b1N0cmluZygpLCB4c2xQYXJhbXMsIHN3KTsKLQkJCXN3LmZsdXNoKCk7Ci0JCQlTdHJpbmcgY29udGVudCA9IHN3LmdldEJ1ZmZlcigpLnRvU3RyaW5nKCk7Ci0KLQkJCS8vIGZpeCB0aGUgZWxlbWVudCBsaW5rcwotCQkJRmlsZVdyaXRlciBvdXRwdXQgPSBuZXcgRmlsZVdyaXRlcihmKTsKLQkJCW91dHB1dC53cml0ZShjb250ZW50KTsKLQkJCW91dHB1dC5mbHVzaCgpOwotCQkJb3V0cHV0LmNsb3NlKCk7Ci0KLQkJCS8vIGFsc28gc2F2ZSB0aGUgZ2xvc3NhcnkgbmF2aWdhdGlvbiBoZWFkZXIgaHRtbCBmaWxlCi0JCQl1cmwgPSBuZXcgVVJMKFB1Ymxpc2hpbmdQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEluc3RhbGxVUkwoKSwKLQkJCQkJSU5ERVhfTkFWSUdfWFNMX0ZJTEUpOwotCQkJaWYgKHVybCA9PSBudWxsKSB7Ci0JCQkJU3lzdGVtLm91dAotCQkJCQkJLnByaW50bG4oIlVuYWJsZSB0byBnZXQgZ2xvc3NhcnkgeHNsIHRlbXBsYXRlICIgKyBJTkRFWF9OQVZJR19YU0xfRklMRSk7IC8vJE5PTi1OTFMtMSQKLQkJCQlyZXR1cm47Ci0JCQl9Ci0KLQkJCXhzbF91cmkgPSBQbGF0Zm9ybS5yZXNvbHZlKHVybCkuZ2V0UGF0aCgpOwotCQkJZiA9IG5ldyBGaWxlKHB1YkRpciwgSU5ERVhfTkFWSUdfSFRNTF9GSUxFKTsKLQkJCW91dHB1dCA9IG5ldyBGaWxlV3JpdGVyKGYpOwotCQkJWFNMVFByb2Nlc3Nvci50cmFuc2Zvcm0oeHNsX3VyaSwgeG1sLnRvU3RyaW5nKCksIHhzbFBhcmFtcywgb3V0cHV0KTsKLQkJCW91dHB1dC5mbHVzaCgpOwotCQkJb3V0cHV0LmNsb3NlKCk7Ci0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQlleC5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3NlcnZpY2VzL0luZGV4TGlzdC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3NlcnZpY2VzL0luZGV4TGlzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZTdiMThjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy9zZXJ2aWNlcy9JbmRleExpc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5zZXJ2aWNlczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlRyZWVNYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQudXRpbC5YbWxFbGVtZW50OwotCi0vKioKLSAqIEhvbGRzIGFsbCBnbG9zc2FyeSBpdGVtcyBhbmQgc29ydCB0aGVtIGluIGRlc2lyZWQgb3JkZXIgZ3JvdXBlZCBieSBmaXJzdAotICogbGV0dGVyIG9mIHRoZSBnbG9zc2FyeSBuYW1lIFRPRE86IEFkZCBhIGJyaWVmIGRlc2NyaXB0aW9uIGZvciB0aGlzIGNsYXNzLgotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgSW5kZXhMaXN0IHsKLQotCS8vIHVzaW5nIHRoZSBkZWZhdWx0IG9yZGVyIGZyb20gdGhlIGNvbmZpZ3VyYXRpb24gZXhwbG9yZXIuCi0JLy8gbWF5YmUgYSBzcGVjaWFsIHNvcnRlZCBsaXN0IGxhdGVyLAotCS8vIFRyZWVNYXAgb2YgdGhlIGZpcnN0IGxldHRlciBvZiB0aGUgZ2xvc3NhcnkgbWFwIHRvIGEgKFNvcnRlZCkgTGlzdCBvZgotCS8vIGdsb3NzYXJ5IEl0ZW1zCi0JcHJpdmF0ZSBUcmVlTWFwIGl0ZW1NYXAgPSBuZXcgVHJlZU1hcCgpOwotCi0JLyoqCi0JICogZGVmYXVsdCBjb25zdHJ1Y3RvcgotCSAqCi0JICovCi0JcHVibGljIEluZGV4TGlzdCgpIHsKLQl9Ci0KLQkvKioKLQkgKiBpbmlzbGl6ZSB0aGUgbGlzdAotCSAqCi0JICovCi0JcHVibGljIHZvaWQgY2xlYXIoKSB7Ci0JCWl0ZW1NYXAuY2xlYXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBhZGQgYW4gZW50cnkgdG8gdGhlIGxpc3QKLQkgKiAKLQkgKiBAcGFyYW0gdGVybSBTdHJpbmcKLQkgKiBAcGFyYW0gY29udGVudCBTdHJpbmcKLQkgKiBAcGFyYW0gdXJsIFN0cmluZwotCSAqLwotCXB1YmxpYyB2b2lkIGFkZChTdHJpbmcgdGVybSwgU3RyaW5nIGNvbnRlbnQsIFN0cmluZyB1cmwpIHsKLQkJSW5kZXhJdGVtIGl0ZW0gPSBuZXcgSW5kZXhJdGVtKHRlcm0sIGNvbnRlbnQsIHVybCk7Ci0JCVN0cmluZyBncm91cCA9ICIiICsgaXRlbS50ZXJtTmFtZS5jaGFyQXQoMCk7IC8vJE5PTi1OTFMtMSQKLQkJZ2V0SXRlbUxpc3QoZ3JvdXApLmFkZChpdGVtKTsKLQl9Ci0KLQlwcml2YXRlIExpc3QgZ2V0SXRlbUxpc3QoU3RyaW5nIGdyb3VwKSB7Ci0JCWdyb3VwID0gZ3JvdXAudG9VcHBlckNhc2UoKTsKLQkJTGlzdCBsID0gKExpc3QpIGl0ZW1NYXAuZ2V0KGdyb3VwKTsKLQkJaWYgKGwgPT0gbnVsbCkgewotCQkJbCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWl0ZW1NYXAucHV0KGdyb3VwLCBsKTsKLQkJfQotCi0JCXJldHVybiBsOwotCX0KLQotCS8qKgotCSAqIGdldCB0aGUgeG1sIGRvY3VtZW50IGZvciB0aGUgbGlzdAotCSAqIAotCSAqIEByZXR1cm4gU3RyaW5nQnVmZmVyCi0JICovCi0JcHVibGljIFN0cmluZ0J1ZmZlciBnZXRYbWwoKSB7Ci0JCVhtbEVsZW1lbnQgeGUgPSBuZXcgWG1sRWxlbWVudCgiSW5kZXgiKTsgLy8kTk9OLU5MUy0xJAotCi0JCWZvciAoSXRlcmF0b3IgaXQgPSBpdGVtTWFwLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSkgaXQubmV4dCgpOwotCQkJU3RyaW5nIGdyb3VwID0gKFN0cmluZykgZW50cnkuZ2V0S2V5KCk7Ci0JCQlMaXN0IGl0ZW1zID0gKExpc3QpIGVudHJ5LmdldFZhbHVlKCk7Ci0KLQkJCS8vIGNyZWF0ZSBhIGJvb2ttYXJrIGZvciB0aGUgZ3JvdXAKLQkJCXhlLm5ld0NoaWxkKCJpdGVtIikgLy8kTk9OLU5MUy0xJAotCQkJCQkuc2V0QXR0cmlidXRlKCJuYW1lIiwgZ3JvdXApIC8vJE5PTi1OTFMtMSQKLQkJCQkJLnNldEF0dHJpYnV0ZSgicHJlc2VudGF0aW9uTmFtZSIsIGdyb3VwKSAvLyROT04tTkxTLTEkCi0JCQkJCS5zZXRBdHRyaWJ1dGUoIm5hdmlnYXRpb24tbWFyayIsICJ0cnVlIikgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCS5zZXRBdHRyaWJ1dGUoImNvbnRlbnQiLCAiIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JCQkvLyB0aGVuIGNyZWF0ZSBlbnRyeSBmb3IgZWFjaCBpdGVtCi0JCQlmb3IgKEl0ZXJhdG9yIGl0SXRlbSA9IGl0ZW1zLml0ZXJhdG9yKCk7IGl0SXRlbS5oYXNOZXh0KCk7KSB7Ci0JCQkJSW5kZXhJdGVtIGl0ZW0gPSAoSW5kZXhJdGVtKSBpdEl0ZW0ubmV4dCgpOwotCQkJCXhlLm5ld0NoaWxkKCJpdGVtIikgLy8kTk9OLU5MUy0xJAotCQkJCQkJLnNldEF0dHJpYnV0ZSgibmFtZSIsIGl0ZW0udGVybU5hbWUpIC8vJE5PTi1OTFMtMSQKLQkJCQkJCS5zZXRBdHRyaWJ1dGUoInByZXNlbnRhdGlvbk5hbWUiLCBpdGVtLnRlcm1OYW1lKSAvLyROT04tTkxTLTEkCi0JCQkJCQkuc2V0QXR0cmlidXRlKCJjb250ZW50IiwgaXRlbS5jb250ZW50KSAvLyROT04tTkxTLTEkCi0JCQkJCQkuc2V0QXR0cmlidXRlKCJ1cmwiLCBpdGVtLnVybCk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCi0JCXJldHVybiB4ZS50b1htbCgpOwotCX0KLQotCWNsYXNzIEluZGV4SXRlbSB7Ci0JCXB1YmxpYyBTdHJpbmcgdGVybU5hbWU7Ci0KLQkJcHVibGljIFN0cmluZyBjb250ZW50OwotCi0JCXB1YmxpYyBTdHJpbmcgdXJsOwotCi0JCXB1YmxpYyBJbmRleEl0ZW0oU3RyaW5nIHRlcm1OYW1lLCBTdHJpbmcgY29udGVudCwgU3RyaW5nIHVybCkgewotCQkJdGhpcy50ZXJtTmFtZSA9IHRlcm1OYW1lOwotCQkJdGhpcy5jb250ZW50ID0gY29udGVudDsKLQkJCXRoaXMudXJsID0gdXJsOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvc2VydmljZXMvUHJvY2Vzc1B1Ymxpc2hpbmdDb250ZW50VmFsaWRhdG9yLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvc2VydmljZXMvUHJvY2Vzc1B1Ymxpc2hpbmdDb250ZW50VmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkYWQ2Y2YuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3NlcnZpY2VzL1Byb2Nlc3NQdWJsaXNoaW5nQ29udGVudFZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjg0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8gCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5zZXJ2aWNlczsKLQotaW1wb3J0IGphdmEuaW8uUHJpbnRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5MaWJyYXJ5VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5QdWJsaXNoaW5nUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRDYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HdWlkYW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5QcmFjdGljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvYWRtYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5TdXBwb3J0aW5nTWF0ZXJpYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZXJtRGVmaW5pdGlvbjsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBjb250ZW50IHZhbGlkYXRvciBmb3IgcHVibGlzaGluZyBhIHByb2Nlc3MgY2xvc3VyZS4gCi0gKiBUaGUgdmFsaWRhdG9yIHdpbGwgY2hlY2sgZWxlbWVudHMgYWdhaW5zdCB0aGUgcHJvY2VzcyBjbG9zdXJlIGFuZCBkZXRlcm1pbmUgaWYgCi0gKiBhbiBlbGVtZW50IHNob3VsZCBiZSBwdWJsaXNoZWQgb3Igbm90LgotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICoKLSAqLwotcHVibGljIGNsYXNzIFByb2Nlc3NQdWJsaXNoaW5nQ29udGVudFZhbGlkYXRvciBleHRlbmRzIFB1Ymxpc2hpbmdDb250ZW50VmFsaWRhdG9yIHsKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIENMT1NVUkVfTE9HX0ZJTEVOQU1FID0gInByb2Nlc3NDbG9zdXJlLmh0bWwiOyAvLyROT04tTkxTLTEkCi0KLQkvLyBjbG9zdXJlIGVsZW1lbnRzIGZvciBwcm9jZXNzIHB1Ymxpc2hpbmcsIG51bGwgZm9yIGNvbmZpZyBwdWJsaXNoaW5nCi0JTGlzdCBjbG9zdXJlRWxlbWVudHMgPSBudWxsOwotCXByaXZhdGUgYm9vbGVhbiBpc0ZpbmFsQ2xvc3VyZSA9IGZhbHNlOwotCQotLy8JLy8gbWFpbnRhaW4gdGhlIG9iamVjdCByZWZlcmVuY2VzIGdlbmVyYXRlZCBmcm9tIFRhc2tEZXNjcmlwdG9ycwotLy8JLy8gbWFwIG9mIG93bmVyIGVsZW1lbnQgdG8gYSBsaXN0IG9mIHJlZmVyZW5jZWQgZWxlbWVudHMKLS8vCU1hcCBvYmpSZWZlcmVuY2VzID0gbmV3IEhhc2hNYXAoKTsKLQkKLQlwcml2YXRlIGJvb2xlYW4gZGVidWcgPSBQdWJsaXNoaW5nUGx1Z2luLmdldERlZmF1bHQoKS5pc0RlYnVnZ2luZygpOwotCQotCXByb3RlY3RlZCBQcmludFN0cmVhbSBjbG9zdXJlTG9nID0gbnVsbDsKLQkKLQkvKioKLQkgKiBjb25zdHJ1Y3RvcgotCSAqIAotCSAqIEBwYXJhbSBwdWJEaXIgU3RyaW5nCi0JICogQHBhcmFtIHZhbGlkYXRlRXh0ZXJuYWxMaW5rcyBib29sZWFuCi0JICovCi0JcHVibGljIFByb2Nlc3NQdWJsaXNoaW5nQ29udGVudFZhbGlkYXRvcihTdHJpbmcgcHViRGlyLCBQdWJsaXNoSFRNTE9wdGlvbnMgb3B0aW9ucykgewotCQlzdXBlcihwdWJEaXIsIG9wdGlvbnMpOwotCQkKLQkJY2xvc3VyZUxvZyA9IGdldFN0cmVhbShDTE9TVVJFX0xPR19GSUxFTkFNRSk7Ci0JCWJlZ2luQ2xvc3VyZUxvZygpOwotCi0JfQotCi0JLyoqCi0JICogYWRkIHRoZSBlbGVtZW50cyB0byB0aGUgcHJvY2VzcyBjbG9zdXJlLgotCSAqIEBwYXJhbSBpdGVtcyBMaXN0Ci0JICovCi0JcHVibGljIHZvaWQgYWRkQ2xvc3VyZUVsZW1lbnRzKExpc3QgaXRlbXMpIHsKLQkJLy8gZG8gbm90aGluZwotCQlpZiAoIGNsb3N1cmVFbGVtZW50cyA9PSBudWxsICkgewotCQkJY2xvc3VyZUVsZW1lbnRzID0gbmV3IEFycmF5TGlzdCgpOwotCQl9Ci0JCQotCQljbG9zdXJlRWxlbWVudHMuYWRkQWxsKGl0ZW1zKTsKLQl9Ci0KLQkvKioKLQkgKiAJbWFrZSBlbGVtZW50IGNsb3N1cmUgCi0JICogIGFsbCB0aGUgcHVibGlzaGVkIGFuZCByZWZlcmVuY2VkIGVsZW1lbnRzIGFyZSB0aGUgZWxlbWVudCBjbG9zdXJlLiAKLQkgKiAgc2luY2UgdGhleSBhcmUgYWxsIHRoZSBlbGVtZW50cyByZWZlcmVuY2VkIGJ5IHRoZSBwcm9jZXNzZXMgYW5kIHRoZWlyIHJlbGF0ZWQgcHJvY2VzcyBlbGVtZW50cy4gCi0JICovCi0JcHVibGljIHZvaWQgbWFrZUVsZW1lbnRDbG9zdXJlKCkgewotCQl0aGlzLmlzRmluYWxDbG9zdXJlID0gdHJ1ZTsKLQkJCi0JCWVuZENsb3N1cmVMb2coKTsKLQkJCi0JCS8vIHRlc3QKLQkJaWYgKCBkZWJ1ZykgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCI9PT09PT09PT09PT09PT09PT09PT09IENsb3N1cmUgZWxlbWVudHMgPT09PT09PT09PT09PT09PT09PT09PT0iKTsgLy8kTk9OLU5MUy0xJAotCQkJZm9yIChJdGVyYXRvciBpdCA9IGNsb3N1cmVFbGVtZW50cy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7ICkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbihMaWJyYXJ5VXRpbC5nZXRUeXBlTmFtZSgoTWV0aG9kRWxlbWVudClpdC5uZXh0KCkpKTsKLQkJCX0KLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiPT09PT09PT09PT09PT09PT09PT09PSBDbG9zdXJlIGVsZW1lbnRzIGVuZCA9PT09PT09PT09PT09PT09PT09PT09PSIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0JCi0JLyoqCi0JICogY2hlY2sgaWYgYSBjbG9zdXJlIGlzIGNyZWF0ZWQgb3Igbm90LgotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc0Nsb3N1cmUoKSB7Ci0JCXJldHVybiAoY2xvc3VyZUVsZW1lbnRzICE9IG51bGwpICYmIChjbG9zdXJlRWxlbWVudHMuc2l6ZSgpID4gMCk7Ci0JfQotCQotCS8qKgotCSAqIGRldGVybWluZSBpZiB0aGUgZWxlbWVudCBpcyBpbiB0aGUgcHJvY2VzcyBlbGVtZW50IGNsb3N1cmUgb3Igbm90Ci0JICogVGhlIHByb2Nlc3MgZWxlbWVudCBjbG9zdXJlIGNvbnRhaW5zIGFsbCB0aGUgcHJvY2VzcyBlbGVtZW50cyBvZiB0aGUgc2VsZWN0ZWQgcHJvY2Vzc2VzLCAKLQkgKiBwbHVzIGFsbCB0aGUgY29udGVudCBlbGVtZW50cyB0aG9zZSBlbGVtZW50cyByZWZlcmVuY2VkLgotCSAqIAotCSAqIEBwYXJhbSBlIE1ldGhvZEVsZW1lbnQKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpbkNsb3N1cmUoTWV0aG9kRWxlbWVudCBlKSB7Ci0JCQotCQlpZiAoIGUgPT0gbnVsbCApIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQkKLQkJaWYgKCAhaGFzQ2xvc3VyZSgpICkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJCi0JCWlmICggZSBpbnN0YW5jZW9mIENvbnRlbnRDYXRlZ29yeSApIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCQotCQkvLyAxNjYwNDggLSBjaGVjay1pdGVtcywgdGFzay1zdGVwcyBkb24ndCBhcHBlYXIgd2hlbiB1c2luZyB0aGUgcHVibGlzaGluZyB0eXBlICJwdWJsaXNoIHRoZSBwcm9jZXNzZXMgc2VsZWN0ZWQgYmVsb3ciCi0JCWlmICggQ29uZmlndXJhdGlvbkhlbHBlci5pc0Rlc2NyaXB0aW9uRWxlbWVudChlKSApIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCQotCQlpZiAoIGNsb3N1cmVFbGVtZW50cy5jb250YWlucyhlKSApIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCQotCQlpZiAoICEoZSBpbnN0YW5jZW9mIEd1aWRhbmNlKSApIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQkKLQkJaWYgKCBlIGluc3RhbmNlb2YgUHJhY3RpY2UgCi0JCQkJfHwgZSBpbnN0YW5jZW9mIFJvYWRtYXAgCi0JCQkJfHwgZSBpbnN0YW5jZW9mIFN1cHBvcnRpbmdNYXRlcmlhbCAKLQkJCQl8fCBlIGluc3RhbmNlb2YgVGVybURlZmluaXRpb24gKQotCQl7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0JCXJldHVybiBmYWxzZTsKLQkJCQotCX0KLQkKLQkvKioKLQkgKiBjaGVjayBpZiB0aGUgZWxlbWVudCBpcyBkaXNjYXJkZWQgb3Igbm90Ci0JICogZGlzY2FyZGVkIGVsZW1lbnRzIHdpbGwgYmUgdHJlYXRlZCBhcyBvdXQgc2lkZSB0aGUgY29uZmlndXJzYXRpb24KLQkgKiAKLQkgKiBAcGFyYW0gb3duZXIgTWV0aG9kRWxlbWVudCB0aGUgb3duZXIgb2YgdGhlIGVsZW1lbnQKLQkgKiBAcGFyYW0gZmVhdHVyZSBPYmplY3QgRVN0cnVjdHVyYWxGZWF0dXJlIG9yIE9wcG9zaXRlRmVhdHVyZQotCSAqIEBwYXJhbSBlIE1ldGhvZEVsZW1lbnQgdGhlIGVsZW1lbnQgdG8gYmUgY2hlY2tlZAotCSAqLwotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGNvbS5pYm0ucm1jLmxpYnJhcnkubGF5b3V0LklDb250ZW50VmFsaWRhdG9yI2lzRGlzY2FyZGVkKG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudCwgamF2YS5sYW5nLk9iamVjdCwgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50KQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRGlzY2FyZGVkKE1ldGhvZEVsZW1lbnQgb3duZXIsIE9iamVjdCBmZWF0dXJlLCBNZXRob2RFbGVtZW50IGUpIHsKLQkKLQkJaWYgKCBvd25lciA9PSBudWxsICkgewotCQkJb3duZXIgPSBkZWZhdWx0VGFyZ2V0OwotCQl9IGVsc2UgaWYgKCBkZWZhdWx0VGFyZ2V0ICE9IG51bGwgJiYgb3duZXIgIT0gZGVmYXVsdFRhcmdldCApIHsKLQkJCQotCQkJc3VwZXIubG9nV2FybmluZygiVGFyZ2V0IG1pc21hdGNoIiArIExpYnJhcnlVdGlsLmdldFR5cGVOYW1lKG93bmVyKSArICI8LS0tPiIgKyBMaWJyYXJ5VXRpbC5nZXRUeXBlTmFtZShkZWZhdWx0VGFyZ2V0KSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JCQotCQlpZiAoIHN1cGVyLmlzRGlzY2FyZGVkKG93bmVyLCBmZWF0dXJlLCBlKSApIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCQotCQlib29sZWFuIGluQ2xzID0gaW5DbG9zdXJlKGUpOwotCQlpZiAoIWluQ2xzICYmICFpc0ZpbmFsQ2xvc3VyZSApIHsKLQkJCS8vIGlmIHRoZSBjbG9zdXJlIGlzIG5vdCBmaW5hbCwgdGhlbiBpZiB0aGUgb3duZXIgaXMgaW4gY2xvc3VyZSBhbmQgdGhlIGVsZW1lbnQgaXMgYSBHdWlkYW5jZSwgCi0JCQkvLyB0aGlzIGVsZW1lbnQgaXMgYWxzbyBpbiBjbG9zdXJlCi0JCQlpbkNscyA9IGluQ2xvc3VyZShvd25lcikgJiYgKGUgaW5zdGFuY2VvZiBHdWlkYW5jZSk7Ci0JCX0KLQkJCi0JCWlmICggIWluQ2xzICkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJCi0vLwkJLy8gc3BlY2lhbCBoYW5kbGluZyBmb3IgVGFza3MKLS8vCQlpZiAoIG93bmVyIGluc3RhbmNlb2YgVGFzayApIHsKLS8vCQkJaWYgKCBmZWF0dXJlID09IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tfQWRkaXRpb25hbGx5UGVyZm9ybWVkQnkoKSB8fCAKLS8vCQkJCQlmZWF0dXJlID09IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tfTWFuZGF0b3J5SW5wdXQoKSB8fAotLy8JCQkJCWZlYXR1cmUgPT0gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza19PcHRpb25hbElucHV0KCkgfHwgCi0vLwkJCQkJZmVhdHVyZSA9PSBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrX091dHB1dCgpICkgewotLy8JCQkJTGlzdCByZWZzID0gKExpc3Qpb2JqUmVmZXJlbmNlcy5nZXQob3duZXIpOwotLy8JCQkJaWYgKCByZWZzICE9IG51bGwgJiYgIXJlZnMuY29udGFpbnMoZSkgKSB7Ci0vLwkJCQkJcmV0dXJuIHRydWU7Ci0vLwkJCQl9Ci0vLwkJCX0KLS8vCQl9Ci0JCQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCQotCS8qKgotCSAqIGRpc3Bvc2UgdGhlIG9iamVjdAotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCQotCQlpZiAoIGNsb3N1cmVFbGVtZW50cyAhPSBudWxsICkgewotCQkJY2xvc3VyZUVsZW1lbnRzLmNsZWFyKCk7Ci0JCX0KLQkJCi0vLwkJaWYgKCBvYmpSZWZlcmVuY2VzICE9IG51bGwgKSB7Ci0vLwkJCW9ialJlZmVyZW5jZXMuY2xlYXIoKTsKLS8vCQl9Ci0JCQotCQlpZiAoIGNsb3N1cmVMb2cgIT0gbnVsbCApIHsKLQkJCWNsb3N1cmVMb2cuY2xvc2UoKTsKLQkJCWNsb3N1cmVMb2cgPSBudWxsOwotCQl9Ci0JCQotCQlzdXBlci5kaXNwb3NlKCk7Ci0JCQotCX0KLQkKLQlwcml2YXRlIHZvaWQgYmVnaW5DbG9zdXJlTG9nKCkgewotCQljbG9zdXJlTG9nLnByaW50bG4oIjx0YWJsZT4iKTsgLy8kTk9OLU5MUy0xJAotCQlhZGRMb2dFbnRyeSgiPGI+RWxlbWVudDwvYj4iLCAiPGI+UmVmZXJlbmNlZCBCeTwvYj4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCQotCXByaXZhdGUgdm9pZCBlbmRDbG9zdXJlTG9nKCkgewotCQljbG9zdXJlTG9nLnByaW50bG4oIjwvdGFibGU+Iik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGFkZExvZ0VudHJ5KFN0cmluZyBzdHIxLCBTdHJpbmcgc3RyMikgewotCQlTdHJpbmdCdWZmZXIgYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJYi5hcHBlbmQoIjx0cj48dGQ+IikuYXBwZW5kKHN0cjEpLmFwcGVuZCgiPC90ZD48dGQ+IikuYXBwZW5kKHN0cjIpLmFwcGVuZCgiPC90ZD48L3RyPiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQljbG9zdXJlTG9nLnByaW50bG4oYik7Ci0JfQotCQotCS8qKgotCSAqIGxvZyB0aGUgcmVmZXJlbmNlZCBlbGVtZW50LgotCSAqIAotCSAqIEBwYXJhbSBvd25lciBNZXRob2RFbGVtZW50IHRoZSByZWZlcmVuY2luZyBlbGVtZW50Ci0JICogQHBhcmFtIGUgTWV0aG9kRWxlbWVudCB0aGUgcmVmZXJlbmNlZCBlbGVtZW50Ci0JICovCi0JcHVibGljIHZvaWQgbG9nUmVmZXJlbmNlKE1ldGhvZEVsZW1lbnQgb3duZXIsIE1ldGhvZEVsZW1lbnQgZSkKLQl7Ci0JCXN1cGVyLmxvZ1JlZmVyZW5jZShvd25lciwgZSk7Ci0JCWlmICggZSBpbnN0YW5jZW9mIERlc2NyaXB0b3IgKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCWlmICggIWlzRmluYWxDbG9zdXJlICYmIGNsb3N1cmVMb2cgIT0gbnVsbCkgewotCQkJCi0JCQlTdHJpbmdCdWZmZXIgYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCWlmICggb3duZXIgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50ICkgewotCQkJCWIuYXBwZW5kKGdldEJyZWFrZG93bkVsZW1lbnRMYWJlbCgoQnJlYWtkb3duRWxlbWVudClvd25lcikpOwotCQkJfSBlbHNlIGlmICggb3duZXIgIT0gbnVsbCApIHsKLQkJCQliLmFwcGVuZChMaWJyYXJ5VXRpbC5nZXRUeXBlTmFtZShvd25lcikpOwotCQkJfQotCQkJCi0JCQlhZGRMb2dFbnRyeShMaWJyYXJ5VXRpbC5nZXRUeXBlTmFtZShlKSwgYi50b1N0cmluZygpKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIFN0cmluZ0J1ZmZlciBnZXRCcmVha2Rvd25FbGVtZW50TGFiZWwoQnJlYWtkb3duRWxlbWVudCBlKSB7Ci0JCVN0cmluZ0J1ZmZlciBiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQliLmFwcGVuZChMaWJyYXJ5VXRpbC5nZXRUeXBlTmFtZShlKSk7Ci0KLQkJd2hpbGUgKCAoZT1lLmdldFN1cGVyQWN0aXZpdGllcygpKSAhPSBudWxsICkgewotCQkJYi5pbnNlcnQoMCwgTGlicmFyeVV0aWwuZ2V0VHlwZU5hbWUoZSkgKyAiLyIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJCi0JCXJldHVybiBiOwotCX0KLQkJCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvc2VydmljZXMvUHJvY2Vzc1B1Ymxpc2hpbmdFbGVtZW50UmVhbGl6ZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy9zZXJ2aWNlcy9Qcm9jZXNzUHVibGlzaGluZ0VsZW1lbnRSZWFsaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNzBjNDIwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy9zZXJ2aWNlcy9Qcm9jZXNzUHVibGlzaGluZ0VsZW1lbnRSZWFsaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLyAKLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnNlcnZpY2VzOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uRWxlbWVudFJlYWxpemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci0KLQotLyoqCi0gKiBFbGVtZW50UmVhbGl6ZXIgZm9yIHByb2Nlc3MgcHVibGlzaGluZy4KLSAqIFJlYWxpemVzIHRoZSBlbGVtZW50IGJhc2VkIG9uIHRoZSBjb25maWd1cmF0aW9uLCByZWFsaXplIG9wdGlvbnMsIGFuZCB0aGUgcHJvY2VzcyBjbG9zdXJlLgotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUHJvY2Vzc1B1Ymxpc2hpbmdFbGVtZW50UmVhbGl6ZXIgZXh0ZW5kcyBQdWJsaXNoaW5nRWxlbWVudFJlYWxpemVyIHsKLQkKLQkvKioKLQkgKiBjb25zdHJ1Y3RvcgotCSAqIAotCSAqIEBwYXJhbSBjb25maWcgTWV0aG9kQ29uZmlndXJhdGlvbgotCSAqIEBwYXJhbSB2YWxpZGF0b3IgUHJvY2Vzc1B1Ymxpc2hpbmdDb250ZW50VmFsaWRhdG9yCi0JICovCi0JcHJvdGVjdGVkIFByb2Nlc3NQdWJsaXNoaW5nRWxlbWVudFJlYWxpemVyKE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnLCBQcm9jZXNzUHVibGlzaGluZ0NvbnRlbnRWYWxpZGF0b3IgdmFsaWRhdG9yKSB7Ci0JCXN1cGVyKGNvbmZpZywgdmFsaWRhdG9yKTsKLQl9Ci0KLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgRWxlbWVudFJlYWxpemVyIG5ld1Byb2Nlc3NQdWJsaXNoaW5nRWxlbWVudFJlYWxpemVyKE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnLAotCQkJUHJvY2Vzc1B1Ymxpc2hpbmdDb250ZW50VmFsaWRhdG9yIHZhbGlkYXRvcikgewotCQlQcm9jZXNzUHVibGlzaGluZ0VsZW1lbnRSZWFsaXplciByZWFsaXplciA9IChQcm9jZXNzUHVibGlzaGluZ0VsZW1lbnRSZWFsaXplcikgY3JlYXRlRWxlbWVudFJlYWxpemVyRXh0ZW5zaW9uKGNvbmZpZywgUHJvY2Vzc1B1Ymxpc2hpbmdFbGVtZW50UmVhbGl6ZXJfVHlwZSk7Ci0JCWlmIChyZWFsaXplciA9PSBudWxsKSB7Ci0JCQlyZWFsaXplciA9IG5ldyBQcm9jZXNzUHVibGlzaGluZ0VsZW1lbnRSZWFsaXplcihjb25maWcsIG51bGwpOwotCQl9Ci0JCXJlYWxpemVyLnZhbGlkYXRvciA9IHZhbGlkYXRvcjsKLQkJCi0JCXJldHVybiByZWFsaXplcjsKLQl9Ci0JCi0JLyoqCi0JICogcmVhbGl6ZSB0aGUgZWxlbWVudC4gCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQgTWV0aG9kRWxlbWVudAotCSAqIEByZXR1cm4gTWV0aG9kRWxlbWVudCB0aGUgcmVhbGl6ZWQgZWxlbWVudC4KLQkgKi8KLQlwdWJsaWMgTWV0aG9kRWxlbWVudCByZWFsaXplKE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgewotCQkKLQkJcmV0dXJuIHN1cGVyLnJlYWxpemUoZWxlbWVudCk7Ci0JfQotCQotCS8qKgotCSAqIHJlYWxpemUgdGhlIGxpc3Qgb2YgZmVhdHVyZSB2YWx1ZXMgYW5kIHJldHVybnMgYSBuZXcgbGlzdCBvZiB2YWx1ZXMKLQkgKiBUaGUgbmV3IG1pZ2h0IGJlIGEgcmUtc29ydGluZyBvZiB0aGUgb3JpZ2luYWwgbGlzdCAKLQkgKiBvciBzb21lIG9mIHRoZSB2YWx1ZXMgY2FuIGJlIGZpbHRlcmVkIG91dCwgZGVwZW5kaW5nIG9uIHRoZSBkZXRhaWwgaW1wbGVtZW50YXRpb24KLQkgKiBOb3RlOiB0aGUgbGlzdCB2YWx1ZSBwYXNzZWQgaW4gbWlnaHQgYmUgdXBkYXRlZCBhcyB3ZWxsLgotCSAqIEBwYXJhbSBlbGVtZW50IE1ldGhvZEVsZW1lbnQKLQkgKiBAcGFyYW0gZmVhdHVyZSBFU3RydWN0dXJhbEZlYXR1cmUKLQkgKiBAcGFyYW0gdmFsdWVzIExpc3QKLQkgKiBAcmV0dXJuIExpc3QKLQkgKi8KLQlwdWJsaWMgTGlzdCByZWFsaXplKE1ldGhvZEVsZW1lbnQgZWxlbWVudCwgCi0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgTGlzdCB2YWx1ZXMpCi0JewkJCi0JCUxpc3QgaXRlbXMgPSBzdXBlci5yZWFsaXplKGVsZW1lbnQsIGZlYXR1cmUsIHZhbHVlcyk7Ci0JCi0vLwkJLy8gYWRkIHRoZSBmZWF0dXJlIHJlZmVyZW5jZXMgaW4gY2FzZSB0aGUgdmFsaWRhdG9yIG5lZWQgZmVhdHVyZS1iYXNlZCByZWZlcmVuY2UgaW5mb3JtYXRpb24sCi0vLwkJLy8gZm9yIGV4YW1wbGUsIHdoZW4gcHVibGlzaGluZyBwcm9jZXNzLCB0aGUgb3V0cHV0IFdQcyBpbiBhIFRhc2sgc2hvdWxkIG5vdCBiZSBwdWJsaXNoZWQgCi0vLwkJLy8gaXQgbm9uZSBvZiB0aGUgVGFza0Rlc2NyaXB0b3JzIGZvciB0aGlzIHRhc2sgaGFzIHJlZmVyZW5jZSB0byB0aGF0IFdQLgotLy8JCWlmICggZWxlbWVudCBpbnN0YW5jZW9mIFRhc2tEZXNjcmlwdG9yICkgewotLy8JCQlUYXNrIHQgPSAoVGFzaylyZWFsaXplKCgoVGFza0Rlc2NyaXB0b3IpZWxlbWVudCkuZ2V0VGFzaygpKTsKLS8vCQkJCi0vLwkJCSgoUHJvY2Vzc1B1Ymxpc2hpbmdDb250ZW50VmFsaWRhdG9yKXZhbGlkYXRvcikuc2V0RWxlbWVudFJlZmVyZW5jZXModCwgaXRlbXMpOwotLy8JCQkKLS8vCQl9Ci0JCQotCQlyZXR1cm4gaXRlbXM7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvc2VydmljZXMvUHVibGlzaEhUTUxPcHRpb25zLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvc2VydmljZXMvUHVibGlzaEhUTUxPcHRpb25zLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3NzIzZDQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3NlcnZpY2VzL1B1Ymxpc2hIVE1MT3B0aW9ucy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnNlcnZpY2VzOwotCi1pbXBvcnQgamF2YS5hd3QuSW1hZ2U7Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotCi1pbXBvcnQgamF2YXguaW1hZ2Vpby5JbWFnZUlPOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LmVsZW1lbnRzLkFjdGl2aXR5TGF5b3V0OwotCi0vKioKLSAqIEV4dGVuZHMgdGJlIGJhc2ljIHB1Ymxpc2ggb3B0aW9ucyB0byBpbmNsdWRlIEhUTUwgb3B0aW9ucy4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4yCi0gKi8KLXB1YmxpYyBjbGFzcyBQdWJsaXNoSFRNTE9wdGlvbnMgZXh0ZW5kcyBQdWJsaXNoT3B0aW9ucyB7Ci0KLQkvLyBUaGUgSFRNTCB0aXRsZS4KLQlwcm90ZWN0ZWQgU3RyaW5nIHRpdGxlOwotCi0JLy8gVGhlIGFib3V0IEhUTUwuCi0JcHJvdGVjdGVkIFN0cmluZyBhYm91dEhUTUw7Ci0KLQkvLyBUaGUgZmVlZGJhY2sgVVJMLgotCXByb3RlY3RlZCBTdHJpbmcgZmVlZGJhY2tVUkw7Ci0KLQkvLyBQdWJsaXNoIGdsb3NzYXJ5IG9wdGlvbi4KLQlwcm90ZWN0ZWQgYm9vbGVhbiBwdWJsaXNoR2xvc3Nhcnk7Ci0KLQkvLyBQdWJsaXNoIGluZGV4IG9wdGlvbi4KLQlwcm90ZWN0ZWQgYm9vbGVhbiBwdWJsaXNoSW5kZXg7Ci0KLQkvLyBUaGUgYmFubmVyIGltYWdlLgotCXByb3RlY3RlZCBTdHJpbmcgYmFubmVySW1hZ2U7Ci0JCi0JcHJvdGVjdGVkIGludCBiYW5uZXJJbWFnZUhlaWdodCA9IDY3OyAvLyBiYW5uZXIgaW1hZ2UgaGVpZ2h0LCBjYW4gd2UgYXV0byBjYWxjIGl0Pz8/Ci0KLQkvLyBDaGVjayBleHRlcm5hbCBsaW5rcyBvcHRpb24uCi0JcHJvdGVjdGVkIGJvb2xlYW4gY2hlY2tFeHRlcm5hbExpbmtzOwotCi0JLy8gQ29udmVydCBicm9rZW4gbGlua3MgdG8gcGxhaW4gdGV4dCBvcHRpb24uCi0JcHJvdGVjdGVkIGJvb2xlYW4gY29udmVydEJyb2tlbkxpbmtzOwotCi0JLy8gUHVibGlzaCBKYXZhU2NyaXB0IG5hdmlnYXRpb24gdHJlZSBvcHRpb24uCi0JcHJvdGVjdGVkIGJvb2xlYW4gcHVibGlzaEphdmFTY3JpcHRUcmVlID0gdHJ1ZTsKLQotCS8vIFB1Ymxpc2ggZHluYW1pYyB3ZWIgYXBwbGljYXRpb24gb3B0aW9uLgotCXByb3RlY3RlZCBib29sZWFuIHB1Ymxpc2hEeW5hbWljV2ViQXBwOwotCi0JLy8gVGhlIGR5bmFtaWMgd2ViIGFwcGxpY2F0aW9uIG5hbWUuCi0JcHJvdGVjdGVkIFN0cmluZyBkeW5hbWljV2ViQXBwTmFtZTsKLQotCS8vIEluY2x1ZGUgc2VydmxldCBzZWFyY2ggb3B0aW9uLgotCXByb3RlY3RlZCBib29sZWFuIGluY2x1ZGVTZXJ2bGV0U2VhcmNoOwotCi0JLy8gZGVmaW5lIHRoZSBkZWZhdWx0IGFjdGl2aXR5IHRhYgotCXByb3RlY3RlZCBTdHJpbmcgZGVmYXVsdEFjdGl2aXR5VGFiID0gQWN0aXZpdHlMYXlvdXQuVEFCX05BTUVfQUNUSVZJVFlfV0JTOwotCQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFB1Ymxpc2hIVE1MT3B0aW9ucygpIHsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBQdWJsaXNoSFRNTE9wdGlvbnMoUHVibGlzaE9wdGlvbnMgb3B0aW9ucykgewotCQl0aGlzLnB1Ymxpc2hEaXIgPSBvcHRpb25zLmdldFB1Ymxpc2hEaXIoKTsKLQkJdGhpcy5wcm9jZXNzZXMgPSBvcHRpb25zLmdldFByb2Nlc3NlcygpOwotCQl0aGlzLnB1Ymxpc2hDb25maWd1cmF0aW9uID0gb3B0aW9ucy5pc1B1Ymxpc2hDb25maWd1cmF0aW9uKCk7Ci0JCXRoaXMucHVibGlzaFByb2Nlc3MgPSBvcHRpb25zLmlzUHVibGlzaFByb2Nlc3MoKTsKLQkJdGhpcy5wdWJsaXNoVW5vcGVuQUREID0gb3B0aW9ucy5pc1B1Ymxpc2hVbm9wZW5BREQoKTsKLQkJdGhpcy5wdWJsaXNoQmFzZUFEID0gb3B0aW9ucy5pc1B1Ymxpc2hCYXNlQUQoKTsKLQkJdGhpcy5wdWJsaXNoTGlnaHRXZWlnaHRUcmVlID0gb3B0aW9ucy5pc1B1Ymxpc2hMaWdodFdlaWdodFRyZWUoKTsKLQkJdGhpcy5zaG93TWV0aG9kQ29udGVudEluRGVzY3JpcHRvcnMgPSBvcHRpb25zCi0JCQkJLmlzU2hvd01ldGhvZENvbnRlbnRJbkRlc2NyaXB0b3JzKCk7Ci0JCXRoaXMuc2hvd1JlbGF0ZWREZXNjcmlwdG9ycyA9IG9wdGlvbnMuaXNTaG93UmVsYXRlZERlc2NyaXB0b3JzKCk7Ci0JCXRoaXMuc2hvd1JlbGF0ZWREZXNjcmlwdG9yc09wdGlvbiA9IG9wdGlvbnMuaXNTaG93UmVsYXRlZERlc2NyaXB0b3JzT3B0aW9uKCk7Ci0JCXRoaXMuc2hvd0Rlc2NyaXB0b3JzSW5OYXZpZ2F0aW9uVHJlZSA9IG9wdGlvbnMKLQkJCQkuaXNTaG93RGVzY3JpcHRvcnNJbk5hdmlnYXRpb25UcmVlKCk7Ci0JCXRoaXMucHVibGlzaEVtcHR5Q2F0ZWdvcmllcyA9IG9wdGlvbnMuaXNQdWJsaXNoRW1wdHlDYXRlZ29yaWVzKCk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgSFRNTCB0aXRsZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBIVE1MIHRpdGxlCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUaXRsZSgpIHsKLQkJcmV0dXJuIHRpdGxlOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIEhUTUwgdGl0bGUuCi0JICogCi0JICogQHBhcmFtIHRpdGxlCi0JICogICAgICAgICAgICB0aGUgSFRNTCB0aXRsZQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRpdGxlKFN0cmluZyB0aXRsZSkgewotCQl0aGlzLnRpdGxlID0gdGl0bGU7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgQWJvdXQgSFRNTC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBBYm91dCBIVE1MCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRBYm91dEhUTUwoKSB7Ci0JCXJldHVybiBhYm91dEhUTUw7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgQWJvdXQgSFRNTC4KLQkgKiAKLQkgKiBAcGFyYW0gYWJvdXRIVE1MCi0JICogICAgICAgICAgICB0aGUgQWJvdXQgSFRNTAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFib3V0SFRNTChTdHJpbmcgYWJvdXRIVE1MKSB7Ci0JCXRoaXMuYWJvdXRIVE1MID0gYWJvdXRIVE1MOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGZlZWRiYWNrIFVSTC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBmZWVkYmFjayBVUkwKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEZlZWRiYWNrVVJMKCkgewotCQlyZXR1cm4gZmVlZGJhY2tVUkw7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgZmVlZGJhY2sgVVJMLgotCSAqIAotCSAqIEBwYXJhbSBmZWVkYmFja1VSTAotCSAqICAgICAgICAgICAgdGhlIGZlZWRiYWNrIFVSTAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZlZWRiYWNrVVJMKFN0cmluZyBmZWVkYmFja1VSTCkgewotCQl0aGlzLmZlZWRiYWNrVVJMID0gZmVlZGJhY2tVUkw7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgcHVibGlzaCBnbG9zc2FyeSBvcHRpb24uCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgZ2xvc3NhcnkgbmVlZHMgdG8gYmUgcHVibGlzaGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNQdWJsaXNoR2xvc3NhcnkoKSB7Ci0JCXJldHVybiBwdWJsaXNoR2xvc3Nhcnk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgcHVibGlzaCBnbG9zc2FyeSBvcHRpb24uCi0JICogCi0JICogQHBhcmFtIHB1Ymxpc2hHbG9zc2FyeQotCSAqICAgICAgICAgICAgaWYgPGNvZGU+dHJ1ZTwvY29kZT4sIHB1Ymxpc2ggdGhlIGdsb3NzYXJ5Ci0JICovCi0JcHVibGljIHZvaWQgc2V0UHVibGlzaEdsb3NzYXJ5KGJvb2xlYW4gcHVibGlzaEdsb3NzYXJ5KSB7Ci0JCXRoaXMucHVibGlzaEdsb3NzYXJ5ID0gcHVibGlzaEdsb3NzYXJ5OwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHB1Ymxpc2ggaW5kZXggb3B0aW9uLgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGluZGV4IG5lZWRzIHRvIGJlIHB1Ymxpc2hlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUHVibGlzaEluZGV4KCkgewotCQlyZXR1cm4gcHVibGlzaEluZGV4OwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHB1Ymxpc2ggaW5kZXggb3B0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBwdWJsaXNoSW5kZXgKLQkgKiAgICAgICAgICAgIGlmIDxjb2RlPnRydWU8L2NvZGU+LCBwdWJsaXNoIHRoZSBpbmRleAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFB1Ymxpc2hJbmRleChib29sZWFuIHB1Ymxpc2hJbmRleCkgewotCQl0aGlzLnB1Ymxpc2hJbmRleCA9IHB1Ymxpc2hJbmRleDsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBiYW5uZXIgaW1hZ2UuCi0JICogCi0JICogQHJldHVybiB0aGUgYmFubmVyIGltYWdlCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRCYW5uZXJJbWFnZSgpIHsKLQkJcmV0dXJuIGJhbm5lckltYWdlOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGJhbm5lciBpbWFnZS4KLQkgKiAKLQkgKiBAcGFyYW0gYmFubmVySW1hZ2UKLQkgKiAgICAgICAgICAgIHRoZSBiYW5uZXIgaW1hZ2UKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRCYW5uZXJJbWFnZShTdHJpbmcgYmFubmVySW1hZ2UpIHsKLQkJdGhpcy5iYW5uZXJJbWFnZSA9IGJhbm5lckltYWdlOwotCQkKLQkJLy8gc2V0IHRoZSBoZWlnaHQgb2YgdGhlIGJhbm5lcgotCQlJbWFnZSBpbWFnZSA9IG51bGw7Ci0JCUZpbGUgZiA9IG5ldyBGaWxlKHRoaXMuYmFubmVySW1hZ2UpOwotCQlpZiAoIGYuZXhpc3RzKCkgKSB7Ci0JCQl0cnkgewotCQkJCWltYWdlID0gSW1hZ2VJTy5yZWFkKGYpOwotCQkJCWlmICggaW1hZ2UgIT0gbnVsbCApIHsKLQkJCQkJaW50IGhlaWdodCA9IGltYWdlLmdldEhlaWdodChudWxsKTsKLQkJCQkJaWYgKCBoZWlnaHQgPiAwICkgewotCQkJCQkJdGhpcy5iYW5uZXJJbWFnZUhlaWdodCA9IGhlaWdodDsKLQkJCQkJfQotCQkJCX0KLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCApIHsKLQkJCQkvLyBlcnJvciByZWFkIHRoZSBmaWxlLCBpZ25vcmUgZXJyb3IgYW5kIHVzZSB0aGUgZGVmYXVsdCBiYW5uZXIgaGVpZ2h0Ci0JCQkJOwotCQkJfSBmaW5hbGx5IHsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGJhbm5lciBpbWFnZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBiYW5uZXIgaW1hZ2UgaGVpZ2h0Ci0JICovCi0JcHVibGljIGludCBnZXRCYW5uZXJJbWFnZUhlaWdodCgpIHsKLQkJcmV0dXJuIGJhbm5lckltYWdlSGVpZ2h0OwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGJhbm5lciBpbWFnZS4KLQkgKiAKLQkgKiBAcGFyYW0gYmFubmVySW1hZ2UKLQkgKiAgICAgICAgICAgIHRoZSBiYW5uZXIgaW1hZ2UgaGVpZ2h0IGluIHBpeGVscwotCSAqLwotCXB1YmxpYyB2b2lkIHNldEJhbm5lckltYWdlSGVpZ2h0KGludCBiYW5uZXJJbWFnZWhlaWdodCkgewotCQl0aGlzLmJhbm5lckltYWdlSGVpZ2h0ID0gYmFubmVySW1hZ2VoZWlnaHQ7Ci0JfQotCQotCS8qKgotCSAqIEdldHMgdGhlIGNoZWNrIGV4dGVybmFsIGxpbmtzIG9wdGlvbi4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBleHRlcm5hbCBsaW5rcyBuZWVkIHRvIGJlIGNoZWNrZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0NoZWNrRXh0ZXJuYWxMaW5rcygpIHsKLQkJcmV0dXJuIGNoZWNrRXh0ZXJuYWxMaW5rczsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBjaGVjayBleHRlcm5hbCBsaW5rcyBvcHRpb24uCi0JICogCi0JICogQHBhcmFtIGNoZWNrRXh0ZXJuYWxMaW5rcwotCSAqICAgICAgICAgICAgaWYgPGNvZGU+dHJ1ZTwvY29kZT4sIGNoZWNrIHRoZSBleHRlcm5hbCBsaW5rcwotCSAqLwotCXB1YmxpYyB2b2lkIHNldENoZWNrRXh0ZXJuYWxMaW5rcyhib29sZWFuIGNoZWNrRXh0ZXJuYWxMaW5rcykgewotCQl0aGlzLmNoZWNrRXh0ZXJuYWxMaW5rcyA9IGNoZWNrRXh0ZXJuYWxMaW5rczsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBjb252ZXJ0IGJyb2tlbiBsaW5rcyBvcHRpb24uCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgY29udmVydCBicm9rZW4gbGlua3MgbmVlZCB0byBiZQotCSAqICAgICAgICAgY29udmVydGVkIHRvIHBsYWluIHRleHQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0NvbnZlcnRCcm9rZW5MaW5rcygpIHsKLQkJcmV0dXJuIGNvbnZlcnRCcm9rZW5MaW5rczsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBjb252ZXJ0IGJyb2tlbiBsaW5rcyBvcHRpb24uCi0JICogCi0JICogQHBhcmFtIGNvbnZlcnRCcm9rZW5MaW5rcwotCSAqICAgICAgICAgICAgaWYgPGNvZGU+dHJ1ZTwvY29kZT4sIGNvbnZlcnQgYnJva2VuIGxpbmtzIHRvIHBsaWFuIHRleHQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb252ZXJ0QnJva2VuTGlua3MoYm9vbGVhbiBjb252ZXJ0QnJva2VuTGlua3MpIHsKLQkJdGhpcy5jb252ZXJ0QnJva2VuTGlua3MgPSBjb252ZXJ0QnJva2VuTGlua3M7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgcHVibGlzaCBKYXZhU2NyaXB0IG5hdmlnYXRpb24gdHJlZSBvcHRpb24uCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBhIEphdmFTY3JpcHQgbmF2aWdhdGlvbiB0cmVlIHdpbGwgYmUKLQkgKiAgICAgICAgIHB1Ymxpc2hlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUHVibGlzaEphdmFTY3JpcHRUcmVlKCkgewotCQlyZXR1cm4gcHVibGlzaEphdmFTY3JpcHRUcmVlOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHB1Ymxpc2ggSmF2YVNjcmlwdCBuYXZpZ2F0aW9uIHRyZWUgb3B0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBwdWJsaXNoSmF2YVNjcmlwdFRyZWUKLQkgKiAgICAgICAgICAgIGlmIDxjb2RlPnRydWU8L2NvZGU+LCBwdWJsaXNoIGEgSmF2YVNjcmlwdCBuYXZpZ2F0aW9uIHRyZWUKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQdWJsaXNoSmF2YVNjcmlwdFRyZWUoYm9vbGVhbiBwdWJsaXNoSmF2YVNjcmlwdFRyZWUpIHsKLQkJdGhpcy5wdWJsaXNoSmF2YVNjcmlwdFRyZWUgPSBwdWJsaXNoSmF2YVNjcmlwdFRyZWU7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgcHVibGlzaCBkeW5hbWljIHdlYiBhcHBsaWNhdGlvbiBvcHRpb24uCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBhIGR5bmFtaWMgd2ViIGFwcGxpY2F0aW9uIHdpbGwgYmUKLQkgKiAgICAgICAgIHB1Ymxpc2hlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUHVibGlzaER5bmFtaWNXZWJBcHAoKSB7Ci0JCXJldHVybiB0aGlzLnB1Ymxpc2hEeW5hbWljV2ViQXBwIAotCQkmJiAodGhpcy5keW5hbWljV2ViQXBwTmFtZSAhPSBudWxsKQotCQkmJiAodGhpcy5keW5hbWljV2ViQXBwTmFtZS5sZW5ndGgoKSA+IDApOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHB1Ymxpc2ggZHluYW1pYyB3ZWIgYXBwbGljYXRpb24gb3B0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBwdWJsaXNoRHluYW1pY1dlYkFwcAotCSAqICAgICAgICAgICAgaWYgPGNvZGU+dHJ1ZTwvY29kZT4sIHB1Ymxpc2ggYSBkeW5hbWljIHdlYiBhcHBsaWNhdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFB1Ymxpc2hEeW5hbWljV2ViQXBwKGJvb2xlYW4gcHVibGlzaER5bmFtaWNXZWJBcHApIHsKLQkJdGhpcy5wdWJsaXNoRHluYW1pY1dlYkFwcCA9IHB1Ymxpc2hEeW5hbWljV2ViQXBwOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGR5bmFtaWMgd2ViIGFwcGxpY2F0aW9uIG5hbWUuCi0JICogCi0JICogQHJldHVybiB0aGUgZHluYW1pYyB3ZWIgYXBwbGljYXRpb24gbmFtZQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RHluYW1pY1dlYkFwcE5hbWUoKSB7Ci0JCXJldHVybiBkeW5hbWljV2ViQXBwTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBkeW5hbWljIHdlYiBhcHBsaWNhdGlvbiBuYW1lLgotCSAqIAotCSAqIEBwYXJhbSBkeW5hbWljV2ViQXBwTmFtZQotCSAqICAgICAgICAgICAgdGhlIGR5bmFtaWMgd2ViIGFwcGxpY2F0aW9uIG5hbWUuCi0JICovCi0JcHVibGljIHZvaWQgc2V0RHluYW1pY1dlYkFwcE5hbWUoU3RyaW5nIGR5bmFtaWNXZWJBcHBOYW1lKSB7Ci0JCXRoaXMuZHluYW1pY1dlYkFwcE5hbWUgPSBkeW5hbWljV2ViQXBwTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBpbmNsdWRlIHNlcnZsZXQgc2VhcmNoIG9wdGlvbi4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIGluY2x1ZGUgc2VydmxldCBzZWFyY2ggd2lsbCBiZSBhZGRlZCB0bwotCSAqICAgICAgICAgdGhlIHB1Ymxpc2hlZCBkeW5hbWljIHdlYiBhcHBsaWNhdGlvbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzSW5jbHVkZVNlcnZsZXRTZWFyY2goKSB7Ci0JCXJldHVybiBpbmNsdWRlU2VydmxldFNlYXJjaCAmJiBpc1B1Ymxpc2hEeW5hbWljV2ViQXBwKCk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgaW5jbHVkZSBzZXJ2bGV0IHNlYXJjaCBvcHRpb24uCi0JICogCi0JICogQHBhcmFtIGluY2x1ZGVTZXJ2bGV0U2VhcmNoCi0JICogICAgICAgICAgICBpZiA8Y29kZT50cnVlPC9jb2RlPiwgaW5jbHVkZSBzZXJ2bGV0IHNlYXJjaCBpbiB0aGUKLQkgKiAgICAgICAgICAgIHB1Ymxpc2hlZCBkeW5hbWljIHdlYiBhcHBsaWNhdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEluY2x1ZGVTZXJ2bGV0U2VhcmNoKGJvb2xlYW4gaW5jbHVkZVNlcnZsZXRTZWFyY2gpIHsKLQkJdGhpcy5pbmNsdWRlU2VydmxldFNlYXJjaCA9IGluY2x1ZGVTZXJ2bGV0U2VhcmNoOwotCX0KLQotCS8qKgotCSAqIGdldCB0aGUgZGVmYXVsdCBhY3Rpdml0eSB0YWIKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdEFjdGl2aXR5VGFiKCkgewotCQlyZXR1cm4gdGhpcy5kZWZhdWx0QWN0aXZpdHlUYWI7Ci0JfQotCQotCS8qKgotCSAqIHNldCB0aGUgZGVmYXVsdCBhY3Rpdml0eSB0YWIKLQkgKiBAcGFyYW0gdGFiTmFtZQotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlZmF1bHRBY3Rpdml0eVRhYihTdHJpbmcgdGFiTmFtZSkgewotCQl0aGlzLmRlZmF1bHRBY3Rpdml0eVRhYiA9IHRhYk5hbWU7Ci0JfQotCQotCS8qKgotCSAqIFZhbGlkYXRlcyB0aGUgcHVibGlzaCBvcHRpb25zLgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHB1Ymxpc2ggb3B0aW9ucyBpcyB2YWxpZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZSgpIHsKLQkJc3VwZXIudmFsaWRhdGUoKTsKLQkJCi0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3NlcnZpY2VzL1B1Ymxpc2hNYW5hZ2VyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvc2VydmljZXMvUHVibGlzaE1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODY5MDE3Yy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvc2VydmljZXMvUHVibGlzaE1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyOCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5zZXJ2aWNlczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24uc2VydmljZWFiaWxpdHkuRGVidWdUcmFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLkZpbGVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuc2VydmljZXMuRGlhZ3JhbU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5FbGVtZW50UmVhbGl6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LkJvb2ttYXJrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5FbGVtZW50TGF5b3V0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuSHRtbEJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LnV0aWwuWG1sRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5QdWJsaXNoaW5nUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLlB1Ymxpc2hpbmdSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcuc2VydmljZXMuaW5kZXguRGVmaW5pdGlvbk9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5zZXJ2aWNlcy5pbmRleC5LZXlXb3JkSW5kZXhIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudXRpbC5QdWJsaXNoaW5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VhcmNoLlNlYXJjaFNlcnZpY2U7Ci0KLS8qKgotICogTWFuYWdlcyB0aGUgcHVibGlzaGluZyBvZiBhIG1ldGhvZCBjb25maWd1cmF0aW9uLgotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUHVibGlzaE1hbmFnZXIgZXh0ZW5kcyBBYnN0cmFjdFB1Ymxpc2hNYW5hZ2VyIHsKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWVdPUkRfREVGX0ZJTEUgPSAia2V5d29yZGluZGV4ZGVmLnR4dCI7IC8vJE5PTi1OTFMtMSQKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBVQkxJU0hJTkdfUkVQT1JUX1hTTF9GSUxFID0gInhzbC9QdWJsaXNoaW5nUmVwb3J0LnhzbCI7IC8vJE5PTi1OTFMtMSQKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBVQkxJU0hJTkdfUkVQT1JUX0hUTUxfRklMRSA9ICJQdWJsaXNoaW5nUmVwb3J0Lmh0bWwiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBQdWJsaXNoTWFuYWdlcigpIHsKLQl9Ci0KLQlwcm90ZWN0ZWQgQWJzdHJhY3RWaWV3QnVpbGRlciBjcmVhdGVWaWV3QnVpbGRlcigpIHsKLQkJLy8gYm9vbGVhbiB2YWxpZGF0ZUV4dGVybmFsTGlua3MgPSAob3B0aW9ucyAhPSBudWxsKQotCQkvLyAmJiBvcHRpb25zLmlzQ2hlY2tFeHRlcm5hbExpbmtzKCk7Ci0KLQkJUHVibGlzaGluZ0NvbnRlbnRWYWxpZGF0b3IgdmFsaWRhdG9yID0gbnVsbDsKLQkJRWxlbWVudFJlYWxpemVyIHJlYWxpemVyID0gbnVsbDsKLQkJaWYgKChvcHRpb25zICE9IG51bGwpICYmIG9wdGlvbnMucHVibGlzaFByb2Nlc3MpIHsKLQkJCXZhbGlkYXRvciA9IG5ldyBQcm9jZXNzUHVibGlzaGluZ0NvbnRlbnRWYWxpZGF0b3IocHViRGlyLCBvcHRpb25zKTsKLQkJCXJlYWxpemVyID0gUHJvY2Vzc1B1Ymxpc2hpbmdFbGVtZW50UmVhbGl6ZXIubmV3UHJvY2Vzc1B1Ymxpc2hpbmdFbGVtZW50UmVhbGl6ZXIoY29uZmlnLAotCQkJCQkoUHJvY2Vzc1B1Ymxpc2hpbmdDb250ZW50VmFsaWRhdG9yKSB2YWxpZGF0b3IpOwotCQl9IGVsc2UgewotCQkJdmFsaWRhdG9yID0gbmV3IFB1Ymxpc2hpbmdDb250ZW50VmFsaWRhdG9yKHB1YkRpciwgb3B0aW9ucyk7Ci0JCQlyZWFsaXplciA9IFB1Ymxpc2hpbmdFbGVtZW50UmVhbGl6ZXIubmV3UHVibGlzaGluZ0VsZW1lbnRSZWFsaXplcihjb25maWcsIHZhbGlkYXRvcik7Ci0JCX0KLQotCQkvLyB2YWxpZGF0b3Iuc2V0U2hvd0Jyb2tlbkxpbmtzKG9wdGlvbnMuY29udmVydEJyb2tlbkxpbmtzID09IGZhbHNlKTsKLQkJLy8gdmFsaWRhdG9yLnNldFNob3dFeHRyYUluZm9Gb3JEZXNjcmlwdG9ycyhvcHRpb25zCi0JCS8vIC5pc1Nob3dNZXRob2RDb250ZW50SW5EZXNjcmlwdG9ycygpKTsKLQkJLy8gdmFsaWRhdG9yLnNldFNob3dSZWxhdGVkRGVzY3JpcHRvcnMob3B0aW9ucy5zaG93UmVsYXRlZERlc2NyaXB0b3JzKTsKLQotCQlFbGVtZW50TGF5b3V0TWFuYWdlciBsYXlvdXRNZ3IgPSBuZXcgRWxlbWVudExheW91dE1hbmFnZXIoY29uZmlnLAotCQkJCXB1YkRpciwgdmFsaWRhdG9yLCB0cnVlKTsKLQkJbGF5b3V0TWdyLnNldEVsZW1lbnRSZWFsaXplcihyZWFsaXplcik7Ci0JCUh0bWxCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgSHRtbEJ1aWxkZXIobGF5b3V0TWdyKTsKLQotCQlidWlsZGVyLmVuYWJsZUNvbnRlbnRTY2FuKHRydWUpOwotCQlidWlsZGVyLmVuYWJsZVRyZWVCcm93c2VyKHRydWUpOwotCi0JCUlTaXRlR2VuZXJhdG9yIGdlbmVyYXRvciA9IG5ldyBEZWZhdWx0U2l0ZUdlbmVyYXRvcihidWlsZGVyLCBvcHRpb25zKTsKLQkJcmV0dXJuIG5ldyBDb25maWd1cmF0aW9uVmlld0J1aWxkZXIoZ2VuZXJhdG9yKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwcmVQdWJsaXNoKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJLy8gZml4T3B0aW9ucyhvcHRpb25zKTsKLQotCQltb25pdG9yLnN1YlRhc2soUHVibGlzaGluZ1Jlc291cmNlcy5pbml0aWFsaXppbmdEaXJUYXNrX25hbWUpOyAvLyROT04tTkxTLTEkCi0KLQkJLy8gbWFrZSBzdXJlIHRoZSBwdWJsaXNoIGRpcmVjdG9yeSBpcyBjcmVhdGVkCi0JCUZpbGUgZiA9IG5ldyBGaWxlKHZpZXdCdWlsZGVyLmdldEh0bWxCdWlsZGVyKCkuZ2V0UHVibGlzaERpcigpKTsKLQkJaWYgKCFmLmV4aXN0cygpKSB7Ci0JCQlmLm1rZGlycygpOwotCQl9Ci0KLQkJLy8gY29weSB0aGUgY29uZmlndXJhdGlvbiBmaWxlcwotCQltb25pdG9yLnN1YlRhc2soUHVibGlzaGluZ1Jlc291cmNlcy5jb3B5aW5nRmlsZXNUYXNrX25hbWUpOyAvLyROT04tTkxTLTEkCi0JCS8qCi0JCSAqIGNvcHlEb2NSb290RmlsZXMoKTsgLy8gY29weSBsb2NhbGl6ZWQgZmlsZXMgY29weUxvY2FsaXplZEZpbGVzKCk7IC8vCi0JCSAqIGNvcHkgdXNlciBjdXN0b21pemVkIGZpbGVzIGxhc3QgY29weUN1c3RvbWl6ZWRGaWxlcygpOwotCQkgKi8KLQkJZ2V0U2l0ZUdlbmVyYXRvcigpLnByZVB1Ymxpc2goKTsKLQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGRvUHVibGlzaChJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBFeGNlcHRpb24gewotCQkKLQkJLy8gYmVmb3JlIGRvaW5nIHB1Ymxpc2hpbmcsIGxvYWQgdGhlIHdob2xlIGxpYnJhcnkgYW5kIHJlbWVtYmVyIHRoZSByZXNvdWNlcyBsb2FkZWQKLQkJLy8gc28gd2UgY2FuIHVubG9hZCB0aG9zZSByZXNvdXJjZXMgbGF0ZXIgdG8gZnJlZSBtZW1vcnkKLQkJQ29sbGVjdGlvbjxSZXNvdXJjZT4gY2hhbmdlZFJlc291cmNlcyA9IGxvYWRMaWJyYXJ5KG1vbml0b3IpOwotCQlDb2xsZWN0aW9uPERpYWdyYW1NYW5hZ2VyPiBleGlzdGluZ01ncnMgPSBEaWFncmFtTWFuYWdlci5nZXREaWFncmFtTWFuYWdlcnMoKTsKLQotCQkvLyBkb24ndCBjb3B5IGFsbCB0aGUgY29udGVudCByZXNvdXJjZXMKLQkJLy8gbGV0IHRoZSBzeXN0ZW0gc2NhbiB0aGUgY29udGVudCBhbmQgY29weSBvbmx5IHRoZSByZXF1aXJlZAotCQkvLyByZXNvdXJjZQotCQkvLyB2aWV3QnVpbGRlci5nZXRIdG1sQnVpbGRlcigpLmVuYWJsZUNvbnRlbnRTY2FuKHRydWUpOwotCQkvLyB2aWV3QnVpbGRlci5nZXRIdG1sQnVpbGRlcigpLmVuYWJsZVRyZWVCcm93c2VyKHRydWUpOwotCi0JCS8vIGdlbmVyYXRlIGJvb2ttYXJrcyBhbmQgcHVibGlzaGVkIHRoZSBjb250ZW50cyBhcyBuZWVkZWQKLQkJbW9uaXRvci5zdWJUYXNrKFB1Ymxpc2hpbmdSZXNvdXJjZXMuZ2VuZXJhdGluZ0Jvb2ttYXJrc1Rhc2tfbmFtZSk7IC8vJE5PTi1OTFMtMSQKLQkJZ2VuZXJhdGVCb29rbWFya3MobW9uaXRvcik7Ci0KLQkJU3RyaW5nIHRpdGxlID0gb3B0aW9ucyA9PSBudWxsID8gIiIgOiBvcHRpb25zLmdldFRpdGxlKCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpZiAoIW1vbml0b3IuaXNDYW5jZWxlZCgpKSB7CQkJCi0JCQkvLyBjcmVhdGluZyBnbG9zc2FyeQotCQkJaWYgKG9wdGlvbnMgPT0gbnVsbCB8fCBvcHRpb25zLmlzUHVibGlzaEdsb3NzYXJ5KCkpIHsKLQkJCQltb25pdG9yLnN1YlRhc2soUHVibGlzaGluZ1Jlc291cmNlcy5nZW5lcmF0aW5nR2xvc3NhcnlUYXNrX25hbWUpOyAvLyROT04tTkxTLTEkCi0JCQkJbmV3IEdsb3NzYXJ5QnVpbGRlcigpLmV4ZWN1dGUoY29uZmlnLCBwdWJEaXIsIHRpdGxlLCBtb25pdG9yKTsKLQkJCX0KLQkJfQotCQkKLQkJLy8gbWFrZSBzdXJlIHRoZSByZXNvdXJjZXMgYXJlIHVubG9hZGVkIGJlZm9yZSByZXR1cm4KLQkJLy8gbm93IGl0J3MgdGltZSB0byB1bmxvYWQgdGhlIHJlc29ydWNlcwotCQlDb2xsZWN0aW9uPERpYWdyYW1NYW5hZ2VyPiBuZXdNZ3JzID0gRGlhZ3JhbU1hbmFnZXIuZ2V0RGlhZ3JhbU1hbmFnZXJzKCk7Ci0JCVB1Ymxpc2hpbmdVdGlsLmRpc3Bvc2VEaWFncmFtTWFuYWdlcnMobmV3TWdycywgZXhpc3RpbmdNZ3JzKTsKLQkJUHVibGlzaGluZ1V0aWwudW5sb2FkUmVzb3VyY2VzKGNoYW5nZWRSZXNvdXJjZXMpOwotCQljaGFuZ2VkUmVzb3VyY2VzLmNsZWFyKCk7Ci0JCWV4aXN0aW5nTWdycy5jbGVhcigpOwotCQluZXdNZ3JzLmNsZWFyKCk7Ci0JCVJ1bnRpbWUuZ2V0UnVudGltZSgpLmdjKCk7CQotCQkKLQkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQkvLyBjcmVhdGluZyBjb250ZW50IGluZGV4Ci0JCWlmIChvcHRpb25zID09IG51bGwgfHwgb3B0aW9ucy5pc1B1Ymxpc2hJbmRleCgpKSB7Ci0JCQltb25pdG9yCi0JCQkJCS5zdWJUYXNrKFB1Ymxpc2hpbmdSZXNvdXJjZXMuZ2VuZXJhdGluZ0Jvb2ttYXJrSW5kZXhUYXNrX25hbWUpOyAvLyROT04tTkxTLTEkCi0JCQkvLyBuZXcgSW5kZXhCdWlsZGVyKCkuZXhlY3V0ZShjb25maWcsIHB1Ymxpc2hEaXIsIG1vbml0b3IpOwotCQkJZ2VuZXJhdGVCb29rbWFya0luZGV4KHB1YkRpciwgdGl0bGUsIG1vbml0b3IpOwotCQl9Ci0KLQkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQkvLyBlbmFibGUgc2VhcmNoaW5nCi0JCWlmIChvcHRpb25zICE9IG51bGwgJiYgb3B0aW9ucy5pc1B1Ymxpc2hEeW5hbWljV2ViQXBwKCkKLQkJCQkmJiBvcHRpb25zLmlzSW5jbHVkZVNlcnZsZXRTZWFyY2goKSkgewotCQkJLy8gZ2VuZXJhdGluZyB0aGUgc2VhcmNoIGluZGV4Ci0JCQltb25pdG9yLnN1YlRhc2soUHVibGlzaGluZ1Jlc291cmNlcy5nZW5lcmF0aW5nU2VhcmNoSW5kZXhUYXNrX25hbWUpOwotCQkJU2VhcmNoU2VydmljZS5nZXRJbnN0YW5jZSgpLmNyZWF0ZUluZGV4KHB1YkRpciwgZmFsc2UpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcG9zdFB1Ymxpc2goSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJLy8gZmluYWxseSwgZ2VuZXJhdGUgYSByZXBvcnQKLQkJZ2V0U2l0ZUdlbmVyYXRvcigpLnBvc3RQdWJsaXNoKCk7Ci0KLQkJY3JlYXRlV0FSRmlsZSgpOwotCi0JCWdldFB1Ymxpc2hSZXBvcnRVcmwoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZ2VuZXJhdGVCb29rbWFya3MoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJbG9uZyBiZWdpblRpbWUgPSAwTDsKLQkJbG9uZyBzdGFydFRpbWUgPSAwTDsKLQkJaWYgKHByb2ZpbGluZykgewotCQkJYmVnaW5UaW1lID0gc3RhcnRUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCX0KLQkJTGlzdDxCb29rbWFyaz4gYm9va21hcmtzID0gdmlld0J1aWxkZXIuYnVpbGRWaWV3cyhtb25pdG9yKTsKLQkJaWYgKHByb2ZpbGluZykgewotCQkJRGVidWdUcmFjZS5wcmludCh2aWV3QnVpbGRlciwgImJ1aWxkVmlld3MiLCAvLyROT04tTkxTLTEkCi0JCQkJCShTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHN0YXJ0VGltZSkgKyAiIG1zIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQkKLQkJQm9va21hcmsgZGVmYXVsdFZpZXcgPSB2aWV3QnVpbGRlci5nZXREZWZhdWx0VmlldygpOwotCi0JCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJLy8gMy4gZmluYWxseSwgd3JpdGUgdGhlIHB1Ymxpc2hlZCBib29rbWFya3MgZmlsZQotCQlpZiAocHJvZmlsaW5nKSB7Ci0JCQlzdGFydFRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJfQotCQlnZXRTaXRlR2VuZXJhdG9yKCkud3JpdGVQdWJsaXNoZWRCb29rbWFya3MoYm9va21hcmtzLCBkZWZhdWx0Vmlldyk7Ci0JCWlmIChwcm9maWxpbmcpIHsKLQkJCURlYnVnVHJhY2UucHJpbnQoZ2V0U2l0ZUdlbmVyYXRvcigpLCAid3JpdGVQdWJsaXNoZWRCb29rbWFya3MiLCAvLyROT04tTkxTLTEkCi0JCQkJCShTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHN0YXJ0VGltZSkgKyAiIG1zIik7IC8vJE5PTi1OTFMtMSQKLQkJCURlYnVnVHJhY2UucHJpbnQodGhpcywgImdlbmVyYXRlQm9va21hcmtzIiwgLy8kTk9OLU5MUy0xJAotCQkJCQkoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBiZWdpblRpbWUpICsgIiBtcyIpOyAvLyROT04tTkxTLTEkCQkJCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBnZXQgdGhlIHVybCBmb3IgdGhlIHB1Ymxpc2hlZCBzaXRlLgotCSAqIAotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQdWJsaXNoZWRVcmwoKSB7Ci0JCWlmIChzdWNjZXNzKSB7Ci0JCQlTdHJpbmcgdXJsID0gZ2V0U2l0ZUdlbmVyYXRvcigpLmdldEluZGV4RmlsZVBhdGgoKTsKLQkJCUZpbGUgZiA9IG5ldyBGaWxlKHVybCk7Ci0JCQlpZiAoZi5leGlzdHMoKSkgewotCQkJCXJldHVybiB1cmw7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBnZW5lcmF0ZUJvb2ttYXJrSW5kZXgoU3RyaW5nIHB1Ymxpc2hEaXIsIFN0cmluZyB0aXRsZSwKLQkJCUlQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQl0cnkgewotCi0JCQlVUkwgdXJsID0gbmV3IFVSTChQdWJsaXNoaW5nUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbnN0YWxsVVJMKCksCi0JCQkJCUtFWVdPUkRfREVGX0ZJTEUpOwotCQkJaWYgKHVybCA9PSBudWxsKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJVbmFibGUgdG8gZ2V0IGluZGV4IGRlZmluaXRpb24gZmlsZSAiKTsgLy8kTk9OLU5MUy0xJAotCQkJCXJldHVybjsKLQkJCX0KLQotCQkJU3RyaW5nIGRlZmZpbGUgPSBQbGF0Zm9ybS5yZXNvbHZlKHVybCkuZ2V0UGF0aCgpOwotCQkJU3RyaW5nIGNoYXJTZXQgPSAidXRmLTgiOyAvLyROT04tTkxTLTEkCi0JCQlTdHJpbmcgaGVscEZpbGUgPSBudWxsOwotCQkJS2V5V29yZEluZGV4SGVscGVyIGluZGV4SGVscGVyID0gbmV3IEtleVdvcmRJbmRleEhlbHBlcihkZWZmaWxlLAotCQkJCQljaGFyU2V0LCBoZWxwRmlsZSk7Ci0JCQlEZWZpbml0aW9uT2JqZWN0IGRlZk9iaiA9IGluZGV4SGVscGVyLmxvYWREZWZpbml0aW9uKHB1Ymxpc2hEaXIpOwotCQkJaWYgKGRlZk9iaiAhPSBudWxsKSB7Ci0JCQkJZGVmT2JqLnNldHd3d1Jvb3QocHVibGlzaERpcik7Ci0JCQkJZGVmT2JqLnNldEluZGV4VGl0bGUoUHVibGlzaGluZ1Jlc291cmNlcy5pbmRleExhYmVsX3RleHQKLQkJCQkJCSsgIiAtICIgKyB0aXRsZSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJfQotCi0JCQlpbmRleEhlbHBlci5leGVjdXRlKG1vbml0b3IpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIGdlbmVyYXRlIHRoZSBwdWJsaXNoaW5nIHJlcG9ydCBhbmQgcmV0dXJuIHRoZSB1cmwKLQkgKiAKLQkgKiBAcmV0dXJuIFN0cmluZyB0aGUgcmVwb3J0IHVybAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UHVibGlzaFJlcG9ydFVybCgpIHsKLQkJU3RyaW5nIHB1Ymxpc2hEaXIgPSB2aWV3QnVpbGRlci5nZXRIdG1sQnVpbGRlcigpLmdldFB1Ymxpc2hEaXIoKTsKLQkJU3RyaW5nIGZpbGVfcGF0aG5hbWUgPSBQdWJsaXNoaW5nQ29udGVudFZhbGlkYXRvci5MT0dTX0ZPTERFUgotCQkJCSsgRmlsZS5zZXBhcmF0b3IgKyBQVUJMSVNISU5HX1JFUE9SVF9IVE1MX0ZJTEU7Ci0JCUZpbGUgZiA9IG5ldyBGaWxlKHB1Ymxpc2hEaXIsIGZpbGVfcGF0aG5hbWUpOwotCQlTdHJpbmcgcmVwb3J0X2ZpbGUgPSBmLmdldEFic29sdXRlUGF0aCgpOwotCQlpZiAoIWYuZXhpc3RzKCkpIHsKLQkJCUZpbGUgZXJyb3JMb2cgPSBuZXcgRmlsZShwdWJsaXNoRGlyLAotCQkJCQlQdWJsaXNoaW5nQ29udGVudFZhbGlkYXRvci5MT0dTX0ZPTERFUiArIEZpbGUuc2VwYXJhdG9yCi0JCQkJCQkJKyBQdWJsaXNoaW5nQ29udGVudFZhbGlkYXRvci5FUlJPUl9MT0dfRklMRU5BTUUpOwotCQkJRmlsZSB3YXJuaW5nTG9nID0gbmV3IEZpbGUocHVibGlzaERpciwKLQkJCQkJUHVibGlzaGluZ0NvbnRlbnRWYWxpZGF0b3IuTE9HU19GT0xERVIgKyBGaWxlLnNlcGFyYXRvcgotCQkJCQkJCSsgUHVibGlzaGluZ0NvbnRlbnRWYWxpZGF0b3IuV0FSTklOR19MT0dfRklMRU5BTUUpOwotCQkJRmlsZSBpbmZvTG9nID0gbmV3IEZpbGUocHVibGlzaERpciwKLQkJCQkJUHVibGlzaGluZ0NvbnRlbnRWYWxpZGF0b3IuTE9HU19GT0xERVIgKyBGaWxlLnNlcGFyYXRvcgotCQkJCQkJCSsgUHVibGlzaGluZ0NvbnRlbnRWYWxpZGF0b3IuSU5GT19MT0dfRklMRU5BTUUpOwotCi0JCQkvLyBnZWVucmF0ZSB0aGUgaW5kZXguaHRtCi0JCQlYbWxFbGVtZW50IHJlcG9ydFhtbCA9IG5ldyBYbWxFbGVtZW50KCJQdWJsaXNoaW5nUmVwb3J0Iik7IC8vJE5PTi1OTFMtMSQKLQotCQkJcmVwb3J0WG1sLm5ld0NoaWxkKCJwdWJEaXIiKS5zZXRBdHRyaWJ1dGUoInBhdGgiLCBwdWJsaXNoRGlyKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlyZXBvcnRYbWwKLQkJCQkJLm5ld0NoaWxkKCJlcnJvckxvZyIpIC8vJE5PTi1OTFMtMSQKLQkJCQkJLnNldEF0dHJpYnV0ZSgKLQkJCQkJCQkibmFtZSIsIFB1Ymxpc2hpbmdDb250ZW50VmFsaWRhdG9yLkVSUk9SX0xPR19GSUxFTkFNRSkgLy8kTk9OLU5MUy0xJAotCQkJCQkuc2V0QXR0cmlidXRlKCJwYXRoIiwgIi4vIiArIGVycm9yTG9nLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JCQlyZXBvcnRYbWwKLQkJCQkJLm5ld0NoaWxkKCJ3YXJuaW5nTG9nIikgLy8kTk9OLU5MUy0xJAotCQkJCQkuc2V0QXR0cmlidXRlKAotCQkJCQkJCSJuYW1lIiwgUHVibGlzaGluZ0NvbnRlbnRWYWxpZGF0b3IuV0FSTklOR19MT0dfRklMRU5BTUUpIC8vJE5PTi1OTFMtMSQKLQkJCQkJLnNldEF0dHJpYnV0ZSgicGF0aCIsICIuLyIgKyB3YXJuaW5nTG9nLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JCQlyZXBvcnRYbWwKLQkJCQkJLm5ld0NoaWxkKCJpbmZvTG9nIikgLy8kTk9OLU5MUy0xJAotCQkJCQkuc2V0QXR0cmlidXRlKAotCQkJCQkJCSJuYW1lIiwgUHVibGlzaGluZ0NvbnRlbnRWYWxpZGF0b3IuSU5GT19MT0dfRklMRU5BTUUpIC8vJE5PTi1OTFMtMSQKLQkJCQkJLnNldEF0dHJpYnV0ZSgicGF0aCIsICIuLyIgKyBpbmZvTG9nLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JCQkvLyBkZXRhaWwgaW5mb3JtYXRpb24KLQkJCVB1Ymxpc2hpbmdDb250ZW50VmFsaWRhdG9yIHZhbGlkYXRvciA9IChQdWJsaXNoaW5nQ29udGVudFZhbGlkYXRvcikgdmlld0J1aWxkZXIKLQkJCQkJLmdldEh0bWxCdWlsZGVyKCkuZ2V0VmFsaWRhdG9yKCk7Ci0JCQlyZXBvcnRYbWwuYWRkQ2hpbGQodmFsaWRhdG9yLmdldFJlcG9ydCgpKTsKLQotCQkJU3RyaW5nIGJ1ZmZlciA9IFB1Ymxpc2hpbmdVdGlsLmdldEh0bWwocmVwb3J0WG1sLAotCQkJCQlQVUJMSVNISU5HX1JFUE9SVF9YU0xfRklMRSk7Ci0JCQlpZiAoYnVmZmVyICE9IG51bGwpIHsKLQkJCQlGaWxlVXRpbC53cml0ZVVURjhGaWxlKHJlcG9ydF9maWxlLCBidWZmZXIudG9TdHJpbmcoKSk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gcmVwb3J0X2ZpbGU7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlV0FSRmlsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlpZiAob3B0aW9ucyAhPSBudWxsICYmIG9wdGlvbnMuaXNQdWJsaXNoRHluYW1pY1dlYkFwcCgpCi0JCQkJJiYgb3B0aW9ucy5nZXREeW5hbWljV2ViQXBwTmFtZSgpLmxlbmd0aCgpID4gMCkgewotCQkJU2VhcmNoU2VydmljZS5nZXRJbnN0YW5jZSgpLmNyZWF0ZVdBUihwdWJEaXIsCi0JCQkJCW9wdGlvbnMuZ2V0RHluYW1pY1dlYkFwcE5hbWUoKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3NlcnZpY2VzL1B1Ymxpc2hPcHRpb25zLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvc2VydmljZXMvUHVibGlzaE9wdGlvbnMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWFiNDIxZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvc2VydmljZXMvUHVibGlzaE9wdGlvbnMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzMCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5zZXJ2aWNlczsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzOwotCi0vKioKLSAqIFRoZSBQdWJsaXNoaW5nIE9wdGlvbnMuCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFB1Ymxpc2hPcHRpb25zIHsKLQotCS8vIFRoZSBwdWJsaXNoIGRpcmVjdG9yeS4KLQlwcm90ZWN0ZWQgU3RyaW5nIHB1Ymxpc2hEaXI7Ci0KLQkvLyBUaGUgbGlzdCBvZiBwcm9jZXNzZXMgdG8gYmUgcHVibGlzaGVkLgotCXByb3RlY3RlZCBMaXN0PFByb2Nlc3M+IHByb2Nlc3NlczsKLQotCS8vIFB1Ymxpc2ggZW50aXJlIG1ldGhvZCBjb25maWd1cmF0aW9uIG9wdGlvbi4KLQlwcm90ZWN0ZWQgYm9vbGVhbiBwdWJsaXNoQ29uZmlndXJhdGlvbjsKLQotCS8vIFB1Ymxpc2ggb25lIG9yIG1vcmUgcHJvY2Vzc2VzIG9wdGlvbi4KLQlwcm90ZWN0ZWQgYm9vbGVhbiBwdWJsaXNoUHJvY2VzczsKLQotCS8vIFB1Ymxpc2ggdW5vcGVuIGFjdGl2aXR5IGRldGFpbCBkaWFncmFtcyBvcHRpb24uCi0JcHJvdGVjdGVkIGJvb2xlYW4gcHVibGlzaFVub3BlbkFERDsKLQotCS8vIFB1Ymxpc2ggYWN0aXZpdHkgZGlhZ3JhbSBmb3IgYmFzZSBhY3RpdnRpZXMgd2l0aCB1bm1vZGlmaWVkCi0JLy8gZXh0ZW5zaW9ucyBvcHRpb24uCi0JcHJvdGVjdGVkIGJvb2xlYW4gcHVibGlzaEJhc2VBRDsKLQotCS8vIFB1Ymxpc2ggbGlnaHQgd2VpZ2h0IG5hdmlnYXRpb24gdHJlZSBvcHRpb24uCi0JcHJvdGVjdGVkIGJvb2xlYW4gcHVibGlzaExpZ2h0V2VpZ2h0VHJlZTsKLQotCS8vIFNob3cgbWV0aG9kIGNvbnRlbnQgaW4gdGhlIGRlc2NyaXB0b3IgcGFnZXMgb3B0aW9uLgotCXByb3RlY3RlZCBib29sZWFuIHNob3dNZXRob2RDb250ZW50SW5EZXNjcmlwdG9yczsKLQotCS8vIFNob3cgcmVsYXRlZCBkZXNjcmlwdG9ycyBpbiB0aGUgdGFzaywgcm9sZSwgYW5kIHdvcmsgcHJvZHVjdCBwYWdlcwotCS8vIG9wdGlvbi4KLQlwcm90ZWN0ZWQgYm9vbGVhbiBzaG93UmVsYXRlZERlc2NyaXB0b3JzOwotCQotCS8vU2hvdyBhbGwgaW5kaXJlY3QgKGdyZWVuKSBvY2N1cnJlbmNlcyBpbiBleHRlbmRlZCBwYXR0ZXJucwotCXByb3RlY3RlZCBib29sZWFuIHNob3dSZWxhdGVkRGVzY3JpcHRvcnNPcHRpb247Ci0KLQkvLyBTaG93IHRhc2sgZGVzY3JpcHRvcnMgaW4gdGhlIG5hdmlnYXRpb24gdHJlZSBvcHRpb24uCi0JcHJvdGVjdGVkIGJvb2xlYW4gc2hvd0Rlc2NyaXB0b3JzSW5OYXZpZ2F0aW9uVHJlZTsKLQotCS8vIFB1Ymxpc2ggZW1wdHkgY2F0ZWdvcmllcyBvcHRpb24gKGN1cnJlbnRseSBub3Qgc3VwcG9ydGVkIGluIHRoZSBVSSkuCi0JcHJvdGVjdGVkIGJvb2xlYW4gcHVibGlzaEVtcHR5Q2F0ZWdvcmllczsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFB1Ymxpc2hPcHRpb25zKCkgewotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHB1Ymxpc2ggZGlyZWN0b3J5LgotCSAqIAotCSAqIEByZXR1cm4gYSBkaXJlY3RvcnkgZm9yIHN0b3JpbmcgdGhlIHB1Ymxpc2hlZCBjb250ZW50Ci0JICovCi0JcHVibGljIFN0cmluZyBnZXRQdWJsaXNoRGlyKCkgewotCQlyZXR1cm4gcHVibGlzaERpcjsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBwdWJsaXNoIGRpcmVjdG9yeS4KLQkgKiAKLQkgKiBAcGFyYW0gcHVibGlzaERpcgotCSAqICAgICAgICAgICAgYSBkaXJlY3RvcnkgZm9yIHN0b3JpbmcgdGhlIHB1Ymxpc2hlZCBjb250ZW50Ci0JICovCi0JcHVibGljIHZvaWQgc2V0UHVibGlzaERpcihTdHJpbmcgcHVibGlzaERpcikgewotCQl0aGlzLnB1Ymxpc2hEaXIgPSBwdWJsaXNoRGlyOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGxpc3Qgb2YgcHJvY2Vzc2VzIHRoYXQgd2lsbCBiZSBwdWJsaXNoZWQuCi0JICogCi0JICogQHJldHVybiBhIGNvbGxlY3Rpb24gb2YgPGNvZGU+UHJvY2VzczwvY29kZT4KLQkgKi8KLQlwdWJsaWMgTGlzdDxQcm9jZXNzPiBnZXRQcm9jZXNzZXMoKSB7Ci0JCXJldHVybiBwcm9jZXNzZXM7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgbGlzdCBvZiBwcm9jZXNzZXMgdGhhdCB3aWxsIGJlIHB1Ymxpc2hlZC4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvY2Vzc2VzCi0JICogICAgICAgICAgICBhIGNvbGxlY3Rpb24gb2YgPGNvZGU+UHJvY2VzczwvY29kZT4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQcm9jZXNzZXMoTGlzdDxQcm9jZXNzPiBwcm9jZXNzZXMpIHsKLQkJdGhpcy5wcm9jZXNzZXMgPSBwcm9jZXNzZXM7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgcHVibGlzaCBtZXRob2QgY29uZmlndXJhdGlvbiBvcHRpb24uCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgZW50aXJlIG1ldGhvZCBjb25maWd1cmF0aW9uIHdpbGwgYmUKLQkgKiAgICAgICAgIHB1Ymxpc2hlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUHVibGlzaENvbmZpZ3VyYXRpb24oKSB7Ci0JCXJldHVybiBwdWJsaXNoQ29uZmlndXJhdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBwdWJsaXNoIG1ldGhvZCBjb25maWd1cmF0aW9uIG9wdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gcHVibGlzaENvbmZpZ3VyYXRpb24KLQkgKiAgICAgICAgICAgIGlmIDxjb2RlPnRydWU8L2NvZGU+LCBwdWJsaXNoIHRoZSBlbnRpcmUgbWV0aG9kCi0JICogICAgICAgICAgICBjb25maWd1cmF0aW9uCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHVibGlzaENvbmZpZ3VyYXRpb24oYm9vbGVhbiBwdWJsaXNoQ29uZmlndXJhdGlvbikgewotCQl0aGlzLnB1Ymxpc2hDb25maWd1cmF0aW9uID0gcHVibGlzaENvbmZpZ3VyYXRpb247Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgcHVibGlzaCBwcm9jZXNzIG9wdGlvbi4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBvbmUgb3IgbW9yZSBwcm9jZXNzZXMgaW4gYSBtZXRob2QKLQkgKiAgICAgICAgIGNvbmZpZ3VyYXRpb24gd2lsbCBiZSBwdWJsaXNoZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1B1Ymxpc2hQcm9jZXNzKCkgewotCQlyZXR1cm4gcHVibGlzaFByb2Nlc3M7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgcHVibGlzaCBwcm9jZXNzIG9wdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gcHVibGlzaFByb2Nlc3MKLQkgKiAgICAgICAgICAgIGlmIDxjb2RlPnRydWU8L2NvZGU+LCBwdWJsaXNoIG9uZSBvciBtb3JlIHByb2Nlc3NlcyBpbiBhCi0JICogICAgICAgICAgICBtZXRob2QgY29uZmlndXJhdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFB1Ymxpc2hQcm9jZXNzKGJvb2xlYW4gcHVibGlzaFByb2Nlc3MpIHsKLQkJdGhpcy5wdWJsaXNoUHJvY2VzcyA9IHB1Ymxpc2hQcm9jZXNzOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHB1Ymxpc2ggdW5vcGVuIGFjdGl2aXR5IGRldGFpbCBkaWFncmFtcyBvcHRpb24uCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgdW5vcGVuIGFjdGl2aXR5IGRldGFpbCBkaWFncmFtcyB3aWxsCi0JICogICAgICAgICBiZSBwdWJsaXNoZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1B1Ymxpc2hVbm9wZW5BREQoKSB7Ci0JCXJldHVybiBwdWJsaXNoVW5vcGVuQUREOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHB1Ymxpc2ggdW5vcGVuIGFjdGl2aXR5IGRldGFpbCBkaWFncmFtcyBvcHRpb24uCi0JICogCi0JICogQHBhcmFtIHB1Ymxpc2hVbm9wZW5BREQKLQkgKiAgICAgICAgICAgIGlmIDxjb2RlPnRydWU8L2NvZGU+LCBwdWJsaXNoIHVub3BlbiBhY3Rpdml0eSBkZXRhaWwKLQkgKiAgICAgICAgICAgIGRpYWdyYW1zCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHVibGlzaFVub3BlbkFERChib29sZWFuIHB1Ymxpc2hVbm9wZW5BREQpIHsKLQkJdGhpcy5wdWJsaXNoVW5vcGVuQUREID0gcHVibGlzaFVub3BlbkFERDsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBwdWJsaXNoIGFjdGl2aXR5IGRpYWdyYW0gZm9yIGJhc2UgYWN0aXZ0aWVzIHdpdGggdW5tb2RpZmllZAotCSAqIGV4dGVuc2lvbnMgb3B0aW9uLgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGFjdGl2aXR5IGRpYWdyYW0gZm9yIGJhc2UgYWN0aXZ0aWVzCi0JICogICAgICAgICB3aXRoIHVubW9kaWZpZWQgZXh0ZW5zaW9ucyB3aWxsIGJlIHB1Ymxpc2hlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUHVibGlzaEJhc2VBRCgpIHsKLQkJcmV0dXJuIHB1Ymxpc2hCYXNlQUQ7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgcHVibGlzaCBhY3Rpdml0eSBkaWFncmFtIGZvciBiYXNlIGFjdGl2dGllcyB3aXRoIHVubW9kaWZpZWQKLQkgKiBleHRlbnNpb25zIG9wdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gcHVibGlzaEJhc2VBRAotCSAqICAgICAgICAgICAgaWYgPGNvZGU+dHJ1ZTwvY29kZT4sIHB1Ymxpc2ggYWN0aXZpdHkgZGlhZ3JhbSBmb3IgYmFzZQotCSAqICAgICAgICAgICAgYWN0aXZ0aWVzIHdpdGggdW5tb2RpZmllZCBleHRlbnNpb25zCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHVibGlzaEJhc2VBRChib29sZWFuIHB1Ymxpc2hCYXNlQUQpIHsKLQkJdGhpcy5wdWJsaXNoQmFzZUFEID0gcHVibGlzaEJhc2VBRDsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBwdWJsaXNoIGxpZ2h0IHdlaWdodCBuYXZpZ2F0aW9uIHRyZWUgb3B0aW9uLgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgYSBsaWdodCB3ZWlnaHQgbmF2aWdhdGlvbiB0cmVlIHdpbGwgYmUKLQkgKiAgICAgICAgIHB1Ymxpc2hlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUHVibGlzaExpZ2h0V2VpZ2h0VHJlZSgpIHsKLQkJcmV0dXJuIHB1Ymxpc2hMaWdodFdlaWdodFRyZWU7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgcHVibGlzaCBsaWdodCB3ZWlnaHQgbmF2aWdhdGlvbiB0cmVlIG9wdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gcHVibGlzaExpZ2h0V2VpZ2h0VHJlZQotCSAqICAgICAgICAgICAgaWYgPGNvZGU+dHJ1ZTwvY29kZT4sIHB1Ymxpc2ggYSBsaWdodCB3ZWlnaHQgbmF2aWdhdGlvbgotCSAqICAgICAgICAgICAgdHJlZQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFB1Ymxpc2hMaWdodFdlaWdodFRyZWUoYm9vbGVhbiBwdWJsaXNoTGlnaHRXZWlnaHRUcmVlKSB7Ci0JCXRoaXMucHVibGlzaExpZ2h0V2VpZ2h0VHJlZSA9IHB1Ymxpc2hMaWdodFdlaWdodFRyZWU7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgc2hvdyBtZXRob2QgY29udGVudCBpbiBkZXNjcmlwdG9yIHBhZ2VzIG9wdGlvbi4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBtZXRob2QgY29udGVudCB3aWxsIGJlIGRpc3BsYXllZCBpbgotCSAqICAgICAgICAgdGhlIGRlc2NyaXB0b3IgcGFnZXMKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1Nob3dNZXRob2RDb250ZW50SW5EZXNjcmlwdG9ycygpIHsKLQkJcmV0dXJuIHNob3dNZXRob2RDb250ZW50SW5EZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBzaG93IG1ldGhvZCBjb250ZW50IGluIGRlc2NyaXB0b3IgcGFnZXMgb3B0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBzaG93TWV0aG9kQ29udGVudEluRGVzY3JpcHRvcnMKLQkgKiAgICAgICAgICAgIGlmIDxjb2RlPnRydWU8L2NvZGU+LCBkaXNwbGF5IHRoZSBtZXRob2QgY29udGVudCBpbiB0aGUKLQkgKiAgICAgICAgICAgIGRlc2NyaXB0b3IgcGFnZXMKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTaG93TWV0aG9kQ29udGVudEluRGVzY3JpcHRvcnMoCi0JCQlib29sZWFuIHNob3dNZXRob2RDb250ZW50SW5EZXNjcmlwdG9ycykgewotCQl0aGlzLnNob3dNZXRob2RDb250ZW50SW5EZXNjcmlwdG9ycyA9IHNob3dNZXRob2RDb250ZW50SW5EZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBzaG93IHJlbGF0ZWQgZGVzY3JpcHRvcnMgaW4gdGhlIHRhc2ssIHJvbGUsIGFuZCB3b3JrIHByb2R1Y3QKLQkgKiBwYWdlcyBvcHRpb24uCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiByZWxhdGVkIGRlc2NyaXB0b3JzIHdpbGwgYmUgZGlzcGxheWVkIGluCi0JICogICAgICAgICB0aGUgdGFzaywgcm9sZSwgYW5kIHdvcmsgcHJvZHVjdCBwYWdlcwotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2hvd1JlbGF0ZWREZXNjcmlwdG9ycygpIHsKLQkJcmV0dXJuIHNob3dSZWxhdGVkRGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgc2hvdyByZWxhdGVkIGRlc2NyaXB0b3JzIGluIHRoZSB0YXNrLCByb2xlLCBhbmQgd29yayBwcm9kdWN0Ci0JICogcGFnZXMgb3B0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBzaG93UmVsYXRlZERlc2NyaXB0b3JzCi0JICogICAgICAgICAgICBpZiA8Y29kZT50cnVlPC9jb2RlPiwgZGlzcGxheSB0aGUgcmVsYXRlZCBkZXNjcmlwdG9ycyBpbgotCSAqICAgICAgICAgICAgdGhlIHRhc2ssIHJvbGUsIGFuZCB3b3JrIHByb2R1Y3QgcGFnZXMKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTaG93UmVsYXRlZERlc2NyaXB0b3JzKGJvb2xlYW4gc2hvd1JlbGF0ZWREZXNjcmlwdG9ycykgewotCQl0aGlzLnNob3dSZWxhdGVkRGVzY3JpcHRvcnMgPSBzaG93UmVsYXRlZERlc2NyaXB0b3JzOwotCX0KLQkKLQkvKioKLQkgKiBHZXRzIHNob3cgYWxsIGluZGlyZWN0IChncmVlbikgb2NjdXJyZW5jZXMgaW4gZXh0ZW5kZWQgcGF0dGVybnMgb3B0aW9uCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBhbGwgaW5kaXJlY3QgZGVzY3JpcHRvcnMgd2lsbCBiZSBkaXNwbGF5ZWQgaW4KLQkgKiAgICAgICAgIHRoZSB0YXNrLCByb2xlLCBhbmQgd29yayBwcm9kdWN0IHBhZ2VzCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTaG93UmVsYXRlZERlc2NyaXB0b3JzT3B0aW9uKCkgewotCQlyZXR1cm4gc2hvd1JlbGF0ZWREZXNjcmlwdG9yc09wdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBzaG93IGFsbCBpbmRpcmVjdCAoZ3JlZW4pIG9jY3VycmVuY2VzIGluIGV4dGVuZGVkIHBhdHRlcm5zIG9wdGlvbgotCSAqIAotCSAqIEBwYXJhbSBzaG93UmVsYXRlZERlc2NyaXB0b3JzT3B0aW9uCi0JICogICAgICAgICAgICBpZiA8Y29kZT50cnVlPC9jb2RlPiwgZGlzcGxheSBhbGwgaW5kaXJlY3QgZGVzY3JpcHRvcnMgaW4KLQkgKiAgICAgICAgICAgIHRoZSB0YXNrLCByb2xlLCBhbmQgd29yayBwcm9kdWN0IHBhZ2VzCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2hvd1JlbGF0ZWREZXNjcmlwdG9yc09wdGlvbihib29sZWFuIHNob3dSZWxhdGVkRGVzY3JpcHRvcnNPcHRpb24pIHsKLQkJdGhpcy5zaG93UmVsYXRlZERlc2NyaXB0b3JzT3B0aW9uID0gc2hvd1JlbGF0ZWREZXNjcmlwdG9yc09wdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBzaG93IHRhc2sgZGVzY3JpcHRvcnMgaW4gbmF2aWdhdGlvbiB0cmVlIG9wdGlvbi4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRhc2sgZGVzY3JpcHRvcnMgd2lsbCBiZSBkaXNwbGF5ZWQgaW4gdGhlCi0JICogICAgICAgICBuYXZpZ2F0aW9uIHRyZWUKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1Nob3dEZXNjcmlwdG9yc0luTmF2aWdhdGlvblRyZWUoKSB7Ci0JCXJldHVybiBzaG93RGVzY3JpcHRvcnNJbk5hdmlnYXRpb25UcmVlOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHNob3cgdGFzayBkZXNjcmlwdG9ycyBpbiBuYXZpZ2F0aW9uIHRyZWUgb3B0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBzaG93RGVzY3JpcHRvcnNJblRyZWUKLQkgKiAgICAgICAgICAgIGlmIDxjb2RlPnRydWU8L2NvZGU+LCBkaXNwbGF5IHRoZSB0YXNrIGRlc2NyaXB0b3JzIGluIHRoZQotCSAqICAgICAgICAgICAgbmF2aWdhdGlvbiB0cmVlCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2hvd0Rlc2NyaXB0b3JzSW5OYXZpZ2F0aW9uVHJlZSgKLQkJCWJvb2xlYW4gc2hvd0Rlc2NyaXB0b3JzSW5OYXZpZ2F0aW9uVHJlZSkgewotCQl0aGlzLnNob3dEZXNjcmlwdG9yc0luTmF2aWdhdGlvblRyZWUgPSBzaG93RGVzY3JpcHRvcnNJbk5hdmlnYXRpb25UcmVlOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHB1Ymxpc2ggZW1wdHkgY2F0ZWdvcmllcyBvcHRpb24uCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBlbXB0eSBjYXRlZ29yaWVzIHdpbGwgYmUgcHVibGlzaGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNQdWJsaXNoRW1wdHlDYXRlZ29yaWVzKCkgewotCQlyZXR1cm4gcHVibGlzaEVtcHR5Q2F0ZWdvcmllczsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBwdWJsaXNoIGVtcHR5IGNhdGVnb3JpZXMgb3B0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBwdWJsaXNoRW1wdHlDYXRlZ29yaWVzCi0JICogICAgICAgICAgICBpZiA8Y29kZT50cnVlPC9jb2RlPiwgcHVibGlzaCB0aGUgZW1wdHkgY2F0ZWdvcmllcwotCSAqLwotCXB1YmxpYyB2b2lkIHNldFB1Ymxpc2hFbXB0eUNhdGVnb3JpZXMoYm9vbGVhbiBwdWJsaXNoRW1wdHlDYXRlZ29yaWVzKSB7Ci0JCXRoaXMucHVibGlzaEVtcHR5Q2F0ZWdvcmllcyA9IHB1Ymxpc2hFbXB0eUNhdGVnb3JpZXM7Ci0JfQotCi0JLyoqCi0JICogVmFsaWRhdGVzIHRoZSBwdWJsaXNoIG9wdGlvbnMuCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgcHVibGlzaCBvcHRpb25zIGlzIHZhbGlkLgotCSAqLwotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKCkgewotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy9zZXJ2aWNlcy9QdWJsaXNoaW5nQ29udGVudFZhbGlkYXRvci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3NlcnZpY2VzL1B1Ymxpc2hpbmdDb250ZW50VmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmODFhZTguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3NlcnZpY2VzL1B1Ymxpc2hpbmdDb250ZW50VmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MzQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcuc2VydmljZXM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uUHJpbnRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLm5ldC5wcm94eS5JUHJveHlEYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUubmV0LnByb3h5LklQcm94eVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuVGltZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LkRlZmF1bHRDb250ZW50VmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5MaW5rSW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQudXRpbC5YbWxFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuTGlicmFyeVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5SZXNvdXJjZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5QdWJsaXNoaW5nUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLlB1Ymxpc2hpbmdSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudXRpbC5odHRwLkh0dHBSZXNwb25zZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51dGlsLmh0dHAuSHR0cFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50Q2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLlNlcnZpY2VSZWZlcmVuY2U7Ci0KLWltcG9ydCBjb20uaWJtLmljdS51dGlsLkNhbGVuZGFyOwotCi0vKioKLSAqIGNvbnRlbnQgdmFsaWRhdG9yIHVzZWQgZm9yIHB1Ymxpc2hpbmcuIFRoaXMgY2xhc3Mgd2lsbCBiZSByZXNwb25zaWJsZSBmb3IKLSAqIHZhbGlkYXRpbmcgdGhlIGNvbnRlbnQgdG8gYmUgcHVibGlzaGVkLCBmaXhpbmcgcHJvYmxlbXMgc3VjaCBhcyBsaW5rcyBpbiB0aGUKLSAqIGNvbnRlbnQsIGFuZCBsb2dnaW5nIGluZm9ybWF0aW9uIGFib3V0IG1pc3NpbmcgZWxlbWVudHMsIG1pc3NpbmcgcmVzb3VyY2VzLAotICogZXRjLgotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBQdWJsaXNoaW5nQ29udGVudFZhbGlkYXRvciBleHRlbmRzIERlZmF1bHRDb250ZW50VmFsaWRhdG9yIHsKLQotCXByaXZhdGUgYm9vbGVhbiBkZWJ1ZyA9IFB1Ymxpc2hpbmdQbHVnaW4uZ2V0RGVmYXVsdCgpLmlzRGVidWdnaW5nKCk7Ci0KLQkvLyBwcml2YXRlIGJvb2xlYW4gc2hvd0V4dHJhSW5mb0ZvckRlc2NyaXB0b3JzID0gZmFsc2U7Ci0JLy8gcHJpdmF0ZSBib29sZWFuIHNob3dSZWxhdGVkRGVzY3JpcHRvcnMgPSBmYWxzZTsKLQotCXByb3RlY3RlZCBQdWJsaXNoSFRNTE9wdGlvbnMgb3B0aW9ucyA9IG51bGw7Ci0KLQljbGFzcyBJbnZhbGlkRXh0ZXJuYWxMaW5rSW5mbyB7Ci0JCXB1YmxpYyBNZXRob2RFbGVtZW50IG93bmVyOwotCi0JCXB1YmxpYyBTdHJpbmcgdXJsOwotCi0JCXB1YmxpYyBTdHJpbmcgbWVzc2FnZTsKLQotCQlwdWJsaWMgSW52YWxpZEV4dGVybmFsTGlua0luZm8oTWV0aG9kRWxlbWVudCBvd25lciwgU3RyaW5nIHVybCwKLQkJCQlTdHJpbmcgbWVzc2FnZSkgewotCQkJdGhpcy5vd25lciA9IG93bmVyOwotCQkJdGhpcy51cmwgPSB1cmw7Ci0JCQl0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlOwotCQl9Ci0JfQotCi0JY2xhc3MgTWlzc2luZ1JlZmVyZW5jZSB7Ci0JCXB1YmxpYyBNZXRob2RFbGVtZW50IG93bmVyOwotCi0JCXB1YmxpYyBNZXRob2RFbGVtZW50IHJlZkVsZW1lbnQ7Ci0KLQkJcHVibGljIFN0cmluZyBndWlkOwotCi0JCXB1YmxpYyBTdHJpbmcgbGlua2VkVGV4dDsKLQotCQlwdWJsaWMgTWlzc2luZ1JlZmVyZW5jZShNZXRob2RFbGVtZW50IG93bmVyLCBNZXRob2RFbGVtZW50IHJlZkVsZW1lbnQpIHsKLQkJCXRoaXMub3duZXIgPSBvd25lcjsKLQkJCXRoaXMucmVmRWxlbWVudCA9IHJlZkVsZW1lbnQ7Ci0JCX0KLQotCQlwdWJsaWMgTWlzc2luZ1JlZmVyZW5jZShNZXRob2RFbGVtZW50IG93bmVyLCBTdHJpbmcgZ3VpZCwKLQkJCQlTdHJpbmcgbGlua2VkVGV4dCkgewotCQkJdGhpcy5vd25lciA9IG93bmVyOwotCQkJdGhpcy5ndWlkID0gZ3VpZDsKLQkJCXRoaXMubGlua2VkVGV4dCA9IGxpbmtlZFRleHQ7Ci0JCX0KLQl9Ci0KLQljbGFzcyBNaXNzaW5nUmVzb3VyY2UgewotCQlwdWJsaWMgTWV0aG9kRWxlbWVudCBvd25lcjsKLQotCQlwdWJsaWMgRmlsZSByZXNvdXJjZUZpbGU7Ci0KLQkJcHVibGljIFN0cmluZyB1cmw7Ci0KLQkJcHVibGljIE1pc3NpbmdSZXNvdXJjZShNZXRob2RFbGVtZW50IG93bmVyLCBGaWxlIHJlc291cmNlRmlsZSwKLQkJCQlTdHJpbmcgdXJsKSB7Ci0JCQl0aGlzLm93bmVyID0gb3duZXI7Ci0JCQl0aGlzLnJlc291cmNlRmlsZSA9IHJlc291cmNlRmlsZTsKLQkJCXRoaXMudXJsID0gdXJsOwotCQl9Ci0JfQotCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBMT0dTX0ZPTERFUiA9ICJsb2dzIjsgLy8kTk9OLU5MUy0xJAotCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBFUlJPUl9MT0dfRklMRU5BTUUgPSAiZXJyb3IubG9nIjsgLy8kTk9OLU5MUy0xJAotCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBXQVJOSU5HX0xPR19GSUxFTkFNRSA9ICJ3YXJuaW5nLmxvZyI7IC8vJE5PTi1OTFMtMSQKLQotCXN0YXRpYyBmaW5hbCBTdHJpbmcgSU5GT19MT0dfRklMRU5BTUUgPSAiaW5mby5sb2ciOyAvLyROT04tTkxTLTEkCi0KLQlzdGF0aWMgZmluYWwgU3RyaW5nIENPUkVfTkVUX0JVTkRMRSA9ICJvcmcuZWNsaXBzZS5jb3JlLm5ldCI7IC8vJE5PTi1OTFMtMSQKLQotCXByb3RlY3RlZCBGaWxlIGxvZ1BhdGg7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiB2YWxpZGF0ZUV4dGVybmFsTGlua3MgPSBmYWxzZTsKLQotCXByb3RlY3RlZCBMaXN0IGludmFsaWRFeHRlcm5hbExpbmtzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JLy8gY2FjaGUgdGhlIHZhbGlkZWQgZXh0ZXJuYWwgbGlua3MgdG8gYXZvaWQgbXVsdGlwbGUgY2hlY2tpbmcKLQlwcm90ZWN0ZWQgTGlzdCB2YWxpZGF0ZWRFeHRlcm5hbExpbmtzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JcHJvdGVjdGVkIExpc3QgbWlzc2luZ1JlZmVyZW5jZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQlwcm90ZWN0ZWQgTGlzdCBtaXNzaW5nUmVzb3VyY2VzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JcHJvdGVjdGVkIExpc3QgZGlzY2FyZGVkRWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQlwcm90ZWN0ZWQgTGlzdCB2YWxpZENhdGVnb3JpZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQlwcm90ZWN0ZWQgbG9uZyBwdWJsaXNoaW5nX3N0YXJ0ID0gMDsKLQotCXByb3RlY3RlZCBsb25nIHRpbWVfZm9yX2V4dGVybmFsX2xpbmtfY2hlY2tpbmcgPSAwOwotCi0JLy8gY29sbGVjdCB0aGUgZWxlbWVudHMgcmVmZXJlbmNlZCBieSB0aGUgcHVibGlzaGVkIGNvbnRlbnRzIHNvIHdlIGNhbgotCS8vIHB1Ymxpc2ggdGhlbQotCS8vIHRoaXMgd2lsbCBiZSB0aGUgZWxlbWVudHMgdG8gYmUgcHVibGlzaGVkCi0JcHJvdGVjdGVkIExpc3QgcmVmZXJlbmNlZEVsZW1lbnRzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JLy8gcHVibGlzaGVkIGVsZW1lbnRzCi0JcHJvdGVjdGVkIExpc3QgcHVibGlzaGVkRWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkvLyB0aGlzIGlzIHRoZSBkZWZhdWx0IHRhcmdldCBlbGVtZW50IGZvciB0aGUgY29udGVudCB2YWxpZGF0b3IKLQkvLyBzZXQgdGhpcyBiZWZvcmUgcHVibGlzaGluZyB0aGUgZWxlbWVudCBhbmQgc2V0IHRvIG51bGwgYWZ0ZXIgdGhlCi0JLy8gcHVibGlzaGlnbiBpcyBkb25lCi0JcHJvdGVjdGVkIE1ldGhvZEVsZW1lbnQgZGVmYXVsdFRhcmdldCA9IG51bGw7Ci0KLQkvKioKLQkgKiBjb25zcnVjdG9yCi0JICogCi0JICogQHBhcmFtIHB1YkRpcgotCSAqICAgICAgICAgICAgU3RyaW5nCi0JICogQHBhcmFtIHZhbGlkYXRlRXh0ZXJuYWxMaW5rcwotCSAqICAgICAgICAgICAgYm9vbGVhbgotCSAqLwotCXB1YmxpYyBQdWJsaXNoaW5nQ29udGVudFZhbGlkYXRvcihTdHJpbmcgcHViRGlyLCBQdWJsaXNoSFRNTE9wdGlvbnMgb3B0aW9ucykgewotCQlzdXBlcihwdWJEaXIpOwotCQl0aGlzLm9wdGlvbnMgPSBvcHRpb25zOwotCi0JCXRoaXMudmFsaWRhdGVFeHRlcm5hbExpbmtzID0gb3B0aW9ucy5pc0NoZWNrRXh0ZXJuYWxMaW5rcygpOwotCi0JCXRoaXMubG9nUGF0aCA9IG5ldyBGaWxlKHB1YkRpciwgTE9HU19GT0xERVIpOwotCQlzdXBlci5pbmZvID0gZ2V0U3RyZWFtKElORk9fTE9HX0ZJTEVOQU1FKTsKLQkJc3VwZXIud2FybmluZyA9IGdldFN0cmVhbShXQVJOSU5HX0xPR19GSUxFTkFNRSk7Ci0JCXN1cGVyLmVycm9yID0gZ2V0U3RyZWFtKEVSUk9SX0xPR19GSUxFTkFNRSk7Ci0KLQkJLy8gc2V0IHRoZSBzdGFydCB0aW1lCi0JCXB1Ymxpc2hpbmdfc3RhcnQgPSBDYWxlbmRhci5nZXRJbnN0YW5jZSgpLmdldFRpbWVJbk1pbGxpcygpOwotCX0KLQotCS8qKgotCSAqIGRpc3Bvc2UgdGhlIG9iamVjdAotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWludmFsaWRFeHRlcm5hbExpbmtzLmNsZWFyKCk7Ci0JCXZhbGlkYXRlZEV4dGVybmFsTGlua3MuY2xlYXIoKTsKLQkJbWlzc2luZ1JlZmVyZW5jZXMuY2xlYXIoKTsKLQkJbWlzc2luZ1Jlc291cmNlcy5jbGVhcigpOwotCQlkaXNjYXJkZWRFbGVtZW50cy5jbGVhcigpOwotCQl2YWxpZENhdGVnb3JpZXMuY2xlYXIoKTsKLQotCQlyZWZlcmVuY2VkRWxlbWVudHMuY2xlYXIoKTsKLQkJcHVibGlzaGVkRWxlbWVudHMuY2xlYXIoKTsKLQotCQlpbmZvLmNsb3NlKCk7Ci0JCXdhcm5pbmcuY2xvc2UoKTsKLQkJZXJyb3IuY2xvc2UoKTsKLQotCX0KLQotCXByb3RlY3RlZCBQcmludFN0cmVhbSBnZXRTdHJlYW0oU3RyaW5nIGZpbGVOYW1lKSB7Ci0JCXRyeSB7Ci0JCQlGaWxlIGYgPSBuZXcgRmlsZShsb2dQYXRoLCBmaWxlTmFtZSk7Ci0JCQlGaWxlIGRpciA9IGYuZ2V0UGFyZW50RmlsZSgpOwotCQkJZGlyLm1rZGlycygpOwotCi0JCQlpZiAoIWYuZXhpc3RzKCkpIHsKLQkJCQlmLmNyZWF0ZU5ld0ZpbGUoKTsKLQkJCX0KLQotCQkJcmV0dXJuIG5ldyBQcmludFN0cmVhbShuZXcgRmlsZU91dHB1dFN0cmVhbShmKSwgdHJ1ZSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0KLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgSVByb3h5U2VydmljZSBnZXRQcm94eVNlcnZpY2UoKSB7Ci0JCUJ1bmRsZSBidW5kbGUgPSBQbGF0Zm9ybS5nZXRCdW5kbGUoQ09SRV9ORVRfQlVORExFKTsKLQkJaWYgKGJ1bmRsZSAhPSBudWxsKSB7Ci0JCQlCdW5kbGVDb250ZXh0IGN0eCA9IGJ1bmRsZS5nZXRCdW5kbGVDb250ZXh0KCk7Ci0JCQlTdHJpbmcgbmFtZSA9IElQcm94eVNlcnZpY2UuY2xhc3MuZ2V0TmFtZSgpOwotCQkJU2VydmljZVJlZmVyZW5jZSByZWYgPSBjdHguZ2V0U2VydmljZVJlZmVyZW5jZShuYW1lKTsKLQkJCWlmIChyZWYgIT0gbnVsbCkKLQkJCQlyZXR1cm4gKElQcm94eVNlcnZpY2UpIGJ1bmRsZS5nZXRCdW5kbGVDb250ZXh0KCkKLQkJCQkJCS5nZXRTZXJ2aWNlKHJlZik7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogdmFsaWRhdGUgdGhlIGxpbmsgYXR0cmlidXRlcyBmcm8gdGhlIGVsZW1lbnQuCi0JICogCi0JICogQHBhcmFtIG93bmVyCi0JICogICAgICAgICAgICBNZXRob2RFbGVtZW50IHRoZSBvd25lciBlbGVtZW50Ci0JICogQHBhcmFtIGF0dHJpYnV0ZXMKLQkgKiAgICAgICAgICAgIFN0cmluZyB0aGUgYXR0cmlidXRlcyBpbiB0aGUgbGluawotCSAqIEBwYXJhbSB0ZXh0Ci0JICogICAgICAgICAgICBTdHJpbmcgdGhlIHRleHQgYWxsb3cgd2l0aCB0aGUgbGluawotCSAqIEBwYXJhbSBjb25maWcKLQkgKiAgICAgICAgICAgIE1ldGhvZENvbmZpZ3VyYXRpb24KLQkgKiAKLQkgKiBAcmV0dXJuIExpbmtJbmZvCi0JICovCi0JcHVibGljIExpbmtJbmZvIHZhbGlkYXRlTGluayhNZXRob2RFbGVtZW50IG93bmVyLCBTdHJpbmcgYXR0cmlidXRlcywKLQkJCVN0cmluZyB0ZXh0LCBNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZywgU3RyaW5nIHRhZykgewotCQlMaW5rSW5mbyBpbmZvID0gc3VwZXIKLQkJCQkudmFsaWRhdGVMaW5rKG93bmVyLCBhdHRyaWJ1dGVzLCB0ZXh0LCBjb25maWcsIHRhZyk7Ci0KLQkJaWYgKHZhbGlkYXRlRXh0ZXJuYWxMaW5rcykgewotCi0JCQlTdHJpbmcgdXJsID0gaW5mby5nZXRVcmwoKTsKLQkJCWlmICgodXJsICE9IG51bGwpICYmIFJlc291cmNlSGVscGVyLmlzRXh0ZXJuYWxMaW5rKHVybCkKLQkJCQkJJiYgIXVybC5zdGFydHNXaXRoKCJmdHA6Ly8iKSkgLy8kTk9OLU5MUy0xJAotCQkJewotCQkJCWlmICghdmFsaWRhdGVkRXh0ZXJuYWxMaW5rcy5jb250YWlucyh1cmwpKSB7Ci0JCQkJCVRpbWVyIHQgPSBuZXcgVGltZXIoKTsKLQkJCQkJSVByb3h5U2VydmljZSBwcm94eVNlcnZpY2UgPSBnZXRQcm94eVNlcnZpY2UoKTsKLQotCQkJCQlpZiAocHJveHlTZXJ2aWNlLmlzUHJveGllc0VuYWJsZWQoKSkgewotCQkJCQkJSVByb3h5RGF0YSBwcm94eSA9IG51bGw7Ci0JCQkJCQlib29sZWFuIGFjY2Vzc2libGUgPSBmYWxzZTsKLQkJCQkJCWJvb2xlYW4gdXNlUHJveHkgPSBmYWxzZTsKLQkJCQkJCVN0cmluZyBleGNlcHRpb25NZXNzYWdlID0gbnVsbDsKLQkJCQkJCVN0cmluZ1tdIHByb3h5VHlwZXMgPSB7IElQcm94eURhdGEuSFRUUF9QUk9YWV9UWVBFLAotCQkJCQkJCQlJUHJveHlEYXRhLkhUVFBTX1BST1hZX1RZUEUsCi0JCQkJCQkJCUlQcm94eURhdGEuU09DS1NfUFJPWFlfVFlQRSB9OwotCQkJCQkJZm9yIChTdHJpbmcgcHJveHlUeXBlIDogcHJveHlUeXBlcykgewotCQkJCQkJCS8vIGFjY2VzcyBleHRlcm5hbCBsaW5rIGJ5IHVzaW5nIGRpZmZlcmVudCBwcm94eXMKLQkJCQkJCQlwcm94eSA9IHByb3h5U2VydmljZS5nZXRQcm94eURhdGEocHJveHlUeXBlKTsKLQkJCQkJCQlpZiAoKHByb3h5LmdldEhvc3QoKT09bnVsbCl8fHByb3h5LmdldFBvcnQoKT09LTEpCi0JCQkJCQkJewotCQkJCQkJCQljb250aW51ZTsKLQkJCQkJCQl9Ci0JCQkJCQkJdHJ5IHsKLQkJCQkJCQkJSHR0cFJlc3BvbnNlIHJlc3AgPSBIdHRwVXRpbC5kb0dldCh1cmwsIG51bGwsCi0JCQkJCQkJCQkJNjAwMCwgcHJveHkpOyAvLyB0aW1lb3V0Ci0JCQkJCQkJCXVzZVByb3h5ID0gdHJ1ZTsKLQkJCQkJCQkJYWNjZXNzaWJsZSA9IHRydWU7Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCX0gY2F0Y2ggKGphdmEubmV0LlVua25vd25Ib3N0RXhjZXB0aW9uIGUpIHsKLQkJCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJCQlpZiAoZXhjZXB0aW9uTWVzc2FnZSA9PSBudWxsKQotCQkJCQkJCQl7Ci0JCQkJCQkJCQlleGNlcHRpb25NZXNzYWdlID0gcHJveHkuZ2V0SG9zdCgpICsgIjoiIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCQkJKyBwcm94eS5nZXRQb3J0KCkgKyAiWyIgKyBwcm94eVR5cGUgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJCQkrICJdOiIgKyBlLmdldE1lc3NhZ2UoKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQkJZXhjZXB0aW9uTWVzc2FnZSArPSAiOyIgKyBwcm94eS5nZXRIb3N0KCkgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJCQkrICI6IiArIHByb3h5LmdldFBvcnQoKSArICJbIgkJLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQkJCQkJCSsgcHJveHlUeXBlICsgIl06IiArIGUuZ2V0TWVzc2FnZSgpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQlpZiAodXNlUHJveHkpCi0JCQkJCQl7Ci0JCQkJCQkJaWYgKCFhY2Nlc3NpYmxlKSB7Ci0JCQkJCQkJCWlmIChleGNlcHRpb25NZXNzYWdlICE9IG51bGwpIHsKLQkJCQkJCQkJCWxvZ0ludmFsaWRFeHRlcm5hbExpbmsob3duZXIsIHVybCwKLQkJCQkJCQkJCQkJZXhjZXB0aW9uTWVzc2FnZSk7Ci0JCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCQlsb2dJbnZhbGlkRXh0ZXJuYWxMaW5rKG93bmVyLCB1cmwsIG51bGwpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJZWxzZQkvLyBjb25uZWN0IGRpcmVjdGx5Ci0JCQkJCQl7Ci0JCQkJCQkJdHJ5IHsKLQkJCQkJCQkJSHR0cFJlc3BvbnNlIHJlc3AgPSBIdHRwVXRpbC5kb0dldCh1cmwsIG51bGwsIDYwMDApOyAvLyB0aW1lb3V0Ci0JCQkJCQkJfSBjYXRjaCAoamF2YS5uZXQuVW5rbm93bkhvc3RFeGNlcHRpb24gZSkgewotCQkJCQkJCQlsb2dJbnZhbGlkRXh0ZXJuYWxMaW5rKG93bmVyLCB1cmwsIG51bGwpOwotCQkJCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJCWxvZ0ludmFsaWRFeHRlcm5hbExpbmsob3duZXIsIHVybCwgZS5nZXRNZXNzYWdlKCkpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCQotCQkJCQl9IGVsc2UgewotCQkJCQkJdHJ5IHsKLQkJCQkJCQlIdHRwUmVzcG9uc2UgcmVzcCA9IEh0dHBVdGlsLmRvR2V0KHVybCwgbnVsbCwgNjAwMCk7IC8vIHRpbWVvdXQKLQkJCQkJCQkvLyBTeXN0ZW0ub3V0Ci0JCQkJCQkJLy8gLnByaW50bG4odGltZQotCQkJCQkJCS8vICsgIiBtaW5pLXNlY29uZHMgcXVlcnlpbmcgVXJsICciICsgdXJsICsgIicsCi0JCQkJCQkJLy8gcmV0dXJuCi0JCQkJCQkJLy8gc3RhdHVzPSIgKyByZXNwLmdldFN0YXR1cygpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCS8vIC8vJE5PTi1OTFMtMiQKLQkJCQkJCX0gY2F0Y2ggKGphdmEubmV0LlVua25vd25Ib3N0RXhjZXB0aW9uIGUpIHsKLQkJCQkJCQlsb2dJbnZhbGlkRXh0ZXJuYWxMaW5rKG93bmVyLCB1cmwsIG51bGwpOwotCQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQlsb2dJbnZhbGlkRXh0ZXJuYWxMaW5rKG93bmVyLCB1cmwsIGUuZ2V0TWVzc2FnZSgpKTsKLQkJCQkJCX0KLQkJCQkJfQotCi0JCQkJCXQuc3RvcCgpOwotCQkJCQl0aW1lX2Zvcl9leHRlcm5hbF9saW5rX2NoZWNraW5nICs9IHQuZ2V0VGltZSgpOwotCi0JCQkJCS8vIGNhY2hlIGl0Ci0JCQkJCXZhbGlkYXRlZEV4dGVybmFsTGlua3MuYWRkKHVybCk7Ci0KLQkJCQkJLy8gZG8gd2UgbmVlZCB0byBsb2cgdGhlIGluZm8gc28gdGhhdCB1c2VyIGtub3cgd2hhdAotCQkJCQkvLyBleHRlcm5hbAotCQkJCQkvLyB1cmxzIGFyZSByZWZlcmVuY2VkIGluIHRoZSBjb250ZW50PwotCQkJCQlsb2dJbmZvKG93bmVyLCBOTFMuYmluZCgKLQkJCQkJCQlQdWJsaXNoaW5nUmVzb3VyY2VzLmV4dGVybmFsVXJsX21zZywgbmV3IE9iamVjdFtdIHsKLQkJCQkJCQkJCW5ldyBJbnRlZ2VyKHQuZ2V0VGltZSgpKSwgdXJsIH0pKTsKLQkJCQl9Ci0KLQkJCX0KLQkJfQotCQlyZXR1cm4gaW5mbzsKLQl9Ci0KLQkvKioKLQkgKiBsb2cgbWlzc2luZyByZWZlcmVuY2UuCi0JICogCi0JICogQHBhcmFtIG93bmVyCi0JICogICAgICAgICAgICBNZXRob2RFbGVtZW50Ci0JICogQHBhcmFtIHJlZkVsZW1lbnQKLQkgKiAgICAgICAgICAgIE1ldGhvZEVsZW1lbnQgdGhlIG1pc3NpbmcgZWxlbWVudAotCSAqLwotCXB1YmxpYyB2b2lkIGxvZ01pc3NpbmdSZWZlcmVuY2UoTWV0aG9kRWxlbWVudCBvd25lciwKLQkJCU1ldGhvZEVsZW1lbnQgcmVmRWxlbWVudCkgewotCQlzdXBlci5sb2dNaXNzaW5nUmVmZXJlbmNlKG93bmVyLCByZWZFbGVtZW50KTsKLQkJbWlzc2luZ1JlZmVyZW5jZXMuYWRkKG5ldyBNaXNzaW5nUmVmZXJlbmNlKG93bmVyLCByZWZFbGVtZW50KSk7Ci0JfQotCi0JLyoqCi0JICogbG9nIG1pc3NpbmcgcmVmZXJlbmNlCi0JICogCi0JICogQHBhcmFtIG93bmVyCi0JICogICAgICAgICAgICBNPGV0aG9kRWxlbWVudAotCSAqIEBwYXJhbSBndWlkCi0JICogICAgICAgICAgICBTdHJpbmcgdGhlIGd1aWQgb2YgdGhlIG1pc3NpbmcgZWxlbWVudAotCSAqIEBwYXJhbSBsaW5rZWRUZXh0Ci0JICogICAgICAgICAgICBTdHJpbmcgdGhlIGxpbmtlZCB0ZXh0LgotCSAqLwotCXB1YmxpYyB2b2lkIGxvZ01pc3NpbmdSZWZlcmVuY2UoTWV0aG9kRWxlbWVudCBvd25lciwgU3RyaW5nIGd1aWQsCi0JCQlTdHJpbmcgbGlua2VkVGV4dCkgewotCQlzdXBlci5sb2dNaXNzaW5nUmVmZXJlbmNlKG93bmVyLCBndWlkLCBsaW5rZWRUZXh0KTsKLQkJbWlzc2luZ1JlZmVyZW5jZXMuYWRkKG5ldyBNaXNzaW5nUmVmZXJlbmNlKG93bmVyLCBndWlkLCBsaW5rZWRUZXh0KSk7Ci0JfQotCi0JLyoqCi0JICogbG9nIG1pc3NpbmcgcmVzb3VyY2UuCi0JICogCi0JICogQHBhcmFtIG93bmVyCi0JICogICAgICAgICAgICBNZXRob2RFbGVtZW50Ci0JICogQHBhcmFtIHJlc291cmNlRmlsZQotCSAqICAgICAgICAgICAgRmlsZQotCSAqIEBwYXJhbSB1cmwKLQkgKiAgICAgICAgICAgIFN0cmluZwotCSAqLwotCXB1YmxpYyB2b2lkIGxvZ01pc3NpbmdSZXNvdXJjZShNZXRob2RFbGVtZW50IG93bmVyLCBGaWxlIHJlc291cmNlRmlsZSwKLQkJCVN0cmluZyB1cmwpIHsKLQkJc3VwZXIubG9nTWlzc2luZ1Jlc291cmNlKG93bmVyLCByZXNvdXJjZUZpbGUsIHVybCk7Ci0JCW1pc3NpbmdSZXNvdXJjZXMuYWRkKG5ldyBNaXNzaW5nUmVzb3VyY2Uob3duZXIsIHJlc291cmNlRmlsZSwgdXJsKSk7Ci0JfQotCi0JLyoqCi0JICogbG9nIGludmFsaWQgZXh0ZXJuYWwgbGluawotCSAqIAotCSAqIEBwYXJhbSBvd25lcgotCSAqIEBwYXJhbSB1cmwKLQkgKiAgICAgICAgICAgIFN0cmluZwotCSAqIEBwYXJhbSBtZXNzYWdlCi0JICogICAgICAgICAgICBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgdm9pZCBsb2dJbnZhbGlkRXh0ZXJuYWxMaW5rKE1ldGhvZEVsZW1lbnQgb3duZXIsIFN0cmluZyB1cmwsCi0JCQlTdHJpbmcgbWVzc2FnZSkgewotCQlzdXBlci5sb2dJbnZhbGlkRXh0ZXJuYWxMaW5rKG93bmVyLCB1cmwsIG1lc3NhZ2UpOwotCQlpbnZhbGlkRXh0ZXJuYWxMaW5rcy5hZGQobmV3IEludmFsaWRFeHRlcm5hbExpbmtJbmZvKG93bmVyLCB1cmwsCi0JCQkJbWVzc2FnZSkpOwotCX0KLQotCS8qKgotCSAqIGdldCByZXBvcnQgYWJvdXQgdGhlIGNvbnRlbnQgdmFsaWRhdGlvbi4KLQkgKiAKLQkgKiBAcmV0dXJuIFhtbEVsZW1lbnQKLQkgKi8KLQlwdWJsaWMgWG1sRWxlbWVudCBnZXRSZXBvcnQoKSB7Ci0JCVhtbEVsZW1lbnQgcmVwb3J0WG1sID0gbmV3IFhtbEVsZW1lbnQoInZhbGlkYXRvckluZm8iKTsgLy8kTk9OLU5MUy0xJAotCi0JCWlmIChpbnZhbGlkRXh0ZXJuYWxMaW5rcy5zaXplKCkgPiAwKSB7Ci0JCQlTdHJpbmcgbXNnID0gdGltZV9mb3JfZXh0ZXJuYWxfbGlua19jaGVja2luZyAvIDEwMDAKLQkJCQkJKyAiIHNlY29uZHMgdmFsaWRhdGluZyBleHRlcm5hbCBsaW5rcyI7IC8vJE5PTi1OTFMtMSQKLQkJCVN5c3RlbS5vdXQucHJpbnRsbihtc2cpOwotCQkJbG9nSW5mbyhtc2cpOwotCi0JCQlYbWxFbGVtZW50IGludmFsaWRFeHRlcm5hbExpbmtzWG1sID0gcmVwb3J0WG1sCi0JCQkJCS5uZXdDaGlsZCgiaW52YWxpZEV4dGVybmFsTGlua3MiKTsgLy8kTk9OLU5MUy0xJAotCQkJZm9yIChJdGVyYXRvciBpdCA9IGludmFsaWRFeHRlcm5hbExpbmtzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlJbnZhbGlkRXh0ZXJuYWxMaW5rSW5mbyBpbmZvID0gKEludmFsaWRFeHRlcm5hbExpbmtJbmZvKSBpdAotCQkJCQkJLm5leHQoKTsKLQkJCQlpbnZhbGlkRXh0ZXJuYWxMaW5rc1htbAotCQkJCQkJLm5ld0NoaWxkKCJlbnRyeSIpIC8vJE5PTi1OTFMtMSQKLQkJCQkJCS5zZXRBdHRyaWJ1dGUoInVybCIsIGluZm8udXJsKSAvLyROT04tTkxTLTEkCi0JCQkJCQkuc2V0QXR0cmlidXRlKAotCQkJCQkJCQkib3duZXIiLCAoaW5mby5vd25lciA9PSBudWxsKSA/ICIiIDogTGlicmFyeVV0aWwuZ2V0TG9jYWxpemVUeXBlTmFtZShpbmZvLm93bmVyKSkgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQkuc2V0QXR0cmlidXRlKCJtZXNzYWdlIiwgaW5mby5tZXNzYWdlKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0KLQkJaWYgKG1pc3NpbmdSZWZlcmVuY2VzLnNpemUoKSA+IDApIHsKLQkJCVhtbEVsZW1lbnQgaW52YWxpZFJlZmVyZW5jZXNYbWwgPSByZXBvcnRYbWwKLQkJCQkJLm5ld0NoaWxkKCJpbnZhbGlkUmVmZXJlbmNlcyIpOyAvLyROT04tTkxTLTEkCi0JCQlYbWxFbGVtZW50IG1pc3NpbmdSZWZlcmVuY2VzWG1sID0gcmVwb3J0WG1sCi0JCQkJCS5uZXdDaGlsZCgibWlzc2luZ1JlZmVyZW5jZXMiKTsgLy8kTk9OLU5MUy0xJAotCQkJZm9yIChJdGVyYXRvciBpdCA9IG1pc3NpbmdSZWZlcmVuY2VzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlNaXNzaW5nUmVmZXJlbmNlIGluZm8gPSAoTWlzc2luZ1JlZmVyZW5jZSkgaXQubmV4dCgpOwotCQkJCWlmIChpbmZvLnJlZkVsZW1lbnQgPT0gbnVsbCkgewotCQkJCQlpbnZhbGlkUmVmZXJlbmNlc1htbAotCQkJCQkJCS5uZXdDaGlsZCgiZW50cnkiKSAvLyROT04tTkxTLTEkCi0JCQkJCQkJLnNldEF0dHJpYnV0ZSgiZWxlbWVudCIsIGluZm8ubGlua2VkVGV4dCkgLy8kTk9OLU5MUy0xJAotCQkJCQkJCS5zZXRBdHRyaWJ1dGUoImd1aWQiLCBpbmZvLmd1aWQpIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkuc2V0QXR0cmlidXRlKAotCQkJCQkJCQkJIm93bmVyIiwgKGluZm8ub3duZXIgPT0gbnVsbCkgPyAiIiA6IExpYnJhcnlVdGlsLmdldExvY2FsaXplVHlwZU5hbWUoaW5mby5vd25lcikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQl9IGVsc2UgewotCQkJCQltaXNzaW5nUmVmZXJlbmNlc1htbAotCQkJCQkJCS5uZXdDaGlsZCgiZW50cnkiKSAvLyROT04tTkxTLTEkCi0JCQkJCQkJLnNldEF0dHJpYnV0ZSgKLQkJCQkJCQkJCSJlbGVtZW50IiwgKGluZm8ucmVmRWxlbWVudCA9PSBudWxsKSA/ICIiIDogTGlicmFyeVV0aWwuZ2V0TG9jYWxpemVUeXBlTmFtZShpbmZvLnJlZkVsZW1lbnQpKSAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCQkuc2V0QXR0cmlidXRlKCJndWlkIiwgaW5mby5yZWZFbGVtZW50LmdldEd1aWQoKSkgLy8kTk9OLU5MUy0xJAotCQkJCQkJCS5zZXRBdHRyaWJ1dGUoCi0JCQkJCQkJCQkib3duZXIiLCAoaW5mby5vd25lciA9PSBudWxsKSA/ICIiIDogTGlicmFyeVV0aWwuZ2V0TG9jYWxpemVUeXBlTmFtZShpbmZvLm93bmVyKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWlmIChtaXNzaW5nUmVzb3VyY2VzLnNpemUoKSA+IDApIHsKLQkJCVhtbEVsZW1lbnQgbWlzc2luZ1Jlc291cmNlc1htbCA9IHJlcG9ydFhtbAotCQkJCQkubmV3Q2hpbGQoIm1pc3NpbmdSZXNvdXJjZXMiKTsgLy8kTk9OLU5MUy0xJAotCQkJZm9yIChJdGVyYXRvciBpdCA9IG1pc3NpbmdSZXNvdXJjZXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCU1pc3NpbmdSZXNvdXJjZSBpbmZvID0gKE1pc3NpbmdSZXNvdXJjZSkgaXQubmV4dCgpOwotCQkJCW1pc3NpbmdSZXNvdXJjZXNYbWwKLQkJCQkJCS5uZXdDaGlsZCgiZW50cnkiKSAvLyROT04tTkxTLTEkCi0JCQkJCQkuc2V0QXR0cmlidXRlKCJ1cmwiLCBpbmZvLnVybCkgLy8kTk9OLU5MUy0xJAotCQkJCQkJLnNldEF0dHJpYnV0ZSgKLQkJCQkJCQkJInJlc291cmNlIiwgKGluZm8ucmVzb3VyY2VGaWxlID09IG51bGwpID8gIiIgOiBpbmZvLnJlc291cmNlRmlsZS5nZXRQYXRoKCkpIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJLnNldEF0dHJpYnV0ZSgKLQkJCQkJCQkJIm93bmVyIiwgKGluZm8ub3duZXIgPT0gbnVsbCkgPyAiIiA6IExpYnJhcnlVdGlsLmdldExvY2FsaXplVHlwZU5hbWUoaW5mby5vd25lcikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCQkJfQotCQl9Ci0KLQkJbG9uZyBwdWJsaXNoaW5nX3RpbWUgPSAoQ2FsZW5kYXIuZ2V0SW5zdGFuY2UoKS5nZXRUaW1lSW5NaWxsaXMoKSAtIHB1Ymxpc2hpbmdfc3RhcnQpIC8gMTAwMDsKLQkJaW50IG1pbnV0ZXMgPSAoaW50KSBwdWJsaXNoaW5nX3RpbWUgLyA2MDsKLQkJaW50IHNlY29uZHMgPSAoaW50KSBwdWJsaXNoaW5nX3RpbWUgLSBtaW51dGVzICogNjA7Ci0KLQkJbG9nSW5mbygiUHVibGlzaGluZyB0aW1lOiAiICsgbWludXRlcyArICIgbWludXRlcyAiICsgc2Vjb25kcyArICIgc2Vjb25kcyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCi0JCXJldHVybiByZXBvcnRYbWw7Ci0JfQotCi0JLyoqCi0JICogYWRkIGEgY2F0ZWdvcnkgdGhhdCBzaG91bGQgYmUgcHVibGlzaGVkLgotCSAqIAotCSAqIEBwYXJhbSBlCi0JICogICAgICAgICAgICBDb250ZW50Q2F0ZWdvcnkKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRWYWxpZENhdGVnb3J5KENvbnRlbnRDYXRlZ29yeSBlKSB7Ci0JCWlmICghdmFsaWRDYXRlZ29yaWVzLmNvbnRhaW5zKGUpKSB7Ci0JCQl2YWxpZENhdGVnb3JpZXMuYWRkKGUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogY2hlY2sgaWYgdGhlIGVsZW1lbnQgaXMgZGlzY2FyZGVkIG9yIG5vdCBkaXNjYXJkZWQgZWxlbWVudHMgd2lsbCBiZQotCSAqIHRyZWF0ZWQgYXMgb3V0IHNpZGUgdGhlIGNvbmZpZ3Vyc2F0aW9uCi0JICogCi0JICogQHBhcmFtIG93bmVyCi0JICogICAgICAgICAgICBNZXRob2RFbGVtZW50IHRoZSBvd25lciBvZiB0aGUgZWxlbWVudAotCSAqIEBwYXJhbSBmZWF0dXJlCi0JICogICAgICAgICAgICBPYmplY3QgRVN0cnVjdHVyYWxGZWF0dXJlIG9yIE9wcG9zaXRlRmVhdHVyZQotCSAqIEBwYXJhbSBlCi0JICogICAgICAgICAgICBNZXRob2RFbGVtZW50IHRoZSBlbGVtZW50IHRvIGJlIGNoZWNrZWQKLQkgKiAKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0Rpc2NhcmRlZChNZXRob2RFbGVtZW50IG93bmVyLCBPYmplY3QgZmVhdHVyZSwKLQkJCU1ldGhvZEVsZW1lbnQgZSkgewotCQlpZiAoZGlzY2FyZGVkRWxlbWVudHMuY29udGFpbnMoZSkpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0KLQkJLy8gaWYgdGhlIGVsZW1lbnQgaXMgYSBDb250ZW50Q2F0ZWdvcnkgYW5kIGlzIG5vdCBkaXNjYXJkZWQKLQkJaWYgKGUgaW5zdGFuY2VvZiBDb250ZW50Q2F0ZWdvcnkpIHsKLQkJCWlmICh2YWxpZENhdGVnb3JpZXMuY29udGFpbnMoZSkpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0KLQkJCS8vIG90aGVyd2lzZSwgY2hlY2sgaWYgaXQgc2hvdWxkIGJlIGRpc2NhcmRlZCBvciBub3QKLQkJCS8vIFRPRE8KLQkJCS8vIGZvciBub3csIGRpc2NhcmQgYWxsIHJlZmVyZW5jZWQgY29udGVudCBjYXRlZ29yaWVzIGlmIHRoZXkgYXJlCi0JCQkvLyBub3QgaW5jbHVkZWQgaW4gdGhlIHB1Ymxpc2hpbmcgdmlldy4KLQkJCS8vIE5PISEhISEhISEhISEhIFRoaXMgd2lsbCBsZWFkIHRvIGEgbG90IG9mIGJyb2tlbiBsaW5rcyBhbmQKLQkJCS8vIG1pc3NpbmcgZWxlbWVudAotCQkJLy8gVE9PIHN0cm9uZyBsaW1pdGF0aW9uLiBMZXQgb3BlbiBpdCBmb3Igbm93Ci0JCQkvLyBQdWJsaXNoaW5nOk92ZXJ2aWV3IHBhZ2UgaW4gcHVibGlzaGVkIHdlYnNpdGUKLQkJCS8vIGhhdmUgYnJva2VuIGxpbmtzIHRvIEJNCi0JCQkvLyByZXR1cm4gdHJ1ZTsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogYWRkIGEgcmVmZXJlbmNlZCBlbGVtZW50Ci0JICogCi0JICogQHBhcmFtIG93bmVyCi0JICogICAgICAgICAgICBNZXRob2RFbGVtZW50Ci0JICogQHBhcmFtIGUKLQkgKiAgICAgICAgICAgIE1ldGhvZEVsZW1lbnQKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRSZWZlcmVuY2VkRWxlbWVudChNZXRob2RFbGVtZW50IG93bmVyLCBNZXRob2RFbGVtZW50IGUpIHsKLQkJaWYgKGUgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJLy8gZG9uJ3QgYWRkIGRpc2NhcmRlZCBlbGVtZW50cwotCQlpZiAoaXNEaXNjYXJkZWQob3duZXIsIG51bGwsIGUpKSB7Ci0JCQlpZiAoZGVidWcpIHsKLQkJCQlTeXN0ZW0ub3V0Ci0JCQkJCQkucHJpbnRsbigiRWxlbWVudCBpcyBkaXNjYXJkZWQ6ICIgKyBMaWJyYXJ5VXRpbC5nZXRMb2NhbGl6ZVR5cGVOYW1lKGUpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJcmV0dXJuOwotCQl9Ci0KLQkJaWYgKGUgIT0gbnVsbCAmJiAhcmVmZXJlbmNlZEVsZW1lbnRzLmNvbnRhaW5zKGUpCi0JCQkJJiYgIXB1Ymxpc2hlZEVsZW1lbnRzLmNvbnRhaW5zKGUpKSB7Ci0JCQlyZWZlcmVuY2VkRWxlbWVudHMuYWRkKGUpOwotCQkJbG9nUmVmZXJlbmNlKG93bmVyLCBlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIGxvZyBhIHJlZmVybmVjZQotCSAqIAotCSAqIEBwYXJhbSBvd25lcgotCSAqICAgICAgICAgICAgTWV0aG9kRWxlbWVudAotCSAqIEBwYXJhbSBlCi0JICogICAgICAgICAgICBNZXRob2RFbGVtZW50Ci0JICovCi0JcHVibGljIHZvaWQgbG9nUmVmZXJlbmNlKE1ldGhvZEVsZW1lbnQgb3duZXIsIE1ldGhvZEVsZW1lbnQgZSkgewotCQlpZiAoZGVidWcpIHsKLQkJCVN5c3RlbS5vdXQKLQkJCQkJLnByaW50bG4oIi0tLSBSZWZlcmVuZWNlIEVsZW1lbnQgQWRkZWQ6ICIgKyBMaWJyYXJ5VXRpbC5nZXRMb2NhbGl6ZVR5cGVOYW1lKGUpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyoqCi0JICogcmVtb3ZlIGVsZW1lbnQgZnJvbSByZWZlcmVuY2VkIGxpc3QKLQkgKiAKLQkgKiBAcGFyYW0gZQotCSAqICAgICAgICAgICAgTWV0aG9kRWxlbWVudAotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZVJlZmVyZW5jZWRFbGVtZW50KE1ldGhvZEVsZW1lbnQgZSkgewotCQlpZiAocmVmZXJlbmNlZEVsZW1lbnRzLmNvbnRhaW5zKGUpKSB7Ci0JCQlyZWZlcmVuY2VkRWxlbWVudHMucmVtb3ZlKGUpOwotCQkJaWYgKGRlYnVnKSB7Ci0JCQkJU3lzdGVtLm91dAotCQkJCQkJLnByaW50bG4oIi0tLSBSZWZlcmVuY2UgRWxlbWVudCBSZW1vdmVkOiAiICsgTGlicmFyeVV0aWwuZ2V0TG9jYWxpemVUeXBlTmFtZShlKSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIGdldCBhbGwgdGhlIHJlZmVyZW5jZWQgZWxlbWVudHMKLQkgKiAKLQkgKiBAcmV0dXJuIExpc3QKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRSZWZlcmVuY2VkRWxlbWVudHMoKSB7Ci0JCXJldHVybiByZWZlcmVuY2VkRWxlbWVudHM7Ci0JfQotCi0JLyoqCi0JICogYWV0IHRoZSBkaXNjYXJkZWQgZWxlbWVudCBmb3IgdGhpcyBwdWJsaWNhdGlvbi4gSWYgYW4gZWxlbWVudCBpcwotCSAqIGRpc2NhcmRlZCwgaXQgc2hvdWxkIG5vdCBiZSBwdWJsaXNoZWQgYW5kIGxpbmsgdG8gaXQgc2hvdWxkIGJlIGxpbmsgdG8KLQkgKiBtaXNpbmcgZWxlbWVudCBwYWdlCi0JICogCi0JICogQHBhcmFtIGUKLQkgKiAgICAgICAgICAgIE1ldGhvZEVsZW1lbnQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREaXNjYXJkZWRFbGVtZW50KE1ldGhvZEVsZW1lbnQgZSkgewotCi0JCWlmIChlID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCWlmICghZGlzY2FyZGVkRWxlbWVudHMuY29udGFpbnMoZSkpIHsKLQkJCWRpc2NhcmRlZEVsZW1lbnRzLmFkZChlKTsKLQkJfQotCi0JCS8vIGlmIHRoIGZkaXNjYXJkZWQgZWxlbWVudCBpcyBpbiB0aGUgcmVmZXJlbmNlIGxpc3QsIHJlbW92ZSBpdCBhcyB3ZWxsCi0JCXJlbW92ZVJlZmVyZW5jZWRFbGVtZW50KGUpOwotCX0KLQotCS8qKgotCSAqIGNoZWNrIGlmIGFuIGVsZW5tZW50IGlzIHJlZmVyZW5jZWQgb3Igbm90LgotCSAqIAotCSAqIEBwYXJhbSBlCi0JICogICAgICAgICAgICBNZXRob2RFbGVtZW50Ci0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNSZWZlcmVuY2VkRWxlbWVudChNZXRob2RFbGVtZW50IGUpIHsKLQkJcmV0dXJuIChlICE9IG51bGwpICYmIHJlZmVyZW5jZWRFbGVtZW50cy5jb250YWlucyhlKTsKLQl9Ci0KLQkvKioKLQkgKiBnZXQgdGhlIHB1Ymxpc2hlZCBlbGVtZW50cwotCSAqIAotCSAqIEByZXR1cm4gTGlzdAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFB1Ymxpc2hlZEVsZW1lbnRzKCkgewotCQlyZXR1cm4gcHVibGlzaGVkRWxlbWVudHM7Ci0JfQotCi0JLyoqCi0JICogc2V0IHRoZSBkZWZhdWx0IHRhcmdldCBmb3IgdGhlIHJlZmVyZW5jZWQgZWxlbWVudHMKLQkgKiAKLQkgKiBAcGFyYW0gdGFyZ2V0Ci0JICogICAgICAgICAgICBNZXRob2RFbGVtZW50Ci0JICovCi0JcHVibGljIHZvaWQgc2V0VGFyZ2V0RWxlbWVudChNZXRob2RFbGVtZW50IHRhcmdldCkgewotCQl0aGlzLmRlZmF1bHRUYXJnZXQgPSB0YXJnZXQ7Ci0JfQotCi0JLyoqCi0JICogY2hlY2sgaWYgdGhlcmUgaXMgYSBjbG9zdXJlIG9yIG5vdAotCSAqIAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc0Nsb3N1cmUoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBjaGVjayBpZiBhbiBlbGVtZW50IGlzIGluIGNsb3N1cmUgb3Igbm90LgotCSAqIAotCSAqIEBwYXJhbSBlCi0JICogICAgICAgICAgICBNZXRob2RFbGVtZW50Ci0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaW5DbG9zdXJlKE1ldGhvZEVsZW1lbnQgZSkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBhZGQgZWxlbWVudHMgdG8gY2xvc3VyZQotCSAqIAotCSAqIEBwYXJhbSBpdGVtcwotCSAqICAgICAgICAgICAgTGlzdAotCSAqLwotCXB1YmxpYyB2b2lkIGFkZENsb3N1cmVFbGVtZW50cyhMaXN0IGl0ZW1zKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQkvKioKLQkgKiBtYWtlIGEgY2xvc3VyZQotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIG1ha2VFbGVtZW50Q2xvc3VyZSgpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCXB1YmxpYyBib29sZWFuIHNob3dCcm9rZW5MaW5rcygpIHsKLQkJcmV0dXJuICFvcHRpb25zLmlzQ29udmVydEJyb2tlbkxpbmtzKCk7Ci0JfQotCi0JLyoqCi0JICogZ2V0IHRoZSBmbGFnIG9uIHdoZXRoZXIgdG8gc2hvdyBleHRyYSBkZXNjcmlwdG9yIGluZm8uIElmIHRydWUsCi0JICogaW5mb3JtYXRpb24gZnJvbSBsaW5rZWQgZWxlbWVudCB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZSBkZXNjcmlwdG9yIHBhZ2UuCi0JICogCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gc2hvd0V4dHJhSW5mb0ZvckRlc2NyaXB0b3JzKCkgewotCQlyZXR1cm4gb3B0aW9ucy5pc1Nob3dNZXRob2RDb250ZW50SW5EZXNjcmlwdG9ycygpOwotCX0KLQotCS8qKgotCSAqIHNob3cgZGVzY3JpcHRvcnMgb24gbWV0aG9kIGVsZW1lbnQgcGFnZQotCSAqLwotCXB1YmxpYyBib29sZWFuIHNob3dSZWxhdGVkRGVzY3JpcHRvcnMoKSB7Ci0JCXJldHVybiBvcHRpb25zLnNob3dSZWxhdGVkRGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogZ2V0IHRoZSB0YWIgaWQgZm9yIHRoZSBhY3Rpdml0eSBsYXlvdXQKLQkgKiAKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdEFjdGl2aXR5VGFiKCkgewotCQlyZXR1cm4gb3B0aW9ucy5nZXREZWZhdWx0QWN0aXZpdHlUYWIoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvc2VydmljZXMvUHVibGlzaGluZ0VsZW1lbnRSZWFsaXplci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3NlcnZpY2VzL1B1Ymxpc2hpbmdFbGVtZW50UmVhbGl6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGMwZmNjNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvc2VydmljZXMvUHVibGlzaGluZ0VsZW1lbnRSZWFsaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnNlcnZpY2VzOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uRGVmYXVsdEVsZW1lbnRSZWFsaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLkVsZW1lbnRSZWFsaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotCi0KLS8qKgotICogUmVhbGl6ZXIgZm9yIHB1Ymxpc2hpbmcuCi0gKiBSZWFsaXplcyB0aGUgZWxlbWVudCBiYXNlZCBvbiB0aGUgY29uZmlndXJhdGlvbiBhbmQgcmVhbGl6ZSBvcHRpb25zLgotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUHVibGlzaGluZ0VsZW1lbnRSZWFsaXplciBleHRlbmRzIERlZmF1bHRFbGVtZW50UmVhbGl6ZXIgewotCi0JUHVibGlzaGluZ0NvbnRlbnRWYWxpZGF0b3IgdmFsaWRhdG9yOwotCQotCS8qKgotCSAqIGNvbnN0cnVjdG9yCi0JICogCi0JICogQHBhcmFtIGNvbmZpZyBNZXRob2RDb25maWd1cmF0aW9uCi0JICogQHBhcmFtIHZhbGlkYXRvciBQdWJsaXNoaW5nQ29udGVudFZhbGlkYXRvcgotCSAqLwotCXByb3RlY3RlZCBQdWJsaXNoaW5nRWxlbWVudFJlYWxpemVyKE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnLCBQdWJsaXNoaW5nQ29udGVudFZhbGlkYXRvciB2YWxpZGF0b3IpIHsKLQkJc3VwZXIoY29uZmlnKTsKLQkJdGhpcy52YWxpZGF0b3IgPSB2YWxpZGF0b3I7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBFbGVtZW50UmVhbGl6ZXIgbmV3UHVibGlzaGluZ0VsZW1lbnRSZWFsaXplcihNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZywKLQkJCQkJCQkJCQkJCVB1Ymxpc2hpbmdDb250ZW50VmFsaWRhdG9yIHZhbGlkYXRvcikgewotCQlQdWJsaXNoaW5nRWxlbWVudFJlYWxpemVyIHJlYWxpemVyID0gKFB1Ymxpc2hpbmdFbGVtZW50UmVhbGl6ZXIpIGNyZWF0ZUVsZW1lbnRSZWFsaXplckV4dGVuc2lvbihjb25maWcsIFB1Ymxpc2hpbmdFbGVtZW50UmVhbGl6ZXJfVHlwZSk7Ci0JCWlmIChyZWFsaXplciA9PSBudWxsKSB7Ci0JCQlyZWFsaXplciA9IG5ldyBQdWJsaXNoaW5nRWxlbWVudFJlYWxpemVyKGNvbmZpZywgbnVsbCk7Ci0JCX0KLQkJcmVhbGl6ZXIudmFsaWRhdG9yID0gdmFsaWRhdG9yOwotCQkKLQkJcmV0dXJuIHJlYWxpemVyOwotCX0KLQkKLQkvKioKLQkgKiByZWFsaXplIHRoZSBlbGVtZW50Ci0JICogCi0JICogQHBhcmFtIGVsZW1lbnQgTWV0aG9kRWxlbWVudAotCSAqLwotCXB1YmxpYyBNZXRob2RFbGVtZW50IHJlYWxpemUoTWV0aG9kRWxlbWVudCBlbGVtZW50KSB7Ci0JCQotCQllbGVtZW50ID0gc3VwZXIucmVhbGl6ZShlbGVtZW50KTsKLQkJCi0JCWlmICggZWxlbWVudCA9PSBudWxsICkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJCi0JCS8vIFB1Ymxpc2hpbmcgc2hvdWxkIG5vdCBnZW5lcmF0ZSBsaW5rcyB0byB1bnB1Ymxpc2hlZCBjYXRlZ29yaWVzCi0JCWlmICggdmFsaWRhdG9yLmlzRGlzY2FyZGVkKG51bGwsIG51bGwsIGVsZW1lbnQpICkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJCi0JCXJldHVybiBlbGVtZW50OwotCX0KLQkKLQkvKioKLQkgKiByZWFsaXplIHRoZSBsaXN0IG9mIGZlYXR1cmUgdmFsdWVzIGFuZCByZXR1cm5zIGEgbmV3IGxpc3Qgb2YgdmFsdWVzCi0JICogVGhlIG5ldyBtaWdodCBiZSBhIHJlLXNvcnRpbmcgb2YgdGhlIG9yaWdpbmFsIGxpc3QgCi0JICogb3Igc29tZSBvZiB0aGUgdmFsdWVzIGNhbiBiZSBmaWx0ZXJlZCBvdXQsIGRlcGVuZGluZyBvbiB0aGUgZGV0YWlsIGltcGxlbWVudGF0aW9uCi0JICogTm90ZTogdGhlIGxpc3QgdmFsdWUgcGFzc2VkIGluIG1pZ2h0IGJlIHVwZGF0ZWQgYXMgd2VsbC4KLQkgKiBAcGFyYW0gZWxlbWVudCBNZXRob2RFbGVtZW50Ci0JICogQHBhcmFtIGZlYXR1cmUgRVN0cnVjdHVyYWxGZWF0dXJlCi0JICogQHBhcmFtIHZhbHVlcyBMaXN0Ci0JICogQHJldHVybiBMaXN0Ci0JICovCi0JcHVibGljIExpc3QgcmVhbGl6ZShNZXRob2RFbGVtZW50IGVsZW1lbnQsIAotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIExpc3QgdmFsdWVzKQotCXsKLQkJaWYgKCB2YWx1ZXMgPT0gbnVsbCB8fCB2YWx1ZXMuc2l6ZSgpID09IDAgKSB7Ci0JCQlyZXR1cm4gdmFsdWVzOwotCQl9Ci0JCQotCQlMaXN0IGl0ZW1zID0gc3VwZXIucmVhbGl6ZShlbGVtZW50LCBmZWF0dXJlLCB2YWx1ZXMpOwotCQlpZiAoIHZhbGlkYXRvci5oYXNDbG9zdXJlKCkgKSB7Ci0JCQlpbnQgaSA9IDA7Ci0JCQl3aGlsZSAoIGkgPCBpdGVtcy5zaXplKCkgKSB7Ci0JCQkJTWV0aG9kRWxlbWVudCBlID0gKE1ldGhvZEVsZW1lbnQpaXRlbXMuZ2V0KGkpOwotCQkJCWlmICggdmFsaWRhdG9yLmlzRGlzY2FyZGVkKG51bGwsIGZlYXR1cmUsIGUpICkgewotCQkJCQlpdGVtcy5yZW1vdmUoaSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJaSsrOwotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIGl0ZW1zOwotCX0KLQotCQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3NlcnZpY2VzL1B1Ymxpc2hpbmdSdW5uYWJsZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3NlcnZpY2VzL1B1Ymxpc2hpbmdSdW5uYWJsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YjBlNzAyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy9zZXJ2aWNlcy9QdWJsaXNoaW5nUnVubmFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnNlcnZpY2VzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5UaW1lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuSHRtbEJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LklFbGVtZW50TGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLQotLyoqCi0gKiBydW5uYWJsZSBjbGFzcyB0byBtb25pdG9yIHRoZSBodG1sIGdlbmVyYXRpb24KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjIKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBQdWJsaXNoaW5nUnVubmFibGUgaW1wbGVtZW50cyBSdW5uYWJsZSB7Ci0KLQlpbnQgdGltZW91dF9saW1pdCA9IDYwMDAwMDsgCi0JLy9QdWJsaXNoaW5nQ29udGVudFZhbGlkYXRvciB2YWxpZGF0b3I7IAotCUh0bWxCdWlsZGVyIGh0bWxCdWlsZGVyOwotCVN0cmluZyBodG1sX2ZpbGU7Ci0JSUVsZW1lbnRMYXlvdXQgbGF5b3V0OwotCQotCXB1YmxpYyBQdWJsaXNoaW5nUnVubmFibGUoSHRtbEJ1aWxkZXIgaHRtbEJ1aWxkZXIsIGludCB0aW1lb3V0KSB7Ci0JCXRoaXMudGltZW91dF9saW1pdCA9IHRpbWVvdXQ7Ci0JCXRoaXMuaHRtbEJ1aWxkZXIgPSBodG1sQnVpbGRlcjsKLQl9Ci0JCi0JcHJpdmF0ZSBQdWJsaXNoaW5nQ29udGVudFZhbGlkYXRvciBnZXRWYWxpZGF0b3IoKSB7Ci0JCXJldHVybiAoUHVibGlzaGluZ0NvbnRlbnRWYWxpZGF0b3IpaHRtbEJ1aWxkZXIuZ2V0VmFsaWRhdG9yKCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJaWYgKCBodG1sQnVpbGRlciAhPSBudWxsICYmIHRoaXMubGF5b3V0ICE9IG51bGwgKSB7Ci0JCQl0aGlzLmh0bWxfZmlsZSA9IG51bGw7Ci0JCQl0aGlzLmh0bWxfZmlsZSA9IGh0bWxCdWlsZGVyLmdlbmVyYXRlSHRtbChsYXlvdXQpOwotCQl9Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2VuZXJhdGVIdG1sKElFbGVtZW50TGF5b3V0IGxheW91dCkgewotCQkKLQkJdGhpcy5sYXlvdXQgPSBsYXlvdXQ7Ci0JCU1ldGhvZEVsZW1lbnQgZWxlbWVudCA9IHRoaXMubGF5b3V0LmdldEVsZW1lbnQoKTsKLQkJCi0JCVRpbWVyIHRpbWVyID0gbmV3IFRpbWVyKCk7Ci0JCXRyeSB7Ci0JCQkvLyBzZXQgdGhlIHRhcmdldCBlbGVtZW50IGZvciB0aHJlIGNvbnRlbnQgdmFsaWRhdG9yCi0JCQlnZXRWYWxpZGF0b3IoKS5zZXRUYXJnZXRFbGVtZW50KGVsZW1lbnQpOwotCi0JCQkvLyBydW4gdGhlIHB1Ymxpc2hpbmcgYW5kIGNoZWNrIHRoZSB0aW1lLCBpZiB0aW1lb3V0LCB0ZXJtaW5hdGUgaXQKLQkJCVRocmVhZCB0ID0gbmV3IFRocmVhZCh0aGlzKTsKLQkJCXQuc3RhcnQoKTsKLQkJCXQuam9pbih0aW1lb3V0X2xpbWl0KTsKLQkJCWlmICh0LmlzQWxpdmUoKSkgewotCQkJCS8vIHdhaXQgZm9yIHRoZSB0aHJlYWQgdG8gZGllIGFuZCBsb2cgYW4gZXJyb3IKLQkJCQl0aW1lci5zdG9wKCk7Ci0JCQkJZ2V0VmFsaWRhdG9yKCkKLQkJCQkJCS5sb2dJbmZvKAotCQkJCQkJCQllbGVtZW50LAotCQkJCQkJCQkicHVibGlzaGluZyBlbGVtZW50IHRha2VzICIgKyB0aW1lci5nZXRUaW1lKCkgKyAiIG1pbmkgc2Vjb25kcyBhbHJlYWR5IGFuZCBpcyBzdGlsbCBub3QgZG9uZSB5ZXQgLi4uIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCXRpbWVyLnN0YXJ0KCk7Ci0JCQkJdC5qb2luKCk7CQkJCi0JCQl9Ci0JCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUxKSB7Ci0JCQllMS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWdldFZhbGlkYXRvcigpLnNldFRhcmdldEVsZW1lbnQobnVsbCk7Ci0JCQlnZXRWYWxpZGF0b3IoKS5nZXRSZWZlcmVuY2VkRWxlbWVudHMoKS5yZW1vdmUoZWxlbWVudCk7Ci0KLQkJCXRpbWVyLnN0b3AoKTsKLQkJCWdldFZhbGlkYXRvcigpLmxvZ0luZm8oZWxlbWVudCwKLQkJCQkJdGltZXIuZ2V0VG90YWxUaW1lKCkgKyAiIG1pbmkgc2Vjb25kcyBwdWJsaXNoaW5nIGVsZW1lbnQiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCQotCQlyZXR1cm4gdGhpcy5odG1sX2ZpbGU7Ci0JCQotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCXRoaXMubGF5b3V0ID0gbnVsbDsKLQkJdGhpcy5odG1sX2ZpbGUgPSBudWxsOwotCQl0aGlzLmh0bWxCdWlsZGVyID0gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvc2VydmljZXMvUHVibGlzaGluZ1NlcnZpY2VFeGNlcHRpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy9zZXJ2aWNlcy9QdWJsaXNoaW5nU2VydmljZUV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZjVjMGZjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy9zZXJ2aWNlcy9QdWJsaXNoaW5nU2VydmljZUV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcuc2VydmljZXM7Ci0KLS8qKgotICogU2lnbmFscyB0aGF0IGEgUHVibGlzaGluZyBTZXJ2aWNlIG9wZXJhdGlvbiBoYXMgZmFpbGVkLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBQdWJsaXNoaW5nU2VydmljZUV4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbiB7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTYwNjkxNzUxODg1OTg2MTM1MTNMOwotCi0JLyoqCi0JICogVGhlIHJvb3QgY2F1c2Ugb2YgdGhlIGV4Y2VwdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgVGhyb3dhYmxlIHJvb3RDYXVzZTsKLQkKLQkvKioKLQkgKiBUaGUgZXJyb3IgbWVzc2FnZSBhc3NvY2lhdGVkIHdpdGggdGhlIGV4Y2VwdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGVycm9yTXNnOwotCQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFB1Ymxpc2hpbmdTZXJ2aWNlRXhjZXB0aW9uKCkgewotICAgICAgICBzdXBlcigpOwotICAgIH0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIGdpdmVuIHRoZSByb290IGNhdXNlIG9mIHRoZSBleGNlcHRpb24uCi0JICogCi0JICogQHBhcmFtCXJvb3RDYXVzZQlUaGUgcm9vdCBjYXVzZSBvZiB0aGUgZXhjZXB0aW9uLgotCSAqLwotCXB1YmxpYyBQdWJsaXNoaW5nU2VydmljZUV4Y2VwdGlvbihUaHJvd2FibGUgcm9vdENhdXNlKSB7Ci0JCXRoaXMocm9vdENhdXNlLCByb290Q2F1c2UuZ2V0TWVzc2FnZSgpKTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBnaXZlbiB0aGUgZXJyb3IgbWVzc2FnZS4KLQkgKiAKLQkgKiBAcGFyYW0JZXJyb3JNc2cJVGhlIGVycm9yIG1lc3NhZ2UuCi0JICovCi0JcHVibGljIFB1Ymxpc2hpbmdTZXJ2aWNlRXhjZXB0aW9uKFN0cmluZyBlcnJvck1zZykgewotCQl0aGlzKG51bGwsIGVycm9yTXNnKTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBnaXZlbiB0aGUgcm9vdCBjYXVzZSBvZiB0aGUgZXhjZXB0aW9uIGFuZCB0aGUgZXJyb3IgbWVzc2FnZS4KLQkgKiAKLQkgKiBAcGFyYW0Jcm9vdENhdXNlCVRoZSByb290IGNhdXNlIG9mIHRoZSBleGNlcHRpb24uCi0JICogQHBhcmFtCWVycm9yTXNnCVRoZSBlcnJvciBtZXNzYWdlLgotCSAqLwotCXB1YmxpYyBQdWJsaXNoaW5nU2VydmljZUV4Y2VwdGlvbihUaHJvd2FibGUgcm9vdENhdXNlLCBTdHJpbmcgZXJyb3JNc2cpIHsKLQkJc3VwZXIoZXJyb3JNc2cpOwotCQl0aGlzLnJvb3RDYXVzZSA9IHJvb3RDYXVzZTsKLQkJdGhpcy5lcnJvck1zZyA9IGVycm9yTXNnOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByb290IGNhdXNlIG9mIHRoZSBleGNlcHRpb24uCi0JICogCi0JICogQHJldHVybglUaGUgcm9vdCBjYXVzZSBvZiB0aGUgZXhjZXB0aW9uLgotCSAqLwotCXB1YmxpYyBUaHJvd2FibGUgZ2V0Um9vdENhdXNlKCkgewotCQlyZXR1cm4gcm9vdENhdXNlOwotCX0KLQkKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvc2VydmljZXMvaW5kZXgvQW5jaG9yLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvc2VydmljZXMvaW5kZXgvQW5jaG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwYjY1OGIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3NlcnZpY2VzL2luZGV4L0FuY2hvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcuc2VydmljZXMuaW5kZXg7Ci0KLXB1YmxpYyBjbGFzcyBBbmNob3IKLXsKLSAgIHByaXZhdGUgU3RyaW5nIHRleHQ9bnVsbDsKLSAgIHByaXZhdGUgU3RyaW5nIGFuY2hvcj1udWxsOwotCi0gICBBbmNob3IoU3RyaW5nIHRleHQsIFN0cmluZyBhbmNob3IpCi0gICB7Ci0gICAgICB0aGlzLnRleHQgPSB0ZXh0OwotICAgICAgdGhpcy5hbmNob3IgPSBhbmNob3I7Ci0gICB9Ci0KLSAgIFN0cmluZyBnZXRBbmNob3IoKQotICAgewotICAgICAgcmV0dXJuIGFuY2hvcjsKLSAgIH0KLQotICAgU3RyaW5nIGdldFRleHQoKQotICAgewotICAgICAgcmV0dXJuIHRleHQ7Ci0gICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3NlcnZpY2VzL2luZGV4L0RlZi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3NlcnZpY2VzL2luZGV4L0RlZi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyN2Y0MjNjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy9zZXJ2aWNlcy9pbmRleC9EZWYuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5zZXJ2aWNlcy5pbmRleDsKLQotCi1wdWJsaWMgY2xhc3MgRGVmCi17Ci0KLSAgICAvLyBBcmd1bWVudCBwYXJhbWV0ZXIKLSAgICBzdGF0aWMgU3RyaW5nIEFyZ3VtZW50UHJlZml4ID0gIi0iOyAvLyROT04tTkxTLTEkCi0gICAgc3RhdGljIFN0cmluZyBQcmludFRlbXBGaWxlQXJnID0gRGVmLkFyZ3VtZW50UHJlZml4ICsgInRmIjsgLy8kTk9OLU5MUy0xJAotICAgIHN0YXRpYyBTdHJpbmcgUmVzcG9uc2VGaWxlQXJnID0gRGVmLkFyZ3VtZW50UHJlZml4ICsgInIiOyAvLyROT04tTkxTLTEkCi0gICAgc3RhdGljIFN0cmluZyBDaGFyYWN0ZXJTZXRBcmcgPSBEZWYuQXJndW1lbnRQcmVmaXggKyAiYyI7IC8vJE5PTi1OTFMtMSQKLSAgICBzdGF0aWMgU3RyaW5nIExhbmd1YWdlRmlsZUFyZyA9IERlZi5Bcmd1bWVudFByZWZpeCArICJsIjsgLy8kTk9OLU5MUy0xJAotICAgIHN0YXRpYyBTdHJpbmcgVHJpbUFyZyA9IERlZi5Bcmd1bWVudFByZWZpeCArICJ0IjsgLy8kTk9OLU5MUy0xJAotICAgIHN0YXRpYyBTdHJpbmcgVG9wRGlyQXJnID0gRGVmLkFyZ3VtZW50UHJlZml4ICsgImQiOyAvLyROT04tTkxTLTEkCi0gICAgc3RhdGljIFN0cmluZyBSZXN1bHRGaWxlQXJnID0gRGVmLkFyZ3VtZW50UHJlZml4ICsgInJmIjsgLy8kTk9OLU5MUy0xJAotICAgIHN0YXRpYyBTdHJpbmcgU2hvd1VzYWdlQXJnID0gRGVmLkFyZ3VtZW50UHJlZml4ICsgImgiOyAvLyROT04tTkxTLTEkCi0gICAgc3RhdGljIFN0cmluZyBGaWxlQXJnID0gRGVmLkFyZ3VtZW50UHJlZml4ICsgImYiOyAvLyROT04tTkxTLTEkCi0gICAgc3RhdGljIFN0cmluZyBQcmludERlYnVnQXJnID0gRGVmLkFyZ3VtZW50UHJlZml4ICsgImRlYnVnIjsgLy8kTk9OLU5MUy0xJAotICAgIC8vS2V5d29yZGluZGV4ZXJQYXJhbQotICAgIHN0YXRpYyBTdHJpbmcgSW5kZXhUaXRsZSA9ICJtYWludGl0bGUiOyAvLyROT04tTkxTLTEkCi0gICAgc3RhdGljIFN0cmluZyBTZWVBbHNvID0gInNlZWFsc28iOyAvLyROT04tTkxTLTEkCi0gICAgc3RhdGljIFN0cmluZyBTZWUgPSAic2VlIjsgLy8kTk9OLU5MUy0xJAotICAgIHN0YXRpYyBTdHJpbmcgRGVsaW1ldGVycyA9ICJkZWxpbWV0ZXJzIjsgLy8kTk9OLU5MUy0xJAotICAgIHN0YXRpYyBTdHJpbmcgQ2hhcmFjdGVyU2V0ID0gImNoYXJhY3RlcnNldCI7IC8vJE5PTi1OTFMtMSQKLSAgICBzdGF0aWMgU3RyaW5nIEtleVdvcmRQcmVmaXggPSAicHJlZml4IjsgLy8kTk9OLU5MUy0xJAotICAgIHN0YXRpYyBTdHJpbmcgS2V5V29yZExldmVsU2VwYXJhdG9yID0gImxldmVsc2VwYXJhdG9yIjsgLy8kTk9OLU5MUy0xJAotICAgIHN0YXRpYyBTdHJpbmcgRGVmYXVsdEtleVdvcmRQcmVmaXggPSAiWEVfIjsgLy8kTk9OLU5MUy0xJAotICAgIHN0YXRpYyBTdHJpbmcgRGVmYXVsdEtleVdvcmRMZXZlbFNlcGFyYXRvciA9ICJfXyI7IC8vJE5PTi1OTFMtMSQKLSAgICBzdGF0aWMgU3RyaW5nIExlYXZlRGlyID0gImxlYXZlRGlyIjsgLy8kTk9OLU5MUy0xJAotICAgIHN0YXRpYyBTdHJpbmcgU3RhcnREaXIgPSAic3RhcnREaXIiOyAvLyROT04tTkxTLTEkCi0gICAgc3RhdGljIFN0cmluZyBLZXlXb3JkRmlsZSA9ICJrZXl3b3JkZmlsZSI7IC8vJE5PTi1OTFMtMSQKLSAgICBzdGF0aWMgU3RyaW5nIE1haW5SZXN1bHRGaWxlID0gIm1haW5yZXN1bHRmaWxlIjsgLy8kTk9OLU5MUy0xJAotICAgIHN0YXRpYyBTdHJpbmcgSW5kZXhSZXN1bHRGaWxlID0gImluZGV4cmVzdWx0ZmlsZSI7IC8vJE5PTi1OTFMtMSQKLSAgICBzdGF0aWMgU3RyaW5nIEluZGV4SGVpZ2h0ID0gImluZGV4aGVpZ2h0IjsgLy8kTk9OLU5MUy0xJAotICAgIHN0YXRpYyBTdHJpbmcgS2V5V29yZFJlc3VsdEZpbGUgPSAia2V5d29yZHJlc3VsdGZpbGUiOyAvLyROT04tTkxTLTEkCi0gICAgc3RhdGljIFN0cmluZyBLZXlXb3JkVGFyZ2V0ID0gImtleXdvcmR0YXJnZXQiOyAvLyROT04tTkxTLTEkCi0gICAgc3RhdGljIFN0cmluZyBJbmRleFRhcmdldCA9ICJpbmRleHRhcmdldCI7IC8vJE5PTi1OTFMtMSQKLSAgICBzdGF0aWMgU3RyaW5nIE11bHRpRG9jS2V5V29yZCA9ICJtdWxpdGRvY3VtZW50a2V5d29yZCI7IC8vJE5PTi1OTFMtMSQKLSAgICBzdGF0aWMgU3RyaW5nIFNob3dEb2NUaXRsZSA9ICJzaG93ZG9jdW1lbnR0aXRsZSI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHN0YXRpYyBTdHJpbmcgSGVhZGVyRmlsZSA9ICJoZWFkZXJmaWxlIjsgLy8kTk9OLU5MUy0xJAotICAgIHN0YXRpYyBTdHJpbmcgRm9vdGVyRmlsZSA9ICJmb290ZXJmaWxlIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgLy9TaXRtYXAgcGFyYW1ldGVyCi0gICAgc3RhdGljIFN0cmluZyBUcnVuY2F0ZUxhYmVsID0gInRydW5jYXRlbGFiZWwiOyAvLyROT04tTkxTLTEkCi0gICAgc3RhdGljIFN0cmluZyBDb252ZXJ0QW1wZXJzYW5kID0gImNvbnZlcnRhbXBlcnNhbmQiOyAvLyROT04tTkxTLTEkCi0gICAgc3RhdGljIFN0cmluZyBUYWJsZVdpZHRoID0gInRhYmxld2lkdGgiOyAvLyROT04tTkxTLTEkCi0gICAgc3RhdGljIGludCBEZWZhdWx0Um93U3BhbiA9IDE7Ci0gICAgc3RhdGljIGludCBEZWZhdWx0Q29sU3BhbiA9IDE7Ci0gICAgc3RhdGljIFN0cmluZyBNb2RlID0gIm1vZGUiOyAvLyROT04tTkxTLTEkCi0gICAgc3RhdGljIFN0cmluZyBOb2RlU3RhcnQgPSAiPC0tIjsgLy8kTk9OLU5MUy0xJAotICAgIHN0YXRpYyBTdHJpbmcgTm9kZUVuZCA9ICItLT4iOyAvLyROT04tTkxTLTEkCi0gICAgc3RhdGljIFN0cmluZyBOb2RlVGV4dCA9ICJsYWJlbCI7IC8vJE5PTi1OTFMtMSQKLSAgICBzdGF0aWMgU3RyaW5nIE5vZGVMZXZlbCA9ICJsZXZlbCI7IC8vJE5PTi1OTFMtMSQKLSAgICBzdGF0aWMgU3RyaW5nIENvbHVtbldpZHRoID0gImNvbHdpZHRoIjsgLy8kTk9OLU5MUy0xJAotICAgIHN0YXRpYyBTdHJpbmcgQ29sdW1uID0gImNvbCI7IC8vJE5PTi1OTFMtMSQKLSAgICBzdGF0aWMgU3RyaW5nIFJvdyA9ICJyb3ciOyAvLyROT04tTkxTLTEkCi0gICAgc3RhdGljIFN0cmluZyBDb2xTcGFuID0gImNvbHNwYW4iOyAvLyROT04tTkxTLTEkCi0gICAgc3RhdGljIFN0cmluZyBSb3dTcGFuID0gInJvd3NwYW4iOyAvLyROT04tTkxTLTEkCi0gICAgc3RhdGljIFN0cmluZyBDZWxsQ29sb3IgPSAiY2VsbGNvbG9yIjsgLy8kTk9OLU5MUy0xJAotICAgIHN0YXRpYyBTdHJpbmcgTGlua3MgPSAibGlua3MiOyAvLyROT04tTkxTLTEkCi0gICAgc3RhdGljIFN0cmluZyBWaXNpdE9uY2UgPSAidmlzaXRvbmNlIjsgLy8kTk9OLU5MUy0xJAotICAgIHN0YXRpYyBTdHJpbmcgT25seVRoaXMgPSAib25seXRoaXMiOyAvLyROT04tTkxTLTEkCi0gICAgc3RhdGljIFN0cmluZyBUaXRsZUxlbmd0aCA9ICJ0aXRsZWxlbmd0aCI7IC8vJE5PTi1OTFMtMSQKLSAgICBzdGF0aWMgU3RyaW5nIERlZmF1bHRUaXRsZUxlbmd0aCA9ICJkZWZhdWx0dGl0bGVsZW5ndGgiOyAvLyROT04tTkxTLTEkCi0KLSAgICBzdGF0aWMgU3RyaW5nIFJlbW92ZURhdEZpbGUgPSAicmVtb3ZlZGF0ZmlsZSI7IC8vJE5PTi1OTFMtMSQKLSAgICBzdGF0aWMgU3RyaW5nIFN5bm9ueW1GaWxlID0gInN5bm9ueW1maWxlIjsgLy8kTk9OLU5MUy0xJAotICAgIHN0YXRpYyBTdHJpbmcgU3ViVHJlZSA9ICJpbmNsdWRlc3VidHJlZSI7IC8vJE5PTi1OTFMtMSQKLSAvLyAgIHN0YXRpYyBTdHJpbmcgRGF0VG9wID0gImRhdGF0b3AiOwotICAgIHN0YXRpYyBTdHJpbmcgUmVzRmlsZSA9ICJyZXN1bHRmaWxlIjsgLy8kTk9OLU5MUy0xJAotICAgIHN0YXRpYyBTdHJpbmcgUmVsUGF0aCA9ICJyZWxhdGl2ZXBhdGgiOyAvLyROT04tTkxTLTEkCi0gICAgc3RhdGljIFN0cmluZyBNYXhMZXZlbHMgPSAibWF4bGV2ZWxzIjsgLy8kTk9OLU5MUy0xJAotICAgIHN0YXRpYyBTdHJpbmcgTGV2ZWxTdHlsZSA9ICJsZXZlbHN0eWxlIjsgLy8kTk9OLU5MUy0xJAotICAgIHN0YXRpYyBTdHJpbmcgRGVmYXVsdFN0eWxlID0gImRlZmF1bHRzdHlsZSI7IC8vJE5PTi1OTFMtMSQKLSAgICBzdGF0aWMgU3RyaW5nIEhlYWRMaW5lU3R5bGUgPSAiaGVhZGxpbmVzdHlsZSI7IC8vJE5PTi1OTFMtMSQKLSAgICBzdGF0aWMgU3RyaW5nIExldmVsRm9udCA9ICJsZXZlbGZvbnQiOyAvLyROT04tTkxTLTEkCi0gICAgc3RhdGljIFN0cmluZyBEZWZhdWx0Rm9udCA9ICJkZWZhdWx0Zm9udCI7IC8vJE5PTi1OTFMtMSQKLSAgICBzdGF0aWMgU3RyaW5nIEhlYWRMaW5lRm9udCA9ICJoZWFkbGluZWZvbnQiOyAvLyROT04tTkxTLTEkCi0gICAgc3RhdGljIFN0cmluZyBCb2xkID0gImJvbGQiOyAvLyROT04tTkxTLTEkCi0gICAgc3RhdGljIFN0cmluZyBJdGFsaWMgPSAiaXRhbGljIjsgLy8kTk9OLU5MUy0xJAotICAgIHN0YXRpYyBTdHJpbmcgUGxhaW4gPSAicGxhaW4iOyAvLyROT04tTkxTLTEkCi0KLSAgICBzdGF0aWMgU3RyaW5nIE1heE9wZW5Ob2Rlc1BhcmFtID0gIm1heHZpc2libGVub2RlcyI7IC8vJE5PTi1OTFMtMSQKLSAgICBzdGF0aWMgaW50IERlZmF1bHRNYXhPcGVuTm9kZXMgPSAxMDA7Ci0gICAgc3RhdGljIFN0cmluZyBHYXJiYWdlQ29sbGVjdG9yUGFyYW0gPSAiZ2MiOyAvLyROT04tTkxTLTEkCi0gICAgc3RhdGljIFN0cmluZyBEZWZhdWx0R2FyYmFnZUNvbGxlY3RvciA9ICIxMCI7IC8vJE5PTi1OTFMtMSQKLSAgICBzdGF0aWMgU3RyaW5nIFZlcnRpY2FsSW5jcmVtZW50UGFyYW0gPSAidmVydGljYWxpbmNyZW1lbnQiOyAvLyROT04tTkxTLTEkCi0gICAgc3RhdGljIFN0cmluZyBIb3Jpem9udGFsSW5jcmVtZW50UGFyYW0gPSAiaG9yaXpvbnRhbGluY3JlbWVudCI7IC8vJE5PTi1OTFMtMSQKLSAgICBzdGF0aWMgU3RyaW5nIE1haWx0byA9ICJtYWlsdG86IjsgLy8kTk9OLU5MUy0xJAotICAgIHN0YXRpYyBTdHJpbmcgRGVidWdQYXJhbSA9ICJkZWJ1ZyI7IC8vJE5PTi1OTFMtMSQKLSAgICBzdGF0aWMgU3RyaW5nIFdXV1Jvb3RQYXJhbSA9ICJ3d3dyb290IjsgLy8kTk9OLU5MUy0xJAotICAgIHN0YXRpYyBTdHJpbmcgSW1hZ2VEaXIgPSAiaW1hZ2VzIjsgLy8kTk9OLU5MUy0xJAotICAgIHN0YXRpYyBTdHJpbmcgSW1hZ2VJY29uUGFyYW0gPSAiZnJhbWVpbWFnZSI7IC8vJE5PTi1OTFMtMSQKLSAgICBzdGF0aWMgU3RyaW5nIEJnSW1hZ2VQYXJhbSA9ICJiZ2ltYWdlIjsgLy8kTk9OLU5MUy0xJAotICAgIHN0YXRpYyBTdHJpbmcgVmlzaXRPbmNlTWFya0FsbFBhcmFtID0idmlzaXRvbmNlbWFya2FsbCI7IC8vJE5PTi1OTFMtMSQKLSAgICBzdGF0aWMgU3RyaW5nIFNoYWRvd1BhcmFtID0ibW91c2VvdmVyc2hhZG93IjsgLy8kTk9OLU5MUy0xJAotCi0gICAgc3RhdGljIFN0cmluZyBMb2FkaW5nVHJlZVBhcmFtID0gImxvYWRpbmdsYWJlbCI7IC8vJE5PTi1OTFMtMSQKLSAgICBzdGF0aWMgU3RyaW5nIExvYWRpbmdUcmVlQnJvd3NlciA9ICJUcmVlQnJvd3NlciBpcyBsb2FkaW5nOjoiOyAvLyROT04tTkxTLTEkCi0gICAgc3RhdGljIFN0cmluZyBMb2FkaW5nVHJlZSA9ICJMb2FkaW5nIHRyZWUuIFBsZWFzZSB3YWl0Li4uIjsgLy8kTk9OLU5MUy0xJAotICAgIHN0YXRpYyBTdHJpbmcgTG9hZGluZ1N1YlRyZWUgPSAiTG9hZGluZyBzdWIgdHJlZS4gUGxlYXNlIHdhaXQuLi4iOyAvLyROT04tTkxTLTEkCi0KLQotICAgIHN0YXRpYyBTdHJpbmcgQ2hhcmFjdGVyc2V0UGFyYW0gPSAiY2hhcmFjdGVyc2V0IjsgLy8kTk9OLU5MUy0xJAotICAgIHN0YXRpYyBTdHJpbmcgRGVsaW1QYXJhbSA9ICJkZWxpbWV0ZXJzIjsgLy8kTk9OLU5MUy0xJAotICAgIHN0YXRpYyBTdHJpbmcgTE9BRF9QQUdFID0gImxvYWRwYWdlIjsgLy8kTk9OLU5MUy0xJAotICAgIHN0YXRpYyBTdHJpbmcgRklOSVNIX1BBR0UgPSAiZmluaXNocGFnZSI7IC8vJE5PTi1OTFMtMSQKLSAgICBzdGF0aWMgU3RyaW5nIERhdGFGaWxlUGFyYW0gPSAiZGF0YWZpbGUiOyAvLyROT04tTkxTLTEkCi0gICAgc3RhdGljIFN0cmluZyBEYXRhRmlsZSA9ICJ0cmVlLmRhdCI7IC8vJE5PTi1OTFMtMSQKLSAgICBzdGF0aWMgU3RyaW5nIE5vbmUgPSAiIjsgLy8kTk9OLU5MUy0xJAotICAgIHN0YXRpYyBTdHJpbmcgSHR0cCA9ICJodHRwOi8vIjsgLy8kTk9OLU5MUy0xJAotICAgIHN0YXRpYyBTdHJpbmcgSHR0cHMgPSAiaHR0cHM6Ly8iOyAvLyROT04tTkxTLTEkCi0gICAgc3RhdGljIFN0cmluZyBGdHAgPSAiZnRwOi8vIjsgLy8kTk9OLU5MUy0xJAotICAgIHN0YXRpYyBTdHJpbmcgRmlsZSA9ICJmaWxlOi8iOyAvLyROT04tTkxTLTEkCi0gICAgc3RhdGljIFN0cmluZyBTbGFzaCA9ICIvIjsgLy8kTk9OLU5MUy0xJAotICAgIHN0YXRpYyBTdHJpbmcgU3BhY2UgPSAiICI7IC8vJE5PTi1OTFMtMSQKLSAgICBzdGF0aWMgU3RyaW5nIFppcEZpbGUgPSAiLnppcCI7IC8vJE5PTi1OTFMtMSQKLSAgICAvL0NvbG9yIHBhcmFtZXRlcnMKLSAgICBzdGF0aWMgU3RyaW5nIEJnQ29sb3JQYXJhbSA9ICJiZ2NvbG9yIjsgLy8kTk9OLU5MUy0xJAotICAgIHN0YXRpYyBTdHJpbmcgQmdDb2xvciA9ICIyNTUsMjU1LDI1NSI7IC8vJE5PTi1OTFMtMSQKLSAgICBzdGF0aWMgU3RyaW5nIEZnQ29sb3JQYXJhbSA9ICJmZ2NvbG9yIjsgLy8kTk9OLU5MUy0xJAotICAgIHN0YXRpYyBTdHJpbmcgRmdDb2xvciA9ICIwLDAsMCI7IC8vJE5PTi1OTFMtMSQKLSAgICBzdGF0aWMgU3RyaW5nIFNlbEJnQ29sb3JQYXJhbSA9ICJzZWxiZ2NvbG9yIjsgLy8kTk9OLU5MUy0xJAotICAgIHN0YXRpYyBTdHJpbmcgU2VsQmdDb2xvciA9ICIwLDAsMjU1IjsgLy8kTk9OLU5MUy0xJAotICAgIHN0YXRpYyBTdHJpbmcgU2VsRmdDb2xvclBhcmFtID0gInNlbGZnY29sb3IiOyAvLyROT04tTkxTLTEkCi0gICAgc3RhdGljIFN0cmluZyBTZWxGZ0NvbG9yID0gIjI1NSwyNTUsMjU1IjsgLy8kTk9OLU5MUy0xJAotICAgIHN0YXRpYyBTdHJpbmcgVmlzaXRDb2xvclBhcmFtID0gInZpc2l0Y29sb3IiOyAvLyROT04tTkxTLTEkCi0gICAgc3RhdGljIFN0cmluZyBWaXNpdENvbG9yID0gIjI1NSw1MSw1MSI7IC8vJE5PTi1OTFMtMSQKLSAgICBzdGF0aWMgU3RyaW5nIE1vdXNlT3ZlckNvbG9yUGFyYW0gPSAibW91c2VvdmVyY29sb3IiOyAvLyROT04tTkxTLTEkCi0gICAgc3RhdGljIFN0cmluZyBNb3VzZU92ZXJDb2xvciA9ICJibHVlIjsgLy8kTk9OLU5MUy0xJAotCi0KLSAgICAvL0ZyYW1lIHBhcmFtZXRlcnMKLSAgICBzdGF0aWMgU3RyaW5nIExhYmVsUG9zUGFyYW0gPSAibGFiZWxwb3MiOyAvLyROT04tTkxTLTEkCi0gICAgc3RhdGljIFN0cmluZyBMYWJlbFBvcyA9ICJiZWxvdyI7IC8vJE5PTi1OTFMtMSQKLSAgICBzdGF0aWMgU3RyaW5nIEZyYW1lVGl0bGVQYXJhbSA9ICJmcmFtZXRpdGxlIjsgLy8kTk9OLU5MUy0xJAotICAgIHN0YXRpYyBTdHJpbmcgRnJhbWVUaXRsZSA9ICJUcmVlIEJyb3dzZXIiOyAvLyROT04tTkxTLTEkCi0gICAgc3RhdGljIFN0cmluZyBGcmFtZVdpZHRoUGFyYW0gPSAiZnJhbWV3aWR0aCI7IC8vJE5PTi1OTFMtMSQKLSAgICBzdGF0aWMgU3RyaW5nIEZyYW1lSGVpZ2h0UGFyYW0gPSAiZnJhbWVoZWlnaHQiOyAvLyROT04tTkxTLTEkCi0gICAgc3RhdGljIFN0cmluZyBGcmFtZVdpZHRoID0gIjI1MCI7IC8vJE5PTi1OTFMtMSQKLSAgICBzdGF0aWMgU3RyaW5nIEZyYW1lSGVpZ2h0ID0gIjQwMCI7IC8vJE5PTi1OTFMtMSQKLSAgICBzdGF0aWMgU3RyaW5nIEZyYW1lUGFyYW0gPSAiZnJhbWUiOyAvLyROT04tTkxTLTEkCi0gICAgc3RhdGljIFN0cmluZyBEZWZhdWx0RnJhbWUgPSAiZmFsc2UiOyAvLyROT04tTkxTLTEkCi0gICAgc3RhdGljIFN0cmluZyBGYWxzZSA9ICJmYWxzZSI7IC8vJE5PTi1OTFMtMSQKLSAgICBzdGF0aWMgU3RyaW5nIFRydWUgPSAidHJ1ZSI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHN0YXRpYyBTdHJpbmcgTGFiZWxQYXJhbSA9ICJmcmFtZWxhYmVsIjsgLy8kTk9OLU5MUy0xJAotICAgIHN0YXRpYyBTdHJpbmcgRGVmYXVsdExhYmVsID0gIlRyZWUgQnJvd3NlciI7IC8vJE5PTi1OTFMtMSQKLSAgICBzdGF0aWMgU3RyaW5nIExhYmVsQmdDb2xvclBhcmFtPSAiZnJhbWVsYWJlbGJnY29sb3IiOyAvLyROT04tTkxTLTEkCi0gICAgc3RhdGljIFN0cmluZyBEZWZhdWx0TGFiZWxCZ0NvbG9yPSAiMjU1LDI1NSwyNTUiOyAvLyROT04tTkxTLTEkCi0gICAgc3RhdGljIFN0cmluZyBCb3JkZXJQYXJhbSA9ICJib3JkZXIiOyAvLyROT04tTkxTLTEkCi0gICAgc3RhdGljIFN0cmluZyBEZWZhdWx0Qm9yZGVyID0gImZhbHNlIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgLy9UcmVlIGNvbnN0YW50cwotICAgIHN0YXRpYyBTdHJpbmcgQ2VsbFNpemVQYXJhbSA9ICJjZWxsc2l6ZSI7IC8vJE5PTi1OTFMtMSQKLSAgICBzdGF0aWMgU3RyaW5nIERlZmF1bHRDZWxsU2l6ZSA9ICIxNiI7IC8vJE5PTi1OTFMtMSQKLSAgICBzdGF0aWMgaW50IEltYWdlSW5zZXQgPSAzOwotICAgIHN0YXRpYyBpbnQgVGV4dEluc2V0ID0gNjsKLSAgICBzdGF0aWMgaW50IFRleHRCYXNlTGluZSA9IDM7Ci0gICAgc3RhdGljIGludCBEb3VibGVDbGlja1Jlc29sdXRpb24gPSAzMzM7Ci0gICAgc3RhdGljIGludCBTY3JvbGxXaWR0aCA9IDE2OwotICAgIHN0YXRpYyBTdHJpbmcgU2Nyb2xsQmFyTGVmdFBhcmFtID0gInNjcm9sbGJhcnRvbGVmdCI7IC8vJE5PTi1OTFMtMSQKLQotCi0gICAgc3RhdGljIFN0cmluZyBEZWZhdWx0VGFyZ2V0UGFyYW0gPSAidGFyZ2V0IjsgLy8kTk9OLU5MUy0xJAotICAgIHN0YXRpYyBTdHJpbmcgRGVmYXVsdFRhcmdldCA9ICJfdG9wIjsgLy8kTk9OLU5MUy0xJAotICAgIHN0YXRpYyBTdHJpbmcgVHJlZUZvbnRQYXJhbSA9ICJ0cmVlZm9udCI7IC8vJE5PTi1OTFMtMSQKLSAgICBzdGF0aWMgU3RyaW5nIERlZmF1bHRUcmVlRm9udCA9ICJBcmlhbCxQTEFJTiwxMiI7IC8vJE5PTi1OTFMtMSQKLSAgICBzdGF0aWMgU3RyaW5nIExhYmVsRm9udFBhcmFtID0gImZyYW1lbGFiZWxmb250IjsgLy8kTk9OLU5MUy0xJAotICAgIHN0YXRpYyBTdHJpbmcgRGVmYXVsdExhYmVsRm9udCA9ICJBcmlhbCxCT0xELDEyIjsgLy8kTk9OLU5MUy0xJAotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy9zZXJ2aWNlcy9pbmRleC9EZWZpbml0aW9uT2JqZWN0LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvc2VydmljZXMvaW5kZXgvRGVmaW5pdGlvbk9iamVjdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ODc2ODRiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy9zZXJ2aWNlcy9pbmRleC9EZWZpbml0aW9uT2JqZWN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NzggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcuc2VydmljZXMuaW5kZXg7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbVdyaXRlcjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBjb20uaWJtLmljdS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotLy9PYmplY3QgaG9sZGluZyBkZWZpbml0aW9uZmlsZSBpbmZvcm1hdGlvbgotcHVibGljIGNsYXNzIERlZmluaXRpb25PYmplY3QKLXsKLSAgcHJpdmF0ZSBTdHJpbmcgaW5kZXh0aXRsZSA9ICJJbmRleCAtIEJhc2ljIFVuaWZpZWQgUHJvY2VzcyI7IC8vJE5PTi1OTFMtMSQKLSAgcHJpdmF0ZSBTdHJpbmcgc2VlID0gIiwgU2VlICI7IC8vJE5PTi1OTFMtMSQKLSAgcHJpdmF0ZSBTdHJpbmcgc2VlYWxzbyAgPSAiLCBTZWUgYWxzbyAiOyAvLyROT04tTkxTLTEkCi0gIHByaXZhdGUgU3RyaW5nIGNoYXJhY3RlcnNldCA9ICJ1dGYtOCI7IC8vJE5PTi1OTFMtMSQKLSAgU3RyaW5nIGtleVdvcmRTZXBhcmF0b3IgPSAifCI7IC8vJE5PTi1OTFMtMSQKLSAgU3RyaW5nIGxldmVsU2VwYXJhdG9yUmVwbGFjZSA9ICI6IjsgLy8kTk9OLU5MUy0xJAotICBTdHJpbmcgd3d3Um9vdCA9IG51bGw7Ci0gIGludCBzdGlwTGVuZ3RoPTA7Ci0gIFN0cmluZyByZWxhdGl2ZXBhdGggPSBudWxsOwotICBTdHJpbmcgdGFyZ2V0PW51bGw7Ci0gIFN0cmluZyBzcGVjS2V5V29yZEZpbGU9bnVsbDsKLSAgU3RyaW5nIG1haW5SZXN1bHRGaWxlPW51bGw7Ci0gIFN0cmluZyBpbmRleFJlc3VsdEZpbGU9bnVsbDsKLSAgU3RyaW5nIGluZGV4VGFyZ2V0PW51bGw7Ci0gIFN0cmluZyBpbmRleEhlaWdodD1udWxsOwotICBTdHJpbmcga2V5d29yZFRhcmdldD1udWxsOwotICBTdHJpbmcga2V5d29yZFJlc3VsdEZpbGU9bnVsbDsKLSAgU3RyaW5nIGhlYWRlckZpbGU9bnVsbDsKLSAgU3RyaW5nIGZvb3RlckZpbGU9bnVsbDsKLSAgU3RyaW5nIGtleVdvcmRQcmVmaXg9RGVmLkRlZmF1bHRLZXlXb3JkUHJlZml4OwotICBTdHJpbmcga2V5V29yZExldmVsU2VwYXJhdG9yPURlZi5EZWZhdWx0S2V5V29yZExldmVsU2VwYXJhdG9yOwotCi0gIGJvb2xlYW4gbXVsdGlkb2N1bWVudGtleXdvcmQ9ZmFsc2U7Ci0gIGJvb2xlYW4gc2hvd2RvY3VtZW50dGl0bGU9ZmFsc2U7Ci0gIFZlY3RvciBzdG9wRGlyc1Y9bnVsbDsKLSAgIEhhc2h0YWJsZSBmb250RGVmaW5pdGlvbnM9bnVsbDsKLSAgSGFzaHRhYmxlIHN0eWxlRGVmaW5pdGlvbnM9bnVsbDsKLQotICBwcml2YXRlIEZpbGUgZGVmRmlsZVJvb3Q7Ci0KLSAgLy9Db25zdHJ1Y3RvciB0aGF0IHBhcnNlcyB0aGUgZGVmaW5pdGlvbmZpbGUKLSAgRGVmaW5pdGlvbk9iamVjdChTdHJpbmcgcHViRGlyLCBTdHJpbmcgZGVmZmlsZSwgU3RyaW5nIGNoYXJTZXQpCi0gIHsKLQkgIHNldHd3d1Jvb3QocHViRGlyKTsKLQkgIGRlZkZpbGVSb290ID0gbmV3IEZpbGUoZGVmZmlsZSkuZ2V0UGFyZW50RmlsZSgpOwotCi0gICAgIC8vIFJlYWQgdGhlIGRlZmluaXRpb24gZmlsZSBhbmQgc3BsaXQgdGhlIGRlZmZpbGUgaW50byBpdCdzIGluZGl2aWR1YWwgbGluZXMuCi0JU3RyaW5nIGluZmlsZSA9IE1pc2NTdGF0aWMubG9hZEZpbGUoZGVmZmlsZSxjaGFyU2V0KTsKLSAgICBTdHJpbmdUb2tlbml6ZXIgcGFyc2VyID0gbmV3IFN0cmluZ1Rva2VuaXplcihpbmZpbGUsICJcdFxuIik7IC8vJE5PTi1OTFMtMSQKLQotICAgICBzdG9wRGlyc1YgPSBuZXcgVmVjdG9yKCk7Ci0gICAgIGZvbnREZWZpbml0aW9ucyA9IG5ldyBIYXNodGFibGUoMTApOwotICAgICBzdHlsZURlZmluaXRpb25zID0gbmV3IEhhc2h0YWJsZSgxMCk7Ci0gICAgIHdoaWxlKHBhcnNlci5oYXNNb3JlVG9rZW5zKCkpCi0gICAgIHsKLSAgICAgICAgU3RyaW5nIHBhcmFtID0gcGFyc2VyLm5leHRUb2tlbigpLnRyaW0oKTsKLQotICAgICAgICBpZihwYXJhbS5lcXVhbHNJZ25vcmVDYXNlKERlZi5MZXZlbEZvbnQpKQotICAgICAgICB7Ci0gICAgICAgICAgIGFzaWduRm9udChwYXJzZXIpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYocGFyYW0uZXF1YWxzSWdub3JlQ2FzZShEZWYuTGV2ZWxTdHlsZSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgYXNpZ25TdHlsZShwYXJzZXIpOwotICAgICAgICB9ICAgICAgCi0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSBwYXJzZXIubmV4dFRva2VuKCkudHJpbSgpOwotICAgICAgICAgICBpZih2YWx1ZT09bnVsbCkKLSAgICAgICAgICAgewotICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiRGVmaW5pdGlvbk9iamVjdDphZGRWYWx1ZVxuIiArIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgICBIZWxwTWVzc2FnZXMuUEFSQU1FVEVSX01JU1NJTkdfVkFMVUUgKyBwYXJhbSk7Ci0gICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICB9Ci0gICAgICAgICAgIGFzaWduVmFsdWUocGFyYW0sIHZhbHVlKTsKLSAgICAgICAgfQotICAgICB9Ci0KLSAgfQotCi0gIC8vQ2hlY2sgaWYgZW5vdWdoIGlucHV0IGlzIHJlYWQKLSAgYm9vbGVhbiBlbm91Z2hJbnB1dCgpCi0gIHsKLSAgICAgYm9vbGVhbiBlbm91Z2g9dHJ1ZTsKLSAgICAgU3RyaW5nQnVmZmVyIGJ1ZmYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgIGJ1ZmYuYXBwZW5kKCJcbiIpOyAvLyROT04tTkxTLTEkCi0gICAgIGlmKHd3d1Jvb3Q9PW51bGwpCi0gICAgIHsKLSAgICAgICAgYnVmZi5hcHBlbmQoSGVscE1lc3NhZ2VzLlBBUkFNRVRFUl9NSVNTSU5HICsgRGVmLldXV1Jvb3RQYXJhbSk7Ci0gICAgICAgIGVub3VnaD1mYWxzZTsKLSAgICAgfQotCi0gICAgIGlmKGtleXdvcmRSZXN1bHRGaWxlPT1udWxsKQotICAgICB7Ci0gICAgICAgIGJ1ZmYuYXBwZW5kKEhlbHBNZXNzYWdlcy5QQVJBTUVURVJfTUlTU0lORyArIERlZi5LZXlXb3JkUmVzdWx0RmlsZSk7Ci0gICAgICAgIGVub3VnaD1mYWxzZTsKLSAgICAgfQotCi0gICAgIGlmKGluZGV4UmVzdWx0RmlsZSE9bnVsbCAmJiBtYWluUmVzdWx0RmlsZT09bnVsbCkKLSAgICAgewotICAgICAgICBidWZmLmFwcGVuZChIZWxwTWVzc2FnZXMuUEFSQU1FVEVSX01JU1NJTkcgKyBEZWYuTWFpblJlc3VsdEZpbGUpOwotICAgICAgICBlbm91Z2g9ZmFsc2U7Ci0gICAgIH0KLQotICAgICBpZihpbmRleFJlc3VsdEZpbGUhPW51bGwgJiYgaW5kZXhUYXJnZXQ9PW51bGwpCi0gICAgIHsKLSAgICAgICAgYnVmZi5hcHBlbmQoSGVscE1lc3NhZ2VzLlBBUkFNRVRFUl9NSVNTSU5HICsgRGVmLkluZGV4VGFyZ2V0KTsKLSAgICAgICAgZW5vdWdoPWZhbHNlOwotICAgICB9Ci0KLSAgICAgaWYoaW5kZXhSZXN1bHRGaWxlIT1udWxsICYmIGtleXdvcmRUYXJnZXQ9PW51bGwpCi0gICAgIHsKLSAgICAgICAgYnVmZi5hcHBlbmQoSGVscE1lc3NhZ2VzLlBBUkFNRVRFUl9NSVNTSU5HICsgRGVmLktleVdvcmRUYXJnZXQpOwotICAgICAgICBlbm91Z2g9ZmFsc2U7Ci0gICAgIH0KLQotICAgICBpZihpbmRleFJlc3VsdEZpbGUhPW51bGwgJiYgaW5kZXhIZWlnaHQ9PW51bGwpCi0gICAgIHsKLSAgICAgICAgYnVmZi5hcHBlbmQoSGVscE1lc3NhZ2VzLlBBUkFNRVRFUl9NSVNTSU5HICsgRGVmLkluZGV4SGVpZ2h0KTsKLSAgICAgICAgZW5vdWdoPWZhbHNlOwotICAgICB9Ci0KLSAgICAgaWYocmVsYXRpdmVwYXRoPT1udWxsKQotICAgICB7Ci0gICAgICAgIGJ1ZmYuYXBwZW5kKEhlbHBNZXNzYWdlcy5QQVJBTUVURVJfTUlTU0lORyArIERlZi5SZWxQYXRoKTsKLSAgICAgICAgZW5vdWdoPWZhbHNlOwotICAgICB9Ci0KLSAgICAgaWYoaGVhZGVyRmlsZT09bnVsbCkKLSAgICAgewotICAgICAgICBidWZmLmFwcGVuZChIZWxwTWVzc2FnZXMuUEFSQU1FVEVSX01JU1NJTkcgKyBEZWYuSGVhZGVyRmlsZSk7Ci0gICAgICAgIGVub3VnaD1mYWxzZTsKLSAgICAgfQotCi0gICAgIGlmKGZvb3RlckZpbGU9PW51bGwpCi0gICAgIHsKLSAgICAgICAgYnVmZi5hcHBlbmQoSGVscE1lc3NhZ2VzLlBBUkFNRVRFUl9NSVNTSU5HICsgRGVmLkZvb3RlckZpbGUpOwotICAgICAgICBlbm91Z2g9ZmFsc2U7Ci0gICAgIH0KLQotICAgICBGb250T2JqZWN0IGYgPSAoRm9udE9iamVjdClmb250RGVmaW5pdGlvbnMuZ2V0KERlZi5EZWZhdWx0Rm9udCk7Ci0gICAgIEZvbnRPYmplY3QgZnMgPSAoRm9udE9iamVjdClzdHlsZURlZmluaXRpb25zLmdldChEZWYuRGVmYXVsdFN0eWxlKTsKLSAgICAgaWYoZj09bnVsbCAmJiBmcz09bnVsbCkKLSAgICAgewotICAgICAgICBidWZmLmFwcGVuZChIZWxwTWVzc2FnZXMuRk9OVF9BTkRfU1RZTEVfTUlTU0lORyArIERlZi5EZWZhdWx0Rm9udCArICIgIiArIERlZi5EZWZhdWx0U3R5bGUpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIGVub3VnaD1mYWxzZTsKLSAgICAgfQotICAgICBpZighZW5vdWdoKQotICAgICB7Ci0gICAgICAgIGJ1ZmYuYXBwZW5kKCJcbiIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbihidWZmKTsKLSAgICAgfQotICAgICByZXR1cm4gZW5vdWdoOwotICB9Ci0KLQotICAvL0FzaWducyB2YWx1ZXMgdG8gdGhlIGRpZmZlcmVudCBhdHRyaWJ1dGVzCi0gIHByaXZhdGUgdm9pZCBhc2lnblZhbHVlKFN0cmluZyBwYXJhbSwgU3RyaW5nIHZhbHVlKQotICB7Ci0KLSAgICBpZihwYXJhbS5lcXVhbHNJZ25vcmVDYXNlKERlZi5NYWluUmVzdWx0RmlsZSkpCi0gICAgewotICAgICAgIG1haW5SZXN1bHRGaWxlID0gdmFsdWU7Ci0gICAgfQotICAgIGVsc2UgaWYocGFyYW0uZXF1YWxzSWdub3JlQ2FzZShEZWYuQ2hhcmFjdGVyU2V0KSkKLSAgICB7Ci0gICAgICAgY2hhcmFjdGVyc2V0ID0gdmFsdWU7Ci0gICAgfQotICAgIGVsc2UgaWYocGFyYW0uZXF1YWxzSWdub3JlQ2FzZShEZWYuU2VlKSkKLSAgICB7Ci0gICAgICAgc2VlID0gdmFsdWU7Ci0gICAgfQotICAgIGVsc2UgaWYocGFyYW0uZXF1YWxzSWdub3JlQ2FzZShEZWYuU2VlQWxzbykpCi0gICAgewotICAgICAgIHNlZWFsc28gPSB2YWx1ZTsKLSAgICB9Ci0gICAgZWxzZSBpZihwYXJhbS5lcXVhbHNJZ25vcmVDYXNlKERlZi5JbmRleFJlc3VsdEZpbGUpKQotICAgIHsKLSAgICAgICBpbmRleFJlc3VsdEZpbGUgPSB2YWx1ZTsKLSAgICB9Ci0gICAgZWxzZSBpZihwYXJhbS5lcXVhbHNJZ25vcmVDYXNlKERlZi5LZXlXb3JkUmVzdWx0RmlsZSkpCi0gICAgewotICAgICAgIGtleXdvcmRSZXN1bHRGaWxlID0gdmFsdWU7Ci0gICAgfQotICAgIGVsc2UgaWYocGFyYW0uZXF1YWxzSWdub3JlQ2FzZShEZWYuSGVhZGVyRmlsZSkpCi0gICAgewotICAgICAgIGhlYWRlckZpbGUgPSBuZXcgRmlsZShkZWZGaWxlUm9vdCwgdmFsdWUpLmdldEFic29sdXRlUGF0aCgpOzsKLSAgICB9Ci0gICAgZWxzZSBpZihwYXJhbS5lcXVhbHNJZ25vcmVDYXNlKERlZi5Gb290ZXJGaWxlKSkKLSAgICB7Ci0gICAgICAgZm9vdGVyRmlsZSA9IG5ldyBGaWxlKGRlZkZpbGVSb290LCB2YWx1ZSkuZ2V0QWJzb2x1dGVQYXRoKCk7OwotICAgIH0KLSAgICBlbHNlIGlmKHBhcmFtLmVxdWFsc0lnbm9yZUNhc2UoRGVmLlJlbFBhdGgpKQotICAgIHsKLSAgICAgICByZWxhdGl2ZXBhdGggPSB2YWx1ZTsKLSAgICB9Ci0gICAgZWxzZSBpZihwYXJhbS5lcXVhbHNJZ25vcmVDYXNlKERlZi5EZWZhdWx0VGFyZ2V0UGFyYW0pKQotICAgIHsKLSAgICAgICB0YXJnZXQgPSB2YWx1ZTsKLSAgICB9Ci0gICAgZWxzZSBpZihwYXJhbS5lcXVhbHNJZ25vcmVDYXNlKERlZi5LZXlXb3JkRmlsZSkpCi0gICAgewotICAgICAgIHNwZWNLZXlXb3JkRmlsZSA9IG5ldyBGaWxlKGRlZkZpbGVSb290LCB2YWx1ZSkuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0gICAgfQotICAgIGVsc2UgaWYocGFyYW0uZXF1YWxzSWdub3JlQ2FzZShEZWYuSW5kZXhUaXRsZSkpCi0gICAgewotICAgICAgIGluZGV4dGl0bGUgPSB2YWx1ZTsKLSAgICB9Ci0gICAgZWxzZSBpZihwYXJhbS5lcXVhbHNJZ25vcmVDYXNlKERlZi5LZXlXb3JkVGFyZ2V0KSkKLSAgICB7Ci0gICAgICAga2V5d29yZFRhcmdldCA9IHZhbHVlOwotICAgIH0KLSAgICBlbHNlIGlmKHBhcmFtLmVxdWFsc0lnbm9yZUNhc2UoRGVmLkluZGV4VGFyZ2V0KSkKLSAgICB7Ci0gICAgICAgaW5kZXhUYXJnZXQgPSB2YWx1ZTsKLSAgICB9Ci0gICAgZWxzZSBpZihwYXJhbS5lcXVhbHNJZ25vcmVDYXNlKERlZi5JbmRleEhlaWdodCkpCi0gICAgewotICAgICAgIGluZGV4SGVpZ2h0ID0gdmFsdWU7Ci0gICAgfQotICAgIGVsc2UgaWYocGFyYW0uZXF1YWxzSWdub3JlQ2FzZShEZWYuTXVsdGlEb2NLZXlXb3JkKSkKLSAgICB7Ci0gICAgICAgbXVsdGlkb2N1bWVudGtleXdvcmQgPSB2YWx1ZS5lcXVhbHNJZ25vcmVDYXNlKERlZi5UcnVlKTsKLSAgICB9Ci0gICAgZWxzZSBpZihwYXJhbS5lcXVhbHNJZ25vcmVDYXNlKERlZi5TaG93RG9jVGl0bGUpKQotICAgIHsKLSAgICAgICBzaG93ZG9jdW1lbnR0aXRsZSA9IHZhbHVlLmVxdWFsc0lnbm9yZUNhc2UoRGVmLlRydWUpOwotICAgIH0KLSAgICBlbHNlIGlmKHBhcmFtLmVxdWFsc0lnbm9yZUNhc2UoRGVmLkxlYXZlRGlyKSkKLSAgICB7Ci0gICAgICAgc3RvcERpcnNWLmFkZEVsZW1lbnQodmFsdWUpOwotICAgIH0KLSAgICAgIGVsc2UgaWYocGFyYW0uZXF1YWxzSWdub3JlQ2FzZShEZWYuS2V5V29yZFByZWZpeCkpCi0gICAgewotICAgICAgIGtleVdvcmRQcmVmaXggPSB2YWx1ZTsKLSAgICB9Ci0gICAgZWxzZSBpZihwYXJhbS5lcXVhbHNJZ25vcmVDYXNlKERlZi5LZXlXb3JkTGV2ZWxTZXBhcmF0b3IpKQotICAgIHsKLSAgICAgICBrZXlXb3JkTGV2ZWxTZXBhcmF0b3IgPSB2YWx1ZTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLQotICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbihIZWxwTWVzc2FnZXMuSU5WQUxJRF9QQVJBTUVURVJfTkFNRSArIHBhcmFtKTsKLSAgICB9Ci0KLSAgfQotCi0gIC8vUGFyc2VzIGEgZm9udGRlZmluaXRpb24KLSAgcHJpdmF0ZSB2b2lkIGFzaWduRm9udChTdHJpbmdUb2tlbml6ZXIgcGFyc2VyKQotICB7Ci0gICAgU3RyaW5nIHN0cmluZ0xldmVsID0gcGFyc2VyLm5leHRUb2tlbigpLnRyaW0oKTsKLSAgICBPYmplY3Qga2V5ID0gc3RyaW5nTGV2ZWw7Ci0gICAgaWYoIXN0cmluZ0xldmVsLmVxdWFsc0lnbm9yZUNhc2UoRGVmLkRlZmF1bHRGb250KSAmJiAhc3RyaW5nTGV2ZWwuZXF1YWxzSWdub3JlQ2FzZShEZWYuSGVhZExpbmVGb250KSkKLSAgICB7Ci0gICAgICAga2V5ID0gIG5ldyBJbnRlZ2VyKHN0cmluZ0xldmVsKTsKLSAgICB9Ci0gICAgU3RyaW5nIG5hbWUgPSBwYXJzZXIubmV4dFRva2VuKCkudHJpbSgpOwotICAgIFN0cmluZyBzdHlsZSA9IHBhcnNlci5uZXh0VG9rZW4oKS50cmltKCk7Ci0gICAgU3RyaW5nIHNpemUgPSBwYXJzZXIubmV4dFRva2VuKCkudHJpbSgpOwotCi0gICAgZm9udERlZmluaXRpb25zLnB1dChrZXksbmV3IEZvbnRPYmplY3QobmFtZSwgc3R5bGUsIHNpemUpKTsKLSAgfQotCi0gIC8vUGFyc2VzIGEgc3R5bGVkZWZpbml0aW9uCi0gIHByaXZhdGUgdm9pZCBhc2lnblN0eWxlKFN0cmluZ1Rva2VuaXplciBwYXJzZXIpCi0gIHsKLSAgICBTdHJpbmcgc3RyaW5nTGV2ZWwgPSBwYXJzZXIubmV4dFRva2VuKCkudHJpbSgpOwotICAgIE9iamVjdCBrZXkgPSBzdHJpbmdMZXZlbDsKLSAgICBpZighc3RyaW5nTGV2ZWwuZXF1YWxzSWdub3JlQ2FzZShEZWYuRGVmYXVsdFN0eWxlKSAmJiAhc3RyaW5nTGV2ZWwuZXF1YWxzSWdub3JlQ2FzZShEZWYuSGVhZExpbmVTdHlsZSkpCi0gICAgewotICAgICAgIGtleSA9ICBuZXcgSW50ZWdlcihzdHJpbmdMZXZlbCk7Ci0gICAgfQotCi0gICAgU3RyaW5nIHN0eWxlID0gcGFyc2VyLm5leHRUb2tlbigpLnRyaW0oKTsKLSAgICBzdHlsZURlZmluaXRpb25zLnB1dChrZXksbmV3IEZvbnRPYmplY3Qoc3R5bGUpKTsKLSAgfQotICAKLSAgLy9DaGVjayBpZiB0aGUgcmVhY2hlZCBkaXJlY3RvcnkgaXMgd2hpdGhpbiB0aGUgc3RvcGRpcmxpc3QKLSAgICBib29sZWFuIGlzSW5TdG9wZGlyKFN0cmluZyBzdHIpCi0gICB7Ci0gICAgICBmb3IoaW50IGk9MDtpPHN0b3BEaXJzVi5zaXplKCk7aSsrKQotICAgICAgewotICAgICAgICAgU3RyaW5nIHRtcFN0ciA9IChTdHJpbmcpIHN0b3BEaXJzVi5lbGVtZW50QXQoaSk7Ci0gICAgICAgICBpZihzdHIuc3Vic3RyaW5nKEtleVdvcmRJbmRleEhlbHBlci5kZWZPYmouZ2V0V3d3Um9vdCgpLmxlbmd0aCgpKzEpLmNvbXBhcmVUbyh0bXBTdHIpPT0wKQotICAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICB9Ci0gICAgICB9Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICAvL0FjY2Vzc21ldGhvZHMKLSAgU3RyaW5nIGdldEluZGV4VGl0bGUoKQotICB7Ci0gICAgcmV0dXJuIGluZGV4dGl0bGU7Ci0gIH0KLQotICBTdHJpbmcgZ2V0U2VlKCkKLSAgewotICAgIHJldHVybiBzZWU7Ci0gIH0KLQotICBTdHJpbmcgZ2V0U2VlQWxzbygpCi0gIHsKLSAgICByZXR1cm4gc2VlYWxzbzsKLSAgfQotCi0gIFN0cmluZyBnZXRDaGFyYWN0ZXJTZXQoKQotICB7Ci0gICAgcmV0dXJuIGNoYXJhY3RlcnNldDsKLSAgfQotICBib29sZWFuIGdldE11bGl0RG9jdW1lbnRLZXl3b3JkKCkKLSAgewotICAgIHJldHVybiBtdWx0aWRvY3VtZW50a2V5d29yZDsKLSAgfQotCi0gIGJvb2xlYW4gZ2V0U2hvd0RvY3VtZW50VGl0bGUoKQotICB7Ci0gICAgcmV0dXJuIHNob3dkb2N1bWVudHRpdGxlOwotICB9Ci0KLSAgU3RyaW5nIGdldEtleVdvcmRUYXJnZXQoKQotICB7Ci0gICAgcmV0dXJuIGtleXdvcmRUYXJnZXQ7Ci0gIH0KLQotICBTdHJpbmcgZ2V0SW5kZXhUYXJnZXQoKQotICB7Ci0gICAgcmV0dXJuIGluZGV4VGFyZ2V0OwotICB9Ci0KLSAgU3RyaW5nIGdldEluZGV4SGVpZ2h0KCkKLSAgewotICAgIHJldHVybiBpbmRleEhlaWdodDsKLSAgfQotCi0gIFN0cmluZyBnZXRXd3dSb290KCkKLSAgewotICAgIHJldHVybiB3d3dSb290OwotICB9Ci0KLSAgaW50IGdldFd3d1Jvb3RMZW5ndGgoKQotICB7Ci0gICAgcmV0dXJuIHN0aXBMZW5ndGg7Ci0gIH0KLQotICBTdHJpbmcgZ2V0VGFyZ2V0KCkKLSAgewotICAgIHJldHVybiB0YXJnZXQ7Ci0gIH0KLQotICBTdHJpbmcgZ2V0S2V5V29yZEZpbGUoKQotICB7Ci0gICAgcmV0dXJuIHNwZWNLZXlXb3JkRmlsZTsKLSAgfQotCi0gIFN0cmluZyBnZXRNYWluUmVzdWx0RmlsZSgpCi0gIHsKLSAgICByZXR1cm4gbWFpblJlc3VsdEZpbGU7Ci0gIH0KLQotICBTdHJpbmcgZ2V0SW5kZXhSZXN1bHRGaWxlKCkKLSAgewotICAgIHJldHVybiBpbmRleFJlc3VsdEZpbGU7Ci0gIH0KLQotICBTdHJpbmcgZ2V0S2V5d29yZFJlc3VsdEZpbGUoKQotICB7Ci0gICAgcmV0dXJuIGtleXdvcmRSZXN1bHRGaWxlOwotICB9Ci0KLQotICBTdHJpbmcgZ2V0UmVsYXRpdmVQYXRoKCkKLSAgewotICAgIHJldHVybiByZWxhdGl2ZXBhdGg7Ci0gIH0KLQotICBTdHJpbmcgZ2V0SGVhZGVyRmlsZSgpCi0gIHsKLSAgICByZXR1cm4gaGVhZGVyRmlsZTsKLSAgfQotCi0gICBTdHJpbmcgZ2V0Rm9vdGVyRmlsZSgpCi0gIHsKLSAgICByZXR1cm4gZm9vdGVyRmlsZTsKLSAgfQotCi0gU3RyaW5nIGdldEtleVdvcmRQcmVmaXgoKQotIHsKLSAgIHJldHVybiBrZXlXb3JkUHJlZml4OwotIH0KLQotIFN0cmluZyBnZXRLZXlXb3JkTGV2ZWxTZXBhcmF0b3IoKQotIHsKLSAgIHJldHVybiBrZXlXb3JkTGV2ZWxTZXBhcmF0b3I7Ci0gfQotCi0gRm9udE9iamVjdCBnZXRGb250KGludCBsZXZlbCkKLSAgewotICAgICBGb250T2JqZWN0IGYgPSAoRm9udE9iamVjdClmb250RGVmaW5pdGlvbnMuZ2V0KG5ldyBJbnRlZ2VyKGxldmVsKSk7Ci0gICAgIGlmKGY9PW51bGwpCi0gICAgIHsKLSAgICAgICAgZiA9IChGb250T2JqZWN0KWZvbnREZWZpbml0aW9ucy5nZXQoRGVmLkRlZmF1bHRGb250KTsKLSAgICAgfQotICAgICByZXR1cm4gZjsKLSAgfQotCi0gIEZvbnRPYmplY3QgZ2V0Rm9udChPYmplY3Qga2V5KQotICB7Ci0gICAgIHJldHVybiAoRm9udE9iamVjdClmb250RGVmaW5pdGlvbnMuZ2V0KGtleSk7Ci0KLSAgfQotCi0gIEZvbnRPYmplY3QgZ2V0U3R5bGVTaGVldChpbnQgbGV2ZWwpCi0gIHsKLSAgICAgRm9udE9iamVjdCBmID0gKEZvbnRPYmplY3Qpc3R5bGVEZWZpbml0aW9ucy5nZXQobmV3IEludGVnZXIobGV2ZWwpKTsKLSAgICAgaWYoZj09bnVsbCkKLSAgICAgewotICAgICAgICBmID0gKEZvbnRPYmplY3Qpc3R5bGVEZWZpbml0aW9ucy5nZXQoRGVmLkRlZmF1bHRTdHlsZSk7Ci0gICAgIH0KLSAgICAgcmV0dXJuIGY7Ci0gIH0KLQotICBGb250T2JqZWN0IGdldFN0eWxlU2hlZXQoT2JqZWN0IGtleSkKLSAgewotICAgIHJldHVybiAoRm9udE9iamVjdClzdHlsZURlZmluaXRpb25zLmdldChrZXkpOwotICB9Ci0KLSAgdm9pZCBwcmludFN0YXJ0KE91dHB1dFN0cmVhbVdyaXRlciBvdXRQLGludCBsZXZlbCkKLSAgewotICAgIGlmKGdldFN0eWxlU2hlZXQoRGVmLkRlZmF1bHRTdHlsZSk9PW51bGwpCi0gICAgewotICAgICAgRm9udE9iamVjdCBmID0gZ2V0Rm9udChsZXZlbCk7Ci0gICAgICBpZihmPT1udWxsKQotICAgICAgewotICAgICAgICBmID0gZ2V0Rm9udChEZWYuRGVmYXVsdEZvbnQpOwotICAgICAgfQotICAgICAgcHJpbnRTdGFydChvdXRQLCBmKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgRm9udE9iamVjdCBmID0gZ2V0U3R5bGVTaGVldChsZXZlbCk7Ci0gICAgICAgIGlmKGY9PW51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgZiA9IGdldFN0eWxlU2hlZXQoRGVmLkRlZmF1bHRTdHlsZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcHJpbnRTdGFydChvdXRQLCBmKTsKLSAgICB9Ci0gIH0KLSAgdm9pZCBwcmludFN0YXJ0KE91dHB1dFN0cmVhbVdyaXRlciBvdXRQLEZvbnRPYmplY3QgZikKLSAgewotCi0gICAgaWYob3V0UD09bnVsbCkKLSAgICB7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRGVmaW5pdGlvbk9iamVjdDpwcmludFN0YXJ0XG4iICsgSGVscE1lc3NhZ2VzLkJBRF9PVVRQVVRfU1RSRUFNKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0KLSAgICBpZihmIT1udWxsICYmIGYuZ2V0U3R5bGVTaGVldCgpPT1udWxsKQotICAgIHsKLSAgICAgIE1pc2NTdGF0aWMucHJpbnQob3V0UCwiPEZPTlQgRkFDRT1cIiIgKyBmLmdldE5hbWUoKSArICJcIiBTSVpFPVwiIiArIGYuZ2V0U2l6ZSgpICsgIlwiID5cbiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotICAgICAgaWYoZi5pc0l0YWxpYygpKQotICAgICAgewotICAgICAgICBNaXNjU3RhdGljLnByaW50KG91dFAsIjxJPiIpOyAvLyROT04tTkxTLTEkCi0gICAgICB9Ci0KLSAgICAgIGlmKGYuaXNCb2xkKCkpCi0gICAgICB7Ci0gICAgICAgIE1pc2NTdGF0aWMucHJpbnQob3V0UCwiPEI+Iik7IC8vJE5PTi1OTFMtMSQKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgTWlzY1N0YXRpYy5wcmludChvdXRQLCAiPFAgQ0xBU1M9XCIiICsgZi5nZXRTdHlsZVNoZWV0KCkgKyAiXCI+XG4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgfQotICB9Ci0KLSAgdm9pZCBwcmludEVuZChPdXRwdXRTdHJlYW1Xcml0ZXIgb3V0UCwgaW50IGxldmVsKQotICB7Ci0KLSAgICBpZihvdXRQPT1udWxsKQotICAgIHsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJEZWZpbml0aW9uT2JqZWN0OnByaW50RW5kXG4iICsgSGVscE1lc3NhZ2VzLkJBRF9PVVRQVVRfU1RSRUFNKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYoZ2V0U3R5bGVTaGVldChEZWYuRGVmYXVsdFN0eWxlKT09bnVsbCkKLSAgICB7Ci0gICAgICBGb250T2JqZWN0IGYgPSBnZXRGb250KGxldmVsKTsKLSAgICAgIGlmKGY9PW51bGwpCi0gICAgICB7Ci0gICAgICAgIGYgPSBnZXRGb250KERlZi5EZWZhdWx0Rm9udCk7Ci0gICAgICB9Ci0gICAgICBwcmludEVuZChvdXRQLCBmKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgcHJpbnRFbmQob3V0UCwgbnVsbCk7Ci0gICAgfQotICB9Ci0KLSAgdm9pZCBwcmludEVuZChPdXRwdXRTdHJlYW1Xcml0ZXIgb3V0UCwgRm9udE9iamVjdCBmKQotICB7Ci0gICAgICAgIGlmKG91dFA9PW51bGwpCi0gICAgewotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkRlZmluaXRpb25PYmplY3Q6cHJpbnRFbmRcbiIgKyBIZWxwTWVzc2FnZXMuQkFEX09VVFBVVF9TVFJFQU0pOyAvLyROT04tTkxTLTEkCi0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZihmIT1udWxsICYmIGYuZ2V0U3R5bGVTaGVldCgpPT1udWxsKQotICAgIHsKLSAgICAgIGlmKGYuaXNCb2xkKCkpCi0gICAgICB7Ci0gICAgICAgIE1pc2NTdGF0aWMucHJpbnQob3V0UCwiPC9CPiIpOyAvLyROT04tTkxTLTEkCi0gICAgICB9Ci0KLSAgICAgIGlmKGYuaXNJdGFsaWMoKSkKLSAgICAgIHsKLSAgICAgICAgTWlzY1N0YXRpYy5wcmludChvdXRQLCI8L0k+Iik7IC8vJE5PTi1OTFMtMSQKLSAgICAgIH0KLSAgICAgIE1pc2NTdGF0aWMucHJpbnQob3V0UCwiPC9GT05UPlxuIik7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgTWlzY1N0YXRpYy5wcmludChvdXRQLCI8L1A+XG4iKTsgLy8kTk9OLU5MUy0xJAotICAgIH0KLSAgfQotICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAvLwotICAvLwlSUFcgMi4wIEludGVncmF0aW9uIC0tIERvIG5vdCBtb2RpZnkgdGhpcyBjb2RlIHVubGVzcyB5b3Uga25vdyB3aGF0IHlvdSBhcmUgZG9pbmcuCi0gIC8vCSAgLy8JQmVjYXVzZSBSUFcgY2FsbHMgdGhlc2UgYXBwbGljYXRpb25zIGZyb20gYSBkaWZmZXJlbnQgbG9jYXRpb24gdGhhbiB0aGUgYmF0Y2ggZmlsZQotICAvLwlpdCBpcyBuZWNjZXNzYXJ5IHRvIG92ZXJyaWRlIHRoZSBkZWZhdWx0cyBpbiB0aGUgY29uZmlnIGZpbGUuCi0gIC8vCi0gIC8vCVRoZSBmb2xsb3dpbmcgbWV0aG9kcyBzaW1wbHkgYWxsb3cgdGhlIHZhbHVlcyB0byBiZSBvdmVyLXJpZGRlbi4KLSAgLy8KLSAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gIHB1YmxpYyB2b2lkIHNldHd3d1Jvb3QoU3RyaW5nIG5ld1Jvb3QpCi0gIHsKLSAgICAgIHRyeSB7Ci0JCUZpbGUgd3d3RGlyID0gbmV3IEZpbGUobmV3Um9vdCk7Ci0JCXd3d1Jvb3QgPSB3d3dEaXIuZ2V0Q2Fub25pY2FsUGF0aCgpICsgIi8iOyAvLyROT04tTkxTLTEkCi0JCXd3d1Jvb3QgPSB3d3dSb290LnJlcGxhY2UoJ1xcJyAsICcvJyk7Ci0JCXN0aXBMZW5ndGggPSB3d3dSb290Lmxlbmd0aCgpLTE7Ci0JfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQllLnByaW50U3RhY2tUcmFjZSgpOwotCX0KLSAgfQotCi0gIHZvaWQgc2V0UmVsYXRpdmVQYXRoKFN0cmluZyBuZXdQYXRoKQotICB7Ci0JcmVsYXRpdmVwYXRoID0gbmV3UGF0aDsKLSAgfQotICAKLSAgLyoqCi0gICAqIHNldCB0aGUgaW5kZXggdGl0bGUKLSAgICogCi0gICAqIEBwYXJhbSB0aXRsZSBTdHJpbmcKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldEluZGV4VGl0bGUoU3RyaW5nIHRpdGxlKQotICB7Ci0JICBpbmRleHRpdGxlID0gdGl0bGU7Ci0gIH0gIAotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy9zZXJ2aWNlcy9pbmRleC9Eb2N1bWVudC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3NlcnZpY2VzL2luZGV4L0RvY3VtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1YjgzZjYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3NlcnZpY2VzL2luZGV4L0RvY3VtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5zZXJ2aWNlcy5pbmRleDsKLQotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtV3JpdGVyOwotCi1jbGFzcyBEb2N1bWVudAotewotICAgIC8vVGhlIHRpdGxlIG9mIHRoZSBkb2N1bWVudAotICAgIHByaXZhdGUgU3RyaW5nIHRpdGxlPW51bGw7Ci0KLSAgICAvL1RoZSB1cmwgdG8gdGhlIGRvY3VtZW50Ci0gICAgcHJpdmF0ZSBTdHJpbmcgdXJsPW51bGw7Ci0gICAvLyBwcml2YXRlIEFuY2hvciBhbmNob3I9bnVsbDsKLQotICAgIC8vVGhlIHBhcmVudCBLZXlXb3JkCi0gICAgcHJpdmF0ZSBLZXlXb3JkIHBhcmVudE09bnVsbDsKLQotICAgIERvY3VtZW50KFN0cmluZyB0aXRsZSwgU3RyaW5nIHVybCkKLSAgICB7Ci0gICAgICAgdGhpcy50aXRsZSA9IHRpdGxlOwotICAgICAgIHRoaXMudXJsID0gIHVybC5yZXBsYWNlKCdcXCcsJy8nKTsKLSAgICB9Ci0KLSAgICB2b2lkIHNldEtleVdvcmQoS2V5V29yZCBrZXkpCi0gICAgewotICAgICAgIHBhcmVudE0gPSBrZXk7Ci0gICAgfQotICAgIFN0cmluZyBnZXRUaXRsZSgpCi0gICAgewotICAgICAgIHJldHVybiB0aXRsZTsKLSAgICB9Ci0KLSAgICBTdHJpbmcgZ2V0VXJsKCkKLSAgICB7Ci0gICAgCWludCBmaXJzdCA9IHVybC5pbmRleE9mKCIjIik7IC8vJE5PTi1OTFMtMSQKLQotICAgICAgICBpZihwYXJlbnRNIT1udWxsICYmIGZpcnN0IDwgMCkKLSAgICAgICAgewotICAgICAgICAgICByZXR1cm4gdXJsICs9IiMiICsgcGFyZW50TS5nZXRBbmNob3IoKTsgLy8kTk9OLU5MUy0xJCAKLSAgICAgICAgfQotCi0JCWlmIChmaXJzdCA+IDAgJiYgdXJsLmluZGV4T2YoIiMiLCBmaXJzdCkgPiAwKSAvLyROT04tTkxTLTEkCi0JCXsKLQkJCXJldHVybiB1cmwuc3Vic3RyaW5nKDAsIGZpcnN0ICsgdXJsLmluZGV4T2YoIiMiLCBmaXJzdCkpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotICAgICAgIHJldHVybiB1cmw7Ci0gICAgfQotCi0gICAgdm9pZCBwcmludChPdXRwdXRTdHJlYW1Xcml0ZXIgb3V0UCkKLSAgICB7Ci0gICAgICAgIGlmKG91dFA9PW51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkRvY3VtZW50LnByaW50XG4iICsgSGVscE1lc3NhZ2VzLkJBRF9PVVRQVVRfU1RSRUFNKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBTdHJpbmcgdG90YWxVcmwgPSB1cmw7Ci0gICAgICAgIFN0cmluZyB0bXBUaXRsZT1udWxsOwotCi0gICAgICAgICAgIHRtcFRpdGxlICA9IHRpdGxlOwotICAgICAgICAgICBpZihwYXJlbnRNIT1udWxsKQotICAgICAgICAgICB7Ci0gICAgICAgICAgICAgdG90YWxVcmwrPSIjIiArIHBhcmVudE0uZ2V0QW5jaG9yKCk7IC8vJE5PTi1OTFMtMSQgCi0gICAgICAgICAgIH0KLQotCi0gICAgICAgIGlmKHRtcFRpdGxlPT1udWxsIHx8IHRtcFRpdGxlLmVxdWFscygiIikpIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgewotICAgICAgICAgIHRtcFRpdGxlID0gIjxGT05UIENPTE9SPVwiIzAwOTkzM1wiPkhlbHBNZXNzYWdlcy5USVRMRV9BTkNIT1JfTUlTU0lORzwvRk9OVD4iOyAvLyROT04tTkxTLTEkCi0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmcgdGFyZ2V0PW51bGw7Ci0gICAgICAgIGlmKCFLZXlXb3JkSW5kZXhIZWxwZXIuZGVmT2JqLmdldFRhcmdldCgpLmVxdWFscygiICIpKSAvLyROT04tTkxTLTEkCi0gICAgICAgIHsKLSAgICAgICAgICAgdGFyZ2V0ID0gIiBUQVJHRVQ9XCIiICsgS2V5V29yZEluZGV4SGVscGVyLmRlZk9iai5nZXRUYXJnZXQoKSArICJcIiAiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICAgICAgfQotCi0gICAgICAgIE1pc2NTdGF0aWMucHJpbnQob3V0UCwgIjxBIEhSRUY9XCIiICsgdG90YWxVcmwgKyAiXCIgIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgICAgICBpZih0YXJnZXQhPW51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgTWlzY1N0YXRpYy5wcmludChvdXRQLCB0YXJnZXQpOwotICAgICAgICB9Ci0KLSAgICAgICAgTWlzY1N0YXRpYy5wcmludChvdXRQLCAiPiIgKyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgdG1wVGl0bGUgKyAiPC9BPiIpOyAvLyROT04tTkxTLTEkCi0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy9zZXJ2aWNlcy9pbmRleC9Gb250T2JqZWN0LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvc2VydmljZXMvaW5kZXgvRm9udE9iamVjdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYzMwNGVkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy9zZXJ2aWNlcy9pbmRleC9Gb250T2JqZWN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5zZXJ2aWNlcy5pbmRleDsKLQotCi0KLWNsYXNzIEZvbnRPYmplY3QKLXsKLSAgU3RyaW5nIG5hbWUgPSBudWxsOwotICBTdHJpbmcgc3R5bGUgPSBudWxsOwotICBTdHJpbmcgc2l6ZSA9IG51bGw7Ci0gIFN0cmluZyBzdHlsZVNoZWV0ID0gbnVsbDsKLQotICBGb250T2JqZWN0KFN0cmluZyBuYW1lLCBTdHJpbmcgc3R5bGUsIFN0cmluZyBzaXplKQotICB7Ci0gICAgdGhpcy5uYW1lID0gbmFtZTsKLSAgICB0aGlzLnN0eWxlID0gc3R5bGU7Ci0gICAgdGhpcy5zaXplID0gc2l6ZTsKLSAgfQotCi0gIEZvbnRPYmplY3QoU3RyaW5nIHN0eWxlU2hlZXQpCi0gIHsKLSAgICB0aGlzLnN0eWxlU2hlZXQgPSBzdHlsZVNoZWV0OwotICB9Ci0KLSAgU3RyaW5nIGdldFN0eWxlU2hlZXQoKQotICB7Ci0gICAgcmV0dXJuIHN0eWxlU2hlZXQ7Ci0gIH0KLQotICBib29sZWFuIGlzQm9sZCgpCi0gIHsKLSAgICByZXR1cm4gc3R5bGUuZXF1YWxzSWdub3JlQ2FzZShEZWYuQm9sZCk7Ci0gIH0KLQotICBib29sZWFuIGlzSXRhbGljKCkKLSAgewotICAgIHJldHVybiBzdHlsZS5lcXVhbHNJZ25vcmVDYXNlKERlZi5JdGFsaWMpOwotICB9Ci0KLSAgU3RyaW5nIGdldFNpemUoKQotICB7Ci0gICAgcmV0dXJuIHNpemU7Ci0gIH0KLQotICBTdHJpbmcgZ2V0TmFtZSgpCi0gIHsKLSAgICByZXR1cm4gbmFtZTsKLSAgfQotCi0gIHZvaWQgcHJpbnQoU3RyaW5nQnVmZmVyIG91dFApCi0gIHsKLSAgICBpZihzdHlsZVNoZWV0IT1udWxsKQotICAgIHsKLSAgICAgICAgb3V0UC5hcHBlbmQoc3R5bGVTaGVldCk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgb3V0UC5hcHBlbmQobmFtZSArICJcdCIgKyBzdHlsZSArICJcdCIgKyBzaXplKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgfQotICAgIG91dFAuYXBwZW5kKCJcbiIpOyAvLyROT04tTkxTLTEkCi0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvc2VydmljZXMvaW5kZXgvSGVscE1lc3NhZ2VzLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvc2VydmljZXMvaW5kZXgvSGVscE1lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3MzFkNDcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3NlcnZpY2VzL2luZGV4L0hlbHBNZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzA3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnNlcnZpY2VzLmluZGV4OwotCi1pbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotY2xhc3MgSGVscE1lc3NhZ2VzCi17Ci0KLSAgc3RhdGljIFN0cmluZyBFWENFUFRJT04gPSAiRXhjZXB0aW9uOiAiOyAvLyROT04tTkxTLTEkCi0gIHN0YXRpYyBTdHJpbmcgQkFEX09VVFBVVF9TVFJFQU0gPSAiQmFkIG91dHB1dCBzdHJlYW0hIjsgLy8kTk9OLU5MUy0xJAotICBzdGF0aWMgU3RyaW5nIEJBRF9QQVJTRVIgPSAiQmFkIHBhcnNlciBvYmplY3QhIjsgLy8kTk9OLU5MUy0xJAotICBzdGF0aWMgU3RyaW5nIElOUFVUX1BBUkFNRVRFUl9OVUxMID0gIklucHV0IHBhcmFtZXRlciBpcyBudWxsISI7IC8vJE5PTi1OTFMtMSQKLSAgc3RhdGljIFN0cmluZyBJTlZBTElEX1BBUkFNRVRFUl9OQU1FID0gIk5vIHZhbGlkIHBhcmFtZXRlciBuYW1lZCAiOyAvLyROT04tTkxTLTEkCi0gIHN0YXRpYyBTdHJpbmcgV1JJVEVfRVhDRVBUSU9OID0gIkV4Y2VwdGlvbiB3cml0aW5nIHRvIGZpbGUgIjsgLy8kTk9OLU5MUy0xJAotICBzdGF0aWMgU3RyaW5nIE1JU1NJTkdfVVJMID0gIk1pc3NpbmcgdXJsICI7IC8vJE5PTi1OTFMtMSQKLSAgc3RhdGljIFN0cmluZyBNSVNTSU5HX0xBQkVMID0gIk1pc3NpbmcgbGFiZWwgIjsgLy8kTk9OLU5MUy0xJAotICBzdGF0aWMgU3RyaW5nIE1JU1NJTkdfTk9ERSA9ICJNaXNzaW5nIG5vZGUgIjsgLy8kTk9OLU5MUy0xJAotICBzdGF0aWMgU3RyaW5nIE9QRU5fRklMRV9GQUlMRUQgPSAiRXJyb3IgcmVhZGluZyBmaWxlICI7IC8vJE5PTi1OTFMtMSQKLSAgc3RhdGljIFN0cmluZyBXUklURV9GSUxFID0gIldyaXRlcyBmaWxlOiAiOyAvLyROT04tTkxTLTEkCi0gIHN0YXRpYyBTdHJpbmcgV1JJVEVfRVJST1IgPSAiRXJyb3Igd3JpdGluZyBmaWxlOiAiOyAvLyROT04tTkxTLTEkCi0gIHN0YXRpYyBTdHJpbmcgUEFSQU1FVEVSX01JU1NJTkcgPSAiUGFyYW1ldGVyIG1pc3Npbmc6ICI7IC8vJE5PTi1OTFMtMSQKLSAgc3RhdGljIFN0cmluZyBQQVJBTUVURVJfTk9UX05VTUJFUiA9ICIgaGF2ZSB0byBiZSBhIG51bWJlciwgdGhlIHZhbHVlIGlzIG5vdCBhIG51bWJlciAiOyAvLyROT04tTkxTLTEkCi0gIHN0YXRpYyBTdHJpbmcgUEFSQU1FVEVSX01JU1NJTkdfVkFMVUUgPSAiVmFsdWUgbWlzc2luZyBmb3IgcGFyYW1ldGVyICI7IC8vJE5PTi1OTFMtMSQKLSAgc3RhdGljIFN0cmluZyBGT05UX0FORF9TVFlMRV9NSVNTSU5HID0gIkJvdGggb2YgdGhlIGZvbGxvd2luZyBwYXJhbWV0ZXJzIGFyZSBtaXNzaW5nICI7IC8vJE5PTi1OTFMtMSQKLSAgc3RhdGljIFN0cmluZyBOT19ESVJFQ1RPUlkgPSAiIGlzIG5vdCBhIHJlYWRhYmxlIGRpcmVjdG9yeSEiOyAvLyROT04tTkxTLTEkCi0gIHN0YXRpYyBTdHJpbmcgRElSRUNUT1JZX05PVF9QQVJTRUQgPSAiRG9lcyBub3QgcGFyc2UgZGlyZWN0b3J5ICI7IC8vJE5PTi1OTFMtMSQKLSAgc3RhdGljIFN0cmluZyBOT1RfRU5PVUdIX0lOUFVUID0gIk5vdCBlbm91Z2ggaW5wdXQsIG9wZXJhdGlvbiBjYW5jZWxlZCEiOyAvLyROT04tTkxTLTEkCi0gIHN0YXRpYyBTdHJpbmcgSU5DT1JSRUNUX0hFQURFUkZJTEUgPSAiSGVhZGVyIGZpbGUgcHJvYmFibHkgaW5jb3JyZWN0ISI7IC8vJE5PTi1OTFMtMSQKLSAgc3RhdGljIFN0cmluZyBJTkNPUlJFQ1RfRk9PVEVSRklMRSA9ICJGb290ZXIgZmlsZSBwcm9iYWJseSBpbmNvcnJlY3QhIjsgLy8kTk9OLU5MUy0xJAotICBzdGF0aWMgU3RyaW5nIEtFWVdPUkRfU1lOVEFYX0VSUk9SID0gIiBpcyBub3QgYSB2YWxpZCBrZXkgd29yZCEgSGF2ZSB0byBiZWdpbiB3aXRoICI7IC8vJE5PTi1OTFMtMSQKLSAgc3RhdGljIFN0cmluZyBLRVlXT1JEX0ZJTEVfU1lOVEFYX0VSUk9SID0gIiBjb250YWluaW5nIGtleXdvcmRzIGNvbnRhaW5zIHN5bnRheCBlcnJvcnMhIjsgLy8kTk9OLU5MUy0xJAotICBzdGF0aWMgU3RyaW5nIFJFTEFURURfS0VZV09SRF9OT1RfRk9VTkQgPSAiIHJlZmZlcmVkIGJ5IHRoZSBmb2xsb3dpbmcga2V5d29yZCBkb2VzIG5vdCBleGlzdCAiOyAvLyROT04tTkxTLTEkCi0gIHN0YXRpYyBTdHJpbmcgUEFSU0VfRElSRUNUT1JZID0gIlBhcnNlcyBkaXJlY3Rvcnk6ICI7IC8vJE5PTi1OTFMtMSQKLSAgc3RhdGljIFN0cmluZyBUQUtFX0FfV0hJTEUgPSAiSXQgbWF5IHRha2UgYSB3aGlsZSAuLi4iOyAvLyROT04tTkxTLTEkCi0gIHN0YXRpYyBTdHJpbmcgVElUTEVfQU5DSE9SX01JU1NJTkcgPSAiVGl0bGUgYW5kL29yIGFuY2hvciB0ZXh0IGlzIG1pc3NpbmchIjsgLy8kTk9OLU5MUy0xJAotICBzdGF0aWMgU3RyaW5nIE1JU1NJTkdfUkVTUE9OU0VfRklMRSA9ICJFcnJvcjogTWlzc2luZyAtciByZXNwb25zZSBmaWxlIjsgLy8kTk9OLU5MUy0xJAotICBzdGF0aWMgU3RyaW5nIE5PX09GX0NIQVJBQ1RFUlNfUkVBRCA9ICIgY2hhcnMgcmVhZCBpbiAiOyAvLyROT04tTkxTLTEkCi0gIHN0YXRpYyBTdHJpbmcgTk9fT0ZfRklMRVNfQ0hFQ0tFRCA9ICIgZmlsZXMgY2hlY2tlZCBpbiAiOyAvLyROT04tTkxTLTEkCi0gIHN0YXRpYyBTdHJpbmcgU0VDT05EID0gIiBzICI7IC8vJE5PTi1OTFMtMSQKLSAgc3RhdGljIFN0cmluZyBXT1JEUyA9ICIgd29yZHMiOyAvLyROT04tTkxTLTEkCi0gIHN0YXRpYyBTdHJpbmcgQ09NUElMRUQgPSAiQ29tcGlsZWQgIjsgLy8kTk9OLU5MUy0xJAotICBzdGF0aWMgU3RyaW5nIERPQ1VNRU5UU19DT05BVElOSU5HID0gIiBkb2N1bWVudHMsIGNvbnRhaW5pbmcgIjsgLy8kTk9OLU5MUy0xJAotICBzdGF0aWMgU3RyaW5nIEJZVEVTX1NUT1JFRCA9ICIgYnl0ZXMsIHN0b3JlZCBpbiAiOyAvLyROT04tTkxTLTEkCi0gIHN0YXRpYyBTdHJpbmcgV0VCX0RBVEFCQVNFID0gIldlYiBkYXRhYmFzZSBvZiAiOyAvLyROT04tTkxTLTEkCi0gIHN0YXRpYyBTdHJpbmcgQ0RST01fREFUQUJBU0UgPSAiQ0QtUk9NIGRhdGFiYXNlIG9mICI7IC8vJE5PTi1OTFMtMSQKLSAgc3RhdGljIFN0cmluZyBCWVRFUyA9ICAiYnl0ZXMiOyAvLyROT04tTkxTLTEkCi0gIHN0YXRpYyBTdHJpbmcgQllURVNfQU5EID0gICJieXRlcywgYW5kICI7IC8vJE5PTi1OTFMtMSQKLSAgc3RhdGljIFN0cmluZyBGQVRBTF9FUlJPUiA9ICJGYXRhbCBFcnJvcjogIjsgLy8kTk9OLU5MUy0xJAotICBzdGF0aWMgU3RyaW5nIEZJTEVfRE9FU19OT1RfRVhJU1QgPSAiRXJyb3I6IENvdWxkbid0IGZpbmQgZmlsZTogIjsgLy8kTk9OLU5MUy0xJAotICBzdGF0aWMgU3RyaW5nIE1JU1NJTkdfRl9GSUxFID0gIkVycm9yOiBNaXNzaW5nIC1mIGZpbGVuYW1lIjsgLy8kTk9OLU5MUy0xJAotICBzdGF0aWMgU3RyaW5nIENBTk9OSUNBTF9GSUxFX1BBVEhfRkFJTEVEID0gIkVycm9yOiBjb3VsZG4ndCBjcmVhdGUgY2Fub25pY2FsIGZpbGVwYXRoIGZvciAiOyAvLyROT04tTkxTLTEkCi0gIHN0YXRpYyBTdHJpbmcgRE9DVU1FTlRfREVQRU5ERU5DWV9MSVNUID0gICJEb2N1bWVudCBkZXBlbmRhbmN5IGxpc3QgZm9yICI7IC8vJE5PTi1OTFMtMSQKLSAgc3RhdGljIFN0cmluZyBEQVRBX0RFUEVOREVOQ1lfTElTVCA9ICAiRGF0YSBkZXBlbmRhbmN5IGxpc3QgZm9yICI7IC8vJE5PTi1OTFMtMSQKLSAgc3RhdGljIFN0cmluZyBFWFRFUk5BTF9MSU5LX0xJU1QgPSAgIkV4dGVybmFsIGxpbmtzIGxpc3QgZm9yICI7IC8vJE5PTi1OTFMtMSQKLSAgc3RhdGljIFN0cmluZyBNSVNTSU5HX0xJTktfTElTVCA9ICAiTWlzc2luZyBsaW5rcyBsaXN0IGZvciAiOyAvLyROT04tTkxTLTEkCi0gIHN0YXRpYyBTdHJpbmcgTk9USElOR19UT19ETyA9ICAiRXJyb3I6IG5vdGhpbmcgdG8gZG86IC1uYiAtbmggLW5sIC1udCI7IC8vJE5PTi1OTFMtMSQKLSAgc3RhdGljIFN0cmluZyBJTlRFUk1FRElBVEVfREFUQV9GSUxFID0gICJJbnRlcm1lZGlhdGUgZGF0YTogZmlsZTovLyI7IC8vJE5PTi1OTFMtMSQKLSAgc3RhdGljIFN0cmluZyBUT09fTUFOWV9GSUxFUyA9ICAiRXJyb3I6IFRvbyBtYW55IGZpbGVzIGZvciB0aGUgc2VhcmNoIGFwcGxldCBkYXRhYmFzZSI7IC8vJE5PTi1OTFMtMSQKLSAgc3RhdGljIFN0cmluZyBJTExFR0FMX05VTUVSSUNfVkFMVUUgPSAiRXJyb3I6IElsbGVnYWwgbnVtZXJpYyB2YWx1ZSAtaW0gIjsgLy8kTk9OLU5MUy0xJAotCi0gIHN0YXRpYyB2b2lkIGxvYWRIZWxwTWVzc2FnZXMoU3RyaW5nIGZpbGVOYW1lLCBTdHJpbmcgY2hhcmFjdGVyc2V0KQotICB7Ci0gICAgICAgU3RyaW5nIGhlbHBUZXh0cyA9IE1pc2NTdGF0aWMubG9hZEZpbGUoZmlsZU5hbWUsY2hhcmFjdGVyc2V0KTsKLSAgICAgICBTdHJpbmdUb2tlbml6ZXIgcGFyc2VyID0gbmV3IFN0cmluZ1Rva2VuaXplcigKLSAgICAgICAgICAgICAgICAgICAgICAgaGVscFRleHRzLCAiXG5cdCIpOyAvLyROT04tTkxTLTEkCi0KLSAgICAgICB3aGlsZShwYXJzZXIuaGFzTW9yZVRva2VucygpKQotICAgICAgIHsKLSAgICAgICAgICBTdHJpbmcgcGFyYW0gPSBwYXJzZXIubmV4dFRva2VuKCkudHJpbSgpOwotICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IHBhcnNlci5uZXh0VG9rZW4oKS50cmltKCk7Ci0gICAgICAgICAgSGVscE1lc3NhZ2VzLmFkZFZhbHVlKHBhcmFtLCAiICIgKyB2YWx1ZSArICIgIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgICAgIH0KLSAgfQotCi0gIHN0YXRpYyB2b2lkIGFkZFZhbHVlKFN0cmluZyBwYXJhbSwgU3RyaW5nIHZhbHVlKQotICB7Ci0KLSAgICBpZihwYXJhbS5lcXVhbHNJZ25vcmVDYXNlKCJJTlBVVF9QQVJBTUVURVJfTlVMTCIpKSAvLyROT04tTkxTLTEkCi0gICAgewotICAgICAgSGVscE1lc3NhZ2VzLklOUFVUX1BBUkFNRVRFUl9OVUxMID0gdmFsdWU7Ci0gICAgfQotICAgIGVsc2UgaWYocGFyYW0uZXF1YWxzSWdub3JlQ2FzZSgiSUxMRUdBTF9OVU1FUklDX1ZBTFVFIikpIC8vJE5PTi1OTFMtMSQKLSAgICB7Ci0gICAgICBIZWxwTWVzc2FnZXMuSUxMRUdBTF9OVU1FUklDX1ZBTFVFID0gdmFsdWU7Ci0gICAgfQotICAgIGVsc2UgaWYocGFyYW0uZXF1YWxzSWdub3JlQ2FzZSgiRVhDRVBUSU9OIikpIC8vJE5PTi1OTFMtMSQKLSAgICB7Ci0gICAgICBIZWxwTWVzc2FnZXMuRVhDRVBUSU9OID0gdmFsdWU7Ci0gICAgfQotICAgIGVsc2UgaWYocGFyYW0uZXF1YWxzSWdub3JlQ2FzZSgiSU5URVJNRURJQVRFX0RBVEFfRklMRSIpKSAvLyROT04tTkxTLTEkCi0gICAgewotICAgICAgSGVscE1lc3NhZ2VzLklOVEVSTUVESUFURV9EQVRBX0ZJTEUgPSB2YWx1ZTsKLSAgICB9Ci0gICAgZWxzZSBpZihwYXJhbS5lcXVhbHNJZ25vcmVDYXNlKCJUT09fTUFOWV9GSUxFUyIpKSAvLyROT04tTkxTLTEkCi0gICAgewotICAgICAgSGVscE1lc3NhZ2VzLlRPT19NQU5ZX0ZJTEVTID0gdmFsdWU7Ci0gICAgfQotICAgIGVsc2UgaWYocGFyYW0uZXF1YWxzSWdub3JlQ2FzZSgiTk9fT0ZfRklMRVNfQ0hFQ0tFRCIpKSAvLyROT04tTkxTLTEkCi0gICAgewotICAgICAgSGVscE1lc3NhZ2VzLk5PX09GX0ZJTEVTX0NIRUNLRUQgPSB2YWx1ZTsKLSAgICB9Ci0gICAgZWxzZSBpZihwYXJhbS5lcXVhbHNJZ25vcmVDYXNlKCJOT1RISU5HX1RPX0RPIikpIC8vJE5PTi1OTFMtMSQKLSAgICB7Ci0gICAgICBIZWxwTWVzc2FnZXMuTk9USElOR19UT19ETyA9IHZhbHVlOwotICAgIH0KLSAgICBlbHNlIGlmKHBhcmFtLmVxdWFsc0lnbm9yZUNhc2UoIklOVEVSTUVESUFURV9EQVRBX0ZJTEUiKSkgLy8kTk9OLU5MUy0xJAotICAgIHsKLSAgICAgIEhlbHBNZXNzYWdlcy5JTlRFUk1FRElBVEVfREFUQV9GSUxFID0gdmFsdWU7Ci0gICAgfQotICAgIGVsc2UgaWYocGFyYW0uZXF1YWxzSWdub3JlQ2FzZSgiRE9DVU1FTlRfREVQRU5ERU5DWV9MSVNUIikpIC8vJE5PTi1OTFMtMSQKLSAgICB7Ci0gICAgICBIZWxwTWVzc2FnZXMuRE9DVU1FTlRfREVQRU5ERU5DWV9MSVNUID0gdmFsdWU7Ci0gICAgfQotICAgIGVsc2UgaWYocGFyYW0uZXF1YWxzSWdub3JlQ2FzZSgiREFUQV9ERVBFTkRFTkNZX0xJU1QiKSkgLy8kTk9OLU5MUy0xJAotICAgIHsKLSAgICAgIEhlbHBNZXNzYWdlcy5EQVRBX0RFUEVOREVOQ1lfTElTVCA9IHZhbHVlOwotICAgIH0KLSAgICBlbHNlIGlmKHBhcmFtLmVxdWFsc0lnbm9yZUNhc2UoIkVYVEVSTkFMX0xJTktfTElTVCIpKSAvLyROT04tTkxTLTEkCi0gICAgewotICAgICAgSGVscE1lc3NhZ2VzLkVYVEVSTkFMX0xJTktfTElTVCA9IHZhbHVlOwotICAgIH0KLSAgICBlbHNlIGlmKHBhcmFtLmVxdWFsc0lnbm9yZUNhc2UoIk1JU1NJTkdfTElOS19MSVNUIikpIC8vJE5PTi1OTFMtMSQKLSAgICB7Ci0gICAgICBIZWxwTWVzc2FnZXMuTUlTU0lOR19MSU5LX0xJU1QgPSB2YWx1ZTsKLSAgICB9Ci0gICAgZWxzZSBpZihwYXJhbS5lcXVhbHNJZ25vcmVDYXNlKCJXT1JEUyIpKSAvLyROT04tTkxTLTEkCi0gICAgewotICAgICAgSGVscE1lc3NhZ2VzLldPUkRTID0gdmFsdWU7Ci0gICAgfQotICAgIGVsc2UgaWYocGFyYW0uZXF1YWxzSWdub3JlQ2FzZSgiQ09NUElMRUQiKSkgLy8kTk9OLU5MUy0xJAotICAgIHsKLSAgICAgIEhlbHBNZXNzYWdlcy5DT01QSUxFRCA9IHZhbHVlOwotICAgIH0KLSAgICBlbHNlIGlmKHBhcmFtLmVxdWFsc0lnbm9yZUNhc2UoIkRPQ1VNRU5UU19DT05BVElOSU5HIikpIC8vJE5PTi1OTFMtMSQKLSAgICB7Ci0gICAgICBIZWxwTWVzc2FnZXMuRE9DVU1FTlRTX0NPTkFUSU5JTkcgPSB2YWx1ZTsKLSAgICB9Ci0gICAgZWxzZSBpZihwYXJhbS5lcXVhbHNJZ25vcmVDYXNlKCJCWVRFU19TVE9SRUQiKSkgLy8kTk9OLU5MUy0xJAotICAgIHsKLSAgICAgIEhlbHBNZXNzYWdlcy5CWVRFU19TVE9SRUQgPSB2YWx1ZTsKLSAgICB9Ci0gICAgZWxzZSBpZihwYXJhbS5lcXVhbHNJZ25vcmVDYXNlKCJXRUJfREFUQUJBU0UiKSkgLy8kTk9OLU5MUy0xJAotICAgIHsKLSAgICAgIEhlbHBNZXNzYWdlcy5XRUJfREFUQUJBU0UgPSB2YWx1ZTsKLSAgICB9Ci0gICAgZWxzZSBpZihwYXJhbS5lcXVhbHNJZ25vcmVDYXNlKCJDRFJPTV9EQVRBQkFTRSIpKSAvLyROT04tTkxTLTEkCi0gICAgewotICAgICAgSGVscE1lc3NhZ2VzLkNEUk9NX0RBVEFCQVNFID0gdmFsdWU7Ci0gICAgfQotICAgIGVsc2UgaWYocGFyYW0uZXF1YWxzSWdub3JlQ2FzZSgiQllURVMiKSkgLy8kTk9OLU5MUy0xJAotICAgIHsKLSAgICAgIEhlbHBNZXNzYWdlcy5CWVRFUyA9IHZhbHVlOwotICAgIH0KLSAgICBlbHNlIGlmKHBhcmFtLmVxdWFsc0lnbm9yZUNhc2UoIkJZVEVTX0FORCIpKSAvLyROT04tTkxTLTEkCi0gICAgewotICAgICAgSGVscE1lc3NhZ2VzLkJZVEVTX0FORCA9IHZhbHVlOwotICAgIH0KLSAgICBlbHNlIGlmKHBhcmFtLmVxdWFsc0lnbm9yZUNhc2UoIk1JU1NJTkdfRl9GSUxFIikpIC8vJE5PTi1OTFMtMSQKLSAgICB7Ci0gICAgICBIZWxwTWVzc2FnZXMuTUlTU0lOR19GX0ZJTEUgPSB2YWx1ZTsKLSAgICB9Ci0gICAgZWxzZSBpZihwYXJhbS5lcXVhbHNJZ25vcmVDYXNlKCJDQU5PTklDQUxfRklMRV9QQVRIX0ZBSUxFRCIpKSAvLyROT04tTkxTLTEkCi0gICAgewotICAgICAgSGVscE1lc3NhZ2VzLkNBTk9OSUNBTF9GSUxFX1BBVEhfRkFJTEVEID0gdmFsdWU7Ci0gICAgfQotICAgIGVsc2UgaWYocGFyYW0uZXF1YWxzSWdub3JlQ2FzZSgiTk9fT0ZfQ0hBUkFDVEVSU19SRUFEIikpIC8vJE5PTi1OTFMtMSQKLSAgICB7Ci0gICAgICBIZWxwTWVzc2FnZXMuTk9fT0ZfQ0hBUkFDVEVSU19SRUFEID0gdmFsdWU7Ci0gICAgfQotICAgIGVsc2UgaWYocGFyYW0uZXF1YWxzSWdub3JlQ2FzZSgiRklMRV9ET0VTX05PVF9FWElTVCIpKSAvLyROT04tTkxTLTEkCi0gICAgewotICAgICAgSGVscE1lc3NhZ2VzLkZJTEVfRE9FU19OT1RfRVhJU1QgPSB2YWx1ZTsKLSAgICB9Ci0gICAgZWxzZSBpZihwYXJhbS5lcXVhbHNJZ25vcmVDYXNlKCJGQVRBTF9FUlJPUiIpKSAvLyROT04tTkxTLTEkCi0gICAgewotICAgICAgSGVscE1lc3NhZ2VzLkZBVEFMX0VSUk9SID0gdmFsdWU7Ci0gICAgfQotICAgIGVsc2UgaWYocGFyYW0uZXF1YWxzSWdub3JlQ2FzZSgiU0VDT05EIikpIC8vJE5PTi1OTFMtMSQKLSAgICB7Ci0gICAgICBIZWxwTWVzc2FnZXMuU0VDT05EID0gdmFsdWU7Ci0gICAgfQotICAgIGVsc2UgaWYocGFyYW0uZXF1YWxzSWdub3JlQ2FzZSgiQkFEX1BBUlNFUiIpKSAvLyROT04tTkxTLTEkCi0gICAgewotICAgICAgSGVscE1lc3NhZ2VzLkJBRF9QQVJTRVIgPSB2YWx1ZTsKLSAgICB9Ci0gICAgIGVsc2UgaWYocGFyYW0uZXF1YWxzSWdub3JlQ2FzZSgiTUlTU0lOR19SRVNQT05TRV9GSUxFIikpIC8vJE5PTi1OTFMtMSQKLSAgICB7Ci0gICAgICBIZWxwTWVzc2FnZXMuTUlTU0lOR19SRVNQT05TRV9GSUxFID0gdmFsdWU7Ci0gICAgfQotICAgIGVsc2UgaWYocGFyYW0uZXF1YWxzSWdub3JlQ2FzZSgiVElUTEVfQU5DSE9SX01JU1NJTkciKSkgLy8kTk9OLU5MUy0xJAotICAgIHsKLSAgICAgIEhlbHBNZXNzYWdlcy5USVRMRV9BTkNIT1JfTUlTU0lORyA9IHZhbHVlOwotICAgIH0KLSAgICBlbHNlIGlmKHBhcmFtLmVxdWFsc0lnbm9yZUNhc2UoIktFWVdPUkRfRklMRV9TWU5UQVhfRVJST1IiKSkgLy8kTk9OLU5MUy0xJAotICAgIHsKLSAgICAgIEhlbHBNZXNzYWdlcy5LRVlXT1JEX0ZJTEVfU1lOVEFYX0VSUk9SID0gdmFsdWU7Ci0gICAgfQotICAgIGVsc2UgaWYocGFyYW0uZXF1YWxzSWdub3JlQ2FzZSgiS0VZV09SRF9TWU5UQVhfRVJST1IiKSkgLy8kTk9OLU5MUy0xJAotICAgIHsKLSAgICAgIEhlbHBNZXNzYWdlcy5LRVlXT1JEX1NZTlRBWF9FUlJPUiA9IHZhbHVlOwotICAgIH0KLSAgICBlbHNlIGlmKHBhcmFtLmVxdWFsc0lnbm9yZUNhc2UoIlBBUlNFX0RJUkVDVE9SWSIpKSAvLyROT04tTkxTLTEkCi0gICAgewotICAgICAgSGVscE1lc3NhZ2VzLlBBUlNFX0RJUkVDVE9SWSA9IHZhbHVlOwotICAgIH0KLSAgICBlbHNlIGlmKHBhcmFtLmVxdWFsc0lnbm9yZUNhc2UoIlRBS0VfQV9XSElMRSIpKSAvLyROT04tTkxTLTEkCi0gICAgewotICAgICAgSGVscE1lc3NhZ2VzLlRBS0VfQV9XSElMRSA9IHZhbHVlOwotICAgIH0KLSAgICBlbHNlIGlmKHBhcmFtLmVxdWFsc0lnbm9yZUNhc2UoIklOQ09SUkVDVF9IRUFERVJGSUxFIikpIC8vJE5PTi1OTFMtMSQKLSAgICB7Ci0gICAgICBIZWxwTWVzc2FnZXMuSU5DT1JSRUNUX0hFQURFUkZJTEUgPSB2YWx1ZTsKLSAgICB9Ci0gICAgZWxzZSBpZihwYXJhbS5lcXVhbHNJZ25vcmVDYXNlKCJSRUxBVEVEX0tFWVdPUkRfTk9UX0ZPVU5EIikpIC8vJE5PTi1OTFMtMSQKLSAgICB7Ci0gICAgICBIZWxwTWVzc2FnZXMuUkVMQVRFRF9LRVlXT1JEX05PVF9GT1VORCA9IHZhbHVlOwotICAgIH0KLSAgICBlbHNlIGlmKHBhcmFtLmVxdWFsc0lnbm9yZUNhc2UoIklOQ09SUkVDVF9GT09URVJGSUxFIikpIC8vJE5PTi1OTFMtMSQKLSAgICB7Ci0gICAgICBIZWxwTWVzc2FnZXMuSU5DT1JSRUNUX0ZPT1RFUkZJTEUgPSB2YWx1ZTsKLSAgICB9Ci0gICAgZWxzZSBpZihwYXJhbS5lcXVhbHNJZ25vcmVDYXNlKCJOT1RfRU5PVUdIX0lOUFVUIikpIC8vJE5PTi1OTFMtMSQKLSAgICB7Ci0gICAgICBIZWxwTWVzc2FnZXMuTk9UX0VOT1VHSF9JTlBVVCA9IHZhbHVlOwotICAgIH0KLSAgICBlbHNlIGlmKHBhcmFtLmVxdWFsc0lnbm9yZUNhc2UoIk5PX0RJUkVDVE9SWSIpKSAvLyROT04tTkxTLTEkCi0gICAgewotICAgICAgSGVscE1lc3NhZ2VzLk5PX0RJUkVDVE9SWSA9IHZhbHVlOwotICAgIH0KLSAgICBlbHNlIGlmKHBhcmFtLmVxdWFsc0lnbm9yZUNhc2UoIkRJUkVDVE9SWV9OT1RfUEFSU0VEIikpIC8vJE5PTi1OTFMtMSQKLSAgICB7Ci0gICAgICBIZWxwTWVzc2FnZXMuRElSRUNUT1JZX05PVF9QQVJTRUQgPSB2YWx1ZTsKLSAgICB9Ci0gICAgZWxzZSBpZihwYXJhbS5lcXVhbHNJZ25vcmVDYXNlKCJCQURfT1VUUFVUX1NUUkVBTSIpKSAvLyROT04tTkxTLTEkCi0gICAgewotICAgICAgSGVscE1lc3NhZ2VzLkJBRF9PVVRQVVRfU1RSRUFNID0gdmFsdWU7Ci0gICAgfQotICAgIGVsc2UgaWYocGFyYW0uZXF1YWxzSWdub3JlQ2FzZSgiV1JJVEVfRVhDRVBUSU9OIikpIC8vJE5PTi1OTFMtMSQKLSAgICB7Ci0gICAgICBIZWxwTWVzc2FnZXMuV1JJVEVfRVhDRVBUSU9OID0gdmFsdWU7Ci0gICAgfQotICAgIGVsc2UgaWYocGFyYW0uZXF1YWxzSWdub3JlQ2FzZSgiT1BFTl9GSUxFX0ZBSUxFRCIpKSAvLyROT04tTkxTLTEkCi0gICAgewotICAgICAgSGVscE1lc3NhZ2VzLk9QRU5fRklMRV9GQUlMRUQgPSB2YWx1ZTsKLSAgICB9Ci0gICAgZWxzZSBpZihwYXJhbS5lcXVhbHNJZ25vcmVDYXNlKCJXUklURV9FUlJPUiIpKSAvLyROT04tTkxTLTEkCi0gICAgewotICAgICAgSGVscE1lc3NhZ2VzLldSSVRFX0VSUk9SID0gdmFsdWU7Ci0gICAgfQotICAgIGVsc2UgaWYocGFyYW0uZXF1YWxzSWdub3JlQ2FzZSgiV1JJVEVfRklMRSIpKSAvLyROT04tTkxTLTEkCi0gICAgewotICAgICAgSGVscE1lc3NhZ2VzLldSSVRFX0ZJTEUgPSB2YWx1ZTsKLSAgICB9Ci0gICAgZWxzZSBpZihwYXJhbS5lcXVhbHNJZ25vcmVDYXNlKCJNSVNTSU5HX0xBQkVMIikpIC8vJE5PTi1OTFMtMSQKLSAgICB7Ci0gICAgICBIZWxwTWVzc2FnZXMuTUlTU0lOR19MQUJFTCAgPSB2YWx1ZTsKLSAgICB9Ci0gICAgIGVsc2UgaWYocGFyYW0uZXF1YWxzSWdub3JlQ2FzZSgiTUlTU0lOR19VUkwiKSkgLy8kTk9OLU5MUy0xJAotICAgIHsKLSAgICAgIEhlbHBNZXNzYWdlcy5NSVNTSU5HX1VSTCAgPSB2YWx1ZTsKLSAgICB9Ci0gICAgZWxzZSBpZihwYXJhbS5lcXVhbHNJZ25vcmVDYXNlKCJNSVNTSU5HX0xBQkVMIikpIC8vJE5PTi1OTFMtMSQKLSAgICB7Ci0gICAgICBIZWxwTWVzc2FnZXMuTUlTU0lOR19MQUJFTCAgPSB2YWx1ZTsKLSAgICB9Ci0gICAgZWxzZSBpZihwYXJhbS5lcXVhbHNJZ25vcmVDYXNlKCJNSVNTSU5HX05PREUiKSkgLy8kTk9OLU5MUy0xJAotICAgIHsKLSAgICAgIEhlbHBNZXNzYWdlcy5NSVNTSU5HX05PREUgID0gdmFsdWU7Ci0gICAgfQotICAgIGVsc2UgaWYocGFyYW0uZXF1YWxzSWdub3JlQ2FzZSgiUEFSQU1FVEVSX01JU1NJTkciKSkgLy8kTk9OLU5MUy0xJAotICAgIHsKLSAgICAgIEhlbHBNZXNzYWdlcy5QQVJBTUVURVJfTUlTU0lORyAgPSB2YWx1ZTsKLSAgICB9Ci0gICAgIGVsc2UgaWYocGFyYW0uZXF1YWxzSWdub3JlQ2FzZSgiUEFSQU1FVEVSX01JU1NJTkdfVkFMVUUiKSkgLy8kTk9OLU5MUy0xJAotICAgIHsKLSAgICAgIEhlbHBNZXNzYWdlcy5QQVJBTUVURVJfTUlTU0lOR19WQUxVRSAgPSB2YWx1ZTsKLSAgICB9Ci0gICAgZWxzZSBpZihwYXJhbS5lcXVhbHNJZ25vcmVDYXNlKCJGT05UX0FORF9TVFlMRV9NSVNTSU5HIikpIC8vJE5PTi1OTFMtMSQKLSAgICB7Ci0gICAgICBIZWxwTWVzc2FnZXMuRk9OVF9BTkRfU1RZTEVfTUlTU0lORyAgPSB2YWx1ZTsKLSAgICB9Ci0gICAgIGVsc2UgaWYocGFyYW0uZXF1YWxzSWdub3JlQ2FzZSgiUEFSQU1FVEVSX05PVF9OVU1CRVIiKSkgLy8kTk9OLU5MUy0xJAotICAgIHsKLSAgICAgIEhlbHBNZXNzYWdlcy5QQVJBTUVURVJfTk9UX05VTUJFUiAgPSB2YWx1ZTsKLSAgICB9Ci0gICAgZWxzZSBpZihwYXJhbS5lcXVhbHNJZ25vcmVDYXNlKCJJTlZBTElEX1BBUkFNRVRFUl9OQU1FIikpIC8vJE5PTi1OTFMtMSQKLSAgICB7Ci0gICAgICBIZWxwTWVzc2FnZXMuSU5WQUxJRF9QQVJBTUVURVJfTkFNRSAgPSB2YWx1ZTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVW5rbm93biBwYXJhbWV0ZXIgIiArIHBhcmFtKTsgLy8kTk9OLU5MUy0xJAotICAgIH0KLSAgfQotfQotCi0KLQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3NlcnZpY2VzL2luZGV4L0lPLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvc2VydmljZXMvaW5kZXgvSU8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDBlNzAyMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvc2VydmljZXMvaW5kZXgvSU8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwMyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5zZXJ2aWNlcy5pbmRleDsKLQotaW1wb3J0IGphdmEuYXd0LkNvbG9yOwotaW1wb3J0IGphdmEuYXd0LkZvbnQ7Ci1pbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247Ci0KLWltcG9ydCBjb20uaWJtLmljdS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiAgQ2xhc3Mgd2l0aCBvbmx5IGNsYXNzIG1ldGhvZHMgdGhhdCBzaW1wbGlmaWVzIHNvbWUgY29tbXVuaWNhdGlvbnMKLSogIHdpdGggYSB3d3ctc2VydmVyIGFuZCBhbHNvIG91dHB1dCB0byB0aGUgSmF2YSBDb25zb2xlIFdpbmRvdy4KLSoKLSogIER1ZSB0byBzZWN1cml0eSBsaW1pdGF0aW9ucywgdGhlIG9ubHkgd3d3LXNlcnZlciByZWFjaGFibGUsCi0qICBpcyB0aGUgc2VydmVyIGZyb20gd2hpY2ggdGhlIGN1cnJlbnQgYXBwbGV0IGlzIGxvYWRlZCBmcm9tLgotKgotKiAgVGhpcyBjbGFzcyB1c2VzIHRoZSBFcnJvcldpbmRvdyBjbGFzcyBmb3Igc2hvd2luZyBlcnJvciBtZXNzYWdlcy4KLSoKLSogQHNlZSBydXB0b29scy5pby5FcnJvcldpbmRvdwotKgotKiBAdmVyc2lvbiAxLjAKLSogQGF1dGhvciBSYXRpb25hbCBTb2Z0d2FyZQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotY2xhc3MgSU8KLXsKLSAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gZGVidWdPbj1mYWxzZTsKLQotICAgLyoqCi0gICAqICBDbGFzcyBtZXRob2QgdGhhdCByZXR1cm5zIGEgc2V0IG9mIHN0cmluZyBkZWxpbWl0ZXJzIHRoYXQgY2FuIGJlCi0gICAqICB1c2VkIHdoZW4gdG9rZW5pemluZyBhIHRleHQgc3RyaW5nLgotICAgKgotICAgKi8KLSAgIHN0YXRpYyBTdHJpbmcgZ2V0RGVsaW0oKQotICAgewotICAgICAgcmV0dXJuIG5ldyBTdHJpbmcoIioiKTsgLy8kTk9OLU5MUy0xJAotICAgfQotCi0gICAvKioKLSAgICogIENsYXNzIG1ldGhvZCB0aGF0IGNvbnRyb2xzIGlmIGRlYnVnIGluZm8gc2hhbGwgYmUgc2hvd2VkIG9yIG5vdAotICAgKiAgaW4gdGhlIEphdmEgQ29uc29sZSBXaW5kb3cuCi0gICAqCi0gICAqIEBwYXJhbSBpc09uIElmIDxiPnRydWU8L2I+IHRoZW4gZGVidWcgaW5mbyB3aWxsIGJlIHNob3dlZC4KLSAgICoKLSAgICovCi0gICBzdGF0aWMgdm9pZCBkZWJ1Zyhib29sZWFuIGlzT24pCi0gICB7Ci0gICAgICAgIGRlYnVnT24gPSBpc09uOwotICAgfQotCi0KLSAgIC8qKgotICAgKiAgUHJpbnQgRXJyb3IgbWVzc2FnZXMgaW4gdGhlIEphdmEgQ29uc29sZSBXaW5kb3cKLSAgICoKLSAgICogQHBhcmFtIHN0ciBTdHJpbmcgdG8gcHJpbnQKLSAgICoKLSAgICovCi0gICBzdGF0aWMgdm9pZCBwcmludEVycm9yKCBTdHJpbmcgc3RyICkKLSAgIHsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCAiRXJyb3I6IiArIHN0ciApOyAvLyROT04tTkxTLTEkCi0gICB9Ci0KLSAgIC8qKgotICAgKiAgUHJpbnQgRGVidWcgbWVzc2FnZXMgaW4gdGhlIEphdmEgQ29uc29sZSBXaW5kb3cgaWYgdGhlIGRlYnVnIGZsYWcKLSAgICogIGlzIHNldCAoc2V0RGVidWcgbWV0aG9kKQotICAgKgotICAgKiBAcGFyYW0gc3RyIFN0cmluZyB0byBwcmludAotICAgKgotICAgKi8KLSAgIHN0YXRpYyB2b2lkIHByaW50RGVidWcoIFN0cmluZyBzdHIgKQotICAgewotICAgICAgICBpZiAoZGVidWdPbikKLSAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oICJEZWJ1ZzoiICsgc3RyICk7IC8vJE5PTi1OTFMtMSQKLSAgIH0KLQotICAgc3RhdGljIENvbG9yIGdldENvbG9yKFN0cmluZyBzUEJHKQotICAgewotICAgICAgICAgLy8gQ2hlY2sgaWYgYSBwcmUtZGVmaW5lZCBjb2xvciBpcyBzcGVjaWZpZWQuCi0gICAgICBzUEJHID0gc1BCRy50cmltKCk7Ci0gICAgICBpZiAoc1BCRy5lcXVhbHNJZ25vcmVDYXNlKCJibGFjayIpKSAvLyROT04tTkxTLTEkCi0gICAgICAgIHJldHVybihDb2xvci5ibGFjayk7Ci0gICAgICBpZiAoc1BCRy5lcXVhbHNJZ25vcmVDYXNlKCJibHVlIikpIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgcmV0dXJuKENvbG9yLmJsdWUpOwotICAgICAgaWYgKHNQQkcuZXF1YWxzSWdub3JlQ2FzZSgiY3lhbiIpKSAvLyROT04tTkxTLTEkCi0gICAgICAgIHJldHVybihDb2xvci5jeWFuKTsKLSAgICAgIGlmIChzUEJHLmVxdWFsc0lnbm9yZUNhc2UoImRhcmtHcmF5IikpIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgcmV0dXJuKENvbG9yLmRhcmtHcmF5KTsKLSAgICAgIGlmIChzUEJHLmVxdWFsc0lnbm9yZUNhc2UoImdyYXkiKSkgLy8kTk9OLU5MUy0xJAotICAgICAgICByZXR1cm4oQ29sb3IuZ3JheSk7Ci0gICAgICBpZiAoc1BCRy5lcXVhbHNJZ25vcmVDYXNlKCJncmVlbiIpKSAvLyROT04tTkxTLTEkCi0gICAgICAgIHJldHVybihDb2xvci5ncmVlbik7Ci0gICAgICBpZiAoc1BCRy5lcXVhbHNJZ25vcmVDYXNlKCJsaWdodEdyYXkiKSkgLy8kTk9OLU5MUy0xJAotICAgICAgICByZXR1cm4oQ29sb3IubGlnaHRHcmF5KTsKLSAgICAgIGlmIChzUEJHLmVxdWFsc0lnbm9yZUNhc2UoIm1hZ2VudGEiKSkgLy8kTk9OLU5MUy0xJAotICAgICAgICByZXR1cm4oQ29sb3IubWFnZW50YSk7Ci0gICAgICBpZiAoc1BCRy5lcXVhbHNJZ25vcmVDYXNlKCJvcmFuZ2UiKSkgLy8kTk9OLU5MUy0xJAotICAgICAgICByZXR1cm4oQ29sb3Iub3JhbmdlKTsKLSAgICAgIGlmIChzUEJHLmVxdWFsc0lnbm9yZUNhc2UoInBpbmsiKSkgLy8kTk9OLU5MUy0xJAotICAgICAgICByZXR1cm4oQ29sb3IucGluayk7Ci0gICAgICBpZiAoc1BCRy5lcXVhbHNJZ25vcmVDYXNlKCJyZWQiKSkgLy8kTk9OLU5MUy0xJAotICAgICAgICByZXR1cm4oQ29sb3IucmVkKTsKLSAgICAgIGlmIChzUEJHLmVxdWFsc0lnbm9yZUNhc2UoIndoaXRlIikpIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgcmV0dXJuKENvbG9yLndoaXRlKTsKLSAgICAgIGlmIChzUEJHLmVxdWFsc0lnbm9yZUNhc2UoInllbGxvdyIpKSAvLyROT04tTkxTLTEkCi0gICAgICAgIHJldHVybihDb2xvci55ZWxsb3cpOwotICAgICAgZWxzZQotICAgICAgewotICAgICAgIC8vIElmIHRoZSBjb2xvciBpcyBzcGVjaWZpZWQgaW4gSFRNTCBmb3JtYXQsIGJ1aWxkIGl0IGZyb20gdGhlIHJlZCwgZ3JlZW4gYW5kIGJsdWUgdmFsdWVzCi0gICAgICBpbnQgaVJlZCA9IDI1NTsKLSAgICAgIGludCBpQmx1ZSA9IDI1NTsKLSAgICAgIGludCBpR3JlZW4gPSAyNTU7Ci0gICAgICBpZiAoc1BCRy5sZW5ndGgoKSA9PSA3ICYmIHNQQkcuY2hhckF0KDApID09ICcjJykKLSAgICAgIHsKLSAgICAgICAgaVJlZCA9IEludGVnZXIucGFyc2VJbnQoc1BCRy5zdWJzdHJpbmcoMSwzKSwxNik7Ci0gICAgICAgIGlHcmVlbiA9IEludGVnZXIucGFyc2VJbnQoc1BCRy5zdWJzdHJpbmcoNSw3KSwxNik7Ci0gICAgICAgIGlCbHVlID0gSW50ZWdlci5wYXJzZUludChzUEJHLnN1YnN0cmluZygzLDUpLDE2KTsKLSAgICAgICAgcmV0dXJuKG5ldyBDb2xvcihpUmVkLCBpR3JlZW4sIGlCbHVlKSk7Ci0gICAgICB9Ci0KLSAgICAgICAgU3RyaW5nVG9rZW5pemVyIHBhcnNlciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoc1BCRywgIiwiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgU3RyaW5nIHNSZWQgPSBwYXJzZXIubmV4dFRva2VuKCk7Ci0gICAgICAgICAgICBTdHJpbmcgc0dyZWVuID0gcGFyc2VyLm5leHRUb2tlbigpOwotICAgICAgICAgICAgU3RyaW5nIHNCbHVlID0gcGFyc2VyLm5leHRUb2tlbigpOwotICAgICAgICAgICAgaVJlZCA9IEludGVnZXIucGFyc2VJbnQoc1JlZC50cmltKCkpOwotICAgICAgICAgICAgaUdyZWVuID0gSW50ZWdlci5wYXJzZUludChzR3JlZW4udHJpbSgpKTsKLSAgICAgICAgICAgIGlCbHVlID0gSW50ZWdlci5wYXJzZUludChzQmx1ZS50cmltKCkpOwotICAgICAgICAgICAgcmV0dXJuIG5ldyBDb2xvcihpUmVkLCBpR3JlZW4sIGlCbHVlKTsKLQotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIGUxKQotICAgICAgICB7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIklPLmdldENvbG9yXG5FeGNlcHRpb24gMToiICsgZTEudG9TdHJpbmcoKSArIHNQQkcpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlMikKLSAgICAgICAgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJJTy5nZXRDb2xvclxuRXhjZXB0aW9uIDI6IiArIGUyLnRvU3RyaW5nKCkgKyBzUEJHKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICAgcmV0dXJuIENvbG9yLmJsYWNrOwotICAgIH0KLQotICAgIHN0YXRpYyBGb250IGdldEZvbnQoU3RyaW5nIHNQQkcpCi0gICAgIHsKLSAgICAgICAgU3RyaW5nIGZvbnQgPSAiQXJpYWwiOyAvLyROT04tTkxTLTEkCi0gICAgICAgIFN0cmluZyBzdHlsZSA9ICJQTEFJTiI7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgaW50IHNpemUgPSAxMjsKLSAgICAgICAgaW50IHJlYWxTdHlsZT1Gb250LlBMQUlOOwotICAgICAgICBzUEJHID0gc1BCRy50cmltKCk7Ci0gICAgICAgIFN0cmluZ1Rva2VuaXplciBwYXJzZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHNQQkcsICIsIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgZm9udCA9IHBhcnNlci5uZXh0VG9rZW4oKTsKLSAgICAgICAgICAgZm9udCA9IGZvbnQudHJpbSgpOwotICAgICAgICAgICBpZiAoZm9udC5lcXVhbHNJZ25vcmVDYXNlKCJBcmlhbCIpKSAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgIGZvbnQgPSAiQXJpYWwiOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgIGVsc2UgaWYgKGZvbnQuZXF1YWxzSWdub3JlQ2FzZSgiQ291cmllciIpKSAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgIGZvbnQgPSAiQ291cmllciI7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgZWxzZSBpZiAoZm9udC5lcXVhbHNJZ25vcmVDYXNlKCJEaWFsb2ciKSkgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgIGZvbnQgPSAiRGlhbG9nIjsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICBlbHNlIGlmIChmb250LmVxdWFsc0lnbm9yZUNhc2UoIkhlbHZldGljYSIpKSAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgZm9udCA9ICJIZWx2ZXRpY2EiOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgIGVsc2UgaWYgKGZvbnQuZXF1YWxzSWdub3JlQ2FzZSgiU3ltYm9sIikpIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICBmb250ID0gIlN5bWJvbCI7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgZWxzZSBpZiAoZm9udC5lcXVhbHNJZ25vcmVDYXNlKCJUaW1lc1JvbWFuIikpIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICBmb250ID0gIlRpbWVzUm9tYW4iOyAvLyROT04tTkxTLTEkCi0KLSAgICAgICAgICAgc3R5bGUgPSBwYXJzZXIubmV4dFRva2VuKCk7Ci0gICAgICAgICAgIHN0eWxlID0gc3R5bGUudHJpbSgpOwotICAgICAgICAgICBpZihzdHlsZS5lcXVhbHNJZ25vcmVDYXNlKCJJVEFMSUMiKSkgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICB7Ci0gICAgICAgICAgICAgcmVhbFN0eWxlPUZvbnQuSVRBTElDOwotICAgICAgICAgICB9Ci0gICAgICAgICAgIGVsc2UgaWYoc3R5bGUuZXF1YWxzSWdub3JlQ2FzZSgiQk9MRCIpKSAvLyROT04tTkxTLTEkCi0gICAgICAgICAgIHsKLSAgICAgICAgICAgICByZWFsU3R5bGU9Rm9udC5CT0xEOwotICAgICAgICAgICB9Ci0gICAgICAgICAgIGVsc2UgaWYoc3R5bGUuZXF1YWxzSWdub3JlQ2FzZSgiQk9MRElUQUxJQyIpKSAvLyROT04tTkxTLTEkCi0gICAgICAgICAgIHsKLSAgICAgICAgICAgICByZWFsU3R5bGU9Rm9udC5CT0xEICsgRm9udC5CT0xEOwotICAgICAgICAgICB9Ci0gICAgICAgICAgIHNpemUgPSBuZXcgSW50ZWdlcihwYXJzZXIubmV4dFRva2VuKCkudHJpbSgpKS5pbnRWYWx1ZSgpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIGUxKQotICAgICAgICB7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIklPLmdldEZvbnRcbkV4Y2VwdGlvbiAxOiIgKyBlMS50b1N0cmluZygpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZTIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiSU8uZ2V0Rm9udFxuRXhjZXB0aW9uIDI6IiArIGUyLnRvU3RyaW5nKCkpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIH0KLSAgICAgICByZXR1cm4gbmV3IEZvbnQoZm9udCwgcmVhbFN0eWxlLCBzaXplKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvc2VydmljZXMvaW5kZXgvSmFyUmVzb3VyY2VzLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvc2VydmljZXMvaW5kZXgvSmFyUmVzb3VyY2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1MWIyMTAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3NlcnZpY2VzL2luZGV4L0phclJlc291cmNlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnNlcnZpY2VzLmluZGV4OwotCi1pbXBvcnQgamF2YS5pby5CdWZmZXJlZElucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRGF0YUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC56aXAuWmlwRW50cnk7Ci1pbXBvcnQgamF2YS51dGlsLnppcC5aaXBJbnB1dFN0cmVhbTsKLS8qKgotICogSmFyUmVzb3VyY2VzOiBKYXJSZXNvdXJjZXMgbWFwcyBhbGwgcmVzb3VyY2VzIGluY2x1ZGVkIGluIGEKLSAqIFppcCBvciBKYXIgZmlsZS4gQWRkaXRpb25hbHksIGl0IHByb3ZpZGVzIGEgbWV0aG9kIHRvIGV4dHJhY3Qgb25lCi0gKiBhcyBhIGJsb2IuCi0gKi8KLWZpbmFsIGNsYXNzIEphclJlc291cmNlcyB7Ci0KLSAgIC8vIGV4dGVybmFsIGRlYnVnIGZsYWcKLSAgIGJvb2xlYW4gZGVidWdPbj1mYWxzZTsKLQotICAgLy8gamFyIHJlc291cmNlIG1hcHBpbmcgdGFibGVzCi0gICBwcml2YXRlIEhhc2h0YWJsZSBodEphckNvbnRlbnRzPW5ldyBIYXNodGFibGUoKTsKLQotICAgLy8gYSBqYXIgZmlsZQotICAgcHJpdmF0ZSBTdHJpbmcgamFyRmlsZU5hbWU7Ci0KLSAgIC8qKgotICAgICogY3JlYXRlcyBhIEphclJlc291cmNlcy4gSXQgZXh0cmFjdHMgYWxsIHJlc291cmNlcyBmcm9tIGEgSmFyCi0gICAgKiBpbnRvIGFuIGludGVybmFsIGhhc2h0YWJsZSwga2V5ZWQgYnkgcmVzb3VyY2UgbmFtZXMuCi0gICAgKiBAcGFyYW0gamFyRmlsZU5hbWUgYSBqYXIgb3IgemlwIGZpbGUKLSAgICAqLwotICAgSmFyUmVzb3VyY2VzKFN0cmluZyBqYXJGaWxlTmFtZSkgewotICAgICAgdGhpcy5qYXJGaWxlTmFtZT1qYXJGaWxlTmFtZTsKLSAgICAgIGluaXQoKTsKLSAgIH0KLQotICAgLyoqCi0gICAgKiBFeHRyYWN0cyBhIGphciByZXNvdXJjZSBhcyBhIGJsb2IuCi0gICAgKiBAcGFyYW0gbmFtZSBhIHJlc291cmNlIG5hbWUuCi0gICAgKi8KLSAgIGJ5dGVbXSBnZXRSZXNvdXJjZShTdHJpbmcgbmFtZSkgewotICAgICAgcmV0dXJuIChieXRlW10paHRKYXJDb250ZW50cy5nZXQobmFtZSk7Ci0gICB9Ci0KLSAgIGJ5dGVbXSBnZXRSZXNvdXJjZSgpCi0gICB7Ci0gICAgICBFbnVtZXJhdGlvbiBrZXlzID0gaHRKYXJDb250ZW50cy5rZXlzKCk7Ci0gICAgICByZXR1cm4gKGJ5dGVbXSlodEphckNvbnRlbnRzLmdldChrZXlzLm5leHRFbGVtZW50KCkpOwotICAgfQotCi0vKioKLSAgKiBpbml0aWFsaXplcyBpbnRlcm5hbCBoYXNoIHRhYmxlcyB3aXRoIEphciBmaWxlIHJlc291cmNlcy4KLSAgKi8KLXByaXZhdGUgdm9pZCBpbml0KCkgewotICB0cnkgewotICAgICAgLy8gU3lzdGVtLm91dC5wcmludGxuKCJQcm9jZXNzaW5nIEphciBBcmNoaXZlICIgKyBqYXJGaWxlTmFtZSk7Ci0JICBEYXRhSW5wdXRTdHJlYW0gaW4gPSBudWxsOwotICAgICAgaWYoamFyRmlsZU5hbWUuc3RhcnRzV2l0aChEZWYuSHR0cCkgfHwgamFyRmlsZU5hbWUuc3RhcnRzV2l0aChEZWYuSHR0cHMpfHwgamFyRmlsZU5hbWUuc3RhcnRzV2l0aChEZWYuRmlsZSkpCi0gICAgICB7Ci0gICAgICAgIC8vIFN5c3RlbS5vdXQucHJpbnRsbigiT3BlbmluZyB0aGUgSmFyIEZpbGUgYXMgYSBVUkwgc3RyZWFtIik7Ci0JCWluID0gbmV3IERhdGFJbnB1dFN0cmVhbSggbmV3IFVSTChqYXJGaWxlTmFtZSkub3BlblN0cmVhbSgpICk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiT3BlbmluZyB0aGUgSmFyIEZpbGUgYXMgYSBsb2NhbCBmaWxlIHN0cmVhbSIpOwotICAgICAgICBpbiA9IG5ldyBEYXRhSW5wdXRTdHJlYW0oIG5ldyBGaWxlSW5wdXRTdHJlYW0oamFyRmlsZU5hbWUpKTsKLSAgICAgIH0KLSAgICAgIC8vIGV4dHJhY3QgcmVzb3VyY2VzIGFuZCBwdXQgdGhlbSBpbnRvIHRoZSBoYXNodGFibGUuCi0gICAgICBCdWZmZXJlZElucHV0U3RyZWFtIGJpcz1uZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShpbik7Ci0gICAgICBaaXBJbnB1dFN0cmVhbSB6aXM9bmV3IFppcElucHV0U3RyZWFtKGJpcyk7Ci0gICAgICBaaXBFbnRyeSB6ZT1udWxsOwotICAgICAgd2hpbGUgKCh6ZT16aXMuZ2V0TmV4dEVudHJ5KCkpIT1udWxsKQotICAgICAgewotICAgICAgICBpZiAoemUuaXNEaXJlY3RvcnkoKSkgewotICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBpZiAoZGVidWdPbikgewotICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oCi0gICAgICAgICAgICAgICJ6ZS5nZXROYW1lKCk9Iit6ZS5nZXROYW1lKCkrIiwiKyJnZXRTaXplKCk9Iit6ZS5nZXRTaXplKCkgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLSAgICAgICAgICAgKTsKLSAgICAgICAgfQotICAgICAgICBpbnQgc2l6ZT0oaW50KXplLmdldFNpemUoKTsKLSAgICAgICAgLy8gLTEgbWVhbnMgdW5rbm93biBzaXplLgotCQlpZiAoIHNpemUgPT0gLTEgKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkVSUk9SOiBSZXR1cm5lZCBzaXplIG9mIHppcCBmaWxlIGlzIC0xLiBGaWxlbmFtZTogIiArIHplLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0gICAgICAgIGJ5dGVbXSBiPW5ldyBieXRlWyhpbnQpc2l6ZV07Ci0gICAgICAgIGludCByYj0wOwotICAgICAgICBpbnQgY2h1bms9MDsKLSAgICAgICAgd2hpbGUgKCgoaW50KXNpemUgLSByYikgPiAwKSB7Ci0gICAgICAgICAgIGNodW5rPXppcy5yZWFkKGIscmIsKGludClzaXplIC0gcmIpOwotICAgICAgICAgICBpZiAoY2h1bms9PS0xKSB7Ci0gICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgfQotICAgICAgICAgICByYis9Y2h1bms7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gYWRkIHRvIGludGVybmFsIHJlc291cmNlIGhhc2h0YWJsZQotICAgICAgICBodEphckNvbnRlbnRzLnB1dCh6ZS5nZXROYW1lKCksYik7Ci0gICAgICAgIGlmIChkZWJ1Z09uKSB7Ci0gICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigKLSAgICAgICAgICAgICAgIHplLmdldE5hbWUoKSsiICByYj0iK3JiKyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAiLHNpemU9IitzaXplKyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAiLGNzaXplPSIremUuZ2V0Q29tcHJlc3NlZFNpemUoKSAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICApOwotICAgICAgICB9Ci0gICAgIH0KLSAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgewotICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImRvbmUuIik7IC8vJE5PTi1OTFMtMSQKLSAgfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLSAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICB9Ci19Ci0KLSAgIC8qKgotICAgICogRHVtcHMgYSB6aXAgZW50cnkgaW50byBhIHN0cmluZy4KLSAgICAqIEBwYXJhbSB6ZSBhIFppcEVudHJ5Ci0gICAgKi8KLSAgIHByaXZhdGUgU3RyaW5nIGR1bXBaaXBFbnRyeShaaXBFbnRyeSB6ZSkgewotICAgICAgIFN0cmluZ0J1ZmZlciBzYj1uZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgaWYgKHplLmlzRGlyZWN0b3J5KCkpIHsKLSAgICAgICAgICBzYi5hcHBlbmQoImQgIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICB9IGVsc2UgewotICAgICAgICAgIHNiLmFwcGVuZCgiZiAiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgIH0KLSAgICAgICBpZiAoemUuZ2V0TWV0aG9kKCk9PVppcEVudHJ5LlNUT1JFRCkgewotICAgICAgICAgIHNiLmFwcGVuZCgic3RvcmVkICAgIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICB9IGVsc2UgewotICAgICAgICAgIHNiLmFwcGVuZCgiZGVmYWx0ZWQgIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICB9Ci0gICAgICAgc2IuYXBwZW5kKHplLmdldE5hbWUoKSk7Ci0gICAgICAgc2IuYXBwZW5kKCJcdCIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgc2IuYXBwZW5kKCIiK3plLmdldFNpemUoKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICBpZiAoemUuZ2V0TWV0aG9kKCk9PVppcEVudHJ5LkRFRkxBVEVEKSB7Ci0gICAgICAgICAgc2IuYXBwZW5kKCIvIit6ZS5nZXRDb21wcmVzc2VkU2l6ZSgpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgIH0KLSAgICAgICByZXR1cm4gKHNiLnRvU3RyaW5nKCkpOwotICAgfQotCi19CS8vIEVuZCBvZiBKYXJSZXNvdXJjZXMgY2xhc3MuCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvc2VydmljZXMvaW5kZXgvS2V5V29yZC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3NlcnZpY2VzL2luZGV4L0tleVdvcmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2QzZTAwNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvc2VydmljZXMvaW5kZXgvS2V5V29yZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzU2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnNlcnZpY2VzLmluZGV4OwotCi1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW1Xcml0ZXI7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotY2xhc3MgS2V5V29yZAotewotICAgcHJpdmF0ZSBTdHJpbmcga2V5V29yZD1udWxsOwotICAgcHJpdmF0ZSBWZWN0b3IgbXlLZXlXb3Jkcz1udWxsOwotICAgcHJpdmF0ZSBWZWN0b3IgbXlEb2N1bWVudHM9bnVsbDsKLSAgIHByaXZhdGUgU3BlY0tleVdvcmQgbXlTcGVjS2V5V29yZD1udWxsOwotICAgcHJpdmF0ZSBLZXlXb3JkIHBhcmVudE09bnVsbDsKLSAgIEtleVdvcmREZWYgZGVmID0gbnVsbDsKLSAgIAotICAgS2V5V29yZChLZXlXb3JkRGVmIGRlZikKLSAgIHsKLQkgICB0aGlzLmRlZiA9IGRlZjsKLQkgICBrZXlXb3JkID0gZGVmLmdldEtleSgpOwotICAgfQotCi0gICBwcml2YXRlIEtleVdvcmQoS2V5V29yZERlZiBkZWYsIFN0cmluZyBrZXlXb3JkLCBLZXlXb3JkIGtleSkKLSAgIHsKLQkgICB0aGlzLmRlZiA9IGRlZjsKLQkgICB0aGlzLmtleVdvcmQgPSBrZXlXb3JkOwotCSAgIHRoaXMucGFyZW50TSA9IGtleTsKLQkgICAKLSAgIH0KLQotICAgU3RyaW5nIGdldEtleVdvcmQoKQotICAgewotICAgICByZXR1cm4ga2V5V29yZDsKLSAgIH0KLQotICAgdm9pZCBhZGRLZXlXb3JkKEtleVdvcmREZWYgZGVmLCBTdHJpbmcga2V5LCBEb2N1bWVudCBkb2MpCi0gICB7CSAgIAotICAgICBpbnQgaW5kZXggPSBNaXNjU3RhdGljLmdldEluZGV4KGtleSwgS2V5V29yZEluZGV4SGVscGVyLmRlZk9iai5sZXZlbFNlcGFyYXRvclJlcGxhY2UsIDApOwotICAgICAvL0lmIHRoZSBib3R0b20gb2YgdGhlIGtleXdvcmQgaXMgcmVhY2hlZAotICAgICBpZihpbmRleD09LTEpCi0gICAgIHsKLSAgICAgICAgYWRkRG9jdW1lbnQoZG9jKTsKLSAgICAgfQotICAgICBlbHNlCi0gICAgIHsKLSAgICAgICAgaW50IGluZGV4MiA9ICBNaXNjU3RhdGljLmdldEluZGV4KGtleSwgS2V5V29yZEluZGV4SGVscGVyLmRlZk9iai5sZXZlbFNlcGFyYXRvclJlcGxhY2UsIGluZGV4KzEpOwotICAgICAgICBTdHJpbmcgbmV4dEtleVdvcmQ9bnVsbDsKLSAgICAgICAgaWYoaW5kZXgyIT0tMSkKLSAgICAgICAgewotICAgICAgICAgICBuZXh0S2V5V29yZCA9IGtleS5zdWJzdHJpbmcoaW5kZXgrMSxpbmRleDIpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIG5leHRLZXlXb3JkID0ga2V5LnN1YnN0cmluZyhpbmRleCsxKTsKLSAgICAgICAgfQotCi0gICAgICAgIEtleVdvcmQgdG1wS2V5ID0gY3JlYXRlS2V5V29yZChkZWYsIG5leHRLZXlXb3JkKTsKLSAgICAgICAgaWYodG1wS2V5IT1udWxsKQotICAgICAgICB7Ci0gICAgICAgICAgdG1wS2V5LmFkZEtleVdvcmQoZGVmLCBrZXkuc3Vic3RyaW5nKGluZGV4KzEpLCBkb2MpOwotICAgICAgICB9Ci0gICAgIH0KLSAgIH0KLQotICAgdm9pZCBzZXRTcGVjS2V5V29yZChTdHJpbmcgcmVsYXRlZEtleSwgYm9vbGVhbiBzZWUpCi0gICB7Ci0gICAgIElPLnByaW50RGVidWcoInNldFNwZWNLZXlXb3JkICIgKyByZWxhdGVkS2V5KTsgLy8kTk9OLU5MUy0xJAotICAgICBteVNwZWNLZXlXb3JkID0gbmV3IFNwZWNLZXlXb3JkKHJlbGF0ZWRLZXksIHNlZSk7Ci0gICB9Ci0KLSAgIHZvaWQgaW5zZXJ0U3BlY0tleVdvcmQoU3RyaW5nIHNwZWNLZXlXb3JkU3RyaW5nLCBTdHJpbmcgcmVsYXRlZEtleVdvcmQpCi0gICB7Ci0KLSAgICAgIGJvb2xlYW4gZm91bmQ9ZmFsc2U7Ci0gICAgICBpbnQgaT0wOwotICAgICAgU3RyaW5nIGZpcnN0S2V5V29yZCA9IHNwZWNLZXlXb3JkU3RyaW5nOwotICAgICAgaW50IHBvcyA9IHNwZWNLZXlXb3JkU3RyaW5nLmluZGV4T2YoS2V5V29yZEluZGV4SGVscGVyLmRlZk9iai5sZXZlbFNlcGFyYXRvclJlcGxhY2UsMCk7Ci0gICAgICBpZihwb3MhPS0xKQotICAgICAgewotICAgICAgICBmaXJzdEtleVdvcmQgPSBzcGVjS2V5V29yZFN0cmluZy5zdWJzdHJpbmcoMCxwb3MpOwotICAgICAgfQotCi0gICAgICB3aGlsZSghZm91bmQgJiYgbXlLZXlXb3JkcyE9bnVsbCAmJiBpPG15S2V5V29yZHMuc2l6ZSgpKQotICAgICAgewotICAgICAgICAgS2V5V29yZCB0bXBLID0gIChLZXlXb3JkKW15S2V5V29yZHMuZWxlbWVudEF0KGkpOwotICAgICAgICAgaWYoZmlyc3RLZXlXb3JkLmVxdWFscyh0bXBLLmdldEtleVdvcmQoKSkpCi0gICAgICAgICB7Ci0KLSAgICAgICAgIGZvdW5kPXRydWU7Ci0gICAgICAgICBpZihwb3MhPS0xKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHRtcEsuaW5zZXJ0U3BlY0tleVdvcmQoc3BlY0tleVdvcmRTdHJpbmcuc3Vic3RyaW5nKHBvcysxKSwgcmVsYXRlZEtleVdvcmQpOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgewotICAgICAgICAgICAgdG1wSy5zZXRTcGVjS2V5V29yZChyZWxhdGVkS2V5V29yZCwgZmFsc2UpOwotICAgICAgICAgIH0KLSAgICAgICAgIH0KLSAgICAgICAgICBpKys7Ci0gICAgICB9Ci0gICAgICBpZighZm91bmQpCi0gICAgICB7Ci0gICAgICAgICBpbnQgaW5kZXg9LTE7Ci0gICAgICAgICBpPTA7Ci0gICAgICAgICBLZXlXb3JkIG5ld0tleVdvcmQyID0gbmV3IEtleVdvcmQobnVsbCwgZmlyc3RLZXlXb3JkLCB0aGlzKTsKLSAgICAgICAgIElPLnByaW50RGVidWcoIm5ldyBrZXl3b3JkICIgKyBmaXJzdEtleVdvcmQpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICBpZihwb3M9PS0xKQotICAgICAgICAgewotICAgICAgICAgICBuZXdLZXlXb3JkMi5zZXRTcGVjS2V5V29yZChyZWxhdGVkS2V5V29yZCwgdHJ1ZSk7Ci0gICAgICAgICB9Ci0gICAgICAgICBlbHNlCi0gICAgICAgICB7Ci0gICAgICAgICAgICAgbmV3S2V5V29yZDIuaW5zZXJ0U3BlY0tleVdvcmQoc3BlY0tleVdvcmRTdHJpbmcuc3Vic3RyaW5nKHBvcysxKSwgcmVsYXRlZEtleVdvcmQpOwotICAgICAgICAgfQotICAgICAgICAgaWYobXlLZXlXb3Jkcz09bnVsbCkKLSAgICAgICAgIHsKLSAgICAgICAgICAgIElPLnByaW50RGVidWcoIm15S2V5V29yZHMiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgbXlLZXlXb3JkcyA9IG5ldyBWZWN0b3IoKTsKLSAgICAgICAgIH0KLSAgICAgICAgIHdoaWxlKGluZGV4PT0tMSAmJiBpPG15S2V5V29yZHMuc2l6ZSgpKQotICAgICAgICAgewotICAgICAgICAgICAgS2V5V29yZCB0bXBLID0gIChLZXlXb3JkKW15S2V5V29yZHMuZWxlbWVudEF0KGkpOwotICAgICAgICAgICAgaWYobmV3S2V5V29yZDIuZ2V0S2V5V29yZCgpLnRvVXBwZXJDYXNlKCkuCi0gICAgICAgICAgICAgICAgICBjb21wYXJlVG8odG1wSy5nZXRLZXlXb3JkKCkudG9VcHBlckNhc2UoKSk8MCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpbmRleCA9IGk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmKG5ld0tleVdvcmQyLmdldEtleVdvcmQoKS50b1VwcGVyQ2FzZSgpLgotICAgICAgICAgICAgICAgICAgY29tcGFyZVRvKHRtcEsuZ2V0S2V5V29yZCgpLnRvVXBwZXJDYXNlKCkpPT0wKQotICAgICAgICAgICAgewotCi0gICAgICAgICAgICAgICAgaWYobmV3S2V5V29yZDIuZ2V0S2V5V29yZCgpLmNvbXBhcmVUbyh0bXBLLmdldEtleVdvcmQoKSkhPTApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgIGlmKG5ld0tleVdvcmQyLmdldEtleVdvcmQoKS5jb21wYXJlVG8odG1wSy5nZXRLZXlXb3JkKCkpPjApCi0gICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgaW5kZXggPSBpOwotICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgIGluZGV4ID0gaS0xOwotICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpKys7Ci0gICAgICAgICB9Ci0KLSAgICAgICAgIGlmKGluZGV4IT0tMSkKLSAgICAgICAgIHsKLSAgICAgICAgICAgICAgbXlLZXlXb3Jkcy5pbnNlcnRFbGVtZW50QXQobmV3S2V5V29yZDIsIGluZGV4KTsKLSAgICAgICAgIH0KLSAgICAgICAgIGVsc2UKLSAgICAgICAgIHsKLSAgICAgICAgICAgIG15S2V5V29yZHMuaW5zZXJ0RWxlbWVudEF0KG5ld0tleVdvcmQyLCBteUtleVdvcmRzLnNpemUoKSk7Ci0gICAgICAgICB9Ci0gICAgICB9Ci0gICB9Ci0KLSAgIHByaXZhdGUgS2V5V29yZCBjcmVhdGVLZXlXb3JkKEtleVdvcmREZWYgZGVmLCBTdHJpbmcga2V5KQotICAgewotCi0gICAgIGlmKG15S2V5V29yZHM9PW51bGwpCi0gICAgIHsKLSAgICAgICAgbXlLZXlXb3JkcyA9IG5ldyBWZWN0b3IoKTsKLSAgICAgICAgS2V5V29yZCBuZXdLZXlXb3JkID0gbmV3IEtleVdvcmQoZGVmLCBrZXksIHRoaXMpOwotICAgICAgICBteUtleVdvcmRzLmFkZEVsZW1lbnQobmV3S2V5V29yZCk7Ci0gICAgICAgIHJldHVybiBuZXdLZXlXb3JkOwotICAgICB9Ci0gICAgIGVsc2UKLSAgICAgewotICAgICAgICBpbnQgaW5kZXg9LTE7Ci0gICAgICAgICBpbnQgaT0wOwotICAgICAgICAgIEtleVdvcmQgbmV3S2V5V29yZDIgPSBuZXcgS2V5V29yZChkZWYsIGtleSwgdGhpcyk7Ci0gICAgICAgICB3aGlsZShpbmRleD09LTEgJiYgaTxteUtleVdvcmRzLnNpemUoKSkKLSAgICAgICAgIHsKLSAgICAgICAgICAgIEtleVdvcmQgdG1wSyA9ICAoS2V5V29yZClteUtleVdvcmRzLmVsZW1lbnRBdChpKTsKLQotCi0gICAgICAgICAgICBpZihuZXdLZXlXb3JkMi5nZXRLZXlXb3JkKCkudG9VcHBlckNhc2UoKS4KLSAgICAgICAgICAgICAgICBjb21wYXJlVG8odG1wSy5nZXRLZXlXb3JkKCkudG9VcHBlckNhc2UoKSk8MCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIGluZGV4ID0gaTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYobmV3S2V5V29yZDIuZ2V0S2V5V29yZCgpLnRvVXBwZXJDYXNlKCkuCi0gICAgICAgICAgICAgICAgY29tcGFyZVRvKHRtcEsuZ2V0S2V5V29yZCgpLnRvVXBwZXJDYXNlKCkpPT0wKQotICAgICAgICAgICAgewotCi0gICAgICAgICAgICAgICAgaWYobmV3S2V5V29yZDIuZ2V0S2V5V29yZCgpLmNvbXBhcmVUbyh0bXBLLmdldEtleVdvcmQoKSkhPTApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgIGlmKG5ld0tleVdvcmQyLmdldEtleVdvcmQoKS5jb21wYXJlVG8odG1wSy5nZXRLZXlXb3JkKCkpPDApCi0gICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgaW5kZXggPSBpOwotICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgIGluZGV4ID0gaSsxOwotICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIHJldHVybiB0bXBLOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGkrKzsKLSAgICAgICAgIH0KLQotICAgICAgICAgaWYoaW5kZXghPS0xKQotICAgICAgICAgewotICAgICAgICAgICAgICBteUtleVdvcmRzLmluc2VydEVsZW1lbnRBdChuZXdLZXlXb3JkMiwgaW5kZXgpOwotICAgICAgICAgICAgICByZXR1cm4gbmV3S2V5V29yZDI7Ci0gICAgICAgICB9Ci0gICAgICAgICBlbHNlCi0gICAgICAgICB7Ci0gICAgICAgICAgICBteUtleVdvcmRzLmluc2VydEVsZW1lbnRBdChuZXdLZXlXb3JkMiwgbXlLZXlXb3Jkcy5zaXplKCkpOwotICAgICAgICAgICAgcmV0dXJuIG5ld0tleVdvcmQyOwotICAgICAgICAgfQotCi0gICAgIH0KLSAgIH0KLQotICAgcHJpdmF0ZSB2b2lkIGFkZERvY3VtZW50KERvY3VtZW50IGRvYykKLSAgIHsKLSAgICBkb2Muc2V0S2V5V29yZCh0aGlzKTsKLSAgICAgIGlmKG15RG9jdW1lbnRzPT1udWxsKQotICAgICAgewotICAgICAgICAgbXlEb2N1bWVudHMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgICAgICBteURvY3VtZW50cy5hZGRFbGVtZW50KGRvYyk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgICBpbnQgaW5kZXg9LTE7Ci0gICAgICAgICBpbnQgaT0wOwotICAgICAgICAgd2hpbGUoaW5kZXg9PS0xICYmIGk8bXlEb2N1bWVudHMuc2l6ZSgpKQotICAgICAgICAgewotICAgICAgICAgICAgRG9jdW1lbnQgdG1wRCA9ICAoRG9jdW1lbnQpbXlEb2N1bWVudHMuZWxlbWVudEF0KGkpOwotICAgICAgICAgICAgaWYoZG9jLmdldFRpdGxlKCkuY29tcGFyZVRvKHRtcEQuZ2V0VGl0bGUoKSk8MCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpbmRleCA9IGk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpKys7Ci0gICAgICAgICB9Ci0KLSAgICAgICAgIGlmKGluZGV4IT0tMSkKLSAgICAgICAgIHsKLSAgICAgICAgICAgICAgbXlEb2N1bWVudHMuaW5zZXJ0RWxlbWVudEF0KGRvYywgaW5kZXgpOwotICAgICAgICAgfQotICAgICAgICAgZWxzZQotICAgICAgICAgewotICAgICAgICAgICAgbXlEb2N1bWVudHMuaW5zZXJ0RWxlbWVudEF0KGRvYywgbXlEb2N1bWVudHMuc2l6ZSgpKTsKLSAgICAgICAgIH0KLSAgICAgIH0KLSAgIH0KLQotICAgdm9pZCBwcmludChPdXRwdXRTdHJlYW1Xcml0ZXIgb3V0UCwgaW50IGxldmVsKQotICAgewotICAgICBpZihvdXRQPT1udWxsKQotICAgICAgewotICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJLZXlXb3JkOnByaW50XG4iICsgSGVscE1lc3NhZ2VzLkJBRF9PVVRQVVRfU1RSRUFNKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgcmV0dXJuOwotICAgICAgfQotICAgICAgS2V5V29yZEluZGV4SGVscGVyLmRlZk9iai5wcmludFN0YXJ0KG91dFAsbGV2ZWwrMSk7Ci0gICAgICBpZihsZXZlbD09MCkKLSAgICAgIHsKLSAgICAgICAgTWlzY1N0YXRpYy5wcmludChvdXRQLCAiPEEgTkFNRT1cIiIgKyBrZXlXb3JkKyAiXCI+IDwvQT4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgICB9Ci0gICAgICBNaXNjU3RhdGljLnByaW50U3BhY2Uob3V0UCwgbGV2ZWwqNCk7Ci0gICAgICBpZihsZXZlbCE9MCkKLSAgICAgIHsKLSAgICAgICAgTWlzY1N0YXRpYy5wcmludFNwYWNlKG91dFAsMik7Ci0gICAgICB9Ci0gICAgICBpZihteURvY3VtZW50cyE9bnVsbCkKLSAgICAgIHsKLSAgICAgICAgaWYoIUtleVdvcmRJbmRleEhlbHBlci5kZWZPYmouZ2V0U2hvd0RvY3VtZW50VGl0bGUoKSAmJiAhS2V5V29yZEluZGV4SGVscGVyLmRlZk9iai5nZXRNdWxpdERvY3VtZW50S2V5d29yZCgpKQotICAgICAgICB7Ci0gICAgICAgICAgRG9jdW1lbnQgdG1wRCA9IChEb2N1bWVudCkgIG15RG9jdW1lbnRzLmVsZW1lbnRBdCgwKTsKLSAgICAgICAgICB0bXBELnNldEtleVdvcmQodGhpcyk7Ci0gICAgICAgICAgTWlzY1N0YXRpYy5wcmludChvdXRQLCAiPEEgSFJFRj1cIiIgKyB0bXBELmdldFVybCgpICsgIlwiIFRBUkdFVD1cIiIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgICAgICAgKyBLZXlXb3JkSW5kZXhIZWxwZXIuZGVmT2JqLmdldFRhcmdldCgpICsiXCI+IiArIGtleVdvcmQgKyAiPC9BPiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYoIUtleVdvcmRJbmRleEhlbHBlci5kZWZPYmouZ2V0TXVsaXREb2N1bWVudEtleXdvcmQoKSkKLSAgICAgICAgewotICAgICAgICAgICBNaXNjU3RhdGljLnByaW50KG91dFAsIGtleVdvcmQpOwotICAgICAgICAgICBEb2N1bWVudCB0bXBEID0gKERvY3VtZW50KSAgbXlEb2N1bWVudHMuZWxlbWVudEF0KDApOwotICAgICAgICAgICB0bXBELnNldEtleVdvcmQodGhpcyk7Ci0gICAgICAgICAgIHRtcEQucHJpbnQob3V0UCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICBNaXNjU3RhdGljLnByaW50KG91dFAsIGtleVdvcmQpOwotICAgICAgICAgTWlzY1N0YXRpYy5wcmludFNwYWNlKG91dFAsIDEpOwotCi0gICAgICAgICBmb3IoaW50IGk9MDtpPG15RG9jdW1lbnRzLnNpemUoKTtpKyspCi0gICAgICAgICB7Ci0gICAgICAgICAgICBEb2N1bWVudCB0bXBEID0gKERvY3VtZW50KSAgbXlEb2N1bWVudHMuZWxlbWVudEF0KGkpOwotICAgICAgICAgICAgIHRtcEQuc2V0S2V5V29yZCh0aGlzKTsKLSAgICAgICAgICAgIHRtcEQucHJpbnQob3V0UCk7Ci0gICAgICAgICAgICBpZihpIT1teURvY3VtZW50cy5zaXplKCktMSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgTWlzY1N0YXRpYy5wcmludChvdXRQLCAiLCAiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgfQotICAgICAgICAgICAgTWlzY1N0YXRpYy5wcmludChvdXRQLCAiXG4iKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgICBNaXNjU3RhdGljLnByaW50KG91dFAsIGtleVdvcmQpOwotICAgICAgfQotICAgICAgaWYobXlTcGVjS2V5V29yZCE9bnVsbCkKLSAgICAgIHsKLSAgICAgICAgbXlTcGVjS2V5V29yZC5wcmludChvdXRQKTsKLSAgICAgIH0KLQotICAgICAgaWYoS2V5V29yZEluZGV4SGVscGVyLmRlZk9iai5nZXRTdHlsZVNoZWV0KERlZi5EZWZhdWx0U3R5bGUpPT1udWxsKQotICAgICAgewotICAgICAgICBNaXNjU3RhdGljLnByaW50KG91dFAsICI8QlI+Iik7IC8vJE5PTi1OTFMtMSQKLSAgICAgIH0KLSAgICAgIEtleVdvcmRJbmRleEhlbHBlci5kZWZPYmoucHJpbnRFbmQob3V0UCxsZXZlbCsxKTsKLSAgICAgIGlmKG15S2V5V29yZHMhPW51bGwpCi0gICAgICB7Ci0KLSAgICAgICAgIGludCB0bXBMID0gbGV2ZWwrMTsKLSAgICAgICAgIGZvcihpbnQgaT0wO2k8bXlLZXlXb3Jkcy5zaXplKCk7aSsrKQotICAgICAgICAgewotICAgICAgICAgICAgS2V5V29yZCB0bXBLID0gKEtleVdvcmQpICBteUtleVdvcmRzLmVsZW1lbnRBdChpKTsKLSAgICAgICAgICAgIHRtcEsucHJpbnQob3V0UCwgdG1wTCk7Ci0gICAgICAgICB9Ci0gICAgICB9Ci0KLSAgIH0KLQotICAgU3RyaW5nIGdldEFuY2hvcigpCi0gICB7Ci0JICAgaWYgKCB0aGlzLmRlZiAhPSBudWxsKQotICAgICAgewotICAgICAgICAgcmV0dXJuIHRoaXMuZGVmLmdldEFuY2hvcigpOwotICAgICAgfQotCSAgIAotICAgICAgaWYocGFyZW50TSE9bnVsbCkKLSAgICAgIHsKLSAgICAgICAgIHJldHVybiBwYXJlbnRNLmdldEFuY2hvcigpOwotICAgICAgfQotICAgICAgIAotICAgICAgcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0gICB9Ci0gICAKLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy9zZXJ2aWNlcy9pbmRleC9LZXlXb3JkRGVmLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvc2VydmljZXMvaW5kZXgvS2V5V29yZERlZi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOGQ1MGJjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy9zZXJ2aWNlcy9pbmRleC9LZXlXb3JkRGVmLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5zZXJ2aWNlcy5pbmRleDsKLQotLyoqCi0gKiB0aGlzIGNsYXNzIGRlZmluZXMgYSBrZXkgd29yZAotICoKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgIDEuMAotICovCi1jbGFzcyBLZXlXb3JkRGVmIHsKLQotCXByaXZhdGUgU3RyaW5nIGFuY2hvcjsKLQlwcml2YXRlIFN0cmluZyBrZXk7Ci0JcHJpdmF0ZSBTdHJpbmcgdGV4dDsKLQotCXByaXZhdGUgU3RyaW5nIGtleVdvcmRTdHJpbmc7Ci0KLQlLZXlXb3JkRGVmKFN0cmluZyBhbmNob3IpCi0JewotCQl0aGlzKGFuY2hvciwgbnVsbCwgbnVsbCk7Ci0JfQotCi0JS2V5V29yZERlZihTdHJpbmcgYW5jaG9yLCBTdHJpbmcga2V5LCBTdHJpbmcgdGV4dCkKLQl7Ci0JCXRoaXMuYW5jaG9yID0gYW5jaG9yOwotCQl0aGlzLmtleSA9IGtleTsKLQkJdGhpcy50ZXh0ID0gdGV4dDsKLQkJCi0JCWlmICggdGhpcy50ZXh0ID09IG51bGwgKQotCQl7Ci0JCQl0aGlzLnRleHQgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJdGhpcy5rZXlXb3JkU3RyaW5nID0gS2V5V29yZFN0YXRpYy5jb252ZXJ0S2V5V29yZCh0aGlzLmFuY2hvciwgdGhpcy5rZXksIHRoaXMudGV4dCk7Ci0JCWlmICggdGhpcy5rZXkgPT0gbnVsbCB8fCB0aGlzLmtleS5lcXVhbHMoIiIpICkgLy8kTk9OLU5MUy0xJAotCQl7Ci0JCQlpbnQgaW5kZXggPSB0aGlzLmtleVdvcmRTdHJpbmcuaW5kZXhPZihLZXlXb3JkSW5kZXhIZWxwZXIuZGVmT2JqLmxldmVsU2VwYXJhdG9yUmVwbGFjZSk7Ci0JCQlpZiAoIGluZGV4IDwgMCApCi0JCQl7Ci0JCQkJdGhpcy5rZXkgPSB0aGlzLmtleVdvcmRTdHJpbmc7Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJdGhpcy5rZXkgPSB0aGlzLmtleVdvcmRTdHJpbmcuc3Vic3RyaW5nKDAsIGluZGV4KTsKLQkJCX0KLQkJfQotCX0KLQkKLQlTdHJpbmcgZ2V0QW5jaG9yKCkKLQl7Ci0JCXJldHVybiBhbmNob3I7Ci0JfQotCQotCVN0cmluZyBnZXRLZXkoKQotCXsKLQkJcmV0dXJuIGtleTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0JewotCQlyZXR1cm4ga2V5V29yZFN0cmluZzsKLQl9Ci0KLQotCi19Ci0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy9zZXJ2aWNlcy9pbmRleC9LZXlXb3JkRmlsZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3NlcnZpY2VzL2luZGV4L0tleVdvcmRGaWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1NmFkNTkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3NlcnZpY2VzL2luZGV4L0tleVdvcmRGaWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5zZXJ2aWNlcy5pbmRleDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vL1JlcHJlc2VudHMgYSBodG1sIGZpbGUgdGhhdCBjb250YWlucyBrZXl3b3JkcwotY2xhc3MgS2V5V29yZEZpbGUKLXsKLSAgICBwcml2YXRlIFN0cmluZyB0aXRsZT1udWxsOwotICAgIHByaXZhdGUgU3RyaW5nIHVybD1udWxsOwotCi0gICAgcHJpdmF0ZSBpbnQgbmV4dEtleVdvcmQ9MDsKLSAgICBwcml2YXRlIExpc3Qga2V5V29yZFZlY3Rvcj1udWxsOwotCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCS8vIENvbnN0cnVjdG9yLgotICAgIEtleVdvcmRGaWxlKFN0cmluZyB0aXRsZSwgU3RyaW5nIHVybCwgTGlzdCBrZXlXb3JkcykgLy8gbGlzdCBvZiBLZXlXb3JkRGVmIG9iamVjdAotICAgIHsKLSAgICAgICB0aGlzLnRpdGxlID0gdGl0bGU7Ci0gICAgICAgdGhpcy51cmwgPSB1cmw7Ci0gICAgICAgdGhpcy5rZXlXb3JkVmVjdG9yID0gIGtleVdvcmRzOwotICAgIH0KLSAgICAJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBLZXlXb3JkRGVmIGdldE5leHRLZXlXb3JkKCkKLSAgICB7Ci0gICAgICAgaWYobmV4dEtleVdvcmQ8a2V5V29yZFZlY3Rvci5zaXplKCkpCi0gICAgICAgewotICAgIAkgICBLZXlXb3JkRGVmIG5leHQgPSAoS2V5V29yZERlZilrZXlXb3JkVmVjdG9yLmdldChuZXh0S2V5V29yZCk7Ci0gICAgICAgIG5leHRLZXlXb3JkKys7Ci0gICAgICAgIGlmKG5leHQhPW51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICByZXR1cm4gbmV4dDsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICB9Ci0gICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotICAgIAkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIERvY3VtZW50IGdldERvY3VtZW50KFN0cmluZyBrZXlXb3JkLCBpbnQgbm9PZkRvYykKLSAgICB7Ci0KLSAgICAgICAgaWYobm9PZkRvYz4xKQotICAgICAgICB7Ci0gICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG5ldyBEb2N1bWVudCh0aXRsZSwgdXJsKTsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3NlcnZpY2VzL2luZGV4L0tleVdvcmRIb2xkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy9zZXJ2aWNlcy9pbmRleC9LZXlXb3JkSG9sZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkM2MyNGYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3NlcnZpY2VzL2luZGV4L0tleVdvcmRIb2xkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5zZXJ2aWNlcy5pbmRleDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW1Xcml0ZXI7Ci1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgY29tLmlibS5pY3UudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLWNsYXNzIEtleVdvcmRIb2xkZXIgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBsYW5nID0gTG9jYWxlLmdldERlZmF1bHQoKS5nZXRMYW5ndWFnZSgpOwotCi0JcHJpdmF0ZSBWZWN0b3Iga2V5V29yZEZpbGVzID0gbnVsbDsKLQotCXByaXZhdGUgVmVjdG9yIGtleVdvcmRzID0gbnVsbDsKLQotCUtleVdvcmRIb2xkZXIoKSB7Ci0JCWtleVdvcmRGaWxlcyA9IG5ldyBWZWN0b3IoKTsKLQl9Ci0KLQl2b2lkIGFkZChLZXlXb3JkRmlsZSBrZXkpIHsKLQkJa2V5V29yZEZpbGVzLmFkZEVsZW1lbnQoa2V5KTsKLQl9Ci0KLQl2b2lkIGRpdmlkZSgpIHsKLQkJaWYgKGtleVdvcmRGaWxlcyAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGtleVdvcmRGaWxlcy5zaXplKCk7IGkrKykgewotCQkJCVN0cmluZyBuZXh0S2V5V29yZCA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQkJS2V5V29yZEZpbGUgdG1wID0gKEtleVdvcmRGaWxlKSBrZXlXb3JkRmlsZXMuZWxlbWVudEF0KGkpOwotCQkJCXdoaWxlIChuZXh0S2V5V29yZCAhPSBudWxsKSB7Ci0JCQkJCW5leHRLZXlXb3JkID0gbnVsbDsKLQkJCQkJS2V5V29yZERlZiBkZWYgPSB0bXAuZ2V0TmV4dEtleVdvcmQoKTsKLQkJCQkJaWYgKGRlZiAhPSBudWxsKSB7Ci0JCQkJCQluZXh0S2V5V29yZCA9IGRlZi50b1N0cmluZygpOwotCQkJCQl9Ci0KLQkJCQkJaWYgKG5leHRLZXlXb3JkICE9IG51bGwpIHsKLQotCQkJCQkJaW50IG5vT2ZEb2MgPSAxOwotCQkJCQkJRG9jdW1lbnQgdG1wRCA9IHRtcC5nZXREb2N1bWVudChuZXh0S2V5V29yZCwgbm9PZkRvYyk7Ci0KLQkJCQkJCXdoaWxlICh0bXBEICE9IG51bGwpIHsKLQkJCQkJCQlpbnQgaW5kZXggPSBNaXNjU3RhdGljCi0JCQkJCQkJCQkuZ2V0SW5kZXgoCi0JCQkJCQkJCQkJCW5leHRLZXlXb3JkLAotCQkJCQkJCQkJCQlLZXlXb3JkSW5kZXhIZWxwZXIuZGVmT2JqLmxldmVsU2VwYXJhdG9yUmVwbGFjZSwKLQkJCQkJCQkJCQkJMCk7Ci0JCQkJCQkJaWYgKGluZGV4ID09IC0xKSB7Ci0JCQkJCQkJCWluZGV4ID0gbmV4dEtleVdvcmQubGVuZ3RoKCk7Ci0JCQkJCQkJfQotCi0JCQkJCQkJS2V5V29yZCB0bXBLID0gY3JlYXRlS2V5V29yZChkZWYpOwotCQkJCQkJCWlmICh0bXBLICE9IG51bGwgJiYgdG1wRCAhPSBudWxsKSB7Ci0JCQkJCQkJCXRtcEsuYWRkS2V5V29yZChkZWYsIG5leHRLZXlXb3JkLCB0bXBEKTsKLQkJCQkJCQl9Ci0KLQkJCQkJCQlub09mRG9jKys7Ci0JCQkJCQkJdG1wRCA9IHRtcC5nZXREb2N1bWVudChuZXh0S2V5V29yZCwgbm9PZkRvYyk7Ci0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgS2V5V29yZCBjcmVhdGVLZXlXb3JkKEtleVdvcmREZWYgZGVmKSB7Ci0KLQkJaWYgKGtleVdvcmRzID09IG51bGwpIHsKLQkJCWtleVdvcmRzID0gbmV3IFZlY3RvcigpOwotCQkJS2V5V29yZCBuZXdLZXlXb3JkID0gbmV3IEtleVdvcmQoZGVmKTsKLQkJCWtleVdvcmRzLmFkZEVsZW1lbnQobmV3S2V5V29yZCk7Ci0JCQlyZXR1cm4gbmV3S2V5V29yZDsKLQkJfSBlbHNlIHsKLQkJCWludCBpbmRleCA9IC0xOwotCQkJaW50IGkgPSAwOwotCQkJS2V5V29yZCBuZXdLZXlXb3JkMiA9IG5ldyBLZXlXb3JkKGRlZik7Ci0JCQlTdHJpbmcgc3RyMiA9IG5ld0tleVdvcmQyLmdldEtleVdvcmQoKTsKLQotCQkJd2hpbGUgKGluZGV4ID09IC0xICYmIGkgPCBrZXlXb3Jkcy5zaXplKCkpIHsKLQkJCQlLZXlXb3JkIHRtcEsgPSAoS2V5V29yZCkga2V5V29yZHMuZWxlbWVudEF0KGkpOwotCQkJCVN0cmluZyBzdHIgPSB0bXBLLmdldEtleVdvcmQoKTsKLQkJCQlpbnQgY21wID0gc3RyMi50b1VwcGVyQ2FzZSgpLmNvbXBhcmVUbyhzdHIudG9VcHBlckNhc2UoKSk7Ci0JCQkJaWYgKGNtcCA8IDApIHsKLQkJCQkJaW5kZXggPSBpOwotCQkJCX0gZWxzZSBpZiAoY21wID09IDApIHsKLQkJCQkJaW50IGNtcDIgPSBzdHIyLmNvbXBhcmVUbyhzdHIpOwotCQkJCQlpZiAoY21wMiAhPSAwKSB7Ci0JCQkJCQkKLQkJCQkJCS8vIHRoaXMgaXMgd3JvbmcsIHdpbGwgcHV0IHRoZSBlbnRyeSB0byB0aGUgcHJldmlvdXMgaXRlbQotLy8JCQkJCQlpZiAoY21wMiA+IDApIHsKLS8vCQkJCQkJCWluZGV4ID0gaTsKLS8vCQkJCQkJfSBlbHNlIHsKLS8vCQkJCQkJCWluZGV4ID0gaSAtIDE7Ci0vLwkJCQkJCX0KLQkJCQkJCWlmIChjbXAyIDwgMCkgewotCQkJCQkJCWluZGV4ID0gaTsKLQkJCQkJCX0KLQkJCQkJfSBlbHNlIHsKLQkJCQkJCXJldHVybiB0bXBLOwotCQkJCQl9Ci0JCQkJfQotCQkJCWkrKzsKLQkJCX0KLQotCQkJaWYgKGluZGV4ID09IC0xKSB7Ci0JCQkJaW5kZXggPSBrZXlXb3Jkcy5zaXplKCk7Ci0JCQl9Ci0JCQlrZXlXb3Jkcy5pbnNlcnRFbGVtZW50QXQobmV3S2V5V29yZDIsIGluZGV4KTsKLQkJCQotCQkJcmV0dXJuIG5ld0tleVdvcmQyOwotCi0JCX0KLQl9Ci0KLQl2b2lkIHJlYWRTcGVjS2V5V29yZHMoU3RyaW5nVG9rZW5pemVyIHBhcnNlcikgewotCQl3aGlsZSAocGFyc2VyLmhhc01vcmVUb2tlbnMoKSkgewotCQkJU3RyaW5nIHNwZWNLZXlXb3JkU3RyaW5nID0gcGFyc2VyLm5leHRUb2tlbigpLnRyaW0oKTsKLQkJCVN0cmluZyByZWxhdGVkS2V5V29yZCA9IHBhcnNlci5uZXh0VG9rZW4oKS50cmltKCk7Ci0JCQlLZXlXb3JkRGVmIHNwZWNLZXlEZWYgPSBuZXcgS2V5V29yZERlZihzcGVjS2V5V29yZFN0cmluZyk7Ci0JCQlLZXlXb3JkRGVmIHJlbGF0ZWRLZXlEZWYgPSBuZXcgS2V5V29yZERlZihyZWxhdGVkS2V5V29yZCk7Ci0KLQkJCXNwZWNLZXlXb3JkU3RyaW5nID0gc3BlY0tleURlZi50b1N0cmluZygpOwotCQkJcmVsYXRlZEtleVdvcmQgPSByZWxhdGVkS2V5V29yZC50b1N0cmluZygpOwotCi0JCQlpZiAoc3BlY0tleVdvcmRTdHJpbmcgIT0gbnVsbCAmJiByZWxhdGVkS2V5V29yZCAhPSBudWxsCi0JCQkJCSYmIHJlbGF0ZWRLZXlXb3JkRXhpc3RzKHNwZWNLZXlXb3JkU3RyaW5nLCByZWxhdGVkS2V5V29yZCkpIHsKLQkJCQlib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0JCQkJaW50IGkgPSAwOwotCQkJCVN0cmluZyBmaXJzdEtleVdvcmQgPSBzcGVjS2V5V29yZFN0cmluZzsKLQkJCQlpbnQgcG9zID0gc3BlY0tleVdvcmRTdHJpbmcuaW5kZXhPZigKLQkJCQkJCUtleVdvcmRJbmRleEhlbHBlci5kZWZPYmoubGV2ZWxTZXBhcmF0b3JSZXBsYWNlLCAwKTsKLQkJCQlpZiAocG9zICE9IC0xKSB7Ci0JCQkJCWZpcnN0S2V5V29yZCA9IHNwZWNLZXlXb3JkU3RyaW5nLnN1YnN0cmluZygwLCBwb3MpOwotCQkJCX0KLQkJCQlJTy5wcmludERlYnVnKCJmaXJzdEtleVdvcmQgIiArIGZpcnN0S2V5V29yZCk7IC8vJE5PTi1OTFMtMSQKLQkJCQl3aGlsZSAoIWZvdW5kICYmIGkgPCBrZXlXb3Jkcy5zaXplKCkpIHsKLQkJCQkJSU8ucHJpbnREZWJ1ZygiaG9sZGVyIGluIGZpcnN0IHdoaWxlICIgKyBpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlLZXlXb3JkIHRtcEsgPSAoS2V5V29yZCkga2V5V29yZHMuZWxlbWVudEF0KGkpOwotCQkJCQlpZiAoZmlyc3RLZXlXb3JkLmVxdWFscyh0bXBLLmdldEtleVdvcmQoKSkpIHsKLQotCQkJCQkJZm91bmQgPSB0cnVlOwotCQkJCQkJaWYgKHBvcyAhPSAtMSkgewotCQkJCQkJCXRtcEsuaW5zZXJ0U3BlY0tleVdvcmQoc3BlY0tleVdvcmRTdHJpbmcKLQkJCQkJCQkJCS5zdWJzdHJpbmcocG9zICsgMSksIHJlbGF0ZWRLZXlXb3JkKTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJdG1wSy5zZXRTcGVjS2V5V29yZChyZWxhdGVkS2V5V29yZCwgZmFsc2UpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWkrKzsKLQkJCQl9Ci0JCQkJaWYgKCFmb3VuZCkgewotCQkJCQlJTy5wcmludERlYnVnKCIhZm91bmQiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlpbnQgaW5kZXggPSAtMTsKLQkJCQkJaSA9IDA7Ci0JCQkJCUtleVdvcmQgbmV3S2V5V29yZDIgPSBuZXcgS2V5V29yZChzcGVjS2V5RGVmKTsKLQkJCQkJaWYgKHBvcyA9PSAtMSkgewotCQkJCQkJbmV3S2V5V29yZDIuc2V0U3BlY0tleVdvcmQocmVsYXRlZEtleVdvcmQsIHRydWUpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJbmV3S2V5V29yZDIuaW5zZXJ0U3BlY0tleVdvcmQoc3BlY0tleVdvcmRTdHJpbmcKLQkJCQkJCQkJLnN1YnN0cmluZyhwb3MgKyAxKSwgcmVsYXRlZEtleVdvcmQpOwotCQkJCQl9Ci0JCQkJCXdoaWxlIChpbmRleCA9PSAtMSAmJiBpIDwga2V5V29yZHMuc2l6ZSgpKSB7Ci0JCQkJCQlJTy5wcmludERlYnVnKCJob2xkZXIgaW4gc2Vjb25kIHdoaWxlICIgKyBpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJS2V5V29yZCB0bXBLID0gKEtleVdvcmQpIGtleVdvcmRzLmVsZW1lbnRBdChpKTsKLQkJCQkJCWlmIChuZXdLZXlXb3JkMi5nZXRLZXlXb3JkKCkudG9VcHBlckNhc2UoKS5jb21wYXJlVG8oCi0JCQkJCQkJCXRtcEsuZ2V0S2V5V29yZCgpLnRvVXBwZXJDYXNlKCkpIDwgMCkgewotCQkJCQkJCWluZGV4ID0gaTsKLQkJCQkJCX0gZWxzZSBpZiAobmV3S2V5V29yZDIuZ2V0S2V5V29yZCgpLnRvVXBwZXJDYXNlKCkKLQkJCQkJCQkJLmNvbXBhcmVUbyh0bXBLLmdldEtleVdvcmQoKS50b1VwcGVyQ2FzZSgpKSA9PSAwKSB7Ci0KLQkJCQkJCQlpZiAobmV3S2V5V29yZDIuZ2V0S2V5V29yZCgpLmNvbXBhcmVUbygKLQkJCQkJCQkJCXRtcEsuZ2V0S2V5V29yZCgpKSAhPSAwKSB7Ci0JCQkJCQkJCWlmIChuZXdLZXlXb3JkMi5nZXRLZXlXb3JkKCkuY29tcGFyZVRvKAotCQkJCQkJCQkJCXRtcEsuZ2V0S2V5V29yZCgpKSA+IDApIHsKLQkJCQkJCQkJCWluZGV4ID0gaTsKLQkJCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJCWluZGV4ID0gaSAtIDE7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQlpKys7Ci0JCQkJCX0KLQotCQkJCQlpZiAoaW5kZXggIT0gLTEpIHsKLQkJCQkJCWtleVdvcmRzLmluc2VydEVsZW1lbnRBdChuZXdLZXlXb3JkMiwgaW5kZXgpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJa2V5V29yZHMuaW5zZXJ0RWxlbWVudEF0KG5ld0tleVdvcmQyLCBrZXlXb3Jkcy5zaXplKCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIHJlbGF0ZWRLZXlXb3JkRXhpc3RzKFN0cmluZyBzcGVjS2V5V29yZFN0cmluZywKLQkJCVN0cmluZyByZWxhdGVkS2V5V29yZCkgewotCQlpZiAoa2V5V29yZHMgIT0gbnVsbCkgewotCQkJaW50IGkgPSAwOwotCi0JCQl3aGlsZSAoaSA8IGtleVdvcmRzLnNpemUoKSkgewotCQkJCUtleVdvcmQgdG1wSyA9IChLZXlXb3JkKSBrZXlXb3Jkcy5lbGVtZW50QXQoaSk7Ci0JCQkJaWYgKHRtcEsuZ2V0S2V5V29yZCgpLmVxdWFscyhyZWxhdGVkS2V5V29yZCkpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJCWkrKzsKLQkJCX0KLQkJfQotCQlTeXN0ZW0uZXJyLnByaW50bG4ocmVsYXRlZEtleVdvcmQKLQkJCQkrIEhlbHBNZXNzYWdlcy5SRUxBVEVEX0tFWVdPUkRfTk9UX0ZPVU5EICsgc3BlY0tleVdvcmRTdHJpbmcpOwotCQlyZXR1cm4gZmFsc2U7Ci0KLQl9Ci0KLQl2b2lkIHByaW50KCkgewotCi0JCWlmIChLZXlXb3JkSW5kZXhIZWxwZXIuZGVmT2JqLmdldEluZGV4UmVzdWx0RmlsZSgpICE9IG51bGwpIHsKLQkJCXByaW50RnJhbWVzZXQoKTsKLQkJCXByaW50SW5kZXgoKTsKLQkJfQotCQlwcmludEtleVdvcmRzKCk7Ci0JfQotCi0JLy8gUHJpbnRzIHRoZSBodG1sZmlsZSBjb250YWluaW5nIHRoZSBmcmFtZXNldAotCXByaXZhdGUgdm9pZCBwcmludEZyYW1lc2V0KCkgewotCQl0cnkgewotCQkJRmlsZSBmaWxlID0gbmV3IEZpbGUoS2V5V29yZEluZGV4SGVscGVyLmRlZk9iai5nZXRXd3dSb290KCkKLQkJCQkJKyBLZXlXb3JkSW5kZXhIZWxwZXIuZGVmT2JqLmdldE1haW5SZXN1bHRGaWxlKCkpOwotCQkJaWYgKCFmaWxlLmV4aXN0cygpKSB7Ci0JCQkJZmlsZS5nZXRQYXJlbnRGaWxlKCkubWtkaXJzKCk7Ci0JCQkJZmlsZS5jcmVhdGVOZXdGaWxlKCk7Ci0JCQl9Ci0KLQkJCU91dHB1dFN0cmVhbVdyaXRlciBvdXRQOwotCQkJaWYgKEtleVdvcmRJbmRleEhlbHBlci5kZWZPYmouZ2V0Q2hhcmFjdGVyU2V0KCkgIT0gbnVsbCkgewotCQkJCW91dFAgPSBuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKG5ldyBGaWxlT3V0cHV0U3RyZWFtKGZpbGUpLAotCQkJCQkJS2V5V29yZEluZGV4SGVscGVyLmRlZk9iai5nZXRDaGFyYWN0ZXJTZXQoKSk7Ci0JCQl9IGVsc2UgewotCQkJCW91dFAgPSBuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKG5ldyBGaWxlT3V0cHV0U3RyZWFtKGZpbGUpKTsKLQkJCX0KLQkJCVN5c3RlbS5vdXQucHJpbnRsbihIZWxwTWVzc2FnZXMuV1JJVEVfRklMRQotCQkJCQkrIEtleVdvcmRJbmRleEhlbHBlci5kZWZPYmouZ2V0V3d3Um9vdCgpCi0JCQkJCSsgIiIgKyBLZXlXb3JkSW5kZXhIZWxwZXIuZGVmT2JqLmdldE1haW5SZXN1bHRGaWxlKCkpOyAvLyROT04tTkxTLTEkCi0JCQkvL01pc2NTdGF0aWMucHJpbnQob3V0UCwgIjwhRE9DVFlQRSBIVE1MIFBVQkxJQyBcIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOXCIgXCJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkXCI+XG4iKTsgLy8kTk9OLU5MUy0xJAotCQkJTWlzY1N0YXRpYy5wcmludChvdXRQLCAiPGh0bWwgbGFuZz1cIiIgKyBsYW5nICsgIlwiIHhtbDpsYW5nPVwiIiArIGxhbmcgKyAiXCI+XG4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCU1pc2NTdGF0aWMucHJpbnQob3V0UCwgIjxoZWFkPlxuIik7IC8vJE5PTi1OTFMtMSQKLQkJCU1pc2NTdGF0aWMKLQkJCQkJLnByaW50KG91dFAsCi0JCQkJCQkJIjxNRVRBIGh0dHAtZXF1aXY9XCJDb250ZW50LVR5cGVcIiBjb250ZW50PVwidGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04XCI+XG4iKTsgLy8kTk9OLU5MUy0xJCAgICAgICAgICAKLQkJCU1pc2NTdGF0aWMKLQkJCQkJLnByaW50KAotCQkJCQkJCW91dFAsCi0JCQkJCQkJIjx0aXRsZT4iICsgS2V5V29yZEluZGV4SGVscGVyLmRlZk9iai5nZXRJbmRleFRpdGxlKCkgKyAiPC90aXRsZT5cbiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCU1pc2NTdGF0aWMucHJpbnQob3V0UCwgIjwvaGVhZD5cbiIpOyAvLyROT04tTkxTLTEkCi0JCQlGaWxlIGtleVdvcmRzRmlsZSA9IG5ldyBGaWxlKEtleVdvcmRJbmRleEhlbHBlci5kZWZPYmouZ2V0V3d3Um9vdCgpCi0JCQkJCSsgS2V5V29yZEluZGV4SGVscGVyLmRlZk9iai5nZXRLZXl3b3JkUmVzdWx0RmlsZSgpKTsKLQkJCVN0cmluZyBrZXlXb3JkUGF0aCA9IEtleVdvcmRJbmRleEhlbHBlci5kZWZPYmouZ2V0UmVsYXRpdmVQYXRoKCkKLQkJCQkJKyBLZXlXb3JkSW5kZXhIZWxwZXIuZGVmT2JqLmdldEtleXdvcmRSZXN1bHRGaWxlKCk7Ci0KLQkJCUZpbGUgaW5keGVGaWxlID0gbmV3IEZpbGUoS2V5V29yZEluZGV4SGVscGVyLmRlZk9iai5nZXRXd3dSb290KCkKLQkJCQkJKyBLZXlXb3JkSW5kZXhIZWxwZXIuZGVmT2JqLmdldEluZGV4UmVzdWx0RmlsZSgpKTsKLQkJCVN0cmluZyBpbmRleFBhdGggPSBLZXlXb3JkSW5kZXhIZWxwZXIuZGVmT2JqLmdldFJlbGF0aXZlUGF0aCgpCi0JCQkJCSsgS2V5V29yZEluZGV4SGVscGVyLmRlZk9iai5nZXRJbmRleFJlc3VsdEZpbGUoKTsKLQkJCU1pc2NTdGF0aWMKLQkJCQkJLnByaW50KAotCQkJCQkJCW91dFAsCi0JCQkJCQkJIjxmcmFtZXNldCByb3dzPVwiIiArIEtleVdvcmRJbmRleEhlbHBlci5kZWZPYmouZ2V0SW5kZXhIZWlnaHQoKSArICIsKlwiPlxuIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JCQlNaXNjU3RhdGljCi0JCQkJCS5wcmludCgKLQkJCQkJCQlvdXRQLAotCQkJCQkJCSI8ZnJhbWUgbmFtZT1cIiIgKyBLZXlXb3JkSW5kZXhIZWxwZXIuZGVmT2JqLmdldEluZGV4VGFyZ2V0KCkgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJKyAiXCIgdGl0bGU9XCJOYXZpZ2F0aW9uIGJhclwiIHNyYz1cIiIgKyBpbmRleFBhdGggLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJKyAiXCIgbWFyZ2luaGVpZ2h0PVwiMlwiIG1hcmdpbndpZHRoPVwiMlwiIHNjcm9sbGluZz1cImF1dG9cIj5cbiIpOyAvLyROT04tTkxTLTEkCi0JCQlNaXNjU3RhdGljCi0JCQkJCS5wcmludCgKLQkJCQkJCQlvdXRQLAotCQkJCQkJCSI8ZnJhbWUgbmFtZT1cIiIgKyBLZXlXb3JkSW5kZXhIZWxwZXIuZGVmT2JqLmdldEtleVdvcmRUYXJnZXQoKSAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQkrICJcIiB0aXRsZT1cIkNvbnRlbnRzXCIgc3JjPVwiIiArIGtleVdvcmRQYXRoIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCSsgIlwiIG1hcmdpbmhlaWdodD1cIjBcIiBtYXJnaW53aWR0aD1cIjJcIiBzY3JvbGxpbmc9XCJhdXRvXCI+XG4iKTsgLy8kTk9OLU5MUy0xJAotCQkJTWlzY1N0YXRpYy5wcmludChvdXRQLCAiPC9mcmFtZXNldD5cbiIpOyAvLyROT04tTkxTLTEkCi0JCQlNaXNjU3RhdGljLnByaW50KG91dFAsICI8L2h0bWw+Iik7IC8vJE5PTi1OTFMtMSQKLQkJCW91dFAuY2xvc2UoKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVN5c3RlbS5lcnIKLQkJCQkJLnByaW50bG4oIktleVdvcmRIb2xkZXI6cHJpbnRGcmFtZXNldFxuIiArIEhlbHBNZXNzYWdlcy5FWENFUFRJT04gKyBlLnRvU3RyaW5nKCkpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvLyBQcmludHMgdGhlIGh0bWwgZmlsZSB3aXRoIHRoZSBzaG9ydGN1dHMgdG8gZWFjaCBhbmNob3IgaW4gdGhlIGtleXdvcmRmaWxlCi0JcHJpdmF0ZSB2b2lkIHByaW50SW5kZXgoKSB7Ci0JCXRyeSB7Ci0KLQkJCUZpbGUgZmlsZSA9IG5ldyBGaWxlKEtleVdvcmRJbmRleEhlbHBlci5kZWZPYmouZ2V0V3d3Um9vdCgpCi0JCQkJCSsgS2V5V29yZEluZGV4SGVscGVyLmRlZk9iai5nZXRJbmRleFJlc3VsdEZpbGUoKSk7Ci0JCQlpZiAoIWZpbGUuZXhpc3RzKCkpIHsKLQkJCQlmaWxlLmdldFBhcmVudEZpbGUoKS5ta2RpcnMoKTsKLQkJCQlmaWxlLmNyZWF0ZU5ld0ZpbGUoKTsKLQkJCX0KLQotCQkJT3V0cHV0U3RyZWFtV3JpdGVyIG91dFA7Ci0JCQlpZiAoS2V5V29yZEluZGV4SGVscGVyLmRlZk9iai5nZXRDaGFyYWN0ZXJTZXQoKSAhPSBudWxsKSB7Ci0JCQkJb3V0UCA9IG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIobmV3IEZpbGVPdXRwdXRTdHJlYW0oZmlsZSksCi0JCQkJCQlLZXlXb3JkSW5kZXhIZWxwZXIuZGVmT2JqLmdldENoYXJhY3RlclNldCgpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJb3V0UCA9IG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIobmV3IEZpbGVPdXRwdXRTdHJlYW0oZmlsZSkpOwotCQkJfQotCQkJU3lzdGVtLm91dC5wcmludGxuKEhlbHBNZXNzYWdlcy5XUklURV9GSUxFCi0JCQkJCSsgS2V5V29yZEluZGV4SGVscGVyLmRlZk9iai5nZXRXd3dSb290KCkKLQkJCQkJKyAiIiArIEtleVdvcmRJbmRleEhlbHBlci5kZWZPYmouZ2V0SW5kZXhSZXN1bHRGaWxlKCkpOyAvLyROT04tTkxTLTEkCi0KLQkJCS8vTWlzY1N0YXRpYy5wcmludChvdXRQLCAiPCFET0NUWVBFIEhUTUwgUFVCTElDIFwiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU5cIiBcImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGRcIj5cbiIpOyAvLyROT04tTkxTLTEkCi0JCQlNaXNjU3RhdGljLnByaW50KG91dFAsICI8aHRtbCBsYW5nPVwiIiArIGxhbmcgKyAiXCIgeG1sOmxhbmc9XCIiICsgbGFuZyArICJcIj5cbiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJTWlzY1N0YXRpYy5wcmludChvdXRQLCAiPGhlYWQ+XG4iKTsgLy8kTk9OLU5MUy0xJAotCQkJTWlzY1N0YXRpYwotCQkJCQkucHJpbnQob3V0UCwKLQkJCQkJCQkiPE1FVEEgaHR0cC1lcXVpdj1cIkNvbnRlbnQtVHlwZVwiIGNvbnRlbnQ9XCJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLThcIj5cbiIpOyAvLyROT04tTkxTLTEkICAgICAgICAgIAotCQkJTWlzY1N0YXRpYy5wcmludChvdXRQLCAiPC9oZWFkPjxCT0RZPlxuIik7IC8vJE5PTi1OTFMtMSQKLQotCQkJU3RyaW5nIGJlZ2luQ2hhciA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQlpZiAoa2V5V29yZHMgIT0gbnVsbCkgewotCQkJCUZpbGUga2V5V29yZHNGaWxlID0gbmV3IEZpbGUoS2V5V29yZEluZGV4SGVscGVyLmRlZk9iagotCQkJCQkJLmdldFd3d1Jvb3QoKQotCQkJCQkJKyBLZXlXb3JkSW5kZXhIZWxwZXIuZGVmT2JqLmdldEtleXdvcmRSZXN1bHRGaWxlKCkpOwotCQkJCVN0cmluZyBwYXRoID0gS2V5V29yZEluZGV4SGVscGVyLmRlZk9iai5nZXRSZWxhdGl2ZVBhdGgoKQotCQkJCQkJKyBLZXlXb3JkSW5kZXhIZWxwZXIuZGVmT2JqLmdldEtleXdvcmRSZXN1bHRGaWxlKCk7Ci0KLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGtleVdvcmRzLnNpemUoKTsgaSsrKSB7Ci0JCQkJCUtleVdvcmQgdG1wID0gKEtleVdvcmQpIGtleVdvcmRzLmVsZW1lbnRBdChpKTsKLQkJCQkJU3RyaW5nIGZpcnN0TCA9IHRtcC5nZXRLZXlXb3JkKCkuc3Vic3RyaW5nKDAsIDEpCi0JCQkJCQkJLnRvVXBwZXJDYXNlKCk7Ci0KLQkJCQkJaWYgKGZpcnN0TC5jb21wYXJlVG8oYmVnaW5DaGFyKSAhPSAwKSB7Ci0JCQkJCQliZWdpbkNoYXIgPSBmaXJzdEw7Ci0JCQkJCQlNaXNjU3RhdGljLnByaW50KG91dFAsICI8QSBIUkVGPVwiIiArIHBhdGggKyAiIyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCU1pc2NTdGF0aWMucHJpbnQob3V0UCwgYmVnaW5DaGFyKTsKLQkJCQkJCU1pc2NTdGF0aWMKLQkJCQkJCQkJLnByaW50KAotCQkJCQkJCQkJCW91dFAsCi0JCQkJCQkJCQkJIlwiIFRBUkdFVD1cIiIgKyBLZXlXb3JkSW5kZXhIZWxwZXIuZGVmT2JqLmdldEtleVdvcmRUYXJnZXQoKSArICJcIj4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQlNaXNjU3RhdGljLnByaW50KG91dFAsIGJlZ2luQ2hhcik7Ci0JCQkJCQlNaXNjU3RhdGljLnByaW50KG91dFAsICI8L0E+XG4iKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJTWlzY1N0YXRpYy5wcmludChvdXRQLCAiPC9CT0RZPjwvaHRtbD4iKTsgLy8kTk9OLU5MUy0xJAotCQkJb3V0UC5jbG9zZSgpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJU3lzdGVtLmVycgotCQkJCQkucHJpbnRsbigiS2V5V29yZEhvbGRlcjpwcmludEluZGV4XG4iICsgSGVscE1lc3NhZ2VzLkVYQ0VQVElPTiArIGUudG9TdHJpbmcoKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8vIFByaW50cyB0aGUga2V5d29yZGZpbGUKLQlwcml2YXRlIHZvaWQgcHJpbnRLZXlXb3JkcygpIHsKLQotCQl0cnkgewotCQkJT3V0cHV0U3RyZWFtV3JpdGVyIG91dFA7Ci0KLQkJCUZpbGUgZmlsZSA9IG5ldyBGaWxlKEtleVdvcmRJbmRleEhlbHBlci5kZWZPYmouZ2V0V3d3Um9vdCgpCi0JCQkJCSsgS2V5V29yZEluZGV4SGVscGVyLmRlZk9iai5nZXRLZXl3b3JkUmVzdWx0RmlsZSgpKTsKLQkJCWlmICghZmlsZS5leGlzdHMoKSkgewotCQkJCWZpbGUuZ2V0UGFyZW50RmlsZSgpLm1rZGlycygpOwotCQkJCWZpbGUuY3JlYXRlTmV3RmlsZSgpOwotCQkJfQotCi0JCQlpZiAoS2V5V29yZEluZGV4SGVscGVyLmRlZk9iai5nZXRDaGFyYWN0ZXJTZXQoKSAhPSBudWxsKSB7Ci0JCQkJb3V0UCA9IG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIobmV3IEZpbGVPdXRwdXRTdHJlYW0oZmlsZSksCi0JCQkJCQlLZXlXb3JkSW5kZXhIZWxwZXIuZGVmT2JqLmdldENoYXJhY3RlclNldCgpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJb3V0UCA9IG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIobmV3IEZpbGVPdXRwdXRTdHJlYW0oZmlsZSkpOwotCQkJfQotCQkJU3lzdGVtLm91dC5wcmludGxuKEhlbHBNZXNzYWdlcy5XUklURV9GSUxFCi0JCQkJCSsgS2V5V29yZEluZGV4SGVscGVyLmRlZk9iai5nZXRXd3dSb290KCkgKyAiIiArIC8vJE5PTi1OTFMtMSQKLQkJCQkJS2V5V29yZEluZGV4SGVscGVyLmRlZk9iai5nZXRLZXl3b3JkUmVzdWx0RmlsZSgpKTsKLQkJCVN0cmluZyBoZWFkZXJGaWxlID0gTWlzY1N0YXRpYy5sb2FkRmlsZShLZXlXb3JkSW5kZXhIZWxwZXIuZGVmT2JqCi0JCQkJCS5nZXRIZWFkZXJGaWxlKCksIEtleVdvcmRJbmRleEhlbHBlci5kZWZPYmoKLQkJCQkJLmdldENoYXJhY3RlclNldCgpKTsKLQkJCWlmIChoZWFkZXJGaWxlLmVxdWFsc0lnbm9yZUNhc2UoRGVmLk5vbmUpKSB7Ci0JCQkJU3lzdGVtLmVyci5wcmludGxuKEhlbHBNZXNzYWdlcy5JTkNPUlJFQ1RfSEVBREVSRklMRQotCQkJCQkJKyBLZXlXb3JkSW5kZXhIZWxwZXIuZGVmT2JqLmdldEhlYWRlckZpbGUoKSk7Ci0JCQl9Ci0JCQlNaXNjU3RhdGljLnByaW50KG91dFAsIGhlYWRlckZpbGUpOwotCi0JCQlTdHJpbmcgYmVnaW5DaGFyID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCWlmIChrZXlXb3JkcyAhPSBudWxsKSB7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBrZXlXb3Jkcy5zaXplKCk7IGkrKykgewotCi0JCQkJCUtleVdvcmQgdG1wID0gKEtleVdvcmQpIGtleVdvcmRzLmVsZW1lbnRBdChpKTsKLQkJCQkJU3RyaW5nIGZpcnN0TCA9IHRtcC5nZXRLZXlXb3JkKCkuc3Vic3RyaW5nKDAsIDEpCi0JCQkJCQkJLnRvVXBwZXJDYXNlKCk7Ci0KLQkJCQkJaWYgKGZpcnN0TC5jb21wYXJlVG8oYmVnaW5DaGFyKSAhPSAwKSB7Ci0JCQkJCQliZWdpbkNoYXIgPSBmaXJzdEw7Ci0JCQkJCQlGb250T2JqZWN0IGZzID0gS2V5V29yZEluZGV4SGVscGVyLmRlZk9iagotCQkJCQkJCQkuZ2V0U3R5bGVTaGVldChEZWYuSGVhZExpbmVTdHlsZSk7Ci0JCQkJCQlpZiAoZnMgPT0gbnVsbCkgewotCQkJCQkJCWZzID0gS2V5V29yZEluZGV4SGVscGVyLmRlZk9iagotCQkJCQkJCQkJLmdldFN0eWxlU2hlZXQoRGVmLkRlZmF1bHRTdHlsZSk7Ci0JCQkJCQl9Ci0JCQkJCQlGb250T2JqZWN0IGYgPSBudWxsOwotCQkJCQkJRm9udE9iamVjdCBmciA9IGZzOwotCQkJCQkJaWYgKGZzID09IG51bGwpIHsKLQkJCQkJCQlmID0gS2V5V29yZEluZGV4SGVscGVyLmRlZk9iagotCQkJCQkJCQkJLmdldEZvbnQoRGVmLkhlYWRMaW5lRm9udCk7Ci0JCQkJCQkJaWYgKGYgPT0gbnVsbCkgewotCQkJCQkJCQlmID0gS2V5V29yZEluZGV4SGVscGVyLmRlZk9iagotCQkJCQkJCQkJCS5nZXRGb250KERlZi5EZWZhdWx0Rm9udCk7Ci0JCQkJCQkJfQotCQkJCQkJCWZyID0gZjsKLQkJCQkJCX0KLQkJCQkJCUtleVdvcmRJbmRleEhlbHBlci5kZWZPYmoucHJpbnRTdGFydChvdXRQLCBmcik7Ci0JCQkJCQlpZiAoZnMgPT0gbnVsbCkgewotCQkJCQkJCU1pc2NTdGF0aWMucHJpbnQob3V0UCwgIjxCUj4iKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJfQotCQkJCQkJTWlzY1N0YXRpYwotCQkJCQkJCQkucHJpbnQoCi0JCQkJCQkJCQkJb3V0UCwKLQkJCQkJCQkJCQkiPEEgTkFNRT1cIiIgKyBiZWdpbkNoYXIgKyAiXCI+IiArIGJlZ2luQ2hhciArICI8L0E+Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlpZiAoZnMgPT0gbnVsbCkgewotCQkJCQkJCU1pc2NTdGF0aWMucHJpbnQob3V0UCwgIjxCUj4iKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJfQotCQkJCQkJS2V5V29yZEluZGV4SGVscGVyLmRlZk9iai5wcmludEVuZChvdXRQLCBmcik7Ci0JCQkJCX0KLQkJCQkJdG1wLnByaW50KG91dFAsIDApOwotCQkJCX0KLQkJCX0KLQkJCVN0cmluZyBmb290ZXJGaWxlID0gTWlzY1N0YXRpYy5sb2FkRmlsZShLZXlXb3JkSW5kZXhIZWxwZXIuZGVmT2JqCi0JCQkJCS5nZXRGb290ZXJGaWxlKCksIEtleVdvcmRJbmRleEhlbHBlci5kZWZPYmoKLQkJCQkJLmdldENoYXJhY3RlclNldCgpKTsKLQkJCWlmIChmb290ZXJGaWxlLmVxdWFsc0lnbm9yZUNhc2UoRGVmLk5vbmUpKSB7Ci0JCQkJU3lzdGVtLmVyci5wcmludGxuKEhlbHBNZXNzYWdlcy5JTkNPUlJFQ1RfRk9PVEVSRklMRQotCQkJCQkJKyBLZXlXb3JkSW5kZXhIZWxwZXIuZGVmT2JqLmdldEZvb3RlckZpbGUoKSk7Ci0JCQl9Ci0JCQlNaXNjU3RhdGljLnByaW50KG91dFAsIGZvb3RlckZpbGUpOwotCQkJb3V0UC5jbG9zZSgpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJU3lzdGVtLmVycgotCQkJCQkucHJpbnRsbigiS2V5V29yZEhvbGRlcjpwcmludEtleVdvcmRzXG4iICsgSGVscE1lc3NhZ2VzLkVYQ0VQVElPTiArIGUudG9TdHJpbmcoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3NlcnZpY2VzL2luZGV4L0tleVdvcmRJbmRleC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3NlcnZpY2VzL2luZGV4L0tleVdvcmRJbmRleC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZTYyMTkyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy9zZXJ2aWNlcy9pbmRleC9LZXlXb3JkSW5kZXguamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnNlcnZpY2VzLmluZGV4OwotCi0vLyBEZWJ1Zy4vLyBpbXBvcnQgamF2YXguc3dpbmcuKjsKLQotY2xhc3MgS2V5V29yZEluZGV4Ci17Ci0vLyBwcml2YXRlIHN0YXRpYyBLZXlXb3JkSG9sZGVyIGhvbGRlciA9IG5ldyBLZXlXb3JkSG9sZGVyKCk7Ci0KLQotLy8gIHByaXZhdGUgc3RhdGljIERlZmluaXRpb25PYmplY3QgZGVmT2JqPW51bGw7Ci0vLyAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGRlZmZpbGUgPSBudWxsOwotLy8gIHByaXZhdGUgc3RhdGljIFN0cmluZyBjaGFyU2V0ID0gbnVsbDsgCi0vLyAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGhlbHBGaWxlID0gbnVsbDsKLS8vICBwcml2YXRlIHN0YXRpYyBib29sZWFuIHNob3dVc2FnZSA9IGZhbHNlOwotCi0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvc2VydmljZXMvaW5kZXgvS2V5V29yZEluZGV4RXhjZXB0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvc2VydmljZXMvaW5kZXgvS2V5V29yZEluZGV4RXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5YjQzMzkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3NlcnZpY2VzL2luZGV4L0tleVdvcmRJbmRleEV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcuc2VydmljZXMuaW5kZXg7Ci0KLS8qKgotICoKLSAqIFRoaXMgZXhjZXB0aW9uIGlzIHVzZWQgYnkgYWxsIGNsYXNzZXMgdGhhdCBhcmUgaW52b2x2ZWQgd2l0aCB0aGUga2V5d29yZGluZGV4Ci0gKgotICovCi0KLQotY2xhc3MgS2V5V29yZEluZGV4RXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uCi17Ci0JcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLQlwcml2YXRlIFN0cmluZyByZWFzb247Ci0KLQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkvLyBDbGFzcyBDb25zdHJ1Y3Rvci4KLQlLZXlXb3JkSW5kZXhFeGNlcHRpb24oU3RyaW5nIGV4Y2VwdGlvbk5hbWUsIFN0cmluZyBleGNlcHRpb25SZWFzb24pCi0JewotCQlzdXBlciggZXhjZXB0aW9uUmVhc29uICk7Ci0JCW5hbWUJPSBleGNlcHRpb25OYW1lOwotCQlyZWFzb24JPSBleGNlcHRpb25SZWFzb247Ci0JfQotCi0JLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JLy8gUmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBleGNlcHRpb24uCi0JU3RyaW5nIGdldEV4Y2VwdGlvbk5hbWUoKQotCXsKLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JLy8gUmV0dXJuIHRoZSByZWFzb24gZm9yIHRoZSBleGNlcHRpb24uCi0JU3RyaW5nIGdldEV4Y2VwdGlvblJlYXNvbigpCi0JewotCQlyZXR1cm4gcmVhc29uOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0KLQkJcmV0dXJuIG5hbWUgKyAiOiIgKyByZWFzb247IC8vJE5PTi1OTFMtMSQKLQotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy9zZXJ2aWNlcy9pbmRleC9LZXlXb3JkSW5kZXhIZWxwZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy9zZXJ2aWNlcy9pbmRleC9LZXlXb3JkSW5kZXhIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTQ5YjU3Ni4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvc2VydmljZXMvaW5kZXgvS2V5V29yZEluZGV4SGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcuc2VydmljZXMuaW5kZXg7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLQotaW1wb3J0IGNvbS5pYm0uaWN1LnV0aWwuU3RyaW5nVG9rZW5pemVyOwotCi1wdWJsaWMgY2xhc3MgS2V5V29yZEluZGV4SGVscGVyIHsKLQlLZXlXb3JkSG9sZGVyIGhvbGRlciA9IG5ldyBLZXlXb3JkSG9sZGVyKCk7Ci0KLQlzdGF0aWMgRGVmaW5pdGlvbk9iamVjdCBkZWZPYmogPSBudWxsOwotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGRlZmZpbGUgPSBudWxsOwotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGNoYXJTZXQgPSBudWxsOwotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGhlbHBGaWxlID0gbnVsbDsKLQotCS8vIENvbnN0cnVjdG9yCi0JS2V5V29yZEluZGV4SGVscGVyKCkgewotCi0JCWRlZmZpbGUgPSBudWxsOwotCQkvLyBkbyBub3RoaW5nCi0KLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvcgotCSAqIEBwYXJhbSBwRGVmZmlsZQotCSAqIEBwYXJhbSBwQ2hhclNldAotCSAqIEBwYXJhbSBwSGVscEZpbGUKLQkgKi8KLQlwdWJsaWMgS2V5V29yZEluZGV4SGVscGVyKFN0cmluZyBwRGVmZmlsZSwgU3RyaW5nIHBDaGFyU2V0LCBTdHJpbmcgcEhlbHBGaWxlKSB7Ci0JCWRlZmZpbGUgPSBwRGVmZmlsZTsKLQkJY2hhclNldCA9IHBDaGFyU2V0OwotCQloZWxwRmlsZSA9IHBIZWxwRmlsZTsKLQl9Ci0KLQl2b2lkIHNldERlZmZpbGUoU3RyaW5nIHBGaWxlKSB7Ci0KLQkJZGVmZmlsZSA9IHBGaWxlOwotCi0JfQotCi0Jdm9pZCBzZXRDaGFyU2V0KFN0cmluZyBwQ2hhclNldCkgewotCi0JCWNoYXJTZXQgPSBwQ2hhclNldDsKLQotCX0KLQotCXZvaWQgc2V0SGVscEZpbGUoU3RyaW5nIHBIZWxwRmlsZSkgewotCi0JCWhlbHBGaWxlID0gcEhlbHBGaWxlOwotCi0JfQotCi0JLyoqCi0JICogbG9hZCB0aGUgZGVmaW5pdGlvbiBvYmplY3QgCi0JICogCi0JICogQHBhcmFtIHB1YkRpciBTdHJpbmcKLQkgKiBAcmV0dXJuIERlZmluaXRpb25PYmplY3QKLQkgKiBAdGhyb3dzIEV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBEZWZpbml0aW9uT2JqZWN0IGxvYWREZWZpbml0aW9uKFN0cmluZyBwdWJEaXIpIHRocm93cyBFeGNlcHRpb24gewotCQlpZiAoZGVmZmlsZSA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgS2V5V29yZEluZGV4RXhjZXB0aW9uKAotCQkJCQkiS2V5V29yZEluZGV4SGVscGVyOmV4ZWN1dGUoKSIsIFN0cmluZ0RlZmluaXRpb25zLkVSUk9SX0RFRklOSVRJT05fRklMRV9OT1RfRk9VTkQpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlpZiAoaGVscEZpbGUgIT0gbnVsbCkgewotCQkJSGVscE1lc3NhZ2VzLmxvYWRIZWxwTWVzc2FnZXMoaGVscEZpbGUsIGNoYXJTZXQpOwotCQl9Ci0KLQkJZGVmT2JqID0gbmV3IERlZmluaXRpb25PYmplY3QocHViRGlyLCBkZWZmaWxlLCBjaGFyU2V0KTsKLQotCQlyZXR1cm4gZGVmT2JqOwotCX0KLQotCS8qKgotCSAqIGV4ZWN1dGUgdGhlIGtleXdvcmQgaW5kZXggZ2VuZXJhdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gbW9uaXRvciBJUHJvZ3Jlc3NNb25pdG9yCi0JICogQHRocm93cyBLZXlXb3JkSW5kZXhFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEtleVdvcmRJbmRleEV4Y2VwdGlvbiB7Ci0KLQkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQkvLyBDaGVjayBpZiBlbm91Z2ggaW5wdXQgaW4gZGVmaW5pdGlvbmZpbGUKLQkJaWYgKGRlZk9iai5lbm91Z2hJbnB1dCgpKSB7Ci0JCQlGaWxlIHRvcERpciA9IG5ldyBGaWxlKGRlZk9iai5nZXRXd3dSb290KCkpOwotCi0JCQkvLyBUaGUgd3d3Um9vdCBoYXZlIHRvIGJlIGEgZGlyZWN0b3J5Ci0JCQlpZiAodG9wRGlyLmlzRGlyZWN0b3J5KCkpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oSGVscE1lc3NhZ2VzLlBBUlNFX0RJUkVDVE9SWQotCQkJCQkJKyBkZWZPYmouZ2V0V3d3Um9vdCgpKTsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oSGVscE1lc3NhZ2VzLlRBS0VfQV9XSElMRSk7Ci0JCQkJcmVhZERpcih0b3BEaXIsIG1vbml0b3IpOwotCQkJfSBlbHNlIHsKLQkJCQl0aHJvdyBuZXcgS2V5V29yZEluZGV4RXhjZXB0aW9uKAotCQkJCQkJIktleVdvcmRJbmRleEhlbHBlcjpleGVjdXRlKCkiLCAvLyROT04tTkxTLTEkCi0JCQkJCQlEZWYuU3RhcnREaXIKLQkJCQkJCQkJKyAiOiAiICsgZGVmT2JqLmdldFd3d1Jvb3QoKSArIEhlbHBNZXNzYWdlcy5OT19ESVJFQ1RPUlkpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0KLQkJCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkgewotCQkJCXJldHVybjsKLQkJCX0KLQotCQkJLy8gU3BsaXRzIGFuZCBzb3J0cyB0aGUga2V5d29yZHMKLQkJCWhvbGRlci5kaXZpZGUoKTsKLQotCQkJU3RyaW5nIHNwZWNLZXlXb3Jkc0ZpbGUgPSBkZWZPYmouZ2V0S2V5V29yZEZpbGUoKTsKLQkJCWlmIChzcGVjS2V5V29yZHNGaWxlICE9IG51bGwpIHsKLQkJCQkvLyBSZWFkcyB0aGUgc3BlY2tleXdvcmRmaWxlCi0JCQkJU3RyaW5nIHNwZWNLZXlXb3JkcyA9IE1pc2NTdGF0aWMubG9hZEZpbGUoc3BlY0tleVdvcmRzRmlsZSwKLQkJCQkJCWRlZk9iai5nZXRDaGFyYWN0ZXJTZXQoKSk7Ci0JCQkJaWYgKCFzcGVjS2V5V29yZHMuZXF1YWxzKERlZi5Ob25lKSkgewotCQkJCQlTdHJpbmdUb2tlbml6ZXIgcGFyc2VyID0gbmV3IFN0cmluZ1Rva2VuaXplcihzcGVjS2V5V29yZHMsCi0JCQkJCQkJIlx0XG4iKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlob2xkZXIucmVhZFNwZWNLZXlXb3JkcyhwYXJzZXIpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXRocm93IG5ldyBLZXlXb3JkSW5kZXhFeGNlcHRpb24oCi0JCQkJCQkJIktleVdvcmRJbmRleEhlbHBlcjpleGVjdXRlKCkiLCAvLyROT04tTkxTLTEkCi0JCQkJCQkJc3BlY0tleVdvcmRzRmlsZQotCQkJCQkJCQkJKyBIZWxwTWVzc2FnZXMuS0VZV09SRF9GSUxFX1NZTlRBWF9FUlJPUik7Ci0JCQkJfQotCQkJfQotCi0JCQkvLyBQcmludCB0aGUgS2V5V29yZEluZGV4SGVscGVyCi0JCQlob2xkZXIucHJpbnQoKTsKLQkJfSBlbHNlIHsKLQkJCXRocm93IG5ldyBLZXlXb3JkSW5kZXhFeGNlcHRpb24oIktleVdvcmRJbmRleEhlbHBlcjpleGVjdXRlKCkiLCAvLyROT04tTkxTLTEkCi0JCQkJCUhlbHBNZXNzYWdlcy5OT1RfRU5PVUdIX0lOUFVUKTsKLQkJfQotCi0JfQotCi0JLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JLy8gUmVjdXJzaXZlbHkgcHJvY2VzcyBlYWNoIGRpcmVjdG9yeSBpbiB0aGUgZGlyZWN0b3J5IGhlaXJhcmNoeS4KLQlwcml2YXRlIHZvaWQgcmVhZERpcihGaWxlIGZpbGUsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlTdHJpbmcgZmlsZXNbXSA9IGZpbGUubGlzdCgpOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkgewotCQkJCXJldHVybjsKLQkJCX0KLQotCQkJU3RyaW5nIGZpbGVQYXRoID0gZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKTsKLQotCQkJdHJ5IHsKLQkJCQlmaWxlUGF0aCA9IGZpbGUuZ2V0Q2Fub25pY2FsUGF0aCgpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIktleVdvcmRJbmRleEhlbHBlcjpyZWFkRGlyXG4iICsgLy8kTk9OLU5MUy0xJAotCQkJCQkJSGVscE1lc3NhZ2VzLkVYQ0VQVElPTiArIGUudG9TdHJpbmcoKSk7Ci0JCQl9Ci0JCQlmaWxlUGF0aCA9IGZpbGVQYXRoLnJlcGxhY2UoJ1xcJywgJy8nKTsKLQkJCUZpbGUgdG1wID0gbmV3IEZpbGUoZmlsZVBhdGggKyAiLyIgKyBmaWxlc1tpXSk7IC8vJE5PTi1OTFMtMSQKLQkJCQotCQkJaWYgKHRtcC5pc0RpcmVjdG9yeSgpKSB7Ci0JCQkJLy8gSWYgdGhlIGZpbGUgaXMgYSBkaXJlY3RvcnkKLQkJCQlTdHJpbmcgdG1wUGF0aCA9IHRtcC5nZXRBYnNvbHV0ZVBhdGgoKTsKLQkJCQl0cnkgewotCQkJCQl0bXBQYXRoID0gdG1wLmdldENhbm9uaWNhbFBhdGgoKTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQlTeXN0ZW0ub3V0Ci0JCQkJCQkJLnByaW50bG4oIktleVdvcmRJbmRleEhlbHBlcjpyZWFkRGlyXG4iICsgSGVscE1lc3NhZ2VzLkVYQ0VQVElPTiArIGUudG9TdHJpbmcoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQkJLy8gT24gcGMgdGhlIHNlcGFyYXRvciBtYXkgYmUgXCBhbmQgbm90IC8KLQkJCQl0bXBQYXRoID0gdG1wUGF0aC5yZXBsYWNlKCdcXCcsICcvJyk7Ci0JCQkJaWYgKCFkZWZPYmouaXNJblN0b3BkaXIodG1wUGF0aCkpIHsKLQkJCQkJLy8gSWYgbm90IGluIHN0b3BkaXIKLQkJCQkJcmVhZERpcih0bXAsIG1vbml0b3IpOwotCQkJCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpIHsKLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCi0JCQkJfSBlbHNlIHsKLQkJCQkJdHJ5IHsKLQotCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKEhlbHBNZXNzYWdlcy5ESVJFQ1RPUllfTk9UX1BBUlNFRAotCQkJCQkJCQkrIHRtcC5nZXRDYW5vbmljYWxQYXRoKCkpOwotCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJU3lzdGVtLm91dAotCQkJCQkJCQkucHJpbnRsbigiS2V5V29yZEluZGV4SGVscGVyOnJlYWREaXJcbiIgKyBIZWxwTWVzc2FnZXMuRVhDRVBUSU9OICsgZS50b1N0cmluZygpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJfQotCi0JCQl9Ci0JCQkvLyBQYXJzZSBhbGwgdGhlIGZpbGVzIHdoaWNoIGhhdmUgb25lIG9mIHRoZSBleHRlbnNpb25zIHdlIGFyZQotCQkJLy8gaW50ZXJlc3RlZCBpbi4KLQkJCWVsc2UgaWYgKGZpbGVzW2ldLmVuZHNXaXRoKCIuaHRtIikgfHwgZmlsZXNbaV0uZW5kc1dpdGgoIi5odG1sIikgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCXx8IGZpbGVzW2ldLmVuZHNXaXRoKCIuc2h0bWwiKSB8fCBmaWxlc1tpXS5lbmRzV2l0aCgiLnNodG0iKSkgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQl7Ci0JCQkJbG9hZEZpbGUoZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSArICIvIiArIGZpbGVzW2ldKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCi0JCX0KLQl9Ci0KLQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkvLyBQYXJzZSBlYWNoIG9mIHRoZSBmb3VuZCBmaWxlcyBhbmQgZXh0cmFjdCB0aGUga2V5d29yZHMgZnJvbSB0aGVtLgotCXByaXZhdGUgdm9pZCBsb2FkRmlsZShTdHJpbmcgZmlsZU5hbWUpIHsKLQkJU3RyaW5nIGh0bWxGaWxlID0gTWlzY1N0YXRpYy5sb2FkRmlsZShmaWxlTmFtZSwgZGVmT2JqCi0JCQkJLmdldENoYXJhY3RlclNldCgpKTsKLQkJaWYgKGh0bWxGaWxlICE9IG51bGwgJiYgaHRtbEZpbGUubGVuZ3RoKCkgPiAwKSAKLQkJewotCQkJTGlzdCBrZXlXb3JkID0gS2V5V29yZFN0YXRpYy5nZXRLZXlXb3JkcyhodG1sRmlsZSk7Ci0JCQlpZiAoa2V5V29yZCAhPSBudWxsICYmIGtleVdvcmQuc2l6ZSgpID4gMCApIHsKLQkJCQlJTy5wcmludERlYnVnKCJrZXl3b3JkICIgKyBrZXlXb3JkKTsgLy8kTk9OLU5MUy0xJAotCQkJCVN0cmluZyB0aXRsZSA9IE1pc2NTdGF0aWMuZ2V0VGl0bGUoaHRtbEZpbGUpOwotCi0JCQkJLy8gQWRkcyBhIGZpbGUgd2l0aCBrZXl3b3JkcyB0byB0aGUgaG9sZGVyIG9iamVjdAotCQkJCWhvbGRlci5hZGQobmV3IEtleVdvcmRGaWxlKHRpdGxlLCBkZWZPYmouZ2V0UmVsYXRpdmVQYXRoKCkKLQkJCQkJCSsgIiIgKyBmaWxlTmFtZS5zdWJzdHJpbmcoZGVmT2JqLmdldFd3d1Jvb3RMZW5ndGgoKSksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWtleVdvcmQpKTsKLQkJCQkKLQkJCQkvL1N5c3RlbS5vdXQucHJpbnRsbigia2V5d29yZHM9IiArIGtleVdvcmQuc2l6ZSgpICArICIgZmlsZTogIiArIGZpbGVOYW1lKTsKLQkJCX0KLQkJCQotCQl9Ci0JCQotCi0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3NlcnZpY2VzL2luZGV4L0tleVdvcmRTdGF0aWMuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy9zZXJ2aWNlcy9pbmRleC9LZXlXb3JkU3RhdGljLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiZjc4YjkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3NlcnZpY2VzL2luZGV4L0tleVdvcmRTdGF0aWMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5zZXJ2aWNlcy5pbmRleDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwucmVnZXguTWF0Y2hlcjsKLWltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuUmVzb3VyY2VIZWxwZXI7Ci0KLQotY2xhc3MgS2V5V29yZFN0YXRpYyB7Ci0KLQkvLyBub3RlOiBwYXR0ZXJuIHdpdGggW14+XSBkb2VzIG5vdCBtYXRjaCB3aGVuIHRoZXJlIGFyZSBub24tZW5nbGlzaAotCS8vIGNoYXJhY3RlcnMsIG1heWJlIGl0J3MgYSBqcmUgYnVnPwotCXN0YXRpYyBmaW5hbCBQYXR0ZXJuIHBfaW5kZXhfcmVmID0gUGF0dGVybi5jb21waWxlKAotCQkJIjxhXFxzKz8oLio/KT4iLCBQYXR0ZXJuLkNBU0VfSU5TRU5TSVRJVkUgfCBQYXR0ZXJuLkRPVEFMTCk7IC8vJE5PTi1OTFMtMSQKLQkvLyAiPGFcXHMrPyhbXj5dKj8obmFtZVxccyo9XFxzKlwiWEVffGNsYXNzXFxzKj1cXHMqXCJpbmRleCkuKj8pPiIsCi0JLy8gUGF0dGVybi5DQVNFX0lOU0VOU0lUSVZFIHwgUGF0dGVybi5ET1RBTEwpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBnZXQgdGhlIGtleSB3b3JkcyB3aXRoIGtleSBhbmQgdGV4dCBkZXNjcmlwdGlvbi4gVGhlcmUgYXJlIHR3byB0eXBlcyBvZgotCSAqIGluZGV4IGZvcm1hdDogMS4gb2xkIGZvcm1hdDogPGEgbmFtZT0iS0VZX19URVhUIiAuLi4+IDIuIG5ldyBmb3JtYXQ6IDxhCi0JICogY2xhc3M9ImluZGV4IiBuYW1lPSJib29rbWFyayIga2V5PSJLRVkiIHRleHQ9IlRFWFQiIC4uLj4gVEVYVCBwYXJ0IGlzCi0JICogb3B0aW9uYWwKLQkgKi8KLQlzdGF0aWMgTGlzdCBnZXRLZXlXb3JkcyhTdHJpbmcgcmVhbFN0cmluZykgewotCQlpZiAocmVhbFN0cmluZyA9PSBudWxsKSB7Ci0JCQlTeXN0ZW0uZXJyCi0JCQkJCS5wcmludGxuKCJLZXlXb3JkU3RhdGljOmdldEtleVdvcmRzXG4iICsgSGVscE1lc3NhZ2VzLklOUFVUX1BBUkFNRVRFUl9OVUxMKTsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlMaXN0IGFuY2hvcnMgPSBuZXcgQXJyYXlMaXN0KDIpOyAvLyROT04tTkxTLTEkCi0KLQkJTWF0Y2hlciBtID0gcF9pbmRleF9yZWYubWF0Y2hlcihyZWFsU3RyaW5nKTsKLQkJd2hpbGUgKG0uZmluZCgpKSB7Ci0JCQlTdHJpbmcgYXR0cmlidXRlcyA9IG0uZ3JvdXAoMSk7Ci0JCQlpZiAoYXR0cmlidXRlcy5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQkKLQkJCU1hcCBhdHRyTWFwID0gUmVzb3VyY2VIZWxwZXIuZ2V0VGFnQXR0cmlidXRlcyhhdHRyaWJ1dGVzKTsKLQkJCVN0cmluZyBrZXlXb3JkID0gKFN0cmluZykgYXR0ck1hcC5nZXQoUmVzb3VyY2VIZWxwZXIuVEFHX0FUVFJfTkFNRSk7Ci0JCQlpZiAoa2V5V29yZCA9PSBudWxsIHx8IGtleVdvcmQubGVuZ3RoKCkgPT0gMCkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCi0JCQlTdHJpbmcgY2xzID0gKFN0cmluZykgYXR0ck1hcC5nZXQoUmVzb3VyY2VIZWxwZXIuVEFHX0FUVFJfQ0xBU1MpOwotCQkJU3RyaW5nIGtleSA9IG51bGw7Ci0JCQlTdHJpbmcgdGV4dCA9IG51bGw7Ci0JCQlpZiAoKGNscyAhPSBudWxsKQotCQkJCQkmJiBjbHMuZXF1YWxzKFJlc291cmNlSGVscGVyLlRBR19BVFRSX1ZBTFVFX0lOREVYKSkgewotCQkJCWtleSA9IChTdHJpbmcpIGF0dHJNYXAuZ2V0KFJlc291cmNlSGVscGVyLlRBR19BVFRSX0tFWSk7Ci0JCQkJdGV4dCA9IChTdHJpbmcpIGF0dHJNYXAuZ2V0KFJlc291cmNlSGVscGVyLlRBR19BVFRSX1RFWFQpOwotCQkJfQotCQkJLy8gVGhlIGdldEtleVdvcmRQcmVmaXgoKSByZXR1cm5zIHRoZSB0YWcgd2hpY2ggaXMgdXNlZCB0byBkZWxpbWl0Ci0JCQkvLyBrZXl3b3Jkcy4KLQkJCS8vIEN1cnJlbnRseSB0aGlzIHRhZyBpcyBYRSBhbmQgaXMgZGVmaW5lZCBpbiBrZXl3b3JkY29uZmlnLnR4dAotCQkJaWYgKChrZXkgIT0gbnVsbCkKLQkJCQkJfHwga2V5V29yZC5zdGFydHNXaXRoKEtleVdvcmRJbmRleEhlbHBlci5kZWZPYmoKLQkJCQkJCQkuZ2V0S2V5V29yZFByZWZpeCgpKSkgewotCQkJCWFuY2hvcnMuYWRkKG5ldyBLZXlXb3JkRGVmKGtleVdvcmQsIGtleSwgdGV4dCkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBhbmNob3JzOwotCi0JfQotCi0Jc3RhdGljIFN0cmluZyBjb252ZXJ0S2V5V29yZChTdHJpbmcga2V5V29yZCkgewotCQlyZXR1cm4gY29udmVydEtleVdvcmQoa2V5V29yZCwgbnVsbCwgbnVsbCk7Ci0JfQotCi0Jc3RhdGljIFN0cmluZyBjb252ZXJ0S2V5V29yZChTdHJpbmcga2V5V29yZCwgU3RyaW5nIGtleSwgU3RyaW5nIHRleHQpIHsKLQotCQlpZiAoa2V5V29yZCA9PSBudWxsKSB7Ci0JCQlTeXN0ZW0uZXJyCi0JCQkJCS5wcmludGxuKCJLZXlXb3JkU3RhdGljOmNvbnZlcnRLZXlXb3JkXG4iICsgSGVscE1lc3NhZ2VzLklOUFVUX1BBUkFNRVRFUl9OVUxMKTsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJSU8ucHJpbnREZWJ1ZygiY29udmVydEtleVdvcmQgIiArIGtleVdvcmQpOyAvLyBFcnJvciBpZiB3ZSBnZXQgYSBrZXl3b3JkIC8vJE5PTi1OTFMtMSQKLQkJLy8gdGhhdCBkb2VzIG5vdCBjb250YWluIHRoZQotCQkvLyB0YWcuIC8vJE5PTi1OTFMtMSQKLQkJaWYgKChrZXkgIT0gbnVsbCkgJiYgKGtleS5sZW5ndGgoKSA+IDApKSB7Ci0JCQlpZiAodGV4dCA9PSBudWxsIHx8IHRleHQubGVuZ3RoKCkgPT0gMCkgewotCQkJCXJldHVybiBrZXk7Ci0JCQl9IGVsc2UgewotCQkJCXJldHVybiBrZXkgKyBLZXlXb3JkSW5kZXhIZWxwZXIuZGVmT2JqLmxldmVsU2VwYXJhdG9yUmVwbGFjZQotCQkJCQkJKyB0ZXh0OwotCQkJfQotCQl9Ci0KLQkJaWYgKCFrZXlXb3JkLnN0YXJ0c1dpdGgoS2V5V29yZEluZGV4SGVscGVyLmRlZk9iai5nZXRLZXlXb3JkUHJlZml4KCkpKSB7Ci0JCQlTeXN0ZW0ub3V0Ci0JCQkJCS5wcmludGxuKCJLZXlXb3JkU3RhdGljOmNvbnZlcnRLZXlXb3JkXG4iICsga2V5V29yZCArIEhlbHBNZXNzYWdlcy5LRVlXT1JEX1NZTlRBWF9FUlJPUiArIEtleVdvcmRJbmRleEhlbHBlci5kZWZPYmouZ2V0S2V5V29yZFByZWZpeCgpKTsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQkvLyBSZW1vdmUgdGhlIGZpcnN0IHRocmVlIGNoYXJhY3RlcnMgZnJvbSB0aGUga2V5V29yZCAobmFtZWx5IFhFXykuCi0JCVN0cmluZyB0bXBLID0ga2V5V29yZC5zdWJzdHJpbmcoMyk7Ci0JCVN0cmluZyB0bXAgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQlpbnQgaSA9IDA7Ci0JCWludCBwb3MgPSAwOwotCQl3aGlsZSAoaSAhPSAtMSkgewotCQkJLy8gZ2V0S2V5V29yZExldmVsU2VwYXJhdG9yKCkgaXMgaGFyZC1jb2RlZCBhcyBfXwotCQkJaSA9IHRtcEsuaW5kZXhPZihLZXlXb3JkSW5kZXhIZWxwZXIuZGVmT2JqCi0JCQkJCS5nZXRLZXlXb3JkTGV2ZWxTZXBhcmF0b3IoKSwgcG9zKTsKLQkJCWlmIChpICE9IC0xKSB7Ci0JCQkJLy8gSW5zZXJ0IGEgc2VwYXJhdG9yIGJldHdlZW4ga2V5d29yZHMsIHdoaWNoIGluIHRoaXMgY2FzZSBpcwotCQkJCS8vIHRoZSAiOiIKLQkJCQl0bXAgKz0gdG1wSy5zdWJzdHJpbmcocG9zLCBpKTsKLQkJCQl0bXAgKz0gS2V5V29yZEluZGV4SGVscGVyLmRlZk9iai5sZXZlbFNlcGFyYXRvclJlcGxhY2U7Ci0JCQkJcG9zID0gaSArIDI7Ci0JCQl9IGVsc2UgewotCQkJCXRtcCArPSB0bXBLLnN1YnN0cmluZyhwb3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiB0bXAucmVwbGFjZSgnXycsICcgJyk7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3NlcnZpY2VzL2luZGV4L01pc2NTdGF0aWMuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy9zZXJ2aWNlcy9pbmRleC9NaXNjU3RhdGljLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxZTM3MmQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3NlcnZpY2VzL2luZGV4L01pc2NTdGF0aWMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5zZXJ2aWNlcy5pbmRleDsKLQotaW1wb3J0IGphdmEuaW8uRGF0YU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtV3JpdGVyOwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLkZpbGVVdGlsOwotCi1pbXBvcnQgY29tLmlibS5pY3UudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLWNsYXNzIE1pc2NTdGF0aWMKLXsKLSAgc3RhdGljIEhhc2h0YWJsZSB0d29WYWx1ZUZpbGU9bnVsbDsKLSAgc3RhdGljIFN0cmluZyB0b3BEaXI9bnVsbDsKLSAgc3RhdGljIGludCB0b3BEaXJMPTA7Ci0KLSAgc3RhdGljIGJvb2xlYW4gc3BlY2NoYXJmb3VuZD1mYWxzZTsKLSAgc3RhdGljIGJvb2xlYW4gdG1wc3BlY2NoYXJmb3VuZD1mYWxzZTsKLQotICBzdGF0aWMgbG9uZyBkaWZmOwotCi0gIC8vUmVhZHMgYSBmaWxlIHdoZXJlIGVhY2ggcm93IGNvbnRhaW5zIHR3byB2YWx1ZXMgc2VwYXJhdGVkIHdpdGggXHQgc2lnbgotICAvLyBUaGUgc3ludGF4IG9mIGVhY2ggbGluZSBjYW4gYmUgZWlnaHRlcgotICAvLyB2YWx1ZSAgdmFsdWUKLSAgLy8gb3IKLSAgLy8gInZhbHVlIiAgICAidmFsdWUiCi0gIC8vCi0gIC8vIFRoZSBzeW50YXggbXVzdCBiZSB0aGUgc2FtZSBmb3IgZWFjaCByb3cgaW4gdGhlIGZpbGUuCi0gIHN0YXRpYyBib29sZWFuIHJlYWRUd29WYWx1ZUZpbGUoU3RyaW5nIGZpbGUsIFN0cmluZyBjaGFyYWN0ZXJTZXQpCi0gIHsKLSAgICAgICBJTy5wcmludERlYnVnKCJyZWFkVHdvVmFsdWVGaWxlICIgKTsgLy8kTk9OLU5MUy0xJAotICAgICBpZihmaWxlPT1udWxsKQotICAgICB7Ci0gICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiTWlzY1N0YXRpYzpyZWFkVHdvVmFsdWVGaWxlIiArIEhlbHBNZXNzYWdlcy5JTlBVVF9QQVJBTUVURVJfTlVMTCk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICB9Ci0gICAgICAgSU8ucHJpbnREZWJ1ZygiYmVmb3JlIGxvYWRmaWxlICIgICsgZmlsZSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgU3RyaW5nIGluZmlsZSA9IGxvYWRGaWxlKGZpbGUsY2hhcmFjdGVyU2V0KTsKLSAgICBJTy5wcmludERlYnVnKCJhZnRlciBsb2FkZmlsZSIpOyAvLyROT04tTkxTLTEkCi0gICAgICBpZighaW5maWxlLmVxdWFscyhEZWYuTm9uZSkpCi0gICAgICB7Ci0gICAgICAgaWYoaW5maWxlLmNoYXJBdCgwKT09JyInKQotICAgICAgIHsKLSAgICAgICAgU3RyaW5nVG9rZW5pemVyIHBhcnNlciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoCi0gICAgICAgICAgICAgICAgICAgICAgIGluZmlsZSwgIlxuIik7IC8vJE5PTi1OTFMtMSQKLQotICAgICAgICB0d29WYWx1ZUZpbGUgPSBuZXcgSGFzaHRhYmxlKCk7Ci0gICAgICAgIHdoaWxlKHBhcnNlci5oYXNNb3JlVG9rZW5zKCkpCi0gICAgICAgIHsKLQotICAgICAgICAgICBTdHJpbmcgbGluZSA9IHBhcnNlci5uZXh0VG9rZW4oKTsKLSAgICAgICAgICAgaW50IGZpcnN0Rm51dHQgPSBnZXRJbmRleChsaW5lLCJcIiIsMCk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgaW50IHNlY29uZEZudXR0ID0gZ2V0SW5kZXgobGluZSwiXCIiLCBmaXJzdEZudXR0KzEpOyAvLyROT04tTkxTLTEkCi0KLSAgICAgICAgICAgaW50IHRoaXJkRm51dHQgPSBnZXRJbmRleChsaW5lLCJcIiIsIHNlY29uZEZudXR0KzEpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgIGludCBmb3J0aEZudXR0ID0gZ2V0SW5kZXgobGluZSwiXCIiLCB0aGlyZEZudXR0KzEpOyAvLyROT04tTkxTLTEkCi0KLSAgICAgICAgICAgaWYoZmlyc3RGbnV0dD09LTEgfHwgc2Vjb25kRm51dHQ9PS0xIHx8Ci0gICAgICAgICAgICAgICB0aGlyZEZudXR0PT0tMSB8fCBmb3J0aEZudXR0PT0tMSkKLSAgICAgICAgICAgewotICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgIH0KLSAgICAgICAgICAgU3RyaW5nIGRlZiA9IGxpbmUuc3Vic3RyaW5nKGZpcnN0Rm51dHQrMSwgc2Vjb25kRm51dHQpOwotICAgICAgICAgICBTdHJpbmcgdGV4dCA9IGxpbmUuc3Vic3RyaW5nKHRoaXJkRm51dHQrMSwgZm9ydGhGbnV0dCk7Ci0gICAgICAgICAgIHR3b1ZhbHVlRmlsZS5wdXQoZGVmLHRleHQpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgICBTdHJpbmdUb2tlbml6ZXIgcGFyc2VyID0gbmV3IFN0cmluZ1Rva2VuaXplcigKLSAgICAgICAgICAgICAgICAgICAgICAgaW5maWxlLCAiXHRcbiIpOyAvLyROT04tTkxTLTEkCi0KLSAgICAgICAgIHR3b1ZhbHVlRmlsZSA9IG5ldyBIYXNodGFibGUoKTsKLSAgICAgICAgIHdoaWxlKHBhcnNlci5oYXNNb3JlVG9rZW5zKCkpCi0gICAgICAgICB7Ci0gICAgICAgICAgICB0d29WYWx1ZUZpbGUucHV0KHBhcnNlci5uZXh0VG9rZW4oKS50cmltKCkscGFyc2VyLm5leHRUb2tlbigpLnRyaW0oKSk7Ci0gICAgICAgICB9Ci0gICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICB9Ci0gICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgLy9SZXR1cm5zIHRoZSB0ZXh0IHdpdGhpbiB0aGUgdGl0bGUgdGFncyBpbiB0aGUgaW5wdXQgc3RyaW5nCi0gIHN0YXRpYyBTdHJpbmcgZ2V0VGl0bGUoU3RyaW5nIHJlYWxTdHJpbmcpCi0gIHsKLSAgICAgIGlmKHJlYWxTdHJpbmc9PW51bGwpCi0gICAgICB7Ci0gICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiTWlzY1N0YXRpYzpnZXRUaXRsZSIgKyBIZWxwTWVzc2FnZXMuSU5QVVRfUEFSQU1FVEVSX05VTEwpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIHJldHVybiBudWxsOwotICAgICAgfQotICAgICBTdHJpbmcgdXBwZXJTdHJpbmcgPSByZWFsU3RyaW5nLnRvVXBwZXJDYXNlKCk7Ci0gICAgIGludCB0aXRsZVN0YXJ0ID0gZ2V0SW5kZXgodXBwZXJTdHJpbmcsICJUSVRMRSIsMCk7IC8vJE5PTi1OTFMtMSQKLSAgICAgaWYodGl0bGVTdGFydCE9LTEpCi0gICAgIHsKLSAgICAgICAgaW50IHRpdGxlU3RhcnRFbmRUID0gZ2V0SW5kZXgodXBwZXJTdHJpbmcsICI+Iix0aXRsZVN0YXJ0KTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBpZih0aXRsZVN0YXJ0RW5kVCE9LTEpCi0gICAgICAgIHsKLSAgICAgICAgICBpbnQgdGl0bGVFbmQgPSBnZXRJbmRleCh1cHBlclN0cmluZywgIjwvVElUTEUiLHRpdGxlU3RhcnRFbmRUKzEpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgaWYodGl0bGVFbmQhPS0xKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZyB0aXRsZSA9IHJlYWxTdHJpbmcuc3Vic3RyaW5nKHRpdGxlU3RhcnRFbmRUKzEsdGl0bGVFbmQpLnRyaW0oKTsKLSAgICAgICAgICAgIHJldHVybiB0aXRsZTsKLSAgICAgICAgICAgfQotICAgICAgICAgfQotICAgICAgIH0KLSAgICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotCi0gIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgLy9SZXR1cm4gdGhlIGluZGV4IHdpdGhpbiB0aGUgaW5wdXQgc3RyaW5nIHdoZXJlIHRoZSBmaXJzdCBvY2N1cmFuY2Ugb2YgdGhlIHN0aW5nIG1hdGNoCi0gIC8vIHN0YXJ0cy4gU2VhcmNoZXMgZnJvbSB0aGUgaW5kZXggZGVmaW5lZCBieSB0aGUgcGFyYW1ldGVyIHN0YXJ0Ci0gIHN0YXRpYyBpbnQgZ2V0SW5kZXgoU3RyaW5nIHN0ciwgU3RyaW5nIG1hdGNoLCBpbnQgc3RhcnQpCi0gIHsKLSAgICAgaWYoc3RyPT1udWxsKQotICAgICAgewotICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIk1pc2NTdGF0aWM6Z2V0SW5kZXhcbiIgKyBIZWxwTWVzc2FnZXMuSU5QVVRfUEFSQU1FVEVSX05VTEwpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIHJldHVybiAtMTsKLSAgICAgfQotCi0gICAgICBpZihtYXRjaD09bnVsbCkKLSAgICAgIHsKLSAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJNaXNjU3RhdGljOmdldEluZGV4XG4iICsgSGVscE1lc3NhZ2VzLklOUFVUX1BBUkFNRVRFUl9OVUxMKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICByZXR1cm4gLTE7Ci0gICAgIH0KLSAgICAgaW50IGZvdW5kID0gc3RyLmluZGV4T2YobWF0Y2gudG9VcHBlckNhc2UoKSwgc3RhcnQpOwotICAgICBpZihmb3VuZD09LTEpCi0gICAgIHsKLSAgICAgICAgZm91bmQgPSBzdHIuaW5kZXhPZihtYXRjaC50b0xvd2VyQ2FzZSgpLCBzdGFydCk7Ci0gICAgIH0KLQotICAgICBpZihmb3VuZD09LTEpCi0gICAgIHsKLSAgICAgICAgZm91bmQgPSBzdHIuaW5kZXhPZihtYXRjaCwgc3RhcnQpOwotICAgICB9Ci0gICAgIHJldHVybiBmb3VuZDsKLSAgfQotICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgLy8gUHJpbnRzIHRoZSBhIHN0cmluZyB0byBhIERhdGFPdXRwdXRTdHJlYW0KLSAgIHN0YXRpYyBib29sZWFuIHByaW50KE91dHB1dFN0cmVhbVdyaXRlciBvdXRQLCBTdHJpbmcgc3RyKQotICAgewotICAgIGlmKG91dFA9PW51bGwpCi0gICAgewotICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIk1pc2NTdGF0aWM6cHJpbnRcbiIgKyBIZWxwTWVzc2FnZXMuQkFEX09VVFBVVF9TVFJFQU0pOyAvLyROT04tTkxTLTEkCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgfQotICAgICBpZihzdHI9PW51bGwpCi0gICAgIHsKLSAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJNaXNjU3RhdGljOnByaW50XG4iICsgSGVscE1lc3NhZ2VzLklOUFVUX1BBUkFNRVRFUl9OVUxMKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgIH0KLSAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICBvdXRQLndyaXRlKHN0ciwwLHN0ci5sZW5ndGgoKSk7Ci0gICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoKEV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIk1pc2NTdGF0aWM6cHJpbnQiICsgSGVscE1lc3NhZ2VzLldSSVRFX0VYQ0VQVElPTiArIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgZS50b1N0cmluZygpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgIH0KLQotICAgLy8gUHJpbnRzIHRoZSBhIHN0cmluZyB0byBhIERhdGFPdXRwdXRTdHJlYW0gaW4gVVRGIGZvcm1hdAotICAgc3RhdGljIGJvb2xlYW4gcHJpbnRVVEYoRGF0YU91dHB1dFN0cmVhbSBvdXRQLCBTdHJpbmcgc3RyKQotICAgewotICAgIGlmKG91dFA9PW51bGwpCi0gICAgewotICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIk1pc2NTdGF0aWM6cHJpbnRVVEZcbiIgKyBIZWxwTWVzc2FnZXMuQkFEX09VVFBVVF9TVFJFQU0pOyAvLyROT04tTkxTLTEkCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgfQotICAgICBpZihzdHI9PW51bGwpCi0gICAgIHsKLSAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJNaXNjU3RhdGljOnByaW50VVRGXG4iICsgSGVscE1lc3NhZ2VzLklOUFVUX1BBUkFNRVRFUl9OVUxMKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgIH0KLSAgICAgICB0cnkKLSAgICAgICAgewotCi0gICAgICAgICBvdXRQLndyaXRlVVRGKHN0cik7Ci0gICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaChFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJNaXNjU3RhdGljOnByaW50VVRGIiArIEhlbHBNZXNzYWdlcy5XUklURV9FWENFUFRJT04gKyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgIGUudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgfQotCi0KLSAgc3RhdGljIHZvaWQgcHJpbnRTcGFjZShPdXRwdXRTdHJlYW1Xcml0ZXIgb3V0UCwgaW50IG5vT2ZTcGFjZSkKLSAgIHsKLSAgICAgIGZvcihpbnQgaT0wO2k8bm9PZlNwYWNlO2krKykKLSAgICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgIG91dFAud3JpdGUoIiZuYnNwOyIsMCw2KTsgLy8kTk9OLU5MUy0xJAotICAgICAgICB9Ci0gICAgICAgIGNhdGNoKEV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiTWlzY1N0YXRpYzpwcmludFNwYWNlIiArIEhlbHBNZXNzYWdlcy5XUklURV9FWENFUFRJT04gKyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgIGUudG9TdHJpbmcoKSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgfQotCi0gICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgLy8gUmVhZCBhIGZpbGUgYW5kIHJldHVybiBpdCBhcyBhIGNvbmNhdGVuYXRlZCBzdHJpbmcuCi0gICBzdGF0aWMgU3RyaW5nIGxvYWRGaWxlKFN0cmluZyBmaWxlTmFtZSxTdHJpbmcgY2hhcmFjdGVyc2V0KQotICAgewkgIAotCSAgIHRyeQotCSAgIHsKLQkJICAgcmV0dXJuIEZpbGVVdGlsLnJlYWRGaWxlKG5ldyBGaWxlKGZpbGVOYW1lKSwgY2hhcmFjdGVyc2V0KS50b1N0cmluZygpOyAgIAotCSAgIH0KLQkgICBjYXRjaCAoRXhjZXB0aW9uIGV4KQotCSAgIHsKLQkJICAgOwotCSAgIH0KLQkgICAKLQkgICByZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLSAgIC8vIENvbnZlcnRzIGFsbCBsZXR0ZXJzIGxpa2UgXHVmZmZkLFx1ZmZmZCxcdWZmZmQgdG8gc3BlY2lhbCBjb2RlcwotICAgc3RhdGljIHZvaWQgc3BlY0NoYXIoU3RyaW5nIGluLCBTdHJpbmcgb3V0LCBTdHJpbmcgY2hhcmFjdGVyc2V0KQotICAgewotICAgICBpZihpbj09bnVsbCkKLSAgICAgewotICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIk1pc2NTdGF0aWM6c3BlY0NoYXJcbiIgKyBIZWxwTWVzc2FnZXMuSU5QVVRfUEFSQU1FVEVSX05VTEwpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIHJldHVybjsKLSAgICAgfQotCi0gICAgIGlmKG91dD09bnVsbCkKLSAgICAgewotICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIk1pc2NTdGF0aWM6c3BlY0NoYXJcbiIgKyBIZWxwTWVzc2FnZXMuSU5QVVRfUEFSQU1FVEVSX05VTEwpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIHJldHVybjsKLSAgICAgfQotICAgICAgICBTdHJpbmcgdG1wRmlsZSA9ICIxM2Q4NC5od3IiOyAvLyROT04tTkxTLTEkCi0gICAgICAgIFN0cmluZyBpbmZpbGUgPSBudWxsOwotICAgICAgICBTdHJpbmcgdG1wSW5maWxlID0gTWlzY1N0YXRpYy5sb2FkRmlsZShpbixjaGFyYWN0ZXJzZXQpOwotICAgICAgICBib29sZWFuIHdyaXRlUmVzdWx0ID0gdHJ1ZTsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLQotICAgICAgICAgICBPdXRwdXRTdHJlYW1Xcml0ZXIgb3V0UDsKLSAgICAgICAgICAgaWYoY2hhcmFjdGVyc2V0IT1udWxsKQotICAgICAgICAgICB7Ci0gICAgICAgICAgICAgb3V0UCA9IG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIoCi0gICAgICAgICAgICAgICAgICBuZXcgRmlsZU91dHB1dFN0cmVhbSh0bXBGaWxlKSxjaGFyYWN0ZXJzZXQpOwotICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBvdXRQID0gbmV3IE91dHB1dFN0cmVhbVdyaXRlcigKLSAgICAgICAgICAgICAgICAgIG5ldyBGaWxlT3V0cHV0U3RyZWFtKHRtcEZpbGUpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICB3cml0ZVJlc3VsdCAgPSBNaXNjU3RhdGljLnByaW50KG91dFAsdG1wSW5maWxlKTsKLSAgICAgICAgICAgaWYoIXdyaXRlUmVzdWx0KQotICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiTWlzY1N0YXRpYzpzcGVjQ2hhciIgKyBIZWxwTWVzc2FnZXMuV1JJVEVfRVhDRVBUSU9OICsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICBpbik7Ci0gICAgICAgICAgIH0KLSAgICAgICAgICAgb3V0UC5jbG9zZSgpOwotICAgICAgICAgfQotICAgICAgICAgY2F0Y2goRXhjZXB0aW9uIGUpCi0gICAgICAgICB7Ci0gICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJNaXNjU3RhdGljOnNwZWNDaGFyIiArIEhlbHBNZXNzYWdlcy5XUklURV9FWENFUFRJT04gKyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgIGUpOwotICAgICAgICAgfQotCi0gICAgICAgICAgIGlmKHdyaXRlUmVzdWx0KQotICAgICAgICAgICB7Ci0gICAgICAgICAgICAgaW5maWxlID0gTWlzY1N0YXRpYy5sb2FkRmlsZSh0bXBGaWxlLGNoYXJhY3RlcnNldCk7Ci0gICAgICAgICAgIH0KLSAgICAgICAgICAgZWxzZQotICAgICAgICAgICB7Ci0gICAgICAgICAgICAgaW5maWxlPW51bGw7Ci0gICAgICAgICAgIH0KLQotCi0KLQotICAgICAgICBpZihpbmZpbGUhPW51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgU3RyaW5nQnVmZmVyIHJlc3VsdGZpbGU9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQotICAgICAgICAgICAgIGZvcihpbnQgaT0wO2k8aW5maWxlLmxlbmd0aCgpO2krKykKLSAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdG1wc3BlY2NoYXJmb3VuZD1mYWxzZTsKLSAgICAgICAgICAgICAgICBjaGFyIHQgPSBpbmZpbGUuY2hhckF0KGkpOwotICAgICAgICAgICAgICAgIGlmKHQhPScmJykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmKCh0PidhJyAmJiB0PCd6JykgfHwgKHQ+J0EnICYmIHQ8J1onKSB8fCAodD4nMCcgJiYgdDwnOScpIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgIHQ9PSc8JyB8fCB0PT0nPicgfHwgdD09Jy8nIHx8IHQ9PScuJyB8fCB0PT0nPScgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgdD09Jy0nIHx8IHQ9PSclJyB8fCB0PT0nQCcpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdGZpbGUuYXBwZW5kKHQpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdGZpbGUuYXBwZW5kKE1pc2NTdGF0aWMudG9TcGVjQ2hhcih0KSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICBjaGFyIHQyID0gaW5maWxlLmNoYXJBdChpKzEpOwotICAgICAgICAgICAgICAgICAgIGlmKHQyPT0nICcgfHwgdDI9PSdcbicpCi0gICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ZmlsZS5hcHBlbmQoIiZhbXA7Iik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgIHRtcHNwZWNjaGFyZm91bmQ9dHJ1ZTsKLSAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICByZXN1bHRmaWxlLmFwcGVuZChNaXNjU3RhdGljLnRvU3BlY0NoYXIodCkpOwotICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYodG1wc3BlY2NoYXJmb3VuZD09dHJ1ZSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgc3BlY2NoYXJmb3VuZD10cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICBpZihzcGVjY2hhcmZvdW5kKQotICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oSGVscE1lc3NhZ2VzLldSSVRFX0ZJTEUgKyBvdXQpOwotICAgICAgICAgICAgICAgIE91dHB1dFN0cmVhbVdyaXRlciBvdXRQOwotICAgICAgICAgICAgICAgIGlmKGNoYXJhY3RlcnNldCE9bnVsbCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBvdXRQID0gbmV3IE91dHB1dFN0cmVhbVdyaXRlcigKLSAgICAgICAgICAgICAgICAgICAgICBuZXcgRmlsZU91dHB1dFN0cmVhbShvdXQpLGNoYXJhY3RlcnNldCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgb3V0UCA9IG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIoCi0gICAgICAgICAgICAgICAgICAgICAgbmV3IEZpbGVPdXRwdXRTdHJlYW0ob3V0KSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIE1pc2NTdGF0aWMucHJpbnQob3V0UCwgcmVzdWx0ZmlsZS50b1N0cmluZygpKTsKLSAgICAgICAgICAgICAgICBvdXRQLmNsb3NlKCk7Ci0gICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgc3BlY2NoYXJmb3VuZD1mYWxzZTsKLQotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2goRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIk1pc2NTdGF0aWM6c3BlY0NoYXIiICsgSGVscE1lc3NhZ2VzLldSSVRFX0VYQ0VQVElPTiArIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgRmlsZSB0bXAgPSBuZXcgRmlsZSh0bXBGaWxlKTsKLSAgICAgICAgICAgICAgdG1wLmRlbGV0ZSgpOwotCi0gICAgIH0KLSAgIH0KLQotICAgLy9jb252ZXJ0cyBhIGNoYXJhY3RlciB0byBhIHNwZWNpYWwgY29kZSBpZiBuZWVkZWQKLSAgIHN0YXRpYyBTdHJpbmcgdG9TcGVjQ2hhcihjaGFyIHRva2VuKQotICAgewotICAgICAgICB0bXBzcGVjY2hhcmZvdW5kPXRydWU7Ci0gICAgICAgIGlmKHRva2VuPT0nXHVmZmZkJykKLQkJewotCQkgICAgcmV0dXJuICImYXJpbmc7IjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWlmKHRva2VuPT0nXHVmZmZkJykKLQkJewotCSAgICAgIHJldHVybiAiJkFyaW5nOyI7IC8vJE5PTi1OTFMtMSQKLQkgICAgfQotCi0JCWlmKHRva2VuPT0nXHVmZmZkJykKLQkJewotCQkJcmV0dXJuICImQXVtbDsiOyAvLyROT04tTkxTLTEkCi0JCX0KLQkgICAgaWYodG9rZW49PSdcdWZmZmQnKQotCSAgICB7Ci0JCSByZXR1cm4gIiZhdW1sOyI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCSAgICBpZih0b2tlbj09J1x1ZmZmZCcpCi0JCXsKLQkJICByZXR1cm4gIiZPdW1sOyI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCSAgICBpZih0b2tlbj09J1x1ZmZmZCcpCi0JCXsKLQkJICByZXR1cm4gIiZvdW1sOyI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCSAgICBpZih0b2tlbj09J1x1ZmZmZCcpCi0JCXsKLQkJCXJldHVybiAiJkVhY3V0ZTsiOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJaWYodG9rZW49PSdcdWZmZmQnKQotCQl7Ci0JCQlyZXR1cm4gIiZFZ3JhdmU7IjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJaWYodG9rZW49PSdcdWZmZmQnKQotCQl7Ci0JCQkgICByZXR1cm4gIiZVdW1sOyI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCWlmKHRva2VuPT0nXHVmZmZkJykKLQkJewotCQkJIHJldHVybiAiJmFhY3V0ZTsiOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlpZih0b2tlbj09J1x1ZmZmZCcpCi0JCXsKLQkJCSByZXR1cm4gIiZBYWN1dGU7IjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWlmKHRva2VuPT0nXHVmZmZkJykKLQkJewotCQkJcmV0dXJuICImYWdyYXZlOyI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlpZih0b2tlbj09J1x1ZmZmZCcpCi0JCXsKLQkJCXJldHVybiAiJmVhY3V0ZTsiOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJaWYodG9rZW49PSdcdWZmZmQnKQotCQl7Ci0JCQlyZXR1cm4gIiZlZ3JhdmU7IjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWlmKHRva2VuPT0nXHVmZmZkJykKLQkJewotCQkJcmV0dXJuICImaWFjdXRlOyI7IC8vJE5PTi1OTFMtMSQKLQotCQl9Ci0JCWlmKHRva2VuPT0nXHVmZmZkJykKLQkJewotCQkJcmV0dXJuICImaWdyYXZlOyI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlpZih0b2tlbj09J1x1ZmZmZCcpCi0JCXsKLQkJCXJldHVybiAiJmV1bWw7IjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JICAgIGlmKHRva2VuPT0nXHVmZmZkJykKLQkJewotCQkJcmV0dXJuICImb2FjdXRlOyI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlpZih0b2tlbj09J1x1ZmZmZCcpCi0JCXsKLQkJCSByZXR1cm4gIiZvZ3JhdmU7IjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJaWYodG9rZW49PSdcdWZmZmQnKQotCQl7Ci0JCQlyZXR1cm4gIiZ1YWN1dGU7IjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWlmKHRva2VuPT0nXHVmZmZkJykKLQkJewotCQkJcmV0dXJuICImdWdyYXZlOyI7IC8vJE5PTi1OTFMtMSQKLQotCQl9Ci0JICAgIGlmKHRva2VuPT0nXHVmZmZkJykKLQkJIHsKLQkJCXJldHVybiAiJnV1bWw7IjsgLy8kTk9OLU5MUy0xJAotCi0JCX0KLQotCQkgaWYodG9rZW49PSdcdWZmZmQnKQotCQkgewotCQkJcmV0dXJuICImeXVtbDsiOyAvLyROT04tTkxTLTEkCi0JCSB9Ci0JCWlmKHRva2VuPT0nXHVmZmZkJykKLQkJewotCQkJcmV0dXJuICImYWNpcmM7IjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWlmKHRva2VuPT0nXHVmZmZkJykKLQkJewotCQkJIHJldHVybiAiJkFjaXJjOyI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlpZih0b2tlbj09J1x1ZmZmZCcpCi0JCXsKLQkJCXJldHVybiAiJmVjaXJjOyI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCSAgICBpZih0b2tlbj09J1x1ZmZmZCcpCi0JCXsKLQkJcmV0dXJuICImRWNpcmM7IjsgLy8kTk9OLU5MUy0xJAotCi0JCX0KLQkJaWYodG9rZW49PSdcdWZmZmQnKQotCQl7Ci0JCSAgIHJldHVybiAiJnVjaXJjOyI7IC8vJE5PTi1OTFMtMSQKLQotCQl9Ci0JCWlmKHRva2VuPT0nXHVmZmZkJykKLQkJewotCQkJcmV0dXJuICImVWNpcmM7IjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWlmKHRva2VuPT0nXHVmZmZkJykKLQkJewotCQkJcmV0dXJuICImb2NpcmM7IjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCSBpZih0b2tlbj09J1x1ZmZmZCcpCi0JCXsKLQkJCXJldHVybiAiJk9jaXJjOyI7IC8vJE5PTi1OTFMtMSQKLQotCQl9Ci0JCWlmKHRva2VuPT0nXHVmZmZkJykKLQkJewotCQkJcmV0dXJuICImaWNpcmM7IjsgLy8kTk9OLU5MUy0xJAotCi0JCX0KLQotCQlpZih0b2tlbj09J1x1ZmZmZCcpCi0JCXsKLQkJCSByZXR1cm4gIiZBRWxpZzsiOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCSAgICBpZih0b2tlbj09J1x1ZmZmZCcpCi0JCXsKLQkJCSByZXR1cm4gIiZhZWxpZzsiOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJaWYodG9rZW49PSdcdWZmZmQnKQotCQl7Ci0JCQkgcmV0dXJuICImSWNpcmM7IjsgLy8kTk9OLU5MUy0xJAotCi0JCX0KLQkJaWYodG9rZW49PSdcdWZmZmQnKQotCQl7Ci0JCQlyZXR1cm4gIiZBZ3JhdmU7IjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWlmKHRva2VuPT0nXHVmZmZkJykKLSAgICAgICAgewotCSAgICAgICByZXR1cm4gIiZBdGlsZGU7IjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWlmKHRva2VuPT0nXHVmZmZkJykKLQkJewotCQkJIHJldHVybiAiJmF0aWxkZTsiOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlpZih0b2tlbj09J1x1ZmZmZCcpCi0JCXsKLQkJCSByZXR1cm4gIiZFVEg7IjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJaWYodG9rZW49PSdcdWZmZmQnKQotCQl7Ci0JCQkgcmV0dXJuICImZXRoOyI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCWlmKHRva2VuPT0nXHVmZmZkJykKLQkJewotCQkJIHJldHVybiAiJklncmF2ZTsiOyAvLyROT04tTkxTLTEkCi0JCX0KLQkgICAgaWYodG9rZW49PSdcdWZmZmQnKQotCQl7Ci0JCSAgICByZXR1cm4gIiZOdGlsZGU7IjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkgICAgaWYodG9rZW49PSdcdWZmZmQnKQotCQl7Ci0JCQlyZXR1cm4gIiZudGlsZGU7IjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWlmKHRva2VuPT0nXHVmZmZkJykKLQkJewotCQkJcmV0dXJuICImT3RpbGRlOyI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlpZih0b2tlbj09J1x1ZmZmZCcpCi0JCXsKLQkJCXJldHVybiAiJm90aWxkZTsiOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJaWYodG9rZW49PSdcdWZmZmQnKQotCQl7Ci0JCQlyZXR1cm4gIiZzemxpZzsiOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCSAgICBpZih0b2tlbj09J1x1ZmZmZCcpCi0JCXsKLQkJCXJldHVybiAiJlRIT1JOOyI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlpZih0b2tlbj09J1x1ZmZmZCcpCi0JCXsKLQkJCXJldHVybiAiJnRob3JuOyI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0gICAgICAgIGlmKHRva2VuPT0nXHVmZmZkJykKLQkJewotCQkgIHJldHVybiAiJk9zbGFzaDsiOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJaWYodG9rZW49PSdcdWZmZmQnKQotCQl7Ci0JCSAgcmV0dXJuICImb3NsYXNoOyI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlpZih0b2tlbj09J1x1ZmZmZCcpCi0JCXsKLQkJICByZXR1cm4gIiZPZ3JhdmU7IjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JICAgIGlmKHRva2VuPT0nXHVmZmZkJykKLQkJewotCQkJICByZXR1cm4gIiZVZ3JhdmU7IjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWlmKHRva2VuPT0nXHVmZmZkJykKLQkJewotCQkgICByZXR1cm4gIiZpdW1sOyI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JICAgIGlmKHRva2VuPT0nXHVmZmZkJykKLQkJewotCQkJICByZXR1cm4gIiZZYWN1dGU7IjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWlmKHRva2VuPT0nXHVmZmZkJykKLQkJewotCQkgICByZXR1cm4gIiZ5YWN1dGU7IjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQotCQlpZih0b2tlbj09J1x1ZmZmZCcpCi0JCXsKLQkJCXJldHVybiAiJkNjZWRpbDsiOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlpZih0b2tlbj09J1x1ZmZmZCcpCi0JCXsKLQkJCXJldHVybiAiJmNjZWRpbDsiOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQkvKmlmKHRva2VuPT0nXHVmZmZkJykKLQkJewotCQkJcmV0dXJuICImZnJhYzEyOyI7Ci0JCX0qLwotCi0gICAgICAgIHRtcHNwZWNjaGFyZm91bmQgPSBmYWxzZTsKLQkJcmV0dXJuIG5ldyBDaGFyYWN0ZXIodG9rZW4pLnRvU3RyaW5nKCk7Ci0KLSAgICAgfQotCi0gICAgICAvKioKLSAgKiBUcmltcyBkb3VibGUgcXVvdGVzIGZyb20gYW4gYXJndW1lbnQuCi0gICogQHBhcmFtIHN0cgl0aGUgc3RyaW5nIHRvIHRyaW0uCi0gICogQHJldHVybiB0aGUgdHJpbW1lZCBzdHJpbmcuCi0gKiovCi0KLSBzdGF0aWMgU3RyaW5nIHRyaW1RdW90ZXMoU3RyaW5nIHN0cikgewotCi0gIGludCBsZW4gPSBzdHIubGVuZ3RoKCk7Ci0gIGlmKGxlbiA8PSAwKSByZXR1cm4gc3RyOwotCi0gIGlmKHN0ci5jaGFyQXQobGVuIC0gMSkgPT0gJyInKSBzdHIgPSBzdHIuc3Vic3RyaW5nKDAsIGxlbiAtIDEpOwotICBpZihzdHIuY2hhckF0KDApID09ICciJykgc3RyID0gc3RyLnN1YnN0cmluZygxKTsKLQotICByZXR1cm4gc3RyOwotICB9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvc2VydmljZXMvaW5kZXgvT1MuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy9zZXJ2aWNlcy9pbmRleC9PUy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOTU1NDE1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy9zZXJ2aWNlcy9pbmRleC9PUy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcuc2VydmljZXMuaW5kZXg7Ci0KLQotZmluYWwgY2xhc3MgT1MKLXsKLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzV2luZG93czk4ID0gZmFsc2U7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1dpbmRvd3M5NSA9IGZhbHNlOwotICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNXaW5kb3dzTlQgPSBmYWxzZTsKLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzTWFjaW50b3NoID0gZmFsc2U7Ci0KLSAgICBzdGF0aWMKLSAgICB7Ci0gICAgICAgIFN0cmluZyBzOwotCi0gICAgICAgIHMgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoIm9zLm5hbWUiKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgICAgIGlmKHMuZXF1YWxzKCJXaW5kb3dzIE5UIikpIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgewotICAgICAgICAgICAgaXNXaW5kb3dzTlQgPSB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYocy5lcXVhbHMoIldpbmRvd3MgOTUiKSkgLy8kTk9OLU5MUy0xJAotICAgICAgICB7Ci0gICAgICAgICAgICBpc1dpbmRvd3M5NSA9IHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZihzLmVxdWFscygiV2luZG93cyA5OCIpKSAvLyROT04tTkxTLTEkCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlzV2luZG93czk4ID0gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChzLmVxdWFscygiTWFjaW50b3NoIikgfHwgLy8kTk9OLU5MUy0xJAotCQkJCSBzLmVxdWFscygibWFjb3MiKSB8fAkJLy9BcHBsZXQgVmlld2VyIC8vJE5PTi1OTFMtMSQKLQkJCQkgcy5lcXVhbHMoIk1hYyBPUyIpIHx8CQkvL05ldHNjYXBlIC8vJE5PTi1OTFMtMSQKLQkJCQkgcy5lcXVhbHMoIk1hY09TIikpCQkJLy9JbnRlcm5ldCBFeHBsb2RlciAvLyROT04tTkxTLTEkCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlzTWFjaW50b3NoID0gdHJ1ZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgT1MoKQotICAgIHsKLSAgICB9Ci0KLSAgICBzdGF0aWMgYm9vbGVhbiBpc1dpbmRvd3MoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChpc1dpbmRvd3M5NSgpIHx8IGlzV2luZG93c05UKCkgfHwgaXNXaW5kb3dzOTgpOwotICAgIH0KLQotICAgIHN0YXRpYyBib29sZWFuIGlzV2luZG93czk1KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoaXNXaW5kb3dzOTUpOwotICAgIH0KLQotICAgIHN0YXRpYyBib29sZWFuIGlzV2luZG93c05UKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoaXNXaW5kb3dzTlQpOwotICAgIH0KLQotICAgIHN0YXRpYyBib29sZWFuIGlzTWFjaW50b3NoKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoaXNNYWNpbnRvc2gpOwotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvc2VydmljZXMvaW5kZXgvU3BlY0tleVdvcmQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy9zZXJ2aWNlcy9pbmRleC9TcGVjS2V5V29yZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYjQxZmVlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy9zZXJ2aWNlcy9pbmRleC9TcGVjS2V5V29yZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcuc2VydmljZXMuaW5kZXg7Ci0KLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbVdyaXRlcjsKLQotLy9BIGtleXdvcmQgZGVmaW5lZCBpbiBhIHNlcGFyYXRlIGZpbGUKLS8vVGhpcyBrZXl3b3JkIHJlZmZlcnMgdG8gYSBrZXl3b3JkIGRlZmluZWQgaW4gYSBodG1sIGZpbGUKLWNsYXNzIFNwZWNLZXlXb3JkCi17Ci0gICAgcHJpdmF0ZSBTdHJpbmcgcmVsYXRlZEtleVdvcmQ9bnVsbDsKLSAgICBwcml2YXRlIGJvb2xlYW4gc2VlPXRydWU7Ci0KLSAgICBTcGVjS2V5V29yZChTdHJpbmcgcmVsYXRlZEtleVdvcmQsIGJvb2xlYW4gbW9kZSkKLSAgICB7Ci0gICAgICAgIGlmKHJlbGF0ZWRLZXlXb3JkPT1udWxsKQotICAgICAgICB7Ci0gICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiU3BlY0tleVdvcmQ6U3BlY0tleVdvcmRcbiIgKyBIZWxwTWVzc2FnZXMuSU5QVVRfUEFSQU1FVEVSX05VTEwpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIH0KLSAgICAgICB0aGlzLnJlbGF0ZWRLZXlXb3JkID0gcmVsYXRlZEtleVdvcmQ7Ci0gICAgICAgdGhpcy5zZWUgPSBtb2RlOwotICAgIH0KLQotICAgIC8vUHJpbnRzIHRoZSBrZXl3b3JkCi0gICAgdm9pZCBwcmludChPdXRwdXRTdHJlYW1Xcml0ZXIgb3V0UCkKLSAgICB7Ci0gICAgICBpZihvdXRQPT1udWxsKQotICAgICAgewotICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJTcGVjS2V5V29yZDpwcmludFxuIiArIEhlbHBNZXNzYWdlcy5CQURfT1VUUFVUX1NUUkVBTSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICAgIGlmKHJlbGF0ZWRLZXlXb3JkIT1udWxsKQotICAgICAgewotICAgICAgIGlmKHNlZSkKLSAgICAgICB7Ci0gICAgICAgICBNaXNjU3RhdGljLnByaW50KG91dFAsIEtleVdvcmRJbmRleEhlbHBlci5kZWZPYmouZ2V0U2VlKCkpOwotICAgICAgIH0KLSAgICAgICBlbHNlCi0gICAgICAgewotICAgICAgICAgTWlzY1N0YXRpYy5wcmludChvdXRQLCBLZXlXb3JkSW5kZXhIZWxwZXIuZGVmT2JqLmdldFNlZUFsc28oKSk7Ci0gICAgICAgfQotICAgICAgICBNaXNjU3RhdGljLnByaW50KG91dFAsICI8QSBIUkVGPVwiIyIgKyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgcmVsYXRlZEtleVdvcmQgKyAiXCI+IiArIHJlbGF0ZWRLZXlXb3JkICsgIjwvQT5cbiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBib29sZWFuIGlzU2VlKCkKLSAgICB7Ci0gICAgICAgcmV0dXJuIHNlZTsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3NlcnZpY2VzL2luZGV4L1N0cmluZ0RlZmluaXRpb25zLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvc2VydmljZXMvaW5kZXgvU3RyaW5nRGVmaW5pdGlvbnMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWZjNmQ4MC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvc2VydmljZXMvaW5kZXgvU3RyaW5nRGVmaW5pdGlvbnMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnNlcnZpY2VzLmluZGV4OwotCi0vKipDbGFzc2VzIHVzZWQgZm9yIGFsbCBzdHJpbmcgbWVzc2FnZXMgdGhhdCBtYXkgbmVlZCB0byBiZSBsb2NhbGl6ZWQKLSAqLwotY2xhc3MgU3RyaW5nRGVmaW5pdGlvbnMKLXsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFUlJPUl9ERUZJTklUSU9OX0ZJTEVfTk9UX0ZPVU5EID0gIlRoZSBjb25maWd1cmF0aW9uL2RlZmluaXRpb24gZmlsZXMgaGFzIG5vdCBiZWVuIGRlZmluZWQiOyAvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvc2VydmljZXMvaW5kZXgvcGFja2FnZS5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3NlcnZpY2VzL2luZGV4L3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWI0NzFkOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvc2VydmljZXMvaW5kZXgvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgaW1wbGVtZW50YXRpb24gc3VwcG9ydCBmb3IgZ2VuZXJhdGluZyB0aGUgaW5kZXggYW5kIGdsb3NzYXJ5IHBhZ2VzIGluIGEgcHVibGlzaGVkIGNvbmZpZ3VyYXRpb24uCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3NlcnZpY2VzL3BhY2thZ2UuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy9zZXJ2aWNlcy9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmMWM2ZGIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3NlcnZpY2VzL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIHRoZSBpbnRlcmZhY2VzIGFuZCBpbXBsZW1lbnRhdGlvbiBmb3IgdGhlIHB1Ymxpc2hpbmcgc2VydmljZS4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvc2VydmljZXMvc2VhcmNoL1N0b3BXb3JkUmVhZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvc2VydmljZXMvc2VhcmNoL1N0b3BXb3JkUmVhZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwNjRjNTUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3NlcnZpY2VzL3NlYXJjaC9TdG9wV29yZFJlYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnNlcnZpY2VzLnNlYXJjaDsKLQotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIHJlYWRzIGluIGEgY29uZmlndXJhdGlvbiBmaWxlIG9mIHN0b3Agd29yZHMKLSAqIGFuZCBwcm92aWRlcyB0aGUgc3RvcCB3b3JkcyBhcyBhIGxpc3QuIDxicj4KLSAqLwotY2xhc3MgU3RvcFdvcmRSZWFkZXIKLXsKLQlwcml2YXRlIHN0YXRpYyBWZWN0b3IgX3N0b3B3b3JkcyA9IG51bGw7Ci0KLQkvKioKLQkgKiBEZWZhdWx0IGNvbnN0cnVjdG9yLgotCSAqLwotCXByaXZhdGUgU3RvcFdvcmRSZWFkZXIoKQotCXsKLQl9Ci0KLQkvKioKLQkgKiBSZXRyaWV2ZSB0aGUgc2V0IG9mIHN0b3B3b3JkcyBmcm9tIHRoZSBnaXZlbiBmaWxlLgotCSAqLwotCXN0YXRpYyBTdHJpbmdbXSBnZXRTdG9wd29yZHMoIFN0cmluZyBmaWxlcGF0aCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGZpbGVuYW1lICkKLQl7Ci0JCWlmKCBudWxsID09IF9zdG9wd29yZHMgKQotCQl7Ci0JCQlfc3RvcHdvcmRzID0gbmV3IFZlY3RvcigpOwotCi0JICAgIAl0cnkKLSAJICAgCQl7Ci0JCQkJLy8gcmVhZCBpbiB0aGUgZmlsZQotCQkJCVN0cmluZyBmdWxsRmlsZW5hbWUgPSBmaWxlcGF0aCArCi0JCQkJCQkJCQkgIEZpbGUuc2VwYXJhdG9yICsKLQkJIAkJCQkJCQkgIGZpbGVuYW1lOwotCQkgICAgICAgIEZpbGVJbnB1dFN0cmVhbSBpblN0cmVhbSA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oIGZ1bGxGaWxlbmFtZSApOwotCQkJCUlucHV0U3RyZWFtUmVhZGVyIHN0cmVhbVJlYWRlciA9IG5ldyBJbnB1dFN0cmVhbVJlYWRlciggaW5TdHJlYW0gKTsKLQkJCQlCdWZmZXJlZFJlYWRlciByZWFkID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKHN0cmVhbVJlYWRlcik7Ci0vKgkgIAkgICAgCWNoYXJbXSBjaGFyUmVhZCA9IG5ldyBjaGFyWyBpblN0cmVhbS5hdmFpbGFibGUoKSBdOwotCSAgICAgICAgCXN0cmVhbVJlYWRlci5yZWFkKCBjaGFyUmVhZCApOwotCSAgICAgICAgCVN0cmluZyBjb250ZW50ID0gbmV3IFN0cmluZyggY2hhclJlYWQgKTsKLSovCi0KLQkJCQlTdHJpbmcgd29yZCA9IHJlYWQucmVhZExpbmUoKTsKLQkJCQl3aGlsZSAod29yZCAhPSBudWxsKQotCQkJCXsKLQkJCQkJX3N0b3B3b3Jkcy5hZGQod29yZCk7Ci0JCQkJCXdvcmQgPSByZWFkLnJlYWRMaW5lKCk7Ci0JCQkJfQotCi0JICAgICAgICAJLy8gY2xvc2Ugc3RyZWFtCi0JICAgICAgICAJcmVhZC5jbG9zZSgpOwotCSAgICAgICAgCXN0cmVhbVJlYWRlci5jbG9zZSgpOwotCSAgICAgICAgCWluU3RyZWFtLmNsb3NlKCk7Ci0KLQkgICAgICAgIAkvLyBwYXJzZUNvbnRlbnQKLS8vCSAgICAgICAgCXBhcnNlQ29udGVudCggY29udGVudCwgX3N0b3B3b3JkcyApOwotCQkJfQotCQkJY2F0Y2goIEV4Y2VwdGlvbiBlICkKLQkJCXsKLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJfQotCQl9Ci0KLQkJT2JqZWN0W10gc3RvcE9iamVjdHMgPSBfc3RvcHdvcmRzLnRvQXJyYXkoKTsKLQkJU3RyaW5nW10gc3RvcFN0cmluZ3MgPSBuZXcgU3RyaW5nWyBzdG9wT2JqZWN0cy5sZW5ndGggXTsKLQkJZm9yKCBpbnQgaSA9IDA7IGkgPCBzdG9wT2JqZWN0cy5sZW5ndGg7IGkrKyApCi0JCXsKLQkJCXN0b3BTdHJpbmdzWyBpIF0gPSAoU3RyaW5nKXN0b3BPYmplY3RzWyBpIF07Ci0JCX0KLQkJcmV0dXJuKCBzdG9wU3RyaW5ncyApOwotCi0JfQotCi0JLyoqCi0JICogUGFyc2VzIHRoZSBjb250ZW50IGludG8gc3RvcHdvcmRzLgotCSAqLwotLyoKLQlwcml2YXRlIHN0YXRpYyB2b2lkIHBhcnNlQ29udGVudCggU3RyaW5nIGNvbnRlbnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3RvciBfc3RvcHdvcmRzICkKLQl7Ci0JCVN0cmluZ1Rva2VuaXplciB0b2tlbml6ZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKCBjb250ZW50LAotCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmdldFByb3BlcnR5KCAibGluZS5zZXBhcmF0b3IiICkgKTsKLQkJd2hpbGUoIHRva2VuaXplci5oYXNNb3JlRWxlbWVudHMoKSApCi0JCXsKLQkJCV9zdG9wd29yZHMuYWRkRWxlbWVudCggdG9rZW5pemVyLm5leHRFbGVtZW50KCkgKTsKLQkJfQotCX0KLSovCi19Ci0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy9zZXJ2aWNlcy9zZWFyY2gvcGFja2FnZS5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3NlcnZpY2VzL3NlYXJjaC9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzYmI2NzcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3NlcnZpY2VzL3NlYXJjaC9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyBpbXBsZW1lbnRhdGlvbiBzdXBwb3J0IGZvciBpbmRleGluZyBhIHB1Ymxpc2hlZCBjb25maWd1cmF0aW9uLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy91dGlsL1B1Ymxpc2hpbmdVdGlsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvdXRpbC9QdWJsaXNoaW5nVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZGMwMzU2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy91dGlsL1B1Ymxpc2hpbmdVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudXRpbDsKLQotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLlN0cmluZ1dyaXRlcjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7Ci1pbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7Ci1pbXBvcnQgamF2YS51dGlsLnppcC5aaXBFbnRyeTsKLWltcG9ydCBqYXZhLnV0aWwuemlwLlppcE91dHB1dFN0cmVhbTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5GaWxlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi54bWwuWFNMVFByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnNlcnZpY2VzLkRpYWdyYW1NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC51dGlsLlhtbEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LnV0aWwuWG1sSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuUmVzb3VyY2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLnV0aWwuUGVyc2lzdGVuY2VVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLlB1Ymxpc2hpbmdQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50Q2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DdXN0b21DYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaWJhYmxlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzOwotCi0vKioKLSAqIEhlbHBlciB1dGlsaXRpZXMgZm9yIHB1Ymxpc2hpbmcuCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFB1Ymxpc2hpbmdVdGlsIHsKLQotCS8qKgotCSAqIFppcHMgdGhlIGNvbnRlbnQgb2YgYSBkaXJlY3RvcnkgaW50byBhIEpBUiBmaWxlLgotCSAqIDxwPgotCSAqIE5vbi1zdWItZm9sZGVycyBhcmUgaW5jbHVkZWQuCi0JICogCi0JICogQHBhcmFtIGphckRpcgotCSAqICAgICAgICAgICAgdGhlIGRpcmVjdG9yeSB0byBiZSB6aXBwZWQKLQkgKiBAcGFyYW0gamFyRmlsZQotCSAqICAgICAgICAgICAgdGhlIG91dHB1dCBKQVIgZmlsZQotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUgY3JlYXRpbmcgdGhlIEpBUiBmaWxlCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGphckZpbGVzKEZpbGUgamFyRGlyLCBGaWxlIGphckZpbGUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCUZpbGVbXSBmaWxlcyA9IGphckRpci5saXN0RmlsZXMoKTsKLQkJaWYgKGphckZpbGUuZXhpc3RzKCkpIHsKLQkJCWphckZpbGUuZGVsZXRlKCk7Ci0JCX0KLQkJQnVmZmVyZWRPdXRwdXRTdHJlYW0gYlN0cmVhbSA9IG5ldyBCdWZmZXJlZE91dHB1dFN0cmVhbSgKLQkJCQluZXcgRmlsZU91dHB1dFN0cmVhbShqYXJGaWxlKSk7Ci0JCVppcE91dHB1dFN0cmVhbSB6aXBwZXJTdHJlYW0gPSBuZXcgWmlwT3V0cHV0U3RyZWFtKGJTdHJlYW0pOwotCi0JCWJ5dGVbXSBieXRlcyA9IG5ldyBieXRlWzQwOTZdOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlGaWxlIGN1cnJlbnRGaWxlID0gZmlsZXNbaV07Ci0JCQlpZiAoY3VycmVudEZpbGUuaXNEaXJlY3RvcnkoKSkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJWmlwRW50cnkgY3VyckVudHJ5ID0gbmV3IFppcEVudHJ5KGN1cnJlbnRGaWxlLmdldE5hbWUoKSk7Ci0JCQl6aXBwZXJTdHJlYW0ucHV0TmV4dEVudHJ5KGN1cnJFbnRyeSk7Ci0JCQlCdWZmZXJlZElucHV0U3RyZWFtIGJpU3RyZWFtID0gbmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0oCi0JCQkJCW5ldyBGaWxlSW5wdXRTdHJlYW0oY3VycmVudEZpbGUpKTsKLQkJCXdoaWxlIChiaVN0cmVhbS5hdmFpbGFibGUoKSA+IDApIHsKLQkJCQlpbnQgbnVtID0gYmlTdHJlYW0ucmVhZChieXRlcyk7Ci0JCQkJemlwcGVyU3RyZWFtLndyaXRlKGJ5dGVzLCAwLCBudW0pOwotCQkJfQotCQkJYmlTdHJlYW0uY2xvc2UoKTsKLQkJCXppcHBlclN0cmVhbS5jbG9zZUVudHJ5KCk7Ci0JCX0KLQkJemlwcGVyU3RyZWFtLmNsb3NlKCk7Ci0JCWJTdHJlYW0uY2xvc2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBHZW5lcmF0ZXMgdGhlIEhUTUwgY29udGVudCBmb3IgYSBnaXZlbiBYTUwgZWxlbWVudCBhbmQgWFNMIGZpbGUgcGF0aAotCSAqIAotCSAqIEBwYXJhbSB4bWxFbGVtZW50Ci0JICogICAgICAgICAgICBhbiBvYmplY3QgdGhhdCBjb250YWlucyB0aGUgWE1MIHJlcHJlc2VudGF0aW9uIGZvciBhIG1ldG9kCi0JICogICAgICAgICAgICBlbGVtZW50Ci0JICogQHBhcmFtIHhzbFBhdGgKLQkgKiAgICAgICAgICAgIHBhdGggdG8gYSBYU0wgZmlsZQotCSAqIEByZXR1cm4gdGhlIG91dHB1dCBIVE1MCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0SHRtbChYbWxFbGVtZW50IHhtbEVsZW1lbnQsIFN0cmluZyB4c2xQYXRoKSB7Ci0JCXRyeSB7Ci0JCQkvLyBzZXQgdGhlIGxhbmd1YWdlIGF0dHJpYnV0ZQotCQkJTG9jYWxlIGxvY2FsZSA9IExvY2FsZS5nZXREZWZhdWx0KCk7Ci0JCQlTdHJpbmcgbGFuZyA9IGxvY2FsZS5nZXRMYW5ndWFnZSgpOwotCQkJeG1sRWxlbWVudC5zZXRBdHRyaWJ1dGUoImxhbmciLCBsYW5nKTsgLy8kTk9OLU5MUy0xJAotCi0JCQlVUkwgdXJsID0gbmV3IFVSTChQdWJsaXNoaW5nUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbnN0YWxsVVJMKCksCi0JCQkJCXhzbFBhdGgpOwotCQkJaWYgKHVybCA9PSBudWxsKSB7Ci0JCQkJUHVibGlzaGluZ1BsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoCi0JCQkJCQkiVW5hYmxlIHRvIGFjY2VzcyBYU0wgdGVtcGxhdGUgIiArIHhzbFBhdGgpOyAvLyROT04tTkxTLTEkCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0KLQkJCVN0cmluZyB4c2xVUkkgPSBGaWxlTG9jYXRvci5yZXNvbHZlKHVybCkuZ2V0UGF0aCgpOwotCi0JCQlTdHJpbmdCdWZmZXIgeG1sID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJeG1sLmFwcGVuZChYbWxIZWxwZXIuWE1MX0hFQURFUikuYXBwZW5kKHhtbEVsZW1lbnQudG9YbWwoKSk7Ci0KLQkJCVByb3BlcnRpZXMgeHNsUGFyYW1zID0gUHVibGlzaGluZ1BsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJvcGVydGllcygKLQkJCQkJIi94c2wvcmVzb3VyY2VzLnByb3BlcnRpZXMiKTsgLy8kTk9OLU5MUy0xJAotCi0JCQkvLyBnZW5lcmF0ZSB0aGUgSFRNTAotCQkJU3RyaW5nV3JpdGVyIHN3ID0gbmV3IFN0cmluZ1dyaXRlcigpOwotCQkJWFNMVFByb2Nlc3Nvci50cmFuc2Zvcm0oeHNsVVJJLCB4bWwudG9TdHJpbmcoKSwgeHNsUGFyYW1zLCBzdyk7Ci0JCQlzdy5mbHVzaCgpOwotCi0JCQkvLyB1cmxzIGFyZSBlbmNvZGVkIGluIFhTTFQgb3V0cHV0LCBkZWNvZGUgaXQKLQkJCXJldHVybiBSZXNvdXJjZUhlbHBlcgotCQkJCQkuZGVjb2RlVXJsc0luQ29udGVudChzdy5nZXRCdWZmZXIoKS50b1N0cmluZygpKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVB1Ymxpc2hpbmdQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKAotCQkJCQkiVW5hYmxlIHRvIGdlbmVyYXRlIEhUTUwiLCBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ2hlY2tzIHdoZXRoZXIgYSBjb25maWd1cmF0aW9uIGNvbnRhaW5zIGEgdmlldyB0aGF0IHJlZmVyZW5jZXMgYSBwcm9jZXNzLgotCSAqIAotCSAqIEBwYXJhbSBjb25maWcKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24KLQkgKiBAcGFyYW0gcHJvY2VzcwotCSAqICAgICAgICAgICAgYSBjYXBhYmlsaXR5IHBhdHRlcm4gb3IgZGVsaXZlcnkgcHJvY2VzcwotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGNvbmZpZ3VyYXRpb24gY29udGFpbnMgYSB2aWV3IHRoYXQKLQkgKiAgICAgICAgIHJlZmVyZW5jZXMgYSBwcm9jZXNzCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGhhc1ZhbGlkUHJvY2Vzc1ZpZXcoTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcsCi0JCQlQcm9jZXNzIHByb2Nlc3MpIHsKLQkJZm9yIChJdGVyYXRvcjxDb250ZW50Q2F0ZWdvcnk+IHZpZXdzID0gY29uZmlnLmdldFByb2Nlc3NWaWV3cygpCi0JCQkJLml0ZXJhdG9yKCk7IHZpZXdzLmhhc05leHQoKTspIHsKLQkJCUNvbnRlbnRDYXRlZ29yeSB2aWV3ID0gdmlld3MubmV4dCgpOwotCQkJaWYgKHZpZXcgaW5zdGFuY2VvZiBDdXN0b21DYXRlZ29yeSkgewotCQkJCUN1c3RvbUNhdGVnb3J5IGNjID0gKEN1c3RvbUNhdGVnb3J5KSB2aWV3OwotCQkJCWZvciAoSXRlcmF0b3I8RGVzY3JpYmFibGVFbGVtZW50PiBpdCA9IGNjCi0JCQkJCQkuZ2V0Q2F0ZWdvcml6ZWRFbGVtZW50cygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQkJRGVzY3JpYmFibGVFbGVtZW50IGVsZW1lbnQgPSBpdC5uZXh0KCk7Ci0JCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgUHJvY2VzcykgewotCQkJCQkJaWYgKCgoUHJvY2VzcykgZWxlbWVudCkuZ2V0R3VpZCgpID09IHByb2Nlc3MuZ2V0R3VpZCgpKSB7Ci0JCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCB1bmxvYWRSZXNvdXJjZXMoQ29sbGVjdGlvbjxSZXNvdXJjZT4gcmVzb3VyY2VzKSB7Ci0JCQotCQkvL1J1bnRpbWUuZ2V0UnVudGltZSgpLmdjKCk7Ci0JCS8vbG9uZyBtMSA9IFJ1bnRpbWUuZ2V0UnVudGltZSgpLmZyZWVNZW1vcnkoKS8xMDAwMDAwOwotCQlQZXJzaXN0ZW5jZVV0aWwudW5sb2FkKHJlc291cmNlcyk7Ci0JCS8vUnVudGltZS5nZXRSdW50aW1lKCkuZ2MoKTsJCQotCQkvL2xvbmcgbTIgPSBSdW50aW1lLmdldFJ1bnRpbWUoKS5mcmVlTWVtb3J5KCkvMTAwMDAwMDsKLQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oIioqKiAiICsgTG9uZy50b1N0cmluZyhtMi1tMSkgKyAiIE1CIGZyZWVkIGJ5IHVubG9hZGluZyByZXNvdXJjZXMiKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgZGlzcG9zZURpYWdyYW1NYW5hZ2VycyhDb2xsZWN0aW9uPERpYWdyYW1NYW5hZ2VyPiBtZ3JzLCBDb2xsZWN0aW9uPERpYWdyYW1NYW5hZ2VyPiBrZWVwbGlzdCkgewotCQlmb3IgKCBJdGVyYXRvcjxEaWFncmFtTWFuYWdlcj4gaXQgPSBtZ3JzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTsgKSB7Ci0JCQlEaWFncmFtTWFuYWdlciBtZ3IgPSBpdC5uZXh0KCk7Ci0JCQlpZiAoIGtlZXBsaXN0ID09IG51bGwgfHwgIWtlZXBsaXN0LmNvbnRhaW5zKG1ncikgKSB7Ci0JCQkJbWdyLmRpc3Bvc2UoKTsKLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy91dGlsL2h0dHAvSHR0cENsaWVudFRpbWVvdXQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy91dGlsL2h0dHAvSHR0cENsaWVudFRpbWVvdXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDJlNDM2ZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvdXRpbC9odHRwL0h0dHBDbGllbnRUaW1lb3V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51dGlsLmh0dHA7Ci0KLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5QcmludFN0cmVhbTsKLWltcG9ydCBqYXZhLm5ldC5Tb2NrZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi1pbXBvcnQgc3VuLm5ldC53d3cuaHR0cC5IdHRwQ2xpZW50OwotLy9pbXBvcnQgc3VuLm5ldC4qOwotLy9pbXBvcnQgc3VuLm5ldC53d3cuKjsKLWNsYXNzIEh0dHBDbGllbnRUaW1lb3V0IGV4dGVuZHMgSHR0cENsaWVudAotewotCXByaXZhdGUgaW50IHRpbWVvdXQgPSAwIDsKLQotICAgIEh0dHBDbGllbnRUaW1lb3V0KFVSTCB1cmwsIFN0cmluZyBwcm94eSwgaW50IHByb3h5UG9ydCwgaW50IHRpbWVvdXQpIHRocm93cyBJT0V4Y2VwdGlvbgotCXsKLQkJc3VwZXIodXJsLCBwcm94eSwgcHJveHlQb3J0KTsKLQkJX3NldFRpbWVvdXQodGltZW91dCk7Ci0KLQl9Ci0KLSAgICBIdHRwQ2xpZW50VGltZW91dChVUkwgdXJsLCBpbnQgdGltZW91dCkgdGhyb3dzIElPRXhjZXB0aW9uCi0JewotCQlzdXBlcih1cmwsIChTdHJpbmcpbnVsbCwgLTEpOwotCQlzZXRUaW1lb3V0KHRpbWVvdXQpOwotICAgIH0KLQotCXByaXZhdGUgdm9pZCBfc2V0VGltZW91dChpbnQgaSkKLSAgICAJdGhyb3dzIFNvY2tldEV4Y2VwdGlvbgotCXsKLSAgICAJdGhpcy50aW1lb3V0ID0gaTsKLSAgICAJc2VydmVyU29ja2V0LnNldFNvVGltZW91dChpKSA7Ci0gCX0KLQotICAgIC8qIFRoaXMgY2xhc3MgaGFzIG5vIHB1YmxpYyBjb25zdHJ1Y3RvciBmb3IgSFRUUC4gIFRoaXMgbWV0aG9kIGlzIHVzZWQgdG8KLSAgICAgKiBnZXQgYW4gSHR0cENsaWVudCB0byB0aGUgc3BlY2lmZWQgVVJMLiAgSWYgdGhlcmUncyBjdXJyZW50bHkgYW4KLSAgICAgKiBhY3RpdmUgSHR0cENsaWVudCB0byB0aGF0IHNlcnZlci9wb3J0LCB5b3UnbGwgZ2V0IHRoYXQgb25lLgotCSAqCi0JICogbm8gbG9uZ2VyIHN5bmNyaG9uaXplZCAtLSBpdCBzbG93cyB0aGluZ3MgZG93biB0b28gbXVjaAotCSAqIHN5bmNocm9uaXplIGF0IGEgaGlnaGVyIGxldmVsCi0gICAgICovCi0gICAgc3RhdGljIEh0dHBDbGllbnRUaW1lb3V0IEdldE5ldyhVUkwgdXJsLCBpbnQgdGltZW91dCkKLSAgICB0aHJvd3MgSU9FeGNlcHRpb24gewotCQkvKiBzZWUgaWYgb25lJ3MgYWxyZWFkeSBhcm91bmQgKi8KLQkJSHR0cENsaWVudFRpbWVvdXQgcmV0ID0gKEh0dHBDbGllbnRUaW1lb3V0KSBrYWMuZ2V0KHVybCk7Ci0JCWlmIChyZXQgPT0gbnVsbCkgewotCSAgICAJcmV0ID0gbmV3IEh0dHBDbGllbnRUaW1lb3V0ICh1cmwsIHRpbWVvdXQpOyAgLy8gQ1RPUiBjYWxsZWQgb3BlblNlcnZlcigpCi0JCX0gZWxzZSB7Ci0JICAgIAlyZXQudXJsID0gdXJsOwotCQl9Ci0JCS8vIGRvbid0IGtub3cgaWYgd2UncmUga2VlcGluZyBhbGl2ZSB1bnRpbCB3ZSBwYXJzZSB0aGUgaGVhZGVycwotCQkvLyBmb3Igbm93LCBrZWVwaW5nQWxpdmUgaXMgZmFsc2UKLQkJcmV0dXJuIHJldDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBvcGVuU2VydmVyKFN0cmluZyBzLCBpbnQgaSkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBzZXJ2ZXJTb2NrZXQgPSBkb0Nvbm5lY3QocywgaSk7Ci0gICAgICAgIHNlcnZlck91dHB1dCA9IG5ldyBQcmludFN0cmVhbShuZXcgQnVmZmVyZWRPdXRwdXRTdHJlYW0oc2VydmVyU29ja2V0LmdldE91dHB1dFN0cmVhbSgpKSk7Ci0gICAgICAgIHNlcnZlclNvY2tldC5zZXRUY3BOb0RlbGF5KHRydWUpOwotICAgICAgICBzZXJ2ZXJTb2NrZXQuc2V0U29UaW1lb3V0KHRpbWVvdXQpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3V0aWwvaHR0cC9IdHRwUmVzcG9uc2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy91dGlsL2h0dHAvSHR0cFJlc3BvbnNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiMTNmMmEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3V0aWwvaHR0cC9IdHRwUmVzcG9uc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51dGlsLmh0dHA7Ci0KLWltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZSAwOS8yMS8yMDAxCi0gKi8KLXB1YmxpYyBjbGFzcyBIdHRwUmVzcG9uc2UgewotCXN0YXRpYyBmaW5hbCBTdHJpbmcgU0VTU0lPTl9DT09LSUVfTkFNRSA9ICJTTVNFU1NJT04iOyAvLyROT04tTkxTLTEkCi0KLQlzdGF0aWMgY2xhc3MgQ29va2llIGltcGxlbWVudHMgQ2xvbmVhYmxlIHsKLQkJcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLQkJcHJpdmF0ZSBTdHJpbmcgdmFsdWU7Ci0JCXByaXZhdGUgU3RyaW5nIGRvbWFpbjsKLQkJcHJpdmF0ZSBTdHJpbmcgcGF0aDsKLQotCQlDb29raWUoU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSkgewotCQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJCXRoaXMudmFsdWUgPSB2YWx1ZTsKLQkJfQotCi0JCVN0cmluZyBnZXROYW1lKCkgewotCQkJcmV0dXJuIG5hbWU7Ci0JCX0KLQotCQlTdHJpbmcgZ2V0VmFsdWUoKSB7Ci0JCQlyZXR1cm4gdmFsdWU7Ci0JCX0KLQotCQl2b2lkIHNldFZhbHVlKFN0cmluZyB2YWx1ZSkgewotCQkJdGhpcy52YWx1ZSA9IHZhbHVlOwotCQl9Ci0KLQkJU3RyaW5nIGdldERvbWFpbigpIHsKLQkJCXJldHVybiBkb21haW47Ci0JCX0KLQotCQl2b2lkIHNldERvbWFpbihTdHJpbmcgZG9tYWluKSB7Ci0JCQl0aGlzLmRvbWFpbiA9IGRvbWFpbjsKLQkJfQotCi0JCVN0cmluZyBnZXRQYXRoKCkgewotCQkJcmV0dXJuIHBhdGg7Ci0JCX0KLQotCQl2b2lkIHNldFBhdGgoU3RyaW5nIHBhdGgpIHsKLQkJCXRoaXMucGF0aCA9IHBhdGg7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGNsb25lKCkgewotCSAgICAJdHJ5IHsKLQkgICAgICAgIAlyZXR1cm4gc3VwZXIuY2xvbmUoKTsKLQkgICAgCX0KLQkgICAgCWNhdGNoKENsb25lTm90U3VwcG9ydGVkRXhjZXB0aW9uIGUpIHsKLQkgICAgICAgIAlyZXR1cm4gbnVsbDsKLQkgICAgCX0KLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gZ2V0Q2xhc3MoKS5nZXROYW1lKCkrIihuYW1lPSIrbmFtZSsiLCB2YWx1ZT0iK3ZhbHVlKyIsIGRvbWFpbj0iK2RvbWFpbisiLCBwYXRoPSIrcGF0aCsiKSI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQgLy8kTk9OLU5MUy01JAotCQl9Ci0JfQotCQlwcml2YXRlIGludCBzdGF0dXM7Ci0JCXByaXZhdGUgUHJvcGVydGllcyBoZWFkZXJzOwotCQlwcml2YXRlIFZlY3RvciBjb29raWVzOwotCi0JCXByaXZhdGUgU3RyaW5nIGRhdGE7Ci0KLQkJSHR0cFJlc3BvbnNlKGludCBzdGF0dXMsIFByb3BlcnRpZXMgaGVhZGVycywgVmVjdG9yIGNvb2tpZXMsIFN0cmluZyBkYXRhKSB7Ci0JCQl0aGlzLnN0YXR1cyA9IHN0YXR1czsKLQkJCXRoaXMuaGVhZGVycyA9IGhlYWRlcnM7Ci0JCQl0aGlzLmNvb2tpZXMgPSBjb29raWVzOwotCQkJdGhpcy5kYXRhID0gZGF0YTsKLQkJfQotCi0JCWludCBnZXRTdGF0dXMoKSB7Ci0JCQlyZXR1cm4gc3RhdHVzOwotCQl9Ci0KLQkJUHJvcGVydGllcyBnZXRIZWFkZXJzKCkgewotCQkJcmV0dXJuIGhlYWRlcnM7Ci0JCX0KLQotCQlWZWN0b3IgZ2V0Q29va2llcygpIHsKLQkJCXJldHVybiBjb29raWVzOwotCQl9Ci0KLQkJU3RyaW5nIGdldERhdGEoKSB7Ci0JCQlyZXR1cm4gZGF0YTsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiKHN0YXR1cz0iK3N0YXR1cysiLCBoZWFkZXJzPSIraGVhZGVycysiLCBjb29raWVzPSIrY29va2llcysiLCBkYXRhPSIrZGF0YSsiKSI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQgLy8kTk9OLU5MUy01JAotCQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvdXRpbC9odHRwL0h0dHBUaW1lb3V0RmFjdG9yeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3V0aWwvaHR0cC9IdHRwVGltZW91dEZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDEyNDA5Yy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvdXRpbC9odHRwL0h0dHBUaW1lb3V0RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudXRpbC5odHRwOwotaW1wb3J0IGphdmEubmV0LlVSTFN0cmVhbUhhbmRsZXI7Ci1pbXBvcnQgamF2YS5uZXQuVVJMU3RyZWFtSGFuZGxlckZhY3Rvcnk7Ci0KLWNsYXNzIEh0dHBUaW1lb3V0RmFjdG9yeSBpbXBsZW1lbnRzIFVSTFN0cmVhbUhhbmRsZXJGYWN0b3J5Ci17Ci0JcHJpdmF0ZSBpbnQgdGltZW91dDsKLQlIdHRwVGltZW91dEZhY3RvcnkoaW50IHRpbWVvdXQpIHsgdGhpcy50aW1lb3V0ID0gdGltZW91dDsgfQotCXB1YmxpYyBVUkxTdHJlYW1IYW5kbGVyIGNyZWF0ZVVSTFN0cmVhbUhhbmRsZXIoU3RyaW5nIHN0cikKLQl7Ci0JCUh0dHBUaW1lb3V0SGFuZGxlciBoYW5kbGVyID0gbmV3IEh0dHBUaW1lb3V0SGFuZGxlcigpOwotCQloYW5kbGVyLnNldFRpbWVvdXQodGltZW91dCk7Ci0JCXJldHVybiBoYW5kbGVyOwotCX0KLX0KLQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3V0aWwvaHR0cC9IdHRwVGltZW91dEhhbmRsZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy91dGlsL2h0dHAvSHR0cFRpbWVvdXRIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0NTNhMWMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3V0aWwvaHR0cC9IdHRwVGltZW91dEhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnV0aWwuaHR0cDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi1jbGFzcyBIdHRwVGltZW91dEhhbmRsZXIgZXh0ZW5kcyBzdW4ubmV0Lnd3dy5wcm90b2NvbC5odHRwLkhhbmRsZXIgaW1wbGVtZW50cyBUaW1lb3V0SGFuZGxlcgotewotCXByaXZhdGUgaW50IHRpbWVvdXQgPSAwOwotCi0JSHR0cFRpbWVvdXRIYW5kbGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCUh0dHBUaW1lb3V0SGFuZGxlcihpbnQgdGltZW91dCkgewotCQl0aGlzKCk7Ci0JCXRoaXMudGltZW91dCA9IHRpbWVvdXQ7Ci0JfQotCi0gICAgcHJvdGVjdGVkIGphdmEubmV0LlVSTENvbm5lY3Rpb24gb3BlbkNvbm5lY3Rpb24oVVJMIHUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXJldHVybiBuZXcgSHR0cFVSTENvbm5lY3Rpb25UaW1lb3V0KHUsIHRoaXMsIHRpbWVvdXQpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFRpbWVvdXQoaW50IHRpbWVvdXQpIHsKLSAgICAJdGhpcy50aW1lb3V0ID0gdGltZW91dDsKLSAgICB9Ci0KLSAgICBTdHJpbmcgZ2V0UHJveHkoKSB7IHJldHVybiBwcm94eTsgfQkJLy8gYnJlYWtpbmcgZW5jYXBzdWxhdGlvbgotICAgIGludCBnZXRQcm94eVBvcnQoKSB7IHJldHVybiBwcm94eVBvcnQ7IH0gICAgLy8gYnJlYWtpbmcgZW5jYXBzdWxhdGlvbgotfQotCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvdXRpbC9odHRwL0h0dHBVUkxDb25uZWN0aW9uVGltZW91dC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3V0aWwvaHR0cC9IdHRwVVJMQ29ubmVjdGlvblRpbWVvdXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGM4NjYxNS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvdXRpbC9odHRwL0h0dHBVUkxDb25uZWN0aW9uVGltZW91dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudXRpbC5odHRwOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLlByaW50U3RyZWFtOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotaW1wb3J0IHN1bi5uZXQud3d3Lmh0dHAuSHR0cENsaWVudDsKLQotY2xhc3MgSHR0cFVSTENvbm5lY3Rpb25UaW1lb3V0IGV4dGVuZHMgc3VuLm5ldC53d3cucHJvdG9jb2wuaHR0cC5IdHRwVVJMQ29ubmVjdGlvbgotewotCXByaXZhdGUgaW50IHRpbWVvdXQ7Ci0JcHJpdmF0ZSBIdHRwVGltZW91dEhhbmRsZXIgdGltZW91dEhhbmRsZXI7Ci0KLSAgCUh0dHBVUkxDb25uZWN0aW9uVGltZW91dChVUkwgdSwgSHR0cFRpbWVvdXRIYW5kbGVyIGhhbmRsZXIsIGludCB0aW1lb3V0KSB0aHJvd3MgSU9FeGNlcHRpb24KLQl7Ci0gICAgCXN1cGVyKHUsIGhhbmRsZXIpOwotCQl0aGlzLnRpbWVvdXQgPSB0aW1lb3V0OwotCQl0aW1lb3V0SGFuZGxlciA9IGhhbmRsZXI7Ci0JfQotCi0JSHR0cFVSTENvbm5lY3Rpb25UaW1lb3V0KFVSTCB1LCAgU3RyaW5nIGhvc3QsIGludCBwb3J0LCBpbnQgdGltZW91dCkgdGhyb3dzIElPRXhjZXB0aW9uCi0JewotICAgIAlzdXBlcih1LCBob3N0LCBwb3J0KTsKLSAgICAJdGhpcy50aW1lb3V0ID0gdGltZW91dDsKLQl9Ci0KLSAgICBwdWJsaWMgdm9pZCBjb25uZWN0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaWYgKGNvbm5lY3RlZCkgewotCSAgICAJcmV0dXJuOwotCQl9Ci0JCXRyeSB7Ci0JICAgIAlpZiAoImh0dHAiLmVxdWFscyh1cmwuZ2V0UHJvdG9jb2woKSkgLyogJiYgIWZhaWxlZE9uY2UgPC0gUFJJVkFURSAqLyApIHsgLy8kTk9OLU5MUy0xJAotCQkJCS8vIGZvciBzYWZldHkncyBzYWtlLCBhcyByZXBvcnRlZCBieSBLTEdyb3VwCi0JCQkJc3luY2hyb25pemVkICh1cmwpIHsKLQkJCQkJaHR0cCA9IEh0dHBDbGllbnRUaW1lb3V0LkdldE5ldyh1cmwsIHRpbWVvdXQpOwotCQkJCX0KLQkgICAgCX0KLQkgICAgCWVsc2UgewotCQkJCS8vIG1ha2Ugc3VyZSB0byBjb25zdHJ1Y3QgbmV3IGNvbm5lY3Rpb24gaWYgZmlyc3QKLQkJCQkvLyBhdHRlbXB0IGZhaWxlZAotCQkJCWh0dHAgPSBuZXcgSHR0cENsaWVudFRpbWVvdXQodXJsLCB0aW1lb3V0SGFuZGxlci5nZXRQcm94eSgpLCB0aW1lb3V0SGFuZGxlci5nZXRQcm94eVBvcnQoKSwgdGltZW91dCk7Ci0JICAgIAl9Ci0JICAgIAlwcyA9IChQcmludFN0cmVhbSlodHRwLmdldE91dHB1dFN0cmVhbSgpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JICAgIAl0aHJvdyBlOwotCQl9Ci0JCS8vIHRoaXMgd2FzIG1pc3NpbmcgZnJvbSB0aGUgb3JpZ2luYWwgdmVyc2lvbgotCQljb25uZWN0ZWQgPSB0cnVlOwotCX0KLQotICAgIHByb3RlY3RlZCBIdHRwQ2xpZW50IGdldFByb3hpZWRDbGllbnQoVVJMIHVybCwgU3RyaW5nIHMsIGludCBpKQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHJldHVybiAoSHR0cENsaWVudCluZXcgSHR0cENsaWVudFRpbWVvdXQodXJsLCBzLCBpLCB0aW1lb3V0KTsKLSAgICB9Ci0KLQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgbmV3IEh0dHBDbGllbnQgb2JqZWN0LCBieXBhc3NpbmcgdGhlIGNhY2hlIG9mCi0gICAgICogSFRUUCBjbGllbnQgb2JqZWN0cy9jb25uZWN0aW9ucy4KLSAgICAgKgotICAgICAqIEBwYXJhbSB1cmwJdGhlIFVSTCBiZWluZyBhY2Nlc3NlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBIdHRwQ2xpZW50IGdldE5ld0NsaWVudChVUkwgdXJsKQotICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXJldHVybiAoSHR0cENsaWVudCkobmV3IEh0dHBDbGllbnRUaW1lb3V0ICh1cmwsIChTdHJpbmcpbnVsbCwgLTEsIHRpbWVvdXQpKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvdXRpbC9odHRwL0h0dHBVdGlsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvdXRpbC9odHRwL0h0dHBVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwYzQ1NTcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3V0aWwvaHR0cC9IdHRwVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODE2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnV0aWwuaHR0cDsKLQotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkRhdGFJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkRhdGFPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5uZXQuQXV0aGVudGljYXRvcjsKLWltcG9ydCBqYXZhLm5ldC5IdHRwVVJMQ29ubmVjdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5JbmV0U29ja2V0QWRkcmVzczsKLWltcG9ydCBqYXZhLm5ldC5QYXNzd29yZEF1dGhlbnRpY2F0aW9uOwotaW1wb3J0IGphdmEubmV0LlByb3h5OwotaW1wb3J0IGphdmEubmV0LlNvY2tldDsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS5uZXQuVVJMRW5jb2RlcjsKLWltcG9ydCBqYXZhLm5ldC5VUkxTdHJlYW1IYW5kbGVyOwotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLm5ldC5wcm94eS5JUHJveHlEYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLlB1Ymxpc2hpbmdSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotaW1wb3J0IGNvbS5pYm0uaWN1LnV0aWwuU3RyaW5nVG9rZW5pemVyOwotCi0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUgMDkvMjEvMjAwMQotICovCi1wdWJsaWMgY2xhc3MgSHR0cFV0aWwgewotCXByaXZhdGUgZmluYWwgc3RhdGljIGJvb2xlYW4gREVCVUcgPSBmYWxzZTsKLQkvKioKLQkgKiBEbyBhIEdFVCB1c2luZyBsb3cgbGV2ZWwgc29ja2V0IHRvIGhhdmUgY29udHJvbCBvdmVyIHRpbWVvdXQKLQkgKgotCSAqIEByZXR1cm4gcmVzcG9uc2UKLQkgKiBAZXhjZXB0aW9uIDxsaT4gamF2YS5uZXQuQ29ubmVjdEV4Y2VwdGlvbiBjb3VsZCBub3QgY29ubmVjdCB0byBob3N0OnBvcnQKLQkgKiAgICAgICAgICAgIDxsaT4gamF2YS5pby5JbnRlcnJ1cHRlZElPRXhjZXB0aW9uIHRpbWVvdXQgZXhjZWVkZWQKLQkgKiAgICAgICAgICAgIDxsaT4gamF2YS5pby5JT0V4Y2VwdGlvbiBJL08gZXJyb3IKLQkgKiAgICAgICAgICAgIDxsaT4gQ2F0YUh0dHBFeGNlcHRpb24gaW52YWxpZCByZXNwb25zZSBmcm9tIHNlcnZlcgotCSAqLwotCXN0YXRpYyBIdHRwUmVzcG9uc2UgZG9HZXQoU29ja2V0IHNvY2ssIFN0cmluZyB1cmwsIFByb3BlcnRpZXMgaGVhZGVycykgdGhyb3dzIEV4Y2VwdGlvbgotCXsKLQkJaW50IHJlc3BTdGF0dXM7Ci0JCVByb3BlcnRpZXMgcmVzcEhlYWRlcnMgPSBuZXcgUHJvcGVydGllcygpOwotCQlWZWN0b3IgcmVzcENvb2tpZXMgPSBuZXcgVmVjdG9yKCk7Ci0JCVN0cmluZyByZXNwID0gbnVsbDsKLQkJRGF0YU91dHB1dFN0cmVhbSBvdXQgPSBudWxsOwotCQlEYXRhSW5wdXRTdHJlYW0gaW4gPSBudWxsOwotCQl0cnkgewotCQkJU3RyaW5nIGhvc3QgPSBzb2NrLmdldEluZXRBZGRyZXNzKCkuZ2V0SG9zdE5hbWUoKTsKLQkJCWludCBwb3J0ID0gc29jay5nZXRQb3J0KCk7Ci0JCQlvdXQgPSBuZXcgRGF0YU91dHB1dFN0cmVhbShzb2NrLmdldE91dHB1dFN0cmVhbSgpKTsKLQkJCWluID0gbmV3IERhdGFJbnB1dFN0cmVhbShuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShzb2NrLmdldElucHV0U3RyZWFtKCkpKTsKLQkJCW91dC53cml0ZUJ5dGVzKCJHRVQgIiArIHVybCArICIgSFRUUC8xLjFcclxuIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJb3V0LndyaXRlQnl0ZXMoIkhvc3Q6ICIgKyBob3N0ICsgIjoiICsgcG9ydCArICJcclxuIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQlvdXQud3JpdGVCeXRlcygiVXNlci1BZ2VudDogTW96aWxsYS80LjBcclxuIik7IC8vJE5PTi1OTFMtMSQKLQkJCW91dC53cml0ZUJ5dGVzKCJDb250ZW50LUxlbmd0aDogMFxyXG4iKTsgLy8kTk9OLU5MUy0xJAotCQkJLy8gc2VuZCBhZGRpb25hbCBoZWFkZXJzIGlmIGFueQotCQkJaWYoaGVhZGVycyAhPSBudWxsICYmIGhlYWRlcnMuc2l6ZSgpID4gMCkgewotCQkJCUVudW1lcmF0aW9uIG5hbWVzID0gaGVhZGVycy5rZXlzKCk7Ci0JCQkJd2hpbGUobmFtZXMuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJCQkJU3RyaW5nIG5hbWUgPSAoU3RyaW5nKW5hbWVzLm5leHRFbGVtZW50KCk7Ci0JCQkJCWlmKG5hbWUuZXF1YWxzSWdub3JlQ2FzZSgiSG9zdCIpIHx8IG5hbWUuZXF1YWxzSWdub3JlQ2FzZSgiVXNlci1BZ2VudCIpIHx8IG5hbWUuZXF1YWxzSWdub3JlQ2FzZSgiQ29udGVudC1MZW5ndGgiKSkgY29udGludWU7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCW91dC53cml0ZUJ5dGVzKG5hbWUgKyAiOiAiICsgaGVhZGVycy5nZXRQcm9wZXJ0eShuYW1lKSArICJcclxuIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCX0KLQkJCX0KLQkJCW91dC53cml0ZUJ5dGVzKCJcclxuIik7IC8vJE5PTi1OTFMtMSQKLQkJCW91dC5mbHVzaCgpOwotCQkJU3RyaW5nIGxpbmU7Ci0JCQlib29sZWFuIGVuZEZvdW5kID0gZmFsc2U7Ci0JCQlpbnQgY29udGVudExlbiA9IC0xOwotCQkJZmluYWwgU3RyaW5nIGNvbnRlbnRMZW5IZWFkZXIgPSAiY29udGVudC1sZW5ndGg6ICI7IC8vJE5PTi1OTFMtMSQKLQkJCWludCBjb250ZW50TGVuSGVhZGVyTGVuID0gY29udGVudExlbkhlYWRlci5sZW5ndGgoKTsKLQkJCVN0cmluZyBodHRwUmVzcCA9ICIiOyAvLyROT04tTkxTLTEkCi0KLQkJCS8vIHJlYWQgdGhlIGZpcnN0IGxpbmUKLQkJCWxpbmUgPSBpbi5yZWFkTGluZSgpOwotCQkJLy9sb2dnZXIuZGVidWcoImxpbmU9IitsaW5lKTsKLQkJCWlmKGxpbmUgPT0gbnVsbCkgewotCQkJCXRocm93IG5ldyBFeGNlcHRpb24oUHVibGlzaGluZ1Jlc291cmNlcy5zZXJ2ZXJFcnJvcl9tc2cpOyAKLQkJCX0KLQkJCWh0dHBSZXNwICs9IGxpbmUgKyAiXG4iOyAvLyROT04tTkxTLTEkCi0JCQlTdHJpbmdUb2tlbml6ZXIgdG9rZW5zID0gbmV3IFN0cmluZ1Rva2VuaXplcihsaW5lKTsKLQkJCXRyeSB7Ci0JCQkJLy8gc2tpcCB0aGUgZmlyc3QgdG9rZW4gd2hpY2ggaXMgIkhUVFAvMS4xIiBvciAiSFRUUC8xLjAiCi0JCQkJdG9rZW5zLm5leHRUb2tlbigpOwotCQkJCXJlc3BTdGF0dXMgPSBJbnRlZ2VyLnBhcnNlSW50KHRva2Vucy5uZXh0VG9rZW4oKSk7Ci0JCQl9Ci0JCQljYXRjaChFeGNlcHRpb24gZSkgewotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJdGhyb3cgbmV3IEV4Y2VwdGlvbihOTFMuYmluZChQdWJsaXNoaW5nUmVzb3VyY2VzLmludmFsaWRIdHRwUmVzcG9uc2VFcnJvcl9tc2csIChuZXcgT2JqZWN0W117aG9zdCwgSW50ZWdlci50b1N0cmluZyhwb3J0KSwgbGluZX0pKSk7IAotCQkJfQotCi0JCQkvLyByZWFkIHRoZSBoZWFkZXJzCi0JCQl3aGlsZSgobGluZSA9IGluLnJlYWRMaW5lKCkpICE9IG51bGwpIHsKLQkJCQkvL2xvZ2dlci5kZWJ1ZygibGluZT0iK2xpbmUpOwotCQkJCWh0dHBSZXNwICs9IGxpbmUgKyAiXG4iOyAvLyROT04tTkxTLTEkCi0JCQkJaWYobGluZS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJCWVuZEZvdW5kID0gdHJ1ZTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWludCBpZCA9IGxpbmUuaW5kZXhPZigiOiAiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWlmKGlkID4gMCkgewotCQkJCQlTdHJpbmcgaGVhZGVyID0gbGluZS5zdWJzdHJpbmcoMCwgaWQpLnRvTG93ZXJDYXNlKCk7Ci0JCQkJCVN0cmluZyB2YWx1ZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQkJCWlmKGxpbmUubGVuZ3RoKCkgPiBpZCArIDIpIHsKLQkJCQkJCXZhbHVlID0gbGluZS5zdWJzdHJpbmcoaWQgKyAyKTsKLQkJCQkJfQotCi0JCQkJCWlmKGhlYWRlci5lcXVhbHNJZ25vcmVDYXNlKCJzZXQtY29va2llIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQkJSHR0cFJlc3BvbnNlLkNvb2tpZSBjb29raWUgPSBwYXJzZUNvb2tpZSh2YWx1ZSk7Ci0JCQkJCQlpZihjb29raWUgIT0gbnVsbCkgewotCQkJCQkJCXJlc3BDb29raWVzLmFkZEVsZW1lbnQoY29va2llKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCXJlc3BIZWFkZXJzLnB1dChoZWFkZXIsIHZhbHVlKTsKLQkJCQkJfQotCi0JCQkJCS8vcmVzcEhlYWRlcnMucHV0KGhlYWRlciwgdmFsdWUpOwotCQkJCX0KLQkJCX0KLQkJCVN0cmluZyBjb250ZW50TGVuU3RyID0gcmVzcEhlYWRlcnMuZ2V0UHJvcGVydHkoImNvbnRlbnQtbGVuZ3RoIik7IC8vJE5PTi1OTFMtMSQKLQkJCWlmKGNvbnRlbnRMZW5TdHIgPT0gbnVsbCkgewotCQkJCWNvbnRlbnRMZW4gPSAtMTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWNvbnRlbnRMZW4gPSBJbnRlZ2VyLnBhcnNlSW50KGNvbnRlbnRMZW5TdHIpOwotCQkJfQotCQkJaWYoREVCVUcpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiKysrK0JFR0lOIEhFQURFUlMrKysrIik7IC8vJE5PTi1OTFMtMSQKLQkJCVN5c3RlbS5vdXQucHJpbnRsbihodHRwUmVzcCk7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIisrKytFTkQgSEVBREVSUysrKysiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJaWYoIWVuZEZvdW5kKSB7Ci0JCQkJdGhyb3cgbmV3IEV4Y2VwdGlvbihOTFMuYmluZChQdWJsaXNoaW5nUmVzb3VyY2VzLmludmFsaWRIdHRwUmVzcG9uc2VFcnJvcl9tc2csIChuZXcgT2JqZWN0W117aG9zdCwgSW50ZWdlci50b1N0cmluZyhwb3J0KSwgaHR0cFJlc3B9KSkpOyAKLQkJCX0KLQkJCS8vU3lzdGVtLm91dC5wcmludGxuKCJjb250ZW50TGVuPSIrY29udGVudExlbik7Ci0JCQlpZihjb250ZW50TGVuID4gMCkgewotCQkJCS8qCi0JCQkJYnl0ZVtdIGJ1ZmYgPSBuZXcgYnl0ZVtjb250ZW50TGVuXTsKLQkJCQlpbi5yZWFkRnVsbHkoYnVmZik7Ci0JCQkJcmVzcCA9IG5ldyBTdHJpbmcoYnVmZik7Ci0JCQkJKi8KLQkJCQlCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYm9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotCQkJCWJ5dGVbXSBidWZmID0gbmV3IGJ5dGVbTWF0aC5taW4oMjA0OCwgY29udGVudExlbildOwotCQkJCWludCBudW07Ci0JCQkJd2hpbGUoKG51bSA9IGluLnJlYWQoYnVmZikpICE9IC0xKSB7Ci0JCQkJCS8vU3lzdGVtLm91dC5wcmludGxuKCJudW09IitudW0pOwotCQkJCQlpbnQgbiA9IGNvbnRlbnRMZW4gLSBib3Muc2l6ZSgpOwotCQkJCQlpZihuIDw9IG51bSkgewotCQkJCQkJYm9zLndyaXRlKGJ1ZmYsIDAsIG4pOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQkJYm9zLndyaXRlKGJ1ZmYsIDAsIG51bSk7Ci0JCQkJfQotCQkJCXJlc3AgPSBib3MudG9TdHJpbmcoKTsKLQkJCX0KLQkJCWVsc2UgaWYoY29udGVudExlbiA8IDApIHsKLQkJCQlCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYm9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotCQkJCWJ5dGVbXSBidWZmID0gbmV3IGJ5dGVbMjA0OF07Ci0JCQkJaW50IG51bTsKLQkJCQl3aGlsZSgobnVtID0gaW4ucmVhZChidWZmKSkgIT0gLTEpIHsKLQkJCQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oIm51bT0iK251bSk7Ci0JCQkJCWJvcy53cml0ZShidWZmLCAwLCBudW0pOwotCQkJCX0KLQkJCQlyZXNwID0gYm9zLnRvU3RyaW5nKCk7Ci0JCQl9Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQl0cnkgeyBpbi5jbG9zZSgpOyB9IGNhdGNoKEV4Y2VwdGlvbiBlKSB7ICB9Ci0JCQl0cnkgeyBvdXQuY2xvc2UoKTsgfSBjYXRjaChFeGNlcHRpb24gZSkgeyAgfQotCQl9Ci0JCXJldHVybiBuZXcgSHR0cFJlc3BvbnNlKHJlc3BTdGF0dXMsIHJlc3BIZWFkZXJzLCByZXNwQ29va2llcywgcmVzcCk7Ci0JfQotCi0KLQkvKioKLQkgKiBEbyBhIEdFVCB1c2luZyBsb3cgbGV2ZWwgc29ja2V0IHRvIGhhdmUgY29udHJvbCBvdmVyIHRpbWVvdXQKLQkgKgotCSAqIEByZXR1cm4gcmVzcG9uc2UKLQkgKiBAZXhjZXB0aW9uIDxsaT4gamF2YS5uZXQuQ29ubmVjdEV4Y2VwdGlvbiBjb3VsZCBub3QgY29ubmVjdCB0byBob3N0OnBvcnQKLQkgKiAgICAgICAgICAgIDxsaT4gamF2YS5pby5JbnRlcnJ1cHRlZElPRXhjZXB0aW9uIHRpbWVvdXQgZXhjZWVkZWQKLQkgKiAgICAgICAgICAgIDxsaT4gamF2YS5pby5JT0V4Y2VwdGlvbiBJL08gZXJyb3IKLQkgKiAgICAgICAgICAgIDxsaT4gQ2F0YUh0dHBFeGNlcHRpb24gaW52YWxpZCByZXNwb25zZSBmcm9tIHNlcnZlcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSHR0cFJlc3BvbnNlIGRvR2V0KFN0cmluZyBob3N0LCBpbnQgcG9ydCwgU3RyaW5nIHVybCwgaW50IHRpbWVvdXQsIFByb3BlcnRpZXMgaGVhZGVycykgdGhyb3dzIEV4Y2VwdGlvbgotCXsKLQkJU29ja2V0IHNvY2sgPSBudWxsOwotCQl0cnkgewotCQkJc29jayA9IG5ldyBTb2NrZXQoaG9zdCwgcG9ydCk7Ci0JCQlzb2NrLnNldFNvVGltZW91dCh0aW1lb3V0KTsKLQkJCXJldHVybiBkb0dldChzb2NrLCB1cmwsIGhlYWRlcnMpOwotCQl9Ci0JCWZpbmFsbHkgewotCQkJdHJ5IHsgc29jay5jbG9zZSgpOyB9IGNhdGNoKEV4Y2VwdGlvbiBlKSB7fQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgTWFwIGhhbmRsZXJNYXAgPSBuZXcgSGFzaE1hcCgpOwotCXByaXZhdGUgc3RhdGljIFVSTFN0cmVhbUhhbmRsZXIgZ2V0SGFuZGxlcihpbnQgdGltZW91dCkgewotCQlJbnRlZ2VyIGtleSA9IG5ldyBJbnRlZ2VyKHRpbWVvdXQpOwotCQlVUkxTdHJlYW1IYW5kbGVyIGhhbmRsZXIgPSAoVVJMU3RyZWFtSGFuZGxlciloYW5kbGVyTWFwLmdldChrZXkpOwotCQlpZihoYW5kbGVyID09IG51bGwpIHsKLQkJCXN5bmNocm9uaXplZChoYW5kbGVyTWFwKSB7Ci0JCQkJaWYoKGhhbmRsZXIgPSAoVVJMU3RyZWFtSGFuZGxlciloYW5kbGVyTWFwLmdldChrZXkpKSA9PSBudWxsKSB7Ci0JCQkJCWhhbmRsZXIgPSBuZXcgSHR0cFRpbWVvdXRIYW5kbGVyKHRpbWVvdXQpOwotCQkJCQloYW5kbGVyTWFwLnB1dChrZXksIGhhbmRsZXIpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gaGFuZGxlcjsKLQl9Ci0KLQkvKioKLQkgKiBEbyBhIEdFVAotCSAqCi0JICogQHJldHVybiByZXNwb25zZQotCSAqIEBleGNlcHRpb24gPGxpPiBqYXZhLm5ldC5Db25uZWN0RXhjZXB0aW9uIGNvdWxkIG5vdCBjb25uZWN0IHRvIGhvc3Q6cG9ydAotCSAqICAgICAgICAgICAgPGxpPiBqYXZhLmlvLkludGVycnVwdGVkSU9FeGNlcHRpb24gdGltZW91dCBleGNlZWRlZAotCSAqICAgICAgICAgICAgPGxpPiBqYXZhLmlvLklPRXhjZXB0aW9uIEkvTyBlcnJvcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSHR0cFJlc3BvbnNlIGRvR2V0KFN0cmluZyB1cmwsIFByb3BlcnRpZXMgaGVhZGVycywgaW50IHRpbWVvdXQpCi0JCQl0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGRvR2V0KG5ldyBVUkwoKFVSTCkgbnVsbCwgdXJsLCBnZXRIYW5kbGVyKHRpbWVvdXQpKSwgaGVhZGVycyk7Ci0JfQotCQotCS8qKgotCSAqIERvIGEgR0VUCi0JICoKLQkgKiBAcmV0dXJuIHJlc3BvbnNlCi0JICogQGV4Y2VwdGlvbiA8bGk+IGphdmEubmV0LkNvbm5lY3RFeGNlcHRpb24gY291bGQgbm90IGNvbm5lY3QgdG8gaG9zdDpwb3J0Ci0JICogICAgICAgICAgICA8bGk+IGphdmEuaW8uSW50ZXJydXB0ZWRJT0V4Y2VwdGlvbiB0aW1lb3V0IGV4Y2VlZGVkCi0JICogICAgICAgICAgICA8bGk+IGphdmEuaW8uSU9FeGNlcHRpb24gSS9PIGVycm9yCi0JICovCi0JcHVibGljIHN0YXRpYyBIdHRwUmVzcG9uc2UgZG9HZXQoU3RyaW5nIHVybCwgUHJvcGVydGllcyBoZWFkZXJzLAotCQkJaW50IHRpbWVvdXQsIElQcm94eURhdGEgcHJveHkpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gZG9HZXQobmV3IFVSTCgoVVJMKSBudWxsLCB1cmwsIGdldEhhbmRsZXIodGltZW91dCkpLCBoZWFkZXJzLAotCQkJCXByb3h5KTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGNsYXNzIFByb3h5QXV0aGVudGljYXRvciBleHRlbmRzIEF1dGhlbnRpY2F0b3IgewotCQlwcml2YXRlIFN0cmluZyB1c2VybmFtZSwgcGFzc3dvcmQ7Ci0KLQkJcHVibGljIFByb3h5QXV0aGVudGljYXRvcihTdHJpbmcgdXNlcm5hbWUsIFN0cmluZyBwYXNzd29yZCkgewotCQkJdGhpcy51c2VybmFtZSA9IHVzZXJuYW1lOwotCQkJdGhpcy5wYXNzd29yZCA9IHBhc3N3b3JkOwotCQl9Ci0KLQkJcHJvdGVjdGVkIFBhc3N3b3JkQXV0aGVudGljYXRpb24gZ2V0UGFzc3dvcmRBdXRoZW50aWNhdGlvbigpIHsKLQkJCXJldHVybiBuZXcgUGFzc3dvcmRBdXRoZW50aWNhdGlvbih1c2VybmFtZSwgcGFzc3dvcmQudG9DaGFyQXJyYXkoKSk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogRG8gYSBHRVQKLQkgKiAKLQkgKiBAcmV0dXJuIHJlc3BvbnNlCi0JICogQGV4Y2VwdGlvbgotCSAqICAgICAgICAgPGxpPiBqYXZhLm5ldC5Db25uZWN0RXhjZXB0aW9uIGNvdWxkIG5vdCBjb25uZWN0IHRvIGhvc3Q6cG9ydAotCSAqICAgICAgICAgPGxpPiBqYXZhLmlvLkludGVycnVwdGVkSU9FeGNlcHRpb24gdGltZW91dCBleGNlZWRlZAotCSAqICAgICAgICAgPGxpPiBqYXZhLmlvLklPRXhjZXB0aW9uIEkvTyBlcnJvcgotCSAqLwotCXN0YXRpYyBIdHRwUmVzcG9uc2UgZG9HZXQoVVJMIHVybCwgUHJvcGVydGllcyBoZWFkZXJzKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGRvR2V0KHVybCwgaGVhZGVycywgbnVsbCk7Ci0JfQotCQotCS8qKgotCSAqIERvIGEgR0VUCi0JICoKLQkgKiBAcmV0dXJuIHJlc3BvbnNlCi0JICogQGV4Y2VwdGlvbiA8bGk+IGphdmEubmV0LkNvbm5lY3RFeGNlcHRpb24gY291bGQgbm90IGNvbm5lY3QgdG8gaG9zdDpwb3J0KG9yIGEgcHJveHkpCi0JICogICAgICAgICAgICA8bGk+IGphdmEuaW8uSW50ZXJydXB0ZWRJT0V4Y2VwdGlvbiB0aW1lb3V0IGV4Y2VlZGVkCi0JICogICAgICAgICAgICA8bGk+IGphdmEuaW8uSU9FeGNlcHRpb24gSS9PIGVycm9yCi0JICovCi0Jc3RhdGljIEh0dHBSZXNwb25zZSBkb0dldChVUkwgdXJsLCBQcm9wZXJ0aWVzIGhlYWRlcnMsIElQcm94eURhdGEgcHJveHkpCi0JCQl0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSHR0cFVSTENvbm5lY3Rpb24gY29ubiA9IG51bGw7Ci0JCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQkgKiBGb3IgVXNpbmcgUHJveHkKLQkJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0JCWlmIChwcm94eSAhPSBudWxsKSB7Ci0JCQlQcm94eS5UeXBlIHByb3h5VHlwZSA9IG51bGw7Ci0JCQlpZiAocHJveHkuZ2V0VHlwZSgpLmVxdWFscyhJUHJveHlEYXRhLkhUVFBfUFJPWFlfVFlQRSkpIHsKLQkJCQlwcm94eVR5cGUgPSBQcm94eS5UeXBlLkhUVFA7Ci0JCQl9IGVsc2UgaWYgKHByb3h5LmdldFR5cGUoKS5lcXVhbHMoSVByb3h5RGF0YS5IVFRQU19QUk9YWV9UWVBFKSkgewotCQkJCXByb3h5VHlwZSA9IFByb3h5LlR5cGUuSFRUUDsKLQkJCX0gZWxzZSBpZiAocHJveHkuZ2V0VHlwZSgpLmVxdWFscyhJUHJveHlEYXRhLlNPQ0tTX1BST1hZX1RZUEUpKSB7Ci0JCQkJcHJveHlUeXBlID0gUHJveHkuVHlwZS5TT0NLUzsKLQkJCX0KLQotCQkJUHJveHkgcHJveHlTZXJ2ZXIgPSBuZXcgUHJveHkocHJveHlUeXBlLCBuZXcgSW5ldFNvY2tldEFkZHJlc3MoCi0JCQkJCXByb3h5LmdldEhvc3QoKSwgcHJveHkuZ2V0UG9ydCgpKSk7Ci0JCQlpZiAocHJveHkuaXNSZXF1aXJlc0F1dGhlbnRpY2F0aW9uKCkpIHsKLQkJCQlBdXRoZW50aWNhdG9yLnNldERlZmF1bHQobmV3IFByb3h5QXV0aGVudGljYXRvcihwcm94eQotCQkJCQkJLmdldFVzZXJJZCgpLCBwcm94eS5nZXRQYXNzd29yZCgpKSk7Ci0JCQl9IGVsc2UgewotCQkJCUF1dGhlbnRpY2F0b3Iuc2V0RGVmYXVsdChudWxsKTsKLQkJCX0KLQkJCWNvbm4gPSAoSHR0cFVSTENvbm5lY3Rpb24pIHVybC5vcGVuQ29ubmVjdGlvbihwcm94eVNlcnZlcik7Ci0JCX0gZWxzZSB7Ci0JCQljb25uID0gKEh0dHBVUkxDb25uZWN0aW9uKSB1cmwub3BlbkNvbm5lY3Rpb24oKTsKLQkJfQotCQkKLQkJUHJvcGVydGllcyByZXNwSGVhZGVycyA9IG5ldyBQcm9wZXJ0aWVzKCk7Ci0JCVZlY3RvciByZXNwQ29va2llcyA9IG5ldyBWZWN0b3IoKTsKLQkJSHR0cFVSTENvbm5lY3Rpb24uc2V0Rm9sbG93UmVkaXJlY3RzKGZhbHNlKTsKLQkJLy9jb25uLnNldEluc3RhbmNlRm9sbG93UmVkaXJlY3RzKGZhbHNlKTsgLy9KREsxLjMKLQkJY29ubi5zZXRSZXF1ZXN0TWV0aG9kKCJHRVQiKTsgLy8kTk9OLU5MUy0xJAotCQljb25uLnNldFVzZUNhY2hlcyhmYWxzZSk7Ci0JCS8vIHNlbmQgYWRkaW9uYWwgaGVhZGVycyBpZiBhbnkKLQkJaWYoaGVhZGVycyAhPSBudWxsICYmIGhlYWRlcnMuc2l6ZSgpID4gMCkgewotCQkJRW51bWVyYXRpb24gbmFtZXMgPSBoZWFkZXJzLmtleXMoKTsKLQkJCXdoaWxlKG5hbWVzLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCQkJU3RyaW5nIG5hbWUgPSAoU3RyaW5nKW5hbWVzLm5leHRFbGVtZW50KCk7Ci0JCQkJaWYobmFtZS5lcXVhbHNJZ25vcmVDYXNlKCJIb3N0IikgfHwgbmFtZS5lcXVhbHNJZ25vcmVDYXNlKCJVc2VyLUFnZW50IikgfHwgbmFtZS5lcXVhbHNJZ25vcmVDYXNlKCJDb250ZW50LUxlbmd0aCIpKSBjb250aW51ZTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQljb25uLnNldFJlcXVlc3RQcm9wZXJ0eShuYW1lLCBoZWFkZXJzLmdldFByb3BlcnR5KG5hbWUpKTsKLQkJCX0KLQkJfQotCQlpbnQgcmVzcFN0YXR1cyA9IGNvbm4uZ2V0UmVzcG9uc2VDb2RlKCk7Ci0JCVN0cmluZyBuYW1lOwotCQlmb3IoaW50IGkgPSAxOyAobmFtZSA9IGNvbm4uZ2V0SGVhZGVyRmllbGRLZXkoaSkpICE9IG51bGw7IGkrKykgewotCQkJU3RyaW5nIHZhbHVlID0gY29ubi5nZXRIZWFkZXJGaWVsZChuYW1lKTsKLQkJCWlmKG5hbWUuZXF1YWxzSWdub3JlQ2FzZSgic2V0LWNvb2tpZSIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQlIdHRwUmVzcG9uc2UuQ29va2llIGNvb2tpZSA9IHBhcnNlQ29va2llKHZhbHVlKTsKLQkJCQlpZihjb29raWUgIT0gbnVsbCkgewotCQkJCQlyZXNwQ29va2llcy5hZGRFbGVtZW50KGNvb2tpZSk7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJcmVzcEhlYWRlcnMucHV0KG5hbWUudG9Mb3dlckNhc2UoKSwgdmFsdWUpOwotCQkJfQotCQl9Ci0JCWludCBjb250ZW50TGVuID0gY29ubi5nZXRDb250ZW50TGVuZ3RoKCk7Ci0JCUJ1ZmZlcmVkSW5wdXRTdHJlYW0gaW4gPSBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShjb25uLmdldElucHV0U3RyZWFtKCkpOwotCQlTdHJpbmcgcmVzcCA9IG51bGw7Ci0JCWlmKGNvbnRlbnRMZW4gPiAwKSB7Ci0JCQkvKgotCQkJYnl0ZVtdIGJ1ZmYgPSBuZXcgYnl0ZVtjb250ZW50TGVuXTsKLQkJCWluLnJlYWRGdWxseShidWZmKTsKLQkJCXJlc3AgPSBuZXcgU3RyaW5nKGJ1ZmYpOwotCQkJKi8KLQkJCUJ5dGVBcnJheU91dHB1dFN0cmVhbSBib3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0JCQlieXRlW10gYnVmZiA9IG5ldyBieXRlW01hdGgubWluKDIwNDgsIGNvbnRlbnRMZW4pXTsKLQkJCWludCBudW07Ci0JCQl3aGlsZSgobnVtID0gaW4ucmVhZChidWZmKSkgIT0gLTEpIHsKLQkJCQkvL1N5c3RlbS5vdXQucHJpbnRsbigibnVtPSIrbnVtKTsKLQkJCQlpbnQgbiA9IGNvbnRlbnRMZW4gLSBib3Muc2l6ZSgpOwotCQkJCWlmKG4gPD0gbnVtKSB7Ci0JCQkJCWJvcy53cml0ZShidWZmLCAwLCBuKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWJvcy53cml0ZShidWZmLCAwLCBudW0pOwotCQkJfQotCQkJcmVzcCA9IGJvcy50b1N0cmluZygpOwotCQl9Ci0JCWVsc2UgaWYoY29udGVudExlbiA8IDApIHsKLQkJCUJ5dGVBcnJheU91dHB1dFN0cmVhbSBib3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0JCQlieXRlW10gYnVmZiA9IG5ldyBieXRlWzIwNDhdOwotCQkJaW50IG51bTsKLQkJCXdoaWxlKChudW0gPSBpbi5yZWFkKGJ1ZmYpKSAhPSAtMSkgewotCQkJCS8vU3lzdGVtLm91dC5wcmludGxuKCJudW09IitudW0pOwotCQkJCWJvcy53cml0ZShidWZmLCAwLCBudW0pOwotCQkJfQotCQkJcmVzcCA9IGJvcy50b1N0cmluZygpOwotCQl9Ci0vLwkJU3lzdGVtLm91dC5wcmludGxuKCJDb250ZW50ICA6IiArcmVzcCk7Ci0JCXJldHVybiBuZXcgSHR0cFJlc3BvbnNlKHJlc3BTdGF0dXMsIHJlc3BIZWFkZXJzLCByZXNwQ29va2llcywgcmVzcCk7Ci0JfQotCi0JLyoqCi0JICogRG8gYSBQT1NUCi0JICoKLQkgKiBAcmV0dXJuIHJlc3BvbnNlCi0JICogQGV4Y2VwdGlvbiA8bGk+IGphdmEubmV0LkNvbm5lY3RFeGNlcHRpb24gY291bGQgbm90IGNvbm5lY3QgdG8gaG9zdDpwb3J0Ci0JICogICAgICAgICAgICA8bGk+IGphdmEuaW8uSW50ZXJydXB0ZWRJT0V4Y2VwdGlvbiB0aW1lb3V0IGV4Y2VlZGVkCi0JICogICAgICAgICAgICA8bGk+IGphdmEuaW8uSU9FeGNlcHRpb24gSS9PIGVycm9yCi0JICovCi0Jc3RhdGljIEh0dHBSZXNwb25zZSBkb1Bvc3QoU3RyaW5nIHVybCwgUHJvcGVydGllcyBoZWFkZXJzLCBQcm9wZXJ0aWVzIGRhdGEsIGludCB0aW1lb3V0KSB0aHJvd3MgRXhjZXB0aW9uCi0JewotCQlyZXR1cm4gZG9Qb3N0KG5ldyBVUkwoKFVSTCludWxsLCB1cmwsIGdldEhhbmRsZXIodGltZW91dCkpLCBoZWFkZXJzLCBkYXRhKTsKLQl9Ci0KLQkvKioKLQkgKiBEbyBhIFBPU1QKLQkgKgotCSAqIEByZXR1cm4gcmVzcG9uc2UKLQkgKiBAZXhjZXB0aW9uIDxsaT4gamF2YS5uZXQuQ29ubmVjdEV4Y2VwdGlvbiBjb3VsZCBub3QgY29ubmVjdCB0byBob3N0OnBvcnQKLQkgKiAgICAgICAgICAgIDxsaT4gamF2YS5pby5JbnRlcnJ1cHRlZElPRXhjZXB0aW9uIHRpbWVvdXQgZXhjZWVkZWQKLQkgKiAgICAgICAgICAgIDxsaT4gamF2YS5pby5JT0V4Y2VwdGlvbiBJL08gZXJyb3IKLQkgKi8KLQlzdGF0aWMgSHR0cFJlc3BvbnNlIGRvUG9zdChVUkwgdXJsLCBQcm9wZXJ0aWVzIGhlYWRlcnMsIFByb3BlcnRpZXMgZGF0YSkgdGhyb3dzIEV4Y2VwdGlvbgotCXsKLQkJUHJvcGVydGllcyByZXNwSGVhZGVycyA9IG5ldyBQcm9wZXJ0aWVzKCk7Ci0JCVZlY3RvciByZXNwQ29va2llcyA9IG5ldyBWZWN0b3IoKTsKLQkJSHR0cFVSTENvbm5lY3Rpb24uc2V0Rm9sbG93UmVkaXJlY3RzKGZhbHNlKTsKLQkJSHR0cFVSTENvbm5lY3Rpb24gY29ubiA9IChIdHRwVVJMQ29ubmVjdGlvbil1cmwub3BlbkNvbm5lY3Rpb24oKTsKLQkJLy9jb25uLnNldEluc3RhbmNlRm9sbG93UmVkaXJlY3RzKGZhbHNlKTsgLy9KREsxLjMKLQkJY29ubi5zZXRSZXF1ZXN0TWV0aG9kKCJQT1NUIik7IC8vJE5PTi1OTFMtMSQKLQkJY29ubi5zZXRVc2VDYWNoZXMoZmFsc2UpOwotCQljb25uLnNldERvT3V0cHV0KHRydWUpOwotCQljb25uLnNldERvSW5wdXQodHJ1ZSk7Ci0JCS8vIHNlbmQgYWRkaW9uYWwgaGVhZGVycyBpZiBhbnkKLQkJaWYoaGVhZGVycyAhPSBudWxsICYmIGhlYWRlcnMuc2l6ZSgpID4gMCkgewotCQkJRW51bWVyYXRpb24gbmFtZXMgPSBoZWFkZXJzLmtleXMoKTsKLQkJCXdoaWxlKG5hbWVzLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCQkJU3RyaW5nIG5hbWUgPSAoU3RyaW5nKW5hbWVzLm5leHRFbGVtZW50KCk7Ci0JCQkJaWYobmFtZS5lcXVhbHNJZ25vcmVDYXNlKCJIb3N0IikgfHwgbmFtZS5lcXVhbHNJZ25vcmVDYXNlKCJVc2VyLUFnZW50IikgfHwgbmFtZS5lcXVhbHNJZ25vcmVDYXNlKCJDb250ZW50LUxlbmd0aCIpKSBjb250aW51ZTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQljb25uLnNldFJlcXVlc3RQcm9wZXJ0eShuYW1lLCBoZWFkZXJzLmdldFByb3BlcnR5KG5hbWUpKTsKLQkJCX0KLQkJfQotCQlEYXRhT3V0cHV0U3RyZWFtIG91dCA9IG5ldyBEYXRhT3V0cHV0U3RyZWFtKGNvbm4uZ2V0T3V0cHV0U3RyZWFtKCkpOwotCi0JCVN0cmluZyBjb250ZW50ID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJRW51bWVyYXRpb24gZW51ID0gZGF0YS5wcm9wZXJ0eU5hbWVzKCk7Ci0JCXdoaWxlKGVudS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQkJU3RyaW5nIG5hbWUgPSAoU3RyaW5nKWVudS5uZXh0RWxlbWVudCgpOwotCQkJY29udGVudCArPSAobmFtZSArICI9IiArIFVSTEVuY29kZXIuZW5jb2RlKGRhdGEuZ2V0UHJvcGVydHkobmFtZSkpKTsgLy8kTk9OLU5MUy0xJAotCQkJaWYoZW51Lmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCQkJY29udGVudCArPSAiJiI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCQlpZihjb250ZW50Lmxlbmd0aCgpID4gMCkgewotCQkJb3V0LndyaXRlQnl0ZXMoY29udGVudCk7Ci0JCX0KLQotCQlpbnQgcmVzcFN0YXR1cyA9IGNvbm4uZ2V0UmVzcG9uc2VDb2RlKCk7Ci0JCVN0cmluZyBuYW1lOwotCQlmb3IoaW50IGkgPSAxOyAobmFtZSA9IGNvbm4uZ2V0SGVhZGVyRmllbGRLZXkoaSkpICE9IG51bGw7IGkrKykgewotCQkJU3RyaW5nIHZhbHVlID0gY29ubi5nZXRIZWFkZXJGaWVsZChuYW1lKTsKLQkJCWlmKG5hbWUuZXF1YWxzSWdub3JlQ2FzZSgic2V0LWNvb2tpZSIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQlIdHRwUmVzcG9uc2UuQ29va2llIGNvb2tpZSA9IHBhcnNlQ29va2llKHZhbHVlKTsKLQkJCQlpZihjb29raWUgIT0gbnVsbCkgewotCQkJCQlyZXNwQ29va2llcy5hZGRFbGVtZW50KGNvb2tpZSk7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJcmVzcEhlYWRlcnMucHV0KG5hbWUudG9Mb3dlckNhc2UoKSwgdmFsdWUpOwotCQkJfQotCQl9Ci0JCWludCBjb250ZW50TGVuID0gY29ubi5nZXRDb250ZW50TGVuZ3RoKCk7Ci0JCUJ1ZmZlcmVkSW5wdXRTdHJlYW0gaW4gPSBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShjb25uLmdldElucHV0U3RyZWFtKCkpOwotCQlTdHJpbmcgcmVzcCA9IG51bGw7Ci0JCWlmKGNvbnRlbnRMZW4gPiAwKSB7Ci0JCQkvKgotCQkJYnl0ZVtdIGJ1ZmYgPSBuZXcgYnl0ZVtjb250ZW50TGVuXTsKLQkJCWluLnJlYWRGdWxseShidWZmKTsKLQkJCXJlc3AgPSBuZXcgU3RyaW5nKGJ1ZmYpOwotCQkJKi8KLQkJCUJ5dGVBcnJheU91dHB1dFN0cmVhbSBib3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0JCQlieXRlW10gYnVmZiA9IG5ldyBieXRlW01hdGgubWluKDIwNDgsIGNvbnRlbnRMZW4pXTsKLQkJCWludCBudW07Ci0JCQl3aGlsZSgobnVtID0gaW4ucmVhZChidWZmKSkgIT0gLTEpIHsKLQkJCQkvL1N5c3RlbS5vdXQucHJpbnRsbigibnVtPSIrbnVtKTsKLQkJCQlpbnQgbiA9IGNvbnRlbnRMZW4gLSBib3Muc2l6ZSgpOwotCQkJCWlmKG4gPD0gbnVtKSB7Ci0JCQkJCWJvcy53cml0ZShidWZmLCAwLCBuKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWJvcy53cml0ZShidWZmLCAwLCBudW0pOwotCQkJfQotCQkJcmVzcCA9IGJvcy50b1N0cmluZygpOwotCQl9Ci0JCWVsc2UgaWYoY29udGVudExlbiA8IDApIHsKLQkJCUJ5dGVBcnJheU91dHB1dFN0cmVhbSBib3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0JCQlieXRlW10gYnVmZiA9IG5ldyBieXRlWzIwNDhdOwotCQkJaW50IG51bTsKLQkJCXdoaWxlKChudW0gPSBpbi5yZWFkKGJ1ZmYpKSAhPSAtMSkgewotCQkJCS8vU3lzdGVtLm91dC5wcmludGxuKCJudW09IitudW0pOwotCQkJCWJvcy53cml0ZShidWZmLCAwLCBudW0pOwotCQkJfQotCQkJcmVzcCA9IGJvcy50b1N0cmluZygpOwotCQl9Ci0JCXJldHVybiBuZXcgSHR0cFJlc3BvbnNlKHJlc3BTdGF0dXMsIHJlc3BIZWFkZXJzLCByZXNwQ29va2llcywgcmVzcCk7Ci0JfQotCi0JLyoqCi0JICogRG8gYSBQT1NUIHVzaW5nIGxvdyBsZXZlbCBzb2NrZXQgdG8gaGF2ZSBjb250cm9sIG92ZXIgdGltZW91dAotCSAqCi0JICogQHJldHVybiByZXNwb25zZQotCSAqIEBleGNlcHRpb24gPGxpPiBqYXZhLm5ldC5Db25uZWN0RXhjZXB0aW9uIGNvdWxkIG5vdCBjb25uZWN0IHRvIGhvc3Q6cG9ydAotCSAqICAgICAgICAgICAgPGxpPiBqYXZhLmlvLkludGVycnVwdGVkSU9FeGNlcHRpb24gdGltZW91dCBleGNlZWRlZAotCSAqICAgICAgICAgICAgPGxpPiBqYXZhLmlvLklPRXhjZXB0aW9uIEkvTyBlcnJvcgotCSAqICAgICAgICAgICAgPGxpPiBDYXRhSHR0cEV4Y2VwdGlvbiBpbnZhbGlkIHJlc3BvbnNlIGZyb20gc2VydmVyCi0JICovCi0Jc3RhdGljIEh0dHBSZXNwb25zZSBkb1Bvc3QoU29ja2V0IHNvY2ssIFN0cmluZyB1cmwsIFByb3BlcnRpZXMgaGVhZGVycywgUHJvcGVydGllcyBkYXRhKSB0aHJvd3MgRXhjZXB0aW9uCi0JewotCQlpbnQgcmVzcFN0YXR1czsKLQkJUHJvcGVydGllcyByZXNwSGVhZGVycyA9IG5ldyBQcm9wZXJ0aWVzKCk7Ci0JCVZlY3RvciByZXNwQ29va2llcyA9IG5ldyBWZWN0b3IoKTsKLQkJU3RyaW5nIHJlc3AgPSBudWxsOwotCQlEYXRhT3V0cHV0U3RyZWFtIG91dCA9IG51bGw7Ci0JCURhdGFJbnB1dFN0cmVhbSBpbiA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlTdHJpbmcgaG9zdCA9IHNvY2suZ2V0SW5ldEFkZHJlc3MoKS5nZXRIb3N0TmFtZSgpOwotCQkJaW50IHBvcnQgPSBzb2NrLmdldFBvcnQoKTsKLQkJCW91dCA9IG5ldyBEYXRhT3V0cHV0U3RyZWFtKHNvY2suZ2V0T3V0cHV0U3RyZWFtKCkpOwotCQkJaW4gPSBuZXcgRGF0YUlucHV0U3RyZWFtKG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKHNvY2suZ2V0SW5wdXRTdHJlYW0oKSkpOwotCQkJU3RyaW5nIGNvbnRlbnQgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJRW51bWVyYXRpb24gZW51ID0gZGF0YS5wcm9wZXJ0eU5hbWVzKCk7Ci0JCQl3aGlsZShlbnUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJCQlTdHJpbmcgbmFtZSA9IChTdHJpbmcpZW51Lm5leHRFbGVtZW50KCk7Ci0JCQkJY29udGVudCArPSAobmFtZSArICI9IiArIFVSTEVuY29kZXIuZW5jb2RlKGRhdGEuZ2V0UHJvcGVydHkobmFtZSkpKTsgLy8kTk9OLU5MUy0xJAotCQkJCWlmKGVudS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQkJCQljb250ZW50ICs9ICImIjsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCX0KLQkJCS8vbG9nZ2VyLmRlYnVnKCJwb3N0ZGF0YT0iK2NvbnRlbnQpOwotCQkJb3V0LndyaXRlQnl0ZXMoIlBPU1QgIiArIHVybCArICIgSFRUUC8xLjFcclxuIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJb3V0LndyaXRlQnl0ZXMoIkhvc3Q6ICIgKyBob3N0ICsgIjoiICsgcG9ydCArICJcclxuIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQlvdXQud3JpdGVCeXRlcygiVXNlci1BZ2VudDogTW96aWxsYS80LjBcclxuIik7IC8vJE5PTi1OTFMtMSQKLQkJCS8vb3V0LndyaXRlQnl0ZXMoIkFjY2VwdDogdGV4dC9odG1sIik7Ci0JCQlvdXQud3JpdGVCeXRlcygiQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWRcclxuIik7IC8vJE5PTi1OTFMtMSQKLQkJCW91dC53cml0ZUJ5dGVzKCJDb250ZW50LUxlbmd0aDogIiArIGNvbnRlbnQubGVuZ3RoKCkgKyAiXHJcbiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCS8vIHNlbmQgYWRkaW9uYWwgaGVhZGVycyBpZiBhbnkKLQkJCWlmKGhlYWRlcnMgIT0gbnVsbCAmJiBoZWFkZXJzLnNpemUoKSA+IDApIHsKLQkJCQlFbnVtZXJhdGlvbiBuYW1lcyA9IGhlYWRlcnMua2V5cygpOwotCQkJCXdoaWxlKG5hbWVzLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCQkJCVN0cmluZyBuYW1lID0gKFN0cmluZyluYW1lcy5uZXh0RWxlbWVudCgpOwotCQkJCQlpZihuYW1lLmVxdWFsc0lnbm9yZUNhc2UoIkhvc3QiKSB8fCBuYW1lLmVxdWFsc0lnbm9yZUNhc2UoIlVzZXItQWdlbnQiKSB8fCBuYW1lLmVxdWFsc0lnbm9yZUNhc2UoIkNvbnRlbnQtTGVuZ3RoIikgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCXx8IG5hbWUuZXF1YWxzSWdub3JlQ2FzZSgiQ29udGVudC1UeXBlIikpIGNvbnRpbnVlOyAvLyROT04tTkxTLTEkCi0JCQkJCW91dC53cml0ZUJ5dGVzKG5hbWUgKyAiOiAiICsgaGVhZGVycy5nZXRQcm9wZXJ0eShuYW1lKSArICJcclxuIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCX0KLQkJCX0KLQkJCW91dC53cml0ZUJ5dGVzKCJcclxuIik7IC8vJE5PTi1OTFMtMSQKLQkJCWlmKGNvbnRlbnQubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJb3V0LndyaXRlQnl0ZXMoY29udGVudCk7Ci0JCQl9Ci0JCQlvdXQuZmx1c2goKTsKLQkJCVN0cmluZyBsaW5lOwotCQkJYm9vbGVhbiBlbmRGb3VuZCA9IGZhbHNlOwotCQkJaW50IGNvbnRlbnRMZW4gPSAtMTsKLQkJCWZpbmFsIFN0cmluZyBjb250ZW50TGVuSGVhZGVyID0gImNvbnRlbnQtbGVuZ3RoOiAiOyAvLyROT04tTkxTLTEkCi0JCQlpbnQgY29udGVudExlbkhlYWRlckxlbiA9IGNvbnRlbnRMZW5IZWFkZXIubGVuZ3RoKCk7Ci0JCQlTdHJpbmcgaHR0cFJlc3AgPSAiIjsgLy8kTk9OLU5MUy0xJAotCi0JCQkvLyByZWFkIHRoZSBmaXJzdCBsaW5lCi0JCQlsaW5lID0gaW4ucmVhZExpbmUoKTsKLQkJCS8vbG9nZ2VyLmRlYnVnKCJsaW5lPSIrbGluZSk7Ci0JCQlpZihsaW5lID09IG51bGwpIHsKLQkJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKFB1Ymxpc2hpbmdSZXNvdXJjZXMuc2VydmVyRXJyb3JfbXNnKTsgCi0JCQl9Ci0JCQlodHRwUmVzcCArPSBsaW5lICsgIlxuIjsgLy8kTk9OLU5MUy0xJAotCQkJU3RyaW5nVG9rZW5pemVyIHRva2VucyA9IG5ldyBTdHJpbmdUb2tlbml6ZXIobGluZSk7Ci0JCQl0cnkgewotCQkJCS8vIHNraXAgdGhlIGZpcnN0IHRva2VuIHdoaWNoIGlzICJIVFRQLzEuMSIgb3IgIkhUVFAvMS4wIgotCQkJCXRva2Vucy5uZXh0VG9rZW4oKTsKLQkJCQlyZXNwU3RhdHVzID0gSW50ZWdlci5wYXJzZUludCh0b2tlbnMubmV4dFRva2VuKCkpOwotCQkJfQotCQkJY2F0Y2goRXhjZXB0aW9uIGUpIHsKLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCXRocm93IG5ldyBFeGNlcHRpb24oTkxTLmJpbmQoUHVibGlzaGluZ1Jlc291cmNlcy5pbnZhbGlkSHR0cFJlc3BvbnNlRXJyb3JfbXNnLCAobmV3IE9iamVjdFtde2hvc3QsIEludGVnZXIudG9TdHJpbmcocG9ydCksIGxpbmV9KSkpOyAKLQkJCX0KLQotCQkJLy8gcmVhZCB0aGUgaGVhZGVycwotCQkJd2hpbGUoKGxpbmUgPSBpbi5yZWFkTGluZSgpKSAhPSBudWxsKSB7Ci0JCQkJLy9sb2dnZXIuZGVidWcoImxpbmU9IitsaW5lKTsKLQkJCQlodHRwUmVzcCArPSBsaW5lICsgIlxuIjsgLy8kTk9OLU5MUy0xJAotCQkJCWlmKGxpbmUubGVuZ3RoKCkgPT0gMCkgewotCQkJCQllbmRGb3VuZCA9IHRydWU7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQlpbnQgaWQgPSBsaW5lLmluZGV4T2YoIjogIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlpZihpZCA+IDApIHsKLQkJCQkJU3RyaW5nIGhlYWRlciA9IGxpbmUuc3Vic3RyaW5nKDAsIGlkKS50b0xvd2VyQ2FzZSgpOwotCQkJCQlTdHJpbmcgdmFsdWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJCQlpZihsaW5lLmxlbmd0aCgpID4gaWQgKyAyKSB7Ci0JCQkJCQl2YWx1ZSA9IGxpbmUuc3Vic3RyaW5nKGlkICsgMik7Ci0JCQkJCX0KLQotCQkJCQlpZihoZWFkZXIuZXF1YWxzKCJzZXQtY29va2llIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQkJSHR0cFJlc3BvbnNlLkNvb2tpZSBjb29raWUgPSBwYXJzZUNvb2tpZSh2YWx1ZSk7Ci0JCQkJCQlpZihjb29raWUgIT0gbnVsbCkgewotCQkJCQkJCXJlc3BDb29raWVzLmFkZEVsZW1lbnQoY29va2llKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCXJlc3BIZWFkZXJzLnB1dChoZWFkZXIsIHZhbHVlKTsKLQkJCQkJfQotCi0JCQkJCS8vcmVzcEhlYWRlcnMucHV0KGhlYWRlciwgdmFsdWUpOwotCQkJCX0KLQkJCX0KLQkJCVN0cmluZyBjb250ZW50TGVuU3RyID0gcmVzcEhlYWRlcnMuZ2V0UHJvcGVydHkoImNvbnRlbnQtbGVuZ3RoIik7IC8vJE5PTi1OTFMtMSQKLQkJCWlmKGNvbnRlbnRMZW5TdHIgPT0gbnVsbCkgewotCQkJCWNvbnRlbnRMZW4gPSAwOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJY29udGVudExlbiA9IEludGVnZXIucGFyc2VJbnQoY29udGVudExlblN0cik7Ci0JCQl9Ci0JCQlpZihERUJVRykgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCIrKysrQkVHSU4gSEVBREVSUysrKysiKTsgLy8kTk9OLU5MUy0xJAotCQkJU3lzdGVtLm91dC5wcmludGxuKGh0dHBSZXNwKTsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiKysrK0VORCBIRUFERVJTKysrKyIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlpZighZW5kRm91bmQgfHwgY29udGVudExlbiA9PSAtMSkgewotCQkJCXRocm93IG5ldyBFeGNlcHRpb24oTkxTLmJpbmQoUHVibGlzaGluZ1Jlc291cmNlcy5pbnZhbGlkSHR0cFJlc3BvbnNlRXJyb3JfbXNnLCAobmV3IE9iamVjdFtde2hvc3QsIEludGVnZXIudG9TdHJpbmcocG9ydCksIGh0dHBSZXNwfSkpKTsgCi0JCQl9Ci0JCQlpZihjb250ZW50TGVuID4gMCkgewotCQkJCWJ5dGVbXSBidWZmID0gbmV3IGJ5dGVbY29udGVudExlbl07Ci0JCQkJaW4ucmVhZEZ1bGx5KGJ1ZmYpOwotCQkJCXJlc3AgPSBuZXcgU3RyaW5nKGJ1ZmYpOwotCQkJfQotCQkJZWxzZSBpZihjb250ZW50TGVuU3RyID09IG51bGwpIHsKLQkJCQlCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYm9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotCQkJCWJ5dGVbXSBidWZmID0gbmV3IGJ5dGVbMjA0OF07Ci0JCQkJaW50IG51bTsKLQkJCQl3aGlsZSgobnVtID0gaW4ucmVhZChidWZmKSkgIT0gLTEpIHsKLQkJCQkJYm9zLndyaXRlKGJ1ZmYsIDAsIG51bSk7Ci0JCQkJfQotCQkJCXJlc3AgPSBib3MudG9TdHJpbmcoKTsKLQkJCX0KLQkJfQotCQlmaW5hbGx5IHsKLQkJCXRyeSB7IGluLmNsb3NlKCk7IH0gY2F0Y2goRXhjZXB0aW9uIGUpIHt9Ci0JCQl0cnkgeyBvdXQuY2xvc2UoKTsgfSBjYXRjaChFeGNlcHRpb24gZSkge30KLQkJfQotCQlyZXR1cm4gbmV3IEh0dHBSZXNwb25zZShyZXNwU3RhdHVzLCByZXNwSGVhZGVycywgcmVzcENvb2tpZXMsIHJlc3ApOwotCX0KLQotCS8qKgotCSAqIERvIGEgUE9TVCB1c2luZyBsb3cgbGV2ZWwgc29ja2V0IHRvIGhhdmUgY29udHJvbCBvdmVyIHRpbWVvdXQKLQkgKgotCSAqIEByZXR1cm4gcmVzcG9uc2UKLQkgKiBAZXhjZXB0aW9uIDxsaT4gamF2YS5uZXQuQ29ubmVjdEV4Y2VwdGlvbiBjb3VsZCBub3QgY29ubmVjdCB0byBob3N0OnBvcnQKLQkgKiAgICAgICAgICAgIDxsaT4gamF2YS5pby5JbnRlcnJ1cHRlZElPRXhjZXB0aW9uIHRpbWVvdXQgZXhjZWVkZWQKLQkgKiAgICAgICAgICAgIDxsaT4gamF2YS5pby5JT0V4Y2VwdGlvbiBJL08gZXJyb3IKLQkgKiAgICAgICAgICAgIDxsaT4gQ2F0YUh0dHBFeGNlcHRpb24gaW52YWxpZCByZXNwb25zZSBmcm9tIHNlcnZlcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSHR0cFJlc3BvbnNlIGRvUG9zdChTdHJpbmcgaG9zdCwgaW50IHBvcnQsIFN0cmluZyB1cmwsIGludCB0aW1lb3V0LAotCQlQcm9wZXJ0aWVzIGhlYWRlcnMsIFByb3BlcnRpZXMgZGF0YSkgdGhyb3dzIEV4Y2VwdGlvbgotCXsKLQkJU29ja2V0IHNvY2sgPSBudWxsOwotCQl0cnkgewotCQkJc29jayA9IG5ldyBTb2NrZXQoaG9zdCwgcG9ydCk7Ci0JCQlzb2NrLnNldFNvVGltZW91dCh0aW1lb3V0KTsKLQkJCXJldHVybiBkb1Bvc3Qoc29jaywgdXJsLCBoZWFkZXJzLCBkYXRhKTsKLQkJfQotCQlmaW5hbGx5IHsKLQkJCXRyeSB7IHNvY2suY2xvc2UoKTsgfSBjYXRjaChFeGNlcHRpb24gZSkge30KLQkJfQotCX0KLQotCS8qKgotCSAqIFBhcnNlcyBhIHF1ZXJ5IHN0cmluZyBhbmQgVVJMLWRlY29kZXMgdGhlIHBhcmFtZXRlciB2YWx1ZXMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1hcCBwYXJzZVF1ZXJ5U3RyaW5nKFN0cmluZyBzdHIpIHRocm93cyBFeGNlcHRpb24gewotCQlTdHJpbmdUb2tlbml6ZXIgdG9rZW5zID0gbmV3IFN0cmluZ1Rva2VuaXplcihzdHIsICImIik7IC8vJE5PTi1OTFMtMSQKLQkJTWFwIG1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCWludCBtYXhJZCA9IHN0ci5sZW5ndGgoKSAtIDE7Ci0JCXdoaWxlKHRva2Vucy5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJCVN0cmluZyB0b2tlbiA9IHRva2Vucy5uZXh0VG9rZW4oKTsKLQkJCWludCBpZCA9IHRva2VuLmluZGV4T2YoJz0nKTsKLQkJCWlmKGlkID09IC0xKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQllbHNlIGlmKGlkID09IDAgfHwgaWQgPT0gbWF4SWQpIHsKLQkJCQltYXAucHV0KHRva2VuLCBudWxsKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCW1hcC5wdXQodG9rZW4uc3Vic3RyaW5nKDAsIGlkKSwgdXJsRGVjb2RlKHRva2VuLnN1YnN0cmluZyhpZCArIDEpKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG1hcDsKLQl9Ci0KLQkvKioKLQkgKiBQYXJzZXMgdGhlIGNvb2tpZSBmcm9tIHRoZSB2YWx1ZSBvZiByZXNwb25zZSBoZWFkZXIgU2V0LUNvb2tpZQotCSAqLwotICAgIHB1YmxpYyBzdGF0aWMgSHR0cFJlc3BvbnNlLkNvb2tpZSBwYXJzZUNvb2tpZShTdHJpbmcgc3RyKSB7Ci0gICAgCS8vbG9nZ2VyLmRlYnVnKHN0cik7Ci0gICAgCWludCBpZCA9IHN0ci5pbmRleE9mKCc9Jyk7Ci0gICAgCWlmKGlkIDw9IDApIHJldHVybiBudWxsOwotICAgIAlTdHJpbmcgbmFtZSA9IHN0ci5zdWJzdHJpbmcoMCwgaWQpOwotICAgIAlpbnQgZnJvbUlkID1uYW1lLmxlbmd0aCgpICsgMTsKLSAgICAJaW50IHRvSWQgPSBzdHIuaW5kZXhPZigiOyIpOyAvLyROT04tTkxTLTEkCi0gICAgCVN0cmluZyB2YWx1ZTsKLSAgICAJU3RyaW5nIHRoZVJlc3QgPSBudWxsOwotICAgIAlpZih0b0lkID09IC0xKSB7Ci0gICAgCQl2YWx1ZSA9IHN0ci5zdWJzdHJpbmcoZnJvbUlkKTsKLSAgICAJfQotICAgIAllbHNlIHsKLSAgICAJCXZhbHVlID0gc3RyLnN1YnN0cmluZyhmcm9tSWQsIHRvSWQpOwotICAgIAkJaWYodG9JZCA8IHN0ci5sZW5ndGgoKSAtIDEpIHsKLSAgICAJCQl0aGVSZXN0ID0gc3RyLnN1YnN0cmluZyh0b0lkICsgMSk7Ci0gICAgCQl9Ci0gICAgCX0KLSAgICAJSHR0cFJlc3BvbnNlLkNvb2tpZSBjb29raWUgPSBuZXcgSHR0cFJlc3BvbnNlLkNvb2tpZShuYW1lLCB2YWx1ZSk7Ci0gICAgCWlmKHRoZVJlc3QgIT0gbnVsbCkgewotICAgIAkJU3RyaW5nVG9rZW5pemVyIHRva2VucyA9IG5ldyBTdHJpbmdUb2tlbml6ZXIodGhlUmVzdCwgIjsiKTsgLy8kTk9OLU5MUy0xJAotICAgIAkJd2hpbGUodG9rZW5zLmhhc01vcmVUb2tlbnMoKSkgewotICAgIAkJCVN0cmluZyB0b2tlbiA9IHRva2Vucy5uZXh0VG9rZW4oKS50cmltKCk7Ci0gICAgCQkJaWQgPSB0b2tlbi5pbmRleE9mKCc9Jyk7Ci0gICAgCQkJaWYoaWQgPD0gMCkgY29udGludWU7Ci0gICAgCQkJbmFtZSA9IHRva2VuLnN1YnN0cmluZygwLCBpZCk7Ci0gICAgCQkJaWYoaWQgPT0gdG9rZW4ubGVuZ3RoKCkgLSAxKSB7Ci0gICAgCQkJCXZhbHVlID0gIiI7IC8vJE5PTi1OTFMtMSQKLSAgICAJCQl9Ci0gICAgCQkJZWxzZSB7Ci0gICAgCQkJCXZhbHVlID0gdG9rZW4uc3Vic3RyaW5nKGlkICsgMSk7Ci0gICAgCQkJfQotICAgIAkJCWlmKG5hbWUuZXF1YWxzSWdub3JlQ2FzZSgiZG9tYWluIikpIHsgLy8kTk9OLU5MUy0xJAotICAgIAkJCQljb29raWUuc2V0RG9tYWluKHZhbHVlKTsKLSAgICAJCQl9Ci0gICAgCQkJZWxzZSBpZihuYW1lLmVxdWFsc0lnbm9yZUNhc2UoInBhdGgiKSkgeyAvLyROT04tTkxTLTEkCi0gICAgCQkJCWNvb2tpZS5zZXRQYXRoKHZhbHVlKTsKLQkJCQl9Ci0JCQl9Ci0gICAgICAgIH0KLQotICAgIAlyZXR1cm4gY29va2llOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFBhcnNlcyB0aGUgY29va2llcyBmcm9tIHRoZSB2YWx1ZSBvZiByZXF1ZXN0IGhlYWRlciBDb29raWUKLSAgICAgKiBAcmV0dXJuIGFuIGVudW1lcmF0aW9uIG9mIEh0dHBSZXNwb25zZS5Db29raWUgb2JqZWN0cwotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgRW51bWVyYXRpb24gcGFyc2VDb29raWVzKFN0cmluZyBzdHIpIHsKLSAgICAJU3RyaW5nVG9rZW5pemVyIHRva2VucyA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoc3RyLCAiOyIpOyAvLyROT04tTkxTLTEkCi0gICAgCVZlY3RvciBjb29raWVzID0gbmV3IFZlY3RvcigpOwotICAgIAl3aGlsZSh0b2tlbnMuaGFzTW9yZVRva2VucygpKSB7Ci0gICAgCQlTdHJpbmcgdG9rZW4gPSB0b2tlbnMubmV4dFRva2VuKCkudHJpbSgpOwotICAgIAkJaW50IGlkID0gdG9rZW4uaW5kZXhPZignPScpOwotICAgIAkJaWYoaWQgPT0gLTEpIGNvbnRpbnVlOwotICAgIAkJU3RyaW5nIG5hbWUgPSB0b2tlbi5zdWJzdHJpbmcoMCwgaWQpOwotICAgIAkJU3RyaW5nIHZhbHVlID0gIiI7IC8vJE5PTi1OTFMtMSQKLSAgICAJCWlmKGlkIDwgdG9rZW4ubGVuZ3RoKCkgLSAxKSB7Ci0gICAgCQkJdmFsdWUgPSB0b2tlbi5zdWJzdHJpbmcoaWQgKyAxKTsKLSAgICAJCX0KLSAgICAJCWlmKERFQlVHKSBTeXN0ZW0ub3V0LnByaW50bG4obmFtZSsiPSIrdmFsdWUpOyAvLyROT04tTkxTLTEkCi0gICAgCQljb29raWVzLmFkZEVsZW1lbnQobmV3IEh0dHBSZXNwb25zZS5Db29raWUobmFtZSwgdmFsdWUpKTsKLSAgICAJfQotICAgIAlyZXR1cm4gY29va2llcy5lbGVtZW50cygpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHRvQ29va2llU3RyaW5nKEVudW1lcmF0aW9uIGNvb2tpZXMpIHsKLQkJU3RyaW5nQnVmZmVyIHN0ckJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJd2hpbGUoY29va2llcy5oYXNNb3JlRWxlbWVudHMoKSkgewotCQkJSHR0cFJlc3BvbnNlLkNvb2tpZSBjb29raWUgPSAoSHR0cFJlc3BvbnNlLkNvb2tpZSljb29raWVzLm5leHRFbGVtZW50KCk7Ci0JCQlzdHJCdWYuYXBwZW5kKGNvb2tpZS5nZXROYW1lKCkpLmFwcGVuZCgnPScpLmFwcGVuZChjb29raWUuZ2V0VmFsdWUoKSkuYXBwZW5kKCI7ICIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIHN0ckJ1Zi50b1N0cmluZygpOwotICAgIH0KLQotCS8qKgotCSogVGhpcyB1dGlsaXR5IG1ldGhvZCBpcyBmb3IgY29udmVydGluZyBmcm9tCi0JKiBhIE1JTUUgZm9ybWF0IGNhbGxlZCAiPGNvZGU+eC13d3ctZm9ybS11cmxlbmNvZGVkPC9jb2RlPiIKLQkqIHRvIGEgPGNvZGU+U3RyaW5nPC9jb2RlPgotCSogPHA+Ci0JKiBUbyBjb252ZXJ0IHRvIGEgPGNvZGU+U3RyaW5nPC9jb2RlPiwgZWFjaCBjaGFyYWN0ZXIgaXMgZXhhbWluZWQgaW4gdHVybjoKLQkqIDx1bD4KLQkqIDxsaT5UaGUgQVNDSUkgY2hhcmFjdGVycyAnPGNvZGU+YTwvY29kZT4nIHRocm91Z2ggJzxjb2RlPno8L2NvZGU+JywKLQkqICc8Y29kZT5BPC9jb2RlPicgdGhyb3VnaCAnPGNvZGU+WjwvY29kZT4nLCBhbmQgJzxjb2RlPjA8L2NvZGU+JwotCSogdGhyb3VnaCAnPGNvZGU+OTwvY29kZT4nIHJlbWFpbiB0aGUgc2FtZS4KLQkqIDxsaT5UaGUgcGx1cyBzaWduICc8Y29kZT4rPC9jb2RlPidpcyBjb252ZXJ0ZWQgaW50byBhCi0JKiBzcGFjZSBjaGFyYWN0ZXIgJzxjb2RlPiZuYnNwOzwvY29kZT4nLgotCSogPGxpPlRoZSByZW1haW5pbmcgY2hhcmFjdGVycyBhcmUgcmVwcmVzZW50ZWQgYnkgMy1jaGFyYWN0ZXIKLQkqIHN0cmluZ3Mgd2hpY2ggYmVnaW4gd2l0aCB0aGUgcGVyY2VudCBzaWduLAotCSogIjxjb2RlPiU8aT54eTwvaT48L2NvZGU+Iiwgd2hlcmUgPGk+eHk8L2k+IGlzIHRoZSB0d28tZGlnaXQKLQkqIGhleGFkZWNpbWFsIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBsb3dlciA4LWJpdHMgb2YgdGhlIGNoYXJhY3Rlci4KLQkqIDwvdWw+Ci0JKgotCSovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgdXJsRGVjb2RlKFN0cmluZyBzKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICBmb3IoaW50IGk9MDsgaTxzLmxlbmd0aCgpOyBpKyspIHsKLSAgICAgICAgICAgIGNoYXIgYyA9IHMuY2hhckF0KGkpOwotICAgICAgICAgICAgc3dpdGNoIChjKSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAnKyc6Ci0gICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgnICcpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlICclJzoKLSAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgoY2hhcilJbnRlZ2VyLnBhcnNlSW50KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMuc3Vic3RyaW5nKGkrMSxpKzMpLDE2KSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaSArPSAyOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoYyk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vIFVuZG8gY29udmVyc2lvbiB0byBleHRlcm5hbCBlbmNvZGluZwotICAgICAgICBTdHJpbmcgcmVzdWx0ID0gc2IudG9TdHJpbmcoKTsKLSAgICAgICAgYnl0ZVtdIGlucHV0Qnl0ZXMgPSByZXN1bHQuZ2V0Qnl0ZXMoIjg4NTlfMSIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIHJldHVybiBuZXcgU3RyaW5nKGlucHV0Qnl0ZXMpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBFeGNlcHRpb24gewotICAgIAkvL1N5c3RlbS5vdXQucHJpbnRsbihkb0dldChhcmdzWzBdLCBudWxsLCAwKSk7Ci0gICAgCVN0cmluZyB1cmwgPSBhcmdzWzBdOwotICAgIAlTdHJpbmcgdWlkID0gYXJnc1sxXTsKLSAgICAJU3RyaW5nIGVtYWlsID0gYXJnc1syXTsKLSAgICAJUHJvcGVydGllcyBkYXRhID0gbmV3IFByb3BlcnRpZXMoKTsKLSAgICAJZGF0YS5wdXQoInVpZCIsIHVpZCk7IC8vJE5PTi1OTFMtMSQKLSAgICAJZGF0YS5wdXQoImVtYWlsIiwgZW1haWwpOyAvLyROT04tTkxTLTEkCi0gICAgCVN5c3RlbS5vdXQucHJpbnRsbihkb1Bvc3QodXJsLCBudWxsLCBkYXRhLCAwKSk7Ci0JfQotfQotCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvdXRpbC9odHRwL1RpbWVvdXRIYW5kbGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvdXRpbC9odHRwL1RpbWVvdXRIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmY2RlYjUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3V0aWwvaHR0cC9UaW1lb3V0SGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudXRpbC5odHRwOwotCi1pbnRlcmZhY2UgVGltZW91dEhhbmRsZXIgewotICAgIHZvaWQgc2V0VGltZW91dChpbnQgdGltZW91dCk7Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvdXRpbC9odHRwL3BhY2thZ2UuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy91dGlsL2h0dHAvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NGRjZjgwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy91dGlsL2h0dHAvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgaW1wbGVtZW50YXRpb24gc3VwcG9ydCBmb3IgY2hlY2tpbmcgZXh0ZXJuYWwgbGlua3MgaW4gYSBwdWJsaXNoZWQgY29uZmlndXJhdGlvbi4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvdXRpbC9wYWNrYWdlLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvdXRpbC9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0YTVlMjMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3V0aWwvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgaW1wbGVtZW50YXRpb24gc3VwcG9ydCBmb3IgdGhlIHB1Ymxpc2hpbmcgc2VydmljZS4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy94c2wvUHVibGlzaGVkQm9va21hcmtzLnhzbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3hzbC9QdWJsaXNoZWRCb29rbWFya3MueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YzQzMTcxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3hzbC9QdWJsaXNoZWRCb29rbWFya3MueHNsCisrKyAvZGV2L251bGwKQEAgLTEsMTY2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLQotPHhzbDpzdHlsZXNoZWV0IHZlcnNpb249IjEuMCIgeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iIHhtbG5zOmZvPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9Gb3JtYXQiPgotPHhzbDpvdXRwdXQgbWV0aG9kPSJodG1sIiB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgCi0JaW5kZW50PSJ5ZXMiLz4KLTwhLS0gdGhpcyBtZXNzIHVwIHRoZSBsYXlvdXQuIGRpc2FibGUgaXQgYmVmb3JlIHRoZSBsYXlvdXQgY3NzcyBpcyBmaXhlZC4KLTx4c2w6b3V0cHV0IG1ldGhvZD0iaHRtbCIgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIAotCWRvY3R5cGUtcHVibGljPSItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgCi0JZG9jdHlwZS1zeXN0ZW09Imh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiIAotCWluZGVudD0ieWVzIi8+Ci0tLT4KLQotCTx4c2w6cGFyYW0gbmFtZT0id2hlcmVBbUlUZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJ0cmVlU2V0c1RleHQiLz4KLQk8eHNsOnRlbXBsYXRlIG1hdGNoPSJCb29rbWFya3MiPgotCQotPHhzbDp0ZXh0IGRpc2FibGUtb3V0cHV0LWVzY2FwaW5nPSJ5ZXMiPgotCTwhW0NEQVRBWwotPCEtLQotCTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0JImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotLS0+Ci1dXT4KLTwveHNsOnRleHQ+Ci0KLQotCQk8aHRtbD4KLQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9ImxhbmciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbGFuZyIvPjwveHNsOmF0dHJpYnV0ZT4KLQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9InhtbDpsYW5nIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGxhbmciLz48L3hzbDphdHRyaWJ1dGU+Ci0JCQk8aGVhZD4KLQkJCQk8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgotYm9keSB7Ci0gICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmZmZmY7Ci0gICAgICAgIGZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotICAgICAgICBmb250LXNpemU6IDEwcHQ7Ci0gICAgICAgIG1hcmdpbi1sZWZ0OiAwcHg7Ci0gICAgICAgIG1hcmdpbi1yaWdodDogMHB4OwotICAgICAgICBtYXJnaW4tdG9wOiAwcHg7Ci0gICAgICAgIG1hcmdpbi1ib3R0b206IDBweDsKLSAgICAgICAgdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi10ZC5tZW51IHsKLSAgICAgICAgYmFja2dyb3VuZDojMDA2Njk5OwotfQotCi1zcGFuLm1lbnUgewotICAgICAgICBjdXJzb3IgOiBoYW5kOwotICAgICAgICBmb250LXNpemU6IDhwdDsKLSAgICAgICAgY29sb3I6ICNmZmZmZmY7Ci0gICAgICAgIHdoaXRlLXNwYWNlOm5vd3JhcDsKLSAgICAgICAgcGFkZGluZy1yaWdodDogMC41ZW07Ci0gICAgICAgIGJvcmRlci1yaWdodDogMnB4IHNvbGlkICNmZmZmZmY7Ci19Ci0KLXNwYW4ubWVudSBpbWcgewotICAgICAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOwotfQotCi10ZC50YWIgewotICAgICAgICBiYWNrZ3JvdW5kOiNmZmZmZmY7Ci0gICAgICAgIHBhZGRpbmctdG9wOiAxcHg7Ci0gICAgICAgIHBhZGRpbmctYm90dG9tOiAxcHg7Ci19Ci0KLXNwYW4udGFiLCBzcGFuLnNlbGVjdGVkVGFiIHsKLQljdXJzb3I6IHBvaW50ZXI7Ci0gICAgICAgIGZvbnQtc2l6ZTogMTBwdDsKLSAgICAgICAgd2hpdGUtc3BhY2U6bm93cmFwOwotICAgICAgICBsaW5lLWhlaWdodDogMS40ZW07Ci19Ci0KLXNwYW4udGFiIHsKLSAgICAgICAgYmFja2dyb3VuZDojYzBjMGMwOwotICAgICAgICBib3JkZXItdG9wOiAgIDFweCBzb2xpZCAjNjY2NjY2OwotICAgICAgICBib3JkZXItcmlnaHQ6IDFweCBzb2xpZCAjNjY2NjY2OwotICAgICAgICBib3JkZXItbGVmdDogIDFweCBzb2xpZCAjNjY2NjY2OwotfQotCi1zcGFuLnNlbGVjdGVkVGFiIHsKLSAgICAgICAgYmFja2dyb3VuZDojZTBlMGUwOwotICAgICAgICBib3JkZXItdG9wOiAgIDFweCBzb2xpZCAjYTBhMGEwOwotICAgICAgICBib3JkZXItcmlnaHQ6IDFweCBzb2xpZCAjYTBhMGEwOwotICAgICAgICBib3JkZXItbGVmdDogIDFweCBzb2xpZCAjYTBhMGEwOwotfQotCi10ZC50cmVlIHsKLSAgICAgICAgYm9yZGVyLXRvcDogMXB4IHNvbGlkICM5OTk5OTk7Ci19Ci08L3N0eWxlPgotCQkJCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9ImJvb2ttYXJrdmlld3MuanMiPgotPC9zY3JpcHQ+Ci0JCQkJPHNjcmlwdD4KLWZ1bmN0aW9uIGNoZWNrS2V5KGUsIGZ1bmMpIHsKLSAgICAgICAgaWYgKHdpbmRvdy5ldmVudCkgewotICAgICAgICAgICAgICAgIGtleSA9IHdpbmRvdy5ldmVudC5rZXlDb2RlOwotICAgICAgICAgICAgICAgIHRhcmdldCA9IHdpbmRvdy5ldmVudC5zcmNFbGVtZW50OwotICAgICAgICB9IGVsc2UgaWYgKGUpIHsKLSAgICAgICAgICAgICAgICBrZXkgPSBlLndoaWNoOwotICAgICAgICAgICAgICAgIHRhcmdldCA9IGUudGFyZ2V0OwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGtleT09MTMgfHwga2V5PT0zMikgewotICAgICAgICAgICAgICAgIGZ1bmModGFyZ2V0KTsKLSAgICAgICAgfQotfQotPC9zY3JpcHQ+Ci0JCQk8L2hlYWQ+Ci0JCQk8Ym9keSBtYXJnaW5oZWlnaHQ9IjAiIG1hcmdpbndpZHRoPSIwIiBvbmxvYWQ9ImluaXQoKTsiPgotCQkJCTx0YWJsZSBjZWxsc3BhY2luZz0iMXB4IiBjZWxscGFkZGluZz0iMHB4IiBib3JkZXI9IjAiIGhlaWdodD0iMTAwJSIgd2lkdGg9IjEwMCUiPgotCQkJCQk8IS0tIGFkZCB0aGUgdGFiIG1lbnVzIC0tPgotCQkJCQk8dHI+Ci0JCQkJCQk8dGQgY2xhc3M9Im1lbnUiPgotCQkJCQkJCTx4c2w6dGV4dD4KLTwveHNsOnRleHQ+Ci0JCQkJCQkJPHNwYW4gY2xhc3M9Im1lbnUiIHRhYmluZGV4PSIxIiBvbmNsaWNrPSJ3aGVyZUFtSSgpOyIgb25rZXlwcmVzcz0iY2hlY2tLZXkoZXZlbnQsIHdoZXJlQW1JKTsiPgotCQkJCQkJCQk8aW1nIGFsdD0iIiB0aXRsZT0iIiBzcmM9ImltYWdlcy9uaV93aGVyZS5naWYiLz4KLQkJCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR3aGVyZUFtSVRleHQiLz4KLQkJCQkJCQk8L3NwYW4+Ci0JCQkJCQkJPHhzbDp0ZXh0PgotPC94c2w6dGV4dD4KLQkJCQkJCQk8c3BhbiBjbGFzcz0ibWVudSIgdGFiaW5kZXg9IjEiIG9uY2xpY2s9InRvZ1ZpZXdzKCk7IiBvbmtleXByZXNzPSJjaGVja0tleShldmVudCwgdG9nVmlld3MpOyI+Ci0JCQkJCQkJCTxpbWcgYWx0PSIiIHRpdGxlPSIiIHNyYz0iaW1hZ2VzL2FjdGlvbl91bmhpZGUuZ2lmIi8+Ci0JCQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdHJlZVNldHNUZXh0Ii8+Ci0JCQkJCQkJPC9zcGFuPgotCQkJCQkJCTx4c2w6dGV4dD4KLTwveHNsOnRleHQ+Ci0JCQkJCQk8L3RkPgotCQkJCQk8L3RyPgotCQkJCQk8IS0tIGxvYWQgdGhlIHRhYnMgLS0+Ci0JCQkJCTx0cj4KLQkJCQkJCTx0ZCBjbGFzcz0idGFiIj4KLQkJCQkJCQk8eHNsOnRleHQ+Ci08L3hzbDp0ZXh0PgotCQkJCQkJCTx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJCb29rbWFyayI+Ci0JCQkJCQkJCTx4c2w6dmFyaWFibGUgbmFtZT0icG9zIj4KLQkJCQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJwb3NpdGlvbigpLTEiLz4KLQkJCQkJCQkJPC94c2w6dmFyaWFibGU+Ci0JCQkJCQkJCTxzcGFuIGNsYXNzPSJ0YWIiIGlkPSJ0YWJ7JHBvc30iIHRhYmluZGV4PSIxIiBvbmtleXByZXNzPSJjaGVja0tleShldmVudCwgZGlzcGxheVRyZWUpOyIgb25jbGljaz0iZGlzcGxheVRyZWUodGhpcyk7Ij4KLQkJCQkJCQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9InVybCI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkB1cmwiLz48L3hzbDphdHRyaWJ1dGU+Ci0JCQkJCQkJCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJpc0RlZmF1bHRWaWV3Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGRlZmF1bHQiLz48L3hzbDphdHRyaWJ1dGU+JiMxNjA7PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkB0YWJOYW1lIi8+JiMxNjA7PC9zcGFuPgotCQkJCQkJCQk8eHNsOnRleHQ+Ci08L3hzbDp0ZXh0PgotCQkJCQkJCTwveHNsOmZvci1lYWNoPgotCQkJCQkJPC90ZD4KLQkJCQkJPC90cj4KLQkJCQkJPCEtLSBwbGFjZWhvbGRlciBmb3IgdGhlIGNvbnRlbnQgdHJlZSAtLT4KLQkJCQkJPHRyIGhlaWdodD0iMTAwJSI+Ci0JCQkJCQk8dGQgY2xhc3M9InRyZWUiPgotCQkJCQkJCTxpZnJhbWUgbmFtZT0ib3J5X3RvYyIgdGl0bGU9IiIgc3R5bGU9InZpc2liaWxpdHk6dmlzaWJsZSIgdGFiaW5kZXg9IjEiIGZyYW1lYm9yZGVyPSJubyIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgc2Nyb2xsaW5nPSJhdXRvIi8+Ci0JCQkJCQk8L3RkPgotCQkJCQk8L3RyPgotCQkJCTwvdGFibGU+Ci0JCQk8L2JvZHk+Ci0JCTwvaHRtbD4KLQk8L3hzbDp0ZW1wbGF0ZT4KLTwveHNsOnN0eWxlc2hlZXQ+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy94c2wvUHVibGlzaGluZ1JlcG9ydC54c2wgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy94c2wvUHVibGlzaGluZ1JlcG9ydC54c2wKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmOTA5NjQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcveHNsL1B1Ymxpc2hpbmdSZXBvcnQueHNsCisrKyAvZGV2L251bGwKQEAgLTEsMjAxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLQotPHhzbDpzdHlsZXNoZWV0IHZlcnNpb249IjEuMCIgeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iIHhtbG5zOmZvPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9Gb3JtYXQiPgotCi08eHNsOm91dHB1dCBtZXRob2Q9Imh0bWwiIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiAKLQlkb2N0eXBlLXB1YmxpYz0iLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iIAotCWRvY3R5cGUtc3lzdGVtPSJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIiAKLQlpbmRlbnQ9InllcyIvPgotCQotPHhzbDpwYXJhbSBuYW1lPSJzZWxlY3RlZENvbmZpZ3VyYXRpb25UZXh0Ii8+Ci08eHNsOnBhcmFtIG5hbWU9ImRldGFpbEluZm9UZXh0Ii8+Ci08eHNsOnBhcmFtIG5hbWU9InNob3dFcnJvclRleHQiLz4KLTx4c2w6cGFyYW0gbmFtZT0ibG9nc1dhcm5pbmdUZXh0Ii8+Ci08eHNsOnBhcmFtIG5hbWU9InBhZ2VzTm90SW5zdGFsbGVkVGV4dCIvPgotPHhzbDpwYXJhbSBuYW1lPSJpbnZhbGlkRXh0ZXJuYWxUZXh0Ii8+Ci08eHNsOnBhcmFtIG5hbWU9Im5vbkV4aXN0aW5nVGV4dCIvPgotPHhzbDpwYXJhbSBuYW1lPSJtaXNzaW5nUmVmZXJlbmNlc1RpdGxlVGV4dCIvPgotPHhzbDpwYXJhbSBuYW1lPSJtaXNzaW5nUmVmZXJlbmNlc1RleHQiLz4KLTx4c2w6cGFyYW0gbmFtZT0ibWlzc2luZ1Jlc291cmNlRmlsZXNUaXRsZVRleHQiLz4KLTx4c2w6cGFyYW0gbmFtZT0ibWlzc2luZ1Jlc291cmNlRmlsZXNUZXh0Ii8+Ci08eHNsOnBhcmFtIG5hbWU9Im1pc3NpbmdSZXNvdXJjZVRleHQiLz4KLTx4c2w6cGFyYW0gbmFtZT0ib3duZXJSZXNvdXJjZVRleHQiLz4KLTx4c2w6cGFyYW0gbmFtZT0ib3duZXJFbGVtZW50VGV4dCIvPgotPHhzbDpwYXJhbSBuYW1lPSJtaXNzaW5nRWxlbWVudFRleHQiLz4KLTx4c2w6cGFyYW0gbmFtZT0iaW52YWxpZEVsZW1lbnRUZXh0Ii8+Ci08eHNsOnBhcmFtIG5hbWU9ImludmFsaWRFbGVtZW50TGlua3NUZXh0Ii8+Ci08eHNsOnBhcmFtIG5hbWU9InBsZWFzZUNoZWNrVGV4dCIvPgotPHhzbDpwYXJhbSBuYW1lPSJwbGVhc2VGaW5kVGV4dCIvPgotPHhzbDpwYXJhbSBuYW1lPSJwdWJsaXNoaW5nUmVwb3J0VGV4dCIvPgotPHhzbDpwYXJhbSBuYW1lPSJzdW1tYXJ5VGV4dCIvPgotPHhzbDpwYXJhbSBuYW1lPSJpbmZvVGV4dCIvPgotCi0KLTx4c2w6dGVtcGxhdGUgbWF0Y2g9IlB1Ymxpc2hpbmdSZXBvcnQiPgotPGh0bWw+Ci0JCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJsYW5nIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGxhbmciLz48L3hzbDphdHRyaWJ1dGU+Ci0JCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJ4bWw6bGFuZyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBsYW5nIi8+PC94c2w6YXR0cmlidXRlPgotPGhlYWQ+Ci08bGluayB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi8uLi9jc3MvZGVmYXVsdC5jc3MiIHJlbD0iU3R5bGVTaGVldCIvPgotPHNjcmlwdCBzcmM9Ii4vLi4vc2NyaXB0cy9Db250ZW50UGFnZVJlc291cmNlLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij48L3NjcmlwdD4KLTxzY3JpcHQgc3JjPSIuLy4uL3NjcmlwdHMvQ29udGVudFBhZ2VTZWN0aW9uLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij48L3NjcmlwdD4KLTxzY3JpcHQgc3JjPSIuLy4uL3NjcmlwdHMvY29udGVudFBhZ2UuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPjwvc2NyaXB0PgotPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij4KLQkJCQkJYmFja1BhdGggPSAnLi4vJzsKLQkJCQkJaW1nUGF0aCA9ICcuLi9pbWFnZXMvJzsKLQkJCQkJdmFyIG5vZGVJbmZvPW51bGw7Ci0JCQkJCWNvbnRlbnRQYWdlLnByZWxvYWQoaW1nUGF0aCwgYmFja1BhdGgsIG5vZGVJbmZvLCAgJycsIGZhbHNlLCBmYWxzZSwgZmFsc2UpOwotCQkJCTwvc2NyaXB0PgotPC9oZWFkPgotCi08Ym9keT4KLTxoMj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHB1Ymxpc2hpbmdSZXBvcnRUZXh0Ii8+PC9oMj4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbkhlYWRpbmciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkc3VtbWFyeVRleHQiLz48L2Rpdj4KLTxkaXYgYWxpZ249ImxlZnQiPgotPHAvPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkc2VsZWN0ZWRDb25maWd1cmF0aW9uVGV4dCIvPjo8cC8+Ci0KLTxiPgotPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InB1YkRpci9AcGF0aCIvPgotPC9iPgotCi08cC8+Ci0KLTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZGV0YWlsSW5mb1RleHQiLz46Ci08dWw+Ci08bGk+Ci08YT4KLTx4c2w6YXR0cmlidXRlIG5hbWU9ImhyZWYiPgotPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9ImVycm9yTG9nL0BwYXRoIi8+Ci08L3hzbDphdHRyaWJ1dGU+Ci08eHNsOnZhbHVlLW9mIHNlbGVjdD0iZXJyb3JMb2cvQG5hbWUiLz4KLTwvYT4KLSAtIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkc2hvd0Vycm9yVGV4dCIvPiA8L2xpPgotPGxpPgotPGE+Ci08eHNsOmF0dHJpYnV0ZSBuYW1lPSJocmVmIj4KLTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJ3YXJuaW5nTG9nL0BwYXRoIi8+Ci08L3hzbDphdHRyaWJ1dGU+Ci08eHNsOnZhbHVlLW9mIHNlbGVjdD0id2FybmluZ0xvZy9AbmFtZSIvPgotPC9hPgotIC0gPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRsb2dzV2FybmluZ1RleHQiLz4gPC9saT4KLTwvdWw+Ci0KLTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcGFnZXNOb3RJbnN0YWxsZWRUZXh0Ii8+Ci0KLTwvZGl2PgotCi0KLTx4c2w6aWYgdGVzdD0idmFsaWRhdG9ySW5mby9pbnZhbGlkRXh0ZXJuYWxMaW5rcyI+Ci08ZGl2IGNsYXNzPSJzZWN0aW9uSGVhZGluZyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRpbnZhbGlkRXh0ZXJuYWxUZXh0Ii8+OjwvZGl2PgotPGRpdiBhbGlnbj0ibGVmdCI+Ci08cC8+Ci08dGFibGUgY2xhc3M9InNlY3Rpb25UYWJsZSI+Ci0JPHRib2R5PgotCQk8dHI+Ci0JCQk8dGg+VXJsPC90aD48dGg+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRvd25lckVsZW1lbnRUZXh0Ii8+PC90aD48dGg+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRpbmZvVGV4dCIvPjwvdGg+Ci0JCTwvdHI+Ci0JCTx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJ2YWxpZGF0b3JJbmZvL2ludmFsaWRFeHRlcm5hbExpbmtzL2VudHJ5Ij4KLQkJPHRyPgotCQkJPHRkPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAdXJsIi8+PC90ZD4KLQkJCTx0ZD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG93bmVyIi8+PC90ZD4KLQkJCTx0ZD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG1lc3NhZ2UiLz4mIzE2MDs8L3RkPgotCQk8L3RyPgotCTwveHNsOmZvci1lYWNoPgotCTwvdGJvZHk+Ci08L3RhYmxlPgotPC9kaXY+Ci08L3hzbDppZj4KLQotPHhzbDppZiB0ZXN0PSJ2YWxpZGF0b3JJbmZvL2ludmFsaWRSZWZlcmVuY2VzIGFuZCBjb3VudCh2YWxpZGF0b3JJbmZvL2ludmFsaWRSZWZlcmVuY2VzL2VudHJ5KSA+IDAiPgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uSGVhZGluZyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRpbnZhbGlkRWxlbWVudExpbmtzVGV4dCIvPjo8L2Rpdj4KLTxkaXYgYWxpZ249ImxlZnQiPgotPHAvPgotPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRub25FeGlzdGluZ1RleHQiLz48YnIvPgotPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwbGVhc2VGaW5kVGV4dCIvPgotPHAvPgotPHRhYmxlIGNsYXNzPSJzZWN0aW9uVGFibGUiPgotCTx0Ym9keT4KLQkJPHRyPgotCQkJPHRoPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkaW52YWxpZEVsZW1lbnRUZXh0Ii8+PC90aD48dGg+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRvd25lckVsZW1lbnRUZXh0Ii8+PC90aD4KLQkJPC90cj4KLQkJPHhzbDpmb3ItZWFjaCBzZWxlY3Q9InZhbGlkYXRvckluZm8vaW52YWxpZFJlZmVyZW5jZXMvZW50cnkiPgotCQk8dHI+Ci0JCQk8dGQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBlbGVtZW50Ii8+ICg8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGd1aWQiLz4pPC90ZD4KLQkJCTx0ZD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG93bmVyIi8+PC90ZD4KLQkJPC90cj4KLQk8L3hzbDpmb3ItZWFjaD4KLQk8L3Rib2R5PgotPC90YWJsZT4KLTwvZGl2PgotPC94c2w6aWY+Ci0KLQotPHhzbDppZiB0ZXN0PSJ2YWxpZGF0b3JJbmZvL21pc3NpbmdSZWZlcmVuY2VzIGFuZCBjb3VudCh2YWxpZGF0b3JJbmZvL21pc3NpbmdSZWZlcmVuY2VzL2VudHJ5KSA+IDAiPgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uSGVhZGluZyI+IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbWlzc2luZ1JlZmVyZW5jZXNUaXRsZVRleHQiLz46PC9kaXY+Ci08ZGl2IGFsaWduPSJsZWZ0Ij4KLTxwLz4KLTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbWlzc2luZ1JlZmVyZW5jZXNUZXh0Ii8+PGJyLz4KLTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcGxlYXNlQ2hlY2tUZXh0Ii8+Ci08cC8+Ci08dGFibGUgY2xhc3M9InNlY3Rpb25UYWJsZSI+Ci0JPHRib2R5PgotCQk8dHI+Ci0JCQk8dGg+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRtaXNzaW5nRWxlbWVudFRleHQiLz48L3RoPjx0aD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG93bmVyRWxlbWVudFRleHQiLz48L3RoPgotCQk8L3RyPgotCQk8eHNsOmZvci1lYWNoIHNlbGVjdD0idmFsaWRhdG9ySW5mby9taXNzaW5nUmVmZXJlbmNlcy9lbnRyeSI+Ci0JCTx0cj4KLQkJCTx0ZD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGVsZW1lbnQiLz48L3RkPgotCQkJPHRkPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAb3duZXIiLz48L3RkPgotCQk8L3RyPgotCTwveHNsOmZvci1lYWNoPgotCTwvdGJvZHk+Ci08L3RhYmxlPgotPC9kaXY+Ci08L3hzbDppZj4KLQotPHhzbDppZiB0ZXN0PSJ2YWxpZGF0b3JJbmZvL21pc3NpbmdSZXNvdXJjZXMgYW5kIGNvdW50KHZhbGlkYXRvckluZm8vbWlzc2luZ1Jlc291cmNlcy9lbnRyeSkgPiAwIj4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbkhlYWRpbmciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbWlzc2luZ1Jlc291cmNlRmlsZXNUaXRsZVRleHQiLz46PC9kaXY+Ci08ZGl2IGFsaWduPSJsZWZ0Ij4KLTxwLz4KLTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbWlzc2luZ1Jlc291cmNlRmlsZXNUZXh0Ii8+PGJyLz4KLTxwLz4KLTx0YWJsZSBjbGFzcz0ic2VjdGlvblRhYmxlIj4KLQk8dGJvZHk+Ci0JCTx0cj4KLQkJCTx0aD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG1pc3NpbmdSZXNvdXJjZVRleHQiLz48L3RoPjx0aD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG93bmVyUmVzb3VyY2VUZXh0Ii8+PC90aD48dGg+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRvd25lckVsZW1lbnRUZXh0Ii8+PC90aD4KLQkJPC90cj4KLQkJPHhzbDpmb3ItZWFjaCBzZWxlY3Q9InZhbGlkYXRvckluZm8vbWlzc2luZ1Jlc291cmNlcy9lbnRyeSI+Ci0JCTx0cj4KLQkJCTx0ZD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHVybCIvPjwvdGQ+Ci0JCQk8dGQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkByZXNvdXJjZSIvPjwvdGQ+Ci0JCQk8dGQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBvd25lciIvPjwvdGQ+Ci0JCTwvdHI+Ci0JPC94c2w6Zm9yLWVhY2g+Ci0JPC90Ym9keT4KLTwvdGFibGU+Ci08L2Rpdj4KLTwveHNsOmlmPgotCi0KLTwvYm9keT4KLTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+Ci0JCQkJY29udGVudFBhZ2Uub25sb2FkKCk7Ci08L3NjcmlwdD4KLTwvaHRtbD4KLQotCi08L3hzbDp0ZW1wbGF0ZT4KLTwveHNsOnN0eWxlc2hlZXQ+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy94c2wvYm9va21hcmsueHNsIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcveHNsL2Jvb2ttYXJrLnhzbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZlYzFmMy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy94c2wvYm9va21hcmsueHNsCisrKyAvZGV2L251bGwKQEAgLTEsMTgwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLTx4c2w6c3R5bGVzaGVldCB2ZXJzaW9uPSIxLjAiIHhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIiB4bWxuczpmbz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvRm9ybWF0Ij4KLQotPHhzbDpvdXRwdXQgbWV0aG9kPSJodG1sIiB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgCi0JZG9jdHlwZS1wdWJsaWM9Ii0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAKLQlkb2N0eXBlLXN5c3RlbT0iaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCIgCi0JaW5kZW50PSJ5ZXMiLz4KLQkKLQk8eHNsOnRlbXBsYXRlIG1hdGNoPSIvRWxlbWVudCI+Ci0JCTxodG1sPgotCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0ibGFuZyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBsYW5nIi8+PC94c2w6YXR0cmlidXRlPgotCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0ieG1sOmxhbmciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbGFuZyIvPjwveHNsOmF0dHJpYnV0ZT4KLQkJCTxoZWFkPgotCQkJCTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04Ii8+Ci0JCQkJPHRpdGxlPkNvbnRlbnRzPC90aXRsZT4KLQkJCQk8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24uIEFsbCBSaWdodHMgUmVzZXJ2ZWQuIAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0qIHsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDlwdDsKLQltYXJnaW46IDA7Ci0JcGFkZGluZzogMDsKLX0KLQotQk9EWSB7Ci0JYmFja2dyb3VuZC1jb2xvcjogV2luZG93OwotCWZvbnQ6IGljb247Ci0JbWFyZ2luOjA7Ci0JcGFkZGluZzowOwotCWJvcmRlcjowOwotfQotCi1VTCB7Ci0JYm9yZGVyLXdpZHRoOjA7Ci0JbWFyZ2luLWxlZnQ6MTVweDsKLX0KLQotI3Jvb3QgewotCW1hcmdpbi10b3A6NXB4OwotCW1hcmdpbi1sZWZ0OjVweDsKLX0KLQotVUwuZXhwYW5kZWQgewotCWRpc3BsYXk6YmxvY2s7Ci19Ci0KLVVMLmNvbGxhcHNlZCB7Ci0JZGlzcGxheTogbm9uZTsKLX0KLQotTEkgewotCW1hcmdpbi10b3A6M3B4OwotCWxpc3Qtc3R5bGUtaW1hZ2U6bm9uZTsKLQlsaXN0LXN0eWxlLXR5cGU6bm9uZTsKLQkJd2hpdGUtc3BhY2U6IG5vd3JhcDsKLX0KLQotSU1HIHsKLQl2ZXJ0aWNhbC1hbGlnbjogdG9wOwotCWJvcmRlcjowcHg7Ci0JbWFyZ2luOjBweDsKLQlwYWRkaW5nOjBweDsKLQltYXJnaW4tcmlnaHQ6NHB4OwotfQotCi0KLUEgewotCXRleHQtZGVjb3JhdGlvbjpub25lOwotCWNvbG9yOiMyNTgKLQlwYWRkaW5nLXJpZ2h0OjJweDsKLQkvKiB0aGlzIHdvcmtzIGluIGllNS41LCBidXQgbm90IGluIGllNS4wICAqLwotCXdoaXRlLXNwYWNlOiBub3dyYXA7Ci19Ci0KLUE6aG92ZXJ7Ci0JdGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZTsKLX0KLQotQS5hY3RpdmV7Ci0JYmFja2dyb3VuZDpIaWdobGlnaHQ7Ci0JY29sb3I6SGlnaGxpZ2h0VGV4dDsKLQl3aWR0aDoxMDAlOwotfQotCi1BLmFjdGl2ZTpob3ZlcnsKLQl0ZXh0LWRlY29yYXRpb246dW5kZXJsaW5lOwotCWJhY2tncm91bmQ6SGlnaGxpZ2h0OwotCWNvbG9yOkhpZ2hsaWdodFRleHQ7Ci0Jd2lkdGg6MTAwJTsKLX0KLQotCi0KLS5oIHsKLQl2aXNpYmlsaXR5OmhpZGRlbjsKLX0KLQotPC9zdHlsZT4KLQkJCQk8YmFzZSB0YXJnZXQ9Im9yeV9kb2MiLz4KLQkJCQk8c2NyaXB0IGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij4KLQotLy8gUHJlbG9hZCBpbWFnZXMKLW1pbnVzID0gbmV3IEltYWdlKCk7Ci1taW51cy5zcmMgPSAiaW1hZ2VzIisiL21pbnVzLmdpZiI7Ci1wbHVzID0gbmV3IEltYWdlKCk7Ci1wbHVzLnNyYyA9ICJpbWFnZXMiKyIvcGx1cy5naWYiOwotYWx0VG9waWNDbG9zZWQgPSAiVG9waWNcdTAwMjBjbG9zZWQiOwotYWx0VG9waWNPcGVuID0gIlRvcGljXHUwMDIwb3BlbiI7Ci08L3NjcmlwdD4KLQkJCQk8c2NyaXB0IGxhbmd1YWdlPSJKYXZhU2NyaXB0IiBzcmM9InRvYy5qcyIvPgotCQkJCTxzY3JpcHQgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiIHNyYz0idHJlZS5qcyIvPgotCQkJPC9oZWFkPgotCQkJPGJvZHkgZGlyPSJsdHIiIG9ubG9hZD0ic2V0TG9hZGVkKCk7Ij4KLQkJCQk8dWwgZGlyPSJsdHIiIGNsYXNzPSJleHBhbmRlZCIgaWQ9InJvb3QiPgotCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icHJvY2Vzc05vZGUiPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9Im5vZGUiIHNlbGVjdD0iRWxlbWVudCIvPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9InBhcmVudElkIiBzZWxlY3Q9IicnIi8+Ci0JCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJPC91bD4KLQkJCTwvYm9keT4KLQkJPC9odG1sPgotCTwveHNsOnRlbXBsYXRlPgotCTx4c2w6dGVtcGxhdGUgbmFtZT0icHJvY2Vzc05vZGUiPgotCQk8eHNsOnBhcmFtIG5hbWU9Im5vZGUiLz4KLQkJPHhzbDpwYXJhbSBuYW1lPSJwYXJlbnRJZCIvPgotCQk8eHNsOmZvci1lYWNoIHNlbGVjdD0iJG5vZGUiPgotCQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJuYW1lIj4KLQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4KLQkJCTwveHNsOnZhcmlhYmxlPgotCQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJpZCI+Ci0JCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBub2RlSWQiLz4KLQkJCTwveHNsOnZhcmlhYmxlPgotCQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJndWlkIj4KLQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGd1aWQiLz4KLQkJCTwveHNsOnZhcmlhYmxlPgotCQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJpY29udXJsIj4uL2ltYWdlcy88eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGNsb3NlZEljb25OYW1lIi8+Ci0JCQk8L3hzbDp2YXJpYWJsZT4KLQkJCTx4c2w6dmFyaWFibGUgbmFtZT0idXJsIj4uLy4uLzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAdXJsIi8+Ci0JCQk8L3hzbDp2YXJpYWJsZT4KLQkJCTxsaT4KLQkJCQk8eHNsOmNob29zZT4KLQkJCQkJPHhzbDp3aGVuIHRlc3Q9ImNvdW50KEVsZW1lbnQpID4gMCAiPgotCQkJCQkJPGltZyBzcmM9ImltYWdlcy9wbHVzLmdpZiIgY2xhc3M9ImNvbGxhcHNlZCIgYWx0PSIiIHRpdGxlPSIiLz4KLQkJCQkJPC94c2w6d2hlbj4KLQkJCQkJPHhzbDpvdGhlcndpc2U+Ci0JCQkJCQk8IS0tIDxzcGFuIHN0eWxlPSJ3aWR0aDoxMiI+PC9zcGFuPiAtLT4KLQkJCQkJCTxpbWcgc3JjPSJpbWFnZXMvbm9wbHVzLmdpZiIgY2xhc3M9ImNvbGxhcHNlZCIgYWx0PSIiIHRpdGxlPSIiLz4KLQkJCQkJPC94c2w6b3RoZXJ3aXNlPgotCQkJCTwveHNsOmNob29zZT4KLQkJCQk8YSBpZD0ieyRpZH0iIHBhcmVudElkPSJ7JHBhcmVudElkfSIgZ3VpZD0ieyRndWlkfSIgaHJlZj0ieyR1cmx9Ij4KLQkJCQkJPGltZyBzcmM9InskaWNvbnVybH0iIGFsdD0iIiB0aXRsZT0iIi8+Ci0JCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbmFtZSIvPgotCQkJCTwvYT4KLQkJCQk8eHNsOmlmIHRlc3Q9ImNvdW50KEVsZW1lbnQpID4gMCAiPgotCQkJCQk8dWwgY2xhc3M9ImNvbGxhcHNlZCI+Ci0JCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icHJvY2Vzc05vZGUiPgotCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJub2RlIiBzZWxlY3Q9IkVsZW1lbnQiLz4KLQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0icGFyZW50SWQiIHNlbGVjdD0iJGlkIi8+Ci0JCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQk8L3VsPgotCQkJCTwveHNsOmlmPgotCQkJPC9saT4KLQkJPC94c2w6Zm9yLWVhY2g+Ci0JPC94c2w6dGVtcGxhdGU+Ci08L3hzbDpzdHlsZXNoZWV0PgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcveHNsL2VsZW1lbnRVcmxzLnhzbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3hzbC9lbGVtZW50VXJscy54c2wKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0ZDI4NTkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcveHNsL2VsZW1lbnRVcmxzLnhzbAorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLQotPHhzbDpzdHlsZXNoZWV0IHZlcnNpb249IjEuMCIgeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iIHhtbG5zOmZvPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9Gb3JtYXQiPgotPHhzbDpvdXRwdXQgb21pdC14bWwtZGVjbGFyYXRpb249InllcyIvPgotCi08eHNsOnRlbXBsYXRlIG1hdGNoPSIvRWxlbWVudFVybHMiPgotPHhzbDpmb3ItZWFjaCBzZWxlY3Q9ImVsZW1lbnRVcmwiPmNvbnRlbnRQYWdlLnByb2Nlc3NQYWdlLmVsZW1lbnRVcmxzWyI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5vZGVJZCIvPiJdID0gWyI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHRleHQiLz4iLCI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHVybCIvPiJdOwotPC94c2w6Zm9yLWVhY2g+CQkKLTwveHNsOnRlbXBsYXRlPgotPC94c2w6c3R5bGVzaGVldD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3hzbC9nbG9zc2FyeS54c2wgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy94c2wvZ2xvc3NhcnkueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MmFkZDRlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3hzbC9nbG9zc2FyeS54c2wKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci0KLTx4c2w6c3R5bGVzaGVldCB2ZXJzaW9uPSIxLjAiIHhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIj4KLQotPHhzbDpvdXRwdXQgbWV0aG9kPSJodG1sIiB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgCi0JZG9jdHlwZS1wdWJsaWM9Ii0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAKLQlkb2N0eXBlLXN5c3RlbT0iaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCIgCi0JaW5kZW50PSJ5ZXMiLz4KLQkKLTx4c2w6cGFyYW0gbmFtZT0idGl0bGUiLz4KLTx4c2w6cGFyYW0gbmFtZT0iZ2xvc3NhcnlUZXh0Ii8+Ci0KLTx4c2w6dGVtcGxhdGUgbWF0Y2g9Ikdsb3NzYXJ5Ij4KLQotPGh0bWw+Ci0JCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJsYW5nIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGxhbmciLz48L3hzbDphdHRyaWJ1dGU+Ci0JCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJ4bWw6bGFuZyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBsYW5nIi8+PC94c2w6YXR0cmlidXRlPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIvPgotPHRpdGxlPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZ2xvc3NhcnlUZXh0Ii8+IC0gPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR0aXRsZSIvPjwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSB0ZXh0PSIjMDAwMDAwIiBiZ2NvbG9yPSIjZmZmZmZmIj4KLTxmb250IGZhY2U9IkFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWYiPgotPGRsPgotCi08eHNsOmZvci1lYWNoIHNlbGVjdD0iaXRlbSI+Ci08ZHQ+Ci08Yj4KLTxhPgotPHhzbDphdHRyaWJ1dGUgbmFtZT0iaWQiPl9HTE9TU0FSWV9JVEVNXzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPjwveHNsOmF0dHJpYnV0ZT4KLTx4c2w6YXR0cmlidXRlIG5hbWU9Im5hbWUiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPjwveHNsOmF0dHJpYnV0ZT48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHByZXNlbnRhdGlvbk5hbWUiLz4KLTwvYT4KLTwvYj4KLTwvZHQ+Ci0KLTxkZD4KLTx4c2w6dmFsdWUtb2YgZGlzYWJsZS1vdXRwdXQtZXNjYXBpbmc9InllcyIgc2VsZWN0PSJAY29udGVudCIvPgkKLTwvZGQ+Ci08L3hzbDpmb3ItZWFjaD4KLQotPC9kbD4KLTwvZm9udD4KLTwvYm9keT4KLTwvaHRtbD4KLQotPC94c2w6dGVtcGxhdGU+Ci0JCi08L3hzbDpzdHlsZXNoZWV0PgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcveHNsL2dsb3NzYXJ5X2luZGV4LnhzbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3hzbC9nbG9zc2FyeV9pbmRleC54c2wKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4MmVjODcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcveHNsL2dsb3NzYXJ5X2luZGV4LnhzbAorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLQotPHhzbDpzdHlsZXNoZWV0IHZlcnNpb249IjEuMCIgeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiPgotCi08eHNsOnBhcmFtIG5hbWU9InRpdGxlIi8+Ci08eHNsOnBhcmFtIG5hbWU9Imdsb3NzYXJ5VGV4dCIvPgotCi08eHNsOnRlbXBsYXRlIG1hdGNoPSJHbG9zc2FyeSI+Ci0KLTxodG1sPgotCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0ibGFuZyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBsYW5nIi8+PC94c2w6YXR0cmlidXRlPgotCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0ieG1sOmxhbmciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbGFuZyIvPjwveHNsOmF0dHJpYnV0ZT4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiLz4KLTxtZXRhIG5hbWU9Im1ldGFfdGFnZ2VkIiBjb250ZW50PSJ0cnVlIi8+Ci08dGl0bGU+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRnbG9zc2FyeVRleHQiLz4gLSA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHRpdGxlIi8+PC90aXRsZT4KLTwvaGVhZD4KLTxmcmFtZXNldCByb3dzPSIyNSwqIj4KLTxmcmFtZSBuYW1lPSJnbG9zc2FyeV9uYXYiIHNyYz0ibmF2aWcuaHRtIiBzY3JvbGxpbmc9ImF1dG8iIG1hcmdpbmhlaWdodD0iMiIgbWFyZ2lud2lkdGg9IjIiIHRpdGxlPSJOYXZpZ2F0aW9uIEFyZWEiLz4KLTxmcmFtZSBuYW1lPSJnbG9zc2FyeV9kb2MiIHNyYz0iLi4vZ2xvc3NhcnkuaHRtIiBtYXJnaW5oZWlnaHQ9IjAiIG1hcmdpbndpZHRoPSIyIiBzY3JvbGxpbmc9ImF1dG8iIHRpdGxlPSJDb250ZW50IEFyZWEiLz4KLTwvZnJhbWVzZXQ+Ci08L2h0bWw+Ci0KLTwveHNsOnRlbXBsYXRlPgotCi08L3hzbDpzdHlsZXNoZWV0PgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcveHNsL2dsb3NzYXJ5X25hdmlnLnhzbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3hzbC9nbG9zc2FyeV9uYXZpZy54c2wKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2NDc2YTguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcveHNsL2dsb3NzYXJ5X25hdmlnLnhzbAorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLQotPHhzbDpzdHlsZXNoZWV0IHZlcnNpb249IjEuMCIgeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiPgotCi08eHNsOm91dHB1dCBtZXRob2Q9Imh0bWwiIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiAKLQlkb2N0eXBlLXB1YmxpYz0iLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iIAotCWRvY3R5cGUtc3lzdGVtPSJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIiAKLQlpbmRlbnQ9InllcyIvPgotCQotPHhzbDpwYXJhbSBuYW1lPSJ0aXRsZSIvPgotPHhzbDpwYXJhbSBuYW1lPSJnbG9zc2FyeVRleHQiLz4KLQotPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iR2xvc3NhcnkiPgotCi08aHRtbD4KLQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9ImxhbmciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbGFuZyIvPjwveHNsOmF0dHJpYnV0ZT4KLQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9InhtbDpsYW5nIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGxhbmciLz48L3hzbDphdHRyaWJ1dGU+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04Ii8+Ci08dGl0bGU+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRnbG9zc2FyeVRleHQiLz4gLSA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHRpdGxlIi8+PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IHRleHQ9IiMwMDAwMDAiIGJnY29sb3I9IiNmZmZmZmYiPgotPGZvbnQgZmFjZT0iQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZiI+PHhzbDp0ZXh0PgotPC94c2w6dGV4dD4KLTx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJpdGVtW0BuYXZpZ2F0aW9uLW1hcms9J3RydWUnXSI+Ci08YSAgdGFyZ2V0PSJnbG9zc2FyeV9kb2MiPgotPHhzbDphdHRyaWJ1dGUgbmFtZT0iaHJlZiI+Li4vZ2xvc3NhcnkuaHRtIzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPjwveHNsOmF0dHJpYnV0ZT48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHByZXNlbnRhdGlvbk5hbWUiLz48L2E+PHhzbDp0ZXh0PgotPC94c2w6dGV4dD4KLTwveHNsOmZvci1lYWNoPgotPC9mb250PgotPC9ib2R5PgotPC9odG1sPgotCi08L3hzbDp0ZW1wbGF0ZT4KLQotPC94c2w6c3R5bGVzaGVldD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3hzbC9pbmRleC54c2wgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy94c2wvaW5kZXgueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MGI5ZGY0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3hzbC9pbmRleC54c2wKKysrIC9kZXYvbnVsbApAQCAtMSwxNjMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotCi08eHNsOnN0eWxlc2hlZXQgdmVyc2lvbj0iMS4wIiB4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIgeG1sbnM6Zm89Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML0Zvcm1hdCI+Ci0KLTx4c2w6b3V0cHV0IG1ldGhvZD0iaHRtbCIgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIAotCWRvY3R5cGUtcHVibGljPSItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgCi0JZG9jdHlwZS1zeXN0ZW09Imh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiIAotCWluZGVudD0ieWVzIi8+Ci0JCi08eHNsOnRlbXBsYXRlIG1hdGNoPSIvUHVibGlzaGluZ09wdGlvbiI+Ci0KLTx4c2w6dmFyaWFibGUgbmFtZT0idGl0bGUiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAdGl0bGUiLz48L3hzbDp2YXJpYWJsZT4KLQotPGh0bWw+Ci0JCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJsYW5nIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGxhbmciLz48L3hzbDphdHRyaWJ1dGU+Ci0JCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJ4bWw6bGFuZyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBsYW5nIi8+PC94c2w6YXR0cmlidXRlPgotCi08aGVhZD4KLTx0aXRsZT48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHRpdGxlIi8+PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04Ii8+Ci08bWV0YSBuYW1lPSJtZXRhX3RhZ2dlZCIgY29udGVudD0idHJ1ZSIvPgotCi08IS0tIGluY2x1ZGUgYWRkaXRpb25hbCBtZXRhIHRhZ3MgaWYgYW55IC0tPgotPHhzbDpmb3ItZWFjaCBzZWxlY3Q9Im1ldGFUYWdzL21ldGFUYWciPgotPG1ldGE+Ci08eHNsOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz48L3hzbDphdHRyaWJ1dGU+Ci08eHNsOmF0dHJpYnV0ZSBuYW1lPSJjb250ZW50Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGNvbnRlbnQiLz48L3hzbDphdHRyaWJ1dGU+Ci08L21ldGE+Ci08L3hzbDpmb3ItZWFjaD4KLQotPHNjcmlwdCBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+Ci08IVtDREFUQVsKLTwhLS0KLXZhciB0b3VyID0gMDsKLQotZnVuY3Rpb24gZ2V0Q29va2llIChuYW1lKSAKLXsKLSAgdmFyIGRjb29raWUgPSBkb2N1bWVudC5jb29raWU7IAotICB2YXIgY25hbWUgPSBuYW1lICsgIj0iOwotICB2YXIgY2xlbiA9IGRjb29raWUubGVuZ3RoOwotICB2YXIgY2JlZ2luID0gMDsKLSAgd2hpbGUgKGNiZWdpbiA8IGNsZW4pIAotICB7Ci0gICAgdmFyIHZiZWdpbiA9IGNiZWdpbiArIGNuYW1lLmxlbmd0aDsKLSAgICBpZiAoZGNvb2tpZS5zdWJzdHJpbmcoY2JlZ2luLCB2YmVnaW4pID09IGNuYW1lKSAKLSAgICB7IAotICAgICAgdmFyIHZlbmQgPSBkY29va2llLmluZGV4T2YgKCI7IiwgdmJlZ2luKTsKLSAgICAgIGlmICh2ZW5kID09IC0xKSAKLSAgICAgIHsKLSAgICAgICAgdmVuZCA9IGNsZW47Ci0gICAgICB9Ci0gICAgICByZXR1cm4gdW5lc2NhcGUoZGNvb2tpZS5zdWJzdHJpbmcodmJlZ2luLCB2ZW5kKSk7Ci0gICAgfQotCi0gICAgY2JlZ2luID0gZGNvb2tpZS5pbmRleE9mKCIgIiwgY2JlZ2luKSArIDE7Ci0gICAgaWYgKGNiZWdpbiA9PSAwKSAKLSAgICB7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIG51bGw7Ci0gfQotCi1mdW5jdGlvbiBmaXhVcmwodXJsKQotewotCWlmICggdXJsID09IG51bGwgKQotCXsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JdmFyIGluZHggPSB1cmwuaW5kZXhPZigiZmlsZTovLy8iKTsKLQlpZiAoIGluZHggPj0wICkKLQl7Ci0JCXVybCA9IHVybC5zdWJzdHJpbmcoaW5keCs4LCB1cmwubGVuZ3RoKTsKLQl9Ci0JZWxzZQotCXsKLQkJaW5keCA9IHVybC5pbmRleE9mKCJmaWxlOi8vIik7Ci0JCWlmICggaW5keCA+PTAgKQotCQl7Ci0JCQl1cmwgPSB1cmwuc3Vic3RyaW5nKGluZHgrNywgdXJsLmxlbmd0aCk7Ci0JCX0KLQl9Ci0KLQl1cmwgPSB1cmwucmVwbGFjZSgvXFwvZywgIi8iKTsKLQotICAgcmV0dXJuIHVuZXNjYXBlKHVybCk7Ci19Ci0KLS8vIC0tPgotXV0+Ci08L3NjcmlwdD4KLTwvaGVhZD4KLTxzY3JpcHQgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPgotdmFyIGJhbm5lcmhlaWdodCA9IDIxICsgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBiYW5uZXJJbWFnZUhlaWdodCIvPjsKLTx4c2w6Y2hvb3NlPgotCTx4c2w6d2hlbiB0ZXN0PSJAdXNlQXBwbGV0PSd0cnVlJyI+Ci12YXIgdG9jX2ZyYW1lID0gIm9yeV90b2MiOwotdmFyIHRvY191cmwgPSAiYXBwbGV0L215cnVwdHJlZS5odG0iOwotdmFyIGRlZmF1bHRfcGFnZV91cmwgPSAic3BzY3JlZW4uaHRtIjsKLQk8L3hzbDp3aGVuPgotCTx4c2w6b3RoZXJ3aXNlPgotdmFyIHRvY19mcmFtZSA9ICJvcnlfdG9jX2ZyYW1lIjsKLXZhciB0b2NfdXJsID0gIm5vYXBwbGV0L1B1Ymxpc2hlZEJvb2ttYXJrcy5odG1sIjsKLXZhciBkZWZhdWx0X3BhZ2VfdXJsID0gZ2V0Q29va2llKCJydXBfb3J5X2RvYyIpOwotaWYgKCBkZWZhdWx0X3BhZ2VfdXJsID09IG51bGwgKQotewotCWRlZmF1bHRfcGFnZV91cmwgPSAiYWJvdXQ6YmxhbmsiOwotfQotCTwveHNsOm90aGVyd2lzZT4KLTwveHNsOmNob29zZT4KLTwhW0NEQVRBWwotICBpZigobmF2aWdhdG9yLmFwcE5hbWUgPT0gIk5ldHNjYXBlIiAmJiBwYXJzZUludChuYXZpZ2F0b3IuYXBwVmVyc2lvbikgPj0gNCApIHx8IAotICAgICAgKG5hdmlnYXRvci5hcHBOYW1lID09ICJNaWNyb3NvZnQgSW50ZXJuZXQgRXhwbG9yZXIiICYmIHBhcnNlSW50KG5hdmlnYXRvci5hcHBWZXJzaW9uKSA+PSA0ICkpCi0gIHsKLSAgICBkb2N1bWVudC53cml0ZSgiICA8ZnJhbWVzZXQgIGZyYW1lYm9yZGVyPVwiMFwiIGZyYW1lc3BhY2luZz1cIjFcIiBib3JkZXI9XCIxXCIgcm93cz1cIiIgKyBiYW5uZXJoZWlnaHQgKyAiLCpcIj5cbiIpOwotICAgIGRvY3VtZW50LndyaXRlKCIgICAgPGZyYW1lIHNyYz1cInRvcG5hdi5odG1cIiBub3Jlc2l6ZSBuYW1lPVwib3J5X2J1dHRvblwiIGZyYW1lYm9yZGVyPVwiMFwiIHNjcm9sbGluZz1cIm5vXCIgbWFyZ2luaGVpZ2h0PVwiMFwiIG1hcmdpbndpZHRoPVwiMFwiPlxuIik7Ci0gICAgZG9jdW1lbnQud3JpdGVsbigiPGZyYW1lc2V0IGNvbHM9XCIyMDUsKlwiIGZyYW1lYm9yZGVyPVwiMVwiIGZyYW1lc3BhY2luZz1cIjFcIiBib3JkZXI9XCIxXCIgPlxuIik7Ci0gICAgZG9jdW1lbnQud3JpdGUoIiAgICAgIDxmcmFtZSBzcmM9XCIiICsgdG9jX3VybCArICJcIiBuYW1lPVwiIiArIHRvY19mcmFtZSArICJcIiBmcmFtZWJvcmRlcj1cIjFcIiBzY3JvbGxpbmc9XCJub1wiPlxuIik7Ci0gICAgZG9jdW1lbnQud3JpdGVsbigiPGZyYW1lIG5hbWU9XCJvcnlfZG9jXCIgc3JjPVwiIiArIGRlZmF1bHRfcGFnZV91cmwgKyAiXCIgIGZyYW1lYm9yZGVyPVwiMFwiIHNjcm9sbGluZz1cInllc1wiPlxuIik7Ci0gICAgZG9jdW1lbnQud3JpdGVsbigiICAgPC9mcmFtZXNldD4iKTsKLSAgICBkb2N1bWVudC53cml0ZWxuKCIgICA8L2ZyYW1lc2V0PiIpOwotCi0gIH0KLSAgZWxzZQotICB7Ci0gICAgcGFyZW50LmxvY2F0aW9uID0gImFwcGxldC9icm93c2VyLmh0bSI7Ci0gIH0KLV1dPgotCi0gIDwvc2NyaXB0PgotCi08Ym9keT4KLTx0YWJsZSBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgd2lkdGg9IjEwMCUiPgotICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj4KLSAgICAgIDxici8+Ci0gICAgICA8YnIvPgotCTwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iMjQiPjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iMSUiPgotICAgICAgPHA+JiMxNjA7PC9wPgotICAgIDwvdGQ+Ci0gIDwvdHI+Ci08L3RhYmxlPgotCi0KLTwvYm9keT4KLQotPC9odG1sPgotCi0KLTwveHNsOnRlbXBsYXRlPgotPC94c2w6c3R5bGVzaGVldD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3hzbC9pbmRleF9jb250ZW50cy54c2wgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy94c2wvaW5kZXhfY29udGVudHMueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OGRkMGE4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3hzbC9pbmRleF9jb250ZW50cy54c2wKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci0KLTx4c2w6c3R5bGVzaGVldCB2ZXJzaW9uPSIxLjAiIHhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIj4KLQotPHhzbDpvdXRwdXQgbWV0aG9kPSJodG1sIiB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgCi0JZG9jdHlwZS1wdWJsaWM9Ii0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAKLQlkb2N0eXBlLXN5c3RlbT0iaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCIgCi0JaW5kZW50PSJ5ZXMiLz4KLQkKLTx4c2w6cGFyYW0gbmFtZT0idGl0bGUiLz4KLQotPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iSW5kZXgiPgotCQkKLTxodG1sPgotCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0ibGFuZyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBsYW5nIi8+PC94c2w6YXR0cmlidXRlPgotCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0ieG1sOmxhbmciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbGFuZyIvPjwveHNsOmF0dHJpYnV0ZT4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiLz4KLTxsaW5rIHJlbD0iU3R5bGVTaGVldCIgaHJlZj0iaW5kZXguY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTx0aXRsZT5JbmRleCAtIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdGl0bGUiLz48L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgYmdjb2xvcj0iI0ZGRkZGRiIgdGV4dD0iIzAwMDAwMCIgbGluaz0iIzAwNDA4MCIgdmxpbms9IiM4MDAwRkYiIGFsaW5rPSIjMDAwMEZGIj4KLTx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJpdGVtIj4KLTx4c2w6Y2hvb3NlPgotCTx4c2w6d2hlbiB0ZXN0PSJAbmF2aWdhdGlvbi1tYXJrPSd0cnVlJyAiPgotCTxQIENMQVNTPSJpbmRleGhlYWRpbmciPgotCTxhPjx4c2w6YXR0cmlidXRlIG5hbWU9Im5hbWUiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPjwveHNsOmF0dHJpYnV0ZT48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHByZXNlbnRhdGlvbk5hbWUiLz48L2E+Ci0gICA8L1A+Ci0JPC94c2w6d2hlbj4KLQk8eHNsOm90aGVyd2lzZT4KLQk8UCBDTEFTUz0iaW5kZXhsZXZlbDEiPgotCTxhPjx4c2w6YXR0cmlidXRlIG5hbWU9Im5hbWUiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPjwveHNsOmF0dHJpYnV0ZT48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHByZXNlbnRhdGlvbk5hbWUiLz48L2E+Ci0gICA8L1A+Ci0gICA8UCBDTEFTUz0iaW5kZXhsZXZlbDIiPiYjMTYwOyYjMTYwOyYjMTYwOyYjMTYwOyYjMTYwOyYjMTYwOwotICAgPGEgVEFSR0VUPSJvcnlfZG9jIj4KLSAgIDx4c2w6YXR0cmlidXRlIG5hbWU9ImhyZWYiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAdXJsIiAvPjwveHNsOmF0dHJpYnV0ZT4KLQk8eHNsOnZhbHVlLW9mIGRpc2FibGUtb3V0cHV0LWVzY2FwaW5nPSJ5ZXMiIHNlbGVjdD0iQGNvbnRlbnQiLz48L2E+PC9QPgotCTwveHNsOm90aGVyd2lzZT4KLTwveHNsOmNob29zZT4KLTwveHNsOmZvci1lYWNoPgotPC9ib2R5PgotPC9odG1sPgotCi08L3hzbDp0ZW1wbGF0ZT4KLQkKLTwveHNsOnN0eWxlc2hlZXQ+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy94c2wvaW5kZXhfbmF2aWcueHNsIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcveHNsL2luZGV4X25hdmlnLnhzbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmVkYTc0OS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy94c2wvaW5kZXhfbmF2aWcueHNsCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotCi08eHNsOnN0eWxlc2hlZXQgdmVyc2lvbj0iMS4wIiB4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSI+Ci0KLTx4c2w6b3V0cHV0IG1ldGhvZD0iaHRtbCIgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIAotCWRvY3R5cGUtcHVibGljPSItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgCi0JZG9jdHlwZS1zeXN0ZW09Imh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiIAotCWluZGVudD0ieWVzIi8+Ci0JCi08eHNsOnBhcmFtIG5hbWU9InRpdGxlIi8+Ci0KLTx4c2w6dGVtcGxhdGUgbWF0Y2g9IkluZGV4Ij4KLQotPGh0bWw+Ci0JCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJsYW5nIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGxhbmciLz48L3hzbDphdHRyaWJ1dGU+Ci0JCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJ4bWw6bGFuZyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBsYW5nIi8+PC94c2w6YXR0cmlidXRlPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIvPgotPHRpdGxlPkdsb3NzYXJ5IC0gPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR0aXRsZSIvPjwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSB0ZXh0PSIjMDAwMDAwIiBiZ2NvbG9yPSIjZmZmZmZmIj4KLTxmb250IGZhY2U9IkFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWYiPjx4c2w6dGV4dD4KLTwveHNsOnRleHQ+Ci08eHNsOmZvci1lYWNoIHNlbGVjdD0iaXRlbVtAbmF2aWdhdGlvbi1tYXJrPSd0cnVlJ10iPgotPGEgIHRhcmdldD0ia2V5d29yZF90Ij4KLTx4c2w6YXR0cmlidXRlIG5hbWU9ImhyZWYiPmNvbnRlbnRzLmh0bSM8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz48L3hzbDphdHRyaWJ1dGU+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBwcmVzZW50YXRpb25OYW1lIi8+PC9hPjx4c2w6dGV4dD4KLTwveHNsOnRleHQ+Ci08L3hzbDpmb3ItZWFjaD4KLTwvZm9udD4KLTwvYm9keT4KLTwvaHRtbD4KLQotPC94c2w6dGVtcGxhdGU+Ci0KLTwveHNsOnN0eWxlc2hlZXQ+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy94c2wvcmVzb3VyY2VzLnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy94c2wvcmVzb3VyY2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjNTE4YTguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcveHNsL3Jlc291cmNlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLSMgVGhlIFVJIHRleHQgaW4gdGhlIFhTTCBzdHlsZXNoZWV0cy4KLQotc2VsZWN0ZWRDb25maWd1cmF0aW9uVGV4dD1UaGUgU2VsZWN0ZWQgY29uZmlndXJhdGlvbiBpcyBwdWJsaXNoZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbgotZGV0YWlsSW5mb1RleHQ9RGV0YWlsIGluZm9ybWF0aW9uIGlzIGxvZ2dlZCBpbnRvIHRoZSBmb2xsb3dpbmcgZmlsZXMgaW4gdGhlIGxvZ3MgZm9sZGVyCi1zaG93RXJyb3JUZXh0PXNob3cgYW55IGVycm9yIG9jY3VycmVkIGR1cmluZyBwdWJsaXNoaW5nLgotbG9nc1dhcm5pbmdUZXh0PWxvZ3MgYWxsIHdhcm5pbmcgbWVzc2FnZXMgc3VjaCBhcyBtaXNzaW5nIHJlZmVyZW5jZXMsIGJyb2tlbiBsaW5rcywgYW5kIHVucHVibGlzaGVkIGNhdGVnb3JpZXMgd2l0aCBubyBjYXRlZ29yaXplZCBlbGVtZW50cy4KLXBhZ2VzTm90SW5zdGFsbGVkVGV4dD1JbiB0aGUgcGFnZXNfbm90X2luc3RhbGxlZCBmb2xkZXIsIHlvdSB3aWxsIGZpbmQgYWxsIG9mIHRoZSBtaXNzaW5nIHJlZmVyZW5jZXMgaW4gdGhpcyBjb25maWd1cmF0aW9uLgotaW52YWxpZEV4dGVybmFsVGV4dD1JbnZhbGlkIGV4dGVybmFsIGxpbmtzIGlkZW50aWZpZWQgaW4gdGhlIGNvbmZpZ3VyYXRpb24KLW93bmVyRWxlbWVudFRleHQ9T3duZXIgRWxlbWVudAotbm9uRXhpc3RpbmdUZXh0PVRoZSBvd25lciBlbGVtZW50cyByZWZlciB0byBub24tZXhpc3RpbmcgZWxlbWVudHMuIE1heWJlIHRoZSBlbGVtZW50cyB3ZXJlIGRlbGV0ZWQgZnJvbSB0aGUgbGlicmFyeSBhZnRlciB0aGUgZWxlbWVudCBsaW5rcyB3ZXJlIGNyZWF0ZWQuIFBsZWFzZSBmaW5kIHRoZSBvd25lciBlbGVtZW50cyBhbmQgZml4IHRoZXNlIGludmFsaWQgcmVmZXJlbmNlcy4KLW1pc3NpbmdSZWZlcmVuY2VzVGl0bGVUZXh0PU1pc3NpbmcgUmVmZXJlbmNlcwotbWlzc2luZ1JlZmVyZW5jZXNUZXh0PVRoZSBvd25lciBlbGVtZW50cyByZWZlciB0byAgbWlzc2luZyBlbGVtZW50cyAgaW4gdGhlIHNlbGVjdGVkIGNvbmZpZ3VyYXRpb24uIFBsZWFzZSBjaGVjayB0aGUgY29uZmlndXJhdGlvbiBjbG9zdXJlIGFuZCBmaXggdGhlIG1pc3NpbmcgcmVmZXJlbmNlcy4gICAgICAgICAgICAgICAgICAgCi1taXNzaW5nUmVzb3VyY2VGaWxlc1RpdGxlVGV4dD1NaXNzaW5nIFJlc291cmNlIEZpbGVzCi1taXNzaW5nUmVzb3VyY2VGaWxlc1RleHQ9VGhlIG93bmVyIGVsZW1lbnRzIHJlZmVyIHRvIG1pc3NpbmcgcmVzb3VyY2UgZmlsZXMuIFRob3NlIHJlc291cmNlIGZpbGVzIGFyZSByZWZlcmVuY2VkIGluIHRoZSBlbGVtZW50cycgY29udGVudCBvciBpbiB0aGUgYXNzb2NpYXRlZCBhdHRhY2htZW50cy4KLW1pc3NpbmdSZXNvdXJjZVRleHQ9TWlzc2luZyBSZXNvdXJjZQotb3duZXJSZXNvdXJjZVRleHQ9T3duZXIgUmVzb3VyY2UKLW1pc3NpbmdFbGVtZW50VGV4dD1NaXNzaW5nIEVsZW1lbnQKLWludmFsaWRFbGVtZW50VGV4dD1JbnZhbGlkIEVsZW1lbnQKLWludmFsaWRFbGVtZW50TGlua3NUZXh0PUludmFsaWQgRWxlbWVudCBMaW5rcwotcGxlYXNlQ2hlY2tUZXh0PVBsZWFzZSBjaGVjayB0aGUgY29uZmlndXJhdGlvbiBjbG9zdXJlIGFuZCBmaXggdGhlIG1pc3NpbmcgcmVmZXJlbmNlcy4KLXBsZWFzZUZpbmRUZXh0PVBsZWFzZSBmaW5kIHRoZSBvd25lciBlbGVtZW50cyBhbmQgZml4IHRoZXNlIGludmFsaWQgcmVmZXJlbmNlcy4KLWdsb3NzYXJ5VGV4dD1HbG9zc2FyeQotaW5kZXhUZXh0PUluZGV4Ci1mZWVkYmFja1RleHQ9RmVlZGJhY2sKLWFib3V0VGV4dD1BYm91dAotc2VhcmNoVGV4dD1TZWFyY2gKLXByaW50VGV4dD1QcmludAotc3VtbWFyeVRleHQ9U3VtbWFyeQotcHVibGlzaGluZ1JlcG9ydFRleHQ9UHVibGlzaGluZyBSZXBvcnQ6Ci13aGVyZUFtSVRleHQ9V2hlcmUgYW0gSQotdHJlZVNldHNUZXh0PVRyZWUgU2V0cwotCi1zZWFyY2hUaXRsZVRleHQ9UHJvY2VzcyBTZWFyY2gKLWxhYmVsMVRleHQ9Ci1sYWJlbDJUZXh0PQotbGFiZWwzVGV4dD0KLWxhYmxlNFRleHQ9Ci1zZWFyY2hCdXR0b25UZXh0PVNlYXJjaAotc2VhcmNoRXhwcmVzc2lvblRleHQ9KiA9IGFueSBzdHJpbmcsID8gPSBhbnkgY2hhcmFjdGVyLCAiIiA9IHBocmFzZSwgQU5ELCBPUiwgTk9UID0gYm9vbGVhbiBvcGVyYXRvcnMKLQotZGV0YWlsc1RleHQ9RGV0YWlscwotaW5mb1RleHQ9SW5mbwotbWVzc2dlVGV4dD1NZXNzYWdlCi1kZXNjcmlwdGlvblRleHQ9RGVzY3JpcHRpb24KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy94c2wvc2VhcmNoLnhzbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3hzbC9zZWFyY2gueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MjA2NTg3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3hzbC9zZWFyY2gueHNsCisrKyAvZGV2L251bGwKQEAgLTEsMTM0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLQotPHhzbDpzdHlsZXNoZWV0IHZlcnNpb249IjEuMCIgeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iIHhtbG5zOmZvPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9Gb3JtYXQiPgotCi08eHNsOm91dHB1dCBtZXRob2Q9Imh0bWwiIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiAKLQlkb2N0eXBlLXB1YmxpYz0iLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iIAotCWRvY3R5cGUtc3lzdGVtPSJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIiAKLQlpbmRlbnQ9InllcyIvPgotCQotPHhzbDpwYXJhbSBuYW1lPSJzZWFyY2hUaXRsZVRleHQiLz4KLTx4c2w6cGFyYW0gbmFtZT0ibGFiZWwxVGV4dCIvPgotPHhzbDpwYXJhbSBuYW1lPSJsYWJlbDJUZXh0Ii8+Ci08eHNsOnBhcmFtIG5hbWU9ImxhYmVsM1RleHQiLz4KLTx4c2w6cGFyYW0gbmFtZT0ibGFibGU0VGV4dCIvPgotPHhzbDpwYXJhbSBuYW1lPSJzZWFyY2hCdXR0b25UZXh0Ii8+Ci0KLTx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii9TZWFyY2giPgotCTx4c2w6dmFyaWFibGUgbmFtZT0id2ViQXBwTmFtZSI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkB3ZWJBcHBOYW1lIi8+PC94c2w6dmFyaWFibGU+Ci0JPGh0bWw+Ci0JCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJsYW5nIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGxhbmciLz48L3hzbDphdHRyaWJ1dGU+Ci0JCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJ4bWw6bGFuZyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBsYW5nIi8+PC94c2w6YXR0cmlidXRlPgotCQk8aGVhZD4KLQkJPHRpdGxlPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkc2VhcmNoVGl0bGVUZXh0Ii8+PC90aXRsZT4KLQkJPGxpbmsgcmVsPSJTdHlsZVNoZWV0IiBocmVmPSIuLy4uL2Nzcy9kZWZhdWx0LmNzcyIgdHlwZT0idGV4dC9jc3MiLz4KLQkJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij4KLQkJPCFbQ0RBVEFbCi0JCQotCQkJLy8gc2hvdWxkIG5vdCBoYXJkIGNvZGUgdGhlIHdlYiBhcHAgbmFtZSBoZXJlLCB1c2VyIGNhbiBjaGFuZ2UgdGhlIGFwcCBuYW1lCi0JCQkvL3ZhciB3ZWJBcHBOYW1lPSAnPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR3ZWJBcHBOYW1lIi8+JzsKLQkJCQotCQkJLy8gdGhlIG9wZW5lbnIgaXMgdGhlIHRvcG5hdgotCQkJLy8gdGhpcyBtZXRob2QgaXMgZGVmaW5lZCBpbiB0b3BuYXYuanMKLQkJCXZhciBiYXNlVXJsID0gd2luZG93Lm9wZW5lci5nZXRCYXNlVXJsKCk7Ci0KLQkJCWZ1bmN0aW9uIGNyZWF0ZVJlcXVlc3QoKSB7Ci0gICAgIAkJCXRyeSB7Ci0gICAgICAgCQkJCXJlcXVlc3QgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTsKLSAgICAJIAkJfSBjYXRjaCAodHJ5TXMpIHsKLQkgICAgICAgCQkJdHJ5IHsKLSAgICAgICAgIAkJCQlyZXF1ZXN0ID0gbmV3IEFjdGl2ZVhPYmplY3QoIk1zeG1sMi5YTUxIVFRQIik7Ci0gICAgICAJCQkJfSBjYXRjaCAob3RoZXJNcykgewotICAgICAgICAJIAkJCXRyeSB7Ci0gICAgCSAgICAgICAJCQkJcmVxdWVzdCA9IG5ldyBBY3RpdmVYT2JqZWN0KCJNaWNyb3NvZnQuWE1MSFRUUCIpOwotCSAgICAgICAgIAkJCX0gY2F0Y2ggKGZhaWxlZCkgewotICAgICAgICAgICAJCQkJCXJlcXVlc3QgPSBudWxsOwotICAgICAgICAgCQkJCX0KLSAgICAgICAJCQkJfQotICAgICAJCQl9Ci0JCQl9Ci0KLQkJICAgCWZ1bmN0aW9uIGRvU2VhcmNoKCkgewotCQkgICAJCXZhciBzZWFyY2hTdHJpbmcgPSBkb2N1bWVudC5zZWFyY2hGb3JtLnNlYXJjaElucHV0LnZhbHVlOwotCQkgICAJCXZhciByZXN1bHRzUGVyUGFnZSA9IGRvY3VtZW50LnNlYXJjaEZvcm0uc2VhcmNoU2NvcGVTaXplUGVyUGFnZS52YWx1ZTsKLQkJICAgCQl2YXIgdXJsID0gYmFzZVVybCArICJcL1NlYXJjaFNlcnZsZXQ/c2VhcmNoU3RyaW5nPSIgKyBlbmNvZGVVUklDb21wb25lbnQoc2VhcmNoU3RyaW5nKSArICImaGl0c1BlclBhZ2U9IiArIHJlc3VsdHNQZXJQYWdlOwotICAgICAJCQljcmVhdGVSZXF1ZXN0KCk7Ci0gICAgIAkJCXJlcXVlc3Qub3BlbigiR0VUIiwgbWFrZVVuaXF1ZSh1cmwpLCB0cnVlKTsKLSAgICAgCQkJcmVxdWVzdC5vbnJlYWR5c3RhdGVjaGFuZ2UgPSB1cGRhdGVQYWdlOwotICAgICAJCQlyZXF1ZXN0LnNlbmQobnVsbCk7ICAgIAkJCSAgIAkJCSAgIAotICAJCQl9Ci0KLQkJCWZ1bmN0aW9uIHVwZGF0ZVBhZ2UoKSB7Ci0gICAgCQkJaWYgKHJlcXVlc3QucmVhZHlTdGF0ZSA9PSA0KSB7Ci0gICAgCQkJCXZhciByRGl2ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImNvbnRhaW5lciIpOwotCQkJCQlpZiAockRpdiAhPSBudWxsKSAKLQkJCQkJCXJEaXYucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChyRGl2KTsKLSAgICAgIAkJCQlyRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Ci0gICAgICAJCQkJckRpdi5zZXRBdHRyaWJ1dGUoImlkIiwgImNvbnRhaW5lciIpOwotCQkJCQlyRGl2LmlubmVySFRNTCA9IHJlcXVlc3QucmVzcG9uc2VUZXh0OwotCQkJCQl2YXIgcmVzdWx0c0NvbnRhaW5lciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJyZXN1bHRzIik7Ci0JCQkJCXJlc3VsdHNDb250YWluZXIuYXBwZW5kQ2hpbGQockRpdik7Ci0gICAgCQkJfSAgICAJCQkKLSAgCQkJfQotICAJCQkKLSAgCQkJZnVuY3Rpb24gZ2V0UHJldk5leHRQYWdlKHVybCkgewkJCQkKLQkJCQljcmVhdGVSZXF1ZXN0KCk7Ci0KLSAgICAgCQkJcmVxdWVzdC5vcGVuKCJHRVQiLCBtYWtlVW5pcXVlKHVybCksIHRydWUpOwotICAgICAJCQlyZXF1ZXN0Lm9ucmVhZHlzdGF0ZWNoYW5nZSA9IHVwZGF0ZVBhZ2U7Ci0gICAgIAkJCXJlcXVlc3Quc2VuZChudWxsKTsJCQkJCi0JCQl9Ci0JCQkKLQkJCWZ1bmN0aW9uIG1ha2VVbmlxdWUodXJsKSB7Ci0JCQkJLy8gbm90ZSBzb21lIGJyb3dzZXIgc3VjaCBhcyBJRSB3aWxsIHRyeSB0byBkZXRlcm1pbmUgaWYgdGhlIGNhY2hlZCBwYWdlIGlzIHVwIHRvIGRhdGUgb3Igbm90LAotCQkJCS8vIGFuZCBtYXkgbm90IGlzc3VlIGEgcmVxdWVzdCBmb3IgdGhlIHNhbWUgdXJsCi0JCQkJLy8gZm9yIGV4YW1wbGUsIGlmIHlvdSB1c2UgdGhlIHNhbWUgdXJsIHRvIGdldCBuZXh0IG9yIHByZXZpb3VzIHBhZ2UsIAotCQkJCS8vIHRoZSBzdWJzZXF1ZW50IGNhbGxzIGZvciBuZXh0IG9yIHByZXZpb3VzIHdpbGwgbm90IGJlIGV4ZWN1dGVkLgotCQkJCS8vIHlvdSBuZWVkIHRvIHNldCB0aGUgTGFzdCBNb2RpZmllZCBoZWFkZXIgdG8gbWFrZSBzdXJlIHRoZSBjb250ZW50IGlzIGxvYWRlZC4KLQkJCQkvLyB0byBhdm9pZCB0aGlzIHByb2JsZW0sIHdlIGFsbHdheXMgaXNzdWUgYSBkaWZmZXJlbnQgdXJsIGJ5IGFwcGVuZGluZyB0aGUgcmVxdWVzdCB0aW1lCi0JCQkJCi0JCQkJdmFyIHQgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTsKLQkJCQl1cmwgPSB1cmwgKyAiJnRpbWVSZXF1ZXN0ZWQ9IiArIHQ7Ci0KLQkJCQlyZXR1cm4gdXJsOwotCQkJfQotCQkJCV1dPgotCQk8L3NjcmlwdD4KLQkJPC9oZWFkPgotCQk8Ym9keSBiZ2NvbG9yPSIjRkZGRkZGIj4KLQkJCTxmb3JtIGlkPSJzZWFyY2hGb3JtIiBuYW1lPSJzZWFyY2hGb3JtIiBhY3Rpb249ImphdmFzY3JpcHQ6ZG9TZWFyY2goKTsiID4KLQkJCQk8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIGFsaWduPSJsZWZ0Ij4KLQkJCQkJPHRyPgotCQkJCQkJPHRkPgotCQkJCQkJCTxpbnB1dCB1Y2ZpcnN0PSJmYWxzZSIgdHJpbT0idHJ1ZSIgdmFsdWU9IiIgbmFtZT0ic2VhcmNoU3RyaW5nIiB0eXBlPSJ0ZXh0IiBpZD0ic2VhcmNoSW5wdXQiLz4KLQkJCQkJCTwvdGQ+Ci0JCQkJCQk8dGQ+Ci0JCQkJCQkJPGlucHV0IHZhbHVlPSJTZWFyY2giIGNhcHRpb249IiIgc3R5bGU9InZlcnRpY2FsLWFsaWduOm1pZGRsZSIgaWQ9InNlYXJjaEJ1dHRvbiIgdHlwZT0iYnV0dG9uIiAgb25DbGljaz0iZG9TZWFyY2goKTsgcmV0dXJuIGZhbHNlOyIvPgotCQkJCQkJPC90ZD4KLQkJCQkJCTx0ZD4KLQkJCQkJCQk8c2VsZWN0IG5hbWU9InNlYXJjaFNjb3BlU2l6ZVBlclBhZ2UiIGlkPSJzZWFyY2hTY29wZVNpemVQZXJQYWdlIiBvbkNoYW5nZT0iZG9TZWFyY2goKTsgcmV0dXJuIGZhbHNlOyI+Ci0JCQkJCQkJCTxvcHRpb24gc2VsZWN0ZWQ9InNlbGVjdGVkIiB2YWx1ZT0iMTAiPjEwPC9vcHRpb24+Ci0JCQkJCQkJCTxvcHRpb24gdmFsdWU9IjIwIj4yMDwvb3B0aW9uPgotCQkJCQkJCQk8b3B0aW9uIHZhbHVlPSI1MCI+NTA8L29wdGlvbj4KLQkJCQkJCQkJPG9wdGlvbiB2YWx1ZT0iMTAwIj4xMDA8L29wdGlvbj4KLQkJCQkJCQkJPG9wdGlvbiB2YWx1ZT0iMjAwIj4yMDA8L29wdGlvbj4KLQkJCQkJCQk8L3NlbGVjdD4KLQkJCQkJCTwvdGQ+Ci0JCQkJCTwvdHI+Ci0JCQkJPC90YWJsZT4KLQkJCTwvZm9ybT4KLQkJCTxici8+PGJyLz4KLQkJCTxkaXYgaWQ9InJlc3VsdHMiPjwvZGl2PgkJCQotCQk8L2JvZHk+Ci0JPC9odG1sPgotPC94c2w6dGVtcGxhdGU+Ci08L3hzbDpzdHlsZXNoZWV0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3hzbC90b3BuYXYueHNsIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcveHNsL3RvcG5hdi54c2wKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxYzIxMWYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcveHNsL3RvcG5hdi54c2wKKysrIC9kZXYvbnVsbApAQCAtMSwxNzIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotCi08eHNsOnN0eWxlc2hlZXQgdmVyc2lvbj0iMS4wIiB4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIgeG1sbnM6Zm89Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML0Zvcm1hdCI+Ci0KLTx4c2w6b3V0cHV0IG1ldGhvZD0iaHRtbCIgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIAotCWRvY3R5cGUtcHVibGljPSItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgCi0JZG9jdHlwZS1zeXN0ZW09Imh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiIAotCWluZGVudD0ieWVzIi8+Ci0JCi08eHNsOnBhcmFtIG5hbWU9Imdsb3NzYXJ5VGV4dCIvPgotPHhzbDpwYXJhbSBuYW1lPSJpbmRleFRleHQiLz4KLTx4c2w6cGFyYW0gbmFtZT0iZmVlZGJhY2tUZXh0Ii8+Ci08eHNsOnBhcmFtIG5hbWU9ImFib3V0VGV4dCIvPgotPHhzbDpwYXJhbSBuYW1lPSJzZWFyY2hUZXh0Ii8+Ci08eHNsOnBhcmFtIG5hbWU9InByaW50VGV4dCIvPgotCi0KLTx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii9QdWJsaXNoaW5nT3B0aW9uIj4KLQotPHhzbDp2YXJpYWJsZSBuYW1lPSJ0aXRsZSI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkB0aXRsZSIvPjwveHNsOnZhcmlhYmxlPgotPHhzbDp2YXJpYWJsZSBuYW1lPSJiYW5uZXJJbWFnZSI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBiYW5uZXJJbWFnZSIvPjwveHNsOnZhcmlhYmxlPgotPHhzbDp2YXJpYWJsZSBuYW1lPSJiYW5uZXJJbWFnZUhlaWdodCI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBiYW5uZXJJbWFnZUhlaWdodCIvPjwveHNsOnZhcmlhYmxlPgotPHhzbDp2YXJpYWJsZSBuYW1lPSJhbGxvd0FwcGxldFNlYXJjaCI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBhbGxvd0FwcGxldFNlYXJjaCIvPjwveHNsOnZhcmlhYmxlPgotPHhzbDp2YXJpYWJsZSBuYW1lPSJzaG93R2xvc3NhcnkiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAc2hvd0dsb3NzYXJ5Ii8+PC94c2w6dmFyaWFibGU+Ci08eHNsOnZhcmlhYmxlIG5hbWU9InNob3dJbmRleCI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBzaG93SW5kZXgiLz48L3hzbDp2YXJpYWJsZT4KLTx4c2w6dmFyaWFibGUgbmFtZT0iZmVlZGJhY2tVcmwiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAZmVlZGJhY2tVcmwiLz48L3hzbDp2YXJpYWJsZT4KLTx4c2w6dmFyaWFibGUgbmFtZT0ic2VydmVyU2lkZVNlYXJjaCI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBzZXJ2ZXJTaWRlU2VhcmNoIi8+PC94c2w6dmFyaWFibGU+Ci0KLTxodG1sPgotCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0ibGFuZyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBsYW5nIi8+PC94c2w6YXR0cmlidXRlPgotCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0ieG1sOmxhbmciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbGFuZyIvPjwveHNsOmF0dHJpYnV0ZT4KLTxoZWFkPgotPHRpdGxlPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdGl0bGUiLz48L3RpdGxlPgotCi08c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0IiBzcmM9InNjcmlwdHMvY29tbW9uLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPjwvc2NyaXB0PgotPHNjcmlwdCBsYW5ndWFnZT0iSmF2YVNjcmlwdCIgc3JjPSJzY3JpcHRzL3NjcmlwdHMuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCI+PC9zY3JpcHQ+Ci08c2NyaXB0IGxhbmd1YWdlPSJKYXZhU2NyaXB0IiBzcmM9InNjcmlwdHMvdG9wbmF2LmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPjwvc2NyaXB0PgotPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij4KLXZhciBmZWVkYmFja191cmw9ICc8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGZlZWRiYWNrVXJsIi8+JzsKLTwvc2NyaXB0PgotPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KLQotLmJhbm5lciB7Ci0JYmFja2dyb3VuZC1jb2xvcjogIzk5OTk5OTsKLQliYWNrZ3JvdW5kLWltYWdlOiB1cmwoJ2ltYWdlcy88eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGJhbm5lckltYWdlIi8+Jyk7Ci0JYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDsKLQl3aWR0aDogMTAwJTsKLQloZWlnaHQ6IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkYmFubmVySW1hZ2VIZWlnaHQiLz5weDsKLX0KLS50b3BiYXJkaXZpZGVyIHsgCi0JIGJhY2tncm91bmQtY29sb3I6ICNkMGQwZDAgCi0gfQotPC9zdHlsZT4KLQotPC9oZWFkPgotCi08Ym9keSBtYXJnaW5oZWlnaHQ9IjAiIG1hcmdpbndpZHRoPSIwIj4KLQotIDxmb3JtIGFjdGlvbj0iIyIgbmFtZT0iZm9ybVRvcGZyYW1lIj4KLSAgPHRhYmxlIGNsYXNzPSJiYW5uZXIiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiA+Ci0gICAgPHRyPgotCSAgPHRkPgotICAgICAgIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgYWxpZ249InJpZ2h0IiBzdW1tYXJ5PSIiPgotICAgICAgICAgIDx0cj4KLQkJCSAgPHhzbDppZiB0ZXN0PSIkc2hvd0dsb3NzYXJ5PSd0cnVlJyAiPgotICAgCQkJPHRkPjxhIGhyZWY9IkphdmFTY3JpcHQ6b3Blbkdsb3NzYXJ5KCk7IiBjbGFzcz0idG9wcmlnaHRuYXYiPjxpbWcgc3JjPSIuL2ltYWdlcy9uaV9nbG9zc2FyeS5naWYiIHdpZHRoPSIxOCIgaGVpZ2h0PSIxMCIgYm9yZGVyPSIwIiBhbHQ9InskZ2xvc3NhcnlUZXh0fSIgdGl0bGU9InskZ2xvc3NhcnlUZXh0fSIgLz48L2E+PC90ZD4KLQkJCTx0ZCBub3dyYXA9Im5vd3JhcCI+PGEgaHJlZj0iSmF2YVNjcmlwdDpvcGVuR2xvc3NhcnkoKTsiIGNsYXNzPSJ0b3ByaWdodG5hdiI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRnbG9zc2FyeVRleHQiLz48L2E+PC90ZD4KLSAgICAgICAgICAgIDx0ZD48aW1nIHNyYz0iLi9pbWFnZXMvc2hpbS5naWYiIHdpZHRoPSI1IiBoZWlnaHQ9IjExIiBhbHQ9IiIgdGl0bGU9IiIgLz48L3RkPgotICAgICAgICAgICAgPHRkIGNsYXNzPSJ0b3BiYXJkaXZpZGVyIj48aW1nIHNyYz0iLi9pbWFnZXMvc2hpbS5naWYiIHdpZHRoPSIxIiBoZWlnaHQ9IjExIiBhbHQ9IiIgdGl0bGU9IiIgLz48L3RkPgotICAgICAgICAgICAgPHRkPjxpbWcgc3JjPSIuL2ltYWdlcy9zaGltLmdpZiIgd2lkdGg9IjUiIGhlaWdodD0iMTEiIGFsdD0iIiB0aXRsZT0iIiAvPjwvdGQ+ICAgICAgICAgICAgICAgICAgCi0JCQk8L3hzbDppZj4KLQkJCTx4c2w6aWYgdGVzdD0iJHNob3dJbmRleD0ndHJ1ZScgIj4KLSAgCQkJPHRkPjxhIGhyZWY9ImphdmFzY3JpcHQ6b3BlbkluZGV4KCk7IiBjbGFzcz0idG9wcmlnaHRuYXYiPgotCQkJPGltZyBzcmM9Ii4vaW1hZ2VzL25pX2luZGV4LmdpZiIgd2lkdGg9IjE3IiBoZWlnaHQ9IjkiIGJvcmRlcj0iMCIgYWx0PSJ7JGluZGV4VGV4dH0iIHRpdGxlPSJ7JGluZGV4VGV4dH0iIC8+PC9hPjwvdGQ+Ci0gICAgICAgICAgICA8dGQgbm93cmFwPSJub3dyYXAiPjxhIGhyZWY9ImphdmFzY3JpcHQ6b3BlbkluZGV4KCk7IiBjbGFzcz0idG9wcmlnaHRuYXYiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkaW5kZXhUZXh0Ii8+PC9hPjwvdGQ+Ci0gICAgICAgICAgICA8dGQ+PGltZyBzcmM9Ii4vaW1hZ2VzL3NoaW0uZ2lmIiB3aWR0aD0iNSIgaGVpZ2h0PSIxMSIgYWx0PSIiIHRpdGxlPSIiLz48L3RkPgotICAgICAgICAgICAgPHRkIGNsYXNzPSJ0b3BiYXJkaXZpZGVyIj48aW1nIHNyYz0iLi9pbWFnZXMvc2hpbS5naWYiIHdpZHRoPSIxIiBoZWlnaHQ9IjExIiBhbHQ9IiIgdGl0bGU9IiIvPjwvdGQ+Ci0gICAgICAgICAgICA8dGQ+PGltZyBzcmM9Ii4vaW1hZ2VzL3NoaW0uZ2lmIiB3aWR0aD0iNSIgaGVpZ2h0PSIxMSIgYWx0PSIiIHRpdGxlPSIiLz48L3RkPgotICAgICAgICAgIDwveHNsOmlmPgotCi0JCQk8dGQ+PGEgaHJlZj0iSmF2YVNjcmlwdDpzZW5kRmVlZGJhY2soZmVlZGJhY2tfdXJsKTsiIGNsYXNzPSJ0b3ByaWdodG5hdiI+Ci0JCQk8aW1nIHNyYz0iLi9pbWFnZXMvbmlfZmVlZGJhY2suZ2lmIiB3aWR0aD0iMTgiIGhlaWdodD0iMTAiIGJvcmRlcj0iMCIgYWx0PSJ7JGZlZWRiYWNrVGV4dH0iIHRpdGxlPSJ7JGZlZWRiYWNrVGV4dH0iLz48L2E+PC90ZD4KLSAgICAgICAgICAgIDx0ZCBub3dyYXA9Im5vd3JhcCI+Ci0JCQkJPGEgaHJlZj0iSmF2YVNjcmlwdDpzZW5kRmVlZGJhY2soZmVlZGJhY2tfdXJsKTsiIGNsYXNzPSJ0b3ByaWdodG5hdiI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRmZWVkYmFja1RleHQiLz48L2E+PC90ZD4KLSAgICAgICAgICAgIAotICAgICAgICAgICAgPHRkPjxpbWcgc3JjPSIuL2ltYWdlcy9zaGltLmdpZiIgd2lkdGg9IjUiIGhlaWdodD0iMTEiIGFsdD0iIiB0aXRsZT0iIi8+PC90ZD4KLSAgICAgICAgICAgIDx0ZCBjbGFzcz0idG9wYmFyZGl2aWRlciI+PGltZyBzcmM9Ii4vaW1hZ2VzL3NoaW0uZ2lmIiB3aWR0aD0iMSIgaGVpZ2h0PSIxMSIgYWx0PSIiIHRpdGxlPSIiLz48L3RkPgotICAgICAgICAgICAgPHRkPjxpbWcgc3JjPSIuL2ltYWdlcy9zaGltLmdpZiIgd2lkdGg9IjUiIGhlaWdodD0iMTEiIGFsdD0iIiB0aXRsZT0iIi8+PC90ZD4KLQkJCTx0ZD48YSBocmVmPSJqYXZhc2NyaXB0OnZvaWQobnVsbCkiIGNsYXNzPSJ0b3ByaWdodG5hdiIgb25jbGljaz0iamF2YXNjcmlwdDp3aW5kb3cub3BlbignYWJvdXQuaHRtJywnYWJvdXQnLCdoZWlnaHQ9MjUwLHdpZHRoPTI1MCxzdGF0dXM9bm8scmVzaXphYmxlPXllcycpOyI+Ci0gICAgICAgICAgICAgIDxpbWcgc3JjPSIuL2ltYWdlcy9uaV9hYm91dC5naWYiIHdpZHRoPSIxMCIgaGVpZ2h0PSIxMCIgYm9yZGVyPSIwIiBhbHQ9InskYWJvdXRUZXh0fSIgdGl0bGU9InskYWJvdXRUZXh0fSIvPjwvYT48L3RkPgotICAgICAgICAgICAgPHRkIG5vd3JhcD0ibm93cmFwIj48YSBocmVmPSJqYXZhc2NyaXB0OnZvaWQobnVsbCkiIGNsYXNzPSJ0b3ByaWdodG5hdiIgb25jbGljaz0iamF2YXNjcmlwdDp3aW5kb3cub3BlbignYWJvdXQuaHRtJywnYWJvdXQnLCdoZWlnaHQ9MjUwLHdpZHRoPTI1MCxzdGF0dXM9bm8scmVzaXphYmxlPXllcycpOyI+JiMxNjA7PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRhYm91dFRleHQiLz48L2E+PC90ZD4KLSAgICAgICAgICAgIDx0ZD48aW1nIHNyYz0iLi9pbWFnZXMvc2hpbS5naWYiIHdpZHRoPSI1IiBoZWlnaHQ9IjExIiBhbHQ9IiIgdGl0bGU9IiIvPjwvdGQ+Ci0gICAgICAgICAgPC90cj4KLSAgICAgICAgPC90YWJsZT4gCi0gICAgICA8L3RkPgotICAgIDwvdHI+Ci0gIDwvdGFibGU+Ci0gIAotICA8IS0tIHRvb2xiYXIgZ29lcyBoZXJlIC0tPgotPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci0gICAgPHRyPgotICAgICAgPHRkIGNsYXNzPSJ0b3BmcmFtZWJnIiA+Ci0JICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIGFsaWduPSJyaWdodCIgIHN1bW1hcnk9IiI+Ci0gICAgICAgICAgPHRyPgotICAgICAgICAgICAgPHRkPjxpbWcgc3JjPSIuL2ltYWdlcy9zaGltLmdpZiIgd2lkdGg9IjUiIGhlaWdodD0iMjAiIGFsdD0iaW1hZ2UiIHRpdGxlPSJpbWFnZSIvPjwvdGQ+Ci0JCQk8dGQ+Ci0gICAgICAgICAgICA8Zm9udCBzaXplPSIxIj4KLQkJCTwvZm9udD4KLSAgICAgICAgICAgIDwvdGQ+Ci0gPHhzbDppZiB0ZXN0PSIkYWxsb3dBcHBsZXRTZWFyY2g9J3RydWUnICI+Ci0JCQk8dGQ+JiMxNjA7PC90ZD4KLSAgICAgICAgICAgIDx0ZCBub3dyYXA9Im5vd3JhcCIgY2xhc3M9ImhlYWRlcm1lZGxpc3QiPiYjMTYwOzwvdGQ+Ci0JCQk8dGQ+PGltZyBzcmM9Ii4vaW1hZ2VzL3NoaW0uZ2lmIiB3aWR0aD0iNSIgaGVpZ2h0PSIyMCIgYWx0PSJpbWFnZSIgdGl0bGU9ImltYWdlIi8+PC90ZD4KLSAgICAgICAgICAgIDx0ZCBub3dyYXA9Im5vd3JhcCIgY2xhc3M9ImhlYWRlcm1lZGxpc3QiPiYjMTYwOzwvdGQ+Ci0JCQk8dGQ+PGltZyBzcmM9Ii4vaW1hZ2VzL3NoaW0uZ2lmIiB3aWR0aD0iMTAiIGhlaWdodD0iOCIgYWx0PSIiIHRpdGxlPSIiLz48L3RkPgotICAgICAgICAgICAgPHRkIGNsYXNzPSJ0b3BmcmFtZXNoYWRvdyI+PGltZyBzcmM9Ii4vaW1hZ2VzL3NoaW0uZ2lmIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiBhbHQ9IiIgdGl0bGU9IiIvPjwvdGQ+Ci0gICAgICAgICAgICA8dGQgY2xhc3M9InRvcGZyYW1laGlnaGxpZ2h0MiI+PGltZyBzcmM9Ii4vaW1hZ2VzL3NoaW0uZ2lmIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiBhbHQ9IiIgdGl0bGU9IiIvPjwvdGQ+Ci0gICAgICAgICAgICA8dGQ+PGltZyBzcmM9Ii4vaW1hZ2VzL3NoaW0uZ2lmIiB3aWR0aD0iMTAiIGhlaWdodD0iMSIgYWx0PSIiIHRpdGxlPSIiLz48L3RkPgotCQkgICAgPHRkPjxhIGhyZWY9IkphdmFTY3JpcHQ6b3BlblNlYXJjaCgpOyIgY2xhc3M9InRvcHJpZ2h0bmF2Ij48aW1nIHNyYz0iLi9pbWFnZXMvbmlfc2VhcmNoLmdpZiIgd2lkdGg9IjE3IiBoZWlnaHQ9IjE3IiBib3JkZXI9IjAiIGFsdD0ieyRzZWFyY2hUZXh0fSIgdGl0bGU9Inskc2VhcmNoVGV4dH0iLz48L2E+PC90ZD4KLSAgICAgICAgICAgIDx0ZCBub3dyYXA9Im5vd3JhcCI+PGEgaHJlZj0iSmF2YVNjcmlwdDpvcGVuU2VhcmNoKCk7IiAgY2xhc3M9InRvcHJpZ2h0bmF2Z3JleSI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRzZWFyY2hUZXh0Ii8+PC9hPjwvdGQ+Ci0gICAgICAgICAgICA8dGQ+PGltZyBzcmM9Ii4vaW1hZ2VzL3NoaW0uZ2lmIiB3aWR0aD0iNSIgaGVpZ2h0PSIxMSIgYWx0PSIiIHRpdGxlPSIiLz48L3RkPgotICAgICAgICAgICAgPHRkPjxpbWcgc3JjPSIuL2ltYWdlcy9zaGltLmdpZiIgd2lkdGg9IjEwIiBoZWlnaHQ9IjEiIGFsdD0iIiB0aXRsZT0iIi8+PC90ZD4KLSAgIDwveHNsOmlmPgotICAgIDx4c2w6aWYgdGVzdD0iJHNlcnZlclNpZGVTZWFyY2g9J3RydWUnICI+Ci0JCQk8dGQ+JiMxNjA7PC90ZD4KLSAgICAgICAgICAgIDx0ZCBub3dyYXA9Im5vd3JhcCIgY2xhc3M9ImhlYWRlcm1lZGxpc3QiPiYjMTYwOzwvdGQ+Ci0JCQk8dGQ+PGltZyBzcmM9Ii4vaW1hZ2VzL3NoaW0uZ2lmIiB3aWR0aD0iNSIgaGVpZ2h0PSIyMCIgYWx0PSJpbWFnZSIgdGl0bGU9ImltYWdlIi8+PC90ZD4KLSAgICAgICAgICAgIDx0ZCBub3dyYXA9Im5vd3JhcCIgY2xhc3M9ImhlYWRlcm1lZGxpc3QiPiYjMTYwOzwvdGQ+Ci0JCQk8dGQ+PGltZyBzcmM9Ii4vaW1hZ2VzL3NoaW0uZ2lmIiB3aWR0aD0iMTAiIGhlaWdodD0iOCIgYWx0PSIiIHRpdGxlPSIiLz48L3RkPgotICAgICAgICAgICAgPHRkIGNsYXNzPSJ0b3BmcmFtZXNoYWRvdyI+PGltZyBzcmM9Ii4vaW1hZ2VzL3NoaW0uZ2lmIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiBhbHQ9IiIgdGl0bGU9IiIvPjwvdGQ+Ci0gICAgICAgICAgICA8dGQgY2xhc3M9InRvcGZyYW1laGlnaGxpZ2h0MiI+PGltZyBzcmM9Ii4vaW1hZ2VzL3NoaW0uZ2lmIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiBhbHQ9IiIgdGl0bGU9IiIvPjwvdGQ+Ci0gICAgICAgICAgICA8dGQ+PGltZyBzcmM9Ii4vaW1hZ2VzL3NoaW0uZ2lmIiB3aWR0aD0iMTAiIGhlaWdodD0iMSIgYWx0PSIiIHRpdGxlPSIiLz48L3RkPgotCQkgICAgPHRkPjxhIGhyZWY9IkphdmFTY3JpcHQ6b3BlblByb2Nlc3NTZWFyY2goKTsiIGNsYXNzPSJ0b3ByaWdodG5hdiI+PGltZyBzcmM9Ii4vaW1hZ2VzL25pX3NlYXJjaC5naWYiIHdpZHRoPSIxNyIgaGVpZ2h0PSIxNyIgYm9yZGVyPSIwIiBhbHQ9Inskc2VhcmNoVGV4dH0iIHRpdGxlPSJ7JHNlYXJjaFRleHR9Ii8+PC9hPjwvdGQ+Ci0gICAgICAgICAgICA8dGQgbm93cmFwPSJub3dyYXAiPjxhIGhyZWY9IkphdmFTY3JpcHQ6b3BlblByb2Nlc3NTZWFyY2goKTsiICBjbGFzcz0idG9wcmlnaHRuYXZncmV5Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHNlYXJjaFRleHQiLz48L2E+PC90ZD4KLSAgICAgICAgICAgIDx0ZD48aW1nIHNyYz0iLi9pbWFnZXMvc2hpbS5naWYiIHdpZHRoPSI1IiBoZWlnaHQ9IjExIiBhbHQ9IiIgdGl0bGU9IiIvPjwvdGQ+Ci0gICAgICAgICAgICA8dGQ+PGltZyBzcmM9Ii4vaW1hZ2VzL3NoaW0uZ2lmIiB3aWR0aD0iMTAiIGhlaWdodD0iMSIgYWx0PSIiIHRpdGxlPSIiLz48L3RkPgotICAgPC94c2w6aWY+Ci0gICAgICAgICAgICA8dGQgY2xhc3M9InRvcGZyYW1lc2hhZG93Ij48aW1nIHNyYz0iLi9pbWFnZXMvc2hpbS5naWYiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIGFsdD0iIiB0aXRsZT0iIi8+PC90ZD4KLSAgICAgICAgICAgIDx0ZCBjbGFzcz0idG9wZnJhbWVoaWdobGlnaHQyIj48aW1nIHNyYz0iLi9pbWFnZXMvc2hpbS5naWYiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIGFsdD0iIiB0aXRsZT0iIi8+PC90ZD4KLSAgICAgICAgICAgIDx0ZD48aW1nIHNyYz0iLi9pbWFnZXMvc2hpbS5naWYiIHdpZHRoPSIxMCIgaGVpZ2h0PSIxIiBhbHQ9IiIgdGl0bGU9IiIvPjwvdGQ+Ci0gICAgICAgICAgICA8dGQ+PGEgaHJlZj0iSmF2YVNjcmlwdDpwcmludFBhZ2UoKTsiIGNsYXNzPSJ0b3ByaWdodG5hdiI+PGltZyBzcmM9Ii4vaW1hZ2VzL25pX3ByaW50LmdpZiIgd2lkdGg9IjE2IiBoZWlnaHQ9IjE3IiBib3JkZXI9IjAiIGFsdD0ieyRwcmludFRleHR9IiB0aXRsZT0ieyRwcmludFRleHR9Ii8+PC9hPjwvdGQ+Ci0gICAgICAgICAgICA8dGQgbm93cmFwPSJub3dyYXAiPjxhIGhyZWY9IkphdmFTY3JpcHQ6cHJpbnRQYWdlKCk7IiAgY2xhc3M9InRvcHJpZ2h0bmF2Z3JleSI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcmludFRleHQiLz48L2E+PC90ZD4KLSAgICAgICAgICAgIDx0ZD48aW1nIHNyYz0iLi9pbWFnZXMvc2hpbS5naWYiIHdpZHRoPSIxMCIgaGVpZ2h0PSIxIiBhbHQ9IiIgdGl0bGU9IiIvPjwvdGQ+Ci0gICAgICAgICAgPC90cj4KLSAgICAgICAgPC90YWJsZT4KLQkgIDwvdGQ+Ci0gICAgPC90cj4KLSAgICA8dHI+Ci0gICAgICA8dGQgY2xhc3M9InRvcGZyYW1lc2hhZG93IiBjb2xzcGFuPSIzIj48aW1nIHNyYz0iLi9pbWFnZXMvc2hpbS5naWYiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIGFsdD0iIiB0aXRsZT0iIi8+PC90ZD4KLSAgICA8L3RyPgotICAgIDx0cj4KLSAgICAgIDx0ZCBjbGFzcz0iYmdibGFjayIgY29sc3Bhbj0iMyI+PGltZyBzcmM9Ii4vaW1hZ2VzL3NoaW0uZ2lmIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiBhbHQ9IiIgdGl0bGU9IiIvPjwvdGQ+Ci0gICAgPC90cj4KLSAgPC90YWJsZT4KLSA8L2Zvcm0+Ci0KLTwvYm9keT4KLQotPC9odG1sPgotCi0KLTwveHNsOnRlbXBsYXRlPgotPC94c2w6c3R5bGVzaGVldD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AudWkvLmNsYXNzcGF0aCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AudWkvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDY1YWMwNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLnVpLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLnVpLy5wcm9qZWN0IGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC51aS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzdhMTEwNS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLnVpLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuZXBmLnJjcC51aTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLnVpL01FVEEtSU5GL01BTklGRVNULk1GIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC51aS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTkyM2Q5Yy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLnVpL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmVwZi5yY3AudWk7IHNpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuNS4wLnF1YWxpZmllcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UuZXBmLnJjcC51aS5SQ1BVSVBsdWdpbgotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1FY2xpcHNlLUxhenlTdGFydDogdHJ1ZQotRXhwb3J0LVBhY2thZ2U6IAotIG9yZy5lY2xpcHNlLmVwZi5yY3AudWksCi0gb3JnLmVjbGlwc2UuZXBmLnJjcC51aS5hY3Rpb25zLAotIG9yZy5lY2xpcHNlLmVwZi5yY3AudWkud2l6YXJkcwotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWk7dmlzaWJpbGl0eTo9cmVleHBvcnQsCi0gb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWksCi0gb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMsCi0gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLAotIG9yZy5lY2xpcHNlLmVtZi5lZGl0LAotIG9yZy5lY2xpcHNlLnVpLAotIG9yZy5lY2xpcHNlLnVpLmlkZSwKLSBvcmcuZWNsaXBzZS51aS5pbnRybywKLSBvcmcuZWNsaXBzZS5oZWxwLnVpLAotIG9yZy5lY2xpcHNlLmhlbHAud2ViYXBwLAotIG9yZy5lY2xpcHNlLnRvbWNhdCwKLSBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aSwKLSBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AudWkvYWJvdXQubWFwcGluZ3MgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLnVpL2Fib3V0Lm1hcHBpbmdzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOWRmZGRjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AudWkvYWJvdXQubWFwcGluZ3MKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLSMgYWJvdXQubWFwcGluZ3MKLSMgY29udGFpbnMgZmlsbC1pbnMgZm9yIGFib3V0LnByb3BlcnRpZXMKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgVGhpcyBmaWxlIGRvZXMgbm90IG5lZWQgdG8gYmUgdHJhbnNsYXRlZC4KLSMgVXN1YWxseSBnZW5lcmF0ZWQgYXQgYnVpbGQgdGltZS4KLQotMD1AYnVpbGQtSURACi0xPTEuNS4wCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLnVpL2J1aWxkLnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLnVpL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3MWRkYmQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC51aS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotc291cmNlLi4gPSBzcmMvCi1vdXRwdXQuLiA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IC4sXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBpY29ucy8sXAotICAgICAgICAgICAgICAgcGx1Z2luX2N1c3RvbWl6YXRpb24uaW5pLFwKLSAgICAgICAgICAgICAgIHNwbGFzaC5ibXAsXAotICAgICAgICAgICAgICAgYWJvdXQubWFwcGluZ3MsXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvCi0gICAgICAgICAgICAgICAKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AudWkvY29tcG9zZXIucHJvZHVjdCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AudWkvY29tcG9zZXIucHJvZHVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGY3ZWQ2My4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLnVpL2NvbXBvc2VyLnByb2R1Y3QKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9wZGUgdmVyc2lvbj0iMy4xIj8+Ci0KLTxwcm9kdWN0IG5hbWU9IkVjbGlwc2UgUHJvY2VzcyBGcmFtZXdvcmsgQ29tcG9zZXIiIGlkPSJvcmcuZWNsaXBzZS5lcGYucmNwLnVpLmNvbXBvc2VyIiBhcHBsaWNhdGlvbj0ib3JnLmVjbGlwc2UuZXBmLnJjcC51aS5NYWluQXBwbGljYXRpb24iIHVzZUZlYXR1cmVzPSJ0cnVlIj4KLQotICAgPGFib3V0SW5mbz4KLSAgICAgIDxpbWFnZSBwYXRoPSJpY29ucy9hYm91dC5naWYiLz4KLSAgICAgIDx0ZXh0PgotICAgICAgICAgJWFib3V0VGV4dAotICAgICAgPC90ZXh0PgotICAgPC9hYm91dEluZm8+Ci0KLSAgIDxjb25maWdJbmkgdXNlPSJkZWZhdWx0Ii8+Ci0KLSAgIDxsYXVuY2hlckFyZ3M+Ci0gICAgICA8cHJvZ3JhbUFyZ3M+LWRhdGEgQHVzZXIuaG9tZS9FUEYvd29ya3NwYWNlLjE1ME0yIC1kZWZhdWx0bGlicmFyeSBPcGVuVVA8L3Byb2dyYW1BcmdzPgotICAgICAgPHZtQXJncz4tWG1zNjRtIC1YbXg1MTJtPC92bUFyZ3M+Ci0gICA8L2xhdW5jaGVyQXJncz4KLQotICAgPHdpbmRvd0ltYWdlcyBpMTY9Ii9vcmcuZWNsaXBzZS5lcGYucmNwLnVpL2ljb25zL2Z1bGwvb2JqMTYvcHJvZHVjdC5naWYiIGkzMj0iL29yZy5lY2xpcHNlLmVwZi5yY3AudWkvaWNvbnMvZnVsbC9vYmozMi9wcm9kdWN0MzIuZ2lmIi8+Ci0KLSAgIDxzcGxhc2gKLSAgICAgIHN0YXJ0dXBQcm9ncmVzc1JlY3Q9IjAsMjgwLDQ1NSwxNSIKLSAgICAgIHN0YXJ0dXBNZXNzYWdlUmVjdD0iNywyMjAsNDQxLDIwIgotICAgICAgc3RhcnR1cEZvcmVncm91bmRDb2xvcj0iQzhENUVBIiAvPgotICAgPGxhdW5jaGVyIG5hbWU9ImVwZiI+Ci0gICAgICA8c29sYXJpcy8+Ci0gICAgICA8d2luIHVzZUljbz0iZmFsc2UiPgotICAgICAgICAgPGJtcC8+Ci0gICAgICA8L3dpbj4KLSAgIDwvbGF1bmNoZXI+Ci0KLSAgIDx2bT4KLSAgIDwvdm0+Ci0KLSAgIDxwbHVnaW5zPgotICAgPC9wbHVnaW5zPgotCi0gICA8ZmVhdHVyZXM+Ci0gICAgICA8ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UuZXBmLnByb2R1Y3QuZmVhdHVyZSIgdmVyc2lvbj0iMS4yLjAucXVhbGlmaWVyIi8+Ci0gICA8L2ZlYXR1cmVzPgotCi08L3Byb2R1Y3Q+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLnVpL2NvbXBvc2VyX3dpbjMyLnByb2R1Y3QgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLnVpL2NvbXBvc2VyX3dpbjMyLnByb2R1Y3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwZjYzMDAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC51aS9jb21wb3Nlcl93aW4zMi5wcm9kdWN0CisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/cGRlIHZlcnNpb249IjMuMSI/PgotCi08cHJvZHVjdCBuYW1lPSJFY2xpcHNlIFByb2Nlc3MgRnJhbWV3b3JrIENvbXBvc2VyIiBpZD0ib3JnLmVjbGlwc2UuZXBmLnJjcC51aS5jb21wb3NlciIgYXBwbGljYXRpb249Im9yZy5lY2xpcHNlLmVwZi5yY3AudWkuTWFpbkFwcGxpY2F0aW9uIiB1c2VGZWF0dXJlcz0idHJ1ZSI+Ci0KLSAgIDxhYm91dEluZm8+Ci0gICAgICA8aW1hZ2UgcGF0aD0iaWNvbnMvYWJvdXQuZ2lmIi8+Ci0gICAgICA8dGV4dD4KLSAgICAgICAgICVhYm91dFRleHQKLSAgICAgIDwvdGV4dD4KLSAgIDwvYWJvdXRJbmZvPgotCi0gICA8Y29uZmlnSW5pIHVzZT0iZGVmYXVsdCIvPgotCi0gICA8bGF1bmNoZXJBcmdzPgotICAgICAgPHByb2dyYW1BcmdzPi1kYXRhIEB1c2VyLmhvbWUvRVBGL3dvcmtzcGFjZS4xNTBNNCAtZGVmYXVsdGxpYnJhcnkgT3BlblVQPC9wcm9ncmFtQXJncz4KLSAgICAgIDx2bUFyZ3M+LVhtczY0bSAtWG14NTEybTwvdm1BcmdzPgotICAgPC9sYXVuY2hlckFyZ3M+Ci0KLSAgIDx3aW5kb3dJbWFnZXMgaTE2PSIvb3JnLmVjbGlwc2UuZXBmLnJjcC51aS9pY29ucy9mdWxsL29iajE2L3Byb2R1Y3QuZ2lmIiBpMzI9Ii9vcmcuZWNsaXBzZS5lcGYucmNwLnVpL2ljb25zL2Z1bGwvb2JqMzIvcHJvZHVjdDMyLmdpZiIvPgotCi0gICA8c3BsYXNoCi0gICAgICBzdGFydHVwUHJvZ3Jlc3NSZWN0PSIwLDI4MCw0NTUsMTUiCi0gICAgICBzdGFydHVwTWVzc2FnZVJlY3Q9IjcsMjIwLDQ0MSwyMCIKLSAgICAgIHN0YXJ0dXBGb3JlZ3JvdW5kQ29sb3I9IkM4RDVFQSIgLz4KLSAgIDxsYXVuY2hlciBuYW1lPSJlcGYiPgotICAgICAgPHNvbGFyaXMvPgotICAgICAgPHdpbiB1c2VJY289ImZhbHNlIj4KLSAgICAgICAgIDxibXAvPgotICAgICAgPC93aW4+Ci0gICA8L2xhdW5jaGVyPgotCi0gICA8dm0+Ci0gICA8L3ZtPgotCi0gICA8cGx1Z2lucz4KLSAgIDwvcGx1Z2lucz4KLQotICAgPGZlYXR1cmVzPgotICAgICAgPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLmVwZi5wcm9kdWN0LndpbjMyLmZlYXR1cmUiIHZlcnNpb249IjEuNS4wLnF1YWxpZmllciIvPgotICAgPC9mZWF0dXJlcz4KLQotPC9wcm9kdWN0PgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC51aS9jb25maWcvcmNwX3BhY2thZ2luZy9jb25maWcuaW5pIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC51aS9jb25maWcvcmNwX3BhY2thZ2luZy9jb25maWcuaW5pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZmIyOTMxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AudWkvY29uZmlnL3JjcF9wYWNrYWdpbmcvY29uZmlnLmluaQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLSMgRWNsaXBzZSBydW50aW1lIGNvbmZpZ3VyYXRpb24gZmlsZQotIyBUaGlzIGZpbGUgY29udGFpbnMgYSBudW1iZXIgb2Yga2V5L3ZhbHVlIHBhaXJzIHRoYXQgYXJlIG1lcmdlZCBpbnRvIHRoZSAKLSMgU3lzdGVtIHByb3BlcnRpZXMgb24gc3lzdGVtIHN0YXJ0dXAuICBUaGUgdmFsdWVzIGNvbnRyb2wgdGhlIHdheSB0aGUgCi0jIHJ1bnRpbWUgaXMgc3RydWN0dXJlZCBhbmQgcnVucy4KLQotIyBOb3RlOiAgT25seSBwbGF0Zm9ybTovYmFzZS8gYW5kIGZpbGU6IFVSTHMgYXJlIHN1cHBvcnRlZC4gIEluIGdlbmVyYWwgdGhlIAotIyBVUkxzIGdpdmVuIG1heSBpbmNsdWRlIGEgdmVyc2lvbiBudW1iZXIgKGUuZy4sIC4uLi9sb2NhdGlvbl8xLjIuMykuICAKLSMgSWYgYSB2ZXJzaW9uIGlzIG5vdCBzcGVjaWZpZWQsIHRoZSBzeXN0ZW0gYmluZHMKLSMgdG8gdGhlIGxvY2F0aW9uIHdoaWNoIG1hdGNoZXMgZXhhY3RseSBvciB0byB0aGUgdmVyc2lvbmVkIGxvY2F0aW9uIHdpdGggdGhlCi0jIGxhdGVzdCB2ZXJzaW9uIG51bWJlci4gIElmIGEgdmVyc2lvbiBudW1iZXIgaXMgZ2l2ZW4gdGhlbiBvbmx5IGV4YWN0IG1hdGNoZXMKLSMgYXJlIGNvbnNpZGVyZWQuCi0KLSMgVGhlIFVSTCBmb3IgdGhlIHJ1bnRpbWUgZW50cnkgcG9pbnQuICBUaGUgZGVmYXVsdCB2YWx1ZSBpcwotIyBwbGF0Zm9ybTovYmFzZS9wbHVnaW5zL29yZy5lY2xpcHNlLm9zZ2kgCi0jb3NnaS5mcmFtZXdvcms9cGxhdGZvcm06L2Jhc2UvcGx1Z2lucy9vcmcuZWNsaXBzZS5vc2dpCi0KLSMgVGhlIGNsYXNzcGF0aCBmb3IgdGhlIGZyYW1ld29yayBmb3VuZCBhdCB0aGUgb3NnaS5mcmFtZXdvcmsgbG9jYXRpb24uICBUaGlzIAotIyBjb21tYS1zZXBhcmF0ZWQgbGlzdCBjb250YWlucyBlaXRoZXIgVVJMcyBvciBzaW1wbGUgZWxlbWVudCBuYW1lcy4gIFNpbXBsZQotIyBuYW1lcyBhcmUgYXNzdW1lZCB0byBiZSByZWxhdGl2ZSB0byB0aGUgZnJhbWV3b3JrJ3MgaW5zdGFsbCBkaXJlY3RvcnkuICAKLSMgVHlwaWNhbGx5IHRoaXMgdmFsdWUgbmVlZCBub3QgYmUgc2V0IGFzIGl0IGlzIGluaXRpYWxpemVkIGJ5IHRoZSBmcmFtZXdvcmsgaXRzZWxmLgotIyBWZXJzaW9uIG1hdGNoIHNlYXJjaGluZyBpcyBub3QgZG9uZSBmb3IgVVJMcyBsaXN0ZWQgaGVyZS4KLSNvc2dpLmZyYW1ld29ya0NsYXNzUGF0aCA9Ci0KLSMgVGhlIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIGxvY2F0aW9ucyB0byBzZWFyY2ggZm9yIHRoZSBzcGxhc2ggc2NyZWVuIGZpbGUgKHNwbGFzaC5ibXApLgotIyBGb3IgZWFjaCBsaXN0IGVsZW1lbnQgYSBzdWJkaXJlY3Rvcnkgc3RydWN0dXJlIGJhc2VkIG9uIHRoZSBwYXR0ZXJuIG5sLzxsb2NhbGU+IGlzIHNlYXJjaGVkLgotIyBUaGUgc3lzdGVtIGJpbmRzIHRvIHRoZSBmaXJzdCBtYXRjaGluZyBmaWxlLiAgVGhlcmUgaXMgbm8gZGVmYXVsdCB2YWx1ZS4KLSNvc2dpLnNwbGFzaFBhdGg9Ci0KLSMgVGhlIGxvY2F0aW9uIG9mIHRoZSBzcGxhc2ggc2NyZWVuIGZpbGUuICBJZiB0aGlzIHZhbHVlIGlzIHNldCBhdCBzeXN0ZW0gc3RhcnR1cCBpdCBpcyB1c2VkIAotIyBpbiBmYXZvdXIgb2YgdGhlIG9zZ2kuc3BsYXNoUGF0aCBzZWFyY2hpbmcgb3V0bGluZWQgYWJvdmUuICBJZiB0aGUgdmFsdWUgaXMgbm90IHNldCAKLSMgdGhlIHNlYXJjaGluZyBpcyBkb25lIGFuZCB0aGlzIGtleSBpcyBib3VuZCB0byB0aGUgcmVzdWx0IG9mIHRoZSBzZWFyY2guCi0jb3NnaS5zcGxhc2hMb2NhdGlvbiA9Ci0KLSMgVGhlIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIGJ1bmRsZXMgd2hpY2ggYXJlIGF1dG9tYXRpY2FsbHkgaW5zdGFsbGVkIGFuZCBvcHRpb25hbGx5IHN0YXJ0ZWQKLSMgb25jZSB0aGUgc3lzdGVtIGlzIHVwIGFuZCBydW5uaW5nLiAgRWFjaCBlbnRyeSBpZiBvZiB0aGUgZm9ybQotIyAgICAgPFVSTCB8IHNpbXBsZSBidW5kbGUgbG9jYXRpb24+W0AgWzxzdGFydGxldmVsPl0gWyI6c3RhcnQiXV0KLSMgSWYgdGhlIHN0YXJ0bGV2ZWwgaXMgb21pdHRlZCB0aGVuIHRoZSBmcmFtZXdvcmsgd2lsbCB1c2UgdGhlIGRlZmF1bHQgc3RhcnQgbGV2ZWwgZm9yIHRoZSBidW5kbGUuCi0jIElmIHRoZSAic3RhcnQiIHRhZyBpcyBhZGRlZCB0aGVuIHRoZSBidW5kbGUgd2lsbCBiZSBtYXJrZWQgYXMgc3RhcnRlZCBhZnRlciBiZWluZyBpbnN0YWxsZWQuCi0jIFNpbXBsZSBidW5kbGUgbG9jYXRpb25zIGFyZSBpbnRlcmVwcmV0ZWQgYXMgcmVsYXRpdmUgdG8gdGhlIGZyYW1ld29yaydzIHBhcmVudCBkaXJlY3RvcnkuCi0jIFRoZSBzdGFydGxldmVsIGluZGljYXRlcyB0aGUgT1NHaSBzdGFydCBsZXZlbCBhdCB3aGljaCB0aGUgYnVuZGxlIHNob3VsZCBydW4uCi0jIElmIHRoaXMgdmFsdWUgaXMgbm90IHNldCwgdGhlIHN5c3RlbSBjb21wdXRlcyBhbiBhcHByb3ByaWF0ZSBkZWZhdWx0LgotI29zZ2kuYnVuZGxlcz1vcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWVAMjpzdGFydCxjb20uaWJtLnJtYy5saWJyYXJ5LG9yZy5lY2xpcHNlLnVpLmlkZSxvcmcuZWNsaXBzZS5oZWxwLmFwcHNlcnZlcixvcmcuZWNsaXBzZS5oZWxwLmJhc2Usb3JnLmVjbGlwc2UudXBkYXRlLnVpLGNvbS5pYm0udW1hLGNvbS5pYm0udW1hLmNvcmUsY29tLmlibS51bWFmLmVjb3JlLGNvbS5pYm0udG5ndWkuZWRpdCxvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcyxvcmcuZWNsaXBzZS5lbWYsb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaSxvcmcuZWNsaXBzZS5lbWYuZWRpdCxvcmcuZWNsaXBzZS5lbWYuZWRpdC51aSxvcmcuZWNsaXBzZS51aSxvcmcuZWNsaXBzZS51aS5pZGUKLQotIyBUaGUgcHJvZHVjdCB0byBydW4uICBBIGdpdmVuIEVjbGlwc2UgY29uZmlndXJhdGlvbiBtYXkgY29udGFpbiBtYW55IHByb2R1Y3RzLgotIyBUaGUgcHJvZHVjdCBpZGVudGlmaWVkIHdpbGwgc3VwcGx5IHRoZSBicmFuZGluZyAod2luZG93IGljb25zLCB0aXRsZSBiYXIgdGV4dCkgZXRjIAotIyBhcyB3ZWxsIGFzIGRlZmluZSB0aGUgZGVmYXVsdCBhcHBsaWNhdGlvbiB0byBydW4uICAKLSNlY2xpcHNlLnByb2R1Y3Q9b3JnLmVjbGlwc2UucGxhdGZvcm0KLQotIyBUaGUgYXBwbGljYXRpb24gdG8gcnVuLiAgVGhlIHZhbHVlIHNwZWNpZmllZCBoZXJlIGlzIHRoZSBpZCBvZiB0aGUgYXBwbGljYXRpb24gZXh0ZW5zaW9uCi0jIHRoZSBydW50aW1lIHdpbGwgZmluZCwgaW5zdGFudGlhdGUgYW5kIGV4ZWN1dGUgb25jZSB0aGUgc3lzdGVtIGlzIHVwLiAgTm90ZSB0aGF0IHR5cGljYWxseSAKLSMgdGhlIGlkZW50aWZpZWQgZWNsaXBzZS5wcm9kdWN0IGRlZmluZXMgdGhlIGRlZmF1bHQgYXBwbGljYXRpb24gdG8gcnVuLgotZWNsaXBzZS5hcHBsaWNhdGlvbj1vcmcuZWNsaXBzZS5lcGYucmNwLnVpLk1haW5BcHBsaWNhdGlvbgotCi0jIFRoZSBidWlsZCBpZGVudGlmaWVyCi1lY2xpcHNlLmJ1aWxkSWQ9TTIwMDQwOTE2MTEyNQotCi0jIEVuZCBvZiBmaWxlIG1hcmtlciAtIG11c3QgYmUgaGVyZQotZW9mPWVvZgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AudWkvZWNsaXBzZTMyLnBuZyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AudWkvZWNsaXBzZTMyLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTY4ZmFjMS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLnVpL2VjbGlwc2UzMi5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLnVpL2ljb25zL2Fib3V0LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AudWkvaWNvbnMvYWJvdXQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZjhiODcyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AudWkvaWNvbnMvYWJvdXQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC51aS9pY29ucy9hcHBsaWNhdGlvbi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLnVpL2ljb25zL2FwcGxpY2F0aW9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmRjMjkxMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLnVpL2ljb25zL2FwcGxpY2F0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AudWkvaWNvbnMvZWNsaXBzZS5wbmcgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLnVpL2ljb25zL2VjbGlwc2UucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Mzk3NTI0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AudWkvaWNvbnMvZWNsaXBzZS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLnVpL2ljb25zL2V0b29sMTYvaGVscC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLnVpL2ljb25zL2V0b29sMTYvaGVscC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkNzAzMDEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC51aS9pY29ucy9ldG9vbDE2L2hlbHAuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC51aS9pY29ucy9ldG9vbDE2L3NlYXJjaF9tZW51LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AudWkvaWNvbnMvZXRvb2wxNi9zZWFyY2hfbWVudS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwZjVkODMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC51aS9pY29ucy9ldG9vbDE2L3NlYXJjaF9tZW51LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AudWkvaWNvbnMvZnVsbC9vYmoxNi9wcm9kdWN0LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AudWkvaWNvbnMvZnVsbC9vYmoxNi9wcm9kdWN0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmRjMjkxMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLnVpL2ljb25zL2Z1bGwvb2JqMTYvcHJvZHVjdC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLnVpL2ljb25zL2Z1bGwvb2JqMzIvcHJvZHVjdDMyLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AudWkvaWNvbnMvZnVsbC9vYmozMi9wcm9kdWN0MzIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNmFkN2NjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AudWkvaWNvbnMvZnVsbC9vYmozMi9wcm9kdWN0MzIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC51aS9pY29ucy9uZXdfY29uLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AudWkvaWNvbnMvbmV3X2Nvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhZWE4OTQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC51aS9pY29ucy9uZXdfY29uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AudWkvcGx1Z2luLnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLnVpL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NWYxMTQyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AudWkvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUgotCi0jIFBsdWctaW4KLXBsdWdpbk5hbWU9RVBGIENvbXBvc2VyIFJDUCBVSQotcHJvZHVjdE5hbWU9RVBGIENvbXBvc2VyCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKLQotIyBBYm91dCB0ZXh0Ci1hYm91dFRleHQ9RWNsaXBzZSBQcm9jZXNzIEZyYW1ld29yayBDb21wb3NlclxuXAotXG5cCi1WZXJzaW9uOiB7MX1cblwKLUJ1aWxkIExhYmVsOiB7MH1cblwKLVxuXAotKGMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyBhbmQgb3RoZXJzIDIwMDAsIDIwMDguIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4KLQotIyBDYXRlZ29yeQotbWV0aG9kQ2F0ZWdvcnlOYW1lPU1ldGhvZAotCi0jIFZpZXdzCi13ZWxjb21lVmlld05hbWU9V2VsY29tZQotCi0jIEFjdGlvbnMKLWdsb2JhbEFjdGlvblNldD1HbG9iYWwgQWN0aW9uIFNldAotbmV3QWN0aW9uPSZOZXcKLW5ld0FjdGlvblRvb2x0aXA9TmV3Ci1vcGVuQWN0aW9uPSZPcGVuLi4uCi1vcGVuQWN0aW9uVG9vbHRpcD1PcGVuCi1zZWFyY2hBY3Rpb249JlNlYXJjaC4uLgotc2VhcmNoQWN0aW9uVG9vbHRpcD1TZWFyY2gKLXdlbGNvbWVBY3Rpb249JldlbGNvbWUKLXdlbGNvbWVBY3Rpb25Ub29sVGlwPVdlbGNvbWUKLQotIyBUb29sdGlwcwotc2hvcnRjdXQub3ZlcnZpZXcudG9vbHRpcD1SZXR1cm4gdG8gT3ZlcnZpZXcgcGFnZQotc2hvcnRjdXQudHV0b3JpYWxzLnRvb2x0aXA9UmV0dXJuIHRvIFR1dG9yaWFsIHBhZ2UKLXNob3J0Y3V0LmZpcnN0c3RlcHMudG9vbHRpcD1SZXR1cm4gdG8gRmlyc3QgU3RlcHMgcGFnZQotc2hvcnRjdXQud2VicmVzb3VyY2VzLnRvb2x0aXA9UmV0dXJuIHRvIFdlYiBSZXNvdXJjZXMgcGFnZSAgICAgICAKLQotI0FjdGlvbiBTZXQKLWFjdGlvblNldC5kZXNjcmlwdGlvbiA9IEhlbHAgU3lzdGVtIFRvb2xiYXIgQWN0aW9ucwotYWN0aW9uU2V0LmxhYmVsID0gSGVscCBTeXN0ZW0KLXNlYXJjaEFjdGlvbi5sYWJlbCA9IFMmZWFyY2ggSGVscAotc2VhcmNoQWN0aW9uLnRvb2x0aXAgPSBTZWFyY2ggSGVscAotZHluYW1pY0hlbHBBY3Rpb24ubGFiZWwgPSAmRHluYW1pYyBIZWxwIAotZHluYW1pY0hlbHBBY3Rpb24udG9vbHRpcCA9IER5bmFtaWMgSGVscAotCi0jQWN0aXZpdGllcy9DYXBhYmlsaXRpZXMKLWFjdGl2aXR5LmdlbmVyYWw9SW1wb3J0IGFuZCBFeHBvcnQgUHJvamVjdHMgYW5kIFJlc291cmNlcwotYWN0aXZpdHkuZ2VuZXJhbC5kZXNjPVVzZSB0aGUgc3RhbmRhcmQgRWNsaXBzZSBJbXBvcnQvRXhwb3J0IFByb2plY3QvUmVzb3VyY2VzIGNhcGFiaWxpdGllcy4KLWFjdGl2aXR5LnRlYW0uY3ZzPUNWUyBTdXBwb3J0Ci1hY3Rpdml0eS50ZWFtLmN2cy5kZXNjPVVzZSB0aGUgQ29uY3VycmVudCBWZXJzaW9ucyBTeXN0ZW0gKENWUykgdG8gbWFuYWdlIHJlc291cmNlcy4KLWFjdGl2aXR5LnRlYW09Q29yZSBUZWFtIFN1cHBvcnQKLWFjdGl2aXR5LnRlYW0uZGVzYz1TaGFyZSBwcm9qZWN0cyB1c2luZyBjb25maWd1cmF0aW9uIG1hbmFnZW1lbnQgc3lzdGVtcy4KLQotYWN0aXZpdHkuY2F0LmdlbmVyYWw9R2VuZXJhbAotYWN0aXZpdHkuY2F0LmdlbmVyYWwuZGVzYz1Vc2UgdGhlIHN0YW5kYXJkIEVjbGlwc2UgY2FwYWJpbGl0aWVzLgotYWN0aXZpdHkuY2F0LnRlYW09VGVhbQotYWN0aXZpdHkuY2F0LnRlYW0uZGVzYz1Vc2UgY29uZmlndXJhdGlvbiBtYW5hZ2VtZW50IHN5c3RlbXMgdG8gbWFuYWdlIHJlc291cmNlcy4KLQotUHJlZmVyZW5jZVBhZ2VzLkNhcGFiaWxpdGllcyA9IENhcGFiaWxpdGllcwotUHJlZmVyZW5jZVBhZ2VzLkNhcGFiaWxpdGllcy5hY3Rpdml0eU5hbWUgPSAmQ2FwYWJpbGl0aWVzCi1QcmVmZXJlbmNlUGFnZXMuQ2FwYWJpbGl0aWVzLmNhdGVnb3J5TmFtZSA9ICZDYXBhYmlsaXRpZXMKLVByZWZlcmVuY2VQYWdlcy5DYXBhYmlsaXRpZXMuYWN0aXZpdHlQcm9tcHRCdXR0b24gPSAmUHJvbXB0IHdoZW4gZW5hYmxpbmcgY2FwYWJpbGl0aWVzCi1QcmVmZXJlbmNlUGFnZXMuQ2FwYWJpbGl0aWVzLmFjdGl2aXR5UHJvbXB0QnV0dG9uVG9vbHRpcCA9IFByb21wdCB3aGVuIGEgZmVhdHVyZSBpcyBmaXJzdCB1c2VkIHRoYXQgcmVxdWlyZXMgZW5hYmxlbWVudCBvZiBjYXBhYmlsaXRpZXMKLVByZWZlcmVuY2VQYWdlcy5DYXBhYmlsaXRpZXMuY2FwdGlvbk1lc3NhZ2UgPSBDYXBhYmlsaXRpZXMgYWxsb3cgeW91IHRvIGVuYWJsZSBvciBkaXNhYmxlIHZhcmlvdXMgcHJvZHVjdCBjb21wb25lbnRzLiAgVGhlc2UgY2FwYWJpbGl0aWVzIGFyZSBncm91cGVkIGFjY29yZGluZyB0byBhIHNldCBvZiBwcmVkZWZpbmVkIGNhdGVnb3JpZXMuCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLnVpL3BsdWdpbi54bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLnVpL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyZjdiZmEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC51aS9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsOTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTxwbHVnaW4+Ci0KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIGlkPSJNYWluQXBwbGljYXRpb24iCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmFwcGxpY2F0aW9ucyI+Ci0gICAgICA8YXBwbGljYXRpb24+Ci0gICAgICAgICA8cnVuCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLnJjcC51aS5NYWluQXBwbGljYXRpb24iPgotICAgICAgICAgPC9ydW4+Ci0gICAgICA8L2FwcGxpY2F0aW9uPgotICAgPC9leHRlbnNpb24+Ci0gICAKLSAgIDxleHRlbnNpb24KLSAgICAgICAgIGlkPSJjb21wb3NlciIKLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJvZHVjdHMiPgotICAgICAgPHByb2R1Y3QKLSAgICAgICAgICAgIGFwcGxpY2F0aW9uPSJvcmcuZWNsaXBzZS5lcGYucmNwLnVpLk1haW5BcHBsaWNhdGlvbiIKLSAgICAgICAgICAgIG5hbWU9IkVjbGlwc2UgUHJvY2VzcyBGcmFtZXdvcmsgQ29tcG9zZXIiPgotICAgICAgICAgPHByb3BlcnR5Ci0gICAgICAgICAgICAgICBuYW1lPSJwcmVmZXJlbmNlQ3VzdG9taXphdGlvbiIKLSAgICAgICAgICAgICAgIHZhbHVlPSJwbHVnaW5fY3VzdG9taXphdGlvbi5pbmkiLz4KLSAgICAgICAgIDxwcm9wZXJ0eQotICAgICAgICAgICAgICAgbmFtZT0ic3RhcnR1cEZvcmVncm91bmRDb2xvciIKLSAgICAgICAgICAgICAgIHZhbHVlPSJDOEQ1RUEiLz4KLSAgICAgICAgIDxwcm9wZXJ0eQotICAgICAgICAgICAgICAgbmFtZT0ic3RhcnR1cE1lc3NhZ2VSZWN0IgotICAgICAgICAgICAgICAgdmFsdWU9IjcsMjIwLDQ0MSwyMCIvPgotICAgICAgICAgPHByb3BlcnR5Ci0gICAgICAgICAgICAgICBuYW1lPSJzdGFydHVwUHJvZ3Jlc3NSZWN0IgotICAgICAgICAgICAgICAgdmFsdWU9IjAsMjgwLDQ1NSwxNSIvPgotICAgICAgICAgPHByb3BlcnR5Ci0gICAgICAgICAgICAgICBuYW1lPSJhYm91dEltYWdlIgotICAgICAgICAgICAgICAgdmFsdWU9Imljb25zL2Fib3V0LmdpZiIvPgotICAgICAgICAgPHByb3BlcnR5Ci0gICAgICAgICAgICAgICBuYW1lPSJhYm91dFRleHQiCi0gICAgICAgICAgICAgICB2YWx1ZT0iJWFib3V0VGV4dCIvPgotICAgICAgICAgPHByb3BlcnR5Ci0gICAgICAgICAgICAgICBuYW1lPSJ3aW5kb3dJbWFnZXMiCi0gICAgICAgICAgICAgICB2YWx1ZT0iaWNvbnMvZnVsbC9vYmoxNi9wcm9kdWN0LmdpZixpY29ucy9mdWxsL29iajMyL3Byb2R1Y3QzMi5naWYiLz4KLSAgICAgICAgIDxwcm9wZXJ0eQotICAgICAgICAgICAgICAgbmFtZT0iYXBwTmFtZSIKLSAgICAgICAgICAgICAgIHZhbHVlPSJFY2xpcHNlIFByb2Nlc3MgRnJhbWV3b3JrIENvbXBvc2VyIj4KLSAgICAgICAgIDwvcHJvcGVydHk+Ci0gICAgICA8L3Byb2R1Y3Q+Ci0gICA8L2V4dGVuc2lvbj4KLQotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmNvbW1hbmRzIj4KLSAgICAgIDxjb21tYW5kCi0gICAgICAgICAgICBuYW1lPSJlZGl0IgotICAgICAgICAgICAgZGVzY3JpcHRpb249Ik9wZW4gYSBtZXRob2QgZWxlbWVudCIKLSAgICAgICAgICAgIGNhdGVnb3J5SWQ9Im9yZy5lY2xpcHNlLnVpLmNhdGVnb3J5LmVkaXQiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLnJjcC51aS5hY3Rpb25zLm9wZW5FbGVtZW50Ii8+Ci0gICA8L2V4dGVuc2lvbj4KLQotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmFjdGlvblNldHMiPgotICAgICAgPGFjdGlvblNldAotICAgICAgICAgICAgZGVzY3JpcHRpb249IiVhY3Rpb25TZXQuZGVzY3JpcHRpb24iCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuaGVscC51aS5hY3Rpb25zIgotICAgICAgICAgICAgbGFiZWw9IiVhY3Rpb25TZXQubGFiZWwiCi0gICAgICAgICAgICB2aXNpYmxlPSJ0cnVlIj4KLSAgICAgICAgPGFjdGlvbgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmhlbHAudWkuaW50ZXJuYWwuU2VhcmNoQWN0aW9uIgotICAgICAgICAgICAgICAgaWNvbj0iJG5sJC9pY29ucy9ldG9vbDE2L3NlYXJjaF9tZW51LmdpZiIKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5oZWxwLnVpLnNlYXJjaCIKLSAgICAgICAgICAgICAgIGxhYmVsPSIlc2VhcmNoQWN0aW9uLmxhYmVsIgotICAgICAgICAgICAgICAgbWVudWJhclBhdGg9ImhlbHAvZ3JvdXAuaGVscCIKLSAgICAgICAgICAgICAgIHN0eWxlPSJwdXNoIgotICAgICAgICAgICAgICAgdG9vbGJhclBhdGg9Im9yZy5lY2xpcHNlLnVpLndvcmtiZW5jaC5maWxlL2J1aWxkLmdyb3VwIgotICAgICAgICAgICAgICAgdG9vbHRpcD0iJXNlYXJjaEFjdGlvbi50b29sdGlwIi8+Ci0gICAgICAgICA8YWN0aW9uCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuaGVscC51aS5pbnRlcm5hbC5EeW5hbWljSGVscEFjdGlvbiIKLSAgICAgICAgICAgICAgIGljb249IiRubCQvaWNvbnMvZXRvb2wxNi9oZWxwLmdpZiIKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5oZWxwLnVpLmR5bmFtaWNIZWxwIgotICAgICAgICAgICAgICAgbGFiZWw9IiVkeW5hbWljSGVscEFjdGlvbi5sYWJlbCIKLSAgICAgICAgICAgICAgIG1lbnViYXJQYXRoPSJoZWxwL2dyb3VwLmhlbHAiCi0gICAgICAgICAgICAgICBzdHlsZT0icHVzaCIKLSAgICAgICAgICAgICAgIHRvb2xiYXJQYXRoPSJvcmcuZWNsaXBzZS51aS53b3JrYmVuY2guZmlsZS9idWlsZC5ncm91cCIKLSAgICAgICAgICAgICAgIHRvb2x0aXA9IiVkeW5hbWljSGVscEFjdGlvbi50b29sdGlwIi8+Ci0gICAgICA8L2FjdGlvblNldD4KLSAgIDwvZXh0ZW5zaW9uPgotICAgCi0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkuYWN0aXZpdGllcyI+Ci0gICAgCTxhY3Rpdml0eQotIAkJCWlkPSJhY3Rpdml0eS5leHRlcm5hbHRvb2wiCi0gCQkJbmFtZT0iaGlkZUV4dGVybmFsdG9vbE1lbnVzIj4KLSAJCTwvYWN0aXZpdHk+Ci0gCQk8YWN0aXZpdHlQYXR0ZXJuQmluZGluZwotCSAJCWFjdGl2aXR5SWQ9ImFjdGl2aXR5LmV4dGVybmFsdG9vbCIKLQkJCXBhdHRlcm49Im9yZ1wuZWNsaXBzZVwudWlcLmV4dGVybmFsdG9vbHMvb3JnXC5lY2xpcHNlXC51aVwuZXh0ZXJuYWx0b29sc1wuRXh0ZXJuYWxUb29sTWVudURlbGVnYXRlLioiPgotIAkJPC9hY3Rpdml0eVBhdHRlcm5CaW5kaW5nPgotCTwvZXh0ZW5zaW9uPgotCQotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLnVpL3BsdWdpbl9jdXN0b21pemF0aW9uLmluaSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AudWkvcGx1Z2luX2N1c3RvbWl6YXRpb24uaW5pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYTI2ZGRiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AudWkvcGx1Z2luX2N1c3RvbWl6YXRpb24uaW5pCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotb3JnLmVjbGlwc2UudWkvRE9DS19QRVJTUEVDVElWRV9CQVI9VE9QX1JJR0hUCi1vcmcuZWNsaXBzZS51aS9pbml0aWFsRmFzdFZpZXdCYXJMb2NhdGlvbj1yaWdodAotb3JnLmVjbGlwc2UudWkvU0hPV19UUkFESVRJT05BTF9TVFlMRV9UQUJTPWZhbHNlCi1vcmcuZWNsaXBzZS51aS9PUEVOX05FV19QRVJTUEVDVElWRT1PUEVOX1BFUlNQRUNUSVZFX1JFUExBQ0UKLW9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL2FwcG5hbWU9RVBGCi1vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L0FDVElWSVRZX0RFVEFJTF9ESUFHUkFNX1RBU0tTX1BFUl9ST1c9NQotb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9BRERfUk9MRV9UQVNLU19CT1hfQkdfQ09MT1JfUkdCPTI1NSwyNTUsMTU2Ci1vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL0FERF9XUF9CT1hfQkdfQ09MT1JfUkdCPTI1NSwyNTUsMjA1Ci1vcmcuZWNsaXBzZS50ZWFtLmNvcmUvaWdub3JlX2ZpbGVzPS5sb2NrXG50cnVlXG4KLW9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvUFVCTElTSF9ORVdfRElBR1JBTT10cnVlCi1vcmcuZWNsaXBzZS51aS9TSE9XX1BST0dSRVNTX09OX1NUQVJUVVA9dHJ1ZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC51aS9zcGxhc2guYm1wIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC51aS9zcGxhc2guYm1wCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMWVlZTQwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AudWkvc3BsYXNoLmJtcAorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9yY3AvdWkvTWFpbkFjdGlvbkJhckFkdmlzb3IuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9yY3AvdWkvTWFpbkFjdGlvbkJhckFkdmlzb3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTlkZWQ1My4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmNwL3VpL01haW5BY3Rpb25CYXJBZHZpc29yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MjQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnJjcC51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlIZWxwQ29udGV4dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS52aWV3cy5WaWV3SGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yY3AudWkuYWN0aW9ucy5OZXdXaXphcmRNZW51OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yY3AudWkuYWN0aW9ucy5VSUFjdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJjcC51aS5hY3Rpb25zLlVJT3BlblBlcnNwZWN0aXZlRGlhbG9nQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkdyb3VwTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQ29udHJpYnV0aW9uSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUNvb2xCYXJNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklUb29sQmFyTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uTWVudU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLlNlcGFyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5BY3Rpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuQ29udHJpYnV0aW9uSXRlbUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5BY3Rpb25GYWN0b3J5LklXb3JrYmVuY2hBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYXBwbGljYXRpb24uQWN0aW9uQmFyQWR2aXNvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hcHBsaWNhdGlvbi5JQWN0aW9uQmFyQ29uZmlndXJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pZGUuSURFQWN0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pZGUuSUlERUFjdGlvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5hcHBsaWNhdGlvbi5JQWN0aW9uQmFyQ29uZmlndXJlcjI7Ci0KLS8qKgotICogQ3JlYXRlcywgYWRkcyBhbmQgZGlzcG9zZXMgdGhlIGFjdGlvbnMgYWRkZWQgdG8gYSB3b3JrYmVuY2ggd2luZG93LgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBhdXRob3IgQmluZ3h1ZSBYdQotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBNYWluQWN0aW9uQmFyQWR2aXNvciBleHRlbmRzIEFjdGlvbkJhckFkdmlzb3IgewotCi0JLy8gQWxsIGFjdGlvbnMgc2hvdWxkIGJlIGNyZWF0ZWQgaW4gbWFrZUFjdGlvbnMgYW5kIHJlZmVyZW5jZWQgaW4gdGhlCi0JLy8gZmlsbCBtZXRob2RzLiBUaGlzIGVuc3VyZXMgdGhhdCB0aGUgYWN0aW9ucyBhcmVuJ3QgcmVjcmVhdGVkCi0JLy8gd2hlbiBmaWxsQWN0aW9uQmFycyBpcyBjYWxsZWQgd2l0aCBGSUxMX1BST1hZLgotCi0JLy8gRmlsZSBhY3Rpb25zLgotCXByb3RlY3RlZCBJV29ya2JlbmNoQWN0aW9uIG5ld0FjdGlvbjsKLQotCXByb3RlY3RlZCBJV29ya2JlbmNoQWN0aW9uIGNsb3NlQWN0aW9uOwotCi0JcHJvdGVjdGVkIElXb3JrYmVuY2hBY3Rpb24gY2xvc2VBbGxBY3Rpb247Ci0KLQlwcm90ZWN0ZWQgSVdvcmtiZW5jaEFjdGlvbiBzYXZlQWN0aW9uOwotCi0JcHJvdGVjdGVkIElXb3JrYmVuY2hBY3Rpb24gc2F2ZUFzQWN0aW9uOwotCi0JcHJvdGVjdGVkIElXb3JrYmVuY2hBY3Rpb24gc2F2ZUFsbEFjdGlvbjsKLQotCXByb3RlY3RlZCBJV29ya2JlbmNoQWN0aW9uIHJldmVydEFjdGlvbjsKLQotCXByb3RlY3RlZCBJV29ya2JlbmNoQWN0aW9uIG1vdmVBY3Rpb247Ci0KLQlwcm90ZWN0ZWQgSVdvcmtiZW5jaEFjdGlvbiByZW5hbWVBY3Rpb247Ci0KLQlwcm90ZWN0ZWQgSVdvcmtiZW5jaEFjdGlvbiByZWZyZXNoQWN0aW9uOwotCi0JcHJvdGVjdGVkIElXb3JrYmVuY2hBY3Rpb24gaW1wb3J0QWN0aW9uOwotCi0JcHJvdGVjdGVkIElXb3JrYmVuY2hBY3Rpb24gZXhwb3J0QWN0aW9uOwotCi0JcHJvdGVjdGVkIElXb3JrYmVuY2hBY3Rpb24gcHJvcGVydGllc0FjdGlvbjsKLQotCXByb3RlY3RlZCBJV29ya2JlbmNoQWN0aW9uIGV4aXRBY3Rpb247Ci0KLQkvLyBFZGl0IGFjdGlvbnMuCi0JcHJvdGVjdGVkIElXb3JrYmVuY2hBY3Rpb24gb3BlbkVsZW1lbnRBY3Rpb247Ci0KLQlwcm90ZWN0ZWQgSVdvcmtiZW5jaEFjdGlvbiB1bmRvQWN0aW9uOwotCi0JcHJvdGVjdGVkIElXb3JrYmVuY2hBY3Rpb24gcmVkb0FjdGlvbjsKLQotCXByb3RlY3RlZCBJV29ya2JlbmNoQWN0aW9uIGN1dEFjdGlvbjsKLQotCXByb3RlY3RlZCBJV29ya2JlbmNoQWN0aW9uIGNvcHlBY3Rpb247Ci0KLQlwcm90ZWN0ZWQgSVdvcmtiZW5jaEFjdGlvbiBwYXN0ZUFjdGlvbjsKLQotCXByb3RlY3RlZCBJV29ya2JlbmNoQWN0aW9uIGRlbGV0ZUFjdGlvbjsKLQotCXByb3RlY3RlZCBJV29ya2JlbmNoQWN0aW9uIHNlbGVjdEFsbEFjdGlvbjsKLQotCXByb3RlY3RlZCBJV29ya2JlbmNoQWN0aW9uIGZpbmRBY3Rpb247Ci0KLQkvLyBOYXZpZ2F0ZSBhY3Rpb25zLgotCXByb3RlY3RlZCBJV29ya2JlbmNoQWN0aW9uIGdvSW50b0FjdGlvbjsKLQotCXByb3RlY3RlZCBJV29ya2JlbmNoQWN0aW9uIG5leHRBY3Rpb247Ci0KLQlwcm90ZWN0ZWQgSVdvcmtiZW5jaEFjdGlvbiBwcmV2aW91c0FjdGlvbjsKLQotCXByb3RlY3RlZCBJV29ya2JlbmNoQWN0aW9uIGJhY2tBY3Rpb247Ci0KLQlwcm90ZWN0ZWQgSVdvcmtiZW5jaEFjdGlvbiBmb3J3YXJkQWN0aW9uOwotCi0JLy8gV2luZG93IGFjdGlvbnMuCi0JcHJvdGVjdGVkIElXb3JrYmVuY2hBY3Rpb24gb3Blbk5ld1dpbmRvd0FjdGlvbjsKLQotCXByb3RlY3RlZCBJV29ya2JlbmNoQWN0aW9uIG9wZW5QZXJzcGVjdGl2ZURpYWxvZ0FjdGlvbjsKLQotCXByb3RlY3RlZCBJV29ya2JlbmNoQWN0aW9uIGN1c3RvbWl6ZVBlcnNwZWN0aXZlQWN0aW9uOwotCi0JcHJvdGVjdGVkIElXb3JrYmVuY2hBY3Rpb24gc2F2ZVBlcnNwZWN0aXZlQWN0aW9uOwotCi0JcHJvdGVjdGVkIElXb3JrYmVuY2hBY3Rpb24gcmVzZXRQZXJzcGVjdGl2ZUFjdGlvbjsKLQotCXByb3RlY3RlZCBJV29ya2JlbmNoQWN0aW9uIGNsb3NlUGVyc3BlY3RpdmVBY3Rpb247Ci0KLQlwcm90ZWN0ZWQgSVdvcmtiZW5jaEFjdGlvbiBjbG9zZUFsbFBlcnNwZWN0aXZlQWN0aW9uOwotCi0JcHJvdGVjdGVkIElXb3JrYmVuY2hBY3Rpb24gcHJlZmVyZW5jZXNBY3Rpb247Ci0KLQkvLyBXaW5kb3cgbmF2aWdhdGlvbiBhY3Rpb25zLgotCXByb3RlY3RlZCBJV29ya2JlbmNoQWN0aW9uIG5leHRFZGl0b3JBY3Rpb247Ci0KLQlwcm90ZWN0ZWQgSVdvcmtiZW5jaEFjdGlvbiBwcmV2aW91c0VkaXRvckFjdGlvbjsKLQotCXByb3RlY3RlZCBJV29ya2JlbmNoQWN0aW9uIG5leHRQYXJ0QWN0aW9uOwotCi0JcHJvdGVjdGVkIElXb3JrYmVuY2hBY3Rpb24gcHJldmlvdXNQYXJ0QWN0aW9uOwotCi0JcHJvdGVjdGVkIElXb3JrYmVuY2hBY3Rpb24gbmV4dFBlcnNwZWN0aXZlQWN0aW9uOwotCi0JcHJvdGVjdGVkIElXb3JrYmVuY2hBY3Rpb24gcHJldmlvdXNQZXJzcGVjdGl2ZUFjdGlvbjsKLQotCS8vIEhlbHAgYWN0aW9ucy4KLQlwcm90ZWN0ZWQgSVdvcmtiZW5jaEFjdGlvbiB3ZWxjb21lQWN0aW9uOwotCi0JcHJvdGVjdGVkIElXb3JrYmVuY2hBY3Rpb24gaGVscENvbnRlbnRzQWN0aW9uOwotCi0JcHJvdGVjdGVkIElXb3JrYmVuY2hBY3Rpb24gYWJvdXRBY3Rpb247Ci0KLQlwcm90ZWN0ZWQgSVdvcmtiZW5jaEFjdGlvbiBuZXdXaXphcmREcm9wRG93bkFjdGlvbjsKLQotCXByb3RlY3RlZCBJV29ya2JlbmNoQWN0aW9uIGxvY2tUb29sQmFyQWN0aW9uOwotCi0JcHJvdGVjdGVkIElXb3JrYmVuY2hBY3Rpb24gZWRpdEFjdGlvblNldEFjdGlvbjsKLQotCXByb3RlY3RlZCBNZW51TWFuYWdlciBtYWluSGVscE1lbnU7Ci0KLQlwcm90ZWN0ZWQgTWVudU1hbmFnZXIgbWFpbkZpbGVNZW51OwotCi0JcHJvdGVjdGVkIE1lbnVNYW5hZ2VyIGludGVybmFsTWVudTsKLQotCXByb3RlY3RlZCBJV29ya2JlbmNoV2luZG93IHdpbmRvdzsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICogCi0JICogQHBhcmFtIGNvbmZpZ3VyZXIKLQkgKiAgICAgICAgICAgIHRoZSBhY3Rpb24gYmFyIGNvbmZpZ3VyZXIKLQkgKi8KLQlwdWJsaWMgTWFpbkFjdGlvbkJhckFkdmlzb3IoSUFjdGlvbkJhckNvbmZpZ3VyZXIgY29uZmlndXJlcikgewotCQlzdXBlcihjb25maWd1cmVyKTsKLQkJd2luZG93ID0gY29uZmlndXJlci5nZXRXaW5kb3dDb25maWd1cmVyKCkuZ2V0V2luZG93KCk7Ci0JfQotCi0JLyoqCi0JICogR2V0ZCB0aGUgd29ya2JlbmNoIHdpbmRvdy4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSB3b3JrYmVuY2ggd2luZG93Ci0JICovCi0JcHVibGljIElXb3JrYmVuY2hXaW5kb3cgZ2V0V2luZG93KCkgewotCQlyZXR1cm4gd2luZG93OwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuYXBwbGljYXRpb24uQWN0aW9uQmFyQWR2aXNvciNtYWtlQWN0aW9ucyhmaW5hbAotCSAqICAgICAgSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgbWFrZUFjdGlvbnMoZmluYWwgSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cpIHsKLQkJaWYgKFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuaXNDbG9zaW5nKCkpCi0JCQlyZXR1cm47Ci0KLQkJLy8gQ3JlYXRlcyB0aGUgYWN0aW9ucyBhbmQgcmVnaXN0ZXJzIHRoZW0uIFJlZ2lzdGVyaW5nIGlzIG5lZWRlZCB0bwotCQkvLyBlbnN1cmUgdGhhdCBrZXkgYmluZGluZ3Mgd29yay4gVGhlIGNvcnJlc3BvbmRpbmcgY29tbWFuZHMga2V5Ci0JCS8vIGJpbmRpbmdzIGFyZSBkZWZpbmVkIGluIHRoZSBwbHVnaW4ueG1sIGZpbGUuIFJlZ2lzdGVyaW5nIGFsc28KLQkJLy8gcHJvdmlkZXMgYXV0b21hdGljIGRpc3Bvc2FsIG9mIHRoZSBhY3Rpb25zIHdoZW4gdGhlIHdpbmRvdyBpcyBjbG9zZWQuCi0KLQkJbmV3QWN0aW9uID0gQWN0aW9uRmFjdG9yeS5ORVcuY3JlYXRlKHdpbmRvdyk7Ci0JCXJlZ2lzdGVyKG5ld0FjdGlvbik7Ci0KLQkJY2xvc2VBY3Rpb24gPSBBY3Rpb25GYWN0b3J5LkNMT1NFLmNyZWF0ZSh3aW5kb3cpOwotCQlyZWdpc3RlcihjbG9zZUFjdGlvbik7Ci0KLQkJY2xvc2VBbGxBY3Rpb24gPSBBY3Rpb25GYWN0b3J5LkNMT1NFX0FMTC5jcmVhdGUod2luZG93KTsKLQkJcmVnaXN0ZXIoY2xvc2VBbGxBY3Rpb24pOwotCi0JCXNhdmVBY3Rpb24gPSBBY3Rpb25GYWN0b3J5LlNBVkUuY3JlYXRlKHdpbmRvdyk7Ci0JCXJlZ2lzdGVyKHNhdmVBY3Rpb24pOwotCi0JCXNhdmVBc0FjdGlvbiA9IEFjdGlvbkZhY3RvcnkuU0FWRV9BUy5jcmVhdGUod2luZG93KTsKLQkJcmVnaXN0ZXIoc2F2ZUFzQWN0aW9uKTsKLQotCQlzYXZlQWxsQWN0aW9uID0gQWN0aW9uRmFjdG9yeS5TQVZFX0FMTC5jcmVhdGUod2luZG93KTsKLQkJcmVnaXN0ZXIoc2F2ZUFsbEFjdGlvbik7Ci0KLQkJcmV2ZXJ0QWN0aW9uID0gQWN0aW9uRmFjdG9yeS5SRVZFUlQuY3JlYXRlKHdpbmRvdyk7Ci0JCXJlZ2lzdGVyKHJldmVydEFjdGlvbik7Ci0KLQkJbW92ZUFjdGlvbiA9IEFjdGlvbkZhY3RvcnkuTU9WRS5jcmVhdGUod2luZG93KTsKLQkJcmVnaXN0ZXIobW92ZUFjdGlvbik7Ci0KLQkJcmVuYW1lQWN0aW9uID0gQWN0aW9uRmFjdG9yeS5SRU5BTUUuY3JlYXRlKHdpbmRvdyk7Ci0JCXJlZ2lzdGVyKHJlbmFtZUFjdGlvbik7Ci0KLQkJcmVmcmVzaEFjdGlvbiA9IEFjdGlvbkZhY3RvcnkuUkVGUkVTSC5jcmVhdGUod2luZG93KTsKLQkJcmVnaXN0ZXIocmVmcmVzaEFjdGlvbik7Ci0KLQkJaW1wb3J0QWN0aW9uID0gVUlBY3Rpb25GYWN0b3J5LlVJX0lNUE9SVC5jcmVhdGUod2luZG93KTsKLQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChpbXBvcnRBY3Rpb24sCi0JCQkJQXV0aG9yaW5nVUlIZWxwQ29udGV4dHMuRklMRV9JTVBPUlRfQ09OVEVYVCk7Ci0JCXJlZ2lzdGVyKGltcG9ydEFjdGlvbik7Ci0KLQkJZXhwb3J0QWN0aW9uID0gVUlBY3Rpb25GYWN0b3J5LlVJX0VYUE9SVC5jcmVhdGUod2luZG93KTsKLQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChleHBvcnRBY3Rpb24sCi0JCQkJQXV0aG9yaW5nVUlIZWxwQ29udGV4dHMuRklMRV9FWFBPUlRfQ09OVEVYVCk7Ci0JCXJlZ2lzdGVyKGV4cG9ydEFjdGlvbik7Ci0KLQkJcHJvcGVydGllc0FjdGlvbiA9IEFjdGlvbkZhY3RvcnkuUFJPUEVSVElFUy5jcmVhdGUod2luZG93KTsKLQkJcmVnaXN0ZXIocHJvcGVydGllc0FjdGlvbik7Ci0KLQkJZXhpdEFjdGlvbiA9IEFjdGlvbkZhY3RvcnkuUVVJVC5jcmVhdGUod2luZG93KTsKLQkJcmVnaXN0ZXIoZXhpdEFjdGlvbik7Ci0KLQkJb3BlbkVsZW1lbnRBY3Rpb24gPSBVSUFjdGlvbkZhY3RvcnkuT1BFTl9FTEVNRU5ULmNyZWF0ZSh3aW5kb3cpOwotCQlyZWdpc3RlcihvcGVuRWxlbWVudEFjdGlvbik7Ci0KLQkJdW5kb0FjdGlvbiA9IEFjdGlvbkZhY3RvcnkuVU5ETy5jcmVhdGUod2luZG93KTsKLQkJcmVnaXN0ZXIodW5kb0FjdGlvbik7Ci0KLQkJcmVkb0FjdGlvbiA9IEFjdGlvbkZhY3RvcnkuUkVETy5jcmVhdGUod2luZG93KTsKLQkJcmVnaXN0ZXIocmVkb0FjdGlvbik7Ci0KLQkJY3V0QWN0aW9uID0gQWN0aW9uRmFjdG9yeS5DVVQuY3JlYXRlKHdpbmRvdyk7Ci0JCXJlZ2lzdGVyKGN1dEFjdGlvbik7Ci0KLQkJY29weUFjdGlvbiA9IEFjdGlvbkZhY3RvcnkuQ09QWS5jcmVhdGUod2luZG93KTsKLQkJcmVnaXN0ZXIoY29weUFjdGlvbik7Ci0KLQkJcGFzdGVBY3Rpb24gPSBBY3Rpb25GYWN0b3J5LlBBU1RFLmNyZWF0ZSh3aW5kb3cpOwotCQlyZWdpc3RlcihwYXN0ZUFjdGlvbik7Ci0KLQkJZGVsZXRlQWN0aW9uID0gQWN0aW9uRmFjdG9yeS5ERUxFVEUuY3JlYXRlKHdpbmRvdyk7Ci0JCXJlZ2lzdGVyKGRlbGV0ZUFjdGlvbik7Ci0KLQkJc2VsZWN0QWxsQWN0aW9uID0gQWN0aW9uRmFjdG9yeS5TRUxFQ1RfQUxMLmNyZWF0ZSh3aW5kb3cpOwotCQlyZWdpc3RlcihzZWxlY3RBbGxBY3Rpb24pOwotCi0JCWZpbmRBY3Rpb24gPSBBY3Rpb25GYWN0b3J5LkZJTkQuY3JlYXRlKHdpbmRvdyk7Ci0JCXJlZ2lzdGVyKGZpbmRBY3Rpb24pOwotCi0JCWdvSW50b0FjdGlvbiA9IEFjdGlvbkZhY3RvcnkuR09fSU5UTy5jcmVhdGUod2luZG93KTsKLQkJcmVnaXN0ZXIoZ29JbnRvQWN0aW9uKTsKLQotCQluZXh0QWN0aW9uID0gQWN0aW9uRmFjdG9yeS5ORVhULmNyZWF0ZSh3aW5kb3cpOwotCQlyZWdpc3RlcihuZXh0QWN0aW9uKTsKLQotCQlwcmV2aW91c0FjdGlvbiA9IEFjdGlvbkZhY3RvcnkuUFJFVklPVVMuY3JlYXRlKHdpbmRvdyk7Ci0JCXJlZ2lzdGVyKHByZXZpb3VzQWN0aW9uKTsKLQotCQliYWNrQWN0aW9uID0gQWN0aW9uRmFjdG9yeS5CQUNLLmNyZWF0ZSh3aW5kb3cpOwotCQlyZWdpc3RlcihiYWNrQWN0aW9uKTsKLQotCQlmb3J3YXJkQWN0aW9uID0gQWN0aW9uRmFjdG9yeS5GT1JXQVJELmNyZWF0ZSh3aW5kb3cpOwotCQlyZWdpc3Rlcihmb3J3YXJkQWN0aW9uKTsKLQotCQlvcGVuTmV3V2luZG93QWN0aW9uID0gQWN0aW9uRmFjdG9yeS5PUEVOX05FV19XSU5ET1cuY3JlYXRlKHdpbmRvdyk7Ci0JCXJlZ2lzdGVyKG9wZW5OZXdXaW5kb3dBY3Rpb24pOwotCi0JCW5leHRFZGl0b3JBY3Rpb24gPSBBY3Rpb25GYWN0b3J5Lk5FWFRfRURJVE9SLmNyZWF0ZSh3aW5kb3cpOwotCQlyZWdpc3RlcihuZXh0RWRpdG9yQWN0aW9uKTsKLQotCQlwcmV2aW91c0VkaXRvckFjdGlvbiA9IEFjdGlvbkZhY3RvcnkuUFJFVklPVVNfRURJVE9SLmNyZWF0ZSh3aW5kb3cpOwotCQlyZWdpc3RlcihwcmV2aW91c0VkaXRvckFjdGlvbik7Ci0KLQkJbmV4dFBhcnRBY3Rpb24gPSBBY3Rpb25GYWN0b3J5Lk5FWFRfUEFSVC5jcmVhdGUod2luZG93KTsKLQkJcmVnaXN0ZXIobmV4dFBhcnRBY3Rpb24pOwotCi0JCXByZXZpb3VzUGFydEFjdGlvbiA9IEFjdGlvbkZhY3RvcnkuUFJFVklPVVNfUEFSVC5jcmVhdGUod2luZG93KTsKLQkJcmVnaXN0ZXIocHJldmlvdXNQYXJ0QWN0aW9uKTsKLQotCQluZXh0UGVyc3BlY3RpdmVBY3Rpb24gPSBBY3Rpb25GYWN0b3J5Lk5FWFRfUEVSU1BFQ1RJVkUuY3JlYXRlKHdpbmRvdyk7Ci0JCXJlZ2lzdGVyKG5leHRQZXJzcGVjdGl2ZUFjdGlvbik7Ci0KLQkJcHJldmlvdXNQZXJzcGVjdGl2ZUFjdGlvbiA9IEFjdGlvbkZhY3RvcnkuUFJFVklPVVNfUEVSU1BFQ1RJVkUKLQkJCQkuY3JlYXRlKHdpbmRvdyk7Ci0JCXJlZ2lzdGVyKHByZXZpb3VzUGVyc3BlY3RpdmVBY3Rpb24pOwotCi0JCW9wZW5QZXJzcGVjdGl2ZURpYWxvZ0FjdGlvbiA9IGNyZWF0ZVROR09wZW5QZXJzcGVjdGl2ZURpYWxvZ0FjdGlvbih3aW5kb3cpOwotCQlvcGVuUGVyc3BlY3RpdmVEaWFsb2dBY3Rpb24uc2V0VGV4dChSQ1BVSVJlc291cmNlcy5vdGhlck1lbnVJdGVtX3RleHQpOwotCQlyZWdpc3RlcihvcGVuUGVyc3BlY3RpdmVEaWFsb2dBY3Rpb24pOwotCi0JCWN1c3RvbWl6ZVBlcnNwZWN0aXZlQWN0aW9uID0gQWN0aW9uRmFjdG9yeS5FRElUX0FDVElPTl9TRVRTCi0JCQkJLmNyZWF0ZSh3aW5kb3cpOwotCQlyZWdpc3RlcihjdXN0b21pemVQZXJzcGVjdGl2ZUFjdGlvbik7Ci0KLQkJc2F2ZVBlcnNwZWN0aXZlQWN0aW9uID0gQWN0aW9uRmFjdG9yeS5TQVZFX1BFUlNQRUNUSVZFLmNyZWF0ZSh3aW5kb3cpOwotCQlyZWdpc3RlcihzYXZlUGVyc3BlY3RpdmVBY3Rpb24pOwotCi0JCXJlc2V0UGVyc3BlY3RpdmVBY3Rpb24gPSBBY3Rpb25GYWN0b3J5LlJFU0VUX1BFUlNQRUNUSVZFLmNyZWF0ZSh3aW5kb3cpOwotCQlyZWdpc3RlcihyZXNldFBlcnNwZWN0aXZlQWN0aW9uKTsKLQotCQljbG9zZVBlcnNwZWN0aXZlQWN0aW9uID0gQWN0aW9uRmFjdG9yeS5DTE9TRV9QRVJTUEVDVElWRS5jcmVhdGUod2luZG93KTsKLQkJcmVnaXN0ZXIoY2xvc2VQZXJzcGVjdGl2ZUFjdGlvbik7Ci0KLQkJY2xvc2VBbGxQZXJzcGVjdGl2ZUFjdGlvbiA9IEFjdGlvbkZhY3RvcnkuQ0xPU0VfQUxMX1BFUlNQRUNUSVZFUwotCQkJCS5jcmVhdGUod2luZG93KTsKLQkJcmVnaXN0ZXIoY2xvc2VBbGxQZXJzcGVjdGl2ZUFjdGlvbik7Ci0KLQkJcHJlZmVyZW5jZXNBY3Rpb24gPSBBY3Rpb25GYWN0b3J5LlBSRUZFUkVOQ0VTLmNyZWF0ZSh3aW5kb3cpOwotCQlyZWdpc3RlcihwcmVmZXJlbmNlc0FjdGlvbik7Ci0KLQkJd2VsY29tZUFjdGlvbiA9IFVJQWN0aW9uRmFjdG9yeS5TSE9XX0lOVFJPLmNyZWF0ZSh3aW5kb3cpOwotCQlyZWdpc3Rlcih3ZWxjb21lQWN0aW9uKTsKLQkJSW1hZ2VEZXNjcmlwdG9yIGltZ0RlcyA9IFJDUFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoCi0JCQkJImZ1bGwvb2JqMTYvcHJvZHVjdC5naWYiKTsgLy8kTk9OLU5MUy0xJAotCQl3ZWxjb21lQWN0aW9uLnNldEltYWdlRGVzY3JpcHRvcihpbWdEZXMpOwotCi0JCWhlbHBDb250ZW50c0FjdGlvbiA9IEFjdGlvbkZhY3RvcnkuSEVMUF9DT05URU5UUy5jcmVhdGUod2luZG93KTsKLQkJcmVnaXN0ZXIoaGVscENvbnRlbnRzQWN0aW9uKTsKLQotCQlhYm91dEFjdGlvbiA9IEFjdGlvbkZhY3RvcnkuQUJPVVQuY3JlYXRlKHdpbmRvdyk7Ci0JCXJlZ2lzdGVyKGFib3V0QWN0aW9uKTsKLQotCQkvLyBGSVhNRSEgRmlsdGVyIG91dCBQcm9qZWN0Li4uIGZyb20gdGhlIGRyb3AtZG93biBtZW51LgotCQluZXdXaXphcmREcm9wRG93bkFjdGlvbiA9IElERUFjdGlvbkZhY3RvcnkuTkVXX1dJWkFSRF9EUk9QX0RPV04KLQkJCQkuY3JlYXRlKHdpbmRvdyk7Ci0JCXJlZ2lzdGVyKG5ld1dpemFyZERyb3BEb3duQWN0aW9uKTsKLQotCQlsb2NrVG9vbEJhckFjdGlvbiA9IEFjdGlvbkZhY3RvcnkuTE9DS19UT09MX0JBUi5jcmVhdGUod2luZG93KTsKLQkJcmVnaXN0ZXIobG9ja1Rvb2xCYXJBY3Rpb24pOwotCi0JCWVkaXRBY3Rpb25TZXRBY3Rpb24gPSBBY3Rpb25GYWN0b3J5LkVESVRfQUNUSU9OX1NFVFMuY3JlYXRlKHdpbmRvdyk7Ci0JCXJlZ2lzdGVyKGVkaXRBY3Rpb25TZXRBY3Rpb24pOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuYXBwbGljYXRpb24uQWN0aW9uQmFyQWR2aXNvciNmaWxsTWVudUJhcihJTWVudU1hbmFnZXIKLQkgKiAgICAgIG1lbnVCYXIpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZmlsbE1lbnVCYXIoSU1lbnVNYW5hZ2VyIG1lbnVCYXIpIHsKLQkJaWYgKFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuaXNDbG9zaW5nKCkpCi0JCQlyZXR1cm47Ci0JCW1haW5GaWxlTWVudSA9IGNyZWF0ZUZpbGVNZW51KG1lbnVCYXIpOwotCQltZW51QmFyLmFkZChtYWluRmlsZU1lbnUpOwotCQltZW51QmFyLmFkZChjcmVhdGVFZGl0TWVudShtZW51QmFyKSk7Ci0KLQkJSU1lbnVNYW5hZ2VyIG5hdk1hbmFnZXIgPSBjcmVhdGVOYXZpZ2F0ZU1lbnUobWVudUJhcik7Ci0JCW1lbnVCYXIuYWRkKG5hdk1hbmFnZXIpOwotCQluYXZNYW5hZ2VyLnNldFZpc2libGUoZmFsc2UpOwotCi0JCW1lbnVCYXIuYWRkKG5ldyBHcm91cE1hcmtlcihJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLk1CX0FERElUSU9OUykpOwotCQltZW51QmFyLmFkZChjcmVhdGVXaW5kb3dNZW51KG1lbnVCYXIpKTsKLQotCQltYWluSGVscE1lbnUgPSBjcmVhdGVIZWxwTWVudShtZW51QmFyKTsKLQkJbWVudUJhci5hZGQobWFpbkhlbHBNZW51KTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBGaWxlIG1lbnUgbWFuYWdlci4KLQkgKi8KLQlwdWJsaWMgTWVudU1hbmFnZXIgZ2V0RmlsZU1lbnVNYW5hZ2VyKCkgewotCQlyZXR1cm4gbWFpbkZpbGVNZW51OwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIEhlbHAgbWVudSBtYW5hZ2VyLgotCSAqLwotCXB1YmxpYyBNZW51TWFuYWdlciBnZXRIZWxwTWVudU1hbmFnZXIoKSB7Ci0JCXJldHVybiBtYWluSGVscE1lbnU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5hcHBsaWNhdGlvbi5BY3Rpb25CYXJBZHZpc29yI2ZpbGxDb29sQmFyKElDb29sQmFyTWFuYWdlcgotCSAqICAgICAgY29vbEJhcikKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmaWxsQ29vbEJhcihJQ29vbEJhck1hbmFnZXIgY29vbEJhcikgewotCQlpZiAoUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5pc0Nsb3NpbmcoKSkKLQkJCXJldHVybjsKLQkJY29vbEJhci5hZGQoY3JlYXRlRmlsZVRvb2xiYXIoY29vbEJhcikpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIEZpbGUgbWVudS4KLQkgKi8KLQlwcm90ZWN0ZWQgTWVudU1hbmFnZXIgY3JlYXRlRmlsZU1lbnUoSU1lbnVNYW5hZ2VyIG1lbnVCYXIpIHsKLQkJTWVudU1hbmFnZXIgZmlsZU1lbnUgPSBuZXcgTWVudU1hbmFnZXIoCi0JCQkJUkNQVUlSZXNvdXJjZXMuZmlsZU1lbnVJdGVtX3RleHQsCi0JCQkJSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5NX0ZJTEUpOwotCQlmaWxlTWVudS5hZGQobmV3IEdyb3VwTWFya2VyKElXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuRklMRV9TVEFSVCkpOwotCi0JCS8vIENyZWF0ZSB0aGUgTmV3IHN1YiBtZW51LCB1c2luZyB0aGUgc2FtZSBpZCBmb3IgaXQgYXMgdGhlIE5ldyBhY3Rpb24uCi0JCVN0cmluZyBuZXdUZXh0ID0gUkNQVUlSZXNvdXJjZXMuZmlsZU5ld01lbnVJdGVtX3RleHQ7Ci0JCVN0cmluZyBuZXdJZCA9IEFjdGlvbkZhY3RvcnkuTkVXLmdldElkKCk7Ci0JCU1lbnVNYW5hZ2VyIG5ld01lbnUgPSBuZXcgTWVudU1hbmFnZXIobmV3VGV4dCwgbmV3SWQpIHsKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWVudVRleHQoKSB7Ci0JCQkJcmV0dXJuIHN1cGVyLmdldE1lbnVUZXh0KCk7Ci0JCQl9Ci0JCX07Ci0JCW5ld01lbnUuYWRkKG5ldyBTZXBhcmF0b3IobmV3SWQpKTsKLQkJbmV3TWVudS5hZGQobmV3IE5ld1dpemFyZE1lbnUoZ2V0V2luZG93KCksIG51bGwpKTsKLQkJbmV3TWVudS5hZGQobmV3IFNlcGFyYXRvcihJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLk1CX0FERElUSU9OUykpOwotCQlmaWxlTWVudS5hZGQobmV3TWVudSk7Ci0JCWZpbGVNZW51LmFkZChuZXcgR3JvdXBNYXJrZXIoSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5ORVdfRVhUKSk7Ci0KLQkJZmlsZU1lbnUuYWRkKG5ldyBTZXBhcmF0b3IoKSk7Ci0JCU1lbnVNYW5hZ2VyIG9wZW5TdWJNZW51ID0gbmV3IE1lbnVNYW5hZ2VyKAotCQkJCVJDUFVJUmVzb3VyY2VzLmZpbGVPcGVuTWVudUl0ZW1fdGV4dCwKLQkJCQlJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLk9QRU5fRVhUKTsKLQkJb3BlblN1Yk1lbnUKLQkJCQkuYWRkKG5ldyBHcm91cE1hcmtlcihJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLk1CX0FERElUSU9OUykpOwotCQlvcGVuU3ViTWVudS5hZGQobmV3IFNlcGFyYXRvcigpKTsKLQkJZmlsZU1lbnUuYWRkKG9wZW5TdWJNZW51KTsKLQotCQlmaWxlTWVudS5hZGQoY2xvc2VBY3Rpb24pOwotCQlmaWxlTWVudS5hZGQoY2xvc2VBbGxBY3Rpb24pOwotCQlmaWxlTWVudS5hZGQobmV3IFNlcGFyYXRvcigpKTsKLQkJZmlsZU1lbnUuYWRkKHNhdmVBY3Rpb24pOwotCQlmaWxlTWVudS5hZGQoc2F2ZUFzQWN0aW9uKTsKLQkJZmlsZU1lbnUuYWRkKHNhdmVBbGxBY3Rpb24pOwotCQlmaWxlTWVudS5hZGQocmV2ZXJ0QWN0aW9uKTsKLQkJZmlsZU1lbnUuYWRkKG5ldyBTZXBhcmF0b3IoKSk7Ci0JCWZpbGVNZW51LmFkZChtb3ZlQWN0aW9uKTsKLQkJZmlsZU1lbnUuYWRkKHJlbmFtZUFjdGlvbik7Ci0JCWZpbGVNZW51LmFkZChyZWZyZXNoQWN0aW9uKTsKLQkJZmlsZU1lbnUuYWRkKG5ldyBTZXBhcmF0b3IoKSk7Ci0JCWZpbGVNZW51LmFkZChpbXBvcnRBY3Rpb24pOwotCQlmaWxlTWVudS5hZGQoZXhwb3J0QWN0aW9uKTsKLQkJZmlsZU1lbnUuYWRkKG5ldyBTZXBhcmF0b3IoKSk7Ci0JCWZpbGVNZW51LmFkZChwcm9wZXJ0aWVzQWN0aW9uKTsKLQkJZmlsZU1lbnUuYWRkKG5ldyBTZXBhcmF0b3IoKSk7Ci0JCWZpbGVNZW51LmFkZChleGl0QWN0aW9uKTsKLQkJZmlsZU1lbnUuYWRkKG5ldyBHcm91cE1hcmtlcihJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLkZJTEVfRU5EKSk7Ci0KLQkJcmV0dXJuIGZpbGVNZW51OwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIEVkaXQgbWVudS4KLQkgKi8KLQlwcm90ZWN0ZWQgTWVudU1hbmFnZXIgY3JlYXRlRWRpdE1lbnUoSU1lbnVNYW5hZ2VyIG1lbnVCYXIpIHsKLQkJTWVudU1hbmFnZXIgZWRpdE1lbnUgPSBuZXcgTWVudU1hbmFnZXIoCi0JCQkJUkNQVUlSZXNvdXJjZXMuZWRpdE1lbnVJdGVtX3RleHQsCi0JCQkJSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5NX0VESVQpOwotCQllZGl0TWVudS5hZGQobmV3IEdyb3VwTWFya2VyKElXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuRURJVF9TVEFSVCkpOwotCQllZGl0TWVudS5hZGQobmV3IEdyb3VwTWFya2VyKElXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuTUJfQURESVRJT05TKSk7Ci0JCWVkaXRNZW51LmFkZChuZXcgU2VwYXJhdG9yKCkpOwotCQllZGl0TWVudS5hZGQobmV3IEdyb3VwTWFya2VyKCJvcGVuZ3JvdXAiKSk7IC8vJE5PTi1OTFMtMSQKLQkJZWRpdE1lbnUuYWRkKG9wZW5FbGVtZW50QWN0aW9uKTsKLQkJZWRpdE1lbnUuYWRkKGN1dEFjdGlvbik7Ci0JCWVkaXRNZW51LmFkZChjb3B5QWN0aW9uKTsKLQkJZWRpdE1lbnUuYWRkKHBhc3RlQWN0aW9uKTsKLQkJZWRpdE1lbnUuYWRkKG5ldyBTZXBhcmF0b3IoKSk7Ci0JCWVkaXRNZW51LmFkZChkZWxldGVBY3Rpb24pOwotCQllZGl0TWVudS5hZGQoc2VsZWN0QWxsQWN0aW9uKTsKLQkJZWRpdE1lbnUuYWRkKG5ldyBTZXBhcmF0b3IoKSk7Ci0JCWVkaXRNZW51LmFkZChmaW5kQWN0aW9uKTsKLQkJZWRpdE1lbnUuYWRkKG5ldyBHcm91cE1hcmtlcihJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLkVESVRfRU5EKSk7Ci0JCXJldHVybiBlZGl0TWVudTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBOYXZpZ2F0ZSBtZW51LgotCSAqLwotCXByb3RlY3RlZCBNZW51TWFuYWdlciBjcmVhdGVOYXZpZ2F0ZU1lbnUoSU1lbnVNYW5hZ2VyIG1lbnVCYXIpIHsKLQkJTWVudU1hbmFnZXIgbmF2TWVudSA9IG5ldyBNZW51TWFuYWdlcigKLQkJCQlSQ1BVSVJlc291cmNlcy5uYXZpZ2F0ZU1lbnVJdGVtX3RleHQsCi0JCQkJSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5NX05BVklHQVRFKTsKLQkJbmF2TWVudS5hZGQobmV3IEdyb3VwTWFya2VyKElXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuTUJfQURESVRJT05TKSk7Ci0JCW5hdk1lbnUuYWRkKGdvSW50b0FjdGlvbik7Ci0JCW5hdk1lbnUuYWRkKG5ldyBTZXBhcmF0b3IoKSk7Ci0JCW5hdk1lbnUuYWRkKG5leHRBY3Rpb24pOwotCQluYXZNZW51LmFkZChwcmV2aW91c0FjdGlvbik7Ci0JCW5hdk1lbnUuYWRkKG5ldyBTZXBhcmF0b3IoKSk7Ci0JCW5hdk1lbnUuYWRkKGJhY2tBY3Rpb24pOwotCQluYXZNZW51LmFkZChmb3J3YXJkQWN0aW9uKTsKLQkJbmF2TWVudS5hZGQobmV3IEdyb3VwTWFya2VyKElXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuV0JfRU5EKSk7Ci0JCXJldHVybiBuYXZNZW51OwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIFdpbmRvdyBtZW51LgotCSAqLwotCXByb3RlY3RlZCBNZW51TWFuYWdlciBjcmVhdGVXaW5kb3dNZW51KElNZW51TWFuYWdlciBtZW51QmFyKSB7Ci0JCU1lbnVNYW5hZ2VyIHdpbmRvd01lbnUgPSBuZXcgTWVudU1hbmFnZXIoCi0JCQkJUkNQVUlSZXNvdXJjZXMud2luZG93TWVudUl0ZW1fdGV4dCwKLQkJCQlJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLk1fV0lORE9XKTsKLQkJd2luZG93TWVudS5hZGQobmV3IEdyb3VwTWFya2VyKElXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuV0JfU1RBUlQpKTsKLQkJd2luZG93TWVudS5hZGQobmV3IEdyb3VwTWFya2VyKElXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuTUJfQURESVRJT05TKSk7Ci0KLQkJTWVudU1hbmFnZXIgY2hhbmdlUGVyc3BNZW51TWdyID0gbmV3IE1lbnVNYW5hZ2VyKAotCQkJCVJDUFVJUmVzb3VyY2VzLndpbmRvd09wZW5QZXJzcGVjdGl2ZU1lbnVJdGVtX3RleHQsCi0JCQkJIm9wZW5QZXJzcGVjdGl2ZSIpOyAvLyROT04tTkxTLTEkCi0JCUlDb250cmlidXRpb25JdGVtIGNoYW5nZVBlcnNwTWVudUl0ZW0gPSBDb250cmlidXRpb25JdGVtRmFjdG9yeS5QRVJTUEVDVElWRVNfU0hPUlRMSVNUCi0JCQkJLmNyZWF0ZShnZXRXaW5kb3coKSk7Ci0JCWNoYW5nZVBlcnNwTWVudU1nci5hZGQoY2hhbmdlUGVyc3BNZW51SXRlbSk7Ci0JCXdpbmRvd01lbnUuYWRkKGNoYW5nZVBlcnNwTWVudU1ncik7Ci0JCU1lbnVNYW5hZ2VyIHNob3dWaWV3TWVudU1nciA9IG5ldyBNZW51TWFuYWdlcigKLQkJCQlSQ1BVSVJlc291cmNlcy53aW5kb3dTaG93Vmlld01lbnVJdGVtX3RleHQsICJzaG93VmlldyIpOyAvLyROT04tTkxTLTEkCi0JCUlDb250cmlidXRpb25JdGVtIHNob3dWaWV3TWVudSA9IENvbnRyaWJ1dGlvbkl0ZW1GYWN0b3J5LlZJRVdTX1NIT1JUTElTVAotCQkJCS5jcmVhdGUoZ2V0V2luZG93KCkpOwotCQlzaG93Vmlld01lbnVNZ3IuYWRkKHNob3dWaWV3TWVudSk7Ci0JCXdpbmRvd01lbnUuYWRkKHNob3dWaWV3TWVudU1ncik7Ci0KLQkJd2luZG93TWVudS5hZGQobmV3IFNlcGFyYXRvcigpKTsKLQkJd2luZG93TWVudS5hZGQoY3VzdG9taXplUGVyc3BlY3RpdmVBY3Rpb24pOwotCQl3aW5kb3dNZW51LmFkZChzYXZlUGVyc3BlY3RpdmVBY3Rpb24pOwotCQl3aW5kb3dNZW51LmFkZChyZXNldFBlcnNwZWN0aXZlQWN0aW9uKTsKLQkJd2luZG93TWVudS5hZGQoY2xvc2VQZXJzcGVjdGl2ZUFjdGlvbik7Ci0JCXdpbmRvd01lbnUuYWRkKGNsb3NlQWxsUGVyc3BlY3RpdmVBY3Rpb24pOwotCQl3aW5kb3dNZW51LmFkZChuZXcgU2VwYXJhdG9yKCkpOwotCQl3aW5kb3dNZW51LmFkZChwcmVmZXJlbmNlc0FjdGlvbik7Ci0JCXdpbmRvd01lbnUuYWRkKG5ldyBHcm91cE1hcmtlcihJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLldCX0VORCkpOwotCQlyZXR1cm4gd2luZG93TWVudTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVJbnRlcm5hbE1lbnUoZmluYWwgSU1lbnVNYW5hZ2VyIGhlbHBNbWVudSkgewotCQlpbnRlcm5hbE1lbnUgPSBuZXcgTWVudU1hbmFnZXIoCi0JCQkJUkNQVUlSZXNvdXJjZXMubWFpbkFjdGlvbkJhckFkdmlzb3JfRGlhZ25vc2lzLCAiIik7IC8vJE5PTi1OTFMtMSQKLQotCQlpbnRlcm5hbE1lbnUuYWRkKG5ldyBBY3Rpb24oCi0JCQkJUkNQVUlSZXNvdXJjZXMubWFpbkFjdGlvbkJhckFkdmlzb3JfSGVhbHRoQ2hlY2spIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlWaWV3SGVscGVyLmNoZWNrTGlicmFyeUhlYWx0aCgpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBIZWxwIG1lbnUuCi0JICovCi0JcHJvdGVjdGVkIE1lbnVNYW5hZ2VyIGNyZWF0ZUhlbHBNZW51KElNZW51TWFuYWdlciBtZW51QmFyKSB7Ci0JCU1lbnVNYW5hZ2VyIGhlbHBNbWVudSA9IG5ldyBNZW51TWFuYWdlcigKLQkJCQlSQ1BVSVJlc291cmNlcy5oZWxwTWVudUl0ZW1fdGV4dCwKLQkJCQlJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLk1fSEVMUCk7Ci0JCWhlbHBNbWVudS5hZGQobmV3IEdyb3VwTWFya2VyKElXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuSEVMUF9TVEFSVCkpOwotCQloZWxwTW1lbnUuYWRkKHdlbGNvbWVBY3Rpb24pOwotCi0JCWhlbHBNbWVudS5hZGQobmV3IFNlcGFyYXRvcigpKTsKLQkJaGVscE1tZW51LmFkZChoZWxwQ29udGVudHNBY3Rpb24pOwotCQloZWxwTW1lbnUuYWRkKG5ldyBHcm91cE1hcmtlcigiZ3JvdXAuaGVscCIpKTsgLy8kTk9OLU5MUy0xJAotCi0JCWhlbHBNbWVudS5hZGQobmV3IFNlcGFyYXRvcigpKTsKLQkJaGVscE1tZW51LmFkZChuZXcgR3JvdXBNYXJrZXIoImdyb3VwLmFzc2lzdCIpKTsgLy8kTk9OLU5MUy0xJAotCi0JCWhlbHBNbWVudS5hZGQobmV3IFNlcGFyYXRvcigpKTsKLQkJaGVscE1tZW51LmFkZChuZXcgR3JvdXBNYXJrZXIoImdyb3VwLnRvb2xzIikpOyAvLyROT04tTkxTLTEkCi0KLQkJaGVscE1tZW51LmFkZChuZXcgU2VwYXJhdG9yKCkpOwotCQloZWxwTW1lbnUuYWRkKG5ldyBHcm91cE1hcmtlcigiZ3JvdXAudXBkYXRlcyIpKTsgLy8kTk9OLU5MUy0xJAotCi0JCS8vIE1lbnUgaXRlbXMgZm9yIGludGVybmFsIHRvb2wKLQkJaGVscE1tZW51LmFkZChuZXcgU2VwYXJhdG9yKCkpOwotCQloZWxwTW1lbnUuYWRkKG5ldyBHcm91cE1hcmtlcigiZ3JvdXAuaW50ZXJuYWwiKSk7IC8vJE5PTi1OTFMtMSQKLQkJY3JlYXRlSW50ZXJuYWxNZW51KGhlbHBNbWVudSk7Ci0KLQkJaGVscE1tZW51LmFkZChuZXcgU2VwYXJhdG9yKCkpOwotCQloZWxwTW1lbnUuYWRkKGFib3V0QWN0aW9uKTsKLQkJaGVscE1tZW51LmFkZChuZXcgR3JvdXBNYXJrZXIoSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5IRUxQX0VORCkpOwotCi0JCXJldHVybiBoZWxwTW1lbnU7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgRmlsZSB0b29sYmFyLgotCSAqLwotCXByb3RlY3RlZCBJVG9vbEJhck1hbmFnZXIgY3JlYXRlRmlsZVRvb2xiYXIoSUNvb2xCYXJNYW5hZ2VyIGNvb2xCYXIpIHsKLQkJSUFjdGlvbkJhckNvbmZpZ3VyZXIyIGFjdGlvbkJhckNvbmZpZ3VyZXIgPSAoSUFjdGlvbkJhckNvbmZpZ3VyZXIyKSBnZXRBY3Rpb25CYXJDb25maWd1cmVyKCk7Ci0JCUlNZW51TWFuYWdlciBwb3BVcE1lbnUgPSBuZXcgTWVudU1hbmFnZXIoKTsKLQkJcG9wVXBNZW51LmFkZChuZXcgQWN0aW9uQ29udHJpYnV0aW9uSXRlbShsb2NrVG9vbEJhckFjdGlvbikpOwotCQlwb3BVcE1lbnUuYWRkKG5ldyBBY3Rpb25Db250cmlidXRpb25JdGVtKGVkaXRBY3Rpb25TZXRBY3Rpb24pKTsKLQkJY29vbEJhci5zZXRDb250ZXh0TWVudU1hbmFnZXIocG9wVXBNZW51KTsKLQotCQljb29sQmFyLmFkZChuZXcgR3JvdXBNYXJrZXIoSUlERUFjdGlvbkNvbnN0YW50cy5HUk9VUF9GSUxFKSk7Ci0JCUlUb29sQmFyTWFuYWdlciBmaWxlVG9vbEJhciA9IGFjdGlvbkJhckNvbmZpZ3VyZXIKLQkJCQkuY3JlYXRlVG9vbEJhck1hbmFnZXIoKTsKLQkJZmlsZVRvb2xCYXIuYWRkKG5ldyBTZXBhcmF0b3IoSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5ORVdfR1JPVVApKTsKLQkJZmlsZVRvb2xCYXIuYWRkKG5ld1dpemFyZERyb3BEb3duQWN0aW9uKTsKLQkJZmlsZVRvb2xCYXIuYWRkKG5ldyBHcm91cE1hcmtlcihJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLk5FV19FWFQpKTsKLQkJZmlsZVRvb2xCYXIuYWRkKG5ldyBHcm91cE1hcmtlcihJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLlNBVkVfR1JPVVApKTsKLQkJZmlsZVRvb2xCYXIuYWRkKHNhdmVBY3Rpb24pOwotCQlmaWxlVG9vbEJhci5hZGQoc2F2ZUFsbEFjdGlvbik7Ci0JCWZpbGVUb29sQmFyLmFkZChuZXcgR3JvdXBNYXJrZXIoSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5TQVZFX0VYVCkpOwotCQlmaWxlVG9vbEJhci5hZGQobmV3IFNlcGFyYXRvcihJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLk1CX0FERElUSU9OUykpOwotCi0JCXJldHVybiBmaWxlVG9vbEJhcjsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBjdXN0b20gb3BlbiBwZXJzcGVjdGl2ZSBkaWFsb2cKLQkgKiAKLQkgKiBAcGFyYW0gd2luZG93Ci0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBJV29ya2JlbmNoQWN0aW9uIGNyZWF0ZVROR09wZW5QZXJzcGVjdGl2ZURpYWxvZ0FjdGlvbigKLQkJCUlXb3JrYmVuY2hXaW5kb3cgd2luZG93KSB7Ci0JCWlmICh3aW5kb3cgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotCQl9Ci0JCUlXb3JrYmVuY2hBY3Rpb24gYWN0aW9uID0gbmV3IFVJT3BlblBlcnNwZWN0aXZlRGlhbG9nQWN0aW9uKHdpbmRvdyk7Ci0JCWFjdGlvbi5zZXRJZCgib3BlblBlcnNwZWN0aXZlRGlhbG9nIik7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIGFjdGlvbjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9yY3AvdWkvTWFpbkFwcGxpY2F0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmNwL3VpL01haW5BcHBsaWNhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNDU4YzhlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9yY3AvdWkvTWFpbkFwcGxpY2F0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnJjcC51aTsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24uc2VydmljZS51dGlscy5Db21tYW5kTGluZVJ1blV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuTGlicmFyeVVJTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmFwcC5JQXBwbGljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5hcHAuSUFwcGxpY2F0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLmRhdGFsb2NhdGlvbi5Mb2NhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBjb250cm9scyBhbGwgYXNwZWN0cyBvZiB0aGUgYXBwbGljYXRpb24ncyBleGVjdXRpb24uCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTWFpbkFwcGxpY2F0aW9uIGltcGxlbWVudHMgSUFwcGxpY2F0aW9uIHsKLQkKLQkvLyBEYXRhIG1vZGUgY29uc3RhbnRzIGZvciB1c2VyLCBjb25maWd1cmF0aW9uIGFuZCBkYXRhIGxvY2F0aW9ucy4KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9ORSA9ICJAbm9uZSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9fREVGQVVMVCA9ICJAbm9EZWZhdWx0IjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBVU0VSX0hPTUUgPSAiQHVzZXIuaG9tZSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVNFUl9ESVIgPSAiQHVzZXIuZGlyIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BfVVNFUl9IT01FID0gInVzZXIuaG9tZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QX1VTRVJfRElSID0gInVzZXIuZGlyIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVxdWlub3guYXBwLklBcHBsaWNhdGlvbiNzdGFydChvcmcuZWNsaXBzZS5lcXVpbm94LmFwcC5JQXBwbGljYXRpb25Db250ZXh0KQotCSAqLwotCXB1YmxpYyBPYmplY3Qgc3RhcnQoSUFwcGxpY2F0aW9uQ29udGV4dCBjb250ZXh0KSB7Ci0JCURpc3BsYXkgZGlzcGxheSA9IFBsYXRmb3JtVUkuY3JlYXRlRGlzcGxheSgpOwotCQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5LCBTV1QuT05fVE9QKTsKLQkJdHJ5IHsKLQkJCWJvb2xlYW4gbm9Mb2NrID0gZmFsc2U7Ci0JCQlTdHJpbmdbXSBhcHBBcmdzID0gUGxhdGZvcm0uZ2V0QXBwbGljYXRpb25BcmdzKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGFwcEFyZ3MubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAoYXBwQXJnc1tpXS5lcXVhbHNJZ25vcmVDYXNlKCItbGlicmFyeSIpICYmIGkgPCAoYXBwQXJncy5sZW5ndGggLSAxKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCVN0cmluZyBsb2NhdGlvbiA9IGFwcEFyZ3NbaSArIDFdOwotCQkJCQlsb2NhdGlvbiA9IGJ1aWxkTG9jYXRpb24obG9jYXRpb24pOwotCQkJCQlpZiAobG9jYXRpb24gIT0gbnVsbCkgewotCQkJCQkJTGlicmFyeVVJTWFuYWdlci5zZXRDb21tYW5kTGluZUxpYnJhcnkobG9jYXRpb24pOwotCQkJCQl9Ci0JCQkJfSBlbHNlIGlmIChhcHBBcmdzW2ldLmVxdWFsc0lnbm9yZUNhc2UoIi1kZWZhdWx0bGlicmFyeSIpICYmIGkgPCAoYXBwQXJncy5sZW5ndGggLSAxKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCVN0cmluZyBsb2NhdGlvbiA9IGFwcEFyZ3NbaSArIDFdOwotCQkJCQlsb2NhdGlvbiA9IGJ1aWxkTG9jYXRpb24obG9jYXRpb24pOwotCQkJCQlpZiAobG9jYXRpb24gIT0gbnVsbCkgewotCQkJCQkJTGlicmFyeVVJTWFuYWdlci5zZXRDb21tYW5kTGluZURlZmF1bHRMaWJyYXJ5KGxvY2F0aW9uKTsKLQkJCQkJfQotCQkJCX0gZWxzZSBpZiAoYXBwQXJnc1tpXS5lcXVhbHNJZ25vcmVDYXNlKCItbm9sb2NrIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQlub0xvY2sgPSB0cnVlOwotCQkJCX0gZWxzZSBpZiAoYXBwQXJnc1tpXS5lcXVhbHNJZ25vcmVDYXNlKCItYmF0Y2giKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCUNvbW1hbmRMaW5lUnVuVXRpbC5nZXRJbnN0YW5jZSgpLnNldE5lZWRUb1J1bih0cnVlKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmICghbm9Mb2NrICYmICFjaGVja1dvcmtzcGFjZUxvY2soc2hlbGwpKSB7Ci0JCQkJUGxhdGZvcm0uZW5kU3BsYXNoKCk7Ci0JCQkJcmV0dXJuIElBcHBsaWNhdGlvbi5FWElUX09LOwotCQkJfQotCi0JCQlpbnQgcmV0dXJuQ29kZSA9IGNyZWF0ZVdvcmtiZW5jaEFkdmlzb3IoZGlzcGxheSk7Ci0JCQlpZiAocmV0dXJuQ29kZSA9PSBQbGF0Zm9ybVVJLlJFVFVSTl9SRVNUQVJUKSB7Ci0JCQkJcmV0dXJuIElBcHBsaWNhdGlvbi5FWElUX1JFU1RBUlQ7Ci0JCQl9Ci0JCQlyZXR1cm4gSUFwcGxpY2F0aW9uLkVYSVRfT0s7Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAoc2hlbGwgIT0gbnVsbCkgewotCQkJCXNoZWxsLmRpc3Bvc2UoKTsKLQkJCX0KLQkJCWRpc3BsYXkuZGlzcG9zZSgpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVxdWlub3guYXBwLklBcHBsaWNhdGlvbiNzdG9wKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wKCkgewotCQlmaW5hbCBJV29ya2JlbmNoIHdvcmtiZW5jaCA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCk7Ci0JCWlmICh3b3JrYmVuY2ggPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gd29ya2JlbmNoLmdldERpc3BsYXkoKTsKLQkJZGlzcGxheS5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJaWYgKCFkaXNwbGF5LmlzRGlzcG9zZWQoKSkgewotCQkJCQl3b3JrYmVuY2guY2xvc2UoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIHdvcmtiZW5jaCBhZHZpc29yLgotCSAqLwotCXByb3RlY3RlZCBpbnQgY3JlYXRlV29ya2JlbmNoQWR2aXNvcihEaXNwbGF5IGRpc3BsYXkpIHsKLQkJcmV0dXJuIFBsYXRmb3JtVUkuY3JlYXRlQW5kUnVuV29ya2JlbmNoKGRpc3BsYXksCi0JCQkJbmV3IE1haW5Xb3JrYmVuY2hBZHZpc29yKCkpOwotCX0KLQotCS8qKgotCSAqIENoZWNrcyB0aGUgd29ya3NwYWNlIGxvY2sgdGhhdCBpcyB1c2VkIHRvIHByZXZlbnQgYSBsaWJyYXJ5IGJlZW4gb3BlbmVkCi0JICogbXVsdGlwbGUgdGltZXMuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gY2hlY2tXb3Jrc3BhY2VMb2NrKFNoZWxsIHNoZWxsKSB7Ci0JCUxvY2F0aW9uIHdvcmtzcGFjZUxvY2F0aW9uID0gUGxhdGZvcm0uZ2V0SW5zdGFuY2VMb2NhdGlvbigpOwotCQlTdHJpbmcgYXBwTmFtZSA9IFBsYXRmb3JtLmdldFByb2R1Y3QoKS5nZXROYW1lKCk7Ci0JCXRyeSB7Ci0JCQlpZiAod29ya3NwYWNlTG9jYXRpb24ubG9jaygpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCQlNZXNzYWdlRGlhbG9nLm9wZW5JbmZvcm1hdGlvbihzaGVsbCwgTkxTLmJpbmQoCi0JCQkJCVJDUFVJUmVzb3VyY2VzLndvcmtzcGFjZUNhbm5vdExvY2tUaXRsZSwgYXBwTmFtZSksIE5MUwotCQkJCQkuYmluZChSQ1BVSVJlc291cmNlcy53b3Jrc3BhY2VDYW5ub3RMb2NrTWVzc2FnZSwgYXBwTmFtZSkpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlSQ1BVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoCi0JCQkJCU5MUwotCQkJCQkJCS5iaW5kKFJDUFVJUmVzb3VyY2VzLndvcmtzcGFjZUNhbm5vdExvY2tNZXNzYWdlLAotCQkJCQkJCQkJYXBwTmFtZSksIGUpOwotCQkJTWVzc2FnZURpYWxvZy5vcGVuSW5mb3JtYXRpb24oc2hlbGwsIE5MUy5iaW5kKAotCQkJCQlSQ1BVSVJlc291cmNlcy53b3Jrc3BhY2VDYW5ub3RMb2NrVGl0bGUsIGFwcE5hbWUpLCBlCi0JCQkJCS5nZXRNZXNzYWdlKCkpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKgotCSAqIHRha2VuIGZyb20gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmFkYXB0b3IuTG9jYXRpb25NYW5hZ2VyLmJ1aWxkTG9jYXRpb24KLQkgKi8KLQlwcml2YXRlIFN0cmluZyBidWlsZExvY2F0aW9uKFN0cmluZyBsb2NhdGlvbikgewotCQlTdHJpbmcgdHJpbW1lZExvY2F0aW9uID0gbG9jYXRpb24udHJpbSgpOwotCQlTdHJpbmcgcmVzdWx0ID0gdHJpbW1lZExvY2F0aW9uOwotCQlpZiAodHJpbW1lZExvY2F0aW9uLmVxdWFsc0lnbm9yZUNhc2UoTk9ORSkpCi0JCQlyZXR1cm4gbnVsbDsKLQkJaWYgKHRyaW1tZWRMb2NhdGlvbi5lcXVhbHNJZ25vcmVDYXNlKE5PX0RFRkFVTFQpKQotCQkJcmV0dXJuIG51bGw7Ci0JCWlmICh0cmltbWVkTG9jYXRpb24uc3RhcnRzV2l0aChVU0VSX0hPTUUpKSB7Ci0JCQlTdHJpbmcgYmFzZSA9IHN1YnN0aXR1dGVWYXIobG9jYXRpb24sIFVTRVJfSE9NRSwgUFJPUF9VU0VSX0hPTUUpOwotCQkJcmVzdWx0ID0gbmV3IEZpbGUoYmFzZSkuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0JCX0gZWxzZSBpZiAodHJpbW1lZExvY2F0aW9uLnN0YXJ0c1dpdGgoVVNFUl9ESVIpKSB7Ci0JCQlTdHJpbmcgYmFzZSA9IHN1YnN0aXR1dGVWYXIobG9jYXRpb24sIFVTRVJfRElSLCBQUk9QX1VTRVJfRElSKTsKLQkJCXJlc3VsdCA9IG5ldyBGaWxlKGJhc2UpLmdldEFic29sdXRlUGF0aCgpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBzdWJzdGl0dXRlVmFyKFN0cmluZyBzb3VyY2UsIFN0cmluZyB2YXIsIFN0cmluZyBwcm9wKSB7Ci0JCVN0cmluZyB2YWx1ZSA9IFN5c3RlbS5nZXRQcm9wZXJ0eShwcm9wLCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIHZhbHVlICsgc291cmNlLnN1YnN0cmluZyh2YXIubGVuZ3RoKCkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3JjcC91aS9NYWluV29ya2JlbmNoQWR2aXNvci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3JjcC91aS9NYWluV29ya2JlbmNoQWR2aXNvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YmUzMzMxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9yY3AvdWkvTWFpbldvcmtiZW5jaEFkdmlzb3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxMCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucmNwLnVpOwotCi1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5GaWxlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdQZXJzcGVjdGl2ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnNlcnZpY2UudXRpbHMuQ29tbWFuZExpbmVSdW5VdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24uc2VydmljZWFiaWxpdHkuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5yZWZyZXNoLlJlZnJlc2hKb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JVmlld1JlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hcHBsaWNhdGlvbi5JV29ya2JlbmNoQ29uZmlndXJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hcHBsaWNhdGlvbi5JV29ya2JlbmNoV2luZG93Q29uZmlndXJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hcHBsaWNhdGlvbi5Xb3JrYmVuY2hBZHZpc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFwcGxpY2F0aW9uLldvcmtiZW5jaFdpbmRvd0Fkdmlzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaWRlLklERTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5Xb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmlkZS5JREVJbnRlcm5hbFdvcmtiZW5jaEltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5pZGUubW9kZWwuV29ya2JlbmNoQWRhcHRlckJ1aWxkZXI7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLQotLyoqCi0gKiBDcmVhdGVzIHRoZSB3aW5kb3cgYWR2aXNvciBhbmQgc3BlY2lmaWVzIHRoZSBwZXJzcGVjdGl2ZSBpZCBmb3IgdGhlIGluaXRpYWwKLSAqIHdpbmRvdy4KLSAqIAotICogQGF1dGhvciBCaW5neHVlIFh1Ci0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBNYWluV29ya2JlbmNoQWR2aXNvciBleHRlbmRzIFdvcmtiZW5jaEFkdmlzb3IgewotCi0JcHJvdGVjdGVkIExvZ2dlciBsb2dnZXI7Ci0KLQlwcml2YXRlIHZvaWQgZGVjbGFyZVdvcmtiZW5jaEltYWdlKEJ1bmRsZSBpZGVCdW5kbGUsIFN0cmluZyBzeW1ib2xpY05hbWUsCi0JCQlTdHJpbmcgcGF0aCwgYm9vbGVhbiBzaGFyZWQpIHsKLQkJVVJMIHVybCA9IEZpbGVMb2NhdG9yLmZpbmQoaWRlQnVuZGxlLCBuZXcgUGF0aChwYXRoKSwgbnVsbCk7Ci0JCUltYWdlRGVzY3JpcHRvciBkZXNjID0gSW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUZyb21VUkwodXJsKTsKLQkJZ2V0V29ya2JlbmNoQ29uZmlndXJlcigpLmRlY2xhcmVJbWFnZShzeW1ib2xpY05hbWUsIGRlc2MsIHNoYXJlZCk7Ci0JfQotCi0JLyoqCi0JICogRGVjbGFyZXMgYWxsIElERS1zcGVjaWZpYyB3b3JrYmVuY2ggaW1hZ2VzIHRoYXQgYXJlIHVzZWQgYnkgc29tZSBidW5kbGVkCi0JICogcGx1Z2lucwotCSAqIAotCSAqIEBzZWUgSVdvcmtiZW5jaENvbmZpZ3VyZXIjZGVjbGFyZUltYWdlCi0JICovCi0JcHJpdmF0ZSB2b2lkIGRlY2xhcmVXb3JrYmVuY2hJbWFnZXMoKSB7Ci0JCWZpbmFsIFN0cmluZyBJQ09OU19QQVRIID0gIiRubCQvaWNvbnMvZnVsbC8iOy8vJE5PTi1OTFMtMSQKLQkJZmluYWwgU3RyaW5nIFBBVEhfT0JKRUNUID0gSUNPTlNfUEFUSCArICJvYmoxNi8iOyAvLyBNb2RlbCBvYmplY3QgLy8gaWNvbnMvLyROT04tTkxTLTEkCi0JCWZpbmFsIFN0cmluZyBQQVRIX0VUT09MID0gSUNPTlNfUEFUSCArICJldG9vbDE2LyI7IC8vIEVuYWJsZWQgdG9vbGJhciBpY29ucy4vLyROT04tTkxTLTEkCi0KLQkJQnVuZGxlIGlkZUJ1bmRsZSA9IFBsYXRmb3JtLmdldEJ1bmRsZSgib3JnLmVjbGlwc2UudWkuaWRlIik7IC8vJE5PTi1OTFMtMSQKLQotCQlkZWNsYXJlV29ya2JlbmNoSW1hZ2UoaWRlQnVuZGxlLCBJREUuU2hhcmVkSW1hZ2VzLklNR19PQkpfUFJPSkVDVCwKLQkJCQlQQVRIX09CSkVDVCArICJwcmpfb2JqLmdpZiIsIHRydWUpOyAvLyROT04tTkxTLTEkCi0JCWRlY2xhcmVXb3JrYmVuY2hJbWFnZShpZGVCdW5kbGUsCi0JCQkJSURFLlNoYXJlZEltYWdlcy5JTUdfT0JKX1BST0pFQ1RfQ0xPU0VELCBQQVRIX09CSkVDVAotCQkJCQkJKyAiY3Byal9vYmouZ2lmIiwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKLQotCQlkZWNsYXJlV29ya2JlbmNoSW1hZ2UoaWRlQnVuZGxlLAotCQkJCUlERUludGVybmFsV29ya2JlbmNoSW1hZ2VzLklNR19PQkpTX0VSUk9SX1BBVEgsIFBBVEhfT0JKRUNUCi0JCQkJCQkrICJlcnJvcl90c2suZ2lmIiwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKLQkJZGVjbGFyZVdvcmtiZW5jaEltYWdlKGlkZUJ1bmRsZSwKLQkJCQlJREVJbnRlcm5hbFdvcmtiZW5jaEltYWdlcy5JTUdfT0JKU19XQVJOSU5HX1BBVEgsIFBBVEhfT0JKRUNUCi0JCQkJCQkrICJ3YXJuX3Rzay5naWYiLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotCQlkZWNsYXJlV29ya2JlbmNoSW1hZ2UoaWRlQnVuZGxlLAotCQkJCUlERUludGVybmFsV29ya2JlbmNoSW1hZ2VzLklNR19PQkpTX0lORk9fUEFUSCwgUEFUSF9PQkpFQ1QKLQkJCQkJCSsgImluZm9fdHNrLmdpZiIsIHRydWUpOyAvLyROT04tTkxTLTEkICAJICAJCi0JCWRlY2xhcmVXb3JrYmVuY2hJbWFnZShpZGVCdW5kbGUsCi0JCQkJSURFSW50ZXJuYWxXb3JrYmVuY2hJbWFnZXMuSU1HX0VUT09MX1BST0JMRU1fQ0FURUdPUlksCi0JCQkJUEFUSF9FVE9PTCArICJwcm9ibGVtX2NhdGVnb3J5LmdpZiIsIHRydWUpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLmFwcGxpY2F0aW9uLldvcmtiZW5jaEFkdmlzb3IjaW5pdGlhbGl6ZShJV29ya2JlbmNoQ29uZmlndXJlcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKElXb3JrYmVuY2hDb25maWd1cmVyIGNvbmZpZ3VyZXIpIHsKLQkJbG9nZ2VyID0gUkNQVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpOwotCQlzdXBlci5pbml0aWFsaXplKGNvbmZpZ3VyZXIpOwotCQljb25maWd1cmVyLnNldFNhdmVBbmRSZXN0b3JlKHRydWUpOwotCi0JCS8vIFJlbWVtYmVyIHRoZSBpbnN0YWxsIGRpciBhbmQgaGFuZGxlIHRoZSAtbGlicmFyeSBjb21tYW5kIGxpbmUKLQkJLy8gcGFyYW1ldGVyLgotCQlTdHJpbmcgYXBwU3RhcnREaXIgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoInVzZXIuZGlyIik7IC8vJE5PTi1OTFMtMSQKLQkJbG9nZ2VyLmxvZ0luZm8oUkNQVUlSZXNvdXJjZXMuc3RhcnR1cF9kaXJfbG9nX2luZm9fdGV4dCArIGFwcFN0YXJ0RGlyKTsgCi0KLQkJZGVjbGFyZVdvcmtiZW5jaEltYWdlcygpOwotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5hcHBsaWNhdGlvbi5Xb3JrYmVuY2hBZHZpc29yI2NyZWF0ZVdvcmtiZW5jaFdpbmRvd0Fkdmlzb3IoSVdvcmtiZW5jaFdpbmRvd0NvbmZpZ3VyZXIpCi0JICovCi0JcHVibGljIFdvcmtiZW5jaFdpbmRvd0Fkdmlzb3IgY3JlYXRlV29ya2JlbmNoV2luZG93QWR2aXNvcigKLQkJCUlXb3JrYmVuY2hXaW5kb3dDb25maWd1cmVyIGNvbmZpZ3VyZXIpIHsKLQkJcmV0dXJuIG5ldyBNYWluV29ya2JlbmNoV2luZG93QWR2aXNvcihjb25maWd1cmVyKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuYXBwbGljYXRpb24uV29ya2JlbmNoQWR2aXNvciNnZXRJbml0aWFsV2luZG93UGVyc3BlY3RpdmVJZCgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJbml0aWFsV2luZG93UGVyc3BlY3RpdmVJZCgpIHsKLQkJaWYgKFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuaXNDbG9zaW5nKCkpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIEF1dGhvcmluZ1BlcnNwZWN0aXZlLlBFUlNQRUNUSVZFX0lEOwotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5hcHBsaWNhdGlvbi5Xb3JrYmVuY2hBZHZpc29yI3ByZVN0YXJ0dXAoKQotCSAqLwotCXB1YmxpYyB2b2lkIHByZVN0YXJ0dXAoKSB7Ci0JCXN1cGVyLnByZVN0YXJ0dXAoKTsKLQkJV29ya2JlbmNoQWRhcHRlckJ1aWxkZXIucmVnaXN0ZXJBZGFwdGVycygpOwotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5hcHBsaWNhdGlvbi5Xb3JrYmVuY2hBZHZpc29yI3ByZVNodXRkb3duKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBwcmVTaHV0ZG93bigpIHsKLQkJLy8gUmVtZW1iZXIgd2hldGhlciB0aGUgd2VsY29tZSB2aWV3IGV4aXN0cyBvciBub3QgYmVmb3JlIGV4aXRpbmcuCi0JCUlXb3JrYmVuY2hXaW5kb3cgYWN0aXZlV2luZG93ID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKQotCQkJCS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKLQkJaWYgKGFjdGl2ZVdpbmRvdyAhPSBudWxsKSB7Ci0KLQkJCUlXb3JrYmVuY2hQYWdlIHBhZ2UgPSBhY3RpdmVXaW5kb3cuZ2V0QWN0aXZlUGFnZSgpOwotCQkJaWYgKHBhZ2UgIT0gbnVsbCkgewotCQkJCWlmIChwYWdlIGluc3RhbmNlb2YgV29ya2JlbmNoUGFnZSkgewotCQkJCQlJVmlld1JlZmVyZW5jZVtdIHZ3UmVmTGlzdCA9IHBhZ2UuZ2V0Vmlld1JlZmVyZW5jZXMoKTsKLQotCQkJCQlib29sZWFuIGludHJvVmlld0V4aXN0cyA9IGZhbHNlOwotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHZ3UmVmTGlzdC5sZW5ndGg7IGkrKykgewotCQkJCQkJaWYgKHZ3UmVmTGlzdFtpXS5nZXRJZCgpLmVxdWFscygKLQkJCQkJCQkJIm9yZy5lY2xpcHNlLnVpLmludGVybmFsLmludHJvdmlldyIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQlpbnRyb1ZpZXdFeGlzdHMgPSB0cnVlOwotCQkJCQkJCWJyZWFrOwotCQkJCQkJfQotCQkJCQl9Ci0KLQkJCQkJSVByZWZlcmVuY2VTdG9yZSBzdG9yZSA9IFJDUFVJUGx1Z2luLmdldERlZmF1bHQoKQotCQkJCQkJCS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQkJCQkJc3RvcmUKLQkJCQkJCQkuc2V0VmFsdWUoCi0JCQkJCQkJCQkid2VsY29tZV9pbnRyb192aWV3X2V4aXN0cyIsIGludHJvVmlld0V4aXN0cyk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJUkNQVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLnNhdmVQbHVnaW5QcmVmZXJlbmNlcygpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuYXBwbGljYXRpb24uV29ya2JlbmNoQWR2aXNvciNwb3N0U2h1dGRvd24oKQotCSAqLwotCXB1YmxpYyB2b2lkIHBvc3RTaHV0ZG93bigpIHsKLQkJdHJ5IHsKLQkJCS8vIFNhdmUgdGhlIHdvcmtzcGFjZSBhbmQgcmVtb3ZlIC5zbmFwIGZpbGUgaW4gdGhlCi0JCQkvLyB3b3Jrc3BhY2VcLm1ldGFkYXRhXC5wbHVnaW5zXG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzIGZvbGRlci4KLQkJCVJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5zYXZlKHRydWUsIG51bGwpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJfQotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5hcHBsaWNhdGlvbi5Xb3JrYmVuY2hBZHZpc29yI3Bvc3RTdGFydHVwKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBwb3N0U3RhcnR1cCgpIHsKLQkJQ29tbWFuZExpbmVSdW5VdGlsIHJ1blV0aWwgPSBDb21tYW5kTGluZVJ1blV0aWwuZ2V0SW5zdGFuY2UoKTsKLQkJaWYgKHJ1blV0aWwuaXNOZWVkVG9SdW4oKSkgewotCQkJcnVuVXRpbC5leGVjdXRlKFBsYXRmb3JtLmdldEFwcGxpY2F0aW9uQXJncygpKTsKLQotCQkJZmluYWwgSVdvcmtiZW5jaCB3b3JrYmVuY2ggPSBnZXRXb3JrYmVuY2hDb25maWd1cmVyKCkKLQkJCQkJLmdldFdvcmtiZW5jaCgpOwotCQkJd29ya2JlbmNoLmdldERpc3BsYXkoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJaWYgKCEgUmVmcmVzaEpvYi5nZXRJbnN0YW5jZSgpLmNhbmNlbCgpKSB7Ci0JCQkJCQl0cnkgewotCQkJCQkJCVJlZnJlc2hKb2IuZ2V0SW5zdGFuY2UoKS5qb2luKCk7Ci0JCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewkJCQkJCQkKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlSZWZyZXNoSm9iLmdldEluc3RhbmNlKCkuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJCVJlZnJlc2hKb2IuZ2V0SW5zdGFuY2UoKS5yZXNldCgpOwotCQkJCQl3b3JrYmVuY2guY2xvc2UoKTsKLQkJCQl9Ci0JCQl9KTsKLQkJfQotCi0JCXN1cGVyLnBvc3RTdGFydHVwKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmNwL3VpL01haW5Xb3JrYmVuY2hXaW5kb3dBZHZpc29yLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmNwL3VpL01haW5Xb3JrYmVuY2hXaW5kb3dBZHZpc29yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjMDY2MTEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3JjcC91aS9NYWluV29ya2JlbmNoV2luZG93QWR2aXNvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5yY3AudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5MaWJyYXJ5VUlNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQ29udHJpYnV0aW9uSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uTWVudU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklQZXJzcGVjdGl2ZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVBlcnNwZWN0aXZlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVZpZXdQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuV29ya2JlbmNoRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFwcGxpY2F0aW9uLkFjdGlvbkJhckFkdmlzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYXBwbGljYXRpb24uSUFjdGlvbkJhckNvbmZpZ3VyZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYXBwbGljYXRpb24uSVdvcmtiZW5jaENvbmZpZ3VyZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYXBwbGljYXRpb24uSVdvcmtiZW5jaFdpbmRvd0NvbmZpZ3VyZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYXBwbGljYXRpb24uV29ya2JlbmNoV2luZG93QWR2aXNvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5BY3Rpb25TZXRDb250cmlidXRpb25JdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLlBsdWdpbkFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50cm8uSUludHJvUGFydDsKLQotLyoqCi0gKiBUaGUgYXBwbGljYXRpb24gc3BlY2lmaWMgd29ya2JlbmNoIHdpbmRvdyBhZHZpc29yLgotICogCi0gKiBAYXV0aG9yIEJpbmd4dWUgWHUKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICogZml4IHRvIGhpZGUgdGhlIHdvcmtpbmcgc2V0IGFuZCBleHRlcm5hbCB0b29sIGJhciBidXR0b25zIEAgMjAwNy0wNi0xNAotICovCi1wdWJsaWMgY2xhc3MgTWFpbldvcmtiZW5jaFdpbmRvd0Fkdmlzb3IgZXh0ZW5kcyBXb3JrYmVuY2hXaW5kb3dBZHZpc29yIHsKLQotCXByb3RlY3RlZCBzdGF0aWMgU3RyaW5nW10gZmlsZU1lbnVSZW1vdmFsTGlzdCA9IHsKLQkJCSJvcmcuZWNsaXBzZS51aS5vcGVuTG9jYWxGaWxlIiwgLy8kTk9OLU5MUy0xJAotCQkJIm9yZy5lY2xpcHNlLnVpLmVkaXQudGV4dC5uZXdUZXh0RWRpdG9yIiwgLy8kTk9OLU5MUy0xJAotCQkJIm9yZy5lY2xpcHNlLnVpLmVkaXQudGV4dC5vcGVuRXh0ZXJuYWxGaWxlIiwgLy8kTk9OLU5MUy0xJAotCQkJImNvbnZlcnN0TGluZURlbGltaXRlcnNUbyIgLy8kTk9OLU5MUy0xJAotCX07Ci0KLQlwcm90ZWN0ZWQgTWFpbkFjdGlvbkJhckFkdmlzb3IgbWFpbkFjdGlvbkJhcjsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZwlBTk5PVEFUSU9OTkFWSUdBVElPTl9JRAkJPSAib3JnLmVjbGlwc2UudWkuZWRpdC50ZXh0LmFjdGlvblNldC5hbm5vdGF0aW9uTmF2aWdhdGlvbiI7CS8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcJV09SS0lOR1NFVEFDVElPTlNFVF9JRAkJPSAib3JnLmVjbGlwc2UudWkuV29ya2luZ1NldEFjdGlvblNldCI7CQkJCQkJCS8vJE5PTi1OTFMtMSQKLS8vCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZwlFWFRFUk5BTFRPT0xTU0VUX0lECQkJPSAib3JnLmVjbGlwc2UudWkuZXh0ZXJuYWx0b29scy5FeHRlcm5hbFRvb2xzU2V0IjsJCQkJLy8kTk9OLU5MUy0xJAotCQotCXByaXZhdGUgSVBlcnNwZWN0aXZlTGlzdGVuZXIgcGVyc3BlY3RpdmVMaXN0ZW5lciA9IG5ldyBJUGVyc3BlY3RpdmVMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgcGVyc3BlY3RpdmVDaGFuZ2VkKElXb3JrYmVuY2hQYWdlIHBhZ2UsCi0JCQkJSVBlcnNwZWN0aXZlRGVzY3JpcHRvciBwZXJzcGVjdGl2ZSwgU3RyaW5nIGNoYW5nZUlkKSB7Ci0JCQlMaWJyYXJ5VUlNYW5hZ2VyLmdldEluc3RhbmNlKCkuY2hlY2tDb25maWd1cmF0aW9uQ29udHJpYnV0aW9uKCk7Ci0JCQlMaWJyYXJ5VUlNYW5hZ2VyLmdldEluc3RhbmNlKCkuc3RhcnR1cE9wZW5MaWJyYXJ5KCk7Ci0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIHBlcnNwZWN0aXZlQWN0aXZhdGVkKElXb3JrYmVuY2hQYWdlIHBhZ2UsCi0JCQkJSVBlcnNwZWN0aXZlRGVzY3JpcHRvciBwZXJzcGVjdGl2ZSkgewotCQkJLy8gZG8gbm90IHNob3cgdGhlIFdvcmtpbmdTZXRzYWN0aW9uU2V0IHRvb2xiYXIgYnV0dG9ucwotCQkJcGFnZS5oaWRlQWN0aW9uU2V0KFdPUktJTkdTRVRBQ1RJT05TRVRfSUQpOyAKLQkJCS8vIGRvIG5vdCBzaG93IHRoZSBFeHRlcm5hbCBUb29scyBidXR0b24gb24gdGhlIHRvb2xiYXIKLS8vCQkJcGFnZS5oaWRlQWN0aW9uU2V0KEVYVEVSTkFMVE9PTFNTRVRfSUQpOwotCQkJcGFnZS5oaWRlQWN0aW9uU2V0KEFOTk9UQVRJT05OQVZJR0FUSU9OX0lEKTsKLQkJfQotCX07Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gY29uZmlndXJlcgotCSAqICAgICAgICAgICAgQW4gb2JqZWN0IGZvciBjb25maWd1cmluZyB0aGUgd29ya2JlbmNoIHdpbmRvdy4KLQkgKi8KLQlwdWJsaWMgTWFpbldvcmtiZW5jaFdpbmRvd0Fkdmlzb3IoSVdvcmtiZW5jaFdpbmRvd0NvbmZpZ3VyZXIgY29uZmlndXJlcikgewotCQlzdXBlcihjb25maWd1cmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLmFwcGxpY2F0aW9uLldvcmtiZW5jaFdpbmRvd0Fkdmlzb3IjY3JlYXRlQWN0aW9uQmFyQWR2aXNvcihJQWN0aW9uQmFyQ29uZmlndXJlcikKLQkgKi8KLQlwdWJsaWMgQWN0aW9uQmFyQWR2aXNvciBjcmVhdGVBY3Rpb25CYXJBZHZpc29yKAotCQkJSUFjdGlvbkJhckNvbmZpZ3VyZXIgY29uZmlndXJlcikgewotCQltYWluQWN0aW9uQmFyID0gbmV3IE1haW5BY3Rpb25CYXJBZHZpc29yKGNvbmZpZ3VyZXIpOwotCQlyZXR1cm4gbWFpbkFjdGlvbkJhcjsKLQl9Ci0KLQkvKioKLQkgKiBhZGQgb3BlcmF0aW9ucyB0byBiZSBwZXJmb3JtZWQgYXQgcG9zdFdpbmRvd0NyZWF0ZQotCSAqLwotCXB1YmxpYyB2b2lkIHBvc3RXaW5kb3dDcmVhdGUoKSB7Ci0JCUlXb3JrYmVuY2hXaW5kb3dDb25maWd1cmVyIGNvbmZpZ3VyZXIgPSBnZXRXaW5kb3dDb25maWd1cmVyKCk7Ci0JCU9iamVjdCBkYXRhID0gY29uZmlndXJlci5nZXREYXRhKCJpc1Jlc3RvcmVkV29ya2JlbmNoIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKGRhdGEgPT0gbnVsbCkgewotCQkJY29uZmlndXJlci5nZXRXaW5kb3coKS5nZXRTaGVsbCgpLnNldExvY2F0aW9uKDMwLCAzMCk7Ci0JCQljb25maWd1cmVyLmdldFdpbmRvdygpLmdldFNoZWxsKCkuc2V0U2l6ZSgxMDI0LCA3NjApOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5hcHBsaWNhdGlvbi5Xb3JrYmVuY2hXaW5kb3dBZHZpc29yI3ByZVdpbmRvd09wZW4oKQotCSAqLwotCXB1YmxpYyB2b2lkIHByZVdpbmRvd09wZW4oKSB7Ci0JCUlXb3JrYmVuY2hXaW5kb3dDb25maWd1cmVyIGNvbmZpZ3VyZXIgPSBnZXRXaW5kb3dDb25maWd1cmVyKCk7Ci0JCWNvbmZpZ3VyZXIuc2V0U2hvd0Nvb2xCYXIodHJ1ZSk7Ci0JCWNvbmZpZ3VyZXIuc2V0U2hvd1BlcnNwZWN0aXZlQmFyKHRydWUpOwotCQljb25maWd1cmVyLnNldFNob3dTdGF0dXNMaW5lKHRydWUpOwotCQljb25maWd1cmVyLnNldFNob3dQcm9ncmVzc0luZGljYXRvcih0cnVlKTsKLQkJY29uZmlndXJlci5zZXRUaXRsZShSQ1BVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0U3RyaW5nKCJwcm9kdWN0TmFtZSIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuYXBwbGljYXRpb24uV29ya2JlbmNoQWR2aXNvciNwb3N0V2luZG93T3BlbigpCi0JICovCi0JcHVibGljIHZvaWQgcG9zdFdpbmRvd09wZW4oKSB7Ci0JCWlmIChQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmlzQ2xvc2luZygpKSAgICAgCi0JCQlyZXR1cm47ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JCUlXb3JrYmVuY2hXaW5kb3dDb25maWd1cmVyIGNvbmZpZ3VyZXIgPSBnZXRXaW5kb3dDb25maWd1cmVyKCk7Ci0JCWNvbmZpZ3VyZXIuZ2V0V2luZG93KCkuZ2V0U2hlbGwoKS5zZXRJbWFnZSgKLQkJCQlSQ1BVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0U2hhcmVkSW1hZ2UoImZ1bGwvb2JqMTYvcHJvZHVjdC5naWYiKSk7IC8vJE5PTi1OTFMtMSQKLQotCQlNZW51TWFuYWdlciBmaWxlTW1lbnUgPSBtYWluQWN0aW9uQmFyLmdldEZpbGVNZW51TWFuYWdlcigpOwotCQlJQ29udHJpYnV0aW9uSXRlbVtdIGl0ZW1zID0gZmlsZU1tZW51LmdldEl0ZW1zKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChuZWVkVG9SZW1vdmVGcm9tKGl0ZW1zW2ldLmdldElkKCksIGZpbGVNZW51UmVtb3ZhbExpc3QpKQotCQkJCWZpbGVNbWVudS5yZW1vdmUoaXRlbXNbaV0pOwotCQl9Ci0KLQkJLy8gdGhpcyBpcyBhIGhhY2sgdG8gY2hhbmdlIHRoZSBIZWxwIHwgU29mdHdhcmUgVXBkYXRlcyB8IE1hbmFnZQotCQkvLyBDb25maWd1cmF0aW9ucyB0byBNYW5hZ2UgU29mdHdhcmUgQ29uZmlndXJhdGlvbi4uLgotCQlNZW51TWFuYWdlciBoZWxwTW1lbnUgPSBtYWluQWN0aW9uQmFyLmdldEhlbHBNZW51TWFuYWdlcigpOwotCQlpdGVtcyA9IGhlbHBNbWVudS5nZXRJdGVtcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoaXRlbXNbaV0gaW5zdGFuY2VvZiBBY3Rpb25TZXRDb250cmlidXRpb25JdGVtKSB7Ci0JCQkJQWN0aW9uU2V0Q29udHJpYnV0aW9uSXRlbSBlbGVtZW50ID0gKEFjdGlvblNldENvbnRyaWJ1dGlvbkl0ZW0pIGl0ZW1zW2ldOwotCQkJCWlmIChlbGVtZW50LmdldElkKCkuZXF1YWxzKCJvcmcuZWNsaXBzZS51cGRhdGUudWkudXBkYXRlTWVudSIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJSUNvbnRyaWJ1dGlvbkl0ZW0gY29udHJpYk1lbnVNZ3IgPSBlbGVtZW50LmdldElubmVySXRlbSgpOwotCQkJCQlJQ29udHJpYnV0aW9uSXRlbVtdIHN1Yk1lbnVJdGVtcyA9ICgoTWVudU1hbmFnZXIpIGNvbnRyaWJNZW51TWdyKQotCQkJCQkJCS5nZXRJdGVtcygpOwotCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IHN1Yk1lbnVJdGVtcy5sZW5ndGg7IGorKykgewotCQkJCQkJSUNvbnRyaWJ1dGlvbkl0ZW0gaW5uZXJJdGVtID0gKChBY3Rpb25TZXRDb250cmlidXRpb25JdGVtKSBzdWJNZW51SXRlbXNbal0pCi0JCQkJCQkJCS5nZXRJbm5lckl0ZW0oKTsKLQkJCQkJCWlmIChpbm5lckl0ZW0gaW5zdGFuY2VvZiBQbHVnaW5BY3Rpb25Db250cmlidXRpb25JdGVtCi0JCQkJCQkJCSYmIGlubmVySXRlbS5nZXRJZCgpLmVxdWFscygKLQkJCQkJCQkJCQkib3JnLmVjbGlwc2UudXBkYXRlLnVpLmNvbmZpZ01hbmFnZXIiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCQkJSUFjdGlvbiBhY3Rpb24gPSAoKFBsdWdpbkFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0pIGlubmVySXRlbSkKLQkJCQkJCQkJCS5nZXRBY3Rpb24oKTsKLQkJCQkJCQlhY3Rpb24KLQkJCQkJCQkJCS5zZXRUZXh0KFJDUFVJUmVzb3VyY2VzLm1lbnVfaGVscF9zb2Z0d2FyZV91cGRhdGVzX21hbmFnZV9zb2Z0d2FyZV9jb25maWdfdGV4dCk7IAotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmFkZFBlcnNwZWN0aXZlTGlzdGVuZXIocGVyc3BlY3RpdmVMaXN0ZW5lcik7Ci0JCUlXb3JrYmVuY2hQYWdlIHBhZ2UgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKTsKLQkJLy8gZG8gbm90IHNob3cgdGhlIFdvcmtpbmdTZXRzYWN0aW9uU2V0IHRvb2xiYXIgYnV0dG9ucwotCQlwYWdlLmhpZGVBY3Rpb25TZXQoV09SS0lOR1NFVEFDVElPTlNFVF9JRCk7IAotCQkvLyBkbyBub3Qgc2hvdyB0aGUgRXh0ZXJuYWwgVG9vbHMgYnV0dG9uIG9uIHRoZSB0b29sYmFyCi0vLwkJcGFnZS5oaWRlQWN0aW9uU2V0KEVYVEVSTkFMVE9PTFNTRVRfSUQpOwotCQlwYWdlLmhpZGVBY3Rpb25TZXQoQU5OT1RBVElPTk5BVklHQVRJT05fSUQpOwkKLQkJCi0JfQotCi0JcHJpdmF0ZSBib29sZWFuIG5lZWRUb1JlbW92ZUZyb20oU3RyaW5nIGlkLCBTdHJpbmdbXSBsaXN0KSB7Ci0JCWJvb2xlYW4gcmMgPSBmYWxzZTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChsaXN0W2ldLmVxdWFscyhpZCkpIHsKLQkJCQlyYyA9IHRydWU7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJjOwotCX0KLQotCS8qKgotCSAqIGFkZCBjdXN0b20gb3BlcmF0aW9ucyBhdCBwb3N0V2luZG93UmVzdG9yZQotCSAqLwotCXB1YmxpYyB2b2lkIHBvc3RXaW5kb3dSZXN0b3JlKCkgdGhyb3dzIFdvcmtiZW5jaEV4Y2VwdGlvbiB7Ci0JCUlXb3JrYmVuY2hXaW5kb3dDb25maWd1cmVyIGNvbmZpZ3VyZXIgPSBnZXRXaW5kb3dDb25maWd1cmVyKCk7Ci0JCWNvbmZpZ3VyZXIuc2V0RGF0YSgiaXNSZXN0b3JlZFdvcmtiZW5jaCIsICJ0cnVlIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JfQotCi0JLyoqCi0JKiBDdXN0b21pemUgb3BlbkludHJvIHRvIGF2b2lkIGFuIEVjbGlwc2UgYnVnCi0JKiBDdXN0b21pemVzIGl0IHNvIGl0IHdpbGwgb3BlbiBpbiB0aGUgc3RhbmRieSBtb2RlIGlmIHRoaXMgaXMgYSByZXN0b3JlZAotCSogc2Vzc2lvbiBhbmQgdGhlIGxhc3Qgc2Vzc2lvbiBoYWQgdGhlIEludHJvVmlldyBvcGVuLCBvdGhlcndpc2UgY2xvc2UgaXQKLQkqIAotCSovCi0JcHVibGljIHZvaWQgb3BlbkludHJvKCkgewotCQlzdXBlci5vcGVuSW50cm8oKTsKLQotCQlJV29ya2JlbmNoV2luZG93Q29uZmlndXJlciBjb25maWd1cmVyID0gZ2V0V2luZG93Q29uZmlndXJlcigpOwotCQlPYmplY3QgZGF0YSA9IGNvbmZpZ3VyZXIuZ2V0RGF0YSgiaXNSZXN0b3JlZFdvcmtiZW5jaCIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChkYXRhID09IG51bGwpIHsKLQkJCS8vIGlmIG5vdCByZXN0b3JlZCB3b3Jrc3BhY2UsIGp1c3QgZXhlYyB0aGUgZGVmYXVsdCBpbiBzdXBlci4KLQkJCXJldHVybjsKLQkJfQotCi0JCS8vIGFsd2F5cyBhbGxvd3MgdGhlIGludHJvIHZpZXcgdG8gb3BlbiBmaXJzdCwgYW5kIHRoZW4gcHV0IGl0IGludG8KLQkJLy8gc3RhbmRieSBtb2RlCi0JCS8vIG90aGVyd2lzZSBvdGhlciBmYXN0IHZpZXdzIHN1Y2ggYXMgc2VhcmNoIGhlbHAgd2lsbCBiZSBvcGVuLWVkIGFzCi0JCS8vIGZ1bGwgbW9kZQotCQkvLyBldmVuIHRoZSB3ZWxjb21lIHBhZ2UgaXMgY2xvc2VkLgotCQkvLyBpZiAoaXNJbnRyb1ZpZXdFeGlzdHNJbkxhc3RTZXNzaW9uKCkpIHsKLQkJSVdvcmtiZW5jaENvbmZpZ3VyZXIgd2JDb25maWcgPSBnZXRXaW5kb3dDb25maWd1cmVyKCkKLQkJCQkuZ2V0V29ya2JlbmNoQ29uZmlndXJlcigpOwotCQlJSW50cm9QYXJ0IGludHJvUGFydCA9IHdiQ29uZmlnLmdldFdvcmtiZW5jaCgpLmdldEludHJvTWFuYWdlcigpCi0JCQkJLmdldEludHJvKCk7Ci0JCXdiQ29uZmlnLmdldFdvcmtiZW5jaCgpLmdldEludHJvTWFuYWdlcigpLnNldEludHJvU3RhbmRieShpbnRyb1BhcnQsCi0JCQkJdHJ1ZSk7Ci0JCS8vIH0gZWxzZSB7Ci0JCWlmICghaXNJbnRyb1ZpZXdFeGlzdHNJbkxhc3RTZXNzaW9uKCkpIHsKLQkJCWNsb3NlSW50cm9WaWV3KCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNJbnRyb1ZpZXdFeGlzdHNJbkxhc3RTZXNzaW9uKCkgewotCQlJUHJlZmVyZW5jZVN0b3JlIHN0b3JlID0gUkNQVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpOwotCQlyZXR1cm4gc3RvcmUuZ2V0Qm9vbGVhbigid2VsY29tZV9pbnRyb192aWV3X2V4aXN0cyIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJpdmF0ZSB2b2lkIGNsb3NlSW50cm9WaWV3KCkgewotCQl0cnkgewotCQkJSVZpZXdQYXJ0IHZwID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKQotCQkJCQkuZ2V0QWN0aXZlUGFnZSgpLmZpbmRWaWV3KAotCQkJCQkJCSJvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5pbnRyb3ZpZXciKTsgLy8kTk9OLU5MUy0xJAotCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKQotCQkJCQkuZ2V0QWN0aXZlUGFnZSgpLmhpZGVWaWV3KHZwKTsKLQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCi0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9yY3AvdWkvUkNQVUlQbHVnaW4uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9yY3AvdWkvUkNQVUlQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTJhZDNmYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmNwL3VpL1JDUFVJUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucmNwLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS5BYnN0cmFjdFBsdWdpbjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotLyoqCi0gKiBUaGUgUkNQIFVJIHBsdWctaW4gY2xhc3MuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUkNQVUlQbHVnaW4gZXh0ZW5kcyBBYnN0cmFjdFBsdWdpbiB7Ci0KLQkvLyBUaGUgc2hhcmVkIHBsdWctaW4gaW5zdGFuY2UuCi0JcHJpdmF0ZSBzdGF0aWMgUkNQVUlQbHVnaW4gcGx1Z2luOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgUkNQVUlQbHVnaW4oKSB7Ci0JCXN1cGVyKCk7Ci0JCXBsdWdpbiA9IHRoaXM7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpLkFic3RyYWN0UGx1Z2luI3N0YXJ0KEJ1bmRsZUNvbnRleHQpCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RhcnQoY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpLkFic3RyYWN0UGx1Z2luI3N0b3AoQnVuZGxlQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0b3AoY29udGV4dCk7Ci0JCXBsdWdpbiA9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2hhcmVkIHBsdWctaW4gaW5zdGFuY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBSQ1BVSVBsdWdpbiBnZXREZWZhdWx0KCkgewotCQlyZXR1cm4gcGx1Z2luOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3JjcC91aS9SQ1BVSVJlc291cmNlcy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3JjcC91aS9SQ1BVSVJlc291cmNlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOGQ4YWZhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9yY3AvdWkvUkNQVUlSZXNvdXJjZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucmNwLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotcHVibGljIGZpbmFsIGNsYXNzIFJDUFVJUmVzb3VyY2VzIGV4dGVuZHMgTkxTIHsKLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBCVU5ETEVfTkFNRSA9IFJDUFVJUmVzb3VyY2VzLmNsYXNzLmdldFBhY2thZ2UoKQotCQkJLmdldE5hbWUoKQotCQkJKyAiLlJlc291cmNlcyI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgUkNQVUlSZXNvdXJjZXMoKSB7Ci0JCS8vIERvIG5vdCBpbnN0YW50aWF0ZQotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGZpbGVNZW51SXRlbV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZmlsZU5ld01lbnVJdGVtX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBmaWxlT3Blbk1lbnVJdGVtX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlZGl0TWVudUl0ZW1fdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG5hdmlnYXRlTWVudUl0ZW1fdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlYXJjaE1lbnVJdGVtX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb25maWd1cmF0aW9uTWVudUl0ZW1fdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdpbmRvd01lbnVJdGVtX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3aW5kb3dPcGVuUGVyc3BlY3RpdmVNZW51SXRlbV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgd2luZG93U2hvd1ZpZXdNZW51SXRlbV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgaGVscE1lbnVJdGVtX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBuZXdEcm9wRG93bl90b29sdGlwX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBvdGhlck1lbnVJdGVtX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBvcGVuQXV0aG9yaW5nUGVyc3BlY3RpdmVBY3Rpb25fdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG9wZW5Ccm93c2luZ1BlcnNwZWN0aXZlQWN0aW9uX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlZGl0QWN0aW9uX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB1cGdyYWRlTGlicmFyeUFjdGlvbl90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc3RhcnR1cF9kaXJfbG9nX2luZm9fdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG1lbnVfaGVscF9zb2Z0d2FyZV91cGRhdGVzX21hbmFnZV9zb2Z0d2FyZV9jb25maWdfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdvcmtzcGFjZUNhbm5vdExvY2tUaXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdvcmtzcGFjZUNhbm5vdExvY2tNZXNzYWdlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbWFpbkFjdGlvbkJhckFkdmlzb3JfRGlhZ25vc2lzOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbWFpbkFjdGlvbkJhckFkdmlzb3JfSGVhbHRoQ2hlY2s7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBtYWluQWN0aW9uQmFyQWR2aXNvcl9SZW1vdmVSZWZlcmVuY2U7Ci0KLQlzdGF0aWMgewotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBSQ1BVSVJlc291cmNlcy5jbGFzcyk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9yY3AvdWkvUmVzb3VyY2VzLnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmNwL3VpL1Jlc291cmNlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMTMwNjcyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9yY3AvdWkvUmVzb3VyY2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUgotCi0jIEZpbGUgTWVudQotZmlsZU1lbnVJdGVtX3RleHQ9JkZpbGUKLWZpbGVOZXdNZW51SXRlbV90ZXh0PSZOZXcKLWZpbGVPcGVuTWVudUl0ZW1fdGV4dD1PJnBlbgotCi0jIEVkaXQgTWVudQotZWRpdE1lbnVJdGVtX3RleHQ9JkVkaXQKLQotIyBOYXZpZ2F0ZSBNZW51Ci1uYXZpZ2F0ZU1lbnVJdGVtX3RleHQ9Jk5hdmlnYXRlCi0KLSMgU2VhcmNoIE1lbnUKLXNlYXJjaE1lbnVJdGVtX3RleHQ9JlNlYXJjaAotCi0jIENvbmZpZ3VyYXRpb24gTWVudQotY29uZmlndXJhdGlvbk1lbnVJdGVtX3RleHQ9JkNvbmZpZ3VyYXRpb24KLQotIyBXaW5kb3cgTWVudQotd2luZG93TWVudUl0ZW1fdGV4dD0mV2luZG93Ci13aW5kb3dPcGVuUGVyc3BlY3RpdmVNZW51SXRlbV90ZXh0PSZPcGVuIFBlcnNwZWN0aXZlCi13aW5kb3dTaG93Vmlld01lbnVJdGVtX3RleHQ9U2hvdyAmVmlldwotCi0jIEhlbHAgTWVudQotaGVscE1lbnVJdGVtX3RleHQ9JkhlbHAKLQotIyBOZXcgRHJvcCBEb3duIE1lbnUKLW5ld0Ryb3BEb3duX3Rvb2x0aXBfdGV4dD1OZXcKLW90aGVyTWVudUl0ZW1fdGV4dD1PdGhlci4uLgotCi0jIE9wZW4gUGVyc3BlY3RpdmUgQWN0aW9ucwotb3BlbkF1dGhvcmluZ1BlcnNwZWN0aXZlQWN0aW9uX3RleHQ9QXV0aG9yaW5nCi1vcGVuQnJvd3NpbmdQZXJzcGVjdGl2ZUFjdGlvbl90ZXh0PUJyb3dzaW5nCi0KLSMgTWlzYyBBY3Rpb25zCi1lZGl0QWN0aW9uX3RleHQ9JkVkaXQKLXVwZ3JhZGVMaWJyYXJ5QWN0aW9uX3RleHQ9VXBncmFkZSBNZXRob2QgTGlicmFyeSBmcm9tIEkxIHRvIEkyLi4uCi0KLXN0YXJ0dXBfZGlyX2xvZ19pbmZvX3RleHQ9SU5GTzogQXBwbGljYXRpb24gc3RhcnQgZGlyZWN0b3J5ID0KLW1lbnVfaGVscF9zb2Z0d2FyZV91cGRhdGVzX21hbmFnZV9zb2Z0d2FyZV9jb25maWdfdGV4dD0mTWFuYWdlIFNvZnR3YXJlIENvbmZpZ3VyYXRpb24uLi4KLQotd29ya3NwYWNlQ2Fubm90TG9ja1RpdGxlPUNhbm5vdCBzdGFydCB7MH0KLXdvcmtzcGFjZUNhbm5vdExvY2tNZXNzYWdlPXswfSBjYW5ub3QgYmUgc3RhcnRlZCB3aGlsZSBhbm90aGVyIGluc3RhbmNlIGlzIHJ1bm5pbmcuICBTd2l0Y2ggdG8gdGhlIHJ1bm5pbmcgaW5zdGFuY2Ugb3IgY2xvc2UgaXQgYW5kIHJlc3RhcnQgdGhlIGFwcGxpY2F0aW9uIGFnYWluLgotbWFpbkFjdGlvbkJhckFkdmlzb3JfRGlhZ25vc2lzPURpYWdub3NpcyBhbmQgUmVwYWlyIFRvb2xzCi1tYWluQWN0aW9uQmFyQWR2aXNvcl9IZWFsdGhDaGVjaz1QZXJmb3JtIEhlYWx0aCBDaGVjayBvbiBMaWJyYXJ5Li4uCi1tYWluQWN0aW9uQmFyQWR2aXNvcl9SZW1vdmVSZWZlcmVuY2U9UmVtb3ZlIFJlZmVyZW5jZXMgdG8gSW52YWxpZCBPYmplY3RzLi4uCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmNwL3VpL2FjdGlvbnMvQWN0aW9uQ29uc3RhbnRzLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmNwL3VpL2FjdGlvbnMvQWN0aW9uQ29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3ZjkyZDYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3JjcC91aS9hY3Rpb25zL0FjdGlvbkNvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnJjcC51aS5hY3Rpb25zOwotCi0vKioKLSAqIERlZmluZXMgdGhlIG1lbnUgYW5kIHRvb2xiYXIgcGF0aHMgZm9yIGFkZGluZyBhY3Rpb25zLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEFjdGlvbkNvbnN0YW50cyB7Ci0KLQkvKioKLQkgKiBGaWxlID4gTmV3IG1lbnUgZ3JvdXAgbmFtZSBmb3IgYWRkaW5nIE5ldyBhY3Rpb25zCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVXID0gIm5ldyI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEZpbGUgPiBPcGVuIG1lbnUgZ3JvdXAgbmFtZSBmb3IgYWRkaW5nIE9wZW4gYWN0aW9ucwotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9QRU4gPSAib3BlbiI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFNlYXJjaCBtZW51IGdyb3VwIG5hbWVzIGZvciBhZGRpbmcgU2VhcmNoIGFjdGlvbnMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRUFSQ0ggPSAic2VhcmNoIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VBUkNIX1NUQVJUID0gInNlYXJjaFN0YXJ0IjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VBUkNIX0VORCA9ICJzZWFyY2hFbmQiOyAvLyROT04tTkxTLTEkIAotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmNwL3VpL2FjdGlvbnMvSW50cm9kdWN0aW9uQWN0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmNwL3VpL2FjdGlvbnMvSW50cm9kdWN0aW9uQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1ZWY2ZWUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3JjcC91aS9hY3Rpb25zL0ludHJvZHVjdGlvbkFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnJjcC51aS5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJjcC51aS5SQ1BVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5JbnRyb0FjdGlvbjsKLQotLyoqCi0gKiBEaXNwbGF5cyB0aGUgd2VsY29tZSBzY3JlZW4gZm9yIHRoZSBhcHBsaWNhdGlvbi4KLSAqIAotICogQGF1dGhvciBCaW5neHVlIFh1Ci0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEludHJvZHVjdGlvbkFjdGlvbiBleHRlbmRzIEludHJvQWN0aW9uIHsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICogCi0JICogQHBhcmFtIHdpbmRvdwotCSAqICAgICAgICAgICAgdGhlIHdvcmtiZW5jaCB3aW5kb3cKLQkgKi8KLQlwdWJsaWMgSW50cm9kdWN0aW9uQWN0aW9uKElXb3JrYmVuY2hXaW5kb3cgd2luZG93KSB7Ci0JCXN1cGVyKHdpbmRvdyk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgaW1hZ2UgZGVzY3JpcHRvciBmb3IgdGhpcyBhY3Rpb24uCi0JICogCi0JICogQHJldHVybiBhbiBpbWFnZSBkZXNjcmlwdG9yIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGFjdGlvbi4KLQkgKi8KLQlwdWJsaWMgSW1hZ2VEZXNjcmlwdG9yIGdldEltYWdlRGVzY3JpcHRvcigpIHsKLQkJSW1hZ2VEZXNjcmlwdG9yIGltZ0Rlc2NyaXB0b3IgPSBSQ1BVSVBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCQkuZ2V0SW1hZ2VEZXNjcmlwdG9yKCJmdWxsL29iajE2L3Byb2R1Y3QuZ2lmIik7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIGltZ0Rlc2NyaXB0b3I7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmNwL3VpL2FjdGlvbnMvTmV3QnV0dG9uQWN0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmNwL3VpL2FjdGlvbnMvTmV3QnV0dG9uQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3NmEyMzYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3JjcC91aS9hY3Rpb25zL05ld0J1dHRvbkFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5yY3AudWkuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLkxpYnJhcnlVSVRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJjcC51aS5SQ1BVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmNwLnVpLlJDUFVJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51Q3JlYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLk1lbnU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTWVudUl0ZW07Ci0KLS8qKgotICogRGlzcGxheXMgYSBkcm9wIGRvd24gY29tYm8gZm9yIGNyZWF0aW5nIG5ldyBtZXRob2QgbGlicmFyeSwgcGx1Zy1pbiBhbmQKLSAqIGNvbmZpZ3VyYXRpb24uIFRoaXMgYWN0aW9uIGlzIGludm9rZWQgdmlhIHRoZSBOZXcgYnV0dG9uIG9uIHRoZSBzeXN0ZW0KLSAqIHRvb2xiYXIuCi0gKiAKLSAqIEBhdXRob3IgQmluZ3h1ZSBYdQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBOZXdCdXR0b25BY3Rpb24gZXh0ZW5kcyBBY3Rpb24gaW1wbGVtZW50cyBJTWVudUNyZWF0b3IgewotCi0JcHJpdmF0ZSBNZW51IGZpbGVOZXdEcm9wZG93biA9IG51bGw7Ci0KLQkvKiBTaGVsbC1TaGFyaW5nCi0JcHJpdmF0ZSBOZXdMaWJyYXJ5QWN0aW9uIG5ld0xpYnJhcnlBY3Rpb24gPSBudWxsOwotCi0JcHJpdmF0ZSBOZXdQbHVnaW5BY3Rpb24gbmV3UGx1Z2luQWN0aW9uID0gbnVsbDsKLQotCXByaXZhdGUgTmV3Q29uZmlndXJhdGlvbkFjdGlvbiBuZXdDb25maWd1cmF0aW9uQWN0aW9uID0gbnVsbDsKLQotCXByaXZhdGUgTmV3V2l6YXJkQWN0aW9uIG5ld1dpemFyZEFjdGlvbiA9IG51bGw7Ci0JKi8KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIE5ld0J1dHRvbkFjdGlvbigpIHsKLQkJc2V0SWQoImZpbGVOZXdEcm9wZG93biIpOyAvLyROT04tTkxTLTEkCi0JCXNldFRvb2xUaXBUZXh0KFJDUFVJUmVzb3VyY2VzLm5ld0Ryb3BEb3duX3Rvb2x0aXBfdGV4dCk7Ci0KLQkJSW1hZ2VEZXNjcmlwdG9yIGltYWdlRGVzY3JpcHRvciA9IFJDUFVJUGx1Z2luLmdldERlZmF1bHQoKQotCQkJCS5nZXRJbWFnZURlc2NyaXB0b3IoIm5ld19jb24uZ2lmIik7IC8vJE5PTi1OTFMtMSQKLQkJc2V0SW1hZ2VEZXNjcmlwdG9yKGltYWdlRGVzY3JpcHRvcik7Ci0KLQkJc2V0TWVudUNyZWF0b3IodGhpcyk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVDcmVhdG9yI2dldE1lbnUoQ29udHJvbCkKLQkgKi8KLQlwdWJsaWMgTWVudSBnZXRNZW51KENvbnRyb2wgcGFyZW50KSB7Ci0JCWlmIChmaWxlTmV3RHJvcGRvd24gIT0gbnVsbCkgewotCQkJcmV0dXJuIGZpbGVOZXdEcm9wZG93bjsKLQkJfQotCi0JCWZpbGVOZXdEcm9wZG93biA9IG5ldyBNZW51KHBhcmVudCk7Ci0JCU1lbnVJdGVtIG5ld0xpYnJhcnlNSXRlbSA9IG5ldyBNZW51SXRlbShmaWxlTmV3RHJvcGRvd24sIFNXVC5QVVNIKTsKLQkJbmV3TGlicmFyeU1JdGVtLnNldFRleHQoTGlicmFyeVVJVGV4dC5URVhUX01FVEhPRF9MSUJBUkFSWSk7Ci0JCW5ldyBNZW51SXRlbShmaWxlTmV3RHJvcGRvd24sIFNXVC5TRVBBUkFUT1IpOwotCQlNZW51SXRlbSBuZXdQbHVnaW5NSXRlbSA9IG5ldyBNZW51SXRlbShmaWxlTmV3RHJvcGRvd24sIFNXVC5QVVNIKTsKLQkJbmV3UGx1Z2luTUl0ZW0uc2V0VGV4dChMaWJyYXJ5VUlUZXh0LlRFWFRfTUVUSE9EX1BMVUdJTik7Ci0JCU1lbnVJdGVtIG5ld0NvbmZpZ01JdGVtID0gbmV3IE1lbnVJdGVtKGZpbGVOZXdEcm9wZG93biwgU1dULlBVU0gpOwotCQluZXdDb25maWdNSXRlbS5zZXRUZXh0KExpYnJhcnlVSVRleHQuVEVYVF9NRVRIT0RfQ09ORklHVVJBVE9OKTsKLQkJbmV3IE1lbnVJdGVtKGZpbGVOZXdEcm9wZG93biwgU1dULlNFUEFSQVRPUik7Ci0JCU1lbnVJdGVtIG5ld090aGVyTUl0ZW0gPSBuZXcgTWVudUl0ZW0oZmlsZU5ld0Ryb3Bkb3duLCBTV1QuUFVTSCk7Ci0JCW5ld090aGVyTUl0ZW0uc2V0VGV4dChSQ1BVSVJlc291cmNlcy5vdGhlck1lbnVJdGVtX3RleHQpOwotCi0JCS8qIFNoZWxsLVNoYXJpbmcJCQotCQluZXdMaWJyYXJ5QWN0aW9uID0gbmV3IE5ld0xpYnJhcnlBY3Rpb24oKTsKLQkJbmV3UGx1Z2luQWN0aW9uID0gbmV3IE5ld1BsdWdpbkFjdGlvbigpOwotCQluZXdDb25maWd1cmF0aW9uQWN0aW9uID0gbmV3IE5ld0NvbmZpZ3VyYXRpb25BY3Rpb24oKTsKLQkJaWYgKG5ld1dpemFyZEFjdGlvbiA9PSBudWxsKSB7Ci0JCQlJV29ya2JlbmNoV2luZG93IHdiV2luZG93ID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKQotCQkJCQkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0JCQluZXdXaXphcmRBY3Rpb24gPSBuZXcgTmV3V2l6YXJkQWN0aW9uKHdiV2luZG93KTsKLQkJfQotCi0JCW5ld0xpYnJhcnlNSXRlbS5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJbmV3TGlicmFyeUFjdGlvbi5ydW4oKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQluZXdQbHVnaW5NSXRlbS5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJbmV3UGx1Z2luQWN0aW9uLnJ1bigpOwotCQkJfQotCQl9KTsKLQkJbmV3Q29uZmlnTUl0ZW0uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCW5ld0NvbmZpZ3VyYXRpb25BY3Rpb24ucnVuKCk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJbmV3T3RoZXJNSXRlbS5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJbmV3V2l6YXJkQWN0aW9uLnJ1bigpOwotCQkJfQotCQl9KTsKLQkJKi8KLQotCQlyZXR1cm4gZmlsZU5ld0Ryb3Bkb3duOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51Q3JlYXRvciNnZXRNZW51KE1lbnUpCi0JICovCi0JcHVibGljIE1lbnUgZ2V0TWVudShNZW51IHBhcmVudCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb24jcnVuKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCS8qCi0JCWlmIChuZXdXaXphcmRBY3Rpb24gPT0gbnVsbCkgewotCQkJSVdvcmtiZW5jaFdpbmRvdyB3YldpbmRvdyA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkKLQkJCQkJLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpOwotCQkJbmV3V2l6YXJkQWN0aW9uID0gbmV3IE5ld1dpemFyZEFjdGlvbih3YldpbmRvdyk7Ci0JCX0KLQkJbmV3V2l6YXJkQWN0aW9uLnJ1bigpOwotCQkqLwotCX0KLQotCS8qKgotCSAqIGRpc3Bvc2UgdGhlIGZpbGVOZXdEcm9wZG93biBvYmplY3QKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlpZiAoZmlsZU5ld0Ryb3Bkb3duICE9IG51bGwpIHsKLQkJCWZpbGVOZXdEcm9wZG93bi5kaXNwb3NlKCk7Ci0JCQlmaWxlTmV3RHJvcGRvd24gPSBudWxsOwotCQl9Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3JjcC91aS9hY3Rpb25zL05ld1dpemFyZE1lbnUuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9yY3AvdWkvYWN0aW9ucy9OZXdXaXphcmRNZW51LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2MGQ0NDIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3JjcC91aS9hY3Rpb25zL05ld1dpemFyZE1lbnUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5yY3AudWkuYWN0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLlNlcGFyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuQmFzZU5ld1dpemFyZE1lbnU7Ci0KLS8qKgotICogUG9wdWxhdGVzIHRoZSBGaWxlID4gTmV3IG1lbnUgd2l0aCBuZXcgd2l6YXJkcyBjYXRlZ29yaXplZCB1bmRlcgotICogIm9yZy5lY2xpcHNlLmVwZi51aS5uZXdXaXphcmRzLmNhdGVnb3J5Ii4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4yCi0gKi8KLXB1YmxpYyBjbGFzcyBOZXdXaXphcmRNZW51IGV4dGVuZHMgQmFzZU5ld1dpemFyZE1lbnUgewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyB3aXphcmQgc2hvcnRjdXQgbWVudSBmb3IgdGhlIElERS4KLQkgKiAKLQkgKiBAcGFyYW0gd2luZG93Ci0JICogICAgICAgICAgICB0aGUgd2luZG93IGNvbnRhaW5pbmcgdGhlIG1lbnUKLQkgKiBAcGFyYW0gaWQKLQkgKiAgICAgICAgICAgIHRoZSBjb250cmlidXRpb24gaXRlbSBpZGVudGlmaWVyLCBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqLwotCXB1YmxpYyBOZXdXaXphcmRNZW51KElXb3JrYmVuY2hXaW5kb3cgd2luZG93LCBTdHJpbmcgaWQpIHsKLQkJc3VwZXIod2luZG93LCBpZCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLkJhc2VOZXdXaXphcmRNZW51I2FkZEl0ZW1zKG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQ29udHJpYnV0aW9uTWFuYWdlcikKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRJdGVtcyhMaXN0IGxpc3QpIHsKLQkJaWYgKGFkZFNob3J0Y3V0cyhsaXN0KSkgewotCQkJLy8gQWRkIGEgc2VwYXJhdG9yIGFmdGVyIHRoZSBNZXRob2QgQ09uZmlndXJhdGlvbiBtZW51IGl0ZW0uCi0JCQlpZiAobGlzdC5zaXplKCkgPiAzKSB7Ci0JCQkJbGlzdC5hZGQoMywgbmV3IFNlcGFyYXRvcigpKTsKLQkJCX0KLQkJCWxpc3QuYWRkKG5ldyBTZXBhcmF0b3IoKSk7Ci0JCX0KLQkJbGlzdC5hZGQobmV3IEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0oZ2V0U2hvd0RpYWxvZ0FjdGlvbigpKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmNwL3VpL2FjdGlvbnMvVUlBY3Rpb25GYWN0b3J5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmNwL3VpL2FjdGlvbnMvVUlBY3Rpb25GYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzNjFlNzQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3JjcC91aS9hY3Rpb25zL1VJQWN0aW9uRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbHYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uICBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucmNwLnVpLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmNwLnVpLlJDUFVJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklTaGFyZWRJbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLkFjdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5SZXRhcmdldEFjdGlvbjsKLQotLyoqCi0gKiBDcmVhdGVzIGFjdGlvbnMgdGhhdCBhcmUgc3BlY2lmaWMgdG8gdGhlIEVQRiBDb21wb3NlciB3b3JrYmVuY2guCi0gKiAKLSAqIEBhdXRob3IgQmluZ3h1ZSBYdQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBVSUFjdGlvbkZhY3RvcnkgZXh0ZW5kcyBBY3Rpb25GYWN0b3J5IHsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHJvdGVjdGVkIFVJQWN0aW9uRmFjdG9yeShTdHJpbmcgYWN0aW9uSWQpIHsKLQkJc3VwZXIoYWN0aW9uSWQpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhIGN1c3RvbWl6ZWQgU0hPV19JTlRSTyBhY3Rpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEFjdGlvbkZhY3RvcnkgU0hPV19JTlRSTyA9IG5ldyBBY3Rpb25GYWN0b3J5KCJpbnRybyIpIHsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgSVdvcmtiZW5jaEFjdGlvbiBjcmVhdGUoSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cpIHsKLQkJCWlmICh3aW5kb3cgPT0gbnVsbCkgewotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLQkJCX0KLQkJCUlXb3JrYmVuY2hBY3Rpb24gYWN0aW9uID0gbmV3IEludHJvZHVjdGlvbkFjdGlvbih3aW5kb3cpOwotCQkJYWN0aW9uLnNldElkKGdldElkKCkpOwotCQkJcmV0dXJuIGFjdGlvbjsKLQkJfQotCX07Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBjdXN0b21pemVkIE9QRU5fRUxFTUVOVCBhY3Rpb24gdGhhdCBpcyBlcXVhdmlsZW50IHRvIHRoZSBFRElUIG1lbnUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEFjdGlvbkZhY3RvcnkgT1BFTl9FTEVNRU5UID0gbmV3IEFjdGlvbkZhY3RvcnkoImVkaXQiKSB7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIElXb3JrYmVuY2hBY3Rpb24gY3JlYXRlKElXb3JrYmVuY2hXaW5kb3cgd2luZG93KSB7Ci0JCQlpZiAod2luZG93ID09IG51bGwpIHsKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0JCQl9Ci0JCQlSZXRhcmdldEFjdGlvbiBhY3Rpb24gPSBuZXcgUmV0YXJnZXRBY3Rpb24oIk9wZW5FbGVtZW50IiwgIC8vJE5PTi1OTFMtMSQKLQkJCQkJUkNQVUlSZXNvdXJjZXMuZWRpdE1lbnVJdGVtX3RleHQpOwotCQkJd2luZG93LmdldFBhcnRTZXJ2aWNlKCkuYWRkUGFydExpc3RlbmVyKGFjdGlvbik7Ci0JCQlhY3Rpb24KLQkJCQkJLnNldEFjdGlvbkRlZmluaXRpb25JZCgib3JnLmVjbGlwc2UuZXBmLnJjcC51aS5hY3Rpb25zLm9wZW5FbGVtZW50Iik7ICAvLyROT04tTkxTLTEkCi0JCQlJU2hhcmVkSW1hZ2VzIHNoYXJlZEltYWdlcyA9IHdpbmRvdy5nZXRXb3JrYmVuY2goKQotCQkJCQkuZ2V0U2hhcmVkSW1hZ2VzKCk7Ci0JCQlhY3Rpb24uc2V0SW1hZ2VEZXNjcmlwdG9yKHNoYXJlZEltYWdlcwotCQkJCQkuZ2V0SW1hZ2VEZXNjcmlwdG9yKElTaGFyZWRJbWFnZXMuSU1HX1RPT0xfQ09QWSkpOwotCQkJYWN0aW9uLnNldERpc2FibGVkSW1hZ2VEZXNjcmlwdG9yKHNoYXJlZEltYWdlcwotCQkJCQkuZ2V0SW1hZ2VEZXNjcmlwdG9yKElTaGFyZWRJbWFnZXMuSU1HX1RPT0xfQ09QWV9ESVNBQkxFRCkpOwotCi0JCQlyZXR1cm4gYWN0aW9uOwotCQl9Ci0JfTsKLQkKLQkvKioKLQkgKiBDcmVhdGUgYSBjdXN0b21pemVkIElNUE9SVCBhY3Rpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEFjdGlvbkZhY3RvcnkgVUlfSU1QT1JUID0gbmV3IEFjdGlvbkZhY3RvcnkoImltcG9ydCIpIHsgLy8kTk9OLU5MUy0xJAotCQkJCXB1YmxpYyBJV29ya2JlbmNoQWN0aW9uIGNyZWF0ZShJV29ya2JlbmNoV2luZG93IHdpbmRvdykgewotCQkJCQlpZiAod2luZG93ID09IG51bGwpIHsKLQkJCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLQkJCQkJfQotCQkJCQlJV29ya2JlbmNoQWN0aW9uIGFjdGlvbiA9IG5ldyBVSUltcG9ydFJlc291cmNlc0FjdGlvbih3aW5kb3cpOwotCQkJCQlhY3Rpb24uc2V0SWQoZ2V0SWQoKSk7Ci0JCQkJCXJldHVybiBhY3Rpb247Ci0JCQkJfQotCX07Ci0JCQotCS8qKgotCSAqIFdvcmtiZW5jaCBhY3Rpb24gKGlkICJleHBvcnQiKTogT3BlbnMgdGhlIGV4cG9ydCB3aXphcmQuIFRoaXMgYWN0aW9uCi0JICogbWFpbnRhaW5zIGl0cyBlbmFibGVtZW50IHN0YXRlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQWN0aW9uRmFjdG9yeSBVSV9FWFBPUlQgPSBuZXcgQWN0aW9uRmFjdG9yeSgiZXhwb3J0IikgeyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBJV29ya2JlbmNoQWN0aW9uIGNyZWF0ZShJV29ya2JlbmNoV2luZG93IHdpbmRvdykgewotCQkJaWYgKHdpbmRvdyA9PSBudWxsKSB7Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotCQkJfQotCQkJSVdvcmtiZW5jaEFjdGlvbiBhY3Rpb24gPSBuZXcgVUlFeHBvcnRSZXNvdXJjZXNBY3Rpb24od2luZG93KTsKLQkJCWFjdGlvbi5zZXRJZChnZXRJZCgpKTsKLQkJCXJldHVybiBhY3Rpb247Ci0JCX0KLQl9OwotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmNwL3VpL2FjdGlvbnMvVUlFeHBvcnRSZXNvdXJjZXNBY3Rpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9yY3AvdWkvYWN0aW9ucy9VSUV4cG9ydFJlc291cmNlc0FjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZmNiOTQ5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9yY3AvdWkvYWN0aW9ucy9VSUV4cG9ydFJlc291cmNlc0FjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbHYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uICBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucmNwLnVpLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmNwLnVpLndpemFyZHMuVUlFeHBvcnRXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nU2V0dGluZ3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmREaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5FeHBvcnRSZXNvdXJjZXNBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuSVdvcmtiZW5jaEhlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLldvcmtiZW5jaE1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLldvcmtiZW5jaFBsdWdpbjsKLQotLyoqCi0gKiAKLSAqIEBhdXRob3IgQmluZ3h1ZSBYdQotICogQHNpbmNlIDEuMAotICovCi0KLXB1YmxpYyBjbGFzcyBVSUV4cG9ydFJlc291cmNlc0FjdGlvbiBleHRlbmRzIEV4cG9ydFJlc291cmNlc0FjdGlvbiB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0laSU5HX1dJWkFSRF9XSURUSCA9IDQ3MDsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTSVpJTkdfV0laQVJEX0hFSUdIVCA9IDU1MDsKLQotCS8qKgotCSAqIFRoZSB3b3JrYmVuY2ggd2luZG93OyBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGlzIGFjdGlvbiBoYXMgYmVlbgotCSAqIDxjb2RlPmRpc3Bvc2U8L2NvZGU+ZC4KLQkgKi8KLQlwcml2YXRlIElXb3JrYmVuY2hXaW5kb3cgd29ya2JlbmNoV2luZG93OwotCi0JLyoqCi0JICogQ29uc3RydWN0b3IKLQkgKiBAcGFyYW0gd29ya2JlbmNoCi0JICovCi0JcHVibGljIFVJRXhwb3J0UmVzb3VyY2VzQWN0aW9uKElXb3JrYmVuY2ggd29ya2JlbmNoKSB7Ci0JCXRoaXMod29ya2JlbmNoLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvcgotCSAqIEBwYXJhbSB3b3JrYmVuY2gKLQkgKiBAcGFyYW0gbGFiZWwKLQkgKi8KLQlwdWJsaWMgVUlFeHBvcnRSZXNvdXJjZXNBY3Rpb24oSVdvcmtiZW5jaCB3b3JrYmVuY2gsIFN0cmluZyBsYWJlbCkgewotCQl0aGlzKHdvcmtiZW5jaC5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKSwgbGFiZWwpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdG9yCi0JICogQHBhcmFtIHdpbmRvdwotCSAqLwotCXB1YmxpYyBVSUV4cG9ydFJlc291cmNlc0FjdGlvbihJV29ya2JlbmNoV2luZG93IHdpbmRvdykgewotCQl0aGlzKHdpbmRvdywgV29ya2JlbmNoTWVzc2FnZXMuRXhwb3J0UmVzb3VyY2VzQWN0aW9uX3RleHQpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdG9yCi0JICogQHBhcmFtIHdpbmRvdwotCSAqIEBwYXJhbSBsYWJlbAotCSAqLwotCXB1YmxpYyBVSUV4cG9ydFJlc291cmNlc0FjdGlvbihJV29ya2JlbmNoV2luZG93IHdpbmRvdywgU3RyaW5nIGxhYmVsKSB7Ci0JCXN1cGVyKHdpbmRvdywgbGFiZWwpOwotCQl0aGlzLndvcmtiZW5jaFdpbmRvdyA9IHdpbmRvdzsKLQl9Ci0KLQlwdWJsaWMgVUlFeHBvcnRXaXphcmQgZ2V0VUlFeHBvcnRXaXphcmQoKSB7Ci0JCXJldHVybiBuZXcgVUlFeHBvcnRXaXphcmQoKTsKLQl9Ci0JCi0JLyoqCi0JICogSW52b2tlIHRoZSBFeHBvcnQgd2l6YXJkcyBzZWxlY3Rpb24gV2l6YXJkLgotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJaWYgKHdvcmtiZW5jaFdpbmRvdyA9PSBudWxsKSB7Ci0JCQkvLyBhY3Rpb24gaGFzIGJlZW4gZGlzcG9zZWQKLQkJCXJldHVybjsKLQkJfQotCQlVSUV4cG9ydFdpemFyZCB3aXphcmQgPSBnZXRVSUV4cG9ydFdpemFyZCgpOwotCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb25Ub1Bhc3M7Ci0JCS8vIGdldCB0aGUgY3VycmVudCB3b3JrYmVuY2ggc2VsZWN0aW9uCi0JCUlTZWxlY3Rpb24gd29ya2JlbmNoU2VsZWN0aW9uID0gd29ya2JlbmNoV2luZG93LmdldFNlbGVjdGlvblNlcnZpY2UoKQotCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQkJaWYgKHdvcmtiZW5jaFNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7Ci0JCQlzZWxlY3Rpb25Ub1Bhc3MgPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHdvcmtiZW5jaFNlbGVjdGlvbjsKLQkJfSBlbHNlIHsKLQkJCXNlbGVjdGlvblRvUGFzcyA9IFN0cnVjdHVyZWRTZWxlY3Rpb24uRU1QVFk7Ci0JCX0KLQotCQl3aXphcmQuaW5pdCh3b3JrYmVuY2hXaW5kb3cuZ2V0V29ya2JlbmNoKCksIHNlbGVjdGlvblRvUGFzcyk7Ci0JCUlEaWFsb2dTZXR0aW5ncyB3b3JrYmVuY2hTZXR0aW5ncyA9IFdvcmtiZW5jaFBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCQkuZ2V0RGlhbG9nU2V0dGluZ3MoKTsKLQkJSURpYWxvZ1NldHRpbmdzIHdpemFyZFNldHRpbmdzID0gd29ya2JlbmNoU2V0dGluZ3MKLQkJCQkuZ2V0U2VjdGlvbigiRXhwb3J0UmVzb3VyY2VzQWN0aW9uIik7ICAvLyROT04tTkxTLTEkCi0JCWlmICh3aXphcmRTZXR0aW5ncyA9PSBudWxsKQotCQkJd2l6YXJkU2V0dGluZ3MgPSB3b3JrYmVuY2hTZXR0aW5ncwotCQkJCQkuYWRkTmV3U2VjdGlvbigiRXhwb3J0UmVzb3VyY2VzQWN0aW9uIik7ICAvLyROT04tTkxTLTEkCi0JCXdpemFyZC5zZXREaWFsb2dTZXR0aW5ncyh3aXphcmRTZXR0aW5ncyk7Ci0JCXdpemFyZC5zZXRGb3JjZVByZXZpb3VzQW5kTmV4dEJ1dHRvbnModHJ1ZSk7Ci0KLQkJU2hlbGwgcGFyZW50ID0gd29ya2JlbmNoV2luZG93LmdldFNoZWxsKCk7Ci0JCVdpemFyZERpYWxvZyBkaWFsb2cgPSBuZXcgV2l6YXJkRGlhbG9nKHBhcmVudCwgd2l6YXJkKTsKLQkJZGlhbG9nLmNyZWF0ZSgpOwotCQlkaWFsb2cuZ2V0U2hlbGwoKS5zZXRTaXplKAotCQkJCU1hdGgubWF4KFNJWklOR19XSVpBUkRfV0lEVEgsIGRpYWxvZy5nZXRTaGVsbCgpLmdldFNpemUoKS54KSwKLQkJCQlTSVpJTkdfV0laQVJEX0hFSUdIVCk7Ci0JCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoZGlhbG9nLmdldFNoZWxsKCksCi0JCQkJSVdvcmtiZW5jaEhlbHBDb250ZXh0SWRzLkVYUE9SVF9XSVpBUkQpOwotCQlkaWFsb2cub3BlbigpOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9yY3AvdWkvYWN0aW9ucy9VSUltcG9ydFJlc291cmNlc0FjdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3JjcC91aS9hY3Rpb25zL1VJSW1wb3J0UmVzb3VyY2VzQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhMWVmMGEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3JjcC91aS9hY3Rpb25zL1VJSW1wb3J0UmVzb3VyY2VzQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5yY3AudWkuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yY3AudWkud2l6YXJkcy5VSUltcG9ydFdpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dTZXR0aW5nczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZERpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLkltcG9ydFJlc291cmNlc0FjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5JV29ya2JlbmNoSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuV29ya2JlbmNoUGx1Z2luOwotCi0vKioKLSAqIERlZmluZXMgdGhlIGNsYXNzLgotICogCi0gKiBAYXV0aG9yIEJpbmd4dWUgWHUKLSAqIEBzaW5jZSAxLjAKLSAqLwotCi1wdWJsaWMgY2xhc3MgVUlJbXBvcnRSZXNvdXJjZXNBY3Rpb24gZXh0ZW5kcyBJbXBvcnRSZXNvdXJjZXNBY3Rpb24gewotCi0JcHJpdmF0ZSBJV29ya2JlbmNoV2luZG93IHdvcmtiZW5jaFdpbmRvdzsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTSVpJTkdfV0laQVJEX1dJRFRIID0gNDcwOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNJWklOR19XSVpBUkRfSEVJR0hUID0gNTUwOwotCi0JLyoqCi0JICogQ29uc3RydWN0b3IKLQkgKiBAcGFyYW0gd29ya2JlbmNoCi0JICovCi0JcHVibGljIFVJSW1wb3J0UmVzb3VyY2VzQWN0aW9uKElXb3JrYmVuY2ggd29ya2JlbmNoKSB7Ci0JCXRoaXMod29ya2JlbmNoLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvcgotCSAqIEBwYXJhbSB3aW5kb3cKLQkgKi8KLQlwdWJsaWMgVUlJbXBvcnRSZXNvdXJjZXNBY3Rpb24oSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cpIHsKLQkJc3VwZXIod2luZG93KTsKLQkJdGhpcy53b3JrYmVuY2hXaW5kb3cgPSB3aW5kb3c7Ci0JfQotCi0JcHVibGljIFVJSW1wb3J0V2l6YXJkIGdldFVJSW1wb3J0V2l6YXJkKCkgewotCQlyZXR1cm4gbmV3IFVJSW1wb3J0V2l6YXJkKCk7Ci0JfQotCQotCS8qKgotCSAqIEludm9rZSB0aGUgSW1wb3J0IHdpemFyZHMgc2VsZWN0aW9uIFdpemFyZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCWlmICh3b3JrYmVuY2hXaW5kb3cgPT0gbnVsbCkgewotCQkJLy8gYWN0aW9uIGhhcyBiZWVuIGRpc3Bvc2VkCi0JCQlyZXR1cm47Ci0JCX0KLQkJVUlJbXBvcnRXaXphcmQgd2l6YXJkID0gZ2V0VUlJbXBvcnRXaXphcmQoKTsKLQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uVG9QYXNzOwotCQkvLyBnZXQgdGhlIGN1cnJlbnQgd29ya2JlbmNoIHNlbGVjdGlvbgotCQlJU2VsZWN0aW9uIHdvcmtiZW5jaFNlbGVjdGlvbiA9IHdvcmtiZW5jaFdpbmRvdy5nZXRTZWxlY3Rpb25TZXJ2aWNlKCkKLQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCWlmICh3b3JrYmVuY2hTZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgewotCQkJc2VsZWN0aW9uVG9QYXNzID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB3b3JrYmVuY2hTZWxlY3Rpb247Ci0JCX0gZWxzZSB7Ci0JCQlzZWxlY3Rpb25Ub1Bhc3MgPSBTdHJ1Y3R1cmVkU2VsZWN0aW9uLkVNUFRZOwotCQl9Ci0KLQkJd2l6YXJkLmluaXQod29ya2JlbmNoV2luZG93LmdldFdvcmtiZW5jaCgpLCBzZWxlY3Rpb25Ub1Bhc3MpOwotCQlJRGlhbG9nU2V0dGluZ3Mgd29ya2JlbmNoU2V0dGluZ3MgPSBXb3JrYmVuY2hQbHVnaW4uZ2V0RGVmYXVsdCgpCi0JCQkJLmdldERpYWxvZ1NldHRpbmdzKCk7Ci0JCUlEaWFsb2dTZXR0aW5ncyB3aXphcmRTZXR0aW5ncyA9IHdvcmtiZW5jaFNldHRpbmdzCi0JCQkJLmdldFNlY3Rpb24oIkltcG9ydFJlc291cmNlc0FjdGlvbiIpOyAvLyROT04tTkxTLTEkCi0JCWlmICh3aXphcmRTZXR0aW5ncyA9PSBudWxsKQotCQkJd2l6YXJkU2V0dGluZ3MgPSB3b3JrYmVuY2hTZXR0aW5ncwotCQkJCQkuYWRkTmV3U2VjdGlvbigiSW1wb3J0UmVzb3VyY2VzQWN0aW9uIik7IC8vJE5PTi1OTFMtMSQKLQkJd2l6YXJkLnNldERpYWxvZ1NldHRpbmdzKHdpemFyZFNldHRpbmdzKTsKLQkJd2l6YXJkLnNldEZvcmNlUHJldmlvdXNBbmROZXh0QnV0dG9ucyh0cnVlKTsKLQotCQlTaGVsbCBwYXJlbnQgPSB3b3JrYmVuY2hXaW5kb3cuZ2V0U2hlbGwoKTsKLQkJV2l6YXJkRGlhbG9nIGRpYWxvZyA9IG5ldyBXaXphcmREaWFsb2cocGFyZW50LCB3aXphcmQpOwotCQlkaWFsb2cuY3JlYXRlKCk7Ci0JCWRpYWxvZy5nZXRTaGVsbCgpLnNldFNpemUoCi0JCQkJTWF0aC5tYXgoU0laSU5HX1dJWkFSRF9XSURUSCwgZGlhbG9nLmdldFNoZWxsKCkuZ2V0U2l6ZSgpLngpLAotCQkJCVNJWklOR19XSVpBUkRfSEVJR0hUKTsKLQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChkaWFsb2cuZ2V0U2hlbGwoKSwKLQkJCQlJV29ya2JlbmNoSGVscENvbnRleHRJZHMuSU1QT1JUX1dJWkFSRCk7Ci0JCWRpYWxvZy5vcGVuKCk7Ci0JfQotCQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9yY3AvdWkvYWN0aW9ucy9VSU9wZW5QZXJzcGVjdGl2ZURpYWxvZ0FjdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3JjcC91aS9hY3Rpb25zL1VJT3BlblBlcnNwZWN0aXZlRGlhbG9nQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiMTdkMzkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3JjcC91aS9hY3Rpb25zL1VJT3BlblBlcnNwZWN0aXZlRGlhbG9nQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGx2MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAgaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnJjcC51aS5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS51dGlsLlBlcnNwZWN0aXZlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklQZXJzcGVjdGl2ZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5hY3Rpb25zLk9wZW5QZXJzcGVjdGl2ZURpYWxvZ0FjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5kaWFsb2dzLlNlbGVjdFBlcnNwZWN0aXZlRGlhbG9nOwotCi0vKioKLSAqIERlZmluZXMgdGhlIGNsYXNzLgotICogCi0gKiBAYXV0aG9yIEJpbmd4dWUgWHUKLSAqIEBzaW5jZSAxLjAKLSAqLwotCi1wdWJsaWMgY2xhc3MgVUlPcGVuUGVyc3BlY3RpdmVEaWFsb2dBY3Rpb24gZXh0ZW5kcyBPcGVuUGVyc3BlY3RpdmVEaWFsb2dBY3Rpb24gewotCXByaXZhdGUgSVdvcmtiZW5jaFdpbmRvdyB3b3JrYmVuY2hXaW5kb3c7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvcgotCSAqIEBwYXJhbSB3aW5kb3cKLQkgKi8KLQlwdWJsaWMgVUlPcGVuUGVyc3BlY3RpdmVEaWFsb2dBY3Rpb24oSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cpIHsKLQkJc3VwZXIod2luZG93KTsKLQkJdGhpcy53b3JrYmVuY2hXaW5kb3cgPSB3aW5kb3c7Ci0JfQotCi0JIC8qKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiAKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb24jcnVuKCkKLSAgICAgKi8KLQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCWlmICh3b3JrYmVuY2hXaW5kb3cgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCVNlbGVjdFBlcnNwZWN0aXZlRGlhbG9nIGRsZyA9IG5ldyBTZWxlY3RQZXJzcGVjdGl2ZURpYWxvZygKLQkJCQl3b3JrYmVuY2hXaW5kb3cuZ2V0U2hlbGwoKSwgd29ya2JlbmNoV2luZG93LmdldFdvcmtiZW5jaCgpCi0JCQkJCQkuZ2V0UGVyc3BlY3RpdmVSZWdpc3RyeSgpKTsKLQkJZGxnLm9wZW4oKTsKLQkJaWYgKGRsZy5nZXRSZXR1cm5Db2RlKCkgPT0gV2luZG93LkNBTkNFTCkKLQkJCXJldHVybjsKLQkJSVBlcnNwZWN0aXZlRGVzY3JpcHRvciBkZXNjID0gZGxnLmdldFNlbGVjdGlvbigpOwotCQlpZiAoZGVzYyAhPSBudWxsKSB7Ci0JCQlQZXJzcGVjdGl2ZVV0aWwub3BlblBlcnNwZWN0aXZlKGRlc2MuZ2V0SWQoKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQl3b3JrYmVuY2hXaW5kb3cgPSBudWxsOwotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3JjcC91aS9hY3Rpb25zL3BhY2thZ2UuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9yY3AvdWkvYWN0aW9ucy9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0OGU3NjEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3JjcC91aS9hY3Rpb25zL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIGFjdGlvbnMgZm9yIHRoZSBzdGFuZGFsb25lIFJDUC1iYXNlZCBFUEYgQ29tcG9zZXIuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3JjcC91aS9wYWNrYWdlLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmNwL3VpL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGZkY2VkOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmNwL3VpL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIHRoZSBpbXBsZW1lbnRhdGlvbiBmb3IgdGhlIHN0YW5kYWxvbmUgUkNQLWJhc2VkIEVQRiBDb21wb3Nlci4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmNwL3VpL3dpemFyZHMvVUlFeHBvcnRXaXphcmQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9yY3AvdWkvd2l6YXJkcy9VSUV4cG9ydFdpemFyZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZDg3NWViLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9yY3AvdWkvd2l6YXJkcy9VSUV4cG9ydFdpemFyZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnJjcC51aS53aXphcmRzOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudWkud2l6YXJkcy5XaXphcmRDYXRlZ29yaWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLldvcmtiZW5jaFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5kaWFsb2dzLkV4cG9ydFdpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5kaWFsb2dzLldpemFyZENvbGxlY3Rpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmRpYWxvZ3MuV29ya2JlbmNoV2l6YXJkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5tb2RlbC5BZGFwdGFibGVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLndpemFyZHMuSVdpemFyZENhdGVnb3J5OwotCi0vKioKLSAqIFVJRXhwb3J0IGNsYXNzIHdpbGwgZmlsdGVyIG91dCB0aGUgd2l6YXJkIGNhdGVnb3JpZXMgd2hpY2ggYXJlIG5vdCByZWxhdGVkIAotICogdG8gRVBGLiBVSUV4cG9ydCBhbGxvd3Mgb25seSBVbkNhdGVnb3JpemVkIDxsaW5rPldpemFyZHNSZWdpc3RyeVJlYWRlci5VTkNBVEVHT1JJWkVEX1dJWkFSRF9DQVRFR09SWTwvbGluaz4KLSAqIGNhdGVnb3J5ICAoPGxpbms+b3JnLmVjbGlwc2UudWkuT3RoZXJzPC9saW5rPikKLSAqIGFuZCBmaWx0ZXJzIGFzIHdlbGwgaW4gT3RoZXJzIGNhdGVnb3J5IHdpemFyZHMgbGlzdC4gIAotICogCi0gKiBAYXV0aG9yIEJpbmd4dWUgWHUKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBVSUV4cG9ydFdpemFyZCBleHRlbmRzIEV4cG9ydFdpemFyZCB7Ci0KLQlwcm90ZWN0ZWQgQWRhcHRhYmxlTGlzdCBnZXRBdmFpbGFibGVFeHBvcnRXaXphcmRzKCkgewotCQkvLyBUT0RPOiBleHBvcnRzIGFyZSBzdGlsbCBmbGF0IC0gd2UgbmVlZCB0byBnZXQgYXQgdGhlIGZsYXQgbGlzdC4gQWxsCi0JCS8vIHdpemFyZHMgd2lsbCBiZSBpbiB0aGUgIm90aGVyIiBjYXRlZ29yeS4KLQkJSVdpemFyZENhdGVnb3J5IHJvb3QgPSBXb3JrYmVuY2hQbHVnaW4uZ2V0RGVmYXVsdCgpCi0JCQkJLmdldEV4cG9ydFdpemFyZFJlZ2lzdHJ5KCkuZ2V0Um9vdENhdGVnb3J5KCk7Ci0JCVdpemFyZENvbGxlY3Rpb25FbGVtZW50IGNhdGVnb3J5ID0gKFdpemFyZENvbGxlY3Rpb25FbGVtZW50KSByb290Ci0JCQkJLmZpbmRDYXRlZ29yeShuZXcgUGF0aChXaXphcmRDYXRlZ29yaWVzLkVYUE9SVF9XSVpBUkRTX0NBVEVHT1JZKSk7Ci0JCQotCQlBZGFwdGFibGVMaXN0IHJlc3VsdDsKLQkJaWYgKGNhdGVnb3J5ID09IG51bGwpCi0JCQlyZXN1bHQgPSBuZXcgQWRhcHRhYmxlTGlzdCgpOwotCQllbHNlCi0JCQlyZXN1bHQgPSBjYXRlZ29yeS5nZXRXaXphcmRBZGFwdGFibGVMaXN0KCk7Ci0KLQkJQWRhcHRhYmxlTGlzdCBmaWx0ZXJlZFJlc3VsdCA9IGRvRmlsdGVyKHJlc3VsdCk7Ci0JCWlmKGZpbHRlcmVkUmVzdWx0LnNpemUoKSA+IDApewotCQkJcmV0dXJuIGZpbHRlcmVkUmVzdWx0OwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCQotCS8qKgotCSAqIGZpbHRlciBvdXQgbm9uLWFsbG93YWJsZSBleHBvcnQgd2l6YXJkIGNhdGVnb3JpZXMKLQkgKiBAcGFyYW0gbGlzdAotCSAqIEByZXR1cm4gQWRhcHRhYmxlTGlzdAotCSAqLwotCXB1YmxpYyBBZGFwdGFibGVMaXN0IGRvRmlsdGVyKEFkYXB0YWJsZUxpc3QgbGlzdCl7Ci0JCUxpc3QgZXh0ZW5zaW9ucyA9IFVJRXhwb3J0V2l6YXJkRXh0ZW5zaW9uUG9pbnQuZ2V0SW5zdGFuY2UoKS5nZXRQYWdlUHJvdmlkZXJzKCk7Ci0JCUFkYXB0YWJsZUxpc3QgZmlsdGVyZWRSZXN1bHQgPSBuZXcgQWRhcHRhYmxlTGlzdCgpOwotCQlPYmplY3RbXSBvYmpzID0gbGlzdC5nZXRDaGlsZHJlbigpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG9ianMubGVuZ3RoOyBpKyspIHsKLQkJCVdvcmtiZW5jaFdpemFyZEVsZW1lbnQgb2JqID0gKFdvcmtiZW5jaFdpemFyZEVsZW1lbnQpIG9ianNbaV07Ci0JCQlTdHJpbmcgaWQgPSBvYmouZ2V0SWQoKTsKLQkJCWlmKCFleHRlbnNpb25zLmlzRW1wdHkoKSAmJiBleHRlbnNpb25zLmNvbnRhaW5zKGlkKSl7Ci0JCQkJZmlsdGVyZWRSZXN1bHQuYWRkKG9iaik7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZpbHRlcmVkUmVzdWx0OwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9yY3AvdWkvd2l6YXJkcy9VSUV4cG9ydFdpemFyZEV4dGVuc2lvblBvaW50LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmNwL3VpL3dpemFyZHMvVUlFeHBvcnRXaXphcmRFeHRlbnNpb25Qb2ludC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNjk5N2Q3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9yY3AvdWkvd2l6YXJkcy9VSUV4cG9ydFdpemFyZEV4dGVuc2lvblBvaW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnJjcC51aS53aXphcmRzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmNwLnVpLlJDUFVJUGx1Z2luOwotCi0vKioKLSAqIE1hbmFnZXMgdGhlICdvcmcuZWNsaXBzZS5lcGYudWkuZXhwb3J0V2l6YXJkcyIgZXh0ZW5zaW9uIHBvaW50LgotICogPHA+Ci0gKiBUaGlzIGV4dGVuc2lvbiBwb2ludCBhbGxvd3MgYSBjb250cmlidXRpbmcgcGx1Zy1pbiB0byBhZGQgaXRzIGV4cG9ydCB3aXphcmRzCi0gKiB0byB0aGUgc3RhbmRhbG9uZSBSQ1AtYmFzZWQgRVBGIENvbXBvc2VyIEV4cG9ydCB3aXphcmQgcGFnZS4KLSAqIAotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFVJRXhwb3J0V2l6YXJkRXh0ZW5zaW9uUG9pbnQgewotCi0JLyoqCi0JICogVGhlIGV4dGVuc2lvbiBuYW1lc3BhY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFHRV9QUk9WSURFUlNfRVhURU5TSU9OX05BTUVTUEFDRSA9ICJvcmcuZWNsaXBzZS5lcGYudWkiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgZXh0ZW5zaW9uIG5hbWUuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFHRV9QUk9WSURFUlNfRVhURU5TSU9OX05BTUUgPSAiZXhwb3J0V2l6YXJkcyI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSBleHRlbnNpb24gQXR0cmlidXRlcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBR0VfUFJPVklERVJfRVhURU5TSU9OX0FUVFJfSUQgPSAiaWQiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIEFycmF5TGlzdCBleHRlbnNpb25zTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQotCS8vIFRoZSBzaGFyZWQgaW5zdGFuY2UuCi0JcHJpdmF0ZSBzdGF0aWMgVUlFeHBvcnRXaXphcmRFeHRlbnNpb25Qb2ludCBpbnN0YW5jZSA9IG51bGw7Ci0KLQlwdWJsaWMgc3RhdGljIFVJRXhwb3J0V2l6YXJkRXh0ZW5zaW9uUG9pbnQgZ2V0SW5zdGFuY2UoKSB7Ci0JCWlmIChpbnN0YW5jZSA9PSBudWxsKSB7Ci0JCQlzeW5jaHJvbml6ZWQgKFVJSW1wb3J0V2l6YXJkRXh0ZW5zaW9uUG9pbnQuY2xhc3MpIHsKLQkJCQlpZiAoaW5zdGFuY2UgPT0gbnVsbCkgewotCQkJCQlpbnN0YW5jZSA9IG5ldyBVSUV4cG9ydFdpemFyZEV4dGVuc2lvblBvaW50KCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXByaXZhdGUgVUlFeHBvcnRXaXphcmRFeHRlbnNpb25Qb2ludCgpIHsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFsbCB0aGUgcGFnZSBwcm92aWRlcnMKLQkgKiAKLQkgKiBAcmV0dXJuIGFsbCB0aGUgcGFnZSBwcm92aWRlcnMuCi0JICovCi0JcHVibGljIExpc3QgZ2V0UGFnZVByb3ZpZGVycygpIHsKLQkJcmV0dXJuIGV4dGVuc2lvbnNMaXN0OwotCX0KLQotCS8qKgotCSAqIExvYWRzIHRoZSBjb25maWd1cmF0aW9uIHByb3ZpZGVycyBzcGVjaWZpZWQgdmlhIHRoZQotCSAqICJvcmcuZWNsaXBzZS5lcGYudWkuZXhwb3J0V2l6YXJkcyIgZXh0ZW5zaW9uIHBvaW50LgotCSAqLwotCXB1YmxpYyB2b2lkIGxvYWRFeHRlbnNpb24oKSB7Ci0JCUlFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCk7Ci0JCUlFeHRlbnNpb25Qb2ludCBleHRlbnNpb25Qb2ludCA9IGV4dGVuc2lvblJlZ2lzdHJ5LmdldEV4dGVuc2lvblBvaW50KAotCQkJCVBBR0VfUFJPVklERVJTX0VYVEVOU0lPTl9OQU1FU1BBQ0UsCi0JCQkJUEFHRV9QUk9WSURFUlNfRVhURU5TSU9OX05BTUUpOwotCQlpZiAoZXh0ZW5zaW9uUG9pbnQgIT0gbnVsbCkgewotCQkJSUV4dGVuc2lvbltdIGV4dGVuc2lvbnMgPSBleHRlbnNpb25Qb2ludC5nZXRFeHRlbnNpb25zKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGV4dGVuc2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCQlJRXh0ZW5zaW9uIGV4dGVuc2lvbiA9IGV4dGVuc2lvbnNbaV07Ci0JCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gY29uZmlnRWxlbWVudHMgPSBleHRlbnNpb24KLQkJCQkJCS5nZXRDb25maWd1cmF0aW9uRWxlbWVudHMoKTsKLQkJCQlmb3IgKGludCBqID0gMDsgaiA8IGNvbmZpZ0VsZW1lbnRzLmxlbmd0aDsgaisrKSB7Ci0JCQkJCUlDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWdFbGVtZW50ID0gY29uZmlnRWxlbWVudHNbal07Ci0JCQkJCXRyeSB7Ci0JCQkJCQlTdHJpbmcgaWQgPSBjb25maWdFbGVtZW50Ci0JCQkJCQkJCS5nZXRBdHRyaWJ1dGUoUEFHRV9QUk9WSURFUl9FWFRFTlNJT05fQVRUUl9JRCk7Ci0JCQkJCQlleHRlbnNpb25zTGlzdC5hZGQoaWQpOwotCi0JCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlSQ1BVSVBsdWdpbgotCQkJCQkJCQkuZ2V0RGVmYXVsdCgpCi0JCQkJCQkJCS5nZXRMb2dnZXIoKQotCQkJCQkJCQkubG9nRXJyb3IoCi0JCQkJCQkJCQkJIkZhaWxlZCB0byBleHBvcnQgaW1wb3J0IGNvbnRyaWJ1dGlvbiBleHRlbnNpb24gcG9pbnRzIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3JjcC91aS93aXphcmRzL1VJSW1wb3J0V2l6YXJkLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmNwL3VpL3dpemFyZHMvVUlJbXBvcnRXaXphcmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzUzYTBlYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmNwL3VpL3dpemFyZHMvVUlJbXBvcnRXaXphcmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5yY3AudWkud2l6YXJkczsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVpLndpemFyZHMuV2l6YXJkQ2F0ZWdvcmllczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5Xb3JrYmVuY2hQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuZGlhbG9ncy5JbXBvcnRXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuZGlhbG9ncy5XaXphcmRDb2xsZWN0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5kaWFsb2dzLldvcmtiZW5jaFdpemFyZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubW9kZWwuQWRhcHRhYmxlTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS53aXphcmRzLklXaXphcmRDYXRlZ29yeTsKLQotLyoqCi0gKiBVSUltcG9ydCBjbGFzcyB3aWxsIGZpbHRlciBvdXQgdGhlIHdpemFyZCBjYXRlZ29yaWVzIHdoaWNoIGFyZSBub3QgcmVsYXRlZCB0bwotICogRVBGLiBVSUltcG9ydCBhbGxvd3Mgb25seSBVbkNhdGVnb3JpemVkCi0gKiA8bGluaz5XaXphcmRzUmVnaXN0cnlSZWFkZXIuVU5DQVRFR09SSVpFRF9XSVpBUkRfQ0FURUdPUlk8L2xpbms+IGNhdGVnb3J5ICg8bGluaz5vcmcuZWNsaXBzZS51aS5PdGhlcnM8L2xpbms+KQotICogYW5kIGZpbHRlcnMgYXMgd2VsbCBpbiBPdGhlcnMgY2F0ZWdvcnkgd2l6YXJkcyBsaXN0LgotICogCi0gKiBAYXV0aG9yIEJpbmd4dWUgWHUKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQGF1dG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotCi1wdWJsaWMgY2xhc3MgVUlJbXBvcnRXaXphcmQgZXh0ZW5kcyBJbXBvcnRXaXphcmQgewotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgaW1wb3J0IHdpemFyZHMgdGhhdCBhcmUgYXZhaWxhYmxlIGZvciBpbnZvY2F0aW9uLiBBbHNvIGZpbHRlcgotCSAqIGltcG9ydCB3aXphcmQgbGlzdCBvZiB1bmNhdGVnb3JpemVkIChvcmcuZWNsaXBzZS51aS5PdGhlcnMpCi0JICovCi0JcHJvdGVjdGVkIEFkYXB0YWJsZUxpc3QgZ2V0QXZhaWxhYmxlSW1wb3J0V2l6YXJkcygpIHsKLQkJLy8gVE9ETzogaW1wb3J0cyBhcmUgc3RpbGwgZmxhdCAtIHdlIG5lZWQgdG8gZ2V0IGF0IHRoZSBmbGF0IGxpc3QuIEFsbAotCQkvLyB3aXphcmRzIHdpbGwgYmUgaW4gdGhlICJvdGhlciIgY2F0ZWdvcnkuCi0JCUlXaXphcmRDYXRlZ29yeSByb290ID0gV29ya2JlbmNoUGx1Z2luLmdldERlZmF1bHQoKQotCQkJCS5nZXRJbXBvcnRXaXphcmRSZWdpc3RyeSgpLmdldFJvb3RDYXRlZ29yeSgpOwotCQlXaXphcmRDb2xsZWN0aW9uRWxlbWVudCBjYXRlZ29yeSA9IChXaXphcmRDb2xsZWN0aW9uRWxlbWVudCkgcm9vdAotCQkJCS5maW5kQ2F0ZWdvcnkobmV3IFBhdGgoV2l6YXJkQ2F0ZWdvcmllcy5JTVBPUlRfV0laQVJEU19DQVRFR09SWSkpOwotCQlBZGFwdGFibGVMaXN0IHJlc3VsdDsKLQkJaWYgKGNhdGVnb3J5ID09IG51bGwpCi0JCQlyZXN1bHQgPSBuZXcgQWRhcHRhYmxlTGlzdCgpOwotCQllbHNlCi0JCQlyZXN1bHQgPSBjYXRlZ29yeS5nZXRXaXphcmRBZGFwdGFibGVMaXN0KCk7Ci0KLQkJQWRhcHRhYmxlTGlzdCBmaWx0ZXJlZFJlc3VsdCA9IGRvRmlsdGVyKHJlc3VsdCk7Ci0JCWlmIChmaWx0ZXJlZFJlc3VsdC5zaXplKCkgPiAwKSB7Ci0JCQlyZXR1cm4gZmlsdGVyZWRSZXN1bHQ7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBGaWx0ZXIgb3V0IG5vbi1hbGxvd2FibGUgaW1wb3J0IHdpemFyZCBjYXRlZ29yaWVzCi0JICogCi0JICogQHBhcmFtIGxpc3QKLQkgKiBAcmV0dXJuIEFkYXB0YWJsZUxpc3QKLQkgKi8KLQlwdWJsaWMgQWRhcHRhYmxlTGlzdCBkb0ZpbHRlcihBZGFwdGFibGVMaXN0IGxpc3QpIHsKLQkJTGlzdCBleHRlbnNpb25zID0gVUlJbXBvcnRXaXphcmRFeHRlbnNpb25Qb2ludC5nZXRJbnN0YW5jZSgpCi0JCQkJLmdldFBhZ2VQcm92aWRlcnMoKTsKLQkJQWRhcHRhYmxlTGlzdCBmaWx0ZXJlZFJlc3VsdCA9IG5ldyBBZGFwdGFibGVMaXN0KCk7Ci0JCU9iamVjdFtdIG9ianMgPSBsaXN0LmdldENoaWxkcmVuKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgb2Jqcy5sZW5ndGg7IGkrKykgewotCQkJV29ya2JlbmNoV2l6YXJkRWxlbWVudCBvYmogPSAoV29ya2JlbmNoV2l6YXJkRWxlbWVudCkgb2Jqc1tpXTsKLQkJCVN0cmluZyBpZCA9IG9iai5nZXRJZCgpOwotCQkJaWYgKCFleHRlbnNpb25zLmlzRW1wdHkoKSAmJiBleHRlbnNpb25zLmNvbnRhaW5zKGlkKSkgewotCQkJCWZpbHRlcmVkUmVzdWx0LmFkZChvYmopOwotCQkJfQotCQl9Ci0JCXJldHVybiBmaWx0ZXJlZFJlc3VsdDsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmNwL3VpL3dpemFyZHMvVUlJbXBvcnRXaXphcmRFeHRlbnNpb25Qb2ludC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3JjcC91aS93aXphcmRzL1VJSW1wb3J0V2l6YXJkRXh0ZW5zaW9uUG9pbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTE1NWY1MC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmNwL3VpL3dpemFyZHMvVUlJbXBvcnRXaXphcmRFeHRlbnNpb25Qb2ludC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA4ICswLDAgQEAKLS8qKgotICogCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnJjcC51aS53aXphcmRzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmNwLnVpLlJDUFVJUGx1Z2luOwotCi0vKioKLSAqIE1hbmFnZXMgdGhlICdvcmcuZWNsaXBzZS5lcGYudWkuaW1wb3J0V2l6YXJkcyIgZXh0ZW5zaW9uIHBvaW50LgotICogPHA+Ci0gKiBUaGlzIGV4dGVuc2lvbiBwb2ludCBhbGxvd3MgYSBjb250cmlidXRpbmcgcGx1Zy1pbiB0byBhZGQgaXRzIGltcG9ydCB3aXphcmRzCi0gKiB0byB0aGUgc3RhbmRhbG9uZSBSQ1AtYmFzZWQgRVBGIENvbXBvc2VyIEltcG9ydCB3aXphcmQgcGFnZS4KLSAqIAotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFVJSW1wb3J0V2l6YXJkRXh0ZW5zaW9uUG9pbnQgewotCi0JLyoqCi0JICogVGhlIGV4dGVuc2lvbiBuYW1lc3BhY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFHRV9QUk9WSURFUlNfRVhURU5TSU9OX05BTUVTUEFDRSA9ICJvcmcuZWNsaXBzZS5lcGYudWkiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgZXh0ZW5zaW9uIG5hbWUuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFHRV9QUk9WSURFUlNfRVhURU5TSU9OX05BTUUgPSAiaW1wb3J0V2l6YXJkcyI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSBleHRlbnNpb24gQXR0cmlidXRlcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBR0VfUFJPVklERVJfRVhURU5TSU9OX0FUVFJfSUQgPSAiaWQiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIEFycmF5TGlzdCBleHRlbnNpb25zTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQotCS8vIFRoZSBzaGFyZWQgaW5zdGFuY2UuCi0JcHJpdmF0ZSBzdGF0aWMgVUlJbXBvcnRXaXphcmRFeHRlbnNpb25Qb2ludCBpbnN0YW5jZSA9IG51bGw7Ci0KLQlwdWJsaWMgc3RhdGljIFVJSW1wb3J0V2l6YXJkRXh0ZW5zaW9uUG9pbnQgZ2V0SW5zdGFuY2UoKSB7Ci0JCWlmIChpbnN0YW5jZSA9PSBudWxsKSB7Ci0JCQlzeW5jaHJvbml6ZWQgKFVJSW1wb3J0V2l6YXJkRXh0ZW5zaW9uUG9pbnQuY2xhc3MpIHsKLQkJCQlpZiAoaW5zdGFuY2UgPT0gbnVsbCkgewotCQkJCQlpbnN0YW5jZSA9IG5ldyBVSUltcG9ydFdpemFyZEV4dGVuc2lvblBvaW50KCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXByaXZhdGUgVUlJbXBvcnRXaXphcmRFeHRlbnNpb25Qb2ludCgpIHsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFsbCB0aGUgcGFnZSBwcm92aWRlcnMKLQkgKiAKLQkgKiBAcmV0dXJuIGFsbCB0aGUgcGFnZSBwcm92aWRlcnMuCi0JICovCi0JcHVibGljIExpc3QgZ2V0UGFnZVByb3ZpZGVycygpIHsKLQkJcmV0dXJuIGV4dGVuc2lvbnNMaXN0OwotCX0KLQotCS8qKgotCSAqIExvYWRzIHRoZSBjb25maWd1cmF0aW9uIHByb3ZpZGVycyBzcGVjaWZpZWQgdmlhIHRoZQotCSAqICJjb20uaWJtLnByb2Nlc3MucGFnZVByb3ZpZGVycyIgZXh0ZW5zaW9uIHBvaW50LgotCSAqLwotCXB1YmxpYyB2b2lkIGxvYWRFeHRlbnNpb24oKSB7Ci0JCUlFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCk7Ci0JCUlFeHRlbnNpb25Qb2ludCBleHRlbnNpb25Qb2ludCA9IGV4dGVuc2lvblJlZ2lzdHJ5LmdldEV4dGVuc2lvblBvaW50KAotCQkJCVBBR0VfUFJPVklERVJTX0VYVEVOU0lPTl9OQU1FU1BBQ0UsCi0JCQkJUEFHRV9QUk9WSURFUlNfRVhURU5TSU9OX05BTUUpOwotCQlpZiAoZXh0ZW5zaW9uUG9pbnQgIT0gbnVsbCkgewotCQkJSUV4dGVuc2lvbltdIGV4dGVuc2lvbnMgPSBleHRlbnNpb25Qb2ludC5nZXRFeHRlbnNpb25zKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGV4dGVuc2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCQlJRXh0ZW5zaW9uIGV4dGVuc2lvbiA9IGV4dGVuc2lvbnNbaV07Ci0JCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gY29uZmlnRWxlbWVudHMgPSBleHRlbnNpb24KLQkJCQkJCS5nZXRDb25maWd1cmF0aW9uRWxlbWVudHMoKTsKLQkJCQlmb3IgKGludCBqID0gMDsgaiA8IGNvbmZpZ0VsZW1lbnRzLmxlbmd0aDsgaisrKSB7Ci0JCQkJCUlDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWdFbGVtZW50ID0gY29uZmlnRWxlbWVudHNbal07Ci0JCQkJCXRyeSB7Ci0JCQkJCQlTdHJpbmcgaWQgPSBjb25maWdFbGVtZW50Ci0JCQkJCQkJCS5nZXRBdHRyaWJ1dGUoUEFHRV9QUk9WSURFUl9FWFRFTlNJT05fQVRUUl9JRCk7Ci0JCQkJCQlleHRlbnNpb25zTGlzdC5hZGQoaWQpOwotCi0JCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlSQ1BVSVBsdWdpbgotCQkJCQkJCQkuZ2V0RGVmYXVsdCgpCi0JCQkJCQkJCS5nZXRMb2dnZXIoKQotCQkJCQkJCQkubG9nRXJyb3IoCi0JCQkJCQkJCQkJIkZhaWxlZCB0byBleHBvcnQgaW1wb3J0IGNvbnRyaWJ1dGlvbiBleHRlbnNpb24gcG9pbnRzIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3JjcC91aS93aXphcmRzL3BhY2thZ2UuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9yY3AvdWkvd2l6YXJkcy9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkZDBlN2YuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3JjcC91aS93aXphcmRzL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIGV4cG9ydCBhbmQgaW1wb3J0IHdpemFyZHMgVUkgbWFuYWdlbWVudCBpbiB0aGUgc3RhbmRhbG9uZSBSQ1AtYmFzZWQgRVBGIENvbXBvc2VyLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AvLmNsYXNzcGF0aCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGRmMGY0MC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLy5wcm9qZWN0IGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjQ1MTgzYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuZXBmLnJjcDwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYzI0M2YwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVmZWF0dXJlUGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuZXBmLnJjcDsgc2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS41LjAucXVhbGlmaWVyCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUVjbGlwc2UtTGF6eVN0YXJ0OiB0cnVlCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AvYWJvdXQuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGM5OTA4Ni4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotIAotPHA+RmVicnVhcnkgMjQsIDIwMDU8L3A+CQotPGgzPkxpY2Vuc2U8L2gzPgotCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50LjwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AvYWJvdXQuaW5pIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC9hYm91dC5pbmkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwNGY0ZmEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC9hYm91dC5pbmkKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSMgYWJvdXQuaW5pCi0jIGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IGEgZmVhdHVyZQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyAiJWtleSIgYXJlIGV4dGVybmFsaXplZCBzdHJpbmdzIGRlZmluZWQgaW4gYWJvdXQucHJvcGVydGllcwotIyBUaGlzIGZpbGUgZG9lcyBub3QgbmVlZCB0byBiZSB0cmFuc2xhdGVkLgotCi0jIFByb3BlcnR5ICJhYm91dFRleHQiIGNvbnRhaW5zIGJsdXJiIGZvciAiQWJvdXQiIGRpYWxvZyAodHJhbnNsYXRlZCkKLWFib3V0VGV4dD0lZmVhdHVyZVRleHQKLQotIyBQcm9wZXJ0eSAiZmVhdHVyZUltYWdlIiBjb250YWlucyBwYXRoIHRvIGZlYXR1cmUgaW1hZ2UgKDMyeDMyKQotZmVhdHVyZUltYWdlPWFwcGxpY2F0aW9uXzMyLmdpZgotCi0jIFByb3BlcnR5ICJhcHBOYW1lIiBjb250YWlucyBuYW1lIG9mIHRoZSBhcHBsaWNhdGlvbiAodHJhbnNsYXRlZCkKLWFwcE5hbWU9JWZlYXR1cmVOYW1lCi0KLSMgUHJvcGVydHkgIndlbGNvbWVQYWdlIiBjb250YWlucyBwYXRoIHRvIHdlbGNvbWUgcGFnZSAoc3BlY2lhbCBYTUwtYmFzZWQgZm9ybWF0KQotd2VsY29tZVBhZ2U9JG5sJC93ZWxjb21lLnhtbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC9hYm91dC5tYXBwaW5ncyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AvYWJvdXQubWFwcGluZ3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5ZGZkZGMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC9hYm91dC5tYXBwaW5ncworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotIyBhYm91dC5tYXBwaW5ncwotIyBjb250YWlucyBmaWxsLWlucyBmb3IgYWJvdXQucHJvcGVydGllcwotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBUaGlzIGZpbGUgZG9lcyBub3QgbmVlZCB0byBiZSB0cmFuc2xhdGVkLgotIyBVc3VhbGx5IGdlbmVyYXRlZCBhdCBidWlsZCB0aW1lLgotCi0wPUBidWlsZC1JREAKLTE9MS41LjAKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AvYWJvdXQucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AvYWJvdXQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzNiNjI2NC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwL2Fib3V0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSCi0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jIERvIG5vdCBjaGFuZ2UgdGhlIHByb3BlcnRpZXMgYmV0d2VlbiB0aGlzIGxpbmUgYW5kIHRoZSBsYXN0IGxpbmUgY29udGFpbmluZzoKLSMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlCi0jIEluc3RlYWQsIGVpdGhlciByZWRlZmluZSBhbiBleGlzdGluZyBwcm9wZXJ0eSwgb3IgY3JlYXRlIGEgbmV3IHByb3BlcnR5LAotIyBhcHBlbmQgaXQgdG8gdGhlIGVuZCBvZiB0aGUgZmlsZSwgYW5kIGNoYW5nZSB0aGUgY29kZSB0byB1c2UgdGhlIG5ldyBuYW1lLgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotIyBhYm91dC5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBhYm91dC5pbmkKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgZmlsbC1pbnMgYXJlIHN1cHBsaWVkIGJ5IGFib3V0Lm1hcHBpbmdzCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLQotZmVhdHVyZU5hbWU9RVBGIFJDUAotCi1mZWF0dXJlVGV4dD1FUEYgUkNQXG5cCi1cblwKLVZlcnNpb246IHsxfSBcblwKLUJ1aWxkIExhYmVsOiB7MH1cblwKLVxuXAotKGMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyBhbmQgb3RoZXJzIDIwMDAsIDIwMDguICBBbGwgUmlnaHRzIFJlc2VydmVkLlxuXAotXG5cCi0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQotIyBUaGUgYWJvdmUgcHJvcGVydGllcyBoYXZlIGJlZW4gc2hpcHBlZCBmb3IgdHJhbnNsYXRpb24uCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC9hcHBsaWNhdGlvbl8zMi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwL2FwcGxpY2F0aW9uXzMyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTZhZDdjYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwL2FwcGxpY2F0aW9uXzMyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AvYnVpbGQucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGUwNTI5Yy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi1iaW4uaW5jbHVkZXMgPSAuLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBubC8sXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICBhYm91dC5pbmksXAotICAgICAgICAgICAgICAgYWJvdXQucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBhcHBsaWNhdGlvbl8zMi5naWYsXAotICAgICAgICAgICAgICAgd2VsY29tZS54bWwsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgYWJvdXQubWFwcGluZ3MKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AvbmwvZGEvYWJvdXQucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AvbmwvZGEvYWJvdXQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWVkNzUxZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwL25sL2RhL2Fib3V0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSCi0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jIERvIG5vdCBjaGFuZ2UgdGhlIHByb3BlcnRpZXMgYmV0d2VlbiB0aGlzIGxpbmUgYW5kIHRoZSBsYXN0IGxpbmUgY29udGFpbmluZzoKLSMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlCi0jIEluc3RlYWQsIGVpdGhlciByZWRlZmluZSBhbiBleGlzdGluZyBwcm9wZXJ0eSwgb3IgY3JlYXRlIGEgbmV3IHByb3BlcnR5LAotIyBhcHBlbmQgaXQgdG8gdGhlIGVuZCBvZiB0aGUgZmlsZSwgYW5kIGNoYW5nZSB0aGUgY29kZSB0byB1c2UgdGhlIG5ldyBuYW1lLgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotIyBhYm91dC5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBhYm91dC5pbmkKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgZmlsbC1pbnMgYXJlIHN1cHBsaWVkIGJ5IGFib3V0Lm1hcHBpbmdzCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLQotZmVhdHVyZU5hbWU9RVBGIFJDUAotCi1mZWF0dXJlVGV4dD1FUEYgUkNQXG5cCi1cblwKLVZlcnNpb246IHsxfSBcblwKLUJ5Z2dlZXRpa2V0OiB7MH1cblwKLVxuXAotKGMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyBhbmQgb3RoZXJzIDIwMDAsIDIwMDcuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG5cCi1cbgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlCi0jIFRoZSBhYm92ZSBwcm9wZXJ0aWVzIGhhdmUgYmVlbiBzaGlwcGVkIGZvciB0cmFuc2xhdGlvbi4KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwL25sL2RlL2Fib3V0LnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwL25sL2RlL2Fib3V0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3NTJhMjMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC9ubC9kZS9hYm91dC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUgotCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyBEbyBub3QgY2hhbmdlIHRoZSBwcm9wZXJ0aWVzIGJldHdlZW4gdGhpcyBsaW5lIGFuZCB0aGUgbGFzdCBsaW5lIGNvbnRhaW5pbmc6Ci0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQotIyBJbnN0ZWFkLCBlaXRoZXIgcmVkZWZpbmUgYW4gZXhpc3RpbmcgcHJvcGVydHksIG9yIGNyZWF0ZSBhIG5ldyBwcm9wZXJ0eSwKLSMgYXBwZW5kIGl0IHRvIHRoZSBlbmQgb2YgdGhlIGZpbGUsIGFuZCBjaGFuZ2UgdGhlIGNvZGUgdG8gdXNlIHRoZSBuZXcgbmFtZS4KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSMgYWJvdXQucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgYWJvdXQuaW5pCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIGZpbGwtaW5zIGFyZSBzdXBwbGllZCBieSBhYm91dC5tYXBwaW5ncwotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0KLWZlYXR1cmVOYW1lPUVQRiAtIFJDUAotCi1mZWF0dXJlVGV4dD1FUEYgUkNQXG5cCi1cblwKLVZlcnNpb246IHsxfSBcblwKLUJ1aWxkLUtlbm5zYXR6OiB7MH1cblwKLVxuXAotKGMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyBhbmQgb3RoZXJzIDIwMDAsIDIwMDcuICBBbGwgUmlnaHRzIFJlc2VydmVkLlxuXAotXG4KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQotIyBUaGUgYWJvdmUgcHJvcGVydGllcyBoYXZlIGJlZW4gc2hpcHBlZCBmb3IgdHJhbnNsYXRpb24uCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC9ubC9lcy9hYm91dC5wcm9wZXJ0aWVzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC9ubC9lcy9hYm91dC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZGFiMDI5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AvbmwvZXMvYWJvdXQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgRG8gbm90IGNoYW5nZSB0aGUgcHJvcGVydGllcyBiZXR3ZWVuIHRoaXMgbGluZSBhbmQgdGhlIGxhc3QgbGluZSBjb250YWluaW5nOgotIyAlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUKLSMgSW5zdGVhZCwgZWl0aGVyIHJlZGVmaW5lIGFuIGV4aXN0aW5nIHByb3BlcnR5LCBvciBjcmVhdGUgYSBuZXcgcHJvcGVydHksCi0jIGFwcGVuZCBpdCB0byB0aGUgZW5kIG9mIHRoZSBmaWxlLCBhbmQgY2hhbmdlIHRoZSBjb2RlIHRvIHVzZSB0aGUgbmV3IG5hbWUuCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0jIGFib3V0LnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGFib3V0LmluaQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBmaWxsLWlucyBhcmUgc3VwcGxpZWQgYnkgYWJvdXQubWFwcGluZ3MKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotCi1mZWF0dXJlTmFtZT1SQ1AgZGUgRVBGCi0KLWZlYXR1cmVUZXh0PUVQRiBSQ1BcblwKLVxuXAotVmVyc2lcdTAwZjNuOiB7MX0gXG5cCi1FdGlxdWV0YSBkZSBidWlsZDogezB9XG5cCi1cblwKLShjKSBDb3B5cmlnaHQgQ29sYWJvcmFkb3JlcyBkZSBFY2xpcHNlIHkgb3Ryb3MgMjAwMCwgMjAwNy4gIFJlc2VydmFkb3MgdG9kb3MgbG9zIGRlcmVjaG9zLlxuXAotXG4KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQotIyBUaGUgYWJvdmUgcHJvcGVydGllcyBoYXZlIGJlZW4gc2hpcHBlZCBmb3IgdHJhbnNsYXRpb24uCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC9ubC9mci9hYm91dC5wcm9wZXJ0aWVzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC9ubC9mci9hYm91dC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYjgyMGVhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AvbmwvZnIvYWJvdXQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgRG8gbm90IGNoYW5nZSB0aGUgcHJvcGVydGllcyBiZXR3ZWVuIHRoaXMgbGluZSBhbmQgdGhlIGxhc3QgbGluZSBjb250YWluaW5nOgotIyAlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUKLSMgSW5zdGVhZCwgZWl0aGVyIHJlZGVmaW5lIGFuIGV4aXN0aW5nIHByb3BlcnR5LCBvciBjcmVhdGUgYSBuZXcgcHJvcGVydHksCi0jIGFwcGVuZCBpdCB0byB0aGUgZW5kIG9mIHRoZSBmaWxlLCBhbmQgY2hhbmdlIHRoZSBjb2RlIHRvIHVzZSB0aGUgbmV3IG5hbWUuCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0jIGFib3V0LnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGFib3V0LmluaQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBmaWxsLWlucyBhcmUgc3VwcGxpZWQgYnkgYWJvdXQubWFwcGluZ3MKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotCi1mZWF0dXJlTmFtZT1FUEYgUkNQCi0KLWZlYXR1cmVUZXh0PUVQRiBSQ1BcblwKLVxuXAotVmVyc2lvbiA6IHsxfSBcblwKLUxpYmVsbFx1MDBlOSBkZSB2ZXJzaW9uIDogezB9XG5cCi1cblwKLShjKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgYW5kIG90aGVycyAyMDAwLCAyMDA3LiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC5cblwKLVxuCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyAlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUKLSMgVGhlIGFib3ZlIHByb3BlcnRpZXMgaGF2ZSBiZWVuIHNoaXBwZWQgZm9yIHRyYW5zbGF0aW9uLgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AvbmwvaXQvYWJvdXQucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AvbmwvaXQvYWJvdXQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTNmZTFmZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwL25sL2l0L2Fib3V0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSCi0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jIERvIG5vdCBjaGFuZ2UgdGhlIHByb3BlcnRpZXMgYmV0d2VlbiB0aGlzIGxpbmUgYW5kIHRoZSBsYXN0IGxpbmUgY29udGFpbmluZzoKLSMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlCi0jIEluc3RlYWQsIGVpdGhlciByZWRlZmluZSBhbiBleGlzdGluZyBwcm9wZXJ0eSwgb3IgY3JlYXRlIGEgbmV3IHByb3BlcnR5LAotIyBhcHBlbmQgaXQgdG8gdGhlIGVuZCBvZiB0aGUgZmlsZSwgYW5kIGNoYW5nZSB0aGUgY29kZSB0byB1c2UgdGhlIG5ldyBuYW1lLgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotIyBhYm91dC5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBhYm91dC5pbmkKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgZmlsbC1pbnMgYXJlIHN1cHBsaWVkIGJ5IGFib3V0Lm1hcHBpbmdzCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLQotZmVhdHVyZU5hbWU9UkNQIEVQRgotCi1mZWF0dXJlVGV4dD1FUEYgUkNQXG5cCi1cblwKLVZlcnNpb25lOiB7MX0gXG5cCi1FdGljaGV0dGEgYnVpbGQ6IHswfVxuXAotXG5cCi0oYykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIGUgYWx0cmkgMjAwMCwgMjAwNy4gIFR1dHRpIGkgZGlyaXR0aSByaXNlcnZhdGkuXG5cCi1cbgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlCi0jIFRoZSBhYm92ZSBwcm9wZXJ0aWVzIGhhdmUgYmVlbiBzaGlwcGVkIGZvciB0cmFuc2xhdGlvbi4KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwL25sL2phL2Fib3V0LnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwL25sL2phL2Fib3V0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExZTg1MjQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC9ubC9qYS9hYm91dC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUgotCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyBEbyBub3QgY2hhbmdlIHRoZSBwcm9wZXJ0aWVzIGJldHdlZW4gdGhpcyBsaW5lIGFuZCB0aGUgbGFzdCBsaW5lIGNvbnRhaW5pbmc6Ci0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQotIyBJbnN0ZWFkLCBlaXRoZXIgcmVkZWZpbmUgYW4gZXhpc3RpbmcgcHJvcGVydHksIG9yIGNyZWF0ZSBhIG5ldyBwcm9wZXJ0eSwKLSMgYXBwZW5kIGl0IHRvIHRoZSBlbmQgb2YgdGhlIGZpbGUsIGFuZCBjaGFuZ2UgdGhlIGNvZGUgdG8gdXNlIHRoZSBuZXcgbmFtZS4KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSMgYWJvdXQucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgYWJvdXQuaW5pCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIGZpbGwtaW5zIGFyZSBzdXBwbGllZCBieSBhYm91dC5tYXBwaW5ncwotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0KLWZlYXR1cmVOYW1lPUVQRiBSQ1AKLQotZmVhdHVyZVRleHQ9RVBGIFJDUFxuXAotXG5cCi1cdTMwZDBcdTMwZmNcdTMwYjhcdTMwZTdcdTMwZjM6IHsxfSBcblwKLVx1MzBkM1x1MzBlYlx1MzBjOVx1MzBmYlx1MzBlOVx1MzBkOVx1MzBlYjogezB9XG5cCi1cblwKLShjKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgYW5kIG90aGVycyAyMDAwLCAyMDA3LiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC5cblwKLVxuCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyAlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUKLSMgVGhlIGFib3ZlIHByb3BlcnRpZXMgaGF2ZSBiZWVuIHNoaXBwZWQgZm9yIHRyYW5zbGF0aW9uLgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3Avbmwva28vYWJvdXQucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3Avbmwva28vYWJvdXQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWZmZDU1ZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwL25sL2tvL2Fib3V0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSCi0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jIERvIG5vdCBjaGFuZ2UgdGhlIHByb3BlcnRpZXMgYmV0d2VlbiB0aGlzIGxpbmUgYW5kIHRoZSBsYXN0IGxpbmUgY29udGFpbmluZzoKLSMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlCi0jIEluc3RlYWQsIGVpdGhlciByZWRlZmluZSBhbiBleGlzdGluZyBwcm9wZXJ0eSwgb3IgY3JlYXRlIGEgbmV3IHByb3BlcnR5LAotIyBhcHBlbmQgaXQgdG8gdGhlIGVuZCBvZiB0aGUgZmlsZSwgYW5kIGNoYW5nZSB0aGUgY29kZSB0byB1c2UgdGhlIG5ldyBuYW1lLgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotIyBhYm91dC5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBhYm91dC5pbmkKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgZmlsbC1pbnMgYXJlIHN1cHBsaWVkIGJ5IGFib3V0Lm1hcHBpbmdzCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLQotZmVhdHVyZU5hbWU9RVBGIFJDUAotCi1mZWF0dXJlVGV4dD1FUEYgUkNQXG5cCi1cblwKLVx1YmM4NFx1YzgwNDogezF9IFxuXAotXHViZTRjXHViNGRjIFx1YjgwOFx1Yzc3NFx1YmUxNDogezB9XG5cCi1cblwKLShjKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgYW5kIG90aGVycyAyMDAwLCAyMDA3LiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC5cblwKLVxuCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyAlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUKLSMgVGhlIGFib3ZlIHByb3BlcnRpZXMgaGF2ZSBiZWVuIHNoaXBwZWQgZm9yIHRyYW5zbGF0aW9uLgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AvbmwvcHQvQlIvYWJvdXQucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AvbmwvcHQvQlIvYWJvdXQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjAwMDZmMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwL25sL3B0L0JSL2Fib3V0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSCi0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jIERvIG5vdCBjaGFuZ2UgdGhlIHByb3BlcnRpZXMgYmV0d2VlbiB0aGlzIGxpbmUgYW5kIHRoZSBsYXN0IGxpbmUgY29udGFpbmluZzoKLSMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlCi0jIEluc3RlYWQsIGVpdGhlciByZWRlZmluZSBhbiBleGlzdGluZyBwcm9wZXJ0eSwgb3IgY3JlYXRlIGEgbmV3IHByb3BlcnR5LAotIyBhcHBlbmQgaXQgdG8gdGhlIGVuZCBvZiB0aGUgZmlsZSwgYW5kIGNoYW5nZSB0aGUgY29kZSB0byB1c2UgdGhlIG5ldyBuYW1lLgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotIyBhYm91dC5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBhYm91dC5pbmkKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgZmlsbC1pbnMgYXJlIHN1cHBsaWVkIGJ5IGFib3V0Lm1hcHBpbmdzCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLQotZmVhdHVyZU5hbWU9RVBGIFJDUAotCi1mZWF0dXJlVGV4dD1FUEYgUkNQXG5cCi1cblwKLVZlcnNcdTAwZTNvOiB7MX0gXG5cCi1Db25zdHJ1XHUwMGU3XHUwMGUzbzogezB9XG5cCi1cblwKLShjKSBDb3B5cmlnaHQgY29udHJpYnVpZG9yZXMgRWNsaXBzZSBlIG91dHJvcyAyMDAwLCAyMDA3LiBUb2RvcyBvcyBEaXJlaXRvcyBSZXNlcnZhZG9zLlxuXAotXG4KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQotIyBUaGUgYWJvdmUgcHJvcGVydGllcyBoYXZlIGJlZW4gc2hpcHBlZCBmb3IgdHJhbnNsYXRpb24uCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC9ubC9ydS9hYm91dC5wcm9wZXJ0aWVzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC9ubC9ydS9hYm91dC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MDE0MmE5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AvbmwvcnUvYWJvdXQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgRG8gbm90IGNoYW5nZSB0aGUgcHJvcGVydGllcyBiZXR3ZWVuIHRoaXMgbGluZSBhbmQgdGhlIGxhc3QgbGluZSBjb250YWluaW5nOgotIyAlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUKLSMgSW5zdGVhZCwgZWl0aGVyIHJlZGVmaW5lIGFuIGV4aXN0aW5nIHByb3BlcnR5LCBvciBjcmVhdGUgYSBuZXcgcHJvcGVydHksCi0jIGFwcGVuZCBpdCB0byB0aGUgZW5kIG9mIHRoZSBmaWxlLCBhbmQgY2hhbmdlIHRoZSBjb2RlIHRvIHVzZSB0aGUgbmV3IG5hbWUuCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0jIGFib3V0LnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGFib3V0LmluaQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBmaWxsLWlucyBhcmUgc3VwcGxpZWQgYnkgYWJvdXQubWFwcGluZ3MKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotCi1mZWF0dXJlTmFtZT1FUEYgUkNQCi0KLWZlYXR1cmVUZXh0PUVQRiBSQ1BcblwKLVxuXAotXHUwNDEyXHUwNDM1XHUwNDQwXHUwNDQxXHUwNDM4XHUwNDRmOiB7MX0gXG5cCi1cdTA0MWFcdTA0M2VcdTA0M2NcdTA0M2ZcdTA0M2VcdTA0M2RcdTA0M2VcdTA0MzJcdTA0M2FcdTA0MzA6IHswfVxuXAotXG5cCi0oYykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIGFuZCBvdGhlcnMgMjAwMCwgMjAwNy4gIFx1MDQxMlx1MDQ0MVx1MDQzNSBcdTA0M2ZcdTA0NDBcdTA0MzBcdTA0MzJcdTA0MzAgXHUwNDM3XHUwNDMwXHUwNDQ5XHUwNDM4XHUwNDQ5XHUwNDM1XHUwNDNkXHUwNDRiLlxuXAotXG4KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQotIyBUaGUgYWJvdmUgcHJvcGVydGllcyBoYXZlIGJlZW4gc2hpcHBlZCBmb3IgdHJhbnNsYXRpb24uCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC9ubC96aC9DTi9hYm91dC5wcm9wZXJ0aWVzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC9ubC96aC9DTi9hYm91dC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNzA1MjlhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AvbmwvemgvQ04vYWJvdXQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgRG8gbm90IGNoYW5nZSB0aGUgcHJvcGVydGllcyBiZXR3ZWVuIHRoaXMgbGluZSBhbmQgdGhlIGxhc3QgbGluZSBjb250YWluaW5nOgotIyAlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUKLSMgSW5zdGVhZCwgZWl0aGVyIHJlZGVmaW5lIGFuIGV4aXN0aW5nIHByb3BlcnR5LCBvciBjcmVhdGUgYSBuZXcgcHJvcGVydHksCi0jIGFwcGVuZCBpdCB0byB0aGUgZW5kIG9mIHRoZSBmaWxlLCBhbmQgY2hhbmdlIHRoZSBjb2RlIHRvIHVzZSB0aGUgbmV3IG5hbWUuCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0jIGFib3V0LnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGFib3V0LmluaQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBmaWxsLWlucyBhcmUgc3VwcGxpZWQgYnkgYWJvdXQubWFwcGluZ3MKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotCi1mZWF0dXJlTmFtZT1FUEYgUkNQCi0KLWZlYXR1cmVUZXh0PUVQRiBSQ1BcblwKLVxuXAotXHU3MjQ4XHU2NzJjXHVmZjFhezF9IFxuXAotXHU1ZGU1XHU0ZjVjXHU3MjQ4XHU2NzJjXHU2ODA3XHU3YjdlXHVmZjFhezB9XG5cCi1cblwKLShjKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgYW5kIG90aGVycyAyMDAwLCAyMDA3LiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiBcbgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlCi0jIFRoZSBhYm92ZSBwcm9wZXJ0aWVzIGhhdmUgYmVlbiBzaGlwcGVkIGZvciB0cmFuc2xhdGlvbi4KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwL25sL3poL1RXL2Fib3V0LnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwL25sL3poL1RXL2Fib3V0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2MDc5ZTAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC9ubC96aC9UVy9hYm91dC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUgotCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyBEbyBub3QgY2hhbmdlIHRoZSBwcm9wZXJ0aWVzIGJldHdlZW4gdGhpcyBsaW5lIGFuZCB0aGUgbGFzdCBsaW5lIGNvbnRhaW5pbmc6Ci0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQotIyBJbnN0ZWFkLCBlaXRoZXIgcmVkZWZpbmUgYW4gZXhpc3RpbmcgcHJvcGVydHksIG9yIGNyZWF0ZSBhIG5ldyBwcm9wZXJ0eSwKLSMgYXBwZW5kIGl0IHRvIHRoZSBlbmQgb2YgdGhlIGZpbGUsIGFuZCBjaGFuZ2UgdGhlIGNvZGUgdG8gdXNlIHRoZSBuZXcgbmFtZS4KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSMgYWJvdXQucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgYWJvdXQuaW5pCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIGZpbGwtaW5zIGFyZSBzdXBwbGllZCBieSBhYm91dC5tYXBwaW5ncwotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0KLWZlYXR1cmVOYW1lPUVQRiBSQ1AKLQotZmVhdHVyZVRleHQ9RVBGIFJDUFxuXAotXG5cCi1cdTcyNDhcdTY3MmNcdWZmMWF7MX1cblwKLVx1NWVmYVx1N2Y2ZVx1NmExOVx1N2M2NFx1ZmYxYXswfVxuXAotXG5cCi0oYykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIGFuZCBvdGhlcnMgMjAwMCwgMjAwNy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG5cCi1cbgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlCi0jIFRoZSBhYm92ZSBwcm9wZXJ0aWVzIGhhdmUgYmVlbiBzaGlwcGVkIGZvciB0cmFuc2xhdGlvbi4KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwL3BsdWdpbi5wcm9wZXJ0aWVzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWI5ZmUxZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLQotIyBQbHVnLWluCi1mZWF0dXJlUGx1Z2luTmFtZT1FUEYgUkNQIEZlYXR1cmUKLWZlYXR1cmVQbHVnaW5OYW1lTkw9RVBGIFJDUCBGZWF0dXJlIChOTDEpCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwL3dlbGNvbWUueG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC93ZWxjb21lLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjY0MGQwNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwL3dlbGNvbWUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiID8+IAotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08d2VsY29tZVBhZ2UgCi0JdGl0bGU9IkVjbGlwc2UgUHJvY2VzcyBGcmFtZXdvcmsiPgotCi08aW50cm8+V2VsY29tZSB0byBFY2xpcHNlIFByb2Nlc3MgRnJhbWV3b3JrCi08L2ludHJvPgotCi08aXRlbT48Yj5XaGF0IGlzIEVjbGlwc2UgUHJvY2VzcyBGcmFtZXdvcms/PC9iPgotCQotPC9pdGVtPgotCi08aXRlbT48Yj5MZWFybiBNb3JlPC9iPgotCi08L2l0ZW0+Ci0KLTwvd2VsY29tZVBhZ2U+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvLmNsYXNzcGF0aCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YzRmMjBmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIj4KLQkJPGF0dHJpYnV0ZXM+Ci0JCTwvYXR0cmlidXRlcz4KLQk8L2NsYXNzcGF0aGVudHJ5PgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyI+Ci0JCTxhdHRyaWJ1dGVzPgotCQk8L2F0dHJpYnV0ZXM+Ci0JPC9jbGFzc3BhdGhlbnRyeT4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiPgotCQk8YXR0cmlidXRlcz4KLQkJPC9hdHRyaWJ1dGVzPgotCTwvY2xhc3NwYXRoZW50cnk+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC8ub3B0aW9ucyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC8ub3B0aW9ucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTBkZDg5Ny4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvLm9wdGlvbnMKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLSMgVHVybiBvbiBkZWJ1ZyB0cmFjZSBmb3IgdGhlIFJpY2ggVGV4dCBwbHVnLWluCi1vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvZGVidWc9dHJ1ZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0Ly5wcm9qZWN0IGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0Ly5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Yjc5YTc3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dDwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2OGJlYTQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dAotQnVuZGxlLVZlcnNpb246IDEuNS4wLnF1YWxpZmllcgotQnVuZGxlLUNsYXNzUGF0aDogcmljaHRleHQuamFyCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRQbHVnaW4KLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZTt2aXNpYmlsaXR5Oj1yZWV4cG9ydCwKLSBvcmcuZWNsaXBzZS51aTt2aXNpYmlsaXR5Oj1yZWV4cG9ydCwKLSBvcmcuZWNsaXBzZS51aS5mb3Jtczt2aXNpYmlsaXR5Oj1yZWV4cG9ydCwKLSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0O3Zpc2liaWxpdHk6PXJlZXhwb3J0LAotIG9yZy5lY2xpcHNlLnVpLndvcmtiZW5jaC50ZXh0ZWRpdG9yO3Zpc2liaWxpdHk6PXJlZXhwb3J0LAotIG9yZy5lY2xpcHNlLmVwZi5jb21tb24udWk7dmlzaWJpbGl0eTo9cmVleHBvcnQKLUVjbGlwc2UtTGF6eVN0YXJ0OiB0cnVlCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LAotIG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5hY3Rpb25zLAotIG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5kaWFsb2dzLAotIG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5odG1sLAotIG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5wcmVmZXJlbmNlcwotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvYWJvdXQuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Yzk5MDg2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLSAKLTxwPkZlYnJ1YXJ5IDI0LCAyMDA1PC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudC48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvYWJvdXQuaW5pIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2Fib3V0LmluaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODVhNWQ1Ny4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvYWJvdXQuaW5pCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbi4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0jIGFib3V0LmluaQotIyBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCBhIGZlYXR1cmUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgIiVrZXkiIGFyZSBleHRlcm5hbGl6ZWQgc3RyaW5ncyBkZWZpbmVkIGluIGFib3V0LnByb3BlcnRpZXMKLSMgVGhpcyBmaWxlIGRvZXMgbm90IG5lZWQgdG8gYmUgdHJhbnNsYXRlZC4KLQotIyBQcm9wZXJ0eSAiYWJvdXRUZXh0IiBjb250YWlucyBibHVyYiBmb3IgIkFib3V0IiBkaWFsb2cgKHRyYW5zbGF0ZWQpCi1hYm91dFRleHQ9JWZlYXR1cmVUZXh0Ci0KLSMgUHJvcGVydHkgImZlYXR1cmVJbWFnZSIgY29udGFpbnMgcGF0aCB0byBmZWF0dXJlIGltYWdlICgzMngzMikKLWZlYXR1cmVJbWFnZT1hcHBsaWNhdGlvbl8zMi5naWYKLQotIyBQcm9wZXJ0eSAiYXBwTmFtZSIgY29udGFpbnMgbmFtZSBvZiB0aGUgYXBwbGljYXRpb24gKHRyYW5zbGF0ZWQpCi1hcHBOYW1lPSVmZWF0dXJlTmFtZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2Fib3V0Lm1hcHBpbmdzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2Fib3V0Lm1hcHBpbmdzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMTU5MjdhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9hYm91dC5tYXBwaW5ncworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotIyBhYm91dC5tYXBwaW5ncwotIyBjb250YWlucyBmaWxsLWlucyBmb3IgYWJvdXQucHJvcGVydGllcwotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBUaGlzIGZpbGUgZG9lcyBub3QgbmVlZCB0byBiZSB0cmFuc2xhdGVkLgotIyBVc3VhbGx5IGdlbmVyYXRlZCBhdCBidWlsZCB0aW1lLgotCi0wPUBidWlsZC1JREAKLTE9MS41LjAuMApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2Fib3V0LnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvYWJvdXQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTAyZDVmMS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvYWJvdXQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgRG8gbm90IGNoYW5nZSB0aGUgcHJvcGVydGllcyBiZXR3ZWVuIHRoaXMgbGluZSBhbmQgdGhlIGxhc3QgbGluZSBjb250YWluaW5nOgotIyAlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUKLSMgSW5zdGVhZCwgZWl0aGVyIHJlZGVmaW5lIGFuIGV4aXN0aW5nIHByb3BlcnR5LCBvciBjcmVhdGUgYSBuZXcgcHJvcGVydHksCi0jIGFwcGVuZCBpdCB0byB0aGUgZW5kIG9mIHRoZSBmaWxlLCBhbmQgY2hhbmdlIHRoZSBjb2RlIHRvIHVzZSB0aGUgbmV3IG5hbWUuCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0jIGFib3V0LnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGFib3V0LmluaQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBmaWxsLWlucyBhcmUgc3VwcGxpZWQgYnkgYWJvdXQubWFwcGluZ3MKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotCi1mZWF0dXJlTmFtZT1FUEYgUmljaHRleHQKLQotZmVhdHVyZVRleHQ9RVBGIFJpY2h0ZXh0XG5cCi1cblwKLVZlcnNpb246IHsxfSBcblwKLUJ1aWxkIExhYmVsOiB7MH1cblwKLVxuXAotKGMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyBhbmQgb3RoZXJzIDIwMDAsIDIwMDguICBBbGwgUmlnaHRzIFJlc2VydmVkLlxuXAotXG5cCi0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQotIyBUaGUgYWJvdmUgcHJvcGVydGllcyBoYXZlIGJlZW4gc2hpcHBlZCBmb3IgdHJhbnNsYXRpb24uCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2FwcGxpY2F0aW9uXzMyLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9hcHBsaWNhdGlvbl8zMi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2YWQ3Y2MuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2FwcGxpY2F0aW9uXzMyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9idWlsZC5wcm9wZXJ0aWVzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwN2I2NjMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi1zb3VyY2UucmljaHRleHQuamFyID0gc3JjLwotb3V0cHV0LnJpY2h0ZXh0LmphciA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IHJpY2h0ZXh0LmphcixcCi0gICAgICAgICAgICAgICBpY29ucy8sXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIHJ0ZS8sXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICAub3B0aW9ucyxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIGFib3V0LmluaSxcCi0gICAgICAgICAgICAgICBhYm91dC5tYXBwaW5ncyxcCi0gICAgICAgICAgICAgICBhYm91dC5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIGFwcGxpY2F0aW9uXzMyLmdpZgotCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9kdG9vbDE2L0FkZEltYWdlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2R0b29sMTYvQWRkSW1hZ2UuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MzA4YThhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2R0b29sMTYvQWRkSW1hZ2UuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZHRvb2wxNi9BZGRMaW5rLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2R0b29sMTYvQWRkTGluay5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiMTExOTYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZHRvb2wxNi9BZGRMaW5rLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2R0b29sMTYvQWRkT3JkZXJlZExpc3QuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZHRvb2wxNi9BZGRPcmRlcmVkTGlzdC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5YWU0MTUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZHRvb2wxNi9BZGRPcmRlcmVkTGlzdC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9kdG9vbDE2L0FkZFRhYmxlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2R0b29sMTYvQWRkVGFibGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMDg4NDYyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2R0b29sMTYvQWRkVGFibGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZHRvb2wxNi9BZGRVbm9yZGVyZWRMaXN0LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2R0b29sMTYvQWRkVW5vcmRlcmVkTGlzdC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljNDRlYzYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZHRvb2wxNi9BZGRVbm9yZGVyZWRMaXN0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2R0b29sMTYvQm9sZC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9kdG9vbDE2L0JvbGQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZGM1OTg3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2R0b29sMTYvQm9sZC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9kdG9vbDE2L0NsZWFyQ29udGVudC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9kdG9vbDE2L0NsZWFyQ29udGVudC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmZjY0MTYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZHRvb2wxNi9DbGVhckNvbnRlbnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZHRvb2wxNi9Db3B5LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2R0b29sMTYvQ29weS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5YmM2NWUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZHRvb2wxNi9Db3B5LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2R0b29sMTYvQ3V0LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2R0b29sMTYvQ3V0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmQ0MzE0NC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9kdG9vbDE2L0N1dC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9kdG9vbDE2L0ZpbmRSZXBsYWNlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2R0b29sMTYvRmluZFJlcGxhY2UuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOGY4ODcxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2R0b29sMTYvRmluZFJlcGxhY2UuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZHRvb2wxNi9JbmRlbnQuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZHRvb2wxNi9JbmRlbnQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MzZlMTUzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2R0b29sMTYvSW5kZW50LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2R0b29sMTYvSXRhbGljLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2R0b29sMTYvSXRhbGljLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzliNWE0NC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9kdG9vbDE2L0l0YWxpYy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9kdG9vbDE2L091dGRlbnQuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZHRvb2wxNi9PdXRkZW50LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWRjZGEzZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9kdG9vbDE2L091dGRlbnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZHRvb2wxNi9QYXN0ZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9kdG9vbDE2L1Bhc3RlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWM3NjY4ZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9kdG9vbDE2L1Bhc3RlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2R0b29sMTYvUGFzdGVQbGFpblRleHQuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZHRvb2wxNi9QYXN0ZVBsYWluVGV4dC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwMWEyMjkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZHRvb2wxNi9QYXN0ZVBsYWluVGV4dC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9kdG9vbDE2L1N1YnNjcmlwdC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9kdG9vbDE2L1N1YnNjcmlwdC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3YjMxYWEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZHRvb2wxNi9TdWJzY3JpcHQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZHRvb2wxNi9TdXBlcnNjcmlwdC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9kdG9vbDE2L1N1cGVyc2NyaXB0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTRiMjY2Yy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9kdG9vbDE2L1N1cGVyc2NyaXB0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2R0b29sMTYvVGlkeUhUTUwuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZHRvb2wxNi9UaWR5SFRNTC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2YmM5ZGYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZHRvb2wxNi9UaWR5SFRNTC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9kdG9vbDE2L1VuZGVybGluZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9kdG9vbDE2L1VuZGVybGluZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyYTk2NDYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZHRvb2wxNi9VbmRlcmxpbmUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZXRvb2wxNi9BZGRJbWFnZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9ldG9vbDE2L0FkZEltYWdlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDU0NTIxMy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9ldG9vbDE2L0FkZEltYWdlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2V0b29sMTYvQWRkTGluZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9ldG9vbDE2L0FkZExpbmUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZjA4ZGNmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2V0b29sMTYvQWRkTGluZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9ldG9vbDE2L0FkZExpbmsuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZXRvb2wxNi9BZGRMaW5rLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTk5MTk0YS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9ldG9vbDE2L0FkZExpbmsuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZXRvb2wxNi9BZGRPcmRlcmVkTGlzdC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9ldG9vbDE2L0FkZE9yZGVyZWRMaXN0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjY4MTRjMS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9ldG9vbDE2L0FkZE9yZGVyZWRMaXN0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2V0b29sMTYvQWRkVGFibGUuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZXRvb2wxNi9BZGRUYWJsZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzNjg4NTkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZXRvb2wxNi9BZGRUYWJsZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9ldG9vbDE2L0FkZFVub3JkZXJlZExpc3QuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZXRvb2wxNi9BZGRVbm9yZGVyZWRMaXN0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTRmZGZjOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9ldG9vbDE2L0FkZFVub3JkZXJlZExpc3QuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZXRvb2wxNi9Cb2xkLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2V0b29sMTYvQm9sZC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwZGY5ZTUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZXRvb2wxNi9Cb2xkLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2V0b29sMTYvQ2xlYXJDb250ZW50LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2V0b29sMTYvQ2xlYXJDb250ZW50LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjU1ODMyNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9ldG9vbDE2L0NsZWFyQ29udGVudC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9ldG9vbDE2L0NvcHkuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZXRvb2wxNi9Db3B5LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjMyYWNlZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9ldG9vbDE2L0NvcHkuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZXRvb2wxNi9DdXQuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZXRvb2wxNi9DdXQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZTg2MzVjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2V0b29sMTYvQ3V0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2V0b29sMTYvRmluZFJlcGxhY2UuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZXRvb2wxNi9GaW5kUmVwbGFjZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExMjU3ZWMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZXRvb2wxNi9GaW5kUmVwbGFjZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9ldG9vbDE2L0luZGVudC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9ldG9vbDE2L0luZGVudC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4MTk1ZDAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZXRvb2wxNi9JbmRlbnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZXRvb2wxNi9JdGFsaWMuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZXRvb2wxNi9JdGFsaWMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZDBjZDExLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2V0b29sMTYvSXRhbGljLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2V0b29sMTYvSnVzdGlmeUNlbnRlci5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9ldG9vbDE2L0p1c3RpZnlDZW50ZXIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZWFiZjA1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2V0b29sMTYvSnVzdGlmeUNlbnRlci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9ldG9vbDE2L0p1c3RpZnlGdWxsLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2V0b29sMTYvSnVzdGlmeUZ1bGwuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOTBhM2I4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2V0b29sMTYvSnVzdGlmeUZ1bGwuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZXRvb2wxNi9KdXN0aWZ5TGVmdC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9ldG9vbDE2L0p1c3RpZnlMZWZ0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTg1NDY5Yi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9ldG9vbDE2L0p1c3RpZnlMZWZ0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2V0b29sMTYvSnVzdGlmeVJpZ2h0LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2V0b29sMTYvSnVzdGlmeVJpZ2h0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwNWFmMS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9ldG9vbDE2L0p1c3RpZnlSaWdodC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9ldG9vbDE2L091dGRlbnQuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZXRvb2wxNi9PdXRkZW50LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDA2Yjk0Zi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9ldG9vbDE2L091dGRlbnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZXRvb2wxNi9QYXN0ZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9ldG9vbDE2L1Bhc3RlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTRkMzlhMS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9ldG9vbDE2L1Bhc3RlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2V0b29sMTYvUGFzdGVQbGFpblRleHQuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZXRvb2wxNi9QYXN0ZVBsYWluVGV4dC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4Zjk4OTUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZXRvb2wxNi9QYXN0ZVBsYWluVGV4dC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9ldG9vbDE2L1N0cmlrZVRocm91Z2guZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZXRvb2wxNi9TdHJpa2VUaHJvdWdoLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTEwMzU0NS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9ldG9vbDE2L1N0cmlrZVRocm91Z2guZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZXRvb2wxNi9TdWJzY3JpcHQuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZXRvb2wxNi9TdWJzY3JpcHQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYzBmNzEzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2V0b29sMTYvU3Vic2NyaXB0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2V0b29sMTYvU3VwZXJzY3JpcHQuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZXRvb2wxNi9TdXBlcnNjcmlwdC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyODY2MzQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZXRvb2wxNi9TdXBlcnNjcmlwdC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9ldG9vbDE2L1RpZHlIVE1MLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2V0b29sMTYvVGlkeUhUTUwuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZGYyNDEwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2V0b29sMTYvVGlkeUhUTUwuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZXRvb2wxNi9VbmRlcmxpbmUuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZXRvb2wxNi9VbmRlcmxpbmUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjQ3NmQ2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2V0b29sMTYvVW5kZXJsaW5lLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9wbHVnaW4ucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTM3MzI2Yy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUgotCi0jIFBsdWctaW4KLXBsdWdpbk5hbWU9RVBGIFJpY2ggVGV4dAotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIFRIRSBGT0xMT1dJTkcgUFJPUEVSVElFUyBTSE9VTEQgTk9UIEJFIFRSQU5TTEFURUQhISEKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgVGhlIEhUTUwgZmlsZSB1c2VkIHRvIHJlbmRlciB0aGUgUmljaCBUZXh0IEVkaXRvci4KLVJpY2hUZXh0LmVkaXRvckhUTUw9cnRlLmh0bQotCi0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9wbHVnaW4ueG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlNDliNTIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08cGx1Z2luPgotCi08L3BsdWdpbj4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9ydGUvYmxhbmsuaHRtIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3J0ZS9ibGFuay5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkOTcyN2EuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3J0ZS9ibGFuay5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotCi08aHRtbD4KLTxoZWFkPgotCTx0aXRsZT48L3RpdGxlPgotPC9oZWFkPgotPGJvZHk+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvcnRlL3J0ZS5jc3MgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvcnRlL3J0ZS5jc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkYzZjOWUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3J0ZS9ydGUuY3NzCisrKyAvZGV2L251bGwKQEAgLTEsNDU3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKgotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKi8KLQotYm9keSB7Ci0JYmFja2dyb3VuZC1pbWFnZTogbm9uZTsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjZmZmZmZmOwotIAlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLSAJZm9udC1zaXplOiAxMHB0OwotCW1hcmdpbjogM3B4OwotCXBhZGRpbmc6IDBweDsgCQotfQotCi1wIHsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDEwcHQ7Ci19Ci0KLWgxIHsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IGxhcmdlOwotfQotCi1oMiB7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxNTAlOwotfQotCi1oMyB7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci19Ci0KLWg0LCBoNSwgaDYgewotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotfQotCi1hOmxpbmsgewotCWNvbG9yOiAjMDAzMzk5OwotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTBwdDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLWE6YWN0aXZlIHsKLQljb2xvcjogIzAwMzM5OTsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDEwcHQ7Ci0JdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7Ci19Ci0KLWE6dmlzaXRlZCB7Ci0JY29sb3I6ICMwMDMzOTk7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxMHB0OwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotYTpob3ZlciB7Ci0JY29sb3I6ICNmZjAwMDA7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxMHB0OwotCXRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOwotfQotCi1vbCB7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxMHB0OwotCWxpc3Qtc3R5bGUtdHlwZTogZGVjaW1hbDsKLQltYXJnaW4tbGVmdDogMzBweDsKLX0KLQotb2wgbGkgewotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTBwdDsKLQl0ZXh0LWFsaWduOiBsZWZ0Ci19Ci0KLXVsIHsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDEwcHQ7Ci0JbGlzdC1zdHlsZS10eXBlOiBkaXNjOwotCW1hcmdpbi1sZWZ0OiAzMHB4OwotCW1hcmdpbi10b3A6IDBweDsKLX0KLQotdWwgbGkgewotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTBwdDsKLQl0ZXh0LWFsaWduOiBsZWZ0OwotfQotCi10YWJsZSB7Ci0JYmFja2dyb3VuZC1pbWFnZTogbm9uZTsKLQliYWNrZ3JvdW5kOiAjZmZmZmZmOwotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTBwdDsJCi19Ci0KLXRib2R5IHsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDEwcHQ7Ci0JdmFsaWduOiBiYXNlbGluZTsKLX0KLQotdGggewotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTBwdDsKLQl0ZXh0LWFsaWduOiBsZWZ0OwotfQotCi10ZCB7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxMHB0OwotfQotCi10ZCB1bCB7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxMHB0OwotCW1hcmdpbi1ib3R0b206IDBweDsKLQltYXJnaW4tbGVmdDogMzBweDsKLX0KLQotLnBhZ2VUaXRsZSB7Ci0JYmFja2dyb3VuZDogIzk5OTljYzsKLQljb2xvcjogI2ZmZmZmZjsKLQlmb250LXNpemU6IDEycHQ7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci0JcGFkZGluZy1ib3R0b206IDVweDsKLQlwYWRkaW5nLWxlZnQ6IDEwcHg7Ci0JcGFkZGluZy1yaWdodDogMTBweDsKLQlwYWRkaW5nLXRvcDogNXB4OwotCXRleHQtYWxpZ246IGxlZnQ7Ci19Ci0KLS5wYWdlVGl0bGVTZXBhcmF0b3IgewotCWJhY2tncm91bmQtY29sb3I6ICMwMDAwMDA7Ci0JcGFkZGluZzogMHB4OwotfQotCi0udGFiIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjNWM4MWE3OwotCWNvbG9yOiAjZmZmZmZmOwotCWZvbnQtZmFtaWx5OiB2ZXJkYW5hLCBhcmlhbCwgc2Fucy1zZXJpZjsgCi0JZm9udC1zaXplOiAxMXB4OwotCWZvbnQtd2VpZ2h0OiBib2xkOwotfQotCi0uYWN0aXZlVGFiIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjYzhkN2UzOwotCWNvbG9yOiAjMjkzZDZiOwkKLQlmb250LWZhbWlseTogdmVyZGFuYSwgYXJpYWwsIHNhbnMtc2VyaWY7IAotCWZvbnQtc2l6ZTogMTFweDsKLQlmb250LXdlaWdodDogYm9sZDsKLX0KLQotYS50YWI6bGluaywgYS50YWI6YWN0aXZlLCBhLnRhYjp2aXNpdGVkIHsKLQljb2xvcjogI2ZmZmZmZjsKLQlmb250LWZhbWlseTogdmVyZGFuYSwgYXJpYWwsIHNhbnMtc2VyaWY7IAotCWZvbnQtc2l6ZTogMTFweDsKLQlmb250LXdlaWdodDogYm9sZDsKLX0KLQotYS50YWI6aG92ZXIgewotCXRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOwkKLX0KLQotLm92ZXJ2aWV3IHsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDEwcHQ7Ci0JZm9udC13ZWlnaHQ6IG5vcm1hbDsKLQlwYWRkaW5nLWJvdHRvbTogMTBweDsKLQlwYWRkaW5nLWxlZnQ6IDIwcHg7Ci0JcGFkZGluZy1yaWdodDogMHB4OwotCXBhZGRpbmctdG9wOiAxMHB4OwotfQotCi0ub3ZlcnZpZXdUYWJsZSB7Ci0JYmFja2dyb3VuZDogI2ZmZmZmZjsKLQl3aWR0aDogMTAwJTsJCi19Ci0KLS5vdmVydmlld1RhYmxlIHRkIHsKLQlwYWRkaW5nLWJvdHRvbTogNXB4OwotCXBhZGRpbmctbGVmdDogNXB4OwotCXBhZGRpbmctcmlnaHQ6IDVweDsKLQlwYWRkaW5nLXRvcDogNXB4OwotfQotCi0ub3ZlcnZpZXdTZXBhcmF0b3IgewotCWJhY2tncm91bmQtY29sb3I6ICMwMDAwMDA7Ci0JcGFkZGluZzogMHB4OwotfQotCi0uZXhwYW5kQ29sbGFwc2VUZXh0IHsKLQlmb250LWZhbWlseTogdmVyZGFuYSwgYXJpYWwsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiA4cHQ7Ci0JcGFkZGluZy1sZWZ0OiA1cHg7Ci0JcGFkZGluZy1yaWdodDogNXB4OwotfQotCi0uZXhwYW5kQ29sbGFwc2VMaW5rIHsKLQljb2xvcjogIzMzMzMzMzsKLQlwYWRkaW5nLWJvdHRvbTogNXB4OwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotLmV4cGFuZENvbGxhcHNlTGluazpob3ZlciB7Ci0JY29sb3I6ICMwMDAwZmY7Ci0JdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7Ci19Ci0KLS5leHBhbmRDb2xsYXBzZUxpbms6dmlzaXRlZCB7Ci0JY29sb3I6ICMzMzMzMzM7Ci19Ci0KLS5zZWN0aW9uSGVhZGluZyB7Ci0JYmFja2dyb3VuZC1jb2xvcjogIzk4YjFjNDsKLQljb2xvcjogI2ZmZmZmZjsKLQljdXJzb3I6IGhhbmQ7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxMHB0OwotCWZvbnQtd2VpZ2h0OiBib2xkOwotCXBhZGRpbmctYm90dG9tOiAycHg7Ci0JcGFkZGluZy1sZWZ0OiAycHg7Ci0JcGFkZGluZy10b3A6IDJweDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLS5zZWN0aW9uQ29udGVudCB7Ci0JcGFkZGluZy1ib3R0b206IDBweDsKLQlwYWRkaW5nLWxlZnQ6IDBweDsKLQlwYWRkaW5nLXJpZ2h0OiAwcHg7Ci0JcGFkZGluZy10b3A6IDBweDsKLQl0ZXh0LWFsaWduOiByaWdodDsKLX0KLQotLnNlY3Rpb25UYWJsZSB7Ci0JYm9yZGVyLWJvdHRvbTogI2NjYyBzb2xpZCAwcHg7Ci0JYm9yZGVyLWxlZnQ6ICNjY2Mgc29saWQgMXB4OwotCWJvcmRlci1yaWdodDogI2NjYyBzb2xpZCAwcHg7Ci0JYm9yZGVyLXRvcDogI2NjYyBzb2xpZCAxcHg7Ci0JcGFkZGluZy1ib3R0b206IDEwcHg7Ci0JcGFkZGluZy1sZWZ0OiAxMHB4OwotCXBhZGRpbmctcmlnaHQ6IDEwcHg7Ci0JcGFkZGluZy10b3A6IDEwcHg7Ci0Jd2lkdGg6IDEwMCU7Ci19Ci0KLS5zZWN0aW9uVGFibGVIZWFkaW5nIHsKLQliYWNrZ3JvdW5kOiAjZWVlOwotCWJvcmRlci1ib3R0b206ICNjY2Mgc29saWQgMXB4OwotCWJvcmRlci1sZWZ0OiAjY2NjIHNvbGlkIDBweDsKLQlib3JkZXItcmlnaHQ6ICNjY2Mgc29saWQgMXB4OwotCWJvcmRlci10b3A6ICNjY2Mgc29saWQgMHB4OwotCWNvbG9yOiAjMzMzMzMzOwotCWhlaWdodDogMjA7Ci0JdGV4dC1hbGlnbjogbGVmdDsKLQl3aWR0aDogMjAlOwotfQotCi0uc2VjdGlvblRhYmxlQ2VsbCB7Ci0JYm9yZGVyLWJvdHRvbTogI2NjYyBzb2xpZCAxcHg7Ci0JYm9yZGVyLWxlZnQ6ICNjY2Mgc29saWQgMHB4OwotCWJvcmRlci1yaWdodDogI2NjYyBzb2xpZCAxcHg7Ci0JYm9yZGVyLXRvcDogI2NjYyBzb2xpZCAwcHg7Ci19Ci0KLS5icmVha2Rvd25UYWJsZSB7Ci0JYm9yZGVyLWJvdHRvbTogI2NjYyBzb2xpZCAwcHg7Ci0JYm9yZGVyLWxlZnQ6ICNjY2Mgc29saWQgMXB4OwotCWJvcmRlci1yaWdodDogI2NjYyBzb2xpZCAwcHg7Ci0JYm9yZGVyLXRvcDogI2NjYyBzb2xpZCAxcHg7Ci0JcGFkZGluZy1ib3R0b206IDBweDsKLQlwYWRkaW5nLWxlZnQ6IDBweDsKLQlwYWRkaW5nLXJpZ2h0OiAwcHg7Ci0JcGFkZGluZy10b3A6IDBweDsKLQl3aWR0aDogMTAwJTsKLX0KLQotLmJyZWFrZG93blRhYmxlIHRoIHsKLQliYWNrZ3JvdW5kOiAjZWVlOwotCWJvcmRlci1ib3R0b206ICNjY2Mgc29saWQgMXB4OwotCWJvcmRlci1sZWZ0OiAjY2NjIHNvbGlkIDBweDsKLQlib3JkZXItcmlnaHQ6ICNjY2Mgc29saWQgMXB4OwotCWJvcmRlci10b3A6ICNjY2Mgc29saWQgMHB4OwotCWNvbG9yOiAjMzMzMzMzOwotCWhlaWdodDogMjA7Ci0JdGV4dC1hbGlnbjogbGVmdDsKLX0KLQotLmJyZWFrZG93blRhYmxlIHRkIHsKLQlib3JkZXItYm90dG9tOiAjY2NjIHNvbGlkIDFweDsKLQlib3JkZXItbGVmdDogI2NjYyBzb2xpZCAwcHg7Ci0JYm9yZGVyLXJpZ2h0OiAjY2NjIHNvbGlkIDFweDsKLQlib3JkZXItdG9wOiAjY2NjIHNvbGlkIDBweDsKLX0KLQotLmRlZmF1bHRUYWJsZSB7Ci0JYm9yZGVyLWJvdHRvbTogI2NjYyBzb2xpZCAwcHg7Ci0JYm9yZGVyLWxlZnQ6ICNjY2Mgc29saWQgMHB4OwotCWJvcmRlci1yaWdodDogI2NjYyBzb2xpZCAwcHg7Ci0JYm9yZGVyLXRvcDogI2NjYyBzb2xpZCAwcHg7Ci0JcGFkZGluZy1ib3R0b206IDBweDsKLQlwYWRkaW5nLWxlZnQ6IDBweDsKLQlwYWRkaW5nLXJpZ2h0OiAwcHg7Ci0JcGFkZGluZy10b3A6IDBweDsKLQl3aWR0aDogMTAwJTsKLX0KLQotLmRlZmF1bHRUYWJsZSB0ZCB7Ci0JYm9yZGVyLWJvdHRvbTogI2NjYyBzb2xpZCAwcHg7Ci0JYm9yZGVyLWxlZnQ6ICNjY2Mgc29saWQgMHB4OwotCWJvcmRlci1yaWdodDogI2NjYyBzb2xpZCAwcHg7Ci0JYm9yZGVyLXRvcDogI2NjYyBzb2xpZCAwcHg7Ci0JdGV4dC1hbGlnbjogbGVmdDsKLX0KLQotLnN1YlNlY3Rpb25IZWFkaW5nIHsKLQljb2xvcjogIzMzMzMzMzsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDEwcHQ7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi0uc3ViU2VjdGlvbkNvbnRlbnQgewotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTBwdDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7CQotfQotCi0uc3RlcEhlYWRpbmcgewotCWJhY2tncm91bmQtY29sb3I6ICNmZmZmZmY7Ci0JY29sb3I6ICMyOTNkNmI7Ci0JY3Vyc29yOiBoYW5kOwotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTBwdDsKLQlmb250LXdlaWdodDogYm9sZDsKLQlwYWRkaW5nLWJvdHRvbTogMnB4OwotCXBhZGRpbmctbGVmdDogMnB4OwotCXBhZGRpbmctdG9wOiAycHg7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi0uc3RlcENvbnRlbnQgewotCWJvcmRlci1ib3R0b206ICNjY2Mgc29saWQgMHB4OwotCWJvcmRlci1sZWZ0OiAjY2NjIHNvbGlkIDBweDsKLQlib3JkZXItcmlnaHQ6ICNjY2Mgc29saWQgMHB4OwotCWJvcmRlci10b3A6ICNjY2Mgc29saWQgMHB4OwotCXBhZGRpbmctYm90dG9tOiA1cHg7Ci0JcGFkZGluZy1sZWZ0OiAwcHg7Ci0JcGFkZGluZy1yaWdodDogMHB4OwotCXBhZGRpbmctdG9wOiAwcHg7Ci0JdGV4dC1hbGlnbjogcmlnaHQ7Ci19Ci0KLS5zdGVwVGFibGUgewotCWJvcmRlci1ib3R0b206ICM5OTk5OTkgc29saWQgMXB4OwotCWJvcmRlci1sZWZ0OiAjOTk5OTk5IHNvbGlkIDBweDsKLQlib3JkZXItcmlnaHQ6ICM5OTk5OTkgc29saWQgMHB4OwotCWJvcmRlci10b3A6ICM5OTk5OTkgc29saWQgMHB4OwotCXBhZGRpbmctYm90dG9tOiAyMHB4OwotCXBhZGRpbmctbGVmdDogMTBweDsKLQlwYWRkaW5nLXJpZ2h0OiAxMHB4OwotCXBhZGRpbmctdG9wOiAxMHB4OwotCXdpZHRoOiAxMDAlOwotfQotCi0uc3RlcFRhYmxlIHRkIHsKLQlib3JkZXI6ICNjY2Mgc29saWQgMHB4OwotfQotCi0uc3RlcFNlcGFyYXRvciB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI2NjY2NjYzsKLQlwYWRkaW5nOiAwcHg7Ci19Ci0KLS5iYWNrVG9Ub3BMaW5rIHsKLQljb2xvcjogI2ZmZmZmOwotCWZvbnQtZmFtaWx5OiB2ZXJkYW5hLCBhcmlhbCwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDhwdDsKLQlmb250LXdlaWdodDogbm9ybWFsOwkKLQltYXJnaW46IDBweDsKLQlwYWRkaW5nLWJvdHRvbTogMTBweDsKLQl0ZXh0LWFsaWduOiBtaWRkbGU7CQotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotLmJhY2tUb1RvcExpbms6aG92ZXIgewotCWNvbG9yOiAjOTY5OwotCXRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOwotfQotCi0uYmFja1RvVG9wTGluazp2aXNpdGVkIHsKLQljb2xvcjogIzVjODFhNzsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7CQotfQotCi0uY29weXJpZ2h0IHsKLQljb2xvcjogIzcwODBiMDsKLQlmb250LWZhbWlseTogdmVyZGFuYSwgYXJpYWwsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiA4cHQ7Ci0JZm9udC13ZWlnaHQ6IG5vcm1hbDsKLQlwYWRkaW5nLWxlZnQ6IDBweDsKLQlwYWRkaW5nLXJpZ2h0OiAxMHB4OwotCXBhZGRpbmctdG9wOiAyNXB4OwotCXRleHQtYWxpZ246IGxlZnQ7Ci0Jd2lkdGg6IDEwMCU7Ci19Ci0KLS52ZXJzaW9uSW5mbyB7Ci0JY29sb3I6ICM3MDgwYjA7Ci0JZm9udC1mYW1pbHk6IHZlcmRhbmEsIGFyaWFsLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogOHB0OwotCWZvbnQtd2VpZ2h0OiBub3JtYWw7Ci0JcGFkZGluZy1sZWZ0OiAxMHB4OwotCXBhZGRpbmctcmlnaHQ6IDBweDsKLQlwYWRkaW5nLXRvcDogMjVweDsKLQl0ZXh0LWFsaWduOiByaWdodDsKLX0KLQotLnF1b3RlIHsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDEwcHQ7Ci0JZm9udC1zdHlsZTogaXRhbGljOwotfQotCi0uY29kZVNhbXBsZSB7Ci0JZm9udC1mYW1pbHk6IGNvdXJpZXI7Ci0JZm9udC1zaXplOiAxMHB0OwkJCi19Ci0KLS5lbGVtZW50TGluayB7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxMHB0OwkKLQljb2xvcjogIzAwMDBmZjsKLX0KLQotLmVsZW1lbnRMaW5rV2l0aFR5cGUgewotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTBwdDsKLQljb2xvcjogIzAwMDBmZjsKLX0KLQotLmVsZW1lbnRMaW5rV2l0aFVzZXJUZXh0IHsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDEwcHQ7Ci0JY29sb3I6ICMwMDAwZmY7Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvcnRlL3J0ZS5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3J0ZS9ydGUuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjQ1MWNiNy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvcnRlL3J0ZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotPGh0bWw+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLQk8aGVhZD4KLQkJPHNjcmlwdCBsYW5ndWFnZT0iSmF2YVNjcmlwdCIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9InJ0ZS5qcyI+PC9zY3JpcHQ+CQkKLQk8L2hlYWQ+Ci0JPGJvZHkgbGVmdE1hcmdpbj0iMCIgdG9wTWFyZ2luPSIwIiBtYXJnaW5oZWlnaHQ9IjAiIG1hcmdpbndpZHRoPSIwIiBzY3JvbGw9Im5vIiBzdHlsZT0ib3ZlcmZsb3c6IGhpZGRlbiI+Ci0JCTxpZnJhbWUgaWQ9InJ0ZSIgbmFtZT0icnRlIiBzdHlsZT0iYm9yZGVyOiBub25lOyIgZnJhbWVib3JkZXI9IjAiIHNjcm9sbGluZz0iYXV0byIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSI+PC9pZnJhbWU+Ci0JCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLQkJCWluaXRFZGl0b3IoJ3J0ZScsICdydGUuY3NzJywgbnVsbCk7Ci0JCTwvc2NyaXB0PgotCTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9ydGUvcnRlLmpzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3J0ZS9ydGUuanMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4ZWFlMjguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3J0ZS9ydGUuanMKKysrIC9kZXYvbnVsbApAQCAtMSwxMzY0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIEBhdXRob3IgS2VsdmluIExvdwotLy8gQHNpbmNlIDEuMAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIE5vdGU6IE1vemlsbGEvRmlyZWZveCBkb2VzIG5vdCBhbGxvdyB1bnByaXZpbGVnZWQgc2NyaXB0cyB0byBpbnZva2UgdGhlIGN1dCwKLS8vIGNvcHkgYW5kIHBhc3RlIGNvbW1hbmRzLiBUaGUgSmF2YXNjcmlwdCBtdXN0IGVpdGhlciBiZSBzaWduZWQKLS8vIChzZWUgaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9wcm9qZWN0cy9zZWN1cml0eS9jb21wb25lbnRzL3NpZ25lZC1zY3JpcHRzLmh0bWwpLAotLy8gb3IgdGhlIHVzZXJzIG11c3QgY2hhbmdlIHRoZWlyIHByZWZlcmVuY2VzCi0vLyAoc2VlIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvZWRpdG9yL21pZGFzZGVtby9zZWN1cml0eXByZWZzLmh0bWwpLgotLy8gQWx0ZXJuYXRpdmVseSwgdGhlIHVzZXJzIGNhbiB1c2UgdGhlIGN0cmwteCwgY3RybC1jIGFuZCBjdHJsLXYga2V5cy4KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXZhciBTVEFUVVNfTk9QID0gMDsKLXZhciBTVEFUVVNfSU5JVElBTElaRUQgPSAxOwotdmFyIFNUQVRVU19NT0RJRklFRCA9IDI7Ci12YXIgU1RBVFVTX0dFVF9URVhUID0gMzsKLXZhciBTVEFUVVNfS0VZX0RPV04gPSA0OwotdmFyIFNUQVRVU19LRVlfVVAgPSA1OwotdmFyIFNUQVRVU19TRUxFQ1RfVEVYVCA9IDY7Ci12YXIgU1RBVFVTX1NFTEVDVF9DT05UUk9MID0gNzsKLXZhciBTVEFUVVNfU0VMRUNUX05PTkUgPSA4OwotdmFyIFNUQVRVU19FWEVDX0NNRCA9IDk7Ci12YXIgU1RBVFVTX1JFRk9STUFUX0xJTktTID0gMTA7Ci0KLXZhciBLRVlfQVJST1dfRE9XTiA9IDQwOwotdmFyIEtFWV9BUlJPV19MRUZUID0gMzc7Ci12YXIgS0VZX0FSUk9XX1JJR0hUID0gMzk7Ci12YXIgS0VZX0FSUk9XX1VQID0gMzg7Ci12YXIgS0VZX0JBQ0tTUEFDRSA9IDg7Ci12YXIgS0VZX0VORCA9IDM1OwotdmFyIEtFWV9IT01FID0gMzY7Ci12YXIgS0VZX1BBR0VfRE9XTiA9IDM0OwotdmFyIEtFWV9QQUdFX1VQID0gMzM7Ci12YXIgS0VZX1RBQiA9IDk7Ci12YXIgS0VZX0MgPSA2NzsKLXZhciBLRVlfRiA9IDcwOwotdmFyIEtFWV9TID0gODM7Ci12YXIgS0VZX1YgPSA4NjsKLXZhciBLRVlfWCA9IDg4OwotdmFyIEtFWV9aID0gOTA7Ci0KLXZhciBDTURfQ09QWSA9ICJjb3B5IjsKLXZhciBDTURfQ1VUID0gImN1dCI7Ci12YXIgQ01EX0ZJTkRfVEVYVCA9ICJmaW5kVGV4dCI7Ci12YXIgQ01EX1BBU1RFID0gInBhc3RlIjsKLXZhciBDTURfU0FWRSA9ICJzYXZlIjsKLXZhciBDTURfU0FWRV9BTEwgPSAic2F2ZUFsbCI7Ci0KLXZhciBUQUJMRV9IRUFERVJTX05PTkUgPSAwOwotdmFyIFRBQkxFX0hFQURFUlNfQ09MUyA9IDE7Ci12YXIgVEFCTEVfSEVBREVSU19ST1dTID0gMjsKLXZhciBUQUJMRV9IRUFERVJTX0JPVEggPSAzOwotCi12YXIgQk9MRCA9IDE7Ci12YXIgSVRBTElDID0gQk9MRCA8PCAxOwotdmFyIFVOREVSTElORSA9IElUQUxJQyA8PCAxOwotdmFyIFNVQlNDUklQVCA9IFVOREVSTElORSA8PCAxOwotdmFyIFNVUEVSU0NSSVBUID0gU1VCU0NSSVBUIDw8IDE7Ci0KLQotdmFyIGVkaXRvcklkOwotdmFyIGVkaXRvckNTUzsKLXZhciBiYXNlSFJFRjsKLXZhciBzdXBwb3J0UmljaFRleHRFZGl0aW5nID0gdHJ1ZTsKLXZhciBlZGl0b3JEb2M7Ci12YXIgc2VsZWN0aW9uOwotdmFyIHNlbGVjdGlvblJhbmdlOwotdmFyIHJlYWRPbmx5ID0gZmFsc2U7Ci12YXIgaW5pdGlhbGl6ZWQgPSBmYWxzZTsKLXZhciBtb2RpZmllZCA9IGZhbHNlOwotdmFyIGNoZWNrUmVzaXplRWxlbWVudDsKLXZhciBzZWxlY3Rpb25JbmZvID0gbnVsbDsKLQotLy8gSW5pdGlhbGl6ZXMgdGhlIGVkaXRvci4KLWZ1bmN0aW9uIGluaXRFZGl0b3IoaWQsIGNzcywgYmFzZVVSTCkgewotCWVkaXRvcklkID0gaWQ7Ci0JZWRpdG9yQ1NTID0gY3NzOwotCWJhc2VIUkVGID0gYmFzZVVSTDsKLQl0cnkgewotCQllbmFibGVSaWNoVGV4dEVkaXRpbmcoJycpOwotCQlpbml0aWFsaXplZCA9IHRydWU7Ci0JCXNldFN0YXR1cyhTVEFUVVNfSU5JVElBTElaRUQsIG51bGwpOwotCX0KLQljYXRjaCAoZSkgewotCQlzdXBwb3J0UmljaFRleHRFZGl0aW5nID0gZmFsc2U7Ci0JfQotfQotCi0vLyBIYW5kbGVzIHRoZSBrZXkgZXZlbnRzLgotZnVuY3Rpb24ga2V5UHJlc3NlZChldmVudCkgewotCXZhciBrZXlDb2RlID0gZXZlbnQua2V5Q29kZTsKLQlpZiAoa2V5Q29kZSA9PSAwICYmICFkb2N1bWVudC5hbGwpIHsKLQkJa2V5Q29kZSA9IGV2ZW50LmNoYXJDb2RlOwotCQlzd2l0Y2ggKGtleUNvZGUpIHsKLQkJCWNhc2UgOTk6Ci0JCQkJa2V5Q29kZSA9IEtFWV9DOwotCQkJCWJyZWFrOwotCQkJY2FzZSAxMDI6Ci0JCQkJa2V5Q29kZSA9IEtFWV9GOwotCQkJCWJyZWFrOwotCQkJY2FzZSAxMTU6Ci0JCQkJa2V5Q29kZSA9IEtFWV9TOwotCQkJCWJyZWFrOwotCQkJY2FzZSAxMTg6Ci0JCQkJa2V5Q29kZSA9IEtFWV9WOwotCQkJCWJyZWFrOwotCQkJY2FzZSAxMjA6Ci0JCQkJa2V5Q29kZSA9IEtFWV9YOwotCQkJCWJyZWFrOwotCQkJY2FzZSAxMjI6Ci0JCQkJa2V5Q29kZSA9IEtFWV9aOwotCQkJCWJyZWFrOwotCQl9Ci0JfQotCXZhciBjdHJsS2V5ID0gZXZlbnQuY3RybEtleTsKLQl2YXIgc2hpZnRLZXkgPSBldmVudC5zaGlmdEtleTsKLQkKLQlzd2l0Y2goa2V5Q29kZSkgewotCQljYXNlIEtFWV9BUlJPV19ET1dOOgotCQljYXNlIEtFWV9BUlJPV19MRUZUOgotCQljYXNlIEtFWV9BUlJPV19SSUdIVDoKLQkJY2FzZSBLRVlfQVJST1dfVVA6Ci0JCWNhc2UgS0VZX0VORDoKLQkJY2FzZSBLRVlfSE9NRToKLQkJY2FzZSBLRVlfUEFHRV9ET1dOOgotCQljYXNlIEtFWV9QQUdFX1VQOgotCQljYXNlIEtFWV9UQUI6Ci0JCQlicmVhazsKLQkJY2FzZSBLRVlfQkFDS1NQQUNFOgotCQkJaWYgKCFyZWFkT25seSkgewotCQkJCXNldFRpbWVvdXQoInNldFN0YXR1cyhTVEFUVVNfTU9ESUZJRUQsIG51bGwpOyIsIDEwKTsKLQkJCX0KLQkJCWJyZWFrOwotCQljYXNlIEtFWV9DOgotCQkJaWYgKGN0cmxLZXkpIHsKLQkJCQlzZXRTdGF0dXMoU1RBVFVTX0tFWV9ET1dOLCBDTURfQ09QWSk7Ci0JCQl9Ci0JCQllbHNlIGlmICghZG9jdW1lbnQuYWxsICYmIHJlYWRPbmx5KSB7Ci0JCQkJZXZlbnQucHJldmVudERlZmF1bHQoKTsKLQkJCX0KLQkJCWJyZWFrOwkJCQotCQljYXNlIEtFWV9GOgotCQkJaWYgKGN0cmxLZXkpIHsKLQkJCQlpZiAoZG9jdW1lbnQuYWxsKSB7Ci0JCQkJCWV2ZW50LmtleUNvZGUgPSAtMTsKLQkJCQkJZXZlbnQucmV0dXJuVmFsdWUgPSBmYWxzZTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWV2ZW50LnByZXZlbnREZWZhdWx0KCk7Ci0JCQkJfQotCQkJCXNldFN0YXR1cyhTVEFUVVNfS0VZX0RPV04sIENNRF9GSU5EX1RFWFQpOwotCQkJfQotCQkJZWxzZSBpZiAoIWRvY3VtZW50LmFsbCAmJiByZWFkT25seSkgewotCQkJCWV2ZW50LnByZXZlbnREZWZhdWx0KCk7Ci0JCQl9Ci0JCQlicmVhazsKLQkJY2FzZSBLRVlfUzoKLQkJCWlmICghcmVhZE9ubHkgJiYgY3RybEtleSkgewotCQkJCWlmIChkb2N1bWVudC5hbGwpIHsKLQkJCQkJZXZlbnQua2V5Q29kZSA9IC0xOwotCQkJCQlldmVudC5yZXR1cm5WYWx1ZSA9IGZhbHNlOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJZXZlbnQucHJldmVudERlZmF1bHQoKTsKLQkJCQl9Ci0JCQkJaWYgKHNoaWZ0S2V5KSB7Ci0JCQkJCXNldFN0YXR1cyhTVEFUVVNfS0VZX0RPV04sIENNRF9TQVZFX0FMTCk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlzZXRTdGF0dXMoU1RBVFVTX0tFWV9ET1dOLCBDTURfU0FWRSk7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSBpZiAoIWRvY3VtZW50LmFsbCAmJiByZWFkT25seSkgewotCQkJCWV2ZW50LnByZXZlbnREZWZhdWx0KCk7Ci0JCQl9CQkJCi0JCQlicmVhazsKLQkJY2FzZSBLRVlfVjoKLQkJCWlmIChjdHJsS2V5KSB7CQkKLQkJCQlpZiAoZG9jdW1lbnQuYWxsKSB7Ci0JCQkJCWV2ZW50LmtleUNvZGUgPSAtMTsKLQkJCQkJZXZlbnQucmV0dXJuVmFsdWUgPSBmYWxzZTsKLQkJCQkJaWYgKCFyZWFkT25seSkgewotCQkJCQkJc2V0U3RhdHVzKFNUQVRVU19LRVlfRE9XTiwgQ01EX1BBU1RFKTsKLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJaWYgKCFyZWFkT25seSkgewotCQkJCQkJLy8gV29ya2Fyb3VuZCBNb3ppbGxhL0ZpcmVmb3ggcGFzdGUgaXNzdWVzLgotCQkJCQkJc2V0VGltZW91dCgic2V0U3RhdHVzKFNUQVRVU19LRVlfRE9XTiwgQ01EX1BBU1RFKTsiLCAxMCk7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQlldmVudC5wcmV2ZW50RGVmYXVsdCgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJZWxzZSBpZiAoIWRvY3VtZW50LmFsbCAmJiByZWFkT25seSkgewotCQkJCWV2ZW50LnByZXZlbnREZWZhdWx0KCk7Ci0JCQl9Ci0JCQlicmVhazsKLQkJY2FzZSBLRVlfWDoKLQkJCWlmIChjdHJsS2V5KSB7Ci0JCQkJc2V0U3RhdHVzKFNUQVRVU19LRVlfRE9XTiwgQ01EX0NVVCk7Ci0JCQl9Ci0JCQllbHNlIGlmICghZG9jdW1lbnQuYWxsICYmIHJlYWRPbmx5KSB7Ci0JCQkJZXZlbnQucHJldmVudERlZmF1bHQoKTsKLQkJCX0KLQkJCWJyZWFrOwotCQljYXNlIEtFWV9aOgotCQkJaWYgKCFyZWFkT25seSAmJiBjdHJsS2V5KSB7Ci0JCQkJc2V0VGltZW91dCgic2V0U3RhdHVzKFNUQVRVU19NT0RJRklFRCwgbnVsbCk7IiwgMTApOwotCQkJfQotCQkJZWxzZSBpZiAoIWRvY3VtZW50LmFsbCAmJiByZWFkT25seSkgewotCQkJCWV2ZW50LnByZXZlbnREZWZhdWx0KCk7Ci0JCQl9CQkJCi0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCWlmICghZG9jdW1lbnQuYWxsICYmIHJlYWRPbmx5KSB7Ci0JCQkJZXZlbnQucHJldmVudERlZmF1bHQoKTsKLQkJCX0KLQl9Ci19Ci0KLWZ1bmN0aW9uIHNlbENoYW5nZWQoZXZlbnQpIHsKLQl1cGRhdGVTZWxlY3Rpb24oKTsKLX0KLQotZnVuY3Rpb24gZW5hYmxlUmljaFRleHRFZGl0aW5nKGh0bWwpIHsKLQl2YXIgZG9jID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZWRpdG9ySWQpLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQ7Ci0JZG9jLmRlc2lnbk1vZGUgPSAib24iOwotCQotCXZhciBodG1sU3JjID0gJzxodG1sPjxoZWFkPjx0aXRsZT48L3RpdGxlPic7Ci0JCi0JaWYgKGVkaXRvckNTUyAhPSBudWxsICYmIGVkaXRvckNTUyAhPSAnJykgewotCQlodG1sU3JjICs9ICc8bGluayByZWw9IlN0eWxlU2hlZXQiIGhyZWY9IicgKyBlZGl0b3JDU1MgKyAnIiB0eXBlPSJ0ZXh0L2NzcyIvPic7Ci0JfQotCQotCWlmIChiYXNlSFJFRiAhPSBudWxsICYmIGJhc2VIUkVGICE9ICcnKSB7CQotCQlodG1sU3JjICs9ICc8YmFzZSBocmVmPSInICsgYmFzZUhSRUYgKyAnIi8+JzsKLQl9Ci0JCi0JaWYgKCFkb2N1bWVudC5hbGwgJiYgaHRtbCA9PSAnJykgewotCQkvLyBNb3ppbGxhL0ZpcmVmb3ggd2lsbCBvbmx5IGRpc3BsYXkgdGhlIGNhcmV0IGlmIDxici8+IGlzIGFkZGVkIHRvIHRoZSBIVE1MIGJvZHkuCi0JCS8vIEFkZGluZyA8YnIvPiBhbHNvIGVuYWJsZXMgdGhlIGJhY2tzcGFjZSBhbmQgZGVsZXRlIGtleSBieSBkZWZhdWx0LiBPdGhlcndpc2UsIHRoZQotCQkvLyB1c2VyIG5lZWQgdG8gZW50ZXIgc29tZSB0ZXh0IGJlZm9yZSB0aGVzZSAyIGtleXMgc3RhcnQgdG8gZnVuY3Rpb24uCi0JCWh0bWwgPSAiPGJyIC8+IjsKLQl9Ci0JCi0JaHRtbFNyYyArPSAnPC9oZWFkPjxib2R5PicgKyBodG1sICsgJzwvYm9keT48L2h0bWw+JzsKLQkKLQlkb2Mub3BlbigpOwotCWRvYy53cml0ZShodG1sU3JjKTsKLQlkb2MuY2xvc2UoKTsKLQkKLQltb2RpZmllZCA9IGZhbHNlOwotCi0JaWYgKCJhdHRhY2hFdmVudCIgaW4gZG9jKSB7Ci0JCWRvYy5hdHRhY2hFdmVudCgib25rZXlkb3duIiwga2V5UHJlc3NlZCk7Ci0JCWRvYy5hdHRhY2hFdmVudCgib25zZWxlY3Rpb25jaGFuZ2UiLCBzZWxDaGFuZ2VkKTsKLQkJLy8gZm9yIERuRCAoaW50ZXJuYWwpCi0JCWRvYy5ib2R5LmF0dGFjaEV2ZW50KCJvbmRyb3AiLCBjaGVja01vZGlmaWVkKTsKLQkJLy8gZm9yIGltYWdlL3RhYmxlIHJlc2l6aW5nOgotCQlkb2MuYm9keS5hdHRhY2hFdmVudCgib25yZXNpemVlbmQiLCBjaGVja01vZGlmaWVkKTsKLQl9CQotCWlmICgiYWRkRXZlbnRMaXN0ZW5lciIgaW4gZG9jKSB7Ci0JCWRvYy5hZGRFdmVudExpc3RlbmVyKCJrZXlwcmVzcyIsIGtleVByZXNzZWQsIHRydWUpOwotCQlkb2MuYWRkRXZlbnRMaXN0ZW5lcigia2V5cHJlc3MiLCBzZWxDaGFuZ2VkLCBmYWxzZSk7Ci0JCWRvYy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZXVwIiwgc2VsQ2hhbmdlZCwgZmFsc2UpOwotCQlkb2MuYWRkRXZlbnRMaXN0ZW5lcigiZHJhZ2Ryb3AiLCBjaGVja01vZGlmaWVkLCBmYWxzZSk7Ci0JCQotCQkvLyBjaGVjayBtb3VzZXVwIGV2ZW50IGZvciBpbWFnZS90YWJsZSByZXNpemluZwotCQlkb2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2V1cCIsIGNoZWNrTW9kaWZpZWQsIGZhbHNlKTsKLQl9Ci0KLQlzZXRTdGF0dXMoU1RBVFVTX0VYRUNfQ01ELCAxKTsKLX0KLQotLy8gdGhpcyBvbmUgaXMgZm9yIG1vZGlmaWNhdGlvbiBjaGVjayBvbiBkcmFnIG4gZHJvcCB3aXRoaW4gdGhlIFJURQotLy8gY2hlY2tNb2RpZmllZCBsaXN0ZW5lcgotZnVuY3Rpb24gY2hlY2tNb2RpZmllZChldmVudCkgewotCXNldFRpbWVvdXQoInNldFN0YXR1cyhTVEFUVVNfTU9ESUZJRUQsIG51bGwpOyIsIDEwKTsKLX0KLQotLy8gU2V0cyB0aGUgaGVpZ2h0IG9mIHRoZSBlZGl0b3IuCi1mdW5jdGlvbiBzZXRIZWlnaHQoaGVpZ2h0KSB7Ci0JaWYgKGluaXRpYWxpemVkKSB7Ci0JCWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGVkaXRvcklkKS5oZWlnaHQgPSBoZWlnaHQgKyAicHgiOwotCX0KLX0KLQotLy8gU2V0cyB0aGUgc3RhdHVzLgotLy8gTm90ZTogQnkgZGVmYXVsdCwgRmlyZWZveCBkaXNhYmxlcyBjaGFuZ2VzIHRvIHRoZSBzdGF0dXMgYmFyLiBGb3IgdGhpcyB0byB3b3JrLCB0aGUgdXNlcgotLy8gbXVzdCBzZXQgdGhlIGdsb2JhbCBwcmVmZXJlbmNlICJkb20uZGlzYWJsZV93aW5kb3dfc3RhdHVzX2NoYW5nZSIgdG8gZmFsc2UuCi0vLyBGb3IgRmlyZWZveCAxLjAueCwgdGhpcyBzZXR0aW5nIGNhbiBiZSBtYWRlIGluIC91c3IvZmlyZWZveC0xLjAuNy9kZWZhdWx0cy9wcmVmL2ZpcmVmb3guanMuCi1mdW5jdGlvbiBzZXRTdGF0dXModHlwZSwgdmFsdWUpIHsKLQl2YXIgc3RhdHVzID0gJyQkJCcgKyB0eXBlOwotCWlmICh2YWx1ZSAhPSBudWxsICYmIHZhbHVlICE9ICcnKSB7Ci0JCXN0YXR1cyArPSAoJyQnICsgdmFsdWUpOwkJCi0JfQotCXdpbmRvdy5zdGF0dXMgPSBzdGF0dXM7Ci0Jd2luZG93LnN0YXR1cyA9ICckJCQnICsgU1RBVFVTX05PUDsKLX0KLQotLy8gUmV0dXJucyB0aGUgSFRNTCBzb3VyY2UuCi1mdW5jdGlvbiBnZXRIVE1MKCkgewotCXZhciBodG1sID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZWRpdG9ySWQpLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQuYm9keS5pbm5lckhUTUw7Ci0JaWYgKGh0bWwgPT0gIjxQPiZuYnNwOzwvUD4iKSB7Ci0JCWh0bWwgPSAiIjsKLQl9Ci0JaWYgKGh0bWwgIT0gbnVsbCAmJiBodG1sICE9ICcnKSB7Ci0JCXZhciByZWdFeCA9IG5ldyBSZWdFeHAoIlwiZmlsZVw6KFtePV0qKSgvcmVzb3VyY2VzLykoW15cIl0rKVwiIiwgImciKTsKLQkJaHRtbCA9IGh0bWwucmVwbGFjZShyZWdFeCwgIlwiLi9yZXNvdXJjZXMvJDNcIiIpOwotCQlyZWdFeCA9IG5ldyBSZWdFeHAoIlwiZmlsZVw6KFtePV0qKS8jKFteXCJdKylcIiIsICJnIik7Ci0JCWh0bWwgPSBodG1sLnJlcGxhY2UocmVnRXgsICJcIiMkMlwiIik7Ci0JfQotCXJldHVybiBodG1sOwotfQotCi0vL1JldHVybnMgdGhlIEhUTUwgc291cmNlIHRvIHRoZSBKYXZhIGxheWVyCi1mdW5jdGlvbiBnZXRUZXh0KCkgewotCXZhciBodG1sID0gZ2V0SFRNTCgpOwotCXNldFN0YXR1cyhTVEFUVVNfR0VUX1RFWFQsIGh0bWwpOwotCXJldHVybiBodG1sOwotfQotCi1mdW5jdGlvbiBzZXRJbm5lckhUTUwoaHRtbCkgewotCWlmIChkb2N1bWVudC5hbGwpIHsKLQkJLy8gSUUgaGFzIHByb2JsZW0gc2V0dGluZyBjb21wbGV4IEhUTUwgc2V0IHZpYSBkb2MuYm9keS5pbm5lckhUTUwuCi0JCWVuYWJsZVJpY2hUZXh0RWRpdGluZyhodG1sKTsKLQl9Ci0JZWxzZSB7Ci0JCWlmIChodG1sID09ICcnKSB7Ci0JCQkvLyBNb3ppbGxhL0ZpcmVmb3ggd2lsbCBvbmx5IGRpc3BsYXkgdGhlIGNhcmV0IGlmIDxici8+IGlzIGFkZGVkIHRvIHRoZSBIVE1MIGJvZHkuCi0JCQlodG1sID0gIjxici8+IjsKLQkJfQotCQl2YXIgZG9jID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZWRpdG9ySWQpLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQ7Ci0JCWlmIChkb2MuYm9keSAhPSBudWxsKSB7Ci0JCQlkb2MuYm9keS5pbm5lckhUTUwgPSBodG1sOwotCQl9Ci0JCWVsc2UgewotCQkJLy8gTW96aWxsYS9GaXJlZm94IGNhbiB0YWtlIGEgd2hpbGUgdG8gaW5pdGlhbGl6ZSBkb2N1bWVudC5ib2R5Ci0JCQkvLyBhZnRlciBkb2N1bWVudC53cml0ZSgpLgotCQkJdHJ5IHsKLQkJCQlzZXRUaW1lb3V0KCJzZXRJbm5lckhUTUwoJyIgKyBodG1sICsgIicpOyIsIDEwKTsKLQkJCX0KLQkJCWNhdGNoIChlKSB7Ci0JCQl9Ci0JCX0KLQl9Ci19Ci0KLS8vIFNldHMgdGhlIEhUTUwgc291cmNlLgotZnVuY3Rpb24gc2V0VGV4dChodG1sKSB7Ci0JaWYgKHN1cHBvcnRSaWNoVGV4dEVkaXRpbmcpIHsKLQkJaHRtbCA9IGRlY29kZVN0cmluZyhodG1sKTsKLQkJc2VsZWN0aW9uSW5mbyA9IGdldFNlbGVjdGlvbkluZm8oKTsKLQkJc2V0SW5uZXJIVE1MKGh0bWwpOwotCQlpZiAoc2VsZWN0aW9uSW5mbyAhPSBudWxsKSB7Ci0JCQlzZXRUaW1lb3V0KCJzZXRTZWxlY3Rpb24oc2VsZWN0aW9uSW5mbyk7IiwgMTApOwotCQl9Ci0JCW1vZGlmaWVkID0gZmFsc2U7Ci0JCXNldFN0YXR1cyhTVEFUVVNfRVhFQ19DTUQsIDEpOwotCX0KLX0KLQotZnVuY3Rpb24gc2V0U2VsZWN0aW9uKHNlbGVjdGlvbkluZm8pIHsKLQlpZiAoIXN1cHBvcnRSaWNoVGV4dEVkaXRpbmcpIHsKLQkJcmV0dXJuOwotCX0KLQkKLQljb250ZW50V2luZG93ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZWRpdG9ySWQpLmNvbnRlbnRXaW5kb3c7Ci0JZWRpdG9yRG9jID0gY29udGVudFdpbmRvdy5kb2N1bWVudDsKLQkKLQl0cnkgewotCQlpZiAoZG9jdW1lbnQuYWxsKSB7Ci0JCQl2YXIgc3RhcnRPZmZzZXQgPSBzZWxlY3Rpb25JbmZvLnN0YXJ0OwotCQkJdmFyIGxlbiA9IHNlbGVjdGlvbkluZm8ubGVuOwotCQkJaWYgKHN0YXJ0T2Zmc2V0ID09IDAgJiYgbGVuID09IDApIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQl2YXIgdGVtcFJhbmdlID0gZWRpdG9yRG9jLmJvZHkuY3JlYXRlVGV4dFJhbmdlKCk7Ci0JCQl0ZW1wUmFuZ2UubW92ZVN0YXJ0KCdjaGFyYWN0ZXInLCBzdGFydE9mZnNldCk7Ci0JCQl0ZW1wUmFuZ2UuY29sbGFwc2UoKTsKLQkJCXRlbXBSYW5nZS5tb3ZlRW5kKCdjaGFyYWN0ZXInLCBsZW4pOwotCQkJdGVtcFJhbmdlLnNlbGVjdCgpOwotCQkJdGVtcFJhbmdlLnNjcm9sbEludG9WaWV3KCk7Ci0JCX0gZWxzZSB7Ci0JCQlzZWxlY3Rpb24gPSB0aGlzLndpbmRvdy5nZXRTZWxlY3Rpb24oKTsKLQkJCXZhciBzdGFydENvbnRhaW5lciA9IHNlbGVjdGlvbkluZm8uc3RhcnRDb250YWluZXI7Ci0JCQl2YXIgc3RhcnQgPSBzZWxlY3Rpb25JbmZvLnN0YXJ0OwotCQkJdmFyIGVuZENvbnRhaW5lciA9IHNlbGVjdGlvbkluZm8uZW5kQ29udGFpbmVyOwotCQkJdmFyIGVuZCA9IHNlbGVjdGlvbkluZm8uZW5kOwotCQkJdmFyIHRlbXBSYW5nZSA9IGRvY3VtZW50LmNyZWF0ZVJhbmdlKCk7Ci0JCQl0ZW1wUmFuZ2Uuc2V0U3RhcnQoc3RhcnRDb250YWluZXIsIHN0YXJ0KTsKLQkJCXRlbXBSYW5nZS5zZXRFbmQoZW5kQ29udGFpbmVyLCBlbmQpOwotCQkJc2VsZWN0aW9uLnJlbW92ZUFsbFJhbmdlcygpOwotCQkJc2VsZWN0aW9uLmFkZFJhbmdlKHRlbXBSYW5nZSk7Ci0JCQljb250ZW50V2luZG93LmZvY3VzKCk7Ci0JCX0KLQl9IGNhdGNoIChlKSB7Ci0JfQotfQotCi1mdW5jdGlvbiBnZXRTZWxlY3Rpb25JbmZvKCkgewotCWlmICghc3VwcG9ydFJpY2hUZXh0RWRpdGluZykgewotCQlyZXR1cm4gbnVsbDsKLQl9CQotCQotCWNvbnRlbnRXaW5kb3cgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChlZGl0b3JJZCkuY29udGVudFdpbmRvdzsKLQllZGl0b3JEb2MgPSBjb250ZW50V2luZG93LmRvY3VtZW50OwotCQotCXZhciB0ZW1wU2VsUmFuZ2U7Ci0JdHJ5IHsKLQkgICAgaWYgKGRvY3VtZW50LmFsbCkgewotCQkJc2VsZWN0aW9uID0gZWRpdG9yRG9jLnNlbGVjdGlvbjsKLQkJCWlmIChzZWxlY3Rpb24gIT0gbnVsbCkgewotCQkJCXRlbXBTZWxSYW5nZSA9IHNlbGVjdGlvbi5jcmVhdGVSYW5nZSgpOwotCQkJfQotCQkJLy8gbGVuZ3RoIG9mIHNlbGVjdGlvbgotCQkJdmFyIHRlbXBTZWxMZW4gPSB0ZW1wU2VsUmFuZ2UudGV4dC5sZW5ndGg7Ci0JCQkvLyBjcmVhdGUgbmV3IHJhbmdlCi0JCQl2YXIgdGVtcFJhbmdlID0gZWRpdG9yRG9jLmJvZHkuY3JlYXRlVGV4dFJhbmdlKCk7Ci0JCQkvLyBzZXQgZW5kIG9mIG5ldyByYW5nZSB0byBzdGFydCBvZiBzZWxlY3Rpb24KLQkJCS8vIHRoaXMgd2lsbCB0aHJvdyBhbiBleGNlcHRpb24gaWYgdGVtcFNlbFJhbmdlIGlzIG5vdCBpbiBlZGl0b3IuZG9jLmJvZHkgKGllLCBhdCB0aGUgc3RhcnQgb2YgdGhlIFJURSkuCi0JCQl0ZW1wUmFuZ2Uuc2V0RW5kUG9pbnQoIkVuZFRvU3RhcnQiLCB0ZW1wU2VsUmFuZ2UpOwotCQkJLy8gbGVuZ3RoIG9mIG5ldyByYW5nZSBpcyB0aGUgc3RhcnQgb2Zmc2V0Ci0JCQl2YXIgdGVtcFRleHQgPSB0ZW1wUmFuZ2UudGV4dDsKLQkJCS8vIElFIGNvdW50cyBuZXdsaW5lcyBhcyAyIGNoYXJhY3RlcnMgZm9yIGxlbmd0aCBwcm9wZXJ0eSwgYnV0IHRoZXkgY291bnQgYXMgMSB3aGVuIHVzaW5nIG1vdmVTdGFydCBzbyByZW1vdmUgdGhlIFxyIHRvIG1ha2UgdGhlIGNvdW50IHRoZSBzYW1lCi0JCQl0ZW1wVGV4dCA9IHRlbXBUZXh0LnJlcGxhY2UoL1xyL2csICIiKTsKLQkJCXZhciBzdGFydE9mZnNldCA9IHRlbXBUZXh0Lmxlbmd0aDsKLQkJCQotCQkJcmV0dXJuIHtzdGFydDpzdGFydE9mZnNldCwgbGVuOnRlbXBTZWxMZW59OwotCSAgICB9IGVsc2UgewotCQkJc2VsZWN0aW9uID0gY29udGVudFdpbmRvdy5nZXRTZWxlY3Rpb24oKTsKLQkJCWlmIChzZWxlY3Rpb24gIT0gbnVsbCkgewotCQkJCXRlbXBTZWxSYW5nZSA9IHNlbGVjdGlvbi5nZXRSYW5nZUF0KHNlbGVjdGlvbi5yYW5nZUNvdW50IC0gMSkuY2xvbmVSYW5nZSgpOwotCQkJfQotCQkJcmV0dXJuIHtzdGFydENvbnRhaW5lcjogdGVtcFNlbFJhbmdlLnN0YXJ0Q29udGFpbmVyLCBzdGFydDp0ZW1wU2VsUmFuZ2Uuc3RhcnRPZmZzZXQsIAotCQkJCWVuZENvbnRhaW5lcjogdGVtcFNlbFJhbmdlLmVuZENvbnRhaW5lciwgZW5kOnRlbXBTZWxSYW5nZS5lbmRPZmZzZXR9OwotCSAgICB9Ci0JfSBjYXRjaCAoZSkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci19Ci0KLS8vIERlY29kZXMgdGhlIEhUTUwgcGFzc2VkIGZyb20gdGhlIEphdmEgbGF5ZXIuCi1mdW5jdGlvbiBkZWNvZGVTdHJpbmcoc3RyKSB7Ci0JaWYgKHN0ciAhPSBudWxsICYmIHN0ciAhPSAnJykgewotCQlpZiAoZG9jdW1lbnQuYWxsKSB7Ci0JCQlzdHIgPSBzdHIucmVwbGFjZSgvJXNxJS9nLCAiJyIpOwotCQkJc3RyID0gc3RyLnJlcGxhY2UoLyVFT0wlL2csICJcbiIpOwotCQl9Ci0JCWVsc2UgewotCQkJc3RyID0gc3RyLnJlcGxhY2UoLyVzcSUvZywgIiZhcG9zOyIpOwotCQkJc3RyID0gc3RyLnJlcGxhY2UoLyVFT0wlL2csICIiKTsKLQkJCXN0ciA9IHN0ci5yZXBsYWNlKC9cbi9nLCAiIik7Ci0JCX0KLQl9Ci0JcmV0dXJuIHN0cjsKLX0KLQotLy8gdXBkYXRlcyBzZWxlY3Rpb24gd2l0aG91dCBub3RpZnlpbmcgdGhlIEphdmEgbGF5ZXIgb2YgdGhlIHNlbGVjdGlvbiBzdGF0ZQotZnVuY3Rpb24gaW50ZXJuYWxVcGRhdGVTZWxlY3Rpb24oKSB7Ci0JaWYgKCFzdXBwb3J0UmljaFRleHRFZGl0aW5nKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9CQotCQotCWNvbnRlbnRXaW5kb3cgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChlZGl0b3JJZCkuY29udGVudFdpbmRvdzsKLQllZGl0b3JEb2MgPSBjb250ZW50V2luZG93LmRvY3VtZW50OwotCQotCWlmIChkb2N1bWVudC5hbGwpIHsKLQkJc2VsZWN0aW9uID0gZWRpdG9yRG9jLnNlbGVjdGlvbjsKLQkJaWYgKHNlbGVjdGlvbiAhPSBudWxsKSB7Ci0JCQlzZWxlY3Rpb25SYW5nZSA9IHNlbGVjdGlvbi5jcmVhdGVSYW5nZSgpOwotCQkJcmVmb3JtYXRFbGVtZW50TGlua3MoKTsKLQkJfQotCX0KLQllbHNlIHsKLQkJc2VsZWN0aW9uID0gY29udGVudFdpbmRvdy5nZXRTZWxlY3Rpb24oKTsKLQkJaWYgKHNlbGVjdGlvbiAhPSBudWxsKSB7Ci0JCQlzZWxlY3Rpb25SYW5nZSA9IHNlbGVjdGlvbi5nZXRSYW5nZUF0KHNlbGVjdGlvbi5yYW5nZUNvdW50IC0gMSkuY2xvbmVSYW5nZSgpOwotCQkJaWYgKHNlbGVjdGlvblJhbmdlLnN0YXJ0Q29udGFpbmVyLm5vZGVOYW1lID09ICJIVE1MIiAmJgotCQkJCQlzZWxlY3Rpb25SYW5nZS5lbmRDb250YWluZXIubm9kZU5hbWUgPT0gIkhUTUwiKSB7Ci0JCQkJLy8gTW96aWxsYSBzZWxlY3RzIHRoZSB3aG9sZSBkb2N1bWVudCB3aGVuIHRoZXJlJ3Mgbm8gUlRFIGNvbnRlbnQsIHNvIHNlbGVjdCBqdXN0IHRoZSBib2R5Ci0JCQkJc2VsZWN0aW9uUmFuZ2UgPSBlZGl0b3JEb2MuY3JlYXRlUmFuZ2UoKTsKLQkJCQlzZWxlY3Rpb25SYW5nZS5zZXRTdGFydChlZGl0b3JEb2MuYm9keSwgMCk7Ci0JCQkJc2VsZWN0aW9uUmFuZ2Uuc2V0RW5kKGVkaXRvckRvYy5ib2R5LCAwKTsKLQkJCX0KLQkJfQotCX0KLQlyZXR1cm4gdHJ1ZTsKLX0KLQotLy8gVXBkYXRlcyB0aGUgY3VycmVudCBzZWxlY3Rpb24gYW5kIHNlbGVjdGlvbiByYW5nZS4KLWZ1bmN0aW9uIHVwZGF0ZVNlbGVjdGlvbigpIHsKLQlpZiAoIXN1cHBvcnRSaWNoVGV4dEVkaXRpbmcpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0JCi0JCi0JY29udGVudFdpbmRvdyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGVkaXRvcklkKS5jb250ZW50V2luZG93OwotCWVkaXRvckRvYyA9IGNvbnRlbnRXaW5kb3cuZG9jdW1lbnQ7Ci0JCi0JdmFyIHRlbXBTZWxSYW5nZTsKLQl2YXIgc2VsT2Zmc2V0U3RhcnQgPSAwOwotCXZhciBzZWxlY3RlZFRleHQgPSAiIjsKLQl2YXIgZm9udE5hbWUgPSAiIjsKLQl2YXIgZm9udFNpemUgPSAiIjsKLQl2YXIgYmxvY2tTdHlsZSA9ICIiOwotCXZhciB0ZXh0RmxhZ3MgPSAwOwotCQotCQotCWlmIChkb2N1bWVudC5hbGwpIHsKLQkJc2VsZWN0aW9uID0gZWRpdG9yRG9jLnNlbGVjdGlvbjsKLQkJaWYgKHNlbGVjdGlvbiAhPSBudWxsKSB7Ci0JCQlzZWxlY3Rpb25SYW5nZSA9IHNlbGVjdGlvbi5jcmVhdGVSYW5nZSgpOwotCQkJaWYgKHNlbGVjdGlvblJhbmdlICE9IG51bGwgJiYgc2VsZWN0aW9uLnR5cGUgIT0gIkNvbnRyb2wiKSB7Ci0JCQkJdGVtcFNlbFJhbmdlID0gc2VsZWN0aW9uUmFuZ2UuZHVwbGljYXRlKCk7Ci0JCQl9Ci0JCQlyZWZvcm1hdEVsZW1lbnRMaW5rcygpOwotCQl9Ci0JfQotCWVsc2UgewotCQlzZWxlY3Rpb24gPSBjb250ZW50V2luZG93LmdldFNlbGVjdGlvbigpOwotCQlpZiAoc2VsZWN0aW9uICE9IG51bGwpIHsKLQkJCXNlbGVjdGlvblJhbmdlID0gc2VsZWN0aW9uLmdldFJhbmdlQXQoc2VsZWN0aW9uLnJhbmdlQ291bnQgLSAxKS5jbG9uZVJhbmdlKCk7Ci0JCQl0ZW1wU2VsUmFuZ2UgPSBzZWxlY3Rpb25SYW5nZS5jbG9uZVJhbmdlKCk7Ci0JCX0KLQl9Ci0JaWYgKHRlbXBTZWxSYW5nZSAhPSBudWxsKSB7Ci0JCXRyeSB7Ci0JCQlpZiAoZG9jdW1lbnQuYWxsKSB7Ci0JCQkJaWYgKHNlbGVjdGlvblJhbmdlLnRleHQpIHsKLQkJCQkJc2VsZWN0ZWRUZXh0ID0gc2VsZWN0aW9uUmFuZ2UudGV4dDsKLQkJCQl9Ci0JCQkJLyogZm9yIGdldHRpbmcgc2VsZWN0aW9uIG9mZnNldCAtIGNvbW1lbnRlZCBiZWNhdXNlIHdlIGNhbid0IHNlbGVjdCB0aGUKLQkJCQkgKiBwcm9wZXIgbG9jYXRpb24gaW4gdGhlIEhUTUwgc291cmNlIHRhYiBiZWNhdXNlIEpUaWR5J3MgcmVmb3JtYXR0aW5nIG9mIHRoZSBIVE1MCi0JCQkJdmFyIGh0bWwgPSBnZXRIVE1MKCk7Ci0JICAgICAgICAgICAgdmFyIHRlbXBTZWxMZW4gPSB0ZW1wU2VsUmFuZ2UuaHRtbFRleHQubGVuZ3RoOwkJCQotCSAgICAgICAgICAgIHRlbXBTZWxSYW5nZS5tb3ZlU3RhcnQoJ2NoYXJhY3RlcicsIC1odG1sLmxlbmd0aCk7Ci0JICAgICAgICAgICAgc2VsT2Zmc2V0U3RhcnQgPSB0ZW1wU2VsUmFuZ2UuaHRtbFRleHQubGVuZ3RoIC0gdGVtcFNlbExlbjsKLQkgICAgICAgICAgICAqLwotCQkJCXZhciBzZWxQYXJlbnQgPSB0ZW1wU2VsUmFuZ2UucGFyZW50RWxlbWVudCgpOwotCQkJCWZvbnROYW1lID0gdGVtcFNlbFJhbmdlLnF1ZXJ5Q29tbWFuZFZhbHVlKCdmb250TmFtZScpOwotCQkJCWZvbnRTaXplID0gdGVtcFNlbFJhbmdlLnF1ZXJ5Q29tbWFuZFZhbHVlKCdmb250U2l6ZScpOwotCQkJCWJsb2NrU3R5bGUgPSB0ZW1wU2VsUmFuZ2UucXVlcnlDb21tYW5kVmFsdWUoJ2Zvcm1hdEJsb2NrJyk7Ci0JCQkJaWYgKGJsb2NrU3R5bGUgPT0gIk5vcm1hbCIpIHsKLQkJCQkJaWYgKHNlbFBhcmVudC5jbGFzc05hbWUgPT0gInF1b3RlIikgewotCQkJCQkJYmxvY2tTdHlsZSA9ICI8cXVvdGU+IjsKLQkJCQkJfSBlbHNlIGlmIChzZWxQYXJlbnQuY2xhc3NOYW1lID09ICJjb2RlU2FtcGxlIikgewotCQkJCQkJYmxvY2tTdHlsZSA9ICI8Y29kZT4iOwotCQkJCQl9IGVsc2UgewotCQkJCQkJYmxvY2tTdHlsZSA9ICI8cD4iOwotCQkJCQl9Ci0JCQkJfSBlbHNlIGlmIChibG9ja1N0eWxlID09ICJIZWFkaW5nIDMiKSB7Ci0JCQkJCWJsb2NrU3R5bGUgPSAiPGgzPiI7Ci0JCQkJfSBlbHNlIGlmIChibG9ja1N0eWxlID09ICJIZWFkaW5nIDQiKSB7Ci0JCQkJCWJsb2NrU3R5bGUgPSAiPGg0PiI7Ci0JCQkJfSBlbHNlIGlmIChibG9ja1N0eWxlID09ICJIZWFkaW5nIDUiKSB7Ci0JCQkJCWJsb2NrU3R5bGUgPSAiPGg1PiI7Ci0JCQkJfSBlbHNlIGlmIChibG9ja1N0eWxlID09ICIiIHx8IGJsb2NrU3R5bGUgPT0gbnVsbCkgewotCQkJCQlibG9ja1N0eWxlID0gIjxwPiI7Ci0JCQkJfQotCQkJCWlmICh0ZW1wU2VsUmFuZ2UucXVlcnlDb21tYW5kVmFsdWUoJ2JvbGQnKSA9PSB0cnVlKSB7Ci0JCQkJCXRleHRGbGFncyB8PSBCT0xEOwotCQkJCX0KLQkJCQlpZiAodGVtcFNlbFJhbmdlLnF1ZXJ5Q29tbWFuZFZhbHVlKCdpdGFsaWMnKSA9PSB0cnVlKSB7Ci0JCQkJCXRleHRGbGFncyB8PSBJVEFMSUM7Ci0JCQkJfQotCQkJCWlmICh0ZW1wU2VsUmFuZ2UucXVlcnlDb21tYW5kVmFsdWUoJ3VuZGVybGluZScpID09IHRydWUpIHsKLQkJCQkJdGV4dEZsYWdzIHw9IFVOREVSTElORTsKLQkJCQl9Ci0JCQkJaWYgKHRlbXBTZWxSYW5nZS5xdWVyeUNvbW1hbmRWYWx1ZSgnc3Vic2NyaXB0JykgPT0gdHJ1ZSkgewotCQkJCQl0ZXh0RmxhZ3MgfD0gU1VCU0NSSVBUOwotCQkJCX0KLQkJCQlpZiAodGVtcFNlbFJhbmdlLnF1ZXJ5Q29tbWFuZFZhbHVlKCdzdXBlcnNjcmlwdCcpID09IHRydWUpIHsKLQkJCQkJdGV4dEZsYWdzIHw9IFNVUEVSU0NSSVBUOwotCQkJCX0KLQkJCQlzZXRTdGF0dXMoU1RBVFVTX1NFTEVDVF9URVhULCAvKiBzZWxPZmZzZXRTdGFydCArICIkIiArICovCi0JCQkJCQlmb250TmFtZSArICIkIiArIGZvbnRTaXplICsgIiQiICsgYmxvY2tTdHlsZSArICIkIiArIHRleHRGbGFncyArICIkIiArIHNlbGVjdGVkVGV4dCk7Ci0JCQl9IGVsc2UgewotCQkJCWlmIChzZWxlY3Rpb25SYW5nZSAhPSBudWxsKSB7Ci0JCQkJCXNlbGVjdGVkVGV4dCA9IHNlbGVjdGlvblJhbmdlLnRvU3RyaW5nKCk7Ci0JCQkJfQotCQkJCXZhciBzZWxQYXJlbnQgPSBzZWxlY3Rpb24uZm9jdXNOb2RlOwotCQkJCWZvbnROYW1lID0gZWRpdG9yRG9jLnF1ZXJ5Q29tbWFuZFZhbHVlKCdmb250TmFtZScpOwotCQkJCWlmIChmb250TmFtZSA9PSAiIikgewotCQkJCQlmb250TmFtZSA9ICJkZWZhdWx0IjsKLQkJCQl9Ci0JCQkJZm9udFNpemUgPSBlZGl0b3JEb2MucXVlcnlDb21tYW5kVmFsdWUoJ2ZvbnRTaXplJyk7Ci0JCQkJaWYgKGZvbnRTaXplID09ICIiKSB7Ci0JCQkJCWZvbnRTaXplID0gImRlZmF1bHQiOwotCQkJCX0KLQkJCQlibG9ja1N0eWxlID0gZWRpdG9yRG9jLnF1ZXJ5Q29tbWFuZFZhbHVlKCdmb3JtYXRCbG9jaycpOwotCQkJCWlmIChibG9ja1N0eWxlID09ICJwIikgewotCQkJCQlpZiAoc2VsUGFyZW50LnBhcmVudE5vZGUuY2xhc3NOYW1lID09ICJxdW90ZSIpIHsKLQkJCQkJCWJsb2NrU3R5bGUgPSAiPHF1b3RlPiI7Ci0JCQkJCX0gZWxzZSBpZiAoc2VsUGFyZW50LnBhcmVudE5vZGUuY2xhc3NOYW1lID09ICJjb2RlU2FtcGxlIikgewotCQkJCQkJYmxvY2tTdHlsZSA9ICI8Y29kZT4iOwotCQkJCQl9IGVsc2UgewotCQkJCQkJYmxvY2tTdHlsZSA9ICI8cD4iOwotCQkJCQl9Ci0JCQkJfSBlbHNlIGlmIChibG9ja1N0eWxlID09ICJoMyIpIHsKLQkJCQkJYmxvY2tTdHlsZSA9ICI8aDM+IjsKLQkJCQl9IGVsc2UgaWYgKGJsb2NrU3R5bGUgPT0gImg0IikgewotCQkJCQlibG9ja1N0eWxlID0gIjxoND4iOwotCQkJCX0gZWxzZSBpZiAoYmxvY2tTdHlsZSA9PSAiaDUiKSB7Ci0JCQkJCWJsb2NrU3R5bGUgPSAiPGg1PiI7Ci0JCQkJfSBlbHNlIGlmIChibG9ja1N0eWxlID09ICIiKSB7Ci0JCQkJCWJsb2NrU3R5bGUgPSAiPHA+IjsKLQkJCQl9Ci0JCQkJaWYgKGVkaXRvckRvYy5xdWVyeUNvbW1hbmRTdGF0ZSgnYm9sZCcpID09IHRydWUpIHsKLQkJCQkJdGV4dEZsYWdzIHw9IEJPTEQ7Ci0JCQkJfQotCQkJCWlmIChlZGl0b3JEb2MucXVlcnlDb21tYW5kU3RhdGUoJ2l0YWxpYycpID09IHRydWUpIHsKLQkJCQkJdGV4dEZsYWdzIHw9IElUQUxJQzsKLQkJCQl9Ci0JCQkJaWYgKGVkaXRvckRvYy5xdWVyeUNvbW1hbmRTdGF0ZSgndW5kZXJsaW5lJykgPT0gdHJ1ZSkgewotCQkJCQl0ZXh0RmxhZ3MgfD0gVU5ERVJMSU5FOwotCQkJCX0KLQkJCQlpZiAoZWRpdG9yRG9jLnF1ZXJ5Q29tbWFuZFN0YXRlKCdzdWJzY3JpcHQnKSA9PSB0cnVlKSB7Ci0JCQkJCXRleHRGbGFncyB8PSBTVUJTQ1JJUFQ7Ci0JCQkJfQotCQkJCWlmIChlZGl0b3JEb2MucXVlcnlDb21tYW5kU3RhdGUoJ3N1cGVyc2NyaXB0JykgPT0gdHJ1ZSkgewotCQkJCQl0ZXh0RmxhZ3MgfD0gU1VQRVJTQ1JJUFQ7Ci0JCQkJfQotCQkJCXNldFN0YXR1cyhTVEFUVVNfU0VMRUNUX1RFWFQsIC8qIHNlbE9mZnNldFN0YXJ0ICsgIiQiICsgKi8KLQkJCQkJCWZvbnROYW1lICsgIiQiICsgZm9udFNpemUgKyAiJCIgKyBibG9ja1N0eWxlICsgIiQiICsgdGV4dEZsYWdzICsgIiQiICsgc2VsZWN0ZWRUZXh0KTsKLQkJCX0KLQkJfSBjYXRjaCAoZSkgeyB9Ci0JfQkKLQotCXJldHVybiB0cnVlOwotfQotCi0vLyBTZXRzIGZvY3VzIHRvIHRoaXMgZWRpdG9yLgotZnVuY3Rpb24gc2V0Rm9jdXMoKSB7Ci0JaWYgKCFzdXBwb3J0UmljaFRleHRFZGl0aW5nKSB7Ci0JCXJldHVybjsKLQl9CQotCWlmIChkb2N1bWVudC5hbGwpIHsKLQkJaWZyYW1lID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZWRpdG9ySWQpOwotCQlpZnJhbWUuZm9jdXMoKTsKLQl9IGVsc2UgewotCQljb250ZW50V2luZG93ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZWRpdG9ySWQpLmNvbnRlbnRXaW5kb3c7Ci0JCWNvbnRlbnRXaW5kb3cuZm9jdXMoKTsKLQl9Ci0Jc2V0U3RhdHVzKFNUQVRVU19FWEVDX0NNRCwgMSk7CQotfQotCi0vLyBSZWZvcm1hdHMgZWxlbWVudCBsaW5rcyBjcmVhdGVkIHZpYSBkcmFnICYgZHJvcC4KLWZ1bmN0aW9uIHJlZm9ybWF0RWxlbWVudExpbmtzKCkgewotCXZhciBsaW5rc1JlZm9ybWF0dGVkID0gMDsKLQl2YXIgZWxlbWVudHMgPSBlZGl0b3JEb2MuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ0EnKTsKLQlmb3IgKHZhciBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCXZhciBlbGVtZW50ID0gZWxlbWVudHNbaV07Ci0JCWlmIChlbGVtZW50LmNsYXNzTmFtZS50b0xvd2VyQ2FzZSgpID09ICdlbGVtZW50bGluaycgfHwKLQkJCQllbGVtZW50LmNsYXNzTmFtZS50b0xvd2VyQ2FzZSgpID09ICdlbGVtZW50bGlua3dpdGh0eXBlJyB8fAotCQkJCWVsZW1lbnQuY2xhc3NOYW1lLnRvTG93ZXJDYXNlKCkgPT0gJ2VsZW1lbnRsaW5rd2l0aHVzZXJ0ZXh0JykgewotIAkJCWlmIChlbGVtZW50LmZpcnN0Q2hpbGQgIT0gbnVsbCAmJiBlbGVtZW50LmZpcnN0Q2hpbGQuZmlyc3RDaGlsZCAhPSBudWxsICYmCi0gCQkJCWVsZW1lbnQuZmlyc3RDaGlsZC5maXJzdENoaWxkLmZpcnN0Q2hpbGQgIT0gbnVsbCkgewotIAkJCQl2YXIgbGlua1RleHQgPSBlbGVtZW50LmZpcnN0Q2hpbGQuZmlyc3RDaGlsZC5maXJzdENoaWxkLm5vZGVWYWx1ZTsKLSAJCQkJZWxlbWVudC5yZW1vdmVDaGlsZChlbGVtZW50LmZpcnN0Q2hpbGQpOwotIAkJCQllbGVtZW50LmFwcGVuZENoaWxkKGVkaXRvckRvYy5jcmVhdGVUZXh0Tm9kZShsaW5rVGV4dCkpOwotIAkJCQlsaW5rc1JlZm9ybWF0dGVkKys7Ci0gCQkJfQotCQl9Ci0JfQotCWlmIChsaW5rc1JlZm9ybWF0dGVkID4gMCkgewotCQlzZXRTdGF0dXMoU1RBVFVTX1JFRk9STUFUX0xJTktTLCBudWxsKTsKLQl9Ci19Ci0KLS8vIEZvcm1hdHMgdGhlIHNlbGVjdGVkIHRleHQuCi1mdW5jdGlvbiBmb3JtYXRUZXh0KGNvbW1hbmQsIG9wdGlvbikgewotCWlmICghcmVhZE9ubHkgJiYgaW50ZXJuYWxVcGRhdGVTZWxlY3Rpb24oKSkgewotCQlpZiAoZWRpdG9yRG9jLmV4ZWNDb21tYW5kKGNvbW1hbmQsIGZhbHNlLCBvcHRpb24pKSB7Ci0JCQlzZXRTdGF0dXMoU1RBVFVTX0VYRUNfQ01ELCAxKTsJCQotCQkJc2V0U3RhdHVzKFNUQVRVU19NT0RJRklFRCwgbnVsbCk7Ci0JCX0KLQl9Ci19Ci0KLS8vIEFkZHMgSFRNTC4KLWZ1bmN0aW9uIGFkZEhUTUwoaHRtbCkgewotCWlmICghcmVhZE9ubHkgJiYgaHRtbCAhPSAiIikgIHsKLQkJaHRtbCA9IGRlY29kZVN0cmluZyhodG1sKTsKLQkJaWYgKGludGVybmFsVXBkYXRlU2VsZWN0aW9uKCkpIHsKLQkJCWlmIChkb2N1bWVudC5hbGwpIHsKLQkJCQlpZiAoc2VsZWN0aW9uUmFuZ2UudGV4dCAhPSBudWxsKSB7Ci0JCQkJCXNlbGVjdGlvblJhbmdlLnBhc3RlSFRNTChodG1sKTsKLQkJCQkJc2V0U3RhdHVzKFNUQVRVU19FWEVDX0NNRCwgMSk7Ci0JCQkJCXNldFN0YXR1cyhTVEFUVVNfTU9ESUZJRUQsIG51bGwpOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgewotCQkJCXNlbGVjdGlvblJhbmdlLmRlbGV0ZUNvbnRlbnRzKCk7Ci0JCQkJdmFyIGRvY3VtZW50RnJhZ21lbnQgPSBzZWxlY3Rpb25SYW5nZS5jcmVhdGVDb250ZXh0dWFsRnJhZ21lbnQoaHRtbCk7Ci0JCQkJc2VsZWN0aW9uUmFuZ2UuaW5zZXJ0Tm9kZShkb2N1bWVudEZyYWdtZW50KTsKLQkJCQlzZXRTdGF0dXMoU1RBVFVTX0VYRUNfQ01ELCAxKTsKLQkJCQlzZXRTdGF0dXMoU1RBVFVTX01PRElGSUVELCBudWxsKTsKLQkJCX0KLQkJfQotCX0KLX0KLQotLy8gQWRkcyBhbiBpbWFnZS4KLWZ1bmN0aW9uIGFkZEltYWdlKHVybCwgaGVpZ2h0LCB3aWR0aCwgYWx0KSB7Ci0JaWYgKGludGVybmFsVXBkYXRlU2VsZWN0aW9uKCkpIHsKLQkJaWYgKGRvY3VtZW50LmFsbCkgewotCQkJaWYgKHVybCAhPSBudWxsICYmIHVybCAhPSAnJykgewotCQkJCWZvcm1hdFRleHQoJ2luc2VydGltYWdlJywgdXJsKTsKLQkJCX0KLQkJCWlmIChzZWxlY3Rpb24gIT0gbnVsbCAmJiBzZWxlY3Rpb24udHlwZSA9PSAnQ29udHJvbCcgJiYgc2VsZWN0aW9uUmFuZ2UgIT0gbnVsbCkgewotCQkJCWlmIChoZWlnaHQgIT0gbnVsbCAmJiBoZWlnaHQgIT0gJycpIHNlbGVjdGlvblJhbmdlLml0ZW0oKS5oZWlnaHQgPSBoZWlnaHQ7Ci0JCQkJaWYgKHdpZHRoICE9IG51bGwgJiYgd2lkdGggIT0gJycpIHNlbGVjdGlvblJhbmdlLml0ZW0oKS53aWR0aCA9IHdpZHRoOwotCQkJCWlmIChhbHQgIT0gbnVsbCkgc2VsZWN0aW9uUmFuZ2UuaXRlbSgpLmFsdCA9IGFsdDsJCQotCQkJfQotCQl9IGVsc2UgewotCQkJdmFyIFNUQVJUX01BUktFUiA9ICJBXy1fLV8iOwotCQkJdmFyIEVORF9NQVJLRVIgPSAiOi46LjoiOwotCQkJCS8vIG1hcmsgaW1nIGxpbmtzIHdpdGggU1RBUlRfTUFSS0VSICsgaWQgKyBFTkRfTUFSS0VSIGluIHRoZSBpZCwgZm9yIGxhdGVyIHJlY292ZXJ5Ci0JCQl2YXIgZWxlbWVudHMgPSBlZGl0b3JEb2MuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2ltZycpOwotCQkJZm9yICh2YXIgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykgewotCQkJCXZhciBlbGVtZW50ID0gZWxlbWVudHNbaV07Ci0JCQkJZWxlbWVudC5pZCA9IFNUQVJUX01BUktFUiArIGVsZW1lbnQuaWQgKyBFTkRfTUFSS0VSOwotCQkJfQotCQkJaWYgKHVybCAhPSBudWxsICYmIHVybCAhPSAnJykgewotCQkJCWZvcm1hdFRleHQoJ2luc2VydGltYWdlJywgdXJsKTsKLQkJCX0KLQkJCWlmIChpbnRlcm5hbFVwZGF0ZVNlbGVjdGlvbigpKSB7Ci0JCQkJdmFyIHJlZ0V4SUQgPSBuZXcgUmVnRXhwKFNUQVJUX01BUktFUiArICIoLio/KSIgKyBFTkRfTUFSS0VSKTsKLQkJCQl2YXIgZWxlbWVudHMgPSBlZGl0b3JEb2MuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2ltZycpOwotCQkJCWZvciAodmFyIGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHsKLQkJCQkJdmFyIGVsZW1lbnQgPSBlbGVtZW50c1tpXTsKLQkJCQkJdmFyIGlkID0gZWxlbWVudC5pZDsKLQkJCQkJaWYgKGlkICE9IG51bGwgJiYgaWQgIT0gJycpIHsKLQkJCQkJCVJlZ0V4cC5sYXN0SW5kZXg9MDsKLQkJCQkJCXZhciBtYXRjaEFycmF5ID0gaWQubWF0Y2gocmVnRXhJRCk7Ci0JCQkJCQlpZiAobWF0Y2hBcnJheSAhPSBudWxsICYmIG1hdGNoQXJyYXkubGVuZ3RoID4gMCkgewotCQkJCQkJCXZhciBuZXdJZCA9IG1hdGNoQXJyYXlbMV07Ci0JCQkJCQkJaWYgKG5ld0lkLmxlbmd0aCA+IDApIHsKLQkJCQkJCQkJZWxlbWVudC5pZCA9IG5ld0lkOwotCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCWVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKCdpZCcpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfSBlbHNlIHsKLQkJCQkJCS8vIG5vIGlkLCBtdXN0IGJlIHRoZSBuZXcgaW1nCi0JCQkJCQlpZiAoaGVpZ2h0ICE9IG51bGwgJiYgaGVpZ2h0ICE9ICcnKSBlbGVtZW50LmhlaWdodCA9IGhlaWdodDsKLQkJCQkJCWlmICh3aWR0aCAhPSBudWxsICYmIHdpZHRoICE9ICcnKSBlbGVtZW50LndpZHRoID0gd2lkdGg7Ci0JCQkJCQlpZiAoYWx0ICE9IG51bGwpIGVsZW1lbnQuYWx0ID0gYWx0OwkJCi0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJc2V0U3RhdHVzKFNUQVRVU19NT0RJRklFRCwgbnVsbCk7Ci0JfQotfQotCi0vLyBBZGRzIGEgaG9yaXpvbnRhbCBsaW5lLgotZnVuY3Rpb24gYWRkTGluZSgpIHsKLQlmb3JtYXRUZXh0KCdpbnNlcnRob3Jpem9udGFscnVsZScsIG51bGwpOwotfQotCi0vLyBBZGRzIGEgbGluay4KLWZ1bmN0aW9uIGFkZExpbmsodXJsKSB7Ci0JaWYgKCFyZWFkT25seSAmJiB1cmwgIT0gbnVsbCAmJiB1cmwgIT0gJycgJiYgaW50ZXJuYWxVcGRhdGVTZWxlY3Rpb24oKSkgewotCQlpZiAoZG9jdW1lbnQuYWxsKSB7Ci0JCQlpZiAoc2VsZWN0aW9uUmFuZ2UudGV4dCA9PSBudWxsIHx8IHNlbGVjdGlvblJhbmdlLnRleHQgPT0gJycpIHsKLQkJCQlzZWxlY3Rpb25SYW5nZS50ZXh0ID0gdXJsOwotCQkJCXNldFN0YXR1cyhTVEFUVVNfRVhFQ19DTUQsIDEpOwotCQkJCXNldFN0YXR1cyhTVEFUVVNfTU9ESUZJRUQsIG51bGwpOwotCQkJfQotCQkJZWxzZSBpZiAoc2VsZWN0aW9uUmFuZ2UuZXhlY0NvbW1hbmQoJ2NyZWF0ZWxpbmsnLCBmYWxzZSwgdXJsKSkgewotCQkJCXNldFN0YXR1cyhTVEFUVVNfRVhFQ19DTUQsIDEpOwotCQkJCXNldFN0YXR1cyhTVEFUVVNfTU9ESUZJRUQsIG51bGwpOwotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJaWYgKHNlbGVjdGlvbiA9PSBudWxsIHx8IHNlbGVjdGlvbiA9PSAiIikgewkJCi0JCQkJdmFyIHVybFRleHROb2RlID0gZWRpdG9yRG9jLmNyZWF0ZVRleHROb2RlKHVybCk7Ci0JCQkJaW5zZXJ0Tm9kZUF0U2VsZWN0aW9uKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGVkaXRvckZyYW1lSWQpLmNvbnRlbnRXaW5kb3csIHVybFRleHROb2RlKTsKLQkJCX0JCQkKLQkJCWlmIChlZGl0b3JEb2MuZXhlY0NvbW1hbmQoJ2NyZWF0ZWxpbmsnLCBmYWxzZSwgdXJsKSkgewotCQkJCXNldFN0YXR1cyhTVEFUVVNfRVhFQ19DTUQsIDEpOwotCQkJCXNldFN0YXR1cyhTVEFUVVNfTU9ESUZJRUQsIG51bGwpOwotCQkJfQotCQl9Ci0JfQotfQotCi0vLyBBZGRzIGFuIG9yZGVyZWQgbGlzdC4KLWZ1bmN0aW9uIGFkZE9yZGVyZWRMaXN0KCkgewotCWZvcm1hdFRleHQoJ2luc2VydG9yZGVyZWRsaXN0JywgbnVsbCk7Ci19Ci0KLS8vIEFkZHMgYSB0YWJsZS4KLWZ1bmN0aW9uIGFkZFRhYmxlKHJvd3MsIGNvbHMsIHdpZHRoLCBzdW1tYXJ5LCBjYXB0aW9uLCB0YWJsZWhlYWRlcnMpIHsKLQlpZiAocmVhZE9ubHkpIHJldHVybjsKLQlpZiAocm93cyA9PSAwKSByb3dzID0gMjsKLQlpZiAoY29scyA9PSAwKSBjb2xzID0gMjsKLQlpZiAod2lkdGggPT0gMCkgd2lkdGggPSAiODUlIjsKLQlpZiAoaW50ZXJuYWxVcGRhdGVTZWxlY3Rpb24oKSkgewotCQl2YXIgdGFibGUgPSBlZGl0b3JEb2MuY3JlYXRlRWxlbWVudCgidGFibGUiKTsKLQkJdGFibGUuY2VsbFBhZGRpbmcgPSAiMiI7Ci0JCXRhYmxlLmNlbGxTcGFjaW5nID0gIjAiOwotCQl0YWJsZS5ib3JkZXIgPSAiMSI7Ci0JCXRhYmxlLndpZHRoID0gd2lkdGg7Ci0JCXRhYmxlLnRpdGxlID0gIiI7Ci0JCWlmIChzdW1tYXJ5ICE9IG51bGwgJiYgc3VtbWFyeSAhPSAnJykgewotCQkJdGFibGUuc3VtbWFyeSA9IHN1bW1hcnk7Ci0JCX0KLQkJaWYgKGNhcHRpb24gIT0gbnVsbCAmJiBjYXB0aW9uICE9ICcnKSB7Ci0JCQl0YWJsZS50aXRsZSA9IGNhcHRpb247Ci0JCQl0YWJsZS5jcmVhdGVDYXB0aW9uKCk7Ci0JCQl2YXIgY2FwdGlvbk5vZGUgPSBlZGl0b3JEb2MuY3JlYXRlVGV4dE5vZGUoY2FwdGlvbik7Ci0JCQl0YWJsZS5jYXB0aW9uLmFwcGVuZENoaWxkKGNhcHRpb25Ob2RlKTsKLQkJfQotCQl0Ym9keSA9IGVkaXRvckRvYy5jcmVhdGVFbGVtZW50KCJ0Ym9keSIpOwotCQlmb3IgKHZhciBpID0gMDsgaSA8IHJvd3M7IGkrKykgewotCQkJdHIgPSBlZGl0b3JEb2MuY3JlYXRlRWxlbWVudCgidHIiKTsKLQkJCWZvciAodmFyIGogPSAwOyBqIDwgY29sczsgaisrKSB7Ci0JCQkJaWYgKGkgPT0gMCAmJiAodGFibGVoZWFkZXJzID09IFRBQkxFX0hFQURFUlNfQ09MUyB8fCB0YWJsZWhlYWRlcnMgPT0gVEFCTEVfSEVBREVSU19CT1RIKSkgewotCQkJCQl0aCA9IGVkaXRvckRvYy5jcmVhdGVFbGVtZW50KCJ0aCIpOwotCQkJCQl0aC5zY29wZSA9ICJjb2wiOwotCQkJCQl0aC5pZCA9ICIiOwotCQkJCQl0aC5hYmJyID0gdGguaWQ7Ci0JCQkJCXZhciBoZWFkZXJOb2RlID0gZWRpdG9yRG9jLmNyZWF0ZVRleHROb2RlKHRoLmlkKTsKLQkJCQkJdGguYXBwZW5kQ2hpbGQoaGVhZGVyTm9kZSk7Ci0JCQkJCWlmICghZG9jdW1lbnQuYWxsKSB7Ci0JCQkJCQliciA9IGVkaXRvckRvYy5jcmVhdGVFbGVtZW50KCJiciIpOwotCQkJCQkJdGguYXBwZW5kQ2hpbGQoYnIpOwotCQkJCQl9Ci0JCQkJCXRyLmFwcGVuZENoaWxkKHRoKTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAoaiA9PSAwICYmICh0YWJsZWhlYWRlcnMgPT0gVEFCTEVfSEVBREVSU19ST1dTIHx8IHRhYmxlaGVhZGVycyA9PSBUQUJMRV9IRUFERVJTX0JPVEgpKSB7Ci0JCQkJCXRoID0gZWRpdG9yRG9jLmNyZWF0ZUVsZW1lbnQoInRoIik7Ci0JCQkJCXRoLnNjb3BlID0gInJvdyI7Ci0JCQkJCXRoLmlkID0gIiI7Ci0JCQkJCXRoLmFiYnIgPSB0aC5pZDsKLQkJCQkJdmFyIGhlYWRlck5vZGUgPSBlZGl0b3JEb2MuY3JlYXRlVGV4dE5vZGUodGguaWQpOwotCQkJCQl0aC5hcHBlbmRDaGlsZChoZWFkZXJOb2RlKTsKLQkJCQkJaWYgKCFkb2N1bWVudC5hbGwpIHsKLQkJCQkJCWJyID0gZWRpdG9yRG9jLmNyZWF0ZUVsZW1lbnQoImJyIik7Ci0JCQkJCQl0aC5hcHBlbmRDaGlsZChicik7Ci0JCQkJCX0KLQkJCQkJdHIuYXBwZW5kQ2hpbGQodGgpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJdGQgPSBlZGl0b3JEb2MuY3JlYXRlRWxlbWVudCgidGQiKTsKLQkJCQkJaWYgKCFkb2N1bWVudC5hbGwpIHsKLQkJCQkJCWJyID0gZWRpdG9yRG9jLmNyZWF0ZUVsZW1lbnQoImJyIik7Ci0JCQkJCQl0ZC5hcHBlbmRDaGlsZChicik7Ci0JCQkJCX0KLQkJCQkJdHIuYXBwZW5kQ2hpbGQodGQpOwotCQkJCX0KLQkJCX0KLQkJCXRib2R5LmFwcGVuZENoaWxkKHRyKTsKLSAgICAJfQotCQl0YWJsZS5hcHBlbmRDaGlsZCh0Ym9keSk7Ci0JCWlmIChkb2N1bWVudC5hbGwpIHsKLQkJCXNlbGVjdGlvblJhbmdlLnBhcmVudEVsZW1lbnQoKS5hcHBlbmRDaGlsZCh0YWJsZSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlzZWxlY3Rpb25SYW5nZS5pbnNlcnROb2RlKHRhYmxlKTsKLQkJfQotCQlzZXRTdGF0dXMoU1RBVFVTX0VYRUNfQ01ELCAxKTsKLQkJc2V0U3RhdHVzKFNUQVRVU19NT0RJRklFRCwgbnVsbCk7CQkJCi0JfQotfQotCi0vLyBBZGRzIGFuIHVub3JkZXJlZCBsaXN0LgotZnVuY3Rpb24gYWRkVW5vcmRlcmVkTGlzdCgpIHsKLQlmb3JtYXRUZXh0KCdpbnNlcnR1bm9yZGVyZWRsaXN0JywgbnVsbCk7Ci19Ci0KLS8vIFNldHMgdGhlIGJhY2tncm91bmQgY29sb3Igb2YgdGhlIHNlbGVjdGVkIHRleHQuCi1mdW5jdGlvbiBiYWNrQ29sb3IoY29sb3IpIHsKLQlpZiAoY29sb3IgIT0gbnVsbCAmJiBjb2xvciAhPSAnJykgewotCQlmb3JtYXRUZXh0KCdiYWNrY29sb3InLCBjb2xvcik7Ci0JfQotfQotCi0vLyBUb2dnbGVzIHRoZSAnYm9sZCcgYXR0cmlidXRlIG9mIHRoZSBzZWxlY3RlZCB0ZXh0LgotZnVuY3Rpb24gYm9sZCgpIHsKLQlmb3JtYXRUZXh0KCdib2xkJywgbnVsbCk7Ci19Ci0KLS8vIENvcGllcyB0aGUgc2VsZWN0ZWQgdGV4dCB0byB0aGUgY2xpcGJvYXJkLgotZnVuY3Rpb24gY29weSgpIHsKLQlpZiAoaW50ZXJuYWxVcGRhdGVTZWxlY3Rpb24oKSkgewotCQlpZiAoZWRpdG9yRG9jLmV4ZWNDb21tYW5kKCdjb3B5JywgZmFsc2UsIG51bGwpKSB7Ci0JCQlzZXRTdGF0dXMoU1RBVFVTX0VYRUNfQ01ELCAxKTsKLQkJfQotCX0KLX0KLQotLy8gQ3V0cyB0aGUgc2VsZWN0ZWQgdGV4dCB0byB0aGUgY2xpcGJvYXJkLgotZnVuY3Rpb24gY3V0KCkgewotCWZvcm1hdFRleHQoJ2N1dCcsIG51bGwpOwotfQotCi0vLyBEZWxldGVzIHRoZSBzZWxlY3RlZCB0ZXh0LgotZnVuY3Rpb24gZGVsZXRlVGV4dCgpIHsKLQlmb3JtYXRUZXh0KCdkZWxldGUnLCBudWxsKTsKLX0KLQotLy8gRmluZHMgdGV4dC4KLWZ1bmN0aW9uIGZpbmRUZXh0KHRleHQsIGRpciwgb3B0aW9ucykgewotCWlmICh0ZXh0ID09IG51bGwgfHwgdGV4dCA9PSAiIikgewotCQlyZXR1cm47Ci0JfQotCWVsc2UgewotCQl0ZXh0ID0gZGVjb2RlU3RyaW5nKHRleHQpOwotCX0KLQkKLQlpZiAoaW50ZXJuYWxVcGRhdGVTZWxlY3Rpb24oKSkgewotCQlpZiAoZG9jdW1lbnQuYWxsKSB7Ci0JCQlzZWxlY3Rpb25SYW5nZS5jb2xsYXBzZShkaXIgPCAwKTsKLQkJCWlmIChzZWxlY3Rpb25SYW5nZS5maW5kVGV4dCh0ZXh0LCBkaXIsIG9wdGlvbnMpKSB7Ci0JCQkJc2VsZWN0aW9uUmFuZ2Uuc2Nyb2xsSW50b1ZpZXcoKTsKLQkJCQlzZWxlY3Rpb25SYW5nZS5zZWxlY3QoKTsKLQkJCQlzZWxlY3Rpb25SYW5nZS5jb2xsYXBzZShkaXIgPCAwKTsKLQkJCQlzZXRTdGF0dXMoU1RBVFVTX0VYRUNfQ01ELCAxKTsKLQkJCX0KLQkJfQotCQllbHNlIHsJCi0JCQkvLyBmaW5kKHRleHQsIGNhc2VTZW5zaXRpdmUsIGJhY2t3YXJkcywgd3JhcEFyb3VuZCwgd2hvbGVXb3JkLCBzZWFyY2hJbkZyYW1lcywgc2hvd0RpYWxvZykKLQkJCXZhciBjYXNlU2Vuc2l0aXZlID0gdHJ1ZTsKLQkJCXZhciBiYWNrd2FyZHMgPSBmYWxzZTsKLQkJCXZhciB3aG9sZVdvcmQgPSB0cnVlOwotCQkJaWYgKChvcHRpb25zICYgNCkgPT0gMCkgY2FzZVNlbnNpdGl2ZSA9IGZhbHNlOwotCQkJaWYgKGRpciA9PSAtMSkgYmFja3dhcmRzID0gdHJ1ZTsKLQkJCWlmICgob3B0aW9ucyAmIDIpID09IDApIHdob2xlV29yZCA9IGZhbHNlOwotCQkJaWYgKGNvbnRlbnRXaW5kb3cuZmluZCh0ZXh0LCBjYXNlU2Vuc2l0aXZlLCBiYWNrd2FyZHMsIGZhbHNlLCB3aG9sZVdvcmQsIGZhbHNlLCBmYWxzZSkpIHsKLQkJCQlzZXRTdGF0dXMoU1RBVFVTX0VYRUNfQ01ELCAxKTsKLQkJCX0KLQkJfQotCX0KLX0KLQotLy8gU2V0cyB0aGUgZm9yZWdyb3VuZCBjb2xvciBvZiB0aGUgc2VsZWN0ZWQgdGV4dC4KLWZ1bmN0aW9uIGZvcmVDb2xvcihjb2xvcikgewotCWlmIChjb2xvciAhPSBudWxsICYmIGNvbG9yICE9ICcnKSB7Ci0JCWZvcm1hdFRleHQoJ2ZvcmVjb2xvcicsIGNvbG9yKTsKLQl9Ci19Ci0KLS8vIEZvcm1hdHMgdGhlIHNlbGVjdGVkIHRleHQgdXNpbmcgdGhlIGdpdmVuIEhUTUwgaGVhZGluZyB0YWcuCi1mdW5jdGlvbiBmb3JtYXRCbG9jayh0YWcpIHsKLQlpZiAodGFnICE9IG51bGwgJiYgdGFnICE9ICcnKSB7Ci0JCWZvcm1hdFRleHQoJ2Zvcm1hdGJsb2NrJywgdGFnKTsKLQl9Ci19Ci0KLQotdmFyIElOREVOVEVEX0xJU1RfQkFEX0hUTUxfSUUgPSAiPC9saT4uKjxsaSBzdHlsZT1cImxpc3Qtc3R5bGU6IG5vbmVcIj4iOwotdmFyIElOREVOVEVEX0xJU1RfQkFEX0hUTUxfTU9aID0gIjwvbGk+Lio8bGkgc3R5bGU9XCJsaXN0LXN0eWxlLXR5cGU6IG5vbmU7IGxpc3Qtc3R5bGUtaW1hZ2U6IG5vbmU7IGxpc3Qtc3R5bGUtcG9zaXRpb246IG91dHNpZGU7XCI+IjsKLQotLy8gSW5kZW50cyB0aGUgc2VsZWN0ZWQgdGV4dC4KLWZ1bmN0aW9uIGluZGVudCgpIHsKLQlmb3JtYXRUZXh0KCdpbmRlbnQnLCBudWxsKTsKLQkvLyBmaXggZm9yIHN1Yi1saXN0cwotCXZhciBodG1sID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZWRpdG9ySWQpLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQuYm9keS5pbm5lckhUTUw7Ci0JaWYgKGRvY3VtZW50LmFsbCkgewotCQlodG1sID0gaHRtbC5yZXBsYWNlKElOREVOVEVEX0xJU1RfQkFEX0hUTUxfSUUsICIiKTsKLQl9IGVsc2UgewotCQkvLyBmaXJlZm94IHNvbWV0aW1lcyBwdXRzIHRoZSBzYW1lIGFzIElFLCBzb21ldGltZXMgbW9yZSBqdW5rCi0JCWh0bWwgPSBodG1sLnJlcGxhY2UoSU5ERU5URURfTElTVF9CQURfSFRNTF9JRSwgIiIpOwotCQlodG1sID0gaHRtbC5yZXBsYWNlKElOREVOVEVEX0xJU1RfQkFEX0hUTUxfTU9aLCAiIik7Ci0JfQotCXNldFRleHQoaHRtbCk7Ci19Ci0KLS8vIFRvZ2dsZXMgdGhlICdpdGFsaWMnIGF0dHJpYnV0ZSBvZiB0aGUgc2VsZWN0ZWQgdGV4dC4KLWZ1bmN0aW9uIGl0YWxpYygpIHsKLQlmb3JtYXRUZXh0KCdpdGFsaWMnLCBudWxsKTsKLX0KLQotLy8gQ2VudGVyIGp1c3RpZmllcyB0aGUgc2VsZWN0ZWQgdGV4dC4KLWZ1bmN0aW9uIGp1c3RpZnlDZW50ZXIoKSB7Ci0JZm9ybWF0VGV4dCgnanVzdGlmeWNlbnRlcicsIG51bGwpOwotfQotCi0vLyBGdWxseSBqdXN0aWZpZXMgdGhlIHNlbGVjdGVkIHRleHQuCi1mdW5jdGlvbiBqdXN0aWZ5RnVsbCgpIHsKLQlmb3JtYXRUZXh0KCdqdXN0aWZ5ZnVsbCcsIG51bGwpOwotfQotCi0vLyBMZWZ0IGp1c3RpZmllcyB0aGUgc2VsZWN0ZWQgdGV4dC4KLWZ1bmN0aW9uIGp1c3RpZnlMZWZ0KCkgewotCWZvcm1hdFRleHQoJ2p1c3RpZnlsZWZ0JywgbnVsbCk7Ci19Ci0KLS8vIFJpZ2h0IGp1c3RpZmllcyB0aGUgc2VsZWN0ZWQgdGV4dC4KLWZ1bmN0aW9uIGp1c3RpZnlSaWdodCgpIHsKLQlmb3JtYXRUZXh0KCdqdXN0aWZ5cmlnaHQnLCBudWxsKTsKLX0KLQotLy8gT3V0ZGVudHMgdGhlIHNlbGVjdGVkIHRleHQuCi1mdW5jdGlvbiBvdXRkZW50KCkgewotCWZvcm1hdFRleHQoJ291dGRlbnQnLCBudWxsKTsKLX0KLQotLy8gUGFzdGVzIHRleHQgZnJvbSB0aGUgY2xpcGJvYXJkLgotZnVuY3Rpb24gcGFzdGUoc291cmNlVVJMKSB7Ci0JaWYgKHNvdXJjZVVSTCA9PSBudWxsKSB7Ci0JCXNvdXJjZVVSTCA9ICIiOwotCX0KLQllbHNlIHsKLQkJc291cmNlVVJMID0gZGVjb2RlU3RyaW5nKHNvdXJjZVVSTCk7Ci0JfQotCWlmIChkb2N1bWVudC5hbGwpIHsKLQkJdmFyIFNUQVJUX01BUktFUiA9ICJBXy1fLV8iOwotCQl2YXIgRU5EX01BUktFUiA9ICI6LjouOiI7Ci0JCS8vIG1hcmsgaW1nIGFuZCA8YSAvPiBsaW5rcyB3aXRoIFNUQVJUX01BUktFUiArIHNyYy9ocmVmICsgRU5EX01BUktFUiBpbiB0aGUgaWQsIGZvciBsYXRlciByZWNvdmVyeQotCQl2YXIgZWxlbWVudHMgPSBlZGl0b3JEb2MuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2ltZycpOwotCQlmb3IgKHZhciBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQl2YXIgZWxlbWVudCA9IGVsZW1lbnRzW2ldOwotCQkJdmFyIGlkID0gZWxlbWVudC5pZDsKLQkJCWVsZW1lbnQuaWQgPSBTVEFSVF9NQVJLRVIgKyBlbGVtZW50LnNyYyArIEVORF9NQVJLRVIgKyBpZDsKLQkJfQotCQl2YXIgZWxlbWVudHMgPSBlZGl0b3JEb2MuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2EnKTsKLQkJZm9yICh2YXIgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykgewotCQkJdmFyIGVsZW1lbnQgPSBlbGVtZW50c1tpXTsKLQkJCXZhciBpZCA9IGVsZW1lbnQuaWQ7Ci0JCQllbGVtZW50LmlkID0gU1RBUlRfTUFSS0VSICsgZWxlbWVudC5ocmVmICsgRU5EX01BUktFUiArIGlkOwotCQl9Ci0KLQkJLy8gY2hhbmdlIHRoZSA8YmFzZT4gb2YgdGhlIGRvY3VtZW50Ci0JCXZhciBvbGRCYXNlSFJFRiA9IGVkaXRvckRvYy5nZXRFbGVtZW50c0J5VGFnTmFtZSgnYmFzZScpWzBdLmhyZWY7Ci0JCWVkaXRvckRvYy5nZXRFbGVtZW50c0J5VGFnTmFtZSgnYmFzZScpWzBdLmhyZWYgPSBzb3VyY2VVUkw7Ci0KLQkJZm9ybWF0VGV4dCgncGFzdGUnLCBudWxsKTsKLQkJCi0JCS8vIHJlc3RvcmUgPGJhc2U+Ci0JCWVkaXRvckRvYy5nZXRFbGVtZW50c0J5VGFnTmFtZSgnYmFzZScpWzBdLmhyZWYgPSBvbGRCYXNlSFJFRjsKLQl9Ci0JZWxzZSB7Ci0JCXNldFN0YXR1cyhTVEFUVVNfRVhFQ19DTUQsIDEpOwotCQlzZXRTdGF0dXMoU1RBVFVTX01PRElGSUVELCBudWxsKTsKLQl9Ci0JaWYgKGludGVybmFsVXBkYXRlU2VsZWN0aW9uKCkpIHsKLQkJdHJ5IHsKLQkJCXZhciByZWdFeFJlcyA9IG5ldyBSZWdFeHAoImZpbGVcOihbXj1dKykoL3Jlc291cmNlcy8pKC4rKSIsICJnIik7Ci0JCQl2YXIgcmVnRXhSZWYgPSBuZXcgUmVnRXhwKCIoLispKCMuKykiKTsKLQkJCXZhciByZWdFeCA9IG5ldyBSZWdFeHAoImZpbGVcOihbXj1dKykvKFteL10rKSIsICJnIik7CQotCQkJdmFyIHJlZ0V4SUQgPSBuZXcgUmVnRXhwKFNUQVJUX01BUktFUiArICIoLio/KSIgKyBFTkRfTUFSS0VSICsgIiguKj8pIik7Ci0JCQl2YXIgZWxlbWVudHMgPSBlZGl0b3JEb2MuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2ltZycpOwotCQkJZm9yICh2YXIgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykgewotCQkJCXZhciBlbGVtZW50ID0gZWxlbWVudHNbaV07Ci0JCQkJdmFyIGlkID0gZWxlbWVudC5pZDsKLQkJCQlpZiAoaWQgIT0gbnVsbCAmJiBpZCAhPSAnJykgewotCQkJCQlSZWdFeHAubGFzdEluZGV4PTA7Ci0JCQkJCXZhciBtYXRjaEFycmF5ID0gaWQubWF0Y2gocmVnRXhJRCk7Ci0JCQkJCWlmIChtYXRjaEFycmF5ICE9IG51bGwgJiYgbWF0Y2hBcnJheS5sZW5ndGggPiAxKSB7Ci0JCQkJCQllbGVtZW50LnNyYyA9IG1hdGNoQXJyYXlbMV07Ci0JCQkJCQlpZiAobWF0Y2hBcnJheS5sZW5ndGggPiAyICYmIG1hdGNoQXJyYXlbMl0ubGVuZ3RoID4gMCkgewotCQkJCQkJCWVsZW1lbnQuaWQgPSBtYXRjaEFycmF5WzJdOwotCQkJCQkJfQotCQkJCQkJZWxzZSB7Ci0JCQkJCQkJZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoJ2lkJyk7Ci0JCQkJCQl9Ci0JCQkJCQljb250aW51ZTsKLQkJCQkJfQotCQkJCX0KLQkJCQl2YXIgc3JjID0gZWxlbWVudC5zcmM7Ci0JCQkJaWYgKHNyYyAhPSBudWxsICYmIHNyYyAhPSAnJykgewotCQkJCQlpZiAoc3JjLmluZGV4T2YoJ2Fib3V0Oi4vcmVzb3VyY2VzJykgIT0gLTEpIHsKLQkJCQkJCS8vIGZpeCBmb3IgSUUgNyB3aGVuIHBhc3RpbmcgZnJvbSBhbm90aGVyIFJURQotCQkJCQkJLy8gSUU3IHJlc29sdmVzIHRoZXNlIGFzICJhYm91dDouL3Jlc291cmNlcy88ZmlsZT4iCi0JCQkJCQkvLyBzbyByZW1vdmUgdGhlICJhYm91dDouIgotCQkJCQkJc3JjID0gc3JjLnJlcGxhY2UoImFib3V0OiIsICIiKTsKLQkJCQkJfQotCQkJCQlpZiAoc3JjLmluZGV4T2YoJ2Fib3V0OnJlc291cmNlcycpICE9IC0xKSB7Ci0JCQkJCQkvLyBmaXggZm9yIElFIDcgd2hlbiBwYXN0aW5nIGZyb20gYW5vdGhlciBSVEUKLQkJCQkJCS8vIElFNyBzb21ldGltZXMgcmVzb2x2ZXMgdGhlc2UgYXMgImFib3V0OnJlc291cmNlcy88ZmlsZT4iCi0JCQkJCQkvLyBzbyByZW1vdmUgdGhlICJhYm91dDoiIGFuZCBwdXQgaW4gIi4vIgotCQkJCQkJc3JjID0gc3JjLnJlcGxhY2UoImFib3V0OiIsICIuLyIpOwotCQkJCQl9Ci0JCQkJCWlmIChzcmMuaW5kZXhPZigncmVzb3VyY2VzJykgIT0gLTEpIHsKLQkJCQkJCWVsZW1lbnQuc3JjID0gc3JjLnJlcGxhY2UocmVnRXhSZXMsICIuL3Jlc291cmNlcy8kMyIpOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJZWxlbWVudC5zcmMgPSBzcmMucmVwbGFjZShyZWdFeCwgIi4vcmVzb3VyY2VzLyQyIik7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQl2YXIgZWxlbWVudHMgPSBlZGl0b3JEb2MuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2EnKTsKLQkJCWZvciAodmFyIGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHsKLQkJCQl2YXIgZWxlbWVudCA9IGVsZW1lbnRzW2ldOwotCQkJCXZhciBpZCA9IGVsZW1lbnQuaWQ7Ci0JCQkJaWYgKGlkICE9IG51bGwgJiYgaWQgIT0gJycpIHsKLQkJCQkJUmVnRXhwLmxhc3RJbmRleD0wOwotCQkJCQl2YXIgbWF0Y2hBcnJheSA9IGlkLm1hdGNoKHJlZ0V4SUQpOwotCQkJCQlpZiAobWF0Y2hBcnJheSAhPSBudWxsICYmIG1hdGNoQXJyYXkubGVuZ3RoID4gMSkgewotCQkJCQkJZWxlbWVudC5ocmVmID0gbWF0Y2hBcnJheVsxXTsKLQkJCQkJCWlmIChtYXRjaEFycmF5Lmxlbmd0aCA+IDIgJiYgbWF0Y2hBcnJheVsyXS5sZW5ndGggPiAwKSB7Ci0JCQkJCQkJZWxlbWVudC5pZCA9IG1hdGNoQXJyYXlbMl07Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIHsKLQkJCQkJCQllbGVtZW50LnJlbW92ZUF0dHJpYnV0ZSgnaWQnKTsKLQkJCQkJCX0KLQkJCQkJCWNvbnRpbnVlOwotCQkJCQl9Ci0JCQkJfQotCQkJCXZhciBocmVmID0gZWxlbWVudC5ocmVmOwotCQkJCWlmIChocmVmICE9IG51bGwgJiYgaHJlZiAhPSAnJykgewotCQkJCQkvLyBmaXggc2VsZi1yZWZlcmVuY2luZyBocmVmcwotCQkJCQlpZiAoaHJlZi5pbmRleE9mKCcjJykgIT0gLTEpIHsKLQkJCQkJCVJlZ0V4cC5sYXN0SW5kZXg9MDsKLQkJCQkJCXZhciBtYXRjaEFycmF5ID0gaHJlZi5tYXRjaChyZWdFeFJlZik7Ci0JCQkJCQlpZiAobWF0Y2hBcnJheSAhPSBudWxsICYmIG1hdGNoQXJyYXkubGVuZ3RoID4gMikgewotCQkJCQkJCXZhciBocmVmRmlsZSA9IG1hdGNoQXJyYXlbMV07Ci0JCQkJCQkJdmFyIHJlZiA9IG1hdGNoQXJyYXlbMl07Ci0JCQkJCQkJaWYgKGhyZWZGaWxlID09IHNvdXJjZVVSTCkgewotCQkJCQkJCQllbGVtZW50LmhyZWYgPSByZWY7Ci0JCQkJCQkJCWNvbnRpbnVlOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCQkvLyBmaXggaHJlZnMgYWxyZWFkeSBpbiByZXNvdXJjZXMKLQkJCQkJaWYgKGhyZWYuaW5kZXhPZigncmVzb3VyY2VzJykgIT0gLTEpIHsKLQkJCQkJCWVsZW1lbnQuaHJlZiA9IGhyZWYucmVwbGFjZShyZWdFeFJlcywgIi4vcmVzb3VyY2VzLyQzIik7Ci0JCQkJCX0KLQkJCQkJLy8gZml4IGhyZWZzIG5vdCBpbiByZXNvdXJjZXMKLQkJCQkJZWxzZSB7Ci0JCQkJCQllbGVtZW50LmhyZWYgPSBocmVmLnJlcGxhY2UocmVnRXgsICIuL3Jlc291cmNlcy8kMiIpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWNhdGNoIChlKSB7Ci0JCX0KLQl9Ci19Ci0KLS8vIFJlZG8gdGhlIHByZXZpb3VzIGNvbW1hbmQuCi1mdW5jdGlvbiByZWRvKCkgewotCWZvcm1hdFRleHQoJ3JlZG8nLCBudWxsKTsKLX0KLQotLy8gUmVkbyB0aGUgcHJldmlvdXMgY29tbWFuZC4KLWZ1bmN0aW9uIHJlbW92ZUZvcm1hdCgpIHsKLQlmb3JtYXRUZXh0KCdyZW1vdmVmb3JtYXQnLCBudWxsKTsKLX0KLQotCi0KLWZ1bmN0aW9uIF9yZXBsYWNlQWxsVGV4dChmaW5kVGV4dCwgcmVwbGFjZVRleHQsIG9wdGlvbnMpIHsKLQkvLyB0aGlzIGlzIElFIG9ubHkKLQlpZiAoZG9jdW1lbnQuYWxsKSB7Ci0JCXZhciB0ZW1wUmFuZ2UgPSAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZWRpdG9ySWQpLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQuYm9keS5jcmVhdGVUZXh0UmFuZ2UoKTsKLQkJdGVtcFJhbmdlLm1vdmVTdGFydCgnY2hhcmFjdGVyJywgLTEwMDAwMDAwMDAwKTsKLQkJZG8gewotCQkJdGVtcFJhbmdlLmNvbGxhcHNlKCk7Ci0JCQlpZiAodGVtcFJhbmdlLmZpbmRUZXh0KGZpbmRUZXh0LCAxMDAwMDAwMDAwMCwgb3B0aW9ucykpIHsKLQkJCQl0ZW1wUmFuZ2UudGV4dCA9IHJlcGxhY2VUZXh0OwotCQkJCXRlbXBSYW5nZS5zZWxlY3QoKTsKLQkJCX0gZWxzZSB7CQkKLQkJCQlicmVhazsKLQkJCX0KLQkJfSB3aGlsZSAodHJ1ZSk7Ci0JfQotfQotCi0vLyBSZXBsYWNlcyBhbGwgdGV4dC4KLWZ1bmN0aW9uIHJlcGxhY2VBbGxUZXh0KGZpbmRUZXh0LCByZXBsYWNlVGV4dCwgb3B0aW9ucykgewotCWlmIChyZWFkT25seSB8fCBmaW5kVGV4dCA9PSBudWxsIHx8IGZpbmRUZXh0ID09ICIiKSB7Ci0JCXJldHVybjsKLQl9Ci0JZWxzZSB7Ci0JCWZpbmRUZXh0ID0gZGVjb2RlU3RyaW5nKGZpbmRUZXh0KTsKLQl9Ci0JaWYgKHJlcGxhY2VUZXh0ID09IG51bGwpIHsKLQkJcmVwbGFjZVRleHQgPSAiIjsKLQl9Ci0JZWxzZSB7Ci0JCXJlcGxhY2VUZXh0ID0gZGVjb2RlU3RyaW5nKHJlcGxhY2VUZXh0KTsKLQl9Ci0JCi0JaWYgKGRvY3VtZW50LmFsbCkgewotCQkvLyBUT0RPOiBNb3ZlIHRoZSBpbnNlcnRpb24gcG9pbnQgdG8gdGhlIHN0YXJ0IG9mIHRoZSBIVE1MCi0JCS8vIGFuZCBwZXJmb3JtIGEgc2VhcmNoIGFuZCByZXBsYWNlIGluIHRoZSBmb3J3YXJkIGRpcmVjdGlvbi4gCi0JCV9yZXBsYWNlQWxsVGV4dChmaW5kVGV4dCwgcmVwbGFjZVRleHQsIG9wdGlvbnMpOwotCX0KLQllbHNlIHsKLQkJLy8gVE9ETzogRW11bGF0ZSB0aGUgSUUgaW1wbGVtZW50YXRpb24uCi0JCXZhciBodG1sID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZWRpdG9ySWQpLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQuYm9keS5pbm5lckhUTUw7Ci0JCXZhciBvcHRpb25TdHIgPSAiL2ciOwotCQlpZiAoKG9wdGlvbnMgJiA0KSA9PSAwKSB7Ci0JCQlvcHRpb25TdHIgKz0gImkiOwotCQl9Ci0JCXZhciByZWdFeHAgPSBldmFsKCIvIiArIGZpbmRUZXh0ICsgb3B0aW9uU3RyKTsKLQkJaHRtbCA9IGh0bWwucmVwbGFjZShyZWdFeHAsIHJlcGxhY2VUZXh0KTsKLQkJc2V0VGV4dChodG1sKTsKLQl9Ci0JCi0Jc2V0U3RhdHVzKFNUQVRVU19FWEVDX0NNRCwgMSk7Ci0Jc2V0U3RhdHVzKFNUQVRVU19NT0RJRklFRCwgbnVsbCk7Ci19Ci0KLS8vIFJlcGxhY2VzIHRleHQuCi1mdW5jdGlvbiByZXBsYWNlVGV4dChyZXBsYWNlVGV4dCwgZGlyLCBvcHRpb25zKSB7Ci0JaWYgKHJlYWRPbmx5IHx8ICFpbnRlcm5hbFVwZGF0ZVNlbGVjdGlvbigpKSB7Ci0JCXJldHVybjsKLQl9Ci0JaWYgKHJlcGxhY2VUZXh0ID09IG51bGwpIHsKLQkJcmVwbGFjZVRleHQgPSAiIjsKLQl9Ci0JZWxzZSB7Ci0JCXJlcGxhY2VUZXh0ID0gZGVjb2RlU3RyaW5nKHJlcGxhY2VUZXh0KTsKLQl9Ci0JaWYgKGRvY3VtZW50LmFsbCkgewotCQlzZWxlY3Rpb25SYW5nZS50ZXh0ID0gcmVwbGFjZVRleHQ7Ci0JCWlmIChyZXBsYWNlVGV4dCAhPSAiIikgewotCQkJc2VsZWN0aW9uUmFuZ2UubW92ZVN0YXJ0KCJ3b3JkIiwgLTEpOwotCQkJc2VsZWN0aW9uUmFuZ2Uuc2VsZWN0KCk7Ci0JCQlzZWxlY3Rpb25SYW5nZS5jb2xsYXBzZShkaXIgPCAwKTsKLQkJfQotCX0KLQllbHNlIHsKLQkJc2VsZWN0aW9uUmFuZ2UuZGVsZXRlQ29udGVudHMoKTsKLQkJc2VsZWN0aW9uUmFuZ2UuaW5zZXJ0Tm9kZShlZGl0b3JEb2MuY3JlYXRlVGV4dE5vZGUocmVwbGFjZVRleHQpKTsKLQl9Ci0Jc2V0U3RhdHVzKFNUQVRVU19FWEVDX0NNRCwgMSk7Ci0Jc2V0U3RhdHVzKFNUQVRVU19NT0RJRklFRCwgbnVsbCk7Ci19Ci0KLS8vIFNlbGVjdHMgYWxsIHRleHQuCi1mdW5jdGlvbiBzZWxlY3RBbGwoKSB7Ci0JaWYgKGludGVybmFsVXBkYXRlU2VsZWN0aW9uKCkpIHsKLQkJaWYgKGVkaXRvckRvYy5leGVjQ29tbWFuZCgnc2VsZWN0YWxsJywgZmFsc2UsIG51bGwpKSB7Ci0JCQlzZXRTdGF0dXMoU1RBVFVTX0VYRUNfQ01ELCAxKTsKLQkJfQotCX0KLX0KLQotLy8gU2V0cyB0aGUgZm9udCBuYW1lIGZvciB0aGUgc2VsZWN0ZWQgdGV4dC4KLWZ1bmN0aW9uIHNldEZvbnROYW1lKG5hbWUpIHsKLQlpZiAoaW50ZXJuYWxVcGRhdGVTZWxlY3Rpb24oKSkgewotCQlpZiAobmFtZSAhPSBudWxsKSB7Ci0JCQlpZiAobmFtZSA9PSAnJykgewotCQkJCWZvcm1hdFRleHQoJ3JlbW92ZUZvcm1hdCcpOwotCQkJfSBlbHNlIHsKLQkJCQlmb3JtYXRUZXh0KCdmb250bmFtZScsIG5hbWUpOwotCQkJfQotCQl9Ci0JfQotfQotCi0vLyBTZXRzIHRoZSBmb250IHNpemUgZm9yIHRoZSBzZWxlY3RlZCB0ZXh0LgotZnVuY3Rpb24gc2V0Rm9udFNpemUoc2l6ZSkgewotCWlmIChpbnRlcm5hbFVwZGF0ZVNlbGVjdGlvbigpKSB7Ci0JCWlmIChzaXplICE9IG51bGwpIHsKLQkJCWlmIChzaXplID09ICcnKSB7Ci0JCQkJZm9ybWF0VGV4dCgncmVtb3ZlRm9ybWF0Jyk7Ci0JCQl9IGVsc2UgewotCQkJCWZvcm1hdFRleHQoJ2ZvbnRzaXplJywgc2l6ZSk7Ci0JCQl9Ci0JCX0KLQl9Ci19Ci0KLS8vIFNldHMgdGhlIGZvbnQgc3R5bGUgZm9yIHRoZSBzZWxlY3RlZCB0ZXh0LgotZnVuY3Rpb24gc2V0Rm9udFN0eWxlKHN0eWxlKSB7IAotCWlmICghcmVhZE9ubHkgJiYgc3R5bGUgIT0gbnVsbCAmJiBzdHlsZSAhPSAnJyAmJiBpbnRlcm5hbFVwZGF0ZVNlbGVjdGlvbigpKSB7Ci0JCXRyeSB7Ci0JCQlpZiAoZG9jdW1lbnQuYWxsKSB7Ci0JCQkJc2VsZWN0aW9uUmFuZ2UuZXhlY0NvbW1hbmQoInJlbW92ZWZvcm1hdCIpOwotCQkJCXNlbGVjdGlvblJhbmdlLnBhcmVudEVsZW1lbnQoKS5yZW1vdmVBdHRyaWJ1dGUoImNsYXNzTmFtZSIpOwotCQkJfQotCQl9Ci0JCWNhdGNoIChlKSB7Ci0JCX0KLQkJaWYgKHN0eWxlID09ICI8cXVvdGU+IikgewotCQkJZm9ybWF0VGV4dCgnZm9ybWF0YmxvY2snLCAnPHA+Jyk7Ci0JCQlpZiAoZG9jdW1lbnQuYWxsKSB7Ci0JCQkJc2VsZWN0aW9uUmFuZ2UucGFyZW50RWxlbWVudCgpLmNsYXNzTmFtZSA9ICJxdW90ZSI7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlzZWxlY3Rpb24uZm9jdXNOb2RlLnBhcmVudE5vZGUuY2xhc3NOYW1lID0gInF1b3RlIjsKLQkJCX0KLQkJfQotCQllbHNlIGlmIChzdHlsZSA9PSAiPGNvZGU+IikgewotCQkJZm9ybWF0VGV4dCgnZm9ybWF0YmxvY2snLCAnPHA+Jyk7Ci0JCQlpZiAoZG9jdW1lbnQuYWxsKSB7Ci0JCQkJc2VsZWN0aW9uUmFuZ2UucGFyZW50RWxlbWVudCgpLmNsYXNzTmFtZSA9ICJjb2RlU2FtcGxlIjsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXNlbGVjdGlvbi5mb2N1c05vZGUucGFyZW50Tm9kZS5jbGFzc05hbWUgPSAiY29kZVNhbXBsZSI7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpZiAoIWRvY3VtZW50LmFsbCAmJiBzdHlsZSA9PSAiPHA+IikgewotCQkJCS8vIEEgaGFjayB0byBnZXQgcmlkIG9mIHRoZSAiY2xhc3NOYW1lIiBhdHRyaWJ1dGUgaW4gTW96aWxsYS9GaXJlZm94LgotCQkJCWZvcm1hdFRleHQoJ2Zvcm1hdGJsb2NrJywgJzxoND4nKTsKLQkJCX0KLQkJCWZvcm1hdFRleHQoJ2Zvcm1hdGJsb2NrJywgc3R5bGUpOwotCQl9Ci0JfQotfQotCi0vLyBTZXRzIHdoZXRoZXIgdGhlIGNvbnRlbnQgY2FuIGJlIGVkaXRlZC4KLWZ1bmN0aW9uIHNldEVkaXRhYmxlKGVkaXRhYmxlKSB7Ci0JdmFyIGRvYyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGVkaXRvcklkKS5jb250ZW50V2luZG93LmRvY3VtZW50OwotICAgIGlmIChlZGl0YWJsZSAhPSBudWxsICYmIGVkaXRhYmxlID09ICd0cnVlJykgewotCQlpZiAoZG9jdW1lbnQuYWxsKSB7Ci0JCQlkb2MuYm9keS5jb250ZW50RWRpdGFibGUgPSAidHJ1ZSI7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlkb2MuZGVzaWduTW9kZSA9ICJvbiI7Ci0JCX0KLQkJcmVhZE9ubHkgPSBmYWxzZTsKLQl9Ci0JZWxzZSB7Ci0JCWlmIChkb2N1bWVudC5hbGwpIHsJCQotCQkJZG9jLmJvZHkuY29udGVudEVkaXRhYmxlID0gImZhbHNlIjsKLQkJfQotCQllbHNlIHsKLQkJCWRvYy5kZXNpZ25Nb2RlID0gIm9mZiI7Ci0JCX0KLQkJcmVhZE9ubHkgPSB0cnVlOwotCX0KLQlzZXRTdGF0dXMoU1RBVFVTX0VYRUNfQ01ELCAxKTsJCi19Ci0KLS8vIFRvZ2dsZXMgdGhlICdzdHJpa2UtdGhyb3VnaCcgYXR0cmlidXRlIG9mIHRoZSBzZWxlY3RlZCB0ZXh0LgotZnVuY3Rpb24gc3RyaWtlVGhyb3VnaCgpIHsKLQlmb3JtYXRUZXh0KCdzdHJpa2V0aHJvdWdoJywgc2l6ZSk7Ci19Ci0KLS8vIFRvZ2dsZXMgdGhlICdzdWJzY3JpcHQnIGF0dHJpYnV0ZSBvZiB0aGUgc2VsZWN0ZWQgdGV4dC4KLWZ1bmN0aW9uIHN1YnNjcmlwdCgpIHsKLQlmb3JtYXRUZXh0KCdzdWJzY3JpcHQnLCBudWxsKTsKLX0KLQotLy8gVG9nZ2xlcyB0aGUgJ3N1cGVyc2NyaXB0JyBhdHRyaWJ1dGUgb2YgdGhlIHNlbGVjdGVkIHRleHQuCi1mdW5jdGlvbiBzdXBlcnNjcmlwdCgpIHsKLQlmb3JtYXRUZXh0KCdzdXBlcnNjcmlwdCcsIG51bGwpOwotfQotCi0vLyBUb2dnbGVzIHRoZSAndW5kZXJsaW5lJyBhdHRyaWJ1dGUgb2YgdGhlIHNlbGVjdGVkIHRleHQuCi1mdW5jdGlvbiB1bmRlcmxpbmUoKSB7Ci0JZm9ybWF0VGV4dCgndW5kZXJsaW5lJywgbnVsbCk7Ci19Ci0KLS8vIENvbnZlcnRzIGEgbGluayB0byBub3JtYWwgdGV4dC4KLWZ1bmN0aW9uIHVubGluaygpIHsKLQlmb3JtYXRUZXh0KCd1bmxpbmsnLCBudWxsKTsKLX0KLQotZnVuY3Rpb24gT2JqVG9TdHJpbmcob2JqZWN0KSB7Ci0JdmFyIHJldCA9ICJPYmplY3QgIiArIG9iamVjdC5uYW1lICsgIiBpcyBbXG4iOwotCWZvciAodmFyIHByb3AgaW4gb2JqZWN0KSB7Ci0JCXJldCArPSAiICAiICsgcHJvcCArICIgaXMgIiArIG9iamVjdFtwcm9wXSArICI7XG4iOwotCX0KLQlyZXR1cm4gcmV0ICsgIl0iOwotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3J0ZS9ydGUueHNsIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3J0ZS9ydGUueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ODkxNGZjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9ydGUvcnRlLnhzbAorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLQotPHhzbDpzdHlsZXNoZWV0IHZlcnNpb249IjEuMCIKLQl4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIKLQl4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIj4KLQotPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iL3J0ZSI+Ci0JPHhzbDp2YXJpYWJsZSBuYW1lPSJydGVfaWQiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAaWQiLz48L3hzbDp2YXJpYWJsZT4KLQk8eHNsOnZhcmlhYmxlIG5hbWU9InJ0ZV9qcyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBqcyIvPjwveHNsOnZhcmlhYmxlPgotCTxodG1sPgotCQk8aGVhZD4KLQkJCTxzY3JpcHQgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ7JHJ0ZV9qc30iPjwvc2NyaXB0PgotCQk8L2hlYWQ+Ci0JCTxib2R5IGxlZnRNYXJnaW49IjAiIHRvcE1hcmdpbj0iMCIgbWFyZ2luaGVpZ2h0PSIwIiBtYXJnaW53aWR0aD0iMCIgc2Nyb2xsPSJubyIgc3R5bGU9Im92ZXJmbG93OiBoaWRkZW4iPgotCQkJPGlmcmFtZSBpZD0ieyRydGVfaWR9IiBuYW1lPSJ7JHJ0ZV9pZH0iIHN0eWxlPSJib3JkZXI6IG5vbmU7IiBmcmFtZWJvcmRlcj0iMCIgc2Nyb2xsaW5nPSJhdXRvIiB3aWR0aD0iMTAwJSIgaGVpZ2h0PSIxMDAlIj48L2lmcmFtZT4KLQkJCTxzY3JpcHQgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0JCQkJaW5pdEVkaXRvcignPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBpZCIvPicsICc8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGNzcyIvPicsICc8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGJhc2VVUkwiLz4nKTsKLQkJCTwvc2NyaXB0PgotCQk8L2JvZHk+Ci0JPC9odG1sPgotPC94c2w6dGVtcGxhdGU+Ci0KLTwveHNsOnN0eWxlc2hlZXQ+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9JUmljaFRleHQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L0lSaWNoVGV4dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYmZmNjQ0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L0lSaWNoVGV4dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzU1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dDsKLQotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuYWN0aW9ucy5GaW5kUmVwbGFjZUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkRpc3Bvc2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkhlbHBMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLktleUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLQotLyoqCi0gKiBUaGUgaW50ZXJmYWNlIGZvciBhIHJpY2ggdGV4dCBjb250cm9sLgotICogPHA+Ci0gKiBBIHJpY2ggdGV4dCBjb250cm9sIGlzIGFuIGVkaXRhYmxlIHVzZXIgaW50ZXJmYWNlIG9iamVjdCB0aGF0IGRpc3BsYXlzIHJpY2gKLSAqIHRleHQgYW5kIGltYWdlcy4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAYXV0aG9yIEplZmYgSGFyZHkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJUmljaFRleHQgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfTkFNRSA9ICJyaWNoVGV4dCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFJldHVybnMgdGhpcyByaWNoIHRleHQgY29udHJvbC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoaXMgcmljaCB0ZXh0IGNvbnRyb2wKLQkgKi8KLQlwdWJsaWMgQ29udHJvbCBnZXRDb250cm9sKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBsYXlvdXQgZGF0YS4KLQkgKiAKLQkgKiBAcGFyYW0gbGF5b3V0RGF0YQotCSAqICAgICAgICAgICAgdGhlIGxheW91dCBkYXRhIHRvIHNldAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExheW91dERhdGEoT2JqZWN0IGxheW91dERhdGEpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbGF5b3V0IGRhdGEuCi0JICogCi0JICogQHJldHVybiB0aGlzIGNvbnRyb2wncyBsYXlvdXQgZGF0YQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0TGF5b3V0RGF0YSgpOwotCi0JLyoqCi0JICogU2V0cyBmb2N1cyB0byB0aGlzIGNvbnRyb2wuCi0JICovCi0JcHVibGljIHZvaWQgc2V0Rm9jdXMoKTsKLQotCS8qKgotCSAqIFRlbGxzIHRoZSBjb250cm9sIGl0IGRvZXMgbm90IGhhdmUgZm9jdXMuCi0JICovCi0JcHVibGljIHZvaWQgc2V0Qmx1cigpOwotCi0JLyoqCi0JICogQ2hlY2tzIHdoZXRoZXIgdGhpcyBjb250cm9sIGhhcyBmb2N1cy4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgY29udHJvbCBoYXMgdGhlIHVzZXItaW50ZXJmYWNlIGZvY3VzCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzRm9jdXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGJhc2UgcGF0aCB1c2VkIGZvciByZXNvbHZpbmcgdGV4dCBhbmQgaW1hZ2UgbGlua3MuCi0JICogCi0JICogQHJldHVybiB0aGUgYmFzZSBwYXRoIHVzZWQgZm9yIHJlc29sdmluZyBsaW5rcyBpbiB0aGlzIGNvbnRyb2wKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEJhc2VQYXRoKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBlZGl0YWJsZSBzdGF0ZS4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBjb250ZW50IGlzIGVkaWF0YmxlCi0JICovCi0JcHVibGljIGJvb2xlYW4gZ2V0RWRpdGFibGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIGVkaXRhYmxlIHN0YXRlLgotCSAqIAotCSAqIEBwYXJhbSBlZGl0YWJsZQotCSAqICAgICAgICAgICAgdGhlIGVkaXRhYmxlIHN0YXRlCi0JICovCi0JcHVibGljIHZvaWQgc2V0RWRpdGFibGUoYm9vbGVhbiBlZGl0YWJsZSk7Ci0KLQkvKioKLQkgKiBDaGVja3Mgd2hldGhlciB0aGUgY29udGVudCBoYXMgYmVlbiBtb2RpZmllZC4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBjb250ZW50IGhhcyBiZWVuIG1vZGlmaWVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZ2V0TW9kaWZpZWQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIG1vZGlmaWVkIHN0YXRlLgotCSAqIAotCSAqIEBwYXJhbSBtb2RpZmllZAotCSAqICAgICAgICAgICAgdGhlIG1vZGlmaWVkIHN0YXRlCi0JICovCi0JcHVibGljIHZvaWQgc2V0TW9kaWZpZWQoYm9vbGVhbiBtb2RpZmllZCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByaWNoIHRleHQgY29udGVudC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSByaWNoIHRleHQgY29udGVudCBmb3JtYXR0ZWQgaW4gYSBtYXJrdXAgbGFuZ3VhZ2UKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHJpY2ggdGV4dCBjb250ZW50LgotCSAqIAotCSAqIEBwYXJhbSB0ZXh0Ci0JICogICAgICAgICAgICB0aGUgcmljaCB0ZXh0IGNvbnRlbnQgZm9ybWF0dGVkIGluIGEgbWFya3VwIGxhbmd1YWdlCi0JICovCi0JcHVibGljIHZvaWQgc2V0VGV4dChTdHJpbmcgdGV4dCk7Ci0KLQkvKioKLQkgKiBSZXN0b3JlcyB0aGUgcmljaCB0ZXh0IGNvbnRlbnQgYmFjayB0byB0aGUgaW5pdGlhbCB2YWx1ZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZXN0b3JlVGV4dCgpOwotCi0JLyoqCi0JICogQ2hlY2tzIHdoZXRoZXIgdGhlIGVkaXRvciBjb250ZW50IGhhcyBiZWVuIG1vZGlmaWVkLiBJZiBpdCBoYXMgYmVlbgotCSAqIG1vZGlmaWVkLCBub3RpZnkgdGhlIG1vZGlmeSBsaXN0ZW5lcnMuCi0JICovCi0JcHVibGljIHZvaWQgY2hlY2tNb2RpZnkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYW4gb2JqZWN0IHRoYXQgZGVzY3JpYmVzIHRoZSBjdXJyZW50IHNlbGVjdGlvbgotCSAqIAotCSAqIEByZXR1cm4gYSA8Y29kZT5SaWNoVGV4dFNlbGVjdGlvbjwvY29kZT4gb2JqZWN0Ci0JICovCi0JcHVibGljIFJpY2hUZXh0U2VsZWN0aW9uIGdldFNlbGVjdGVkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFuIGFwcGxpY2F0aW9uIHNwZWNpZmljIHByb3BlcnR5IHZhbHVlLgotCSAqIAotCSAqIEBwYXJhbSBrZXkKLQkgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eQotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eSBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBpdCBoYXMgbm90Ci0JICogICAgICAgICBiZWVuIHNldAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0RGF0YShTdHJpbmcga2V5KTsKLQotCS8qKgotCSAqIFNldHMgYW4gYXBwbGljYXRpb24gc3BlY2lmaWMgcHJvcGVydHkgbmFtZSBhbmQgdmFsdWUuCi0JICogCi0JICogQHBhcmFtIGtleQotCSAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5Ci0JICogQHBhcmFtIHZhbHVlCi0JICogICAgICAgICAgICB0aGUgcHJvcGVydHkgdmFsdWUKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREYXRhKFN0cmluZyBrZXksIE9iamVjdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBFeGVjdXRlcyB0aGUgZ2l2ZW4gcmljaCB0ZXh0IGNvbW1hbmQuIFRoZSBzdXBwb3J0ZWQgY29tbWFuZCBzdHJpbmdzIGFyZQotCSAqIGRlZmluZWQgaW4gPGNvZGU+UmljaFRleHRDb21tYW5kPGNvZGU+LgotCSAqIAotCSAqIEBwYXJhbQljb21tYW5kCQlhIHJpY2ggdGV4dCBjb21tYW5kIHN0cmluZwotCSAqIEByZXR1cm4JYSBzdGF0dXMgY29kZSByZXR1cm5lZCBieSB0aGUgZXhlY3V0ZWQgY29tbWFuZAotCSAqLwotCXB1YmxpYyBpbnQgZXhlY3V0ZUNvbW1hbmQoU3RyaW5nIGNvbW1hbmQpOwotCi0JLyoqCi0JICogRXhlY3V0ZXMgdGhlIGdpdmVuIHJpY2ggdGV4dCBjb21tYW5kIHdpdGggYSBzaW5nbGUgcGFyYW1ldGVyLiBUaGUKLQkgKiBzdXBwb3J0ZWQgY29tbWFuZCBzdHJpbmdzIGFyZSBkZWZpbmVkIGluIDxjb2RlPlJpY2hUZXh0Q29tbWFuZDxjb2RlPi4KLQkgKiAKLQkgKiBAcGFyYW0JY29tbWFuZAkJYSByaWNoIHRleHQgY29tbWFuZCBzdHJpbmcKLQkgKiBAcGFyYW0JcGFyYW0JCWEgcGFyYW1ldGVyIGZvciB0aGUgY29tbWFuZCBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqIEByZXR1cm4JYSBzdGF0dXMgY29kZSByZXR1cm5lZCBieSB0aGUgZXhlY3V0ZWQgY29tbWFuZAotCSAqLwotCXB1YmxpYyBpbnQgZXhlY3V0ZUNvbW1hbmQoU3RyaW5nIGNvbW1hbmQsIFN0cmluZyBwYXJhbSk7Ci0KLQkvKioKLQkgKiBFeGVjdXRlcyB0aGUgZ2l2ZW4gcmljaCB0ZXh0IGNvbW1hbmQgd2l0aCBhbiBhcnJheSBvZiBwYXJhbWV0ZXJzLiBUaGUKLQkgKiBzdXBwb3J0ZWQgY29tbWFuZCBzdHJpbmdzIGFyZSBkZWZpbmVkIGluIDxjb2RlPlJpY2hUZXh0Q29tbWFuZDxjb2RlPi4KLQkgKiAKLQkgKiBAcGFyYW0JY29tbWFuZAkJYSByaWNoIHRleHQgY29tbWFuZCBzdHJpbmcKLQkgKiBAcGFyYW0JcGFyYW1zCQlhbiBhcnJheSBvZiBwYXJhbWV0ZXJzIGZvciB0aGUgY29tbWFuZCBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqIEByZXR1cm4JYSBzdGF0dXMgY29kZSByZXR1cm5lZCBieSB0aGUgZXhlY3V0ZWQgY29tbWFuZAotCSAqLwotCXB1YmxpYyBpbnQgZXhlY3V0ZUNvbW1hbmQoU3RyaW5nIGNvbW1hbmQsIFN0cmluZ1tdIHBhcmFtcyk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtb2RpZnkgbGlzdGVuZXJzIGF0dGFjaGVkIHRvIHRoaXMgY29udHJvbC4KLQkgKiAKLQkgKiBAcmV0dXJuIGFuIGl0ZXJhdG9yIGZvciByZXRyaWV2aW5nIHRoZSBtb2RpZnkgbGlzdGVuZXJzCi0JICovCi0JcHVibGljIEl0ZXJhdG9yPE1vZGlmeUxpc3RlbmVyPiBnZXRNb2RpZnlMaXN0ZW5lcnMoKTsKLQotCS8qKgotCSAqIEFkZHMgYSBsaXN0ZW5lciB0byB0aGUgY29sbGVjdGlvbiBvZiBsaXN0ZW5lcnMgd2hvIHdpbGwgYmUgbm90aWZpZWQgd2hlbgotCSAqIGtleXMgYXJlIHByZXNzZWQgYW5kIHJlbGVhc2VkIHdpdGhpbiB0aGlzIGNvbnRyb2wuCi0JICogCi0JICogQHBhcmFtIGxpc3RlbmVyCi0JICogICAgICAgICAgICB0aGUgbGlzdGVuZXIgd2hpY2ggc2hvdWxkIGJlIG5vdGlmaWVkCi0JICovCi0JcHVibGljIHZvaWQgYWRkS2V5TGlzdGVuZXIoS2V5TGlzdGVuZXIgbGlzdGVuZXIpOwotCi0JLyoqCi0JICogUmVtb3ZlcyBhIGxpc3RlbmVyIGZyb20gdGhlIGNvbGxlY3Rpb24gb2YgbGlzdGVuZXJzIHdobyB3aWxsIGJlIG5vdGlmaWVkCi0JICogd2hlbiBrZXlzIGFyZSBwcmVzc2VkIGFuZCByZWxlYXNlZCB3aXRoaW4gdGhpcyBjb250cm9sLgotCSAqIAotCSAqIEBwYXJhbSBsaXN0ZW5lcgotCSAqICAgICAgICAgICAgdGhlIGxpc3RlbmVyIHdoaWNoIHNob3VsZCBubyBsb25nZXIgYmUgbm90aWZpZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVLZXlMaXN0ZW5lcihLZXlMaXN0ZW5lciBsaXN0ZW5lcik7Ci0KLQkvKioKLQkgKiBBZGRzIGEgbGlzdGVuZXIgdG8gdGhlIGNvbGxlY3Rpb24gb2YgbGlzdGVuZXJzIHdobyB3aWxsIGJlIG5vdGlmaWVkIHdoZW4KLQkgKiB0aGUgY29udGVudCBvZiB0aGlzIGNvbnRyb2wgaXMgbW9kaWZpZWQuCi0JICogCi0JICogQHBhcmFtIGxpc3RlbmVyCi0JICogICAgICAgICAgICB0aGUgbGlzdGVuZXIgd2hpY2ggc2hvdWxkIGJlIG5vdGlmaWVkCi0JICovCi0JcHVibGljIHZvaWQgYWRkTW9kaWZ5TGlzdGVuZXIoTW9kaWZ5TGlzdGVuZXIgbGlzdGVuZXIpOwotCi0JLyoqCi0JICogUmVtb3ZlcyBhIGxpc3RlbmVyIGZyb20gdGhlIGNvbGxlY3Rpb24gb2YgbGlzdGVuZXJzIHdobyB3aWxsIGJlIG5vdGlmaWVkCi0JICogd2hlbiB0aGUgY29udGVudCBvZiB0aGlzIGNvbnRyb2wgaXMgbW9kaWZpZWQuCi0JICogCi0JICogQHBhcmFtIGxpc3RlbmVyCi0JICogICAgICAgICAgICB0aGUgbGlzdGVuZXIgd2hpY2ggc2hvdWxkIG5vIGxvbmdlciBiZSBub3RpZmllZAotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZU1vZGlmeUxpc3RlbmVyKE1vZGlmeUxpc3RlbmVyIGxpc3RlbmVyKTsKLQotCS8qKgotCSAqIEFkZHMgdGhlIGxpc3RlbmVyIHRvIHRoZSBjb2xsZWN0aW9uIG9mIGxpc3RlbmVycyB3aG8gd2lsbCBiZSBub3RpZmVkIHdoZW4KLQkgKiB0aGlzIGNvbnRyb2wgaXMgZGlzcG9zZWQuCi0JICogCi0JICogQHBhcmFtIGxpc3RlbmVyCi0JICogICAgICAgICAgICB0aGUgbGlzdGVuZXIgd2hpY2ggc2hvdWxkIGJlIG5vdGlmaWVkCi0JICovCi0JcHVibGljIHZvaWQgYWRkRGlzcG9zZUxpc3RlbmVyKERpc3Bvc2VMaXN0ZW5lciBsaXN0ZW5lcik7Ci0KLQkvKioKLQkgKiBSZW1vdmVzIGEgbGlzdGVuZXIgZnJvbSB0aGUgY29sbGVjdGlvbiBvZiBsaXN0ZW5lcnMgd2hvIHdpbGwgYmUgbm90aWZpZWQKLQkgKiB3aGVuIHRoaXMgY29udHJvbCBpcyBkaXNwb3NlZC4KLQkgKiAKLQkgKiBAcGFyYW0gbGlzdGVuZXIKLQkgKiAgICAgICAgICAgIHRoZSBsaXN0ZW5lciB3aGljaCBzaG91bGQgbm8gbG9uZ2VyIGJlIG5vdGlmaWVkCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlRGlzcG9zZUxpc3RlbmVyKERpc3Bvc2VMaXN0ZW5lciBsaXN0ZW5lcik7Ci0KLQkvKioKLQkgKiBBZGRzIGEgbGlzdGVuZXIgdG8gdGhlIGNvbGxlY3Rpb24gb2YgbGlzdGVuZXJzIHdobyB3aWxsIGJlIG5vdGlmaWVkIHdoZW4KLQkgKiBoZWxwIGV2ZW50cyBhcmUgZ2VuZXJhdGVkIGZvciB0aGlzIGNvbnRyb2wuCi0JICogCi0JICogQHBhcmFtIGxpc3RlbmVyCi0JICogICAgICAgICAgICB0aGUgbGlzdGVuZXIgd2hpY2ggc2hvdWxkIGJlIG5vdGlmaWVkCi0JICovCi0JcHVibGljIHZvaWQgYWRkSGVscExpc3RlbmVyKEhlbHBMaXN0ZW5lciBsaXN0ZW5lcik7Ci0KLQkvKioKLQkgKiBSZW1vdmVzIGEgbGlzdGVuZXIgZnJvbSB0aGUgY29sbGVjdGlvbiBvZiBsaXN0ZW5lcnMgd2hvIHdpbGwgYmUgbm90aWZpZWQKLQkgKiB3aGVuIGhlbHAgZXZlbnRzIGFyZSBnZW5lcmF0ZWQgZm9yIHRoaXMgY29udHJvbC4KLQkgKiAKLQkgKiBAcGFyYW0gbGlzdGVuZXIKLQkgKiAgICAgICAgICAgIHRoZSBsaXN0ZW5lciB3aGljaCBzaG91bGQgbm8gbG9uZ2VyIGJlIG5vdGlmaWVkCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlSGVscExpc3RlbmVyKEhlbHBMaXN0ZW5lciBsaXN0ZW5lcik7Ci0KLQkvKioKLQkgKiBBZGRzIHRoZSBsaXN0ZW5lciB0byB0aGUgY29sbGVjdGlvbiBvZiBsaXN0ZW5lcnMgd2hvIHdpbGwgYmUgbm90aWZlZCB3aGVuCi0JICogYW4gZXZlbnQgb2YgdGhlIGdpdmVuIHR5cGUgb2NjdXJzIHdpdGhpbiB0aGlzIGNvbnRyb2wuCi0JICogCi0JICogQHBhcmFtIGV2ZW50VHlwZQotCSAqICAgICAgICAgICAgdGhlIHR5cGUgb2YgZXZlbnQgdG8gbGlzdGVuIGZvcgotCSAqIEBwYXJhbSBsaXN0ZW5lcgotCSAqICAgICAgICAgICAgdGhlIGxpc3RlbmVyIHdoaWNoIHNob3VsZCBiZSBub3RpZmllZCB3aGVuIHRoZSBldmVudCBvY2N1cnMKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcihpbnQgZXZlbnRUeXBlLCBMaXN0ZW5lciBsaXN0ZW5lcik7Ci0KLQkvKioKLQkgKiBSZW1vdmVzIHRoZSBsaXN0ZW5lciBmcm9tIHRoZSBjb2xsZWN0aW9uIG9mIGxpc3RlbmVycyB3aG8gd2lsbCBiZSBub3RpZmVkCi0JICogd2hlbiBhbiBldmVudCBvZiB0aGUgZ2l2ZW4gdHlwZSBvY2N1cnMgd2l0aGluIHRoaXMgZWNvbnRyb2wuCi0JICogCi0JICogQHBhcmFtIGV2ZW50VHlwZQotCSAqICAgICAgICAgICAgdGhlIHR5cGUgb2YgZXZlbnQgdG8gbGlzdGVuIHRvCi0JICogQHBhcmFtIGxpc3RlbmVyCi0JICogICAgICAgICAgICB0aGUgbGlzdGVuZXIgd2hpY2ggc2hvdWxkIG5vIGxvbmdlciBiZSBub3RpZmllZCB3aGVuIHRoZSBldmVudAotCSAqICAgICAgICAgICAgb2NjdXJzCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoaW50IGV2ZW50VHlwZSwgTGlzdGVuZXIgbGlzdGVuZXIpOwotCQotCS8qKgotCSAqIE5vdGlmaWVzIHRoZSBtb2RpZnkgbGlzdGVuZXJzCi0JICoKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlNb2RpZnlMaXN0ZW5lcnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGV2ZW50IGxpc3RlbmVycyBhdHRhY2hlZCB0byB0aGlzIGNvbnRyb2wuCi0JICogCi0JICogQHJldHVybiBhbiBpdGVyYXRvciBmb3IgcmV0cmlldmluZyB0aGUgZXZlbnQgbGlzdGVuZXJzIGF0dGFjaGVkIHRvIHRoaXMKLQkgKiAgICAgICAgIGNvbnRyb2wKLQkgKi8KLQlwdWJsaWMgSXRlcmF0b3I8UmljaFRleHRMaXN0ZW5lcj4gZ2V0TGlzdGVuZXJzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBiYXNlIFVSTCBvZiB0aGUgcmljaCB0ZXh0IGNvbnRyb2wgd2hvc2UgY29udGVudCB3YXMgbGFzdAotCSAqIGNvcGllZCB0byB0aGUgY2xpcGJvYXJkLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGJhc2UgVVJMIG9mIGEgcmljaCB0ZXh0IGNvbnRyb2wKLQkgKi8KLQlwdWJsaWMgVVJMIGdldENvcHlVUkwoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIGJhc2UgVVJMIG9mIHRoZSByaWNoIHRleHQgY29udHJvbCB3aG9zZSBjb250ZW50IHdhcyBsYXN0IGNvcGllZAotCSAqIHRvIHRoZSBjbGlwYm9hcmQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29weVVSTCgpOwotCi0JLyoqCi0JICogRGlzcG9zZXMgdGhlIG9wZXJhdGluZyBzeXN0ZW0gcmVzb3VyY2VzIGFsbG9jYXRlZCBieSB0aGlzIGNvbnRyb2wuCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpOwotCi0JLyoqCi0JICogQ2hlY2tzIHdoZXRoZXIgdGhpcyBjb250cm9sIGhhcyBiZWVuIGRpc3Bvc2VkLgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBjb250cm9sIGlzIGRpc3Bvc2VkIHN1Y2Nlc3NmdWxseQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRGlzcG9zZWQoKTsKLQkKLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBjb250cm9sJ3MgRmluZFJlcGxhY2VBY3Rpb24KLQkgKi8KLQlwdWJsaWMgRmluZFJlcGxhY2VBY3Rpb24gZ2V0RmluZFJlcGxhY2VBY3Rpb24oKTsKLQkKLQkvKioKLQkgKiBTZXRzIHRoZSBGaW5kUmVwbGFjZUFjdGlvbiB0byB1c2UKLQkgKiBAcGFyYW0gZmluZFJlcGxhY2VBY3Rpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGaW5kUmVwbGFjZUFjdGlvbihGaW5kUmVwbGFjZUFjdGlvbiBmaW5kUmVwbGFjZUFjdGlvbik7Ci0JCi0JLyoqCi0JICogU2V0cyB0aGUgaW5pdGlhbFRleHQgdmFyaWFibGUsIHdoaWNoIHN0b3JlcyB3aGF0IGlzIHNhdmVkIG9uIGRpc2sKLQkgKiBAcGFyYW0gdGV4dAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEluaXRpYWxUZXh0KFN0cmluZyB0ZXh0KTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9JUmljaFRleHRFZGl0b3IuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L0lSaWNoVGV4dEVkaXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNTVlYWE2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L0lSaWNoVGV4dEVkaXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmFjdGlvbnMuRmluZFJlcGxhY2VBY3Rpb247Ci0KLS8qKgotICogVGhlIGludGVyZmFjZSBmb3IgYSByaWNoIHRleHQgZWRpdG9yLgotICogPHA+Ci0gKiBBIHJpY2ggdGV4dCBlZGl0b3IgaXMgYSBjb21wb3NpdGUgdXNlciBpbnRlcmZhY2Ugb2JqZWN0IHRoYXQgaW5jbHVkZXMgYSB0b29sCi0gKiBiYXIsIGEgdGFiIGZvbGRlciBmb3IgZW50ZXJpbmcgdGhlIHJpY2ggdGV4dCBjb250ZW50LCBhbmQgYSB0YWIgZm9sZGVyIGZvcgotICogdmlld2luZyBhbmQgbW9kaWZ5aW5nIHRoZSByaWNoIHRleHQgY29udGVudCBpbiBhIG1hcmt1cCBsYW5ndWFnZS4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVJpY2hUZXh0RWRpdG9yIGV4dGVuZHMgSVJpY2hUZXh0IHsKLQotCS8qKgotCSAqIEZpbGxzIHRoZSB0b29sIGJhciB3aXRoIHJpY2ggdGV4dCBhY3Rpb24gaXRlbXMuCi0JICogCi0JICogQHBhcmFtIHRvb2xCYXIKLQkgKiAgICAgICAgICAgIGEgcmljaCB0ZXh0IGVkaXRvciB0b29sIGJhcgotCSAqLwotCXB1YmxpYyB2b2lkIGZpbGxUb29sQmFyKElSaWNoVGV4dFRvb2xCYXIgdG9vbEJhcik7Ci0KLQkvKioKLQkgKiBTZWxlY3RzIHRoZSByaWNoIHRleHQgb3IgdGhlIG1hcmt1cCBsYW5ndWFnZSB0YWIuCi0JICogCi0JICogQHBhcmFtIGluZGV4Ci0JICogICAgICAgICAgICA8Y29kZT4wPC9jb2RlPiBmb3IgdGhlIHJpY2ggdGV4dCB0YWIsIDxjb2RlPjE8L2NvZGU+IGZvcgotCSAqICAgICAgICAgICAgdGhlIG1hcmt1cCBsYW5ndWFnZSB0YWIKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTZWxlY3Rpb24oaW50IGluZGV4KTsKLQkKLQkvKioKLQkgKiBTZXRzIHRoZSBGaW5kUmVwbGFjZUFjdGlvbiB0byB1c2UKLQkgKiBAcGFyYW0gZmluZFJlcGxhY2VBY3Rpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGaW5kUmVwbGFjZUFjdGlvbihGaW5kUmVwbGFjZUFjdGlvbiBmaW5kUmVwbGFjZUFjdGlvbik7Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L0lSaWNoVGV4dFRvb2xCYXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L0lSaWNoVGV4dFRvb2xCYXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWNhNTNkNS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9JUmljaFRleHRUb29sQmFyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuYWN0aW9ucy5SaWNoVGV4dENvbWJvQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5Ub29sQmFyTWFuYWdlcjsKLQotLyoqCi0gKiBUaGUgaW50ZXJmYWNlIGZvciBhIHJpY2ggdGV4dCBlZGl0b3IgdG9vbGJhci4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVJpY2hUZXh0VG9vbEJhciB7Ci0KLQkKLQkvKioKLQkgKiBBZGRzIGEgYnV0dG9uIGFjdGlvbiB0byB0aGUgdG9vbCBiYXIuCi0JICogCi0JICogQHBhcmFtIGFjdGlvbgotCSAqICAgICAgICAgICAgdGhlIGJ1dHRvbiBhY3Rpb24gdG8gYWRkCi0JICovCi0JcHVibGljIHZvaWQgYWRkQWN0aW9uKElBY3Rpb24gYWN0aW9uKTsKLQotCS8qKgotCSAqIEFkZHMgYSBjb21ibyBhY3Rpb24gdG8gdGhlIHRvb2wgYmFyLgotCSAqIAotCSAqIEBwYXJhbSBhY3Rpb24KLQkgKiAgICAgICAgICAgIHRoZSBjb21ibyBhY3Rpb24gdG8gYWRkCi0JICovCi0JcHVibGljIHZvaWQgYWRkQWN0aW9uKFJpY2hUZXh0Q29tYm9BY3Rpb24gaXRlbSk7Ci0KLQkvKioKLQkgKiBBZGRzIGEgc2VwYXJhdG9yIHRvIHRoZSB0b29sIGJhci4KLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRTZXBhcmF0b3IoKTsKLQotCS8qKgotCSAqIFVwZGF0ZXMgdGhlIHRvb2xiYXIgc3RhdGUuCi0JICogPHA+Ci0JICogRW5hYmxlcy9kaXNhYmxlcyBhY3Rpb25zIGRlcGVuZGluZyBvbiB0aGUgY3VycmVudGx5IHNlbGVjdGVkCi0JICogUmljaFRleHRFZGl0b3IgdGFiIChSaWNoVGV4dCB2cy4gSFRNTCkKLQkgKiAKLQkgKiBAcGFyYW0gZWRpdGFibGUgc3BlY2lmaWVzIHdoZXRoZXIgdG8gZW5hYmxlIG5vbi1SZWFkT25seSBjb21tYW5kcwotCSAqLwotCXB1YmxpYyB2b2lkIHVwZGF0ZVRvb2xCYXIoYm9vbGVhbiBlbmFibGVkKTsKLQkKLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSB0b29sYmFyIG1hbmFnZXIKLQkgKi8KLQlwdWJsaWMgVG9vbEJhck1hbmFnZXIgZ2V0VG9vbGJhck1ncigpOwotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvUmVzb3VyY2VzLnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9SZXNvdXJjZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjFmYWJjMy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9SZXNvdXJjZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE0OCArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUgotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBCRUdJTiBOTyBUUkFOU0xBVElPTgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyAhISBETyBOT1QgVFJBTlNMQVRFIFRIRSBGT0xMT1dJTkcgTElORSAhIQotZm9udE5hbWVBY3Rpb25fQ1NTX0RlZmF1bHQ9YXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZgotIyAhISBETyBOT1QgVFJBTlNMQVRFIFRIRSBGT0xMT1dJTkcgTElORSAhIQotZm9udE5hbWVBY3Rpb25fQ1NTX0RlZmF1bHRfTW96aWxsYT1hcmlhbCxoZWx2ZXRpY2Esc2Fucy1zZXJpZgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgRU5EIE5PIFRSQU5TTEFUSU9OCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0KLQotIyBGb250IFN0eWxlIE5hbWVzCi1mb250U3R5bGVfbm9ybWFsPU5vcm1hbAotZm9udFN0eWxlX3NlY3Rpb25IZWFkaW5nPVNlY3Rpb24gSGVhZGluZwotZm9udFN0eWxlX3N1YnNlY3Rpb25IZWFkaW5nPVN1YnNlY3Rpb24gSGVhZGluZwotZm9udFN0eWxlX3N1YlN1YnNlY3Rpb25IZWFkaW5nPVN1YiBTdWJzZWN0aW9uIEhlYWRpbmcKLWZvbnRTdHlsZV9xdW90ZT1RdW90ZQotZm9udFN0eWxlX2NvZGVTYW1wbGU9Q29kZSBTYW1wbGUKLQotIyBIVE1MIEJsb2NrIFRhZ3MKLWJsb2NrVGFnX3BhcmFncmFwaD1QYXJhZ3JhcGgKLWJsb2NrVGFnX2hlYWRpbmcxPUhlYWRpbmcgMQotYmxvY2tUYWdfaGVhZGluZzI9SGVhZGluZyAyCi1ibG9ja1RhZ19oZWFkaW5nMz1IZWFkaW5nIDMKLWJsb2NrVGFnX2hlYWRpbmc0PUhlYWRpbmcgNAotYmxvY2tUYWdfaGVhZGluZzU9SGVhZGluZyA1Ci1ibG9ja1RhZ19oZWFkaW5nNj1IZWFkaW5nIDYKLWJsb2NrVGFnX2FkZHJlc3M9QWRkcmVzcwotYmxvY2tUYWdfcHJlZm9ybWF0dGVkVGV4dD1QcmVmb3JtYXR0ZWQgVGV4dAotCi0jIEhUTUwgRm9udCBOYW1lcwotZm9udE5hbWVfZGVmYXVsdD1EZWZhdWx0Ci1mb250TmFtZV9hcmlhbD1BcmlhbAotZm9udE5hbWVfY291cmllck5ldz1Db3VyaWVyIE5ldwotZm9udE5hbWVfdGltZXNOZXdSb21hbj1UaW1lcyBOZXcgUm9tYW4KLWZvbnROYW1lX3ZlcmRhbmE9VmVyZGFuYQotCi0jIFJpY2ggVGV4dCBFZGl0b3IgVG9vbCBCdXR0b25zCi1hZGRIb3Jpem9udGFsQmFyQWN0aW9uX3Rvb2xUaXBUZXh0PUFkZCBIb3Jpem9udGFsIEJhcgotYWRkSW1hZ2VBY3Rpb25fdG9vbFRpcFRleHQ9QWRkIEltYWdlCi1hZGRMaW5lQWN0aW9uX3Rvb2xUaXBUZXh0PUFkZCBMaW5lCi1hZGRMaW5rQWN0aW9uX3Rvb2xUaXBUZXh0PUFkZCBMaW5rCi1hZGRPcmRlcmVkTGlzdEFjdGlvbl90b29sVGlwVGV4dD1BZGQgT3JkZXJlZCBMaXN0Ci1hZGRUYWJsZUFjdGlvbl90b29sVGlwVGV4dD1BZGQgVGFibGUKLWFkZFVub3JkZXJlZExpc3RBY3Rpb25fdG9vbFRpcFRleHQ9QWRkIFVub3JkZXJlZCBMaXN0Ci1ib2xkQWN0aW9uX3Rvb2xUaXBUZXh0PUJvbGQKLWNsZWFyQ29udGVudEFjdGlvbl90b29sVGlwVGV4dD1DbGVhciBDb250ZW50Ci1jb3B5QWN0aW9uX3Rvb2xUaXBUZXh0PUNvcHkKLWN1dEFjdGlvbl90b29sVGlwVGV4dD1DdXQKLWZpbmRSZXBsYWNlQWN0aW9uX3Rvb2xUaXBUZXh0PUZpbmQvUmVwbGFjZQotaW5kZW50QWN0aW9uX3Rvb2xUaXBUZXh0PUluZGVudAotaXRhbGljQWN0aW9uX3Rvb2xUaXBUZXh0PUl0YWxpYwotanVzdGlmeUNlbnRlckFjdGlvbl90b29sVGlwVGV4dD1KdXN0aWZ5IENlbnRlcgotanVzdGlmeUZ1bGxBY3Rpb25fdG9vbFRpcFRleHQ9SnVzdGlmeSBGdWxsCi1qdXN0aWZ5TGVmdEFjdGlvbl90b29sVGlwVGV4dD1KdXN0aWZ5IExlZnQKLWp1c3RpZnlSaWdodEFjdGlvbl90b29sVGlwVGV4dD1KdXN0aWZ5IFJpZ2h0Ci1vdXRkZW50QWN0aW9uX3Rvb2xUaXBUZXh0PU91dGRlbnQKLXBhc3RlQWN0aW9uX3Rvb2xUaXBUZXh0PVBhc3RlCi1wYXN0ZVBsYWluVGV4dEFjdGlvbl90b29sVGlwVGV4dD1QYXN0ZSBhcyBwbGFpbiB0ZXh0Ci1zdWJzY3JpcHRBY3Rpb25fdG9vbFRpcFRleHQ9U3Vic2NyaXB0Ci1zdXBlcnNjcmlwdEFjdGlvbl90b29sVGlwVGV4dD1TdXBlcnNjcmlwdAotdW5kZXJsaW5lQWN0aW9uX3Rvb2xUaXBUZXh0PVVuZGVybGluZQotdGlkeV9jbGVhbl90ZXh0PURlZmF1bHQgQ2xlYW4KLXRpZHlfY2xlYW5lcl90ZXh0PUNsZWFuIE1TIEhUTUwKLXRpZHlfY2xlYW5lc3RfdGV4dD1DbGVhbiBXb3JkIDIwMDAgSFRNTAotdGlkeV9jbGVhbl90b29sVGlwVGV4dD1DbGVhbiB3aXRoIEpUaWR5IHVzaW5nIGRlZmF1bHQgb3B0aW9ucwotdGlkeV9jbGVhbmVyX3Rvb2xUaXBUZXh0PUNsZWFuIEhUTUwgb2YgTVMgSFRNTAotdGlkeV9jbGVhbmVzdF90b29sVGlwVGV4dD1DbGVhbiBXb3JkIDIwMDAgSFRNTAotCi0KLSMgUmljaCBUZXh0IEVkaXRvciBDb21ib2JveGVzCi1mb250U3R5bGVBY3Rpb25fdG9vbFRpcFRleHQ9U2V0IEZvbnQgU3R5bGUKLWJsb2NrVGFnQWN0aW9uX3Rvb2xUaXBUZXh0PVNldCBCbG9jayBUYWcKLWZvbnROYW1lQWN0aW9uX3Rvb2xUaXBUZXh0PVNldCBGb250Ci1mb250TmFtZUFjdGlvbl9EZWZhdWx0Rm9udE5hbWU9RGVmYXVsdCBmb250Ci1mb250U2l6ZUFjdGlvbl90b29sVGlwVGV4dD1TZXQgRm9udCBTaXplCi0KLSMgUmljaCBUZXh0IEVkaXRvciBDb250ZXh0IE1lbnUgSXRlbXMKLWN1dEFjdGlvbl90ZXh0PSZDdXQKLWNvcHlBY3Rpb25fdGV4dD1DJm9weQotcGFzdGVBY3Rpb25fdGV4dD0mUGFzdGUKLXBhc3RlUGxhaW5UZXh0QWN0aW9uX3RleHQ9UGFzdGUgJmFzIHBsYWluIHRleHQKLQotIyBSaWNoIFRleHQgRWRpdG9yIFRhYnMKLXJpY2hUZXh0VGFiX3RleHQ9UmljaCBUZXh0Ci1yaWNoVGV4dFRhYl90b29sVGlwVGV4dD1FZGl0IGNvbnRlbnQgaW4gcmljaCB0ZXh0Ci1odG1sVGFiX3RleHQ9SFRNTAotaHRtbFRhYl90b29sVGlwVGV4dD1FZGl0IGNvbnRlbnQgaW4gSFRNTAotCi0jIEFkZCBEaWFsb2dzCi1hZGRJbWFnZURpYWxvZ190aXRsZT1BZGQgSW1hZ2UKLWFkZExpbmtEaWFsb2dfdGl0bGU9QWRkIExpbmsKLWFkZFRhYmxlRGlhbG9nX3RpdGxlPUFkZCBUYWJsZQotZmluZFJlcGxhY2VEaWFsb2dfdGl0bGU9RmluZC9SZXBsYWNlCi11cmxMYWJlbF90ZXh0PVVSTDoKLXN1bW1hcnlMYWJlbF90ZXh0PVN1bW1hcnk6Ci1jYXB0aW9uTGFiZWxfdGV4dD1DYXB0aW9uOgotcm93c0xhYmVsX3RleHQ9Um93czoKLWNvbHVtbnNMYWJlbF90ZXh0PUNvbHVtbnM6Ci13aWR0aExhYmVsX3RleHQ9V2lkdGg6Ci10YWJsZVN0eWxlTGFiZWxfdGV4dD1TdHlsZToKLXRhYmxlSGVhZGVyTm9uZV90ZXh0PVRhYmxlIHdpdGggbm8gaGVhZGVycwotdGFibGVIZWFkZXJDb2xzX3RleHQ9VGFibGUgd2l0aCBjb2x1bW4gaGVhZGVycwotdGFibGVIZWFkZXJSb3dzX3RleHQ9VGFibGUgd2l0aCByb3cgaGVhZGVycwotdGFibGVIZWFkZXJCb3RoX3RleHQ9VGFibGUgd2l0aCBjb2x1bW4gYW5kIHJvdyBoZWFkZXJzCi1icm93c2VCdXR0b25fdGV4dD1Ccm93c2UuLi4KLQotIyBDbGVhciBFZGl0b3IgQ29udGVudCBEaWFsb2cKLWNsZWFyQ29udGVudERpYWxvZ190aXRsZT1DbGVhciBFZGl0b3IgQ29udGVudCBDb25maXJtYXRpb24KLWNsZWFyQ29udGVudERpYWxvZ190ZXh0PURvIHlvdSByZWFsbHkgd2FudCB0byBjbGVhciB0aGUgY29udGVudCBvZiB0aGlzIHJpY2ggdGV4dCBlZGl0b3I/Ci0KLSMgRmluZC9SZXBsYWNlIERpYWxvZwotZmluZExhYmVsX3RleHQ9RmluZDoKLXJlcGxhY2VMYWJlbF90ZXh0PVJlcGxhY2Ugd2l0aDoKLW9wdGlvbnNHcm91cF90ZXh0PU9wdGlvbnMKLWNhc2VTZW5zaXRpdmVDaGVja2JveF90ZXh0PUNhc2Ugc2Vuc2l0aXZlCi13aG9sZVdvcmRDaGVja2JveF90ZXh0PVdob2xlIHdvcmQKLWRpcmVjdGlvbkdyb3VwX3RleHQ9RGlyZWN0aW9uCi1mb3J3YXJkUmFkaW9CdXR0b25fdGV4dD1Gb3J3YXJkCi1iYWNrd2FyZFJhZGlvQnV0dG9uX3RleHQ9QmFja3dhcmQKLWZpbmRCdXR0b25fdGV4dD1GaW5kCi1yZXBsYWNlQnV0dG9uX3RleHQ9UmVwbGFjZQotcmVwbGFjZUZpbmRCdXR0b25fdGV4dD1SZXBsYWNlL0ZpbmQKLXJlcGxhY2VhbGxCdXR0b25fdGV4dD1SZXBsYWNlIEFsbAotIyB0YWtlbiBmcm9tIG9yZy5lY2xpcHNlLnVpLndvcmtiZW5jaC50ZXh0ZWRpdG9yCi1GaW5kUmVwbGFjZV9TdGF0dXNfbm9NYXRjaF9sYWJlbD1TdHJpbmcgTm90IEZvdW5kCi0KLSMgUHJlZmVyZW5jZSBQYWdlCi1tYXhDaGFyc1BlckxpbmVMYWJlbF90ZXh0PU1heGltdW0gY2hhcmFjdGVycyBwZXIgbGluZToKLWluZGVudEhUTUxDaGVja2JveF90ZXh0PUluZGVudCBIVE1MIHRhZ3MKLWluZGVudFNpemVMYWJlbF90ZXh0PUluZGVudCBTaXplOgotdXJsRGlzcGxheU5hbWVMYWJlbF90ZXh0PVVSTCBEaXNwbGF5IE5hbWU6Ci0KLQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvUmljaFRleHQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L1JpY2hUZXh0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyODRmM2YuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvUmljaFRleHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NzAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0OwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOwotaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24uaHRtbC5IVE1MRm9ybWF0dGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24uc2VydmljZWFiaWxpdHkuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuRmlsZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5YTUxVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24ueG1sLlhTTFRQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmFjdGlvbnMuQ29weUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuYWN0aW9ucy5DdXRBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmFjdGlvbnMuRmluZFJlcGxhY2VBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmFjdGlvbnMuUGFzdGVBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmFjdGlvbnMuUGFzdGVQbGFpblRleHRBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYnJvd3Nlci5Ccm93c2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5icm93c2VyLkxvY2F0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYnJvd3Nlci5Mb2NhdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5icm93c2VyLlN0YXR1c1RleHRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYnJvd3Nlci5TdGF0dXNUZXh0TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5EaXNwb3NlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5EaXNwb3NlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5IZWxwTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5LZXlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLktleUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTWVudUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTWVudUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTWVudTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5NZW51SXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotCi0vKioKLSAqIFRoZSBkZWZhdWx0IHJpY2ggdGV4dCBjb250cm9sIGltcGxlbWVudGF0aW9uLgotICogPHA+Ci0gKiBUaGUgZGVmYXVsdCByaWNoIHRleHQgZWRpdG9yIHVzZXMgWEhUTUwgYXMgdGhlIHVuZGVybHlpbmcgbWFya3VwIGxhbmd1YWdlIGZvcgotICogdGhlIHJpY2ggdGV4dCBjb250ZW50LiBJdCBpcyBpbXBsZW1lbnRlZCB1c2luZyBhIFNXVCA8Y29kZT5Ccm93c2VyPC9jb2RlPgotICogY29udHJvbCBhbmQgREhUTUwgKEhUTUwsIENTUyBhbmQgSmF2YVNjcmlwdCkuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQGF1dGhvciBKZWZmIEhhcmR5Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBSaWNoVGV4dCBpbXBsZW1lbnRzIElSaWNoVGV4dCB7Ci0KLQkvLyBFbmNvZGVkIHNpbmdsZSBxdW90ZS4gQWxsIHNpbmdsZSBxdW90ZXMgbmVlZCB0byBiZSBzcGVjaWFsbHkgZW5jb2RlZCB0bwotCS8vIGF2b2lkIEphdmFTY3JpcHQgZXJyb3Igd2hlbiBjYWxsaW5nIEJyb3dzZS5leGVjdXRlQ29tbWFuZCgpLgotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFTkNPREVEX1NJTkdMRV9RVU9URSA9ICIlc3ElIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVOQ09ERURfTkVXTElORSA9ICIlRU9MJSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTVEFUVVNfUFJFRklYID0gIiQkJCI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVEFUVVNfUFJFRklYX0xFTkdUSCA9IFNUQVRVU19QUkVGSVgubGVuZ3RoKCk7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1RBVFVTX05PUCA9IDA7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1RBVFVTX0lOSVRJQUxJWkVEID0gMTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVEFUVVNfTU9ESUZJRUQgPSAyOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNUQVRVU19HRVRfVEVYVCA9IDM7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1RBVFVTX0tFWV9ET1dOID0gNDsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVEFUVVNfS0VZX1VQID0gNTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVEFUVVNfU0VMRUNUX1RFWFQgPSA2OwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNUQVRVU19TRUxFQ1RfQ09OVFJPTCA9IDc7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1RBVFVTX1NFTEVDVF9OT05FID0gODsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVEFUVVNfRVhFQ19DTUQgPSA5OwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNUQVRVU19SRUZPUk1BVF9MSU5LUyA9IDEwOwotCi0JLy8gVGhlIGRlZmF1bHQgYmFzZSBwYXRoIHVzZWQgZm9yIHJlc29sdmluZyBsaW5rcyAoPGhyZWY+LCA8aW1nPiwgZXRjLikKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9CQVNFX1BBVEggPSBTeXN0ZW0KLQkJCS5nZXRQcm9wZXJ0eSgidXNlci5ob21lIikgLy8kTk9OLU5MUy0xJAotCQkJKyBTeXN0ZW0uZ2V0UHJvcGVydHkoImZpbGUuc2VwYXJhdG9yIikgKyAicnRlIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkvLyBJZiB0cnVlLCBsb2cgZGVidWdnaW5nIGluZm8uCi0JcHJvdGVjdGVkIGJvb2xlYW4gZGVidWc7Ci0KLQkvLyBUaGUgcGx1Zy1pbiBsb2dnZXIuCi0JcHJvdGVjdGVkIExvZ2dlciBsb2dnZXI7Ci0KLQkvLyBUaGUgdW5kZXJseWluZyBTV1QgQnJvd3NlciB1c2VkIGZvciBsb2FkaW5nIHRoZSBKYXZhU2NyaXB0L0RIVE1MIGVkaXRvci4KLQlwcm90ZWN0ZWQgQnJvd3NlciBlZGl0b3I7Ci0KLQkvLyBUaGUgdW5kZXJseWluZyBPbGVDb250cm9sU2l0ZSBmb3IgdGhlIFNXVCBCcm93c2VyIChXaW4zMiBvbmx5KS4KLQlwcm90ZWN0ZWQgQ29udHJvbCBlZGl0b3JDb250cm9sOwotCi0JLy8gVGhlIGJhc2UgVVJMIG9mIHRoZSByaWNoIHRleHQgY29udHJvbCB3aG9zZSBjb250ZW50IHdhcyBsYXN0Ci0JLy8gY29waWVkIHRvIHRoZSBjbGlwYm9hcmQuCi0JcHJvdGVjdGVkIHN0YXRpYyBVUkwgY29weVVSTDsKLQotCS8vIFRoZSBjb250ZXh0IG1lbnUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgY29udHJvbC4KLQlwcm90ZWN0ZWQgTWVudSBjb250ZXh0TWVudTsKLQotCS8vIFRoZSBmb2xkZXIgdGhhdCBjb250YWlucyB0aGUgc3VwcG9ydGluZyBDU1MgYW5kIEphdmFTY3JpcHQgZmlsZXMKLQlwcm90ZWN0ZWQgU3RyaW5nIHJ0ZUZvbGRlcjsKLQotCS8vIFRoZSBVUkwgdGhhdCBwb2ludHMgdG8gdGhlIHN1cHBvcnRpbmcgQ1NTIGFuZCBKYXZhU2NyaXB0IGZpbGVzLgotCXByb3RlY3RlZCBTdHJpbmcgcnRlVVJMOwotCi0JLy8gVGhlIGJhc2UgcGF0aCB1c2VkIGZvciByZXNvbHZpbmcgbGlua3MgKDxocmVmPiwgPGltZz4sIGV0Yy4pCi0JcHJvdGVjdGVkIFN0cmluZyBiYXNlUGF0aDsKLQotCS8vIFRoZSBESFRNTCBpbml0aWFsaXphdGlvbiBmbGFnLgotCXByb3RlY3RlZCBib29sZWFuIGluaXRpYWxpemVkOwotCi0JLy8gVGhlIGluaXRpYWwgZm9jdXMuCi0JcHJvdGVjdGVkIGJvb2xlYW4gaW5pdGlhbGl6ZWRXaXRoRm9jdXM7Ci0KLQkvLyBUaGUgY29udHJvbCdzIGluaXRpYWwgdGV4dC4gVGhpcyBpcyB1c2VkIHRvIGNhY2hlIHRoZSBIVE1MIHNvdXJjZSBwYXNzZWQKLQkvLyBpbiB2aWEgc2V0VGV4dCgpd2hpbGUgdGhlIERIVE1MIGluaXRpYWxpemF0aW9uIGlzIGhhcHBlbmluZy4KLQlwcm90ZWN0ZWQgU3RyaW5nIGluaXRpYWxUZXh0OwotCi0JLy8gVGhlIGNvbnRyb2wncyBjdXJyZW50IHRleHQuCi0JcHJvdGVjdGVkIFN0cmluZyBjdXJyZW50VGV4dCA9ICIiOyAvLyROT04tTkxTLTEkCi0KLQkvLyBUaGUgY29udHJvbCdzIGVkaXRhYmxlIGZsYWcuCi0JcHJvdGVjdGVkIGJvb2xlYW4gZWRpdGFibGUgPSB0cnVlOwotCi0JLy8gVGhlIGNvbnRyb2wncyBtb2RpZmljYXRpb24gZmxhZy4KLQlwcm90ZWN0ZWQgYm9vbGVhbiBtb2RpZmllZDsKLQotCS8vIFRoZSBjb250cm9sJ3MgdGV4dCBhbmQgb2JqZWN0IHNlbGVjdGlvbiBmbGFnLgotCXByb3RlY3RlZCBib29sZWFuIGhhc1NlbGVjdGlvbjsKLQotCS8vIFRoZSBjb250cm9sJ3MgdGV4dCBzZWxlY3Rpb24KLQlwcm90ZWN0ZWQgUmljaFRleHRTZWxlY3Rpb24gcmljaFRleHRTZWxlY3Rpb24gPSBuZXcgUmljaFRleHRTZWxlY3Rpb24oKTsKLQotCS8vIEphdmFTY3JpcHQgY29tbWFuZCBleGVjdXRpb24gc3RhdHVzIGNvZGUuCi0JcHJvdGVjdGVkIGludCBzdGF0dXMgPSAwOwotCi0JLy8gVGhlIEhUTUwgc291cmNlIGZvcm1hdHRlci4KLQlwcm90ZWN0ZWQgSFRNTEZvcm1hdHRlciBodG1sRm9ybWF0dGVyOwotCi0JLy8gVGhlIFNXVCBldmVudCBsaXN0ZW5lcnMuCi0JcHJvdGVjdGVkIE1hcDxMaXN0ZW5lciwgUmljaFRleHRMaXN0ZW5lcj4gbGlzdGVuZXJzOwotCi0JLy8gVGhlIG1vZGlmeSBsaXN0ZW5lcnMuCi0JcHJvdGVjdGVkIExpc3Q8TW9kaWZ5TGlzdGVuZXI+IG1vZGlmeUxpc3RlbmVyczsKLQotCS8vIFRoZSBjb250cm9sJ3MgZWRpdCBmbGFnLgotCXByb3RlY3RlZCBib29sZWFuIG5vdGlmeWluZ01vZGlmeUxpc3RlbmVycyA9IGZhbHNlOwotCi0JLy8gVGhlIGNvbnRyb2xzJ3MgZm9jdXMgZmxhZy4KLQlwcm90ZWN0ZWQgYm9vbGVhbiBoYXNGb2N1cyA9IGZhbHNlOwotCi0JLy8gVGhlIGNvbnRyb2xzJ3MgcHJvY2Vzc2luZyBKYXZhU2NyaXB0IGV2ZW50IGZsYWcuCi0JcHJvdGVjdGVkIGJvb2xlYW4gcHJvY2Vzc2luZ0pTRXZlbnQgPSBmYWxzZTsKLQotCS8vIFRoZSBjb250cm9scydzIHByb2Nlc3NpbmcgTU9ESUZJRUQgSmF2YVNjcmlwdCBldmVudCBmbGFnLgotCXByb3RlY3RlZCBib29sZWFuIGNoZWNraW5nTW9kaWZ5RXZlbnQgPSBmYWxzZTsKLQotCS8vIFRoZSBjb250cm9sJ3MgZmluZC9yZXBsYWNlIHRleHQgYWN0aW9uCi0JcHJvdGVjdGVkIEZpbmRSZXBsYWNlQWN0aW9uIGZpbmRSZXBsYWNlQWN0aW9uOwotCQotCS8vIFRoZSBjb250cm9sJ3MgSUUgZmxhZwotCXByb3RlY3RlZCBib29sZWFuIGlzSUUgPSBmYWxzZTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBjb21wb3NpdGUKLQkgKiBAcGFyYW0gc3R5bGUKLQkgKiAgICAgICAgICAgIHRoZSBzdHlsZSBmb3IgdGhpcyBjb250cm9sCi0JICogQHBhcmFtIGJhc2VQYXRoCi0JICogICAgICAgICAgICB0aGUgcGF0aCB1c2VkIGZvciByZXNvbHZpbmcgbGlua3MKLQkgKi8KLQlwdWJsaWMgUmljaFRleHQoQ29tcG9zaXRlIHBhcmVudCwgaW50IHN0eWxlLCBTdHJpbmcgYmFzZVBhdGgpIHsKLQkJZGVidWcgPSBSaWNoVGV4dFBsdWdpbi5nZXREZWZhdWx0KCkuaXNEZWJ1Z2dpbmcoKTsKLQkJbG9nZ2VyID0gUmljaFRleHRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpOwotCQlmaW5kUmVwbGFjZUFjdGlvbiA9IG5ldyBGaW5kUmVwbGFjZUFjdGlvbih0aGlzKTsKLQkJcnRlRm9sZGVyID0gUmljaFRleHRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEluc3RhbGxQYXRoKCkgKyAicnRlLyI7IC8vJE5PTi1OTFMtMSQJCQotCQlydGVVUkwgPSBYTUxVdGlsLmVzY2FwZSgiZmlsZTovLyIgKyBydGVGb2xkZXIpOyAvLyROT04tTkxTLTEkCi0JCXNldEJhc2VQYXRoKGJhc2VQYXRoKTsKLQotCQl0cnkgewotCQkJZWRpdG9yID0gbmV3IEJyb3dzZXIocGFyZW50LCBTV1QuTk9ORSk7Ci0JCQlpZiAoZGVidWcpIHsKLQkJCQlwcmludERlYnVnTWVzc2FnZSgiUmljaFRleHQiLCAiYmFzZVBhdGg9IiArIGJhc2VQYXRoKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQl9Ci0JCQllZGl0b3Iuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0JCQllZGl0b3Iuc2V0RGF0YShQUk9QRVJUWV9OQU1FLCB0aGlzKTsKLQkJCWluaXQocGFyZW50LCBzdHlsZSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQllZGl0b3IgPSBudWxsOwotCQkJU3RyaW5nIG1zZyA9ICJGYWlsZWQgdG8gY3JlYXRlIFJpY2hUZXh0IHdpdGggYmFzZVBhdGg9IiArIGJhc2VQYXRoOyAvLyROT04tTkxTLTEkCi0JCQlsb2dnZXIubG9nRXJyb3IobXNnLCBlKTsKLQkJCWlmIChkZWJ1ZykgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbihtc2cpOwotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgY29tcG9zaXRlCi0JICogQHBhcmFtIHN0eWxlCi0JICogICAgICAgICAgICB0aGUgc3R5bGUgZm9yIHRoaXMgY29udHJvbAotCSAqLwotCXB1YmxpYyBSaWNoVGV4dChDb21wb3NpdGUgcGFyZW50LCBpbnQgc3R5bGUpIHsKLQkJdGhpcyhwYXJlbnQsIHN0eWxlLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBiYXNlIHBhdGggZm9yIHJlc29sdmluZyBsaW5rcy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRCYXNlUGF0aChTdHJpbmcgcGF0aCkgewotCQlpZiAocGF0aCAhPSBudWxsICYmIHBhdGgubGVuZ3RoKCkgPiAwKSB7Ci0JCQlpZiAocGF0aC5zdGFydHNXaXRoKEZpbGVVdGlsLlVOQ19QQVRIX1BSRUZJWCkpIHsKLQkJCQliYXNlUGF0aCA9IEZpbGVVdGlsLlVOQ19QQVRIX1BSRUZJWAotCQkJCQkJKyBGaWxlVXRpbC5hcHBlbmRTZXBhcmF0b3IocGF0aC5zdWJzdHJpbmcoCi0JCQkJCQkJCUZpbGVVdGlsLlVOQ19QQVRIX1BSRUZJWF9MRU5HVEgpLnJlcGxhY2UoJ1xcJywKLQkJCQkJCQkJJy8nKSwgIi8iKTsgLy8kTk9OLU5MUy0xJAotCQkJfSBlbHNlIHsKLQkJCQliYXNlUGF0aCA9IEZpbGVVdGlsLmFwcGVuZFNlcGFyYXRvcihwYXRoKS5yZXBsYWNlKCdcXCcsICcvJyk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQliYXNlUGF0aCA9IEZpbGVVdGlsLmFwcGVuZFNlcGFyYXRvcihERUZBVUxUX0JBU0VfUEFUSCkucmVwbGFjZSgKLQkJCQkJJ1xcJywgJy8nKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemVzIHRoaXMgY29udHJvbC4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IGNvbXBvc2l0ZQotCSAqIEBwYXJhbSBzdHlsZQotCSAqICAgICAgICAgICAgdGhlIHN0eWxlIGZvciB0aGlzIGNvbnRyb2wKLQkgKiBAdGhyb3dzIEV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIHdoZW4gYW4gZXJyb3IgaGFzIG9jY3VycmVkIHdoaWxlIGluaXRpYWx6aW5nIHRoaXMgY29udHJvbAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXQoQ29tcG9zaXRlIHBhcmVudCwgaW50IHN0eWxlKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCWFkZFN0YXR1c1RleHRMaXN0ZW5lcigpOwotCQkJaWYgKGRlYnVnKSB7Ci0JCQkJcHJpbnREZWJ1Z01lc3NhZ2UoImluaXQiLCAiYWRkZWQgc3RhdHVzIHRleHQgbGlzdGVuZXIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQl9Ci0KLQkJCVN0cmluZyBlZGl0b3JIVE1MID0gZ2VuZXJhdGVFZGl0b3JIVE1MKCk7Ci0JCQlpZiAoZGVidWcpIHsKLQkJCQlwcmludERlYnVnTWVzc2FnZSgiaW5pdCIsICJnZW5lcmF0ZWQgZWRpdG9yIEhUTUwiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQl9Ci0KLQkJCWVkaXRvci5zZXRUZXh0KGVkaXRvckhUTUwpOwotCQkJaWYgKGRlYnVnKSB7Ci0JCQkJcHJpbnREZWJ1Z01lc3NhZ2UoImluaXQiLCAibG9hZGVkIGVkaXRvciBIVE1MIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJfQotCi0JCQljb250ZXh0TWVudSA9IG5ldyBNZW51KHBhcmVudC5nZXRTaGVsbCgpLCBTV1QuUE9QX1VQKTsKLQkJCWVkaXRvci5zZXRNZW51KGNvbnRleHRNZW51KTsKLQkJCWZpbGxDb250ZXh0TWVudShjb250ZXh0TWVudSk7Ci0JCQlpZiAoZGVidWcpIHsKLQkJCQlwcmludERlYnVnTWVzc2FnZSgiaW5pdCIsICJhZGRlZCBjb250ZXh0IG1lbnUiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQl9Ci0KLQkJCWFkZExpc3RlbmVycygpOwotCQkJaWYgKGRlYnVnKSB7Ci0JCQkJcHJpbnREZWJ1Z01lc3NhZ2UoImluaXQiLCAiYWRkZWQgbGlzdGVuZXJzIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJfQotCi0JCQlodG1sRm9ybWF0dGVyID0gbmV3IEhUTUxGb3JtYXR0ZXIoKTsKLQkJCWlmIChkZWJ1ZykgewotCQkJCXByaW50RGVidWdNZXNzYWdlKCJpbml0IiwgImluc3RhbnRpYXRlZCBIVE1MRm9ybWF0dGVyIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJZWRpdG9yID0gbnVsbDsKLQkJCWRpc3Bvc2UoKTsKLQkJCXRocm93IGU7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoaXMgcmljaCB0ZXh0IGNvbnRyb2wuCi0JICogCi0JICogQHJldHVybiB0aGlzIHJpY2ggdGV4dCBjb250cm9sCi0JICovCi0JcHVibGljIENvbnRyb2wgZ2V0Q29udHJvbCgpIHsKLQkJcmV0dXJuIGVkaXRvcjsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBsYXlvdXQgZGF0YS4KLQkgKiAKLQkgKiBAcGFyYW0gbGF5b3V0RGF0YQotCSAqICAgICAgICAgICAgdGhlIGxheW91dCBkYXRhIHRvIHNldAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExheW91dERhdGEoT2JqZWN0IGxheW91dERhdGEpIHsKLQkJaWYgKGVkaXRvciAhPSBudWxsKSB7Ci0JCQllZGl0b3Iuc2V0TGF5b3V0RGF0YShsYXlvdXREYXRhKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGxheW91dCBkYXRhLgotCSAqIAotCSAqIEByZXR1cm4gdGhpcyBjb250cm9sJ3MgbGF5b3V0IGRhdGEKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldExheW91dERhdGEoKSB7Ci0JCWlmIChlZGl0b3IgIT0gbnVsbCkgewotCQkJcmV0dXJuIGVkaXRvci5nZXRMYXlvdXREYXRhKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogU2V0cyBmb2N1cyB0byB0aGlzIGNvbnRyb2wuCi0JICovCi0JcHVibGljIHZvaWQgc2V0Rm9jdXMoKSB7Ci0JCWlmIChkZWJ1ZykgewotCQkJcHJpbnREZWJ1Z01lc3NhZ2UoInNldEZvY3VzLCBlZGl0YWJsZT0iICsgZWRpdGFibGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJaWYgKGVkaXRvciAhPSBudWxsKSB7Ci0JCQlpZiAoaW5pdGlhbGl6ZWQpIHsKLQkJCQlpZiAoIWVkaXRvci5pc0ZvY3VzQ29udHJvbCgpKSB7Ci0JCQkJCWlmICghUGxhdGZvcm0uZ2V0T1MoKS5lcXVhbHMoIndpbjMyIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQkJLy8gV29ya2Fyb3VuZCBmb3IgTW96aWxsYSBhbmQgRmlyZWZveCByaWNoIHRleHQgZWRpdG9yIGZvY3VzCi0JCQkJCQkvLyBpc3N1ZS4KLQkJCQkJCWVkaXRvci5zZXRGb2N1cygpOwotCQkJCQl9Ci0JCQkJCWV4ZWN1dGVDb21tYW5kKFJpY2hUZXh0Q29tbWFuZC5TRVRfRk9DVVMpOwotCQkJCX0KLQkJCQloYXNGb2N1cyA9IHRydWU7Ci0JCQl9IGVsc2UgewotCQkJCWluaXRpYWxpemVkV2l0aEZvY3VzID0gdHJ1ZTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFRlbGxzIHRoZSBjb250cm9sIGl0IGRvZXMgbm90IGhhdmUgZm9jdXMuCi0JICovCi0JcHVibGljIHZvaWQgc2V0Qmx1cigpIHsKLQkJaWYgKGRlYnVnKSB7Ci0JCQlwcmludERlYnVnTWVzc2FnZSgic2V0Qmx1ciwgZWRpdGFibGU9IiArIGVkaXRhYmxlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWlmIChlZGl0b3IgIT0gbnVsbCkgewotCQkJaWYgKGluaXRpYWxpemVkKSB7Ci0JCQkJaGFzRm9jdXMgPSBmYWxzZTsKLQkJCX0gZWxzZSB7Ci0JCQkJaW5pdGlhbGl6ZWRXaXRoRm9jdXMgPSBmYWxzZTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIENoZWNrcyB3aGV0aGVyIHRoaXMgY29udHJvbCBoYXMgZm9jdXMuCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIGNvbnRyb2wgaGFzIHRoZSB1c2VyLWludGVyZmFjZSBmb2N1cwotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc0ZvY3VzKCkgewotCQlpZiAoZWRpdG9yICE9IG51bGwpIHsKLQkJCXJldHVybiBoYXNGb2N1czsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgYmFzZSBwYXRoIHVzZWQgZm9yIHJlc29sdmluZyB0ZXh0IGFuZCBpbWFnZSBsaW5rcy4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBiYXNlIHBhdGggdXNlZCBmb3IgcmVzb2x2aW5nIGxpbmtzIGluIHRoaXMgY29udHJvbAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0QmFzZVBhdGgoKSB7Ci0JCXJldHVybiBiYXNlUGF0aDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBiYXNlIFVSTCBvZiB0aGUgcmljaCB0ZXh0IGNvbnRyb2wgd2hvc2UgY29udGVudCB3YXMgbGFzdAotCSAqIGNvcGllZCB0byB0aGUgY2xpcGJvYXJkLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGJhc2UgVVJMIG9mIGEgcmljaCB0ZXh0IGNvbnRyb2wKLQkgKi8KLQlwdWJsaWMgVVJMIGdldENvcHlVUkwoKSB7Ci0JCXJldHVybiBjb3B5VVJMOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGJhc2UgVVJMIG9mIHRoZSByaWNoIHRleHQgY29udHJvbCB3aG9zZSBjb250ZW50IHdhcyBsYXN0IGNvcGllZAotCSAqIHRvIHRoZSBjbGlwYm9hcmQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29weVVSTCgpIHsKLQkJdHJ5IHsKLQkJCWNvcHlVUkwgPSBuZXcgRmlsZShiYXNlUGF0aCkudG9VUkwoKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWNvcHlVUkwgPSBudWxsOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZWRpdGFibGUgc3RhdGUuCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgY29udGVudCBpcyBlZGl0YWJsZQotCSAqLwotCXB1YmxpYyBib29sZWFuIGdldEVkaXRhYmxlKCkgewotCQlyZXR1cm4gZWRpdGFibGU7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgZWRpdGFibGUgc3RhdGUuCi0JICogCi0JICogQHBhcmFtIGVkaXRhYmxlCi0JICogICAgICAgICAgICB0aGUgZWRpdGFibGUgc3RhdGUKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFZGl0YWJsZShib29sZWFuIGVkaXRhYmxlKSB7Ci0JCXRoaXMuZWRpdGFibGUgPSBlZGl0YWJsZTsKLQkJaWYgKGluaXRpYWxpemVkKSB7Ci0JCQlleGVjdXRlQ29tbWFuZChSaWNoVGV4dENvbW1hbmQuU0VUX0VESVRBQkxFLCAiIiArIGVkaXRhYmxlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyoqCi0JICogQ2hlY2tzIHdoZXRoZXIgdGhlIGNvbnRlbnQgaGFzIGJlZW4gbW9kaWZpZWQuCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgY29udGVudCBoYXMgYmVlbiBtb2RpZmllZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGdldE1vZGlmaWVkKCkgewotCQlyZXR1cm4gbW9kaWZpZWQ7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgbW9kaWZpZWQgc3RhdGUuCi0JICogCi0JICogQHBhcmFtIG1vZGlmaWVkCi0JICogICAgICAgICAgICB0aGUgbW9kaWZpZWQgc3RhdGUKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNb2RpZmllZChib29sZWFuIG1vZGlmaWVkKSB7Ci0JCXRoaXMubW9kaWZpZWQgPSBtb2RpZmllZDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByaWNoIHRleHQgY29udGVudC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSByaWNoIHRleHQgY29udGVudCBmb3JtYXR0ZWQgaW4gYSBtYXJrdXAgbGFuZ3VhZ2UKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7Ci0JCWlmIChlZGl0b3IgIT0gbnVsbCAmJiBpbml0aWFsaXplZCkgewotCQkJdHJ5IHsKLQkJCQlleGVjdXRlQ29tbWFuZChSaWNoVGV4dENvbW1hbmQuR0VUX1RFWFQpOwotCQkJCWlmIChjdXJyZW50VGV4dCAhPSBudWxsICYmIGN1cnJlbnRUZXh0Lmxlbmd0aCgpID4gMCkgewotCQkJCQljdXJyZW50VGV4dCA9IGN1cnJlbnRUZXh0LnJlcGxhY2VBbGwoCi0JCQkJCQkJIjxQPiZuYnNwOzwvUD4iLCAiPGJyLz4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCQkJCi0JCQkJCWN1cnJlbnRUZXh0ID0gdGlkeVRleHQoY3VycmVudFRleHQpOwotCQkJCQljdXJyZW50VGV4dCA9IGZvcm1hdEhUTUwoY3VycmVudFRleHQpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWN1cnJlbnRUZXh0ID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQkJaWYgKGRlYnVnKSB7Ci0JCQkJCXByaW50RGVidWdNZXNzYWdlKCJnZXRUZXh0IiwgInRleHQ9IiwgY3VycmVudFRleHQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQl9Ci0JCQkJcmV0dXJuIGN1cnJlbnRUZXh0OwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlsb2dnZXIubG9nRXJyb3IoZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBmb3JtYXRIVE1MKFN0cmluZyB0ZXh0KSB7Ci0JCVN0cmluZyBmb3JtYXR0ZWRUZXh0OwotCQl0cnkgewotCQkJLy8gQ2FsbCBKVGlkeSB0byBmb3JtYXQgdGhlIHNvdXJjZSB0byBYSFRNTC4KLQkJCWZvcm1hdHRlZFRleHQgPSBodG1sRm9ybWF0dGVyLmZvcm1hdEhUTUwodGV4dCk7Ci0JCQlpZiAoaHRtbEZvcm1hdHRlci5nZXRMYXN0RXJyb3JTdHIoKSAhPSBudWxsKSB7Ci0JCQkJbG9nZ2VyLmxvZ0Vycm9yKGh0bWxGb3JtYXR0ZXIuZ2V0TGFzdEVycm9yU3RyKCkpOwotCQkJfQotCQkJcmV0dXJuIGZvcm1hdHRlZFRleHQ7Ci0JCX0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZSkgewotCQkJbG9nZ2VyLmxvZ0Vycm9yKGUpOwotCQl9Ci0JCXJldHVybiB0ZXh0OwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHJpY2ggdGV4dCBjb250ZW50LgotCSAqIAotCSAqIEBwYXJhbSB0ZXh0Ci0JICogICAgICAgICAgICB0aGUgcmljaCB0ZXh0IGNvbnRlbnQgZm9ybWF0dGVkIGluIGEgbWFya3VwIGxhbmd1YWdlCi0JICovCi0JcHVibGljIHZvaWQgc2V0VGV4dChTdHJpbmcgdGV4dCkgewotCQlpZiAoZWRpdG9yICE9IG51bGwpIHsKLQkJCWlmIChkZWJ1ZykgewotCQkJCXByaW50RGVidWdNZXNzYWdlKCJzZXRUZXh0IiwgInRleHQ9IiwgdGV4dCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJfQotCi0JCQlTdHJpbmcgbmV3VGV4dCA9IHRleHQ7Ci0JCQlpZiAobmV3VGV4dCAhPSBudWxsKSB7Ci0JCQkJbmV3VGV4dCA9IHRpZHlUZXh0KG5ld1RleHQpOwotCQkJCS8vIENhbGwgSlRpZHkgdG8gZm9ybWF0IHRoZSBzb3VyY2UgdG8gWEhUTUwuCi0JCQkJbmV3VGV4dCA9IGZvcm1hdEhUTUwobmV3VGV4dCk7Ci0JCQl9IGVsc2UgewotCQkJCW5ld1RleHQgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCi0JCQlpZiAoaW5pdGlhbGl6ZWQpIHsKLQkJCQltb2RpZmllZCA9ICFuZXdUZXh0LmVxdWFscyhjdXJyZW50VGV4dCk7Ci0JCQl9Ci0JCQlpbml0aWFsVGV4dCA9IG5ld1RleHQ7Ci0JCQlpZiAoaW5pdGlhbFRleHQuZXF1YWxzKCIiKSAmJiAhaXNJRSkgeyAvLyROT04tTkxTLTEkCi0JCQkJaW5pdGlhbFRleHQgPSAiPGJyIC8+IjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCi0JCQlpZiAoZGVidWcpIHsKLQkJCQlwcmludERlYnVnTWVzc2FnZSgKLQkJCQkJCSJzZXRUZXh0IiwgIm1vZGlmaWVkPSIgKyBtb2RpZmllZCArICIsIG5ld1RleHQ9IiwgbmV3VGV4dCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQl9Ci0KLQkJCWlmIChpbml0aWFsaXplZCkgewotCQkJCXRyeSB7Ci0JCQkJCWV4ZWN1dGVDb21tYW5kKFJpY2hUZXh0Q29tbWFuZC5TRVRfVEVYVCwgbmV3VGV4dCk7Ci0JCQkJCWV4ZWN1dGVDb21tYW5kKFJpY2hUZXh0Q29tbWFuZC5TRVRfRURJVEFCTEUsICIiICsgZWRpdGFibGUpOyAvLyROT04tTkxTLTEkCQkJCQotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCWxvZ2dlci5sb2dFcnJvcihlKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCWN1cnJlbnRUZXh0ID0gbmV3VGV4dDsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJlc3RvcmVzIHRoZSByaWNoIHRleHQgY29udGVudCBiYWNrIHRvIHRoZSBpbml0aWFsIHZhbHVlLgotCSAqLwotCXB1YmxpYyB2b2lkIHJlc3RvcmVUZXh0KCkgewotCQlzZXRUZXh0KGluaXRpYWxUZXh0KTsKLQkJbW9kaWZpZWQgPSBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgdGV4dC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBzZWxlY3RlZCB0ZXh0IG9yIDxjb2RlPiIiPC9jb2RlPiBpZiB0aGVyZSBpcyBubwotCSAqICAgICAgICAgaGFzU2VsZWN0aW9uCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTZWxlY3RlZFRleHQoKSB7Ci0JCS8vIGV4ZWN1dGVDb21tYW5kKFJpY2hUZXh0Q29tbWFuZC5HRVRfU0VMRUNURURfVEVYVCk7Ci0JCXJldHVybiByaWNoVGV4dFNlbGVjdGlvbi5nZXRUZXh0KCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuSVJpY2hUZXh0I2dldFNlbGVjdGVkKCkKLQkgKi8KLQlwdWJsaWMgUmljaFRleHRTZWxlY3Rpb24gZ2V0U2VsZWN0ZWQoKSB7Ci0JCXJldHVybiByaWNoVGV4dFNlbGVjdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFuIGFwcGxpY2F0aW9uIHNwZWNpZmljIHByb3BlcnR5IHZhbHVlLgotCSAqIAotCSAqIEBwYXJhbSBrZXkKLQkgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eQotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eSBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBpdCBoYXMgbm90Ci0JICogICAgICAgICBiZWVuIHNldAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0RGF0YShTdHJpbmcga2V5KSB7Ci0JCWlmIChlZGl0b3IgIT0gbnVsbCkgewotCQkJZWRpdG9yLmdldERhdGEoa2V5KTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIGFuIGFwcGxpY2F0aW9uIHNwZWNpZmljIHByb3BlcnR5IG5hbWUgYW5kIHZhbHVlLgotCSAqIAotCSAqIEBwYXJhbSBrZXkKLQkgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eQotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgdGhlIHByb3BlcnR5IHZhbHVlCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGF0YShTdHJpbmcga2V5LCBPYmplY3QgdmFsdWUpIHsKLQkJaWYgKGVkaXRvciAhPSBudWxsKSB7Ci0JCQllZGl0b3Iuc2V0RGF0YShrZXksIHZhbHVlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEV4ZWN1dGVzIHRoZSBnaXZlbiBKYXZhU2NyaXB0LgotCSAqIAotCSAqIEBwYXJhbSBzY3JpcHQKLQkgKiAgICAgICAgICAgIHRoZSBKYXZhU2NyaXB0IHRvIGV4ZWN1dGUKLQkgKiBAcmV0dXJuIGEgc3RhdHVzIGNvZGUgcmV0dXJuZWQgYnkgdGhlIGV4ZWN1dGVkIHNjcmlwdAotCSAqLwotCXByb3RlY3RlZCBpbnQgZXhlY3V0ZShmaW5hbCBTdHJpbmcgc2NyaXB0KSB7Ci0JCXN0YXR1cyA9IDA7Ci0JCWlmIChlZGl0b3IgIT0gbnVsbCAmJiBzY3JpcHQgIT0gbnVsbCAmJiBzY3JpcHQubGVuZ3RoKCkgPiAwKSB7Ci0JCQl0cnkgewotCQkJCWlmICghaXNJRSAmJiBwcm9jZXNzaW5nSlNFdmVudCkgewotCQkJCQlEaXNwbGF5LmdldEN1cnJlbnQoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCWVkaXRvci5leGVjdXRlKHNjcmlwdCk7Ci0JCQkJCQl9Ci0JCQkJCX0pOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWVkaXRvci5leGVjdXRlKHNjcmlwdCk7Ci0JCQkJfQotCQkJCWlmIChkZWJ1ZykgewotCQkJCQlwcmludERlYnVnTWVzc2FnZSgiZXhlY3V0ZSIsIHNjcmlwdCk7IC8vJE5PTi1OTFMtMSQJCQkJCi0JCQkJfQotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlTdHJpbmcgbXNnID0gIkZhaWxlZCB0byBleGVjdXRlICIgKyBzY3JpcHQ7IC8vJE5PTi1OTFMtMSQKLQkJCQlsb2dnZXIubG9nRXJyb3IobXNnLCBlKTsKLQkJCQlpZiAoZGVidWcpIHsKLQkJCQkJcHJpbnREZWJ1Z01lc3NhZ2UoImV4ZWN1dGUiLCBtc2cpOyAvLyROT04tTkxTLTEkCi0JCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBzdGF0dXM7Ci0JfQotCi0JLyoqCi0JICogRXhlY3V0ZXMgdGhlIGdpdmVuIHJpY2ggdGV4dCBjb21tYW5kLiBUaGUgc3VwcG9ydGVkIGNvbW1hbmQgc3RyaW5ncyBhcmUKLQkgKiBkZWZpbmVkIGluIDxjb2RlPlJpY2hUZXh0Q29tbWFuZDxjb2RlPi4KLQkgKiAKLQkgKiBAcGFyYW0JY29tbWFuZAkJYSByaWNoIHRleHQgY29tbWFuZCBzdHJpbmcuCi0JICogQHJldHVybglhIHN0YXR1cyBjb2RlIHJldHVybmVkIGJ5IHRoZSBleGVjdXRlZCBjb21tYW5kCi0JICovCi0JcHVibGljIGludCBleGVjdXRlQ29tbWFuZChTdHJpbmcgY29tbWFuZCkgewotCQlzdGF0dXMgPSAwOwotCQlpZiAoY29tbWFuZCAhPSBudWxsICYmIGNvbW1hbmQuZXF1YWxzKFJpY2hUZXh0Q29tbWFuZC5DTEVBUl9DT05URU5UKSkgewotCQkJU3RyaW5nIG9sZEluaXRpYWxUZXh0ID0gaW5pdGlhbFRleHQ7Ci0JCQlzZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotCQkJaW5pdGlhbFRleHQgPSBvbGRJbml0aWFsVGV4dDsKLQkJCXN0YXR1cyA9IDE7Ci0JCQltb2RpZmllZCA9IHRydWU7Ci0JCQlub3RpZnlNb2RpZnlMaXN0ZW5lcnMoKTsKLQkJfSBlbHNlIHsKLQkJCXN0YXR1cyA9IGV4ZWN1dGUoY29tbWFuZCArICIoKTsiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBzdGF0dXM7Ci0JfQotCi0JLyoqCi0JICogRXhlY3V0ZXMgdGhlIGdpdmVuIHJpY2ggdGV4dCBjb21tYW5kIHdpdGggYSBzaW5nbGUgcGFyYW1ldGVyLiBUaGUKLQkgKiBzdXBwb3J0ZWQgY29tbWFuZCBzdHJpbmdzIGFyZSBkZWZpbmVkIGluIDxjb2RlPlJpY2hUZXh0Q29tbWFuZDxjb2RlPi4KLQkgKiAKLQkgKiBAcGFyYW0JY29tbWFuZAkJYSByaWNoIHRleHQgY29tbWFuZCBzdHJpbmcKLQkgKiBAcGFyYW0JcGFyYW0JCWEgcGFyYW1ldGVyIGZvciB0aGUgY29tbWFuZCBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqIEByZXR1cm4JYSBzdGF0dXMgY29kZSByZXR1cm5lZCBieSB0aGUgZXhlY3V0ZWQgY29tbWFuZAotCSAqLwotCXB1YmxpYyBpbnQgZXhlY3V0ZUNvbW1hbmQoU3RyaW5nIGNvbW1hbmQsIFN0cmluZyBwYXJhbSkgewotCQlpZiAocGFyYW0gPT0gbnVsbCkgewotCQkJcmV0dXJuIGV4ZWN1dGVDb21tYW5kKGNvbW1hbmQpOwotCQl9Ci0JCXJldHVybiBleGVjdXRlKGNvbW1hbmQgKyAiKCciICsgZm9ybWF0VGV4dChwYXJhbSkgKyAiJyk7Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIEV4ZWN1dGVzIHRoZSBnaXZlbiByaWNoIHRleHQgY29tbWFuZCB3aXRoIGFuIGFycmF5IG9mIHBhcmFtZXRlcnMuIFRoZQotCSAqIHN1cHBvcnRlZCBjb21tYW5kIHN0cmluZ3MgYXJlIGRlZmluZWQgaW4gPGNvZGU+UmljaFRleHRDb21tYW5kPGNvZGU+LgotCSAqIAotCSAqIEBwYXJhbQljb21tYW5kCQlhIHJpY2ggdGV4dCBjb21tYW5kIHN0cmluZwotCSAqIEBwYXJhbQlwYXJhbXMJCWFuIGFycmF5IG9mIHBhcmFtZXRlcnMgZm9yIHRoZSBjb21tYW5kIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICogQHJldHVybglhIHN0YXR1cyBjb2RlIHJldHVybmVkIGJ5IHRoZSBleGVjdXRlZCBjb21tYW5kCi0JICovCi0JcHVibGljIGludCBleGVjdXRlQ29tbWFuZChTdHJpbmcgY29tbWFuZCwgU3RyaW5nW10gcGFyYW1zKSB7Ci0JCWlmIChwYXJhbXMgPT0gbnVsbCB8fCBwYXJhbXMubGVuZ3RoID09IDApIHsKLQkJCXJldHVybiBleGVjdXRlQ29tbWFuZChjb21tYW5kKTsKLQkJfQotCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWludCBwYXJhbXNMZW5ndGggPSBwYXJhbXMubGVuZ3RoOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcmFtc0xlbmd0aDsgaSsrKSB7Ci0JCQlzYi5hcHBlbmQoJ1wnJykuYXBwZW5kKGZvcm1hdFRleHQocGFyYW1zW2ldKSkuYXBwZW5kKCdcJycpOwotCQkJaWYgKGkgPCBwYXJhbXNMZW5ndGggLSAxKSB7Ci0JCQkJc2IuYXBwZW5kKCcsJyk7Ci0JCQl9Ci0JCX0KLQkJU3RyaW5nIHBhcmFtID0gc2IudG9TdHJpbmcoKTsKLQkJcmV0dXJuIGV4ZWN1dGUoY29tbWFuZCArICIoIiArIHBhcmFtICsgIik7Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIERpc3Bvc2VzIHRoZSBvcGVyYXRpbmcgc3lzdGVtIHJlc291cmNlcyBhbGxvY2F0ZWQgYnkgdGhlIGNvbnRyb2wuCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJaWYgKGNvbnRleHRNZW51ICE9IG51bGwgJiYgIWNvbnRleHRNZW51LmlzRGlzcG9zZWQoKSkgewotCQkJY29udGV4dE1lbnUuZGlzcG9zZSgpOwotCQkJY29udGV4dE1lbnUgPSBudWxsOwotCQl9Ci0JCWlmIChsaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJbGlzdGVuZXJzLmNsZWFyKCk7Ci0JCQlsaXN0ZW5lcnMgPSBudWxsOwotCQl9Ci0JCWlmIChtb2RpZnlMaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJbW9kaWZ5TGlzdGVuZXJzLmNsZWFyKCk7Ci0JCQltb2RpZnlMaXN0ZW5lcnMgPSBudWxsOwotCQl9Ci0JCWlmIChodG1sRm9ybWF0dGVyICE9IG51bGwpIHsKLQkJCWh0bWxGb3JtYXR0ZXIgPSBudWxsOwotCQl9Ci0JCWlmICh0aGlzLmZpbmRSZXBsYWNlQWN0aW9uICE9IG51bGwpIHsKLQkJCXRoaXMuZmluZFJlcGxhY2VBY3Rpb24uZGlzcG9zZSgpOwotCQkJdGhpcy5maW5kUmVwbGFjZUFjdGlvbiA9IG51bGw7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDaGVja3Mgd2hldGhlciB0aGlzIGNvbnRyb2wgaGFzIGJlZW4gZGlzcG9zZWQuCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIGNvbnRyb2wgaXMgZGlzcG9zZWQgc3VjY2Vzc2Z1bGx5Ci0JICovCi0JcHVibGljIGJvb2xlYW4gaXNEaXNwb3NlZCgpIHsKLQkJcmV0dXJuIGVkaXRvci5pc0Rpc3Bvc2VkKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbW9kaWZ5IGxpc3RlbmVycyBhdHRhY2hlZCB0byB0aGlzIGNvbnRyb2wuCi0JICogCi0JICogQHJldHVybiBhbiBpdGVyYXRvciBmb3IgcmV0cmlldmluZyB0aGUgbW9kaWZ5IGxpc3RlbmVycwotCSAqLwotCXB1YmxpYyBJdGVyYXRvcjxNb2RpZnlMaXN0ZW5lcj4gZ2V0TW9kaWZ5TGlzdGVuZXJzKCkgewotCQlyZXR1cm4gbW9kaWZ5TGlzdGVuZXJzLml0ZXJhdG9yKCk7Ci0JfQotCi0JLyoqCi0JICogQWRkcyBhIGxpc3RlbmVyIHRvIHRoZSBjb2xsZWN0aW9uIG9mIGxpc3RlbmVycyB3aG8gd2lsbCBiZSBub3RpZmllZCB3aGVuCi0JICoga2V5cyBhcmUgcHJlc3NlZCBhbmQgcmVsZWFzZWQgd2l0aGluIHRoaXMgY29udHJvbC4KLQkgKiAKLQkgKiBAcGFyYW0gbGlzdGVuZXIKLQkgKiAgICAgICAgICAgIHRoZSBsaXN0ZW5lciB3aGljaCBzaG91bGQgYmUgbm90aWZpZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRLZXlMaXN0ZW5lcihLZXlMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlpZiAoZWRpdG9yICE9IG51bGwpIHsKLQkJCWVkaXRvci5hZGRLZXlMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmVzIGEgbGlzdGVuZXIgZnJvbSB0aGUgY29sbGVjdGlvbiBvZiBsaXN0ZW5lcnMgd2hvIHdpbGwgYmUgbm90aWZpZWQKLQkgKiB3aGVuIGtleXMgYXJlIHByZXNzZWQgYW5kIHJlbGVhc2VkIHdpdGhpbiB0aGlzIGNvbnRyb2wuCi0JICogCi0JICogQHBhcmFtIGxpc3RlbmVyCi0JICogICAgICAgICAgICB0aGUgbGlzdGVuZXIgd2hpY2ggc2hvdWxkIG5vIGxvbmdlciBiZSBub3RpZmllZAotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUtleUxpc3RlbmVyKEtleUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWlmIChlZGl0b3IgIT0gbnVsbCkgewotCQkJZWRpdG9yLnJlbW92ZUtleUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEFkZHMgYSBsaXN0ZW5lciB0byB0aGUgY29sbGVjdGlvbiBvZiBsaXN0ZW5lcnMgd2hvIHdpbGwgYmUgbm90aWZpZWQgd2hlbgotCSAqIHRoZSBjb250ZW50IG9mIHRoaXMgY29udHJvbCBpcyBtb2RpZmllZC4KLQkgKiAKLQkgKiBAcGFyYW0gbGlzdGVuZXIKLQkgKiAgICAgICAgICAgIHRoZSBsaXN0ZW5lciB3aGljaCBzaG91bGQgYmUgbm90aWZpZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRNb2RpZnlMaXN0ZW5lcihNb2RpZnlMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlpZiAoZWRpdG9yICE9IG51bGwgJiYgbGlzdGVuZXIgIT0gbnVsbAotCQkJCSYmICFtb2RpZnlMaXN0ZW5lcnMuY29udGFpbnMobGlzdGVuZXIpKSB7Ci0JCQltb2RpZnlMaXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJlbW92ZXMgYSBsaXN0ZW5lciBmcm9tIHRoZSBjb2xsZWN0aW9uIG9mIGxpc3RlbmVycyB3aG8gd2lsbCBiZSBub3RpZmllZAotCSAqIHdoZW4gdGhlIGNvbnRlbnQgb2YgdGhpcyBjb250cm9sIGlzIG1vZGlmaWVkLgotCSAqIAotCSAqIEBwYXJhbSBsaXN0ZW5lcgotCSAqICAgICAgICAgICAgdGhlIGxpc3RlbmVyIHdoaWNoIHNob3VsZCBubyBsb25nZXIgYmUgbm90aWZpZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVNb2RpZnlMaXN0ZW5lcihNb2RpZnlMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlpZiAoZWRpdG9yICE9IG51bGwgJiYgbGlzdGVuZXIgIT0gbnVsbAotCQkJCSYmIG1vZGlmeUxpc3RlbmVycy5jb250YWlucyhsaXN0ZW5lcikpIHsKLQkJCW1vZGlmeUxpc3RlbmVycy5yZW1vdmUobGlzdGVuZXIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQWRkcyB0aGUgbGlzdGVuZXIgdG8gdGhlIGNvbGxlY3Rpb24gb2YgbGlzdGVuZXJzIHdobyB3aWxsIGJlIG5vdGlmZWQgd2hlbgotCSAqIHRoaXMgY29udHJvbCBpcyBkaXNwb3NlZC4KLQkgKiAKLQkgKiBAcGFyYW0gbGlzdGVuZXIKLQkgKiAgICAgICAgICAgIHRoZSBsaXN0ZW5lciB3aGljaCBzaG91bGQgYmUgbm90aWZpZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGREaXNwb3NlTGlzdGVuZXIoRGlzcG9zZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWlmIChlZGl0b3IgIT0gbnVsbCkgewotCQkJZWRpdG9yLmFkZERpc3Bvc2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmVzIGEgbGlzdGVuZXIgZnJvbSB0aGUgY29sbGVjdGlvbiBvZiBsaXN0ZW5lcnMgd2hvIHdpbGwgYmUgbm90aWZpZWQKLQkgKiB3aGVuIHRoaXMgY29udHJvbCBpcyBkaXNwb3NlZC4KLQkgKiAKLQkgKiBAcGFyYW0gbGlzdGVuZXIKLQkgKiAgICAgICAgICAgIHRoZSBsaXN0ZW5lciB3aGljaCBzaG91bGQgbm8gbG9uZ2VyIGJlIG5vdGlmaWVkCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlRGlzcG9zZUxpc3RlbmVyKERpc3Bvc2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlpZiAoZWRpdG9yICE9IG51bGwpIHsKLQkJCWVkaXRvci5yZW1vdmVEaXNwb3NlTGlzdGVuZXIobGlzdGVuZXIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQWRkcyBhIGxpc3RlbmVyIHRvIHRoZSBjb2xsZWN0aW9uIG9mIGxpc3RlbmVycyB3aG8gd2lsbCBiZSBub3RpZmllZCB3aGVuCi0JICogaGVscCBldmVudHMgYXJlIGdlbmVyYXRlZCBmb3IgdGhpcyBjb250cm9sLgotCSAqIAotCSAqIEBwYXJhbSBsaXN0ZW5lcgotCSAqICAgICAgICAgICAgdGhlIGxpc3RlbmVyIHdoaWNoIHNob3VsZCBiZSBub3RpZmllZAotCSAqLwotCXB1YmxpYyB2b2lkIGFkZEhlbHBMaXN0ZW5lcihIZWxwTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJaWYgKGVkaXRvciAhPSBudWxsKSB7Ci0JCQllZGl0b3IuYWRkSGVscExpc3RlbmVyKGxpc3RlbmVyKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJlbW92ZXMgYSBsaXN0ZW5lciBmcm9tIHRoZSBjb2xsZWN0aW9uIG9mIGxpc3RlbmVycyB3aG8gd2lsbCBiZSBub3RpZmllZAotCSAqIHdoZW4gaGVscCBldmVudHMgYXJlIGdlbmVyYXRlZCBmb3IgdGhpcyBjb250cm9sLgotCSAqIAotCSAqIEBwYXJhbSBsaXN0ZW5lcgotCSAqICAgICAgICAgICAgdGhlIGxpc3RlbmVyIHdoaWNoIHNob3VsZCBubyBsb25nZXIgYmUgbm90aWZpZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVIZWxwTGlzdGVuZXIoSGVscExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWlmIChlZGl0b3IgIT0gbnVsbCkgewotCQkJZWRpdG9yLnJlbW92ZUhlbHBMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBZGRzIHRoZSBsaXN0ZW5lciB0byB0aGUgY29sbGVjdGlvbiBvZiBsaXN0ZW5lcnMgd2hvIHdpbGwgYmUgbm90aWZlZCB3aGVuCi0JICogYW4gZXZlbnQgb2YgdGhlIGdpdmVuIHR5cGUgb2NjdXJzIHdpdGhpbiB0aGlzIGNvbnRyb2wuCi0JICogCi0JICogQHBhcmFtIGV2ZW50VHlwZQotCSAqICAgICAgICAgICAgdGhlIHR5cGUgb2YgZXZlbnQgdG8gbGlzdGVuIGZvcgotCSAqIEBwYXJhbSBsaXN0ZW5lcgotCSAqICAgICAgICAgICAgdGhlIGxpc3RlbmVyIHdoaWNoIHNob3VsZCBiZSBub3RpZmllZCB3aGVuIHRoZSBldmVudCBvY2N1cnMKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcihpbnQgZXZlbnRUeXBlLCBMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlpZiAoZWRpdG9yICE9IG51bGwgJiYgIWxpc3RlbmVycy5jb250YWluc0tleShsaXN0ZW5lcikpIHsKLQkJCWlmIChldmVudFR5cGUgIT0gU1dULlNFTEVDVEVEKSB7Ci0JCQkJaWYgKGVkaXRvckNvbnRyb2wgPT0gbnVsbAotCQkJCQkJfHwgKGV2ZW50VHlwZSAhPSBTV1QuQWN0aXZhdGUKLQkJCQkJCQkJJiYgZXZlbnRUeXBlICE9IFNXVC5EZWFjdGl2YXRlCi0JCQkJCQkJCSYmIGV2ZW50VHlwZSAhPSBTV1QuRm9jdXNJbiAmJiBldmVudFR5cGUgIT0gU1dULkZvY3VzT3V0KSkgewotCQkJCQllZGl0b3IuYWRkTGlzdGVuZXIoZXZlbnRUeXBlLCBsaXN0ZW5lcik7Ci0JCQkJfQotCQkJfQotCQkJbGlzdGVuZXJzLnB1dChsaXN0ZW5lciwgbmV3IFJpY2hUZXh0TGlzdGVuZXIoZXZlbnRUeXBlLCBsaXN0ZW5lcikpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlcyB0aGUgbGlzdGVuZXIgZnJvbSB0aGUgY29sbGVjdGlvbiBvZiBsaXN0ZW5lcnMgd2hvIHdpbGwgYmUgbm90aWZlZAotCSAqIHdoZW4gYW4gZXZlbnQgb2YgdGhlIGdpdmVuIHR5cGUgb2NjdXJzIHdpdGhpbiB0aGlzIGNvbnRyb2wuCi0JICogCi0JICogQHBhcmFtIGV2ZW50VHlwZQotCSAqICAgICAgICAgICAgdGhlIHR5cGUgb2YgZXZlbnQgdG8gbGlzdGVuIGZvcgotCSAqIEBwYXJhbSBsaXN0ZW5lcgotCSAqICAgICAgICAgICAgdGhlIGxpc3RlbmVyIHdoaWNoIHNob3VsZCBubyBsb25nZXIgYmUgbm90aWZpZWQgd2hlbiB0aGUgZXZlbnQKLQkgKiAgICAgICAgICAgIG9jY3VycwotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKGludCBldmVudFR5cGUsIExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWlmIChlZGl0b3IgIT0gbnVsbCAmJiBsaXN0ZW5lcnMuY29udGFpbnNLZXkobGlzdGVuZXIpKSB7Ci0JCQlpZiAoZWRpdG9yQ29udHJvbCA9PSBudWxsCi0JCQkJCXx8IChldmVudFR5cGUgIT0gU1dULkFjdGl2YXRlCi0JCQkJCQkJJiYgZXZlbnRUeXBlICE9IFNXVC5EZWFjdGl2YXRlCi0JCQkJCQkJJiYgZXZlbnRUeXBlICE9IFNXVC5Gb2N1c0luICYmIGV2ZW50VHlwZSAhPSBTV1QuRm9jdXNPdXQpKSB7Ci0JCQkJZWRpdG9yLnJlbW92ZUxpc3RlbmVyKGV2ZW50VHlwZSwgbGlzdGVuZXIpOwotCQkJfQotCQkJbGlzdGVuZXJzLnJlbW92ZShsaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBldmVudCBsaXN0ZW5lcnMgYXR0YWNoZWQgdG8gdGhpcyBjb250cm9sLgotCSAqIAotCSAqIEByZXR1cm4gYW4gaXRlcmF0b3IgZm9yIHJldHJpZXZpbmcgdGhlIGV2ZW50IGxpc3RlbmVycyBhdHRhY2hlZCB0byB0aGlzCi0JICogICAgICAgICBjb250cm9sCi0JICovCi0JcHVibGljIEl0ZXJhdG9yPFJpY2hUZXh0TGlzdGVuZXI+IGdldExpc3RlbmVycygpIHsKLQkJcmV0dXJuIGxpc3RlbmVycy52YWx1ZXMoKS5pdGVyYXRvcigpOwotCX0KLQotCS8qKgotCSAqIEFkZHMgdGhlIGxpc3RlbmVyIHRvIG1vbml0b3IgZXZlbnRzIGFuZCBzdGF0dXMgc2VudCBieSB0aGUgdW5kZXJseWluZwotCSAqIERIVE1MIGVkaXRvci4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRTdGF0dXNUZXh0TGlzdGVuZXIoKSB7Ci0JCWVkaXRvci5hZGRTdGF0dXNUZXh0TGlzdGVuZXIobmV3IFN0YXR1c1RleHRMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGNoYW5nZWQoU3RhdHVzVGV4dEV2ZW50IGV2ZW50KSB7Ci0JCQkJU3RyaW5nIGV2ZW50VGV4dCA9IGV2ZW50LnRleHQ7Ci0JCQkJaW50IGV2ZW50VGV4dExlbmd0aCA9IGV2ZW50VGV4dC5sZW5ndGgoKTsKLQkJCQlpZiAoZXZlbnRUZXh0LnN0YXJ0c1dpdGgoU1RBVFVTX1BSRUZJWCkKLQkJCQkJCSYmIGV2ZW50VGV4dExlbmd0aCA+IFNUQVRVU19QUkVGSVhfTEVOR1RIKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlwcm9jZXNzaW5nSlNFdmVudCA9IHRydWU7Ci0JCQkJCQlpbnQgZW5kU3RhdHVzSW5kZXggPSBTVEFUVVNfUFJFRklYX0xFTkdUSCArIDE7Ci0JCQkJCQlpZiAoZXZlbnRUZXh0Lmxlbmd0aCgpID4gU1RBVFVTX1BSRUZJWF9MRU5HVEggKyAxCi0JCQkJCQkJCSYmIENoYXJhY3Rlci5pc0RpZ2l0KGV2ZW50VGV4dAotCQkJCQkJCQkJCS5jaGFyQXQoZW5kU3RhdHVzSW5kZXgpKSkgewotCQkJCQkJCWVuZFN0YXR1c0luZGV4Kys7Ci0JCQkJCQl9Ci0JCQkJCQlpbnQgc3RhdHVzVHlwZSA9IEludGVnZXIucGFyc2VJbnQoZXZlbnRUZXh0LnN1YnN0cmluZygKLQkJCQkJCQkJU1RBVFVTX1BSRUZJWF9MRU5HVEgsIGVuZFN0YXR1c0luZGV4KSk7Ci0JCQkJCQlzd2l0Y2ggKHN0YXR1c1R5cGUpIHsKLQkJCQkJCWNhc2UgU1RBVFVTX05PUDoKLQkJCQkJCQlicmVhazsKLQkJCQkJCWNhc2UgU1RBVFVTX0lOSVRJQUxJWkVEOgotCQkJCQkJCWlmICghaW5pdGlhbGl6ZWQpIHsKLQkJCQkJCQkJaW5pdGlhbGl6ZWQgPSB0cnVlOwotCQkJCQkJCQlpZiAoZGVidWcpIHsKLQkJCQkJCQkJCXByaW50RGVidWdNZXNzYWdlKAotCQkJCQkJCQkJCQkic3RhdHVzVGV4dExpc3RlbmVyIiwgIlNUQVRVU19JTklUSUFMSVpFRCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCQkJfQotCQkJCQkJCQlpZiAoIVBsYXRmb3JtLmdldE9TKCkuZXF1YWxzKCJ3aW4zMiIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCS8vIFdvcmthcm91bmQgTW96aWxsYSdhIElGUkFNRQotCQkJCQkJCQkJLy8gaGVpZ2h0IGlzc3VlLgotCQkJCQkJCQkJZXhlY3V0ZUNvbW1hbmQoUmljaFRleHRDb21tYW5kLlNFVF9IRUlHSFQsCi0JCQkJCQkJCQkJCSIiICsgZWRpdG9yLmdldEJvdW5kcygpLmhlaWdodCk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJfQotCQkJCQkJCQlleGVjdXRlQ29tbWFuZChSaWNoVGV4dENvbW1hbmQuU0VUX1RFWFQsCi0JCQkJCQkJCQkJY3VycmVudFRleHQpOwotCQkJCQkJCQlpZiAoaW5pdGlhbGl6ZWRXaXRoRm9jdXMpIHsKLQkJCQkJCQkJCXNldEZvY3VzKCk7Ci0JCQkJCQkJCX0KLQkJCQkJCQkJaWYgKCFlZGl0YWJsZSkgewotCQkJCQkJCQkJZXhlY3V0ZUNvbW1hbmQoCi0JCQkJCQkJCQkJCVJpY2hUZXh0Q29tbWFuZC5TRVRfRURJVEFCTEUsCi0JCQkJCQkJCQkJCSIiICsgZWRpdGFibGUpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQljYXNlIFNUQVRVU19NT0RJRklFRDoKLQkJCQkJCQlpZiAoZGVidWcpIHsKLQkJCQkJCQkJcHJpbnREZWJ1Z01lc3NhZ2UoCi0JCQkJCQkJCQkJInN0YXR1c1RleHRMaXN0ZW5lciIsICJTVEFUVVNfTU9ESUZJRUQiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQkJfQotCQkJCQkJCWNoZWNrTW9kaWZ5KCk7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQljYXNlIFNUQVRVU19HRVRfVEVYVDoKLQkJCQkJCQlpZiAoZXZlbnRUZXh0TGVuZ3RoID49IFNUQVRVU19QUkVGSVhfTEVOR1RIICsgMikgewotCQkJCQkJCQljdXJyZW50VGV4dCA9IGV2ZW50VGV4dAotCQkJCQkJCQkJCS5zdWJzdHJpbmcoU1RBVFVTX1BSRUZJWF9MRU5HVEggKyAyKTsKLQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQljdXJyZW50VGV4dCA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJfQotCQkJCQkJCWlmIChkZWJ1ZykgewotCQkJCQkJCQlwcmludERlYnVnTWVzc2FnZSgKLQkJCQkJCQkJCQkic3RhdHVzVGV4dExpc3RlbmVyIiwgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJCSJTVEFUVVNfR0VUX1RFWFQsIGN1cnJlbnRUZXh0PSIsIGN1cnJlbnRUZXh0KTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCX0KLQkJCQkJCQlicmVhazsKLQkJCQkJCWNhc2UgU1RBVFVTX0tFWV9ET1dOOgotCQkJCQkJCWlmIChldmVudFRleHRMZW5ndGggPj0gU1RBVFVTX1BSRUZJWF9MRU5HVEggKyAyKSB7Ci0JCQkJCQkJCVN0cmluZyBjbWQgPSBldmVudFRleHQKLQkJCQkJCQkJCQkuc3Vic3RyaW5nKFNUQVRVU19QUkVGSVhfTEVOR1RIICsgMik7Ci0JCQkJCQkJCWlmIChkZWJ1ZykgewotCQkJCQkJCQkJcHJpbnREZWJ1Z01lc3NhZ2UoInN0YXR1c1RleHRMaXN0ZW5lciIsIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCQkJIlNUQVRVU19LRVlfRE9XTiwgY21kPSIgKyBjbWQpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJCX0KLQkJCQkJCQkJaWYgKGNtZC5lcXVhbHMoUmljaFRleHRDb21tYW5kLkNPUFkpKSB7Ci0JCQkJCQkJCQlzZXRDb3B5VVJMKCk7Ci0JCQkJCQkJCX0gZWxzZSBpZiAoY21kLmVxdWFscyhSaWNoVGV4dENvbW1hbmQuQ1VUKSkgewotCQkJCQkJCQkJc2V0Q29weVVSTCgpOwotCQkJCQkJCQkJQ3V0QWN0aW9uIGFjdGlvbiA9IG5ldyBDdXRBY3Rpb24oCi0JCQkJCQkJCQkJCVJpY2hUZXh0LnRoaXMpOwotCQkJCQkJCQkJYWN0aW9uLmV4ZWN1dGUoUmljaFRleHQudGhpcyk7Ci0JCQkJCQkJCX0gZWxzZSBpZiAoY21kCi0JCQkJCQkJCQkJLmVxdWFscyhSaWNoVGV4dENvbW1hbmQuRklORF9URVhUKSkgewotCQkJCQkJCQkJZ2V0RmluZFJlcGxhY2VBY3Rpb24oKS5leGVjdXRlKAotCQkJCQkJCQkJCQlSaWNoVGV4dC50aGlzKTsKLQkJCQkJCQkJfSBlbHNlIGlmIChjbWQuZXF1YWxzKFJpY2hUZXh0Q29tbWFuZC5QQVNURSkpIHsKLQkJCQkJCQkJCVBhc3RlQWN0aW9uIGFjdGlvbiA9IG5ldyBQYXN0ZUFjdGlvbigKLQkJCQkJCQkJCQkJUmljaFRleHQudGhpcyk7Ci0JCQkJCQkJCQlhY3Rpb24uZXhlY3V0ZShSaWNoVGV4dC50aGlzKTsKLQkJCQkJCQkJfSBlbHNlIGlmIChjbWQuZXF1YWxzKFJpY2hUZXh0Q29tbWFuZC5TQVZFKSkgewotCQkJCQkJCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKQotCQkJCQkJCQkJCQkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkKLQkJCQkJCQkJCQkJLmdldEFjdGl2ZVBhZ2UoKS5nZXRBY3RpdmVFZGl0b3IoKQotCQkJCQkJCQkJCQkuZG9TYXZlKG51bGwpOwotCQkJCQkJCQl9IGVsc2UgaWYgKGNtZC5lcXVhbHMoUmljaFRleHRDb21tYW5kLlNBVkVfQUxMKSkgewotCQkJCQkJCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKQotCQkJCQkJCQkJCQkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkKLQkJCQkJCQkJCQkJLmdldEFjdGl2ZVBhZ2UoKS5zYXZlQWxsRWRpdG9ycygKLQkJCQkJCQkJCQkJCQlmYWxzZSk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQljYXNlIFNUQVRVU19LRVlfVVA6Ci0JCQkJCQkJaWYgKGRlYnVnKSB7Ci0JCQkJCQkJCXByaW50RGVidWdNZXNzYWdlKCJzdGF0dXNUZXh0TGlzdGVuZXIiLCAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQkJIlNUQVRVU19LRVlfVVAsIG1vZGlmaWVkPSIgKyBtb2RpZmllZCk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQl9Ci0JCQkJCQkJY2hlY2tNb2RpZnkoKTsKLQkJCQkJCQlicmVhazsKLQkJCQkJCWNhc2UgU1RBVFVTX1NFTEVDVF9URVhUOgotCQkJCQkJCWlmIChldmVudFRleHRMZW5ndGggPj0gU1RBVFVTX1BSRUZJWF9MRU5HVEggKyAyKSB7Ci0JCQkJCQkJCVN0cmluZ1tdIHN0cmluZ3MgPSBldmVudFRleHQuc3Vic3RyaW5nKAotCQkJCQkJCQkJCVNUQVRVU19QUkVGSVhfTEVOR1RIICsgMikuc3BsaXQoCi0JCQkJCQkJCQkJIlxcJCIsIDUpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCQlyaWNoVGV4dFNlbGVjdGlvbi5zZXRGb250TmFtZShzdHJpbmdzWzBdKTsKLQkJCQkJCQkJCXJpY2hUZXh0U2VsZWN0aW9uLnNldEZvbnRTaXplKHN0cmluZ3NbMV0pOwotCQkJCQkJCQkJcmljaFRleHRTZWxlY3Rpb24uc2V0QmxvY2tTdHlsZShzdHJpbmdzWzJdKTsKLQkJCQkJCQkJCXJpY2hUZXh0U2VsZWN0aW9uLnNldEZsYWdzKEludGVnZXIKLQkJCQkJCQkJCQkJLnBhcnNlSW50KHN0cmluZ3NbM10pKTsKLQkJCQkJCQkJCXJpY2hUZXh0U2VsZWN0aW9uLnNldFRleHQoc3RyaW5nc1s0XSk7Ci0JCQkJCQkJCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJCQlsb2dnZXIubG9nRXJyb3IoZSk7Ci0JCQkJCQkJCX0KLQkJCQkJCQkJaWYgKGRlYnVnKSB7Ci0JCQkJCQkJCQlwcmludERlYnVnTWVzc2FnZSgKLQkJCQkJCQkJCQkJInNlbGVjdGlvblN0YXR1c0xpc3RlbmVyIiwgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJCQkiY3VycmVudCBzZWxlY3Rpb24gaXM9IiArIHJpY2hUZXh0U2VsZWN0aW9uKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQl9Ci0KLQkJCQkJCQkJaGFzU2VsZWN0aW9uID0gdHJ1ZTsKLQkJCQkJCQkJaWYgKGhhc0ZvY3VzKCkpCi0JCQkJCQkJCQlub3RpZnlMaXN0ZW5lcnMoU1dULlNFTEVDVEVELCBuZXcgRXZlbnQoKSk7Ci0JCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJcmljaFRleHRTZWxlY3Rpb24uc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJaGFzU2VsZWN0aW9uID0gZmFsc2U7Ci0JCQkJCQkJfQotCQkJCQkJCWlmIChkZWJ1ZykgewotCQkJCQkJCQlwcmludERlYnVnTWVzc2FnZSgKLQkJCQkJCQkJCQkic3RhdHVzVGV4dExpc3RlbmVyIiwgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJCSJTVEFUVVNfU0VMRUNUX1RFWFQsIHNlbGVjdGVkVGV4dD0iLCByaWNoVGV4dFNlbGVjdGlvbi5nZXRUZXh0KCkpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJfQotCQkJCQkJCWJyZWFrOwotCQkJCQkJY2FzZSBTVEFUVVNfU0VMRUNUX0NPTlRST0w6Ci0JCQkJCQkJaWYgKGRlYnVnKSB7Ci0JCQkJCQkJCXByaW50RGVidWdNZXNzYWdlKCJzdGF0dXNUZXh0TGlzdGVuZXIiLCAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQkJIlNUQVRVU19TRUxFQ1RfQ09OVFJPTCwgY29udHJvbCBzZWxlY3RlZCIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJfQotCQkJCQkJCWhhc1NlbGVjdGlvbiA9IHRydWU7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQljYXNlIFNUQVRVU19TRUxFQ1RfTk9ORToKLQkJCQkJCQlpZiAoZGVidWcpIHsKLQkJCQkJCQkJcHJpbnREZWJ1Z01lc3NhZ2UoInN0YXR1c1RleHRMaXN0ZW5lciIsIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCQkiU1RBVFVTX1NFTEVDVF9OT05FLCBubyBzZWxlY3Rpb24iKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCX0KLQkJCQkJCQloYXNTZWxlY3Rpb24gPSBmYWxzZTsKLQkJCQkJCQlicmVhazsKLQkJCQkJCWNhc2UgU1RBVFVTX0VYRUNfQ01EOgotCQkJCQkJCWlmIChldmVudFRleHRMZW5ndGggPj0gU1RBVFVTX1BSRUZJWF9MRU5HVEggKyAzKSB7Ci0JCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCQlzdGF0dXMgPSBJbnRlZ2VyLnBhcnNlSW50KGV2ZW50VGV4dAotCQkJCQkJCQkJCQkuc3Vic3RyaW5nKAotCQkJCQkJCQkJCQkJCVNUQVRVU19QUkVGSVhfTEVOR1RIICsgMiwKLQkJCQkJCQkJCQkJCQlTVEFUVVNfUFJFRklYX0xFTkdUSCArIDMpKTsKLQkJCQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQkJCXN0YXR1cyA9IC0xOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJCWlmIChkZWJ1ZyAmJiBzdGF0dXMgIT0gMSkgewotCQkJCQkJCQlwcmludERlYnVnTWVzc2FnZSgic3RhdHVzVGV4dExpc3RlbmVyIiwgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJCSJTVEFUVVNfRVhFQ19DTUQsIHN0YXR1cz0iICsgc3RhdHVzKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCX0KLQkJCQkJCQlicmVhazsKLQkJCQkJCWNhc2UgU1RBVFVTX1JFRk9STUFUX0xJTktTOgotCQkJCQkJCWlmIChkZWJ1ZykgewotCQkJCQkJCQlwcmludERlYnVnTWVzc2FnZSgKLQkJCQkJCQkJCQkic3RhdHVzVGV4dExpc3RlbmVyIiwgIlNUQVRVU19SRUZPUk1BVF9MSU5LUyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCQl9Ci0JCQkJCQkJaWYgKFBsYXRmb3JtLmdldE9TKCkuZXF1YWxzKCJ3aW4zMiIpKSB7IC8vJE5PTi1OTFMtMSQgCi0JCQkJCQkJCS8vIFdvcmthcm91bmQgdGhlIGRyYWcgYW5kIGRyb3AgaXNzdWUgd2l0aCBEQkNTCi0JCQkJCQkJCS8vIGNoYXJhY3RlcnMuCi0JCQkJCQkJCWlmIChtb2RpZmllZCkgewotCQkJCQkJCQkJc2V0VGV4dChnZXRUZXh0KCkpOwotCQkJCQkJCQkJbW9kaWZpZWQgPSB0cnVlOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJCWNoZWNrTW9kaWZ5KCk7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQl9Ci0JCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCX0gZmluYWxseSB7Ci0JCQkJCQlwcm9jZXNzaW5nSlNFdmVudCA9IGZhbHNlOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9KTsKLQl9Ci0KLQkvKioKLQkgKiBHZW5lcmF0ZXMgdGhlIEhUTUwgc291cmNlIGZvciB0aGUgZWRpdG9yLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIEhUTUwgc291cmNlIGZvciB0aGUgZWRpdG9yCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZW5lcmF0ZUVkaXRvckhUTUwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU3RyaW5nIGVzY2FwZWRCYXNlUGF0aCA9IGJhc2VQYXRoOwotCQlpZiAoZXNjYXBlZEJhc2VQYXRoLnN0YXJ0c1dpdGgoRmlsZVV0aWwuVU5DX1BBVEhfUFJFRklYKSkKLQkJCWVzY2FwZWRCYXNlUGF0aCA9IGVzY2FwZWRCYXNlUGF0aC5yZXBsYWNlRmlyc3QoCi0JCQkJCSJeXFxcXFxcXFwiLCAiXFxcXFxcXFxcXFxcXFxcXCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJZXNjYXBlZEJhc2VQYXRoID0gWE1MVXRpbAotCQkJCS5lc2NhcGUoImZpbGU6Ly8iICsgZXNjYXBlZEJhc2VQYXRoLnJlcGxhY2VBbGwoIiciLCAiXFxcXCciKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCVN0cmluZyBlc2NhcGVkUnRlVVRMID0gcnRlVVJMLnJlcGxhY2VBbGwoIiZhcG9zOyIsICIlMjciKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkJU3RyaW5nQnVmZmVyIHJ0ZVhNTCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJcnRlWE1MLmFwcGVuZCgiPHJ0ZSBpZD1cIiIpLmFwcGVuZCgicnRlIikgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJLmFwcGVuZCgiXCIgY3NzPVwiIikuYXBwZW5kKGVzY2FwZWRSdGVVVEwgKyAicnRlLmNzcyIpIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCS5hcHBlbmQoIlwiIGpzPVwiIikuYXBwZW5kKGVzY2FwZWRSdGVVVEwgKyAicnRlLmpzIikgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJLmFwcGVuZCgiXCIgYmFzZVVSTD1cIiIpLmFwcGVuZChlc2NhcGVkQmFzZVBhdGgpIC8vJE5PTi1OTFMtMSQKLQkJCQkuYXBwZW5kKCJcIi8+Iik7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nV3JpdGVyIHJlc3VsdCA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLQkJWFNMVFByb2Nlc3Nvci50cmFuc2Zvcm0oCi0JCQkJcnRlRm9sZGVyICsgInJ0ZS54c2wiLCBydGVYTUwudG9TdHJpbmcoKSwgcmVzdWx0KTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogRmlsbHMgdGhlIGNvbnRleHQgbWVudSB3aXRoIG1lbnUgaXRlbXMuCi0JICogCi0JICogQHBhcmFtIGNvbnRleHRNZW51Ci0JICogICAgICAgICAgICBhIGNvbnRleHQgbWVudSBjb250YWluaW5nIHJpY2ggdGV4dCBhY3Rpb25zCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZmlsbENvbnRleHRNZW51KE1lbnUgY29udGV4dE1lbnUpIHsKLQkJZmluYWwgTWVudUl0ZW0gY3V0SXRlbSA9IG5ldyBNZW51SXRlbShjb250ZXh0TWVudSwgU1dULlBVU0gpOwotCQljdXRJdGVtLnNldFRleHQoUmljaFRleHRSZXNvdXJjZXMuY3V0QWN0aW9uX3RleHQpOwotCQljdXRJdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlDdXRBY3Rpb24gYWN0aW9uID0gbmV3IEN1dEFjdGlvbihSaWNoVGV4dC50aGlzKTsKLQkJCQlhY3Rpb24uZXhlY3V0ZShSaWNoVGV4dC50aGlzKTsKLQkJCX0KLQkJfSk7Ci0JCWZpbmFsIE1lbnVJdGVtIGNvcHlJdGVtID0gbmV3IE1lbnVJdGVtKGNvbnRleHRNZW51LCBTV1QuUFVTSCk7Ci0JCWNvcHlJdGVtLnNldFRleHQoUmljaFRleHRSZXNvdXJjZXMuY29weUFjdGlvbl90ZXh0KTsKLQkJY29weUl0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCUNvcHlBY3Rpb24gYWN0aW9uID0gbmV3IENvcHlBY3Rpb24oUmljaFRleHQudGhpcyk7Ci0JCQkJYWN0aW9uLmV4ZWN1dGUoUmljaFRleHQudGhpcyk7Ci0JCQl9Ci0JCX0pOwotCQlmaW5hbCBNZW51SXRlbSBwYXN0ZUl0ZW0gPSBuZXcgTWVudUl0ZW0oY29udGV4dE1lbnUsIFNXVC5QVVNIKTsKLQkJcGFzdGVJdGVtLnNldFRleHQoUmljaFRleHRSZXNvdXJjZXMucGFzdGVBY3Rpb25fdGV4dCk7Ci0JCXBhc3RlSXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJUGFzdGVBY3Rpb24gYWN0aW9uID0gbmV3IFBhc3RlQWN0aW9uKFJpY2hUZXh0LnRoaXMpOwotCQkJCWFjdGlvbi5leGVjdXRlKFJpY2hUZXh0LnRoaXMpOwotCQkJfQotCQl9KTsKLQotCQlmaW5hbCBNZW51SXRlbSBwYXN0ZVBsYWluVGV4dEl0ZW0gPSBuZXcgTWVudUl0ZW0oY29udGV4dE1lbnUsIFNXVC5QVVNIKTsKLQkJcGFzdGVQbGFpblRleHRJdGVtLnNldFRleHQoUmljaFRleHRSZXNvdXJjZXMucGFzdGVQbGFpblRleHRBY3Rpb25fdGV4dCk7Ci0JCXBhc3RlUGxhaW5UZXh0SXRlbS5zZXRJbWFnZShSaWNoVGV4dEltYWdlcy5JTUdfUEFTVEVfUExBSU5fVEVYVCk7Ci0JCXBhc3RlUGxhaW5UZXh0SXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJUGFzdGVQbGFpblRleHRBY3Rpb24gYWN0aW9uID0gbmV3IFBhc3RlUGxhaW5UZXh0QWN0aW9uKAotCQkJCQkJUmljaFRleHQudGhpcyk7Ci0JCQkJYWN0aW9uLmV4ZWN1dGUoUmljaFRleHQudGhpcyk7Ci0JCQl9Ci0JCX0pOwotCi0JCWNvbnRleHRNZW51LmFkZE1lbnVMaXN0ZW5lcihuZXcgTWVudUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgbWVudUhpZGRlbihNZW51RXZlbnQgZSkgewotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBtZW51U2hvd24oTWVudUV2ZW50IGUpIHsKLQkJCQlnZXRTZWxlY3RlZFRleHQoKTsKLQkJCQljdXRJdGVtLnNldEVuYWJsZWQoZWRpdGFibGUgJiYgaGFzU2VsZWN0aW9uKTsKLQkJCQljb3B5SXRlbS5zZXRFbmFibGVkKGhhc1NlbGVjdGlvbik7Ci0JCQkJcGFzdGVJdGVtLnNldEVuYWJsZWQoZWRpdGFibGUpOwotCQkJCXBhc3RlUGxhaW5UZXh0SXRlbS5zZXRFbmFibGVkKGVkaXRhYmxlKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JLyoqCi0JICogQWRkcyBsaXN0ZW5lcnMgdG8gbWFuYWdlIHRoZSBhY3RpdmF0aW9uIGFuZCBmb2N1cyBldmVudHMuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkTGlzdGVuZXJzKCkgewotCQllZGl0b3JDb250cm9sID0gZ2V0Q29udHJvbFNpdGUoZWRpdG9yKTsKLQkJaWYgKGVkaXRvckNvbnRyb2wgIT0gbnVsbCkgewotCQkJaWYgKGRlYnVnKSB7Ci0JCQkJcHJpbnREZWJ1Z01lc3NhZ2UoCi0JCQkJCQkiaW5pdCIsICJlZGl0b3JDb250cm9sPSIgKyBlZGl0b3JDb250cm9sLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQl9Ci0JCQkKLQkJCS8vIG9ubHkgSUUgKHdpbjMyKSBoYXMgdGhlIGVkaXRvckNvbnRyb2wgIT0gbnVsbAotCQkJaXNJRSA9IHRydWU7Ci0JCQkKLQkJCWVkaXRvckNvbnRyb2wuYWRkTGlzdGVuZXIoU1dULkFjdGl2YXRlLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCQkJaWYgKGRlYnVnKSB7Ci0JCQkJCQlwcmludERlYnVnTWVzc2FnZSgiYWN0aXZhdGVMaXN0ZW5lciIpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQkJc2V0Rm9jdXMoKTsKLQkJCQkJbm90aWZ5TGlzdGVuZXJzKFNXVC5BY3RpdmF0ZSwgZXZlbnQpOwotCQkJCX0KLQkJCX0pOwotCi0JCQllZGl0b3JDb250cm9sLmFkZExpc3RlbmVyKFNXVC5EZWFjdGl2YXRlLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCQkJaWYgKGRlYnVnKSB7Ci0JCQkJCQlwcmludERlYnVnTWVzc2FnZSgiZGVhY3RpdmF0ZUxpc3RlbmVyIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCQlzZXRCbHVyKCk7Ci0JCQkJCW5vdGlmeUxpc3RlbmVycyhTV1QuRGVhY3RpdmF0ZSwgZXZlbnQpOwotCQkJCX0KLQkJCX0pOwotCi0JCQllZGl0b3JDb250cm9sLmFkZExpc3RlbmVyKFNXVC5Gb2N1c0luLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCQkJaWYgKGRlYnVnKSB7Ci0JCQkJCQlwcmludERlYnVnTWVzc2FnZSgiZm9jdXNJbkxpc3RlbmVyIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCQlleGVjdXRlQ29tbWFuZCgidXBkYXRlU2VsZWN0aW9uIik7IC8vJE5PTi1OTFMtMSQJCQkJCQotCQkJCQlub3RpZnlMaXN0ZW5lcnMoU1dULkZvY3VzSW4sIGV2ZW50KTsKLQkJCQl9Ci0JCQl9KTsKLQotCQkJZWRpdG9yQ29udHJvbC5hZGRMaXN0ZW5lcihTV1QuS2V5VXAsIG5ldyBMaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJCQlpbnQga2V5Q29kZSA9IGV2ZW50LmtleUNvZGU7Ci0JCQkJCWludCBzdGF0ZU1hc2sgPSBldmVudC5zdGF0ZU1hc2s7Ci0JCQkJCWlmIChkZWJ1ZykgewotCQkJCQkJcHJpbnREZWJ1Z01lc3NhZ2UoCi0JCQkJCQkJCSJrZXlVcExpc3RlbmVyIiwgImtleUNvZGU9IiArIGtleUNvZGUgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQkJCQkJKyAiLCBzdGF0ZU1hc2s9IiArIHN0YXRlTWFzayArICIsIGVkaXRhYmxlPSIgKyBlZGl0YWJsZSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQl9Ci0JCQkJCWlmICgoc3RhdGVNYXNrICYgU1dULkNUUkwpID4gMAotCQkJCQkJCXx8IChzdGF0ZU1hc2sgJiBTV1QuQUxUKSA+IDAKLQkJCQkJCQl8fCAoKHN0YXRlTWFzayAmIFNXVC5TSElGVCkgPiAwICYmIGtleUNvZGUgPT0gc3RhdGVNYXNrKSkgewotCQkJCQkJcmV0dXJuOwotCQkJCQl9Ci0JCQkJCWlmIChlZGl0YWJsZSkgewotCQkJCQkJc3dpdGNoIChldmVudC5rZXlDb2RlKSB7Ci0JCQkJCQljYXNlIFNXVC5BUlJPV19ET1dOOgotCQkJCQkJY2FzZSBTV1QuQVJST1dfTEVGVDoKLQkJCQkJCWNhc2UgU1dULkFSUk9XX1JJR0hUOgotCQkJCQkJY2FzZSBTV1QuQVJST1dfVVA6Ci0JCQkJCQljYXNlIFNXVC5FTkQ6Ci0JCQkJCQljYXNlIFNXVC5IT01FOgotCQkJCQkJY2FzZSBTV1QuUEFHRV9ET1dOOgotCQkJCQkJY2FzZSBTV1QuUEFHRV9VUDoKLQkJCQkJCWNhc2UgU1dULlRBQjoKLQkJCQkJCQlyZXR1cm47Ci0JCQkJCQlkZWZhdWx0OgotCQkJCQkJCWNoZWNrTW9kaWZ5KCk7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9KTsKLQotCQkJZWRpdG9yLmFkZExvY2F0aW9uTGlzdGVuZXIobmV3IExvY2F0aW9uQWRhcHRlcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBjaGFuZ2luZyhMb2NhdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJCS8vIERlYWN0aXZhdGUgdGhlIGxpbmtzIGluIHRoZSBjb250ZW50IHBhZ2UgaW4gcmVhZG9ubHkKLQkJCQkJLy8gbW9kZS4KLQkJCQkJZXZlbnQuZG9pdCA9IGVkaXRhYmxlOwotCQkJCX0KLQkJCX0pOwotCQl9IGVsc2UgewotCQkJZWRpdG9yLmFkZExpc3RlbmVyKFNXVC5BY3RpdmF0ZSwgbmV3IExpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQkJCWlmIChkZWJ1ZykgewotCQkJCQkJcHJpbnREZWJ1Z01lc3NhZ2UoImFjdGl2YXRlTGlzdGVuZXIiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJCXNldEZvY3VzKCk7Ci0JCQkJfQotCQkJfSk7Ci0KLQkJCWVkaXRvci5hZGRLZXlMaXN0ZW5lcihuZXcgS2V5TGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQga2V5UHJlc3NlZChLZXlFdmVudCBlKSB7Ci0JCQkJCWlmIChlLmtleUNvZGUgPT0gU1dULlRBQikgewotCQkJCQkJaWYgKChlLnN0YXRlTWFzayAmIFNXVC5TSElGVCkgIT0gMCkgewotCQkJCQkJCWVkaXRvci50cmF2ZXJzZShTV1QuVFJBVkVSU0VfVEFCX1BSRVZJT1VTKTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJZWRpdG9yLnRyYXZlcnNlKFNXVC5UUkFWRVJTRV9UQUJfTkVYVCk7Ci0JCQkJCQl9Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCX0KLQkJCQkJaWYgKCFlZGl0YWJsZSkgewotCQkJCQkJZS5kb2l0ID0gZmFsc2U7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQlwdWJsaWMgdm9pZCBrZXlSZWxlYXNlZChLZXlFdmVudCBlKSB7Ci0JCQkJCWlmICgoZS5zdGF0ZU1hc2sgJiBTV1QuQ1RSTCkgPiAwCi0JCQkJCQkJfHwgKGUuc3RhdGVNYXNrICYgU1dULkFMVCkgPiAwKQotCQkJCQkJcmV0dXJuOwotCQkJCQlpZiAoZWRpdGFibGUpIHsKLQkJCQkJCXN3aXRjaCAoZS5rZXlDb2RlKSB7Ci0JCQkJCQljYXNlIFNXVC5BUlJPV19ET1dOOgotCQkJCQkJY2FzZSBTV1QuQVJST1dfTEVGVDoKLQkJCQkJCWNhc2UgU1dULkFSUk9XX1JJR0hUOgotCQkJCQkJY2FzZSBTV1QuQVJST1dfVVA6Ci0JCQkJCQljYXNlIFNXVC5FTkQ6Ci0JCQkJCQljYXNlIFNXVC5IT01FOgotCQkJCQkJY2FzZSBTV1QuUEFHRV9ET1dOOgotCQkJCQkJY2FzZSBTV1QuUEFHRV9VUDoKLQkJCQkJCWNhc2UgU1dULlNISUZUOgotCQkJCQkJY2FzZSBTV1QuVEFCOgotCQkJCQkJCWJyZWFrOwotCQkJCQkJZGVmYXVsdDoKLQkJCQkJCQljaGVja01vZGlmeSgpOwotCQkJCQkJCWJyZWFrOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQotCQllZGl0b3IuYWRkRGlzcG9zZUxpc3RlbmVyKG5ldyBEaXNwb3NlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXREaXNwb3NlZChEaXNwb3NlRXZlbnQgZSkgewotCQkJCWlmIChkZWJ1ZykgewotCQkJCQlwcmludERlYnVnTWVzc2FnZSgiZGlzcG9zZUxpc3RlbmVyIik7IC8vJE5PTi1OTFMtMSQJCQkJCQkKLQkJCQl9Ci0JCQkJZGlzcG9zZSgpOwotCQkJfQotCQl9KTsKLQotCQlsaXN0ZW5lcnMgPSBuZXcgSGFzaHRhYmxlPExpc3RlbmVyLCBSaWNoVGV4dExpc3RlbmVyPigpOwotCQltb2RpZnlMaXN0ZW5lcnMgPSBuZXcgQXJyYXlMaXN0PE1vZGlmeUxpc3RlbmVyPigpOwotCX0KLQotCS8qKgotCSAqIE5vdGlmaWVzIHRoZSByaWNoIHRleHQgZXZlbnQgbGlzdGVuZXJzLgotCSAqIAotCSAqIEBwYXJhbSBldmVudFR5cGUKLQkgKiAgICAgICAgICAgIHRoZSBldmVudCB0eXBlCi0JICogQHBhcmFtIGV2ZW50Ci0JICogICAgICAgICAgICB0aGUgU1dUIGV2ZW50Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgbm90aWZ5TGlzdGVuZXJzKGludCBldmVudFR5cGUsIEV2ZW50IGV2ZW50KSB7Ci0JCWlmIChub3RpZnlpbmdNb2RpZnlMaXN0ZW5lcnMpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCWlmIChsaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJZXZlbnQuZGlzcGxheSA9IERpc3BsYXkuZ2V0Q3VycmVudCgpOwotCQkJZXZlbnQud2lkZ2V0ID0gZWRpdG9yOwotCi0JCQlmb3IgKEl0ZXJhdG9yPFJpY2hUZXh0TGlzdGVuZXI+IGkgPSBsaXN0ZW5lcnMudmFsdWVzKCkuaXRlcmF0b3IoKTsgaQotCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCVJpY2hUZXh0TGlzdGVuZXIgbGlzdGVuZXIgPSBpLm5leHQoKTsKLQkJCQlpZiAobGlzdGVuZXIuZ2V0RXZlbnRUeXBlKCkgPT0gZXZlbnRUeXBlKSB7Ci0JCQkJCWlmIChkZWJ1ZykgewotCQkJCQkJcHJpbnREZWJ1Z01lc3NhZ2UoCi0JCQkJCQkJCSJub3RpZnlMaXN0ZW5lcnMiLCAibm90aWZ5aW5nIGxpc3RlbmVyLCAiICsgbGlzdGVuZXIgKyAiLCBldmVudFR5cGU9IiArIGV2ZW50VHlwZSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAkvLyROT04tTkxTLTMkCQotCQkJCQl9Ci0JCQkJCWxpc3RlbmVyLmdldExpc3RlbmVyKCkuaGFuZGxlRXZlbnQoZXZlbnQpOwotCQkJCQlpZiAoZGVidWcpIHsKLQkJCQkJCXByaW50RGVidWdNZXNzYWdlKAotCQkJCQkJCQkibm90aWZ5TGlzdGVuZXJzIiwgIm5vdGlmaWVkIGxpc3RlbmVyLCAiICsgbGlzdGVuZXIgKyAiLCBldmVudFR5cGU9IiArIGV2ZW50VHlwZSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAkvLyROT04tTkxTLTMkCQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogTm90aWZpZXMgdGhlIG1vZGlmeSBsaXN0ZW5lcnMgdGhhdCB0aGUgcmljaCB0ZXh0IGVkaXRvciBjb250ZW50IGhhcwotCSAqIGNoYW5nZWQuCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5TW9kaWZ5TGlzdGVuZXJzKCkgewotCQlub3RpZnlpbmdNb2RpZnlMaXN0ZW5lcnMgPSB0cnVlOwotCi0JCUV2ZW50IGV2ZW50ID0gbmV3IEV2ZW50KCk7Ci0JCWV2ZW50LmRpc3BsYXkgPSBEaXNwbGF5LmdldEN1cnJlbnQoKTsKLQkJZXZlbnQud2lkZ2V0ID0gZWRpdG9yOwotCi0JCWZvciAoSXRlcmF0b3I8TW9kaWZ5TGlzdGVuZXI+IGkgPSBtb2RpZnlMaXN0ZW5lcnMuaXRlcmF0b3IoKTsgaQotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQlNb2RpZnlMaXN0ZW5lciBsaXN0ZW5lciA9IGkubmV4dCgpOwotCQkJaWYgKGRlYnVnKSB7Ci0JCQkJcHJpbnREZWJ1Z01lc3NhZ2UoCi0JCQkJCQkibm90aWZ5TW9kaWZ5TGlzdGVuZXJzIiwgIm5vdGlmeWluZyBsaXN0ZW5lciwgIiArIGxpc3RlbmVyKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCQotCQkJfQotCQkJbGlzdGVuZXIubW9kaWZ5VGV4dChuZXcgTW9kaWZ5RXZlbnQoZXZlbnQpKTsKLQkJCWlmIChkZWJ1ZykgewotCQkJCXByaW50RGVidWdNZXNzYWdlKAotCQkJCQkJIm5vdGlmeU1vZGlmeUxpc3RlbmVycyIsICJub3RpZmllZCBsaXN0ZW5lciwgIiArIGxpc3RlbmVyKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCQotCQkJfQotCQl9Ci0KLQkJbm90aWZ5aW5nTW9kaWZ5TGlzdGVuZXJzID0gZmFsc2U7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuSVJpY2hUZXh0I2NoZWNrTW9kaWZ5KCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjaGVja01vZGlmeSgpIHsKLQkJdHJ5IHsKLQkJCWlmICghY2hlY2tpbmdNb2RpZnlFdmVudCkgewotCQkJCWNoZWNraW5nTW9kaWZ5RXZlbnQgPSB0cnVlOwotCQkJCWlmIChtb2RpZmllZCkgewotCQkJCQlub3RpZnlNb2RpZnlMaXN0ZW5lcnMoKTsKLQkJCQl9IGVsc2UgewotCQkJCQlpZiAoIWlzSUUgJiYgcHJvY2Vzc2luZ0pTRXZlbnQpIHsKLQkJCQkJCURpc3BsYXkuZ2V0Q3VycmVudCgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCQlpZiAoIWdldFRleHQoKS5lcXVhbHMoaW5pdGlhbFRleHQpKSB7Ci0JCQkJCQkJCQltb2RpZmllZCA9IHRydWU7Ci0JCQkJCQkJCQlub3RpZnlNb2RpZnlMaXN0ZW5lcnMoKTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0pOwotCQkJCQl9IGVsc2UgewotCQkJCQkJaWYgKCFnZXRUZXh0KCkuZXF1YWxzKGluaXRpYWxUZXh0KSkgewotCQkJCQkJCW1vZGlmaWVkID0gdHJ1ZTsKLQkJCQkJCQlub3RpZnlNb2RpZnlMaXN0ZW5lcnMoKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAoZGVidWcpIHsKLQkJCQkJcHJpbnREZWJ1Z01lc3NhZ2UoImNoZWNrTW9kaWZ5IiwgIm1vZGlmaWVkPSIgKyBtb2RpZmllZCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAkKLQkJCQl9Ci0JCQl9Ci0JCX0gZmluYWxseSB7Ci0JCQljaGVja2luZ01vZGlmeUV2ZW50ID0gZmFsc2U7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHByb3ZpZGVzIGFuIG9wcG9ydHVuaXR5IGZvciBhIHN1YiBjbGFzcyB0byB0aWR5IHVwIHRoZSByaWNoIHRleHQuCi0JICogCi0JICogQHBhcmFtIHRleHQKLQkgKiAgICAgICAgICAgIHJpY2ggdGV4dCBlbmNvZGVkIGluIEhUTUwgZm9ybWF0Ci0JICovCi0JcHJvdGVjdGVkIFN0cmluZyB0aWR5VGV4dChTdHJpbmcgdGV4dCkgewotCQlyZXR1cm4gdGV4dDsKLQl9Ci0KLQkvKioKLQkgKiBGb3JtYXRzIHRoZSB0ZXh0IGZvciBjb25zdW1wdGlvbiBieSB0aGUgSmF2YVNjcmlwdC9ESFRNTCBlZGl0b3IuCi0JICogCi0JICogQHBhcmFtIHRleHQKLQkgKiAgICAgICAgICAgIHJpY2ggdGV4dCBlbmNvZGVkIGluIEhUTUwgZm9ybWF0Ci0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBmb3JtYXRUZXh0KFN0cmluZyB0ZXh0KSB7Ci0JCWlmICh0ZXh0ID09IG51bGwgfHwgdGV4dC5sZW5ndGgoKSA9PSAwKSB7Ci0JCQlyZXR1cm4gdGV4dDsKLQkJfQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlpbnQgdGV4dFNpemUgPSB0ZXh0Lmxlbmd0aCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHRleHRTaXplOyBpKyspIHsKLQkJCWNoYXIgY2ggPSB0ZXh0LmNoYXJBdChpKTsKLQkJCXN3aXRjaCAoY2gpIHsKLQkJCWNhc2UgJ1xyJzoKLQkJCQlicmVhazsKLQkJCWNhc2UgJ1x0JzoKLQkJCQlyZXN1bHQuYXBwZW5kKCcgJyk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlICdcbic6Ci0JCQkJcmVzdWx0LmFwcGVuZChFTkNPREVEX05FV0xJTkUpOwotCQkJCWJyZWFrOwotCQkJY2FzZSAnXCcnOgotCQkJCXJlc3VsdC5hcHBlbmQoRU5DT0RFRF9TSU5HTEVfUVVPVEUpOwotCQkJCWJyZWFrOwotCQkJY2FzZSAnXFwnOgotCQkJCXJlc3VsdC5hcHBlbmQoIlxcXFwiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCQlyZXN1bHQuYXBwZW5kKGNoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY2hpbGQgPGNvZGU+T2xlQ29udHJvbFNpdGU8L2NvZGU+IGNvbnRhaW5lZCB3aXRoaW4gdGhlCi0JICogZ2l2ZW4gPGNvZGU+Q29tcG9zaXRlPC9jb2RlPi4KLQkgKiAKLQkgKiBAcGFyYW0gY29tcG9zaXRlCi0JICogICAgICAgICAgICBhIDxjb2RlPkNvbXBvc2l0ZTwvY29kZT4gb2JqZWN0LCBwcmVzdW1hYmx5IGEKLQkgKiAgICAgICAgICAgIDxjb2RlPkJyb3dzZXI8L2NvZGU+Ci0JICogQHJldHVybiBhbiA8Y29kZT5PbGVDb250cm9sU2l0ZTwvY29kZT4gb2JqZWN0Ci0JICovCi0JcHJvdGVjdGVkIENvbnRyb2wgZ2V0Q29udHJvbFNpdGUoQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotCQlpZiAoUGxhdGZvcm0uZ2V0T1MoKS5lcXVhbHMoIndpbjMyIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJQ29udHJvbFtdIGNvbnRyb2xzID0gY29tcG9zaXRlLmdldENoaWxkcmVuKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbnRyb2xzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJU3RyaW5nIGNvbnRyb2xDbGFzcyA9IGNvbnRyb2xzW2ldLmdldENsYXNzKCkuZ2V0TmFtZSgpOwotCQkJCWlmIChjb250cm9sQ2xhc3MuZXF1YWxzKCJvcmcuZWNsaXBzZS5zd3QuYnJvd3Nlci5XZWJTaXRlIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQlyZXR1cm4gY29udHJvbHNbaV07Ci0JCQkJfSBlbHNlIGlmIChjb250cm9sc1tpXSBpbnN0YW5jZW9mIENvbXBvc2l0ZSkgewotCQkJCQlyZXR1cm4gZ2V0Q29udHJvbFNpdGUoKENvbXBvc2l0ZSkgY29udHJvbHNbaV0pOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBEaXNwbGF5cyB0aGUgZ2l2ZW4gZGVidWcgbWVzc2FnZSB0byB0aGUgY29uc29sZS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwcmludERlYnVnTWVzc2FnZShTdHJpbmcgbWV0aG9kLCBTdHJpbmcgbXNnLCBTdHJpbmcgdGV4dCkgewotCQlTdHJpbmdCdWZmZXIgc3RyQnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlzdHJCdWYuYXBwZW5kKCJSaWNoVGV4dFsiKS5hcHBlbmQoZWRpdG9yLmhhbmRsZSkuYXBwZW5kKCddJykgLy8kTk9OLU5MUy0xJAotCQkJCS5hcHBlbmQoJy4nKS5hcHBlbmQobWV0aG9kKTsKLQkJaWYgKG1zZyAhPSBudWxsICYmIG1zZy5sZW5ndGgoKSA+IDApIHsKLQkJCXN0ckJ1Zi5hcHBlbmQoIjogIikuYXBwZW5kKG1zZyk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlpZiAodGV4dCAhPSBudWxsICYmIHRleHQubGVuZ3RoKCkgPiAwKSB7Ci0JCQlzdHJCdWYuYXBwZW5kKCdcbicpLmFwcGVuZCh0ZXh0KTsKLQkJfQotCQlTeXN0ZW0ub3V0LnByaW50bG4oc3RyQnVmKTsKLQl9Ci0KLQkvKioKLQkgKiBEaXNwbGF5cyB0aGUgZ2l2ZW4gZGVidWcgbWVzc2FnZSB0byB0aGUgY29uc29sZS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwcmludERlYnVnTWVzc2FnZShTdHJpbmcgbWV0aG9kLCBTdHJpbmcgbXNnKSB7Ci0JCXByaW50RGVidWdNZXNzYWdlKG1ldGhvZCwgbXNnLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBEaXNwbGF5cyB0aGUgZ2l2ZW4gZGVidWcgbWVzc2FnZSB0byB0aGUgY29uc29sZS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwcmludERlYnVnTWVzc2FnZShTdHJpbmcgbWV0aG9kKSB7Ci0JCXByaW50RGVidWdNZXNzYWdlKG1ldGhvZCwgbnVsbCk7Ci0JfQotCi0JcHVibGljIEZpbmRSZXBsYWNlQWN0aW9uIGdldEZpbmRSZXBsYWNlQWN0aW9uKCkgewotCQlyZXR1cm4gZmluZFJlcGxhY2VBY3Rpb247Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RmluZFJlcGxhY2VBY3Rpb24oRmluZFJlcGxhY2VBY3Rpb24gZmluZFJlcGxhY2VBY3Rpb24pIHsKLQkJaWYgKGZpbmRSZXBsYWNlQWN0aW9uICE9IG51bGwpIHsKLQkJCWlmICh0aGlzLmZpbmRSZXBsYWNlQWN0aW9uICE9IG51bGwKLQkJCQkJJiYgdGhpcy5maW5kUmVwbGFjZUFjdGlvbiAhPSBmaW5kUmVwbGFjZUFjdGlvbikgewotCQkJCXRoaXMuZmluZFJlcGxhY2VBY3Rpb24uZGlzcG9zZSgpOwotCQkJfQotCQkJdGhpcy5maW5kUmVwbGFjZUFjdGlvbiA9IGZpbmRSZXBsYWNlQWN0aW9uOwotCQkJdGhpcy5maW5kUmVwbGFjZUFjdGlvbi5zZXRSaWNoVGV4dCh0aGlzKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHNldEluaXRpYWxUZXh0KFN0cmluZyB0ZXh0KSB7Ci0JCXNldFRleHQodGV4dCk7Ci0JCWluaXRpYWxUZXh0ID0gdGV4dCA9PSBudWxsID8gIiIgOiB0ZXh0OyAvLyROT04tTkxTLTEkCi0JCW1vZGlmaWVkID0gZmFsc2U7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvUmljaFRleHRDb21tYW5kLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9SaWNoVGV4dENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzY5ZjdmYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9SaWNoVGV4dENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQ7Ci0KLS8qKgotICogRGVmaW5lcyB0aGUgZWRpdGluZyBjb21tYW5kcyBzdXBwb3J0ZWQgYnkgdGhlIGRlZmF1bHQgcmljaCB0ZXh0IGNvbnRyb2wgYW5kCi0gKiBlZGl0b3IuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUmljaFRleHRDb21tYW5kIHsKLQotCS8qKgotCSAqIEFkZHMgYSBIVE1MIGZyYWdtZW50LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFERF9IVE1MID0gImFkZEhUTUwiOyAvLyROT04tTkxTLTEkCQotCi0JLyoqCi0JICogQWRkcyBhbiBpbWFnZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBRERfSU1BR0UgPSAiYWRkSW1hZ2UiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBZGRzIGEgaG9yaXpvbnRhbCBsaW5lLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFERF9MSU5FID0gImFkZExpbmUiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBZGRzIGEgbGluay4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBRERfTElOSyA9ICJhZGRMaW5rIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogSW5zZXJ0cyB0ZXh0IG92ZXIgdGhlIGN1cnJlbnQgc2VsZWN0aW9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElOU0VSVF9URVhUID0gImluc2VydFRleHQiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBZGRzIGFuIG9yZGVyZWQgbGlzdC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBRERfT1JERVJFRF9MSVNUID0gImFkZE9yZGVyZWRMaXN0IjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQWRkcyBhIHRhYmxlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFERF9UQUJMRSA9ICJhZGRUYWJsZSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEFkZHMgYW4gdW5vcmRlcmVkIGxpc3QuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUREX1VOT1JERVJFRF9MSVNUID0gImFkZFVub3JkZXJlZExpc3QiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBTZXRzIHRoZSBiYWNrZ3JvdW5kIGNvbG9yIG9mIHRoZSBzZWxlY3RlZCB0ZXh0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJBQ0tHUk9VTkRfQ09MT1IgPSAiYmFja0NvbG9yIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVG9nZ2xlcyB0aGUgJ2JvbGQnIGF0dHJpYnV0ZSBvZiB0aGUgc2VsZWN0ZWQgdGV4dC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCT0xEID0gImJvbGQiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBDbGVhcnMgdGhlIHJpY2ggdGV4dCBjb250ZW50LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENMRUFSX0NPTlRFTlQgPSAiY2xlYXJDb250ZW50IjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQ29waWVzIHRoZSBzZWxlY3RlZCB0ZXh0IHRvIHRoZSBjbGlwYm9hcmQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09QWSA9ICJjb3B5IjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQ3V0cyB0aGUgc2VsZWN0ZWQgdGV4dCB0byB0aGUgY2xpcGJvYXJkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENVVCA9ICJjdXQiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBEZWxldGVzIHRoZSBzZWxlY3RlZCB0ZXh0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFTEVURSA9ICJkZWxldGVUZXh0IjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogRmluZHMgdGV4dC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGSU5EX1RFWFQgPSAiZmluZFRleHQiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBHZXRzIHRoZSBIVE1MIHNvdXJjZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHRVRfVEVYVCA9ICJnZXRUZXh0IjsgLy8kTk9OLU5MUy0xJAkKLQotCS8qKgotCSAqIFNldHMgdGhlIGZvcmVncm91bmQgY29sb3Igb2YgdGhlIHNlbGVjdGVkIHRleHQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9SR1JPVU5EX0NPTE9SID0gImZvcmVDb2xvciI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEZvcm1hdHMgdGhlIHNlbGVjdGVkIHRleHQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9STUFUX0JMT0NLID0gImZvcm1hdEJsb2NrIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2VsZWN0ZWQgdGV4dC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHRVRfU0VMRUNURURfVEVYVCA9ICJnZXRTZWxlY3RlZFRleHQiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBJbmRlbnRzIHRoZSBzZWxlY3RlZCB0ZXh0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElOREVOVCA9ICJpbmRlbnQiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUb2dnbGVzIHRoZSAnaXRhbGljJyBhdHRyaWJ1dGUgb2YgdGhlIHNlbGVjdGVkIHRleHQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSVRBTElDID0gIml0YWxpYyI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIENlbnRlciBqdXN0aWZpZXMgdGhlIHNlbGVjdGVkIHRleHQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlVTVElGWV9DRU5URVIgPSAianVzdGlmeUNlbnRlciI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEZ1bGx5IGp1c3RpZmllcyB0aGUgc2VsZWN0ZWQgdGV4dC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKVVNUSUZZX0ZVTEwgPSAianVzdGlmeUZ1bGwiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBMZWZ0IGp1c3RpZmllcyB0aGUgc2VsZWN0ZWQgdGV4dC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKVVNUSUZZX0xFRlQgPSAianVzdGlmeUxlZnQiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBSaWdodCBqdXN0aWZpZXMgdGhlIHNlbGVjdGVkIHRleHQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlVTVElGWV9SSUdIVCA9ICJqdXN0aWZ5UmlnaHQiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBPdXRkZW50cyB0aGUgc2VsZWN0ZWQgdGV4dC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPVVRERU5UID0gIm91dGRlbnQiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBQYXN0ZXMgdGV4dCBmcm9tIHRoZSBjbGlwYm9hcmQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFTVEUgPSAicGFzdGUiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBSZXBsYWNlcyBhbGwgdGV4dC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRVBMQUNFX0FMTF9URVhUID0gInJlcGxhY2VBbGxUZXh0IjsgLy8kTk9OLU5MUy0xJAkJCi0KLQkvKioKLQkgKiBSZXBsYWNlcyB0aGUgc2VsZWN0ZWQgdGV4dC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRVBMQUNFX1RFWFQgPSAicmVwbGFjZVRleHQiOyAvLyROT04tTkxTLTEkCQkKLQotCS8qKgotCSAqIFJlZG9lcyB0aGUgcHJldmlvdXMgY29tbWFuZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRURPID0gInJlZG8iOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBSZW1vdmVzIHRoZSBjdXJyZW50IGZvcm1hdHRpbmcgb2YgdGhlIHNlbGVjdGVkIHRleHQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVNT1ZFX0ZPUk1BVCA9ICJyZW1vdmVGb3JtYXQiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBTYXZlcyB0aGUgZWRpdG9yCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0FWRSA9ICJzYXZlIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogU2F2ZXMgYWxsIGVkaXRvcnMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTQVZFX0FMTCA9ICJzYXZlQWxsIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogU2VsZWN0cyBhbGwgdGV4dC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRUxFQ1RfQUxMID0gInNlbGVjdEFsbCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFNldHMgdGhlIGZvbnQgbmFtZSBmb3IgdGhlIHNlbGVjdGVkIHRleHQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VUX0ZPTlRfTkFNRSA9ICJzZXRGb250TmFtZSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFNldHMgdGhlIGZvbnQgc2l6ZSBmb3IgdGhlIHNlbGVjdGVkIHRleHQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VUX0ZPTlRfU0laRSA9ICJzZXRGb250U2l6ZSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFNldHMgdGhlIGZvbnQgc3R5bGUgZm9yIHRoZSBzZWxlY3RlZCB0ZXh0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFVF9GT05UX1NUWUxFID0gInNldEZvbnRTdHlsZSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFNldHMgd2hldGhlciB0aGUgY29udGVudCBjYW4gYmUgZWRpdGVkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFVF9FRElUQUJMRSA9ICJzZXRFZGl0YWJsZSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFNldHMgZm9jdXMgdG8gdGhpcyBjb250cm9sLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFVF9GT0NVUyA9ICJzZXRGb2N1cyI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFNldHMgdGhlIGhlaWdodCBvZiB0aGlzIGNvbnRyb2wuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VUX0hFSUdIVCA9ICJzZXRIZWlnaHQiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBTZXRzIHRoZSBIVE1MIHNvdXJjZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRVRfVEVYVCA9ICJzZXRUZXh0IjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVG9nZ2xlcyB0aGUgJ3N0cmlrZS10aHJvdWdoJyBhdHRyaWJ1dGUgb2YgdGhlIHNlbGVjdGVkIHRleHQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RSSUtFX1RIUk9VR0ggPSAic3RyaWtlVGhyb3VnaCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRvZ2dsZXMgdGhlIHN1YnNjcmlwdCBhdHRyaWJ1dGUgb2YgdGhlIHNlbGVjdGVkIHRleHQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1VCU0NSSVBUID0gInN1YnNjcmlwdCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRvZ2dsZXMgdGhlIHN1cGVyc2NyaXB0IGF0dHJpYnV0ZSBvZiB0aGUgc2VsZWN0ZWQgdGV4dC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVVBFUlNDUklQVCA9ICJzdXBlcnNjcmlwdCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRvZ2dsZXMgdGhlIHVuZGVybGluZSBhdHRyaWJ1dGUgb2YgdGhlIHNlbGVjdGVkIHRleHQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVU5ERVJMSU5FID0gInVuZGVybGluZSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFVuZG9lcyB0aGUgcHJldmlvdXMgY29tbWFuZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVTkRPID0gInVuZG8iOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBDb252ZXJ0cyBhIGxpbmsgdG8gbm9ybWFsIHRleHQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVU5MSU5LID0gInVubGluayI7IC8vJE5PTi1OTFMtMSQKLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvUmljaFRleHRFZGl0b3IuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L1JpY2hUZXh0RWRpdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyZGFlNDEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvUmljaFRleHRFZGl0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NDMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0OwotCi1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLlBhcmFtZXRlcml6ZWRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMub3BlcmF0aW9ucy5JVW5kb0NvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5zZXJ2aWNlYWJpbGl0eS5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmFjdGlvbnMuQ29weUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuYWN0aW9ucy5DdXRBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmFjdGlvbnMuRmluZFJlcGxhY2VBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmFjdGlvbnMuUGFzdGVBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmFjdGlvbnMuUGFzdGVQbGFpblRleHRBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5iaW5kaW5ncy5CaW5kaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmJpbmRpbmdzLmtleXMuS2V5U2VxdWVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYmluZGluZ3Mua2V5cy5LZXlTdHJva2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYmluZGluZ3Mua2V5cy5TV1RLZXlTdXBwb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Eb2N1bWVudEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlckV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0Vmlld2VyRXh0ZW5zaW9uNjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklVbmRvTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklVbmRvTWFuYWdlckV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlRleHRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5UZXh0Vmlld2VyVW5kb01hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNUYWJGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DVGFiSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlN0eWxlZFRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5WZXJpZnlLZXlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlZpZXdGb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuRE5EOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuRHJvcFRhcmdldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLkRyb3BUYXJnZXRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLkRyb3BUYXJnZXRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLkhUTUxUcmFuc2ZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLlRleHRUcmFuc2ZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLlRyYW5zZmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRGlzcG9zZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuSGVscExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuS2V5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5LZXlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1lbnVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1lbnVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5WZXJpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5GaWxsTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTWVudTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5NZW51SXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JQWN0aW9uQmFyczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JS2V5QmluZGluZ1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLkFjdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkua2V5cy5JQmluZGluZ1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkub3BlcmF0aW9ucy5PcGVyYXRpb25IaXN0b3J5QWN0aW9uSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5vcGVyYXRpb25zLlJlZG9BY3Rpb25IYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm9wZXJhdGlvbnMuVW5kb0FjdGlvbkhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JQWJzdHJhY3RUZXh0RWRpdG9ySGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JUmVhZE9ubHlEZXBlbmRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JVGV4dEVkaXRvckFjdGlvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklVcGRhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JV29ya2JlbmNoQWN0aW9uRGVmaW5pdGlvbklkczsKLQotLyoqCi0gKiBUaGUgZGVmYXVsdCByaWNoIHRleHQgZWRpdG9yIGltcGxlbWVudGF0aW9uLgotICogPHA+Ci0gKiBUaGUgZGVmYXVsdCByaWNoIHRleHQgZWRpdG9yIHVzZXMgWEhUTUwgYXMgdGhlIHVuZGVybHlpbmcgbWFya3VwIGxhbmd1YWdlIGZvcgotICogdGhlIHJpY2ggdGV4dCBjb250ZW50LiBJdCBpcyBpbXBsZW1lbnRlZCB1c2luZyBhIDxjb2RlPlZpZXdGb3JtPC9jb2RlPgotICogY29udHJvbCB3aXRoIGEgdG9vbCBiYXIgYXQgdGhlIHRvcCwgYSB0YWIgZm9sZGVyIHRoYXQgY29udGFpbnMgYQotICogPGNvZGU+UmljaFRleHQ8L2NvZGU+IGNvbnRyb2wgZm9yIGVudGVyaW5nIHRoZSByaWNoIHRleHQgY29udGVudCwgYW5kIGEgdGFiCi0gKiBmb2xlciB0aGF0IGNvbnRhaW5zIGEgPGNvZGU+U3R5bGVUZXh0PC9jb2RlPiBjb250cm9sIGZvciB2aWV3aW5nIGFuZAotICogbW9kaWZ5aW5nIHRoZSBYSFRNTCByZXByZXNlbnRhdGlvbiBvZiB0aGUgcmljaCB0ZXh0IGNvbnRlbnQuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQGF1dGhvciBKZWZmIEhhcmR5Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBSaWNoVGV4dEVkaXRvciBpbXBsZW1lbnRzIElSaWNoVGV4dEVkaXRvciB7Ci0KLQkvLyBUaGUgSFRNTCB0YWIgbmFtZS4KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBIVE1MX1RBQl9OQU1FID0gUmljaFRleHRSZXNvdXJjZXMuaHRtbFRhYl90ZXh0OwotCi0JLy8gSWYgdHJ1ZSwgbG9nIGRlYnVnZ2luZyBpbmZvLgotCXByb3RlY3RlZCBib29sZWFuIGRlYnVnOwotCi0JLy8gVGhlIHBsdWctaW4gbG9nZ2VyLgotCXByb3RlY3RlZCBMb2dnZXIgbG9nZ2VyOwotCi0JLy8gVGhlIGJhc2UgcGF0aCB1c2VkIGZvciByZXNvbHZpbmcgbGlua3MgKDxocmVmPiwgPGltZz4sIGV0Yy4pLgotCXByb3RlY3RlZCBTdHJpbmcgYmFzZVBhdGg7Ci0KLQkvLyBUaGUgZWRpdG9yIGZvcm0uCi0JcHJvdGVjdGVkIFZpZXdGb3JtIGZvcm07Ci0KLQkvLyBUaGUgZWRpdG9yIHRvb2wgYmFyLgotCXByb3RlY3RlZCBJUmljaFRleHRUb29sQmFyIHRvb2xCYXI7Ci0KLQkvLyBUaGUgZWRpdG9yIGNvbnRlbnQuCi0JcHJvdGVjdGVkIENvbXBvc2l0ZSBjb250ZW50OwotCi0JLy8gVGhlIGVkaXRvciB0YWIgZm9sZGVyLgotCXByb3RlY3RlZCBDVGFiRm9sZGVyIHRhYkZvbGRlcjsKLQotCS8vIFRoZSByaWNoIHRleHQgdGFiCi0JcHJvdGVjdGVkIENUYWJJdGVtIHJpY2hUZXh0VGFiOwotCi0JLy8gVGhlIEhUTUwgc291cmNlIHRhYgotCXByb3RlY3RlZCBDVGFiSXRlbSBodG1sVGFiOwotCi0JLy8gVGhlIGVtYmVkZGVkIHJpY2ggdGV4dCBjb250cm9sLgotCXByb3RlY3RlZCBJUmljaFRleHQgcmljaFRleHQ7Ci0KLQkvLyBUaGUgdW5kZXJseWluZyBIVE1MIHRleHQgZWRpdG9yLgotCXByb3RlY3RlZCBUZXh0Vmlld2VyIHNvdXJjZVZpZXdlcjsKLQkKLQlwcm90ZWN0ZWQgSURvY3VtZW50IGN1cnJlbnREb2M7Ci0JCi0JLy8gRHJvcCBzdXBwb3J0Ci0JcHJvdGVjdGVkIERyb3BUYXJnZXQgc291cmNlRWRpdERyb3BUYXJnZXQ7Ci0KLQkvLyBIVE1MIGVkaXRvcidzIGNvbnRleHQgbWVudQotCXByb3RlY3RlZCBNZW51IGNvbnRleHRNZW51OwotCi0JLy8gSGFzIHRoZSBIVE1MIHNvdXJjZSBiZWVuIG1vZGlmaWVkPwotCXByb3RlY3RlZCBib29sZWFuIHNvdXJjZU1vZGlmaWVkID0gZmFsc2U7Ci0KLQkvLyBUaGUgZWRpdG9yJ3MgZWRpdGFibGUgZmxhZy4KLQlwcm90ZWN0ZWQgYm9vbGVhbiBlZGl0YWJsZSA9IHRydWU7Ci0JCi0JcHJpdmF0ZSBPcGVyYXRpb25IaXN0b3J5QWN0aW9uSGFuZGxlciB1bmRvQWN0aW9uOwotCQotCXByaXZhdGUgT3BlcmF0aW9uSGlzdG9yeUFjdGlvbkhhbmRsZXIgcmVkb0FjdGlvbjsKLQkKLQlwcml2YXRlIElFZGl0b3JTaXRlIGVkaXRvclNpdGU7Ci0KLQkvKiogVGhlIGFjdGlvbnMgcmVnaXN0ZXJlZCB3aXRoIHRoZSBlZGl0b3IuICovCi0JcHJpdmF0ZSBNYXA8U3RyaW5nLCBJQWN0aW9uPiBmQWN0aW9ucz0gbmV3IEhhc2hNYXA8U3RyaW5nLCBJQWN0aW9uPigxMCk7Ci0JCi0JLyoqIFRoZSB2ZXJpZnkga2V5IGxpc3RlbmVyIGZvciBhY3RpdmF0aW9uIGNvZGUgdHJpZ2dlcmluZy4gKi8KLQlwcml2YXRlIEFjdGl2YXRpb25Db2RlVHJpZ2dlciBmQWN0aXZhdGlvbkNvZGVUcmlnZ2VyPSBuZXcgQWN0aXZhdGlvbkNvZGVUcmlnZ2VyKCk7Ci0JCi0JLyoqIFRoZSBlZGl0b3IncyBhY3Rpb24gYWN0aXZhdGlvbiBjb2Rlcy4gKi8KLQlwcml2YXRlIExpc3QgZkFjdGl2YXRpb25Db2Rlcz0gbmV3IEFycmF5TGlzdCgyKTsKLQkKLQlmaW5hbCBJVW5kb01hbmFnZXIgdW5kb01hbmFnZXI9IG5ldyBUZXh0Vmlld2VyVW5kb01hbmFnZXIoMTApOwotCQotCS8qKgotCSAqIFRoZSBrZXkgYmluZGluZyBzY29wZXMgb2YgdGhpcyBlZGl0b3IuCi0JICogQHNpbmNlIDIuMQotCSAqLwotCXByaXZhdGUgU3RyaW5nW10gZktleUJpbmRpbmdTY29wZXM7Ci0KLQkKLQlwcm90ZWN0ZWQgSURvY3VtZW50TGlzdGVuZXIgc291cmNlRWRpdERvY3VtZW50TGlzdGVuZXI9IG5ldyBJRG9jdW1lbnRMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgZG9jdW1lbnRBYm91dFRvQmVDaGFuZ2VkKERvY3VtZW50RXZlbnQgZXZlbnQpIHsKLQkJfQotCQlwdWJsaWMgdm9pZCBkb2N1bWVudENoYW5nZWQoRG9jdW1lbnRFdmVudCBldmVudCkgewotCQkJc291cmNlTW9kaWZpZWQgPSB0cnVlOwotCQkJaWYgKHJpY2hUZXh0ICE9IG51bGwgJiYgcmljaFRleHQgaW5zdGFuY2VvZiBSaWNoVGV4dCkgewotCQkJCXJpY2hUZXh0Lm5vdGlmeU1vZGlmeUxpc3RlbmVycygpOwotCQkJfQotCQl9Ci0JfTsKLQotCi0JLy8gVGhlIGRlYWN0aXZhdGUgbGlzdGVuZXIgZm9yIHRoZSBzb3VyY2VFZGl0IGNvbnRyb2wuCi0JcHJvdGVjdGVkIExpc3RlbmVyIHNvdXJjZUVkaXREZWFjdGl2YXRlTGlzdGVuZXIgPSBuZXcgTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQlpZiAoc291cmNlTW9kaWZpZWQpIHsKLQkJCQl1cGRhdGVSaWNoVGV4dChzb3VyY2VWaWV3ZXIuZ2V0VGV4dFdpZGdldCgpLmdldFRleHQoKSk7Ci0JCQkJc2V0TW9kaWZpZWQodHJ1ZSk7Ci0JCQkJc291cmNlTW9kaWZpZWQgPSBmYWxzZTsKLQkJCX0KLQkJfQotCX07Ci0KLQkvLyBUaGUga2V5IGxpc3RlbmVyIGZvciB0aGUgc291cmNlRWRpdCBjb250cm9sLgotCXByb3RlY3RlZCBLZXlMaXN0ZW5lciBzb3VyY2VFZGl0S2V5TGlzdGVuZXIgPSBuZXcgS2V5TGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGtleVByZXNzZWQoS2V5RXZlbnQgZSkgewotCQkJT2JqZWN0IGFkYXB0ZXIgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFkYXB0ZXIoCi0JCQkJCUlCaW5kaW5nU2VydmljZS5jbGFzcyk7Ci0JCQlpZiAoYWRhcHRlciAhPSBudWxsICYmIGFkYXB0ZXIgaW5zdGFuY2VvZiBJQmluZGluZ1NlcnZpY2UpIHsKLQkJCQlpbnQgYWNjZWwgPSBTV1RLZXlTdXBwb3J0Ci0JCQkJCQkuY29udmVydEV2ZW50VG9Vbm1vZGlmaWVkQWNjZWxlcmF0b3IoZSk7Ci0JCQkJS2V5U3Ryb2tlIHN0cm9rZSA9IFNXVEtleVN1cHBvcnQKLQkJCQkJCS5jb252ZXJ0QWNjZWxlcmF0b3JUb0tleVN0cm9rZShhY2NlbCk7Ci0JCQkJS2V5U2VxdWVuY2Ugc2VxID0gS2V5U2VxdWVuY2UuZ2V0SW5zdGFuY2Uoc3Ryb2tlKTsKLQkJCQlCaW5kaW5nIGJpbmQgPSAoKElCaW5kaW5nU2VydmljZSkgYWRhcHRlcikuZ2V0UGVyZmVjdE1hdGNoKHNlcSk7Ci0JCQkJaWYgKGJpbmQgIT0gbnVsbCkgewotCQkJCQlQYXJhbWV0ZXJpemVkQ29tbWFuZCBjb21tYW5kID0gYmluZAotCQkJCQkJCS5nZXRQYXJhbWV0ZXJpemVkQ29tbWFuZCgpOwotCQkJCQlpZiAoY29tbWFuZCAhPSBudWxsKSB7Ci0JCQkJCQlTdHJpbmcgY21kSWQgPSBjb21tYW5kLmdldElkKCk7Ci0JCQkJCQlpZiAoY21kSWQgIT0gbnVsbAotCQkJCQkJCQkmJiBjbWRJZAotCQkJCQkJCQkJCS5lcXVhbHMoIm9yZy5lY2xpcHNlLnVpLmVkaXQuZmluZFJlcGxhY2UiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCQkJcmljaFRleHQuZ2V0RmluZFJlcGxhY2VBY3Rpb24oKS5leGVjdXRlKFJpY2hUZXh0RWRpdG9yLnRoaXMpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcHVibGljIHZvaWQga2V5UmVsZWFzZWQoS2V5RXZlbnQgZSkgewotCQl9Ci0JfTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBjb21wb3NpdGUKLQkgKiBAcGFyYW0gc3R5bGUKLQkgKiAgICAgICAgICAgIHRoZSBlZGl0b3Igc3R5bGUKLQkgKi8KLQlwdWJsaWMgUmljaFRleHRFZGl0b3IoQ29tcG9zaXRlIHBhcmVudCwgaW50IHN0eWxlLCBJRWRpdG9yU2l0ZSBlZGl0b3JTaXRlKSB7Ci0JCXRoaXMocGFyZW50LCBzdHlsZSwgZWRpdG9yU2l0ZSwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IGNvbXBvc2l0ZQotCSAqIEBwYXJhbSBzdHlsZQotCSAqICAgICAgICAgICAgdGhlIGVkaXRvciBzdHlsZQotCSAqIEBwYXJhbSBiYXNlUGF0aAotCSAqICAgICAgICAgICAgdGhlIGJhc2UgcGF0aCB1c2VkIGZvciByZXNvbHZpbmcgbGlua3MKLQkgKi8KLQlwdWJsaWMgUmljaFRleHRFZGl0b3IoQ29tcG9zaXRlIHBhcmVudCwgaW50IHN0eWxlLCBJRWRpdG9yU2l0ZSBlZGl0b3JTaXRlLCBTdHJpbmcgYmFzZVBhdGgpIHsKLQkJdGhpcy5iYXNlUGF0aCA9IGJhc2VQYXRoOwotCQl0aGlzLmVkaXRvclNpdGUgPSBlZGl0b3JTaXRlOwotCQlkZWJ1ZyA9IFJpY2hUZXh0UGx1Z2luLmdldERlZmF1bHQoKS5pc0RlYnVnZ2luZygpOwotCQlsb2dnZXIgPSBSaWNoVGV4dFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCk7Ci0JCWluaXQocGFyZW50LCBzdHlsZSk7Ci0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZXMgdGhpcyBlZGl0b3IuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBjb21wb3NpdGUKLQkgKiBAcGFyYW0gc3R5bGUKLQkgKiAgICAgICAgICAgIHRoZSBlZGl0b3Igc3R5bGUKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0KENvbXBvc2l0ZSBwYXJlbnQsIGludCBzdHlsZSkgewotCQl0cnkgewotCQkJZm9ybSA9IG5ldyBWaWV3Rm9ybShwYXJlbnQsIHN0eWxlKTsKLQkJCWZvcm0ubWFyZ2luSGVpZ2h0ID0gMDsKLQkJCWZvcm0ubWFyZ2luV2lkdGggPSAwOwotCi0JCQl0b29sQmFyID0gbmV3IFJpY2hUZXh0VG9vbEJhcihmb3JtLCBTV1QuRkxBVCwgdGhpcyk7Ci0KLQkJCWNvbnRlbnQgPSBuZXcgQ29tcG9zaXRlKGZvcm0sIFNXVC5GTEFUKTsKLQkJCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJCWxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJCWNvbnRlbnQuc2V0TGF5b3V0KGxheW91dCk7Ci0KLQkJCXRhYkZvbGRlciA9IGNyZWF0ZUVkaXRvclRhYkZvbGRlcihjb250ZW50LCBzdHlsZSk7Ci0KLQkJCWZvcm0uc2V0VG9wQ2VudGVyKCgoUmljaFRleHRUb29sQmFyKXRvb2xCYXIpLmdldFRvb2xiYXJNZ3IoKS5nZXRDb250cm9sKCkpOwotCQkJZm9ybS5zZXRUb3BMZWZ0KCgoUmljaFRleHRUb29sQmFyKXRvb2xCYXIpLmdldFRvb2xiYXJNZ3JDb21ibygpLmdldENvbnRyb2woKSk7Ci0JCQlmb3JtLnNldENvbnRlbnQoY29udGVudCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlsb2dnZXIubG9nRXJyb3IoZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBmb3JtIGNvbnRyb2wuCi0JICogCi0JICogQHJldHVybiB0aGUgZm9ybSBjb250cm9sCi0JICovCi0JcHVibGljIENvbnRyb2wgZ2V0Q29udHJvbCgpIHsKLQkJcmV0dXJuIGZvcm07Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmljaCB0ZXh0IGNvbnRyb2wgZW1iZWRkZWQgd2l0aGluIHRoaXMgZWRpdG9yLgotCSAqLwotCXB1YmxpYyBJUmljaFRleHQgZ2V0UmljaFRleHRDb250cm9sKCkgewotCQlyZXR1cm4gcmljaFRleHQ7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgbGF5b3V0IGRhdGEuCi0JICogCi0JICogQHBhcmFtIGxheW91dERhdGEKLQkgKiAgICAgICAgICAgIHRoZSBsYXlvdXQgZGF0YSB0byBzZXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMYXlvdXREYXRhKE9iamVjdCBsYXlvdXREYXRhKSB7Ci0JCWlmIChmb3JtICE9IG51bGwpIHsKLQkJCWZvcm0uc2V0TGF5b3V0RGF0YShsYXlvdXREYXRhKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGxheW91dCBkYXRhLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGVkaXRvcidzIGxheW91dCBkYXRhCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRMYXlvdXREYXRhKCkgewotCQlpZiAoZm9ybSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gZm9ybS5nZXRMYXlvdXREYXRhKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogU2V0cyBmb2N1cyB0byB0aGlzIGVkaXRvci4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGb2N1cygpIHsKLQkJaWYgKHJpY2hUZXh0ICE9IG51bGwpIHsKLQkJCXJpY2hUZXh0LnNldEZvY3VzKCk7Ci0JCX0KLQkJc2V0U2VsZWN0aW9uKDApOwotCQlpZiAodG9vbEJhciAhPSBudWxsICYmIHRhYkZvbGRlciAhPSBudWxsKSB7Ci0JCQl0b29sQmFyLnVwZGF0ZVRvb2xCYXIoZWRpdGFibGUpOwotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBUZWxscyB0aGUgY29udHJvbCBpdCBkb2VzIG5vdCBoYXZlIGZvY3VzLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEJsdXIoKSB7Ci0JCWlmIChyaWNoVGV4dCAhPSBudWxsKSB7Ci0JCQlyaWNoVGV4dC5zZXRCbHVyKCk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQ2hlY2tzIHdoZXRoZXIgdGhpcyBlZGl0b3IgaGFzIGZvY3VzLgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBlZGl0b3IgaGFzIHRoZSB1c2VyLWludGVyZmFjZSBmb2N1cwotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc0ZvY3VzKCkgewotCQlpZiAocmljaFRleHQgIT0gbnVsbCkgewotCQkJcmV0dXJuIHJpY2hUZXh0Lmhhc0ZvY3VzKCk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFNlbGVjdHMgdGhlIFJpY2ggVGV4dCBvciBIVE1MIHRhYi4KLQkgKiAKLQkgKiBAcGFyYW0gaW5kZXgKLQkgKiAgICAgICAgICAgIDxjb2RlPjA8L2NvZGU+IGZvciB0aGUgUmljaCBUZXh0IHRhYiwgPGNvZGU+MTwvY29kZT4gZm9yCi0JICogICAgICAgICAgICB0aGUgSFRNTCB0YWIuCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2VsZWN0aW9uKGludCBpbmRleCkgewotCQlpZiAodGFiRm9sZGVyICE9IG51bGwpIHsKLQkJCXRhYkZvbGRlci5zZXRTZWxlY3Rpb24oaW5kZXgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgYmFzZSBwYXRoIHVzZWQgZm9yIHJlc29sdmluZyB0ZXh0IGFuZCBpbWFnZSBsaW5rcy4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBiYXNlIHBhdGggdXNlZCBmb3IgcmVzb2x2aW5nIGxpbmtzIHNwZWNpZmllZCB3aXRoIDxocmVmPiwKLQkgKiAgICAgICAgIDxpbWc+LCBldGMuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRCYXNlUGF0aCgpIHsKLQkJcmV0dXJuIGJhc2VQYXRoOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGJhc2UgVVJMIG9mIHRoZSByaWNoIHRleHQgY29udHJvbCB3aG9zZSBjb250ZW50IHdhcyBsYXN0Ci0JICogY29waWVkIHRvIHRoZSBjbGlwYm9hcmQuCi0JICogCi0JICogQHJldHVybiB0aGUgYmFzZSBVUkwgb2YgYSByaWNoIHRleHQgY29udHJvbAotCSAqLwotCXB1YmxpYyBVUkwgZ2V0Q29weVVSTCgpIHsKLQkJaWYgKHJpY2hUZXh0ICE9IG51bGwpIHsKLQkJCXJldHVybiByaWNoVGV4dC5nZXRDb3B5VVJMKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgYmFzZSBVUkwgb2YgdGhlIHJpY2ggdGV4dCBjb250cm9sIHdob3NlIGNvbnRlbnQgd2FzIGxhc3QgY29waWVkCi0JICogdG8gdGhlIGNsaXBib2FyZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb3B5VVJMKCkgewotCQlpZiAocmljaFRleHQgIT0gbnVsbCkgewotCQkJcmljaFRleHQuc2V0Q29weVVSTCgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZWRpdGFibGUgc3RhdGUuCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgY29udGVudCBjYW4gYmUgZWRpdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZ2V0RWRpdGFibGUoKSB7Ci0JCXJldHVybiBlZGl0YWJsZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBlZGl0YWJsZSBzdGF0ZS4KLQkgKiAKLQkgKiBAcGFyYW0gZWRpdGFibGUKLQkgKiAgICAgICAgICAgIHRoZSBlZGl0YWJsZSBzdGF0ZQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVkaXRhYmxlKGJvb2xlYW4gZWRpdGFibGUpIHsKLQkJdGhpcy5lZGl0YWJsZSA9IGVkaXRhYmxlOwotCQlpZiAodG9vbEJhciAhPSBudWxsICYmIHRhYkZvbGRlciAhPSBudWxsKSB7Ci0JCQl0b29sQmFyLnVwZGF0ZVRvb2xCYXIoZWRpdGFibGUpOwotCQl9Ci0JCWlmIChyaWNoVGV4dCAhPSBudWxsKSB7Ci0JCQlyaWNoVGV4dC5zZXRFZGl0YWJsZShlZGl0YWJsZSk7Ci0JCX0KLQkJaWYgKHNvdXJjZVZpZXdlciAhPSBudWxsKSB7Ci0JCQlzb3VyY2VWaWV3ZXIuc2V0RWRpdGFibGUoZWRpdGFibGUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ2hlY2tzIHdoZXRoZXIgdGhlIGNvbnRlbnQgaGFzIGJlZW4gbW9kaWZpZWQuCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgY29udGVudCBoYXMgYmVlbiBtb2RpZmllZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGdldE1vZGlmaWVkKCkgewotCQlpZiAocmljaFRleHQgIT0gbnVsbCkgewotCQkJcmV0dXJuIHJpY2hUZXh0LmdldE1vZGlmaWVkKCk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIG1vZGlmaWVkIHN0YXRlLgotCSAqIAotCSAqIEBwYXJhbSBtb2RpZmllZAotCSAqICAgICAgICAgICAgdGhlIG1vZGlmaWVkIHN0YXRlCi0JICovCi0JcHVibGljIHZvaWQgc2V0TW9kaWZpZWQoYm9vbGVhbiBtb2RpZmllZCkgewotCQlpZiAocmljaFRleHQgIT0gbnVsbCkgewotCQkJcmljaFRleHQuc2V0TW9kaWZpZWQobW9kaWZpZWQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmljaCB0ZXh0IGNvbnRlbnQuCi0JICogCi0JICogQHJldHVybiB0aGUgcmljaCB0ZXh0IGNvbnRlbnQgZm9ybWF0dGVkIGluIFhIVE1MCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KCkgewotCQlpZiAoc291cmNlTW9kaWZpZWQpIHsKLQkJCXNldFRleHQoZ2V0U291cmNlRWRpdCgpLmdldFRleHQoKSk7Ci0JCQlzZXRNb2RpZmllZCh0cnVlKTsKLQkJCXNvdXJjZU1vZGlmaWVkID0gZmFsc2U7Ci0JCX0KLQkJaWYgKHJpY2hUZXh0ICE9IG51bGwpIHsKLQkJCXJldHVybiByaWNoVGV4dC5nZXRUZXh0KCk7Ci0JCX0KLQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgcmljaCB0ZXh0IGNvbnRlbnQuCi0JICogCi0JICogQHBhcmFtIHRleHQKLQkgKiAgICAgICAgICAgIHRoZSByaWNoIHRleHQgY29udGVudCBpbiBYSFRNTCBmb3JtYXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUZXh0KFN0cmluZyB0ZXh0KSB7Ci0JCWlmIChyaWNoVGV4dCAhPSBudWxsKSB7Ci0JCQlyaWNoVGV4dC5zZXRUZXh0KHRleHQpOwotCQl9Ci0JCXNvdXJjZU1vZGlmaWVkID0gZmFsc2U7Ci0JCWlmICh0YWJGb2xkZXIgIT0gbnVsbCkgewotCQkJaWYgKHRvb2xCYXIgIT0gbnVsbCkgewotCQkJCXRvb2xCYXIudXBkYXRlVG9vbEJhcihlZGl0YWJsZSk7Ci0JCQl9Ci0JCQlpZiAoZ2V0U291cmNlRWRpdCgpICE9IG51bGwpIHsKLQkJCQlyZW1vdmVNb2RpZnlMaXN0ZW5lcnMoKTsKLQkJCQljdXJyZW50RG9jLnNldCh0ZXh0KTsKLQkJCQlhZGRNb2RpZnlMaXN0ZW5lcnMoKTsKLQkJCX0KLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBhZGRNb2RpZnlMaXN0ZW5lcnMoKSB7Ci0JCWlmIChjdXJyZW50RG9jICE9IG51bGwpIHsKLQkJCWN1cnJlbnREb2MuYWRkRG9jdW1lbnRMaXN0ZW5lcihzb3VyY2VFZGl0RG9jdW1lbnRMaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVNb2RpZnlMaXN0ZW5lcnMoKSB7Ci0JCWlmIChjdXJyZW50RG9jICE9IG51bGwpIHsKLQkJCWN1cnJlbnREb2MucmVtb3ZlRG9jdW1lbnRMaXN0ZW5lcihzb3VyY2VFZGl0RG9jdW1lbnRMaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5JUmljaFRleHQjY2hlY2tNb2RpZnkoKQotCSAqLwotCXB1YmxpYyB2b2lkIGNoZWNrTW9kaWZ5KCkgewotCQlyaWNoVGV4dC5jaGVja01vZGlmeSgpOwotCQlpZiAoc291cmNlTW9kaWZpZWQpIHsKLQkJCW5vdGlmeU1vZGlmeUxpc3RlbmVycygpOwotCQl9Ci0JCWlmIChkZWJ1ZykgewotCQkJcHJpbnREZWJ1Z01lc3NhZ2UoImNoZWNrTW9kaWZ5IiwgIm1vZGlmaWVkPSIgKyBzb3VyY2VNb2RpZmllZCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAkKLQkJfQotCX0KLQotCS8qKgotCSAqIFJlc3RvcmVzIHRoZSByaWNoIHRleHQgY29udGVudCBiYWNrIHRvIHRoZSBpbml0aWFsIHZhbHVlLgotCSAqLwotCXB1YmxpYyB2b2lkIHJlc3RvcmVUZXh0KCkgewotCQlpZiAocmljaFRleHQgIT0gbnVsbCkgewotCQkJcmljaFRleHQucmVzdG9yZVRleHQoKTsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LklSaWNoVGV4dCNnZXRTZWxlY3RlZCgpCi0JICovCi0JcHVibGljIFJpY2hUZXh0U2VsZWN0aW9uIGdldFNlbGVjdGVkKCkgewotCQlpZiAodGFiRm9sZGVyLmdldFNlbGVjdGlvbigpID09IGh0bWxUYWIpIHsKLQkJCVN0cmluZyBIVE1Mc291cmNlID0gZ2V0U291cmNlRWRpdCgpLmdldFRleHQoKTsKLQkJCVBvaW50IHNlbCA9IHNvdXJjZVZpZXdlci5nZXRTZWxlY3RlZFJhbmdlKCk7Ci0JCQlpbnQgc2VsU3RhcnRJbmRleCA9IHNlbC54OwotCQkJaW50IHNlbEVuZEluZGV4ID0gc2VsLnggKyBzZWwueSAtIDE7Ci0JCQlyaWNoVGV4dC5nZXRTZWxlY3RlZCgpLmNsZWFyKCk7Ci0JCQlyaWNoVGV4dC5nZXRTZWxlY3RlZCgpLnNldFRleHQoSFRNTHNvdXJjZS5zdWJzdHJpbmcoc2VsU3RhcnRJbmRleCwgc2VsRW5kSW5kZXggKyAxKSk7Ci0JCX0KLQkJcmV0dXJuIHJpY2hUZXh0LmdldFNlbGVjdGVkKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhbiBhcHBsaWNhdGlvbiBzcGVjaWZpYyBwcm9wZXJ0eSB2YWx1ZS4KLQkgKiAKLQkgKiBAcGFyYW0ga2V5Ci0JICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgcHJvcGVydHkKLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgcHJvcGVydHkgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgaXQgaGFzIG5vdAotCSAqICAgICAgICAgYmVlbiBzZXQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldERhdGEoU3RyaW5nIGtleSkgewotCQlpZiAocmljaFRleHQgIT0gbnVsbCkgewotCQkJcmljaFRleHQuZ2V0RGF0YShrZXkpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFNldHMgYW4gYXBwbGljYXRpb24gc3BlY2lmaWMgcHJvcGVydHkgbmFtZSBhbmQgdmFsdWUuCi0JICogCi0JICogQHBhcmFtIGtleQotCSAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5Ci0JICogQHBhcmFtIHZhbHVlCi0JICogICAgICAgICAgICB0aGUgbmV3IHZhbHVlIGZvciB0aGUgcHJvcGVydHkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREYXRhKFN0cmluZyBrZXksIE9iamVjdCB2YWx1ZSkgewotCQlpZiAocmljaFRleHQgIT0gbnVsbCkgewotCQkJcmljaFRleHQuc2V0RGF0YShrZXksIHZhbHVlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEV4ZWN1dGVzIHRoZSBnaXZlbiByaWNoIHRleHQgY29tbWFuZC4gVGhlIHN1cHBvcnRlZCBjb21tYW5kIHN0cmluZ3MgYXJlCi0JICogZGVmaW5lZCBpbiA8Y29kZT5SaWNoVGV4dENvbW1hbmQ8Y29kZT4uCi0JICogCi0JICogQHBhcmFtCWNvbW1hbmQJCWEgcmljaCB0ZXh0IGNvbW1hbmQgc3RyaW5nCi0JICogQHJldHVybglhIHN0YXR1cyBjb2RlIHJldHVybmVkIGJ5IHRoZSBleGVjdXRlZCBjb21tYW5kCi0JICovCi0JcHVibGljIGludCBleGVjdXRlQ29tbWFuZChTdHJpbmcgY29tbWFuZCkgewotCQlpZiAocmljaFRleHQgIT0gbnVsbCkgewotCQkJcmV0dXJuIHJpY2hUZXh0LmV4ZWN1dGVDb21tYW5kKGNvbW1hbmQpOwotCQl9Ci0JCXJldHVybiAwOwotCX0KLQotCS8qKgotCSAqIEV4ZWN1dGVzIHRoZSBnaXZlbiByaWNoIHRleHQgY29tbWFuZCB3aXRoIGEgc2luZ2xlIHBhcmFtZXRlci4gVGhlCi0JICogc3VwcG9ydGVkIGNvbW1hbmQgc3RyaW5ncyBhcmUgZGVmaW5lZCBpbiA8Y29kZT5SaWNoVGV4dENvbW1hbmQ8Y29kZT4uCi0JICogCi0JICogQHBhcmFtCWNvbW1hbmQJCWEgcmljaCB0ZXh0IGNvbW1hbmQgc3RyaW5nCi0JICogQHBhcmFtCXBhcmFtCQlhIHBhcmFtZXRlciBmb3IgdGhlIGNvbW1hbmQgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKiBAcmV0dXJuCWEgc3RhdHVzIGNvZGUgcmV0dXJuZWQgYnkgdGhlIGV4ZWN1dGVkIGNvbW1hbmQKLQkgKi8KLQlwdWJsaWMgaW50IGV4ZWN1dGVDb21tYW5kKFN0cmluZyBjb21tYW5kLCBTdHJpbmcgcGFyYW0pIHsKLQkJaWYgKHJpY2hUZXh0ICE9IG51bGwpIHsKLQkJCXJldHVybiByaWNoVGV4dC5leGVjdXRlQ29tbWFuZChjb21tYW5kLCBwYXJhbSk7Ci0JCX0KLQkJcmV0dXJuIDA7Ci0JfQotCi0JLyoqCi0JICogRXhlY3V0ZXMgdGhlIGdpdmVuIHJpY2ggdGV4dCBjb21tYW5kIHdpdGggYW4gYXJyYXkgb2YgcGFyYW1ldGVycy4gVGhlCi0JICogc3VwcG9ydGVkIGNvbW1hbmQgc3RyaW5ncyBhcmUgZGVmaW5lZCBpbiA8Y29kZT5SaWNoVGV4dENvbW1hbmQ8Y29kZT4uCi0JICogCi0JICogQHBhcmFtCWNvbW1hbmQJCWEgcmljaCB0ZXh0IGNvbW1hbmQgc3RyaW5nCi0JICogQHBhcmFtCXBhcmFtcwkJYW4gYXJyYXkgb2YgcGFyYW1ldGVycyBmb3IgdGhlIGNvbW1hbmQgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKiBAcmV0dXJuCWEgc3RhdHVzIGNvZGUgcmV0dXJuZWQgYnkgdGhlIGV4ZWN1dGVkIGNvbW1hbmQKLQkgKi8KLQlwdWJsaWMgaW50IGV4ZWN1dGVDb21tYW5kKFN0cmluZyBjb21tYW5kLCBTdHJpbmdbXSBwYXJhbXMpIHsKLQkJaWYgKHJpY2hUZXh0ICE9IG51bGwpIHsKLQkJCXJldHVybiByaWNoVGV4dC5leGVjdXRlQ29tbWFuZChjb21tYW5kLCBwYXJhbXMpOwotCQl9Ci0JCXJldHVybiAwOwotCX0KLQotCS8qKgotCSAqIERpc3Bvc2VzIHRoZSBvcGVyYXRpbmcgc3lzdGVtIHJlc291cmNlcyBhbGxvY2F0ZWQgYnkgdGhpcyBlZGl0b3IuCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJaWYgKGNvbnRleHRNZW51ICE9IG51bGwgJiYgIWNvbnRleHRNZW51LmlzRGlzcG9zZWQoKSkgewotCQkJY29udGV4dE1lbnUuZGlzcG9zZSgpOwotCQkJY29udGV4dE1lbnUgPSBudWxsOwotCQl9Ci0JCWlmIChzb3VyY2VFZGl0RHJvcFRhcmdldCAhPSBudWxsKSB7Ci0JCQlzb3VyY2VFZGl0RHJvcFRhcmdldC5kaXNwb3NlKCk7Ci0JCQlzb3VyY2VFZGl0RHJvcFRhcmdldCA9IG51bGw7Ci0JCX0KLQkJaWYgKGZBY3RpdmF0aW9uQ29kZVRyaWdnZXIgIT0gbnVsbCkgewotCQkJZkFjdGl2YXRpb25Db2RlVHJpZ2dlci51bmluc3RhbGwoKTsKLQkJCWZBY3RpdmF0aW9uQ29kZVRyaWdnZXI9IG51bGw7Ci0JCX0KLQkJcmVtb3ZlTW9kaWZ5TGlzdGVuZXJzKCk7Ci0JCWlmIChnZXRTb3VyY2VFZGl0KCkgIT0gbnVsbCkgewotCQkJZ2V0U291cmNlRWRpdCgpLnJlbW92ZUxpc3RlbmVyKFNXVC5EZWFjdGl2YXRlLAotCQkJCQlzb3VyY2VFZGl0RGVhY3RpdmF0ZUxpc3RlbmVyKTsKLQkJCWdldFNvdXJjZUVkaXQoKS5yZW1vdmVLZXlMaXN0ZW5lcihzb3VyY2VFZGl0S2V5TGlzdGVuZXIpOwotCQkJc291cmNlRWRpdERlYWN0aXZhdGVMaXN0ZW5lciA9IG51bGw7Ci0JCQlzb3VyY2VFZGl0S2V5TGlzdGVuZXIgPSBudWxsOwotCQl9Ci0JCQotCQlpZiAoc291cmNlVmlld2VyICE9IG51bGwpIHsKLQkJCXNvdXJjZVZpZXdlcj0gbnVsbDsKLQkJfQotCi0JCWlmIChmQWN0aW9ucyAhPSBudWxsKSB7Ci0JCQlmQWN0aW9ucy5jbGVhcigpOwotCQkJZkFjdGlvbnM9IG51bGw7Ci0JCX0KLQkJaWYgKGZBY3RpdmF0aW9uQ29kZXMgIT0gbnVsbCkgewotCQkJZkFjdGl2YXRpb25Db2Rlcy5jbGVhcigpOwotCQkJZkFjdGl2YXRpb25Db2Rlcz0gbnVsbDsKLQkJfQotCi0JCWlmIChyaWNoVGV4dCAhPSBudWxsKSB7Ci0JCQlyaWNoVGV4dC5kaXNwb3NlKCk7Ci0JCQlyaWNoVGV4dCA9IG51bGw7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDaGVja3Mgd2hldGhlciB0aGlzIGNvbnRyb2wgaGFzIGJlZW4gZGlzcG9zZWQuCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIGNvbnRyb2wgaXMgZGlzcG9zZWQgc3VjY2Vzc2Z1bGx5Ci0JICovCi0JcHVibGljIGJvb2xlYW4gaXNEaXNwb3NlZCgpIHsKLQkJaWYgKHJpY2hUZXh0ICE9IG51bGwpIHsKLQkJCXJldHVybiByaWNoVGV4dC5pc0Rpc3Bvc2VkKCk7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbW9kaWZ5IGxpc3RlbmVycyBhdHRhY2hlZCB0byB0aGlzIGVkaXRvci4KLQkgKiAKLQkgKiBAcmV0dXJuIGFuIGl0ZXJhdG9yIGZvciByZXRyaWV2aW5nIHRoZSBtb2RpZnkgbGlzdGVuZXJzCi0JICovCi0JcHVibGljIEl0ZXJhdG9yPE1vZGlmeUxpc3RlbmVyPiBnZXRNb2RpZnlMaXN0ZW5lcnMoKSB7Ci0JCWlmIChyaWNoVGV4dCAhPSBudWxsKSB7Ci0JCQlyaWNoVGV4dC5nZXRNb2RpZnlMaXN0ZW5lcnMoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIGEgbGlzdGVuZXIgdG8gdGhlIGNvbGxlY3Rpb24gb2YgbGlzdGVuZXJzIHdobyB3aWxsIGJlIG5vdGlmaWVkIHdoZW4KLQkgKiBrZXlzIGFyZSBwcmVzc2VkIGFuZCByZWxlYXNlZCB3aXRoaW4gdGhpcyBlZGl0b3IuCi0JICogCi0JICogQHBhcmFtIGxpc3RlbmVyCi0JICogICAgICAgICAgICB0aGUgbGlzdGVuZXIgd2hpY2ggc2hvdWxkIGJlIG5vdGlmaWVkCi0JICovCi0JcHVibGljIHZvaWQgYWRkS2V5TGlzdGVuZXIoS2V5TGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJaWYgKHJpY2hUZXh0ICE9IG51bGwpIHsKLQkJCXJpY2hUZXh0LmFkZEtleUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJlbW92ZXMgYSBsaXN0ZW5lciBmcm9tIHRoZSBjb2xsZWN0aW9uIG9mIGxpc3RlbmVycyB3aG8gd2lsbCBiZSBub3RpZmllZAotCSAqIHdoZW4ga2V5cyBhcmUgcHJlc3NlZCBhbmQgcmVsZWFzZWQgd2l0aGluIHRoaXMgZWRpdG9yLgotCSAqIAotCSAqIEBwYXJhbSBsaXN0ZW5lcgotCSAqICAgICAgICAgICAgdGhlIGxpc3RlbmVyIHdoaWNoIHNob3VsZCBubyBsb25nZXIgYmUgbm90aWZpZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVLZXlMaXN0ZW5lcihLZXlMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlpZiAocmljaFRleHQgIT0gbnVsbCkgewotCQkJcmljaFRleHQucmVtb3ZlS2V5TGlzdGVuZXIobGlzdGVuZXIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQWRkcyBhIGxpc3RlbmVyIHRvIHRoZSBjb2xsZWN0aW9uIG9mIGxpc3RlbmVycyB3aG8gd2lsbCBiZSBub3RpZmllZCB3aGVuCi0JICogdGhlIGNvbnRlbnQgb2YgdGhpcyBlZGl0b3IgaXMgbW9kaWZpZWQuCi0JICogCi0JICogQHBhcmFtIGxpc3RlbmVyCi0JICogICAgICAgICAgICB0aGUgbGlzdGVuZXIgd2hpY2ggc2hvdWxkIGJlIG5vdGlmaWVkCi0JICovCi0JcHVibGljIHZvaWQgYWRkTW9kaWZ5TGlzdGVuZXIoTW9kaWZ5TGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJaWYgKHJpY2hUZXh0ICE9IG51bGwpIHsKLQkJCXJpY2hUZXh0LmFkZE1vZGlmeUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJlbW92ZXMgYSBsaXN0ZW5lciBmcm9tIHRoZSBjb2xsZWN0aW9uIG9mIGxpc3RlbmVycyB3aG8gd2lsbCBiZSBub3RpZmllZAotCSAqIHdoZW4gdGhlIGNvbnRlbnQgb2YgdGhpcyBlZGl0b3IgaXMgbW9kaWZpZWQuCi0JICogCi0JICogQHBhcmFtIGxpc3RlbmVyCi0JICogICAgICAgICAgICB0aGUgbGlzdGVuZXIgd2hpY2ggc2hvdWxkIG5vIGxvbmdlciBiZSBub3RpZmllZAotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZU1vZGlmeUxpc3RlbmVyKE1vZGlmeUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWlmIChyaWNoVGV4dCAhPSBudWxsKSB7Ci0JCQlyaWNoVGV4dC5yZW1vdmVNb2RpZnlMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBZGRzIHRoZSBsaXN0ZW5lciB0byB0aGUgY29sbGVjdGlvbiBvZiBsaXN0ZW5lcnMgd2hvIHdpbGwgYmUgbm90aWZlZCB3aGVuCi0JICogdGhpcyBlZGl0b3IgaXMgZGlzcG9zZWQuCi0JICogCi0JICogQHBhcmFtIGxpc3RlbmVyCi0JICogICAgICAgICAgICB0aGUgbGlzdGVuZXIgd2hpY2ggc2hvdWxkIGJlIG5vdGlmaWVkCi0JICovCi0JcHVibGljIHZvaWQgYWRkRGlzcG9zZUxpc3RlbmVyKERpc3Bvc2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlpZiAocmljaFRleHQgIT0gbnVsbCkgewotCQkJcmljaFRleHQuYWRkRGlzcG9zZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJlbW92ZXMgYSBsaXN0ZW5lciBmcm9tIHRoZSBjb2xsZWN0aW9uIG9mIGxpc3RlbmVycyB3aG8gd2lsbCBiZSBub3RpZmllZAotCSAqIHdoZW4gdGhpcyBlZGl0b3IgaXMgZGlzcG9zZWQuCi0JICogCi0JICogQHBhcmFtIGxpc3RlbmVyCi0JICogICAgICAgICAgICB0aGUgbGlzdGVuZXIgd2hpY2ggc2hvdWxkIG5vIGxvbmdlciBiZSBub3RpZmllZAotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZURpc3Bvc2VMaXN0ZW5lcihEaXNwb3NlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJaWYgKHJpY2hUZXh0ICE9IG51bGwpIHsKLQkJCXJpY2hUZXh0LnJlbW92ZURpc3Bvc2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBZGRzIGEgbGlzdGVuZXIgdG8gdGhlIGNvbGxlY3Rpb24gb2YgbGlzdGVuZXJzIHdobyB3aWxsIGJlIG5vdGlmaWVkIHdoZW4KLQkgKiBoZWxwIGV2ZW50cyBhcmUgZ2VuZXJhdGVkIGZvciB0aGlzIGVkaXRvci4KLQkgKiAKLQkgKiBAcGFyYW0gbGlzdGVuZXIKLQkgKiAgICAgICAgICAgIHRoZSBsaXN0ZW5lciB3aGljaCBzaG91bGQgYmUgbm90aWZpZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRIZWxwTGlzdGVuZXIoSGVscExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWlmIChyaWNoVGV4dCAhPSBudWxsKSB7Ci0JCQlyaWNoVGV4dC5hZGRIZWxwTGlzdGVuZXIobGlzdGVuZXIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlcyBhIGxpc3RlbmVyIGZyb20gdGhlIGNvbGxlY3Rpb24gb2YgbGlzdGVuZXJzIHdobyB3aWxsIGJlIG5vdGlmaWVkCi0JICogd2hlbiBoZWxwIGV2ZW50cyBhcmUgZ2VuZXJhdGVkIGZvciB0aGlzIGVkaXRvci4KLQkgKiAKLQkgKiBAcGFyYW0gbGlzdGVuZXIKLQkgKiAgICAgICAgICAgIHRoZSBsaXN0ZW5lciB3aGljaCBzaG91bGQgbm8gbG9uZ2VyIGJlIG5vdGlmaWVkCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlSGVscExpc3RlbmVyKEhlbHBMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlpZiAocmljaFRleHQgIT0gbnVsbCkgewotCQkJcmljaFRleHQucmVtb3ZlSGVscExpc3RlbmVyKGxpc3RlbmVyKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEFkZHMgdGhlIGxpc3RlbmVyIHRvIHRoZSBjb2xsZWN0aW9uIG9mIGxpc3RlbmVycyB3aG8gd2lsbCBiZSBub3RpZmVkIHdoZW4KLQkgKiBhbiBldmVudCBvZiB0aGUgZ2l2ZW4gdHlwZSBvY2N1cnMgd2l0aGluIHRoaXMgZWRpdG9yLgotCSAqIAotCSAqIEBwYXJhbSBldmVudFR5cGUKLQkgKiAgICAgICAgICAgIHRoZSB0eXBlIG9mIGV2ZW50IHRvIGxpc3RlbiBmb3IKLQkgKiBAcGFyYW0gbGlzdGVuZXIKLQkgKiAgICAgICAgICAgIHRoZSBsaXN0ZW5lciB3aGljaCBzaG91bGQgYmUgbm90aWZpZWQgd2hlbiB0aGUgZXZlbnQgb2NjdXJzCi0JICovCi0JcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoaW50IGV2ZW50VHlwZSwgTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJaWYgKHJpY2hUZXh0ICE9IG51bGwpIHsKLQkJCXJpY2hUZXh0LmFkZExpc3RlbmVyKGV2ZW50VHlwZSwgbGlzdGVuZXIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlcyB0aGUgbGlzdGVuZXIgZnJvbSB0aGUgY29sbGVjdGlvbiBvZiBsaXN0ZW5lcnMgd2hvIHdpbGwgYmUgbm90aWZlZAotCSAqIHdoZW4gYW4gZXZlbnQgb2YgdGhlIGdpdmVuIHR5cGUgb2NjdXJzIHdpdGhpbiB0aGlzIGVkaXRvci4KLQkgKiAKLQkgKiBAcGFyYW0gZXZlbnRUeXBlCi0JICogICAgICAgICAgICB0aGUgdHlwZSBvZiBldmVudCB0byBsaXN0ZW4gZm9yCi0JICogQHBhcmFtIGxpc3RlbmVyCi0JICogICAgICAgICAgICB0aGUgbGlzdGVuZXIgd2hpY2ggc2hvdWxkIG5vIGxvbmdlciBiZSBub3RpZmllZCB3aGVuIHRoZSBldmVudAotCSAqICAgICAgICAgICAgb2NjdXJzCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoaW50IGV2ZW50VHlwZSwgTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJaWYgKHJpY2hUZXh0ICE9IG51bGwpIHsKLQkJCXJpY2hUZXh0LnJlbW92ZUxpc3RlbmVyKGV2ZW50VHlwZSwgbGlzdGVuZXIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZXZlbnQgbGlzdGVuZXJzIGF0dGFjaGVkIHRvIHRoaXMgZWRpdG9yLgotCSAqIAotCSAqIEByZXR1cm4gYW4gaXRlcmF0b3IgZm9yIHJldHJpZXZpbmcgdGhlIGV2ZW50IGxpc3RlbmVycyBhdHRhY2hlZCB0byB0aGlzCi0JICogICAgICAgICBlZGl0b3IKLQkgKi8KLQlwdWJsaWMgSXRlcmF0b3I8UmljaFRleHRMaXN0ZW5lcj4gZ2V0TGlzdGVuZXJzKCkgewotCQlpZiAocmljaFRleHQgIT0gbnVsbCkgewotCQkJcmV0dXJuIHJpY2hUZXh0LmdldExpc3RlbmVycygpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIE5vdGlmaWVzIHRoZSBtb2RpZnkgbGlzdGVuZXJzIHRoYXQgdGhlIHJpY2ggdGV4dCBlZGl0b3IgY29udGVudCBoYXMKLQkgKiBjaGFuZ2VkLgotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeU1vZGlmeUxpc3RlbmVycygpIHsKLQkJaWYgKHJpY2hUZXh0ICE9IG51bGwpIHsKLQkJCUV2ZW50IGV2ZW50ID0gbmV3IEV2ZW50KCk7Ci0JCQlldmVudC5kaXNwbGF5ID0gRGlzcGxheS5nZXRDdXJyZW50KCk7Ci0JCQlldmVudC53aWRnZXQgPSByaWNoVGV4dC5nZXRDb250cm9sKCk7Ci0KLQkJCWZvciAoSXRlcmF0b3I8TW9kaWZ5TGlzdGVuZXI+IGkgPSBnZXRNb2RpZnlMaXN0ZW5lcnMoKTsgaSAhPSBudWxsICYmIGkuaGFzTmV4dCgpOykgewotCQkJCU1vZGlmeUxpc3RlbmVyIGxpc3RlbmVyID0gaS5uZXh0KCk7Ci0JCQkJbGlzdGVuZXIubW9kaWZ5VGV4dChuZXcgTW9kaWZ5RXZlbnQoZXZlbnQpKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEZpbGxzIHRoZSB0b29sIGJhciB3aXRoIGFjdGlvbiBpdGVtcy4KLQkgKiAKLQkgKiBAcGFyYW0gdG9vbEJhcgotCSAqICAgICAgICAgICAgYSB0b29sIGJhciBjb250YWluIHJpY2ggdGV4dCBhY3Rpb25zCi0JICovCi0JcHVibGljIHZvaWQgZmlsbFRvb2xCYXIoSVJpY2hUZXh0VG9vbEJhciB0b29sQmFyKSB7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgdW5kZXJseWluZyByaWNoIHRleHQgY29udHJvbC4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IGNvbXBvc2l0ZQotCSAqIEBwYXJhbSBzdHlsZQotCSAqICAgICAgICAgICAgdGhlIHN0eWxlIGZvciB0aGUgY29udHJvbAotCSAqIEBwYXJhbSBiYXNlUGF0aAotCSAqICAgICAgICAgICAgdGhlIHBhdGggdXNlZCBmb3IgcmVzb2x2aW5nIGxpbmtzCi0JICovCi0JcHJvdGVjdGVkIElSaWNoVGV4dCBjcmVhdGVSaWNoVGV4dENvbnRyb2woQ29tcG9zaXRlIHBhcmVudCwgaW50IHN0eWxlLAotCQkJU3RyaW5nIGJhc2VQYXRoKSB7Ci0JCXJldHVybiBuZXcgUmljaFRleHQocGFyZW50LCBzdHlsZSwgYmFzZVBhdGgpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIGVkaXRvciB0YWIgZm9sZGVyLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgY29udHJvbAotCSAqIEBwYXJhbSBzdHlsZQotCSAqICAgICAgICAgICAgdGhlIHN0eWxlIGZvciB0aGUgY29udHJvbAotCSAqIEByZXR1cm4gYSBuZXcgZWRpdG9yIHRvb2xiYXIKLQkgKi8KLQlwcm90ZWN0ZWQgQ1RhYkZvbGRlciBjcmVhdGVFZGl0b3JUYWJGb2xkZXIoQ29tcG9zaXRlIHBhcmVudCwgaW50IHN0eWxlKSB7Ci0JCUNUYWJGb2xkZXIgZm9sZGVyID0gbmV3IENUYWJGb2xkZXIocGFyZW50LCBTV1QuRkxBVCB8IFNXVC5CT1RUT00pOwotCQlmb2xkZXIuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDEsIHRydWUpKTsKLQkJZm9sZGVyLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCi0JCUNvbXBvc2l0ZSByaWNoVGV4dENvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUoZm9sZGVyLCBTV1QuRkxBVCk7Ci0JCUdyaWRMYXlvdXQgcmljaFRleHRDb21wb3NpdGVMYXlvdXQgPSBuZXcgR3JpZExheW91dCgxLCBmYWxzZSk7Ci0JCXJpY2hUZXh0Q29tcG9zaXRlTGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCXJpY2hUZXh0Q29tcG9zaXRlTGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJcmljaFRleHRDb21wb3NpdGUuc2V0TGF5b3V0KHJpY2hUZXh0Q29tcG9zaXRlTGF5b3V0KTsKLQkJcmljaFRleHRDb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0KLQkJcmljaFRleHQgPSBjcmVhdGVSaWNoVGV4dENvbnRyb2wocmljaFRleHRDb21wb3NpdGUsIHN0eWxlLCBiYXNlUGF0aCk7Ci0JCXJpY2hUZXh0LnNldERhdGEoUFJPUEVSVFlfTkFNRSwgdGhpcyk7Ci0JCXJpY2hUZXh0LmdldEZpbmRSZXBsYWNlQWN0aW9uKCkuc2V0UmljaFRleHQodGhpcyk7Ci0KLQkJcmljaFRleHRUYWIgPSBuZXcgQ1RhYkl0ZW0oZm9sZGVyLCBTV1QuRkxBVCk7Ci0JCXJpY2hUZXh0VGFiLnNldFRleHQoUmljaFRleHRSZXNvdXJjZXMucmljaFRleHRUYWJfdGV4dCk7Ci0JCXJpY2hUZXh0VGFiLnNldFRvb2xUaXBUZXh0KFJpY2hUZXh0UmVzb3VyY2VzLnJpY2hUZXh0VGFiX3Rvb2xUaXBUZXh0KTsKLQkJcmljaFRleHRUYWIuc2V0Q29udHJvbChyaWNoVGV4dENvbXBvc2l0ZSk7Ci0KLQkJQ29tcG9zaXRlIGh0bWxDb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKGZvbGRlciwgU1dULkZMQVQpOwotCQlodG1sQ29tcG9zaXRlLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQotCQlzb3VyY2VWaWV3ZXIgPSBuZXcgVGV4dFZpZXdlcihodG1sQ29tcG9zaXRlLCBTV1QuRkxBVCB8IFNXVC5NVUxUSQotCQkJCXwgU1dULldSQVAgfCBTV1QuVl9TQ1JPTEwpOwotCQlzb3VyY2VWaWV3ZXIuc2V0VW5kb01hbmFnZXIodW5kb01hbmFnZXIpOwotCQlzZXREb2N1bWVudChudWxsKTsKLQkJYWRkTW9kaWZ5TGlzdGVuZXJzKCk7Ci0JCWdldFNvdXJjZUVkaXQoKS5hZGRMaXN0ZW5lcihTV1QuRGVhY3RpdmF0ZSwgc291cmNlRWRpdERlYWN0aXZhdGVMaXN0ZW5lcik7Ci0JCWdldFNvdXJjZUVkaXQoKS5hZGRLZXlMaXN0ZW5lcihzb3VyY2VFZGl0S2V5TGlzdGVuZXIpOwotCQljb250ZXh0TWVudSA9IG5ldyBNZW51KHBhcmVudC5nZXRTaGVsbCgpLCBTV1QuUE9QX1VQKTsKLQkJZ2V0U291cmNlRWRpdCgpLnNldE1lbnUoY29udGV4dE1lbnUpOwotCQkvLyBGSVhNRSEgVGhpcyBvcGVucyB1cCBhIGNhbiBvZiB3b3JtcywgZXNwZWNpYWxseSB3aXRoIERCQ1MgY2hhcmFjdGVycy4KLQkJLy8gU2VlIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNzk0MzIuIAotCQkvL2FkZERyb3BTdXBwb3J0VG9TdHlsZWRUZXh0KCk7Ci0JCWZpbGxDb250ZXh0TWVudShjb250ZXh0TWVudSk7Ci0JCQotCQkKLQkJaHRtbFRhYiA9IG5ldyBDVGFiSXRlbShmb2xkZXIsIFNXVC5OT05FKTsKLQkJaHRtbFRhYi5zZXRUZXh0KEhUTUxfVEFCX05BTUUpOwotCQlodG1sVGFiLnNldFRvb2xUaXBUZXh0KFJpY2hUZXh0UmVzb3VyY2VzLmh0bWxUYWJfdG9vbFRpcFRleHQpOyAKLQkJaHRtbFRhYi5zZXRDb250cm9sKGh0bWxDb21wb3NpdGUpOwotCi0JCWZvbGRlci5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJQ1RhYkl0ZW0gaXRlbSA9IChDVGFiSXRlbSkgZXZlbnQuaXRlbTsKLQkJCQlpZiAoaXRlbS5nZXRUZXh0KCkuZXF1YWxzKEhUTUxfVEFCX05BTUUpKSB7Ci0JCQkJCXJlbW92ZU1vZGlmeUxpc3RlbmVycygpOwotCQkJCQljdXJyZW50RG9jLnNldChnZXRUZXh0KCkpOwotCQkJCQlzb3VyY2VNb2RpZmllZCA9IGZhbHNlOwotCQkJCQlhZGRNb2RpZnlMaXN0ZW5lcnMoKTsKLQkJCQkJaWYgKHRvb2xCYXIgIT0gbnVsbCkgewotCQkJCQkJdG9vbEJhci51cGRhdGVUb29sQmFyKGVkaXRhYmxlKTsKLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCXVwZGF0ZVJpY2hUZXh0KGdldFNvdXJjZUVkaXQoKS5nZXRUZXh0KCkpOwotCQkJCQlzZXRNb2RpZmllZCh0cnVlKTsKLQkJCQkJaWYgKHRvb2xCYXIgIT0gbnVsbCkgewotCQkJCQkJdG9vbEJhci51cGRhdGVUb29sQmFyKGVkaXRhYmxlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JCWZpbGxUb29sQmFyKHRvb2xCYXIpOwotCQkKLQkJaW5pdGlhbGl6ZUFjdGl2YXRpb25Db2RlVHJpZ2dlcigpOwotCQljcmVhdGVBY3Rpb25zKCk7Ci0JCQotCQlmb2xkZXIuc2V0U2VsZWN0aW9uKDApOwotCi0JCXJldHVybiBmb2xkZXI7Ci0JfQotCi0JCi0JcHJpdmF0ZSB2b2lkIHNldERvY3VtZW50KElEb2N1bWVudCBkb2MpIHsKLQkJaWYgKGRvYyA9PSBudWxsKSB7Ci0JCQlkb2MgPSBuZXcgRG9jdW1lbnQoKTsKLQkJfQotCQkvLyBjbGVhbiB1cCBvbGQgZG9jCi0JCXVuZG9NYW5hZ2VyLmRpc2Nvbm5lY3QoKTsKLQkJSURvY3VtZW50IG9sZERvYyA9IHNvdXJjZVZpZXdlci5nZXREb2N1bWVudCgpOwotCQlpZiAob2xkRG9jICE9IG51bGwpIHsKLQkJCW9sZERvYy5yZW1vdmVEb2N1bWVudExpc3RlbmVyKHNvdXJjZUVkaXREb2N1bWVudExpc3RlbmVyKTsKLQkJfQotCi0JCS8vIGhvb2sgdXAgbmV3IGRvYwotCQljdXJyZW50RG9jID0gZG9jOwotCQlzb3VyY2VWaWV3ZXIuc2V0RG9jdW1lbnQoY3VycmVudERvYyk7Ci0JCWN1cnJlbnREb2MuYWRkRG9jdW1lbnRMaXN0ZW5lcihzb3VyY2VFZGl0RG9jdW1lbnRMaXN0ZW5lcik7Ci0JCXVuZG9NYW5hZ2VyLmNvbm5lY3Qoc291cmNlVmlld2VyKTsKLQkJaWYgKHVuZG9BY3Rpb24gIT0gbnVsbCkgewotCQkJdW5kb0FjdGlvbi5zZXRDb250ZXh0KGdldFVuZG9Db250ZXh0KCkpOwotCQl9Ci0JCWlmIChyZWRvQWN0aW9uICE9IG51bGwpIHsKLQkJCXJlZG9BY3Rpb24uc2V0Q29udGV4dChnZXRVbmRvQ29udGV4dCgpKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBIVE1MIHNvdXJjZSBlZGl0IGNvbnRyb2wuCi0JICogCi0JICogQHJldHVybiBhIDxjb2RlPlN0eWxlVGV4dDwvY29kZT4gb2JqZWN0LgotCSAqLwotCXB1YmxpYyBTdHlsZWRUZXh0IGdldFNvdXJjZUVkaXQoKSB7Ci0JCWlmIChzb3VyY2VWaWV3ZXIgIT0gbnVsbCkgewotCQkJcmV0dXJuIHNvdXJjZVZpZXdlci5nZXRUZXh0V2lkZ2V0KCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0cyB0ZXh0IGF0IHRoZSBzZWxlY3Rpb24gKG92ZXJ3cml0aW5nIHRoZSBzZWxlY3Rpb24pLgotCSAqLwotCXB1YmxpYyB2b2lkIGFkZEhUTUwoU3RyaW5nIHRleHQpIHsKLQkJaWYgKHRleHQgPT0gbnVsbCB8fCB0ZXh0Lmxlbmd0aCgpID09IDApIAotCQkJcmV0dXJuOwotCQlpZiAodGFiRm9sZGVyLmdldFNlbGVjdGlvbigpID09IHJpY2hUZXh0VGFiKSB7Ci0JCQlleGVjdXRlQ29tbWFuZChSaWNoVGV4dENvbW1hbmQuQUREX0hUTUwsIHRleHQpOwotCQl9IGVsc2UgaWYgKHRhYkZvbGRlci5nZXRTZWxlY3Rpb24oKSA9PSBodG1sVGFiKSB7Ci0JCQlTdHJpbmcgb2xkSFRNTCA9IGdldFNvdXJjZUVkaXQoKS5nZXRUZXh0KCk7Ci0JCQlQb2ludCBzZWwgPSBzb3VyY2VWaWV3ZXIuZ2V0U2VsZWN0ZWRSYW5nZSgpOwotCQkJaW50IHNlbFN0YXJ0SW5kZXggPSBzZWwueDsKLQkJCWludCBzZWxFbmRJbmRleCA9IHNlbC54ICsgc2VsLnkgLSAxOwotCQkJU3RyaW5nIG5ld0hUTUwgPSBvbGRIVE1MLnN1YnN0cmluZygwLCBzZWxTdGFydEluZGV4KSArIHRleHQKLQkJCQkJKyBvbGRIVE1MLnN1YnN0cmluZyhzZWxFbmRJbmRleCArIDEpOwotCQkJcmVtb3ZlTW9kaWZ5TGlzdGVuZXJzKCk7Ci0JCQljdXJyZW50RG9jLnNldChuZXdIVE1MKTsKLQkJCWFkZE1vZGlmeUxpc3RlbmVycygpOwotCQkJdXBkYXRlUmljaFRleHQobmV3SFRNTCk7Ci0JCX0KLQl9Ci0KLQkKLQkvKioKLQkgKiBJbnNlcnRzIGFuIGltYWdlIGF0IHRoZSBzZWxlY3Rpb24gKG92ZXJ3cml0aW5nIHRoZSBzZWxlY3Rpb24pLgotCSAqLwotCXB1YmxpYyB2b2lkIGFkZEltYWdlKFN0cmluZyBpbWFnZVVSTCwgU3RyaW5nIGhlaWdodCwgU3RyaW5nIHdpZHRoLCBTdHJpbmcgYWx0VGFnKSB7Ci0JCWlmICh0YWJGb2xkZXIuZ2V0U2VsZWN0aW9uKCkgPT0gcmljaFRleHRUYWIpIHsKLQkJCWV4ZWN1dGVDb21tYW5kKAotCQkJCQlSaWNoVGV4dENvbW1hbmQuQUREX0lNQUdFLAotCQkJCQluZXcgU3RyaW5nW10gewotCQkJCQkJCWltYWdlVVJMLAotCQkJCQkJCWhlaWdodCwgd2lkdGgsIGFsdFRhZyB9KTsKLQkJfSBlbHNlIGlmICh0YWJGb2xkZXIuZ2V0U2VsZWN0aW9uKCkgPT0gaHRtbFRhYikgewotCQkJU3RyaW5nQnVmZmVyIGltYWdlTGluayA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCS8vIG9yZGVyIG9mIHRoZXNlIGF0dHJpYnV0ZXMgaXMgdGhlIHNhbWUgYXMgSlRpZHknZWQgSFRNTAotCQkJaW1hZ2VMaW5rLmFwcGVuZCgiPGltZyIpOyAvLyROT04tTkxTLTEkCi0JCQlpZiAoaGVpZ2h0Lmxlbmd0aCgpID4gMCkgewotCQkJCWltYWdlTGluay5hcHBlbmQoIiBoZWlnaHQ9XCIiICsgaGVpZ2h0ICsgIlwiIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJfQotCQkJaWYgKGFsdFRhZy5sZW5ndGgoKSA+IDApIHsKLQkJCQlpbWFnZUxpbmsuYXBwZW5kKCIgYWx0PVwiIiArIGFsdFRhZyArICJcIiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCX0KLQkJCWltYWdlTGluay5hcHBlbmQoIiBzcmM9XCIiICsgaW1hZ2VVUkwgKyAiXCIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlpZiAod2lkdGgubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJaW1hZ2VMaW5rLmFwcGVuZCgiIHdpZHRoPVwiIiArIHdpZHRoICsgIlwiIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJfQotCQkJaW1hZ2VMaW5rLmFwcGVuZCgiIC8+Iik7IC8vJE5PTi1OTFMtMSQKLQkJCVN0cmluZyBvbGRIVE1MID0gZ2V0U291cmNlRWRpdCgpLmdldFRleHQoKTsKLQkJCVBvaW50IHNlbCA9IHNvdXJjZVZpZXdlci5nZXRTZWxlY3RlZFJhbmdlKCk7Ci0JCQlpbnQgc2VsU3RhcnRJbmRleCA9IHNlbC54OwotCQkJaW50IHNlbEVuZEluZGV4ID0gc2VsLnggKyBzZWwueSAtIDE7Ci0JCQlTdHJpbmcgbmV3SFRNTCA9IG9sZEhUTUwuc3Vic3RyaW5nKDAsIHNlbFN0YXJ0SW5kZXgpICsgaW1hZ2VMaW5rLnRvU3RyaW5nKCkKLQkJCQkJKyBvbGRIVE1MLnN1YnN0cmluZyhzZWxFbmRJbmRleCArIDEpOwotCQkJcmVtb3ZlTW9kaWZ5TGlzdGVuZXJzKCk7Ci0JCQljdXJyZW50RG9jLnNldChuZXdIVE1MKTsKLQkJCWFkZE1vZGlmeUxpc3RlbmVycygpOwotCQkJdXBkYXRlUmljaFRleHQobmV3SFRNTCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDaGVja3Mgd2hldGhlciB0aGUgSFRNTCB0YWIgaXMgc2VsZWN0ZWQuCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgSFRNTCB0YWIgaXMgc2VsZWN0ZWQuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNIVE1MVGFiU2VsZWN0ZWQoKSB7Ci0JCXJldHVybiAodGFiRm9sZGVyLmdldFNlbGVjdGlvbigpID09IGh0bWxUYWIpOwotCX0KLQotCS8qKgotCSAqIEZpbGxzIHRoZSBjb250ZXh0IG1lbnUgd2l0aCBtZW51IGl0ZW1zLgotCSAqIAotCSAqIEBwYXJhbSBjb250ZXh0TWVudQotCSAqICAgICAgICAgICAgYSBjb250ZXh0IG1lbnUgY29udGFpbmluZyByaWNoIHRleHQgYWN0aW9ucwotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZpbGxDb250ZXh0TWVudShNZW51IGNvbnRleHRNZW51KSB7Ci0JCWZpbmFsIE1lbnVJdGVtIGN1dEl0ZW0gPSBuZXcgTWVudUl0ZW0oY29udGV4dE1lbnUsIFNXVC5QVVNIKTsKLQkJY3V0SXRlbS5zZXRUZXh0KFJpY2hUZXh0UmVzb3VyY2VzLmN1dEFjdGlvbl90ZXh0KTsKLQkJY3V0SXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJQ3V0QWN0aW9uIGFjdGlvbiA9IG5ldyBDdXRBY3Rpb24oUmljaFRleHRFZGl0b3IudGhpcyk7Ci0JCQkJYWN0aW9uLmV4ZWN1dGUoUmljaFRleHRFZGl0b3IudGhpcyk7Ci0JCQl9Ci0JCX0pOwotCQlmaW5hbCBNZW51SXRlbSBjb3B5SXRlbSA9IG5ldyBNZW51SXRlbShjb250ZXh0TWVudSwgU1dULlBVU0gpOwotCQljb3B5SXRlbS5zZXRUZXh0KFJpY2hUZXh0UmVzb3VyY2VzLmNvcHlBY3Rpb25fdGV4dCk7IAotCQljb3B5SXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJQ29weUFjdGlvbiBhY3Rpb24gPSBuZXcgQ29weUFjdGlvbihSaWNoVGV4dEVkaXRvci50aGlzKTsKLQkJCQlhY3Rpb24uZXhlY3V0ZShSaWNoVGV4dEVkaXRvci50aGlzKTsKLQkJCX0KLQkJfSk7Ci0JCWZpbmFsIE1lbnVJdGVtIHBhc3RlSXRlbSA9IG5ldyBNZW51SXRlbShjb250ZXh0TWVudSwgU1dULlBVU0gpOwotCQlwYXN0ZUl0ZW0uc2V0VGV4dChSaWNoVGV4dFJlc291cmNlcy5wYXN0ZUFjdGlvbl90ZXh0KTsgCi0JCXBhc3RlSXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJUGFzdGVBY3Rpb24gYWN0aW9uID0gbmV3IFBhc3RlQWN0aW9uKFJpY2hUZXh0RWRpdG9yLnRoaXMpOwotCQkJCWFjdGlvbi5leGVjdXRlKFJpY2hUZXh0RWRpdG9yLnRoaXMpOwotCQkJfQotCQl9KTsKLQkJCi0JCWZpbmFsIE1lbnVJdGVtIHBhc3RlUGxhaW5UZXh0SXRlbSA9IG5ldyBNZW51SXRlbShjb250ZXh0TWVudSwgU1dULlBVU0gpOwotCQlwYXN0ZVBsYWluVGV4dEl0ZW0uc2V0VGV4dChSaWNoVGV4dFJlc291cmNlcy5wYXN0ZVBsYWluVGV4dEFjdGlvbl90ZXh0KTsKLQkJcGFzdGVQbGFpblRleHRJdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlQYXN0ZVBsYWluVGV4dEFjdGlvbiBhY3Rpb24gPSBuZXcgUGFzdGVQbGFpblRleHRBY3Rpb24oUmljaFRleHRFZGl0b3IudGhpcyk7Ci0JCQkJYWN0aW9uLmV4ZWN1dGUoUmljaFRleHRFZGl0b3IudGhpcyk7Ci0JCQl9Ci0JCX0pOwotCi0JCWNvbnRleHRNZW51LmFkZE1lbnVMaXN0ZW5lcihuZXcgTWVudUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgbWVudUhpZGRlbihNZW51RXZlbnQgZSkgewotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBtZW51U2hvd24oTWVudUV2ZW50IGUpIHsKLQkJCQlTdHJpbmcgc2VsZWN0ZWRUZXh0ID0gZ2V0U2VsZWN0ZWQoKS5nZXRUZXh0KCk7Ci0JCQkJYm9vbGVhbiBzZWxlY3Rpb24gPSBzZWxlY3RlZFRleHQubGVuZ3RoKCkgPiAwOwotCQkJCWN1dEl0ZW0uc2V0RW5hYmxlZChlZGl0YWJsZSAmJiBzZWxlY3Rpb24pOwotCQkJCWNvcHlJdGVtLnNldEVuYWJsZWQoc2VsZWN0aW9uKTsKLQkJCQlwYXN0ZUl0ZW0uc2V0RW5hYmxlZChlZGl0YWJsZSk7Ci0JCQkJcGFzdGVQbGFpblRleHRJdGVtLnNldEVuYWJsZWQoZWRpdGFibGUpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQkvKioKLQkgKiBVcGRhdGVzIHRoZSBjb250ZW50IG9mIHRoZSByaWNoIHRleHQgY29udHJvbCB3aXRob3V0IHVwZGF0aW5nIHRoZSBIVE1MCi0JICogc291cmNlIGVkaXRvci4KLQkgKiA8cD4KLQkgKiBUaGlzIG1ldGhvZCBzaG91bGQgYmUgY2FsbGVkIGJ5IHRoZSBIVE1MIHNvdXJjZSBlZGl0b3IgdG8gc3luYyB1cCBpdHMKLQkgKiBjb250ZW50IHdpdGggdGhlIHJpY2ggdGV4dCBjb250cm9sLgotCSAqIAotCSAqIEBwYXJhbSB0ZXh0Ci0JICogICAgICAgICAgICB0aGUgcmljaCB0ZXh0IGNvbnRlbnQgaW4gWEhUTUwgZm9ybWF0Ci0JICovCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZVJpY2hUZXh0KFN0cmluZyB0ZXh0KSB7Ci0JCWlmIChyaWNoVGV4dCAhPSBudWxsKSB7Ci0JCQlyaWNoVGV4dC5zZXRUZXh0KHRleHQpOwotCQkJcmljaFRleHQuY2hlY2tNb2RpZnkoKTsKLQkJfQotCQlzb3VyY2VNb2RpZmllZCA9IGZhbHNlOwotCQlpZiAodGFiRm9sZGVyICE9IG51bGwpIHsKLQkJCWlmICh0b29sQmFyICE9IG51bGwpIHsKLQkJCQl0b29sQmFyLnVwZGF0ZVRvb2xCYXIoZWRpdGFibGUpOwotCQkJfQotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCBhZGREcm9wU3VwcG9ydFRvU3R5bGVkVGV4dCgpIHsKLQkJLy8gdGhpcyBmdW5jdGlvbiBiYXNlZCBoZWF2aWx5IG9uIHRoZSBleGFtcGxlIGF0OgotCQkvLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2FydGljbGVzL0FydGljbGUtU1dULURORC9ETkQtaW4tU1dULmh0bWwKLQkJCi0JCSAJLy8gQWxsb3cgZGF0YSB0byBiZSBjb3BpZWQgdG8gdGhlIGRyb3AgdGFyZ2V0Ci0JCQlpbnQgb3BlcmF0aW9ucyA9IERORC5EUk9QX01PVkUgfCAgRE5ELkRST1BfQ09QWSB8IERORC5EUk9QX0RFRkFVTFQ7Ci0JCQlzb3VyY2VFZGl0RHJvcFRhcmdldCA9IG5ldyBEcm9wVGFyZ2V0KGdldFNvdXJjZUVkaXQoKSwgb3BlcmF0aW9ucyk7Ci0JCSAKLQkJCS8vIFJlY2VpdmUgZGF0YSBpbiBUZXh0IG9yIEhUTUwgZm9ybWF0Ci0JCQlmaW5hbCBUZXh0VHJhbnNmZXIgdGV4dFRyYW5zZmVyID0gVGV4dFRyYW5zZmVyLmdldEluc3RhbmNlKCk7Ci0JCQlmaW5hbCBIVE1MVHJhbnNmZXIgaHRtbFRyYW5zZmVyID0gSFRNTFRyYW5zZmVyLmdldEluc3RhbmNlKCk7Ci0JCQlUcmFuc2ZlcltdIHR5cGVzID0gbmV3IFRyYW5zZmVyW10ge2h0bWxUcmFuc2ZlciwgdGV4dFRyYW5zZmVyfTsKLQkJCXNvdXJjZUVkaXREcm9wVGFyZ2V0LnNldFRyYW5zZmVyKHR5cGVzKTsKLQkJCSAKLQkJCXNvdXJjZUVkaXREcm9wVGFyZ2V0LmFkZERyb3BMaXN0ZW5lcihuZXcgRHJvcFRhcmdldExpc3RlbmVyKCkgewotCQkJICBwdWJsaWMgdm9pZCBkcmFnRW50ZXIoRHJvcFRhcmdldEV2ZW50IGV2ZW50KSB7Ci0JCQkgICAgIGlmIChldmVudC5kZXRhaWwgPT0gRE5ELkRST1BfREVGQVVMVCkgewotCQkJICAgICAgICAgaWYgKChldmVudC5vcGVyYXRpb25zICYgRE5ELkRST1BfQ09QWSkgIT0gMCkgewotCQkJICAgICAgICAgICAgIGV2ZW50LmRldGFpbCA9IERORC5EUk9QX0NPUFk7Ci0JCQkgICAgICAgICB9IGVsc2UgewotCQkJICAgICAgICAgICAgIGV2ZW50LmRldGFpbCA9IERORC5EUk9QX05PTkU7Ci0JCQkgICAgICAgICB9Ci0JCQkgICAgIH0KLQkJCSAgICAgaWYgKCFnZXRFZGl0YWJsZSgpKSB7Ci0JCSAgICAgICAgICAgICBldmVudC5kZXRhaWwgPSBETkQuRFJPUF9OT05FOwotCQkJICAgICB9Ci0JCQkgICAgIC8vIHdpbGwgYWNjZXB0IHRleHQgYnV0IHByZWZlciB0byBoYXZlIEhUTUwgZHJvcHBlZAotCQkJICAgICBmb3IgKGludCBpID0gMDsgaSA8IGV2ZW50LmRhdGFUeXBlcy5sZW5ndGg7IGkrKykgewotCQkJICAgICAgICAgaWYgKGh0bWxUcmFuc2Zlci5pc1N1cHBvcnRlZFR5cGUoZXZlbnQuZGF0YVR5cGVzW2ldKSl7Ci0JCQkgICAgICAgICAgICAgZXZlbnQuY3VycmVudERhdGFUeXBlID0gZXZlbnQuZGF0YVR5cGVzW2ldOwotCQkJICAgICAgICAgICAgIGJyZWFrOwotCQkJICAgICAgICAgfQotCQkJICAgICB9Ci0JCQkgICB9Ci0JCQkgICBwdWJsaWMgdm9pZCBkcmFnT3ZlcihEcm9wVGFyZ2V0RXZlbnQgZXZlbnQpIHsKLQkJCSAgICAgICAgZXZlbnQuZmVlZGJhY2sgPSBETkQuRkVFREJBQ0tfU0VMRUNUIHwgRE5ELkZFRURCQUNLX0lOU0VSVF9BRlRFUiB8IERORC5GRUVEQkFDS19TQ1JPTEw7Ci0JCQkgICAgfQotCQkJICAgIHB1YmxpYyB2b2lkIGRyYWdPcGVyYXRpb25DaGFuZ2VkKERyb3BUYXJnZXRFdmVudCBldmVudCkgewotCQkJICAgICAgICBpZiAoZXZlbnQuZGV0YWlsID09IERORC5EUk9QX0RFRkFVTFQpIHsKLQkJCSAgICAgICAgICAgIGlmICgoZXZlbnQub3BlcmF0aW9ucyAmIERORC5EUk9QX0NPUFkpICE9IDApIHsKLQkJCSAgICAgICAgICAgICAgICBldmVudC5kZXRhaWwgPSBETkQuRFJPUF9DT1BZOwotCQkJICAgICAgICAgICAgfSBlbHNlIHsKLQkJCSAgICAgICAgICAgICAgICBldmVudC5kZXRhaWwgPSBETkQuRFJPUF9OT05FOwotCQkJICAgICAgICAgICAgfQotCQkJICAgICAgICB9Ci0JCQkgICAgfQotCQkJICAgIHB1YmxpYyB2b2lkIGRyYWdMZWF2ZShEcm9wVGFyZ2V0RXZlbnQgZXZlbnQpIHsKLQkJCSAgICB9Ci0JCQkgICAgcHVibGljIHZvaWQgZHJvcEFjY2VwdChEcm9wVGFyZ2V0RXZlbnQgZXZlbnQpIHsKLQkJCSAgICB9Ci0JCQkgICAgcHVibGljIHZvaWQgZHJvcChEcm9wVGFyZ2V0RXZlbnQgZXZlbnQpIHsKLQkJCSAgICAgICAgaWYgKHRleHRUcmFuc2Zlci5pc1N1cHBvcnRlZFR5cGUoZXZlbnQuY3VycmVudERhdGFUeXBlKSB8fCAKLQkJCSAgICAgICAgCQlodG1sVHJhbnNmZXIuaXNTdXBwb3J0ZWRUeXBlKGV2ZW50LmN1cnJlbnREYXRhVHlwZSkpIHsKLQkJCSAgICAgICAgICAgIFN0cmluZyB0ZXh0ID0gKFN0cmluZylldmVudC5kYXRhOwotCQkJICAgICAgICAgICAgYWRkSFRNTCh0ZXh0KTsKLQkJCSAgICAgICAgfQotCQkJICAgIH0KLQkJCX0pOwotCX0KLQkKLQkvKioKLQkgKiBEaXNwbGF5cyB0aGUgZ2l2ZW4gZGVidWcgbWVzc2FnZSB0byB0aGUgY29uc29sZS4KLQkgKi8KLQlwcml2YXRlIHZvaWQgcHJpbnREZWJ1Z01lc3NhZ2UoU3RyaW5nIG1ldGhvZCwgU3RyaW5nIG1zZywgU3RyaW5nIHRleHQpIHsKLQkJU3RyaW5nQnVmZmVyIHN0ckJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJc3RyQnVmLmFwcGVuZCgiUmljaFRleHRFZGl0b3JbIikuYXBwZW5kKHJpY2hUZXh0LmdldENvbnRyb2woKS5oYW5kbGUpLmFwcGVuZCgnXScpIC8vJE5PTi1OTFMtMSQKLQkJCQkuYXBwZW5kKCcuJykuYXBwZW5kKG1ldGhvZCk7Ci0JCWlmIChtc2cgIT0gbnVsbCAmJiBtc2cubGVuZ3RoKCkgPiAwKSB7Ci0JCQlzdHJCdWYuYXBwZW5kKCI6ICIpLmFwcGVuZChtc2cpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJaWYgKHRleHQgIT0gbnVsbCAmJiB0ZXh0Lmxlbmd0aCgpID4gMCkgewotCQkJc3RyQnVmLmFwcGVuZCgnXG4nKS5hcHBlbmQodGV4dCk7Ci0JCX0KLQkJU3lzdGVtLm91dC5wcmludGxuKHN0ckJ1Zik7Ci0JfQotCi0JLyoqCi0JICogRGlzcGxheXMgdGhlIGdpdmVuIGRlYnVnIG1lc3NhZ2UgdG8gdGhlIGNvbnNvbGUuCi0JICovCi0JcHJpdmF0ZSB2b2lkIHByaW50RGVidWdNZXNzYWdlKFN0cmluZyBtZXRob2QsIFN0cmluZyBtc2cpIHsKLQkJcHJpbnREZWJ1Z01lc3NhZ2UobWV0aG9kLCBtc2csIG51bGwpOwotCX0KLQkKLQlwdWJsaWMgRmluZFJlcGxhY2VBY3Rpb24gZ2V0RmluZFJlcGxhY2VBY3Rpb24oKSB7Ci0JCXJldHVybiByaWNoVGV4dC5nZXRGaW5kUmVwbGFjZUFjdGlvbigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEZpbmRSZXBsYWNlQWN0aW9uKEZpbmRSZXBsYWNlQWN0aW9uIGZpbmRSZXBsYWNlQWN0aW9uKSB7Ci0JCWlmIChyaWNoVGV4dCAhPSBudWxsKSB7Ci0JCQlyaWNoVGV4dC5zZXRGaW5kUmVwbGFjZUFjdGlvbihmaW5kUmVwbGFjZUFjdGlvbik7Ci0JCQlyaWNoVGV4dC5nZXRGaW5kUmVwbGFjZUFjdGlvbigpLnNldFJpY2hUZXh0KHRoaXMpOwotCi0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0SW5pdGlhbFRleHQoU3RyaW5nIHRleHQpIHsKLQkJaWYgKHJpY2hUZXh0ICE9IG51bGwpIHsKLQkJCXJpY2hUZXh0LnNldEluaXRpYWxUZXh0KHRleHQpOwotCQl9Ci0JCWlmIChnZXRTb3VyY2VFZGl0KCkgIT0gbnVsbCkgewotCQkJcmVtb3ZlTW9kaWZ5TGlzdGVuZXJzKCk7Ci0JCQlzZXREb2N1bWVudChuZXcgRG9jdW1lbnQodGV4dCkpOwotCQkJYWRkTW9kaWZ5TGlzdGVuZXJzKCk7Ci0JCX0KLQotCX0KLQkKLQkKLQkvKioKLQkgKiBmcm9tIG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuQWJzdHJhY3RUZXh0RWRpdG9yI2dldFVuZG9Db250ZXh0KCkKLQkgKiBSZXR1cm5zIHRoaXMgZWRpdG9yJ3Mgdmlld2VyJ3MgdW5kbyBtYW5hZ2VyIHVuZG8gY29udGV4dC4KLQkgKgotCSAqIEByZXR1cm4gdGhlIHVuZG8gY29udGV4dCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub3QgYXZhaWxhYmxlCi0JICogQHNpbmNlIDMuMQotCSAqLwotCXByaXZhdGUgSVVuZG9Db250ZXh0IGdldFVuZG9Db250ZXh0KCkgewotCQlpZiAoc291cmNlVmlld2VyIGluc3RhbmNlb2YgSVRleHRWaWV3ZXJFeHRlbnNpb242KSB7Ci0JCQlJVW5kb01hbmFnZXIgdW5kb01hbmFnZXI9ICgoSVRleHRWaWV3ZXJFeHRlbnNpb242KXNvdXJjZVZpZXdlcikuZ2V0VW5kb01hbmFnZXIoKTsKLQkJCWlmICh1bmRvTWFuYWdlciBpbnN0YW5jZW9mIElVbmRvTWFuYWdlckV4dGVuc2lvbikKLQkJCQlyZXR1cm4gKChJVW5kb01hbmFnZXJFeHRlbnNpb24pdW5kb01hbmFnZXIpLmdldFVuZG9Db250ZXh0KCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUFjdGlvbnMoKSB7Ci0JCWNyZWF0ZVVuZG9SZWRvQWN0aW9ucygpOwotCQkvLyBzZWxlY3QgYWxsCi0JCUFjdGlvbiBzZWxlY3RBbGxBY3Rpb24gPSBuZXcgQWN0aW9uKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJZ2V0U291cmNlRWRpdCgpLnNlbGVjdEFsbCgpOwotCQkJfQotCQl9OwotCQlzZWxlY3RBbGxBY3Rpb24uc2V0QWN0aW9uRGVmaW5pdGlvbklkKElXb3JrYmVuY2hBY3Rpb25EZWZpbml0aW9uSWRzLlNFTEVDVF9BTEwpOwotCQlyZWdpc3RlckFjdGlvbihBY3Rpb25GYWN0b3J5LlNFTEVDVF9BTEwuZ2V0SWQoKSwgc2VsZWN0QWxsQWN0aW9uKTsKLQl9Ci0KLQkvKgotCSAqIGZyb20gb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5BYnN0cmFjdFRleHRFZGl0b3IjY3JlYXRlVW5kb1JlZG9BY3Rpb25zKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVVbmRvUmVkb0FjdGlvbnMoKSB7Ci0JCUlVbmRvQ29udGV4dCB1bmRvQ29udGV4dD0gZ2V0VW5kb0NvbnRleHQoKTsKLQkJaWYgKHVuZG9Db250ZXh0ICE9IG51bGwpIHsKLQkJCS8vIFVzZSBhY3Rpb25zIHByb3ZpZGVkIGJ5IGdsb2JhbCB1bmRvL3JlZG8KLQkJCQotCQkJLy8gQ3JlYXRlIHRoZSB1bmRvIGFjdGlvbgotCQkJdW5kb0FjdGlvbj0gbmV3IFVuZG9BY3Rpb25IYW5kbGVyKGdldEVkaXRvclNpdGUoKSwgdW5kb0NvbnRleHQpOwotCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscCh1bmRvQWN0aW9uLCBJQWJzdHJhY3RUZXh0RWRpdG9ySGVscENvbnRleHRJZHMuVU5ET19BQ1RJT04pOwotCQkJdW5kb0FjdGlvbi5zZXRBY3Rpb25EZWZpbml0aW9uSWQoSVdvcmtiZW5jaEFjdGlvbkRlZmluaXRpb25JZHMuVU5ETyk7Ci0JCQlyZWdpc3RlckFjdGlvbihJVGV4dEVkaXRvckFjdGlvbkNvbnN0YW50cy5VTkRPLCB1bmRvQWN0aW9uKTsKLQotCQkJLy8gQ3JlYXRlIHRoZSByZWRvIGFjdGlvbi4KLQkJCXJlZG9BY3Rpb249IG5ldyBSZWRvQWN0aW9uSGFuZGxlcihnZXRFZGl0b3JTaXRlKCksIHVuZG9Db250ZXh0KTsKLQkJCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAocmVkb0FjdGlvbiwgSUFic3RyYWN0VGV4dEVkaXRvckhlbHBDb250ZXh0SWRzLlJFRE9fQUNUSU9OKTsKLQkJCXJlZG9BY3Rpb24uc2V0QWN0aW9uRGVmaW5pdGlvbklkKElXb3JrYmVuY2hBY3Rpb25EZWZpbml0aW9uSWRzLlJFRE8pOwotCQkJcmVnaXN0ZXJBY3Rpb24oSVRleHRFZGl0b3JBY3Rpb25Db25zdGFudHMuUkVETywgcmVkb0FjdGlvbik7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBJRWRpdG9yU2l0ZSBnZXRFZGl0b3JTaXRlKCkgewotCQlyZXR1cm4gZWRpdG9yU2l0ZTsKLQl9Ci0KLQotCS8qKgotCSAqIFJlZ2lzdGVycyB0aGUgZ2l2ZW4gdW5kby9yZWRvIGFjdGlvbiB1bmRlciB0aGUgZ2l2ZW4gSUQgYW5kCi0JICogZW5zdXJlcyB0aGF0IHByZXZpb3VzbHkgaW5zdGFsbGVkIGFjdGlvbnMgZ2V0IGRpc3Bvc2VkLiBJdAotCSAqIGFsc28gdGFrZXMgY2FyZSBvZiByZS1yZWdpc3RlcmluZyB0aGUgbmV3IGFjdGlvbiB3aXRoIHRoZQotCSAqIGdsb2JhbCBhY3Rpb24gaGFuZGxlci4KLQkgKiAKLQkgKiBAcGFyYW0gYWN0aW9uSWQJdGhlIGFjdGlvbiBpZCB1bmRlciB3aGljaCB0byByZWdpc3RlciB0aGUgYWN0aW9uCi0JICogQHBhcmFtIGFjdGlvbgl0aGUgYWN0aW9uIHRvIHJlZ2lzdGVyCi0JICogQHNpbmNlIDMuMQotCSAqLwotCXByaXZhdGUgdm9pZCByZWdpc3RlckFjdGlvbihTdHJpbmcgYWN0aW9uSWQsIElBY3Rpb24gYWN0aW9uKSB7Ci0JCUlBY3Rpb24gb2xkQWN0aW9uPSBnZXRBY3Rpb24oYWN0aW9uSWQpOwotCQlpZiAob2xkQWN0aW9uIGluc3RhbmNlb2YgT3BlcmF0aW9uSGlzdG9yeUFjdGlvbkhhbmRsZXIpCi0JCQkoKE9wZXJhdGlvbkhpc3RvcnlBY3Rpb25IYW5kbGVyKW9sZEFjdGlvbikuZGlzcG9zZSgpOwotCi0JCXNldEFjdGlvbihhY3Rpb25JZCwgYWN0aW9uKTsKLQkJCi0JCUlBY3Rpb25CYXJzIGFjdGlvbkJhcnM9IGdldEVkaXRvclNpdGUoKS5nZXRBY3Rpb25CYXJzKCk7Ci0JCWlmIChhY3Rpb25CYXJzICE9IG51bGwpCi0JCQlhY3Rpb25CYXJzLnNldEdsb2JhbEFjdGlvbkhhbmRsZXIoYWN0aW9uSWQsIGFjdGlvbik7Ci0JfQotCi0JCi0JLyoKLQkgKiBAc2VlIElUZXh0RWRpdG9yI2dldEFjdGlvbihTdHJpbmcpCi0JICovCi0JcHVibGljIElBY3Rpb24gZ2V0QWN0aW9uKFN0cmluZyBhY3Rpb25JRCkgewotCQlhc3NlcnQgYWN0aW9uSUQgIT0gbnVsbDsKLQkJSUFjdGlvbiBhY3Rpb249IChJQWN0aW9uKSBmQWN0aW9ucy5nZXQoYWN0aW9uSUQpOwotCi0vLwkJaWYgKGFjdGlvbiA9PSBudWxsKSB7Ci0vLwkJCWFjdGlvbj0gZmluZENvbnRyaWJ1dGVkQWN0aW9uKGFjdGlvbklEKTsKLS8vCQkJaWYgKGFjdGlvbiAhPSBudWxsKQotLy8JCQkJc2V0QWN0aW9uKGFjdGlvbklELCBhY3Rpb24pOwotLy8JCX0KLQotCQlyZXR1cm4gYWN0aW9uOwotCX0KLQotCS8qCi0JICogQHNlZSBJVGV4dEVkaXRvciNzZXRBY3Rpb24oU3RyaW5nLCBJQWN0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFjdGlvbihTdHJpbmcgYWN0aW9uSUQsIElBY3Rpb24gYWN0aW9uKSB7Ci0JCWFzc2VydCBhY3Rpb25JRCAhPSBudWxsOwotCQlpZiAoYWN0aW9uID09IG51bGwpIHsKLQkJCWFjdGlvbj0gKElBY3Rpb24pIGZBY3Rpb25zLnJlbW92ZShhY3Rpb25JRCk7Ci0JCQlpZiAoYWN0aW9uICE9IG51bGwpCi0JCQkJZkFjdGl2YXRpb25Db2RlVHJpZ2dlci51bnJlZ2lzdGVyQWN0aW9uRnJvbUtleUFjdGl2YXRpb24oYWN0aW9uKTsKLQkJfSBlbHNlIHsKLQkJCWZBY3Rpb25zLnB1dChhY3Rpb25JRCwgYWN0aW9uKTsKLQkJCWZBY3RpdmF0aW9uQ29kZVRyaWdnZXIucmVnaXN0ZXJBY3Rpb25Gb3JLZXlBY3RpdmF0aW9uKGFjdGlvbik7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogSW5pdGlhbGl6ZXMgdGhlIGFjdGl2YXRpb24gY29kZSB0cmlnZ2VyLgotCSAqCi0JICogQHNpbmNlIDIuMQotCSAqLwotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplQWN0aXZhdGlvbkNvZGVUcmlnZ2VyKCkgewotCQlmQWN0aXZhdGlvbkNvZGVUcmlnZ2VyLmluc3RhbGwoKTsKLQkJZkFjdGl2YXRpb25Db2RlVHJpZ2dlci5zZXRTY29wZXMoZktleUJpbmRpbmdTY29wZXMpOwotCX0KLQotCS8qKgotCSAqIEludGVybmFsIGtleSB2ZXJpZnkgbGlzdGVuZXIgZm9yIHRyaWdnZXJpbmcgYWN0aW9uIGFjdGl2YXRpb24gY29kZXMuCi0JICovCi0JY2xhc3MgQWN0aXZhdGlvbkNvZGVUcmlnZ2VyIGltcGxlbWVudHMgVmVyaWZ5S2V5TGlzdGVuZXIgewotCi0JCS8qKiBJbmRpY2F0ZXMgd2hldGhlciB0aGlzIHRyaWdnZXIgaGFzIGJlZW4gaW5zdGFsbGVkLiAqLwotCQlwcml2YXRlIGJvb2xlYW4gZklzSW5zdGFsbGVkPSBmYWxzZTsKLQkJLyoqCi0JCSAqIFRoZSBrZXkgYmluZGluZyBzZXJ2aWNlIHRvIHVzZS4KLQkJICogQHNpbmNlIDIuMAotCQkgKi8KLQkJcHJpdmF0ZSBJS2V5QmluZGluZ1NlcnZpY2UgZktleUJpbmRpbmdTZXJ2aWNlOwotCQkKLQkJLyoKLQkJICogQHNlZSBWZXJpZnlLZXlMaXN0ZW5lciN2ZXJpZnlLZXkob3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5WZXJpZnlFdmVudCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIHZlcmlmeUtleShWZXJpZnlFdmVudCBldmVudCkgewotCi0JCQlBY3Rpb25BY3RpdmF0aW9uQ29kZSBjb2RlPSBudWxsOwotCQkJaW50IHNpemU9IGZBY3RpdmF0aW9uQ29kZXMuc2l6ZSgpOwotCQkJZm9yIChpbnQgaT0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCWNvZGU9IChBY3Rpb25BY3RpdmF0aW9uQ29kZSkgZkFjdGl2YXRpb25Db2Rlcy5nZXQoaSk7Ci0JCQkJaWYgKGNvZGUubWF0Y2hlcyhldmVudCkpIHsKLQkJCQkJSUFjdGlvbiBhY3Rpb249IGdldEFjdGlvbihjb2RlLmZBY3Rpb25JZCk7Ci0JCQkJCWlmIChhY3Rpb24gIT0gbnVsbCkgewotCi0JCQkJCQlpZiAoYWN0aW9uIGluc3RhbmNlb2YgSVVwZGF0ZSkKLQkJCQkJCQkoKElVcGRhdGUpIGFjdGlvbikudXBkYXRlKCk7Ci0KLQkJCQkJCWlmICghYWN0aW9uLmlzRW5hYmxlZCgpICYmIGFjdGlvbiBpbnN0YW5jZW9mIElSZWFkT25seURlcGVuZGVudCkgewotCQkJCQkJCUlSZWFkT25seURlcGVuZGVudCBkZXBlbmRlbnQ9IChJUmVhZE9ubHlEZXBlbmRlbnQpIGFjdGlvbjsKLQkJCQkJCQlib29sZWFuIHdyaXRhYmxlPSBkZXBlbmRlbnQuaXNFbmFibGVkKHRydWUpOwotCQkJCQkJCWlmICh3cml0YWJsZSkgewotCQkJCQkJCQlldmVudC5kb2l0PSBmYWxzZTsKLQkJCQkJCQkJcmV0dXJuOwotCQkJCQkJCX0KLQkJCQkJCX0gZWxzZSBpZiAoYWN0aW9uLmlzRW5hYmxlZCgpKSB7Ci0JCQkJCQkJZXZlbnQuZG9pdD0gZmFsc2U7Ci0JCQkJCQkJYWN0aW9uLnJ1bigpOwotCQkJCQkJCXJldHVybjsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCS8qKgotCQkgKiBJbnN0YWxscyB0aGlzIHRyaWdnZXIgb24gdGhlIGVkaXRvcidzIHRleHQgd2lkZ2V0LgotCQkgKiBAc2luY2UgMi4wCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBpbnN0YWxsKCkgewotCQkJaWYgKCFmSXNJbnN0YWxsZWQpIHsKLQotCQkJCWlmIChzb3VyY2VWaWV3ZXIgaW5zdGFuY2VvZiBJVGV4dFZpZXdlckV4dGVuc2lvbikgewotCQkJCQlJVGV4dFZpZXdlckV4dGVuc2lvbiBlPSAoSVRleHRWaWV3ZXJFeHRlbnNpb24pIHNvdXJjZVZpZXdlcjsKLQkJCQkJZS5wcmVwZW5kVmVyaWZ5S2V5TGlzdGVuZXIodGhpcyk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJU3R5bGVkVGV4dCB0ZXh0PSBzb3VyY2VWaWV3ZXIuZ2V0VGV4dFdpZGdldCgpOwotCQkJCQl0ZXh0LmFkZFZlcmlmeUtleUxpc3RlbmVyKHRoaXMpOwotCQkJCX0KLQotCQkJCWZLZXlCaW5kaW5nU2VydmljZT0gZ2V0RWRpdG9yU2l0ZSgpLmdldEtleUJpbmRpbmdTZXJ2aWNlKCk7Ci0JCQkJZklzSW5zdGFsbGVkPSB0cnVlOwotCQkJfQotCQl9Ci0KLQkJLyoqCi0JCSAqIFVuaW5zdGFsbHMgdGhpcyB0cmlnZ2VyIGZyb20gdGhlIGVkaXRvcidzIHRleHQgd2lkZ2V0LgotCQkgKiBAc2luY2UgMi4wCi0JCSAqLwotCQlwdWJsaWMgdm9pZCB1bmluc3RhbGwoKSB7Ci0JCQlpZiAoZklzSW5zdGFsbGVkKSB7Ci0KLQkJCQlpZiAoc291cmNlVmlld2VyIGluc3RhbmNlb2YgSVRleHRWaWV3ZXJFeHRlbnNpb24pIHsKLQkJCQkJSVRleHRWaWV3ZXJFeHRlbnNpb24gZT0gKElUZXh0Vmlld2VyRXh0ZW5zaW9uKSBzb3VyY2VWaWV3ZXI7Ci0JCQkJCWUucmVtb3ZlVmVyaWZ5S2V5TGlzdGVuZXIodGhpcyk7Ci0JCQkJfSBlbHNlIGlmIChzb3VyY2VWaWV3ZXIgIT0gbnVsbCkgewotCQkJCQlTdHlsZWRUZXh0IHRleHQ9IHNvdXJjZVZpZXdlci5nZXRUZXh0V2lkZ2V0KCk7Ci0JCQkJCWlmICh0ZXh0ICE9IG51bGwgJiYgIXRleHQuaXNEaXNwb3NlZCgpKQotCQkJCQkJdGV4dC5yZW1vdmVWZXJpZnlLZXlMaXN0ZW5lcihmQWN0aXZhdGlvbkNvZGVUcmlnZ2VyKTsKLQkJCQl9Ci0KLQkJCQlmSXNJbnN0YWxsZWQ9IGZhbHNlOwotCQkJCWZLZXlCaW5kaW5nU2VydmljZT0gbnVsbDsKLQkJCX0KLQkJfQotCi0JCS8qKgotCQkgKiBSZWdpc3RlcnMgdGhlIGdpdmVuIGFjdGlvbiBmb3Iga2V5IGFjdGl2YXRpb24uCi0JCSAqIEBwYXJhbSBhY3Rpb24gdGhlIGFjdGlvbiB0byBiZSByZWdpc3RlcmVkCi0JCSAqIEBzaW5jZSAyLjAKLQkJICovCi0JCXB1YmxpYyB2b2lkIHJlZ2lzdGVyQWN0aW9uRm9yS2V5QWN0aXZhdGlvbihJQWN0aW9uIGFjdGlvbikgewotCQkJaWYgKGFjdGlvbi5nZXRBY3Rpb25EZWZpbml0aW9uSWQoKSAhPSBudWxsKQotCQkJCWZLZXlCaW5kaW5nU2VydmljZS5yZWdpc3RlckFjdGlvbihhY3Rpb24pOwotCQl9Ci0KLQkJLyoqCi0JCSAqIFRoZSBnaXZlbiBhY3Rpb24gaXMgbm8gbG9uZ2VyIGF2YWlsYWJsZSBmb3Iga2V5IGFjdGl2YXRpb24KLQkJICogQHBhcmFtIGFjdGlvbiB0aGUgYWN0aW9uIHRvIGJlIHVucmVnaXN0ZXJlZAotCQkgKiBAc2luY2UgMi4wCi0JCSAqLwotCQlwdWJsaWMgdm9pZCB1bnJlZ2lzdGVyQWN0aW9uRnJvbUtleUFjdGl2YXRpb24oSUFjdGlvbiBhY3Rpb24pIHsKLQkJCWlmIChhY3Rpb24uZ2V0QWN0aW9uRGVmaW5pdGlvbklkKCkgIT0gbnVsbCkKLQkJCQlmS2V5QmluZGluZ1NlcnZpY2UudW5yZWdpc3RlckFjdGlvbihhY3Rpb24pOwotCQl9Ci0KLQkJLyoqCi0JCSAqIFNldHMgdGhlIGtleSBiaW5kaW5nIHNjb3BlcyBmb3IgdGhpcyBlZGl0b3IuCi0JCSAqIEBwYXJhbSBrZXlCaW5kaW5nU2NvcGVzIHRoZSBrZXkgYmluZGluZyBzY29wZXMKLQkJICogQHNpbmNlIDIuMQotCQkgKi8KLQkJcHVibGljIHZvaWQgc2V0U2NvcGVzKFN0cmluZ1tdIGtleUJpbmRpbmdTY29wZXMpIHsKLQkJCWlmIChrZXlCaW5kaW5nU2NvcGVzICE9IG51bGwgJiYga2V5QmluZGluZ1Njb3Blcy5sZW5ndGggPiAwKQotCQkJCWZLZXlCaW5kaW5nU2VydmljZS5zZXRTY29wZXMoa2V5QmluZGluZ1Njb3Blcyk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogUmVwcmVzZW50YXRpb24gb2YgYWN0aW9uIGFjdGl2YXRpb24gY29kZXMuCi0JICovCi0Jc3RhdGljIGNsYXNzIEFjdGlvbkFjdGl2YXRpb25Db2RlIHsKLQotCQkvKiogVGhlIGFjdGlvbiBpZC4gKi8KLQkJcHVibGljIFN0cmluZyBmQWN0aW9uSWQ7Ci0JCS8qKiBUaGUgY2hhcmFjdGVyLiAqLwotCQlwdWJsaWMgY2hhciBmQ2hhcmFjdGVyOwotCQkvKiogVGhlIGtleSBjb2RlLiAqLwotCQlwdWJsaWMgaW50IGZLZXlDb2RlPSAtMTsKLQkJLyoqIFRoZSBzdGF0ZSBtYXNrLiAqLwotCQlwdWJsaWMgaW50IGZTdGF0ZU1hc2s9IFNXVC5ERUZBVUxUOwotCi0JCS8qKgotCQkgKiBDcmVhdGVzIGEgbmV3IGFjdGlvbiBhY3RpdmF0aW9uIGNvZGUgZm9yIHRoZSBnaXZlbiBhY3Rpb24gaWQuCi0JCSAqIEBwYXJhbSBhY3Rpb25JZCB0aGUgYWN0aW9uIGlkCi0JCSAqLwotCQlwdWJsaWMgQWN0aW9uQWN0aXZhdGlvbkNvZGUoU3RyaW5nIGFjdGlvbklkKSB7Ci0JCQlmQWN0aW9uSWQ9IGFjdGlvbklkOwotCQl9Ci0KLQkJLyoqCi0JCSAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBhY3RpdmF0aW9uIGNvZGUgbWF0Y2hlcyB0aGUgZ2l2ZW4gdmVyaWZ5IGV2ZW50LgotCQkgKiBAcGFyYW0gZXZlbnQgdGhlIGV2ZW50IHRvIHRlc3QgZm9yIG1hdGNoaW5nCi0JCSAqIEByZXR1cm4gd2hldGhlciB0aGlzIGFjdGl2YXRpb24gY29kZSBtYXRjaGVzIDxjb2RlPmV2ZW50PC9jb2RlPgotCQkgKi8KLQkJcHVibGljIGJvb2xlYW4gbWF0Y2hlcyhWZXJpZnlFdmVudCBldmVudCkgewotCQkJcmV0dXJuIChldmVudC5jaGFyYWN0ZXIgPT0gZkNoYXJhY3RlciAmJgotCQkJCQkJKGZLZXlDb2RlID09IC0xIHx8IGV2ZW50LmtleUNvZGUgPT0gZktleUNvZGUpICYmCi0JCQkJCQkoZlN0YXRlTWFzayA9PSBTV1QuREVGQVVMVCB8fCBldmVudC5zdGF0ZU1hc2sgPT0gZlN0YXRlTWFzaykpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9SaWNoVGV4dEVkaXRvckZvcm0uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L1JpY2hUZXh0RWRpdG9yRm9ybS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxODUxYTM4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L1JpY2hUZXh0RWRpdG9yRm9ybS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5WaWV3Rm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5Gb3JtVG9vbGtpdDsKLQotLyoqCi0gKiBBIGNvbXBvc2l0ZSBmb3IgbGF5aW5nIG91dCB0aGUgZGVmYXVsdCByaWNoIHRleHQgZWRpdG9yIGluIGFuIEVjbGlwc2UgZm9ybS4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBSaWNoVGV4dEVkaXRvckZvcm0gZXh0ZW5kcyBWaWV3Rm9ybSB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgY29udHJvbAotCSAqIEBwYXJhbSBzdHlsZQotCSAqICAgICAgICAgICAgdGhlIHN0eWxlIGZvciB0aGlzIGNvbnRyb2wKLQkgKi8KLQlwdWJsaWMgUmljaFRleHRFZGl0b3JGb3JtKENvbXBvc2l0ZSBwYXJlbnQsIGludCBzdHlsZSkgewotCQlzdXBlcihwYXJlbnQsIHN0eWxlKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzI2dldERhdGEoU3RyaW5nIGtleSkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldERhdGEoU3RyaW5nIGtleSkgewotCQlpZiAoa2V5ICE9IG51bGwgJiYga2V5LmVxdWFscyhGb3JtVG9vbGtpdC5LRVlfRFJBV19CT1JERVIpKSB7Ci0JCQkvLyBSZXR1cm4gYSB0ZXh0IGJvcmRlciB0byBnZXQgdGhlIEZvcm1Ub29sa2l0J3MgQm9yZGVyUGFpbnRlciB0bwotCQkJLy8gcGFpbnQgYSBib3JkZXIgZm9yIHRoZSByaWNoIHRleHQgZWRpdG9yLgotCQkJcmV0dXJuIEZvcm1Ub29sa2l0LlRFWFRfQk9SREVSOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXREYXRhKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9SaWNoVGV4dEZvcm1Ub29sa2l0LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9SaWNoVGV4dEZvcm1Ub29sa2l0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlZGYwMDAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvUmljaFRleHRGb3JtVG9vbGtpdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuRm9ybVRvb2xraXQ7Ci0KLS8qKgotICogQSBoZWxwZXIgdG9vbGtpdCBmb3IgY3JlYXRpbmcgYSByaWNoIHRleHQgY29udHJvbCBhbmQgZWRpdG9yIHRoYXQgY2FuIGJlCi0gKiBhZGRlZCB0byBhbiBFY2xpcHNlIGZvcm0uCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUmljaFRleHRGb3JtVG9vbGtpdCB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgcmljaCB0ZXh0IGNvbnRyb2wgYW5kIGFkYXB0cyBpdCB0byBiZSB1c2VkIGluIGEgZm9ybS4KLQkgKiAKLQkgKiBAcGFyYW0gdG9vbGtpdAotCSAqICAgICAgICAgICAgdGhlIGZvcm0gdG9vbGtpdAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgY29udHJvbAotCSAqIEBwYXJhbSB0ZXh0Ci0JICogICAgICAgICAgICB0aGUgaW5pdGlhbCB0ZXh0IGZvciB0aGUgdmlld2VyCi0JICogQHBhcmFtIHN0eWxlCi0JICogICAgICAgICAgICB0aGUgaW5pdGlhbCBzdHlsZSBmb3IgdGhlIHZpZXdlcgotCSAqIEBwYXJhbSBiYXNlUGF0aAotCSAqICAgICAgICAgICAgdGhlIGJhc2UgcGF0aCB1c2VkIGZvciByZXNvbHZpbmcgaHJlZnMKLQkgKiBAcmV0dXJuIGEgbmV3IDxjb2RlPklSaWNoVGV4dDwvY29kZT4gaW5zdGFuY2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElSaWNoVGV4dCBjcmVhdGVSaWNoVGV4dChGb3JtVG9vbGtpdCB0b29sa2l0LAotCQkJQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIHRleHQsIGludCBzdHlsZSkgewotCQlJUmljaFRleHQgcmljaFRleHQgPSBuZXcgUmljaFRleHQocGFyZW50LCB0b29sa2l0LmdldEJvcmRlclN0eWxlKCkKLQkJCQl8IHN0eWxlIHwgdG9vbGtpdC5nZXRPcmllbnRhdGlvbigpKTsKLQkJcmljaFRleHQuZ2V0Q29udHJvbCgpLnNldERhdGEoRm9ybVRvb2xraXQuS0VZX0RSQVdfQk9SREVSLAotCQkJCUZvcm1Ub29sa2l0LlRFWFRfQk9SREVSKTsKLQkJaWYgKHRleHQgIT0gbnVsbCkgewotCQkJcmljaFRleHQuc2V0VGV4dCh0ZXh0KTsKLQkJfQotCQlyZXR1cm4gcmljaFRleHQ7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIHJpY2ggdGV4dCBlZGl0b3IgYW5kIGFkYXB0cyBpdCB0byBiZSB1c2VkIGluIGEgZm9ybS4KLQkgKiAKLQkgKiBAcGFyYW0gdG9vbGtpdAotCSAqICAgICAgICAgICAgdGhlIGZvcm0gdG9vbGtpdAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgY29udHJvbAotCSAqIEBwYXJhbSB0ZXh0Ci0JICogICAgICAgICAgICB0aGUgaW5pdGlhbCB0ZXh0IGZvciB0aGUgdmlld2VyCi0JICogQHBhcmFtIHN0eWxlCi0JICogICAgICAgICAgICB0aGUgaW5pdGlhbCBzdHlsZSBmb3IgdGhlIHZpZXdlcgotCSAqIEBwYXJhbSBiYXNlUGF0aAotCSAqICAgICAgICAgICAgdGhlIGJhc2UgcGF0aCB1c2VkIGZvciByZXNvbHZpbmcgaHJlZnMKLQkgKiBAcmV0dXJuIGEgbmV3IDxjb2RlPklSaWNoVGV4dDwvY29kZT4gaW5zdGFuY2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElSaWNoVGV4dEVkaXRvciBjcmVhdGVSaWNoVGV4dEVkaXRvcihGb3JtVG9vbGtpdCB0b29sa2l0LAotCQkJQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIHRleHQsIGludCBzdHlsZSwgSUVkaXRvclNpdGUgZWRpdG9yU2l0ZSkgewotCQlJUmljaFRleHRFZGl0b3IgcmljaFRleHRFZGl0b3IgPSBuZXcgUmljaFRleHRFZGl0b3IocGFyZW50LCB0b29sa2l0Ci0JCQkJLmdldEJvcmRlclN0eWxlKCkKLQkJCQl8IHN0eWxlIHwgdG9vbGtpdC5nZXRPcmllbnRhdGlvbigpLCBlZGl0b3JTaXRlKTsKLQkJcmljaFRleHRFZGl0b3IuZ2V0Q29udHJvbCgpLnNldERhdGEoRm9ybVRvb2xraXQuS0VZX0RSQVdfQk9SREVSLAotCQkJCUZvcm1Ub29sa2l0LlRFWFRfQk9SREVSKTsKLQkJaWYgKHRleHQgIT0gbnVsbCkgewotCQkJcmljaFRleHRFZGl0b3Iuc2V0SW5pdGlhbFRleHQodGV4dCk7Ci0JCX0KLQkJcmV0dXJuIHJpY2hUZXh0RWRpdG9yOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvUmljaFRleHRJbWFnZXMuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L1JpY2hUZXh0SW1hZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1NGY5YzUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvUmljaFRleHRJbWFnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotCi0vKioKLSAqIFNoYXJlZCBpbWFnZXMgdXNlZCBieSB0aGUgZGVmYXVsdCByaWNoIHRleHQgZWRpdG9yLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFJpY2hUZXh0SW1hZ2VzIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFVE9PTDE2ID0gImZ1bGwvZXRvb2wxNi8iOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRFRPT0wxNiA9ICJmdWxsL2R0b29sMTYvIjsgLy8kTk9OLU5MUy0xJAkKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFJpY2hUZXh0UGx1Z2luIHJpY2hUZXh0UGx1Z2luID0gUmljaFRleHRQbHVnaW4KLQkJCS5nZXREZWZhdWx0KCk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfUEFUSF9BRERfSU1BR0UgPSBFVE9PTDE2ICsgIkFkZEltYWdlLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19QQVRIX0FERF9MSU5FID0gRVRPT0wxNiArICJBZGRMaW5lLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19QQVRIX0FERF9MSU5LID0gRVRPT0wxNiArICJBZGRMaW5rLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19QQVRIX0FERF9PUkRFUkVEX0xJU1QgPSBFVE9PTDE2Ci0JCQkrICJBZGRPcmRlcmVkTGlzdC5naWYiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfUEFUSF9BRERfVEFCTEUgPSBFVE9PTDE2ICsgIkFkZFRhYmxlLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19QQVRIX0FERF9VTk9SREVSRURfTElTVCA9IEVUT09MMTYKLQkJCSsgIkFkZFVub3JkZXJlZExpc3QuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX1BBVEhfQk9MRCA9IEVUT09MMTYgKyAiQm9sZC5naWYiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfUEFUSF9DTEVBUl9DT05URU5UID0gRVRPT0wxNgotCQkJKyAiQ2xlYXJDb250ZW50LmdpZiI7IC8vJE5PTi1OTFMtMSQJCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfUEFUSF9DT1BZID0gRVRPT0wxNiArICJDb3B5LmdpZiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19QQVRIX0NVVCA9IEVUT09MMTYgKyAiQ3V0LmdpZiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19QQVRIX0ZJTkRfUkVQTEFDRSA9IEVUT09MMTYKLQkJCSsgIkZpbmRSZXBsYWNlLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19QQVRIX0lOREVOVCA9IEVUT09MMTYgKyAiSW5kZW50LmdpZiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19QQVRIX0lUQUxJQyA9IEVUT09MMTYgKyAiSXRhbGljLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19QQVRIX0pVU1RJRllfQ0VOVEVSID0gRVRPT0wxNgotCQkJKyAiSnVzdGlmeUNlbnRlci5naWYiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfUEFUSF9KVVNUSUZZX0ZVTEwgPSBFVE9PTDE2Ci0JCQkrICJKdXN0aWZ5RnVsbC5naWYiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfUEFUSF9KVVNUSUZZX0xFRlQgPSBFVE9PTDE2Ci0JCQkrICJKdXN0aWZ5TGVmdC5naWYiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfUEFUSF9KVVNUSUZZX1JJR0hUID0gRVRPT0wxNgotCQkJKyAiSnVzdGlmeVJpZ2h0LmdpZiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19QQVRIX09VVERFTlQgPSBFVE9PTDE2ICsgIk91dGRlbnQuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX1BBVEhfUEFTVEUgPSBFVE9PTDE2ICsgIlBhc3RlLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfUEFUSF9QQVNURV9QTEFJTl9URVhUID0gRVRPT0wxNiArICJQYXN0ZVBsYWluVGV4dC5naWYiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfUEFUSF9TVFJJS0VfVEhST1VHSCA9IEVUT09MMTYKLQkJCSsgIlN0cmlrZVRocm91Z2guZ2lmIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX1BBVEhfU1VCU0NSSVBUID0gRVRPT0wxNiArICJTdWJzY3JpcHQuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX1BBVEhfU1VQRVJTQ1JJUFQgPSBFVE9PTDE2Ci0JCQkrICJTdXBlcnNjcmlwdC5naWYiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfUEFUSF9VTkRFUkxJTkUgPSBFVE9PTDE2ICsgIlVuZGVybGluZS5naWYiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfUEFUSF9USURZID0gRVRPT0wxNiArICJUaWR5SFRNTC5naWYiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIElNR19BRERfSU1BR0UgPSByaWNoVGV4dFBsdWdpbgotCQkJLmdldFNoYXJlZEltYWdlKElNR19QQVRIX0FERF9JTUFHRSk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIElNR19BRERfTElORSA9IHJpY2hUZXh0UGx1Z2luCi0JCQkuZ2V0U2hhcmVkSW1hZ2UoSU1HX1BBVEhfQUREX0xJTkUpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBJTUdfQUREX0xJTksgPSByaWNoVGV4dFBsdWdpbgotCQkJLmdldFNoYXJlZEltYWdlKElNR19QQVRIX0FERF9MSU5LKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgSU1HX0FERF9PUkRFUkVEX0xJU1QgPSByaWNoVGV4dFBsdWdpbgotCQkJLmdldFNoYXJlZEltYWdlKElNR19QQVRIX0FERF9PUkRFUkVEX0xJU1QpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBJTUdfQUREX1RBQkxFID0gcmljaFRleHRQbHVnaW4KLQkJCS5nZXRTaGFyZWRJbWFnZShJTUdfUEFUSF9BRERfVEFCTEUpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBJTUdfQUREX1VOT1JERVJFRF9MSVNUID0gcmljaFRleHRQbHVnaW4KLQkJCS5nZXRTaGFyZWRJbWFnZShJTUdfUEFUSF9BRERfVU5PUkRFUkVEX0xJU1QpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBJTUdfQk9MRCA9IHJpY2hUZXh0UGx1Z2luCi0JCQkuZ2V0U2hhcmVkSW1hZ2UoSU1HX1BBVEhfQk9MRCk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIElNR19DTEVBUl9DT05URU5UID0gcmljaFRleHRQbHVnaW4KLQkJCS5nZXRTaGFyZWRJbWFnZShJTUdfUEFUSF9DTEVBUl9DT05URU5UKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgSU1HX0NPUFkgPSByaWNoVGV4dFBsdWdpbgotCQkJLmdldFNoYXJlZEltYWdlKElNR19QQVRIX0NPUFkpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBJTUdfQ1VUID0gcmljaFRleHRQbHVnaW4KLQkJCS5nZXRTaGFyZWRJbWFnZShJTUdfUEFUSF9DVVQpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBJTUdfRklORF9SRVBMQUNFID0gcmljaFRleHRQbHVnaW4KLQkJCS5nZXRTaGFyZWRJbWFnZShJTUdfUEFUSF9GSU5EX1JFUExBQ0UpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBJTUdfSU5ERU5UID0gcmljaFRleHRQbHVnaW4KLQkJCS5nZXRTaGFyZWRJbWFnZShJTUdfUEFUSF9JTkRFTlQpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBJTUdfSVRBTElDID0gcmljaFRleHRQbHVnaW4KLQkJCS5nZXRTaGFyZWRJbWFnZShJTUdfUEFUSF9JVEFMSUMpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBJTUdfSlVTVElGWV9DRU5URVIgPSByaWNoVGV4dFBsdWdpbgotCQkJLmdldFNoYXJlZEltYWdlKElNR19QQVRIX0pVU1RJRllfQ0VOVEVSKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgSU1HX0pVU1RJRllfRlVMTCA9IHJpY2hUZXh0UGx1Z2luCi0JCQkuZ2V0U2hhcmVkSW1hZ2UoSU1HX1BBVEhfSlVTVElGWV9GVUxMKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgSU1HX0pVU1RJRllfTEVGVCA9IHJpY2hUZXh0UGx1Z2luCi0JCQkuZ2V0U2hhcmVkSW1hZ2UoSU1HX1BBVEhfSlVTVElGWV9MRUZUKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgSU1HX0pVU1RJRllfUklHSFQgPSByaWNoVGV4dFBsdWdpbgotCQkJLmdldFNoYXJlZEltYWdlKElNR19QQVRIX0pVU1RJRllfUklHSFQpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBJTUdfT1VUREVOVCA9IHJpY2hUZXh0UGx1Z2luCi0JCQkuZ2V0U2hhcmVkSW1hZ2UoSU1HX1BBVEhfT1VUREVOVCk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIElNR19QQVNURSA9IHJpY2hUZXh0UGx1Z2luCi0JCQkuZ2V0U2hhcmVkSW1hZ2UoSU1HX1BBVEhfUEFTVEUpOwotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgSU1HX1BBU1RFX1BMQUlOX1RFWFQgPSByaWNoVGV4dFBsdWdpbgotCQkJLmdldFNoYXJlZEltYWdlKElNR19QQVRIX1BBU1RFX1BMQUlOX1RFWFQpOwkKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgSU1HX1NUUklLRV9USFJPVUdIID0gcmljaFRleHRQbHVnaW4KLQkJCS5nZXRTaGFyZWRJbWFnZShJTUdfUEFUSF9TVFJJS0VfVEhST1VHSCk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIElNR19TVUJTQ1JJUFQgPSByaWNoVGV4dFBsdWdpbgotCQkJLmdldFNoYXJlZEltYWdlKElNR19QQVRIX1NVQlNDUklQVCk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIElNR19TVVBFUlNDUklQVCA9IHJpY2hUZXh0UGx1Z2luCi0JCQkuZ2V0U2hhcmVkSW1hZ2UoSU1HX1BBVEhfU1VQRVJTQ1JJUFQpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBJTUdfVU5ERVJMSU5FID0gcmljaFRleHRQbHVnaW4KLQkJCS5nZXRTaGFyZWRJbWFnZShJTUdfUEFUSF9VTkRFUkxJTkUpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgSU1HX1RJRFkgPSByaWNoVGV4dFBsdWdpbgotCQkJLmdldFNoYXJlZEltYWdlKElNR19QQVRIX1RJRFkpOwotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIElNR19ERVNDX0FERF9JTUFHRSA9IHJpY2hUZXh0UGx1Z2luCi0JCQkuZ2V0SW1hZ2VEZXNjcmlwdG9yKElNR19QQVRIX0FERF9JTUFHRSk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBJTUdfREVTQ19BRERfTElORSA9IHJpY2hUZXh0UGx1Z2luCi0JCQkuZ2V0SW1hZ2VEZXNjcmlwdG9yKElNR19QQVRIX0FERF9MSU5FKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIElNR19ERVNDX0FERF9MSU5LID0gcmljaFRleHRQbHVnaW4KLQkJCS5nZXRJbWFnZURlc2NyaXB0b3IoSU1HX1BBVEhfQUREX0xJTkspOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgSU1HX0RFU0NfQUREX09SREVSRURfTElTVCA9IHJpY2hUZXh0UGx1Z2luCi0JCQkuZ2V0SW1hZ2VEZXNjcmlwdG9yKElNR19QQVRIX0FERF9PUkRFUkVEX0xJU1QpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgSU1HX0RFU0NfQUREX1RBQkxFID0gcmljaFRleHRQbHVnaW4KLQkJCS5nZXRJbWFnZURlc2NyaXB0b3IoSU1HX1BBVEhfQUREX1RBQkxFKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIElNR19ERVNDX0FERF9VTk9SREVSRURfTElTVCA9IHJpY2hUZXh0UGx1Z2luCi0JCQkuZ2V0SW1hZ2VEZXNjcmlwdG9yKElNR19QQVRIX0FERF9VTk9SREVSRURfTElTVCk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBJTUdfREVTQ19CT0xEID0gcmljaFRleHRQbHVnaW4KLQkJCS5nZXRJbWFnZURlc2NyaXB0b3IoSU1HX1BBVEhfQk9MRCk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBJTUdfREVTQ19DTEVBUl9DT05URU5UID0gcmljaFRleHRQbHVnaW4KLQkJCS5nZXRJbWFnZURlc2NyaXB0b3IoSU1HX1BBVEhfQ0xFQVJfQ09OVEVOVCk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBJTUdfREVTQ19DT1BZID0gcmljaFRleHRQbHVnaW4KLQkJCS5nZXRJbWFnZURlc2NyaXB0b3IoSU1HX1BBVEhfQ09QWSk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBJTUdfREVTQ19DVVQgPSByaWNoVGV4dFBsdWdpbgotCQkJLmdldEltYWdlRGVzY3JpcHRvcihJTUdfUEFUSF9DVVQpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgSU1HX0RFU0NfRklORF9SRVBMQUNFID0gcmljaFRleHRQbHVnaW4KLQkJCS5nZXRJbWFnZURlc2NyaXB0b3IoSU1HX1BBVEhfRklORF9SRVBMQUNFKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIElNR19ERVNDX0lOREVOVCA9IHJpY2hUZXh0UGx1Z2luCi0JCQkuZ2V0SW1hZ2VEZXNjcmlwdG9yKElNR19QQVRIX0lOREVOVCk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBJTUdfREVTQ19JVEFMSUMgPSByaWNoVGV4dFBsdWdpbgotCQkJLmdldEltYWdlRGVzY3JpcHRvcihJTUdfUEFUSF9JVEFMSUMpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgSU1HX0RFU0NfSlVTVElGWV9DRU5URVIgPSByaWNoVGV4dFBsdWdpbgotCQkJLmdldEltYWdlRGVzY3JpcHRvcihJTUdfUEFUSF9KVVNUSUZZX0NFTlRFUik7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBJTUdfREVTQ19KVVNUSUZZX0ZVTEwgPSByaWNoVGV4dFBsdWdpbgotCQkJLmdldEltYWdlRGVzY3JpcHRvcihJTUdfUEFUSF9KVVNUSUZZX0ZVTEwpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgSU1HX0RFU0NfSlVTVElGWV9MRUZUID0gcmljaFRleHRQbHVnaW4KLQkJCS5nZXRJbWFnZURlc2NyaXB0b3IoSU1HX1BBVEhfSlVTVElGWV9MRUZUKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIElNR19ERVNDX0pVU1RJRllfUklHSFQgPSByaWNoVGV4dFBsdWdpbgotCQkJLmdldEltYWdlRGVzY3JpcHRvcihJTUdfUEFUSF9KVVNUSUZZX1JJR0hUKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIElNR19ERVNDX09VVERFTlQgPSByaWNoVGV4dFBsdWdpbgotCQkJLmdldEltYWdlRGVzY3JpcHRvcihJTUdfUEFUSF9PVVRERU5UKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIElNR19ERVNDX1BBU1RFID0gcmljaFRleHRQbHVnaW4KLQkJCS5nZXRJbWFnZURlc2NyaXB0b3IoSU1HX1BBVEhfUEFTVEUpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgSU1HX0RFU0NfUEFTVEVfUExBSU5fVEVYVCA9IHJpY2hUZXh0UGx1Z2luCi0JCQkuZ2V0SW1hZ2VEZXNjcmlwdG9yKElNR19QQVRIX1BBU1RFX1BMQUlOX1RFWFQpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgSU1HX0RFU0NfU1RSSUtFX1RIUk9VR0ggPSByaWNoVGV4dFBsdWdpbgotCQkJLmdldEltYWdlRGVzY3JpcHRvcihJTUdfUEFUSF9TVFJJS0VfVEhST1VHSCk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBJTUdfREVTQ19TVUJTQ1JJUFQgPSByaWNoVGV4dFBsdWdpbgotCQkJLmdldEltYWdlRGVzY3JpcHRvcihJTUdfUEFUSF9TVUJTQ1JJUFQpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgSU1HX0RFU0NfU1VQRVJTQ1JJUFQgPSByaWNoVGV4dFBsdWdpbgotCQkJLmdldEltYWdlRGVzY3JpcHRvcihJTUdfUEFUSF9TVVBFUlNDUklQVCk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBJTUdfREVTQ19VTkRFUkxJTkUgPSByaWNoVGV4dFBsdWdpbgotCQkJLmdldEltYWdlRGVzY3JpcHRvcihJTUdfUEFUSF9VTkRFUkxJTkUpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgSU1HX0RFU0NfVElEWSA9IHJpY2hUZXh0UGx1Z2luCi0JCQkuZ2V0SW1hZ2VEZXNjcmlwdG9yKElNR19QQVRIX1RJRFkpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElTQUJMRURfSU1HX1BBVEhfQUREX0lNQUdFID0gRFRPT0wxNgotCQkJKyAiQWRkSW1hZ2UuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCi0vLwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBESVNBQkxFRF9JTUdfUEFUSF9BRERfTElORSA9IERUT09MMTYKLS8vCQkJKyAiQWRkTGluZS5naWYiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBESVNBQkxFRF9JTUdfUEFUSF9BRERfTElOSyA9IERUT09MMTYKLQkJCSsgIkFkZExpbmsuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElTQUJMRURfSU1HX1BBVEhfQUREX09SREVSRURfTElTVCA9IERUT09MMTYKLQkJCSsgIkFkZE9yZGVyZWRMaXN0LmdpZiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERJU0FCTEVEX0lNR19QQVRIX0FERF9UQUJMRSA9IERUT09MMTYKLQkJCSsgIkFkZFRhYmxlLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERJU0FCTEVEX0lNR19QQVRIX0FERF9VTk9SREVSRURfTElTVCA9IERUT09MMTYKLQkJCSsgIkFkZFVub3JkZXJlZExpc3QuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElTQUJMRURfSU1HX1BBVEhfQk9MRCA9IERUT09MMTYgKyAiQm9sZC5naWYiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBESVNBQkxFRF9JTUdfUEFUSF9DTEVBUl9DT05URU5UID0gRFRPT0wxNgotCQkJKyAiQ2xlYXJDb250ZW50LmdpZiI7IC8vJE5PTi1OTFMtMSQJCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBESVNBQkxFRF9JTUdfUEFUSF9DT1BZID0gRFRPT0wxNiArICJDb3B5LmdpZiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERJU0FCTEVEX0lNR19QQVRIX0NVVCA9IERUT09MMTYgKyAiQ3V0LmdpZiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERJU0FCTEVEX0lNR19QQVRIX0ZJTkRfUkVQTEFDRSA9IERUT09MMTYKLQkJCSsgIkZpbmRSZXBsYWNlLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERJU0FCTEVEX0lNR19QQVRIX0lOREVOVCA9IERUT09MMTYKLQkJCSsgIkluZGVudC5naWYiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBESVNBQkxFRF9JTUdfUEFUSF9JVEFMSUMgPSBEVE9PTDE2Ci0JCQkrICJJdGFsaWMuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCi0vLwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBESVNBQkxFRF9JTUdfUEFUSF9KVVNUSUZZX0NFTlRFUiA9IERUT09MMTYKLS8vCQkJKyAiSnVzdGlmeUNlbnRlci5naWYiOyAvLyROT04tTkxTLTEkCi0vLwotLy8JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElTQUJMRURfSU1HX1BBVEhfSlVTVElGWV9GVUxMID0gRFRPT0wxNgotLy8JCQkrICJKdXN0aWZ5RnVsbC5naWYiOyAvLyROT04tTkxTLTEkCi0vLwotLy8JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElTQUJMRURfSU1HX1BBVEhfSlVTVElGWV9MRUZUID0gRFRPT0wxNgotLy8JCQkrICJKdXN0aWZ5TGVmdC5naWYiOyAvLyROT04tTkxTLTEkCi0vLwotLy8JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElTQUJMRURfSU1HX1BBVEhfSlVTVElGWV9SSUdIVCA9IERUT09MMTYKLS8vCQkJKyAiSnVzdGlmeVJpZ2h0LmdpZiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERJU0FCTEVEX0lNR19QQVRIX09VVERFTlQgPSBEVE9PTDE2Ci0JCQkrICJPdXRkZW50LmdpZiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERJU0FCTEVEX0lNR19QQVRIX1BBU1RFID0gRFRPT0wxNiArICJQYXN0ZS5naWYiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBESVNBQkxFRF9JTUdfUEFUSF9QQVNURV9QTEFJTl9URVhUID0gRFRPT0wxNiArICJQYXN0ZVBsYWluVGV4dC5naWYiOyAvLyROT04tTkxTLTEkCi0KLS8vCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERJU0FCTEVEX0lNR19QQVRIX1NUUklLRV9USFJPVUdIID0gRFRPT0wxNgotLy8JCQkrICJTdHJpa2VUaHJvdWdoLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERJU0FCTEVEX0lNR19QQVRIX1NVQlNDUklQVCA9IERUT09MMTYKLQkJCSsgIlN1YnNjcmlwdC5naWYiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBESVNBQkxFRF9JTUdfUEFUSF9TVVBFUlNDUklQVCA9IERUT09MMTYKLQkJCSsgIlN1cGVyc2NyaXB0LmdpZiI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBESVNBQkxFRF9JTUdfUEFUSF9USURZID0gRFRPT0wxNiArICJUaWR5SFRNTC5naWYiOyAvLyROT04tTkxTLTEkCi0JCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERJU0FCTEVEX0lNR19QQVRIX1VOREVSTElORSA9IERUT09MMTYKLQkJCSsgIlVuZGVybGluZS5naWYiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIERJU0FCTEVEX0lNR19BRERfSU1BR0UgPSByaWNoVGV4dFBsdWdpbgotCQkJLmdldFNoYXJlZEltYWdlKERJU0FCTEVEX0lNR19QQVRIX0FERF9JTUFHRSk7Ci0KLS8vCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgRElTQUJMRURfSU1HX0FERF9MSU5FID0gcmljaFRleHRQbHVnaW4KLS8vCQkJLmdldFNoYXJlZEltYWdlKERJU0FCTEVEX0lNR19QQVRIX0FERF9MSU5FKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgRElTQUJMRURfSU1HX0FERF9MSU5LID0gcmljaFRleHRQbHVnaW4KLQkJCS5nZXRTaGFyZWRJbWFnZShESVNBQkxFRF9JTUdfUEFUSF9BRERfTElOSyk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIERJU0FCTEVEX0lNR19BRERfT1JERVJFRF9MSVNUID0gcmljaFRleHRQbHVnaW4KLQkJCS5nZXRTaGFyZWRJbWFnZShESVNBQkxFRF9JTUdfUEFUSF9BRERfT1JERVJFRF9MSVNUKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgRElTQUJMRURfSU1HX0FERF9UQUJMRSA9IHJpY2hUZXh0UGx1Z2luCi0JCQkuZ2V0U2hhcmVkSW1hZ2UoRElTQUJMRURfSU1HX1BBVEhfQUREX1RBQkxFKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgRElTQUJMRURfSU1HX0FERF9VTk9SREVSRURfTElTVCA9IHJpY2hUZXh0UGx1Z2luCi0JCQkuZ2V0U2hhcmVkSW1hZ2UoRElTQUJMRURfSU1HX1BBVEhfQUREX1VOT1JERVJFRF9MSVNUKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgRElTQUJMRURfSU1HX0JPTEQgPSByaWNoVGV4dFBsdWdpbgotCQkJLmdldFNoYXJlZEltYWdlKERJU0FCTEVEX0lNR19QQVRIX0JPTEQpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBESVNBQkxFRF9JTUdfQ0xFQVJfQ09OVEVOVCA9IHJpY2hUZXh0UGx1Z2luCi0JCQkuZ2V0U2hhcmVkSW1hZ2UoRElTQUJMRURfSU1HX1BBVEhfQ0xFQVJfQ09OVEVOVCk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIERJU0FCTEVEX0lNR19DT1BZID0gcmljaFRleHRQbHVnaW4KLQkJCS5nZXRTaGFyZWRJbWFnZShESVNBQkxFRF9JTUdfUEFUSF9DT1BZKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgRElTQUJMRURfSU1HX0NVVCA9IHJpY2hUZXh0UGx1Z2luCi0JCQkuZ2V0U2hhcmVkSW1hZ2UoRElTQUJMRURfSU1HX1BBVEhfQ1VUKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgRElTQUJMRURfSU1HX0ZJTkRfUkVQTEFDRSA9IHJpY2hUZXh0UGx1Z2luCi0JCQkuZ2V0U2hhcmVkSW1hZ2UoRElTQUJMRURfSU1HX1BBVEhfRklORF9SRVBMQUNFKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgRElTQUJMRURfSU1HX0lOREVOVCA9IHJpY2hUZXh0UGx1Z2luCi0JCQkuZ2V0U2hhcmVkSW1hZ2UoRElTQUJMRURfSU1HX1BBVEhfSU5ERU5UKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgRElTQUJMRURfSU1HX0lUQUxJQyA9IHJpY2hUZXh0UGx1Z2luCi0JCQkuZ2V0U2hhcmVkSW1hZ2UoRElTQUJMRURfSU1HX1BBVEhfSVRBTElDKTsKLQotLy8JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBESVNBQkxFRF9JTUdfSlVTVElGWV9DRU5URVIgPSByaWNoVGV4dFBsdWdpbgotLy8JCQkuZ2V0U2hhcmVkSW1hZ2UoRElTQUJMRURfSU1HX1BBVEhfSlVTVElGWV9DRU5URVIpOwotLy8KLS8vCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgRElTQUJMRURfSU1HX0pVU1RJRllfRlVMTCA9IHJpY2hUZXh0UGx1Z2luCi0vLwkJCS5nZXRTaGFyZWRJbWFnZShESVNBQkxFRF9JTUdfUEFUSF9KVVNUSUZZX0ZVTEwpOwotLy8KLS8vCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgRElTQUJMRURfSU1HX0pVU1RJRllfTEVGVCA9IHJpY2hUZXh0UGx1Z2luCi0vLwkJCS5nZXRTaGFyZWRJbWFnZShESVNBQkxFRF9JTUdfUEFUSF9KVVNUSUZZX0xFRlQpOwotLy8KLS8vCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgRElTQUJMRURfSU1HX0pVU1RJRllfUklHSFQgPSByaWNoVGV4dFBsdWdpbgotLy8JCQkuZ2V0U2hhcmVkSW1hZ2UoRElTQUJMRURfSU1HX1BBVEhfSlVTVElGWV9SSUdIVCk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIERJU0FCTEVEX0lNR19PVVRERU5UID0gcmljaFRleHRQbHVnaW4KLQkJCS5nZXRTaGFyZWRJbWFnZShESVNBQkxFRF9JTUdfUEFUSF9PVVRERU5UKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgRElTQUJMRURfSU1HX1BBU1RFID0gcmljaFRleHRQbHVnaW4KLQkJCS5nZXRTaGFyZWRJbWFnZShESVNBQkxFRF9JTUdfUEFUSF9QQVNURSk7Ci0KLS8vCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgRElTQUJMRURfSU1HX1NUUklLRV9USFJPVUdIID0gcmljaFRleHRQbHVnaW4KLS8vCQkJLmdldFNoYXJlZEltYWdlKERJU0FCTEVEX0lNR19QQVRIX1NUUklLRV9USFJPVUdIKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgRElTQUJMRURfSU1HX1NVQlNDUklQVCA9IHJpY2hUZXh0UGx1Z2luCi0JCQkuZ2V0U2hhcmVkSW1hZ2UoRElTQUJMRURfSU1HX1BBVEhfU1VCU0NSSVBUKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgRElTQUJMRURfSU1HX1NVUEVSU0NSSVBUID0gcmljaFRleHRQbHVnaW4KLQkJCS5nZXRTaGFyZWRJbWFnZShESVNBQkxFRF9JTUdfUEFUSF9TVVBFUlNDUklQVCk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIERJU0FCTEVEX0lNR19VTkRFUkxJTkUgPSByaWNoVGV4dFBsdWdpbgotCQkJLmdldFNoYXJlZEltYWdlKERJU0FCTEVEX0lNR19QQVRIX1VOREVSTElORSk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBESVNBQkxFRF9JTUdfREVTQ19BRERfSU1BR0UgPSByaWNoVGV4dFBsdWdpbgotCQkJLmdldEltYWdlRGVzY3JpcHRvcihESVNBQkxFRF9JTUdfUEFUSF9BRERfSU1BR0UpOwotCi0vLwlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBESVNBQkxFRF9JTUdfREVTQ19BRERfTElORSA9IHJpY2hUZXh0UGx1Z2luCi0vLwkJCS5nZXRJbWFnZURlc2NyaXB0b3IoRElTQUJMRURfSU1HX1BBVEhfQUREX0xJTkUpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgRElTQUJMRURfSU1HX0RFU0NfQUREX0xJTksgPSByaWNoVGV4dFBsdWdpbgotCQkJLmdldEltYWdlRGVzY3JpcHRvcihESVNBQkxFRF9JTUdfUEFUSF9BRERfTElOSyk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBESVNBQkxFRF9JTUdfREVTQ19BRERfT1JERVJFRF9MSVNUID0gcmljaFRleHRQbHVnaW4KLQkJCS5nZXRJbWFnZURlc2NyaXB0b3IoRElTQUJMRURfSU1HX1BBVEhfQUREX09SREVSRURfTElTVCk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBESVNBQkxFRF9JTUdfREVTQ19BRERfVEFCTEUgPSByaWNoVGV4dFBsdWdpbgotCQkJLmdldEltYWdlRGVzY3JpcHRvcihESVNBQkxFRF9JTUdfUEFUSF9BRERfVEFCTEUpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgRElTQUJMRURfSU1HX0RFU0NfQUREX1VOT1JERVJFRF9MSVNUID0gcmljaFRleHRQbHVnaW4KLQkJCS5nZXRJbWFnZURlc2NyaXB0b3IoRElTQUJMRURfSU1HX1BBVEhfQUREX1VOT1JERVJFRF9MSVNUKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIERJU0FCTEVEX0lNR19ERVNDX0JPTEQgPSByaWNoVGV4dFBsdWdpbgotCQkJLmdldEltYWdlRGVzY3JpcHRvcihESVNBQkxFRF9JTUdfUEFUSF9CT0xEKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIERJU0FCTEVEX0lNR19ERVNDX0NMRUFSX0NPTlRFTlQgPSByaWNoVGV4dFBsdWdpbgotCQkJLmdldEltYWdlRGVzY3JpcHRvcihESVNBQkxFRF9JTUdfUEFUSF9DTEVBUl9DT05URU5UKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIERJU0FCTEVEX0lNR19ERVNDX0NPUFkgPSByaWNoVGV4dFBsdWdpbgotCQkJLmdldEltYWdlRGVzY3JpcHRvcihESVNBQkxFRF9JTUdfUEFUSF9DT1BZKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIERJU0FCTEVEX0lNR19ERVNDX0NVVCA9IHJpY2hUZXh0UGx1Z2luCi0JCQkuZ2V0SW1hZ2VEZXNjcmlwdG9yKERJU0FCTEVEX0lNR19QQVRIX0NVVCk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBESVNBQkxFRF9JTUdfREVTQ19GSU5EX1JFUExBQ0UgPSByaWNoVGV4dFBsdWdpbgotCQkJLmdldEltYWdlRGVzY3JpcHRvcihESVNBQkxFRF9JTUdfUEFUSF9GSU5EX1JFUExBQ0UpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgRElTQUJMRURfSU1HX0RFU0NfSU5ERU5UID0gcmljaFRleHRQbHVnaW4KLQkJCS5nZXRJbWFnZURlc2NyaXB0b3IoRElTQUJMRURfSU1HX1BBVEhfSU5ERU5UKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIERJU0FCTEVEX0lNR19ERVNDX0lUQUxJQyA9IHJpY2hUZXh0UGx1Z2luCi0JCQkuZ2V0SW1hZ2VEZXNjcmlwdG9yKERJU0FCTEVEX0lNR19QQVRIX0lUQUxJQyk7Ci0KLS8vCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIERJU0FCTEVEX0lNR19ERVNDX0pVU1RJRllfQ0VOVEVSID0gcmljaFRleHRQbHVnaW4KLS8vCQkJLmdldEltYWdlRGVzY3JpcHRvcihESVNBQkxFRF9JTUdfUEFUSF9KVVNUSUZZX0NFTlRFUik7Ci0vLwotLy8JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgRElTQUJMRURfSU1HX0RFU0NfSlVTVElGWV9GVUxMID0gcmljaFRleHRQbHVnaW4KLS8vCQkJLmdldEltYWdlRGVzY3JpcHRvcihESVNBQkxFRF9JTUdfUEFUSF9KVVNUSUZZX0ZVTEwpOwotLy8KLS8vCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIERJU0FCTEVEX0lNR19ERVNDX0pVU1RJRllfTEVGVCA9IHJpY2hUZXh0UGx1Z2luCi0vLwkJCS5nZXRJbWFnZURlc2NyaXB0b3IoRElTQUJMRURfSU1HX1BBVEhfSlVTVElGWV9MRUZUKTsKLS8vCi0vLwlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBESVNBQkxFRF9JTUdfREVTQ19KVVNUSUZZX1JJR0hUID0gcmljaFRleHRQbHVnaW4KLS8vCQkJLmdldEltYWdlRGVzY3JpcHRvcihESVNBQkxFRF9JTUdfUEFUSF9KVVNUSUZZX1JJR0hUKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIERJU0FCTEVEX0lNR19ERVNDX09VVERFTlQgPSByaWNoVGV4dFBsdWdpbgotCQkJLmdldEltYWdlRGVzY3JpcHRvcihESVNBQkxFRF9JTUdfUEFUSF9PVVRERU5UKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIERJU0FCTEVEX0lNR19ERVNDX1BBU1RFID0gcmljaFRleHRQbHVnaW4KLQkJCS5nZXRJbWFnZURlc2NyaXB0b3IoRElTQUJMRURfSU1HX1BBVEhfUEFTVEUpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgRElTQUJMRURfSU1HX0RFU0NfUEFTVEVfUExBSU5fVEVYVCA9IHJpY2hUZXh0UGx1Z2luCi0JCQkuZ2V0SW1hZ2VEZXNjcmlwdG9yKERJU0FCTEVEX0lNR19QQVRIX1BBU1RFX1BMQUlOX1RFWFQpOwotCi0vLwlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBESVNBQkxFRF9JTUdfREVTQ19TVFJJS0VfVEhST1VHSCA9IHJpY2hUZXh0UGx1Z2luCi0vLwkJCS5nZXRJbWFnZURlc2NyaXB0b3IoRElTQUJMRURfSU1HX1BBVEhfU1RSSUtFX1RIUk9VR0gpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgRElTQUJMRURfSU1HX0RFU0NfU1VCU0NSSVBUID0gcmljaFRleHRQbHVnaW4KLQkJCS5nZXRJbWFnZURlc2NyaXB0b3IoRElTQUJMRURfSU1HX1BBVEhfU1VCU0NSSVBUKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIERJU0FCTEVEX0lNR19ERVNDX1NVUEVSU0NSSVBUID0gcmljaFRleHRQbHVnaW4KLQkJCS5nZXRJbWFnZURlc2NyaXB0b3IoRElTQUJMRURfSU1HX1BBVEhfU1VQRVJTQ1JJUFQpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgRElTQUJMRURfSU1HX0RFU0NfVU5ERVJMSU5FID0gcmljaFRleHRQbHVnaW4KLQkJCS5nZXRJbWFnZURlc2NyaXB0b3IoRElTQUJMRURfSU1HX1BBVEhfVU5ERVJMSU5FKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIERJU0FCTEVEX0lNR19ERVNDX1RJRFkgPSByaWNoVGV4dFBsdWdpbgotCQkJLmdldEltYWdlRGVzY3JpcHRvcihESVNBQkxFRF9JTUdfUEFUSF9USURZKTsKLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvUmljaFRleHRMaXN0ZW5lci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvUmljaFRleHRMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZjIyMDQ2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L1JpY2hUZXh0TGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotCi0vKioKLSAqIExpc3RlbnMgdG8gYSByaWNoIHRleHQgZWRpdGluZyBldmVudC4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBSaWNoVGV4dExpc3RlbmVyIHsKLQotCXByaXZhdGUgaW50IGV2ZW50VHlwZTsKLQotCXByaXZhdGUgTGlzdGVuZXIgbGlzdGVuZXI7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqIAotCSAqIEBwYXJhbSBldmVudFR5cGUKLQkgKiAgICAgICAgICAgIHRoZSBldmVudCB0eXBlCi0JICogQHBhcmFtIGxpc3RlbmVyCi0JICogICAgICAgICAgICB0aGUgZXZlbnQgbGlzdGVuZXIKLQkgKi8KLQlwdWJsaWMgUmljaFRleHRMaXN0ZW5lcihpbnQgZXZlbnRUeXBlLCBMaXN0ZW5lciBsaXN0ZW5lcikgewotCQl0aGlzLmV2ZW50VHlwZSA9IGV2ZW50VHlwZTsKLQkJdGhpcy5saXN0ZW5lciA9IGxpc3RlbmVyOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGV2ZW50IHR5cGUuCi0JICogCi0JICogQHJldHVybiB0aGUgZXZlbnQgdHlwZQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0RXZlbnRUeXBlKCkgewotCQlyZXR1cm4gZXZlbnRUeXBlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGV2ZW50IGxpc3RlbmVyLgotCSAqLwotCXB1YmxpYyBMaXN0ZW5lciBnZXRMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIGxpc3RlbmVyOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvUmljaFRleHRQbHVnaW4uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L1JpY2hUZXh0UGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2YTNjYWQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvUmljaFRleHRQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dDsKLQotaW1wb3J0IGphdmEudXRpbC5EYXRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS5BYnN0cmFjdFBsdWdpbjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotLyoqCi0gKiBUaGUgUmljaCBUZXh0IHBsdWctaW4gY2xhc3MuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUmljaFRleHRQbHVnaW4gZXh0ZW5kcyBBYnN0cmFjdFBsdWdpbiB7Ci0KLQkvLyBUaGUgc2hhcmVkIHBsdWctaW4gaW5zdGFuY2UuCi0JcHJpdmF0ZSBzdGF0aWMgUmljaFRleHRQbHVnaW4gcGx1Z2luOwotCi0JLy8gVGhlIGRhdGUgYW5kIHRpbWUgd2hlbiB0aGlzIHBsdWctaW4gd2FzIHN0YXJ0ZWQuCi0JcHJpdmF0ZSBEYXRlIHN0YXJ0VGltZTsKLQotCS8qKgotCSAqIERlZmF1bHQgY29uc3RydWN0b3IuCi0JICovCi0JcHVibGljIFJpY2hUZXh0UGx1Z2luKCkgewotCQlzdXBlcigpOwotCQlwbHVnaW4gPSB0aGlzOwotCX0KLQotCS8qKgotCSAqIEBzZWUgQWJzdHJhY3RQbHVnaW4jc3RhcnQoQnVuZGxlQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdGFydChjb250ZXh0KTsKLQkJc3RhcnRUaW1lID0gbmV3IERhdGUoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIEFic3RyYWN0UGx1Z2luI3N0b3AoQnVuZGxlQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0b3AoY29udGV4dCk7Ci0JCXBsdWdpbiA9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2hhcmVkIHBsdWctaW4gaW5zdGFuY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBSaWNoVGV4dFBsdWdpbiBnZXREZWZhdWx0KCkgewotCQlyZXR1cm4gcGx1Z2luOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGRhdGUgYW5kIHRpbWUgd2hlbiB0aGlzIHBsdWctaW4gd2FzIHN0YXJ0ZWQuCi0JICovCi0JcHVibGljIERhdGUgZ2V0U3RhcnRUaW1lKCkgewotCQlyZXR1cm4gc3RhcnRUaW1lOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvUmljaFRleHRSZXNvdXJjZXMuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L1JpY2hUZXh0UmVzb3VyY2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlZjNlNTAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvUmljaFRleHRSZXNvdXJjZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi0vKioKLSAqIFRoZSBSaWNoVGV4dCByZXNvdXJjZXMuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQGF1dGhvciBKZWZmIEhhcmR5Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBSaWNoVGV4dFJlc291cmNlcyBleHRlbmRzIE5MUyB7Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgQlVORExFX05BTUUgPSBSaWNoVGV4dFJlc291cmNlcy5jbGFzcwotCQkuZ2V0UGFja2FnZSgpLmdldE5hbWUoKSArICIuUmVzb3VyY2VzIjsgLy8kTk9OLU5MUy0xJAkKLQotCXByaXZhdGUgUmljaFRleHRSZXNvdXJjZXMoKSB7Ci0JCS8vIERvIG5vdCBpbnN0YW50aWF0ZS4KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBmb250TmFtZUFjdGlvbl9DU1NfRGVmYXVsdDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBmb250TmFtZUFjdGlvbl9DU1NfRGVmYXVsdF9Nb3ppbGxhOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGZvbnROYW1lQWN0aW9uX0RlZmF1bHRGb250TmFtZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBmb250U3R5bGVfbm9ybWFsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGZvbnRTdHlsZV9zZWN0aW9uSGVhZGluZzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBmb250U3R5bGVfc3Vic2VjdGlvbkhlYWRpbmc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZm9udFN0eWxlX3N1YlN1YnNlY3Rpb25IZWFkaW5nOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGZvbnRTdHlsZV9xdW90ZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBmb250U3R5bGVfY29kZVNhbXBsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBibG9ja1RhZ19wYXJhZ3JhcGg7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgYmxvY2tUYWdfaGVhZGluZzE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgYmxvY2tUYWdfaGVhZGluZzI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgYmxvY2tUYWdfaGVhZGluZzM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgYmxvY2tUYWdfaGVhZGluZzQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgYmxvY2tUYWdfaGVhZGluZzU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgYmxvY2tUYWdfaGVhZGluZzY7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgYmxvY2tUYWdfYWRkcmVzczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBibG9ja1RhZ19wcmVmb3JtYXR0ZWRUZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGZvbnROYW1lX2RlZmF1bHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZm9udE5hbWVfYXJpYWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZm9udE5hbWVfY291cmllck5ldzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBmb250TmFtZV90aW1lc05ld1JvbWFuOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGZvbnROYW1lX3ZlcmRhbmE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgYWRkSG9yaXpvbnRhbEJhckFjdGlvbl90b29sVGlwVGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhZGRJbWFnZUFjdGlvbl90b29sVGlwVGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhZGRMaW5lQWN0aW9uX3Rvb2xUaXBUZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGFkZExpbmtBY3Rpb25fdG9vbFRpcFRleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgYWRkT3JkZXJlZExpc3RBY3Rpb25fdG9vbFRpcFRleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgYWRkVGFibGVBY3Rpb25fdG9vbFRpcFRleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgYWRkVW5vcmRlcmVkTGlzdEFjdGlvbl90b29sVGlwVGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBib2xkQWN0aW9uX3Rvb2xUaXBUZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNsZWFyQ29udGVudEFjdGlvbl90b29sVGlwVGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb3B5QWN0aW9uX3Rvb2xUaXBUZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGN1dEFjdGlvbl90b29sVGlwVGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBmaW5kUmVwbGFjZUFjdGlvbl90b29sVGlwVGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBpbmRlbnRBY3Rpb25fdG9vbFRpcFRleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgaXRhbGljQWN0aW9uX3Rvb2xUaXBUZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGp1c3RpZnlDZW50ZXJBY3Rpb25fdG9vbFRpcFRleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcganVzdGlmeUZ1bGxBY3Rpb25fdG9vbFRpcFRleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcganVzdGlmeUxlZnRBY3Rpb25fdG9vbFRpcFRleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcganVzdGlmeVJpZ2h0QWN0aW9uX3Rvb2xUaXBUZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG91dGRlbnRBY3Rpb25fdG9vbFRpcFRleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgcGFzdGVBY3Rpb25fdG9vbFRpcFRleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgcGFzdGVQbGFpblRleHRBY3Rpb25fdG9vbFRpcFRleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgc3Vic2NyaXB0QWN0aW9uX3Rvb2xUaXBUZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHN1cGVyc2NyaXB0QWN0aW9uX3Rvb2xUaXBUZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHVuZGVybGluZUFjdGlvbl90b29sVGlwVGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBmb250U3R5bGVBY3Rpb25fdG9vbFRpcFRleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgYmxvY2tUYWdBY3Rpb25fdG9vbFRpcFRleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZm9udE5hbWVBY3Rpb25fdG9vbFRpcFRleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZm9udFNpemVBY3Rpb25fdG9vbFRpcFRleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgY3V0QWN0aW9uX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29weUFjdGlvbl90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHBhc3RlQWN0aW9uX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgcGFzdGVQbGFpblRleHRBY3Rpb25fdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyByaWNoVGV4dFRhYl90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJpY2hUZXh0VGFiX3Rvb2xUaXBUZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGh0bWxUYWJfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBodG1sVGFiX3Rvb2xUaXBUZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGFkZEltYWdlRGlhbG9nX3RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGFkZExpbmtEaWFsb2dfdGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgYWRkVGFibGVEaWFsb2dfdGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZmluZFJlcGxhY2VEaWFsb2dfdGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgdXJsRGlzcGxheU5hbWVMYWJlbF90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHVybExhYmVsX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgc3VtbWFyeUxhYmVsX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2FwdGlvbkxhYmVsX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgcm93c0xhYmVsX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29sdW1uc0xhYmVsX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgd2lkdGhMYWJlbF90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRhYmxlU3R5bGVMYWJlbF90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRhYmxlSGVhZGVyTm9uZV90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRhYmxlSGVhZGVyQ29sc190ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRhYmxlSGVhZGVyUm93c190ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRhYmxlSGVhZGVyQm90aF90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGJyb3dzZUJ1dHRvbl90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNsZWFyQ29udGVudERpYWxvZ190aXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjbGVhckNvbnRlbnREaWFsb2dfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBmaW5kTGFiZWxfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZXBsYWNlTGFiZWxfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBvcHRpb25zR3JvdXBfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjYXNlU2Vuc2l0aXZlQ2hlY2tib3hfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3aG9sZVdvcmRDaGVja2JveF90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRpcmVjdGlvbkdyb3VwX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZm9yd2FyZFJhZGlvQnV0dG9uX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgYmFja3dhcmRSYWRpb0J1dHRvbl90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGZpbmRCdXR0b25fdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZXBsYWNlQnV0dG9uX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVwbGFjZUZpbmRCdXR0b25fdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZXBsYWNlYWxsQnV0dG9uX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRmluZFJlcGxhY2VfU3RhdHVzX25vTWF0Y2hfbGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgbWF4Q2hhcnNQZXJMaW5lTGFiZWxfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBpbmRlbnRIVE1MQ2hlY2tib3hfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBpbmRlbnRTaXplTGFiZWxfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0aWR5X2NsZWFuX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgdGlkeV9jbGVhbmVyX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgdGlkeV9jbGVhbmVzdF90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRpZHlfY2xlYW5fdG9vbFRpcFRleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgdGlkeV9jbGVhbmVyX3Rvb2xUaXBUZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRpZHlfY2xlYW5lc3RfdG9vbFRpcFRleHQ7Ci0KLQlzdGF0aWMgewotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBSaWNoVGV4dFJlc291cmNlcy5jbGFzcyk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L1JpY2hUZXh0U2VsZWN0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9SaWNoVGV4dFNlbGVjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NGI3ZjRjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L1JpY2hUZXh0U2VsZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0OwotCi0vKioKLSAqIE1vZGVscyBhIHRleHQgc2VsZWN0aW9uIGluIGEgcmljaCB0ZXh0IGNvbnRyb2wgYW5kIGVkaXRvci4KLSAqIAotICogQGF1dGhvciBKZWZmIEhhcmR5Ci0gKiBAc2luY2UgMS4yCi0gKi8KLXB1YmxpYyBjbGFzcyBSaWNoVGV4dFNlbGVjdGlvbiB7Ci0KLQkvLyBUaGUgY29udHJvbCdzIHRleHQgc2VsZWN0aW9uLgotCXByb3RlY3RlZCBTdHJpbmcgdGV4dCA9ICIiOyAvLyROT04tTkxTLTEkCi0KLQkvLyBUaGUgY29udHJvbCdzIHRleHQgc2VsZWN0aW9uIG9mZnNldAotCXByb3RlY3RlZCBpbnQgb2Zmc2V0U3RhcnQgPSAwOwotCi0JLy8gVGhlIGNvbnRyb2wncyB0ZXh0IHNlbGVjdGlvbiBmb250Ci0JcHJvdGVjdGVkIFN0cmluZyBmb250TmFtZSA9ICIiOyAvLyROT04tTkxTLTEkCi0KLQkvLyBUaGUgY29udHJvbCdzIHRleHQgc2VsZWN0aW9uIGZvbnQgc2l6ZQotCS8vIGNvdWxkIGJlIGluIHBvaW50IHNpemUgKDEycHQpLCBvciBIVE1MIHNpemUgKDEtNykKLQlwcm90ZWN0ZWQgU3RyaW5nIGZvbnRTaXplID0gIiI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIFRoZSBjb250cm9sJ3MgdGV4dCBjdXJyZW50IHN0eWxlCi0JcHJvdGVjdGVkIFN0cmluZyBibG9ja1N0eWxlID0gIiI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIFRoZSBjb250cm9sJ3MgdGV4dCBjdXJyZW50IGZsYWdzCi0JcHJvdGVjdGVkIGludCBmbGFncyA9IDA7Ci0KLQkvLyBUZXh0IHN0YXR1cyBmbGFncwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJPTEQgPSAxOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSVRBTElDID0gQk9MRCA8PCAxOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVU5ERVJMSU5FID0gSVRBTElDIDw8IDE7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVUJTQ1JJUFQgPSBVTkRFUkxJTkUgPDwgMTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNVUEVSU0NSSVBUID0gU1VCU0NSSVBUIDw8IDE7Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEJsb2NrU3R5bGUoKSB7Ci0JCXJldHVybiBibG9ja1N0eWxlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEJsb2NrU3R5bGUoU3RyaW5nIGJsb2NrU3R5bGUpIHsKLQkJdGhpcy5ibG9ja1N0eWxlID0gYmxvY2tTdHlsZTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldEZsYWdzKCkgewotCQlyZXR1cm4gZmxhZ3M7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RmxhZ3MoaW50IGZsYWdzKSB7Ci0JCXRoaXMuZmxhZ3MgPSBmbGFnczsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEZvbnROYW1lKCkgewotCQlyZXR1cm4gZm9udE5hbWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Rm9udE5hbWUoU3RyaW5nIGZvbnROYW1lKSB7Ci0JCXRoaXMuZm9udE5hbWUgPSBmb250TmFtZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEZvbnRTaXplKCkgewotCQlyZXR1cm4gZm9udFNpemU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Rm9udFNpemUoU3RyaW5nIGZvbnRTaXplKSB7Ci0JCXRoaXMuZm9udFNpemUgPSBmb250U2l6ZTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldE9mZnNldFN0YXJ0KCkgewotCQlyZXR1cm4gb2Zmc2V0U3RhcnQ7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0T2Zmc2V0U3RhcnQoaW50IG9mZnNldFN0YXJ0KSB7Ci0JCXRoaXMub2Zmc2V0U3RhcnQgPSBvZmZzZXRTdGFydDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7Ci0JCXJldHVybiB0ZXh0OwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFRleHQoU3RyaW5nIHRleHQpIHsKLQkJdGhpcy50ZXh0ID0gdGV4dDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0JvbGQoKSB7Ci0JCXJldHVybiAoZmxhZ3MgJiBCT0xEKSAhPSAwOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzSXRhbGljKCkgewotCQlyZXR1cm4gKGZsYWdzICYgSVRBTElDKSAhPSAwOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzVW5kZXJMaW5lKCkgewotCQlyZXR1cm4gKGZsYWdzICYgVU5ERVJMSU5FKSAhPSAwOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzU3Vic2NyaXB0KCkgewotCQlyZXR1cm4gKGZsYWdzICYgU1VCU0NSSVBUKSAhPSAwOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzU3VwZXJzY3JpcHQoKSB7Ci0JCXJldHVybiAoZmxhZ3MgJiBTVVBFUlNDUklQVCkgIT0gMDsKLQl9Ci0KLQkvKioKLQkgKiBDbGVhcnMgdGhlIHNlbGVjdGlvbiBpbmZvCi0JICovCi0JcHVibGljIHZvaWQgY2xlYXIoKSB7Ci0JCXRleHQgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQlvZmZzZXRTdGFydCA9IDA7Ci0JCWZvbnROYW1lID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJZm9udFNpemUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQlibG9ja1N0eWxlID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJZmxhZ3MgPSAwOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCVN0cmluZyBzdHIgPSAiVGV4dDogIiArIHRleHQgKyAiXG4iOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJc3RyICs9ICJmb250TmFtZTogIiArIGZvbnROYW1lICsgIlxuIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCXN0ciArPSAiZm9udFNpemU6ICIgKyBmb250U2l6ZSArICJcbiI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlzdHIgKz0gImJsb2NrU3R5bGU6ICIgKyBibG9ja1N0eWxlICsgIlxuIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCXN0ciArPSAiZmxhZ3M6ICIgKyBmbGFncyArICJcbiI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlyZXR1cm4gc3RyOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvUmljaFRleHRUb29sQmFyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9SaWNoVGV4dFRvb2xCYXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWExNjJkMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9SaWNoVGV4dFRvb2xCYXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5hY3Rpb25zLklSaWNoVGV4dEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuYWN0aW9ucy5SaWNoVGV4dEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuYWN0aW9ucy5SaWNoVGV4dENvbWJvQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb25Db250cmlidXRpb25JdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5TZXBhcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLlRvb2xCYXJNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRvb2xJdGVtOwotCi0vKioKLSAqIFRoZSBkZWZhdWx0IHJpY2ggdGV4dCB0b29sIGJhciBpbXBsZW1lbnRhdGlvbi4KLSAqIAotICogU3BsaXQgaW50byAyIHRvb2xiYXJzIChvbmUgZm9yIENDb21ib3MsIG9uZSBmb3IgYnV0dG9ucykgZm9yIHRhYmJpbmcgcHVycG9zZXMuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQGF1dGhvciBKZWZmIEhhcmR5Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBSaWNoVGV4dFRvb2xCYXIgaW1wbGVtZW50cyBJUmljaFRleHRUb29sQmFyIHsKLQotCS8vIFRoZSBwYXJlbnQgcmljaCB0ZXh0IGNvbnRyb2wuCi0JcHJpdmF0ZSBJUmljaFRleHQgcmljaFRleHQ7Ci0KLQkvLyBJZiB0cnVlLCBhZGQgYSBuZXcgdG9vbCBiYXIuCi0JcHJpdmF0ZSBib29sZWFuIGFkZFRvb2xCYXIgPSB0cnVlOwotCi0JLy8gVGhlIGN1cnJlbnQgdG9vbCBiYXIgbWFuYWdlciB1c2VkIHRvIHBvcHVsYXRlIHRoZSB0b29sIGFjdGlvbnMuCi0JcHJpdmF0ZSBUb29sQmFyTWFuYWdlciB0b29sYmFyTWdyOwotCQotCS8vIFRoZSBjdXJyZW50IHRvb2wgYmFyIG1hbmFnZXIgdXNlZCB0byBwb3B1bGF0ZSB0aGUgdG9vbCBhY3Rpb25zLgotCXByaXZhdGUgVG9vbEJhck1hbmFnZXIgdG9vbGJhck1nckNvbWJvOwotCi0JLy8gVGhlIGFjdGlvbiBpdGVtcyBpbiB0aGUgdG9vbCBiYXIocykuCi0JcHJpdmF0ZSBMaXN0PE9iamVjdD4gYWN0aW9uSXRlbXMgPSBuZXcgQXJyYXlMaXN0PE9iamVjdD4oKTsKLQotCXByaXZhdGUgc3RhdGljIGludCBsYXN0V2lkdGggPSAtMTsKLQkKLQlwcm90ZWN0ZWQgQ29tcG9zaXRlIHBhcmVudDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBjb21wb3NpdGUKLQkgKiBAcGFyYW0gc3R5bGUKLQkgKiAgICAgICAgICAgIHRoZSB0b29sIGJhciBzdHlsZQotCSAqIEBwYXJhbSByaWNoVGV4dAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCByaWNoIHRleHQgY29udHJvbAotCSAqLwotCXB1YmxpYyBSaWNoVGV4dFRvb2xCYXIoQ29tcG9zaXRlIHBhcmVudCwgaW50IHN0eWxlLCBJUmljaFRleHQgcmljaFRleHQpIHsKLQkJdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0JCXRoaXMucmljaFRleHQgPSByaWNoVGV4dDsKLQotCQlhZGRUb29sQmFyKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkQWN0aW9uKGZpbmFsIElBY3Rpb24gYWN0aW9uKSB7Ci0JCWlmIChhY3Rpb24gIT0gbnVsbCkgewotCQkJQWN0aW9uQ29udHJpYnV0aW9uSXRlbSBpdGVtID0gbmV3IEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0oYWN0aW9uKTsKLQkJCXRvb2xiYXJNZ3IuYWRkKGl0ZW0pOwotCQkJdG9vbGJhck1nci51cGRhdGUodHJ1ZSk7Ci0JCQlhY3Rpb25JdGVtcy5hZGQoaXRlbSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBZGRzIGEgY29tYm8gYWN0aW9uIHRvIHRoZSB0b29sIGJhci4KLQkgKiAKLQkgKiBAcGFyYW0gYWN0aW9uCi0JICogICAgICAgICAgICB0aGUgYWN0aW9uIHRvIGFkZAotCSAqLwotCXB1YmxpYyB2b2lkIGFkZEFjdGlvbihmaW5hbCBSaWNoVGV4dENvbWJvQWN0aW9uIGl0ZW0pIHsKLQkJaWYgKGl0ZW0gIT0gbnVsbCkgewotCQkJaXRlbS5pbml0KCk7Ci0JCQl0b29sYmFyTWdyQ29tYm8uYWRkKGl0ZW0pOyAgICAgICAgICAgIAotCQkJdG9vbGJhck1nckNvbWJvLnVwZGF0ZSh0cnVlKTsKLQkJCWFjdGlvbkl0ZW1zLmFkZChpdGVtKTsgICAgICAgICAgIAotCQl9Ci0JfQotCi0JLyoqCi0JICogQWRkcyBhIHNlcGFyYXRvciB0byB0aGUgdG9vbCBiYXIuCi0JICovCi0JcHVibGljIHZvaWQgYWRkU2VwYXJhdG9yKCkgewotCQl0b29sYmFyTWdyLmFkZChuZXcgU2VwYXJhdG9yKCkpOwotCX0KLQotCS8qKgotCSAqIFVwZGF0ZXMgdGhlIHRvb2xiYXIgc3RhdGUuCi0JICogPHA+Ci0JICogRW5hYmxlcy9kaXNhYmxlcyBhY3Rpb25zIGRlcGVuZGluZyBvbiB0aGUgY3VycmVudGx5IHNlbGVjdGVkCi0JICogUmljaFRleHRFZGl0b3IgdGFiIChSaWNoVGV4dCB2cy4gSFRNTCkKLQkgKiAKLQkgKiBAcGFyYW0gZWRpdGFibGUKLQkgKiAgICAgICAgICAgIHNwZWNpZmllcyB3aGV0aGVyIHRvIGVuYWJsZSBub24tUmVhZE9ubHkgY29tbWFuZHMKLQkgKi8KLQlwdWJsaWMgdm9pZCB1cGRhdGVUb29sQmFyKGJvb2xlYW4gZWRpdGFibGUpIHsKLQkJYm9vbGVhbiByaWNoVGV4dE1vZGUgPSB0cnVlOwotCQlpZiAocmljaFRleHQgaW5zdGFuY2VvZiBSaWNoVGV4dEVkaXRvcgotCQkJCSYmICgoUmljaFRleHRFZGl0b3IpIHJpY2hUZXh0KS5pc0hUTUxUYWJTZWxlY3RlZCgpKSB7Ci0JCQlyaWNoVGV4dE1vZGUgPSBmYWxzZTsKLQkJfQotCQlmb3IgKEl0ZXJhdG9yIGkgPSBhY3Rpb25JdGVtcy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBpdGVtID0gaS5uZXh0KCk7Ci0JCQlpZiAoaXRlbSBpbnN0YW5jZW9mIFRvb2xJdGVtKSB7Ci0JCQkJYm9vbGVhbiBlbmFibGVkVG9vbEl0ZW0gPSB0cnVlOwotCQkJCVRvb2xJdGVtIHRvb2xJdGVtID0gKFRvb2xJdGVtKSBpdGVtOwotCQkJCUlSaWNoVGV4dEFjdGlvbiBhY3Rpb24gPSAoSVJpY2hUZXh0QWN0aW9uKSB0b29sSXRlbS5nZXREYXRhKCk7Ci0JCQkJaWYgKGFjdGlvbiAhPSBudWxsICYmICFlZGl0YWJsZQotCQkJCQkJJiYgYWN0aW9uLmRpc2FibGVJblJlYWRPbmx5TW9kZSgpKSB7Ci0JCQkJCWVuYWJsZWRUb29sSXRlbSA9IGZhbHNlOwotCQkJCX0KLQkJCQlpZiAoYWN0aW9uICE9IG51bGwgJiYgIXJpY2hUZXh0TW9kZQotCQkJCQkJJiYgYWN0aW9uLmRpc2FibGVJblNvdXJjZU1vZGUoKSkgewotCQkJCQllbmFibGVkVG9vbEl0ZW0gPSBmYWxzZTsKLQkJCQl9Ci0JCQkJdG9vbEl0ZW0uc2V0RW5hYmxlZChlbmFibGVkVG9vbEl0ZW0pOwotCQkJfSBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgQ29tYm8pIHsKLQkJCQlpZiAocmljaFRleHRNb2RlICYmIGVkaXRhYmxlKSB7Ci0JCQkJCSgoQ29tYm8pIGl0ZW0pLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJKChDb21ibykgaXRlbSkuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJfQotCQkJfSBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgQWN0aW9uQ29udHJpYnV0aW9uSXRlbSkgewotCQkJCWJvb2xlYW4gZW5hYmxlZFRvb2xJdGVtID0gdHJ1ZTsKLQkJCQlSaWNoVGV4dEFjdGlvbiBhY3Rpb24gPSAoUmljaFRleHRBY3Rpb24pICgoQWN0aW9uQ29udHJpYnV0aW9uSXRlbSkgaXRlbSkKLQkJCQkJCS5nZXRBY3Rpb24oKTsKLQkJCQlpZiAoYWN0aW9uICE9IG51bGwgJiYgIWVkaXRhYmxlCi0JCQkJCQkmJiBhY3Rpb24uZGlzYWJsZUluUmVhZE9ubHlNb2RlKCkpIHsKLQkJCQkJZW5hYmxlZFRvb2xJdGVtID0gZmFsc2U7Ci0JCQkJfQotCQkJCWlmIChhY3Rpb24gIT0gbnVsbCAmJiAhcmljaFRleHRNb2RlCi0JCQkJCQkmJiBhY3Rpb24uZGlzYWJsZUluU291cmNlTW9kZSgpKSB7Ci0JCQkJCWVuYWJsZWRUb29sSXRlbSA9IGZhbHNlOwotCQkJCX0KLQkJCQlhY3Rpb24uc2V0RW5hYmxlZChlbmFibGVkVG9vbEl0ZW0pOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQWRkcyBhIHRvb2wgYmFyLCBpZiBuZWNlc3NhcnksIHRvIGNvbnRhaW4gYSBidXR0b24gYWN0aW9uIG9yIHNlcGFyYXRvci4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRUb29sQmFyKCkgewotCQlpZiAoYWRkVG9vbEJhcikgewotCQkJdG9vbGJhck1nckNvbWJvID0gbmV3IFRvb2xCYXJNYW5hZ2VyKFNXVC5XUkFQIHwgU1dULkZMQVQgfCBwYXJlbnQuZ2V0U3R5bGUoKSk7Ci0JCQl0b29sYmFyTWdyQ29tYm8uY3JlYXRlQ29udHJvbChwYXJlbnQpOwotCQkJdG9vbGJhck1nciA9IG5ldyBUb29sQmFyTWFuYWdlcihTV1QuV1JBUCB8IFNXVC5GTEFUIHwgcGFyZW50LmdldFN0eWxlKCkpOwotCQkJdG9vbGJhck1nci5jcmVhdGVDb250cm9sKHBhcmVudCk7Ci0JCQlhZGRUb29sQmFyID0gZmFsc2U7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgVG9vbEJhck1hbmFnZXIgZ2V0VG9vbGJhck1ncigpIHsKLQkJcmV0dXJuIHRvb2xiYXJNZ3I7Ci0JfQotCi0JcHVibGljIFRvb2xCYXJNYW5hZ2VyIGdldFRvb2xiYXJNZ3JDb21ibygpIHsKLQkJcmV0dXJuIHRvb2xiYXJNZ3JDb21ibzsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2FjdGlvbnMvQWRkSW1hZ2VBY3Rpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2FjdGlvbnMvQWRkSW1hZ2VBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjEwMjkyMy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9hY3Rpb25zL0FkZEltYWdlQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5JUmljaFRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRJbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5kaWFsb2dzLkFkZEltYWdlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLQotLyoqCi0gKiBBZGRzIGFuIGltYWdlIHRvIGEgcmljaCB0ZXh0IGNvbnRyb2wuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQWRkSW1hZ2VBY3Rpb24gZXh0ZW5kcyBSaWNoVGV4dEFjdGlvbiB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBBZGRJbWFnZUFjdGlvbihJUmljaFRleHQgcmljaFRleHQpIHsKLQkJc3VwZXIocmljaFRleHQsIElBY3Rpb24uQVNfUFVTSF9CVVRUT04pOwotCQlzZXRJbWFnZURlc2NyaXB0b3IoUmljaFRleHRJbWFnZXMuSU1HX0RFU0NfQUREX0lNQUdFKTsKLQkJc2V0RGlzYWJsZWRJbWFnZURlc2NyaXB0b3IoUmljaFRleHRJbWFnZXMuRElTQUJMRURfSU1HX0RFU0NfQUREX0lNQUdFKTsKLQkJc2V0VG9vbFRpcFRleHQoUmljaFRleHRSZXNvdXJjZXMuYWRkSW1hZ2VBY3Rpb25fdG9vbFRpcFRleHQpOyAKLQl9Ci0KLQkvKioKLQkgKiBFeGVjdXRlcyB0aGUgYWN0aW9uLgotCSAqIAotCSAqIEBwYXJhbSByaWNoVGV4dAotCSAqICAgICAgICAgICAgYSByaWNoIHRleHQgY29udHJvbAotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoSVJpY2hUZXh0IHJpY2hUZXh0KSB7Ci0JCWlmIChyaWNoVGV4dCAhPSBudWxsKSB7Ci0JCQlBZGRJbWFnZURpYWxvZyBkaWFsb2cgPSBuZXcgQWRkSW1hZ2VEaWFsb2coRGlzcGxheS5nZXRDdXJyZW50KCkKLQkJCQkJLmdldEFjdGl2ZVNoZWxsKCkpOwotCQkJZGlhbG9nLm9wZW4oKTsKLQkJCWlmIChkaWFsb2cuZ2V0UmV0dXJuQ29kZSgpID09IFdpbmRvdy5PSykgewotCQkJCVN0cmluZyBpbWFnZVVSTCA9IGRpYWxvZy5nZXRJbWFnZSgpLmdldFVSTCgpOwotCQkJCWlmIChpbWFnZVVSTC5sZW5ndGgoKSA+IDApIHsKLQkJCQkJcmljaFRleHQKLQkJCQkJCQkuZXhlY3V0ZUNvbW1hbmQoUmljaFRleHRDb21tYW5kLkFERF9JTUFHRSwgaW1hZ2VVUkwpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBkaXNhYmxlSW5Tb3VyY2VNb2RlKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9hY3Rpb25zL0FkZExpbmVBY3Rpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2FjdGlvbnMvQWRkTGluZUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1N2NhZGE1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2FjdGlvbnMvQWRkTGluZUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuSVJpY2hUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0SW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLQotLyoqCi0gKiBBZGRzIGEgaG9yaXpvbnRhbCBiYXIgdG8gYSByaWNoIHRleHQgY29udHJvbC4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBBZGRMaW5lQWN0aW9uIGV4dGVuZHMgUmljaFRleHRBY3Rpb24gewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgQWRkTGluZUFjdGlvbihJUmljaFRleHQgcmljaFRleHQpIHsKLQkJc3VwZXIocmljaFRleHQsIElBY3Rpb24uQVNfUFVTSF9CVVRUT04pOwotCQlzZXRJbWFnZURlc2NyaXB0b3IoUmljaFRleHRJbWFnZXMuSU1HX0RFU0NfQUREX0xJTkUpOwotCQlzZXRUb29sVGlwVGV4dChSaWNoVGV4dFJlc291cmNlcy5hZGRMaW5lQWN0aW9uX3Rvb2xUaXBUZXh0KTsgCi0JfQotCi0JLyoqCi0JICogRXhlY3V0ZXMgdGhlIGFjdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gcmljaFRleHQKLQkgKiAgICAgICAgICAgIGEgcmljaCB0ZXh0IGNvbnRyb2wKLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKElSaWNoVGV4dCByaWNoVGV4dCkgewotCQlpZiAocmljaFRleHQgIT0gbnVsbCkgewotCQkJcmljaFRleHQuZXhlY3V0ZUNvbW1hbmQoUmljaFRleHRDb21tYW5kLkFERF9MSU5FKTsKLQkJfQotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2FjdGlvbnMvQWRkTGlua0FjdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvYWN0aW9ucy9BZGRMaW5rQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjNjhlYjcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvYWN0aW9ucy9BZGRMaW5rQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5JUmljaFRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRJbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5kaWFsb2dzLkFkZExpbmtEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotCi0vKioKLSAqIEFkZHMgYSBsaW5rIHRvIGEgcmljaCB0ZXh0IGNvbnRyb2wuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQWRkTGlua0FjdGlvbiBleHRlbmRzIFJpY2hUZXh0QWN0aW9uIHsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIEFkZExpbmtBY3Rpb24oSVJpY2hUZXh0IHJpY2hUZXh0KSB7Ci0JCXN1cGVyKHJpY2hUZXh0LCBJQWN0aW9uLkFTX1BVU0hfQlVUVE9OKTsKLQkJc2V0SW1hZ2VEZXNjcmlwdG9yKFJpY2hUZXh0SW1hZ2VzLklNR19ERVNDX0FERF9MSU5LKTsKLQkJc2V0RGlzYWJsZWRJbWFnZURlc2NyaXB0b3IoUmljaFRleHRJbWFnZXMuRElTQUJMRURfSU1HX0RFU0NfQUREX0xJTkspOwotCQlzZXRUb29sVGlwVGV4dChSaWNoVGV4dFJlc291cmNlcy5hZGRMaW5rQWN0aW9uX3Rvb2xUaXBUZXh0KTsgCi0JfQotCi0JLyoqCi0JICogRXhlY3V0ZXMgdGhlIGFjdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gcmljaFRleHQKLQkgKiAgICAgICAgICAgIGEgcmljaCB0ZXh0IGNvbnRyb2wKLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKElSaWNoVGV4dCByaWNoVGV4dCkgewotCQlpZiAocmljaFRleHQgIT0gbnVsbCkgewotCQkJQWRkTGlua0RpYWxvZyBkaWFsb2cgPSBuZXcgQWRkTGlua0RpYWxvZyhEaXNwbGF5LmdldEN1cnJlbnQoKQotCQkJCQkuZ2V0QWN0aXZlU2hlbGwoKSwgcmljaFRleHQuZ2V0QmFzZVBhdGgoKSk7Ci0JCQlkaWFsb2cub3BlbigpOwotCQkJaWYgKGRpYWxvZy5nZXRSZXR1cm5Db2RlKCkgPT0gV2luZG93Lk9LKSB7Ci0JCQkJU3RyaW5nIGxpbmtVUkwgPSBkaWFsb2cuZ2V0TGluaygpLmdldFVSTCgpOwotCQkJCWlmIChsaW5rVVJMLmxlbmd0aCgpID4gMCkgewotCQkJCQlyaWNoVGV4dC5leGVjdXRlQ29tbWFuZChSaWNoVGV4dENvbW1hbmQuQUREX0xJTkssIGxpbmtVUkwpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBkaXNhYmxlSW5Tb3VyY2VNb2RlKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvYWN0aW9ucy9BZGRPcmRlcmVkTGlzdEFjdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvYWN0aW9ucy9BZGRPcmRlcmVkTGlzdEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZTQyYTAzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2FjdGlvbnMvQWRkT3JkZXJlZExpc3RBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LklSaWNoVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dEltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci0KLS8qKgotICogQWRkcyBhbiBvcmRlcmVkIGxpc3QgdG8gYSByaWNoIHRleHQgY29udHJvbC4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBBZGRPcmRlcmVkTGlzdEFjdGlvbiBleHRlbmRzIFJpY2hUZXh0QWN0aW9uIHsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIEFkZE9yZGVyZWRMaXN0QWN0aW9uKElSaWNoVGV4dCByaWNoVGV4dCkgewotCQlzdXBlcihyaWNoVGV4dCwgSUFjdGlvbi5BU19QVVNIX0JVVFRPTik7Ci0JCXNldEltYWdlRGVzY3JpcHRvcihSaWNoVGV4dEltYWdlcy5JTUdfREVTQ19BRERfT1JERVJFRF9MSVNUKTsKLQkJc2V0RGlzYWJsZWRJbWFnZURlc2NyaXB0b3IoUmljaFRleHRJbWFnZXMuRElTQUJMRURfSU1HX0RFU0NfQUREX09SREVSRURfTElTVCk7Ci0JCXNldFRvb2xUaXBUZXh0KFJpY2hUZXh0UmVzb3VyY2VzLmFkZE9yZGVyZWRMaXN0QWN0aW9uX3Rvb2xUaXBUZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBFeGVjdXRlcyB0aGUgYWN0aW9uLgotCSAqIAotCSAqIEBwYXJhbSByaWNoVGV4dAotCSAqICAgICAgICAgICAgYSByaWNoIHRleHQgY29udHJvbAotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoSVJpY2hUZXh0IHJpY2hUZXh0KSB7Ci0JCWlmIChyaWNoVGV4dCAhPSBudWxsKSB7Ci0JCQlyaWNoVGV4dC5leGVjdXRlQ29tbWFuZChSaWNoVGV4dENvbW1hbmQuQUREX09SREVSRURfTElTVCk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2FjdGlvbnMvQWRkVGFibGVBY3Rpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2FjdGlvbnMvQWRkVGFibGVBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTk2NzE2Ni4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9hY3Rpb25zL0FkZFRhYmxlQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5JUmljaFRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRJbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5kaWFsb2dzLkFkZFRhYmxlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5odG1sLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLQotLyoqCi0gKiBBZGRzIGEgdGFibGUgdG8gYSByaWNoIHRleHQgY29udHJvbC4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBBZGRUYWJsZUFjdGlvbiBleHRlbmRzIFJpY2hUZXh0QWN0aW9uIHsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIEFkZFRhYmxlQWN0aW9uKElSaWNoVGV4dCByaWNoVGV4dCkgewotCQlzdXBlcihyaWNoVGV4dCwgSUFjdGlvbi5BU19QVVNIX0JVVFRPTik7Ci0JCXNldEltYWdlRGVzY3JpcHRvcihSaWNoVGV4dEltYWdlcy5JTUdfREVTQ19BRERfVEFCTEUpOwotCQlzZXREaXNhYmxlZEltYWdlRGVzY3JpcHRvcihSaWNoVGV4dEltYWdlcy5ESVNBQkxFRF9JTUdfREVTQ19BRERfVEFCTEUpOwotCQlzZXRUb29sVGlwVGV4dChSaWNoVGV4dFJlc291cmNlcy5hZGRUYWJsZUFjdGlvbl90b29sVGlwVGV4dCk7Ci0JfQotCi0JLyoqCi0JICogRXhlY3V0ZXMgdGhlIGFjdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gcmljaFRleHQKLQkgKiAgICAgICAgICAgIGEgcmljaCB0ZXh0IGNvbnRyb2wKLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKElSaWNoVGV4dCByaWNoVGV4dCkgewotCQlpZiAocmljaFRleHQgIT0gbnVsbCkgewotCQkJQWRkVGFibGVEaWFsb2cgZGlhbG9nID0gbmV3IEFkZFRhYmxlRGlhbG9nKERpc3BsYXkuZ2V0Q3VycmVudCgpCi0JCQkJCS5nZXRBY3RpdmVTaGVsbCgpKTsKLQkJCWRpYWxvZy5vcGVuKCk7Ci0JCQlpZiAoZGlhbG9nLmdldFJldHVybkNvZGUoKSA9PSBXaW5kb3cuT0spIHsKLQkJCQlUYWJsZSB0YWJsZSA9IGRpYWxvZy5nZXRUYWJsZSgpOwotCQkJCWludCByb3dzID0gdGFibGUuZ2V0Um93cygpOwotCQkJCWludCBjb2xzID0gdGFibGUuZ2V0Q29sdW1ucygpOwotCQkJCVN0cmluZyB3aWR0aCA9IHRhYmxlLmdldFdpZHRoKCk7Ci0JCQkJaW50IHRhYmxlaGVhZGVycyA9IHRhYmxlLmdldFRhYmxlSGVhZGVycygpOwotCQkJCVN0cmluZyBzdW1tYXJ5ID0gdGFibGUuZ2V0U3VtbWFyeSgpOwotCQkJCVN0cmluZyBjYXB0aW9uID0gdGFibGUuZ2V0Q2FwdGlvbigpOwotCQkJCWlmIChyb3dzID4gMCAmJiBjb2xzID4gMCkgewotCQkJCQlyaWNoVGV4dAotCQkJCQkJCS5leGVjdXRlQ29tbWFuZCgKLQkJCQkJCQkJCVJpY2hUZXh0Q29tbWFuZC5BRERfVEFCTEUsCi0JCQkJCQkJCQluZXcgU3RyaW5nW10gewotCQkJCQkJCQkJCQkiIiArIHJvd3MsICIiICsgY29scywgIiIgKyB3aWR0aCwgc3VtbWFyeSwgY2FwdGlvbiwgIiIgKyB0YWJsZWhlYWRlcnMgfSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9hY3Rpb25zL0FkZFVub3JkZXJlZExpc3RBY3Rpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2FjdGlvbnMvQWRkVW5vcmRlcmVkTGlzdEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MmIwNTU3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2FjdGlvbnMvQWRkVW5vcmRlcmVkTGlzdEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuSVJpY2hUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0SW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLQotLyoqCi0gKiBBZGRzIGFuIHVub3JkZXJlZCBsaXN0IHRvIGEgcmljaCB0ZXh0IGNvbnRyb2wuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQWRkVW5vcmRlcmVkTGlzdEFjdGlvbiBleHRlbmRzIFJpY2hUZXh0QWN0aW9uIHsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIEFkZFVub3JkZXJlZExpc3RBY3Rpb24oSVJpY2hUZXh0IHJpY2hUZXh0KSB7Ci0JCXN1cGVyKHJpY2hUZXh0LCBJQWN0aW9uLkFTX1BVU0hfQlVUVE9OKTsKLQkJc2V0SW1hZ2VEZXNjcmlwdG9yKFJpY2hUZXh0SW1hZ2VzLklNR19ERVNDX0FERF9VTk9SREVSRURfTElTVCk7Ci0JCXNldERpc2FibGVkSW1hZ2VEZXNjcmlwdG9yKFJpY2hUZXh0SW1hZ2VzLkRJU0FCTEVEX0lNR19ERVNDX0FERF9VTk9SREVSRURfTElTVCk7Ci0JCXNldFRvb2xUaXBUZXh0KFJpY2hUZXh0UmVzb3VyY2VzLmFkZFVub3JkZXJlZExpc3RBY3Rpb25fdG9vbFRpcFRleHQpOwotCX0KLQotCS8qKgotCSAqIEV4ZWN1dGVzIHRoZSBhY3Rpb24uCi0JICogCi0JICogQHBhcmFtIHJpY2hUZXh0Ci0JICogICAgICAgICAgICBhIHJpY2ggdGV4dCBjb250cm9sCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZShJUmljaFRleHQgcmljaFRleHQpIHsKLQkJaWYgKHJpY2hUZXh0ICE9IG51bGwpIHsKLQkJCXJpY2hUZXh0LmV4ZWN1dGVDb21tYW5kKFJpY2hUZXh0Q29tbWFuZC5BRERfVU5PUkRFUkVEX0xJU1QpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9hY3Rpb25zL0Jhc2VSaWNoVGV4dEFjdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvYWN0aW9ucy9CYXNlUmljaFRleHRBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGVkNTczNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9hY3Rpb25zL0Jhc2VSaWNoVGV4dEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmFjdGlvbnM7Ci0KLS8qKgotICogVGhlIGFic3RyYWN0IGJhc2UgY2xhc3MgZm9yIGFsbCByaWNoIHRleHQgYWN0aW9uLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEJhc2VSaWNoVGV4dEFjdGlvbiBpbXBsZW1lbnRzIElCYXNlUmljaFRleHRBY3Rpb24gewotCi0JcHJvdGVjdGVkIFN0cmluZyB0b29sVGlwVGV4dDsKLQotCXByb3RlY3RlZCBib29sZWFuIGVuYWJsZWQgPSB0cnVlOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gcmljaFRleHQKLQkgKiAgICAgICAgICAgIGEgcmljaCB0ZXh0IGNvbnRyb2wKLQkgKi8KLQlwdWJsaWMgQmFzZVJpY2hUZXh0QWN0aW9uKCkgewotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHRvb2wgdGlwIGZvciB0aGUgYWN0aW9uLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHRvb2wgdGlwIHRleHQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRvb2xUaXBUZXh0KCkgewotCQlyZXR1cm4gdG9vbFRpcFRleHQ7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdG9vbCB0aXAgZm9yIHRoZSBhY3Rpb24uCi0JICogCi0JICogQHBhcmFtIHRvb2xUaXBUZXh0Ci0JICogICAgICAgICAgICB0aGUgdG9vbCB0aXAgdGV4dAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRvb2xUaXBUZXh0KFN0cmluZyB0b29sVGlwVGV4dCkgewotCQl0aGlzLnRvb2xUaXBUZXh0ID0gdG9vbFRpcFRleHQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZW5hYmxlZCBzdGF0dXMgb2YgdGhlIGFjdGlvbi4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIGVuYWJsZWQsIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiBub3QKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBnZXRFbmFibGVkKCkgewotCQlyZXR1cm4gZW5hYmxlZDsKLQl9Ci0KLQkvKioKLQkgKiBFbmFibGVzIG9yIGRpc2FibGVzIHRoZSBhY3Rpb24uCi0JICogCi0JICogQHBhcmFtIGVuYWJsZWQKLQkgKiAgICAgICAgICAgIGlmIDxjb2RlPnRydWU8L2NvZGU+LCBlbmFibGUgdGhlIGFjdGlvbi4gaWYKLQkgKiAgICAgICAgICAgIDxjb2RlPmZhbHNlPC9jb2RlPiwgZGlzYWJsZSBpdC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFbmFibGVkKGJvb2xlYW4gZW5hYmxlZCkgewotCQl0aGlzLmVuYWJsZWQgPSBlbmFibGVkOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvYWN0aW9ucy9CbG9ja1RhZ0FjdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvYWN0aW9ucy9CbG9ja1RhZ0FjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZWI4ZmE2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2FjdGlvbnMvQmxvY2tUYWdBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5JUmljaFRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0Lmh0bWwuQmxvY2tUYWc7Ci0KLS8qKgotICogU2V0cyB0aGUgZm9udCBuYW1lIGZvciB0aGUgc2VsZWN0ZWQgdGV4dCBpbiBhIHJpY2ggdGV4dCBjb250cm9sLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEJsb2NrVGFnQWN0aW9uIGV4dGVuZHMgUmljaFRleHRDb21ib0FjdGlvbiB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBCbG9ja1RhZ0FjdGlvbihmaW5hbCBJUmljaFRleHQgcmljaFRleHQpIHsKLQkJc3VwZXIocmljaFRleHQpOwotCQlzZXRUb29sVGlwVGV4dChSaWNoVGV4dFJlc291cmNlcy5ibG9ja1RhZ0FjdGlvbl90b29sVGlwVGV4dCk7IAotCX0KLQkJCi0JQE92ZXJyaWRlCi0JcHVibGljIENvbGxlY3Rpb248U3RyaW5nPiBnZXRJbnB1dCgpIHsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IHJldHVybkxpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJCi0JCXJldHVybkxpc3QuYWRkKEJsb2NrVGFnLlBBUkFHUkFQSC5nZXROYW1lKCkpOwotCQlyZXR1cm5MaXN0LmFkZChCbG9ja1RhZy5IRUFESU5HXzEuZ2V0TmFtZSgpKTsKLQkJcmV0dXJuTGlzdC5hZGQoQmxvY2tUYWcuSEVBRElOR18yLmdldE5hbWUoKSk7Ci0JCXJldHVybkxpc3QuYWRkKEJsb2NrVGFnLkhFQURJTkdfMy5nZXROYW1lKCkpOwotCQlyZXR1cm5MaXN0LmFkZChCbG9ja1RhZy5IRUFESU5HXzQuZ2V0TmFtZSgpKTsKLQkJcmV0dXJuTGlzdC5hZGQoQmxvY2tUYWcuSEVBRElOR181LmdldE5hbWUoKSk7Ci0JCXJldHVybkxpc3QuYWRkKEJsb2NrVGFnLkhFQURJTkdfNi5nZXROYW1lKCkpOwotCQlyZXR1cm5MaXN0LmFkZChCbG9ja1RhZy5BRERSRVNTLmdldE5hbWUoKSk7Ci0JCXJldHVybkxpc3QuYWRkKEJsb2NrVGFnLlBSRUZPUk1BVFRFRF9URVhULmdldE5hbWUoKSk7Ci0KLQkJcmV0dXJuIHJldHVybkxpc3Q7Ci0JfQotCQotCQotCi0JLyoqCi0JICogRXhlY3V0ZXMgdGhlIGFjdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gcmljaFRleHQKLQkgKiAgICAgICAgICAgIGEgcmljaCB0ZXh0IGNvbnRyb2wKLQkgKiBAcGFyYW0gaW5kZXgKLQkgKiAgICAgICAgICAgIHRoZSBpbmRleCBvZiB0aGUgc2VsZWN0ZWQgaXRlbQotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoSVJpY2hUZXh0IHJpY2hUZXh0KSB7Ci0JCWlmIChyaWNoVGV4dCAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgc2VsZWN0ZWQgPSBnZXRDQ29tYm9TZWxlY3Rpb24oKTsKLQkJCXJpY2hUZXh0LmV4ZWN1dGVDb21tYW5kKFJpY2hUZXh0Q29tbWFuZC5GT1JNQVRfQkxPQ0ssIHNlbGVjdGVkKTsKLQkJfQotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2FjdGlvbnMvQm9sZEFjdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvYWN0aW9ucy9Cb2xkQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3YmM2NDMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvYWN0aW9ucy9Cb2xkQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5JUmljaFRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRJbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci0KLS8qKgotICogVG9nZ2xlcyB0aGUgJ2JvbGQnIGF0dHJpYnV0ZSBvZiB0aGUgc2VsZWN0ZWQgdGV4dCBpbiBhIHJpY2ggdGV4dCBjb250cm9sLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEJvbGRBY3Rpb24gZXh0ZW5kcyBSaWNoVGV4dEFjdGlvbiB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBCb2xkQWN0aW9uKGZpbmFsIElSaWNoVGV4dCByaWNoVGV4dCkgewotCQlzdXBlcihyaWNoVGV4dCwgSUFjdGlvbi5BU19DSEVDS19CT1gpOwotCQlzZXRJbWFnZURlc2NyaXB0b3IoUmljaFRleHRJbWFnZXMuSU1HX0RFU0NfQk9MRCk7Ci0JCXNldERpc2FibGVkSW1hZ2VEZXNjcmlwdG9yKFJpY2hUZXh0SW1hZ2VzLkRJU0FCTEVEX0lNR19ERVNDX0JPTEQpOwotCQlzZXRUb29sVGlwVGV4dChSaWNoVGV4dFJlc291cmNlcy5ib2xkQWN0aW9uX3Rvb2xUaXBUZXh0KTsgCi0JCS8vIGFkZCBsaXN0ZW5lcgotCQlyaWNoVGV4dC5hZGRMaXN0ZW5lcihTV1QuU0VMRUNURUQsIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQkJc2V0Q2hlY2tlZChyaWNoVGV4dC5nZXRTZWxlY3RlZCgpLmlzQm9sZCgpKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JLyoqCi0JICogRXhlY3V0ZXMgdGhlIGFjdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gcmljaFRleHQKLQkgKiAgICAgICAgICAgIGEgcmljaCB0ZXh0IGNvbnRyb2wKLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKElSaWNoVGV4dCByaWNoVGV4dCkgewotCQlpZiAocmljaFRleHQgIT0gbnVsbCkgewotCQkJcmljaFRleHQuZXhlY3V0ZUNvbW1hbmQoUmljaFRleHRDb21tYW5kLkJPTEQpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvYWN0aW9ucy9DbGVhckNvbnRlbnRBY3Rpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2FjdGlvbnMvQ2xlYXJDb250ZW50QWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlODM1MDkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvYWN0aW9ucy9DbGVhckNvbnRlbnRBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LklSaWNoVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dEltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotCi0vKioKLSAqIENsZWFycyB0aGUgY29udGVudCBvZiBhIHJpY2ggdGV4dCBjb250cm9sLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIENsZWFyQ29udGVudEFjdGlvbiBleHRlbmRzIFJpY2hUZXh0QWN0aW9uIHsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIENsZWFyQ29udGVudEFjdGlvbihJUmljaFRleHQgcmljaFRleHQpIHsKLQkJc3VwZXIocmljaFRleHQsIElBY3Rpb24uQVNfUFVTSF9CVVRUT04pOwotCQlzZXRJbWFnZURlc2NyaXB0b3IoUmljaFRleHRJbWFnZXMuSU1HX0RFU0NfQ0xFQVJfQ09OVEVOVCk7Ci0JCXNldERpc2FibGVkSW1hZ2VEZXNjcmlwdG9yKFJpY2hUZXh0SW1hZ2VzLkRJU0FCTEVEX0lNR19ERVNDX0NMRUFSX0NPTlRFTlQpOwotCQlzZXRUb29sVGlwVGV4dChSaWNoVGV4dFJlc291cmNlcy5jbGVhckNvbnRlbnRBY3Rpb25fdG9vbFRpcFRleHQpOyAKLQl9Ci0KLQkvKioKLQkgKiBFeGVjdXRlcyB0aGUgYWN0aW9uLgotCSAqIAotCSAqIEBwYXJhbSByaWNoVGV4dAotCSAqICAgICAgICAgICAgcyByaWNoIHRleHQgY29udHJvbAotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoSVJpY2hUZXh0IHJpY2hUZXh0KSB7Ci0JCWlmIChyaWNoVGV4dCAhPSBudWxsKSB7Ci0JCQlpZiAoUmljaFRleHRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpLmRpc3BsYXlQcm9tcHQoCi0JCQkJCVJpY2hUZXh0UmVzb3VyY2VzLmNsZWFyQ29udGVudERpYWxvZ190aXRsZSwKLQkJCQkJUmljaFRleHRSZXNvdXJjZXMuY2xlYXJDb250ZW50RGlhbG9nX3RleHQpKSB7Ci0JCQkJcmljaFRleHQuZXhlY3V0ZUNvbW1hbmQoUmljaFRleHRDb21tYW5kLkNMRUFSX0NPTlRFTlQpOwotCQkJfQotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9hY3Rpb25zL0NvcHlBY3Rpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2FjdGlvbnMvQ29weUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZmYyZjZjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2FjdGlvbnMvQ29weUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuSVJpY2hUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dEltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5TdHlsZWRUZXh0OwotCi0vKioKLSAqIENvcGllcyB0aGUgc2VsZWN0ZWQgdGV4dCBpbiBhIHJpY2ggdGV4dCBjb250cm9sIHRvIHRoZSBjbGlwYm9hcmQuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQ29weUFjdGlvbiBleHRlbmRzIFJpY2hUZXh0QWN0aW9uIHsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIENvcHlBY3Rpb24oSVJpY2hUZXh0IHJpY2hUZXh0KSB7Ci0JCXN1cGVyKHJpY2hUZXh0LCBJQWN0aW9uLkFTX1BVU0hfQlVUVE9OKTsKLQkJc2V0SW1hZ2VEZXNjcmlwdG9yKFJpY2hUZXh0SW1hZ2VzLklNR19ERVNDX0NPUFkpOwotCQlzZXREaXNhYmxlZEltYWdlRGVzY3JpcHRvcihSaWNoVGV4dEltYWdlcy5ESVNBQkxFRF9JTUdfREVTQ19DT1BZKTsKLQkJc2V0VG9vbFRpcFRleHQoUmljaFRleHRSZXNvdXJjZXMuY29weUFjdGlvbl90b29sVGlwVGV4dCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIGFjdGlvbiBzaG91bGQgYmUgZGlzYWJsZWQgd2hlbiB0aGUKLQkgKiByaWNoIHRleHQgZWRpdG9yIGlzIGluIHJlYWRvbmx5IG1vZGUuCi0JICovCi0JcHVibGljIGJvb2xlYW4gZGlzYWJsZUluUmVhZE9ubHlNb2RlKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBhY3Rpb24gc2hvdWxkIGJlIGRpc2FibGVkIHdoZW4gdGhlCi0JICogcmljaCB0ZXh0IGVkaXRvciBpcyBpbiBzb3VyY2UgZWRpdCBtb2RlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGRpc2FibGVJblNvdXJjZU1vZGUoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBFeGVjdXRlcyB0aGUgYWN0aW9uLgotCSAqIAotCSAqIEBwYXJhbSByaWNoVGV4dAotCSAqICAgICAgICAgICAgYSByaWNoIHRleHQgY29udHJvbAotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoSVJpY2hUZXh0IHJpY2hUZXh0KSB7Ci0JCWlmIChyaWNoVGV4dCAhPSBudWxsKSB7Ci0JCQlpZiAocmljaFRleHQgaW5zdGFuY2VvZiBSaWNoVGV4dEVkaXRvcgotCQkJCQkmJiAoKFJpY2hUZXh0RWRpdG9yKSByaWNoVGV4dCkuaXNIVE1MVGFiU2VsZWN0ZWQoKSkgewotCQkJCVN0eWxlZFRleHQgc3R5bGVkVGV4dCA9ICgoUmljaFRleHRFZGl0b3IpIHJpY2hUZXh0KS5nZXRTb3VyY2VFZGl0KCk7Ci0JCQkJc3R5bGVkVGV4dC5jb3B5KCk7Ci0JCQl9IGVsc2UgewotCQkJCXJpY2hUZXh0LnNldENvcHlVUkwoKTsKLQkJCQlyaWNoVGV4dC5leGVjdXRlQ29tbWFuZChSaWNoVGV4dENvbW1hbmQuQ09QWSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2FjdGlvbnMvQ3V0QWN0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9hY3Rpb25zL0N1dEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjODI4ODgzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2FjdGlvbnMvQ3V0QWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5JUmljaFRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0SW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlN0eWxlZFRleHQ7Ci0KLS8qKgotICogQ3V0cyB0aGUgc2VsZWN0ZWQgdGV4dCBpbiB0aGUgcmljaCB0ZXh0IGNvbnRyb2wgdG8gdGhlIGNsaXBib2FyZC4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBDdXRBY3Rpb24gZXh0ZW5kcyBSaWNoVGV4dEFjdGlvbiB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBDdXRBY3Rpb24oSVJpY2hUZXh0IHJpY2hUZXh0KSB7Ci0JCXN1cGVyKHJpY2hUZXh0LCBJQWN0aW9uLkFTX1BVU0hfQlVUVE9OKTsKLQkJc2V0SW1hZ2VEZXNjcmlwdG9yKFJpY2hUZXh0SW1hZ2VzLklNR19ERVNDX0NVVCk7Ci0JCXNldERpc2FibGVkSW1hZ2VEZXNjcmlwdG9yKFJpY2hUZXh0SW1hZ2VzLkRJU0FCTEVEX0lNR19ERVNDX0NVVCk7Ci0JCXNldFRvb2xUaXBUZXh0KFJpY2hUZXh0UmVzb3VyY2VzLmN1dEFjdGlvbl90b29sVGlwVGV4dCk7IAotCX0KLQotCS8qKgotCSAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBhY3Rpb24gc2hvdWxkIGJlIGRpc2FibGVkIHdoZW4gdGhlCi0JICogcmljaCB0ZXh0IGVkaXRvciBpcyBpbiBzb3VyY2UgZWRpdCBtb2RlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGRpc2FibGVJblNvdXJjZU1vZGUoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBFeGVjdXRlcyB0aGUgYWN0aW9uLgotCSAqIAotCSAqIEBwYXJhbSByaWNoVGV4dAotCSAqICAgICAgICAgICAgYSByaWNoIHRleHQgY29udHJvbAotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoSVJpY2hUZXh0IHJpY2hUZXh0KSB7Ci0JCWlmIChyaWNoVGV4dCAhPSBudWxsKSB7Ci0JCQlpZiAocmljaFRleHQgaW5zdGFuY2VvZiBSaWNoVGV4dEVkaXRvcgotCQkJCQkmJiAoKFJpY2hUZXh0RWRpdG9yKSByaWNoVGV4dCkuaXNIVE1MVGFiU2VsZWN0ZWQoKSkgewotCQkJCVN0eWxlZFRleHQgc3R5bGVkVGV4dCA9ICgoUmljaFRleHRFZGl0b3IpIHJpY2hUZXh0KQotCQkJCQkJLmdldFNvdXJjZUVkaXQoKTsKLQkJCQlzdHlsZWRUZXh0LmN1dCgpOwotCQkJfSBlbHNlIHsKLQkJCQlyaWNoVGV4dC5zZXRDb3B5VVJMKCk7Ci0JCQkJcmljaFRleHQuZXhlY3V0ZUNvbW1hbmQoUmljaFRleHRDb21tYW5kLkNVVCk7Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9hY3Rpb25zL0ZpbmRSZXBsYWNlQWN0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9hY3Rpb25zL0ZpbmRSZXBsYWNlQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3YzJjM2MuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvYWN0aW9ucy9GaW5kUmVwbGFjZUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzc4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5YTUxVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5JUmljaFRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0SW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmRpYWxvZ3MuRmluZFJlcGxhY2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5TdHlsZWRUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotCi0vKioKLSAqIEZpbmRzIGFuZCByZXBsYWNlcyB0ZXh0IGluIGEgcmljaCB0ZXh0IGNvbnRyb2wuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRmluZFJlcGxhY2VBY3Rpb24gZXh0ZW5kcyBSaWNoVGV4dEFjdGlvbiB7Ci0KLQkvKioKLQkgKiBGaW5kcyB0ZXh0IHN1YiBhY3Rpb24uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRklORF9URVhUID0gMTsKLQotCS8qKgotCSAqIFJlcGxhY2VzIHRleHQgc3ViIGFjdGlvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRVBMQUNFX1RFWFQgPSAyOwotCi0JLyoqCi0JICogUmVwbGFjZXMgYW5kIGZpbmRzIHRleHQgc3ViIGFjdGlvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRVBMQUNFX0ZJTkRfVEVYVCA9IDM7Ci0KLQkvKioKLQkgKiBSZXBsYWNlcyBhbGwgc3ViIGFjdGlvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRVBMQUNFX0FMTF9URVhUID0gNDsKLQotCS8qKgotCSAqIEZpbmQgbWF0Y2ggaW4gYSBmb3J3YXJkIGRpcmVjdGlvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT1JXQVJEX01BVENIID0gMTsKLQotCS8qKgotCSAqIEZpbmQgbWF0Y2ggaW4gYSBiYWNrd2FyZCBkaXJlY3Rpb24uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQkFDS1dBUkRfTUFUQ0ggPSAtMTsKLQotCS8qKgotCSAqIFdob2xlIHdvcmQgbWF0Y2guCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0hPTEVfV09SRF9NQVRDSCA9IDI7Ci0KLQkvKioKLQkgKiBDYXNlIHNlbnNpdGl2ZSBtYXRjaC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDQVNFX1NFTlNJVElWRV9NQVRDSCA9IDQ7Ci0KLQkvLyBFbmNvZGVkIHNpbmdsZSBxdW90ZS4KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBFTkNPREVEX1NJTkdMRV9RVU9URSA9ICIlc3ElIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJvdGVjdGVkIElSaWNoVGV4dCByaWNoVGV4dDsKLQotCXByb3RlY3RlZCBTdHlsZWRUZXh0IHN0eWxlZFRleHQ7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBmb3VuZE1hdGNoID0gZmFsc2U7Ci0JCi0JLy8gdGhlIGRpYWxvZyBpbnN0YW5jZQotCXByb3RlY3RlZCBGaW5kUmVwbGFjZURpYWxvZyBkaWFsb2c7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBGaW5kUmVwbGFjZUFjdGlvbihJUmljaFRleHQgcmljaFRleHQpIHsKLQkJc3VwZXIocmljaFRleHQsIElBY3Rpb24uQVNfUFVTSF9CVVRUT04pOwotCQlzZXRJbWFnZURlc2NyaXB0b3IoUmljaFRleHRJbWFnZXMuSU1HX0RFU0NfRklORF9SRVBMQUNFKTsKLQkJc2V0RGlzYWJsZWRJbWFnZURlc2NyaXB0b3IoUmljaFRleHRJbWFnZXMuRElTQUJMRURfSU1HX0RFU0NfRklORF9SRVBMQUNFKTsKLQkJc2V0VG9vbFRpcFRleHQoUmljaFRleHRSZXNvdXJjZXMuZmluZFJlcGxhY2VBY3Rpb25fdG9vbFRpcFRleHQpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBhY3Rpb24gc2hvdWxkIGJlIGRpc2FibGVkIHdoZW4gdGhlCi0JICogcmljaCB0ZXh0IGVkaXRvciBpcyBpbiByZWFkb25seSBtb2RlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGRpc2FibGVJblJlYWRPbmx5TW9kZSgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBhY3Rpb24gc2hvdWxkIGJlIGRpc2FibGVkIHdoZW4gdGhlCi0JICogcmljaCB0ZXh0IGVkaXRvciBpcyBpbiBzb3VyY2UgZWRpdCBtb2RlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGRpc2FibGVJblNvdXJjZU1vZGUoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBFeGVjdXRlcyB0aGUgYWN0aW9uLgotCSAqIAotCSAqIEBwYXJhbSByaWNoVGV4dAotCSAqICAgICAgICAgICAgYSByaWNoIHRleHQgY29udHJvbAotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoSVJpY2hUZXh0IHJpY2hUZXh0KSB7Ci0JCWlmICh0aGlzLnJpY2hUZXh0ID09IG51bGwpCi0JCQl0aGlzLnJpY2hUZXh0ID0gcmljaFRleHQ7Ci0JCWlmICh0aGlzLnJpY2hUZXh0ICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJaWYgKGRpYWxvZyAhPSBudWxsKSB7Ci0JCQkJCWRpYWxvZy5zZXRGaW5kT25seSghdGhpcy5yaWNoVGV4dC5nZXRFZGl0YWJsZSgpKTsKLQkJCQkJZGlhbG9nLm9wZW4oKTsKLQkJCQl9IGVsc2UgewotCQkJCQlkaWFsb2cgPSBuZXcgRmluZFJlcGxhY2VEaWFsb2coRGlzcGxheQotCQkJCQkJCS5nZXRDdXJyZW50KCkuZ2V0QWN0aXZlU2hlbGwoKSwgdGhpcywgIXRoaXMucmljaFRleHQKLQkJCQkJCQkuZ2V0RWRpdGFibGUoKSk7Ci0JCQkJCWRpYWxvZy5vcGVuKCk7Ci0JCQkJfQotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlSaWNoVGV4dFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIGEgbWF0Y2ggaXMgZm91bmQuCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBhIG1hdGNoIGlzIGZvdW5kLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGdldEZvdW5kTWF0Y2goKSB7Ci0JCXJldHVybiBmb3VuZE1hdGNoOwotCX0KLQotCS8qKgotCSAqIEV4ZWN1dGVzIHRoZSBhY3Rpb24uCi0JICogCi0JICogQHBhcmFtIHN1YkFjdGlvbgotCSAqICAgICAgICAgICAgdGhlIHN1YiBhY3Rpb24gdG8gZXhlY3V0ZQotCSAqIEBwYXJhbSBmaW5kVGV4dAotCSAqICAgICAgICAgICAgdGhlIGZpbmQgdGV4dAotCSAqIEBwYXJhbSByZXBsYWNlVGV4dAotCSAqICAgICAgICAgICAgdGhlIHJlcGxhY2UgdGV4dAotCSAqIEBwYXJhbSBtYXRjaERpcgotCSAqICAgICAgICAgICAgdGhlIG1hdGNoIGRpcmVjdGlvbjsgdGhlIHZhbHVlIGNhbiBlaXRoZXIgYmUKLQkgKiAgICAgICAgICAgIDxjb2RlPkZJTkRfRk9SV0FSRDwvY29kZT4gb3IgPGNvZGU+RklORF9CQUNLV0FSRDwvY29kZT4uCi0JICogQHBhcmFtIG1hdGNoT3B0aW9ucwotCSAqICAgICAgICAgICAgdGhlIG1hdGNoIG9wdGlvbnMKLQkgKi8KLQlwdWJsaWMgdm9pZCBydW4oaW50IHN1YkFjdGlvbiwgU3RyaW5nIGZpbmRUZXh0LCBTdHJpbmcgcmVwbGFjZVRleHQsCi0JCQlpbnQgbWF0Y2hEaXIsIGludCBtYXRjaE9wdGlvbnMpIHsKLQkJc3R5bGVkVGV4dCA9IG51bGw7Ci0JCWlmIChyaWNoVGV4dCBpbnN0YW5jZW9mIFJpY2hUZXh0RWRpdG9yCi0JCQkJJiYgKChSaWNoVGV4dEVkaXRvcikgcmljaFRleHQpLmlzSFRNTFRhYlNlbGVjdGVkKCkpIHsKLQkJCXN0eWxlZFRleHQgPSAoKFJpY2hUZXh0RWRpdG9yKSByaWNoVGV4dCkuZ2V0U291cmNlRWRpdCgpOwotCQl9Ci0JCWlmIChzdHlsZWRUZXh0ID09IG51bGwpIHsKLQkJCWlmIChmaW5kVGV4dC5pbmRleE9mKCInIikgIT0gLTEpIHsgLy8kTk9OLU5MUy0xJAotCQkJCWZpbmRUZXh0ID0gZmluZFRleHQucmVwbGFjZUFsbCgiJyIsIEVOQ09ERURfU0lOR0xFX1FVT1RFKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJaWYgKHJlcGxhY2VUZXh0LmluZGV4T2YoIiciKSAhPSAtMSkgeyAvLyROT04tTkxTLTEkCi0JCQkJcmVwbGFjZVRleHQgPSByZXBsYWNlVGV4dC5yZXBsYWNlQWxsKCInIiwgRU5DT0RFRF9TSU5HTEVfUVVPVEUpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQkJdHJ5IHsKLQkJCWZvdW5kTWF0Y2ggPSBmYWxzZTsKLQkJCWludCBzdGF0dXMgPSAwOwotCQkJc3dpdGNoIChzdWJBY3Rpb24pIHsKLQkJCWNhc2UgRklORF9URVhUOgotCQkJCXN0YXR1cyA9IGZpbmRUZXh0KGZpbmRUZXh0LCBtYXRjaERpciwgbWF0Y2hPcHRpb25zKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgUkVQTEFDRV9URVhUOgotCQkJCXN0YXR1cyA9IHJlcGxhY2VUZXh0KHJlcGxhY2VUZXh0LCBtYXRjaERpciwgbWF0Y2hPcHRpb25zKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgUkVQTEFDRV9GSU5EX1RFWFQ6Ci0JCQkJc3RhdHVzID0gcmVwbGFjZUZpbmRUZXh0KGZpbmRUZXh0LCByZXBsYWNlVGV4dCwgbWF0Y2hEaXIsCi0JCQkJCQltYXRjaE9wdGlvbnMpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBSRVBMQUNFX0FMTF9URVhUOgotCQkJCXJlcGxhY2VBbGwoZmluZFRleHQsIHJlcGxhY2VUZXh0LCBtYXRjaE9wdGlvbnMpOwotCQkJCWJyZWFrOwotCQkJfQotCQkJaWYgKHN0YXR1cyA+IDApCi0JCQkJZm91bmRNYXRjaCA9IHRydWU7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlSaWNoVGV4dFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBFc2NhcGVzIHRoZSBnaXZlbiB0ZXh0LgotCSAqIAotCSAqIEBwYXJhbSB0ZXh0Ci0JICogICAgICAgICAgICB0ZXh0IHRvIGJlIGVzY2FwZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBlc2NhcGUoU3RyaW5nIHRleHQpIHsKLQkJaWYgKHRleHQgPT0gbnVsbCB8fCB0ZXh0Lmxlbmd0aCgpID09IDApCi0JCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlpbnQgdGV4dFNpemUgPSB0ZXh0Lmxlbmd0aCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHRleHRTaXplOyBpKyspIHsKLQkJCWNoYXIgY2ggPSB0ZXh0LmNoYXJBdChpKTsKLQkJCXN3aXRjaCAoY2gpIHsKLQkJCWNhc2UgJzwnOgotCQkJCXNiLmFwcGVuZChYTUxVdGlsLlhNTF9MVCk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlICc+JzoKLQkJCQlzYi5hcHBlbmQoWE1MVXRpbC5YTUxfR1QpOwotCQkJCWJyZWFrOwotCQkJY2FzZSAnJic6Ci0JCQkJc2IuYXBwZW5kKFhNTFV0aWwuWE1MX0FNUCk7Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0OgotCQkJCXNiLmFwcGVuZChjaCk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHJvdGVjdGVkIGludCBmaW5kVGV4dChTdHJpbmcgZmluZFRleHQsIGludCBtYXRjaERpciwgaW50IG1hdGNoT3B0aW9ucykgewotCQlpbnQgc3RhdHVzID0gMDsKLQkJaWYgKHN0eWxlZFRleHQgIT0gbnVsbCkgewotCQkJc3RhdHVzID0gc3R5bGVkVGV4dEZpbmRUZXh0QW5kU2VsZWN0KGZpbmRUZXh0LCBtYXRjaERpciwKLQkJCQkJbWF0Y2hPcHRpb25zKTsKLQkJfSBlbHNlIHsKLQkJCXN0YXR1cyA9IHJpY2hUZXh0Ci0JCQkJCS5leGVjdXRlQ29tbWFuZChSaWNoVGV4dENvbW1hbmQuRklORF9URVhULCBuZXcgU3RyaW5nW10gewotCQkJCQkJCWZpbmRUZXh0LCAiIiArIG1hdGNoRGlyLCAiIiArIG1hdGNoT3B0aW9ucyB9KTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCQkJCQotCQl9Ci0JCXJldHVybiBzdGF0dXM7Ci0JfQotCi0JcHJvdGVjdGVkIGludCByZXBsYWNlVGV4dChTdHJpbmcgcmVwbGFjZVRleHQsIGludCBtYXRjaERpciwgaW50IG1hdGNoT3B0aW9ucykgewotCQlpbnQgc3RhdHVzID0gMDsKLQkJaWYgKHN0eWxlZFRleHQgIT0gbnVsbCkgewotCQkJc3RhdHVzID0gc3R5bGVkVGV4dFJlcGxhY2VUZXh0QW5kU2VsZWN0KHJlcGxhY2VUZXh0KTsKLQkJfSBlbHNlIHsKLQkJCXN0YXR1cyA9IHJpY2hUZXh0LmV4ZWN1dGVDb21tYW5kKFJpY2hUZXh0Q29tbWFuZC5SRVBMQUNFX1RFWFQsCi0JCQkJCW5ldyBTdHJpbmdbXSB7IHJlcGxhY2VUZXh0LAotCQkJCQkJCSIiICsgbWF0Y2hEaXIsICIiICsgbWF0Y2hPcHRpb25zIH0pOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQJCQkJCQotCQl9Ci0JCXJldHVybiBzdGF0dXM7Ci0JfQotCi0JcHJvdGVjdGVkIGludCByZXBsYWNlRmluZFRleHQoU3RyaW5nIGZpbmRUZXh0LCBTdHJpbmcgcmVwbGFjZVRleHQsCi0JCQlpbnQgbWF0Y2hEaXIsIGludCBtYXRjaE9wdGlvbnMpIHsKLQkJaW50IHN0YXR1cyA9IDA7Ci0JCWlmIChzdHlsZWRUZXh0ICE9IG51bGwpIHsKLQkJCXN0eWxlZFRleHRSZXBsYWNlVGV4dEFuZFNlbGVjdChyZXBsYWNlVGV4dCk7Ci0JCQlzdGF0dXMgPSBzdHlsZWRUZXh0RmluZFRleHRBbmRTZWxlY3QoZmluZFRleHQsIG1hdGNoRGlyLAotCQkJCQltYXRjaE9wdGlvbnMpOwotCQl9IGVsc2UgewotCQkJcmljaFRleHQuZXhlY3V0ZUNvbW1hbmQoUmljaFRleHRDb21tYW5kLlJFUExBQ0VfVEVYVCwgbmV3IFN0cmluZ1tdIHsKLQkJCQkJcmVwbGFjZVRleHQsICIiICsgbWF0Y2hEaXIsICIiICsgbWF0Y2hPcHRpb25zIH0pOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCXN0YXR1cyA9IHJpY2hUZXh0Ci0JCQkJCS5leGVjdXRlQ29tbWFuZChSaWNoVGV4dENvbW1hbmQuRklORF9URVhULCBuZXcgU3RyaW5nW10gewotCQkJCQkJCWZpbmRUZXh0LCAiIiArIG1hdGNoRGlyLCAiIiArIG1hdGNoT3B0aW9ucyB9KTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQkJcmV0dXJuIHN0YXR1czsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZXBsYWNlQWxsKFN0cmluZyBmaW5kVGV4dCwgU3RyaW5nIHJlcGxhY2VUZXh0LAotCQkJaW50IG1hdGNoT3B0aW9ucykgewotCQlpZiAoc3R5bGVkVGV4dCAhPSBudWxsKSB7Ci0JCQlzdHlsZWRUZXh0UmVwbGFjZUFsbChmaW5kVGV4dCwgcmVwbGFjZVRleHQsIG1hdGNoT3B0aW9ucyk7Ci0JCX0gZWxzZSB7Ci0JCQlyaWNoVGV4dC5leGVjdXRlQ29tbWFuZChSaWNoVGV4dENvbW1hbmQuUkVQTEFDRV9BTExfVEVYVCwKLQkJCQkJbmV3IFN0cmluZ1tdIHsgZXNjYXBlKGZpbmRUZXh0KSwgZXNjYXBlKHJlcGxhY2VUZXh0KSwKLQkJCQkJCQkiIiArIG1hdGNoT3B0aW9ucyB9KTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIGludCBzdHlsZWRUZXh0RmluZFRleHRBbmRTZWxlY3QoU3RyaW5nIGZpbmRUZXh0LCBpbnQgbWF0Y2hEaXIsCi0JCQlpbnQgbWF0Y2hPcHRpb25zKSB7Ci0JCVBvaW50IHNlbGVjdGlvbk9mZnNldCA9IHN0eWxlZFRleHQuZ2V0U2VsZWN0aW9uUmFuZ2UoKTsKLQkJaW50IGZpcnN0U2VsZWN0ZWRPZmZzZXQgPSBzZWxlY3Rpb25PZmZzZXQueDsKLQkJaW50IGxhc3RTZWxlY3RlZE9mZnNldCA9IHNlbGVjdGlvbk9mZnNldC54ICsgc2VsZWN0aW9uT2Zmc2V0LnkgLSAxOwotCQlTdHJpbmcgaHRtbFRleHQgPSBzdHlsZWRUZXh0LmdldFRleHQoKTsKLQkJaW50IGluZGV4T2ZNYXRjaCA9IC0xOwotCQlpZiAoKG1hdGNoT3B0aW9ucyAmIENBU0VfU0VOU0lUSVZFX01BVENIKSA9PSAwKSB7Ci0JCQkvLyBUT0RPOiB1c2UgdG9VcHBlckNhc2UoTG9jYWxlKSBvbmNlIGxpYnJhcnkgaGFzIGxvY2FsZSBhdHRyaWJ1dGUKLQkJCWh0bWxUZXh0ID0gaHRtbFRleHQudG9VcHBlckNhc2UoKTsKLQkJCWZpbmRUZXh0ID0gZmluZFRleHQudG9VcHBlckNhc2UoKTsKLQkJfQotCQlkbyB7Ci0JCQlpZiAoaW5kZXhPZk1hdGNoICE9IC0xKSB7Ci0JCQkJbGFzdFNlbGVjdGVkT2Zmc2V0ID0gaW5kZXhPZk1hdGNoICsgMTsKLQkJCQlmaXJzdFNlbGVjdGVkT2Zmc2V0ID0gaW5kZXhPZk1hdGNoIC0gMTsKLQkJCX0KLQkJCWlmIChtYXRjaERpciA9PSBGT1JXQVJEX01BVENIKSB7Ci0JCQkJaW5kZXhPZk1hdGNoID0gaHRtbFRleHQuaW5kZXhPZihmaW5kVGV4dCwKLQkJCQkJCWxhc3RTZWxlY3RlZE9mZnNldCArIDEpOwotCQkJfSBlbHNlIHsKLQkJCQlpbmRleE9mTWF0Y2ggPSBodG1sVGV4dC5sYXN0SW5kZXhPZihmaW5kVGV4dCwKLQkJCQkJCWZpcnN0U2VsZWN0ZWRPZmZzZXQgLSAxKTsKLQkJCX0KLQkJfSB3aGlsZSAoaW5kZXhPZk1hdGNoICE9IC0xCi0JCQkJJiYgKChtYXRjaE9wdGlvbnMgJiBXSE9MRV9XT1JEX01BVENIKSA9PSBXSE9MRV9XT1JEX01BVENIKQotCQkJCSYmIGlzUGFydE9mV29yZChodG1sVGV4dCwgaW5kZXhPZk1hdGNoLCBmaW5kVGV4dC5sZW5ndGgoKSkpOwotCQlpZiAoaW5kZXhPZk1hdGNoICE9IC0xKSB7Ci0JCQlzdHlsZWRUZXh0LnNldFNlbGVjdGlvblJhbmdlKGluZGV4T2ZNYXRjaCwgZmluZFRleHQubGVuZ3RoKCkpOwotCQkJc3R5bGVkVGV4dC5zaG93U2VsZWN0aW9uKCk7Ci0JCX0gZWxzZSB7Ci0JCQlTdHJpbmcgc2VsZWN0ZWRUZXh0ID0gc3R5bGVkVGV4dC5nZXRTZWxlY3Rpb25UZXh0KCk7Ci0JCQlpZiAoKG1hdGNoT3B0aW9ucyAmIENBU0VfU0VOU0lUSVZFX01BVENIKSA9PSAwKSB7Ci0JCQkJc2VsZWN0ZWRUZXh0ID0gc2VsZWN0ZWRUZXh0LnRvVXBwZXJDYXNlKCk7Ci0JCQl9Ci0JCQlpZiAoc2VsZWN0ZWRUZXh0LmVxdWFscyhmaW5kVGV4dCkpIHsKLQkJCQlpbmRleE9mTWF0Y2ggPSBzdHlsZWRUZXh0LmdldFNlbGVjdGlvblJhbmdlKCkueDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gaW5kZXhPZk1hdGNoOwotCi0JfQotCi0JcHJvdGVjdGVkIGludCBzdHlsZWRUZXh0UmVwbGFjZVRleHRBbmRTZWxlY3QoU3RyaW5nIHJlcGxhY2VUZXh0KSB7Ci0JCVBvaW50IHNlbGVjdGlvbk9mZnNldCA9IHN0eWxlZFRleHQuZ2V0U2VsZWN0aW9uUmFuZ2UoKTsKLQkJc3R5bGVkVGV4dC5yZXBsYWNlVGV4dFJhbmdlKHNlbGVjdGlvbk9mZnNldC54LCBzZWxlY3Rpb25PZmZzZXQueSwKLQkJCQlyZXBsYWNlVGV4dCk7Ci0JCXN0eWxlZFRleHQuc2V0U2VsZWN0aW9uUmFuZ2Uoc2VsZWN0aW9uT2Zmc2V0LngsIHJlcGxhY2VUZXh0Lmxlbmd0aCgpKTsKLQotCQlyZXR1cm4gMTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzdHlsZWRUZXh0UmVwbGFjZUFsbChTdHJpbmcgZmluZFRleHQsIFN0cmluZyByZXBsYWNlVGV4dCwKLQkJCWludCBtYXRjaE9wdGlvbnMpIHsKLQkJc3R5bGVkVGV4dC5zZXRTZWxlY3Rpb25SYW5nZSgwLCAwKTsKLQkJd2hpbGUgKHN0eWxlZFRleHRGaW5kVGV4dEFuZFNlbGVjdChmaW5kVGV4dCwgRk9SV0FSRF9NQVRDSCwKLQkJCQltYXRjaE9wdGlvbnMpICE9IC0xKSB7Ci0JCQlzdHlsZWRUZXh0UmVwbGFjZVRleHRBbmRTZWxlY3QocmVwbGFjZVRleHQpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNXb3JkQ2hhcihjaGFyIGMpIHsKLQkJaWYgKENoYXJhY3Rlci5pc0xldHRlck9yRGlnaXQoYykpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzUGFydE9mV29yZChTdHJpbmcgdGV4dCwgaW50IGluZGV4LCBpbnQgbGVuZ3RoKSB7Ci0JCWlmIChpbmRleCA+IDApCi0JCQlpZiAoaXNXb3JkQ2hhcih0ZXh0LmNoYXJBdChpbmRleCAtIDEpKSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJaWYgKHRleHQubGVuZ3RoKCkgPj0gaW5kZXggKyBsZW5ndGgpCi0JCQlpZiAoaXNXb3JkQ2hhcih0ZXh0LmNoYXJBdChpbmRleCArIGxlbmd0aCkpKQotCQkJCXJldHVybiB0cnVlOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIElSaWNoVGV4dCBnZXRSaWNoVGV4dCgpIHsKLQkJcmV0dXJuIHJpY2hUZXh0OwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFJpY2hUZXh0KElSaWNoVGV4dCByaWNoVGV4dCkgewotCQl0aGlzLnJpY2hUZXh0ID0gcmljaFRleHQ7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWlmIChkaWFsb2cgIT0gbnVsbCkgewotCQkJZGlhbG9nLmNsb3NlKCk7Ci0JCQlkaWFsb2cgPSBudWxsOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9hY3Rpb25zL0ZvbnROYW1lQWN0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9hY3Rpb25zL0ZvbnROYW1lQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzMWM1YWYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvYWN0aW9ucy9Gb250TmFtZUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTExICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLlNvcnRlZFNldDsKLWltcG9ydCBqYXZhLnV0aWwuVHJlZVNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5JUmljaFRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLQotLyoqCi0gKiBTZXRzIHRoZSBmb250IG5hbWUgZm9yIHRoZSBzZWxlY3RlZCB0ZXh0IGluIGEgcmljaCB0ZXh0IGNvbnRyb2wuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQGF1dGhvciBKZWZmIEhhcmR5Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBGb250TmFtZUFjdGlvbiBleHRlbmRzIFJpY2hUZXh0Q29tYm9BY3Rpb24gewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgRm9udE5hbWVBY3Rpb24oZmluYWwgSVJpY2hUZXh0IHJpY2hUZXh0KSB7Ci0JCXN1cGVyKHJpY2hUZXh0KTsKLQkJc2V0VG9vbFRpcFRleHQoUmljaFRleHRSZXNvdXJjZXMuZm9udE5hbWVBY3Rpb25fdG9vbFRpcFRleHQpOwotCQkvLyBnZXQgc3lzdGVtIGZvbnRzCi0JCVNvcnRlZFNldDxTdHJpbmc+IGZvbnRTZXQgPSBuZXcgVHJlZVNldDxTdHJpbmc+KCk7Ci0JCUZvbnREYXRhW10gZm9udHMgPSBEaXNwbGF5LmdldEN1cnJlbnQoKS5nZXRGb250TGlzdChudWxsLCB0cnVlKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmb250cy5sZW5ndGg7IGkrKykgewotCQkJZm9udFNldC5hZGQoKChGb250RGF0YSkgZm9udHNbaV0pLmdldE5hbWUoKSk7Ci0JCX0KLQkJaW5wdXQgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJaW5wdXQuYWRkKFJpY2hUZXh0UmVzb3VyY2VzLmZvbnROYW1lQWN0aW9uX0RlZmF1bHRGb250TmFtZSk7Ci0JCWZvciAoSXRlcmF0b3I8U3RyaW5nPiBpdGVyID0gZm9udFNldC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCVN0cmluZyBmb250TmFtZSA9IGl0ZXIubmV4dCgpOwotCQkJaW5wdXQuYWRkKGZvbnROYW1lKTsKLQkJfQotCQkKLQkJLy8gYWRkIGxpc3RlbmVyCi0JCXJpY2hUZXh0LmFkZExpc3RlbmVyKFNXVC5TRUxFQ1RFRCwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCQlTdHJpbmcgZm9udE5hbWUgPSByaWNoVGV4dC5nZXRTZWxlY3RlZCgpLmdldEZvbnROYW1lKCk7Ci0JCQkJaWYgKGZvbnROYW1lCi0JCQkJCQkuZXF1YWxzKFJpY2hUZXh0UmVzb3VyY2VzLmZvbnROYW1lQWN0aW9uX0NTU19EZWZhdWx0KQotCQkJCQkJfHwgZm9udE5hbWUKLQkJCQkJCQkJLmVxdWFscyhSaWNoVGV4dFJlc291cmNlcy5mb250TmFtZUFjdGlvbl9DU1NfRGVmYXVsdF9Nb3ppbGxhKQotCQkJCQkJfHwgZm9udE5hbWUuZXF1YWxzKCJkZWZhdWx0IikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQlmb250TmFtZSA9IFJpY2hUZXh0UmVzb3VyY2VzLmZvbnROYW1lQWN0aW9uX0RlZmF1bHRGb250TmFtZTsKLQkJCQl9Ci0JCQkJaW50IGluZGV4ID0gZmluZEZvbnROYW1lSW5JdGVtcyhmb250TmFtZSk7Ci0JCQkJc2V0Tm90aWZ5TGlzdGVuZXJzKGZhbHNlKTsKLQkJCQlnZXRDQ29tYm8oKS5zZWxlY3QoaW5kZXgpOwotCQkJCXNldE5vdGlmeUxpc3RlbmVycyh0cnVlKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJpdmF0ZSBpbnQgZmluZEZvbnROYW1lSW5JdGVtcyhTdHJpbmcgZm9udE5hbWUpIHsKLQkJaW50IGluZGV4ID0gLTE7Ci0JCWZvciAoSXRlcmF0b3I8U3RyaW5nPiBpdGVyID0gaW5wdXQuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlTdHJpbmcgZm9udCA9IGl0ZXIubmV4dCgpOwotCQkJaW5kZXgrKzsKLQkJCWlmIChmb250LmVxdWFsc0lnbm9yZUNhc2UoZm9udE5hbWUpKSB7Ci0JCQkJcmV0dXJuIGluZGV4OwotCQkJfQotCQl9Ci0JCXJldHVybiAtMTsKLQl9Ci0JCi0JLyoqCi0JICogRXhlY3V0ZXMgdGhlIGFjdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gcmljaFRleHQKLQkgKiAgICAgICAgICAgIGEgcmljaCB0ZXh0IGNvbnRyb2wKLQkgKiBAcGFyYW0gaW5kZXgKLQkgKiAgICAgICAgICAgIHRoZSBpbmRleCBvZiB0aGUgc2VsZWN0ZWQgaXRlbQotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoSVJpY2hUZXh0IHJpY2hUZXh0KSB7Ci0JCWlmIChyaWNoVGV4dCAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgc2VsZWN0ZWQgPSBnZXRDQ29tYm9TZWxlY3Rpb24oKTsKLQkJCWlmIChzZWxlY3RlZC5lcXVhbHMoUmljaFRleHRSZXNvdXJjZXMuZm9udE5hbWVBY3Rpb25fRGVmYXVsdEZvbnROYW1lKSkgewotCQkJCXJpY2hUZXh0LmV4ZWN1dGVDb21tYW5kKFJpY2hUZXh0Q29tbWFuZC5TRVRfRk9OVF9OQU1FLCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0gZWxzZSB7Ci0JCQkJcmljaFRleHQuZXhlY3V0ZUNvbW1hbmQoUmljaFRleHRDb21tYW5kLlNFVF9GT05UX05BTUUsIHNlbGVjdGVkKTsKLQkJCX0KLQkJfQotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBDb2xsZWN0aW9uPFN0cmluZz4gZ2V0SW5wdXQoKSB7Ci0JCXJldHVybiBpbnB1dDsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9hY3Rpb25zL0ZvbnRTaXplQWN0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9hY3Rpb25zL0ZvbnRTaXplQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhOGZjYjEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvYWN0aW9ucy9Gb250U2l6ZUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LklSaWNoVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotCi0vKioKLSAqIFNldHMgdGhlIGZvbnQgc2l6ZSBmb3IgdGhlIHNlbGVjdGVkIHRleHQgaW4gYSByaWNoIHRleHQgY29udHJvbC4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAYXV0aG9yIEplZmYgSGFyZHkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEZvbnRTaXplQWN0aW9uIGV4dGVuZHMgUmljaFRleHRDb21ib0FjdGlvbiB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBGb250U2l6ZUFjdGlvbihmaW5hbCBJUmljaFRleHQgcmljaFRleHQpIHsKLQkJc3VwZXIocmljaFRleHQpOwotCQlzZXRUb29sVGlwVGV4dChSaWNoVGV4dFJlc291cmNlcy5mb250U2l6ZUFjdGlvbl90b29sVGlwVGV4dCk7Ci0JCWlucHV0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0KLQkJaW5wdXQuYWRkKCJEZWZhdWx0Iik7IC8vJE5PTi1OTFMtMSQKLQkJaW5wdXQuYWRkKCIxIik7IC8vJE5PTi1OTFMtMSQKLQkJaW5wdXQuYWRkKCIyIik7IC8vJE5PTi1OTFMtMSQKLQkJaW5wdXQuYWRkKCIzIik7IC8vJE5PTi1OTFMtMSQKLQkJaW5wdXQuYWRkKCI0Iik7IC8vJE5PTi1OTFMtMSQKLQkJaW5wdXQuYWRkKCI1Iik7IC8vJE5PTi1OTFMtMSQKLQkJaW5wdXQuYWRkKCI2Iik7IC8vJE5PTi1OTFMtMSQKLQkJaW5wdXQuYWRkKCI3Iik7IC8vJE5PTi1OTFMtMSQJCQotCQkvLyBhZGQgbGlzdGVuZXIKLQkJcmljaFRleHQuYWRkTGlzdGVuZXIoU1dULlNFTEVDVEVELCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJCS8vIG1vemlsbGEgcmV0dXJucyAiZGVmYXVsdCIgaWYgbm8gc2l6ZSBpcyBhcHBsaWVkCi0JCQkJLy8gSUUgcmV0dXJucyAyIGlmIG5vIHNpemUgaXMgYXBwbGllZAotCQkJCVN0cmluZyBmb250U2l6ZSA9IHJpY2hUZXh0LmdldFNlbGVjdGVkKCkuZ2V0Rm9udFNpemUoKTsKLQkJCQlpbnQgaW5kZXggPSAtMTsKLQkJCQlpZiAoZm9udFNpemUuZXF1YWxzKCJkZWZhdWx0IikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQlpbmRleCA9IDA7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCWluZGV4ID0gSW50ZWdlci5wYXJzZUludChmb250U2l6ZSk7Ci0JCQkJCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkvLyBsZWF2ZSBpbmRleCBhdCAtMSBzbyBub3RoaW5nIGlzIHNlbGVjdGVkCi0JCQkJCX0KLQkJCQl9Ci0JCQkJc2V0Tm90aWZ5TGlzdGVuZXJzKGZhbHNlKTsKLQkJCQlnZXRDQ29tYm8oKS5zZWxlY3QoaW5kZXgpOwotCQkJCXNldE5vdGlmeUxpc3RlbmVycyh0cnVlKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JLyoqCi0JICogRXhlY3V0ZXMgdGhlIGFjdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gcmljaFRleHQKLQkgKiAgICAgICAgICAgIGEgcmljaCB0ZXh0IGNvbnRyb2wKLQkgKiBAcGFyYW0gaW5kZXgKLQkgKiAgICAgICAgICAgIHRoZSBpbmRleCBvZiB0aGUgc2VsZWN0ZWQgaXRlbQotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoSVJpY2hUZXh0IHJpY2hUZXh0KSB7Ci0JCWlmIChyaWNoVGV4dCAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgc2VsZWN0ZWQgPSBnZXRDQ29tYm9TZWxlY3Rpb24oKTsKLQkJCWlmICgiRGVmYXVsdCIuZXF1YWxzKHNlbGVjdGVkKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJcmljaFRleHQuZXhlY3V0ZUNvbW1hbmQoUmljaFRleHRDb21tYW5kLlNFVF9GT05UX1NJWkUsICIiKTsgLy8kTk9OLU5MUy0xJAotCQkJfSBlbHNlIHsKLQkJCQlyaWNoVGV4dC5leGVjdXRlQ29tbWFuZChSaWNoVGV4dENvbW1hbmQuU0VUX0ZPTlRfU0laRSwKLQkJCQkJCXNlbGVjdGVkKTsKLQkJCX0KLQkJfQotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBDb2xsZWN0aW9uPFN0cmluZz4gZ2V0SW5wdXQoKSB7Ci0JCXJldHVybiBpbnB1dDsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9hY3Rpb25zL0ZvbnRTdHlsZUFjdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvYWN0aW9ucy9Gb250U3R5bGVBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTViNWFkNS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9hY3Rpb25zL0ZvbnRTdHlsZUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LklSaWNoVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuaHRtbC5Gb250U3R5bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLQotLyoqCi0gKiBTZXRzIHRoZSBmb250IHN0eWxlIGZvciB0aGUgc2VsZWN0ZWQgdGV4dCBpbiBhIHJpY2ggdGV4dCBjb250cm9sLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBhdXRob3IgSmVmZiBIYXJkeQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRm9udFN0eWxlQWN0aW9uIGV4dGVuZHMgUmljaFRleHRDb21ib0FjdGlvbiB7Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgRm9udFN0eWxlQWN0aW9uKGZpbmFsIElSaWNoVGV4dCByaWNoVGV4dCkgewotCQlzdXBlcihyaWNoVGV4dCk7Ci0JCXNldFRvb2xUaXBUZXh0KFJpY2hUZXh0UmVzb3VyY2VzLmZvbnRTdHlsZUFjdGlvbl90b29sVGlwVGV4dCk7Ci0JCQotCQlpbnB1dCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlpbnB1dC5hZGQoRm9udFN0eWxlLk5PUk1BTC5nZXROYW1lKCkpOwotCQlpbnB1dC5hZGQoRm9udFN0eWxlLlNFQ1RJT05fSEVBRElORy5nZXROYW1lKCkpOwotCQlpbnB1dC5hZGQoRm9udFN0eWxlLlNVQlNFQ1RJT05fSEVBRElORy5nZXROYW1lKCkpOwotCQlpbnB1dC5hZGQoRm9udFN0eWxlLlNVQl9TVUJTRUNUSU9OX0hFQURJTkcuZ2V0TmFtZSgpKTsKLQkJaW5wdXQuYWRkKEZvbnRTdHlsZS5RVU9URS5nZXROYW1lKCkpOwotCQlpbnB1dC5hZGQoRm9udFN0eWxlLkNPREVfU0FNUExFLmdldE5hbWUoKSk7Ci0JCS8vIGFkZCBsaXN0ZW5lcgotCQlyaWNoVGV4dC5hZGRMaXN0ZW5lcihTV1QuU0VMRUNURUQsIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQkJU3RyaW5nIGJsb2NrU3R5bGUgPSByaWNoVGV4dC5nZXRTZWxlY3RlZCgpLmdldEJsb2NrU3R5bGUoKTsKLQkJCQlTdHJpbmcgbmFtZSA9IEZvbnRTdHlsZS5nZXRGb250U3R5bGVOYW1lKGJsb2NrU3R5bGUpOwotCQkJCQotCQkJCWludCBpbmRleCA9ICgoTGlzdDxTdHJpbmc+KWlucHV0KS5pbmRleE9mKG5hbWUpOwotCQkJCXNldE5vdGlmeUxpc3RlbmVycyhmYWxzZSk7Ci0JCQkJZ2V0Q0NvbWJvKCkuc2VsZWN0KGluZGV4KTsKLQkJCQlzZXROb3RpZnlMaXN0ZW5lcnModHJ1ZSk7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCS8qKgotCSAqIEV4ZWN1dGVzIHRoZSBhY3Rpb24uCi0JICogCi0JICogQHBhcmFtIHJpY2hUZXh0Ci0JICogICAgICAgICAgICBhIHJpY2ggdGV4dCBjb250cm9sCi0JICogQHBhcmFtIGluZGV4Ci0JICogICAgICAgICAgICB0aGUgaW5kZXggb2YgdGhlIHNlbGVjdGVkIGl0ZW0KLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKElSaWNoVGV4dCByaWNoVGV4dCkgewotCQlpZiAocmljaFRleHQgIT0gbnVsbCkgewotCQkJU3RyaW5nIHNlbGVjdGVkID0gZ2V0Q0NvbWJvU2VsZWN0aW9uKCk7Ci0JCQlTdHJpbmcgdmFsdWUgPSBGb250U3R5bGUuZ2V0Rm9udFN0eWxlVmFsdWUoc2VsZWN0ZWQpOwotCQkJcmljaFRleHQuZXhlY3V0ZUNvbW1hbmQoUmljaFRleHRDb21tYW5kLlNFVF9GT05UX1NUWUxFLCB2YWx1ZSk7Ci0JCX0KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQ29sbGVjdGlvbjxTdHJpbmc+IGdldElucHV0KCkgewotCQlyZXR1cm4gaW5wdXQ7Ci0JfQotCi0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9hY3Rpb25zL0lCYXNlUmljaFRleHRBY3Rpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2FjdGlvbnMvSUJhc2VSaWNoVGV4dEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOWJiMDQyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2FjdGlvbnMvSUJhc2VSaWNoVGV4dEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmFjdGlvbnM7Ci0KLS8qKgotICogVGhlIGJhc2UgaW50ZXJmYWNlIGZvciBhIHJpY2ggdGV4dCBhY3Rpb24uCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElCYXNlUmljaFRleHRBY3Rpb24gewotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdG9vbCB0aXAgZm9yIHRoZSBhY3Rpb24uCi0JICogCi0JICogQHJldHVybiB0aGUgdG9vbCB0aXAgdGV4dAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VG9vbFRpcFRleHQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHRvb2wgdGlwIGZvciB0aGUgYWN0aW9uLgotCSAqIAotCSAqIEBwYXJhbSB0b29sVGlwVGV4dAotCSAqICAgICAgICAgICAgdGhlIHRvb2wgdGlwIHRleHQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUb29sVGlwVGV4dChTdHJpbmcgdG9vbFRpcFRleHQpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZW5hYmxlZCBzdGF0dXMgb2YgdGhlIGFjdGlvbi4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIGVuYWJsZWQsIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiBub3QKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBnZXRFbmFibGVkKCk7Ci0KLQkvKioKLQkgKiBFbmFibGVzIG9yIGRpc2FibGVzIHRoZSBhY3Rpb24uCi0JICogCi0JICogQHBhcmFtIGVuYWJsZWQKLQkgKiAgICAgICAgICAgIElmIDxjb2RlPnRydWU8L2NvZGU+LCBlbmFibGUgdGhlIGFjdGlvbi4gaWYKLQkgKiAgICAgICAgICAgIDxjb2RlPmZhbHNlPC9jb2RlPiwgZGlzYWJsZSBpdAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVuYWJsZWQoYm9vbGVhbiBlbmFibGVkKTsKLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvYWN0aW9ucy9JUmljaFRleHRBY3Rpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2FjdGlvbnMvSVJpY2hUZXh0QWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjMGE1MWUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvYWN0aW9ucy9JUmljaFRleHRBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LklSaWNoVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVG9vbEl0ZW07Ci0KLS8qKgotICogVGhlIGludGVyZmFjZSBmb3IgYSByaWNoIHRleHQgYnV0dG9uIGFjdGlvbi4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAYXV0aG9yIEplZmYgSGFyZHkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJUmljaFRleHRBY3Rpb24gZXh0ZW5kcyBJQmFzZVJpY2hUZXh0QWN0aW9uIHsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGltYWdlIGZvciB0aGUgYWN0aW9uLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGltYWdlIGZvciB0aGUgYWN0aW9uCi0JICovCi0JcHVibGljIEltYWdlIGdldEltYWdlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBpbWFnZSBmb3IgdGhlIGFjdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gaW1hZ2UKLQkgKiAgICAgICAgICAgIHRoZSBpbWFnZSBmb3IgdGhlIGFjdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEltYWdlKEltYWdlIGltYWdlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGRpc2FibGVkIGltYWdlIGZvciB0aGUgYWN0aW9uLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGRpc2FibGVkIGltYWdlIGZvciB0aGUgYWN0aW9uCi0JICovCi0JcHVibGljIEltYWdlIGdldERpc2FibGVkSW1hZ2UoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIGRpc2FibGVkIGltYWdlIGZvciB0aGUgYWN0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBpbWFnZQotCSAqICAgICAgICAgICAgdGhlIGRpc2FibGVkIGltYWdlIGZvciB0aGUgYWN0aW9uCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGlzYWJsZWRJbWFnZShJbWFnZSBpbWFnZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgYWN0aW9uIHNob3VsZCBiZSBkaXNhYmxlZCB3aGVuIHRoZQotCSAqIHJpY2ggdGV4dCBlZGl0b3IgaXMgaW4gcmVhZG9ubHkgbW9kZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBkaXNhYmxlSW5SZWFkT25seU1vZGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBhY3Rpb24gc2hvdWxkIGJlIGRpc2FibGVkIHdoZW4gdGhlCi0JICogcmljaCB0ZXh0IGVkaXRvciBpcyBpbiBzb3VyY2UgZWRpdCBtb2RlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGRpc2FibGVJblNvdXJjZU1vZGUoKTsKLQotCS8qKgotCSAqIEV4ZWN1dGVzIHRoZSBhY3Rpb24uCi0JICogCi0JICogQHBhcmFtIHJpY2hUZXh0Ci0JICogICAgICAgICAgICBhIHJpY2ggdGV4dCBjb250cm9sCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZShJUmljaFRleHQgcmljaFRleHQpOwotCQotCS8qKgotCSAqIFNldHMgdGhlIGFjdGlvbidzIFRvb2xJdGVtCi0JICogQHBhcmFtIHRvb2xJdGVtCi0JICovCi0JcHVibGljIHZvaWQgc2V0VG9vbEl0ZW0oVG9vbEl0ZW0gdG9vbEl0ZW0pOwotCQotCS8qKgotCSAqIEdldHMgdGhlIFNXVCBUb29sSXRlbSBTdHlsZSB0byBiZSB1c2VkIGZvciB0aGlzIGFjdGlvbgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0U3R5bGUoKTsKLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvYWN0aW9ucy9JUmljaFRleHRDb21ib0FjdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvYWN0aW9ucy9JUmljaFRleHRDb21ib0FjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMmU4ZWJjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2FjdGlvbnMvSVJpY2hUZXh0Q29tYm9BY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS5hY3Rpb25zLkNDb21ib0NvbnRyaWJ1dGlvbkl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LklSaWNoVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXI7Ci0KLS8qKgotICogVGhlIGludGVyZmFjZSBmb3IgYSByaWNoIHRleHQgY29tYm8gYWN0aW9uLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBhdXRob3IgSmVmZiBIYXJkeQotICogQHNpbmNlIDEuMAotICogCi0gKiBAZGVwcmVjYXRlZCB1bnVzZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBJUmljaFRleHRDb21ib0FjdGlvbiBleHRlbmRzIElCYXNlUmljaFRleHRBY3Rpb24gewotCi0vLwkvKioKLS8vCSAqIEFkZHMgYW4gaXRlbS4KLS8vCSAqIAotLy8JICogQHBhcmFtIGl0ZW0KLS8vCSAqICAgICAgICAgICAgdGhlIGl0ZW0gdG8gYmUgYWRkZWQKLS8vCSAqLwotLy8JcHVibGljIHZvaWQgYWRkSXRlbShTdHJpbmcgaXRlbSk7Ci0vLwotLy8JLyoqCi0vLwkgKiBSZXR1cm5zIGFsbCBpdGVtcy4KLS8vCSAqIAotLy8JICogQHJldHVybiBhbiBhcnJheSBvZiBpdGVtcwotLy8JICovCi0vLwlwdWJsaWMgU3RyaW5nW10gZ2V0SXRlbXMoKTsKLQotCS8qKgotCSAqIEV4ZWN1dGVzIHRoZSBhY3Rpb24uCi0JICogCi0JICogQHBhcmFtIHJpY2hUZXh0Ci0JICogICAgICAgICAgICBhIHJpY2ggdGV4dCBjb250cm9sCi0JICogQHBhcmFtIGluZGV4Ci0JICogICAgICAgICAgICB0aGUgaW5kZXggb2YgdGhlIHNlbGVjdGVkIGl0ZW0KLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKElSaWNoVGV4dCByaWNoVGV4dCwgaW50IGluZGV4KTsKLQotCXB1YmxpYyBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciBnZXRDb250ZW50UHJvdmlkZXIoKTsKLQkKLQlwdWJsaWMgSUxhYmVsUHJvdmlkZXIgZ2V0TGFiZWxQcm92aWRlcigpOwotCQotCXB1YmxpYyBPYmplY3QgZ2V0SW5wdXQoKTsKLQkKLQkvKioKLQkgKiBTZXRzIHRoZSBhY3Rpb24ncyBDb250cmlidXRpb25JdGVtCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29udHJpYnV0aW9uSXRlbShDQ29tYm9Db250cmlidXRpb25JdGVtIGl0ZW0pOwotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9hY3Rpb25zL0luZGVudEFjdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvYWN0aW9ucy9JbmRlbnRBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTBkNjRlNy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9hY3Rpb25zL0luZGVudEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuSVJpY2hUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0SW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLQotLyoqCi0gKiBJbmRlbnRzIHRoZSBzZWxlY3RlZCB0ZXh0IGluIGEgcmljaCB0ZXh0IGNvbnRyb2wuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgSW5kZW50QWN0aW9uIGV4dGVuZHMgUmljaFRleHRBY3Rpb24gewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgSW5kZW50QWN0aW9uKElSaWNoVGV4dCByaWNoVGV4dCkgewotCQlzdXBlcihyaWNoVGV4dCwgSUFjdGlvbi5BU19QVVNIX0JVVFRPTik7Ci0JCXNldEltYWdlRGVzY3JpcHRvcihSaWNoVGV4dEltYWdlcy5JTUdfREVTQ19JTkRFTlQpOwotCQlzZXREaXNhYmxlZEltYWdlRGVzY3JpcHRvcihSaWNoVGV4dEltYWdlcy5ESVNBQkxFRF9JTUdfREVTQ19JTkRFTlQpOwotCQlzZXRUb29sVGlwVGV4dChSaWNoVGV4dFJlc291cmNlcy5pbmRlbnRBY3Rpb25fdG9vbFRpcFRleHQpOyAKLQl9Ci0KLQkvKioKLQkgKiBFeGVjdXRlcyB0aGUgYWN0aW9uLgotCSAqIAotCSAqIEBwYXJhbSByaWNoVGV4dAotCSAqICAgICAgICAgICAgYSByaWNoIHRleHQgY29udHJvbAotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoSVJpY2hUZXh0IHJpY2hUZXh0KSB7Ci0JCWlmIChyaWNoVGV4dCAhPSBudWxsKSB7Ci0JCQlyaWNoVGV4dC5leGVjdXRlQ29tbWFuZChSaWNoVGV4dENvbW1hbmQuSU5ERU5UKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvYWN0aW9ucy9JdGFsaWNBY3Rpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2FjdGlvbnMvSXRhbGljQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1ODdjNDcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvYWN0aW9ucy9JdGFsaWNBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LklSaWNoVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dEltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLQotLyoqCi0gKiBUb2dnbGVzIHRoZSAnaXRhbGljJyBhdHRyaWJ1dGUgb2YgdGhlIHNlbGVjdGVkIHRleHQgaW4gYSByaWNoIHRleHQgY29udHJvbC4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAYXV0aG9yIEplZmYgSGFyZHkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEl0YWxpY0FjdGlvbiBleHRlbmRzIFJpY2hUZXh0QWN0aW9uIHsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIEl0YWxpY0FjdGlvbihmaW5hbCBJUmljaFRleHQgcmljaFRleHQpIHsKLQkJc3VwZXIocmljaFRleHQsIElBY3Rpb24uQVNfQ0hFQ0tfQk9YKTsKLQkJc2V0SW1hZ2VEZXNjcmlwdG9yKFJpY2hUZXh0SW1hZ2VzLklNR19ERVNDX0lUQUxJQyk7Ci0JCXNldFRvb2xUaXBUZXh0KFJpY2hUZXh0UmVzb3VyY2VzLml0YWxpY0FjdGlvbl90b29sVGlwVGV4dCk7Ci0JCS8vIGFkZCBsaXN0ZW5lcgotCQlyaWNoVGV4dC5hZGRMaXN0ZW5lcihTV1QuU0VMRUNURUQsIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQkJc2V0Q2hlY2tlZChyaWNoVGV4dC5nZXRTZWxlY3RlZCgpLmlzSXRhbGljKCkpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQkvKioKLQkgKiBFeGVjdXRlcyB0aGUgYWN0aW9uLgotCSAqIAotCSAqIEBwYXJhbSByaWNoVGV4dAotCSAqICAgICAgICAgICAgYSByaWNoIHRleHQgY29udHJvbAotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoSVJpY2hUZXh0IHJpY2hUZXh0KSB7Ci0JCWlmIChyaWNoVGV4dCAhPSBudWxsKSB7Ci0JCQlyaWNoVGV4dC5leGVjdXRlQ29tbWFuZChSaWNoVGV4dENvbW1hbmQuSVRBTElDKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2FjdGlvbnMvSnVzdGlmeUNlbnRlckFjdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvYWN0aW9ucy9KdXN0aWZ5Q2VudGVyQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2MWI5NzQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvYWN0aW9ucy9KdXN0aWZ5Q2VudGVyQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5JUmljaFRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRJbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotCi0vKioKLSAqIENlbnRlciBqdXN0aWZpZXMgdGhlIHNlbGVjdGVkIHRleHQgaW4gYSByaWNoIHRleHQgY29udHJvbC4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBKdXN0aWZ5Q2VudGVyQWN0aW9uIGV4dGVuZHMgUmljaFRleHRBY3Rpb24gewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgSnVzdGlmeUNlbnRlckFjdGlvbihJUmljaFRleHQgcmljaFRleHQpIHsKLQkJc3VwZXIocmljaFRleHQsIElBY3Rpb24uQVNfUFVTSF9CVVRUT04pOwotCQlzZXRJbWFnZURlc2NyaXB0b3IoUmljaFRleHRJbWFnZXMuSU1HX0RFU0NfSlVTVElGWV9DRU5URVIpOwotCQlzZXRUb29sVGlwVGV4dChSaWNoVGV4dFJlc291cmNlcy5qdXN0aWZ5Q2VudGVyQWN0aW9uX3Rvb2xUaXBUZXh0KTsgCi0JfQotCi0JLyoqCi0JICogRXhlY3V0ZXMgdGhlIGFjdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gcmljaFRleHQKLQkgKiAgICAgICAgICAgIGEgcmljaCB0ZXh0IGNvbnRyb2wKLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKElSaWNoVGV4dCByaWNoVGV4dCkgewotCQlpZiAocmljaFRleHQgIT0gbnVsbCkgewotCQkJcmljaFRleHQuZXhlY3V0ZUNvbW1hbmQoUmljaFRleHRDb21tYW5kLkpVU1RJRllfQ0VOVEVSKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvYWN0aW9ucy9KdXN0aWZ5RnVsbEFjdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvYWN0aW9ucy9KdXN0aWZ5RnVsbEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZTJiMTE3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2FjdGlvbnMvSnVzdGlmeUZ1bGxBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LklSaWNoVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dEltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci0KLS8qKgotICogRnVsbHkganVzdGlmaWVzIHRoZSBzZWxlY3RlZCB0ZXh0IGluIGEgcmljaCB0ZXh0IGNvbnRyb2wuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgSnVzdGlmeUZ1bGxBY3Rpb24gZXh0ZW5kcyBSaWNoVGV4dEFjdGlvbiB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBKdXN0aWZ5RnVsbEFjdGlvbihJUmljaFRleHQgcmljaFRleHQpIHsKLQkJc3VwZXIocmljaFRleHQsIElBY3Rpb24uQVNfUFVTSF9CVVRUT04pOwotCQlzZXRJbWFnZURlc2NyaXB0b3IoUmljaFRleHRJbWFnZXMuSU1HX0RFU0NfSlVTVElGWV9GVUxMKTsKLQkJc2V0VG9vbFRpcFRleHQoUmljaFRleHRSZXNvdXJjZXMuanVzdGlmeUZ1bGxBY3Rpb25fdG9vbFRpcFRleHQpOyAKLQl9Ci0KLQkvKioKLQkgKiBFeGVjdXRlcyB0aGUgYWN0aW9uLgotCSAqIAotCSAqIEBwYXJhbSByaWNoVGV4dAotCSAqICAgICAgICAgICAgYSByaWNoIHRleHQgY29udHJvbAotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoSVJpY2hUZXh0IHJpY2hUZXh0KSB7Ci0JCWlmIChyaWNoVGV4dCAhPSBudWxsKSB7Ci0JCQlyaWNoVGV4dC5leGVjdXRlQ29tbWFuZChSaWNoVGV4dENvbW1hbmQuSlVTVElGWV9GVUxMKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvYWN0aW9ucy9KdXN0aWZ5TGVmdEFjdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvYWN0aW9ucy9KdXN0aWZ5TGVmdEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZDkxNTllLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2FjdGlvbnMvSnVzdGlmeUxlZnRBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LklSaWNoVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dEltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci0KLS8qKgotICogTGVmdCBqdXN0aWZpZXMgdGhlIHNlbGVjdGVkIHRleHQgaW4gYSByaWNoIHRleHQgY29udHJvbC4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBKdXN0aWZ5TGVmdEFjdGlvbiBleHRlbmRzIFJpY2hUZXh0QWN0aW9uIHsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIEp1c3RpZnlMZWZ0QWN0aW9uKElSaWNoVGV4dCByaWNoVGV4dCkgewotCQlzdXBlcihyaWNoVGV4dCwgSUFjdGlvbi5BU19QVVNIX0JVVFRPTik7Ci0JCXNldEltYWdlRGVzY3JpcHRvcihSaWNoVGV4dEltYWdlcy5JTUdfREVTQ19KVVNUSUZZX0xFRlQpOwotCQlzZXRUb29sVGlwVGV4dChSaWNoVGV4dFJlc291cmNlcy5qdXN0aWZ5TGVmdEFjdGlvbl90b29sVGlwVGV4dCk7IAotCX0KLQotCS8qKgotCSAqIEV4ZWN1dGVzIHRoZSBhY3Rpb24uCi0JICogCi0JICogQHBhcmFtIHJpY2hUZXh0Ci0JICogICAgICAgICAgICBhIHJpY2ggdGV4dCBjb250cm9sCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZShJUmljaFRleHQgcmljaFRleHQpIHsKLQkJaWYgKHJpY2hUZXh0ICE9IG51bGwpIHsKLQkJCXJpY2hUZXh0LmV4ZWN1dGVDb21tYW5kKFJpY2hUZXh0Q29tbWFuZC5KVVNUSUZZX0xFRlQpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9hY3Rpb25zL0p1c3RpZnlSaWdodEFjdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvYWN0aW9ucy9KdXN0aWZ5UmlnaHRBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzNlMDg1NjIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvYWN0aW9ucy9KdXN0aWZ5UmlnaHRBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LklSaWNoVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dEltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci0KLS8qKgotICogUmlnaHQganVzdGlmaWVzIHRoZSBzZWxlY3RlZCB0ZXh0IGluIGEgcmljaCB0ZXh0IGNvbnRyb2wuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgSnVzdGlmeVJpZ2h0QWN0aW9uIGV4dGVuZHMgUmljaFRleHRBY3Rpb24gewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgSnVzdGlmeVJpZ2h0QWN0aW9uKElSaWNoVGV4dCByaWNoVGV4dCkgewotCQlzdXBlcihyaWNoVGV4dCwgSUFjdGlvbi5BU19QVVNIX0JVVFRPTik7Ci0JCXNldEltYWdlRGVzY3JpcHRvcihSaWNoVGV4dEltYWdlcy5JTUdfREVTQ19KVVNUSUZZX1JJR0hUKTsKLQkJc2V0VG9vbFRpcFRleHQoUmljaFRleHRSZXNvdXJjZXMuanVzdGlmeVJpZ2h0QWN0aW9uX3Rvb2xUaXBUZXh0KTsgCi0JfQotCi0JLyoqCi0JICogRXhlY3V0ZXMgdGhlIGFjdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gcmljaFRleHQKLQkgKiAgICAgICAgICAgIGEgcmljaCB0ZXh0IGNvbnRyb2wKLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKElSaWNoVGV4dCByaWNoVGV4dCkgewotCQlpZiAocmljaFRleHQgIT0gbnVsbCkgewotCQkJcmljaFRleHQuZXhlY3V0ZUNvbW1hbmQoUmljaFRleHRDb21tYW5kLkpVU1RJRllfUklHSFQpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9hY3Rpb25zL091dGRlbnRBY3Rpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2FjdGlvbnMvT3V0ZGVudEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNWE5NTczLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2FjdGlvbnMvT3V0ZGVudEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuSVJpY2hUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0SW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLQotLyoqCi0gKiBJbmRlbnRzIHRoZSBzZWxlY3RlZCB0ZXh0IGluIGEgcmljaCB0ZXh0IGNvbnRyb2wuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgT3V0ZGVudEFjdGlvbiBleHRlbmRzIFJpY2hUZXh0QWN0aW9uIHsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIE91dGRlbnRBY3Rpb24oSVJpY2hUZXh0IHJpY2hUZXh0KSB7Ci0JCXN1cGVyKHJpY2hUZXh0LCBJQWN0aW9uLkFTX1BVU0hfQlVUVE9OKTsKLQkJc2V0SW1hZ2VEZXNjcmlwdG9yKFJpY2hUZXh0SW1hZ2VzLklNR19ERVNDX09VVERFTlQpOwotCQlzZXREaXNhYmxlZEltYWdlRGVzY3JpcHRvcihSaWNoVGV4dEltYWdlcy5ESVNBQkxFRF9JTUdfREVTQ19PVVRERU5UKTsKLQkJc2V0VG9vbFRpcFRleHQoUmljaFRleHRSZXNvdXJjZXMub3V0ZGVudEFjdGlvbl90b29sVGlwVGV4dCk7IAotCX0KLQotCS8qKgotCSAqIEV4ZWN1dGVzIHRoZSBhY3Rpb24uCi0JICogCi0JICogQHBhcmFtIHJpY2hUZXh0Ci0JICogICAgICAgICAgICBhIHJpY2ggdGV4dCBjb250cm9sCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZShJUmljaFRleHQgcmljaFRleHQpIHsKLQkJaWYgKHJpY2hUZXh0ICE9IG51bGwpIHsKLQkJCXJpY2hUZXh0LmV4ZWN1dGVDb21tYW5kKFJpY2hUZXh0Q29tbWFuZC5PVVRERU5UKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvYWN0aW9ucy9QYXN0ZUFjdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvYWN0aW9ucy9QYXN0ZUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OTE4ZGZkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2FjdGlvbnMvUGFzdGVBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzNyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuYWN0aW9uczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLlN0YWNrOwotaW1wb3J0IGphdmEudXRpbC5yZWdleC5NYXRjaGVyOwotaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5zZXJ2aWNlYWJpbGl0eS5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS51dGlsLkNsaXBib2FyZFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5GaWxlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLk5ldFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LklSaWNoVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRJbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlN0eWxlZFRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5DbGlwYm9hcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5IVE1MVHJhbnNmZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLQotLyoqCi0gKiBQYXN0ZXMgdGV4dCBmcm9tIHRoZSBjbGlwYm9hcmQgb250byBhIHJpY2ggdGV4dCBjb250cm9sLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFBhc3RlQWN0aW9uIGV4dGVuZHMgUmljaFRleHRBY3Rpb24gewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNPVVJDRV9VUkwgPSAiU291cmNlVVJMOiI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBIVE1fRVhUID0gIi5odG0iOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSFRNTF9FWFQgPSAiLmh0bWwiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBQYXR0ZXJuIEhSRUZfUkVGRVJFTkNFUyA9IFBhdHRlcm4KLQkJCS5jb21waWxlKAotCQkJCQkiaHJlZlxccyo9XFxzKlwiKC4qPylcIiIsIFBhdHRlcm4uQ0FTRV9JTlNFTlNJVElWRSB8IFBhdHRlcm4uRE9UQUxMKTsgLy8kTk9OLU5MUy0xJAotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBQYXR0ZXJuIHBfaW1hZ2VfcmVmID0gUGF0dGVybgotCQkJLmNvbXBpbGUoCi0JCQkJCSIoPChpbWd8aWZyYW1lKS4qP3NyY1xccyo9XFxzKlwiKSguKj8pKFwiKSIsIFBhdHRlcm4uQ0FTRV9JTlNFTlNJVElWRSB8IFBhdHRlcm4uRE9UQUxMKTsgLy8kTk9OLU5MUy0xJAotCi0JcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmcgc291cmNlVVJMU3RyID0gIiI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgTG9nZ2VyIGxvZ2dlcjsKLQkKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgUkVTT1VSQ0VTID0gInJlc291cmNlcyI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFBhc3RlQWN0aW9uKElSaWNoVGV4dCByaWNoVGV4dCkgewotCQlzdXBlcihyaWNoVGV4dCwgSUFjdGlvbi5BU19QVVNIX0JVVFRPTik7Ci0JCXNldEltYWdlRGVzY3JpcHRvcihSaWNoVGV4dEltYWdlcy5JTUdfREVTQ19QQVNURSk7Ci0JCXNldERpc2FibGVkSW1hZ2VEZXNjcmlwdG9yKFJpY2hUZXh0SW1hZ2VzLkRJU0FCTEVEX0lNR19ERVNDX1BBU1RFKTsKLQkJc2V0VG9vbFRpcFRleHQoUmljaFRleHRSZXNvdXJjZXMucGFzdGVBY3Rpb25fdG9vbFRpcFRleHQpOwotCQlsb2dnZXIgPSBSaWNoVGV4dFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIGFjdGlvbiBzaG91bGQgYmUgZGlzYWJsZWQgd2hlbiB0aGUKLQkgKiByaWNoIHRleHQgZWRpdG9yIGlzIGluIHNvdXJjZSBlZGl0IG1vZGUuCi0JICovCi0JcHVibGljIGJvb2xlYW4gZGlzYWJsZUluU291cmNlTW9kZSgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEV4ZWN1dGVzIHRoZSBhY3Rpb24uCi0JICogCi0JICogQHBhcmFtIHJpY2hUZXh0Ci0JICogICAgICAgICAgICBhIHJpY2ggdGV4dCBjb250cm9sCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZShJUmljaFRleHQgcmljaFRleHQpIHsKLQkJaWYgKHJpY2hUZXh0ICE9IG51bGwpIHsKLQkJCWNvcHlMaW5rUmVzb3VyY2VzKHJpY2hUZXh0KTsKLQkJCWlmIChyaWNoVGV4dCBpbnN0YW5jZW9mIFJpY2hUZXh0RWRpdG9yCi0JCQkJCSYmICgoUmljaFRleHRFZGl0b3IpIHJpY2hUZXh0KS5pc0hUTUxUYWJTZWxlY3RlZCgpKSB7Ci0JCQkJU3R5bGVkVGV4dCBzdHlsZWRUZXh0ID0gKChSaWNoVGV4dEVkaXRvcikgcmljaFRleHQpCi0JCQkJCQkuZ2V0U291cmNlRWRpdCgpOwotCQkJCXN0eWxlZFRleHQucGFzdGUoKTsKLQkJCX0gZWxzZSB7Ci0JCQkJcmljaFRleHQuZXhlY3V0ZUNvbW1hbmQoUmljaFRleHRDb21tYW5kLlBBU1RFLCBzb3VyY2VVUkxTdHIpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQ29waWVzIHRoZSBsaW5rIHJlc291cmNlcy4KLQkgKiAKLQkgKiBAcGFyYW0gcmljaFRleHQKLQkgKiAgICAgICAgICAgIGEgcmljaCB0ZXh0IGNvbnRyb2wKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb3B5TGlua1Jlc291cmNlcyhJUmljaFRleHQgcmljaFRleHQpIHsKLQkJdHJ5IHsKLQkJCXNvdXJjZVVSTFN0ciA9IENsaXBib2FyZFV0aWwuZ2V0SFRNTFNvdXJjZVVSTCgpOwotCQkJQ2xpcGJvYXJkIGNsaXBib2FyZCA9IG5ldyBDbGlwYm9hcmQoRGlzcGxheS5nZXRDdXJyZW50KCkpOwotCQkJU3RyaW5nIGh0bWwgPSAoU3RyaW5nKSBjbGlwYm9hcmQuZ2V0Q29udGVudHMoSFRNTFRyYW5zZmVyCi0JCQkJCS5nZXRJbnN0YW5jZSgpKTsKLQkJCWlmIChodG1sICE9IG51bGwgJiYgaHRtbC5sZW5ndGgoKSA+IDApIHsKLQkJCQlTdHJpbmcgYmFzZVBhdGggPSByaWNoVGV4dC5nZXRCYXNlUGF0aCgpOwotCQkJCVVSTCBzb3VyY2VVUkwgPSBudWxsOwotCQkJCWlmIChzb3VyY2VVUkxTdHIgPT0gbnVsbCB8fCBzb3VyY2VVUkxTdHIubGVuZ3RoKCkgPT0gMAotCQkJCQkJfHwgc291cmNlVVJMU3RyLmVxdWFscygiYWJvdXQ6YmxhbmsiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCXNvdXJjZVVSTCA9IHJpY2hUZXh0LmdldENvcHlVUkwoKTsKLQkJCQl9IGVsc2UgewotCQkJCQlzb3VyY2VVUkwgPSBuZXcgVVJMKHNvdXJjZVVSTFN0cik7Ci0JCQkJfQotCi0JCQkJTWF0Y2hlciBtYXRjaGVyID0gSFJFRl9SRUZFUkVOQ0VTLm1hdGNoZXIoaHRtbCk7Ci0JCQkJd2hpbGUgKG1hdGNoZXIuZmluZCgpKSB7Ci0JCQkJCVN0cmluZyBocmVmID0gTmV0VXRpbC5kZWNvZGVVUkwobWF0Y2hlci5ncm91cCgxKSk7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlVUkwgaHJlZlVSTCA9IG5ldyBVUkwoc291cmNlVVJMLCBocmVmKTsKLQkJCQkJCVN0cmluZyBzY2hlbWUgPSBocmVmVVJMLmdldFByb3RvY29sKCk7Ci0JCQkJCQlpZiAoc2NoZW1lICE9IG51bGwKLQkJCQkJCQkJJiYgc2NoZW1lCi0JCQkJCQkJCQkJLmVxdWFsc0lnbm9yZUNhc2UoTmV0VXRpbC5GSUxFX1NDSEVNRSkpIHsKLQkJCQkJCQlTdHJpbmcgdXJsID0gaHJlZlVSTC5nZXRQYXRoKCk7Ci0JCQkJCQkJRmlsZSBzcmNGaWxlID0gbmV3IEZpbGUoTmV0VXRpbC5kZWNvZGVVUkwodXJsKSk7Ci0JCQkJCQkJRmlsZSB0Z3RGaWxlID0gbnVsbDsKLQkJCQkJCQlGaWxlIHRndERpciA9IG51bGw7Ci0JCQkJCQkJaWYgKGhyZWYuc3RhcnRzV2l0aCgiIyIpIHx8IHNvdXJjZVVSTC5zYW1lRmlsZShocmVmVVJMKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCQkJCWNvbnRpbnVlOwotCQkJCQkJCX0gZWxzZSBpZiAoaHJlZi5zdGFydHNXaXRoKFJFU09VUkNFUykgfHwgaHJlZi5zdGFydHNXaXRoKCIuLyIgKyBSRVNPVVJDRVMpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJdGd0RmlsZSA9IG5ldyBGaWxlKGJhc2VQYXRoLCBocmVmKTsKLQkJCQkJCQkJdGd0RGlyID0gdGd0RmlsZS5nZXRQYXJlbnRGaWxlKCk7Ci0JCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJU3RyaW5nIHJlc1BhdGggPSBnZXRTdWJkaXJlY3RvcnlPZlJlc291cmNlcyhocmVmKTsKLQkJCQkJCQkJdGd0RmlsZSA9IG5ldyBGaWxlKGJhc2VQYXRoICsgUkVTT1VSQ0VTLCByZXNQYXRoKTsKLQkJCQkJCQkJdGd0RGlyID0gdGd0RmlsZTsKLQkJCQkJCQl9Ci0JCQkJCQkJdGd0RGlyLm1rZGlycygpOwotCQkJCQkJCUZpbGVVdGlsLmNvcHlGaWxlKHNyY0ZpbGUsIHRndERpcik7Ci0JCQkJCQl9Ci0JCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlsb2dnZXIubG9nRXJyb3IoZSk7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQltYXRjaGVyID0gcF9pbWFnZV9yZWYubWF0Y2hlcihodG1sKTsKLQkJCQl3aGlsZSAobWF0Y2hlci5maW5kKCkpIHsKLQkJCQkJU3RyaW5nIHNyYyA9IE5ldFV0aWwuZGVjb2RlVVJMKG1hdGNoZXIuZ3JvdXAoMykpOwotCQkJCQl0cnkgewotCQkJCQkJVVJMIHNyY1VSTCA9IG5ldyBVUkwoc291cmNlVVJMLCBzcmMpOwotCQkJCQkJU3RyaW5nIHNjaGVtZSA9IHNyY1VSTC5nZXRQcm90b2NvbCgpOwotCQkJCQkJaWYgKHNjaGVtZSAhPSBudWxsCi0JCQkJCQkJCSYmIHNjaGVtZS5lcXVhbHNJZ25vcmVDYXNlKE5ldFV0aWwuRklMRV9TQ0hFTUUpKSB7Ci0JCQkJCQkJRmlsZSBzcmNGaWxlID0gbnVsbDsKLQkJCQkJCQlTdHJpbmcgYXV0aG9yaXR5ID0gc3JjVVJMLmdldEF1dGhvcml0eSgpOwotCQkJCQkJCWlmIChhdXRob3JpdHkgIT0gbnVsbCkgewotCQkJCQkJCQlzcmNGaWxlID0gbmV3IEZpbGUoTmV0VXRpbC5kZWNvZGVVUkwoYXV0aG9yaXR5ICsgc3JjVVJMLmdldFBhdGgoKSkpOwotCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCXNyY0ZpbGUgPSBuZXcgRmlsZShOZXRVdGlsLmRlY29kZVVSTChzcmNVUkwuZ2V0UGF0aCgpKSk7Ci0JCQkJCQkJfQotCQkJCQkJCUZpbGUgdGd0RmlsZSA9IG51bGw7Ci0JCQkJCQkJRmlsZSB0Z3REaXIgPSBudWxsOwotCQkJCQkJCWlmIChzcmMuc3RhcnRzV2l0aChSRVNPVVJDRVMpIHx8IHNyYy5zdGFydHNXaXRoKCIuLyIgKyBSRVNPVVJDRVMpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJdGd0RmlsZSA9IG5ldyBGaWxlKGJhc2VQYXRoLCBzcmMpOwotCQkJCQkJCQl0Z3REaXIgPSB0Z3RGaWxlLmdldFBhcmVudEZpbGUoKTsKLQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQlTdHJpbmcgcmVzUGF0aCA9IGdldFN1YmRpcmVjdG9yeU9mUmVzb3VyY2VzKHNyYyk7Ci0JCQkJCQkJCXRndEZpbGUgPSBuZXcgRmlsZShiYXNlUGF0aCArIFJFU09VUkNFUywgcmVzUGF0aCk7Ci0JCQkJCQkJCXRndERpciA9IHRndEZpbGU7Ci0JCQkJCQkJfQotCQkJCQkJCXRndERpci5ta2RpcnMoKTsKLQkJCQkJCQlGaWxlVXRpbC5jb3B5RmlsZShzcmNGaWxlLCB0Z3REaXIpOwotCQkJCQkJfQotCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJbG9nZ2VyLmxvZ0Vycm9yKGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJbG9nZ2VyLmxvZ0Vycm9yKGUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUGFyc2VzIHRoZSBnaXZlbiBIVE1MIGNvbnRlbnQgZnJvbSB0aGUgY2xpcGJvYXJkIGFuZCByZXR1cm5zIHRoZSBzb3VyY2UKLQkgKiBVUkwuCi0JICogCi0JICogQHBhcmFtIGh0bWxDb250ZW50Ci0JICogICAgICAgICAgICB0aGUgSFRNTCBjb250ZW50IGZyb20gdGhlIGNsaXBib2FyZAotCSAqIEByZXR1cm4gdGhlIHNvdXJjZSBVUkwgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNvdXJjZVVSTChTdHJpbmcgaHRtbENvbnRlbnQpIHsKLQkJU3RyaW5nIHNvdXJjZVVSTCA9IG51bGw7Ci0JCWludCBzb3VyY2VVUkxJbmRleCA9IGh0bWxDb250ZW50LmluZGV4T2YoU09VUkNFX1VSTCk7Ci0JCWlmIChzb3VyY2VVUkxJbmRleCA+IDApIHsKLQkJCXNvdXJjZVVSTCA9IGh0bWxDb250ZW50LnN1YnN0cmluZyhzb3VyY2VVUkxJbmRleAotCQkJCQkrIFNPVVJDRV9VUkwubGVuZ3RoKCkpOwotCQkJc291cmNlVVJMID0gc291cmNlVVJMLnN1YnN0cmluZygwLCBzb3VyY2VVUkwKLQkJCQkJLmluZGV4T2YoRmlsZVV0aWwuTElORV9TRVApKTsKLQkJCWlmIChzb3VyY2VVUkwudG9Mb3dlckNhc2UoKS5lbmRzV2l0aChIVE1fRVhUKQotCQkJCQl8fCBzb3VyY2VVUkwudG9Mb3dlckNhc2UoKS5lbmRzV2l0aChIVE1MX0VYVCkpIHsKLQkJCQlzb3VyY2VVUkwgPSBzb3VyY2VVUkwuc3Vic3RyaW5nKDAsIHNvdXJjZVVSTC5pbmRleE9mKEZpbGVVdGlsCi0JCQkJCQkuZ2V0RmlsZU5hbWUoc291cmNlVVJMKSkgLSAxKTsKLQkJCQlzb3VyY2VVUkwgPSBzb3VyY2VVUkwucmVwbGFjZSgnXFwnLCAnLycpOwotCQkJfQotCQkJc291cmNlVVJMID0gRmlsZVV0aWwuYXBwZW5kU2VwYXJhdG9yKHNvdXJjZVVSTCwgIi8iKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBzb3VyY2VVUkw7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTdWJkaXJlY3RvcnlPZlJlc291cmNlcyhTdHJpbmcgcGF0aCkgewotCQlTdHJpbmcgcmVzdWx0ID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJaW50IHJlc19pZHggPSBwYXRoLmluZGV4T2YoUkVTT1VSQ0VTKTsKLQkJaWYgKHJlc19pZHggIT0gLTEpIHsKLQkJCVN0YWNrPFN0cmluZz4gc3RhY2sgPSBuZXcgU3RhY2s8U3RyaW5nPigpOwotCQkJRmlsZSByZWxhdGl2ZSA9IG5ldyBGaWxlKHBhdGgpLmdldFBhcmVudEZpbGUoKTsKLQkJCXdoaWxlICghcmVsYXRpdmUuZ2V0TmFtZSgpLmVxdWFscyhSRVNPVVJDRVMpKSB7Ci0JCQkJc3RhY2sucHVzaChyZWxhdGl2ZS5nZXROYW1lKCkpOwotCQkJCXJlbGF0aXZlID0gcmVsYXRpdmUuZ2V0UGFyZW50RmlsZSgpOwotCQkJfQotCQkJd2hpbGUgKCFzdGFjay5pc0VtcHR5KCkpIHsKLQkJCQlyZXN1bHQgPSByZXN1bHQgKyAoU3RyaW5nKXN0YWNrLnBvcCgpICsgRmlsZS5zZXBhcmF0b3I7Ci0JCQl9Ci0JCX0gCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvYWN0aW9ucy9QYXN0ZVBsYWluVGV4dEFjdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvYWN0aW9ucy9QYXN0ZVBsYWluVGV4dEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZGM3MWNmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2FjdGlvbnMvUGFzdGVQbGFpblRleHRBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLlN0clV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LklSaWNoVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRJbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuQ2xpcGJvYXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuVGV4dFRyYW5zZmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci0KLXB1YmxpYyBjbGFzcyBQYXN0ZVBsYWluVGV4dEFjdGlvbiBleHRlbmRzIFJpY2hUZXh0QWN0aW9uIHsKLQkKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBQYXN0ZVBsYWluVGV4dEFjdGlvbihJUmljaFRleHQgcmljaFRleHQpIHsKLQkJc3VwZXIocmljaFRleHQsIElBY3Rpb24uQVNfUFVTSF9CVVRUT04pOwotCQlzZXRJbWFnZURlc2NyaXB0b3IoUmljaFRleHRJbWFnZXMuSU1HX0RFU0NfUEFTVEVfUExBSU5fVEVYVCk7Ci0JCXNldERpc2FibGVkSW1hZ2VEZXNjcmlwdG9yKFJpY2hUZXh0SW1hZ2VzLkRJU0FCTEVEX0lNR19ERVNDX1BBU1RFX1BMQUlOX1RFWFQpOwotCQlzZXRUb29sVGlwVGV4dChSaWNoVGV4dFJlc291cmNlcy5wYXN0ZVBsYWluVGV4dEFjdGlvbl90b29sVGlwVGV4dCk7Ci0JCXNldEVuYWJsZWQodHJ1ZSk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBhY3Rpb24gc2hvdWxkIGJlIGRpc2FibGVkIHdoZW4gdGhlCi0JICogcmljaCB0ZXh0IGVkaXRvciBpcyBpbiBzb3VyY2UgZWRpdCBtb2RlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGRpc2FibGVJblNvdXJjZU1vZGUoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgZXhlY3V0ZShJUmljaFRleHQgcmljaFRleHQpIHsKLQkJaWYgKHJpY2hUZXh0ICE9IG51bGwpIHsKLQkJCS8vIGdldCB0ZXh0IGZyb20gY2xpcGJvYXJkCi0JCQlDbGlwYm9hcmQgY2xpcGJvYXJkID0gbmV3IENsaXBib2FyZChEaXNwbGF5LmdldEN1cnJlbnQoKSk7Ci0JCQlTdHJpbmcgdGV4dCA9IChTdHJpbmcpIGNsaXBib2FyZC5nZXRDb250ZW50cyhUZXh0VHJhbnNmZXIKLQkJCQkJLmdldEluc3RhbmNlKCkpOwotCQkJaWYgKHRleHQgIT0gbnVsbCAmJiB0ZXh0Lmxlbmd0aCgpID4gMCkgewotCQkJCXRleHQgPSBTdHJVdGlsLmNvbnZlcnROZXdsaW5lc1RvSFRNTCh0ZXh0KTsKLQkJCQlpZiAocmljaFRleHQgaW5zdGFuY2VvZiBSaWNoVGV4dEVkaXRvcikgewotCQkJCQkoKFJpY2hUZXh0RWRpdG9yKXJpY2hUZXh0KS5hZGRIVE1MKHRleHQpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXJpY2hUZXh0LmV4ZWN1dGVDb21tYW5kKFJpY2hUZXh0Q29tbWFuZC5BRERfSFRNTCwgdGV4dCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9hY3Rpb25zL1JpY2hUZXh0QWN0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9hY3Rpb25zL1JpY2hUZXh0QWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxNWZiYzIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvYWN0aW9ucy9SaWNoVGV4dEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRIYXNoU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LklSaWNoVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb25Db250cmlidXRpb25JdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQ29udHJpYnV0aW9uSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVDcmVhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5NZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLk1lbnU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVG9vbEl0ZW07Ci0KLS8qKgotICogVGhlIGFic3RyYWN0IGltcGxlbWVudGF0aW9uIG9mIGEgcmljaCB0ZXh0IGFjdGlvbi4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAYXV0aG9yIEplZmYgSGFyZHkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFJpY2hUZXh0QWN0aW9uIGV4dGVuZHMgQWN0aW9uIHsKLQotCXByb3RlY3RlZCBJUmljaFRleHQgcmljaFRleHQ7Ci0JCi0JcHJvdGVjdGVkIFRvb2xJdGVtIHRvb2xJdGVtOwotCQotCXByb3RlY3RlZCBDb2xsZWN0aW9uPElBY3Rpb24+IGZNZW51QWN0aW9ucyA9IG5ldyBMaW5rZWRIYXNoU2V0PElBY3Rpb24+KCk7Ci0JCi0gICAgcHJvdGVjdGVkIElNZW51Q3JlYXRvciBtZW51Q3JlYXRvciA9IG5ldyBJTWVudUNyZWF0b3IoKSB7Ci0KLSAgICAJcHJpdmF0ZSBNZW51TWFuYWdlciBkcm9wRG93bk1lbnVNZ3I7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIENyZWF0ZXMgdGhlIG1lbnUgbWFuYWdlciBmb3IgdGhlIGRyb3AtZG93bi4KLSAgICAgICAgICovCi0gICAgICAgIHByaXZhdGUgdm9pZCBjcmVhdGVEcm9wRG93bk1lbnVNZ3IoKSB7Ci0gICAgICAgICAgICBpZiAoZHJvcERvd25NZW51TWdyID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBkcm9wRG93bk1lbnVNZ3IgPSBuZXcgTWVudU1hbmFnZXIoKTsKLSAgICAgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yPElBY3Rpb24+IGl0ZXIgPSBnZXRNZW51QWN0aW9ucygpLml0ZXJhdG9yKCk7aXRlci5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICAgICAgCUlBY3Rpb24gaXRlbSA9IGl0ZXIubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICBkcm9wRG93bk1lbnVNZ3IuYWRkKGl0ZW0pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVDcmVhdG9yI2dldE1lbnUob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbCkKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBNZW51IGdldE1lbnUoQ29udHJvbCBwYXJlbnQpIHsKLSAgICAgICAgICAgIGNyZWF0ZURyb3BEb3duTWVudU1ncigpOwotICAgICAgICAgICAgcmV0dXJuIGRyb3BEb3duTWVudU1nci5jcmVhdGVDb250ZXh0TWVudShwYXJlbnQpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudUNyZWF0b3IjZ2V0TWVudShvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5NZW51KQotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIE1lbnUgZ2V0TWVudShNZW51IHBhcmVudCkgewotICAgICAgICAgICAgY3JlYXRlRHJvcERvd25NZW51TWdyKCk7Ci0gICAgICAgICAgICBNZW51IG1lbnUgPSBuZXcgTWVudShwYXJlbnQpOwotICAgICAgICAgICAgSUNvbnRyaWJ1dGlvbkl0ZW1bXSBpdGVtcyA9IGRyb3BEb3duTWVudU1nci5nZXRJdGVtcygpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIElDb250cmlidXRpb25JdGVtIGl0ZW0gPSBpdGVtc1tpXTsKLSAgICAgICAgICAgICAgICBJQ29udHJpYnV0aW9uSXRlbSBuZXdJdGVtID0gaXRlbTsKLSAgICAgICAgICAgICAgICBpZiAoaXRlbSBpbnN0YW5jZW9mIEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0pIHsKLSAgICAgICAgICAgICAgICAgICAgbmV3SXRlbSA9IG5ldyBBY3Rpb25Db250cmlidXRpb25JdGVtKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoQWN0aW9uQ29udHJpYnV0aW9uSXRlbSkgaXRlbSkuZ2V0QWN0aW9uKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBuZXdJdGVtLmZpbGwobWVudSwgLTEpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG1lbnU7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51Q3JlYXRvciNkaXNwb3NlKCkKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0gICAgICAgICAgICBpZiAoZHJvcERvd25NZW51TWdyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBkcm9wRG93bk1lbnVNZ3IuZGlzcG9zZSgpOwotICAgICAgICAgICAgICAgIGRyb3BEb3duTWVudU1nciA9IG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9OwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gcmljaFRleHQKLQkgKiAgICAgICAgICAgIGEgcmljaCB0ZXh0IGNvbnRyb2wKLQkgKi8KLQlwdWJsaWMgUmljaFRleHRBY3Rpb24oSVJpY2hUZXh0IHJpY2hUZXh0LCBpbnQgc3R5bGUpIHsKLQkJc3VwZXIobnVsbCwgc3R5bGUpOwotCQl0aGlzLnJpY2hUZXh0ID0gcmljaFRleHQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIGFjdGlvbiBzaG91bGQgYmUgZGlzYWJsZWQgd2hlbiB0aGUKLQkgKiByaWNoIHRleHQgZWRpdG9yIGlzIGluIHJlYWRvbmx5IG1vZGUuCi0JICovCi0JcHVibGljIGJvb2xlYW4gZGlzYWJsZUluUmVhZE9ubHlNb2RlKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgYWN0aW9uIHNob3VsZCBiZSBkaXNhYmxlZCB3aGVuIHRoZQotCSAqIHJpY2ggdGV4dCBlZGl0b3IgaXMgaW4gc291cmNlIGVkaXQgbW9kZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBkaXNhYmxlSW5Tb3VyY2VNb2RlKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRUb29sSXRlbShUb29sSXRlbSB0b29sSXRlbSkgewotCQl0aGlzLnRvb2xJdGVtID0gdG9vbEl0ZW07Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJZXhlY3V0ZShyaWNoVGV4dCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCXJldHVybiBnZXRDbGFzcygpLmdldENhbm9uaWNhbE5hbWUoKTsKLQl9Ci0JCi0JcHVibGljIENvbGxlY3Rpb248SUFjdGlvbj4gZ2V0TWVudUFjdGlvbnMoKSB7Ci0JCXJldHVybiBmTWVudUFjdGlvbnM7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGFkZEFjdGlvblRvTWVudShJQWN0aW9uIGFjdGlvbikgewotCQlmTWVudUFjdGlvbnMuYWRkKGFjdGlvbik7Ci0JfQotCQotCXB1YmxpYyBhYnN0cmFjdCB2b2lkIGV4ZWN1dGUoSVJpY2hUZXh0IHJpY2hUZXh0KTsKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2FjdGlvbnMvUmljaFRleHRDb21ib0FjdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvYWN0aW9ucy9SaWNoVGV4dENvbWJvQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiMjk2ZDcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvYWN0aW9ucy9SaWNoVGV4dENvbWJvQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udWkuYWN0aW9ucy5DQ29tYm9Db250cmlidXRpb25JdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5JUmljaFRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLQotLyoqCi0gKiBUaGUgYWJzdHJhY3QgaW1wbGVtZW50YXRpb24gb2YgYSByaWNoIHRleHQgY29tYm8gYWN0aW9uLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBhdXRob3IgSmVmZiBIYXJkeQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgUmljaFRleHRDb21ib0FjdGlvbiBleHRlbmRzIENDb21ib0NvbnRyaWJ1dGlvbkl0ZW0gewotCQotCXByb3RlY3RlZCBJUmljaFRleHQgcmljaFRleHQ7Ci0JCi0JcHJvdGVjdGVkIFN0cmluZyB0b29sVGlwVGV4dDsKLQotCXByb3RlY3RlZCBib29sZWFuIGVuYWJsZWQgPSB0cnVlOwotCQotCXByb3RlY3RlZCBib29sZWFuIG5vdGlmeUxpc3RlbmVycyA9IGZhbHNlOwotCi0JCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gcmljaFRleHQKLQkgKiAgICAgICAgICAgIGEgcmljaCB0ZXh0IGNvbnRyb2wKLQkgKi8KLQlwdWJsaWMgUmljaFRleHRDb21ib0FjdGlvbihJUmljaFRleHQgcmljaFRleHQpIHsKLQkJc3VwZXIoU1dULlJFQURfT05MWSB8IFNXVC5GTEFUIHwgU1dULkJPUkRFUik7Ci0JCXRoaXMucmljaFRleHQgPSByaWNoVGV4dDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqIAotCSAqIEBwYXJhbSByaWNoVGV4dAotCSAqICAgICAgICAgICAgYSByaWNoIHRleHQgY29udHJvbAotCSAqLwotCXB1YmxpYyBSaWNoVGV4dENvbWJvQWN0aW9uKElSaWNoVGV4dCByaWNoVGV4dCwgaW50IHN0eWxlKSB7Ci0JCXN1cGVyKFNXVC5SRUFEX09OTFkgfCBTV1QuRkxBVCB8IFNXVC5CT1JERVIgfCBzdHlsZSk7Ci0JCXRoaXMucmljaFRleHQgPSByaWNoVGV4dDsKLQl9Ci0KLQotCS8qKgotCSAqIEV4ZWN1dGVzIHRoZSBhY3Rpb24uCi0JICogCi0JICogQHBhcmFtIHJpY2hUZXh0Ci0JICogICAgICAgICAgICBhIHJpY2ggdGV4dCBjb250cm9sCi0JICogQHBhcmFtIGluZGV4Ci0JICogICAgICAgICAgICB0aGUgaW5kZXggb2YgdGhlIHNlbGVjdGVkIGl0ZW0KLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBleGVjdXRlKElSaWNoVGV4dCByaWNoVGV4dCk7Ci0JCi0JcHVibGljIGFic3RyYWN0IENvbGxlY3Rpb248U3RyaW5nPiBnZXRJbnB1dCgpOwotCQotCXB1YmxpYyB2b2lkIGluaXQoKSB7Ci0JCXNldElucHV0KGdldElucHV0KCkpOwotCQlzZXROb3RpZnlMaXN0ZW5lcnModHJ1ZSk7Ci0JfQotCQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0Q0NvbWJvU2VsZWN0aW9uKCkgewotCQlpZiAoZ2V0Q0NvbWJvKCkgIT0gbnVsbCkgewotCQkJaW50IGluZGV4ID0gZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLQkJCXJldHVybiBnZXRDQ29tYm8oKS5nZXRJdGVtKGluZGV4KTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdG9vbCB0aXAgZm9yIHRoZSBhY3Rpb24uCi0JICogCi0JICogQHJldHVybiB0aGUgdG9vbCB0aXAgdGV4dAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VG9vbFRpcFRleHQoKSB7Ci0JCXJldHVybiB0b29sVGlwVGV4dDsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB0b29sIHRpcCBmb3IgdGhlIGFjdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gdG9vbFRpcFRleHQKLQkgKiAgICAgICAgICAgIHRoZSB0b29sIHRpcCB0ZXh0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0VG9vbFRpcFRleHQoU3RyaW5nIHRvb2xUaXBUZXh0KSB7Ci0JCXRoaXMudG9vbFRpcFRleHQgPSB0b29sVGlwVGV4dDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBlbmFibGVkIHN0YXR1cyBvZiB0aGUgYWN0aW9uLgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgZW5hYmxlZCwgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIG5vdAotCSAqLwotCXB1YmxpYyBib29sZWFuIGdldEVuYWJsZWQoKSB7Ci0JCXJldHVybiBlbmFibGVkOwotCX0KLQotCS8qKgotCSAqIEVuYWJsZXMgb3IgZGlzYWJsZXMgdGhlIGFjdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gZW5hYmxlZAotCSAqICAgICAgICAgICAgaWYgPGNvZGU+dHJ1ZTwvY29kZT4sIGVuYWJsZSB0aGUgYWN0aW9uLiBpZgotCSAqICAgICAgICAgICAgPGNvZGU+ZmFsc2U8L2NvZGU+LCBkaXNhYmxlIGl0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVuYWJsZWQoYm9vbGVhbiBlbmFibGVkKSB7Ci0JCXRoaXMuZW5hYmxlZCA9IGVuYWJsZWQ7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1TZWxlY3Rpb25DaGFuZ2VkKCkgewotCQlpZiAobm90aWZ5TGlzdGVuZXJzKSB7Ci0JCQlleGVjdXRlKHJpY2hUZXh0KTsKLQkJfQotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzTm90aWZ5TGlzdGVuZXJzKCkgewotCQlyZXR1cm4gbm90aWZ5TGlzdGVuZXJzOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE5vdGlmeUxpc3RlbmVycyhib29sZWFuIG5vdGlmeUxpc3RlbmVycykgewotCQl0aGlzLm5vdGlmeUxpc3RlbmVycyA9IG5vdGlmeUxpc3RlbmVyczsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9hY3Rpb25zL1N1YnNjcmlwdEFjdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvYWN0aW9ucy9TdWJzY3JpcHRBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzI1YzBkYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9hY3Rpb25zL1N1YnNjcmlwdEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuSVJpY2hUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0SW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotCi0vKioKLSAqIFRvZ2dsZXMgdGhlIHN1YnNjcmlwdCBhdHRyaWJ1dGUgb2YgdGhlIHNlbGVjdGVkIHRleHQgaW4gYSByaWNoIHRleHQgY29udHJvbC4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAYXV0aG9yIEplZmYgSGFyZHkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFN1YnNjcmlwdEFjdGlvbiBleHRlbmRzIFJpY2hUZXh0QWN0aW9uIHsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFN1YnNjcmlwdEFjdGlvbihmaW5hbCBJUmljaFRleHQgcmljaFRleHQpIHsKLQkJc3VwZXIocmljaFRleHQsIElBY3Rpb24uQVNfQ0hFQ0tfQk9YKTsKLQkJc2V0SW1hZ2VEZXNjcmlwdG9yKFJpY2hUZXh0SW1hZ2VzLklNR19ERVNDX1NVQlNDUklQVCk7Ci0JCXNldERpc2FibGVkSW1hZ2VEZXNjcmlwdG9yKFJpY2hUZXh0SW1hZ2VzLkRJU0FCTEVEX0lNR19ERVNDX1NVQlNDUklQVCk7Ci0JCXNldFRvb2xUaXBUZXh0KFJpY2hUZXh0UmVzb3VyY2VzLnN1YnNjcmlwdEFjdGlvbl90b29sVGlwVGV4dCk7Ci0JCS8vIGFkZCBsaXN0ZW5lcgotCQlyaWNoVGV4dC5hZGRMaXN0ZW5lcihTV1QuU0VMRUNURUQsIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQkJc2V0Q2hlY2tlZChyaWNoVGV4dC5nZXRTZWxlY3RlZCgpLmlzU3Vic2NyaXB0KCkpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQkvKioKLQkgKiBFeGVjdXRlcyB0aGUgYWN0aW9uLgotCSAqIAotCSAqIEBwYXJhbSByaWNoVGV4dAotCSAqICAgICAgICAgICAgYSByaWNoIHRleHQgY29udHJvbAotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoSVJpY2hUZXh0IHJpY2hUZXh0KSB7Ci0JCWlmIChyaWNoVGV4dCAhPSBudWxsKSB7Ci0JCQlyaWNoVGV4dC5leGVjdXRlQ29tbWFuZChSaWNoVGV4dENvbW1hbmQuU1VCU0NSSVBUKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2FjdGlvbnMvU3VwZXJzY3JpcHRBY3Rpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2FjdGlvbnMvU3VwZXJzY3JpcHRBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDdmNDRlNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9hY3Rpb25zL1N1cGVyc2NyaXB0QWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5JUmljaFRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRJbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci0KLS8qKgotICogVG9nZ2xlcyB0aGUgc3VwZXJzY3JpcHQgYXR0cmlidXRlIG9mIHRoZSBzZWxlY3RlZCB0ZXh0IGluIGEgcmljaCB0ZXh0Ci0gKiBjb250cm9sLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBhdXRob3IgSmVmZiBIYXJkeQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgU3VwZXJzY3JpcHRBY3Rpb24gZXh0ZW5kcyBSaWNoVGV4dEFjdGlvbiB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBTdXBlcnNjcmlwdEFjdGlvbihmaW5hbCBJUmljaFRleHQgcmljaFRleHQpIHsKLQkJc3VwZXIocmljaFRleHQsIElBY3Rpb24uQVNfQ0hFQ0tfQk9YKTsKLQkJc2V0SW1hZ2VEZXNjcmlwdG9yKFJpY2hUZXh0SW1hZ2VzLklNR19ERVNDX1NVUEVSU0NSSVBUKTsKLQkJc2V0RGlzYWJsZWRJbWFnZURlc2NyaXB0b3IoUmljaFRleHRJbWFnZXMuRElTQUJMRURfSU1HX0RFU0NfU1VQRVJTQ1JJUFQpOwotCQlzZXRUb29sVGlwVGV4dChSaWNoVGV4dFJlc291cmNlcy5zdXBlcnNjcmlwdEFjdGlvbl90b29sVGlwVGV4dCk7Ci0JCS8vIGFkZCBsaXN0ZW5lcgotCQlyaWNoVGV4dC5hZGRMaXN0ZW5lcihTV1QuU0VMRUNURUQsIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQkJc2V0Q2hlY2tlZChyaWNoVGV4dC5nZXRTZWxlY3RlZCgpLmlzU3VwZXJzY3JpcHQoKSk7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCS8qKgotCSAqIEV4ZWN1dGVzIHRoZSBhY3Rpb24uCi0JICogCi0JICogQHBhcmFtIHJpY2hUZXh0Ci0JICogICAgICAgICAgICBhIHJpY2ggdGV4dCBjb250cm9sCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZShJUmljaFRleHQgcmljaFRleHQpIHsKLQkJaWYgKHJpY2hUZXh0ICE9IG51bGwpIHsKLQkJCXJpY2hUZXh0LmV4ZWN1dGVDb21tYW5kKFJpY2hUZXh0Q29tbWFuZC5TVVBFUlNDUklQVCk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9hY3Rpb25zL1RpZHlBY3Rpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2FjdGlvbnMvVGlkeUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3N2VjZTE2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2FjdGlvbnMvVGlkeUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLmh0bWwuSFRNTEZvcm1hdHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuSVJpY2hUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRJbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotCi0vKioKLSAqIFJ1bnMgSlRpZHkgb24gdGhlIEhUTUwKLSAqIAotICogQGF1dGhvciBKZWZmIEhhcmR5Ci0gKiBAc2luY2UgMS4yCi0gKi8KLXB1YmxpYyBjbGFzcyBUaWR5QWN0aW9uIGV4dGVuZHMgUmljaFRleHRBY3Rpb24gewotCQotCWJvb2xlYW4gZm9yY2VPdXRwdXQgPSBmYWxzZTsKLQlib29sZWFuIG1ha2VCYXJlID0gZmFsc2U7Ci0JYm9vbGVhbiB3b3JkMjAwMCA9IGZhbHNlOwotCQotCS8vIFRoZSBIVE1MIHNvdXJjZSBmb3JtYXR0ZXIuCi0JcHJvdGVjdGVkIEhUTUxGb3JtYXR0ZXIgaHRtbEZvcm1hdHRlcjsKLQotCQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgVGlkeUFjdGlvbihJUmljaFRleHQgcmljaFRleHQsIGJvb2xlYW4gZm9yY2VPdXRwdXQsIGJvb2xlYW4gbWFrZUJhcmUsIGJvb2xlYW4gd29yZDIwMDApIHsKLQkJc3VwZXIocmljaFRleHQsIElBY3Rpb24uQVNfUFVTSF9CVVRUT04pOwotCQl0aGlzLmZvcmNlT3V0cHV0ID0gZm9yY2VPdXRwdXQ7Ci0JCXRoaXMubWFrZUJhcmUgPSBtYWtlQmFyZTsKLQkJdGhpcy53b3JkMjAwMCA9IHdvcmQyMDAwOwotCQlzZXRJbWFnZURlc2NyaXB0b3IoUmljaFRleHRJbWFnZXMuSU1HX0RFU0NfVElEWSk7Ci0JCXNldERpc2FibGVkSW1hZ2VEZXNjcmlwdG9yKFJpY2hUZXh0SW1hZ2VzLkRJU0FCTEVEX0lNR19ERVNDX1RJRFkpOwotCQlodG1sRm9ybWF0dGVyID0gbmV3IEhUTUxGb3JtYXR0ZXIoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZXhlY3V0ZShJUmljaFRleHQgcmljaFRleHQpIHsKLQkJLy8gZ2V0IGN1cnJlbnQgdGV4dAotCQlTdHJpbmcgaHRtbDsKLQkJaWYgKHJpY2hUZXh0IGluc3RhbmNlb2YgUmljaFRleHRFZGl0b3IpIHsKLQkJCWh0bWwgPSAoKFJpY2hUZXh0RWRpdG9yKXJpY2hUZXh0KS5nZXRUZXh0KCk7Ci0JCX0gZWxzZSB7Ci0JCQlodG1sID0gcmljaFRleHQuZ2V0VGV4dCgpOwotCQl9Ci0JCS8vIGNhbGwgSlRpZHkgd2l0aCB0aGUgb3B0aW9ucwotCQl0cnkgewotCQkJaHRtbCA9IGh0bWxGb3JtYXR0ZXIuZm9ybWF0SFRNTChodG1sLCBmYWxzZSwgZm9yY2VPdXRwdXQsIG1ha2VCYXJlLCB3b3JkMjAwMCk7Ci0JCX0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZSkgewotCQkJUmljaFRleHRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQl9Ci0JCS8vIHNldCB0ZXh0Ci0JCWlmIChyaWNoVGV4dCBpbnN0YW5jZW9mIFJpY2hUZXh0RWRpdG9yKSB7Ci0JCQkoKFJpY2hUZXh0RWRpdG9yKXJpY2hUZXh0KS5zZXRUZXh0KGh0bWwpOwotCQl9IGVsc2UgewotCQkJcmljaFRleHQuc2V0VGV4dChodG1sKTsKLQkJfQotCQlyaWNoVGV4dC5jaGVja01vZGlmeSgpOwotCQkKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZGlzYWJsZUluU291cmNlTW9kZSgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2FjdGlvbnMvVGlkeUFjdGlvbkdyb3VwLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9hY3Rpb25zL1RpZHlBY3Rpb25Hcm91cC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NjhjYWIzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2FjdGlvbnMvVGlkeUFjdGlvbkdyb3VwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5JUmljaFRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0SW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLQotLyoqCi0gKiBSdW5zIEpUaWR5IG9uIHRoZSBIVE1MCi0gKiAKLSAqIEBhdXRob3IgSmVmZiBIYXJkeQotICogQHNpbmNlIDEuMgotICovCi1wdWJsaWMgY2xhc3MgVGlkeUFjdGlvbkdyb3VwIGV4dGVuZHMgUmljaFRleHRBY3Rpb24gewotCQotCVRpZHlBY3Rpb24gdGlkeUFjdGlvbkRlZmF1bHQ7Ci0JVGlkeUFjdGlvbiB0aWR5QWN0aW9uQ2xlYW5NUzsKLQlUaWR5QWN0aW9uIHRpZHlBY3Rpb25DbGVhbldvcmQyMDAwOwotCi0JcHVibGljIFRpZHlBY3Rpb25Hcm91cChJUmljaFRleHQgcmljaFRleHQpIHsKLQkJc3VwZXIocmljaFRleHQsIElBY3Rpb24uQVNfRFJPUF9ET1dOX01FTlUpOwotCQkvLyBUT0RPIG5lZWQgaW1hZ2UKLQkJc2V0SW1hZ2VEZXNjcmlwdG9yKFJpY2hUZXh0SW1hZ2VzLklNR19ERVNDX1RJRFkpOwotCQkvLyBUT0RPIG5lZWQgaW1hZ2UKLS8vCQlzZXREaXNhYmxlZEltYWdlRGVzY3JpcHRvcihSaWNoVGV4dEltYWdlcy5ESVNBQkxFRF9JTUdfREVTQ19QQVNURSk7Ci0JCXNldFRvb2xUaXBUZXh0KFJpY2hUZXh0UmVzb3VyY2VzLnRpZHlfY2xlYW5fdGV4dCk7Ci0JCQotCQljcmVhdGVBY3Rpb25zKCk7Ci0JCXNldE1lbnVDcmVhdG9yKG1lbnVDcmVhdG9yKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUFjdGlvbnMoKSB7Ci0JCXRpZHlBY3Rpb25EZWZhdWx0ID0gbmV3IFRpZHlBY3Rpb24ocmljaFRleHQsIHRydWUsIGZhbHNlLCBmYWxzZSk7Ci0JCXRpZHlBY3Rpb25EZWZhdWx0LnNldFRleHQoUmljaFRleHRSZXNvdXJjZXMudGlkeV9jbGVhbl90ZXh0KTsKLQkJdGlkeUFjdGlvbkRlZmF1bHQuc2V0VG9vbFRpcFRleHQoUmljaFRleHRSZXNvdXJjZXMudGlkeV9jbGVhbl90b29sVGlwVGV4dCk7Ci0JCXRpZHlBY3Rpb25DbGVhbk1TID0gbmV3IFRpZHlBY3Rpb24ocmljaFRleHQsIHRydWUsIHRydWUsIGZhbHNlKTsKLQkJdGlkeUFjdGlvbkNsZWFuTVMuc2V0VGV4dChSaWNoVGV4dFJlc291cmNlcy50aWR5X2NsZWFuZXJfdGV4dCk7Ci0JCXRpZHlBY3Rpb25DbGVhbk1TLnNldFRvb2xUaXBUZXh0KFJpY2hUZXh0UmVzb3VyY2VzLnRpZHlfY2xlYW5lcl90b29sVGlwVGV4dCk7Ci0JCXRpZHlBY3Rpb25DbGVhbldvcmQyMDAwID0gbmV3IFRpZHlBY3Rpb24ocmljaFRleHQsIHRydWUsIHRydWUsIHRydWUpOwotCQl0aWR5QWN0aW9uQ2xlYW5Xb3JkMjAwMC5zZXRUZXh0KFJpY2hUZXh0UmVzb3VyY2VzLnRpZHlfY2xlYW5lc3RfdGV4dCk7Ci0JCXRpZHlBY3Rpb25DbGVhbldvcmQyMDAwLnNldFRvb2xUaXBUZXh0KFJpY2hUZXh0UmVzb3VyY2VzLnRpZHlfY2xlYW5lc3RfdG9vbFRpcFRleHQpOwotCQlhZGRBY3Rpb25Ub01lbnUodGlkeUFjdGlvbkRlZmF1bHQpOwotCQlhZGRBY3Rpb25Ub01lbnUodGlkeUFjdGlvbkNsZWFuTVMpOwotCQlhZGRBY3Rpb25Ub01lbnUodGlkeUFjdGlvbkNsZWFuV29yZDIwMDApOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBleGVjdXRlKElSaWNoVGV4dCByaWNoVGV4dCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCQotCQkvLyBjYWxsIG5vcm1hbCBjbGVhbgotCQl0aWR5QWN0aW9uRGVmYXVsdC5leGVjdXRlKHJpY2hUZXh0KTsKLQotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBkaXNhYmxlSW5Tb3VyY2VNb2RlKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9hY3Rpb25zL1VuZGVybGluZUFjdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvYWN0aW9ucy9VbmRlcmxpbmVBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2U3ZGIwOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9hY3Rpb25zL1VuZGVybGluZUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuSVJpY2hUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0SW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotCi0vKioKLSAqIFRvZ2dsZXMgdGhlIHVuZGVybGluZSBhdHRyaWJ1dGUgb2YgdGhlIHNlbGVjdGVkIHRleHQgaW4gYSByaWNoIHRleHQgY29udHJvbC4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAYXV0aG9yIEplZmYgSGFyZHkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFVuZGVybGluZUFjdGlvbiBleHRlbmRzIFJpY2hUZXh0QWN0aW9uIHsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFVuZGVybGluZUFjdGlvbihmaW5hbCBJUmljaFRleHQgcmljaFRleHQpIHsKLQkJc3VwZXIocmljaFRleHQsIElBY3Rpb24uQVNfQ0hFQ0tfQk9YKTsKLQkJc2V0SW1hZ2VEZXNjcmlwdG9yKFJpY2hUZXh0SW1hZ2VzLklNR19ERVNDX1VOREVSTElORSk7Ci0JCXNldERpc2FibGVkSW1hZ2VEZXNjcmlwdG9yKFJpY2hUZXh0SW1hZ2VzLkRJU0FCTEVEX0lNR19ERVNDX1VOREVSTElORSk7Ci0JCXNldFRvb2xUaXBUZXh0KFJpY2hUZXh0UmVzb3VyY2VzLnVuZGVybGluZUFjdGlvbl90b29sVGlwVGV4dCk7Ci0JCS8vIGFkZCBsaXN0ZW5lcgotCQlyaWNoVGV4dC5hZGRMaXN0ZW5lcihTV1QuU0VMRUNURUQsIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQkJc2V0Q2hlY2tlZChyaWNoVGV4dC5nZXRTZWxlY3RlZCgpLmlzVW5kZXJMaW5lKCkpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQkvKioKLQkgKiBFeGVjdXRlcyB0aGUgYWN0aW9uLgotCSAqIAotCSAqIEBwYXJhbSByaWNoVGV4dAotCSAqICAgICAgICAgICAgYSByaWNoIHRleHQgY29udHJvbAotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoSVJpY2hUZXh0IHJpY2hUZXh0KSB7Ci0JCWlmIChyaWNoVGV4dCAhPSBudWxsKSB7Ci0JCQlyaWNoVGV4dC5leGVjdXRlQ29tbWFuZChSaWNoVGV4dENvbW1hbmQuVU5ERVJMSU5FKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2FjdGlvbnMvcGFja2FnZS5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvYWN0aW9ucy9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzZDllNmUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvYWN0aW9ucy9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyBlZGl0aW5nIGFjdGlvbnMgZm9yIHRoZSByaWNoIHRleHQgY29udHJvbCBhbmQgZWRpdG9yLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2RpYWxvZ3MvQWRkSW1hZ2VEaWFsb2cuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2RpYWxvZ3MvQWRkSW1hZ2VEaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGM2YTYzNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9kaWFsb2dzL0FkZEltYWdlRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmRpYWxvZ3M7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0Lmh0bWwuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRmlsZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotCi0vKioKLSAqIFByb21wdHMgdGhlIHVzZXIgdG8gc3BlY2lmeSB0aGUgaW1hZ2UgdGhhdCB3aWxsIGJlIHVzZWQgdG8gY3JlYXRlIGEgSFRNTAotICogJmx0O2ltYWdlJmd0OyB0YWcgaW4gdGhlIHJpY2ggdGV4dCBlZGl0b3IuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQWRkSW1hZ2VEaWFsb2cgZXh0ZW5kcyBCYXNlRGlhbG9nIHsKLQotCXByb3RlY3RlZCBJbWFnZSBpbWFnZSA9IG5ldyBJbWFnZSgpOwotCi0JcHJvdGVjdGVkIFRleHQgdXJsVGV4dDsKLQotCXByb3RlY3RlZCBCdXR0b24gYnJvd3NlQnV0dG9uOwotCi0JcHJvdGVjdGVkIFNlbGVjdGlvbkFkYXB0ZXIgYnJvd3NlU2VsZWN0aW9uQWRhcHRlciA9IG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJRmlsZURpYWxvZyBkaWFsb2cgPSBuZXcgRmlsZURpYWxvZyhEaXNwbGF5LmdldEN1cnJlbnQoKQotCQkJCQkuZ2V0QWN0aXZlU2hlbGwoKSwgU1dULk9QRU4pOwotCQkJZGlhbG9nCi0JCQkJCS5zZXRGaWx0ZXJFeHRlbnNpb25zKG5ldyBTdHJpbmdbXSB7Ci0JCQkJCQkJIiouZ2lmIiwgIiouanBnIiwgIiouYm1wIiB9KTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCVN0cmluZyBpbWFnZUZpbGUgPSBkaWFsb2cub3BlbigpOwotCQkJaWYgKGltYWdlRmlsZSAhPSBudWxsICYmIGltYWdlRmlsZS5sZW5ndGgoKSA+IDApIHsKLQkJCQlGaWxlIGZpbGUgPSBuZXcgRmlsZShpbWFnZUZpbGUpOwotCQkJCXRyeSB7Ci0JCQkJCVN0cmluZyB1cmwgPSBmaWxlLnRvVVJMKCkudG9FeHRlcm5hbEZvcm0oKTsKLQkJCQkJdXJsVGV4dC5zZXRUZXh0KHVybCk7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJbG9nZ2VyLmxvZ0Vycm9yKGUpOwotCQkJCX0KLQkJCX0KLQkJfQotCX07Ci0KLQlwcm90ZWN0ZWQgTW9kaWZ5TGlzdGVuZXIgdXJsVGV4dExpc3RlbmVyID0gbmV3IE1vZGlmeUxpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJCWlmIChva0J1dHRvbiAhPSBudWxsKSB7Ci0JCQkJb2tCdXR0b24uc2V0RW5hYmxlZCh1cmxUZXh0LmdldFRleHQoKS50cmltKCkubGVuZ3RoKCkgPiAwKTsKLQkJCX0KLQkJfQotCX07Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgc2hlbGwKLQkgKi8KLQlwdWJsaWMgQWRkSW1hZ2VEaWFsb2coU2hlbGwgcGFyZW50KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSAoQ29tcG9zaXRlKSBzdXBlci5jcmVhdGVEaWFsb2dBcmVhKHBhcmVudCk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gKEdyaWRMYXlvdXQpIGNvbXBvc2l0ZS5nZXRMYXlvdXQoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAzOwotCi0JCUxhYmVsIHVybExhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQl1cmxMYWJlbC5zZXRUZXh0KFJpY2hUZXh0UmVzb3VyY2VzLnVybExhYmVsX3RleHQpOwotCQl1cmxUZXh0ID0gbmV3IFRleHQoY29tcG9zaXRlLCBTV1QuQk9SREVSKTsKLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZ3JpZERhdGEud2lkdGhIaW50ID0gMzAwOwotCQl1cmxUZXh0LnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQl1cmxUZXh0LmFkZE1vZGlmeUxpc3RlbmVyKHVybFRleHRMaXN0ZW5lcik7Ci0KLQkJYnJvd3NlQnV0dG9uID0gbmV3IEJ1dHRvbihjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJYnJvd3NlQnV0dG9uLnNldFRleHQoUmljaFRleHRSZXNvdXJjZXMuYnJvd3NlQnV0dG9uX3RleHQpOwotCQlicm93c2VCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIoYnJvd3NlU2VsZWN0aW9uQWRhcHRlcik7Ci0KLQkJc3VwZXIuZ2V0U2hlbGwoKS5zZXRUZXh0KFJpY2hUZXh0UmVzb3VyY2VzLmFkZEltYWdlRGlhbG9nX3RpdGxlKTsKLQotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUJ1dHRvbnNGb3JCdXR0b25CYXIoQ29tcG9zaXRlIHBhcmVudCkgewotCQlzdXBlci5jcmVhdGVCdXR0b25zRm9yQnV0dG9uQmFyKHBhcmVudCk7Ci0JCW9rQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIG9rUHJlc3NlZCgpIHsKLQkJU3RyaW5nIHVybCA9IHVybFRleHQuZ2V0VGV4dCgpOwotCQlpZiAodXJsICE9IG51bGwgJiYgdXJsLmxlbmd0aCgpID4gMCkgewotCQkJaW1hZ2Uuc2V0VVJMKHVybCk7Ci0JCX0KLQkJc3VwZXIub2tQcmVzc2VkKCk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgdXNlciBzcGVjaWZpZWQgaW1hZ2UuCi0JICogCi0JICogQHJldHVybiBhbiA8Y29kZT5JbWFnZTwvY29kZT4gb2JqZWN0Ci0JICovCi0JcHVibGljIEltYWdlIGdldEltYWdlKCkgewotCQlyZXR1cm4gaW1hZ2U7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvZGlhbG9ncy9BZGRMaW5rRGlhbG9nLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9kaWFsb2dzL0FkZExpbmtEaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGI3NmYwYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9kaWFsb2dzL0FkZExpbmtEaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuZGlhbG9nczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuaHRtbC5MaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLQotLyoqCi0gKiBQcm9tcHRzIHRoZSB1c2VyIHRvIHNwZWNpZnkgdGhlIGZpbGUgdGhhdCB3aWxsIGJlIHVzZWQgdG8gY3JlYXRlIGEgSFRNTAotICogJmx0O2EmZ3Q7IHRhZyBpbiB0aGUgcmljaCB0ZXh0IGVkaXRvci4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBBZGRMaW5rRGlhbG9nIGV4dGVuZHMgQmFzZURpYWxvZyB7Ci0KLQlwcm90ZWN0ZWQgTGluayBsaW5rID0gbmV3IExpbmsoKTsKLQotCXByb3RlY3RlZCBUZXh0IHVybFRleHQ7Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGJhc2VQYXRoOwotCi0JcHJvdGVjdGVkIENvbXBvc2l0ZSBjb21wb3NpdGU7Ci0KLQlwcm90ZWN0ZWQgTGFiZWwgdXJsTGFiZWw7Ci0KLQlwcm90ZWN0ZWQgVGV4dCB1cmxEaXNwbGF5TmFtZVRleHQ7Ci0KLQlwcm90ZWN0ZWQgTGFiZWwgdXJsRGlzcGxheU5hbWVMYWJlbDsKLQotCXByb3RlY3RlZCBNb2RpZnlMaXN0ZW5lciB1cmxUZXh0TW9kaWZ5TGlzdGVuZXIgPSBuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotCQkJaWYgKG9rQnV0dG9uICE9IG51bGwpIHsKLQkJCQlva0J1dHRvbi5zZXRFbmFibGVkKHVybFRleHQuZ2V0VGV4dCgpLnRyaW0oKS5sZW5ndGgoKSA+IDApOwotCQkJfQotCQl9Ci0JfTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBzaGVsbAotCSAqLwotCXB1YmxpYyBBZGRMaW5rRGlhbG9nKFNoZWxsIHBhcmVudCwgU3RyaW5nIGJhc2VQYXRoKSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JCXRoaXMuYmFzZVBhdGggPSBiYXNlUGF0aDsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJY29tcG9zaXRlID0gKENvbXBvc2l0ZSkgc3VwZXIuY3JlYXRlRGlhbG9nQXJlYShwYXJlbnQpOwotCi0JCXVybExhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQl1cmxMYWJlbC5zZXRUZXh0KFJpY2hUZXh0UmVzb3VyY2VzLnVybExhYmVsX3RleHQpOwotCQl1cmxUZXh0ID0gbmV3IFRleHQoY29tcG9zaXRlLCBTV1QuQk9SREVSKTsKLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZ3JpZERhdGEud2lkdGhIaW50ID0gMzAwOwotCQl1cmxUZXh0LnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQl1cmxUZXh0LmFkZE1vZGlmeUxpc3RlbmVyKHVybFRleHRNb2RpZnlMaXN0ZW5lcik7Ci0KLQkJdXJsRGlzcGxheU5hbWVMYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJdXJsRGlzcGxheU5hbWVMYWJlbC5zZXRUZXh0KFJpY2hUZXh0UmVzb3VyY2VzLnVybERpc3BsYXlOYW1lTGFiZWxfdGV4dCk7Ci0JCXVybERpc3BsYXlOYW1lVGV4dCA9IG5ldyBUZXh0KGNvbXBvc2l0ZSwgU1dULkJPUkRFUik7Ci0JCUdyaWREYXRhIGdyaWREYXRhMiA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlncmlkRGF0YTIud2lkdGhIaW50ID0gMzAwOwotCQl1cmxEaXNwbGF5TmFtZVRleHQuc2V0TGF5b3V0RGF0YShncmlkRGF0YTIpOwotCi0JCXN1cGVyLmdldFNoZWxsKCkuc2V0VGV4dChSaWNoVGV4dFJlc291cmNlcy5hZGRMaW5rRGlhbG9nX3RpdGxlKTsKLQotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUJ1dHRvbnNGb3JCdXR0b25CYXIoQ29tcG9zaXRlIHBhcmVudCkgewotCQlzdXBlci5jcmVhdGVCdXR0b25zRm9yQnV0dG9uQmFyKHBhcmVudCk7Ci0JCW9rQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIG9rUHJlc3NlZCgpIHsKLQkJU3RyaW5nIHVybCA9IHVybFRleHQuZ2V0VGV4dCgpOwotCQlpZiAodXJsICE9IG51bGwgJiYgdXJsLmxlbmd0aCgpID4gMCkgewotCQkJbGluay5zZXRVUkwodXJsKTsKLQkJCWxpbmsuc2V0TmFtZSh1cmxEaXNwbGF5TmFtZVRleHQuZ2V0VGV4dCgpKTsKLQkJfQotCQlzdXBlci5va1ByZXNzZWQoKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSB1c2VyIHNwZWNpZmllZCBsaW5rLgotCSAqIAotCSAqIEByZXR1cm4gYW4gPGNvZGU+TGluazwvY29kZT4gb2JqZWN0Ci0JICovCi0JcHVibGljIExpbmsgZ2V0TGluaygpIHsKLQkJcmV0dXJuIGxpbms7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvZGlhbG9ncy9BZGRUYWJsZURpYWxvZy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvZGlhbG9ncy9BZGRUYWJsZURpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkODgzZDNjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2RpYWxvZ3MvQWRkVGFibGVEaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxMCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuZGlhbG9nczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuaHRtbC5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci0KLS8qKgotICogUHJvbXB0cyB0aGUgdXNlciB0byBzcGVjaWZ5IHRoZSBhdHRyaWJ1dGVzIHRoYXQgd2lsbCBiZSB1c2VkIHRvIGNyZWF0ZSBhIEhUTUwKLSAqICZsdDt0YWJsZSZndDsgdGFnIGluIHRoZSByaWNoIHRleHQgZWRpdG9yLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEFkZFRhYmxlRGlhbG9nIGV4dGVuZHMgQmFzZURpYWxvZyB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9ST1dTID0gMjsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX0NPTFVNTlMgPSAyOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfV0lEVEggPSAiODUlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gVEFCTEVfU1RZTEVfTEFCRUxTID0gewotCQkJUmljaFRleHRSZXNvdXJjZXMudGFibGVIZWFkZXJOb25lX3RleHQsCi0JCQlSaWNoVGV4dFJlc291cmNlcy50YWJsZUhlYWRlckNvbHNfdGV4dCwKLQkJCVJpY2hUZXh0UmVzb3VyY2VzLnRhYmxlSGVhZGVyUm93c190ZXh0LAotCQkJUmljaFRleHRSZXNvdXJjZXMudGFibGVIZWFkZXJCb3RoX3RleHQsIH07Ci0KLQlwcml2YXRlIFRhYmxlIHRhYmxlID0gbmV3IFRhYmxlKCk7Ci0KLQlwcml2YXRlIFRleHQgcm93c1RleHQ7Ci0KLQlwcml2YXRlIFRleHQgY29sc1RleHQ7Ci0KLQlwcml2YXRlIFRleHQgd2lkdGhUZXh0OwotCi0JcHJpdmF0ZSBDb21ibyB0YWJsZVR5cGVDb21ibzsKLQotCXByaXZhdGUgVGV4dCBzdW1tYXJ5VGV4dDsKLQotCXByaXZhdGUgVGV4dCBjYXB0aW9uVGV4dDsKLQotCXByaXZhdGUgTW9kaWZ5TGlzdGVuZXIgbW9kaWZ5TGlzdGVuZXIgPSBuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZXZlbnQpIHsKLQkJCWlmIChva0J1dHRvbiAhPSBudWxsKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJaW50IHJvd3MgPSBJbnRlZ2VyLnBhcnNlSW50KHJvd3NUZXh0LmdldFRleHQoKS50cmltKCkpOwotCQkJCQlpbnQgY29scyA9IEludGVnZXIucGFyc2VJbnQoY29sc1RleHQuZ2V0VGV4dCgpLnRyaW0oKSk7Ci0JCQkJCVN0cmluZyB3aWR0aCA9IHdpZHRoVGV4dC5nZXRUZXh0KCkudHJpbSgpOwotCQkJCQlva0J1dHRvbi5zZXRFbmFibGVkKHJvd3MgPiAwICYmIGNvbHMgPiAwCi0JCQkJCQkJJiYgd2lkdGgubGVuZ3RoKCkgPiAwKTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQlva0J1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9OwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IHNoZWxsCi0JICovCi0JcHVibGljIEFkZFRhYmxlRGlhbG9nKFNoZWxsIHBhcmVudCkgewotCQlzdXBlcihwYXJlbnQpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gKENvbXBvc2l0ZSkgc3VwZXIuY3JlYXRlRGlhbG9nQXJlYShwYXJlbnQpOwotCi0JCUxhYmVsIHJvd3NMYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJcm93c0xhYmVsLnNldFRleHQoUmljaFRleHRSZXNvdXJjZXMucm93c0xhYmVsX3RleHQpOwotCi0JCXJvd3NUZXh0ID0gbmV3IFRleHQoY29tcG9zaXRlLCBTV1QuQk9SREVSKTsKLQkJcm93c1RleHQuc2V0VGV4dExpbWl0KDIpOwotCQlyb3dzVGV4dC5zZXRUZXh0KCIiICsgREVGQVVMVF9ST1dTKTsgLy8kTk9OLU5MUy0xJAotCQl7Ci0JCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwKLQkJCQkJfCBHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwpOwotCQkJcm93c1RleHQuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCX0KLQkJcm93c1RleHQuYWRkTW9kaWZ5TGlzdGVuZXIobW9kaWZ5TGlzdGVuZXIpOwotCi0JCUxhYmVsIGNvbHNMYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJY29sc0xhYmVsLnNldFRleHQoUmljaFRleHRSZXNvdXJjZXMuY29sdW1uc0xhYmVsX3RleHQpOwotCi0JCWNvbHNUZXh0ID0gbmV3IFRleHQoY29tcG9zaXRlLCBTV1QuQk9SREVSKTsKLQkJY29sc1RleHQuc2V0VGV4dExpbWl0KDIpOwotCQljb2xzVGV4dC5zZXRUZXh0KCIiICsgREVGQVVMVF9DT0xVTU5TKTsgLy8kTk9OLU5MUy0xJAotCQl7Ci0JCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwKLQkJCQkJfCBHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwpOwotCQkJY29sc1RleHQuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCX0KLQkJY29sc1RleHQuYWRkTW9kaWZ5TGlzdGVuZXIobW9kaWZ5TGlzdGVuZXIpOwotCi0JCUxhYmVsIHdpZHRoTGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCXdpZHRoTGFiZWwuc2V0VGV4dChSaWNoVGV4dFJlc291cmNlcy53aWR0aExhYmVsX3RleHQpOwotCi0JCXdpZHRoVGV4dCA9IG5ldyBUZXh0KGNvbXBvc2l0ZSwgU1dULkJPUkRFUik7Ci0JCXdpZHRoVGV4dC5zZXRUZXh0KCIiICsgREVGQVVMVF9XSURUSCk7IC8vJE5PTi1OTFMtMSQKLQkJewotCQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMCi0JCQkJCXwgR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMKTsKLQkJCXdpZHRoVGV4dC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJfQotCQl3aWR0aFRleHQuYWRkTW9kaWZ5TGlzdGVuZXIobW9kaWZ5TGlzdGVuZXIpOwotCi0JCUxhYmVsIGhlYWRlclR5cGVMYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJaGVhZGVyVHlwZUxhYmVsLnNldFRleHQoUmljaFRleHRSZXNvdXJjZXMudGFibGVTdHlsZUxhYmVsX3RleHQpOwotCi0JCXRhYmxlVHlwZUNvbWJvID0gbmV3IENvbWJvKGNvbXBvc2l0ZSwgU1dULkJPUkRFUiB8IFNXVC5SRUFEX09OTFkpOwotCQl0YWJsZVR5cGVDb21iby5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJdGFibGVUeXBlQ29tYm8uc2V0SXRlbXMoVEFCTEVfU1RZTEVfTEFCRUxTKTsKLQkJdGFibGVUeXBlQ29tYm8uc2V0VGV4dChUQUJMRV9TVFlMRV9MQUJFTFNbMF0pOwotCi0JCUxhYmVsIHN1bW1hcnlMYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJc3VtbWFyeUxhYmVsLnNldFRleHQoUmljaFRleHRSZXNvdXJjZXMuc3VtbWFyeUxhYmVsX3RleHQpOwotCQlzdW1tYXJ5VGV4dCA9IG5ldyBUZXh0KGNvbXBvc2l0ZSwgU1dULkJPUkRFUik7Ci0JCXsKLQkJCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTAotCQkJCQl8IEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTCk7Ci0JCQlzdW1tYXJ5VGV4dC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJfQotCi0JCUxhYmVsIGNhcHRpb25MYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJY2FwdGlvbkxhYmVsLnNldFRleHQoUmljaFRleHRSZXNvdXJjZXMuY2FwdGlvbkxhYmVsX3RleHQpOwotCQljYXB0aW9uVGV4dCA9IG5ldyBUZXh0KGNvbXBvc2l0ZSwgU1dULkJPUkRFUik7Ci0JCXsKLQkJCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTAotCQkJCQl8IEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTCk7Ci0JCQljYXB0aW9uVGV4dC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJfQotCi0JCXN1cGVyLmdldFNoZWxsKCkuc2V0VGV4dChSaWNoVGV4dFJlc291cmNlcy5hZGRUYWJsZURpYWxvZ190aXRsZSk7Ci0KLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVCdXR0b25zRm9yQnV0dG9uQmFyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJc3VwZXIuY3JlYXRlQnV0dG9uc0ZvckJ1dHRvbkJhcihwYXJlbnQpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIG9rUHJlc3NlZCgpIHsKLQkJU3RyaW5nIHJvd3NWYWx1ZSA9IHJvd3NUZXh0LmdldFRleHQoKTsKLQkJaWYgKHJvd3NWYWx1ZSAhPSBudWxsICYmIHJvd3NWYWx1ZS5sZW5ndGgoKSA+IDApIHsKLQkJCXRyeSB7Ci0JCQkJaW50IHJvd3MgPSBJbnRlZ2VyLnBhcnNlSW50KHJvd3NWYWx1ZSk7Ci0JCQkJdGFibGUuc2V0Um93cyhyb3dzKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJdGFibGUuc2V0Um93cyhERUZBVUxUX1JPV1MpOwotCQkJfQotCQl9Ci0KLQkJU3RyaW5nIGNvbHNWYWx1ZSA9IGNvbHNUZXh0LmdldFRleHQoKTsKLQkJaWYgKGNvbHNWYWx1ZSAhPSBudWxsICYmIGNvbHNWYWx1ZS5sZW5ndGgoKSA+IDApIHsKLQkJCXRyeSB7Ci0JCQkJaW50IGNvbHMgPSBJbnRlZ2VyLnBhcnNlSW50KGNvbHNWYWx1ZSk7Ci0JCQkJdGFibGUuc2V0Q29sdW1ucyhjb2xzKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJdGFibGUuc2V0Q29sdW1ucyhERUZBVUxUX0NPTFVNTlMpOwotCQkJfQotCQl9Ci0KLQkJU3RyaW5nIHdpZHRoVmFsdWUgPSB3aWR0aFRleHQuZ2V0VGV4dCgpOwotCQlpZiAod2lkdGhWYWx1ZSAhPSBudWxsICYmIHdpZHRoVmFsdWUubGVuZ3RoKCkgPiAwKSB7Ci0JCQl0YWJsZS5zZXRXaWR0aCh3aWR0aFZhbHVlKTsKLQkJfSBlbHNlIHsKLQkJCXRhYmxlLnNldFdpZHRoKERFRkFVTFRfV0lEVEgpOwotCQl9Ci0KLQkJdGFibGUuc2V0U3VtbWFyeShzdW1tYXJ5VGV4dC5nZXRUZXh0KCkudHJpbSgpKTsKLQkJdGFibGUuc2V0Q2FwdGlvbihjYXB0aW9uVGV4dC5nZXRUZXh0KCkudHJpbSgpKTsKLQkJdGFibGUuc2V0VGFibGVIZWFkZXJzKHRhYmxlVHlwZUNvbWJvLmdldFNlbGVjdGlvbkluZGV4KCkpOwotCi0JCXN1cGVyLm9rUHJlc3NlZCgpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHVzZXIgc3BlY2lmaWVkIHRhYmxlLgotCSAqIAotCSAqIEByZXR1cm4gYW4gPGNvZGU+VGFibGU8L2NvZGU+IG9iamVjdAotCSAqLwotCXB1YmxpYyBUYWJsZSBnZXRUYWJsZSgpIHsKLQkJcmV0dXJuIHRhYmxlOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2RpYWxvZ3MvQmFzZURpYWxvZy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvZGlhbG9ncy9CYXNlRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjYzM5YzguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvZGlhbG9ncy9CYXNlRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuZGlhbG9nczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24uc2VydmljZWFiaWxpdHkuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotCi0vKioKLSAqIFRoZSBiYXNlIGNsYXNzIGZvciBhbGwgZGlhbG9ncyB1c2VkIGJ5IHRoZSByaWNoIHRleHQgZWRpdG9yLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEJhc2VEaWFsb2cgZXh0ZW5kcyBEaWFsb2cgewotCi0JLy8gQSBsb2dnZXIgZm9yIGxvZ2dpbmcgcnVudGltZSB3YXJuaW5ncyBhbmQgZXJyb3JzLgotCXByb3RlY3RlZCBMb2dnZXIgbG9nZ2VyOwotCi0JLy8gVGhlIE9LIGJ1dHRvbi4KLQlwcm90ZWN0ZWQgQnV0dG9uIG9rQnV0dG9uOwotCi0JLy8gVGhlIENhbmNlbCBidXR0b24uCi0JcHJvdGVjdGVkIEJ1dHRvbiBjYW5jZWxCdXR0b247Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgc2hlbGwKLQkgKi8KLQlwdWJsaWMgQmFzZURpYWxvZyhTaGVsbCBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQkJbG9nZ2VyID0gUmljaFRleHRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gKENvbXBvc2l0ZSkgc3VwZXIuY3JlYXRlRGlhbG9nQXJlYShwYXJlbnQpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IChHcmlkTGF5b3V0KSBjb21wb3NpdGUuZ2V0TGF5b3V0KCk7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDEwOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMTA7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMjsKLQkJR3JpZERhdGEgZ3JpZERhdGEgPSAoR3JpZERhdGEpIGNvbXBvc2l0ZS5nZXRMYXlvdXREYXRhKCk7Ci0JCWdyaWREYXRhLnZlcnRpY2FsSW5kZW50ID0gMTA7Ci0JCXJldHVybiBjb21wb3NpdGU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQnV0dG9uc0ZvckJ1dHRvbkJhcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCS8vIENyZWF0ZSB0aGUgT0sgYnV0dG9uLgotCQljcmVhdGVCdXR0b24ocGFyZW50LCBJRGlhbG9nQ29uc3RhbnRzLk9LX0lELCBJRGlhbG9nQ29uc3RhbnRzLk9LX0xBQkVMLAotCQkJCXRydWUpOwotCi0JCS8vIENyZWF0ZSB0aGUgQ2FuY2VsIGJ1dHRvbi4KLQkJY3JlYXRlQnV0dG9uKHBhcmVudCwgSURpYWxvZ0NvbnN0YW50cy5DQU5DRUxfSUQsCi0JCQkJSURpYWxvZ0NvbnN0YW50cy5DQU5DRUxfTEFCRUwsIGZhbHNlKTsKLQotCQkvLyBTZXQgaGVscCBjb250ZXh0IGZvciB0aGUgT0sgYnV0dG9uLgotCQlva0J1dHRvbiA9IHN1cGVyLmdldEJ1dHRvbihJRGlhbG9nQ29uc3RhbnRzLk9LX0lEKTsKLQotCQkvLyBTZXQgaGVscCBjb250ZXh0IGZvciB0aGUgQ2FuY2VsIGJ1dHRvbi4KLQkJY2FuY2VsQnV0dG9uID0gc3VwZXIuZ2V0QnV0dG9uKElEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0lEKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2RpYWxvZ3MvRmluZFJlcGxhY2VEaWFsb2cuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2RpYWxvZ3MvRmluZFJlcGxhY2VEaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODk2NDAwNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9kaWFsb2dzL0ZpbmRSZXBsYWNlRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMjcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmRpYWxvZ3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmFjdGlvbnMuRmluZFJlcGxhY2VBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLQotLyoqCi0gKiBQcm9tcHRzIHRoZSB1c2VyIHRvIHNwZWNpZnkgdGhlIHNlYXJjaCBhbmQgcmVwbGFjZSBzdHJpbmdzIGFuZCBvcHRpb25zLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEZpbmRSZXBsYWNlRGlhbG9nIGV4dGVuZHMgQmFzZURpYWxvZyB7Ci0KLQlwcml2YXRlIEZpbmRSZXBsYWNlQWN0aW9uIGZpbmRSZXBsYWNlQWN0aW9uOwotCi0JcHJpdmF0ZSBib29sZWFuIGZpbmRPbmx5OwotCi0JcHJpdmF0ZSBUZXh0IGZpbmRUZXh0OwotCi0JcHJpdmF0ZSBUZXh0IHJlcGxhY2VUZXh0OwotCi0JcHJpdmF0ZSBCdXR0b24gc2VhcmNoRm9yd2FyZFJhZGlvQnV0dG9uOwotCi0JcHJpdmF0ZSBCdXR0b24gc2VhcmNoQmFja3dhcmRSYWRpb0J1dHRvbjsKLQotCXByaXZhdGUgQnV0dG9uIGNhc2VTZW5zaXRpdmVDaGVja2JveDsKLQotCXByaXZhdGUgQnV0dG9uIHdob2xlV29yZENoZWNrYm94OwotCi0JcHJpdmF0ZSBCdXR0b24gZmluZEJ1dHRvbjsKLQotCXByaXZhdGUgQnV0dG9uIHJlcGxhY2VCdXR0b247Ci0KLQlwcml2YXRlIEJ1dHRvbiByZXBsYWNlRmluZEJ1dHRvbjsKLQotCXByaXZhdGUgQnV0dG9uIHJlcGxhY2VBbGxCdXR0b247Ci0KLQlwcml2YXRlIExhYmVsIHN0YXR1c0xhYmVsOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IHNoZWxsCi0JICogQHBhcmFtIGZpbmRSZXBsYWNlQWN0aW9uCi0JICogICAgICAgICAgICB0aGUgRmluZCBhbmQgUmVwbGFjZSBhY3Rpb24KLQkgKiBAcGFyYW0gZmluZE9ubHkKLQkgKiAgICAgICAgICAgIGlmIDxjb2RlPnRydWU8L2NvZGU+LCBkaXNhYmxlIHRoZSByZXBsYWNlIGFuZCByZXBsYWNlIGFsbAotCSAqICAgICAgICAgICAgZnVuY3Rpb25hbGl0aWVzCi0JICovCi0JcHVibGljIEZpbmRSZXBsYWNlRGlhbG9nKFNoZWxsIHBhcmVudCwgRmluZFJlcGxhY2VBY3Rpb24gZmluZFJlcGxhY2VBY3Rpb24sCi0JCQlib29sZWFuIGZpbmRPbmx5KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JCXNldFNoZWxsU3R5bGUoU1dULkRJQUxPR19UUklNIHwgU1dULk1PREVMRVNTIHwgZ2V0RGVmYXVsdE9yaWVudGF0aW9uKCkpOwotCQlzZXRCbG9ja09uT3BlbihmYWxzZSk7Ci0JCXRoaXMuZmluZFJlcGxhY2VBY3Rpb24gPSBmaW5kUmVwbGFjZUFjdGlvbjsKLQkJdGhpcy5maW5kT25seSA9IGZpbmRPbmx5OwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gKENvbXBvc2l0ZSkgc3VwZXIuY3JlYXRlRGlhbG9nQXJlYShwYXJlbnQpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IChHcmlkTGF5b3V0KSBjb21wb3NpdGUuZ2V0TGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMTsKLQotCQlDb21wb3NpdGUgdGV4dENvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCXRleHRDb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKSk7Ci0JCXRleHRDb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLQkJTGFiZWwgZmluZExhYmVsID0gbmV3IExhYmVsKHRleHRDb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJZmluZExhYmVsLnNldFRleHQoUmljaFRleHRSZXNvdXJjZXMuZmluZExhYmVsX3RleHQpOwotCQlmaW5kVGV4dCA9IG5ldyBUZXh0KHRleHRDb21wb3NpdGUsIFNXVC5CT1JERVIpOwotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlncmlkRGF0YS53aWR0aEhpbnQgPSAyMDA7Ci0JCWZpbmRUZXh0LnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQlmaW5kVGV4dC5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJCQlpZiAoZmluZEJ1dHRvbiAhPSBudWxsKSB7Ci0JCQkJCWZpbmRCdXR0b24KLQkJCQkJCQkuc2V0RW5hYmxlZChmaW5kVGV4dC5nZXRUZXh0KCkudHJpbSgpLmxlbmd0aCgpID4gMCk7Ci0JCQkJfQotCQkJCWlmIChyZXBsYWNlQWxsQnV0dG9uICE9IG51bGwgJiYgIWZpbmRPbmx5KSB7Ci0JCQkJCXJlcGxhY2VBbGxCdXR0b24uc2V0RW5hYmxlZChmaW5kVGV4dC5nZXRUZXh0KCkudHJpbSgpCi0JCQkJCQkJLmxlbmd0aCgpID4gMCk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQotCQlMYWJlbCByZXBsYWNlTGFiZWwgPSBuZXcgTGFiZWwodGV4dENvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlyZXBsYWNlTGFiZWwuc2V0VGV4dChSaWNoVGV4dFJlc291cmNlcy5yZXBsYWNlTGFiZWxfdGV4dCk7Ci0JCXJlcGxhY2VUZXh0ID0gbmV3IFRleHQodGV4dENvbXBvc2l0ZSwgU1dULkJPUkRFUik7Ci0JCXJlcGxhY2VUZXh0LnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQlpZiAoZmluZE9ubHkpIHsKLQkJCXJlcGxhY2VUZXh0LnNldEVuYWJsZWQoZmFsc2UpOwotCQl9IGVsc2UgewotCQkJcmVwbGFjZVRleHQuYWRkTW9kaWZ5TGlzdGVuZXIobmV3IE1vZGlmeUxpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotCQkJCQlpZiAocmVwbGFjZUJ1dHRvbiAhPSBudWxsKSB7Ci0JCQkJCQlyZXBsYWNlQnV0dG9uLnNldEVuYWJsZWQoZmluZFJlcGxhY2VBY3Rpb24KLQkJCQkJCQkJLmdldEZvdW5kTWF0Y2goKSk7Ci0JCQkJCX0KLQkJCQkJaWYgKHJlcGxhY2VGaW5kQnV0dG9uICE9IG51bGwpIHsKLQkJCQkJCXJlcGxhY2VGaW5kQnV0dG9uLnNldEVuYWJsZWQoZmluZFJlcGxhY2VBY3Rpb24KLQkJCQkJCQkJLmdldEZvdW5kTWF0Y2goKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9KTsKLQkJfQotCi0JCUNvbXBvc2l0ZSBvcHRpb25zQ29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJb3B0aW9uc0NvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMiwgdHJ1ZSkpOwotCQlvcHRpb25zQ29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCi0JCUdyb3VwIGRpcmVjdGlvbkdyb3VwID0gbmV3IEdyb3VwKG9wdGlvbnNDb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJZGlyZWN0aW9uR3JvdXAuc2V0VGV4dChSaWNoVGV4dFJlc291cmNlcy5kaXJlY3Rpb25Hcm91cF90ZXh0KTsKLQkJZGlyZWN0aW9uR3JvdXAuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDEsIGZhbHNlKSk7Ci0JCWRpcmVjdGlvbkdyb3VwLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQlzZWFyY2hGb3J3YXJkUmFkaW9CdXR0b24gPSBuZXcgQnV0dG9uKGRpcmVjdGlvbkdyb3VwLCBTV1QuUkFESU8pOwotCQlzZWFyY2hGb3J3YXJkUmFkaW9CdXR0b24KLQkJCQkuc2V0VGV4dChSaWNoVGV4dFJlc291cmNlcy5mb3J3YXJkUmFkaW9CdXR0b25fdGV4dCk7Ci0JCXNlYXJjaEZvcndhcmRSYWRpb0J1dHRvbi5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCXNlYXJjaEJhY2t3YXJkUmFkaW9CdXR0b24gPSBuZXcgQnV0dG9uKGRpcmVjdGlvbkdyb3VwLCBTV1QuUkFESU8pOwotCQlzZWFyY2hCYWNrd2FyZFJhZGlvQnV0dG9uCi0JCQkJLnNldFRleHQoUmljaFRleHRSZXNvdXJjZXMuYmFja3dhcmRSYWRpb0J1dHRvbl90ZXh0KTsKLQotCQlHcm91cCBvcHRpb25zR3JvdXAgPSBuZXcgR3JvdXAob3B0aW9uc0NvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlvcHRpb25zR3JvdXAuc2V0VGV4dChSaWNoVGV4dFJlc291cmNlcy5vcHRpb25zR3JvdXBfdGV4dCk7Ci0JCW9wdGlvbnNHcm91cC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMSwgZmFsc2UpKTsKLQkJb3B0aW9uc0dyb3VwLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQljYXNlU2Vuc2l0aXZlQ2hlY2tib3ggPSBuZXcgQnV0dG9uKG9wdGlvbnNHcm91cCwgU1dULkNIRUNLKTsKLQkJY2FzZVNlbnNpdGl2ZUNoZWNrYm94Ci0JCQkJLnNldFRleHQoUmljaFRleHRSZXNvdXJjZXMuY2FzZVNlbnNpdGl2ZUNoZWNrYm94X3RleHQpOwotCQl3aG9sZVdvcmRDaGVja2JveCA9IG5ldyBCdXR0b24ob3B0aW9uc0dyb3VwLCBTV1QuQ0hFQ0spOwotCQl3aG9sZVdvcmRDaGVja2JveC5zZXRUZXh0KFJpY2hUZXh0UmVzb3VyY2VzLndob2xlV29yZENoZWNrYm94X3RleHQpOwotCi0JCXN0YXR1c0xhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlzdGF0dXNMYWJlbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQotCQlzdXBlci5nZXRTaGVsbCgpLnNldFRleHQoUmljaFRleHRSZXNvdXJjZXMuZmluZFJlcGxhY2VEaWFsb2dfdGl0bGUpOwotCi0JCXJldHVybiBjb21wb3NpdGU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQnV0dG9uc0ZvckJ1dHRvbkJhcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCWNyZWF0ZUJ1dHRvbihwYXJlbnQsIElEaWFsb2dDb25zdGFudHMuQ0xJRU5UX0lEICsgMSwKLQkJCQlSaWNoVGV4dFJlc291cmNlcy5maW5kQnV0dG9uX3RleHQsIHRydWUpOwotCQlmaW5kQnV0dG9uID0gc3VwZXIuZ2V0QnV0dG9uKElEaWFsb2dDb25zdGFudHMuQ0xJRU5UX0lEICsgMSk7Ci0JCWZpbmRCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlmaW5kUmVwbGFjZUFjdGlvbi5ydW4oRmluZFJlcGxhY2VBY3Rpb24uRklORF9URVhULAotCQkJCQkJZ2V0RmluZFRleHQoKSwgZ2V0UmVwbGFjZVRleHQoKSwgZ2V0TWF0Y2hEaXJlY3Rpb24oKSwKLQkJCQkJCWdldE1hdGNoT3B0aW9ucygpKTsKLQkJCQlpZiAoIWZpbmRPbmx5KSB7Ci0JCQkJCXJlcGxhY2VCdXR0b24uc2V0RW5hYmxlZChmaW5kUmVwbGFjZUFjdGlvbi5nZXRGb3VuZE1hdGNoKCkpOwotCQkJCQlyZXBsYWNlRmluZEJ1dHRvbi5zZXRFbmFibGVkKGZpbmRSZXBsYWNlQWN0aW9uCi0JCQkJCQkJLmdldEZvdW5kTWF0Y2goKSk7Ci0JCQkJfQotCQkJCWlmIChmaW5kUmVwbGFjZUFjdGlvbi5nZXRGb3VuZE1hdGNoKCkpIHsKLQkJCQkJc3RhdHVzTGFiZWwuc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLQkJCQl9IGVsc2UgewotCQkJCQlzdGF0dXNMYWJlbAotCQkJCQkJCS5zZXRUZXh0KFJpY2hUZXh0UmVzb3VyY2VzLkZpbmRSZXBsYWNlX1N0YXR1c19ub01hdGNoX2xhYmVsKTsKLQkJCQl9Ci0JCQkJZmluZEJ1dHRvbi5zZXRGb2N1cygpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJfQotCQl9KTsKLQotCQljcmVhdGVCdXR0b24ocGFyZW50LCBJRGlhbG9nQ29uc3RhbnRzLkNMSUVOVF9JRCArIDIsCi0JCQkJUmljaFRleHRSZXNvdXJjZXMucmVwbGFjZUJ1dHRvbl90ZXh0LCBmYWxzZSk7Ci0JCXJlcGxhY2VCdXR0b24gPSBzdXBlci5nZXRCdXR0b24oSURpYWxvZ0NvbnN0YW50cy5DTElFTlRfSUQgKyAyKTsKLQkJaWYgKCFmaW5kT25seSkgewotCQkJcmVwbGFjZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQkJZmluZFJlcGxhY2VBY3Rpb24ucnVuKEZpbmRSZXBsYWNlQWN0aW9uLlJFUExBQ0VfVEVYVCwKLQkJCQkJCQlnZXRGaW5kVGV4dCgpLCBnZXRSZXBsYWNlVGV4dCgpLAotCQkJCQkJCWdldE1hdGNoRGlyZWN0aW9uKCksIGdldE1hdGNoT3B0aW9ucygpKTsKLQkJCQkJcmVwbGFjZUJ1dHRvbi5zZXRGb2N1cygpOwotCQkJCX0KLQotCQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQotCQljcmVhdGVCdXR0b24ocGFyZW50LCBJRGlhbG9nQ29uc3RhbnRzLkNMSUVOVF9JRCArIDMsCi0JCQkJUmljaFRleHRSZXNvdXJjZXMucmVwbGFjZUZpbmRCdXR0b25fdGV4dCwgZmFsc2UpOwotCQlyZXBsYWNlRmluZEJ1dHRvbiA9IHN1cGVyLmdldEJ1dHRvbihJRGlhbG9nQ29uc3RhbnRzLkNMSUVOVF9JRCArIDMpOwotCQlpZiAoIWZpbmRPbmx5KSB7Ci0JCQlyZXBsYWNlRmluZEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQkJZmluZFJlcGxhY2VBY3Rpb24ucnVuKEZpbmRSZXBsYWNlQWN0aW9uLlJFUExBQ0VfRklORF9URVhULAotCQkJCQkJCWdldEZpbmRUZXh0KCksIGdldFJlcGxhY2VUZXh0KCksCi0JCQkJCQkJZ2V0TWF0Y2hEaXJlY3Rpb24oKSwgZ2V0TWF0Y2hPcHRpb25zKCkpOwotCQkJCQlyZXBsYWNlQnV0dG9uLnNldEVuYWJsZWQoZmluZFJlcGxhY2VBY3Rpb24uZ2V0Rm91bmRNYXRjaCgpKTsKLQkJCQkJcmVwbGFjZUZpbmRCdXR0b24uc2V0RW5hYmxlZChmaW5kUmVwbGFjZUFjdGlvbgotCQkJCQkJCS5nZXRGb3VuZE1hdGNoKCkpOwotCQkJCQlyZXBsYWNlRmluZEJ1dHRvbi5zZXRGb2N1cygpOwotCQkJCX0KLQotCQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQotCQljcmVhdGVCdXR0b24ocGFyZW50LCBJRGlhbG9nQ29uc3RhbnRzLkNMSUVOVF9JRCArIDQsCi0JCQkJUmljaFRleHRSZXNvdXJjZXMucmVwbGFjZWFsbEJ1dHRvbl90ZXh0LCBmYWxzZSk7Ci0JCXJlcGxhY2VBbGxCdXR0b24gPSBzdXBlci5nZXRCdXR0b24oSURpYWxvZ0NvbnN0YW50cy5DTElFTlRfSUQgKyA0KTsKLQkJaWYgKCFmaW5kT25seSkgewotCQkJcmVwbGFjZUFsbEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQkJZmluZFJlcGxhY2VBY3Rpb24ucnVuKEZpbmRSZXBsYWNlQWN0aW9uLlJFUExBQ0VfQUxMX1RFWFQsCi0JCQkJCQkJZ2V0RmluZFRleHQoKSwgZ2V0UmVwbGFjZVRleHQoKSwKLQkJCQkJCQlnZXRNYXRjaERpcmVjdGlvbigpLCBnZXRNYXRjaE9wdGlvbnMoKSk7Ci0JCQkJCXJlcGxhY2VCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJCXJlcGxhY2VGaW5kQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCQlyZXBsYWNlQWxsQnV0dG9uLnNldEZvY3VzKCk7Ci0JCQkJfQotCi0JCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQl9Ci0JCQl9KTsKLQkJfQotCi0JCS8vIENyZWF0ZSB0aGUgQ2FuY2VsIGJ1dHRvbi4KLQkJY3JlYXRlQnV0dG9uKHBhcmVudCwgSURpYWxvZ0NvbnN0YW50cy5DQU5DRUxfSUQsCi0JCQkJSURpYWxvZ0NvbnN0YW50cy5DQU5DRUxfTEFCRUwsIGZhbHNlKTsKLQkJY2FuY2VsQnV0dG9uID0gc3VwZXIuZ2V0QnV0dG9uKElEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0lEKTsKLQotCQlmaW5kQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQlyZXBsYWNlQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQlyZXBsYWNlRmluZEJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJcmVwbGFjZUFsbEJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSB1c2VyIHNwZWNpZmllZCBmaW5kIHRleHQuCi0JICogCi0JICogQHJldHVybiB0aGUgZmluZCB0ZXh0Ci0JICovCi0JcHVibGljIFN0cmluZyBnZXRGaW5kVGV4dCgpIHsKLQkJcmV0dXJuIGZpbmRUZXh0LmdldFRleHQoKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSB1c2VyIHNwZWNpZmllZCByZXBsYWNlIHRleHQuCi0JICogCi0JICogQHJldHVybiB0aGUgcmVwbGFjZSB0ZXh0Ci0JICovCi0JcHVibGljIFN0cmluZyBnZXRSZXBsYWNlVGV4dCgpIHsKLQkJcmV0dXJuIHJlcGxhY2VUZXh0LmdldFRleHQoKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSB0ZXh0IG1hdGNoIGRpcmVjdGlvbi4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPkZJTkRfRk9SV0FSRDwvY29kZT4gb3IgPGNvZGU+RklORF9CQUNLV0FSRDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgaW50IGdldE1hdGNoRGlyZWN0aW9uKCkgewotCQlyZXR1cm4gc2VhcmNoRm9yd2FyZFJhZGlvQnV0dG9uLmdldFNlbGVjdGlvbigpID8gRmluZFJlcGxhY2VBY3Rpb24uRk9SV0FSRF9NQVRDSAotCQkJCTogRmluZFJlcGxhY2VBY3Rpb24uQkFDS1dBUkRfTUFUQ0g7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgdGV4dCBtYXRjaCBvcHRpb25zLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHRleHQgbWF0Y2ggb3B0aW9ucwotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TWF0Y2hPcHRpb25zKCkgewotCQlpbnQgb3B0aW9ucyA9IDA7Ci0JCWlmICh3aG9sZVdvcmRDaGVja2JveC5nZXRTZWxlY3Rpb24oKSA9PSB0cnVlKSB7Ci0JCQlvcHRpb25zIHw9IEZpbmRSZXBsYWNlQWN0aW9uLldIT0xFX1dPUkRfTUFUQ0g7Ci0JCX0KLQkJaWYgKGNhc2VTZW5zaXRpdmVDaGVja2JveC5nZXRTZWxlY3Rpb24oKSA9PSB0cnVlKSB7Ci0JCQlvcHRpb25zIHw9IEZpbmRSZXBsYWNlQWN0aW9uLkNBU0VfU0VOU0lUSVZFX01BVENIOwotCQl9Ci0JCXJldHVybiBvcHRpb25zOwotCX0KLQotCS8qKgotCSAqIENoZWNrcyB0aGUgZmluZCBvbmx5IG9wdGlvbi4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIGZpbmQgb25seSBvcHRpb24gaXMgZW5hYmxlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRmluZE9ubHkoKSB7Ci0JCXJldHVybiBmaW5kT25seTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBmaW5kIG9ubHkgb3B0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBmaW5kT25seSwKLQkgKiAgICAgICAgICAgIGlmIDxjb2RlPnRydWU8L2NvZGU+LCBlbmFibGUgdGhlIGZpbmQgb25seSBvcHRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGaW5kT25seShib29sZWFuIGZpbmRPbmx5KSB7Ci0JCXRoaXMuZmluZE9ubHkgPSBmaW5kT25seTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9kaWFsb2dzL3BhY2thZ2UuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2RpYWxvZ3MvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZjVkZDEzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2RpYWxvZ3MvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgZWRpdGluZyBkaWFsb2dzIGZvciB0aGUgcmljaCB0ZXh0IGNvbnRyb2wgYW5kIGVkaXRvci4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9odG1sL0Jsb2NrVGFnLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9odG1sL0Jsb2NrVGFnLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlYzc5MGIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvaHRtbC9CbG9ja1RhZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5odG1sOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dFJlc291cmNlczsKLQotLyoqCi0gKiBNb2RlbHMgYSBIVE1MIGJsb2NrIHRhZy4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBCbG9ja1RhZyB7Ci0KLQkvLyBUaGUgdXNlciBmcmllbmRseSBuYW1lcy4KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9QQVJBR1JBUEggPSBSaWNoVGV4dFJlc291cmNlcy5ibG9ja1RhZ19wYXJhZ3JhcGg7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9IRUFESU5HXzEgPSBSaWNoVGV4dFJlc291cmNlcy5ibG9ja1RhZ19oZWFkaW5nMTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX0hFQURJTkdfMiA9IFJpY2hUZXh0UmVzb3VyY2VzLmJsb2NrVGFnX2hlYWRpbmcyOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfSEVBRElOR18zID0gUmljaFRleHRSZXNvdXJjZXMuYmxvY2tUYWdfaGVhZGluZzM7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9IRUFESU5HXzQgPSBSaWNoVGV4dFJlc291cmNlcy5ibG9ja1RhZ19oZWFkaW5nNDsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX0hFQURJTkdfNSA9IFJpY2hUZXh0UmVzb3VyY2VzLmJsb2NrVGFnX2hlYWRpbmc1OwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfSEVBRElOR182ID0gUmljaFRleHRSZXNvdXJjZXMuYmxvY2tUYWdfaGVhZGluZzY7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9BRERSRVNTID0gUmljaFRleHRSZXNvdXJjZXMuYmxvY2tUYWdfYWRkcmVzczsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX1BSRUZPUk1BVFRFRF9URVhUID0gUmljaFRleHRSZXNvdXJjZXMuYmxvY2tUYWdfcHJlZm9ybWF0dGVkVGV4dDsKLQotCS8vIFRoZSBpbnRlcm5hbCB2YWx1ZXMuCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTFVFX1BBUkFHUkFQSCA9ICI8cD4iOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMVUVfSEVBRElOR18xID0gIjxoMT4iOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMVUVfSEVBRElOR18yID0gIjxoMj4iOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMVUVfSEVBRElOR18zID0gIjxoMz4iOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMVUVfSEVBRElOR180ID0gIjxoND4iOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMVUVfSEVBRElOR181ID0gIjxoNT4iOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMVUVfSEVBRElOR182ID0gIjxoNj4iOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMVUVfQUREUkVTUyA9ICI8YWRkcmVzcz4iOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMVUVfUFJFRk9STUFUVEVEX1RFWFQgPSAiPHByZT4iOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgJmx0O3AmZ3Q7IHRhZy4KLQkgKi8KLQlzdGF0aWMgcHVibGljIGZpbmFsIEJsb2NrVGFnIFBBUkFHUkFQSCA9IG5ldyBCbG9ja1RhZyhOQU1FX1BBUkFHUkFQSCwKLQkJCVZBTFVFX1BBUkFHUkFQSCk7Ci0KLQkvKioKLQkgKiAmbHQ7aDEmZ3Q7IHRhZy4KLQkgKi8KLQlzdGF0aWMgcHVibGljIGZpbmFsIEJsb2NrVGFnIEhFQURJTkdfMSA9IG5ldyBCbG9ja1RhZyhOQU1FX0hFQURJTkdfMSwKLQkJCVZBTFVFX0hFQURJTkdfMSk7Ci0KLQkvKioKLQkgKiAmbHQ7aDImZ3Q7IHRhZy4KLQkgKi8KLQlzdGF0aWMgcHVibGljIGZpbmFsIEJsb2NrVGFnIEhFQURJTkdfMiA9IG5ldyBCbG9ja1RhZyhOQU1FX0hFQURJTkdfMiwKLQkJCVZBTFVFX0hFQURJTkdfMik7Ci0KLQkvKioKLQkgKiAmbHQ7aDMmZ3Q7IHRhZy4KLQkgKi8KLQlzdGF0aWMgcHVibGljIGZpbmFsIEJsb2NrVGFnIEhFQURJTkdfMyA9IG5ldyBCbG9ja1RhZyhOQU1FX0hFQURJTkdfMywKLQkJCVZBTFVFX0hFQURJTkdfMyk7Ci0KLQkvKioKLQkgKiAmbHQ7aDQmZ3Q7IHRhZy4KLQkgKi8KLQlzdGF0aWMgcHVibGljIGZpbmFsIEJsb2NrVGFnIEhFQURJTkdfNCA9IG5ldyBCbG9ja1RhZyhOQU1FX0hFQURJTkdfNCwKLQkJCVZBTFVFX0hFQURJTkdfNCk7Ci0KLQkvKioKLQkgKiAmbHQ7aDUmZ3Q7IHRhZy4KLQkgKi8KLQlzdGF0aWMgcHVibGljIGZpbmFsIEJsb2NrVGFnIEhFQURJTkdfNSA9IG5ldyBCbG9ja1RhZyhOQU1FX0hFQURJTkdfNSwKLQkJCVZBTFVFX0hFQURJTkdfNSk7Ci0KLQkvKioKLQkgKiAmbHQ7aDYmZ3Q7IHRhZy4KLQkgKi8KLQlzdGF0aWMgcHVibGljIGZpbmFsIEJsb2NrVGFnIEhFQURJTkdfNiA9IG5ldyBCbG9ja1RhZyhOQU1FX0hFQURJTkdfNiwKLQkJCVZBTFVFX0hFQURJTkdfNik7Ci0KLQkvKioKLQkgKiAmbHQ7YWRkcmVzcyZndDsgdGFnLgotCSAqLwotCXN0YXRpYyBwdWJsaWMgZmluYWwgQmxvY2tUYWcgQUREUkVTUyA9IG5ldyBCbG9ja1RhZyhOQU1FX0FERFJFU1MsCi0JCQlWQUxVRV9BRERSRVNTKTsKLQotCS8qKgotCSAqICZsdDtwcmUmZ3Q7IHRhZy4KLQkgKi8KLQlzdGF0aWMgcHVibGljIGZpbmFsIEJsb2NrVGFnIFBSRUZPUk1BVFRFRF9URVhUID0gbmV3IEJsb2NrVGFnKAotCQkJTkFNRV9QUkVGT1JNQVRURURfVEVYVCwgVkFMVUVfUFJFRk9STUFUVEVEX1RFWFQpOwotCi0JLy8gQSBsaXN0IG9mIDxjb2RlPkJsb2NrVGFnPC9jb2RlPiBvYmplY3RzLgotCXN0YXRpYyBwcml2YXRlIGZpbmFsIExpc3Q8QmxvY2tUYWc+IEJMT0NLX1RBR1MgPSBuZXcgQXJyYXlMaXN0PEJsb2NrVGFnPigpOwotCXN0YXRpYyB7Ci0JCUJMT0NLX1RBR1MuYWRkKFBBUkFHUkFQSCk7Ci0JCUJMT0NLX1RBR1MuYWRkKEhFQURJTkdfMSk7Ci0JCUJMT0NLX1RBR1MuYWRkKEhFQURJTkdfMik7Ci0JCUJMT0NLX1RBR1MuYWRkKEhFQURJTkdfMyk7Ci0JCUJMT0NLX1RBR1MuYWRkKEhFQURJTkdfNCk7Ci0JCUJMT0NLX1RBR1MuYWRkKEhFQURJTkdfNSk7Ci0JCUJMT0NLX1RBR1MuYWRkKEhFQURJTkdfNik7Ci0JCUJMT0NLX1RBR1MuYWRkKEFERFJFU1MpOwotCQlCTE9DS19UQUdTLmFkZChQUkVGT1JNQVRURURfVEVYVCk7Ci0JfQotCi0JLy8gVGhlIGJsb2NrIHRhZyBuYW1lLgotCXByaXZhdGUgU3RyaW5nIG5hbWU7Ci0KLQkvLyBUaGUgYmxvY2sgdGFnIHZhbHVlLgotCXByaXZhdGUgU3RyaW5nIHZhbHVlOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gbmFtZQotCSAqICAgICAgICAgICAgdGhlIGJsb2NrIHRhZyBuYW1lCi0JICogQHBhcmFtIHZhbHVlCi0JICogICAgICAgICAgICB0aGUgYmxvY2sgdGFnIHZhbHVlCi0JICovCi0JcHVibGljIEJsb2NrVGFnKFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWUpIHsKLQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJdGhpcy52YWx1ZSA9IHZhbHVlOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGJsb2NrIHRhZyBuYW1lLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGJsb2NrIHRhZyBuYW1lCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBibG9jayB0YWcgdmFsdWUuCi0JICogCi0JICogQHJldHVybiB0aGUgYmxvY2sgdGFnIHZhbHVlCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpIHsKLQkJcmV0dXJuIHZhbHVlOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIDxjb2RlPkJsb2NrVGFnPC9jb2RlPiBvYmplY3QgdGhhdCBpcyBtYXBwZWQgdG8gdGhlIGdpdmVuCi0JICogaW5kZXguCi0JICogCi0JICogQHBhcmFtIGluZGV4Ci0JICogICAgICAgICAgICBhbiBpbmRleCBpbnRvIHRoZSA8Y29kZT5CbG9ja1RhZzwvY29kZT4gbGlzdAotCSAqIEByZXR1cm4gYSA8Y29kZT5CbG9ja1RhZzwvY29kZT4gb2JqZWN0Ci0JICovCi0JcHVibGljIHN0YXRpYyBCbG9ja1RhZyBnZXRCbG9ja1RhZyhpbnQgaW5kZXgpIHsKLQkJQmxvY2tUYWcgcmVzdWx0ID0gKEJsb2NrVGFnKSBCTE9DS19UQUdTLmdldChpbmRleCk7Ci0JCWlmIChyZXN1bHQgIT0gbnVsbCkgewotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQlyZXR1cm4gUEFSQUdSQVBIOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2h0bWwvRm9udE5hbWUuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2h0bWwvRm9udE5hbWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTQ3YTNkNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9odG1sL0ZvbnROYW1lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0Lmh0bWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0UmVzb3VyY2VzOwotCi0vKioKLSAqIE1vZGVscyBhIEhUTUwgZm9udCBuYW1lLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEZvbnROYW1lIHsKLQotCS8vIFRoZSB1c2VyIGZyaWVuZGx5IG5hbWVzLgotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX0RFRkFVTFQgPSBSaWNoVGV4dFJlc291cmNlcy5mb250TmFtZV9kZWZhdWx0OwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfQVJJQUwgPSBSaWNoVGV4dFJlc291cmNlcy5mb250TmFtZV9hcmlhbDsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX0NPVVJJRVJfTkVXID0gUmljaFRleHRSZXNvdXJjZXMuZm9udE5hbWVfY291cmllck5ldzsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX1RJTUVTX05FV19ST01BTiA9IFJpY2hUZXh0UmVzb3VyY2VzLmZvbnROYW1lX3RpbWVzTmV3Um9tYW47Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9WRVJEQU5BID0gUmljaFRleHRSZXNvdXJjZXMuZm9udE5hbWVfdmVyZGFuYTsKLQotCS8vIFRoZSBpbnRlcm5hbCB2YWx1ZXMuCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTFVFX0RFRkFVTFQgPSAiIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTFVFX0FSSUFMID0gIkFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWYiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMVUVfQ09VUklFUl9ORVcgPSAiQ291cmllciBOZXcsIENvdXJpZXIsIG1vbm8iOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMVUVfVElNRVNfTkVXX1JPTUFOID0gIlRpbWVzIE5ldyBSb21hbiwgVGltZXMsIHNlcmlmIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTFVFX1ZFUkRBTkEgPSAiVmVyZGFuYSwgQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZiI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIERlZmF1bHQgZm9udC4KLQkgKi8KLQlzdGF0aWMgcHVibGljIGZpbmFsIEZvbnROYW1lIERFRkFVTFQgPSBuZXcgRm9udE5hbWUoTkFNRV9ERUZBVUxULAotCQkJVkFMVUVfREVGQVVMVCk7Ci0KLQkvKioKLQkgKiBBcmlhbCBmb250LgotCSAqLwotCXN0YXRpYyBwdWJsaWMgZmluYWwgRm9udE5hbWUgQVJJQUwgPSBuZXcgRm9udE5hbWUoTkFNRV9BUklBTCwgVkFMVUVfQVJJQUwpOwotCi0JLyoqCi0JICogQ291cmllciBOZXcgZm9udC4KLQkgKi8KLQlzdGF0aWMgcHVibGljIGZpbmFsIEZvbnROYW1lIENPVVJJRVJfTkVXID0gbmV3IEZvbnROYW1lKE5BTUVfQ09VUklFUl9ORVcsCi0JCQlWQUxVRV9DT1VSSUVSX05FVyk7Ci0KLQkvKioKLQkgKiBUaW1lcyBOZXcgUm9tYW4gZm9udC4KLQkgKi8KLQlzdGF0aWMgcHVibGljIGZpbmFsIEZvbnROYW1lIFRJTUVTX05FV19ST01BTiA9IG5ldyBGb250TmFtZSgKLQkJCU5BTUVfVElNRVNfTkVXX1JPTUFOLCBWQUxVRV9USU1FU19ORVdfUk9NQU4pOwotCi0JLyoqCi0JICogVmVyZGFuYSBmb250LgotCSAqLwotCXN0YXRpYyBwdWJsaWMgZmluYWwgRm9udE5hbWUgVkVSREFOQSA9IG5ldyBGb250TmFtZShOQU1FX1ZFUkRBTkEsCi0JCQlWQUxVRV9WRVJEQU5BKTsKLQotCS8vIEEgbGlzdCBvZiA8Y29kZT5Gb250TmFtZTwvY29kZT4gb2JqZWN0cy4KLQlzdGF0aWMgcHJpdmF0ZSBmaW5hbCBMaXN0PEZvbnROYW1lPiBGT05UX05BTUVTID0gbmV3IEFycmF5TGlzdDxGb250TmFtZT4oKTsKLQlzdGF0aWMgewotCQlGT05UX05BTUVTLmFkZChERUZBVUxUKTsKLQkJRk9OVF9OQU1FUy5hZGQoQVJJQUwpOwotCQlGT05UX05BTUVTLmFkZChDT1VSSUVSX05FVyk7Ci0JCUZPTlRfTkFNRVMuYWRkKFRJTUVTX05FV19ST01BTik7Ci0JCUZPTlRfTkFNRVMuYWRkKFZFUkRBTkEpOwotCX0KLQotCS8vIFRoZSBmb250IG5hbWUuCi0JcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLQotCS8vIFRoZSBmb250IHZhbHVlLgotCXByaXZhdGUgU3RyaW5nIHZhbHVlOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gbmFtZQotCSAqICAgICAgICAgICAgdGhlIGZvbnQgbmFtZQotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgdGhlIGZvbnQgdmFsdWUKLQkgKi8KLQlwdWJsaWMgRm9udE5hbWUoU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSkgewotCQl0aGlzLm5hbWUgPSBuYW1lOwotCQl0aGlzLnZhbHVlID0gdmFsdWU7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgZm9udCBuYW1lLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGZvbnQgbmFtZQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgZm9udCB2YWx1ZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBmb250IHZhbHVlCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpIHsKLQkJcmV0dXJuIHZhbHVlOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIDxjb2RlPkZvbnROYW1lPC9jb2RlPiBvYmplY3QgdGhhdCBpcyBtYXBwZWQgdG8gdGhlIGdpdmVuCi0JICogaW5kZXguCi0JICogCi0JICogQHBhcmFtIGluZGV4Ci0JICogICAgICAgICAgICBhbiBpbmRleCBpbnRvIHRoZSA8Y29kZT5Gb250TmFtZTwvY29kZT4gbGlzdAotCSAqIEByZXR1cm4gYSA8Y29kZT5Gb250TmFtZTwvY29kZT4gb2JqZWN0Ci0JICovCi0JcHVibGljIHN0YXRpYyBGb250TmFtZSBnZXRGb250TmFtZShpbnQgaW5kZXgpIHsKLQkJRm9udE5hbWUgcmVzdWx0ID0gKEZvbnROYW1lKSBGT05UX05BTUVTLmdldChpbmRleCk7Ci0JCWlmIChyZXN1bHQgIT0gbnVsbCkgewotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQlyZXR1cm4gREVGQVVMVDsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9odG1sL0ZvbnRTdHlsZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvaHRtbC9Gb250U3R5bGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzMzYThkOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9odG1sL0ZvbnRTdHlsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5odG1sOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRSZXNvdXJjZXM7Ci0KLS8qKgotICogTW9kZWxzIGEgSFRNTCBmb250IHN0eWxlLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEZvbnRTdHlsZSB7Ci0KLQkvLyBUaGUgdXNlciBmcmllbmRseSBuYW1lcy4KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9OT1JNQUwgPSBSaWNoVGV4dFJlc291cmNlcy5mb250U3R5bGVfbm9ybWFsOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfU0VDVElPTl9IRUFESU5HID0gUmljaFRleHRSZXNvdXJjZXMuZm9udFN0eWxlX3NlY3Rpb25IZWFkaW5nOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfU1VCU0VDVElPTl9IRUFESU5HID0gUmljaFRleHRSZXNvdXJjZXMuZm9udFN0eWxlX3N1YnNlY3Rpb25IZWFkaW5nOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfU1VCX1NVQlNFQ1RJT05fSEVBRElORyA9IFJpY2hUZXh0UmVzb3VyY2VzLmZvbnRTdHlsZV9zdWJTdWJzZWN0aW9uSGVhZGluZzsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX1FVT1RFID0gUmljaFRleHRSZXNvdXJjZXMuZm9udFN0eWxlX3F1b3RlOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfQ09ERV9TQU1QTEUgPSBSaWNoVGV4dFJlc291cmNlcy5mb250U3R5bGVfY29kZVNhbXBsZTsKLQotCS8vIFRoZSBpbnRlcm5hbCB2YWx1ZXMuCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTFVFX05PUk1BTCA9ICI8cD4iOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMVUVfU0VDVElPTl9IRUFESU5HID0gIjxoMz4iOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMVUVfU1VCU0VDVElPTl9IRUFESU5HID0gIjxoND4iOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMVUVfU1VCX1NVQlNFQ1RJT05fSEVBRElORyA9ICI8aDU+IjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTFVFX1FVT1RFID0gIjxxdW90ZT4iOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMVUVfQ09ERV9TQU1QTEUgPSAiPGNvZGU+IjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogRm9udCBzdHlsZSBmb3Igbm9ybWFsIHRleHQuCi0JICovCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBGb250U3R5bGUgTk9STUFMID0gbmV3IEZvbnRTdHlsZShOQU1FX05PUk1BTCwKLQkJCVZBTFVFX05PUk1BTCk7Ci0KLQkvKioKLQkgKiBGb250IHN0eWxlIGZvciBzZWN0aW9uIGhlYWRpbmcuCi0JICovCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBGb250U3R5bGUgU0VDVElPTl9IRUFESU5HID0gbmV3IEZvbnRTdHlsZSgKLQkJCU5BTUVfU0VDVElPTl9IRUFESU5HLCBWQUxVRV9TRUNUSU9OX0hFQURJTkcpOwotCi0JLyoqCi0JICogRm9udCBzdHlsZSBmb3Igc3ViIHNlY3Rpb24gaGVhZGluZy4KLQkgKi8KLQlzdGF0aWMgcHVibGljIGZpbmFsIEZvbnRTdHlsZSBTVUJTRUNUSU9OX0hFQURJTkcgPSBuZXcgRm9udFN0eWxlKAotCQkJTkFNRV9TVUJTRUNUSU9OX0hFQURJTkcsIFZBTFVFX1NVQlNFQ1RJT05fSEVBRElORyk7Ci0JLyoqCi0JICogRm9udCBzdHlsZSBmb3Igc3ViIHN1YiBzZWN0aW9uIGhlYWRpbmcuCi0JICovCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBGb250U3R5bGUgU1VCX1NVQlNFQ1RJT05fSEVBRElORyA9IG5ldyBGb250U3R5bGUoCi0JCQlOQU1FX1NVQl9TVUJTRUNUSU9OX0hFQURJTkcsIFZBTFVFX1NVQl9TVUJTRUNUSU9OX0hFQURJTkcpOwotCi0JLyoqCi0JICogRm9udCBzdHlsZSBmb3IgcXVvdGF0aW9ucy4KLQkgKi8KLQlzdGF0aWMgcHVibGljIGZpbmFsIEZvbnRTdHlsZSBRVU9URSA9IG5ldyBGb250U3R5bGUoTkFNRV9RVU9URSwgVkFMVUVfUVVPVEUpOwotCi0JLyoqCi0JICogRm9udCBzdHlsZSBmb3IgZGlzcGxheWluZyBwcm9ncmFtIGNvZGVzLgotCSAqLwotCXN0YXRpYyBwdWJsaWMgZmluYWwgRm9udFN0eWxlIENPREVfU0FNUExFID0gbmV3IEZvbnRTdHlsZShOQU1FX0NPREVfU0FNUExFLAotCQkJVkFMVUVfQ09ERV9TQU1QTEUpOwotCi0JLy8gQSBsaXN0IG9mIDxjb2RlPkZvbnRTdHlsZTwvY29kZT4gb2JqZWN0cy4KLQlzdGF0aWMgcHJpdmF0ZSBmaW5hbCBMaXN0PEZvbnRTdHlsZT4gRk9OVF9TVFlMRVMgPSBuZXcgQXJyYXlMaXN0PEZvbnRTdHlsZT4oKTsKLQlzdGF0aWMgewotCQlGT05UX1NUWUxFUy5hZGQoTk9STUFMKTsKLQkJRk9OVF9TVFlMRVMuYWRkKFNFQ1RJT05fSEVBRElORyk7Ci0JCUZPTlRfU1RZTEVTLmFkZChTVUJTRUNUSU9OX0hFQURJTkcpOwotCQlGT05UX1NUWUxFUy5hZGQoU1VCX1NVQlNFQ1RJT05fSEVBRElORyk7Ci0JCUZPTlRfU1RZTEVTLmFkZChRVU9URSk7Ci0JCUZPTlRfU1RZTEVTLmFkZChDT0RFX1NBTVBMRSk7Ci0JfQotCi0JLy8gVGhlIGZvbnQgc3R5bGUgbmFtZS4KLQlwcml2YXRlIFN0cmluZyBuYW1lOwotCi0JLy8gVGhlIGZvbnQgc3R5bGUgdmFsdWUuCi0JcHJpdmF0ZSBTdHJpbmcgdmFsdWU7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqIAotCSAqIEBwYXJhbSBuYW1lCi0JICogICAgICAgICAgICB0aGUgZm9udCBzdHlsZSBuYW1lCi0JICogQHBhcmFtIHZhbHVlCi0JICogICAgICAgICAgICB0aGUgZm9udCBzdHlsZSB2YWx1ZQotCSAqLwotCXB1YmxpYyBGb250U3R5bGUoU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSkgewotCQl0aGlzLm5hbWUgPSBuYW1lOwotCQl0aGlzLnZhbHVlID0gdmFsdWU7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgZm9udCBzdHlsZSBuYW1lLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGZvbnQgc3R5bGUgbmFtZQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgZm9udCBzdHlsZSB2YWx1ZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBmb250IHN0eWxlIHZhbHVlCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpIHsKLQkJcmV0dXJuIHZhbHVlOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIDxjb2RlPkZvbnRTdHlsZTwvY29kZT4gb2JqZWN0IHRoYXQgaXMgbWFwcGVkIHRvIHRoZSBnaXZlbgotCSAqIGluZGV4LgotCSAqIAotCSAqIEBwYXJhbSBpbmRleAotCSAqICAgICAgICAgICAgYW4gaW5kZXggaW50byB0aGUgPGNvZGU+Rm9udFN0eWxlPC9jb2RlPiBsaXN0Ci0JICogQHJldHVybiBhIDxjb2RlPkZvbnRTdHlsZTwvY29kZT4gb2JqZWN0Ci0JICovCi0JcHVibGljIHN0YXRpYyBGb250U3R5bGUgZ2V0Rm9udFN0eWxlKGludCBpbmRleCkgewotCQlGb250U3R5bGUgcmVzdWx0ID0gKEZvbnRTdHlsZSkgRk9OVF9TVFlMRVMuZ2V0KGluZGV4KTsKLQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCXJldHVybiBOT1JNQUw7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgZGlzcGxheSBuYW1lIG9mIHRoZSA8Y29kZT5Gb250U3R5bGU8L2NvZGU+IG9iamVjdCB3aXRoIHRoZQotCSAqIGdpdmVuIHZhbHVlLgotCSAqIAotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgb25lIG9mIHRoZSBGb250U3R5bGVzCi0JICogQHJldHVybiBhIGRpc3BsYXkgbmFtZSBvZiBhIEZvbnRTdHlsZSwgb3IgbnVsbCBpZiBub25lIGZvdW5kCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0Rm9udFN0eWxlTmFtZShTdHJpbmcgdmFsdWUpIHsKLQkJZm9yIChJdGVyYXRvcjxGb250U3R5bGU+IGl0ZXIgPSBGT05UX1NUWUxFUy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCUZvbnRTdHlsZSBzdHlsZSA9IGl0ZXIubmV4dCgpOwotCQkJaWYgKHN0eWxlLmdldFZhbHVlKCkuZXF1YWxzKHZhbHVlKSkgewotCQkJCXJldHVybiBzdHlsZS5nZXROYW1lKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgdmFsdWUgb2YgdGhlIDxjb2RlPkZvbnRTdHlsZTwvY29kZT4gb2JqZWN0IHdpdGggdGhlCi0JICogZ2l2ZW4gZGlzcGxheSBuYW1lLgotCSAqIAotCSAqIEBwYXJhbSBuYW1lCi0JICogICAgICAgICAgICBvbmUgb2YgdGhlIEZvbnRTdHlsZXMKLQkgKiBAcmV0dXJuIGEgdmFsdWUgb2YgYSBGb250U3R5bGUsIG9yIG51bGwgaWYgbm9uZSBmb3VuZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEZvbnRTdHlsZVZhbHVlKFN0cmluZyBuYW1lKSB7Ci0JCWZvciAoSXRlcmF0b3I8Rm9udFN0eWxlPiBpdGVyID0gRk9OVF9TVFlMRVMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlGb250U3R5bGUgc3R5bGUgPSBpdGVyLm5leHQoKTsKLQkJCWlmIChzdHlsZS5nZXROYW1lKCkuZXF1YWxzKG5hbWUpKSB7Ci0JCQkJcmV0dXJuIHN0eWxlLmdldFZhbHVlKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvaHRtbC9JbWFnZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvaHRtbC9JbWFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZmFiMmEwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2h0bWwvSW1hZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5odG1sOwotCi0vKioKLSAqIE1vZGVscyBhIHNpbXBsaWZpZWQgSFRNTCAmbHQ7aW1hZ2UmZ3Q7IHRhZy4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBJbWFnZSB7Ci0KLQkvLyBUaGUgaW1hZ2UgVVJMLgotCXByaXZhdGUgU3RyaW5nIHVybCA9ICIiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBJbWFnZSgpIHsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBpbWFnZSBVUkwuCi0JICogCi0JICogQHJldHVybiB0aGUgaW1hZ2UgVVJMCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRVUkwoKSB7Ci0JCXJldHVybiB1cmw7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgaW1hZ2UgVVJMLgotCSAqIAotCSAqIEBwYXJhbSB1cmwKLQkgKiAgICAgICAgICAgIHRoZSBpbWFnZSBVUkwKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRVUkwoU3RyaW5nIHVybCkgewotCQl0aGlzLnVybCA9IHVybDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2h0bWwvTGluay5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvaHRtbC9MaW5rLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5YzIxMGUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvaHRtbC9MaW5rLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuaHRtbDsKLQotLyoqCi0gKiBNb2RlbHMgYSBzaW1wbGlmaWVkIEhUTUwgJmx0O2xpbmsmZ3Q7IHRhZy4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBMaW5rIHsKLQotCS8vIFRoZSBsaW5rIG5hbWUuCi0JcHJpdmF0ZSBTdHJpbmcgbmFtZSA9ICIiOyAvLyROT04tTkxTLTEkCi0KLQkvLyBUaGUgbGluayBVUkwuCi0JcHJpdmF0ZSBTdHJpbmcgdXJsID0gIiI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIExpbmsoKSB7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgbGluayBuYW1lLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGxpbmsgbmFtZS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBuYW1lOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGxpbmsgbmFtZS4KLQkgKiAKLQkgKiBAcGFyYW0gbmFtZQotCSAqICAgICAgICAgICAgdGhlIGxpbmsgbmFtZQotCSAqLwotCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJdGhpcy5uYW1lID0gbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBsaW5rIFVSTC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBsaW5rIFVSTAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VVJMKCkgewotCQlyZXR1cm4gdXJsOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGxpbmsgVVJMLgotCSAqIAotCSAqIEBwYXJhbSB1cmwKLQkgKiAgICAgICAgICAgIHRoZSBsaW5rIFVSTAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFVSTChTdHJpbmcgdXJsKSB7Ci0JCXRoaXMudXJsID0gdXJsOwotCX0KLQotCS8qKgotCSAqIEBHZXRzIHRoZSBIVE1MIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgbGluay4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBIVE1MIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgbGluawotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9IVE1MKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9odG1sL1RhYmxlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9odG1sL1RhYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkZjBkNDUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvaHRtbC9UYWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5odG1sOwotCi0vKioKLSAqIE1vZGVscyBhIHNpbXBsaWZpZWQgSFRNTCAmbHQ7dGFibGUmZ3Q7IHRhZy4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBUYWJsZSB7Ci0KLQkvKioKLQkgKiBBIHRhYmxlIHdpdGggbm8gaGVhZGVycy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUQUJMRV9IRUFERVJTX05PTkUgPSAwOwotCi0JLyoqCi0JICogQSB0YWJsZSB3aXRoIGNvbHVtbiBoZWFkZXJzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRBQkxFX0hFQURFUlNfQ09MUyA9IDE7Ci0KLQkvKioKLQkgKiBBIHRhYmxlIHdpdGggcm93IGhlYWRlcnMuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVEFCTEVfSEVBREVSU19ST1dTID0gMjsKLQotCS8qKgotCSAqIEEgdGFibGUgd2l0aCBib3RoIGNvbHVtbiBhbmQgcm93IGhlYWRlcnMuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVEFCTEVfSEVBREVSU19CT1RIID0gMzsKLQotCS8vIFRoZSBudW1iZXIgb2Ygcm93cy4KLQlwcml2YXRlIGludCByb3dzID0gMjsKLQotCS8vIFRoZSBudW1iZXIgb2YgY29sdW1ucy4KLQlwcml2YXRlIGludCBjb2xzID0gMjsKLQotCS8vIFRoZSB0YWJsZSB3aWR0aC4KLQlwcml2YXRlIFN0cmluZyB3aWR0aCA9ICI4NSUiOyAvLyROT04tTkxTLTEkCi0KLQkvLyBUaGUgdHlwZSBvZiB0YWJsZWhlYWRlcnMgZm9yIHRoaXMgdGFibGUuCi0JcHJpdmF0ZSBpbnQgdGFibGVIZWFkZXJzID0gMDsKLQotCS8vIFRoZSB0YWJsZSBzdW1tYXJ5LgotCXByaXZhdGUgU3RyaW5nIHN1bW1hcnk7Ci0KLQkvLyBUaGUgdGFibGUgY2FwdGlvbi4KLQlwcml2YXRlIFN0cmluZyBjYXB0aW9uOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgVGFibGUoKSB7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgbnVtYmVyIG9mIHJvd3MgaW4gdGhlIHRhYmxlLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG51bWJlciBvZiByb3dzCi0JICovCi0JcHVibGljIGludCBnZXRSb3dzKCkgewotCQlyZXR1cm4gcm93czsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBudW1iZXIgb2Ygcm93cyBpbiB0aGUgdGFibGUuCi0JICogCi0JICogQHBhcmFtIHJvd3MKLQkgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2Ygcm93cwotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJvd3MoaW50IHJvd3MpIHsKLQkJdGhpcy5yb3dzID0gcm93czsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBudW1iZXIgb2YgY29sdW1ucyBpbiB0aGUgdGFibGUuCi0JICogCi0JICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGNvbHVtbnMKLQkgKi8KLQlwdWJsaWMgaW50IGdldENvbHVtbnMoKSB7Ci0JCXJldHVybiBjb2xzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIG51bWJlciBvZiBjb2x1bW5zIGluIHRoZSB0YWJsZS4KLQkgKiAKLQkgKiBAcGFyYW0gY29scwotCSAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiBjb2x1bW5zCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29sdW1ucyhpbnQgY29scykgewotCQl0aGlzLmNvbHMgPSBjb2xzOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHRhYmxlIHdpZHRoLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHdpZHRoIG9mIHRoZSB0YWJsZQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0V2lkdGgoKSB7Ci0JCXJldHVybiB3aWR0aDsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB0YWJsZSB3aWR0aC4KLQkgKiAKLQkgKiBAcGFyYW0gd2lkdGgKLQkgKiAgICAgICAgICAgIHRoZSB3aWR0aCBvZiB0aGUgdGFibGUKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRXaWR0aChTdHJpbmcgd2lkdGgpIHsKLQkJdGhpcy53aWR0aCA9IHdpZHRoOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHRhYmxlIGNhcHRpb24uCi0JICogCi0JICogQHJldHVybiB0aGUgdGFibGUgY2FwdGlvbgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q2FwdGlvbigpIHsKLQkJcmV0dXJuIGNhcHRpb247Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdGFibGUgY2FwdGlvbi4KLQkgKiAKLQkgKiBAcGFyYSBjYXB0aW9uIHRoZSB0YWJsZSBjYXB0aW9uCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q2FwdGlvbihTdHJpbmcgY2FwdGlvbikgewotCQl0aGlzLmNhcHRpb24gPSBjYXB0aW9uOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHRhYmxlIHN1bW1hcnkuCi0JICogCi0JICogQHJldHVybiB0aGUgdGFibGUgc3VtbWFyeQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U3VtbWFyeSgpIHsKLQkJcmV0dXJuIHN1bW1hcnk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdGFibGUgc3VtbWFyeS4KLQkgKiAKLQkgKiBAcGFyYW0gc3VtbWFyeQotCSAqICAgICAgICAgICAgdGhlIHRhYmxlIHN1bW1hcnkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTdW1tYXJ5KFN0cmluZyBzdW1tYXJ5KSB7Ci0JCXRoaXMuc3VtbWFyeSA9IHN1bW1hcnk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgdGFibGUgaGVhZGVycyBzdHlsZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBpbnRlZ2VyIHdpdGggdmFsdWUgcmVwcmVzZW50aW5nCi0JICogICAgICAgICA8Y29kZT5UQUJMRV9IRUFERVJTX05PTkU8L2NvZGU+LAotCSAqICAgICAgICAgPGNvZGU+VEFCTEVfSEVBREVSU19DT0xTPC9jb2RlPiwKLQkgKiAgICAgICAgIDxjb2RlPlRBQkxFX0hFQURFUlNfUk9XUzwvY29kZT4gb3IKLQkgKiAgICAgICAgIDxjb2RlPlRBQkxFX0hFQURFUlNfQk9USDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgaW50IGdldFRhYmxlSGVhZGVycygpIHsKLQkJcmV0dXJuIHRhYmxlSGVhZGVyczsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB0YWJsZSBoZWFkZXJzIHN0eWxlLgotCSAqIAotCSAqIEBwYXJhbSB0YWJsZUhlYWRlcnMKLQkgKiAgICAgICAgICAgIGFuIGludGVnZXIgd2l0aCB2YWx1ZSByZXByZXNlbnRpbmcKLQkgKiAgICAgICAgICAgIDxjb2RlPlRBQkxFX0hFQURFUlNfTk9ORTwvY29kZT4sCi0JICogICAgICAgICAgICA8Y29kZT5UQUJMRV9IRUFERVJTX0NPTFM8L2NvZGU+LAotCSAqICAgICAgICAgICAgPGNvZGU+VEFCTEVfSEVBREVSU19ST1dTPC9jb2RlPiBvcgotCSAqICAgICAgICAgICAgPGNvZGU+VEFCTEVfSEVBREVSU19CT1RIPC9jb2RlPgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRhYmxlSGVhZGVycyhpbnQgdGFibGVIZWFkZXJzKSB7Ci0JCXRoaXMudGFibGVIZWFkZXJzID0gdGFibGVIZWFkZXJzOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvaHRtbC9wYWNrYWdlLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9odG1sL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWJkNzA3YS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9odG1sL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIGltcGxlbWVudGF0aW9uIHN1cHBvcnQgZm9yIHRoZSByaWNoIHRleHQgY29udHJvbCBhbmQgZWRpdG9yLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L3BhY2thZ2UuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjA0ZGRjNS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyB0aGUgaW50ZXJmYWNlcyBhbmQgaW1wbGVtZW50YXRpb24gZm9yIHRoZSByaWNoIHRleHQgY29udHJvbCBhbmQgZWRpdG9yLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L3ByZWZlcmVuY2VzL1JpY2hUZXh0UHJlZmVyZW5jZVBhZ2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L3ByZWZlcmVuY2VzL1JpY2hUZXh0UHJlZmVyZW5jZVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWY5MWIwNS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9wcmVmZXJlbmNlcy9SaWNoVGV4dFByZWZlcmVuY2VQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LnByZWZlcmVuY2VzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2U7Ci0KLS8qKgotICogVGhlIFByZWZlcmVuY2UgcGFnZSBmb3IgdGhlIHJpY2ggdGV4dCBlZGl0b3IuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUmljaFRleHRQcmVmZXJlbmNlUGFnZSBleHRlbmRzIFByZWZlcmVuY2VQYWdlIGltcGxlbWVudHMKLQkJSVdvcmtiZW5jaFByZWZlcmVuY2VQYWdlLCBTZWxlY3Rpb25MaXN0ZW5lciwgTW9kaWZ5TGlzdGVuZXIgewotCi0JcHJpdmF0ZSBJUHJlZmVyZW5jZVN0b3JlIHN0b3JlOwotCi0JcHJpdmF0ZSBUZXh0IGxpbmVXaWR0aFRleHQ7Ci0KLQlwcml2YXRlIEJ1dHRvbiBpbmRlbnRDaGVja2JveDsKLQotCXByaXZhdGUgVGV4dCBpbmRlbnRTaXplVGV4dDsKLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFByZWZlcmVuY2VQYWdlI2luaXQob3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2ggd29ya2JlbmNoKSB7Ci0JCXN0b3JlID0gUmljaFRleHRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlUGFnZSNjcmVhdGVDb250ZW50cyhvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCi0JICovCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJY29tcG9zaXRlLnNldExheW91dChuZXcgR3JpZExheW91dCgxLCBmYWxzZSkpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLQkJQ29tcG9zaXRlIHdpZHRoQ29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJd2lkdGhDb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKSk7Ci0JCXdpZHRoQ29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCi0JCUxhYmVsIGxpbmVXaWR0aExhYmVsID0gbmV3IExhYmVsKHdpZHRoQ29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWxpbmVXaWR0aExhYmVsLnNldFRleHQoUmljaFRleHRSZXNvdXJjZXMubWF4Q2hhcnNQZXJMaW5lTGFiZWxfdGV4dCk7IAotCi0JCWxpbmVXaWR0aFRleHQgPSBuZXcgVGV4dCh3aWR0aENvbXBvc2l0ZSwgU1dULkJPUkRFUik7Ci0JCWxpbmVXaWR0aFRleHQuc2V0VGV4dChzdG9yZS5nZXRTdHJpbmcoUmljaFRleHRQcmVmZXJlbmNlcy5MSU5FX1dJRFRIKSk7Ci0JCWxpbmVXaWR0aFRleHQuc2V0VGV4dExpbWl0KDMpOwotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS53aWR0aEhpbnQgPSAyNTsKLQkJbGluZVdpZHRoVGV4dC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJbGluZVdpZHRoVGV4dC5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJCX0KLQkJfSk7Ci0KLQkJQ29tcG9zaXRlIGluZGVudENvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWluZGVudENvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpKTsKLQkJaW5kZW50Q29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCi0JCWluZGVudENoZWNrYm94ID0gbmV3IEJ1dHRvbihpbmRlbnRDb21wb3NpdGUsIFNXVC5DSEVDSyk7Ci0JCWluZGVudENoZWNrYm94LnNldFRleHQoUmljaFRleHRSZXNvdXJjZXMuaW5kZW50SFRNTENoZWNrYm94X3RleHQpOyAKLQkJaW5kZW50Q2hlY2tib3guc2V0U2VsZWN0aW9uKHN0b3JlCi0JCQkJLmdldEJvb2xlYW4oUmljaFRleHRQcmVmZXJlbmNlcy5JTkRFTlQpKTsKLQotCQluZXcgTGFiZWwoaW5kZW50Q29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0KLQkJTGFiZWwgaW5kZW50U2l6ZUxhYmVsID0gbmV3IExhYmVsKGluZGVudENvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsSW5kZW50ID0gMjA7Ci0JCWluZGVudFNpemVMYWJlbC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJaW5kZW50U2l6ZUxhYmVsLnNldFRleHQoUmljaFRleHRSZXNvdXJjZXMuaW5kZW50U2l6ZUxhYmVsX3RleHQpOyAKLQotCQlpbmRlbnRTaXplVGV4dCA9IG5ldyBUZXh0KGluZGVudENvbXBvc2l0ZSwgU1dULkJPUkRFUik7Ci0JCWluZGVudFNpemVUZXh0Ci0JCQkJLnNldFRleHQoc3RvcmUuZ2V0U3RyaW5nKFJpY2hUZXh0UHJlZmVyZW5jZXMuSU5ERU5UX1NJWkUpKTsKLQkJaW5kZW50U2l6ZVRleHQuc2V0VGV4dExpbWl0KDEpOwotCQlncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS53aWR0aEhpbnQgPSAxMDsKLQkJaW5kZW50U2l6ZVRleHQuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCWluZGVudFNpemVUZXh0LmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotCQkJfQotCQl9KTsKLQotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlUGFnZS5wZXJmb3JtRGVmYXVsdHMKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGVmYXVsdHMoKSB7Ci0JCXN1cGVyLnBlcmZvcm1EZWZhdWx0cygpOwotCQlsaW5lV2lkdGhUZXh0LnNldFRleHQoc3RvcmUKLQkJCQkuZ2V0RGVmYXVsdFN0cmluZyhSaWNoVGV4dFByZWZlcmVuY2VzLkxJTkVfV0lEVEgpKTsKLQkJaW5kZW50Q2hlY2tib3guc2V0U2VsZWN0aW9uKHN0b3JlCi0JCQkJLmdldERlZmF1bHRCb29sZWFuKFJpY2hUZXh0UHJlZmVyZW5jZXMuSU5ERU5UKSk7Ci0JCWluZGVudFNpemVUZXh0LnNldFRleHQoc3RvcmUKLQkJCQkuZ2V0RGVmYXVsdFN0cmluZyhSaWNoVGV4dFByZWZlcmVuY2VzLklOREVOVF9TSVpFKSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VQYWdlLnBlcmZvcm1PawotCSAqLwotCXB1YmxpYyBib29sZWFuIHBlcmZvcm1PaygpIHsKLQkJU3RyaW5nIGxpbmVXaWR0aFZhbHVlID0gbGluZVdpZHRoVGV4dC5nZXRUZXh0KCk7Ci0JCWlmIChsaW5lV2lkdGhWYWx1ZSAhPSBudWxsICYmIGxpbmVXaWR0aFZhbHVlLmxlbmd0aCgpID4gMCkgewotCQkJdHJ5IHsKLQkJCQlpbnQgbGluZVdpZHRoID0gSW50ZWdlci5wYXJzZUludChsaW5lV2lkdGhWYWx1ZSk7Ci0JCQkJc3RvcmUuc2V0VmFsdWUoUmljaFRleHRQcmVmZXJlbmNlcy5MSU5FX1dJRFRILCBsaW5lV2lkdGgpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCX0KLQkJfQotCi0JCWJvb2xlYW4gaW5kZW50VmFsdWUgPSBpbmRlbnRDaGVja2JveC5nZXRTZWxlY3Rpb24oKTsKLQkJc3RvcmUuc2V0VmFsdWUoUmljaFRleHRQcmVmZXJlbmNlcy5JTkRFTlQsIGluZGVudFZhbHVlKTsKLQotCQlTdHJpbmcgaW5kZW50U2l6ZVZhbHVlID0gaW5kZW50U2l6ZVRleHQuZ2V0VGV4dCgpOwotCQlpZiAoaW5kZW50U2l6ZVZhbHVlICE9IG51bGwgJiYgaW5kZW50U2l6ZVZhbHVlLmxlbmd0aCgpID4gMCkgewotCQkJdHJ5IHsKLQkJCQlpbnQgaW5kZW50U2l6ZSA9IEludGVnZXIucGFyc2VJbnQoaW5kZW50U2l6ZVZhbHVlKTsKLQkJCQlzdG9yZS5zZXRWYWx1ZShSaWNoVGV4dFByZWZlcmVuY2VzLklOREVOVF9TSVpFLCBpbmRlbnRTaXplKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXIjd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lciN3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXIjbW9kaWZ5VGV4dChNb2RpZnlFdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L3ByZWZlcmVuY2VzL1JpY2hUZXh0UHJlZmVyZW5jZXMuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L3ByZWZlcmVuY2VzL1JpY2hUZXh0UHJlZmVyZW5jZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDQyZWFlNy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9wcmVmZXJlbmNlcy9SaWNoVGV4dFByZWZlcmVuY2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQucHJlZmVyZW5jZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci0KLS8qKgotICogUHJlZmVyZW5jZXMgZm9yIHRoZSByaWNoIHRleHQgZWRpdG9yLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFJpY2hUZXh0UHJlZmVyZW5jZXMgewotCi0JLyoqCi0JICogcmljaCB0ZXh0IEVkaXRvciBwcmVmZXJlbmNlIGtleXMuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTElORV9XSURUSCA9ICJodG1sRWRpdG9yLmxpbmVXaWR0aCI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElOREVOVCA9ICJodG1sRWRpdG9yLmluZGVudCI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElOREVOVF9TSVpFID0gImh0bWxFZGl0b3IuaW5kZW50U2l6ZSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEluaXRpYWxpemVzIHRoZSBkZWZhdWx0IHByZWZlcmVuY2VzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBpbml0aWFsaXplRGVmYXVsdFByZWZlcmVuY2VzKElQcmVmZXJlbmNlU3RvcmUgc3RvcmUpIHsKLQkJc3RvcmUuc2V0RGVmYXVsdChMSU5FX1dJRFRILCAxMjApOwotCQlzdG9yZS5zZXREZWZhdWx0KElOREVOVCwgdHJ1ZSk7Ci0JCXN0b3JlLnNldERlZmF1bHQoSU5ERU5UX1NJWkUsIDQpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvcHJlZmVyZW5jZXMvUmljaFRleHRQcmVmZXJlbmNlc0luaXRpYWxpemVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9wcmVmZXJlbmNlcy9SaWNoVGV4dFByZWZlcmVuY2VzSW5pdGlhbGl6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTU5NTZkYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9wcmVmZXJlbmNlcy9SaWNoVGV4dFByZWZlcmVuY2VzSW5pdGlhbGl6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5wcmVmZXJlbmNlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5BYnN0cmFjdFByZWZlcmVuY2VJbml0aWFsaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotCi0vKioKLSAqIFRoZSByaWNoIHRleHQgcHJlZmVyZW5jZXMgaW5pdGlhbGl6ZXIuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUmljaFRleHRQcmVmZXJlbmNlc0luaXRpYWxpemVyIGV4dGVuZHMKLQkJQWJzdHJhY3RQcmVmZXJlbmNlSW5pdGlhbGl6ZXIgewotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuQWJzdHJhY3RQcmVmZXJlbmNlSW5pdGlhbGl6ZXIjaW5pdGlhbGl6ZURlZmF1bHRQcmVmZXJlbmNlcygpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZURlZmF1bHRQcmVmZXJlbmNlcygpIHsKLQkJSVByZWZlcmVuY2VTdG9yZSBzdG9yZSA9IFJpY2hUZXh0UGx1Z2luLmdldERlZmF1bHQoKQotCQkJCS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQkJUmljaFRleHRQcmVmZXJlbmNlcy5pbml0aWFsaXplRGVmYXVsdFByZWZlcmVuY2VzKHN0b3JlKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L3ByZWZlcmVuY2VzL3BhY2thZ2UuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L3ByZWZlcmVuY2VzL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDVhNzVmMS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9wcmVmZXJlbmNlcy9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyBwcmVmZXJlbmNlIHN1cHBvcnQgZm9yIHRoZSByaWNoIHRleHQgY29udHJvbCBhbmQgZWRpdG9yLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkvLmNsYXNzcGF0aCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDY1YWMwNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpLy5vcHRpb25zIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS8ub3B0aW9ucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2FjOTZjNS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpLy5vcHRpb25zCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi0jIFR1cm4gb24gZGVidWcgdHJhY2UgZm9yIHRoZSBTZWFyY2ggVUkgcGx1Zy1pbgotb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS9kZWJ1Zz10cnVlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpLy5wcm9qZWN0IGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWZhNTUyNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpL01FVEEtSU5GL01BTklGRVNULk1GIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzU1ZGQwZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWk7IHNpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuNS4wLnF1YWxpZmllcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS5TZWFyY2hVSVBsdWdpbgotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aTt2aXNpYmlsaXR5Oj1yZWV4cG9ydCwKLSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUsCi0gb3JnLmVjbGlwc2UuamZhY2UudGV4dCwKLSBvcmcuZWNsaXBzZS5zZWFyY2g7dmlzaWJpbGl0eTo9cmVleHBvcnQsCi0gb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aQotRWNsaXBzZS1MYXp5U3RhcnQ6IHRydWUKLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpLAotIG9yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkuaW50ZXJuYWwsCi0gb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS5wcmVmZXJlbmNlcwotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpL2J1aWxkLnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyMWRjNmIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1zb3VyY2UuLiA9IHNyYy8KLW91dHB1dC4uID0gYmluLwotYmluLmluY2x1ZGVzID0gLixcCi0gICAgICAgICAgICAgICAub3B0aW9ucyxcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgaWNvbnMvLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwKLQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS9pY29ucy9mdWxsL29iajE2L01ldGhvZFNlYXJjaC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpL2ljb25zL2Z1bGwvb2JqMTYvTWV0aG9kU2VhcmNoLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODNjMGY0NC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpL2ljb25zL2Z1bGwvb2JqMTYvTWV0aG9kU2VhcmNoLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkvcGx1Z2luLnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZWYxOTMzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUgotCi0jIFBsdWctaW4KLXBsdWdpbk5hbWU9RVBGIFNlYXJjaCBVSQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCi0KLSMgTWV0aG9kIFNlYXJjaCBEaWFsb2cKLW1ldGhvZFNlYXJjaERpYWxvZ0xhYmVsPU1ldGhvZCBTZWFyY2gKLQotICAgICAgICAgICAgICAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS9wbHVnaW4ueG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNGIyMGY0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08cGx1Z2luPgotICAgPGV4dGVuc2lvbi1wb2ludCBpZD0ib3BlcmF0aW9uIiBuYW1lPSJNZXRob2QgU2VhcmNoIE9wZXJhdGlvbiIgc2NoZW1hPSJzY2hlbWEvb3BlcmF0aW9uLmV4c2QiLz4KLSAgIDxleHRlbnNpb24tcG9pbnQgaWQ9InNlYXJjaElucHV0RmFjdG9yaWVzIiBuYW1lPSJNZXRob2QgU2VhcmNoIElucHV0IEZhY3RvcmllcyIgc2NoZW1hPSJzY2hlbWEvc2VhcmNoSW5wdXRGYWN0b3JpZXMuZXhzZCIvPgotICAgPGV4dGVuc2lvbi1wb2ludCBpZD0ic2VhcmNoU2NvcGVHcm91cEZhY3RvcnkiIG5hbWU9IlNlYXJjaCBTY29wZSBHcm91cCBGYWN0b3J5IiBzY2hlbWE9InNjaGVtYS9zZWFyY2hTY29wZUdyb3VwRmFjdG9yeS5leHNkIi8+Ci0gICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJzZWFyY2hSZXN1bHRQcm92aWRlckZhY3RvcnkiIG5hbWU9IlNlYXJjaCBSZXN1bHQgUHJvdmlkZXIgRmFjdG9yeSIgc2NoZW1hPSJzY2hlbWEvc2VhcmNoUmVzdWx0UHJvdmlkZXJGYWN0b3J5LmV4c2QiLz4KLSAgIAotICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uuc2VhcmNoLnNlYXJjaFBhZ2VzIj4KLSAgICAgIDxwYWdlIGlkPSJvcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpLk1ldGhvZFNlYXJjaFBhZ2UiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS5NZXRob2RTZWFyY2hQYWdlIiAgICAgIAotICAgICAgICAgICAgbGFiZWw9IiVtZXRob2RTZWFyY2hEaWFsb2dMYWJlbCIKLSAgICAgICAgICAgIGljb249Imljb25zL2Z1bGwvb2JqMTYvTWV0aG9kU2VhcmNoLmdpZiIKLSAgICAgICAgICAgIHNpemVIaW50PSIyNTAsMTYwIgotICAgICAgICAgICAgdGFiUG9zaXRpb249IjAiCi0gICAgICAgICAgICBleHRlbnNpb25zPSIqOjEiCi0gICAgICAgICAgICBzaG93U2NvcGVTZWN0aW9uPSJmYWxzZSIJCQotICAgICAgICAgICAgY2FuU2VhcmNoRW5jbG9zaW5nUHJvamVjdHM9ImZhbHNlIj4KLSAgICAgIDwvcGFnZT4gICAgCi0gICA8L2V4dGVuc2lvbj4KLSAgIAotICAgPGV4dGVuc2lvbgotICAgICAgICAgaWQ9Ik1ldGhvZFNlYXJjaFBhZ2UiCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2Uuc2VhcmNoLnNlYXJjaFJlc3VsdFZpZXdQYWdlcyI+Ci0gICAgICA8dmlld1BhZ2UKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpLk1ldGhvZFNlYXJjaFJlc3VsdFBhZ2UiCi0JCQlzZWFyY2hSZXN1bHRDbGFzcz0ib3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS5pbnRlcm5hbC5NZXRob2RTZWFyY2hSZXN1bHQiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS5NZXRob2RTZWFyY2hSZXN1bHRQYWdlIj4KLSAgICAgIDwvdmlld1BhZ2U+Ci0gICA8L2V4dGVuc2lvbj4gICAKLQotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpL3NjaGVtYS9vcGVyYXRpb24uZXhzZCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkvc2NoZW1hL29wZXJhdGlvbi5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkODVjMTkxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkvc2NoZW1hL29wZXJhdGlvbi5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTA1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkiPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkiIGlkPSJvcGVyYXRpb24iIG5hbWU9Ik1ldGhvZCBTZWFyY2ggT3BlcmF0aW9uIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBkZXNjcmlwdGlvbiBvZiB0aGlzIGV4dGVuc2lvbiBwb2ludC5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIj4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0ib3BlcmF0aW9uIi8+Ci0gICAgICAgICA8L2Nob2ljZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJvcGVyYXRpb24iPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIGtpbmQ9ImphdmEiIGJhc2VkT249IjpvcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpLmludGVybmFsLklNZXRob2RTZWFyY2hPcGVyYXRpb24iLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIHRoZSBmaXJzdCByZWxlYXNlIGluIHdoaWNoIHRoaXMgZXh0ZW5zaW9uIHBvaW50IGFwcGVhcnMuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgZXh0ZW5zaW9uIHBvaW50IHVzYWdlIGV4YW1wbGUgaGVyZS5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIEFQSSBpbmZvcm1hdGlvbiBoZXJlLl0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIGluZm9ybWF0aW9uIGFib3V0IHN1cHBsaWVkIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgZXh0ZW5zaW9uIHBvaW50Ll0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkvc2NoZW1hL3NlYXJjaElucHV0RmFjdG9yaWVzLmV4c2QgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpL3NjaGVtYS9zZWFyY2hJbnB1dEZhY3Rvcmllcy5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MzQzMzlkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkvc2NoZW1hL3NlYXJjaElucHV0RmFjdG9yaWVzLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMDUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aSI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aSIgaWQ9InNlYXJjaElucHV0RmFjdG9yaWVzIiBuYW1lPSJNZXRob2QgU2VhcmNoIElucHV0IEZhY3RvcmllcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgZGVzY3JpcHRpb24gb2YgdGhpcyBleHRlbnNpb24gcG9pbnQuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJmYWN0b3J5IiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImZhY3RvcnkiPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIGtpbmQ9ImphdmEiIGJhc2VkT249IjpvcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpLmludGVybmFsLklNZXRob2RTZWFyY2hJbnB1dEZhY3RvcnkiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIHRoZSBmaXJzdCByZWxlYXNlIGluIHdoaWNoIHRoaXMgZXh0ZW5zaW9uIHBvaW50IGFwcGVhcnMuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgZXh0ZW5zaW9uIHBvaW50IHVzYWdlIGV4YW1wbGUgaGVyZS5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIEFQSSBpbmZvcm1hdGlvbiBoZXJlLl0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIGluZm9ybWF0aW9uIGFib3V0IHN1cHBsaWVkIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgZXh0ZW5zaW9uIHBvaW50Ll0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkvc2NoZW1hL3NlYXJjaFJlc3VsdFByb3ZpZGVyRmFjdG9yeS5leHNkIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS9zY2hlbWEvc2VhcmNoUmVzdWx0UHJvdmlkZXJGYWN0b3J5LmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyYTRmMmEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS9zY2hlbWEvc2VhcmNoUmVzdWx0UHJvdmlkZXJGYWN0b3J5LmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMDUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aSI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aSIgaWQ9InNlYXJjaFJlc3VsdENvbnRlbnRQcm92aWRlckZhY3RvcnkiIG5hbWU9IlNlYXJjaCBSZXN1bHQgQ29udGVudCBQcm92aWRlciBGYWN0b3J5Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBkZXNjcmlwdGlvbiBvZiB0aGlzIGV4dGVuc2lvbiBwb2ludC5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImZhY3RvcnkiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSB0cmFuc2xhdGFibGU9InRydWUiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0iZmFjdG9yeSI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUga2luZD0iamF2YSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgdGhlIGZpcnN0IHJlbGVhc2UgaW4gd2hpY2ggdGhpcyBleHRlbnNpb24gcG9pbnQgYXBwZWFycy5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBleHRlbnNpb24gcG9pbnQgdXNhZ2UgZXhhbXBsZSBoZXJlLl0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgQVBJIGluZm9ybWF0aW9uIGhlcmUuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgaW5mb3JtYXRpb24gYWJvdXQgc3VwcGxpZWQgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBleHRlbnNpb24gcG9pbnQuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS9zY2hlbWEvc2VhcmNoU2NvcGVHcm91cEZhY3RvcnkuZXhzZCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkvc2NoZW1hL3NlYXJjaFNjb3BlR3JvdXBGYWN0b3J5LmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmN2ZjMDguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS9zY2hlbWEvc2VhcmNoU2NvcGVHcm91cEZhY3RvcnkuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDEwNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpIj4KLTxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpIiBpZD0ic2VhcmNoU2NvcGVWaWV3ZXJGYWN0b3J5IiBuYW1lPSJTZWFyY2hTY29wZVZpZXdlciBGYWN0b3J5Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBkZXNjcmlwdGlvbiBvZiB0aGlzIGV4dGVuc2lvbiBwb2ludC5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8Y2hvaWNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJmYWN0b3J5Ii8+Ci0gICAgICAgICA8L2Nob2ljZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJmYWN0b3J5Ij4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJqYXZhIiBiYXNlZE9uPSI6b3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS5pbnRlcm5hbC5JTWV0aG9kU2VhcmNoU2NvcGVHcm91cCIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgdGhlIGZpcnN0IHJlbGVhc2UgaW4gd2hpY2ggdGhpcyBleHRlbnNpb24gcG9pbnQgYXBwZWFycy5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBleHRlbnNpb24gcG9pbnQgdXNhZ2UgZXhhbXBsZSBoZXJlLl0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgQVBJIGluZm9ybWF0aW9uIGhlcmUuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgaW5mb3JtYXRpb24gYWJvdXQgc3VwcGxpZWQgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBleHRlbnNpb24gcG9pbnQuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC91aS9NZXRob2RTZWFyY2hQYWdlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL3VpL01ldGhvZFNlYXJjaFBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmUxM2Y4MS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL3VpL01ldGhvZFNlYXJjaFBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLlN0clV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkV4dGVuc2lvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS5pbnRlcm5hbC5JTWV0aG9kU2VhcmNoSW5wdXRFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS5pbnRlcm5hbC5JTWV0aG9kU2VhcmNoSW5wdXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkuaW50ZXJuYWwuSU1ldGhvZFNlYXJjaFNjb3BlR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS5pbnRlcm5hbC5JTWV0aG9kU2VhcmNoU2NvcGVHcm91cEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS5pbnRlcm5hbC5NZXRob2RTZWFyY2hJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpLmludGVybmFsLk1ldGhvZFNlYXJjaFF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkuaW50ZXJuYWwuTWV0aG9kU2VhcmNoU2NvcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS5pbnRlcm5hbC5NZXRob2RTZWFyY2hTY29wZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpLnByZWZlcmVuY2VzLlNlYXJjaFVJUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zZWFyY2gudWkuSVNlYXJjaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc2VhcmNoLnVpLklTZWFyY2hQYWdlQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnNlYXJjaC51aS5OZXdTZWFyY2hVSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci0KLS8qKgotICogRGlzcGxheXMgdGhlIE1ldGhvZCBTZWFyY2ggcGFnZSBpbiB0aGUgU2VhcmNoIGRpYWxvZy4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTWV0aG9kU2VhcmNoUGFnZSBleHRlbmRzIERpYWxvZ1BhZ2UgaW1wbGVtZW50cyBJU2VhcmNoUGFnZSB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRUFSQ0hfUEFHRV9JRCA9IE1ldGhvZFNlYXJjaFBhZ2UuY2xhc3MKLQkJCS5nZXROYW1lKCk7Ci0KLQlwcml2YXRlIHN0YXRpYyBMaXN0PElNZXRob2RTZWFyY2hJbnB1dEZhY3Rvcnk+IHNlYXJjaElucHV0RmFjdG9yaWVzOwotCi0JcHJpdmF0ZSBDb21ibyBzZWFyY2hTdHJpbmdDb21ibzsKLQotCXByaXZhdGUgQ29tYm8gbmFtZVBhdHRlcm5Db21ibzsKLQotCXByaXZhdGUgQnV0dG9uIGNhc2VTZW5zaXRpdmVDaGVja2JveDsKLQotCXByaXZhdGUgTWV0aG9kU2VhcmNoU2NvcGVWaWV3ZXIgc2VhcmNoU2NvcGVWaWV3ZXI7Ci0KLQlwcml2YXRlIElTZWFyY2hQYWdlQ29udGFpbmVyIGNvbnRhaW5lcjsKLQotCXByaXZhdGUgTGlzdDxJTWV0aG9kU2VhcmNoSW5wdXRFeHRlbnNpb24+IGFkZGl0aW9uYWxTZWFyY2hJbnB1dHMgPSBuZXcgQXJyYXlMaXN0PElNZXRob2RTZWFyY2hJbnB1dEV4dGVuc2lvbj4oKTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIE1ldGhvZFNlYXJjaFBhZ2UoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dQYWdlI2NyZWF0ZUNvbnRyb2woQ29tcG9zaXRlKQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCQlpbml0aWFsaXplRGlhbG9nVW5pdHMocGFyZW50KTsKLQotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgyLCBmYWxzZSk7Ci0JCWxheW91dC5ob3Jpem9udGFsU3BhY2luZyA9IDU7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQkJY29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCi0JCUxhYmVsIHNlYXJjaFN0cmluZ0xhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlzZWFyY2hTdHJpbmdMYWJlbC5zZXRUZXh0KFNlYXJjaFVJUmVzb3VyY2VzLnNlYXJjaFN0cmluZ0xhYmVsX3RleHQpOyAKLQotCQluZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0KLQkJc2VhcmNoU3RyaW5nQ29tYm8gPSBuZXcgQ29tYm8oY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCXNlYXJjaFN0cmluZ0NvbWJvLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQlTdHJpbmcgc2F2ZWRTZWFyY2hTdHJpbmcgPSBTZWFyY2hVSVByZWZlcmVuY2VzLmdldFNlYXJjaFN0cmluZygpOwotCQlpZiAoc2F2ZWRTZWFyY2hTdHJpbmcgIT0gbnVsbCAmJiBzYXZlZFNlYXJjaFN0cmluZy5sZW5ndGgoKSA+IDApIHsKLQkJCXNlYXJjaFN0cmluZ0NvbWJvLnNldFRleHQoc2F2ZWRTZWFyY2hTdHJpbmcpOwotCQl9Ci0KLQkJY2FzZVNlbnNpdGl2ZUNoZWNrYm94ID0gbmV3IEJ1dHRvbihjb21wb3NpdGUsIFNXVC5DSEVDSyk7Ci0JCWNhc2VTZW5zaXRpdmVDaGVja2JveC5zZXRUZXh0KFNlYXJjaFVJUmVzb3VyY2VzLmNhc2VTZW5zaXRpdmVDaGVja2JveF90ZXh0KTsgCi0JCWNhc2VTZW5zaXRpdmVDaGVja2JveC5zZXRTZWxlY3Rpb24oU2VhcmNoVUlQcmVmZXJlbmNlcwotCQkJCS5nZXRDYXNlU2Vuc2l0aXZlKCkpOwotCi0JCUxhYmVsIGVsZW1lbnROYW1lTGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWVsZW1lbnROYW1lTGFiZWwuc2V0VGV4dChTZWFyY2hVSVJlc291cmNlcy5lbGVtZW50TmFtZUxhYmVsX3RleHQpOyAKLQotCQluZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0KLQkJbmFtZVBhdHRlcm5Db21ibyA9IG5ldyBDb21ibyhjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJbmFtZVBhdHRlcm5Db21iby5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJU3RyaW5nIHNhdmVkTmFtZVBhdHRlcm4gPSBTZWFyY2hVSVByZWZlcmVuY2VzLmdldE5hbWVQYXR0ZXJuKCk7Ci0JCWlmIChzYXZlZE5hbWVQYXR0ZXJuICE9IG51bGwgJiYgc2F2ZWROYW1lUGF0dGVybi5sZW5ndGgoKSA+IDApIHsKLQkJCW5hbWVQYXR0ZXJuQ29tYm8uc2V0VGV4dChzYXZlZE5hbWVQYXR0ZXJuKTsKLQkJfSAKLS8vCQllbHNlIHsKLS8vCQkJbmFtZVBhdHRlcm5Db21iby5zZXRUZXh0KCIqIik7IC8vJE5PTi1OTFMtMSQKLS8vCQl9Ci0KLQkJbmFtZVBhdHRlcm5Db21iby5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQljb250YWluZXIuc2V0UGVyZm9ybUFjdGlvbkVuYWJsZWQoZ2V0U2VhcmNoQnV0dG9uRW5hYmxlZCgpKTsKLQkJCX0KLQkJfSk7Ci0JCW5hbWVQYXR0ZXJuQ29tYm8uYWRkTW9kaWZ5TGlzdGVuZXIobmV3IE1vZGlmeUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBldmVudCkgewotCQkJCWNvbnRhaW5lci5zZXRQZXJmb3JtQWN0aW9uRW5hYmxlZChnZXRTZWFyY2hCdXR0b25FbmFibGVkKCkpOwotCQkJfQotCQl9KTsKLQotCQluZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0KLQkJY29sbGVjdENvbnRyaWJ1dGVkU2VhcmNoSW5wdXRzKGNvbXBvc2l0ZSk7Ci0JCQotCQlzZWFyY2hTY29wZVZpZXdlciA9IGNyZWF0ZVNlYXJjaFNjb3BlR3JvdXAoY29tcG9zaXRlKS5nZXRTZWFyY2hTY29wZVZpZXdlcigpOwotCi0JCWNvbnRhaW5lci5zZXRQZXJmb3JtQWN0aW9uRW5hYmxlZChnZXRTZWFyY2hCdXR0b25FbmFibGVkKCkpOwotCi0JCXNldENvbnRyb2woY29tcG9zaXRlKTsKLQkJRGlhbG9nLmFwcGx5RGlhbG9nRm9udChjb21wb3NpdGUpOwotCX0KLQkKLQlwcml2YXRlIElNZXRob2RTZWFyY2hTY29wZUdyb3VwIGNyZWF0ZVNlYXJjaFNjb3BlR3JvdXAoQ29tcG9zaXRlIHBhcmVudCkgewotCQlPYmplY3QgZXh0ID0gRXh0ZW5zaW9uTWFuYWdlci5nZXRFeHRlbnNpb24oU2VhcmNoVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldElkKCksICJzZWFyY2hTY29wZUdyb3VwRmFjdG9yeSIpOyAvLyROT04tTkxTLTEkCi0JCWlmKGV4dCBpbnN0YW5jZW9mIElNZXRob2RTZWFyY2hTY29wZUdyb3VwRmFjdG9yeSkgewotCQkJSU1ldGhvZFNlYXJjaFNjb3BlR3JvdXAgZ3JvdXAgPSAoKElNZXRob2RTZWFyY2hTY29wZUdyb3VwRmFjdG9yeSkgZXh0KS5jcmVhdGVTZWFyY2hTY29wZUdyb3VwKHBhcmVudCk7Ci0JCQlpZihncm91cCAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIGdyb3VwOwotCQkJfQotCQl9Ci0JCUdyb3VwIHNlYXJjaFNjb3BlR3JvdXAgPSBuZXcgR3JvdXAocGFyZW50LCBTV1QuTk9ORSk7Ci0JCXNlYXJjaFNjb3BlR3JvdXAuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDEsIGZhbHNlKSk7Ci0JCUdyaWREYXRhIHNlYXJjaFNjb3BlR3JvdXBHcmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQlzZWFyY2hTY29wZUdyb3VwR3JpZERhdGEuaGVpZ2h0SGludCA9IDIwMDsKLQkJc2VhcmNoU2NvcGVHcm91cC5zZXRMYXlvdXREYXRhKHNlYXJjaFNjb3BlR3JvdXBHcmlkRGF0YSk7Ci0JCXNlYXJjaFNjb3BlR3JvdXAuc2V0VGV4dChTZWFyY2hVSVJlc291cmNlcy5zY29wZUdyb3VwX3RleHQpOyAKLQkJZmluYWwgTWV0aG9kU2VhcmNoU2NvcGVWaWV3ZXIgdmlld2VyID0gbmV3IE1ldGhvZFNlYXJjaFNjb3BlVmlld2VyKHNlYXJjaFNjb3BlR3JvdXAsIFNXVC5CT1JERVIpOwotCQlyZXR1cm4gbmV3IElNZXRob2RTZWFyY2hTY29wZUdyb3VwKCkgewotCi0JCQlwdWJsaWMgTWV0aG9kU2VhcmNoU2NvcGVWaWV3ZXIgZ2V0U2VhcmNoU2NvcGVWaWV3ZXIoKSB7Ci0JCQkJcmV0dXJuIHZpZXdlcjsKLQkJCX0KLQkJCQotCQl9OwotCX0KLQotCXByaXZhdGUgc3RhdGljIExpc3Q8SU1ldGhvZFNlYXJjaElucHV0RmFjdG9yeT4gZ2V0U2VhcmNoSW5wdXRGYWN0b3JpZXMoKSB7Ci0JCWlmIChzZWFyY2hJbnB1dEZhY3RvcmllcyA9PSBudWxsKSB7Ci0JCQlzZWFyY2hJbnB1dEZhY3RvcmllcyA9IG5ldyBBcnJheUxpc3Q8SU1ldGhvZFNlYXJjaElucHV0RmFjdG9yeT4oKTsKLQkJCS8vIFByb2Nlc3MgdGhlIGNvbnRyaWJ1dG9ycy4KLQkJCS8vCi0JCQlJRXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkgPSBQbGF0Zm9ybQotCQkJCQkuZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKTsKLQkJCUlFeHRlbnNpb25Qb2ludCBleHRlbnNpb25Qb2ludCA9IGV4dGVuc2lvblJlZ2lzdHJ5Ci0JCQkJCS5nZXRFeHRlbnNpb25Qb2ludChTZWFyY2hVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SWQoKSwKLQkJCQkJCQkic2VhcmNoSW5wdXRGYWN0b3JpZXMiKTsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKGV4dGVuc2lvblBvaW50ICE9IG51bGwpIHsKLQkJCQlJRXh0ZW5zaW9uW10gZXh0ZW5zaW9ucyA9IGV4dGVuc2lvblBvaW50LmdldEV4dGVuc2lvbnMoKTsKLQkJCQlPYmplY3QgZXh0ID0gbnVsbDsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGV4dGVuc2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCQkJSUV4dGVuc2lvbiBleHRlbnNpb24gPSBleHRlbnNpb25zW2ldOwotCQkJCQlTdHJpbmcgcGx1Z2luSWQgPSBleHRlbnNpb24uZ2V0TmFtZXNwYWNlSWRlbnRpZmllcigpOwotCQkJCQlCdW5kbGUgYnVuZGxlID0gUGxhdGZvcm0uZ2V0QnVuZGxlKHBsdWdpbklkKTsKLQkJCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gY29uZmlnRWxlbWVudHMgPSBleHRlbnNpb24KLQkJCQkJCQkuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzKCk7Ci0JCQkJCWZvciAoaW50IGogPSAwOyBqIDwgY29uZmlnRWxlbWVudHMubGVuZ3RoOyBqKyspIHsKLQkJCQkJCUlDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWdFbGVtZW50ID0gY29uZmlnRWxlbWVudHNbal07Ci0JCQkJCQl0cnkgewotCQkJCQkJCVN0cmluZyBjbGFzc05hbWUgPSBjb25maWdFbGVtZW50Ci0JCQkJCQkJCQkuZ2V0QXR0cmlidXRlKCJjbGFzcyIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJaWYgKGNsYXNzTmFtZSAhPSBudWxsKSB7Ci0JCQkJCQkJCWV4dCA9IGJ1bmRsZS5sb2FkQ2xhc3MoY2xhc3NOYW1lKS5uZXdJbnN0YW5jZSgpOwotCQkJCQkJCQlpZiAoZXh0IGluc3RhbmNlb2YgSU1ldGhvZFNlYXJjaElucHV0RmFjdG9yeSkgewotCQkJCQkJCQkJc2VhcmNoSW5wdXRGYWN0b3JpZXMKLQkJCQkJCQkJCQkJLmFkZCgoSU1ldGhvZFNlYXJjaElucHV0RmFjdG9yeSkgZXh0KTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJU2VhcmNoVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBzZWFyY2hJbnB1dEZhY3RvcmllczsKLQotCX0KLQkKLQlwcml2YXRlIHZvaWQgY29sbGVjdENvbnRyaWJ1dGVkU2VhcmNoSW5wdXRzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJZm9yIChJTWV0aG9kU2VhcmNoSW5wdXRGYWN0b3J5IGZhY3RvcnkgOiBnZXRTZWFyY2hJbnB1dEZhY3RvcmllcygpKSB7Ci0JCQl0cnkgewotCQkJCUlNZXRob2RTZWFyY2hJbnB1dEV4dGVuc2lvbiBzZWFyY2hJbnB1dCA9IGZhY3RvcnkuY3JlYXRlU2VhcmNoSW5wdXQocGFyZW50KTsKLQkJCQlpZihzZWFyY2hJbnB1dCAhPSBudWxsKSB7Ci0JCQkJCWFkZGl0aW9uYWxTZWFyY2hJbnB1dHMgLmFkZChzZWFyY2hJbnB1dCk7Ci0JCQkJfQotCQkJfQotCQkJY2F0Y2goRXhjZXB0aW9uIGUpIHsKLQkJCQlTZWFyY2hVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnNlYXJjaC51aS5JU2VhcmNoUGFnZSNwZXJmb3JtQWN0aW9uKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtQWN0aW9uKCkgewotCQlNZXRob2RMaWJyYXJ5IGxpYnJhcnkgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCk7Ci0JCWlmIChsaWJyYXJ5ID09IG51bGwpIHsKLQkJCVNlYXJjaFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKS5kaXNwbGF5RXJyb3IoCi0JCQkJCVNlYXJjaFVJUmVzb3VyY2VzLnNlYXJjaEVycm9yX3RpdGxlLCAKLQkJCQkJU2VhcmNoVUlSZXNvdXJjZXMuc2VhcmNoRXJyb3JfbXNnLCAKLQkJCQkJU2VhcmNoVUlSZXNvdXJjZXMuc2VhcmNoRXJyb3JfcmVhc29uKTsgCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJU3RyaW5nIHNlYXJjaFN0cmluZyA9IHNlYXJjaFN0cmluZ0NvbWJvLmdldFRleHQoKS50cmltKCk7Ci0JCVN0cmluZyBuYW1lUGF0dGVybiA9IG5hbWVQYXR0ZXJuQ29tYm8uZ2V0VGV4dCgpLnRyaW0oKTsKLQkJaWYoU3RyVXRpbC5pc0JsYW5rKG5hbWVQYXR0ZXJuKSkgewotCQkJbmFtZVBhdHRlcm4gPSAiKiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlNZXRob2RTZWFyY2hTY29wZSBzZWFyY2hTY29wZSA9IHNlYXJjaFNjb3BlVmlld2VyLmdldFNlYXJjaFNjb3BlKCk7Ci0JCU1ldGhvZFNlYXJjaElucHV0IHNlYXJjaElucHV0ID0gbmV3IE1ldGhvZFNlYXJjaElucHV0KHNlYXJjaFN0cmluZywKLQkJCQluYW1lUGF0dGVybiwgY2FzZVNlbnNpdGl2ZUNoZWNrYm94LmdldFNlbGVjdGlvbigpLCBmYWxzZSwKLQkJCQlmYWxzZSwgc2VhcmNoU2NvcGUpOwotCQlpZighYWRkaXRpb25hbFNlYXJjaElucHV0cy5pc0VtcHR5KCkpIHsKLQkJCWZvciAoSU1ldGhvZFNlYXJjaElucHV0RXh0ZW5zaW9uIGlucHV0IDogYWRkaXRpb25hbFNlYXJjaElucHV0cykgewotCQkJCXNlYXJjaElucHV0LmdldEFkZGl0aW9uYWxJbnB1dCgpLnB1dEFsbChpbnB1dC5nZXRJbnB1dCgpKTsKLQkJCX0KLQkJfQotCQlNZXRob2RTZWFyY2hRdWVyeSBzZWFyY2hRdWVyeSA9IG5ldyBNZXRob2RTZWFyY2hRdWVyeShzZWFyY2hJbnB1dCk7Ci0JCU5ld1NlYXJjaFVJLmFjdGl2YXRlU2VhcmNoUmVzdWx0VmlldygpOwotCQlOZXdTZWFyY2hVSS5ydW5RdWVyeUluQmFja2dyb3VuZChzZWFyY2hRdWVyeSk7Ci0JCVNlYXJjaFVJUHJlZmVyZW5jZXMuc2V0U2VhcmNoU3RyaW5nKHNlYXJjaFN0cmluZ0NvbWJvLmdldFRleHQoKSk7Ci0JCVNlYXJjaFVJUHJlZmVyZW5jZXMuc2V0TmFtZVBhdHRlcm4obmFtZVBhdHRlcm5Db21iby5nZXRUZXh0KCkpOwotCQlTZWFyY2hVSVByZWZlcmVuY2VzLnNldENhc2VTZW5zaXRpdmUoY2FzZVNlbnNpdGl2ZUNoZWNrYm94Ci0JCQkJLmdldFNlbGVjdGlvbigpKTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5zZWFyY2gudWkuSVNlYXJjaFBhZ2Ujc2V0Q29udGFpbmVyKElTZWFyY2hQYWdlQ29udGFpbmVyKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvbnRhaW5lcihJU2VhcmNoUGFnZUNvbnRhaW5lciBjb250YWluZXIpIHsKLQkJdGhpcy5jb250YWluZXIgPSBjb250YWluZXI7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5zZWFyY2gudWkuSVJlcGxhY2VQYWdlI3BlcmZvcm1SZXBsYWNlKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtUmVwbGFjZSgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZ1BhZ2UjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGVuYWJsZWQgc3RhdHVzIG9mIHRoZSBTZWFyY2ggYnV0dG9uLgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTxjb2RlPiBpZiB0aGUgU2VhcmNoIGJ1dHRvbiBzaG91bGQgYmUgZW5hYmxlZAotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBnZXRTZWFyY2hCdXR0b25FbmFibGVkKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvdWkvTWV0aG9kU2VhcmNoUmVzdWx0UGFnZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC91aS9NZXRob2RTZWFyY2hSZXN1bHRQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhNDNjNjkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC91aS9NZXRob2RTZWFyY2hSZXN1bHRQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nUGVyc3BlY3RpdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5Ccm93c2luZ1BlcnNwZWN0aXZlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5FZGl0b3JDaG9vc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudmlld3MuQ29udGVudFZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS51dGlsLlBlcnNwZWN0aXZlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5FeHRlbnNpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLnByb3ZpZGVycy5FbGVtZW50VHJlZUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS5pbnRlcm5hbC5JU2VhcmNoUmVzdWx0UHJvdmlkZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkuaW50ZXJuYWwuTWV0aG9kRWxlbWVudFZpZXdTb3J0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS5pbnRlcm5hbC5TZWFyY2hSZXN1bHRUYWJsZUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpLmludGVybmFsLlNlYXJjaFJlc3VsdFRyZWVDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0VsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zZWFyY2gudWkuTmV3U2VhcmNoVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc2VhcmNoLnVpLnRleHQuQWJzdHJhY3RUZXh0U2VhcmNoVmlld1BhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc2VhcmNoLnVpLnRleHQuTWF0Y2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVZpZXdQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBhcnRJbml0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci0KLS8qKgotICogRGlzcGxheXMgdGhlIE1ldGhvZCBTZWFyY2ggcmVzdWx0IGluIHRoZSBTZWFyY2ggdmlldy4gVGhlIHNlYXJjaCByZXN1bHQKLSAqIGNhbiBiZSBkaXNwbGF5ZWQgaW4gYSBoaWVyYXJjaGljYWwgb3IgZmxhdCB2aWV3LgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXRob2RTZWFyY2hSZXN1bHRQYWdlIGV4dGVuZHMgQWJzdHJhY3RUZXh0U2VhcmNoVmlld1BhZ2UKLQkJaW1wbGVtZW50cyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIHsKLQotCXByaXZhdGUgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIgY29udGVudFByb3ZpZGVyOwotCi0JcHJpdmF0ZSBJTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgTWV0aG9kU2VhcmNoUmVzdWx0UGFnZSgpIHsKLQkJc3VwZXIoKTsKLQkJbGFiZWxQcm92aWRlciA9IGNyZWF0ZUxhYmVsUHJvdmlkZXIoKTsKLQkJCi0JCS8vIENsZWFyIHRoZSBzZWFyY2ggcmVzdWx0IHdoZW4gdGhlIGN1cnJlbnQgbWV0aG9kIGxpYnJhcnkgaXMgY2xvc2VkIGJ5IHRoZSB1c2VyLgotCQlMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmFkZExpc3RlbmVyKG5ldyBMaWJyYXJ5U2VydmljZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgbGlicmFyeUNsb3NlZChNZXRob2RMaWJyYXJ5IGxpYnJhcnkpIHsKLQkJCQlNZXRob2RTZWFyY2hSZXN1bHRQYWdlLnRoaXMuZ2V0SW5wdXQoKS5yZW1vdmVBbGwoKTsKLQkJCX0JCQkKLQkJfSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5zZWFyY2gudWkudGV4dC5BYnN0cmFjdFRleHRTZWFyY2hWaWV3UGFnZSNpc0xheW91dFN1cHBvcnRlZChpbnQpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNMYXlvdXRTdXBwb3J0ZWQoaW50IGxheW91dCkgewotCQlyZXR1cm4gKChsYXlvdXQgJiBGTEFHX0xBWU9VVF9GTEFUKSAhPSAwIHx8IChsYXlvdXQgJiBGTEFHX0xBWU9VVF9UUkVFKSAhPSAwKTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSVNlYXJjaFJlc3VsdFByb3ZpZGVyRmFjdG9yeSBnZXRTZWFyY2hSZXN1bHRQcm92aWRlckZhY3RvcnkoKSB7Ci0JCXJldHVybiAoSVNlYXJjaFJlc3VsdFByb3ZpZGVyRmFjdG9yeSkgRXh0ZW5zaW9uTWFuYWdlci5nZXRFeHRlbnNpb24oCi0JCQkJU2VhcmNoVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldElkKCksCi0JCQkJInNlYXJjaFJlc3VsdFByb3ZpZGVyRmFjdG9yeSIpOyAvLyROT04tTkxTLTEkCi0JfQotCQotCXByb3RlY3RlZCBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciBjcmVhdGVDb250ZW50UHJvdmlkZXIoVmlld2VyIHZpZXdlcikgewotCQlJU2VhcmNoUmVzdWx0UHJvdmlkZXJGYWN0b3J5IGZhY3RvcnkgPSBnZXRTZWFyY2hSZXN1bHRQcm92aWRlckZhY3RvcnkoKTsKLQkJaWYodmlld2VyIGluc3RhbmNlb2YgVHJlZVZpZXdlcikgewotCQkJSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIgY3AgPSBudWxsOwotCQkJaWYoZmFjdG9yeSAhPSBudWxsKSB7Ci0JCQkJY3AgPSBmYWN0b3J5LmNyZWF0ZVRyZWVDb250ZW50UHJvdmlkZXIoKTsKLQkJCX0KLQkJCXJldHVybiBjcCAhPSBudWxsID8gY3AgOiBuZXcgU2VhcmNoUmVzdWx0VHJlZUNvbnRlbnRQcm92aWRlcigpOwotCQl9Ci0JCWVsc2UgaWYodmlld2VyIGluc3RhbmNlb2YgVGFibGVWaWV3ZXIpIHsKLQkJCUlTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyIGNwID0gbnVsbDsKLQkJCWlmKGZhY3RvcnkgIT0gbnVsbCkgewotCQkJCWNwID0gZmFjdG9yeS5jcmVhdGVUYWJsZUNvbnRlbnRQcm92aWRlcigpOwotCQkJfQotCQkJcmV0dXJuIGNwICE9IG51bGwgPyBjcCA6IG5ldyBTZWFyY2hSZXN1bHRUYWJsZUNvbnRlbnRQcm92aWRlcigpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwcm90ZWN0ZWQgSUxhYmVsUHJvdmlkZXIgY3JlYXRlTGFiZWxQcm92aWRlcigpIHsKLQkJSUxhYmVsUHJvdmlkZXIgbHAgPSBudWxsOwotCQlJU2VhcmNoUmVzdWx0UHJvdmlkZXJGYWN0b3J5IGZhY3RvcnkgPSBnZXRTZWFyY2hSZXN1bHRQcm92aWRlckZhY3RvcnkoKTsKLQkJaWYoZmFjdG9yeSAhPSBudWxsKSB7Ci0JCQlscCA9IGZhY3RvcnkuY3JlYXRlTGFiZWxQcm92aWRlcigpOwotCQl9Ci0JCXJldHVybiBscCAhPSBudWxsID8gbHAgOiBuZXcgRWxlbWVudFRyZWVMYWJlbFByb3ZpZGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5zZWFyY2gudWkudGV4dC5BYnN0cmFjdFRleHRTZWFyY2hWaWV3UGFnZSNjb25maWd1cmVUcmVlVmlld2VyKFRyZWVWaWV3ZXIpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlVHJlZVZpZXdlcihUcmVlVmlld2VyIHZpZXdlcikgewotCQljb250ZW50UHJvdmlkZXIgPSBjcmVhdGVDb250ZW50UHJvdmlkZXIodmlld2VyKTsKLQkJdmlld2VyLnNldENvbnRlbnRQcm92aWRlcihjb250ZW50UHJvdmlkZXIpOwotCQl2aWV3ZXIuc2V0TGFiZWxQcm92aWRlcihsYWJlbFByb3ZpZGVyKTsKLQkJdmlld2VyLnNldFNvcnRlcihuZXcgTWV0aG9kRWxlbWVudFZpZXdTb3J0ZXIoKSk7Ci0JCXZpZXdlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIodGhpcyk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5zZWFyY2gudWkudGV4dC5BYnN0cmFjdFRleHRTZWFyY2hWaWV3UGFnZSNjb25maWd1cmVUYWJsZVZpZXdlcihUYWJsZVZpZXdlcikKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVUYWJsZVZpZXdlcihUYWJsZVZpZXdlciB2aWV3ZXIpIHsKLQkJY29udGVudFByb3ZpZGVyID0gY3JlYXRlQ29udGVudFByb3ZpZGVyKHZpZXdlcik7Ci0JCXZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIoY29udGVudFByb3ZpZGVyKTsKLQkJdmlld2VyLnNldExhYmVsUHJvdmlkZXIobGFiZWxQcm92aWRlcik7Ci0JCXZpZXdlci5zZXRTb3J0ZXIobmV3IE1ldGhvZEVsZW1lbnRWaWV3U29ydGVyKCkpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc2VhcmNoLnVpLnRleHQuQWJzdHJhY3RUZXh0U2VhcmNoVmlld1BhZ2UjZWxlbWVudHNDaGFuZ2VkKE9iamVjdFtdKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGVsZW1lbnRzQ2hhbmdlZChPYmplY3RbXSBvYmplY3RzKSB7Ci0JCWlmIChjb250ZW50UHJvdmlkZXIgIT0gbnVsbCkgewotCQkJaWYgKGNvbnRlbnRQcm92aWRlciBpbnN0YW5jZW9mIFNlYXJjaFJlc3VsdFRyZWVDb250ZW50UHJvdmlkZXIpIHsKLQkJCQkoKFNlYXJjaFJlc3VsdFRyZWVDb250ZW50UHJvdmlkZXIpIGNvbnRlbnRQcm92aWRlcikKLQkJCQkJCS5lbGVtZW50c0NoYW5nZWQob2JqZWN0cyk7Ci0JCQl9IGVsc2UgaWYgKGNvbnRlbnRQcm92aWRlciBpbnN0YW5jZW9mIFNlYXJjaFJlc3VsdFRhYmxlQ29udGVudFByb3ZpZGVyKSB7Ci0JCQkJKChTZWFyY2hSZXN1bHRUYWJsZUNvbnRlbnRQcm92aWRlcikgY29udGVudFByb3ZpZGVyKQotCQkJCQkJLmVsZW1lbnRzQ2hhbmdlZChvYmplY3RzKTsKLQkJCX0KLQkJfQotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnNlYXJjaC51aS50ZXh0LkFic3RyYWN0VGV4dFNlYXJjaFZpZXdQYWdlI2NsZWFyKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjbGVhcigpIHsKLQkJaWYgKGNvbnRlbnRQcm92aWRlciAhPSBudWxsKSB7Ci0JCQlpZiAoY29udGVudFByb3ZpZGVyIGluc3RhbmNlb2YgU2VhcmNoUmVzdWx0VHJlZUNvbnRlbnRQcm92aWRlcikgewotCQkJCSgoU2VhcmNoUmVzdWx0VHJlZUNvbnRlbnRQcm92aWRlcikgY29udGVudFByb3ZpZGVyKS5jbGVhcigpOwotCQkJfSBlbHNlIGlmIChjb250ZW50UHJvdmlkZXIgaW5zdGFuY2VvZiBTZWFyY2hSZXN1bHRUYWJsZUNvbnRlbnRQcm92aWRlcikgewotCQkJCSgoU2VhcmNoUmVzdWx0VGFibGVDb250ZW50UHJvdmlkZXIpIGNvbnRlbnRQcm92aWRlcikuY2xlYXIoKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc2VhcmNoLnVpLnRleHQuQWJzdHJhY3RUZXh0U2VhcmNoVmlld1BhZ2Ujc2hvd01hdGNoKE1hdGNoLAotCSAqICAgICAgaW50LCBpbnQsIGJvb2xlYW4pCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2hvd01hdGNoKE1hdGNoIG1hdGNoLCBpbnQgY3VycmVudE9mZnNldCwgaW50IGN1cnJlbnRMZW5ndGgsCi0JCQlib29sZWFuIGFjdGl2YXRlKSB0aHJvd3MgUGFydEluaXRFeGNlcHRpb24gewotCQlpZiAobWF0Y2guZ2V0RWxlbWVudCgpIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCAmJiBhY3RpdmF0ZSkgewotCQkJTWV0aG9kRWxlbWVudCBlbGVtZW50ID0gKE1ldGhvZEVsZW1lbnQpIG1hdGNoLmdldEVsZW1lbnQoKTsKLQkJCWlmIChQZXJzcGVjdGl2ZVV0aWwKLQkJCQkJLmlzQWN0aXZlUGVyc3BlY3RpdmUoQnJvd3NpbmdQZXJzcGVjdGl2ZS5QRVJTUEVDVElWRV9JRCkpIHsKLQkJCQlQZXJzcGVjdGl2ZVV0aWwKLQkJCQkJCS5vcGVuUGVyc3BlY3RpdmUoQXV0aG9yaW5nUGVyc3BlY3RpdmUuUEVSU1BFQ1RJVkVfSUQpOwotCQkJCUlXb3JrYmVuY2hQYWdlIGFjdGl2ZVBhZ2UgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpCi0JCQkJCQkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0QWN0aXZlUGFnZSgpOwotCQkJCWlmIChhY3RpdmVQYWdlICE9IG51bGwpIHsKLQkJCQkJSVZpZXdQYXJ0IHZpZXcgPSBhY3RpdmVQYWdlCi0JCQkJCQkJLmZpbmRWaWV3KE5ld1NlYXJjaFVJLlNFQVJDSF9WSUVXX0lEKTsKLQkJCQkJaWYgKHZpZXcgIT0gbnVsbCkgewotCQkJCQkJYWN0aXZlUGFnZS5zaG93VmlldyhOZXdTZWFyY2hVSS5TRUFSQ0hfVklFV19JRCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlkaXNwbGF5RWRpdG9yKGVsZW1lbnQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogRGlzcGxheXMgdGhlIE1ldGhvZCBlZGl0b3IgZm9yIHRoZSBzZWxlY3RlZCBNZXRob2QgZWxlbWVudC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkaXNwbGF5RWRpdG9yKE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgewotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFByb2Nlc3NFbGVtZW50KSB7Ci0JCQlFZGl0b3JDaG9vc2VyLmdldEluc3RhbmNlKCkub3BlbkVkaXRvcigKLQkJCQkJVW1hVXRpbC5nZXRQcm9jZXNzQ29tcG9uZW50KGVsZW1lbnQpKTsKLQkJfSBlbHNlIHsKLQkJCUVkaXRvckNob29zZXIuZ2V0SW5zdGFuY2UoKS5vcGVuRWRpdG9yKGVsZW1lbnQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIjc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJaWYgKFBlcnNwZWN0aXZlVXRpbAotCQkJCS5pc0FjdGl2ZVBlcnNwZWN0aXZlKEJyb3dzaW5nUGVyc3BlY3RpdmUuUEVSU1BFQ1RJVkVfSUQpKSB7Ci0JCQlJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IGV2ZW50LmdldFNlbGVjdGlvbigpOwotCQkJaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7Ci0JCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb247Ci0JCQkJT2JqZWN0W10gc2VsZWN0ZWRFbGVtZW50cyA9IHNlbC50b0FycmF5KCk7Ci0JCQkJaWYgKHNlbGVjdGVkRWxlbWVudHMgIT0gbnVsbCAmJiBzZWxlY3RlZEVsZW1lbnRzLmxlbmd0aCA+IDApIHsKLQkJCQkJaWYgKHNlbGVjdGVkRWxlbWVudHNbMF0gaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQkJCQl0cnkgewotCQkJCQkJCWRpc3BsYXlIVE1MUGFnZSgoTWV0aG9kRWxlbWVudCkgc2VsZWN0ZWRFbGVtZW50c1swXSk7Ci0JCQkJCQl9IGNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBEaXNwbGF5cyB0aGUgSFRNTCBjb250ZW50IHBhZ2UgZm9yIHRoZSBzZWxlY3RlZCBtZXRob2QgZWxlbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqICAgICAgICAgICAgYSBtZXRob2QgZWxlbWVudAotCSAqIEB0aHJvd3MgUGFydEluaXRFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBpZiB0aGUgQ29udGVudCB2aWV3IGNhbm5vdCBiZSBkaXNwbGF5ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkaXNwbGF5SFRNTFBhZ2UoTWV0aG9kRWxlbWVudCBlbGVtZW50KQotCQkJdGhyb3dzIFBhcnRJbml0RXhjZXB0aW9uIHsKLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4KLQkJCQl8fCBlbGVtZW50IGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UpIHsKLQkJCXJldHVybjsKLQkJfQotCQlJV29ya2JlbmNoUGFnZSBhY3RpdmVQYWdlID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKQotCQkJCS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRBY3RpdmVQYWdlKCk7Ci0JCWlmIChhY3RpdmVQYWdlICE9IG51bGwpIHsKLQkJCUlWaWV3UGFydCB2aWV3ID0gYWN0aXZlUGFnZS5maW5kVmlldyhDb250ZW50Vmlldy5WSUVXX0lEKTsKLQkJCWlmICh2aWV3ID09IG51bGwpIHsKLQkJCQl2aWV3ID0gYWN0aXZlUGFnZS5zaG93VmlldyhDb250ZW50Vmlldy5WSUVXX0lEKTsKLQkJCX0KLQkJCWlmICh2aWV3ICE9IG51bGwpIHsKLQkJCQkoKENvbnRlbnRWaWV3KSB2aWV3KS5kaXNwbGF5SFRNTENvbnRlbnRQYWdlKGVsZW1lbnQpOwotCQkJfQotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL3VpL1Jlc291cmNlcy5wcm9wZXJ0aWVzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC91aS9SZXNvdXJjZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjE2ZjQ0MC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL3VpL1Jlc291cmNlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLQotIyBNZXRob2QgU2VhcmNoIFBhZ2UKLXNlYXJjaFN0cmluZ0xhYmVsX3RleHQ9VGV4dCAoKiA9IGFueSBzdHJpbmcsID8gPSBhbnkgY2hhcmFjdGVyKToKLWNhc2VTZW5zaXRpdmVDaGVja2JveF90ZXh0PUNhc2Ugc2Vuc2l0aXZlCi1lbGVtZW50TmFtZUxhYmVsX3RleHQ9TWV0aG9kIGVsZW1lbnQgbmFtZSBvciBwcmVzZW50YXRpb24gbmFtZSBwYXR0ZXJuOgotc2NvcGVHcm91cF90ZXh0PVNjb3BlCi1yb2xlQ2hlY2tib3hfdGV4dD1Sb2xlCi10YXNrQ2hlY2tib3hfdGV4dD1UYXNrCi13b3JrUHJvZHVjdENoZWNrYm94X3RleHQ9V29yayBQcm9kdWN0Ci0KLSMgTWV0aG9kIFNlYXJjaCBRdWVyeQotc2VhcmNoUXVlcnlfdGV4dD1NZXRob2QgU2VhcmNoCi0KLSMgTWV0aG9kIFNlYXJjaCBQcm9ncmVzcyBEaWFsb2cKLXNjYW5MaWJyYXJ5VGFza19uYW1lPVNjYW5uaW5nIG1ldGhvZCBsaWJyYXJ5Li4uCi1zY2FuRWxlbWVudFRhc2tfbmFtZT1TY2FubmluZyBtZXRob2QgZWxlbWVudCAnJ3swfScnLi4uCi0KLSMgTWV0aG9kIFNlYXJjaCBFcnJvciBEaWFsb2cKLXNlYXJjaEVycm9yX3RpdGxlPU1ldGhvZCBTZWFyY2gKLXNlYXJjaEVycm9yX21zZz1JVVBTMDEwMEU6IFNlYXJjaCBvcGVyYXRpb24gY2Fubm90IHByb2NlZWQuCi1zZWFyY2hFcnJvcl9yZWFzb249Tm8gbWV0aG9kIGxpYnJhcnkgaXMgY3VycmVudGx5IG9wZW5lZC5cblxuT3BlbiBhIG1ldGhvZCBsaWJyYXJ5IGFuZCB0cnkgYWdhaW4uCi0KLSMgTWV0aG9kIFNlYXJjaCBSZXN1bHQKLXNlYXJjaFJlc3VsdF9tZXRob2RDb250ZW50PU1ldGhvZCBDb250ZW50Ci1zZWFyY2hSZXN1bHRfY29udGVudFBhY2thZ2VzPUNvbnRlbnQgUGFja2FnZXMKLXNlYXJjaFJlc3VsdF9zdGFuZGFyZENhdGVnb3JpZXM9U3RhbmRhcmQgQ2F0ZWdvcmllcwotc2VhcmNoUmVzdWx0X2Rpc2NpcGxpbmVzPURpc2NpcGxpbmVzCi1zZWFyY2hSZXN1bHRfZG9tYWlucz1Eb21haW5zCi1zZWFyY2hSZXN1bHRfd29ya1Byb2R1Y3RUeXBlcz1Xb3JrIFByb2R1Y3QgVHlwZXMKLXNlYXJjaFJlc3VsdF9yb2xlU2V0cz1Sb2xlIFNldHMKLXNlYXJjaFJlc3VsdF90b29scz1Ub29scwotc2VhcmNoUmVzdWx0X2N1c3RvbUNhdGVnb3JpZXM9Q3VzdG9tIENhdGVnb3JpZXMKLXNlYXJjaFJlc3VsdF9wcm9jZXNzZXM9UHJvY2Vzc2VzCi1zZWFyY2hSZXN1bHRfY2FwYWJpbGl0eVBhdHRlcm5zPUNhcGFiaWxpdHkgUGF0dGVybnMKLXNlYXJjaFJlc3VsdF9kZWxpdmVyeVByb2Nlc3Nlcz1EZWxpdmVyeSBQcm9jZXNzZXMKLXNlYXJjaFJlc3VsdF9tYXRjaD0nJ3swfScnIC0gMSBtYXRjaAotc2VhcmNoUmVzdWx0X21hdGNoZXM9Jyd7MH0nJyAtIHsxfSBtYXRjaGVzCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL3VpL1NlYXJjaFVJUGx1Z2luLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL3VpL1NlYXJjaFVJUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjMzM3ZmIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC91aS9TZWFyY2hVSVBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udWkuQWJzdHJhY3RQbHVnaW47Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0KLS8qKgotICogVGhlIFNlYXJjaCBVSSBwbHVnLWluIGFjdGl2YXRvci4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBTZWFyY2hVSVBsdWdpbiBleHRlbmRzIEFic3RyYWN0UGx1Z2luIHsKLQotCS8vIFRoZSBzaGFyZWQgcGx1Zy1pbiBpbnN0YW5jZS4KLQlwcml2YXRlIHN0YXRpYyBTZWFyY2hVSVBsdWdpbiBwbHVnaW47Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBTZWFyY2hVSVBsdWdpbigpIHsKLQkJc3VwZXIoKTsKLQkJcGx1Z2luID0gdGhpczsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIEFic3RyYWN0UGx1Z2luI3N0YXJ0KEJ1bmRsZUNvbnRleHQpCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RhcnQoY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBBYnN0cmFjdFBsdWdpbiNzdGFydChCdW5kbGVDb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RvcChjb250ZXh0KTsKLQkJcGx1Z2luID0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaGFyZWQgcGx1Zy1pbiBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFNlYXJjaFVJUGx1Z2luIGdldERlZmF1bHQoKSB7Ci0JCXJldHVybiBwbHVnaW47Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL3VpL1NlYXJjaFVJUmVzb3VyY2VzLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL3VpL1NlYXJjaFVJUmVzb3VyY2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzMGQzMmEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC91aS9TZWFyY2hVSVJlc291cmNlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLS8qKgotICogVGhlIFNlYXJjaCBVSSByZXNvdXJjZSBidW5kbGUuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgU2VhcmNoVUlSZXNvdXJjZXMgZXh0ZW5kcyBOTFMgewotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIEJVTkRMRV9OQU1FID0gU2VhcmNoVUlSZXNvdXJjZXMuY2xhc3MuZ2V0UGFja2FnZSgpCi0JCQkuZ2V0TmFtZSgpCi0JCQkrICIuUmVzb3VyY2VzIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VhcmNoU3RyaW5nTGFiZWxfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNhc2VTZW5zaXRpdmVDaGVja2JveF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZWxlbWVudE5hbWVMYWJlbF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2NvcGVHcm91cF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcm9sZUNoZWNrYm94X3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0YXNrQ2hlY2tib3hfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdvcmtQcm9kdWN0Q2hlY2tib3hfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlYXJjaFF1ZXJ5X3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzY2FuTGlicmFyeVRhc2tfbmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNjYW5FbGVtZW50VGFza19uYW1lOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VhcmNoRXJyb3JfdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzZWFyY2hFcnJvcl9tc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzZWFyY2hFcnJvcl9yZWFzb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzZWFyY2hSZXN1bHRfbWV0aG9kQ29udGVudDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlYXJjaFJlc3VsdF9jb250ZW50UGFja2FnZXM7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzZWFyY2hSZXN1bHRfc3RhbmRhcmRDYXRlZ29yaWVzOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VhcmNoUmVzdWx0X2Rpc2NpcGxpbmVzOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VhcmNoUmVzdWx0X2RvbWFpbnM7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzZWFyY2hSZXN1bHRfd29ya1Byb2R1Y3RUeXBlczsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlYXJjaFJlc3VsdF9yb2xlU2V0czsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlYXJjaFJlc3VsdF90b29sczsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlYXJjaFJlc3VsdF9jdXN0b21DYXRlZ29yaWVzOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VhcmNoUmVzdWx0X3Byb2Nlc3NlczsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlYXJjaFJlc3VsdF9jYXBhYmlsaXR5UGF0dGVybnM7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzZWFyY2hSZXN1bHRfZGVsaXZlcnlQcm9jZXNzZXM7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzZWFyY2hSZXN1bHRfbWF0Y2g7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzZWFyY2hSZXN1bHRfbWF0Y2hlczsKLQotCXN0YXRpYyB7Ci0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIFNlYXJjaFVJUmVzb3VyY2VzLmNsYXNzKTsKLQl9Ci0KLQlwcml2YXRlIFNlYXJjaFVJUmVzb3VyY2VzKCkgewotCQkvLyBEbyBub3QgaW5zdGFudGlhdGUuCi0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC91aS9pbnRlcm5hbC9JTWV0aG9kU2VhcmNoSW5wdXRFeHRlbnNpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvdWkvaW50ZXJuYWwvSU1ldGhvZFNlYXJjaElucHV0RXh0ZW5zaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxZDJkZjAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC91aS9pbnRlcm5hbC9JTWV0aG9kU2VhcmNoSW5wdXRFeHRlbnNpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS41Ci0gKgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElNZXRob2RTZWFyY2hJbnB1dEV4dGVuc2lvbiB7Ci0JTWFwPD8sID8+IGdldElucHV0KCk7Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL3VpL2ludGVybmFsL0lNZXRob2RTZWFyY2hJbnB1dEZhY3RvcnkuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvdWkvaW50ZXJuYWwvSU1ldGhvZFNlYXJjaElucHV0RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MDBmMDhlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvdWkvaW50ZXJuYWwvSU1ldGhvZFNlYXJjaElucHV0RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuNQotICoKLSAqLwotcHVibGljIGludGVyZmFjZSBJTWV0aG9kU2VhcmNoSW5wdXRGYWN0b3J5IHsKLQlJTWV0aG9kU2VhcmNoSW5wdXRFeHRlbnNpb24gY3JlYXRlU2VhcmNoSW5wdXQoQ29tcG9zaXRlIGNvbXBvc2l0ZSk7Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL3VpL2ludGVybmFsL0lNZXRob2RTZWFyY2hPcGVyYXRpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvdWkvaW50ZXJuYWwvSU1ldGhvZFNlYXJjaE9wZXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYmZmYmQ5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvdWkvaW50ZXJuYWwvSU1ldGhvZFNlYXJjaE9wZXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotCi0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjUKLSAqLwotcHVibGljIGludGVyZmFjZSBJTWV0aG9kU2VhcmNoT3BlcmF0aW9uIHsKLQl2b2lkIGV4ZWN1dGUoTWV0aG9kU2VhcmNoSW5wdXQgc2VhcmNoSW5wdXQsIElTZWFyY2hSZXN1bHRDb2xsZWN0b3IgcmVzdWx0LCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpOwotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC91aS9pbnRlcm5hbC9JTWV0aG9kU2VhcmNoUXVlcnkuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvdWkvaW50ZXJuYWwvSU1ldGhvZFNlYXJjaFF1ZXJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjOGVkYWMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC91aS9pbnRlcm5hbC9JTWV0aG9kU2VhcmNoUXVlcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zZWFyY2gudWkuSVNlYXJjaFF1ZXJ5OwotCi0vKioKLSAqIFRoZSBpbnRlcmZhY2UgZm9yIGEgbWV0aG9kIHNlYXJjaCBxdWVyeS4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElNZXRob2RTZWFyY2hRdWVyeSBleHRlbmRzIElTZWFyY2hRdWVyeSB7Ci0JCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL3VpL2ludGVybmFsL0lNZXRob2RTZWFyY2hTY29wZUdyb3VwLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL3VpL2ludGVybmFsL0lNZXRob2RTZWFyY2hTY29wZUdyb3VwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3NGE1NWQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC91aS9pbnRlcm5hbC9JTWV0aG9kU2VhcmNoU2NvcGVHcm91cC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS5pbnRlcm5hbDsKLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuNQotICoKLSAqLwotcHVibGljIGludGVyZmFjZSBJTWV0aG9kU2VhcmNoU2NvcGVHcm91cCB7Ci0JTWV0aG9kU2VhcmNoU2NvcGVWaWV3ZXIgZ2V0U2VhcmNoU2NvcGVWaWV3ZXIoKTsKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvdWkvaW50ZXJuYWwvSU1ldGhvZFNlYXJjaFNjb3BlR3JvdXBGYWN0b3J5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL3VpL2ludGVybmFsL0lNZXRob2RTZWFyY2hTY29wZUdyb3VwRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNzc2ZTA4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvdWkvaW50ZXJuYWwvSU1ldGhvZFNlYXJjaFNjb3BlR3JvdXBGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTGljZW5zZWQgTWF0ZXJpYWxzIC0gUHJvcGVydHkgb2YgSUJNCi0gKiAoYykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDA3LTIwMDguIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKiAKLSAqIE5vdGUgdG8gVS5TLiBHb3Zlcm5tZW50IFVzZXJzIFJlc3RyaWN0ZWQgUmlnaHRzOgotICogVXNlLCBkdXBsaWNhdGlvbiBvciBkaXNjbG9zdXJlIHJlc3RyaWN0ZWQgYnkgR1NBIEFEUCBTY2hlZHVsZQotICogQ29udHJhY3Qgd2l0aCBJQk0gQ29ycC4gCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDcuNQotICoKLSAqLwotcHVibGljIGludGVyZmFjZSBJTWV0aG9kU2VhcmNoU2NvcGVHcm91cEZhY3RvcnkgewotCQotCUlNZXRob2RTZWFyY2hTY29wZUdyb3VwIGNyZWF0ZVNlYXJjaFNjb3BlR3JvdXAoQ29tcG9zaXRlIGNvbXBvc2l0ZSk7Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvdWkvaW50ZXJuYWwvSVNlYXJjaFJlc3VsdENvbGxlY3Rvci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC91aS9pbnRlcm5hbC9JU2VhcmNoUmVzdWx0Q29sbGVjdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMGI1MDEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC91aS9pbnRlcm5hbC9JU2VhcmNoUmVzdWx0Q29sbGVjdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpLmludGVybmFsOwotCi0vKioKLSAqIFRoZSBpbnRlcmZhY2UgZm9yIGEgbWV0aG9kIHNlYXJjaCByZXN1bHQgY29sbGVjdG9yLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJU2VhcmNoUmVzdWx0Q29sbGVjdG9yIHsKLQotCS8qKgotCSAqIEV2YWx1YXRlcyB0aGUgZ2l2ZW4gb2JqZWN0IHRvIHNlZSBpZiB0aGVyZSBpcyBhIG1hdGNoIGluIHRoZSBzZWFyY2gKLQkgKiBjcml0ZXJpYS4KLQkgKiAKLQkgKiBAcGFyYW0gbWF0Y2gKLQkgKiAgICAgICAgICAgIGFuIG9iamVjdCBjb250YWluaW5nIHRoZSBtZXRob2QgZWxlbWVudCB0byBtYXRjaAotCSAqLwotCXZvaWQgYWNjZXB0KE9iamVjdCBtYXRjaCk7Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvdWkvaW50ZXJuYWwvSVNlYXJjaFJlc3VsdFByb3ZpZGVyRmFjdG9yeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC91aS9pbnRlcm5hbC9JU2VhcmNoUmVzdWx0UHJvdmlkZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlYjY2Y2QuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC91aS9pbnRlcm5hbC9JU2VhcmNoUmVzdWx0UHJvdmlkZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRyZWVDb250ZW50UHJvdmlkZXI7Ci0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjUKLSAqCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVNlYXJjaFJlc3VsdFByb3ZpZGVyRmFjdG9yeSB7Ci0JSVRyZWVDb250ZW50UHJvdmlkZXIgY3JlYXRlVHJlZUNvbnRlbnRQcm92aWRlcigpOwotCQotCUlTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyIGNyZWF0ZVRhYmxlQ29udGVudFByb3ZpZGVyKCk7Ci0JCi0JSUxhYmVsUHJvdmlkZXIgY3JlYXRlTGFiZWxQcm92aWRlcigpOwotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC91aS9pbnRlcm5hbC9NZXRob2RFbGVtZW50Vmlld1NvcnRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC91aS9pbnRlcm5hbC9NZXRob2RFbGVtZW50Vmlld1NvcnRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YmM0MWNmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvdWkvaW50ZXJuYWwvTWV0aG9kRWxlbWVudFZpZXdTb3J0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRDYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DdXN0b21DYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkd1aWRhbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuSXRlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1pbGVzdG9uZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlBoYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc1BhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlclNvcnRlcjsKLQotLyoqCi0gKiBTb3J0cyB0aGUgbWV0aG9kIGVsZW1lbnRzIGluIGEgc3BlY2lmaWMgb3JkZXIgZm9yIGRpc3BsYXkgaW4gdGhlIFNlYXJjaAotICogdmlldy4KLSAqIDxwPgotICogVGhlIG1ldGhvZCBlbGVtZW50cyBhcmUgc29ydGVkIGJ5IHR5cGVzLiBXaXRoaW4gZWFjaCB0eXBlLCB0aGUgZWxlbWVudHMgYXJlCi0gKiBzb3J0ZWQgYWxwaGFiZXRpY2FsbHkgYnkgbmFtZXMuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTWV0aG9kRWxlbWVudFZpZXdTb3J0ZXIgZXh0ZW5kcyBWaWV3ZXJTb3J0ZXIgewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgTWV0aG9kRWxlbWVudFZpZXdTb3J0ZXIoKSB7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlclNvcnRlciNjb21wYXJlKFZpZXdlciwgT2JqZWN0LAotCSAqICAgICAgT2JqZWN0KQotCSAqLwotCXB1YmxpYyBpbnQgY29tcGFyZShWaWV3ZXIgdmlld2VyLCBPYmplY3QgZTEsIE9iamVjdCBlMikgewotCQlpZiAoZTEgaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pIHsKLQkJCWlmICghKGUyIGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luKSkgewotCQkJCXJldHVybiAtMTsKLQkJCX0KLQkJfSBlbHNlIGlmIChlMSBpbnN0YW5jZW9mIENvbnRlbnRQYWNrYWdlKSB7Ci0JCQlpZiAoZTIgaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pIHsKLQkJCQlyZXR1cm4gMTsKLQkJCX0gZWxzZSBpZiAoIShlMiBpbnN0YW5jZW9mIENvbnRlbnRQYWNrYWdlKSkgewotCQkJCXJldHVybiAtMTsKLQkJCX0KLQkJfSBlbHNlIGlmIChlMSBpbnN0YW5jZW9mIFJvbGUpIHsKLQkJCWlmIChlMiBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbiB8fCBlMiBpbnN0YW5jZW9mIENvbnRlbnRQYWNrYWdlKSB7Ci0JCQkJcmV0dXJuIDE7Ci0JCQl9IGVsc2UgaWYgKCEoZTIgaW5zdGFuY2VvZiBSb2xlKSkgewotCQkJCXJldHVybiAtMTsKLQkJCX0KLQkJfSBlbHNlIGlmIChlMSBpbnN0YW5jZW9mIFRhc2spIHsKLQkJCWlmIChlMiBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbiB8fCBlMiBpbnN0YW5jZW9mIENvbnRlbnRQYWNrYWdlCi0JCQkJCXx8IGUyIGluc3RhbmNlb2YgUm9sZSkgewotCQkJCXJldHVybiAxOwotCQkJfSBlbHNlIGlmICghKGUyIGluc3RhbmNlb2YgVGFzaykpIHsKLQkJCQlyZXR1cm4gLTE7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoZTEgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdCkgewotCQkJaWYgKGUyIGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luIHx8IGUyIGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UKLQkJCQkJfHwgZTIgaW5zdGFuY2VvZiBSb2xlIHx8IGUyIGluc3RhbmNlb2YgVGFzaykgewotCQkJCXJldHVybiAxOwotCQkJfSBlbHNlIGlmICghKGUyIGluc3RhbmNlb2YgV29ya1Byb2R1Y3QpKSB7Ci0JCQkJcmV0dXJuIC0xOwotCQkJfQotCQl9IGVsc2UgaWYgKGUxIGluc3RhbmNlb2YgR3VpZGFuY2UpIHsKLQkJCWlmIChlMiBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbiB8fCBlMiBpbnN0YW5jZW9mIENvbnRlbnRQYWNrYWdlCi0JCQkJCXx8IGUyIGluc3RhbmNlb2YgUm9sZSB8fCBlMiBpbnN0YW5jZW9mIFRhc2sKLQkJCQkJfHwgZTIgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdCkgewotCQkJCXJldHVybiAxOwotCQkJfSBlbHNlIGlmIChlMiBpbnN0YW5jZW9mIEd1aWRhbmNlKSB7Ci0JCQkJU3RyaW5nIG5hbWUxID0gZTEuZ2V0Q2xhc3MoKS5nZXROYW1lKCk7Ci0JCQkJU3RyaW5nIG5hbWUyID0gZTIuZ2V0Q2xhc3MoKS5nZXROYW1lKCk7Ci0JCQkJaWYgKCFuYW1lMS5lcXVhbHMobmFtZTIpKSB7Ci0JCQkJCXJldHVybiBjb2xsYXRvci5jb21wYXJlKG5hbWUxLCBuYW1lMik7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlyZXR1cm4gLTE7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoZTEgaW5zdGFuY2VvZiBDb250ZW50Q2F0ZWdvcnkpIHsKLQkJCWlmIChlMiBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbiB8fCBlMiBpbnN0YW5jZW9mIENvbnRlbnRQYWNrYWdlCi0JCQkJCXx8IGUyIGluc3RhbmNlb2YgUm9sZSB8fCBlMiBpbnN0YW5jZW9mIFRhc2sKLQkJCQkJfHwgZTIgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdCB8fCBlMiBpbnN0YW5jZW9mIEd1aWRhbmNlKSB7Ci0JCQkJcmV0dXJuIDE7Ci0JCQl9IGVsc2UgaWYgKGUxIGluc3RhbmNlb2YgQ3VzdG9tQ2F0ZWdvcnkKLQkJCQkJJiYgIShlMiBpbnN0YW5jZW9mIEN1c3RvbUNhdGVnb3J5KSkgewotCQkJCXJldHVybiAxOwotCQkJfSBlbHNlIGlmICghKGUxIGluc3RhbmNlb2YgQ3VzdG9tQ2F0ZWdvcnkpCi0JCQkJCSYmIGUyIGluc3RhbmNlb2YgQ3VzdG9tQ2F0ZWdvcnkpIHsKLQkJCQlyZXR1cm4gLTE7Ci0JCQl9IGVsc2UgaWYgKGUyIGluc3RhbmNlb2YgQ29udGVudENhdGVnb3J5KSB7Ci0JCQkJU3RyaW5nIG5hbWUxID0gZTEuZ2V0Q2xhc3MoKS5nZXROYW1lKCk7Ci0JCQkJU3RyaW5nIG5hbWUyID0gZTIuZ2V0Q2xhc3MoKS5nZXROYW1lKCk7Ci0JCQkJaWYgKCFuYW1lMS5lcXVhbHMobmFtZTIpKSB7Ci0JCQkJCXJldHVybiBjb2xsYXRvci5jb21wYXJlKG5hbWUxLCBuYW1lMik7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlyZXR1cm4gLTE7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoZTEgaW5zdGFuY2VvZiBQcm9jZXNzKSB7Ci0JCQlpZiAoZTIgaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4gfHwgZTIgaW5zdGFuY2VvZiBDb250ZW50UGFja2FnZQotCQkJCQl8fCBlMiBpbnN0YW5jZW9mIENvbnRlbnRFbGVtZW50KSB7Ci0JCQkJcmV0dXJuIDE7Ci0JCQl9IGVsc2UgaWYgKGUyIGluc3RhbmNlb2YgUHJvY2Vzc1BhY2thZ2UgJiYgIShlMiBpbnN0YW5jZW9mIFByb2Nlc3MpKSB7Ci0JCQkJcmV0dXJuIDE7Ci0JCQl9IGVsc2UgaWYgKCEoZTIgaW5zdGFuY2VvZiBQcm9jZXNzKSkgewotCQkJCXJldHVybiAtMTsKLQkJCX0KLQkJfSBlbHNlIGlmIChlMSBpbnN0YW5jZW9mIFByb2Nlc3NQYWNrYWdlKSB7Ci0JCQlpZiAoZTIgaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4gfHwgZTIgaW5zdGFuY2VvZiBDb250ZW50UGFja2FnZQotCQkJCQl8fCBlMiBpbnN0YW5jZW9mIENvbnRlbnRFbGVtZW50KSB7Ci0JCQkJcmV0dXJuIDE7Ci0JCQl9IGVsc2UgaWYgKGUyIGluc3RhbmNlb2YgUHJvY2VzcyAmJiAhKGUxIGluc3RhbmNlb2YgUHJvY2VzcykpIHsKLQkJCQlyZXR1cm4gLTE7Ci0JCQl9IGVsc2UgaWYgKCEoZTIgaW5zdGFuY2VvZiBQcm9jZXNzUGFja2FnZSkpIHsKLQkJCQlyZXR1cm4gLTE7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoZTEgaW5zdGFuY2VvZiBQcm9jZXNzRWxlbWVudCkgewotCQkJaWYgKGUyIGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luIHx8IGUyIGluc3RhbmNlb2YgTWV0aG9kUGFja2FnZQotCQkJCQl8fCBlMiBpbnN0YW5jZW9mIENvbnRlbnRFbGVtZW50IHx8IGUyIGluc3RhbmNlb2YgUHJvY2VzcykgewotCQkJCXJldHVybiAxOwotCQkJfSBlbHNlIGlmIChlMSBpbnN0YW5jZW9mIFBoYXNlKSB7Ci0JCQkJaWYgKCEoZTIgaW5zdGFuY2VvZiBQaGFzZSkpIHsKLQkJCQkJcmV0dXJuIC0xOwotCQkJCX0KLQkJCX0gZWxzZSBpZiAoZTEgaW5zdGFuY2VvZiBJdGVyYXRpb24pIHsKLQkJCQlpZiAoZTIgaW5zdGFuY2VvZiBQaGFzZSkgewotCQkJCQlyZXR1cm4gMTsKLQkJCQl9Ci0JCQkJaWYgKCEoZTIgaW5zdGFuY2VvZiBJdGVyYXRpb24pKSB7Ci0JCQkJCXJldHVybiAtMTsKLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKGUxIGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQlpZiAoZTIgaW5zdGFuY2VvZiBQaGFzZSB8fCBlMiBpbnN0YW5jZW9mIEl0ZXJhdGlvbikgewotCQkJCQlyZXR1cm4gMTsKLQkJCQl9Ci0JCQkJaWYgKCEoZTIgaW5zdGFuY2VvZiBBY3Rpdml0eSkpIHsKLQkJCQkJcmV0dXJuIC0xOwotCQkJCX0KLQkJCX0gZWxzZSBpZiAoZTEgaW5zdGFuY2VvZiBNaWxlc3RvbmUpIHsKLQkJCQlpZiAoZTIgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCQlyZXR1cm4gMTsKLQkJCQl9Ci0JCQkJaWYgKCEoZTIgaW5zdGFuY2VvZiBNaWxlc3RvbmUpKSB7Ci0JCQkJCXJldHVybiAtMTsKLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKGUxIGluc3RhbmNlb2YgUm9sZURlc2NyaXB0b3IpIHsKLQkJCQlpZiAoZTIgaW5zdGFuY2VvZiBBY3Rpdml0eSB8fCBlMiBpbnN0YW5jZW9mIE1pbGVzdG9uZSkgewotCQkJCQlyZXR1cm4gMTsKLQkJCQl9Ci0JCQkJaWYgKCEoZTIgaW5zdGFuY2VvZiBSb2xlRGVzY3JpcHRvcikpIHsKLQkJCQkJcmV0dXJuIC0xOwotCQkJCX0KLQkJCX0gZWxzZSBpZiAoZTEgaW5zdGFuY2VvZiBUYXNrRGVzY3JpcHRvcikgewotCQkJCWlmIChlMiBpbnN0YW5jZW9mIEFjdGl2aXR5IHx8IGUyIGluc3RhbmNlb2YgTWlsZXN0b25lCi0JCQkJCQl8fCBlMiBpbnN0YW5jZW9mIFJvbGVEZXNjcmlwdG9yKSB7Ci0JCQkJCXJldHVybiAxOwotCQkJCX0KLQkJCQlpZiAoIShlMiBpbnN0YW5jZW9mIFRhc2tEZXNjcmlwdG9yKSkgewotCQkJCQlyZXR1cm4gLTE7Ci0JCQkJfQotCQkJfSBlbHNlIGlmIChlMSBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgewotCQkJCWlmIChlMiBpbnN0YW5jZW9mIEFjdGl2aXR5IHx8IGUyIGluc3RhbmNlb2YgTWlsZXN0b25lCi0JCQkJCQl8fCBlMiBpbnN0YW5jZW9mIFJvbGVEZXNjcmlwdG9yCi0JCQkJCQl8fCBlMiBpbnN0YW5jZW9mIFRhc2tEZXNjcmlwdG9yKSB7Ci0JCQkJCXJldHVybiAxOwotCQkJCX0KLQkJCQlpZiAoIShlMiBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0RGVzY3JpcHRvcikpIHsKLQkJCQkJcmV0dXJuIC0xOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXIuY29tcGFyZSh2aWV3ZXIsIGUxLCBlMik7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL3VpL2ludGVybmFsL01ldGhvZFNlYXJjaEhlbHBlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC91aS9pbnRlcm5hbC9NZXRob2RTZWFyY2hIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTY2MjM0OC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL3VpL2ludGVybmFsL01ldGhvZFNlYXJjaEhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5FeHRlbnNpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkuU2VhcmNoVUlQbHVnaW47Ci0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjUKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXRob2RTZWFyY2hIZWxwZXIgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgSU1ldGhvZFNlYXJjaE9wZXJhdGlvbiBuZXdTZWFyY2hPcGVyYXRpb24oKSB7Ci0JCU9iamVjdCBleHQgPSBFeHRlbnNpb25NYW5hZ2VyLmNyZWF0ZUV4dGVuc2lvbihTZWFyY2hVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SWQoKSwgIm9wZXJhdGlvbiIpOyAvLyROT04tTkxTLTEkCi0JCWlmKGV4dCBpbnN0YW5jZW9mIElNZXRob2RTZWFyY2hPcGVyYXRpb24pIHsKLQkJCXJldHVybiAoSU1ldGhvZFNlYXJjaE9wZXJhdGlvbikgZXh0OwotCQl9Ci0JCXJldHVybiBuZXcgTWV0aG9kU2VhcmNoT3BlcmF0aW9uKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC91aS9pbnRlcm5hbC9NZXRob2RTZWFyY2hJbnB1dC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC91aS9pbnRlcm5hbC9NZXRob2RTZWFyY2hJbnB1dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYTA3NmUwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvdWkvaW50ZXJuYWwvTWV0aG9kU2VhcmNoSW5wdXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotLyoqCi0gKiBFbmNhcHN1bGF0ZXMgdGhlIHNlYXJjaCBzdHJpbmdzIGFuZCBvcHRpb25zIHRoYXQgYXJlIHVzZWQgYXMgaW5wdXRzIHRvIGEKLSAqIG1ldGhvZCBzZWFyY2guCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTWV0aG9kU2VhcmNoSW5wdXQgewotCi0JcHJpdmF0ZSBTdHJpbmcgc2VhcmNoU3RyaW5nOwotCi0JcHJpdmF0ZSBTdHJpbmcgbmFtZVBhdHRlcm47Ci0KLQlwcml2YXRlIGJvb2xlYW4gY2FzZVNlbnNpdGl2ZTsKLQotCXByaXZhdGUgYm9vbGVhbiB3aG9sZVdvcmQ7Ci0KLQlwcml2YXRlIGJvb2xlYW4gcmVnRXhwOwotCi0JcHJpdmF0ZSBNZXRob2RTZWFyY2hTY29wZSBzZWFyY2hTY29wZTsKLQotCXByaXZhdGUgTWFwPE9iamVjdCwgT2JqZWN0PiBhZGRpdGlvbmFsSW5wdXQ7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqIAotCSAqIEBwYXJhbSBzZWFyY2hTdHJpbmcKLQkgKiAgICAgICAgICAgIGEgc2VhcmNoIHN0cmluZwotCSAqIEBwYXJhbSBuYW1lUGF0dGVybgotCSAqICAgICAgICAgICAgYSBtZXRob2QgZWxlbWVudCBuYW1lIHBhdHRlcm4KLQkgKiBAcGFyYW0gY2FzZVNlbnNpdGl2ZQotCSAqICAgICAgICAgICAgaWYgPGNvZGU+dHJ1ZTwvY29kZT4sIG1ha2UgdGhlIHNlYXJjaCBjYXNlIHNlbnNpdGl2ZQotCSAqIEBwYXJhbSB3aG9sZVdvcmQKLQkgKiAgICAgICAgICAgIGlmIDxjb2RlPnRydWU8L2NvZGU+LCBzZWFyY2ggZm9yIHdob2xlIHdvcmQgb25seQotCSAqIEBwYXJhbSByZWdFeHAKLQkgKiAgICAgICAgICAgIGlmIDxjb2RlPnRydWU8L2NvZGU+LCBzZWFyY2ggdXNpbmcgcmVndWxhciBleHByZXNzaW9uCi0JICogQHBhcmFtIHNlYXJjaFNjb3BlCi0JICogICAgICAgICAgICBhIHNlYXJjaCBzY29wZQotCSAqLwotCXB1YmxpYyBNZXRob2RTZWFyY2hJbnB1dChTdHJpbmcgc2VhcmNoU3RyaW5nLCBTdHJpbmcgbmFtZVBhdHRlcm4sCi0JCQlib29sZWFuIGNhc2VTZW5zaXRpdmUsIGJvb2xlYW4gd2hvbGVXb3JkLCBib29sZWFuIHJlZ0V4cCwKLQkJCU1ldGhvZFNlYXJjaFNjb3BlIHNlYXJjaFNjb3BlKSB7Ci0JCXRoaXMuc2VhcmNoU3RyaW5nID0gc2VhcmNoU3RyaW5nOwotCQl0aGlzLm5hbWVQYXR0ZXJuID0gbmFtZVBhdHRlcm47Ci0JCXRoaXMuY2FzZVNlbnNpdGl2ZSA9IGNhc2VTZW5zaXRpdmU7Ci0JCXRoaXMud2hvbGVXb3JkID0gd2hvbGVXb3JkOwotCQl0aGlzLnJlZ0V4cCA9IHJlZ0V4cDsKLQkJdGhpcy5zZWFyY2hTY29wZSA9IHNlYXJjaFNjb3BlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNlYXJjaCBzdHJpbmcuCi0JICogCi0JICogQHJldHVybiB0aGUgc2VhcmNoIHN0cmluZyB0byBsb29rIGZvciB0aGUgTWV0aG9kIGVsZW1lbnQgY29udGVudAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U2VhcmNoU3RyaW5nKCkgewotCQlyZXR1cm4gc2VhcmNoU3RyaW5nOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG5hbWUgcGF0dGVybi4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBuYW1lIHBhdHRlcm4gdXNlZCB0byBtYXRjaCB0aGUgTWV0aG9kIGVsZW1lbnQgbmFtZXMKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWVQYXR0ZXJuKCkgewotCQlyZXR1cm4gbmFtZVBhdHRlcm47Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY2FzZSBzZW5zaXRpdml0eSBvZiB0aGUgc2VhcmNoLgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHNlYXJjaCBpcyBjYXNlIHNlbnNpdGl2ZQotCSAqLwotCXB1YmxpYyBib29sZWFuIGdldENhc2VTZW5zaXRpdmUoKSB7Ci0JCXJldHVybiBjYXNlU2Vuc2l0aXZlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHdob2xlIHdvcmQgb3B0aW9uIG9mIHRoZSBzZWFyY2guCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgc2VhcmNoIGlzIGJhc2VkIG9uIHdob2xlIHdvcmQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBnZXRXaG9sZVdvcmQoKSB7Ci0JCXJldHVybiB3aG9sZVdvcmQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVndWxhciBleHByZXNzaW9uIG9wdGlvbiBvZiB0aGUgc2VhcmNoLgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHNlYXJjaCBpcyBiYXNlZCBvbiByZWd1bGFyIGV4cHJlc3Npb24KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBnZXRSZWd1bGFyRXhwcmVzc2lvbigpIHsKLQkJcmV0dXJuIHJlZ0V4cDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzZWFyY2ggc2NvcGUuCi0JICogCi0JICogQHJldHVybiB0aGUgc2VhcmNoIHNjb3BlCi0JICovCi0JcHVibGljIE1ldGhvZFNlYXJjaFNjb3BlIGdldFNlYXJjaFNjb3BlKCkgewotCQlyZXR1cm4gc2VhcmNoU2NvcGU7Ci0JfQotCi0JcHVibGljIE1hcDxPYmplY3QsIE9iamVjdD4gZ2V0QWRkaXRpb25hbElucHV0KCkgewotCQlpZihhZGRpdGlvbmFsSW5wdXQgPT0gbnVsbCkgewotCQkJYWRkaXRpb25hbElucHV0ID0gbmV3IEhhc2hNYXA8T2JqZWN0LCBPYmplY3Q+KCk7Ci0JCX0KLQkJcmV0dXJuIGFkZGl0aW9uYWxJbnB1dDsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL3VpL2ludGVybmFsL01ldGhvZFNlYXJjaE9wZXJhdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC91aS9pbnRlcm5hbC9NZXRob2RTZWFyY2hPcGVyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzkzNmJlOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL3VpL2ludGVybmFsL01ldGhvZFNlYXJjaE9wZXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDg3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24ueG1sLkFic3RyYWN0U0FYUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Nb2RlbFN0cnVjdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLkxpYnJhcnlVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkuU2VhcmNoVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS5TZWFyY2hVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFydGlmYWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaWJhYmxlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpc2NpcGxpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Eb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByYWN0aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc1BhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci1pbXBvcnQgb3JnLnhtbC5zYXguQXR0cmlidXRlczsKLQotLyoqCi0gKiBQZXJmb3JtcyBhIG1ldGhvZCBzZWFyY2ggYnkgaXRlcmF0aW5nIHRoZSBjdXJyZW50IG1ldGhvZCBsaWJyYXJ5IGFuZCBwYXJzaW5nCi0gKiB0aGUgY29udGVudCBlbGVtZW50IFhNSSBmaWxlcyB3aGVyZSBuZWNlc3NhcnkuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIE1ldGhvZFNlYXJjaE9wZXJhdGlvbiBpbXBsZW1lbnRzIElNZXRob2RTZWFyY2hPcGVyYXRpb24gewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNDQU5fTElCUkFSWV9URVhUID0gU2VhcmNoVUlSZXNvdXJjZXMuc2NhbkxpYnJhcnlUYXNrX25hbWU7IAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNDQU5fRUxFTUVOVF9URVhUID0gU2VhcmNoVUlSZXNvdXJjZXMuc2NhbkVsZW1lbnRUYXNrX25hbWU7IAotCi0JcHJpdmF0ZSBib29sZWFuIGRlYnVnOwotCi0JcHJvdGVjdGVkIE1ldGhvZFNlYXJjaElucHV0IHNlYXJjaElucHV0OwotCi0JcHJpdmF0ZSBJU2VhcmNoUmVzdWx0Q29sbGVjdG9yIHJlc3VsdDsKLQotCXByaXZhdGUgU3RyaW5nIHNlYXJjaFN0cmluZzsKLQotCXByaXZhdGUgYm9vbGVhbiBjYXNlU2Vuc2l0aXZlOwotCi0JcHJpdmF0ZSBib29sZWFuIHJlZ0V4cDsKLQotCXByaXZhdGUgUGF0dGVybiBzZWFyY2hTdHJpbmdQYXR0ZXJuOwotCi0JcHJpdmF0ZSBQYXR0ZXJuIGVsZW1lbnROYW1lUGF0dGVybjsKLQotCXByaXZhdGUgTWV0aG9kRWxlbWVudFNjYW5uZXIgZWxlbWVudFNjYW5uZXI7Ci0KLQlwcml2YXRlIExpc3Q8U3RyaW5nPiBwYXJzZWRGaWxlcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCi0JcHJpdmF0ZSBJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzTW9uaXRvcjsKLQotCS8vIFNjYW5zIHRoZSBjb250ZW50IGVsZW1lbnQgWE1JIGZpbGUgYXNzb2NpYXRlZCB3aXRoIGEgTWV0aG9kIGVsZW1lbnQgdG8KLQkvLyBsb29rIGZvciB0aGUgc2VhcmNoIHN0cmluZy4KLQlwcml2YXRlIGNsYXNzIE1ldGhvZEVsZW1lbnRTY2FubmVyIGV4dGVuZHMgQWJzdHJhY3RTQVhQYXJzZXIgewotCi0JCXByaXZhdGUgTWV0aG9kRWxlbWVudCBlbGVtZW50OwotCi0JCS8qKgotCQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCQkgKi8KLQkJcHVibGljIE1ldGhvZEVsZW1lbnRTY2FubmVyKCkgewotCQkJc3VwZXIobnVsbCwgZmFsc2UpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIFBhcnNlcyB0aGUgY29udGVudCBYTUkgZmlsZSBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIE1ldGhvZCBlbGVtZW50LgotCQkgKiAKLQkJICogQHBhcmFtIGVsZW1lbnQKLQkJICogICAgICAgICAgICBhIG1ldGhvZCBlbGVtZW50Ci0JCSAqLwotCQlwdWJsaWMgdm9pZCBwYXJzZShNZXRob2RFbGVtZW50IGVsZW1lbnQpIHsKLQkJCXRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7Ci0JCQlTdHJpbmcgZWxlbWVudENvbnRlbnRQYXRoID0gZ2V0RWxlbWVudFBhdGgoZWxlbWVudCk7Ci0JCQlTdHJpbmcgYnJpZWZEZXNjcmlwdGlvbiA9IGVsZW1lbnQuZ2V0QnJpZWZEZXNjcmlwdGlvbigpOwotCQkJaWYgKHNlYXJjaFN0cmluZ1BhdHRlcm4ubWF0Y2hlcihicmllZkRlc2NyaXB0aW9uKS5maW5kKCkpIHsKLQkJCQlyZXN1bHQuYWNjZXB0KGVsZW1lbnQpOwotCQkJfQotCQkJaWYgKGVsZW1lbnRDb250ZW50UGF0aCAhPSBudWxsCi0JCQkJCSYmICFwYXJzZWRGaWxlcy5jb250YWlucyhlbGVtZW50Q29udGVudFBhdGgpKSB7Ci0JCQkJc3VwZXIucGFyc2UoZWxlbWVudENvbnRlbnRQYXRoKTsKLQkJCQlwYXJzZWRGaWxlcy5hZGQoZWxlbWVudENvbnRlbnRQYXRoKTsKLQkJCX0KLQkJfQotCi0JCS8qKgotCQkgKiBAc2VlIEFic3RyYWN0U0FYUGFyc2VyI3N0YXJ0RWxlbWVudChTdHJpbmcsIFN0cmluZywgU3RyaW5nLAotCQkgKiAgICAgIEF0dHJpYnV0ZXMpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBzdGFydEVsZW1lbnQoU3RyaW5nIG5hbWVzcGFjZVVSTCwgU3RyaW5nIGxvY2FsTmFtZSwKLQkJCQlTdHJpbmcgcW5hbWUsIEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhdHRyaWJ1dGVzLmdldExlbmd0aCgpOyBpKyspIHsKLQkJCQlTdHJpbmcgbmFtZSA9IGF0dHJpYnV0ZXMuZ2V0UU5hbWUoaSk7Ci0JCQkJaWYgKCFuYW1lLmVxdWFscygiYnJpZWZEZXNjcmlwdGlvbiIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJU3RyaW5nIHZhbHVlID0gYXR0cmlidXRlcy5nZXRWYWx1ZShpKTsKLQkJCQkJaWYgKHNlYXJjaFN0cmluZ1BhdHRlcm4ubWF0Y2hlcih2YWx1ZSkuZmluZCgpKSB7Ci0JCQkJCQlyZXN1bHQuYWNjZXB0KGVsZW1lbnQpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJLyoqCi0JCSAqIEBzZWUgQWJzdHJhY3RTQVhQYXJzZXIjZW5kRWxlbWVudChTdHJpbmcsIFN0cmluZywgU3RyaW5nKQotCQkgKi8KLQkJcHVibGljIHZvaWQgZW5kRWxlbWVudChTdHJpbmcgbmFtZXNwYWNlVVJMLCBTdHJpbmcgbG9jYWxOYW1lLAotCQkJCVN0cmluZyBxbmFtZSkgewotCQkJU3RyaW5nIHZhbHVlID0gc3RyQnVmLnRvU3RyaW5nKCk7Ci0JCQlpZiAoc2VhcmNoU3RyaW5nUGF0dGVybi5tYXRjaGVyKHZhbHVlKS5maW5kKCkpIHsKLQkJCQlyZXN1bHQuYWNjZXB0KGVsZW1lbnQpOwotCQkJfQotCQkJc3RyQnVmLnNldExlbmd0aCgwKTsKLQkJfQotCi0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gc2VhcmNoU3RyaW5nCi0JICogICAgICAgICAgICBhIHNlYXJjaCBzdHJpbmcKLQkgKiBAcGFyYW0gbmFtZVBhdHRlcm4KLQkgKiAgICAgICAgICAgIGEgbmFtZSBwYXR0ZXJuCi0JICogQHBhcmFtIHJlc3VsdAotCSAqICAgICAgICAgICAgYSBzZWFyY2ggcmVzdWx0IGNvbGxlY3RvcgotCSAqLwotCXB1YmxpYyBNZXRob2RTZWFyY2hPcGVyYXRpb24oTWV0aG9kU2VhcmNoSW5wdXQgc2VhcmNoSW5wdXQsCi0JCQlJU2VhcmNoUmVzdWx0Q29sbGVjdG9yIHJlc3VsdCkgewotCQlpbml0aWFsaXplKHNlYXJjaElucHV0LCByZXN1bHQpOwotCX0KLQotCXB1YmxpYyBNZXRob2RTZWFyY2hPcGVyYXRpb24oKSB7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemUoTWV0aG9kU2VhcmNoSW5wdXQgc2VhcmNoSW5wdXQsCi0JCQlJU2VhcmNoUmVzdWx0Q29sbGVjdG9yIHJlc3VsdCkgewotCQl0aGlzLnNlYXJjaElucHV0ID0gc2VhcmNoSW5wdXQ7Ci0JCXRoaXMucmVzdWx0ID0gcmVzdWx0OwotCi0JCWNhc2VTZW5zaXRpdmUgPSBzZWFyY2hJbnB1dC5nZXRDYXNlU2Vuc2l0aXZlKCk7Ci0JCXJlZ0V4cCA9IHNlYXJjaElucHV0LmdldFJlZ3VsYXJFeHByZXNzaW9uKCk7Ci0JCWVsZW1lbnROYW1lUGF0dGVybiA9IE1ldGhvZFNlYXJjaFBhdHRlcm4uY3JlYXRlUGF0dGVybihzZWFyY2hJbnB1dAotCQkJCS5nZXROYW1lUGF0dGVybigpLCBmYWxzZSwgZmFsc2UpOwotCi0JCWRlYnVnID0gU2VhcmNoVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmlzRGVidWdnaW5nKCk7Ci0KLQkJc2VhcmNoU3RyaW5nID0gc2VhcmNoSW5wdXQuZ2V0U2VhcmNoU3RyaW5nKCk7Ci0JCWlmIChzZWFyY2hTdHJpbmcgPT0gbnVsbCkKLQkJCXNlYXJjaFN0cmluZyA9ICIiOyAvLyROT04tTkxTLTEkCi0JCWlmIChzZWFyY2hTdHJpbmcubGVuZ3RoKCkgPiAwICYmICFzZWFyY2hTdHJpbmcuZXF1YWxzKCIqIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJZWxlbWVudFNjYW5uZXIgPSBuZXcgTWV0aG9kRWxlbWVudFNjYW5uZXIoKTsKLQkJCXNlYXJjaFN0cmluZ1BhdHRlcm4gPSBNZXRob2RTZWFyY2hQYXR0ZXJuLmNyZWF0ZVBhdHRlcm4oCi0JCQkJCXNlYXJjaFN0cmluZywgY2FzZVNlbnNpdGl2ZSwgcmVnRXhwKTsKLQkJfQotCi0JCWlmIChkZWJ1ZykgewotCQkJU3lzdGVtLm91dAotCQkJCQkucHJpbnRsbigiTWV0aG9kU2VhcmNoT3BlcmF0aW9uIGNvbnN0cnVjdG9yOiBzZWFyY2hTdHJpbmc9IiAvLyROT04tTkxTLTEkCi0JCQkJCQkJKyBzZWFyY2hTdHJpbmcKLQkJCQkJCQkrICIsIGVsZW1lbnROYW1lUGF0dGVybj0iIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkrIHNlYXJjaElucHV0LmdldE5hbWVQYXR0ZXJuKCkKLQkJCQkJCQkrICIsIGNhc2VTZW5zaXRpdmU9IiArIGNhc2VTZW5zaXRpdmUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIENvbGxlY3Rpb248TWV0aG9kUGx1Z2luPiBnZXRTZWFyY2hhYmxlTWV0aG9kUGx1Z2lucygpIHsKLQkJcmV0dXJuIExpYnJhcnlVdGlsLmdldE1ldGhvZFBsdWdpbnMoTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpKTsKLQl9Ci0JCi0JLyoqCi0JICogRXhlY3V0ZXMgdGhlIHNlYXJjaCBvcGVyYXRpb24uCi0JICogCi0JICogQHBhcmFtIHByb2dyZXNzTW9uaXRvcgotCSAqICAgICAgICAgICAgYSBwcm9ncmVzcyBtb25pdG9yCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZShJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzTW9uaXRvcikgewotCQl0aGlzLnByb2dyZXNzTW9uaXRvciA9IHByb2dyZXNzTW9uaXRvcjsKLQkJdGhpcy5wcm9ncmVzc01vbml0b3IuYmVnaW5UYXNrKFNDQU5fTElCUkFSWV9URVhULCA3NTAwKTsKLQotCQkvLyBJdGVyYXRlIHRoZSBNZXRob2QgUGx1Z2luIHRvIGxvb2sgZm9yIGVsZW1lbnRzIHRoYXQgbWF0Y2ggdGhlIG5hbWUKLQkJLy8gcGF0dGVybi4KLQkJQ29sbGVjdGlvbjxNZXRob2RQbHVnaW4+IG1ldGhvZFBsdWdpbnMgPSBnZXRTZWFyY2hhYmxlTWV0aG9kUGx1Z2lucygpOwotCQlmb3IgKEl0ZXJhdG9yPE1ldGhvZFBsdWdpbj4gaSA9IG1ldGhvZFBsdWdpbnMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCkKLQkJCQkmJiAhcHJvZ3Jlc3NNb25pdG9yLmlzQ2FuY2VsZWQoKTspIHsKLQkJCU1ldGhvZFBsdWdpbiBtZXRob2RQbHVnaW4gPSAoTWV0aG9kUGx1Z2luKSBpLm5leHQoKTsKLQkJCW1hdGNoUGF0dGVybihtZXRob2RQbHVnaW4pOwotCi0JCQlNZXRob2RQYWNrYWdlIG1ldGhvZFBhY2thZ2U7Ci0JCQlpZiAoc2VhcmNoSW5wdXQuZ2V0U2VhcmNoU2NvcGUoKS5pbmNsdWRlQ29yZUNvbnRlbnQoKSkgewotCQkJCW1ldGhvZFBhY2thZ2UgPSBVbWFVdGlsLmZpbmRNZXRob2RQYWNrYWdlKG1ldGhvZFBsdWdpbiwKLQkJCQkJCU1vZGVsU3RydWN0dXJlLkRFRkFVTFQuY29yZUNvbnRlbnRQYXRoKTsKLQkJCQlzZWFyY2hNZXRob2RQYWNrYWdlcyhtZXRob2RQYWNrYWdlKTsKLQkJCX0KLQotCQkJaWYgKHNlYXJjaElucHV0LmdldFNlYXJjaFNjb3BlKCkuaW5jbHVkZSgKLQkJCQkJTWV0aG9kU2VhcmNoU2NvcGUuU1RBTkRBUkRfQ0FURUdPUlkpKSB7Ci0JCQkJbWV0aG9kUGFja2FnZSA9IFVtYVV0aWwuZmluZE1ldGhvZFBhY2thZ2UobWV0aG9kUGx1Z2luLAotCQkJCQkJTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC5kaXNjaXBsaW5lRGVmaW5pdGlvblBhdGgpOwotCQkJCXNlYXJjaE1ldGhvZFBhY2thZ2VzKG1ldGhvZFBhY2thZ2UpOwotCQkJCW1ldGhvZFBhY2thZ2UgPSBVbWFVdGlsLmZpbmRNZXRob2RQYWNrYWdlKG1ldGhvZFBsdWdpbiwKLQkJCQkJCU1vZGVsU3RydWN0dXJlLkRFRkFVTFQuZG9tYWluUGF0aCk7Ci0JCQkJc2VhcmNoTWV0aG9kUGFja2FnZXMobWV0aG9kUGFja2FnZSk7Ci0JCQkJbWV0aG9kUGFja2FnZSA9IFVtYVV0aWwuZmluZE1ldGhvZFBhY2thZ2UobWV0aG9kUGx1Z2luLAotCQkJCQkJTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC53b3JrUHJvZHVjdFR5cGVQYXRoKTsKLQkJCQlzZWFyY2hNZXRob2RQYWNrYWdlcyhtZXRob2RQYWNrYWdlKTsKLQkJCQltZXRob2RQYWNrYWdlID0gVW1hVXRpbC5maW5kTWV0aG9kUGFja2FnZShtZXRob2RQbHVnaW4sCi0JCQkJCQlNb2RlbFN0cnVjdHVyZS5ERUZBVUxULnJvbGVTZXRQYXRoKTsKLQkJCQlzZWFyY2hNZXRob2RQYWNrYWdlcyhtZXRob2RQYWNrYWdlKTsKLQkJCQltZXRob2RQYWNrYWdlID0gVW1hVXRpbC5maW5kTWV0aG9kUGFja2FnZShtZXRob2RQbHVnaW4sCi0JCQkJCQlNb2RlbFN0cnVjdHVyZS5ERUZBVUxULnRvb2xQYXRoKTsKLQkJCQlzZWFyY2hNZXRob2RQYWNrYWdlcyhtZXRob2RQYWNrYWdlKTsKLQkJCX0KLQotCQkJaWYgKHNlYXJjaElucHV0LmdldFNlYXJjaFNjb3BlKCkuaW5jbHVkZSgKLQkJCQkJTWV0aG9kU2VhcmNoU2NvcGUuQ1VTVE9NX0NBVEVHT1JZKSkgewotCQkJCW1ldGhvZFBhY2thZ2UgPSBVbWFVdGlsLmZpbmRNZXRob2RQYWNrYWdlKG1ldGhvZFBsdWdpbiwKLQkJCQkJCU1vZGVsU3RydWN0dXJlLkRFRkFVTFQuY3VzdG9tQ2F0ZWdvcnlQYXRoKTsKLQkJCQlzZWFyY2hNZXRob2RQYWNrYWdlcyhtZXRob2RQYWNrYWdlKTsKLQkJCX0KLQotCQkJaWYgKHNlYXJjaElucHV0LmdldFNlYXJjaFNjb3BlKCkuaW5jbHVkZSgKLQkJCQkJTWV0aG9kU2VhcmNoU2NvcGUuQ0FQQUJJTElUWV9QQVRURVJOKSkgewotCQkJCW1ldGhvZFBhY2thZ2UgPSBVbWFVdGlsLmZpbmRNZXRob2RQYWNrYWdlKG1ldGhvZFBsdWdpbiwKLQkJCQkJCU1vZGVsU3RydWN0dXJlLkRFRkFVTFQuY2FwYWJpbGl0eVBhdHRlcm5QYXRoKTsKLQkJCQlzZWFyY2hNZXRob2RQYWNrYWdlcyhtZXRob2RQYWNrYWdlKTsKLQkJCX0KLQotCQkJaWYgKHNlYXJjaElucHV0LmdldFNlYXJjaFNjb3BlKCkuaW5jbHVkZSgKLQkJCQkJTWV0aG9kU2VhcmNoU2NvcGUuREVMSVZFUllfUFJPQ0VTUykpIHsKLQkJCQltZXRob2RQYWNrYWdlID0gVW1hVXRpbC5maW5kTWV0aG9kUGFja2FnZShtZXRob2RQbHVnaW4sCi0JCQkJCQlNb2RlbFN0cnVjdHVyZS5ERUZBVUxULmRlbGl2ZXJ5UHJvY2Vzc1BhdGgpOwotCQkJCXNlYXJjaE1ldGhvZFBhY2thZ2VzKG1ldGhvZFBhY2thZ2UpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogU2VhcmNoZXMgYSBNZXRob2QgUGFja2FnZS4KLQkgKiAKLQkgKiBAcGFyYW0gbWV0aG9kUGFja2FnZQotCSAqICAgICAgICAgICAgYSBtZXRob2QgcGFja2FnZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNlYXJjaE1ldGhvZFBhY2thZ2VzKE1ldGhvZFBhY2thZ2UgbWV0aG9kUGFja2FnZSkgewotCQlpZiAobWV0aG9kUGFja2FnZSA9PSBudWxsCi0JCQkJfHwgbWV0aG9kUGFja2FnZS5nZXROYW1lKCkuZXF1YWxzKAotCQkJCQkJTW9kZWxTdHJ1Y3R1cmUuSElEREVOX1BBQ0tBR0VfTkFNRSkpIHsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAobWV0aG9kUGFja2FnZSBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpIHsKLQkJCS8vIEFkZCB0aGUgYXNzb2NpYXRlZCBDYXBhYmlsaXR5UGF0dGVybiBvciBEZWxpdmVyeVByb2Nlc3MgdG8gdGhlCi0JCQkvLyBzZWFyY2ggcmVzdWx0LgotCQkJUHJvY2Vzc0NvbXBvbmVudCBwcm9jZXNzQ29tcG9uZW50ID0gKFByb2Nlc3NDb21wb25lbnQpIG1ldGhvZFBhY2thZ2U7Ci0JCQltYXRjaFBhdHRlcm4ocHJvY2Vzc0NvbXBvbmVudC5nZXRQcm9jZXNzKCkpOwotCQl9IGVsc2UgaWYgKCFpc0ludGVybmFsUHJvY2Vzc1BhY2thZ2UobWV0aG9kUGFja2FnZSkpIHsKLQkJCW1hdGNoUGF0dGVybihtZXRob2RQYWNrYWdlKTsKLQkJfQotCi0JCUxpc3QgY2hpbGRQYWNrYWdlcyA9IG1ldGhvZFBhY2thZ2UuZ2V0Q2hpbGRQYWNrYWdlcygpOwotCQlmb3IgKEl0ZXJhdG9yIGkgPSBjaGlsZFBhY2thZ2VzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpCi0JCQkJJiYgIXByb2dyZXNzTW9uaXRvci5pc0NhbmNlbGVkKCk7KSB7Ci0JCQlzZWFyY2hNZXRob2RQYWNrYWdlcygoTWV0aG9kUGFja2FnZSkgaS5uZXh0KCkpOwotCQl9Ci0JCWlmIChtZXRob2RQYWNrYWdlIGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UpIHsKLQkJCUNvbnRlbnRQYWNrYWdlIGNvbnRlbnRQYWNrYWdlID0gKENvbnRlbnRQYWNrYWdlKSBtZXRob2RQYWNrYWdlOwotCQkJTGlzdCBjb250ZW50RWxlbWVudHMgPSBjb250ZW50UGFja2FnZS5nZXRDb250ZW50RWxlbWVudHMoKTsKLQkJCWZvciAoSXRlcmF0b3IgaiA9IGNvbnRlbnRFbGVtZW50cy5pdGVyYXRvcigpOyBqLmhhc05leHQoKQotCQkJCQkmJiAhcHJvZ3Jlc3NNb25pdG9yLmlzQ2FuY2VsZWQoKTspIHsKLQkJCQlDb250ZW50RWxlbWVudCBjb250ZW50RWxlbWVudCA9IChDb250ZW50RWxlbWVudCkgai5uZXh0KCk7Ci0JCQkJbWF0Y2hQYXR0ZXJuKGNvbnRlbnRFbGVtZW50KTsKLQkJCQlpZiAoY29udGVudEVsZW1lbnQgaW5zdGFuY2VvZiBBcnRpZmFjdCkgewotCQkJCQlzZWFyY2hDb250YWluZWRBcnRpZmFjdHMoKEFydGlmYWN0KSBjb250ZW50RWxlbWVudCk7Ci0JCQkJfSBlbHNlIGlmIChjb250ZW50RWxlbWVudCBpbnN0YW5jZW9mIERpc2NpcGxpbmUpIHsKLQkJCQkJc2VhcmNoU3ViRGlzY2lwbGluZXMoKERpc2NpcGxpbmUpIGNvbnRlbnRFbGVtZW50KTsKLQkJCQl9IGVsc2UgaWYgKGNvbnRlbnRFbGVtZW50IGluc3RhbmNlb2YgUHJhY3RpY2UpIHsKLQkJCQkJc2VhcmNoU3ViUHJhY3RpY2VzKChQcmFjdGljZSkgY29udGVudEVsZW1lbnQpOwotCQkJCX0gZWxzZSBpZiAoY29udGVudEVsZW1lbnQgaW5zdGFuY2VvZiBEb21haW4pIHsKLQkJCQkJc2VhcmNoU3ViRG9tYWlucygoRG9tYWluKSBjb250ZW50RWxlbWVudCk7Ci0JCQkJfQotCQkJfQotCQl9IGVsc2UgaWYgKG1ldGhvZFBhY2thZ2UgaW5zdGFuY2VvZiBQcm9jZXNzUGFja2FnZSkgewotCQkJUHJvY2Vzc1BhY2thZ2UgcHJvY2Vzc1BhY2thZ2UgPSAoUHJvY2Vzc1BhY2thZ2UpIG1ldGhvZFBhY2thZ2U7Ci0JCQlMaXN0IHByb2Nlc3NFbGVtZW50cyA9IHByb2Nlc3NQYWNrYWdlLmdldFByb2Nlc3NFbGVtZW50cygpOwotCQkJZm9yIChJdGVyYXRvciBqID0gcHJvY2Vzc0VsZW1lbnRzLml0ZXJhdG9yKCk7IGouaGFzTmV4dCgpCi0JCQkJCSYmICFwcm9ncmVzc01vbml0b3IuaXNDYW5jZWxlZCgpOykgewotCQkJCVByb2Nlc3NFbGVtZW50IHByb2Nlc3NFbGVtZW50ID0gKFByb2Nlc3NFbGVtZW50KSBqLm5leHQoKTsKLS8vCQkJCWlmICghKHByb2Nlc3NFbGVtZW50IGluc3RhbmNlb2YgQWN0aXZpdHkpKSB7Ci0JCQkJCW1hdGNoUGF0dGVybihwcm9jZXNzRWxlbWVudCk7Ci0vLwkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBnaXZlbiBwYWNrYWdlIGlzIGFuIGludGVybmFsIFByb2Nlc3MKLQkgKiBQYWNrYWdlLgotCSAqIAotCSAqIEBwYXJhbSBtZXRob2RQYWNrYWdlCi0JICogICAgICAgICAgICBhIG1ldGhvZCBvciBwcm9jZXNzIHBhY2thZ2UKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBnaXZlbiBwYWNrYWdlIGlzIGFuIGludGVybmFsIHByb2Nlc3MKLQkgKiAgICAgICAgIHBhY2thZ2UKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0ludGVybmFsUHJvY2Vzc1BhY2thZ2UoTWV0aG9kUGFja2FnZSBtZXRob2RQYWNrYWdlKSB7Ci0JCWlmIChtZXRob2RQYWNrYWdlIGluc3RhbmNlb2YgUHJvY2Vzc1BhY2thZ2UpIHsKLQkJCWlmIChVbWFVdGlsLmdldFByb2Nlc3NDb21wb25lbnQobWV0aG9kUGFja2FnZSkgIT0gbnVsbCkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBTZWFyY2hlcyB0aGUgY29udGFpbmVkIGFydGlmYWN0cyBvZiBhbiBhcnRpZmFjdC4KLQkgKiAKLQkgKiBAcGFyYW0gYXJ0aWZhY3QKLQkgKiAgICAgICAgICAgIGFuIGFydGlmYWN0Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2VhcmNoQ29udGFpbmVkQXJ0aWZhY3RzKEFydGlmYWN0IGFydGlmYWN0KSB7Ci0JCWlmIChhcnRpZmFjdCAhPSBudWxsKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGkgPSBhcnRpZmFjdC5nZXRDb250YWluZWRBcnRpZmFjdHMoKS5pdGVyYXRvcigpOyBpCi0JCQkJCS5oYXNOZXh0KCkKLQkJCQkJJiYgIXByb2dyZXNzTW9uaXRvci5pc0NhbmNlbGVkKCk7KSB7Ci0JCQkJQXJ0aWZhY3QgY29udGFpbmVkQXJ0aWZhY3QgPSAoQXJ0aWZhY3QpIGkubmV4dCgpOwotCQkJCW1hdGNoUGF0dGVybihjb250YWluZWRBcnRpZmFjdCk7Ci0JCQkJc2VhcmNoQ29udGFpbmVkQXJ0aWZhY3RzKGNvbnRhaW5lZEFydGlmYWN0KTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFNlYXJjaGVzIHRoZSBzdWIgZGlzY2lwbGluZXMgb2YgYSBkaXNjaXBsaW5lLgotCSAqIAotCSAqIEBwYXJhbSBkaXNjaXBsaW5lCi0JICogICAgICAgICAgICBhIGRpc2NpcGxpbmUKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZWFyY2hTdWJEaXNjaXBsaW5lcyhEaXNjaXBsaW5lIGRpc2NpcGxpbmUpIHsKLQkJaWYgKGRpc2NpcGxpbmUgIT0gbnVsbCkgewotCQkJZm9yIChJdGVyYXRvciBpID0gZGlzY2lwbGluZS5nZXRTdWJkaXNjaXBsaW5lKCkuaXRlcmF0b3IoKTsgaQotCQkJCQkuaGFzTmV4dCgpCi0JCQkJCSYmICFwcm9ncmVzc01vbml0b3IuaXNDYW5jZWxlZCgpOykgewotCQkJCURpc2NpcGxpbmUgc3ViRGlzY2lwbGluZSA9IChEaXNjaXBsaW5lKSBpLm5leHQoKTsKLQkJCQltYXRjaFBhdHRlcm4oc3ViRGlzY2lwbGluZSk7Ci0JCQkJc2VhcmNoU3ViRGlzY2lwbGluZXMoc3ViRGlzY2lwbGluZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTZWFyY2hlcyB0aGUgc3ViIHByYWN0aWNlcyBvZiBhIHByYWN0aWNlLgotCSAqIAotCSAqIEBwYXJhbSBwcmFjdGljZQotCSAqICAgICAgICAgICAgYSBwcmFjdGljZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNlYXJjaFN1YlByYWN0aWNlcyhQcmFjdGljZSBwcmFjdGljZSkgewotCQlpZiAocHJhY3RpY2UgIT0gbnVsbCkgewotCQkJZm9yIChJdGVyYXRvciBpID0gcHJhY3RpY2UuZ2V0U3ViUHJhY3RpY2VzKCkuaXRlcmF0b3IoKTsgaQotCQkJCQkuaGFzTmV4dCgpCi0JCQkJCSYmICFwcm9ncmVzc01vbml0b3IuaXNDYW5jZWxlZCgpOykgewotCQkJCVByYWN0aWNlIHN1YlByYWN0aWNlID0gKFByYWN0aWNlKSBpLm5leHQoKTsKLQkJCQltYXRjaFBhdHRlcm4oc3ViUHJhY3RpY2UpOwotCQkJCXNlYXJjaFN1YlByYWN0aWNlcyhzdWJQcmFjdGljZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTZWFyY2hlcyB0aGUgc3ViIGRvbWFpbnMgb2YgYSBkb21haW4uCi0JICogCi0JICogQHBhcmFtIGRvbWFpbgotCSAqICAgICAgICAgICAgYSBkb21haW4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZWFyY2hTdWJEb21haW5zKERvbWFpbiBkb21haW4pIHsKLQkJaWYgKGRvbWFpbiAhPSBudWxsKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGkgPSBkb21haW4uZ2V0U3ViZG9tYWlucygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpCi0JCQkJCSYmICFwcm9ncmVzc01vbml0b3IuaXNDYW5jZWxlZCgpOykgewotCQkJCURvbWFpbiBzdWJEb21haW4gPSAoRG9tYWluKSBpLm5leHQoKTsKLQkJCQltYXRjaFBhdHRlcm4oc3ViRG9tYWluKTsKLQkJCQlzZWFyY2hTdWJEb21haW5zKHN1YkRvbWFpbik7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBZGRzIHRoZSBnaXZlbiBtZXRob2QgZWxlbWVudCB0byB0aGUgc2VhcmNoIHJlc3VsdCBjb2xsZWN0aW9uIGlmIGl0cyBuYW1lCi0JICogb3IgcHJlc2VudGF0aW9uIG5hbWUgbWF0Y2hlcyB0aGUgbmFtZSBwYXR0ZXJuLgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogICAgICAgICAgICBhIG1ldGhvZCBlbGVtZW50Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgbWF0Y2hQYXR0ZXJuKE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgewotCQl0cnkgewotCQkJaWYgKHNlYXJjaElucHV0LmdldFNlYXJjaFNjb3BlKCkuaW5jbHVkZShlbGVtZW50KSkgewotCQkJCVN0cmluZyBuYW1lID0gZWxlbWVudC5nZXROYW1lKCk7Ci0JCQkJU3RyaW5nIHRhc2tOYW1lID0gTWVzc2FnZUZvcm1hdC5mb3JtYXQoU0NBTl9FTEVNRU5UX1RFWFQsCi0JCQkJCQluZXcgT2JqZWN0W10geyBuYW1lIH0pOwotCQkJCXByb2dyZXNzTW9uaXRvci5zZXRUYXNrTmFtZSh0YXNrTmFtZSk7Ci0JCQkJYm9vbGVhbiBmb3VuZE1hdGNoID0gZmFsc2U7Ci0JCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBEZXNjcmliYWJsZUVsZW1lbnQpIHsKLQkJCQkJU3RyaW5nIHByZXNlbnRhdGlvbk5hbWUgPSAoKERlc2NyaWJhYmxlRWxlbWVudCkgZWxlbWVudCkKLQkJCQkJCQkuZ2V0UHJlc2VudGF0aW9uTmFtZSgpOwotCQkJCQlmb3VuZE1hdGNoID0gKG5hbWUgIT0gbnVsbCAmJiBlbGVtZW50TmFtZVBhdHRlcm4ubWF0Y2hlcigKLQkJCQkJCQluYW1lKS5tYXRjaGVzKCkpCi0JCQkJCQkJfHwgKHByZXNlbnRhdGlvbk5hbWUgIT0gbnVsbCAmJiBlbGVtZW50TmFtZVBhdHRlcm4KLQkJCQkJCQkJCS5tYXRjaGVyKHByZXNlbnRhdGlvbk5hbWUpLm1hdGNoZXMoKSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJZm91bmRNYXRjaCA9IChuYW1lICE9IG51bGwgJiYgZWxlbWVudE5hbWVQYXR0ZXJuLm1hdGNoZXIoCi0JCQkJCQkJbmFtZSkubWF0Y2hlcygpKTsKLQkJCQl9Ci0JCQkJaWYgKGZvdW5kTWF0Y2gpIHsKLQkJCQkJaWYgKHNlYXJjaFN0cmluZy5sZW5ndGgoKSA9PSAwIHx8IHNlYXJjaFN0cmluZy5lcXVhbHMoIioiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCQlyZXN1bHQuYWNjZXB0KGVsZW1lbnQpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJdHJ5IHsKLQkJCQkJCQllbGVtZW50U2Nhbm5lci5wYXJzZShlbGVtZW50KTsKLQkJCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQlwcm9ncmVzc01vbml0b3Iud29ya2VkKDEpOwotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJU2VhcmNoVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcGF0aCBvZiB0aGUgY29udGVudCBYTUwgZmlsZSBhc3NvY2lhdGVkIHdpdGggYSBtZXRob2QKLQkgKiBlbGVtZW50LgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RWxlbWVudFBhdGgoTWV0aG9kRWxlbWVudCBlbGVtZW50KSB7Ci0JCVJlc291cmNlIHJlc291cmNlID0gbnVsbDsKLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBEZXNjcmliYWJsZUVsZW1lbnQpIHsKLQkJCURlc2NyaWJhYmxlRWxlbWVudCBkZXNjcmliYWJsZUVsZW1lbnQgPSAoRGVzY3JpYmFibGVFbGVtZW50KSBlbGVtZW50OwotCQkJQ29udGVudERlc2NyaXB0aW9uIGNvbnRlbnREZXNjcmlwdGlvbiA9IGRlc2NyaWJhYmxlRWxlbWVudAotCQkJCQkuZ2V0UHJlc2VudGF0aW9uKCk7Ci0JCQlpZiAoY29udGVudERlc2NyaXB0aW9uID09IG51bGwpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJCXJlc291cmNlID0gY29udGVudERlc2NyaXB0aW9uLmVSZXNvdXJjZSgpOwotCQl9IGVsc2UgewotCQkJcmVzb3VyY2UgPSBlbGVtZW50LmVSZXNvdXJjZSgpOwotCQl9Ci0JCWlmIChyZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQlVUkkgcmVzb3VyY2VVUkkgPSByZXNvdXJjZS5nZXRVUkkoKTsKLQkJCWlmIChyZXNvdXJjZVVSSSAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIHJlc291cmNlVVJJLnRvRmlsZVN0cmluZygpOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoTWV0aG9kU2VhcmNoSW5wdXQgc2VhcmNoSW5wdXQsCi0JCQlJU2VhcmNoUmVzdWx0Q29sbGVjdG9yIHJlc3VsdCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCWluaXRpYWxpemUoc2VhcmNoSW5wdXQsIHJlc3VsdCk7Ci0JCWV4ZWN1dGUobW9uaXRvcik7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC91aS9pbnRlcm5hbC9NZXRob2RTZWFyY2hQYXR0ZXJuLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL3VpL2ludGVybmFsL01ldGhvZFNlYXJjaFBhdHRlcm4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDk3NjExMS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL3VpL2ludGVybmFsL01ldGhvZFNlYXJjaFBhdHRlcm4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyOSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47Ci1pbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm5TeW50YXhFeGNlcHRpb247Ci0KLS8qKgotICogUGF0dGVybiBjb250cnVjdG9yIGZvciBhIG1ldGhvZCBzZWFyY2guCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTWV0aG9kU2VhcmNoUGF0dGVybiB7Ci0KLQkvKioKLQkgKiBQcml2YXRlIGNvbnN0cnVjdG9yIHRvIHByZXZlbnQgdGhpcyBjbGFzcyBmcm9tIGJlaW5nIGluc3RhbnRpYXRlZC4gQWxsCi0JICogbWV0aG9kcyBpbiB0aGlzIGNsYXNzIHNob3VsZCBiZSBzdGF0aWMuCi0JICovCi0JcHJpdmF0ZSBNZXRob2RTZWFyY2hQYXR0ZXJuKCkgewotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYQotCSAqIDxjb2RlPlBhdHRlcm48Y29kZT4gb2JqZWN0IGZyb20gdGhlIHBhdHRlcm4gc3RyaW5nIHVzZWQgaW4gTWV0aG9kIFNlYXJjaC4KLQkgKiAKLQkgKiBAcGFyYW0gcGF0dGVybgotCSAqICAgICAgICAgICAgYSBzZWFyY2ggcGF0dGVybiBzdHJpbmcKLQkgKiBAcGFyYW0gaXNDYXNlU2Vuc2l0aXZlCi0JICogICAgICAgICAgICBpZiA8Y29kZT50cnVlPC9jb2RlPiwgY3JlYXRlIGEgY2FzZSBpbnNlbnNpdHZlIHBhdHRlcm4KLQkgKiBAcGFyYW0gaXNSZWdleFNlYXJjaAotCSAqICAgICAgICAgICAgaWYgPGNvZGU+dHJ1ZTwvY29kZT4sIHRyZWF0IHRoZSBwYXR0ZXJuIGFzIGEgcmVndWxhciBleHByZXNzaW9uIHBhdHRlcm4KLQkgKiBAcmV0dXJuIGEgbmV3IDxjb2RlPlBhdHRlcm48Y29kZT4gb2JqZWN0Ci0JICogQHRocm93cyA8Y29kZT5QYXR0ZXJuU3ludGF4RXhjZXB0aW9uPC9jb2RlPiBpZiB0aGUgc3BlY2lmaWVkIHBhdHRlcm4gaGFzIGEgc3ludGF4IGVycm9yCi0JICovCi0JcHVibGljIHN0YXRpYyBQYXR0ZXJuIGNyZWF0ZVBhdHRlcm4oU3RyaW5nIHBhdHRlcm4sCi0JCQlib29sZWFuIGlzQ2FzZVNlbnNpdGl2ZSwgYm9vbGVhbiBpc1JlZ2V4U2VhcmNoKQotCQkJdGhyb3dzIFBhdHRlcm5TeW50YXhFeGNlcHRpb24gewotCQlpZiAoIWlzUmVnZXhTZWFyY2gpIHsKLQkJCXBhdHRlcm4gPSB0b1JlZ2V4UGF0dGVybihwYXR0ZXJuKTsKLQkJfQotCi0JCWlmICghaXNDYXNlU2Vuc2l0aXZlKSB7Ci0JCQlyZXR1cm4gUGF0dGVybi5jb21waWxlKHBhdHRlcm4sIFBhdHRlcm4uQ0FTRV9JTlNFTlNJVElWRQotCQkJCQl8IFBhdHRlcm4uVU5JQ09ERV9DQVNFIHwgUGF0dGVybi5NVUxUSUxJTkUpOwotCQl9Ci0KLQkJcmV0dXJuIFBhdHRlcm4uY29tcGlsZShwYXR0ZXJuLCBQYXR0ZXJuLk1VTFRJTElORSk7Ci0JfQotCi0JLyoqCi0JICogQ29udmVydHMgYSBwYXR0ZXJuIHN0cmluZyB3aXRoICcqJyBhbmQgJz8nIGludG8gYSByZWd1bGFyIGV4cHJlc3Npb24KLQkgKiBwYXR0ZXJuIHN0cmluZy4KLQkgKiAKLQkgKiBAcGFyYW0gcGF0dGVybgotCSAqICAgICAgICAgICAgYSBwYXR0ZXJuIHN0cmluZwotCSAqIEByZXR1cm4gYSByZWd1bGFyIGV4cHJlc3Npb24gcGF0dGVybiBzdHJpbmcKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgdG9SZWdleFBhdHRlcm4oU3RyaW5nIHBhdHRlcm4pIHsKLQkJaW50IHBhdHRlcm5MZW5ndGggPSBwYXR0ZXJuLmxlbmd0aCgpOwotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihwYXR0ZXJuTGVuZ3RoKTsKLQotCQlib29sZWFuIGVzY2FwZWQgPSBmYWxzZTsKLQkJYm9vbGVhbiBxdW90aW5nID0gZmFsc2U7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXR0ZXJuTGVuZ3RoOyBpKyspIHsKLQkJCWNoYXIgY2ggPSBwYXR0ZXJuLmNoYXJBdChpKTsKLQkJCXN3aXRjaCAoY2gpIHsKLQkJCWNhc2UgJyonOgotCQkJCWlmICghZXNjYXBlZCkgewotCQkJCQlpZiAocXVvdGluZykgewotCQkJCQkJcmVzdWx0LmFwcGVuZCgiXFxFIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCXF1b3RpbmcgPSBmYWxzZTsKLQkJCQkJfQotCQkJCX0KLQkJCQlyZXN1bHQuYXBwZW5kKCIuKiIpOyAvLyROT04tTkxTLTEkCi0JCQkJZXNjYXBlZCA9IGZhbHNlOwotCQkJCWJyZWFrOwotCQkJY2FzZSAnPyc6Ci0JCQkJaWYgKCFlc2NhcGVkKSB7Ci0JCQkJCWlmIChxdW90aW5nKSB7Ci0JCQkJCQlyZXN1bHQuYXBwZW5kKCJcXEUiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJcXVvdGluZyA9IGZhbHNlOwotCQkJCQl9Ci0JCQkJfQotCQkJCXJlc3VsdC5hcHBlbmQoIi4iKTsgLy8kTk9OLU5MUy0xJAotCQkJCWVzY2FwZWQgPSBmYWxzZTsKLQkJCQlicmVhazsKLQkJCWNhc2UgJ1xcJzoKLQkJCQlpZiAoIWVzY2FwZWQpIHsKLQkJCQkJZXNjYXBlZCA9IHRydWU7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJZXNjYXBlZCA9IGZhbHNlOwotCQkJCQlpZiAocXVvdGluZykgewotCQkJCQkJcmVzdWx0LmFwcGVuZCgiXFxFIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCXF1b3RpbmcgPSBmYWxzZTsKLQkJCQkJfQotCQkJCQlyZXN1bHQuYXBwZW5kKCJcXFxcIik7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0OgotCQkJCWlmICghcXVvdGluZykgewotCQkJCQlyZXN1bHQuYXBwZW5kKCJcXFEiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlxdW90aW5nID0gdHJ1ZTsKLQkJCQl9Ci0JCQkJaWYgKGVzY2FwZWQgJiYgY2ggIT0gJyonICYmIGNoICE9ICc/JyAmJiBjaCAhPSAnXFwnKSB7Ci0JCQkJCXJlc3VsdC5hcHBlbmQoJ1xcJyk7Ci0JCQkJfQotCQkJCXJlc3VsdC5hcHBlbmQoY2gpOwotCQkJCWVzY2FwZWQgPSAoY2ggPT0gJ1xcJyk7Ci0JCQl9Ci0JCX0KLQotCQlpZiAocXVvdGluZykgewotCQkJcmVzdWx0LmFwcGVuZCgiXFxFIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvdWkvaW50ZXJuYWwvTWV0aG9kU2VhcmNoUXVlcnkuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvdWkvaW50ZXJuYWwvTWV0aG9kU2VhcmNoUXVlcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWNhOWFkZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL3VpL2ludGVybmFsL01ldGhvZFNlYXJjaFF1ZXJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS5TZWFyY2hVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc2VhcmNoLnVpLklTZWFyY2hRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zZWFyY2gudWkuSVNlYXJjaFJlc3VsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zZWFyY2gudWkudGV4dC5NYXRjaDsKLQotLyoqCi0gKiBFbmNhcHN1bGF0ZXMgdGhlIHNlYXJjaCBzdHJpbmdzIGFuZCBvcHRpb25zIGZvciBhIG1ldGhvZCBzZWFyY2guCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTWV0aG9kU2VhcmNoUXVlcnkgaW1wbGVtZW50cyBJU2VhcmNoUXVlcnkgewotCi0JcHJpdmF0ZSBNZXRob2RTZWFyY2hJbnB1dCBzZWFyY2hJbnB1dDsKLQotCXByaXZhdGUgTWV0aG9kU2VhcmNoUmVzdWx0IHNlYXJjaFJlc3VsdDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICogCi0JICogQHBhcmFtIHNlYXJjaFN0cmluZwotCSAqICAgICAgICAgICAgYSBzZWFyY2ggc3RyaW5nCi0JICogQHBhcmFtIG5hbWVQYXR0ZXJuCi0JICogICAgICAgICAgICBhIG1ldGhvZCBlbGVtZW50IG5hbWUgcGF0dGVybgotCSAqLwotCXB1YmxpYyBNZXRob2RTZWFyY2hRdWVyeShNZXRob2RTZWFyY2hJbnB1dCBzZWFyY2hJbnB1dCkgewotCQl0aGlzLnNlYXJjaElucHV0ID0gc2VhcmNoSW5wdXQ7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5zZWFyY2gudWkuSVNlYXJjaFF1ZXJ5I3J1bihJUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCXB1YmxpYyBJU3RhdHVzIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIHByb2Nlc3NNb25pdG9yKSB7Ci0JCWZpbmFsIE1ldGhvZFNlYXJjaFJlc3VsdCBzZWFyY2hSZXN1bHQgPSAoTWV0aG9kU2VhcmNoUmVzdWx0KSBnZXRTZWFyY2hSZXN1bHQoKTsKLQkJc2VhcmNoUmVzdWx0LnJlbW92ZUFsbCgpOwotCQlJU2VhcmNoUmVzdWx0Q29sbGVjdG9yIHJlc3VsdCA9IG5ldyBJU2VhcmNoUmVzdWx0Q29sbGVjdG9yKCkgewotCQkJcHVibGljIHZvaWQgYWNjZXB0KE9iamVjdCBtYXRjaCkgewotCQkJCWlmIChtYXRjaCBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQKLQkJCQkJCSYmICFUbmdVdGlsLmlzUHJlZGVmaW5lZCgoTWV0aG9kRWxlbWVudCkgbWF0Y2gpKSB7Ci0JCQkJCU9iamVjdFtdIG1hdGNoZXMgPSBzZWFyY2hSZXN1bHQuZ2V0TWF0Y2hlcyhtYXRjaCk7Ci0JCQkJCWlmIChtYXRjaGVzID09IG51bGwgfHwgbWF0Y2hlcy5sZW5ndGggPT0gMCkgewotCQkJCQkJc2VhcmNoUmVzdWx0LmFkZE1hdGNoKG5ldyBNYXRjaChtYXRjaCwgTWF0Y2guVU5JVF9MSU5FLAotCQkJCQkJCQkxLCAxKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX07Ci0vLwkJTWV0aG9kU2VhcmNoT3BlcmF0aW9uIG9wZXJhdGlvbiA9IG5ldyBNZXRob2RTZWFyY2hPcGVyYXRpb24oCi0vLwkJCQlzZWFyY2hJbnB1dCwgcmVzdWx0KTsKLS8vCQlvcGVyYXRpb24uZXhlY3V0ZShwcm9jZXNzTW9uaXRvcik7Ci0JCUlNZXRob2RTZWFyY2hPcGVyYXRpb24gb3AgPSBNZXRob2RTZWFyY2hIZWxwZXIubmV3U2VhcmNoT3BlcmF0aW9uKCk7Ci0JCW9wLmV4ZWN1dGUoc2VhcmNoSW5wdXQsIHJlc3VsdCwgcHJvY2Vzc01vbml0b3IpOwotCQlwcm9jZXNzTW9uaXRvci5kb25lKCk7Ci0JCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc2VhcmNoLnVpLklTZWFyY2hRdWVyeSNnZXRMYWJlbCgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMYWJlbCgpIHsKLQkJcmV0dXJuIFNlYXJjaFVJUmVzb3VyY2VzLnNlYXJjaFF1ZXJ5X3RleHQ7IAotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc2VhcmNoLnVpLklTZWFyY2hRdWVyeSNjYW5SZXJ1bigpCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2FuUmVydW4oKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc2VhcmNoLnVpLklTZWFyY2hRdWVyeSNjYW5SdW5JbkJhY2tncm91bmQoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGNhblJ1bkluQmFja2dyb3VuZCgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5zZWFyY2gudWkuSVNlYXJjaFF1ZXJ5I2dldFNlYXJjaFJlc3VsdCgpCi0JICovCi0JcHVibGljIElTZWFyY2hSZXN1bHQgZ2V0U2VhcmNoUmVzdWx0KCkgewotCQlpZiAoc2VhcmNoUmVzdWx0ID09IG51bGwpIHsKLQkJCXNlYXJjaFJlc3VsdCA9IG5ldyBNZXRob2RTZWFyY2hSZXN1bHQodGhpcyk7Ci0JCX0KLQkJcmV0dXJuIHNlYXJjaFJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnNlYXJjaC51aS5JU2VhcmNoUXVlcnkjZ2V0U2VhcmNoUmVzdWx0KCkKLQkgKi8KLQlwdWJsaWMgTWV0aG9kU2VhcmNoSW5wdXQgZ2V0U2VhcmNoSW5wdXQoKSB7Ci0JCXJldHVybiBzZWFyY2hJbnB1dDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvdWkvaW50ZXJuYWwvTWV0aG9kU2VhcmNoUmVzdWx0LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL3VpL2ludGVybmFsL01ldGhvZFNlYXJjaFJlc3VsdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYjE2MzExLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvdWkvaW50ZXJuYWwvTWV0aG9kU2VhcmNoUmVzdWx0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS5TZWFyY2hVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpLlNlYXJjaFVJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zZWFyY2gudWkuSVNlYXJjaFF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnNlYXJjaC51aS50ZXh0LkFic3RyYWN0VGV4dFNlYXJjaFJlc3VsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zZWFyY2gudWkudGV4dC5JRWRpdG9yTWF0Y2hBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnNlYXJjaC51aS50ZXh0LklGaWxlTWF0Y2hBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnNlYXJjaC51aS50ZXh0Lk1hdGNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotCi0vKioKLSAqIFRoZSBtZXRob2Qgc2VhcmNoIHJlc3VsdC4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXRob2RTZWFyY2hSZXN1bHQgZXh0ZW5kcyBBYnN0cmFjdFRleHRTZWFyY2hSZXN1bHQgaW1wbGVtZW50cwotCQlJRWRpdG9yTWF0Y2hBZGFwdGVyIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNQVRDSF9MQUJFTCA9IFNlYXJjaFVJUmVzb3VyY2VzLnNlYXJjaFJlc3VsdF9tYXRjaDsgCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFUQ0hFU19MQUJFTCA9IFNlYXJjaFVJUmVzb3VyY2VzLnNlYXJjaFJlc3VsdF9tYXRjaGVzOyAKLQotCS8vIFRoZSBzZWFyY2ggcXVlcnkuCi0JcHJpdmF0ZSBNZXRob2RTZWFyY2hRdWVyeSBzZWFyY2hRdWVyeTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICogCi0JICogQHBhcmFtIHNlYXJjaFF1ZXJ5Ci0JICogICAgICAgICAgICBhIG1ldGhvZCBzZWFyY2ggcXVlcnkKLQkgKi8KLQlwdWJsaWMgTWV0aG9kU2VhcmNoUmVzdWx0KE1ldGhvZFNlYXJjaFF1ZXJ5IHNlYXJjaFF1ZXJ5KSB7Ci0JCXRoaXMuc2VhcmNoUXVlcnkgPSBzZWFyY2hRdWVyeTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnNlYXJjaC51aS5JU2VhcmNoUmVzdWx0I2dldFF1ZXJ5KCkKLQkgKi8KLQlwdWJsaWMgSVNlYXJjaFF1ZXJ5IGdldFF1ZXJ5KCkgewotCQlyZXR1cm4gc2VhcmNoUXVlcnk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5zZWFyY2gudWkuSVNlYXJjaFJlc3VsdCNnZXRJbWFnZURlc2NyaXB0b3IoKQotCSAqLwotCXB1YmxpYyBJbWFnZURlc2NyaXB0b3IgZ2V0SW1hZ2VEZXNjcmlwdG9yKCkgewotCQlyZXR1cm4gU2VhcmNoVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcigKLQkJCQkiZnVsbC9vYmoxNi9NZXRob2RTZWFyY2guZ2lmIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnNlYXJjaC51aS5JU2VhcmNoUmVzdWx0I2dldExhYmVsKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExhYmVsKCkgewotCQkvLyBUT0RPOiBEaXNwbGF5IHNlYXJjaCByZXN1bHQgaW4gdGhlIGZvcm06Ci0JCS8vICAgICdjYW5kaWRhdGUnIC0gNiBtYXRjaGVzIGluIDQgZWxlbWVudHMuCi0JCVN0cmluZyBzZWFyY2hTdHJpbmcgPSBzZWFyY2hRdWVyeS5nZXRTZWFyY2hJbnB1dCgpLmdldFNlYXJjaFN0cmluZygpOwotCQlpbnQgbWF0Y2hDb3VudCA9IGdldE1hdGNoQ291bnQoKTsKLQkJaWYgKG1hdGNoQ291bnQgPT0gMSkgewotCQkJcmV0dXJuIE1lc3NhZ2VGb3JtYXQuZm9ybWF0KE1BVENIX0xBQkVMLAotCQkJCQluZXcgT2JqZWN0W10geyBzZWFyY2hTdHJpbmcgfSk7CQkKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBNZXNzYWdlRm9ybWF0LmZvcm1hdChNQVRDSEVTX0xBQkVMLCBuZXcgT2JqZWN0W10gewotCQkJCQlzZWFyY2hTdHJpbmcsICIiICsgbWF0Y2hDb3VudCB9KTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5zZWFyY2gudWkuSVNlYXJjaFJlc3VsdCNnZXRUb29sdGlwKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRvb2x0aXAoKSB7Ci0JCXJldHVybiBnZXRMYWJlbCgpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc2VhcmNoLnVpLnRleHQuQWJzdHJhY3RUZXh0U2VhcmNoUmVzdWx0I2dldEVkaXRvck1hdGNoQWRhcHRlcigpCi0JICovCi0JcHVibGljIElFZGl0b3JNYXRjaEFkYXB0ZXIgZ2V0RWRpdG9yTWF0Y2hBZGFwdGVyKCkgewotCQlyZXR1cm4gdGhpczsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnNlYXJjaC51aS50ZXh0LkFic3RyYWN0VGV4dFNlYXJjaFJlc3VsdCNnZXRGaWxlTWF0Y2hBZGFwdGVyKCkKLQkgKi8KLQlwdWJsaWMgSUZpbGVNYXRjaEFkYXB0ZXIgZ2V0RmlsZU1hdGNoQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5zZWFyY2gudWkudGV4dC5JRWRpdG9yTWF0Y2hBZGFwdGVyI2lzU2hvd25JbkVkaXRvcihNYXRjaCwKLQkgKiAgICAgIElFZGl0b3JQYXJ0KQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2hvd25JbkVkaXRvcihNYXRjaCBtYXRjaCwgSUVkaXRvclBhcnQgZWRpdG9yKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnNlYXJjaC51aS50ZXh0LklFZGl0b3JNYXRjaEFkYXB0ZXIjY29tcHV0ZUNvbnRhaW5lZE1hdGNoZXMoQWJzdHJhY3RUZXh0U2VhcmNoUmVzdWx0LAotCSAqICAgICAgSUVkaXRvclBhcnQpCi0JICovCi0JcHVibGljIE1hdGNoW10gY29tcHV0ZUNvbnRhaW5lZE1hdGNoZXMoQWJzdHJhY3RUZXh0U2VhcmNoUmVzdWx0IHJlc3VsdCwKLQkJCUlFZGl0b3JQYXJ0IGVkaXRvcikgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvdWkvaW50ZXJuYWwvTWV0aG9kU2VhcmNoU2NvcGUuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvdWkvaW50ZXJuYWwvTWV0aG9kU2VhcmNoU2NvcGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2QxZGMzNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL3VpL2ludGVybmFsL01ldGhvZFNlYXJjaFNjb3BlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzc2lmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuU3RyVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5MaWJyYXJ5VUlUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogVGhlIG1ldGhvZCBzZWFyY2ggc2NvcGUuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIE1ldGhvZFNlYXJjaFNjb3BlIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJPT1QgPSAiUm9vdCI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FVEhPRF9DT05URU5UID0gTGlicmFyeVVJVGV4dC5URVhUX01FVEhPRF9DT05URU5UOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUk9MRSA9IExpYnJhcnlVSVRleHQuVEVYVF9ST0xFOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFTSyA9IExpYnJhcnlVSVRleHQuVEVYVF9UQVNLOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV09SS19QUk9EVUNUID0gTGlicmFyeVVJVGV4dC5URVhUX1dPUktfUFJPRFVDVDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEdVSURBTkNFID0gTGlicmFyeVVJVGV4dC5URVhUX0dVSURBTkNFOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hFQ0tMSVNUID0gTGlicmFyeVVJVGV4dC5URVhUX0NIRUNLTElTVDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTkNFUFQgPSBMaWJyYXJ5VUlUZXh0LlRFWFRfQ09OQ0VQVDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVTVElNQVRJT05fQ09OU0lERVJBVElPTlMgPSBMaWJyYXJ5VUlUZXh0LlRFWFRfRVNUSU1BVElPTl9DT05TSURFUkFUSU9OUzsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYQU1QTEUgPSBMaWJyYXJ5VUlUZXh0LlRFWFRfRVhBTVBMRTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEdVSURFTElORSA9IExpYnJhcnlVSVRleHQuVEVYVF9HVUlERUxJTkU7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkFDVElDRSA9IExpYnJhcnlVSVRleHQuVEVYVF9QUkFDVElDRTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFUE9SVCA9IExpYnJhcnlVSVRleHQuVEVYVF9SRVBPUlQ7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRVVTQUJMRV9BU1NFVCA9IExpYnJhcnlVSVRleHQuVEVYVF9SRVVTQUJMRV9BU1NFVDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJPQURNQVAgPSBMaWJyYXJ5VUlUZXh0LlRFWFRfUk9BRE1BUDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNVUFBPUlRJTkdfTUFURVJJQUwgPSBMaWJyYXJ5VUlUZXh0LlRFWFRfU1VQUE9SVElOR19NQVRFUklBTDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFTVBMQVRFID0gTGlicmFyeVVJVGV4dC5URVhUX1RFTVBMQVRFOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVSTV9ERUZJTklUSU9OID0gTGlicmFyeVVJVGV4dC5URVhUX1RFUk1fREVGSU5JVElPTjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRPT0xfTUVOVE9SID0gTGlicmFyeVVJVGV4dC5URVhUX1RPT0xfTUVOVE9SOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0hJVEVQQVBFUiA9IExpYnJhcnlVSVRleHQuVEVYVF9XSElURVBBUEVSOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RBTkRBUkRfQ0FURUdPUlkgPSBMaWJyYXJ5VUlUZXh0LlRFWFRfU1RBTkRBUkRfQ0FURUdPUlk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDVVNUT01fQ0FURUdPUlkgPSBMaWJyYXJ5VUlUZXh0LlRFWFRfQ1VTVE9NX0NBVEVHT1JZOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPQ0VTUyA9IExpYnJhcnlVSVRleHQuVEVYVF9QUk9DRVNTOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0FQQUJJTElUWV9QQVRURVJOID0gTGlicmFyeVVJVGV4dC5URVhUX0NBUEFCSUxJVFlfUEFUVEVSTjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFTElWRVJZX1BST0NFU1MgPSBMaWJyYXJ5VUlUZXh0LlRFWFRfREVMSVZFUllfUFJPQ0VTUzsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgTWFwPEVDbGFzcywgU3RyaW5nPiBlbGVtZW50U2VhcmNoU2NvcGUgPSBuZXcgSGFzaE1hcDxFQ2xhc3MsIFN0cmluZz4oKTsKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXA8U3RyaW5nLCBDb2xsZWN0aW9uPEVDbGFzcz4+IHNjb3BlVG9FQ2xhc3Nlc01hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgQ29sbGVjdGlvbjxFQ2xhc3M+PigpOwotCi0Jc3RhdGljIHsKLQkJZWxlbWVudFNlYXJjaFNjb3BlLnB1dChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRNZXRob2RQbHVnaW4oKSwgUk9PVCk7Ci0JCWVsZW1lbnRTZWFyY2hTY29wZS5wdXQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29udGVudFBhY2thZ2UoKSwgTUVUSE9EX0NPTlRFTlQpOwotCQllbGVtZW50U2VhcmNoU2NvcGUucHV0KFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFJvbGUoKSwgUk9MRSk7Ci0JCWVsZW1lbnRTZWFyY2hTY29wZS5wdXQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFzaygpLCBUQVNLKTsKLQkJZWxlbWVudFNlYXJjaFNjb3BlLnB1dChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRBcnRpZmFjdCgpLCBXT1JLX1BST0RVQ1QpOwotCQllbGVtZW50U2VhcmNoU2NvcGUucHV0KFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldERlbGl2ZXJhYmxlKCksIFdPUktfUFJPRFVDVCk7Ci0JCWVsZW1lbnRTZWFyY2hTY29wZS5wdXQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0T3V0Y29tZSgpLCBXT1JLX1BST0RVQ1QpOwotCQllbGVtZW50U2VhcmNoU2NvcGUucHV0KFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEd1aWRhbmNlKCksIEdVSURBTkNFKTsKLQkJZWxlbWVudFNlYXJjaFNjb3BlLnB1dChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRDaGVja2xpc3QoKSwgQ0hFQ0tMSVNUKTsKLQkJZWxlbWVudFNlYXJjaFNjb3BlLnB1dChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb25jZXB0KCksIENPTkNFUFQpOwotCQllbGVtZW50U2VhcmNoU2NvcGUucHV0KFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEVzdGltYXRpb25Db25zaWRlcmF0aW9ucygpLAotCQkJCUVTVElNQVRJT05fQ09OU0lERVJBVElPTlMpOwotCQllbGVtZW50U2VhcmNoU2NvcGUucHV0KFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEV4YW1wbGUoKSwgRVhBTVBMRSk7Ci0JCWVsZW1lbnRTZWFyY2hTY29wZS5wdXQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0R3VpZGVsaW5lKCksIEdVSURFTElORSk7Ci0JCWVsZW1lbnRTZWFyY2hTY29wZS5wdXQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UHJhY3RpY2UoKSwgUFJBQ1RJQ0UpOwotCQllbGVtZW50U2VhcmNoU2NvcGUucHV0KFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFJlcG9ydCgpLCBSRVBPUlQpOwotCQllbGVtZW50U2VhcmNoU2NvcGUucHV0KFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFJldXNhYmxlQXNzZXQoKSwgUkVVU0FCTEVfQVNTRVQpOwotCQllbGVtZW50U2VhcmNoU2NvcGUucHV0KFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFJvYWRtYXAoKSwgUk9BRE1BUCk7Ci0JCWVsZW1lbnRTZWFyY2hTY29wZS5wdXQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U3VwcG9ydGluZ01hdGVyaWFsKCksCi0JCQkJU1VQUE9SVElOR19NQVRFUklBTCk7Ci0JCWVsZW1lbnRTZWFyY2hTY29wZS5wdXQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGVtcGxhdGUoKSwgVEVNUExBVEUpOwotCQllbGVtZW50U2VhcmNoU2NvcGUucHV0KFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRlcm1EZWZpbml0aW9uKCksIFRFUk1fREVGSU5JVElPTik7Ci0JCWVsZW1lbnRTZWFyY2hTY29wZS5wdXQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VG9vbE1lbnRvcigpLCBUT09MX01FTlRPUik7Ci0JCWVsZW1lbnRTZWFyY2hTY29wZS5wdXQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V2hpdGVwYXBlcigpLCBXSElURVBBUEVSKTsKLQkJZWxlbWVudFNlYXJjaFNjb3BlLnB1dChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb250ZW50Q2F0ZWdvcnkoKSwgU1RBTkRBUkRfQ0FURUdPUlkpOwotCQllbGVtZW50U2VhcmNoU2NvcGUucHV0KFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldERpc2NpcGxpbmUoKSwgU1RBTkRBUkRfQ0FURUdPUlkpOwotCQllbGVtZW50U2VhcmNoU2NvcGUucHV0KFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldERpc2NpcGxpbmVHcm91cGluZygpLCBTVEFOREFSRF9DQVRFR09SWSk7Ci0JCWVsZW1lbnRTZWFyY2hTY29wZS5wdXQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RG9tYWluKCksIFNUQU5EQVJEX0NBVEVHT1JZKTsKLQkJZWxlbWVudFNlYXJjaFNjb3BlLnB1dChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRXb3JrUHJvZHVjdFR5cGUoKSwgU1RBTkRBUkRfQ0FURUdPUlkpOwotCQllbGVtZW50U2VhcmNoU2NvcGUucHV0KFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFJvbGVTZXQoKSwgU1RBTkRBUkRfQ0FURUdPUlkpOwotCQllbGVtZW50U2VhcmNoU2NvcGUucHV0KFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFJvbGVTZXRHcm91cGluZygpLCBTVEFOREFSRF9DQVRFR09SWSk7Ci0JCWVsZW1lbnRTZWFyY2hTY29wZS5wdXQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VG9vbCgpLCBTVEFOREFSRF9DQVRFR09SWSk7Ci0JCWVsZW1lbnRTZWFyY2hTY29wZS5wdXQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q3VzdG9tQ2F0ZWdvcnkoKSwgQ1VTVE9NX0NBVEVHT1JZKTsKLQkJZWxlbWVudFNlYXJjaFNjb3BlLnB1dChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRQcm9jZXNzUGFja2FnZSgpLCBQUk9DRVNTKTsKLQkJZWxlbWVudFNlYXJjaFNjb3BlLnB1dChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRQcm9jZXNzQ29tcG9uZW50KCksIFBST0NFU1MpOwotCQllbGVtZW50U2VhcmNoU2NvcGUucHV0KFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFBoYXNlKCksIFBST0NFU1MpOwotCQllbGVtZW50U2VhcmNoU2NvcGUucHV0KFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEl0ZXJhdGlvbigpLCBQUk9DRVNTKTsKLQkJZWxlbWVudFNlYXJjaFNjb3BlLnB1dChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRNaWxlc3RvbmUoKSwgUFJPQ0VTUyk7Ci0JCWVsZW1lbnRTZWFyY2hTY29wZS5wdXQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QWN0aXZpdHkoKSwgUFJPQ0VTUyk7Ci0JCWVsZW1lbnRTZWFyY2hTY29wZS5wdXQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Um9sZURlc2NyaXB0b3IoKSwgUFJPQ0VTUyk7Ci0JCWVsZW1lbnRTZWFyY2hTY29wZS5wdXQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza0Rlc2NyaXB0b3IoKSwgUFJPQ0VTUyk7Ci0JCWVsZW1lbnRTZWFyY2hTY29wZS5wdXQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yKCksIFBST0NFU1MpOwotCQllbGVtZW50U2VhcmNoU2NvcGUucHV0KFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldENhcGFiaWxpdHlQYXR0ZXJuKCksIENBUEFCSUxJVFlfUEFUVEVSTik7Ci0JCWVsZW1lbnRTZWFyY2hTY29wZS5wdXQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RGVsaXZlcnlQcm9jZXNzKCksIERFTElWRVJZX1BST0NFU1MpOwotCQkKLQkJc2NvcGVUb0VDbGFzc2VzTWFwLnB1dChST0xFLCBDb2xsZWN0aW9ucy5zaW5nbGV0b24oVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Um9sZSgpKSk7Ci0JCXNjb3BlVG9FQ2xhc3Nlc01hcC5wdXQoVEFTSywgQ29sbGVjdGlvbnMuc2luZ2xldG9uKFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2soKSkpOwotCQlzY29wZVRvRUNsYXNzZXNNYXAucHV0KFdPUktfUFJPRFVDVCwgQXJyYXlzLmFzTGlzdChuZXcgRUNsYXNzW10gewotCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEFydGlmYWN0KCksCi0JCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RGVsaXZlcmFibGUoKSwKLQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRPdXRjb21lKCkKLQkJfSkpOwotCQlzY29wZVRvRUNsYXNzZXNNYXAucHV0KENIRUNLTElTVCwgQ29sbGVjdGlvbnMuc2luZ2xldG9uKFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldENoZWNrbGlzdCgpKSk7Ci0JCXNjb3BlVG9FQ2xhc3Nlc01hcC5wdXQoQ09OQ0VQVCwgQ29sbGVjdGlvbnMuc2luZ2xldG9uKFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbmNlcHQoKSkpOwotCQlzY29wZVRvRUNsYXNzZXNNYXAucHV0KEVTVElNQVRJT05fQ09OU0lERVJBVElPTlMsIENvbGxlY3Rpb25zLnNpbmdsZXRvbihVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMoKSkpOwotCQlzY29wZVRvRUNsYXNzZXNNYXAucHV0KEVYQU1QTEUsIENvbGxlY3Rpb25zLnNpbmdsZXRvbihVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMoKSkpOwotCQlzY29wZVRvRUNsYXNzZXNNYXAucHV0KEdVSURFTElORSwgIENvbGxlY3Rpb25zLnNpbmdsZXRvbihVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRHdWlkZWxpbmUoKSkpOwotCQlzY29wZVRvRUNsYXNzZXNNYXAucHV0KFBSQUNUSUNFLCBDb2xsZWN0aW9ucy5zaW5nbGV0b24oVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UHJhY3RpY2UoKSkpOwotCQlzY29wZVRvRUNsYXNzZXNNYXAucHV0KFJFUE9SVCwgQ29sbGVjdGlvbnMuc2luZ2xldG9uKFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFJlcG9ydCgpKSk7Ci0JCXNjb3BlVG9FQ2xhc3Nlc01hcC5wdXQoUkVVU0FCTEVfQVNTRVQsIENvbGxlY3Rpb25zLnNpbmdsZXRvbihVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRSZXVzYWJsZUFzc2V0KCkpKTsKLQkJc2NvcGVUb0VDbGFzc2VzTWFwLnB1dChST0FETUFQLCBDb2xsZWN0aW9ucy5zaW5nbGV0b24oVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Um9hZG1hcCgpKSk7Ci0JCXNjb3BlVG9FQ2xhc3Nlc01hcC5wdXQoU1VQUE9SVElOR19NQVRFUklBTCwgQ29sbGVjdGlvbnMuc2luZ2xldG9uKFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFN1cHBvcnRpbmdNYXRlcmlhbCgpKSk7Ci0JCXNjb3BlVG9FQ2xhc3Nlc01hcC5wdXQoVEVNUExBVEUsIENvbGxlY3Rpb25zLnNpbmdsZXRvbihVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUZW1wbGF0ZSgpKSk7Ci0JCXNjb3BlVG9FQ2xhc3Nlc01hcC5wdXQoVEVSTV9ERUZJTklUSU9OLCBDb2xsZWN0aW9ucy5zaW5nbGV0b24oVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGVybURlZmluaXRpb24oKSkpOwotCQlzY29wZVRvRUNsYXNzZXNNYXAucHV0KFRPT0xfTUVOVE9SLCBDb2xsZWN0aW9ucy5zaW5nbGV0b24oVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VG9vbE1lbnRvcigpKSk7Ci0JCXNjb3BlVG9FQ2xhc3Nlc01hcC5wdXQoV0hJVEVQQVBFUiwgQ29sbGVjdGlvbnMuc2luZ2xldG9uKFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFdoaXRlcGFwZXIoKSkpOwotCQlzY29wZVRvRUNsYXNzZXNNYXAucHV0KFNUQU5EQVJEX0NBVEVHT1JZLCBBcnJheXMuYXNMaXN0KG5ldyBFQ2xhc3NbXSB7Ci0JCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RGlzY2lwbGluZSgpLAotCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldERpc2NpcGxpbmVHcm91cGluZygpLAotCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldERvbWFpbigpLAotCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFdvcmtQcm9kdWN0VHlwZSgpLAotCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFJvbGVTZXQoKSwKLQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRSb2xlU2V0R3JvdXBpbmcoKSwKLQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUb29sKCkKLQkJfSkpOwotCQlzY29wZVRvRUNsYXNzZXNNYXAucHV0KENVU1RPTV9DQVRFR09SWSwgQ29sbGVjdGlvbnMuc2luZ2xldG9uKFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEN1c3RvbUNhdGVnb3J5KCkpKTsKLQkJc2NvcGVUb0VDbGFzc2VzTWFwLnB1dChDQVBBQklMSVRZX1BBVFRFUk4sIENvbGxlY3Rpb25zLnNpbmdsZXRvbihVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRDYXBhYmlsaXR5UGF0dGVybigpKSk7Ci0JCXNjb3BlVG9FQ2xhc3Nlc01hcC5wdXQoREVMSVZFUllfUFJPQ0VTUywgQ29sbGVjdGlvbnMuc2luZ2xldG9uKFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldERlbGl2ZXJ5UHJvY2VzcygpKSk7Ci0KLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBNZXRob2RTZWFyY2hTY29wZSBJTkNMVURFX0FMTF9TRUFSQ0hfU0NPUEUgPSBuZXcgTWV0aG9kU2VhcmNoU2NvcGUoc2NvcGVUb0VDbGFzc2VzTWFwLmtleVNldCgpLnRvQXJyYXkoKSk7Ci0KLQlwcml2YXRlIExpc3Q8T2JqZWN0PiBzZWFyY2hTY29wZSA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PigpOwotCi0JcHJpdmF0ZSBBcnJheUxpc3Q8RUNsYXNzPiBzZWxlY3RlZFR5cGVzOwotCQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIE1ldGhvZFNlYXJjaFNjb3BlKE9iamVjdFtdIGVsZW1lbnRUeXBlcykgewotCQl0aGlzKGVsZW1lbnRUeXBlcywgdHJ1ZSk7Ci0JfQotCQotCXB1YmxpYyBNZXRob2RTZWFyY2hTY29wZShPYmplY3RbXSBlbGVtZW50VHlwZXMsIGJvb2xlYW4gaW5jbHVkZVJvb3QpIHsKLQkJaWYoaW5jbHVkZVJvb3QpIHsKLQkJCXNlYXJjaFNjb3BlLmFkZChST09UKTsKLQkJfQotCQlmb3IgKGludCBpID0gMDsgaSA8IGVsZW1lbnRUeXBlcy5sZW5ndGg7IGkrKykgewotCQkJT2JqZWN0IGVsZW1lbnRUeXBlID0gZWxlbWVudFR5cGVzW2ldOwotCQkJc2VhcmNoU2NvcGUuYWRkKGVsZW1lbnRUeXBlKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBDaGVja3Mgd2hldGhlciBhIGNvcmUgbWV0aG9kIGVsZW1lbnQgaXMgaW5jbHVkZWQgaW4gdGhlIHNlYXJjaCBzY29wZS4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIGEgY29yZSBtZXRob2QgZWxlbWVudCBpcyBpbmNsdWRlZCBpbiB0aGUKLQkgKiAgICAgICAgIHNlYXJjaCBzY29wZSwgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotCSAqLwotCXB1YmxpYyBib29sZWFuIGluY2x1ZGVDb3JlQ29udGVudCgpIHsKLQkJcmV0dXJuIHNlYXJjaFNjb3BlLmNvbnRhaW5zKFJPTEUpIHx8IHNlYXJjaFNjb3BlLmNvbnRhaW5zKFRBU0spCi0JCQkJfHwgc2VhcmNoU2NvcGUuY29udGFpbnMoV09SS19QUk9EVUNUKQotCQkJCXx8IHNlYXJjaFNjb3BlLmNvbnRhaW5zKEdVSURBTkNFKQotCQkJCXx8IHNlYXJjaFNjb3BlLmNvbnRhaW5zKENIRUNLTElTVCkKLQkJCQl8fCBzZWFyY2hTY29wZS5jb250YWlucyhDT05DRVBUKQotCQkJCXx8IHNlYXJjaFNjb3BlLmNvbnRhaW5zKEVTVElNQVRJT05fQ09OU0lERVJBVElPTlMpCi0JCQkJfHwgc2VhcmNoU2NvcGUuY29udGFpbnMoRVhBTVBMRSkKLQkJCQl8fCBzZWFyY2hTY29wZS5jb250YWlucyhHVUlERUxJTkUpCi0JCQkJfHwgc2VhcmNoU2NvcGUuY29udGFpbnMoUFJBQ1RJQ0UpCi0JCQkJfHwgc2VhcmNoU2NvcGUuY29udGFpbnMoUkVQT1JUKQotCQkJCXx8IHNlYXJjaFNjb3BlLmNvbnRhaW5zKFJFVVNBQkxFX0FTU0VUKQotCQkJCXx8IHNlYXJjaFNjb3BlLmNvbnRhaW5zKFJPQURNQVApCi0JCQkJfHwgc2VhcmNoU2NvcGUuY29udGFpbnMoU1VQUE9SVElOR19NQVRFUklBTCkKLQkJCQl8fCBzZWFyY2hTY29wZS5jb250YWlucyhURU1QTEFURSkKLQkJCQl8fCBzZWFyY2hTY29wZS5jb250YWlucyhURVJNX0RFRklOSVRJT04pCi0JCQkJfHwgc2VhcmNoU2NvcGUuY29udGFpbnMoVE9PTF9NRU5UT1IpCi0JCQkJfHwgc2VhcmNoU2NvcGUuY29udGFpbnMoV0hJVEVQQVBFUik7Ci0JfQotCi0JLyoqCi0JICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIE1ldGhvZCBlbGVtZW50IGlzIGluY2x1ZGVkIGluIHRoZSBzZWFyY2ggc2NvcGUuCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGVsZW1lbnQKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBtZXRob2QgZWxlbWVudCBpcyBpbmNsdWRlZCBpbiB0aGUKLQkgKiAgICAgICAgIHNlYXJjaCBzY29wZSwgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotCSAqLwotCXB1YmxpYyBib29sZWFuIGluY2x1ZGUoTWV0aG9kRWxlbWVudCBlbGVtZW50KSB7Ci0JCWlmIChlbGVtZW50ID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCVN0cmluZyBzZWFyY2hTY29wZU5hbWUgPSAoU3RyaW5nKSBlbGVtZW50U2VhcmNoU2NvcGUuZ2V0KGVsZW1lbnQKLQkJCQkuZUNsYXNzKCkpOwotCQlyZXR1cm4gc2VhcmNoU2NvcGUuY29udGFpbnMoc2VhcmNoU2NvcGVOYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gbWV0aG9kIGVsZW1lbnQgdHlwZSBpcyBpbmNsdWRlZCBpbiB0aGUgc2VhcmNoCi0JICogc2NvcGUuCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgZ2l2ZW4gbWV0aG9kIGVsZW1lbnQgdHlwZSBpcyBpbmNsdWRlZAotCSAqICAgICAgICAgaW4gdGhlIHNlYXJjaCBzY29wZSwgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotCSAqLwotCXB1YmxpYyBib29sZWFuIGluY2x1ZGUoU3RyaW5nIHNlYXJjaFNjb3BlTmFtZSkgewotCQlyZXR1cm4gc2VhcmNoU2NvcGUuY29udGFpbnMoc2VhcmNoU2NvcGVOYW1lKTsKLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbjxFQ2xhc3M+IGdldFNlbGVjdGVkVHlwZXMoKSB7Ci0JCWlmIChzZWxlY3RlZFR5cGVzID09IG51bGwpIHsKLQkJCXNlbGVjdGVkVHlwZXMgPSBuZXcgQXJyYXlMaXN0PEVDbGFzcz4oKTsKLQkJCWZvciAoTWFwLkVudHJ5PFN0cmluZywgQ29sbGVjdGlvbjxFQ2xhc3M+PiBlbnRyeSA6IHNjb3BlVG9FQ2xhc3Nlc01hcAotCQkJCQkuZW50cnlTZXQoKSkgewotCQkJCWlmIChzZWFyY2hTY29wZS5jb250YWlucyhlbnRyeS5nZXRLZXkoKSkpIHsKLQkJCQkJc2VsZWN0ZWRUeXBlcy5hZGRBbGwoZW50cnkuZ2V0VmFsdWUoKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBzZWxlY3RlZFR5cGVzOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRUeXBlVGV4dChTdHJpbmcgdHlwZU5hbWUpIHsKLQkJRUNsYXNzaWZpZXIgY2xzID0gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RUNsYXNzaWZpZXIodHlwZU5hbWUpOwotCQlyZXR1cm4gZWxlbWVudFNlYXJjaFNjb3BlLmdldChjbHMpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZihzZWFyY2hTY29wZSA9PSBudWxsICYmIHNlYXJjaFNjb3BlLmlzRW1wdHkoKSkgewotCQkJcmV0dXJuIFN0clV0aWwuRU1QVFlfU1RSSU5HOwotCQl9Ci0JCVN0cmluZ0J1ZmZlciBzdHJCdWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWludCBtYXggPSBzZWFyY2hTY29wZS5zaXplKCkgLSAxOwotCQlmb3IoaW50IGkgPSAwOyBpIDwgbWF4OyBpKyspIHsKLQkJCXN0ckJ1ZmZlci5hcHBlbmQoc2VhcmNoU2NvcGUuZ2V0KGkpKS5hcHBlbmQoJywnKTsKLQkJfQotCQlyZXR1cm4gc3RyQnVmZmVyLmFwcGVuZChzZWFyY2hTY29wZS5nZXQobWF4KSkudG9TdHJpbmcoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL3VpL2ludGVybmFsL01ldGhvZFNlYXJjaFNjb3BlVmlld2VyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL3VpL2ludGVybmFsL01ldGhvZFNlYXJjaFNjb3BlVmlld2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzNzE5NDMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC91aS9pbnRlcm5hbC9NZXRob2RTZWFyY2hTY29wZVZpZXdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzA2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DaGVja1N0YXRlQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2hlY2tib3hUcmVlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNoZWNrU3RhdGVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUcmVlQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIERpc3BsYXlzIHRoZSBzZWFyY2hhYmxlIG1ldGhvZCBlbGVtZW50cywgb3JnYW5pemVkIGJ5IHR5cGVzLCBpbiBhIHRyZWUgdmlldy4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTWV0aG9kU2VhcmNoU2NvcGVWaWV3ZXIgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJPT1QgPSBNZXRob2RTZWFyY2hTY29wZS5ST09UOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1FVEhPRF9DT05URU5UID0gTWV0aG9kU2VhcmNoU2NvcGUuTUVUSE9EX0NPTlRFTlQ7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUk9MRSA9IE1ldGhvZFNlYXJjaFNjb3BlLlJPTEU7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFTSyA9IE1ldGhvZFNlYXJjaFNjb3BlLlRBU0s7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgV09SS19QUk9EVUNUID0gTWV0aG9kU2VhcmNoU2NvcGUuV09SS19QUk9EVUNUOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEdVSURBTkNFID0gTWV0aG9kU2VhcmNoU2NvcGUuR1VJREFOQ0U7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hFQ0tMSVNUID0gTWV0aG9kU2VhcmNoU2NvcGUuQ0hFQ0tMSVNUOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENPTkNFUFQgPSBNZXRob2RTZWFyY2hTY29wZS5DT05DRVBUOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVTVElNQVRJT05fQ09OU0lERVJBVElPTlMgPSBNZXRob2RTZWFyY2hTY29wZS5FU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVYQU1QTEUgPSBNZXRob2RTZWFyY2hTY29wZS5FWEFNUExFOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEdVSURFTElORSA9IE1ldGhvZFNlYXJjaFNjb3BlLkdVSURFTElORTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUkFDVElDRSA9IE1ldGhvZFNlYXJjaFNjb3BlLlBSQUNUSUNFOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFUE9SVCA9IE1ldGhvZFNlYXJjaFNjb3BlLlJFUE9SVDsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRVVTQUJMRV9BU1NFVCA9IE1ldGhvZFNlYXJjaFNjb3BlLlJFVVNBQkxFX0FTU0VUOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJPQURNQVAgPSBNZXRob2RTZWFyY2hTY29wZS5ST0FETUFQOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNVUFBPUlRJTkdfTUFURVJJQUwgPSBNZXRob2RTZWFyY2hTY29wZS5TVVBQT1JUSU5HX01BVEVSSUFMOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRFTVBMQVRFID0gTWV0aG9kU2VhcmNoU2NvcGUuVEVNUExBVEU7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVSTV9ERUZJTklUSU9OID0gTWV0aG9kU2VhcmNoU2NvcGUuVEVSTV9ERUZJTklUSU9OOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRPT0xfTUVOVE9SID0gTWV0aG9kU2VhcmNoU2NvcGUuVE9PTF9NRU5UT1I7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0hJVEVQQVBFUiA9IE1ldGhvZFNlYXJjaFNjb3BlLldISVRFUEFQRVI7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RBTkRBUkRfQ0FURUdPUlkgPSBNZXRob2RTZWFyY2hTY29wZS5TVEFOREFSRF9DQVRFR09SWTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDVVNUT01fQ0FURUdPUlkgPSBNZXRob2RTZWFyY2hTY29wZS5DVVNUT01fQ0FURUdPUlk7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPQ0VTUyA9IE1ldGhvZFNlYXJjaFNjb3BlLlBST0NFU1M7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0FQQUJJTElUWV9QQVRURVJOID0gTWV0aG9kU2VhcmNoU2NvcGUuQ0FQQUJJTElUWV9QQVRURVJOOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFTElWRVJZX1BST0NFU1MgPSBNZXRob2RTZWFyY2hTY29wZS5ERUxJVkVSWV9QUk9DRVNTOwotCi0JcHJpdmF0ZSBzdGF0aWMgTGlzdDxTdHJpbmc+IHJvb3RMaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0Jc3RhdGljIHsKLQkJcm9vdExpc3QuYWRkKE1FVEhPRF9DT05URU5UKTsKLQkJcm9vdExpc3QuYWRkKFBST0NFU1MpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIExpc3Q8U3RyaW5nPiBtZXRob2RDb250ZW50TGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCXN0YXRpYyB7Ci0JCW1ldGhvZENvbnRlbnRMaXN0LmFkZChST0xFKTsKLQkJbWV0aG9kQ29udGVudExpc3QuYWRkKFRBU0spOwotCQltZXRob2RDb250ZW50TGlzdC5hZGQoV09SS19QUk9EVUNUKTsKLQkJbWV0aG9kQ29udGVudExpc3QuYWRkKEdVSURBTkNFKTsKLQkJbWV0aG9kQ29udGVudExpc3QuYWRkKFNUQU5EQVJEX0NBVEVHT1JZKTsKLQkJbWV0aG9kQ29udGVudExpc3QuYWRkKENVU1RPTV9DQVRFR09SWSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgTGlzdDxTdHJpbmc+IGd1aWRhbmNlTGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCXN0YXRpYyB7Ci0JCWd1aWRhbmNlTGlzdC5hZGQoQ0hFQ0tMSVNUKTsKLQkJZ3VpZGFuY2VMaXN0LmFkZChDT05DRVBUKTsKLQkJZ3VpZGFuY2VMaXN0LmFkZChFU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TKTsKLQkJZ3VpZGFuY2VMaXN0LmFkZChFWEFNUExFKTsKLQkJZ3VpZGFuY2VMaXN0LmFkZChHVUlERUxJTkUpOwotCQlndWlkYW5jZUxpc3QuYWRkKFBSQUNUSUNFKTsKLQkJZ3VpZGFuY2VMaXN0LmFkZChSRVBPUlQpOwotCQlndWlkYW5jZUxpc3QuYWRkKFJFVVNBQkxFX0FTU0VUKTsKLQkJZ3VpZGFuY2VMaXN0LmFkZChST0FETUFQKTsKLQkJZ3VpZGFuY2VMaXN0LmFkZChTVVBQT1JUSU5HX01BVEVSSUFMKTsKLQkJZ3VpZGFuY2VMaXN0LmFkZChURU1QTEFURSk7Ci0JCWd1aWRhbmNlTGlzdC5hZGQoVEVSTV9ERUZJTklUSU9OKTsKLQkJZ3VpZGFuY2VMaXN0LmFkZChUT09MX01FTlRPUik7Ci0JCWd1aWRhbmNlTGlzdC5hZGQoV0hJVEVQQVBFUik7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgTGlzdDxTdHJpbmc+IHByb2Nlc3NMaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0Jc3RhdGljIHsKLQkJcHJvY2Vzc0xpc3QuYWRkKENBUEFCSUxJVFlfUEFUVEVSTik7Ci0JCXByb2Nlc3NMaXN0LmFkZChERUxJVkVSWV9QUk9DRVNTKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBMaXN0PFN0cmluZz4gaGFzQ2hpbGRyZW5MaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0Jc3RhdGljIHsKLQkJaGFzQ2hpbGRyZW5MaXN0LmFkZChST09UKTsKLQkJaGFzQ2hpbGRyZW5MaXN0LmFkZChNRVRIT0RfQ09OVEVOVCk7Ci0JCWhhc0NoaWxkcmVuTGlzdC5hZGQoR1VJREFOQ0UpOwotCQloYXNDaGlsZHJlbkxpc3QuYWRkKFBST0NFU1MpOwotCX0KLQotCXByb3RlY3RlZCBDaGVja2JveFRyZWVWaWV3ZXIgdmlld2VyOwotCi0JLyoqCi0JICogVGhlIGNvbnRlbnQgcHJvdmlkZXIgZm9yIHRoZSB2aWV3ZXIuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgVmlld2VyQ29udGVudFByb3ZpZGVyIGltcGxlbWVudHMgSVRyZWVDb250ZW50UHJvdmlkZXIgewotCi0JCXByaXZhdGUgZmluYWwgT2JqZWN0W10gRU1QVFlfTElTVCA9IG5ldyBPYmplY3RbMF07Ci0KLQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBwYXJlbnQpIHsKLQkJCWlmIChwYXJlbnQgPT0gUk9PVCkgewotCQkJCXJldHVybiBnZXRDaGlsZHJlbihST09UKTsKLQkJCX0KLQkJCXJldHVybiBnZXRDaGlsZHJlbihwYXJlbnQpOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdFtdIGdldENoaWxkcmVuKE9iamVjdCBwYXJlbnQpIHsKLQkJCWlmIChwYXJlbnQgPT0gUk9PVCkgewotCQkJCXJldHVybiByb290TGlzdC50b0FycmF5KCk7Ci0JCQl9IGVsc2UgaWYgKHBhcmVudCA9PSBNRVRIT0RfQ09OVEVOVCkgewotCQkJCXJldHVybiBtZXRob2RDb250ZW50TGlzdC50b0FycmF5KCk7Ci0JCQl9IGVsc2UgaWYgKHBhcmVudCA9PSBHVUlEQU5DRSkgewotCQkJCXJldHVybiBndWlkYW5jZUxpc3QudG9BcnJheSgpOwotCQkJfSBlbHNlIGlmIChwYXJlbnQgPT0gUFJPQ0VTUykgewotCQkJCXJldHVybiBwcm9jZXNzTGlzdC50b0FycmF5KCk7Ci0JCQl9Ci0JCQlyZXR1cm4gRU1QVFlfTElTVDsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBjaGlsZCkgewotCQkJaWYgKHJvb3RMaXN0LmNvbnRhaW5zKGNoaWxkKSkgewotCQkJCXJldHVybiBST09UOwotCQkJfQotCQkJaWYgKG1ldGhvZENvbnRlbnRMaXN0LmNvbnRhaW5zKGNoaWxkKSkgewotCQkJCXJldHVybiBNRVRIT0RfQ09OVEVOVDsKLQkJCX0gZWxzZSBpZiAoZ3VpZGFuY2VMaXN0LmNvbnRhaW5zKGNoaWxkKSkgewotCQkJCXJldHVybiBHVUlEQU5DRTsKLQkJCX0gZWxzZSBpZiAocHJvY2Vzc0xpc3QuY29udGFpbnMoY2hpbGQpKSB7Ci0JCQkJcmV0dXJuIFBST0NFU1M7Ci0JCQl9Ci0JCQlyZXR1cm4gRU1QVFlfTElTVDsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKE9iamVjdCBwYXJlbnQpIHsKLQkJCXJldHVybiBoYXNDaGlsZHJlbkxpc3QuY29udGFpbnMocGFyZW50KTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgYXJnMCwgT2JqZWN0IGFyZzEsIE9iamVjdCBhcmcyKSB7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBUaGUgbGFiZWwgcHJvdmlkZXIgZm9yIHRoZSB2aWV3ZXIuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgVmlld2VyTGFiZWxQcm92aWRlciBleHRlbmRzIExhYmVsUHJvdmlkZXIgewotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqKSB7Ci0JCQlyZXR1cm4gb2JqLnRvU3RyaW5nKCk7Ci0JCX0KLQotCQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IG9iaikgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBib29sZWFuIHNob3VsZFBhcmVudEdyYXllZChPYmplY3Qgc2VsZWN0ZWRFbGVtZW50KSB7Ci0JCUlUcmVlQ29udGVudFByb3ZpZGVyIGNwID0gKElUcmVlQ29udGVudFByb3ZpZGVyKSB2aWV3ZXIuZ2V0Q29udGVudFByb3ZpZGVyKCk7Ci0JCU9iamVjdCBwYXJlbnQgPSBjcC5nZXRQYXJlbnQoc2VsZWN0ZWRFbGVtZW50KTsKLQkJaWYgKHBhcmVudCAhPSBudWxsICYmIHBhcmVudCAhPSBST09UKSB7Ci0JCQlPYmplY3RbXSBjaGlsZHJlbiA9IGNwLmdldENoaWxkcmVuKHBhcmVudCk7Ci0JCQlib29sZWFuIGdyYXllZCA9IGZhbHNlOwotCQkJYm9vbGVhbiBjaGVja2VkID0gZmFsc2U7Ci0JCQlmb3IgKE9iamVjdCBjaGlsZCA6IGNoaWxkcmVuKSB7Ci0JCQkJaWYoIWNoZWNrZWQpIHsKLQkJCQkJY2hlY2tlZCA9IHZpZXdlci5nZXRDaGVja2VkKGNoaWxkKTsKLQkJCQkJaWYoY2hlY2tlZCAmJiBncmF5ZWQpIHsKLQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQl9Ci0JCQkJfQotCQkJCWlmICghdmlld2VyLmdldENoZWNrZWQoY2hpbGQpIHx8IHZpZXdlci5nZXRHcmF5ZWQoY2hpbGQpKSB7Ci0JCQkJCWlmKGNoZWNrZWQpIHsKLQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQl9Ci0JCQkJCWdyYXllZCA9IHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNoZWNrUGFyZW50KE9iamVjdCBzZWxlY3RlZEVsZW1lbnQpIHsKLQkJSVRyZWVDb250ZW50UHJvdmlkZXIgY3AgPSAoSVRyZWVDb250ZW50UHJvdmlkZXIpIHZpZXdlci5nZXRDb250ZW50UHJvdmlkZXIoKTsKLQkJT2JqZWN0IHBhcmVudCA9IGNwLmdldFBhcmVudChzZWxlY3RlZEVsZW1lbnQpOwotCQlpZiAocGFyZW50ICE9IG51bGwgJiYgcGFyZW50ICE9IFJPT1QpIHsKLQkJCU9iamVjdFtdIGNoaWxkcmVuID0gY3AuZ2V0Q2hpbGRyZW4ocGFyZW50KTsKLQkJCWJvb2xlYW4gZ3JheWVkID0gZmFsc2U7Ci0JCQlmb3IgKE9iamVjdCBjaGlsZCA6IGNoaWxkcmVuKSB7Ci0JCQkJaWYgKCF2aWV3ZXIuZ2V0Q2hlY2tlZChjaGlsZCkgfHwgdmlld2VyLmdldEdyYXllZChjaGlsZCkpIHsKLQkJCQkJZ3JheWVkID0gdHJ1ZTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQkJaWYgKGdyYXllZCkgewotCQkJCXZpZXdlci5zZXRHcmF5Q2hlY2tlZChwYXJlbnQsIHRydWUpOwotCQkJCQotCQkJCS8vIGNoZWNrIGFsbCBvdGhlciBwYXJlbnRzIGdyYXllZCBhcyB3ZWxsCi0JCQkJLy8KLQkJCQlmb3IocGFyZW50ID0gY3AuZ2V0UGFyZW50KHBhcmVudCk7IHBhcmVudCAhPSBudWxsICYmIHBhcmVudCAhPSBST09UOyBwYXJlbnQgPSBjcC5nZXRQYXJlbnQocGFyZW50KSkgewotCQkJCQl2aWV3ZXIuc2V0R3JheUNoZWNrZWQocGFyZW50LCB0cnVlKTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCXZpZXdlci5zZXRDaGVja2VkKHBhcmVudCwgdHJ1ZSk7Ci0JCQkJdmlld2VyLnNldFBhcmVudHNHcmF5ZWQoc2VsZWN0ZWRFbGVtZW50LCBmYWxzZSk7Ci0JCQkJY2hlY2tQYXJlbnQocGFyZW50KTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIE1ldGhvZFNlYXJjaFNjb3BlVmlld2VyKENvbXBvc2l0ZSBwYXJlbnQsIGludCBzdHlsZSkgewotCQl2aWV3ZXIgPSBuZXcgQ2hlY2tib3hUcmVlVmlld2VyKHBhcmVudCwgc3R5bGUpOwotCQl2aWV3ZXIuZ2V0VHJlZSgpLnNldExheW91dChuZXcgR3JpZExheW91dCgxLCBmYWxzZSkpOwotCQl2aWV3ZXIuZ2V0VHJlZSgpLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCQl2aWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBWaWV3ZXJDb250ZW50UHJvdmlkZXIoKSk7Ci0JCXZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKG5ldyBWaWV3ZXJMYWJlbFByb3ZpZGVyKCkpOwotCQl2aWV3ZXIuc2V0SW5wdXQoUk9PVCk7Ci0JCXZpZXdlci5leHBhbmRUb0xldmVsKDIpOwotCQl2aWV3ZXIuc2V0U3VidHJlZUNoZWNrZWQoTUVUSE9EX0NPTlRFTlQsIHRydWUpOwotCQl2aWV3ZXIuc2V0U3VidHJlZUNoZWNrZWQoUFJPQ0VTUywgdHJ1ZSk7Ci0JCXZpZXdlci5hZGRDaGVja1N0YXRlTGlzdGVuZXIobmV3IElDaGVja1N0YXRlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBjaGVja1N0YXRlQ2hhbmdlZChDaGVja1N0YXRlQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJT2JqZWN0IHNlbGVjdGVkRWxlbWVudCA9IGV2ZW50LmdldEVsZW1lbnQoKTsKLQkJCQl2aWV3ZXIuc2V0U3VidHJlZUNoZWNrZWQoc2VsZWN0ZWRFbGVtZW50LCBldmVudC5nZXRDaGVja2VkKCkpOwotCQkJCWlmICghZXZlbnQuZ2V0Q2hlY2tlZCgpKSB7Ci0JCQkJCWlmKHNob3VsZFBhcmVudEdyYXllZChzZWxlY3RlZEVsZW1lbnQpKSB7Ci0JCQkJCQl2aWV3ZXIuc2V0UGFyZW50c0dyYXllZChzZWxlY3RlZEVsZW1lbnQsIHRydWUpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJSVRyZWVDb250ZW50UHJvdmlkZXIgY3AgPSAoSVRyZWVDb250ZW50UHJvdmlkZXIpIHZpZXdlci5nZXRDb250ZW50UHJvdmlkZXIoKTsKLQkJCQkJCU9iamVjdCBwYXJlbnQgPSBjcC5nZXRQYXJlbnQoc2VsZWN0ZWRFbGVtZW50KTsKLQkJCQkJCWlmKHBhcmVudCAhPSBudWxsKSB7Ci0JCQkJCQkJdmlld2VyLnNldEdyYXlDaGVja2VkKHBhcmVudCwgZmFsc2UpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCXZpZXdlci5zZXRHcmF5Q2hlY2tlZChzZWxlY3RlZEVsZW1lbnQsIGZhbHNlKTsKLQkJCQkJLy8gc2V0IGdyYXkgdG8gZmFsc2UgZm9yIGl0ZW1zIHRoYXQgYXJlIHVuY2hlY2tlZAotCQkJCQkvLwotCQkJCQlmb3IgKE9iamVjdCBlbGVtZW50IDogdmlld2VyLmdldEdyYXllZEVsZW1lbnRzKCkpIHsKLQkJCQkJCWlmKCF2aWV3ZXIuZ2V0Q2hlY2tlZChlbGVtZW50KSkgewotCQkJCQkJCXZpZXdlci5zZXRHcmF5ZWQoZWxlbWVudCwgZmFsc2UpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfSBlbHNlIHsJCQotCQkJCQljaGVja1BhcmVudChzZWxlY3RlZEVsZW1lbnQpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2VsZWN0ZWQgbWV0aG9kIGVsZW1lbnQgdHlwZXMuCi0JICogCi0JICogQHJldHVybiBhbiBhcnJheSBvZiBzZWxlY3RlZCBtZXRob2QgZWxlbWVudCB0eXBlcwotCSAqLwotCXB1YmxpYyBNZXRob2RTZWFyY2hTY29wZSBnZXRTZWFyY2hTY29wZSgpIHsKLQkJcmV0dXJuIG5ldyBNZXRob2RTZWFyY2hTY29wZSh2aWV3ZXIuZ2V0Q2hlY2tlZEVsZW1lbnRzKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvdWkvaW50ZXJuYWwvU2VhcmNoUmVzdWx0VGFibGVDb250ZW50UHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvdWkvaW50ZXJuYWwvU2VhcmNoUmVzdWx0VGFibGVDb250ZW50UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWMxMDM0Mi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL3VpL2ludGVybmFsL1NlYXJjaFJlc3VsdFRhYmxlQ29udGVudFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotCi0vKioKLSAqIFRoZSBjb250ZW50IHByb3ZpZGVyIGZvciB0aGUgbWV0aG9kIHNlYXJjaCByZXN1bHQgdGFibGUgdmlld2VyLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFNlYXJjaFJlc3VsdFRhYmxlQ29udGVudFByb3ZpZGVyIGltcGxlbWVudHMKLQkJSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgT2JqZWN0W10gRU1QVFlfTElTVCA9IG5ldyBPYmplY3RbMF07Ci0KLQlwcml2YXRlIFRhYmxlVmlld2VyIHRhYmxlVmlld2VyOwotCi0JcHJpdmF0ZSBNZXRob2RTZWFyY2hSZXN1bHQgc2VhcmNoUmVzdWx0OwotCi0JLyoqCi0JICogQHNlZSBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciNnZXRFbGVtZW50cyhPYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dEVsZW1lbnQpIHsKLQkJaWYgKGlucHV0RWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZFNlYXJjaFJlc3VsdCkgewotCQkJcmV0dXJuICgoTWV0aG9kU2VhcmNoUmVzdWx0KSBpbnB1dEVsZW1lbnQpLmdldEVsZW1lbnRzKCk7Ci0JCX0KLQkJcmV0dXJuIEVNUFRZX0xJU1Q7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvbGRJbnB1dCwgT2JqZWN0IG5ld0lucHV0KSB7Ci0JCWlmIChuZXdJbnB1dCAhPSBudWxsICYmIG5ld0lucHV0IGluc3RhbmNlb2YgTWV0aG9kU2VhcmNoUmVzdWx0KSB7Ci0JCQl0YWJsZVZpZXdlciA9IChUYWJsZVZpZXdlcikgdmlld2VyOwotCQkJc2VhcmNoUmVzdWx0ID0gKE1ldGhvZFNlYXJjaFJlc3VsdCkgbmV3SW5wdXQ7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBlbGVtZW50c0NoYW5nZWQoT2JqZWN0W10gdXBkYXRlZEVsZW1lbnRzKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdXBkYXRlZEVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoc2VhcmNoUmVzdWx0LmdldE1hdGNoQ291bnQodXBkYXRlZEVsZW1lbnRzW2ldKSA+IDApIHsKLQkJCQlpZiAodGFibGVWaWV3ZXIudGVzdEZpbmRJdGVtKHVwZGF0ZWRFbGVtZW50c1tpXSkgIT0gbnVsbCkgewotCQkJCQl0YWJsZVZpZXdlci5yZWZyZXNoKHVwZGF0ZWRFbGVtZW50c1tpXSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJdGFibGVWaWV3ZXIuYWRkKHVwZGF0ZWRFbGVtZW50c1tpXSk7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQl0YWJsZVZpZXdlci5yZW1vdmUodXBkYXRlZEVsZW1lbnRzW2ldKTsKLQkJCX0KLQkJfQotCQl0YWJsZVZpZXdlci5yZWZyZXNoKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgY2xlYXIoKSB7Ci0JCXRhYmxlVmlld2VyLnJlZnJlc2goKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC91aS9pbnRlcm5hbC9TZWFyY2hSZXN1bHRUcmVlQ29udGVudFByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL3VpL2ludGVybmFsL1NlYXJjaFJlc3VsdFRyZWVDb250ZW50UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTE1M2Y3Zi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL3VpL2ludGVybmFsL1NlYXJjaFJlc3VsdFRyZWVDb250ZW50UHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkucHJvdmlkZXJzLkFic3RyYWN0RWxlbWVudFRyZWVDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotCi0vKioKLSAqIFRoZSBjb250ZW50IHByb3ZpZGVyIGZvciB0aGUgbWV0aG9kIHNlYXJjaCByZXN1bHQgdHJlZSB2aWV3ZXIuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgUGllcnJlIFBhZG92YW5pCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBTZWFyY2hSZXN1bHRUcmVlQ29udGVudFByb3ZpZGVyIGV4dGVuZHMgQWJzdHJhY3RFbGVtZW50VHJlZUNvbnRlbnRQcm92aWRlciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3RbXSBFTVBUWV9MSVNUID0gbmV3IE9iamVjdFswXTsKLQotCXByaXZhdGUgTWV0aG9kU2VhcmNoUmVzdWx0IHNlYXJjaFJlc3VsdDsKLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIjZ2V0RWxlbWVudHMoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGlucHV0RWxlbWVudCkgewotCQlpZiAoaW5wdXRFbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kU2VhcmNoUmVzdWx0KSB7Ci0JCQlPYmplY3RbXSBlbGVtZW50cyA9ICgoTWV0aG9kU2VhcmNoUmVzdWx0KSBpbnB1dEVsZW1lbnQpCi0JCQkJCS5nZXRFbGVtZW50cygpOwotCQkJaWYgKGVsZW1lbnRzLmxlbmd0aCA9PSAwKSB7Ci0JCQkJcmV0dXJuIEVNUFRZX0xJU1Q7Ci0JCQl9Ci0JCQlnZXRFbGVtZW50TWFwKCkuY2xlYXIoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHsKLQkJCQlpbnNlcnQoZWxlbWVudHNbaV0sIGZhbHNlKTsKLQkJCX0KLQotCQkJaW5zZXJ0VUlGb2xkZXJzKGlucHV0RWxlbWVudCk7Ci0JCX0KLQkJcmV0dXJuIGdldENoaWxkcmVuKGlucHV0RWxlbWVudCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ29udGVudFByb3ZpZGVyI2lucHV0Q2hhbmdlZChvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlciwgamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpIHsKLQkJaWYgKG5ld0lucHV0ICE9IG51bGwgJiYgbmV3SW5wdXQgaW5zdGFuY2VvZiBNZXRob2RTZWFyY2hSZXN1bHQpIHsKLQkJCXNldFRyZWVWaWV3ZXIoKFRyZWVWaWV3ZXIpIHZpZXdlcik7Ci0JCQlzZWFyY2hSZXN1bHQgPSAoTWV0aG9kU2VhcmNoUmVzdWx0KSBuZXdJbnB1dDsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSB1cGRhdGVkRWxlbWVudHMKLQkgKi8KLQlwdWJsaWMgdm9pZCBlbGVtZW50c0NoYW5nZWQoT2JqZWN0W10gdXBkYXRlZEVsZW1lbnRzKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdXBkYXRlZEVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoc2VhcmNoUmVzdWx0LmdldE1hdGNoQ291bnQodXBkYXRlZEVsZW1lbnRzW2ldKSA+IDApIHsKLQkJCQlpZiAoZ2V0VHJlZVZpZXdlcigpLnRlc3RGaW5kSXRlbSh1cGRhdGVkRWxlbWVudHNbaV0pICE9IG51bGwpIHsKLQkJCQkJaW5zZXJ0KHVwZGF0ZWRFbGVtZW50c1tpXSwgdHJ1ZSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJcmVtb3ZlKHVwZGF0ZWRFbGVtZW50c1tpXSwgdHJ1ZSk7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlnZXRUcmVlVmlld2VyKCkucmVtb3ZlKHVwZGF0ZWRFbGVtZW50c1tpXSk7Ci0JCQl9Ci0JCX0KLQkJZ2V0VHJlZVZpZXdlcigpLnJlZnJlc2goKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5wcm92aWRlcnMuQWJzdHJhY3RFbGVtZW50VHJlZUNvbnRlbnRQcm92aWRlciNyZW1vdmUoamF2YS5sYW5nLk9iamVjdCwgYm9vbGVhbikKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmUoT2JqZWN0IGVsZW1lbnQsIGJvb2xlYW4gcmVmcmVzaFZpZXdlcikgewotCQlpZiAoaGFzQ2hpbGRyZW4oZWxlbWVudCkpIHsKLQkJCWlmIChyZWZyZXNoVmlld2VyKSB7Ci0JCQkJZ2V0VHJlZVZpZXdlcigpLnJlZnJlc2goZWxlbWVudCk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoc2VhcmNoUmVzdWx0LmdldE1hdGNoQ291bnQoZWxlbWVudCkgPT0gMCkgewotCQkJCWdldEVsZW1lbnRNYXAoKS5yZW1vdmUoZWxlbWVudCk7Ci0JCQkJT2JqZWN0IHBhcmVudCA9IGdldFBhcmVudChlbGVtZW50KTsKLQkJCQlpZiAocGFyZW50ICE9IG51bGwpIHsKLQkJCQkJcmVtb3ZlRnJvbVNpYmxpbmdzKGVsZW1lbnQsIHBhcmVudCk7Ci0JCQkJCXJlbW92ZShwYXJlbnQsIHJlZnJlc2hWaWV3ZXIpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXJlbW92ZUZyb21TaWJsaW5ncyhlbGVtZW50LCBzZWFyY2hSZXN1bHQpOwotCQkJCQlpZiAocmVmcmVzaFZpZXdlcikgewotCQkJCQkJZ2V0VHJlZVZpZXdlcigpLnJlZnJlc2goKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKHJlZnJlc2hWaWV3ZXIpIHsKLQkJCQkJZ2V0VHJlZVZpZXdlcigpLnJlZnJlc2goZWxlbWVudCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkucHJvdmlkZXJzLkFic3RyYWN0RWxlbWVudFRyZWVDb250ZW50UHJvdmlkZXIjZ2V0Q29udGVudFNvdXJjZSgpCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBnZXRDb250ZW50U291cmNlKCkgewotCQlyZXR1cm4gc2VhcmNoUmVzdWx0OwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvdWkvaW50ZXJuYWwvcGFja2FnZS5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC91aS9pbnRlcm5hbC9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmY2JjMmUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC91aS9pbnRlcm5hbC9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyBpbXBsZW1lbnRhdGlvbiBzdXBwb3J0IGZvciBzZWFyY2hpbmcgYSBtZXRob2QgbGlicmFyeS4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL3VpL3BhY2thZ2UuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvdWkvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZDU2MTIxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvdWkvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgdGhlIGltcGxlbWVudGF0aW9uIGZvciBzZWFyY2hpbmcgYSBtZXRob2QgbGlicmFyeS4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL3VpL3ByZWZlcmVuY2VzL1NlYXJjaFVJUHJlZmVyZW5jZXMuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvdWkvcHJlZmVyZW5jZXMvU2VhcmNoVUlQcmVmZXJlbmNlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZTFlNTc3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvdWkvcHJlZmVyZW5jZXMvU2VhcmNoVUlQcmVmZXJlbmNlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS5wcmVmZXJlbmNlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkuU2VhcmNoVUlQbHVnaW47Ci0KLS8qKgotICogTWFuYWdlcyB0aGUgU2VhcmNoIFVJIHByZWZlcmVuY2VzLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBTZWFyY2hVSVByZWZlcmVuY2VzIHsKLQotCS8qKgotCSAqIFRoZSBTZWFyY2ggVUkgcHJlZmVyZW5jZSBrZXlzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFQVJDSF9TVFJJTkcgPSAic2VhcmNoU3RyaW5nIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9QQVRURVJOID0gIm5hbWVQYXR0ZXJuIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0FTRV9TRU5TSVRJVkUgPSAiY2FzZVNlbnNpdGl2ZSI7IC8vJE5PTi1OTFMtMSQJCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzYXZlZCBzZWFyY2ggc3RyaW5nLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFNlYXJjaFN0cmluZygpIHsKLQkJcmV0dXJuIFNlYXJjaFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKS5nZXRTdHJpbmcoCi0JCQkJU0VBUkNIX1NUUklORyk7Ci0JfQotCi0JLyoqCi0JICogU2F2ZXMgdGhlIGN1cnJlbnQgc2VhcmNoIHN0cmluZy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0U2VhcmNoU3RyaW5nKFN0cmluZyBzZWFyY2hTdHJpbmcpIHsKLQkJU2VhcmNoVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpLnNldFZhbHVlKAotCQkJCVNFQVJDSF9TVFJJTkcsIHNlYXJjaFN0cmluZyk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2F2ZWQgbmFtZSBwYXR0ZXJuIHN0cmluZy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXROYW1lUGF0dGVybigpIHsKLQkJcmV0dXJuIFNlYXJjaFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKS5nZXRTdHJpbmcoCi0JCQkJTkFNRV9QQVRURVJOKTsKLQl9Ci0KLQkvKioKLQkgKiBTYXZlcyB0aGUgY3VycmVudCBuYW1lIHBhdHRlcm4gc3RyaW5nLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXROYW1lUGF0dGVybihTdHJpbmcgbmFtZVBhdHRlcm4pIHsKLQkJU2VhcmNoVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpLnNldFZhbHVlKE5BTUVfUEFUVEVSTiwKLQkJCQluYW1lUGF0dGVybik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2F2ZWQgYXNlIHNlbnNpdGl2ZSBvcHRpb24uCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGdldENhc2VTZW5zaXRpdmUoKSB7Ci0JCXJldHVybiBTZWFyY2hVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkuZ2V0Qm9vbGVhbigKLQkJCQlDQVNFX1NFTlNJVElWRSk7Ci0JfQotCi0JLyoqCi0JICogU2F2ZXMgdGhlIGN1cnJlbnQgY2FzZSBzZW5zaXRpdmUgb3B0aW9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRDYXNlU2Vuc2l0aXZlKGJvb2xlYW4gY2FzZVNlbnNpdGl2ZSkgewotCQlTZWFyY2hVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkuc2V0VmFsdWUoCi0JCQkJQ0FTRV9TRU5TSVRJVkUsIGNhc2VTZW5zaXRpdmUpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL3VpL3ByZWZlcmVuY2VzL3BhY2thZ2UuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvdWkvcHJlZmVyZW5jZXMvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MTAzOWVkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvdWkvcHJlZmVyZW5jZXMvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgcHJlZmVyZW5jZSBzdXBwb3J0IGZvciBzZWFyY2hpbmcgYSBtZXRob2QgbGlicmFyeS4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLy5jbGFzc3BhdGggYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2NWFjMDYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC8ucHJvamVjdCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkYTUzYWQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmVwZi5zZWFyY2g8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC9NRVRBLUlORi9NQU5JRkVTVC5NRiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2NTc5ZTYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5lcGYuc2VhcmNoCi1CdW5kbGUtVmVyc2lvbjogMS41LjAucXVhbGlmaWVyCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5lcGYuc2VhcmNoLlNlYXJjaFBsdWdpbgotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1SZXF1aXJlLUJ1bmRsZTogY29tLmlibS5pY3UsCi0gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLAotIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5O3Zpc2liaWxpdHk6PXJlZXhwb3J0LAotIG9yZy5hcGFjaGUubHVjZW5lO3Zpc2liaWxpdHk6PXJlZXhwb3J0LAotIG9yZy5lY2xpcHNlLnNlYXJjaCwKLSBvcmcuZWNsaXBzZS5oZWxwLmJhc2UKLUVjbGlwc2UtTGF6eVN0YXJ0OiB0cnVlCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuZXBmLnNlYXJjaCwKLSBvcmcuZWNsaXBzZS5lcGYuc2VhcmNoLmFuYWx5c2lzLAotIG9yZy5lY2xpcHNlLmVwZi5zZWFyY2guY29uZmlndXJhdGlvbgotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoL2J1aWxkLnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3ZDZmNTUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1zb3VyY2UuLiA9IHNyYy8KLW91dHB1dC4uID0gYmluLwotYmluLmluY2x1ZGVzID0gLixcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMKLQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC9wbHVnaW4ucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmYzcwMzEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSCi0KLSMgUGx1Zy1pbgotcGx1Z2luTmFtZT1FUEYgU2VhcmNoCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKLSAgICAgICAgICAgICAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvR2VuZXJhdGVTZWFyY2hJbmRleEV4Y2VwdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC9HZW5lcmF0ZVNlYXJjaEluZGV4RXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmNmU3YzEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC9HZW5lcmF0ZVNlYXJjaEluZGV4RXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuc2VhcmNoOwotCi0vKioKLSAqIFNpZ25hbHMgdGhhdCBhIHNlYXJjaCBpbmRleCBnZW5lcmF0aW9uIG9wZXJhdGlvbiBoYXMgZmFpbGVkLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEdlbmVyYXRlU2VhcmNoSW5kZXhFeGNlcHRpb24gZXh0ZW5kcyBTZWFyY2hTZXJ2aWNlRXhjZXB0aW9uIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDY1Mzc0MDUyMTE0NTExNzcxMTBMOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgR2VuZXJhdGVTZWFyY2hJbmRleEV4Y2VwdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIGdpdmVuIHRoZSByb290IGNhdXNlIG9mIHRoZSBleGNlcHRpb24uCi0JICogCi0JICogQHBhcmFtIHJvb3RDYXVzZQotCSAqICAgICAgICAgICAgdGhlIHJvb3QgY2F1c2Ugb2YgdGhlIGV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBHZW5lcmF0ZVNlYXJjaEluZGV4RXhjZXB0aW9uKFRocm93YWJsZSByb290Q2F1c2UpIHsKLQkJc3VwZXIocm9vdENhdXNlKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIGdpdmVuIHRoZSBlcnJvciBtZXNzYWdlLgotCSAqIAotCSAqIEBwYXJhbSBlcnJvck1zZwotCSAqICAgICAgICAgICAgdGhlIGVycm9yIG1lc3NhZ2UKLQkgKi8KLQlwdWJsaWMgR2VuZXJhdGVTZWFyY2hJbmRleEV4Y2VwdGlvbihTdHJpbmcgZXJyb3JNc2cpIHsKLQkJc3VwZXIoZXJyb3JNc2cpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UgZ2l2ZW4gdGhlIHJvb3QgY2F1c2Ugb2YgdGhlIGV4Y2VwdGlvbiBhbmQgdGhlCi0JICogZXJyb3IgbWVzc2FnZS4KLQkgKiAKLQkgKiBAcGFyYW0gcm9vdENhdXNlCi0JICogICAgICAgICAgICB0aGUgcm9vdCBjYXVzZSBvZiB0aGUgZXhjZXB0aW9uCi0JICogQHBhcmFtIGVycm9yTXNnCi0JICogICAgICAgICAgICB0aGUgZXJyb3IgbWVzc2FnZQotCSAqLwotCXB1YmxpYyBHZW5lcmF0ZVNlYXJjaEluZGV4RXhjZXB0aW9uKFRocm93YWJsZSByb290Q2F1c2UsIFN0cmluZyBlcnJvck1zZykgewotCQlzdXBlcihyb290Q2F1c2UsIGVycm9yTXNnKTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL0lTZWFyY2hTZXJ2aWNlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL0lTZWFyY2hTZXJ2aWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwOWEyMTUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC9JU2VhcmNoU2VydmljZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnNlYXJjaDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZWFyY2guY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uSGl0RW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb25TZWFyY2hRdWVyeTsKLQotLyoqCi0gKiBUaGUgU2VhcmNoIFNlcnZpY2UgQVBJLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJU2VhcmNoU2VydmljZSB7Ci0KLQkvKioKLQkgKiBTZWFyY2hlcyBhIHB1Ymxpc2hlZCBjb25maWd1cmF0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBwYXRoCi0JICogICAgICAgICAgICBhbiBhYnNvbHV0ZSBwYXRoIHRvIGEgcHVibGlzaGVkIGNvbmZpZ3VyYXRpb24KLQkgKiBAcGFyYW0gc2VhcmNoUXVlcnkKLQkgKiAgICAgICAgICAgIGEgY29uZmlndXJhdGlvbiBzZWFyY2ggcXVlcnkKLQkgKiBAcmV0dXJuIGFuIGFycmF5IG9mIDxjb2RlPkNvbmZpZ3VyYXRpb25IaXRFbnRyeTwvY29kZT4gb2JqZWN0cwotCSAqIEB0aHJvd3MgU2VhcmNoU2VydmljZUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycyB3aGlsZSBleGVjdXRpbmcgdGhlIG9wZXJhdGlvbgotCSAqLwotCXB1YmxpYyBDb25maWd1cmF0aW9uSGl0RW50cnlbXSBzZWFyY2hDb25maWd1cmF0aW9uKFN0cmluZyBwYXRoLAotCQkJQ29uZmlndXJhdGlvblNlYXJjaFF1ZXJ5IHNlYXJjaFF1ZXJ5KSB0aHJvd3MgU2VhcmNoU2VydmljZUV4Y2VwdGlvbjsKLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC9JbmRleEJ1aWxkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvSW5kZXhCdWlsZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiNzkwNTEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC9JbmRleEJ1aWxkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxOCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuc2VhcmNoOwotCi1pbXBvcnQgamF2YS5pby5CdWZmZXJlZFdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlV3JpdGVyOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLlJlYWRlcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5EYXRlOwotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKLWltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKLQotaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLmFuYWx5c2lzLkFuYWx5emVyOwotaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLmFuYWx5c2lzLmNqay5DSktBbmFseXplcjsKLWltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5kb2N1bWVudC5Eb2N1bWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5kb2N1bWVudC5GaWVsZDsKLWltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5pbmRleC5JbmRleFdyaXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5zdG9yZS5GU0RpcmVjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VhcmNoLmFuYWx5c2lzLlRleHRBbmFseXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnV0aWxzLkphckNyZWF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51dGlscy5MSFRNTFBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnV0aWxzLlVOQ1V0aWw7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBpcyB0aGUgbWFpbiBjbGFzcyB0aGF0IGNyZWF0ZXMgdGhlIEluZGV4IGZyb20gdGhlIGZpbGUKLSAqIGFzc29jaWF0aW9ucyBpbiB0aGUgcHJvY2VzcyBsYXlvdXQuCi0gKi8KLXB1YmxpYyBjbGFzcyBJbmRleEJ1aWxkZXIgewotCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBWRVJTSU9OX0ZJTEVfTkFNRSA9ICJ2ZXJzaW9uLnR4dCI7IC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIFZFUlNJT05fREVMSU1JVEVSID0gIioiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBEb2N1bWVudCBmaWVsZHMuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlJJRUZfREVTQ1JJUFRJT05fRklFTEQgPSAiYnJpZWZEZXNjcmlwdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05URU5UX0ZJRUxEID0gImNvbnRlbnRzIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEX0ZJRUxEID0gImlkIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1PRElGSUVEX0ZJRUxEID0gIm1vZGlmaWVkIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfRklFTEQgPSAibmFtZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBST0xFX0ZJRUxEID0gInJvbGUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1VNTUFSWV9GSUVMRCA9ICJzdW1tYXJ5IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRZUEVfRklFTEQgPSAidHlwZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVUkxfRklFTEQgPSAidXJsIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRJVExFX0ZJRUxEID0gInRpdGxlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVNQV9FTEVNRU5UX1RZUEVfRklFTEQgPSAidW1hLnR5cGUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgR0VORVJBTF9DT05URU5UID0gImdlbmVyYWxfY29udGVudCI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIExpc3Qgb2YgVU1BIGVsZW1lbnRzIHRoYXQgc2hvdWxkIGJlIGluY2x1ZGVkIGluIHRoZSBzZWFyY2ggaW5kZXguCi0JcHJpdmF0ZSBzdGF0aWMgTGlzdCBOT19TRUFSQ0hFQUJMRV9VTUFfRUxFTUVOVFMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0Jc3RhdGljIHsKLQkJTk9fU0VBUkNIRUFCTEVfVU1BX0VMRU1FTlRTLmFkZCgic3VtbWFyeSIpOyAvLyROT04tTkxTLTEkCi0JCU5PX1NFQVJDSEVBQkxFX1VNQV9FTEVNRU5UUy5hZGQoIndvcmtwcm9kdWN0ZGVzY3JpcHRvciIpOyAvLyROT04tTkxTLTEkCi0JCU5PX1NFQVJDSEVBQkxFX1VNQV9FTEVNRU5UUy5hZGQoInRhc2tkZXNjcmlwdG9yIik7IC8vJE5PTi1OTFMtMSQKLQkJTk9fU0VBUkNIRUFCTEVfVU1BX0VMRU1FTlRTLmFkZCgicm9sZWRlc2NyaXB0b3IiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8vIEEgbGlzdCBvZiB0b3AgbGV2ZWwgZGlyZWN0b3JpZXMgdGhhdCBzaG91bGQgYmUgZXhjbHVkZWQgZnJvbSB0aGUgc2VhcmNoCi0JLy8gaW5kZXguCi0JcHVibGljIHN0YXRpYyBMaXN0IGRpcnNUb1NraXAgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgcERpcmVjdG9yeSA9IG51bGw7Ci0JcHJpdmF0ZSBTdHJpbmdCdWZmZXIgaW5kZXhGb2xkZXIgPSBudWxsOwotCXByaXZhdGUgU3RyaW5nIHByb2R1Y3ROYW1lID0gbnVsbDsKLQlwcml2YXRlIExpc3QgZmlsZXNUb1NraXAgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQlwdWJsaWMgSW5kZXhCdWlsZGVyKFN0cmluZyBwdWJsaXNoRGlyKSB7Ci0JCWludCBhcHBsZXRJbmRleCA9IC0xOwotCQlpZiAocHVibGlzaERpciA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCWFwcGxldEluZGV4ID0gcHVibGlzaERpci5pbmRleE9mKEZpbGUuc2VwYXJhdG9yICsgImFwcGxldCIpOyAvLyROT04tTkxTLTEkCi0KLQkJcERpcmVjdG9yeSA9IFVOQ1V0aWwuY29udmVydEZpbGVuYW1lKChhcHBsZXRJbmRleCA+IC0xKSA/IHB1Ymxpc2hEaXIKLQkJCQkuc3Vic3RyaW5nKDAsIGFwcGxldEluZGV4ICsgMSkgOiBwdWJsaXNoRGlyKTsKLQkJU3RyaW5nIHNpdGVOYW1lID0gcERpcmVjdG9yeS5yZXBsYWNlKEZpbGUuc2VwYXJhdG9yQ2hhciwgJy8nKTsKLQkJaW50IGluZGV4ID0gc2l0ZU5hbWUubGVuZ3RoKCk7Ci0JCWlmIChzaXRlTmFtZS5lbmRzV2l0aCgiLyIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCWluZGV4ID0gaW5kZXggLSAxOwotCQl9Ci0KLQkJaW50IGluZGV4MiA9IHNpdGVOYW1lLmxhc3RJbmRleE9mKCIvIiwgaW5kZXggLSAxKTsgLy8kTk9OLU5MUy0xJAotCi0JCXByb2R1Y3ROYW1lID0gc2l0ZU5hbWUuc3Vic3RyaW5nKGluZGV4MiArIDEsIGluZGV4KTsKLQotCQkvLyBjcmVhdGUgdGhlIGluZGV4Ci0JCVN0cmluZ0J1ZmZlciBzZWFyY2hGb2xkZXIgPSBuZXcgU3RyaW5nQnVmZmVyKHBEaXJlY3RvcnkpOwotCQlpZiAoIXNlYXJjaEZvbGRlci50b1N0cmluZygpLmVuZHNXaXRoKEZpbGUuc2VwYXJhdG9yKSkgewotCQkJc2VhcmNoRm9sZGVyLmFwcGVuZChGaWxlLnNlcGFyYXRvcik7Ci0JCX0KLQkJc2VhcmNoRm9sZGVyLmFwcGVuZCgic2VhcmNoIik7IC8vJE5PTi1OTFMtMSQKLQotCQlpbmRleEZvbGRlciA9IG5ldyBTdHJpbmdCdWZmZXIoc2VhcmNoRm9sZGVyLnRvU3RyaW5nKCkpOwotCQlpbmRleEZvbGRlci5hcHBlbmQoRmlsZS5zZXBhcmF0b3IpLmFwcGVuZCgiaW5kZXgiKTsgLy8kTk9OLU5MUy0xJAotCi0JCWRpcnNUb1NraXAuYWRkKHBEaXJlY3RvcnkgKyAiYXBwbGV0Iik7IC8vJE5PTi1OTFMtMSQKLQkJZGlyc1RvU2tpcC5hZGQocERpcmVjdG9yeSArICJjc3MiKTsgLy8kTk9OLU5MUy0xJAotCQlkaXJzVG9Ta2lwLmFkZChwRGlyZWN0b3J5ICsgImV4dF9oZWxwIik7IC8vJE5PTi1OTFMtMSQJCQotCQlkaXJzVG9Ta2lwLmFkZChwRGlyZWN0b3J5ICsgImljb25zIik7IC8vJE5PTi1OTFMtMSQKLQkJZGlyc1RvU2tpcC5hZGQocERpcmVjdG9yeSArICJpbWFnZXMiKTsgLy8kTk9OLU5MUy0xJAotCQlkaXJzVG9Ta2lwLmFkZChwRGlyZWN0b3J5ICsgImluZGV4Iik7IC8vJE5PTi1OTFMtMSQKLQkJZGlyc1RvU2tpcC5hZGQocERpcmVjdG9yeSArICJsb2dzIik7IC8vJE5PTi1OTFMtMSQKLQkJZGlyc1RvU2tpcC5hZGQocERpcmVjdG9yeSArICJtYW51YWxzIik7IC8vJE5PTi1OTFMtMSQJCQotCQlkaXJzVG9Ta2lwLmFkZChwRGlyZWN0b3J5ICsgIm5vYXBwbGV0Iik7IC8vJE5PTi1OTFMtMSQKLQkJZGlyc1RvU2tpcC5hZGQocERpcmVjdG9yeSArICJwYWdlc19ub3RfaW5zdGFsbGVkIik7IC8vJE5PTi1OTFMtMSQKLQkJZGlyc1RvU2tpcC5hZGQocERpcmVjdG9yeSArICJwcm9jZXNzIik7IC8vJE5PTi1OTFMtMSQJCQotCQlkaXJzVG9Ta2lwLmFkZChwRGlyZWN0b3J5ICsgInNjcmlwdHMiKTsgLy8kTk9OLU5MUy0xJAotCQlkaXJzVG9Ta2lwLmFkZChwRGlyZWN0b3J5ICsgInN0eWxlc2hlZXRzIik7IC8vJE5PTi1OTFMtMSQKLQkJZGlyc1RvU2tpcC5hZGQocERpcmVjdG9yeSArICJ4bWwiKTsgLy8kTk9OLU5MUy0xJAotCQlkaXJzVG9Ta2lwLmFkZChwRGlyZWN0b3J5ICsgInNlYXJjaCIpOyAvLyROT04tTkxTLTEkCi0KLQkJZmlsZXNUb1NraXAuYWRkKCJfZGVzYy5odG0iKTsgIC8vJE5PTi1OTFMtMSQKLQkJZmlsZXNUb1NraXAuYWRkKCJfd2JzLmh0bSIpOyAvLyROT04tTkxTLTEkCi0JCWZpbGVzVG9Ta2lwLmFkZCgiX3Ricy5odG0iKTsgLy8kTk9OLU5MUy0xJAotCQlmaWxlc1RvU2tpcC5hZGQoIl93cGJzLmh0bSIpOyAvLyROT04tTkxTLTEkCi0JfQotCQotCXB1YmxpYyBib29sZWFuIGNyZWF0ZUluZGV4KGJvb2xlYW4gamFySXQpIHRocm93cyBTZWFyY2hTZXJ2aWNlRXhjZXB0aW9uIHsKLQkJc3luY2hyb25pemVkIChJbmRleEJ1aWxkZXIuY2xhc3MpIHsKLQkJCQotCQkJaWYgKGluZGV4Rm9sZGVyID09IG51bGwgfHwgcERpcmVjdG9yeSA9PSBudWxsKSB7Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigKLQkJCQkJCSJJbnZhbGlkIGluZGV4Rm9sZGVyIG9yIHBEaXJlY3RvcnkiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCi0JCQkKLQkJCWJvb2xlYW4gamFrbyA9IGZhbHNlOwotCQkJTG9jYWxlIGxvY2FsZSA9IExvY2FsZS5nZXREZWZhdWx0KCk7Ci0JCQlTdHJpbmcgbGFuZyA9IGxvY2FsZS5nZXRMYW5ndWFnZSgpOwotCQkJaWYgKGxhbmcuZXF1YWxzKExvY2FsZS5KQVBBTkVTRS5nZXRMYW5ndWFnZSgpKSB8fAotCQkJCWxhbmcuZXF1YWxzKExvY2FsZS5LT1JFQS5nZXRMYW5ndWFnZSgpKSkgewotCQkJCWpha28gPSB0cnVlOwotCQkJfQotCQkJQW5hbHl6ZXIgYW5hbHl6ZXIgPSBqYWtvID8gbmV3IENKS0FuYWx5emVyKCkgOiBuZXcgVGV4dEFuYWx5emVyKCk7Ci0JCQkKLQkJCXRyeSB7Ci0JCQkJLy8gUkFNRGlyZWN0b3J5IHJhbURpciA9IG5ldyBSQU1EaXJlY3RvcnkoKTsKLQkJCQlJbmRleFdyaXRlciBmc1dyaXRlciA9IG5ldyBJbmRleFdyaXRlcihGU0RpcmVjdG9yeQotCQkJCQkJLmdldERpcmVjdG9yeShpbmRleEZvbGRlci50b1N0cmluZygpLCB0cnVlKSwKLQkJCQkJCWFuYWx5emVyLCB0cnVlKTsKLQotCQkJCS8vIEluZGV4V3JpdGVyIHJhbVdyaXRlciA9IG5ldyBJbmRleFdyaXRlcihyYW1EaXIsCi0JCQkJLy8gbmV3IFRleHRBbmFseXplcigpLCB0cnVlKTsKLQotCQkJCWlmICgoZnNXcml0ZXIgIT0gbnVsbCkpIHsKLQkJCQkJLy8gZnNXcml0ZXIubWVyZ2VGYWN0b3IgPSAxMDAwOwotCQkJCQkvLyBmc1dyaXRlci5tYXhNZXJnZURvY3MgPSAxMDAwMDsKLQkJCQkJZnNXcml0ZXIuc2V0TWF4RmllbGRMZW5ndGgoMTAwMDAwMCk7Ci0KLQkJCQkJaW5kZXhEb2NzKG5ldyBGaWxlKHBEaXJlY3RvcnkpLCBmc1dyaXRlcik7Ci0KLQkJCQkJLy8gZnNXcml0ZXIuYWRkSW5kZXhlcyhuZXcgRGlyZWN0b3J5W10geyByYW1EaXIgfSk7Ci0JCQkJCWZzV3JpdGVyLm9wdGltaXplKCk7Ci0JCQkJCS8vIHJhbVdyaXRlci5jbG9zZSgpOwotCQkJCQlmc1dyaXRlci5jbG9zZSgpOwotCQkJCX0KLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQotCQkJLy8gY3JlYXRlIHRoZSB2ZXJzaW9uIGZpbGUuCi0JCQlEYXRlIHRvZGF5ID0gbmV3IERhdGUoKTsKLQkJCWxvbmcgbWlsbGlzZWNvbmRzID0gdG9kYXkuZ2V0VGltZSgpOwotCi0JCQlpZiAoIWphckl0KSB7Ci0JCQkJdHJ5IHsKLQkJCQkJRmlsZVdyaXRlciBmdyA9IG5ldyBGaWxlV3JpdGVyKGluZGV4Rm9sZGVyICsgRmlsZS5zZXBhcmF0b3IKLQkJCQkJCQkrIFZFUlNJT05fRklMRV9OQU1FKTsKLQkJCQkJQnVmZmVyZWRXcml0ZXIgYncgPSBuZXcgQnVmZmVyZWRXcml0ZXIoZncpOwotCQkJCQlidy53cml0ZShwcm9kdWN0TmFtZSArIFZFUlNJT05fREVMSU1JVEVSICsgbWlsbGlzZWNvbmRzCi0JCQkJCQkJKyAiXG4iKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlpZiAoYW5hbHl6ZXIgaW5zdGFuY2VvZiBDSktBbmFseXplcikgewotCQkJCQkJYncud3JpdGUoIkNKS0FuYWx5emVyIiArICJcbiIpOyAvLyROT04tTkxTLTEkCS8vJE5PTi1OTFMtMiQKLQkJCQkJfQotCQkJCQlidy5jbG9zZSgpOwotCQkJCQlmdy5jbG9zZSgpOwotCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgewotCQkJCQl0aHJvdyBuZXcgU2VhcmNoU2VydmljZUV4Y2VwdGlvbigKLQkJCQkJCQlTZWFyY2hSZXNvdXJjZXMuY3JlYXRlU2VhcmNoSW5kZXhFcnJvcik7Ci0JCQkJfQotCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0KLQkJCS8vIGphciB1cCB0aGUgY3JlYXRlZCBpbmRleC4KLQkJCUphckNyZWF0b3IuamFyRm9sZGVyKGluZGV4Rm9sZGVyLnRvU3RyaW5nKCkpOwotCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oImluZGV4IEphcnJlZCBzdWNjZXNzZnVsbHkiKTsgLy8kTk9OLU5MUy0xJAotCi0JCQl0cnkgewotCQkJCS8vIGRlbGV0ZSB0aGUgZmlsZXMgbm93IHRoYXQgdGhleSd2ZSBiZWVuIGphcnJlZC4KLQkJCQlGaWxlIGluZGV4RGlyID0gbmV3IEZpbGUoaW5kZXhGb2xkZXIudG9TdHJpbmcoKSk7Ci0JCQkJRmlsZVtdIGZpbGVzID0gaW5kZXhEaXIubGlzdEZpbGVzKCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykgewotCQkJCQlGaWxlIHRlbXBGaWxlID0gZmlsZXNbaV07Ci0JCQkJCWlmICghdGVtcEZpbGUuZ2V0TmFtZSgpLmVxdWFscyhKYXJDcmVhdG9yLklOREVYX0pBUikpIHsKLQkJCQkJCXRlbXBGaWxlLmRlbGV0ZSgpOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJLy8gU3RyaW5nIHJ1cE5hbWUgPSBwdWJsaXNoRGlyLnN1YnN0cmluZyhpbmRleCk7Ci0JCQkJRmlsZSBuZXdJbmRleEphciA9IG5ldyBGaWxlKGluZGV4Rm9sZGVyICsgRmlsZS5zZXBhcmF0b3IKLQkJCQkJCSsgSmFyQ3JlYXRvci5JTkRFWF9KQVIpOwotCQkJCWlmIChuZXdJbmRleEphci5leGlzdHMoKSkgewotCQkJCQlTdHJpbmcgZmlsZVNpemUgPSAiIiArIG5ld0luZGV4SmFyLmxlbmd0aCgpOyAvLyROT04tTkxTLTEkCi0JCQkJCUZpbGVXcml0ZXIgZncgPSBuZXcgRmlsZVdyaXRlcihpbmRleEZvbGRlciArIEZpbGUuc2VwYXJhdG9yCi0JCQkJCQkJKyBWRVJTSU9OX0ZJTEVfTkFNRSk7Ci0JCQkJCUJ1ZmZlcmVkV3JpdGVyIGJ3ID0gbmV3IEJ1ZmZlcmVkV3JpdGVyKGZ3KTsKLQkJCQkJYncud3JpdGUocHJvZHVjdE5hbWUgKyBWRVJTSU9OX0RFTElNSVRFUiArIG1pbGxpc2Vjb25kcwotCQkJCQkJCSsgVkVSU0lPTl9ERUxJTUlURVIgKyBmaWxlU2l6ZSArICJcbiIpOyAvLyROT04tTkxTLTEkCi0JCQkJCWlmIChhbmFseXplciBpbnN0YW5jZW9mIENKS0FuYWx5emVyKSB7Ci0JCQkJCQlidy53cml0ZSgiQ0pLQW5hbHl6ZXIiICsgIlxuIik7IC8vJE5PTi1OTFMtMSQJLy8kTk9OLU5MUy0yJAotCQkJCQl9Ci0JCQkJCWJ3LmNsb3NlKCk7Ci0JCQkJCWZ3LmNsb3NlKCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJdGhyb3cgbmV3IFNlYXJjaFNlcnZpY2VFeGNlcHRpb24oCi0JCQkJCQkJU2VhcmNoUmVzb3VyY2VzLmNyZWF0ZVNlYXJjaEluZGV4RXJyb3IpOwotCQkJCX0KLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgewotCQkJCXRocm93IG5ldyBTZWFyY2hTZXJ2aWNlRXhjZXB0aW9uKAotCQkJCQkJU2VhcmNoUmVzb3VyY2VzLmNyZWF0ZVNlYXJjaEluZGV4RXJyb3IpOwotCQkJfQotCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEluZGV4IHRoZSBhY3R1YWwgZG9jdW1lbnRzIHNwZWNpZmllZCBieSB0aGUgZmlsZXMgYW5kIHJlY3Vyc2l2ZWx5IGdldCBhbGwKLQkgKiBmaWxlIGluIHRoZSBzcGVjaWZpZWQgZm9sZGVyIGZpbGUKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHZvaWQgaW5kZXhEb2NzKEZpbGUgZmlsZSwgSW5kZXhXcml0ZXIgd3JpdGVyKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJaWYgKGRpcnNUb1NraXAuY29udGFpbnMoZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSkpIHsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAoZmlsZS5pc0ZpbGUoKSkgewotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gZmlsZXNUb1NraXAuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJU3RyaW5nIGZpbGVUb1NraXAgPSAoU3RyaW5nKSBpdGVyLm5leHQoKTsKLQkJCQlpZiAoZmlsZS5nZXROYW1lKCkuaW5kZXhPZihmaWxlVG9Ta2lwKSA+IC0xKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlpZiAoZmlsZS5pc0RpcmVjdG9yeSgpKSB7Ci0JCQlTdHJpbmdbXSBmaWxlcyA9IGZpbGUubGlzdCgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykgewotCQkJCWluZGV4RG9jcyhuZXcgRmlsZShmaWxlLCBmaWxlc1tpXSksIHdyaXRlcik7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoaXNIdG1sRG9jKGZpbGUpKSB7Ci0JCQlpZiAoc2hvdWxkQmVFeGNsdWRlZChmaWxlKSkgewotCQkJCXJldHVybjsKLQkJCX0KLQkJCXRyeSB7Ci0JCQkJCi0JCQkJRG9jdW1lbnQgZG9jID0gZ2V0SFRNTERvY3VtZW50KGZpbGUpOwkJCi0JCQkJCi0JCQkJaWYgKGRvYyAhPSBudWxsKSB7Ci0JCQkJCXdyaXRlci5hZGREb2N1bWVudChkb2MpOwkJCQkKLQkJCQl9Ci0JCQkJCi0JCQl9IGNhdGNoIChFeGNlcHRpb24gZTEpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oZmlsZS5nZXROYW1lKCkpOwotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiaW5kZXhEb2NzIik7IC8vJE5PTi1OTFMtMSQKLQkJCQllMS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBmaWxlIHNob3VsZCBiZSBleGNsdWRlZCBmcm9tIHRoZSBzZWFyY2ggaW5kZXguCi0JICogCi0JICogQHBhcmFtIGZpbGUKLQkgKiAgICAgICAgICAgIFRoZSBmaWxlIHRvIGJlIHZlcmlmaWVkLgotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGdpdmVuIGZpbGUgc2hvdWxkIGJlIGV4Y2x1ZGVkIGZyb20gdGhlCi0JICogICAgICAgICBzZWFyY2ggaW5kZXguCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIHNob3VsZEJlRXhjbHVkZWQoRmlsZSBmaWxlKSB7Ci0JCVN0cmluZyBwYXRoID0gZmlsZS5nZXRQYXJlbnRGaWxlKCkuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0JCWlmIChwRGlyZWN0b3J5LnN0YXJ0c1dpdGgocGF0aCkpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNIdG1sRG9jKEZpbGUgZmlsZSkgewotCQlTdHJpbmcgcGF0aCA9IGZpbGUuZ2V0UGF0aCgpOwotCQlyZXR1cm4gcGF0aC5lbmRzV2l0aCgiLmh0bWwiKSB8fCBwYXRoLmVuZHNXaXRoKCIuaHRtIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc05vU2VhcmNoYWJsZURvY3VtZW50KFByb3BlcnRpZXMgbWV0YVRhZ3MpIHsKLQkJU3RyaW5nIHZhbHVlID0gbWV0YVRhZ3MuZ2V0UHJvcGVydHkoVU1BX0VMRU1FTlRfVFlQRV9GSUVMRCk7Ci0JCQotCQkvLyB2YWx1ZSA9PSBudWxsIGlzIHRyZWF0ZWQgYXMgZ2VuZXJhbCBkb2N1bWVudAotCQlyZXR1cm4gKHZhbHVlICE9IG51bGwpICYmIE5PX1NFQVJDSEVBQkxFX1VNQV9FTEVNRU5UUy5jb250YWlucyh2YWx1ZSk7Ci0JfQotCQotCWNoYXJbXSBjYnVmID0gbmV3IGNoYXJbMTAyNF07Ci0JaW50IHNraXBDb3VudCA9IDA7Ci0JCi0JcHJpdmF0ZSBEb2N1bWVudCBnZXRIVE1MRG9jdW1lbnQoRmlsZSBmaWxlKSB7Ci0JCURvY3VtZW50IGx1Y2VuZURvY3VtZW50ID0gbnVsbDsKLQkJSW5wdXRTdHJlYW1SZWFkZXIgaW5wdXQgPSBudWxsOwotCQlSZWFkZXIgcmVhZGVyID0gbnVsbDsKLQkJdHJ5IHsKLQkJCQotCQkJaW5wdXQgPSBuZXcgSW5wdXRTdHJlYW1SZWFkZXIobmV3IEZpbGVJbnB1dFN0cmVhbShmaWxlKSwgIlVURi04Iik7IC8vJE5PTi1OTFMtMSQKLQotCQkJTEhUTUxQYXJzZXIgcGFyc2VyID0gbmV3IExIVE1MUGFyc2VyKGlucHV0KTsKLQotCQkJcmVhZGVyID0gcGFyc2VyLmdldFJlYWRlcigpOwotCQkJaWYgKCByZWFkZXIgPT0gbnVsbCApIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQotCQkJUHJvcGVydGllcyBtZXRhVGFncyA9IHBhcnNlci5nZXRNZXRhVGFncygpOwotCQkJaWYgKCBpc05vU2VhcmNoYWJsZURvY3VtZW50KG1ldGFUYWdzKSApIHsKLQkJCQkKLQkJCQkvLyB0aGUgTEhUTUxQYXJzZXIgdGhyZWFkIHdpbGwgbm90IGVuZCBpZiB0aGUgcmVhZGVyIGlzIG5vdCBwcm9jZXNzZWQKLQkJCQkvLyBjYXVzaW5nIG1ham9yIHJlc291cmNlIGxlYWsKLQkJCQl3aGlsZSAoIHJlYWRlci5yZWFkKGNidWYpID4gMCApIHsKLQkJCQkJOwotCQkJCX0JCQkKLQkJCQkvL1N5c3RlbS5vdXQucHJpbnRsbiggKytza2lwQ291bnQgKyAiIGZpbGUgc2tpcHBlZDogIiArIGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOwotCQkJCXBhcnNlciA9IG51bGw7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCQkKLQkJCWx1Y2VuZURvY3VtZW50ID0gbmV3IERvY3VtZW50KCk7Ci0KLQkJCVN0cmluZyB1cmwgPSBmaWxlLmdldFBhdGgoKS5yZXBsYWNlKEZpbGUucGF0aFNlcGFyYXRvckNoYXIsICcvJyk7Ci0JCQlsdWNlbmVEb2N1bWVudC5hZGQoRmllbGQuVW5JbmRleGVkKFVSTF9GSUVMRCwgdXJsKSk7Ci0JCQkKLQkJCWx1Y2VuZURvY3VtZW50LmFkZChGaWVsZC5UZXh0KENPTlRFTlRfRklFTEQsIHJlYWRlcikpOwotCQkJCi0JCQlTdHJpbmcgdGl0bGUgPSBwYXJzZXIuZ2V0VGl0bGUoKTsKLQkJCWlmICh0aXRsZSAhPSBudWxsICYmIHRpdGxlLmxlbmd0aCgpID4gMCkgewotCQkJCS8vIFdvcmthcm91bmQgYSBMaW51eCBzcGVjaWZpYyBpc3N1ZS4KLQkJCQl0aXRsZSA9IHRpdGxlLnJlcGxhY2VBbGwoIlxceGEwIiwgIiAiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJbHVjZW5lRG9jdW1lbnQuYWRkKEZpZWxkLktleXdvcmQoVElUTEVfRklFTEQsIHRpdGxlKSk7Ci0JCQl9IGVsc2UgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCi0JCQlTdHJpbmcgc3VtbWFyeSA9IHBhcnNlci5nZXRTdW1tYXJ5KCk7Ci0JCQlpZiAoc3VtbWFyeS5zdGFydHNXaXRoKHRpdGxlKSAmJiBzdW1tYXJ5Lmxlbmd0aCgpID4gdGl0bGUubGVuZ3RoKCkpIHsKLQkJCQlsdWNlbmVEb2N1bWVudC5hZGQoRmllbGQuS2V5d29yZChTVU1NQVJZX0ZJRUxELCBzdW1tYXJ5Ci0JCQkJCQkuc3Vic3RyaW5nKHRpdGxlLmxlbmd0aCgpICsgMSkpKTsKLQkJCX0gZWxzZQotCQkJCWx1Y2VuZURvY3VtZW50LmFkZChGaWVsZC5LZXl3b3JkKFNVTU1BUllfRklFTEQsIHBhcnNlcgotCQkJCQkJLmdldFN1bW1hcnkoKSkpOwotCi0JCQlmb3IgKEVudW1lcmF0aW9uIG5hbWVzID0gbWV0YVRhZ3MucHJvcGVydHlOYW1lcygpOyBuYW1lcwotCQkJCQkuaGFzTW9yZUVsZW1lbnRzKCk7KSB7Ci0JCQkJU3RyaW5nIHRhZ05hbWUgPSAoU3RyaW5nKSBuYW1lcy5uZXh0RWxlbWVudCgpOwotCQkJCWlmICh0YWdOYW1lICE9IG51bGwpIHsKLQkJCQkJaWYgKHRhZ05hbWUuZXF1YWxzKFJPTEVfRklFTEQpKSB7Ci0JCQkJCQlTdHJpbmcgcm9sZU5hbWUgPSBtZXRhVGFncy5nZXRQcm9wZXJ0eSh0YWdOYW1lKTsKLQkJCQkJCWlmIChyb2xlTmFtZSAhPSBudWxsKSB7Ci0JCQkJCQkJbHVjZW5lRG9jdW1lbnQuYWRkKEZpZWxkLlRleHQodGFnTmFtZSwgcm9sZU5hbWUpKTsKLQkJCQkJCX0KLQkJCQkJfSBlbHNlIHsKLQkJCQkJCVN0cmluZyB0YWdWYWx1ZSA9IG1ldGFUYWdzLmdldFByb3BlcnR5KHRhZ05hbWUpOwotCQkJCQkJaWYgKHRhZ1ZhbHVlICE9IG51bGwpIHsKLQkJCQkJCQlsdWNlbmVEb2N1bWVudC5hZGQoRmllbGQuVGV4dCh0YWdOYW1lLCB0YWdWYWx1ZSkpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQlpZiAobHVjZW5lRG9jdW1lbnQuZ2V0RmllbGQoUk9MRV9GSUVMRCkgPT0gbnVsbCkgewotCQkJCS8vIERlZmF1bHQgdG8gIm5hIiB0byBzdXBwb3J0IHNlYXJjaGluZyBmb3IgZmlsZXMgd2l0aG91dAotCQkJCS8vIHJvbGUgbWV0YSB0YWdzLgotCQkJCWx1Y2VuZURvY3VtZW50LmFkZChGaWVsZC5UZXh0KFJPTEVfRklFTEQsICJOT1JVUFJPTEUiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQotCQkJRmllbGQgdW1hVHlwZUZpZWxkID0gbHVjZW5lRG9jdW1lbnQKLQkJCQkJLmdldEZpZWxkKFVNQV9FTEVNRU5UX1RZUEVfRklFTEQpOwotCQkJaWYgKHVtYVR5cGVGaWVsZCA9PSBudWxsKSB7Ci0JCQkJLy8gRGVmYXVsdCB0byBnZW5lcmFsIGNvbnRlbnQuCi0JCQkJbHVjZW5lRG9jdW1lbnQuYWRkKEZpZWxkLlRleHQoVU1BX0VMRU1FTlRfVFlQRV9GSUVMRCwKLQkJCQkJCUdFTkVSQUxfQ09OVEVOVCkpOwotCQkJfSAKLQotCQkJcGFyc2VyID0gbnVsbDsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWx1Y2VuZURvY3VtZW50ID0gbnVsbDsKLQkJCVNlYXJjaFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAoaW5wdXQgIT0gbnVsbCkgewotCQkJCXRyeSB7Ci0JCQkJCWlucHV0LmNsb3NlKCk7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gbHVjZW5lRG9jdW1lbnQ7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC9SZXNvdXJjZXMucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvUmVzb3VyY2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0Mjg4MGYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC9SZXNvdXJjZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uQ29ycG9yYXRpb24uIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLQotIyBJbmRleGluZyBwcm9ncmVzcyBtb25pdG9yCi1pbmRleENvbmZpZ0ZpbGVzVGFza19uYW1lPUluZGV4aW5nIGNvbmZpZ3VyYXRpb24gZmlsZXMuLi4KLQotIyBFcnJvciBEZXRhaWxzCi1jcmVhdGVTZWFyY2hJbmRleEVycm9yPVRoZSBzZWFyY2ggaW5kZXggZmlsZSB3YXMgbm90IGNyZWF0ZWQuCi0KLQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC9TZWFyY2hDb25maWd1cmF0aW9uRXhjZXB0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL1NlYXJjaENvbmZpZ3VyYXRpb25FeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjkyYTkxZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL1NlYXJjaENvbmZpZ3VyYXRpb25FeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5zZWFyY2g7Ci0KLS8qKgotICogU2lnbmFscyB0aGF0IGEgc2VhcmNoIGNvbmZpZ3VyYXRpb24gb3BlcmF0aW9uIGhhcyBmYWlsZWQuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgU2VhcmNoQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBleHRlbmRzIFNlYXJjaFNlcnZpY2VFeGNlcHRpb24gewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gNjUzNzQwNTIxMTQ1MTE3NzExMEw7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBTZWFyY2hDb25maWd1cmF0aW9uRXhjZXB0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UgZ2l2ZW4gdGhlIHJvb3QgY2F1c2Ugb2YgdGhlIGV4Y2VwdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gcm9vdENhdXNlCi0JICogICAgICAgICAgICB0aGUgcm9vdCBjYXVzZSBvZiB0aGUgZXhjZXB0aW9uCi0JICovCi0JcHVibGljIFNlYXJjaENvbmZpZ3VyYXRpb25FeGNlcHRpb24oVGhyb3dhYmxlIHJvb3RDYXVzZSkgewotCQlzdXBlcihyb290Q2F1c2UpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UgZ2l2ZW4gdGhlIGVycm9yIG1lc3NhZ2UuCi0JICogCi0JICogQHBhcmFtIGVycm9yTXNnCi0JICogICAgICAgICAgICB0aGUgZXJyb3IgbWVzc2FnZQotCSAqLwotCXB1YmxpYyBTZWFyY2hDb25maWd1cmF0aW9uRXhjZXB0aW9uKFN0cmluZyBlcnJvck1zZykgewotCQlzdXBlcihlcnJvck1zZyk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBnaXZlbiB0aGUgcm9vdCBjYXVzZSBvZiB0aGUgZXhjZXB0aW9uIGFuZCB0aGUKLQkgKiBlcnJvciBtZXNzYWdlLgotCSAqIAotCSAqIEBwYXJhbSByb290Q2F1c2UKLQkgKiAgICAgICAgICAgIHRoZSByb290IGNhdXNlIG9mIHRoZSBleGNlcHRpb24KLQkgKiBAcGFyYW0gZXJyb3JNc2cKLQkgKiAgICAgICAgICAgIHRoZSBlcnJvciBtZXNzYWdlCi0JICovCi0JcHVibGljIFNlYXJjaENvbmZpZ3VyYXRpb25FeGNlcHRpb24oVGhyb3dhYmxlIHJvb3RDYXVzZSwgU3RyaW5nIGVycm9yTXNnKSB7Ci0JCXN1cGVyKHJvb3RDYXVzZSwgZXJyb3JNc2cpOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvU2VhcmNoUGx1Z2luLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL1NlYXJjaFBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMzFkOWNiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvU2VhcmNoUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuc2VhcmNoOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5BYnN0cmFjdEFjdGl2YXRvcjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotLyoqCi0gKiBUaGUgU2VhcmNoIHBsdWctaW4gYWN0aXZhdG9yLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFNlYXJjaFBsdWdpbiBleHRlbmRzIEFic3RyYWN0QWN0aXZhdG9yIHsKLQotCS8vIFRoZSBzaGFyZWQgcGx1Zy1pbiBpbnN0YW5jZS4KLQlwcml2YXRlIHN0YXRpYyBTZWFyY2hQbHVnaW4gcGx1Z2luOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgU2VhcmNoUGx1Z2luKCkgewotCQlzdXBlcigpOwotCQlwbHVnaW4gPSB0aGlzOwotCX0KLQotCS8qKgotCSAqIEBzZWUgQWJzdHJhY3RQbHVnaW4jc3RhcnQoQnVuZGxlQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdGFydChjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIEFic3RyYWN0UGx1Z2luI3N0YXJ0KEJ1bmRsZUNvbnRleHQpCi0JICovCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdG9wKGNvbnRleHQpOwotCQlwbHVnaW4gPSBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNoYXJlZCBwbHVnLWluIGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU2VhcmNoUGx1Z2luIGdldERlZmF1bHQoKSB7CQotCQlyZXR1cm4gcGx1Z2luOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC9TZWFyY2hSZXNvdXJjZXMuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvU2VhcmNoUmVzb3VyY2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxYjdiNzkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC9TZWFyY2hSZXNvdXJjZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5zZWFyY2g7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi0vKioKLSAqIFRoZSBTZWFyY2ggcmVzb3VyY2UgYnVuZGxlLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFNlYXJjaFJlc291cmNlcyBleHRlbmRzIE5MUyB7Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgQlVORExFX05BTUUgPSBTZWFyY2hSZXNvdXJjZXMuY2xhc3MuZ2V0UGFja2FnZSgpCi0JCQkuZ2V0TmFtZSgpCi0JCQkrICIuUmVzb3VyY2VzIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgaW5kZXhDb25maWdGaWxlc1Rhc2tfbmFtZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjcmVhdGVTZWFyY2hJbmRleEVycm9yOwotCi0Jc3RhdGljIHsKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgU2VhcmNoUmVzb3VyY2VzLmNsYXNzKTsKLQl9Ci0KLQlwcml2YXRlIFNlYXJjaFJlc291cmNlcygpIHsKLQkJLy8gRG8gbm90IGluc3RhbnRpYXRlCi0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC9TZWFyY2hTZXJ2aWNlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL1NlYXJjaFNlcnZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmQ2ZmNiMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL1NlYXJjaFNlcnZpY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuc2VhcmNoOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLkZpbGVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuV2FyVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VhcmNoLmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbkhpdEVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZWFyY2guY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uU2VhcmNoUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC5jb25maWd1cmF0aW9uLmludGVybmFsLkNvbmZpZ3VyYXRpb25TZWFyY2hTZXJ2aWNlOwotCi0vKioKLSAqIFRoZSBTZWFyY2ggU2VydmljZSBpbXBsZW1lbnRhdGlvbi4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBTZWFyY2hTZXJ2aWNlIGltcGxlbWVudHMgSVNlYXJjaFNlcnZpY2UgewotCi0JLy8gVGhlIHNoYXJlZCBpbnN0YW5jZS4KLQlwcml2YXRlIHN0YXRpYyBTZWFyY2hTZXJ2aWNlIGluc3RhbmNlID0gbnVsbDsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNoYXJlZCBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFNlYXJjaFNlcnZpY2UgZ2V0SW5zdGFuY2UoKSB7Ci0JCWlmIChpbnN0YW5jZSA9PSBudWxsKSB7Ci0JCQlzeW5jaHJvbml6ZWQgKFNlYXJjaFNlcnZpY2UuY2xhc3MpIHsKLQkJCQlpZiAoaW5zdGFuY2UgPT0gbnVsbCkgewotCQkJCQlpbnN0YW5jZSA9IG5ldyBTZWFyY2hTZXJ2aWNlKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci0KLQkvKioKLQkgKiBQcml2YXRlIGNvbnN0cnVjdG9yIHRvIHByZXZlbnQgdGhpcyBjbGFzcyBmcm9tIGJlaW5nIGluc3RhbnRpYXRlZC4KLQkgKi8KLQlwcml2YXRlIFNlYXJjaFNlcnZpY2UoKSB7Ci0JfQotCi0JLyoqCi0JICogU2VhcmNoZXMgYSBwdWJsaXNoZWQgQ29uZmlndXJhdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gcGF0aAotCSAqICAgICAgICAgICAgdGhlIGFic29sdXRlIHBhdGggdG8gdGhlIHB1Ymxpc2hlZCBjb25maWd1cmF0aW9uCi0JICogQHBhcmFtIHNlYXJjaFF1ZXJ5Ci0JICogICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBzZWFyY2ggcXVlcnkKLQkgKiBAcmV0dXJuIGFuIGFycmF5IG9mIDxjb2RlPkNvbmZpZ3VyYXRpb25IaXRFbnRyeTwvY29kZT4gb2JqZWN0cwotCSAqIEB0aHJvd3MgU2VhcmNoU2VydmljZUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycyB3aGlsZSBleGVjdXRpbmcgdGhlIG9wZXJhdGlvbgotCSAqLwotCXB1YmxpYyBDb25maWd1cmF0aW9uSGl0RW50cnlbXSBzZWFyY2hDb25maWd1cmF0aW9uKFN0cmluZyBwYXRoLAotCQkJQ29uZmlndXJhdGlvblNlYXJjaFF1ZXJ5IHNlYXJjaFF1ZXJ5KSB0aHJvd3MgU2VhcmNoU2VydmljZUV4Y2VwdGlvbiB7Ci0JCUNvbmZpZ3VyYXRpb25TZWFyY2hTZXJ2aWNlIHNlcnZpY2UgPSBuZXcgQ29uZmlndXJhdGlvblNlYXJjaFNlcnZpY2UoCi0JCQkJcGF0aCk7Ci0JCXNlcnZpY2UuaW5kZXgoKTsKLQkJcmV0dXJuIHNlcnZpY2Uuc2VhcmNoKHNlYXJjaFF1ZXJ5KTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjcmVhdGVJbmRleChTdHJpbmcgcHVibGlzaERpcikgdGhyb3dzIFNlYXJjaFNlcnZpY2VFeGNlcHRpb24gewotCQlJbmRleEJ1aWxkZXIgc2VydmljZSA9IG5ldyBJbmRleEJ1aWxkZXIocHVibGlzaERpcik7Ci0JCXJldHVybiBzZXJ2aWNlLmNyZWF0ZUluZGV4KHRydWUpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNyZWF0ZUluZGV4KFN0cmluZyBwdWJsaXNoRGlyLCBib29sZWFuIGphckl0KQotCQkJdGhyb3dzIFNlYXJjaFNlcnZpY2VFeGNlcHRpb24gewotCQlJbmRleEJ1aWxkZXIgc2VydmljZSA9IG5ldyBJbmRleEJ1aWxkZXIocHVibGlzaERpcik7Ci0JCXJldHVybiBzZXJ2aWNlLmNyZWF0ZUluZGV4KGphckl0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjcmVhdGVXQVIoU3RyaW5nIHB1Ymxpc2hEaXIsIFN0cmluZyB3ZWJBcHBOYW1lKSB7Ci0JCXRyeSB7Ci0JCQlGaWxlIHdhckZpbGUgPSBudWxsOwotCQkJaWYgKHdlYkFwcE5hbWUuZW5kc1dpdGgoIi53YXIiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJd2FyRmlsZSA9IG5ldyBGaWxlKHB1Ymxpc2hEaXIsIHdlYkFwcE5hbWUpOwotCQkJfSBlbHNlIHsKLQkJCQl3YXJGaWxlID0gbmV3IEZpbGUocHVibGlzaERpciwgd2ViQXBwTmFtZSArICIud2FyIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCVdhclV0aWwuYnVpbGRXYXJGaWxlKHdhckZpbGUuZ2V0QWJzb2x1dGVQYXRoKCksIHB1Ymxpc2hEaXIsIG51bGwpOwotCQkJRmlsZSBsb2dzRGlyID0gbmV3IEZpbGUocHVibGlzaERpciwgImxvZ3MiKTsgLy8kTk9OLU5MUy0xJAotCQkJRmlsZSBjc3NEaXIgPSBuZXcgRmlsZShwdWJsaXNoRGlyLCAiY3NzIik7IC8vJE5PTi1OTFMtMSQKLQkJCUZpbGUgc2NyaXB0c0RpciA9IG5ldyBGaWxlKHB1Ymxpc2hEaXIsICJzY3JpcHRzIik7IC8vJE5PTi1OTFMtMSQKLQkJCUZpbGUgaW1hZ2VzRGlyID0gbmV3IEZpbGUocHVibGlzaERpciwgImltYWdlcyIpOyAvLyROT04tTkxTLTEkCi0JCQlMaXN0PEZpbGU+IGZpbGVzTm90VG9EZWxldGUgPSBuZXcgQXJyYXlMaXN0PEZpbGU+KCk7Ci0JCQlmaWxlc05vdFRvRGVsZXRlLmFkZChsb2dzRGlyKTsKLQkJCWZpbGVzTm90VG9EZWxldGUuYWRkKGNzc0Rpcik7Ci0JCQlmaWxlc05vdFRvRGVsZXRlLmFkZChzY3JpcHRzRGlyKTsKLQkJCWZpbGVzTm90VG9EZWxldGUuYWRkKGltYWdlc0Rpcik7Ci0JCQlmaWxlc05vdFRvRGVsZXRlLmFkZCh3YXJGaWxlKTsKLQkJCUZpbGVVdGlsLmRlbGV0ZUFsbEZpbGVzKHB1Ymxpc2hEaXIsIGZpbGVzTm90VG9EZWxldGUpOwotCQkJZmlsZXNOb3RUb0RlbGV0ZS5jbGVhcigpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvU2VhcmNoU2VydmljZUV4Y2VwdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC9TZWFyY2hTZXJ2aWNlRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyNWEyYzIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC9TZWFyY2hTZXJ2aWNlRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuc2VhcmNoOwotCi0vKioKLSAqIFNpZ25hbHMgdGhhdCBhIFNlYXJjaCBTZXJ2aWNlIG9wZXJhdGlvbiBoYXMgZmFpbGVkLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFNlYXJjaFNlcnZpY2VFeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24gewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTkwNjMzMDIxODA4NjkxNTczMTZMOwotCi0JLyoqCi0JICogVGhlIHJvb3QgY2F1c2Ugb2YgdGhlIGV4Y2VwdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgVGhyb3dhYmxlIHJvb3RDYXVzZTsKLQotCS8qKgotCSAqIFRoZSBlcnJvciBtZXNzYWdlIGFzc29jaWF0ZWQgd2l0aCB0aGUgZXhjZXB0aW9uLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZXJyb3JNc2c7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBTZWFyY2hTZXJ2aWNlRXhjZXB0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UgZ2l2ZW4gdGhlIHJvb3QgY2F1c2Ugb2YgdGhlIGV4Y2VwdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gcm9vdENhdXNlCi0JICogICAgICAgICAgICB0aGUgcm9vdCBjYXVzZSBvZiB0aGUgZXhjZXB0aW9uCi0JICovCi0JcHVibGljIFNlYXJjaFNlcnZpY2VFeGNlcHRpb24oVGhyb3dhYmxlIHJvb3RDYXVzZSkgewotCQl0aGlzKHJvb3RDYXVzZSwgcm9vdENhdXNlLmdldE1lc3NhZ2UoKSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBnaXZlbiB0aGUgZXJyb3IgbWVzc2FnZS4KLQkgKiAKLQkgKiBAcGFyYW0gZXJyb3JNc2cKLQkgKiAgICAgICAgICAgIHRoZSBlcnJvciBtZXNzYWdlCi0JICovCi0JcHVibGljIFNlYXJjaFNlcnZpY2VFeGNlcHRpb24oU3RyaW5nIGVycm9yTXNnKSB7Ci0JCXRoaXMobnVsbCwgZXJyb3JNc2cpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UgZ2l2ZW4gdGhlIHJvb3QgY2F1c2Ugb2YgdGhlIGV4Y2VwdGlvbiBhbmQgdGhlCi0JICogZXJyb3IgbWVzc2FnZS4KLQkgKiAKLQkgKiBAcGFyYW0gcm9vdENhdXNlCi0JICogICAgICAgICAgICB0aGUgcm9vdCBjYXVzZSBvZiB0aGUgZXhjZXB0aW9uCi0JICogQHBhcmFtIGVycm9yTXNnCi0JICogICAgICAgICAgICB0aGUgZXJyb3IgbWVzc2FnZQotCSAqLwotCXB1YmxpYyBTZWFyY2hTZXJ2aWNlRXhjZXB0aW9uKFRocm93YWJsZSByb290Q2F1c2UsIFN0cmluZyBlcnJvck1zZykgewotCQlzdXBlcigpOwotCQl0aGlzLnJvb3RDYXVzZSA9IHJvb3RDYXVzZTsKLQkJdGhpcy5lcnJvck1zZyA9IGVycm9yTXNnOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJvb3QgY2F1c2Ugb2YgdGhlIGV4Y2VwdGlvbi4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSByb290IGNhdXNlIG9mIHRoZSBleGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgVGhyb3dhYmxlIGdldFJvb3RDYXVzZSgpIHsKLQkJcmV0dXJuIHJvb3RDYXVzZTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL2FuYWx5c2lzL1N0b3BXb3Jkcy5wcm9wZXJ0aWVzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC9hbmFseXNpcy9TdG9wV29yZHMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjAzMzUyOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL2FuYWx5c2lzL1N0b3BXb3Jkcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb25Db3Jwb3JhdGlvbi4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUgotCi0jIFNlYXJjaCBTdG9wIFdvcmRzCi1TZWFyY2guc3RvcFdvcmRzPVwKLWEsIGFib3V0LCBhbiwgYW5kLCBhcmUsIGFzLCBhdCwgYmUsIGJ1dCwgYnksIGZvciwgZnJvbSwgaG93LCBcCi1pLCBpZiwgaW4sIGludG8sIGlzLCBpdCwgbm8sIG5vdCwgb2YsIG9uLCBvciwgcywgc3VjaCwgXAotdCwgdGhhdCwgdGhlLCB0aGVpciwgdGhlbiwgdGhlcmUsIHRoZXNlLCB0aGV5LCB0aGlzLCB0bywgXAotd2FzLCB3aGF0LCB3aGVuLCB3aGVyZSwgd2hvLCB3aWxsLCB3aXRoCi0KLQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC9hbmFseXNpcy9UZXh0QW5hbHl6ZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvYW5hbHlzaXMvVGV4dEFuYWx5emVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlODAzZTEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC9hbmFseXNpcy9UZXh0QW5hbHl6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5zZWFyY2guYW5hbHlzaXM7Ci0KLWltcG9ydCBqYXZhLmlvLlJlYWRlcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLmFuYWx5c2lzLkFuYWx5emVyOwotaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLmFuYWx5c2lzLlRva2VuU3RyZWFtOwotCi0vKioKLSAqIEEgdGV4dCBhbmFseXplciB0aGF0IGhhbmRsZXMgVW5pY29kZSA0LjEgY2hhcmFjdGVycy4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXh0QW5hbHl6ZXIgZXh0ZW5kcyBBbmFseXplciB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBUZXh0QW5hbHl6ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuYXBhY2hlLmx1Y2VuZS5hbmFseXNpcy5BbmFseXplciN0b2tlblN0cmVhbShTdHJpbmcsIFJlYWRlcikKLQkgKi8KLQlwdWJsaWMgZmluYWwgVG9rZW5TdHJlYW0gdG9rZW5TdHJlYW0oU3RyaW5nIGZpZWxkTmFtZSwgUmVhZGVyIHJlYWRlcikgewotCQlUb2tlblN0cmVhbSByZXN1bHQgPSBuZXcgVGV4dFRva2VuaXplcihyZWFkZXIpOwotCQlyZXR1cm4gbmV3IFRleHRGaWx0ZXIocmVzdWx0KTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL2FuYWx5c2lzL1RleHRGaWx0ZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvYW5hbHlzaXMvVGV4dEZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMTlkZGRkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvYW5hbHlzaXMvVGV4dEZpbHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC5hbmFseXNpczsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5hbmFseXNpcy5TdG9wQW5hbHl6ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuYW5hbHlzaXMuU3RvcEZpbHRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5hbmFseXNpcy5Ub2tlbjsKLWltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5hbmFseXNpcy5Ub2tlbkZpbHRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5hbmFseXNpcy5Ub2tlblN0cmVhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLlN0clV0aWw7Ci0KLS8qKgotICogQSB0ZXh0IGZpbHRlciB0aGF0IGhhbmRsZXMgVW5pY29kZSA0LjEgY2hhcmFjdGVycy4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBUZXh0RmlsdGVyIGV4dGVuZHMgVG9rZW5GaWx0ZXIgewotCi0JcHJpdmF0ZSBzdGF0aWMgU2V0IHN0b3BXb3JkcyA9IG51bGw7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBUZXh0RmlsdGVyKFRva2VuU3RyZWFtIGluKSB7Ci0JCXN1cGVyKGluKTsKLQkJaWYgKHN0b3BXb3JkcyA9PSBudWxsKSB7Ci0JCQlsb2FkU3RvcFdvcmRzKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5hcGFjaGUubHVjZW5lLmFuYWx5c2lzLlRva2VuU3RyZWFtI25leHQoKQotCSAqLwotCXB1YmxpYyBmaW5hbCBUb2tlbiBuZXh0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJZm9yIChUb2tlbiB0b2tlbiA9IGlucHV0Lm5leHQoKTsgdG9rZW4gIT0gbnVsbDsgdG9rZW4gPSBpbnB1dC5uZXh0KCkpIHsKLQkJCVN0cmluZyB0b2tlblRleHQgPSB0b2tlbi50ZXJtVGV4dCgpOwotCQkJaWYgKCFzdG9wV29yZHMuY29udGFpbnModG9rZW5UZXh0KSkgewotCQkJCXJldHVybiB0b2tlbjsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBMb2FkcyB0aGUgc3RvcCB3b3JkcyBkZWZpbmVkIGluIHRoZSBTdG9wV29yZHMucHJvcGVydGllcyBmaWxlLgotCSAqLwotCXByaXZhdGUgdm9pZCBsb2FkU3RvcFdvcmRzKCkgewotCQlTdHJpbmdbXSB3b3JkcyA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlSZXNvdXJjZUJ1bmRsZSBidW5kbGUgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoVGV4dEZpbHRlci5jbGFzcwotCQkJCQkuZ2V0UGFja2FnZSgpLmdldE5hbWUoKQotCQkJCQkrICIuU3RvcFdvcmRzIik7IC8vJE5PTi1OTFMtMSQJCQkJCi0JCQlTdHJpbmcgcHJvcGVydHkgPSBidW5kbGUuZ2V0U3RyaW5nKCJTZWFyY2guc3RvcFdvcmRzIik7IC8vJE5PTi1OTFMtMSQKLQkJCXdvcmRzID0gU3RyVXRpbC5zcGxpdChwcm9wZXJ0eSwgIiAsIik7IC8vJE5PTi1OTFMtMSQJCQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJd29yZHMgPSBTdG9wQW5hbHl6ZXIuRU5HTElTSF9TVE9QX1dPUkRTOwotCQl9Ci0JCXN0b3BXb3JkcyA9IFN0b3BGaWx0ZXIubWFrZVN0b3BTZXQod29yZHMpOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvYW5hbHlzaXMvVGV4dFRva2VuaXplci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC9hbmFseXNpcy9UZXh0VG9rZW5pemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1ZjMzNWIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC9hbmFseXNpcy9UZXh0VG9rZW5pemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuc2VhcmNoLmFuYWx5c2lzOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLlJlYWRlcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLmFuYWx5c2lzLlRva2VuOwotaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLmFuYWx5c2lzLlRva2VuaXplcjsKLQotaW1wb3J0IGNvbS5pYm0uaWN1LnRleHQuQnJlYWtJdGVyYXRvcjsKLQotLyoqCi0gKiBBIHRleHQgdG9rZW5pemVyIHRoYXQgdXNlcyBJQ1U0SiB0byBzZWdtZW50IHRleHQgaW50byB3b3Jkcy4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBUZXh0VG9rZW5pemVyIGV4dGVuZHMgVG9rZW5pemVyIHsKLQotCXByaXZhdGUgZmluYWwgc3RhdGljIGludCBCVUZGRVJfU0laRSA9IDQwOTY7Ci0KLQlwcml2YXRlIFN0cmluZyB0ZXh0OwotCi0JcHJpdmF0ZSBCcmVha0l0ZXJhdG9yIGl0ZXJhdG9yOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gcmVhZGVyCi0JICogICAgICAgICAgICB0aGUgdGV4dCBzb3VyY2UKLQkgKi8KLQlwdWJsaWMgVGV4dFRva2VuaXplcihSZWFkZXIgcmVhZGVyKSB7Ci0JCXN1cGVyKHJlYWRlcik7Ci0JCVN0cmluZ0J1ZmZlciB0ZXh0QnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcihCVUZGRVJfU0laRSk7Ci0JCWNoYXJbXSBidWZmZXIgPSBuZXcgY2hhcltCVUZGRVJfU0laRV07Ci0JCWludCBjaGFyc1JlYWQ7Ci0JCXRyeSB7Ci0JCQl3aGlsZSAoKGNoYXJzUmVhZCA9IHJlYWRlci5yZWFkKGJ1ZmZlciwgMCwgQlVGRkVSX1NJWkUpKSA+IDApIHsKLQkJCQl0ZXh0QnVmZmVyLmFwcGVuZChidWZmZXIsIDAsIGNoYXJzUmVhZCk7Ci0JCQl9Ci0JCQl0ZXh0ID0gdGV4dEJ1ZmZlci50b1N0cmluZygpOwotCQkJaXRlcmF0b3IgPSBCcmVha0l0ZXJhdG9yLmdldFdvcmRJbnN0YW5jZSgpOwotCQkJaXRlcmF0b3Iuc2V0VGV4dCh0ZXh0KTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJaXRlcmF0b3IgPSBudWxsOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuYXBhY2hlLmx1Y2VuZS5hbmFseXNpcy5Ub2tlblN0cmVhbSNuZXh0KCkKLQkgKi8KLQlwdWJsaWMgZmluYWwgVG9rZW4gbmV4dCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWlmIChpdGVyYXRvciAhPSBudWxsKSB7Ci0JCQl3aGlsZSAodHJ1ZSkgewotCQkJCWludCBzdGFydCA9IGl0ZXJhdG9yLmN1cnJlbnQoKTsKLQkJCQlpbnQgZW5kID0gaXRlcmF0b3IubmV4dCgpOwotCQkJCWlmIChlbmQgIT0gQnJlYWtJdGVyYXRvci5ET05FKSB7Ci0JCQkJCVN0cmluZyB0b2tlblRleHQgPSB0ZXh0LnN1YnN0cmluZyhzdGFydCwgZW5kKS50b0xvd2VyQ2FzZSgpOwotCQkJCQlpZiAoIXRva2VuVGV4dC5lcXVhbHMoIiAiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCQlpZiAodG9rZW5UZXh0LmVuZHNXaXRoKCIncyIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQl0b2tlblRleHQgPSB0b2tlblRleHQuc3Vic3RyaW5nKDAsIHRva2VuVGV4dAotCQkJCQkJCQkJLmxlbmd0aCgpIC0gMik7Ci0JCQkJCQl9Ci0JCQkJCQlyZXR1cm4gbmV3IFRva2VuKHRva2VuVGV4dCwgMCwgdG9rZW5UZXh0Lmxlbmd0aCgpKTsKLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCXJldHVybiBudWxsOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL2FuYWx5c2lzL3BhY2thZ2UuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvYW5hbHlzaXMvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNGY0MmY5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvYW5hbHlzaXMvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgdGhlIHRleHQgYW5hbHlzZXIsIHRva2VuaXplciBhbmQgZmlsdGVyIGZvciBpbmRleGluZyBhIHB1Ymxpc2hlZCBjb25maWd1cmF0aW9uLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvY29uZmlndXJhdGlvbi9Db25maWd1cmF0aW9uSGl0RW50cnkuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvY29uZmlndXJhdGlvbi9Db25maWd1cmF0aW9uSGl0RW50cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTc0ODE1Mi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL2NvbmZpZ3VyYXRpb24vQ29uZmlndXJhdGlvbkhpdEVudHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC5jb25maWd1cmF0aW9uOwotCi0vKioKLSAqIEEgcHVibGlzaGVkIGNvbmZpZ3VyYXRpb24gc2VhcmNoIGhpdCBlbnRyeS4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBDb25maWd1cmF0aW9uSGl0RW50cnkgewotCi0JcHJpdmF0ZSBTdHJpbmcgaWQ7Ci0KLQlwcml2YXRlIFN0cmluZyBuYW1lOwotCi0JcHJpdmF0ZSBTdHJpbmcgdHlwZTsKLQotCXByaXZhdGUgU3RyaW5nIGJyaWVmRGVzYzsKLQotCXByaXZhdGUgU3RyaW5nIHVybDsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIElELgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGlkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJcmV0dXJuIGlkOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIElELgotCSAqIAotCSAqIEBwYXJhbSBpZAotCSAqICAgICAgICAgICAgdGhlIGlkIHRvIHNldAotCSAqLwotCXB1YmxpYyB2b2lkIHNldElkKFN0cmluZyBpZCkgewotCQl0aGlzLmlkID0gaWQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdHlwZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSB0eXBlLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIHR5cGU7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdHlwZS4KLQkgKiAKLQkgKiBAcGFyYW0gdHlwZQotCSAqICAgICAgICAgICAgdGhlIHR5cGUgdG8gc2V0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0VHlwZShTdHJpbmcgdHlwZSkgewotCQl0aGlzLnR5cGUgPSB0eXBlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGJyZWlmIGRlc2NyaXB0aW9uLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGJyaWVmIGRlc2NyaXB0aW9uCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRCcmllZkRlc2MoKSB7Ci0JCXJldHVybiBicmllZkRlc2M7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgYnJpZWYgZGVzY3JpcHRpb24uCi0JICogCi0JICogQHBhcmFtIGJyaWVmRGVzYwotCSAqICAgICAgICAgICAgdGhlIGJyaWVmIGRlc2NyaXB0aW9uIHRvIHNldAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEJyaWVmRGVzYyhTdHJpbmcgYnJpZWZEZXNjKSB7Ci0JCXRoaXMuYnJpZWZEZXNjID0gYnJpZWZEZXNjOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG5hbWUuCi0JICogCi0JICogQHJldHVybiB0aGUgbmFtZQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgbmFtZS4KLQkgKiAKLQkgKiBAcGFyYW0gbmFtZQotCSAqICAgICAgICAgICAgdGhlIG5hbWUgdG8gc2V0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgewotCQl0aGlzLm5hbWUgPSBuYW1lOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIFVSTC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBVUkwKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFVybCgpIHsKLQkJcmV0dXJuIHVybDsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBVUkwuCi0JICogCi0JICogQHBhcmFtIHVybAotCSAqICAgICAgICAgICAgdGhlIFVSTCB0byBzZXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRVcmwoU3RyaW5nIHVybCkgewotCQl0aGlzLnVybCA9IHVybDsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL2NvbmZpZ3VyYXRpb24vQ29uZmlndXJhdGlvblNlYXJjaFF1ZXJ5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL2NvbmZpZ3VyYXRpb24vQ29uZmlndXJhdGlvblNlYXJjaFF1ZXJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmZmY0ZDIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC9jb25maWd1cmF0aW9uL0NvbmZpZ3VyYXRpb25TZWFyY2hRdWVyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC5jb25maWd1cmF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci0KLS8qKgotICogVGhlIHB1Ymxpc2hlZCBjb25maWd1cmF0aW9uIHNlYXJjaCBxdWVyeS4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBDb25maWd1cmF0aW9uU2VhcmNoUXVlcnkgewotCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIENBVEVHT1JZX05BTUUgPSAibmFtZSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBDQVRFR09SWV9CUklFRl9ERVNDID0gImJyaWVmRGVzY3JpcHRpb24iOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ0FURUdPUllfRlVMTF9ERVNDID0gImZ1bGxEZXNjcmlwdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBDQVRFR09SWV9UWVBFID0gInR5cGUiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIEhhc2h0YWJsZSBxdWVyeTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIENvbmZpZ3VyYXRpb25TZWFyY2hRdWVyeSgpIHsKLQkJcXVlcnkgPSBuZXcgSGFzaHRhYmxlKCk7Ci0JCXF1ZXJ5LmNsZWFyKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2VhcmNoIHF1ZXJ5IHN0cmluZy4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBzZWFyY2ggcXVlcnkgc3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRRdWVyeVN0cmluZygpIHsKLQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlFbnVtZXJhdGlvbiBrZXlzID0gcXVlcnkua2V5cygpOwotCi0JCXdoaWxlIChrZXlzLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCQlTdHJpbmcga2V5ID0gKFN0cmluZykga2V5cy5uZXh0RWxlbWVudCgpOwotCQkJc2IuYXBwZW5kKGtleSArICI6KCIgKyBxdWVyeS5nZXQoa2V5KSArICIpICIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCWlmIChrZXlzLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCQkJc2IuYXBwZW5kKCJBTkQgIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCi0JCXJldHVybiBzYi50b1N0cmluZygpOwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRUZXJtKFN0cmluZyB0ZXJtLCBTdHJpbmcgY3JpdCkgewotCQlxdWVyeS5wdXQoY3JpdCwgdGVybSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VHlwZShTdHJpbmcgdHlwZSkgewotCQlzZXRUZXJtKHR5cGUsIENBVEVHT1JZX1RZUEUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJc2V0VGVybShuYW1lLCBDQVRFR09SWV9OQU1FKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRCcmllZkRlc2MoU3RyaW5nIGRlc2MpIHsKLQkJc2V0VGVybShkZXNjLCBDQVRFR09SWV9CUklFRl9ERVNDKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRGdWxsRGVzYyhTdHJpbmcgZGVzYykgewotCQlzZXRUZXJtKGRlc2MsIENBVEVHT1JZX0ZVTExfREVTQyk7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC9jb25maWd1cmF0aW9uL2ludGVybmFsL0NvbmZpZ3VyYXRpb25TZWFyY2hTZXJ2aWNlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL2NvbmZpZ3VyYXRpb24vaW50ZXJuYWwvQ29uZmlndXJhdGlvblNlYXJjaFNlcnZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzFkMTFmYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL2NvbmZpZ3VyYXRpb24vaW50ZXJuYWwvQ29uZmlndXJhdGlvblNlYXJjaFNlcnZpY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwMiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuc2VhcmNoLmNvbmZpZ3VyYXRpb24uaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5kb2N1bWVudC5EYXRlRmllbGQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuZG9jdW1lbnQuRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuZG9jdW1lbnQuRmllbGQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuaW5kZXguSW5kZXhXcml0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUucXVlcnlQYXJzZXIuUXVlcnlQYXJzZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuc2VhcmNoLkhpdHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuc2VhcmNoLkluZGV4U2VhcmNoZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuc2VhcmNoLlF1ZXJ5OwotaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLnNlYXJjaC5TZWFyY2hlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLmh0bWwuSFRNTFBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VhcmNoLkdlbmVyYXRlU2VhcmNoSW5kZXhFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC5TZWFyY2hDb25maWd1cmF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZWFyY2guU2VhcmNoUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZWFyY2guU2VhcmNoU2VydmljZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VhcmNoLmFuYWx5c2lzLlRleHRBbmFseXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VhcmNoLmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbkhpdEVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZWFyY2guY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uU2VhcmNoUXVlcnk7Ci0KLS8qKgotICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gZm9yIHNlYXJjaGluZyBhIHB1Ymxpc2hlZCBjb25maWd1cmF0aW9uLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIENvbmZpZ3VyYXRpb25TZWFyY2hTZXJ2aWNlIHsKLQotCS8qKgotCSAqIERvY3VtZW50IGZpZWxkcy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCUklFRl9ERVNDUklQVElPTl9GSUVMRCA9ICJicmllZkRlc2NyaXB0aW9uIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVEVOVF9GSUVMRCA9ICJjb250ZW50IjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURfRklFTEQgPSAiaWQiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNT0RJRklFRF9GSUVMRCA9ICJtb2RpZmllZCI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfRklFTEQgPSAibmFtZSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJPTEVfRklFTEQgPSAicm9sZSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNVTU1BUllfRklFTEQgPSAic3VtbWFyeSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRZUEVfRklFTEQgPSAidHlwZSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVSTF9GSUVMRCA9ICJ1cmwiOyAvLyROT04tTkxTLTEkCi0KLQkvLyBUaGUgSFRNTCBwYXJzZXIuCi0JcHJpdmF0ZSBIVE1MUGFyc2VyIHBhcnNlcjsKLQotCS8vIFRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGUgZG9jdW1lbnRzIHRvIGJlIGluZGV4ZWQuCi0JcHJpdmF0ZSBTdHJpbmcgZG9jRGlyID0gbnVsbDsKLQotCS8vIFRoZSBkaXJlY3Rvcnkgd2hlcmUgdGhlIGluZGV4IGZpbGVzIHdpbGwgYmUgZ2VuZXJhdGVkLgotCXByaXZhdGUgU3RyaW5nIGluZGV4RGlyID0gbnVsbDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICogCi0JICogQHBhcmFtIGRvY0RpcgotCSAqICAgICAgICAgICAgdGhlIGFic29sdXRlIHBhdGggdG8gYSBwdWJsaXNoZWQgY29uZmlndXJhdGlvbgotCSAqLwotCXB1YmxpYyBDb25maWd1cmF0aW9uU2VhcmNoU2VydmljZShTdHJpbmcgZG9jRGlyKSB7Ci0JCVN0cmluZyB1c2VySG9tZSA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgidXNlci5ob21lIik7IC8vJE5PTi1OTFMtMSQKLQkJaW50IGhhc2hDb2RlID0gTWF0aC5hYnMoZG9jRGlyLmhhc2hDb2RlKCkpOwotCQlTdHJpbmcgaW5kZXhQYXRoID0gdXNlckhvbWUgKyBGaWxlLnNlcGFyYXRvcgotCQkJCSsgInJ1cCIgKyBGaWxlLnNlcGFyYXRvciArIGhhc2hDb2RlICsgRmlsZS5zZXBhcmF0b3IgKyAiaW5kZXgiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJc2V0RGlycyhkb2NEaXIsIGluZGV4UGF0aCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gZG9jRGlyCi0JICogICAgICAgICAgICB0aGUgYWJzb2x1dGUgcGF0aCB0byBhIHB1Ymxpc2hlZCBjb25maWd1cmF0aW9uCi0JICogQHBhcmFtIGluZGV4RGlyCi0JICogICAgICAgICAgICB0aGUgYWJzb2x1dGUgcGF0aCB0byB0aGUgaW5kZXhlcwotCSAqLwotCXB1YmxpYyBDb25maWd1cmF0aW9uU2VhcmNoU2VydmljZShTdHJpbmcgZG9jRGlyLCBTdHJpbmcgaW5kZXhEaXIpIHsKLQkJc2V0RGlycyhkb2NEaXIsIGluZGV4RGlyKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHVwIHRoZSBjb25maWd1cmF0aW9uIGFuZCBpbmRleCBkaXJlY3RvcnkuCi0JICogCi0JICogQHBhcmFtIGRvY0RpcgotCSAqICAgICAgICAgICAgdGhlIGFic29sdXRlIHBhdGggdG8gYSBwdWJsaXNoZWQgY29uZmlndXJhdGlvbgotCSAqIEBwYXJhbSBpbmRleERpcgotCSAqICAgICAgICAgICAgdGhlIGFic29sdXRlIHBhdGggdG8gdGhlIGluZGV4ZXMKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREaXJzKFN0cmluZyBkb2NEaXIsIFN0cmluZyBpbmRleERpcikgewotCQl0aGlzLmRvY0RpciA9IGRvY0RpcjsKLQkJdGhpcy5pbmRleERpciA9IGluZGV4RGlyOwotCX0KLQotCS8qKgotCSAqIFBlcmZvcm1zIGEgc2VhcmNoIGJhc2VkIG9uIHRoZSBnaXZlbiBzZWFyY2ggcXVlcnkuCi0JICogCi0JICogQHBhcmFtIHF1ZXJ5Ci0JICogICAgICAgICAgICB0aGUgc2VhcmNoIHF1ZXJ5IHN0cmluZwotCSAqIEByZXR1cm4gYW4gYXJyYXkgb2YgPGNvZGU+Q29uZmlndXJhdGlvbkhpdEVudHJ5PC9jb2RlPiBvYmplY3RzCi0JICogQHRocm93cyBTZWFyY2hTZXJ2aWNlRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlIGV4ZWN1dGluZyB0aGUgb3BlcmF0aW9uCi0JICovCi0JcHVibGljIENvbmZpZ3VyYXRpb25IaXRFbnRyeVtdIHNlYXJjaChDb25maWd1cmF0aW9uU2VhcmNoUXVlcnkgcXVlcnkpCi0JCQl0aHJvd3MgU2VhcmNoU2VydmljZUV4Y2VwdGlvbiB7Ci0JCXJldHVybiBzZWFyY2gocXVlcnkuZ2V0UXVlcnlTdHJpbmcoKSk7Ci0JfQotCi0JLyoqCi0JICogUGVyZm9ybXMgYSBzZWFyY2ggb24gdGhlIGdpdmVuIHF1ZXJ5IHN0cmluZy4KLQkgKiAKLQkgKiBAcGFyYW0gcXN0cgotCSAqICAgICAgICAgICAgYSBMdWNlbmUgY29tcGF0aWJsZSBxdWVyeSBzdHJpbmcKLQkgKiBAcmV0dXJuIGFuIGFycmF5IG9mIDxjb2RlPkNvbmZpZ3VyYXRpb25IaXRFbnRyeTwvY29kZT4gb2JqZWN0cwotCSAqIEB0aHJvd3MgU2VhcmNoU2VydmljZUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycyB3aGlsZSBleGVjdXRpbmcgdGhlIG9wZXJhdGlvbgotCSAqLwotCXB1YmxpYyBDb25maWd1cmF0aW9uSGl0RW50cnlbXSBzZWFyY2goU3RyaW5nIHFzdHIpCi0JCQl0aHJvd3MgU2VhcmNoU2VydmljZUV4Y2VwdGlvbiB7Ci0JCVNlYXJjaGVyIHNlYXJjaGVyID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXNlYXJjaGVyID0gbmV3IEluZGV4U2VhcmNoZXIoaW5kZXhEaXIpOwotCQkJUXVlcnkgcXVlcnkgPSBRdWVyeVBhcnNlci5wYXJzZShxc3RyLCBDT05URU5UX0ZJRUxELAotCQkJCQluZXcgVGV4dEFuYWx5emVyKCkpOwotCi0JCQlIaXRzIGxoaXRzID0gc2VhcmNoZXIuc2VhcmNoKHF1ZXJ5KTsKLQkJCUNvbmZpZ3VyYXRpb25IaXRFbnRyeVtdIGhpdHMgPSBuZXcgQ29uZmlndXJhdGlvbkhpdEVudHJ5W2xoaXRzCi0JCQkJCS5sZW5ndGgoKV07Ci0KLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaGl0cy5sZW5ndGg7IGkrKykgewotCQkJCURvY3VtZW50IGRvYyA9IGxoaXRzLmRvYyhpKTsKLQkJCQloaXRzW2ldID0gbmV3IENvbmZpZ3VyYXRpb25IaXRFbnRyeSgpOwotCQkJCWhpdHNbaV0uc2V0TmFtZShkb2MuZ2V0KE5BTUVfRklFTEQpKTsKLQkJCQloaXRzW2ldLnNldFVybChkb2MuZ2V0KFVSTF9GSUVMRCkpOwotCQkJCWhpdHNbaV0uc2V0QnJpZWZEZXNjKGRvYy5nZXQoQlJJRUZfREVTQ1JJUFRJT05fRklFTEQpKTsKLQkJCQloaXRzW2ldLnNldElkKGRvYy5nZXQoSURfRklFTEQpKTsKLQkJCQloaXRzW2ldLnNldFR5cGUoZG9jLmdldChUWVBFX0ZJRUxEKSk7Ci0JCQl9Ci0JCQlyZXR1cm4gaGl0czsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBTZWFyY2hDb25maWd1cmF0aW9uRXhjZXB0aW9uKGUpOwotCQl9IGZpbmFsbHkgewotCQkJaWYgKHNlYXJjaGVyICE9IG51bGwpIHsKLQkJCQl0cnkgewotCQkJCQlzZWFyY2hlci5jbG9zZSgpOwotCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgb2YgdGhlIGluZGV4IGRhdGFiYXNlIGFscmVhZHkgZXhpc3RzLgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGluZGV4IGRhdGFiYXNlIGFscmVhZHkgZXhpc3RzCi0JICovCi0JcHVibGljIGJvb2xlYW4gaW5kZXhFeGlzdHMoKSB7Ci0JCUZpbGVbXSBmaWxlcyA9IG5ldyBGaWxlKGluZGV4RGlyKS5saXN0RmlsZXMoKTsKLQkJcmV0dXJuIChmaWxlcyAhPSBudWxsICYmIGZpbGVzLmxlbmd0aCAhPSAwKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBzZWFyY2ggaW5kZXguCi0JICogCi0JICogQHRocm93cyBTZWFyY2hTZXJ2aWNlRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlIGV4ZWN1dGluZyB0aGUgb3BlcmF0aW9uCi0JICovCi0JcHVibGljIHZvaWQgaW5kZXgoKSB0aHJvd3MgU2VhcmNoU2VydmljZUV4Y2VwdGlvbiB7Ci0JCWluZGV4KG51bGwsIGZhbHNlKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBzZWFyY2ggaW5kZXguCi0JICogCi0JICogQHBhcmFtIHJlaW5kZXgKLQkgKiAgICAgICAgICAgIGlmIDxjb2RlPnRydWU8L2NvZGU+LCBwZXJmb3JtcyBhIHJlaW5kZXgKLQkgKiBAdGhyb3dzIFNlYXJjaFNlcnZpY2VFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUgZXhlY3V0aW5nIHRoZSBvcGVyYXRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBpbmRleChib29sZWFuIHJlaW5kZXgpIHRocm93cyBTZWFyY2hTZXJ2aWNlRXhjZXB0aW9uIHsKLQkJaW5kZXgobnVsbCwgcmVpbmRleCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgaW5kZXggZGF0YWJhc2UuCi0JICogCi0JICogQHBhcmFtIHBtCi0JICogICAgICAgICAgICBhIHByb2dyZXNzIG1vbml0b3IKLQkgKiBAcGFyYW0gcmVpbmRleAotCSAqICAgICAgICAgICAgaWYgPGNvZGU+dHJ1ZTwvY29kZT4sIHBlcmZvcm1zIGEgcmVpbmRleAotCSAqIEB0aHJvd3MgU2VhcmNoU2VydmljZUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycyB3aGlsZSBleGVjdXRpbmcgdGhlIG9wZXJhdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIGluZGV4KElQcm9ncmVzc01vbml0b3IgcG0sIGJvb2xlYW4gcmVpbmRleCkKLQkJCXRocm93cyBTZWFyY2hTZXJ2aWNlRXhjZXB0aW9uIHsKLQkJc3luY2hyb25pemVkIChDb25maWd1cmF0aW9uU2VhcmNoU2VydmljZS5jbGFzcykgewotCQkJaWYgKGluZGV4RGlyID09IG51bGwgfHwgZG9jRGlyID09IG51bGwpIHsKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJJbnZhbGlkIGluZGV4RGlyIG9yIGRvY0RpciIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0KLQkJCWlmICghcmVpbmRleCAmJiBpbmRleEV4aXN0cygpKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCi0JCQlpZiAocG0gIT0gbnVsbCkgewotCQkJCXBtLmJlZ2luVGFzayhTZWFyY2hSZXNvdXJjZXMuaW5kZXhDb25maWdGaWxlc1Rhc2tfbmFtZSwKLQkJCQkJCWdldFRvdGFsRG9jc1RvSW5kZXgoZG9jRGlyKSk7IAotCQkJfQotCi0JCQl0cnkgewotCQkJCWRlbGV0ZUFsbEluZGV4RGlycygpOwotCQkJCW5ldyBGaWxlKGluZGV4RGlyKS5ta2RpcnMoKTsKLQkJCQlJbmRleFdyaXRlciB3cml0ZXIgPSBuZXcgSW5kZXhXcml0ZXIoaW5kZXhEaXIsCi0JCQkJCQluZXcgVGV4dEFuYWx5emVyKCksIHRydWUpOwotCQkJCXdyaXRlci5tYXhGaWVsZExlbmd0aCA9IDEwMDAwMDA7Ci0JCQkJcGFyc2VyID0gbmV3IEhUTUxQYXJzZXIoKTsKLQkJCQlpbmRleERvY3MobmV3IEZpbGUoZG9jRGlyKSwgd3JpdGVyLCBwbSk7Ci0JCQkJd3JpdGVyLm9wdGltaXplKCk7Ci0JCQkJd3JpdGVyLmNsb3NlKCk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCXRocm93IG5ldyBHZW5lcmF0ZVNlYXJjaEluZGV4RXhjZXB0aW9uKGUpOwotCQkJfSBmaW5hbGx5IHsKLQkJCQlpZiAocG0gIT0gbnVsbCkgewotCQkJCQlwbS5kb25lKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogRGVsZXRlcyBhbGwgZXhpc3RpbmcgaW5kZXggZGF0YWJhc2VzLgotCSAqLwotCXB1YmxpYyB2b2lkIGRlbGV0ZUFsbEluZGV4RGlycygpIHsKLQkJRmlsZSBwYXJlbnQgPSBuZXcgRmlsZShpbmRleERpcikuZ2V0UGFyZW50RmlsZSgpOwotCQlGaWxlW10gZmlsZXMgPSBwYXJlbnQubGlzdEZpbGVzKCk7Ci0JCWlmIChmaWxlcyAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKGZpbGVzW2ldLmdldE5hbWUoKS5zdGFydHNXaXRoKCJpbmRleCIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJRmlsZVtdIGZpbGUgPSBmaWxlc1tpXS5saXN0RmlsZXMoKTsKLQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBmaWxlLmxlbmd0aDsgaisrKSB7Ci0JCQkJCQlmaWxlW2pdLmRlbGV0ZSgpOwotCQkJCQl9Ci0JCQkJCWZpbGVzW2ldLmRlbGV0ZSgpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHRvdGFsIG51bWJlciBvZiBmaWxlcyB0aGF0IHdpbGwgYmUgYWRkZWQgdG8gdGhlIHNlYXJjaCBpbmRleC4KLQkgKiAKLQkgKiBAcGFyYW0gZGlyCi0JICogICAgICAgICAgICB0aGUgZGlyZWN0b3J5IG5hbWUKLQkgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgZmlsZXMgdGhhdCB3aWxsIGJlIGFkZGVkIHRvIHRoZSBzZWFyY2ggaW5kZXgsCi0JICogICAgICAgICBpbmNsdWRpbmcgYWxsIHN1Yi1kaXJlY3RvcmllcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IGdldFRvdGFsRG9jc1RvSW5kZXgoU3RyaW5nIGRpcikgewotCQlpbnQgdG90YWwgPSAwOwotCQlGaWxlIGRpckZpbGUgPSBuZXcgRmlsZShkaXIpOwotCQlGaWxlIGZpbGVzW10gPSBkaXJGaWxlLmxpc3RGaWxlcygpOwotCQlpZiAoZmlsZXMgPT0gbnVsbCkgewotCQkJcmV0dXJuIHRvdGFsOwotCQl9Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChpc1hNSURvYyhmaWxlc1tpXSkpIHsKLQkJCQl0b3RhbCsrOwotCQkJfSBlbHNlIGlmIChmaWxlc1tpXS5pc0RpcmVjdG9yeSgpKSB7Ci0JCQkJdG90YWwgKz0gZ2V0VG90YWxEb2NzVG9JbmRleChmaWxlc1tpXS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRvdGFsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZmlsZSBuZWVkcyB0byBiZSBpbmRleGVkLgotCSAqIAotCSAqIEBwYXJhbSBmaWxlCi0JICogICAgICAgICAgICB0aGUgZmlsZSB0byBiZSB2ZXJpZmllZAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGZpbGUgbmVlZHMgdG8gYmUgaW5kZXhlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNYTUlEb2MoRmlsZSBmaWxlKSB7Ci0JCXJldHVybiBmaWxlLmdldFBhdGgoKS5lbmRzV2l0aCgiLnhtaSIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIHRoZSBmaWxlIG5lZWRzIHRvIGJlIGluZGV4ZWQuCi0JICogCi0JICogQHBhcmFtIGZpbGUKLQkgKiAgICAgICAgICAgIHRoZSBmaWxlIHRvIGJlIHZlcmlmaWVkCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgZmlsZSBuZWVkcyB0byBiZSBpbmRleGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0h0bWxPclRleHREb2MoRmlsZSBmaWxlKSB7Ci0JCVN0cmluZyBwYXRoID0gZmlsZS5nZXRQYXRoKCk7Ci0JCXJldHVybiBwYXRoLmVuZHNXaXRoKCIuaHRtbCIpIHx8IHBhdGguZW5kc1dpdGgoIi5odG0iKSB8fCBwYXRoLmVuZHNXaXRoKCIudHh0Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JfQotCi0JLyoqCi0JICogQSByZWN1cnNpdmUgZnVuY3Rpb24gdG8gaW5kZXggZmlsZXMuCi0JICogCi0JICogQHBhcmFtIGZpbGUKLQkgKiAgICAgICAgICAgIGEgZGlyZWN0b3J5IG9yIGZpbGUgdG8gYmUgaW5kZXhlZAotCSAqIEBwYXJhbSB3cml0ZXIKLQkgKiAgICAgICAgICAgIHRoZSBpbmRleCB3cml0ZXIKLQkgKiBAcGFyYW0gcG0KLQkgKiAgICAgICAgICAgIGEgcHJvZ3Jlc3MgbW9uaXRvcgotCSAqIEB0aHJvd3MgRXhjZXB0aW9uCi0JICovCi0JcHJpdmF0ZSB2b2lkIGluZGV4RG9jcyhGaWxlIGZpbGUsIEluZGV4V3JpdGVyIHdyaXRlciwgSVByb2dyZXNzTW9uaXRvciBwbSkKLQkJCXRocm93cyBFeGNlcHRpb24gewotCQlpZiAoZmlsZS5pc0RpcmVjdG9yeSgpKSB7Ci0JCQlpZiAoZmlsZS5nZXROYW1lKCkuZXF1YWxzSWdub3JlQ2FzZSgiYXBwbGV0IikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCXJldHVybjsKLQkJCX0KLQkJCVN0cmluZ1tdIGZpbGVzID0gZmlsZS5saXN0KCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaW5kZXhEb2NzKG5ldyBGaWxlKGZpbGUsIGZpbGVzW2ldKSwgd3JpdGVyLCBwbSk7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoaXNIdG1sT3JUZXh0RG9jKGZpbGUpKSB7Ci0JCQlpZiAocG0gIT0gbnVsbCkgewotCQkJCXBtLnN1YlRhc2soZmlsZS5nZXROYW1lKCkpOwotCQkJCXBtLndvcmtlZCgxKTsKLQkJCX0KLQkJCWlmIChzaG91bGRCZUV4Y2x1ZGVkKGZpbGUpKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJRG9jdW1lbnQgZG9jID0gZ2V0SFRNTERvY3VtZW50KGZpbGUpOwotCQkJd3JpdGVyLmFkZERvY3VtZW50KGRvYyk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIDxvY2RlPnRydWU8L2NvZGU+IGlmIHRoZSBmaWxlIHNob3VsZCBiZSBleGNsdWRlZCBmcm9tIGluZGV4aW5nLgotCSAqIAotCSAqIEBwYXJhbSBmaWxlCi0JICogICAgICAgICAgICBhIGZpbGUKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBmaWxlIHNob3VsZCBiZSBleGNsdWRlZCBmcm9tIGluZGV4aW5nCi0JICovCi0JcHVibGljIGJvb2xlYW4gc2hvdWxkQmVFeGNsdWRlZChGaWxlIGZpbGUpIHsKLQkJU3RyaW5nIHAgPSBmaWxlLmdldFBhcmVudEZpbGUoKS5nZXRBYnNvbHV0ZVBhdGgoKTsKLQkJcmV0dXJuIGRvY0Rpci5zdGFydHNXaXRoKHApOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGRvY3VtZW50IG9iamVjdCBvZiBhIEhUTUwgZmlsZS4KLQkgKiAKLQkgKiBAcGFyYW0gZmlsZQotCSAqICAgICAgICAgICAgdGhlIEhUTUwgZmlsZSB0byBiZSBpbmRleGVkCi0JICogQHJldHVybiBhIGRvY3VtZW50IG9iamVjdAotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBpZiBhbiBJL08gZXJyb3Igb2NjdXJzIHdoaWxlIHBhcnNpbmcgdGhlIEhUTUwgZmlsZQotCSAqIEB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBpZiB0aGUgb3BlcmF0aW9uIGlzIGludGVycnVwdGVkIGJ5IGEgdXNlcgotCSAqLwotCXB1YmxpYyBEb2N1bWVudCBnZXRIVE1MRG9jdW1lbnQoRmlsZSBmaWxlKSB0aHJvd3MgSU9FeGNlcHRpb24sCi0JCQlJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCURvY3VtZW50IGRvYyA9IG5ldyBEb2N1bWVudCgpOwotCQlkb2MuYWRkKEZpZWxkLlVuSW5kZXhlZChVUkxfRklFTEQsIGZpbGUuZ2V0UGF0aCgpLnJlcGxhY2UoCi0JCQkJRmlsZS5wYXRoU2VwYXJhdG9yQ2hhciwgJy8nKSkpOwotCQlkb2MuYWRkKEZpZWxkLktleXdvcmQoTU9ESUZJRURfRklFTEQsIERhdGVGaWVsZC50aW1lVG9TdHJpbmcoZmlsZQotCQkJCS5sYXN0TW9kaWZpZWQoKSkpKTsKLQotCQl0cnkgewotCQkJcGFyc2VyLnBhcnNlKGZpbGUpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQl9Ci0KLQkJZG9jLmFkZChGaWVsZC5UZXh0KENPTlRFTlRfRklFTEQsIHBhcnNlci5nZXRUZXh0KCkpKTsKLQkJZG9jLmFkZChGaWVsZC5VbkluZGV4ZWQoU1VNTUFSWV9GSUVMRCwgcGFyc2VyLmdldFN1bW1hcnkoKSkpOwotCi0JCVByb3BlcnRpZXMgbWV0YVRhZ3MgPSBwYXJzZXIuZ2V0TWV0YVRhZ3MoKTsKLQkJZm9yIChFbnVtZXJhdGlvbiBlID0gbWV0YVRhZ3MucHJvcGVydHlOYW1lcygpOyBlLmhhc01vcmVFbGVtZW50cygpOykgewotCQkJU3RyaW5nIHRhZ05hbWUgPSAoU3RyaW5nKSBlLm5leHRFbGVtZW50KCk7Ci0JCQlkb2MuYWRkKEZpZWxkLlRleHQodGFnTmFtZSwgbWV0YVRhZ3MuZ2V0UHJvcGVydHkodGFnTmFtZSkpKTsKLQkJfQotCi0JCWlmIChkb2MuZ2V0RmllbGQoUk9MRV9GSUVMRCkgPT0gbnVsbCkgewotCQkJZG9jLmFkZChGaWVsZC5UZXh0KFJPTEVfRklFTEQsICJOT1JVUFJPTEUiKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCXJldHVybiBkb2M7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC9jb25maWd1cmF0aW9uL2ludGVybmFsL3BhY2thZ2UuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvY29uZmlndXJhdGlvbi9pbnRlcm5hbC9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlMDdhYzUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC9jb25maWd1cmF0aW9uL2ludGVybmFsL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIHRoZSBpbXBsZW1lbnRhdGlvbiBmb3Igc2VhcmNoaW5nIGEgcHVibGlzaGVkIGNvbmZpZ3VyYXRpb24uCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC9jb25maWd1cmF0aW9uL3BhY2thZ2UuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvY29uZmlndXJhdGlvbi9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkN2M0YjAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC9jb25maWd1cmF0aW9uL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIGltcGxlbWVudGF0aW9uIHN1cHBvcnQgZm9yIHNlYXJjaGluZyBhIHB1Ymxpc2hlZCBjb25maWd1cmF0aW9uLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvcGFja2FnZS5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwZmNhOTYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyB0aGUgaW50ZXJmYWNlcyBmb3IgdGhlIHNlYXJjaCBzZXJ2aWNlLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvdXRpbHMvSmFyQ3JlYXRvci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC91dGlscy9KYXJDcmVhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiMTU3ZDkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC91dGlscy9KYXJDcmVhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy9Db3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vL0FsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vL3doaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vL2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy9Db250cmlidXRvcnM6Ci0vL0lCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5zZWFyY2gudXRpbHM7Ci0KLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5CdWZmZXJlZE91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLnppcC5aaXBFbnRyeTsKLWltcG9ydCBqYXZhLnV0aWwuemlwLlppcE91dHB1dFN0cmVhbTsKLQotcHVibGljIGNsYXNzIEphckNyZWF0b3IgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5ERVhfSkFSID0gImluZGV4LmphciI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQkJamFyRm9sZGVyKGFyZ3NbMF0pOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBqYXJGb2xkZXIoU3RyaW5nIGZvbGRlcm5hbWUpIHsKLQkJdHJ5IHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiYXR0ZW1wdGluZyB0byBqYXIgc3R1ZmYiKTsgLy8kTk9OLU5MUy0xJAotCQkJRmlsZSBqYXJEaXIgPSBuZXcgRmlsZShmb2xkZXJuYW1lKTsKLQkJCUZpbGUgamFyRmlsZSA9IG5ldyBGaWxlKGZvbGRlcm5hbWUgKyBGaWxlLnNlcGFyYXRvciArIElOREVYX0pBUik7Ci0KLQkJCWphckZpbGVzKGphckRpciwgamFyRmlsZSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlMSkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJFeGNlcHRpb24gaW4gdGhlIGphciB0aGluZ3kiKTsgLy8kTk9OLU5MUy0xJAotCQkJZTEucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBtZXRob2QgdG8gamFyIHRoZSBzcGVjaWZpZWQgZGlyIGludG8gYSBqYXIgZmlsZS4gbm9uLXN1Yi1mb2xkZXJzIHdpbGwgYmUKLQkgKiBqYXJlZC4KLQkgKiAKLQkgKiBAcGFyYW0gamFyRGlyCi0JICogQHBhcmFtIGphckZpbGUKLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGphckZpbGVzKEZpbGUgamFyRGlyLCBGaWxlIGphckZpbGUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCUZpbGVbXSBmaWxlcyA9IGphckRpci5saXN0RmlsZXMoKTsKLQkJaWYgKGphckZpbGUuZXhpc3RzKCkpIHsKLQkJCWphckZpbGUuZGVsZXRlKCk7Ci0JCX0KLQkJQnVmZmVyZWRPdXRwdXRTdHJlYW0gYlN0cmVhbSA9IG5ldyBCdWZmZXJlZE91dHB1dFN0cmVhbShuZXcgRmlsZU91dHB1dFN0cmVhbSgKLQkJCQlqYXJGaWxlKSk7Ci0JCVppcE91dHB1dFN0cmVhbSB6aXBwZXJTdHJlYW0gPSBuZXcgWmlwT3V0cHV0U3RyZWFtKGJTdHJlYW0pOwotCi0JCWJ5dGVbXSBieXRlcyA9IG5ldyBieXRlWzQwOTZdOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlGaWxlIGN1cnJlbnRGaWxlID0gZmlsZXNbaV07Ci0JCQlpZiAoY3VycmVudEZpbGUuaXNEaXJlY3RvcnkoKSkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJWmlwRW50cnkgY3VyckVudHJ5ID0gbmV3IFppcEVudHJ5KGN1cnJlbnRGaWxlLmdldE5hbWUoKSk7Ci0JCQl6aXBwZXJTdHJlYW0ucHV0TmV4dEVudHJ5KGN1cnJFbnRyeSk7Ci0JCQlCdWZmZXJlZElucHV0U3RyZWFtIGJpU3RyZWFtID0gbmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0obmV3IEZpbGVJbnB1dFN0cmVhbSgKLQkJCQkJY3VycmVudEZpbGUpKTsKLQkJCXdoaWxlIChiaVN0cmVhbS5hdmFpbGFibGUoKSA+IDApIHsKLQkJCQlpbnQgbnVtID0gYmlTdHJlYW0ucmVhZChieXRlcyk7Ci0JCQkJemlwcGVyU3RyZWFtLndyaXRlKGJ5dGVzLCAwLCBudW0pOwotCQkJfQotCQkJYmlTdHJlYW0uY2xvc2UoKTsKLQkJCXppcHBlclN0cmVhbS5jbG9zZUVudHJ5KCk7Ci0JCX0KLQkJemlwcGVyU3RyZWFtLmNsb3NlKCk7Ci0JCWJTdHJlYW0uY2xvc2UoKTsKLQl9CQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC91dGlscy9MSFRNTFBhcnNlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC91dGlscy9MSFRNTFBhcnNlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NjY5YjE5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvdXRpbHMvTEhUTUxQYXJzZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vL0NvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy9hcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vL0NvbnRyaWJ1dG9yczoKLS8vSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51dGlsczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci1pbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7Ci0KLS8qKgotICogQSBIVE1MIHBhcnNlciB1c2VkIGZvciBleHRyYWN0aW5nIHRoZSBtZXRhIHRhZ3MgYW5kIHRleHQgZnJvbSBhIEhUTUwKLSAqIGRvY3VtZW50LgotICogCi0gKiBUT0RPOiBJbXBsZW1lbnQgb3VyIG93biBIVE1MIHBhcnNlci4KLSAqLwotcHVibGljIGNsYXNzIExIVE1MUGFyc2VyIGV4dGVuZHMgb3JnLmFwYWNoZS5sdWNlbmUuZGVtby5odG1sLkhUTUxQYXJzZXIgewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgTEhUTUxQYXJzZXIoRmlsZSBmaWxlKSB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHsKLQkJc3VwZXIoZmlsZSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgTEhUTUxQYXJzZXIoSW5wdXRTdHJlYW0gc3RyZWFtKSB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHsKLQkJc3VwZXIoc3RyZWFtKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBMSFRNTFBhcnNlcihSZWFkZXIgc3RyZWFtKSB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHsKLQkJc3VwZXIoc3RyZWFtKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBIVE1MIG1ldGEgdGFncy4KLQkgKi8KLQlwdWJsaWMgUHJvcGVydGllcyBnZXRNZXRhVGFncygpIHRocm93cyBJT0V4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQlyZXR1cm4gc3VwZXIuZ2V0TWV0YVRhZ3MoKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSByZWFkZXIgZm9yIHRoZSBIVE1MIGNvbnRlbnQuCi0JICovCi0JcHVibGljIFJlYWRlciBnZXRSZWFkZXIoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlyZXR1cm4gc3VwZXIuZ2V0UmVhZGVyKCk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgSFRNTCB0aXRsZS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRpdGxlKCkgdGhyb3dzIElPRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBzdXBlci5nZXRUaXRsZSgpOwotCX0KLQkKLQkvKioKLQkgKiBHZXRzIGEgc3VtbWFyeSBvZiB0aGUgSFRMIGRvY3VtZW50LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U3VtbWFyeSgpIHRocm93cyBJT0V4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQlyZXR1cm4gc3VwZXIuZ2V0U3VtbWFyeSgpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL3V0aWxzL1VOQ1V0aWwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvdXRpbHMvVU5DVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYjA1YzdmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvdXRpbHMvVU5DVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzE1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vL0NvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy9hcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vL0NvbnRyaWJ1dG9yczoKLS8vSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51dGlsczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLQotcHVibGljIGNsYXNzIFVOQ1V0aWwgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVOQ19GSUxFX1BSRUZJWCA9ICJmaWxlOi8iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUxURVJOQVRFX1VOQ19GSUxFX1BSRUZJWCA9ICJmaWxlOi8vIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5FVFNDQVBFX1VOQ19GSUxFX1BSRUZJWCA9ICJmaWxlOi8vLyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVTkNfRklMRV9PTkxZID0gImZpbGU6IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVOQ19TRVBBUkFUT1IgPSAiLyI7IC8vJE5PTi1OTFMtMSQKLQotCi0JLyoqCi0JICogQWNjb3VudHMgZm9yIG5ldHNjYXBlIHVuYyBmaWxlIHByZWZpeC4gQ29udmVydHMgdG8gc3RhbmRhcmQgb25lLgotCSAqIElmIG5vdCBOZXRzY2FwZSwgbm90aGluZyBjaGFuZ2VzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGhhbmRsZU5ldHNjYXBlRmlsZVByZWZpeChTdHJpbmcgZmlsZW5hbWUpCi0JewotCQlTdHJpbmcgY29udmVydGVkTmFtZSA9IG51bGw7Ci0KLQkJaWYgKGZpbGVuYW1lLnN0YXJ0c1dpdGgoTkVUU0NBUEVfVU5DX0ZJTEVfUFJFRklYKSkKLQkJewotCQkJY29udmVydGVkTmFtZSA9Ci0JCQkJQUxURVJOQVRFX1VOQ19GSUxFX1BSRUZJWAotCQkJCQkrIGZpbGVuYW1lLnN1YnN0cmluZygKLQkJCQkJCU5FVFNDQVBFX1VOQ19GSUxFX1BSRUZJWC5sZW5ndGgoKSwKLQkJCQkJCWZpbGVuYW1lLmxlbmd0aCgpKTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCWNvbnZlcnRlZE5hbWUgPSBmaWxlbmFtZTsKLQkJfQotCi0JCXJldHVybiAoY29udmVydGVkTmFtZSk7Ci0JfQotCi0JLyoqCi0JICogSGFuZGxlcyBVUkwgcGF0aHMgZm9yIE1vemlsbGEgKGFuZCBvdGhlciBicm93c2Vycykgb3ZlciBVTkMuCi0JICovCi0JcHVibGljIHN0YXRpYyBVUkwgaGFuZGxlVVJMRm9yVU5DKFVSTCBvcmlnaW5hbFVybCkKLQl7Ci0JCS8vIGhhbmRsZSBzcGVjaWFsIGNhc2UgZm9yIE1vemlsbGEgb3ZlciBVTkMKLQkJVVJMIG5ld1VybCA9IG51bGw7Ci0JCXRyeQotCQl7Ci0JCQlpZiAob3JpZ2luYWxVcmwudG9TdHJpbmcoKS5zdGFydHNXaXRoKCJmaWxlOi8vIikpIC8vJE5PTi1OTFMtMSQKLQkJCXsKLQkJCQkvLyBjaGFuZ2UgImZpbGU6Ly8iIHRvICJmaWxlOi8vLy8vIgotCQkJCVN0cmluZyBleHRyYWN0ZWRTdHJpbmcgPSBvcmlnaW5hbFVybC50b1N0cmluZygpLnN1YnN0cmluZyg1KTsKLQkJCQluZXdVcmwgPSBuZXcgVVJMKCJmaWxlIiwgIiIsICIvLy8iICsgZXh0cmFjdGVkU3RyaW5nKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQluZXdVcmwgPSBvcmlnaW5hbFVybDsKLQkJCX0KLQkJfQotCQljYXRjaCAoamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uIG11ZSkKLQkJewotCQkJbmV3VXJsID0gb3JpZ2luYWxVcmw7Ci0JCX0KLQotCQlyZXR1cm4gKG5ld1VybCk7Ci0JfQotCi0JLyoqCi0JICogQ29udmVydHMgdGhlIFVOQyBmaWxlIHRvIGEgcmVndWxhciwgcGxhdGZvcm0tZGVwZW5kZW50IG9uZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb252ZXJ0RmlsZW5hbWUoU3RyaW5nIGZpbGVuYW1lKQotCXsKLQkJU3RyaW5nIGNvbnZlcnRlZE5hbWUgPSBudWxsOwotCi0JCS8vIHJlbW92ZSBhbnkgVVJMIHByZWZpeGVzCi0JCVN0cmluZyB0ZW1wTmFtZSA9IG51bGw7Ci0JCWlmIChmaWxlbmFtZS5zdGFydHNXaXRoKFVOQ19GSUxFX1BSRUZJWCkpCi0JCXsKLQkJCXRlbXBOYW1lID0gZmlsZW5hbWUuc3Vic3RyaW5nKFVOQ19GSUxFX1BSRUZJWC5sZW5ndGgoKSwgZmlsZW5hbWUubGVuZ3RoKCkpOwotCQkJaW50IGluZGV4ID0gdGVtcE5hbWUuaW5kZXhPZigiOiIpOyAvLyROT04tTkxTLTEkCi0JCQlpZiAoaW5kZXggPT0gLTEpCi0JCQl7Ci0JCQkJLy8gb24gVW5peCwgYWRkIHNlcGFyYXRvciBiYWNrIHRvIGZpcnN0IGNoYXJhY3RlcgotCQkJCXRlbXBOYW1lID0gVU5DX1NFUEFSQVRPUiArIHRlbXBOYW1lOwotCQkJfQotCQl9Ci0JCWVsc2UKLQkJewotCQkJdGVtcE5hbWUgPSBmaWxlbmFtZTsKLQkJfQotCi0JCS8vIGNvbnZlcnQgYW55IFVOQyBzZXBhcmF0b3JzIHRvIHRoZSBzeXN0ZW0gZGVmYXVsdCBvbmUKLQkJY29udmVydGVkTmFtZSA9Ci0JCQl0ZW1wTmFtZS5yZXBsYWNlKFVOQ19TRVBBUkFUT1IuY2hhckF0KDApLCBGaWxlLnNlcGFyYXRvci5jaGFyQXQoMCkpOwotCi0JCXJldHVybiAoY29udmVydGVkTmFtZSk7Ci0JfQotCi0JLyoqCi0JICogQ29udmVydHMgdGhlIGZpbGVuYW1lIHRvIGEgVU5DIGZpbGVuYW1lLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbnZlcnRGaWxlbmFtZVRvVU5DKFN0cmluZyBmaWxlbmFtZSkKLQl7Ci0JCS8vIGNvbnZlcnQgYW55IFVOQyBzZXBhcmF0b3JzIHRvIHRoZSBzeXN0ZW0gZGVmYXVsdCBvbmUKLQkJU3RyaW5nIGNvbnZlcnRlZE5hbWUgPQotCQkJZmlsZW5hbWUucmVwbGFjZShGaWxlLnNlcGFyYXRvci5jaGFyQXQoMCksIFVOQ19TRVBBUkFUT1IuY2hhckF0KDApKTsKLQkJU3RyaW5nIGZpbmFsTmFtZSA9IGNvbnZlcnRGaWxlU2VwYXJhdG9yKGNvbnZlcnRlZE5hbWUpOwotCQlyZXR1cm4gKGZpbmFsTmFtZSk7Ci0JfQotCi0JLyoqCi0JICogQ29udmVydHMgdGhlIFVSTCB0byBvbmUgd2hpY2ggY2FuIHRoYXQgbWF0Y2hlcyBhIFVOQyBjb252ZW50aW9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbnZlcnRUb1VOQyhTdHJpbmcgdXJsKQotCXsKLQkJU3RyaW5nIGNvbnZlcnRlZFVybCA9IG51bGw7Ci0JCWlmICh1cmwuc3RhcnRzV2l0aChBTFRFUk5BVEVfVU5DX0ZJTEVfUFJFRklYKSkKLQkJewotCQkJY29udmVydGVkVXJsID0KLQkJCQlVTkNfRklMRV9QUkVGSVgKLQkJCQkJKyB1cmwuc3Vic3RyaW5nKEFMVEVSTkFURV9VTkNfRklMRV9QUkVGSVgubGVuZ3RoKCksIHVybC5sZW5ndGgoKSk7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQljb252ZXJ0ZWRVcmwgPSB1cmw7Ci0JCX0KLQkJcmV0dXJuIChjb252ZXJ0ZWRVcmwpOwotCi0JfQotCi0JLyoqCi0JICogUmVtb3ZlcyB0aGUgIiUyMCIgdGhhdCBpcyB1c2VkIGJ5IHNvbWUgYnJvd3NlcnMgZm9yIHNwYWNlcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbnZlcnRGaWxlU3BhY2luZyhTdHJpbmcgZmlsZW5hbWUpCi0JewotCQkvLyBub3cgcmVtb3ZlIGFueSAiJTIwIgotCQlpbnQgc3RhcnQgPSAwOwotCQlTdHJpbmcgbmV3RmlsZW5hbWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQl3aGlsZSAoc3RhcnQgPCBmaWxlbmFtZS5sZW5ndGgoKSkKLQkJewotCQkJaW50IGluZGV4ID0gZmlsZW5hbWUuaW5kZXhPZigiJTIwIiwgc3RhcnQpOyAvLyROT04tTkxTLTEkCi0JCQlpZiAoaW5kZXggPT0gLTEpCi0JCQl7Ci0JCQkJaW5kZXggPSBmaWxlbmFtZS5sZW5ndGgoKTsKLQkJCX0KLQkJCW5ld0ZpbGVuYW1lICs9IGZpbGVuYW1lLnN1YnN0cmluZyhzdGFydCwgaW5kZXgpOwotCQkJbmV3RmlsZW5hbWUgKz0gIiAiOyAvLyROT04tTkxTLTEkCi0JCQlzdGFydCA9IGluZGV4ICsgMzsKLQkJfQotCi0JCW5ld0ZpbGVuYW1lID0gbmV3RmlsZW5hbWUudHJpbSgpOwotCi0JCXJldHVybiAobmV3RmlsZW5hbWUpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZXMgdGhlICIlNUMiIHRoYXQgaXMgdXNlZCBieSBzb21lIGJyb3dzZXJzIGZvciBmaWxlIHNlcGFyYXRvci4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb252ZXJ0RmlsZVNlcGFyYXRvcihTdHJpbmcgZmlsZW5hbWUpCi0JewotCQkvLyByZW1vdmUgYW55ICIlNUMiCi0JCWludCBzdGFydCA9IDA7Ci0JCVN0cmluZyBuZXdGaWxlbmFtZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCXdoaWxlIChzdGFydCA8IGZpbGVuYW1lLmxlbmd0aCgpKQotCQl7Ci0JCQlpbnQgaW5kZXggPSBmaWxlbmFtZS5pbmRleE9mKCIlNUMiLCBzdGFydCk7IC8vJE5PTi1OTFMtMSQKLQkJCWlmIChpbmRleCA9PSAtMSkKLQkJCXsKLQkJCQkvL2luZGV4ID0gZmlsZW5hbWUubGVuZ3RoKCk7Ci0JCQkJbmV3RmlsZW5hbWUgPSBmaWxlbmFtZS50cmltKCk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQluZXdGaWxlbmFtZSArPSBmaWxlbmFtZS5zdWJzdHJpbmcoc3RhcnQsIGluZGV4KTsKLQkJCW5ld0ZpbGVuYW1lICs9IFVOQ19TRVBBUkFUT1I7Ci0JCQlzdGFydCA9IGluZGV4ICsgMzsKLQkJfQotCi0JCW5ld0ZpbGVuYW1lID0gbmV3RmlsZW5hbWUudHJpbSgpOwotCi0JCS8vIGFsc28gaWYgZmlsZSBzZXBhcmF0b3IgZXF1YWxzIHVuYyBzZXBhcmF0b3IsIHJlbW92ZSBhbnkgV2luZG93cwotCQkvLyBzcGVjaWZpYyAiXCIKLQkJU3RyaW5nIHdpbmRvd3NGaWxlU2VwYXJhdG9yID0gIlxcIjsgLy8kTk9OLU5MUy0xJAotCQlpZiAoIUZpbGUuc2VwYXJhdG9yLmVxdWFscyh3aW5kb3dzRmlsZVNlcGFyYXRvcikKLQkJCSYmIEZpbGUuc2VwYXJhdG9yLmVxdWFscyhVTkNfU0VQQVJBVE9SKSkKLQkJewotCQkJLy8gb24gVW5peAotCQkJbmV3RmlsZW5hbWUgPQotCQkJCW5ld0ZpbGVuYW1lLnJlcGxhY2UoCi0JCQkJCXdpbmRvd3NGaWxlU2VwYXJhdG9yLmNoYXJBdCgwKSwKLQkJCQkJVU5DX1NFUEFSQVRPUi5jaGFyQXQoMCkpOwotCQl9Ci0JCXJldHVybiAobmV3RmlsZW5hbWUpOwotCX0KLQotCS8qKgotCSAqIFJldHJpZXZlcyB0aGUgZmlsZSBuYW1lcyBmcm9tIHRoZSBzcGVjaWZpZWQgZGlyZWN0b3J5Ci0JICogdGhhdCBtYXRjaGVzIHRoZSBnaXZlbiBzdWZmaXguICBBbiBleGFtcGxlIG9mIGEgCi0JICogc3VmZml4IGlzICIuZGF0Ii4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFZlY3RvciBnZXRGaWxlTGlzdChTdHJpbmcgZGlyZWN0b3J5LCBTdHJpbmcgc3VmZml4KQotCXsKLQkJaWYgKGRpcmVjdG9yeS5zdGFydHNXaXRoKCJodHRwIikpIC8vJE5PTi1OTFMtMSQKLQkJewotCQkJLy8gcmVtb3RlIGRpcmVjdG9yeSwgdXNlIHRoaXMgaW5zdGVhZAotCQkJcmV0dXJuIChnZXRGaWxlTGlzdEZyb21SZW1vdGUoZGlyZWN0b3J5LCBzdWZmaXgpKTsKLQkJfQotCi0JCVN0cmluZyB0ZW1wRGlyID0gVU5DVXRpbC5jb252ZXJ0RmlsZW5hbWUoZGlyZWN0b3J5KTsKLQkJRmlsZSBkb2N1bWVudERpcmVjdG9yeSA9IG5ldyBGaWxlKFVOQ1V0aWwuY29udmVydEZpbGVTcGFjaW5nKHRlbXBEaXIpKTsKLQkJU3RyaW5nW10gZmlsZU5hbWVMaXN0ID0gZG9jdW1lbnREaXJlY3RvcnkubGlzdCgpOwotCi0JCS8vIG5vdyBwYXJzZSBhbmQgb25seSB0YWtlIHRob3NlIHRoYXQgZW5kIHdpdGggdGhlIHByb3BlciBzdWZmaXgKLQkJVmVjdG9yIGZpbmFsTGlzdCA9IG5ldyBWZWN0b3IoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlTmFtZUxpc3QubGVuZ3RoOyBpKyspCi0JCXsKLQkJCWlmIChmaWxlTmFtZUxpc3RbaV0uZW5kc1dpdGgoc3VmZml4KSkKLQkJCXsKLQkJCQlmaW5hbExpc3QuYWRkRWxlbWVudChmaWxlTmFtZUxpc3RbaV0pOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIChmaW5hbExpc3QpOwotCX0KLQotCS8qKgotCSAqIFJldHJpZXZlcyB0aGUgYXBwbGljYWJsZSBkZWZhdWx0IHJ1cCBmaWxlcyBmcm9tIHJlbW90ZSBkaXJlY3RvcnkuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgVmVjdG9yIGdldEZpbGVMaXN0RnJvbVJlbW90ZShTdHJpbmcgZGlyZWN0b3J5LCBTdHJpbmcgc3VmZml4KQotCXsKLQkJVmVjdG9yIGZpbGVuYW1lcyA9IG5ldyBWZWN0b3IoKTsKLQkJdHJ5Ci0JCXsKLQkJCS8vIGdldCB0aGUgbGlzdGluZyB1c2luZyBhIFVSTAotCQkJVVJMIHJlbW90ZVVybCA9IG5ldyBVUkwoZGlyZWN0b3J5KTsKLQkJCUlucHV0U3RyZWFtIGluU3RyZWFtID0gcmVtb3RlVXJsLm9wZW5TdHJlYW0oKTsKLQkJCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQlpbnQgYzsKLQkJCXdoaWxlICgoYyA9IGluU3RyZWFtLnJlYWQoKSkgIT0gLTEpCi0JCQl7Ci0JCQkJcmVzdWx0LmFwcGVuZCgoY2hhcikgYyk7Ci0JCQl9Ci0JCQlpblN0cmVhbS5jbG9zZSgpOwotCi0JCQkvLyBjb252ZXJ0IHN0cmluZyB0byB1cHBlciBjYXNlIHRvIGhhbmRsZSBtdWx0aXBsZSBzZXJ2ZXIgdHlwZXMgc3VjaCBhcyBBcGFjaGUKLQkJCVN0cmluZyBkaXJlY3RvcnlSZXN1bHQgPSByZXN1bHQudG9TdHJpbmcoKTsKLQkJCWRpcmVjdG9yeVJlc3VsdCA9IGRpcmVjdG9yeVJlc3VsdC5yZXBsYWNlQWxsKCJocmVmIiwgIkhSRUYiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlkaXJlY3RvcnlSZXN1bHQgPSBkaXJlY3RvcnlSZXN1bHQucmVwbGFjZUFsbCgiPC9hIiwgIjwvQSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCWRpcmVjdG9yeVJlc3VsdCA9IGRpcmVjdG9yeVJlc3VsdC5yZXBsYWNlQWxsKCI8dHQ+IiwgIiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCWRpcmVjdG9yeVJlc3VsdCA9IGRpcmVjdG9yeVJlc3VsdC5yZXBsYWNlQWxsKCI8L3R0PiIsICIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlkaXJlY3RvcnlSZXN1bHQgPSBkaXJlY3RvcnlSZXN1bHQucmVwbGFjZUFsbCgiPFRUPiIsICIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlkaXJlY3RvcnlSZXN1bHQgPSBkaXJlY3RvcnlSZXN1bHQucmVwbGFjZUFsbCgiPC9UVD4iLCAiIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JCQkvLyBwYXJzZSB0aGUgY29udGVudAotCQkJLy9TdHJpbmdUb2tlbml6ZXIgbGluZVRva2VuaXplciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoIHJlc3VsdC50b1N0cmluZygpICk7Ci0JCQlTdHJpbmdUb2tlbml6ZXIgbGluZVRva2VuaXplciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoZGlyZWN0b3J5UmVzdWx0KTsKLQkJCVZlY3RvciBsaW5lcyA9IG5ldyBWZWN0b3IoKTsKLQkJCXRyeQotCQkJewotCQkJCXdoaWxlICh0cnVlKQotCQkJCXsKLQkJCQkJbGluZVRva2VuaXplci5uZXh0VG9rZW4oIlJFRiIpOyAvLyROT04tTkxTLTEkCi0JCQkJCWxpbmVUb2tlbml6ZXIubmV4dFRva2VuKCJcIiIpOyAvLyROT04tTkxTLTEkCi0JCQkJCVN0cmluZyBsaW5lID0gbGluZVRva2VuaXplci5uZXh0VG9rZW4oIlwiIik7IC8vJE5PTi1OTFMtMSQKLQotCQkJCQkvLyBzdHJpcCBvdXQgIjwvQSI7IG5lZWRlZCB0aGlzIGJlY2F1c2UgU3RyaW5nVG9rZW5pemVyCi0JCQkJCS8vIGhhcyBwcm9ibGVtcyBwYXJzaW5nIGZpbGVuYW1lcyB0aGF0IGJlaW5nIHdpdGggIkEiCi0JCQkJCWludCBpbmRleCA9IGxpbmUuaW5kZXhPZigiPC9BIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJaWYgKGluZGV4ICE9IC0xICYmIGluZGV4ICE9IDApCi0JCQkJCXsKLQkJCQkJCVN0cmluZyBmaWxlbmFtZSA9IGxpbmUuc3Vic3RyaW5nKDAsIGluZGV4KTsKLQkJCQkJCWxpbmVzLmFkZEVsZW1lbnQoZmlsZW5hbWUpOwotCQkJCQl9Ci0JCQkJCWVsc2UKLQkJCQkJewotCQkJCQkJbGluZXMuYWRkRWxlbWVudChsaW5lKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWNhdGNoIChOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIG5lKQotCQkJewotCQkJCS8vIGRvIG5vdGhpbmcsIGVuZCBvZiBjb250ZW50Ci0JCQl9Ci0KLQkJCS8vIHBhcnNlIGVhY2ggbGluZQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaW5lcy5zaXplKCk7IGkrKykKLQkJCXsKLQkJCQlTdHJpbmcgbGluZSA9IChTdHJpbmcpIGxpbmVzLmVsZW1lbnRBdChpKTsKLQotCQkJCWlmIChsaW5lLmVuZHNXaXRoKHN1ZmZpeCkpCi0JCQkJewotCQkJCQkvLyB3ZSB3YW50IHRoaXMKLQkJCQkJZmlsZW5hbWVzLmFkZEVsZW1lbnQobGluZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWNhdGNoIChFeGNlcHRpb24gZSkKLQkJewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCQlyZXR1cm4gKGZpbGVuYW1lcyk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy8uY2xhc3NwYXRoIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1MWM4ZjIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VydmljZXMvLnByb2plY3QgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VydmljZXMvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwNWI0MTMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5jb20uaWJtLnNzZS5tb2RlbC5zdHJ1Y3R1cmVkYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy9NRVRBLUlORi9NQU5JRkVTVC5NRiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmIwZDg4Yy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VydmljZXMvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiBFUEYgU2VydmljZXMgUGx1Zy1pbgotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzO3NpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuMi4wLnF1YWxpZmllcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzLkFjdGl2YXRvcgotQnVuZGxlLVZlbmRvcjogRWNsaXBzZS5vcmcKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZSwKLSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUsCi0gb3JnLmVjbGlwc2UuZXBmLnVtYQotRWNsaXBzZS1MYXp5U3RhcnQ6IHRydWUKLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5lcGYuc2VydmljZXMKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzL2J1aWxkLnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VydmljZXMvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzU5NTQxMS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VydmljZXMvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotc291cmNlLi4gPSBzcmMvCi1vdXRwdXQuLiA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICAuLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgc2NoZW1hLwpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzL3BsdWdpbi54bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VydmljZXMvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjY4YmM1ZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VydmljZXMvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08cGx1Z2luPgotCi0gICA8ZXh0ZW5zaW9uLXBvaW50Ci0gICAgICAgICBpZD0ic2VydmljZVByb3ZpZGVycyIKLSAgICAgICAgIG5hbWU9IkVQRiBTZXJ2aWNlcyIKLSAgICAgICAgIHNjaGVtYT0ic2NoZW1hL3NlcnZpY2VQcm92aWRlcnMuZXhzZCIvPgotCi08L3BsdWdpbj4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy9zY2hlbWEvc2VydmljZVByb3ZpZGVycy5leHNkIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzL3NjaGVtYS9zZXJ2aWNlUHJvdmlkZXJzLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyOGI2OTguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzL3NjaGVtYS9zZXJ2aWNlUHJvdmlkZXJzLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxODYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzIj4KLTxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS5lcGYuc2VydmljZXMiIGlkPSJzZXJ2aWNlUHJvdmlkZXJzIiBuYW1lPSJFUEYgU2VydmljZSBQcm92aWRlcnMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgRXh0ZW5zaW9uIHBvaW50IGZvciBjb250cmlidXRpbmcgc2VydmljZXMgbGlrZSBhY2Nlc3MgY29udHJvbGxlciwgZmlsZSBtYW5hZ2VyLCBsaWJyYXJ5IHBlcnNpc3Rlci4uLgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJhY2Nlc3NDb250cm9sbGVyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJsaWJyYXJ5UGVyc2lzdGVyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImZpbGVNYW5hZ2VyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJhY2Nlc3NDb250cm9sbGVyIj4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICA8bWV0YS5lbGVtZW50IGxhYmVsQXR0cmlidXRlPSJjbGFzcyIvPgotICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIGtpbmQ9ImphdmEiIGJhc2VkT249Im9yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy5JQWNjZXNzQ29udHJvbGxlciIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InZlcnNpb24iIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImxpYnJhcnlQZXJzaXN0ZXIiPgotICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgIDxtZXRhLmVsZW1lbnQgbGFiZWxBdHRyaWJ1dGU9InR5cGUiLz4KLSAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idHlwZSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIGtpbmQ9ImphdmEiIGJhc2VkT249Im9yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy5JTGlicmFyeVBlcnNpc3RlciIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImRlZmF1bHQiIHR5cGU9ImJvb2xlYW4iIHVzZT0iZGVmYXVsdCIgdmFsdWU9ImZhbHNlIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ2ZXJzaW9uIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJmaWxlTWFuYWdlciI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUga2luZD0iamF2YSIgYmFzZWRPbj0ib3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzLklGaWxlTWFuYWdlciIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InZlcnNpb24iIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIDEuMQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBvcmcuZWNsaXBzZS5lcGYuc2VydmljZXMuSUFjY2Vzc0NvbnRyb2xsZXIKLW9yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy5JRmlsZU1hbmFnZXIKLW9yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy5JTGlicmFyeVBlcnNpc3RlcgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4mbHQ7YnImZ3Q7Ci1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAmbHQ7YSAKLWhyZWY9JnF1b3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmcXVvdDsmZ3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmbHQ7L2EmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VydmljZXMvQWN0aXZhdG9yLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VydmljZXMvc3JjL29yZy9lY2xpcHNlL2VwZi9zZXJ2aWNlcy9BY3RpdmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjAzOTI5Yi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VydmljZXMvc3JjL29yZy9lY2xpcHNlL2VwZi9zZXJ2aWNlcy9BY3RpdmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsdWdpbjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotLyoqCi0gKiBUaGUgYWN0aXZhdG9yIGNsYXNzIGNvbnRyb2xzIHRoZSBwbHVnLWluIGxpZmUgY3ljbGUKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2YXRvciBleHRlbmRzIFBsdWdpbiB7Ci0KLQkvLyBUaGUgcGx1Zy1pbiBJRAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS5lcGYuc2VydmljZXMiOyAvLyROT04tTkxTLTEkCi0KLQkvLyBUaGUgc2hhcmVkIGluc3RhbmNlCi0JcHJpdmF0ZSBzdGF0aWMgQWN0aXZhdG9yIHBsdWdpbjsKLQkKLQkvKioKLQkgKiBUaGUgY29uc3RydWN0b3IKLQkgKi8KLQlwdWJsaWMgQWN0aXZhdG9yKCkgewotCQlwbHVnaW4gPSB0aGlzOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsdWdpbnMjc3RhcnQob3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQpCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RhcnQoY29udGV4dCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2luI3N0b3Aob3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQpCi0JICovCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlwbHVnaW4gPSBudWxsOwotCQlzdXBlci5zdG9wKGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNoYXJlZCBpbnN0YW5jZQotCSAqCi0JICogQHJldHVybiB0aGUgc2hhcmVkIGluc3RhbmNlCi0JICovCi0JcHVibGljIHN0YXRpYyBBY3RpdmF0b3IgZ2V0RGVmYXVsdCgpIHsKLQkJcmV0dXJuIHBsdWdpbjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlcnZpY2VzL0lBY2Nlc3NDb250cm9sbGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VydmljZXMvc3JjL29yZy9lY2xpcHNlL2VwZi9zZXJ2aWNlcy9JQWNjZXNzQ29udHJvbGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMzU1ODE2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlcnZpY2VzL0lBY2Nlc3NDb250cm9sbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuc2VydmljZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLQotLyoqCi0gKiBDb250cm9scyBhY2Nlc3MgdG8gbGlicmFyeSBvYmplY3RzLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZSAtIE9jdCA5LCAyMDA2Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUFjY2Vzc0NvbnRyb2xsZXIgewotCS8qKgotCSAqIENoZWNrcyBpZiB0aGUgY2FsbGVyIGNhbiBtb2RpZnkgdGhlIGdpdmVuIEVPYmplY3RzIGluIHRoZSBzcGVjaWZpZWQKLQkgKiBjb2xsZWN0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBlT2JqZWN0cyBjb2xsZWN0aW9uIG9mIHRoZSBFT2JqZWN0cyB0byBjaGVjawotCSAqIEBwYXJhbSBjb250ZXh0IHRoZSBjb250ZXh0IG9mIHRoZSBjYWxsZXIgCi0JICogQHJldHVybgotCSAqLwotCUlTdGF0dXMgY2hlY2tNb2RpZnkoQ29sbGVjdGlvbjxFT2JqZWN0PiBlT2JqZWN0cywgT2JqZWN0IGNvbnRleHQpOwotCQotCUlTdGF0dXMgY2hlY2tNb2RpZnkoUmVzb3VyY2VbXSByZXNvdXJjZXMsIE9iamVjdCBjb250ZXh0KTsKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlcnZpY2VzL0lGaWxlQmFzZWRMaWJyYXJ5UGVyc2lzdGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VydmljZXMvc3JjL29yZy9lY2xpcHNlL2VwZi9zZXJ2aWNlcy9JRmlsZUJhc2VkTGlicmFyeVBlcnNpc3Rlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MzE3NzNlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlcnZpY2VzL0lGaWxlQmFzZWRMaWJyYXJ5UGVyc2lzdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci0KLS8qKgotICogVGhlIGludGVyZmFjZSBmb3IgYSBmaWxlLWJhc2VkIE1ldGhvZCBMaWJyYXJ5IFBlcnNpc3Rlci4KLSAqIDxwPgotICogQSBNZXRob2QgTGlicmFyeSBQZXJzaXN0ZXIgaXMgcmVzcG9uc2libGUgZm9yIHBlcnNpc3RpbmcgdGhlIG1ldGhvZCBsaWJyYXJ5Ci0gKiBjb250ZW50LgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElGaWxlQmFzZWRMaWJyYXJ5UGVyc2lzdGVyIGV4dGVuZHMgSUxpYnJhcnlQZXJzaXN0ZXIgewotCi0JLyoqCi0JICogR2V0cyB0aGUgcGF0aCBvZiBhIG1ldGhvZCBlbGVtZW50J3MgZm9sZGVyIHJlbGF0aXZlIHRvIGl0cyBwbHVnLWluIG9yCi0JICogbGlicmFyeSBmb2xkZXIuCi0JICogCi0JICogQHBhcmFtIGUKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGVsZW1lbnQKLQkgKiBAcmV0dXJuIGEgcmVsYXRpdmUgcGF0aCBuYW1lCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRGb2xkZXJSZWxhdGl2ZVBhdGgoTWV0aG9kRWxlbWVudCBlKTsKLQotCS8qKgotCSAqIEdldHMgdGhlIGFic29sdXRlIHBhdGggb2YgYSBtZXRob2QgZWxlbWVudCdzIGZvbGRlci4KLQkgKiAKLQkgKiBAcGFyYW0gZSBhIG1ldGhvZCBlbGVtZW50Ci0JICogQHJldHVybiB0aGUgYWJzb2x1dGUgcGF0aAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Rm9sZGVyQWJzb2x1dGVQYXRoKE1ldGhvZEVsZW1lbnQgZSk7Ci0JCi0JLyoqCi0JICogR2V0cyB0aGUgZmlsZSBleHRlbnNpb24gb2YgYSBtZXRob2QgZWxlbWVudCdzIHJlc291cmNlIGZpbGUuCi0JICogCi0JICogQHBhcmFtIGUKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGVsZW1lbnQKLQkgKiBAcmV0dXJuIGEgZmlsZSBleHRlbnNpb24gbmFtZQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RmlsZUV4dGVuc2lvbihPYmplY3QgZSk7Ci0KLQkvKioKLQkgKiBDaGVja3Mgd2hldGhlciBhIG1ldGhvZCBlbGVtZW50IHN0b3JlcyBpdHMgY29udGVudCBpbiBhIGZvbGRlciBuYW1lZAotCSAqIGFmdGVyIGl0LgotCSAqIAotCSAqIEBwYXJhbSBlCi0JICogICAgICAgICAgICBhIG1ldGhvZCBlbGVtZW50Ci0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgbWV0aG9kIGVsZW1lbnQgc3RvcmVzIGl0cyBjb250ZW50IGluIGEKLQkgKiAgICAgICAgIGZvbGRlciBuYW1lZCBhZnRlciBpdAotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc093bkZvbGRlcihPYmplY3QgZSk7Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyBmb2xkZXIgZm9yIHRoZSBtZXRob2QgcGx1Z2luIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lIGluIHRoZSBnaXZlbiBtZXRob2QgbGlicmFyeS4KLQkgKiAgCi0JICogQHBhcmFtIHBsdWdpbk5hbWUgdGhlIG5hbWUgb2YgbWV0aG9kIHBsdWdpbgotCSAqIEBwYXJhbSBsaWJyYXJ5IHRoZSBsaWJyYXJ5IHdoZXJlIHRoZSBtZXRob2QgcGx1Z2luIGZvbGRlciB3aWxsIGJlIGNyZWF0ZWQKLQkgKiBAcmV0dXJuIHRoZSBtZXRob2QgcGx1Z2luIGZvbGRlcgotCSAqIEBleGNlcHRpb24gUnVudGltZUV4Y2VwdGlvbiBpZiBmb2xkZXIgY3JlYXRpb24gZmFpbGVkCi0JICovCi0JcHVibGljIEZpbGUgY3JlYXRlTWV0aG9kUGx1Z2luRm9sZGVyKFN0cmluZyBwbHVnaW5OYW1lLCBNZXRob2RMaWJyYXJ5IGxpYnJhcnkpOwotCQotCS8qKgotCSAqIEdldHMgdGhlIGRlZmF1bHQgZm9sZGVyIHRvIHN0b3JlIG1ldGhvZCBjb25maWd1cmF0aW9uIGluIHRoZSBzcGVjaWZpZWQgbWV0aG9kIGxpYnJhcnkuCi0JICogCi0JICogQHBhcmFtIGxpYnJhcnkgdGhlIG1ldGhvZCBsaWJyYXJ5Ci0JICogQHJldHVybiB0aGUgZGVmYXVsdCBmb2xkZXIgdG8gc3RvcmUgbWV0aG9kIGNvbmZpZ3VyYXRpb24gb3IgbnVsbAotCSAqIEBleGNlcHRpb24gUnVudGltZUV4Y2VwdGlvbiBpZiBmYWlsZWQKLQkgKi8KLQlwdWJsaWMgRmlsZSBnZXREZWZhdWx0TWV0aG9kQ29uZmlndXJhdGlvbkZvbGRlcihNZXRob2RMaWJyYXJ5IGxpYnJhcnkpOwotCQotCXB1YmxpYyBGaWxlIGdldERlZmF1bHRNZXRob2RDb25maWd1cmF0aW9uRm9sZGVyKE1ldGhvZExpYnJhcnkgbGlicmFyeSwgYm9vbGVhbiBjcmVhdGUpOwotCQotCS8qKgotCSAqIFNldHMgdGhlIGRlZmF1bHQgZm9sZGVyIHRvIHN0b3JlIG1ldGhvZCBjb25maWd1cmF0aW9uIGluIHRoZSBzcGVjaWZpZWQgbWV0aG9kIGxpYnJhcnkuCi0JICogCi0JICogQHBhcmFtIGxpYnJhcnkgdGhlIG1ldGhvZCBsaWJyYXJ5Ci0JICogQHBhcmFtIGZpbGUgdGhlIGRlZmF1bHQgZm9sZGVyIHRvIHN0b3JlIG1ldGhvZCBjb25maWd1cmF0aW9uCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGVmYXVsdE1ldGhvZENvbmZpZ3VyYXRpb25Gb2xkZXIoTWV0aG9kTGlicmFyeSBsaWJyYXJ5LCBGaWxlIGZpbGUpOwotCQotCS8qKgotCSAqIEdldHMgdGhlIGFic29sdXRlIHBhdGggb2YgdGhlIHJlc291cmNlIGZvbGRlciBvZiB0aGUgZWxlbWVudCBpbiB0aGUgbGlicmFyeS4KLQkgKiAKLQkgKiBAcGFyYW0gZQotCSAqIEByZXR1cm4gYWJzb2x1dGUgcGF0aCBvZiB0aGUgZWxlbWVudCdzIHJlc291cmNlIGZvbGRlcgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UmVzb3VyY2VGb2xkZXJQYXRoKE1ldGhvZEVsZW1lbnQgZSk7Ci0JCi0JLyoqCi0JICogR2V0cyBmaWxlIGluIGxvY2FsIGZpbGUgc3lzdGVtIG9mIHRoZSBzcGVjaWZpZWQgcmVzb3VyY2UKLQkgKiAgCi0JICogQHBhcmFtIHJlc291cmNlCi0JICogQHJldHVybiB0aGUgZmlsZSBpbiBsb2NhbCBmaWxlIHN5c3RlbQotCSAqLwotCXB1YmxpYyBGaWxlIGdldEZpbGUoUmVzb3VyY2UgcmVzb3VyY2UpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlcnZpY2VzL0lGaWxlTWFuYWdlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VydmljZXMvSUZpbGVNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzMjU3M2MuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VydmljZXMvSUZpbGVNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuc2VydmljZXM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLQotLyoqCi0gKiBUaGUgaW50ZXJmYWNlIGZvciBhIEZpbGUgTWFuYWdlci4KLSAqIDxwPgotICogQSBGaWxlIE1hbmFnZXIgaXMgcmVzcG9uc2libGUgZm9yIG1hbmFnaW5nIHRoZSBYTUkgZmlsZXMgYXNzb2NpYXRlZCB3aXRoIHRoZQotICogbWV0aG9kIGVsZW1lbnRzLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElGaWxlTWFuYWdlciB7Ci0KLQkvKioKLQkgKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gbWV0aG9kIGVsZW1lbnQgcGF0aCBjYW4gYmUgbW9kaWZpZWQuCi0JICogCi0JICogQHBhcmFtIHBhdGgKLQkgKiAgICAgICAgICAgIGFuIGFic29sdXRlIHBhdGggdG8gYSBtZXRob2QgZWxlbWVudAotCSAqIEBwYXJhbSBjb250ZXh0Ci0JICogICAgICAgICAgICB0aGUgPGNvZGU+b3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw8L2NvZGU+IHRoYXQgaXMgdG8gYmUKLQkgKiAgICAgICAgICAgIHVzZWQgdG8gcGFyZW50IGFueSBkaWFsb2dzIHdpdGggdGhlIHVzZXIsIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICogICAgICAgICAgICBpZiB0aGVyZSBpcyBubyBVSSBjb250ZXh0IChkZWNsYXJlZCBhcyBhbiA8Y29kZT5PYmplY3Q8L2NvZGU+Ci0JICogICAgICAgICAgICB0byBhdm9pZCBhbnkgZGlyZWN0IHJlZmVyZW5jZXMgb24gdGhlIFNXVCBjb21wb25lbnQpCi0JICogQHJldHVybiBhIHN0YXR1cyBvYmplY3QKLQkgKi8KLQlwdWJsaWMgSVN0YXR1cyBjaGVja01vZGlmeShTdHJpbmcgcGF0aCwgT2JqZWN0IGNvbnRleHQpOwotCi0JLyoqCi0JICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIG1ldGhvZCBlbGVtZW50IHBhdGggY2FuIGJlIG1vZGlmaWVkLgotCSAqIAotCSAqIEBwYXJhbSBwYXRocwotCSAqICAgICAgICAgICAgYW4gYXJyYXkgb2YgcGF0aCBmcmFnbWVudHMgdGhhdCBwb2ludCB0byBhIG1ldGhvZCBlbGVtZW50Ci0JICogQHBhcmFtIGNvbnRleHQKLQkgKiAgICAgICAgICAgIHRoZSA8Y29kZT5vcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDwvY29kZT4gdGhhdCBpcyB0byBiZQotCSAqICAgICAgICAgICAgdXNlZCB0byBwYXJlbnQgYW55IGRpYWxvZ3Mgd2l0aCB0aGUgdXNlciwgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKiAgICAgICAgICAgIGlmIHRoZXJlIGlzIG5vIFVJIGNvbnRleHQgKGRlY2xhcmVkIGFzIGFuIDxjb2RlPk9iamVjdDwvY29kZT4KLQkgKiAgICAgICAgICAgIHRvIGF2b2lkIGFueSBkaXJlY3QgcmVmZXJlbmNlcyBvbiB0aGUgU1dUIGNvbXBvbmVudCkKLQkgKiBAcmV0dXJuIGEgc3RhdHVzIG9iamVjdAotCSAqLwotCXB1YmxpYyBJU3RhdHVzIGNoZWNrTW9kaWZ5KFN0cmluZ1tdIHBhdGhzLCBPYmplY3QgY29udGV4dCk7Ci0KLQkvKioKLQkgKiBEZWxldGVzIHRoZSBnaXZlbiBtZXRob2QgZWxlbWVudCBwYXRoLgotCSAqIAotCSAqIEBwYXJhbSBwYXRoCi0JICogICAgICAgICAgICBhbiBhYnNvbHV0ZSBwYXRoIHRvIGEgbWV0aG9kIGVsZW1lbnQKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBkZWxldGlvbiBpcyBzdWNjZXNzZnVsCi0JICovCi0JcHVibGljIGJvb2xlYW4gZGVsZXRlKFN0cmluZyBwYXRoKTsKLQotCS8qKgotCSAqIFJlbmFtZXMgdGhlIHBhdGggb2YgYSBtZXRob2QgZWxlbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gb2xkRmlsZQotCSAqICAgICAgICAgICAgYSA8Y29kZT5GaWxlPC9jb2RlPiBvYmplY3QgdGhhdCBjb250YWlucyBhIG1ldGhvZCBlbGVtZW50J3MKLQkgKiAgICAgICAgICAgIG9sZCBwYXRoCi0JICogQHBhcmFtIG5ld0ZpbGUKLQkgKiAgICAgICAgICAgIGEgPGNvZGU+RmlsZTwvY29kZT4gb2JqZWN0IHRoYXQgY29udGFpbnMgYSBtZXRob2QgZWxlbWVudCdzCi0JICogICAgICAgICAgICBuZXcgcGF0aAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHJlbmFtaW5nIGlzIHN1Y2Nlc3NmdWwKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiByZW5hbWUoRmlsZSBvbGRGaWxlLCBGaWxlIG5ld0ZpbGUpOwotCi0JLyoqCi0JICogTW92ZXMgYSBtZXRob2QgZWxlbWVudCB0byBhIG5ldyBsb2NhdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gb2xkUGF0aAotCSAqICAgICAgICAgICAgYSBtZXRob2QgZWxlbWVudCdzIG9sZCBwYXRoCi0JICogQHBhcmFtIG5ld05hbWUKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGVsZW1lbnQncyBuZXcgcGF0aAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIG1vdmUgaXMgc3VjY2Vzc2Z1bAotCSAqLwotCXB1YmxpYyBib29sZWFuIG1vdmUoU3RyaW5nIG9sZFBhdGgsIFN0cmluZyBuZXdQYXRoKTsKLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlcnZpY2VzL0lMaWJyYXJ5UGVyc2lzdGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VydmljZXMvc3JjL29yZy9lY2xpcHNlL2VwZi9zZXJ2aWNlcy9JTGlicmFyeVBlcnNpc3Rlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZmYyZTNhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlcnZpY2VzL0lMaWJyYXJ5UGVyc2lzdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci0KLS8qKgotICogVGhlIGludGVyZmFjZSBmb3IgYSBNZXRob2QgTGlicmFyeSBQZXJzaXN0ZXIuCi0gKiA8cD4KLSAqIEEgTWV0aG9kIExpYnJhcnkgUGVyc2lzdGVyIGlzIHJlc3BvbnNpYmxlIGZvciBwZXJzaXN0aW5nIHRoZSBtZXRob2QgbGlicmFyeQotICogY29udGVudC4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUgLSBPY3QgOSwgMjAwNgotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElMaWJyYXJ5UGVyc2lzdGVyIHsKLQkvKioKLQkgKiBTYXZlcyBhbiBleGlzdGluZyByZXNvdXJjZS4KLQkgKiAKLQkgKiBAcGFyYW0gcmVzb3VyY2UKLQkgKiAgICAgICAgICAgIGEgcmVzb3VyY2UKLQkgKi8KLQlwdWJsaWMgdm9pZCBzYXZlKFJlc291cmNlIHJlc291cmNlKSB0aHJvd3MgRXhjZXB0aW9uOwotCQotCS8qKgotCSAqIFNhdmVzIHRoZSBnaXZlbiBNZXRob2RFbGVtZW50IGluIGl0cyBvd24gcmVzb3VyY2UuIFRoZSBzcGVjaWZpZWQgTWV0aG9kRWxlbWVudCBtdXN0IGJlIHBhcnQgb2YgYSBsaWJyYXJ5Ci0JICogYW5kIGl0IGlzIGFsbG93ZWQgdG8gaGF2ZSBpdHMgb3duIHJlc291cmNlLCB0byB3aGljaCBubyBvdGhlciByZXNvdXJjZSByZWZlcnMuIEluIG90aGVyIHdvcmRzLCBjYWxsaW5nIAotCSAqIHtAbGluayAjaGFzT3duUmVzb3VyY2VXaXRob3V0UmVmZXJyZXIoT2JqZWN0KX0gb24gdGhlIGdpdmVuIE1ldGhvZEVsZW1lbnQgbXVzdCByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4uCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiBAdGhyb3dzIEV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHNhdmUoTWV0aG9kRWxlbWVudCBlbGVtZW50KSB0aHJvd3MgRXhjZXB0aW9uOwotCi0JLyoqCi0JICogRGVsZXRlcyB0aGUgcmVzb3VyY2VzIGFzc29jaWF0ZWQgd2l0aCBhIG1ldGhvZCBlbGVtZW50LgotCSAqIAotCSAqIEBwYXJhbSBlCi0JICogICAgICAgICAgICBhIG1ldGhvZCBlbGVtZW50Ci0JICovCi0JcHVibGljIHZvaWQgZGVsZXRlKE1ldGhvZEVsZW1lbnQgZSk7Ci0JCi0JLyoqCi0JICogRGVsZXRlcyB0aGUgcmVzb3VyY2VzIGFzc29jaWF0ZWQgd2l0aCBhIG1ldGhvZCBlbGVtZW50LgotCSAqIAotCSAqIEBwYXJhbSBlCi0JICogICAgICAgICAgICBhIG1ldGhvZCBlbGVtZW50Ci0JICovCi0JcHVibGljIHZvaWQgZGVsZXRlKENvbGxlY3Rpb248TWV0aG9kRWxlbWVudD4gZWxlbXMpOwotCi0JLyoqCi0JICogQWRqdXN0cyB0aGUgbG9jYXRpb24gb2YgYSByZXNvdXJjZSBhbmQgc2F2ZXMgYWxsIHRoZSByZXNvdXJjZXMgdGhhdCBoYXZlCi0JICogYmVlbiBjaGFuZ2VkIGFzIHRoZSByZXN1bHQgb2YgdGhpcyBhZGp1c3RtZW50LgotCSAqIAotCSAqIEBwYXJhbSByZXNvdXJjZQotCSAqICAgICAgICAgICAgYSByZXNvdXJjZQotCSAqLwotCXB1YmxpYyB2b2lkIGFkanVzdExvY2F0aW9uKFJlc291cmNlIHJlc291cmNlKTsKLQotCS8qKgotCSAqIEdldHMgYSBsaXN0IG9mIHdhcm5pbmdzIGFzc29jaWF0ZWQgd2l0aCBhIHJlc291cmNlLgotCSAqIAotCSAqIEByZXR1cm4gYSBsaXN0IG9mIDxjb2RlPkV4Y2VwdGlvbjwvY29kZT4gb2JqZWN0cwotCSAqLwotCXB1YmxpYyBMaXN0IGdldFdhcm5pbmdzKCk7Ci0KLQkvKioKLQkgKiBDaGVja3Mgd2hldGhlciBhIG1ldGhvZCBlbGVtZW50IGNhbiBoYXZlIGl0cyBvd24gcmVzb3VyY2UuCi0JICogCi0JICogQHBhcmFtIGUKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGVsZW1lbnQKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBtZXRob2QgZWxlbWVudCBpcyBvd25lZCBieSBhIHJlc291cmNlCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzT3duUmVzb3VyY2UoT2JqZWN0IGUpOwotCi0JLyoqCi0JICogQ2hlY2tzIHdoZXRoZXIgYSBtZXRob2QgZWxlbWVudCBjYW4gaGF2ZSBpdHMgb3duIHJlc291cmNlLCB3aGljaCBubyBvdGhlciByZXNvdXJjZSByZWZlcnMgdG8uCi0JICogCi0JICogQHBhcmFtIGUKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzT3duUmVzb3VyY2VXaXRob3V0UmVmZXJyZXIoT2JqZWN0IGUpOwotCQotCS8qKgotCSAqIENoZWNrcyBpZiA8Y29kZT5jb250YWluZXJSZXNvdXJjZTwvY29kZT4gY29udGFpbnMgPGNvZGU+cmVzb3VyY2U8L2NvZGU+LgotCSAqIAotCSAqIEBwYXJhbSByZXNvdXJjZQotCSAqIEBwYXJhbSBjb250YWluZXJSZXNvdXJjZQotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHNwZWNpZmllZCByZXNvdXJjZSBpcyBjb250YWluZWQgYnkgPGNvZGU+Y29udGFpbmVyUmVzb3VyY2U8L2NvZGU+Ci0JICovCi0JcHVibGljIGJvb2xlYW4gaXNDb250YWluZWRCeShSZXNvdXJjZSByZXNvdXJjZSwgUmVzb3VyY2UgY29udGFpbmVyUmVzb3VyY2UpOwotCi0JLyoqCi0JICogR2V0cyB0aGUgZmFpbCBzYWZlIG1ldGhvZCBsaWJyYXJ5IHBlcnNpc3RlciBhc3NvY2lhdGVkIHdpdGggdGhpcyBsaWJyYXJ5Ci0JICogcGVyc2lzdGVyLgotCSAqIAotCSAqIEByZXR1cm4gYSBmYWlsIHNhZmUgbWV0aG9kIGxpYnJhcnkgcGVyc2lzdGVyCi0JICovCi0JcHVibGljIEZhaWxTYWZlTWV0aG9kTGlicmFyeVBlcnNpc3RlciBnZXRGYWlsU2FmZVBlcnNpc3RlcigpOwotCi0JcHVibGljIHN0YXRpYyBpbnRlcmZhY2UgRmFpbFNhZmVNZXRob2RMaWJyYXJ5UGVyc2lzdGVyIGV4dGVuZHMKLQkJCUlMaWJyYXJ5UGVyc2lzdGVyIHsKLQkJLyoqCi0JCSAqIERpcmVjdCBwZXJzaXN0ZXIgdG8gb3ZlcndyaXRlIGR1cmluZyBzYXZlIHdpdGhvdXQgY2hlY2tpbmcgb24gY2hhbmdlIGNvbmZsaWN0cy4KLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9QVElPTlNfT1ZFUldSSVRBQkxFX1JFU09VUkNFUyA9ICJPVkVSV1JJVEFCTEVfUkVTT1VSQ0VTIjsgLy8kTk9OLU5MUy0xJAotCi0JCS8qKgotCQkgKiBHZXRzIHRoZSBjdXJyZW50IHRyYW5zYWN0aW9uIElELgotCQkgKiAKLQkJICogQHJldHVybiB0aGUgY3VycmVudCB0cmFuc2FjdGlvbiBJRAotCQkgKi8KLQkJU3RyaW5nIGdldEN1cnJlbnRUeElEKCk7Ci0KLQkJLyoqCi0JCSAqIEFkanVzdHMgdGhlIGxvY2F0aW9uIG9mIHRoZSBnaXZlbiByZXNvdXJjZSBhbmQgc2F2ZSBhbGwgdGhlIHJlc291cmNlcwotCQkgKiB0aGF0IGhhdmUgYmVlbiBjaGFuZ2VkIGFzIHRoZSByZXN1bHQgb2YgdGhpcyBhZGp1c3RtZW50LiBUaGlzIGNhbGwKLQkJICogbmVlZHMgYSBuZXcgdHJhbnNhY3Rpb24gYW5kIHRoZSB0cmFuc2FjdGlvbiB3aWxsIGJlIGNvbW1pdHRlZCBpbiB0aGlzCi0JCSAqIG1ldGhvZC4KLQkJICogCi0JCSAqIEBwYXJhbSByZXNvdXJjZXMKLQkJICogICAgICAgICAgICB0aGUgcmVzb3VyY2VzIHdob3NlIGxvY2F0aW9ucyBuZWVkIHRvIGJlIGFkanVzdGVkCi0JCSAqLwotCQl2b2lkIGFkanVzdExvY2F0aW9uKENvbGxlY3Rpb24gcmVzb3VyY2VzKTsKLQotCQkvKioKLQkJICogQ29tbWl0cyB0aGUgdHJhbnNhY3Rpb24uCi0JCSAqLwotCQl2b2lkIGNvbW1pdCgpOwotCi0JCS8qKgotCQkgKiBSb2xsIGJhY2tzIHRoZSB0cmFuc2FjdGlvbi4KLQkJICovCi0JCXZvaWQgcm9sbGJhY2soKTsKLQkJCi0JCS8qKgotCQkgKiBHZXRzIHNhdmUgb3B0aW9ucy4KLQkJICogCi0JCSAqIEByZXR1cm4KLQkJICovCi0JCU1hcCBnZXRTYXZlT3B0aW9ucygpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VydmljZXMvU2VydmljZXMuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlcnZpY2VzL1NlcnZpY2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2ODQ0M2IuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VydmljZXMvU2VydmljZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxMCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuc2VydmljZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25SZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5Db21tb25QbHVnaW47Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLQotLyoqCi0gKiBIZWxwZXIgY2xhc3MgdG8gYWNjZXNzIHRoZSBleHRlbnNpb25zIGNvbnRyaWJ1dGVkIHRvIGV4dGVuc3Rpb24gcG9pbnQKLSAqICJvcmcuZWNsaXBzZS5lcGYudW1hLnNlcnZpY2VzIi4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFNlcnZpY2VzIHsKLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBQZXJzaXN0ZXJEZXNjcmlwdG9yIHsKLQkJU3RyaW5nIHBsdWdpbklkOwotCQlTdHJpbmcgdHlwZTsKLQkJU3RyaW5nIGNsYXNzTmFtZTsKLQkJYm9vbGVhbiBpc0RlZmF1bHQ7Ci0JCWludCB2ZXJzaW9uOwotCQlJTGlicmFyeVBlcnNpc3RlciBwZXJzaXN0ZXI7Ci0JfQotCQotCS8qKgotCSAqIFBlcnNpc3RlbmNlIHR5cGUgZm9yIFhNSS1maWxlLWJhc2VkIGxpYnJhcnkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYTUlfUEVSU0lTVEVOQ0VfVFlQRSA9ICJ4bWkiOyAvLyROT04tTkxTLTEkCi0JCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBuYW1lc3BhY2UgPSBBY3RpdmF0b3IuUExVR0lOX0lEOyAKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgZXh0ZW5zaW9uUG9pbnROYW1lID0gInNlcnZpY2VQcm92aWRlcnMiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBJQWNjZXNzQ29udHJvbGxlciBhY2Nlc3NDb250cm9sbGVyOwotCXByaXZhdGUgc3RhdGljIElGaWxlTWFuYWdlciBmaWxlTWFuYWdlcjsKLQlwcml2YXRlIHN0YXRpYyBMaXN0PFBlcnNpc3RlckRlc2NyaXB0b3I+IHBlcnNpc3RlckRlc2NyaXB0b3JzID0gbmV3IEFycmF5TGlzdDxQZXJzaXN0ZXJEZXNjcmlwdG9yPigpOwkKLQlwcml2YXRlIHN0YXRpYyBNYXA8U3RyaW5nLCBQZXJzaXN0ZXJEZXNjcmlwdG9yPiB0eXBlVG9MaWJyYXJ5UGVyc2lzdGVyRGVzY3JpcHRvck1hcDsKLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBkZWZhdWx0UGVyc2lzdGVuY2VUeXBlOwotCi0JcHJpdmF0ZSBzdGF0aWMgT2JqZWN0IGdldFNlcnZpY2UoU3RyaW5nIHNlcnZpY2VOYW1lKSB7Ci0JCUlFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCk7Ci0JCUlFeHRlbnNpb25Qb2ludCBleHRlbnNpb25Qb2ludCA9IGV4dGVuc2lvblJlZ2lzdHJ5LmdldEV4dGVuc2lvblBvaW50KG5hbWVzcGFjZSwgZXh0ZW5zaW9uUG9pbnROYW1lKTsKLQkJaWYgKGV4dGVuc2lvblBvaW50ICE9IG51bGwpIHsKLQkJCUlFeHRlbnNpb25bXSBleHRlbnNpb25zID0gZXh0ZW5zaW9uUG9pbnQuZ2V0RXh0ZW5zaW9ucygpOwotCQkJQnVuZGxlIGJ1bmRsZSA9IG51bGw7Ci0JCQlTdHJpbmcgY2xhc3NOYW1lID0gbnVsbDsKLQkJCWludCB2ZXJzaW9uID0gLTE7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGV4dGVuc2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCQlJRXh0ZW5zaW9uIGV4dGVuc2lvbiA9IGV4dGVuc2lvbnNbaV07Ci0JCQkJU3RyaW5nIHBsdWdpbklkID0gZXh0ZW5zaW9uLmdldE5hbWVzcGFjZUlkZW50aWZpZXIoKTsKLQkJCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjb25maWdFbGVtZW50cyA9IGV4dGVuc2lvbgotCQkJCQkJLmdldENvbmZpZ3VyYXRpb25FbGVtZW50cygpOwotCQkJCWZvciAoaW50IGogPSAwOyBqIDwgY29uZmlnRWxlbWVudHMubGVuZ3RoOyBqKyspIHsKLQkJCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNvbmZpZ0VsZW1lbnQgPSBjb25maWdFbGVtZW50c1tqXTsKLQkJCQkJaWYoc2VydmljZU5hbWUuZXF1YWxzKGNvbmZpZ0VsZW1lbnQuZ2V0TmFtZSgpKSkgewotCQkJCQkJaW50IG90aGVyVmVyc2lvbiA9IHBhcnNlVmVyc2lvbihjb25maWdFbGVtZW50LmdldEF0dHJpYnV0ZSgidmVyc2lvbiIpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJaWYob3RoZXJWZXJzaW9uID4gdmVyc2lvbikgewotCQkJCQkJCWNsYXNzTmFtZSA9IGNvbmZpZ0VsZW1lbnQuZ2V0QXR0cmlidXRlKCJjbGFzcyIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJYnVuZGxlID0gUGxhdGZvcm0uZ2V0QnVuZGxlKHBsdWdpbklkKTsKLQkJCQkJCQl2ZXJzaW9uID0gb3RoZXJWZXJzaW9uOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJaWYoY2xhc3NOYW1lICE9IG51bGwpIHsKLQkJCQl0cnkgewotCQkJCQlyZXR1cm4gYnVuZGxlLmxvYWRDbGFzcyhjbGFzc05hbWUpLm5ld0luc3RhbmNlKCk7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJQ29tbW9uUGx1Z2luLklOU1RBTkNFLmxvZyhlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgaW50IHBhcnNlVmVyc2lvbihTdHJpbmcgc3RyKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gSW50ZWdlci5wYXJzZUludChzdHIpOwotCQl9Ci0JCWNhdGNoKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gMDsKLQkJfQkJCi0JfQotCQotCXByaXZhdGUgc3RhdGljIE1hcDxTdHJpbmcsIFBlcnNpc3RlckRlc2NyaXB0b3I+IGdldFR5cGVUb0xpYnJhcnlQZXJzaXN0ZXJEZXNjcmlwdG9yTWFwKCkgewotCQlNYXA8U3RyaW5nLCBQZXJzaXN0ZXJEZXNjcmlwdG9yPiB0eXBlVG9QZXJzaXN0ZXJEZXNjcmlwdG9yTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBQZXJzaXN0ZXJEZXNjcmlwdG9yPigpOwotCQlTdHJpbmcgc2VydmljZU5hbWUgPSAibGlicmFyeVBlcnNpc3RlciI7IC8vJE5PTi1OTFMtMSQKLQkJSUV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5ID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKTsKLQkJSUV4dGVuc2lvblBvaW50IGV4dGVuc2lvblBvaW50ID0gZXh0ZW5zaW9uUmVnaXN0cnkuZ2V0RXh0ZW5zaW9uUG9pbnQobmFtZXNwYWNlLCBleHRlbnNpb25Qb2ludE5hbWUpOwotCQlpZiAoZXh0ZW5zaW9uUG9pbnQgIT0gbnVsbCkgewotCQkJSUV4dGVuc2lvbltdIGV4dGVuc2lvbnMgPSBleHRlbnNpb25Qb2ludC5nZXRFeHRlbnNpb25zKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGV4dGVuc2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCQlJRXh0ZW5zaW9uIGV4dGVuc2lvbiA9IGV4dGVuc2lvbnNbaV07Ci0JCQkJU3RyaW5nIHBsdWdpbklkID0gZXh0ZW5zaW9uLmdldE5hbWVzcGFjZUlkZW50aWZpZXIoKTsKLQkJCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjb25maWdFbGVtZW50cyA9IGV4dGVuc2lvbgotCQkJCQkJLmdldENvbmZpZ3VyYXRpb25FbGVtZW50cygpOwotCQkJCWZvciAoaW50IGogPSAwOyBqIDwgY29uZmlnRWxlbWVudHMubGVuZ3RoOyBqKyspIHsKLQkJCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNvbmZpZ0VsZW1lbnQgPSBjb25maWdFbGVtZW50c1tqXTsKLQkJCQkJaWYoc2VydmljZU5hbWUuZXF1YWxzKGNvbmZpZ0VsZW1lbnQuZ2V0TmFtZSgpKSkgewotCQkJCQkJdHJ5IHsKLQkJCQkJCQlQZXJzaXN0ZXJEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBuZXcgUGVyc2lzdGVyRGVzY3JpcHRvcigpOwotCQkJCQkJCWRlc2NyaXB0b3IucGx1Z2luSWQgPSBwbHVnaW5JZDsKLQkJCQkJCQlkZXNjcmlwdG9yLnR5cGUgPSBjb25maWdFbGVtZW50LmdldEF0dHJpYnV0ZSgidHlwZSIpOyAvLyROT04tTkxTLTEkCQkJCQkJCQotCQkJCQkJCWRlc2NyaXB0b3IuY2xhc3NOYW1lID0gY29uZmlnRWxlbWVudC5nZXRBdHRyaWJ1dGUoImNsYXNzIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQlkZXNjcmlwdG9yLmlzRGVmYXVsdCA9IEJvb2xlYW4ucGFyc2VCb29sZWFuKGNvbmZpZ0VsZW1lbnQuZ2V0QXR0cmlidXRlKCJkZWZhdWx0IikpOyAvLyROT04tTkxTLTEkCQkJCQkJCQotCQkJCQkJCWRlc2NyaXB0b3IudmVyc2lvbiA9IHBhcnNlVmVyc2lvbihjb25maWdFbGVtZW50LmdldEF0dHJpYnV0ZSgidmVyc2lvbiIpKTsgLy8kTk9OLU5MUy0xJAkJCQkJCQkKLQkJCQkJCQlwZXJzaXN0ZXJEZXNjcmlwdG9ycy5hZGQoZGVzY3JpcHRvcik7Ci0JCQkJCQkJaWYoZGVzY3JpcHRvci50eXBlICE9IG51bGwpIHsKLQkJCQkJCQkJUGVyc2lzdGVyRGVzY3JpcHRvciBkZXNjID0gdHlwZVRvUGVyc2lzdGVyRGVzY3JpcHRvck1hcC5nZXQoZGVzY3JpcHRvci50eXBlKTsKLQkJCQkJCQkJaWYoZGVzYyAhPSBudWxsKSB7Ci0JCQkJCQkJCQlpZihkZXNjLnZlcnNpb24gPCBkZXNjcmlwdG9yLnZlcnNpb24pIHsKLQkJCQkJCQkJCQl0eXBlVG9QZXJzaXN0ZXJEZXNjcmlwdG9yTWFwLnB1dChkZXNjcmlwdG9yLnR5cGUsIGRlc2NyaXB0b3IpOwotCQkJCQkJCQkJCWlmKGRlc2NyaXB0b3IuaXNEZWZhdWx0KSB7Ci0JCQkJCQkJCQkJCWRlZmF1bHRQZXJzaXN0ZW5jZVR5cGUgPSBkZXNjcmlwdG9yLnR5cGU7Ci0JCQkJCQkJCQkJfQotCQkJCQkJCQkJCWVsc2UgaWYoZGVzYy5pc0RlZmF1bHQpIHsKLQkJCQkJCQkJCQkJZGVmYXVsdFBlcnNpc3RlbmNlVHlwZSA9IG51bGw7Ci0JCQkJCQkJCQkJfQotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJCWVsc2UgewotCQkJCQkJCQkJdHlwZVRvUGVyc2lzdGVyRGVzY3JpcHRvck1hcC5wdXQoZGVzY3JpcHRvci50eXBlLCBkZXNjcmlwdG9yKTsKLQkJCQkJCQkJCWlmKGRlc2NyaXB0b3IuaXNEZWZhdWx0KSB7Ci0JCQkJCQkJCQkJZGVmYXVsdFBlcnNpc3RlbmNlVHlwZSA9IGRlc2NyaXB0b3IudHlwZTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJQ29tbW9uUGx1Z2luLklOU1RBTkNFLmxvZyhlKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gdHlwZVRvUGVyc2lzdGVyRGVzY3JpcHRvck1hcDsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJQWNjZXNzQ29udHJvbGxlciBnZXRBY2Nlc3NDb250cm9sbGVyKCkgewotCQlpZihhY2Nlc3NDb250cm9sbGVyID09IG51bGwpIHsKLQkJCWFjY2Vzc0NvbnRyb2xsZXIgPSAoSUFjY2Vzc0NvbnRyb2xsZXIpIGdldFNlcnZpY2UoImFjY2Vzc0NvbnRyb2xsZXIiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBhY2Nlc3NDb250cm9sbGVyOwotCX0KLQkKLQkvKioKLQkgKiBHZXRzIHRoZSBsaWJyYXJ5IHBlcnNpc3RlciBvZiB0aGUgZ2l2ZW4gdHlwZQotCSAqIAotCSAqIEBwYXJhbSB0eXBlCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSUxpYnJhcnlQZXJzaXN0ZXIgZ2V0TGlicmFyeVBlcnNpc3RlcihTdHJpbmcgdHlwZSkgewotCQlpZih0eXBlVG9MaWJyYXJ5UGVyc2lzdGVyRGVzY3JpcHRvck1hcCA9PSBudWxsKSB7Ci0JCQl0eXBlVG9MaWJyYXJ5UGVyc2lzdGVyRGVzY3JpcHRvck1hcCA9IGdldFR5cGVUb0xpYnJhcnlQZXJzaXN0ZXJEZXNjcmlwdG9yTWFwKCk7Ci0JCX0KLQkJUGVyc2lzdGVyRGVzY3JpcHRvciBkZXNjcmlwdG9yID0gdHlwZVRvTGlicmFyeVBlcnNpc3RlckRlc2NyaXB0b3JNYXAuZ2V0KHR5cGUpOwotCQlpZihkZXNjcmlwdG9yICE9IG51bGwpIHsKLQkJCWlmKGRlc2NyaXB0b3IucGVyc2lzdGVyID09IG51bGwpIHsKLQkJCQlCdW5kbGUgYnVuZGxlID0gUGxhdGZvcm0uZ2V0QnVuZGxlKGRlc2NyaXB0b3IucGx1Z2luSWQpOwotCQkJCXRyeSB7Ci0JCQkJCWRlc2NyaXB0b3IucGVyc2lzdGVyID0gKElMaWJyYXJ5UGVyc2lzdGVyKSBidW5kbGUubG9hZENsYXNzKGRlc2NyaXB0b3IuY2xhc3NOYW1lKS5uZXdJbnN0YW5jZSgpOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCUNvbW1vblBsdWdpbi5JTlNUQU5DRS5sb2coZSk7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIGRlc2NyaXB0b3IucGVyc2lzdGVyOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIElMaWJyYXJ5UGVyc2lzdGVyIGdldERlZmF1bHRMaWJyYXJ5UGVyc2lzdGVyKCkgewotCQlyZXR1cm4gZ2V0TGlicmFyeVBlcnNpc3RlcihnZXREZWZhdWx0TGlicmFyeVBlcnNpc3RlbmNlVHlwZSgpKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgZ2V0RGVmYXVsdExpYnJhcnlQZXJzaXN0ZW5jZVR5cGUoKSB7Ci0JCWlmKGRlZmF1bHRQZXJzaXN0ZW5jZVR5cGUgPT0gbnVsbCkgewotCQkJZ2V0VHlwZVRvTGlicmFyeVBlcnNpc3RlckRlc2NyaXB0b3JNYXAoKTsKLQkJCWlmKGRlZmF1bHRQZXJzaXN0ZW5jZVR5cGUgPT0gbnVsbCAmJiBnZXRMaWJyYXJ5UGVyc2lzdGVyKFhNSV9QRVJTSVNURU5DRV9UWVBFKSAhPSBudWxsKSB7Ci0JCQkJLy8gbm8gcGVyc2lzdGVyIGlzIHNldCBhcyBkZWZhdWx0LCBjaG9vc2UgWE1JIGFzIGRlZmF1bHQgcGVyc2lzdGVuY2UgdHlwZQotCQkJCS8vCi0JCQkJZGVmYXVsdFBlcnNpc3RlbmNlVHlwZSA9IFhNSV9QRVJTSVNURU5DRV9UWVBFOwotCQkJfQotCQl9Ci0JCXJldHVybiBkZWZhdWx0UGVyc2lzdGVuY2VUeXBlOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSUZpbGVNYW5hZ2VyIGdldEZpbGVNYW5hZ2VyKCkgewotCQlpZihmaWxlTWFuYWdlciA9PSBudWxsKSB7Ci0JCQlmaWxlTWFuYWdlciA9IChJRmlsZU1hbmFnZXIpIGdldFNlcnZpY2UoImZpbGVNYW5hZ2VyIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gZmlsZU1hbmFnZXI7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvLy5wcm9qZWN0IGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMTExZTQ1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmVwZi51aS5pbnRybzwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucHJlZnMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vLnNldHRpbmdzL29yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YzY2ODc2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNGcmkgRGVjIDAxIDE2OjAyOjQxIFBTVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuZW5hYmxlLnByb2plY3QucmVmYWN0b3JpbmcuaGlzdG9yeT1mYWxzZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL01FVEEtSU5GL01BTklGRVNULk1GIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZGQzYjhiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5lcGYudWkuaW50cm87IHNpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuMi4wLnF1YWxpZmllcgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLAotIG9yZy5lY2xpcHNlLnVpLAotIG9yZy5lY2xpcHNlLnVpLmludHJvCi1FY2xpcHNlLUxhenlTdGFydDogdHJ1ZQotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41Ci1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9idWlsZC5wcm9wZXJ0aWVzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjZWI4NTQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLWJpbi5pbmNsdWRlcyA9IE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBjc3MvLFwKLSAgICAgICAgICAgICAgIGhlbHAvLFwKLSAgICAgICAgICAgICAgIGljb25zLyxcCi0gICAgICAgICAgICAgICBpbnRyb0NvbnRlbnQueG1sLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgd2VsY29tZS54bWwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvY29uZi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2NvbmYuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNjkyNWNiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvY29uZi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2ZpcnN0c3RlcHMvZmlyc3RzdGVwcy5jc3MgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2ZpcnN0c3RlcHMvZmlyc3RzdGVwcy5jc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhNWI1YjkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9maXJzdHN0ZXBzL2ZpcnN0c3RlcHMuY3NzCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqLwotCi0vKgotICogZmlyc3RzdGVwcy5jc3MgaXMgYSB0ZW1wbGF0ZSBmb3IgdGhlIGdyb3VwIHNwZWNpZmljIGNzcyBzZXR0aW5ncwotICovCi0gCi0vKgotICogYmFja2dyb3VuZCB3YXRlcm1hcmsgLSBncm91cCBzcGVjaWZpYwotICovCi0KLWJvZHkgewotCWJhY2tncm91bmQtaW1hZ2UgOiB1cmwoZ3JhcGhpY3MvY29udGVudHBhZ2UvZmlyc3RlcHNfd3RyLmpwZyk7Ci19Ci0KLS8qCi0gKiBzaG93IHRoZSAic2VsZWN0ZWQiIGltYWdlIGZvciB0aGlzIHBhZ2UgLSBUaGlzIGlzIGdyb3VwIHNwZWNpZmljCi0gKi8KLQotI25hdmlnYXRpb24tbGlua3MgYSNzdGVwcyBpbWcsICNuYXZpZ2F0aW9uLWxpbmtzIGEjc3RlcHM6aG92ZXIgaW1nIHsgYmFja2dyb3VuZC1pbWFnZSA6IHVybCguLi9ncmFwaGljcy9pY29ucy9jdG9vbC9maXJzdGVwczQ4c2VsLmdpZik7IH0KLQotLyogCi0gKiBTZXQgdXAgdGhlIE92ZXJ2aWV3IGxpbmtzIHRvIGJlIGRpc3BsYXllZCBpbiB0d28gY29sdW1ucwotICogdGhhdCBhcmUgY2VudGVyZWQgaW4gdGhlIG1pZGRsZSBvZiB0aGUgcGFnZS4KLSAqLwotCi0jc3RlcHMtbGlua3Mgewl0ZXh0LWFsaWduIDogbGVmdDsJd2lkdGggOiA3NjBweDsJLyogVG8gY2VudGVyIGluIE1veiAoaGF2ZSB0byB1c2UgdGV4dC1hbGlnbiBmb3IgSUUpICovCW1hcmdpbiA6IDBweCBhdXRvO30KLSNzdGVwcy1saW5rcyBhIHsgCXdpZHRoIDogMzcwcHg7CXRleHQtYWxpZ24gOiBsZWZ0OyAJbWFyZ2luLWxlZnQgOiA1cHg7CW1hcmdpbi1yaWdodCA6IDVweDsJbWFyZ2luLXRvcCA6IDVweDsJbWFyZ2luLWJvdHRvbSA6IC0yMHB4Owl2ZXJ0aWNhbC1hbGlnbiA6IHRvcDt9Ci0jc3RlcHMtbGlua3MgPiBhIHsgdmVydGljYWwtYWxpZ24gOiBtaWRkbGU7IH0KLSNzdGVwcy1saW5rcyBhIGltZyB7CWhlaWdodCA6IDU3cHg7CXdpZHRoIDogNTdweDsJdmVydGljYWwtYWxpZ24gOiBtaWRkbGU7fQkKLSNzdGVwcy1saW5rcyBhIC5saW5rLWxhYmVsIHsJZGlzcGxheSA6IGJsb2NrOwl3aWR0aCA6IDMwMHB4Owlwb3NpdGlvbiA6IHJlbGF0aXZlOwl0b3AgOiAtNTBweDsJbGVmdCA6IDYwcHg7fQotI3N0ZXBzLWxpbmtzIGEgcCAudGV4dCB7CWRpc3BsYXkgOiBibG9jazsJd2lkdGggOiAzMDBweDsJcG9zaXRpb24gOiByZWxhdGl2ZTsJdG9wIDogLTQ1cHg7CWxlZnQgOiA1M3B4O30KLQotLyogU3BlY2lhbCBjYXNlIGZvciBNb3ppbGxhLCBiZWNhdXNlIHRoZSBsaW5rcyBhcmUgZGlzcGxheWVkCi0gICBpbiAxIHZlcnRpY2FsIGNvbHVtbiBpbnN0ZWFkIG9mIDIgY2VudGVyZWQgY29sdW1ucyAqLwotI3N0ZXBzLWxpbmtzID4gYSB7IAl3aWR0aCA6IDcwMHB4OyB9Ci0jc3RlcHMtbGlua3MgYSA+IC5saW5rLWxhYmVsIHsgd2lkdGggOiA3MDBweDsgfQotI3N0ZXBzLWxpbmtzIGEgcCA+IC50ZXh0IHsgd2lkdGggOiA3MDBweDsgfQotCi0jc3RlcHMtbGlua3MgYTpob3ZlciB7IGJvcmRlci1yaWdodCA6IDVweDsgfQotCi1hI2Jhc2ljcyBpbWcgeyBiYWNrZ3JvdW5kLWltYWdlIDogdXJsKC4uL2dyYXBoaWNzL2ljb25zL29iajQ4L3diYmFzaWNzX29iai5naWYpOyB9Ci1hI2Jhc2ljczpob3ZlciBpbWcgeyBiYWNrZ3JvdW5kLWltYWdlIDogdXJsKC4uL2dyYXBoaWNzL2ljb25zL29iajQ4L3diYmFzaWNzaG92X29iai5naWYpOyB9Ci0KLWEjdGVhbSBpbWcgeyBiYWNrZ3JvdW5kLWltYWdlIDogdXJsKC4uL2dyYXBoaWNzL2ljb25zL29iajQ4L3RlYW1zdXBfb2JqLmdpZik7IH0KLWEjdGVhbTpob3ZlciBpbWcgeyBiYWNrZ3JvdW5kLWltYWdlIDogdXJsKC4uL2dyYXBoaWNzL2ljb25zL29iajQ4L3RlYW1zdXBob3Zfb2JqLmdpZik7IH0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZmlyc3RzdGVwcy9maXJzdHN0ZXBzLnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2ZpcnN0c3RlcHMvZmlyc3RzdGVwcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOTdmZjMyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZmlyc3RzdGVwcy9maXJzdHN0ZXBzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1zdGVwcy5sYXlvdXQubmNvbHVtbnMgPSAyCi1zdGVwcy5wYWdlLWNvbnRlbnQubGF5b3V0LnZzcGFjaW5nID0gNDAKLQotc3RlcHMucGFnZS1jb250ZW50LnN0ZXBzLWxpbmtzLmxheW91dC5uY29sdW1ucyA9IDIKLXN0ZXBzLnBhZ2UtY29udGVudC5zdGVwcy1saW5rcy5sYXlvdXQudnNwYWNpbmcgPSAzNQotCi1zdGVwcy5zdWJ0aXRsZS1pZCA9IHN0ZXBzL3BhZ2UtY29udGVudC9wYWdlLXRpdGxlCi1zdGVwcy5kZXNjcmlwdGlvbi1pZCA9IHN0ZXBzL3BhZ2UtY29udGVudC9wYWdlLWRlc2NyaXB0aW9uCi0KLXN0ZXBzLnBhZ2UtY29udGVudC5zdGVwcy1saW5rcy5lcGYtc3RlcHMtdHdvLmxpbmstaWNvbiA9IGNzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9wYWdlX2ZpcnN0c3RlcHMuZ2lmCi1zdGVwcy5wYWdlLWNvbnRlbnQuc3RlcHMtbGlua3MuZXBmLXN0ZXBzLWZvdXIubGluay1pY29uID0gY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L3BhZ2VfZmlyc3RzdGVwcy5naWYKLXN0ZXBzLnBhZ2UtY29udGVudC5zdGVwcy1saW5rcy5lcGYtc3RlcHMtb25lLmxpbmstaWNvbiA9IGNzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9wYWdlX2ZpcnN0c3RlcHMuZ2lmCi1zdGVwcy5wYWdlLWNvbnRlbnQuc3RlcHMtbGlua3MuZXBmLXN0ZXBzLXRocmVlLmxpbmstaWNvbiA9IGNzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9wYWdlX2ZpcnN0c3RlcHMuZ2lmCi0jbmV3cy5uZXctYW5kLW5vdGV3b3J0aHkubGluay1pY29uID0gY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L25ld19vYmouZ2lmCi0jbmV3cy5taWdyYXRpb24ubGluay1pY29uID0gY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L21pZ3JhdGVfb2JqLmdpZgotI25ld3MudXBkYXRlcy5saW5rLWljb24gPSBjc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvdXBkYXRlc19vYmouZ2lmCi0jbmV3cy5lY2xpcHNlLmxpbmstaWNvbiA9IGNzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9jb21tdW5pdHlfb2JqLmdpZgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvY29udGVudHBhZ2UvMXgxdHJhbnMuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9jb250ZW50cGFnZS8xeDF0cmFucy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjYWY0MzguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9jb250ZW50cGFnZS8xeDF0cmFucy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2NvbnRlbnRwYWdlL2JhY2tncm91bmQuanBnIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9jb250ZW50cGFnZS9iYWNrZ3JvdW5kLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2UxY2FkYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2NvbnRlbnRwYWdlL2JhY2tncm91bmQuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9jb250ZW50cGFnZS9iYWNrZ3JvdW5kY3VydmUuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9jb250ZW50cGFnZS9iYWNrZ3JvdW5kY3VydmUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNzY1N2Q0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvY29udGVudHBhZ2UvYmFja2dyb3VuZGN1cnZlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvY29udGVudHBhZ2UvYmFja2dyb3VuZGN1cnZlMi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2NvbnRlbnRwYWdlL2JhY2tncm91bmRjdXJ2ZTIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMThiMGNlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvY29udGVudHBhZ2UvYmFja2dyb3VuZGN1cnZlMi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2NvbnRlbnRwYWdlL2JyYW5kbWFyay5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2NvbnRlbnRwYWdlL2JyYW5kbWFyay5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3YmQ5ZDQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9jb250ZW50cGFnZS9icmFuZG1hcmsuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9jb250ZW50cGFnZS9jb250ZW50X2JhY2tncm91bmQuanBnIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9jb250ZW50cGFnZS9jb250ZW50X2JhY2tncm91bmQuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMDNjNmQ0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvY29udGVudHBhZ2UvY29udGVudF9iYWNrZ3JvdW5kLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvY29udGVudHBhZ2UvZmlyc3RlcHNfd3RyLmpwZyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvY29udGVudHBhZ2UvZmlyc3RlcHNfd3RyLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzhkM2QyMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2NvbnRlbnRwYWdlL2ZpcnN0ZXBzX3d0ci5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2NvbnRlbnRwYWdlL2hhbmRsZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2NvbnRlbnRwYWdlL2hhbmRsZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2YTg4OTMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9jb250ZW50cGFnZS9oYW5kbGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9jb250ZW50cGFnZS9uZXdfYmFja2dyb3VuZGN1cnZlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvY29udGVudHBhZ2UvbmV3X2JhY2tncm91bmRjdXJ2ZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3NDQwYWYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9jb250ZW50cGFnZS9uZXdfYmFja2dyb3VuZGN1cnZlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvY29udGVudHBhZ2UvbmV3X2NvbnRlbnRfYmFja2dyb3VuZC5qcGcgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2NvbnRlbnRwYWdlL25ld19jb250ZW50X2JhY2tncm91bmQuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MTNlNTcxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvY29udGVudHBhZ2UvbmV3X2NvbnRlbnRfYmFja2dyb3VuZC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2NvbnRlbnRwYWdlL292ZXJ2aWV3X3d0ci5qcGcgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2NvbnRlbnRwYWdlL292ZXJ2aWV3X3d0ci5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczM2U0OGMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9jb250ZW50cGFnZS9vdmVydmlld193dHIuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9jb250ZW50cGFnZS9wYWdlX3dvcmRtYXJrLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvY29udGVudHBhZ2UvcGFnZV93b3JkbWFyay5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2OGU1NDcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9jb250ZW50cGFnZS9wYWdlX3dvcmRtYXJrLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvY29udGVudHBhZ2UvcmF0aW9uYWxhZHZhbnRhZ2UuanBnIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9jb250ZW50cGFnZS9yYXRpb25hbGFkdmFudGFnZS5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwMzI1ZGEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9jb250ZW50cGFnZS9yYXRpb25hbGFkdmFudGFnZS5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2NvbnRlbnRwYWdlL3JldHVzZXJfd3RyLmpwZyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvY29udGVudHBhZ2UvcmV0dXNlcl93dHIuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMmE0MmRhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvY29udGVudHBhZ2UvcmV0dXNlcl93dHIuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9jb250ZW50cGFnZS9zYW1wbGVzX3d0ci5qcGcgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2NvbnRlbnRwYWdlL3NhbXBsZXNfd3RyLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzhlNzAzYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2NvbnRlbnRwYWdlL3NhbXBsZXNfd3RyLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvY29udGVudHBhZ2Uvc2VjdGlvbjEuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9jb250ZW50cGFnZS9zZWN0aW9uMS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxNDc1MTMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9jb250ZW50cGFnZS9zZWN0aW9uMS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2NvbnRlbnRwYWdlL3NlY3Rpb24yLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvY29udGVudHBhZ2Uvc2VjdGlvbjIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZWUxNDhiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvY29udGVudHBhZ2Uvc2VjdGlvbjIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9jb250ZW50cGFnZS9zZWN0aW9uMy5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2NvbnRlbnRwYWdlL3NlY3Rpb24zLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjVkMjRlNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2NvbnRlbnRwYWdlL3NlY3Rpb24zLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvY29udGVudHBhZ2Uvc2VjdGlvbjQuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9jb250ZW50cGFnZS9zZWN0aW9uNC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1OGQ0YTguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9jb250ZW50cGFnZS9zZWN0aW9uNC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2NvbnRlbnRwYWdlL3R1dG9yaWFsc193dHIuanBnIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9jb250ZW50cGFnZS90dXRvcmlhbHNfd3RyLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTc0YzdjMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2NvbnRlbnRwYWdlL3R1dG9yaWFsc193dHIuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9jb250ZW50cGFnZS93ZWJyc3JjX3d0ci5qcGcgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2NvbnRlbnRwYWdlL3dlYnJzcmNfd3RyLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzAwMmYyZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2NvbnRlbnRwYWdlL3dlYnJzcmNfd3RyLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvY29udGVudHBhZ2Uvd2hhdHNuZXdfd3RyLmpwZyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvY29udGVudHBhZ2Uvd2hhdHNuZXdfd3RyLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzJhNDJkYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2NvbnRlbnRwYWdlL3doYXRzbmV3X3d0ci5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2NvbnRlbnRwYWdlL3dvcmRtYXJrLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvY29udGVudHBhZ2Uvd29yZG1hcmsuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NjhlNTQ3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvY29udGVudHBhZ2Uvd29yZG1hcmsuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9jdG9vbC9iYWNrLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvY3Rvb2wvYmFjay5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjODFjYjYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9jdG9vbC9iYWNrLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvY3Rvb2wvZmlyc3RlcHM0OC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2N0b29sL2ZpcnN0ZXBzNDguZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjM2RiNjNkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvY3Rvb2wvZmlyc3RlcHM0OC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2N0b29sL2ZpcnN0ZXBzNDhzZWwuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9jdG9vbC9maXJzdGVwczQ4c2VsLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDVlNThiMS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2N0b29sL2ZpcnN0ZXBzNDhzZWwuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9jdG9vbC9maXJzdGVwczcyLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvY3Rvb2wvZmlyc3RlcHM3Mi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmNDUyOWUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9jdG9vbC9maXJzdGVwczcyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvY3Rvb2wvZm9yd2FyZC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2N0b29sL2ZvcndhcmQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZTRhNGY0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvY3Rvb2wvZm9yd2FyZC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2N0b29sL2hvbWUuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9jdG9vbC9ob21lLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDE2MGY4Zi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2N0b29sL2hvbWUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9jdG9vbC9vdmVydmlldzQ4LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvY3Rvb2wvb3ZlcnZpZXc0OC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhZTVjMGYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9jdG9vbC9vdmVydmlldzQ4LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvY3Rvb2wvb3ZlcnZpZXc0OHNlbC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2N0b29sL292ZXJ2aWV3NDhzZWwuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNDU5Y2U4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvY3Rvb2wvb3ZlcnZpZXc0OHNlbC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2N0b29sL292ZXJ2aWV3NzIuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9jdG9vbC9vdmVydmlldzcyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmQzOWRmNy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2N0b29sL292ZXJ2aWV3NzIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9jdG9vbC9wc3BicndzZS5qYmYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2N0b29sL3BzcGJyd3NlLmpiZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmYxNWE4NC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2N0b29sL3BzcGJyd3NlLmpiZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvY3Rvb2wvcmV0dXNlcjQ4LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvY3Rvb2wvcmV0dXNlcjQ4LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTE0MzgwMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2N0b29sL3JldHVzZXI0OC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2N0b29sL3JldHVzZXI0OHNlbC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2N0b29sL3JldHVzZXI0OHNlbC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiMTJlN2EuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9jdG9vbC9yZXR1c2VyNDhzZWwuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9jdG9vbC9yZXR1c2VyNzIuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9jdG9vbC9yZXR1c2VyNzIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NWNiMzFmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvY3Rvb2wvcmV0dXNlcjcyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvY3Rvb2wvc2FtcGxlczQ4LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvY3Rvb2wvc2FtcGxlczQ4LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOThlZDFkMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2N0b29sL3NhbXBsZXM0OC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2N0b29sL3NhbXBsZXM0OHNlbC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2N0b29sL3NhbXBsZXM0OHNlbC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3MTkxMjAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9jdG9vbC9zYW1wbGVzNDhzZWwuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9jdG9vbC9zYW1wbGVzNzIuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9jdG9vbC9zYW1wbGVzNzIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMDk2YmIwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvY3Rvb2wvc2FtcGxlczcyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvY3Rvb2wvdHV0b3JpYWxzNDguZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9jdG9vbC90dXRvcmlhbHM0OC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxOGQ2MTkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9jdG9vbC90dXRvcmlhbHM0OC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2N0b29sL3R1dG9yaWFsczQ4c2VsLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvY3Rvb2wvdHV0b3JpYWxzNDhzZWwuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZjFhZDc2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvY3Rvb2wvdHV0b3JpYWxzNDhzZWwuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9jdG9vbC90dXRvcmlhbHM3Mi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2N0b29sL3R1dG9yaWFsczcyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjgxYzJkNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2N0b29sL3R1dG9yaWFsczcyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvY3Rvb2wvd2I0OC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2N0b29sL3diNDguZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZDJjNmNkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvY3Rvb2wvd2I0OC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2N0b29sL3dlYnJzcmM0OC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2N0b29sL3dlYnJzcmM0OC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5Yzk0YzguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9jdG9vbC93ZWJyc3JjNDguZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9jdG9vbC93ZWJyc3JjNDhzZWwuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9jdG9vbC93ZWJyc3JjNDhzZWwuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNzg2ZWZiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvY3Rvb2wvd2VicnNyYzQ4c2VsLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvY3Rvb2wvd2VicnNyYzcyLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvY3Rvb2wvd2VicnNyYzcyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmJjZmMyMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2N0b29sL3dlYnJzcmM3Mi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2N0b29sL3doYXRzbmV3NDguZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9jdG9vbC93aGF0c25ldzQ4LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmJmYjliZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2N0b29sL3doYXRzbmV3NDguZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9jdG9vbC93aGF0c25ldzQ4c2VsLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvY3Rvb2wvd2hhdHNuZXc0OHNlbC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkYTg0M2YuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9jdG9vbC93aGF0c25ldzQ4c2VsLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvY3Rvb2wvd2hhdHNuZXc3Mi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2N0b29sL3doYXRzbmV3NzIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NGJmNmZmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvY3Rvb2wvd2hhdHNuZXc3Mi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2R0b29sL2JhY2suZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9kdG9vbC9iYWNrLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjBkMDkyOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2R0b29sL2JhY2suZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9kdG9vbC9mb3J3YXJkLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvZHRvb2wvZm9yd2FyZC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiZTU4YjIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9kdG9vbC9mb3J3YXJkLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvZHRvb2wvb3ZlcnZpZXcuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9kdG9vbC9vdmVydmlldy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiYzdiMGQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9kdG9vbC9vdmVydmlldy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2R0b29sL3Jlc3RvcmVfd2VsY29tZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2R0b29sL3Jlc3RvcmVfd2VsY29tZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5OTdiMjAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9kdG9vbC9yZXN0b3JlX3dlbGNvbWUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9kdG9vbC9zYW1wbGVzLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvZHRvb2wvc2FtcGxlcy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjZjNjYWUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9kdG9vbC9zYW1wbGVzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvZHRvb2wvdHV0b3JpYWxzLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvZHRvb2wvdHV0b3JpYWxzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjM4MjZhNS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2R0b29sL3R1dG9yaWFscy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2R0b29sL3doYXRzbmV3LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvZHRvb2wvd2hhdHNuZXcuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MDU2Yzk5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvZHRvb2wvd2hhdHNuZXcuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9ldG9vbC9iYWNrLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvZXRvb2wvYmFjay5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwZDA5MjkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9ldG9vbC9iYWNrLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvZXRvb2wvZmlyc3RlcHM0OC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2V0b29sL2ZpcnN0ZXBzNDguZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNWExYWQ5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvZXRvb2wvZmlyc3RlcHM0OC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2V0b29sL2ZpcnN0ZXBzNDhzZWwuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9ldG9vbC9maXJzdGVwczQ4c2VsLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2MyYjRlOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2V0b29sL2ZpcnN0ZXBzNDhzZWwuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9ldG9vbC9maXJzdGVwczcyLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvZXRvb2wvZmlyc3RlcHM3Mi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxOWE4MWEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9ldG9vbC9maXJzdGVwczcyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvZXRvb2wvZm9yd2FyZC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2V0b29sL2ZvcndhcmQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYmU1OGIyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvZXRvb2wvZm9yd2FyZC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2V0b29sL2hvbWUuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9ldG9vbC9ob21lLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjEwMWQxMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2V0b29sL2hvbWUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9ldG9vbC9vdmVydmlldy5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2V0b29sL292ZXJ2aWV3LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2ZlNjI5YS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2V0b29sL292ZXJ2aWV3LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvZXRvb2wvb3ZlcnZpZXc0OC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2V0b29sL292ZXJ2aWV3NDguZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OWJlNzY2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvZXRvb2wvb3ZlcnZpZXc0OC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2V0b29sL292ZXJ2aWV3NDhzZWwuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9ldG9vbC9vdmVydmlldzQ4c2VsLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTdkMjFlMS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2V0b29sL292ZXJ2aWV3NDhzZWwuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9ldG9vbC9vdmVydmlldzcyLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvZXRvb2wvb3ZlcnZpZXc3Mi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4ZDliNDYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9ldG9vbC9vdmVydmlldzcyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvZXRvb2wvcmVzdG9yZV93ZWxjb21lLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvZXRvb2wvcmVzdG9yZV93ZWxjb21lLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzczNmJjZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2V0b29sL3Jlc3RvcmVfd2VsY29tZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2V0b29sL3JldHVzZXI0OC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2V0b29sL3JldHVzZXI0OC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjZWUzNmMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9ldG9vbC9yZXR1c2VyNDguZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9ldG9vbC9yZXR1c2VyNDhzZWwuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9ldG9vbC9yZXR1c2VyNDhzZWwuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NDg1MTU2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvZXRvb2wvcmV0dXNlcjQ4c2VsLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvZXRvb2wvcmV0dXNlcjcyLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvZXRvb2wvcmV0dXNlcjcyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzQ4YWJhYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2V0b29sL3JldHVzZXI3Mi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2V0b29sL3NhbXBsZXMuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9ldG9vbC9zYW1wbGVzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzY5NTg4NC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2V0b29sL3NhbXBsZXMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9ldG9vbC9zYW1wbGVzNDguZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9ldG9vbC9zYW1wbGVzNDguZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOWI1OTI3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvZXRvb2wvc2FtcGxlczQ4LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvZXRvb2wvc2FtcGxlczQ4c2VsLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvZXRvb2wvc2FtcGxlczQ4c2VsLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWQ3NWQ5MS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2V0b29sL3NhbXBsZXM0OHNlbC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2V0b29sL3NhbXBsZXM3Mi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2V0b29sL3NhbXBsZXM3Mi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmZmYzNTYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9ldG9vbC9zYW1wbGVzNzIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9ldG9vbC90dXRvcmlhbHMuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9ldG9vbC90dXRvcmlhbHMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMThkN2RkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvZXRvb2wvdHV0b3JpYWxzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvZXRvb2wvdHV0b3JpYWxzNDguZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9ldG9vbC90dXRvcmlhbHM0OC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkZTZjMWUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9ldG9vbC90dXRvcmlhbHM0OC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2V0b29sL3R1dG9yaWFsczQ4c2VsLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvZXRvb2wvdHV0b3JpYWxzNDhzZWwuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MzUzZTA3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvZXRvb2wvdHV0b3JpYWxzNDhzZWwuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9ldG9vbC90dXRvcmlhbHM3Mi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2V0b29sL3R1dG9yaWFsczcyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzI5ZGI4OC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2V0b29sL3R1dG9yaWFsczcyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvZXRvb2wvd2I0OC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2V0b29sL3diNDguZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OTJjNDQ0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvZXRvb2wvd2I0OC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2V0b29sL3dlYnJzcmMxNi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2V0b29sL3dlYnJzcmMxNi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmODUwMDcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9ldG9vbC93ZWJyc3JjMTYuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9ldG9vbC93ZWJyc3JjNDguZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9ldG9vbC93ZWJyc3JjNDguZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNjcyYTU0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvZXRvb2wvd2VicnNyYzQ4LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvZXRvb2wvd2VicnNyYzQ4c2VsLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvZXRvb2wvd2VicnNyYzQ4c2VsLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTAzY2M5OC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2V0b29sL3dlYnJzcmM0OHNlbC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2V0b29sL3dlYnJzcmM3Mi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2V0b29sL3dlYnJzcmM3Mi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2OTk3ZGYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9ldG9vbC93ZWJyc3JjNzIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9ldG9vbC93aGF0c25ldy5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2V0b29sL3doYXRzbmV3LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjAyMjMyNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2V0b29sL3doYXRzbmV3LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvZXRvb2wvd2hhdHNuZXc0OC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2V0b29sL3doYXRzbmV3NDguZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZTAwZDdhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvZXRvb2wvd2hhdHNuZXc0OC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2V0b29sL3doYXRzbmV3NDhzZWwuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9ldG9vbC93aGF0c25ldzQ4c2VsLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmU5ZmEwYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2V0b29sL3doYXRzbmV3NDhzZWwuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9ldG9vbC93aGF0c25ldzcyLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvZXRvb2wvd2hhdHNuZXc3Mi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxMDA5M2IuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9ldG9vbC93aGF0c25ldzcyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvYWQtdC1wb3J0YWxhcHBsaWNhdGlvbi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L2FkLXQtcG9ydGFsYXBwbGljYXRpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMGM5NGFhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvYWQtdC1wb3J0YWxhcHBsaWNhdGlvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L2FkLXQtcG9ydGFsYXBwbGljYXRpb25ob3YuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9hZC10LXBvcnRhbGFwcGxpY2F0aW9uaG92LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTMwMmQyMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L2FkLXQtcG9ydGFsYXBwbGljYXRpb25ob3YuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9jb21tdW5pdHlfb2JqLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvY29tbXVuaXR5X29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkMTMyYTguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9jb21tdW5pdHlfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvY29tbXVuaXR5aG92X29iai5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L2NvbW11bml0eWhvdl9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhY2IyYTU4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvY29tbXVuaXR5aG92X29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L2VwZi1vdi1jb25maWdwdWJsaXNoLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZXBmLW92LWNvbmZpZ3B1Ymxpc2guZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxN2E1NmMzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZXBmLW92LWNvbmZpZ3B1Ymxpc2guZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9lcGYtb3YtY29uZmlncHVibGlzaGhvdi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L2VwZi1vdi1jb25maWdwdWJsaXNoaG92LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWUyODQxNS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L2VwZi1vdi1jb25maWdwdWJsaXNoaG92LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZXBmLW92LW1ldGhvZC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L2VwZi1vdi1tZXRob2QuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYTNkYTQ1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZXBmLW92LW1ldGhvZC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L2VwZi1vdi1tZXRob2Rob3YuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9lcGYtb3YtbWV0aG9kaG92LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGZkNjkxYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L2VwZi1vdi1tZXRob2Rob3YuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9lcGYtb3YtcHJvY2Vzcy5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L2VwZi1vdi1wcm9jZXNzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzFiNjk5Mi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L2VwZi1vdi1wcm9jZXNzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZXBmLW92LXByb2Nlc3Nob3YuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9lcGYtb3YtcHJvY2Vzc2hvdi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5NGM5Y2MuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9lcGYtb3YtcHJvY2Vzc2hvdi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L2VwZi1vdi1ydXBvdi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L2VwZi1vdi1ydXBvdi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmODUxZDAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9lcGYtb3YtcnVwb3YuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9lcGYtb3YtcnVwb3Zob3YuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9lcGYtb3YtcnVwb3Zob3YuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMDA4MWI1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZXBmLW92LXJ1cG92aG92LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZXBmLW92LXRvdXIuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9lcGYtb3YtdG91ci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxOTVjN2YuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9lcGYtb3YtdG91ci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L2VwZi1vdi10b3VyaG92LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZXBmLW92LXRvdXJob3YuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNzE5NzA4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZXBmLW92LXRvdXJob3YuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9lcGYtc3RlcHMtb25lLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZXBmLXN0ZXBzLW9uZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmZmU4MjQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9lcGYtc3RlcHMtb25lLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZXBmLXN0ZXBzLW9uZWhvdi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L2VwZi1zdGVwcy1vbmVob3YuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ODM0ZjcyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZXBmLXN0ZXBzLW9uZWhvdi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L2VwZl9yZXNvdXJjZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L2VwZl9yZXNvdXJjZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxMGE4ZDQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9lcGZfcmVzb3VyY2UuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9lcGZfcmVzb3VyY2Vob3YuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9lcGZfcmVzb3VyY2Vob3YuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMzk4YjM1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZXBmX3Jlc291cmNlaG92LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZmVhdHVyZXNfb2JqLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZmVhdHVyZXNfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzY0ZmQ0OC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L2ZlYXR1cmVzX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L2ZlYXR1cmVzaG92X29iai5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L2ZlYXR1cmVzaG92X29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiZmRmMDMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9mZWF0dXJlc2hvdl9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9mb2xkZXJfYWR2YXBwcy5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L2ZvbGRlcl9hZHZhcHBzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2RjMzI5Ni4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L2ZvbGRlcl9hZHZhcHBzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZm9sZGVyX2FkdmFwcHNob3YuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9mb2xkZXJfYWR2YXBwc2hvdi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2OWRlYjguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9mb2xkZXJfYWR2YXBwc2hvdi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L2ZvbGRlcl9kZXZ3ZWIuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9mb2xkZXJfZGV2d2ViLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTdhNTZjMy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L2ZvbGRlcl9kZXZ3ZWIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9mb2xkZXJfZGV2d2ViaG92LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZm9sZGVyX2RldndlYmhvdi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllMjg0MTUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9mb2xkZXJfZGV2d2ViaG92LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZm9sZGVyX2ZpcnN0c3RlcHMuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9mb2xkZXJfZmlyc3RzdGVwcy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3YTU2YzMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9mb2xkZXJfZmlyc3RzdGVwcy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L2ZvbGRlcl9maXJzdHN0ZXBzaG92LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZm9sZGVyX2ZpcnN0c3RlcHNob3YuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZTI4NDE1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZm9sZGVyX2ZpcnN0c3RlcHNob3YuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9mb2xkZXJfaGVscC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L2ZvbGRlcl9oZWxwLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTIxYjg1MC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L2ZvbGRlcl9oZWxwLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZm9sZGVyX2hlbHBob3YuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9mb2xkZXJfaGVscGhvdi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2YmEyOGQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9mb2xkZXJfaGVscGhvdi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L2ZvbGRlcl9pbXBvcnR3ZWIuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9mb2xkZXJfaW1wb3J0d2ViLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzkyNTQzYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L2ZvbGRlcl9pbXBvcnR3ZWIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9mb2xkZXJfaW1wb3J0d2ViaG92LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZm9sZGVyX2ltcG9ydHdlYmhvdi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjZGRjYWYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9mb2xkZXJfaW1wb3J0d2ViaG92LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZm9sZGVyX25ld3dlYi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L2ZvbGRlcl9uZXd3ZWIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxN2E1NmMzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZm9sZGVyX25ld3dlYi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L2ZvbGRlcl9uZXd3ZWJob3YuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9mb2xkZXJfbmV3d2ViaG92LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWUyODQxNS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L2ZvbGRlcl9uZXd3ZWJob3YuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9mb2xkZXJfb3ZlcnZpZXcuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9mb2xkZXJfb3ZlcnZpZXcuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZDkyZjhlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZm9sZGVyX292ZXJ2aWV3LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZm9sZGVyX292ZXJ2aWV3aG92LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZm9sZGVyX292ZXJ2aWV3aG92LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGUwNmJkMS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L2ZvbGRlcl9vdmVydmlld2hvdi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L2ZvbGRlcl9yaWNocmVwb3J0cy5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L2ZvbGRlcl9yaWNocmVwb3J0cy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkNmE1NGIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9mb2xkZXJfcmljaHJlcG9ydHMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9mb2xkZXJfcmljaHJlcG9ydHNob3YuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9mb2xkZXJfcmljaHJlcG9ydHNob3YuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZmE1YWVjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZm9sZGVyX3JpY2hyZXBvcnRzaG92LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZm9sZGVyX3NhbXBsZXMuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9mb2xkZXJfc2FtcGxlcy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhNjAzY2QuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9mb2xkZXJfc2FtcGxlcy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L2ZvbGRlcl9zYW1wbGVzaG92LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZm9sZGVyX3NhbXBsZXNob3YuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YTAzMGJkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZm9sZGVyX3NhbXBsZXNob3YuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9mb2xkZXJfdHV0b3JpYWxzLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZm9sZGVyX3R1dG9yaWFscy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3MjdkNWYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9mb2xkZXJfdHV0b3JpYWxzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZm9sZGVyX3R1dG9yaWFsc2hvdi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L2ZvbGRlcl90dXRvcmlhbHNob3YuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YzU3MWY4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZm9sZGVyX3R1dG9yaWFsc2hvdi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L2ZvbGRlcl93ZWIuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9mb2xkZXJfd2ViLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzc3ZWI5My4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L2ZvbGRlcl93ZWIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9mb2xkZXJfd2ViaG92LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZm9sZGVyX3dlYmhvdi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyODZkZDMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9mb2xkZXJfd2ViaG92LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZm9sZGVyX3doYXRzbmV3LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZm9sZGVyX3doYXRzbmV3LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDI3YThlNS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L2ZvbGRlcl93aGF0c25ldy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L2ZvbGRlcl93aGF0c25ld2hvdi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L2ZvbGRlcl93aGF0c25ld2hvdi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyZDczMTUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9mb2xkZXJfd2hhdHNuZXdob3YuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9nYWxsZXJ5X3NhbXBsZXMuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9nYWxsZXJ5X3NhbXBsZXMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1N2Y3NjJmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZ2FsbGVyeV9zYW1wbGVzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZ2FsbGVyeV9zYW1wbGVzaG92LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZ2FsbGVyeV9zYW1wbGVzaG92LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTUwOTdhNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L2dhbGxlcnlfc2FtcGxlc2hvdi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L2dhbGxlcnlfdHV0b3JpYWxzLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZ2FsbGVyeV90dXRvcmlhbHMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZWYwNDUxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZ2FsbGVyeV90dXRvcmlhbHMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9nYWxsZXJ5X3R1dG9yaWFsc2hvdi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L2dhbGxlcnlfdHV0b3JpYWxzaG92LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWEyYTFlOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L2dhbGxlcnlfdHV0b3JpYWxzaG92LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvamF2YWFwcF9vYmouZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9qYXZhYXBwX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlMDBkNTAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9qYXZhYXBwX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L2phdmFhcHBob3Zfb2JqLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvamF2YWFwcGhvdl9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNWU5ZjU4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvamF2YWFwcGhvdl9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9qYXZhYXBwbGV0X29iai5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L2phdmFhcHBsZXRfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjE5YTk1Mi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L2phdmFhcHBsZXRfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvamF2YWFwcGxldGhvdl9vYmouZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9qYXZhYXBwbGV0aG92X29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkYTNkYjkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9qYXZhYXBwbGV0aG92X29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L2phdmFkZXZfb2JqLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvamF2YWRldl9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNjUyNmEyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvamF2YWRldl9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9qYXZhZGV2aG92X29iai5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L2phdmFkZXZob3Zfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzZiNDdkMy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L2phdmFkZXZob3Zfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvbWlncmF0ZV9vYmouZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9taWdyYXRlX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjMmZlODguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9taWdyYXRlX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L21pZ3JhdGVob3Zfb2JqLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvbWlncmF0ZWhvdl9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZTM0ZTJhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvbWlncmF0ZWhvdl9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9uZXdfb2JqLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvbmV3X29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0NmI4MWIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9uZXdfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvbmV3aG92X29iai5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L25ld2hvdl9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OTNlNjNiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvbmV3aG92X29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L3BhZ2VfZmlyc3RzdGVwcy5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L3BhZ2VfZmlyc3RzdGVwcy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5YzBiMjYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9wYWdlX2ZpcnN0c3RlcHMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9wYWdlX2ZpcnN0c3RlcHNob3YuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9wYWdlX2ZpcnN0c3RlcHNob3YuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOGMwNTVhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvcGFnZV9maXJzdHN0ZXBzaG92LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvcGFnZV9oZWxwLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvcGFnZV9oZWxwLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTdmYjQ2My4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L3BhZ2VfaGVscC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L3BhZ2VfaGVscGhvdi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L3BhZ2VfaGVscGhvdi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjMjRmNGUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9wYWdlX2hlbHBob3YuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9wYWdlX21vdmllLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvcGFnZV9tb3ZpZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzZjk5OWUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9wYWdlX21vdmllLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvcGFnZV9tb3ZpZWhvdi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L3BhZ2VfbW92aWVob3YuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMWU1N2VjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvcGFnZV9tb3ZpZWhvdi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L3BhZ2Vfb3ZlcnZpZXcuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9wYWdlX292ZXJ2aWV3LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2UxYmIxNS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L3BhZ2Vfb3ZlcnZpZXcuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9wYWdlX292ZXJ2aWV3aG92LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvcGFnZV9vdmVydmlld2hvdi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyMjc4OTYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9wYWdlX292ZXJ2aWV3aG92LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvcGFnZV93ZWIuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9wYWdlX3dlYi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3NTk4N2EuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9wYWdlX3dlYi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L3BhZ2Vfd2ViaG92LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvcGFnZV93ZWJob3YuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOTE5N2RiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvcGFnZV93ZWJob3YuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9wYWdlX3doYXRzbmV3LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvcGFnZV93aGF0c25ldy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhYmFmYjkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9wYWdlX3doYXRzbmV3LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvcGFnZV93aGF0c25ld2hvdi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L3BhZ2Vfd2hhdHNuZXdob3YuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYjBlNTFkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvcGFnZV93aGF0c25ld2hvdi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L3BsdWdpbl9vYmouZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9wbHVnaW5fb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDkyZDJjNS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L3BsdWdpbl9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9wbHVnaW5ob3Zfb2JqLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvcGx1Z2luaG92X29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkZThjY2MuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9wbHVnaW5ob3Zfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvcmNwYXBwX29iai5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L3JjcGFwcF9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MzBhYjU2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvcmNwYXBwX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L3JjcGFwcGhvdl9vYmouZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9yY3BhcHBob3Zfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWJkODBhOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L3JjcGFwcGhvdl9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9zYW1wbGVwdXJwX29iai5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L3NhbXBsZXB1cnBfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzRlNTZmYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L3NhbXBsZXB1cnBfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvc2FtcGxlcHVycGhvdl9vYmouZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9zYW1wbGVwdXJwaG92X29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwNDgxZTIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9zYW1wbGVwdXJwaG92X29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L3NhbXBsZXJlZF9vYmouZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9zYW1wbGVyZWRfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjZkMTA0ZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L3NhbXBsZXJlZF9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9zYW1wbGVyZWRob3Zfb2JqLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvc2FtcGxlcmVkaG92X29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4N2Q2YjIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9zYW1wbGVyZWRob3Zfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvc2NyaXB0X29iai5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L3NjcmlwdF9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNDhiN2NkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvc2NyaXB0X29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L3NjcmlwdGhvdl9vYmouZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9zY3JpcHRob3Zfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDY3MjAzZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L3NjcmlwdGhvdl9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9zd3RhcHBfb2JqLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvc3d0YXBwX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliYTlhMzMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9zd3RhcHBfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvc3d0YXBwaG92X29iai5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L3N3dGFwcGhvdl9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNGZiYjVkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvc3d0YXBwaG92X29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L3RfbWV0aGNvbnRfb2JqLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvdF9tZXRoY29udF9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZTlhOTAxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvdF9tZXRoY29udF9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC90X21ldGhjb250aG92X29iai5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L3RfbWV0aGNvbnRob3Zfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGRkMTIxNy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L3RfbWV0aGNvbnRob3Zfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvdF9uYXZ1aV9vYmouZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC90X25hdnVpX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlMzlhYjIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC90X25hdnVpX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L3RfbmF2dWlob3Zfb2JqLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvdF9uYXZ1aWhvdl9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZjEwMWE2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvdF9uYXZ1aWhvdl9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC90X3B1YmV4cF9vYmouZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC90X3B1YmV4cF9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMjJmZmM2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvdF9wdWJleHBfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvdF9wdWJleHBob3Zfb2JqLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvdF9wdWJleHBob3Zfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDYxYjFhMy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L3RfcHViZXhwaG92X29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L3RfcmVtZXRoY29udF9vYmouZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC90X3JlbWV0aGNvbnRfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmY3ZDI4ZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L3RfcmVtZXRoY29udF9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC90X3JlbWV0aGNvbnRob3Zfb2JqLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvdF9yZW1ldGhjb250aG92X29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmZDU3ZDYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC90X3JlbWV0aGNvbnRob3Zfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvdF93b3JrcHJvY19vYmouZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC90X3dvcmtwcm9jX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0MjY3NDEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC90X3dvcmtwcm9jX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L3Rfd29ya3Byb2Nob3Zfb2JqLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvdF93b3JrcHJvY2hvdl9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OTEwNzhjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvdF93b3JrcHJvY2hvdl9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC90ZWFtc3VwX29iai5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L3RlYW1zdXBfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODZiZDdkNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L3RlYW1zdXBfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvdGVhbXN1cGhvdl9vYmouZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC90ZWFtc3VwaG92X29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiZGY4MTkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC90ZWFtc3VwaG92X29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L3VwZGF0ZXNfb2JqLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvdXBkYXRlc19vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNjA4YjMwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvdXBkYXRlc19vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC91cGRhdGVzaG92X29iai5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L3VwZGF0ZXNob3Zfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjJhMGFjZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L3VwZGF0ZXNob3Zfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvd2JiYXNpY3Nfb2JqLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvd2JiYXNpY3Nfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGI4MjU2My4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L3diYmFzaWNzX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L3diYmFzaWNzaG92X29iai5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L3diYmFzaWNzaG92X29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzMGJlOWMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC93YmJhc2ljc2hvdl9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9yb290cGFnZS9iYWNrZ3JvdW5kLmpwZyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3Mvcm9vdHBhZ2UvYmFja2dyb3VuZC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2OWZjZjMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9yb290cGFnZS9iYWNrZ3JvdW5kLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3Mvcm9vdHBhZ2UvYmFja2dyb3VuZF9lY2xpcHNlLmpwZyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3Mvcm9vdHBhZ2UvYmFja2dyb3VuZF9lY2xpcHNlLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTY5ZmNmMy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL3Jvb3RwYWdlL2JhY2tncm91bmRfZWNsaXBzZS5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL3Jvb3RwYWdlL2JhY2tncm91bmRfb2xkLmpwZyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3Mvcm9vdHBhZ2UvYmFja2dyb3VuZF9vbGQuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZjBhY2VjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3Mvcm9vdHBhZ2UvYmFja2dyb3VuZF9vbGQuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9yb290cGFnZS9icmFuZG1hcmsuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9yb290cGFnZS9icmFuZG1hcmsuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5M2YyNWY3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3Mvcm9vdHBhZ2UvYnJhbmRtYXJrLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3Mvcm9vdHBhZ2UvYnJhbmRtYXJrX2VjbGlwc2UuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9yb290cGFnZS9icmFuZG1hcmtfZWNsaXBzZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzZjI1ZjcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9yb290cGFnZS9icmFuZG1hcmtfZWNsaXBzZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL3Jvb3RwYWdlL2RvdHMuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9yb290cGFnZS9kb3RzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDliOTNlZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL3Jvb3RwYWdlL2RvdHMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9yb290cGFnZS9zdGFuZGJ5X3dvcmRtYXJrLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3Mvcm9vdHBhZ2Uvc3RhbmRieV93b3JkbWFyay5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4N2IxNTEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9yb290cGFnZS9zdGFuZGJ5X3dvcmRtYXJrLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3Mvc3d0L2Zvcm1fYmFubmVyLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3Mvc3d0L2Zvcm1fYmFubmVyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWViYzBiMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL3N3dC9mb3JtX2Jhbm5lci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL21jLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvbWMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OWYwNDVmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvbWMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9tY192c19wLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvbWNfdnNfcC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4Y2YxYzMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9tY192c19wLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvbWV0aG9kYXV0aG9yaW5nLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL21ldGhvZGF1dGhvcmluZy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZDA2MGRkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvbWV0aG9kYXV0aG9yaW5nLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi08aHRtbD4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotPGhlYWQ+Ci08dGl0bGU+TWV0aG9kIENvbnRlbnQgQXV0aG9yaW5nIE92ZXJ2aWV3PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5PgotPGgzPk1ldGhvZCBDb250ZW50IEF1dGhvcmluZyBPdmVydmlldzwvaDM+Ci08cD5NZXRob2QgY29udGVudCBkZXNjcmliZXMgcm9sZXMsIHRoZSB0YXNrcyB0aGF0IHRoZXkgcGVyZm9ybSwgdGhlIHdvcmsgcHJvZHVjdHMKLSAgdGhhdCBhcmUgdXNlZCBhbmQgcHJvZHVjZWQgYnkgdGhvc2UgdGFza3MsIGFuZCBzdXBwb3J0aW5nIGd1aWRhbmNlLjwvcD4KLTxwPjxpbWcgc3JjPSJtYy5naWYiPjwvcD4KLTxwPlRoZSBmaWd1cmUgYWJvdmUgZGVwaWN0cyB0eXBpY2FsIHNvdXJjZXMgZm9yIG1ldGhvZCBjb250ZW50LCBhcyB3ZWxsIGFzIGhvdwotICB0aGUgbWV0aG9kIGNvbnRlbnQgaXMgcmVwcmVzZW50ZWQgaW4gUk1DLiBNYW55IGRldmVsb3BtZW50IG1ldGhvZHMgYXJlIGRlc2NyaWJlZAotICBpbiBwdWJsaWNhdGlvbnMgc3VjaCBhcyBib29rcywgYXJ0aWNsZXMsIHRyYWluaW5nIG1hdGVyaWFsLCBzdGFuZGFyZHMgYW5kIHJlZ3VsYXRpb25zLAotICBhbmQgb3RoZXIgZm9ybXMgb2YgZG9jdW1lbnRhdGlvbi4gVGhlc2Ugc291cmNlcyB1c3VhbGx5IGRvY3VtZW50IG1ldGhvZHMgYnkKLSAgcHJvdmlkaW5nIHN0ZXAtYnktc3RlcCBleHBsYW5hdGlvbnMgZm9yIGEgcGFydGljdWxhciB3YXkgb2YgYWNoaWV2aW5nIGEgc3BlY2lmaWMKLSAgZGV2ZWxvcG1lbnQgZ29hbCB1bmRlciBnZW5lcmFsIGNpcmN1bXN0YW5jZXMuIFNvbWUgZXhhbXBsZXMgYXJlOiB0cmFuc2Zvcm1pbmcKLSAgYSByZXF1aXJlbWVudHMgZG9jdW1lbnQgaW50byBhbiBhbmFseXNpcyBtb2RlbDsgZGVmaW5pbmcgYW4gYXJjaGl0ZWN0dXJhbCBtZWNoYW5pc20KLSAgYmFzZWQgb24gZnVuY3Rpb25hbCBhbmQgbm9uLWZ1bmN0aW9uYWwgcmVxdWlyZW1lbnRzOyBjcmVhdGluZyBhIHByb2plY3QgcGxhbgotICBmb3IgYSBkZXZlbG9wbWVudCBpdGVyYXRpb247IGRlZmluaW5nIGEgcXVhbGl0eSBhc3N1cmFuY2UgcGxhbiBmb3IgZnVuY3Rpb25hbAotICByZXF1aXJlbWVudHM7IHJlZGVzaWduaW5nIGEgYnVzaW5lc3Mgb3JnYW5pemF0aW9uIGJhc2VkIG9uIGEgbmV3IHN0cmF0ZWdpYyBkaXJlY3Rpb24sCi0gIGFuZCBzbyBvbi48L3A+Ci08cD5STUMgdGFrZXMgY29udGVudCBzdWNoIGFzIHRoYXQgZGVzY3JpYmVkIGFib3ZlLCBhbmQgc3RydWN0dXJlcyBpdCBpbiBhIHNwZWNpZmljCi0gIHNjaGVtYSBvZiByb2xlcywgd29yayBwcm9kdWN0cywgdGFza3MsIGFuZCBndWlkYW5jZS4gVGhpcyBzY2hlbWEgc3VwcG9ydHMgdGhlCi0gIG9yZ2FuaXphdGlvbiBvZiBsYXJnZSBhbW91bnRzIG9mIGRlc2NyaXB0aW9ucyBmb3IgZGV2ZWxvcG1lbnQgbWV0aG9kcyBhbmQgcHJvY2Vzc2VzLgotICBTdWNoIG1ldGhvZCBjb250ZW50IGFuZCBwcm9jZXNzZXMgZG8gbm90IGhhdmUgdG8gYmUgbGltaXRlZCB0byBzb2Z0d2FyZSBlbmdpbmVlcmluZywKLSAgYnV0IGNhbiBhbHNvIGNvdmVyIG90aGVyIGRlc2lnbiBhbmQgZW5naW5lZXJpbmcgZGlzY2lwbGluZXMgc3VjaCBhcyBtZWNoYW5pY2FsCi0gIGVuZ2luZWVyaW5nLCBidXNpbmVzcyB0cmFuc2Zvcm1hdGlvbiwgc2FsZXMgY3ljbGVzLCBhbmQgc28gb24uPC9wPgotPHA+IFRoZSBSTUMgc2NyZWVuIGNhcHR1cmUgaW4gdGhlIGZpZ3VyZSBhYm92ZSBzaG93cyBob3cgc3VjaCBtZXRob2QgY29udGVudCBlbGVtZW50cwotICBhcmUgb3JnYW5pemVkIGluIHRyZWUgYnJvd3NlcnMgb24gdGhlIGxlZnQuIFRoZXNlIHRyZWUgYnJvd3NlcnMsIHNpbWlsYXIgdG8KLSAgYSBsaWJyYXJ5LCBwcm92aWRlIGRpZmZlcmVudCBpbmRleGVzIG9mIHRoZSBhdmFpbGFibGUgZWxlbWVudHMgZm9yIHJhcGlkIGFjY2Vzcy4KLSAgVGhlIHNjcmVlbiBjYXB0dXJlIHNob3dzIG9uIHRoZSByaWdodCBhbiBleGFtcGxlIG9mIGEgdGFzayBwcmVzZW50YXRpb24uIFRoaXMKLSAgdGFzayBwcmVzZW50YXRpb24gZGVmaW5lcyB0aGUgdGFzayBpbiB0ZXJtcyBvZiBzdGVwcyB0aGF0IG5lZWQgdG8gYmUgcGVyZm9ybWVkCi0gIHRvIGFjaGlldmUgdGhlIHRhc2sncyBwdXJwb3NlLiBZb3UgY2FuIHNlZSB0aGF0IHRoZSB0YXNrIGhhcyB2YXJpb3VzIHJlbGF0aW9uc2hpcHMsCi0gIHN1Y2ggYXMgcmVsYXRpb25zaGlwcyB0byBwZXJmb3JtaW5nIHJvbGVzIGFzIHdlbGwgYXMgd29yayBwcm9kdWN0cyB0aGF0IHNlcnZlCi0gIGFzIGlucHV0cyBhbmQgb3V0cHV0cyB0byB0aGUgdGFzay4gRmluZCBvdXQgbW9yZSBkZXRhaWxzIG9uIHRhc2tzLCByb2xlLCBhbmQKLSAgd29yayBwcm9kdWN0cyBpbiB0aGUgb25saW5lIGhlbHAgPGEgaHJlZj0iaHR0cDovL29yZy5lY2xpcHNlLnVpLmludHJvL3Nob3dIZWxwVG9waWM/aWQ9L29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL21ldGhvZGF1dGhvcmluZ292ZXJ2aWV3Lmh0bWwiPmhlcmU8L2E+LgotICBJbiBhZGRpdGlvbiB0byByb2xlcywgdGFza3MsIGFuZCB3b3JrIHByb2R1Y3RzLCBSTUMgc3VwcG9ydHMgdGhlIGFkZGl0aW9uIG9mCi0gIGd1aWRhbmNlIGVsZW1lbnRzLiBHdWlkYW5jZSBhcmUgc3VwcGxlbWVudGFyeSBmcmVlLWZvcm0gZG9jdW1lbnRhdGlvbiBzdWNoIGFzCi0gIHdoaXRlcGFwZXJzLCBjb25jZXB0IGRlc2NyaXB0aW9ucywgZ3VpZGVsaW5lcywgdGVtcGxhdGVzLCBleGFtcGxlcywgYW5kIHNvIG9uLjwvcD4KLTxwPlJNQyBwcm92aWRlcyB2YXJpb3VzIGZvcm0tYmFzZWQgZWRpdG9ycyB0byBjcmVhdGUgbmV3IG1ldGhvZCBjb250ZW50IGVsZW1lbnRzLgotICBEb2N1bWVudCB5b3VyIHRhc2ssIHJvbGVzLCB3b3JrIHByb2R1Y3RzLCBhbmQgZ3VpZGFuY2UgZWxlbWVudHMgdXNpbmcgaW50dWl0aXZlCi0gIHJpY2gtdGV4dCBlZGl0b3JzIHRoYXQgYWxsb3cgeW91IHRvIGNvcHkgYW5kIHBhc3RlIHRleHQgZnJvbSBvdGhlciBzb3VyY2VzIHN1Y2gKLSAgYXMgd2ViIHBhZ2VzIG9yIGRvY3VtZW50cy4gVXNlIHNpbXBsZSBkaWFsb2dzIHRvIGVzdGFibGlzaCByZWxhdGlvbnNoaXBzIGJldHdlZW4KLSAgY29udGVudCBlbGVtZW50cy48L3A+Ci08cD5STUMgb3JnYW5pemVzIGNvbnRlbnQgaW4gcGh5c2ljYWwgY29udGVudCBwYWNrYWdlcyB0aGF0IGFsbG93IHlvdSB0byBtYW5hZ2UKLSAgeW91ciBjb250ZW50IGluIGNvbmZpZ3VyYWJsZSB1bml0cy4gUk1DIGFsc28gYWxsb3dzIHlvdSB0byBjYXRlZ29yaXplIHlvdXIgY29udGVudAotICBiYXNlZCBvbiBhIHNldCBvZiBwcmVkZWZpbmVkIGNhdGVnb3JpZXMgKGZvciBleGFtcGxlLCBjYXRlZ29yaXplIHlvdXIgdGFza3MKLSAgaW50byBkZXZlbG9wbWVudCBkaXNjaXBsaW5lcywgb3IgeW91ciB3b3JrIHByb2R1Y3RzIGludG8gZG9tYWlucykgb3IgY3JlYXRlCi0gIHlvdXIgb3duIGNhdGVnb3JpemF0aW9uIHNjaGVtZXMgZm9yIHlvdXIgY29udGVudCB3aXRoIHlvdXIgb3duIHVzZXItZGVmaW5lZAotICBjYXRlZ29yaWVzIHRoYXQgYWxsb3cgeW91IHRvIGluZGV4IGNvbnRlbnQgaW4gYW55IHdheSB5b3Ugd2FudC48L3A+Ci08cD5Gb3IgbW9yZSBkZXRhaWxzIG9uIG1ldGhvZCBjb250ZW50IGF1dGhvcmluZyBzZWUgdGhlIG9ubGluZSBoZWxwOjwvcD4KLTxkaXYgYWxpZ249ImxlZnQiPgotPHVsPgotICA8bGk+PGEgaHJlZj0iaHR0cDovL29yZy5lY2xpcHNlLnVpLmludHJvL3Nob3dIZWxwVG9waWM/aWQ9L29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL21ldGhvZGF1dGhvcmluZ292ZXJ2aWV3Lmh0bWwiPk1ldGhvZAotICAgICAgQXV0aG9yaW5nIE92ZXJ2aWV3PC9hPjwvbGk+Ci08L3VsPgotPC9kaXY+Ci08cD4mbmJzcDs8L3A+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL292ZXJ2aWV3Lmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL292ZXJ2aWV3Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjZmRjOWUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9vdmVydmlldy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTY4ICswLDAgQEAKLTxodG1sPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08aGVhZD4KLTx0aXRsZT5FY2xpcHNlIFByb2Nlc3MgRnJhbWV3b3JrIENvbXBvc2VyIE92ZXJ2aWV3PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5PgotPGgzPkludHJvZHVjdGlvbiB0byBFY2xpcHNlIFByb2Nlc3MgRnJhbWV3b3JrIChFUEYpIENvbXBvc2VyPC9oMz4KLTxwPldlbGNvbWUgdG8gRWNsaXBzZSBQcm9jZXNzIEZyYW1ld29yayAoRVBGKSBDb21wb3Nlci4gRVBGIENvbXBvc2VyIGlzIGEgdG9vbCBwbGF0Zm9ybSB0aGF0IGVuYWJsZXMKLSAgcHJvY2VzcyBlbmdpbmVlcnMgYW5kIG1hbmFnZXJzIHRvIGltcGxlbWVudCwgZGVwbG95LCBhbmQgbWFpbnRhaW4gcHJvY2Vzc2VzCi0gIGZvciBvcmdhbml6YXRpb25zIG9yIGluZGl2aWR1YWwgcHJvamVjdHMuIFR5cGljYWxseSwgdHdvIGtleSBwcm9ibGVtcyBuZWVkIHRvCi0gIGJlIGFkZHJlc3NlZCB0byBzdWNjZXNzZnVsbHkgZGVwbG95IG5ldyBwcm9jZXNzZXMuPC9wPgotPHA+IEZpcnN0LCBkZXZlbG9wbWVudCB0ZWFtcyBuZWVkIHRvIGJlIGVkdWNhdGVkIG9uIHRoZSBtZXRob2RzIGFwcGxpY2FibGUgdG8KLSAgdGhlIHJvbGVzIHRoYXQgdGhleSBhcmUgcmVzcG9uc2libGUgZm9yLiBTb2Z0d2FyZSBkZXZlbG9wZXJzIHR5cGljYWxseSBuZWVkCi0gIHRvCi0gIGxlYXJuCi0gIGhvdwotICB0bwotICBkbyBhbmFseXNpcyBhbmQgZGVzaWduLCB0ZXN0ZXJzIG5lZWQgdG8gbGVhcm4gaG93IHRvIHRlc3QgaW1wbGVtZW50YXRpb25zIGFnYWluc3QKLSAgIHJlcXVpcmVtZW50cywgbWFuYWdlcnMgbmVlZCB0byBsZWFybiBob3cgdG8gbWFuYWdlIHRoZSBwcm9qZWN0IHNjb3BlIGFuZCBjaGFuZ2UsCi0KLSAgYW5kIHNvIG9uLiBTb21lIG9yZ2FuaXphdGlvbnMgYXNzdW1lIHRoYXQgZGV2ZWxvcGVycyBpbXBsaWNpdGx5IGtub3cgaG93IHRvCi0gICBkbyBzdWNoIHdvcmsgd2l0aG91dCBkb2N1bWVudGluZyB0aGVpciBtZXRob2RzLCBidXQgbWFueSBvcmdhbml6YXRpb25zIHdhbnQKLQotICB0byBlc3RhYmxpc2ggY29tbW9uIGFuZCByZWd1bGF0ZWQgcHJhY3RpY2VzLCB0byBkcml2ZSBzcGVjaWZpYyBpbXByb3ZlbWVudAotICBvYmplY3RpdmVzLCAgYW5kIHRvIG1lZXQgY29tcGxpYW5jZSBzdGFuZGFyZHMuPC9wPgotPHA+IFNlY29uZCwgZGV2ZWxvcG1lbnQgdGVhbXMgbmVlZCB0byB1bmRlcnN0YW5kIGhvdyB0byBhcHBseSB0aGVzZSBtZXRob2RzIHRocm91Z2hvdXQKLSAgYSBkZXZlbG9wbWVudCBsaWZlY3ljbGUuIFRoYXQgaXMsIHRoZXkgbmVlZCB0byBkZWZpbmUgb3Igc2VsZWN0IGEgZGV2ZWxvcG1lbnQKLSAgcHJvY2Vzcy4gRm9yCi0KLSAgZXhhbXBsZSwgcmVxdWlyZW1lbnRzIG1hbmFnZW1lbnQgbWV0aG9kcyBoYXZlIHRvIGJlIGFwcGxpZWQgZGlmZmVyZW50bHkgaW4KLSAgZWFybHkgIHBoYXNlcyBvZiBhIHByb2plY3Qgd2hlcmUgdGhlIGZvY3VzIGlzIG9uIGVsaWNpdGF0aW9uIG9mIHN0YWtlaG9sZGVyCi0gIG5lZWRzIGFuZAotICByZXF1aXJlbWVudHMgYW5kIHNjb3BpbmcgYSB2aXNpb24sIHRoYW4gaW4gbGF0ZXIgcGhhc2VzIHdoZXJlIHRoZSBmb2N1cyBpcwotICBvbiAgbWFuYWdpbmcgcmVxdWlyZW1lbnRzIHVwZGF0ZXMgYW5kIGNoYW5nZXMgYW5kIHBlcmZvcm1pbmcgaW1wYWN0IGFuYWx5c2lzCi0gIG9mCi0gIHRoZXNlIHJlcXVpcmVtZW50cyBjaGFuZ2VzLiBUZWFtcyBhbHNvIG5lZWQgY2xlYXIgdW5kZXJzdGFuZGluZyBvZiBob3cgdGhlCi0gIGRpZmZlcmVudCAgdGFza3Mgb2YgdGhlIG1ldGhvZHMgcmVsYXRlIHRvIGVhY2ggb3RoZXIsIGZvciBleGFtcGxlLCBob3cgdGhlCi0gIGNoYW5nZSBtYW5hZ2VtZW50Ci0gIG1ldGhvZCBpbXBhY3RzIHRoZSByZXF1aXJlbWVudHMgbWFuYWdlbWVudCBtZXRob2QgYXMgd2VsbCBhcyByZWdyZXNzaW9uIHRlc3RpbmcKLSAgIG1ldGhvZCB0aHJvdWdob3V0IHRoZSBsaWZlY3ljbGUuIEV2ZW4gc2VsZi1vcmdhbml6aW5nIHRlYW1zIG5lZWQgdG8gZGVmaW5lCi0gIGEKLSAgcHJvY2VzcyB0aGF0IGdpdmVzIGF0IG1pbmltdW0gc29tZSBndWlkYW5jZSBvbiBob3cgdGhlIGRldmVsb3BtZW50IHdpbGwgYmUKLSAgc2NvcGVkICB0aHJvdWdob3V0IHRoZSBsaWZlY3ljbGUsIHdoZW4gbWlsZXN0b25lcyB3aWxsIGJlIGFjaGlldmVkIGFuZCB2ZXJpZmllZCwKLSAgYW5kCi0gIHNvIG9uLiA8L3A+Ci08cD5UbyB0aGF0IGVuZCwgRVBGIENvbXBvc2VyIGhhcyB0d28gbWFpbiBwdXJwb3NlczogPC9wPgotPGRpdiBhbGlnbj0ibGVmdCI+PHVsPgotICA8bGk+VG8gcHJvdmlkZSBhIGtub3dsZWRnZSBiYXNlIG9mIGludGVsbGVjdHVhbCBjYXBpdGFsIHdoaWNoIHlvdSBjYW4gYnJvd3NlLAotICAgIG1hbmFnZSBhbmQgZGVwbG95LiBUaGlzIGNvbnRlbnQgY2FuIGluY2x1ZGUgZXh0ZXJuYWxseSBkZXZlbG9wZWQgY29udGVudCwKLSAgICBhbmQsIG1vcmUgaW1wb3J0YW50bHksIGNhbiBpbmNsdWRlIHlvdXIgb3duIGNvbnRlbnQgaW5jbHVkaW5nIG9mIHdoaXRlcGFwZXJzLAotICAgIGd1aWRlbGluZXMsIHRlbXBsYXRlcywgcHJpbmNpcGxlcywgYmVzdCBwcmFjdGljZXMsIGludGVybmFsIHByb2NlZHVyZXMgYW5kCi0gICAgcmVndWxhdGlvbnMsIHRyYWluaW5nIG1hdGVyaWFsLCBhbmQgYW55IG90aGVyIGdlbmVyYWwgZGVzY3JpcHRpb25zIG9mIHlvdXIKLSAgICBtZXRob2RzLiBUaGlzIGtub3dsZWRnZSBiYXNlIGNhbiB1c2VkIGZvciByZWZlcmVuY2UgYW5kIGVkdWNhdGlvbi4gSXQgYWxzbwotICAgIGZvcm1zIHRoZSBiYXNpcyBmb3IgZGV2ZWxvcGluZyBwcm9jZXNzZXMgKHRoZSBzZWNvbmQgcHVycG9zZSkuIEVQRiBDb21wb3NlciBpcyBkZXNpZ25lZAotICAgIHRvIGJlIGEgY29udGVudCBtYW5hZ2VtZW50IHN5c3RlbSB0aGF0IHByb3ZpZGVzIGEgY29tbW9uIG1hbmFnZW1lbnQgc3RydWN0dXJlCi0gICAgYW5kIGxvb2sgYW5kIGZlZWwgZm9yIGFsbCBvZiB5b3VyIGNvbnRlbnQsIHJhdGhlciB0aGFuIGJlaW5nIGEgZG9jdW1lbnQgbWFuYWdlbWVudAotICAgIHN5c3RlbSBpbiB3aGljaCB5b3Ugd291bGQgc3RvcmUgYW5kIGFjY2VzcyBoYXJkIHRvIG1haW50YWluIGxlZ2FjeSBkb2N1bWVudHMKLSAgICBhbGwgaW4gdGhlaXIgb3duIHNoYXBlcyBhbmQgZm9ybWF0cy4gQWxsIGNvbnRlbnQgbWFuYWdlZCBpbiBFUEYgQ29tcG9zZXIgY2FuIGJlIHB1Ymxpc2hlZAotICAgIHRvIGh0bWwgYW5kIGRlcGxveWVkIHRvIFdlYiBzZXJ2ZXJzIGZvciBkaXN0cmlidXRlZCB1c2FnZS48YnI+Ci0gIDwvbGk+Ci0gIDxsaT5UbyBwcm92aWRlIHByb2Nlc3MgZW5naW5lZXJpbmcgY2FwYWJpbGl0aWVzIGJ5IHN1cHBvcnRpbmcgcHJvY2VzcyBlbmdpbmVlcnMKLSAgICBhbmQgcHJvamVjdCBtYW5hZ2VycyBpbiBzZWxlY3RpbmcsIHRhaWxvcmluZywgYW5kIHJhcGlkbHkgYXNzZW1ibGluZyBwcm9jZXNzZXMKLSAgICBmb3IgdGhlaXIgY29uY3JldGUgZGV2ZWxvcG1lbnQgcHJvamVjdHMuIEVQRiBDb21wb3NlciBwcm92aWRlcyBjYXRhbG9ncyBvZiBwcmUtZGVmaW5lZAotICAgIHByb2Nlc3NlcyBmb3IgdHlwaWNhbCBwcm9qZWN0IHNpdHVhdGlvbnMgdGhhdCBjYW4gYmUgYWRhcHRlZCB0byBpbmRpdmlkdWFsCi0gICAgbmVlZHMuIEl0IGFsc28gcHJvdmlkZXMgcHJvY2VzcyBidWlsZGluZyBibG9ja3MsIGNhbGxlZCBjYXBhYmlsaXR5IHBhdHRlcm5zLAotICAgIHRoYXQgcmVwcmVzZW50IGJlc3QgZGV2ZWxvcG1lbnQgcHJhY3RpY2VzIGZvciBzcGVjaWZpYyBkaXNjaXBsaW5lcywgdGVjaG5vbG9naWVzLAotICAgIG9yIG1hbmFnZW1lbnQgc3R5bGVzLiBUaGVzZSBidWlsZGluZyBibG9ja3MgZm9ybSBhIHRvb2xraXQgZm9yIHF1aWNrIGFzc2VtYmx5Ci0gICAgb2YgcHJvY2Vzc2VzIGJhc2VkIG9uIHByb2plY3Qtc3BlY2lmaWMgbmVlZHMuIEVQRiBDb21wb3NlciBhbHNvIGFsbG93cyB5b3UgdG8gc2V0IHVwCi0gICAgeW91ciBvd24gb3JnYW5pemF0aW9uLXNwZWNpZmljIGNhcGFiaWxpdHkgcGF0dGVybiBsaWJyYXJpZXMuIEZpbmFsbHksIHRoZQotICAgIHByb2Nlc3NlcyBjcmVhdGVkIHdpdGggRVBGIENvbXBvc2VyIGNhbiBiZSBwdWJsaXNoZWQgYW5kIGRlcGxveWVkIGFzIFdlYiBzaXRlcy48L2xpPgotPC91bD4KLTwvZGl2PgotPGgzPkVjbGlwc2UgUHJvY2VzcyBGcmFtZXdvcmsgQ29tcG9zZXIncyBLZXkgQ2FwYWJpbGl0aWVzPC9oMz4KLTxwPklCTSBFY2xpcHNlIFByb2Nlc3MgRnJhbWV3b3JrIENvbXBvc2VyIHByb3ZpZGVzIHRoZSBmb2xsb3dpbmcgbmV3IGtleSBjYXBhYmlsaXRpZXM6PC9wPgotICA8ZGl2IGFsaWduPSJsZWZ0Ij4KLTx1bD4KLSAgPGxpPiBQcm92aWRlcyBjb21wbGV0ZWx5IHJlZGVzaWduZWQgdG9vbHMgZm9yIGF1dGhvcmluZywgY29uZmlndXJpbmcsIHZpZXdpbmcsCi0gICAgYW5kIHB1Ymxpc2hpbmcgZGV2ZWxvcG1lbnQgcHJvY2Vzc2VzLjwvbGk+Ci0gIDxsaT4gUHJvdmlkZXMganVzdC1pbi10aW1lIGdlbmVyYXRpb24gb2YgcHVibGljYXRpb24gcHJldmlld3MgaW4gZGVkaWNhdGVkIGJyb3dzaW5nCi0gICAgcGVyc3BlY3RpdmUgdGhhdCBhbGxvd3MgcmFwaWQgY29uZmlndXJhdGlvbiBzd2l0Y2hpbmcuPC9saT4KLSAgPGxpPiBNYW5hZ2VzIG1ldGhvZCBjb250ZW50IHVzaW5nIHNpbXBsZSBmb3JtLWJhc2VkIHVzZXIgaW50ZXJmYWNlcy4gVGhlcmVmb3JlLAotICAgIFVNTCBtb2RlbGluZyBza2lsbHMgYXJlIG5vIGxvbmdlciByZXF1aXJlZC48L2xpPgotICA8bGk+IFByb3ZpZGVzIGludHVpdGl2ZSByaWNoIHRleHQgZWRpdG9ycyBmb3IgY3JlYXRpbmcgaWxsdXN0cmF0aXZlIGNvbnRlbnQKLSAgICBkZXNjcmlwdGlvbnMuIEVkaXRvcnMgYWxsb3cgdXNlIG9mIHN0eWxlcywgaW1hZ2VzLCB0YWJsZXMsIGh5cGVybGlua3MsIGFuZAotICAgIGRpcmVjdCBodG1sIGVkaXRpbmcuPC9saT4KLSAgPGxpPkFsbG93cyBjcmVhdGluZyBwcm9jZXNzZXMgd2l0aCBicmVha2Rvd24gc3RydWN0dXJlIGVkaXRvcnMgYW5kIHdvcmtmbG93Ci0gICAgZGlhZ3JhbXMgdGhyb3VnaCB1c2Ugb2YgbXVsdGktcHJlc2VudGF0aW9uIHByb2Nlc3MgZWRpdG9ycy4gQnJlYWtkb3duIHN0cnVjdHVyZQotICAgIGVkaXRvciBzdXBwb3J0cyBkaWZmZXJlbnQgcHJvY2VzcyB2aWV3czogd29yay1icmVha2Rvd24gdmlldywgd29yayBwcm9kdWN0Ci0gICAgdXNhZ2UgdmlldywgYW5kIHRlYW0gYWxsb2NhdGlvbiB2aWV3LiBFUEYgQ29tcG9zZXIgYXV0b21hdGljYWxseSBzeW5jaHJvbml6ZXMgYWxsIHByZXNlbnRhdGlvbnMKLSAgICB3aXRoIHByb2Nlc3MgY2hhbmdlcy4gPC9saT4KLSAgPGxpPlByb3ZpZGVzIHN1cHBvcnQgZm9yIG1hbnkgYWx0ZXJuYXRpdmUgbGlmZWN5Y2xlCi0gICAgbW9kZWxzLiBGb3IgZXhhbXBsZSwgd2F0ZXJmYWxsLCBpbmNyZW1lbnRhbCwgb3IgaXRlcmF0aXZlIG1vZGVscyBjYW4gYmUgY3JlYXRlZAotICAgIHdpdGggdGhlIHNhbWUgb3ZlcmxhcHBpbmcgbWV0aG9kIGNvbnRlbnQuPC9saT4KLSAgPGxpPkltcHJvdmVkIHJldXNlIGFuZCBleHRlbnNpYmlsaXR5IGNhcGFiaWxpdGllcy4gVGhlIHBsdWctaW4gbWVjaGFuaXNtcyBmcm9tCi0gICAgcGFzdCB2ZXJzaW9ucyBoYXZlIGJlZW4gZXh0ZW5kZWQgdG8gc3VwcG9ydCBleHRlbnNpb25zIGZvciBicmVha2Rvd24gc3RydWN0dXJlcy48L2xpPgotICA8bGk+U3VwcG9ydHMgcmV1c2FibGUgZHluYW1pY2FsbHktbGlua2VkIHByb2Nlc3MgcGF0dGVybnMgb2YgYmVzdCBwcmFjdGljZXMKLSAgICBmb3IgcmFwaWQgcHJvY2VzcyBhc3NlbWJseSB2aWEgZHJhZy1hbmQtZHJvcC48L2xpPgotPC91bD4KLTwvZGl2PgotPGgzPktleSBUZXJtaW5vbG9neSBhbmQgQ29uY2VwdHM8L2gzPgotPHA+VG8gZWZmZWN0aXZlbHkgd29yayB3aXRoIEVQRiBDb21wb3NlciwgeW91IG5lZWQgdG8gdW5kZXJzdGFuZCBhIGZldyBjb25jZXB0cwotICB0aGF0IGFyZSB1c2VkIHRvIG9yZ2FuaXplIHRoZSBjb250ZW50LiBUaGUgcGFnZXMgPGEgaHJlZj0iaHR0cDovL29yZy5lY2xpcHNlLnVpLmludHJvL3Nob3dIZWxwVG9waWM/aWQ9L29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL21ldGhvZGF1dGhvcmluZ292ZXJ2aWV3Lmh0bWwiPk1ldGhvZAotICBDb250ZW50IEF1dGhvcmluZyBPdmVydmlldzwvYT4gYW5kIDxhIGhyZWY9Imh0dHA6Ly9vcmcuZWNsaXBzZS51aS5pbnRyby9zaG93SGVscFRvcGljP2lkPS9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9wcm9jZXNzYXV0aG9yaW5nb3ZlcnZpZXcuaHRtbCI+UHJvY2VzcwotICBBdXRob3JpbmcgT3ZlcnZpZXc8L2E+IGNvbnRhaW4gbW9yZSBkZXRhaWwgYW5kIGNvbmNyZXRlIGV4YW1wbGVzIG9mIGhvdyB0byB3b3JrCi0gIGluIHRoZSB0b29sLiBUaGlzIHBhZ2UgcHJvdmlkZXMgeW91IHdpdGggYSBnZW5lcmFsIG92ZXJ2aWV3IG9mIHRoZXNlIGNvbmNlcHRzLjwvcD4KLTxwPlRoZSBtb3N0IGZ1bmRhbWVudGFsIHByaW5jaXBsZSBpbiBFUEYgQ29tcG9zZXIgaXMgdGhlIHNlcGFyYXRpb24gb2YgcmV1c2FibGUgY29yZSBtZXRob2QKLSAgY29udGVudCBmcm9tIGl0cyBhcHBsaWNhdGlvbiBpbiBwcm9jZXNzZXMuIFRoaXMgZGlyZWN0bHkgcmVsYXRlcyBiYWNrIHRvIHRoZQotICB0d28gcHVycG9zZXMgb2YgRVBGIENvbXBvc2VyIGRlc2NyaWJlZCBpbiB0aGUgZmlyc3Qgc2VjdGlvbi4gQWxtb3N0IGFsbCBvZiBFUEYgQ29tcG9zZXIncyBjb25jZXB0cwotICBhcmUgY2F0ZWdvcml6ZWQgYWxvbmcgdGhpcyBzZXBhcmF0aW9uLiBNZXRob2QgY29udGVudCBkZXNjcmliZXMgd2hhdCBpcyB0byBiZQotICBwcm9kdWNlZCwgdGhlIG5lY2Vzc2FyeSBza2lsbHMgcmVxdWlyZWQgYW5kIHRoZSBzdGVwLWJ5LXN0ZXAgZXhwbGFuYXRpb25zIGRlc2NyaWJpbmcKLSAgaG93IHNwZWNpZmljIGRldmVsb3BtZW50IGdvYWxzIGFyZSBhY2hpZXZlZC4gVGhlc2UgbWV0aG9kIGNvbnRlbnQgZGVzY3JpcHRpb25zCi0gIGFyZSBpbmRlcGVuZGVudCBvZiBhIGRldmVsb3BtZW50IGxpZmVjeWNsZS4gUHJvY2Vzc2VzIGRlc2NyaWJlIHRoZSBkZXZlbG9wbWVudAotICBsaWZlY3ljbGUuIFByb2Nlc3NlcyB0YWtlIHRoZSBtZXRob2QgY29udGVudCBlbGVtZW50cyBhbmQgcmVsYXRlIHRoZW0gaW50byBzZW1pLW9yZGVyZWQKLSAgc2VxdWVuY2VzIHRoYXQgYXJlIGN1c3RvbWl6ZWQgdG8gc3BlY2lmaWMgdHlwZXMgb2YgcHJvamVjdHMuPC9wPgotPHA+PGltZyBzcmM9InVtYV9odW1wLmdpZiI+PC9wPgotPHA+VGhlIGZpZ3VyZSBhYm92ZSBzaG93cyBob3cgdGhpcyBzZXBhcmF0aW9uIGlzIGRlcGljdGVkIGluIEJhc2ljIFVuaWZpZWQKLSAgUHJvY2Vzcy4gTWV0aG9kIGNvbnRlbnQsIGRlc2NyaWJpbmcgaG93IGRldmVsb3BtZW50IHdvcmsgaXMgYmVpbmcgcGVyZm9ybWVkLAotICBpcyBjYXRlZ29yaXplZCBieSBkaXNjaXBsaW5lcyBhbG9uZyB0aGUgeS1heGlzIG9mIHRoZSBkaWFncmFtLiBUaGUgd29yayBkZXNjcmliZWQKLSAgaW4gYSBwcm9jZXNzIGlzIHNlZW4gYWxvbmcgdGhlIHgtYXhpcyByZXByZXNlbnRpbmcgdGhlIHRpbWVsaW5lLiBUaGlzIGlzIHRoZQotICBsaWZlY3ljbGUgb2YgYSBkZXZlbG9wbWVudCBwcm9qZWN0LiBJdCBleHByZXNzZXMgd2hlbiB3aGF0IHdvcmsgd2lsbCBiZSBwZXJmb3JtZWQuCi0gIFRoZSBncmFwaCBpbiB0aGUgaWxsdXN0cmF0aW9uIHJlcHJlc2VudHMgYW4gZXN0aW1hdGVkIHdvcmtsb2FkIGZvciBlYWNoIGRpc2NpcGxpbmUuCi0gIEFzIHlvdSBzZWUsIGZvciBleGFtcGxlLCBvbmUgbmV2ZXIgc3RvcHMgd29ya2luZyBvbiByZXF1aXJlbWVudHMgaW4gUlVQLCBidXQKLSAgdGhlcmUgYXJlIGNlcnRhaW5seSBwZWFrIHRpbWVzIGluIHdoaWNoIG1vc3Qgb2YgdGhlIHJlcXVpcmVtZW50cyBlbGljaXRhdGlvbgotICBhbmQgZGVzY3JpcHRpb24gd29yayBpcyBwZXJmb3JtZWQuIFRoZXJlIGFyZSBhbHNvIHRpbWVzIGF0IHdoaWNoIGEgZG93bndhcmQKLSAgdHJlbmQgbmVlZHMgdG8gYmUgb2JzZXJ2ZWQgd2hlcmUgZmV3ZXIgYW5kIGZld2VyIHJlcXVpcmVtZW50cyBjaGFuZ2VzIGhhdmUgdG8KLSAgYmUgcHJvY2Vzc2VkIHRvIGJyaW5nIHRoZSBwcm9qZWN0IHRvIGEgY2xvc2UuIFRoaXMgYXZvaWRzIHdoYXQgaXMgcmVmZXJyZWQgdG8KLSAgYXMgZmVhdHVyZSBjcmVlcCBpbiB3aGljaCByZXF1aXJlbWVudHMgd29yayByZW1haW5zIGNvbnN0YW50IG9yIGV2ZW4gaW5jcmVhc2VzLgotICBIZW5jZSwgYSBsaWZlY3ljbGUgKHByb2Nlc3MpIGV4cHJlc3NlcyB0aGUgdmFyaWFuY2VzIG9mIHdvcmsgcGVyZm9ybWVkIGluIHRoZQotICB2YXJpb3VzIGRpc2NpcGxpbmVzIChtZXRob2QgY29udGVudCkuPC9wPgotPHA+PGltZyBzcmM9Im1jX3ZzX3AuZ2lmIj48L3A+Ci08cD5UaGUgcGljdHVyZSBhYm92ZSBwcm92aWRlcyBhIHN1bW1hcnkgb2YgdGhlIGtleSBlbGVtZW50cyB1c2VkIGluIEVQRiBDb21wb3NlciBhbmQgaG93Ci0gIHRoZXkgcmVsYXRlIHRvIG1ldGhvZCBjb250ZW50IG9yIHByb2Nlc3MuIEFzIHlvdSBzZWUsIG1ldGhvZCBjb250ZW50IGlzIHByaW1hcmlseQotICBleHByZXNzZWQgdXNpbmcgd29yayBwcm9kdWN0cywgcm9sZXMsIHRhc2tzLCBhbmQgZ3VpZGFuY2UuIEd1aWRhbmNlLCBzdWNoIGFzCi0gIGNoZWNrbGlzdHMsIGV4YW1wbGVzLCBvciByb2FkbWFwcywgY2FuIGFsc28gYmUgZGVmaW5lZCB0byBwcm92aWRlIGV4ZW1wbGFyeQotICB3YWxrdGhyb3VnaHMgb2YgYSBwcm9jZXNzLiBPbiB0aGUgcmlnaHQtaGFuZCBzaWRlIG9mIHRoZSBkaWFncmFtLCB5b3Ugc2VlIHRoZQotICBlbGVtZW50cyB1c2VkIHRvIHJlcHJlc2VudCBwcm9jZXNzZXMgaW4gRVBGIENvbXBvc2VyLiBUaGUgbWFpbiBlbGVtZW50IGlzIHRoZSBhY3Rpdml0eQotICB0aGF0IGNhbiBiZSBuZXN0ZWQgdG8gZGVmaW5lIGJyZWFrZG93biBzdHJ1Y3R1cmVzIGFzIHdlbGwgYXMgcmVsYXRlZCB0byBlYWNoCi0gIG90aGVyIHRvIGRlZmluZSBhIGZsb3cgb2Ygd29yay4gQWN0aXZpdGllcyBhbHNvIGNvbnRhaW4gZGVzY3JpcHRvcnMgdGhhdCByZWZlcmVuY2UKLSAgbWV0aG9kIGNvbnRlbnQuIEFjdGl2aXRpZXMgYXJlIHVzZWQgdG8gZGVmaW5lIHByb2Nlc3NlcyBvZiB3aGljaCBFUEYgQ29tcG9zZXIgc3VwcG9ydAotICB0d28gbWFpbiBraW5kczogZGVsaXZlcnkgcHJvY2Vzc2VzIGFuZCBjYXBhYmlsaXR5IHBhdHRlcm5zLiBEZWxpdmVyeSBwcm9jZXNzZXMKLSAgcmVwcmVzZW50IGEgY29tcGxldGUgYW5kIGludGVncmF0ZWQgcHJvY2VzcyB0ZW1wbGF0ZSBmb3IgcGVyZm9ybWluZyBvbmUgc3BlY2lmaWMKLSAgdHlwZSBvZiBwcm9qZWN0LiBUaGV5IGRlc2NyaWJlIGEgY29tcGxldGUgZW5kLXRvLWVuZCBwcm9qZWN0IGxpZmVjeWNsZSBhbmQgYXJlCi0gIHVzZWQgYXMgYSByZWZlcmVuY2UgZm9yIHJ1bm5pbmcgcHJvamVjdHMgd2l0aCBzaW1pbGFyIGNoYXJhY3RlcmlzdGljcy4gQ2FwYWJpbGl0eQotICBwYXR0ZXJucyBhcmUgcHJvY2Vzc2VzIHRoYXQgZXhwcmVzcyBhbmQgY29tbXVuaWNhdGUgcHJvY2VzcyBrbm93bGVkZ2UgZm9yIGEKLSAga2V5IGFyZWEgb2YgaW50ZXJlc3Qgc3VjaCBhcyBhIGRpc2NpcGxpbmUgb3IgYSBiZXN0IHByYWN0aWNlLiBUaGV5IGFyZSBhbHNvCi0gIHVzZWQgYXMgYnVpbGRpbmcgYmxvY2tzIHRvIGFzc2VtYmxlIGRlbGl2ZXJ5IHByb2Nlc3NlcyBvciBsYXJnZXIgY2FwYWJpbGl0eQotICBwYXR0ZXJucy4gVGhpcyBlbnN1cmVzIG9wdGltYWwgcmV1c2UgYW5kIGFwcGxpY2F0aW9uIG9mIHRoZWlyIGtleSBiZXN0IHByYWN0aWNlcwotICBpbiBwcm9jZXNzIGF1dGhvcmluZyBhY3Rpdml0aWVzIGluIEVQRiBDb21wb3Nlci4gPC9wPgotCi08cD5Gb3IgbW9yZSBkZXRhaWxzIG9uIEVjbGlwc2UgUHJvY2VzcyBGcmFtZXdvcmsgQ29tcG9zZXIsIHNlZSB0aGUgb25saW5lIGhlbHA6PC9wPgotPGRpdiBhbGlnbj0ibGVmdCI+Ci08dWw+Ci0gIDxsaT48YSBocmVmPSJodHRwOi8vb3JnLmVjbGlwc2UudWkuaW50cm8vc2hvd0hlbHBUb3BpYz9pZD0vb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvYWJvdXRlcGZjb21wb3Nlci5odG1sIj5PdmVydmlldzwvYT48L2xpPgotICA8bGk+PGEgaHJlZj0iaHR0cDovL29yZy5lY2xpcHNlLnVpLmludHJvL3Nob3dIZWxwVG9waWM/aWQ9L29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3N0YW5kYXJkbWV0aG9kbGlicmFyeW92ZXJ2aWV3Lmh0bWwiPkdldHRpbmcKLSAgICAgIFN0YXJ0ZWQ8L2E+PC9saT4KLTwvdWw+Ci08L2Rpdj4KLTxwPjwvcD4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3Mvb3ZlcnZpZXcvb3ZlcnZpZXcuY3NzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9vdmVydmlldy9vdmVydmlldy5jc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhMTU1NDguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9vdmVydmlldy9vdmVydmlldy5jc3MKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqLwotCi1ib2R5IHsKLQliYWNrZ3JvdW5kLWltYWdlIDogdXJsKC4uL2dyYXBoaWNzL2NvbnRlbnRwYWdlL292ZXJ2aWV3X3d0ci5qcGcpOwotfQotCi0vKiBzaG93IHRoZSAic2VsZWN0ZWQiIGltYWdlIGZvciB0aGlzIHBhZ2UgKi8KLSNuYXZpZ2F0aW9uLWxpbmtzIGEjb3ZlcnZpZXcgaW1nLCAjbmF2aWdhdGlvbi1saW5rcyBhI292ZXJ2aWV3OmhvdmVyIGltZyB7IAotCWJhY2tncm91bmQtaW1hZ2UgOiB1cmwoLi4vZ3JhcGhpY3MvaWNvbnMvY3Rvb2wvb3ZlcnZpZXc0OHNlbC5naWYpOyAKLQl9Ci0KLQotaWZyYW1lIHsKLQlwb3NpdGlvbjpyZWxhdGl2ZTsKLQl0b3A6MTZweDsKLQl3aWR0aDoxMDAlOwotCWhlaWdodDoxMDAlOwotCXBhZGRpbmctbGVmdDoxMHB4OwotCX0KLQkKLS8qIG1vemlsbGEgc2Nyb2xsYmFyIGFwcGVhcmluZyBvZmYgcGFnZSBmaXggKi8KLSNwYWdlLWNvbnRlbnQgPiBpZnJhbWUgewotCXdpZHRoOiA5OCU7Ci0JcGFkZGluZy1sZWZ0OiAyJTsKLX0JCi0KLQotLyogCi0gKiBTZXQgdXAgdGhlIE92ZXJ2aWV3IGxpbmtzIHRvIGJlIGRpc3BsYXllZCBpbiB0d28gY29sdW1ucwotICogdGhhdCBhcmUgY2VudGVyZWQgaW4gdGhlIG1pZGRsZSBvZiB0aGUgcGFnZS4KLSAqLwotCi0jb3ZlcnZpZXctbGlua3MgewotCXRleHQtYWxpZ24gOiBsZWZ0OwotCXdpZHRoIDogNzYwcHg7Ci0JLyogVG8gY2VudGVyIGluIE1veiAoaGF2ZSB0byB1c2UgdGV4dC1hbGlnbiBmb3IgSUUpICovCi0JbWFyZ2luIDogMHB4IGF1dG87Ci0KLX0KLQotI292ZXJ2aWV3LWxpbmtzIGEgeyAKLQl3aWR0aCA6IDM3MHB4OwotCXRleHQtYWxpZ24gOiBsZWZ0OyAKLQltYXJnaW4tbGVmdCA6IDVweDsKLQltYXJnaW4tcmlnaHQgOiA1cHg7Ci0JbWFyZ2luLXRvcCA6IDVweDsKLQltYXJnaW4tYm90dG9tIDogLTIwcHg7Ci0JdmVydGljYWwtYWxpZ24gOiB0b3A7Ci19Ci0KLSNvdmVydmlldy1saW5rcyA+IGEgeyB2ZXJ0aWNhbC1hbGlnbiA6IG1pZGRsZTsgfQotCi0jb3ZlcnZpZXctbGlua3MgYSBpbWcgewotCWhlaWdodCA6IDU3cHg7Ci0Jd2lkdGggOiA1N3B4OwotCXZlcnRpY2FsLWFsaWduIDogbWlkZGxlOwotCQkKLX0JCi0KLSNvdmVydmlldy1saW5rcyBhIC5saW5rLWxhYmVsIHsKLQlkaXNwbGF5IDogYmxvY2s7Ci0Jd2lkdGggOiAzMDBweDsKLQlwb3NpdGlvbiA6IHJlbGF0aXZlOwotCXRvcCA6IC01MHB4OwotCWxlZnQgOiA2MHB4OwotfQotCi0jb3ZlcnZpZXctbGlua3MgYSA+IC5saW5rLWxhYmVsIHsgbGVmdDogNjVweDsgfQotCi0jb3ZlcnZpZXctbGlua3MgYSBwIC50ZXh0IHsKLQlkaXNwbGF5IDogYmxvY2s7Ci0Jd2lkdGggOiAzMDBweDsKLQlwb3NpdGlvbiA6IHJlbGF0aXZlOwotCXRvcCA6IC00NXB4OwotCWxlZnQgOiA1M3B4OwotfQotCi0jb3ZlcnZpZXctbGlua3MgYSBwID4gLnRleHQgeyBsZWZ0OiA1OHB4OyB9Ci0KLS8qIFNwZWNpYWwgY2FzZSBmb3IgTW96aWxsYSwgYmVjYXVzZSB0aGUgbGlua3MgYXJlIGRpc3BsYXllZAotICAgaW4gMSB2ZXJ0aWNhbCBjb2x1bW4gaW5zdGVhZCBvZiAyIGNlbnRlcmVkIGNvbHVtbnMgKi8KLSNvdmVydmlldy1saW5rcyA+IGEgeyAJd2lkdGggOiA3MDBweDsgfQotI292ZXJ2aWV3LWxpbmtzIGEgPiAubGluay1sYWJlbCB7IHdpZHRoIDogNzAwcHg7IH0KLSNvdmVydmlldy1saW5rcyBhIHAgPiAudGV4dCB7IHdpZHRoIDogNzAwcHg7IH0KLQotI292ZXJ2aWV3LWxpbmtzIGE6aG92ZXIgeyBib3JkZXItcmlnaHQgOiA1cHg7IH0KLQotYSNiYXNpY3MgaW1nIHsgYmFja2dyb3VuZC1pbWFnZSA6IHVybCguLi9ncmFwaGljcy9pY29ucy9vYmo0OC93YmJhc2ljc19vYmouZ2lmKTsgfQotYSNiYXNpY3M6aG92ZXIgaW1nIHsgYmFja2dyb3VuZC1pbWFnZSA6IHVybCguLi9ncmFwaGljcy9pY29ucy9vYmo0OC93YmJhc2ljc2hvdl9vYmouZ2lmKTsgfQotCi1hI3RlYW0gaW1nIHsgYmFja2dyb3VuZC1pbWFnZSA6IHVybCguLi9ncmFwaGljcy9pY29ucy9vYmo0OC90ZWFtc3VwX29iai5naWYpOyB9Ci1hI3RlYW06aG92ZXIgaW1nIHsgYmFja2dyb3VuZC1pbWFnZSA6IHVybCguLi9ncmFwaGljcy9pY29ucy9vYmo0OC90ZWFtc3VwaG92X29iai5naWYpOyB9Ci0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3Mvb3ZlcnZpZXcvc3d0LnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL292ZXJ2aWV3L3N3dC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NTEzY2ViLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3Mvb3ZlcnZpZXcvc3d0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLW92ZXJ2aWV3LmxheW91dC5uY29sdW1ucyA9IDIKLW92ZXJ2aWV3LnBhZ2UtY29udGVudC5vdmVydmlldy1saW5rcy5sYXlvdXQudnNwYWNpbmcgPSAzNQotb3ZlcnZpZXcucGFnZS1jb250ZW50Lm92ZXJ2aWV3LWxpbmtzLmxheW91dC5uY29sdW1ucyA9IDIKLQotb3ZlcnZpZXcuc3VidGl0bGUtaWQgPSBvdmVydmlldy9wYWdlLWNvbnRlbnQvcGFnZS10aXRsZQotb3ZlcnZpZXcuZGVzY3JpcHRpb24taWQgPSBvdmVydmlldy9wYWdlLWNvbnRlbnQvcGFnZS1kZXNjcmlwdGlvbgotCi1vdmVydmlldy5wYWdlLWNvbnRlbnQub3ZlcnZpZXctbGlua3MuZXBmLW92LXJ1cG92LmxpbmstaWNvbiA9IGNzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9lcGYtb3YtcnVwb3YuZ2lmCi1vdmVydmlldy5wYWdlLWNvbnRlbnQub3ZlcnZpZXctbGlua3MuZXBmLW92LW1ldGhvZC5saW5rLWljb24gPSBjc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZXBmLW92LW1ldGhvZC5naWYKLW92ZXJ2aWV3LnBhZ2UtY29udGVudC5vdmVydmlldy1saW5rcy5lcGYtb3YtcHJvY2Vzcy5saW5rLWljb24gPSBjc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZXBmLW92LXByb2Nlc3MuZ2lmCi1vdmVydmlldy5wYWdlLWNvbnRlbnQub3ZlcnZpZXctbGlua3MuZXBmLW92LWNvbmZpZ3B1Ymxpc2gubGluay1pY29uID0gY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L2VwZi1vdi1jb25maWdwdWJsaXNoLmdpZgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvcC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL3AuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYmYyYjdjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvcC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL3Byb2Nlc3NhdXRob3JpbmcuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvcHJvY2Vzc2F1dGhvcmluZy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMjI0MmRmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvcHJvY2Vzc2F1dGhvcmluZy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotPGh0bWw+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLTxoZWFkPgotPHRpdGxlPlByb2Nlc3MgQXV0aG9yaW5nIE92ZXJ2aWV3PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5PgotPGgzPlByb2Nlc3MgQXV0aG9yaW5nIE92ZXJ2aWV3PC9oMz4KLTxwPkEgZGV2ZWxvcG1lbnQgcHJvY2VzcyBkZWZpbmVzIHNlcXVlbmNlcyBvZiB0YXNrcyBwZXJmb3JtZWQgYnkgcm9sZXMgYW5kIHdvcmsKLSAgcHJvZHVjdHMgcHJvZHVjZWQgb3ZlciB0aW1lLjwvcD4KLTxwPjxpbWcgc3JjPSJwLmdpZiI+PC9wPgotPHA+VGhlIGZpZ3VyZSBhYm92ZSBzaG93cyB0aGF0IHByb2Nlc3NlcyBhcmUgdHlwaWNhbGx5IGV4cHJlc3NlZCBhcyB3b3JrZmxvd3MKLSAgb3IgYnJlYWtkb3duIHN0cnVjdHVyZXMuIERlZmluaW5nIGEgc3RyaWN0IHNlcXVlbmNlIGFzIGluIGEgd2F0ZXJmYWxsIG1vZGVsCi0gIGlzIGFzIG11Y2ggYSBwcm9jZXNzIGFzIGRlZmluaW5nIHNlbWktb3JkZXJlZCBzZXF1ZW5jZXMgaW4gaXRlcmF0aW9ucyBvZiBwYXJhbGxlbAotICB3b3JrLiBUaGV5IGp1c3QgcmVwcmVzZW50IGRpZmZlcmVudCBkZXZlbG9wbWVudCBhcHByb2FjaGVzLiBIZW5jZSwgZm9yIGRlZmluaW5nCi0gIGEgcHJvY2Vzcywgb25lIGNhbiB0YWtlIG1ldGhvZCBjb250ZW50IGFuZCBjb21iaW5lIGl0IGludG8gc3RydWN0dXJlcyB0aGF0IHNwZWNpZnkKLSAgaG93IHRoZSB3b3JrIHNoYWxsIGJlIG9yZ2FuaXplZCBvdmVyIHRpbWUsIHRvIG1lZXQgdGhlIG5lZWRzIG9mIGEgcGFydGljdWxhcgotICB0eXBlIG9mIGRldmVsb3BtZW50IHByb2plY3QgKHN1Y2ggYXMgc29mdHdhcmUgZm9yIGEgb25saW5lIHN5c3RlbSB2ZXJzdXMgc29mdHdhcmUKLSAgYW5kIGhhcmR3YXJlIGZvciBhbiBlbWJlZGRlZCBzeXN0ZW0pLiBSTUMgc3VwcG9ydHMgcHJvY2Vzc2VzIGJhc2VkIG9uIGRpZmZlcmVudAotICBkZXZlbG9wbWVudCBhcHByb2FjaGVzIGFjcm9zcyBtYW55IGRpZmZlcmVudCBsaWZlY3ljbGUgbW9kZWxzLCBpbmNsdWRpbmcgd2F0ZXJmYWxsLAotICBpbmNyZW1lbnRhbCwgYW5kIGl0ZXJhdGl2ZSBsaWZlY3ljbGVzLiBSTUMgYWxzbyBzdXBwb3J0cyBkaWZmZXJlbnQgcHJlc2VudGF0aW9ucwotICBmb3IgcHJvY2Vzcywgc3VjaCBhcyB3b3JrLWJyZWFrZG93biBzdHJ1Y3R1cmUgb3Igd29ya2Zsb3cgcHJlc2VudGF0aW9ucy4gWW91Ci0gIGNhbiBhbHNvIGRlZmluZSBwcm9jZXNzZXMgaW4gUk1DIHRoYXQgdXNlIGEgbWluaW1hbCBzZXQgb2YgbWV0aG9kIGNvbnRlbnQgdG8KLSAgZGVmaW5lIHByb2Nlc3NlcyBmb3IgYWdpbGUsIHNlbGYtb3JnYW5pemluZyB0ZWFtcy48L3A+Ci08cD4gVGhlIFJNQyBzY3JlZW4gY2FwdHVyZSBhYm92ZSBzaG93cyBhbiBleGFtcGxlIG9mIGEgcHJvY2VzcyBwcmVzZW50ZWQgYXMgYQotICBicmVha2Rvd24gc3RydWN0dXJlIG9mIG5lc3RlZCBhY3Rpdml0aWVzIGFzIHdlbGwgYXMgYSB3b3JrZmxvdyBvciBhY3Rpdml0eSBkaWFncmFtCi0gIGZvciBvbmUgcGFydGljdWxhciBhY3Rpdml0eSwgdGhlIGluY2VwdGlvbiBwaGFzZS4gSXQgYWxzbyBpbmRpY2F0ZXMgd2l0aCB0aGUKLSAgdHdvIGJsdWUgYXJyb3dzIHRoYXQgdGhlIHBhcnRpY3VsYXIgbWV0aG9kIGNvbnRlbnQgdGFzayAmcXVvdDtEZXRhaWwgYSBVc2UgQ2FzZSZxdW90OwotICBoYXMgYmVlbiBhcHBsaWVkIGluIHRoZSBwcm9jZXNzIHR3aWNlOyBmaXJzdGx5IGluIHRoZSBpbmNlcHRpb24gcGhhc2UgdW5kZXIKLSAgdGhlIGFjdGl2aXR5ICZxdW90O0RlZmluZSB0aGUgU3lzdGVtLCZxdW90OyBhbmQgc2Vjb25kbHksIGluIHRoZSBlbGFib3JhdGlvbgotICBwaGFzZSBpbiB0aGUgYWN0aXZpdHkgJnF1b3Q7UmVmaW5lIHRoZSBzeXN0ZW0gZGVmaW5pdGlvbiZxdW90Oy4gWW91IHNlZSBiZWxvdwotICBlYWNoIG9mIHRoZXNlIHRhc2sgYXBwbGljYXRpb25zLCByZWZlcnJlZCB0byBhcyBhIHRhc2sgZGVzY3JpcHRvcnMgaW4gUk1DLCBsaXN0cwotICBvZiB0aGUgcGVyZm9ybWluZyByb2xlcyBhcyB3ZWxsIGFzIHRoZSBpbnB1dCBhbmQgb3V0cHV0IHdvcmsgcHJvZHVjdHMuIElmIHlvdQotICBsb29rIGNsb3NlbHksIHlvdSBzZWUgdGhhdCB0aGVzZSBsaXN0cyBhcmUgZGlmZmVyZW50IGZvciBlYWNoIG9mIHRoZXNlIHR3byB0YXNrCi0gIGRlc2NyaXB0b3JzLCBleHByZXNzaW5nIGRpZmZlcmVuY2VzIGluIHBlcmZvcm1pbmcgdGhlICZxdW90O0RldGFpbCBhIFVzZSBDYXNlJnF1b3Q7Ci0gIG1ldGhvZCB0aHJvdWdob3V0IHRoZSBsaWZlY3ljbGUuIFlvdSBzZWUgZGlmZmVyZW50IHJvbGVzIGludm9sdmVkIGFuZCBjaGFuZ2VzCi0gIGluIHRoZSBsaXN0IG9mIGlucHV0cyB0byBiZSBjb25zaWRlcmVkIGFuZCBvdXRwdXRzIHRvIGJlIHByb2R1Y2VkIG9yIHVwZGF0ZWQuCi0gIFRoZXNlIGNoYW5nZXMgd2VyZSBkZWZpbmVkIGJ5IHRoZSBhdXRob3IgdGhhdCBjcmVhdGVkIHRoaXMgcHJvY2VzcyB0byBleHByZXNzCi0gIHRoZSBleGFjdCBmb2N1cyBvZiB0aGUgdGFzayBwZXJmb3JtYW5jZSBmb3IgZWFjaCBvY2N1cnJlbmNlLiBJbiBhZGRpdGlvbiB0bwotICB1cGRhdGluZyB0aGUgcm9sZXMsIGlucHV0IGFuZCBvdXRwdXQgd29yayBwcm9kdWN0cyBmb3IgYSB0YXNrIGRlc2NyaXB0b3IsIHlvdQotICBjYW4gYWxzbyBwcm92aWRlIGFkZGl0aW9uYWwgdGV4dHVhbCBkZXNjcmlwdGlvbnMgYXMgd2VsbCBhcyBkZWZpbmUgdGhlIGV4YWN0Ci0gIHN0ZXBzIG9mIHRoZSB0YXNrIHRoYXQgc2hvdWxkIGFuZCBzaG91bGQgbm90IGJlIHBlcmZvcm1lZCBmb3IgdGhpcyBwYXJ0aWN1bGFyCi0gIG9jY3VycmVuY2Ugb2YgdGhlIHRhc2suPC9wPgotPHA+Uk1DIHByb3ZpZGVzIHlvdSB3aXRoIGEgcHJvY2VzcyBlZGl0b3IgdGhhdCBzdXBwb3J0cyBkaWZmZXJlbnQgYnJlYWtkb3duIHN0cnVjdHVyZQotICB2aWV3cyBhcyB3ZWxsIGFzIGdyYXBoaWNhbCBwcm9jZXNzIHByZXNlbnRhdGlvbnMuIEFzIGEgcHJvY2VzcyBhdXRob3IsIHlvdSB0eXBpY2FsbHkKLSAgc3RhcnQgYnkgY3JlYXRpbmcgYW4gYWN0aXZpdHkgYnJlYWtkb3duLCBkaXZpZGluZyBhbmQgYnJlYWtpbmcgeW91ciBwcm9jZXNzCi0gIGRvd24gaW50byBwaGFzZXMsIGl0ZXJhdGlvbnMsIGFuZCBoaWdoLWxldmVsIGFjdGl2aXRpZXMuIEluc3RlYWQgb2YgY3JlYXRpbmcKLSAgeW91ciBhY3Rpdml0aWVzIGluIHRoZSBicmVha2Rvd24gc3RydWN0dXJlIGVkaXRvciwgeW91IGNhbiBhbHRlcm5hdGl2ZWx5IHdvcmsKLSAgaW4gYSBncmFwaGljYWwgYWN0aXZpdHkgZGlhZ3JhbSBlZGl0b3IgdGhhdCBhbGxvd3MgeW91IHRvIGdyYXBoaWNhbGx5IGNyZWF0ZQotICBhIHdvcmtmbG93IGZvciB5b3VyIGFjdGl2aXRpZXMuIFRvIGFzc2lnbiBtZXRob2QgY29udGVudCB0byB5b3VyIHByb2Nlc3MsIHlvdQotICB0aGVuIGhhdmUgdGhlIGNob2ljZSBvZiB3b3JraW5nIGluIGRpZmZlcmVudCBwcm9jZXNzIHZpZXdzICh3b3JrIGJyZWFrZG93biBzdHJ1Y3R1cmUsCi0gIHdvcmsgcHJvZHVjdCB1c2FnZSwgb3IgdGVhbSBhbGxvY2F0aW9uIHZpZXcpLiBFYWNoIHZpZXcgc3VwcG9ydHMgYSBkaWZmZXJlbnQKLSAgYXBwcm9hY2ggZm9yIGNyZWF0aW5nIGEgcHJvY2Vzcy4gWW91IGNhbiBkZWZpbmUgdGhlIHdvcmsgdG8gYmUgZG9uZSwgZGVmaW5lCi0gIHRoZSByZXN1bHRzIHRvIGJlIHByb2R1Y2VkLCBvciBkZWZpbmUgcmVzcG9uc2liaWxpdGllcyBmb3IgeW91ciByb2xlcy4gSWYgcmVxdWVzdGVkLAotICB0aGUgZWRpdG9yIHVwZGF0ZXMgdGhlIG90aGVyIHByb2Nlc3Mgdmlld3Mgc2VtaS1hdXRvbWF0aWNhbGx5IHVzaW5nIHdpemFyZHMKLSAgdGhhdCBwcm9tcHQgeW91IGZvciBkZWNpc2lvbnMgb24gc2VsZWN0aW5nIG1ldGhvZCBjb250ZW50IGVsZW1lbnRzLjwvcD4KLTxwPkZvciBtb3JlIGRldGFpbHMgb24gcHJvY2VzcyBhdXRob3Jpbmcgc2VlIHRoZSBvbmxpbmUgaGVscDo8L3A+Ci08ZGl2IGFsaWduPSJsZWZ0Ij4KLTx1bD4KLSAgPGxpPjxhIGhyZWY9Imh0dHA6Ly9vcmcuZWNsaXBzZS51aS5pbnRyby9zaG93SGVscFRvcGljP2lkPS9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9wcm9jZXNzYXV0aG9yaW5nb3ZlcnZpZXcuaHRtbCI+UHJvY2VzcwotICBBdXRob3JpbmcgT3ZlcnZpZXc8L2E+PC9saT4KLTwvdWw+Ci08L2Rpdj4KLTxwPiZuYnNwOzwvcD4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvcHViLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvcHViLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDEzZThkMy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL3B1Yi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL3B1Ymxpc2hpbmcuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvcHVibGlzaGluZy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZWMwODJiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvcHVibGlzaGluZy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotPGh0bWw+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLTxoZWFkPgotPHRpdGxlPkNvbmZpZ3VyYXRpb24gYW5kIFB1Ymxpc2hpbmc8L3RpdGxlPgotPC9oZWFkPgotPGJvZHk+Ci08aDM+TWV0aG9kIENvbmZpZ3VyYXRpb25zIE92ZXJ2aWV3PC9oMz4KLTxwPkVjbGlwc2UgUHJvY2VzcyBGcmFtZXdvcmsgQ29tcG9zZXIgc2hpcHMgd2l0aCBhIGxvdCBvZiBjb250ZW50IG91dCBvZiB0aGUgYm94LiBJdCBpbmNsdWRlcwotICB0aGUgT3BlbiBVbmlmaWVkIFByb2Nlc3MgKE9wZW5VUCkgZnJhbWV3b3JrIGFuZCB2YXJpb3VzIHBsdWctaW5zIGV4dGVuZGluZwotICBPcGVuVVAvQmFzaWMuIE5vIG9yZ2FuaXphdGlvbiBvciBwcm9qZWN0IHJlcXVpcmVzIGFsbCBvZiB0aGlzCi0gIGRvY3VtZW50YXRpb24gYWxsIGF0IG9uY2UsIGJ1dCB3b3VsZCB3b3JrIHdpdGggYSBzZWxlY3Rpb24gb2Ygc3BlY2lmaWMgc3Vic2V0cy48L3A+Ci08cD4gRWNsaXBzZSBQcm9jZXNzIEZyYW1ld29yayAoRVBGKSBDb21wb3NlciBtYW5hZ2VzIGZvciB0aGF0IHB1cnBvc2Ugc28tY2FsbGVkIG1ldGhvZAotICBjb25maWd1cmF0aW9ucywgd2hpY2ggYWxsb3cgeW91IHRvIHNwZWNpZnkgd29ya2luZyBzZXRzIG9mIGNvbnRlbnQgYW5kIHByb2Nlc3NlcwotICBmb3IgYSBzcGVjaWZpYyBjb250ZXh0LCBzdWNoIGFzIGEgc3BlY2lmaWMgdmFyaWFudCBvZiB0aGUgUlVQIGZyYW1ld29yayB0aGF0Ci0gIHlvdSB3YW50IHRvIHB1Ymxpc2ggYW5kIGRlcGxveSBmb3IgYSBnaXZlbiBzb2Z0d2FyZSBwcm9qZWN0IG9yIGFzIGEgZm91bmRhdGlvbgotICBmb3IgYSBkZXZlbG9wbWVudCBvcmdhbml6YXRpb24uIEFsbCBjb250ZW50IGFuZCBwcm9jZXNzZXMgaW4gRVBGIENvbXBvc2VyIGFyZSBvcmdhbml6ZWQKLSAgaW4gbWV0aG9kIHBsdWctaW5zLCB3aGljaCBhcmUgb3JnYW5pemVkIGludG8gbWV0aG9kIHBhY2thZ2VzLiBBIG1ldGhvZCBjb25maWd1cmF0aW9uCi0gIGlzIHNpbXBseSBhIHNlbGVjdGlvbiBvZiB0aGUgbWV0aG9kIHBsdWctaW5zIGFuZCBwYWNrYWdlcy48L3A+Ci08cD48aW1nIHNyYz0iY3NzL2NvbmYuZ2lmIj48L3A+Ci08cD5Zb3UgY3JlYXRlIGFuZCBzcGVjaWZ5IGEgY29uZmlndXJhdGlvbiB1c2luZyB0aGUgY29uZmlndXJhdGlvbiBlZGl0b3IgZGVwaWN0ZWQKLSAgaW4gdGhlIGZpZ3VyZSBhYm92ZS4gWW91IGNvdWxkIHN0YXJ0IGNyZWF0aW5nIHlvdXIgb3duIG1ldGhvZCBjb25maWd1cmF0aW9uCi0gIGJ5IGNvcHlpbmcgb25lIG9mIHRoZSBjb25maWd1cmF0aW9ucyB0aGF0IHNoaXAgd2l0aCBFUEYgQ29tcG9zZXIgYW5kIG1vZGlmeSBpdCB0byBmaXQKLSAgeW91ciBzcGVjaWZpYyBuZWVkcy4gWW91IGNhbiBhZGQgb3IgcmVtb3ZlIHdob2xlIG1ldGhvZCBwbHVnLWlucyBhcyB3ZWxsIGFzCi0gIG1ha2Ugc2VsZWN0aW9uIHdpdGggZWFjaCBwbHVnLWluIGJ5IGNoZWNraW5nIG9yIHVuLWNoZWNraW5nIHBhY2thZ2VzLiA8L3A+Ci08cD4gWW91IGNhbiB1c2UgdGhlIHJlc3VsdGluZyBjb25maWd1cmF0aW9uIGFzIHlvdXIgd29ya2luZyBzZXQgZm9yIHlvdXIgRVBGIENvbXBvc2VyCi0gIHdvcmsuIFRoZSBhY3R1YWwgY29udGVudCBvZiB0aGUgY29uZmlndXJhdGlvbiwgaS5lLiB0aGUgaW5jbHVkZWQgbWV0aG9kIGNvbnRlbnQKLSAgYW5kIHByb2Nlc3MgZWxlbWVudHMgYXJlIGFsd2F5cyBhY2Nlc3NpYmxlIGluIHRoZSBDb25maWd1cmF0aW9uIHZpZXcuIFVzZSB0aGUKLSAgY29tYm8gYm94IGluIHRoZSB0b29sYmFyIHRvIHNlbGVjdCB0aGUgY3VycmVudGx5IHVzZWQgbWV0aG9kIGNvbmZpZ3VyYXRpb24uPC9wPgotPGgzPlB1Ymxpc2hpbmcgT3ZlcnZpZXc8L2gzPgotPHA+TWV0aG9kIGNvbmZpZ3VyYXRpb25zIGFyZSB0aGUgYmFzaXMgZm9yIHB1Ymxpc2hpbmcgbWV0aG9kIGNvbnRlbnQgYW5kIHByb2Nlc3Nlcy4KLSAgQSBwdWJsaXNoZWQgY29uZmlndXJhdGlvbiBpcyBhbiBodG1sIFdlYiBzaXRlIHRoYXQgcHJlc2VudHMgYWxsIHRoZSBtZXRob2QKLSAgY29udGVudCBhbmQgcHJvY2Vzc2VzIG9mIHRoZSBtZXRob2QgY29uZmlndXJhdGlvbiBpbiBhIG5hdmlnYWJsZSBhbmQgc2VhcmNoYWJsZQotICB3YXkuIEl0IHVzZXMgdGhlIHJlbGF0aW9uc2hpcHMgZXN0YWJsaXNoZWQgZHVyaW5nIG1ldGhvZCBjb250ZW50IGFuZCBwcm9jZXNzCi0gIGF1dGhvcmluZyB0byBnZW5lcmF0ZSBoeXBlcmxpbmtzIGJldHdlZW4gZWxlbWVudHMgYXMgd2VsbCBhcyBwcm92aWRlcyB0cmVlCi0gIGJyb3dzZXJzIGJhc2VkIG9uIHRoZSBjb25maWd1cmF0aW9uIHZpZXcgYW5kIHVzZXItZGVmaW5lZCBjYXRlZ29yaXphdGlvbnMgb2YKLSAgdGhlIGNvbnRlbnQuIFRoZSBmaWd1cmUgYmVsb3cgc2hvd3MgYW4gZXhhbXBsZSBvZiB0aGUgcHVibGlzaGVkICdDbGFzc2ljIFJVUCcKLSAgbWV0aG9kIGNvbmZpZ3VyYXRpb24uPC9wPgotPHA+PGltZyBzcmM9ImNzcy9wdWIuZ2lmIj48L3A+Ci08cD5Gb3IgcHVibGlzaGluZyBzaW1wbHkgY3JlYXRlIGFuZCBzZWxlY3QgYSBjb25maWd1cmF0aW9uLiBUaGUgcHVibGljYXRpb24gd2l6YXJkCi0gIHdpbGwgZG8gdGhlIHJlc3QgZm9yIHlvdSBhbmQgb25seSBwdWJsaXNoIGNvbnRlbnQgdGhhdCBpcyBwYXJ0IG9mIHRoZSBtZXRob2QKLSAgY29uZmlndXJhdGlvbi4gSXQgd2lsbCBhbHNvIGF1dG9tYXRpY2FsbHkgYWRvcHQgY29udGVudCB0byB0aGUgY29uZmlndXJhdGlvbgotICBzdWNoIGFzIHJlbW92aW5nCi0gIHJlZmVyZW5jZXMgb2YgbWV0aG9kIGNvbnRlbnQgZWxlbWVudHMgdG8gZWxlbWVudHMgb3V0c2lkZSBvZiB0aGUgY29uZmlndXJhdGlvbgotICBvciByZW1vdmluZyBhY3Rpdml0aWVzIGZyb20geW91ciBwcm9jZXNzZXMgdGhhdCBvbmx5IGNvbnRhaW4gd29yayBkZWZpbmVkIG91dHNpZGUKLSAgb2YgdGhlIGNvbmZpZ3VyYXRpb24gc2V0LiBIZW5jZSwgcHVibGlzaGluZyB3aWxsIG9ubHkgaW5jbHVkZSB0aGUgY29udGVudCB0aGF0Ci0gIHlvdSByZWFsbHkgbmVlZC4gWW91IGNhbiBhbHdheXMgcHJldmlldyBhIHB1Ymxpc2hlZCBjb25maWd1cmF0aW9uIHVzaW5nIEVQRiBDb21wb3NlcidzCi1icm93c2luZyBwZXJzcGVjdGl2ZS48L3A+Ci08cD4mbmJzcDs8L3A+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL3Jvb3QuY3NzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9yb290LmNzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2UxZDQ4Zi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL3Jvb3QuY3NzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9yb290X3N3dC5wcm9wZXJ0aWVzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9yb290X3N3dC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NGVkNjk5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3Mvcm9vdF9zd3QucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotcm9vdC5saW5rcy1iYWNrZ3JvdW5kLnBhZ2UtbGlua3Mub3ZlcnZpZXcubGluay1pY29uID0gY3NzL2dyYXBoaWNzL2ljb25zL2V0b29sL292ZXJ2aWV3NzIuZ2lmCi1yb290LmxpbmtzLWJhY2tncm91bmQucGFnZS1saW5rcy5zdGVwcy5saW5rLWljb24gPSBjc3MvZ3JhcGhpY3MvaWNvbnMvZXRvb2wvZmlyc3RlcHM3Mi5naWYKLXJvb3QubGlua3MtYmFja2dyb3VuZC5wYWdlLWxpbmtzLnR1dG9yaWFscy5saW5rLWljb24gPSBjc3MvZ3JhcGhpY3MvaWNvbnMvZXRvb2wvdHV0b3JpYWxzNzIuZ2lmCi1yb290LmxpbmtzLWJhY2tncm91bmQucGFnZS1saW5rcy53ZWIubGluay1pY29uID0gY3NzL2dyYXBoaWNzL2ljb25zL2V0b29sL3dlYnJzcmM3Mi5naWYKLXJvb3QubGlua3MtYmFja2dyb3VuZC5wYWdlLWxpbmtzLnNhbXBsZXMubGluay1pY29uPSBjc3MvZ3JhcGhpY3MvaWNvbnMvZXRvb2wvc2FtcGxlczcyLmdpZgotcm9vdC5saW5rcy1iYWNrZ3JvdW5kLnBhZ2UtbGlua3MubmV3cy5saW5rLWljb24gPSBjc3MvZ3JhcGhpY3MvaWNvbnMvZXRvb2wvd2hhdHNuZXc3Mi5naWYKLXJvb3QuYWN0aW9uLWxpbmtzLndvcmtiZW5jaC5saW5rLWljb24gPSBjc3MvZ3JhcGhpY3MvaWNvbnMvZXRvb2wvd2I0OC5naWYKLQotcm9vdC5saW5rcy1iYWNrZ3JvdW5kLnBhZ2UtbGlua3Mub3ZlcnZpZXcuaG92ZXItaWNvbiA9IGNzcy9ncmFwaGljcy9pY29ucy9jdG9vbC9vdmVydmlldzcyLmdpZgotcm9vdC5saW5rcy1iYWNrZ3JvdW5kLnBhZ2UtbGlua3Muc3RlcHMuaG92ZXItaWNvbiA9IGNzcy9ncmFwaGljcy9pY29ucy9jdG9vbC9maXJzdGVwczcyLmdpZgotcm9vdC5saW5rcy1iYWNrZ3JvdW5kLnBhZ2UtbGlua3MudHV0b3JpYWxzLmhvdmVyLWljb24gPSBjc3MvZ3JhcGhpY3MvaWNvbnMvY3Rvb2wvdHV0b3JpYWxzNzIuZ2lmCi1yb290LmxpbmtzLWJhY2tncm91bmQucGFnZS1saW5rcy53ZWIuaG92ZXItaWNvbiA9IGNzcy9ncmFwaGljcy9pY29ucy9jdG9vbC93ZWJyc3JjNzIuZ2lmCi1yb290LmxpbmtzLWJhY2tncm91bmQucGFnZS1saW5rcy5zYW1wbGVzLmhvdmVyLWljb24gPSBjc3MvZ3JhcGhpY3MvaWNvbnMvY3Rvb2wvc2FtcGxlczcyLmdpZgotcm9vdC5saW5rcy1iYWNrZ3JvdW5kLnBhZ2UtbGlua3MubmV3cy5ob3Zlci1pY29uID0gY3NzL2dyYXBoaWNzL2ljb25zL2N0b29sL3doYXRzbmV3NzIuZ2lmCi1yb290LmFjdGlvbi1saW5rcy53b3JrYmVuY2guaG92ZXItaWNvbiA9IGNzcy9ncmFwaGljcy9pY29ucy9jdG9vbC93YjQ4LmdpZgotCi0KLXJvb3QubGlua3MtYmFja2dyb3VuZC5wYWdlLWxpbmtzLm92ZXJ2aWV3LnNtYWxsLWxpbmstaWNvbiA9IGNzcy9ncmFwaGljcy9pY29ucy9ldG9vbC9vdmVydmlldzQ4LmdpZgotcm9vdC5saW5rcy1iYWNrZ3JvdW5kLnBhZ2UtbGlua3Muc3RlcHMuc21hbGwtbGluay1pY29uID0gY3NzL2dyYXBoaWNzL2ljb25zL2V0b29sL2ZpcnN0ZXBzNDguZ2lmCi1yb290LmxpbmtzLWJhY2tncm91bmQucGFnZS1saW5rcy50dXRvcmlhbHMuc21hbGwtbGluay1pY29uID0gY3NzL2dyYXBoaWNzL2ljb25zL2V0b29sL3R1dG9yaWFsczQ4LmdpZgotcm9vdC5saW5rcy1iYWNrZ3JvdW5kLnBhZ2UtbGlua3Mud2ViLnNtYWxsLWxpbmstaWNvbiA9IGNzcy9ncmFwaGljcy9pY29ucy9ldG9vbC93ZWJyc3JjNDguZ2lmCi1yb290LmxpbmtzLWJhY2tncm91bmQucGFnZS1saW5rcy5zYW1wbGVzLnNtYWxsLWxpbmstaWNvbiA9IGNzcy9ncmFwaGljcy9pY29ucy9ldG9vbC9zYW1wbGVzNDguZ2lmCi1yb290LmxpbmtzLWJhY2tncm91bmQucGFnZS1saW5rcy5uZXdzLnNtYWxsLWxpbmstaWNvbiA9IGNzcy9ncmFwaGljcy9pY29ucy9ldG9vbC93aGF0c25ldzQ4LmdpZgotcm9vdC5hY3Rpb24tbGlua3Mud29ya2JlbmNoLnNtYWxsLWxpbmstaWNvbiA9IGNzcy9ncmFwaGljcy9pY29ucy9ldG9vbC93YjQ4LmdpZgotCi1yb290LmxpbmtzLWJhY2tncm91bmQucGFnZS1saW5rcy5vdmVydmlldy5zbWFsbC1ob3Zlci1pY29uID0gY3NzL2dyYXBoaWNzL2ljb25zL2N0b29sL292ZXJ2aWV3NDguZ2lmCi1yb290LmxpbmtzLWJhY2tncm91bmQucGFnZS1saW5rcy5zdGVwcy5zbWFsbC1ob3Zlci1pY29uID0gY3NzL2dyYXBoaWNzL2ljb25zL2N0b29sL2ZpcnN0ZXBzNDguZ2lmCi1yb290LmxpbmtzLWJhY2tncm91bmQucGFnZS1saW5rcy50dXRvcmlhbHMuc21hbGwtaG92ZXItaWNvbiA9IGNzcy9ncmFwaGljcy9pY29ucy9jdG9vbC90dXRvcmlhbHM0OC5naWYKLXJvb3QubGlua3MtYmFja2dyb3VuZC5wYWdlLWxpbmtzLndlYi5zbWFsbC1ob3Zlci1pY29uID0gY3NzL2dyYXBoaWNzL2ljb25zL2N0b29sL3dlYnJzcmM0OC5naWYKLXJvb3QubGlua3MtYmFja2dyb3VuZC5wYWdlLWxpbmtzLnNhbXBsZXMuc21hbGwtaG92ZXItaWNvbiA9IGNzcy9ncmFwaGljcy9pY29ucy9jdG9vbC9zYW1wbGVzNDguZ2lmCi1yb290LmxpbmtzLWJhY2tncm91bmQucGFnZS1saW5rcy5uZXdzLnNtYWxsLWhvdmVyLWljb24gPSBjc3MvZ3JhcGhpY3MvaWNvbnMvY3Rvb2wvd2hhdHNuZXc0OC5naWYKLXJvb3QuYWN0aW9uLWxpbmtzLndvcmtiZW5jaC5zbWFsbC1ob3Zlci1pY29uID0gY3NzL2dyYXBoaWNzL2ljb25zL2N0b29sL3diNDguZ2lmCi0KLXJvb3QubGF5b3V0Lm5jb2x1bW5zID0gMQotcm9vdC5saW5rcy1iYWNrZ3JvdW5kLnBhZ2UtbGlua3MubGF5b3V0LmhzcGFjaW5nID0gNDAKLXJvb3QubGF5b3V0LnZzcGFjaW5nID0gMzUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3Mvc2FtcGxlcy9zYW1wbGVzLmNzcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3Mvc2FtcGxlcy9zYW1wbGVzLmNzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTExMjY3My4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL3NhbXBsZXMvc2FtcGxlcy5jc3MKKysrIC9kZXYvbnVsbApAQCAtMSwxMDYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqLwotCi1ib2R5IHsKLQliYWNrZ3JvdW5kLWltYWdlIDogdXJsKC4uL2dyYXBoaWNzL2NvbnRlbnRwYWdlL3NhbXBsZXNfd3RyLmpwZyk7Ci19Ci0KLS5wYWdlIHsgbWluLWhlaWdodCA6IDcwMHB4OyB9Ci0KLS8qIHNob3cgdGhlICJzZWxlY3RlZCIgaW1hZ2UgZm9yIHRoaXMgcGFnZSAqLwotI25hdmlnYXRpb24tbGlua3MgYSNzYW1wbGVzIGltZywgI25hdmlnYXRpb24tbGlua3MgYSNzYW1wbGVzOmhvdmVyIGltZyB7IGJhY2tncm91bmQtaW1hZ2UgOiB1cmwoLi4vZ3JhcGhpY3MvaWNvbnMvY3Rvb2wvc2FtcGxlczQ4c2VsLmdpZik7IH0KLQotLyogTGF5IG91dCB0aGUgcmVhbCBjb250ZW50IG9mIHRoZSBzYW1wbGVzIHBhZ2U6ICovCi0KLS5zYW1wbGVzLWdyb3VwIHsKLQl3aWR0aCA6IDc1MHB4OwotCS8qIFRvIGNlbnRlciBpbiBNb3ogKGhhdmUgdG8gdXNlIHRleHQtYWxpZ24gZm9yIElFKSAqLwkKLQltYXJnaW4gOiAwcHggYXV0bzsKLQltYXJnaW4tYm90dG9tIDogMTBweDsKLQl0ZXh0LWFsaWduIDogbGVmdDsKLQlmbG9hdCA6IG5vbmU7Ci0JY2xlYXIgOiBib3RoOwotfQotCi0uc2FtcGxlcy1ncm91cCBINCB7IG1hcmdpbi10b3AgOiAxMHB4OyB9Ci0KLS5zYW1wbGUtbGluayB7IAotCXdpZHRoIDogMzYwcHg7Ci0JdGV4dC1hbGlnbiA6IGxlZnQ7IAotCW1hcmdpbi1sZWZ0IDogNXB4OwotCW1hcmdpbi1yaWdodCA6IDVweDsKLQltYXJnaW4tdG9wIDogMTBweDsKLQltYXJnaW4tYm90dG9tIDogLTMwcHg7Ci0JdmVydGljYWwtYWxpZ24gOiB0b3A7Ci19Ci0KLS8qIHNwZWNpYWxpemUgdGhlIHN3dCBzYW1wbGVzIGdyb3VwIHRvIGJlIHNwcmVhZCBvdmVyIG9ubHkgMSBjb2x1bW4gKi8KLSNzd3QgLnNhbXBsZS1saW5rIHsgCi0Jd2lkdGggOiA3MjBweDsKLX0KLQotLnNhbXBsZXMtZ3JvdXAgPiAuc2FtcGxlLWxpbmsgewotCWZsb2F0IDogbGVmdDsKLQloZWlnaHQgOiAxNTBweDsKLQl2ZXJ0aWNhbC1hbGlnbiA6IG1pZGRsZTsKLX0KLQotCi0uc2FtcGxlLWxpbmsgLmxpbmstbGFiZWwgewotCWRpc3BsYXkgOiBibG9jazsKLQl3aWR0aCA6IDMwMHB4OwotCXBvc2l0aW9uIDogcmVsYXRpdmU7Ci0JdG9wIDogLTUwcHg7Ci0JbGVmdCA6IDYwcHg7Ci19Ci0KLSNzd3QgLnNhbXBsZS1saW5rIC5saW5rLWxhYmVsIHsKLQl3aWR0aCA6IDYwMHB4OwkKLX0gCi0KLS5zYW1wbGUtbGluayBwIC50ZXh0IHsKLQlkaXNwbGF5IDogYmxvY2s7Ci0Jd2lkdGggOiAzMDBweDsKLQlwb3NpdGlvbiA6IHJlbGF0aXZlOwotCXRvcCA6IC00NXB4OwotCWxlZnQgOiA1M3B4OwotfQotCi0jc3d0IC5zYW1wbGUtbGluayAudGV4dCB7Ci0Jd2lkdGggOiA2MjBweDsJCi19IAotCi0uc2FtcGxlLWxpbmsgaW1nIHsKLQloZWlnaHQgOiA1NnB4OwotCXdpZHRoIDogNTZweDsKLQl2ZXJ0aWNhbC1hbGlnbiA6IG1pZGRsZTsKLX0KLQotLnNhbXBsZS1saW5rOmhvdmVyIHsgYm9yZGVyLXJpZ2h0IDogMHB4OyB9Ci0KLQotI3N3dCAuc2FtcGxlLWxpbmsgaW1nIHsKLQliYWNrZ3JvdW5kLWltYWdlIDogdXJsKC4uL2dyYXBoaWNzL2ljb25zL29iajQ4L3NhbXBsZXJlZF9vYmouZ2lmKTsKLX0KLQotI3N3dCAuc2FtcGxlLWxpbms6aG92ZXIgaW1nIHsKLQliYWNrZ3JvdW5kLWltYWdlIDogdXJsKC4uL2dyYXBoaWNzL2ljb25zL29iajQ4L3NhbXBsZXJlZGhvdl9vYmouZ2lmKTsKLX0KLQotI3dvcmtiZW5jaCAuc2FtcGxlLWxpbmsgaW1nIHsKLQliYWNrZ3JvdW5kLWltYWdlIDogdXJsKC4uL2dyYXBoaWNzL2ljb25zL29iajQ4L3NhbXBsZXB1cnBfb2JqLmdpZik7Ci19Ci0KLSN3b3JrYmVuY2ggLnNhbXBsZS1saW5rOmhvdmVyIGltZyB7Ci0JYmFja2dyb3VuZC1pbWFnZSA6IHVybCguLi9ncmFwaGljcy9pY29ucy9vYmo0OC9zYW1wbGVwdXJwaG92X29iai5naWYpOwotfQotCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL3NhbXBsZXMvc3d0LnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL3NhbXBsZXMvc3d0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkNDAwMjAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9zYW1wbGVzL3N3dC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0KLXNhbXBsZXMubGluay1pY29uID0gY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L3NhbXBsZXB1cnBfb2JqLmdpZgotc2FtcGxlcy5wYWdlLWNvbnRlbnQuc3d0LnN3dC1leGFtcGxlcy5saW5rLWljb24gPSBjc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvc2FtcGxlcmVkX29iai5naWYKLQotc2FtcGxlcy5wYWdlLWNvbnRlbnQubGF5b3V0LnZzcGFjaW5nID0gNDAKLXNhbXBsZXMucGFnZS1jb250ZW50LnN3dC5sYXlvdXQubmNvbHVtbnMgPSAyCi1zYW1wbGVzLnBhZ2UtY29udGVudC5zd3QubGF5b3V0LnZzcGFjaW5nID0gMzAKLXNhbXBsZXMucGFnZS1jb250ZW50LnN3dC5sYXlvdXQuaHNwYWNpbmcgPSAzMAotc2FtcGxlcy5wYWdlLWNvbnRlbnQud29ya2JlbmNoLmxheW91dC5uY29sdW1ucyA9IDIKLXNhbXBsZXMucGFnZS1jb250ZW50LndvcmtiZW5jaC5sYXlvdXQudnNwYWNpbmcgPSAzMAotc2FtcGxlcy5wYWdlLWNvbnRlbnQud29ya2JlbmNoLmxheW91dC5oc3BhY2luZyA9IDMwCi0KLWRlc2NyaXB0aW9uLXN0eWxlLWlkID0gZ3JvdXAtZGVzY3JpcHRpb24KLXNhbXBsZXMuc3VidGl0bGUtaWQgPSBzYW1wbGVzL3BhZ2UtY29udGVudC9wYWdlLXRpdGxlCi1zYW1wbGVzLmRlc2NyaXB0aW9uLWlkID0gc2FtcGxlcy9wYWdlLWNvbnRlbnQvcGFnZS1kZXNjcmlwdGlvbgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3Mvc2hhcmVkLmNzcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3Mvc2hhcmVkLmNzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGUzYzZhNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL3NoYXJlZC5jc3MKKysrIC9kZXYvbnVsbApAQCAtMSw1NTAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqLwotCi0vKiAKLSAqIFNldCB1cCBnZW5lcmFsIGZvbnRzLCBzaXplcyBhbmQgY29sb3JzIAotICovCi1ib2R5IHsgZm9udC1mYW1pbHkgOiBBcmlhbCwgc2Fucy1zZXJpZjsgfQotCi1IMSwgSDIsIEgzLCBINCwgcCwgYSB7IGNvbG9yIDogIzRENEQ0RDsgfQotCi0uaW50cm8taGVhZGVyIEgxIHsKLQlmb250LXNpemUgOiAxNnB0OwotCWZvbnQtd2VpZ2h0IDogbm9ybWFsOwotCWNvbG9yIDogI0U1RTVFNTsKLX0KLQotaDIgewotCWZvbnQtc2l6ZSA6IDEzcHQ7Ci0JZm9udC13ZWlnaHQgOiBub3JtYWw7Ci0JY29sb3IgOiAjN0I4Njk0OwotfQotCi0ucGFnZS10aXRsZSB7Ci0JZm9udC1zaXplIDogMTRwdDsKLQlmb250LXdlaWdodCA6IG5vcm1hbDsKLQljb2xvciA6ICM4Qzk2QTI7Ci0JZmxvYXQgOiBub25lOwotCWNsZWFyIDogYm90aDsKLX0KLQotLnBhZ2UtZGVzY3JpcHRpb24geyAKLQlmb250LXNpemUgOiAxMHB0OwotCWZsb2F0IDogbm9uZTsKLQljbGVhciA6IGJvdGg7Ci19Ci0KLUg0IC5kaXYtbGFiZWwgewotCWZvbnQtc2l6ZSA6IDEwcHQ7Ci0JZm9udC13ZWlnaHQgOiBib2xkOwotfQotCi1hIHsKLQlmb250LXdlaWdodCA6IGJvbGQ7Ci0JdGV4dC1kZWNvcmF0aW9uIDogbm9uZTsKLQljb2xvciA6ICM0RDRENEQ7Ci19Ci0KLWEgLmxpbmstbGFiZWwgewotCWZvbnQtc2l6ZSA6IDEwcHQ7Ci0JZm9udC13ZWlnaHQgOiBub3JtYWw7Ci19Ci0KLSNuYXZpZ2F0aW9uLWxpbmtzIGEgLmxpbmstbGFiZWwgewotCWZvbnQtc2l6ZSA6IDlwdDsKLQlmb250LXdlaWdodCA6IG5vcm1hbDsKLQljb2xvciA6ICNFNUU1RTU7Ci19Ci0KLWEgLnRleHQgewotCWZvbnQtc2l6ZSA6IDhwdDsKLQlmb250LXdlaWdodCA6IG5vcm1hbDsKLX0KLQotcCAuZ3JvdXAtZGVzY3JpcHRpb24gewotCWZvbnQtc2l6ZSA6IDEwcHQ7Ci0JZm9udC13ZWlnaHQgOiBub3JtYWw7Ci19Ci0KLQotLyogCi0gKiBTZXQgdXAgb3RoZXIgZ2VuZXJhbCBwcm9wZXJ0aWVzIGxpa2UgcGFkZGluZy9tYXJnaW5zCi0gKi8KLWh0bWwsIGJvZHkgeyB3aWR0aCA6IDEwMCU7IGhlaWdodCA6IDEwMCU7IH0KLQotaHRtbCwgYm9keSwgZGl2LCBoMSwgaDQsIHAsIGEgeyBtYXJnaW4gOiAwcHg7IHBhZGRpbmcgOiAwcHg7IH0KLQotLmludHJvLWhlYWRlciBIMSB7IHBhZGRpbmctdG9wIDogMTBweDsgbWFyZ2luLWxlZnQgOiAxMHB4OyB9Ci0KLS8qIEZvciByZWd1bGFyIGRpdiBsYWJlbHMgKi8KLSNwYWdlLWNvbnRlbnQgZGl2IEg0IHsKLQlwYWRkaW5nIDogMTBweDsKLQltYXJnaW4tYm90dG9tIDogNXB4OwotfQotCi0vKiBGb3IgdGhlIG1haW4gcGFnZSBjb250ZW50J3MgZGl2IGxhYmVsICovCi0jcGFnZS1jb250ZW50ICNjb250ZW50LWhlYWRlciBINCB7Ci0JcGFkZGluZy1ib3R0b20gOiAxMHB4OwotCXBhZGRpbmctdG9wIDogMHB4OwotfQotCi0vKiBzcGVjaWFsIGNhc2UgZm9yIE1vemlsbGEncyBtYWluIGNvbnRlbnQtaGVhZGVyIGxhYmVsLgotICAgTW96aWxsYSAxLjQgbmVlZHMgbW9yZSByb29tIGF0IHRoZSB0b3AgKi8KLSNwYWdlLWNvbnRlbnQgPiAjY29udGVudC1oZWFkZXIgSDQgeyBwYWRkaW5nLXRvcCA6IDEwcHg7IH0KLQotLyogTmVlZGVkIGluIElFIHRvIGdldCBzaGlmdCt0YWIgdG8gc2hvdyB0aGUgYWN0aXZlIGltYWdlIHByb3Blcmx5ICovCi1hOmFjdGl2ZSB7Ci0JYm9yZGVyIDogc29saWQgMHB4OwotfQotCi1hIGltZyB7Ci0JYm9yZGVyLXdpZHRoIDogMDsKLQliYWNrZ3JvdW5kLXJlcGVhdCA6IG5vLXJlcGVhdDsKLX0KLQotLyoKLSAqIHRvIGdldCBzY3JvbGxiYXJzIHdvcmtpbmcgaW4gYm90aCBJRSBhbmQgTW96aWxsYQotICovCi1odG1sLGJvZHkgeyBvdmVyZmxvdzogYXV0bzsgfQotaHRtbD5ib2R5IHsgb3ZlcmZsb3c6IHZpc2libGU7IH0KLQotLyoKLSAqIFNldCB1cCB0aGUgYm9keSwgZGVjb3JhdGl2ZSBiYWNrZ3JvdW5kLCBhbmQgbmF2aWdhdGlvbiBmb3IgdGhlIGNvbnRlbnQgCi0gKiBwYWdlcy4gCi0gKiBOb3RlOiB0aGUgcm9vdCBwYWdlIGhhbmRsZXMgaXRzIG93biBiYWNrZ3JvdW5kIGFuZCBuYXZpZ2F0aW9uOyB0aGVzZQotICogc2V0dGluZ3MgcHJpbWFyaWx5IGFwcGx5IHRvIHRoZSBjb250ZW50IHBhZ2VzCi0gKi8KLWJvZHkgewotCWJhY2tncm91bmQtY29sb3IgOiAjRkZGRkZGOwotCWJhY2tncm91bmQtcmVwZWF0IDogbm8tcmVwZWF0OwotCWJhY2tncm91bmQtcG9zaXRpb24gOiBib3R0b20gcmlnaHQ7Ci0JYmFja2dyb3VuZC1hdHRhY2htZW50IDogZml4ZWQ7Ci19Ci0KLSNiYWNrZ3JvdW5kLWltYWdlIHsKLQl3aWR0aCA6IDEwMCU7Ci0JaGVpZ2h0IDogMTY0cHg7Ci0JYmFja2dyb3VuZC1pbWFnZSA6IHVybChncmFwaGljcy9jb250ZW50cGFnZS9iYWNrZ3JvdW5kLmpwZyk7Ci0JYmFja2dyb3VuZC1yZXBlYXQgOiBuby1yZXBlYXQ7Ci0JYmFja2dyb3VuZC1wb3NpdGlvbiA6IHRvcCBsZWZ0OwkKLQlwb3NpdGlvbiA6IGFic29sdXRlOwotCXRvcCA6IDBweDsKLQl6LWluZGV4IDogLTEwMDsKLX0KLQotI2N1cnZlLWltYWdlIHsgCi0Jd2lkdGggOiAxMDAlOwotCWhlaWdodCA6IDE2NHB4OwotCXBvc2l0aW9uIDogYWJzb2x1dGU7Ci0JdG9wIDogMHB4OwotCWJhY2tncm91bmQtaW1hZ2UgOiB1cmwoZ3JhcGhpY3MvY29udGVudHBhZ2UvYmFja2dyb3VuZC5naWYpOwotCWJhY2tncm91bmQtcmVwZWF0IDogbm8tcmVwZWF0OwotCWJhY2tncm91bmQtcG9zaXRpb24gOiB0b3AgY2VudGVyOwotCW1hcmdpbiA6IDA7Ci0JcGFkZGluZyA6IDA7Ci19Ci0KLS5pbnRyby1oZWFkZXIgewliYWNrZ3JvdW5kLWNvbG9yIDogdHJhbnNwYXJlbnQ7IHotaW5kZXggOiAxMDA7fQotCi1ib2R5LCAucGFnZXsKLQltaW4td2lkdGggOiA3NzBweDsKLQkvKiBzaW5jZSBJRSBkb2Vzbid0IHN1cHBvcnQgbWluLXdpZHRoLCB0cnkgZXhwcmVzc2lvbiAqLwotCXdpZHRoOmV4cHJlc3Npb24oZG9jdW1lbnQuYm9keS5jbGllbnRXaWR0aCA8IDc3MD8gIjc3MHB4IjogImF1dG8iICk7Ci0JbWluLWhlaWdodCA6IDQyNXB4OwotCWhlaWdodCA6IDEwMCU7Ci0JaGVpZ2h0IDogZXhwcmVzc2lvbihkb2N1bWVudC5ib2R5LmNsaWVudEhlaWdodCA8IDQyNT8gIjQyNXB4IjogIjEwMCUiICk7Ci19Ci0KLS5wYWdlIHsgCi0JbWluLWhlaWdodCA6IDQ3NXB4OwotCWJhY2tncm91bmQtaW1hZ2UgOiB1cmwoZ3JhcGhpY3MvY29udGVudHBhZ2UvYmFja2dyb3VuZC5qcGcpOwotCWJhY2tncm91bmQtcmVwZWF0IDogcmVwZWF0LXg7Ci0JYmFja2dyb3VuZC1wb3NpdGlvbiA6IHRvcCBsZWZ0OwotfQotCi0jcGFnZS1jb250ZW50IHsKLQliYWNrZ3JvdW5kLXJlcGVhdCA6IG5vLXJlcGVhdDsKLQliYWNrZ3JvdW5kLXBvc2l0aW9uIDogYm90dG9tIHJpZ2h0OwotCWhlaWdodCA6IDcwJTsKLX0KLQotLyogCi0gKiBMYXkgb3V0IHRoZSBuYXZpZ2F0aW9uIGxpbmtzIAotICogKFJvb3QgcGFnZSBkb2VzIHNvbWV0aGluZyBzaW1pbGFyIGZvciBpdHMgbmF2aWdhdGlvbikKLSAqLwotI25hdmlnYXRpb24tbGlua3MgewotCXBvc2l0aW9uIDogcmVsYXRpdmU7Ci0JbGVmdCA6IDEwcHg7Ci0JdG9wIDogNXB4OwotCWhlaWdodCA6IDYwOwotCXdpZHRoIDogOTglOwotfQotCi0KLSNuYXZpZ2F0aW9uLWxpbmtzIGEgewotCXBhZGRpbmctbGVmdCA6IDVweDsKLQlwYWRkaW5nLXJpZ2h0IDogNXB4OwotCWZsb2F0IDogbGVmdDsKLQl0ZXh0LWFsaWduIDogY2VudGVyOwotfQotCi0jbmF2aWdhdGlvbi1saW5rcyBhIGltZyB7Ci0JaGVpZ2h0IDogNTJweDsKLQl3aWR0aCA6IDUycHg7Ci0JdmVydGljYWwtYWxpZ24gOiBtaWRkbGU7Ci19Ci0KLSNuYXZpZ2F0aW9uLWxpbmtzIGEgLmxpbmstbGFiZWwgeyBkaXNwbGF5IDogYmxvY2s7IG1hcmdpbi10b3AgOiA1cHg7fQotCi0jbmF2aWdhdGlvbi1saW5rcyBhIC50ZXh0IHsgZGlzcGxheSA6IG5vbmU7IH0KLQotI25hdmlnYXRpb24tbGlua3MgYTpob3ZlciwgCi0jbmF2aWdhdGlvbi1saW5rcyBhOmZvY3VzIAotI25hdmlnYXRpb24tbGlua3MgYTphY3RpdmUgeyBib3JkZXItcmlnaHQgOiAwcHg7fQotCi0vKiBwcm9wZXJ0aWVzIGZvciBlYWNoIG9mIHRoZSBuYXZpZ2F0aW9uLWxpbmtzICAqLwotI25hdmlnYXRpb24tbGlua3MgYSNvdmVydmlldyBpbWcgeyBiYWNrZ3JvdW5kLWltYWdlIDogdXJsKGdyYXBoaWNzL2ljb25zL2V0b29sL292ZXJ2aWV3NDguZ2lmKTsgfQotI25hdmlnYXRpb24tbGlua3MgYSNvdmVydmlldzpob3ZlciBpbWcsCi0jbmF2aWdhdGlvbi1saW5rcyBhI292ZXJ2aWV3OmZvY3VzIGltZywKLSNuYXZpZ2F0aW9uLWxpbmtzIGEjb3ZlcnZpZXc6YWN0aXZlIGltZyB7IGJhY2tncm91bmQtaW1hZ2UgOiB1cmwoZ3JhcGhpY3MvaWNvbnMvY3Rvb2wvb3ZlcnZpZXc0OC5naWYpOyB9Ci0vKiNuYXZpZ2F0aW9uLWxpbmtzIGEjb3ZlcnZpZXc6YWN0aXZlIGltZyB7IGJhY2tncm91bmQtaW1hZ2UgOiB1cmwoZ3JhcGhpY3MvaWNvbnMvY3Rvb2wvb3ZlcnZpZXc0OHNlbC5naWYpOyB9Ki8KLQotI25hdmlnYXRpb24tbGlua3MgYSN0dXRvcmlhbHMgaW1nIHsgYmFja2dyb3VuZC1pbWFnZSA6IHVybChncmFwaGljcy9pY29ucy9ldG9vbC90dXRvcmlhbHM0OC5naWYpOyB9Ci0jbmF2aWdhdGlvbi1saW5rcyBhI3R1dG9yaWFsczpob3ZlciBpbWcsCi0jbmF2aWdhdGlvbi1saW5rcyBhI3R1dG9yaWFsczphY3RpdmUgaW1nLAotI25hdmlnYXRpb24tbGlua3MgYSN0dXRvcmlhbHM6Zm9jdXMgaW1nIHsgYmFja2dyb3VuZC1pbWFnZSA6IHVybChncmFwaGljcy9pY29ucy9jdG9vbC90dXRvcmlhbHM0OC5naWYpOyB9Ci0vKiNuYXZpZ2F0aW9uLWxpbmtzIGEjdHV0b3JpYWxzOmFjdGl2ZSBpbWcgeyBiYWNrZ3JvdW5kLWltYWdlIDogdXJsKGdyYXBoaWNzL2ljb25zL2N0b29sL3R1dG9yaWFsczQ4c2VsLmdpZik7IH0qLwotCi0jbmF2aWdhdGlvbi1saW5rcyBhI3NhbXBsZXMgaW1nIHsgYmFja2dyb3VuZC1pbWFnZSA6IHVybChncmFwaGljcy9pY29ucy9ldG9vbC9zYW1wbGVzNDguZ2lmKTsgfQotI25hdmlnYXRpb24tbGlua3MgYSNzYW1wbGVzOmhvdmVyIGltZywKLSNuYXZpZ2F0aW9uLWxpbmtzIGEjc2FtcGxlczphY3RpdmUgaW1nLAotI25hdmlnYXRpb24tbGlua3MgYSNzYW1wbGVzOmZvY3VzIGltZyB7IGJhY2tncm91bmQtaW1hZ2UgOiB1cmwoZ3JhcGhpY3MvaWNvbnMvY3Rvb2wvc2FtcGxlczQ4LmdpZik7IH0KLS8qI25hdmlnYXRpb24tbGlua3MgYSNzYW1wbGVzOmFjdGl2ZSBpbWcgeyBiYWNrZ3JvdW5kLWltYWdlIDogdXJsKGdyYXBoaWNzL2ljb25zL2N0b29sL3NhbXBsZXM0OHNlbC5naWYpOyB9Ki8KLQotI25hdmlnYXRpb24tbGlua3MgYSNuZXdzIGltZyB7IGJhY2tncm91bmQtaW1hZ2UgOiB1cmwoZ3JhcGhpY3MvaWNvbnMvZXRvb2wvcmV0dXNlcjQ4LmdpZik7IH0KLSNuYXZpZ2F0aW9uLWxpbmtzIGEjbmV3czpob3ZlciBpbWcgeyBiYWNrZ3JvdW5kLWltYWdlIDogdXJsKGdyYXBoaWNzL2ljb25zL2N0b29sL3JldHVzZXI0OC5naWYpOyB9Ci0jbmF2aWdhdGlvbi1saW5rcyBhI25ld3M6YWN0aXZlIGltZyB7IGJhY2tncm91bmQtaW1hZ2UgOiB1cmwoZ3JhcGhpY3MvaWNvbnMvY3Rvb2wvcmV0dXNlcjQ4c2VsLmdpZik7IH0KLQotI25hdmlnYXRpb24tbGlua3MgYSN3ZWIgaW1nIHsgYmFja2dyb3VuZC1pbWFnZSA6IHVybChncmFwaGljcy9pY29ucy9ldG9vbC93ZWJyc3JjNDguZ2lmKTsgfQotI25hdmlnYXRpb24tbGlua3MgYSN3ZWI6aG92ZXIgaW1nIHsgYmFja2dyb3VuZC1pbWFnZSA6IHVybChncmFwaGljcy9pY29ucy9jdG9vbC93ZWJyc3JjNDguZ2lmKTsgfQotI25hdmlnYXRpb24tbGlua3MgYSN3ZWI6YWN0aXZlIGltZyB7IGJhY2tncm91bmQtaW1hZ2UgOiB1cmwoZ3JhcGhpY3MvaWNvbnMvY3Rvb2wvd2VicnNyYzQ4c2VsLmdpZik7IH0KLQotI25hdmlnYXRpb24tbGlua3MgYSNzdGVwcyBpbWcgeyBiYWNrZ3JvdW5kLWltYWdlIDogdXJsKGdyYXBoaWNzL2ljb25zL2V0b29sL2ZpcnN0ZXBzNDguZ2lmKTsgfQotI25hdmlnYXRpb24tbGlua3MgYSNzdGVwczpob3ZlciBpbWcgeyBiYWNrZ3JvdW5kLWltYWdlIDogdXJsKGdyYXBoaWNzL2ljb25zL2N0b29sL2ZpcnN0ZXBzNDguZ2lmKTsgfQotI25hdmlnYXRpb24tbGlua3MgYSNzdGVwczphY3RpdmUgaW1nIHsgYmFja2dyb3VuZC1pbWFnZSA6IHVybChncmFwaGljcy9pY29ucy9jdG9vbC9maXJzdGVwczQ4c2VsLmdpZik7IH0KLQotI25hdmlnYXRpb24tbGlua3MgYSN3b3JrYmVuY2ggeyBwb3NpdGlvbiA6IGFic29sdXRlOyAgcmlnaHQgOiAwcHg7IHRvcCA6IC0zNXB4OyB0ZXh0LWFsaWduIDogcmlnaHQ7fQotI25hdmlnYXRpb24tbGlua3MgYSN3b3JrYmVuY2ggLmxpbmstbGFiZWwgeyB2aXNpYmlsaXR5IDogaGlkZGVuOyB9Ci0jbmF2aWdhdGlvbi1saW5rcyBhI3dvcmtiZW5jaDpob3ZlciAubGluay1sYWJlbCB7IHZpc2liaWxpdHkgOiB2aXNpYmxlOyB9Ci0jbmF2aWdhdGlvbi1saW5rcyBhI3dvcmtiZW5jaCAudGV4dCB7IGRpc3BsYXkgOiBub25lOyB9Ci0jbmF2aWdhdGlvbi1saW5rcyBhI3dvcmtiZW5jaCBpbWcgeyBiYWNrZ3JvdW5kLWltYWdlIDogdXJsKGdyYXBoaWNzL2ljb25zL2V0b29sL3diNDguZ2lmKTsgd2lkdGggOiA1M3B4OyBoZWlnaHQgOiA1M3B4O30KLSNuYXZpZ2F0aW9uLWxpbmtzIGEjd29ya2JlbmNoOmhvdmVyIGltZywKLSNuYXZpZ2F0aW9uLWxpbmtzIGEjd29ya2JlbmNoOmZvY3VzIGltZywKLSNuYXZpZ2F0aW9uLWxpbmtzIGEjd29ya2JlbmNoOmFjdGl2ZSBpbWcgeyBiYWNrZ3JvdW5kLWltYWdlIDogdXJsKGdyYXBoaWNzL2ljb25zL2N0b29sL3diNDguZ2lmKTsgfQotCi0vKiAKLSAqIExheSBvdXQgdGhlIHBhZ2UgdGl0bGUgYW5kIGRlc2NyaXB0aW9uIAotICovCi1oMSwgcCB7IG1hcmdpbi1sZWZ0IDogMTBweDsgfSAvKiByZXF1aXJlZCBpbiBtb3ppbGxhIHNvIHRoZSBwYWdlIGRlc2NyaXB0aW9uIGlzIHByb3Blcmx5IGluZGVudGVkICovCi0KLS8qIHBvc2l0aW9uIHRoZSBwYWdlIGNvbnRlbnQgc28gdGhhdCB0aGUgcGFnZSB0aXRsZSBvdmVybGF5cyB0aGUgYm90dG9tCi0gKiBvZiB0aGUgYmFja2dyb3VuZCBpbWFnZSwgYnV0IG1ha2Ugc3VyZSB0aGUgY29udGVudCBpcyBhbHdheXMgb24gdG9wIAotICogKHVzaW5nIHotaW5kZXgpICovCi0jcGFnZS1jb250ZW50IHsKLQlmbG9hdCA6IG5vbmU7Ci0JY2xlYXIgOiBib3RoOwotCXRleHQtYWxpZ24gOiBjZW50ZXI7Ci0JbWFyZ2luLXRvcCA6IDM1cHg7Ci19Ci0KLS5wYWdlID4gI3BhZ2UtY29udGVudCB7IG1hcmdpbi10b3AgOiA1MHB4OyB9Ci0KLSNwYWdlLWNvbnRlbnQgcCB7IAotCXBhZGRpbmctYm90dG9tIDogMTVweDsgCi0JdGV4dC1hbGlnbiA6IGxlZnQ7IAotCWZsb2F0IDogbm9uZTsKLQljbGVhciA6IGJvdGg7Ci19Ci0KLSNwYWdlLWNvbnRlbnQgI2NvbnRlbnQtaGVhZGVyIEg0LCAucGFnZS1kZXNjcmlwdGlvbiB7Ci0JdGV4dC1hbGlnbiA6IGxlZnQ7Ci0JbWFyZ2luLXJpZ2h0IDogMTBweDsKLQlmbG9hdCA6IG5vbmU7Ci0JY2xlYXIgOiBib3RoOwotfQotCi0ucGFnZS1kZXNjcmlwdGlvbiB7Ci0JdGV4dC1hbGlnbiA6IGxlZnQ7Ci0JbWFyZ2luLXJpZ2h0IDogMTBweDsKLQlmbG9hdCA6IG5vbmU7Ci0JY2xlYXIgOiBib3RoOwotfQotCi0vKgotICogTmF2aWdhdGlvbiBMaW5rcyAoYmFjaywgZm9yd2FyZCBhbmQgaG9tZSkKLSAqLwotCi0jbmF2LWxpbmtzIHsKLQl3aWR0aCA6IDk4JTsKLQlwb3NpdGlvbiA6IGFic29sdXRlOwotCWxlZnQgOiAwcHg7Ci0JdG9wIDogNjVweDsKLX0KLQotYSNiYWNrIHsgCi0JcG9zaXRpb24gOiBhYnNvbHV0ZTsgCi0JdG9wIDogNjVweDsKLQlyaWdodCA6IDIwcHg7Ci0JdGV4dC1hbGlnbiA6IHJpZ2h0OyAgCi19Ci0KLWEjYmFjayBpbWcgewotCWJhY2tncm91bmQtaW1hZ2UgOiB1cmwoZ3JhcGhpY3MvaWNvbnMvZXRvb2wvYmFjay5naWYpOyAKLQloZWlnaHQgOiA1NnB4OwotCXdpZHRoIDogNTZweDsKLQl0ZXh0LWFsaWduIDogY2VudGVyOwotfQotCi1hI2JhY2s6aG92ZXIgaW1nLAotYSNiYWNrOmZvY3VzIGltZywKLWEjYmFjazphY3RpdmUgaW1nIHsKLQliYWNrZ3JvdW5kLWltYWdlIDogdXJsKGdyYXBoaWNzL2ljb25zL2N0b29sL2JhY2suZ2lmKTsgCi0JaGVpZ2h0IDogNTZweDsKLQl3aWR0aCA6IDU2cHg7Ci19Ci0KLWEjZm9yd2FyZCB7IAotCXBvc2l0aW9uIDogYWJzb2x1dGU7IAotCXRvcCA6IDY1cHg7Ci0JcmlnaHQgOiAtOHB4OwotCXRleHQtYWxpZ24gOiByaWdodDsgIAotfQotCi1hI2ZvcndhcmQgaW1nIHsKLQliYWNrZ3JvdW5kLWltYWdlIDogdXJsKGdyYXBoaWNzL2ljb25zL2V0b29sL2ZvcndhcmQuZ2lmKTsgCi0JaGVpZ2h0IDogNTZweDsKLQl3aWR0aCA6IDU2cHg7Ci0JdGV4dC1hbGlnbiA6IGNlbnRlcjsKLX0KLQotYSNmb3J3YXJkOmhvdmVyIGltZywKLWEjZm9yd2FyZDpmb2N1cyBpbWcsCi1hI2ZvcndhcmQ6YWN0aXZlIGltZyB7Ci0JYmFja2dyb3VuZC1pbWFnZSA6IHVybChncmFwaGljcy9pY29ucy9jdG9vbC9mb3J3YXJkLmdpZik7IAotCWhlaWdodCA6IDU2cHg7Ci0Jd2lkdGggOiA1NnB4OwotfQotCi1hI2hvbWUgeyAKLQlwb3NpdGlvbiA6IGFic29sdXRlOyAKLQl0b3AgOiA2NXB4OwotCXJpZ2h0IDogNjBweDsKLQl0ZXh0LWFsaWduIDogcmlnaHQ7ICAKLX0KLQotYSNob21lIGltZyB7Ci0JYmFja2dyb3VuZC1pbWFnZSA6IHVybChncmFwaGljcy9pY29ucy9ldG9vbC9ob21lLmdpZik7IAotCWhlaWdodCA6IDU2cHg7Ci0Jd2lkdGggOiA1NnB4OwotCXRleHQtYWxpZ24gOiBjZW50ZXI7Ci19Ci0KLWEjaG9tZTpob3ZlciBpbWcsCi1hI2hvbWU6Zm9jdXMgaW1nLAotYSNob21lOmFjdGl2ZSBpbWcgewotCWJhY2tncm91bmQtaW1hZ2UgOiB1cmwoZ3JhcGhpY3MvaWNvbnMvY3Rvb2wvaG9tZS5naWYpOyAKLQloZWlnaHQgOiA1NnB4OwotCXdpZHRoIDogNTZweDsKLX0KLQotCi0vKiBoaWRlIHRoZSBsaW5rIGFuZCBkZXNjcmlwdGlvbiB1bnRpbCB1c2VycyBob3ZlciBvdmVyIHRoZSBsaW5rICovCi0jbmF2LWxpbmtzIGEgcCAudGV4dCwgI25hdi1saW5rcyBhIC5saW5rLWxhYmVsIHsgZGlzcGxheSA6IG5vbmU7IH0KLQotI25hdi1saW5rcyBhOmhvdmVyIC5saW5rLWxhYmVsLAotI25hdi1saW5rcyBhOmZvY3VzIC5saW5rLWxhYmVsLAotI25hdi1saW5rcyBhOmFjdGl2ZSAubGluay1sYWJlbCB7IGRpc3BsYXkgOiBibG9jazsgd2lkdGggOiAxNmVtOyB9Ci0KLSNuYXYtbGlua3MgYTpob3ZlciBwIC50ZXh0LAotI25hdi1saW5rcyBhOmZvY3VzIHAgLnRleHQsCi0jbmF2LWxpbmtzIGE6YWN0aXZlIHAgLnRleHQgewlkaXNwbGF5IDogYmxvY2s7IHdpZHRoIDogMTZlbTsgfQotCi0jbmF2LWxpbmtzIGE6aG92ZXIsCi0jbmF2LWxpbmtzIGE6Zm9jdXMsCi0jbmF2LWxpbmtzIGE6YWN0aXZlIHsgYm9yZGVyLXJpZ2h0IDogMHB4OyB9Ci0KLS8qCi0gKiBUcmFuc2l0aW9uIHBhZ2UgY3NzIHNldHRpbmdzCi0gKi8KLQotI3QtbGlua3MgewotCXRleHQtYWxpZ24gOiBsZWZ0OwotCXdpZHRoIDogNzYwcHg7Ci0JLyogVG8gY2VudGVyIGluIE1veiAoaGF2ZSB0byB1c2UgdGV4dC1hbGlnbiBmb3IgSUUpICovCQotCW1hcmdpbjogMHB4IGF1dG87Ci19Ci0KLSN0LWxpbmtzIGEgeyAKLQl3aWR0aCA6IDM3MHB4OwotCXRleHQtYWxpZ24gOiBsZWZ0OyAKLQltYXJnaW4tbGVmdCA6IDVweDsKLQltYXJnaW4tcmlnaHQgOiA1cHg7Ci0JbWFyZ2luLXRvcCA6IDVweDsKLQltYXJnaW4tYm90dG9tIDogLTIwcHg7Ci0JdmVydGljYWwtYWxpZ24gOiB0b3A7Ci19Ci0KLSN0LWxpbmtzID4gYSB7IHZlcnRpY2FsLWFsaWduIDogbWlkZGxlOyB9Ci0KLSN0LWxpbmtzIGEgaW1nIHsKLQloZWlnaHQgOiA1N3B4OwotCXdpZHRoIDogNTdweDsKLQl2ZXJ0aWNhbC1hbGlnbiA6IG1pZGRsZTsKLX0KLQotI3QtbGlua3MgYSAubGluay1sYWJlbCB7Ci0JZGlzcGxheSA6IGJsb2NrOwotCXdpZHRoIDogMzAwcHg7Ci0JcG9zaXRpb24gOiByZWxhdGl2ZTsKLQl0b3AgOiAtNTBweDsKLQlsZWZ0IDogNjBweDsKLX0KLQotI3QtbGlua3MgYSBwIC50ZXh0IHsKLQlkaXNwbGF5IDogYmxvY2s7Ci0Jd2lkdGggOiAzMDBweDsKLQlwb3NpdGlvbiA6IHJlbGF0aXZlOwotCXRvcCA6IC00NXB4OwotCWxlZnQgOiA1M3B4OwotfQotCi0vKiAKLSAqIFNwZWNpYWwgY2FzZSBmb3IgTW96aWxsYSwgYmVjYXVzZSB0aGUgbGlua3MgYXJlIGRpc3BsYXllZAotICogaW4gMSB2ZXJ0aWNhbCBjb2x1bW4gaW5zdGVhZCBvZiAyIGNlbnRlcmVkIGNvbHVtbnMgCi0gKi8KLQotI3QtbGlua3MgPiBhIHsgCXdpZHRoIDogNzAwcHg7IH0KLSN0LWxpbmtzIGEgPiAubGluay1sYWJlbCB7IHdpZHRoIDogNzAwcHg7IH0KLSN0LWxpbmtzIGEgcCA+IC50ZXh0IHsgd2lkdGggOiA3MDBweDsgfQotCi0jdC1saW5rcyBhOmhvdmVyIHsgYm9yZGVyLXJpZ2h0IDogNXB4OyB9Ci0KLQotLyoqKiBCYWNrdXAgTGluayBJbWFnZSAqKiovCi0KLWEjdC1saW5rcyBpbWcgeyBiYWNrZ3JvdW5kLWltYWdlIDogdXJsKGdyYXBoaWNzL2ljb25zL29iajQ4L25ld19vYmouZ2lmKTsgfQotYSN0LWxpbmtzOmhvdmVyIGltZyB7IGJhY2tncm91bmQtaW1hZ2UgOiB1cmwoZ3JhcGhpY3MvaWNvbnMvb2JqNDgvbmV3aG92X29iai5naWYpOyB9Ci0KLWEjZm9sZGVyX3N0ZXBzIGltZyB7IGJhY2tncm91bmQtaW1hZ2UgOiB1cmwoZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZm9sZGVyX2ZpcnN0c3RlcHMuZ2lmKTsgfQotYSNmb2xkZXJfc3RlcHM6aG92ZXIgaW1nIHsgYmFja2dyb3VuZC1pbWFnZSA6IHVybChncmFwaGljcy9pY29ucy9vYmo0OC9mb2xkZXJfZmlyc3RzdGVwc2hvdi5naWYpOyB9Ci0KLWEjZm9sZGVyX25ld3dlYiBpbWcgeyBiYWNrZ3JvdW5kLWltYWdlIDogdXJsKGdyYXBoaWNzL2ljb25zL29iajQ4L2ZvbGRlcl9uZXd3ZWIuZ2lmKTsgfQotYSNmb2xkZXJfbmV3d2ViOmhvdmVyIGltZyB7IGJhY2tncm91bmQtaW1hZ2UgOiB1cmwoZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZm9sZGVyX25ld3dlYmhvdi5naWYpOyB9Ci0KLWEjZm9sZGVyX2ltcG9ydHdlYiBpbWcgeyBiYWNrZ3JvdW5kLWltYWdlIDogdXJsKGdyYXBoaWNzL2ljb25zL29iajQ4L2ZvbGRlcl9pbXBvcnR3ZWIuZ2lmKTsgfQotYSNmb2xkZXJfaW1wb3J0d2ViOmhvdmVyIGltZyB7IGJhY2tncm91bmQtaW1hZ2UgOiB1cmwoZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZm9sZGVyX2ltcG9ydHdlYmhvdi5naWYpOyB9Ci0KLWEjZm9sZGVyX2hlbHAgaW1nIHsgYmFja2dyb3VuZC1pbWFnZSA6IHVybChncmFwaGljcy9pY29ucy9vYmo0OC9mb2xkZXJfaGVscC5naWYpOyB9Ci1hI2ZvbGRlcl9oZWxwOmhvdmVyIGltZyB7IGJhY2tncm91bmQtaW1hZ2UgOiB1cmwoZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZm9sZGVyX2hlbHBob3YuZ2lmKTsgfQotCi1hI2ZvbGRlcl9vdmVydmlldyBpbWcgeyBiYWNrZ3JvdW5kLWltYWdlIDogdXJsKGdyYXBoaWNzL2ljb25zL29iajQ4L2ZvbGRlcl9vdmVydmlldy5naWYpOyB9Ci1hI2ZvbGRlcl9vdmVydmlldzpob3ZlciBpbWcgeyBiYWNrZ3JvdW5kLWltYWdlIDogdXJsKGdyYXBoaWNzL2ljb25zL29iajQ4L2ZvbGRlcl9vdmVydmlld2hvdi5naWYpOyB9Ci0KLWEjZm9sZGVyX2FkdmFwcHMgaW1nIHsgYmFja2dyb3VuZC1pbWFnZSA6IHVybChncmFwaGljcy9pY29ucy9vYmo0OC9mb2xkZXJfYWR2YXBwcy5naWYpOyB9Ci1hI2ZvbGRlcl9hZHZhcHBzOmhvdmVyIGltZyB7IGJhY2tncm91bmQtaW1hZ2UgOiB1cmwoZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZm9sZGVyX2FkdmFwcHNob3YuZ2lmKTsgfQotCi1hI2ZvbGRlcl9kZXZ3ZWIgaW1nIHsgYmFja2dyb3VuZC1pbWFnZSA6IHVybChncmFwaGljcy9pY29ucy9vYmo0OC9mb2xkZXJfZGV2d2ViLmdpZik7IH0KLWEjZm9sZGVyX2RldndlYjpob3ZlciBpbWcgeyBiYWNrZ3JvdW5kLWltYWdlIDogdXJsKGdyYXBoaWNzL2ljb25zL29iajQ4L2ZvbGRlcl9kZXZ3ZWJob3YuZ2lmKTsgfQotCi1hI2ZvbGRlcl9zYW1wbGVzIGltZyB7IGJhY2tncm91bmQtaW1hZ2UgOiB1cmwoZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZm9sZGVyX3NhbXBsZXMuZ2lmKTsgfQotYSNmb2xkZXJfc2FtcGxlczpob3ZlciBpbWcgeyBiYWNrZ3JvdW5kLWltYWdlIDogdXJsKGdyYXBoaWNzL2ljb25zL29iajQ4L2ZvbGRlcl9zYW1wbGVzaG92LmdpZik7IH0KLQotYSNmb2xkZXJfdHV0b3JpYWxzIGltZyB7IGJhY2tncm91bmQtaW1hZ2UgOiB1cmwoZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZm9sZGVyX3R1dG9yaWFscy5naWYpOyB9Ci1hI2ZvbGRlcl90dXRvcmlhbHM6aG92ZXIgaW1nIHsgYmFja2dyb3VuZC1pbWFnZSA6IHVybChncmFwaGljcy9pY29ucy9vYmo0OC9mb2xkZXJfdHV0b3JpYWxzaG92LmdpZik7IH0KLQotYSNmb2xkZXJfd2ViIGltZyB7IGJhY2tncm91bmQtaW1hZ2UgOiB1cmwoZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZm9sZGVyX3dlYi5naWYpOyB9Ci1hI2ZvbGRlcl93ZWI6aG92ZXIgaW1nIHsgYmFja2dyb3VuZC1pbWFnZSA6IHVybChncmFwaGljcy9pY29ucy9vYmo0OC9mb2xkZXJfd2ViaG92LmdpZik7IH0KLQotYSNmb2xkZXJfcmljaHJlcG9ydHMgaW1nIHsgYmFja2dyb3VuZC1pbWFnZSA6IHVybChncmFwaGljcy9pY29ucy9vYmo0OC9mb2xkZXJfcmljaHJlcG9ydHMuZ2lmKTsgfQotYSNmb2xkZXJfcmljaHJlcG9ydHM6aG92ZXIgaW1nIHsgYmFja2dyb3VuZC1pbWFnZSA6IHVybChncmFwaGljcy9pY29ucy9vYmo0OC9mb2xkZXJfcmljaHJlcG9ydHNob3YuZ2lmKTsgfQotCi1hI2ZvbGRlcl93aGF0c25ldyBpbWcgeyBiYWNrZ3JvdW5kLWltYWdlIDogdXJsKGdyYXBoaWNzL2ljb25zL29iajQ4L2ZvbGRlcl93aGF0c25ldy5naWYpOyB9Ci1hI2ZvbGRlcl93aGF0c25ldzpob3ZlciBpbWcgeyBiYWNrZ3JvdW5kLWltYWdlIDogdXJsKGdyYXBoaWNzL2ljb25zL29iajQ4L2ZvbGRlcl93aGF0c25ld2hvdi5naWYpOyB9Ci0KLWEjZ2FsbGVyeV9zYW1wbGVzIGltZyB7IGJhY2tncm91bmQtaW1hZ2UgOiB1cmwoZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZ2FsbGVyeV9zYW1wbGVzLmdpZik7IH0KLWEjZ2FsbGVyeV9zYW1wbGVzOmhvdmVyIGltZyB7IGJhY2tncm91bmQtaW1hZ2UgOiB1cmwoZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZ2FsbGVyeV9zYW1wbGVzaG92LmdpZik7IH0KLQotYSNnYWxsZXJ5X3R1dG9yaWFscyBpbWcgeyBiYWNrZ3JvdW5kLWltYWdlIDogdXJsKGdyYXBoaWNzL2ljb25zL29iajQ4L2dhbGxlcnlfdHV0b3JpYWxzLmdpZik7IH0KLWEjZ2FsbGVyeV90dXRvcmlhbHM6aG92ZXIgaW1nIHsgYmFja2dyb3VuZC1pbWFnZSA6IHVybChncmFwaGljcy9pY29ucy9vYmo0OC9nYWxsZXJ5X3R1dG9yaWFsc2hvdi5naWYpOyB9Ci0KLWEjcGFnZV9zdGVwcyBpbWcgeyBiYWNrZ3JvdW5kLWltYWdlIDogdXJsKGdyYXBoaWNzL2ljb25zL29iajQ4L3BhZ2VfZmlyc3RzdGVwcy5naWYpOyB9Ci1hI3BhZ2Vfc3RlcHM6aG92ZXIgaW1nIHsgYmFja2dyb3VuZC1pbWFnZSA6IHVybChncmFwaGljcy9pY29ucy9vYmo0OC9wYWdlX2ZpcnN0c3RlcHNob3YuZ2lmKTsgfQotCi1hI3BhZ2VfaGVscCBpbWcgeyBiYWNrZ3JvdW5kLWltYWdlIDogdXJsKGdyYXBoaWNzL2ljb25zL29iajQ4L3BhZ2VfaGVscC5naWYpOyB9Ci1hI3BhZ2VfaGVscDpob3ZlciBpbWcgeyBiYWNrZ3JvdW5kLWltYWdlIDogdXJsKGdyYXBoaWNzL2ljb25zL29iajQ4L3BhZ2VfaGVscGhvdi5naWYpOyB9Ci0KLWEjcGFnZV9vdmVydmlldyBpbWcgeyBiYWNrZ3JvdW5kLWltYWdlIDogdXJsKGdyYXBoaWNzL2ljb25zL29iajQ4L3BhZ2Vfb3ZlcnZpZXcuZ2lmKTsgfQotYSNwYWdlX292ZXJ2aWV3OmhvdmVyIGltZyB7IGJhY2tncm91bmQtaW1hZ2UgOiB1cmwoZ3JhcGhpY3MvaWNvbnMvb2JqNDgvcGFnZV9vdmVydmlld2hvdi5naWYpOyB9Ci0KLWEjcGFnZV93ZWIgaW1nIHsgYmFja2dyb3VuZC1pbWFnZSA6IHVybChncmFwaGljcy9pY29ucy9vYmo0OC9wYWdlX3dlYi5naWYpOyB9Ci1hI3BhZ2Vfd2ViOmhvdmVyIGltZyB7IGJhY2tncm91bmQtaW1hZ2UgOiB1cmwoZ3JhcGhpY3MvaWNvbnMvb2JqNDgvcGFnZV93ZWJob3YuZ2lmKTsgfQotCi1hI3BhZ2Vfd2hhdHNuZXcgaW1nIHsgYmFja2dyb3VuZC1pbWFnZSA6IHVybChncmFwaGljcy9pY29ucy9vYmo0OC9wYWdlX3doYXRzbmV3LmdpZik7IH0KLWEjcGFnZV93aGF0c25ldzpob3ZlciBpbWcgeyBiYWNrZ3JvdW5kLWltYWdlIDogdXJsKGdyYXBoaWNzL2ljb25zL29iajQ4L3BhZ2Vfd2hhdHNuZXdob3YuZ2lmKTsgfQotCi1hI2VwZl9yZXNvdXJjZSBpbWcgeyBiYWNrZ3JvdW5kLWltYWdlIDogdXJsKGdyYXBoaWNzL2ljb25zL29iajQ4L2VwZl9yZXNvdXJjZS5naWYpOyB9Ci1hI2VwZl9yZXNvdXJjZTpob3ZlciBpbWcgeyBiYWNrZ3JvdW5kLWltYWdlIDogdXJsKGdyYXBoaWNzL2ljb25zL29iajQ4L2VwZl9yZXNvdXJjZWhvdi5naWYpOyB9Ci0KLWEjZXBmLW92LXRvdXIgaW1nIHsgYmFja2dyb3VuZC1pbWFnZSA6IHVybChncmFwaGljcy9pY29ucy9vYmo0OC9lcGYtb3YtdG91ci5naWYpOyB9Ci1hI2VwZi1vdi10b3VyOmhvdmVyIGltZyB7IGJhY2tncm91bmQtaW1hZ2UgOiB1cmwoZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZXBmLW92LXRvdXJob3YuZ2lmKTsgfQotCi1hI2VwZi1vdi1ydXBvdiBpbWcgeyBiYWNrZ3JvdW5kLWltYWdlIDogdXJsKGdyYXBoaWNzL2ljb25zL29iajQ4L2VwZi1vdi1ydXBvdi5naWYpOyB9Ci1hI2VwZi1vdi1ydXBvdjpob3ZlciBpbWcgeyBiYWNrZ3JvdW5kLWltYWdlIDogdXJsKGdyYXBoaWNzL2ljb25zL29iajQ4L2VwZi1vdi1ydXBvdmhvdi5naWYpOyB9Ci0KLWEjZXBmLW92LW1ldGhvZCBpbWcgeyBiYWNrZ3JvdW5kLWltYWdlIDogdXJsKGdyYXBoaWNzL2ljb25zL29iajQ4L2VwZi1vdi1tZXRob2QuZ2lmKTsgfQotYSNlcGYtb3YtbWV0aG9kOmhvdmVyIGltZyB7IGJhY2tncm91bmQtaW1hZ2UgOiB1cmwoZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZXBmLW92LW1ldGhvZGhvdi5naWYpOyB9Ci0KLWEjZXBmLW92LXByb2Nlc3MgaW1nIHsgYmFja2dyb3VuZC1pbWFnZSA6IHVybChncmFwaGljcy9pY29ucy9vYmo0OC9lcGYtb3YtcHJvY2Vzcy5naWYpOyB9Ci1hI2VwZi1vdi1wcm9jZXNzOmhvdmVyIGltZyB7IGJhY2tncm91bmQtaW1hZ2UgOiB1cmwoZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZXBmLW92LXByb2Nlc3Nob3YuZ2lmKTsgfQotCi1hI2VwZi1vdi1jb25maWdwdWJsaXNoIGltZyB7IGJhY2tncm91bmQtaW1hZ2UgOiB1cmwoZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZXBmLW92LWNvbmZpZ3B1Ymxpc2guZ2lmKTsgfQotYSNlcGYtb3YtY29uZmlncHVibGlzaDpob3ZlciBpbWcgeyBiYWNrZ3JvdW5kLWltYWdlIDogdXJsKGdyYXBoaWNzL2ljb25zL29iajQ4L2VwZi1vdi1jb25maWdwdWJsaXNoaG92LmdpZik7IH0KLQotYSNlcGYtc3RlcHMtb25lIGltZyB7IGJhY2tncm91bmQtaW1hZ2UgOiB1cmwoZ3JhcGhpY3MvaWNvbnMvb2JqNDgvcGFnZV9maXJzdHN0ZXBzLmdpZik7IH0KLWEjZXBmLXN0ZXBzLW9uZTpob3ZlciBpbWcgeyBiYWNrZ3JvdW5kLWltYWdlIDogdXJsKGdyYXBoaWNzL2ljb25zL29iajQ4L3BhZ2VfZmlyc3RzdGVwc2hvdi5naWYpOyB9Ci0KLWEjZXBmLXN0ZXBzLXR3byBpbWcgeyBiYWNrZ3JvdW5kLWltYWdlIDogdXJsKGdyYXBoaWNzL2ljb25zL29iajQ4L3BhZ2VfZmlyc3RzdGVwcy5naWYpOyB9Ci1hI2VwZi1zdGVwcy10d286aG92ZXIgaW1nIHsgYmFja2dyb3VuZC1pbWFnZSA6IHVybChncmFwaGljcy9pY29ucy9vYmo0OC9wYWdlX2ZpcnN0c3RlcHNob3YuZ2lmKTsgfQotCi1hI2VwZi1zdGVwcy10aHJlZSBpbWcgeyBiYWNrZ3JvdW5kLWltYWdlIDogdXJsKGdyYXBoaWNzL2ljb25zL29iajQ4L3BhZ2VfZmlyc3RzdGVwcy5naWYpOyB9Ci1hI2VwZi1zdGVwcy10aHJlZTpob3ZlciBpbWcgeyBiYWNrZ3JvdW5kLWltYWdlIDogdXJsKGdyYXBoaWNzL2ljb25zL29iajQ4L3BhZ2VfZmlyc3RzdGVwc2hvdi5naWYpOyB9Ci0KLWEjZXBmLXN0ZXBzLWZvdXIgaW1nIHsgYmFja2dyb3VuZC1pbWFnZSA6IHVybChncmFwaGljcy9pY29ucy9vYmo0OC9wYWdlX2ZpcnN0c3RlcHMuZ2lmKTsgfQotYSNlcGYtc3RlcHMtZm91cjpob3ZlciBpbWcgeyBiYWNrZ3JvdW5kLWltYWdlIDogdXJsKGdyYXBoaWNzL2ljb25zL29iajQ4L3BhZ2VfZmlyc3RzdGVwc2hvdi5naWYpOyB9Ci0KLWEjZXBmLXR1dC1nYWxsZXJ5IGltZyB7IGJhY2tncm91bmQtaW1hZ2UgOiB1cmwoZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZ2FsbGVyeV90dXRvcmlhbHMuZ2lmKTsgfQotYSNlcGYtdHV0LWdhbGxlcnk6aG92ZXIgaW1nIHsgYmFja2dyb3VuZC1pbWFnZSA6IHVybChncmFwaGljcy9pY29ucy9vYmo0OC9nYWxsZXJ5X3R1dG9yaWFsc2hvdi5naWYpOyB9Ci0KLWEjZXBmLXR1dC1lbGVtZW50IGltZyB7IGJhY2tncm91bmQtaW1hZ2UgOiB1cmwoZ3JhcGhpY3MvaWNvbnMvb2JqNDgvdF9tZXRoY29udF9vYmouZ2lmKTsgfQotYSNlcGYtdHV0LWVsZW1lbnQ6aG92ZXIgaW1nIHsgYmFja2dyb3VuZC1pbWFnZSA6IHVybChncmFwaGljcy9pY29ucy9vYmo0OC90X21ldGhjb250aG92X29iai5naWYpOyB9Ci0KLWEjZXBmLXR1dC1uYXZpZ2F0ZSBpbWcgeyBiYWNrZ3JvdW5kLWltYWdlIDogdXJsKGdyYXBoaWNzL2ljb25zL29iajQ4L3RfbmF2dWlfb2JqLmdpZik7IH0KLWEjZXBmLXR1dC1uYXZpZ2F0ZTpob3ZlciBpbWcgeyBiYWNrZ3JvdW5kLWltYWdlIDogdXJsKGdyYXBoaWNzL2ljb25zL29iajQ4L3RfbmF2dWlob3Zfb2JqLmdpZik7IH0KLQotYSNlcGYtdHV0LWNvbnRlbnQgaW1nIHsgYmFja2dyb3VuZC1pbWFnZSA6IHVybChncmFwaGljcy9pY29ucy9vYmo0OC90X3JlbWV0aGNvbnRfb2JqLmdpZik7IH0KLWEjZXBmLXR1dC1jb250ZW50OmhvdmVyIGltZyB7IGJhY2tncm91bmQtaW1hZ2UgOiB1cmwoZ3JhcGhpY3MvaWNvbnMvb2JqNDgvdF9yZW1ldGhjb250aG92X29iai5naWYpOyB9Ci0KLWEjZXBmLXR1dC1wcm9jZXNzIGltZyB7IGJhY2tncm91bmQtaW1hZ2UgOiB1cmwoZ3JhcGhpY3MvaWNvbnMvb2JqNDgvdF93b3JrcHJvY19vYmouZ2lmKTsgfQotYSNlcGYtdHV0LXByb2Nlc3M6aG92ZXIgaW1nIHsgYmFja2dyb3VuZC1pbWFnZSA6IHVybChncmFwaGljcy9pY29ucy9vYmo0OC90X3dvcmtwcm9jaG92X29iai5naWYpOyB9Ci0KLWEjZXBmLXR1dC1wdWJleHAgaW1nIHsgYmFja2dyb3VuZC1pbWFnZSA6IHVybChncmFwaGljcy9pY29ucy9vYmo0OC90X3B1YmV4cF9vYmouZ2lmKTsgfQotYSNlcGYtdHV0LXB1YmV4cDpob3ZlciBpbWcgeyBiYWNrZ3JvdW5kLWltYWdlIDogdXJsKGdyYXBoaWNzL2ljb25zL29iajQ4L3RfcHViZXhwaG92X29iai5naWYpOyB9CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL3NoYXJlZF9lY2xpcHNlLmNzcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3Mvc2hhcmVkX2VjbGlwc2UuY3NzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYTQ0NGQ2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3Mvc2hhcmVkX2VjbGlwc2UuY3NzCisrKyAvZGV2L251bGwKQEAgLTEsMjc2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKgotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKi8KLQotLyogCi0gKiBTZXQgdXAgZ2VuZXJhbCBmb250cywgc2l6ZXMgYW5kIGNvbG9ycyAKLSAqLwotYm9keSB7IGZvbnQtZmFtaWx5IDogQXJpYWwsIHNhbnMtc2VyaWY7IH0KLQotSDEsIEgyLCBIMywgSDQsIHAsIGEgeyBjb2xvciA6ICM0RDRENEQ7IH0KLQotLmludHJvLWhlYWRlciBIMSB7Ci0JZm9udC1zaXplIDogMTZwdDsKLQlmb250LXdlaWdodCA6IG5vcm1hbDsKLQljb2xvciA6ICNFNUU1RTU7Ci19Ci0KLWgyIHsKLQlmb250LXNpemUgOiAxM3B0OwotCWZvbnQtd2VpZ2h0IDogbm9ybWFsOwotCWNvbG9yIDogIzdCODY5NDsKLX0KLS8qIEZvciByZWd1bGFyIGRpdiBsYWJlbHMgKi8KLUg0IC5kaXYtbGFiZWwgewotCWZvbnQtc2l6ZSA6IDEwcHQ7Ci0JZm9udC13ZWlnaHQgOiBib2xkOwotfQotCi0vKiBGb3IgdGhlIG1haW4gcGFnZSBjb250ZW50J3MgdGl0bGUgKi8KLSNjb250ZW50LWhlYWRlciBINCAuZGl2LWxhYmVsIHsKLQlmb250LXNpemUgOiAxNHB0OwotCWZvbnQtd2VpZ2h0IDogbm9ybWFsOwotCWNvbG9yIDogIzhDOTZBMjsKLQlmbG9hdCA6IG5vbmU7Ci0JY2xlYXIgOiBib3RoOwotfQotCi0ucGFnZS1kZXNjcmlwdGlvbiB7IAotCWZvbnQtc2l6ZSA6IDEwcHQ7Ci0JZmxvYXQgOiBub25lOwotCWNsZWFyIDogYm90aDsKLX0KLQotYSB7Ci0JZm9udC13ZWlnaHQgOiBib2xkOwotCXRleHQtZGVjb3JhdGlvbiA6IG5vbmU7Ci0JY29sb3IgOiAjNEQ0RDREOwotfQotCi1hIC5saW5rLWxhYmVsIHsKLQlmb250LXNpemUgOiAxMHB0OwotCWZvbnQtd2VpZ2h0IDogbm9ybWFsOwotfQotCi0jbmF2aWdhdGlvbi1saW5rcyBhIC5saW5rLWxhYmVsIHsKLQlmb250LXNpemUgOiA5cHQ7Ci0JZm9udC13ZWlnaHQgOiBub3JtYWw7Ci0JY29sb3IgOiAjRTVFNUU1OwotfQotCi1hIC50ZXh0IHsKLQlmb250LXNpemUgOiA4cHQ7Ci0JZm9udC13ZWlnaHQgOiBub3JtYWw7Ci19Ci0KLXAgLmdyb3VwLWRlc2NyaXB0aW9uIHsKLQlmb250LXNpemUgOiAxMHB0OwotCWZvbnQtd2VpZ2h0IDogbm9ybWFsOwotfQotCi0KLS8qIAotICogU2V0IHVwIG90aGVyIGdlbmVyYWwgcHJvcGVydGllcyBsaWtlIHBhZGRpbmcvbWFyZ2lucwotICovCi1odG1sLCBib2R5IHsgd2lkdGggOiAxMDAlOyBoZWlnaHQgOiAxMDAlOyB9Ci0KLWh0bWwsIGJvZHksIGRpdiwgaDEsIGg0LCBwLCBhIHsgbWFyZ2luIDogMHB4OyBwYWRkaW5nIDogMHB4OyB9Ci0KLS5pbnRyby1oZWFkZXIgSDEgeyBwYWRkaW5nLXRvcCA6IDEwcHg7IG1hcmdpbi1sZWZ0IDogMTBweDsgfQotCi0vKiBGb3IgcmVndWxhciBkaXYgbGFiZWxzICovCi0jcGFnZS1jb250ZW50IGRpdiBINCB7Ci0JcGFkZGluZyA6IDEwcHg7Ci0JcGFkZGluZy1ib3R0b20gOiAwcHg7Ci19Ci0KLS8qIEZvciB0aGUgbWFpbiBwYWdlIGNvbnRlbnQncyBkaXYgbGFiZWwgKi8KLSNwYWdlLWNvbnRlbnQgI2NvbnRlbnQtaGVhZGVyIEg0IHsKLQlwYWRkaW5nLWJvdHRvbSA6IDEwcHg7Ci0JcGFkZGluZy10b3AgOiAwcHg7Ci19Ci0KLS8qIHNwZWNpYWwgY2FzZSBmb3IgTW96aWxsYSdzIG1haW4gY29udGVudC1oZWFkZXIgbGFiZWwuCi0gICBNb3ppbGxhIDEuNCBuZWVkcyBtb3JlIHJvb20gYXQgdGhlIHRvcCAqLwotI3BhZ2UtY29udGVudCA+ICNjb250ZW50LWhlYWRlciBINCB7IHBhZGRpbmctdG9wIDogMTBweDsgfQotCi0vKiBOZWVkZWQgaW4gSUUgdG8gZ2V0IHNoaWZ0K3RhYiB0byBzaG93IHRoZSBhY3RpdmUgaW1hZ2UgcHJvcGVybHkgKi8KLWE6YWN0aXZlIHsKLQlib3JkZXIgOiBzb2xpZCAwcHg7Ci19Ci0KLWEgaW1nIHsKLQlib3JkZXItd2lkdGggOiAwOwotCWJhY2tncm91bmQtcmVwZWF0IDogbm8tcmVwZWF0OwotfQotCi0vKgotICogdG8gZ2V0IHNjcm9sbGJhcnMgd29ya2luZyBpbiBib3RoIElFIGFuZCBNb3ppbGxhCi0gKi8KLWh0bWwsYm9keSB7IG92ZXJmbG93OiBhdXRvOyB9Ci1odG1sPmJvZHkgeyBvdmVyZmxvdzogdmlzaWJsZTsgfQotCi0vKgotICogU2V0IHVwIHRoZSBib2R5LCBkZWNvcmF0aXZlIGJhY2tncm91bmQsIGFuZCBuYXZpZ2F0aW9uIGZvciB0aGUgY29udGVudCAKLSAqIHBhZ2VzLiAKLSAqIE5vdGU6IHRoZSByb290IHBhZ2UgaGFuZGxlcyBpdHMgb3duIGJhY2tncm91bmQgYW5kIG5hdmlnYXRpb247IHRoZXNlCi0gKiBzZXR0aW5ncyBwcmltYXJpbHkgYXBwbHkgdG8gdGhlIGNvbnRlbnQgcGFnZXMKLSAqLwotYm9keSB7Ci0JYmFja2dyb3VuZC1jb2xvciA6ICNGRkZGRkY7Ci0JYmFja2dyb3VuZC1yZXBlYXQgOiBuby1yZXBlYXQ7Ci0JYmFja2dyb3VuZC1wb3NpdGlvbiA6IGJvdHRvbSByaWdodDsKLX0KLQotI2JhY2tncm91bmQtaW1hZ2UgewotCXdpZHRoIDogMTAwJTsKLQltaW4td2lkdGggOiA3NzBweDsKLQloZWlnaHQgOiAxNjRweDsKLQliYWNrZ3JvdW5kLWltYWdlIDogdXJsKGdyYXBoaWNzL2NvbnRlbnRwYWdlL2JhY2tncm91bmQuanBnKTsKLQliYWNrZ3JvdW5kLXJlcGVhdCA6IG5vLXJlcGVhdDsKLQliYWNrZ3JvdW5kLXBvc2l0aW9uIDogdG9wIGxlZnQ7CQotCXBvc2l0aW9uIDogYWJzb2x1dGU7Ci0JdG9wIDogMHB4OwotCXotaW5kZXggOiAtMTAwOwotfQotCi0jY3VydmUtaW1hZ2UgeyAKLQl3aWR0aCA6IDEwMCU7Ci0JaGVpZ2h0IDogMTY0cHg7Ci0JcG9zaXRpb24gOiBhYnNvbHV0ZTsKLQl0b3AgOiAwcHg7Ci0JYmFja2dyb3VuZC1pbWFnZSA6IHVybChncmFwaGljcy9jb250ZW50cGFnZS9iYWNrZ3JvdW5kLmdpZik7Ci0JYmFja2dyb3VuZC1yZXBlYXQgOiBuby1yZXBlYXQ7Ci0JYmFja2dyb3VuZC1wb3NpdGlvbiA6IHRvcCBjZW50ZXI7Ci0JbWFyZ2luIDogMDsKLQlwYWRkaW5nIDogMDsKLX0KLQotLmludHJvLWhlYWRlciB7CWJhY2tncm91bmQtY29sb3IgOiB0cmFuc3BhcmVudDsgei1pbmRleCA6IDEwMDt9Ci0KLWJvZHksIC5wYWdlewotCW1pbi13aWR0aCA6IDc3MHB4OwotCS8qIHNpbmNlIElFIGRvZXNuJ3Qgc3VwcG9ydCBtaW4td2lkdGgsIHRyeSBleHByZXNzaW9uICovCi0Jd2lkdGg6ZXhwcmVzc2lvbihkb2N1bWVudC5ib2R5LmNsaWVudFdpZHRoIDwgNzcwPyAiNzcwcHgiOiAiYXV0byIgKTsKLQltaW4taGVpZ2h0IDogNDI1cHg7Ci0JaGVpZ2h0IDogMTAwJTsKLQloZWlnaHQgOiBleHByZXNzaW9uKGRvY3VtZW50LmJvZHkuY2xpZW50SGVpZ2h0IDwgNDI1PyAiNDI1cHgiOiAiMTAwJSIgKTsKLX0KLQotLnBhZ2UgeyAKLQliYWNrZ3JvdW5kLWltYWdlIDogdXJsKGdyYXBoaWNzL2NvbnRlbnRwYWdlL3dvcmRtYXJrLmdpZik7Ci0JYmFja2dyb3VuZC1yZXBlYXQgOiBuby1yZXBlYXQ7Ci0JYmFja2dyb3VuZC1wb3NpdGlvbiA6IGJvdHRvbSBsZWZ0OwotCW1pbi1oZWlnaHQgOiA0NzVweDsKLX0KLQotI3BhZ2UtY29udGVudCB7Ci0JYmFja2dyb3VuZC1yZXBlYXQgOiBuby1yZXBlYXQ7Ci0JYmFja2dyb3VuZC1wb3NpdGlvbiA6IGJvdHRvbSByaWdodDsKLQloZWlnaHQgOiA3MCU7Ci19Ci0KLS8qIAotICogTGF5IG91dCB0aGUgbmF2aWdhdGlvbiBsaW5rcyAKLSAqIChSb290IHBhZ2UgZG9lcyBzb21ldGhpbmcgc2ltaWxhciBmb3IgaXRzIG5hdmlnYXRpb24pCi0gKi8KLSNuYXZpZ2F0aW9uLWxpbmtzIHsKLQlwb3NpdGlvbiA6IHJlbGF0aXZlOwotCWxlZnQgOiAxMHB4OwotCXRvcCA6IDVweDsKLQloZWlnaHQgOiA2MDsKLQl3aWR0aCA6IDk4JTsKLX0KLQotI25hdmlnYXRpb24tbGlua3MgYSB7Ci0JcGFkZGluZy1sZWZ0IDogNXB4OwotCXBhZGRpbmctcmlnaHQgOiA1cHg7Ci0JZmxvYXQgOiBsZWZ0OwotCXRleHQtYWxpZ24gOiBjZW50ZXI7Ci19Ci0KLSNuYXZpZ2F0aW9uLWxpbmtzIGEgaW1nIHsKLQloZWlnaHQgOiA1MnB4OwotCXdpZHRoIDogNTJweDsKLQl2ZXJ0aWNhbC1hbGlnbiA6IG1pZGRsZTsKLX0KLQotI25hdmlnYXRpb24tbGlua3MgYSAubGluay1sYWJlbCB7IGRpc3BsYXkgOiBibG9jazsgbWFyZ2luLXRvcCA6IDVweDt9Ci0KLSNuYXZpZ2F0aW9uLWxpbmtzIGEgLnRleHQgeyBkaXNwbGF5IDogbm9uZTsgfQotCi0jbmF2aWdhdGlvbi1saW5rcyBhOmhvdmVyLCAKLSNuYXZpZ2F0aW9uLWxpbmtzIGE6Zm9jdXMgCi0jbmF2aWdhdGlvbi1saW5rcyBhOmFjdGl2ZSB7IGJvcmRlci1yaWdodCA6IDBweDt9Ci0KLS8qIHByb3BlcnRpZXMgZm9yIGVhY2ggb2YgdGhlIG5hdmlnYXRpb24tbGlua3MgICovCi0jbmF2aWdhdGlvbi1saW5rcyBhI292ZXJ2aWV3IGltZyB7IGJhY2tncm91bmQtaW1hZ2UgOiB1cmwoZ3JhcGhpY3MvaWNvbnMvZXRvb2wvb3ZlcnZpZXc0OC5naWYpOyB9Ci0jbmF2aWdhdGlvbi1saW5rcyBhI292ZXJ2aWV3OmhvdmVyIGltZywKLSNuYXZpZ2F0aW9uLWxpbmtzIGEjb3ZlcnZpZXc6Zm9jdXMgaW1nLAotI25hdmlnYXRpb24tbGlua3MgYSNvdmVydmlldzphY3RpdmUgaW1nIHsgYmFja2dyb3VuZC1pbWFnZSA6IHVybChncmFwaGljcy9pY29ucy9jdG9vbC9vdmVydmlldzQ4LmdpZik7IH0KLS8qI25hdmlnYXRpb24tbGlua3MgYSNvdmVydmlldzphY3RpdmUgaW1nIHsgYmFja2dyb3VuZC1pbWFnZSA6IHVybChncmFwaGljcy9pY29ucy9jdG9vbC9vdmVydmlldzQ4c2VsLmdpZik7IH0qLwotCi0jbmF2aWdhdGlvbi1saW5rcyBhI3R1dG9yaWFscyBpbWcgeyBiYWNrZ3JvdW5kLWltYWdlIDogdXJsKGdyYXBoaWNzL2ljb25zL2V0b29sL3R1dG9yaWFsczQ4LmdpZik7IH0KLSNuYXZpZ2F0aW9uLWxpbmtzIGEjdHV0b3JpYWxzOmhvdmVyIGltZywKLSNuYXZpZ2F0aW9uLWxpbmtzIGEjdHV0b3JpYWxzOmFjdGl2ZSBpbWcsCi0jbmF2aWdhdGlvbi1saW5rcyBhI3R1dG9yaWFsczpmb2N1cyBpbWcgeyBiYWNrZ3JvdW5kLWltYWdlIDogdXJsKGdyYXBoaWNzL2ljb25zL2N0b29sL3R1dG9yaWFsczQ4LmdpZik7IH0KLS8qI25hdmlnYXRpb24tbGlua3MgYSN0dXRvcmlhbHM6YWN0aXZlIGltZyB7IGJhY2tncm91bmQtaW1hZ2UgOiB1cmwoZ3JhcGhpY3MvaWNvbnMvY3Rvb2wvdHV0b3JpYWxzNDhzZWwuZ2lmKTsgfSovCi0KLSNuYXZpZ2F0aW9uLWxpbmtzIGEjc2FtcGxlcyBpbWcgeyBiYWNrZ3JvdW5kLWltYWdlIDogdXJsKGdyYXBoaWNzL2ljb25zL2V0b29sL3NhbXBsZXM0OC5naWYpOyB9Ci0jbmF2aWdhdGlvbi1saW5rcyBhI3NhbXBsZXM6aG92ZXIgaW1nLAotI25hdmlnYXRpb24tbGlua3MgYSNzYW1wbGVzOmFjdGl2ZSBpbWcsCi0jbmF2aWdhdGlvbi1saW5rcyBhI3NhbXBsZXM6Zm9jdXMgaW1nIHsgYmFja2dyb3VuZC1pbWFnZSA6IHVybChncmFwaGljcy9pY29ucy9jdG9vbC9zYW1wbGVzNDguZ2lmKTsgfQotLyojbmF2aWdhdGlvbi1saW5rcyBhI3NhbXBsZXM6YWN0aXZlIGltZyB7IGJhY2tncm91bmQtaW1hZ2UgOiB1cmwoZ3JhcGhpY3MvaWNvbnMvY3Rvb2wvc2FtcGxlczQ4c2VsLmdpZik7IH0qLwotCi0jbmF2aWdhdGlvbi1saW5rcyBhI25ld3MgaW1nIHsgYmFja2dyb3VuZC1pbWFnZSA6IHVybChncmFwaGljcy9pY29ucy9ldG9vbC93aGF0c25ldzQ4LmdpZik7IH0KLSNuYXZpZ2F0aW9uLWxpbmtzIGEjbmV3czpob3ZlciBpbWcsCi0jbmF2aWdhdGlvbi1saW5rcyBhI25ld3M6Zm9jdXMgaW1nLAotI25hdmlnYXRpb24tbGlua3MgYSNuZXdzOmFjdGl2ZSBpbWcgeyBiYWNrZ3JvdW5kLWltYWdlIDogdXJsKGdyYXBoaWNzL2ljb25zL2N0b29sL3doYXRzbmV3NDguZ2lmKTsgfQotLyojbmF2aWdhdGlvbi1saW5rcyBhI25ld3M6YWN0aXZlIGltZyB7IGJhY2tncm91bmQtaW1hZ2UgOiB1cmwoZ3JhcGhpY3MvaWNvbnMvY3Rvb2wvd2hhdHNuZXc0OHNlbC5naWYpOyB9Ki8KLQotI25hdmlnYXRpb24tbGlua3MgYSN3b3JrYmVuY2ggeyBwb3NpdGlvbiA6IGFic29sdXRlOyAgcmlnaHQgOiAwcHg7IHRvcCA6IC0zNXB4OyB0ZXh0LWFsaWduIDogcmlnaHQ7fQotI25hdmlnYXRpb24tbGlua3MgYSN3b3JrYmVuY2ggLnRleHQgeyBkaXNwbGF5IDogbm9uZTsgfQotI25hdmlnYXRpb24tbGlua3MgYSN3b3JrYmVuY2ggaW1nIHsgYmFja2dyb3VuZC1pbWFnZSA6IHVybChncmFwaGljcy9pY29ucy9ldG9vbC93YjQ4LmdpZik7IHdpZHRoIDogNTNweDsgaGVpZ2h0IDogNTNweDt9Ci0jbmF2aWdhdGlvbi1saW5rcyBhI3dvcmtiZW5jaDpob3ZlciBpbWcsCi0jbmF2aWdhdGlvbi1saW5rcyBhI3dvcmtiZW5jaDpmb2N1cyBpbWcsCi0jbmF2aWdhdGlvbi1saW5rcyBhI3dvcmtiZW5jaDphY3RpdmUgaW1nIHsgYmFja2dyb3VuZC1pbWFnZSA6IHVybChncmFwaGljcy9pY29ucy9jdG9vbC93YjQ4LmdpZik7IH0KLQotLyogCi0gKiBMYXkgb3V0IHRoZSBwYWdlIHRpdGxlIGFuZCBkZXNjcmlwdGlvbiAKLSAqLwotaDEsIHAgeyBtYXJnaW4tbGVmdCA6IDEwcHg7IH0gLyogcmVxdWlyZWQgaW4gbW96aWxsYSBzbyB0aGUgcGFnZSBkZXNjcmlwdGlvbiBpcyBwcm9wZXJseSBpbmRlbnRlZCAqLwotCi0vKiBwb3NpdGlvbiB0aGUgcGFnZSBjb250ZW50IHNvIHRoYXQgdGhlIHBhZ2UgdGl0bGUgb3ZlcmxheXMgdGhlIGJvdHRvbQotICogb2YgdGhlIGJhY2tncm91bmQgaW1hZ2UsIGJ1dCBtYWtlIHN1cmUgdGhlIGNvbnRlbnQgaXMgYWx3YXlzIG9uIHRvcCAKLSAqICh1c2luZyB6LWluZGV4KSAqLwotI3BhZ2UtY29udGVudCB7Ci0JZmxvYXQgOiBub25lOwotCWNsZWFyIDogYm90aDsKLQl0ZXh0LWFsaWduIDogY2VudGVyOwotCW1hcmdpbi10b3AgOiAzNXB4OwotfQotCi0ucGFnZSA+ICNwYWdlLWNvbnRlbnQgeyBtYXJnaW4tdG9wIDogNTBweDsgfQotCi0jcGFnZS1jb250ZW50IHAgeyAKLQlwYWRkaW5nLWJvdHRvbSA6IDE1cHg7IAotCXRleHQtYWxpZ24gOiBsZWZ0OyAKLQlmbG9hdCA6IG5vbmU7Ci0JY2xlYXIgOiBib3RoOwotfQotCi0jcGFnZS1jb250ZW50ICNjb250ZW50LWhlYWRlciBINCwgLnBhZ2UtZGVzY3JpcHRpb24gewotCXRleHQtYWxpZ24gOiBsZWZ0OwotCW1hcmdpbi1yaWdodCA6IDEwcHg7Ci0JZmxvYXQgOiBub25lOwotCWNsZWFyIDogYm90aDsKLX0KLQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9zdGFuZGJ5X3Jvb3QuY3NzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9zdGFuZGJ5X3Jvb3QuY3NzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YmQ1MjE4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3Mvc3RhbmRieV9yb290LmNzcworKysgL2Rldi9udWxsCkBAIC0xLDEzMyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICovCi0KLS8qIAotICogU2V0IHVwIGdlbmVyYWwgZm9udCBjb2xvdXJzLCBzaXplcywgZXRjLiAgU29tZSBvZiB0aGVzZSB3aWxsIG92ZXJyaWRlCi0gKiBzZXR0aW5ncyBmcm9tIHRoZSBzaGFyZWQgQ1NTIAotICovCi0uaW50cm8taGVhZGVyIEgxIHsKLQlmb250LXNpemUgOiAxNXB0OwotfQotCi0jcGFnZS1saW5rcyBhIC5saW5rLWxhYmVsLCAjYWN0aW9uLWxpbmtzIGEgLmxpbmstbGFiZWwgewotCWZvbnQtc2l6ZSA6IDEwcHQ7Ci0JZm9udC13ZWlnaHQgOiA2MDA7Ci0JY29sb3IgOiAjRTVFNUU1OwotfQotCi0jcGFnZS1saW5rcyBhIHAgLnRleHQsICNhY3Rpb24tbGlua3MgYSBwIC50ZXh0IHsKLQlmb250LXNpemUgOiAxMHB0OwotCWZvbnQtd2VpZ2h0IDogNTAwOwotCWNvbG9yIDogI0U1RTVFNTsKLX0KLQotLyoKLSAqIFNldCB1cCB0aGUgY29udGVudCBmb3IgdGhlIHN0YW5kYnkgcGFnZS4KLSAqLwotYm9keSB7Ci0JbWluLXdpZHRoIDogMjMwcHg7Ci0JLyogc2luY2UgSUUgZG9lc24ndCBzdXBwb3J0IG1pbi13aWR0aCwgdXNlIGV4cHJlc3Npb24gKi8KLQl3aWR0aDpleHByZXNzaW9uKGRvY3VtZW50LmJvZHkuY2xpZW50V2lkdGggPCAyMzA/ICIyMzBweCI6ICJhdXRvIiApOwotCWJhY2tncm91bmQtaW1hZ2UgOiB1cmwoZ3JhcGhpY3Mvcm9vdHBhZ2UvYmFja2dyb3VuZC5qcGcpOwotCWJhY2tncm91bmQtcmVwZWF0IDogbm8tcmVwZWF0OwotCWJhY2tncm91bmQtcG9zaXRpb24gOiB0b3AgbGVmdDsKLQliYWNrZ3JvdW5kLWNvbG9yIDogIzcxNjlEMTsKLX0KLQotLnBhZ2UgeyAKLQliYWNrZ3JvdW5kLWltYWdlIDogdXJsKGdyYXBoaWNzL3Jvb3RwYWdlL2JyYW5kbWFyay5naWYpOwotCWJhY2tncm91bmQtcmVwZWF0IDogbm8tcmVwZWF0OwotCWJhY2tncm91bmQtcG9zaXRpb24gOiBib3R0b20gbGVmdDsKLQltaW4td2lkdGggOiAyMzBweDsKLQkvKiBzaW5jZSBJRSBkb2Vzbid0IHN1cHBvcnQgbWluLXdpZHRoLCB1c2UgZXhwcmVzc2lvbiAqLwotCXdpZHRoOmV4cHJlc3Npb24oZG9jdW1lbnQuYm9keS5jbGllbnRXaWR0aCA8IDIzMD8gIjIzMHB4IjogImF1dG8iICk7Ci0gCW1pbi1oZWlnaHQgOiA2MTBweDsKLQloZWlnaHQgOiAxMDAlOwotCWhlaWdodCA6IGV4cHJlc3Npb24oZG9jdW1lbnQuYm9keS5jbGllbnRIZWlnaHQgPCA0NTA/ICI0NTBweCI6ICIxMDAlIiApOwotfQotCi0vKiAKLSAqIFNldCB1cCB0aGUgbmF2aWdhdGlvbiBiYXIuICBJdCBzaG91bGQgYmUgY2VudGVyZWQgaW4gdGhlIG1pZGRsZQotICogb2YgdGhlIHBhZ2UKLSAqLwotCi0jbGlua3MtYmFja2dyb3VuZCB7IAotCXdpZHRoIDogMTAwJTsgCi0gCW1hcmdpbi10b3AgOiAxMCU7IAotCW1hcmdpbi1ib3R0b20gOiBhdXRvOwotCXRleHQtYWxpZ24gOiBjZW50ZXI7Ci19Ci0KLSNwYWdlLWxpbmtzIGEgewotCWRpc3BsYXkgOiBibG9jazsKLQl3aWR0aCA6IDIyMHB4OwotCXRleHQtYWxpZ24gOiBsZWZ0OyAKLQltYXJnaW4tbGVmdCA6IGF1dG87Ci0JbWFyZ2luLXJpZ2h0IDogYXV0bzsKLQltYXJnaW4tdG9wIDogMHB4OwotCXZlcnRpY2FsLWFsaWduIDogdG9wOwotfQotI3BhZ2UtbGlua3MgYSBzcGFuLCAjcGFnZS1saW5rcyBhIHAgewotCWRpc3BsYXkgOiBibG9jazsKLQl3aWR0aCA6IDE2MHB4OwotCW1hcmdpbiA6IDBweDsKLQlwYWRkaW5nIDogMHB4OwotfQotCi0jcGFnZS1saW5rcyBhIC5saW5rLWxhYmVsIHsKLQlwb3NpdGlvbiA6IHJlbGF0aXZlOwotCWxlZnQgOiA2MHB4OwotCXRvcCA6IC01MHB4OwotfQotCi0jcGFnZS1saW5rcyBhIHAgLnRleHQgewotCXBvc2l0aW9uIDogcmVsYXRpdmU7Ci0JbGVmdCA6IDYwcHg7Ci0JdG9wIDogLTUwcHg7Ci0KLX0KLQotI3BhZ2UtbGlua3MgYSBpbWcgewotCWhlaWdodCA6IDUycHg7Ci0Jd2lkdGggOiA1MnB4OwotCXZlcnRpY2FsLWFsaWduIDogbWlkZGxlOwotfQotCi0jcGFnZS1saW5rcyBhOmhvdmVyLAotI3BhZ2UtbGlua3MgYTpmb2N1cywKLSNwYWdlLWxpbmtzIGE6YWN0aXZlICB7IGJvcmRlciA6IDBweDsgfQotCi0jcGFnZS1saW5rcyBhOmhvdmVyIHAsCi0jcGFnZS1saW5rcyBhOmZvY3VzIHAsCi0jcGFnZS1saW5rcyBhOmFjdGl2ZSBwICB7IG1hcmdpbiA6IDBweDsgcGFkZGluZyA6IDBweDsgfQotCi0vKiBwcm9wZXJ0aWVzIGZvciBlYWNoIG9mIHRoZSBwYWdlLWxpbmtzICAqLwotYSNvdmVydmlldyBpbWcgeyBiYWNrZ3JvdW5kLWltYWdlIDogdXJsKGdyYXBoaWNzL2ljb25zL2V0b29sL292ZXJ2aWV3NDguZ2lmKTsgfQotYSNvdmVydmlldzpob3ZlciBpbWcsCi1hI292ZXJ2aWV3OmZvY3VzIGltZywKLWEjb3ZlcnZpZXc6YWN0aXZlIGltZyB7IGJhY2tncm91bmQtaW1hZ2UgOiB1cmwoZ3JhcGhpY3MvaWNvbnMvY3Rvb2wvb3ZlcnZpZXc0OC5naWYpOyB9Ci1hI3N0ZXBzIGltZyB7IGJhY2tncm91bmQtaW1hZ2UgOiB1cmwoZ3JhcGhpY3MvaWNvbnMvZXRvb2wvZmlyc3RlcHM0OC5naWYpOyB9YSNzdGVwczpob3ZlciBpbWcsYSNzdGVwczpmb2N1cyBpbWcsYSNzdGVwczphY3RpdmUgaW1nIHsgYmFja2dyb3VuZC1pbWFnZSA6IHVybChncmFwaGljcy9pY29ucy9jdG9vbC9maXJzdGVwczQ4LmdpZik7IH0KLWEjdHV0b3JpYWxzIGltZyB7IGJhY2tncm91bmQtaW1hZ2UgOiB1cmwoZ3JhcGhpY3MvaWNvbnMvZXRvb2wvdHV0b3JpYWxzNDguZ2lmKTsgfQotYSN0dXRvcmlhbHM6aG92ZXIgaW1nLAotYSN0dXRvcmlhbHM6Zm9jdXMgaW1nLAotYSN0dXRvcmlhbHM6YWN0aXZlIGltZyB7IGJhY2tncm91bmQtaW1hZ2UgOiB1cmwoZ3JhcGhpY3MvaWNvbnMvY3Rvb2wvdHV0b3JpYWxzNDguZ2lmKTsgfQotYSN3ZWIgaW1nIHsgYmFja2dyb3VuZC1pbWFnZSA6IHVybChncmFwaGljcy9pY29ucy9ldG9vbC93ZWJyc3JjNDguZ2lmKTsgfWEjd2ViOmhvdmVyIGltZyxhI3dlYjpmb2N1cyBpbWcsYSN3ZWI6YWN0aXZlIGltZyB7IGJhY2tncm91bmQtaW1hZ2UgOiB1cmwoZ3JhcGhpY3MvaWNvbnMvY3Rvb2wvd2VicnNyYzQ4LmdpZik7IH0KLWEjc2FtcGxlcyBpbWcgeyBiYWNrZ3JvdW5kLWltYWdlIDogdXJsKGdyYXBoaWNzL2ljb25zL2V0b29sL3NhbXBsZXM0OC5naWYpOyB9Ci1hI3NhbXBsZXM6aG92ZXIgaW1nLAotYSNzYW1wbGVzOmZvY3VzIGltZywKLWEjc2FtcGxlczphY3RpdmUgaW1nIHsgYmFja2dyb3VuZC1pbWFnZSA6IHVybChncmFwaGljcy9pY29ucy9jdG9vbC9zYW1wbGVzNDguZ2lmKTsgfQotCi1hI25ld3MgaW1nIHsgYmFja2dyb3VuZC1pbWFnZSA6IHVybChncmFwaGljcy9pY29ucy9ldG9vbC93aGF0c25ldzQ4LmdpZik7IH0KLWEjbmV3czpob3ZlciBpbWcsCi1hI25ld3M6Zm9jdXMgaW1nLAotYSNuZXdzOmFjdGl2ZSBpbWcgeyBiYWNrZ3JvdW5kLWltYWdlIDogdXJsKGdyYXBoaWNzL2ljb25zL2N0b29sL3doYXRzbmV3NDguZ2lmKTsgfQotCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL3N0YW5kYnlfc3d0LnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL3N0YW5kYnlfc3d0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjNzIzMWEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9zdGFuZGJ5X3N3dC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotc3RhbmRieS5saW5rcy1iYWNrZ3JvdW5kLnBhZ2UtbGlua3Mub3ZlcnZpZXcubGluay1pY29uID0gY3NzL2dyYXBoaWNzL2ljb25zL2V0b29sL292ZXJ2aWV3NzIuZ2lmCi1zdGFuZGJ5LmxpbmtzLWJhY2tncm91bmQucGFnZS1saW5rcy5zdGVwcy5saW5rLWljb249IGNzcy9ncmFwaGljcy9pY29ucy9ldG9vbC9maXJzdGVwczcyLmdpZgotc3RhbmRieS5saW5rcy1iYWNrZ3JvdW5kLnBhZ2UtbGlua3MudHV0b3JpYWxzLmxpbmstaWNvbiA9IGNzcy9ncmFwaGljcy9pY29ucy9ldG9vbC90dXRvcmlhbHM3Mi5naWYKLXN0YW5kYnkubGlua3MtYmFja2dyb3VuZC5wYWdlLWxpbmtzLndlYi5saW5rLWljb24gPSBjc3MvZ3JhcGhpY3MvaWNvbnMvZXRvb2wvd2VicnNyYzcyLmdpZgotCi0KLXN0YW5kYnkubGlua3MtYmFja2dyb3VuZC5wYWdlLWxpbmtzLm92ZXJ2aWV3LmhvdmVyLWljb24gPSBjc3MvZ3JhcGhpY3MvaWNvbnMvY3Rvb2wvb3ZlcnZpZXc3Mi5naWYKLXN0YW5kYnkubGlua3MtYmFja2dyb3VuZC5wYWdlLWxpbmtzLnN0ZXBzLmhvdmVyLWljb24gPSBjc3MvZ3JhcGhpY3MvaWNvbnMvY3Rvb2wvZmlyc3RlcHM3Mi5naWYKLXN0YW5kYnkubGlua3MtYmFja2dyb3VuZC5wYWdlLWxpbmtzLnR1dG9yaWFscy5ob3Zlci1pY29uID0gY3NzL2dyYXBoaWNzL2ljb25zL2N0b29sL3R1dG9yaWFsczcyLmdpZgotc3RhbmRieS5saW5rcy1iYWNrZ3JvdW5kLnBhZ2UtbGlua3Mud2ViLmhvdmVyLWljb24gPSBjc3MvZ3JhcGhpY3MvaWNvbnMvY3Rvb2wvd2VicnNyYzcyLmdpZgotCi0KLXN0YW5kYnkubGlua3MtYmFja2dyb3VuZC5wYWdlLWxpbmtzLmxheW91dC52c3BhY2luZyA9IDMwCi1zdGFuZGJ5LmxheW91dC52c3BhY2luZyA9IDM1Ci1zdGFuZGJ5LnNob3ctbGluay1kZXNjcmlwdGlvbiA9IGZhbHNlCi1zdGFuZGJ5LnNob3ctaG9tZS1wYWdlLW5hdmlnYXRpb24gPSBmYWxzZQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvdG91ci1wbGFjZWhvbGRlci5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy90b3VyLXBsYWNlaG9sZGVyLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyNDRiZjQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy90b3VyLXBsYWNlaG9sZGVyLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi08aHRtbD4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotPGhlYWQ+Ci08dGl0bGU+RWNsaXBzZSBQcm9jZXNzIEZyYW1ld29yayBDb21wb3NlciBUb3VyPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5PgotPGgzPkVjbGlwc2UgUHJvY2VzcyBGcmFtZXdvcmsgQ29tcG9zZXIgVG91cjwvaDM+Ci08YnIvPgotPGg1PiBGbGFzaCBiYXNlZCBtdWx0aW1lZGlhIGNvbnRlbnQsIHRvIGJlIHByb2R1Y2VkPC9oNT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvdG91ci1zd3QucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvdG91ci1zd3QucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWFjZmUzYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL3RvdXItc3d0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLW92ZXJ2aWV3LnBhZ2UtY29udGVudC5vdmVydmlldy1saW5rcy5wZGUubGluay1pY29uID0gY3NzL25ld19ncmFwaGljcy9vYmpfNDgvcGx1Z2luX29iai5naWYKLQotdHV0b3JpYWxzLnBhZ2UtY29udGVudC5wZGUubGF5b3V0Lm5jb2x1bW5zID0gMgotdHV0b3JpYWxzLnBhZ2UtY29udGVudC5wZGUucmNwLmxpbmstaWNvbiA9IGNzcy9uZXdfZ3JhcGhpY3Mvb2JqXzQ4L3JjcGFwcF9vYmouZ2lmCi10dXRvcmlhbHMucGFnZS1jb250ZW50LnBkZS5wZGUtaGVsbG8td29ybGQubGluay1pY29uID0gY3NzL25ld19ncmFwaGljcy9vYmpfNDgvcGx1Z2luX29iai5naWYKLXR1dG9yaWFscy5wYWdlLWNvbnRlbnQucGRlLmZlYXR1cmVzLmxpbmstaWNvbiA9IGNzcy9uZXdfZ3JhcGhpY3Mvb2JqXzQ4L2ZlYXR1cmVzX29iai5naWYKLQotbmV3cy5sYXlvdXQubmNvbHVtbnMgPSAyCi1vdmVydmlldy5sYXlvdXQubmNvbHVtbnMgPSAyCi1vdmVydmlldy5sYXlvdXQubGluay12c3BhY2luZyA9IDQwCi1maXJzdHN0ZXBzLmxheW91dC5uY29sdW1ucyA9IDEKLXR1dG9yaWFscy5wYWdlLWNvbnRlbnQubGF5b3V0Lm5jb2x1bW5zID0gMgotc2FtcGxlcy5wYWdlLWNvbnRlbnQubGF5b3V0Lm5jb2x1bW5zID0gMgotd2VicmVzLnBhZ2UtY29udGVudC5sYXlvdXQubmNvbHVtbnMgPSAxCi0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvdG91ci5jc3MgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL3RvdXIuY3NzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMWVhNjVkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvdG91ci5jc3MKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICovCi0KLWJvZHkgewotCWJhY2tncm91bmQtaW1hZ2UgOiB1cmwoZ3JhcGhpY3MvY29udGVudHBhZ2Uvb3ZlcnZpZXdfd3RyLmpwZyk7Ci19Ci0KLS5wYWdlIHsgbWluLWhlaWdodCA6IDcwMHB4OyB9Ci0KLS8qIHNob3cgdGhlICJzZWxlY3RlZCIgaW1hZ2UgZm9yIHRoaXMgcGFnZSAqLwotI25hdmlnYXRpb24tbGlua3MgYSNvdmVydmlldyBpbWcsICNuYXZpZ2F0aW9uLWxpbmtzIGEjb3ZlcnZpZXc6aG92ZXIgaW1nIHsgYmFja2dyb3VuZC1pbWFnZSA6IHVybChncmFwaGljcy9pY29ucy9jdG9vbC9vdmVydmlldzQ4c2VsLmdpZik7IH0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvdG91ci5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy90b3VyLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4Y2FkYzkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy90b3VyLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLTxkaXYgaWQ9IndlbGNvbWUtYmFubmVyIj4KLSAJPE9CSkVDVCBjbGFzc2lkPSJjbHNpZDpEMjdDREI2RS1BRTZELTExY2YtOTZCOC00NDQ1NTM1NDAwMDAiIGNvZGViYXNlPSJodHRwOi8vZG93bmxvYWQubWFjcm9tZWRpYS5jb20vcHViL3Nob2Nrd2F2ZS9jYWJzL2ZsYXNoL3N3Zmxhc2guY2FiI3ZlcnNpb249NiwwLDAsMCIgV0lEVEg9Ijc4MCIgSEVJR0hUPSI0MjUiIGlkPSJ0b3VyIiBBTElHTj0iIj4KLQk8UEFSQU0gTkFNRT1tb3ZpZSBWQUxVRT0iY3NzL3RvdXIvdG91ci5zd2YiPgotIAk8UEFSQU0gTkFNRT1xdWFsaXR5IFZBTFVFPWhpZ2g+Ci0gCTxQQVJBTSBOQU1FPWJnY29sb3IgVkFMVUU9I0ZGRkZGRj4KLSAJPFBBUkFNIE5BTUU9Rmxhc2hWYXJzIFZBTFVFPSJ0b3VycGF0aD1jc3MvdG91ciI+Ci0gCTxFTUJFRCBzcmM9ImNzcy90b3VyL3RvdXIuc3dmIiBmbGFzaHZhcnM9InRvdXJwYXRoPWNzcy90b3VyIiBxdWFsaXR5PWhpZ2ggYmdjb2xvcj0jRkZGRkZGICBXSURUSD0iNzgwIiBIRUlHSFQ9IjQyNSIgTkFNRT0idG91ciIgQUxJR049IiIgVFlQRT0iYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2giIFBMVUdJTlNQQUdFPSJodHRwOi8vd3d3Lm1hY3JvbWVkaWEuY29tL2dvL2dldGZsYXNocGxheWVyIj48L0VNQkVEPgotCTwvT0JKRUNUPgotPC9kaXY+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL3R1dG9yaWFscy9zd3QucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvdHV0b3JpYWxzL3N3dC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MmI3ODc5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvdHV0b3JpYWxzL3N3dC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotdHV0b3JpYWxzLmxheW91dC5uY29sdW1ucyA9IDIKLXR1dG9yaWFscy5wYWdlLWNvbnRlbnQubGF5b3V0LnZzcGFjaW5nID0gNDAKLQotdHV0b3JpYWxzLnBhZ2UtY29udGVudC50dXRvcmlhbHMtbGlua3MubGF5b3V0Lm5jb2x1bW5zID0gMgotdHV0b3JpYWxzLnBhZ2UtY29udGVudC50dXRvcmlhbHMtbGlua3MubGF5b3V0LnZzcGFjaW5nID0gMzUKLQotdHV0b3JpYWxzLnN1YnRpdGxlLWlkID0gdHV0b3JpYWxzL3BhZ2UtY29udGVudC9wYWdlLXRpdGxlCi10dXRvcmlhbHMuZGVzY3JpcHRpb24taWQgPSB0dXRvcmlhbHMvcGFnZS1jb250ZW50L3BhZ2UtZGVzY3JpcHRpb24KLQotdHV0b3JpYWxzLnBhZ2UtY29udGVudC50dXRvcmlhbHMtbGlua3MuZXBmLXR1dC1uYXZpZ2F0ZS5saW5rLWljb24gPSBjc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvdF9uYXZ1aV9vYmouZ2lmCi10dXRvcmlhbHMucGFnZS1jb250ZW50LnR1dG9yaWFscy1saW5rcy5lcGYtdHV0LXByb2Nlc3MubGluay1pY29uID0gY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L3Rfd29ya3Byb2Nfb2JqLmdpZgotdHV0b3JpYWxzLnBhZ2UtY29udGVudC50dXRvcmlhbHMtbGlua3MuZXBmLXR1dC1lbGVtZW50LmxpbmstaWNvbiA9IGNzcy9ncmFwaGljcy9pY29ucy9vYmo0OC90X21ldGhjb250X29iai5naWYKLXR1dG9yaWFscy5wYWdlLWNvbnRlbnQudHV0b3JpYWxzLWxpbmtzLmVwZi10dXQtcHViZXhwLmxpbmstaWNvbiA9IGNzcy9ncmFwaGljcy9pY29ucy9vYmo0OC90X3B1YmV4cF9vYmouZ2lmCi10dXRvcmlhbHMucGFnZS1jb250ZW50LnR1dG9yaWFscy1saW5rcy5lcGYtdHV0LWNvbnRlbnQubGluay1pY29uID0gY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L3RfcmVtZXRoY29udF9vYmouZ2lmCi0jb3ZlcnZpZXcucGFnZS1jb250ZW50Lm92ZXJ2aWV3LWxpbmtzLmJhc2ljcy5saW5rLWljb24gPSBjc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvd2JiYXNpY3Nfb2JqLmdpZgotI292ZXJ2aWV3LnBhZ2UtY29udGVudC5vdmVydmlldy1saW5rcy50ZWFtLmxpbmstaWNvbiA9IGNzcy9ncmFwaGljcy9pY29ucy9vYmo0OC90ZWFtc3VwX29iai5naWYKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvdHV0b3JpYWxzL3R1dG9yaWFscy5jc3MgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL3R1dG9yaWFscy90dXRvcmlhbHMuY3NzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNGE5NGIxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvdHV0b3JpYWxzL3R1dG9yaWFscy5jc3MKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICovCi0KLWJvZHkgewotCWJhY2tncm91bmQtaW1hZ2UgOiB1cmwoLi4vZ3JhcGhpY3MvY29udGVudHBhZ2UvdHV0b3JpYWxzX3d0ci5qcGcpOwotfQotCi0ucGFnZSB7IG1pbi1oZWlnaHQgOiA3MDBweDsgfQotCi0vKiBzaG93IHRoZSAic2VsZWN0ZWQiIGltYWdlIGZvciB0aGlzIHBhZ2UgKi8KLSNuYXZpZ2F0aW9uLWxpbmtzIGEjdHV0b3JpYWxzIGltZywgI25hdmlnYXRpb24tbGlua3MgYSN0dXRvcmlhbHM6aG92ZXIgaW1nIHsgYmFja2dyb3VuZC1pbWFnZSA6IHVybCguLi9ncmFwaGljcy9pY29ucy9jdG9vbC90dXRvcmlhbHM0OHNlbC5naWYpOyB9Ci0KLS8qIAotICogU2V0IHVwIHRoZSBjb250ZW50IG9mIHRoZSB0dXRvcmlhbHMgcGFnZSBpbnRvIHR3bwotICogY29sdW1ucyB0aGF0IGFyZSBjZW50ZXJlZCBpbiB0aGUgcGFnZQotICovCi0KLQotI3R1dG9yaWFscy1saW5rcyB7CXRleHQtYWxpZ24gOiBsZWZ0Owl3aWR0aCA6IDc2MHB4OwkvKiBUbyBjZW50ZXIgaW4gTW96IChoYXZlIHRvIHVzZSB0ZXh0LWFsaWduIGZvciBJRSkgKi8JbWFyZ2luIDogMHB4IGF1dG87fSN0dXRvcmlhbHMtbGlua3MgYSB7IAl3aWR0aCA6IDM3MHB4Owl0ZXh0LWFsaWduIDogbGVmdDsgCW1hcmdpbi1sZWZ0IDogNXB4OwltYXJnaW4tcmlnaHQgOiA1cHg7CW1hcmdpbi10b3AgOiA1cHg7CW1hcmdpbi1ib3R0b20gOiAtMjBweDsJdmVydGljYWwtYWxpZ24gOiB0b3A7fSN0dXRvcmlhbHMtbGlua3MgPiBhIHsgdmVydGljYWwtYWxpZ24gOiBtaWRkbGU7IH0jdHV0b3JpYWxzLWxpbmtzIGEgaW1nIHsJaGVpZ2h0IDogNTdweDsJd2lkdGggOiA1N3B4Owl2ZXJ0aWNhbC1hbGlnbiA6IG1pZGRsZTt9CSN0dXRvcmlhbHMtbGlua3MgYSAubGluay1sYWJlbCB7CWRpc3BsYXkgOiBibG9jazsJd2lkdGggOiAzMDBweDsJcG9zaXRpb24gOiByZWxhdGl2ZTsJdG9wIDogLTUwcHg7CWxlZnQgOiA2MHB4O30jdHV0b3JpYWxzLWxpbmtzIGEgcCAudGV4dCB7CWRpc3BsYXkgOiBibG9jazsJd2lkdGggOiAzMDBweDsJcG9zaXRpb24gOiByZWxhdGl2ZTsJdG9wIDogLTQ1cHg7CWxlZnQgOiA1M3B4O30vKiBTcGVjaWFsIGNhc2UgZm9yIE1vemlsbGEsIGJlY2F1c2UgdGhlIGxpbmtzIGFyZSBkaXNwbGF5ZWQgICBpbiAxIHZlcnRpY2FsIGNvbHVtbiBpbnN0ZWFkIG9mIDIgY2VudGVyZWQgY29sdW1ucyAqLyN0dXRvcmlhbHMtbGlua3MgPiBhIHsgCXdpZHRoIDogNzAwcHg7IH0jdHV0b3JpYWxzLWxpbmtzIGEgPiAubGluay1sYWJlbCB7IHdpZHRoIDogNzAwcHg7IH0jdHV0b3JpYWxzLWxpbmtzIGEgcCA+IC50ZXh0IHsgd2lkdGggOiA3MDBweDsgfSN0dXRvcmlhbHMtbGlua3MgYTpob3ZlciB7IGJvcmRlci1yaWdodCA6IDVweDsgfWEjYmFzaWNzIGltZyB7IGJhY2tncm91bmQtaW1hZ2UgOiB1cmwoLi4vZ3JhcGhpY3MvaWNvbnMvb2JqNDgvd2JiYXNpY3Nfb2JqLmdpZik7IH1hI2Jhc2ljczpob3ZlciBpbWcgeyBiYWNrZ3JvdW5kLWltYWdlIDogdXJsKC4uL2dyYXBoaWNzL2ljb25zL29iajQ4L3diYmFzaWNzaG92X29iai5naWYpOyB9YSN0ZWFtIGltZyB7IGJhY2tncm91bmQtaW1hZ2UgOiB1cmwoLi4vZ3JhcGhpY3MvaWNvbnMvb2JqNDgvdGVhbXN1cF9vYmouZ2lmKTsgfWEjdGVhbTpob3ZlciBpbWcgeyBiYWNrZ3JvdW5kLWltYWdlIDogdXJsKC4uL2dyYXBoaWNzL2ljb25zL29iajQ4L3RlYW1zdXBob3Zfb2JqLmdpZik7IH0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvdW1hX2h1bXAuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy91bWFfaHVtcC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhMzBmYjAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy91bWFfaHVtcC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL3dlYnJlc291cmNlcy93ZWJyZXNvdXJjZXMuY3NzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy93ZWJyZXNvdXJjZXMvd2VicmVzb3VyY2VzLmNzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTIzYTc5NS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL3dlYnJlc291cmNlcy93ZWJyZXNvdXJjZXMuY3NzCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqLwotCi0vKgotICogd2VicmVzb3VyY2VzLmNzcyBpcyBhIHRlbXBsYXRlIGZvciB0aGUgZ3JvdXAgc3BlY2lmaWMgY3NzIHNldHRpbmdzCi0gKi8KLSAKLS8qCi0gKiBiYWNrZ3JvdW5kIHdhdGVybWFyayAtIGdyb3VwIHNwZWNpZmljCi0gKi8KLQotYm9keSB7Ci0JYmFja2dyb3VuZC1pbWFnZSA6IHVybChncmFwaGljcy9jb250ZW50cGFnZS93ZWJyc3JjX3d0ci5qcGcpOwotfQotCi0ucGFnZSB7IG1pbi1oZWlnaHQgOiA3MDBweDsgfQotCi0vKgotICogc2hvdyB0aGUgInNlbGVjdGVkIiBpbWFnZSBmb3IgdGhpcyBwYWdlIC0gVGhpcyBpcyBncm91cCBzcGVjaWZpYwotICovCi0KLSNuYXZpZ2F0aW9uLWxpbmtzIGEjd2ViIGltZywgI25hdmlnYXRpb24tbGlua3MgYSN3ZWI6aG92ZXIgaW1nIHsgYmFja2dyb3VuZC1pbWFnZSA6IHVybCguLi9ncmFwaGljcy9pY29ucy9jdG9vbC93ZWJyc3JjNDhzZWwuZ2lmKTsgfQotCi0vKiAKLSAqIFNldCB1cCB0aGUgT3ZlcnZpZXcgbGlua3MgdG8gYmUgZGlzcGxheWVkIGluIHR3byBjb2x1bW5zCi0gKiB0aGF0IGFyZSBjZW50ZXJlZCBpbiB0aGUgbWlkZGxlIG9mIHRoZSBwYWdlLgotICovCi0KLSN3ZWItbGlua3Mgewl0ZXh0LWFsaWduIDogbGVmdDsJd2lkdGggOiA3NjBweDsJLyogVG8gY2VudGVyIGluIE1veiAoaGF2ZSB0byB1c2UgdGV4dC1hbGlnbiBmb3IgSUUpICovCW1hcmdpbiA6IDBweCBhdXRvO30KLSN3ZWItbGlua3MgYSB7IAl3aWR0aCA6IDM3MHB4Owl0ZXh0LWFsaWduIDogbGVmdDsgCW1hcmdpbi1sZWZ0IDogNXB4OwltYXJnaW4tcmlnaHQgOiA1cHg7CW1hcmdpbi10b3AgOiA1cHg7CW1hcmdpbi1ib3R0b20gOiAtMjBweDsJdmVydGljYWwtYWxpZ24gOiB0b3A7fQotI3dlYi1saW5rcyA+IGEgeyB2ZXJ0aWNhbC1hbGlnbiA6IG1pZGRsZTsgfQotI3dlYi1saW5rcyBhIGltZyB7CWhlaWdodCA6IDU3cHg7CXdpZHRoIDogNTdweDsJdmVydGljYWwtYWxpZ24gOiBtaWRkbGU7fQkKLSN3ZWItbGlua3MgYSAubGluay1sYWJlbCB7CWRpc3BsYXkgOiBibG9jazsJd2lkdGggOiAzMDBweDsJcG9zaXRpb24gOiByZWxhdGl2ZTsJdG9wIDogLTUwcHg7CWxlZnQgOiA2MHB4O30KLSN3ZWItbGlua3MgYSBwIC50ZXh0IHsJZGlzcGxheSA6IGJsb2NrOwl3aWR0aCA6IDMwMHB4Owlwb3NpdGlvbiA6IHJlbGF0aXZlOwl0b3AgOiAtNDVweDsJbGVmdCA6IDUzcHg7fQotCi0vKiBTcGVjaWFsIGNhc2UgZm9yIE1vemlsbGEsIGJlY2F1c2UgdGhlIGxpbmtzIGFyZSBkaXNwbGF5ZWQKLSAgIGluIDEgdmVydGljYWwgY29sdW1uIGluc3RlYWQgb2YgMiBjZW50ZXJlZCBjb2x1bW5zICovCi0jd2ViLWxpbmtzID4gYSB7IAl3aWR0aCA6IDcwMHB4OyB9Ci0jd2ViLWxpbmtzIGEgPiAubGluay1sYWJlbCB7IHdpZHRoIDogNzAwcHg7IH0KLSN3ZWItbGlua3MgYSBwID4gLnRleHQgeyB3aWR0aCA6IDcwMHB4OyB9Ci0KLSN3ZWItbGlua3MgYTpob3ZlciB7IGJvcmRlci1yaWdodCA6IDVweDsgfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy93ZWJyZXNvdXJjZXMvd2VicmVzb3VyY2VzLnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL3dlYnJlc291cmNlcy93ZWJyZXNvdXJjZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTRhYmI5Yi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL3dlYnJlc291cmNlcy93ZWJyZXNvdXJjZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotd2ViLmxheW91dC5uY29sdW1ucyA9IDIKLXdlYi5wYWdlLWNvbnRlbnQubGF5b3V0LnZzcGFjaW5nID0gNDAKLQotd2ViLnBhZ2UtY29udGVudC53ZWItbGlua3MubGF5b3V0Lm5jb2x1bW5zID0gMgotd2ViLnBhZ2UtY29udGVudC53ZWItbGlua3MubGF5b3V0LnZzcGFjaW5nID0gMzUKLQotd2ViLnN1YnRpdGxlLWlkID0gd2ViL3BhZ2UtY29udGVudC9wYWdlLXRpdGxlCi13ZWIuZGVzY3JpcHRpb24taWQgPSB3ZWIvcGFnZS1jb250ZW50L3BhZ2UtZGVzY3JpcHRpb24KLQotd2ViLnBhZ2UtY29udGVudC53ZWItbGlua3MuZXBmX3Jlc291cmNlLmxpbmstaWNvbiA9IGNzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9lcGZfcmVzb3VyY2UuZ2lmCi0KLSNuZXdzLm5ldy1hbmQtbm90ZXdvcnRoeS5saW5rLWljb24gPSBjc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvbmV3X29iai5naWYKLSNuZXdzLm1pZ3JhdGlvbi5saW5rLWljb24gPSBjc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvbWlncmF0ZV9vYmouZ2lmCi0jbmV3cy51cGRhdGVzLmxpbmstaWNvbiA9IGNzcy9ncmFwaGljcy9pY29ucy9vYmo0OC91cGRhdGVzX29iai5naWYKLSNuZXdzLmVjbGlwc2UubGluay1pY29uID0gY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L2NvbW11bml0eV9vYmouZ2lmClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy93aGF0c25ldy9zd3QucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3Mvd2hhdHNuZXcvc3d0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwNmRkYjcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy93aGF0c25ldy9zd3QucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotbmV3cy5wYWdlLWNvbnRlbnQubmV3cy1saW5rcy5sYXlvdXQubmNvbHVtbnMgPSAyCi1uZXdzLnBhZ2UtY29udGVudC5uZXdzLWxpbmtzLmxheW91dC52c3BhY2luZyA9IDMwCi0KLW5ld3MucGFnZS1jb250ZW50Lm5ld3MtbGlua3MubmV3LWFuZC1ub3Rld29ydGh5LmxpbmstaWNvbiA9IGNzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9uZXdfb2JqLmdpZgotbmV3cy5wYWdlLWNvbnRlbnQubmV3cy1saW5rcy5taWdyYXRpb24ubGluay1pY29uID0gY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L21pZ3JhdGVfb2JqLmdpZgotbmV3cy5wYWdlLWNvbnRlbnQubmV3cy1saW5rcy51cGRhdGVzLmxpbmstaWNvbiA9IGNzcy9ncmFwaGljcy9pY29ucy9vYmo0OC91cGRhdGVzX29iai5naWYKLW5ld3MucGFnZS1jb250ZW50Lm5ld3MtbGlua3MuZWNsaXBzZS5saW5rLWljb24gPSBjc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvY29tbXVuaXR5X29iai5naWYKLQotbmV3cy5wYWdlLWNvbnRlbnQubm90ZXdvcnRoeS1saW5rcy5sYXlvdXQubmNvbHVtbnMgPSAyCi1uZXdzLnBhZ2UtY29udGVudC5ub3Rld29ydGh5LWxpbmtzLmxheW91dC52c3BhY2luZyA9IDE1IAotbmV3cy5wYWdlLWNvbnRlbnQubmV3cy1saW5rcy5sYXlvdXQudnNwYWNpbmcgPSAxNSAKLW5ld3MucGFnZS1jb250ZW50LmxheW91dC52c3BhY2luZyA9IDQwIAotCi1uZXdzLmxpbmstaWNvbiA9IGNzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9uZXdfb2JqLmdpZgotCi1uZXdzLnN1YnRpdGxlLWlkID0gbmV3cy9wYWdlLWNvbnRlbnQvcGFnZS10aXRsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy93aGF0c25ldy93aGF0c25ldy5jc3MgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL3doYXRzbmV3L3doYXRzbmV3LmNzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjA1MzYwYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL3doYXRzbmV3L3doYXRzbmV3LmNzcworKysgL2Rldi9udWxsCkBAIC0xLDE0MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICovCi0KLWJvZHkgewotCWJhY2tncm91bmQtaW1hZ2UgOiB1cmwoLi4vZ3JhcGhpY3MvY29udGVudHBhZ2Uvd2hhdHNuZXdfd3RyLmpwZyk7Ci19Ci0KLS5wYWdlIHsgbWluLWhlaWdodCA6IDUwMHB4OyB9Ci0KLS8qIHNob3cgdGhlICJzZWxlY3RlZCIgaW1hZ2UgZm9yIHRoaXMgcGFnZSAqLwotI25hdmlnYXRpb24tbGlua3MgYSNuZXdzIGltZywgI25hdmlnYXRpb24tbGlua3MgYSNuZXdzOmhvdmVyIGltZyB7IGJhY2tncm91bmQtaW1hZ2UgOiB1cmwoLi4vZ3JhcGhpY3MvaWNvbnMvY3Rvb2wvd2hhdHNuZXc0OHNlbC5naWYpOyB9Ci0KLS8qIAotICogU2V0IHVwIHRoZSBjb250ZW50IG9mIHRoZSBXaGF0cyBOZXcgcGFnZSB0byBiZSBkaXNwbGF5ZWQgaW4gCi0gKiB0d28gY29sdW1ucyB0aGF0IGFyZSBjZW50ZXJlZCBpbiB0aGUgbWlkZGxlIG9mIHRoZSBwYWdlLgotICovCi0KLSNub3Rld29ydGh5LWxpbmtzIHsKLQl0ZXh0LWFsaWduIDogbGVmdDsKLQl3aWR0aCA6IDc2MHB4OwotCS8qIFRvIGNlbnRlciBpbiBNb3ogKGhhdmUgdG8gdXNlIHRleHQtYWxpZ24gZm9yIElFKSAqLwkKLQltYXJnaW46IDBweCBhdXRvOwotfQotCi0jbm90ZXdvcnRoeS1saW5rcyBhIHsgCi0Jd2lkdGggOiAzNzBweDsKLQl0ZXh0LWFsaWduIDogbGVmdDsgCi0JbWFyZ2luLWxlZnQgOiA1cHg7Ci0JbWFyZ2luLXJpZ2h0IDogNXB4OwotCW1hcmdpbi10b3AgOiA1cHg7Ci0JbWFyZ2luLWJvdHRvbSA6IC0yMHB4OwotCXZlcnRpY2FsLWFsaWduIDogdG9wOwotfQotCi0jbm90ZXdvcnRoeS1saW5rcyA+IGEgeyB2ZXJ0aWNhbC1hbGlnbiA6IG1pZGRsZTsgfQotCi0jbm90ZXdvcnRoeS1saW5rcyBhIGltZyB7Ci0JaGVpZ2h0IDogNTdweDsKLQl3aWR0aCA6IDU3cHg7Ci0JdmVydGljYWwtYWxpZ24gOiBtaWRkbGU7Ci19Ci0KLSNub3Rld29ydGh5LWxpbmtzIGEgLmxpbmstbGFiZWwgewotCWRpc3BsYXkgOiBibG9jazsKLQl3aWR0aCA6IDMwMHB4OwotCXBvc2l0aW9uIDogcmVsYXRpdmU7Ci0JdG9wIDogLTUwcHg7Ci0JbGVmdCA6IDYwcHg7Ci19Ci0KLSNub3Rld29ydGh5LWxpbmtzIGEgcCAudGV4dCB7Ci0JZGlzcGxheSA6IGJsb2NrOwotCXdpZHRoIDogMzAwcHg7Ci0JcG9zaXRpb24gOiByZWxhdGl2ZTsKLQl0b3AgOiAtNDVweDsKLQlsZWZ0IDogNTNweDsKLX0KLQotLyogU3BlY2lhbCBjYXNlIGZvciBNb3ppbGxhLCBiZWNhdXNlIHRoZSBsaW5rcyBhcmUgZGlzcGxheWVkCi0gICBpbiAxIHZlcnRpY2FsIGNvbHVtbiBpbnN0ZWFkIG9mIDIgY2VudGVyZWQgY29sdW1ucyAqLwotI25vdGV3b3J0aHktbGlua3MgPiBhIHsgd2lkdGggOiA3MDBweDsgfQotI25vdGV3b3J0aHktbGlua3MgYSA+IC5saW5rLWxhYmVsIHsgd2lkdGggOiA3MDBweDsgfQotI25vdGV3b3J0aHktbGlua3MgYSBwID4gLnRleHQgeyB3aWR0aCA6IDcwMHB4OyB9Ci0KLSNub3Rld29ydGh5LWxpbmtzIGE6aG92ZXIgeyBib3JkZXItcmlnaHQgOiA1cHg7IH0KLQotI25vdGV3b3J0aHktbGlua3MgYSBpbWcgeyBiYWNrZ3JvdW5kLWltYWdlIDogdXJsKC4uL2dyYXBoaWNzL2ljb25zL29iajQ4L25ld19vYmouZ2lmKTsgfQotI25vdGV3b3J0aHktbGlua3MgYTpob3ZlciBpbWcgeyBiYWNrZ3JvdW5kLWltYWdlIDogdXJsKC4uL2dyYXBoaWNzL2ljb25zL29iajQ4L25ld2hvdl9vYmouZ2lmKTsgfQotCi0KLSNuZXdzLWxpbmtzIHsKLQl0ZXh0LWFsaWduIDogbGVmdDsKLQl3aWR0aCA6IDc2MHB4OwotCS8qIFRvIGNlbnRlciBpbiBNb3ogKGhhdmUgdG8gdXNlIHRleHQtYWxpZ24gZm9yIElFKSAqLwkKLQltYXJnaW46IDBweCBhdXRvOwotfQotCi0jbmV3cy1saW5rcyBhIHsgCi0Jd2lkdGggOiAzNzBweDsKLQl0ZXh0LWFsaWduIDogbGVmdDsgCi0JbWFyZ2luLWxlZnQgOiA1cHg7Ci0JbWFyZ2luLXJpZ2h0IDogNXB4OwotCW1hcmdpbi10b3AgOiA1cHg7Ci0JbWFyZ2luLWJvdHRvbSA6IC0yMHB4OwotCXZlcnRpY2FsLWFsaWduIDogdG9wOwotfQotCi0jbmV3cy1saW5rcyA+IGEgeyB2ZXJ0aWNhbC1hbGlnbiA6IG1pZGRsZTsgfQotCi0jbmV3cy1saW5rcyBhIGltZyB7Ci0JaGVpZ2h0IDogNTdweDsKLQl3aWR0aCA6IDU3cHg7Ci0JdmVydGljYWwtYWxpZ24gOiBtaWRkbGU7Ci19Ci0KLSNuZXdzLWxpbmtzIGEgLmxpbmstbGFiZWwgewotCWRpc3BsYXkgOiBibG9jazsKLQl3aWR0aCA6IDMwMHB4OwotCXBvc2l0aW9uIDogcmVsYXRpdmU7Ci0JdG9wIDogLTUwcHg7Ci0JbGVmdCA6IDYwcHg7Ci19Ci0KLSNuZXdzLWxpbmtzIGEgcCAudGV4dCB7Ci0JZGlzcGxheSA6IGJsb2NrOwotCXdpZHRoIDogMzAwcHg7Ci0JcG9zaXRpb24gOiByZWxhdGl2ZTsKLQl0b3AgOiAtNDVweDsKLQlsZWZ0IDogNTNweDsKLX0KLQotLyogU3BlY2lhbCBjYXNlIGZvciBNb3ppbGxhLCBiZWNhdXNlIHRoZSBsaW5rcyBhcmUgZGlzcGxheWVkCi0gICBpbiAxIHZlcnRpY2FsIGNvbHVtbiBpbnN0ZWFkIG9mIDIgY2VudGVyZWQgY29sdW1ucyAqLwotI25ld3MtbGlua3MgPiBhIHsgCXdpZHRoIDogNzAwcHg7IH0KLSNuZXdzLWxpbmtzIGEgPiAubGluay1sYWJlbCB7IHdpZHRoIDogNzAwcHg7IH0KLSNuZXdzLWxpbmtzIGEgcCA+IC50ZXh0IHsgd2lkdGggOiA3MDBweDsgfQotCi0jbmV3cy1saW5rcyBhOmhvdmVyIHsgYm9yZGVyLXJpZ2h0IDogNXB4OyB9Ci0KLWEjbmV3LWFuZC1ub3Rld29ydGh5IGltZyB7IGJhY2tncm91bmQtaW1hZ2UgOiB1cmwoLi4vZ3JhcGhpY3MvaWNvbnMvb2JqNDgvbmV3X29iai5naWYpOyB9Ci1hI25ldy1hbmQtbm90ZXdvcnRoeTpob3ZlciBpbWcgeyBiYWNrZ3JvdW5kLWltYWdlIDogdXJsKC4uL2dyYXBoaWNzL2ljb25zL29iajQ4L25ld2hvdl9vYmouZ2lmKTsgfQotCi1hI21pZ3JhdGlvbiBpbWcgeyBiYWNrZ3JvdW5kLWltYWdlIDogdXJsKC4uL2dyYXBoaWNzL2ljb25zL29iajQ4L21pZ3JhdGVfb2JqLmdpZik7IH0KLWEjbWlncmF0aW9uOmhvdmVyIGltZyB7IGJhY2tncm91bmQtaW1hZ2UgOiB1cmwoLi4vZ3JhcGhpY3MvaWNvbnMvb2JqNDgvbWlncmF0ZWhvdl9vYmouZ2lmKTsgfQotCi1hI3VwZGF0ZXMgaW1nIHsgYmFja2dyb3VuZC1pbWFnZSA6IHVybCguLi9ncmFwaGljcy9pY29ucy9vYmo0OC91cGRhdGVzX29iai5naWYpOyB9Ci1hI3VwZGF0ZXM6aG92ZXIgaW1nIHsgYmFja2dyb3VuZC1pbWFnZSA6IHVybCguLi9ncmFwaGljcy9pY29ucy9vYmo0OC91cGRhdGVzaG92X29iai5naWYpOyB9Ci0KLWEjZWNsaXBzZSBpbWcgeyBiYWNrZ3JvdW5kLWltYWdlIDogdXJsKC4uL2dyYXBoaWNzL2ljb25zL29iajQ4L2NvbW11bml0eV9vYmouZ2lmKTsgfQotYSNlY2xpcHNlOmhvdmVyIGltZyB7IGJhY2tncm91bmQtaW1hZ2UgOiB1cmwoLi4vZ3JhcGhpY3MvaWNvbnMvb2JqNDgvY29tbXVuaXR5aG92X29iai5naWYpOyB9Ci0KLQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2hlbHAvYm9vay54bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vaGVscC9ib29rLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWNhYTBhNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vaGVscC9ib29rLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotPHRvYyBsYWJlbD0iRVBGIENvbXBvc2VyIEhlbHAgUGFnZSIgIHRvcGljPSJodG1sL2Jvb2suaHRtbCI+Ci0JPHRvcGljIGxhYmVsPSJFUEYgT3ZlcnZpZXciIGhyZWY9Imh0bWwvb3ZlcnZpZXcuaHRtbCIvPgotCTx0b3BpYyBsYWJlbD0iRVBGIFR1dG9yaWFsIiBocmVmPSJodG1sL3R1dG9yaWFsMy5odG1sIi8+Ci08L3RvYz4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9pY29ucy9mdWxsL29iajE2L3Byb2R1Y3QuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2ljb25zL2Z1bGwvb2JqMTYvcHJvZHVjdC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkYzI5MTIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2ljb25zL2Z1bGwvb2JqMTYvcHJvZHVjdC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vaW50cm9Db250ZW50LnhtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9pbnRyb0NvbnRlbnQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZTYyOTFkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9pbnRyb0NvbnRlbnQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzU4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04IiA/PgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08aW50cm9Db250ZW50PgotCi0gICAgPHBhZ2UgYWx0LXN0eWxlPSJjc3Mvcm9vdF9zd3QucHJvcGVydGllcyIgc3R5bGU9ImNzcy9yb290LmNzcyIgaWQ9InJvb3QiIHN0eWxlLWlkPSJwYWdlIj4KLSAgICAgICAgPHRpdGxlIHN0eWxlLWlkPSJpbnRyby1oZWFkZXIiPkVjbGlwc2UgUHJvY2VzcyBGcmFtZXdvcmsgQ29tcG9zZXI8L3RpdGxlPgotICAgICAgICA8Z3JvdXAgaWQ9ImxpbmtzLWJhY2tncm91bmQiPgotICAgICAgICAgICAgPGdyb3VwIGlkPSJwYWdlLWxpbmtzIj4KLSAgICAgICAgICAgICAgICA8bGluayBsYWJlbD0iT3ZlcnZpZXciIHVybD0iaHR0cDovL29yZy5lY2xpcHNlLnVpLmludHJvL3Nob3dQYWdlP2lkPW92ZXJ2aWV3IiBpZD0ib3ZlcnZpZXciIHN0eWxlLWlkPSJsZWZ0Ij4KLSAgICAgICAgICAgICAgICAgICAgPHRleHQ+RmluZCBvdXQgd2hhdCBFY2xpcHNlIFByb2Nlc3MgRnJhbWV3b3JrIENvbXBvc2VyIGlzIGFsbCBhYm91dDwvdGV4dD4KLSAgICAgICAgICAgICAgICA8L2xpbms+Ci0gICAgICAgICAgICAgICAgPGxpbmsgbGFiZWw9IlR1dG9yaWFscyIgdXJsPSJodHRwOi8vb3JnLmVjbGlwc2UudWkuaW50cm8vc2hvd1BhZ2U/aWQ9dHV0b3JpYWxzIiBpZD0idHV0b3JpYWxzIiBzdHlsZS1pZD0ibGVmdCI+Ci0gICAgICAgICAgICAgICAgICAgIDx0ZXh0PkxldCB1cyBndWlkZSB5b3UgdGhyb3VnaCBFY2xpcHNlIFByb2Nlc3MgRnJhbWV3b3JrIENvbXBvc2VyIHR1dG9yaWFsczwvdGV4dD4KLSAgICAgICAgICAgICAgICA8L2xpbms+Ci0gICAgICAgICAgICAgICAgPCEtLSBGaXJzdCBTdGVwcyAtLT4KLQkJCQk8bGluayBsYWJlbD0iRmlyc3QgU3RlcHMiIHVybD0iaHR0cDovL29yZy5lY2xpcHNlLnVpLmludHJvL3Nob3dQYWdlP2lkPXN0ZXBzIiBpZD0ic3RlcHMiIHN0eWxlLWlkPSJsZWZ0Ij4KLQkJCQkJPHRleHQ+U3RhcnQgd29ya2luZyBvbiB5b3VyIG93biBtZXRob2QgcGx1Zy1pbi48L3RleHQ+Ci0JCQkJPC9saW5rPgotICAgICAgICAgICAgICAgIDwhLS0gV2ViIFJlc291cmNlcyAtLT4KLQkJCQk8bGluayBsYWJlbD0iV2ViIFJlc291cmNlcyIgdXJsPSJodHRwOi8vb3JnLmVjbGlwc2UudWkuaW50cm8vc2hvd1BhZ2U/aWQ9d2ViIiBpZD0id2ViIiBzdHlsZS1pZD0icmlnaHQiPgotCQkJCQk8dGV4dD5GaW5kIGluZm9ybWF0aW9uIG9uIHRoZSB3ZWI8L3RleHQ+Ci0JCQkJPC9saW5rPiAgICAgICAgICAgICAgCi0gICAgICAgICAgICA8L2dyb3VwPgotICAgICAgICA8L2dyb3VwPgotICAgICAgICA8Z3JvdXAgaWQ9ImFjdGlvbi1saW5rcyI+Ci0gICAgICAgICAgICA8bGluayB1cmw9Imh0dHA6Ly9vcmcuZWNsaXBzZS51aS5pbnRyby9zd2l0Y2hUb0xhdW5jaEJhciIgbGFiZWw9IldvcmtiZW5jaCIgaWQ9IndvcmtiZW5jaCI+Ci0gICAgICAgICAgICAgICAgPHRleHQ+R28gdG8gdGhlIHdvcmtiZW5jaDwvdGV4dD4KLSAgICAgICAgICAgIDwvbGluaz4KLSAgICAgICAgPC9ncm91cD4KLSAgICA8L3BhZ2U+Ci0KLSAgICA8cGFnZSBhbHQtc3R5bGU9ImNzcy9zdGFuZGJ5X3N3dC5wcm9wZXJ0aWVzIiBzdHlsZT0iY3NzL3N0YW5kYnlfcm9vdC5jc3MiIGlkPSJzdGFuZGJ5IiBzdHlsZS1pZD0icGFnZSI+Ci0gICAgICAgIDx0aXRsZSBzdHlsZS1pZD0iaW50cm8taGVhZGVyIj5FY2xpcHNlIFByb2Nlc3MgRnJhbWV3b3JrIENvbXBvc2VyPC90aXRsZT4KLSAgICAgICAgPGdyb3VwIGlkPSJsaW5rcy1iYWNrZ3JvdW5kIj4KLSAgICAgICAgICAgIDxncm91cCBpZD0icGFnZS1saW5rcyI+Ci0gICAgICAgICAgICAgICAgPGxpbmsgbGFiZWw9Ik92ZXJ2aWV3IiB1cmw9Imh0dHA6Ly9vcmcuZWNsaXBzZS51aS5pbnRyby9zaG93UGFnZT9pZD1vdmVydmlldyZhbXA7c3RhbmRieT1mYWxzZSIgaWQ9Im92ZXJ2aWV3IiBzdHlsZS1pZD0ibGVmdCI+Ci0gICAgICAgICAgICAgICAgICAgIDx0ZXh0PkZpbmQgb3V0IHdoYXQgRWNsaXBzZSBQcm9jZXNzIEZyYW1ld29yayBDb21wb3NlciBpcyBhbGwgYWJvdXQ8L3RleHQ+Ci0gICAgICAgICAgICAgICAgPC9saW5rPgotICAgICAgICAgICAgICAgIDxsaW5rIGxhYmVsPSJUdXRvcmlhbHMiIHVybD0iaHR0cDovL29yZy5lY2xpcHNlLnVpLmludHJvL3Nob3dQYWdlP2lkPXR1dG9yaWFscyZhbXA7c3RhbmRieT1mYWxzZSIgaWQ9InR1dG9yaWFscyIgc3R5bGUtaWQ9ImxlZnQiPgotICAgICAgICAgICAgICAgICAgICA8dGV4dD5MZXQgdXMgZ3VpZGUgeW91IHRocm91Z2ggRWNsaXBzZSBQcm9jZXNzIEZyYW1ld29yayBDb21wb3NlciB0dXRvcmlhbHM8L3RleHQ+Ci0gICAgICAgICAgICAgICAgPC9saW5rPgotCQkJCTxsaW5rIGxhYmVsPSJGaXJzdCBTdGVwcyIgdXJsPSJodHRwOi8vb3JnLmVjbGlwc2UudWkuaW50cm8vc2hvd1BhZ2U/aWQ9c3RlcHMmYW1wO3N0YW5kYnk9ZmFsc2UiIGlkPSJzdGVwcyIgc3R5bGUtaWQ9ImxlZnQiPgotCQkJCQk8dGV4dD5TdGFydCB3b3JraW5nIG9uIHlvdXIgb3duIG1ldGhvZCBwbHVnLWluPC90ZXh0PgotCQkJCTwvbGluaz4KLQkJCQk8bGluayBsYWJlbD0iV2ViIFJlc291cmNlcyIgdXJsPSJodHRwOi8vb3JnLmVjbGlwc2UudWkuaW50cm8vc2hvd1BhZ2U/aWQ9d2ViJmFtcDtzdGFuZGJ5PWZhbHNlIiBpZD0id2ViIiBzdHlsZS1pZD0icmlnaHQiPgotCQkJCQk8dGV4dD5GaW5kIGluZm9ybWF0aW9uIG9uIHRoZSB3ZWI8L3RleHQ+Ci0JCQkJPC9saW5rPgotICAgICAgICAgICAgPC9ncm91cD4KLSAgICAgICAgPC9ncm91cD4KLSAgICA8L3BhZ2U+Ci0KLSAgICA8cGFnZSBzdHlsZT0iY3NzL292ZXJ2aWV3L292ZXJ2aWV3LmNzcyIgYWx0LXN0eWxlPSJjc3Mvb3ZlcnZpZXcvc3d0LnByb3BlcnRpZXMiIGlkPSJvdmVydmlldyIgc3R5bGUtaWQ9InBhZ2UiPgotICAgICAgICA8dGl0bGUgc3R5bGUtaWQ9ImludHJvLWhlYWRlciI+RWNsaXBzZSBQcm9jZXNzIEZyYW1ld29yayBDb21wb3NlcjwvdGl0bGU+Ci0gICAgICAgIDxncm91cCBpZD0iYmFja2dyb3VuZC1pbWFnZSIgZmlsdGVyZWRGcm9tPSJzd3QiLz4KLSAgICAgICAgPGdyb3VwIGlkPSJjdXJ2ZS1pbWFnZSIgZmlsdGVyZWRGcm9tPSJzd3QiLz4KLSAgICAgICAgPGdyb3VwIGlkPSJuYXZpZ2F0aW9uLWxpbmtzIiBmaWx0ZXJlZEZyb209InN3dCI+Ci0gICAgICAgICAgICA8Z3JvdXAgaWQ9InBhZ2UtbGlua3MiPgotICAgICAgICAgICAgICAgIDxsaW5rIGxhYmVsPSJPdmVydmlldyIgdXJsPSJodHRwOi8vb3JnLmVjbGlwc2UudWkuaW50cm8vc2hvd1BhZ2U/aWQ9b3ZlcnZpZXciIGlkPSJvdmVydmlldyIgc3R5bGUtaWQ9ImxlZnQiPgotICAgICAgICAgICAgICAgICAgICA8dGV4dD5GaW5kIG91dCB3aGF0IEVjbGlwc2UgUHJvY2VzcyBGcmFtZXdvcmsgQ29tcG9zZXIgaXMgYWxsIGFib3V0PC90ZXh0PgotICAgICAgICAgICAgICAgIDwvbGluaz4KLSAgICAgICAgICAgICAgICA8bGluayBsYWJlbD0iVHV0b3JpYWxzIiB1cmw9Imh0dHA6Ly9vcmcuZWNsaXBzZS51aS5pbnRyby9zaG93UGFnZT9pZD10dXRvcmlhbHMiIGlkPSJ0dXRvcmlhbHMiIHN0eWxlLWlkPSJsZWZ0Ij4KLSAgICAgICAgICAgICAgICAgICAgPHRleHQ+TGV0IHVzIGd1aWRlIHlvdSB0aHJvdWdoIEVjbGlwc2UgUHJvY2VzcyBGcmFtZXdvcmsgQ29tcG9zZXIgZW5kLXRvLWVuZCB0dXRvcmlhbHM8L3RleHQ+Ci0gICAgICAgICAgICAgICAgPC9saW5rPgotICAgICAgICAgICAgICAgIDxsaW5rIGxhYmVsPSJGaXJzdCBTdGVwcyIgdXJsPSJodHRwOi8vb3JnLmVjbGlwc2UudWkuaW50cm8vc2hvd1BhZ2U/aWQ9c3RlcHMiIGlkPSJzdGVwcyIgc3R5bGUtaWQ9ImxlZnQiPgotICAgICAgICAgICAgICAgICAgICA8dGV4dD5TdGFydCB3b3JraW5nIG9uIHlvdXIgb3duIG1ldGhvZCBwbHVnLWluPC90ZXh0PgotICAgICAgICAgICAgICAgIDwvbGluaz4KLSAgICAgICAgICAgICAgICA8bGluayBsYWJlbD0iV2ViIFJlc291cmNlcyIgdXJsPSJodHRwOi8vb3JnLmVjbGlwc2UudWkuaW50cm8vc2hvd1BhZ2U/aWQ9d2ViIiBpZD0id2ViIiBzdHlsZS1pZD0ibGVmdCI+Ci0gICAgICAgICAgICAgICAgICAgIDx0ZXh0PkZpbmQgb3V0IG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIHdlYjwvdGV4dD4KLSAgICAgICAgICAgICAgICA8L2xpbms+Ci0gICAgICAgICAgICA8L2dyb3VwPgotICAgICAgICAgICAgPGdyb3VwIGlkPSJhY3Rpb24tbGlua3MiPgotICAgICAgICAgICAgICAgIDxsaW5rIHVybD0iaHR0cDovL29yZy5lY2xpcHNlLnVpLmludHJvL3N3aXRjaFRvTGF1bmNoQmFyIiBsYWJlbD0iV29ya2JlbmNoIiBpZD0id29ya2JlbmNoIj4KLSAgICAgICAgICAgICAgICAgICAgPHRleHQ+R28gdG8gdGhlIHdvcmtiZW5jaDwvdGV4dD4KLSAgICAgICAgICAgICAgICA8L2xpbms+Ci0gICAgICAgICAgICA8L2dyb3VwPgotICAgICAgICA8L2dyb3VwPgotICAgICAgICAKLSAgICAgICAgPGdyb3VwIGlkPSJwYWdlLWNvbnRlbnQiPgotICAgICAgICAgICAgPHRleHQgc3R5bGUtaWQ9InBhZ2UtdGl0bGUiIGlkPSJwYWdlLXRpdGxlIiBmaWx0ZXJlZEZyb209InN3dCI+T1ZFUlZJRVc8L3RleHQ+Ci0gICAgICAgICAgICA8dGV4dCBzdHlsZS1pZD0icGFnZS10aXRsZSIgaWQ9InBhZ2UtdGl0bGUiIGZpbHRlcmVkRnJvbT0iaHRtbCI+T1ZFUlZJRVc8L3RleHQ+Ci0gICAgICAgICAgICA8dGV4dCBzdHlsZS1pZD0icGFnZS1kZXNjcmlwdGlvbiIgaWQ9InBhZ2UtZGVzY3JpcHRpb24iPldlbGNvbWUhIFRha2UgYSBmZXcgbWludXRlcyB0byBiZWNvbWUgZmFtaWxpYXIgd2l0aCBFUEYgQ29tcG9zZXIuPC90ZXh0PgotICAgICAgICAgICAgPGdyb3VwIGlkPSJvdmVydmlldy1saW5rcyI+Ci0gICAgICAgICAgICAgICAgPGFuY2hvciBpZD0iYmVnaW5BbmNob3IiLz4gICAgICAgCi0JCQkJPGxpbmsgCi0JCQkJCWxhYmVsPSJFY2xpcHNlIFByb2Nlc3MgRnJhbWV3b3JrIENvbXBvc2VyIE92ZXJ2aWV3IiAKLQkJCQkJdXJsPSJodHRwOi8vb3JnLmVjbGlwc2UudWkuaW50cm8vc2hvd0hlbHBUb3BpYz9pZD0vb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvb3ZlcnZpZXcvYV9wcm9kdWN0X292ZXJ2aWV3Lmh0bWwmYW1wO2VtYmVkVGFyZ2V0PXBhZ2UtY29udGVudCIgICAKLQkJCQkJaWQ9ImVwZi1vdi1ydXBvdiI+Ci0gICAgICAgICAgICAgICAgICAgIDx0ZXh0PlJlYWQgYWJvdXQgRWNsaXBzZSBQcm9jZXNzIEZyYW1ld29yayBDb21wb3NlcidzIHB1cnBvc2UgYW5kIGl0cyBrZXkgY29uY2VwdHMuPC90ZXh0PgotICAgICAgICAgICAgICAgIDwvbGluaz4KLSAgICAgICAgICAgICAgICA8bGluayAKLSAgICAgICAgICAgICAgICAJbGFiZWw9Ik1ldGhvZHM6IFRoZSByZXVzYWJsZSBidWlsZGluZyBibG9ja3MiIAotICAgICAgICAgICAgICAgIAl1cmw9Imh0dHA6Ly9vcmcuZWNsaXBzZS51aS5pbnRyby9zaG93SGVscFRvcGljP2lkPS9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9vdmVydmlldy9hX21ldGhvZF9jb250ZW50X2F1dGhvcmluZ19vdmVydmlldy5odG1sJmFtcDtlbWJlZFRhcmdldD1wYWdlLWNvbnRlbnQiICAgCi0gICAgICAgICAgICAgICAgCWlkPSJlcGYtb3YtbWV0aG9kIj4KLSAgICAgICAgICAgICAgICAgICAgPHRleHQ+UmVhZCBhYm91dCB0aGUgcm9sZSBhbmQgcmVwcmVzZW50YXRpb24gb2YgbWV0aG9kIGNvbnRlbnQgZWxlbWVudHMgaW4gRVBGIENvbXBvc2VyLjwvdGV4dD4KLSAgICAgICAgICAgICAgICA8L2xpbms+ICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgPGxpbmsgCi0gICAgICAgICAgICAgICAgCWxhYmVsPSJBdXRob3JpbmcgUHJvY2Vzc2VzIgotICAgICAgICAgICAgICAgIAl1cmw9Imh0dHA6Ly9vcmcuZWNsaXBzZS51aS5pbnRyby9zaG93SGVscFRvcGljP2lkPS9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9vdmVydmlldy9hX3Byb2Nlc3NfYXV0aG9yaW5nX292ZXJ2aWV3Lmh0bWwmYW1wO2VtYmVkVGFyZ2V0PXBhZ2UtY29udGVudCIgCi0gICAgICAgICAgICAgICAgCWlkPSJlcGYtb3YtcHJvY2VzcyI+Ci0gICAgICAgICAgICAgICAgICAgIDx0ZXh0PlJlYWQgYWJvdXQgdGhlIHJvbGUgYW5kIHJlcHJlc2VudGF0aW9uIG9mIHByb2Nlc3NlcyBpbiBFUEYgQ29tcG9zZXIuPC90ZXh0PgotICAgICAgICAgICAgICAgIDwvbGluaz4KLSAgICAgICAgICAgICAgICA8bGluayAKLSAgICAgICAgICAgICAgICAJbGFiZWw9IkNvbmZpZ3VyYXRpb24gYW5kIFB1Ymxpc2hpbmciIAotICAgICAgICAgICAgICAJCXVybD0iaHR0cDovL29yZy5lY2xpcHNlLnVpLmludHJvL3Nob3dIZWxwVG9waWM/aWQ9L29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL292ZXJ2aWV3L2FfbWV0aG9kX2NvbmZpZ3VyYXRpb25zX292ZXJ2aWV3Lmh0bWwmYW1wO2VtYmVkVGFyZ2V0PXBhZ2UtY29udGVudCIgIAotICAgICAgICAgICAgICAgIAlpZD0iZXBmLW92LWNvbmZpZ3B1Ymxpc2giPgotICAgICAgICAgICAgICAgICAgICA8dGV4dD5SZWFkIGFib3V0IGNvbmZpZ3VyaW5nIGFuZCBwdWJsaXNoaW5nIG1ldGhvZCBjb250ZW50IGFuZCBwcm9jZXNzZXMgaW4gRVBGIENvbXBvc2VyLjwvdGV4dD4KLSAgICAgICAgICAgICAgICA8L2xpbms+Ci0gICAgICAgICAgICAgICAgPGdyb3VwIGlkPSJzdGVwLWxpbmtzIj4KLSAgICAgICAgICAgIAkJPGFuY2hvciBpZD0iYmVnaW5BbmNob3IiLz4KLSAgICAgICAgICAgIAkJPGFuY2hvciBpZD0iZW5kQW5jaG9yIi8+Ci0gICAgICAgICAgICAJPC9ncm91cD4KLSAgICAgICAgICAgIDwvZ3JvdXA+Ci0gICAgICAgIDwvZ3JvdXA+Ci0gICAgPC9wYWdlPgotICAgIAotICAgIDxwYWdlIHN0eWxlPSJjc3MvdG91ci5jc3MiIGFsdC1zdHlsZT0iY3NzL3RvdXItc3d0LnByb3BlcnRpZXMiIGlkPSJlcGYtdG91ciIgc3R5bGUtaWQ9InBhZ2UiPgotCQk8dGl0bGUgc3R5bGUtaWQ9ImludHJvLWhlYWRlciI+RWNsaXBzZSBQcm9jZXNzIEZyYW1ld29yayBDb21wb3NlcjwvdGl0bGU+Ci0JCTxncm91cCBpZD0iYmFja2dyb3VuZC1pbWFnZSIgZmlsdGVyZWRGcm9tPSJzd3QiLz4KLQkJPGluY2x1ZGUgcGF0aD0ib3ZlcnZpZXcvbmF2aWdhdGlvbi1saW5rcyIvPgotCQk8Z3JvdXAgaWQ9InBhZ2UtY29udGVudCI+Ci0JCQk8dGV4dCBzdHlsZS1pZD0icGFnZS10aXRsZSIgaWQ9InBhZ2UtdGl0bGUiPkVjbGlwc2UgUHJvY2VzcyBGcmFtZXdvcmsgQ29tcG9zZXIgVE9VUjwvdGV4dD4KLQkJCTxodG1sIGlkPSJlcGYtdG91ciIgc3JjPSJjc3MvdG91ci1wbGFjZWhvbGRlci5odG1sIiB0eXBlPSJpbmxpbmUiPgotCQkJPC9odG1sPgkKLQkJPC9ncm91cD4KLQk8L3BhZ2U+Ci0JCi0JPHBhZ2Ugc3R5bGU9ImNzcy90b3VyLmNzcyIgYWx0LXN0eWxlPSJjc3MvdG91ci1zd3QucHJvcGVydGllcyIgaWQ9ImVwZi1vdmVydmlldyIgc3R5bGUtaWQ9InBhZ2UiPgotCQk8dGl0bGUgc3R5bGUtaWQ9ImludHJvLWhlYWRlciI+RWNsaXBzZSBQcm9jZXNzIEZyYW1ld29yayBDb21wb3NlcjwvdGl0bGU+Ci0JCTxncm91cCBpZD0iYmFja2dyb3VuZC1pbWFnZSIgZmlsdGVyZWRGcm9tPSJzd3QiLz4KLQkJPGluY2x1ZGUgcGF0aD0ib3ZlcnZpZXcvbmF2aWdhdGlvbi1saW5rcyIvPgotCQk8Z3JvdXAgaWQ9InBhZ2UtY29udGVudCI+Ci0JCQk8dGV4dCBzdHlsZS1pZD0icGFnZS10aXRsZSIgaWQ9InBhZ2UtdGl0bGUiPkVjbGlwc2UgUHJvY2VzcyBGcmFtZXdvcmsgQ29tcG9zZXIgT3ZlcnZpZXc8L3RleHQ+Ci0JCQk8aHRtbCBpZD0iZXBmLW92ZXJ2aWV3IiBzcmM9ImNzcy9wcm9kdWN0X292ZXJ2aWV3Lmh0bWwiIHR5cGU9ImlubGluZSI+Ci0JCQk8L2h0bWw+CQotCQk8L2dyb3VwPgotCTwvcGFnZT4KLQkKLQk8cGFnZSBzdHlsZT0iY3NzL3RvdXIuY3NzIiBhbHQtc3R5bGU9ImNzcy90b3VyLXN3dC5wcm9wZXJ0aWVzIiBpZD0iZXBmLW1ldGhvZHMiIHN0eWxlLWlkPSJwYWdlIj4KLQkJPHRpdGxlIHN0eWxlLWlkPSJpbnRyby1oZWFkZXIiPkVjbGlwc2UgUHJvY2VzcyBGcmFtZXdvcmsgQ29tcG9zZXI8L3RpdGxlPgotCQk8Z3JvdXAgaWQ9ImJhY2tncm91bmQtaW1hZ2UiIGZpbHRlcmVkRnJvbT0ic3d0Ii8+Ci0JCTxpbmNsdWRlIHBhdGg9Im92ZXJ2aWV3L25hdmlnYXRpb24tbGlua3MiLz4KLQkJPGdyb3VwIGlkPSJwYWdlLWNvbnRlbnQiPgotCQkJPHRleHQgc3R5bGUtaWQ9InBhZ2UtdGl0bGUiIGlkPSJwYWdlLXRpdGxlIj5NZXRob2RzOiBUaGUgcmV1c2FibGUgYnVpbGRpbmcgYmxvY2tzPC90ZXh0PgotCQkJPGh0bWwgaWQ9ImVwZi1tZXRob2RzIiBzcmM9ImNzcy9tZXRob2RfYXV0aG9yaW5nX292ZXJ2aWV3Lmh0bWwiIHR5cGU9ImlubGluZSI+Ci0JCQk8L2h0bWw+CQotCQk8L2dyb3VwPgotCTwvcGFnZT4KLQkKLQk8cGFnZSBzdHlsZT0iY3NzL3RvdXIuY3NzIiBhbHQtc3R5bGU9ImNzcy90b3VyLXN3dC5wcm9wZXJ0aWVzIiBpZD0iZXBmLXByb2Nlc3NlcyIgc3R5bGUtaWQ9InBhZ2UiPgotCQk8dGl0bGUgc3R5bGUtaWQ9ImludHJvLWhlYWRlciI+RWNsaXBzZSBQcm9jZXNzIEZyYW1ld29yayBDb21wb3NlcjwvdGl0bGU+Ci0JCTxncm91cCBpZD0iYmFja2dyb3VuZC1pbWFnZSIgZmlsdGVyZWRGcm9tPSJzd3QiLz4KLQkJPGluY2x1ZGUgcGF0aD0ib3ZlcnZpZXcvbmF2aWdhdGlvbi1saW5rcyIvPgotCQk8Z3JvdXAgaWQ9InBhZ2UtY29udGVudCI+Ci0JCQk8dGV4dCBzdHlsZS1pZD0icGFnZS10aXRsZSIgaWQ9InBhZ2UtdGl0bGUiPkF1dGhvcmluZyBQcm9jZXNzZXM8L3RleHQ+Ci0JCQk8aHRtbCBpZD0iZXBmLXByb2Nlc3NlcyIgc3JjPSJjc3MvcHJvY2Vzc19hdXRob3Jpbmdfb3Zlcml2ZXcuaHRtbCIgdHlwZT0iaW5saW5lIj4KLQkJCTwvaHRtbD4JCi0JCTwvZ3JvdXA+Ci0JPC9wYWdlPgotCQotCTxwYWdlIHN0eWxlPSJjc3MvdG91ci5jc3MiIGFsdC1zdHlsZT0iY3NzL3RvdXItc3d0LnByb3BlcnRpZXMiIGlkPSJlcGYtY29uZmlncHVibGlzaCIgc3R5bGUtaWQ9InBhZ2UiPgotCQk8dGl0bGUgc3R5bGUtaWQ9ImludHJvLWhlYWRlciI+RWNsaXBzZSBQcm9jZXNzIEZyYW1ld29yayBDb21wb3NlcjwvdGl0bGU+Ci0JCTxncm91cCBpZD0iYmFja2dyb3VuZC1pbWFnZSIgZmlsdGVyZWRGcm9tPSJzd3QiLz4KLQkJPGluY2x1ZGUgcGF0aD0ib3ZlcnZpZXcvbmF2aWdhdGlvbi1saW5rcyIvPgotCQk8Z3JvdXAgaWQ9InBhZ2UtY29udGVudCI+Ci0JCQk8dGV4dCBzdHlsZS1pZD0icGFnZS10aXRsZSIgaWQ9InBhZ2UtdGl0bGUiPkNvbmZpZ3VyYXRpb24gYW5kIFB1Ymxpc2hpbmc8L3RleHQ+Ci0JCQk8aHRtbCBpZD0iZXBmLXByb2Nlc3NlcyIgc3JjPSJjc3MvcHVibGlzaGluZy5odG1sIiB0eXBlPSJpbmxpbmUiPgotCQkJPC9odG1sPgkKLQkJPC9ncm91cD4KLQk8L3BhZ2U+Ci0JCi0JPCEtLSBGSVJTVCBTVEVQUyBTQ0FGRk9MRElORyAtLT4KLQk8cGFnZSAKLQkJc3R5bGU9ImNzcy9maXJzdHN0ZXBzL2ZpcnN0c3RlcHMuY3NzIiAKLQkJYWx0LXN0eWxlPSJjc3MvZmlyc3RzdGVwcy9maXJzdHN0ZXBzLnByb3BlcnRpZXMiIAotCQlpZD0ic3RlcHMiIAotCQlzdHlsZS1pZD0icGFnZSI+Ci0JCTx0aXRsZSBzdHlsZS1pZD0iaW50cm8taGVhZGVyIj5FY2xpcHNlIFByb2Nlc3MgRnJhbWV3b3JrIENvbXBvc2VyPC90aXRsZT4KLQkJPGdyb3VwIGlkPSJiYWNrZ3JvdW5kLWltYWdlIiBmaWx0ZXJlZEZyb209InN3dCIvPgotCQk8Z3JvdXAgaWQ9ImN1cnZlLWltYWdlIiBmaWx0ZXJlZEZyb209InN3dCIvPgotCQk8aW5jbHVkZSBwYXRoPSJvdmVydmlldy9uYXZpZ2F0aW9uLWxpbmtzIi8+Ci0JCTxncm91cCBpZD0icGFnZS1jb250ZW50Ij4KLQkJCTx0ZXh0IHN0eWxlLWlkPSJwYWdlLXRpdGxlIiBpZD0icGFnZS10aXRsZSI+RklSU1QgU1RFUFM8L3RleHQ+Ci0JCQk8dGV4dCBzdHlsZS1pZD0icGFnZS1kZXNjcmlwdGlvbiIgaWQ9InBhZ2UtZGVzY3JpcHRpb24iPlN0YXJ0IHdvcmtpbmcgb24geW91ciBvd24gbWV0aG9kIHBsdWctaW4uPC90ZXh0PgotCQkJPGdyb3VwIGlkPSJzdGVwcy1saW5rcyI+ICAgICAgICAgICAgICAgCi0JCQkgICAgPGFuY2hvciBpZD0iYmVnaW5BbmNob3IiLz4KLQkJCSAgICA8bGluayBsYWJlbD0iQ3JlYXRlIHlvdXIgb3duIE1ldGhvZCBQbHVnLWluIiB1cmw9Imh0dHA6Ly9vcmcuZWNsaXBzZS51aS5pbnRyby9vcGVuQ2hlYXRzaGVldFZpZXc/aW5wdXQ9b3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5jaGVhdHNoZWV0cy5jcmVhdGVtZXRob2RwbHVnaW4mYW1wO3RvZ2dsZT10cnVlIiBpZD0iZXBmLXN0ZXBzLXR3byI+Ci0gICAgICAgICAgICAgICAgICAgIDx0ZXh0PlN0YXJ0IGJ1aWxkaW5nIGEgbWV0aG9kIHBsdWctaW4gdXNpbmcgYSB3aXphcmQuPC90ZXh0PgotICAgICAgICAgICAgICAgIDwvbGluaz4KLSAgICAgICAgICAgICAgICA8bGluayBsYWJlbD0iQ3JlYXRlIHlvdXIgb3duIE1ldGhvZCBDb25maWd1cmF0aW9uIiB1cmw9Imh0dHA6Ly9vcmcuZWNsaXBzZS51aS5pbnRyby9vcGVuQ2hlYXRzaGVldFZpZXc/aW5wdXQ9b3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5jaGVhdHNoZWV0cy5jcmVhdGVtZXRob2Rjb25maWd1cmF0aW9uJmFtcDt0b2dnbGU9dHJ1ZSIgaWQ9ImVwZi1zdGVwcy1mb3VyIj4KLSAgICAgICAgICAgICAgICAgICAgPHRleHQ+VGhpcyBjaGVhdHNoZWV0IGd1aWRlcyB5b3UgdGhvdWdoIHRoZSBzdGVwcyBvZiBjcmVhdGluZyB5b3VyIG93biBtZXRob2QgY29uZmlndXJhdGlvbi48L3RleHQ+Ci0gICAgICAgICAgICAgICAgPC9saW5rPgotICAgICAgICAgICAgICAgIDxsaW5rIGxhYmVsPSJBZGQgbmV3IE1ldGhvZCBDb250ZW50IHN1Y2ggYXMgUm9sZXMsIFRhc2siIHVybD0iaHR0cDovL29yZy5lY2xpcHNlLnVpLmludHJvL29wZW5DaGVhdHNoZWV0Vmlldz9pbnB1dD1vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmNoZWF0c2hlZXRzLmFkZG5ld21ldGhvZGNvbnRlbnQmYW1wO3RvZ2dsZT10cnVlIiBpZD0iZXBmLXN0ZXBzLW9uZSI+Ci0gICAgICAgICAgICAgICAgICAgIDx0ZXh0PlRoaXMgY2hlYXRzaGVldCBndWlkZXMgeW91IHRob3VnaCB0aGUgc3RlcHMgb2YgY3JlYXRpbmcgeW91ciBvd24gbWV0aG9kIGNvbnRlbnQuPC90ZXh0PgotICAgICAgICAgICAgICAgIDwvbGluaz4KLSAgICAgICAgICAgICAgICA8bGluayBsYWJlbD0iQ3JlYXRlIGEgUHJvY2VzcyIgdXJsPSJodHRwOi8vb3JnLmVjbGlwc2UudWkuaW50cm8vb3BlbkNoZWF0c2hlZXRWaWV3P2lucHV0PW9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuY2hlYXRzaGVldHMuY3JlYXRlYXByb2Nlc3MmYW1wO3RvZ2dsZT10cnVlIiBpZD0iZXBmLXN0ZXBzLXRocmVlIj4KLSAgICAgICAgICAgICAgICAgICAgPHRleHQ+VGhpcyBjaGVhdHNoZWV0IHRha2VzIHlvdSB0aHJvdWdoIHRoZSBzdGVwcyBuZWNlc3NhcnkgdG8gY3JlYXRlIGEgcHJvY2Vzcy48L3RleHQ+Ci0gICAgICAgICAgICAgICAgPC9saW5rPiAgCi0JCQkJPGdyb3VwIGlkPSJzdGVwLWxpbmtzIj4KLQkJCQkJPGFuY2hvciBpZD0iYmVnaW5BbmNob3IiLz4KLSAgICAgICAgICAgIAkJPGFuY2hvciBpZD0iZW5kQW5jaG9yIi8+Ci0JCQkJPC9ncm91cD4KLQkJICAgCTwvZ3JvdXA+Ci0JCTwvZ3JvdXA+Ci0JPC9wYWdlPgotCQotICAgIDxwYWdlIHN0eWxlPSJjc3MvdHV0b3JpYWxzL3R1dG9yaWFscy5jc3MiIGFsdC1zdHlsZT0iY3NzL3R1dG9yaWFscy9zd3QucHJvcGVydGllcyIgaWQ9InR1dG9yaWFscyIgc3R5bGUtaWQ9InBhZ2UiPgotICAgICAgICA8dGl0bGUgc3R5bGUtaWQ9ImludHJvLWhlYWRlciI+RWNsaXBzZSBQcm9jZXNzIEZyYW1ld29yayBDb21wb3NlcjwvdGl0bGU+Ci0gICAgICAgIDxncm91cCBpZD0iYmFja2dyb3VuZC1pbWFnZSIgZmlsdGVyZWRGcm9tPSJzd3QiLz4KLSAgICAgICAgPGdyb3VwIGlkPSJjdXJ2ZS1pbWFnZSIgZmlsdGVyZWRGcm9tPSJzd3QiLz4KLSAgICAgICAgPGluY2x1ZGUgcGF0aD0ib3ZlcnZpZXcvbmF2aWdhdGlvbi1saW5rcyIvPgotICAgICAgICA8Z3JvdXAgaWQ9InBhZ2UtY29udGVudCI+Ci0gICAgICAgICAgICA8dGV4dCBzdHlsZS1pZD0icGFnZS10aXRsZSIgaWQ9InBhZ2UtdGl0bGUiPlRVVE9SSUFMUzwvdGV4dD4KLSAgICAgICAgICAgIDx0ZXh0IHN0eWxlLWlkPSJwYWdlLWRlc2NyaXB0aW9uIiBpZD0icGFnZS1kZXNjcmlwdGlvbiI+TGVhcm4gaG93IHlvdSBjYW4gdXNlIEVjbGlwc2UgUHJvY2VzcyBGcmFtZXdvcmsgQ29tcG9zZXIgdG8gZGVsaXZlciBwcmFjdGljYWwsIGN1c3RvbWl6ZWQsIGFuZCBjb25zaXN0ZW50IHByb2Nlc3MgZ3VpZGFuY2UgdG8geW91ciBwcm9qZWN0IHRlYW0uPC90ZXh0PgotCQkJPGdyb3VwIGlkPSJ0dXRvcmlhbHMtbGlua3MiPiAgICAgICAgICAgICAgIAotCQkJICAgIDxhbmNob3IgaWQ9ImJlZ2luQW5jaG9yIi8+Ci0JCQkJPGxpbmsgCi0JCQkJCWxhYmVsPSJFeHBsb3JlIHRoZSB1c2VyIGludGVyZmFjZSIgCi0JCQkJCXVybD0iaHR0cDovL29yZy5lY2xpcHNlLnVpLmludHJvL3Nob3dIZWxwVG9waWM/aWQ9L29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3R1dG9yaWFscy90dXQxX2ludHJvLmh0bSZhbXA7IiAKLQkJCQkJaWQ9ImVwZi10dXQtbmF2aWdhdGUiCi0JCQkJCWNsYXNzLWlkPSJsZWZ0Ij4KLSAgICAgICAgICAgICAgICAgICAgPHRleHQ+TGVhcm4gdG8gbmF2aWdhdGUgdGhyb3VnaCB0aGUgdXNlciBpbnRlcmZhY2U6IHBlcnNwZWN0aXZlcywgdmlld3MsIGFuZCBzZWFyY2guPC90ZXh0PgotICAgICAgICAgICAgICAgIDwvbGluaz4KLSAgICAgICAgICAgICAgICA8bGluayAKLSAgICAgICAgICAgICAgICAJbGFiZWw9Ildvcmtpbmcgd2l0aCBwcm9jZXNzZXMiIAotICAgICAgICAgICAgICAgIAl1cmw9Imh0dHA6Ly9vcmcuZWNsaXBzZS51aS5pbnRyby9zaG93SGVscFRvcGljP2lkPS9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90dXRvcmlhbHMvdHV0NV9pbnRyby5odG0mYW1wOyIgCi0gICAgICAgICAgICAgICAgCWlkPSJlcGYtdHV0LXByb2Nlc3MiPgotICAgICAgICAgICAgICAgICAgICA8dGV4dD5MZWFybiBob3cgdG8gY3JlYXRlIGFuZCByZXVzZSBjYXBhYmlsaXR5IHBhdHRlcm5zIGFuZCBkZWxpdmVyeSBwcm9jZXNzZXMuPC90ZXh0PgotICAgICAgICAgICAgICAgIDwvbGluaz4KLSAgICAgICAgICAgICAgICA8bGluayAKLSAgICAgICAgICAgICAgICAJbGFiZWw9IkNyZWF0ZSBtZXRob2QgY29udGVudCAiIAotICAgICAgICAgICAgICAgIAl1cmw9Imh0dHA6Ly9vcmcuZWNsaXBzZS51aS5pbnRyby9zaG93SGVscFRvcGljP2lkPS9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90dXRvcmlhbHMvdHV0Ml9pbnRyby5odG0mYW1wOyIgCi0gICAgICAgICAgICAgICAgCWlkPSJlcGYtdHV0LWVsZW1lbnQiCi0gICAgICAgICAgICAgICAgCWNsYXNzLWlkPSJsZWZ0Ij4KLSAgICAgICAgICAgICAgICAgICAgPHRleHQ+TGVhcm4gaG93IHRvIHVzZSB0aGUgZWRpdG9ycyB0byBjcmVhdGUgcm9sZXMsIHRhc2tzLCB3b3JrIHByb2R1Y3RzIGFuZCBndWlkYW5jZS48L3RleHQ+Ci0gICAgICAgICAgICAgICAgPC9saW5rPgotICAgICAgICAgICAgICAgIDxsaW5rIAotICAgICAgICAgICAgICAgIAlsYWJlbD0iUHVibGlzaGluZyBhbmQgRXhwb3J0aW5nIiAKLSAgICAgICAgICAgICAgICAJdXJsPSJodHRwOi8vb3JnLmVjbGlwc2UudWkuaW50cm8vc2hvd0hlbHBUb3BpYz9pZD0vb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHV0b3JpYWxzL3R1dDRfaW50cm8uaHRtJmFtcDsiIAotICAgICAgICAgICAgICAgIAlpZD0iZXBmLXR1dC1wdWJleHAiPgotICAgICAgICAgICAgICAgICAgICA8dGV4dD5MZWFybiBob3cgdG8gcHVibGlzaCBjb25maWd1cmF0aW9ucyB0byBhIHdlYiBzaXRlIGFuZCBob3cgdG8gZXhwb3J0IHByb2Nlc3NlcyB0byBhIHBsYW5uaW5nIHRvb2wuPC90ZXh0PgotICAgICAgICAgICAgICAgIDwvbGluaz4KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICA8bGluayAKLSAgICAgICAgICAgICAgICAJbGFiZWw9IlJldXNlIG1ldGhvZCBjb250ZW50IiAKLSAgICAgICAgICAgICAgICAJdXJsPSJodHRwOi8vb3JnLmVjbGlwc2UudWkuaW50cm8vc2hvd0hlbHBUb3BpYz9pZD0vb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHV0b3JpYWxzL3R1dDNfaW50cm8uaHRtJmFtcDsiIAotICAgICAgICAgICAgICAgIAlpZD0iZXBmLXR1dC1jb250ZW50IgotICAgICAgICAgICAgICAgIAljbGFzcy1pZD0ibGVmdCI+Ci0gICAgICAgICAgICAgICAgICAgIDx0ZXh0PkxlYXJuIGhvdyB0byBleHRlbmQsIHJlcGxhY2UsIGFuZCBjb250cmlidXRlIHRvIGJhc2UgY29udGVudCBlbGVtZW50cy48L3RleHQ+Ci0gICAgICAgICAgICAgICAgPC9saW5rPgotCQkJCTxncm91cCBpZD0ic3RlcC1saW5rcyI+Ci0JCQkJCTxhbmNob3IgaWQ9ImJlZ2luQW5jaG9yIi8+Ci0gICAgICAgICAgICAJCTxhbmNob3IgaWQ9ImVuZEFuY2hvciIvPgotCQkJCTwvZ3JvdXA+Ci0JCSAgIAk8L2dyb3VwPiAgIAkKLSAgICAgICAgPC9ncm91cD4KLSAgICAgICAgCi0gICAgPC9wYWdlPgotCi0gICAgPCEtLSBXRUIgUkVTT1VSQ0VTIFNDQUZGT0xESU5HIC0tPgotCTxwYWdlIAotCQlzdHlsZT0iY3NzL3dlYnJlc291cmNlcy93ZWJyZXNvdXJjZXMuY3NzIiBhbHQtc3R5bGU9ImNzcy93ZWJyZXNvdXJjZXMvd2VicmVzb3VyY2VzLnByb3BlcnRpZXMiIGlkPSJ3ZWIiIHN0eWxlLWlkPSJwYWdlIj4KLQkJPHRpdGxlIHN0eWxlLWlkPSJpbnRyby1oZWFkZXIiPkVjbGlwc2UgUHJvY2VzcyBGcmFtZXdvcmsgQ29tcG9zZXI8L3RpdGxlPgotCQk8Z3JvdXAgaWQ9ImJhY2tncm91bmQtaW1hZ2UiIGZpbHRlcmVkRnJvbT0ic3d0Ii8+Ci0JCTxncm91cCBpZD0iY3VydmUtaW1hZ2UiIGZpbHRlcmVkRnJvbT0ic3d0Ii8+Ci0JCTxpbmNsdWRlIHBhdGg9Im92ZXJ2aWV3L25hdmlnYXRpb24tbGlua3MiLz4KLQkJPGdyb3VwIGlkPSJwYWdlLWNvbnRlbnQiPgotCQkJPHRleHQgc3R5bGUtaWQ9InBhZ2UtdGl0bGUiIGlkPSJwYWdlLXRpdGxlIj5XRUIgUkVTT1VSQ0VTPC90ZXh0PgotCQkJPHRleHQgc3R5bGUtaWQ9InBhZ2UtZGVzY3JpcHRpb24iIGlkPSJwYWdlLWRlc2NyaXB0aW9uIj5JbiBhZGRpdGlvbiB0byBpbmZvcm1hdGlvbiBpbiB0aGUgV2VsY29tZSBhbmQgdGhlIEhlbHAsIHRoZSBXZWIgcHJvdmlkZXMgeW91IHdpdGggdGlwcywgYXJ0aWNsZXMsIHVwZGF0ZXMsIGFuZCByZWZlcmVuY2VzIHRvIGluZHVzdHJ5IHN0YW5kYXJkcy4gPC90ZXh0PgotCQkJPGdyb3VwIGlkPSJ3ZWItbGlua3MiPgotCQkJCSAgIDxsaW5rCi0JICAgICAgICAgICAgICAgICAgICAgbGFiZWw9IkVjbGlwc2UgUHJvY2VzcyBGcmFtZXdvcmsiCi0JICAgICAgICAgICAgICAgICAgICAgdXJsPSJodHRwOi8vb3JnLmVjbGlwc2UudWkuaW50cm8vb3BlbkJyb3dzZXI/dXJsPWh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIgotCSAgICAgICAgICAgICAgICAgICAgIGlkPSJlcGZfcmVzb3VyY2UiPgotCSAgICAgICAgICAgICAgICAgIDx0ZXh0PkNlbnRyYWwgbG9jYXRpb24gZm9yIGluZm9ybWF0aW9uIHJlbGF0ZWQgdG8gdGhlIEVjbGlwc2UgUHJvY2VzcyBGcmFtZXdvcms8L3RleHQ+Ci0JICAgICAgICAgICAgICAgPC9saW5rPgotCQkJPC9ncm91cD4KLQkJPC9ncm91cD4KLQk8L3BhZ2U+Ci0JCi0gICAgPHBhZ2Ugc3R5bGU9ImNzcy9zYW1wbGVzL3NhbXBsZXMuY3NzIiBhbHQtc3R5bGU9ImNzcy9zYW1wbGVzL3N3dC5wcm9wZXJ0aWVzIiBpZD0ic2FtcGxlcyIgc3R5bGUtaWQ9InBhZ2UiPgotICAgICAgICA8dGl0bGUgc3R5bGUtaWQ9ImludHJvLWhlYWRlciI+RWNsaXBzZSBQcm9jZXNzIEZyYW1ld29yayBDb21wb3NlcjwvdGl0bGU+Ci0gICAgICAgIDxncm91cCBpZD0iYmFja2dyb3VuZC1pbWFnZSIgZmlsdGVyZWRGcm9tPSJzd3QiLz4KLSAgICAgICAgPGdyb3VwIGlkPSJjdXJ2ZS1pbWFnZSIgZmlsdGVyZWRGcm9tPSJzd3QiLz4KLSAgICAgICAgPGluY2x1ZGUgcGF0aD0ib3ZlcnZpZXcvbmF2aWdhdGlvbi1saW5rcyIvPgotICAgICAgICA8Z3JvdXAgaWQ9InBhZ2UtY29udGVudCI+Ci0gICAgICAgICAgICA8Z3JvdXAgaWQ9ImNvbnRlbnQtaGVhZGVyIiBsYWJlbD0iU0FNUExFUyIgZmlsdGVyZWRGcm9tPSJzd3QiPgotICAgICAgICAgICAgPC9ncm91cD4KLSAgICAgICAgICAgIDx0ZXh0IHN0eWxlLWlkPSJwYWdlLXRpdGxlIiBpZD0icGFnZS10aXRsZSIgZmlsdGVyZWRGcm9tPSJodG1sIj5TQU1QTEVTPC90ZXh0PgotICAgICAgICAgICAgPHRleHQgc3R5bGUtaWQ9InBhZ2UtZGVzY3JpcHRpb24iIGlkPSJwYWdlLWRlc2NyaXB0aW9uIj5FeHBsb3JlIEVjbGlwc2UgYnkgaW5zdGFsbGluZyBwcmVmYWJyaWNhdGVkIHNhbXBsZXMgKG1heSByZXF1aXJlIEludGVybmV0IGNvbm5lY3Rpb24pLjwvdGV4dD4KLSAgICAgICAgICAgIDxhbmNob3IgaWQ9ImJlZ2luQW5jaG9yIi8+Ci0gICAgICAgICAgICA8Z3JvdXAgbGFiZWw9IlNXVCIgaWQ9InN3dCIgc3R5bGUtaWQ9InNhbXBsZXMtZ3JvdXAiPgotICAgICAgICAgICAgICAgIDx0ZXh0IHN0eWxlLWlkPSJncm91cC1kZXNjcmlwdGlvbiI+UnVuIFNXVCBzYW1wbGVzIHVzaW5nIGVpdGhlciB0aGUgc3RhbmRhbG9uZSBTV1QgbGF1bmNoZXIgb3IgYXMgYW4gaW50ZWdyYXRlZCB3b3JrYmVuY2ggdmlldy48L3RleHQ+Ci0gICAgICAgICAgICAgICAgPGxpbmsgbGFiZWw9IldvcmtiZW5jaCB2aWV3cyBhbmQgc3RhbmRhbG9uZSBhcHBsaWNhdGlvbnMiIHVybD0iaHR0cDovL29yZy5lY2xpcHNlLnVpLmludHJvL3J1bkFjdGlvbj9wbHVnaW5JZD1vcmcuZWNsaXBzZS5wZGUudWkmYW1wO2NsYXNzPW9yZy5lY2xpcHNlLnBkZS51aS5pbnRlcm5hbC5zYW1wbGVzLlNob3dTYW1wbGVBY3Rpb24mYW1wO2lkPW9yZy5lY2xpcHNlLnNkay5zYW1wbGVzLnN3dC5leGFtcGxlcyIgaWQ9InN3dC1leGFtcGxlcyIgc3R5bGUtaWQ9InNhbXBsZS1saW5rIj4KLSAgICAgICAgICAgICAgICAgICAgPHRleHQ+VGhlIFNXVCBFeGFtcGxlIGxhdW5jaGVyIHdpbGwgYWxsb3cgeW91IHRvIGxhdW5jaCBhIGNvbGxlY3Rpb24gb2YgU1dUIGV4YW1wbGVzLiAgU29tZSBvZiB0aGUgZXhhbXBsZXMgY2FuIGJlIHJ1biBpbmRlcGVuZGVudCBvZiB0aGUgZWNsaXBzZSBwbGF0Zm9ybSBhbmQgb3RoZXJzIHdpbGwgYmUgYXZhaWxhYmxlIGFzIHZpZXdzIGluc2lkZSB0aGUgd29ya2JlbmNoLjwvdGV4dD4KLSAgICAgICAgICAgICAgICA8L2xpbms+Ci0gICAgICAgICAgICAgICAgPGFuY2hvciBpZD0ic3d0R3JvdXBBbmNob3IiLz4KLSAgICAgICAgICAgIDwvZ3JvdXA+Ci0gICAgICAgICAgICA8Z3JvdXAgbGFiZWw9IldvcmtiZW5jaCIgaWQ9IndvcmtiZW5jaCIgc3R5bGUtaWQ9InNhbXBsZXMtZ3JvdXAiPgotICAgICAgICAgICAgICAgIDx0ZXh0IHN0eWxlLWlkPSJncm91cC1kZXNjcmlwdGlvbiI+VGhlIGZvbGxvd2luZyBzYW1wbGVzIGRlbW9uc3RyYXRlIGhvdyB0byB0aWdodGx5IGludGVncmF0ZSBpbnRvIHRoZSBFY2xpcHNlIHdvcmtiZW5jaC48L3RleHQ+Ci0gICAgICAgICAgICAgICAgPGxpbmsgbGFiZWw9Ik11bHRpLXBhZ2UgZWRpdG9yIiB1cmw9Imh0dHA6Ly9vcmcuZWNsaXBzZS51aS5pbnRyby9ydW5BY3Rpb24/cGx1Z2luSWQ9b3JnLmVjbGlwc2UucGRlLnVpJmFtcDtjbGFzcz1vcmcuZWNsaXBzZS5wZGUudWkuaW50ZXJuYWwuc2FtcGxlcy5TaG93U2FtcGxlQWN0aW9uJmFtcDtpZD1vcmcuZWNsaXBzZS5zZGsuc2FtcGxlcy5tdWx0aXBhZ2VlZGl0b3IiIGlkPSJtdWx0aS1wYWdlLWVkaXRvciIgc3R5bGUtaWQ9InNhbXBsZS1saW5rIj4KLSAgICAgICAgICAgICAgICAgICAgPHRleHQ+U2hvd3MgaG93IHRvIGNyZWF0ZSBhbiBlZGl0b3Igd2l0aCBtdWx0aXBsZSBwYWdlczwvdGV4dD4KLSAgICAgICAgICAgICAgICA8L2xpbms+Ci0gICAgICAgICAgICAgICAgPGxpbmsgbGFiZWw9IlByb3BlcnR5IHNoZWV0IGFuZCBvdXRsaW5lIiB1cmw9Imh0dHA6Ly9vcmcuZWNsaXBzZS51aS5pbnRyby9ydW5BY3Rpb24/cGx1Z2luSWQ9b3JnLmVjbGlwc2UucGRlLnVpJmFtcDtjbGFzcz1vcmcuZWNsaXBzZS5wZGUudWkuaW50ZXJuYWwuc2FtcGxlcy5TaG93U2FtcGxlQWN0aW9uJmFtcDtpZD1vcmcuZWNsaXBzZS5zZGsuc2FtcGxlcy5wcm9wZXJ0eXNoZWV0IiBpZD0icHJvcGVydHktc2hlZXQiIHN0eWxlLWlkPSJzYW1wbGUtbGluayI+Ci0gICAgICAgICAgICAgICAgICAgIDx0ZXh0PkRlbW9uc3RyYXRlcyBob3cgdG8gdXNlIHByb3BlcnR5IHNoZWV0IGFuZCBvdXRsaW5lIHZpZXdzPC90ZXh0PgotICAgICAgICAgICAgICAgIDwvbGluaz4KLSAgICAgICAgICAgICAgICA8bGluayBsYWJlbD0iUmVhZG1lIHRvb2wiIHVybD0iaHR0cDovL29yZy5lY2xpcHNlLnVpLmludHJvL3J1bkFjdGlvbj9wbHVnaW5JZD1vcmcuZWNsaXBzZS5wZGUudWkmYW1wO2NsYXNzPW9yZy5lY2xpcHNlLnBkZS51aS5pbnRlcm5hbC5zYW1wbGVzLlNob3dTYW1wbGVBY3Rpb24mYW1wO2lkPW9yZy5lY2xpcHNlLnNkay5zYW1wbGVzLnJlYWRtZXRvb2wiIGlkPSJyZWFkbWV0b29sIiBzdHlsZS1pZD0ic2FtcGxlLWxpbmsiPgotICAgICAgICAgICAgICAgICAgICA8dGV4dD5TaG93cyBob3cgdG8gY3JlYXRlIHlvdXIgb3duIGV4dGVuc2lvbiBwb2ludHM8L3RleHQ+Ci0gICAgICAgICAgICAgICAgPC9saW5rPgotICAgICAgICAgICAgICAgIDxhbmNob3IgaWQ9ImpkdEFuY2hvciIvPgotICAgICAgICAgICAgICAgIDxhbmNob3IgaWQ9IndvcmtiZW5jaEdyb3VwQW5jaG9yIi8+Ci0gICAgICAgICAgICA8L2dyb3VwPgotICAgICAgICAgICAgPGFuY2hvciBpZD0iZW5kQW5jaG9yIi8+Ci0gICAgICAgIDwvZ3JvdXA+Ci0gICAgPC9wYWdlPgotCi0gICAgPHBhZ2Ugc3R5bGU9ImNzcy93aGF0c25ldy93aGF0c25ldy5jc3MiIGFsdC1zdHlsZT0iY3NzL3doYXRzbmV3L3N3dC5wcm9wZXJ0aWVzIiBpZD0ibmV3cyIgc3R5bGUtaWQ9InBhZ2UiPgotICAgICAgICA8dGl0bGUgc3R5bGUtaWQ9ImludHJvLWhlYWRlciI+RWNsaXBzZSBQcm9jZXNzIEZyYW1ld29yayBDb21wb3NlcjwvdGl0bGU+Ci0gICAgICAgIDxncm91cCBpZD0iYmFja2dyb3VuZC1pbWFnZSIgZmlsdGVyZWRGcm9tPSJzd3QiLz4KLSAgICAgICAgPGdyb3VwIGlkPSJjdXJ2ZS1pbWFnZSIgZmlsdGVyZWRGcm9tPSJzd3QiLz4KLSAgICAgICAgPGluY2x1ZGUgcGF0aD0ib3ZlcnZpZXcvbmF2aWdhdGlvbi1saW5rcyIvPgotICAgICAgICA8Z3JvdXAgaWQ9InBhZ2UtY29udGVudCI+Ci0gICAgICAgICAgICA8Z3JvdXAgaWQ9ImNvbnRlbnQtaGVhZGVyIiBsYWJlbD0iV0hBVCdTIE5FVyIgZmlsdGVyZWRGcm9tPSJzd3QiPgotICAgICAgICAgICAgPC9ncm91cD4KLSAgICAgICAgICAgIDx0ZXh0IHN0eWxlLWlkPSJwYWdlLXRpdGxlIiBpZD0icGFnZS10aXRsZSIgZmlsdGVyZWRGcm9tPSJodG1sIj5XSEFUJ1MgTkVXPC90ZXh0PgotICAgICAgICAgICAgPGFuY2hvciBpZD0iYmVnaW5BbmNob3IiLz4KLSAgICAgICAgICAgIDxncm91cCBpZD0ibm90ZXdvcnRoeS1saW5rcyIgbGFiZWw9Ik5ldyBhbmQgTm90ZXdvcnRoeSI+Ci0gICAgICAgICAgICAgICAgPGxpbmsgbGFiZWw9IkVjbGlwc2UgUGxhdGZvcm0iIHVybD0iaHR0cDovL29yZy5lY2xpcHNlLnVpLmludHJvL3Nob3dIZWxwVG9waWM/aWQ9L29yZy5lY2xpcHNlLnBsYXRmb3JtLmRvYy51c2VyL3doYXRzTmV3L3BsYXRmb3JtX3doYXRzbmV3Lmh0bWwiIGlkPSJwbGF0Zm9ybS1ub3Rld29ydGh5IiBzdHlsZS1pZD0ibm90ZXdvcnRoeS1saW5rIj4KLSAgICAgICAgICAgICAgICAgICAgPHRleHQ+RmluZCBvdXQgYWJvdXQgdGhlIG1ham9yIG5ldyBmZWF0dXJlcyBpbiB0aGlzIHJlbGVhc2U8L3RleHQ+Ci0gICAgICAgICAgICAgICAgPC9saW5rPgotICAgICAgICAgICAgICAgIDxhbmNob3IgaWQ9ImpkdEFuY2hvciIvPgotICAgICAgICAgICAgICAgIDxhbmNob3IgaWQ9InBkZUFuY2hvciIvPgotICAgICAgICAgICAgICAgIDxhbmNob3IgaWQ9ImdlbmVyYWxBbmNob3IiLz4KLSAgICAgICAgICAgIDwvZ3JvdXA+Ci0gICAgICAgICAgICA8Z3JvdXAgaWQ9Im5ld3MtbGlua3MiIGxhYmVsPSJHZW5lcmFsIj4KLSAgICAgICAgICAgICAgICA8bGluayBsYWJlbD0iTWlncmF0aW9uIGZyb20gdGhlIHByZXZpb3VzIHJlbGVhc2UiIHVybD0iaHR0cDovL29yZy5lY2xpcHNlLnVpLmludHJvL3Nob3dIZWxwVG9waWM/aWQ9L29yZy5lY2xpcHNlLnBsYXRmb3JtLmRvYy5pc3YvcG9ydGluZy9lY2xpcHNlXzNfMF9wb3J0aW5nX2d1aWRlLmh0bWwiIGlkPSJtaWdyYXRpb24iPgotICAgICAgICAgICAgICAgICAgICA8dGV4dD5MZWFybiB3aGF0IHlvdSBuZWVkIHRvIGRvIHRvIG1ha2UgeW91ciBvbGQgY29kZSB3b3JrIGluIEVjbGlwc2UgMy4xPC90ZXh0PgotICAgICAgICAgICAgICAgIDwvbGluaz4KLSAgICAgICAgICAgICAgICA8bGluayBsYWJlbD0iTmV3IFVwZGF0ZXMiIHVybD0iaHR0cDovL29yZy5lY2xpcHNlLnVpLmludHJvL3J1bkFjdGlvbj9wbHVnaW5JZD1vcmcuZWNsaXBzZS51aS5pZGUmYW1wO2NsYXNzPW9yZy5lY2xpcHNlLnVpLmludGVybmFsLmlkZS51cGRhdGUuSW5zdGFsbFdpemFyZEFjdGlvbiIgaWQ9InVwZGF0ZXMiPgotICAgICAgICAgICAgICAgICAgICA8dGV4dD5HZXQgdGhlIGxhdGVzdCB1cGRhdGVzIGZyb20gRWNsaXBzZS5vcmc8L3RleHQ+Ci0gICAgICAgICAgICAgICAgPC9saW5rPgotICAgICAgICAgICAgICAgIDxsaW5rIGxhYmVsPSJFY2xpcHNlIGNvbW11bml0eSIgdXJsPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnIiBpZD0iZWNsaXBzZSI+Ci0gICAgICAgICAgICAgICAgICAgIDx0ZXh0PkpvaW4gdGhlIGNvbW11bml0eSwgcmVhZCBhcnRpY2xlcyBhbmQgbmV3cyBvbiBFY2xpcHNlLm9yZzwvdGV4dD4KLSAgICAgICAgICAgICAgICA8L2xpbms+Ci0gICAgICAgICAgICAgICAgPGFuY2hvciBpZD0ibGlua3NBbmNob3IiLz4KLSAgICAgICAgICAgIDwvZ3JvdXA+Ci0gICAgICAgICAgICA8YW5jaG9yIGlkPSJlbmRBbmNob3IiLz4KLSAgICAgICAgPC9ncm91cD4KLSAgICA8L3BhZ2U+Ci0gICAgCi08L2ludHJvQ29udGVudD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9wbHVnaW4ucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmI0NWZjMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUgotCi0jIFBsdWctaW4KLXBsdWdpbk5hbWU9RVBGIEludHJvZHVjdGlvbgotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCi0KLQotCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vcGx1Z2luLnhtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZDMyZmQ5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTxwbHVnaW4+Ci0KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5pbnRybyI+Ci0gICAgICA8aW50cm8KLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS51aS5pbnRyby5jb25maWcuQ3VzdG9taXphYmxlSW50cm9QYXJ0IgotICAgICAgICAgICAgaWNvbj0iaWNvbnMvZnVsbC9vYmoxNi9wcm9kdWN0LmdpZiIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYudWkuaW50cm8iLz4KLSAgICAgICAgIDxpbnRyb1Byb2R1Y3RCaW5kaW5nCi0gICAgICAgICAgICAgICBpbnRyb0lkPSJvcmcuZWNsaXBzZS5lcGYudWkuaW50cm8iCi0gICAgICAgICAgICAgICBwcm9kdWN0SWQ9Im9yZy5lY2xpcHNlLmVwZi5yY3AudWkuY29tcG9zZXIiLz4KLSAgIDwvZXh0ZW5zaW9uPgotICAgCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkuaW50cm8uY29uZmlnIj4KLSAgICAgIDxjb25maWcKLSAgICAgICAgICAgIGNvbnRlbnQ9IiRubCQvaW50cm9Db250ZW50LnhtbCIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS5pbnRyby5jb25maWciCi0gICAgICAgICAgICBpbnRyb0lkPSJvcmcuZWNsaXBzZS5lcGYudWkuaW50cm8iPgotICAgICAgICAgPHByZXNlbnRhdGlvbiBob21lLXBhZ2UtaWQ9InJvb3QiIHN0YW5kYnktcGFnZS1pZD0ic3RhbmRieSI+Ci0gICAgICAgICAgIAk8aW1wbGVtZW50YXRpb24KLSAgICAgICAgICAgCSAgCSAgIHdzPSJ3aW4zMixndGsiCi0gICAgICAgICAgIAkgIAkgICBzdHlsZT0iY3NzL3NoYXJlZC5jc3MiCi0gICAgICAgICAgIAkgIAkgICBraW5kPSJodG1sIgotICAgICAgICAgICAJICAJICAgb3M9IndpbjMyLGxpbnV4Ij4KLSAgICAgICAgICAgCTwvaW1wbGVtZW50YXRpb24+Ci0gICAgICAgICAgICA8aW1wbGVtZW50YXRpb24ga2luZD0ic3d0Ii8+Ci0gICAgICAgICAgICAgICA8bGF1bmNoQmFyCi0gICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbj0icmlnaHQiCi0gICAgICAgICAgICAgICAgICAgICBiZz0iI2RlZGNmNSI+Ci0gICAgICAgICAgICAgICA8aGFuZGxlCi0gICAgICAgICAgICAgICAgICAgICBjbG9zZT0idHJ1ZSIKLSAgICAgICAgICAgICAgICAgICAgIGltYWdlPSJjc3MvZ3JhcGhpY3MvY29udGVudHBhZ2UvaGFuZGxlLmdpZiIvPgotICAgICAgICAgICAgICAgPHNob3J0Y3V0Ci0gICAgICAgICAgICAgICAgICAgICBpY29uPSJjc3MvZ3JhcGhpY3MvaWNvbnMvZXRvb2wvb3ZlcnZpZXcuZ2lmIgotICAgICAgICAgICAgICAgICAgICAgdG9vbHRpcD0iJXNob3J0Y3V0Lm92ZXJ2aWV3LnRvb2x0aXAiCi0gICAgICAgICAgICAgICAgICAgICB1cmw9Imh0dHA6Ly9vcmcuZWNsaXBzZS51aS5pbnRyby9zaG93UGFnZT9pZD1vdmVydmlldyIvPgotICAgICAgICAgICAgICAgPHNob3J0Y3V0Ci0gICAgICAgICAgICAgICAgICAgICB0b29sdGlwPSIlc2hvcnRjdXQudHV0b3JpYWxzLnRvb2x0aXAiCi0gICAgICAgICAgICAgICAgICAgICBpY29uPSJjc3MvZ3JhcGhpY3MvaWNvbnMvZXRvb2wvdHV0b3JpYWxzLmdpZiIKLSAgICAgICAgICAgICAgICAgICAgIHVybD0iaHR0cDovL29yZy5lY2xpcHNlLnVpLmludHJvL3Nob3dQYWdlP2lkPXR1dG9yaWFscyIvPgotICAgICAgICAgICAgICAgPHNob3J0Y3V0Ci0gICAgICAgICAgICAgICAgICAgICB0b29sdGlwPSIlc2hvcnRjdXQuZmlyc3RzdGVwcy50b29sdGlwIgotICAgICAgICAgICAgICAgICAgICAgaWNvbj0iY3NzL2dyYXBoaWNzL2ljb25zL2V0b29sL2ZpcnN0ZXBzNDguZ2lmIgotICAgICAgICAgICAgICAgICAgICAgdXJsPSJodHRwOi8vb3JnLmVjbGlwc2UudWkuaW50cm8vc2hvd1BhZ2U/aWQ9c3RlcHMiLz4KLSAgICAgICAgICAgICAgIDxzaG9ydGN1dAotICAgICAgICAgICAgICAgICAgICAgdG9vbHRpcD0iJXNob3J0Y3V0LndlYnJlc291cmNlcy50b29sdGlwIgotICAgICAgICAgICAgICAgICAgICAgaWNvbj0iY3NzL2dyYXBoaWNzL2ljb25zL2V0b29sL3dlYnJzcmMxNi5naWYiCi0gICAgICAgICAgICAgICAgICAgICB1cmw9Imh0dHA6Ly9vcmcuZWNsaXBzZS51aS5pbnRyby9zaG93UGFnZT9pZD13ZWIiLz4KLSAgICAgICAgICAgIDwvbGF1bmNoQmFyPgotICAgICAgICAgPC9wcmVzZW50YXRpb24+Ci0gICAgICA8L2NvbmZpZz4KLSAgIDwvZXh0ZW5zaW9uPgotCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkuaW50cm8uY29uZmlnRXh0ZW5zaW9uIj4KLSAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgIG5hbWU9Im9wZW5DaGVhdHNoZWV0VmlldyIKLSAgICAgICAgICAgIHJlcGxhY2VzPSJydW5BY3Rpb24/Y2xhc3M9b3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zLk9wZW5DaGVhdHNoZWV0VmlldyZhbXA7cGx1Z2luSWQ9b3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aSI+Ci0gICAgICA8L2FjdGlvbj4KLSAgIDwvZXh0ZW5zaW9uPgotCi08L3BsdWdpbj4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby93ZWxjb21lLnhtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby93ZWxjb21lLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmUzNjI4ZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vd2VsY29tZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgPz4gCi08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLQotPHdlbGNvbWVQYWdlIAotCXRpdGxlPSJFY2xpcHNlIFBsYXRmb3JtIgotCWZvcm1hdD0ibm93cmFwIj4KLQk8aW50cm8+VGhpcyBwYWdlIHdpbGwgaGVscCBmYW1pbGlhcml6ZSB5b3Ugd2l0aCB0aGUgRWNsaXBzZSBXb3JrYmVuY2guCi1UbyBnZXQgc3RhcnRlZCwgcmVhZCB0aGUgc2VjdGlvbnMgYmVsb3cgYW5kIGNsaWNrIG9uIHRoZSByZWxhdGVkIGxpbmtzLiA8L2ludHJvPgotCi08aXRlbT48Yj5JbnN0YWxsZWQgRmVhdHVyZXMgPC9iPgotVG8gZmluZCBvdXQgbW9yZSBhYm91dCB0aGUgZmVhdHVyZXMgaW5zdGFsbGVkIGluIHlvdXIgd29ya2JlbmNoLCBjaG9vc2UgPGFjdGlvbiBwbHVnaW5JZD0ib3JnLmVjbGlwc2UudWkuaWRlIiAgY2xhc3M9Im9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuUXVpY2tTdGFydEFjdGlvbiI+SGVscCA+IFdlbGNvbWUuLi48L2FjdGlvbj4KLWFuZCBzZWxlY3QgdGhlIGZlYXR1cmUgeW91IGFyZSBpbnRlcmVzdGVkIGluLjwvaXRlbT4KLQotPGl0ZW0+PGI+UGVyc3BlY3RpdmVzLCB2aWV3cyBhbmQgZWRpdG9ycyA8L2I+Ci1BIHdpbmRvdyBjb250YWlucyBvbmUgb3IgbW9yZSBwZXJzcGVjdGl2ZXMuIEEgcGVyc3BlY3RpdmUgY29uc2lzdHMgb2Ygdmlld3MgKGUuZy4gTmF2aWdhdG9yKSAKLWFuZCBlZGl0b3JzIGZvciB3b3JraW5nIHdpdGggeW91ciByZXNvdXJjZXMuCi0KLVRoZSBzaG9ydGN1dCBiYXIgYXQgdGhlIGZhciBsZWZ0IG9mIHRoZSB3aW5kb3cgYWxsb3dzIHlvdSB0byBvcGVuIG5ldyBwZXJzcGVjdGl2ZXMgYW5kIG1vdmUKLWJldHdlZW4gcGVyc3BlY3RpdmVzIHRoYXQgYXJlIGFscmVhZHkgb3Blbi4gVGhlIHBlcnNwZWN0aXZlIHlvdSBhcmUgY3VycmVudGx5IHdvcmtpbmcgd2l0aCAKLWlzIHNob3duIGluIHRoZSB0aXRsZSBvZiB0aGUgd2luZG93IGFuZCBpbiB0aGUgc2hvcnRjdXQgYmFyIGFzIGEgcHVzaGVkLWluIGljb24uPC9pdGVtPgotCi08aXRlbT48Yj5Db25maWd1cmluZyB5b3VyIHBlcnNwZWN0aXZlczwvYj4KLVlvdSBjYW4gbW92ZSB2aWV3cyBhbmQgZWRpdG9ycyBhcm91bmQgdGhlIHdvcmtiZW5jaCBieSBkcmFnZ2luZyB0aGVpciB0aXRsZWJhcnMuIFlvdSBjYW4KLWFsc28gYWRkIG1vcmUgdmlld3MgdG8geW91ciBjdXJyZW50IHBlcnNwZWN0aXZlIGJ5IHVzaW5nIFdpbmRvdyA+IFNob3cgVmlldy4gCi1UbyByZXNldCB0aGUgcGVyc3BlY3RpdmUgdG8gaXRzIG9yaWdpbmFsIHN0YXRlLCBjaG9vc2UgPGFjdGlvbiBwbHVnaW5JZD0ib3JnLmVjbGlwc2UudWkiICBjbGFzcz0ib3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuUmVzZXRQZXJzcGVjdGl2ZUFjdGlvbiI+V2luZG93ID4gUmVzZXQgUGVyc3BlY3RpdmU8L2FjdGlvbj4uIAotCi1PbmNlIHlvdSBoYXZlIGFycmFuZ2VkIHlvdXIgcGVyc3BlY3RpdmUsIHlvdSBjYW4gc2F2ZSBpdCB1c2luZyBXaW5kb3cgPiBTYXZlIFBlcnNwZWN0aXZlIEFzLi4uLiAKLVlvdSBjYW4gY3VzdG9taXplIHRoZSB2aWV3cywgcGVyc3BlY3RpdmVzIGFuZCBOZXcgbWVudSBvcGVyYXRpb25zIHRoYXQgc2hvdyB1cCBmb3IgCi15b3VyIHBlcnNwZWN0aXZlLiBUbyBkbyB0aGlzIGNob29zZSA8YWN0aW9uIHBsdWdpbklkPSJvcmcuZWNsaXBzZS51aSIgIGNsYXNzPSJvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5FZGl0QWN0aW9uU2V0c0FjdGlvbiI+V2luZG93ID4gQ3VzdG9taXplIFBlcnNwZWN0aXZlLi4uPC9hY3Rpb24+IC4gIEEgdmlldyBjYW4KLWFkZGl0aW9uYWxseSBiZSBjb252ZXJ0ZWQgaW50byBhIEZhc3QgVmlldyBieSBkcmFnZ2luZyBpdCB0byB0aGUgc2hvcnRjdXQgYmFyIChhdCB0aGUgCi1mYXIgbGVmdCBvZiB0aGUgd2luZG93KS4gPC9pdGVtPiAKLQotPGl0ZW0+PGI+Sm9pbiBhIENWUyB0ZWFtPC9iPgotVG8gam9pbiBhIENWUyBkZXZlbG9wbWVudCB0ZWFtLCBvcGVuIHRoZSA8YWN0aW9uIHBsdWdpbklkPSJvcmcuZWNsaXBzZS50ZWFtLmN2cy51aSIgY2xhc3M9Im9yZy5lY2xpcHNlLnRlYW0uaW50ZXJuYWwuY2N2cy51aS5hY3Rpb25zLlNob3dDVlNQZXJzcGVjdGl2ZUFjdGlvbiI+Q1ZTIFJlcG9zaXRvcnkgRXhwbG9yaW5nIHBlcnNwZWN0aXZlPC9hY3Rpb24+LiBOZXh0LCBzcGVjaWZ5Ci10aGUgbG9jYXRpb24gb2YgeW91ciBDVlMgcmVwb3NpdG9yeS4gVG8gZG8gdGhpcywgY2hvb3NlIDxhY3Rpb24gcGx1Z2luSWQ9Im9yZy5lY2xpcHNlLnRlYW0uY3ZzLnVpIiBjbGFzcz0ib3JnLmVjbGlwc2UudGVhbS5pbnRlcm5hbC5jY3ZzLnVpLnJlcG8uTmV3Q1ZTUmVwb3NpdG9yeUFjdGlvbiI+TmV3ID4gUmVwb3NpdG9yeSBMb2NhdGlvbi4uLjwvYWN0aW9uPiBmcm9tIHRoZQotQ1ZTIFJlcG9zaXRvcmllcyB2aWV3IHBvcHVwIG1lbnUuIFdoZW4gdGhlIGxvY2F0aW9uIHdpemFyZCBvcGVucywgZmlsbCBpbiB0aGUgZGV0YWlscyBvZiB5b3VyCi1DVlMgcmVwb3NpdG9yeSBhbmQgY2xpY2sgRmluaXNoLiAKLQotQSByZXBvc2l0b3J5IGxvY2F0aW9uIHdpbGwgYXBwZWFyIGluIHRoZSBDVlMgUmVwb3NpdG9yaWVzIHZpZXcuIEV4cGFuZCB0aGUgbG9jYXRpb24sIHRoZW4gZXhwYW5kCi10aGUgSEVBRCBicmFuY2guIFlvdSB3aWxsIHNlZSBhIGxpc3Qgb2YgdGhlIG1vZHVsZXMgaW4gdGhhdCByZXBvc2l0b3J5LiBTZWxlY3QgYSBtb2R1bGUgYW5kIGNob29zZSAKLTxiPkNoZWNrb3V0IGFzIFByb2plY3Q8L2I+IGZyb20gdGhlIGNvbnRleHQgbWVudS4gVGhpcyB3aWxsIGNoZWNrb3V0IHRoZSBtb2R1bGUgZnJvbSB0aGUgQ1ZTIAotcmVwb3NpdG9yeSBhbmQgY3JlYXRlIGEgcHJvamVjdCBieSB0aGF0IG5hbWUgaW4geW91ciB3b3Jrc3BhY2UuPC9pdGVtPgotCi08aXRlbT48Yj5SdW5uaW5nIGFuIEFudCBCdWlsZGZpbGU8L2I+Ci1UbyBydW4gYW4gQW50IGJ1aWxkZmlsZSwgY2xpY2sgb24gUnVuID4gRXh0ZXJuYWwgVG9vbHMgPiBFeHRlcm5hbCBUb29scy4uLi4gU2VsZWN0IEFudCBCdWlsZCBhcyB0aGUgbGF1bmNoCi1jb25maWd1cmF0aW9uIHR5cGUgYW5kIGNsaWNrIE5ldy4gSWRlbnRpZnkgdGhlIGJ1aWxkZmlsZSBpbiB0aGUgTG9jYXRpb24gZmllbGQgYW5kIHRoZW4gY2xpY2sgUnVuLjwvaXRlbT4KLQotPGl0ZW0+PGI+TGVhcm4gbW9yZSA8L2I+Ci1UbyBsZWFybiBtb3JlIHlvdSBjYW4gYnJvd3NlIHRoZSA8dG9waWMgaWQ9Ii9vcmcuZWNsaXBzZS5wbGF0Zm9ybS5kb2MudXNlci90b2MueG1sIj5Xb3JrYmVuY2ggVXNlciBHdWlkZTwvdG9waWM+LiBCcm93c2UgdGhlIDx0b3BpYyBocmVmPSIvb3JnLmVjbGlwc2UucGxhdGZvcm0uZG9jLnVzZXIvcmVmZXJlbmNlL3JlZi1hbnRpY29ucy5odG0iPkV4dGVybmFsIFRvb2xzIGFuZCBBbnQgSWNvbnM8L3RvcGljPgotc2VjdGlvbiB0byByZWNvZ25pemUgdGhlIHZhcmlvdXMgRXh0ZXJuYWwgVG9vbHMgYW5kIEFudCBlbGVtZW50cy4gPC9pdGVtPgotCi08L3dlbGNvbWVQYWdlPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLy5jbGFzc3BhdGggYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzUxYzhmMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS8ucHJvamVjdCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmJhMTEwNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5lcGYudWk8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpL01FVEEtSU5GL01BTklGRVNULk1GIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNmYwNzA1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5lcGYudWk7IHNpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuNS4wLnF1YWxpZmllcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UuZXBmLnVpLkVQRlVJUGx1Z2luCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUsCi0gb3JnLmVjbGlwc2UuZXBmLmNvbW1vbiwKLSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LAotIG9yZy5lY2xpcHNlLnVpLAotIG9yZy5lY2xpcHNlLmVwZi5jb21tb24udWkKLUVjbGlwc2UtTGF6eVN0YXJ0OiB0cnVlCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuZXBmLnVpLAotIG9yZy5lY2xpcHNlLmVwZi51aS5hY3Rpb25zLAotIG9yZy5lY2xpcHNlLmVwZi51aS5kaWFsb2dzLAotIG9yZy5lY2xpcHNlLmVwZi51aS5lZGl0b3JzLAotIG9yZy5lY2xpcHNlLmVwZi51aS5wcmVmZXJlbmNlcywKLSBvcmcuZWNsaXBzZS5lcGYudWkudXRpbCwKLSBvcmcuZWNsaXBzZS5lcGYudWkud2l6YXJkcwotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkvYnVpbGQucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OGZmZTEwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1zb3VyY2UuLiA9IHNyYy8KLW91dHB1dC4uID0gYmluLwotYmluLmluY2x1ZGVzID0gTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIC4sXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBzY2hlbWEvCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkvcGx1Z2luLnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxODBlYTcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLQotIyBQbHVnLWluCi1wbHVnaW5OYW1lPUVQRiBVSQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCi0KLSMgVmlld3MKLXZpZXdDYXRlZ29yeU5hbWU9TWV0aG9kIEF1dGhvcmluZwotCi0jIFdpemFyZHMKLXdpemFyZENhdGVnb3J5TmFtZT1NZXRob2QgQXV0aG9yaW5nCi0KLSMgQWN0aW9uIFNldAotYWN0aW9uU2V0TGFiZWw9TWV0aG9kIEF1dGhvcmluZwotCi0jIFByZWZlcmVuY2UgUGFnZXMKLXJvb3RQcmVmZXJlbmNlUGFnZU5hbWU9TWV0aG9kCi0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS9wbHVnaW4ueG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzODBiYTguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPHBsdWdpbj4KLQotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnZpZXdzIj4KLSAgICAgIDxjYXRlZ29yeQotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi51aS52aWV3cy5jYXRlZ29yeSIKLSAgICAgICAgICAgIG5hbWU9IiV2aWV3Q2F0ZWdvcnlOYW1lIj4KLSAgICAgIDwvY2F0ZWdvcnk+Ci0gICA8L2V4dGVuc2lvbj4KLQotICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkubmV3V2l6YXJkcyI+Ci0gICAgICA8Y2F0ZWdvcnkKLSAgICAgICAgICAgIGlkID0gIm9yZy5lY2xpcHNlLmVwZi51aS5uZXdXaXphcmRzLmNhdGVnb3J5IgotICAgICAgICAgICAgbmFtZT0iJXdpemFyZENhdGVnb3J5TmFtZSI+Ci0gICAgICA8L2NhdGVnb3J5PgotICAgPC9leHRlbnNpb24+Ci0KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5leHBvcnRXaXphcmRzIj4KLSAgICAgIDxjYXRlZ29yeQotICAgICAgICAgICAgaWQgPSAib3JnLmVjbGlwc2UuZXBmLnVpLmV4cG9ydFdpemFyZHMuY2F0ZWdvcnkiCi0gICAgICAgICAgICBuYW1lPSIld2l6YXJkQ2F0ZWdvcnlOYW1lIj4KLSAgICAgIDwvY2F0ZWdvcnk+Ci0gICA8L2V4dGVuc2lvbj4KLQotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmltcG9ydFdpemFyZHMiPgotICAgICAgPGNhdGVnb3J5Ci0gICAgICAgICAgICBpZCA9ICJvcmcuZWNsaXBzZS5lcGYudWkuaW1wb3J0V2l6YXJkcy5jYXRlZ29yeSIKLSAgICAgICAgICAgIG5hbWU9IiV3aXphcmRDYXRlZ29yeU5hbWUiPgotICAgICAgPC9jYXRlZ29yeT4KLSAgIDwvZXh0ZW5zaW9uPgotCi0gICA8ZXh0ZW5zaW9uLXBvaW50Ci0gICAgICAgICBpZD0iZXhwb3J0V2l6YXJkcyIKLSAgICAgICAgIG5hbWU9IkVQRiBFeHBvcnQgV2l6YXJkcyIKLSAgICAgICAgIHNjaGVtYT0ic2NoZW1hL0V4cG9ydFdpemFyZHMuZXhzZCIvPgotCi0gICA8ZXh0ZW5zaW9uLXBvaW50Ci0gICAgICAgICBpZD0iaW1wb3J0V2l6YXJkcyIKLSAgICAgICAgIG5hbWU9IkVQRiBJbXBvcnQgV2l6YXJkcyIKLSAgICAgICAgIHNjaGVtYT0ic2NoZW1hL0ltcG9ydFdpemFyZHMuZXhzZCIvPgotCi0gICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5wcmVmZXJlbmNlUGFnZXMiPgotICAgICAgPHBhZ2UKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYudWkucHJlZmVyZW5jZXMuUm9vdFByZWZlcmVuY2VQYWdlIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi51aS5wcmVmZXJlbmNlcy5Sb290UHJlZmVyZW5jZVBhZ2UiCi0gICAgICAgICAgICBuYW1lPSIlcm9vdFByZWZlcmVuY2VQYWdlTmFtZSIvPgotICAgPC9leHRlbnNpb24+Ci0KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpL3NjaGVtYS9FeHBvcnRXaXphcmRzLmV4c2QgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkvc2NoZW1hL0V4cG9ydFdpemFyZHMuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTg5MzhmMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkvc2NoZW1hL0V4cG9ydFdpemFyZHMuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDExMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS5lcGYudWkiPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLmVwZi51aSIgaWQ9ImV4cG9ydFdpemFyZHMiIG5hbWU9IkVQRiBFeHBvcnQgV2l6YXJkcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBFbmFibGVzIGEgcGx1Zy1pbiB0byBjb250cmlidXRlIGFuIGV4cG9ydCB3aXphcmQgdG8gdGhlIHN0YW5kYWxvbmUgUkNQLWJhc2VkIEVQRiBDb21wb3NlciBVSS4KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0id2l6YXJkIiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9IndpemFyZCI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAxLjAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgVGhlIGZvbGxvd2luZyBpcyBhbiBleGFtcGxlIG9mIGhvdyB0aGUgZXh0ZW5zaW9uIHBvaW50IGNhbiBiZSB1c2VkOiAKLSZsdDtwJmd0OwotJmx0O3ByZSZndDsKLSAgICZsdDtleHRlbnNpb24gcG9pbnQ9JnF1b3Q7b3JnLmVjbGlwc2UuZXBmLnVpLmV4cG9ydFdpemFyZHMmcXVvdDsmZ3Q7Ci0gICAgICAmbHQ7d2l6YXJkIGlkPSZxdW90O29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLnVpLndpemFyZHMuRXhwb3J0TVNQV2l6YXJkJnF1b3Q7LyZndDsKLSAgICZsdDsvZXh0ZW5zaW9uJmd0OwotJmx0Oy9wcmUmZ3Q7Ci0mbHQ7L3AmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiZsdDticiZndDsKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICZsdDthIAotaHJlZj0mcXVvdDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZxdW90OyZndDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZsdDsvYSZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotPC9zY2hlbWE+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkvc2NoZW1hL0ltcG9ydFdpemFyZHMuZXhzZCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS9zY2hlbWEvSW1wb3J0V2l6YXJkcy5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZDA3ODM0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS9zY2hlbWEvSW1wb3J0V2l6YXJkcy5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTExICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLmVwZi51aSI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2UuZXBmLnVpIiBpZD0iaW1wb3J0V2l6YXJkcyIgbmFtZT0iRVBGIEltcG9ydCBXaXphcmRzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIEVuYWJsZXMgYSBwbHVnLWluIHRvIGNvbnRyaWJ1dGUgYW4gaW1wb3J0IHdpemFyZCB0byB0aGUgc3RhbmRhbG9uZSBSQ1AtYmFzZWQgRVBGIENvbXBvc2VyIFVJLgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJ3aXphcmQiIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSB0cmFuc2xhdGFibGU9InRydWUiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0id2l6YXJkIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIDEuMAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBUaGUgZm9sbG93aW5nIGlzIGFuIGV4YW1wbGUgb2YgaG93IHRoZSBleHRlbnNpb24gcG9pbnQgY2FuIGJlIHVzZWQ6IAotJmx0O3AmZ3Q7Ci0mbHQ7cHJlJmd0OwotICAgJmx0O2V4dGVuc2lvbiBwb2ludD0mcXVvdDtvcmcuZWNsaXBzZS5lcGYudWkuaW1wb3J0V2l6YXJkcyZxdW90OyZndDsKLSAgICAgICZsdDt3aXphcmQgaWQ9JnF1b3Q7b3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy54bWwud2l6YXJkcy5JbXBvcnRYTUxXaXphcmQmcXVvdDsvJmd0OwotICAgJmx0Oy9leHRlbnNpb24mZ3Q7Ci0mbHQ7L3ByZSZndDsKLSZsdDsvcCZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuJmx0O2JyJmd0OwotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgJmx0O2EgCi1ocmVmPSZxdW90O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJnF1b3Q7Jmd0O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJmx0Oy9hJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VpL0VQRlVJUGx1Z2luLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkvc3JjL29yZy9lY2xpcHNlL2VwZi91aS9FUEZVSVBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkN2UxODA0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VpL0VQRlVJUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpLkFic3RyYWN0UGx1Z2luOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotCi0vKioKLSAqIFRoZSBFUEYgVUkgcGx1Zy1pbiBjbGFzcy4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4yCi0gKi8KLXB1YmxpYyBjbGFzcyBFUEZVSVBsdWdpbiBleHRlbmRzIEFic3RyYWN0UGx1Z2luIHsKLQotCS8vIFRoZSBzaGFyZWQgcGx1Zy1pbiBpbnN0YW5jZS4KLQlwcml2YXRlIHN0YXRpYyBFUEZVSVBsdWdpbiBwbHVnaW47Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBFUEZVSVBsdWdpbigpIHsKLQkJc3VwZXIoKTsKLQkJcGx1Z2luID0gdGhpczsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5jb21tb24udWkuQWJzdHJhY3RQbHVnaW4jc3RhcnQob3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQpCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RhcnQoY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpLkFic3RyYWN0UGx1Z2luI3N0b3Aob3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQpCi0JICovCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdG9wKGNvbnRleHQpOwotCQlwbHVnaW4gPSBudWxsOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHNoYXJlZCBpbnN0YW5jZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBzaGFyZWQgcGx1Zy1pbiBpbnN0YW5jZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgRVBGVUlQbHVnaW4gZ2V0RGVmYXVsdCgpIHsKLQkJcmV0dXJuIHBsdWdpbjsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkvc3JjL29yZy9lY2xpcHNlL2VwZi91aS9FUEZVSVJlc291cmNlcy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvdWkvRVBGVUlSZXNvdXJjZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTZkODMxYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkvc3JjL29yZy9lY2xpcHNlL2VwZi91aS9FUEZVSVJlc291cmNlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotLyoqCi0gKiBUaGUgRVBGIFVJIHJlc291cmNlIGJ1bmRsZS4KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgRVBGVUlSZXNvdXJjZXMgZXh0ZW5kcyBOTFMgewotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIEJVTkRMRV9OQU1FID0gRVBGVUlSZXNvdXJjZXMuY2xhc3MuZ2V0UGFja2FnZSgpCi0JCQkuZ2V0TmFtZSgpCi0JCQkrICIuUmVzb3VyY2VzIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBFUEZVSVJlc291cmNlcygpIHsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEaWFsb2dfZmlsZU5hbWVDb25mbGljdF90aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERpYWxvZ19maWxlTmFtZUNvbmZsaWN0X21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERpYWxvZ19maWxlTmFtZV9zZWxlY3RBY3Rpb25fbGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEaWFsb2dfZmlsZU5hbWVfZGVzdGluYXRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEaWFsb2dfZmlsZU5hbWVDb25mbGljdF9ub3RlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGlhbG9nX2ZpbGVOYW1lX3JlcGxhY2VfbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGlhbG9nX2ZpbGVOYW1lX3VuaXF1ZV9tc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBpbnRlcm5hbEVycm9yX3JlYXNvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGluaXRpYWxpemVXaXphcmRFcnJvcl9yZWFzb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBpbml0aWFsaXplV2l6YXJkUGFnZXNFcnJvcl9yZWFzb247Ci0KLQlzdGF0aWMgewotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBFUEZVSVJlc291cmNlcy5jbGFzcyk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkvc3JjL29yZy9lY2xpcHNlL2VwZi91aS9SZXNvdXJjZXMucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VpL1Jlc291cmNlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZjkwMzEzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VpL1Jlc291cmNlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb25Db3Jwb3JhdGlvbi4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUgotCi0jIEZpbGUgTmFtZSBDb25mbGljdCBEaWFsb2cKLURpYWxvZ19maWxlTmFtZUNvbmZsaWN0X3RpdGxlPUZpbGUgTmFtZSBDb25mbGljdAotRGlhbG9nX2ZpbGVOYW1lQ29uZmxpY3RfbXNnPUlVUFUwMjAwVzogVGhlIGZpbGUgJyd7MH0nJyBhbHJlYWR5IGV4aXN0cyBpbiB0aGUgbWV0aG9kIGxpYnJhcnkgcmVzb3VyY2UgZm9sZGVyICcnezF9JycuCi1EaWFsb2dfZmlsZU5hbWVDb25mbGljdF9ub3RlPU5vdGU6IEFub3RoZXIgbWV0aG9kIGVsZW1lbnQgbWlnaHQgcmVmZXJlbmNlIHRoaXMgZmlsZS4KLURpYWxvZ19maWxlTmFtZV9yZXBsYWNlX21zZz1SZXBsYWNlIGV4aXN0aW5nIGZpbGUgd2l0aCBuZXcgZmlsZQotRGlhbG9nX2ZpbGVOYW1lX3VuaXF1ZV9tc2c9U3BlY2lmeSB1bmlxdWUgbmFtZSBmb3IgdGhpcyBuZXcgZmlsZQotRGlhbG9nX2ZpbGVOYW1lX3NlbGVjdEFjdGlvbl9sYWJlbD1TZWxlY3QgYWN0aW9uOgotCi0jIEVycm9yIE1lc3NhZ2VzCi1pbnRlcm5hbEVycm9yX3JlYXNvbj1BbiBpbnRlcm5hbCBlcnJvciBoYXMgb2NjdXJyZWQuXG5cbkNsaWNrIERldGFpbHMgZm9yIG1vcmUgaW5mb3JtYXRpb24uCi1pbml0aWFsaXplV2l6YXJkRXJyb3JfcmVhc29uPVRoZSB3aXphcmQgaGFzIG5vdCBiZWVuIGluaXRpYWxpemVkIGNvcnJlY3RseS4KLWluaXRpYWxpemVXaXphcmRQYWdlc0Vycm9yX3JlYXNvbj1PbmUgb3IgbW9yZSB3aXphcmQgcGFnZXMgaGF2ZSBub3QgYmVlbiBpbml0aWFsaXplZCBjb3JyZWN0bHkuCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkvc3JjL29yZy9lY2xpcHNlL2VwZi91aS9hY3Rpb25zL0NDb21ib0NvbnRyaWJ1dGlvbkl0ZW0uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VpL2FjdGlvbnMvQ0NvbWJvQ29udHJpYnV0aW9uSXRlbS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MjgxZjA3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VpL2FjdGlvbnMvQ0NvbWJvQ29udHJpYnV0aW9uSXRlbS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51aS5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQ29udHJpYnV0aW9uSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ0NvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRGlzcG9zZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRGlzcG9zZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29vbEJhcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db29sSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Ub29sQmFyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRvb2xJdGVtOwotCi0vKioKLSAqIFdyYXBzIGEgQ0NvbWJvIGluIGEgQ29udHJpYnV0aW9uSXRlbSBmb3IgdXNlIGluIGEgdG9vbGJhcgotICogCi0gKiBEb2VzIG5vdCB1c2UgYSBDb21ib1ZpZXdlciBiZWNhdXNlIG9mIHRhYmJpbmcgaXNzdWVzIC0gc2VlIGJ1ZyA3ODg4NQotICogQGF1dGhvciBKZWZmIEhhcmR5Ci0gKgotICovCi1wdWJsaWMgY2xhc3MgQ0NvbWJvQ29udHJpYnV0aW9uSXRlbSBleHRlbmRzIENvbnRyaWJ1dGlvbkl0ZW0gewotCi0JcHJvdGVjdGVkIENDb21ibyBDQ29tYm87Ci0KLQlwcm90ZWN0ZWQgVG9vbEl0ZW0gdG9vbEl0ZW07Ci0KLQlwcm90ZWN0ZWQgQ29vbEl0ZW0gY29vbEl0ZW07Ci0JCi0JcHJvdGVjdGVkIGludCBzdHlsZTsKLQkKLQlwcm90ZWN0ZWQgQ29sbGVjdGlvbjxTdHJpbmc+IGlucHV0OwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgQ0NvbWJvQ29udHJpYnV0aW9uSXRlbShpbnQgc3R5bGUpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5zdHlsZSA9IHN0eWxlOwotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQ29udHJpYnV0aW9uSXRlbSNmaWxsKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRvb2xCYXIsCi0JICogICAgICBpbnQpCi0JICovCi0JcHVibGljIHZvaWQgZmlsbChUb29sQmFyIHBhcmVudCwgaW50IGluZGV4KSB7Ci0JCXRvb2xJdGVtID0gbmV3IFRvb2xJdGVtKHBhcmVudCwgU1dULlNFUEFSQVRPUik7Ci0JCUNvbnRyb2wgYm94ID0gY3JlYXRlQ29udHJvbChwYXJlbnQpOwotCQl0b29sSXRlbS5zZXRDb250cm9sKGJveCk7Ci0JCVBvaW50IHByZWZlcnJlZFNpemUgPSBDQ29tYm8uY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxULCB0cnVlKTsKLQkJdG9vbEl0ZW0uc2V0V2lkdGgocHJlZmVycmVkU2l6ZS54KTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkNvbnRyaWJ1dGlvbkl0ZW0jZmlsbChvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db29sQmFyLAotCSAqICAgICAgaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGZpbGwoQ29vbEJhciBjb29sQmFyLCBpbnQgaW5kZXgpIHsKLQkJQ29udHJvbCBib3ggPSBjcmVhdGVDb250cm9sKGNvb2xCYXIpOwotCi0JCWlmIChpbmRleCA+PSAwKSB7Ci0JCQljb29sSXRlbSA9IG5ldyBDb29sSXRlbShjb29sQmFyLCBTV1QuRFJPUF9ET1dOLCBpbmRleCk7Ci0JCX0gZWxzZSB7Ci0JCQljb29sSXRlbSA9IG5ldyBDb29sSXRlbShjb29sQmFyLCBTV1QuRFJPUF9ET1dOKTsKLQkJfQotCi0JCS8vIFNldCB0aGUgYmFjayByZWZlcmVuY2UuCi0JCWNvb2xJdGVtLnNldERhdGEodGhpcyk7Ci0KLQkJLy8gQWRkIHRoZSB0b29sYmFyIHRvIHRoZSBDb29sSXRlbSB3aWRnZXQuCi0JCWNvb2xJdGVtLnNldENvbnRyb2woYm94KTsKLQotCQkvLyBJZiB0aGUgdG9vbGJhciBpdGVtIGV4aXN0cyB0aGVuIGFkanVzdCB0aGUgc2l6ZSBvZiB0aGUgY29vbCBpdGVtLgotCQlQb2ludCB0b29sQmFyU2l6ZSA9IGJveC5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpOwotCi0JCS8vIFNldCB0aGUgcHJlZmVycmVkIHNpemUgdG8gdGhlIHNpemUgb2YgdGhlIHRvb2xiYXIgcGx1cyB0cmltLgotCQljb29sSXRlbS5zZXRNaW5pbXVtU2l6ZSh0b29sQmFyU2l6ZSk7Ci0JCWNvb2xJdGVtLnNldFByZWZlcnJlZFNpemUodG9vbEJhclNpemUpOwotCQljb29sSXRlbS5zZXRTaXplKHRvb2xCYXJTaXplKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkNvbnRyaWJ1dGlvbkl0ZW0jZmlsbChvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCi0JICovCi0JcHVibGljIHZvaWQgZmlsbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCWNyZWF0ZUNvbnRyb2wocGFyZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBjb250cm9sLgotCSAqLwotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRyb2woZmluYWwgQ29tcG9zaXRlIHBhcmVudCkgewotCQlDQ29tYm8gPSBuZXcgQ0NvbWJvKHBhcmVudCwgc3R5bGUpOwotCQlDQ29tYm8uc2V0VmlzaWJsZUl0ZW1Db3VudCgxMCk7Ci0JCUNDb21iby5zZXRFbmFibGVkKHRydWUpOwotCQlDQ29tYm8uc2V0SXRlbXMoaW5wdXQudG9BcnJheShuZXcgU3RyaW5nWzBdKSk7Ci0JCUNDb21iby5hZGREaXNwb3NlTGlzdGVuZXIoCi0JCQkJbmV3IERpc3Bvc2VMaXN0ZW5lcigpIHsKLQkJCQkJcHVibGljIHZvaWQgd2lkZ2V0RGlzcG9zZWQoRGlzcG9zZUV2ZW50IGV2ZW50KSB7Ci0JCQkJCQlkaXNwb3NlKCk7Ci0JCQkJCX0KLQkJCQl9KTsKLQotCQlDQ29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQl9Ci0KLQkJCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQkJcGVyZm9ybVNlbGVjdGlvbkNoYW5nZWQoKTsKLQkJCQkJfQotCQkJCX0pOwotCi0JCXJldHVybiBDQ29tYm87Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY3VycmVudGx5IHNlbGVjdGVkIG1ldGhvZCBjb25maWd1cmF0aW9uCi0JICovCi0JcHJvdGVjdGVkIGludCBnZXRTZWxlY3Rpb25JbmRleCgpIHsKLQkJcmV0dXJuIENDb21iby5nZXRTZWxlY3Rpb25JbmRleCgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzZXRJbnB1dChDb2xsZWN0aW9uPFN0cmluZz4gaW5wdXQpIHsKLQkJdGhpcy5pbnB1dCA9IGlucHV0OwotCX0KLQotCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybVNlbGVjdGlvbkNoYW5nZWQoKSB7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5Db250cmlidXRpb25JdGVtI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQl9Ci0KLQlwdWJsaWMgQ0NvbWJvIGdldENDb21ibygpIHsKLQkJcmV0dXJuIENDb21ibzsKLQl9Ci0KLQlwdWJsaWMgVG9vbEl0ZW0gZ2V0VG9vbEl0ZW0oKSB7Ci0JCXJldHVybiB0b29sSXRlbTsKLQl9Ci0KLQlwdWJsaWMgQ29vbEl0ZW0gZ2V0Q29vbEl0ZW0oKSB7Ci0JCXJldHVybiBjb29sSXRlbTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkvc3JjL29yZy9lY2xpcHNlL2VwZi91aS9kaWFsb2dzL1JlbmFtZUZpbGVDb25mbGljdERpYWxvZy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvdWkvZGlhbG9ncy9SZW5hbWVGaWxlQ29uZmxpY3REaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGMxMzY1Mi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkvc3JjL29yZy9lY2xpcHNlL2VwZi91aS9kaWFsb2dzL1JlbmFtZUZpbGVDb25mbGljdERpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjk2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51aS5kaWFsb2dzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVpLkVQRlVJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci0KLS8qKgotICogRGlzcGxheXMgYSBkaWFsb2cgdGhhdCBwcm9tcHRzIHRoZSB1c2VyIHRvIHJlbmFtZSBhIGZpbGUgcGF0aC4KLSAqIAotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAc2luY2UgMS4yCi0gKi8KLXB1YmxpYyBjbGFzcyBSZW5hbWVGaWxlQ29uZmxpY3REaWFsb2cgZXh0ZW5kcyBEaWFsb2cgewotCi0JLyoqCi0JICogVGhlIE9LIGJ1dHRvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgQnV0dG9uIG9rQnV0dG9uOwotCi0JLyoqCi0JICogVGhlIENhbmNlbCBidXR0b24uCi0JICovCi0JcHJvdGVjdGVkIEJ1dHRvbiBjYW5jZWxCdXR0b247Ci0KLQkvKioKLQkgKiBUaGUgb3ZlcndyaXRlIGJ1dHRvbgotCSAqLwotCXByb3RlY3RlZCBCdXR0b24gb3ZlcldyaXRlQnV0dG9uOwotCi0JcHJpdmF0ZSBUZXh0IGN0cmxfZmlsZU5hbWU7Ci0JcHJpdmF0ZSBpbnQgT1ZFUl9XUklURV9JRCA9IDIyOwotCXByaXZhdGUgU3RyaW5nIG1lc3NhZ2VTdHI7Ci0JcHJpdmF0ZSBTdHJpbmcgZmlsZU5hbWU7Ci0JcHJpdmF0ZSBCdXR0b24gYnV0dG9uX3JlcGxhY2U7Ci0JcHJpdmF0ZSBCdXR0b24gYnV0dG9uX3VuaXF1ZTsKLQotCXByaXZhdGUgU3RyaW5nIGRlc3RpbmF0aW9uOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZQotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKi8KLQlwdWJsaWMgUmVuYW1lRmlsZUNvbmZsaWN0RGlhbG9nKFNoZWxsIHBhcmVudCkgewotCQlzdXBlcihwYXJlbnQpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgRGlhbG9nI2NyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkKLQkgKi8KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlDb21wb3NpdGUgZGlhbG9nQXJlYSA9IChDb21wb3NpdGUpIHN1cGVyLmNyZWF0ZURpYWxvZ0FyZWEocGFyZW50KTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSAoR3JpZExheW91dCkgZGlhbG9nQXJlYS5nZXRMYXlvdXQoKTsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMTA7Ci0JCWxheW91dC5tYXJnaW5IZWlnaHQgPSAxMDsKLQkJR3JpZERhdGEgZ3JpZERhdGEgPSAoR3JpZERhdGEpIGRpYWxvZ0FyZWEuZ2V0TGF5b3V0RGF0YSgpOwotCQlncmlkRGF0YS52ZXJ0aWNhbEluZGVudCA9IDEwOwotCQlncmlkRGF0YS53aWR0aEhpbnQgPSA0NTA7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMzsKLQotCQkvLyBDcmVhdGUgbWVzc2FnZSBhcmVhLgotCi0JCUltYWdlIGltYWdlID0gRGlzcGxheS5nZXRDdXJyZW50KCkuZ2V0U3lzdGVtSW1hZ2UoU1dULklDT05fV0FSTklORyk7Ci0JCWlmIChpbWFnZSAhPSBudWxsKSB7Ci0JCQlMYWJlbCBpbWFnZUxhYmVsID0gbmV3IExhYmVsKGRpYWxvZ0FyZWEsIFNXVC5OVUxMKTsKLQkJCWltYWdlLnNldEJhY2tncm91bmQoaW1hZ2VMYWJlbC5nZXRCYWNrZ3JvdW5kKCkpOwotCQkJaW1hZ2VMYWJlbC5zZXRJbWFnZShpbWFnZSk7Ci0JCQlpbWFnZUxhYmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKAotCQkJCQlHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0NFTlRFUgotCQkJCQkJCXwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQkVHSU5OSU5HKSk7Ci0JCX0KLQotCQlMYWJlbCBtZXNzYWdlID0gbmV3IExhYmVsKGRpYWxvZ0FyZWEsIFNXVC5XUkFQKTsKLQkJaWYgKG1lc3NhZ2VTdHIgIT0gbnVsbCkgewotCQkJbWVzc2FnZS5zZXRUZXh0KG1lc3NhZ2VTdHIpOwotCQl9Ci0JCUdyaWREYXRhIGRhdGExID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWRhdGExLmhvcml6b250YWxTcGFuID0gMjsKLQkJbWVzc2FnZS5zZXRMYXlvdXREYXRhKGRhdGExKTsKLQotCQlMYWJlbCBlbXB0eSA9IG5ldyBMYWJlbChkaWFsb2dBcmVhLCBTV1QuTk9ORSk7Ci0JCWVtcHR5LnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0JCUxhYmVsIG5vdGUgPSBuZXcgTGFiZWwoZGlhbG9nQXJlYSwgU1dULk5PTkUpOwotCQlub3RlLnNldFRleHQoRVBGVUlSZXNvdXJjZXMuRGlhbG9nX2ZpbGVOYW1lQ29uZmxpY3Rfbm90ZSk7Ci0JCUdyaWREYXRhIGRhdGEyID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWRhdGEyLmhvcml6b250YWxTcGFuID0gMjsKLQkJbm90ZS5zZXRMYXlvdXREYXRhKGRhdGEyKTsKLQotCQllbXB0eSA9IG5ldyBMYWJlbChkaWFsb2dBcmVhLCBTV1QuTk9ORSk7Ci0JCWVtcHR5LnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0JCUdyaWREYXRhIGRhdGEzID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWRhdGEzLmhvcml6b250YWxTcGFuID0gMzsKLQkJZGF0YTMuaGVpZ2h0SGludCA9IDEwOwotCQllbXB0eS5zZXRMYXlvdXREYXRhKGRhdGEzKTsKLQotCQllbXB0eSA9IG5ldyBMYWJlbChkaWFsb2dBcmVhLCBTV1QuTk9ORSk7Ci0JCWVtcHR5LnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0JCUxhYmVsIHNlbGVjdEFjdGlvbiA9IG5ldyBMYWJlbChkaWFsb2dBcmVhLCBTV1QuTk9ORSk7Ci0JCXNlbGVjdEFjdGlvbi5zZXRUZXh0KEVQRlVJUmVzb3VyY2VzLkRpYWxvZ19maWxlTmFtZV9zZWxlY3RBY3Rpb25fbGFiZWwpOwotCQlHcmlkRGF0YSBkYXRhNCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlkYXRhNC5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCXNlbGVjdEFjdGlvbi5zZXRMYXlvdXREYXRhKGRhdGE0KTsKLQotCQllbXB0eSA9IG5ldyBMYWJlbChkaWFsb2dBcmVhLCBTV1QuTk9ORSk7Ci0JCWVtcHR5LnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0JCWVtcHR5ID0gbmV3IExhYmVsKGRpYWxvZ0FyZWEsIFNXVC5OT05FKTsKLQkJZW1wdHkuc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLQkJYnV0dG9uX3JlcGxhY2UgPSBuZXcgQnV0dG9uKGRpYWxvZ0FyZWEsIFNXVC5SQURJTyk7Ci0JCS8vIExhYmVsIHJlcGxhY2VfbGFiZWwgPSBuZXcgTGFiZWwoZGlhbG9nQXJlYSwgU1dULk5PTkUpOwotCQkvLyByZXBsYWNlX2xhYmVsLnNldFRleHQoRVBGVUlSZXNvdXJjZXMuRGlhbG9nX2ZpbGVOYW1lX3JlcGxhY2VfbXNnKTsKLQkJYnV0dG9uX3JlcGxhY2Uuc2V0VGV4dChFUEZVSVJlc291cmNlcy5EaWFsb2dfZmlsZU5hbWVfcmVwbGFjZV9tc2cpOwotCQlidXR0b25fcmVwbGFjZS5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0KLQkJZW1wdHkgPSBuZXcgTGFiZWwoZGlhbG9nQXJlYSwgU1dULk5PTkUpOwotCQllbXB0eS5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotCQllbXB0eSA9IG5ldyBMYWJlbChkaWFsb2dBcmVhLCBTV1QuTk9ORSk7Ci0JCWVtcHR5LnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0JCWJ1dHRvbl91bmlxdWUgPSBuZXcgQnV0dG9uKGRpYWxvZ0FyZWEsIFNXVC5SQURJTyk7Ci0JCS8vIExhYmVsIHVuaXF1ZUxhYmVsID0gbmV3IExhYmVsKGRpYWxvZ0FyZWEsIFNXVC5OT05FKTsKLQkJLy8gdW5pcXVlTGFiZWwuc2V0VGV4dChFUEZVSVJlc291cmNlcy5EaWFsb2dfZmlsZU5hbWVfdW5pcXVlX21zZyk7Ci0JCWJ1dHRvbl91bmlxdWUuc2V0VGV4dChFUEZVSVJlc291cmNlcy5EaWFsb2dfZmlsZU5hbWVfdW5pcXVlX21zZyk7Ci0JCWJ1dHRvbl91bmlxdWUuc2V0U2VsZWN0aW9uKGZhbHNlKTsKLQotCQkvLyBDcmVhdGUgbGFiZWwgYXJlYS4gLS0gVE9ETzogZmluZCBkaWZmZXJlbnQgd2F5IGluc3RlYWQgb2YgZW1wdHkKLQkJLy8gbGFiZWxzLgotCQllbXB0eSA9IG5ldyBMYWJlbChkaWFsb2dBcmVhLCBTV1QuTk9ORSk7Ci0JCWVtcHR5LnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0JCWVtcHR5ID0gbmV3IExhYmVsKGRpYWxvZ0FyZWEsIFNXVC5OT05FKTsKLQkJZW1wdHkuc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLQkJY3RybF9maWxlTmFtZSA9IG5ldyBUZXh0KGRpYWxvZ0FyZWEsIFNXVC5CT1JERVIpOwotCQlHcmlkRGF0YSBncmlkRGF0YTEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuQkVHSU5OSU5HKTsKLQkJZ3JpZERhdGExLndpZHRoSGludCA9IDIwMDsKLQkJZ3JpZERhdGExLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQ0VOVEVSOwotCQljdHJsX2ZpbGVOYW1lLnNldExheW91dERhdGEoZ3JpZERhdGExKTsKLQkJaWYgKGZpbGVOYW1lICE9IG51bGwpIHsKLQkJCWN0cmxfZmlsZU5hbWUuc2V0VGV4dChmaWxlTmFtZSk7Ci0JCQljdHJsX2ZpbGVOYW1lLnNldEVuYWJsZWQoZmFsc2UpOwotCQl9Ci0JCWN0cmxfZmlsZU5hbWUuYWRkTW9kaWZ5TGlzdGVuZXIobmV3IE1vZGlmeUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0JCQkJaWYgKG9rQnV0dG9uICE9IG51bGwpIHsKLQkJCQkJb2tCdXR0b24KLQkJCQkJCQkuc2V0RW5hYmxlZChjdHJsX2ZpbGVOYW1lLmdldFRleHQoKS50cmltKCkubGVuZ3RoKCkgPiAwKTsKLQkJCQl9Ci0JCQkJZmlsZU5hbWUgPSBjdHJsX2ZpbGVOYW1lLmdldFRleHQoKTsKLQkJCQlGaWxlIGZpbGUgPSBuZXcgRmlsZShkZXN0aW5hdGlvbiArIEZpbGUuc2VwYXJhdG9yICsgZmlsZU5hbWUpOwotCQkJCWlmIChmaWxlLmV4aXN0cygpKSB7Ci0JCQkJCW9rQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCW9rQnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQotCQlidXR0b25fcmVwbGFjZS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCWN0cmxfZmlsZU5hbWUuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJb2tCdXR0b24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCX0KLQkJfSk7Ci0KLQkJYnV0dG9uX3VuaXF1ZS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCWN0cmxfZmlsZU5hbWUuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQlmaWxlTmFtZSA9IGN0cmxfZmlsZU5hbWUuZ2V0VGV4dCgpOwotCQkJCUZpbGUgZmlsZSA9IG5ldyBGaWxlKGRlc3RpbmF0aW9uICsgRmlsZS5zZXBhcmF0b3IgKyBmaWxlTmFtZSk7Ci0JCQkJaWYgKGZpbGUuZXhpc3RzKCkpIHsKLQkJCQkJb2tCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJb2tCdXR0b24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQl9Ci0JCX0pOwotCi0JCXN1cGVyLmdldFNoZWxsKCkuc2V0VGV4dChFUEZVSVJlc291cmNlcy5EaWFsb2dfZmlsZU5hbWVDb25mbGljdF90aXRsZSk7IAotCi0JCXJldHVybiBkaWFsb2dBcmVhOwotCi0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgZGlhbG9nIGJ1dHRvbnMuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQnV0dG9uc0ZvckJ1dHRvbkJhcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCS8vIENyZWF0ZSB0aGUgT0sgYnV0dG9uLgotCQkvLyBjcmVhdGVCdXR0b24ocGFyZW50LCBPVkVSX1dSSVRFX0lELAotCQkvLyBFUEZVSVJlc291cmNlcy5EaWFsb2dfZmlsZU5hbWVfb3ZlcldyaXRlLCB0cnVlKTsKLQotCQljcmVhdGVCdXR0b24ocGFyZW50LCBJRGlhbG9nQ29uc3RhbnRzLk9LX0lELCBJRGlhbG9nQ29uc3RhbnRzLk9LX0xBQkVMLAotCQkJCXRydWUpOwotCi0JCS8vIENyZWF0ZSB0aGUgQ2FuY2VsIGJ1dHRvbi4KLQkJY3JlYXRlQnV0dG9uKHBhcmVudCwgSURpYWxvZ0NvbnN0YW50cy5DQU5DRUxfSUQsCi0JCQkJSURpYWxvZ0NvbnN0YW50cy5DQU5DRUxfTEFCRUwsIGZhbHNlKTsKLQotCQkvLyBTZXQgaGVscCBjb250ZXh0IGZvciB0aGUgT0sgYnV0dG9uLgotCQlva0J1dHRvbiA9IHN1cGVyLmdldEJ1dHRvbihJRGlhbG9nQ29uc3RhbnRzLk9LX0lEKTsKLQotCQkvLyBTZXQgaGVscCBjb250ZXh0IGZvciB0aGUgQ2FuY2VsIGJ1dHRvbi4KLQkJY2FuY2VsQnV0dG9uID0gc3VwZXIuZ2V0QnV0dG9uKElEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0lEKTsKLQotCQkvLyBTZXQgaGVscCBjb250ZXh0IGZvciB0aGUgb3ZlcndyaXRlIGJ1dHRvbgotCQkvLyBvdmVyV3JpdGVCdXR0b24gPSBzdXBlci5nZXRCdXR0b24oT1ZFUl9XUklURV9JRCk7Ci0KLQkJLy8gb2tCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogQ2FsbGVkIHdoZW4gdGhlIE9LIGJ1dHRvbiBpcyBzZWxlY3RlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBva1ByZXNzZWQoKSB7Ci0JCXN1cGVyLm9rUHJlc3NlZCgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIEZpbGUgTmFtZQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RmlsZVBhdGgoKSB7Ci0JCXJldHVybiBmaWxlTmFtZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRGaWxlUGF0aChTdHJpbmcgZmlsZU5hbWUpIHsKLQkJdGhpcy5maWxlTmFtZSA9IGZpbGVOYW1lOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUJ1dHRvbkJhcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXJldHVybiBzdXBlci5jcmVhdGVCdXR0b25CYXIocGFyZW50KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBidXR0b25QcmVzc2VkKGludCBidXR0b25JZCkgewotCQlpZiAoYnV0dG9uSWQgPT0gT1ZFUl9XUklURV9JRCkgewotCQkJb3ZlcldyaXRlUHJlc3NlZCgpOwotCQl9Ci0JCXN1cGVyLmJ1dHRvblByZXNzZWQoYnV0dG9uSWQpOwotCX0KLQotCXByaXZhdGUgdm9pZCBvdmVyV3JpdGVQcmVzc2VkKCkgewotCQlzZXRSZXR1cm5Db2RlKE9WRVJfV1JJVEVfSUQpOwotCQljbG9zZSgpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNhbmNlbFByZXNzZWQoKSB7Ci0JCWZpbGVOYW1lID0gbnVsbDsKLQkJc3VwZXIuY2FuY2VsUHJlc3NlZCgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZVN0cigpIHsKLQkJcmV0dXJuIG1lc3NhZ2VTdHI7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TWVzc2FnZVN0cihTdHJpbmcgbWVzc2FnZVN0cikgewotCQl0aGlzLm1lc3NhZ2VTdHIgPSBtZXNzYWdlU3RyOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldERlc3RpbmF0aW9uKFN0cmluZyBkZXN0aW5hdGlvbikgewotCQl0aGlzLmRlc3RpbmF0aW9uID0gZGVzdGluYXRpb247Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkvc3JjL29yZy9lY2xpcHNlL2VwZi91aS9lZGl0b3JzL0lNZXRob2RFZGl0b3IuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VpL2VkaXRvcnMvSU1ldGhvZEVkaXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDJmZTI1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VpL2VkaXRvcnMvSU1ldGhvZEVkaXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51aS5lZGl0b3JzOwotCi1wdWJsaWMgaW50ZXJmYWNlIElNZXRob2RFZGl0b3IgewotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkvc3JjL29yZy9lY2xpcHNlL2VwZi91aS9wcmVmZXJlbmNlcy9CYXNlUHJlZmVyZW5jZVBhZ2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VpL3ByZWZlcmVuY2VzL0Jhc2VQcmVmZXJlbmNlUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDJmMjc3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VpL3ByZWZlcmVuY2VzL0Jhc2VQcmVmZXJlbmNlUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTA0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51aS5wcmVmZXJlbmNlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51aS51dGlsLlNXVFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlRleHRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DaGVja2JveFRhYmxlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGlzdFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZTsKLQotLyoqCi0gKiBUaGUgYWJzdHJhY3QgYmFzZSBjbGFzcyBmb3IgYWxsIEVQRiBwcmVmZXJlbmNlIHBhZ2VzLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjIKLSAqLwotYWJzdHJhY3QgcHVibGljIGNsYXNzIEJhc2VQcmVmZXJlbmNlUGFnZSBleHRlbmRzIFByZWZlcmVuY2VQYWdlIGltcGxlbWVudHMKLQkJSVdvcmtiZW5jaFByZWZlcmVuY2VQYWdlIHsKLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFByZWZlcmVuY2VQYWdlI2luaXQoSVdvcmtiZW5jaCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2ggd29ya2JlbmNoKSB7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIGNvbXBvc2l0ZSB3aXRoIGEgZ3JpZCBsYXlvdXQuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBjb21wb3NpdGUKLQkgKiBAcGFyYW0gY29sdW1uCi0JICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIGNvbHVtbiBjZWxscyB0aGF0IHRoZSBjb21wb3NpdGUgd2lsbCB0YWtlIHVwCi0JICogQHJldHVybiBhIDxjb2RlPkNvbXBvc2l0ZTwvY29kZT4gb2JqZWN0Ci0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBDb21wb3NpdGUgY3JlYXRlR3JpZExheW91dENvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50LAotCQkJaW50IGNvbHVtbikgewotCQlyZXR1cm4gU1dUVXRpbC5jcmVhdGVHcmlkTGF5b3V0Q29tcG9zaXRlKHBhcmVudCwgY29sdW1uKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgY2hpbGQgY29tcG9zaXRlIHdpdGggYSBncmlkIGxheW91dC4KLQkgKiA8cD4KLQkgKiBUaGUgY2hpbGQgY29tcG9zaXRlIHdpbGwgYmUgaW5kZW50ZWQgZnJvbSB0aGUgcGFyZW50IGNvbXBvc2l0ZS4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IGNvbXBvc2l0ZQotCSAqIEBwYXJhbSBjb2x1bW4KLQkgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgY29sdW1uIGNlbGxzIHRoYXQgdGhlIGNvbXBvc2l0ZSB3aWxsIHRha2UgdXAKLQkgKiBAcmV0dXJuIGEgPGNvZGU+Q29tcG9zaXRlPC9jb2RlPiBvYmplY3QKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIENvbXBvc2l0ZSBjcmVhdGVDaGlsZEdyaWRMYXlvdXRDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCwKLQkJCWludCBjb2x1bW4pIHsKLQkJcmV0dXJuIFNXVFV0aWwuY3JlYXRlQ2hpbGRHcmlkTGF5b3V0Q29tcG9zaXRlKHBhcmVudCwgY29sdW1uKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgZ3JvdXAgd2l0aCBhIGdyaWQgbGF5b3V0LgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgY29tcG9zaXRlCi0JICogQHBhcmFtIHRleHQKLQkgKiAgICAgICAgICAgIHRoZSB0ZXh0IGZvciB0aGUgZ3JvdXAKLQkgKiBAcGFyYW0gY29sdW1uCi0JICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIGNvbHVtbiBjZWxscyB0aGF0IHRoZSBncm91cCB3aWxsIHRha2UgdXAKLQkgKiBAcmV0dXJuIGEgPGNvZGU+R3JvdXA8L2NvZGU+IG9iamVjdAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgR3JvdXAgY3JlYXRlR3JpZExheW91dEdyb3VwKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyB0ZXh0LAotCQkJaW50IGNvbHVtbikgewotCQlyZXR1cm4gU1dUVXRpbC5jcmVhdGVHcmlkTGF5b3V0R3JvdXAocGFyZW50LCB0ZXh0LCBjb2x1bW4pOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBncm91cCB3aXRoIGEgZ3JpZCBsYXlvdXQuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBjb21wb3NpdGUKLQkgKiBAcGFyYW0gdGV4dAotCSAqICAgICAgICAgICAgdGhlIHRleHQgZm9yIHRoZSBncm91cAotCSAqIEBwYXJhbSBjb2x1bW4KLQkgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgY29sdW1uIGNlbGxzIHRoYXQgdGhlIGdyb3VwIHdpbGwgdGFrZSB1cAotCSAqIEBwYXJhbSBlcXVhbENvbHVtbldpZHRoCi0JICogICAgICAgICAgICBmbGFnIHRvIGluZGljYXRlIHdoZXRoZXIgY29sdW1uIGNlbGxzIHNob3VsZCBiZSBzYW1lIHdpZHRoIG9yCi0JICogICAgICAgICAgICBub3QKLQkgKiBAcmV0dXJuIGEgPGNvZGU+R3JvdXA8L2NvZGU+IG9iamVjdAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgR3JvdXAgY3JlYXRlR3JpZExheW91dEdyb3VwKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyB0ZXh0LAotCQkJaW50IGNvbHVtbiwgYm9vbGVhbiBlcXVhbENvbHVtbldpZHRoKSB7Ci0JCXJldHVybiBTV1RVdGlsLmNyZWF0ZUdyaWRMYXlvdXRHcm91cChwYXJlbnQsIHRleHQsIGNvbHVtbiwKLQkJCQllcXVhbENvbHVtbldpZHRoKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbGFiZWwuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBjb21wb3NpdGUKLQkgKiBAcGFyYW0gdGV4dAotCSAqICAgICAgICAgICAgdGhlIHRleHQgZm9yIHRoZSBsYWJlbAotCSAqIEBwYXJhbSBjb2x1bW4KLQkgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgY29sdW1uIGNlbGxzIHRoYXQgdGhlIGxhYmVsIHdpbGwgdGFrZSB1cAotCSAqIEByZXR1cm4gYSA8Y29kZT5MYWJlbDwvY29kZT4gb2JqZWN0Ci0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBMYWJlbCBjcmVhdGVMYWJlbChDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgdGV4dCwgaW50IGNvbHVtbikgewotCQlyZXR1cm4gU1dUVXRpbC5jcmVhdGVMYWJlbChwYXJlbnQsIHRleHQsIGNvbHVtbik7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIGxhYmVsIHRoYXQgb25seSB0YWtlcyB1cCBvbmUgY29sdW1uIGNlbGwuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBjb21wb3NpdGUKLQkgKiBAcGFyYW0gdGV4dAotCSAqICAgICAgICAgICAgdGhlIHRleHQgZm9yIHRoZSBsYWJlbAotCSAqIEByZXR1cm4gYSA8Y29kZT5MYWJlbDwvY29kZT4gb2JqZWN0Ci0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBMYWJlbCBjcmVhdGVMYWJlbChDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgdGV4dCkgewotCQlyZXR1cm4gU1dUVXRpbC5jcmVhdGVMYWJlbChwYXJlbnQsIHRleHQpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gZWRpdGFibGUgdGV4dCBjb250cm9sLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgY29tcG9zaXRlCi0JICogQHBhcmFtIGRlZmF1bHRUZXh0Ci0JICogICAgICAgICAgICB0aGUgZGVmYXVsdCB0ZXh0IGZvciB0aGUgY29udHJvbAotCSAqIEBwYXJhbSB3aWR0aEhpbnQKLQkgKiAgICAgICAgICAgIHRoZSBwcmVmZXJyZWQgd2lkdGggKGluIHBpeGVscykgZm9yIHRoZSBjb250cm9sCi0JICogQHBhcmFtIGhlaWdodEhpbnQKLQkgKiAgICAgICAgICAgIHRoZSBwcmVmZXJyZWQgaGVpZ2h0IChpbiBwaXhlbHMpIGZvciB0aGUgY29udHJvbAotCSAqIEBwYXJhbSBjb2x1bW4KLQkgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgY29sdW1uIGNlbGxzIHRoYXQgdGhlIGNvbnRyb2wgd2lsbCB0YWtlIHVwCi0JICogQHJldHVybiBhIDxjb2RlPlRleHQ8L2NvZGU+IG9iamVjdAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgVGV4dCBjcmVhdGVFZGl0YWJsZVRleHQoQ29tcG9zaXRlIHBhcmVudCwKLQkJCVN0cmluZyBkZWZhdWx0VGV4dCwgaW50IHdpZHRoSGludCwgaW50IGhlaWdodEhpbnQsIGludCBjb2x1bW4pIHsKLQkJcmV0dXJuIFNXVFV0aWwuY3JlYXRlRWRpdGFibGVUZXh0KHBhcmVudCwgZGVmYXVsdFRleHQsIHdpZHRoSGludCwKLQkJCQloZWlnaHRIaW50LCBjb2x1bW4pOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSByZWFkb25seSB0ZXh0IGNvbnRyb2wuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBjb21wb3NpdGUKLQkgKiBAcGFyYW0gZGVmYXVsdFRleHQKLQkgKiAgICAgICAgICAgIHRoZSBkZWZhdWx0IHRleHQgZm9yIHRoZSBjb250cm9sCi0JICogQHBhcmFtIHdpZHRoSGludAotCSAqICAgICAgICAgICAgdGhlIHByZWZlcnJlZCB3aWR0aCAoaW4gcGl4ZWxzKSBmb3IgdGhlIGNvbnRyb2wKLQkgKiBAcGFyYW0gY29sdW1uCi0JICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIGNvbHVtbiBjZWxscyB0aGF0IHRoZSBjb250cm9sIHdpbGwgdGFrZSB1cAotCSAqIEByZXR1cm4gYSA8Y29kZT5UZXh0PC9jb2RlPiBvYmplY3QKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIFRleHQgY3JlYXRlVGV4dChDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgZGVmYXVsdFRleHQsCi0JCQlpbnQgd2lkdGhIaW50LCBpbnQgY29sdW1uKSB7Ci0JCXJldHVybiBTV1RVdGlsLmNyZWF0ZVRleHQocGFyZW50LCBkZWZhdWx0VGV4dCwgd2lkdGhIaW50LCBjb2x1bW4pOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gcmVhZG9ubHkgdGV4dCBjb250cm9sIHRoYXQgb25seSB0YWtlcyB1cCBvbmUgY29sdW1uIGNlbGwuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBjb21wb3NpdGUKLQkgKiBAcGFyYW0gZGVmYXVsdFRleHQKLQkgKiAgICAgICAgICAgIHRoZSBkZWZhdWx0IHRleHQgZm9yIHRoZSBjb250cm9sCi0JICogQHJldHVybiBhIDxjb2RlPlRleHQ8L2NvZGU+IG9iamVjdAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgVGV4dCBjcmVhdGVUZXh0KENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyBkZWZhdWx0VGV4dCkgewotCQlyZXR1cm4gU1dUVXRpbC5jcmVhdGVUZXh0KHBhcmVudCwgZGVmYXVsdFRleHQpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gZWRpdGFibGUgdGV4dCBjb250cm9sLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgY29tcG9zaXRlCi0JICogQHBhcmFtIGRlZmF1bHRUZXh0Ci0JICogICAgICAgICAgICB0aGUgZGVmYXVsdCB0ZXh0IGZvciB0aGUgY29udHJvbAotCSAqIEBwYXJhbSB3aWR0aEhpbnQKLQkgKiAgICAgICAgICAgIHRoZSBwcmVmZXJyZWQgd2lkdGggKGluIHBpeGVscykgZm9yIHRoZSBjb250cm9sCi0JICogQHBhcmFtIGNvbHVtbgotCSAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiBjb2x1bW4gY2VsbHMgdGhhdCB0aGUgY29udHJvbCB3aWxsIHRha2UgdXAKLQkgKiBAcmV0dXJuIGEgPGNvZGU+VGV4dDwvY29kZT4gb2JqZWN0Ci0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBUZXh0IGNyZWF0ZUVkaXRhYmxlVGV4dChDb21wb3NpdGUgcGFyZW50LAotCQkJU3RyaW5nIGRlZmF1bHRUZXh0LCBpbnQgd2lkdGhIaW50LCBpbnQgY29sdW1uKSB7Ci0JCXJldHVybiBTV1RVdGlsLmNyZWF0ZUVkaXRhYmxlVGV4dChwYXJlbnQsIGRlZmF1bHRUZXh0LCB3aWR0aEhpbnQsCi0JCQkJY29sdW1uKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGVkaXRhYmxlIHRleHQgY29udHJvbC4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IGNvbXBvc2l0ZQotCSAqIEBwYXJhbSBkZWZhdWx0VGV4dAotCSAqICAgICAgICAgICAgdGhlIGRlZmF1bHQgdGV4dCBmb3IgdGhlIGNvbnRyb2wKLQkgKiBAcGFyYW0gd2lkdGhIaW50Ci0JICogICAgICAgICAgICB0aGUgcHJlZmVycmVkIHdpZHRoIChpbiBwaXhlbHMpIGZvciB0aGUgY29udHJvbAotCSAqIEBwYXJhbSBjb2x1bW4KLQkgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgY29sdW1uIGNlbGxzIHRoYXQgdGhlIGNvbnRyb2wgd2lsbCB0YWtlIHVwCi0JICogQHJldHVybiBhIDxjb2RlPlRleHQ8L2NvZGU+IG9iamVjdAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgVGV4dCBjcmVhdGVFZGl0YWJsZVRleHQoQ29tcG9zaXRlIHBhcmVudCwKLQkJCVN0cmluZyBkZWZhdWx0VGV4dCwgaW50IHdpZHRoSGludCkgewotCQlyZXR1cm4gU1dUVXRpbC5jcmVhdGVFZGl0YWJsZVRleHQocGFyZW50LCBkZWZhdWx0VGV4dCwgd2lkdGhIaW50KTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGVkaXRhYmxlIHRleHQgY29udHJvbC4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IGNvbXBvc2l0ZQotCSAqIEBwYXJhbSBjb2x1bW4KLQkgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgY29sdW1uIGNlbGxzIHRoYXQgdGhlIGNvbnRyb2wgd2lsbCB0YWtlIHVwCi0JICogQHJldHVybiBhIDxjb2RlPlRleHQ8L2NvZGU+IG9iamVjdAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgVGV4dCBjcmVhdGVFZGl0YWJsZVRleHQoQ29tcG9zaXRlIHBhcmVudCwgaW50IGNvbHVtbikgewotCQlyZXR1cm4gU1dUVXRpbC5jcmVhdGVFZGl0YWJsZVRleHQocGFyZW50LCBjb2x1bW4pOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gZWRpdGFibGUgdGV4dCBjb250cm9sIHRoYXQgb25seSB0YWtlcyB1cCBvbmUgY29sdW1uIGNlbGwuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBjb21wb3NpdGUKLQkgKiBAcGFyYW0gZGVmYXVsdFRleHQKLQkgKiAgICAgICAgICAgIHRoZSBkZWZhdWx0IHRleHQgZm9yIHRoZSBjb250cm9sCi0JICogQHJldHVybiBhIDxjb2RlPlRleHQ8L2NvZGU+IG9iamVjdAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgVGV4dCBjcmVhdGVFZGl0YWJsZVRleHQoQ29tcG9zaXRlIHBhcmVudCwKLQkJCVN0cmluZyBkZWZhdWx0VGV4dCkgewotCQlyZXR1cm4gU1dUVXRpbC5jcmVhdGVFZGl0YWJsZVRleHQocGFyZW50LCBkZWZhdWx0VGV4dCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBlbXB0eSBlZGl0YWJsZSB0ZXh0IGNvbnRyb2wgdGhhdCBvbmx5IHRha2VzIHVwIG9uZSBjb2x1bW4KLQkgKiBjZWxsLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgY29tcG9zaXRlCi0JICogQHBhcmFtIGRlZmF1bHRUZXh0Ci0JICogICAgICAgICAgICB0aGUgZGVmYXVsdCB0ZXh0IGZvciB0aGUgY29udHJvbAotCSAqIEByZXR1cm4gYSA8Y29kZT5UZXh0PC9jb2RlPiBvYmplY3QKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIFRleHQgY3JlYXRlRWRpdGFibGVUZXh0KENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJcmV0dXJuIFNXVFV0aWwuY3JlYXRlRWRpdGFibGVUZXh0KHBhcmVudCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIHJlYWRvbmx5IG11bHRpLWxpbmUgdGV4dCBjb250cm9sLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgY29tcG9zaXRlCi0JICogQHBhcmFtIGRlZmF1bHRUZXh0Ci0JICogICAgICAgICAgICB0aGUgZGVmYXVsdCB0ZXh0IGZvciB0aGUgY29udHJvbAotCSAqIEBwYXJhbSB3aWR0aEhpbnQKLQkgKiAgICAgICAgICAgIHRoZSBwcmVmZXJyZWQgd2lkdGggKGluIHBpeGVscykgZm9yIHRoZSBjb250cm9sCi0JICogQHBhcmFtIGhlaWdodEhpbnQKLQkgKiAgICAgICAgICAgIHRoZSBwcmVmZXJyZWQgaGVpZ2h0IChpbiBwaXhlbHMpIGZvciB0aGUgY29udHJvbAotCSAqIEBwYXJhbSBjb2x1bW4KLQkgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgY29sdW1uIGNlbGxzIHRoYXQgdGhlIGNvbnRyb2wgd2lsbCB0YWtlIHVwCi0JICogQHJldHVybiBhIDxjb2RlPlRleHQ8L2NvZGU+IG9iamVjdAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgVGV4dCBjcmVhdGVNdWx0aUxpbmVUZXh0KENvbXBvc2l0ZSBwYXJlbnQsCi0JCQlTdHJpbmcgZGVmYXVsdFRleHQsIGludCB3aWR0aEhpbnQsIGludCBoZWlnaHRIaW50LCBpbnQgY29sdW1uKSB7Ci0JCXJldHVybiBTV1RVdGlsLmNyZWF0ZU11bHRpTGluZVRleHQocGFyZW50LCBkZWZhdWx0VGV4dCwgd2lkdGhIaW50LAotCQkJCWhlaWdodEhpbnQsIGNvbHVtbik7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBjb21ib2JveC4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IGNvbXBvc2l0ZQotCSAqIEBwYXJhbSBjb2x1bW4KLQkgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgY29sdW1uIGNlbGxzIHRoYXQgdGhlIGNvbnRyb2wgd2lsbCB0YWtlIHVwCi0JICogQHJldHVybiBhIDxjb2RlPkNvbWJvPC9jb2RlPiBvYmplY3QKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIENvbWJvIGNyZWF0ZUNvbWJvYm94KENvbXBvc2l0ZSBwYXJlbnQsIGludCBjb2x1bW4pIHsKLQkJcmV0dXJuIFNXVFV0aWwuY3JlYXRlQ29tYm9ib3gocGFyZW50LCBjb2x1bW4pOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gY29tYm9ib3ggdGhhdCBvbmx5IHRha2VzIHVwIG9uZSBjb2x1bW4gY2VsbC4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IGNvbXBvc2l0ZQotCSAqIEByZXR1cm4gYSA8Y29kZT5Db21ibzwvY29kZT4gb2JqZWN0Ci0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBDb21ibyBjcmVhdGVDb21ib2JveChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXJldHVybiBTV1RVdGlsLmNyZWF0ZUNvbWJvYm94KHBhcmVudCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIGJ1dHRvbi4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IGNvbXBvc2l0ZQotCSAqIEBwYXJhbSB0ZXh0Ci0JICogICAgICAgICAgICB0aGUgdGV4dCBmb3IgdGhlIGNvbnRyb2wKLQkgKiBAcmV0dXJuIGEgPGNvZGU+QnV0dG9uPC9jb2RlPiBvYmplY3QKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIEJ1dHRvbiBjcmVhdGVCdXR0b24oQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIHRleHQpIHsKLQkJcmV0dXJuIFNXVFV0aWwuY3JlYXRlQnV0dG9uKHBhcmVudCwgdGV4dCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIGNoZWNrYm94LgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgY29tcG9zaXRlCi0JICogQHBhcmFtIHRleHQKLQkgKiAgICAgICAgICAgIHRoZSB0ZXh0IGZvciB0aGUgY29udHJvbAotCSAqIEBwYXJhbSBjb2x1bW4KLQkgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgY29sdW1uIGNlbGxzIHRoYXQgdGhlIGNvbnRyb2wgd2lsbCB0YWtlIHVwCi0JICogQHJldHVybiBhIDxjb2RlPkJ1dHRvbjwvY29kZT4gb2JqZWN0Ci0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBCdXR0b24gY3JlYXRlQ2hlY2tib3goQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIHRleHQsCi0JCQlpbnQgY29sdW1uKSB7Ci0JCXJldHVybiBTV1RVdGlsLmNyZWF0ZUNoZWNrYm94KHBhcmVudCwgdGV4dCwgY29sdW1uKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgY2hlY2tib3ggdGhhdCBvbmx5IHRha2VzIHVwIG9uZSBjb2x1bW4gY2VsbC4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IGNvbXBvc2l0ZQotCSAqIEBwYXJhbSB0ZXh0Ci0JICogICAgICAgICAgICB0aGUgdGV4dCBmb3IgdGhlIGNvbnRyb2wKLQkgKiBAcmV0dXJuIGEgPGNvZGU+QnV0dG9uPC9jb2RlPiBvYmplY3QKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIEJ1dHRvbiBjcmVhdGVDaGVja2JveChDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgdGV4dCkgewotCQlyZXR1cm4gU1dUVXRpbC5jcmVhdGVDaGVja2JveChwYXJlbnQsIHRleHQpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gcmFkaW8gYnV0dG9uLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgY29tcG9zaXRlCi0JICogQHBhcmFtIHRleHQKLQkgKiAgICAgICAgICAgIHRoZSB0ZXh0IGZvciB0aGUgY29udHJvbAotCSAqIEBwYXJhbSBjb2x1bW4KLQkgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgY29sdW1uIGNlbGxzIHRoYXQgdGhlIGNvbnRyb2wgd2lsbCB0YWtlIHVwCi0JICogQHBhcmFtIHNlbGVjdGVkCi0JICogICAgICAgICAgICBpZiA8Y29kZT50cnVlPC9jb2RlPiwgc2VsZWN0IHRoZSByYWRpbyBidXR0b24gYnkgZGVmYXVsdAotCSAqIEByZXR1cm4gYSA8Y29kZT5CdXR0b248L2NvZGU+IG9iamVjdAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgQnV0dG9uIGNyZWF0ZVJhZGlvQnV0dG9uKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyB0ZXh0LAotCQkJaW50IGNvbHVtbiwgYm9vbGVhbiBzZWxlY3RlZCkgewotCQlyZXR1cm4gU1dUVXRpbC5jcmVhdGVSYWRpb0J1dHRvbihwYXJlbnQsIHRleHQsIGNvbHVtbiwgc2VsZWN0ZWQpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gcmFkaW8gYnV0dG9uIHRoYXQgb25seSB0YWtlcyB1cCBvbmUgY29sdW1uIGNlbGwuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBjb21wb3NpdGUKLQkgKiBAcGFyYW0gdGV4dAotCSAqICAgICAgICAgICAgdGhlIHRleHQgZm9yIHRoZSBjb250cm9sCi0JICogQHJldHVybiBhIDxjb2RlPkJ1dHRvbjwvY29kZT4gb2JqZWN0Ci0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBCdXR0b24gY3JlYXRlUmFkaW9CdXR0b24oQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIHRleHQpIHsKLQkJcmV0dXJuIFNXVFV0aWwuY3JlYXRlUmFkaW9CdXR0b24ocGFyZW50LCB0ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgcmVhZG9ubHkgdGV4dCB2aWV3ZXIuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBjb21wb3NpdGUKLQkgKiBAcGFyYW0gd2lkdGhIaW50Ci0JICogICAgICAgICAgICB0aGUgcHJlZmVycmVkIHdpZHRoIChpbiBwaXhlbHMpIGZvciB0aGUgY29udHJvbAotCSAqIEBwYXJhbSBoZWlnaHRIaW50Ci0JICogICAgICAgICAgICB0aGUgcHJlZmVycmVkIGhlaWdodCAoaW4gcGl4ZWxzKSBmb3IgdGhlIGNvbnRyb2wKLQkgKiBAcGFyYW0gY29sdW1uCi0JICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIGNvbHVtbiBjZWxscyB0aGF0IHRoZSBjb250cm9sIHdpbGwgdGFrZSB1cAotCSAqIEByZXR1cm4gYSA8Y29kZT5UZXh0Vmlld2VyPC9jb2RlPiBvYmplY3QKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIFRleHRWaWV3ZXIgY3JlYXRlVGV4dFZpZXdlcihDb21wb3NpdGUgcGFyZW50LAotCQkJaW50IHdpZHRoSGludCwgaW50IGhlaWdodEhpbnQsIGludCBjb2x1bW4pIHsKLQkJcmV0dXJuIFNXVFV0aWwuY3JlYXRlVGV4dFZpZXdlcihwYXJlbnQsIHdpZHRoSGludCwgaGVpZ2h0SGludCwgY29sdW1uKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgcmVhZG9ubHkgdGV4dCB2aWV3ZXIgdGhhdCBvbmx5IHRha2VzIHVwIG9uZSBjb2x1bW4gY2VsbC4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IGNvbXBvc2l0ZQotCSAqIEByZXR1cm4gYSA8Y29kZT5UZXh0Vmlld2VyPC9jb2RlPiBvYmplY3QKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIFRleHRWaWV3ZXIgY3JlYXRlVGV4dFZpZXdlcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXJldHVybiBTV1RVdGlsLmNyZWF0ZVRleHRWaWV3ZXIocGFyZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgdGFibGUgdmlld2VyLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgY29tcG9zaXRlCi0JICogQHBhcmFtIHdpZHRoSGludAotCSAqICAgICAgICAgICAgdGhlIHByZWZlcnJlZCB3aWR0aCAoaW4gcGl4ZWxzKSBmb3IgdGhlIGNvbnRyb2wKLQkgKiBAcGFyYW0gaGVpZ2h0SGludAotCSAqICAgICAgICAgICAgdGhlIHByZWZlcnJlZCBoZWlnaHQgKGluIHBpeGVscykgZm9yIHRoZSBjb250cm9sCi0JICogQHBhcmFtIGNvbHVtbgotCSAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiBjb2x1bW4gY2VsbHMgdGhhdCB0aGUgY29udHJvbCB3aWxsIHRha2UgdXAKLQkgKiBAcmV0dXJuIGEgPGNvZGU+VGFibGVWaWV3ZXI8L2NvZGU+IG9iamVjdAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgVGFibGVWaWV3ZXIgY3JlYXRlVGFibGVWaWV3ZXIoQ29tcG9zaXRlIHBhcmVudCwKLQkJCWludCB3aWR0aEhpbnQsIGludCBoZWlnaHRIaW50LCBpbnQgY29sdW1uKSB7Ci0JCXJldHVybiBTV1RVdGlsLmNyZWF0ZVRhYmxlVmlld2VyKHBhcmVudCwgd2lkdGhIaW50LCBoZWlnaHRIaW50LCBjb2x1bW4pOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBjaGVja2JveCB0YWJsZSB2aWV3ZXIuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBjb21wb3NpdGUKLQkgKiBAcGFyYW0gd2lkdGhIaW50Ci0JICogICAgICAgICAgICB0aGUgcHJlZmVycmVkIHdpZHRoIChpbiBwaXhlbHMpIGZvciB0aGUgY29udHJvbAotCSAqIEBwYXJhbSBoZWlnaHRIaW50Ci0JICogICAgICAgICAgICB0aGUgcHJlZmVycmVkIGhlaWdodCAoaW4gcGl4ZWxzKSBmb3IgdGhlIGNvbnRyb2wKLQkgKiBAcGFyYW0gY29sdW1uCi0JICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIGNvbHVtbiBjZWxscyB0aGF0IHRoZSBjb250cm9sIHdpbGwgdGFrZSB1cAotCSAqIEByZXR1cm4gYSA8Y29kZT5DaGVja2JveFRhYmxlVmlld2VyPC9jb2RlPiBvYmplY3QKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIENoZWNrYm94VGFibGVWaWV3ZXIgY3JlYXRlQ2hlY2tib3hUYWJsZVZpZXdlcigKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsIGludCB3aWR0aEhpbnQsIGludCBoZWlnaHRIaW50LCBpbnQgY29sdW1uKSB7Ci0JCXJldHVybiBTV1RVdGlsLmNyZWF0ZUNoZWNrYm94VGFibGVWaWV3ZXIocGFyZW50LCB3aWR0aEhpbnQsIGhlaWdodEhpbnQsCi0JCQkJY29sdW1uKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgY2hlY2tib3ggdGFibGUgdmlld2VyLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgY29tcG9zaXRlCi0JICogQHBhcmFtIGNvbHVtbgotCSAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiBjb2x1bW4gY2VsbHMgdGhhdCB0aGUgY29udHJvbCB3aWxsIHRha2UgdXAKLQkgKiBAcmV0dXJuIGEgPGNvZGU+Q2hlY2tib3hUYWJsZVZpZXdlcjwvY29kZT4gb2JqZWN0Ci0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBDaGVja2JveFRhYmxlVmlld2VyIGNyZWF0ZUNoZWNrYm94VGFibGVWaWV3ZXIoCi0JCQlDb21wb3NpdGUgcGFyZW50LCBpbnQgY29sdW1uKSB7Ci0JCXJldHVybiBTV1RVdGlsLmNyZWF0ZUNoZWNrYm94VGFibGVWaWV3ZXIocGFyZW50LCAzNjAsIDE3NSwgY29sdW1uKTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyBhIGxpc3Qgdmlld2VyLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgY29tcG9zaXRlCi0JICogQHBhcmFtIGNvbHVtbgotCSAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiBjb2x1bW4gY2VsbHMgdGhhdCB0aGUgY29udHJvbCB3aWxsIHRha2UgdXAKLQkgKiBAcmV0dXJuIGEgPGNvZGU+TGlzdFZpZXdlcjwvY29kZT4gb2JqZWN0Ci0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBMaXN0Vmlld2VyIGNyZWF0ZUxpc3RWaWV3ZXIoCi0JCQlDb21wb3NpdGUgcGFyZW50LCBpbnQgd2lkdGhIaW50LCBpbnQgaGVpZ2h0SGludCkgewotCQlyZXR1cm4gU1dUVXRpbC5jcmVhdGVMaXN0Vmlld2VyKHBhcmVudCwgd2lkdGhIaW50LCBoZWlnaHRIaW50LCAxKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbGluZS4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IGNvbXBvc2l0ZQotCSAqIEBwYXJhbSBjb2x1bW4KLQkgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgY29sdW1uIGNlbGxzIHRoYXQgdGhlIGxpbmUgd2lsbCB0YWtlIHVwCi0JICogQHJldHVybiBhIDxjb2RlPkxhYmVsPC9jb2RlPiBvYmplY3QKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIExhYmVsIGNyZWF0ZUxpbmUoQ29tcG9zaXRlIHBhcmVudCwgaW50IGNvbHVtbikgewotCQlyZXR1cm4gU1dUVXRpbC5jcmVhdGVMaW5lKHBhcmVudCwgY29sdW1uKTsKLQl9Ci0KLQkvKioKLQkgKiBDaGVja3Mgd2hldGhlciBhIHRleHQgY29udHJvbCBoYXMgc29tZSB0ZXh0LgotCSAqIAotCSAqIEBwYXJhbSBjb250cm9sCi0JICogICAgICAgICAgICB0aGUgdGV4dCBjb250cm9sCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgdGV4dCBjb250cm9sIGhhcyBzb21lIHRleHQsCi0JICogICAgICAgICA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBib29sZWFuIGlzTm9uRW1wdHlUZXh0KFRleHQgY29udHJvbCkgewotCQlyZXR1cm4gU1dUVXRpbC5pc05vbkVtcHR5VGV4dChjb250cm9sKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VpL3ByZWZlcmVuY2VzL1Jvb3RQcmVmZXJlbmNlUGFnZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvdWkvcHJlZmVyZW5jZXMvUm9vdFByZWZlcmVuY2VQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1OTViM2MuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvdWkvcHJlZmVyZW5jZXMvUm9vdFByZWZlcmVuY2VQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudWkucHJlZmVyZW5jZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLQotLyoqCi0gKiBUaGUgcm9vdCBwcmVmZXJlbmNlIHBhZ2UuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMgotICovCi1wdWJsaWMgY2xhc3MgUm9vdFByZWZlcmVuY2VQYWdlIGV4dGVuZHMgQmFzZVByZWZlcmVuY2VQYWdlIHsKLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlUGFnZSNjcmVhdGVDb250ZW50cyhvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCi0JICovCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkgewotCQlyZXR1cm4gY3JlYXRlR3JpZExheW91dENvbXBvc2l0ZShwYXJlbnQsIDMpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlUGFnZSNwZXJmb3JtRGVmYXVsdHMoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EZWZhdWx0cygpIHsKLQkJc3VwZXIucGVyZm9ybURlZmF1bHRzKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VQYWdlI3BlcmZvcm1PaygpCi0JICovCi0JcHVibGljIGJvb2xlYW4gcGVyZm9ybU9rKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VpL3V0aWwvU1dUVXRpbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvdWkvdXRpbC9TV1RVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxNTJkN2IuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvdWkvdXRpbC9TV1RVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NTAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVpLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlRleHRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DaGVja2JveFRhYmxlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGlzdFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5TdHlsZWRUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLQotLyoqCi0gKiBIZWxwZXIgY2xhc3MgdG8gY3JlYXRlIFNXVCB3aWRnZXRzIGZvciB0aGUgRVBGIFVJLgotICogPHA+Ci0gKiBUaGlzIGNsYXNzIGhlbHBzIHRvIHByb3ZpZGUgYSBjb21tb24gbG9vayBhbmQgZmVlbCBmb3IgYWxsIEVQRiBmb3JtcywKLSAqIGRpYWxvZ3MsIHdpemFyZHMgYW5kIHByZWZlcmVuY2UgcGFnZXMuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMgotICovCi1wdWJsaWMgY2xhc3MgU1dUVXRpbCB7Ci0KLQkvKioKLQkgKiBQcmV2ZW50cyBleHRlcm5hbCBpbnN0YW50aWF0aW9uIG9mIHRoaXMgY2xhc3MuIEFsbCBtZXRob2RzIGluIHRoaXMgY2xhc3MKLQkgKiBzaG91bGQgYmUgZGVjbGFyZWQgc3RhdGljLgotCSAqLwotCXByaXZhdGUgU1dUVXRpbCgpIHsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgY29tcG9zaXRlIHdpdGggYSBncmlkIGxheW91dC4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IGNvbXBvc2l0ZQotCSAqIEBwYXJhbSBjb2x1bW4KLQkgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgY29sdW1uIGNlbGxzIHRoYXQgdGhlIGNvbXBvc2l0ZSB3aWxsIHRha2UgdXAKLQkgKiBAcmV0dXJuIGEgPGNvZGU+Q29tcG9zaXRlPC9jb2RlPiBvYmplY3QKLQkgKi8KLQlwdWJsaWMgc3RhdGljIENvbXBvc2l0ZSBjcmVhdGVHcmlkTGF5b3V0Q29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQsCi0JCQlpbnQgY29sdW1uKSB7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KGNvbHVtbiwgZmFsc2UpKTsKLQkJY29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBjaGlsZCBjb21wb3NpdGUgd2l0aCBhIGdyaWQgbGF5b3V0LgotCSAqIDxwPgotCSAqIFRoZSBjaGlsZCBjb21wb3NpdGUgd2lsbCBiZSBpbmRlbnRlZCBmcm9tIHRoZSBwYXJlbnQgY29tcG9zaXRlLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgY29tcG9zaXRlCi0JICogQHBhcmFtIGNvbHVtbgotCSAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiBjb2x1bW4gY2VsbHMgdGhhdCB0aGUgY29tcG9zaXRlIHdpbGwgdGFrZSB1cAotCSAqIEByZXR1cm4gYSA8Y29kZT5Db21wb3NpdGU8L2NvZGU+IG9iamVjdAotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ29tcG9zaXRlIGNyZWF0ZUNoaWxkR3JpZExheW91dENvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50LAotCQkJaW50IGNvbHVtbikgewotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJY29tcG9zaXRlLnNldExheW91dChuZXcgR3JpZExheW91dChjb2x1bW4sIGZhbHNlKSk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJKChHcmlkTGF5b3V0KSBjb21wb3NpdGUuZ2V0TGF5b3V0KCkpLm1hcmdpblRvcCA9IC0zOwotCQkoKEdyaWRMYXlvdXQpIGNvbXBvc2l0ZS5nZXRMYXlvdXQoKSkubWFyZ2luTGVmdCA9IDEzOwotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBncm91cCB3aXRoIGEgZ3JpZCBsYXlvdXQuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBjb21wb3NpdGUKLQkgKiBAcGFyYW0gdGV4dAotCSAqICAgICAgICAgICAgdGhlIHRleHQgZm9yIHRoZSBncm91cAotCSAqIEBwYXJhbSBjb2x1bW4KLQkgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgY29sdW1uIGNlbGxzIHRoYXQgdGhlIGdyb3VwIHdpbGwgdGFrZSB1cAotCSAqIEByZXR1cm4gYSA8Y29kZT5Hcm91cDwvY29kZT4gb2JqZWN0Ci0JICovCi0JcHVibGljIHN0YXRpYyBHcm91cCBjcmVhdGVHcmlkTGF5b3V0R3JvdXAoQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIHRleHQsCi0JCQlpbnQgY29sdW1uKSB7Ci0JCUdyb3VwIGdyb3VwID0gbmV3IEdyb3VwKHBhcmVudCwgU1dULk5PTkUpOwotCQlncm91cC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoY29sdW1uLCBmYWxzZSkpOwotCQlncm91cC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJZ3JvdXAuc2V0VGV4dCh0ZXh0KTsKLQkJcmV0dXJuIGdyb3VwOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBncm91cCB3aXRoIGEgZ3JpZCBsYXlvdXQuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBjb21wb3NpdGUKLQkgKiBAcGFyYW0gdGV4dAotCSAqICAgICAgICAgICAgdGhlIHRleHQgZm9yIHRoZSBncm91cAotCSAqIEBwYXJhbSBjb2x1bW4KLQkgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgY29sdW1uIGNlbGxzIHRoYXQgdGhlIGdyb3VwIHdpbGwgdGFrZSB1cAotCSAqIEBwYXJhbSBlcXVhbENvbHVtbldpZHRoCi0JICogICAgICAgICAgICBmbGFnIHRvIGluZGljYXRlIHdoZXRoZXIgY29sdW1uIGNlbGxzIHNob3VsZCBiZSBzYW1lIHdpZHRoIG9yCi0JICogICAgICAgICAgICBub3QKLQkgKiBAcmV0dXJuIGEgPGNvZGU+R3JvdXA8L2NvZGU+IG9iamVjdAotCSAqLwotCXB1YmxpYyBzdGF0aWMgR3JvdXAgY3JlYXRlR3JpZExheW91dEdyb3VwKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyB0ZXh0LAotCQkJaW50IGNvbHVtbiwgYm9vbGVhbiBlcXVhbENvbHVtbldpZHRoKSB7Ci0JCUdyb3VwIGdyb3VwID0gbmV3IEdyb3VwKHBhcmVudCwgU1dULk5PTkUpOwotCQlncm91cC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoY29sdW1uLCBlcXVhbENvbHVtbldpZHRoKSk7Ci0JCWdyb3VwLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQlncm91cC5zZXRUZXh0KHRleHQpOwotCQlyZXR1cm4gZ3JvdXA7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIGxhYmVsLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgY29tcG9zaXRlCi0JICogQHBhcmFtIHRleHQKLQkgKiAgICAgICAgICAgIHRoZSB0ZXh0IGZvciB0aGUgbGFiZWwKLQkgKiBAcGFyYW0gY29sdW1uCi0JICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIGNvbHVtbiBjZWxscyB0aGF0IHRoZSBsYWJlbCB3aWxsIHRha2UgdXAKLQkgKiBAcmV0dXJuIGEgPGNvZGU+TGFiZWw8L2NvZGU+IG9iamVjdAotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGFiZWwgY3JlYXRlTGFiZWwoQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIHRleHQsIGludCBjb2x1bW4pIHsKLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTk9ORSk7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWdkLmhvcml6b250YWxTcGFuID0gY29sdW1uOwotCQlsYWJlbC5zZXRMYXlvdXREYXRhKGdkKTsKLQkJbGFiZWwuc2V0VGV4dCh0ZXh0KTsKLQkJcmV0dXJuIGxhYmVsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBsYWJlbCB0aGF0IG9ubHkgdGFrZXMgdXAgb25lIGNvbHVtbiBjZWxsLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgY29tcG9zaXRlCi0JICogQHBhcmFtIHRleHQKLQkgKiAgICAgICAgICAgIHRoZSB0ZXh0IGZvciB0aGUgbGFiZWwKLQkgKiBAcmV0dXJuIGEgPGNvZGU+TGFiZWw8L2NvZGU+IG9iamVjdAotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGFiZWwgY3JlYXRlTGFiZWwoQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIHRleHQpIHsKLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTk9ORSk7Ci0JCWxhYmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKCkpOwotCQlsYWJlbC5zZXRUZXh0KHRleHQpOwotCQlyZXR1cm4gbGFiZWw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIHZlcnRpY2FsbHkgYWxpZ25lZCBsYWJlbCB0aGF0IG9ubHkgdGFrZXMgdXAgb25lIGNvbHVtbiBjZWxsLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgY29tcG9zaXRlCi0JICogQHBhcmFtIHRleHQKLQkgKiAgICAgICAgICAgIHRoZSB0ZXh0IGZvciB0aGUgbGFiZWwKLQkgKiBAcmV0dXJuIGEgPGNvZGU+TGFiZWw8L2NvZGU+IG9iamVjdAotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGFiZWwgY3JlYXRlVmVydGljYWxseUFsaWduZWRMYWJlbChDb21wb3NpdGUgcGFyZW50LAotCQkJU3RyaW5nIHRleHQpIHsKLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTk9ORSk7Ci0JCWxhYmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0JFR0lOTklORykpOwotCQlsYWJlbC5zZXRUZXh0KHRleHQpOwotCQlyZXR1cm4gbGFiZWw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIHJlYWRvbmx5IHRleHQgY29udHJvbC4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IGNvbXBvc2l0ZQotCSAqIEBwYXJhbSBkZWZhdWx0VGV4dAotCSAqICAgICAgICAgICAgdGhlIGRlZmF1bHQgdGV4dCBmb3IgdGhlIGNvbnRyb2wKLQkgKiBAcGFyYW0gd2lkdGhIaW50Ci0JICogICAgICAgICAgICB0aGUgcHJlZmVycmVkIHdpZHRoIChpbiBwaXhlbHMpIGZvciB0aGUgY29udHJvbAotCSAqIEBwYXJhbSBjb2x1bW4KLQkgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgY29sdW1uIGNlbGxzIHRoYXQgdGhlIGNvbnRyb2wgd2lsbCB0YWtlIHVwCi0JICogQHJldHVybiBhIDxjb2RlPlRleHQ8L2NvZGU+IG9iamVjdAotCSAqLwotCXB1YmxpYyBzdGF0aWMgVGV4dCBjcmVhdGVUZXh0KENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyBkZWZhdWx0VGV4dCwKLQkJCWludCB3aWR0aEhpbnQsIGludCBjb2x1bW4pIHsKLQkJVGV4dCB0ZXh0ID0gbmV3IFRleHQocGFyZW50LCBTV1QuQk9SREVSIHwgU1dULlJFQURfT05MWSk7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWdkLmhvcml6b250YWxTcGFuID0gY29sdW1uOwotCQlnZC53aWR0aEhpbnQgPSB3aWR0aEhpbnQ7Ci0JCXRleHQuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCXJldHVybiB0ZXh0OwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gcmVhZG9ubHkgdGV4dCBjb250cm9sIHRoYXQgb25seSB0YWtlcyB1cCBvbmUgY29sdW1uIGNlbGwuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBjb21wb3NpdGUKLQkgKiBAcGFyYW0gZGVmYXVsdFRleHQKLQkgKiAgICAgICAgICAgIHRoZSBkZWZhdWx0IHRleHQgZm9yIHRoZSBjb250cm9sCi0JICogQHJldHVybiBhIDxjb2RlPlRleHQ8L2NvZGU+IG9iamVjdAotCSAqLwotCXB1YmxpYyBzdGF0aWMgVGV4dCBjcmVhdGVUZXh0KENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyBkZWZhdWx0VGV4dCkgewotCQlUZXh0IHRleHQgPSBuZXcgVGV4dChwYXJlbnQsIFNXVC5CT1JERVIgfCBTV1QuUkVBRF9PTkxZKTsKLQkJdGV4dC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJdGV4dC5zZXRUZXh0KGRlZmF1bHRUZXh0KTsKLQkJcmV0dXJuIHRleHQ7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBlZGl0YWJsZSB0ZXh0IGNvbnRyb2wuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBjb21wb3NpdGUKLQkgKiBAcGFyYW0gZGVmYXVsdFRleHQKLQkgKiAgICAgICAgICAgIHRoZSBkZWZhdWx0IHRleHQgZm9yIHRoZSBjb250cm9sCi0JICogQHBhcmFtIHdpZHRoSGludAotCSAqICAgICAgICAgICAgdGhlIHByZWZlcnJlZCB3aWR0aCAoaW4gcGl4ZWxzKSBmb3IgdGhlIGNvbnRyb2wKLQkgKiBAcGFyYW0gaGVpZ2h0SGludAotCSAqICAgICAgICAgICAgdGhlIHByZWZlcnJlZCBoZWlnaHQgKGluIHBpeGVscykgZm9yIHRoZSBjb250cm9sCi0JICogQHBhcmFtIGNvbHVtbgotCSAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiBjb2x1bW4gY2VsbHMgdGhhdCB0aGUgY29udHJvbCB3aWxsIHRha2UgdXAKLQkgKiBAcmV0dXJuIGEgPGNvZGU+VGV4dDwvY29kZT4gb2JqZWN0Ci0JICovCi0JcHVibGljIHN0YXRpYyBUZXh0IGNyZWF0ZUVkaXRhYmxlVGV4dChDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgZGVmYXVsdFRleHQsCi0JCQlpbnQgd2lkdGhIaW50LCBpbnQgaGVpZ2h0SGludCwgaW50IGNvbHVtbikgewotCQlUZXh0IHRleHQgPSBuZXcgVGV4dChwYXJlbnQsIFNXVC5CT1JERVIgfCBTV1QuTVVMVEkgfCBTV1QuV1JBUAotCQkJCXwgU1dULlZfU0NST0xMKTsKLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSBjb2x1bW47Ci0JCWdkLndpZHRoSGludCA9IHdpZHRoSGludDsKLQkJZ2QuaGVpZ2h0SGludCA9IGhlaWdodEhpbnQ7Ci0JCXRleHQuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCXJldHVybiB0ZXh0OwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gZWRpdGFibGUgdGV4dCBjb250cm9sLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgY29tcG9zaXRlCi0JICogQHBhcmFtIHdpZHRoSGludAotCSAqICAgICAgICAgICAgdGhlIHByZWZlcnJlZCB3aWR0aCAoaW4gcGl4ZWxzKSBmb3IgdGhlIGNvbnRyb2wKLQkgKiBAcGFyYW0gaGVpZ2h0SGludAotCSAqICAgICAgICAgICAgdGhlIHByZWZlcnJlZCBoZWlnaHQgKGluIHBpeGVscykgZm9yIHRoZSBjb250cm9sCi0JICogQHBhcmFtIGNvbHVtbgotCSAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiBjb2x1bW4gY2VsbHMgdGhhdCB0aGUgY29udHJvbCB3aWxsIHRha2UgdXAKLQkgKiBAcmV0dXJuIGEgPGNvZGU+VGV4dDwvY29kZT4gb2JqZWN0Ci0JICovCi0JcHVibGljIHN0YXRpYyBUZXh0IGNyZWF0ZUVkaXRhYmxlVGV4dChDb21wb3NpdGUgcGFyZW50LCBpbnQgd2lkdGhIaW50LAotCQkJaW50IGhlaWdodEhpbnQsIGludCBjb2x1bW4pIHsKLQkJcmV0dXJuIGNyZWF0ZUVkaXRhYmxlVGV4dChwYXJlbnQsICIiLCB3aWR0aEhpbnQsIGhlaWdodEhpbnQsIGNvbHVtbik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGVkaXRhYmxlIHRleHQgY29udHJvbC4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IGNvbXBvc2l0ZQotCSAqIEBwYXJhbSBkZWZhdWx0VGV4dAotCSAqICAgICAgICAgICAgdGhlIGRlZmF1bHQgdGV4dCBmb3IgdGhlIGNvbnRyb2wKLQkgKiBAcGFyYW0gd2lkdGhIaW50Ci0JICogICAgICAgICAgICB0aGUgcHJlZmVycmVkIHdpZHRoIChpbiBwaXhlbHMpIGZvciB0aGUgY29udHJvbAotCSAqIEBwYXJhbSBjb2x1bW4KLQkgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgY29sdW1uIGNlbGxzIHRoYXQgdGhlIGNvbnRyb2wgd2lsbCB0YWtlIHVwCi0JICogQHJldHVybiBhIDxjb2RlPlRleHQ8L2NvZGU+IG9iamVjdAotCSAqLwotCXB1YmxpYyBzdGF0aWMgVGV4dCBjcmVhdGVFZGl0YWJsZVRleHQoQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIGRlZmF1bHRUZXh0LAotCQkJaW50IHdpZHRoSGludCwgaW50IGNvbHVtbikgewotCQlUZXh0IHRleHQgPSBuZXcgVGV4dChwYXJlbnQsIFNXVC5CT1JERVIpOwotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlnZC5ob3Jpem9udGFsU3BhbiA9IGNvbHVtbjsKLQkJZ2Qud2lkdGhIaW50ID0gd2lkdGhIaW50OwotCQl0ZXh0LnNldExheW91dERhdGEoZ2QpOwotCQlyZXR1cm4gdGV4dDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGVkaXRhYmxlIHRleHQgY29udHJvbCB0aGF0IG9ubHkgdGFrZXMgdXAgb25lIGNvbHVtbiBjZWxsLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgY29tcG9zaXRlCi0JICogQHBhcmFtIGRlZmF1bHRUZXh0Ci0JICogICAgICAgICAgICB0aGUgZGVmYXVsdCB0ZXh0IGZvciB0aGUgY29udHJvbAotCSAqIEBwYXJhbSB3aWR0aEhpbnQKLQkgKiAgICAgICAgICAgIHRoZSBwcmVmZXJyZWQgd2lkdGggKGluIHBpeGVscykgZm9yIHRoZSBjb250cm9sCi0JICogQHJldHVybiBhIDxjb2RlPlRleHQ8L2NvZGU+IG9iamVjdAotCSAqLwotCXB1YmxpYyBzdGF0aWMgVGV4dCBjcmVhdGVFZGl0YWJsZVRleHQoQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIGRlZmF1bHRUZXh0LAotCQkJaW50IHdpZHRoSGludCkgewotCQlUZXh0IHRleHQgPSBuZXcgVGV4dChwYXJlbnQsIFNXVC5CT1JERVIpOwotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YSgpOwotCQlnZC53aWR0aEhpbnQgPSB3aWR0aEhpbnQ7Ci0JCXRleHQuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCXJldHVybiB0ZXh0OwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gZWRpdGFibGUgdGV4dCBjb250cm9sIHRoYXQgb25seSB0YWtlcyB1cCBvbmUgY29sdW1uIGNlbGwuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBjb21wb3NpdGUKLQkgKiBAcGFyYW0gZGVmYXVsdFRleHQKLQkgKiAgICAgICAgICAgIHRoZSBkZWZhdWx0IHRleHQgZm9yIHRoZSBjb250cm9sCi0JICogQHJldHVybiBhIDxjb2RlPlRleHQ8L2NvZGU+IG9iamVjdAotCSAqLwotCXB1YmxpYyBzdGF0aWMgVGV4dCBjcmVhdGVFZGl0YWJsZVRleHQoQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIGRlZmF1bHRUZXh0KSB7Ci0JCVRleHQgdGV4dCA9IG5ldyBUZXh0KHBhcmVudCwgU1dULkJPUkRFUik7Ci0JCXRleHQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCXRleHQuc2V0VGV4dChkZWZhdWx0VGV4dCk7Ci0JCXJldHVybiB0ZXh0OwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gZWRpdGFibGUgdGV4dCBjb250cm9sLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgY29tcG9zaXRlCi0JICogQHBhcmFtIGNvbHVtbgotCSAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiBjb2x1bW4gY2VsbHMgdGhhdCB0aGUgY29udHJvbCB3aWxsIHRha2UgdXAKLQkgKiBAcmV0dXJuIGEgPGNvZGU+VGV4dDwvY29kZT4gb2JqZWN0Ci0JICovCi0JcHVibGljIHN0YXRpYyBUZXh0IGNyZWF0ZUVkaXRhYmxlVGV4dChDb21wb3NpdGUgcGFyZW50LCBpbnQgY29sdW1uKSB7Ci0JCXJldHVybiBjcmVhdGVFZGl0YWJsZVRleHQocGFyZW50LCAiIiwgU1dULkRFRkFVTFQsIGNvbHVtbik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGVtcHR5IGVkaXRhYmxlIHRleHQgY29udHJvbCB0aGF0IG9ubHkgdGFrZXMgdXAgb25lIGNvbHVtbgotCSAqIGNlbGwuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBjb21wb3NpdGUKLQkgKiBAcmV0dXJuIGEgPGNvZGU+VGV4dDwvY29kZT4gb2JqZWN0Ci0JICovCi0JcHVibGljIHN0YXRpYyBUZXh0IGNyZWF0ZUVkaXRhYmxlVGV4dChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXJldHVybiBjcmVhdGVFZGl0YWJsZVRleHQocGFyZW50LCAiIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgcmVhZG9ubHkgbXVsdGktbGluZSB0ZXh0IGNvbnRyb2wuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBjb21wb3NpdGUKLQkgKiBAcGFyYW0gZGVmYXVsdFRleHQKLQkgKiAgICAgICAgICAgIHRoZSBkZWZhdWx0IHRleHQgZm9yIHRoZSBjb250cm9sCi0JICogQHBhcmFtIHdpZHRoSGludAotCSAqICAgICAgICAgICAgdGhlIHByZWZlcnJlZCB3aWR0aCAoaW4gcGl4ZWxzKSBmb3IgdGhlIGNvbnRyb2wKLQkgKiBAcGFyYW0gaGVpZ2h0SGludAotCSAqICAgICAgICAgICAgdGhlIHByZWZlcnJlZCBoZWlnaHQgKGluIHBpeGVscykgZm9yIHRoZSBjb250cm9sCi0JICogQHBhcmFtIGNvbHVtbgotCSAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiBjb2x1bW4gY2VsbHMgdGhhdCB0aGUgY29udHJvbCB3aWxsIHRha2UgdXAKLQkgKiBAcmV0dXJuIGEgPGNvZGU+VGV4dDwvY29kZT4gb2JqZWN0Ci0JICovCi0JcHVibGljIHN0YXRpYyBUZXh0IGNyZWF0ZU11bHRpTGluZVRleHQoQ29tcG9zaXRlIHBhcmVudCwKLQkJCVN0cmluZyBkZWZhdWx0VGV4dCwgaW50IHdpZHRoSGludCwgaW50IGhlaWdodEhpbnQsIGludCBjb2x1bW4pIHsKLQkJVGV4dCB0ZXh0ID0gbmV3IFRleHQocGFyZW50LCBTV1QuQk9SREVSIHwgU1dULk1VTFRJIHwgU1dULldSQVAKLQkJCQl8IFNXVC5WX1NDUk9MTCB8IFNXVC5SRUFEX09OTFkpOwotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlnZC5ob3Jpem9udGFsU3BhbiA9IGNvbHVtbjsKLQkJZ2Qud2lkdGhIaW50ID0gd2lkdGhIaW50OwotCQlnZC5oZWlnaHRIaW50ID0gaGVpZ2h0SGludDsKLQkJdGV4dC5zZXRMYXlvdXREYXRhKGdkKTsKLQkJcmV0dXJuIHRleHQ7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBjb21ib2JveC4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IGNvbXBvc2l0ZQotCSAqIEBwYXJhbSBjb2x1bW4KLQkgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgY29sdW1uIGNlbGxzIHRoYXQgdGhlIGNvbnRyb2wgd2lsbCB0YWtlIHVwCi0JICogQHJldHVybiBhIDxjb2RlPkNvbWJvPC9jb2RlPiBvYmplY3QKLQkgKi8KLQlwdWJsaWMgc3RhdGljIENvbWJvIGNyZWF0ZUNvbWJvYm94KENvbXBvc2l0ZSBwYXJlbnQsIGludCBjb2x1bW4pIHsKLQkJQ29tYm8gY29tYm8gPSBuZXcgQ29tYm8ocGFyZW50LCBTV1QuQk9SREVSKTsKLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSBjb2x1bW47Ci0JCWNvbWJvLnNldExheW91dERhdGEoZ2QpOwotCQlyZXR1cm4gY29tYm87Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgYW4gY29tYm9ib3guCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBjb21wb3NpdGUKLQkgKiBAcGFyYW0gY29sdW1uCi0JICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIGNvbHVtbiBjZWxscyB0aGF0IHRoZSBjb250cm9sIHdpbGwgdGFrZSB1cAotCSAqIEByZXR1cm4gYSA8Y29kZT5Db21ibzwvY29kZT4gb2JqZWN0Ci0JICovCi0JcHVibGljIHN0YXRpYyBDb21ibyBjcmVhdGVSZWFkT25seUNvbWJvYm94KENvbXBvc2l0ZSBwYXJlbnQsIGludCBjb2x1bW4pIHsKLQkJQ29tYm8gY29tYm8gPSBuZXcgQ29tYm8ocGFyZW50LCBTV1QuQk9SREVSfFNXVC5SRUFEX09OTFkpOwotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlnZC5ob3Jpem9udGFsU3BhbiA9IGNvbHVtbjsKLQkJY29tYm8uc2V0TGF5b3V0RGF0YShnZCk7Ci0JCXJldHVybiBjb21ibzsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGNvbWJvYm94IHRoYXQgb25seSB0YWtlcyB1cCBvbmUgY29sdW1uIGNlbGwuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBjb21wb3NpdGUKLQkgKiBAcmV0dXJuIGEgPGNvZGU+Q29tYm88L2NvZGU+IG9iamVjdAotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ29tYm8gY3JlYXRlQ29tYm9ib3goQ29tcG9zaXRlIHBhcmVudCkgewotCQlyZXR1cm4gY3JlYXRlQ29tYm9ib3gocGFyZW50LCAxKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgYnV0dG9uLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgY29tcG9zaXRlCi0JICogQHBhcmFtIHRleHQKLQkgKiAgICAgICAgICAgIHRoZSB0ZXh0IGZvciB0aGUgY29udHJvbAotCSAqIEByZXR1cm4gYSA8Y29kZT5CdXR0b248L2NvZGU+IG9iamVjdAotCSAqLwotCXB1YmxpYyBzdGF0aWMgQnV0dG9uIGNyZWF0ZUJ1dHRvbihDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgdGV4dCkgewotCQlCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5OT05FKTsKLQkJYnV0dG9uLnNldFRleHQodGV4dCk7Ci0JCXJldHVybiBidXR0b247Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIGNoZWNrYm94LgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgY29tcG9zaXRlCi0JICogQHBhcmFtIHRleHQKLQkgKiAgICAgICAgICAgIHRoZSB0ZXh0IGZvciB0aGUgY29udHJvbAotCSAqIEBwYXJhbSBjb2x1bW4KLQkgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgY29sdW1uIGNlbGxzIHRoYXQgdGhlIGNvbnRyb2wgd2lsbCB0YWtlIHVwCi0JICogQHJldHVybiBhIDxjb2RlPkJ1dHRvbjwvY29kZT4gb2JqZWN0Ci0JICovCi0JcHVibGljIHN0YXRpYyBCdXR0b24gY3JlYXRlQ2hlY2tib3goQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIHRleHQsCi0JCQlpbnQgY29sdW1uKSB7Ci0JCUJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULkNIRUNLKTsKLQkJYnV0dG9uLnNldFRleHQodGV4dCk7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWdkLmhvcml6b250YWxTcGFuID0gY29sdW1uOwotCQlidXR0b24uc2V0TGF5b3V0RGF0YShnZCk7Ci0JCXJldHVybiBidXR0b247Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIGNoZWNrYm94IHRoYXQgb25seSB0YWtlcyB1cCBvbmUgY29sdW1uIGNlbGwuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBjb21wb3NpdGUKLQkgKiBAcGFyYW0gdGV4dAotCSAqICAgICAgICAgICAgdGhlIHRleHQgZm9yIHRoZSBjb250cm9sCi0JICogQHJldHVybiBhIDxjb2RlPkJ1dHRvbjwvY29kZT4gb2JqZWN0Ci0JICovCi0JcHVibGljIHN0YXRpYyBCdXR0b24gY3JlYXRlQ2hlY2tib3goQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIHRleHQpIHsKLQkJcmV0dXJuIGNyZWF0ZUNoZWNrYm94KHBhcmVudCwgdGV4dCwgMSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiByYWRpbyBidXR0b24uCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBjb21wb3NpdGUKLQkgKiBAcGFyYW0gdGV4dAotCSAqICAgICAgICAgICAgdGhlIHRleHQgZm9yIHRoZSBjb250cm9sCi0JICogQHBhcmFtIGNvbHVtbgotCSAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiBjb2x1bW4gY2VsbHMgdGhhdCB0aGUgY29udHJvbCB3aWxsIHRha2UgdXAKLQkgKiBAcGFyYW0gc2VsZWN0ZWQKLQkgKiAgICAgICAgICAgIGlmIDxjb2RlPnRydWU8L2NvZGU+LCBzZWxlY3QgdGhlIHJhZGlvIGJ1dHRvbiBieSBkZWZhdWx0Ci0JICogQHJldHVybiBhIDxjb2RlPkJ1dHRvbjwvY29kZT4gb2JqZWN0Ci0JICovCi0JcHVibGljIHN0YXRpYyBCdXR0b24gY3JlYXRlUmFkaW9CdXR0b24oQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIHRleHQsCi0JCQlpbnQgY29sdW1uLCBib29sZWFuIHNlbGVjdGVkKSB7Ci0JCUJ1dHRvbiByYWRpb0J1dHRvbiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuUkFESU8pOwotCQlyYWRpb0J1dHRvbi5zZXRUZXh0KHRleHQpOwotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlnZC5ob3Jpem9udGFsU3BhbiA9IGNvbHVtbjsKLQkJcmFkaW9CdXR0b24uc2V0TGF5b3V0RGF0YShnZCk7Ci0JCXJhZGlvQnV0dG9uLnNldFNlbGVjdGlvbihzZWxlY3RlZCk7Ci0JCXJldHVybiByYWRpb0J1dHRvbjsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIHJhZGlvIGJ1dHRvbiB0aGF0IG9ubHkgdGFrZXMgdXAgb25lIGNvbHVtbiBjZWxsLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgY29tcG9zaXRlCi0JICogQHBhcmFtIHRleHQKLQkgKiAgICAgICAgICAgIHRoZSB0ZXh0IGZvciB0aGUgY29udHJvbAotCSAqIEByZXR1cm4gYSA8Y29kZT5CdXR0b248L2NvZGU+IG9iamVjdAotCSAqLwotCXB1YmxpYyBzdGF0aWMgQnV0dG9uIGNyZWF0ZVJhZGlvQnV0dG9uKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyB0ZXh0KSB7Ci0JCXJldHVybiBjcmVhdGVSYWRpb0J1dHRvbihwYXJlbnQsIHRleHQsIDEsIGZhbHNlKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgcmVhZG9ubHkgdGV4dCB2aWV3ZXIuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBjb21wb3NpdGUKLQkgKiBAcGFyYW0gd2lkdGhIaW50Ci0JICogICAgICAgICAgICB0aGUgcHJlZmVycmVkIHdpZHRoIChpbiBwaXhlbHMpIGZvciB0aGUgY29udHJvbAotCSAqIEBwYXJhbSBoZWlnaHRIaW50Ci0JICogICAgICAgICAgICB0aGUgcHJlZmVycmVkIGhlaWdodCAoaW4gcGl4ZWxzKSBmb3IgdGhlIGNvbnRyb2wKLQkgKiBAcGFyYW0gY29sdW1uCi0JICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIGNvbHVtbiBjZWxscyB0aGF0IHRoZSBjb250cm9sIHdpbGwgdGFrZSB1cAotCSAqIEByZXR1cm4gYSA8Y29kZT5UZXh0Vmlld2VyPC9jb2RlPiBvYmplY3QKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFRleHRWaWV3ZXIgY3JlYXRlVGV4dFZpZXdlcihDb21wb3NpdGUgcGFyZW50LCBpbnQgd2lkdGhIaW50LAotCQkJaW50IGhlaWdodEhpbnQsIGludCBjb2x1bW4pIHsKLQkJVGV4dFZpZXdlciB0ZXh0Vmlld2VyID0gbmV3IFRleHRWaWV3ZXIocGFyZW50LCBTV1QuQk9SREVSIHwgU1dULk1VTFRJCi0JCQkJfCBTV1QuVl9TQ1JPTEwgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuUkVBRF9PTkxZKTsKLQkJU3R5bGVkVGV4dCB0ZXh0V2lkZ2V0ID0gdGV4dFZpZXdlci5nZXRUZXh0V2lkZ2V0KCk7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkJFR0lOTklORyB8IEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCWdkLmhvcml6b250YWxTcGFuID0gY29sdW1uOwotCQlnZC5oZWlnaHRIaW50ID0gaGVpZ2h0SGludDsKLQkJZ2Qud2lkdGhIaW50ID0gd2lkdGhIaW50OwotCQl0ZXh0V2lkZ2V0LnNldExheW91dERhdGEoZ2QpOwotCQlyZXR1cm4gdGV4dFZpZXdlcjsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgcmVhZG9ubHkgdGV4dCB2aWV3ZXIgdGhhdCBvbmx5IHRha2VzIHVwIG9uZSBjb2x1bW4gY2VsbC4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IGNvbXBvc2l0ZQotCSAqIEByZXR1cm4gYSA8Y29kZT5UZXh0Vmlld2VyPC9jb2RlPiBvYmplY3QKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFRleHRWaWV3ZXIgY3JlYXRlVGV4dFZpZXdlcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXJldHVybiBjcmVhdGVUZXh0Vmlld2VyKHBhcmVudCwgU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIHRhYmxlIHZpZXdlci4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IGNvbXBvc2l0ZQotCSAqIEBwYXJhbSB3aWR0aEhpbnQKLQkgKiAgICAgICAgICAgIHRoZSBwcmVmZXJyZWQgd2lkdGggKGluIHBpeGVscykgZm9yIHRoZSBjb250cm9sCi0JICogQHBhcmFtIGhlaWdodEhpbnQKLQkgKiAgICAgICAgICAgIHRoZSBwcmVmZXJyZWQgaGVpZ2h0IChpbiBwaXhlbHMpIGZvciB0aGUgY29udHJvbAotCSAqIEBwYXJhbSBjb2x1bW4KLQkgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgY29sdW1uIGNlbGxzIHRoYXQgdGhlIGNvbnRyb2wgd2lsbCB0YWtlIHVwCi0JICogQHJldHVybiBhIDxjb2RlPlRhYmxlVmlld2VyPC9jb2RlPiBvYmplY3QKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFRhYmxlVmlld2VyIGNyZWF0ZVRhYmxlVmlld2VyKENvbXBvc2l0ZSBwYXJlbnQsCi0JCQlpbnQgd2lkdGhIaW50LCBpbnQgaGVpZ2h0SGludCwgaW50IGNvbHVtbikgewotCQlUYWJsZSB0YWJsZSA9IG5ldyBUYWJsZShwYXJlbnQsIFNXVC5WX1NDUk9MTCB8IFNXVC5CT1JERVIpOwotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5CRUdJTk5JTkcgfCBHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQlnZC5ob3Jpem9udGFsU3BhbiA9IGNvbHVtbjsKLQkJZ2Qud2lkdGhIaW50ID0gd2lkdGhIaW50OwotCQlnZC5oZWlnaHRIaW50ID0gaGVpZ2h0SGludDsKLQkJdGFibGUuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCVRhYmxlVmlld2VyIHRhYmxlVmlld2VyID0gbmV3IFRhYmxlVmlld2VyKHRhYmxlKTsKLQkJcmV0dXJuIHRhYmxlVmlld2VyOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBjaGVja2JveCB0YWJsZSB2aWV3ZXIuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBjb21wb3NpdGUKLQkgKiBAcGFyYW0gd2lkdGhIaW50Ci0JICogICAgICAgICAgICB0aGUgcHJlZmVycmVkIHdpZHRoIChpbiBwaXhlbHMpIGZvciB0aGUgY29udHJvbAotCSAqIEBwYXJhbSBoZWlnaHRIaW50Ci0JICogICAgICAgICAgICB0aGUgcHJlZmVycmVkIGhlaWdodCAoaW4gcGl4ZWxzKSBmb3IgdGhlIGNvbnRyb2wKLQkgKiBAcGFyYW0gY29sdW1uCi0JICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIGNvbHVtbiBjZWxscyB0aGF0IHRoZSBjb250cm9sIHdpbGwgdGFrZSB1cAotCSAqIEByZXR1cm4gYSA8Y29kZT5DaGVja2JveFRhYmxlVmlld2VyPC9jb2RlPiBvYmplY3QKLQkgKi8KLQlwdWJsaWMgc3RhdGljIENoZWNrYm94VGFibGVWaWV3ZXIgY3JlYXRlQ2hlY2tib3hUYWJsZVZpZXdlcigKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsIGludCB3aWR0aEhpbnQsIGludCBoZWlnaHRIaW50LCBpbnQgY29sdW1uKSB7Ci0JCUNoZWNrYm94VGFibGVWaWV3ZXIgY2hlY2tib3hUYWJsZVZpZXdlciA9IENoZWNrYm94VGFibGVWaWV3ZXIKLQkJCQkubmV3Q2hlY2tMaXN0KHBhcmVudCwgU1dULkJPUkRFUiB8IFNXVC5GSUxMIHwgU1dULkhPUklaT05UQUwpOwotCQlUYWJsZSB0YWJsZSA9IGNoZWNrYm94VGFibGVWaWV3ZXIuZ2V0VGFibGUoKTsKLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSBjb2x1bW47Ci0JCWdkLndpZHRoSGludCA9IHdpZHRoSGludDsKLQkJZ2QuaGVpZ2h0SGludCA9IGhlaWdodEhpbnQ7Ci0JCXRhYmxlLnNldExheW91dERhdGEoZ2QpOwotCQlyZXR1cm4gY2hlY2tib3hUYWJsZVZpZXdlcjsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyBhIGxpc3Qgdmlld2VyLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgY29tcG9zaXRlCi0JICogQHBhcmFtIHdpZHRoSGludAotCSAqICAgICAgICAgICAgdGhlIHByZWZlcnJlZCB3aWR0aCAoaW4gcGl4ZWxzKSBmb3IgdGhlIGNvbnRyb2wKLQkgKiBAcGFyYW0gaGVpZ2h0SGludAotCSAqICAgICAgICAgICAgdGhlIHByZWZlcnJlZCBoZWlnaHQgKGluIHBpeGVscykgZm9yIHRoZSBjb250cm9sCi0JICogQHBhcmFtIGNvbHVtbgotCSAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiBjb2x1bW4gY2VsbHMgdGhhdCB0aGUgY29udHJvbCB3aWxsIHRha2UgdXAKLQkgKiBAcmV0dXJuIGEgPGNvZGU+TGlzdFZpZXdlcjwvY29kZT4gb2JqZWN0Ci0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0Vmlld2VyIGNyZWF0ZUxpc3RWaWV3ZXIoQ29tcG9zaXRlIHBhcmVudCwKLQkJCWludCB3aWR0aEhpbnQsIGludCBoZWlnaHRIaW50LCBpbnQgY29sdW1uKSB7Ci0JCUxpc3RWaWV3ZXIgbGlzdFZpZXdlciA9IG5ldyBMaXN0Vmlld2VyKHBhcmVudCwgU1dULlZfU0NST0xMIHwgU1dULkJPUkRFUik7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkJFR0lOTklORyB8IEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCWdkLmhvcml6b250YWxTcGFuID0gY29sdW1uOwotCQlnZC53aWR0aEhpbnQgPSB3aWR0aEhpbnQ7Ci0JCWdkLmhlaWdodEhpbnQgPSBoZWlnaHRIaW50OwotCQlsaXN0Vmlld2VyLmdldENvbnRyb2woKS5zZXRMYXlvdXREYXRhKGdkKTsKLQkJcmV0dXJuIGxpc3RWaWV3ZXI7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIGxpbmUuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBjb21wb3NpdGUKLQkgKiBAcGFyYW0gY29sdW1uCi0JICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIGNvbHVtbiBjZWxscyB0aGF0IHRoZSBsaW5lIHdpbGwgdGFrZSB1cAotCSAqIEByZXR1cm4gYSA8Y29kZT5MYWJlbDwvY29kZT4gb2JqZWN0Ci0JICovCi0JcHVibGljIHN0YXRpYyBMYWJlbCBjcmVhdGVMaW5lKENvbXBvc2l0ZSBwYXJlbnQsIGludCBjb2x1bW4pIHsKLQkJTGFiZWwgbGluZSA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5TRVBBUkFUT1IgfCBTV1QuSE9SSVpPTlRBTAotCQkJCXwgU1dULkJPTEQpOwotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlnZC5ob3Jpem9udGFsU3BhbiA9IGNvbHVtbjsKLQkJbGluZS5zZXRMYXlvdXREYXRhKGdkKTsKLQkJcmV0dXJuIGxpbmU7Ci0JfQotCi0JLyoqCi0JICogQ2hlY2tzIHdoZXRoZXIgYSB0ZXh0IGNvbnRyb2wgaGFzIHNvbWUgdGV4dC4KLQkgKiAKLQkgKiBAcGFyYW0gY29udHJvbAotCSAqICAgICAgICAgICAgdGhlIHRleHQgY29udHJvbAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHRleHQgY29udHJvbCBoYXMgc29tZSB0ZXh0LAotCSAqICAgICAgICAgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc05vbkVtcHR5VGV4dChUZXh0IGNvbnRyb2wpIHsKLQkJU3RyaW5nIHRleHQgPSBjb250cm9sLmdldFRleHQoKTsKLQkJcmV0dXJuIHRleHQgIT0gbnVsbCAmJiB0ZXh0LnRyaW0oKS5sZW5ndGgoKSA+IDA7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkvc3JjL29yZy9lY2xpcHNlL2VwZi91aS93aXphcmRzL0Jhc2VXaXphcmQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VpL3dpemFyZHMvQmFzZVdpemFyZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMDRlM2MzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VpL3dpemFyZHMvQmFzZVdpemFyZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjU1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51aS53aXphcmRzOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51aS5FUEZVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci0KLS8qKgotICogVGhlIGFic3RyYWN0IGJhc2UgY2xhc3MgZm9yIGFsbCBleHRlbnNpYmxlIEVQRiB3aXphcmRzLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiAKLSAqIEBzaW5jZSAxLjIKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEJhc2VXaXphcmQgZXh0ZW5kcyBXaXphcmQgewotCi0JLy8gVGhlIGN1cnJlbnQgd29ya2JlbmNoLgotCXByb3RlY3RlZCBJV29ya2JlbmNoIHdvcmtiZW5jaDsKLQotCS8vIFRoZSBjdXJyZW50IG9iamVjdCBzZWxlY3Rpb24uCi0JcHJvdGVjdGVkIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbjsKLQotCS8vIEFuIGV4dGVuZGVyIG9mIHRoaXMgd2l6YXJkLgotCXByb3RlY3RlZCBJV2l6YXJkRXh0ZW5kZXIgd2l6YXJkRXh0ZW5kZXI7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBCYXNlV2l6YXJkKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpemFyZCNpbml0KElXb3JrYmVuY2gsCi0JICogICAgICBJU3RydWN0dXJlZFNlbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2ggd29ya2JlbmNoLCBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJdGhpcy53b3JrYmVuY2ggPSB3b3JrYmVuY2g7Ci0JCXRoaXMuc2VsZWN0aW9uID0gc2VsZWN0aW9uOwotCi0JCXByb2Nlc3NXaXphcmRFeHRlbmRlckV4dGVuc2lvblBvaW50KCk7Ci0KLQkJaW5pdGlhbGl6ZUV4dGVuZGVyKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUV4dGVuZGVyKCkgewotCQlpZiAod2l6YXJkRXh0ZW5kZXIgIT0gbnVsbCkgewotCQkJd2l6YXJkRXh0ZW5kZXIuaW5pdCh0aGlzKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHdpemFyZCBleHRlbmRlciBzcGVjaWZpYyBleHRlbnNpb24gcG9pbnQgSUQuCi0JICogCi0JICogQHJldHVybiB0aGUgd2l6YXJkIGV4dGVuZGVyIHNwZWNpZmljIGV4dGVuc2lvbiBwb2ludCBJRAotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0V2l6YXJkRXh0ZW5kZXJFeHRlbnNpb25Qb2ludElkKCk7Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBleHRlbmRlciBvZiB0aGlzIHdpemFyZC4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgPGNvZGU+SVdpemFyZEV4dGVuZGVyPC9jb2RlPiBvYmplY3Qgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYKLQkgKiAgICAgICAgIHRoZXJlIGlzIG5vIGV4dGVuZGVyCi0JICovCi0JcHVibGljIElXaXphcmRFeHRlbmRlciBnZXRXaXphcmRFeHRlbmRlcigpIHsKLQkJcmV0dXJuIHdpemFyZEV4dGVuZGVyOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZCNnZXROZXh0UGFnZShJV2l6YXJkUGFnZSkKLQkgKi8KLQlwdWJsaWMgSVdpemFyZFBhZ2UgZ2V0TmV4dFBhZ2UoSVdpemFyZFBhZ2UgcGFnZSkgewotCQlJV2l6YXJkUGFnZSBuZXh0UGFnZSA9IG51bGw7Ci0JCWlmICh3aXphcmRFeHRlbmRlciAhPSBudWxsKSB7Ci0JCQluZXh0UGFnZSA9IHdpemFyZEV4dGVuZGVyLmdldE5leHRQYWdlKHBhZ2UpOwotCQl9Ci0JCWlmIChuZXh0UGFnZSA9PSBudWxsKSB7Ci0JCQluZXh0UGFnZSA9IHN1cGVyLmdldE5leHRQYWdlKHBhZ2UpOwotCQl9Ci0JCXJldHVybiBuZXh0UGFnZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmQjcGVyZm9ybUZpbmlzaCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2FuRmluaXNoKCkgewotCQlpZiAod2l6YXJkRXh0ZW5kZXIgIT0gbnVsbCkgewotCQkJcmV0dXJuIHdpemFyZEV4dGVuZGVyLmNhbkZpbmlzaCgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5jYW5GaW5pc2goKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmQjcGVyZm9ybUZpbmlzaCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gcGVyZm9ybUZpbmlzaCgpIHsKLQkJaWYgKHdpemFyZEV4dGVuZGVyICE9IG51bGwpIHsKLQkJCXJldHVybiB3aXphcmRFeHRlbmRlci5kb0ZpbmlzaCgpOwotCQl9Ci0JCXJldHVybiBkb0ZpbmlzaCgpOwotCX0KLQotCS8qKgotCSAqIEV4ZWN1dGVzIHRoZSBmaW5pc2ggb3BlcmF0aW9uLgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGZpbmlzaCBvcGVyYXRpb24gaXMgZXhlY3V0ZWQKLQkgKiAgICAgICAgIHN1Y2Nlc3NmdWxseQotCSAqLwotCXB1YmxpYyBib29sZWFuIGRvRmluaXNoKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBhbGxvdyBvdmVycmlkZSB0aGUgZXh0ZW5kZXIuIHRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGlzIHRvIHJldHVybiB0aGUKLQkgKiBkZWZhdWx0RXh0ZW5kZXIKLQkgKiAKLQkgKiBAcGFyYW0gZGVmYXVsdEV4dGVuZGVyCi0JICogQHJldHVybiBJV2l6YXJkRXh0ZW5kZXIKLQkgKi8KLQlwcm90ZWN0ZWQgSVdpemFyZEV4dGVuZGVyIGNyZWF0ZVdpemFyZEV4dGVuZGVyKAotCQkJSVdpemFyZEV4dGVuZGVyIGRlZmF1bHRFeHRlbmRlcikgewotCQlyZXR1cm4gZGVmYXVsdEV4dGVuZGVyOwotCX0KLQotCS8qKgotCSAqIFByb2Nlc3NlcyB0aGUgd2l6YXJkIGV4dGVuZGVyIHNwY2lmaWMgZXh0ZW5zaW9uIHBvaW50LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHByb2Nlc3NXaXphcmRFeHRlbmRlckV4dGVuc2lvblBvaW50KCkgewotCQlJRXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpOwotCi0JCVN0cmluZyBleHRlbnNpb25Qb2ludElkID0gZ2V0V2l6YXJkRXh0ZW5kZXJFeHRlbnNpb25Qb2ludElkKCk7Ci0JCWlmIChleHRlbnNpb25Qb2ludElkID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCUlFeHRlbnNpb25Qb2ludCBleHRlbnNpb25Qb2ludCA9IGV4dGVuc2lvblJlZ2lzdHJ5Ci0JCQkJLmdldEV4dGVuc2lvblBvaW50KGV4dGVuc2lvblBvaW50SWQpOwotCQlpZiAoZXh0ZW5zaW9uUG9pbnQgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJSUV4dGVuc2lvbltdIGV4dGVuc2lvbnMgPSBleHRlbnNpb25Qb2ludC5nZXRFeHRlbnNpb25zKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZXh0ZW5zaW9ucy5sZW5ndGg7IGkrKykgewotCQkJSUV4dGVuc2lvbiBleHRlbnNpb24gPSBleHRlbnNpb25zW2ldOwotCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gY29uZmlnRWxlbWVudHMgPSBleHRlbnNpb24KLQkJCQkJLmdldENvbmZpZ3VyYXRpb25FbGVtZW50cygpOwotCQkJZm9yIChpbnQgaiA9IDA7IGogPCBjb25maWdFbGVtZW50cy5sZW5ndGg7IGorKykgewotCQkJCUlDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWdFbGVtZW50ID0gY29uZmlnRWxlbWVudHNbal07Ci0JCQkJdHJ5IHsKLQkJCQkJSVdpemFyZEV4dGVuZGVyIGV4dGVuZGVyID0gKElXaXphcmRFeHRlbmRlcikgY29uZmlnRWxlbWVudAotCQkJCQkJCS5jcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKCJjbGFzcyIpOyAvLyROT04tTkxTLTEkCi0JCQkJCWlmICh3aXphcmRFeHRlbmRlciA9PSBudWxsKSB7Ci0JCQkJCQl3aXphcmRFeHRlbmRlciA9IGNyZWF0ZVdpemFyZEV4dGVuZGVyKGV4dGVuZGVyKTsKLQotCQkJCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gY2hpbGRDb25maWdFbGVtZW50cyA9IGNvbmZpZ0VsZW1lbnQKLQkJCQkJCQkJLmdldENoaWxkcmVuKCJ3aXphcmRQYWdlIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCWZvciAoaW50IGsgPSAwOyBrIDwgY2hpbGRDb25maWdFbGVtZW50cy5sZW5ndGg7IGsrKykgewotCQkJCQkJCUlDb25maWd1cmF0aW9uRWxlbWVudCBjaGlsZENvbmZpZ0VsZW1lbnQgPSBjaGlsZENvbmZpZ0VsZW1lbnRzW2tdOwotCQkJCQkJCUlXaXphcmRQYWdlIHdpemFyZFBhZ2UgPSAoSVdpemFyZFBhZ2UpIGNoaWxkQ29uZmlnRWxlbWVudAotCQkJCQkJCQkJLmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oImNsYXNzIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQlTdHJpbmcgdHlwZSA9IGNoaWxkQ29uZmlnRWxlbWVudAotCQkJCQkJCQkJLmdldEF0dHJpYnV0ZSgidHlwZSIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJU3RyaW5nIHRhcmdldCA9IGNoaWxkQ29uZmlnRWxlbWVudAotCQkJCQkJCQkJLmdldEF0dHJpYnV0ZSgidGFyZ2V0Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQlTdHJpbmcgaW5zZXJ0ID0gY2hpbGRDb25maWdFbGVtZW50Ci0JCQkJCQkJCQkuZ2V0QXR0cmlidXRlKCJpbnNlcnQiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCWlmICh3aXphcmRQYWdlICE9IG51bGwgJiYgdHlwZSAhPSBudWxsCi0JCQkJCQkJCQkmJiB0eXBlLmxlbmd0aCgpID4gMCkgewotCQkJCQkJCQlpZiAodHlwZS5lcXVhbHMoInJlcGxhY2UiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQl3aXphcmRFeHRlbmRlcgotCQkJCQkJCQkJCQkuYWRkUmVwbGFjZVdpemFyZFBhZ2VDb250cmlidXRpb24obmV3IFJlcGxhY2VXaXphcmRQYWdlQ29udHJpYnV0aW9uKAotCQkJCQkJCQkJCQkJCXdpemFyZFBhZ2UsIHRhcmdldCkpOwotCQkJCQkJCQl9IGVsc2UgaWYgKHR5cGUuZXF1YWxzKCJuZXciKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQlib29sZWFuIGluc2VydEFmdGVyID0gdHJ1ZTsKLQkJCQkJCQkJCWlmIChpbnNlcnQgIT0gbnVsbAotCQkJCQkJCQkJCQkmJiBpbnNlcnQuZXF1YWxzKCJiZWZvcmUiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQkJaW5zZXJ0QWZ0ZXIgPSBmYWxzZTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJCXdpemFyZEV4dGVuZGVyCi0JCQkJCQkJCQkJCS5hZGROZXdXaXphcmRQYWdlQ29udHJpYnV0aW9uKG5ldyBOZXdXaXphcmRQYWdlQ29udHJpYnV0aW9uKAotCQkJCQkJCQkJCQkJCXdpemFyZFBhZ2UsIHRhcmdldCwKLQkJCQkJCQkJCQkJCQlpbnNlcnRBZnRlcikpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCi0JCQkJCQlyZXR1cm47Ci0JCQkJCX0KLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQlFUEZVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogR2V0cyBhbGwgdGhlIG5ldyB3aXphcmQgcGFnZXMuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZ2V0TmV3V2l6YXJkUGFnZXMoTGlzdDxJV2l6YXJkUGFnZT4gd2l6YXJkUGFnZXMpIHsKLQkJTGlzdDxJTmV3V2l6YXJkUGFnZUNvbnRyaWJ1dGlvbj4gY29udHJpYnV0aW9ucyA9IHdpemFyZEV4dGVuZGVyCi0JCQkJLmdldE5ld1dpemFyZFBhZ2VDb250cmlidXRpb25zKCk7Ci0JCWlmIChjb250cmlidXRpb25zICE9IG51bGwpIHsKLQkJCWZvciAoSXRlcmF0b3I8SU5ld1dpemFyZFBhZ2VDb250cmlidXRpb24+IGl0ID0gY29udHJpYnV0aW9ucwotCQkJCQkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCU5ld1dpemFyZFBhZ2VDb250cmlidXRpb24gY29udHJpYnV0aW9uID0gKE5ld1dpemFyZFBhZ2VDb250cmlidXRpb24pIGl0Ci0JCQkJCQkubmV4dCgpOwotCQkJCUlXaXphcmRQYWdlIG5ld1dpemFyZFBhZ2UgPSAoSVdpemFyZFBhZ2UpIGNvbnRyaWJ1dGlvbgotCQkJCQkJLmdldFdpemFyZFBhZ2UoKTsKLQkJCQlTdHJpbmcgdGFyZ2V0V2l6YXJkUGFnZU5hbWUgPSBjb250cmlidXRpb24KLQkJCQkJCS5nZXRUYXJnZXRXaXphcmRQYWdlKCk7Ci0JCQkJaWYgKHRhcmdldFdpemFyZFBhZ2VOYW1lICE9IG51bGwpIHsKLQkJCQkJaW50IHRvdGFsUGFnZXMgPSB3aXphcmRQYWdlcy5zaXplKCk7Ci0JCQkJCWludCBpbmRleCA9IDA7Ci0JCQkJCWZvciAoSXRlcmF0b3I8SVdpemFyZFBhZ2U+IGl0ZXIgPSB3aXphcmRQYWdlcy5pdGVyYXRvcigpOyB3aXphcmRQYWdlcwotCQkJCQkJCS5zaXplKCkgPT0gdG90YWxQYWdlcwotCQkJCQkJCSYmIGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQkJSVdpemFyZFBhZ2UgcGFnZSA9IGl0ZXIubmV4dCgpOwotCQkJCQkJaWYgKHBhZ2UuZ2V0TmFtZSgpLmVxdWFscyh0YXJnZXRXaXphcmRQYWdlTmFtZSkpIHsKLQkJCQkJCQlpZiAoY29udHJpYnV0aW9uLmdldEluc2VydEFmdGVyKCkpIHsKLQkJCQkJCQkJd2l6YXJkUGFnZXMuYWRkKGluZGV4ICsgMSwgbmV3V2l6YXJkUGFnZSk7Ci0JCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJd2l6YXJkUGFnZXMuYWRkKGluZGV4LCBuZXdXaXphcmRQYWdlKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQlpbmRleCsrOwotCQkJCQl9Ci0JCQkJCWlmICh3aXphcmRQYWdlcy5zaXplKCkgPT0gdG90YWxQYWdlcykgewotCQkJCQkJd2l6YXJkUGFnZXMuYWRkKG5ld1dpemFyZFBhZ2UpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkvc3JjL29yZy9lY2xpcHNlL2VwZi91aS93aXphcmRzL0Jhc2VXaXphcmRQYWdlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkvc3JjL29yZy9lY2xpcHNlL2VwZi91aS93aXphcmRzL0Jhc2VXaXphcmRQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3M2U2MjAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvdWkvd2l6YXJkcy9CYXNlV2l6YXJkUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTk0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51aS53aXphcmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVpLnV0aWwuU1dUVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5UZXh0Vmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2hlY2tib3hUYWJsZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci0KLS8qKgotICogVGhlIGFic3RyYWN0IGJhc2UgY2xhc3MgZm9yIGFsbCBFUEYgd2l6YXJkIHBhZ2VzLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBhdXRob3IgQmluZ3h1ZSBYdQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQmFzZVdpemFyZFBhZ2UgZXh0ZW5kcyBXaXphcmRQYWdlIHsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICogCi0JICogQHBhcmFtIHBhZ2VOYW1lCi0JICogICAgICAgICAgICB0aGUgd2l6YXJkIHBhZ2UgbmFtZQotCSAqLwotCXByb3RlY3RlZCBCYXNlV2l6YXJkUGFnZShTdHJpbmcgcGFnZU5hbWUpIHsKLQkJc3VwZXIocGFnZU5hbWUpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICogCi0JICogQHBhcmFtIG5hbWUKLQkgKiAgICAgICAgICAgIHRoZSB3aXphcmQgcGFnZSBuYW1lCi0JICogQHBhcmFtIHRpdGxlCi0JICogICAgICAgICAgICB0aGUgd2l6YXJkIHBhZ2UgdGl0bGUKLQkgKiBAcGFyYW0gZGVzY3JpcHRpb24KLQkgKiAgICAgICAgICAgIHRoZSB3aXphcmQgcGFnZSBkZXNjcmlwdGlvbgotCSAqIEBwYXJhbSB0aXRsZUltYWdlCi0JICogICAgICAgICAgICB0aGUgd2l6YXJkIHBhZ2UgdGl0bGUgaW1hZ2UKLQkgKi8KLQlwdWJsaWMgQmFzZVdpemFyZFBhZ2UoU3RyaW5nIHBhZ2VOYW1lLCBTdHJpbmcgdGl0bGUsIFN0cmluZyBkZXNjcmlwdGlvbiwKLQkJCUltYWdlRGVzY3JpcHRvciB0aXRsZUltYWdlKSB7Ci0JCXN1cGVyKHBhZ2VOYW1lLCB0aXRsZSwgdGl0bGVJbWFnZSk7Ci0JCXNldERlc2NyaXB0aW9uKGRlc2NyaXB0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRWaXNpYmxlKGJvb2xlYW4gdmlzaWJsZSkgewotCQlzdXBlci5zZXRWaXNpYmxlKHZpc2libGUpOwotCQlvbkVudGVyUGFnZShudWxsKTsKLQl9Ci0JCi0JLyoqCi0JICogQ2FsbGVkIHdoZW4gZW50ZXJpbmcgdGhpcyB3aXphcmQgcGFnZS4KLQkgKiAKLQkgKiBAcGFyYW0gb2JqCi0JICogICAgICAgICAgICBhIGRhdGEgaW5pdGlhbGl6YXRpb24gb2JqZWN0Ci0JICovCi0JcHVibGljIHZvaWQgb25FbnRlclBhZ2UoT2JqZWN0IG9iaikgewotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2UjZ2V0TmV4dFBhZ2UoKQotCSAqLwotCXB1YmxpYyBJV2l6YXJkUGFnZSBnZXROZXh0UGFnZSgpIHsKLQkJSVdpemFyZFBhZ2UgbmV4dFBhZ2UgPSBzdXBlci5nZXROZXh0UGFnZSgpOwotCQlpZiAobmV4dFBhZ2UgIT0gbnVsbCAmJiBuZXh0UGFnZSBpbnN0YW5jZW9mIEJhc2VXaXphcmRQYWdlKSB7Ci0JCQl0cnkgewotCQkJCSgoQmFzZVdpemFyZFBhZ2UpIG5leHRQYWdlKS5vbkVudGVyUGFnZShnZXROZXh0UGFnZURhdGEoKSk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJfQotCQl9Ci0JCXJldHVybiBuZXh0UGFnZTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBkYXRhIGluaXRpYWxpemF0aW9uIG9iamVjdCBmb3IgdGhlIG5leHQgd2l6YXJkIHBhZ2UuCi0JICogCi0JICogQHJldHVybiBhbiA8Y29kZT5PYmplY3Q8L2NvZGU+Ci0JICovCi0JcHVibGljIE9iamVjdCBnZXROZXh0UGFnZURhdGEoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBjb21wb3NpdGUgd2l0aCBhIGdyaWQgbGF5b3V0LgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgY29tcG9zaXRlCi0JICogQHBhcmFtIGNvbHVtbgotCSAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiBjb2x1bW4gY2VsbHMgdGhhdCB0aGUgY29tcG9zaXRlIHdpbGwgdGFrZSB1cAotCSAqIEByZXR1cm4gYSA8Y29kZT5Db21wb3NpdGU8L2NvZGU+IG9iamVjdAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgQ29tcG9zaXRlIGNyZWF0ZUdyaWRMYXlvdXRDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCwKLQkJCWludCBjb2x1bW4pIHsKLQkJcmV0dXJuIFNXVFV0aWwuY3JlYXRlR3JpZExheW91dENvbXBvc2l0ZShwYXJlbnQsIGNvbHVtbik7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIGNoaWxkIGNvbXBvc2l0ZSB3aXRoIGEgZ3JpZCBsYXlvdXQuCi0JICogPHA+Ci0JICogVGhlIGNoaWxkIGNvbXBvc2l0ZSB3aWxsIGJlIGluZGVudGVkIGZyb20gdGhlIHBhcmVudCBjb21wb3NpdGUuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBjb21wb3NpdGUKLQkgKiBAcGFyYW0gY29sdW1uCi0JICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIGNvbHVtbiBjZWxscyB0aGF0IHRoZSBjb21wb3NpdGUgd2lsbCB0YWtlIHVwCi0JICogQHJldHVybiBhIDxjb2RlPkNvbXBvc2l0ZTwvY29kZT4gb2JqZWN0Ci0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBDb21wb3NpdGUgY3JlYXRlQ2hpbGRHcmlkTGF5b3V0Q29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQsCi0JCQlpbnQgY29sdW1uKSB7Ci0JCXJldHVybiBTV1RVdGlsLmNyZWF0ZUNoaWxkR3JpZExheW91dENvbXBvc2l0ZShwYXJlbnQsIGNvbHVtbik7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIGdyb3VwIHdpdGggYSBncmlkIGxheW91dC4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IGNvbXBvc2l0ZQotCSAqIEBwYXJhbSB0ZXh0Ci0JICogICAgICAgICAgICB0aGUgdGV4dCBmb3IgdGhlIGdyb3VwCi0JICogQHBhcmFtIGNvbHVtbgotCSAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiBjb2x1bW4gY2VsbHMgdGhhdCB0aGUgZ3JvdXAgd2lsbCB0YWtlIHVwCi0JICogQHJldHVybiBhIDxjb2RlPkdyb3VwPC9jb2RlPiBvYmplY3QKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIEdyb3VwIGNyZWF0ZUdyaWRMYXlvdXRHcm91cChDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgdGV4dCwKLQkJCWludCBjb2x1bW4pIHsKLQkJcmV0dXJuIFNXVFV0aWwuY3JlYXRlR3JpZExheW91dEdyb3VwKHBhcmVudCwgdGV4dCwgY29sdW1uKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgZ3JvdXAgd2l0aCBhIGdyaWQgbGF5b3V0LgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgY29tcG9zaXRlCi0JICogQHBhcmFtIHRleHQKLQkgKiAgICAgICAgICAgIHRoZSB0ZXh0IGZvciB0aGUgZ3JvdXAKLQkgKiBAcGFyYW0gY29sdW1uCi0JICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIGNvbHVtbiBjZWxscyB0aGF0IHRoZSBncm91cCB3aWxsIHRha2UgdXAKLQkgKiBAcGFyYW0gZXF1YWxDb2x1bW5XaWR0aAotCSAqICAgICAgICAgICAgZmxhZyB0byBpbmRpY2F0ZSB3aGV0aGVyIGNvbHVtbiBjZWxscyBzaG91bGQgYmUgc2FtZSB3aWR0aCBvcgotCSAqICAgICAgICAgICAgbm90Ci0JICogQHJldHVybiBhIDxjb2RlPkdyb3VwPC9jb2RlPiBvYmplY3QKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIEdyb3VwIGNyZWF0ZUdyaWRMYXlvdXRHcm91cChDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgdGV4dCwKLQkJCWludCBjb2x1bW4sIGJvb2xlYW4gZXF1YWxDb2x1bW5XaWR0aCkgewotCQlyZXR1cm4gU1dUVXRpbC5jcmVhdGVHcmlkTGF5b3V0R3JvdXAocGFyZW50LCB0ZXh0LCBjb2x1bW4sCi0JCQkJZXF1YWxDb2x1bW5XaWR0aCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIGxhYmVsLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgY29tcG9zaXRlCi0JICogQHBhcmFtIHRleHQKLQkgKiAgICAgICAgICAgIHRoZSB0ZXh0IGZvciB0aGUgbGFiZWwKLQkgKiBAcGFyYW0gY29sdW1uCi0JICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIGNvbHVtbiBjZWxscyB0aGF0IHRoZSBsYWJlbCB3aWxsIHRha2UgdXAKLQkgKiBAcmV0dXJuIGEgPGNvZGU+TGFiZWw8L2NvZGU+IG9iamVjdAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgTGFiZWwgY3JlYXRlTGFiZWwoQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIHRleHQsIGludCBjb2x1bW4pIHsKLQkJcmV0dXJuIFNXVFV0aWwuY3JlYXRlTGFiZWwocGFyZW50LCB0ZXh0LCBjb2x1bW4pOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBsYWJlbCB0aGF0IG9ubHkgdGFrZXMgdXAgb25lIGNvbHVtbiBjZWxsLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgY29tcG9zaXRlCi0JICogQHBhcmFtIHRleHQKLQkgKiAgICAgICAgICAgIHRoZSB0ZXh0IGZvciB0aGUgbGFiZWwKLQkgKiBAcmV0dXJuIGEgPGNvZGU+TGFiZWw8L2NvZGU+IG9iamVjdAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgTGFiZWwgY3JlYXRlTGFiZWwoQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIHRleHQpIHsKLQkJcmV0dXJuIFNXVFV0aWwuY3JlYXRlTGFiZWwocGFyZW50LCB0ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgdmVydGljYWxseSBhbGlnbmVkIGxhYmVsIHRoYXQgb25seSB0YWtlcyB1cCBvbmUgY29sdW1uIGNlbGwuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBjb21wb3NpdGUKLQkgKiBAcGFyYW0gdGV4dAotCSAqICAgICAgICAgICAgdGhlIHRleHQgZm9yIHRoZSBsYWJlbAotCSAqIEByZXR1cm4gYSA8Y29kZT5MYWJlbDwvY29kZT4gb2JqZWN0Ci0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBMYWJlbCBjcmVhdGVWZXJ0aWNhbGx5QWxpZ25lZExhYmVsKENvbXBvc2l0ZSBwYXJlbnQsCi0JCQlTdHJpbmcgdGV4dCkgewotCQlyZXR1cm4gU1dUVXRpbC5jcmVhdGVWZXJ0aWNhbGx5QWxpZ25lZExhYmVsKHBhcmVudCwgdGV4dCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBlZGl0YWJsZSB0ZXh0IGNvbnRyb2wuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBjb21wb3NpdGUKLQkgKiBAcGFyYW0gZGVmYXVsdFRleHQKLQkgKiAgICAgICAgICAgIHRoZSBkZWZhdWx0IHRleHQgZm9yIHRoZSBjb250cm9sCi0JICogQHBhcmFtIHdpZHRoSGludAotCSAqICAgICAgICAgICAgdGhlIHByZWZlcnJlZCB3aWR0aCAoaW4gcGl4ZWxzKSBmb3IgdGhlIGNvbnRyb2wKLQkgKiBAcGFyYW0gaGVpZ2h0SGludAotCSAqICAgICAgICAgICAgdGhlIHByZWZlcnJlZCBoZWlnaHQgKGluIHBpeGVscykgZm9yIHRoZSBjb250cm9sCi0JICogQHBhcmFtIGNvbHVtbgotCSAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiBjb2x1bW4gY2VsbHMgdGhhdCB0aGUgY29udHJvbCB3aWxsIHRha2UgdXAKLQkgKiBAcmV0dXJuIGEgPGNvZGU+VGV4dDwvY29kZT4gb2JqZWN0Ci0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBUZXh0IGNyZWF0ZUVkaXRhYmxlVGV4dChDb21wb3NpdGUgcGFyZW50LAotCQkJU3RyaW5nIGRlZmF1bHRUZXh0LCBpbnQgd2lkdGhIaW50LCBpbnQgaGVpZ2h0SGludCwgaW50IGNvbHVtbikgewotCQlyZXR1cm4gU1dUVXRpbC5jcmVhdGVFZGl0YWJsZVRleHQocGFyZW50LCBkZWZhdWx0VGV4dCwgd2lkdGhIaW50LAotCQkJCWhlaWdodEhpbnQsIGNvbHVtbik7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBlZGl0YWJsZSB0ZXh0IGNvbnRyb2wuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBjb21wb3NpdGUKLQkgKiBAcGFyYW0gd2lkdGhIaW50Ci0JICogICAgICAgICAgICB0aGUgcHJlZmVycmVkIHdpZHRoIChpbiBwaXhlbHMpIGZvciB0aGUgY29udHJvbAotCSAqIEBwYXJhbSBoZWlnaHRIaW50Ci0JICogICAgICAgICAgICB0aGUgcHJlZmVycmVkIGhlaWdodCAoaW4gcGl4ZWxzKSBmb3IgdGhlIGNvbnRyb2wKLQkgKiBAcGFyYW0gY29sdW1uCi0JICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIGNvbHVtbiBjZWxscyB0aGF0IHRoZSBjb250cm9sIHdpbGwgdGFrZSB1cAotCSAqIEByZXR1cm4gYSA8Y29kZT5UZXh0PC9jb2RlPiBvYmplY3QKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFRleHQgY3JlYXRlRWRpdGFibGVUZXh0KENvbXBvc2l0ZSBwYXJlbnQsIGludCB3aWR0aEhpbnQsCi0JCQlpbnQgaGVpZ2h0SGludCwgaW50IGNvbHVtbikgewotCQlyZXR1cm4gU1dUVXRpbAotCQkJCS5jcmVhdGVFZGl0YWJsZVRleHQocGFyZW50LCB3aWR0aEhpbnQsIGhlaWdodEhpbnQsIGNvbHVtbik7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIHJlYWRvbmx5IHRleHQgY29udHJvbC4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IGNvbXBvc2l0ZQotCSAqIEBwYXJhbSBkZWZhdWx0VGV4dAotCSAqICAgICAgICAgICAgdGhlIGRlZmF1bHQgdGV4dCBmb3IgdGhlIGNvbnRyb2wKLQkgKiBAcGFyYW0gd2lkdGhIaW50Ci0JICogICAgICAgICAgICB0aGUgcHJlZmVycmVkIHdpZHRoIChpbiBwaXhlbHMpIGZvciB0aGUgY29udHJvbAotCSAqIEBwYXJhbSBjb2x1bW4KLQkgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgY29sdW1uIGNlbGxzIHRoYXQgdGhlIGNvbnRyb2wgd2lsbCB0YWtlIHVwCi0JICogQHJldHVybiBhIDxjb2RlPlRleHQ8L2NvZGU+IG9iamVjdAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgVGV4dCBjcmVhdGVUZXh0KENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyBkZWZhdWx0VGV4dCwKLQkJCWludCB3aWR0aEhpbnQsIGludCBjb2x1bW4pIHsKLQkJcmV0dXJuIFNXVFV0aWwuY3JlYXRlVGV4dChwYXJlbnQsIGRlZmF1bHRUZXh0LCB3aWR0aEhpbnQsIGNvbHVtbik7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiByZWFkb25seSB0ZXh0IGNvbnRyb2wgdGhhdCBvbmx5IHRha2VzIHVwIG9uZSBjb2x1bW4gY2VsbC4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IGNvbXBvc2l0ZQotCSAqIEBwYXJhbSBkZWZhdWx0VGV4dAotCSAqICAgICAgICAgICAgdGhlIGRlZmF1bHQgdGV4dCBmb3IgdGhlIGNvbnRyb2wKLQkgKiBAcmV0dXJuIGEgPGNvZGU+VGV4dDwvY29kZT4gb2JqZWN0Ci0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBUZXh0IGNyZWF0ZVRleHQoQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIGRlZmF1bHRUZXh0KSB7Ci0JCXJldHVybiBTV1RVdGlsLmNyZWF0ZVRleHQocGFyZW50LCBkZWZhdWx0VGV4dCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBlZGl0YWJsZSB0ZXh0IGNvbnRyb2wuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBjb21wb3NpdGUKLQkgKiBAcGFyYW0gZGVmYXVsdFRleHQKLQkgKiAgICAgICAgICAgIHRoZSBkZWZhdWx0IHRleHQgZm9yIHRoZSBjb250cm9sCi0JICogQHBhcmFtIHdpZHRoSGludAotCSAqICAgICAgICAgICAgdGhlIHByZWZlcnJlZCB3aWR0aCAoaW4gcGl4ZWxzKSBmb3IgdGhlIGNvbnRyb2wKLQkgKiBAcGFyYW0gY29sdW1uCi0JICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIGNvbHVtbiBjZWxscyB0aGF0IHRoZSBjb250cm9sIHdpbGwgdGFrZSB1cAotCSAqIEByZXR1cm4gYSA8Y29kZT5UZXh0PC9jb2RlPiBvYmplY3QKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIFRleHQgY3JlYXRlRWRpdGFibGVUZXh0KENvbXBvc2l0ZSBwYXJlbnQsCi0JCQlTdHJpbmcgZGVmYXVsdFRleHQsIGludCB3aWR0aEhpbnQsIGludCBjb2x1bW4pIHsKLQkJcmV0dXJuIFNXVFV0aWwuY3JlYXRlRWRpdGFibGVUZXh0KHBhcmVudCwgZGVmYXVsdFRleHQsIHdpZHRoSGludCwKLQkJCQljb2x1bW4pOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gZWRpdGFibGUgdGV4dCBjb250cm9sLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgY29tcG9zaXRlCi0JICogQHBhcmFtIGRlZmF1bHRUZXh0Ci0JICogICAgICAgICAgICB0aGUgZGVmYXVsdCB0ZXh0IGZvciB0aGUgY29udHJvbAotCSAqIEBwYXJhbSB3aWR0aEhpbnQKLQkgKiAgICAgICAgICAgIHRoZSBwcmVmZXJyZWQgd2lkdGggKGluIHBpeGVscykgZm9yIHRoZSBjb250cm9sCi0JICogQHBhcmFtIGNvbHVtbgotCSAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiBjb2x1bW4gY2VsbHMgdGhhdCB0aGUgY29udHJvbCB3aWxsIHRha2UgdXAKLQkgKiBAcmV0dXJuIGEgPGNvZGU+VGV4dDwvY29kZT4gb2JqZWN0Ci0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBUZXh0IGNyZWF0ZUVkaXRhYmxlVGV4dChDb21wb3NpdGUgcGFyZW50LAotCQkJU3RyaW5nIGRlZmF1bHRUZXh0LCBpbnQgd2lkdGhIaW50KSB7Ci0JCXJldHVybiBTV1RVdGlsLmNyZWF0ZUVkaXRhYmxlVGV4dChwYXJlbnQsIGRlZmF1bHRUZXh0LCB3aWR0aEhpbnQpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gZWRpdGFibGUgdGV4dCBjb250cm9sLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgY29tcG9zaXRlCi0JICogQHBhcmFtIGNvbHVtbgotCSAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiBjb2x1bW4gY2VsbHMgdGhhdCB0aGUgY29udHJvbCB3aWxsIHRha2UgdXAKLQkgKiBAcmV0dXJuIGEgPGNvZGU+VGV4dDwvY29kZT4gb2JqZWN0Ci0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBUZXh0IGNyZWF0ZUVkaXRhYmxlVGV4dChDb21wb3NpdGUgcGFyZW50LCBpbnQgY29sdW1uKSB7Ci0JCXJldHVybiBTV1RVdGlsLmNyZWF0ZUVkaXRhYmxlVGV4dChwYXJlbnQsIGNvbHVtbik7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBlZGl0YWJsZSB0ZXh0IGNvbnRyb2wgdGhhdCBvbmx5IHRha2VzIHVwIG9uZSBjb2x1bW4gY2VsbC4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IGNvbXBvc2l0ZQotCSAqIEBwYXJhbSBkZWZhdWx0VGV4dAotCSAqICAgICAgICAgICAgdGhlIGRlZmF1bHQgdGV4dCBmb3IgdGhlIGNvbnRyb2wKLQkgKiBAcmV0dXJuIGEgPGNvZGU+VGV4dDwvY29kZT4gb2JqZWN0Ci0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBUZXh0IGNyZWF0ZUVkaXRhYmxlVGV4dChDb21wb3NpdGUgcGFyZW50LAotCQkJU3RyaW5nIGRlZmF1bHRUZXh0KSB7Ci0JCXJldHVybiBTV1RVdGlsLmNyZWF0ZUVkaXRhYmxlVGV4dChwYXJlbnQsIGRlZmF1bHRUZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGVtcHR5IGVkaXRhYmxlIHRleHQgY29udHJvbCB0aGF0IG9ubHkgdGFrZXMgdXAgb25lIGNvbHVtbgotCSAqIGNlbGwuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBjb21wb3NpdGUKLQkgKiBAcGFyYW0gZGVmYXVsdFRleHQKLQkgKiAgICAgICAgICAgIHRoZSBkZWZhdWx0IHRleHQgZm9yIHRoZSBjb250cm9sCi0JICogQHJldHVybiBhIDxjb2RlPlRleHQ8L2NvZGU+IG9iamVjdAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgVGV4dCBjcmVhdGVFZGl0YWJsZVRleHQoQ29tcG9zaXRlIHBhcmVudCkgewotCQlyZXR1cm4gU1dUVXRpbC5jcmVhdGVFZGl0YWJsZVRleHQocGFyZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgcmVhZG9ubHkgbXVsdGktbGluZSB0ZXh0IGNvbnRyb2wuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBjb21wb3NpdGUKLQkgKiBAcGFyYW0gZGVmYXVsdFRleHQKLQkgKiAgICAgICAgICAgIHRoZSBkZWZhdWx0IHRleHQgZm9yIHRoZSBjb250cm9sCi0JICogQHBhcmFtIHdpZHRoSGludAotCSAqICAgICAgICAgICAgdGhlIHByZWZlcnJlZCB3aWR0aCAoaW4gcGl4ZWxzKSBmb3IgdGhlIGNvbnRyb2wKLQkgKiBAcGFyYW0gaGVpZ2h0SGludAotCSAqICAgICAgICAgICAgdGhlIHByZWZlcnJlZCBoZWlnaHQgKGluIHBpeGVscykgZm9yIHRoZSBjb250cm9sCi0JICogQHBhcmFtIGNvbHVtbgotCSAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiBjb2x1bW4gY2VsbHMgdGhhdCB0aGUgY29udHJvbCB3aWxsIHRha2UgdXAKLQkgKiBAcmV0dXJuIGEgPGNvZGU+VGV4dDwvY29kZT4gb2JqZWN0Ci0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBUZXh0IGNyZWF0ZU11bHRpTGluZVRleHQoQ29tcG9zaXRlIHBhcmVudCwKLQkJCVN0cmluZyBkZWZhdWx0VGV4dCwgaW50IHdpZHRoSGludCwgaW50IGhlaWdodEhpbnQsIGludCBjb2x1bW4pIHsKLQkJcmV0dXJuIFNXVFV0aWwuY3JlYXRlTXVsdGlMaW5lVGV4dChwYXJlbnQsIGRlZmF1bHRUZXh0LCB3aWR0aEhpbnQsCi0JCQkJaGVpZ2h0SGludCwgY29sdW1uKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGNvbWJvYm94LgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgY29tcG9zaXRlCi0JICogQHBhcmFtIGNvbHVtbgotCSAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiBjb2x1bW4gY2VsbHMgdGhhdCB0aGUgY29udHJvbCB3aWxsIHRha2UgdXAKLQkgKiBAcmV0dXJuIGEgPGNvZGU+Q29tYm88L2NvZGU+IG9iamVjdAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgQ29tYm8gY3JlYXRlQ29tYm9ib3goQ29tcG9zaXRlIHBhcmVudCwgaW50IGNvbHVtbikgewotCQlyZXR1cm4gU1dUVXRpbC5jcmVhdGVDb21ib2JveChwYXJlbnQsIGNvbHVtbik7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgYW4gY29tYm9ib3ggd2l0aCByZWFkb25seSBzdHlsZS4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IGNvbXBvc2l0ZQotCSAqIEBwYXJhbSBjb2x1bW4KLQkgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgY29sdW1uIGNlbGxzIHRoYXQgdGhlIGNvbnRyb2wgd2lsbCB0YWtlIHVwCi0JICogQHJldHVybiBhIDxjb2RlPkNvbWJvPC9jb2RlPiBvYmplY3QKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIENvbWJvIGNyZWF0ZVJlYWRPbmx5Q29tYm9ib3goQ29tcG9zaXRlIHBhcmVudCwgaW50IGNvbHVtbikgewotCQlyZXR1cm4gU1dUVXRpbC5jcmVhdGVSZWFkT25seUNvbWJvYm94KHBhcmVudCwgY29sdW1uKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGNvbWJvYm94IHRoYXQgb25seSB0YWtlcyB1cCBvbmUgY29sdW1uIGNlbGwuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBjb21wb3NpdGUKLQkgKiBAcmV0dXJuIGEgPGNvZGU+Q29tYm88L2NvZGU+IG9iamVjdAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgQ29tYm8gY3JlYXRlQ29tYm9ib3goQ29tcG9zaXRlIHBhcmVudCkgewotCQlyZXR1cm4gU1dUVXRpbC5jcmVhdGVDb21ib2JveChwYXJlbnQpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBidXR0b24uCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBjb21wb3NpdGUKLQkgKiBAcGFyYW0gdGV4dAotCSAqICAgICAgICAgICAgdGhlIHRleHQgZm9yIHRoZSBjb250cm9sCi0JICogQHJldHVybiBhIDxjb2RlPkJ1dHRvbjwvY29kZT4gb2JqZWN0Ci0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBCdXR0b24gY3JlYXRlQnV0dG9uKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyB0ZXh0KSB7Ci0JCXJldHVybiBTV1RVdGlsLmNyZWF0ZUJ1dHRvbihwYXJlbnQsIHRleHQpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBjaGVja2JveC4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IGNvbXBvc2l0ZQotCSAqIEBwYXJhbSB0ZXh0Ci0JICogICAgICAgICAgICB0aGUgdGV4dCBmb3IgdGhlIGNvbnRyb2wKLQkgKiBAcGFyYW0gY29sdW1uCi0JICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIGNvbHVtbiBjZWxscyB0aGF0IHRoZSBjb250cm9sIHdpbGwgdGFrZSB1cAotCSAqIEByZXR1cm4gYSA8Y29kZT5CdXR0b248L2NvZGU+IG9iamVjdAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgQnV0dG9uIGNyZWF0ZUNoZWNrYm94KENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyB0ZXh0LAotCQkJaW50IGNvbHVtbikgewotCQlyZXR1cm4gU1dUVXRpbC5jcmVhdGVDaGVja2JveChwYXJlbnQsIHRleHQsIGNvbHVtbik7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIGNoZWNrYm94IHRoYXQgb25seSB0YWtlcyB1cCBvbmUgY29sdW1uIGNlbGwuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBjb21wb3NpdGUKLQkgKiBAcGFyYW0gdGV4dAotCSAqICAgICAgICAgICAgdGhlIHRleHQgZm9yIHRoZSBjb250cm9sCi0JICogQHJldHVybiBhIDxjb2RlPkJ1dHRvbjwvY29kZT4gb2JqZWN0Ci0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBCdXR0b24gY3JlYXRlQ2hlY2tib3goQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIHRleHQpIHsKLQkJcmV0dXJuIFNXVFV0aWwuY3JlYXRlQ2hlY2tib3gocGFyZW50LCB0ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIHJhZGlvIGJ1dHRvbi4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IGNvbXBvc2l0ZQotCSAqIEBwYXJhbSB0ZXh0Ci0JICogICAgICAgICAgICB0aGUgdGV4dCBmb3IgdGhlIGNvbnRyb2wKLQkgKiBAcGFyYW0gY29sdW1uCi0JICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIGNvbHVtbiBjZWxscyB0aGF0IHRoZSBjb250cm9sIHdpbGwgdGFrZSB1cAotCSAqIEBwYXJhbSBzZWxlY3RlZAotCSAqICAgICAgICAgICAgaWYgPGNvZGU+dHJ1ZTwvY29kZT4sIHNlbGVjdCB0aGUgcmFkaW8gYnV0dG9uIGJ5IGRlZmF1bHQKLQkgKiBAcmV0dXJuIGEgPGNvZGU+QnV0dG9uPC9jb2RlPiBvYmplY3QKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIEJ1dHRvbiBjcmVhdGVSYWRpb0J1dHRvbihDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgdGV4dCwKLQkJCWludCBjb2x1bW4sIGJvb2xlYW4gc2VsZWN0ZWQpIHsKLQkJcmV0dXJuIFNXVFV0aWwuY3JlYXRlUmFkaW9CdXR0b24ocGFyZW50LCB0ZXh0LCBjb2x1bW4sIHNlbGVjdGVkKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIHJhZGlvIGJ1dHRvbiB0aGF0IG9ubHkgdGFrZXMgdXAgb25lIGNvbHVtbiBjZWxsLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgY29tcG9zaXRlCi0JICogQHBhcmFtIHRleHQKLQkgKiAgICAgICAgICAgIHRoZSB0ZXh0IGZvciB0aGUgY29udHJvbAotCSAqIEByZXR1cm4gYSA8Y29kZT5CdXR0b248L2NvZGU+IG9iamVjdAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgQnV0dG9uIGNyZWF0ZVJhZGlvQnV0dG9uKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyB0ZXh0KSB7Ci0JCXJldHVybiBTV1RVdGlsLmNyZWF0ZVJhZGlvQnV0dG9uKHBhcmVudCwgdGV4dCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIHJlYWRvbmx5IHRleHQgdmlld2VyLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgY29tcG9zaXRlCi0JICogQHBhcmFtIHdpZHRoSGludAotCSAqICAgICAgICAgICAgdGhlIHByZWZlcnJlZCB3aWR0aCAoaW4gcGl4ZWxzKSBmb3IgdGhlIGNvbnRyb2wKLQkgKiBAcGFyYW0gaGVpZ2h0SGludAotCSAqICAgICAgICAgICAgdGhlIHByZWZlcnJlZCBoZWlnaHQgKGluIHBpeGVscykgZm9yIHRoZSBjb250cm9sCi0JICogQHBhcmFtIGNvbHVtbgotCSAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiBjb2x1bW4gY2VsbHMgdGhhdCB0aGUgY29udHJvbCB3aWxsIHRha2UgdXAKLQkgKiBAcmV0dXJuIGEgPGNvZGU+VGV4dFZpZXdlcjwvY29kZT4gb2JqZWN0Ci0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBUZXh0Vmlld2VyIGNyZWF0ZVRleHRWaWV3ZXIoQ29tcG9zaXRlIHBhcmVudCwKLQkJCWludCB3aWR0aEhpbnQsIGludCBoZWlnaHRIaW50LCBpbnQgY29sdW1uKSB7Ci0JCXJldHVybiBTV1RVdGlsLmNyZWF0ZVRleHRWaWV3ZXIocGFyZW50LCB3aWR0aEhpbnQsIGhlaWdodEhpbnQsIGNvbHVtbik7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIHJlYWRvbmx5IHRleHQgdmlld2VyIHRoYXQgb25seSB0YWtlcyB1cCBvbmUgY29sdW1uIGNlbGwuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBjb21wb3NpdGUKLQkgKiBAcmV0dXJuIGEgPGNvZGU+VGV4dFZpZXdlcjwvY29kZT4gb2JqZWN0Ci0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBUZXh0Vmlld2VyIGNyZWF0ZVRleHRWaWV3ZXIoQ29tcG9zaXRlIHBhcmVudCkgewotCQlyZXR1cm4gU1dUVXRpbC5jcmVhdGVUZXh0Vmlld2VyKHBhcmVudCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIHRhYmxlIHZpZXdlci4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IGNvbXBvc2l0ZQotCSAqIEBwYXJhbSB3aWR0aEhpbnQKLQkgKiAgICAgICAgICAgIHRoZSBwcmVmZXJyZWQgd2lkdGggKGluIHBpeGVscykgZm9yIHRoZSBjb250cm9sCi0JICogQHBhcmFtIGhlaWdodEhpbnQKLQkgKiAgICAgICAgICAgIHRoZSBwcmVmZXJyZWQgaGVpZ2h0IChpbiBwaXhlbHMpIGZvciB0aGUgY29udHJvbAotCSAqIEBwYXJhbSBjb2x1bW4KLQkgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgY29sdW1uIGNlbGxzIHRoYXQgdGhlIGNvbnRyb2wgd2lsbCB0YWtlIHVwCi0JICogQHJldHVybiBhIDxjb2RlPlRhYmxlVmlld2VyPC9jb2RlPiBvYmplY3QKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIFRhYmxlVmlld2VyIGNyZWF0ZVRhYmxlVmlld2VyKENvbXBvc2l0ZSBwYXJlbnQsCi0JCQlpbnQgd2lkdGhIaW50LCBpbnQgaGVpZ2h0SGludCwgaW50IGNvbHVtbikgewotCQlyZXR1cm4gU1dUVXRpbC5jcmVhdGVUYWJsZVZpZXdlcihwYXJlbnQsIHdpZHRoSGludCwgaGVpZ2h0SGludCwgY29sdW1uKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgY2hlY2tib3ggdGFibGUgdmlld2VyLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgY29tcG9zaXRlCi0JICogQHBhcmFtIHdpZHRoSGludAotCSAqICAgICAgICAgICAgdGhlIHByZWZlcnJlZCB3aWR0aCAoaW4gcGl4ZWxzKSBmb3IgdGhlIGNvbnRyb2wKLQkgKiBAcGFyYW0gaGVpZ2h0SGludAotCSAqICAgICAgICAgICAgdGhlIHByZWZlcnJlZCBoZWlnaHQgKGluIHBpeGVscykgZm9yIHRoZSBjb250cm9sCi0JICogQHBhcmFtIGNvbHVtbgotCSAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiBjb2x1bW4gY2VsbHMgdGhhdCB0aGUgY29udHJvbCB3aWxsIHRha2UgdXAKLQkgKiBAcmV0dXJuIGEgPGNvZGU+Q2hlY2tib3hUYWJsZVZpZXdlcjwvY29kZT4gb2JqZWN0Ci0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBDaGVja2JveFRhYmxlVmlld2VyIGNyZWF0ZUNoZWNrYm94VGFibGVWaWV3ZXIoCi0JCQlDb21wb3NpdGUgcGFyZW50LCBpbnQgd2lkdGhIaW50LCBpbnQgaGVpZ2h0SGludCwgaW50IGNvbHVtbikgewotCQlyZXR1cm4gU1dUVXRpbC5jcmVhdGVDaGVja2JveFRhYmxlVmlld2VyKHBhcmVudCwgd2lkdGhIaW50LCBoZWlnaHRIaW50LAotCQkJCWNvbHVtbik7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIGNoZWNrYm94IHRhYmxlIHZpZXdlci4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IGNvbXBvc2l0ZQotCSAqIEBwYXJhbSBjb2x1bW4KLQkgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgY29sdW1uIGNlbGxzIHRoYXQgdGhlIGNvbnRyb2wgd2lsbCB0YWtlIHVwCi0JICogQHJldHVybiBhIDxjb2RlPkNoZWNrYm94VGFibGVWaWV3ZXI8L2NvZGU+IG9iamVjdAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgQ2hlY2tib3hUYWJsZVZpZXdlciBjcmVhdGVDaGVja2JveFRhYmxlVmlld2VyKAotCQkJQ29tcG9zaXRlIHBhcmVudCwgaW50IGNvbHVtbikgewotCQlyZXR1cm4gU1dUVXRpbC5jcmVhdGVDaGVja2JveFRhYmxlVmlld2VyKHBhcmVudCwgMzYwLCAxNzUsIGNvbHVtbik7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIGxpbmUuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBjb21wb3NpdGUKLQkgKiBAcGFyYW0gY29sdW1uCi0JICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIGNvbHVtbiBjZWxscyB0aGF0IHRoZSBsaW5lIHdpbGwgdGFrZSB1cAotCSAqIEByZXR1cm4gYSA8Y29kZT5MYWJlbDwvY29kZT4gb2JqZWN0Ci0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBMYWJlbCBjcmVhdGVMaW5lKENvbXBvc2l0ZSBwYXJlbnQsIGludCBjb2x1bW4pIHsKLQkJcmV0dXJuIFNXVFV0aWwuY3JlYXRlTGluZShwYXJlbnQsIGNvbHVtbik7Ci0JfQotCi0JLyoqCi0JICogQ2hlY2tzIHdoZXRoZXIgYSB0ZXh0IGNvbnRyb2wgaGFzIHNvbWUgdGV4dC4KLQkgKiAKLQkgKiBAcGFyYW0gY29udHJvbAotCSAqICAgICAgICAgICAgdGhlIHRleHQgY29udHJvbAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHRleHQgY29udHJvbCBoYXMgc29tZSB0ZXh0LAotCSAqICAgICAgICAgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgYm9vbGVhbiBpc05vbkVtcHR5VGV4dChUZXh0IGNvbnRyb2wpIHsKLQkJcmV0dXJuIFNXVFV0aWwuaXNOb25FbXB0eVRleHQoY29udHJvbCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkvc3JjL29yZy9lY2xpcHNlL2VwZi91aS93aXphcmRzL0lOZXdXaXphcmRQYWdlQ29udHJpYnV0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkvc3JjL29yZy9lY2xpcHNlL2VwZi91aS93aXphcmRzL0lOZXdXaXphcmRQYWdlQ29udHJpYnV0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxZGY2ZDYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvdWkvd2l6YXJkcy9JTmV3V2l6YXJkUGFnZUNvbnRyaWJ1dGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVpLndpemFyZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZFBhZ2U7Ci0KLS8qKgotICogVGhlIGludGVyZmFjZSBmb3IgYSBuZXcgd2l6YXJkIHBhZ2UgY29udHJpYnV0aW9uLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjIKLSAqLwotcHVibGljIGludGVyZmFjZSBJTmV3V2l6YXJkUGFnZUNvbnRyaWJ1dGlvbiB7Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBuZXcgd2l6YXJkIHBhZ2UgdGhhdCBpcyBiZWluZyBhZGRlZCB0byBhIHdpemFyZC4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgPGNvZGU+SVdpemFyZFBhZ2U8L2NvZGU+IG9iamVjdAotCSAqLwotCXB1YmxpYyBJV2l6YXJkUGFnZSBnZXRXaXphcmRQYWdlKCk7Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBuYW1lIG9mIHRoZSBiYXNlIHdpemFyZCBwYWdlIHRoYXQgaXMgdXNlZCBhcyBhIHJlZmVyZW5jZSBmb3IKLQkgKiBpbnNlcnRpbmcgdGhlIG5ldyB3aXphcmQgcGFnZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBuYW1lIG9mIHRoZSByZWZlcmVuY2VkIGJhc2Ugd2l6YXJkIHBhZ2UKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRhcmdldFdpemFyZFBhZ2UoKTsKLQotCS8qKgotCSAqIEdldHMgdGhlIGluc2VydGlvbiBvcHRpb24gZm9yIHRoZSBuZXcgd2l6YXJkIHBhZ2UuCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgbmV3IHdpemFyZCBwYWdlIHNob3VsZCBiZSBpbnNlcnRlZAotCSAqICAgICAgICAgYWZ0ZXIgdGhlIHRhcmdldCB3aXphcmQgcGFnZTsgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIGl0IHNob3VsZAotCSAqICAgICAgICAgYmUgaW5zZXJ0ZWQgYmVmb3JlIHRoZSB0YXJnZXQgd2l6YXJkIHBhZ2UKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBnZXRJbnNlcnRBZnRlcigpOwotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkvc3JjL29yZy9lY2xpcHNlL2VwZi91aS93aXphcmRzL0lSZXBsYWNlV2l6YXJkUGFnZUNvbnRyaWJ1dGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvdWkvd2l6YXJkcy9JUmVwbGFjZVdpemFyZFBhZ2VDb250cmlidXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTg3YmQxMy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkvc3JjL29yZy9lY2xpcHNlL2VwZi91aS93aXphcmRzL0lSZXBsYWNlV2l6YXJkUGFnZUNvbnRyaWJ1dGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVpLndpemFyZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZFBhZ2U7Ci0KLS8qKgotICogVGhlIGludGVyZmFjZSBmb3IgYSByZXBsYWNlIHdpemFyZCBwYWdlIGNvbnRyaWJ1dGlvbi4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4yCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVJlcGxhY2VXaXphcmRQYWdlQ29udHJpYnV0aW9uIHsKLQotCS8qKgotCSAqIEdldHMgdGhlIHdpemFyZCBwYWdlIHRoYXQgcmVwbGFjZXMgYSBzcGVjaWZpYyB3aXphcmQgcGFnZSBpbiBhIHdpemFyZC4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgPGNvZGU+SVdpemFyZFBhZ2U8L2NvZGU+IG9iamVjdAotCSAqLwotCXB1YmxpYyBJV2l6YXJkUGFnZSBnZXRXaXphcmRQYWdlKCk7Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBuYW1lIG9mIHRoZSBiYXNlIHdpemFyZCBwYWdlIHRoYXQgaXMgc2hvdWxkIGJlIHJlcGxhY2VkLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG5hbWUgb2YgdGhlIHJlZmVyZW5jZWQgYmFzZSB3aXphcmQgcGFnZQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGFyZ2V0V2l6YXJkUGFnZSgpOwotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkvc3JjL29yZy9lY2xpcHNlL2VwZi91aS93aXphcmRzL0lXaXphcmRFeHRlbmRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvdWkvd2l6YXJkcy9JV2l6YXJkRXh0ZW5kZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWRmZTc5NS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkvc3JjL29yZy9lY2xpcHNlL2VwZi91aS93aXphcmRzL0lXaXphcmRFeHRlbmRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51aS53aXphcmRzOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZDsKLQotLyoqCi0gKiBUaGUgaW50ZXJmYWNlIGZvciBhIGdlbmVyaWMgd2l6YXJkIGV4dGVuZGVyLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjIKLSAqLwotcHVibGljIGludGVyZmFjZSBJV2l6YXJkRXh0ZW5kZXIgewotCi0JLyoqCi0JICogR2l2ZXMgdGhlIHdpemFyZCBleHRlbmRlciBhIGNoYW5jZSB0byBwZXJmb3JtIHNvbWUgaW5pdGlhbGl6YXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChXaXphcmQgd2l6YXJkKTsKLQotCS8qKgotCSAqIEdpdmVzIHRoZSB3aXphcmQgZXh0ZW5kZXIgYSBjaGFuY2UgdG8gc2F2ZSByZWZlcmVuY2VzIHRvIHdpemFyZCBwYWdlcy4KLQkgKiAKLQkgKiBAcGFyYW0gd2l6YXJkUGFnZXMKLQkgKiAgICAgICAgICAgIGEgY29sbGVjdGlvbiBvZiA8Y29kZT5JV2l6YXJkUGFnZTwvY29kZT4gb3duZWQgYnkgdGhlIHdpemFyZAotCSAqLwotCXB1YmxpYyB2b2lkIGluaXRXaXphcmRQYWdlcyhMaXN0PElXaXphcmRQYWdlPiB3aXphcmRQYWdlcyk7Ci0KLQkvKioKLQkgKiBBZGRzIGEgcmVwbGFjZSB3aXphcmQgcGFnZSBjb250cmliaXRpb24uCi0JICogCi0JICogQHBhcmFtIGNvbnRyaWJ1dGlvbgotCSAqICAgICAgICAgICAgdGhlIHJlcGxhY2Ugd2l6YXJkIHBhZ2UgY29udHJpYnV0aW9uCi0JICovCi0JcHVibGljIHZvaWQgYWRkUmVwbGFjZVdpemFyZFBhZ2VDb250cmlidXRpb24oCi0JCQlJUmVwbGFjZVdpemFyZFBhZ2VDb250cmlidXRpb24gY29udHJpYnV0aW9uKTsKLQotCS8qKgotCSAqIEdldHMgdGhlIHdpemFyZCBwYWdlIHRoYXQgcmVwbGFjZXMgYSBiYXNlIHdpemFyZCBwYWdlLgotCSAqIAotCSAqIEBwYXJhbSB0YXJnZXQKLQkgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBiYXNlIHdpemFyZCB0byBiZSByZXBsYWNlZAotCSAqIEByZXR1cm4gYSA8Y29kZT5JV2l6YXJkUGFnZTwvY29kZT4gb2JqZWN0IG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vCi0JICogICAgICAgICByZXBsYWNlbWVudCBwYWdlIGlzIGF2YWlsYWJsZQotCSAqLwotCXB1YmxpYyBJV2l6YXJkUGFnZSBnZXRSZXBsYWNlV2l6YXJkUGFnZShTdHJpbmcgdGFyZ2V0KTsKLQotCS8qKgotCSAqIEFkZHMgYSBuZXcgd2l6YXJkIHBhZ2UgY29udHJpYnV0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBjb250cmlidXRpb24KLQkgKiAgICAgICAgICAgIHRoZSBuZXcgd2l6YXJkIHBhZ2UgY29udHJpYnV0aW9uCi0JICovCi0JcHVibGljIHZvaWQgYWRkTmV3V2l6YXJkUGFnZUNvbnRyaWJ1dGlvbigKLQkJCUlOZXdXaXphcmRQYWdlQ29udHJpYnV0aW9uIGNvbnRyaWJ1dGlvbik7Ci0KLQkvKioKLQkgKiBHZXRzIGFuIGFycmF5IG9mIG5ldyB3aXphcmQgcGFnZXMgdG8gYmUgYWRkZWQgdG8gYSBiYXNlIHdpemFyZC4KLQkgKiAKLQkgKiBAcmV0dXJuIGFuIGNvbGxlY3Rpb24gb2YgPGNvZGU+TmV3V2l6YXJkUGFnZUV4ZXRuc2lvbjwvY29kZT4gb2JqZWN0cyBvcgotCSAqICAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgTGlzdDxJTmV3V2l6YXJkUGFnZUNvbnRyaWJ1dGlvbj4gZ2V0TmV3V2l6YXJkUGFnZUNvbnRyaWJ1dGlvbnMoKTsKLQotCS8qKgotCSAqIEFsbG93cyBhIHdpemFyZCBleHRlbmRlciB0byBjb250cm9sIHRoZSBmbG93IG9mIHRoZSB3aXphcmQgcGFnZXMuCi0JICogCi0JICogQHBhcmFtIHBhZ2UKLQkgKiAgICAgICAgICAgIHRoZSBjdXJyZW50IHdpemFyZCBwYWdlCi0JICogQHJldHVybiB0aGUgbmV4dCB3aXphcmQgcGFnZQotCSAqLwotCXB1YmxpYyBJV2l6YXJkUGFnZSBnZXROZXh0UGFnZShJV2l6YXJkUGFnZSBwYWdlKTsKLQotCS8qKgotCSAqIEFsbG93cyBhIHdpemFyZCBleHRlbmRlciB0byBkZWNpZGUgd2hldGhlciB0aGUgd2l6YXJkIGNvdWxkIGJlIGZpbmlzaGVkCi0JICogd2l0aG91dCBmdXJ0aGVyIHVzZXIgaW50ZXJhY3Rpb24uCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgd2l6YXJkIGNvdWxkIGJlIGZpbmlzaGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2FuRmluaXNoKCk7Ci0KLQkvKioKLQkgKiBBbGxvd3MgYSB3aXphcmQgZXh0ZW5kZXIgdG8gcGVyZm9ybSB0aGUgZmluaXNoIG9wZXJhdGlvbi4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBmaW5pc2ggb3BlcmF0aW9uIGlzIGV4ZWN1dGVkCi0JICogICAgICAgICBzdWNjZXNzZnVsbHkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBkb0ZpbmlzaCgpOwotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkvc3JjL29yZy9lY2xpcHNlL2VwZi91aS93aXphcmRzL05ld1dpemFyZFBhZ2VDb250cmlidXRpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VpL3dpemFyZHMvTmV3V2l6YXJkUGFnZUNvbnRyaWJ1dGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMDdiNTkzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VpL3dpemFyZHMvTmV3V2l6YXJkUGFnZUNvbnRyaWJ1dGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVpLndpemFyZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZFBhZ2U7Ci0KLS8qKgotICogVGhlIGRlZmF1bHQgbmV3IHdpemFyZCBwYWdlIGNvbnRyaWJ1dGlvbiBpbXBsZW1lbnRhdGlvbi4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4yCi0gKi8KLXB1YmxpYyBjbGFzcyBOZXdXaXphcmRQYWdlQ29udHJpYnV0aW9uIGltcGxlbWVudHMgSU5ld1dpemFyZFBhZ2VDb250cmlidXRpb24gewotCi0JcHJpdmF0ZSBJV2l6YXJkUGFnZSBwYWdlOwotCi0JcHJpdmF0ZSBTdHJpbmcgdGFyZ2V0OwotCi0JcHJpdmF0ZSBib29sZWFuIGluc2VydEFmdGVyID0gdHJ1ZTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICogCi0JICogQHBhcmFtIHBhZ2UKLQkgKiAgICAgICAgICAgIHRoZSBuZXcgd2l6YXJkIHBhZ2UKLQkgKiBAcGFyYW0gdGFyZ2V0Ci0JICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgYmFzZSB3aXphcmQgcGFnZSB0aGF0IGlzIHVzZWQgYXMgYSByZWZlcmVuY2UKLQkgKiAgICAgICAgICAgIGZvciBpbnNlcmluZyB0aGUgbmV3IHdpemFyZCBwYWdlCi0JICogQHBhcmFtIGluc2VydEFmdGVyCi0JICogICAgICAgICAgICBpZiA8Y29kZT50cnVlPC9jb2RlPiwgaW5zZXJ0IHRoZSBuZXcgd2l6YXJkIHBhZ2UgYWZ0ZXIgdGhlCi0JICogICAgICAgICAgICB0YXJnZXQgd2l6YXJkIHBhZ2U7IGlmIDxjb2RlPmZhbHNlPC9jb2RlPiwgaW5zZXJ0IHRoZSBuZXcKLQkgKiAgICAgICAgICAgIHdpemFyZCBwYWdlIGJlZm9yZSB0aGUgdGFyZ2V0IHdpemFyZCBwYWdlCi0JICovCi0JcHVibGljIE5ld1dpemFyZFBhZ2VDb250cmlidXRpb24oSVdpemFyZFBhZ2UgcGFnZSwgU3RyaW5nIHRhcmdldCwKLQkJCWJvb2xlYW4gaW5zZXJ0QWZ0ZXIpIHsKLQkJdGhpcy5wYWdlID0gcGFnZTsKLQkJdGhpcy50YXJnZXQgPSB0YXJnZXQ7Ci0JCXRoaXMuaW5zZXJ0QWZ0ZXIgPSBpbnNlcnRBZnRlcjsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSB3aXphcmQgcGFnZS4KLQkgKi8KLQlwdWJsaWMgSVdpemFyZFBhZ2UgZ2V0V2l6YXJkUGFnZSgpIHsKLQkJcmV0dXJuIHBhZ2U7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgbmFtZSBvZiB0aGUgYmFzZSB3aXphcmQgcGFnZSB0aGF0IGlzIHVzZWQgYXMgYSByZWZlcmVuY2UgZm9yCi0JICogaW5zZXJ0aW5nIHRoZSBuZXcgd2l6YXJkIHBhZ2UKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRhcmdldFdpemFyZFBhZ2UoKSB7Ci0JCXJldHVybiB0YXJnZXQ7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgaW5zZXJ0aW9uIG9wdGlvbiBmb3IgdGhlIG5ldyB3aXphcmQgcGFnZS4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBuZXcgd2l6YXJkIHBhZ2Ugc2hvdWxkIGJlIGluc2VydGVkCi0JICogICAgICAgICBhZnRlciB0aGUgdGFyZ2V0IHdpemFyZCBwYWdlOyA8Y29kZT5mYWxzZTwvY29kZT4gaWYgaXQgc2hvdWxkCi0JICogICAgICAgICBiZSBpbnNlcnRlZCBiZWZvcmUgdGhlIHRhcmdldCB3aXphcmQgcGFnZQotCSAqLwotCXB1YmxpYyBib29sZWFuIGdldEluc2VydEFmdGVyKCkgewotCQlyZXR1cm4gaW5zZXJ0QWZ0ZXI7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkvc3JjL29yZy9lY2xpcHNlL2VwZi91aS93aXphcmRzL1JlcGxhY2VXaXphcmRQYWdlQ29udHJpYnV0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkvc3JjL29yZy9lY2xpcHNlL2VwZi91aS93aXphcmRzL1JlcGxhY2VXaXphcmRQYWdlQ29udHJpYnV0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1OWIxZDMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvdWkvd2l6YXJkcy9SZXBsYWNlV2l6YXJkUGFnZUNvbnRyaWJ1dGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVpLndpemFyZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZFBhZ2U7Ci0KLS8qKgotICogVGhlIGRlZmF1bHQgcmVwbGFjZW1lbnQgd2l6YXJkIHBhZ2UgY29udHJpYnV0aW9uIGltcGxlbWVudGF0aW9uLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjIKLSAqLwotcHVibGljIGNsYXNzIFJlcGxhY2VXaXphcmRQYWdlQ29udHJpYnV0aW9uIGltcGxlbWVudHMKLQkJSVJlcGxhY2VXaXphcmRQYWdlQ29udHJpYnV0aW9uIHsKLQotCXByaXZhdGUgSVdpemFyZFBhZ2UgcGFnZTsKLQotCXByaXZhdGUgU3RyaW5nIHRhcmdldDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICogCi0JICogQHBhcmFtIHBhZ2UKLQkgKiAgICAgICAgICAgIHRoZSB3aXphcmQgcGFnZSB0aGF0IHJlcGxhY2VzIGEgc3BlY2lmaWMgd2l6YXJkIHBhZ2UgaW4gYQotCSAqICAgICAgICAgICAgd2l6YXJkCi0JICogQHBhcmFtIHRhcmdldAotCSAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIGJhc2Ugd2l6YXJkIHBhZ2UgdGhhdCBpcyBzaG91bGQgYmUgcmVwbGFjZWQKLQkgKi8KLQlwdWJsaWMgUmVwbGFjZVdpemFyZFBhZ2VDb250cmlidXRpb24oSVdpemFyZFBhZ2UgcGFnZSwgU3RyaW5nIHRhcmdldCkgewotCQl0aGlzLnBhZ2UgPSBwYWdlOwotCQl0aGlzLnRhcmdldCA9IHRhcmdldDsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSB3aXphcmQgcGFnZSB0aGF0IHJlcGxhY2VzIGEgc3BlY2lmaWMgd2l6YXJkIHBhZ2UgaW4gYSB3aXphcmQuCi0JICogCi0JICogQHJldHVybiBhIDxjb2RlPklXaXphcmRQYWdlPC9jb2RlPiBvYmplY3QKLQkgKi8KLQlwdWJsaWMgSVdpemFyZFBhZ2UgZ2V0V2l6YXJkUGFnZSgpIHsKLQkJcmV0dXJuIHBhZ2U7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgbmFtZSBvZiB0aGUgYmFzZSB3aXphcmQgcGFnZSB0aGF0IGlzIHNob3VsZCBiZSByZXBsYWNlZC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBuYW1lIG9mIHRoZSByZWZlcmVuY2VkIGJhc2Ugd2l6YXJkIHBhZ2UKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRhcmdldFdpemFyZFBhZ2UoKSB7Ci0JCXJldHVybiB0YXJnZXQ7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkvc3JjL29yZy9lY2xpcHNlL2VwZi91aS93aXphcmRzL1dpemFyZENhdGVnb3JpZXMuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VpL3dpemFyZHMvV2l6YXJkQ2F0ZWdvcmllcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZDYwYWY4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VpL3dpemFyZHMvV2l6YXJkQ2F0ZWdvcmllcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVpLndpemFyZHM7Ci0KLS8qKgotICogVGhlIEVQRiB3aXphcmQgY2F0ZWdvcmllcy4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4yCi0gKi8KLXB1YmxpYyBjbGFzcyBXaXphcmRDYXRlZ29yaWVzIHsKLQotCS8qKgotCSAqIFRoZSBOZXcgV2l6YXJkcyBDYXRlZ29yeS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBORVdfV0laQVJEU19DQVRFR09SWSA9ICJvcmcuZWNsaXBzZS5lcGYudWkubmV3V2l6YXJkcy5jYXRlZ29yeSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSBFeHBvcnQgV2l6YXJkcyBDYXRlZ29yeS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFBPUlRfV0laQVJEU19DQVRFR09SWSA9ICJvcmcuZWNsaXBzZS5lcGYudWkuZXhwb3J0V2l6YXJkcy5jYXRlZ29yeSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSBJbXBvcnQgV2l6YXJkcyBDYXRlZ29yeS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTVBPUlRfV0laQVJEU19DQVRFR09SWSA9ICJvcmcuZWNsaXBzZS5lcGYudWkuaW1wb3J0V2l6YXJkcy5jYXRlZ29yeSI7IC8vJE5PTi1OTFMtMSQKLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvdWkvd2l6YXJkcy9XaXphcmRFeHRlbmRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvdWkvd2l6YXJkcy9XaXphcmRFeHRlbmRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOWM1MDg0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VpL3dpemFyZHMvV2l6YXJkRXh0ZW5kZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudWkud2l6YXJkczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkOwotCi0vKioKLSAqIFRoZSBkZWZhdWx0IHdpemFyZCBleHRlbmRlciBpbXBsZW1lbnRhdGlvbi4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4yCi0gKi8KLXB1YmxpYyBjbGFzcyBXaXphcmRFeHRlbmRlciBpbXBsZW1lbnRzIElXaXphcmRFeHRlbmRlciB7Ci0KLQlwcm90ZWN0ZWQgV2l6YXJkIHdpemFyZDsKLQotCXByb3RlY3RlZCBNYXA8U3RyaW5nLCBJV2l6YXJkUGFnZT4gcmVwbGFjZVdpemFyZFBhZ2VzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBJV2l6YXJkUGFnZT4oKTsKLQotCXByb3RlY3RlZCBMaXN0PElOZXdXaXphcmRQYWdlQ29udHJpYnV0aW9uPiBuZXdXaXphcmRQYWdlQ29udHJpYml0aW9ucyA9IG5ldyBBcnJheUxpc3Q8SU5ld1dpemFyZFBhZ2VDb250cmlidXRpb24+KCk7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBXaXphcmRFeHRlbmRlcigpIHsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51aS53aXphcmRzLklXaXphcmRFeHRlbmRlciNpbml0KFdpemFyZCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KFdpemFyZCB3aXphcmQpIHsKLQkJdGhpcy53aXphcmQgPSB3aXphcmQ7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudWkud2l6YXJkcy5JV2l6YXJkRXh0ZW5kZXIjaW5pdChXaXphcmQpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdFdpemFyZFBhZ2VzKExpc3Q8SVdpemFyZFBhZ2U+IHdpemFyZFBhZ2VzKSB7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudWkud2l6YXJkcy5JV2l6YXJkRXh0ZW5kZXIjYWRkUmVwbGFjZVdpemFyZFBhZ2VDb250cmlidXRpb24oSVJlcGxhY2VXaXphcmRQYWdlQ29udHJpYnV0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFJlcGxhY2VXaXphcmRQYWdlQ29udHJpYnV0aW9uKAotCQkJSVJlcGxhY2VXaXphcmRQYWdlQ29udHJpYnV0aW9uIGNvbnRyaWJ1dGlvbikgewotCQlyZXBsYWNlV2l6YXJkUGFnZXMucHV0KGNvbnRyaWJ1dGlvbi5nZXRUYXJnZXRXaXphcmRQYWdlKCksIGNvbnRyaWJ1dGlvbgotCQkJCS5nZXRXaXphcmRQYWdlKCkpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVpLndpemFyZHMuSVdpemFyZEV4dGVuZGVyI2dldFJlcGxhY2VXaXphcmRQYWdlKFN0cmluZykKLQkgKi8KLQlwdWJsaWMgSVdpemFyZFBhZ2UgZ2V0UmVwbGFjZVdpemFyZFBhZ2UoU3RyaW5nIHRhcmdldCkgewotCQlyZXR1cm4gKElXaXphcmRQYWdlKSByZXBsYWNlV2l6YXJkUGFnZXMuZ2V0KHRhcmdldCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudWkud2l6YXJkcy5JV2l6YXJkRXh0ZW5kZXIjYWRkTmV3V2l6YXJkUGFnZUNvbnRyaWJ1dGlvbihJTmV3V2l6YXJkUGFnZUNvbnRyaWJ1dGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGROZXdXaXphcmRQYWdlQ29udHJpYnV0aW9uKAotCQkJSU5ld1dpemFyZFBhZ2VDb250cmlidXRpb24gY29udHJpYnV0aW9uKSB7Ci0JCW5ld1dpemFyZFBhZ2VDb250cmliaXRpb25zLmFkZChjb250cmlidXRpb24pOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVpLndpemFyZHMuSVdpemFyZEV4dGVuZGVyI2dldE5ld1dpemFyZFBhZ2VDb250cmlidXRpb25zKCkKLQkgKi8KLQlwdWJsaWMgTGlzdDxJTmV3V2l6YXJkUGFnZUNvbnRyaWJ1dGlvbj4gZ2V0TmV3V2l6YXJkUGFnZUNvbnRyaWJ1dGlvbnMoKSB7Ci0JCXJldHVybiBuZXdXaXphcmRQYWdlQ29udHJpYml0aW9uczsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51aS53aXphcmRzLklXaXphcmRFeHRlbmRlciNnZXROZXh0UGFnZShJV2l6YXJkUGFnZSkKLQkgKi8KLQlwdWJsaWMgSVdpemFyZFBhZ2UgZ2V0TmV4dFBhZ2UoSVdpemFyZFBhZ2UgcGFnZSkgewotCQkvLyBMZXQgdGhlIGJhc2Ugd2l6YXJkIGRyaXZlcyB0aGUgcGFnZSBmbG93LgotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51aS53aXphcmRzLklXaXphcmRFeHRlbmRlciNjYW5GaW5pc2goKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGNhbkZpbmlzaCgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudWkud2l6YXJkcy5JV2l6YXJkRXh0ZW5kZXIjZG9GaW5pc2goKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGRvRmluaXNoKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUvLmNsYXNzcGF0aCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDY1YWMwNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLy5wcm9qZWN0IGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTg1OWE3Yy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlL01FVEEtSU5GL01BTklGRVNULk1GIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTQ1NzY4ZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmU7c2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS41LjAucXVhbGlmaWVyCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcywKLSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUsCi0gb3JnLmVjbGlwc2UuZW1mLmVjb3JlO3Zpc2liaWxpdHk6PXJlZXhwb3J0LAotIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5zZG87dmlzaWJpbGl0eTo9cmVleHBvcnQKLUVjbGlwc2UtTGF6eVN0YXJ0OiB0cnVlCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZSwKLSBvcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLmltcGwsCi0gb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS51dGlsCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUvYnVpbGQucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzJiYWZkNS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLXNvdXJjZS4uID0gc3JjLwotb3V0cHV0Li4gPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSAuLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlL3BsdWdpbi5wcm9wZXJ0aWVzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWQ0ZjRjMS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLQotIyBQbHVnLWluCi1wbHVnaW5OYW1lPUVQRiBVTUEgRWNvcmUgRXh0ZW5zaW9uCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKLQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS9wbHVnaW4ueG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NzE0MDQ0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjIiPz4KLTxwbHVnaW4+Ci0gICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJmZWF0dXJlRGVsZWdhdGUiIG5hbWU9IkZlYXR1cmUgRGVsZWdhdGUiIHNjaGVtYT0ic2NoZW1hL2ZlYXR1cmVEZWxlZ2F0ZS5leHNkIi8+Ci0gICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJtZXRob2RFbGVtZW50SUFkYXB0YWJsZSIgbmFtZT0iTWV0aG9kIEVsZW1lbnQgSUFkYXB0YWJsZSIgc2NoZW1hPSJzY2hlbWEvbWV0aG9kRWxlbWVudElBZGFwdGFibGUuZXhzZCIvPgotCi08L3BsdWdpbj4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUvc2NoZW1hL2ZlYXR1cmVEZWxlZ2F0ZS5leHNkIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS9zY2hlbWEvZmVhdHVyZURlbGVnYXRlLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2MGIyMTUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS9zY2hlbWEvZmVhdHVyZURlbGVnYXRlLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMDUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZSI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZSIgaWQ9ImZlYXR1cmVEZWxlZ2F0ZSIgbmFtZT0iRmVhdHVyZSBEZWxlZ2F0ZSIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgZGVzY3JpcHRpb24gb2YgdGhpcyBleHRlbnNpb24gcG9pbnQuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGNob2ljZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iZGVsZWdhdGUiLz4KLSAgICAgICAgIDwvY2hvaWNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImRlbGVnYXRlIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJqYXZhIiBiYXNlZE9uPSI6b3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS51dGlsLklGZWF0dXJlRGVsZWdhdGUiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIHRoZSBmaXJzdCByZWxlYXNlIGluIHdoaWNoIHRoaXMgZXh0ZW5zaW9uIHBvaW50IGFwcGVhcnMuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgZXh0ZW5zaW9uIHBvaW50IHVzYWdlIGV4YW1wbGUgaGVyZS5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIEFQSSBpbmZvcm1hdGlvbiBoZXJlLl0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIGluZm9ybWF0aW9uIGFib3V0IHN1cHBsaWVkIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgZXh0ZW5zaW9uIHBvaW50Ll0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUvc2NoZW1hL21ldGhvZEVsZW1lbnRJQWRhcHRhYmxlLmV4c2QgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlL3NjaGVtYS9tZXRob2RFbGVtZW50SUFkYXB0YWJsZS5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNWUzOGQxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUvc2NoZW1hL21ldGhvZEVsZW1lbnRJQWRhcHRhYmxlLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMDUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZSI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZSIgaWQ9Im1ldGhvZEVsZW1lbnRJQWRhcHRhYmxlIiBuYW1lPSJNZXRob2QgRWxlbWVudCBJQWRhcHRhYmxlIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFRoaXMgZXh0ZW5zaW9uIHBvaW50IGFsbG93cyBhbiBleHRlbnNpb24gdG8gcHJvdmlkZSBhZGFwdGVycyBmb3IgTWV0aG9kRWxlbWVudCAodmlhIHRoZSBJQWRhcHRhYmxlIGludGVyZmFjZSkuCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImFkYXB0ZXJGYWN0b3J5Ii8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImFkYXB0ZXJGYWN0b3J5Ij4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJqYXZhIiBiYXNlZE9uPSI6b3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGUiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIHRoZSBmaXJzdCByZWxlYXNlIGluIHdoaWNoIHRoaXMgZXh0ZW5zaW9uIHBvaW50IGFwcGVhcnMuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgZXh0ZW5zaW9uIHBvaW50IHVzYWdlIGV4YW1wbGUgaGVyZS5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIEFQSSBpbmZvcm1hdGlvbiBoZXJlLl0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIGluZm9ybWF0aW9uIGFib3V0IHN1cHBsaWVkIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgZXh0ZW5zaW9uIHBvaW50Ll0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvZWNvcmUvSU1vZGVsT2JqZWN0LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2Vjb3JlL0lNb2RlbE9iamVjdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMGM4MmU1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvZWNvcmUvSU1vZGVsT2JqZWN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5zZG8uRURhdGFPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS51dGlsLk9wcG9zaXRlRmVhdHVyZTsKLQotLyoqCi0gKiBBbiBpbnRlcmZhY2Ugc3VwcG9ydGVkIGJ5IGFsbCBVTUEgbW9kZWwgb2JqZWN0cy4KLSAqIDxwPgotICogVGhpcyBpbnRlcmZhY2UgcHJvdmlkZXMgZHluYW1pYyBiaWRpcmVjdGlvbmFsIHJlbGF0aW9uc2hpcHMgc3VwcG9ydCBiZXR3ZWVuCi0gKiBtb2RlbCBvYmplY3RzIHRocm91Z2ggdGhlIHVzZSBvZiBvcHBvc2l0ZSBmZWF0dXJlcy4gSXQgYWxzbyBhbGxvd3MgdGhlCi0gKiBkZWZhdWx0IHZhbHVlIG9mIGEgZmVhdHVyZSwgYXMgZGVmaW5lZCBpbiBhIG1ldGFsIG1vZGVsLCB0byBiZSBvdmVyd3JpdHRlbi4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJTW9kZWxPYmplY3QgZXh0ZW5kcyBFRGF0YU9iamVjdCB7Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBkZWZhdWx0IHZhbHVlIG9mIGEgZmVhdHVyZS4KLQkgKiA8cD4KLQkgKiBUaGlzIG1ldGhvZCBwcm92aWRlcyBhIHdheSB0byBxdWVyeSB0aGUgb3ZlcnJpZGVuIGRlZmF1bHQgdmFsdWUgZGVmaW5lZCBpbiB0aGUKLQkgKiBtZXRhLW1vZGVsIGZvciBhIFVNQSBjbGFzcy4KLQkgKiAKLQkgKiBAcGFyYW0gZmVhdHVyZQotCSAqICAgICAgICAgICAgYSBmZWF0dXJlCi0JICogQHJldHVybiB0aGUgZGVmYXVsdCB2YWx1ZSBmb3IgdGhlIHNwZWNpZmllZCBmZWF0dXJlCi0JICovCi0JcHVibGljIE9iamVjdCBnZXREZWZhdWx0VmFsdWUoRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUpOwotCi0JLyoqCi0JICogR2V0cyB0aGUgdmFsdWUgb2YgYW4gb3Bwb3NpdGUgZmVhdHVyZS4KLQkgKiAKLQkgKiBAcGFyYW0gZmVhdHVyZQotCSAqICAgICAgICAgICAgYW4gb3Bwb3NpdGUgZmVhdHVyZQotCSAqIEByZXR1cm4gdGhlIHZhbHVlIGZvciB0aGUgc3BlY2lmaWVkIG9wcG9zaXRlIGZlYXR1cmUKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldE9wcG9zaXRlRmVhdHVyZVZhbHVlKE9wcG9zaXRlRmVhdHVyZSBmZWF0dXJlKTsKLQotCS8qKgotCSAqIEdldHMgYWxsIHRoZSBvcHBvc2l0ZSBmZWF0dXJlcyBhc3NvY2lhdGVkIHdpdGggdGhpcyBtb2RlbCBvYmplY3QuCi0JICogCi0JICogQHJldHVybiBhIGNvbGxlY3Rpb24gb2Ygb3Bwb3NpdGUgZmVhdHVyZXMKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRPcHBvc2l0ZUZlYXR1cmVzKCk7Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvZWNvcmUvSVByb3h5UmVzb2x1dGlvbkxpc3RlbmVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2Vjb3JlL0lQcm94eVJlc29sdXRpb25MaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMGIwN2Y4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvZWNvcmUvSVByb3h5UmVzb2x1dGlvbkxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlOwotCi0vKioKLSAqIFRoZSBpbnRlcmZhY2UgZm9yIGEgcHJveHkgcmVzb2x1dGlvbiBsaXN0ZW5lciBhdHRhY2hlZCB0byBhIFVNQSByZXNvdXJjZSBzZXQuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVByb3h5UmVzb2x1dGlvbkxpc3RlbmVyIHsKLQotCS8qKgotCSAqIFJlY2VpdmVzIG5vdGlmaWNhdGlvbiBvZiBhbiBleGNlcHRpb24gdGhhdCBoYXMgb2NjdXJyZWQgd2hpbGUgcmVzb2x2aW5nIGEKLQkgKiBwcm94eSBvYmplY3QuCi0JICogCi0JICogQHBhcmFtIGUKLQkgKiAgICAgICAgICAgIHRoZSBleGNlcHRpb24gdGhhdCBoYXMgb2NjdXJyZWQKLQkgKi8KLQl2b2lkIG5vdGlmeUV4Y2VwdGlvbihFeGNlcHRpb24gZSk7Ci0KLQkvKioKLQkgKiBSZWNlaXZlcyBub3RpZmljYXRpb24gdGhhdCBhIHByb3h5IGhhcyBiZWVuIHJlc29sdmVkIHN1Y2Nlc3NmdWxseS4KLQkgKiAKLQkgKiBAcGFyYW0gcHJveHkKLQkgKiAgICAgICAgICAgIGEgcHJveHkgb2JqZWN0Ci0JICogQHBhcmFtIHJlc29sdmVkCi0JICogICAgICAgICAgICB0aGUgcmVzb2x2ZWQgb2JqZWN0Ci0JICovCi0Jdm9pZCBwcm94eVJlc29sdmVkKE9iamVjdCBwcm94eSwgT2JqZWN0IHJlc29sdmVkKTsKLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9lY29yZS9JVW1hUmVzb3VyY2VTZXQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvZWNvcmUvSVVtYVJlc291cmNlU2V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3MDc1YTMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9lY29yZS9JVW1hUmVzb3VyY2VTZXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKLQotLyoqCi0gKiBUaGUgaW50ZXJmYWNlIGZvciBhIFVNQSByZXNvdXJjZSBzZXQuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVVtYVJlc291cmNlU2V0IGV4dGVuZHMgUmVzb3VyY2VTZXQgewotCi0JLyoqCi0JICogR2V0cyB0aGUgbW9kZWwgb2JqZWN0IHJlc29sdmVkIGJ5IGEgVVJJLgotCSAqIAotCSAqIEBwYXJhbSByZXNvbHZlcgotCSAqICAgICAgICAgICAgdGhlIHByb3h5IHJlc29sdmVyCi0JICogQHBhcmFtIHVyaQotCSAqICAgICAgICAgICAgdGhlIFVSSSB1c2VkIHRvIHJlc29sdmUgdGhlIHByb3h5Ci0JICogQHBhcmFtIGxvYWRPbkRlbWFuZAotCSAqICAgICAgICAgICAgaWYgPGNvZGU+dHJ1ZTwvY29kZT4sIGNyZWF0ZSBhbmQgbG9hZCB0aGUgcmVzb3VyY2UgaWYgaXQKLQkgKiAgICAgICAgICAgIGRvZXMgbm90IGV4aXN0cwotCSAqIEByZXR1cm4gdGhlIG1vZGVsIG9iamVjdCByZXNvbHZlZCBieSB0aGUgVVJJCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQjZ2V0RU9iamVjdChFT2JqZWN0LCBVUkksIGJvb2xlYW4pCi0JICovCi0JRU9iamVjdCBnZXRFT2JqZWN0KEVPYmplY3QgcmVzb2x2ZXIsIFVSSSB1cmksIGJvb2xlYW4gbG9hZE9uRGVtYW5kKTsKLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9lY29yZS9SZXNvbHZlRXhjZXB0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2Vjb3JlL1Jlc29sdmVFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2UwOWJlMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2Vjb3JlL1Jlc29sdmVFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExOCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuV3JhcHBlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotCi0vKioKLSAqIFNpZ25hbHMgdGhhdCBhbiBlcnJvciBoYXMgb2NjdXJyZWQgd2hpbGUgcmVzb2x2aW5nIGEgcHJveHkgb2JqZWN0LgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUmVzb2x2ZUV4Y2VwdGlvbiBleHRlbmRzIFdyYXBwZWRFeGNlcHRpb24gewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMzI1ODQxMjgxNTgxNDYzNjA4MUw7Ci0KLQlwcml2YXRlIEVPYmplY3QgcHJveHk7Ci0KLQlwcml2YXRlIEVPYmplY3QgcmVzb2x2ZXI7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqIAotCSAqIEBwYXJhbSBwcm94eQotCSAqICAgICAgICAgICAgYSBwcm94eSBvYmplY3QKLQkgKiBAcGFyYW0gbXNnCi0JICogICAgICAgICAgICBhbiBlcnJvciBtZXNzYWdlCi0JICogQHBhcmFtIHJlc29sdmVyCi0JICogICAgICAgICAgICB0aGUgcHJveHkgcmVzb2x2ZXIKLQkgKi8KLQlwdWJsaWMgUmVzb2x2ZUV4Y2VwdGlvbihFT2JqZWN0IHByb3h5LCBTdHJpbmcgbXNnLCBFT2JqZWN0IHJlc29sdmVyKSB7Ci0JCXN1cGVyKG1zZywgbnVsbCk7Ci0JCXRoaXMucHJveHkgPSBwcm94eTsKLQkJdGhpcy5yZXNvbHZlciA9IHJlc29sdmVyOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICogCi0JICogQHBhcmFtIHByb3h5Ci0JICogICAgICAgICAgICBhIHByb3h5IG9iamVjdAotCSAqIEBwYXJhbSBleGNlcHRpb24KLQkgKiAgICAgICAgICAgIHRoZSBleGNlcHRpb24gdGhhdCB3YXMgdGhyb3duCi0JICovCi0JcHVibGljIFJlc29sdmVFeGNlcHRpb24oRU9iamVjdCBwcm94eSwgRXhjZXB0aW9uIGV4Y2VwdGlvbiwgRU9iamVjdCByZXNvbHZlcikgewotCQlzdXBlcihleGNlcHRpb24pOwotCQl0aGlzLnByb3h5ID0gcHJveHk7Ci0JCXRoaXMucmVzb2x2ZXIgPSByZXNvbHZlcjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwcm94eSBvYmplY3QuCi0JICogCi0JICogQHJldHVybiB0aGUgcHJveHkgb2JqZWN0Ci0JICovCi0JcHVibGljIEVPYmplY3QgZ2V0UHJveHkoKSB7Ci0JCXJldHVybiBwcm94eTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwcm94eSByZXNvbHZlci4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBwcm94eSByZXNvbHZlcgotCSAqLwotCXB1YmxpYyBFT2JqZWN0IGdldFJlc29sdmVyKCkgewotCQlyZXR1cm4gcmVzb2x2ZXI7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I2VxdWFscyhqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBSZXNvbHZlRXhjZXB0aW9uKSB7Ci0JCQlSZXNvbHZlRXhjZXB0aW9uIHJlID0gKFJlc29sdmVFeGNlcHRpb24pIG9iajsKLQkJCWlmICgocmVzb2x2ZXIgPT0gcmUucmVzb2x2ZXIpIHx8IChyZXNvbHZlciA9PSBudWxsICYmIHJlLnJlc29sdmVyID09IG51bGwpKSB7Ci0JCQkJaWYgKHByb3h5ID09IHJlLnByb3h5KSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCQlpZiAocHJveHkgaW5zdGFuY2VvZiBJbnRlcm5hbEVPYmplY3QpIHsKLQkJCQkJVVJJIHVyaSA9ICgoSW50ZXJuYWxFT2JqZWN0KSBwcm94eSkuZVByb3h5VVJJKCk7Ci0JCQkJCWlmICh1cmkgIT0gbnVsbCAmJiByZS5wcm94eSBpbnN0YW5jZW9mIEludGVybmFsRU9iamVjdCkgewotCQkJCQkJcmV0dXJuIHVyaS5lcXVhbHMoKChJbnRlcm5hbEVPYmplY3QpIHJlLnByb3h5KQotCQkJCQkJCQkuZVByb3h5VVJJKCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBzdXBlci5lcXVhbHMob2JqKTsKLQl9Ci0JCi0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCNoYXNoQ29kZSgpCi0JICovCi0JcHVibGljIGludCBoYXNoQ29kZSgpIHsKLQkJaWYgKHByb3h5IGluc3RhbmNlb2YgSW50ZXJuYWxFT2JqZWN0KSB7Ci0JCQlpbnQgaGMgPSByZXNvbHZlciA9PSBudWxsID8gMCA6IHJlc29sdmVyLmhhc2hDb2RlKCk7Ci0JCQlVUkkgdXJpID0gKChJbnRlcm5hbEVPYmplY3QpIHByb3h5KS5lUHJveHlVUkkoKTsKLQkJCWlmICh1cmkgIT0gbnVsbCkgewotCQkJCXJldHVybiAoSW50ZWdlci50b1N0cmluZyhoYykgKyB1cmkpLmhhc2hDb2RlKCk7Ci0JCQl9Ci0JCQlyZXR1cm4gaGM7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmhhc2hDb2RlKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2Vjb3JlL2ltcGwvTXVsdGlSZXNvdXJjZUVPYmplY3QuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvZWNvcmUvaW1wbC9NdWx0aVJlc291cmNlRU9iamVjdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOGM5NjQ2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvZWNvcmUvaW1wbC9NdWx0aVJlc291cmNlRU9iamVjdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTE0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUuaW1wbDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLkNvbW1vblBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkJhc2ljRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2UuSW50ZXJuYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnNkby5pbXBsLkVEYXRhT2JqZWN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLklNb2RlbE9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLklQcm94eVJlc29sdXRpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLklVbWFSZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLlJlc29sdmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS51dGlsLkRlZmF1bHRWYWx1ZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS51dGlsLk9wcG9zaXRlRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLnV0aWwuT3Bwb3NpdGVGZWF0dXJlUmVzb2x2aW5nRUxpc3Q7Ci0KLS8qKgotICogVGhlIGJhc2UgY2xhc3MgZm9yIGFsbCBVTUEgbW9kZWwgb2JqZWN0cy4KLSAqIDxwPgotICogQnkgZGVmYXVsdCwgRU1GIHN0b3JlcyBtb2RlbCBvYmplY3RzIHJlbGF0ZWQgdmlhIGEgY29udGFpbm1lbnQgcmVsYXRpb25zaGlwCi0gKiBpbiBhIHNpbmdsZSBYTUkgZmlsZS4gVGhpcyBjbGFzcyBleHRlbmRzIHRoZSBkZWZhdWx0IEVNRiBwZXJzaXN0ZW5jZSBiZWhhdmlvcgotICogYnkgcHJvdmlkaW5nIGEgbWVjaGFuaXNtIGZvciB0aGUgY29udGFpbmluZyBhbmQgY29udGFpbmVkIG9iamVjdHMgdG8gYmUKLSAqIHN0b3JlZCBpbiBzZXBhcmF0ZSBYTUkgZmlsZXMuIENvbnRhaW5lZCBvYmplY3RzIGFyZSBsYXp5IGxvYWRlZCwgd2hlbgotICogcmVxdWlyZWQsIHNpbWlsYXIgdG8gdGhlIHByb3h5IG9iamVjdCBiZWhhdmlvciBvZiBFTUYncyBzdGFuZGFyZCByZXNvdXJjZQotICogaW1wbGVtZW50YXRpb24uCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBNdWx0aVJlc291cmNlRU9iamVjdCBleHRlbmRzIEVEYXRhT2JqZWN0SW1wbCBpbXBsZW1lbnRzCi0JCUlNb2RlbE9iamVjdCB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAzMjU4MTI2OTQ3MTUzMDk3MjczTDsKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHID0gZmFsc2U7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGVmYXVsdFZhbHVlTWFuYWdlciBkZWZhdWx0VmFsdWVNYW5hZ2VyID0gRGVmYXVsdFZhbHVlTWFuYWdlci5JTlNUQU5DRTsKLQkKLQkvKioKLQkgKiBTZXRzIHRoZSBkZWZhdWx0IHZhbHVlIGZvciBhIGZlYXR1cmUuCi0JICogPHA+Ci0JICogTm90ZTogVGhpcyBtZXRob2QgaXMgZGVzaWduZWQgZm9yIG1pZ3JhdGlvbiB1c2Ugb25seS4gRG8gbm90IGNhbGwgdGhpcwotCSAqIG1ldGhvZCB0byBvdmVycmlkZSB0aGUgZGVmYXVsdCB2YWx1ZSBvZiBhIGZlYXR1cmUgc2luY2UgaXQgd2lsbCBzbG93IGRvd24KLQkgKiB0aGUgbG9hZGluZyBvZiBhIG1ldGhvZCBsaWJyYXJ5LgotCSAqIAotCSAqIEBwYXJhbSBmZWF0dXJlCi0JICogICAgICAgICAgICBhIGZlYXR1cmUKLQkgKiBAcGFyYW0gZGVmYXVsdFZhbHVlCi0JICogICAgICAgICAgICB0aGUgZGVmYXVsdCB2YWx1ZSBmb3IgdGhlIGZlYXR1cmUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIHZvaWQgc2V0RGVmYXVsdFZhbHVlKEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLAotCQkJT2JqZWN0IGRlZmF1bHRWYWx1ZSkgewkJCi0JCXNldERlZmF1bHRWYWx1ZShmZWF0dXJlLmdldEVDb250YWluaW5nQ2xhc3MoKSwgZmVhdHVyZSwgZGVmYXVsdFZhbHVlKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBzeW5jaHJvbml6ZWQgdm9pZCBzZXREZWZhdWx0VmFsdWUoRUNsYXNzIHR5cGUsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBPYmplY3QgZGVmYXVsdFZhbHVlKSB7Ci0JCWRlZmF1bHRWYWx1ZU1hbmFnZXIuc2V0RGVmYXVsdFZhbHVlKHR5cGUsIGZlYXR1cmUsIGRlZmF1bHRWYWx1ZSk7Ci0JfQotCQotCS8qKgotCSAqIFJlbW92ZXMgdGhlIGRlZmF1bHQgdmFsdWUgZm9yIGEgZmVhdHVyZS4KLQkgKiA8cD4KLQkgKiBOb3RlOiBUaGlzIG1ldGhvZCBpcyBkZXNpZ25lZCBmb3IgbWlncmF0aW9uIHVzZSBvbmx5LiBEbyBub3QgY2FsbCB0aGlzCi0JICogbWV0aG9kIHRvIG92ZXJyaWRlIHRoZSBkZWZhdWx0IHZhbHVlIG9mIGEgZmVhdHVyZSBzaW5jZSBpdCB3aWxsIHNsb3cgZG93bgotCSAqIHRoZSBsb2FkaW5nIG9mIGEgbWV0aG9kIGxpYnJhcnkuCi0JICogCi0JICogQHBhcmFtIGZlYXR1cmUKLQkgKiAgICAgICAgICAgIGEgZmVhdHVyZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgdm9pZCByZW1vdmVEZWZhdWx0VmFsdWUoRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUpIHsKLQkJZGVmYXVsdFZhbHVlTWFuYWdlci5yZW1vdmVEZWZhdWx0VmFsdWUoZmVhdHVyZSk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgdm9pZCByZW1vdmVEZWZhdWx0VmFsdWUoRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIEVDbGFzcyB0eXBlKSB7Ci0JCWRlZmF1bHRWYWx1ZU1hbmFnZXIucmVtb3ZlRGVmYXVsdFZhbHVlKGZlYXR1cmUsIHR5cGUpOwotCX0KLQkKLQkvKioKLQkgKiBBIG1hcCBvZiBlbnRyaWVzIG9mIE9wcG9zaXRlRmVhdHVyZSAvIE9wcG9zaXRlRmVhdHVyZSdzIHZhbHVlCi0JICovCi0JcHJpdmF0ZSBNYXAgb3Bwb3NpdGVGZWF0dXJlTWFwOwotCi0JcHJpdmF0ZSBib29sZWFuIGhhc09wcG9zaXRlRmVhdHVyZSA9IHRydWU7Ci0KLQlwcml2YXRlIEJvb2xlYW4gbm90aWZ5T3Bwb3NpdGUgPSBudWxsOwotCi0JcHJpdmF0ZSBib29sZWFuIHZhbGlkID0gdHJ1ZTsKLQotCS8qKgotCSAqIENoZWNrcyB0aGUgdmFsaWRpdHkgb2YgdGhpcyBvYmplY3QuCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIG9iamVjdCBpcyB2YWxpZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzVmFsaWQoKSB7Ci0JCXJldHVybiB2YWxpZDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBvcHBvc2l0ZUFkZChPcHBvc2l0ZUZlYXR1cmUgb3Bwb3NpdGVGZWF0dXJlLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCUxpc3QgbGlzdCA9IChMaXN0KSBnZXRPcHBvc2l0ZUZlYXR1cmVNYXAoKS5nZXQob3Bwb3NpdGVGZWF0dXJlKTsKLQkJaWYgKGxpc3QgPT0gbnVsbCkgewotCQkJbGlzdCA9IG5ldyBPcHBvc2l0ZUZlYXR1cmVSZXNvbHZpbmdFTGlzdCh0aGlzLCBvcHBvc2l0ZUZlYXR1cmUpOwotCQkJZ2V0T3Bwb3NpdGVGZWF0dXJlTWFwKCkucHV0KG9wcG9zaXRlRmVhdHVyZSwgbGlzdCk7Ci0JCX0KLQkJaWYgKCFsaXN0LmNvbnRhaW5zKG9iamVjdCkpIHsKLQkJCWxpc3QuYWRkKG9iamVjdCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBvcHBvc2l0ZVJlbW92ZShPcHBvc2l0ZUZlYXR1cmUgb3Bwb3NpdGVGZWF0dXJlLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCUxpc3QgbGlzdCA9IChMaXN0KSBnZXRPcHBvc2l0ZUZlYXR1cmVNYXAoKS5nZXQob3Bwb3NpdGVGZWF0dXJlKTsKLQkJaWYgKGxpc3QgPT0gbnVsbCkgewotCQkJbGlzdCA9IG5ldyBPcHBvc2l0ZUZlYXR1cmVSZXNvbHZpbmdFTGlzdCh0aGlzLCBvcHBvc2l0ZUZlYXR1cmUpOwotCQkJZ2V0T3Bwb3NpdGVGZWF0dXJlTWFwKCkucHV0KG9wcG9zaXRlRmVhdHVyZSwgbGlzdCk7Ci0JCX0KLQkJbGlzdC5yZW1vdmUob2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXNvbHZlcyB0aGUgZ2l2ZW4gcHJveHkgb2JqZWN0LgotCSAqIAotCSAqIEBwYXJhbSBvYmplY3QKLQkgKiAgICAgICAgICAgIGEgcHJveHkgb2JqZWN0IHRvIHJlc29sdmUKLQkgKiBAcmV0dXJuIHRoZSByZXNvbHZlZCBvYmplY3QKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IHJlc29sdmUoT2JqZWN0IG9iamVjdCkgewotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgSW50ZXJuYWxFT2JqZWN0Ci0JCQkJJiYgKChJbnRlcm5hbEVPYmplY3QpIG9iamVjdCkuZUlzUHJveHkoKSkgewotCQkJcmV0dXJuIGVSZXNvbHZlUHJveHkoKEludGVybmFsRU9iamVjdCkgb2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gb2JqZWN0OwotCX0KLQotCXByaXZhdGUgdm9pZCByZXBsYWNlKEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBPYmplY3Qgb2xkVmFsdWUsCi0JCQlJbnRlcm5hbEVPYmplY3QgbmV3VmFsdWUpIHsKLQkJaWYgKG5ld1ZhbHVlICE9IG51bGwgJiYgIW5ld1ZhbHVlLmVJc1Byb3h5KCkgJiYgbmV3VmFsdWUgIT0gb2xkVmFsdWUpIHsKLQkJCWJvb2xlYW4gbm90aWZ5ID0gZURlbGl2ZXIoKTsKLQkJCXRyeSB7Ci0JCQkJZVNldERlbGl2ZXIoZmFsc2UpOwotCQkJCUVjb3JlVXRpbC5yZXBsYWNlKHRoaXMsIGZlYXR1cmUsIG9sZFZhbHVlLCBuZXdWYWx1ZSk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCWlmIChERUJVRykgewotCQkJCQlDb21tb25QbHVnaW4uSU5TVEFOQ0UubG9nKGUpOwotCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIk11bHRpUmVzb3VyY2VFT2JqZWN0LnJlcGxhY2UoKToiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIiAgb2JqZWN0OiAiICsgdGhpcyk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCIgIGZlYXR1cmU6ICIgKyBmZWF0dXJlKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIiAgcHJveHk6ICIgKyBvbGRWYWx1ZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCIgIHJlc29sdmVkOiAiICsgbmV3VmFsdWUpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfSBmaW5hbGx5IHsKLQkJCQllU2V0RGVsaXZlcihub3RpZnkpOwotCQkJfQotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQmFzaWNOb3RpZmllckltcGwjZU5vdGlmeShvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb24pCi0JICovCi0JcHVibGljIHZvaWQgZU5vdGlmeShOb3RpZmljYXRpb24gbXNnKSB7Ci0JCS8qCi0JCSAqIGlmKCFPcHBvc2l0ZUZlYXR1cmUuaXNEZWxpdmVyT25SZXNvbHZlKCkgJiYgbXNnLmdldEV2ZW50VHlwZSgpID09Ci0JCSAqIE5vdGlmaWNhdGlvbi5SRVNPTFZFKSB7IHJldHVybjsgfQotCQkgKi8KLQotCQlpZiAobXNnLmdldEV2ZW50VHlwZSgpID09IE5vdGlmaWNhdGlvbi5SRVNPTFZFKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCU9iamVjdCBmID0gbXNnLmdldEZlYXR1cmUoKTsKLQkJaWYgKGYgaW5zdGFuY2VvZiBFU3RydWN0dXJhbEZlYXR1cmUpIHsKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgZjsKLQkJCU9wcG9zaXRlRmVhdHVyZSBvcHBvc2l0ZUZlYXR1cmUgPSBPcHBvc2l0ZUZlYXR1cmUKLQkJCQkJLmdldE9wcG9zaXRlRmVhdHVyZShmZWF0dXJlKTsKLQkJCWlmIChvcHBvc2l0ZUZlYXR1cmUgIT0gbnVsbCkgewotCQkJCU11bHRpUmVzb3VyY2VFT2JqZWN0IG9sZE90aGVyRW5kOwotCQkJCU11bHRpUmVzb3VyY2VFT2JqZWN0IG90aGVyRW5kOwotCQkJCWlmIChvcHBvc2l0ZUZlYXR1cmUuaXNNYW55KCkpIHsKLQkJCQkJc3dpdGNoIChtc2cuZ2V0RXZlbnRUeXBlKCkpIHsKLQkJCQkJY2FzZSBOb3RpZmljYXRpb24uU0VUOgotCQkJCQkJb2xkT3RoZXJFbmQgPSAoTXVsdGlSZXNvdXJjZUVPYmplY3QpIG1zZy5nZXRPbGRWYWx1ZSgpOwotCQkJCQkJaWYgKG9wcG9zaXRlRmVhdHVyZS5yZXNvbHZlT3duZXIoKSkgewotCQkJCQkJCW9sZE90aGVyRW5kID0gKE11bHRpUmVzb3VyY2VFT2JqZWN0KSByZXNvbHZlKG9sZE90aGVyRW5kKTsKLQkJCQkJCX0KLQkJCQkJCWlmIChvbGRPdGhlckVuZCAhPSBudWxsKSB7Ci0JCQkJCQkJb2xkT3RoZXJFbmQub3Bwb3NpdGVSZW1vdmUob3Bwb3NpdGVGZWF0dXJlLCBtc2cKLQkJCQkJCQkJCS5nZXROb3RpZmllcigpKTsKLQkJCQkJCX0KLQkJCQkJY2FzZSBOb3RpZmljYXRpb24uQUREOgotCQkJCQkJb3RoZXJFbmQgPSAoTXVsdGlSZXNvdXJjZUVPYmplY3QpIG1zZy5nZXROZXdWYWx1ZSgpOwotCQkJCQkJaWYgKG9wcG9zaXRlRmVhdHVyZS5yZXNvbHZlT3duZXIoKSkgewotCQkJCQkJCW90aGVyRW5kID0gKE11bHRpUmVzb3VyY2VFT2JqZWN0KSByZXNvbHZlKG90aGVyRW5kKTsKLQkJCQkJCQlyZXBsYWNlKGZlYXR1cmUsIG1zZy5nZXROZXdWYWx1ZSgpLCBvdGhlckVuZCk7Ci0JCQkJCQl9Ci0JCQkJCQlpZiAob3RoZXJFbmQgIT0gbnVsbCkgewotCQkJCQkJCW90aGVyRW5kLm9wcG9zaXRlQWRkKG9wcG9zaXRlRmVhdHVyZSwgbXNnCi0JCQkJCQkJCQkuZ2V0Tm90aWZpZXIoKSk7Ci0JCQkJCQl9Ci0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSBOb3RpZmljYXRpb24uQUREX01BTlk6Ci0JCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSAoKENvbGxlY3Rpb24pIG1zZy5nZXROZXdWYWx1ZSgpKQotCQkJCQkJCQkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJT2JqZWN0IG9iaiA9IGl0ZXIubmV4dCgpOwotCQkJCQkJCW90aGVyRW5kID0gKE11bHRpUmVzb3VyY2VFT2JqZWN0KSBvYmo7Ci0JCQkJCQkJaWYgKG9wcG9zaXRlRmVhdHVyZS5yZXNvbHZlT3duZXIoKSkgewotCQkJCQkJCQlvdGhlckVuZCA9IChNdWx0aVJlc291cmNlRU9iamVjdCkgcmVzb2x2ZShvdGhlckVuZCk7Ci0JCQkJCQkJCXJlcGxhY2UoZmVhdHVyZSwgb2JqLCBvdGhlckVuZCk7Ci0JCQkJCQkJfQotCQkJCQkJCW90aGVyRW5kLm9wcG9zaXRlQWRkKG9wcG9zaXRlRmVhdHVyZSwgbXNnCi0JCQkJCQkJCQkuZ2V0Tm90aWZpZXIoKSk7Ci0JCQkJCQl9Ci0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSBOb3RpZmljYXRpb24uUkVNT1ZFOgotCQkJCQkJb3RoZXJFbmQgPSAoTXVsdGlSZXNvdXJjZUVPYmplY3QpIG1zZy5nZXRPbGRWYWx1ZSgpOwotCQkJCQkJaWYgKG9wcG9zaXRlRmVhdHVyZS5yZXNvbHZlT3duZXIoKSkgewotCQkJCQkJCW90aGVyRW5kID0gKE11bHRpUmVzb3VyY2VFT2JqZWN0KSByZXNvbHZlKG90aGVyRW5kKTsKLQkJCQkJCX0KLQkJCQkJCWlmIChvdGhlckVuZCAhPSBudWxsKQotCQkJCQkJCW90aGVyRW5kLm9wcG9zaXRlUmVtb3ZlKG9wcG9zaXRlRmVhdHVyZSwgbXNnCi0JCQkJCQkJCQkuZ2V0Tm90aWZpZXIoKSk7Ci0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSBOb3RpZmljYXRpb24uUkVNT1ZFX01BTlk6Ci0JCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSAoKENvbGxlY3Rpb24pIG1zZy5nZXRPbGRWYWx1ZSgpKQotCQkJCQkJCQkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJb3RoZXJFbmQgPSAoTXVsdGlSZXNvdXJjZUVPYmplY3QpIGl0ZXIubmV4dCgpOwotCQkJCQkJCWlmIChvcHBvc2l0ZUZlYXR1cmUucmVzb2x2ZU93bmVyKCkpIHsKLQkJCQkJCQkJb3RoZXJFbmQgPSAoTXVsdGlSZXNvdXJjZUVPYmplY3QpIHJlc29sdmUob3RoZXJFbmQpOwotCQkJCQkJCX0KLQkJCQkJCQlvdGhlckVuZC5vcHBvc2l0ZVJlbW92ZShvcHBvc2l0ZUZlYXR1cmUsIG1zZwotCQkJCQkJCQkJLmdldE5vdGlmaWVyKCkpOwotCQkJCQkJfQotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQlzd2l0Y2ggKG1zZy5nZXRFdmVudFR5cGUoKSkgewotCQkJCQljYXNlIE5vdGlmaWNhdGlvbi5BRERfTUFOWToKLQkJCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9ICgoQ29sbGVjdGlvbikgbXNnLmdldE5ld1ZhbHVlKCkpCi0JCQkJCQkJCS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJCQlPYmplY3Qgb2JqID0gaXRlci5uZXh0KCk7Ci0JCQkJCQkJb3RoZXJFbmQgPSAoTXVsdGlSZXNvdXJjZUVPYmplY3QpIG9iajsKLQkJCQkJCQlpZiAob3Bwb3NpdGVGZWF0dXJlLnJlc29sdmVPd25lcigpKSB7Ci0JCQkJCQkJCW90aGVyRW5kID0gKE11bHRpUmVzb3VyY2VFT2JqZWN0KSByZXNvbHZlKG90aGVyRW5kKTsKLQkJCQkJCQkJcmVwbGFjZShmZWF0dXJlLCBvYmosIG90aGVyRW5kKTsKLQkJCQkJCQl9Ci0JCQkJCQkJaWYgKG90aGVyRW5kICE9IG51bGwpIHsKLQkJCQkJCQkJRU9iamVjdCBvbGRWYWx1ZSA9IChFT2JqZWN0KSBvdGhlckVuZAotCQkJCQkJCQkJCS5nZXRPcHBvc2l0ZUZlYXR1cmVNYXAoKS5nZXQoCi0JCQkJCQkJCQkJCQlvcHBvc2l0ZUZlYXR1cmUpOwotCQkJCQkJCQlpZiAob2xkVmFsdWUgIT0gbnVsbCkgewotCQkJCQkJCQkJLy8gcmVtb3ZlIG90aGVyRW5kIGZyb20gdGFyZ2V0IGZlYXR1cmUgb2YKLQkJCQkJCQkJCS8vIG9sZFZhbHVlCi0JCQkJCQkJCQkoKENvbGxlY3Rpb24pIG9sZFZhbHVlCi0JCQkJCQkJCQkJCS5lR2V0KChFU3RydWN0dXJhbEZlYXR1cmUpIGYpKQotCQkJCQkJCQkJCQkucmVtb3ZlKG90aGVyRW5kKTsKLQkJCQkJCQkJfQotCQkJCQkJCQlvdGhlckVuZC5nZXRPcHBvc2l0ZUZlYXR1cmVNYXAoKS5wdXQoCi0JCQkJCQkJCQkJb3Bwb3NpdGVGZWF0dXJlLCBtc2cuZ2V0Tm90aWZpZXIoKSk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgTm90aWZpY2F0aW9uLlJFTU9WRV9NQU5ZOgotCQkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gKChDb2xsZWN0aW9uKSBtc2cuZ2V0T2xkVmFsdWUoKSkKLQkJCQkJCQkJLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQkJCW90aGVyRW5kID0gKE11bHRpUmVzb3VyY2VFT2JqZWN0KSBpdGVyLm5leHQoKTsKLQkJCQkJCQlpZiAob3Bwb3NpdGVGZWF0dXJlLnJlc29sdmVPd25lcigpKSB7Ci0JCQkJCQkJCW90aGVyRW5kID0gKE11bHRpUmVzb3VyY2VFT2JqZWN0KSByZXNvbHZlKG90aGVyRW5kKTsKLQkJCQkJCQl9Ci0JCQkJCQkJb3RoZXJFbmQuZ2V0T3Bwb3NpdGVGZWF0dXJlTWFwKCkucHV0KAotCQkJCQkJCQkJb3Bwb3NpdGVGZWF0dXJlLCBudWxsKTsKLQkJCQkJCX0KLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIE5vdGlmaWNhdGlvbi5BREQ6Ci0JCQkJCQlvdGhlckVuZCA9IChNdWx0aVJlc291cmNlRU9iamVjdCkgbXNnLmdldE5ld1ZhbHVlKCk7Ci0JCQkJCQlpZiAob3Bwb3NpdGVGZWF0dXJlLnJlc29sdmVPd25lcigpKSB7Ci0JCQkJCQkJb3RoZXJFbmQgPSAoTXVsdGlSZXNvdXJjZUVPYmplY3QpIHJlc29sdmUob3RoZXJFbmQpOwotCQkJCQkJCXJlcGxhY2UoZmVhdHVyZSwgbXNnLmdldE5ld1ZhbHVlKCksIG90aGVyRW5kKTsKLQkJCQkJCX0KLQkJCQkJCWlmIChvdGhlckVuZCAhPSBudWxsKSB7Ci0JCQkJCQkJRU9iamVjdCBvbGRWYWx1ZSA9IChFT2JqZWN0KSBvdGhlckVuZAotCQkJCQkJCQkJLmdldE9wcG9zaXRlRmVhdHVyZU1hcCgpLmdldCgKLQkJCQkJCQkJCQkJb3Bwb3NpdGVGZWF0dXJlKTsKLQkJCQkJCQlpZiAob2xkVmFsdWUgIT0gbnVsbCkgewotCQkJCQkJCQkvLyByZW1vdmUgb3RoZXJFbmQgZnJvbSB0YXJnZXQgZmVhdHVyZSBvZgotCQkJCQkJCQkvLyBvbGRWYWx1ZQotCQkJCQkJCQkoKENvbGxlY3Rpb24pIG9sZFZhbHVlCi0JCQkJCQkJCQkJLmVHZXQoKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgZikpCi0JCQkJCQkJCQkJLnJlbW92ZShvdGhlckVuZCk7Ci0JCQkJCQkJfQotCQkJCQkJCW90aGVyRW5kLmdldE9wcG9zaXRlRmVhdHVyZU1hcCgpLnB1dCgKLQkJCQkJCQkJCW9wcG9zaXRlRmVhdHVyZSwgbXNnLmdldE5vdGlmaWVyKCkpOwotCQkJCQkJfQotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgTm90aWZpY2F0aW9uLlNFVDoKLQkJCQkJCW90aGVyRW5kID0gKE11bHRpUmVzb3VyY2VFT2JqZWN0KSBtc2cuZ2V0TmV3VmFsdWUoKTsKLQkJCQkJCWlmIChvcHBvc2l0ZUZlYXR1cmUucmVzb2x2ZU93bmVyKCkpIHsKLQkJCQkJCQlvdGhlckVuZCA9IChNdWx0aVJlc291cmNlRU9iamVjdCkgcmVzb2x2ZShvdGhlckVuZCk7Ci0JCQkJCQkJcmVwbGFjZShmZWF0dXJlLCBtc2cuZ2V0TmV3VmFsdWUoKSwgb3RoZXJFbmQpOwotCQkJCQkJfQotCQkJCQkJaWYgKG90aGVyRW5kICE9IG51bGwpIHsKLQkJCQkJCQlFT2JqZWN0IG9sZFZhbHVlID0gKEVPYmplY3QpIG90aGVyRW5kCi0JCQkJCQkJCQkuZ2V0T3Bwb3NpdGVGZWF0dXJlTWFwKCkuZ2V0KAotCQkJCQkJCQkJCQlvcHBvc2l0ZUZlYXR1cmUpOwotCQkJCQkJCWlmIChvbGRWYWx1ZSAhPSBudWxsKSB7Ci0JCQkJCQkJCS8vIHNldCB0aGUgdGFyZ2V0IGZlYXR1cmUgb2Ygb2xkVmFsdWUgdG8gbnVsbAotCQkJCQkJCQlvbGRWYWx1ZS5lU2V0KChFU3RydWN0dXJhbEZlYXR1cmUpIGYsIG51bGwpOwotCQkJCQkJCX0KLQkJCQkJCQlvdGhlckVuZC5nZXRPcHBvc2l0ZUZlYXR1cmVNYXAoKS5wdXQoCi0JCQkJCQkJCQlvcHBvc2l0ZUZlYXR1cmUsIG1zZy5nZXROb3RpZmllcigpKTsKLQkJCQkJCX0KLQkJCQkJCWVsc2UgewotCQkJCQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSB0YXJnZXRGZWF0dXJlID0gKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgZjsKLQkJCQkJCQlpZighdGFyZ2V0RmVhdHVyZS5pc01hbnkoKSkgewotCQkJCQkJCQlvbGRPdGhlckVuZCA9IChNdWx0aVJlc291cmNlRU9iamVjdCkgbXNnLmdldE9sZFZhbHVlKCk7Ci0JCQkJCQkJCWlmKG9sZE90aGVyRW5kICE9IG51bGwpIHsKLQkJCQkJCQkJCW9sZE90aGVyRW5kLmdldE9wcG9zaXRlRmVhdHVyZU1hcCgpLnB1dChvcHBvc2l0ZUZlYXR1cmUsIG51bGwpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgTm90aWZpY2F0aW9uLlJFTU9WRToKLQkJCQkJCS8vIGNhc2UgTm90aWZpY2F0aW9uLlVOU0VUOgotCQkJCQkJb3RoZXJFbmQgPSAoTXVsdGlSZXNvdXJjZUVPYmplY3QpIG1zZy5nZXRPbGRWYWx1ZSgpOwotCQkJCQkJaWYgKG9wcG9zaXRlRmVhdHVyZS5yZXNvbHZlT3duZXIoKSkgewotCQkJCQkJCW90aGVyRW5kID0gKE11bHRpUmVzb3VyY2VFT2JqZWN0KSByZXNvbHZlKG90aGVyRW5kKTsKLQkJCQkJCX0KLQkJCQkJCWlmIChvdGhlckVuZCAhPSBudWxsKQotCQkJCQkJCW90aGVyRW5kLmdldE9wcG9zaXRlRmVhdHVyZU1hcCgpLnB1dCgKLQkJCQkJCQkJCW9wcG9zaXRlRmVhdHVyZSwgbnVsbCk7Ci0JCQkJCQlicmVhazsKLQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJc3VwZXIuZU5vdGlmeShtc2cpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5CYXNpY05vdGlmaWVySW1wbCNlTm90aWZpY2F0aW9uUmVxdWlyZWQoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGVOb3RpZmljYXRpb25SZXF1aXJlZCgpIHsKLQkJaWYgKCFlRGVsaXZlcigpKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCVJlc291cmNlIHJlc291cmNlID0gZVJlc291cmNlKCk7Ci0JCWlmIChyZXNvdXJjZSAhPSBudWxsICYmICFyZXNvdXJjZS5lRGVsaXZlcigpKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCWlmIChub3RpZnlPcHBvc2l0ZSA9PSBudWxsKSB7Ci0JCQlpZiAoT3Bwb3NpdGVGZWF0dXJlLmZlYXR1cmVPcHBvc2l0ZUZlYXR1cmVNYXAuaXNFbXB0eSgpKSB7Ci0JCQkJbm90aWZ5T3Bwb3NpdGUgPSBCb29sZWFuLkZBTFNFOwotCQkJfSBlbHNlIHsKLQkJCQlDb2xsZWN0aW9uIGZlYXR1cmVzID0gT3Bwb3NpdGVGZWF0dXJlLmZlYXR1cmVPcHBvc2l0ZUZlYXR1cmVNYXAKLQkJCQkJCS5rZXlTZXQoKTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBlQ2xhc3MoKS5nZXRFQWxsUmVmZXJlbmNlcygpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCWlmIChmZWF0dXJlcy5jb250YWlucyhpdGVyLm5leHQoKSkpIHsKLQkJCQkJCW5vdGlmeU9wcG9zaXRlID0gQm9vbGVhbi5UUlVFOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKG5vdGlmeU9wcG9zaXRlID09IG51bGwpIHsKLQkJCQkJbm90aWZ5T3Bwb3NpdGUgPSBCb29sZWFuLkZBTFNFOwotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAobm90aWZ5T3Bwb3NpdGUuYm9vbGVhblZhbHVlKCkpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJcmV0dXJuIHN1cGVyLmVOb3RpZmljYXRpb25SZXF1aXJlZCgpOwotCX0KLQotCS8qCi0JICogcHJpdmF0ZSB2b2lkIHJlbW92ZUNoaWxkUmVzb3VyY2VzKCkgeyBMaXN0IGNoaWxkcmVuID0gZUNvbnRlbnRzKCk7IGludAotCSAqIHNpemUgPSBjaGlsZHJlbi5zaXplKCk7IGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JICogTXVsdGlSZXNvdXJjZUVPYmplY3QgY2hpbGQgPSAoTXVsdGlSZXNvdXJjZUVPYmplY3QpIGNoaWxkcmVuLmdldChpKTsKLQkgKiBSZXNvdXJjZSByZXNvdXJjZSA9IGNoaWxkLmVSZXNvdXJjZSgpOyBpZiAocmVzb3VyY2UgIT0gbnVsbCAmJiByZXNvdXJjZSAhPQotCSAqIGVSZXNvdXJjZSgpKSB7IGNoaWxkLnJlbW92ZUNoaWxkUmVzb3VyY2VzKCk7IH0gKChJbnRlcm5hbEVMaXN0KQotCSAqIHJlc291cmNlLmdldENvbnRlbnRzKCkpLmJhc2ljUmVtb3ZlKHRoaXMsIG51bGwpOwotCSAqIGNoaWxkLmVQcm9wZXJ0aWVzKCkuc2V0RVJlc291cmNlKG51bGwpOyB9IH0KLQkqLwotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0I2VCYXNpY1NldENvbnRhaW5lcihvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0LAotCSAqICAgICAgaW50LCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbikKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUJhc2ljU2V0Q29udGFpbmVyKEludGVybmFsRU9iamVjdCBuZXdDb250YWluZXIsCi0JCQlpbnQgbmV3Q29udGFpbmVyRmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCVJlc291cmNlLkludGVybmFsIG9sZFJlc291cmNlID0gdGhpcy5lRGlyZWN0UmVzb3VyY2UoKTsKLQkJUmVzb3VyY2UuSW50ZXJuYWwgbmV3UmVzb3VyY2UgPSBuZXdDb250YWluZXIgPT0gbnVsbCA/IG51bGwKLQkJCQk6IG5ld0NvbnRhaW5lci5lSW50ZXJuYWxSZXNvdXJjZSgpOwotCQkvLyBpZiAob2xkUmVzb3VyY2UgIT0gbmV3UmVzb3VyY2UgJiYgb2xkUmVzb3VyY2UgIT0gbnVsbCkgewotCQkvLyByZW1vdmVDaGlsZFJlc291cmNlcygpOwotCQkvLyB9Ci0KLQkJaW50IG9sZEluZGV4ID0gLTE7Ci0JCWludCBvbGRTaXplID0gLTE7Ci0JCWlmIChvbGRSZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQlvbGRJbmRleCA9IG9sZFJlc291cmNlLmdldENvbnRlbnRzKCkuaW5kZXhPZih0aGlzKTsKLQkJCW9sZFNpemUgPSBvbGRSZXNvdXJjZS5nZXRDb250ZW50cygpLnNpemUoKTsKLQkJfQotCi0JCU5vdGlmaWNhdGlvbkNoYWluIG1lc3NhZ2VzID0gc3VwZXIuZUJhc2ljU2V0Q29udGFpbmVyKG5ld0NvbnRhaW5lciwKLQkJCQluZXdDb250YWluZXJGZWF0dXJlSUQsIG1zZ3MpOwotCQlpZiAob2xkUmVzb3VyY2UgIT0gbmV3UmVzb3VyY2UgJiYgb2xkUmVzb3VyY2UgIT0gbnVsbCkgewotCQkJLy8gcmVtb3ZlIGFueSBuZXdseSBhZGRlZCBNb2RpZmljYXRpb25UcmFja2luZ0FkYXB0ZXJzIGZyb20gdGhpcwotCQkJLy8gb2JqZWN0J3MgYWRhcHRlciBsaXN0Ci0JCQkvLwotCQkJaWYgKG5ld1Jlc291cmNlICE9IG51bGwpCi0JCQkJbmV3UmVzb3VyY2UuZGV0YWNoZWQodGhpcyk7Ci0KLQkJCS8vIE92ZXJyaWRlIHRoZSBkZWZhdWx0IHNlbWFudGljOiBNdWx0aVJlc291cmNlRU9iamVjdCBpcyBhbGxvd2VkIHRvCi0JCQkvLyBiZSBvd25lZCBieSBib3RoIGNvbnRhaW5lciBhbmQgcmVzb3VyY2UuCi0JCQkvLyBBZGQgdGhpcyBvYmplY3QgYmFjayB0byB0aGUgb2xkIHJlc291cmNlLgotCQkJLy8KLQkJCUJhc2ljRUxpc3QgY29udGVudHMgPSAoKEJhc2ljRUxpc3QpIG9sZFJlc291cmNlLmdldENvbnRlbnRzKCkpOwotCQkJaWYgKG9sZFNpemUgIT0gY29udGVudHMuc2l6ZSgpKSB7Ci0JCQkJLy8gdGhpcyBvYmplY3QgaGFzIGJlZW4gcmVtb3ZlZCBmcm9tIHRoZSByZXNvdXJjZSdzIGNvbnRlbnRzCi0JCQkJLy8gYWRkIGl0IGJhY2sKLQkJCQkvLwotCQkJCWlmIChjb250ZW50cy5pc0VtcHR5KCkpIHsKLQkJCQkJLy8gdGhpcyB3aWxsIGZsYWcgcmVzb3VyY2UgYXMgbG9hZGVkCi0JCQkJCS8vCi0JCQkJCWNvbnRlbnRzLmNsZWFyKCk7Ci0JCQkJCWNvbnRlbnRzLnNldERhdGEoMSwgbmV3IE9iamVjdFtdIHsgdGhpcyB9KTsKLQkJCQl9IGVsc2UgewotCQkJCQlPYmplY3RbXSBkYXRhID0gY29udGVudHMudG9BcnJheSgpOwotCQkJCQlPYmplY3RbXSBuZXdEYXRhID0gbmV3IE9iamVjdFtkYXRhLmxlbmd0aCArIDFdOwotCQkJCQlpZiAob2xkSW5kZXggPiAwKSB7Ci0JCQkJCQlTeXN0ZW0uYXJyYXljb3B5KGRhdGEsIDAsIG5ld0RhdGEsIDAsIG9sZEluZGV4KTsKLQkJCQkJfQotCQkJCQluZXdEYXRhW29sZEluZGV4XSA9IHRoaXM7Ci0JCQkJCWlmIChvbGRJbmRleCA8IGRhdGEubGVuZ3RoKSB7Ci0JCQkJCQlTeXN0ZW0uYXJyYXljb3B5KGRhdGEsIG9sZEluZGV4LCBuZXdEYXRhLCBvbGRJbmRleCArIDEsCi0JCQkJCQkJCWRhdGEubGVuZ3RoIC0gb2xkSW5kZXgpOwotCQkJCQl9Ci0JCQkJCWNvbnRlbnRzLnNldERhdGEobmV3RGF0YS5sZW5ndGgsIG5ld0RhdGEpOwotCQkJCX0KLQkJCX0KLQkJCWVTZXRSZXNvdXJjZShvbGRSZXNvdXJjZSk7Ci0JCQkvLyBkb24ndCBoYXZlIHRvIHJlLWF0dGFjaCB0aGlzIG9iamVjdCB0byBvbGRSZXNvdXJjZSBzaW5jZSBpdCB3YXMKLQkJCS8vIG5vdCBkZXR0YWNoZWQgaW4gc3VwZXIgbWV0aG9kCi0JCQkvLwotCQkJLy8gb2xkUmVzb3VyY2UuYXR0YWNoZWQodGhpcyk7Ci0KLQkJCS8vIGlmKG5ld1Jlc291cmNlICE9IG51bGwpIG5ld1Jlc291cmNlLmF0dGFjaGVkKHRoaXMpOwotCQl9Ci0JCXJldHVybiBtZXNzYWdlczsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBjb250YWluZXIgYW5kIGNvbnRhaW5lciBmZWF0dXJlIElEIGZvciB0aGlzIG9iamVjdCBvbmx5IGlmIGl0IGlzCi0JICogbm90IGNvbnRhaW5lZCBieSBhbnkgY29udGFpbmVyLgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuQmFzaWNFT2JqZWN0SW1wbCNlQmFzaWNTZXRDb250YWluZXIob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdCwKLQkgKiAgICAgIGludCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0Q29udGFpbmVyKEludGVybmFsRU9iamVjdCBuZXdDb250YWluZXIsCi0JCQlpbnQgbmV3Q29udGFpbmVyRmVhdHVyZUlEKSB7Ci0JCUVPYmplY3QgY29udGFpbmVyID0gZUludGVybmFsQ29udGFpbmVyKCk7Ci0JCWlmIChjb250YWluZXIgIT0gbnVsbCAmJiAhY29udGFpbmVyLmVJc1Byb3h5KCkpCi0JCQlyZXR1cm47Ci0JCXN1cGVyLmVCYXNpY1NldENvbnRhaW5lcihuZXdDb250YWluZXIsIG5ld0NvbnRhaW5lckZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5CYXNpY0VPYmplY3RJbXBsI2VCYXNpY1NldENvbnRhaW5lcihvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0LAotCSAqICAgICAgaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGVCYXNpY1NldENvbnRhaW5lcihJbnRlcm5hbEVPYmplY3QgbmV3Q29udGFpbmVyLAotCQkJaW50IG5ld0NvbnRhaW5lckZlYXR1cmVJRCkgewotCQlzdXBlci5lQmFzaWNTZXRDb250YWluZXIobmV3Q29udGFpbmVyLCBuZXdDb250YWluZXJGZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGNvbnRhaW5pbmcgcmVzb3VyY2UgZm9yIHRoaXMgb2JqZWN0LgotCSAqIAotCSAqIEBwYXJhbSByZXMKLQkgKiAgICAgICAgICAgIGEgcmVzb3VyY2UKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0UmVzb3VyY2UoUmVzb3VyY2UuSW50ZXJuYWwgcmVzKSB7Ci0JCWVQcm9wZXJ0aWVzKCkuc2V0RVJlc291cmNlKHJlcyk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5CYXNpY0VPYmplY3RJbXBsI2VEaXJlY3RSZXNvdXJjZSgpCi0JICovCi0JcHVibGljIEludGVybmFsIGVEaXJlY3RSZXNvdXJjZSgpIHsKLQkJcmV0dXJuIHN1cGVyLmVEaXJlY3RSZXNvdXJjZSgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc29sdmVkIG9iamVjdCByZXByZXNlbnRlZCBieSBwcm94eS4gUHJveHkgY2hhaW5zIGFyZQotCSAqIGZvbGxvd2VkLiBJZiByZXNvdXJjZVNldCBpcyBudWxsLCB0aGUgZ2xvYmFsIHBhY2thZ2UgcmVnaXN0cnkgaXMKLQkgKiBjb25zdWx0ZWQgdG8gb2J0YWluIGEgcGFja2FnZSByZWdpc3RlcmVkIGFnYWluc3QgdGhlIHByb3h5IFVSSSwgbGVzcyBpdHMKLQkgKiBmcmFnbWVudCwgaW4gdGhlIHNhbWUgbWFubmVyIGFzIHRoZSBkZWZhdWx0IHJlc291cmNlIHNldCBpbXBsZW1lbnRhdGlvbidzCi0JICogZmFsbGJhY2sgYmVoYXZpb3VyLgotCSAqIAotCSAqIEBwYXJhbSBwcm94eQotCSAqICAgICAgICAgICAgdGhlIHByb3h5IHRvIGJlIHJlc29sdmVkLgotCSAqIEBwYXJhbSByZXNvdXJjZVNldAotCSAqICAgICAgICAgICAgdGhlIHJlc291cmNlIHNldCBpbiB3aGljaCB0byByZXNvbHZlLgotCSAqIEByZXR1cm4gdGhlIHJlc29sdmVkIG9iamVjdCwgb3IgdGhlIHByb3h5IGlmIHVuYWJsZSB0byByZXNvbHZlLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsI3Jlc29sdmUob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QsCi0JICogICAgICBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQpCi0JICovCi0JcHJpdmF0ZSBFT2JqZWN0IHJlc29sdmVQcm94eShFT2JqZWN0IHByb3h5KSB7Ci0JCVJlc291cmNlU2V0IHJlc291cmNlU2V0ID0gZVJlc291cmNlKCkgIT0gbnVsbCA/IGVSZXNvdXJjZSgpCi0JCQkJLmdldFJlc291cmNlU2V0KCkgOiBudWxsOwotCi0JCVVSSSBwcm94eVVSSSA9ICgoSW50ZXJuYWxFT2JqZWN0KSBwcm94eSkuZVByb3h5VVJJKCk7Ci0JCWlmIChwcm94eVVSSSAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCUVPYmplY3QgcmVzb2x2ZWRPYmplY3QgPSBudWxsOwotCi0JCQkJaWYgKHJlc291cmNlU2V0ICE9IG51bGwpIHsKLQkJCQkJaWYgKHJlc291cmNlU2V0IGluc3RhbmNlb2YgSVVtYVJlc291cmNlU2V0KSB7Ci0JCQkJCQlyZXNvbHZlZE9iamVjdCA9ICgoSVVtYVJlc291cmNlU2V0KSByZXNvdXJjZVNldCkKLQkJCQkJCQkJLmdldEVPYmplY3QodGhpcywgcHJveHlVUkksIHRydWUpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJcmVzb2x2ZWRPYmplY3QgPSByZXNvdXJjZVNldC5nZXRFT2JqZWN0KHByb3h5VVJJLCB0cnVlKTsKLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCUVQYWNrYWdlIGVQYWNrYWdlID0gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UKLQkJCQkJCQkuZ2V0RVBhY2thZ2UocHJveHlVUkkudHJpbUZyYWdtZW50KCkudG9TdHJpbmcoKSk7Ci0JCQkJCWlmIChlUGFja2FnZSAhPSBudWxsKSB7Ci0JCQkJCQlSZXNvdXJjZSByZXNvdXJjZSA9IGVQYWNrYWdlLmVSZXNvdXJjZSgpOwotCQkJCQkJaWYgKHJlc291cmNlICE9IG51bGwpIHsKLQkJCQkJCQlyZXNvbHZlZE9iamVjdCA9IHJlc291cmNlLmdldEVPYmplY3QocHJveHlVUkkKLQkJCQkJCQkJCS5mcmFnbWVudCgpLnRvU3RyaW5nKCkpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCi0JCQkJaWYgKHJlc29sdmVkT2JqZWN0ICE9IG51bGwpIHsKLQkJCQkJaWYocmVzb2x2ZWRPYmplY3QgIT0gcHJveHkpIHsKLS8vCQkJCQkJcmV0dXJuIHJlc29sdmVQcm94eShyZXNvbHZlZE9iamVjdCk7Ci0JCQkJCQlyZXR1cm4gcmVzb2x2ZWRPYmplY3Q7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQlpZiAocmVzb3VyY2VTZXQgaW5zdGFuY2VvZiBJUHJveHlSZXNvbHV0aW9uTGlzdGVuZXIpIHsKLQkJCQkJCSgoSVByb3h5UmVzb2x1dGlvbkxpc3RlbmVyKSByZXNvdXJjZVNldCkKLQkJCQkJCQkJLm5vdGlmeUV4Y2VwdGlvbihuZXcgUmVzb2x2ZUV4Y2VwdGlvbihwcm94eSwKLQkJCQkJCQkJCQkoU3RyaW5nKSBudWxsLCB0aGlzKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGV4Y2VwdGlvbikgewotCQkJCWlmIChyZXNvdXJjZVNldCBpbnN0YW5jZW9mIElQcm94eVJlc29sdXRpb25MaXN0ZW5lcikgewotCQkJCQkoKElQcm94eVJlc29sdXRpb25MaXN0ZW5lcikgcmVzb3VyY2VTZXQpCi0JCQkJCQkJLm5vdGlmeUV4Y2VwdGlvbihuZXcgUmVzb2x2ZUV4Y2VwdGlvbihwcm94eSwKLQkJCQkJCQkJCWV4Y2VwdGlvbiwgdGhpcykpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gcHJveHk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0I2VSZXNvbHZlUHJveHkob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdCkKLQkgKi8KLQlwdWJsaWMgRU9iamVjdCBlUmVzb2x2ZVByb3h5KEludGVybmFsRU9iamVjdCBwcm94eSkgewotCQlFT2JqZWN0IGNvbnRhaW5lciA9IHByb3h5LmVDb250YWluZXIoKTsKLQkJaW50IGZlYXR1cmVJRCA9IHByb3h5LmVDb250YWluZXJGZWF0dXJlSUQoKTsKLQkJRU9iamVjdCByZXN1bHQgPSBudWxsOwotCi0JCXJlc3VsdCA9IHJlc29sdmVQcm94eShwcm94eSk7Ci0KLQkJaWYgKHJlc3VsdCAhPSBudWxsICYmIHJlc3VsdCBpbnN0YW5jZW9mIE11bHRpUmVzb3VyY2VFT2JqZWN0KSB7Ci0JCQlpZiAocHJveHkuZUlzUHJveHkoKSAmJiByZXN1bHQgPT0gcHJveHkpIHsKLQkJCQkvLyBwcm94eSBjb3VsZCBub3QgYmUgcmVzb2x2ZWQKLQkJCQkvLwotCQkJCSgoTXVsdGlSZXNvdXJjZUVPYmplY3QpIHJlc3VsdCkudmFsaWQgPSBmYWxzZTsKLQkJCX0gZWxzZSB7Ci0JCQkJKChNdWx0aVJlc291cmNlRU9iamVjdCkgcmVzdWx0KS52YWxpZCA9IHRydWU7Ci0KLQkJCQlpZiAoY29udGFpbmVyICE9IG51bGwpIHsKLQkJCQkJKChNdWx0aVJlc291cmNlRU9iamVjdCkgcmVzdWx0KS5lU2V0Q29udGFpbmVyKAotCQkJCQkJCShJbnRlcm5hbEVPYmplY3QpIGNvbnRhaW5lciwgZmVhdHVyZUlEKTsKLQkJCQl9Ci0KLQkJCQkvLyBtZXJnZSB0aGUgb3Bwb3NpdGUgZmVhdHVyZSBtYXAKLQkJCQkvLwotCQkJCWlmIChyZXN1bHQgIT0gcHJveHkpIHsKLQkJCQkJaWYocHJveHkgaW5zdGFuY2VvZiBNdWx0aVJlc291cmNlRU9iamVjdCkgewotCQkJCQkJTXVsdGlSZXNvdXJjZUVPYmplY3QgbXlPYmogPSAoTXVsdGlSZXNvdXJjZUVPYmplY3QpIHByb3h5OwotCi0JCQkJCQlpZiAobXlPYmoub3Bwb3NpdGVGZWF0dXJlTWFwICE9IG51bGwKLQkJCQkJCQkJJiYgIW15T2JqLm9wcG9zaXRlRmVhdHVyZU1hcC5pc0VtcHR5KCkpIHsKLQkJCQkJCQlNYXAgbmV3TWFwID0gKChNdWx0aVJlc291cmNlRU9iamVjdCkgcmVzdWx0KQotCQkJCQkJCS5nZXRPcHBvc2l0ZUZlYXR1cmVNYXAoKTsKLQkJCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBteU9iai5nZXRPcHBvc2l0ZUZlYXR1cmVNYXAoKQotCQkJCQkJCQkJLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJCU1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIGl0ZXIubmV4dCgpOwotCQkJCQkJCQlpZiAoZW50cnkuZ2V0VmFsdWUoKSAhPSBudWxsKSB7Ci0JCQkJCQkJCQlPcHBvc2l0ZUZlYXR1cmUgb3Bwb3NpdGVGZWF0dXJlID0gKE9wcG9zaXRlRmVhdHVyZSkgZW50cnkKLQkJCQkJCQkJCS5nZXRLZXkoKTsKLQkJCQkJCQkJCWlmIChvcHBvc2l0ZUZlYXR1cmUuaXNNYW55KCkpIHsKLQkJCQkJCQkJCQlMaXN0IHZhbHVlcyA9IChMaXN0KSBuZXdNYXAKLQkJCQkJCQkJCQkuZ2V0KG9wcG9zaXRlRmVhdHVyZSk7Ci0JCQkJCQkJCQkJaWYgKHZhbHVlcyA9PSBudWxsKSB7Ci0JCQkJCQkJCQkJCW5ld01hcC5wdXQob3Bwb3NpdGVGZWF0dXJlLCBlbnRyeQotCQkJCQkJCQkJCQkJCS5nZXRWYWx1ZSgpKTsKLQkJCQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQkJCQl2YWx1ZXMuYWRkQWxsKChDb2xsZWN0aW9uKSBlbnRyeQotCQkJCQkJCQkJCQkJCS5nZXRWYWx1ZSgpKTsKLQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQkJCW5ld01hcC5wdXQob3Bwb3NpdGVGZWF0dXJlLCBlbnRyeQotCQkJCQkJCQkJCQkJLmdldFZhbHVlKCkpOwotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJCW15T2JqLmdldE9wcG9zaXRlRmVhdHVyZU1hcCgpLmNsZWFyKCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJCi0JCQkJCVJlc291cmNlU2V0IHJlc291cmNlU2V0ID0gZVJlc291cmNlKCkgIT0gbnVsbCA/IGVSZXNvdXJjZSgpCi0JCQkJCQkJLmdldFJlc291cmNlU2V0KCkgOiBudWxsOwotCQkJCQlpZiAocmVzb3VyY2VTZXQgaW5zdGFuY2VvZiBJUHJveHlSZXNvbHV0aW9uTGlzdGVuZXIpIHsKLQkJCQkJCSgoSVByb3h5UmVzb2x1dGlvbkxpc3RlbmVyKSByZXNvdXJjZVNldCkucHJveHlSZXNvbHZlZCgKLQkJCQkJCQkJcHJveHksIHJlc3VsdCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJfQotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSBNYXAgY3JlYXRlT3Bwb3NpdGVGZWF0dXJlTWFwKCkgewotCQlNYXAgbWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gT3Bwb3NpdGVGZWF0dXJlLmNsYXNzT3Bwb3NpdGVGZWF0dXJlc01hcAotCQkJCS5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSkgaXRlci5uZXh0KCk7Ci0JCQlDbGFzcyBjbHMgPSAoQ2xhc3MpIGVudHJ5LmdldEtleSgpOwotCQkJaWYgKGNscy5pc0luc3RhbmNlKHRoaXMpKSB7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9ICgoQ29sbGVjdGlvbikgZW50cnkuZ2V0VmFsdWUoKSkKLQkJCQkJCS5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJCW1hcC5wdXQoaXRlcmF0b3IubmV4dCgpLCBudWxsKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKG1hcC5pc0VtcHR5KCkpIHsKLQkJCWhhc09wcG9zaXRlRmVhdHVyZSA9IGZhbHNlOwotCQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX01BUDsKLQkJfQotCQlyZXR1cm4gbWFwOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIG9wcG9zaXRlIGZlYXR1cmUgbWFwLgotCSAqIAotCSAqIEByZXR1cm4gYSBtYXAgY29udGFpbmluZyB0aGUgb3Bwb3NpdGUgZmVhdHVyZXMgbWFwcGVkIHRvIHRoZWlyIHZhbHVlcwotCSAqLwotCXB1YmxpYyBNYXAgZ2V0T3Bwb3NpdGVGZWF0dXJlTWFwKCkgewotCQlpZiAob3Bwb3NpdGVGZWF0dXJlTWFwID09IG51bGwgJiYgaGFzT3Bwb3NpdGVGZWF0dXJlKSB7Ci0JCQlvcHBvc2l0ZUZlYXR1cmVNYXAgPSBjcmVhdGVPcHBvc2l0ZUZlYXR1cmVNYXAoKTsKLQkJfQotCQlpZihvcHBvc2l0ZUZlYXR1cmVNYXAgPT0gbnVsbCkgewotCQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX01BUDsKLQkJfQotCQlyZXR1cm4gb3Bwb3NpdGVGZWF0dXJlTWFwOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIG9wcG9zaXRlIGZlYXR1cmUgbWFwLgotCSAqIAotCSAqIEByZXR1cm4gYSBtYXAgY29udGFpbmluZyB0aGUgb3Bwb3NpdGUgZmVhdHVyZXMgbWFwcGVkIHRvIHRoZWlyIHZhbHVlcyBvcgotCSAqICAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhpcyBvYmplY3QgZG9lcyBub3QgaGF2ZSBhbnkgb3Bwb3NpdGUKLQkgKiAgICAgICAgIGZlYXR1cmUgb3IgdGhlIG1hcCBoYXMgbm90IGJlZW4gY3JlYXRlZAotCSAqLwotCXB1YmxpYyBNYXAgYmFzaWNHZXRPcHBvc2l0ZUZlYXR1cmVNYXAoKSB7Ci0JCXJldHVybiBvcHBvc2l0ZUZlYXR1cmVNYXA7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgdmFsdWUgb2YgYW4gb3Bwb3NpdGUgZmVhdHVyZS4KLQkgKiAKLQkgKiBAcGFyYW0gZmVhdHVyZQotCSAqICAgICAgICAgICAgYW4gb3Bwb3NpdGUgZmVhdHVyZQotCSAqIEByZXR1cm4gdGhlIHZhbHVlIGZvciB0aGUgb3Bwb3NpdGUgZmVhdHVyZQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0T3Bwb3NpdGVGZWF0dXJlVmFsdWUoT3Bwb3NpdGVGZWF0dXJlIGZlYXR1cmUpIHsKLQkJT2JqZWN0IHZhbHVlID0gZ2V0T3Bwb3NpdGVGZWF0dXJlTWFwKCkuZ2V0KGZlYXR1cmUpOwotCi0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiTXVsdGlSZXNvdXJjZUVPYmplY3QuZ2V0T3Bwb3NpdGVGZWF0dXJlVmFsdWUoKToiKTsKLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCIgZmVhdHVyZTogIiArIGZlYXR1cmUpOwotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIiB2YWx1ZTogIiArIHZhbHVlKTsKLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCIgdGhpczogIiArIHRoaXMpOwotCi0JCWlmIChmZWF0dXJlLmlzTWFueSgpKSB7Ci0JCQlpZiAodmFsdWUgPT0gbnVsbCkgewotCQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCQkJfQotCi0JCQlyZXR1cm4gKChPcHBvc2l0ZUZlYXR1cmVSZXNvbHZpbmdFTGlzdCkgdmFsdWUpCi0JCQkJCS5nZXRVbm1vZGlmaWFibGVMaXN0KCk7Ci0JCX0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBFT2JqZWN0Ci0JCQkJJiYgKChFT2JqZWN0KSB2YWx1ZSkuZVJlc291cmNlKCkgPT0gbnVsbCkgewotCQkJZ2V0T3Bwb3NpdGVGZWF0dXJlTWFwKCkucHV0KGZlYXR1cmUsIG51bGwpOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBJbnRlcm5hbEVPYmplY3QKLQkJCQkmJiAoKEludGVybmFsRU9iamVjdCkgdmFsdWUpLmVJc1Byb3h5KCkpIHsKLQkJCUVPYmplY3QgcmVzb2x2ZWQgPSBlUmVzb2x2ZVByb3h5KChJbnRlcm5hbEVPYmplY3QpIHZhbHVlKTsKLQkJCWlmIChyZXNvbHZlZCAhPSB2YWx1ZSkgewotCQkJCWdldE9wcG9zaXRlRmVhdHVyZU1hcCgpLnB1dChmZWF0dXJlLCByZXNvbHZlZCk7Ci0JCQkJdmFsdWUgPSByZXNvbHZlZDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdmFsdWU7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgcmVzb3VyY2UgYXQgYSBnaXZlbiBsb2NhdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gbG9jYXRpb24KLQkgKiAgICAgICAgICAgIHRoZSByZXNvdXJjZSBsb2NhdGlvbgotCSAqIEByZXR1cm4gYSByZXNvdXJjZSBpbiB0aGUgd29ya3NwYWNlCi0JICovCi0JcHVibGljIHN0YXRpYyBJUmVzb3VyY2UgZ2V0UmVzb3VyY2VGb3JMb2NhdGlvbihTdHJpbmcgbG9jYXRpb24pIHsKLQkJSVdvcmtzcGFjZVJvb3Qgd29ya3NwYWNlUm9vdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7Ci0JCUlQYXRoIHBhdGggPSBuZXcgUGF0aChsb2NhdGlvbik7Ci0JCUlSZXNvdXJjZSByZXNvdXJjZTsKLQkJRmlsZSBmaWxlID0gIG5ldyBGaWxlKGxvY2F0aW9uKTsKLQkJaWYgKGZpbGUuaXNGaWxlKCkpIHsKLQkJCXJlc291cmNlID0gd29ya3NwYWNlUm9vdC5nZXRGaWxlRm9yTG9jYXRpb24ocGF0aCk7Ci0JCQlpZihyZXNvdXJjZSA9PSBudWxsKSB7Ci0JCQkJSVJlc291cmNlIHBhcmVudFJlc291cmNlID0gZ2V0UmVzb3VyY2VGb3JMb2NhdGlvbihmaWxlCi0JCQkJCQkuZ2V0UGFyZW50KCkpOwotCQkJCWlmKHBhcmVudFJlc291cmNlICE9IG51bGwpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCXBhcmVudFJlc291cmNlLnJlZnJlc2hMb2NhbChJUmVzb3VyY2UuREVQVEhfT05FLCBudWxsKTsKLQkJCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlDb21tb25QbHVnaW4uSU5TVEFOQ0UubG9nKGUpOwotCQkJCQl9Ci0JCQkJCXJlc291cmNlID0gd29ya3NwYWNlUm9vdC5nZXRGaWxlRm9yTG9jYXRpb24ocGF0aCk7Ci0JCQkJfQotCQkJfQotCQl9IGVsc2UgewotCQkJcmVzb3VyY2UgPSB3b3Jrc3BhY2VSb290LmdldENvbnRhaW5lckZvckxvY2F0aW9uKHBhdGgpOwotCQl9Ci0JCXJldHVybiByZXNvdXJjZTsKLQl9Ci0KLS8vCS8qIChub24tSmF2YWRvYykKLS8vCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGUjZ2V0QWRhcHRlcihqYXZhLmxhbmcuQ2xhc3MpCi0vLwkgKi8KLS8vCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihDbGFzcyBhZGFwdGVyKSB7Ci0vLwkJaWYoYWRhcHRlciA9PSBJUmVzb3VyY2UuY2xhc3MpIHsKLS8vCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSBlUmVzb3VyY2UoKTsKLS8vCQkJaWYocmVzb3VyY2UgIT0gbnVsbCkgewotLy8JCQkJcmV0dXJuIGdldFJlc291cmNlRm9yTG9jYXRpb24ocmVzb3VyY2UuZ2V0VVJJKCkudG9GaWxlU3RyaW5nKCkpOwotLy8JCQl9Ci0vLwkJfQotLy8JCXJldHVybiBudWxsOwotLy8JfQotCQotCS8qKgotCSAqIFJlbW92ZXMgYWxsIG9wcG9zaXRlIGZlYXR1cmVzIHJlZ2lzdGVyZWQgd2l0aCB0aGUgc3lzdGVtLgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUZyb21BbGxPcHBvc2l0ZUZlYXR1cmVzKCkgewotCQkvLyBmaW5kIGFsbCBmZWF0dXJlcyB0aGF0IGhhdmUgb3Bwb3NpdGUgZmVhdHVyZXMgYW5kIGNsZWFyIHRob3NlCi0JCS8vIGZlYXR1cmVzLiBUaGlzIHdpbGwgcmVtb3ZlIHRoZSByZWZlcmVuY2VzIHRvCi0JCS8vIHVubG9hZGVkIG9iamVjdCBieSB0aG9zZSBvcHBvc2l0ZSBmZWF0dXJlcwotCQkvLwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBlQ2xhc3MoKS5nZXRFQWxsUmVmZXJlbmNlcygpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkuaGFzTmV4dCgpOykgewotCQkJRVJlZmVyZW5jZSByZWYgPSAoRVJlZmVyZW5jZSkgaXRlci5uZXh0KCk7Ci0JCQlPcHBvc2l0ZUZlYXR1cmUgb3Bwb3NpdGVGZWF0dXJlID0gT3Bwb3NpdGVGZWF0dXJlLmdldE9wcG9zaXRlRmVhdHVyZShyZWYpOwotCQkJaWYob3Bwb3NpdGVGZWF0dXJlICE9IG51bGwpIHsKLQkJCQlpZihyZWYuaXNNYW55KCkpIHsKLQkJCQkJTGlzdCBsaXN0ID0gKExpc3QpIGVHZXQocmVmLCBmYWxzZSk7CQkJCQkKLQkJCQkJaWYoIWxpc3QuaXNFbXB0eSgpKSB7Ci0JCQkJCQlpZighb3Bwb3NpdGVGZWF0dXJlLnJlc29sdmVPd25lcigpKSB7Ci0JCQkJCQkJbGlzdC5jbGVhcigpOwotCQkJCQkJfQotCQkJCQkJZWxzZSBpZihsaXN0IGluc3RhbmNlb2YgSW50ZXJuYWxFTGlzdCkgewotCQkJCQkJCUxpc3QgYmFzaWNMaXN0ID0gKChJbnRlcm5hbEVMaXN0KWxpc3QpLmJhc2ljTGlzdCgpOwotCQkJCQkJCWZvcihpbnQgaSA9IGJhc2ljTGlzdC5zaXplKCkgLSAxOyBpID4gLTE7IGktLSkgewotCQkJCQkJCQlFT2JqZWN0IGUgPSAoRU9iamVjdCkgYmFzaWNMaXN0LmdldChpKTsKLQkJCQkJCQkJaWYoIWUuZUlzUHJveHkoKSkgewotCQkJCQkJCQkJbGlzdC5yZW1vdmUoZSk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCUVPYmplY3QgZSA9IChFT2JqZWN0KSBlR2V0KHJlZiwgZmFsc2UpOwotCQkJCQlpZihlICE9IG51bGwgJiYgIWUuZUlzUHJveHkoKSkgewotCQkJCQkJZVNldChyZWYsIG51bGwpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUuSU1vZGVsT2JqZWN0I2dldE9wcG9zaXRlRmVhdHVyZXMoKQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldE9wcG9zaXRlRmVhdHVyZXMoKSB7Ci0JCXJldHVybiBnZXRPcHBvc2l0ZUZlYXR1cmVNYXAoKS5rZXlTZXQoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUuSU1vZGVsT2JqZWN0I2dldERlZmF1bHRWYWx1ZShvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlKQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0RGVmYXVsdFZhbHVlKEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKSB7Ci0JCU9iamVjdCB2YWx1ZSA9IGdldEZlYXR1cmVUb0RlZmF1bHRWYWx1ZU1hcCgpLmdldChmZWF0dXJlKTsKLQkJaWYodmFsdWUgPT0gbnVsbCkgewotCQkJdmFsdWUgPSBmZWF0dXJlLmdldERlZmF1bHRWYWx1ZSgpOwotCQl9Ci0JCXJldHVybiB2YWx1ZTsKLQl9Ci0JCi0JcHJpdmF0ZSBNYXA8RVN0cnVjdHVyYWxGZWF0dXJlLCBPYmplY3Q+IGdldEZlYXR1cmVUb0RlZmF1bHRWYWx1ZU1hcCgpIHsKLQkJcmV0dXJuIGRlZmF1bHRWYWx1ZU1hbmFnZXIuZ2V0RmVhdHVyZVRvRGVmYXVsdFZhbHVlTWFwKGVDbGFzcygpKTsKLQl9Ci0JCi0JLyoqCi0JICogVW5yZWdpc3RlcnMgYSBmZWF0dXJlIHdob3NlIGRlZmF1bHQgdmFsdWUgaGFzIGJlZW4gb3ZlcnJpZGVuLgotCSAqIAotCSAqIEBwYXJhbSBmZWF0dXJlCi0JICogICAgICAgICAgICBhIGZlYXR1cmUKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZSgKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKSB7Ci0JCU1hcCBmZWF0dXJlVG9EZWZhdWx0VmFsdWVNYXAgPSBnZXRGZWF0dXJlVG9EZWZhdWx0VmFsdWVNYXAoKTsKLQkJaWYoZmVhdHVyZVRvRGVmYXVsdFZhbHVlTWFwICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJZmVhdHVyZVRvRGVmYXVsdFZhbHVlTWFwLnJlbW92ZShmZWF0dXJlKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFJlYXNzaWduIGRlZmF1bHQgdmFsdWVzIHRoYXQgYXJlIGRlZmluZWQgc3RhdGljYWxseSBvciBkeW5hbWljYWxseSBmb3IgdGhpcyBjbGFzcwotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlYXNzaWduRGVmYXVsdFZhbHVlcygpIHsKLQkJZGVmYXVsdFZhbHVlTWFuYWdlci5hc3NpZ25EZWZhdWx0VmFsdWVzKHRoaXMpOwotCX0KLQkKLQlwcm90ZWN0ZWQgRVN0cnVjdHVyYWxGZWF0dXJlIGdldEZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlKAotCQkJaW50IGZlYXR1cmVJRCkgewotCQlNYXAgZmVhdHVyZVRvRGVmYXVsdFZhbHVlTWFwID0gZ2V0RmVhdHVyZVRvRGVmYXVsdFZhbHVlTWFwKCk7Ci0JCWlmKCFmZWF0dXJlVG9EZWZhdWx0VmFsdWVNYXAuaXNFbXB0eSgpKSB7Ci0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IGVDbGFzcygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZSgKLQkJCQkJZmVhdHVyZUlEKTsKLQkJCWlmKGZlYXR1cmUgIT0gbnVsbCAmJiBmZWF0dXJlVG9EZWZhdWx0VmFsdWVNYXAuY29udGFpbnNLZXkoZmVhdHVyZSkpIHsKLQkJCQlyZXR1cm4gZmVhdHVyZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZVNldCgKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKSB7Ci0JCU9iamVjdCBkZWZhdWx0VmFsdWUgPSBnZXREZWZhdWx0VmFsdWUoZmVhdHVyZSk7Ci0JCU9iamVjdCB2YWx1ZSA9IGVHZXQoZmVhdHVyZSwgZmFsc2UpOwotCQlpZihmZWF0dXJlLmlzTWFueSgpKSB7Ci0JCQlyZXR1cm4gdmFsdWUgIT0gbnVsbCAmJiAhKChDb2xsZWN0aW9uKSB2YWx1ZSkuaXNFbXB0eSgpCi0JCQkmJiB2YWx1ZSAhPSBkZWZhdWx0VmFsdWU7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gZGVmYXVsdFZhbHVlID09IG51bGwgPyB2YWx1ZSAhPSBudWxsIDogIWRlZmF1bHRWYWx1ZQotCQkJCQkuZXF1YWxzKHZhbHVlKTsKLQkJfQotCQkKLS8vCQkvLyBBbHdheXMgcmV0dXJuIHRydWUgc28gdGhlIGZlYXR1cmUgKHdpdGggZGVmYXVsdCB2YWx1ZSBvdmVycmlkZW4pCi0vLwkJLy8gd2lsbCBiZSBzYXZlZCByZWdhcmRsZXNzIHRoYXQgaXRzIHZhbHVlIGlzIHRoZSBkZWZhdWx0IHZhbHVlIG9yIG5vdC4KLS8vCQkvLwotLy8JCXJldHVybiB0cnVlOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2Vjb3JlL2ltcGwvcGFja2FnZS5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9lY29yZS9pbXBsL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDJlNjIyNS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2Vjb3JlL2ltcGwvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgdGhlIGltcGxlbWVudGF0aW9uIGZvciB0aGUgVU1BIEVjb3JlIGV4dGVuc2lvbi4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2Vjb3JlL3BhY2thZ2UuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvZWNvcmUvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNWNhOTA2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvZWNvcmUvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgdGhlIGludGVyZmFjZXMgZm9yIHRoZSBVTUEgRWNvcmUgZXh0ZW5zaW9uLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvZWNvcmUvdXRpbC9EZWZhdWx0VmFsdWVNYW5hZ2VyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2Vjb3JlL3V0aWwvRGVmYXVsdFZhbHVlTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNWY4MjkyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvZWNvcmUvdXRpbC9EZWZhdWx0VmFsdWVNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luZSAxLjIKLSAqLwotcHVibGljIGNsYXNzIERlZmF1bHRWYWx1ZU1hbmFnZXIgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgRGVmYXVsdFZhbHVlTWFuYWdlciBJTlNUQU5DRSA9IG5ldyBEZWZhdWx0VmFsdWVNYW5hZ2VyKCk7Ci0JCi0JcHJpdmF0ZSBmaW5hbCBNYXA8RVN0cnVjdHVyYWxGZWF0dXJlLCBNYXA8RUNsYXNzLCBPYmplY3Q+PiBmZWF0dXJlVG9UeXBlZERlZmF1bHRWYWx1ZXNNYXAgPSAKLQkJbmV3IEhhc2hNYXA8RVN0cnVjdHVyYWxGZWF0dXJlLCBNYXA8RUNsYXNzLCBPYmplY3Q+PigpOwotCQotCXByaXZhdGUgZmluYWwgTWFwPEVDbGFzcywgTWFwPEVTdHJ1Y3R1cmFsRmVhdHVyZSwgT2JqZWN0Pj4gdHlwZVRvRmVhdHVyZURlZmF1bHRWYWx1ZU1hcCA9Ci0JCW5ldyBIYXNoTWFwPEVDbGFzcywgTWFwPEVTdHJ1Y3R1cmFsRmVhdHVyZSxPYmplY3Q+PigpOwotCi0JcHJpdmF0ZSBmaW5hbCBNYXA8RVN0cnVjdHVyYWxGZWF0dXJlLCBNYXA8RUNsYXNzLCBPYmplY3Q+PiBmZWF0dXJlVG9UeXBlZFN0YXRpY0RlZmF1bHRWYWx1ZXNNYXAgPSAKLQkJbmV3IEhhc2hNYXA8RVN0cnVjdHVyYWxGZWF0dXJlLCBNYXA8RUNsYXNzLCBPYmplY3Q+PigpOwotCQotCXByaXZhdGUgZmluYWwgTWFwPEVDbGFzcywgTWFwPEVTdHJ1Y3R1cmFsRmVhdHVyZSwgT2JqZWN0Pj4gdHlwZVRvRmVhdHVyZVN0YXRpY0RlZmF1bHRWYWx1ZU1hcCA9Ci0JCW5ldyBIYXNoTWFwPEVDbGFzcywgTWFwPEVTdHJ1Y3R1cmFsRmVhdHVyZSxPYmplY3Q+PigpOwotCi0JcHJpdmF0ZSB2b2xhdGlsZSBib29sZWFuIHVzZVN0YXRpYzsKLQkKLQlwcm90ZWN0ZWQgRGVmYXVsdFZhbHVlTWFuYWdlcigpIHsKLQkJCi0JfQotCQotCXB1YmxpYyB2b2lkIHNldFVzZVN0YXRpYyhib29sZWFuIHVzZVN0YXRpYykgewotCQl0aGlzLnVzZVN0YXRpYyA9IHVzZVN0YXRpYzsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNVc2VTdGF0aWMoKSB7Ci0JCXJldHVybiB1c2VTdGF0aWM7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIE1hcDxFU3RydWN0dXJhbEZlYXR1cmUsIE9iamVjdD4gZ2V0RmVhdHVyZVRvRGVmYXVsdFZhbHVlTWFwKEVDbGFzcyB0eXBlLCAKLQkJCU1hcDxFU3RydWN0dXJhbEZlYXR1cmUsIE1hcDxFQ2xhc3MsIE9iamVjdD4+IGZlYXR1cmVUb1R5cGVkRGVmYXVsdFZhbHVlc01hcCwKLQkJCU1hcDxFU3RydWN0dXJhbEZlYXR1cmUsIE9iamVjdD4gZmVhdHVyZVRvU3RhdGljRGVmYXVsdFZhbHVlTWFwKSB7Ci0JCU1hcDxFU3RydWN0dXJhbEZlYXR1cmUsIE9iamVjdD4gZmVhdHVyZVRvRGVmYXVsdFZhbHVlTWFwOwotCQlpZihmZWF0dXJlVG9UeXBlZERlZmF1bHRWYWx1ZXNNYXAuaXNFbXB0eSgpKSB7Ci0JCQlmZWF0dXJlVG9EZWZhdWx0VmFsdWVNYXAgPSBDb2xsZWN0aW9ucy5FTVBUWV9NQVA7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlmZWF0dXJlVG9EZWZhdWx0VmFsdWVNYXAgPSBuZXcgSGFzaE1hcDxFU3RydWN0dXJhbEZlYXR1cmUsIE9iamVjdD4oKTsKLQkJCWZvciAoSXRlcmF0b3I8TWFwLkVudHJ5PEVTdHJ1Y3R1cmFsRmVhdHVyZSwgTWFwPEVDbGFzcywgT2JqZWN0Pj4+IGl0ZXIgPSAKLQkJCQlmZWF0dXJlVG9UeXBlZERlZmF1bHRWYWx1ZXNNYXAuZW50cnlTZXQoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlNYXAuRW50cnk8RVN0cnVjdHVyYWxGZWF0dXJlLCBNYXA8RUNsYXNzLCBPYmplY3Q+PiBlbnRyeSA9IGl0ZXIubmV4dCgpOwotCQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gZW50cnkuZ2V0S2V5KCk7Ci0JCQkJaWYodHlwZS5nZXRGZWF0dXJlSUQoZmVhdHVyZSkgIT0gLTEpIHsKLQkJCQkJT2JqZWN0IGRlZmF1bHRWYWx1ZSA9IG51bGw7Ci0JCQkJCUVDbGFzcyBzZWxlY3RlZFR5cGUgPSB0eXBlOwotCQkJCQlib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0JCQkJCWZvciAoSXRlcmF0b3I8TWFwLkVudHJ5PEVDbGFzcywgT2JqZWN0Pj4gaXRlcmF0b3IgPSBlbnRyeS5nZXRWYWx1ZSgpLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IKLQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJTWFwLkVudHJ5PEVDbGFzcywgT2JqZWN0PiBlbnQgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCQlFQ2xhc3MgY3VycmVudFR5cGUgPSBlbnQuZ2V0S2V5KCk7Ci0JCQkJCQlpZihjdXJyZW50VHlwZS5pc1N1cGVyVHlwZU9mKHR5cGUpICYmIAotCQkJCQkJCQkoc2VsZWN0ZWRUeXBlID09IG51bGwgfHwgc2VsZWN0ZWRUeXBlLmlzU3VwZXJUeXBlT2YoY3VycmVudFR5cGUpKSkgewotCQkJCQkJCXNlbGVjdGVkVHlwZSA9IGN1cnJlbnRUeXBlOwotCQkJCQkJCWRlZmF1bHRWYWx1ZSA9IGVudC5nZXRWYWx1ZSgpOwotCQkJCQkJCWZvdW5kID0gdHJ1ZTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlpZihmb3VuZCkgewotCQkJCQkJT2JqZWN0IHN0YXRpY0RlZmF1bHRWYWx1ZSA9IGZlYXR1cmVUb1N0YXRpY0RlZmF1bHRWYWx1ZU1hcC5nZXQoZmVhdHVyZSk7Ci0JCQkJCQlpZihzdGF0aWNEZWZhdWx0VmFsdWUgPT0gbnVsbCkgewotCQkJCQkJCXN0YXRpY0RlZmF1bHRWYWx1ZSA9IGZlYXR1cmUuZ2V0RGVmYXVsdFZhbHVlKCk7Ci0JCQkJCQl9Ci0JCQkJCQkKLQkJCQkJCS8vIGRlZmF1bHQgdmFsdWUgaXMgb3ZlcnJpZGRlbiBlaXRoZXIgdmlhOgotCQkJCQkJLy8gLSBzdGF0aWMgZGVmYXVsdCB2YWx1ZQotCQkJCQkJLy8gLSBkeW5hbWljIGRlZmF1bHQgdmFsdWUKLQkJCQkJCS8vIC0gZHluYW1pYyBkZWZhdWx0IHZhbHVlIHRoYXQgb3ZlcnJvZGUgYSBvdmVycmlkaW5nIHN0YXRpYyBkZWZhdWx0IHZhbHVlCi0JCQkJCQkvLwotCQkJCQkJaWYoKGRlZmF1bHRWYWx1ZSA9PSBudWxsICYmICBzdGF0aWNEZWZhdWx0VmFsdWUgIT0gbnVsbCkKLQkJCQkJCQkJfHwgKGRlZmF1bHRWYWx1ZSAhPSBudWxsICYmICghZGVmYXVsdFZhbHVlLmVxdWFscyhzdGF0aWNEZWZhdWx0VmFsdWUpIHx8IAotCQkJCQkJCQkJCShzdGF0aWNEZWZhdWx0VmFsdWUgIT0gbnVsbCAmJiAhc3RhdGljRGVmYXVsdFZhbHVlLmVxdWFscyhmZWF0dXJlLmdldERlZmF1bHRWYWx1ZSgpKSkpKSkgewotCQkJCQkJCWZlYXR1cmVUb0RlZmF1bHRWYWx1ZU1hcC5wdXQoZmVhdHVyZSwgZGVmYXVsdFZhbHVlKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWlmKGZlYXR1cmVUb0RlZmF1bHRWYWx1ZU1hcC5pc0VtcHR5KCkpIHsKLQkJCQlmZWF0dXJlVG9EZWZhdWx0VmFsdWVNYXAgPSBDb2xsZWN0aW9ucy5FTVBUWV9NQVA7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZlYXR1cmVUb0RlZmF1bHRWYWx1ZU1hcDsKLQl9Ci0JCi0JcHVibGljIHN5bmNocm9uaXplZCBNYXA8RVN0cnVjdHVyYWxGZWF0dXJlLCBPYmplY3Q+IGdldEZlYXR1cmVUb0RlZmF1bHRWYWx1ZU1hcChFQ2xhc3MgdHlwZSkgewotCQlpZih1c2VTdGF0aWMpIHsKLQkJCXJldHVybiBnZXRGZWF0dXJlVG9TdGF0aWNEZWZhdWx0VmFsdWVNYXAodHlwZSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXR1cm4gZ2V0RmVhdHVyZVRvRHluYW1pY0RlZmF1bHRWYWx1ZU1hcCh0eXBlKTsKLQkJfQkJCi0JfQotCQotCXByaXZhdGUgc3luY2hyb25pemVkIE1hcDxFU3RydWN0dXJhbEZlYXR1cmUsIE9iamVjdD4gZ2V0RmVhdHVyZVRvRHluYW1pY0RlZmF1bHRWYWx1ZU1hcChFQ2xhc3MgdHlwZSkgewotCQlNYXA8RVN0cnVjdHVyYWxGZWF0dXJlLCBPYmplY3Q+IGZlYXR1cmVUb0RlZmF1bHRWYWx1ZU1hcCA9IHR5cGVUb0ZlYXR1cmVEZWZhdWx0VmFsdWVNYXAuZ2V0KHR5cGUpOwotCQlpZihmZWF0dXJlVG9EZWZhdWx0VmFsdWVNYXAgPT0gbnVsbCkgewotCQkJZmVhdHVyZVRvRGVmYXVsdFZhbHVlTWFwID0gZ2V0RmVhdHVyZVRvRGVmYXVsdFZhbHVlTWFwKHR5cGUsIGZlYXR1cmVUb1R5cGVkRGVmYXVsdFZhbHVlc01hcCwKLQkJCQkJZ2V0RmVhdHVyZVRvU3RhdGljRGVmYXVsdFZhbHVlTWFwKHR5cGUpKTsKLQkJCXR5cGVUb0ZlYXR1cmVEZWZhdWx0VmFsdWVNYXAucHV0KHR5cGUsIGZlYXR1cmVUb0RlZmF1bHRWYWx1ZU1hcCk7Ci0JCX0KLQkJcmV0dXJuIGZlYXR1cmVUb0RlZmF1bHRWYWx1ZU1hcDsKLQl9CQotCQotCXByaXZhdGUgc3luY2hyb25pemVkIE1hcDxFU3RydWN0dXJhbEZlYXR1cmUsIE9iamVjdD4gZ2V0RmVhdHVyZVRvU3RhdGljRGVmYXVsdFZhbHVlTWFwKEVDbGFzcyB0eXBlKSB7Ci0JCU1hcDxFU3RydWN0dXJhbEZlYXR1cmUsIE9iamVjdD4gZmVhdHVyZVRvRGVmYXVsdFZhbHVlTWFwID0gdHlwZVRvRmVhdHVyZVN0YXRpY0RlZmF1bHRWYWx1ZU1hcC5nZXQodHlwZSk7Ci0JCWlmKGZlYXR1cmVUb0RlZmF1bHRWYWx1ZU1hcCA9PSBudWxsKSB7Ci0JCQlmZWF0dXJlVG9EZWZhdWx0VmFsdWVNYXAgPSBnZXRGZWF0dXJlVG9EZWZhdWx0VmFsdWVNYXAodHlwZSwgZmVhdHVyZVRvVHlwZWRTdGF0aWNEZWZhdWx0VmFsdWVzTWFwLAotCQkJCQlDb2xsZWN0aW9ucy5FTVBUWV9NQVApOwotCQkJdHlwZVRvRmVhdHVyZVN0YXRpY0RlZmF1bHRWYWx1ZU1hcC5wdXQodHlwZSwgZmVhdHVyZVRvRGVmYXVsdFZhbHVlTWFwKTsKLQkJfQotCQlyZXR1cm4gZmVhdHVyZVRvRGVmYXVsdFZhbHVlTWFwOwotCX0KLQotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIHN5bmNocm9uaXplZCB2b2lkIHNldERlZmF1bHRWYWx1ZShFQ2xhc3MgdHlwZSwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIE9iamVjdCBkZWZhdWx0VmFsdWUsCi0JCQlNYXA8RVN0cnVjdHVyYWxGZWF0dXJlLCBNYXA8RUNsYXNzLCBPYmplY3Q+PiBmZWF0dXJlVG9UeXBlZERlZmF1bHRWYWx1ZXNNYXAgKSAKLQl7Ci0JCWlmKCFmZWF0dXJlLmdldEVDb250YWluaW5nQ2xhc3MoKS5pc1N1cGVyVHlwZU9mKHR5cGUpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJTWFwPEVDbGFzcywgT2JqZWN0PiB0eXBlVG9EZWZhdWx0VmFsdWVNYXAgPSBmZWF0dXJlVG9UeXBlZERlZmF1bHRWYWx1ZXNNYXAuZ2V0KGZlYXR1cmUpOwotCQlpZih0eXBlVG9EZWZhdWx0VmFsdWVNYXAgPT0gbnVsbCkgewotCQkJLy8gdGhpcyBtYXAgbXVzdCBiZSBzb3J0ZWQgZnJvbSBzdWIgdHlwZSB0byBzdXBlciB0eXBlCi0JCQkvLwotCQkJdHlwZVRvRGVmYXVsdFZhbHVlTWFwID0gbmV3IEhhc2hNYXA8RUNsYXNzLCBPYmplY3Q+KCk7Ci0JCQlmZWF0dXJlVG9UeXBlZERlZmF1bHRWYWx1ZXNNYXAucHV0KGZlYXR1cmUsIHR5cGVUb0RlZmF1bHRWYWx1ZU1hcCk7Ci0JCX0KLQkJdHlwZVRvRGVmYXVsdFZhbHVlTWFwLnB1dCh0eXBlLCBkZWZhdWx0VmFsdWUpOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgc3luY2hyb25pemVkIHZvaWQgc2V0RGVmYXVsdFZhbHVlKEVDbGFzcyB0eXBlLCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgT2JqZWN0IGRlZmF1bHRWYWx1ZSkgewotCQlzZXREZWZhdWx0VmFsdWUodHlwZSwgZmVhdHVyZSwgZGVmYXVsdFZhbHVlLCBmZWF0dXJlVG9UeXBlZERlZmF1bHRWYWx1ZXNNYXApOwotCQkKLQkJLy8gY2xlYXIgdHlwZVRvRmVhdHVyZURlZmF1bHRWYWx1ZU1hcCBzbyB0aGUgZGVmYXVsdCB2YWx1ZSB3aWxsIGJlIHJlY2FsY3VsYXRlZCBmb3IgZWFjaCBjbGFzcwotCQkvLwotCQl0eXBlVG9GZWF0dXJlRGVmYXVsdFZhbHVlTWFwLmNsZWFyKCk7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBzeW5jaHJvbml6ZWQgdm9pZCBzZXRTdGF0aWNEZWZhdWx0VmFsdWUoRUNsYXNzIHR5cGUsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBPYmplY3QgZGVmYXVsdFZhbHVlKSB7Ci0JCXNldERlZmF1bHRWYWx1ZSh0eXBlLCBmZWF0dXJlLCBkZWZhdWx0VmFsdWUpOwotCQlzZXREZWZhdWx0VmFsdWUodHlwZSwgZmVhdHVyZSwgZGVmYXVsdFZhbHVlLCBmZWF0dXJlVG9UeXBlZFN0YXRpY0RlZmF1bHRWYWx1ZXNNYXApOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgdm9pZCByZW1vdmVEZWZhdWx0VmFsdWUoRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUpIHsKLQkJZmVhdHVyZVRvVHlwZWREZWZhdWx0VmFsdWVzTWFwLnJlbW92ZShmZWF0dXJlKTsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgdm9pZCByZW1vdmVEZWZhdWx0VmFsdWUoRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIEVDbGFzcyB0eXBlKSB7Ci0JCWFzc2VydCBmZWF0dXJlLmdldEVDb250YWluaW5nQ2xhc3MoKS5pc1N1cGVyVHlwZU9mKHR5cGUpOwotCQlNYXA8RUNsYXNzLCBPYmplY3Q+IHR5cGVUb0RlZmF1bHRWYWx1ZU1hcCA9IGZlYXR1cmVUb1R5cGVkRGVmYXVsdFZhbHVlc01hcC5nZXQoZmVhdHVyZSk7Ci0JCWlmKHR5cGVUb0RlZmF1bHRWYWx1ZU1hcCAhPSBudWxsKSB7Ci0JCQl0eXBlVG9EZWZhdWx0VmFsdWVNYXAucmVtb3ZlKHR5cGUpOwotCQl9Ci0JCQotCQkvLyBjbGVhciB0eXBlVG9GZWF0dXJlRGVmYXVsdFZhbHVlTWFwIHNvIHRoZSBkZWZhdWx0IHZhbHVlIHdpbGwgYmUgcmVjYWxjdWxhdGVkIGZvciBlYWNoIGNsYXNzCi0JCS8vCi0JCXR5cGVUb0ZlYXR1cmVEZWZhdWx0VmFsdWVNYXAuY2xlYXIoKTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBhc3NpZ25EZWZhdWx0VmFsdWVzKEVPYmplY3QgZU9iamVjdCwgTWFwPEVTdHJ1Y3R1cmFsRmVhdHVyZSwgT2JqZWN0PiBmZWF0dXJlVG9EZWZhdWx0VmFsdWVNYXApIHsKLQkJaWYoZmVhdHVyZVRvRGVmYXVsdFZhbHVlTWFwLmlzRW1wdHkoKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlmb3IgKEl0ZXJhdG9yPE1hcC5FbnRyeTxFU3RydWN0dXJhbEZlYXR1cmUsIE9iamVjdD4+IGl0ZXIgPSBmZWF0dXJlVG9EZWZhdWx0VmFsdWVNYXAKLQkJCQkuZW50cnlTZXQoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU1hcC5FbnRyeTxFU3RydWN0dXJhbEZlYXR1cmUsIE9iamVjdD4gZW50cnkgPSBpdGVyLm5leHQoKTsKLQkJCWVPYmplY3QuZVNldChlbnRyeS5nZXRLZXkoKSwgZW50cnkuZ2V0VmFsdWUoKSk7Ci0JCX0KLQotCX0KLQotCXB1YmxpYyB2b2lkIGFzc2lnbkRlZmF1bHRWYWx1ZXMoRU9iamVjdCBlT2JqZWN0KSB7Ci0JCUVDbGFzcyB0eXBlID0gZU9iamVjdC5lQ2xhc3MoKTsKLQkJTWFwPEVTdHJ1Y3R1cmFsRmVhdHVyZSwgT2JqZWN0PiBmZWF0dXJlVG9TdGF0aWNEZWZhdWx0VmFsdWVNYXAgPSBnZXRGZWF0dXJlVG9TdGF0aWNEZWZhdWx0VmFsdWVNYXAodHlwZSk7Ci0JCWFzc2lnbkRlZmF1bHRWYWx1ZXMoZU9iamVjdCwgZmVhdHVyZVRvU3RhdGljRGVmYXVsdFZhbHVlTWFwKTsKLQkJTWFwPEVTdHJ1Y3R1cmFsRmVhdHVyZSwgT2JqZWN0PiBmZWF0dXJlVG9EZWZhdWx0VmFsdWVNYXAgPSBnZXRGZWF0dXJlVG9EZWZhdWx0VmFsdWVNYXAoZU9iamVjdC5lQ2xhc3MoKSk7Ci0JCWlmKGZlYXR1cmVUb0RlZmF1bHRWYWx1ZU1hcCAhPSBmZWF0dXJlVG9TdGF0aWNEZWZhdWx0VmFsdWVNYXApIHsKLQkJCWFzc2lnbkRlZmF1bHRWYWx1ZXMoZU9iamVjdCwgZmVhdHVyZVRvRGVmYXVsdFZhbHVlTWFwKTsKLQkJfQotCX0KLQkKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvZWNvcmUvdXRpbC9FdmVudFR5cGVzLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2Vjb3JlL3V0aWwvRXZlbnRUeXBlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNjIxNTM2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvZWNvcmUvdXRpbC9FdmVudFR5cGVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci0KLS8qKgotICogRGVmaW5lcyBhZGRpdGlvbmFsIG5vdGlmaWNhdGlvbiBldmVudCB0eXBlcy4KLSAqIDxwPgotICogVGhpcyBjbGFzcyBpcyByZXNlcnZlZCBmb3IgZnV0dXJlIHVzZS4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBFdmVudFR5cGVzIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1BS0VfUFJPWFkgPSBOb3RpZmljYXRpb24uRVZFTlRfVFlQRV9DT1VOVCArIDE7Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvZWNvcmUvdXRpbC9GZWF0dXJlRGVsZWdhdGUuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvZWNvcmUvdXRpbC9GZWF0dXJlRGVsZWdhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODcwY2MyZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2Vjb3JlL3V0aWwvRmVhdHVyZURlbGVnYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25SZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5Db21tb25QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS41Ci0gKgotICovCi1wdWJsaWMgY2xhc3MgRmVhdHVyZURlbGVnYXRlIGltcGxlbWVudHMgSUZlYXR1cmVEZWxlZ2F0ZSB7Ci0JcHVibGljIHN0YXRpYyBPYmplY3QgY3JlYXRlRXh0ZW5zaW9uKFN0cmluZyBuYW1lc3BhY2UsIFN0cmluZyBleHRlbnNpb25Qb2ludE5hbWUpIHsKLQkJLy8gUHJvY2VzcyB0aGUgY29udHJpYnV0b3JzLgotCQkvLwotCQlJRXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpOwotCQlJRXh0ZW5zaW9uUG9pbnQgZXh0ZW5zaW9uUG9pbnQgPSBleHRlbnNpb25SZWdpc3RyeS5nZXRFeHRlbnNpb25Qb2ludChuYW1lc3BhY2UsIGV4dGVuc2lvblBvaW50TmFtZSk7Ci0JCWlmIChleHRlbnNpb25Qb2ludCAhPSBudWxsKSB7Ci0JCQlJRXh0ZW5zaW9uW10gZXh0ZW5zaW9ucyA9IGV4dGVuc2lvblBvaW50LmdldEV4dGVuc2lvbnMoKTsKLQkJCU9iamVjdCBleHQgPSBudWxsOwotCQkJZXh0X3dhbGs6Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGV4dGVuc2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCQlJRXh0ZW5zaW9uIGV4dGVuc2lvbiA9IGV4dGVuc2lvbnNbaV07Ci0JCQkJU3RyaW5nIHBsdWdpbklkID0gZXh0ZW5zaW9uLmdldE5hbWVzcGFjZUlkZW50aWZpZXIoKTsKLQkJCQlCdW5kbGUgYnVuZGxlID0gUGxhdGZvcm0uZ2V0QnVuZGxlKHBsdWdpbklkKTsKLQkJCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjb25maWdFbGVtZW50cyA9IGV4dGVuc2lvbgotCQkJCQkJLmdldENvbmZpZ3VyYXRpb25FbGVtZW50cygpOwotCQkJCWZvciAoaW50IGogPSAwOyBqIDwgY29uZmlnRWxlbWVudHMubGVuZ3RoOyBqKyspIHsKLQkJCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNvbmZpZ0VsZW1lbnQgPSBjb25maWdFbGVtZW50c1tqXTsKLQkJCQkJdHJ5IHsKLQkJCQkJCVN0cmluZyBjbGFzc05hbWUgPSBjb25maWdFbGVtZW50LmdldEF0dHJpYnV0ZSgiY2xhc3MiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJaWYoY2xhc3NOYW1lICE9IG51bGwpIHsKLQkJCQkJCQlleHQgPSBidW5kbGUubG9hZENsYXNzKGNsYXNzTmFtZSkubmV3SW5zdGFuY2UoKTsKLQkJCQkJCQlicmVhayBleHRfd2FsazsKLQkJCQkJCX0KLQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCUNvbW1vblBsdWdpbi5JTlNUQU5DRS5sb2coZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gZXh0OwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSUZlYXR1cmVEZWxlZ2F0ZSBuZXdJbnN0YW5jZSgpIHsKLQkJT2JqZWN0IGV4dCA9IGNyZWF0ZUV4dGVuc2lvbigib3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZSIsICJmZWF0dXJlRGVsZWdhdGUiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWlmKGV4dCBpbnN0YW5jZW9mIElGZWF0dXJlRGVsZWdhdGUpIHsKLQkJCXJldHVybiAoSUZlYXR1cmVEZWxlZ2F0ZSkgZXh0OwotCQl9Ci0JCXJldHVybiBuZXcgRmVhdHVyZURlbGVnYXRlKCk7Ci0JfQotCQotCXByaXZhdGUgRmVhdHVyZURlbGVnYXRlKCkgewotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUudXRpbC5JRmVhdHVyZURlbGVnYXRlI2RlbGVnYXRlR2V0KG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0LCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlKQotCSAqLwotCXB1YmxpYyBPYmplY3QgZGVsZWdhdGVHZXQoRU9iamVjdCBvYmplY3QsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUudXRpbC5JRmVhdHVyZURlbGVnYXRlI2RlbGVnYXRlU2V0KG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0LCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlKQotCSAqLwotCXB1YmxpYyB2b2lkIGRlbGVnYXRlU2V0KEVPYmplY3Qgb2JqZWN0LCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSkgewotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUudXRpbC5JRmVhdHVyZURlbGVnYXRlI2lzRGVsZWdhdGVkKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0LCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRGVsZWdhdGVkKEVPYmplY3Qgb2JqZWN0LCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2Vjb3JlL3V0aWwvSUZlYXR1cmVEZWxlZ2F0ZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9lY29yZS91dGlsL0lGZWF0dXJlRGVsZWdhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzE4NGMwOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2Vjb3JlL3V0aWwvSUZlYXR1cmVEZWxlZ2F0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuNQotICoKLSAqLwotcHVibGljIGludGVyZmFjZSBJRmVhdHVyZURlbGVnYXRlIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIElGZWF0dXJlRGVsZWdhdGUgSU5TVEFOQ0UgPSBGZWF0dXJlRGVsZWdhdGUubmV3SW5zdGFuY2UoKTsKLQkKLQlib29sZWFuIGlzRGVsZWdhdGVkKEVPYmplY3Qgb2JqZWN0LCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSk7Ci0JCi0JT2JqZWN0IGRlbGVnYXRlR2V0KEVPYmplY3Qgb2JqZWN0LCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSk7Ci0JCi0Jdm9pZCBkZWxlZ2F0ZVNldChFT2JqZWN0IG9iamVjdCwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUpOwotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9lY29yZS91dGlsL09wcG9zaXRlRmVhdHVyZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9lY29yZS91dGlsL09wcG9zaXRlRmVhdHVyZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMTQ2MmE1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvZWNvcmUvdXRpbC9PcHBvc2l0ZUZlYXR1cmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxNSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotCi0vKioKLSAqIFN1cHBvcnRzIHRoZSByZXZlcnNlIHRyYXZlcnNhbCBvZiBhbiBhc3NvY2lhdGlvbiBiZXR3ZWVuIHR3byBtb2RlbCBvYmplY3RzLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBPcHBvc2l0ZUZlYXR1cmUgewotCi0JcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLQotCXByaXZhdGUgRVN0cnVjdHVyYWxGZWF0dXJlIHRhcmdldEZlYXR1cmU7Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNNYW55OwotCi0JcHJpdmF0ZSBib29sZWFuIHJlc29sdmVPd25lciA9IHRydWU7Ci0KLQlwcml2YXRlIENsYXNzIG93bmVyQ2xhc3M7Ci0KLQkvL3ByaXZhdGUgc3RhdGljIGJvb2xlYW4gZGVsaXZlck9uUmVzb2x2ZTsKLQotCS8qKgotCSAqIE1hcHMgc291cmNlIG1vZGVsIG9iamVjdHMgdG8gT3Bwb3NpdGVGZWF0dXJlIG9iamVjdHMuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBNYXAgY2xhc3NPcHBvc2l0ZUZlYXR1cmVzTWFwID0gbmV3IEhhc2hNYXAoKTsKLQotCS8qKgotCSAqIE1hcHMgRVN0cnVjdHVyYWxGZWF0dXJlIG9iamVjdHMgdG8gT3Bwb3NpdGVGZWF0dXJlIG9iamVjdHMuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBNYXAgZmVhdHVyZU9wcG9zaXRlRmVhdHVyZU1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqIAotCSAqIEBwYXJhbSBvd25lckNsYXNzCi0JICogICAgICAgICAgICB0aGUgbW9kZWwgY2xhc3MgdGhhdCBvd25zIHRoaXMgb3Bwb3NpdGUgZmVhdHVyZQotCSAqIEBwYXJhbSBuYW1lCi0JICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGlzIG9wcG9zaXRlIGZlYXR1cmUKLQkgKiBAcGFyYW0gdGFyZ2V0RmVhdHVyZQotCSAqICAgICAgICAgICAgdGhlIGZlYXR1cmUgd2hpY2ggdGhpcyBvcHBvc2l0ZSBmZWF0dXJlIGlzIGJhc2VkIG9uCi0JICogQHBhcmFtIGlzTWFueQotCSAqICAgICAgICAgICAgaWYgPHRydWU+LCB0aGUgbXVsdGlwbGljaXR5IG9mIHRoZSBhc3NvY2lhdGlvbiBpcyB1bmJvdW5kZWQKLQkgKiBAcGFyYW0gcmVzb2x2ZU93bmVyCi0JICogICAgICAgICAgICBpZiA8dHJ1ZT4sIHJlc29sdmUgdGhlIG93bmVyIGNsYXNzIGlmIGl0IGlzIGEgcHJveHkKLQkgKi8KLQlwdWJsaWMgT3Bwb3NpdGVGZWF0dXJlKENsYXNzIG93bmVyQ2xhc3MsIFN0cmluZyBuYW1lLAotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIHRhcmdldEZlYXR1cmUsIGJvb2xlYW4gaXNNYW55LAotCQkJYm9vbGVhbiByZXNvbHZlT3duZXIpIHsKLQkJdGhpcy5vd25lckNsYXNzID0gb3duZXJDbGFzczsKLQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJdGhpcy50YXJnZXRGZWF0dXJlID0gdGFyZ2V0RmVhdHVyZTsKLQkJdGhpcy5pc01hbnkgPSBpc01hbnk7Ci0JCXRoaXMucmVzb2x2ZU93bmVyID0gcmVzb2x2ZU93bmVyOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICogCi0JICogQHBhcmFtIG93bmVyQ2xhc3MKLQkgKiAgICAgICAgICAgIHRoZSBtb2RlbCBjbGFzcyB0aGF0IG93bnMgdGhpcyBvcHBvc2l0ZSBmZWF0dXJlCi0JICogQHBhcmFtIG5hbWUKLQkgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoaXMgb3Bwb3NpdGUgZmVhdHVyZQotCSAqIEBwYXJhbSB0YXJnZXRGZWF0dXJlCi0JICogICAgICAgICAgICB0aGUgZmVhdHVyZSB3aGljaCB0aGlzIG9wcG9zaXRlIGZlYXR1cmUgaXMgYmFzZWQgb24KLQkgKiBAcGFyYW0gaXNNYW55Ci0JICogICAgICAgICAgICBpZiA8dHJ1ZT4sIHRoZSBtdWx0aXBsaWNpdHkgb2YgdGhlIGFzc29jaWF0aW9uIGlzIHVuYm91bmRlZAotCSAqLwotCXB1YmxpYyBPcHBvc2l0ZUZlYXR1cmUoQ2xhc3Mgb3duZXJDbGFzcywgU3RyaW5nIG5hbWUsCi0JCQlFU3RydWN0dXJhbEZlYXR1cmUgdGFyZ2V0RmVhdHVyZSwgYm9vbGVhbiBpc01hbnkpIHsKLQkJdGhpcyhvd25lckNsYXNzLCBuYW1lLCB0YXJnZXRGZWF0dXJlLCBpc01hbnksIHRydWUpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIG1vZGFsIGNsYXNzIHRoYXQgb3ducyB0aGlzIG9wcG9zaXRlIGZlYXR1cmUuCi0JICogCi0JICogQHJldHVybiB0aGUgbW9kYWwgY2xhc3MgdGhhdCBvd25zIHRoaXMgb3Bwb3NpdGUgZmVhdHVyZQotCSAqLwotCXB1YmxpYyBDbGFzcyBnZXRPd25lckNsYXNzKCkgewotCQlyZXR1cm4gb3duZXJDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBDaGVja3Mgd2hldGhlciB0aGUgYXNzb2NpYXRpb24gaXMgdW5ib3VuZGVkLgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGFzc29jaWF0aW9uIGlzIHVuYm91bmRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzTWFueSgpIHsKLQkJcmV0dXJuIGlzTWFueTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBuYW1lIG9mIHRoaXMgb3Bwb3NpdGUgZmVhdHVyZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBvcHBvc2l0ZSBmZWF0dXJlIG5hbWUKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBuYW1lOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGZlYXR1cmUgd2hpY2ggdGhpcyBvcHBvc2l0ZSBmZWF0dXJlIGlzIGJhc2VkIG9uLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG9yaWdpbmFsIGZlYXR1cmUgZ2VuZXJhdGVkIGJ5IEVNRgotCSAqLwotCXB1YmxpYyBFU3RydWN0dXJhbEZlYXR1cmUgZ2V0VGFyZ2V0RmVhdHVyZSgpIHsKLQkJcmV0dXJuIHRhcmdldEZlYXR1cmU7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgSUQgb2YgdGhpcyBvcHBvc2l0ZSBmZWF0dXJlLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG9wcG9zaXRlIGZlYXR1cmUgSUQKLQkgKi8KLQlwdWJsaWMgaW50IGdldEZlYXR1cmVJRCgpIHsKLQkJcmV0dXJuIC0xIC0gdGFyZ2V0RmVhdHVyZS5nZXRGZWF0dXJlSUQoKTsKLQl9Ci0KLQkvKioKLQkgKiBDaGVja3Mgd2hldGhlciB0aGUgb3duZXIgY2xhc3Mgb2YgdGhpcyBvcHBvc2l0ZSBmZWF0dXJlLCBpZiBwcm94aWVkLAotCSAqIHNob3VsZCBiZSByZXNvbHZlZCB3aGVuIHRoZSB0YXJnZXQgZmVhdHVyZSBpcyBzZXQuCi0JICogCi0JICogQHJldHVybiA8dHJ1ZT4gaWYgdGhlIG93bmVyIGNsYXNzLCBpZiBwcm94aWVkLCBzaG91bGQgYmUgcmVzb2x2ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiByZXNvbHZlT3duZXIoKSB7Ci0JCXJldHVybiByZXNvbHZlT3duZXI7Ci0JfQotCi0JLyoqCi0JICogR2V0cyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIG9wcG9zaXRlIGZlYXR1cmUuCi0JICogCi0JICogQHJldHVybiBBIDxjb2RlPlN0cmluZzwvY29kZT4gY29udGFpbmluZyB0aGUga2V5IGF0dHJpYnV0ZXMgb2YgdGhpcwotCSAqICAgICAgICAgb3Bwb3NpdGUgZmVhdHVyZS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gbmFtZSArICJbdGFyZ2V0RmVhdHVyZT0iICsgdGFyZ2V0RmVhdHVyZSAvLyROT04tTkxTLTEkCi0JCQkJKyAiLCBpc01hbnk9IiArIGlzTWFueSArICJdIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogUmVnaXN0ZXJzIHRoZSBnaXZlbiBvcHBvc2l0ZSBmZWF0dXJlLgotCSAqIAotCSAqIEBwYXJhbSBvcHBvc2l0ZUZlYXR1cmUKLQkgKiAgICAgICAgICAgIHRoZSBvcHBvc2l0ZSBmZWF0dXJlIHRvIHJlZ2lzdGVyCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCB2b2lkIHJlZ2lzdGVyT3Bwb3NpdGVGZWF0dXJlKAotCQkJT3Bwb3NpdGVGZWF0dXJlIG9wcG9zaXRlRmVhdHVyZSkgewotCQlDbGFzcyBjbHMgPSBvcHBvc2l0ZUZlYXR1cmUuZ2V0T3duZXJDbGFzcygpOwotCQlTZXQgZmVhdHVyZXMgPSAoU2V0KSBjbGFzc09wcG9zaXRlRmVhdHVyZXNNYXAuZ2V0KGNscyk7Ci0JCWlmIChmZWF0dXJlcyA9PSBudWxsKSB7Ci0JCQlmZWF0dXJlcyA9IG5ldyBIYXNoU2V0KCk7Ci0JCQljbGFzc09wcG9zaXRlRmVhdHVyZXNNYXAucHV0KGNscywgZmVhdHVyZXMpOwotCQl9Ci0JCWZlYXR1cmVzLmFkZChvcHBvc2l0ZUZlYXR1cmUpOwotCi0JCWZlYXR1cmVPcHBvc2l0ZUZlYXR1cmVNYXAucHV0KG9wcG9zaXRlRmVhdHVyZS5nZXRUYXJnZXRGZWF0dXJlKCksCi0JCQkJb3Bwb3NpdGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiBDaGVja3Mgd2hldGhlciBub3RpZmljYXRpb24gaXMgc2VudCB3aGVuIGEgcHJveHkgb3duZXIgY2xhc3MgaXMgcmVzb2x2ZWQuCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBub3RpZmljYXRpb24gaXMgYmVpbmcgc2VudCB3aGVuIGEgcHJveHkKLQkgKiAgICAgICAgIG93bmVyIGNsYXNzIGlzIHJlc29sdmVkCi0JICovCi0JLyoKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gaXNEZWxpdmVyT25SZXNvbHZlKCkgewotCQlyZXR1cm4gZGVsaXZlck9uUmVzb2x2ZTsKLQl9Ci0JKi8KLQotCS8qKgotCSAqIEVuYWJsZXMgbm90aWZpY2F0aW9uIHdoZW4gYSBwcm94eSBvd25lciBjbGFzcyBpcyByZXNvbHZlZC4KLQkgKiAKLQkgKiBAcGFyYW0gZW5hYmxlTm90aWZpY2F0aW9uCi0JICogICAgICAgICAgICBpZiA8Y29kZT50cnVlPC9jb2RlPiwgc2VuZCBub3RpZmljYXRpb24gd2hlbiBhIHByb3h5IG93bmVyCi0JICogICAgICAgICAgICBjbGFzcyBpcyByZXNvbHZlZAotCSAqLwotCS8qCi0JcHVibGljIHN0YXRpYyBmaW5hbCB2b2lkIHNldERlbGl2ZXJPblJlc29sdmUoYm9vbGVhbiBlbmFibGVOb3RpZmljYXRpb24pIHsKLQkJZGVsaXZlck9uUmVzb2x2ZSA9IGVuYWJsZU5vdGlmaWNhdGlvbjsKLQl9Ci0JKi8KLQotCS8qKgotCSAqIEdldHMgdGhlIG9wcG9zaXRlIGZlYXR1cmUgZm9yIHRoZSBnaXZlbiBmZWF0dXJlLgotCSAqIAotCSAqIEBwYXJhbSBmZWF0dXJlCi0JICogICAgICAgICAgICBhbiBFTUYgPGNvZGU+RVN0cnVjdHVyYWxGZWF0dXJlPC9jb2RlPiBmZWF0dXJlCi0JICogQHJldHVybiBhbiBvcHBvc2l0ZSBmZWF0dXJlIHRoYXQgaXMgYmFzZWQgb24gdGhlIGdpdmVuIGZlYXR1cmUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIE9wcG9zaXRlRmVhdHVyZSBnZXRPcHBvc2l0ZUZlYXR1cmUoCi0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSkgewotCQlyZXR1cm4gKE9wcG9zaXRlRmVhdHVyZSkgZmVhdHVyZU9wcG9zaXRlRmVhdHVyZU1hcC5nZXQoZmVhdHVyZSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2Vjb3JlL3V0aWwvT3Bwb3NpdGVGZWF0dXJlTm90aWZpY2F0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2Vjb3JlL3V0aWwvT3Bwb3NpdGVGZWF0dXJlTm90aWZpY2F0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyMjFiZTUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9lY29yZS91dGlsL09wcG9zaXRlRmVhdHVyZU5vdGlmaWNhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5Ob3RpZmljYXRpb25JbXBsOwotCi0vKioKLSAqIE5vdGlmaWNhdGlvbiBhc3NvY2lhdGVkIHdpdGggYW4gb3Bwb3NpdGUgZmVhdHVyZS4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIE9wcG9zaXRlRmVhdHVyZU5vdGlmaWNhdGlvbiBleHRlbmRzIE5vdGlmaWNhdGlvbkltcGwgewotCi0JcHJpdmF0ZSBPcHBvc2l0ZUZlYXR1cmUgb3Bwb3NpdGVGZWF0dXJlOwotCi0JcHJpdmF0ZSBPYmplY3Qgbm90aWZpZXI7Ci0KLQkvKioKLQkgKiBAcGFyYW0gZXZlbnRUeXBlCi0JICogICAgICAgICAgICB0aGUgdHlwZSBvZiBldmVudAotCSAqIEBwYXJhbSBvcHBvc2l0ZUZlYXR1cmUKLQkgKiAgICAgICAgICAgIHRoZSBvcHBvc2l0ZSBmZWF0dXJlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIG5vdGlmaWNhdGlvbgotCSAqIEBwYXJhbSBvbGRWYWx1ZQotCSAqICAgICAgICAgICAgdGhlIG9sZCB2YWx1ZQotCSAqIEBwYXJhbSBuZXdWYWx1ZQotCSAqICAgICAgICAgICAgdGhlIG5ldyB2YWx1ZQotCSAqIEBwYXJhbSBwb3NpdGlvbgotCSAqICAgICAgICAgICAgdGhlIHBvc2l0aXRpb24gYXQgd2hpY2ggdGhlIGNoYW5nZSBvY2N1cnJlZAotCSAqIEBwYXJhbSB3YXNTZXQKLQkgKi8KLQlwdWJsaWMgT3Bwb3NpdGVGZWF0dXJlTm90aWZpY2F0aW9uKE9iamVjdCBub3RpZmllciwgaW50IGV2ZW50VHlwZSwKLQkJCU9wcG9zaXRlRmVhdHVyZSBvcHBvc2l0ZUZlYXR1cmUsIE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlLAotCQkJaW50IHBvc2l0aW9uLCBib29sZWFuIHdhc1NldCkgewotCQlzdXBlcihldmVudFR5cGUsIG9sZFZhbHVlLCBuZXdWYWx1ZSwgcG9zaXRpb24sIHdhc1NldCk7Ci0JCXRoaXMubm90aWZpZXIgPSBub3RpZmllcjsKLQkJdGhpcy5vcHBvc2l0ZUZlYXR1cmUgPSBvcHBvc2l0ZUZlYXR1cmU7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgb3Bwb3NpdGUgZmVhdHVyZSB0aGF0IGlzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIG5vdGlmaWNhdGlvbi4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBvcHBvc2l0ZSBmZWF0dXJlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIG5vdGlmaWNhdGlvbgotCSAqLwotCXB1YmxpYyBPcHBvc2l0ZUZlYXR1cmUgZ2V0T3Bwc2l0ZUZlYXR1cmUoKSB7Ci0JCXJldHVybiBvcHBvc2l0ZUZlYXR1cmU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLk5vdGlmaWNhdGlvbkltcGwjZ2V0Tm90aWZpZXIoKQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0Tm90aWZpZXIoKSB7Ci0JCXJldHVybiBub3RpZmllcjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvZWNvcmUvdXRpbC9PcHBvc2l0ZUZlYXR1cmVSZXNvbHZpbmdFTGlzdC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9lY29yZS91dGlsL09wcG9zaXRlRmVhdHVyZVJlc29sdmluZ0VMaXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiNTM0ZmUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9lY29yZS91dGlsL09wcG9zaXRlRmVhdHVyZVJlc29sdmluZ0VMaXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5Ob3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuTm90aWZ5aW5nTGlzdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLmltcGwuTXVsdGlSZXNvdXJjZUVPYmplY3Q7Ci0KLS8qKgotICogQSBsaXN0IGZvciByZXNvbHZpbmcgbXVsdGktdmFsdWVkIG9wcG9zaXRlIGZlYXR1cmVzLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgT3Bwb3NpdGVGZWF0dXJlUmVzb2x2aW5nRUxpc3QgZXh0ZW5kcyBOb3RpZnlpbmdMaXN0SW1wbCB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAzNjkwMTk4NzYzMDAwMDUxNzY4TDsKLQotCXByaXZhdGUgTXVsdGlSZXNvdXJjZUVPYmplY3Qgb3duZXI7Ci0KLQlwcml2YXRlIE9wcG9zaXRlRmVhdHVyZSBvcHBvc2l0ZUZlYXR1cmU7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqIAotCSAqIEBwYXJhbSBvd25lcgotCSAqICAgICAgICAgICAgdGhlIG93bmVyIG9mIGFuIG9wcG9zaXRlIGZlYXR1cmUKLQkgKiBAcGFyYW0gb3Bwb3NpdGVGZWF0dXJlCi0JICogICAgICAgICAgICBhbiBvcHBvc2l0ZSBmZWF0dXJlCi0JICovCi0JcHVibGljIE9wcG9zaXRlRmVhdHVyZVJlc29sdmluZ0VMaXN0KE11bHRpUmVzb3VyY2VFT2JqZWN0IG93bmVyLAotCQkJT3Bwb3NpdGVGZWF0dXJlIG9wcG9zaXRlRmVhdHVyZSkgewotCQlzdXBlcigpOwotCQl0aGlzLm93bmVyID0gb3duZXI7Ci0JCXRoaXMub3Bwb3NpdGVGZWF0dXJlID0gb3Bwb3NpdGVGZWF0dXJlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5Ob3RpZnlpbmdMaXN0SW1wbCNnZXROb3RpZmllcigpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXROb3RpZmllcigpIHsKLQkJcmV0dXJuIG93bmVyOwotCX0KLQotCXByb3RlY3RlZCBFT2JqZWN0IHJlc29sdmVQcm94eShFT2JqZWN0IGVPYmplY3QpIHsKLQkJcmV0dXJuIGVPYmplY3QuZUlzUHJveHkoKSA/IG93bmVyCi0JCQkJLmVSZXNvbHZlUHJveHkoKEludGVybmFsRU9iamVjdCkgZU9iamVjdCkgOiBlT2JqZWN0OwotCX0KLQotCXByb3RlY3RlZCBOb3RpZmljYXRpb25JbXBsIGNyZWF0ZU5vdGlmaWNhdGlvbihpbnQgZXZlbnRUeXBlLAotCQkJT2JqZWN0IG9sZE9iamVjdCwgT2JqZWN0IG5ld09iamVjdCwgaW50IGluZGV4LCBib29sZWFuIHdhc1NldCkgewotCQlyZXR1cm4gbmV3IE9wcG9zaXRlRmVhdHVyZU5vdGlmaWNhdGlvbihvd25lciwgZXZlbnRUeXBlLAotCQkJCW9wcG9zaXRlRmVhdHVyZSwgb2xkT2JqZWN0LCBuZXdPYmplY3QsIGluZGV4LCB3YXNTZXQpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzTm90aWZpY2F0aW9uUmVxdWlyZWQoKSB7Ci0JCXJldHVybiBvd25lci5lTm90aWZpY2F0aW9uUmVxdWlyZWQoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgT2JqZWN0IHJlc29sdmUoaW50IGluZGV4LCBPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmICghKG9iamVjdCBpbnN0YW5jZW9mIEVPYmplY3QpKQotCQkJcmV0dXJuIG9iamVjdDsKLQkJRU9iamVjdCBlT2JqZWN0ID0gKEVPYmplY3QpIG9iamVjdDsKLQkJRU9iamVjdCByZXNvbHZlZCA9IHJlc29sdmVQcm94eShlT2JqZWN0KTsKLQkJaWYgKHJlc29sdmVkICE9IGVPYmplY3QpIHsKLQkJCU9iamVjdCBvbGRPYmplY3QgPSBkYXRhW2luZGV4XTsKLQkJCWFzc2lnbihpbmRleCwgdmFsaWRhdGUoaW5kZXgsIHJlc29sdmVkKSk7Ci0KLQkJCWRpZFNldChpbmRleCwgcmVzb2x2ZWQsIG9sZE9iamVjdCk7Ci0KLQkJCS8vIGlmIChpc05vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQkvLyB7Ci0JCQkvLyBvd25lci5lTm90aWZ5KGNyZWF0ZU5vdGlmaWNhdGlvbihOb3RpZmljYXRpb24uUkVTT0xWRSwgZU9iamVjdCwKLQkJCS8vIHJlc29sdmVkLCBpbmRleCwgZmFsc2UpKTsKLQkJCS8vIH0KLQotCQkJcmV0dXJuIHJlc29sdmVkOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIGVPYmplY3Q7Ci0JCX0KLQotCX0KLQotCXByaXZhdGUgdm9pZCByZW1vdmVEYW5nbGluZ09iamVjdHMoKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGl0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJRU9iamVjdCBvYmogPSAoRU9iamVjdCkgaXRlci5uZXh0KCk7Ci0JCQlpZiAob2JqLmVSZXNvdXJjZSgpID09IG51bGwpIHsKLQkJCQlpdGVyLnJlbW92ZSgpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhbiB1bm1vZGlmaWFibGUgbGlzdCB0aGF0IHN0b3JlcyB0aGUgb3Bwb3NpdGUgZmVhdHVyZSB2YWx1ZXMuCi0JICogCi0JICogQHJldHVybiBhbiB1bm1vZGlmaWFibGUgbGlzdAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFVubW9kaWZpYWJsZUxpc3QoKSB7Ci0JCXJlbW92ZURhbmdsaW5nT2JqZWN0cygpOwotCQlyZXR1cm4gbmV3IFVubW9kaWZpYWJsZUVMaXN0KHNpemUsIGRhdGEpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9lY29yZS91dGlsL3BhY2thZ2UuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvZWNvcmUvdXRpbC9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhZWZlNTEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9lY29yZS91dGlsL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIGltcGxlbWVudGF0aW9uIHN1cHBvcnQgZm9yIHRoZSBVTUEgRWNvcmUgZXh0ZW5zaW9uLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUvdGVtcGxhdGVzL0hlYWRlci5qYXZhamV0aW5jIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS90ZW1wbGF0ZXMvSGVhZGVyLmphdmFqZXRpbmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxMDU2OWIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS90ZW1wbGF0ZXMvSGVhZGVyLmphdmFqZXRpbmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS90ZW1wbGF0ZXMvbW9kZWwvQ2xhc3MuamF2YWpldCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUvdGVtcGxhdGVzL21vZGVsL0NsYXNzLmphdmFqZXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5MWFiZTcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS90ZW1wbGF0ZXMvbW9kZWwvQ2xhc3MuamF2YWpldAorKysgL2Rldi9udWxsCkBAIC0xLDIwMjAgKzAsMCBAQAotPCVAIGpldCBwYWNrYWdlPSJvcmcuZWNsaXBzZS5lbWYuY29kZWdlbi5lY29yZS50ZW1wbGF0ZXMubW9kZWwiIGltcG9ydHM9ImphdmEudXRpbC4qIG9yZy5lY2xpcHNlLmVtZi5jb2RlZ2VuLmVjb3JlLmdlbm1vZGVsLioiIGNsYXNzPSJDbGFzcyIgdmVyc2lvbj0iJElkOiBDbGFzcy5qYXZhamV0LHYgMS4zIDIwMDgvMDUvMDcgMTk6Mzg6NDkgcGxlIEV4cCAkIiAlPgotPCUKLS8qKgotICogPGNvcHlyaWdodD4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoKLSAqIDwvY29weXJpZ2h0PgotICovCi0lPgotPCVmaW5hbCBHZW5DbGFzcyBnZW5DbGFzcyA9IChHZW5DbGFzcykoKE9iamVjdFtdKWFyZ3VtZW50KVswXTsgZmluYWwgR2VuUGFja2FnZSBnZW5QYWNrYWdlID0gZ2VuQ2xhc3MuZ2V0R2VuUGFja2FnZSgpOyBmaW5hbCBHZW5Nb2RlbCBnZW5Nb2RlbD1nZW5QYWNrYWdlLmdldEdlbk1vZGVsKCk7JT4KLTwlZmluYWwgYm9vbGVhbiBpc0ludGVyZmFjZSA9IEJvb2xlYW4uVFJVRS5lcXVhbHMoKChPYmplY3RbXSlhcmd1bWVudClbMV0pOyBmaW5hbCBib29sZWFuIGlzSW1wbGVtZW50YXRpb24gPSBCb29sZWFuLlRSVUUuZXF1YWxzKCgoT2JqZWN0W10pYXJndW1lbnQpWzJdKTslPgotPCVmaW5hbCBTdHJpbmcgcHVibGljU3RhdGljRmluYWxGbGFnID0gaXNJbXBsZW1lbnRhdGlvbiA/ICJwdWJsaWMgc3RhdGljIGZpbmFsICIgOiAiIjslPgotPCVmaW5hbCBTdHJpbmcgc2luZ2xlV2lsZGNhcmQgPSBnZW5Nb2RlbC5nZXRDb21wbGlhbmNlTGV2ZWwoKS5nZXRWYWx1ZSgpID49IEdlbkpES0xldmVsLkpESzUwID8gIjw/PiIgOiAiIjslPgotPCVmaW5hbCBTdHJpbmcgbmVnYXRpdmVPZmZzZXRDb3JyZWN0aW9uID0gZ2VuQ2xhc3MuaGFzT2Zmc2V0Q29ycmVjdGlvbigpID8gIiAtICIgKyBnZW5DbGFzcy5nZXRPZmZzZXRDb3JyZWN0aW9uRmllbGQobnVsbCkgOiAiIjslPgotPCVmaW5hbCBTdHJpbmcgcG9zaXRpdmVPZmZzZXRDb3JyZWN0aW9uID0gZ2VuQ2xhc3MuaGFzT2Zmc2V0Q29ycmVjdGlvbigpID8gIiArICIgKyBnZW5DbGFzcy5nZXRPZmZzZXRDb3JyZWN0aW9uRmllbGQobnVsbCkgOiAiIjslPgotPCVAIGluY2x1ZGUgZmlsZT0iLi4vSGVhZGVyLmphdmFqZXRpbmMiJT4KLTwlaWYgKGlzSW50ZXJmYWNlKSB7JT4KLXBhY2thZ2UgPCU9Z2VuUGFja2FnZS5nZXRJbnRlcmZhY2VQYWNrYWdlTmFtZSgpJT47Ci08JX0gZWxzZSB7JT4KLXBhY2thZ2UgPCU9Z2VuUGFja2FnZS5nZXRDbGFzc1BhY2thZ2VOYW1lKCklPjsKLTwlfSU+Ci0KLTwlZ2VuTW9kZWwubWFya0ltcG9ydExvY2F0aW9uKHN0cmluZ0J1ZmZlciwgZ2VuUGFja2FnZSk7JT4KLQotPCVpZiAoaXNJbnRlcmZhY2UpIHslPgotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+PCU9Z2VuQ2xhc3MuZ2V0Rm9ybWF0dGVkTmFtZSgpJT48L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci08JWlmIChnZW5DbGFzcy5oYXNEb2N1bWVudGF0aW9uKCkpIHslPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogPCU9Z2VuQ2xhc3MuZ2V0RG9jdW1lbnRhdGlvbihnZW5Nb2RlbC5nZXRJbmRlbnRhdGlvbihzdHJpbmdCdWZmZXIpKSU+Ci0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci08JX0lPgotICoKLTwlaWYgKCFnZW5DbGFzcy5nZXRHZW5GZWF0dXJlcygpLmlzRW1wdHkoKSkgeyU+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLTwlZm9yIChHZW5GZWF0dXJlIGdlbkZlYXR1cmUgOiBnZW5DbGFzcy5nZXRHZW5GZWF0dXJlcygpKSB7JT4KLSAgPCVpZiAoIWdlbkZlYXR1cmUuaXNTdXBwcmVzc2VkR2V0VmlzaWJpbGl0eSgpKSB7JT4KLSAqICAgPGxpPntAbGluayA8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRJbnRlcmZhY2VOYW1lKCklPiM8JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPiA8ZW0+PCU9Z2VuRmVhdHVyZS5nZXRGb3JtYXR0ZWROYW1lKCklPjwvZW0+fTwvbGk+Ci0gIDwlfSU+Ci08JX0lPgotICogPC91bD4KLSAqIDwvcD4KLTwlfSU+Ci0gKgotPCVpZiAoIWdlbk1vZGVsLmlzU3VwcHJlc3NFTUZNZXRhRGF0YSgpKSB7JT4KLSAqIEBzZWUgPCU9Z2VuUGFja2FnZS5nZXRRdWFsaWZpZWRQYWNrYWdlSW50ZXJmYWNlTmFtZSgpJT4jZ2V0PCU9Z2VuQ2xhc3MuZ2V0Q2xhc3NpZmllckFjY2Vzc29yTmFtZSgpJT4oKQotPCV9JT4KLTwlaWYgKCFnZW5Nb2RlbC5pc1N1cHByZXNzRU1GTW9kZWxUYWdzKCkpIHsgYm9vbGVhbiBmaXJzdCA9IHRydWU7IGZvciAoU3RyaW5nVG9rZW5pemVyIHN0cmluZ1Rva2VuaXplciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoZ2VuQ2xhc3MuZ2V0TW9kZWxJbmZvKCksICJcblxyIik7IHN0cmluZ1Rva2VuaXplci5oYXNNb3JlVG9rZW5zKCk7ICkgeyBTdHJpbmcgbW9kZWxJbmZvID0gc3RyaW5nVG9rZW5pemVyLm5leHRUb2tlbigpOyBpZiAoZmlyc3QpIHsgZmlyc3QgPSBmYWxzZTslPgotICogQG1vZGVsIDwlPW1vZGVsSW5mbyU+Ci08JX0gZWxzZSB7JT4KLSAqICAgICAgICA8JT1tb2RlbEluZm8lPgotPCV9fSBpZiAoZmlyc3QpIHslPgotICogQG1vZGVsCi08JX19JT4KLTwlaWYgKGdlbkNsYXNzLm5lZWRzUm9vdEV4dGVuZHNJbnRlcmZhY2VFeHRlbmRzVGFnKCkpIHslPgotICogQGV4dGVuZHMgPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKGdlbk1vZGVsLmdldFJvb3RFeHRlbmRzSW50ZXJmYWNlKCkpJT4KLTwlfSU+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLTwlfSBlbHNlIHslPgotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPjwlPWdlbkNsYXNzLmdldEZvcm1hdHRlZE5hbWUoKSU+PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci08JWlmICghZ2VuQ2xhc3MuZ2V0SW1wbGVtZW50ZWRHZW5GZWF0dXJlcygpLmlzRW1wdHkoKSkgeyU+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLTwlZm9yIChHZW5GZWF0dXJlIGdlbkZlYXR1cmUgOiBnZW5DbGFzcy5nZXRJbXBsZW1lbnRlZEdlbkZlYXR1cmVzKCkpIHslPgotICogICA8bGk+e0BsaW5rIDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZENsYXNzTmFtZSgpJT4jPCU9Z2VuRmVhdHVyZS5nZXRHZXRBY2Nlc3NvcigpJT4gPGVtPjwlPWdlbkZlYXR1cmUuZ2V0Rm9ybWF0dGVkTmFtZSgpJT48L2VtPn08L2xpPgotPCV9JT4KLSAqIDwvdWw+Ci08JX0lPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotPCV9JT4KLTwlaWYgKGlzSW1wbGVtZW50YXRpb24pIHslPgotcHVibGljPCVpZiAoZ2VuQ2xhc3MuaXNBYnN0cmFjdCgpKSB7JT4gYWJzdHJhY3Q8JX0lPiBjbGFzcyA8JT1nZW5DbGFzcy5nZXRDbGFzc05hbWUoKSU+PCU9Z2VuQ2xhc3MuZ2V0VHlwZVBhcmFtZXRlcnMoKS50cmltKCklPjwlPWdlbkNsYXNzLmdldENsYXNzRXh0ZW5kcygpJT48JT1nZW5DbGFzcy5nZXRDbGFzc0ltcGxlbWVudHMoKSU+Ci08JX0gZWxzZSB7JT4KLXB1YmxpYyBpbnRlcmZhY2UgPCU9Z2VuQ2xhc3MuZ2V0SW50ZXJmYWNlTmFtZSgpJT48JT1nZW5DbGFzcy5nZXRUeXBlUGFyYW1ldGVycygpLnRyaW0oKSU+PCU9Z2VuQ2xhc3MuZ2V0SW50ZXJmYWNlRXh0ZW5kcygpJT4KLTwlfSU+Ci17Ci08JWlmIChnZW5Nb2RlbC5oYXNDb3B5cmlnaHRGaWVsZCgpKSB7JT4KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQk8JT1wdWJsaWNTdGF0aWNGaW5hbEZsYWclPjwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgiamF2YS5sYW5nLlN0cmluZyIpJT4gY29weXJpZ2h0ID0gPCU9Z2VuTW9kZWwuZ2V0Q29weXJpZ2h0RmllbGRMaXRlcmFsKCklPjs8JT1nZW5Nb2RlbC5nZXROb25OTFMoKSU+Ci0KLTwlfSU+Ci08JWlmIChpc0ltcGxlbWVudGF0aW9uICYmIGdlbk1vZGVsLmdldERyaXZlck51bWJlcigpICE9IG51bGwpIHslPgotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJqYXZhLmxhbmcuU3RyaW5nIiklPiBtb2ZEcml2ZXJOdW1iZXIgPSAiPCU9Z2VuTW9kZWwuZ2V0RHJpdmVyTnVtYmVyKCklPiI7PCU9Z2VuTW9kZWwuZ2V0Tm9uTkxTKCklPgotCi08JX0lPgotPCVpZiAoaXNJbXBsZW1lbnRhdGlvbiAmJiBnZW5DbGFzcy5pc0phdmFJT1NlcmlhbGl6YWJsZSgpKSB7JT4KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotPCV9JT4KLTwlaWYgKGlzSW1wbGVtZW50YXRpb24gJiYgZ2VuTW9kZWwuaXNWaXJ0dWFsRGVsZWdhdGlvbigpKSB7IFN0cmluZyBlVmlydHVhbFZhbHVlc0ZpZWxkID0gZ2VuQ2xhc3MuZ2V0RVZpcnR1YWxWYWx1ZXNGaWVsZCgpOyU+Ci0gIDwlaWYgKGVWaXJ0dWFsVmFsdWVzRmllbGQgIT0gbnVsbCkgeyU+Ci0JLyoqCi0JICogQW4gYXJyYXkgb2Ygb2JqZWN0cyByZXByZXNlbnRpbmcgdGhlIHZhbHVlcyBvZiBub24tcHJpbWl0aXZlIGZlYXR1cmVzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3RbXSA8JT1lVmlydHVhbFZhbHVlc0ZpZWxkJT47Ci0KLSAgPCV9JT4KLSAgPCV7IExpc3Q8U3RyaW5nPiBlVmlydHVhbEluZGV4Qml0RmllbGRzID0gZ2VuQ2xhc3MuZ2V0RVZpcnR1YWxJbmRleEJpdEZpZWxkcyhuZXcgQXJyYXlMaXN0PFN0cmluZz4oKSk7JT4KLSAgICA8JWlmICghZVZpcnR1YWxJbmRleEJpdEZpZWxkcy5pc0VtcHR5KCkpIHslPgotICAgICAgPCVmb3IgKFN0cmluZyBlVmlydHVhbEluZGV4Qml0RmllbGQgOiBlVmlydHVhbEluZGV4Qml0RmllbGRzKSB7JT4KLQkvKioKLQkgKiBBIGJpdCBmaWVsZCByZXByZXNlbnRpbmcgdGhlIGluZGljZXMgb2Ygbm9uLXByaW1pdGl2ZSBmZWF0dXJlIHZhbHVlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgaW50IDwlPWVWaXJ0dWFsSW5kZXhCaXRGaWVsZCU+OwotCi0gICAgICA8JX0lPgotICAgIDwlfSU+Ci0gIDwlfSU+Ci08JX0lPgotPCVpZiAoaXNJbXBsZW1lbnRhdGlvbiAmJiBnZW5DbGFzcy5pc01vZGVsUm9vdCgpICYmIGdlbk1vZGVsLmlzQm9vbGVhbkZsYWdzRW5hYmxlZCgpICYmIGdlbk1vZGVsLmdldEJvb2xlYW5GbGFnc1Jlc2VydmVkQml0cygpID09IC0xKSB7JT4KLQkvKioKLQkgKiBBIHNldCBvZiBiaXQgZmxhZ3MgcmVwcmVzZW50aW5nIHRoZSB2YWx1ZXMgb2YgYm9vbGVhbiBhdHRyaWJ1dGVzIGFuZCB3aGV0aGVyIHVuc2V0dGFibGUgZmVhdHVyZXMgaGF2ZSBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBpbnQgPCU9Z2VuTW9kZWwuZ2V0Qm9vbGVhbkZsYWdzRmllbGQoKSU+ID0gMDsKLQotPCV9JT4KLTwlaWYgKGlzSW1wbGVtZW50YXRpb24gJiYgIWdlbk1vZGVsLmlzUmVmbGVjdGl2ZURlbGVnYXRpb24oKSkgeyU+Ci0gIDwlZm9yIChHZW5GZWF0dXJlIGdlbkZlYXR1cmUgOiBnZW5DbGFzcy5nZXREZWNsYXJlZEZpZWxkR2VuRmVhdHVyZXMoKSkgeyU+Ci08JUAgaW5jbHVkZSBmaWxlPSJDbGFzcy9kZWNsYXJlZEZpZWxkR2VuRmVhdHVyZS5vdmVycmlkZS5qYXZhamV0aW5jIiBmYWlsPSJhbHRlcm5hdGl2ZSIgJT4KLTwlQCBzdGFydCAlPgotICAgIDwlaWYgKGdlbkZlYXR1cmUuaXNMaXN0VHlwZSgpIHx8IGdlbkZlYXR1cmUuaXNSZWZlcmVuY2VUeXBlKCkpIHslPgotICAgICAgPCVpZiAoZ2VuQ2xhc3MuaXNGaWVsZChnZW5GZWF0dXJlKSkgeyU+Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjPCU9Z2VuRmVhdHVyZS5nZXRHZXRBY2Nlc3NvcigpJT4oKSA8ZW0+PCU9Z2VuRmVhdHVyZS5nZXRGb3JtYXR0ZWROYW1lKCklPjwvZW0+fScgPCU9Z2VuRmVhdHVyZS5nZXRGZWF0dXJlS2luZCgpJT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICM8JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIDwlPWdlbkZlYXR1cmUuZ2V0SW1wb3J0ZWRJbnRlcm5hbFR5cGUoZ2VuQ2xhc3MpJT4gPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT47Ci0KLSAgICAgIDwlfSU+Ci0gICAgICA8JWlmIChnZW5Nb2RlbC5pc0FycmF5QWNjZXNzb3JzKCkgJiYgZ2VuRmVhdHVyZS5pc0xpc3RUeXBlKCkgJiYgIWdlbkZlYXR1cmUuaXNGZWF0dXJlTWFwVHlwZSgpICYmICFnZW5GZWF0dXJlLmlzTWFwVHlwZSgpKSB7IFN0cmluZyByYXdMaXN0SXRlbVR5cGUgPSBnZW5GZWF0dXJlLmdldFJhd0xpc3RJdGVtVHlwZSgpOyBpbnQgaW5kZXggPSByYXdMaXN0SXRlbVR5cGUuaW5kZXhPZignWycpOyBTdHJpbmcgaGVhZCA9IHJhd0xpc3RJdGVtVHlwZTsgU3RyaW5nIHRhaWwgPSAiIjsgaWYgKGluZGV4ICE9IC0xKSB7IGhlYWQgPSByYXdMaXN0SXRlbVR5cGUuc3Vic3RyaW5nKDAsIGluZGV4KTsgdGFpbCA9IHJhd0xpc3RJdGVtVHlwZS5zdWJzdHJpbmcoaW5kZXgpOyB9ICU+Ci0JLyoqCi0JICogVGhlIGVtcHR5IHZhbHVlIGZvciB0aGUgJ3tAbGluayAjPCU9Z2VuRmVhdHVyZS5nZXRHZXRBcnJheUFjY2Vzc29yKCklPigpIDxlbT48JT1nZW5GZWF0dXJlLmdldEZvcm1hdHRlZE5hbWUoKSU+PC9lbT59JyBhcnJheSBhY2Nlc3Nvci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgIzwlPWdlbkZlYXR1cmUuZ2V0R2V0QXJyYXlBY2Nlc3NvcigpJT4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICAgICAgICA8JWlmIChnZW5GZWF0dXJlLmdldFF1YWxpZmllZExpc3RJdGVtVHlwZShnZW5DbGFzcykuY29udGFpbnMoIjwiKSkgeyU+Ci0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgICAgIDwlfSU+Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCA8JT1yYXdMaXN0SXRlbVR5cGUlPltdIDwlPWdlbkZlYXR1cmUuZ2V0VXBwZXJOYW1lKCklPl9FRU1QVFlfQVJSQVkgPSBuZXcgPCU9aGVhZCU+IFswXTwlPXRhaWwlPjsKLQotICAgICAgPCV9JT4KLSAgICA8JX0gZWxzZSB7JT4KLSAgICAgIDwlaWYgKGdlbkZlYXR1cmUuaGFzRURlZmF1bHQoKSAmJiAoIWdlbkZlYXR1cmUuaXNWb2xhdGlsZSgpIHx8ICFnZW5Nb2RlbC5pc1JlZmxlY3RpdmVEZWxlZ2F0aW9uKCkgJiYgKCFnZW5GZWF0dXJlLmhhc0RlbGVnYXRlRmVhdHVyZSgpIHx8ICFnZW5GZWF0dXJlLmlzVW5zZXR0YWJsZSgpKSkpIHsgU3RyaW5nIHN0YXRpY0RlZmF1bHRWYWx1ZSA9IGdlbkZlYXR1cmUuZ2V0U3RhdGljRGVmYXVsdFZhbHVlKCk7JT4KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjPCU9Z2VuRmVhdHVyZS5nZXRHZXRBY2Nlc3NvcigpJT4oKSA8ZW0+PCU9Z2VuRmVhdHVyZS5nZXRGb3JtYXR0ZWROYW1lKCklPjwvZW0+fScgPCU9Z2VuRmVhdHVyZS5nZXRGZWF0dXJlS2luZCgpJT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICM8JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gICAgICAgIDwlaWYgKGdlbk1vZGVsLnVzZUdlbmVyaWNzKCkgJiYgZ2VuRmVhdHVyZS5pc0xpc3REYXRhVHlwZSgpICYmIGdlbkZlYXR1cmUuaXNTZXREZWZhdWx0VmFsdWUoKSkgeyU+Ci0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgICAgIDwlfSU+Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCA8JT1nZW5GZWF0dXJlLmdldEltcG9ydGVkVHlwZShnZW5DbGFzcyklPiA8JT1nZW5GZWF0dXJlLmdldEVEZWZhdWx0KCklPjwlaWYgKCIiLmVxdWFscyhzdGF0aWNEZWZhdWx0VmFsdWUpKSB7JT47IC8vIFRPRE8gVGhlIGRlZmF1bHQgdmFsdWUgbGl0ZXJhbCAiPCU9Z2VuRmVhdHVyZS5nZXRFY29yZUZlYXR1cmUoKS5nZXREZWZhdWx0VmFsdWVMaXRlcmFsKCklPiIgaXMgbm90IHZhbGlkLjwlfSBlbHNlIHslPiA9IDwlPXN0YXRpY0RlZmF1bHRWYWx1ZSU+OzwlPWdlbk1vZGVsLmdldE5vbk5MUyhzdGF0aWNEZWZhdWx0VmFsdWUpJT48JX0lPgotCi0gICAgICA8JX0lPgotICAgICAgPCVpZiAoZ2VuQ2xhc3MuaXNGaWVsZChnZW5GZWF0dXJlKSkgeyU+Ci0gICAgICAgIDwlaWYgKGdlbkNsYXNzLmlzRmxhZyhnZW5GZWF0dXJlKSkgeyU+Ci0gICAgICAgICAgPCVpZiAoZ2VuQ2xhc3MuZ2V0RmxhZ0luZGV4KGdlbkZlYXR1cmUpID4gMzEgJiYgZ2VuQ2xhc3MuZ2V0RmxhZ0luZGV4KGdlbkZlYXR1cmUpICUgMzIgPT0gMCkgeyU+Ci0JLyoqCi0JICogQW4gYWRkaXRpb25hbCBzZXQgb2YgYml0IGZsYWdzIHJlcHJlc2VudGluZyB0aGUgdmFsdWVzIG9mIGJvb2xlYW4gYXR0cmlidXRlcyBhbmQgd2hldGhlciB1bnNldHRhYmxlIGZlYXR1cmVzIGhhdmUgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgaW50IDwlPWdlbkNsYXNzLmdldEZsYWdzRmllbGQoZ2VuRmVhdHVyZSklPiA9IDA7Ci0KLSAgICAgICAgICA8JX0lPgotCS8qKgotCSAqIFRoZSBmbGFnIHJlcHJlc2VudGluZyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgIzwlPWdlbkZlYXR1cmUuZ2V0R2V0QWNjZXNzb3IoKSU+KCkgPGVtPjwlPWdlbkZlYXR1cmUuZ2V0Rm9ybWF0dGVkTmFtZSgpJT48L2VtPn0nIDwlPWdlbkZlYXR1cmUuZ2V0RmVhdHVyZUtpbmQoKSU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjPCU9Z2VuRmVhdHVyZS5nZXRHZXRBY2Nlc3NvcigpJT4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IDwlPWdlbkZlYXR1cmUuZ2V0VXBwZXJOYW1lKCklPl9FRkxBRyA9IDEgPCU9Ijw8ICIgKyBnZW5DbGFzcy5nZXRGbGFnSW5kZXgoZ2VuRmVhdHVyZSkgJSAzMiAlPjsKLQotICAgICAgICA8JX0gZWxzZSB7JT4KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICM8JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPigpIDxlbT48JT1nZW5GZWF0dXJlLmdldEZvcm1hdHRlZE5hbWUoKSU+PC9lbT59JyA8JT1nZW5GZWF0dXJlLmdldEZlYXR1cmVLaW5kKCklPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgIzwlPWdlbkZlYXR1cmUuZ2V0R2V0QWNjZXNzb3IoKSU+KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgPCU9Z2VuRmVhdHVyZS5nZXRJbXBvcnRlZFR5cGUoZ2VuQ2xhc3MpJT4gPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT48JWlmIChnZW5GZWF0dXJlLmhhc0VEZWZhdWx0KCkpIHslPiA9IDwlPWdlbkZlYXR1cmUuZ2V0RURlZmF1bHQoKSU+PCV9JT47Ci0KLSAgICAgICAgPCV9JT4KLSAgICAgIDwlfSU+Ci0gICAgPCV9JT4KLSAgICA8JWlmIChnZW5DbGFzcy5pc0VTZXRGaWVsZChnZW5GZWF0dXJlKSkgeyU+Ci0gICAgICA8JWlmIChnZW5DbGFzcy5pc0VTZXRGbGFnKGdlbkZlYXR1cmUpKSB7JT4KLSAgICAgICAgPCVpZiAoZ2VuQ2xhc3MuZ2V0RVNldEZsYWdJbmRleChnZW5GZWF0dXJlKSA+IDMxICYmIGdlbkNsYXNzLmdldEVTZXRGbGFnSW5kZXgoZ2VuRmVhdHVyZSkgJSAzMiA9PSAwKSB7JT4KLQkvKioKLQkgKiBBbiBhZGRpdGlvbmFsIHNldCBvZiBiaXQgZmxhZ3MgcmVwcmVzZW50aW5nIHRoZSB2YWx1ZXMgb2YgYm9vbGVhbiBhdHRyaWJ1dGVzIGFuZCB3aGV0aGVyIHVuc2V0dGFibGUgZmVhdHVyZXMgaGF2ZSBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBpbnQgPCU9Z2VuQ2xhc3MuZ2V0RVNldEZsYWdzRmllbGQoZ2VuRmVhdHVyZSklPiA9IDA7Ci0KLSAgICAgICAgPCV9JT4KLQkvKioKLQkgKiBUaGUgZmxhZyByZXByZXNlbnRpbmcgd2hldGhlciB0aGUgPCU9Z2VuRmVhdHVyZS5nZXRGb3JtYXR0ZWROYW1lKCklPiA8JT1nZW5GZWF0dXJlLmdldEZlYXR1cmVLaW5kKCklPiBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCA8JT1nZW5GZWF0dXJlLmdldFVwcGVyTmFtZSgpJT5fRVNFVEZMQUcgPSAxIDwlPSI8PCAiICsgZ2VuQ2xhc3MuZ2V0RVNldEZsYWdJbmRleChnZW5GZWF0dXJlKSAlIDMyICU+OwotCi0gICAgICA8JX0gZWxzZSB7JT4KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIDwlPWdlbkZlYXR1cmUuZ2V0Rm9ybWF0dGVkTmFtZSgpJT4gPCU9Z2VuRmVhdHVyZS5nZXRGZWF0dXJlS2luZCgpJT4gaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gPCU9Z2VuRmVhdHVyZS5nZXRVbmNhcE5hbWUoKSU+RVNldDsKLQotICAgICAgPCV9JT4KLSAgICA8JX0lPgotICA8JX0lPgotPCVAIGluY2x1ZGUgZmlsZT0iQ2xhc3MvZGVjbGFyZWRGaWVsZEdlbkZlYXR1cmUuaW5zZXJ0LmphdmFqZXRpbmMiIGZhaWw9InNpbGVudCIgJT4KLTwlQCBlbmQgJT48JS8vQ2xhc3MvZGVjbGFyZWRGaWVsZEdlbkZlYXR1cmUub3ZlcnJpZGUuamF2YWpldGluYyU+Ci08JX0lPgotPCVpZiAoaXNJbXBsZW1lbnRhdGlvbiAmJiBnZW5DbGFzcy5oYXNPZmZzZXRDb3JyZWN0aW9uKCkgJiYgIWdlbkNsYXNzLmdldEltcGxlbWVudGVkR2VuRmVhdHVyZXMoKS5pc0VtcHR5KCkpIHslPgotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCA8JT1nZW5DbGFzcy5nZXRPZmZzZXRDb3JyZWN0aW9uRmllbGQobnVsbCklPiA9IDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZENsYXNzaWZpZXJBY2Nlc3NvcigpJT4uZ2V0RmVhdHVyZUlEKDwlPWdlbkNsYXNzLmdldEltcGxlbWVudGVkR2VuRmVhdHVyZXMoKS5nZXQoMCkuZ2V0UXVhbGlmaWVkRmVhdHVyZUFjY2Vzc29yKCklPikgLSA8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuQ2xhc3MuZ2V0SW1wbGVtZW50ZWRHZW5GZWF0dXJlcygpLmdldCgwKSklPjsKLQotPCV9JT4KLTwlaWYgKGlzSW1wbGVtZW50YXRpb24gJiYgZ2VuQ2xhc3MuaGFzT2Zmc2V0Q29ycmVjdGlvbigpICYmICFnZW5Nb2RlbC5pc1JlZmxlY3RpdmVEZWxlZ2F0aW9uKCkpIHslPgotICA8JWZvciAoR2VuRmVhdHVyZSBnZW5GZWF0dXJlIDogZ2VuQ2xhc3MuZ2V0SW1wbGVtZW50ZWRHZW5GZWF0dXJlcygpKSB7IEdlbkZlYXR1cmUgcmV2ZXJzZUZlYXR1cmUgPSBnZW5GZWF0dXJlLmdldFJldmVyc2UoKTslPgotICAgIDwlaWYgKHJldmVyc2VGZWF0dXJlICE9IG51bGwgJiYgcmV2ZXJzZUZlYXR1cmUuZ2V0R2VuQ2xhc3MoKS5oYXNPZmZzZXRDb3JyZWN0aW9uKCkpIHslPgotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCA8JT1nZW5DbGFzcy5nZXRPZmZzZXRDb3JyZWN0aW9uRmllbGQoZ2VuRmVhdHVyZSklPiA9IDwlPXJldmVyc2VGZWF0dXJlLmdldEdlbkNsYXNzKCkuZ2V0UXVhbGlmaWVkQ2xhc3NpZmllckFjY2Vzc29yKCklPi5nZXRGZWF0dXJlSUQoPCU9cmV2ZXJzZUZlYXR1cmUuZ2V0UXVhbGlmaWVkRmVhdHVyZUFjY2Vzc29yKCklPikgLSA8JT1yZXZlcnNlRmVhdHVyZS5nZXRHZW5DbGFzcygpLmdldFF1YWxpZmllZEZlYXR1cmVJRChyZXZlcnNlRmVhdHVyZSklPjsKLQotICAgIDwlfSU+Ci0gIDwlfSU+Ci08JX0lPgotPCVpZiAoaXNJbXBsZW1lbnRhdGlvbikgeyU+Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JPCVpZiAoZ2VuTW9kZWwuaXNQdWJsaWNDb25zdHJ1Y3RvcnMoKSkgeyU+cHVibGljPCV9IGVsc2UgeyU+cHJvdGVjdGVkPCV9JT4gPCU9Z2VuQ2xhc3MuZ2V0Q2xhc3NOYW1lKCklPigpCi0JewotCQlzdXBlcigpOwotICA8JWZvciAoR2VuRmVhdHVyZSBnZW5GZWF0dXJlIDogZ2VuQ2xhc3MuZ2V0RmxhZ0dlbkZlYXR1cmVzKCJ0cnVlIikpIHslPgotCQk8JT1nZW5DbGFzcy5nZXRGbGFnc0ZpZWxkKGdlbkZlYXR1cmUpJT4gfD0gPCU9Z2VuRmVhdHVyZS5nZXRVcHBlck5hbWUoKSU+X0VGTEFHOwotICA8JX0lPgotICAKLSAvL1VNQS0tPgotIAkJcmVhc3NpZ25EZWZhdWx0VmFsdWVzKCk7Ci0gLy9VTUE8LS0gIAotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICA8JWlmIChnZW5Nb2RlbC51c2VDbGFzc092ZXJyaWRlQW5ub3RhdGlvbigpKSB7JT4KLQlAT3ZlcnJpZGUKLSAgPCV9JT4KLQlwcm90ZWN0ZWQgPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzIiklPiBlU3RhdGljQ2xhc3MoKQotCXsKLQkJcmV0dXJuIDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZENsYXNzaWZpZXJBY2Nlc3NvcigpJT47Ci0JfQotCi08JX0lPgotPCVAIGluY2x1ZGUgZmlsZT0iQ2xhc3MvcmVmbGVjdGl2ZURlbGVnYXRpb24ub3ZlcnJpZGUuamF2YWpldGluYyIgZmFpbD0iYWx0ZXJuYXRpdmUiICU+Ci08JUAgc3RhcnQgJT4KLTwlaWYgKGlzSW1wbGVtZW50YXRpb24gJiYgZ2VuTW9kZWwuZ2V0RmVhdHVyZURlbGVnYXRpb24oKSA9PSBHZW5EZWxlZ2F0aW9uS2luZC5SRUZMRUNUSVZFX0xJVEVSQUwgJiYgKGdlbkNsYXNzLmdldENsYXNzRXh0ZW5kc0dlbkNsYXNzKCkgPT0gbnVsbCB8fCBnZW5DbGFzcy5nZXRDbGFzc0V4dGVuZHNHZW5DbGFzcygpLmdldEdlbk1vZGVsKCkuZ2V0RmVhdHVyZURlbGVnYXRpb24oKSAhPSBHZW5EZWxlZ2F0aW9uS2luZC5SRUZMRUNUSVZFX0xJVEVSQUwpKSB7JT4KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgPCVpZiAoZ2VuTW9kZWwudXNlQ2xhc3NPdmVycmlkZUFubm90YXRpb24oKSkgeyU+Ci0JQE92ZXJyaWRlCi0gIDwlfSU+Ci0JcHJvdGVjdGVkIGludCBlU3RhdGljRmVhdHVyZUNvdW50KCkKLQl7Ci0JCXJldHVybiA8JT1nZW5DbGFzcy5nZXRDbGFzc0V4dGVuZHNHZW5DbGFzcygpID09IG51bGwgPyAwIDogZ2VuQ2xhc3MuZ2V0Q2xhc3NFeHRlbmRzR2VuQ2xhc3MoKS5nZXRBbGxHZW5GZWF0dXJlcygpLnNpemUoKSU+OwotCX0KLQotPCV9JT4KLTwlQCBlbmQgJT48JS8vQ2xhc3MvcmVmbGVjdGl2ZURlbGVnYXRpb24ub3ZlcnJpZGUuamF2YWpldGluYyU+Ci08JW5ldyBSdW5uYWJsZSgpIHsgcHVibGljIHZvaWQgcnVuKCkgeyU+Ci08JWZvciAoR2VuRmVhdHVyZSBnZW5GZWF0dXJlIDogKGlzSW1wbGVtZW50YXRpb24gPyBnZW5DbGFzcy5nZXRJbXBsZW1lbnRlZEdlbkZlYXR1cmVzKCkgOiBnZW5DbGFzcy5nZXREZWNsYXJlZEdlbkZlYXR1cmVzKCkpKSB7JT4KLTwlQCBpbmNsdWRlIGZpbGU9IkNsYXNzL2dlbkZlYXR1cmUub3ZlcnJpZGUuamF2YWpldGluYyIgZmFpbD0iYWx0ZXJuYXRpdmUiICU+Ci08JUAgc3RhcnQgJT4KLSAgPCVpZiAoZ2VuTW9kZWwuaXNBcnJheUFjY2Vzc29ycygpICYmIGdlbkZlYXR1cmUuaXNMaXN0VHlwZSgpICYmICFnZW5GZWF0dXJlLmlzRmVhdHVyZU1hcFR5cGUoKSAmJiAhZ2VuRmVhdHVyZS5pc01hcFR5cGUoKSkgeyU+Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgPCVpZiAoIWlzSW1wbGVtZW50YXRpb24pIHslPgotCTwlPWdlbkZlYXR1cmUuZ2V0TGlzdEl0ZW1UeXBlKGdlbkNsYXNzKSU+W10gPCU9Z2VuRmVhdHVyZS5nZXRHZXRBcnJheUFjY2Vzc29yKCklPigpOwotCi0gICAgPCV9IGVsc2UgeyU+Ci0gICAgICA8JWlmIChnZW5Nb2RlbC51c2VHZW5lcmljcygpKSB7JT4KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLSAgICAgIDwlfSU+Ci0JcHVibGljIDwlPWdlbkZlYXR1cmUuZ2V0TGlzdEl0ZW1UeXBlKGdlbkNsYXNzKSU+W10gPCU9Z2VuRmVhdHVyZS5nZXRHZXRBcnJheUFjY2Vzc29yKCklPigpCi0JewotICAgICAgPCVpZiAoZ2VuRmVhdHVyZS5pc1ZvbGF0aWxlKCkpIHslPgotCQk8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5CYXNpY0VMaXN0IiklPjwlPWdlbkZlYXR1cmUuZ2V0TGlzdFRlbXBsYXRlQXJndW1lbnRzKGdlbkNsYXNzKSU+IGxpc3QgPSAoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQmFzaWNFTGlzdCIpJT48JT1nZW5GZWF0dXJlLmdldExpc3RUZW1wbGF0ZUFyZ3VtZW50cyhnZW5DbGFzcyklPik8JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPigpOwotCQlpZiAobGlzdC5pc0VtcHR5KCkpIHJldHVybiA8JWlmIChnZW5Nb2RlbC51c2VHZW5lcmljcygpICYmICFnZW5GZWF0dXJlLmdldExpc3RJdGVtVHlwZShnZW5DbGFzcykuY29udGFpbnMoIjwiKSAmJiAhZ2VuRmVhdHVyZS5nZXRMaXN0SXRlbVR5cGUobnVsbCkuZXF1YWxzKGdlbkZlYXR1cmUuZ2V0TGlzdEl0ZW1UeXBlKGdlbkNsYXNzKSkpIHslPig8JT1nZW5GZWF0dXJlLmdldExpc3RJdGVtVHlwZShnZW5DbGFzcyklPltdKTwlfSU+PCU9Z2VuRmVhdHVyZS5nZXRVcHBlck5hbWUoKSU+X0VFTVBUWV9BUlJBWTsKLSAgICAgIDwlfSBlbHNlIHslPgotCQlpZiAoPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4gPT0gbnVsbCB8fCA8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPi5pc0VtcHR5KCkpIHJldHVybiA8JWlmIChnZW5Nb2RlbC51c2VHZW5lcmljcygpICYmICFnZW5GZWF0dXJlLmdldExpc3RJdGVtVHlwZShnZW5DbGFzcykuY29udGFpbnMoIjwiKSAmJiAhZ2VuRmVhdHVyZS5nZXRMaXN0SXRlbVR5cGUobnVsbCkuZXF1YWxzKGdlbkZlYXR1cmUuZ2V0TGlzdEl0ZW1UeXBlKGdlbkNsYXNzKSkpIHslPig8JT1nZW5GZWF0dXJlLmdldExpc3RJdGVtVHlwZShnZW5DbGFzcyklPltdKTwlfSU+PCU9Z2VuRmVhdHVyZS5nZXRVcHBlck5hbWUoKSU+X0VFTVBUWV9BUlJBWTsKLQkJPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQmFzaWNFTGlzdCIpJT48JT1nZW5GZWF0dXJlLmdldExpc3RUZW1wbGF0ZUFyZ3VtZW50cyhnZW5DbGFzcyklPiBsaXN0ID0gKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkJhc2ljRUxpc3QiKSU+PCU9Z2VuRmVhdHVyZS5nZXRMaXN0VGVtcGxhdGVBcmd1bWVudHMoZ2VuQ2xhc3MpJT4pPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT47Ci0gICAgICA8JX0lPgotCQlsaXN0LnNocmluaygpOwotCQlyZXR1cm4gKDwlPWdlbkZlYXR1cmUuZ2V0TGlzdEl0ZW1UeXBlKGdlbkNsYXNzKSU+W10pbGlzdC5kYXRhKCk7Ci0JfQotCi0gICAgPCV9JT4KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICA8JWlmICghaXNJbXBsZW1lbnRhdGlvbikgeyU+Ci0JPCU9Z2VuRmVhdHVyZS5nZXRMaXN0SXRlbVR5cGUoZ2VuQ2xhc3MpJT4gZ2V0PCU9Z2VuRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+KGludCBpbmRleCk7Ci0KLSAgICA8JX0gZWxzZSB7JT4KLQlwdWJsaWMgPCU9Z2VuRmVhdHVyZS5nZXRMaXN0SXRlbVR5cGUoZ2VuQ2xhc3MpJT4gZ2V0PCU9Z2VuRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+KGludCBpbmRleCkKLQl7Ci0JCXJldHVybiA8JWlmICghZ2VuTW9kZWwudXNlR2VuZXJpY3MoKSkgeyU+KDwlPWdlbkZlYXR1cmUuZ2V0TGlzdEl0ZW1UeXBlKGdlbkNsYXNzKSU+KTwlfSU+PCU9Z2VuRmVhdHVyZS5nZXRHZXRBY2Nlc3NvcigpJT4oKS5nZXQoaW5kZXgpOwotCX0KLQotICAgIDwlfSU+Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgPCVpZiAoIWlzSW1wbGVtZW50YXRpb24pIHslPgotCWludCBnZXQ8JT1nZW5GZWF0dXJlLmdldEFjY2Vzc29yTmFtZSgpJT5MZW5ndGgoKTsKLQotICAgIDwlfSBlbHNlIHslPgotCXB1YmxpYyBpbnQgZ2V0PCU9Z2VuRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+TGVuZ3RoKCkKLQl7Ci0gICAgICA8JWlmIChnZW5GZWF0dXJlLmlzVm9sYXRpbGUoKSkgeyU+Ci0JCXJldHVybiA8JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPigpLnNpemUoKTsKLSAgICAgIDwlfSBlbHNlIHslPgotCQlyZXR1cm4gPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4gPT0gbnVsbCA/IDAgOiA8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPi5zaXplKCk7Ci0gICAgICA8JX0lPgotCX0KLQotICAgIDwlfSU+Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgPCVpZiAoIWlzSW1wbGVtZW50YXRpb24pIHslPgotCXZvaWQgc2V0PCU9Z2VuRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+KDwlPWdlbkZlYXR1cmUuZ2V0TGlzdEl0ZW1UeXBlKGdlbkNsYXNzKSU+W10gbmV3PCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPik7Ci0KLSAgICA8JX0gZWxzZSB7JT4KLQlwdWJsaWMgdm9pZCBzZXQ8JT1nZW5GZWF0dXJlLmdldEFjY2Vzc29yTmFtZSgpJT4oPCU9Z2VuRmVhdHVyZS5nZXRMaXN0SXRlbVR5cGUoZ2VuQ2xhc3MpJT5bXSBuZXc8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+KQotCXsKLQkJKCg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5CYXNpY0VMaXN0IiklPjwlPWdlbkZlYXR1cmUuZ2V0TGlzdFRlbXBsYXRlQXJndW1lbnRzKGdlbkNsYXNzKSU+KTwlPWdlbkZlYXR1cmUuZ2V0R2V0QWNjZXNzb3IoKSU+KCkpLnNldERhdGEobmV3PCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPi5sZW5ndGgsIG5ldzwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4pOwotCX0KLQotICAgIDwlfSU+Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgPCVpZiAoIWlzSW1wbGVtZW50YXRpb24pIHslPgotCXZvaWQgc2V0PCU9Z2VuRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+KGludCBpbmRleCwgPCU9Z2VuRmVhdHVyZS5nZXRMaXN0SXRlbVR5cGUoZ2VuQ2xhc3MpJT4gZWxlbWVudCk7Ci0KLSAgICA8JX0gZWxzZSB7JT4KLQlwdWJsaWMgdm9pZCBzZXQ8JT1nZW5GZWF0dXJlLmdldEFjY2Vzc29yTmFtZSgpJT4oaW50IGluZGV4LCA8JT1nZW5GZWF0dXJlLmdldExpc3RJdGVtVHlwZShnZW5DbGFzcyklPiBlbGVtZW50KQotCXsKLQkJPCU9Z2VuRmVhdHVyZS5nZXRHZXRBY2Nlc3NvcigpJT4oKS5zZXQoaW5kZXgsIGVsZW1lbnQpOwotCX0KLQotICAgIDwlfSU+Ci0gIDwlfSU+Ci0gIDwlaWYgKGdlbkZlYXR1cmUuaXNHZXQoKSAmJiAoaXNJbXBsZW1lbnRhdGlvbiB8fCAhZ2VuRmVhdHVyZS5pc1N1cHByZXNzZWRHZXRWaXNpYmlsaXR5KCkpKSB7JT4KLTwlQCBpbmNsdWRlIGZpbGU9IkNsYXNzL2dldEdlbkZlYXR1cmUub3ZlcnJpZGUuamF2YWpldGluYyIgZmFpbD0iYWx0ZXJuYXRpdmUiICU+Ci08JUAgc3RhcnQgJT4KLTwlaWYgKGlzSW50ZXJmYWNlKSB7JT4KLTwlQCBpbmNsdWRlIGZpbGU9IkNsYXNzL2dldEdlbkZlYXR1cmUuamF2YWRvYy5vdmVycmlkZS5qYXZhamV0aW5jIiBmYWlsPSJhbHRlcm5hdGl2ZSIgJT4KLTwlQCBzdGFydCAlPgotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPjwlPWdlbkZlYXR1cmUuZ2V0Rm9ybWF0dGVkTmFtZSgpJT48L2I+PC9lbT4nIDwlPWdlbkZlYXR1cmUuZ2V0RmVhdHVyZUtpbmQoKSU+LgotICAgIDwlaWYgKGdlbkZlYXR1cmUuaXNMaXN0VHlwZSgpKSB7JT4KLSAgICAgIDwlaWYgKGdlbkZlYXR1cmUuaXNNYXBUeXBlKCkpIHsgR2VuRmVhdHVyZSBrZXlGZWF0dXJlID0gZ2VuRmVhdHVyZS5nZXRNYXBFbnRyeVR5cGVHZW5DbGFzcygpLmdldE1hcEVudHJ5S2V5RmVhdHVyZSgpOyBHZW5GZWF0dXJlIHZhbHVlRmVhdHVyZSA9IGdlbkZlYXR1cmUuZ2V0TWFwRW50cnlUeXBlR2VuQ2xhc3MoKS5nZXRNYXBFbnRyeVZhbHVlRmVhdHVyZSgpOyAlPgotCSAqIFRoZSBrZXkgaXMgb2YgdHlwZSA8JWlmIChrZXlGZWF0dXJlLmlzTGlzdFR5cGUoKSkgeyU+bGlzdCBvZiB7QGxpbmsgPCU9a2V5RmVhdHVyZS5nZXRRdWFsaWZpZWRMaXN0SXRlbVR5cGUoZ2VuQ2xhc3MpJT59PCV9IGVsc2UgeyU+e0BsaW5rIDwlPWtleUZlYXR1cmUuZ2V0VHlwZShnZW5DbGFzcyklPn08JX0lPiwKLQkgKiBhbmQgdGhlIHZhbHVlIGlzIG9mIHR5cGUgPCVpZiAodmFsdWVGZWF0dXJlLmlzTGlzdFR5cGUoKSkgeyU+bGlzdCBvZiB7QGxpbmsgPCU9dmFsdWVGZWF0dXJlLmdldFF1YWxpZmllZExpc3RJdGVtVHlwZShnZW5DbGFzcyklPn08JX0gZWxzZSB7JT57QGxpbmsgPCU9dmFsdWVGZWF0dXJlLmdldFR5cGUoZ2VuQ2xhc3MpJT59PCV9JT4sCi0gICAgICA8JX0gZWxzZSBpZiAoIWdlbkZlYXR1cmUuaXNXcmFwcGVkRmVhdHVyZU1hcFR5cGUoKSAmJiAhKGdlbk1vZGVsLmlzU3VwcHJlc3NFTUZNZXRhRGF0YSgpICYmICJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCIuZXF1YWxzKGdlbkZlYXR1cmUuZ2V0UXVhbGlmaWVkTGlzdEl0ZW1UeXBlKGdlbkNsYXNzKSkpKSB7Ci1TdHJpbmcgdHlwZU5hbWUgPSBnZW5GZWF0dXJlLmdldFF1YWxpZmllZExpc3RJdGVtVHlwZShnZW5DbGFzcyk7IFN0cmluZyBoZWFkID0gdHlwZU5hbWU7IFN0cmluZyB0YWlsID0gIiI7IGludCBpbmRleCA9IHR5cGVOYW1lLmluZGV4T2YoJzwnKTsgaWYgKGluZGV4ID09IC0xKSB7IGluZGV4ID0gdHlwZU5hbWUuaW5kZXhPZignWycpOyB9IAotaWYgKGluZGV4ICE9IC0xKSB7IGhlYWQgPSB0eXBlTmFtZS5zdWJzdHJpbmcoMCwgaW5kZXgpOyB0YWlsID0gdHlwZU5hbWUuc3Vic3RyaW5nKGluZGV4KS5yZXBsYWNlQWxsKCI8IiwgIiZsdDsiKTsgfQotJT4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgPCU9aGVhZCU+fTwlPXRhaWwlPi4KLSAgICAgIDwlfSU+Ci0gICAgPCV9IGVsc2UgaWYgKGdlbkZlYXR1cmUuaXNTZXREZWZhdWx0VmFsdWUoKSkgeyU+Ci0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+PCU9Z2VuRmVhdHVyZS5nZXREZWZhdWx0VmFsdWUoKSU+PC9jb2RlPi4KLSAgICA8JX0lPgotICAgIDwlaWYgKGdlbkZlYXR1cmUuZ2V0VHlwZUdlbkVudW0oKSAhPSBudWxsKSB7JT4KLQkgKiBUaGUgbGl0ZXJhbHMgYXJlIGZyb20gdGhlIGVudW1lcmF0aW9uIHtAbGluayA8JT1nZW5GZWF0dXJlLmdldFR5cGVHZW5FbnVtKCkuZ2V0UXVhbGlmaWVkTmFtZSgpJT59LgotICAgIDwlfSU+Ci0gICAgPCVpZiAoZ2VuRmVhdHVyZS5pc0JpZGlyZWN0aW9uYWwoKSAmJiAhZ2VuRmVhdHVyZS5nZXRSZXZlcnNlKCkuZ2V0R2VuQ2xhc3MoKS5pc01hcEVudHJ5KCkpIHsgR2VuRmVhdHVyZSByZXZlcnNlR2VuRmVhdHVyZSA9IGdlbkZlYXR1cmUuZ2V0UmV2ZXJzZSgpOyAlPgotICAgICAgPCVpZiAoIXJldmVyc2VHZW5GZWF0dXJlLmlzU3VwcHJlc3NlZEdldFZpc2liaWxpdHkoKSkgeyU+Ci0JICogSXQgaXMgYmlkaXJlY3Rpb25hbCBhbmQgaXRzIG9wcG9zaXRlIGlzICd7QGxpbmsgPCU9cmV2ZXJzZUdlbkZlYXR1cmUuZ2V0R2VuQ2xhc3MoKS5nZXRRdWFsaWZpZWRJbnRlcmZhY2VOYW1lKCklPiM8JT1yZXZlcnNlR2VuRmVhdHVyZS5nZXRHZXRBY2Nlc3NvcigpJT4gPGVtPjwlPXJldmVyc2VHZW5GZWF0dXJlLmdldEZvcm1hdHRlZE5hbWUoKSU+PC9lbT59Jy4KLSAgICAgIDwlfSU+Ci0gICAgPCV9JT4KLTwlQCBpbmNsdWRlIGZpbGU9IkNsYXNzL2dldEdlbkZlYXR1cmUuamF2YWRvYy5pbnNlcnQuamF2YWpldGluYyIgZmFpbD0ic2lsZW50IiAlPgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgPCVpZiAoIWdlbkZlYXR1cmUuaGFzRG9jdW1lbnRhdGlvbigpKSB7JT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT48JT1nZW5GZWF0dXJlLmdldEZvcm1hdHRlZE5hbWUoKSU+PC9lbT4nIDwlPWdlbkZlYXR1cmUuZ2V0RmVhdHVyZUtpbmQoKSU+IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0gICAgPCV9JT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICA8JWlmIChnZW5GZWF0dXJlLmhhc0RvY3VtZW50YXRpb24oKSkgeyU+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogPCU9Z2VuRmVhdHVyZS5nZXREb2N1bWVudGF0aW9uKGdlbk1vZGVsLmdldEluZGVudGF0aW9uKHN0cmluZ0J1ZmZlcikpJT4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gICAgPCV9JT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48JT1nZW5GZWF0dXJlLmdldEZvcm1hdHRlZE5hbWUoKSU+PC9lbT4nIDwlPWdlbkZlYXR1cmUuZ2V0RmVhdHVyZUtpbmQoKSU+LgotICAgIDwlaWYgKGdlbkZlYXR1cmUuZ2V0VHlwZUdlbkVudW0oKSAhPSBudWxsKSB7JT4KLQkgKiBAc2VlIDwlPWdlbkZlYXR1cmUuZ2V0VHlwZUdlbkVudW0oKS5nZXRRdWFsaWZpZWROYW1lKCklPgotICAgIDwlfSU+Ci0gICAgPCVpZiAoZ2VuRmVhdHVyZS5pc1Vuc2V0dGFibGUoKSkgeyU+Ci0gICAgICA8JWlmICghZ2VuRmVhdHVyZS5pc1N1cHByZXNzZWRJc1NldFZpc2liaWxpdHkoKSkgeyU+Ci0JICogQHNlZSAjaXNTZXQ8JT1nZW5GZWF0dXJlLmdldEFjY2Vzc29yTmFtZSgpJT4oKQotICAgICAgPCV9JT4KLSAgICAgIDwlaWYgKGdlbkZlYXR1cmUuaXNDaGFuZ2VhYmxlKCkgJiYgIWdlbkZlYXR1cmUuaXNTdXBwcmVzc2VkVW5zZXRWaXNpYmlsaXR5KCkpIHslPgotCSAqIEBzZWUgI3Vuc2V0PCU9Z2VuRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+KCkKLSAgICAgIDwlfSU+Ci0gICAgPCV9JT4KLSAgICA8JWlmIChnZW5GZWF0dXJlLmlzQ2hhbmdlYWJsZSgpICYmICFnZW5GZWF0dXJlLmlzTGlzdFR5cGUoKSAmJiAhZ2VuRmVhdHVyZS5pc1N1cHByZXNzZWRTZXRWaXNpYmlsaXR5KCkpIHslPgotCSAqIEBzZWUgI3NldDwlPWdlbkZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPig8JT1nZW5GZWF0dXJlLmdldFJhd0ltcG9ydGVkQm91bmRUeXBlKCklPikKLSAgICA8JX0lPgotICAgIDwlaWYgKCFnZW5Nb2RlbC5pc1N1cHByZXNzRU1GTWV0YURhdGEoKSkgeyU+Ci0JICogQHNlZSA8JT1nZW5QYWNrYWdlLmdldFF1YWxpZmllZFBhY2thZ2VJbnRlcmZhY2VOYW1lKCklPiNnZXQ8JT1nZW5GZWF0dXJlLmdldEZlYXR1cmVBY2Nlc3Nvck5hbWUoKSU+KCkKLSAgICA8JX0lPgotICAgIDwlaWYgKGdlbkZlYXR1cmUuaXNCaWRpcmVjdGlvbmFsKCkgJiYgIWdlbkZlYXR1cmUuZ2V0UmV2ZXJzZSgpLmdldEdlbkNsYXNzKCkuaXNNYXBFbnRyeSgpKSB7IEdlbkZlYXR1cmUgcmV2ZXJzZUdlbkZlYXR1cmUgPSBnZW5GZWF0dXJlLmdldFJldmVyc2UoKTsgJT4KLSAgICAgIDwlaWYgKCFyZXZlcnNlR2VuRmVhdHVyZS5pc1N1cHByZXNzZWRHZXRWaXNpYmlsaXR5KCkpIHslPgotCSAqIEBzZWUgPCU9cmV2ZXJzZUdlbkZlYXR1cmUuZ2V0R2VuQ2xhc3MoKS5nZXRRdWFsaWZpZWRJbnRlcmZhY2VOYW1lKCklPiM8JT1yZXZlcnNlR2VuRmVhdHVyZS5nZXRHZXRBY2Nlc3NvcigpJT4KLSAgICAgIDwlfSU+Ci0gICAgPCV9JT4KLSAgICA8JWlmICghZ2VuTW9kZWwuaXNTdXBwcmVzc0VNRk1vZGVsVGFncygpKSB7IGJvb2xlYW4gZmlyc3QgPSB0cnVlOyBmb3IgKFN0cmluZ1Rva2VuaXplciBzdHJpbmdUb2tlbml6ZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGdlbkZlYXR1cmUuZ2V0TW9kZWxJbmZvKCksICJcblxyIik7IHN0cmluZ1Rva2VuaXplci5oYXNNb3JlVG9rZW5zKCk7ICkgeyBTdHJpbmcgbW9kZWxJbmZvID0gc3RyaW5nVG9rZW5pemVyLm5leHRUb2tlbigpOyBpZiAoZmlyc3QpIHsgZmlyc3QgPSBmYWxzZTslPgotCSAqIEBtb2RlbCA8JT1tb2RlbEluZm8lPgotICAgIDwlfSBlbHNlIHslPgotCSAqICAgICAgICA8JT1tb2RlbEluZm8lPgotICAgIDwlfX0gaWYgKGZpcnN0KSB7JT4KLQkgKiBAbW9kZWwKLSAgICA8JX19JT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi08JUAgZW5kICU+PCUvL0NsYXNzL2dldEdlbkZlYXR1cmUuamF2YWRvYy5vdmVycmlkZS5qYXZhamV0aW5jJT4KLTwlfSBlbHNlIHslPgotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotPCVpZiAoZ2VuTW9kZWwuZ2V0Q29tcGxpYW5jZUxldmVsKCkuZ2V0VmFsdWUoKSA+PSBHZW5KREtMZXZlbC5KREs1MCkgeyAvL0NsYXNzL2dldEdlbkZlYXR1cmUuYW5ub3RhdGlvbnMuaW5zZXJ0LmphdmFqZXRpbmMlPgotPCVAIGluY2x1ZGUgZmlsZT0iQ2xhc3MvZ2V0R2VuRmVhdHVyZS5hbm5vdGF0aW9ucy5pbnNlcnQuamF2YWpldGluYyIgZmFpbD0ic2lsZW50IiAlPgotPCV9JT4KLTwlfSU+Ci08JWlmICghaXNJbXBsZW1lbnRhdGlvbikgeyU+Ci0JPCU9Z2VuRmVhdHVyZS5nZXRJbXBvcnRlZFR5cGUoZ2VuQ2xhc3MpJT4gPCU9Z2VuRmVhdHVyZS5nZXRHZXRBY2Nlc3NvcigpJT4oKTsKLQotPCV9IGVsc2UgeyU+Ci0gIDwlaWYgKGdlbk1vZGVsLnVzZUdlbmVyaWNzKCkgJiYgKChnZW5GZWF0dXJlLmlzQ29udGFpbmVyKCkgfHwgZ2VuRmVhdHVyZS5pc1Jlc29sdmVQcm94aWVzKCkpICYmICFnZW5GZWF0dXJlLmlzTGlzdFR5cGUoKSAmJiAhZ2VuTW9kZWwuaXNSZWZsZWN0aXZlRGVsZWdhdGlvbigpICYmIGdlbkZlYXR1cmUuaXNVbmNoZWNrZWRDYXN0KCkgfHwgZ2VuRmVhdHVyZS5pc0xpc3RUeXBlKCkgJiYgKGdlbk1vZGVsLmlzUmVmbGVjdGl2ZURlbGVnYXRpb24oKSB8fCBnZW5Nb2RlbC5pc1ZpcnR1YWxEZWxlZ2F0aW9uKCkpIHx8IGdlbkZlYXR1cmUuaXNMaXN0RGF0YVR5cGUoKSAmJiBnZW5GZWF0dXJlLmhhc0RlbGVnYXRlRmVhdHVyZSgpKSkgeyU+Ci0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gIDwlfSU+Ci0JcHVibGljIDwlPWdlbkZlYXR1cmUuZ2V0SW1wb3J0ZWRUeXBlKGdlbkNsYXNzKSU+IDwlPWdlbkZlYXR1cmUuZ2V0R2V0QWNjZXNzb3IoKSU+KCkKLQl7Ci08JUAgaW5jbHVkZSBmaWxlPSJDbGFzcy9nZXRHZW5GZWF0dXJlLnByZS5pbnNlcnQuamF2YWpldGluYyIgZmFpbD0ic2lsZW50IiAlPgotICAgIDwlaWYgKGdlbk1vZGVsLmlzUmVmbGVjdGl2ZURlbGVnYXRpb24oKSkgeyU+Ci0JCXJldHVybiA8JWlmIChnZW5GZWF0dXJlLmlzUHJpbWl0aXZlVHlwZSgpKSB7JT4oPCV9JT4oPCU9Z2VuRmVhdHVyZS5nZXRPYmplY3RUeXBlKGdlbkNsYXNzKSU+KWVHZXQoPCU9Z2VuRmVhdHVyZS5nZXRRdWFsaWZpZWRGZWF0dXJlQWNjZXNzb3IoKSU+LCB0cnVlKTwlaWYgKGdlbkZlYXR1cmUuaXNQcmltaXRpdmVUeXBlKCkpIHslPikuPCU9Z2VuRmVhdHVyZS5nZXRQcmltaXRpdmVWYWx1ZUZ1bmN0aW9uKCklPigpPCV9JT47Ci0gICAgPCV9IGVsc2UgaWYgKCFnZW5GZWF0dXJlLmlzVm9sYXRpbGUoKSkgeyU+Ci0gICAgICA8JWlmIChnZW5GZWF0dXJlLmlzTGlzdFR5cGUoKSkgeyU+Ci0gICAgICAgIDwlaWYgKGdlbk1vZGVsLmlzVmlydHVhbERlbGVnYXRpb24oKSkgeyU+Ci0JCTwlPWdlbkZlYXR1cmUuZ2V0SW1wb3J0ZWRUeXBlKGdlbkNsYXNzKSU+IDwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+ID0gKDwlPWdlbkZlYXR1cmUuZ2V0SW1wb3J0ZWRUeXBlKGdlbkNsYXNzKSU+KWVWaXJ0dWFsR2V0KDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+PCU9cG9zaXRpdmVPZmZzZXRDb3JyZWN0aW9uJT4pOwotICAgICAgICA8JX0lPgotCQlpZiAoPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4gPT0gbnVsbCkKLQkJewotICAgICAgICA8JWlmIChnZW5Nb2RlbC5pc1ZpcnR1YWxEZWxlZ2F0aW9uKCkpIHslPgotCQkJZVZpcnR1YWxTZXQoPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT48JT1wb3NpdGl2ZU9mZnNldENvcnJlY3Rpb24lPiwgPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4gPSBuZXcgPCU9Z2VuQ2xhc3MuZ2V0TGlzdENvbnN0cnVjdG9yKGdlbkZlYXR1cmUpJT4pOwotICAgICAgICA8JX0gZWxzZSB7JT4KLQkJCTwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+ID0gbmV3IDwlPWdlbkNsYXNzLmdldExpc3RDb25zdHJ1Y3RvcihnZW5GZWF0dXJlKSU+OwotICAgICAgICA8JX0lPgotCQl9Ci0JCXJldHVybiA8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPjwlPWdlbkZlYXR1cmUuaXNNYXBUeXBlKCkgJiYgZ2VuRmVhdHVyZS5pc0VmZmVjdGl2ZVN1cHByZXNzRU1GVHlwZXMoKSA/ICIubWFwKCkiIDogIiIlPjsKLSAgICAgIDwlfSBlbHNlIGlmIChnZW5GZWF0dXJlLmlzQ29udGFpbmVyKCkpIHslPgotCQlpZiAoZUNvbnRhaW5lckZlYXR1cmVJRCAhPSA8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPjwlPXBvc2l0aXZlT2Zmc2V0Q29ycmVjdGlvbiU+KSByZXR1cm4gbnVsbDsKLQkJcmV0dXJuICg8JT1nZW5GZWF0dXJlLmdldEltcG9ydGVkVHlwZShnZW5DbGFzcyklPillQ29udGFpbmVyKCk7Ci0gICAgICA8JX0gZWxzZSB7JT4KLSAgICAgICAgPCVpZiAoZ2VuRmVhdHVyZS5pc1Jlc29sdmVQcm94aWVzKCkpIHslPgotICAgICAgICAgIDwlaWYgKGdlbk1vZGVsLmlzVmlydHVhbERlbGVnYXRpb24oKSkgeyU+Ci0JCTwlPWdlbkZlYXR1cmUuZ2V0SW1wb3J0ZWRUeXBlKGdlbkNsYXNzKSU+IDwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+ID0gKDwlPWdlbkZlYXR1cmUuZ2V0SW1wb3J0ZWRUeXBlKGdlbkNsYXNzKSU+KWVWaXJ0dWFsR2V0KDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+PCU9cG9zaXRpdmVPZmZzZXRDb3JyZWN0aW9uJT48JWlmIChnZW5GZWF0dXJlLmhhc0VEZWZhdWx0KCkpIHslPiwgPCU9Z2VuRmVhdHVyZS5nZXRFRGVmYXVsdCgpJT48JX0lPik7Ci0gICAgICAgICAgPCV9JT4KLQkJaWYgKDwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+ICE9IG51bGwgJiYgPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZUFzRU9iamVjdCgpJT4uZUlzUHJveHkoKSkKLQkJewotCQkJPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0IiklPiBvbGQ8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+ID0gKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdCIpJT4pPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT47Ci0JCQk8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPiA9IDwlPWdlbkZlYXR1cmUuZ2V0Tm9uRU9iamVjdEludGVybmFsVHlwZUNhc3QoZ2VuQ2xhc3MpJT5lUmVzb2x2ZVByb3h5KG9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4pOwotCQkJaWYgKDwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+ICE9IG9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4pCi0JCQl7Ci0gICAgICAgICAgPCVpZiAoZ2VuRmVhdHVyZS5pc0VmZmVjdGl2ZUNvbnRhaW5zKCkpIHslPgotCQkJCTwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdCIpJT4gbmV3PCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPiA9ICg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3QiKSU+KTwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+OwotICAgICAgICAgIDwlaWYgKCFnZW5GZWF0dXJlLmlzQmlkaXJlY3Rpb25hbCgpKSB7JT4KLQkJCQk8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluIiklPiBtc2dzID0gb2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPi5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT48JT1uZWdhdGl2ZU9mZnNldENvcnJlY3Rpb24lPiwgbnVsbCwgbnVsbCk7Ci0gICAgICAgICAgPCV9IGVsc2UgeyBHZW5GZWF0dXJlIHJldmVyc2VGZWF0dXJlID0gZ2VuRmVhdHVyZS5nZXRSZXZlcnNlKCk7IEdlbkNsYXNzIHRhcmdldENsYXNzID0gcmV2ZXJzZUZlYXR1cmUuZ2V0R2VuQ2xhc3MoKTsgU3RyaW5nIHJldmVyc2VPZmZzZXRDb3JyZWN0aW9uID0gdGFyZ2V0Q2xhc3MuaGFzT2Zmc2V0Q29ycmVjdGlvbigpID8gIiArICIgKyBnZW5DbGFzcy5nZXRPZmZzZXRDb3JyZWN0aW9uRmllbGQocmV2ZXJzZUZlYXR1cmUpIDogIiI7JT4KLQkJCQk8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluIiklPiBtc2dzID0gIG9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4uZUludmVyc2VSZW1vdmUodGhpcywgPCU9dGFyZ2V0Q2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKHJldmVyc2VGZWF0dXJlKSU+PCU9cmV2ZXJzZU9mZnNldENvcnJlY3Rpb24lPiwgPCU9dGFyZ2V0Q2xhc3MuZ2V0SW1wb3J0ZWRJbnRlcmZhY2VOYW1lKCklPi5jbGFzcywgbnVsbCk7Ci0gICAgICAgICAgPCV9JT4KLQkJCQlpZiAobmV3PCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPi5lSW50ZXJuYWxDb250YWluZXIoKSA9PSBudWxsKQotCQkJCXsKLSAgICAgICAgICA8JWlmICghZ2VuRmVhdHVyZS5pc0JpZGlyZWN0aW9uYWwoKSkgeyU+Ci0JCQkJCW1zZ3MgPSBuZXc8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+LmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSA8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPjwlPW5lZ2F0aXZlT2Zmc2V0Q29ycmVjdGlvbiU+LCBudWxsLCBtc2dzKTsKLSAgICAgICAgICA8JX0gZWxzZSB7IEdlbkZlYXR1cmUgcmV2ZXJzZUZlYXR1cmUgPSBnZW5GZWF0dXJlLmdldFJldmVyc2UoKTsgR2VuQ2xhc3MgdGFyZ2V0Q2xhc3MgPSByZXZlcnNlRmVhdHVyZS5nZXRHZW5DbGFzcygpOyBTdHJpbmcgcmV2ZXJzZU9mZnNldENvcnJlY3Rpb24gPSB0YXJnZXRDbGFzcy5oYXNPZmZzZXRDb3JyZWN0aW9uKCkgPyAiICsgIiArIGdlbkNsYXNzLmdldE9mZnNldENvcnJlY3Rpb25GaWVsZChyZXZlcnNlRmVhdHVyZSkgOiAiIjslPgotCQkJCQltc2dzID0gIG5ldzwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4uZUludmVyc2VBZGQodGhpcywgPCU9dGFyZ2V0Q2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKHJldmVyc2VGZWF0dXJlKSU+PCU9cmV2ZXJzZU9mZnNldENvcnJlY3Rpb24lPiwgPCU9dGFyZ2V0Q2xhc3MuZ2V0SW1wb3J0ZWRJbnRlcmZhY2VOYW1lKCklPi5jbGFzcywgbXNncyk7Ci0gICAgICAgICAgPCV9JT4KLQkJCQl9Ci0JCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotICAgICAgICAgIDwlfSBlbHNlIGlmIChnZW5Nb2RlbC5pc1ZpcnR1YWxEZWxlZ2F0aW9uKCkpIHslPgotCQkJCWVWaXJ0dWFsU2V0KDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+PCU9cG9zaXRpdmVPZmZzZXRDb3JyZWN0aW9uJT4sIDwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+KTsKLSAgICAgICAgICA8JX0lPgotICAgICAgICAgIDwlaWYgKCFnZW5Nb2RlbC5pc1N1cHByZXNzTm90aWZpY2F0aW9uKCkpIHslPgotCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCQkJZU5vdGlmeShuZXcgPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbCIpJT4odGhpcywgPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb24iKSU+LlJFU09MVkUsIDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+PCU9cG9zaXRpdmVPZmZzZXRDb3JyZWN0aW9uJT4sIG9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4sIDwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+KSk7Ci0gICAgICAgICAgPCV9JT4KLQkJCX0KLQkJfQotICAgICAgICA8JX0lPgotICAgICAgICA8JWlmICghZ2VuRmVhdHVyZS5pc1Jlc29sdmVQcm94aWVzKCkgJiYgZ2VuTW9kZWwuaXNWaXJ0dWFsRGVsZWdhdGlvbigpICYmICFnZW5GZWF0dXJlLmlzUHJpbWl0aXZlVHlwZSgpKSB7JT4KLQkJcmV0dXJuICg8JT1nZW5GZWF0dXJlLmdldEltcG9ydGVkVHlwZShnZW5DbGFzcyklPillVmlydHVhbEdldCg8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPjwlPXBvc2l0aXZlT2Zmc2V0Q29ycmVjdGlvbiU+PCVpZiAoZ2VuRmVhdHVyZS5oYXNFRGVmYXVsdCgpKSB7JT4sIDwlPWdlbkZlYXR1cmUuZ2V0RURlZmF1bHQoKSU+PCV9JT4pOwotICAgICAgICA8JX0gZWxzZSBpZiAoZ2VuQ2xhc3MuaXNGbGFnKGdlbkZlYXR1cmUpKSB7JT4KLQkJcmV0dXJuICg8JT1nZW5DbGFzcy5nZXRGbGFnc0ZpZWxkKGdlbkZlYXR1cmUpJT4gJiA8JT1nZW5GZWF0dXJlLmdldFVwcGVyTmFtZSgpJT5fRUZMQUcpICE9IDA7Ci0gICAgICAgIDwlfSBlbHNlIHslPgotCQlyZXR1cm4gPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT47Ci0gICAgICAgIDwlfSU+Ci0gICAgICA8JX0lPgotICAgIDwlfSBlbHNlIHsvL3ZvbGF0aWxlJT4KLSAgICAgIDwlaWYgKGdlbkZlYXR1cmUuaXNSZXNvbHZlUHJveGllcygpICYmICFnZW5GZWF0dXJlLmlzTGlzdFR5cGUoKSkgeyU+Ci0JCTwlPWdlbkZlYXR1cmUuZ2V0SW1wb3J0ZWRUeXBlKGdlbkNsYXNzKSU+IDwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+ID0gYmFzaWNHZXQ8JT1nZW5GZWF0dXJlLmdldEFjY2Vzc29yTmFtZSgpJT4oKTsKLQkJcmV0dXJuIDwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+ICE9IG51bGwgJiYgPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZUFzRU9iamVjdCgpJT4uZUlzUHJveHkoKSA/IDwlPWdlbkZlYXR1cmUuZ2V0Tm9uRU9iamVjdEludGVybmFsVHlwZUNhc3QoZ2VuQ2xhc3MpJT5lUmVzb2x2ZVByb3h5KCg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3QiKSU+KTwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+KSA6IDwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+OwotICAgICAgPCV9IGVsc2UgaWYgKGdlbkZlYXR1cmUuaGFzRGVsZWdhdGVGZWF0dXJlKCkpIHsgR2VuRmVhdHVyZSBkZWxlZ2F0ZUZlYXR1cmUgPSBnZW5GZWF0dXJlLmdldERlbGVnYXRlRmVhdHVyZSgpOyU+Ci0gICAgICAgIDwlaWYgKGdlbkZlYXR1cmUuaXNGZWF0dXJlTWFwVHlwZSgpKSB7JT4KLSAgICAgICAgPCVTdHJpbmcgZmVhdHVyZU1hcEVudHJ5VGVtcGxhdGVBcmd1bWVudCA9IGdlbk1vZGVsLmdldENvbXBsaWFuY2VMZXZlbCgpLmdldFZhbHVlKCkgPj0gR2VuSkRLTGV2ZWwuSkRLNTAgPyAiPCIgKyBnZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXAiKSArICIuRW50cnk+IiA6ICIiOyU+Ci0gICAgICAgICAgPCVpZiAoZGVsZWdhdGVGZWF0dXJlLmlzV3JhcHBlZEZlYXR1cmVNYXBUeXBlKCkpIHslPgotCQlyZXR1cm4gbmV3IDwlPWdlbkZlYXR1cmUuZ2V0SW1wb3J0ZWRFZmZlY3RpdmVGZWF0dXJlTWFwV3JhcHBlckNsYXNzKCklPigoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwIiklPi5JbnRlcm5hbCkoKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcCIpJT4uSW50ZXJuYWwuV3JhcHBlcilnZXQ8JT1kZWxlZ2F0ZUZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPigpKS5mZWF0dXJlTWFwKCkuPCU9ZmVhdHVyZU1hcEVudHJ5VGVtcGxhdGVBcmd1bWVudCU+bGlzdCg8JT1nZW5GZWF0dXJlLmdldFF1YWxpZmllZEZlYXR1cmVBY2Nlc3NvcigpJT4pKTsKLSAgICAgICAgICA8JX0gZWxzZSB7JT4KLQkJcmV0dXJuICg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXAiKSU+KWdldDwlPWRlbGVnYXRlRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+KCkuPCU9ZmVhdHVyZU1hcEVudHJ5VGVtcGxhdGVBcmd1bWVudCU+bGlzdCg8JT1nZW5GZWF0dXJlLmdldFF1YWxpZmllZEZlYXR1cmVBY2Nlc3NvcigpJT4pOwotICAgICAgICAgIDwlfSU+Ci0gICAgICAgIDwlfSBlbHNlIGlmIChnZW5GZWF0dXJlLmlzTGlzdFR5cGUoKSkgeyU+Ci0gICAgICAgICAgPCVpZiAoZGVsZWdhdGVGZWF0dXJlLmlzV3JhcHBlZEZlYXR1cmVNYXBUeXBlKCkpIHslPgotCQlyZXR1cm4gKCg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXAiKSU+LkludGVybmFsLldyYXBwZXIpZ2V0PCU9ZGVsZWdhdGVGZWF0dXJlLmdldEFjY2Vzc29yTmFtZSgpJT4oKSkuZmVhdHVyZU1hcCgpLmxpc3QoPCU9Z2VuRmVhdHVyZS5nZXRRdWFsaWZpZWRGZWF0dXJlQWNjZXNzb3IoKSU+KTsKLSAgICAgICAgICA8JX0gZWxzZSB7JT4KLQkJcmV0dXJuIGdldDwlPWRlbGVnYXRlRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+KCkubGlzdCg8JT1nZW5GZWF0dXJlLmdldFF1YWxpZmllZEZlYXR1cmVBY2Nlc3NvcigpJT4pOwotICAgICAgICAgIDwlfSU+Ci0gICAgICAgIDwlfSBlbHNlIHslPgotICAgICAgICAgIDwlaWYgKGRlbGVnYXRlRmVhdHVyZS5pc1dyYXBwZWRGZWF0dXJlTWFwVHlwZSgpKSB7JT4KLQkJcmV0dXJuIDwlaWYgKGdlbkZlYXR1cmUuaXNQcmltaXRpdmVUeXBlKCkpIHslPig8JX0lPjwlaWYgKGdlbkZlYXR1cmUuZ2V0VHlwZUdlbkRhdGFUeXBlKCkgPT0gbnVsbCB8fCAhZ2VuRmVhdHVyZS5nZXRUeXBlR2VuRGF0YVR5cGUoKS5pc09iamVjdFR5cGUoKSkgeyU+KDwlPWdlbkZlYXR1cmUuZ2V0T2JqZWN0VHlwZShnZW5DbGFzcyklPik8JX0lPigoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwIiklPi5JbnRlcm5hbC5XcmFwcGVyKWdldDwlPWRlbGVnYXRlRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+KCkpLmZlYXR1cmVNYXAoKS5nZXQoPCU9Z2VuRmVhdHVyZS5nZXRRdWFsaWZpZWRGZWF0dXJlQWNjZXNzb3IoKSU+LCB0cnVlKTwlaWYgKGdlbkZlYXR1cmUuaXNQcmltaXRpdmVUeXBlKCkpIHslPikuPCU9Z2VuRmVhdHVyZS5nZXRQcmltaXRpdmVWYWx1ZUZ1bmN0aW9uKCklPigpPCV9JT47Ci0gICAgICAgICAgPCV9IGVsc2UgeyU+Ci0JCXJldHVybiA8JWlmIChnZW5GZWF0dXJlLmlzUHJpbWl0aXZlVHlwZSgpKSB7JT4oPCV9JT48JWlmIChnZW5GZWF0dXJlLmdldFR5cGVHZW5EYXRhVHlwZSgpID09IG51bGwgfHwgIWdlbkZlYXR1cmUuZ2V0VHlwZUdlbkRhdGFUeXBlKCkuaXNPYmplY3RUeXBlKCkpIHslPig8JT1nZW5GZWF0dXJlLmdldE9iamVjdFR5cGUoZ2VuQ2xhc3MpJT4pPCV9JT5nZXQ8JT1kZWxlZ2F0ZUZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPigpLmdldCg8JT1nZW5GZWF0dXJlLmdldFF1YWxpZmllZEZlYXR1cmVBY2Nlc3NvcigpJT4sIHRydWUpPCVpZiAoZ2VuRmVhdHVyZS5pc1ByaW1pdGl2ZVR5cGUoKSkgeyU+KS48JT1nZW5GZWF0dXJlLmdldFByaW1pdGl2ZVZhbHVlRnVuY3Rpb24oKSU+KCk8JX0lPjsKLSAgICAgICAgICA8JX0lPgotICAgICAgICA8JX0lPgotICAgICAgPCV9IGVsc2UgeyU+Ci08JUAgaW5jbHVkZSBmaWxlPSJDbGFzcy9nZXRHZW5GZWF0dXJlLlRPRE8ub3ZlcnJpZGUuamF2YWpldGluYyIgZmFpbD0iYWx0ZXJuYXRpdmUiICU+Ci08JUAgc3RhcnQgJT4KLQkJLy8gVE9ETzogaW1wbGVtZW50IHRoaXMgbWV0aG9kIHRvIHJldHVybiB0aGUgJzwlPWdlbkZlYXR1cmUuZ2V0Rm9ybWF0dGVkTmFtZSgpJT4nIDwlPWdlbkZlYXR1cmUuZ2V0RmVhdHVyZUtpbmQoKSU+Ci0JCS8vIEVuc3VyZSB0aGF0IHlvdSByZW1vdmUgQGdlbmVyYXRlZCBvciBtYXJrIGl0IEBnZW5lcmF0ZWQgTk9UCi0gICAgICAgIDwlaWYgKGdlbkZlYXR1cmUuaXNMaXN0VHlwZSgpKSB7JT4KLQkJLy8gVGhlIGxpc3QgaXMgZXhwZWN0ZWQgdG8gaW1wbGVtZW50IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3QgYW5kIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmUuU2V0dGluZwotCQkvLyBzbyBpdCdzIGxpa2VseSB0aGF0IGFuIGFwcHJvcHJpYXRlIHN1YmNsYXNzIG9mIG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLjwlaWYgKGdlbkZlYXR1cmUuaXNNYXBUeXBlKCkpIHslPkVjb3JlRU1hcDwlfSBlbHNlIGlmIChnZW5GZWF0dXJlLmlzRmVhdHVyZU1hcFR5cGUoKSkgeyU+QmFzaWNGZWF0dXJlTWFwPCV9IGVsc2UgeyU+RWNvcmVFTGlzdDwlfSU+IHNob3VsZCBiZSB1c2VkLgotICAgICAgICA8JX0lPgotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLTwlQCBlbmQgJT48JS8vQ2xhc3MvZ2V0R2VuRmVhdHVyZS50b2RvLm92ZXJyaWRlLmphdmFqZXRpbmMlPgotICAgICAgPCV9JT4KLSAgICA8JX0lPgotCX0KLQotPCV9JT4KLTwlQCBlbmQgJT48JS8vQ2xhc3MvZ2V0R2VuRmVhdHVyZS5vdmVycmlkZS5qYXZhamV0aW5jJT4KLSAgPCV9JT4KLSAgPCVpZiAoaXNJbXBsZW1lbnRhdGlvbiAmJiAhZ2VuTW9kZWwuaXNSZWZsZWN0aXZlRGVsZWdhdGlvbigpICYmIGdlbkZlYXR1cmUuaXNCYXNpY0dldCgpKSB7JT4KLTwlQCBpbmNsdWRlIGZpbGU9IkNsYXNzL2Jhc2ljR2V0R2VuRmVhdHVyZS5vdmVycmlkZS5qYXZhamV0aW5jIiBmYWlsPSJhbHRlcm5hdGl2ZSIgJT4KLTwlQCBzdGFydCAlPgotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotPCVpZiAoZ2VuTW9kZWwuZ2V0Q29tcGxpYW5jZUxldmVsKCkuZ2V0VmFsdWUoKSA+PSBHZW5KREtMZXZlbC5KREs1MCkgeyAvL0NsYXNzL2Jhc2ljR2V0R2VuRmVhdHVyZS5hbm5vdGF0aW9ucy5pbnNlcnQuamF2YWpldGluYyU+Ci08JUAgaW5jbHVkZSBmaWxlPSJDbGFzcy9iYXNpY0dldEdlbkZlYXR1cmUuYW5ub3RhdGlvbnMuaW5zZXJ0LmphdmFqZXRpbmMiIGZhaWw9InNpbGVudCIgJT4KLTwlfSU+Ci0JcHVibGljIDwlPWdlbkZlYXR1cmUuZ2V0SW1wb3J0ZWRUeXBlKGdlbkNsYXNzKSU+IGJhc2ljR2V0PCU9Z2VuRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+KCkKLQl7Ci08JUAgaW5jbHVkZSBmaWxlPSJDbGFzcy9iYXNpY0dldEdlbkZlYXR1cmUucHJlLmluc2VydC5qYXZhamV0aW5jIiBmYWlsPSJzaWxlbnQiICU+Ci0gICAgPCVpZiAoZ2VuRmVhdHVyZS5pc0NvbnRhaW5lcigpKSB7JT4KLQkJaWYgKGVDb250YWluZXJGZWF0dXJlSUQgIT0gPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT48JT1wb3NpdGl2ZU9mZnNldENvcnJlY3Rpb24lPikgcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoPCU9Z2VuRmVhdHVyZS5nZXRJbXBvcnRlZFR5cGUoZ2VuQ2xhc3MpJT4pZUludGVybmFsQ29udGFpbmVyKCk7Ci0gICAgPCV9IGVsc2UgaWYgKCFnZW5GZWF0dXJlLmlzVm9sYXRpbGUoKSkgeyU+Ci0gICAgICA8JWlmIChnZW5Nb2RlbC5pc1ZpcnR1YWxEZWxlZ2F0aW9uKCkpIHslPgotCQlyZXR1cm4gKDwlPWdlbkZlYXR1cmUuZ2V0SW1wb3J0ZWRUeXBlKGdlbkNsYXNzKSU+KWVWaXJ0dWFsR2V0KDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+PCU9cG9zaXRpdmVPZmZzZXRDb3JyZWN0aW9uJT4pOwotICAgICAgPCV9IGVsc2UgeyU+Ci0JCXJldHVybiA8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPjsKLSAgICAgIDwlfSU+Ci0gICAgPCV9IGVsc2UgaWYgKGdlbkZlYXR1cmUuaGFzRGVsZWdhdGVGZWF0dXJlKCkpIHsgR2VuRmVhdHVyZSBkZWxlZ2F0ZUZlYXR1cmUgPSBnZW5GZWF0dXJlLmdldERlbGVnYXRlRmVhdHVyZSgpOyU+Ci0gICAgICA8JWlmIChkZWxlZ2F0ZUZlYXR1cmUuaXNXcmFwcGVkRmVhdHVyZU1hcFR5cGUoKSkgeyU+Ci0JCXJldHVybiAoPCU9Z2VuRmVhdHVyZS5nZXRJbXBvcnRlZFR5cGUoZ2VuQ2xhc3MpJT4pKCg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXAiKSU+LkludGVybmFsLldyYXBwZXIpZ2V0PCU9ZGVsZWdhdGVGZWF0dXJlLmdldEFjY2Vzc29yTmFtZSgpJT4oKSkuZmVhdHVyZU1hcCgpLmdldCg8JT1nZW5GZWF0dXJlLmdldFF1YWxpZmllZEZlYXR1cmVBY2Nlc3NvcigpJT4sIGZhbHNlKTsKLSAgICAgIDwlfSBlbHNlIHslPgotCQlyZXR1cm4gKDwlPWdlbkZlYXR1cmUuZ2V0SW1wb3J0ZWRUeXBlKGdlbkNsYXNzKSU+KWdldDwlPWRlbGVnYXRlRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+KCkuZ2V0KDwlPWdlbkZlYXR1cmUuZ2V0UXVhbGlmaWVkRmVhdHVyZUFjY2Vzc29yKCklPiwgZmFsc2UpOwotICAgICAgPCV9JT4KLSAgICA8JX0gZWxzZSB7JT4KLTwlQCBpbmNsdWRlIGZpbGU9IkNsYXNzL2Jhc2ljR2V0R2VuRmVhdHVyZS5UT0RPLm92ZXJyaWRlLmphdmFqZXRpbmMiIGZhaWw9ImFsdGVybmF0aXZlIiAlPgotPCVAIHN0YXJ0ICU+Ci0JCS8vIFRPRE86IGltcGxlbWVudCB0aGlzIG1ldGhvZCB0byByZXR1cm4gdGhlICc8JT1nZW5GZWF0dXJlLmdldEZvcm1hdHRlZE5hbWUoKSU+JyA8JT1nZW5GZWF0dXJlLmdldEZlYXR1cmVLaW5kKCklPgotCQkvLyAtPiBkbyBub3QgcGVyZm9ybSBwcm94eSByZXNvbHV0aW9uCi0JCS8vIEVuc3VyZSB0aGF0IHlvdSByZW1vdmUgQGdlbmVyYXRlZCBvciBtYXJrIGl0IEBnZW5lcmF0ZWQgTk9UCi0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotPCVAIGVuZCAlPjwlLy9DbGFzcy9iYXNpY0dldEdlbkZlYXR1cmUudG9kby5vdmVycmlkZS5qYXZhamV0aW5jJT4KLSAgICA8JX0lPgotCX0KLQotPCVAIGVuZCAlPjwlLy9DbGFzcy9iYXNpY0dldEdlbkZlYXR1cmUub3ZlcnJpZGUuamF2YWpldGluYyU+Ci0gIDwlfSU+Ci0gIDwlaWYgKGlzSW1wbGVtZW50YXRpb24gJiYgIWdlbk1vZGVsLmlzUmVmbGVjdGl2ZURlbGVnYXRpb24oKSAmJiBnZW5GZWF0dXJlLmlzQmFzaWNTZXQoKSkgeyU+Ci08JUAgaW5jbHVkZSBmaWxlPSJDbGFzcy9iYXNpY1NldEdlbkZlYXR1cmUub3ZlcnJpZGUuamF2YWpldGluYyIgZmFpbD0iYWx0ZXJuYXRpdmUiICU+Ci08JUAgc3RhcnQgJT4KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLTwlaWYgKGdlbk1vZGVsLmdldENvbXBsaWFuY2VMZXZlbCgpLmdldFZhbHVlKCkgPj0gR2VuSkRLTGV2ZWwuSkRLNTApIHsgLy9DbGFzcy9iYXNpY1NldEdlbkZlYXR1cmUuYW5ub3RhdGlvbnMuaW5zZXJ0LmphdmFqZXRpbmMlPgotPCVAIGluY2x1ZGUgZmlsZT0iQ2xhc3MvYmFzaWNTZXRHZW5GZWF0dXJlLmFubm90YXRpb25zLmluc2VydC5qYXZhamV0aW5jIiBmYWlsPSJzaWxlbnQiICU+Ci08JX0lPgotCXB1YmxpYyA8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluIiklPiBiYXNpY1NldDwlPWdlbkZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPig8JT1nZW5GZWF0dXJlLmdldEltcG9ydGVkSW50ZXJuYWxUeXBlKGdlbkNsYXNzKSU+IG5ldzwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4sIDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW4iKSU+IG1zZ3MpCi0JewotICAgIDwlaWYgKGdlbkZlYXR1cmUuaXNDb250YWluZXIoKSkgeyU+Ci08JUAgaW5jbHVkZSBmaWxlPSJDbGFzcy9iYXNpY1NldEdlbkZlYXR1cmUucHJlLmluc2VydC5qYXZhamV0aW5jIiBmYWlsPSJzaWxlbnQiICU+Ci0JCW1zZ3MgPSBlQmFzaWNTZXRDb250YWluZXIoKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdCIpJT4pbmV3PCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPiwgPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT48JT1wb3NpdGl2ZU9mZnNldENvcnJlY3Rpb24lPiwgbXNncyk7Ci08JUAgaW5jbHVkZSBmaWxlPSJDbGFzcy9iYXNpY1NldEdlbkZlYXR1cmUucG9zdC5pbnNlcnQuamF2YWpldGluYyIgZmFpbD0ic2lsZW50IiAlPgotCQlyZXR1cm4gbXNnczsKLSAgICA8JX0gZWxzZSBpZiAoIWdlbkZlYXR1cmUuaXNWb2xhdGlsZSgpKSB7JT4KLTwlQCBpbmNsdWRlIGZpbGU9IkNsYXNzL2Jhc2ljU2V0R2VuRmVhdHVyZS5wcmUuaW5zZXJ0LmphdmFqZXRpbmMiIGZhaWw9InNpbGVudCIgJT4KLSAgICAgIDwlaWYgKGdlbk1vZGVsLmlzVmlydHVhbERlbGVnYXRpb24oKSkgeyU+Ci0JCU9iamVjdCBvbGQ8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+ID0gZVZpcnR1YWxTZXQoPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT48JT1wb3NpdGl2ZU9mZnNldENvcnJlY3Rpb24lPiwgbmV3PCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPik7Ci0gICAgICA8JX0gZWxzZSB7JT4KLQkJPCU9Z2VuRmVhdHVyZS5nZXRJbXBvcnRlZFR5cGUoZ2VuQ2xhc3MpJT4gb2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPiA9IDwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+OwotCQk8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPiA9IG5ldzwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT47Ci0gICAgICA8JX0lPgotICAgICAgPCVpZiAoZ2VuRmVhdHVyZS5pc1Vuc2V0dGFibGUoKSkgeyU+Ci0gICAgICAgIDwlaWYgKGdlbk1vZGVsLmlzVmlydHVhbERlbGVnYXRpb24oKSkgeyU+Ci0JCWJvb2xlYW4gaXNTZXRDaGFuZ2UgPSBvbGQ8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+ID09IEVWSVJUVUFMX05PX1ZBTFVFOwotICAgICAgICA8JX0gZWxzZSBpZiAoZ2VuQ2xhc3MuaXNFU2V0RmxhZyhnZW5GZWF0dXJlKSkgeyU+Ci0JCWJvb2xlYW4gb2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPkVTZXQgPSAoPCU9Z2VuQ2xhc3MuZ2V0RVNldEZsYWdzRmllbGQoZ2VuRmVhdHVyZSklPiAmIDwlPWdlbkZlYXR1cmUuZ2V0VXBwZXJOYW1lKCklPl9FU0VURkxBRykgIT0gMDsKLQkJPCU9Z2VuQ2xhc3MuZ2V0RVNldEZsYWdzRmllbGQoZ2VuRmVhdHVyZSklPiB8PSA8JT1nZW5GZWF0dXJlLmdldFVwcGVyTmFtZSgpJT5fRVNFVEZMQUc7Ci0gICAgICAgIDwlfSBlbHNlIHslPgotCQlib29sZWFuIG9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT5FU2V0ID0gPCU9Z2VuRmVhdHVyZS5nZXRVbmNhcE5hbWUoKSU+RVNldDsKLQkJPCU9Z2VuRmVhdHVyZS5nZXRVbmNhcE5hbWUoKSU+RVNldCA9IHRydWU7Ci0gICAgICAgIDwlfSU+Ci0gICAgICA8JX0lPgotICAgICAgPCVpZiAoIWdlbk1vZGVsLmlzU3VwcHJlc3NOb3RpZmljYXRpb24oKSkgeyU+Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJewotICAgICAgICA8JWlmIChnZW5GZWF0dXJlLmlzVW5zZXR0YWJsZSgpKSB7JT4KLQkJCTwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGwiKSU+IG5vdGlmaWNhdGlvbiA9IG5ldyA8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsIiklPih0aGlzLCA8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbiIpJT4uU0VULCA8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPjwlPXBvc2l0aXZlT2Zmc2V0Q29ycmVjdGlvbiU+LCA8JWlmIChnZW5Nb2RlbC5pc1ZpcnR1YWxEZWxlZ2F0aW9uKCkpIHslPmlzU2V0Q2hhbmdlID8gbnVsbCA6IG9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT48JX0gZWxzZSB7JT5vbGQ8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+PCV9JT4sIG5ldzwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4sIDwlaWYgKGdlbk1vZGVsLmlzVmlydHVhbERlbGVnYXRpb24oKSkgeyU+aXNTZXRDaGFuZ2U8JX0gZWxzZSB7JT4hb2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPkVTZXQ8JX0lPik7Ci0gICAgICAgIDwlfSBlbHNlIHslPgotCQkJPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbCIpJT4gbm90aWZpY2F0aW9uID0gbmV3IDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGwiKSU+KHRoaXMsIDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uIiklPi5TRVQsIDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+PCU9cG9zaXRpdmVPZmZzZXRDb3JyZWN0aW9uJT4sIDwlaWYgKGdlbk1vZGVsLmlzVmlydHVhbERlbGVnYXRpb24oKSkgeyU+b2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPiA9PSBFVklSVFVBTF9OT19WQUxVRSA/IG51bGwgOiBvbGQ8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+PCV9IGVsc2UgeyU+b2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPjwlfSU+LCBuZXc8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+KTsKLSAgICAgICAgPCV9JT4KLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotICAgICAgPCV9JT4KLTwlQCBpbmNsdWRlIGZpbGU9IkNsYXNzL2Jhc2ljU2V0R2VuRmVhdHVyZS5wb3N0Lmluc2VydC5qYXZhamV0aW5jIiBmYWlsPSJzaWxlbnQiICU+Ci0JCXJldHVybiBtc2dzOwotICAgIDwlfSBlbHNlIGlmIChnZW5GZWF0dXJlLmhhc0RlbGVnYXRlRmVhdHVyZSgpKSB7IEdlbkZlYXR1cmUgZGVsZWdhdGVGZWF0dXJlID0gZ2VuRmVhdHVyZS5nZXREZWxlZ2F0ZUZlYXR1cmUoKTslPgotICAgICAgPCVpZiAoZGVsZWdhdGVGZWF0dXJlLmlzV3JhcHBlZEZlYXR1cmVNYXBUeXBlKCkpIHslPgotCQlyZXR1cm4gKCg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXAiKSU+LkludGVybmFsKSgoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwIiklPi5JbnRlcm5hbC5XcmFwcGVyKWdldDwlPWRlbGVnYXRlRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+KCkpLmZlYXR1cmVNYXAoKSkuYmFzaWNBZGQoPCU9Z2VuRmVhdHVyZS5nZXRRdWFsaWZpZWRGZWF0dXJlQWNjZXNzb3IoKSU+LCBuZXc8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+LCBtc2dzKTsKLSAgICAgIDwlfSBlbHNlIHslPgotCQlyZXR1cm4gKCg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXAiKSU+LkludGVybmFsKWdldDwlPWRlbGVnYXRlRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+KCkpLmJhc2ljQWRkKDwlPWdlbkZlYXR1cmUuZ2V0UXVhbGlmaWVkRmVhdHVyZUFjY2Vzc29yKCklPiwgbmV3PCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPiwgbXNncyk7Ci0gICAgICA8JX0lPgotICAgIDwlfSBlbHNlIHslPgotPCVAIGluY2x1ZGUgZmlsZT0iQ2xhc3MvYmFzaWNTZXRHZW5GZWF0dXJlLlRPRE8ub3ZlcnJpZGUuamF2YWpldGluYyIgZmFpbD0iYWx0ZXJuYXRpdmUiICU+Ci08JUAgc3RhcnQgJT4KLQkJLy8gVE9ETzogaW1wbGVtZW50IHRoaXMgbWV0aG9kIHRvIHNldCB0aGUgY29udGFpbmVkICc8JT1nZW5GZWF0dXJlLmdldEZvcm1hdHRlZE5hbWUoKSU+JyA8JT1nZW5GZWF0dXJlLmdldEZlYXR1cmVLaW5kKCklPgotCQkvLyAtPiB0aGlzIG1ldGhvZCBpcyBhdXRvbWF0aWNhbGx5IGludm9rZWQgdG8ga2VlcCB0aGUgY29udGFpbm1lbnQgcmVsYXRpb25zaGlwIGluIHN5bmNoCi0JCS8vIC0+IGRvIG5vdCBtb2RpZnkgb3RoZXIgZmVhdHVyZXMKLQkJLy8gLT4gcmV0dXJuIG1zZ3MsIGFmdGVyIGFkZGluZyBhbnkgZ2VuZXJhdGVkIE5vdGlmaWNhdGlvbiB0byBpdCAoaWYgaXQgaXMgbnVsbCwgYSBOb3RpZmljYXRpb25DaGFpbiBvYmplY3QgbXVzdCBiZSBjcmVhdGVkIGZpcnN0KQotCQkvLyBFbnN1cmUgdGhhdCB5b3UgcmVtb3ZlIEBnZW5lcmF0ZWQgb3IgbWFyayBpdCBAZ2VuZXJhdGVkIE5PVAotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLTwlQCBlbmQgJT48JS8vQ2xhc3MvYmFzaWNTZXRHZW5GZWF0dXJlLnRvZG8ub3ZlcnJpZGUuamF2YWpldGluYyU+Ci0gICAgPCV9JT4KLQl9Ci0KLTwlQCBlbmQgJT48JS8vQ2xhc3MvYmFzaWNTZXRHZW5GZWF0dXJlLm92ZXJyaWRlLmphdmFqZXRpbmMlPgotICA8JX0lPgotICA8JWlmIChnZW5GZWF0dXJlLmlzU2V0KCkgJiYgKGlzSW1wbGVtZW50YXRpb24gfHwgIWdlbkZlYXR1cmUuaXNTdXBwcmVzc2VkU2V0VmlzaWJpbGl0eSgpKSkgeyU+Ci08JUAgaW5jbHVkZSBmaWxlPSJDbGFzcy9zZXRHZW5GZWF0dXJlLm92ZXJyaWRlLmphdmFqZXRpbmMiIGZhaWw9ImFsdGVybmF0aXZlIiAlPgotPCVAIHN0YXJ0ICU+Ci08JWlmIChpc0ludGVyZmFjZSkgeyAlPgotPCVAIGluY2x1ZGUgZmlsZT0iQ2xhc3Mvc2V0R2VuRmVhdHVyZS5qYXZhZG9jLm92ZXJyaWRlLmphdmFqZXRpbmMiIGZhaWw9ImFsdGVybmF0aXZlIiAlPgotPCVAIHN0YXJ0ICU+Ci0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkSW50ZXJmYWNlTmFtZSgpJT4jPCU9Z2VuRmVhdHVyZS5nZXRHZXRBY2Nlc3NvcigpJT4gPGVtPjwlPWdlbkZlYXR1cmUuZ2V0Rm9ybWF0dGVkTmFtZSgpJT48L2VtPn0nIDwlPWdlbkZlYXR1cmUuZ2V0RmVhdHVyZUtpbmQoKSU+LgotPCVAIGluY2x1ZGUgZmlsZT0iQ2xhc3Mvc2V0R2VuRmVhdHVyZS5qYXZhZG9jLmluc2VydC5qYXZhamV0aW5jIiBmYWlsPSJzaWxlbnQiICU+Ci0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT48JT1nZW5GZWF0dXJlLmdldEZvcm1hdHRlZE5hbWUoKSU+PC9lbT4nIDwlPWdlbkZlYXR1cmUuZ2V0RmVhdHVyZUtpbmQoKSU+LgotICAgIDwlaWYgKGdlbkZlYXR1cmUuaXNFbnVtVHlwZSgpKSB7JT4KLQkgKiBAc2VlIDwlPWdlbkZlYXR1cmUuZ2V0VHlwZUdlbkVudW0oKS5nZXRRdWFsaWZpZWROYW1lKCklPgotICAgIDwlfSU+Ci0gICAgPCVpZiAoZ2VuRmVhdHVyZS5pc1Vuc2V0dGFibGUoKSkgeyU+Ci0gICAgICA8JWlmICghZ2VuRmVhdHVyZS5pc1N1cHByZXNzZWRJc1NldFZpc2liaWxpdHkoKSkgeyU+Ci0JICogQHNlZSAjaXNTZXQ8JT1nZW5GZWF0dXJlLmdldEFjY2Vzc29yTmFtZSgpJT4oKQotICAgICAgPCV9JT4KLSAgICAgIDwlaWYgKCFnZW5GZWF0dXJlLmlzU3VwcHJlc3NlZFVuc2V0VmlzaWJpbGl0eSgpKSB7JT4KLQkgKiBAc2VlICN1bnNldDwlPWdlbkZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPigpCi0gICAgICA8JX0lPgotICAgIDwlfSU+Ci0JICogQHNlZSAjPCU9Z2VuRmVhdHVyZS5nZXRHZXRBY2Nlc3NvcigpJT4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLTwlQCBlbmQgJT48JS8vQ2xhc3Mvc2V0R2VuRmVhdHVyZS5qYXZhZG9jLm92ZXJyaWRlLmphdmFqZXRpbmMlPgotPCV9IGVsc2UgeyU+Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi08JWlmIChnZW5Nb2RlbC5nZXRDb21wbGlhbmNlTGV2ZWwoKS5nZXRWYWx1ZSgpID49IEdlbkpES0xldmVsLkpESzUwKSB7IC8vQ2xhc3Mvc2V0R2VuRmVhdHVyZS5hbm5vdGF0aW9ucy5pbnNlcnQuamF2YWpldGluYyU+Ci08JUAgaW5jbHVkZSBmaWxlPSJDbGFzcy9zZXRHZW5GZWF0dXJlLmFubm90YXRpb25zLmluc2VydC5qYXZhamV0aW5jIiBmYWlsPSJzaWxlbnQiICU+Ci08JX0lPgotPCV9JT4KLTwlaWYgKCFpc0ltcGxlbWVudGF0aW9uKSB7ICU+Ci0Jdm9pZCBzZXQ8JT1nZW5GZWF0dXJlLmdldEFjY2Vzc29yTmFtZSgpJT4oPCU9Z2VuRmVhdHVyZS5nZXRJbXBvcnRlZFR5cGUoZ2VuQ2xhc3MpJT4gdmFsdWUpOwotCi08JX0gZWxzZSB7JT4KLQlwdWJsaWMgdm9pZCBzZXQ8JT1nZW5GZWF0dXJlLmdldEFjY2Vzc29yTmFtZSgpJT4oPCU9Z2VuRmVhdHVyZS5nZXRJbXBvcnRlZFR5cGUoZ2VuQ2xhc3MpJT4gbmV3PCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPikKLQl7Ci08JUAgaW5jbHVkZSBmaWxlPSJDbGFzcy9zZXRHZW5GZWF0dXJlLnByZS5pbnNlcnQuamF2YWpldGluYyIgZmFpbD0ic2lsZW50IiAlPgotICAgIDwlaWYgKGdlbk1vZGVsLmlzUmVmbGVjdGl2ZURlbGVnYXRpb24oKSkgeyU+Ci0JCWVTZXQoPCU9Z2VuRmVhdHVyZS5nZXRRdWFsaWZpZWRGZWF0dXJlQWNjZXNzb3IoKSU+LCA8JWlmIChnZW5GZWF0dXJlLmlzUHJpbWl0aXZlVHlwZSgpKSB7JT5uZXcgPCU9Z2VuRmVhdHVyZS5nZXRPYmplY3RUeXBlKGdlbkNsYXNzKSU+KDwlfSU+bmV3PCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPjwlaWYgKGdlbkZlYXR1cmUuaXNQcmltaXRpdmVUeXBlKCkpIHslPik8JX0lPik7Ci0gICAgPCV9IGVsc2UgaWYgKCFnZW5GZWF0dXJlLmlzVm9sYXRpbGUoKSkgeyU+Ci0gICAgICA8JWlmIChnZW5GZWF0dXJlLmlzQ29udGFpbmVyKCkpIHsgR2VuRmVhdHVyZSByZXZlcnNlRmVhdHVyZSA9IGdlbkZlYXR1cmUuZ2V0UmV2ZXJzZSgpOyBHZW5DbGFzcyB0YXJnZXRDbGFzcyA9IHJldmVyc2VGZWF0dXJlLmdldEdlbkNsYXNzKCk7IFN0cmluZyByZXZlcnNlT2Zmc2V0Q29ycmVjdGlvbiA9IHRhcmdldENsYXNzLmhhc09mZnNldENvcnJlY3Rpb24oKSA/ICIgKyAiICsgZ2VuQ2xhc3MuZ2V0T2Zmc2V0Q29ycmVjdGlvbkZpZWxkKHJldmVyc2VGZWF0dXJlKSA6ICIiOyU+Ci0JCWlmIChuZXc8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+ICE9IGVJbnRlcm5hbENvbnRhaW5lcigpIHx8IChlQ29udGFpbmVyRmVhdHVyZUlEICE9IDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+PCU9cG9zaXRpdmVPZmZzZXRDb3JyZWN0aW9uJT4gJiYgbmV3PCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPiAhPSBudWxsKSkKLQkJewotCQkJaWYgKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsIiklPi5pc0FuY2VzdG9yKHRoaXMsIDwlPWdlbkZlYXR1cmUuZ2V0RU9iamVjdENhc3QoKSU+bmV3PCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPikpCi0JCQkJdGhyb3cgbmV3IDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgiamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiIpJT4oIlJlY3Vyc2l2ZSBjb250YWlubWVudCBub3QgYWxsb3dlZCBmb3IgIiArIHRvU3RyaW5nKCkpOzwlPWdlbk1vZGVsLmdldE5vbk5MUygpJT4KLQkJCTwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW4iKSU+IG1zZ3MgPSBudWxsOwotCQkJaWYgKGVJbnRlcm5hbENvbnRhaW5lcigpICE9IG51bGwpCi0JCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQlpZiAobmV3PCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPiAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdCIpJT4pbmV3PCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPikuZUludmVyc2VBZGQodGhpcywgPCU9dGFyZ2V0Q2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKHJldmVyc2VGZWF0dXJlKSU+PCU9cmV2ZXJzZU9mZnNldENvcnJlY3Rpb24lPiwgPCU9dGFyZ2V0Q2xhc3MuZ2V0SW1wb3J0ZWRJbnRlcmZhY2VOYW1lKCklPi5jbGFzcywgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXQ8JT1nZW5GZWF0dXJlLmdldEFjY2Vzc29yTmFtZSgpJT4oPCU9Z2VuRmVhdHVyZS5nZXRJbnRlcm5hbFR5cGVDYXN0KCklPm5ldzwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4sIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0gICAgICAgIDwlaWYgKCFnZW5Nb2RlbC5pc1N1cHByZXNzTm90aWZpY2F0aW9uKCkpIHslPgotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGwiKSU+KHRoaXMsIDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uIiklPi5TRVQsIDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+PCU9cG9zaXRpdmVPZmZzZXRDb3JyZWN0aW9uJT4sIG5ldzwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4sIG5ldzwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4pKTsKLSAgICAgICAgPCV9JT4KLSAgICAgIDwlfSBlbHNlIGlmIChnZW5GZWF0dXJlLmlzQmlkaXJlY3Rpb25hbCgpIHx8IGdlbkZlYXR1cmUuaXNFZmZlY3RpdmVDb250YWlucygpKSB7JT4KLSAgICAgICAgPCVpZiAoZ2VuTW9kZWwuaXNWaXJ0dWFsRGVsZWdhdGlvbigpKSB7JT4KLQkJPCU9Z2VuRmVhdHVyZS5nZXRJbXBvcnRlZFR5cGUoZ2VuQ2xhc3MpJT4gPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4gPSAoPCU9Z2VuRmVhdHVyZS5nZXRJbXBvcnRlZFR5cGUoZ2VuQ2xhc3MpJT4pZVZpcnR1YWxHZXQoPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT48JT1wb3NpdGl2ZU9mZnNldENvcnJlY3Rpb24lPik7Ci0gICAgICAgIDwlfSU+Ci0JCWlmIChuZXc8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+ICE9IDwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+KQotCQl7Ci0JCQk8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluIiklPiBtc2dzID0gbnVsbDsKLQkJCWlmICg8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPiAhPSBudWxsKQotICAgICAgICA8JWlmICghZ2VuRmVhdHVyZS5pc0JpZGlyZWN0aW9uYWwoKSkgeyU+Ci0JCQkJbXNncyA9ICgoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0IiklPik8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPikuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+PCU9bmVnYXRpdmVPZmZzZXRDb3JyZWN0aW9uJT4sIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ldzwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4gIT0gbnVsbCkKLQkJCQltc2dzID0gKCg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3QiKSU+KW5ldzwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4pLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSA8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPjwlPW5lZ2F0aXZlT2Zmc2V0Q29ycmVjdGlvbiU+LCBudWxsLCBtc2dzKTsKLSAgICAgICAgPCV9IGVsc2UgeyBHZW5GZWF0dXJlIHJldmVyc2VGZWF0dXJlID0gZ2VuRmVhdHVyZS5nZXRSZXZlcnNlKCk7IEdlbkNsYXNzIHRhcmdldENsYXNzID0gcmV2ZXJzZUZlYXR1cmUuZ2V0R2VuQ2xhc3MoKTsgU3RyaW5nIHJldmVyc2VPZmZzZXRDb3JyZWN0aW9uID0gdGFyZ2V0Q2xhc3MuaGFzT2Zmc2V0Q29ycmVjdGlvbigpID8gIiArICIgKyBnZW5DbGFzcy5nZXRPZmZzZXRDb3JyZWN0aW9uRmllbGQocmV2ZXJzZUZlYXR1cmUpIDogIiI7JT4KLQkJCQltc2dzID0gKCg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3QiKSU+KTwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+KS5lSW52ZXJzZVJlbW92ZSh0aGlzLCA8JT10YXJnZXRDbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQocmV2ZXJzZUZlYXR1cmUpJT48JT1yZXZlcnNlT2Zmc2V0Q29ycmVjdGlvbiU+LCA8JT10YXJnZXRDbGFzcy5nZXRJbXBvcnRlZEludGVyZmFjZU5hbWUoKSU+LmNsYXNzLCBtc2dzKTsKLQkJCWlmIChuZXc8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+ICE9IG51bGwpCi0JCQkJbXNncyA9ICgoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0IiklPiluZXc8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+KS5lSW52ZXJzZUFkZCh0aGlzLCA8JT10YXJnZXRDbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQocmV2ZXJzZUZlYXR1cmUpJT48JT1yZXZlcnNlT2Zmc2V0Q29ycmVjdGlvbiU+LCA8JT10YXJnZXRDbGFzcy5nZXRJbXBvcnRlZEludGVyZmFjZU5hbWUoKSU+LmNsYXNzLCBtc2dzKTsKLSAgICAgICAgPCV9JT4KLQkJCW1zZ3MgPSBiYXNpY1NldDwlPWdlbkZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPig8JT1nZW5GZWF0dXJlLmdldEludGVybmFsVHlwZUNhc3QoKSU+bmV3PCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPiwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLSAgICAgICAgPCVpZiAoZ2VuRmVhdHVyZS5pc1Vuc2V0dGFibGUoKSkgeyU+Ci0JCWVsc2UKLQkJewotICAgICAgICAgIDwlaWYgKGdlbk1vZGVsLmlzVmlydHVhbERlbGVnYXRpb24oKSkgeyU+Ci0JCQlib29sZWFuIG9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT5FU2V0ID0gZVZpcnR1YWxJc1NldCg8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPjwlPXBvc2l0aXZlT2Zmc2V0Q29ycmVjdGlvbiU+KTsKLSAgICAgICAgICA8JX0gZWxzZSBpZiAoZ2VuQ2xhc3MuaXNFU2V0RmxhZyhnZW5GZWF0dXJlKSkgeyU+Ci0gICAgICAgICAgICA8JWlmICghZ2VuTW9kZWwuaXNTdXBwcmVzc05vdGlmaWNhdGlvbigpKSB7JT4KLQkJCWJvb2xlYW4gb2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPkVTZXQgPSAoPCU9Z2VuQ2xhc3MuZ2V0RVNldEZsYWdzRmllbGQoZ2VuRmVhdHVyZSklPiAmIDwlPWdlbkZlYXR1cmUuZ2V0VXBwZXJOYW1lKCklPl9FU0VURkxBRykgIT0gMDsKLSAgICAgICAgICAgIDwlfSU+Ci0JCQk8JT1nZW5DbGFzcy5nZXRFU2V0RmxhZ3NGaWVsZChnZW5GZWF0dXJlKSU+IHw9IDwlPWdlbkZlYXR1cmUuZ2V0VXBwZXJOYW1lKCklPl9FU0VURkxBRzsKLSAgICAgICAgICA8JX0gZWxzZSB7JT4KLSAgICAgICAgICAgIDwlaWYgKCFnZW5Nb2RlbC5pc1N1cHByZXNzTm90aWZpY2F0aW9uKCkpIHslPgotCQkJYm9vbGVhbiBvbGQ8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+RVNldCA9IDwlPWdlbkZlYXR1cmUuZ2V0VW5jYXBOYW1lKCklPkVTZXQ7Ci0gICAgICAgICAgICA8JX0lPgotCQkJPCU9Z2VuRmVhdHVyZS5nZXRVbmNhcE5hbWUoKSU+RVNldCA9IHRydWU7Ci0gICAgICAgICAgPCV9JT4KLSAgICAgICAgICA8JWlmICghZ2VuTW9kZWwuaXNTdXBwcmVzc05vdGlmaWNhdGlvbigpKSB7JT4KLQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCQllTm90aWZ5KG5ldyA8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsIiklPih0aGlzLCA8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbiIpJT4uU0VULCA8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPjwlPXBvc2l0aXZlT2Zmc2V0Q29ycmVjdGlvbiU+LCBuZXc8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+LCBuZXc8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+LCAhb2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPkVTZXQpKTsKLSAgICAgICAgICA8JX0lPgotCQl9Ci0gICAgICAgIDwlfSBlbHNlIHslPgotICAgICAgICAgIDwlaWYgKCFnZW5Nb2RlbC5pc1N1cHByZXNzTm90aWZpY2F0aW9uKCkpIHslPgotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGwiKSU+KHRoaXMsIDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uIiklPi5TRVQsIDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+PCU9cG9zaXRpdmVPZmZzZXRDb3JyZWN0aW9uJT4sIG5ldzwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4sIG5ldzwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4pKTsKLSAgICAgICAgICA8JX0lPgotICAgICAgICA8JX0lPgotICAgICAgPCV9IGVsc2UgeyU+Ci0gICAgICAgIDwlaWYgKGdlbkNsYXNzLmlzRmxhZyhnZW5GZWF0dXJlKSkgeyU+Ci0gICAgICAgICAgPCVpZiAoIWdlbk1vZGVsLmlzU3VwcHJlc3NOb3RpZmljYXRpb24oKSkgeyU+Ci0JCTwlPWdlbkZlYXR1cmUuZ2V0SW1wb3J0ZWRUeXBlKGdlbkNsYXNzKSU+IG9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4gPSAoPCU9Z2VuQ2xhc3MuZ2V0RmxhZ3NGaWVsZChnZW5GZWF0dXJlKSU+ICYgPCU9Z2VuRmVhdHVyZS5nZXRVcHBlck5hbWUoKSU+X0VGTEFHKSAhPSAwOwotICAgICAgICAgIDwlfSU+Ci0JCWlmIChuZXc8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+KSA8JT1nZW5DbGFzcy5nZXRGbGFnc0ZpZWxkKGdlbkZlYXR1cmUpJT4gfD0gPCU9Z2VuRmVhdHVyZS5nZXRVcHBlck5hbWUoKSU+X0VGTEFHOyBlbHNlIDwlPWdlbkNsYXNzLmdldEZsYWdzRmllbGQoZ2VuRmVhdHVyZSklPiAmPSB+PCU9Z2VuRmVhdHVyZS5nZXRVcHBlck5hbWUoKSU+X0VGTEFHOwotICAgICAgICA8JX0gZWxzZSB7JT4KLSAgICAgICAgICA8JWlmICghZ2VuTW9kZWwuaXNWaXJ0dWFsRGVsZWdhdGlvbigpIHx8IGdlbkZlYXR1cmUuaXNQcmltaXRpdmVUeXBlKCkpIHslPgotICAgICAgICAgICAgPCVpZiAoIWdlbk1vZGVsLmlzU3VwcHJlc3NOb3RpZmljYXRpb24oKSkgeyU+Ci0JCTwlPWdlbkZlYXR1cmUuZ2V0SW1wb3J0ZWRUeXBlKGdlbkNsYXNzKSU+IG9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4gPSA8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPjsKLSAgICAgICAgICAgIDwlfSU+Ci0gICAgICAgICAgPCV9JT4KLSAgICAgICAgICA8JWlmIChnZW5GZWF0dXJlLmlzRW51bVR5cGUoKSkgeyU+Ci0gICAgICAgICAgICA8JWlmIChnZW5Nb2RlbC5pc1ZpcnR1YWxEZWxlZ2F0aW9uKCkpIHslPgotCQk8JT1nZW5GZWF0dXJlLmdldEltcG9ydGVkVHlwZShnZW5DbGFzcyklPiA8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPiA9IG5ldzwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4gPT0gbnVsbCA/IDwlPWdlbkZlYXR1cmUuZ2V0RURlZmF1bHQoKSU+IDogbmV3PCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPjsKLSAgICAgICAgICAgIDwlfSBlbHNlIHslPgotCQk8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPiA9IG5ldzwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4gPT0gbnVsbCA/IDwlPWdlbkZlYXR1cmUuZ2V0RURlZmF1bHQoKSU+IDogbmV3PCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPjsKLSAgICAgICAgICAgIDwlfSU+Ci0gICAgICAgICAgPCV9IGVsc2UgeyU+Ci0gICAgICAgICAgICA8JWlmIChnZW5Nb2RlbC5pc1ZpcnR1YWxEZWxlZ2F0aW9uKCkgJiYgIWdlbkZlYXR1cmUuaXNQcmltaXRpdmVUeXBlKCkpIHslPgotCQk8JT1nZW5GZWF0dXJlLmdldEltcG9ydGVkVHlwZShnZW5DbGFzcyklPiA8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPiA9IDwlPWdlbkZlYXR1cmUuZ2V0SW50ZXJuYWxUeXBlQ2FzdCgpJT5uZXc8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+OwotICAgICAgICAgICAgPCV9IGVsc2UgeyU+Ci0JCTwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+ID0gPCU9Z2VuRmVhdHVyZS5nZXRJbnRlcm5hbFR5cGVDYXN0KCklPm5ldzwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT47Ci0gICAgICAgICAgICA8JX0lPgotICAgICAgICAgIDwlfSU+Ci0gICAgICAgICAgPCVpZiAoZ2VuTW9kZWwuaXNWaXJ0dWFsRGVsZWdhdGlvbigpICYmICFnZW5GZWF0dXJlLmlzUHJpbWl0aXZlVHlwZSgpKSB7JT4KLQkJT2JqZWN0IG9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4gPSBlVmlydHVhbFNldCg8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPjwlPXBvc2l0aXZlT2Zmc2V0Q29ycmVjdGlvbiU+LCA8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPik7Ci0gICAgICAgICAgPCV9JT4KLSAgICAgICAgPCV9JT4KLSAgICAgICAgPCVpZiAoZ2VuRmVhdHVyZS5pc1Vuc2V0dGFibGUoKSkgeyU+Ci0gICAgICAgICAgPCVpZiAoZ2VuTW9kZWwuaXNWaXJ0dWFsRGVsZWdhdGlvbigpICYmICFnZW5GZWF0dXJlLmlzUHJpbWl0aXZlVHlwZSgpKSB7JT4KLQkJYm9vbGVhbiBpc1NldENoYW5nZSA9IG9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4gPT0gRVZJUlRVQUxfTk9fVkFMVUU7Ci0gICAgICAgICAgPCV9IGVsc2UgaWYgKGdlbkNsYXNzLmlzRVNldEZsYWcoZ2VuRmVhdHVyZSkpIHslPgotICAgICAgICAgICAgPCVpZiAoIWdlbk1vZGVsLmlzU3VwcHJlc3NOb3RpZmljYXRpb24oKSkgeyU+Ci0JCWJvb2xlYW4gb2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPkVTZXQgPSAoPCU9Z2VuQ2xhc3MuZ2V0RVNldEZsYWdzRmllbGQoZ2VuRmVhdHVyZSklPiAmIDwlPWdlbkZlYXR1cmUuZ2V0VXBwZXJOYW1lKCklPl9FU0VURkxBRykgIT0gMDsKLSAgICAgICAgICAgIDwlfSU+Ci0JCTwlPWdlbkNsYXNzLmdldEVTZXRGbGFnc0ZpZWxkKGdlbkZlYXR1cmUpJT4gfD0gPCU9Z2VuRmVhdHVyZS5nZXRVcHBlck5hbWUoKSU+X0VTRVRGTEFHOwotICAgICAgICAgIDwlfSBlbHNlIHslPgotICAgICAgICAgICAgPCVpZiAoIWdlbk1vZGVsLmlzU3VwcHJlc3NOb3RpZmljYXRpb24oKSkgeyU+Ci0JCWJvb2xlYW4gb2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPkVTZXQgPSA8JT1nZW5GZWF0dXJlLmdldFVuY2FwTmFtZSgpJT5FU2V0OwotICAgICAgICAgICAgPCV9JT4KLQkJPCU9Z2VuRmVhdHVyZS5nZXRVbmNhcE5hbWUoKSU+RVNldCA9IHRydWU7Ci0gICAgICAgICAgPCV9JT4KLSAgICAgICAgICA8JWlmICghZ2VuTW9kZWwuaXNTdXBwcmVzc05vdGlmaWNhdGlvbigpKSB7JT4KLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbCIpJT4odGhpcywgPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb24iKSU+LlNFVCwgPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT48JT1wb3NpdGl2ZU9mZnNldENvcnJlY3Rpb24lPiwgPCVpZiAoZ2VuTW9kZWwuaXNWaXJ0dWFsRGVsZWdhdGlvbigpICYmICFnZW5GZWF0dXJlLmlzUHJpbWl0aXZlVHlwZSgpKSB7JT5pc1NldENoYW5nZSA/IDwlPWdlbkZlYXR1cmUuZ2V0RURlZmF1bHQoKSU+IDogb2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPjwlfSBlbHNlIHslPm9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT48JX0lPiwgPCVpZiAoZ2VuQ2xhc3MuaXNGbGFnKGdlbkZlYXR1cmUpKSB7JT5uZXc8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+PCV9IGVsc2UgeyU+PCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT48JX0lPiwgPCVpZiAoZ2VuTW9kZWwuaXNWaXJ0dWFsRGVsZWdhdGlvbigpICYmICFnZW5GZWF0dXJlLmlzUHJpbWl0aXZlVHlwZSgpKSB7JT5pc1NldENoYW5nZTwlfSBlbHNlIHslPiFvbGQ8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+RVNldDwlfSU+KSk7Ci0gICAgICAgICAgPCV9JT4KLSAgICAgICAgPCV9IGVsc2UgeyU+Ci0gICAgICAgICAgPCVpZiAoIWdlbk1vZGVsLmlzU3VwcHJlc3NOb3RpZmljYXRpb24oKSkgeyU+Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGwiKSU+KHRoaXMsIDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uIiklPi5TRVQsIDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+PCU9cG9zaXRpdmVPZmZzZXRDb3JyZWN0aW9uJT4sIDwlaWYgKGdlbk1vZGVsLmlzVmlydHVhbERlbGVnYXRpb24oKSAmJiAhZ2VuRmVhdHVyZS5pc1ByaW1pdGl2ZVR5cGUoKSkgeyU+b2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPiA9PSBFVklSVFVBTF9OT19WQUxVRSA/IDwlPWdlbkZlYXR1cmUuZ2V0RURlZmF1bHQoKSU+IDogb2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPjwlfSBlbHNlIHslPm9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT48JX0lPiwgPCVpZiAoZ2VuQ2xhc3MuaXNGbGFnKGdlbkZlYXR1cmUpKSB7JT5uZXc8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+PCV9IGVsc2UgeyU+PCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT48JX0lPikpOwotICAgICAgICAgIDwlfSU+Ci0gICAgICAgIDwlfSU+Ci0gICAgICA8JX0lPgotPCVAIGluY2x1ZGUgZmlsZT0iQ2xhc3Mvc2V0R2VuRmVhdHVyZS5wb3N0Lmluc2VydC5qYXZhamV0aW5jIiBmYWlsPSJzaWxlbnQiICU+Ci0gICAgPCV9IGVsc2UgaWYgKGdlbkZlYXR1cmUuaGFzRGVsZWdhdGVGZWF0dXJlKCkpIHsgR2VuRmVhdHVyZSBkZWxlZ2F0ZUZlYXR1cmUgPSBnZW5GZWF0dXJlLmdldERlbGVnYXRlRmVhdHVyZSgpOyU+Ci0gICAgICA8JWlmIChkZWxlZ2F0ZUZlYXR1cmUuaXNXcmFwcGVkRmVhdHVyZU1hcFR5cGUoKSkgeyU+Ci0JCSgoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwIiklPi5JbnRlcm5hbCkoKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcCIpJT4uSW50ZXJuYWwuV3JhcHBlcilnZXQ8JT1kZWxlZ2F0ZUZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPigpKS5mZWF0dXJlTWFwKCkpLnNldCg8JT1nZW5GZWF0dXJlLmdldFF1YWxpZmllZEZlYXR1cmVBY2Nlc3NvcigpJT4sIDwlaWYgKGdlbkZlYXR1cmUuaXNQcmltaXRpdmVUeXBlKCkpIHslPm5ldyA8JT1nZW5GZWF0dXJlLmdldE9iamVjdFR5cGUoZ2VuQ2xhc3MpJT4oPCV9JT5uZXc8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+PCVpZiAoZ2VuRmVhdHVyZS5pc1ByaW1pdGl2ZVR5cGUoKSkgeyU+KTwlfSU+KTsKLSAgICAgIDwlfSBlbHNlIHslPgotCQkoKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcCIpJT4uSW50ZXJuYWwpZ2V0PCU9ZGVsZWdhdGVGZWF0dXJlLmdldEFjY2Vzc29yTmFtZSgpJT4oKSkuc2V0KDwlPWdlbkZlYXR1cmUuZ2V0UXVhbGlmaWVkRmVhdHVyZUFjY2Vzc29yKCklPiwgPCVpZiAoZ2VuRmVhdHVyZS5pc1ByaW1pdGl2ZVR5cGUoKSkgeyU+bmV3IDwlPWdlbkZlYXR1cmUuZ2V0T2JqZWN0VHlwZShnZW5DbGFzcyklPig8JX0lPm5ldzwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT48JWlmIChnZW5GZWF0dXJlLmlzUHJpbWl0aXZlVHlwZSgpKSB7JT4pPCV9JT4pOwotICAgICAgPCV9JT4KLSAgICA8JX0gZWxzZSB7JT4KLTwlQCBpbmNsdWRlIGZpbGU9IkNsYXNzL3NldEdlbkZlYXR1cmUuVE9ETy5vdmVycmlkZS5qYXZhamV0aW5jIiBmYWlsPSJhbHRlcm5hdGl2ZSIgJT4KLTwlQCBzdGFydCAlPgotCQkvLyBUT0RPOiBpbXBsZW1lbnQgdGhpcyBtZXRob2QgdG8gc2V0IHRoZSAnPCU9Z2VuRmVhdHVyZS5nZXRGb3JtYXR0ZWROYW1lKCklPicgPCU9Z2VuRmVhdHVyZS5nZXRGZWF0dXJlS2luZCgpJT4KLQkJLy8gRW5zdXJlIHRoYXQgeW91IHJlbW92ZSBAZ2VuZXJhdGVkIG9yIG1hcmsgaXQgQGdlbmVyYXRlZCBOT1QKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci08JUAgZW5kICU+PCUvL0NsYXNzL3NldEdlbkZlYXR1cmUudG9kby5vdmVycmlkZS5qYXZhamV0aW5jJT4KLSAgICA8JX0lPgotCX0KLQotPCV9JT4KLTwlQCBlbmQgJT48JS8vQ2xhc3Mvc2V0R2VuRmVhdHVyZS5vdmVycmlkZS5qYXZhamV0aW5jJT4KLSAgPCV9JT4KLSAgPCVpZiAoaXNJbXBsZW1lbnRhdGlvbiAmJiAhZ2VuTW9kZWwuaXNSZWZsZWN0aXZlRGVsZWdhdGlvbigpICYmIGdlbkZlYXR1cmUuaXNCYXNpY1Vuc2V0KCkpIHslPgotPCVAIGluY2x1ZGUgZmlsZT0iQ2xhc3MvYmFzaWNVbnNldEdlbkZlYXR1cmUub3ZlcnJpZGUuamF2YWpldGluYyIgZmFpbD0iYWx0ZXJuYXRpdmUiICU+Ci08JUAgc3RhcnQgJT4KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLTwlaWYgKGdlbk1vZGVsLmdldENvbXBsaWFuY2VMZXZlbCgpLmdldFZhbHVlKCkgPj0gR2VuSkRLTGV2ZWwuSkRLNTApIHsgLy9DbGFzcy9iYXNpY1Vuc2V0R2VuRmVhdHVyZS5hbm5vdGF0aW9ucy5pbnNlcnQuamF2YWpldGluYyU+Ci08JUAgaW5jbHVkZSBmaWxlPSJDbGFzcy9iYXNpY1Vuc2V0R2VuRmVhdHVyZS5hbm5vdGF0aW9ucy5pbnNlcnQuamF2YWpldGluYyIgZmFpbD0ic2lsZW50IiAlPgotPCV9JT4KLQlwdWJsaWMgPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbiIpJT4gYmFzaWNVbnNldDwlPWdlbkZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPig8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluIiklPiBtc2dzKQotCXsKLSAgICA8JWlmICghZ2VuRmVhdHVyZS5pc1ZvbGF0aWxlKCkpIHslPgotICAgICAgPCVpZiAoZ2VuTW9kZWwuaXNWaXJ0dWFsRGVsZWdhdGlvbigpKSB7JT4KLQkJT2JqZWN0IG9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4gPSBlVmlydHVhbFVuc2V0KDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+PCU9cG9zaXRpdmVPZmZzZXRDb3JyZWN0aW9uJT4pOwotICAgICAgPCV9IGVsc2UgeyU+Ci0JCTwlPWdlbkZlYXR1cmUuZ2V0SW1wb3J0ZWRUeXBlKGdlbkNsYXNzKSU+IG9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4gPSA8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPjsKLQkJPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4gPSBudWxsOwotICAgICAgPCV9JT4KLSAgICAgIDwlaWYgKGdlbk1vZGVsLmlzVmlydHVhbERlbGVnYXRpb24oKSkgeyU+Ci0JCWJvb2xlYW4gaXNTZXRDaGFuZ2UgPSBvbGQ8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+ICE9IEVWSVJUVUFMX05PX1ZBTFVFOwotICAgICAgPCV9IGVsc2UgaWYgKGdlbkNsYXNzLmlzRVNldEZsYWcoZ2VuRmVhdHVyZSkpIHslPgotCQlib29sZWFuIG9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT5FU2V0ID0gKDwlPWdlbkNsYXNzLmdldEVTZXRGbGFnc0ZpZWxkKGdlbkZlYXR1cmUpJT4gJiA8JT1nZW5GZWF0dXJlLmdldFVwcGVyTmFtZSgpJT5fRVNFVEZMQUcpICE9IDA7Ci0JCTwlPWdlbkNsYXNzLmdldEVTZXRGbGFnc0ZpZWxkKGdlbkZlYXR1cmUpJT4gJj0gfjwlPWdlbkZlYXR1cmUuZ2V0VXBwZXJOYW1lKCklPl9FU0VURkxBRzsKLSAgICAgIDwlfSBlbHNlIHslPgotCQlib29sZWFuIG9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT5FU2V0ID0gPCU9Z2VuRmVhdHVyZS5nZXRVbmNhcE5hbWUoKSU+RVNldDsKLQkJPCU9Z2VuRmVhdHVyZS5nZXRVbmNhcE5hbWUoKSU+RVNldCA9IGZhbHNlOwotICAgICAgPCV9JT4KLSAgICAgICAgPCVpZiAoIWdlbk1vZGVsLmlzU3VwcHJlc3NOb3RpZmljYXRpb24oKSkgeyU+Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJewotCQkJPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbCIpJT4gbm90aWZpY2F0aW9uID0gbmV3IDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGwiKSU+KHRoaXMsIDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uIiklPi5VTlNFVCwgPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT48JT1wb3NpdGl2ZU9mZnNldENvcnJlY3Rpb24lPiwgPCVpZiAoZ2VuTW9kZWwuaXNWaXJ0dWFsRGVsZWdhdGlvbigpKSB7JT5pc1NldENoYW5nZSA/IG9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4gOiBudWxsPCV9IGVsc2UgeyU+b2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPjwlfSU+LCBudWxsLCA8JWlmIChnZW5Nb2RlbC5pc1ZpcnR1YWxEZWxlZ2F0aW9uKCkpIHslPmlzU2V0Q2hhbmdlPCV9IGVsc2UgeyU+b2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPkVTZXQ8JX0lPik7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0gICAgICAgIDwlfSU+Ci0gICAgPCV9IGVsc2UgeyU+Ci08JUAgaW5jbHVkZSBmaWxlPSJDbGFzcy9iYXNpY1Vuc2V0R2VuRmVhdHVyZS5UT0RPLm92ZXJyaWRlLmphdmFqZXRpbmMiIGZhaWw9ImFsdGVybmF0aXZlIiAlPgotPCVAIHN0YXJ0ICU+Ci0JCS8vIFRPRE86IGltcGxlbWVudCB0aGlzIG1ldGhvZCB0byB1bnNldCB0aGUgY29udGFpbmVkICc8JT1nZW5GZWF0dXJlLmdldEZvcm1hdHRlZE5hbWUoKSU+JyA8JT1nZW5GZWF0dXJlLmdldEZlYXR1cmVLaW5kKCklPgotCQkvLyAtPiB0aGlzIG1ldGhvZCBpcyBhdXRvbWF0aWNhbGx5IGludm9rZWQgdG8ga2VlcCB0aGUgY29udGFpbm1lbnQgcmVsYXRpb25zaGlwIGluIHN5bmNoCi0JCS8vIC0+IGRvIG5vdCBtb2RpZnkgb3RoZXIgZmVhdHVyZXMKLQkJLy8gLT4gcmV0dXJuIG1zZ3MsIGFmdGVyIGFkZGluZyBhbnkgZ2VuZXJhdGVkIE5vdGlmaWNhdGlvbiB0byBpdCAoaWYgaXQgaXMgbnVsbCwgYSBOb3RpZmljYXRpb25DaGFpbiBvYmplY3QgbXVzdCBiZSBjcmVhdGVkIGZpcnN0KQotCQkvLyBFbnN1cmUgdGhhdCB5b3UgcmVtb3ZlIEBnZW5lcmF0ZWQgb3IgbWFyayBpdCBAZ2VuZXJhdGVkIE5PVAotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLTwlQCBlbmQgJT48JS8vQ2xhc3MvYmFzaWNVbnNldEdlbkZlYXR1cmUudG9kby5vdmVycmlkZS5qYXZhamV0aW5jJT4KLSAgICA8JX0lPgotCX0KLQotPCVAIGVuZCAlPjwlLy9DbGFzcy5iYXNpY1Vuc2V0R2VuRmVhdHVyZS5vdmVycmlkZS5qYXZhamV0aW5jJT4KLSAgPCV9JT4KLSAgPCVpZiAoZ2VuRmVhdHVyZS5pc1Vuc2V0KCkgJiYgKGlzSW1wbGVtZW50YXRpb24gfHwgIWdlbkZlYXR1cmUuaXNTdXBwcmVzc2VkVW5zZXRWaXNpYmlsaXR5KCkpKSB7JT4KLTwlQCBpbmNsdWRlIGZpbGU9IkNsYXNzL3Vuc2V0R2VuRmVhdHVyZS5vdmVycmlkZS5qYXZhamV0aW5jIiBmYWlsPSJhbHRlcm5hdGl2ZSIgJT4KLTwlQCBzdGFydCAlPgotPCVpZiAoaXNJbnRlcmZhY2UpIHslPgotPCVAIGluY2x1ZGUgZmlsZT0iQ2xhc3MvdW5zZXRHZW5GZWF0dXJlLmphdmFkb2Mub3ZlcnJpZGUuamF2YWpldGluYyIgZmFpbD0iYWx0ZXJuYXRpdmUiICU+Ci08JUAgc3RhcnQgJT4KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEludGVyZmFjZU5hbWUoKSU+IzwlPWdlbkZlYXR1cmUuZ2V0R2V0QWNjZXNzb3IoKSU+IDxlbT48JT1nZW5GZWF0dXJlLmdldEZvcm1hdHRlZE5hbWUoKSU+PC9lbT59JyA8JT1nZW5GZWF0dXJlLmdldEZlYXR1cmVLaW5kKCklPi4KLTwlQCBpbmNsdWRlIGZpbGU9IkNsYXNzL3Vuc2V0R2VuRmVhdHVyZS5qYXZhZG9jLmluc2VydC5qYXZhamV0aW5jIiBmYWlsPSJzaWxlbnQiICU+Ci0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgPCVpZiAoIWdlbkZlYXR1cmUuaXNTdXBwcmVzc2VkSXNTZXRWaXNpYmlsaXR5KCkpIHslPgotCSAqIEBzZWUgI2lzU2V0PCU9Z2VuRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+KCkKLSAgPCV9JT4KLQkgKiBAc2VlICM8JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPigpCi0gIDwlaWYgKCFnZW5GZWF0dXJlLmlzTGlzdFR5cGUoKSAmJiAhZ2VuRmVhdHVyZS5pc1N1cHByZXNzZWRTZXRWaXNpYmlsaXR5KCkpIHslPgotCSAqIEBzZWUgI3NldDwlPWdlbkZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPig8JT1nZW5GZWF0dXJlLmdldFJhd0ltcG9ydGVkQm91bmRUeXBlKCklPikKLSAgPCV9JT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi08JUAgZW5kICU+PCUvL0NsYXNzL3Vuc2V0R2VuRmVhdHVyZS5qYXZhZG9jLm92ZXJyaWRlLmphdmFqZXRpbmMlPgotPCV9IGVsc2UgeyU+Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi08JWlmIChnZW5Nb2RlbC5nZXRDb21wbGlhbmNlTGV2ZWwoKS5nZXRWYWx1ZSgpID49IEdlbkpES0xldmVsLkpESzUwKSB7IC8vQ2xhc3MvdW5zZXRHZW5GZWF0dXJlLmFubm90YXRpb25zLmluc2VydC5qYXZhamV0aW5jJT4KLTwlQCBpbmNsdWRlIGZpbGU9IkNsYXNzL3Vuc2V0R2VuRmVhdHVyZS5hbm5vdGF0aW9ucy5pbnNlcnQuamF2YWpldGluYyIgZmFpbD0ic2lsZW50IiAlPgotPCV9JT4KLTwlfSU+Ci08JWlmICghaXNJbXBsZW1lbnRhdGlvbikgeyU+Ci0Jdm9pZCB1bnNldDwlPWdlbkZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPigpOwotCi08JX0gZWxzZSB7JT4KLQlwdWJsaWMgdm9pZCB1bnNldDwlPWdlbkZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPigpCi0JewotICAgIDwlaWYgKGdlbk1vZGVsLmlzUmVmbGVjdGl2ZURlbGVnYXRpb24oKSkgeyU+Ci0JCWVVbnNldCg8JT1nZW5GZWF0dXJlLmdldFF1YWxpZmllZEZlYXR1cmVBY2Nlc3NvcigpJT4pOwotICAgIDwlfSBlbHNlIGlmICghZ2VuRmVhdHVyZS5pc1ZvbGF0aWxlKCkpIHslPgotICAgICAgPCVpZiAoZ2VuRmVhdHVyZS5pc0xpc3RUeXBlKCkpIHslPgotICAgICAgICA8JWlmIChnZW5Nb2RlbC5pc1ZpcnR1YWxEZWxlZ2F0aW9uKCkpIHslPgotCQk8JT1nZW5GZWF0dXJlLmdldEltcG9ydGVkVHlwZShnZW5DbGFzcyklPiA8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPiA9ICg8JT1nZW5GZWF0dXJlLmdldEltcG9ydGVkVHlwZShnZW5DbGFzcyklPillVmlydHVhbEdldCg8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPjwlPXBvc2l0aXZlT2Zmc2V0Q29ycmVjdGlvbiU+KTsKLSAgICAgICAgPCV9JT4KLQkJaWYgKDwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+ICE9IG51bGwpICgoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0IiklPi5VbnNldHRhYmxlPCU9c2luZ2xlV2lsZGNhcmQlPik8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPikudW5zZXQoKTsKLSAgICAgIDwlfSBlbHNlIGlmIChnZW5GZWF0dXJlLmlzQmlkaXJlY3Rpb25hbCgpIHx8IGdlbkZlYXR1cmUuaXNFZmZlY3RpdmVDb250YWlucygpKSB7JT4KLSAgICAgICAgPCVpZiAoZ2VuTW9kZWwuaXNWaXJ0dWFsRGVsZWdhdGlvbigpKSB7JT4KLQkJPCU9Z2VuRmVhdHVyZS5nZXRJbXBvcnRlZFR5cGUoZ2VuQ2xhc3MpJT4gPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4gPSAoPCU9Z2VuRmVhdHVyZS5nZXRJbXBvcnRlZFR5cGUoZ2VuQ2xhc3MpJT4pZVZpcnR1YWxHZXQoPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT48JT1wb3NpdGl2ZU9mZnNldENvcnJlY3Rpb24lPik7Ci0gICAgICAgIDwlfSU+Ci0JCWlmICg8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPiAhPSBudWxsKQotCQl7Ci0JCQk8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluIiklPiBtc2dzID0gbnVsbDsKLSAgICAgICAgPCVpZiAoIWdlbkZlYXR1cmUuaXNCaWRpcmVjdGlvbmFsKCkpIHslPgotCQkJbXNncyA9ICgoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0IiklPik8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPikuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+PCU9bmVnYXRpdmVPZmZzZXRDb3JyZWN0aW9uJT4sIG51bGwsIG1zZ3MpOwotICAgICAgICA8JX0gZWxzZSB7IEdlbkZlYXR1cmUgcmV2ZXJzZUZlYXR1cmUgPSBnZW5GZWF0dXJlLmdldFJldmVyc2UoKTsgR2VuQ2xhc3MgdGFyZ2V0Q2xhc3MgPSByZXZlcnNlRmVhdHVyZS5nZXRHZW5DbGFzcygpOyBTdHJpbmcgcmV2ZXJzZU9mZnNldENvcnJlY3Rpb24gPSB0YXJnZXRDbGFzcy5oYXNPZmZzZXRDb3JyZWN0aW9uKCkgPyAiICsgIiArIGdlbkNsYXNzLmdldE9mZnNldENvcnJlY3Rpb25GaWVsZChyZXZlcnNlRmVhdHVyZSkgOiAiIjslPgotCQkJbXNncyA9ICgoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0IiklPik8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPikuZUludmVyc2VSZW1vdmUodGhpcywgPCU9dGFyZ2V0Q2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKHJldmVyc2VGZWF0dXJlKSU+PCU9cmV2ZXJzZU9mZnNldENvcnJlY3Rpb24lPiwgPCU9dGFyZ2V0Q2xhc3MuZ2V0SW1wb3J0ZWRJbnRlcmZhY2VOYW1lKCklPi5jbGFzcywgbXNncyk7Ci0gICAgICAgIDwlfSU+Ci0JCQltc2dzID0gYmFzaWNVbnNldDwlPWdlbkZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPihtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlCi0JCXsKLSAgICAgICAgPCVpZiAoZ2VuTW9kZWwuaXNWaXJ0dWFsRGVsZWdhdGlvbigpKSB7JT4KLQkJCWJvb2xlYW4gb2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPkVTZXQgPSBlVmlydHVhbElzU2V0KDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+PCU9cG9zaXRpdmVPZmZzZXRDb3JyZWN0aW9uJT4pOwotICAgICAgICA8JX0gZWxzZSBpZiAoZ2VuQ2xhc3MuaXNFU2V0RmxhZyhnZW5GZWF0dXJlKSkgeyU+Ci0gICAgICAgICAgPCVpZiAoIWdlbk1vZGVsLmlzU3VwcHJlc3NOb3RpZmljYXRpb24oKSkgeyU+Ci0JCQlib29sZWFuIG9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT5FU2V0ID0gKDwlPWdlbkNsYXNzLmdldEVTZXRGbGFnc0ZpZWxkKGdlbkZlYXR1cmUpJT4gJiA8JT1nZW5GZWF0dXJlLmdldFVwcGVyTmFtZSgpJT5fRVNFVEZMQUcpICE9IDA7Ci0gICAgICAgICAgPCV9JT4KLQkJCTwlPWdlbkNsYXNzLmdldEVTZXRGbGFnc0ZpZWxkKGdlbkZlYXR1cmUpJT4gJj0gfjwlPWdlbkZlYXR1cmUuZ2V0VXBwZXJOYW1lKCklPl9FU0VURkxBRzsKLSAgICAgICAgPCV9IGVsc2UgeyU+Ci0gICAgICAgICAgPCVpZiAoIWdlbk1vZGVsLmlzU3VwcHJlc3NOb3RpZmljYXRpb24oKSkgeyU+Ci0JCQlib29sZWFuIG9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT5FU2V0ID0gPCU9Z2VuRmVhdHVyZS5nZXRVbmNhcE5hbWUoKSU+RVNldDsKLSAgICAgICAgICA8JX0lPgotCQkJPCU9Z2VuRmVhdHVyZS5nZXRVbmNhcE5hbWUoKSU+RVNldCA9IGZhbHNlOwotICAgICAgICA8JX0lPgotICAgICAgICA8JWlmICghZ2VuTW9kZWwuaXNTdXBwcmVzc05vdGlmaWNhdGlvbigpKSB7JT4KLQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCQllTm90aWZ5KG5ldyA8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsIiklPih0aGlzLCA8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbiIpJT4uVU5TRVQsIDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+PCU9cG9zaXRpdmVPZmZzZXRDb3JyZWN0aW9uJT4sIG51bGwsIG51bGwsIG9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT5FU2V0KSk7Ci0gICAgICAgIDwlfSU+Ci0JCX0KLSAgICAgIDwlfSBlbHNlIHslPgotICAgICAgICA8JWlmIChnZW5DbGFzcy5pc0ZsYWcoZ2VuRmVhdHVyZSkpIHslPgotICAgICAgICAgIDwlaWYgKCFnZW5Nb2RlbC5pc1N1cHByZXNzTm90aWZpY2F0aW9uKCkpIHslPgotCQk8JT1nZW5GZWF0dXJlLmdldEltcG9ydGVkVHlwZShnZW5DbGFzcyklPiBvbGQ8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+ID0gKDwlPWdlbkNsYXNzLmdldEZsYWdzRmllbGQoZ2VuRmVhdHVyZSklPiAmIDwlPWdlbkZlYXR1cmUuZ2V0VXBwZXJOYW1lKCklPl9FRkxBRykgIT0gMDsKLSAgICAgICAgICA8JX0lPgotICAgICAgICA8JX0gZWxzZSBpZiAoZ2VuTW9kZWwuaXNWaXJ0dWFsRGVsZWdhdGlvbigpICYmICFnZW5GZWF0dXJlLmlzUHJpbWl0aXZlVHlwZSgpKSB7JT4KLQkJT2JqZWN0IG9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4gPSBlVmlydHVhbFVuc2V0KDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+PCU9cG9zaXRpdmVPZmZzZXRDb3JyZWN0aW9uJT4pOwotICAgICAgICA8JX0gZWxzZSB7JT4KLSAgICAgICAgICA8JWlmICghZ2VuTW9kZWwuaXNTdXBwcmVzc05vdGlmaWNhdGlvbigpKSB7JT4KLQkJPCU9Z2VuRmVhdHVyZS5nZXRJbXBvcnRlZFR5cGUoZ2VuQ2xhc3MpJT4gb2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPiA9IDwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+OwotICAgICAgICAgIDwlfSU+Ci0gICAgICAgIDwlfSU+Ci0gICAgICAgIDwlaWYgKGdlbk1vZGVsLmlzVmlydHVhbERlbGVnYXRpb24oKSAmJiAhZ2VuRmVhdHVyZS5pc1ByaW1pdGl2ZVR5cGUoKSkgeyU+Ci0JCWJvb2xlYW4gaXNTZXRDaGFuZ2UgPSBvbGQ8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+ICE9IEVWSVJUVUFMX05PX1ZBTFVFOwotICAgICAgICA8JX0gZWxzZSBpZiAoZ2VuQ2xhc3MuaXNFU2V0RmxhZyhnZW5GZWF0dXJlKSkgeyU+Ci0JCWJvb2xlYW4gb2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPkVTZXQgPSAoPCU9Z2VuQ2xhc3MuZ2V0RVNldEZsYWdzRmllbGQoZ2VuRmVhdHVyZSklPiAmIDwlPWdlbkZlYXR1cmUuZ2V0VXBwZXJOYW1lKCklPl9FU0VURkxBRykgIT0gMDsKLSAgICAgICAgPCV9IGVsc2UgeyU+Ci0gICAgICAgICAgPCVpZiAoIWdlbk1vZGVsLmlzU3VwcHJlc3NOb3RpZmljYXRpb24oKSkgeyU+Ci0JCWJvb2xlYW4gb2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPkVTZXQgPSA8JT1nZW5GZWF0dXJlLmdldFVuY2FwTmFtZSgpJT5FU2V0OwotICAgICAgICAgIDwlfSU+Ci0gICAgICAgIDwlfSU+Ci0gICAgICAgIDwlaWYgKGdlbkZlYXR1cmUuaXNSZWZlcmVuY2VUeXBlKCkpIHslPgotCQk8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPiA9IG51bGw7Ci0gICAgICAgICAgPCVpZiAoIWdlbk1vZGVsLmlzVmlydHVhbERlbGVnYXRpb24oKSkgeyU+Ci0gICAgICAgICAgICA8JWlmIChnZW5DbGFzcy5pc0VTZXRGbGFnKGdlbkZlYXR1cmUpKSB7JT4KLQkJPCU9Z2VuQ2xhc3MuZ2V0RVNldEZsYWdzRmllbGQoZ2VuRmVhdHVyZSklPiAmPSB+PCU9Z2VuRmVhdHVyZS5nZXRVcHBlck5hbWUoKSU+X0VTRVRGTEFHOwotICAgICAgICAgICAgPCV9IGVsc2UgeyU+Ci0JCTwlPWdlbkZlYXR1cmUuZ2V0VW5jYXBOYW1lKCklPkVTZXQgPSBmYWxzZTsKLSAgICAgICAgICAgIDwlfSU+Ci0gICAgICAgICAgPCV9JT4KLSAgICAgICAgICA8JWlmICghZ2VuTW9kZWwuaXNTdXBwcmVzc05vdGlmaWNhdGlvbigpKSB7JT4KLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbCIpJT4odGhpcywgPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb24iKSU+LlVOU0VULCA8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPjwlPXBvc2l0aXZlT2Zmc2V0Q29ycmVjdGlvbiU+LCA8JWlmIChnZW5Nb2RlbC5pc1ZpcnR1YWxEZWxlZ2F0aW9uKCkpIHslPmlzU2V0Q2hhbmdlID8gb2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPiA6IG51bGw8JX0gZWxzZSB7JT5vbGQ8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+PCV9JT4sIG51bGwsIDwlaWYgKGdlbk1vZGVsLmlzVmlydHVhbERlbGVnYXRpb24oKSkgeyU+aXNTZXRDaGFuZ2U8JX0gZWxzZSB7JT5vbGQ8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+RVNldDwlfSU+KSk7Ci0gICAgICAgICAgPCV9JT4KLSAgICAgICAgPCV9IGVsc2UgeyU+Ci0gICAgICAgICAgPCVpZiAoZ2VuQ2xhc3MuaXNGbGFnKGdlbkZlYXR1cmUpKSB7JT4KLQkJaWYgKDwlPWdlbkZlYXR1cmUuZ2V0RURlZmF1bHQoKSU+KSA8JT1nZW5DbGFzcy5nZXRGbGFnc0ZpZWxkKGdlbkZlYXR1cmUpJT4gfD0gPCU9Z2VuRmVhdHVyZS5nZXRVcHBlck5hbWUoKSU+X0VGTEFHOyBlbHNlIDwlPWdlbkNsYXNzLmdldEZsYWdzRmllbGQoZ2VuRmVhdHVyZSklPiAmPSB+PCU9Z2VuRmVhdHVyZS5nZXRVcHBlck5hbWUoKSU+X0VGTEFHOwotICAgICAgICAgIDwlfSBlbHNlIGlmICghZ2VuTW9kZWwuaXNWaXJ0dWFsRGVsZWdhdGlvbigpIHx8IGdlbkZlYXR1cmUuaXNQcmltaXRpdmVUeXBlKCkpIHslPgotCQk8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPiA9IDwlPWdlbkZlYXR1cmUuZ2V0RURlZmF1bHQoKSU+OwotICAgICAgICAgIDwlfSU+Ci0gICAgICAgICAgPCVpZiAoIWdlbk1vZGVsLmlzVmlydHVhbERlbGVnYXRpb24oKSB8fCBnZW5GZWF0dXJlLmlzUHJpbWl0aXZlVHlwZSgpKSB7JT4KLSAgICAgICAgICAgIDwlaWYgKGdlbkNsYXNzLmlzRVNldEZsYWcoZ2VuRmVhdHVyZSkpIHslPgotCQk8JT1nZW5DbGFzcy5nZXRFU2V0RmxhZ3NGaWVsZChnZW5GZWF0dXJlKSU+ICY9IH48JT1nZW5GZWF0dXJlLmdldFVwcGVyTmFtZSgpJT5fRVNFVEZMQUc7Ci0gICAgICAgICAgICA8JX0gZWxzZSB7JT4KLQkJPCU9Z2VuRmVhdHVyZS5nZXRVbmNhcE5hbWUoKSU+RVNldCA9IGZhbHNlOwotICAgICAgICAgICAgPCV9JT4KLSAgICAgICAgICA8JX0lPgotICAgICAgICAgIDwlaWYgKCFnZW5Nb2RlbC5pc1N1cHByZXNzTm90aWZpY2F0aW9uKCkpIHslPgotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyA8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsIiklPih0aGlzLCA8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbiIpJT4uVU5TRVQsIDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+PCU9cG9zaXRpdmVPZmZzZXRDb3JyZWN0aW9uJT4sIDwlaWYgKGdlbk1vZGVsLmlzVmlydHVhbERlbGVnYXRpb24oKSAmJiAhZ2VuRmVhdHVyZS5pc1ByaW1pdGl2ZVR5cGUoKSkgeyU+aXNTZXRDaGFuZ2UgPyBvbGQ8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+IDogPCU9Z2VuRmVhdHVyZS5nZXRFRGVmYXVsdCgpJT48JX0gZWxzZSB7JT5vbGQ8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+PCV9JT4sIDwlPWdlbkZlYXR1cmUuZ2V0RURlZmF1bHQoKSU+LCA8JWlmIChnZW5Nb2RlbC5pc1ZpcnR1YWxEZWxlZ2F0aW9uKCkgJiYgIWdlbkZlYXR1cmUuaXNQcmltaXRpdmVUeXBlKCkpIHslPmlzU2V0Q2hhbmdlPCV9IGVsc2UgeyU+b2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPkVTZXQ8JX0lPikpOwotICAgICAgICAgIDwlfSU+Ci0gICAgICAgIDwlfSU+Ci0gICAgICA8JX0lPgotICAgIDwlfSBlbHNlIGlmIChnZW5GZWF0dXJlLmhhc0RlbGVnYXRlRmVhdHVyZSgpKSB7IEdlbkZlYXR1cmUgZGVsZWdhdGVGZWF0dXJlID0gZ2VuRmVhdHVyZS5nZXREZWxlZ2F0ZUZlYXR1cmUoKTslPgotICAgICAgPCVpZiAoZGVsZWdhdGVGZWF0dXJlLmlzV3JhcHBlZEZlYXR1cmVNYXBUeXBlKCkpIHslPgotCQkoKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcCIpJT4uSW50ZXJuYWwpKCg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXAiKSU+LkludGVybmFsLldyYXBwZXIpZ2V0PCU9ZGVsZWdhdGVGZWF0dXJlLmdldEFjY2Vzc29yTmFtZSgpJT4oKSkuZmVhdHVyZU1hcCgpKS5jbGVhcig8JT1nZW5GZWF0dXJlLmdldFF1YWxpZmllZEZlYXR1cmVBY2Nlc3NvcigpJT4pOwotICAgICAgPCV9IGVsc2UgeyU+Ci0JCSgoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwIiklPi5JbnRlcm5hbClnZXQ8JT1kZWxlZ2F0ZUZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPigpKS5jbGVhcig8JT1nZW5GZWF0dXJlLmdldFF1YWxpZmllZEZlYXR1cmVBY2Nlc3NvcigpJT4pOwotICAgICAgPCV9JT4KLSAgICA8JX0gZWxzZSB7JT4KLTwlQCBpbmNsdWRlIGZpbGU9IkNsYXNzL3Vuc2V0R2VuRmVhdHVyZS5UT0RPLm92ZXJyaWRlLmphdmFqZXRpbmMiIGZhaWw9ImFsdGVybmF0aXZlIiAlPgotPCVAIHN0YXJ0ICU+Ci0JCS8vIFRPRE86IGltcGxlbWVudCB0aGlzIG1ldGhvZCB0byB1bnNldCB0aGUgJzwlPWdlbkZlYXR1cmUuZ2V0Rm9ybWF0dGVkTmFtZSgpJT4nIDwlPWdlbkZlYXR1cmUuZ2V0RmVhdHVyZUtpbmQoKSU+Ci0JCS8vIEVuc3VyZSB0aGF0IHlvdSByZW1vdmUgQGdlbmVyYXRlZCBvciBtYXJrIGl0IEBnZW5lcmF0ZWQgTk9UCi0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotPCVAIGVuZCAlPjwlLy9DbGFzcy91bnNldEdlbkZlYXR1cmUudG9kby5vdmVycmlkZS5qYXZhamV0aW5jJT4KLSAgICA8JX0lPgotCX0KLQotPCV9JT4KLTwlQCBlbmQgJT48JS8vQ2xhc3MvdW5zZXRHZW5GZWF0dXJlLm92ZXJyaWRlLmphdmFqZXRpbmMlPgotICA8JX0lPgotICA8JWlmIChnZW5GZWF0dXJlLmlzSXNTZXQoKSAmJiAoaXNJbXBsZW1lbnRhdGlvbiB8fCAhZ2VuRmVhdHVyZS5pc1N1cHByZXNzZWRJc1NldFZpc2liaWxpdHkoKSkpIHslPgotPCVAIGluY2x1ZGUgZmlsZT0iQ2xhc3MvaXNTZXRHZW5GZWF0dXJlLm92ZXJyaWRlLmphdmFqZXRpbmMiIGZhaWw9ImFsdGVybmF0aXZlIiAlPgotPCVAIHN0YXJ0ICU+Ci08JWlmIChpc0ludGVyZmFjZSkgeyU+Ci08JUAgaW5jbHVkZSBmaWxlPSJDbGFzcy9pc1NldEdlbkZlYXR1cmUuamF2YWRvYy5vdmVycmlkZS5qYXZhamV0aW5jIiBmYWlsPSJhbHRlcm5hdGl2ZSIgJT4KLTwlQCBzdGFydCAlPgotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkSW50ZXJmYWNlTmFtZSgpJT4jPCU9Z2VuRmVhdHVyZS5nZXRHZXRBY2Nlc3NvcigpJT4gPGVtPjwlPWdlbkZlYXR1cmUuZ2V0Rm9ybWF0dGVkTmFtZSgpJT48L2VtPn0nIDwlPWdlbkZlYXR1cmUuZ2V0RmVhdHVyZUtpbmQoKSU+IGlzIHNldC4KLTwlQCBpbmNsdWRlIGZpbGU9IkNsYXNzL2lzU2V0R2VuRmVhdHVyZS5qYXZhZG9jLmluc2VydC5qYXZhamV0aW5jIiBmYWlsPSJzaWxlbnQiICU+Ci0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjwlPWdlbkZlYXR1cmUuZ2V0Rm9ybWF0dGVkTmFtZSgpJT48L2VtPicgPCU9Z2VuRmVhdHVyZS5nZXRGZWF0dXJlS2luZCgpJT4gaXMgc2V0LgotICAgIDwlaWYgKGdlbkZlYXR1cmUuaXNDaGFuZ2VhYmxlKCkgJiYgIWdlbkZlYXR1cmUuaXNTdXBwcmVzc2VkVW5zZXRWaXNpYmlsaXR5KCkpIHslPgotCSAqIEBzZWUgI3Vuc2V0PCU9Z2VuRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+KCkKLSAgICA8JX0lPgotCSAqIEBzZWUgIzwlPWdlbkZlYXR1cmUuZ2V0R2V0QWNjZXNzb3IoKSU+KCkKLSAgICA8JWlmICghZ2VuRmVhdHVyZS5pc0xpc3RUeXBlKCkgJiYgZ2VuRmVhdHVyZS5pc0NoYW5nZWFibGUoKSAmJiAhZ2VuRmVhdHVyZS5pc1N1cHByZXNzZWRTZXRWaXNpYmlsaXR5KCkpIHslPgotCSAqIEBzZWUgI3NldDwlPWdlbkZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPig8JT1nZW5GZWF0dXJlLmdldFJhd0ltcG9ydGVkQm91bmRUeXBlKCklPikKLSAgICA8JX0lPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLTwlQCBlbmQgJT48JS8vQ2xhc3MvaXNTZXRHZW5GZWF0dXJlLmphdmFkb2Mub3ZlcnJpZGUuamF2YWpldGluYyU+Ci08JX0gZWxzZSB7JT4KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLTwlaWYgKGdlbk1vZGVsLmdldENvbXBsaWFuY2VMZXZlbCgpLmdldFZhbHVlKCkgPj0gR2VuSkRLTGV2ZWwuSkRLNTApIHsgLy9DbGFzcy9pc1NldEdlbkZlYXR1cmUuYW5ub3RhdGlvbnMuaW5zZXJ0LmphdmFqZXRpbmMlPgotPCVAIGluY2x1ZGUgZmlsZT0iQ2xhc3MvaXNTZXRHZW5GZWF0dXJlLmFubm90YXRpb25zLmluc2VydC5qYXZhamV0aW5jIiBmYWlsPSJzaWxlbnQiICU+Ci08JX0lPgotPCV9JT4KLTwlaWYgKCFpc0ltcGxlbWVudGF0aW9uKSB7JT4KLQlib29sZWFuIGlzU2V0PCU9Z2VuRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+KCk7Ci0KLTwlfSBlbHNlIHslPgotCXB1YmxpYyBib29sZWFuIGlzU2V0PCU9Z2VuRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+KCkKLQl7Ci0gICAgPCVpZiAoZ2VuTW9kZWwuaXNSZWZsZWN0aXZlRGVsZWdhdGlvbigpKSB7JT4KLQkJcmV0dXJuIGVJc1NldCg8JT1nZW5GZWF0dXJlLmdldFF1YWxpZmllZEZlYXR1cmVBY2Nlc3NvcigpJT4pOwotICAgIDwlfSBlbHNlIGlmICghZ2VuRmVhdHVyZS5pc1ZvbGF0aWxlKCkpIHslPgotICAgICAgPCVpZiAoZ2VuRmVhdHVyZS5pc0xpc3RUeXBlKCkpIHslPgotICAgICAgICA8JWlmIChnZW5Nb2RlbC5pc1ZpcnR1YWxEZWxlZ2F0aW9uKCkpIHslPgotCQk8JT1nZW5GZWF0dXJlLmdldEltcG9ydGVkVHlwZShnZW5DbGFzcyklPiA8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPiA9ICg8JT1nZW5GZWF0dXJlLmdldEltcG9ydGVkVHlwZShnZW5DbGFzcyklPillVmlydHVhbEdldCg8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPjwlPXBvc2l0aXZlT2Zmc2V0Q29ycmVjdGlvbiU+KTsKLSAgICAgICAgPCV9JT4KLQkJcmV0dXJuIDwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+ICE9IG51bGwgJiYgKCg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3QiKSU+LlVuc2V0dGFibGU8JT1zaW5nbGVXaWxkY2FyZCU+KTwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+KS5pc1NldCgpOwotICAgICAgPCV9IGVsc2UgeyU+Ci0gICAgICAgIDwlaWYgKGdlbk1vZGVsLmlzVmlydHVhbERlbGVnYXRpb24oKSAmJiAhZ2VuRmVhdHVyZS5pc1ByaW1pdGl2ZVR5cGUoKSkgeyU+Ci0JCXJldHVybiBlVmlydHVhbElzU2V0KDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+PCU9cG9zaXRpdmVPZmZzZXRDb3JyZWN0aW9uJT4pOwotICAgICAgICA8JX0gZWxzZSBpZiAoZ2VuQ2xhc3MuaXNFU2V0RmxhZyhnZW5GZWF0dXJlKSkgeyU+Ci0JCXJldHVybiAoPCU9Z2VuQ2xhc3MuZ2V0RVNldEZsYWdzRmllbGQoZ2VuRmVhdHVyZSklPiAmIDwlPWdlbkZlYXR1cmUuZ2V0VXBwZXJOYW1lKCklPl9FU0VURkxBRykgIT0gMDsKLSAgICAgICAgPCV9IGVsc2UgeyU+Ci0JCXJldHVybiA8JT1nZW5GZWF0dXJlLmdldFVuY2FwTmFtZSgpJT5FU2V0OwotICAgICAgICA8JX0lPgotICAgICAgPCV9JT4KLSAgICA8JX0gZWxzZSBpZiAoZ2VuRmVhdHVyZS5oYXNEZWxlZ2F0ZUZlYXR1cmUoKSkgeyBHZW5GZWF0dXJlIGRlbGVnYXRlRmVhdHVyZSA9IGdlbkZlYXR1cmUuZ2V0RGVsZWdhdGVGZWF0dXJlKCk7JT4KLSAgICAgIDwlaWYgKGRlbGVnYXRlRmVhdHVyZS5pc1dyYXBwZWRGZWF0dXJlTWFwVHlwZSgpKSB7JT4KLQkJcmV0dXJuICEoKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcCIpJT4uSW50ZXJuYWwpKCg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXAiKSU+LkludGVybmFsLldyYXBwZXIpZ2V0PCU9ZGVsZWdhdGVGZWF0dXJlLmdldEFjY2Vzc29yTmFtZSgpJT4oKSkuZmVhdHVyZU1hcCgpKS5pc0VtcHR5KDwlPWdlbkZlYXR1cmUuZ2V0UXVhbGlmaWVkRmVhdHVyZUFjY2Vzc29yKCklPik7Ci0gICAgICA8JX0gZWxzZSB7JT4KLQkJcmV0dXJuICEoKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcCIpJT4uSW50ZXJuYWwpZ2V0PCU9ZGVsZWdhdGVGZWF0dXJlLmdldEFjY2Vzc29yTmFtZSgpJT4oKSkuaXNFbXB0eSg8JT1nZW5GZWF0dXJlLmdldFF1YWxpZmllZEZlYXR1cmVBY2Nlc3NvcigpJT4pOwotICAgICAgPCV9JT4KLSAgICA8JX0gZWxzZSB7JT4KLTwlQCBpbmNsdWRlIGZpbGU9IkNsYXNzL2lzU2V0R2VuRmVhdHVyZS5UT0RPLm92ZXJyaWRlLmphdmFqZXRpbmMiIGZhaWw9ImFsdGVybmF0aXZlIiAlPgotPCVAIHN0YXJ0ICU+Ci0JCS8vIFRPRE86IGltcGxlbWVudCB0aGlzIG1ldGhvZCB0byByZXR1cm4gd2hldGhlciB0aGUgJzwlPWdlbkZlYXR1cmUuZ2V0Rm9ybWF0dGVkTmFtZSgpJT4nIDwlPWdlbkZlYXR1cmUuZ2V0RmVhdHVyZUtpbmQoKSU+IGlzIHNldAotCQkvLyBFbnN1cmUgdGhhdCB5b3UgcmVtb3ZlIEBnZW5lcmF0ZWQgb3IgbWFyayBpdCBAZ2VuZXJhdGVkIE5PVAotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLTwlQCBlbmQgJT48JS8vQ2xhc3MvaXNTZXRHZW5GZWF0dXJlLnRvZG8ub3ZlcnJpZGUuamF2YWpldGluYyU+Ci0gICAgPCV9JT4KLQl9Ci0KLTwlfSU+Ci08JUAgZW5kICU+PCUvL0NsYXNzL2lzU2V0R2VuRmVhdHVyZS5vdmVycmlkZS5qYXZhamV0aW5jJT4KLSAgPCV9JT4KLTwlQCBpbmNsdWRlIGZpbGU9IkNsYXNzL2dlbkZlYXR1cmUuaW5zZXJ0LmphdmFqZXRpbmMiIGZhaWw9InNpbGVudCIgJT4KLTwlQCBlbmQgJT48JS8vQ2xhc3MvZ2VuRmVhdHVyZS5vdmVycmlkZS5qYXZhamV0aW5jJT4KLTwlfS8vZm9yJT4KLTwlfX0ucnVuKCk7JT4KLTwlZm9yIChHZW5PcGVyYXRpb24gZ2VuT3BlcmF0aW9uIDogKGlzSW1wbGVtZW50YXRpb24gPyBnZW5DbGFzcy5nZXRJbXBsZW1lbnRlZEdlbk9wZXJhdGlvbnMoKSA6IGdlbkNsYXNzLmdldERlY2xhcmVkR2VuT3BlcmF0aW9ucygpKSkgeyU+Ci08JUAgaW5jbHVkZSBmaWxlPSJDbGFzcy9nZW5PcGVyYXRpb24ub3ZlcnJpZGUuamF2YWpldGluYyIgZmFpbD0iYWx0ZXJuYXRpdmUiICU+Ci08JUAgc3RhcnQgJT4KLTwlaWYgKGlzSW50ZXJmYWNlKSB7JT4KLTwlQCBpbmNsdWRlIGZpbGU9IkNsYXNzL2dlbk9wZXJhdGlvbi5qYXZhZG9jLm92ZXJyaWRlLmphdmFqZXRpbmMiIGZhaWw9ImFsdGVybmF0aXZlIiAlPgotPCVAIHN0YXJ0ICU+Ci0JLyoqCi08JUAgaW5jbHVkZSBmaWxlPSJDbGFzcy9nZW5PcGVyYXRpb24uamF2YWRvYy5pbnNlcnQuamF2YWpldGluYyIgZmFpbD0ic2lsZW50IiAlPgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gIDwlaWYgKGdlbk9wZXJhdGlvbi5oYXNEb2N1bWVudGF0aW9uKCkgfHwgZ2VuT3BlcmF0aW9uLmhhc1BhcmFtZXRlckRvY3VtZW50YXRpb24oKSkgeyU+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gICAgPCVpZiAoZ2VuT3BlcmF0aW9uLmhhc0RvY3VtZW50YXRpb24oKSkgeyU+Ci0JICogPCU9Z2VuT3BlcmF0aW9uLmdldERvY3VtZW50YXRpb24oZ2VuTW9kZWwuZ2V0SW5kZW50YXRpb24oc3RyaW5nQnVmZmVyKSklPgotICAgIDwlfSU+Ci0gICAgPCVmb3IgKEdlblBhcmFtZXRlciBnZW5QYXJhbWV0ZXIgOiBnZW5PcGVyYXRpb24uZ2V0R2VuUGFyYW1ldGVycygpKSB7JT4KLSAgICAgIDwlaWYgKGdlblBhcmFtZXRlci5oYXNEb2N1bWVudGF0aW9uKCkpIHsgU3RyaW5nIGRvY3VtZW50YXRpb24gPSBnZW5QYXJhbWV0ZXIuZ2V0RG9jdW1lbnRhdGlvbigiIik7JT4KLSAgICAgICAgPCVpZiAoZG9jdW1lbnRhdGlvbi5jb250YWlucygiXG4iKSB8fCBkb2N1bWVudGF0aW9uLmNvbnRhaW5zKCJcciIpKSB7JT4KLQkgKiBAcGFyYW0gPCU9Z2VuUGFyYW1ldGVyLmdldE5hbWUoKSU+Ci0JICogICA8JT1nZW5QYXJhbWV0ZXIuZ2V0RG9jdW1lbnRhdGlvbihnZW5Nb2RlbC5nZXRJbmRlbnRhdGlvbihzdHJpbmdCdWZmZXIpKSU+Ci0gICAgICAgIDwlfSBlbHNlIHslPgotCSAqIEBwYXJhbSA8JT1nZW5QYXJhbWV0ZXIuZ2V0TmFtZSgpJT4gPCU9Z2VuUGFyYW1ldGVyLmdldERvY3VtZW50YXRpb24oZ2VuTW9kZWwuZ2V0SW5kZW50YXRpb24oc3RyaW5nQnVmZmVyKSklPgotICAgICAgICA8JX0lPgotICAgICAgPCV9JT4KLSAgICA8JX0lPgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAgPCV9JT4KLSAgPCVpZiAoIWdlbk1vZGVsLmlzU3VwcHJlc3NFTUZNb2RlbFRhZ3MoKSkgeyBib29sZWFuIGZpcnN0ID0gdHJ1ZTsgZm9yIChTdHJpbmdUb2tlbml6ZXIgc3RyaW5nVG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcihnZW5PcGVyYXRpb24uZ2V0TW9kZWxJbmZvKCksICJcblxyIik7IHN0cmluZ1Rva2VuaXplci5oYXNNb3JlVG9rZW5zKCk7ICkgeyBTdHJpbmcgbW9kZWxJbmZvID0gc3RyaW5nVG9rZW5pemVyLm5leHRUb2tlbigpOyBpZiAoZmlyc3QpIHsgZmlyc3QgPSBmYWxzZTslPgotCSAqIEBtb2RlbCA8JT1tb2RlbEluZm8lPgotICA8JX0gZWxzZSB7JT4KLQkgKiAgICAgICAgPCU9bW9kZWxJbmZvJT4KLSAgPCV9fSBpZiAoZmlyc3QpIHslPgotCSAqIEBtb2RlbAotICA8JX19JT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi08JUAgZW5kICU+PCUvL0NsYXNzL2dlbk9wZXJhdGlvbi5qYXZhZG9jLm92ZXJyaWRlLmphdmFqZXRpbmMlPgotPCV9IGVsc2UgeyU+Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi08JWlmIChnZW5Nb2RlbC5nZXRDb21wbGlhbmNlTGV2ZWwoKS5nZXRWYWx1ZSgpID49IEdlbkpES0xldmVsLkpESzUwKSB7IC8vQ2xhc3MvZ2VuT3BlcmF0aW9uLmFubm90YXRpb25zLmluc2VydC5qYXZhamV0aW5jJT4KLTwlQCBpbmNsdWRlIGZpbGU9IkNsYXNzL2dlbk9wZXJhdGlvbi5hbm5vdGF0aW9ucy5pbnNlcnQuamF2YWpldGluYyIgZmFpbD0ic2lsZW50IiAlPgotPCV9JT4KLTwlfSU+Ci08JWlmICghaXNJbXBsZW1lbnRhdGlvbikgeyU+Ci0JPCU9Z2VuT3BlcmF0aW9uLmdldFR5cGVQYXJhbWV0ZXJzKGdlbkNsYXNzKSU+PCU9Z2VuT3BlcmF0aW9uLmdldEltcG9ydGVkVHlwZShnZW5DbGFzcyklPiA8JT1nZW5PcGVyYXRpb24uZ2V0TmFtZSgpJT4oPCU9Z2VuT3BlcmF0aW9uLmdldFBhcmFtZXRlcnMoZ2VuQ2xhc3MpJT4pPCU9Z2VuT3BlcmF0aW9uLmdldFRocm93cyhnZW5DbGFzcyklPjsKLQotPCV9IGVsc2UgeyU+Ci0JcHVibGljIDwlPWdlbk9wZXJhdGlvbi5nZXRUeXBlUGFyYW1ldGVycyhnZW5DbGFzcyklPjwlPWdlbk9wZXJhdGlvbi5nZXRJbXBvcnRlZFR5cGUoZ2VuQ2xhc3MpJT4gPCU9Z2VuT3BlcmF0aW9uLmdldE5hbWUoKSU+KDwlPWdlbk9wZXJhdGlvbi5nZXRQYXJhbWV0ZXJzKGdlbkNsYXNzKSU+KTwlPWdlbk9wZXJhdGlvbi5nZXRUaHJvd3MoZ2VuQ2xhc3MpJT4KLQl7Ci0gIDwlaWYgKGdlbk9wZXJhdGlvbi5oYXNCb2R5KCkpIHslPgotCQk8JT1nZW5PcGVyYXRpb24uZ2V0Qm9keShnZW5Nb2RlbC5nZXRJbmRlbnRhdGlvbihzdHJpbmdCdWZmZXIpKSU+Ci0gIDwlfSBlbHNlIGlmIChnZW5PcGVyYXRpb24uaXNJbnZhcmlhbnQoKSkge0dlbkNsYXNzIG9wQ2xhc3MgPSBnZW5PcGVyYXRpb24uZ2V0R2VuQ2xhc3MoKTsgU3RyaW5nIGRpYWdub3N0aWNzID0gZ2VuT3BlcmF0aW9uLmdldEdlblBhcmFtZXRlcnMoKS5nZXQoMCkuZ2V0TmFtZSgpOyBTdHJpbmcgY29udGV4dCA9IGdlbk9wZXJhdGlvbi5nZXRHZW5QYXJhbWV0ZXJzKCkuZ2V0KDEpLmdldE5hbWUoKTslPgotCQkvLyBUT0RPOiBpbXBsZW1lbnQgdGhpcyBtZXRob2QKLQkJLy8gLT4gc3BlY2lmeSB0aGUgY29uZGl0aW9uIHRoYXQgdmlvbGF0ZXMgdGhlIGludmFyaWFudAotCQkvLyAtPiB2ZXJpZnkgdGhlIGRldGFpbHMgb2YgdGhlIGRpYWdub3N0aWMsIGluY2x1ZGluZyBzZXZlcml0eSBhbmQgbWVzc2FnZQotCQkvLyBFbnN1cmUgdGhhdCB5b3UgcmVtb3ZlIEBnZW5lcmF0ZWQgb3IgbWFyayBpdCBAZ2VuZXJhdGVkIE5PVAotCQlpZiAoZmFsc2UpCi0JCXsKLQkJCWlmICg8JT1kaWFnbm9zdGljcyU+ICE9IG51bGwpCi0JCQl7Ci0JCQkJPCU9ZGlhZ25vc3RpY3MlPi5hZGQKLQkJCQkJKG5ldyA8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5CYXNpY0RpYWdub3N0aWMiKSU+Ci0JCQkJCQkoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRGlhZ25vc3RpYyIpJT4uRVJST1IsCi0JCQkJCQkgPCU9b3BDbGFzcy5nZXRHZW5QYWNrYWdlKCkuZ2V0SW1wb3J0ZWRWYWxpZGF0b3JDbGFzc05hbWUoKSU+LkRJQUdOT1NUSUNfU09VUkNFLAotCQkJCQkJIDwlPW9wQ2xhc3MuZ2V0R2VuUGFja2FnZSgpLmdldEltcG9ydGVkVmFsaWRhdG9yQ2xhc3NOYW1lKCklPi48JT1vcENsYXNzLmdldE9wZXJhdGlvbklEKGdlbk9wZXJhdGlvbiklPiwKLQkJCQkJCSA8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS5wbHVnaW4uRWNvcmVQbHVnaW4iKSU+LklOU1RBTkNFLmdldFN0cmluZygiX1VJX0dlbmVyaWNJbnZhcmlhbnRfZGlhZ25vc3RpYyIsIG5ldyBPYmplY3RbXSB7ICI8JT1nZW5PcGVyYXRpb24uZ2V0TmFtZSgpJT4iLCA8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RWYWxpZGF0b3IiKSU+LmdldE9iamVjdExhYmVsKHRoaXMsIDwlPWNvbnRleHQlPikgfSksPCU9Z2VuTW9kZWwuZ2V0Tm9uTkxTKCklPjwlPWdlbk1vZGVsLmdldE5vbk5MUygyKSU+Ci0JCQkJCQkgbmV3IE9iamVjdCBbXSB7IHRoaXMgfSkpOwotCQkJfQotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiB0cnVlOwotICA8JX0gZWxzZSB7JT4KLTwlQCBpbmNsdWRlIGZpbGU9IkNsYXNzL2ltcGxlbWVudGVkR2VuT3BlcmF0aW9uLlRPRE8ub3ZlcnJpZGUuamF2YWpldGluYyIgZmFpbD0iYWx0ZXJuYXRpdmUiICU+Ci08JUAgc3RhcnQgJT4KLQkJLy8gVE9ETzogaW1wbGVtZW50IHRoaXMgbWV0aG9kCi0JCS8vIEVuc3VyZSB0aGF0IHlvdSByZW1vdmUgQGdlbmVyYXRlZCBvciBtYXJrIGl0IEBnZW5lcmF0ZWQgTk9UCi0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotPCVAIGVuZCAlPjwlLy9DbGFzcy9pbXBsZW1lbnRlZEdlbk9wZXJhdGlvbi50b2RvLm92ZXJyaWRlLmphdmFqZXRpbmMlPgotICA8JX0lPgotCX0KLQotPCV9JT4KLTwlQCBpbmNsdWRlIGZpbGU9IkNsYXNzL2dlbk9wZXJhdGlvbi5pbnNlcnQuamF2YWpldGluYyIgZmFpbD0ic2lsZW50IiAlPgotPCVAIGVuZCAlPjwlLy9DbGFzcy9pbXBsZW1lbnRlZEdlbk9wZXJhdGlvbi5vdmVycmlkZS5qYXZhamV0aW5jJT4KLTwlfS8vZm9yJT4KLTwlaWYgKGlzSW1wbGVtZW50YXRpb24gJiYgIWdlbk1vZGVsLmlzUmVmbGVjdGl2ZURlbGVnYXRpb24oKSAmJiBnZW5DbGFzcy5pbXBsZW1lbnRzQW55KGdlbkNsYXNzLmdldEVJbnZlcnNlQWRkR2VuRmVhdHVyZXMoKSkpIHslPgotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICA8JWlmIChnZW5Nb2RlbC51c2VHZW5lcmljcygpKSB7JT4KLSAgICA8JWZvciAoR2VuRmVhdHVyZSBnZW5GZWF0dXJlIDogZ2VuQ2xhc3MuZ2V0RUludmVyc2VBZGRHZW5GZWF0dXJlcygpKSB7JT4KLSAgICAgIDwlaWYgKGdlbkZlYXR1cmUuaXNVbmNoZWNrZWRDYXN0KCkpIHslPgotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICAgICAgPCVicmVhazsgfSU+Ci0gICAgPCV9JT4KLSAgPCV9JT4KLSAgPCVpZiAoZ2VuTW9kZWwudXNlQ2xhc3NPdmVycmlkZUFubm90YXRpb24oKSkgeyU+Ci0JQE92ZXJyaWRlCi0gIDwlfSU+Ci0JcHVibGljIDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW4iKSU+IGVJbnZlcnNlQWRkKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdCIpJT4gb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW4iKSU+IG1zZ3MpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRDwlPW5lZ2F0aXZlT2Zmc2V0Q29ycmVjdGlvbiU+KQotCQl7Ci08JWZvciAoR2VuRmVhdHVyZSBnZW5GZWF0dXJlIDogZ2VuQ2xhc3MuZ2V0RUludmVyc2VBZGRHZW5GZWF0dXJlcygpKSB7JT4KLQkJCWNhc2UgPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT46Ci0gIDwlaWYgKGdlbkZlYXR1cmUuaXNMaXN0VHlwZSgpKSB7IFN0cmluZyBjYXN0ID0gIigiICArIGdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdCIpICsgKCFnZW5Nb2RlbC51c2VHZW5lcmljcygpID8gIikiIDogIjwiICsgZ2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0IikgKyAiPikoIiArIGdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdCIpICsgIjw/PikiKTslPgotICAgIDwlaWYgKGdlbkZlYXR1cmUuaXNNYXBUeXBlKCkgJiYgZ2VuRmVhdHVyZS5pc0VmZmVjdGl2ZVN1cHByZXNzRU1GVHlwZXMoKSkgeyU+Ci0JCQkJcmV0dXJuICgoPCU9Y2FzdCU+KDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVNYXAiKSU+LkludGVybmFsTWFwVmlldzwlPWdlbkZlYXR1cmUuZ2V0SW1wb3J0ZWRNYXBUZW1wbGF0ZUFyZ3VtZW50cyhnZW5DbGFzcyklPik8JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPigpKS5lTWFwKCkpLmJhc2ljQWRkKG90aGVyRW5kLCBtc2dzKTsKLSAgICA8JX0gZWxzZSB7JT4KLQkJCQlyZXR1cm4gKDwlPWNhc3QlPjwlPWdlbkZlYXR1cmUuZ2V0R2V0QWNjZXNzb3IoKSU+KCkpLmJhc2ljQWRkKG90aGVyRW5kLCBtc2dzKTsKLSAgICA8JX0lPgotICA8JX0gZWxzZSBpZiAoZ2VuRmVhdHVyZS5pc0NvbnRhaW5lcigpKSB7JT4KLQkJCQlpZiAoZUludGVybmFsQ29udGFpbmVyKCkgIT0gbnVsbCkKLQkJCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0gICAgPCVpZiAoZ2VuRmVhdHVyZS5pc0Jhc2ljU2V0KCkpIHslPgotCQkJCXJldHVybiBiYXNpY1NldDwlPWdlbkZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPigoPCU9Z2VuRmVhdHVyZS5nZXRJbXBvcnRlZFR5cGUoZ2VuQ2xhc3MpJT4pb3RoZXJFbmQsIG1zZ3MpOwotICAgIDwlfSBlbHNlIHslPgotCQkJCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIob3RoZXJFbmQsIDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+PCU9cG9zaXRpdmVPZmZzZXRDb3JyZWN0aW9uJT4sIG1zZ3MpOwotICAgIDwlfSU+Ci0gIDwlfSBlbHNlIHslPgotICAgIDwlaWYgKGdlbkNsYXNzLmdldEltcGxlbWVudGluZ0dlbk1vZGVsKGdlbkZlYXR1cmUpLmlzVmlydHVhbERlbGVnYXRpb24oKSkgeyU+Ci0JCQkJPCU9Z2VuRmVhdHVyZS5nZXRJbXBvcnRlZFR5cGUoZ2VuQ2xhc3MpJT4gPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4gPSAoPCU9Z2VuRmVhdHVyZS5nZXRJbXBvcnRlZFR5cGUoZ2VuQ2xhc3MpJT4pZVZpcnR1YWxHZXQoPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT48JT1wb3NpdGl2ZU9mZnNldENvcnJlY3Rpb24lPik7Ci0gICAgPCV9IGVsc2UgaWYgKGdlbkZlYXR1cmUuaXNWb2xhdGlsZSgpKSB7JT4KLQkJCQk8JT1nZW5GZWF0dXJlLmdldEltcG9ydGVkVHlwZShnZW5DbGFzcyklPiA8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPiA9IDwlaWYgKGdlbkZlYXR1cmUuaXNSZXNvbHZlUHJveGllcygpKSB7JT5iYXNpY0dldDwlPWdlbkZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPjwlfSBlbHNlIHslPjwlPWdlbkZlYXR1cmUuZ2V0R2V0QWNjZXNzb3IoKSU+PCV9JT4oKTsKLSAgICA8JX0lPgotCQkJCWlmICg8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPiAhPSBudWxsKQotICAgIDwlaWYgKGdlbkZlYXR1cmUuaXNFZmZlY3RpdmVDb250YWlucygpKSB7JT4KLQkJCQkJbXNncyA9ICgoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0IiklPik8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPikuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+PCU9bmVnYXRpdmVPZmZzZXRDb3JyZWN0aW9uJT4sIG51bGwsIG1zZ3MpOwotICAgIDwlfSBlbHNlIHsgR2VuRmVhdHVyZSByZXZlcnNlRmVhdHVyZSA9IGdlbkZlYXR1cmUuZ2V0UmV2ZXJzZSgpOyBHZW5DbGFzcyB0YXJnZXRDbGFzcyA9IHJldmVyc2VGZWF0dXJlLmdldEdlbkNsYXNzKCk7IFN0cmluZyByZXZlcnNlT2Zmc2V0Q29ycmVjdGlvbiA9IHRhcmdldENsYXNzLmhhc09mZnNldENvcnJlY3Rpb24oKSA/ICIgKyAiICsgZ2VuQ2xhc3MuZ2V0T2Zmc2V0Q29ycmVjdGlvbkZpZWxkKHJldmVyc2VGZWF0dXJlKSA6ICIiOyU+Ci0JCQkJCW1zZ3MgPSAoKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdCIpJT4pPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4pLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIDwlPXRhcmdldENsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChyZXZlcnNlRmVhdHVyZSklPjwlPXJldmVyc2VPZmZzZXRDb3JyZWN0aW9uJT4sIDwlPXRhcmdldENsYXNzLmdldEltcG9ydGVkSW50ZXJmYWNlTmFtZSgpJT4uY2xhc3MsIG1zZ3MpOwotICAgIDwlfSU+Ci0JCQkJcmV0dXJuIGJhc2ljU2V0PCU9Z2VuRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+KCg8JT1nZW5GZWF0dXJlLmdldEltcG9ydGVkVHlwZShnZW5DbGFzcyklPilvdGhlckVuZCwgbXNncyk7Ci0gIDwlfSU+Ci08JX0lPgotCQl9Ci08JWlmIChnZW5Nb2RlbC5pc01pbmltYWxSZWZsZWN0aXZlTWV0aG9kcygpKSB7JT4KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlQWRkKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotPCV9IGVsc2UgeyU+Ci0JCXJldHVybiBlRHluYW1pY0ludmVyc2VBZGQob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci08JX0lPgotCX0KLQotPCV9JT4KLTwlaWYgKGlzSW1wbGVtZW50YXRpb24gJiYgIWdlbk1vZGVsLmlzUmVmbGVjdGl2ZURlbGVnYXRpb24oKSAmJiBnZW5DbGFzcy5pbXBsZW1lbnRzQW55KGdlbkNsYXNzLmdldEVJbnZlcnNlUmVtb3ZlR2VuRmVhdHVyZXMoKSkpIHslPgotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICA8JWlmIChnZW5Nb2RlbC51c2VDbGFzc092ZXJyaWRlQW5ub3RhdGlvbigpKSB7JT4KLQlAT3ZlcnJpZGUKLSAgPCV9JT4KLQlwdWJsaWMgPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbiIpJT4gZUludmVyc2VSZW1vdmUoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0IiklPiBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbiIpJT4gbXNncykKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEPCU9bmVnYXRpdmVPZmZzZXRDb3JyZWN0aW9uJT4pCi0JCXsKLTwlZm9yIChHZW5GZWF0dXJlIGdlbkZlYXR1cmUgOiBnZW5DbGFzcy5nZXRFSW52ZXJzZVJlbW92ZUdlbkZlYXR1cmVzKCkpIHslPgotCQkJY2FzZSA8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPjoKLSAgPCVpZiAoZ2VuRmVhdHVyZS5pc0xpc3RUeXBlKCkpIHslPgotICAgIDwlaWYgKGdlbkZlYXR1cmUuaXNNYXBUeXBlKCkgJiYgZ2VuRmVhdHVyZS5pc0VmZmVjdGl2ZVN1cHByZXNzRU1GVHlwZXMoKSkgeyU+Ci0JCQkJcmV0dXJuICgoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0IiklPjwlPXNpbmdsZVdpbGRjYXJkJT4pKCg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTWFwIiklPi5JbnRlcm5hbE1hcFZpZXc8JT1nZW5GZWF0dXJlLmdldEltcG9ydGVkTWFwVGVtcGxhdGVBcmd1bWVudHMoZ2VuQ2xhc3MpJT4pPCU9Z2VuRmVhdHVyZS5nZXRHZXRBY2Nlc3NvcigpJT4oKSkuZU1hcCgpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0gICAgPCV9IGVsc2UgaWYgKGdlbkZlYXR1cmUuaXNXcmFwcGVkRmVhdHVyZU1hcFR5cGUoKSkgeyU+Ci0JCQkJcmV0dXJuICgoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0IiklPjwlPXNpbmdsZVdpbGRjYXJkJT4pKCg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXAiKSU+LkludGVybmFsLldyYXBwZXIpPCU9Z2VuRmVhdHVyZS5nZXRHZXRBY2Nlc3NvcigpJT4oKSkuZmVhdHVyZU1hcCgpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0gICAgPCV9IGVsc2UgeyU+Ci0JCQkJcmV0dXJuICgoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0IiklPjwlPXNpbmdsZVdpbGRjYXJkJT4pPCU9Z2VuRmVhdHVyZS5nZXRHZXRBY2Nlc3NvcigpJT4oKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotICAgIDwlfSU+Ci0gIDwlfSBlbHNlIGlmIChnZW5GZWF0dXJlLmlzQ29udGFpbmVyKCkgJiYgIWdlbkZlYXR1cmUuaXNCYXNpY1NldCgpKSB7JT4KLQkJCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+PCU9cG9zaXRpdmVPZmZzZXRDb3JyZWN0aW9uJT4sIG1zZ3MpOwotICA8JX0gZWxzZSBpZiAoZ2VuRmVhdHVyZS5pc1Vuc2V0dGFibGUoKSkgeyU+Ci0JCQkJcmV0dXJuIGJhc2ljVW5zZXQ8JT1nZW5GZWF0dXJlLmdldEFjY2Vzc29yTmFtZSgpJT4obXNncyk7Ci0gIDwlfSBlbHNlIHslPgotCQkJCXJldHVybiBiYXNpY1NldDwlPWdlbkZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPihudWxsLCBtc2dzKTsKLSAgPCV9JT4KLTwlfSU+Ci0JCX0KLTwlaWYgKGdlbk1vZGVsLmlzTWluaW1hbFJlZmxlY3RpdmVNZXRob2RzKCkpIHslPgotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci08JX0gZWxzZSB7JT4KLQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLTwlfSU+Ci0JfQotCi08JX0lPgotPCVpZiAoaXNJbXBsZW1lbnRhdGlvbiAmJiAhZ2VuTW9kZWwuaXNSZWZsZWN0aXZlRGVsZWdhdGlvbigpICYmIGdlbkNsYXNzLmltcGxlbWVudHNBbnkoZ2VuQ2xhc3MuZ2V0RUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lckdlbkZlYXR1cmVzKCkpKSB7JT4KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgPCVpZiAoZ2VuTW9kZWwudXNlQ2xhc3NPdmVycmlkZUFubm90YXRpb24oKSkgeyU+Ci0JQE92ZXJyaWRlCi0gIDwlfSU+Ci0JcHVibGljIDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW4iKSU+IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXJGZWF0dXJlKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW4iKSU+IG1zZ3MpCi0JewotCQlzd2l0Y2ggKGVDb250YWluZXJGZWF0dXJlSUQ8JT1uZWdhdGl2ZU9mZnNldENvcnJlY3Rpb24lPikKLQkJewotPCVmb3IgKEdlbkZlYXR1cmUgZ2VuRmVhdHVyZSA6IGdlbkNsYXNzLmdldEVCYXNpY1JlbW92ZUZyb21Db250YWluZXJHZW5GZWF0dXJlcygpKSB7JT4KLSAgPCVHZW5GZWF0dXJlIHJldmVyc2VGZWF0dXJlID0gZ2VuRmVhdHVyZS5nZXRSZXZlcnNlKCk7IEdlbkNsYXNzIHRhcmdldENsYXNzID0gcmV2ZXJzZUZlYXR1cmUuZ2V0R2VuQ2xhc3MoKTsgU3RyaW5nIHJldmVyc2VPZmZzZXRDb3JyZWN0aW9uID0gdGFyZ2V0Q2xhc3MuaGFzT2Zmc2V0Q29ycmVjdGlvbigpID8gIiArICIgKyBnZW5DbGFzcy5nZXRPZmZzZXRDb3JyZWN0aW9uRmllbGQocmV2ZXJzZUZlYXR1cmUpIDogIiI7JT4KLQkJCWNhc2UgPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT46Ci0JCQkJcmV0dXJuIGVJbnRlcm5hbENvbnRhaW5lcigpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIDwlPXRhcmdldENsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChyZXZlcnNlRmVhdHVyZSklPjwlPXJldmVyc2VPZmZzZXRDb3JyZWN0aW9uJT4sIDwlPXRhcmdldENsYXNzLmdldEltcG9ydGVkSW50ZXJmYWNlTmFtZSgpJT4uY2xhc3MsIG1zZ3MpOwotPCV9JT4KLQkJfQotPCVpZiAoZ2VuTW9kZWwuaXNNaW5pbWFsUmVmbGVjdGl2ZU1ldGhvZHMoKSkgeyU+Ci0JCXJldHVybiBzdXBlci5lQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyRmVhdHVyZShtc2dzKTsKLTwlfSBlbHNlIHslPgotCQlyZXR1cm4gZUR5bmFtaWNCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci08JX0lPgotCX0KLQotPCV9JT4KLTwlaWYgKGlzSW1wbGVtZW50YXRpb24gJiYgIWdlbk1vZGVsLmlzUmVmbGVjdGl2ZURlbGVnYXRpb24oKSAmJiBnZW5DbGFzcy5pbXBsZW1lbnRzQW55KGdlbkNsYXNzLmdldEVHZXRHZW5GZWF0dXJlcygpKSkgeyU+Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIDwlaWYgKGdlbk1vZGVsLnVzZUNsYXNzT3ZlcnJpZGVBbm5vdGF0aW9uKCkpIHslPgotCUBPdmVycmlkZQotICA8JX0lPgotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRDwlPW5lZ2F0aXZlT2Zmc2V0Q29ycmVjdGlvbiU+KQotCQl7Ci08JWZvciAoR2VuRmVhdHVyZSBnZW5GZWF0dXJlIDogZ2VuQ2xhc3MuZ2V0RUdldEdlbkZlYXR1cmVzKCkpIHslPgotCQkJY2FzZSA8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPjoKLSAgPCVpZiAoZ2VuRmVhdHVyZS5pc1ByaW1pdGl2ZVR5cGUoKSkgeyU+Ci0gICAgPCVpZiAoZ2VuRmVhdHVyZS5pc0Jvb2xlYW5UeXBlKCkpIHslPgotCQkJCXJldHVybiA8JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPigpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLSAgICA8JX0gZWxzZSB7JT4KLQkJCQlyZXR1cm4gbmV3IDwlPWdlbkZlYXR1cmUuZ2V0T2JqZWN0VHlwZShnZW5DbGFzcyklPig8JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPigpKTsKLSAgICA8JX0lPgotICA8JX0gZWxzZSBpZiAoZ2VuRmVhdHVyZS5pc1Jlc29sdmVQcm94aWVzKCkgJiYgIWdlbkZlYXR1cmUuaXNMaXN0VHlwZSgpKSB7JT4KLQkJCQlpZiAocmVzb2x2ZSkgcmV0dXJuIDwlPWdlbkZlYXR1cmUuZ2V0R2V0QWNjZXNzb3IoKSU+KCk7Ci0JCQkJcmV0dXJuIGJhc2ljR2V0PCU9Z2VuRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+KCk7Ci0gIDwlfSBlbHNlIGlmIChnZW5GZWF0dXJlLmlzTWFwVHlwZSgpKSB7JT4KLSAgICA8JWlmIChnZW5GZWF0dXJlLmlzRWZmZWN0aXZlU3VwcHJlc3NFTUZUeXBlcygpKSB7JT4KLQkJCQlpZiAoY29yZVR5cGUpIHJldHVybiAoKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVNYXAiKSU+LkludGVybmFsTWFwVmlldzwlPWdlbkZlYXR1cmUuZ2V0SW1wb3J0ZWRNYXBUZW1wbGF0ZUFyZ3VtZW50cyhnZW5DbGFzcyklPik8JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPigpKS5lTWFwKCk7Ci0JCQkJZWxzZSByZXR1cm4gPCU9Z2VuRmVhdHVyZS5nZXRHZXRBY2Nlc3NvcigpJT4oKTsKLSAgICA8JX0gZWxzZSB7JT4KLQkJCQlpZiAoY29yZVR5cGUpIHJldHVybiA8JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPigpOwotCQkJCWVsc2UgcmV0dXJuIDwlPWdlbkZlYXR1cmUuZ2V0R2V0QWNjZXNzb3IoKSU+KCkubWFwKCk7Ci0gICAgPCV9JT4KLSAgPCV9IGVsc2UgaWYgKGdlbkZlYXR1cmUuaXNXcmFwcGVkRmVhdHVyZU1hcFR5cGUoKSkgeyU+Ci0JCQkJaWYgKGNvcmVUeXBlKSByZXR1cm4gKCg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXAiKSU+LkludGVybmFsLldyYXBwZXIpPCU9Z2VuRmVhdHVyZS5nZXRHZXRBY2Nlc3NvcigpJT4oKSkuZmVhdHVyZU1hcCgpOwotCQkJCXJldHVybiA8JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPigpOwotICA8JX0gZWxzZSBpZiAoZ2VuRmVhdHVyZS5pc0ZlYXR1cmVNYXBUeXBlKCkpIHslPgotCQkJCWlmIChjb3JlVHlwZSkgcmV0dXJuIDwlPWdlbkZlYXR1cmUuZ2V0R2V0QWNjZXNzb3IoKSU+KCk7Ci0JCQkJcmV0dXJuICgoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwIiklPi5JbnRlcm5hbCk8JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPigpKS5nZXRXcmFwcGVyKCk7Ci0gIDwlfSBlbHNlIHslPgotCQkJCXJldHVybiA8JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPigpOwotICA8JX0lPgotPCV9JT4KLQkJfQotPCVpZiAoZ2VuTW9kZWwuaXNNaW5pbWFsUmVmbGVjdGl2ZU1ldGhvZHMoKSkgeyU+Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotPCV9IGVsc2UgeyU+Ci0JCXJldHVybiBlRHluYW1pY0dldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLTwlfSU+Ci0JfQotCi08JX0lPgotPCVpZiAoaXNJbXBsZW1lbnRhdGlvbiAmJiAhZ2VuTW9kZWwuaXNSZWZsZWN0aXZlRGVsZWdhdGlvbigpICYmIGdlbkNsYXNzLmltcGxlbWVudHNBbnkoZ2VuQ2xhc3MuZ2V0RVNldEdlbkZlYXR1cmVzKCkpKSB7JT4KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgPCVpZiAoZ2VuTW9kZWwudXNlR2VuZXJpY3MoKSkgeyU+Ci0gICAgPCVmb3IgKEdlbkZlYXR1cmUgZ2VuRmVhdHVyZSA6IGdlbkNsYXNzLmdldEVTZXRHZW5GZWF0dXJlcygpKSB7JT4KLSAgICAgIDwlaWYgKGdlbkZlYXR1cmUuaXNVbmNoZWNrZWRDYXN0KCkgJiYgIWdlbkZlYXR1cmUuaXNGZWF0dXJlTWFwVHlwZSgpICYmICFnZW5GZWF0dXJlLmlzTWFwVHlwZSgpKSB7JT4KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLSAgICAgIDwlYnJlYWs7IH0lPgotICAgIDwlfSU+Ci0gIDwlfSU+Ci0gIDwlaWYgKGdlbk1vZGVsLnVzZUNsYXNzT3ZlcnJpZGVBbm5vdGF0aW9uKCkpIHslPgotCUBPdmVycmlkZQotICA8JX0lPgotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQ8JT1uZWdhdGl2ZU9mZnNldENvcnJlY3Rpb24lPikKLQkJewotICA8JWZvciAoR2VuRmVhdHVyZSBnZW5GZWF0dXJlIDogZ2VuQ2xhc3MuZ2V0RVNldEdlbkZlYXR1cmVzKCkpIHslPgotCQkJY2FzZSA8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPjoKLSAgICA8JWlmIChnZW5GZWF0dXJlLmlzTGlzdFR5cGUoKSkgeyU+Ci0gICAgICA8JWlmIChnZW5GZWF0dXJlLmlzV3JhcHBlZEZlYXR1cmVNYXBUeXBlKCkpIHslPgotCQkJCSgoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwIiklPi5JbnRlcm5hbCkoKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcCIpJT4uSW50ZXJuYWwuV3JhcHBlcik8JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPigpKS5mZWF0dXJlTWFwKCkpLnNldChuZXdWYWx1ZSk7Ci0gICAgICA8JX0gZWxzZSBpZiAoZ2VuRmVhdHVyZS5pc0ZlYXR1cmVNYXBUeXBlKCkpIHslPgotCQkJCSgoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwIiklPi5JbnRlcm5hbCk8JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPigpKS5zZXQobmV3VmFsdWUpOwotICAgICAgPCV9IGVsc2UgaWYgKGdlbkZlYXR1cmUuaXNNYXBUeXBlKCkpIHslPgotICAgICAgICA8JWlmIChnZW5GZWF0dXJlLmlzRWZmZWN0aXZlU3VwcHJlc3NFTUZUeXBlcygpKSB7JT4KLQkJCQkoKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZSIpJT4uU2V0dGluZykoKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVNYXAiKSU+LkludGVybmFsTWFwVmlldzwlPWdlbkZlYXR1cmUuZ2V0SW1wb3J0ZWRNYXBUZW1wbGF0ZUFyZ3VtZW50cyhnZW5DbGFzcyklPik8JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPigpKS5lTWFwKCkpLnNldChuZXdWYWx1ZSk7Ci0gICAgICAgIDwlfSBlbHNlIHslPgotCQkJCSgoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlIiklPi5TZXR0aW5nKTwlPWdlbkZlYXR1cmUuZ2V0R2V0QWNjZXNzb3IoKSU+KCkpLnNldChuZXdWYWx1ZSk7Ci0gICAgICAgIDwlfSU+Ci0gICAgICA8JX0gZWxzZSB7JT4KLQkJCQk8JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPigpLmNsZWFyKCk7Ci0JCQkJPCU9Z2VuRmVhdHVyZS5nZXRHZXRBY2Nlc3NvcigpJT4oKS5hZGRBbGwoKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgiamF2YS51dGlsLkNvbGxlY3Rpb24iKSU+PCVpZiAoZ2VuTW9kZWwuZ2V0Q29tcGxpYW5jZUxldmVsKCkuZ2V0VmFsdWUoKSA+PSBHZW5KREtMZXZlbC5KREs1MCkgeyU+PD8gZXh0ZW5kcyA8JT1nZW5GZWF0dXJlLmdldExpc3RJdGVtVHlwZShnZW5DbGFzcyklPj48JX0lPiluZXdWYWx1ZSk7Ci0gICAgICA8JX0lPgotICAgIDwlfSBlbHNlIGlmIChnZW5GZWF0dXJlLmlzUHJpbWl0aXZlVHlwZSgpKSB7JT4KLQkJCQlzZXQ8JT1nZW5GZWF0dXJlLmdldEFjY2Vzc29yTmFtZSgpJT4oKCg8JT1nZW5GZWF0dXJlLmdldE9iamVjdFR5cGUoZ2VuQ2xhc3MpJT4pbmV3VmFsdWUpLjwlPWdlbkZlYXR1cmUuZ2V0UHJpbWl0aXZlVmFsdWVGdW5jdGlvbigpJT4oKSk7Ci0gICAgPCV9IGVsc2UgeyU+Ci0JCQkJc2V0PCU9Z2VuRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+KDwlaWYgKGdlbkZlYXR1cmUuZ2V0VHlwZUdlbkRhdGFUeXBlKCkgPT0gbnVsbCB8fCAhZ2VuRmVhdHVyZS5nZXRUeXBlR2VuRGF0YVR5cGUoKS5pc09iamVjdFR5cGUoKSB8fCAhZ2VuRmVhdHVyZS5nZXRSYXdUeXBlKCkuZXF1YWxzKGdlbkZlYXR1cmUuZ2V0VHlwZShnZW5DbGFzcykpKSB7JT4oPCU9Z2VuRmVhdHVyZS5nZXRJbXBvcnRlZFR5cGUoZ2VuQ2xhc3MpJT4pPCV9JT5uZXdWYWx1ZSk7Ci0gICAgPCV9JT4KLQkJCQlyZXR1cm47Ci0gIDwlfSU+Ci0JCX0KLSAgPCVpZiAoZ2VuTW9kZWwuaXNNaW5pbWFsUmVmbGVjdGl2ZU1ldGhvZHMoKSkgeyU+Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0gIDwlfSBlbHNlIHslPgotCQllRHluYW1pY1NldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLSAgPCV9JT4KLQl9Ci0KLTwlfSU+Ci08JWlmIChpc0ltcGxlbWVudGF0aW9uICYmICFnZW5Nb2RlbC5pc1JlZmxlY3RpdmVEZWxlZ2F0aW9uKCkgJiYgZ2VuQ2xhc3MuaW1wbGVtZW50c0FueShnZW5DbGFzcy5nZXRFVW5zZXRHZW5GZWF0dXJlcygpKSkgeyU+Ci08JUAgaW5jbHVkZSBmaWxlPSJDbGFzcy9lVW5zZXQub3ZlcnJpZGUuamF2YWpldGluYyIgZmFpbD0iYWx0ZXJuYXRpdmUiICU+Ci08JUAgc3RhcnQgJT4KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgPCVpZiAoZ2VuTW9kZWwudXNlQ2xhc3NPdmVycmlkZUFubm90YXRpb24oKSkgeyU+Ci0JQE92ZXJyaWRlCi0gIDwlfSU+Ci0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRDwlPW5lZ2F0aXZlT2Zmc2V0Q29ycmVjdGlvbiU+KQotCQl7Ci0gIDwlZm9yIChHZW5GZWF0dXJlIGdlbkZlYXR1cmUgOiBnZW5DbGFzcy5nZXRFVW5zZXRHZW5GZWF0dXJlcygpKSB7JT4KLQkJCWNhc2UgPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT46Ci0gICAgPCVpZiAoZ2VuRmVhdHVyZS5pc0xpc3RUeXBlKCkgJiYgIWdlbkZlYXR1cmUuaXNVbnNldHRhYmxlKCkpIHslPgotICAgICAgPCVpZiAoZ2VuRmVhdHVyZS5pc1dyYXBwZWRGZWF0dXJlTWFwVHlwZSgpKSB7JT4KLQkJCQkoKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcCIpJT4uSW50ZXJuYWwuV3JhcHBlcik8JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPigpKS5mZWF0dXJlTWFwKCkuY2xlYXIoKTsKLSAgICAgIDwlfSBlbHNlIHslPgotCQkJCTwlPWdlbkZlYXR1cmUuZ2V0R2V0QWNjZXNzb3IoKSU+KCkuY2xlYXIoKTsKLSAgICAgIDwlfSU+Ci0gICAgPCV9IGVsc2UgaWYgKGdlbkZlYXR1cmUuaXNVbnNldHRhYmxlKCkpIHslPgotCQkJCXVuc2V0PCU9Z2VuRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+KCk7Ci0gICAgPCV9IGVsc2UgaWYgKCFnZW5GZWF0dXJlLmhhc0VEZWZhdWx0KCkpIHslPgotCQkJCXNldDwlPWdlbkZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPigoPCU9Z2VuRmVhdHVyZS5nZXRJbXBvcnRlZFR5cGUoZ2VuQ2xhc3MpJT4pbnVsbCk7Ci0gICAgPCV9IGVsc2UgeyU+Ci0JCQkJc2V0PCU9Z2VuRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+KDwlPWdlbkZlYXR1cmUuZ2V0RURlZmF1bHQoKSU+KTsKLSAgICA8JX0lPgotCQkJCXJldHVybjsKLSAgPCV9JT4KLQkJfQotICA8JWlmIChnZW5Nb2RlbC5pc01pbmltYWxSZWZsZWN0aXZlTWV0aG9kcygpKSB7JT4KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0gIDwlfSBlbHNlIHslPgotCQllRHluYW1pY1Vuc2V0KGZlYXR1cmVJRCk7Ci0gIDwlfSU+Ci0JfQotCi08JUAgZW5kICU+PCUvL0NsYXNzL2VVbnNldC5vdmVycmlkZS5qYXZhamV0aW5jJT4KLTwlfSU+Ci08JWlmIChpc0ltcGxlbWVudGF0aW9uICYmICFnZW5Nb2RlbC5pc1JlZmxlY3RpdmVEZWxlZ2F0aW9uKCkgJiYgZ2VuQ2xhc3MuaW1wbGVtZW50c0FueShnZW5DbGFzcy5nZXRFSXNTZXRHZW5GZWF0dXJlcygpKSkgeyU+Ci08JUAgaW5jbHVkZSBmaWxlPSJDbGFzcy9lSXNTZXQub3ZlcnJpZGUuamF2YWpldGluYyIgZmFpbD0iYWx0ZXJuYXRpdmUiICU+Ci08JUAgc3RhcnQgJT4KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgPCVpZiAoZ2VuTW9kZWwudXNlR2VuZXJpY3MoKSkgeyU+Ci0gICAgPCVmb3IgKEdlbkZlYXR1cmUgZ2VuRmVhdHVyZSA6IGdlbkNsYXNzLmdldEVJc1NldEdlbkZlYXR1cmVzKCkpIHslPgotICAgICAgPCVpZiAoZ2VuRmVhdHVyZS5pc0xpc3RUeXBlKCkgJiYgIWdlbkZlYXR1cmUuaXNVbnNldHRhYmxlKCkgJiYgIWdlbkZlYXR1cmUuaXNXcmFwcGVkRmVhdHVyZU1hcFR5cGUoKSAmJiAhZ2VuQ2xhc3MuaXNGaWVsZChnZW5GZWF0dXJlKSAmJiBnZW5GZWF0dXJlLmlzRmllbGQoKSAmJiBnZW5DbGFzcy5nZXRJbXBsZW1lbnRpbmdHZW5Nb2RlbChnZW5GZWF0dXJlKS5pc1ZpcnR1YWxEZWxlZ2F0aW9uKCkpIHslPgotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICAgICAgPCVicmVhazsgfSU+Ci0gICAgPCV9JT4KLSAgPCV9JT4KLSAgPCVpZiAoZ2VuTW9kZWwudXNlQ2xhc3NPdmVycmlkZUFubm90YXRpb24oKSkgeyU+Ci0JQE92ZXJyaWRlCi0gIDwlfSU+Ci0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpCi0JewotLy9VTUEtLT4KLQkJPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlIiklPiBmZWF0dXJlID0gZ2V0RmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWUoZmVhdHVyZUlEKTsKLQkJaWYoZmVhdHVyZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gaXNGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZVNldChmZWF0dXJlKTsKLQkJfQotLy9VTUE8LS0JCQotCQlzd2l0Y2ggKGZlYXR1cmVJRDwlPW5lZ2F0aXZlT2Zmc2V0Q29ycmVjdGlvbiU+KQotCQl7Ci08JWZvciAoR2VuRmVhdHVyZSBnZW5GZWF0dXJlIDogZ2VuQ2xhc3MuZ2V0RUlzU2V0R2VuRmVhdHVyZXMoKSkgeyU+Ci0JCQljYXNlIDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+OgotICA8JWlmIChnZW5GZWF0dXJlLmlzTGlzdFR5cGUoKSAmJiAhZ2VuRmVhdHVyZS5pc1Vuc2V0dGFibGUoKSkgeyU+Ci0gICAgPCVpZiAoZ2VuRmVhdHVyZS5pc1dyYXBwZWRGZWF0dXJlTWFwVHlwZSgpKSB7JT4KLSAgICAgIDwlaWYgKGdlbkZlYXR1cmUuaXNWb2xhdGlsZSgpKSB7JT4KLQkJCQlyZXR1cm4gISgoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwIiklPi5JbnRlcm5hbC5XcmFwcGVyKTwlPWdlbkZlYXR1cmUuZ2V0R2V0QWNjZXNzb3IoKSU+KCkpLmZlYXR1cmVNYXAoKS5pc0VtcHR5KCk7Ci0gICAgICA8JX0gZWxzZSB7JT4KLQkJCQlyZXR1cm4gPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4gIT0gbnVsbCAmJiAhPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4uZmVhdHVyZU1hcCgpLmlzRW1wdHkoKTsKLSAgICAgIDwlfSU+Ci0gICAgPCV9IGVsc2UgeyU+Ci0gICAgICA8JWlmIChnZW5DbGFzcy5pc0ZpZWxkKGdlbkZlYXR1cmUpKSB7JT4KLQkJCQlyZXR1cm4gPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4gIT0gbnVsbCAmJiAhPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4uaXNFbXB0eSgpOwotICAgICAgPCV9IGVsc2UgeyU+Ci0gICAgICAgIDwlaWYgKGdlbkZlYXR1cmUuaXNGaWVsZCgpICYmIGdlbkNsYXNzLmdldEltcGxlbWVudGluZ0dlbk1vZGVsKGdlbkZlYXR1cmUpLmlzVmlydHVhbERlbGVnYXRpb24oKSkgeyU+Ci0JCQkJPCU9Z2VuRmVhdHVyZS5nZXRJbXBvcnRlZFR5cGUoZ2VuQ2xhc3MpJT4gPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4gPSAoPCU9Z2VuRmVhdHVyZS5nZXRJbXBvcnRlZFR5cGUoZ2VuQ2xhc3MpJT4pZVZpcnR1YWxHZXQoPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT48JT1wb3NpdGl2ZU9mZnNldENvcnJlY3Rpb24lPik7Ci0JCQkJcmV0dXJuIDwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+ICE9IG51bGwgJiYgITwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+LmlzRW1wdHkoKTsKLSAgICAgICAgPCV9IGVsc2UgeyU+Ci0JCQkJcmV0dXJuICE8JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPigpLmlzRW1wdHkoKTsKLSAgICAgICAgPCV9JT4KLSAgICAgIDwlfSU+Ci0gICAgPCV9JT4KLSAgPCV9IGVsc2UgaWYgKGdlbkZlYXR1cmUuaXNVbnNldHRhYmxlKCkpIHslPgotCQkJCXJldHVybiBpc1NldDwlPWdlbkZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPigpOwotICA8JX0gZWxzZSBpZiAoZ2VuRmVhdHVyZS5pc1Jlc29sdmVQcm94aWVzKCkpIHslPgotICAgIDwlaWYgKGdlbkNsYXNzLmlzRmllbGQoZ2VuRmVhdHVyZSkpIHslPgotCQkJCXJldHVybiA8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPiAhPSBudWxsOwotICAgIDwlfSBlbHNlIHslPgotICAgICAgPCVpZiAoZ2VuRmVhdHVyZS5pc0ZpZWxkKCkgJiYgZ2VuQ2xhc3MuZ2V0SW1wbGVtZW50aW5nR2VuTW9kZWwoZ2VuRmVhdHVyZSkuaXNWaXJ0dWFsRGVsZWdhdGlvbigpKSB7JT4KLQkJCQlyZXR1cm4gZVZpcnR1YWxHZXQoPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT48JT1wb3NpdGl2ZU9mZnNldENvcnJlY3Rpb24lPikgIT0gbnVsbDsKLSAgICAgIDwlfSBlbHNlIHslPgotCQkJCXJldHVybiBiYXNpY0dldDwlPWdlbkZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPigpICE9IG51bGw7Ci0gICAgICA8JX0lPgotICAgIDwlfSU+Ci0gIDwlfSBlbHNlIGlmICghZ2VuRmVhdHVyZS5oYXNFRGVmYXVsdCgpKSB7JT4KLSAgICA8JWlmIChnZW5DbGFzcy5pc0ZpZWxkKGdlbkZlYXR1cmUpKSB7JT4KLQkJCQlyZXR1cm4gPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4gIT0gbnVsbDsKLSAgICA8JX0gZWxzZSB7JT4KLSAgICAgIDwlaWYgKGdlbkZlYXR1cmUuaXNGaWVsZCgpICYmIGdlbkNsYXNzLmdldEltcGxlbWVudGluZ0dlbk1vZGVsKGdlbkZlYXR1cmUpLmlzVmlydHVhbERlbGVnYXRpb24oKSkgeyU+Ci0JCQkJcmV0dXJuIGVWaXJ0dWFsR2V0KDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+PCU9cG9zaXRpdmVPZmZzZXRDb3JyZWN0aW9uJT4pICE9IG51bGw7Ci0gICAgICA8JX0gZWxzZSB7JT4KLQkJCQlyZXR1cm4gPCU9Z2VuRmVhdHVyZS5nZXRHZXRBY2Nlc3NvcigpJT4oKSAhPSBudWxsOwotICAgICAgPCV9JT4KLSAgICA8JX0lPgotICA8JX0gZWxzZSBpZiAoZ2VuRmVhdHVyZS5pc1ByaW1pdGl2ZVR5cGUoKSB8fCBnZW5GZWF0dXJlLmlzRW51bVR5cGUoKSkgeyU+Ci0gICAgPCVpZiAoZ2VuQ2xhc3MuaXNGaWVsZChnZW5GZWF0dXJlKSkgeyU+Ci0gICAgICA8JWlmIChnZW5DbGFzcy5pc0ZsYWcoZ2VuRmVhdHVyZSkpIHslPgotCQkJCXJldHVybiAoKDwlPWdlbkNsYXNzLmdldEZsYWdzRmllbGQoZ2VuRmVhdHVyZSklPiAmIDwlPWdlbkZlYXR1cmUuZ2V0VXBwZXJOYW1lKCklPl9FRkxBRykgIT0gMCkgIT0gPCU9Z2VuRmVhdHVyZS5nZXRFRGVmYXVsdCgpJT47Ci0gICAgICA8JX0gZWxzZSB7JT4KLQkJCQlyZXR1cm4gPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4gIT0gPCU9Z2VuRmVhdHVyZS5nZXRFRGVmYXVsdCgpJT47Ci0gICAgICA8JX0lPgotICAgIDwlfSBlbHNlIHslPgotICAgICAgPCVpZiAoZ2VuRmVhdHVyZS5pc0VudW1UeXBlKCkgJiYgZ2VuRmVhdHVyZS5pc0ZpZWxkKCkgJiYgZ2VuQ2xhc3MuZ2V0SW1wbGVtZW50aW5nR2VuTW9kZWwoZ2VuRmVhdHVyZSkuaXNWaXJ0dWFsRGVsZWdhdGlvbigpKSB7JT4KLQkJCQlyZXR1cm4gZVZpcnR1YWxHZXQoPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT48JT1wb3NpdGl2ZU9mZnNldENvcnJlY3Rpb24lPiwgPCU9Z2VuRmVhdHVyZS5nZXRFRGVmYXVsdCgpJT4pICE9IDwlPWdlbkZlYXR1cmUuZ2V0RURlZmF1bHQoKSU+OwotICAgICAgPCV9IGVsc2UgeyU+Ci0JCQkJcmV0dXJuIDwlPWdlbkZlYXR1cmUuZ2V0R2V0QWNjZXNzb3IoKSU+KCkgIT0gPCU9Z2VuRmVhdHVyZS5nZXRFRGVmYXVsdCgpJT47Ci0gICAgICA8JX0lPgotICAgIDwlfSU+Ci0gIDwlfSBlbHNlIHsvL2RhdGF0eXBlJT4KLSAgICA8JWlmIChnZW5DbGFzcy5pc0ZpZWxkKGdlbkZlYXR1cmUpKSB7JT4KLQkJCQlyZXR1cm4gPCU9Z2VuRmVhdHVyZS5nZXRFRGVmYXVsdCgpJT4gPT0gbnVsbCA/IDwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+ICE9IG51bGwgOiAhPCU9Z2VuRmVhdHVyZS5nZXRFRGVmYXVsdCgpJT4uZXF1YWxzKDwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+KTsKLSAgICA8JX0gZWxzZSB7JT4KLSAgICAgIDwlaWYgKGdlbkZlYXR1cmUuaXNGaWVsZCgpICYmIGdlbkNsYXNzLmdldEltcGxlbWVudGluZ0dlbk1vZGVsKGdlbkZlYXR1cmUpLmlzVmlydHVhbERlbGVnYXRpb24oKSkgeyU+Ci0JCQkJPCU9Z2VuRmVhdHVyZS5nZXRJbXBvcnRlZFR5cGUoZ2VuQ2xhc3MpJT4gPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4gPSAoPCU9Z2VuRmVhdHVyZS5nZXRJbXBvcnRlZFR5cGUoZ2VuQ2xhc3MpJT4pZVZpcnR1YWxHZXQoPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT48JT1wb3NpdGl2ZU9mZnNldENvcnJlY3Rpb24lPiwgPCU9Z2VuRmVhdHVyZS5nZXRFRGVmYXVsdCgpJT4pOwotCQkJCXJldHVybiA8JT1nZW5GZWF0dXJlLmdldEVEZWZhdWx0KCklPiA9PSBudWxsID8gPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4gIT0gbnVsbCA6ICE8JT1nZW5GZWF0dXJlLmdldEVEZWZhdWx0KCklPi5lcXVhbHMoPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4pOwotICAgICAgPCV9IGVsc2UgeyU+Ci0JCQkJcmV0dXJuIDwlPWdlbkZlYXR1cmUuZ2V0RURlZmF1bHQoKSU+ID09IG51bGwgPyA8JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPigpICE9IG51bGwgOiAhPCU9Z2VuRmVhdHVyZS5nZXRFRGVmYXVsdCgpJT4uZXF1YWxzKDwlPWdlbkZlYXR1cmUuZ2V0R2V0QWNjZXNzb3IoKSU+KCkpOwotICAgICAgPCV9JT4KLSAgICA8JX0lPgotICA8JX0lPgotPCV9JT4KLQkJfQotPCVpZiAoZ2VuTW9kZWwuaXNNaW5pbWFsUmVmbGVjdGl2ZU1ldGhvZHMoKSkgeyU+Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLTwlfSBlbHNlIHslPgotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChmZWF0dXJlSUQpOwotPCV9JT4KLQl9Ci0KLTwlQCBlbmQgJT48JS8vQ2xhc3MvZUlzU2V0Lm92ZXJyaWRlLmphdmFqZXRpbmMlPgotPCV9JT4KLTwlaWYgKGlzSW1wbGVtZW50YXRpb24gJiYgKCFnZW5DbGFzcy5nZXRNaXhpbkdlbkZlYXR1cmVzKCkuaXNFbXB0eSgpIHx8IGdlbkNsYXNzLmhhc09mZnNldENvcnJlY3Rpb24oKSAmJiAhZ2VuQ2xhc3MuZ2V0R2VuRmVhdHVyZXMoKS5pc0VtcHR5KCkpKSB7JT4KLSAgPCVpZiAoIWdlbkNsYXNzLmdldE1peGluR2VuRmVhdHVyZXMoKS5pc0VtcHR5KCkpIHslPgotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIDwlaWYgKGdlbk1vZGVsLnVzZUNsYXNzT3ZlcnJpZGVBbm5vdGF0aW9uKCkpIHslPgotCUBPdmVycmlkZQotICAgIDwlfSU+Ci0JcHVibGljIGludCBlQmFzZVN0cnVjdHVyYWxGZWF0dXJlSUQoaW50IGRlcml2ZWRGZWF0dXJlSUQsIENsYXNzPCU9c2luZ2xlV2lsZGNhcmQlPiBiYXNlQ2xhc3MpCi0JewotICAgIDwlZm9yIChHZW5DbGFzcyBtaXhpbkdlbkNsYXNzIDogZ2VuQ2xhc3MuZ2V0TWl4aW5HZW5DbGFzc2VzKCkpIHslPgotCQlpZiAoYmFzZUNsYXNzID09IDwlPW1peGluR2VuQ2xhc3MuZ2V0SW1wb3J0ZWRJbnRlcmZhY2VOYW1lKCklPi5jbGFzcykKLQkJewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEPCU9bmVnYXRpdmVPZmZzZXRDb3JyZWN0aW9uJT4pCi0JCQl7Ci0gICAgICA8JWZvciAoR2VuRmVhdHVyZSBnZW5GZWF0dXJlIDogbWl4aW5HZW5DbGFzcy5nZXRHZW5GZWF0dXJlcygpKSB7JT4KLQkJCQljYXNlIDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+OiByZXR1cm4gPCU9bWl4aW5HZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPjsKLSAgICAgIDwlfSU+Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0gICAgPCV9JT4KLQkJcmV0dXJuIHN1cGVyLmVCYXNlU3RydWN0dXJhbEZlYXR1cmVJRChkZXJpdmVkRmVhdHVyZUlELCBiYXNlQ2xhc3MpOwotCX0KLSAgPCV9JT4KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICA8JWlmIChnZW5Nb2RlbC51c2VDbGFzc092ZXJyaWRlQW5ub3RhdGlvbigpKSB7JT4KLQlAT3ZlcnJpZGUKLSAgPCV9JT4KLQlwdWJsaWMgaW50IGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChpbnQgYmFzZUZlYXR1cmVJRCwgQ2xhc3M8JT1zaW5nbGVXaWxkY2FyZCU+IGJhc2VDbGFzcykKLQl7Ci0gIDwlZm9yIChHZW5DbGFzcyBtaXhpbkdlbkNsYXNzIDogZ2VuQ2xhc3MuZ2V0TWl4aW5HZW5DbGFzc2VzKCkpIHslPgotCQlpZiAoYmFzZUNsYXNzID09IDwlPW1peGluR2VuQ2xhc3MuZ2V0SW1wb3J0ZWRJbnRlcmZhY2VOYW1lKCklPi5jbGFzcykKLQkJewotCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQotCQkJewotICAgIDwlZm9yIChHZW5GZWF0dXJlIGdlbkZlYXR1cmUgOiBtaXhpbkdlbkNsYXNzLmdldEdlbkZlYXR1cmVzKCkpIHslPgotCQkJCWNhc2UgPCU9bWl4aW5HZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPjogcmV0dXJuIDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+PCU9cG9zaXRpdmVPZmZzZXRDb3JyZWN0aW9uJT47Ci0gICAgPCV9JT4KLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLSAgPCV9JT4KLSAgPCVpZiAoZ2VuQ2xhc3MuaGFzT2Zmc2V0Q29ycmVjdGlvbigpICYmICFnZW5DbGFzcy5nZXRHZW5GZWF0dXJlcygpLmlzRW1wdHkoKSkgeyU+Ci0JCWlmIChiYXNlQ2xhc3MgPT0gPCU9Z2VuQ2xhc3MuZ2V0SW1wb3J0ZWRJbnRlcmZhY2VOYW1lKCklPi5jbGFzcykKLQkJewotCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEPCU9bmVnYXRpdmVPZmZzZXRDb3JyZWN0aW9uJT4pCi0JCQl7Ci0gICAgPCVmb3IgKEdlbkZlYXR1cmUgZ2VuRmVhdHVyZSA6IGdlbkNsYXNzLmdldEdlbkZlYXR1cmVzKCkpIHslPgotCQkJCWNhc2UgPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT46IHJldHVybiA8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPjwlPXBvc2l0aXZlT2Zmc2V0Q29ycmVjdGlvbiU+OwotICAgIDwlfSU+Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0gIDwlfSU+Ci0JCXJldHVybiBzdXBlci5lRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoYmFzZUZlYXR1cmVJRCwgYmFzZUNsYXNzKTsKLQl9Ci0KLTwlfSU+Ci08JWlmIChpc0ltcGxlbWVudGF0aW9uICYmIGdlbk1vZGVsLmlzVmlydHVhbERlbGVnYXRpb24oKSkgeyBTdHJpbmcgZVZpcnR1YWxWYWx1ZXNGaWVsZCA9IGdlbkNsYXNzLmdldEVWaXJ0dWFsVmFsdWVzRmllbGQoKTslPgotICA8JWlmIChlVmlydHVhbFZhbHVlc0ZpZWxkICE9IG51bGwpIHslPgotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICA8JWlmIChnZW5Nb2RlbC51c2VDbGFzc092ZXJyaWRlQW5ub3RhdGlvbigpKSB7JT4KLQlAT3ZlcnJpZGUKLSAgPCV9JT4KLQlwcm90ZWN0ZWQgT2JqZWN0W10gZVZpcnR1YWxWYWx1ZXMoKQotCXsKLQkJcmV0dXJuIDwlPWVWaXJ0dWFsVmFsdWVzRmllbGQlPjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgPCVpZiAoZ2VuTW9kZWwudXNlQ2xhc3NPdmVycmlkZUFubm90YXRpb24oKSkgeyU+Ci0JQE92ZXJyaWRlCi0gIDwlfSU+Ci0JcHJvdGVjdGVkIHZvaWQgZVNldFZpcnR1YWxWYWx1ZXMoT2JqZWN0W10gbmV3VmFsdWVzKQotCXsKLQkJPCU9ZVZpcnR1YWxWYWx1ZXNGaWVsZCU+ID0gbmV3VmFsdWVzOwotCX0KLQotICA8JX0lPgotICA8JXsgTGlzdDxTdHJpbmc+IGVWaXJ0dWFsSW5kZXhCaXRGaWVsZHMgPSBnZW5DbGFzcy5nZXRFVmlydHVhbEluZGV4Qml0RmllbGRzKG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpKTslPgotICAgIDwlaWYgKCFlVmlydHVhbEluZGV4Qml0RmllbGRzLmlzRW1wdHkoKSkgeyBMaXN0PFN0cmluZz4gYWxsRVZpcnR1YWxJbmRleEJpdEZpZWxkcyA9IGdlbkNsYXNzLmdldEFsbEVWaXJ0dWFsSW5kZXhCaXRGaWVsZHMobmV3IEFycmF5TGlzdDxTdHJpbmc+KCkpOyU+Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIDwlaWYgKGdlbk1vZGVsLnVzZUNsYXNzT3ZlcnJpZGVBbm5vdGF0aW9uKCkpIHslPgotCUBPdmVycmlkZQotICA8JX0lPgotCXByb3RlY3RlZCBpbnQgZVZpcnR1YWxJbmRleEJpdHMoaW50IG9mZnNldCkKLQl7Ci0JCXN3aXRjaCAob2Zmc2V0KQotCQl7Ci0gICAgICA8JWZvciAoaW50IGkgPSAwOyBpIDwgYWxsRVZpcnR1YWxJbmRleEJpdEZpZWxkcy5zaXplKCk7IGkrKykgeyU+Ci0JCQljYXNlIDwlPWklPiA6Ci0JCQkJcmV0dXJuIDwlPWFsbEVWaXJ0dWFsSW5kZXhCaXRGaWVsZHMuZ2V0KGkpJT47Ci0gICAgICA8JX0lPgotCQkJZGVmYXVsdCA6Ci0JCQkJdGhyb3cgbmV3IEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICA8JWlmIChnZW5Nb2RlbC51c2VDbGFzc092ZXJyaWRlQW5ub3RhdGlvbigpKSB7JT4KLQlAT3ZlcnJpZGUKLSAgPCV9JT4KLQlwcm90ZWN0ZWQgdm9pZCBlU2V0VmlydHVhbEluZGV4Qml0cyhpbnQgb2Zmc2V0LCBpbnQgbmV3SW5kZXhCaXRzKQotCXsKLQkJc3dpdGNoIChvZmZzZXQpCi0JCXsKLSAgICAgIDwlZm9yIChpbnQgaSA9IDA7IGkgPCBhbGxFVmlydHVhbEluZGV4Qml0RmllbGRzLnNpemUoKTsgaSsrKSB7JT4KLQkJCWNhc2UgPCU9aSU+IDoKLQkJCQk8JT1hbGxFVmlydHVhbEluZGV4Qml0RmllbGRzLmdldChpKSU+ID0gbmV3SW5kZXhCaXRzOwotCQkJCWJyZWFrOwotICAgICAgPCV9JT4KLQkJCWRlZmF1bHQgOgotCQkJCXRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCk7Ci0JCX0KLQl9Ci0KLSAgICA8JX0lPgotICA8JX0lPgotPCV9JT4KLTwlaWYgKGlzSW1wbGVtZW50YXRpb24gJiYgIWdlbk1vZGVsLmlzUmVmbGVjdGl2ZURlbGVnYXRpb24oKSAmJiAhZ2VuQ2xhc3MuZ2V0VG9TdHJpbmdHZW5GZWF0dXJlcygpLmlzRW1wdHkoKSkgeyU+Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIDwlaWYgKGdlbk1vZGVsLnVzZUNsYXNzT3ZlcnJpZGVBbm5vdGF0aW9uKCkpIHslPgotCUBPdmVycmlkZQotICA8JX0lPgotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotCXsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotICA8JXsgYm9vbGVhbiBmaXJzdCA9IHRydWU7JT4KLSAgICA8JWZvciAoR2VuRmVhdHVyZSBnZW5GZWF0dXJlIDogZ2VuQ2xhc3MuZ2V0VG9TdHJpbmdHZW5GZWF0dXJlcygpKSB7JT4KLSAgICAgIDwlaWYgKGZpcnN0KSB7IGZpcnN0ID0gZmFsc2U7JT4KLQkJcmVzdWx0LmFwcGVuZCgiICg8JT1nZW5GZWF0dXJlLmdldE5hbWUoKSU+OiAiKTs8JT1nZW5Nb2RlbC5nZXROb25OTFMoKSU+Ci0gICAgICA8JX0gZWxzZSB7JT4KLQkJcmVzdWx0LmFwcGVuZCgiLCA8JT1nZW5GZWF0dXJlLmdldE5hbWUoKSU+OiAiKTs8JT1nZW5Nb2RlbC5nZXROb25OTFMoKSU+Ci0gICAgICA8JX0lPgotICAgICAgPCVpZiAoZ2VuRmVhdHVyZS5pc1Vuc2V0dGFibGUoKSAmJiAhZ2VuRmVhdHVyZS5pc0xpc3RUeXBlKCkpIHslPgotICAgICAgICA8JWlmIChnZW5Nb2RlbC5pc1ZpcnR1YWxEZWxlZ2F0aW9uKCkgJiYgIWdlbkZlYXR1cmUuaXNQcmltaXRpdmVUeXBlKCkpIHslPgotCQlpZiAoZVZpcnR1YWxJc1NldCg8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPjwlPXBvc2l0aXZlT2Zmc2V0Q29ycmVjdGlvbiU+KSkgcmVzdWx0LmFwcGVuZChlVmlydHVhbEdldCg8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPjwlPXBvc2l0aXZlT2Zmc2V0Q29ycmVjdGlvbiU+KSk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOzwlPWdlbk1vZGVsLmdldE5vbk5MUygpJT4KLSAgICAgICAgPCV9IGVsc2UgeyU+Ci0gICAgICAgICAgPCVpZiAoZ2VuQ2xhc3MuaXNGbGFnKGdlbkZlYXR1cmUpKSB7JT4KLQkJaWYgKDwlaWYgKGdlbkNsYXNzLmlzRVNldEZsYWcoZ2VuRmVhdHVyZSkpIHslPig8JT1nZW5DbGFzcy5nZXRFU2V0RmxhZ3NGaWVsZChnZW5GZWF0dXJlKSU+ICYgPCU9Z2VuRmVhdHVyZS5nZXRVcHBlck5hbWUoKSU+X0VTRVRGTEFHKSAhPSAwPCV9IGVsc2UgeyU+PCU9Z2VuRmVhdHVyZS5nZXRVbmNhcE5hbWUoKSU+RVNldDwlfSU+KSByZXN1bHQuYXBwZW5kKCg8JT1nZW5DbGFzcy5nZXRGbGFnc0ZpZWxkKGdlbkZlYXR1cmUpJT4gJiA8JT1nZW5GZWF0dXJlLmdldFVwcGVyTmFtZSgpJT5fRUZMQUcpICE9IDApOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTs8JT1nZW5Nb2RlbC5nZXROb25OTFMoKSU+Ci0gICAgICAgICAgPCV9IGVsc2UgeyU+Ci0JCWlmICg8JWlmIChnZW5DbGFzcy5pc0VTZXRGbGFnKGdlbkZlYXR1cmUpKSB7JT4oPCU9Z2VuQ2xhc3MuZ2V0RVNldEZsYWdzRmllbGQoZ2VuRmVhdHVyZSklPiAmIDwlPWdlbkZlYXR1cmUuZ2V0VXBwZXJOYW1lKCklPl9FU0VURkxBRykgIT0gMDwlfSBlbHNlIHslPjwlPWdlbkZlYXR1cmUuZ2V0VW5jYXBOYW1lKCklPkVTZXQ8JX0lPikgcmVzdWx0LmFwcGVuZCg8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPik7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOzwlPWdlbk1vZGVsLmdldE5vbk5MUygpJT4KLSAgICAgICAgICA8JX0lPgotICAgICAgICA8JX0lPgotICAgICAgPCV9IGVsc2UgeyU+Ci0gICAgICAgIDwlaWYgKGdlbk1vZGVsLmlzVmlydHVhbERlbGVnYXRpb24oKSAmJiAhZ2VuRmVhdHVyZS5pc1ByaW1pdGl2ZVR5cGUoKSkgeyU+Ci0JCXJlc3VsdC5hcHBlbmQoZVZpcnR1YWxHZXQoPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT48JT1wb3NpdGl2ZU9mZnNldENvcnJlY3Rpb24lPjwlaWYgKCFnZW5GZWF0dXJlLmlzTGlzdFR5cGUoKSAmJiAhZ2VuRmVhdHVyZS5pc1JlZmVyZW5jZVR5cGUoKSl7JT4sIDwlPWdlbkZlYXR1cmUuZ2V0RURlZmF1bHQoKSU+PCV9JT4pKTsKLSAgICAgICAgPCV9IGVsc2UgeyU+Ci0gICAgICAgICAgPCVpZiAoZ2VuQ2xhc3MuaXNGbGFnKGdlbkZlYXR1cmUpKSB7JT4KLQkJcmVzdWx0LmFwcGVuZCgoPCU9Z2VuQ2xhc3MuZ2V0RmxhZ3NGaWVsZChnZW5GZWF0dXJlKSU+ICYgPCU9Z2VuRmVhdHVyZS5nZXRVcHBlck5hbWUoKSU+X0VGTEFHKSAhPSAwKTsKLSAgICAgICAgICA8JX0gZWxzZSB7JT4KLQkJcmVzdWx0LmFwcGVuZCg8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPik7Ci0gICAgICAgICAgPCV9JT4KLSAgICAgICAgPCV9JT4KLSAgICAgIDwlfSU+Ci0gICAgPCV9JT4KLSAgPCV9JT4KLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi08JX0lPgotPCVpZiAoaXNJbXBsZW1lbnRhdGlvbiAmJiBnZW5DbGFzcy5pc01hcEVudHJ5KCkpIHsgR2VuRmVhdHVyZSBrZXlGZWF0dXJlID0gZ2VuQ2xhc3MuZ2V0TWFwRW50cnlLZXlGZWF0dXJlKCk7IEdlbkZlYXR1cmUgdmFsdWVGZWF0dXJlID0gZ2VuQ2xhc3MuZ2V0TWFwRW50cnlWYWx1ZUZlYXR1cmUoKTslPgotPCVTdHJpbmcgb2JqZWN0VHlwZSA9IGdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgiamF2YS5sYW5nLk9iamVjdCIpOyU+Ci08JVN0cmluZyBrZXlUeXBlID0gZ2VuTW9kZWwuZ2V0Q29tcGxpYW5jZUxldmVsKCkuZ2V0VmFsdWUoKSA+PSBHZW5KREtMZXZlbC5KREs1MCA/IGtleUZlYXR1cmUuZ2V0T2JqZWN0VHlwZShnZW5DbGFzcykgOiBvYmplY3RUeXBlOyU+Ci08JVN0cmluZyB2YWx1ZVR5cGUgPSBnZW5Nb2RlbC5nZXRDb21wbGlhbmNlTGV2ZWwoKS5nZXRWYWx1ZSgpID49IEdlbkpES0xldmVsLkpESzUwID8gdmFsdWVGZWF0dXJlLmdldE9iamVjdFR5cGUoZ2VuQ2xhc3MpIDogb2JqZWN0VHlwZTslPgotPCVTdHJpbmcgZU1hcFR5cGUgPSBnZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTWFwIikgKyAoZ2VuTW9kZWwuZ2V0Q29tcGxpYW5jZUxldmVsKCkuZ2V0VmFsdWUoKSA+PSBHZW5KREtMZXZlbC5KREs1MCA/ICI8IiArIGtleVR5cGUgKyAiLCAiICsgdmFsdWVUeXBlICsgIj4iIDogIiIpOyU+Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIGludCBoYXNoID0gLTE7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgaW50IGdldEhhc2goKQotCXsKLQkJaWYgKGhhc2ggPT0gLTEpCi0JCXsKLQkJCTwlPW9iamVjdFR5cGUlPiB0aGVLZXkgPSBnZXRLZXkoKTsKLQkJCWhhc2ggPSAodGhlS2V5ID09IG51bGwgPyAwIDogdGhlS2V5Lmhhc2hDb2RlKCkpOwotCQl9Ci0JCXJldHVybiBoYXNoOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEhhc2goaW50IGhhc2gpCi0JewotCQl0aGlzLmhhc2ggPSBoYXNoOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyA8JT1rZXlUeXBlJT4gZ2V0S2V5KCkKLQl7Ci0gIDwlaWYgKGtleUZlYXR1cmUuaXNQcmltaXRpdmVUeXBlKCkpIHslPgotCQlyZXR1cm4gbmV3IDwlPWtleUZlYXR1cmUuZ2V0T2JqZWN0VHlwZShnZW5DbGFzcyklPihnZXRUeXBlZEtleSgpKTsKLSAgPCV9IGVsc2UgeyU+Ci0JCXJldHVybiBnZXRUeXBlZEtleSgpOwotICA8JX0lPgotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEtleSg8JT1rZXlUeXBlJT4ga2V5KQotCXsKLSAgPCVpZiAoa2V5RmVhdHVyZS5pc0xpc3RUeXBlKCkpIHslPgotCQlnZXRUeXBlZEtleSgpLmFkZEFsbCg8JWlmICghZ2VuTW9kZWwudXNlR2VuZXJpY3MoKSkgeyU+KDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgiamF2YS51dGlsLkNvbGxlY3Rpb24iKSU+KTwlfSU+a2V5KTsKLSAgPCV9IGVsc2UgaWYgKGdlbk1vZGVsLmdldENvbXBsaWFuY2VMZXZlbCgpLmdldFZhbHVlKCkgPj0gR2VuSkRLTGV2ZWwuSkRLNTApIHslPgotCQlzZXRUeXBlZEtleShrZXkpOwotICA8JX0gZWxzZSBpZiAoa2V5RmVhdHVyZS5pc1ByaW1pdGl2ZVR5cGUoKSkgeyU+Ci0JCXNldFR5cGVkS2V5KCgoPCU9a2V5RmVhdHVyZS5nZXRPYmplY3RUeXBlKGdlbkNsYXNzKSU+KWtleSkuPCU9a2V5RmVhdHVyZS5nZXRQcmltaXRpdmVWYWx1ZUZ1bmN0aW9uKCklPigpKTsKLSAgPCV9IGVsc2UgeyU+Ci0JCXNldFR5cGVkS2V5KCg8JT1rZXlGZWF0dXJlLmdldEltcG9ydGVkVHlwZShnZW5DbGFzcyklPilrZXkpOwotICA8JX0lPgotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyA8JT12YWx1ZVR5cGUlPiBnZXRWYWx1ZSgpCi0JewotICA8JWlmICh2YWx1ZUZlYXR1cmUuaXNQcmltaXRpdmVUeXBlKCkpIHslPgotCQlyZXR1cm4gbmV3IDwlPXZhbHVlRmVhdHVyZS5nZXRPYmplY3RUeXBlKGdlbkNsYXNzKSU+KGdldFR5cGVkVmFsdWUoKSk7Ci0gIDwlfSBlbHNlIHslPgotCQlyZXR1cm4gZ2V0VHlwZWRWYWx1ZSgpOwotICA8JX0lPgotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyA8JT12YWx1ZVR5cGUlPiBzZXRWYWx1ZSg8JT12YWx1ZVR5cGUlPiB2YWx1ZSkKLQl7Ci0JCTwlPXZhbHVlVHlwZSU+IG9sZFZhbHVlID0gZ2V0VmFsdWUoKTsKLSAgPCVpZiAodmFsdWVGZWF0dXJlLmlzTGlzdFR5cGUoKSkgeyU+Ci0JCWdldFR5cGVkVmFsdWUoKS5jbGVhcigpOwotCQlnZXRUeXBlZFZhbHVlKCkuYWRkQWxsKDwlaWYgKCFnZW5Nb2RlbC51c2VHZW5lcmljcygpKSB7JT4oPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJqYXZhLnV0aWwuQ29sbGVjdGlvbiIpJT4pPCV9JT52YWx1ZSk7Ci0gIDwlfSBlbHNlIGlmIChnZW5Nb2RlbC5nZXRDb21wbGlhbmNlTGV2ZWwoKS5nZXRWYWx1ZSgpID49IEdlbkpES0xldmVsLkpESzUwKSB7JT4KLQkJc2V0VHlwZWRWYWx1ZSh2YWx1ZSk7Ci0gIDwlfSBlbHNlIGlmICh2YWx1ZUZlYXR1cmUuaXNQcmltaXRpdmVUeXBlKCkpIHslPgotCQlzZXRUeXBlZFZhbHVlKCgoPCU9dmFsdWVGZWF0dXJlLmdldE9iamVjdFR5cGUoZ2VuQ2xhc3MpJT4pdmFsdWUpLjwlPXZhbHVlRmVhdHVyZS5nZXRQcmltaXRpdmVWYWx1ZUZ1bmN0aW9uKCklPigpKTsKLSAgPCV9IGVsc2UgeyU+Ci0JCXNldFR5cGVkVmFsdWUoKDwlPXZhbHVlRmVhdHVyZS5nZXRJbXBvcnRlZFR5cGUoZ2VuQ2xhc3MpJT4pdmFsdWUpOwotICA8JX0lPgotCQlyZXR1cm4gb2xkVmFsdWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIDwlaWYgKGdlbk1vZGVsLnVzZUdlbmVyaWNzKCkpIHslPgotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICA8JX0lPgotCXB1YmxpYyA8JT1lTWFwVHlwZSU+IGdldEVNYXAoKQotCXsKLQkJPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCIpJT4gY29udGFpbmVyID0gZUNvbnRhaW5lcigpOwotCQlyZXR1cm4gY29udGFpbmVyID09IG51bGwgPyBudWxsIDogKDwlPWVNYXBUeXBlJT4pY29udGFpbmVyLmVHZXQoZUNvbnRhaW5tZW50RmVhdHVyZSgpKTsKLQl9Ci0KLTwlfSU+Ci08JUAgaW5jbHVkZSBmaWxlPSJDbGFzcy9pbnNlcnQuamF2YWpldGluYyIgZmFpbD0ic2lsZW50IiAlPgotfSAvLzwlPWlzSW50ZXJmYWNlID8gIiAiICsgZ2VuQ2xhc3MuZ2V0SW50ZXJmYWNlTmFtZSgpIDogZ2VuQ2xhc3MuZ2V0Q2xhc3NOYW1lKCklPgotPCUvLyBUT0RPIGZpeCB0aGUgc3BhY2UgYWJvdmUlPgotPCVnZW5Nb2RlbC5lbWl0U29ydGVkSW1wb3J0cygpOyU+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlL3RlbXBsYXRlcy9tb2RlbC9DbGFzcy5qYXZhamV0Lm9yZyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUvdGVtcGxhdGVzL21vZGVsL0NsYXNzLmphdmFqZXQub3JnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNDI2YTI4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUvdGVtcGxhdGVzL21vZGVsL0NsYXNzLmphdmFqZXQub3JnCisrKyAvZGV2L251bGwKQEAgLTEsMjAyMCArMCwwIEBACi08JUAgamV0IHBhY2thZ2U9Im9yZy5lY2xpcHNlLmVtZi5jb2RlZ2VuLmVjb3JlLnRlbXBsYXRlcy5tb2RlbCIgaW1wb3J0cz0iamF2YS51dGlsLiogb3JnLmVjbGlwc2UuZW1mLmNvZGVnZW4uZWNvcmUuZ2VubW9kZWwuKiIgY2xhc3M9IkNsYXNzIiB2ZXJzaW9uPSIkSWQ6IENsYXNzLmphdmFqZXQsdiAxLjcwIDIwMDcvMDYvMTggMTk6MzU6MjEgZW1lcmtzIEV4cCAkIiAlPgotPCUKLS8qKgotICogPGNvcHlyaWdodD4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoKLSAqIDwvY29weXJpZ2h0PgotICovCi0lPgotPCVmaW5hbCBHZW5DbGFzcyBnZW5DbGFzcyA9IChHZW5DbGFzcykoKE9iamVjdFtdKWFyZ3VtZW50KVswXTsgZmluYWwgR2VuUGFja2FnZSBnZW5QYWNrYWdlID0gZ2VuQ2xhc3MuZ2V0R2VuUGFja2FnZSgpOyBmaW5hbCBHZW5Nb2RlbCBnZW5Nb2RlbD1nZW5QYWNrYWdlLmdldEdlbk1vZGVsKCk7JT4KLTwlZmluYWwgYm9vbGVhbiBpc0ludGVyZmFjZSA9IEJvb2xlYW4uVFJVRS5lcXVhbHMoKChPYmplY3RbXSlhcmd1bWVudClbMV0pOyBmaW5hbCBib29sZWFuIGlzSW1wbGVtZW50YXRpb24gPSBCb29sZWFuLlRSVUUuZXF1YWxzKCgoT2JqZWN0W10pYXJndW1lbnQpWzJdKTslPgotPCVmaW5hbCBTdHJpbmcgcHVibGljU3RhdGljRmluYWxGbGFnID0gaXNJbXBsZW1lbnRhdGlvbiA/ICJwdWJsaWMgc3RhdGljIGZpbmFsICIgOiAiIjslPgotPCVmaW5hbCBTdHJpbmcgc2luZ2xlV2lsZGNhcmQgPSBnZW5Nb2RlbC5nZXRDb21wbGlhbmNlTGV2ZWwoKS5nZXRWYWx1ZSgpID49IEdlbkpES0xldmVsLkpESzUwID8gIjw/PiIgOiAiIjslPgotPCVmaW5hbCBTdHJpbmcgbmVnYXRpdmVPZmZzZXRDb3JyZWN0aW9uID0gZ2VuQ2xhc3MuaGFzT2Zmc2V0Q29ycmVjdGlvbigpID8gIiAtICIgKyBnZW5DbGFzcy5nZXRPZmZzZXRDb3JyZWN0aW9uRmllbGQobnVsbCkgOiAiIjslPgotPCVmaW5hbCBTdHJpbmcgcG9zaXRpdmVPZmZzZXRDb3JyZWN0aW9uID0gZ2VuQ2xhc3MuaGFzT2Zmc2V0Q29ycmVjdGlvbigpID8gIiArICIgKyBnZW5DbGFzcy5nZXRPZmZzZXRDb3JyZWN0aW9uRmllbGQobnVsbCkgOiAiIjslPgotPCVAIGluY2x1ZGUgZmlsZT0iLi4vSGVhZGVyLmphdmFqZXRpbmMiJT4KLTwlaWYgKGlzSW50ZXJmYWNlKSB7JT4KLXBhY2thZ2UgPCU9Z2VuUGFja2FnZS5nZXRJbnRlcmZhY2VQYWNrYWdlTmFtZSgpJT47Ci08JX0gZWxzZSB7JT4KLXBhY2thZ2UgPCU9Z2VuUGFja2FnZS5nZXRDbGFzc1BhY2thZ2VOYW1lKCklPjsKLTwlfSU+Ci0KLTwlZ2VuTW9kZWwubWFya0ltcG9ydExvY2F0aW9uKHN0cmluZ0J1ZmZlciwgZ2VuUGFja2FnZSk7JT4KLQotPCVpZiAoaXNJbnRlcmZhY2UpIHslPgotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+PCU9Z2VuQ2xhc3MuZ2V0Rm9ybWF0dGVkTmFtZSgpJT48L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci08JWlmIChnZW5DbGFzcy5oYXNEb2N1bWVudGF0aW9uKCkpIHslPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogPCU9Z2VuQ2xhc3MuZ2V0RG9jdW1lbnRhdGlvbihnZW5Nb2RlbC5nZXRJbmRlbnRhdGlvbihzdHJpbmdCdWZmZXIpKSU+Ci0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci08JX0lPgotICoKLTwlaWYgKCFnZW5DbGFzcy5nZXRHZW5GZWF0dXJlcygpLmlzRW1wdHkoKSkgeyU+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLTwlZm9yIChHZW5GZWF0dXJlIGdlbkZlYXR1cmUgOiBnZW5DbGFzcy5nZXRHZW5GZWF0dXJlcygpKSB7JT4KLSAgPCVpZiAoIWdlbkZlYXR1cmUuaXNTdXBwcmVzc2VkR2V0VmlzaWJpbGl0eSgpKSB7JT4KLSAqICAgPGxpPntAbGluayA8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRJbnRlcmZhY2VOYW1lKCklPiM8JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPiA8ZW0+PCU9Z2VuRmVhdHVyZS5nZXRGb3JtYXR0ZWROYW1lKCklPjwvZW0+fTwvbGk+Ci0gIDwlfSU+Ci08JX0lPgotICogPC91bD4KLSAqIDwvcD4KLTwlfSU+Ci0gKgotPCVpZiAoIWdlbk1vZGVsLmlzU3VwcHJlc3NFTUZNZXRhRGF0YSgpKSB7JT4KLSAqIEBzZWUgPCU9Z2VuUGFja2FnZS5nZXRRdWFsaWZpZWRQYWNrYWdlSW50ZXJmYWNlTmFtZSgpJT4jZ2V0PCU9Z2VuQ2xhc3MuZ2V0Q2xhc3NpZmllckFjY2Vzc29yTmFtZSgpJT4oKQotPCV9JT4KLTwlaWYgKCFnZW5Nb2RlbC5pc1N1cHByZXNzRU1GTW9kZWxUYWdzKCkpIHsgYm9vbGVhbiBmaXJzdCA9IHRydWU7IGZvciAoU3RyaW5nVG9rZW5pemVyIHN0cmluZ1Rva2VuaXplciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoZ2VuQ2xhc3MuZ2V0TW9kZWxJbmZvKCksICJcblxyIik7IHN0cmluZ1Rva2VuaXplci5oYXNNb3JlVG9rZW5zKCk7ICkgeyBTdHJpbmcgbW9kZWxJbmZvID0gc3RyaW5nVG9rZW5pemVyLm5leHRUb2tlbigpOyBpZiAoZmlyc3QpIHsgZmlyc3QgPSBmYWxzZTslPgotICogQG1vZGVsIDwlPW1vZGVsSW5mbyU+Ci08JX0gZWxzZSB7JT4KLSAqICAgICAgICA8JT1tb2RlbEluZm8lPgotPCV9fSBpZiAoZmlyc3QpIHslPgotICogQG1vZGVsCi08JX19JT4KLTwlaWYgKGdlbkNsYXNzLm5lZWRzUm9vdEV4dGVuZHNJbnRlcmZhY2VFeHRlbmRzVGFnKCkpIHslPgotICogQGV4dGVuZHMgPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKGdlbk1vZGVsLmdldFJvb3RFeHRlbmRzSW50ZXJmYWNlKCkpJT4KLTwlfSU+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLTwlfSBlbHNlIHslPgotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPjwlPWdlbkNsYXNzLmdldEZvcm1hdHRlZE5hbWUoKSU+PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci08JWlmICghZ2VuQ2xhc3MuZ2V0SW1wbGVtZW50ZWRHZW5GZWF0dXJlcygpLmlzRW1wdHkoKSkgeyU+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLTwlZm9yIChHZW5GZWF0dXJlIGdlbkZlYXR1cmUgOiBnZW5DbGFzcy5nZXRJbXBsZW1lbnRlZEdlbkZlYXR1cmVzKCkpIHslPgotICogICA8bGk+e0BsaW5rIDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZENsYXNzTmFtZSgpJT4jPCU9Z2VuRmVhdHVyZS5nZXRHZXRBY2Nlc3NvcigpJT4gPGVtPjwlPWdlbkZlYXR1cmUuZ2V0Rm9ybWF0dGVkTmFtZSgpJT48L2VtPn08L2xpPgotPCV9JT4KLSAqIDwvdWw+Ci08JX0lPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotPCV9JT4KLTwlaWYgKGlzSW1wbGVtZW50YXRpb24pIHslPgotcHVibGljPCVpZiAoZ2VuQ2xhc3MuaXNBYnN0cmFjdCgpKSB7JT4gYWJzdHJhY3Q8JX0lPiBjbGFzcyA8JT1nZW5DbGFzcy5nZXRDbGFzc05hbWUoKSU+PCU9Z2VuQ2xhc3MuZ2V0VHlwZVBhcmFtZXRlcnMoKS50cmltKCklPjwlPWdlbkNsYXNzLmdldENsYXNzRXh0ZW5kcygpJT48JT1nZW5DbGFzcy5nZXRDbGFzc0ltcGxlbWVudHMoKSU+Ci08JX0gZWxzZSB7JT4KLXB1YmxpYyBpbnRlcmZhY2UgPCU9Z2VuQ2xhc3MuZ2V0SW50ZXJmYWNlTmFtZSgpJT48JT1nZW5DbGFzcy5nZXRUeXBlUGFyYW1ldGVycygpLnRyaW0oKSU+PCU9Z2VuQ2xhc3MuZ2V0SW50ZXJmYWNlRXh0ZW5kcygpJT4KLTwlfSU+Ci17Ci08JWlmIChnZW5Nb2RlbC5oYXNDb3B5cmlnaHRGaWVsZCgpKSB7JT4KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQk8JT1wdWJsaWNTdGF0aWNGaW5hbEZsYWclPjwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgiamF2YS5sYW5nLlN0cmluZyIpJT4gY29weXJpZ2h0ID0gPCU9Z2VuTW9kZWwuZ2V0Q29weXJpZ2h0RmllbGRMaXRlcmFsKCklPjs8JT1nZW5Nb2RlbC5nZXROb25OTFMoKSU+Ci0KLTwlfSU+Ci08JWlmIChpc0ltcGxlbWVudGF0aW9uICYmIGdlbk1vZGVsLmdldERyaXZlck51bWJlcigpICE9IG51bGwpIHslPgotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJqYXZhLmxhbmcuU3RyaW5nIiklPiBtb2ZEcml2ZXJOdW1iZXIgPSAiPCU9Z2VuTW9kZWwuZ2V0RHJpdmVyTnVtYmVyKCklPiI7PCU9Z2VuTW9kZWwuZ2V0Tm9uTkxTKCklPgotCi08JX0lPgotPCVpZiAoaXNJbXBsZW1lbnRhdGlvbiAmJiBnZW5DbGFzcy5pc0phdmFJT1NlcmlhbGl6YWJsZSgpKSB7JT4KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotPCV9JT4KLTwlaWYgKGlzSW1wbGVtZW50YXRpb24gJiYgZ2VuTW9kZWwuaXNWaXJ0dWFsRGVsZWdhdGlvbigpKSB7IFN0cmluZyBlVmlydHVhbFZhbHVlc0ZpZWxkID0gZ2VuQ2xhc3MuZ2V0RVZpcnR1YWxWYWx1ZXNGaWVsZCgpOyU+Ci0gIDwlaWYgKGVWaXJ0dWFsVmFsdWVzRmllbGQgIT0gbnVsbCkgeyU+Ci0JLyoqCi0JICogQW4gYXJyYXkgb2Ygb2JqZWN0cyByZXByZXNlbnRpbmcgdGhlIHZhbHVlcyBvZiBub24tcHJpbWl0aXZlIGZlYXR1cmVzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3RbXSA8JT1lVmlydHVhbFZhbHVlc0ZpZWxkJT47Ci0KLSAgPCV9JT4KLSAgPCV7IExpc3Q8U3RyaW5nPiBlVmlydHVhbEluZGV4Qml0RmllbGRzID0gZ2VuQ2xhc3MuZ2V0RVZpcnR1YWxJbmRleEJpdEZpZWxkcyhuZXcgQXJyYXlMaXN0PFN0cmluZz4oKSk7JT4KLSAgICA8JWlmICghZVZpcnR1YWxJbmRleEJpdEZpZWxkcy5pc0VtcHR5KCkpIHslPgotICAgICAgPCVmb3IgKFN0cmluZyBlVmlydHVhbEluZGV4Qml0RmllbGQgOiBlVmlydHVhbEluZGV4Qml0RmllbGRzKSB7JT4KLQkvKioKLQkgKiBBIGJpdCBmaWVsZCByZXByZXNlbnRpbmcgdGhlIGluZGljZXMgb2Ygbm9uLXByaW1pdGl2ZSBmZWF0dXJlIHZhbHVlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgaW50IDwlPWVWaXJ0dWFsSW5kZXhCaXRGaWVsZCU+OwotCi0gICAgICA8JX0lPgotICAgIDwlfSU+Ci0gIDwlfSU+Ci08JX0lPgotPCVpZiAoaXNJbXBsZW1lbnRhdGlvbiAmJiBnZW5DbGFzcy5pc01vZGVsUm9vdCgpICYmIGdlbk1vZGVsLmlzQm9vbGVhbkZsYWdzRW5hYmxlZCgpICYmIGdlbk1vZGVsLmdldEJvb2xlYW5GbGFnc1Jlc2VydmVkQml0cygpID09IC0xKSB7JT4KLQkvKioKLQkgKiBBIHNldCBvZiBiaXQgZmxhZ3MgcmVwcmVzZW50aW5nIHRoZSB2YWx1ZXMgb2YgYm9vbGVhbiBhdHRyaWJ1dGVzIGFuZCB3aGV0aGVyIHVuc2V0dGFibGUgZmVhdHVyZXMgaGF2ZSBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBpbnQgPCU9Z2VuTW9kZWwuZ2V0Qm9vbGVhbkZsYWdzRmllbGQoKSU+ID0gMDsKLQotPCV9JT4KLTwlaWYgKGlzSW1wbGVtZW50YXRpb24gJiYgIWdlbk1vZGVsLmlzUmVmbGVjdGl2ZURlbGVnYXRpb24oKSkgeyU+Ci0gIDwlZm9yIChHZW5GZWF0dXJlIGdlbkZlYXR1cmUgOiBnZW5DbGFzcy5nZXREZWNsYXJlZEZpZWxkR2VuRmVhdHVyZXMoKSkgeyU+Ci08JUAgaW5jbHVkZSBmaWxlPSJDbGFzcy9kZWNsYXJlZEZpZWxkR2VuRmVhdHVyZS5vdmVycmlkZS5qYXZhamV0aW5jIiBmYWlsPSJhbHRlcm5hdGl2ZSIgJT4KLTwlQCBzdGFydCAlPgotICAgIDwlaWYgKGdlbkZlYXR1cmUuaXNMaXN0VHlwZSgpIHx8IGdlbkZlYXR1cmUuaXNSZWZlcmVuY2VUeXBlKCkpIHslPgotICAgICAgPCVpZiAoZ2VuQ2xhc3MuaXNGaWVsZChnZW5GZWF0dXJlKSkgeyU+Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjPCU9Z2VuRmVhdHVyZS5nZXRHZXRBY2Nlc3NvcigpJT4oKSA8ZW0+PCU9Z2VuRmVhdHVyZS5nZXRGb3JtYXR0ZWROYW1lKCklPjwvZW0+fScgPCU9Z2VuRmVhdHVyZS5nZXRGZWF0dXJlS2luZCgpJT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICM8JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIDwlPWdlbkZlYXR1cmUuZ2V0SW1wb3J0ZWRJbnRlcm5hbFR5cGUoZ2VuQ2xhc3MpJT4gPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT47Ci0KLSAgICAgIDwlfSU+Ci0gICAgICA8JWlmIChnZW5Nb2RlbC5pc0FycmF5QWNjZXNzb3JzKCkgJiYgZ2VuRmVhdHVyZS5pc0xpc3RUeXBlKCkgJiYgIWdlbkZlYXR1cmUuaXNGZWF0dXJlTWFwVHlwZSgpICYmICFnZW5GZWF0dXJlLmlzTWFwVHlwZSgpKSB7IFN0cmluZyByYXdMaXN0SXRlbVR5cGUgPSBnZW5GZWF0dXJlLmdldFJhd0xpc3RJdGVtVHlwZSgpOyBpbnQgaW5kZXggPSByYXdMaXN0SXRlbVR5cGUuaW5kZXhPZignWycpOyBTdHJpbmcgaGVhZCA9IHJhd0xpc3RJdGVtVHlwZTsgU3RyaW5nIHRhaWwgPSAiIjsgaWYgKGluZGV4ICE9IC0xKSB7IGhlYWQgPSByYXdMaXN0SXRlbVR5cGUuc3Vic3RyaW5nKDAsIGluZGV4KTsgdGFpbCA9IHJhd0xpc3RJdGVtVHlwZS5zdWJzdHJpbmcoaW5kZXgpOyB9ICU+Ci0JLyoqCi0JICogVGhlIGVtcHR5IHZhbHVlIGZvciB0aGUgJ3tAbGluayAjPCU9Z2VuRmVhdHVyZS5nZXRHZXRBcnJheUFjY2Vzc29yKCklPigpIDxlbT48JT1nZW5GZWF0dXJlLmdldEZvcm1hdHRlZE5hbWUoKSU+PC9lbT59JyBhcnJheSBhY2Nlc3Nvci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgIzwlPWdlbkZlYXR1cmUuZ2V0R2V0QXJyYXlBY2Nlc3NvcigpJT4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICAgICAgICA8JWlmIChnZW5GZWF0dXJlLmdldFF1YWxpZmllZExpc3RJdGVtVHlwZShnZW5DbGFzcykuY29udGFpbnMoIjwiKSkgeyU+Ci0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgICAgIDwlfSU+Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCA8JT1yYXdMaXN0SXRlbVR5cGUlPltdIDwlPWdlbkZlYXR1cmUuZ2V0VXBwZXJOYW1lKCklPl9FRU1QVFlfQVJSQVkgPSBuZXcgPCU9aGVhZCU+IFswXTwlPXRhaWwlPjsKLQotICAgICAgPCV9JT4KLSAgICA8JX0gZWxzZSB7JT4KLSAgICAgIDwlaWYgKGdlbkZlYXR1cmUuaGFzRURlZmF1bHQoKSAmJiAoIWdlbkZlYXR1cmUuaXNWb2xhdGlsZSgpIHx8ICFnZW5Nb2RlbC5pc1JlZmxlY3RpdmVEZWxlZ2F0aW9uKCkgJiYgKCFnZW5GZWF0dXJlLmhhc0RlbGVnYXRlRmVhdHVyZSgpIHx8ICFnZW5GZWF0dXJlLmlzVW5zZXR0YWJsZSgpKSkpIHsgU3RyaW5nIHN0YXRpY0RlZmF1bHRWYWx1ZSA9IGdlbkZlYXR1cmUuZ2V0U3RhdGljRGVmYXVsdFZhbHVlKCk7JT4KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjPCU9Z2VuRmVhdHVyZS5nZXRHZXRBY2Nlc3NvcigpJT4oKSA8ZW0+PCU9Z2VuRmVhdHVyZS5nZXRGb3JtYXR0ZWROYW1lKCklPjwvZW0+fScgPCU9Z2VuRmVhdHVyZS5nZXRGZWF0dXJlS2luZCgpJT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICM8JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gICAgICAgIDwlaWYgKGdlbk1vZGVsLnVzZUdlbmVyaWNzKCkgJiYgZ2VuRmVhdHVyZS5pc0xpc3REYXRhVHlwZSgpICYmIGdlbkZlYXR1cmUuaXNTZXREZWZhdWx0VmFsdWUoKSkgeyU+Ci0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgICAgIDwlfSU+Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCA8JT1nZW5GZWF0dXJlLmdldEltcG9ydGVkVHlwZShnZW5DbGFzcyklPiA8JT1nZW5GZWF0dXJlLmdldEVEZWZhdWx0KCklPjwlaWYgKCIiLmVxdWFscyhzdGF0aWNEZWZhdWx0VmFsdWUpKSB7JT47IC8vIFRPRE8gVGhlIGRlZmF1bHQgdmFsdWUgbGl0ZXJhbCAiPCU9Z2VuRmVhdHVyZS5nZXRFY29yZUZlYXR1cmUoKS5nZXREZWZhdWx0VmFsdWVMaXRlcmFsKCklPiIgaXMgbm90IHZhbGlkLjwlfSBlbHNlIHslPiA9IDwlPXN0YXRpY0RlZmF1bHRWYWx1ZSU+OzwlPWdlbk1vZGVsLmdldE5vbk5MUyhzdGF0aWNEZWZhdWx0VmFsdWUpJT48JX0lPgotCi0gICAgICA8JX0lPgotICAgICAgPCVpZiAoZ2VuQ2xhc3MuaXNGaWVsZChnZW5GZWF0dXJlKSkgeyU+Ci0gICAgICAgIDwlaWYgKGdlbkNsYXNzLmlzRmxhZyhnZW5GZWF0dXJlKSkgeyU+Ci0gICAgICAgICAgPCVpZiAoZ2VuQ2xhc3MuZ2V0RmxhZ0luZGV4KGdlbkZlYXR1cmUpID4gMzEgJiYgZ2VuQ2xhc3MuZ2V0RmxhZ0luZGV4KGdlbkZlYXR1cmUpICUgMzIgPT0gMCkgeyU+Ci0JLyoqCi0JICogQW4gYWRkaXRpb25hbCBzZXQgb2YgYml0IGZsYWdzIHJlcHJlc2VudGluZyB0aGUgdmFsdWVzIG9mIGJvb2xlYW4gYXR0cmlidXRlcyBhbmQgd2hldGhlciB1bnNldHRhYmxlIGZlYXR1cmVzIGhhdmUgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgaW50IDwlPWdlbkNsYXNzLmdldEZsYWdzRmllbGQoZ2VuRmVhdHVyZSklPiA9IDA7Ci0KLSAgICAgICAgICA8JX0lPgotCS8qKgotCSAqIFRoZSBmbGFnIHJlcHJlc2VudGluZyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgIzwlPWdlbkZlYXR1cmUuZ2V0R2V0QWNjZXNzb3IoKSU+KCkgPGVtPjwlPWdlbkZlYXR1cmUuZ2V0Rm9ybWF0dGVkTmFtZSgpJT48L2VtPn0nIDwlPWdlbkZlYXR1cmUuZ2V0RmVhdHVyZUtpbmQoKSU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjPCU9Z2VuRmVhdHVyZS5nZXRHZXRBY2Nlc3NvcigpJT4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IDwlPWdlbkZlYXR1cmUuZ2V0VXBwZXJOYW1lKCklPl9FRkxBRyA9IDEgPCU9Ijw8ICIgKyBnZW5DbGFzcy5nZXRGbGFnSW5kZXgoZ2VuRmVhdHVyZSkgJSAzMiAlPjsKLQotICAgICAgICA8JX0gZWxzZSB7JT4KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICM8JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPigpIDxlbT48JT1nZW5GZWF0dXJlLmdldEZvcm1hdHRlZE5hbWUoKSU+PC9lbT59JyA8JT1nZW5GZWF0dXJlLmdldEZlYXR1cmVLaW5kKCklPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgIzwlPWdlbkZlYXR1cmUuZ2V0R2V0QWNjZXNzb3IoKSU+KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgPCU9Z2VuRmVhdHVyZS5nZXRJbXBvcnRlZFR5cGUoZ2VuQ2xhc3MpJT4gPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT48JWlmIChnZW5GZWF0dXJlLmhhc0VEZWZhdWx0KCkpIHslPiA9IDwlPWdlbkZlYXR1cmUuZ2V0RURlZmF1bHQoKSU+PCV9JT47Ci0KLSAgICAgICAgPCV9JT4KLSAgICAgIDwlfSU+Ci0gICAgPCV9JT4KLSAgICA8JWlmIChnZW5DbGFzcy5pc0VTZXRGaWVsZChnZW5GZWF0dXJlKSkgeyU+Ci0gICAgICA8JWlmIChnZW5DbGFzcy5pc0VTZXRGbGFnKGdlbkZlYXR1cmUpKSB7JT4KLSAgICAgICAgPCVpZiAoZ2VuQ2xhc3MuZ2V0RVNldEZsYWdJbmRleChnZW5GZWF0dXJlKSA+IDMxICYmIGdlbkNsYXNzLmdldEVTZXRGbGFnSW5kZXgoZ2VuRmVhdHVyZSkgJSAzMiA9PSAwKSB7JT4KLQkvKioKLQkgKiBBbiBhZGRpdGlvbmFsIHNldCBvZiBiaXQgZmxhZ3MgcmVwcmVzZW50aW5nIHRoZSB2YWx1ZXMgb2YgYm9vbGVhbiBhdHRyaWJ1dGVzIGFuZCB3aGV0aGVyIHVuc2V0dGFibGUgZmVhdHVyZXMgaGF2ZSBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBpbnQgPCU9Z2VuQ2xhc3MuZ2V0RVNldEZsYWdzRmllbGQoZ2VuRmVhdHVyZSklPiA9IDA7Ci0KLSAgICAgICAgPCV9JT4KLQkvKioKLQkgKiBUaGUgZmxhZyByZXByZXNlbnRpbmcgd2hldGhlciB0aGUgPCU9Z2VuRmVhdHVyZS5nZXRGb3JtYXR0ZWROYW1lKCklPiA8JT1nZW5GZWF0dXJlLmdldEZlYXR1cmVLaW5kKCklPiBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCA8JT1nZW5GZWF0dXJlLmdldFVwcGVyTmFtZSgpJT5fRVNFVEZMQUcgPSAxIDwlPSI8PCAiICsgZ2VuQ2xhc3MuZ2V0RVNldEZsYWdJbmRleChnZW5GZWF0dXJlKSAlIDMyICU+OwotCi0gICAgICA8JX0gZWxzZSB7JT4KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIDwlPWdlbkZlYXR1cmUuZ2V0Rm9ybWF0dGVkTmFtZSgpJT4gPCU9Z2VuRmVhdHVyZS5nZXRGZWF0dXJlS2luZCgpJT4gaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gPCU9Z2VuRmVhdHVyZS5nZXRVbmNhcE5hbWUoKSU+RVNldDsKLQotICAgICAgPCV9JT4KLSAgICA8JX0lPgotICA8JX0lPgotPCVAIGluY2x1ZGUgZmlsZT0iQ2xhc3MvZGVjbGFyZWRGaWVsZEdlbkZlYXR1cmUuaW5zZXJ0LmphdmFqZXRpbmMiIGZhaWw9InNpbGVudCIgJT4KLTwlQCBlbmQgJT48JS8vQ2xhc3MvZGVjbGFyZWRGaWVsZEdlbkZlYXR1cmUub3ZlcnJpZGUuamF2YWpldGluYyU+Ci08JX0lPgotPCVpZiAoaXNJbXBsZW1lbnRhdGlvbiAmJiBnZW5DbGFzcy5oYXNPZmZzZXRDb3JyZWN0aW9uKCkgJiYgIWdlbkNsYXNzLmdldEltcGxlbWVudGVkR2VuRmVhdHVyZXMoKS5pc0VtcHR5KCkpIHslPgotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCA8JT1nZW5DbGFzcy5nZXRPZmZzZXRDb3JyZWN0aW9uRmllbGQobnVsbCklPiA9IDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZENsYXNzaWZpZXJBY2Nlc3NvcigpJT4uZ2V0RmVhdHVyZUlEKDwlPWdlbkNsYXNzLmdldEltcGxlbWVudGVkR2VuRmVhdHVyZXMoKS5nZXQoMCkuZ2V0UXVhbGlmaWVkRmVhdHVyZUFjY2Vzc29yKCklPikgLSA8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuQ2xhc3MuZ2V0SW1wbGVtZW50ZWRHZW5GZWF0dXJlcygpLmdldCgwKSklPjsKLQotPCV9JT4KLTwlaWYgKGlzSW1wbGVtZW50YXRpb24gJiYgZ2VuQ2xhc3MuaGFzT2Zmc2V0Q29ycmVjdGlvbigpICYmICFnZW5Nb2RlbC5pc1JlZmxlY3RpdmVEZWxlZ2F0aW9uKCkpIHslPgotICA8JWZvciAoR2VuRmVhdHVyZSBnZW5GZWF0dXJlIDogZ2VuQ2xhc3MuZ2V0SW1wbGVtZW50ZWRHZW5GZWF0dXJlcygpKSB7IEdlbkZlYXR1cmUgcmV2ZXJzZUZlYXR1cmUgPSBnZW5GZWF0dXJlLmdldFJldmVyc2UoKTslPgotICAgIDwlaWYgKHJldmVyc2VGZWF0dXJlICE9IG51bGwgJiYgcmV2ZXJzZUZlYXR1cmUuZ2V0R2VuQ2xhc3MoKS5oYXNPZmZzZXRDb3JyZWN0aW9uKCkpIHslPgotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCA8JT1nZW5DbGFzcy5nZXRPZmZzZXRDb3JyZWN0aW9uRmllbGQoZ2VuRmVhdHVyZSklPiA9IDwlPXJldmVyc2VGZWF0dXJlLmdldEdlbkNsYXNzKCkuZ2V0UXVhbGlmaWVkQ2xhc3NpZmllckFjY2Vzc29yKCklPi5nZXRGZWF0dXJlSUQoPCU9cmV2ZXJzZUZlYXR1cmUuZ2V0UXVhbGlmaWVkRmVhdHVyZUFjY2Vzc29yKCklPikgLSA8JT1yZXZlcnNlRmVhdHVyZS5nZXRHZW5DbGFzcygpLmdldFF1YWxpZmllZEZlYXR1cmVJRChyZXZlcnNlRmVhdHVyZSklPjsKLQotICAgIDwlfSU+Ci0gIDwlfSU+Ci08JX0lPgotPCVpZiAoaXNJbXBsZW1lbnRhdGlvbikgeyU+Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JPCVpZiAoZ2VuTW9kZWwuaXNQdWJsaWNDb25zdHJ1Y3RvcnMoKSkgeyU+cHVibGljPCV9IGVsc2UgeyU+cHJvdGVjdGVkPCV9JT4gPCU9Z2VuQ2xhc3MuZ2V0Q2xhc3NOYW1lKCklPigpCi0JewotCQlzdXBlcigpOwotICA8JWZvciAoR2VuRmVhdHVyZSBnZW5GZWF0dXJlIDogZ2VuQ2xhc3MuZ2V0RmxhZ0dlbkZlYXR1cmVzKCJ0cnVlIikpIHslPgotCQk8JT1nZW5DbGFzcy5nZXRGbGFnc0ZpZWxkKGdlbkZlYXR1cmUpJT4gfD0gPCU9Z2VuRmVhdHVyZS5nZXRVcHBlck5hbWUoKSU+X0VGTEFHOwotICA8JX0lPgotICAgIAotIC8vVU1BLS0+Ci0gCQlyZWFzc2lnbkRlZmF1bHRWYWx1ZXMoKTsKLSAvL1VNQTwtLQotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICA8JWlmIChnZW5Nb2RlbC51c2VDbGFzc092ZXJyaWRlQW5ub3RhdGlvbigpKSB7JT4KLQlAT3ZlcnJpZGUKLSAgPCV9JT4KLQlwcm90ZWN0ZWQgPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzIiklPiBlU3RhdGljQ2xhc3MoKQotCXsKLQkJcmV0dXJuIDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZENsYXNzaWZpZXJBY2Nlc3NvcigpJT47Ci0JfQotCi08JX0lPgotPCVAIGluY2x1ZGUgZmlsZT0iQ2xhc3MvcmVmbGVjdGl2ZURlbGVnYXRpb24ub3ZlcnJpZGUuamF2YWpldGluYyIgZmFpbD0iYWx0ZXJuYXRpdmUiICU+Ci08JUAgc3RhcnQgJT4KLTwlaWYgKGlzSW1wbGVtZW50YXRpb24gJiYgZ2VuTW9kZWwuZ2V0RmVhdHVyZURlbGVnYXRpb24oKSA9PSBHZW5EZWxlZ2F0aW9uS2luZC5SRUZMRUNUSVZFX0xJVEVSQUwgJiYgKGdlbkNsYXNzLmdldENsYXNzRXh0ZW5kc0dlbkNsYXNzKCkgPT0gbnVsbCB8fCBnZW5DbGFzcy5nZXRDbGFzc0V4dGVuZHNHZW5DbGFzcygpLmdldEdlbk1vZGVsKCkuZ2V0RmVhdHVyZURlbGVnYXRpb24oKSAhPSBHZW5EZWxlZ2F0aW9uS2luZC5SRUZMRUNUSVZFX0xJVEVSQUwpKSB7JT4KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgPCVpZiAoZ2VuTW9kZWwudXNlQ2xhc3NPdmVycmlkZUFubm90YXRpb24oKSkgeyU+Ci0JQE92ZXJyaWRlCi0gIDwlfSU+Ci0JcHJvdGVjdGVkIGludCBlU3RhdGljRmVhdHVyZUNvdW50KCkKLQl7Ci0JCXJldHVybiA8JT1nZW5DbGFzcy5nZXRDbGFzc0V4dGVuZHNHZW5DbGFzcygpID09IG51bGwgPyAwIDogZ2VuQ2xhc3MuZ2V0Q2xhc3NFeHRlbmRzR2VuQ2xhc3MoKS5nZXRBbGxHZW5GZWF0dXJlcygpLnNpemUoKSU+OwotCX0KLQotPCV9JT4KLTwlQCBlbmQgJT48JS8vQ2xhc3MvcmVmbGVjdGl2ZURlbGVnYXRpb24ub3ZlcnJpZGUuamF2YWpldGluYyU+Ci08JW5ldyBSdW5uYWJsZSgpIHsgcHVibGljIHZvaWQgcnVuKCkgeyU+Ci08JWZvciAoR2VuRmVhdHVyZSBnZW5GZWF0dXJlIDogKGlzSW1wbGVtZW50YXRpb24gPyBnZW5DbGFzcy5nZXRJbXBsZW1lbnRlZEdlbkZlYXR1cmVzKCkgOiBnZW5DbGFzcy5nZXREZWNsYXJlZEdlbkZlYXR1cmVzKCkpKSB7JT4KLTwlQCBpbmNsdWRlIGZpbGU9IkNsYXNzL2dlbkZlYXR1cmUub3ZlcnJpZGUuamF2YWpldGluYyIgZmFpbD0iYWx0ZXJuYXRpdmUiICU+Ci08JUAgc3RhcnQgJT4KLSAgPCVpZiAoZ2VuTW9kZWwuaXNBcnJheUFjY2Vzc29ycygpICYmIGdlbkZlYXR1cmUuaXNMaXN0VHlwZSgpICYmICFnZW5GZWF0dXJlLmlzRmVhdHVyZU1hcFR5cGUoKSAmJiAhZ2VuRmVhdHVyZS5pc01hcFR5cGUoKSkgeyU+Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgPCVpZiAoIWlzSW1wbGVtZW50YXRpb24pIHslPgotCTwlPWdlbkZlYXR1cmUuZ2V0TGlzdEl0ZW1UeXBlKGdlbkNsYXNzKSU+W10gPCU9Z2VuRmVhdHVyZS5nZXRHZXRBcnJheUFjY2Vzc29yKCklPigpOwotCi0gICAgPCV9IGVsc2UgeyU+Ci0gICAgICA8JWlmIChnZW5Nb2RlbC51c2VHZW5lcmljcygpKSB7JT4KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLSAgICAgIDwlfSU+Ci0JcHVibGljIDwlPWdlbkZlYXR1cmUuZ2V0TGlzdEl0ZW1UeXBlKGdlbkNsYXNzKSU+W10gPCU9Z2VuRmVhdHVyZS5nZXRHZXRBcnJheUFjY2Vzc29yKCklPigpCi0JewotICAgICAgPCVpZiAoZ2VuRmVhdHVyZS5pc1ZvbGF0aWxlKCkpIHslPgotCQk8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5CYXNpY0VMaXN0IiklPjwlPWdlbkZlYXR1cmUuZ2V0TGlzdFRlbXBsYXRlQXJndW1lbnRzKGdlbkNsYXNzKSU+IGxpc3QgPSAoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQmFzaWNFTGlzdCIpJT48JT1nZW5GZWF0dXJlLmdldExpc3RUZW1wbGF0ZUFyZ3VtZW50cyhnZW5DbGFzcyklPik8JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPigpOwotCQlpZiAobGlzdC5pc0VtcHR5KCkpIHJldHVybiA8JWlmIChnZW5Nb2RlbC51c2VHZW5lcmljcygpICYmICFnZW5GZWF0dXJlLmdldExpc3RJdGVtVHlwZShnZW5DbGFzcykuY29udGFpbnMoIjwiKSAmJiAhZ2VuRmVhdHVyZS5nZXRMaXN0SXRlbVR5cGUobnVsbCkuZXF1YWxzKGdlbkZlYXR1cmUuZ2V0TGlzdEl0ZW1UeXBlKGdlbkNsYXNzKSkpIHslPig8JT1nZW5GZWF0dXJlLmdldExpc3RJdGVtVHlwZShnZW5DbGFzcyklPltdKTwlfSU+PCU9Z2VuRmVhdHVyZS5nZXRVcHBlck5hbWUoKSU+X0VFTVBUWV9BUlJBWTsKLSAgICAgIDwlfSBlbHNlIHslPgotCQlpZiAoPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4gPT0gbnVsbCB8fCA8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPi5pc0VtcHR5KCkpIHJldHVybiA8JWlmIChnZW5Nb2RlbC51c2VHZW5lcmljcygpICYmICFnZW5GZWF0dXJlLmdldExpc3RJdGVtVHlwZShnZW5DbGFzcykuY29udGFpbnMoIjwiKSAmJiAhZ2VuRmVhdHVyZS5nZXRMaXN0SXRlbVR5cGUobnVsbCkuZXF1YWxzKGdlbkZlYXR1cmUuZ2V0TGlzdEl0ZW1UeXBlKGdlbkNsYXNzKSkpIHslPig8JT1nZW5GZWF0dXJlLmdldExpc3RJdGVtVHlwZShnZW5DbGFzcyklPltdKTwlfSU+PCU9Z2VuRmVhdHVyZS5nZXRVcHBlck5hbWUoKSU+X0VFTVBUWV9BUlJBWTsKLQkJPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQmFzaWNFTGlzdCIpJT48JT1nZW5GZWF0dXJlLmdldExpc3RUZW1wbGF0ZUFyZ3VtZW50cyhnZW5DbGFzcyklPiBsaXN0ID0gKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkJhc2ljRUxpc3QiKSU+PCU9Z2VuRmVhdHVyZS5nZXRMaXN0VGVtcGxhdGVBcmd1bWVudHMoZ2VuQ2xhc3MpJT4pPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT47Ci0gICAgICA8JX0lPgotCQlsaXN0LnNocmluaygpOwotCQlyZXR1cm4gKDwlPWdlbkZlYXR1cmUuZ2V0TGlzdEl0ZW1UeXBlKGdlbkNsYXNzKSU+W10pbGlzdC5kYXRhKCk7Ci0JfQotCi0gICAgPCV9JT4KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICA8JWlmICghaXNJbXBsZW1lbnRhdGlvbikgeyU+Ci0JPCU9Z2VuRmVhdHVyZS5nZXRMaXN0SXRlbVR5cGUoZ2VuQ2xhc3MpJT4gZ2V0PCU9Z2VuRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+KGludCBpbmRleCk7Ci0KLSAgICA8JX0gZWxzZSB7JT4KLQlwdWJsaWMgPCU9Z2VuRmVhdHVyZS5nZXRMaXN0SXRlbVR5cGUoZ2VuQ2xhc3MpJT4gZ2V0PCU9Z2VuRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+KGludCBpbmRleCkKLQl7Ci0JCXJldHVybiA8JWlmICghZ2VuTW9kZWwudXNlR2VuZXJpY3MoKSkgeyU+KDwlPWdlbkZlYXR1cmUuZ2V0TGlzdEl0ZW1UeXBlKGdlbkNsYXNzKSU+KTwlfSU+PCU9Z2VuRmVhdHVyZS5nZXRHZXRBY2Nlc3NvcigpJT4oKS5nZXQoaW5kZXgpOwotCX0KLQotICAgIDwlfSU+Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgPCVpZiAoIWlzSW1wbGVtZW50YXRpb24pIHslPgotCWludCBnZXQ8JT1nZW5GZWF0dXJlLmdldEFjY2Vzc29yTmFtZSgpJT5MZW5ndGgoKTsKLQotICAgIDwlfSBlbHNlIHslPgotCXB1YmxpYyBpbnQgZ2V0PCU9Z2VuRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+TGVuZ3RoKCkKLQl7Ci0gICAgICA8JWlmIChnZW5GZWF0dXJlLmlzVm9sYXRpbGUoKSkgeyU+Ci0JCXJldHVybiA8JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPigpLnNpemUoKTsKLSAgICAgIDwlfSBlbHNlIHslPgotCQlyZXR1cm4gPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4gPT0gbnVsbCA/IDAgOiA8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPi5zaXplKCk7Ci0gICAgICA8JX0lPgotCX0KLQotICAgIDwlfSU+Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgPCVpZiAoIWlzSW1wbGVtZW50YXRpb24pIHslPgotCXZvaWQgc2V0PCU9Z2VuRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+KDwlPWdlbkZlYXR1cmUuZ2V0TGlzdEl0ZW1UeXBlKGdlbkNsYXNzKSU+W10gbmV3PCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPik7Ci0KLSAgICA8JX0gZWxzZSB7JT4KLQlwdWJsaWMgdm9pZCBzZXQ8JT1nZW5GZWF0dXJlLmdldEFjY2Vzc29yTmFtZSgpJT4oPCU9Z2VuRmVhdHVyZS5nZXRMaXN0SXRlbVR5cGUoZ2VuQ2xhc3MpJT5bXSBuZXc8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+KQotCXsKLQkJKCg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5CYXNpY0VMaXN0IiklPjwlPWdlbkZlYXR1cmUuZ2V0TGlzdFRlbXBsYXRlQXJndW1lbnRzKGdlbkNsYXNzKSU+KTwlPWdlbkZlYXR1cmUuZ2V0R2V0QWNjZXNzb3IoKSU+KCkpLnNldERhdGEobmV3PCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPi5sZW5ndGgsIG5ldzwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4pOwotCX0KLQotICAgIDwlfSU+Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgPCVpZiAoIWlzSW1wbGVtZW50YXRpb24pIHslPgotCXZvaWQgc2V0PCU9Z2VuRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+KGludCBpbmRleCwgPCU9Z2VuRmVhdHVyZS5nZXRMaXN0SXRlbVR5cGUoZ2VuQ2xhc3MpJT4gZWxlbWVudCk7Ci0KLSAgICA8JX0gZWxzZSB7JT4KLQlwdWJsaWMgdm9pZCBzZXQ8JT1nZW5GZWF0dXJlLmdldEFjY2Vzc29yTmFtZSgpJT4oaW50IGluZGV4LCA8JT1nZW5GZWF0dXJlLmdldExpc3RJdGVtVHlwZShnZW5DbGFzcyklPiBlbGVtZW50KQotCXsKLQkJPCU9Z2VuRmVhdHVyZS5nZXRHZXRBY2Nlc3NvcigpJT4oKS5zZXQoaW5kZXgsIGVsZW1lbnQpOwotCX0KLQotICAgIDwlfSU+Ci0gIDwlfSU+Ci0gIDwlaWYgKGdlbkZlYXR1cmUuaXNHZXQoKSAmJiAoaXNJbXBsZW1lbnRhdGlvbiB8fCAhZ2VuRmVhdHVyZS5pc1N1cHByZXNzZWRHZXRWaXNpYmlsaXR5KCkpKSB7JT4KLTwlQCBpbmNsdWRlIGZpbGU9IkNsYXNzL2dldEdlbkZlYXR1cmUub3ZlcnJpZGUuamF2YWpldGluYyIgZmFpbD0iYWx0ZXJuYXRpdmUiICU+Ci08JUAgc3RhcnQgJT4KLTwlaWYgKGlzSW50ZXJmYWNlKSB7JT4KLTwlQCBpbmNsdWRlIGZpbGU9IkNsYXNzL2dldEdlbkZlYXR1cmUuamF2YWRvYy5vdmVycmlkZS5qYXZhamV0aW5jIiBmYWlsPSJhbHRlcm5hdGl2ZSIgJT4KLTwlQCBzdGFydCAlPgotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPjwlPWdlbkZlYXR1cmUuZ2V0Rm9ybWF0dGVkTmFtZSgpJT48L2I+PC9lbT4nIDwlPWdlbkZlYXR1cmUuZ2V0RmVhdHVyZUtpbmQoKSU+LgotICAgIDwlaWYgKGdlbkZlYXR1cmUuaXNMaXN0VHlwZSgpKSB7JT4KLSAgICAgIDwlaWYgKGdlbkZlYXR1cmUuaXNNYXBUeXBlKCkpIHsgR2VuRmVhdHVyZSBrZXlGZWF0dXJlID0gZ2VuRmVhdHVyZS5nZXRNYXBFbnRyeVR5cGVHZW5DbGFzcygpLmdldE1hcEVudHJ5S2V5RmVhdHVyZSgpOyBHZW5GZWF0dXJlIHZhbHVlRmVhdHVyZSA9IGdlbkZlYXR1cmUuZ2V0TWFwRW50cnlUeXBlR2VuQ2xhc3MoKS5nZXRNYXBFbnRyeVZhbHVlRmVhdHVyZSgpOyAlPgotCSAqIFRoZSBrZXkgaXMgb2YgdHlwZSA8JWlmIChrZXlGZWF0dXJlLmlzTGlzdFR5cGUoKSkgeyU+bGlzdCBvZiB7QGxpbmsgPCU9a2V5RmVhdHVyZS5nZXRRdWFsaWZpZWRMaXN0SXRlbVR5cGUoZ2VuQ2xhc3MpJT59PCV9IGVsc2UgeyU+e0BsaW5rIDwlPWtleUZlYXR1cmUuZ2V0VHlwZShnZW5DbGFzcyklPn08JX0lPiwKLQkgKiBhbmQgdGhlIHZhbHVlIGlzIG9mIHR5cGUgPCVpZiAodmFsdWVGZWF0dXJlLmlzTGlzdFR5cGUoKSkgeyU+bGlzdCBvZiB7QGxpbmsgPCU9dmFsdWVGZWF0dXJlLmdldFF1YWxpZmllZExpc3RJdGVtVHlwZShnZW5DbGFzcyklPn08JX0gZWxzZSB7JT57QGxpbmsgPCU9dmFsdWVGZWF0dXJlLmdldFR5cGUoZ2VuQ2xhc3MpJT59PCV9JT4sCi0gICAgICA8JX0gZWxzZSBpZiAoIWdlbkZlYXR1cmUuaXNXcmFwcGVkRmVhdHVyZU1hcFR5cGUoKSAmJiAhKGdlbk1vZGVsLmlzU3VwcHJlc3NFTUZNZXRhRGF0YSgpICYmICJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCIuZXF1YWxzKGdlbkZlYXR1cmUuZ2V0UXVhbGlmaWVkTGlzdEl0ZW1UeXBlKGdlbkNsYXNzKSkpKSB7Ci1TdHJpbmcgdHlwZU5hbWUgPSBnZW5GZWF0dXJlLmdldFF1YWxpZmllZExpc3RJdGVtVHlwZShnZW5DbGFzcyk7IFN0cmluZyBoZWFkID0gdHlwZU5hbWU7IFN0cmluZyB0YWlsID0gIiI7IGludCBpbmRleCA9IHR5cGVOYW1lLmluZGV4T2YoJzwnKTsgaWYgKGluZGV4ID09IC0xKSB7IGluZGV4ID0gdHlwZU5hbWUuaW5kZXhPZignWycpOyB9IAotaWYgKGluZGV4ICE9IC0xKSB7IGhlYWQgPSB0eXBlTmFtZS5zdWJzdHJpbmcoMCwgaW5kZXgpOyB0YWlsID0gdHlwZU5hbWUuc3Vic3RyaW5nKGluZGV4KS5yZXBsYWNlQWxsKCI8IiwgIiZsdDsiKTsgfQotJT4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgPCU9aGVhZCU+fTwlPXRhaWwlPi4KLSAgICAgIDwlfSU+Ci0gICAgPCV9IGVsc2UgaWYgKGdlbkZlYXR1cmUuaXNTZXREZWZhdWx0VmFsdWUoKSkgeyU+Ci0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+PCU9Z2VuRmVhdHVyZS5nZXREZWZhdWx0VmFsdWUoKSU+PC9jb2RlPi4KLSAgICA8JX0lPgotICAgIDwlaWYgKGdlbkZlYXR1cmUuZ2V0VHlwZUdlbkVudW0oKSAhPSBudWxsKSB7JT4KLQkgKiBUaGUgbGl0ZXJhbHMgYXJlIGZyb20gdGhlIGVudW1lcmF0aW9uIHtAbGluayA8JT1nZW5GZWF0dXJlLmdldFR5cGVHZW5FbnVtKCkuZ2V0UXVhbGlmaWVkTmFtZSgpJT59LgotICAgIDwlfSU+Ci0gICAgPCVpZiAoZ2VuRmVhdHVyZS5pc0JpZGlyZWN0aW9uYWwoKSAmJiAhZ2VuRmVhdHVyZS5nZXRSZXZlcnNlKCkuZ2V0R2VuQ2xhc3MoKS5pc01hcEVudHJ5KCkpIHsgR2VuRmVhdHVyZSByZXZlcnNlR2VuRmVhdHVyZSA9IGdlbkZlYXR1cmUuZ2V0UmV2ZXJzZSgpOyAlPgotICAgICAgPCVpZiAoIXJldmVyc2VHZW5GZWF0dXJlLmlzU3VwcHJlc3NlZEdldFZpc2liaWxpdHkoKSkgeyU+Ci0JICogSXQgaXMgYmlkaXJlY3Rpb25hbCBhbmQgaXRzIG9wcG9zaXRlIGlzICd7QGxpbmsgPCU9cmV2ZXJzZUdlbkZlYXR1cmUuZ2V0R2VuQ2xhc3MoKS5nZXRRdWFsaWZpZWRJbnRlcmZhY2VOYW1lKCklPiM8JT1yZXZlcnNlR2VuRmVhdHVyZS5nZXRHZXRBY2Nlc3NvcigpJT4gPGVtPjwlPXJldmVyc2VHZW5GZWF0dXJlLmdldEZvcm1hdHRlZE5hbWUoKSU+PC9lbT59Jy4KLSAgICAgIDwlfSU+Ci0gICAgPCV9JT4KLTwlQCBpbmNsdWRlIGZpbGU9IkNsYXNzL2dldEdlbkZlYXR1cmUuamF2YWRvYy5pbnNlcnQuamF2YWpldGluYyIgZmFpbD0ic2lsZW50IiAlPgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgPCVpZiAoIWdlbkZlYXR1cmUuaGFzRG9jdW1lbnRhdGlvbigpKSB7JT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT48JT1nZW5GZWF0dXJlLmdldEZvcm1hdHRlZE5hbWUoKSU+PC9lbT4nIDwlPWdlbkZlYXR1cmUuZ2V0RmVhdHVyZUtpbmQoKSU+IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0gICAgPCV9JT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICA8JWlmIChnZW5GZWF0dXJlLmhhc0RvY3VtZW50YXRpb24oKSkgeyU+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogPCU9Z2VuRmVhdHVyZS5nZXREb2N1bWVudGF0aW9uKGdlbk1vZGVsLmdldEluZGVudGF0aW9uKHN0cmluZ0J1ZmZlcikpJT4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gICAgPCV9JT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48JT1nZW5GZWF0dXJlLmdldEZvcm1hdHRlZE5hbWUoKSU+PC9lbT4nIDwlPWdlbkZlYXR1cmUuZ2V0RmVhdHVyZUtpbmQoKSU+LgotICAgIDwlaWYgKGdlbkZlYXR1cmUuZ2V0VHlwZUdlbkVudW0oKSAhPSBudWxsKSB7JT4KLQkgKiBAc2VlIDwlPWdlbkZlYXR1cmUuZ2V0VHlwZUdlbkVudW0oKS5nZXRRdWFsaWZpZWROYW1lKCklPgotICAgIDwlfSU+Ci0gICAgPCVpZiAoZ2VuRmVhdHVyZS5pc1Vuc2V0dGFibGUoKSkgeyU+Ci0gICAgICA8JWlmICghZ2VuRmVhdHVyZS5pc1N1cHByZXNzZWRJc1NldFZpc2liaWxpdHkoKSkgeyU+Ci0JICogQHNlZSAjaXNTZXQ8JT1nZW5GZWF0dXJlLmdldEFjY2Vzc29yTmFtZSgpJT4oKQotICAgICAgPCV9JT4KLSAgICAgIDwlaWYgKGdlbkZlYXR1cmUuaXNDaGFuZ2VhYmxlKCkgJiYgIWdlbkZlYXR1cmUuaXNTdXBwcmVzc2VkVW5zZXRWaXNpYmlsaXR5KCkpIHslPgotCSAqIEBzZWUgI3Vuc2V0PCU9Z2VuRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+KCkKLSAgICAgIDwlfSU+Ci0gICAgPCV9JT4KLSAgICA8JWlmIChnZW5GZWF0dXJlLmlzQ2hhbmdlYWJsZSgpICYmICFnZW5GZWF0dXJlLmlzTGlzdFR5cGUoKSAmJiAhZ2VuRmVhdHVyZS5pc1N1cHByZXNzZWRTZXRWaXNpYmlsaXR5KCkpIHslPgotCSAqIEBzZWUgI3NldDwlPWdlbkZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPig8JT1nZW5GZWF0dXJlLmdldFJhd0ltcG9ydGVkQm91bmRUeXBlKCklPikKLSAgICA8JX0lPgotICAgIDwlaWYgKCFnZW5Nb2RlbC5pc1N1cHByZXNzRU1GTWV0YURhdGEoKSkgeyU+Ci0JICogQHNlZSA8JT1nZW5QYWNrYWdlLmdldFF1YWxpZmllZFBhY2thZ2VJbnRlcmZhY2VOYW1lKCklPiNnZXQ8JT1nZW5GZWF0dXJlLmdldEZlYXR1cmVBY2Nlc3Nvck5hbWUoKSU+KCkKLSAgICA8JX0lPgotICAgIDwlaWYgKGdlbkZlYXR1cmUuaXNCaWRpcmVjdGlvbmFsKCkgJiYgIWdlbkZlYXR1cmUuZ2V0UmV2ZXJzZSgpLmdldEdlbkNsYXNzKCkuaXNNYXBFbnRyeSgpKSB7IEdlbkZlYXR1cmUgcmV2ZXJzZUdlbkZlYXR1cmUgPSBnZW5GZWF0dXJlLmdldFJldmVyc2UoKTsgJT4KLSAgICAgIDwlaWYgKCFyZXZlcnNlR2VuRmVhdHVyZS5pc1N1cHByZXNzZWRHZXRWaXNpYmlsaXR5KCkpIHslPgotCSAqIEBzZWUgPCU9cmV2ZXJzZUdlbkZlYXR1cmUuZ2V0R2VuQ2xhc3MoKS5nZXRRdWFsaWZpZWRJbnRlcmZhY2VOYW1lKCklPiM8JT1yZXZlcnNlR2VuRmVhdHVyZS5nZXRHZXRBY2Nlc3NvcigpJT4KLSAgICAgIDwlfSU+Ci0gICAgPCV9JT4KLSAgICA8JWlmICghZ2VuTW9kZWwuaXNTdXBwcmVzc0VNRk1vZGVsVGFncygpKSB7IGJvb2xlYW4gZmlyc3QgPSB0cnVlOyBmb3IgKFN0cmluZ1Rva2VuaXplciBzdHJpbmdUb2tlbml6ZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGdlbkZlYXR1cmUuZ2V0TW9kZWxJbmZvKCksICJcblxyIik7IHN0cmluZ1Rva2VuaXplci5oYXNNb3JlVG9rZW5zKCk7ICkgeyBTdHJpbmcgbW9kZWxJbmZvID0gc3RyaW5nVG9rZW5pemVyLm5leHRUb2tlbigpOyBpZiAoZmlyc3QpIHsgZmlyc3QgPSBmYWxzZTslPgotCSAqIEBtb2RlbCA8JT1tb2RlbEluZm8lPgotICAgIDwlfSBlbHNlIHslPgotCSAqICAgICAgICA8JT1tb2RlbEluZm8lPgotICAgIDwlfX0gaWYgKGZpcnN0KSB7JT4KLQkgKiBAbW9kZWwKLSAgICA8JX19JT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi08JUAgZW5kICU+PCUvL0NsYXNzL2dldEdlbkZlYXR1cmUuamF2YWRvYy5vdmVycmlkZS5qYXZhamV0aW5jJT4KLTwlfSBlbHNlIHslPgotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotPCVpZiAoZ2VuTW9kZWwuZ2V0Q29tcGxpYW5jZUxldmVsKCkuZ2V0VmFsdWUoKSA+PSBHZW5KREtMZXZlbC5KREs1MCkgeyAvL0NsYXNzL2dldEdlbkZlYXR1cmUuYW5ub3RhdGlvbnMuaW5zZXJ0LmphdmFqZXRpbmMlPgotPCVAIGluY2x1ZGUgZmlsZT0iQ2xhc3MvZ2V0R2VuRmVhdHVyZS5hbm5vdGF0aW9ucy5pbnNlcnQuamF2YWpldGluYyIgZmFpbD0ic2lsZW50IiAlPgotPCV9JT4KLTwlfSU+Ci08JWlmICghaXNJbXBsZW1lbnRhdGlvbikgeyU+Ci0JPCU9Z2VuRmVhdHVyZS5nZXRJbXBvcnRlZFR5cGUoZ2VuQ2xhc3MpJT4gPCU9Z2VuRmVhdHVyZS5nZXRHZXRBY2Nlc3NvcigpJT4oKTsKLQotPCV9IGVsc2UgeyU+Ci0gIDwlaWYgKGdlbk1vZGVsLnVzZUdlbmVyaWNzKCkgJiYgKChnZW5GZWF0dXJlLmlzQ29udGFpbmVyKCkgfHwgZ2VuRmVhdHVyZS5pc1Jlc29sdmVQcm94aWVzKCkpICYmICFnZW5GZWF0dXJlLmlzTGlzdFR5cGUoKSAmJiAhZ2VuTW9kZWwuaXNSZWZsZWN0aXZlRGVsZWdhdGlvbigpICYmIGdlbkZlYXR1cmUuaXNVbmNoZWNrZWRDYXN0KCkgfHwgZ2VuRmVhdHVyZS5pc0xpc3RUeXBlKCkgJiYgKGdlbk1vZGVsLmlzUmVmbGVjdGl2ZURlbGVnYXRpb24oKSB8fCBnZW5Nb2RlbC5pc1ZpcnR1YWxEZWxlZ2F0aW9uKCkpIHx8IGdlbkZlYXR1cmUuaXNMaXN0RGF0YVR5cGUoKSAmJiBnZW5GZWF0dXJlLmhhc0RlbGVnYXRlRmVhdHVyZSgpKSkgeyU+Ci0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gIDwlfSU+Ci0JcHVibGljIDwlPWdlbkZlYXR1cmUuZ2V0SW1wb3J0ZWRUeXBlKGdlbkNsYXNzKSU+IDwlPWdlbkZlYXR1cmUuZ2V0R2V0QWNjZXNzb3IoKSU+KCkKLQl7Ci08JUAgaW5jbHVkZSBmaWxlPSJDbGFzcy9nZXRHZW5GZWF0dXJlLnByZS5pbnNlcnQuamF2YWpldGluYyIgZmFpbD0ic2lsZW50IiAlPgotICAgIDwlaWYgKGdlbk1vZGVsLmlzUmVmbGVjdGl2ZURlbGVnYXRpb24oKSkgeyU+Ci0JCXJldHVybiA8JWlmIChnZW5GZWF0dXJlLmlzUHJpbWl0aXZlVHlwZSgpKSB7JT4oPCV9JT4oPCU9Z2VuRmVhdHVyZS5nZXRPYmplY3RUeXBlKGdlbkNsYXNzKSU+KWVHZXQoPCU9Z2VuRmVhdHVyZS5nZXRRdWFsaWZpZWRGZWF0dXJlQWNjZXNzb3IoKSU+LCB0cnVlKTwlaWYgKGdlbkZlYXR1cmUuaXNQcmltaXRpdmVUeXBlKCkpIHslPikuPCU9Z2VuRmVhdHVyZS5nZXRQcmltaXRpdmVWYWx1ZUZ1bmN0aW9uKCklPigpPCV9JT47Ci0gICAgPCV9IGVsc2UgaWYgKCFnZW5GZWF0dXJlLmlzVm9sYXRpbGUoKSkgeyU+Ci0gICAgICA8JWlmIChnZW5GZWF0dXJlLmlzTGlzdFR5cGUoKSkgeyU+Ci0gICAgICAgIDwlaWYgKGdlbk1vZGVsLmlzVmlydHVhbERlbGVnYXRpb24oKSkgeyU+Ci0JCTwlPWdlbkZlYXR1cmUuZ2V0SW1wb3J0ZWRUeXBlKGdlbkNsYXNzKSU+IDwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+ID0gKDwlPWdlbkZlYXR1cmUuZ2V0SW1wb3J0ZWRUeXBlKGdlbkNsYXNzKSU+KWVWaXJ0dWFsR2V0KDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+PCU9cG9zaXRpdmVPZmZzZXRDb3JyZWN0aW9uJT4pOwotICAgICAgICA8JX0lPgotCQlpZiAoPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4gPT0gbnVsbCkKLQkJewotICAgICAgICA8JWlmIChnZW5Nb2RlbC5pc1ZpcnR1YWxEZWxlZ2F0aW9uKCkpIHslPgotCQkJZVZpcnR1YWxTZXQoPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT48JT1wb3NpdGl2ZU9mZnNldENvcnJlY3Rpb24lPiwgPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4gPSBuZXcgPCU9Z2VuQ2xhc3MuZ2V0TGlzdENvbnN0cnVjdG9yKGdlbkZlYXR1cmUpJT4pOwotICAgICAgICA8JX0gZWxzZSB7JT4KLQkJCTwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+ID0gbmV3IDwlPWdlbkNsYXNzLmdldExpc3RDb25zdHJ1Y3RvcihnZW5GZWF0dXJlKSU+OwotICAgICAgICA8JX0lPgotCQl9Ci0JCXJldHVybiA8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPjwlPWdlbkZlYXR1cmUuaXNNYXBUeXBlKCkgJiYgZ2VuRmVhdHVyZS5pc0VmZmVjdGl2ZVN1cHByZXNzRU1GVHlwZXMoKSA/ICIubWFwKCkiIDogIiIlPjsKLSAgICAgIDwlfSBlbHNlIGlmIChnZW5GZWF0dXJlLmlzQ29udGFpbmVyKCkpIHslPgotCQlpZiAoZUNvbnRhaW5lckZlYXR1cmVJRCAhPSA8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPjwlPXBvc2l0aXZlT2Zmc2V0Q29ycmVjdGlvbiU+KSByZXR1cm4gbnVsbDsKLQkJcmV0dXJuICg8JT1nZW5GZWF0dXJlLmdldEltcG9ydGVkVHlwZShnZW5DbGFzcyklPillQ29udGFpbmVyKCk7Ci0gICAgICA8JX0gZWxzZSB7JT4KLSAgICAgICAgPCVpZiAoZ2VuRmVhdHVyZS5pc1Jlc29sdmVQcm94aWVzKCkpIHslPgotICAgICAgICAgIDwlaWYgKGdlbk1vZGVsLmlzVmlydHVhbERlbGVnYXRpb24oKSkgeyU+Ci0JCTwlPWdlbkZlYXR1cmUuZ2V0SW1wb3J0ZWRUeXBlKGdlbkNsYXNzKSU+IDwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+ID0gKDwlPWdlbkZlYXR1cmUuZ2V0SW1wb3J0ZWRUeXBlKGdlbkNsYXNzKSU+KWVWaXJ0dWFsR2V0KDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+PCU9cG9zaXRpdmVPZmZzZXRDb3JyZWN0aW9uJT48JWlmIChnZW5GZWF0dXJlLmhhc0VEZWZhdWx0KCkpIHslPiwgPCU9Z2VuRmVhdHVyZS5nZXRFRGVmYXVsdCgpJT48JX0lPik7Ci0gICAgICAgICAgPCV9JT4KLQkJaWYgKDwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+ICE9IG51bGwgJiYgPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZUFzRU9iamVjdCgpJT4uZUlzUHJveHkoKSkKLQkJewotCQkJPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0IiklPiBvbGQ8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+ID0gKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdCIpJT4pPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT47Ci0JCQk8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPiA9IDwlPWdlbkZlYXR1cmUuZ2V0Tm9uRU9iamVjdEludGVybmFsVHlwZUNhc3QoZ2VuQ2xhc3MpJT5lUmVzb2x2ZVByb3h5KG9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4pOwotCQkJaWYgKDwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+ICE9IG9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4pCi0JCQl7Ci0gICAgICAgICAgPCVpZiAoZ2VuRmVhdHVyZS5pc0VmZmVjdGl2ZUNvbnRhaW5zKCkpIHslPgotCQkJCTwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdCIpJT4gbmV3PCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPiA9ICg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3QiKSU+KTwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+OwotICAgICAgICAgIDwlaWYgKCFnZW5GZWF0dXJlLmlzQmlkaXJlY3Rpb25hbCgpKSB7JT4KLQkJCQk8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluIiklPiBtc2dzID0gb2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPi5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT48JT1uZWdhdGl2ZU9mZnNldENvcnJlY3Rpb24lPiwgbnVsbCwgbnVsbCk7Ci0gICAgICAgICAgPCV9IGVsc2UgeyBHZW5GZWF0dXJlIHJldmVyc2VGZWF0dXJlID0gZ2VuRmVhdHVyZS5nZXRSZXZlcnNlKCk7IEdlbkNsYXNzIHRhcmdldENsYXNzID0gcmV2ZXJzZUZlYXR1cmUuZ2V0R2VuQ2xhc3MoKTsgU3RyaW5nIHJldmVyc2VPZmZzZXRDb3JyZWN0aW9uID0gdGFyZ2V0Q2xhc3MuaGFzT2Zmc2V0Q29ycmVjdGlvbigpID8gIiArICIgKyBnZW5DbGFzcy5nZXRPZmZzZXRDb3JyZWN0aW9uRmllbGQocmV2ZXJzZUZlYXR1cmUpIDogIiI7JT4KLQkJCQk8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluIiklPiBtc2dzID0gIG9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4uZUludmVyc2VSZW1vdmUodGhpcywgPCU9dGFyZ2V0Q2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKHJldmVyc2VGZWF0dXJlKSU+PCU9cmV2ZXJzZU9mZnNldENvcnJlY3Rpb24lPiwgPCU9dGFyZ2V0Q2xhc3MuZ2V0SW1wb3J0ZWRJbnRlcmZhY2VOYW1lKCklPi5jbGFzcywgbnVsbCk7Ci0gICAgICAgICAgPCV9JT4KLQkJCQlpZiAobmV3PCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPi5lSW50ZXJuYWxDb250YWluZXIoKSA9PSBudWxsKQotCQkJCXsKLSAgICAgICAgICA8JWlmICghZ2VuRmVhdHVyZS5pc0JpZGlyZWN0aW9uYWwoKSkgeyU+Ci0JCQkJCW1zZ3MgPSBuZXc8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+LmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSA8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPjwlPW5lZ2F0aXZlT2Zmc2V0Q29ycmVjdGlvbiU+LCBudWxsLCBtc2dzKTsKLSAgICAgICAgICA8JX0gZWxzZSB7IEdlbkZlYXR1cmUgcmV2ZXJzZUZlYXR1cmUgPSBnZW5GZWF0dXJlLmdldFJldmVyc2UoKTsgR2VuQ2xhc3MgdGFyZ2V0Q2xhc3MgPSByZXZlcnNlRmVhdHVyZS5nZXRHZW5DbGFzcygpOyBTdHJpbmcgcmV2ZXJzZU9mZnNldENvcnJlY3Rpb24gPSB0YXJnZXRDbGFzcy5oYXNPZmZzZXRDb3JyZWN0aW9uKCkgPyAiICsgIiArIGdlbkNsYXNzLmdldE9mZnNldENvcnJlY3Rpb25GaWVsZChyZXZlcnNlRmVhdHVyZSkgOiAiIjslPgotCQkJCQltc2dzID0gIG5ldzwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4uZUludmVyc2VBZGQodGhpcywgPCU9dGFyZ2V0Q2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKHJldmVyc2VGZWF0dXJlKSU+PCU9cmV2ZXJzZU9mZnNldENvcnJlY3Rpb24lPiwgPCU9dGFyZ2V0Q2xhc3MuZ2V0SW1wb3J0ZWRJbnRlcmZhY2VOYW1lKCklPi5jbGFzcywgbXNncyk7Ci0gICAgICAgICAgPCV9JT4KLQkJCQl9Ci0JCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotICAgICAgICAgIDwlfSBlbHNlIGlmIChnZW5Nb2RlbC5pc1ZpcnR1YWxEZWxlZ2F0aW9uKCkpIHslPgotCQkJCWVWaXJ0dWFsU2V0KDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+PCU9cG9zaXRpdmVPZmZzZXRDb3JyZWN0aW9uJT4sIDwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+KTsKLSAgICAgICAgICA8JX0lPgotICAgICAgICAgIDwlaWYgKCFnZW5Nb2RlbC5pc1N1cHByZXNzTm90aWZpY2F0aW9uKCkpIHslPgotCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCQkJZU5vdGlmeShuZXcgPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbCIpJT4odGhpcywgPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb24iKSU+LlJFU09MVkUsIDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+PCU9cG9zaXRpdmVPZmZzZXRDb3JyZWN0aW9uJT4sIG9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4sIDwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+KSk7Ci0gICAgICAgICAgPCV9JT4KLQkJCX0KLQkJfQotICAgICAgICA8JX0lPgotICAgICAgICA8JWlmICghZ2VuRmVhdHVyZS5pc1Jlc29sdmVQcm94aWVzKCkgJiYgZ2VuTW9kZWwuaXNWaXJ0dWFsRGVsZWdhdGlvbigpICYmICFnZW5GZWF0dXJlLmlzUHJpbWl0aXZlVHlwZSgpKSB7JT4KLQkJcmV0dXJuICg8JT1nZW5GZWF0dXJlLmdldEltcG9ydGVkVHlwZShnZW5DbGFzcyklPillVmlydHVhbEdldCg8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPjwlPXBvc2l0aXZlT2Zmc2V0Q29ycmVjdGlvbiU+PCVpZiAoZ2VuRmVhdHVyZS5oYXNFRGVmYXVsdCgpKSB7JT4sIDwlPWdlbkZlYXR1cmUuZ2V0RURlZmF1bHQoKSU+PCV9JT4pOwotICAgICAgICA8JX0gZWxzZSBpZiAoZ2VuQ2xhc3MuaXNGbGFnKGdlbkZlYXR1cmUpKSB7JT4KLQkJcmV0dXJuICg8JT1nZW5DbGFzcy5nZXRGbGFnc0ZpZWxkKGdlbkZlYXR1cmUpJT4gJiA8JT1nZW5GZWF0dXJlLmdldFVwcGVyTmFtZSgpJT5fRUZMQUcpICE9IDA7Ci0gICAgICAgIDwlfSBlbHNlIHslPgotCQlyZXR1cm4gPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT47Ci0gICAgICAgIDwlfSU+Ci0gICAgICA8JX0lPgotICAgIDwlfSBlbHNlIHsvL3ZvbGF0aWxlJT4KLSAgICAgIDwlaWYgKGdlbkZlYXR1cmUuaXNSZXNvbHZlUHJveGllcygpICYmICFnZW5GZWF0dXJlLmlzTGlzdFR5cGUoKSkgeyU+Ci0JCTwlPWdlbkZlYXR1cmUuZ2V0SW1wb3J0ZWRUeXBlKGdlbkNsYXNzKSU+IDwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+ID0gYmFzaWNHZXQ8JT1nZW5GZWF0dXJlLmdldEFjY2Vzc29yTmFtZSgpJT4oKTsKLQkJcmV0dXJuIDwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+ICE9IG51bGwgJiYgPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZUFzRU9iamVjdCgpJT4uZUlzUHJveHkoKSA/IDwlPWdlbkZlYXR1cmUuZ2V0Tm9uRU9iamVjdEludGVybmFsVHlwZUNhc3QoZ2VuQ2xhc3MpJT5lUmVzb2x2ZVByb3h5KCg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3QiKSU+KTwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+KSA6IDwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+OwotICAgICAgPCV9IGVsc2UgaWYgKGdlbkZlYXR1cmUuaGFzRGVsZWdhdGVGZWF0dXJlKCkpIHsgR2VuRmVhdHVyZSBkZWxlZ2F0ZUZlYXR1cmUgPSBnZW5GZWF0dXJlLmdldERlbGVnYXRlRmVhdHVyZSgpOyU+Ci0gICAgICAgIDwlaWYgKGdlbkZlYXR1cmUuaXNGZWF0dXJlTWFwVHlwZSgpKSB7JT4KLSAgICAgICAgPCVTdHJpbmcgZmVhdHVyZU1hcEVudHJ5VGVtcGxhdGVBcmd1bWVudCA9IGdlbk1vZGVsLmdldENvbXBsaWFuY2VMZXZlbCgpLmdldFZhbHVlKCkgPj0gR2VuSkRLTGV2ZWwuSkRLNTAgPyAiPCIgKyBnZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXAiKSArICIuRW50cnk+IiA6ICIiOyU+Ci0gICAgICAgICAgPCVpZiAoZGVsZWdhdGVGZWF0dXJlLmlzV3JhcHBlZEZlYXR1cmVNYXBUeXBlKCkpIHslPgotCQlyZXR1cm4gbmV3IDwlPWdlbkZlYXR1cmUuZ2V0SW1wb3J0ZWRFZmZlY3RpdmVGZWF0dXJlTWFwV3JhcHBlckNsYXNzKCklPigoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwIiklPi5JbnRlcm5hbCkoKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcCIpJT4uSW50ZXJuYWwuV3JhcHBlcilnZXQ8JT1kZWxlZ2F0ZUZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPigpKS5mZWF0dXJlTWFwKCkuPCU9ZmVhdHVyZU1hcEVudHJ5VGVtcGxhdGVBcmd1bWVudCU+bGlzdCg8JT1nZW5GZWF0dXJlLmdldFF1YWxpZmllZEZlYXR1cmVBY2Nlc3NvcigpJT4pKTsKLSAgICAgICAgICA8JX0gZWxzZSB7JT4KLQkJcmV0dXJuICg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXAiKSU+KWdldDwlPWRlbGVnYXRlRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+KCkuPCU9ZmVhdHVyZU1hcEVudHJ5VGVtcGxhdGVBcmd1bWVudCU+bGlzdCg8JT1nZW5GZWF0dXJlLmdldFF1YWxpZmllZEZlYXR1cmVBY2Nlc3NvcigpJT4pOwotICAgICAgICAgIDwlfSU+Ci0gICAgICAgIDwlfSBlbHNlIGlmIChnZW5GZWF0dXJlLmlzTGlzdFR5cGUoKSkgeyU+Ci0gICAgICAgICAgPCVpZiAoZGVsZWdhdGVGZWF0dXJlLmlzV3JhcHBlZEZlYXR1cmVNYXBUeXBlKCkpIHslPgotCQlyZXR1cm4gKCg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXAiKSU+LkludGVybmFsLldyYXBwZXIpZ2V0PCU9ZGVsZWdhdGVGZWF0dXJlLmdldEFjY2Vzc29yTmFtZSgpJT4oKSkuZmVhdHVyZU1hcCgpLmxpc3QoPCU9Z2VuRmVhdHVyZS5nZXRRdWFsaWZpZWRGZWF0dXJlQWNjZXNzb3IoKSU+KTsKLSAgICAgICAgICA8JX0gZWxzZSB7JT4KLQkJcmV0dXJuIGdldDwlPWRlbGVnYXRlRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+KCkubGlzdCg8JT1nZW5GZWF0dXJlLmdldFF1YWxpZmllZEZlYXR1cmVBY2Nlc3NvcigpJT4pOwotICAgICAgICAgIDwlfSU+Ci0gICAgICAgIDwlfSBlbHNlIHslPgotICAgICAgICAgIDwlaWYgKGRlbGVnYXRlRmVhdHVyZS5pc1dyYXBwZWRGZWF0dXJlTWFwVHlwZSgpKSB7JT4KLQkJcmV0dXJuIDwlaWYgKGdlbkZlYXR1cmUuaXNQcmltaXRpdmVUeXBlKCkpIHslPig8JX0lPjwlaWYgKGdlbkZlYXR1cmUuZ2V0VHlwZUdlbkRhdGFUeXBlKCkgPT0gbnVsbCB8fCAhZ2VuRmVhdHVyZS5nZXRUeXBlR2VuRGF0YVR5cGUoKS5pc09iamVjdFR5cGUoKSkgeyU+KDwlPWdlbkZlYXR1cmUuZ2V0T2JqZWN0VHlwZShnZW5DbGFzcyklPik8JX0lPigoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwIiklPi5JbnRlcm5hbC5XcmFwcGVyKWdldDwlPWRlbGVnYXRlRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+KCkpLmZlYXR1cmVNYXAoKS5nZXQoPCU9Z2VuRmVhdHVyZS5nZXRRdWFsaWZpZWRGZWF0dXJlQWNjZXNzb3IoKSU+LCB0cnVlKTwlaWYgKGdlbkZlYXR1cmUuaXNQcmltaXRpdmVUeXBlKCkpIHslPikuPCU9Z2VuRmVhdHVyZS5nZXRQcmltaXRpdmVWYWx1ZUZ1bmN0aW9uKCklPigpPCV9JT47Ci0gICAgICAgICAgPCV9IGVsc2UgeyU+Ci0JCXJldHVybiA8JWlmIChnZW5GZWF0dXJlLmlzUHJpbWl0aXZlVHlwZSgpKSB7JT4oPCV9JT48JWlmIChnZW5GZWF0dXJlLmdldFR5cGVHZW5EYXRhVHlwZSgpID09IG51bGwgfHwgIWdlbkZlYXR1cmUuZ2V0VHlwZUdlbkRhdGFUeXBlKCkuaXNPYmplY3RUeXBlKCkpIHslPig8JT1nZW5GZWF0dXJlLmdldE9iamVjdFR5cGUoZ2VuQ2xhc3MpJT4pPCV9JT5nZXQ8JT1kZWxlZ2F0ZUZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPigpLmdldCg8JT1nZW5GZWF0dXJlLmdldFF1YWxpZmllZEZlYXR1cmVBY2Nlc3NvcigpJT4sIHRydWUpPCVpZiAoZ2VuRmVhdHVyZS5pc1ByaW1pdGl2ZVR5cGUoKSkgeyU+KS48JT1nZW5GZWF0dXJlLmdldFByaW1pdGl2ZVZhbHVlRnVuY3Rpb24oKSU+KCk8JX0lPjsKLSAgICAgICAgICA8JX0lPgotICAgICAgICA8JX0lPgotICAgICAgPCV9IGVsc2UgeyU+Ci08JUAgaW5jbHVkZSBmaWxlPSJDbGFzcy9nZXRHZW5GZWF0dXJlLlRPRE8ub3ZlcnJpZGUuamF2YWpldGluYyIgZmFpbD0iYWx0ZXJuYXRpdmUiICU+Ci08JUAgc3RhcnQgJT4KLQkJLy8gVE9ETzogaW1wbGVtZW50IHRoaXMgbWV0aG9kIHRvIHJldHVybiB0aGUgJzwlPWdlbkZlYXR1cmUuZ2V0Rm9ybWF0dGVkTmFtZSgpJT4nIDwlPWdlbkZlYXR1cmUuZ2V0RmVhdHVyZUtpbmQoKSU+Ci0JCS8vIEVuc3VyZSB0aGF0IHlvdSByZW1vdmUgQGdlbmVyYXRlZCBvciBtYXJrIGl0IEBnZW5lcmF0ZWQgTk9UCi0gICAgICAgIDwlaWYgKGdlbkZlYXR1cmUuaXNMaXN0VHlwZSgpKSB7JT4KLQkJLy8gVGhlIGxpc3QgaXMgZXhwZWN0ZWQgdG8gaW1wbGVtZW50IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3QgYW5kIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmUuU2V0dGluZwotCQkvLyBzbyBpdCdzIGxpa2VseSB0aGF0IGFuIGFwcHJvcHJpYXRlIHN1YmNsYXNzIG9mIG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLjwlaWYgKGdlbkZlYXR1cmUuaXNNYXBUeXBlKCkpIHslPkVjb3JlRU1hcDwlfSBlbHNlIGlmIChnZW5GZWF0dXJlLmlzRmVhdHVyZU1hcFR5cGUoKSkgeyU+QmFzaWNGZWF0dXJlTWFwPCV9IGVsc2UgeyU+RWNvcmVFTGlzdDwlfSU+IHNob3VsZCBiZSB1c2VkLgotICAgICAgICA8JX0lPgotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLTwlQCBlbmQgJT48JS8vQ2xhc3MvZ2V0R2VuRmVhdHVyZS50b2RvLm92ZXJyaWRlLmphdmFqZXRpbmMlPgotICAgICAgPCV9JT4KLSAgICA8JX0lPgotCX0KLQotPCV9JT4KLTwlQCBlbmQgJT48JS8vQ2xhc3MvZ2V0R2VuRmVhdHVyZS5vdmVycmlkZS5qYXZhamV0aW5jJT4KLSAgPCV9JT4KLSAgPCVpZiAoaXNJbXBsZW1lbnRhdGlvbiAmJiAhZ2VuTW9kZWwuaXNSZWZsZWN0aXZlRGVsZWdhdGlvbigpICYmIGdlbkZlYXR1cmUuaXNCYXNpY0dldCgpKSB7JT4KLTwlQCBpbmNsdWRlIGZpbGU9IkNsYXNzL2Jhc2ljR2V0R2VuRmVhdHVyZS5vdmVycmlkZS5qYXZhamV0aW5jIiBmYWlsPSJhbHRlcm5hdGl2ZSIgJT4KLTwlQCBzdGFydCAlPgotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotPCVpZiAoZ2VuTW9kZWwuZ2V0Q29tcGxpYW5jZUxldmVsKCkuZ2V0VmFsdWUoKSA+PSBHZW5KREtMZXZlbC5KREs1MCkgeyAvL0NsYXNzL2Jhc2ljR2V0R2VuRmVhdHVyZS5hbm5vdGF0aW9ucy5pbnNlcnQuamF2YWpldGluYyU+Ci08JUAgaW5jbHVkZSBmaWxlPSJDbGFzcy9iYXNpY0dldEdlbkZlYXR1cmUuYW5ub3RhdGlvbnMuaW5zZXJ0LmphdmFqZXRpbmMiIGZhaWw9InNpbGVudCIgJT4KLTwlfSU+Ci0JcHVibGljIDwlPWdlbkZlYXR1cmUuZ2V0SW1wb3J0ZWRUeXBlKGdlbkNsYXNzKSU+IGJhc2ljR2V0PCU9Z2VuRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+KCkKLQl7Ci08JUAgaW5jbHVkZSBmaWxlPSJDbGFzcy9iYXNpY0dldEdlbkZlYXR1cmUucHJlLmluc2VydC5qYXZhamV0aW5jIiBmYWlsPSJzaWxlbnQiICU+Ci0gICAgPCVpZiAoZ2VuRmVhdHVyZS5pc0NvbnRhaW5lcigpKSB7JT4KLQkJaWYgKGVDb250YWluZXJGZWF0dXJlSUQgIT0gPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT48JT1wb3NpdGl2ZU9mZnNldENvcnJlY3Rpb24lPikgcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoPCU9Z2VuRmVhdHVyZS5nZXRJbXBvcnRlZFR5cGUoZ2VuQ2xhc3MpJT4pZUludGVybmFsQ29udGFpbmVyKCk7Ci0gICAgPCV9IGVsc2UgaWYgKCFnZW5GZWF0dXJlLmlzVm9sYXRpbGUoKSkgeyU+Ci0gICAgICA8JWlmIChnZW5Nb2RlbC5pc1ZpcnR1YWxEZWxlZ2F0aW9uKCkpIHslPgotCQlyZXR1cm4gKDwlPWdlbkZlYXR1cmUuZ2V0SW1wb3J0ZWRUeXBlKGdlbkNsYXNzKSU+KWVWaXJ0dWFsR2V0KDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+PCU9cG9zaXRpdmVPZmZzZXRDb3JyZWN0aW9uJT4pOwotICAgICAgPCV9IGVsc2UgeyU+Ci0JCXJldHVybiA8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPjsKLSAgICAgIDwlfSU+Ci0gICAgPCV9IGVsc2UgaWYgKGdlbkZlYXR1cmUuaGFzRGVsZWdhdGVGZWF0dXJlKCkpIHsgR2VuRmVhdHVyZSBkZWxlZ2F0ZUZlYXR1cmUgPSBnZW5GZWF0dXJlLmdldERlbGVnYXRlRmVhdHVyZSgpOyU+Ci0gICAgICA8JWlmIChkZWxlZ2F0ZUZlYXR1cmUuaXNXcmFwcGVkRmVhdHVyZU1hcFR5cGUoKSkgeyU+Ci0JCXJldHVybiAoPCU9Z2VuRmVhdHVyZS5nZXRJbXBvcnRlZFR5cGUoZ2VuQ2xhc3MpJT4pKCg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXAiKSU+LkludGVybmFsLldyYXBwZXIpZ2V0PCU9ZGVsZWdhdGVGZWF0dXJlLmdldEFjY2Vzc29yTmFtZSgpJT4oKSkuZmVhdHVyZU1hcCgpLmdldCg8JT1nZW5GZWF0dXJlLmdldFF1YWxpZmllZEZlYXR1cmVBY2Nlc3NvcigpJT4sIGZhbHNlKTsKLSAgICAgIDwlfSBlbHNlIHslPgotCQlyZXR1cm4gKDwlPWdlbkZlYXR1cmUuZ2V0SW1wb3J0ZWRUeXBlKGdlbkNsYXNzKSU+KWdldDwlPWRlbGVnYXRlRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+KCkuZ2V0KDwlPWdlbkZlYXR1cmUuZ2V0UXVhbGlmaWVkRmVhdHVyZUFjY2Vzc29yKCklPiwgZmFsc2UpOwotICAgICAgPCV9JT4KLSAgICA8JX0gZWxzZSB7JT4KLTwlQCBpbmNsdWRlIGZpbGU9IkNsYXNzL2Jhc2ljR2V0R2VuRmVhdHVyZS5UT0RPLm92ZXJyaWRlLmphdmFqZXRpbmMiIGZhaWw9ImFsdGVybmF0aXZlIiAlPgotPCVAIHN0YXJ0ICU+Ci0JCS8vIFRPRE86IGltcGxlbWVudCB0aGlzIG1ldGhvZCB0byByZXR1cm4gdGhlICc8JT1nZW5GZWF0dXJlLmdldEZvcm1hdHRlZE5hbWUoKSU+JyA8JT1nZW5GZWF0dXJlLmdldEZlYXR1cmVLaW5kKCklPgotCQkvLyAtPiBkbyBub3QgcGVyZm9ybSBwcm94eSByZXNvbHV0aW9uCi0JCS8vIEVuc3VyZSB0aGF0IHlvdSByZW1vdmUgQGdlbmVyYXRlZCBvciBtYXJrIGl0IEBnZW5lcmF0ZWQgTk9UCi0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotPCVAIGVuZCAlPjwlLy9DbGFzcy9iYXNpY0dldEdlbkZlYXR1cmUudG9kby5vdmVycmlkZS5qYXZhamV0aW5jJT4KLSAgICA8JX0lPgotCX0KLQotPCVAIGVuZCAlPjwlLy9DbGFzcy9iYXNpY0dldEdlbkZlYXR1cmUub3ZlcnJpZGUuamF2YWpldGluYyU+Ci0gIDwlfSU+Ci0gIDwlaWYgKGlzSW1wbGVtZW50YXRpb24gJiYgIWdlbk1vZGVsLmlzUmVmbGVjdGl2ZURlbGVnYXRpb24oKSAmJiBnZW5GZWF0dXJlLmlzQmFzaWNTZXQoKSkgeyU+Ci08JUAgaW5jbHVkZSBmaWxlPSJDbGFzcy9iYXNpY1NldEdlbkZlYXR1cmUub3ZlcnJpZGUuamF2YWpldGluYyIgZmFpbD0iYWx0ZXJuYXRpdmUiICU+Ci08JUAgc3RhcnQgJT4KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLTwlaWYgKGdlbk1vZGVsLmdldENvbXBsaWFuY2VMZXZlbCgpLmdldFZhbHVlKCkgPj0gR2VuSkRLTGV2ZWwuSkRLNTApIHsgLy9DbGFzcy9iYXNpY1NldEdlbkZlYXR1cmUuYW5ub3RhdGlvbnMuaW5zZXJ0LmphdmFqZXRpbmMlPgotPCVAIGluY2x1ZGUgZmlsZT0iQ2xhc3MvYmFzaWNTZXRHZW5GZWF0dXJlLmFubm90YXRpb25zLmluc2VydC5qYXZhamV0aW5jIiBmYWlsPSJzaWxlbnQiICU+Ci08JX0lPgotCXB1YmxpYyA8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluIiklPiBiYXNpY1NldDwlPWdlbkZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPig8JT1nZW5GZWF0dXJlLmdldEltcG9ydGVkSW50ZXJuYWxUeXBlKGdlbkNsYXNzKSU+IG5ldzwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4sIDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW4iKSU+IG1zZ3MpCi0JewotICAgIDwlaWYgKGdlbkZlYXR1cmUuaXNDb250YWluZXIoKSkgeyU+Ci08JUAgaW5jbHVkZSBmaWxlPSJDbGFzcy9iYXNpY1NldEdlbkZlYXR1cmUucHJlLmluc2VydC5qYXZhamV0aW5jIiBmYWlsPSJzaWxlbnQiICU+Ci0JCW1zZ3MgPSBlQmFzaWNTZXRDb250YWluZXIoKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdCIpJT4pbmV3PCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPiwgPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT48JT1wb3NpdGl2ZU9mZnNldENvcnJlY3Rpb24lPiwgbXNncyk7Ci08JUAgaW5jbHVkZSBmaWxlPSJDbGFzcy9iYXNpY1NldEdlbkZlYXR1cmUucG9zdC5pbnNlcnQuamF2YWpldGluYyIgZmFpbD0ic2lsZW50IiAlPgotCQlyZXR1cm4gbXNnczsKLSAgICA8JX0gZWxzZSBpZiAoIWdlbkZlYXR1cmUuaXNWb2xhdGlsZSgpKSB7JT4KLTwlQCBpbmNsdWRlIGZpbGU9IkNsYXNzL2Jhc2ljU2V0R2VuRmVhdHVyZS5wcmUuaW5zZXJ0LmphdmFqZXRpbmMiIGZhaWw9InNpbGVudCIgJT4KLSAgICAgIDwlaWYgKGdlbk1vZGVsLmlzVmlydHVhbERlbGVnYXRpb24oKSkgeyU+Ci0JCU9iamVjdCBvbGQ8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+ID0gZVZpcnR1YWxTZXQoPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT48JT1wb3NpdGl2ZU9mZnNldENvcnJlY3Rpb24lPiwgbmV3PCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPik7Ci0gICAgICA8JX0gZWxzZSB7JT4KLQkJPCU9Z2VuRmVhdHVyZS5nZXRJbXBvcnRlZFR5cGUoZ2VuQ2xhc3MpJT4gb2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPiA9IDwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+OwotCQk8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPiA9IG5ldzwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT47Ci0gICAgICA8JX0lPgotICAgICAgPCVpZiAoZ2VuRmVhdHVyZS5pc1Vuc2V0dGFibGUoKSkgeyU+Ci0gICAgICAgIDwlaWYgKGdlbk1vZGVsLmlzVmlydHVhbERlbGVnYXRpb24oKSkgeyU+Ci0JCWJvb2xlYW4gaXNTZXRDaGFuZ2UgPSBvbGQ8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+ID09IEVWSVJUVUFMX05PX1ZBTFVFOwotICAgICAgICA8JX0gZWxzZSBpZiAoZ2VuQ2xhc3MuaXNFU2V0RmxhZyhnZW5GZWF0dXJlKSkgeyU+Ci0JCWJvb2xlYW4gb2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPkVTZXQgPSAoPCU9Z2VuQ2xhc3MuZ2V0RVNldEZsYWdzRmllbGQoZ2VuRmVhdHVyZSklPiAmIDwlPWdlbkZlYXR1cmUuZ2V0VXBwZXJOYW1lKCklPl9FU0VURkxBRykgIT0gMDsKLQkJPCU9Z2VuQ2xhc3MuZ2V0RVNldEZsYWdzRmllbGQoZ2VuRmVhdHVyZSklPiB8PSA8JT1nZW5GZWF0dXJlLmdldFVwcGVyTmFtZSgpJT5fRVNFVEZMQUc7Ci0gICAgICAgIDwlfSBlbHNlIHslPgotCQlib29sZWFuIG9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT5FU2V0ID0gPCU9Z2VuRmVhdHVyZS5nZXRVbmNhcE5hbWUoKSU+RVNldDsKLQkJPCU9Z2VuRmVhdHVyZS5nZXRVbmNhcE5hbWUoKSU+RVNldCA9IHRydWU7Ci0gICAgICAgIDwlfSU+Ci0gICAgICA8JX0lPgotICAgICAgPCVpZiAoIWdlbk1vZGVsLmlzU3VwcHJlc3NOb3RpZmljYXRpb24oKSkgeyU+Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJewotICAgICAgICA8JWlmIChnZW5GZWF0dXJlLmlzVW5zZXR0YWJsZSgpKSB7JT4KLQkJCTwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGwiKSU+IG5vdGlmaWNhdGlvbiA9IG5ldyA8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsIiklPih0aGlzLCA8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbiIpJT4uU0VULCA8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPjwlPXBvc2l0aXZlT2Zmc2V0Q29ycmVjdGlvbiU+LCA8JWlmIChnZW5Nb2RlbC5pc1ZpcnR1YWxEZWxlZ2F0aW9uKCkpIHslPmlzU2V0Q2hhbmdlID8gbnVsbCA6IG9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT48JX0gZWxzZSB7JT5vbGQ8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+PCV9JT4sIG5ldzwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4sIDwlaWYgKGdlbk1vZGVsLmlzVmlydHVhbERlbGVnYXRpb24oKSkgeyU+aXNTZXRDaGFuZ2U8JX0gZWxzZSB7JT4hb2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPkVTZXQ8JX0lPik7Ci0gICAgICAgIDwlfSBlbHNlIHslPgotCQkJPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbCIpJT4gbm90aWZpY2F0aW9uID0gbmV3IDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGwiKSU+KHRoaXMsIDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uIiklPi5TRVQsIDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+PCU9cG9zaXRpdmVPZmZzZXRDb3JyZWN0aW9uJT4sIDwlaWYgKGdlbk1vZGVsLmlzVmlydHVhbERlbGVnYXRpb24oKSkgeyU+b2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPiA9PSBFVklSVFVBTF9OT19WQUxVRSA/IG51bGwgOiBvbGQ8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+PCV9IGVsc2UgeyU+b2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPjwlfSU+LCBuZXc8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+KTsKLSAgICAgICAgPCV9JT4KLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotICAgICAgPCV9JT4KLTwlQCBpbmNsdWRlIGZpbGU9IkNsYXNzL2Jhc2ljU2V0R2VuRmVhdHVyZS5wb3N0Lmluc2VydC5qYXZhamV0aW5jIiBmYWlsPSJzaWxlbnQiICU+Ci0JCXJldHVybiBtc2dzOwotICAgIDwlfSBlbHNlIGlmIChnZW5GZWF0dXJlLmhhc0RlbGVnYXRlRmVhdHVyZSgpKSB7IEdlbkZlYXR1cmUgZGVsZWdhdGVGZWF0dXJlID0gZ2VuRmVhdHVyZS5nZXREZWxlZ2F0ZUZlYXR1cmUoKTslPgotICAgICAgPCVpZiAoZGVsZWdhdGVGZWF0dXJlLmlzV3JhcHBlZEZlYXR1cmVNYXBUeXBlKCkpIHslPgotCQlyZXR1cm4gKCg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXAiKSU+LkludGVybmFsKSgoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwIiklPi5JbnRlcm5hbC5XcmFwcGVyKWdldDwlPWRlbGVnYXRlRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+KCkpLmZlYXR1cmVNYXAoKSkuYmFzaWNBZGQoPCU9Z2VuRmVhdHVyZS5nZXRRdWFsaWZpZWRGZWF0dXJlQWNjZXNzb3IoKSU+LCBuZXc8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+LCBtc2dzKTsKLSAgICAgIDwlfSBlbHNlIHslPgotCQlyZXR1cm4gKCg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXAiKSU+LkludGVybmFsKWdldDwlPWRlbGVnYXRlRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+KCkpLmJhc2ljQWRkKDwlPWdlbkZlYXR1cmUuZ2V0UXVhbGlmaWVkRmVhdHVyZUFjY2Vzc29yKCklPiwgbmV3PCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPiwgbXNncyk7Ci0gICAgICA8JX0lPgotICAgIDwlfSBlbHNlIHslPgotPCVAIGluY2x1ZGUgZmlsZT0iQ2xhc3MvYmFzaWNTZXRHZW5GZWF0dXJlLlRPRE8ub3ZlcnJpZGUuamF2YWpldGluYyIgZmFpbD0iYWx0ZXJuYXRpdmUiICU+Ci08JUAgc3RhcnQgJT4KLQkJLy8gVE9ETzogaW1wbGVtZW50IHRoaXMgbWV0aG9kIHRvIHNldCB0aGUgY29udGFpbmVkICc8JT1nZW5GZWF0dXJlLmdldEZvcm1hdHRlZE5hbWUoKSU+JyA8JT1nZW5GZWF0dXJlLmdldEZlYXR1cmVLaW5kKCklPgotCQkvLyAtPiB0aGlzIG1ldGhvZCBpcyBhdXRvbWF0aWNhbGx5IGludm9rZWQgdG8ga2VlcCB0aGUgY29udGFpbm1lbnQgcmVsYXRpb25zaGlwIGluIHN5bmNoCi0JCS8vIC0+IGRvIG5vdCBtb2RpZnkgb3RoZXIgZmVhdHVyZXMKLQkJLy8gLT4gcmV0dXJuIG1zZ3MsIGFmdGVyIGFkZGluZyBhbnkgZ2VuZXJhdGVkIE5vdGlmaWNhdGlvbiB0byBpdCAoaWYgaXQgaXMgbnVsbCwgYSBOb3RpZmljYXRpb25DaGFpbiBvYmplY3QgbXVzdCBiZSBjcmVhdGVkIGZpcnN0KQotCQkvLyBFbnN1cmUgdGhhdCB5b3UgcmVtb3ZlIEBnZW5lcmF0ZWQgb3IgbWFyayBpdCBAZ2VuZXJhdGVkIE5PVAotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLTwlQCBlbmQgJT48JS8vQ2xhc3MvYmFzaWNTZXRHZW5GZWF0dXJlLnRvZG8ub3ZlcnJpZGUuamF2YWpldGluYyU+Ci0gICAgPCV9JT4KLQl9Ci0KLTwlQCBlbmQgJT48JS8vQ2xhc3MvYmFzaWNTZXRHZW5GZWF0dXJlLm92ZXJyaWRlLmphdmFqZXRpbmMlPgotICA8JX0lPgotICA8JWlmIChnZW5GZWF0dXJlLmlzU2V0KCkgJiYgKGlzSW1wbGVtZW50YXRpb24gfHwgIWdlbkZlYXR1cmUuaXNTdXBwcmVzc2VkU2V0VmlzaWJpbGl0eSgpKSkgeyU+Ci08JUAgaW5jbHVkZSBmaWxlPSJDbGFzcy9zZXRHZW5GZWF0dXJlLm92ZXJyaWRlLmphdmFqZXRpbmMiIGZhaWw9ImFsdGVybmF0aXZlIiAlPgotPCVAIHN0YXJ0ICU+Ci08JWlmIChpc0ludGVyZmFjZSkgeyAlPgotPCVAIGluY2x1ZGUgZmlsZT0iQ2xhc3Mvc2V0R2VuRmVhdHVyZS5qYXZhZG9jLm92ZXJyaWRlLmphdmFqZXRpbmMiIGZhaWw9ImFsdGVybmF0aXZlIiAlPgotPCVAIHN0YXJ0ICU+Ci0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkSW50ZXJmYWNlTmFtZSgpJT4jPCU9Z2VuRmVhdHVyZS5nZXRHZXRBY2Nlc3NvcigpJT4gPGVtPjwlPWdlbkZlYXR1cmUuZ2V0Rm9ybWF0dGVkTmFtZSgpJT48L2VtPn0nIDwlPWdlbkZlYXR1cmUuZ2V0RmVhdHVyZUtpbmQoKSU+LgotPCVAIGluY2x1ZGUgZmlsZT0iQ2xhc3Mvc2V0R2VuRmVhdHVyZS5qYXZhZG9jLmluc2VydC5qYXZhamV0aW5jIiBmYWlsPSJzaWxlbnQiICU+Ci0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT48JT1nZW5GZWF0dXJlLmdldEZvcm1hdHRlZE5hbWUoKSU+PC9lbT4nIDwlPWdlbkZlYXR1cmUuZ2V0RmVhdHVyZUtpbmQoKSU+LgotICAgIDwlaWYgKGdlbkZlYXR1cmUuaXNFbnVtVHlwZSgpKSB7JT4KLQkgKiBAc2VlIDwlPWdlbkZlYXR1cmUuZ2V0VHlwZUdlbkVudW0oKS5nZXRRdWFsaWZpZWROYW1lKCklPgotICAgIDwlfSU+Ci0gICAgPCVpZiAoZ2VuRmVhdHVyZS5pc1Vuc2V0dGFibGUoKSkgeyU+Ci0gICAgICA8JWlmICghZ2VuRmVhdHVyZS5pc1N1cHByZXNzZWRJc1NldFZpc2liaWxpdHkoKSkgeyU+Ci0JICogQHNlZSAjaXNTZXQ8JT1nZW5GZWF0dXJlLmdldEFjY2Vzc29yTmFtZSgpJT4oKQotICAgICAgPCV9JT4KLSAgICAgIDwlaWYgKCFnZW5GZWF0dXJlLmlzU3VwcHJlc3NlZFVuc2V0VmlzaWJpbGl0eSgpKSB7JT4KLQkgKiBAc2VlICN1bnNldDwlPWdlbkZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPigpCi0gICAgICA8JX0lPgotICAgIDwlfSU+Ci0JICogQHNlZSAjPCU9Z2VuRmVhdHVyZS5nZXRHZXRBY2Nlc3NvcigpJT4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLTwlQCBlbmQgJT48JS8vQ2xhc3Mvc2V0R2VuRmVhdHVyZS5qYXZhZG9jLm92ZXJyaWRlLmphdmFqZXRpbmMlPgotPCV9IGVsc2UgeyU+Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi08JWlmIChnZW5Nb2RlbC5nZXRDb21wbGlhbmNlTGV2ZWwoKS5nZXRWYWx1ZSgpID49IEdlbkpES0xldmVsLkpESzUwKSB7IC8vQ2xhc3Mvc2V0R2VuRmVhdHVyZS5hbm5vdGF0aW9ucy5pbnNlcnQuamF2YWpldGluYyU+Ci08JUAgaW5jbHVkZSBmaWxlPSJDbGFzcy9zZXRHZW5GZWF0dXJlLmFubm90YXRpb25zLmluc2VydC5qYXZhamV0aW5jIiBmYWlsPSJzaWxlbnQiICU+Ci08JX0lPgotPCV9JT4KLTwlaWYgKCFpc0ltcGxlbWVudGF0aW9uKSB7ICU+Ci0Jdm9pZCBzZXQ8JT1nZW5GZWF0dXJlLmdldEFjY2Vzc29yTmFtZSgpJT4oPCU9Z2VuRmVhdHVyZS5nZXRJbXBvcnRlZFR5cGUoZ2VuQ2xhc3MpJT4gdmFsdWUpOwotCi08JX0gZWxzZSB7JT4KLQlwdWJsaWMgdm9pZCBzZXQ8JT1nZW5GZWF0dXJlLmdldEFjY2Vzc29yTmFtZSgpJT4oPCU9Z2VuRmVhdHVyZS5nZXRJbXBvcnRlZFR5cGUoZ2VuQ2xhc3MpJT4gbmV3PCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPikKLQl7Ci08JUAgaW5jbHVkZSBmaWxlPSJDbGFzcy9zZXRHZW5GZWF0dXJlLnByZS5pbnNlcnQuamF2YWpldGluYyIgZmFpbD0ic2lsZW50IiAlPgotICAgIDwlaWYgKGdlbk1vZGVsLmlzUmVmbGVjdGl2ZURlbGVnYXRpb24oKSkgeyU+Ci0JCWVTZXQoPCU9Z2VuRmVhdHVyZS5nZXRRdWFsaWZpZWRGZWF0dXJlQWNjZXNzb3IoKSU+LCA8JWlmIChnZW5GZWF0dXJlLmlzUHJpbWl0aXZlVHlwZSgpKSB7JT5uZXcgPCU9Z2VuRmVhdHVyZS5nZXRPYmplY3RUeXBlKGdlbkNsYXNzKSU+KDwlfSU+bmV3PCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPjwlaWYgKGdlbkZlYXR1cmUuaXNQcmltaXRpdmVUeXBlKCkpIHslPik8JX0lPik7Ci0gICAgPCV9IGVsc2UgaWYgKCFnZW5GZWF0dXJlLmlzVm9sYXRpbGUoKSkgeyU+Ci0gICAgICA8JWlmIChnZW5GZWF0dXJlLmlzQ29udGFpbmVyKCkpIHsgR2VuRmVhdHVyZSByZXZlcnNlRmVhdHVyZSA9IGdlbkZlYXR1cmUuZ2V0UmV2ZXJzZSgpOyBHZW5DbGFzcyB0YXJnZXRDbGFzcyA9IHJldmVyc2VGZWF0dXJlLmdldEdlbkNsYXNzKCk7IFN0cmluZyByZXZlcnNlT2Zmc2V0Q29ycmVjdGlvbiA9IHRhcmdldENsYXNzLmhhc09mZnNldENvcnJlY3Rpb24oKSA/ICIgKyAiICsgZ2VuQ2xhc3MuZ2V0T2Zmc2V0Q29ycmVjdGlvbkZpZWxkKHJldmVyc2VGZWF0dXJlKSA6ICIiOyU+Ci0JCWlmIChuZXc8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+ICE9IGVJbnRlcm5hbENvbnRhaW5lcigpIHx8IChlQ29udGFpbmVyRmVhdHVyZUlEICE9IDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+PCU9cG9zaXRpdmVPZmZzZXRDb3JyZWN0aW9uJT4gJiYgbmV3PCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPiAhPSBudWxsKSkKLQkJewotCQkJaWYgKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsIiklPi5pc0FuY2VzdG9yKHRoaXMsIDwlPWdlbkZlYXR1cmUuZ2V0RU9iamVjdENhc3QoKSU+bmV3PCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPikpCi0JCQkJdGhyb3cgbmV3IDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgiamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiIpJT4oIlJlY3Vyc2l2ZSBjb250YWlubWVudCBub3QgYWxsb3dlZCBmb3IgIiArIHRvU3RyaW5nKCkpOzwlPWdlbk1vZGVsLmdldE5vbk5MUygpJT4KLQkJCTwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW4iKSU+IG1zZ3MgPSBudWxsOwotCQkJaWYgKGVJbnRlcm5hbENvbnRhaW5lcigpICE9IG51bGwpCi0JCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQlpZiAobmV3PCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPiAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdCIpJT4pbmV3PCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPikuZUludmVyc2VBZGQodGhpcywgPCU9dGFyZ2V0Q2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKHJldmVyc2VGZWF0dXJlKSU+PCU9cmV2ZXJzZU9mZnNldENvcnJlY3Rpb24lPiwgPCU9dGFyZ2V0Q2xhc3MuZ2V0SW1wb3J0ZWRJbnRlcmZhY2VOYW1lKCklPi5jbGFzcywgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXQ8JT1nZW5GZWF0dXJlLmdldEFjY2Vzc29yTmFtZSgpJT4oPCU9Z2VuRmVhdHVyZS5nZXRJbnRlcm5hbFR5cGVDYXN0KCklPm5ldzwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4sIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0gICAgICAgIDwlaWYgKCFnZW5Nb2RlbC5pc1N1cHByZXNzTm90aWZpY2F0aW9uKCkpIHslPgotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGwiKSU+KHRoaXMsIDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uIiklPi5TRVQsIDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+PCU9cG9zaXRpdmVPZmZzZXRDb3JyZWN0aW9uJT4sIG5ldzwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4sIG5ldzwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4pKTsKLSAgICAgICAgPCV9JT4KLSAgICAgIDwlfSBlbHNlIGlmIChnZW5GZWF0dXJlLmlzQmlkaXJlY3Rpb25hbCgpIHx8IGdlbkZlYXR1cmUuaXNFZmZlY3RpdmVDb250YWlucygpKSB7JT4KLSAgICAgICAgPCVpZiAoZ2VuTW9kZWwuaXNWaXJ0dWFsRGVsZWdhdGlvbigpKSB7JT4KLQkJPCU9Z2VuRmVhdHVyZS5nZXRJbXBvcnRlZFR5cGUoZ2VuQ2xhc3MpJT4gPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4gPSAoPCU9Z2VuRmVhdHVyZS5nZXRJbXBvcnRlZFR5cGUoZ2VuQ2xhc3MpJT4pZVZpcnR1YWxHZXQoPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT48JT1wb3NpdGl2ZU9mZnNldENvcnJlY3Rpb24lPik7Ci0gICAgICAgIDwlfSU+Ci0JCWlmIChuZXc8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+ICE9IDwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+KQotCQl7Ci0JCQk8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluIiklPiBtc2dzID0gbnVsbDsKLQkJCWlmICg8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPiAhPSBudWxsKQotICAgICAgICA8JWlmICghZ2VuRmVhdHVyZS5pc0JpZGlyZWN0aW9uYWwoKSkgeyU+Ci0JCQkJbXNncyA9ICgoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0IiklPik8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPikuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+PCU9bmVnYXRpdmVPZmZzZXRDb3JyZWN0aW9uJT4sIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ldzwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4gIT0gbnVsbCkKLQkJCQltc2dzID0gKCg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3QiKSU+KW5ldzwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4pLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSA8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPjwlPW5lZ2F0aXZlT2Zmc2V0Q29ycmVjdGlvbiU+LCBudWxsLCBtc2dzKTsKLSAgICAgICAgPCV9IGVsc2UgeyBHZW5GZWF0dXJlIHJldmVyc2VGZWF0dXJlID0gZ2VuRmVhdHVyZS5nZXRSZXZlcnNlKCk7IEdlbkNsYXNzIHRhcmdldENsYXNzID0gcmV2ZXJzZUZlYXR1cmUuZ2V0R2VuQ2xhc3MoKTsgU3RyaW5nIHJldmVyc2VPZmZzZXRDb3JyZWN0aW9uID0gdGFyZ2V0Q2xhc3MuaGFzT2Zmc2V0Q29ycmVjdGlvbigpID8gIiArICIgKyBnZW5DbGFzcy5nZXRPZmZzZXRDb3JyZWN0aW9uRmllbGQocmV2ZXJzZUZlYXR1cmUpIDogIiI7JT4KLQkJCQltc2dzID0gKCg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3QiKSU+KTwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+KS5lSW52ZXJzZVJlbW92ZSh0aGlzLCA8JT10YXJnZXRDbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQocmV2ZXJzZUZlYXR1cmUpJT48JT1yZXZlcnNlT2Zmc2V0Q29ycmVjdGlvbiU+LCA8JT10YXJnZXRDbGFzcy5nZXRJbXBvcnRlZEludGVyZmFjZU5hbWUoKSU+LmNsYXNzLCBtc2dzKTsKLQkJCWlmIChuZXc8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+ICE9IG51bGwpCi0JCQkJbXNncyA9ICgoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0IiklPiluZXc8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+KS5lSW52ZXJzZUFkZCh0aGlzLCA8JT10YXJnZXRDbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQocmV2ZXJzZUZlYXR1cmUpJT48JT1yZXZlcnNlT2Zmc2V0Q29ycmVjdGlvbiU+LCA8JT10YXJnZXRDbGFzcy5nZXRJbXBvcnRlZEludGVyZmFjZU5hbWUoKSU+LmNsYXNzLCBtc2dzKTsKLSAgICAgICAgPCV9JT4KLQkJCW1zZ3MgPSBiYXNpY1NldDwlPWdlbkZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPig8JT1nZW5GZWF0dXJlLmdldEludGVybmFsVHlwZUNhc3QoKSU+bmV3PCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPiwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLSAgICAgICAgPCVpZiAoZ2VuRmVhdHVyZS5pc1Vuc2V0dGFibGUoKSkgeyU+Ci0JCWVsc2UKLQkJewotICAgICAgICAgIDwlaWYgKGdlbk1vZGVsLmlzVmlydHVhbERlbGVnYXRpb24oKSkgeyU+Ci0JCQlib29sZWFuIG9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT5FU2V0ID0gZVZpcnR1YWxJc1NldCg8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPjwlPXBvc2l0aXZlT2Zmc2V0Q29ycmVjdGlvbiU+KTsKLSAgICAgICAgICA8JX0gZWxzZSBpZiAoZ2VuQ2xhc3MuaXNFU2V0RmxhZyhnZW5GZWF0dXJlKSkgeyU+Ci0gICAgICAgICAgICA8JWlmICghZ2VuTW9kZWwuaXNTdXBwcmVzc05vdGlmaWNhdGlvbigpKSB7JT4KLQkJCWJvb2xlYW4gb2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPkVTZXQgPSAoPCU9Z2VuQ2xhc3MuZ2V0RVNldEZsYWdzRmllbGQoZ2VuRmVhdHVyZSklPiAmIDwlPWdlbkZlYXR1cmUuZ2V0VXBwZXJOYW1lKCklPl9FU0VURkxBRykgIT0gMDsKLSAgICAgICAgICAgIDwlfSU+Ci0JCQk8JT1nZW5DbGFzcy5nZXRFU2V0RmxhZ3NGaWVsZChnZW5GZWF0dXJlKSU+IHw9IDwlPWdlbkZlYXR1cmUuZ2V0VXBwZXJOYW1lKCklPl9FU0VURkxBRzsKLSAgICAgICAgICA8JX0gZWxzZSB7JT4KLSAgICAgICAgICAgIDwlaWYgKCFnZW5Nb2RlbC5pc1N1cHByZXNzTm90aWZpY2F0aW9uKCkpIHslPgotCQkJYm9vbGVhbiBvbGQ8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+RVNldCA9IDwlPWdlbkZlYXR1cmUuZ2V0VW5jYXBOYW1lKCklPkVTZXQ7Ci0gICAgICAgICAgICA8JX0lPgotCQkJPCU9Z2VuRmVhdHVyZS5nZXRVbmNhcE5hbWUoKSU+RVNldCA9IHRydWU7Ci0gICAgICAgICAgPCV9JT4KLSAgICAgICAgICA8JWlmICghZ2VuTW9kZWwuaXNTdXBwcmVzc05vdGlmaWNhdGlvbigpKSB7JT4KLQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCQllTm90aWZ5KG5ldyA8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsIiklPih0aGlzLCA8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbiIpJT4uU0VULCA8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPjwlPXBvc2l0aXZlT2Zmc2V0Q29ycmVjdGlvbiU+LCBuZXc8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+LCBuZXc8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+LCAhb2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPkVTZXQpKTsKLSAgICAgICAgICA8JX0lPgotCQl9Ci0gICAgICAgIDwlfSBlbHNlIHslPgotICAgICAgICAgIDwlaWYgKCFnZW5Nb2RlbC5pc1N1cHByZXNzTm90aWZpY2F0aW9uKCkpIHslPgotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGwiKSU+KHRoaXMsIDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uIiklPi5TRVQsIDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+PCU9cG9zaXRpdmVPZmZzZXRDb3JyZWN0aW9uJT4sIG5ldzwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4sIG5ldzwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4pKTsKLSAgICAgICAgICA8JX0lPgotICAgICAgICA8JX0lPgotICAgICAgPCV9IGVsc2UgeyU+Ci0gICAgICAgIDwlaWYgKGdlbkNsYXNzLmlzRmxhZyhnZW5GZWF0dXJlKSkgeyU+Ci0gICAgICAgICAgPCVpZiAoIWdlbk1vZGVsLmlzU3VwcHJlc3NOb3RpZmljYXRpb24oKSkgeyU+Ci0JCTwlPWdlbkZlYXR1cmUuZ2V0SW1wb3J0ZWRUeXBlKGdlbkNsYXNzKSU+IG9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4gPSAoPCU9Z2VuQ2xhc3MuZ2V0RmxhZ3NGaWVsZChnZW5GZWF0dXJlKSU+ICYgPCU9Z2VuRmVhdHVyZS5nZXRVcHBlck5hbWUoKSU+X0VGTEFHKSAhPSAwOwotICAgICAgICAgIDwlfSU+Ci0JCWlmIChuZXc8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+KSA8JT1nZW5DbGFzcy5nZXRGbGFnc0ZpZWxkKGdlbkZlYXR1cmUpJT4gfD0gPCU9Z2VuRmVhdHVyZS5nZXRVcHBlck5hbWUoKSU+X0VGTEFHOyBlbHNlIDwlPWdlbkNsYXNzLmdldEZsYWdzRmllbGQoZ2VuRmVhdHVyZSklPiAmPSB+PCU9Z2VuRmVhdHVyZS5nZXRVcHBlck5hbWUoKSU+X0VGTEFHOwotICAgICAgICA8JX0gZWxzZSB7JT4KLSAgICAgICAgICA8JWlmICghZ2VuTW9kZWwuaXNWaXJ0dWFsRGVsZWdhdGlvbigpIHx8IGdlbkZlYXR1cmUuaXNQcmltaXRpdmVUeXBlKCkpIHslPgotICAgICAgICAgICAgPCVpZiAoIWdlbk1vZGVsLmlzU3VwcHJlc3NOb3RpZmljYXRpb24oKSkgeyU+Ci0JCTwlPWdlbkZlYXR1cmUuZ2V0SW1wb3J0ZWRUeXBlKGdlbkNsYXNzKSU+IG9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4gPSA8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPjsKLSAgICAgICAgICAgIDwlfSU+Ci0gICAgICAgICAgPCV9JT4KLSAgICAgICAgICA8JWlmIChnZW5GZWF0dXJlLmlzRW51bVR5cGUoKSkgeyU+Ci0gICAgICAgICAgICA8JWlmIChnZW5Nb2RlbC5pc1ZpcnR1YWxEZWxlZ2F0aW9uKCkpIHslPgotCQk8JT1nZW5GZWF0dXJlLmdldEltcG9ydGVkVHlwZShnZW5DbGFzcyklPiA8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPiA9IG5ldzwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4gPT0gbnVsbCA/IDwlPWdlbkZlYXR1cmUuZ2V0RURlZmF1bHQoKSU+IDogbmV3PCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPjsKLSAgICAgICAgICAgIDwlfSBlbHNlIHslPgotCQk8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPiA9IG5ldzwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4gPT0gbnVsbCA/IDwlPWdlbkZlYXR1cmUuZ2V0RURlZmF1bHQoKSU+IDogbmV3PCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPjsKLSAgICAgICAgICAgIDwlfSU+Ci0gICAgICAgICAgPCV9IGVsc2UgeyU+Ci0gICAgICAgICAgICA8JWlmIChnZW5Nb2RlbC5pc1ZpcnR1YWxEZWxlZ2F0aW9uKCkgJiYgIWdlbkZlYXR1cmUuaXNQcmltaXRpdmVUeXBlKCkpIHslPgotCQk8JT1nZW5GZWF0dXJlLmdldEltcG9ydGVkVHlwZShnZW5DbGFzcyklPiA8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPiA9IDwlPWdlbkZlYXR1cmUuZ2V0SW50ZXJuYWxUeXBlQ2FzdCgpJT5uZXc8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+OwotICAgICAgICAgICAgPCV9IGVsc2UgeyU+Ci0JCTwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+ID0gPCU9Z2VuRmVhdHVyZS5nZXRJbnRlcm5hbFR5cGVDYXN0KCklPm5ldzwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT47Ci0gICAgICAgICAgICA8JX0lPgotICAgICAgICAgIDwlfSU+Ci0gICAgICAgICAgPCVpZiAoZ2VuTW9kZWwuaXNWaXJ0dWFsRGVsZWdhdGlvbigpICYmICFnZW5GZWF0dXJlLmlzUHJpbWl0aXZlVHlwZSgpKSB7JT4KLQkJT2JqZWN0IG9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4gPSBlVmlydHVhbFNldCg8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPjwlPXBvc2l0aXZlT2Zmc2V0Q29ycmVjdGlvbiU+LCA8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPik7Ci0gICAgICAgICAgPCV9JT4KLSAgICAgICAgPCV9JT4KLSAgICAgICAgPCVpZiAoZ2VuRmVhdHVyZS5pc1Vuc2V0dGFibGUoKSkgeyU+Ci0gICAgICAgICAgPCVpZiAoZ2VuTW9kZWwuaXNWaXJ0dWFsRGVsZWdhdGlvbigpICYmICFnZW5GZWF0dXJlLmlzUHJpbWl0aXZlVHlwZSgpKSB7JT4KLQkJYm9vbGVhbiBpc1NldENoYW5nZSA9IG9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4gPT0gRVZJUlRVQUxfTk9fVkFMVUU7Ci0gICAgICAgICAgPCV9IGVsc2UgaWYgKGdlbkNsYXNzLmlzRVNldEZsYWcoZ2VuRmVhdHVyZSkpIHslPgotICAgICAgICAgICAgPCVpZiAoIWdlbk1vZGVsLmlzU3VwcHJlc3NOb3RpZmljYXRpb24oKSkgeyU+Ci0JCWJvb2xlYW4gb2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPkVTZXQgPSAoPCU9Z2VuQ2xhc3MuZ2V0RVNldEZsYWdzRmllbGQoZ2VuRmVhdHVyZSklPiAmIDwlPWdlbkZlYXR1cmUuZ2V0VXBwZXJOYW1lKCklPl9FU0VURkxBRykgIT0gMDsKLSAgICAgICAgICAgIDwlfSU+Ci0JCTwlPWdlbkNsYXNzLmdldEVTZXRGbGFnc0ZpZWxkKGdlbkZlYXR1cmUpJT4gfD0gPCU9Z2VuRmVhdHVyZS5nZXRVcHBlck5hbWUoKSU+X0VTRVRGTEFHOwotICAgICAgICAgIDwlfSBlbHNlIHslPgotICAgICAgICAgICAgPCVpZiAoIWdlbk1vZGVsLmlzU3VwcHJlc3NOb3RpZmljYXRpb24oKSkgeyU+Ci0JCWJvb2xlYW4gb2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPkVTZXQgPSA8JT1nZW5GZWF0dXJlLmdldFVuY2FwTmFtZSgpJT5FU2V0OwotICAgICAgICAgICAgPCV9JT4KLQkJPCU9Z2VuRmVhdHVyZS5nZXRVbmNhcE5hbWUoKSU+RVNldCA9IHRydWU7Ci0gICAgICAgICAgPCV9JT4KLSAgICAgICAgICA8JWlmICghZ2VuTW9kZWwuaXNTdXBwcmVzc05vdGlmaWNhdGlvbigpKSB7JT4KLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbCIpJT4odGhpcywgPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb24iKSU+LlNFVCwgPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT48JT1wb3NpdGl2ZU9mZnNldENvcnJlY3Rpb24lPiwgPCVpZiAoZ2VuTW9kZWwuaXNWaXJ0dWFsRGVsZWdhdGlvbigpICYmICFnZW5GZWF0dXJlLmlzUHJpbWl0aXZlVHlwZSgpKSB7JT5pc1NldENoYW5nZSA/IDwlPWdlbkZlYXR1cmUuZ2V0RURlZmF1bHQoKSU+IDogb2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPjwlfSBlbHNlIHslPm9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT48JX0lPiwgPCVpZiAoZ2VuQ2xhc3MuaXNGbGFnKGdlbkZlYXR1cmUpKSB7JT5uZXc8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+PCV9IGVsc2UgeyU+PCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT48JX0lPiwgPCVpZiAoZ2VuTW9kZWwuaXNWaXJ0dWFsRGVsZWdhdGlvbigpICYmICFnZW5GZWF0dXJlLmlzUHJpbWl0aXZlVHlwZSgpKSB7JT5pc1NldENoYW5nZTwlfSBlbHNlIHslPiFvbGQ8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+RVNldDwlfSU+KSk7Ci0gICAgICAgICAgPCV9JT4KLSAgICAgICAgPCV9IGVsc2UgeyU+Ci0gICAgICAgICAgPCVpZiAoIWdlbk1vZGVsLmlzU3VwcHJlc3NOb3RpZmljYXRpb24oKSkgeyU+Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGwiKSU+KHRoaXMsIDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uIiklPi5TRVQsIDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+PCU9cG9zaXRpdmVPZmZzZXRDb3JyZWN0aW9uJT4sIDwlaWYgKGdlbk1vZGVsLmlzVmlydHVhbERlbGVnYXRpb24oKSAmJiAhZ2VuRmVhdHVyZS5pc1ByaW1pdGl2ZVR5cGUoKSkgeyU+b2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPiA9PSBFVklSVFVBTF9OT19WQUxVRSA/IDwlPWdlbkZlYXR1cmUuZ2V0RURlZmF1bHQoKSU+IDogb2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPjwlfSBlbHNlIHslPm9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT48JX0lPiwgPCVpZiAoZ2VuQ2xhc3MuaXNGbGFnKGdlbkZlYXR1cmUpKSB7JT5uZXc8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+PCV9IGVsc2UgeyU+PCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT48JX0lPikpOwotICAgICAgICAgIDwlfSU+Ci0gICAgICAgIDwlfSU+Ci0gICAgICA8JX0lPgotPCVAIGluY2x1ZGUgZmlsZT0iQ2xhc3Mvc2V0R2VuRmVhdHVyZS5wb3N0Lmluc2VydC5qYXZhamV0aW5jIiBmYWlsPSJzaWxlbnQiICU+Ci0gICAgPCV9IGVsc2UgaWYgKGdlbkZlYXR1cmUuaGFzRGVsZWdhdGVGZWF0dXJlKCkpIHsgR2VuRmVhdHVyZSBkZWxlZ2F0ZUZlYXR1cmUgPSBnZW5GZWF0dXJlLmdldERlbGVnYXRlRmVhdHVyZSgpOyU+Ci0gICAgICA8JWlmIChkZWxlZ2F0ZUZlYXR1cmUuaXNXcmFwcGVkRmVhdHVyZU1hcFR5cGUoKSkgeyU+Ci0JCSgoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwIiklPi5JbnRlcm5hbCkoKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcCIpJT4uSW50ZXJuYWwuV3JhcHBlcilnZXQ8JT1kZWxlZ2F0ZUZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPigpKS5mZWF0dXJlTWFwKCkpLnNldCg8JT1nZW5GZWF0dXJlLmdldFF1YWxpZmllZEZlYXR1cmVBY2Nlc3NvcigpJT4sIDwlaWYgKGdlbkZlYXR1cmUuaXNQcmltaXRpdmVUeXBlKCkpIHslPm5ldyA8JT1nZW5GZWF0dXJlLmdldE9iamVjdFR5cGUoZ2VuQ2xhc3MpJT4oPCV9JT5uZXc8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+PCVpZiAoZ2VuRmVhdHVyZS5pc1ByaW1pdGl2ZVR5cGUoKSkgeyU+KTwlfSU+KTsKLSAgICAgIDwlfSBlbHNlIHslPgotCQkoKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcCIpJT4uSW50ZXJuYWwpZ2V0PCU9ZGVsZWdhdGVGZWF0dXJlLmdldEFjY2Vzc29yTmFtZSgpJT4oKSkuc2V0KDwlPWdlbkZlYXR1cmUuZ2V0UXVhbGlmaWVkRmVhdHVyZUFjY2Vzc29yKCklPiwgPCVpZiAoZ2VuRmVhdHVyZS5pc1ByaW1pdGl2ZVR5cGUoKSkgeyU+bmV3IDwlPWdlbkZlYXR1cmUuZ2V0T2JqZWN0VHlwZShnZW5DbGFzcyklPig8JX0lPm5ldzwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT48JWlmIChnZW5GZWF0dXJlLmlzUHJpbWl0aXZlVHlwZSgpKSB7JT4pPCV9JT4pOwotICAgICAgPCV9JT4KLSAgICA8JX0gZWxzZSB7JT4KLTwlQCBpbmNsdWRlIGZpbGU9IkNsYXNzL3NldEdlbkZlYXR1cmUuVE9ETy5vdmVycmlkZS5qYXZhamV0aW5jIiBmYWlsPSJhbHRlcm5hdGl2ZSIgJT4KLTwlQCBzdGFydCAlPgotCQkvLyBUT0RPOiBpbXBsZW1lbnQgdGhpcyBtZXRob2QgdG8gc2V0IHRoZSAnPCU9Z2VuRmVhdHVyZS5nZXRGb3JtYXR0ZWROYW1lKCklPicgPCU9Z2VuRmVhdHVyZS5nZXRGZWF0dXJlS2luZCgpJT4KLQkJLy8gRW5zdXJlIHRoYXQgeW91IHJlbW92ZSBAZ2VuZXJhdGVkIG9yIG1hcmsgaXQgQGdlbmVyYXRlZCBOT1QKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci08JUAgZW5kICU+PCUvL0NsYXNzL3NldEdlbkZlYXR1cmUudG9kby5vdmVycmlkZS5qYXZhamV0aW5jJT4KLSAgICA8JX0lPgotCX0KLQotPCV9JT4KLTwlQCBlbmQgJT48JS8vQ2xhc3Mvc2V0R2VuRmVhdHVyZS5vdmVycmlkZS5qYXZhamV0aW5jJT4KLSAgPCV9JT4KLSAgPCVpZiAoaXNJbXBsZW1lbnRhdGlvbiAmJiAhZ2VuTW9kZWwuaXNSZWZsZWN0aXZlRGVsZWdhdGlvbigpICYmIGdlbkZlYXR1cmUuaXNCYXNpY1Vuc2V0KCkpIHslPgotPCVAIGluY2x1ZGUgZmlsZT0iQ2xhc3MvYmFzaWNVbnNldEdlbkZlYXR1cmUub3ZlcnJpZGUuamF2YWpldGluYyIgZmFpbD0iYWx0ZXJuYXRpdmUiICU+Ci08JUAgc3RhcnQgJT4KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLTwlaWYgKGdlbk1vZGVsLmdldENvbXBsaWFuY2VMZXZlbCgpLmdldFZhbHVlKCkgPj0gR2VuSkRLTGV2ZWwuSkRLNTApIHsgLy9DbGFzcy9iYXNpY1Vuc2V0R2VuRmVhdHVyZS5hbm5vdGF0aW9ucy5pbnNlcnQuamF2YWpldGluYyU+Ci08JUAgaW5jbHVkZSBmaWxlPSJDbGFzcy9iYXNpY1Vuc2V0R2VuRmVhdHVyZS5hbm5vdGF0aW9ucy5pbnNlcnQuamF2YWpldGluYyIgZmFpbD0ic2lsZW50IiAlPgotPCV9JT4KLQlwdWJsaWMgPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbiIpJT4gYmFzaWNVbnNldDwlPWdlbkZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPig8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluIiklPiBtc2dzKQotCXsKLSAgICA8JWlmICghZ2VuRmVhdHVyZS5pc1ZvbGF0aWxlKCkpIHslPgotICAgICAgPCVpZiAoZ2VuTW9kZWwuaXNWaXJ0dWFsRGVsZWdhdGlvbigpKSB7JT4KLQkJT2JqZWN0IG9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4gPSBlVmlydHVhbFVuc2V0KDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+PCU9cG9zaXRpdmVPZmZzZXRDb3JyZWN0aW9uJT4pOwotICAgICAgPCV9IGVsc2UgeyU+Ci0JCTwlPWdlbkZlYXR1cmUuZ2V0SW1wb3J0ZWRUeXBlKGdlbkNsYXNzKSU+IG9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4gPSA8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPjsKLQkJPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4gPSBudWxsOwotICAgICAgPCV9JT4KLSAgICAgIDwlaWYgKGdlbk1vZGVsLmlzVmlydHVhbERlbGVnYXRpb24oKSkgeyU+Ci0JCWJvb2xlYW4gaXNTZXRDaGFuZ2UgPSBvbGQ8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+ICE9IEVWSVJUVUFMX05PX1ZBTFVFOwotICAgICAgPCV9IGVsc2UgaWYgKGdlbkNsYXNzLmlzRVNldEZsYWcoZ2VuRmVhdHVyZSkpIHslPgotCQlib29sZWFuIG9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT5FU2V0ID0gKDwlPWdlbkNsYXNzLmdldEVTZXRGbGFnc0ZpZWxkKGdlbkZlYXR1cmUpJT4gJiA8JT1nZW5GZWF0dXJlLmdldFVwcGVyTmFtZSgpJT5fRVNFVEZMQUcpICE9IDA7Ci0JCTwlPWdlbkNsYXNzLmdldEVTZXRGbGFnc0ZpZWxkKGdlbkZlYXR1cmUpJT4gJj0gfjwlPWdlbkZlYXR1cmUuZ2V0VXBwZXJOYW1lKCklPl9FU0VURkxBRzsKLSAgICAgIDwlfSBlbHNlIHslPgotCQlib29sZWFuIG9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT5FU2V0ID0gPCU9Z2VuRmVhdHVyZS5nZXRVbmNhcE5hbWUoKSU+RVNldDsKLQkJPCU9Z2VuRmVhdHVyZS5nZXRVbmNhcE5hbWUoKSU+RVNldCA9IGZhbHNlOwotICAgICAgPCV9JT4KLSAgICAgICAgPCVpZiAoIWdlbk1vZGVsLmlzU3VwcHJlc3NOb3RpZmljYXRpb24oKSkgeyU+Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJewotCQkJPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbCIpJT4gbm90aWZpY2F0aW9uID0gbmV3IDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGwiKSU+KHRoaXMsIDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uIiklPi5VTlNFVCwgPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT48JT1wb3NpdGl2ZU9mZnNldENvcnJlY3Rpb24lPiwgPCVpZiAoZ2VuTW9kZWwuaXNWaXJ0dWFsRGVsZWdhdGlvbigpKSB7JT5pc1NldENoYW5nZSA/IG9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4gOiBudWxsPCV9IGVsc2UgeyU+b2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPjwlfSU+LCBudWxsLCA8JWlmIChnZW5Nb2RlbC5pc1ZpcnR1YWxEZWxlZ2F0aW9uKCkpIHslPmlzU2V0Q2hhbmdlPCV9IGVsc2UgeyU+b2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPkVTZXQ8JX0lPik7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0gICAgICAgIDwlfSU+Ci0gICAgPCV9IGVsc2UgeyU+Ci08JUAgaW5jbHVkZSBmaWxlPSJDbGFzcy9iYXNpY1Vuc2V0R2VuRmVhdHVyZS5UT0RPLm92ZXJyaWRlLmphdmFqZXRpbmMiIGZhaWw9ImFsdGVybmF0aXZlIiAlPgotPCVAIHN0YXJ0ICU+Ci0JCS8vIFRPRE86IGltcGxlbWVudCB0aGlzIG1ldGhvZCB0byB1bnNldCB0aGUgY29udGFpbmVkICc8JT1nZW5GZWF0dXJlLmdldEZvcm1hdHRlZE5hbWUoKSU+JyA8JT1nZW5GZWF0dXJlLmdldEZlYXR1cmVLaW5kKCklPgotCQkvLyAtPiB0aGlzIG1ldGhvZCBpcyBhdXRvbWF0aWNhbGx5IGludm9rZWQgdG8ga2VlcCB0aGUgY29udGFpbm1lbnQgcmVsYXRpb25zaGlwIGluIHN5bmNoCi0JCS8vIC0+IGRvIG5vdCBtb2RpZnkgb3RoZXIgZmVhdHVyZXMKLQkJLy8gLT4gcmV0dXJuIG1zZ3MsIGFmdGVyIGFkZGluZyBhbnkgZ2VuZXJhdGVkIE5vdGlmaWNhdGlvbiB0byBpdCAoaWYgaXQgaXMgbnVsbCwgYSBOb3RpZmljYXRpb25DaGFpbiBvYmplY3QgbXVzdCBiZSBjcmVhdGVkIGZpcnN0KQotCQkvLyBFbnN1cmUgdGhhdCB5b3UgcmVtb3ZlIEBnZW5lcmF0ZWQgb3IgbWFyayBpdCBAZ2VuZXJhdGVkIE5PVAotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLTwlQCBlbmQgJT48JS8vQ2xhc3MvYmFzaWNVbnNldEdlbkZlYXR1cmUudG9kby5vdmVycmlkZS5qYXZhamV0aW5jJT4KLSAgICA8JX0lPgotCX0KLQotPCVAIGVuZCAlPjwlLy9DbGFzcy5iYXNpY1Vuc2V0R2VuRmVhdHVyZS5vdmVycmlkZS5qYXZhamV0aW5jJT4KLSAgPCV9JT4KLSAgPCVpZiAoZ2VuRmVhdHVyZS5pc1Vuc2V0KCkgJiYgKGlzSW1wbGVtZW50YXRpb24gfHwgIWdlbkZlYXR1cmUuaXNTdXBwcmVzc2VkVW5zZXRWaXNpYmlsaXR5KCkpKSB7JT4KLTwlQCBpbmNsdWRlIGZpbGU9IkNsYXNzL3Vuc2V0R2VuRmVhdHVyZS5vdmVycmlkZS5qYXZhamV0aW5jIiBmYWlsPSJhbHRlcm5hdGl2ZSIgJT4KLTwlQCBzdGFydCAlPgotPCVpZiAoaXNJbnRlcmZhY2UpIHslPgotPCVAIGluY2x1ZGUgZmlsZT0iQ2xhc3MvdW5zZXRHZW5GZWF0dXJlLmphdmFkb2Mub3ZlcnJpZGUuamF2YWpldGluYyIgZmFpbD0iYWx0ZXJuYXRpdmUiICU+Ci08JUAgc3RhcnQgJT4KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEludGVyZmFjZU5hbWUoKSU+IzwlPWdlbkZlYXR1cmUuZ2V0R2V0QWNjZXNzb3IoKSU+IDxlbT48JT1nZW5GZWF0dXJlLmdldEZvcm1hdHRlZE5hbWUoKSU+PC9lbT59JyA8JT1nZW5GZWF0dXJlLmdldEZlYXR1cmVLaW5kKCklPi4KLTwlQCBpbmNsdWRlIGZpbGU9IkNsYXNzL3Vuc2V0R2VuRmVhdHVyZS5qYXZhZG9jLmluc2VydC5qYXZhamV0aW5jIiBmYWlsPSJzaWxlbnQiICU+Ci0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgPCVpZiAoIWdlbkZlYXR1cmUuaXNTdXBwcmVzc2VkSXNTZXRWaXNpYmlsaXR5KCkpIHslPgotCSAqIEBzZWUgI2lzU2V0PCU9Z2VuRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+KCkKLSAgPCV9JT4KLQkgKiBAc2VlICM8JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPigpCi0gIDwlaWYgKCFnZW5GZWF0dXJlLmlzTGlzdFR5cGUoKSAmJiAhZ2VuRmVhdHVyZS5pc1N1cHByZXNzZWRTZXRWaXNpYmlsaXR5KCkpIHslPgotCSAqIEBzZWUgI3NldDwlPWdlbkZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPig8JT1nZW5GZWF0dXJlLmdldFJhd0ltcG9ydGVkQm91bmRUeXBlKCklPikKLSAgPCV9JT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi08JUAgZW5kICU+PCUvL0NsYXNzL3Vuc2V0R2VuRmVhdHVyZS5qYXZhZG9jLm92ZXJyaWRlLmphdmFqZXRpbmMlPgotPCV9IGVsc2UgeyU+Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi08JWlmIChnZW5Nb2RlbC5nZXRDb21wbGlhbmNlTGV2ZWwoKS5nZXRWYWx1ZSgpID49IEdlbkpES0xldmVsLkpESzUwKSB7IC8vQ2xhc3MvdW5zZXRHZW5GZWF0dXJlLmFubm90YXRpb25zLmluc2VydC5qYXZhamV0aW5jJT4KLTwlQCBpbmNsdWRlIGZpbGU9IkNsYXNzL3Vuc2V0R2VuRmVhdHVyZS5hbm5vdGF0aW9ucy5pbnNlcnQuamF2YWpldGluYyIgZmFpbD0ic2lsZW50IiAlPgotPCV9JT4KLTwlfSU+Ci08JWlmICghaXNJbXBsZW1lbnRhdGlvbikgeyU+Ci0Jdm9pZCB1bnNldDwlPWdlbkZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPigpOwotCi08JX0gZWxzZSB7JT4KLQlwdWJsaWMgdm9pZCB1bnNldDwlPWdlbkZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPigpCi0JewotICAgIDwlaWYgKGdlbk1vZGVsLmlzUmVmbGVjdGl2ZURlbGVnYXRpb24oKSkgeyU+Ci0JCWVVbnNldCg8JT1nZW5GZWF0dXJlLmdldFF1YWxpZmllZEZlYXR1cmVBY2Nlc3NvcigpJT4pOwotICAgIDwlfSBlbHNlIGlmICghZ2VuRmVhdHVyZS5pc1ZvbGF0aWxlKCkpIHslPgotICAgICAgPCVpZiAoZ2VuRmVhdHVyZS5pc0xpc3RUeXBlKCkpIHslPgotICAgICAgICA8JWlmIChnZW5Nb2RlbC5pc1ZpcnR1YWxEZWxlZ2F0aW9uKCkpIHslPgotCQk8JT1nZW5GZWF0dXJlLmdldEltcG9ydGVkVHlwZShnZW5DbGFzcyklPiA8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPiA9ICg8JT1nZW5GZWF0dXJlLmdldEltcG9ydGVkVHlwZShnZW5DbGFzcyklPillVmlydHVhbEdldCg8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPjwlPXBvc2l0aXZlT2Zmc2V0Q29ycmVjdGlvbiU+KTsKLSAgICAgICAgPCV9JT4KLQkJaWYgKDwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+ICE9IG51bGwpICgoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0IiklPi5VbnNldHRhYmxlPCU9c2luZ2xlV2lsZGNhcmQlPik8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPikudW5zZXQoKTsKLSAgICAgIDwlfSBlbHNlIGlmIChnZW5GZWF0dXJlLmlzQmlkaXJlY3Rpb25hbCgpIHx8IGdlbkZlYXR1cmUuaXNFZmZlY3RpdmVDb250YWlucygpKSB7JT4KLSAgICAgICAgPCVpZiAoZ2VuTW9kZWwuaXNWaXJ0dWFsRGVsZWdhdGlvbigpKSB7JT4KLQkJPCU9Z2VuRmVhdHVyZS5nZXRJbXBvcnRlZFR5cGUoZ2VuQ2xhc3MpJT4gPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4gPSAoPCU9Z2VuRmVhdHVyZS5nZXRJbXBvcnRlZFR5cGUoZ2VuQ2xhc3MpJT4pZVZpcnR1YWxHZXQoPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT48JT1wb3NpdGl2ZU9mZnNldENvcnJlY3Rpb24lPik7Ci0gICAgICAgIDwlfSU+Ci0JCWlmICg8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPiAhPSBudWxsKQotCQl7Ci0JCQk8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluIiklPiBtc2dzID0gbnVsbDsKLSAgICAgICAgPCVpZiAoIWdlbkZlYXR1cmUuaXNCaWRpcmVjdGlvbmFsKCkpIHslPgotCQkJbXNncyA9ICgoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0IiklPik8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPikuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+PCU9bmVnYXRpdmVPZmZzZXRDb3JyZWN0aW9uJT4sIG51bGwsIG1zZ3MpOwotICAgICAgICA8JX0gZWxzZSB7IEdlbkZlYXR1cmUgcmV2ZXJzZUZlYXR1cmUgPSBnZW5GZWF0dXJlLmdldFJldmVyc2UoKTsgR2VuQ2xhc3MgdGFyZ2V0Q2xhc3MgPSByZXZlcnNlRmVhdHVyZS5nZXRHZW5DbGFzcygpOyBTdHJpbmcgcmV2ZXJzZU9mZnNldENvcnJlY3Rpb24gPSB0YXJnZXRDbGFzcy5oYXNPZmZzZXRDb3JyZWN0aW9uKCkgPyAiICsgIiArIGdlbkNsYXNzLmdldE9mZnNldENvcnJlY3Rpb25GaWVsZChyZXZlcnNlRmVhdHVyZSkgOiAiIjslPgotCQkJbXNncyA9ICgoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0IiklPik8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPikuZUludmVyc2VSZW1vdmUodGhpcywgPCU9dGFyZ2V0Q2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKHJldmVyc2VGZWF0dXJlKSU+PCU9cmV2ZXJzZU9mZnNldENvcnJlY3Rpb24lPiwgPCU9dGFyZ2V0Q2xhc3MuZ2V0SW1wb3J0ZWRJbnRlcmZhY2VOYW1lKCklPi5jbGFzcywgbXNncyk7Ci0gICAgICAgIDwlfSU+Ci0JCQltc2dzID0gYmFzaWNVbnNldDwlPWdlbkZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPihtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlCi0JCXsKLSAgICAgICAgPCVpZiAoZ2VuTW9kZWwuaXNWaXJ0dWFsRGVsZWdhdGlvbigpKSB7JT4KLQkJCWJvb2xlYW4gb2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPkVTZXQgPSBlVmlydHVhbElzU2V0KDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+PCU9cG9zaXRpdmVPZmZzZXRDb3JyZWN0aW9uJT4pOwotICAgICAgICA8JX0gZWxzZSBpZiAoZ2VuQ2xhc3MuaXNFU2V0RmxhZyhnZW5GZWF0dXJlKSkgeyU+Ci0gICAgICAgICAgPCVpZiAoIWdlbk1vZGVsLmlzU3VwcHJlc3NOb3RpZmljYXRpb24oKSkgeyU+Ci0JCQlib29sZWFuIG9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT5FU2V0ID0gKDwlPWdlbkNsYXNzLmdldEVTZXRGbGFnc0ZpZWxkKGdlbkZlYXR1cmUpJT4gJiA8JT1nZW5GZWF0dXJlLmdldFVwcGVyTmFtZSgpJT5fRVNFVEZMQUcpICE9IDA7Ci0gICAgICAgICAgPCV9JT4KLQkJCTwlPWdlbkNsYXNzLmdldEVTZXRGbGFnc0ZpZWxkKGdlbkZlYXR1cmUpJT4gJj0gfjwlPWdlbkZlYXR1cmUuZ2V0VXBwZXJOYW1lKCklPl9FU0VURkxBRzsKLSAgICAgICAgPCV9IGVsc2UgeyU+Ci0gICAgICAgICAgPCVpZiAoIWdlbk1vZGVsLmlzU3VwcHJlc3NOb3RpZmljYXRpb24oKSkgeyU+Ci0JCQlib29sZWFuIG9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT5FU2V0ID0gPCU9Z2VuRmVhdHVyZS5nZXRVbmNhcE5hbWUoKSU+RVNldDsKLSAgICAgICAgICA8JX0lPgotCQkJPCU9Z2VuRmVhdHVyZS5nZXRVbmNhcE5hbWUoKSU+RVNldCA9IGZhbHNlOwotICAgICAgICA8JX0lPgotICAgICAgICA8JWlmICghZ2VuTW9kZWwuaXNTdXBwcmVzc05vdGlmaWNhdGlvbigpKSB7JT4KLQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCQllTm90aWZ5KG5ldyA8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsIiklPih0aGlzLCA8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbiIpJT4uVU5TRVQsIDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+PCU9cG9zaXRpdmVPZmZzZXRDb3JyZWN0aW9uJT4sIG51bGwsIG51bGwsIG9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT5FU2V0KSk7Ci0gICAgICAgIDwlfSU+Ci0JCX0KLSAgICAgIDwlfSBlbHNlIHslPgotICAgICAgICA8JWlmIChnZW5DbGFzcy5pc0ZsYWcoZ2VuRmVhdHVyZSkpIHslPgotICAgICAgICAgIDwlaWYgKCFnZW5Nb2RlbC5pc1N1cHByZXNzTm90aWZpY2F0aW9uKCkpIHslPgotCQk8JT1nZW5GZWF0dXJlLmdldEltcG9ydGVkVHlwZShnZW5DbGFzcyklPiBvbGQ8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+ID0gKDwlPWdlbkNsYXNzLmdldEZsYWdzRmllbGQoZ2VuRmVhdHVyZSklPiAmIDwlPWdlbkZlYXR1cmUuZ2V0VXBwZXJOYW1lKCklPl9FRkxBRykgIT0gMDsKLSAgICAgICAgICA8JX0lPgotICAgICAgICA8JX0gZWxzZSBpZiAoZ2VuTW9kZWwuaXNWaXJ0dWFsRGVsZWdhdGlvbigpICYmICFnZW5GZWF0dXJlLmlzUHJpbWl0aXZlVHlwZSgpKSB7JT4KLQkJT2JqZWN0IG9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4gPSBlVmlydHVhbFVuc2V0KDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+PCU9cG9zaXRpdmVPZmZzZXRDb3JyZWN0aW9uJT4pOwotICAgICAgICA8JX0gZWxzZSB7JT4KLSAgICAgICAgICA8JWlmICghZ2VuTW9kZWwuaXNTdXBwcmVzc05vdGlmaWNhdGlvbigpKSB7JT4KLQkJPCU9Z2VuRmVhdHVyZS5nZXRJbXBvcnRlZFR5cGUoZ2VuQ2xhc3MpJT4gb2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPiA9IDwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+OwotICAgICAgICAgIDwlfSU+Ci0gICAgICAgIDwlfSU+Ci0gICAgICAgIDwlaWYgKGdlbk1vZGVsLmlzVmlydHVhbERlbGVnYXRpb24oKSAmJiAhZ2VuRmVhdHVyZS5pc1ByaW1pdGl2ZVR5cGUoKSkgeyU+Ci0JCWJvb2xlYW4gaXNTZXRDaGFuZ2UgPSBvbGQ8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+ICE9IEVWSVJUVUFMX05PX1ZBTFVFOwotICAgICAgICA8JX0gZWxzZSBpZiAoZ2VuQ2xhc3MuaXNFU2V0RmxhZyhnZW5GZWF0dXJlKSkgeyU+Ci0JCWJvb2xlYW4gb2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPkVTZXQgPSAoPCU9Z2VuQ2xhc3MuZ2V0RVNldEZsYWdzRmllbGQoZ2VuRmVhdHVyZSklPiAmIDwlPWdlbkZlYXR1cmUuZ2V0VXBwZXJOYW1lKCklPl9FU0VURkxBRykgIT0gMDsKLSAgICAgICAgPCV9IGVsc2UgeyU+Ci0gICAgICAgICAgPCVpZiAoIWdlbk1vZGVsLmlzU3VwcHJlc3NOb3RpZmljYXRpb24oKSkgeyU+Ci0JCWJvb2xlYW4gb2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPkVTZXQgPSA8JT1nZW5GZWF0dXJlLmdldFVuY2FwTmFtZSgpJT5FU2V0OwotICAgICAgICAgIDwlfSU+Ci0gICAgICAgIDwlfSU+Ci0gICAgICAgIDwlaWYgKGdlbkZlYXR1cmUuaXNSZWZlcmVuY2VUeXBlKCkpIHslPgotCQk8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPiA9IG51bGw7Ci0gICAgICAgICAgPCVpZiAoIWdlbk1vZGVsLmlzVmlydHVhbERlbGVnYXRpb24oKSkgeyU+Ci0gICAgICAgICAgICA8JWlmIChnZW5DbGFzcy5pc0VTZXRGbGFnKGdlbkZlYXR1cmUpKSB7JT4KLQkJPCU9Z2VuQ2xhc3MuZ2V0RVNldEZsYWdzRmllbGQoZ2VuRmVhdHVyZSklPiAmPSB+PCU9Z2VuRmVhdHVyZS5nZXRVcHBlck5hbWUoKSU+X0VTRVRGTEFHOwotICAgICAgICAgICAgPCV9IGVsc2UgeyU+Ci0JCTwlPWdlbkZlYXR1cmUuZ2V0VW5jYXBOYW1lKCklPkVTZXQgPSBmYWxzZTsKLSAgICAgICAgICAgIDwlfSU+Ci0gICAgICAgICAgPCV9JT4KLSAgICAgICAgICA8JWlmICghZ2VuTW9kZWwuaXNTdXBwcmVzc05vdGlmaWNhdGlvbigpKSB7JT4KLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbCIpJT4odGhpcywgPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb24iKSU+LlVOU0VULCA8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPjwlPXBvc2l0aXZlT2Zmc2V0Q29ycmVjdGlvbiU+LCA8JWlmIChnZW5Nb2RlbC5pc1ZpcnR1YWxEZWxlZ2F0aW9uKCkpIHslPmlzU2V0Q2hhbmdlID8gb2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPiA6IG51bGw8JX0gZWxzZSB7JT5vbGQ8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+PCV9JT4sIG51bGwsIDwlaWYgKGdlbk1vZGVsLmlzVmlydHVhbERlbGVnYXRpb24oKSkgeyU+aXNTZXRDaGFuZ2U8JX0gZWxzZSB7JT5vbGQ8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+RVNldDwlfSU+KSk7Ci0gICAgICAgICAgPCV9JT4KLSAgICAgICAgPCV9IGVsc2UgeyU+Ci0gICAgICAgICAgPCVpZiAoZ2VuQ2xhc3MuaXNGbGFnKGdlbkZlYXR1cmUpKSB7JT4KLQkJaWYgKDwlPWdlbkZlYXR1cmUuZ2V0RURlZmF1bHQoKSU+KSA8JT1nZW5DbGFzcy5nZXRGbGFnc0ZpZWxkKGdlbkZlYXR1cmUpJT4gfD0gPCU9Z2VuRmVhdHVyZS5nZXRVcHBlck5hbWUoKSU+X0VGTEFHOyBlbHNlIDwlPWdlbkNsYXNzLmdldEZsYWdzRmllbGQoZ2VuRmVhdHVyZSklPiAmPSB+PCU9Z2VuRmVhdHVyZS5nZXRVcHBlck5hbWUoKSU+X0VGTEFHOwotICAgICAgICAgIDwlfSBlbHNlIGlmICghZ2VuTW9kZWwuaXNWaXJ0dWFsRGVsZWdhdGlvbigpIHx8IGdlbkZlYXR1cmUuaXNQcmltaXRpdmVUeXBlKCkpIHslPgotCQk8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPiA9IDwlPWdlbkZlYXR1cmUuZ2V0RURlZmF1bHQoKSU+OwotICAgICAgICAgIDwlfSU+Ci0gICAgICAgICAgPCVpZiAoIWdlbk1vZGVsLmlzVmlydHVhbERlbGVnYXRpb24oKSB8fCBnZW5GZWF0dXJlLmlzUHJpbWl0aXZlVHlwZSgpKSB7JT4KLSAgICAgICAgICAgIDwlaWYgKGdlbkNsYXNzLmlzRVNldEZsYWcoZ2VuRmVhdHVyZSkpIHslPgotCQk8JT1nZW5DbGFzcy5nZXRFU2V0RmxhZ3NGaWVsZChnZW5GZWF0dXJlKSU+ICY9IH48JT1nZW5GZWF0dXJlLmdldFVwcGVyTmFtZSgpJT5fRVNFVEZMQUc7Ci0gICAgICAgICAgICA8JX0gZWxzZSB7JT4KLQkJPCU9Z2VuRmVhdHVyZS5nZXRVbmNhcE5hbWUoKSU+RVNldCA9IGZhbHNlOwotICAgICAgICAgICAgPCV9JT4KLSAgICAgICAgICA8JX0lPgotICAgICAgICAgIDwlaWYgKCFnZW5Nb2RlbC5pc1N1cHByZXNzTm90aWZpY2F0aW9uKCkpIHslPgotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyA8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsIiklPih0aGlzLCA8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbiIpJT4uVU5TRVQsIDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+PCU9cG9zaXRpdmVPZmZzZXRDb3JyZWN0aW9uJT4sIDwlaWYgKGdlbk1vZGVsLmlzVmlydHVhbERlbGVnYXRpb24oKSAmJiAhZ2VuRmVhdHVyZS5pc1ByaW1pdGl2ZVR5cGUoKSkgeyU+aXNTZXRDaGFuZ2UgPyBvbGQ8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+IDogPCU9Z2VuRmVhdHVyZS5nZXRFRGVmYXVsdCgpJT48JX0gZWxzZSB7JT5vbGQ8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+PCV9JT4sIDwlPWdlbkZlYXR1cmUuZ2V0RURlZmF1bHQoKSU+LCA8JWlmIChnZW5Nb2RlbC5pc1ZpcnR1YWxEZWxlZ2F0aW9uKCkgJiYgIWdlbkZlYXR1cmUuaXNQcmltaXRpdmVUeXBlKCkpIHslPmlzU2V0Q2hhbmdlPCV9IGVsc2UgeyU+b2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPkVTZXQ8JX0lPikpOwotICAgICAgICAgIDwlfSU+Ci0gICAgICAgIDwlfSU+Ci0gICAgICA8JX0lPgotICAgIDwlfSBlbHNlIGlmIChnZW5GZWF0dXJlLmhhc0RlbGVnYXRlRmVhdHVyZSgpKSB7IEdlbkZlYXR1cmUgZGVsZWdhdGVGZWF0dXJlID0gZ2VuRmVhdHVyZS5nZXREZWxlZ2F0ZUZlYXR1cmUoKTslPgotICAgICAgPCVpZiAoZGVsZWdhdGVGZWF0dXJlLmlzV3JhcHBlZEZlYXR1cmVNYXBUeXBlKCkpIHslPgotCQkoKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcCIpJT4uSW50ZXJuYWwpKCg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXAiKSU+LkludGVybmFsLldyYXBwZXIpZ2V0PCU9ZGVsZWdhdGVGZWF0dXJlLmdldEFjY2Vzc29yTmFtZSgpJT4oKSkuZmVhdHVyZU1hcCgpKS5jbGVhcig8JT1nZW5GZWF0dXJlLmdldFF1YWxpZmllZEZlYXR1cmVBY2Nlc3NvcigpJT4pOwotICAgICAgPCV9IGVsc2UgeyU+Ci0JCSgoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwIiklPi5JbnRlcm5hbClnZXQ8JT1kZWxlZ2F0ZUZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPigpKS5jbGVhcig8JT1nZW5GZWF0dXJlLmdldFF1YWxpZmllZEZlYXR1cmVBY2Nlc3NvcigpJT4pOwotICAgICAgPCV9JT4KLSAgICA8JX0gZWxzZSB7JT4KLTwlQCBpbmNsdWRlIGZpbGU9IkNsYXNzL3Vuc2V0R2VuRmVhdHVyZS5UT0RPLm92ZXJyaWRlLmphdmFqZXRpbmMiIGZhaWw9ImFsdGVybmF0aXZlIiAlPgotPCVAIHN0YXJ0ICU+Ci0JCS8vIFRPRE86IGltcGxlbWVudCB0aGlzIG1ldGhvZCB0byB1bnNldCB0aGUgJzwlPWdlbkZlYXR1cmUuZ2V0Rm9ybWF0dGVkTmFtZSgpJT4nIDwlPWdlbkZlYXR1cmUuZ2V0RmVhdHVyZUtpbmQoKSU+Ci0JCS8vIEVuc3VyZSB0aGF0IHlvdSByZW1vdmUgQGdlbmVyYXRlZCBvciBtYXJrIGl0IEBnZW5lcmF0ZWQgTk9UCi0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotPCVAIGVuZCAlPjwlLy9DbGFzcy91bnNldEdlbkZlYXR1cmUudG9kby5vdmVycmlkZS5qYXZhamV0aW5jJT4KLSAgICA8JX0lPgotCX0KLQotPCV9JT4KLTwlQCBlbmQgJT48JS8vQ2xhc3MvdW5zZXRHZW5GZWF0dXJlLm92ZXJyaWRlLmphdmFqZXRpbmMlPgotICA8JX0lPgotICA8JWlmIChnZW5GZWF0dXJlLmlzSXNTZXQoKSAmJiAoaXNJbXBsZW1lbnRhdGlvbiB8fCAhZ2VuRmVhdHVyZS5pc1N1cHByZXNzZWRJc1NldFZpc2liaWxpdHkoKSkpIHslPgotPCVAIGluY2x1ZGUgZmlsZT0iQ2xhc3MvaXNTZXRHZW5GZWF0dXJlLm92ZXJyaWRlLmphdmFqZXRpbmMiIGZhaWw9ImFsdGVybmF0aXZlIiAlPgotPCVAIHN0YXJ0ICU+Ci08JWlmIChpc0ludGVyZmFjZSkgeyU+Ci08JUAgaW5jbHVkZSBmaWxlPSJDbGFzcy9pc1NldEdlbkZlYXR1cmUuamF2YWRvYy5vdmVycmlkZS5qYXZhamV0aW5jIiBmYWlsPSJhbHRlcm5hdGl2ZSIgJT4KLTwlQCBzdGFydCAlPgotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkSW50ZXJmYWNlTmFtZSgpJT4jPCU9Z2VuRmVhdHVyZS5nZXRHZXRBY2Nlc3NvcigpJT4gPGVtPjwlPWdlbkZlYXR1cmUuZ2V0Rm9ybWF0dGVkTmFtZSgpJT48L2VtPn0nIDwlPWdlbkZlYXR1cmUuZ2V0RmVhdHVyZUtpbmQoKSU+IGlzIHNldC4KLTwlQCBpbmNsdWRlIGZpbGU9IkNsYXNzL2lzU2V0R2VuRmVhdHVyZS5qYXZhZG9jLmluc2VydC5qYXZhamV0aW5jIiBmYWlsPSJzaWxlbnQiICU+Ci0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjwlPWdlbkZlYXR1cmUuZ2V0Rm9ybWF0dGVkTmFtZSgpJT48L2VtPicgPCU9Z2VuRmVhdHVyZS5nZXRGZWF0dXJlS2luZCgpJT4gaXMgc2V0LgotICAgIDwlaWYgKGdlbkZlYXR1cmUuaXNDaGFuZ2VhYmxlKCkgJiYgIWdlbkZlYXR1cmUuaXNTdXBwcmVzc2VkVW5zZXRWaXNpYmlsaXR5KCkpIHslPgotCSAqIEBzZWUgI3Vuc2V0PCU9Z2VuRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+KCkKLSAgICA8JX0lPgotCSAqIEBzZWUgIzwlPWdlbkZlYXR1cmUuZ2V0R2V0QWNjZXNzb3IoKSU+KCkKLSAgICA8JWlmICghZ2VuRmVhdHVyZS5pc0xpc3RUeXBlKCkgJiYgZ2VuRmVhdHVyZS5pc0NoYW5nZWFibGUoKSAmJiAhZ2VuRmVhdHVyZS5pc1N1cHByZXNzZWRTZXRWaXNpYmlsaXR5KCkpIHslPgotCSAqIEBzZWUgI3NldDwlPWdlbkZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPig8JT1nZW5GZWF0dXJlLmdldFJhd0ltcG9ydGVkQm91bmRUeXBlKCklPikKLSAgICA8JX0lPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLTwlQCBlbmQgJT48JS8vQ2xhc3MvaXNTZXRHZW5GZWF0dXJlLmphdmFkb2Mub3ZlcnJpZGUuamF2YWpldGluYyU+Ci08JX0gZWxzZSB7JT4KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLTwlaWYgKGdlbk1vZGVsLmdldENvbXBsaWFuY2VMZXZlbCgpLmdldFZhbHVlKCkgPj0gR2VuSkRLTGV2ZWwuSkRLNTApIHsgLy9DbGFzcy9pc1NldEdlbkZlYXR1cmUuYW5ub3RhdGlvbnMuaW5zZXJ0LmphdmFqZXRpbmMlPgotPCVAIGluY2x1ZGUgZmlsZT0iQ2xhc3MvaXNTZXRHZW5GZWF0dXJlLmFubm90YXRpb25zLmluc2VydC5qYXZhamV0aW5jIiBmYWlsPSJzaWxlbnQiICU+Ci08JX0lPgotPCV9JT4KLTwlaWYgKCFpc0ltcGxlbWVudGF0aW9uKSB7JT4KLQlib29sZWFuIGlzU2V0PCU9Z2VuRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+KCk7Ci0KLTwlfSBlbHNlIHslPgotCXB1YmxpYyBib29sZWFuIGlzU2V0PCU9Z2VuRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+KCkKLQl7Ci0gICAgPCVpZiAoZ2VuTW9kZWwuaXNSZWZsZWN0aXZlRGVsZWdhdGlvbigpKSB7JT4KLQkJcmV0dXJuIGVJc1NldCg8JT1nZW5GZWF0dXJlLmdldFF1YWxpZmllZEZlYXR1cmVBY2Nlc3NvcigpJT4pOwotICAgIDwlfSBlbHNlIGlmICghZ2VuRmVhdHVyZS5pc1ZvbGF0aWxlKCkpIHslPgotICAgICAgPCVpZiAoZ2VuRmVhdHVyZS5pc0xpc3RUeXBlKCkpIHslPgotICAgICAgICA8JWlmIChnZW5Nb2RlbC5pc1ZpcnR1YWxEZWxlZ2F0aW9uKCkpIHslPgotCQk8JT1nZW5GZWF0dXJlLmdldEltcG9ydGVkVHlwZShnZW5DbGFzcyklPiA8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPiA9ICg8JT1nZW5GZWF0dXJlLmdldEltcG9ydGVkVHlwZShnZW5DbGFzcyklPillVmlydHVhbEdldCg8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPjwlPXBvc2l0aXZlT2Zmc2V0Q29ycmVjdGlvbiU+KTsKLSAgICAgICAgPCV9JT4KLQkJcmV0dXJuIDwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+ICE9IG51bGwgJiYgKCg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3QiKSU+LlVuc2V0dGFibGU8JT1zaW5nbGVXaWxkY2FyZCU+KTwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+KS5pc1NldCgpOwotICAgICAgPCV9IGVsc2UgeyU+Ci0gICAgICAgIDwlaWYgKGdlbk1vZGVsLmlzVmlydHVhbERlbGVnYXRpb24oKSAmJiAhZ2VuRmVhdHVyZS5pc1ByaW1pdGl2ZVR5cGUoKSkgeyU+Ci0JCXJldHVybiBlVmlydHVhbElzU2V0KDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+PCU9cG9zaXRpdmVPZmZzZXRDb3JyZWN0aW9uJT4pOwotICAgICAgICA8JX0gZWxzZSBpZiAoZ2VuQ2xhc3MuaXNFU2V0RmxhZyhnZW5GZWF0dXJlKSkgeyU+Ci0JCXJldHVybiAoPCU9Z2VuQ2xhc3MuZ2V0RVNldEZsYWdzRmllbGQoZ2VuRmVhdHVyZSklPiAmIDwlPWdlbkZlYXR1cmUuZ2V0VXBwZXJOYW1lKCklPl9FU0VURkxBRykgIT0gMDsKLSAgICAgICAgPCV9IGVsc2UgeyU+Ci0JCXJldHVybiA8JT1nZW5GZWF0dXJlLmdldFVuY2FwTmFtZSgpJT5FU2V0OwotICAgICAgICA8JX0lPgotICAgICAgPCV9JT4KLSAgICA8JX0gZWxzZSBpZiAoZ2VuRmVhdHVyZS5oYXNEZWxlZ2F0ZUZlYXR1cmUoKSkgeyBHZW5GZWF0dXJlIGRlbGVnYXRlRmVhdHVyZSA9IGdlbkZlYXR1cmUuZ2V0RGVsZWdhdGVGZWF0dXJlKCk7JT4KLSAgICAgIDwlaWYgKGRlbGVnYXRlRmVhdHVyZS5pc1dyYXBwZWRGZWF0dXJlTWFwVHlwZSgpKSB7JT4KLQkJcmV0dXJuICEoKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcCIpJT4uSW50ZXJuYWwpKCg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXAiKSU+LkludGVybmFsLldyYXBwZXIpZ2V0PCU9ZGVsZWdhdGVGZWF0dXJlLmdldEFjY2Vzc29yTmFtZSgpJT4oKSkuZmVhdHVyZU1hcCgpKS5pc0VtcHR5KDwlPWdlbkZlYXR1cmUuZ2V0UXVhbGlmaWVkRmVhdHVyZUFjY2Vzc29yKCklPik7Ci0gICAgICA8JX0gZWxzZSB7JT4KLQkJcmV0dXJuICEoKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcCIpJT4uSW50ZXJuYWwpZ2V0PCU9ZGVsZWdhdGVGZWF0dXJlLmdldEFjY2Vzc29yTmFtZSgpJT4oKSkuaXNFbXB0eSg8JT1nZW5GZWF0dXJlLmdldFF1YWxpZmllZEZlYXR1cmVBY2Nlc3NvcigpJT4pOwotICAgICAgPCV9JT4KLSAgICA8JX0gZWxzZSB7JT4KLTwlQCBpbmNsdWRlIGZpbGU9IkNsYXNzL2lzU2V0R2VuRmVhdHVyZS5UT0RPLm92ZXJyaWRlLmphdmFqZXRpbmMiIGZhaWw9ImFsdGVybmF0aXZlIiAlPgotPCVAIHN0YXJ0ICU+Ci0JCS8vIFRPRE86IGltcGxlbWVudCB0aGlzIG1ldGhvZCB0byByZXR1cm4gd2hldGhlciB0aGUgJzwlPWdlbkZlYXR1cmUuZ2V0Rm9ybWF0dGVkTmFtZSgpJT4nIDwlPWdlbkZlYXR1cmUuZ2V0RmVhdHVyZUtpbmQoKSU+IGlzIHNldAotCQkvLyBFbnN1cmUgdGhhdCB5b3UgcmVtb3ZlIEBnZW5lcmF0ZWQgb3IgbWFyayBpdCBAZ2VuZXJhdGVkIE5PVAotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLTwlQCBlbmQgJT48JS8vQ2xhc3MvaXNTZXRHZW5GZWF0dXJlLnRvZG8ub3ZlcnJpZGUuamF2YWpldGluYyU+Ci0gICAgPCV9JT4KLQl9Ci0KLTwlfSU+Ci08JUAgZW5kICU+PCUvL0NsYXNzL2lzU2V0R2VuRmVhdHVyZS5vdmVycmlkZS5qYXZhamV0aW5jJT4KLSAgPCV9JT4KLTwlQCBpbmNsdWRlIGZpbGU9IkNsYXNzL2dlbkZlYXR1cmUuaW5zZXJ0LmphdmFqZXRpbmMiIGZhaWw9InNpbGVudCIgJT4KLTwlQCBlbmQgJT48JS8vQ2xhc3MvZ2VuRmVhdHVyZS5vdmVycmlkZS5qYXZhamV0aW5jJT4KLTwlfS8vZm9yJT4KLTwlfX0ucnVuKCk7JT4KLTwlZm9yIChHZW5PcGVyYXRpb24gZ2VuT3BlcmF0aW9uIDogKGlzSW1wbGVtZW50YXRpb24gPyBnZW5DbGFzcy5nZXRJbXBsZW1lbnRlZEdlbk9wZXJhdGlvbnMoKSA6IGdlbkNsYXNzLmdldERlY2xhcmVkR2VuT3BlcmF0aW9ucygpKSkgeyU+Ci08JUAgaW5jbHVkZSBmaWxlPSJDbGFzcy9nZW5PcGVyYXRpb24ub3ZlcnJpZGUuamF2YWpldGluYyIgZmFpbD0iYWx0ZXJuYXRpdmUiICU+Ci08JUAgc3RhcnQgJT4KLTwlaWYgKGlzSW50ZXJmYWNlKSB7JT4KLTwlQCBpbmNsdWRlIGZpbGU9IkNsYXNzL2dlbk9wZXJhdGlvbi5qYXZhZG9jLm92ZXJyaWRlLmphdmFqZXRpbmMiIGZhaWw9ImFsdGVybmF0aXZlIiAlPgotPCVAIHN0YXJ0ICU+Ci0JLyoqCi08JUAgaW5jbHVkZSBmaWxlPSJDbGFzcy9nZW5PcGVyYXRpb24uamF2YWRvYy5pbnNlcnQuamF2YWpldGluYyIgZmFpbD0ic2lsZW50IiAlPgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gIDwlaWYgKGdlbk9wZXJhdGlvbi5oYXNEb2N1bWVudGF0aW9uKCkgfHwgZ2VuT3BlcmF0aW9uLmhhc1BhcmFtZXRlckRvY3VtZW50YXRpb24oKSkgeyU+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gICAgPCVpZiAoZ2VuT3BlcmF0aW9uLmhhc0RvY3VtZW50YXRpb24oKSkgeyU+Ci0JICogPCU9Z2VuT3BlcmF0aW9uLmdldERvY3VtZW50YXRpb24oZ2VuTW9kZWwuZ2V0SW5kZW50YXRpb24oc3RyaW5nQnVmZmVyKSklPgotICAgIDwlfSU+Ci0gICAgPCVmb3IgKEdlblBhcmFtZXRlciBnZW5QYXJhbWV0ZXIgOiBnZW5PcGVyYXRpb24uZ2V0R2VuUGFyYW1ldGVycygpKSB7JT4KLSAgICAgIDwlaWYgKGdlblBhcmFtZXRlci5oYXNEb2N1bWVudGF0aW9uKCkpIHsgU3RyaW5nIGRvY3VtZW50YXRpb24gPSBnZW5QYXJhbWV0ZXIuZ2V0RG9jdW1lbnRhdGlvbigiIik7JT4KLSAgICAgICAgPCVpZiAoZG9jdW1lbnRhdGlvbi5jb250YWlucygiXG4iKSB8fCBkb2N1bWVudGF0aW9uLmNvbnRhaW5zKCJcciIpKSB7JT4KLQkgKiBAcGFyYW0gPCU9Z2VuUGFyYW1ldGVyLmdldE5hbWUoKSU+Ci0JICogICA8JT1nZW5QYXJhbWV0ZXIuZ2V0RG9jdW1lbnRhdGlvbihnZW5Nb2RlbC5nZXRJbmRlbnRhdGlvbihzdHJpbmdCdWZmZXIpKSU+Ci0gICAgICAgIDwlfSBlbHNlIHslPgotCSAqIEBwYXJhbSA8JT1nZW5QYXJhbWV0ZXIuZ2V0TmFtZSgpJT4gPCU9Z2VuUGFyYW1ldGVyLmdldERvY3VtZW50YXRpb24oZ2VuTW9kZWwuZ2V0SW5kZW50YXRpb24oc3RyaW5nQnVmZmVyKSklPgotICAgICAgICA8JX0lPgotICAgICAgPCV9JT4KLSAgICA8JX0lPgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAgPCV9JT4KLSAgPCVpZiAoIWdlbk1vZGVsLmlzU3VwcHJlc3NFTUZNb2RlbFRhZ3MoKSkgeyBib29sZWFuIGZpcnN0ID0gdHJ1ZTsgZm9yIChTdHJpbmdUb2tlbml6ZXIgc3RyaW5nVG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcihnZW5PcGVyYXRpb24uZ2V0TW9kZWxJbmZvKCksICJcblxyIik7IHN0cmluZ1Rva2VuaXplci5oYXNNb3JlVG9rZW5zKCk7ICkgeyBTdHJpbmcgbW9kZWxJbmZvID0gc3RyaW5nVG9rZW5pemVyLm5leHRUb2tlbigpOyBpZiAoZmlyc3QpIHsgZmlyc3QgPSBmYWxzZTslPgotCSAqIEBtb2RlbCA8JT1tb2RlbEluZm8lPgotICA8JX0gZWxzZSB7JT4KLQkgKiAgICAgICAgPCU9bW9kZWxJbmZvJT4KLSAgPCV9fSBpZiAoZmlyc3QpIHslPgotCSAqIEBtb2RlbAotICA8JX19JT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi08JUAgZW5kICU+PCUvL0NsYXNzL2dlbk9wZXJhdGlvbi5qYXZhZG9jLm92ZXJyaWRlLmphdmFqZXRpbmMlPgotPCV9IGVsc2UgeyU+Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi08JWlmIChnZW5Nb2RlbC5nZXRDb21wbGlhbmNlTGV2ZWwoKS5nZXRWYWx1ZSgpID49IEdlbkpES0xldmVsLkpESzUwKSB7IC8vQ2xhc3MvZ2VuT3BlcmF0aW9uLmFubm90YXRpb25zLmluc2VydC5qYXZhamV0aW5jJT4KLTwlQCBpbmNsdWRlIGZpbGU9IkNsYXNzL2dlbk9wZXJhdGlvbi5hbm5vdGF0aW9ucy5pbnNlcnQuamF2YWpldGluYyIgZmFpbD0ic2lsZW50IiAlPgotPCV9JT4KLTwlfSU+Ci08JWlmICghaXNJbXBsZW1lbnRhdGlvbikgeyU+Ci0JPCU9Z2VuT3BlcmF0aW9uLmdldFR5cGVQYXJhbWV0ZXJzKGdlbkNsYXNzKSU+PCU9Z2VuT3BlcmF0aW9uLmdldEltcG9ydGVkVHlwZShnZW5DbGFzcyklPiA8JT1nZW5PcGVyYXRpb24uZ2V0TmFtZSgpJT4oPCU9Z2VuT3BlcmF0aW9uLmdldFBhcmFtZXRlcnMoZ2VuQ2xhc3MpJT4pPCU9Z2VuT3BlcmF0aW9uLmdldFRocm93cyhnZW5DbGFzcyklPjsKLQotPCV9IGVsc2UgeyU+Ci0JcHVibGljIDwlPWdlbk9wZXJhdGlvbi5nZXRUeXBlUGFyYW1ldGVycyhnZW5DbGFzcyklPjwlPWdlbk9wZXJhdGlvbi5nZXRJbXBvcnRlZFR5cGUoZ2VuQ2xhc3MpJT4gPCU9Z2VuT3BlcmF0aW9uLmdldE5hbWUoKSU+KDwlPWdlbk9wZXJhdGlvbi5nZXRQYXJhbWV0ZXJzKGdlbkNsYXNzKSU+KTwlPWdlbk9wZXJhdGlvbi5nZXRUaHJvd3MoZ2VuQ2xhc3MpJT4KLQl7Ci0gIDwlaWYgKGdlbk9wZXJhdGlvbi5oYXNCb2R5KCkpIHslPgotCQk8JT1nZW5PcGVyYXRpb24uZ2V0Qm9keShnZW5Nb2RlbC5nZXRJbmRlbnRhdGlvbihzdHJpbmdCdWZmZXIpKSU+Ci0gIDwlfSBlbHNlIGlmIChnZW5PcGVyYXRpb24uaXNJbnZhcmlhbnQoKSkge0dlbkNsYXNzIG9wQ2xhc3MgPSBnZW5PcGVyYXRpb24uZ2V0R2VuQ2xhc3MoKTsgU3RyaW5nIGRpYWdub3N0aWNzID0gZ2VuT3BlcmF0aW9uLmdldEdlblBhcmFtZXRlcnMoKS5nZXQoMCkuZ2V0TmFtZSgpOyBTdHJpbmcgY29udGV4dCA9IGdlbk9wZXJhdGlvbi5nZXRHZW5QYXJhbWV0ZXJzKCkuZ2V0KDEpLmdldE5hbWUoKTslPgotCQkvLyBUT0RPOiBpbXBsZW1lbnQgdGhpcyBtZXRob2QKLQkJLy8gLT4gc3BlY2lmeSB0aGUgY29uZGl0aW9uIHRoYXQgdmlvbGF0ZXMgdGhlIGludmFyaWFudAotCQkvLyAtPiB2ZXJpZnkgdGhlIGRldGFpbHMgb2YgdGhlIGRpYWdub3N0aWMsIGluY2x1ZGluZyBzZXZlcml0eSBhbmQgbWVzc2FnZQotCQkvLyBFbnN1cmUgdGhhdCB5b3UgcmVtb3ZlIEBnZW5lcmF0ZWQgb3IgbWFyayBpdCBAZ2VuZXJhdGVkIE5PVAotCQlpZiAoZmFsc2UpCi0JCXsKLQkJCWlmICg8JT1kaWFnbm9zdGljcyU+ICE9IG51bGwpCi0JCQl7Ci0JCQkJPCU9ZGlhZ25vc3RpY3MlPi5hZGQKLQkJCQkJKG5ldyA8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5CYXNpY0RpYWdub3N0aWMiKSU+Ci0JCQkJCQkoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRGlhZ25vc3RpYyIpJT4uRVJST1IsCi0JCQkJCQkgPCU9b3BDbGFzcy5nZXRHZW5QYWNrYWdlKCkuZ2V0SW1wb3J0ZWRWYWxpZGF0b3JDbGFzc05hbWUoKSU+LkRJQUdOT1NUSUNfU09VUkNFLAotCQkJCQkJIDwlPW9wQ2xhc3MuZ2V0R2VuUGFja2FnZSgpLmdldEltcG9ydGVkVmFsaWRhdG9yQ2xhc3NOYW1lKCklPi48JT1vcENsYXNzLmdldE9wZXJhdGlvbklEKGdlbk9wZXJhdGlvbiklPiwKLQkJCQkJCSA8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS5wbHVnaW4uRWNvcmVQbHVnaW4iKSU+LklOU1RBTkNFLmdldFN0cmluZygiX1VJX0dlbmVyaWNJbnZhcmlhbnRfZGlhZ25vc3RpYyIsIG5ldyBPYmplY3RbXSB7ICI8JT1nZW5PcGVyYXRpb24uZ2V0TmFtZSgpJT4iLCA8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RWYWxpZGF0b3IiKSU+LmdldE9iamVjdExhYmVsKHRoaXMsIDwlPWNvbnRleHQlPikgfSksPCU9Z2VuTW9kZWwuZ2V0Tm9uTkxTKCklPjwlPWdlbk1vZGVsLmdldE5vbk5MUygyKSU+Ci0JCQkJCQkgbmV3IE9iamVjdCBbXSB7IHRoaXMgfSkpOwotCQkJfQotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiB0cnVlOwotICA8JX0gZWxzZSB7JT4KLTwlQCBpbmNsdWRlIGZpbGU9IkNsYXNzL2ltcGxlbWVudGVkR2VuT3BlcmF0aW9uLlRPRE8ub3ZlcnJpZGUuamF2YWpldGluYyIgZmFpbD0iYWx0ZXJuYXRpdmUiICU+Ci08JUAgc3RhcnQgJT4KLQkJLy8gVE9ETzogaW1wbGVtZW50IHRoaXMgbWV0aG9kCi0JCS8vIEVuc3VyZSB0aGF0IHlvdSByZW1vdmUgQGdlbmVyYXRlZCBvciBtYXJrIGl0IEBnZW5lcmF0ZWQgTk9UCi0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotPCVAIGVuZCAlPjwlLy9DbGFzcy9pbXBsZW1lbnRlZEdlbk9wZXJhdGlvbi50b2RvLm92ZXJyaWRlLmphdmFqZXRpbmMlPgotICA8JX0lPgotCX0KLQotPCV9JT4KLTwlQCBpbmNsdWRlIGZpbGU9IkNsYXNzL2dlbk9wZXJhdGlvbi5pbnNlcnQuamF2YWpldGluYyIgZmFpbD0ic2lsZW50IiAlPgotPCVAIGVuZCAlPjwlLy9DbGFzcy9pbXBsZW1lbnRlZEdlbk9wZXJhdGlvbi5vdmVycmlkZS5qYXZhamV0aW5jJT4KLTwlfS8vZm9yJT4KLTwlaWYgKGlzSW1wbGVtZW50YXRpb24gJiYgIWdlbk1vZGVsLmlzUmVmbGVjdGl2ZURlbGVnYXRpb24oKSAmJiBnZW5DbGFzcy5pbXBsZW1lbnRzQW55KGdlbkNsYXNzLmdldEVJbnZlcnNlQWRkR2VuRmVhdHVyZXMoKSkpIHslPgotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICA8JWlmIChnZW5Nb2RlbC51c2VHZW5lcmljcygpKSB7JT4KLSAgICA8JWZvciAoR2VuRmVhdHVyZSBnZW5GZWF0dXJlIDogZ2VuQ2xhc3MuZ2V0RUludmVyc2VBZGRHZW5GZWF0dXJlcygpKSB7JT4KLSAgICAgIDwlaWYgKGdlbkZlYXR1cmUuaXNVbmNoZWNrZWRDYXN0KCkpIHslPgotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICAgICAgPCVicmVhazsgfSU+Ci0gICAgPCV9JT4KLSAgPCV9JT4KLSAgPCVpZiAoZ2VuTW9kZWwudXNlQ2xhc3NPdmVycmlkZUFubm90YXRpb24oKSkgeyU+Ci0JQE92ZXJyaWRlCi0gIDwlfSU+Ci0JcHVibGljIDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW4iKSU+IGVJbnZlcnNlQWRkKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdCIpJT4gb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW4iKSU+IG1zZ3MpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRDwlPW5lZ2F0aXZlT2Zmc2V0Q29ycmVjdGlvbiU+KQotCQl7Ci08JWZvciAoR2VuRmVhdHVyZSBnZW5GZWF0dXJlIDogZ2VuQ2xhc3MuZ2V0RUludmVyc2VBZGRHZW5GZWF0dXJlcygpKSB7JT4KLQkJCWNhc2UgPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT46Ci0gIDwlaWYgKGdlbkZlYXR1cmUuaXNMaXN0VHlwZSgpKSB7IFN0cmluZyBjYXN0ID0gIigiICArIGdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdCIpICsgKCFnZW5Nb2RlbC51c2VHZW5lcmljcygpID8gIikiIDogIjwiICsgZ2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0IikgKyAiPikoIiArIGdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdCIpICsgIjw/PikiKTslPgotICAgIDwlaWYgKGdlbkZlYXR1cmUuaXNNYXBUeXBlKCkgJiYgZ2VuRmVhdHVyZS5pc0VmZmVjdGl2ZVN1cHByZXNzRU1GVHlwZXMoKSkgeyU+Ci0JCQkJcmV0dXJuICgoPCU9Y2FzdCU+KDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVNYXAiKSU+LkludGVybmFsTWFwVmlldzwlPWdlbkZlYXR1cmUuZ2V0SW1wb3J0ZWRNYXBUZW1wbGF0ZUFyZ3VtZW50cyhnZW5DbGFzcyklPik8JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPigpKS5lTWFwKCkpLmJhc2ljQWRkKG90aGVyRW5kLCBtc2dzKTsKLSAgICA8JX0gZWxzZSB7JT4KLQkJCQlyZXR1cm4gKDwlPWNhc3QlPjwlPWdlbkZlYXR1cmUuZ2V0R2V0QWNjZXNzb3IoKSU+KCkpLmJhc2ljQWRkKG90aGVyRW5kLCBtc2dzKTsKLSAgICA8JX0lPgotICA8JX0gZWxzZSBpZiAoZ2VuRmVhdHVyZS5pc0NvbnRhaW5lcigpKSB7JT4KLQkJCQlpZiAoZUludGVybmFsQ29udGFpbmVyKCkgIT0gbnVsbCkKLQkJCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0gICAgPCVpZiAoZ2VuRmVhdHVyZS5pc0Jhc2ljU2V0KCkpIHslPgotCQkJCXJldHVybiBiYXNpY1NldDwlPWdlbkZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPigoPCU9Z2VuRmVhdHVyZS5nZXRJbXBvcnRlZFR5cGUoZ2VuQ2xhc3MpJT4pb3RoZXJFbmQsIG1zZ3MpOwotICAgIDwlfSBlbHNlIHslPgotCQkJCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIob3RoZXJFbmQsIDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+PCU9cG9zaXRpdmVPZmZzZXRDb3JyZWN0aW9uJT4sIG1zZ3MpOwotICAgIDwlfSU+Ci0gIDwlfSBlbHNlIHslPgotICAgIDwlaWYgKGdlbkNsYXNzLmdldEltcGxlbWVudGluZ0dlbk1vZGVsKGdlbkZlYXR1cmUpLmlzVmlydHVhbERlbGVnYXRpb24oKSkgeyU+Ci0JCQkJPCU9Z2VuRmVhdHVyZS5nZXRJbXBvcnRlZFR5cGUoZ2VuQ2xhc3MpJT4gPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4gPSAoPCU9Z2VuRmVhdHVyZS5nZXRJbXBvcnRlZFR5cGUoZ2VuQ2xhc3MpJT4pZVZpcnR1YWxHZXQoPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT48JT1wb3NpdGl2ZU9mZnNldENvcnJlY3Rpb24lPik7Ci0gICAgPCV9IGVsc2UgaWYgKGdlbkZlYXR1cmUuaXNWb2xhdGlsZSgpKSB7JT4KLQkJCQk8JT1nZW5GZWF0dXJlLmdldEltcG9ydGVkVHlwZShnZW5DbGFzcyklPiA8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPiA9IDwlaWYgKGdlbkZlYXR1cmUuaXNSZXNvbHZlUHJveGllcygpKSB7JT5iYXNpY0dldDwlPWdlbkZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPjwlfSBlbHNlIHslPjwlPWdlbkZlYXR1cmUuZ2V0R2V0QWNjZXNzb3IoKSU+PCV9JT4oKTsKLSAgICA8JX0lPgotCQkJCWlmICg8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPiAhPSBudWxsKQotICAgIDwlaWYgKGdlbkZlYXR1cmUuaXNFZmZlY3RpdmVDb250YWlucygpKSB7JT4KLQkJCQkJbXNncyA9ICgoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0IiklPik8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPikuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+PCU9bmVnYXRpdmVPZmZzZXRDb3JyZWN0aW9uJT4sIG51bGwsIG1zZ3MpOwotICAgIDwlfSBlbHNlIHsgR2VuRmVhdHVyZSByZXZlcnNlRmVhdHVyZSA9IGdlbkZlYXR1cmUuZ2V0UmV2ZXJzZSgpOyBHZW5DbGFzcyB0YXJnZXRDbGFzcyA9IHJldmVyc2VGZWF0dXJlLmdldEdlbkNsYXNzKCk7IFN0cmluZyByZXZlcnNlT2Zmc2V0Q29ycmVjdGlvbiA9IHRhcmdldENsYXNzLmhhc09mZnNldENvcnJlY3Rpb24oKSA/ICIgKyAiICsgZ2VuQ2xhc3MuZ2V0T2Zmc2V0Q29ycmVjdGlvbkZpZWxkKHJldmVyc2VGZWF0dXJlKSA6ICIiOyU+Ci0JCQkJCW1zZ3MgPSAoKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdCIpJT4pPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4pLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIDwlPXRhcmdldENsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChyZXZlcnNlRmVhdHVyZSklPjwlPXJldmVyc2VPZmZzZXRDb3JyZWN0aW9uJT4sIDwlPXRhcmdldENsYXNzLmdldEltcG9ydGVkSW50ZXJmYWNlTmFtZSgpJT4uY2xhc3MsIG1zZ3MpOwotICAgIDwlfSU+Ci0JCQkJcmV0dXJuIGJhc2ljU2V0PCU9Z2VuRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+KCg8JT1nZW5GZWF0dXJlLmdldEltcG9ydGVkVHlwZShnZW5DbGFzcyklPilvdGhlckVuZCwgbXNncyk7Ci0gIDwlfSU+Ci08JX0lPgotCQl9Ci08JWlmIChnZW5Nb2RlbC5pc01pbmltYWxSZWZsZWN0aXZlTWV0aG9kcygpKSB7JT4KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlQWRkKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotPCV9IGVsc2UgeyU+Ci0JCXJldHVybiBlRHluYW1pY0ludmVyc2VBZGQob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci08JX0lPgotCX0KLQotPCV9JT4KLTwlaWYgKGlzSW1wbGVtZW50YXRpb24gJiYgIWdlbk1vZGVsLmlzUmVmbGVjdGl2ZURlbGVnYXRpb24oKSAmJiBnZW5DbGFzcy5pbXBsZW1lbnRzQW55KGdlbkNsYXNzLmdldEVJbnZlcnNlUmVtb3ZlR2VuRmVhdHVyZXMoKSkpIHslPgotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICA8JWlmIChnZW5Nb2RlbC51c2VDbGFzc092ZXJyaWRlQW5ub3RhdGlvbigpKSB7JT4KLQlAT3ZlcnJpZGUKLSAgPCV9JT4KLQlwdWJsaWMgPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbiIpJT4gZUludmVyc2VSZW1vdmUoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0IiklPiBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbiIpJT4gbXNncykKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEPCU9bmVnYXRpdmVPZmZzZXRDb3JyZWN0aW9uJT4pCi0JCXsKLTwlZm9yIChHZW5GZWF0dXJlIGdlbkZlYXR1cmUgOiBnZW5DbGFzcy5nZXRFSW52ZXJzZVJlbW92ZUdlbkZlYXR1cmVzKCkpIHslPgotCQkJY2FzZSA8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPjoKLSAgPCVpZiAoZ2VuRmVhdHVyZS5pc0xpc3RUeXBlKCkpIHslPgotICAgIDwlaWYgKGdlbkZlYXR1cmUuaXNNYXBUeXBlKCkgJiYgZ2VuRmVhdHVyZS5pc0VmZmVjdGl2ZVN1cHByZXNzRU1GVHlwZXMoKSkgeyU+Ci0JCQkJcmV0dXJuICgoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0IiklPjwlPXNpbmdsZVdpbGRjYXJkJT4pKCg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTWFwIiklPi5JbnRlcm5hbE1hcFZpZXc8JT1nZW5GZWF0dXJlLmdldEltcG9ydGVkTWFwVGVtcGxhdGVBcmd1bWVudHMoZ2VuQ2xhc3MpJT4pPCU9Z2VuRmVhdHVyZS5nZXRHZXRBY2Nlc3NvcigpJT4oKSkuZU1hcCgpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0gICAgPCV9IGVsc2UgaWYgKGdlbkZlYXR1cmUuaXNXcmFwcGVkRmVhdHVyZU1hcFR5cGUoKSkgeyU+Ci0JCQkJcmV0dXJuICgoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0IiklPjwlPXNpbmdsZVdpbGRjYXJkJT4pKCg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXAiKSU+LkludGVybmFsLldyYXBwZXIpPCU9Z2VuRmVhdHVyZS5nZXRHZXRBY2Nlc3NvcigpJT4oKSkuZmVhdHVyZU1hcCgpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0gICAgPCV9IGVsc2UgeyU+Ci0JCQkJcmV0dXJuICgoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0IiklPjwlPXNpbmdsZVdpbGRjYXJkJT4pPCU9Z2VuRmVhdHVyZS5nZXRHZXRBY2Nlc3NvcigpJT4oKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotICAgIDwlfSU+Ci0gIDwlfSBlbHNlIGlmIChnZW5GZWF0dXJlLmlzQ29udGFpbmVyKCkgJiYgIWdlbkZlYXR1cmUuaXNCYXNpY1NldCgpKSB7JT4KLQkJCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+PCU9cG9zaXRpdmVPZmZzZXRDb3JyZWN0aW9uJT4sIG1zZ3MpOwotICA8JX0gZWxzZSBpZiAoZ2VuRmVhdHVyZS5pc1Vuc2V0dGFibGUoKSkgeyU+Ci0JCQkJcmV0dXJuIGJhc2ljVW5zZXQ8JT1nZW5GZWF0dXJlLmdldEFjY2Vzc29yTmFtZSgpJT4obXNncyk7Ci0gIDwlfSBlbHNlIHslPgotCQkJCXJldHVybiBiYXNpY1NldDwlPWdlbkZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPihudWxsLCBtc2dzKTsKLSAgPCV9JT4KLTwlfSU+Ci0JCX0KLTwlaWYgKGdlbk1vZGVsLmlzTWluaW1hbFJlZmxlY3RpdmVNZXRob2RzKCkpIHslPgotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci08JX0gZWxzZSB7JT4KLQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLTwlfSU+Ci0JfQotCi08JX0lPgotPCVpZiAoaXNJbXBsZW1lbnRhdGlvbiAmJiAhZ2VuTW9kZWwuaXNSZWZsZWN0aXZlRGVsZWdhdGlvbigpICYmIGdlbkNsYXNzLmltcGxlbWVudHNBbnkoZ2VuQ2xhc3MuZ2V0RUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lckdlbkZlYXR1cmVzKCkpKSB7JT4KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgPCVpZiAoZ2VuTW9kZWwudXNlQ2xhc3NPdmVycmlkZUFubm90YXRpb24oKSkgeyU+Ci0JQE92ZXJyaWRlCi0gIDwlfSU+Ci0JcHVibGljIDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW4iKSU+IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXJGZWF0dXJlKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW4iKSU+IG1zZ3MpCi0JewotCQlzd2l0Y2ggKGVDb250YWluZXJGZWF0dXJlSUQ8JT1uZWdhdGl2ZU9mZnNldENvcnJlY3Rpb24lPikKLQkJewotPCVmb3IgKEdlbkZlYXR1cmUgZ2VuRmVhdHVyZSA6IGdlbkNsYXNzLmdldEVCYXNpY1JlbW92ZUZyb21Db250YWluZXJHZW5GZWF0dXJlcygpKSB7JT4KLSAgPCVHZW5GZWF0dXJlIHJldmVyc2VGZWF0dXJlID0gZ2VuRmVhdHVyZS5nZXRSZXZlcnNlKCk7IEdlbkNsYXNzIHRhcmdldENsYXNzID0gcmV2ZXJzZUZlYXR1cmUuZ2V0R2VuQ2xhc3MoKTsgU3RyaW5nIHJldmVyc2VPZmZzZXRDb3JyZWN0aW9uID0gdGFyZ2V0Q2xhc3MuaGFzT2Zmc2V0Q29ycmVjdGlvbigpID8gIiArICIgKyBnZW5DbGFzcy5nZXRPZmZzZXRDb3JyZWN0aW9uRmllbGQocmV2ZXJzZUZlYXR1cmUpIDogIiI7JT4KLQkJCWNhc2UgPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT46Ci0JCQkJcmV0dXJuIGVJbnRlcm5hbENvbnRhaW5lcigpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIDwlPXRhcmdldENsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChyZXZlcnNlRmVhdHVyZSklPjwlPXJldmVyc2VPZmZzZXRDb3JyZWN0aW9uJT4sIDwlPXRhcmdldENsYXNzLmdldEltcG9ydGVkSW50ZXJmYWNlTmFtZSgpJT4uY2xhc3MsIG1zZ3MpOwotPCV9JT4KLQkJfQotPCVpZiAoZ2VuTW9kZWwuaXNNaW5pbWFsUmVmbGVjdGl2ZU1ldGhvZHMoKSkgeyU+Ci0JCXJldHVybiBzdXBlci5lQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyRmVhdHVyZShtc2dzKTsKLTwlfSBlbHNlIHslPgotCQlyZXR1cm4gZUR5bmFtaWNCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci08JX0lPgotCX0KLQotPCV9JT4KLTwlaWYgKGlzSW1wbGVtZW50YXRpb24gJiYgIWdlbk1vZGVsLmlzUmVmbGVjdGl2ZURlbGVnYXRpb24oKSAmJiBnZW5DbGFzcy5pbXBsZW1lbnRzQW55KGdlbkNsYXNzLmdldEVHZXRHZW5GZWF0dXJlcygpKSkgeyU+Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIDwlaWYgKGdlbk1vZGVsLnVzZUNsYXNzT3ZlcnJpZGVBbm5vdGF0aW9uKCkpIHslPgotCUBPdmVycmlkZQotICA8JX0lPgotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRDwlPW5lZ2F0aXZlT2Zmc2V0Q29ycmVjdGlvbiU+KQotCQl7Ci08JWZvciAoR2VuRmVhdHVyZSBnZW5GZWF0dXJlIDogZ2VuQ2xhc3MuZ2V0RUdldEdlbkZlYXR1cmVzKCkpIHslPgotCQkJY2FzZSA8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPjoKLSAgPCVpZiAoZ2VuRmVhdHVyZS5pc1ByaW1pdGl2ZVR5cGUoKSkgeyU+Ci0gICAgPCVpZiAoZ2VuRmVhdHVyZS5pc0Jvb2xlYW5UeXBlKCkpIHslPgotCQkJCXJldHVybiA8JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPigpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLSAgICA8JX0gZWxzZSB7JT4KLQkJCQlyZXR1cm4gbmV3IDwlPWdlbkZlYXR1cmUuZ2V0T2JqZWN0VHlwZShnZW5DbGFzcyklPig8JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPigpKTsKLSAgICA8JX0lPgotICA8JX0gZWxzZSBpZiAoZ2VuRmVhdHVyZS5pc1Jlc29sdmVQcm94aWVzKCkgJiYgIWdlbkZlYXR1cmUuaXNMaXN0VHlwZSgpKSB7JT4KLQkJCQlpZiAocmVzb2x2ZSkgcmV0dXJuIDwlPWdlbkZlYXR1cmUuZ2V0R2V0QWNjZXNzb3IoKSU+KCk7Ci0JCQkJcmV0dXJuIGJhc2ljR2V0PCU9Z2VuRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+KCk7Ci0gIDwlfSBlbHNlIGlmIChnZW5GZWF0dXJlLmlzTWFwVHlwZSgpKSB7JT4KLSAgICA8JWlmIChnZW5GZWF0dXJlLmlzRWZmZWN0aXZlU3VwcHJlc3NFTUZUeXBlcygpKSB7JT4KLQkJCQlpZiAoY29yZVR5cGUpIHJldHVybiAoKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVNYXAiKSU+LkludGVybmFsTWFwVmlldzwlPWdlbkZlYXR1cmUuZ2V0SW1wb3J0ZWRNYXBUZW1wbGF0ZUFyZ3VtZW50cyhnZW5DbGFzcyklPik8JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPigpKS5lTWFwKCk7Ci0JCQkJZWxzZSByZXR1cm4gPCU9Z2VuRmVhdHVyZS5nZXRHZXRBY2Nlc3NvcigpJT4oKTsKLSAgICA8JX0gZWxzZSB7JT4KLQkJCQlpZiAoY29yZVR5cGUpIHJldHVybiA8JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPigpOwotCQkJCWVsc2UgcmV0dXJuIDwlPWdlbkZlYXR1cmUuZ2V0R2V0QWNjZXNzb3IoKSU+KCkubWFwKCk7Ci0gICAgPCV9JT4KLSAgPCV9IGVsc2UgaWYgKGdlbkZlYXR1cmUuaXNXcmFwcGVkRmVhdHVyZU1hcFR5cGUoKSkgeyU+Ci0JCQkJaWYgKGNvcmVUeXBlKSByZXR1cm4gKCg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXAiKSU+LkludGVybmFsLldyYXBwZXIpPCU9Z2VuRmVhdHVyZS5nZXRHZXRBY2Nlc3NvcigpJT4oKSkuZmVhdHVyZU1hcCgpOwotCQkJCXJldHVybiA8JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPigpOwotICA8JX0gZWxzZSBpZiAoZ2VuRmVhdHVyZS5pc0ZlYXR1cmVNYXBUeXBlKCkpIHslPgotCQkJCWlmIChjb3JlVHlwZSkgcmV0dXJuIDwlPWdlbkZlYXR1cmUuZ2V0R2V0QWNjZXNzb3IoKSU+KCk7Ci0JCQkJcmV0dXJuICgoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwIiklPi5JbnRlcm5hbCk8JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPigpKS5nZXRXcmFwcGVyKCk7Ci0gIDwlfSBlbHNlIHslPgotCQkJCXJldHVybiA8JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPigpOwotICA8JX0lPgotPCV9JT4KLQkJfQotPCVpZiAoZ2VuTW9kZWwuaXNNaW5pbWFsUmVmbGVjdGl2ZU1ldGhvZHMoKSkgeyU+Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotPCV9IGVsc2UgeyU+Ci0JCXJldHVybiBlRHluYW1pY0dldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLTwlfSU+Ci0JfQotCi08JX0lPgotPCVpZiAoaXNJbXBsZW1lbnRhdGlvbiAmJiAhZ2VuTW9kZWwuaXNSZWZsZWN0aXZlRGVsZWdhdGlvbigpICYmIGdlbkNsYXNzLmltcGxlbWVudHNBbnkoZ2VuQ2xhc3MuZ2V0RVNldEdlbkZlYXR1cmVzKCkpKSB7JT4KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgPCVpZiAoZ2VuTW9kZWwudXNlR2VuZXJpY3MoKSkgeyU+Ci0gICAgPCVmb3IgKEdlbkZlYXR1cmUgZ2VuRmVhdHVyZSA6IGdlbkNsYXNzLmdldEVTZXRHZW5GZWF0dXJlcygpKSB7JT4KLSAgICAgIDwlaWYgKGdlbkZlYXR1cmUuaXNVbmNoZWNrZWRDYXN0KCkgJiYgIWdlbkZlYXR1cmUuaXNGZWF0dXJlTWFwVHlwZSgpICYmICFnZW5GZWF0dXJlLmlzTWFwVHlwZSgpKSB7JT4KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLSAgICAgIDwlYnJlYWs7IH0lPgotICAgIDwlfSU+Ci0gIDwlfSU+Ci0gIDwlaWYgKGdlbk1vZGVsLnVzZUNsYXNzT3ZlcnJpZGVBbm5vdGF0aW9uKCkpIHslPgotCUBPdmVycmlkZQotICA8JX0lPgotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQ8JT1uZWdhdGl2ZU9mZnNldENvcnJlY3Rpb24lPikKLQkJewotICA8JWZvciAoR2VuRmVhdHVyZSBnZW5GZWF0dXJlIDogZ2VuQ2xhc3MuZ2V0RVNldEdlbkZlYXR1cmVzKCkpIHslPgotCQkJY2FzZSA8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPjoKLSAgICA8JWlmIChnZW5GZWF0dXJlLmlzTGlzdFR5cGUoKSkgeyU+Ci0gICAgICA8JWlmIChnZW5GZWF0dXJlLmlzV3JhcHBlZEZlYXR1cmVNYXBUeXBlKCkpIHslPgotCQkJCSgoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwIiklPi5JbnRlcm5hbCkoKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcCIpJT4uSW50ZXJuYWwuV3JhcHBlcik8JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPigpKS5mZWF0dXJlTWFwKCkpLnNldChuZXdWYWx1ZSk7Ci0gICAgICA8JX0gZWxzZSBpZiAoZ2VuRmVhdHVyZS5pc0ZlYXR1cmVNYXBUeXBlKCkpIHslPgotCQkJCSgoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwIiklPi5JbnRlcm5hbCk8JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPigpKS5zZXQobmV3VmFsdWUpOwotICAgICAgPCV9IGVsc2UgaWYgKGdlbkZlYXR1cmUuaXNNYXBUeXBlKCkpIHslPgotICAgICAgICA8JWlmIChnZW5GZWF0dXJlLmlzRWZmZWN0aXZlU3VwcHJlc3NFTUZUeXBlcygpKSB7JT4KLQkJCQkoKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZSIpJT4uU2V0dGluZykoKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVNYXAiKSU+LkludGVybmFsTWFwVmlldzwlPWdlbkZlYXR1cmUuZ2V0SW1wb3J0ZWRNYXBUZW1wbGF0ZUFyZ3VtZW50cyhnZW5DbGFzcyklPik8JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPigpKS5lTWFwKCkpLnNldChuZXdWYWx1ZSk7Ci0gICAgICAgIDwlfSBlbHNlIHslPgotCQkJCSgoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlIiklPi5TZXR0aW5nKTwlPWdlbkZlYXR1cmUuZ2V0R2V0QWNjZXNzb3IoKSU+KCkpLnNldChuZXdWYWx1ZSk7Ci0gICAgICAgIDwlfSU+Ci0gICAgICA8JX0gZWxzZSB7JT4KLQkJCQk8JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPigpLmNsZWFyKCk7Ci0JCQkJPCU9Z2VuRmVhdHVyZS5nZXRHZXRBY2Nlc3NvcigpJT4oKS5hZGRBbGwoKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgiamF2YS51dGlsLkNvbGxlY3Rpb24iKSU+PCVpZiAoZ2VuTW9kZWwuZ2V0Q29tcGxpYW5jZUxldmVsKCkuZ2V0VmFsdWUoKSA+PSBHZW5KREtMZXZlbC5KREs1MCkgeyU+PD8gZXh0ZW5kcyA8JT1nZW5GZWF0dXJlLmdldExpc3RJdGVtVHlwZShnZW5DbGFzcyklPj48JX0lPiluZXdWYWx1ZSk7Ci0gICAgICA8JX0lPgotICAgIDwlfSBlbHNlIGlmIChnZW5GZWF0dXJlLmlzUHJpbWl0aXZlVHlwZSgpKSB7JT4KLQkJCQlzZXQ8JT1nZW5GZWF0dXJlLmdldEFjY2Vzc29yTmFtZSgpJT4oKCg8JT1nZW5GZWF0dXJlLmdldE9iamVjdFR5cGUoZ2VuQ2xhc3MpJT4pbmV3VmFsdWUpLjwlPWdlbkZlYXR1cmUuZ2V0UHJpbWl0aXZlVmFsdWVGdW5jdGlvbigpJT4oKSk7Ci0gICAgPCV9IGVsc2UgeyU+Ci0JCQkJc2V0PCU9Z2VuRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+KDwlaWYgKGdlbkZlYXR1cmUuZ2V0VHlwZUdlbkRhdGFUeXBlKCkgPT0gbnVsbCB8fCAhZ2VuRmVhdHVyZS5nZXRUeXBlR2VuRGF0YVR5cGUoKS5pc09iamVjdFR5cGUoKSB8fCAhZ2VuRmVhdHVyZS5nZXRSYXdUeXBlKCkuZXF1YWxzKGdlbkZlYXR1cmUuZ2V0VHlwZShnZW5DbGFzcykpKSB7JT4oPCU9Z2VuRmVhdHVyZS5nZXRJbXBvcnRlZFR5cGUoZ2VuQ2xhc3MpJT4pPCV9JT5uZXdWYWx1ZSk7Ci0gICAgPCV9JT4KLQkJCQlyZXR1cm47Ci0gIDwlfSU+Ci0JCX0KLSAgPCVpZiAoZ2VuTW9kZWwuaXNNaW5pbWFsUmVmbGVjdGl2ZU1ldGhvZHMoKSkgeyU+Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0gIDwlfSBlbHNlIHslPgotCQllRHluYW1pY1NldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLSAgPCV9JT4KLQl9Ci0KLTwlfSU+Ci08JWlmIChpc0ltcGxlbWVudGF0aW9uICYmICFnZW5Nb2RlbC5pc1JlZmxlY3RpdmVEZWxlZ2F0aW9uKCkgJiYgZ2VuQ2xhc3MuaW1wbGVtZW50c0FueShnZW5DbGFzcy5nZXRFVW5zZXRHZW5GZWF0dXJlcygpKSkgeyU+Ci08JUAgaW5jbHVkZSBmaWxlPSJDbGFzcy9lVW5zZXQub3ZlcnJpZGUuamF2YWpldGluYyIgZmFpbD0iYWx0ZXJuYXRpdmUiICU+Ci08JUAgc3RhcnQgJT4KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgPCVpZiAoZ2VuTW9kZWwudXNlQ2xhc3NPdmVycmlkZUFubm90YXRpb24oKSkgeyU+Ci0JQE92ZXJyaWRlCi0gIDwlfSU+Ci0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRDwlPW5lZ2F0aXZlT2Zmc2V0Q29ycmVjdGlvbiU+KQotCQl7Ci0gIDwlZm9yIChHZW5GZWF0dXJlIGdlbkZlYXR1cmUgOiBnZW5DbGFzcy5nZXRFVW5zZXRHZW5GZWF0dXJlcygpKSB7JT4KLQkJCWNhc2UgPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT46Ci0gICAgPCVpZiAoZ2VuRmVhdHVyZS5pc0xpc3RUeXBlKCkgJiYgIWdlbkZlYXR1cmUuaXNVbnNldHRhYmxlKCkpIHslPgotICAgICAgPCVpZiAoZ2VuRmVhdHVyZS5pc1dyYXBwZWRGZWF0dXJlTWFwVHlwZSgpKSB7JT4KLQkJCQkoKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcCIpJT4uSW50ZXJuYWwuV3JhcHBlcik8JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPigpKS5mZWF0dXJlTWFwKCkuY2xlYXIoKTsKLSAgICAgIDwlfSBlbHNlIHslPgotCQkJCTwlPWdlbkZlYXR1cmUuZ2V0R2V0QWNjZXNzb3IoKSU+KCkuY2xlYXIoKTsKLSAgICAgIDwlfSU+Ci0gICAgPCV9IGVsc2UgaWYgKGdlbkZlYXR1cmUuaXNVbnNldHRhYmxlKCkpIHslPgotCQkJCXVuc2V0PCU9Z2VuRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+KCk7Ci0gICAgPCV9IGVsc2UgaWYgKCFnZW5GZWF0dXJlLmhhc0VEZWZhdWx0KCkpIHslPgotCQkJCXNldDwlPWdlbkZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPigoPCU9Z2VuRmVhdHVyZS5nZXRJbXBvcnRlZFR5cGUoZ2VuQ2xhc3MpJT4pbnVsbCk7Ci0gICAgPCV9IGVsc2UgeyU+Ci0JCQkJc2V0PCU9Z2VuRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+KDwlPWdlbkZlYXR1cmUuZ2V0RURlZmF1bHQoKSU+KTsKLSAgICA8JX0lPgotCQkJCXJldHVybjsKLSAgPCV9JT4KLQkJfQotICA8JWlmIChnZW5Nb2RlbC5pc01pbmltYWxSZWZsZWN0aXZlTWV0aG9kcygpKSB7JT4KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0gIDwlfSBlbHNlIHslPgotCQllRHluYW1pY1Vuc2V0KGZlYXR1cmVJRCk7Ci0gIDwlfSU+Ci0JfQotCi08JUAgZW5kICU+PCUvL0NsYXNzL2VVbnNldC5vdmVycmlkZS5qYXZhamV0aW5jJT4KLTwlfSU+Ci08JWlmIChpc0ltcGxlbWVudGF0aW9uICYmICFnZW5Nb2RlbC5pc1JlZmxlY3RpdmVEZWxlZ2F0aW9uKCkgJiYgZ2VuQ2xhc3MuaW1wbGVtZW50c0FueShnZW5DbGFzcy5nZXRFSXNTZXRHZW5GZWF0dXJlcygpKSkgeyU+Ci08JUAgaW5jbHVkZSBmaWxlPSJDbGFzcy9lSXNTZXQub3ZlcnJpZGUuamF2YWpldGluYyIgZmFpbD0iYWx0ZXJuYXRpdmUiICU+Ci08JUAgc3RhcnQgJT4KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgPCVpZiAoZ2VuTW9kZWwudXNlR2VuZXJpY3MoKSkgeyU+Ci0gICAgPCVmb3IgKEdlbkZlYXR1cmUgZ2VuRmVhdHVyZSA6IGdlbkNsYXNzLmdldEVJc1NldEdlbkZlYXR1cmVzKCkpIHslPgotICAgICAgPCVpZiAoZ2VuRmVhdHVyZS5pc0xpc3RUeXBlKCkgJiYgIWdlbkZlYXR1cmUuaXNVbnNldHRhYmxlKCkgJiYgIWdlbkZlYXR1cmUuaXNXcmFwcGVkRmVhdHVyZU1hcFR5cGUoKSAmJiAhZ2VuQ2xhc3MuaXNGaWVsZChnZW5GZWF0dXJlKSAmJiBnZW5GZWF0dXJlLmlzRmllbGQoKSAmJiBnZW5DbGFzcy5nZXRJbXBsZW1lbnRpbmdHZW5Nb2RlbChnZW5GZWF0dXJlKS5pc1ZpcnR1YWxEZWxlZ2F0aW9uKCkpIHslPgotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICAgICAgPCVicmVhazsgfSU+Ci0gICAgPCV9JT4KLSAgPCV9JT4KLSAgPCVpZiAoZ2VuTW9kZWwudXNlQ2xhc3NPdmVycmlkZUFubm90YXRpb24oKSkgeyU+Ci0JQE92ZXJyaWRlCi0gIDwlfSU+Ci0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpCi0JewotLy9VTUEtLT4KLQkJPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlIiklPiBmZWF0dXJlID0gZ2V0RmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWUoZmVhdHVyZUlEKTsKLQkJaWYoZmVhdHVyZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gaXNGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZVNldChmZWF0dXJlKTsKLQkJfQotLy9VTUE8LS0JCQotCQlzd2l0Y2ggKGZlYXR1cmVJRDwlPW5lZ2F0aXZlT2Zmc2V0Q29ycmVjdGlvbiU+KQotCQl7Ci08JWZvciAoR2VuRmVhdHVyZSBnZW5GZWF0dXJlIDogZ2VuQ2xhc3MuZ2V0RUlzU2V0R2VuRmVhdHVyZXMoKSkgeyU+Ci0JCQljYXNlIDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+OgotICA8JWlmIChnZW5GZWF0dXJlLmlzTGlzdFR5cGUoKSAmJiAhZ2VuRmVhdHVyZS5pc1Vuc2V0dGFibGUoKSkgeyU+Ci0gICAgPCVpZiAoZ2VuRmVhdHVyZS5pc1dyYXBwZWRGZWF0dXJlTWFwVHlwZSgpKSB7JT4KLSAgICAgIDwlaWYgKGdlbkZlYXR1cmUuaXNWb2xhdGlsZSgpKSB7JT4KLQkJCQlyZXR1cm4gISgoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwIiklPi5JbnRlcm5hbC5XcmFwcGVyKTwlPWdlbkZlYXR1cmUuZ2V0R2V0QWNjZXNzb3IoKSU+KCkpLmZlYXR1cmVNYXAoKS5pc0VtcHR5KCk7Ci0gICAgICA8JX0gZWxzZSB7JT4KLQkJCQlyZXR1cm4gPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4gIT0gbnVsbCAmJiAhPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4uZmVhdHVyZU1hcCgpLmlzRW1wdHkoKTsKLSAgICAgIDwlfSU+Ci0gICAgPCV9IGVsc2UgeyU+Ci0gICAgICA8JWlmIChnZW5DbGFzcy5pc0ZpZWxkKGdlbkZlYXR1cmUpKSB7JT4KLQkJCQlyZXR1cm4gPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4gIT0gbnVsbCAmJiAhPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4uaXNFbXB0eSgpOwotICAgICAgPCV9IGVsc2UgeyU+Ci0gICAgICAgIDwlaWYgKGdlbkZlYXR1cmUuaXNGaWVsZCgpICYmIGdlbkNsYXNzLmdldEltcGxlbWVudGluZ0dlbk1vZGVsKGdlbkZlYXR1cmUpLmlzVmlydHVhbERlbGVnYXRpb24oKSkgeyU+Ci0JCQkJPCU9Z2VuRmVhdHVyZS5nZXRJbXBvcnRlZFR5cGUoZ2VuQ2xhc3MpJT4gPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4gPSAoPCU9Z2VuRmVhdHVyZS5nZXRJbXBvcnRlZFR5cGUoZ2VuQ2xhc3MpJT4pZVZpcnR1YWxHZXQoPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT48JT1wb3NpdGl2ZU9mZnNldENvcnJlY3Rpb24lPik7Ci0JCQkJcmV0dXJuIDwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+ICE9IG51bGwgJiYgITwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+LmlzRW1wdHkoKTsKLSAgICAgICAgPCV9IGVsc2UgeyU+Ci0JCQkJcmV0dXJuICE8JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPigpLmlzRW1wdHkoKTsKLSAgICAgICAgPCV9JT4KLSAgICAgIDwlfSU+Ci0gICAgPCV9JT4KLSAgPCV9IGVsc2UgaWYgKGdlbkZlYXR1cmUuaXNVbnNldHRhYmxlKCkpIHslPgotCQkJCXJldHVybiBpc1NldDwlPWdlbkZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPigpOwotICA8JX0gZWxzZSBpZiAoZ2VuRmVhdHVyZS5pc1Jlc29sdmVQcm94aWVzKCkpIHslPgotICAgIDwlaWYgKGdlbkNsYXNzLmlzRmllbGQoZ2VuRmVhdHVyZSkpIHslPgotCQkJCXJldHVybiA8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPiAhPSBudWxsOwotICAgIDwlfSBlbHNlIHslPgotICAgICAgPCVpZiAoZ2VuRmVhdHVyZS5pc0ZpZWxkKCkgJiYgZ2VuQ2xhc3MuZ2V0SW1wbGVtZW50aW5nR2VuTW9kZWwoZ2VuRmVhdHVyZSkuaXNWaXJ0dWFsRGVsZWdhdGlvbigpKSB7JT4KLQkJCQlyZXR1cm4gZVZpcnR1YWxHZXQoPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT48JT1wb3NpdGl2ZU9mZnNldENvcnJlY3Rpb24lPikgIT0gbnVsbDsKLSAgICAgIDwlfSBlbHNlIHslPgotCQkJCXJldHVybiBiYXNpY0dldDwlPWdlbkZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPigpICE9IG51bGw7Ci0gICAgICA8JX0lPgotICAgIDwlfSU+Ci0gIDwlfSBlbHNlIGlmICghZ2VuRmVhdHVyZS5oYXNFRGVmYXVsdCgpKSB7JT4KLSAgICA8JWlmIChnZW5DbGFzcy5pc0ZpZWxkKGdlbkZlYXR1cmUpKSB7JT4KLQkJCQlyZXR1cm4gPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4gIT0gbnVsbDsKLSAgICA8JX0gZWxzZSB7JT4KLSAgICAgIDwlaWYgKGdlbkZlYXR1cmUuaXNGaWVsZCgpICYmIGdlbkNsYXNzLmdldEltcGxlbWVudGluZ0dlbk1vZGVsKGdlbkZlYXR1cmUpLmlzVmlydHVhbERlbGVnYXRpb24oKSkgeyU+Ci0JCQkJcmV0dXJuIGVWaXJ0dWFsR2V0KDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+PCU9cG9zaXRpdmVPZmZzZXRDb3JyZWN0aW9uJT4pICE9IG51bGw7Ci0gICAgICA8JX0gZWxzZSB7JT4KLQkJCQlyZXR1cm4gPCU9Z2VuRmVhdHVyZS5nZXRHZXRBY2Nlc3NvcigpJT4oKSAhPSBudWxsOwotICAgICAgPCV9JT4KLSAgICA8JX0lPgotICA8JX0gZWxzZSBpZiAoZ2VuRmVhdHVyZS5pc1ByaW1pdGl2ZVR5cGUoKSB8fCBnZW5GZWF0dXJlLmlzRW51bVR5cGUoKSkgeyU+Ci0gICAgPCVpZiAoZ2VuQ2xhc3MuaXNGaWVsZChnZW5GZWF0dXJlKSkgeyU+Ci0gICAgICA8JWlmIChnZW5DbGFzcy5pc0ZsYWcoZ2VuRmVhdHVyZSkpIHslPgotCQkJCXJldHVybiAoKDwlPWdlbkNsYXNzLmdldEZsYWdzRmllbGQoZ2VuRmVhdHVyZSklPiAmIDwlPWdlbkZlYXR1cmUuZ2V0VXBwZXJOYW1lKCklPl9FRkxBRykgIT0gMCkgIT0gPCU9Z2VuRmVhdHVyZS5nZXRFRGVmYXVsdCgpJT47Ci0gICAgICA8JX0gZWxzZSB7JT4KLQkJCQlyZXR1cm4gPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4gIT0gPCU9Z2VuRmVhdHVyZS5nZXRFRGVmYXVsdCgpJT47Ci0gICAgICA8JX0lPgotICAgIDwlfSBlbHNlIHslPgotICAgICAgPCVpZiAoZ2VuRmVhdHVyZS5pc0VudW1UeXBlKCkgJiYgZ2VuRmVhdHVyZS5pc0ZpZWxkKCkgJiYgZ2VuQ2xhc3MuZ2V0SW1wbGVtZW50aW5nR2VuTW9kZWwoZ2VuRmVhdHVyZSkuaXNWaXJ0dWFsRGVsZWdhdGlvbigpKSB7JT4KLQkJCQlyZXR1cm4gZVZpcnR1YWxHZXQoPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT48JT1wb3NpdGl2ZU9mZnNldENvcnJlY3Rpb24lPiwgPCU9Z2VuRmVhdHVyZS5nZXRFRGVmYXVsdCgpJT4pICE9IDwlPWdlbkZlYXR1cmUuZ2V0RURlZmF1bHQoKSU+OwotICAgICAgPCV9IGVsc2UgeyU+Ci0JCQkJcmV0dXJuIDwlPWdlbkZlYXR1cmUuZ2V0R2V0QWNjZXNzb3IoKSU+KCkgIT0gPCU9Z2VuRmVhdHVyZS5nZXRFRGVmYXVsdCgpJT47Ci0gICAgICA8JX0lPgotICAgIDwlfSU+Ci0gIDwlfSBlbHNlIHsvL2RhdGF0eXBlJT4KLSAgICA8JWlmIChnZW5DbGFzcy5pc0ZpZWxkKGdlbkZlYXR1cmUpKSB7JT4KLQkJCQlyZXR1cm4gPCU9Z2VuRmVhdHVyZS5nZXRFRGVmYXVsdCgpJT4gPT0gbnVsbCA/IDwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+ICE9IG51bGwgOiAhPCU9Z2VuRmVhdHVyZS5nZXRFRGVmYXVsdCgpJT4uZXF1YWxzKDwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+KTsKLSAgICA8JX0gZWxzZSB7JT4KLSAgICAgIDwlaWYgKGdlbkZlYXR1cmUuaXNGaWVsZCgpICYmIGdlbkNsYXNzLmdldEltcGxlbWVudGluZ0dlbk1vZGVsKGdlbkZlYXR1cmUpLmlzVmlydHVhbERlbGVnYXRpb24oKSkgeyU+Ci0JCQkJPCU9Z2VuRmVhdHVyZS5nZXRJbXBvcnRlZFR5cGUoZ2VuQ2xhc3MpJT4gPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4gPSAoPCU9Z2VuRmVhdHVyZS5nZXRJbXBvcnRlZFR5cGUoZ2VuQ2xhc3MpJT4pZVZpcnR1YWxHZXQoPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT48JT1wb3NpdGl2ZU9mZnNldENvcnJlY3Rpb24lPiwgPCU9Z2VuRmVhdHVyZS5nZXRFRGVmYXVsdCgpJT4pOwotCQkJCXJldHVybiA8JT1nZW5GZWF0dXJlLmdldEVEZWZhdWx0KCklPiA9PSBudWxsID8gPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4gIT0gbnVsbCA6ICE8JT1nZW5GZWF0dXJlLmdldEVEZWZhdWx0KCklPi5lcXVhbHMoPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4pOwotICAgICAgPCV9IGVsc2UgeyU+Ci0JCQkJcmV0dXJuIDwlPWdlbkZlYXR1cmUuZ2V0RURlZmF1bHQoKSU+ID09IG51bGwgPyA8JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPigpICE9IG51bGwgOiAhPCU9Z2VuRmVhdHVyZS5nZXRFRGVmYXVsdCgpJT4uZXF1YWxzKDwlPWdlbkZlYXR1cmUuZ2V0R2V0QWNjZXNzb3IoKSU+KCkpOwotICAgICAgPCV9JT4KLSAgICA8JX0lPgotICA8JX0lPgotPCV9JT4KLQkJfQotPCVpZiAoZ2VuTW9kZWwuaXNNaW5pbWFsUmVmbGVjdGl2ZU1ldGhvZHMoKSkgeyU+Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLTwlfSBlbHNlIHslPgotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChmZWF0dXJlSUQpOwotPCV9JT4KLQl9Ci0KLTwlQCBlbmQgJT48JS8vQ2xhc3MvZUlzU2V0Lm92ZXJyaWRlLmphdmFqZXRpbmMlPgotPCV9JT4KLTwlaWYgKGlzSW1wbGVtZW50YXRpb24gJiYgKCFnZW5DbGFzcy5nZXRNaXhpbkdlbkZlYXR1cmVzKCkuaXNFbXB0eSgpIHx8IGdlbkNsYXNzLmhhc09mZnNldENvcnJlY3Rpb24oKSAmJiAhZ2VuQ2xhc3MuZ2V0R2VuRmVhdHVyZXMoKS5pc0VtcHR5KCkpKSB7JT4KLSAgPCVpZiAoIWdlbkNsYXNzLmdldE1peGluR2VuRmVhdHVyZXMoKS5pc0VtcHR5KCkpIHslPgotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIDwlaWYgKGdlbk1vZGVsLnVzZUNsYXNzT3ZlcnJpZGVBbm5vdGF0aW9uKCkpIHslPgotCUBPdmVycmlkZQotICAgIDwlfSU+Ci0JcHVibGljIGludCBlQmFzZVN0cnVjdHVyYWxGZWF0dXJlSUQoaW50IGRlcml2ZWRGZWF0dXJlSUQsIENsYXNzPCU9c2luZ2xlV2lsZGNhcmQlPiBiYXNlQ2xhc3MpCi0JewotICAgIDwlZm9yIChHZW5DbGFzcyBtaXhpbkdlbkNsYXNzIDogZ2VuQ2xhc3MuZ2V0TWl4aW5HZW5DbGFzc2VzKCkpIHslPgotCQlpZiAoYmFzZUNsYXNzID09IDwlPW1peGluR2VuQ2xhc3MuZ2V0SW1wb3J0ZWRJbnRlcmZhY2VOYW1lKCklPi5jbGFzcykKLQkJewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEPCU9bmVnYXRpdmVPZmZzZXRDb3JyZWN0aW9uJT4pCi0JCQl7Ci0gICAgICA8JWZvciAoR2VuRmVhdHVyZSBnZW5GZWF0dXJlIDogbWl4aW5HZW5DbGFzcy5nZXRHZW5GZWF0dXJlcygpKSB7JT4KLQkJCQljYXNlIDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+OiByZXR1cm4gPCU9bWl4aW5HZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPjsKLSAgICAgIDwlfSU+Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0gICAgPCV9JT4KLQkJcmV0dXJuIHN1cGVyLmVCYXNlU3RydWN0dXJhbEZlYXR1cmVJRChkZXJpdmVkRmVhdHVyZUlELCBiYXNlQ2xhc3MpOwotCX0KLSAgPCV9JT4KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICA8JWlmIChnZW5Nb2RlbC51c2VDbGFzc092ZXJyaWRlQW5ub3RhdGlvbigpKSB7JT4KLQlAT3ZlcnJpZGUKLSAgPCV9JT4KLQlwdWJsaWMgaW50IGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChpbnQgYmFzZUZlYXR1cmVJRCwgQ2xhc3M8JT1zaW5nbGVXaWxkY2FyZCU+IGJhc2VDbGFzcykKLQl7Ci0gIDwlZm9yIChHZW5DbGFzcyBtaXhpbkdlbkNsYXNzIDogZ2VuQ2xhc3MuZ2V0TWl4aW5HZW5DbGFzc2VzKCkpIHslPgotCQlpZiAoYmFzZUNsYXNzID09IDwlPW1peGluR2VuQ2xhc3MuZ2V0SW1wb3J0ZWRJbnRlcmZhY2VOYW1lKCklPi5jbGFzcykKLQkJewotCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQotCQkJewotICAgIDwlZm9yIChHZW5GZWF0dXJlIGdlbkZlYXR1cmUgOiBtaXhpbkdlbkNsYXNzLmdldEdlbkZlYXR1cmVzKCkpIHslPgotCQkJCWNhc2UgPCU9bWl4aW5HZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPjogcmV0dXJuIDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+PCU9cG9zaXRpdmVPZmZzZXRDb3JyZWN0aW9uJT47Ci0gICAgPCV9JT4KLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLSAgPCV9JT4KLSAgPCVpZiAoZ2VuQ2xhc3MuaGFzT2Zmc2V0Q29ycmVjdGlvbigpICYmICFnZW5DbGFzcy5nZXRHZW5GZWF0dXJlcygpLmlzRW1wdHkoKSkgeyU+Ci0JCWlmIChiYXNlQ2xhc3MgPT0gPCU9Z2VuQ2xhc3MuZ2V0SW1wb3J0ZWRJbnRlcmZhY2VOYW1lKCklPi5jbGFzcykKLQkJewotCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEPCU9bmVnYXRpdmVPZmZzZXRDb3JyZWN0aW9uJT4pCi0JCQl7Ci0gICAgPCVmb3IgKEdlbkZlYXR1cmUgZ2VuRmVhdHVyZSA6IGdlbkNsYXNzLmdldEdlbkZlYXR1cmVzKCkpIHslPgotCQkJCWNhc2UgPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT46IHJldHVybiA8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPjwlPXBvc2l0aXZlT2Zmc2V0Q29ycmVjdGlvbiU+OwotICAgIDwlfSU+Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0gIDwlfSU+Ci0JCXJldHVybiBzdXBlci5lRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoYmFzZUZlYXR1cmVJRCwgYmFzZUNsYXNzKTsKLQl9Ci0KLTwlfSU+Ci08JWlmIChpc0ltcGxlbWVudGF0aW9uICYmIGdlbk1vZGVsLmlzVmlydHVhbERlbGVnYXRpb24oKSkgeyBTdHJpbmcgZVZpcnR1YWxWYWx1ZXNGaWVsZCA9IGdlbkNsYXNzLmdldEVWaXJ0dWFsVmFsdWVzRmllbGQoKTslPgotICA8JWlmIChlVmlydHVhbFZhbHVlc0ZpZWxkICE9IG51bGwpIHslPgotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICA8JWlmIChnZW5Nb2RlbC51c2VDbGFzc092ZXJyaWRlQW5ub3RhdGlvbigpKSB7JT4KLQlAT3ZlcnJpZGUKLSAgPCV9JT4KLQlwcm90ZWN0ZWQgT2JqZWN0W10gZVZpcnR1YWxWYWx1ZXMoKQotCXsKLQkJcmV0dXJuIDwlPWVWaXJ0dWFsVmFsdWVzRmllbGQlPjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgPCVpZiAoZ2VuTW9kZWwudXNlQ2xhc3NPdmVycmlkZUFubm90YXRpb24oKSkgeyU+Ci0JQE92ZXJyaWRlCi0gIDwlfSU+Ci0JcHJvdGVjdGVkIHZvaWQgZVNldFZpcnR1YWxWYWx1ZXMoT2JqZWN0W10gbmV3VmFsdWVzKQotCXsKLQkJPCU9ZVZpcnR1YWxWYWx1ZXNGaWVsZCU+ID0gbmV3VmFsdWVzOwotCX0KLQotICA8JX0lPgotICA8JXsgTGlzdDxTdHJpbmc+IGVWaXJ0dWFsSW5kZXhCaXRGaWVsZHMgPSBnZW5DbGFzcy5nZXRFVmlydHVhbEluZGV4Qml0RmllbGRzKG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpKTslPgotICAgIDwlaWYgKCFlVmlydHVhbEluZGV4Qml0RmllbGRzLmlzRW1wdHkoKSkgeyBMaXN0PFN0cmluZz4gYWxsRVZpcnR1YWxJbmRleEJpdEZpZWxkcyA9IGdlbkNsYXNzLmdldEFsbEVWaXJ0dWFsSW5kZXhCaXRGaWVsZHMobmV3IEFycmF5TGlzdDxTdHJpbmc+KCkpOyU+Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIDwlaWYgKGdlbk1vZGVsLnVzZUNsYXNzT3ZlcnJpZGVBbm5vdGF0aW9uKCkpIHslPgotCUBPdmVycmlkZQotICA8JX0lPgotCXByb3RlY3RlZCBpbnQgZVZpcnR1YWxJbmRleEJpdHMoaW50IG9mZnNldCkKLQl7Ci0JCXN3aXRjaCAob2Zmc2V0KQotCQl7Ci0gICAgICA8JWZvciAoaW50IGkgPSAwOyBpIDwgYWxsRVZpcnR1YWxJbmRleEJpdEZpZWxkcy5zaXplKCk7IGkrKykgeyU+Ci0JCQljYXNlIDwlPWklPiA6Ci0JCQkJcmV0dXJuIDwlPWFsbEVWaXJ0dWFsSW5kZXhCaXRGaWVsZHMuZ2V0KGkpJT47Ci0gICAgICA8JX0lPgotCQkJZGVmYXVsdCA6Ci0JCQkJdGhyb3cgbmV3IEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICA8JWlmIChnZW5Nb2RlbC51c2VDbGFzc092ZXJyaWRlQW5ub3RhdGlvbigpKSB7JT4KLQlAT3ZlcnJpZGUKLSAgPCV9JT4KLQlwcm90ZWN0ZWQgdm9pZCBlU2V0VmlydHVhbEluZGV4Qml0cyhpbnQgb2Zmc2V0LCBpbnQgbmV3SW5kZXhCaXRzKQotCXsKLQkJc3dpdGNoIChvZmZzZXQpCi0JCXsKLSAgICAgIDwlZm9yIChpbnQgaSA9IDA7IGkgPCBhbGxFVmlydHVhbEluZGV4Qml0RmllbGRzLnNpemUoKTsgaSsrKSB7JT4KLQkJCWNhc2UgPCU9aSU+IDoKLQkJCQk8JT1hbGxFVmlydHVhbEluZGV4Qml0RmllbGRzLmdldChpKSU+ID0gbmV3SW5kZXhCaXRzOwotCQkJCWJyZWFrOwotICAgICAgPCV9JT4KLQkJCWRlZmF1bHQgOgotCQkJCXRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCk7Ci0JCX0KLQl9Ci0KLSAgICA8JX0lPgotICA8JX0lPgotPCV9JT4KLTwlaWYgKGlzSW1wbGVtZW50YXRpb24gJiYgIWdlbk1vZGVsLmlzUmVmbGVjdGl2ZURlbGVnYXRpb24oKSAmJiAhZ2VuQ2xhc3MuZ2V0VG9TdHJpbmdHZW5GZWF0dXJlcygpLmlzRW1wdHkoKSkgeyU+Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIDwlaWYgKGdlbk1vZGVsLnVzZUNsYXNzT3ZlcnJpZGVBbm5vdGF0aW9uKCkpIHslPgotCUBPdmVycmlkZQotICA8JX0lPgotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotCXsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotICA8JXsgYm9vbGVhbiBmaXJzdCA9IHRydWU7JT4KLSAgICA8JWZvciAoR2VuRmVhdHVyZSBnZW5GZWF0dXJlIDogZ2VuQ2xhc3MuZ2V0VG9TdHJpbmdHZW5GZWF0dXJlcygpKSB7JT4KLSAgICAgIDwlaWYgKGZpcnN0KSB7IGZpcnN0ID0gZmFsc2U7JT4KLQkJcmVzdWx0LmFwcGVuZCgiICg8JT1nZW5GZWF0dXJlLmdldE5hbWUoKSU+OiAiKTs8JT1nZW5Nb2RlbC5nZXROb25OTFMoKSU+Ci0gICAgICA8JX0gZWxzZSB7JT4KLQkJcmVzdWx0LmFwcGVuZCgiLCA8JT1nZW5GZWF0dXJlLmdldE5hbWUoKSU+OiAiKTs8JT1nZW5Nb2RlbC5nZXROb25OTFMoKSU+Ci0gICAgICA8JX0lPgotICAgICAgPCVpZiAoZ2VuRmVhdHVyZS5pc1Vuc2V0dGFibGUoKSAmJiAhZ2VuRmVhdHVyZS5pc0xpc3RUeXBlKCkpIHslPgotICAgICAgICA8JWlmIChnZW5Nb2RlbC5pc1ZpcnR1YWxEZWxlZ2F0aW9uKCkgJiYgIWdlbkZlYXR1cmUuaXNQcmltaXRpdmVUeXBlKCkpIHslPgotCQlpZiAoZVZpcnR1YWxJc1NldCg8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPjwlPXBvc2l0aXZlT2Zmc2V0Q29ycmVjdGlvbiU+KSkgcmVzdWx0LmFwcGVuZChlVmlydHVhbEdldCg8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPjwlPXBvc2l0aXZlT2Zmc2V0Q29ycmVjdGlvbiU+KSk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOzwlPWdlbk1vZGVsLmdldE5vbk5MUygpJT4KLSAgICAgICAgPCV9IGVsc2UgeyU+Ci0gICAgICAgICAgPCVpZiAoZ2VuQ2xhc3MuaXNGbGFnKGdlbkZlYXR1cmUpKSB7JT4KLQkJaWYgKDwlaWYgKGdlbkNsYXNzLmlzRVNldEZsYWcoZ2VuRmVhdHVyZSkpIHslPig8JT1nZW5DbGFzcy5nZXRFU2V0RmxhZ3NGaWVsZChnZW5GZWF0dXJlKSU+ICYgPCU9Z2VuRmVhdHVyZS5nZXRVcHBlck5hbWUoKSU+X0VTRVRGTEFHKSAhPSAwPCV9IGVsc2UgeyU+PCU9Z2VuRmVhdHVyZS5nZXRVbmNhcE5hbWUoKSU+RVNldDwlfSU+KSByZXN1bHQuYXBwZW5kKCg8JT1nZW5DbGFzcy5nZXRGbGFnc0ZpZWxkKGdlbkZlYXR1cmUpJT4gJiA8JT1nZW5GZWF0dXJlLmdldFVwcGVyTmFtZSgpJT5fRUZMQUcpICE9IDApOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTs8JT1nZW5Nb2RlbC5nZXROb25OTFMoKSU+Ci0gICAgICAgICAgPCV9IGVsc2UgeyU+Ci0JCWlmICg8JWlmIChnZW5DbGFzcy5pc0VTZXRGbGFnKGdlbkZlYXR1cmUpKSB7JT4oPCU9Z2VuQ2xhc3MuZ2V0RVNldEZsYWdzRmllbGQoZ2VuRmVhdHVyZSklPiAmIDwlPWdlbkZlYXR1cmUuZ2V0VXBwZXJOYW1lKCklPl9FU0VURkxBRykgIT0gMDwlfSBlbHNlIHslPjwlPWdlbkZlYXR1cmUuZ2V0VW5jYXBOYW1lKCklPkVTZXQ8JX0lPikgcmVzdWx0LmFwcGVuZCg8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPik7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOzwlPWdlbk1vZGVsLmdldE5vbk5MUygpJT4KLSAgICAgICAgICA8JX0lPgotICAgICAgICA8JX0lPgotICAgICAgPCV9IGVsc2UgeyU+Ci0gICAgICAgIDwlaWYgKGdlbk1vZGVsLmlzVmlydHVhbERlbGVnYXRpb24oKSAmJiAhZ2VuRmVhdHVyZS5pc1ByaW1pdGl2ZVR5cGUoKSkgeyU+Ci0JCXJlc3VsdC5hcHBlbmQoZVZpcnR1YWxHZXQoPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT48JT1wb3NpdGl2ZU9mZnNldENvcnJlY3Rpb24lPjwlaWYgKCFnZW5GZWF0dXJlLmlzTGlzdFR5cGUoKSAmJiAhZ2VuRmVhdHVyZS5pc1JlZmVyZW5jZVR5cGUoKSl7JT4sIDwlPWdlbkZlYXR1cmUuZ2V0RURlZmF1bHQoKSU+PCV9JT4pKTsKLSAgICAgICAgPCV9IGVsc2UgeyU+Ci0gICAgICAgICAgPCVpZiAoZ2VuQ2xhc3MuaXNGbGFnKGdlbkZlYXR1cmUpKSB7JT4KLQkJcmVzdWx0LmFwcGVuZCgoPCU9Z2VuQ2xhc3MuZ2V0RmxhZ3NGaWVsZChnZW5GZWF0dXJlKSU+ICYgPCU9Z2VuRmVhdHVyZS5nZXRVcHBlck5hbWUoKSU+X0VGTEFHKSAhPSAwKTsKLSAgICAgICAgICA8JX0gZWxzZSB7JT4KLQkJcmVzdWx0LmFwcGVuZCg8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPik7Ci0gICAgICAgICAgPCV9JT4KLSAgICAgICAgPCV9JT4KLSAgICAgIDwlfSU+Ci0gICAgPCV9JT4KLSAgPCV9JT4KLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi08JX0lPgotPCVpZiAoaXNJbXBsZW1lbnRhdGlvbiAmJiBnZW5DbGFzcy5pc01hcEVudHJ5KCkpIHsgR2VuRmVhdHVyZSBrZXlGZWF0dXJlID0gZ2VuQ2xhc3MuZ2V0TWFwRW50cnlLZXlGZWF0dXJlKCk7IEdlbkZlYXR1cmUgdmFsdWVGZWF0dXJlID0gZ2VuQ2xhc3MuZ2V0TWFwRW50cnlWYWx1ZUZlYXR1cmUoKTslPgotPCVTdHJpbmcgb2JqZWN0VHlwZSA9IGdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgiamF2YS5sYW5nLk9iamVjdCIpOyU+Ci08JVN0cmluZyBrZXlUeXBlID0gZ2VuTW9kZWwuZ2V0Q29tcGxpYW5jZUxldmVsKCkuZ2V0VmFsdWUoKSA+PSBHZW5KREtMZXZlbC5KREs1MCA/IGtleUZlYXR1cmUuZ2V0T2JqZWN0VHlwZShnZW5DbGFzcykgOiBvYmplY3RUeXBlOyU+Ci08JVN0cmluZyB2YWx1ZVR5cGUgPSBnZW5Nb2RlbC5nZXRDb21wbGlhbmNlTGV2ZWwoKS5nZXRWYWx1ZSgpID49IEdlbkpES0xldmVsLkpESzUwID8gdmFsdWVGZWF0dXJlLmdldE9iamVjdFR5cGUoZ2VuQ2xhc3MpIDogb2JqZWN0VHlwZTslPgotPCVTdHJpbmcgZU1hcFR5cGUgPSBnZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTWFwIikgKyAoZ2VuTW9kZWwuZ2V0Q29tcGxpYW5jZUxldmVsKCkuZ2V0VmFsdWUoKSA+PSBHZW5KREtMZXZlbC5KREs1MCA/ICI8IiArIGtleVR5cGUgKyAiLCAiICsgdmFsdWVUeXBlICsgIj4iIDogIiIpOyU+Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIGludCBoYXNoID0gLTE7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgaW50IGdldEhhc2goKQotCXsKLQkJaWYgKGhhc2ggPT0gLTEpCi0JCXsKLQkJCTwlPW9iamVjdFR5cGUlPiB0aGVLZXkgPSBnZXRLZXkoKTsKLQkJCWhhc2ggPSAodGhlS2V5ID09IG51bGwgPyAwIDogdGhlS2V5Lmhhc2hDb2RlKCkpOwotCQl9Ci0JCXJldHVybiBoYXNoOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEhhc2goaW50IGhhc2gpCi0JewotCQl0aGlzLmhhc2ggPSBoYXNoOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyA8JT1rZXlUeXBlJT4gZ2V0S2V5KCkKLQl7Ci0gIDwlaWYgKGtleUZlYXR1cmUuaXNQcmltaXRpdmVUeXBlKCkpIHslPgotCQlyZXR1cm4gbmV3IDwlPWtleUZlYXR1cmUuZ2V0T2JqZWN0VHlwZShnZW5DbGFzcyklPihnZXRUeXBlZEtleSgpKTsKLSAgPCV9IGVsc2UgeyU+Ci0JCXJldHVybiBnZXRUeXBlZEtleSgpOwotICA8JX0lPgotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEtleSg8JT1rZXlUeXBlJT4ga2V5KQotCXsKLSAgPCVpZiAoa2V5RmVhdHVyZS5pc0xpc3RUeXBlKCkpIHslPgotCQlnZXRUeXBlZEtleSgpLmFkZEFsbCg8JWlmICghZ2VuTW9kZWwudXNlR2VuZXJpY3MoKSkgeyU+KDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgiamF2YS51dGlsLkNvbGxlY3Rpb24iKSU+KTwlfSU+a2V5KTsKLSAgPCV9IGVsc2UgaWYgKGdlbk1vZGVsLmdldENvbXBsaWFuY2VMZXZlbCgpLmdldFZhbHVlKCkgPj0gR2VuSkRLTGV2ZWwuSkRLNTApIHslPgotCQlzZXRUeXBlZEtleShrZXkpOwotICA8JX0gZWxzZSBpZiAoa2V5RmVhdHVyZS5pc1ByaW1pdGl2ZVR5cGUoKSkgeyU+Ci0JCXNldFR5cGVkS2V5KCgoPCU9a2V5RmVhdHVyZS5nZXRPYmplY3RUeXBlKGdlbkNsYXNzKSU+KWtleSkuPCU9a2V5RmVhdHVyZS5nZXRQcmltaXRpdmVWYWx1ZUZ1bmN0aW9uKCklPigpKTsKLSAgPCV9IGVsc2UgeyU+Ci0JCXNldFR5cGVkS2V5KCg8JT1rZXlGZWF0dXJlLmdldEltcG9ydGVkVHlwZShnZW5DbGFzcyklPilrZXkpOwotICA8JX0lPgotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyA8JT12YWx1ZVR5cGUlPiBnZXRWYWx1ZSgpCi0JewotICA8JWlmICh2YWx1ZUZlYXR1cmUuaXNQcmltaXRpdmVUeXBlKCkpIHslPgotCQlyZXR1cm4gbmV3IDwlPXZhbHVlRmVhdHVyZS5nZXRPYmplY3RUeXBlKGdlbkNsYXNzKSU+KGdldFR5cGVkVmFsdWUoKSk7Ci0gIDwlfSBlbHNlIHslPgotCQlyZXR1cm4gZ2V0VHlwZWRWYWx1ZSgpOwotICA8JX0lPgotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyA8JT12YWx1ZVR5cGUlPiBzZXRWYWx1ZSg8JT12YWx1ZVR5cGUlPiB2YWx1ZSkKLQl7Ci0JCTwlPXZhbHVlVHlwZSU+IG9sZFZhbHVlID0gZ2V0VmFsdWUoKTsKLSAgPCVpZiAodmFsdWVGZWF0dXJlLmlzTGlzdFR5cGUoKSkgeyU+Ci0JCWdldFR5cGVkVmFsdWUoKS5jbGVhcigpOwotCQlnZXRUeXBlZFZhbHVlKCkuYWRkQWxsKDwlaWYgKCFnZW5Nb2RlbC51c2VHZW5lcmljcygpKSB7JT4oPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJqYXZhLnV0aWwuQ29sbGVjdGlvbiIpJT4pPCV9JT52YWx1ZSk7Ci0gIDwlfSBlbHNlIGlmIChnZW5Nb2RlbC5nZXRDb21wbGlhbmNlTGV2ZWwoKS5nZXRWYWx1ZSgpID49IEdlbkpES0xldmVsLkpESzUwKSB7JT4KLQkJc2V0VHlwZWRWYWx1ZSh2YWx1ZSk7Ci0gIDwlfSBlbHNlIGlmICh2YWx1ZUZlYXR1cmUuaXNQcmltaXRpdmVUeXBlKCkpIHslPgotCQlzZXRUeXBlZFZhbHVlKCgoPCU9dmFsdWVGZWF0dXJlLmdldE9iamVjdFR5cGUoZ2VuQ2xhc3MpJT4pdmFsdWUpLjwlPXZhbHVlRmVhdHVyZS5nZXRQcmltaXRpdmVWYWx1ZUZ1bmN0aW9uKCklPigpKTsKLSAgPCV9IGVsc2UgeyU+Ci0JCXNldFR5cGVkVmFsdWUoKDwlPXZhbHVlRmVhdHVyZS5nZXRJbXBvcnRlZFR5cGUoZ2VuQ2xhc3MpJT4pdmFsdWUpOwotICA8JX0lPgotCQlyZXR1cm4gb2xkVmFsdWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIDwlaWYgKGdlbk1vZGVsLnVzZUdlbmVyaWNzKCkpIHslPgotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICA8JX0lPgotCXB1YmxpYyA8JT1lTWFwVHlwZSU+IGdldEVNYXAoKQotCXsKLQkJPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCIpJT4gY29udGFpbmVyID0gZUNvbnRhaW5lcigpOwotCQlyZXR1cm4gY29udGFpbmVyID09IG51bGwgPyBudWxsIDogKDwlPWVNYXBUeXBlJT4pY29udGFpbmVyLmVHZXQoZUNvbnRhaW5tZW50RmVhdHVyZSgpKTsKLQl9Ci0KLTwlfSU+Ci08JUAgaW5jbHVkZSBmaWxlPSJDbGFzcy9pbnNlcnQuamF2YWpldGluYyIgZmFpbD0ic2lsZW50IiAlPgotfSAvLzwlPWlzSW50ZXJmYWNlID8gIiAiICsgZ2VuQ2xhc3MuZ2V0SW50ZXJmYWNlTmFtZSgpIDogZ2VuQ2xhc3MuZ2V0Q2xhc3NOYW1lKCklPgotPCUvLyBUT0RPIGZpeCB0aGUgc3BhY2UgYWJvdmUlPgotPCVnZW5Nb2RlbC5lbWl0U29ydGVkSW1wb3J0cygpOyU+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvLmNsYXNzcGF0aCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNjVhYzA2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0Ly5wcm9qZWN0IGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0Ly5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MjU5ZWZjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmVwZi51bWEuZWRpdDwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4NTViMGQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmVwZi51bWEuZWRpdDtzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1DbGFzc1BhdGg6IHVtYWVkaXQuamFyCi1CdW5kbGUtVmVyc2lvbjogMS41LjAucXVhbGlmaWVyCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUsCi0gb3JnLmVjbGlwc2UuZW1mLmVkaXQ7dmlzaWJpbGl0eTo9cmVleHBvcnQsCi0gb3JnLmVjbGlwc2UuZXBmLnVtYTt2aXNpYmlsaXR5Oj1yZWV4cG9ydAotRWNsaXBzZS1MYXp5U3RhcnQ6IHRydWUKLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQuY29tbWFuZCwKLSBvcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQuZG9tYWluLAotIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuVW1hRWRpdFBsdWdpbiRJbXBsZW1lbnRhdGlvbgotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvYnVpbGQucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MjgyZTBhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1zb3VyY2UudW1hZWRpdC5qYXIgPSBzcmMvCi1vdXRwdXQudW1hZWRpdC5qYXIgPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSB1bWFlZGl0LmphcixcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBpY29ucy8sXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMKLQotCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUFydGlmYWN0X2NvbnRhaW5lZEFydGlmYWN0c19BcnRpZmFjdC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUFydGlmYWN0X2NvbnRhaW5lZEFydGlmYWN0c19BcnRpZmFjdC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwMWQyMTkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVBcnRpZmFjdF9jb250YWluZWRBcnRpZmFjdHNfQXJ0aWZhY3QuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVCcmVha2Rvd25FbGVtZW50X3BsYW5uaW5nRGF0YV9QbGFubmluZ0RhdGEuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVCcmVha2Rvd25FbGVtZW50X3BsYW5uaW5nRGF0YV9QbGFubmluZ0RhdGEuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MDI5ZTI0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQnJlYWtkb3duRWxlbWVudF9wbGFubmluZ0RhdGFfUGxhbm5pbmdEYXRhLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudERlc2NyaXB0aW9uX3NlY3Rpb25zX1NlY3Rpb24uZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50RGVzY3JpcHRpb25fc2VjdGlvbnNfU2VjdGlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyMDZjMmUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50RGVzY3JpcHRpb25fc2VjdGlvbnNfU2VjdGlvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnREZXNjcmlwdGlvbl9zZWN0aW9uc19TdGVwLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudERlc2NyaXB0aW9uX3NlY3Rpb25zX1N0ZXAuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNzhjZDhhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudERlc2NyaXB0aW9uX3NlY3Rpb25zX1N0ZXAuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50RWxlbWVudF9wcmVzZW50YXRpb25fQWN0aXZpdHlEZXNjcmlwdGlvbi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRFbGVtZW50X3ByZXNlbnRhdGlvbl9BY3Rpdml0eURlc2NyaXB0aW9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2YyMGRlYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRFbGVtZW50X3ByZXNlbnRhdGlvbl9BY3Rpdml0eURlc2NyaXB0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudEVsZW1lbnRfcHJlc2VudGF0aW9uX0FydGlmYWN0RGVzY3JpcHRpb24uZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50RWxlbWVudF9wcmVzZW50YXRpb25fQXJ0aWZhY3REZXNjcmlwdGlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwMWQyMTkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50RWxlbWVudF9wcmVzZW50YXRpb25fQXJ0aWZhY3REZXNjcmlwdGlvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRFbGVtZW50X3ByZXNlbnRhdGlvbl9Db250ZW50RGVzY3JpcHRpb24uZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50RWxlbWVudF9wcmVzZW50YXRpb25fQ29udGVudERlc2NyaXB0aW9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTA2YjBmZi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRFbGVtZW50X3ByZXNlbnRhdGlvbl9Db250ZW50RGVzY3JpcHRpb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50RWxlbWVudF9wcmVzZW50YXRpb25fRGVsaXZlcmFibGVEZXNjcmlwdGlvbi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRFbGVtZW50X3ByZXNlbnRhdGlvbl9EZWxpdmVyYWJsZURlc2NyaXB0aW9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2ExMDU2My4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRFbGVtZW50X3ByZXNlbnRhdGlvbl9EZWxpdmVyYWJsZURlc2NyaXB0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudEVsZW1lbnRfcHJlc2VudGF0aW9uX0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudEVsZW1lbnRfcHJlc2VudGF0aW9uX0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2I0MDM2Mi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRFbGVtZW50X3ByZXNlbnRhdGlvbl9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRFbGVtZW50X3ByZXNlbnRhdGlvbl9HdWlkYW5jZURlc2NyaXB0aW9uLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudEVsZW1lbnRfcHJlc2VudGF0aW9uX0d1aWRhbmNlRGVzY3JpcHRpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NmY0NGY1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudEVsZW1lbnRfcHJlc2VudGF0aW9uX0d1aWRhbmNlRGVzY3JpcHRpb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50RWxlbWVudF9wcmVzZW50YXRpb25fUHJhY3RpY2VEZXNjcmlwdGlvbi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRFbGVtZW50X3ByZXNlbnRhdGlvbl9QcmFjdGljZURlc2NyaXB0aW9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjcyMDljYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRFbGVtZW50X3ByZXNlbnRhdGlvbl9QcmFjdGljZURlc2NyaXB0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudEVsZW1lbnRfcHJlc2VudGF0aW9uX1JvbGVEZXNjcmlwdGlvbi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRFbGVtZW50X3ByZXNlbnRhdGlvbl9Sb2xlRGVzY3JpcHRpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NmU4ODk2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudEVsZW1lbnRfcHJlc2VudGF0aW9uX1JvbGVEZXNjcmlwdGlvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRFbGVtZW50X3ByZXNlbnRhdGlvbl9UYXNrRGVzY3JpcHRpb24uZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50RWxlbWVudF9wcmVzZW50YXRpb25fVGFza0Rlc2NyaXB0aW9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWMzYjJiOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRFbGVtZW50X3ByZXNlbnRhdGlvbl9UYXNrRGVzY3JpcHRpb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50RWxlbWVudF9wcmVzZW50YXRpb25fV29ya1Byb2R1Y3REZXNjcmlwdGlvbi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRFbGVtZW50X3ByZXNlbnRhdGlvbl9Xb3JrUHJvZHVjdERlc2NyaXB0aW9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTU0MGYzZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRFbGVtZW50X3ByZXNlbnRhdGlvbl9Xb3JrUHJvZHVjdERlc2NyaXB0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudENhdGVnb3JpZXNfRGlzY2lwbGluZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRDYXRlZ29yaWVzX0Rpc2NpcGxpbmUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNWJkNDc2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudENhdGVnb3JpZXNfRGlzY2lwbGluZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRDYXRlZ29yaWVzX0Rpc2NpcGxpbmVDYXRlZ29yeS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRDYXRlZ29yaWVzX0Rpc2NpcGxpbmVDYXRlZ29yeS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1NTNjMWQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50Q2F0ZWdvcmllc19EaXNjaXBsaW5lQ2F0ZWdvcnkuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50Q2F0ZWdvcmllc19EaXNjaXBsaW5lR3JvdXBpbmcuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50Q2F0ZWdvcmllc19EaXNjaXBsaW5lR3JvdXBpbmcuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NTUzYzFkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudENhdGVnb3JpZXNfRGlzY2lwbGluZUdyb3VwaW5nLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudENhdGVnb3JpZXNfRG9tYWluLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudENhdGVnb3JpZXNfRG9tYWluLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2YyODkyNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRDYXRlZ29yaWVzX0RvbWFpbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRDYXRlZ29yaWVzX1JvbGVTZXQuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50Q2F0ZWdvcmllc19Sb2xlU2V0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTA5OWZlYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRDYXRlZ29yaWVzX1JvbGVTZXQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50Q2F0ZWdvcmllc19Sb2xlU2V0Q2F0ZWdvcnkuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50Q2F0ZWdvcmllc19Sb2xlU2V0Q2F0ZWdvcnkuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NGEzZjY3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudENhdGVnb3JpZXNfUm9sZVNldENhdGVnb3J5LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudENhdGVnb3JpZXNfUm9sZVNldEdyb3VwaW5nLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudENhdGVnb3JpZXNfUm9sZVNldEdyb3VwaW5nLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTRhM2Y2Ny4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRDYXRlZ29yaWVzX1JvbGVTZXRHcm91cGluZy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRDYXRlZ29yaWVzX1Rvb2wuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50Q2F0ZWdvcmllc19Ub29sLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGYxYjg1YS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRDYXRlZ29yaWVzX1Rvb2wuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50Q2F0ZWdvcmllc19Vc2VyRGVmaW5lZENhdGVnb3J5LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudENhdGVnb3JpZXNfVXNlckRlZmluZWRDYXRlZ29yeS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzOWU5ZjEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50Q2F0ZWdvcmllc19Vc2VyRGVmaW5lZENhdGVnb3J5LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudENhdGVnb3JpZXNfV29ya1Byb2R1Y3RUeXBlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudENhdGVnb3JpZXNfV29ya1Byb2R1Y3RUeXBlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTdlY2FjMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRDYXRlZ29yaWVzX1dvcmtQcm9kdWN0VHlwZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19BY3Rpdml0eS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19BY3Rpdml0eS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmMjBkZWIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfQWN0aXZpdHkuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfQXJ0aWZhY3QuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfQXJ0aWZhY3QuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MDFkMjE5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX0FydGlmYWN0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX0F0dGFjaG1lbnQuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfQXR0YWNobWVudC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3NTY4NWMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfQXR0YWNobWVudC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19DYXBhYmlsaXR5UGF0dGVybi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19DYXBhYmlsaXR5UGF0dGVybi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1ZmZiYjAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfQ2FwYWJpbGl0eVBhdHRlcm4uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfQ2hlY2tsaXN0LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX0NoZWNrbGlzdC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhNjVmMjMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfQ2hlY2tsaXN0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX0NvbmNlcHQuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfQ29uY2VwdC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkZjg0ZGEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfQ29uY2VwdC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19DdXN0b21DYXRlZ29yeS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19DdXN0b21DYXRlZ29yeS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmNDc5ODAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfQ3VzdG9tQ2F0ZWdvcnkuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfRGVsaXZlcmFibGUuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfRGVsaXZlcmFibGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYTEwNTYzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX0RlbGl2ZXJhYmxlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX0RlbGl2ZXJ5UHJvY2Vzcy5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19EZWxpdmVyeVByb2Nlc3MuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YjQwMzYyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX0RlbGl2ZXJ5UHJvY2Vzcy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19EaXNjaXBsaW5lLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX0Rpc2NpcGxpbmUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNWJkNDc2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX0Rpc2NpcGxpbmUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfRGlzY2lwbGluZUdyb3VwaW5nLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX0Rpc2NpcGxpbmVHcm91cGluZy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1NTNjMWQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfRGlzY2lwbGluZUdyb3VwaW5nLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX0RvbWFpbi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19Eb21haW4uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjI4OTI2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX0RvbWFpbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19Fc3RpbWF0ZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19Fc3RpbWF0ZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyNTU0YzIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfRXN0aW1hdGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfRXN0aW1hdGluZ0NvbnNpZGVyYXRpb25zLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX0VzdGltYXRpbmdDb25zaWRlcmF0aW9ucy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhYjM0YzYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfRXN0aW1hdGluZ0NvbnNpZGVyYXRpb25zLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX0VzdGltYXRpbmdNZXRyaWMuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfRXN0aW1hdGluZ01ldHJpYy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczMWY4M2QuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfRXN0aW1hdGluZ01ldHJpYy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19Fc3RpbWF0aW5nTW9kZWwuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfRXN0aW1hdGluZ01vZGVsLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzU4ZGFmYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19Fc3RpbWF0aW5nTW9kZWwuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX0VzdGltYXRpb25Db25zaWRlcmF0aW9ucy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmYzg0ZTQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX0V4YW1wbGUuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfRXhhbXBsZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiOTQ0ZmQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfRXhhbXBsZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19HdWlkZWxpbmUuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfR3VpZGVsaW5lLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjZmNDRmNS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19HdWlkZWxpbmUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfSXRlcmF0aW9uLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX0l0ZXJhdGlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzMTFlNDYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfSXRlcmF0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX0tpbmQuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfS2luZC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0ZjcxNTIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfS2luZC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19PdXRjb21lLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX091dGNvbWUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNzAzNTE4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX091dGNvbWUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfUGhhc2UuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfUGhhc2UuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZDYwYmQ5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX1BoYXNlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX1ByYWN0aWNlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX1ByYWN0aWNlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjcyMDljYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19QcmFjdGljZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19Qcm9jZXNzQ29udHJpYnV0aW9uLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX1Byb2Nlc3NDb250cmlidXRpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYjA5NWQ4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX1Byb2Nlc3NDb250cmlidXRpb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNzYzMjUxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX1Byb2Nlc3NQbGFubmluZ1RlbXBsYXRlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX1JlcG9ydC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19SZXBvcnQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NWYzZTBjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX1JlcG9ydC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19SZXVzYWJsZUFzc2V0LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX1JldXNhYmxlQXNzZXQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNTJjZmZlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX1JldXNhYmxlQXNzZXQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfUm9hZG1hcC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19Sb2FkbWFwLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjExYmM1ZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19Sb2FkbWFwLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX1JvbGUuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfUm9sZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2ZTg4OTYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfUm9sZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19Sb2xlU2V0LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX1JvbGVTZXQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MDk5ZmVhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX1JvbGVTZXQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfUm9sZVNldEdyb3VwaW5nLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX1JvbGVTZXRHcm91cGluZy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0YTNmNjcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfUm9sZVNldEdyb3VwaW5nLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX1N0ZXAuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfU3RlcC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlNDc2MjkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfU3RlcC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19TdXBwb3J0aW5nTWF0ZXJpYWwuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfU3VwcG9ydGluZ01hdGVyaWFsLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDVhMjFlYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19TdXBwb3J0aW5nTWF0ZXJpYWwuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfVGFzay5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19UYXNrLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWMzYjJiOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19UYXNrLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX1RlY2huaXF1ZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19UZWNobmlxdWUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZWRjNWI5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX1RlY2huaXF1ZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19UZW1wbGF0ZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19UZW1wbGF0ZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3NjMyNTEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfVGVtcGxhdGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfVGVybURlZmluaXRpb24uZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfVGVybURlZmluaXRpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMjFiZmUwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX1Rlcm1EZWZpbml0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX1Rvb2wuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfVG9vbC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmMWI4NWEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfVG9vbC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19Ub29sTWVudG9yLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX1Rvb2xNZW50b3IuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZjFiODVhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX1Rvb2xNZW50b3IuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfVHJhaW5pbmdDbGFzcy5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19UcmFpbmluZ0NsYXNzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDEzMjk1My4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19UcmFpbmluZ0NsYXNzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX1RyYWluaW5nTW9kdWxlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX1RyYWluaW5nTW9kdWxlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjRmNzE1Mi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19UcmFpbmluZ01vZHVsZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19Vc2VyRGVmaW5lZENhdGVnb3J5LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX1VzZXJEZWZpbmVkQ2F0ZWdvcnkuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZjQ3OTgwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX1VzZXJEZWZpbmVkQ2F0ZWdvcnkuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfV2hpdGVwYXBlci5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19XaGl0ZXBhcGVyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTViNDgwMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19XaGl0ZXBhcGVyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX1dvcmtQcm9kdWN0LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX1dvcmtQcm9kdWN0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDhmNTIzMy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19Xb3JrUHJvZHVjdC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19Xb3JrUHJvZHVjdEd1aWRlbGluZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19Xb3JrUHJvZHVjdEd1aWRlbGluZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2ZjQ0ZjUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfV29ya1Byb2R1Y3RHdWlkZWxpbmUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfV29ya1Byb2R1Y3RUeXBlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX1dvcmtQcm9kdWN0VHlwZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3ZWNhYzAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfV29ya1Byb2R1Y3RUeXBlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ3VzdG9tQ2F0ZWdvcnlfc3ViQ2F0ZWdvcmllc19DdXN0b21DYXRlZ29yeS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUN1c3RvbUNhdGVnb3J5X3N1YkNhdGVnb3JpZXNfQ3VzdG9tQ2F0ZWdvcnkuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZjQ3OTgwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ3VzdG9tQ2F0ZWdvcnlfc3ViQ2F0ZWdvcmllc19DdXN0b21DYXRlZ29yeS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZURlc2NyaWJhYmxlRWxlbWVudF9wcmVzZW50YXRpb25fQWN0aXZpdHlEZXNjcmlwdGlvbi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZURlc2NyaWJhYmxlRWxlbWVudF9wcmVzZW50YXRpb25fQWN0aXZpdHlEZXNjcmlwdGlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmMjBkZWIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVEZXNjcmliYWJsZUVsZW1lbnRfcHJlc2VudGF0aW9uX0FjdGl2aXR5RGVzY3JpcHRpb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVEZXNjcmliYWJsZUVsZW1lbnRfcHJlc2VudGF0aW9uX0FydGlmYWN0RGVzY3JpcHRpb24uZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVEZXNjcmliYWJsZUVsZW1lbnRfcHJlc2VudGF0aW9uX0FydGlmYWN0RGVzY3JpcHRpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MDFkMjE5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRGVzY3JpYmFibGVFbGVtZW50X3ByZXNlbnRhdGlvbl9BcnRpZmFjdERlc2NyaXB0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRGVzY3JpYmFibGVFbGVtZW50X3ByZXNlbnRhdGlvbl9CcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24uZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVEZXNjcmliYWJsZUVsZW1lbnRfcHJlc2VudGF0aW9uX0JyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkMThlYzIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVEZXNjcmliYWJsZUVsZW1lbnRfcHJlc2VudGF0aW9uX0JyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZURlc2NyaWJhYmxlRWxlbWVudF9wcmVzZW50YXRpb25fQ29udGVudERlc2NyaXB0aW9uLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRGVzY3JpYmFibGVFbGVtZW50X3ByZXNlbnRhdGlvbl9Db250ZW50RGVzY3JpcHRpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMDZiMGZmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRGVzY3JpYmFibGVFbGVtZW50X3ByZXNlbnRhdGlvbl9Db250ZW50RGVzY3JpcHRpb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVEZXNjcmliYWJsZUVsZW1lbnRfcHJlc2VudGF0aW9uX0RlbGl2ZXJhYmxlRGVzY3JpcHRpb24uZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVEZXNjcmliYWJsZUVsZW1lbnRfcHJlc2VudGF0aW9uX0RlbGl2ZXJhYmxlRGVzY3JpcHRpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYTEwNTYzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRGVzY3JpYmFibGVFbGVtZW50X3ByZXNlbnRhdGlvbl9EZWxpdmVyYWJsZURlc2NyaXB0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRGVzY3JpYmFibGVFbGVtZW50X3ByZXNlbnRhdGlvbl9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZURlc2NyaWJhYmxlRWxlbWVudF9wcmVzZW50YXRpb25fRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YjQwMzYyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRGVzY3JpYmFibGVFbGVtZW50X3ByZXNlbnRhdGlvbl9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZURlc2NyaWJhYmxlRWxlbWVudF9wcmVzZW50YXRpb25fRGVzY3JpcHRvckRlc2NyaXB0aW9uLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRGVzY3JpYmFibGVFbGVtZW50X3ByZXNlbnRhdGlvbl9EZXNjcmlwdG9yRGVzY3JpcHRpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OWVkMmM5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRGVzY3JpYmFibGVFbGVtZW50X3ByZXNlbnRhdGlvbl9EZXNjcmlwdG9yRGVzY3JpcHRpb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVEZXNjcmliYWJsZUVsZW1lbnRfcHJlc2VudGF0aW9uX0d1aWRhbmNlRGVzY3JpcHRpb24uZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVEZXNjcmliYWJsZUVsZW1lbnRfcHJlc2VudGF0aW9uX0d1aWRhbmNlRGVzY3JpcHRpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NmY0NGY1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRGVzY3JpYmFibGVFbGVtZW50X3ByZXNlbnRhdGlvbl9HdWlkYW5jZURlc2NyaXB0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRGVzY3JpYmFibGVFbGVtZW50X3ByZXNlbnRhdGlvbl9QcmFjdGljZURlc2NyaXB0aW9uLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRGVzY3JpYmFibGVFbGVtZW50X3ByZXNlbnRhdGlvbl9QcmFjdGljZURlc2NyaXB0aW9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjcyMDljYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZURlc2NyaWJhYmxlRWxlbWVudF9wcmVzZW50YXRpb25fUHJhY3RpY2VEZXNjcmlwdGlvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZURlc2NyaWJhYmxlRWxlbWVudF9wcmVzZW50YXRpb25fUHJvY2Vzc0Rlc2NyaXB0aW9uLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRGVzY3JpYmFibGVFbGVtZW50X3ByZXNlbnRhdGlvbl9Qcm9jZXNzRGVzY3JpcHRpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZWFjNTlmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRGVzY3JpYmFibGVFbGVtZW50X3ByZXNlbnRhdGlvbl9Qcm9jZXNzRGVzY3JpcHRpb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVEZXNjcmliYWJsZUVsZW1lbnRfcHJlc2VudGF0aW9uX1JvbGVEZXNjcmlwdGlvbi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZURlc2NyaWJhYmxlRWxlbWVudF9wcmVzZW50YXRpb25fUm9sZURlc2NyaXB0aW9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzZlODg5Ni4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZURlc2NyaWJhYmxlRWxlbWVudF9wcmVzZW50YXRpb25fUm9sZURlc2NyaXB0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRGVzY3JpYmFibGVFbGVtZW50X3ByZXNlbnRhdGlvbl9UYXNrRGVzY3JpcHRpb24uZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVEZXNjcmliYWJsZUVsZW1lbnRfcHJlc2VudGF0aW9uX1Rhc2tEZXNjcmlwdGlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjM2IyYjguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVEZXNjcmliYWJsZUVsZW1lbnRfcHJlc2VudGF0aW9uX1Rhc2tEZXNjcmlwdGlvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZURlc2NyaWJhYmxlRWxlbWVudF9wcmVzZW50YXRpb25fV29ya1Byb2R1Y3REZXNjcmlwdGlvbi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZURlc2NyaWJhYmxlRWxlbWVudF9wcmVzZW50YXRpb25fV29ya1Byb2R1Y3REZXNjcmlwdGlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1NDBmM2QuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVEZXNjcmliYWJsZUVsZW1lbnRfcHJlc2VudGF0aW9uX1dvcmtQcm9kdWN0RGVzY3JpcHRpb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVEaWFncmFtRWxlbWVudF9wcm9wZXJ0eV9Qcm9wZXJ0eS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZURpYWdyYW1FbGVtZW50X3Byb3BlcnR5X1Byb3BlcnR5LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTMyYTdiNS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZURpYWdyYW1FbGVtZW50X3Byb3BlcnR5X1Byb3BlcnR5LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRGlhZ3JhbUxpbmtfdmlld3BvcnRfUG9pbnQuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVEaWFncmFtTGlua192aWV3cG9ydF9Qb2ludC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlNzM0YzcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVEaWFncmFtTGlua192aWV3cG9ydF9Qb2ludC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZURpYWdyYW1fbmFtZXNwYWNlX0NvcmVTZW1hbnRpY01vZGVsQnJpZGdlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRGlhZ3JhbV9uYW1lc3BhY2VfQ29yZVNlbWFudGljTW9kZWxCcmlkZ2UuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NDVlOWY0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRGlhZ3JhbV9uYW1lc3BhY2VfQ29yZVNlbWFudGljTW9kZWxCcmlkZ2UuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVEaWFncmFtX25hbWVzcGFjZV9TaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZURpYWdyYW1fbmFtZXNwYWNlX1NpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDgyZjIyNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZURpYWdyYW1fbmFtZXNwYWNlX1NpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRGlhZ3JhbV9uYW1lc3BhY2VfVU1BU2VtYW50aWNNb2RlbEJyaWRnZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZURpYWdyYW1fbmFtZXNwYWNlX1VNQVNlbWFudGljTW9kZWxCcmlkZ2UuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ODlmM2FmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRGlhZ3JhbV9uYW1lc3BhY2VfVU1BU2VtYW50aWNNb2RlbEJyaWRnZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZURpYWdyYW1fdmlld3BvaW50X1BvaW50LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRGlhZ3JhbV92aWV3cG9pbnRfUG9pbnQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZGQ1OGUxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRGlhZ3JhbV92aWV3cG9pbnRfUG9pbnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVEaXNjaXBsaW5lX3N1YmRpc2NpcGxpbmVfRGlzY2lwbGluZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZURpc2NpcGxpbmVfc3ViZGlzY2lwbGluZV9EaXNjaXBsaW5lLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTI5YjMxMy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZURpc2NpcGxpbmVfc3ViZGlzY2lwbGluZV9EaXNjaXBsaW5lLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRG9tYWluX3N1YmRvbWFpbl9Eb21haW4uZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVEb21haW5fc3ViZG9tYWluX0RvbWFpbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmMjg5MjYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVEb21haW5fc3ViZG9tYWluX0RvbWFpbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZURvbWFpbl9zdWJkb21haW5zX0RvbWFpbi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZURvbWFpbl9zdWJkb21haW5zX0RvbWFpbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmMjg5MjYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVEb21haW5fc3ViZG9tYWluc19Eb21haW4uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVFbGxpcHNlX2NlbnRlcl9Qb2ludC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUVsbGlwc2VfY2VudGVyX1BvaW50LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2E0ZTlhZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUVsbGlwc2VfY2VudGVyX1BvaW50LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRXN0aW1hdGVfZXN0aW1hdGlvbkNvbmRlcmF0aW9uc19Fc3RpbWF0aW5nQ29uc2lkZXJhdGlvbnMuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVFc3RpbWF0ZV9lc3RpbWF0aW9uQ29uZGVyYXRpb25zX0VzdGltYXRpbmdDb25zaWRlcmF0aW9ucy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5NTE2ODkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVFc3RpbWF0ZV9lc3RpbWF0aW9uQ29uZGVyYXRpb25zX0VzdGltYXRpbmdDb25zaWRlcmF0aW9ucy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUVzdGltYXRlX2VzdGltYXRpb25Db25kZXJhdGlvbnNfRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRXN0aW1hdGVfZXN0aW1hdGlvbkNvbmRlcmF0aW9uc19Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZmM4NGU0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRXN0aW1hdGVfZXN0aW1hdGlvbkNvbmRlcmF0aW9uc19Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVFc3RpbWF0ZV9lc3RpbWF0aW9uTWV0cmljX0VzdGltYXRpbmdNZXRyaWMuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVFc3RpbWF0ZV9lc3RpbWF0aW9uTWV0cmljX0VzdGltYXRpbmdNZXRyaWMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYWQzMGJiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRXN0aW1hdGVfZXN0aW1hdGlvbk1ldHJpY19Fc3RpbWF0aW5nTWV0cmljLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRXN0aW1hdGVfdXNlZEVzdGltYXRpbmdQYXJhbWV0ZXJfU3VtbWl0RXN0aW1hdGluZ1BhcmFtZXRlci5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUVzdGltYXRlX3VzZWRFc3RpbWF0aW5nUGFyYW1ldGVyX1N1bW1pdEVzdGltYXRpbmdQYXJhbWV0ZXIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOTFkMGIzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRXN0aW1hdGVfdXNlZEVzdGltYXRpbmdQYXJhbWV0ZXJfU3VtbWl0RXN0aW1hdGluZ1BhcmFtZXRlci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUVzdGltYXRlZE1ldGhvZEVsZW1lbnRfZXN0aW1hdGVfRXN0aW1hdGUuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVFc3RpbWF0ZWRNZXRob2RFbGVtZW50X2VzdGltYXRlX0VzdGltYXRlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjg0NGJmOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUVzdGltYXRlZE1ldGhvZEVsZW1lbnRfZXN0aW1hdGVfRXN0aW1hdGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVFc3RpbWF0aW5nTW9kZWxfb3duZWRFc3RpbWF0aW5nUGFyYW1ldGVyX1N1bW1pdEVzdGltYXRpbmdQYXJhbWV0ZXIuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVFc3RpbWF0aW5nTW9kZWxfb3duZWRFc3RpbWF0aW5nUGFyYW1ldGVyX1N1bW1pdEVzdGltYXRpbmdQYXJhbWV0ZXIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZTNiOTlmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRXN0aW1hdGluZ01vZGVsX293bmVkRXN0aW1hdGluZ1BhcmFtZXRlcl9TdW1taXRFc3RpbWF0aW5nUGFyYW1ldGVyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRXN0aW1hdGluZ1BhcmFtZXRlck93bmVyX293bmVkRXN0aW1hdGluZ1BhcmFtZXRlcl9Fc3RpbWF0aW5nUGFyYW1ldGVyLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRXN0aW1hdGluZ1BhcmFtZXRlck93bmVyX293bmVkRXN0aW1hdGluZ1BhcmFtZXRlcl9Fc3RpbWF0aW5nUGFyYW1ldGVyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDA3MjIwYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUVzdGltYXRpbmdQYXJhbWV0ZXJPd25lcl9vd25lZEVzdGltYXRpbmdQYXJhbWV0ZXJfRXN0aW1hdGluZ1BhcmFtZXRlci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUdyYXBoQ29ubmVjdG9yX3Bvc2l0aW9uX1BvaW50LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlR3JhcGhDb25uZWN0b3JfcG9zaXRpb25fUG9pbnQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYzczNjJhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlR3JhcGhDb25uZWN0b3JfcG9zaXRpb25fUG9pbnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVHcmFwaEVkZ2Vfd2F5cG9pbnRzX1BvaW50LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlR3JhcGhFZGdlX3dheXBvaW50c19Qb2ludC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxNTRlNTcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVHcmFwaEVkZ2Vfd2F5cG9pbnRzX1BvaW50LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlR3JhcGhFbGVtZW50X2FuY2hvcmFnZV9HcmFwaENvbm5lY3Rvci5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUdyYXBoRWxlbWVudF9hbmNob3JhZ2VfR3JhcGhDb25uZWN0b3IuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMzAzNzYxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlR3JhcGhFbGVtZW50X2FuY2hvcmFnZV9HcmFwaENvbm5lY3Rvci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUdyYXBoRWxlbWVudF9jb250YWluZWRfQ29yZVNlbWFudGljTW9kZWxCcmlkZ2UuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVHcmFwaEVsZW1lbnRfY29udGFpbmVkX0NvcmVTZW1hbnRpY01vZGVsQnJpZGdlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWZlNDBjNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUdyYXBoRWxlbWVudF9jb250YWluZWRfQ29yZVNlbWFudGljTW9kZWxCcmlkZ2UuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVHcmFwaEVsZW1lbnRfY29udGFpbmVkX0RpYWdyYW0uZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVHcmFwaEVsZW1lbnRfY29udGFpbmVkX0RpYWdyYW0uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOWNkODc4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlR3JhcGhFbGVtZW50X2NvbnRhaW5lZF9EaWFncmFtLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlR3JhcGhFbGVtZW50X2NvbnRhaW5lZF9EaWFncmFtTGluay5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUdyYXBoRWxlbWVudF9jb250YWluZWRfRGlhZ3JhbUxpbmsuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZjdlZTUyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlR3JhcGhFbGVtZW50X2NvbnRhaW5lZF9EaWFncmFtTGluay5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUdyYXBoRWxlbWVudF9jb250YWluZWRfRWxsaXBzZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUdyYXBoRWxlbWVudF9jb250YWluZWRfRWxsaXBzZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlNmU2MjguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVHcmFwaEVsZW1lbnRfY29udGFpbmVkX0VsbGlwc2UuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVHcmFwaEVsZW1lbnRfY29udGFpbmVkX0dyYXBoQ29ubmVjdG9yLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlR3JhcGhFbGVtZW50X2NvbnRhaW5lZF9HcmFwaENvbm5lY3Rvci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzMDM3NjEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVHcmFwaEVsZW1lbnRfY29udGFpbmVkX0dyYXBoQ29ubmVjdG9yLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlR3JhcGhFbGVtZW50X2NvbnRhaW5lZF9HcmFwaEVkZ2UuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVHcmFwaEVsZW1lbnRfY29udGFpbmVkX0dyYXBoRWRnZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4OTE4ODIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVHcmFwaEVsZW1lbnRfY29udGFpbmVkX0dyYXBoRWRnZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUdyYXBoRWxlbWVudF9jb250YWluZWRfR3JhcGhOb2RlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlR3JhcGhFbGVtZW50X2NvbnRhaW5lZF9HcmFwaE5vZGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMDY1MjAzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlR3JhcGhFbGVtZW50X2NvbnRhaW5lZF9HcmFwaE5vZGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVHcmFwaEVsZW1lbnRfY29udGFpbmVkX0ltYWdlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlR3JhcGhFbGVtZW50X2NvbnRhaW5lZF9JbWFnZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0Zjk5ZTYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVHcmFwaEVsZW1lbnRfY29udGFpbmVkX0ltYWdlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlR3JhcGhFbGVtZW50X2NvbnRhaW5lZF9Qb2x5bGluZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUdyYXBoRWxlbWVudF9jb250YWluZWRfUG9seWxpbmUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOGYxNWM1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlR3JhcGhFbGVtZW50X2NvbnRhaW5lZF9Qb2x5bGluZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUdyYXBoRWxlbWVudF9jb250YWluZWRfUHJvcGVydHkuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVHcmFwaEVsZW1lbnRfY29udGFpbmVkX1Byb3BlcnR5LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTMyYTdiNS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUdyYXBoRWxlbWVudF9jb250YWluZWRfUHJvcGVydHkuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVHcmFwaEVsZW1lbnRfY29udGFpbmVkX1JlZmVyZW5jZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUdyYXBoRWxlbWVudF9jb250YWluZWRfUmVmZXJlbmNlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTMwMzc2MS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUdyYXBoRWxlbWVudF9jb250YWluZWRfUmVmZXJlbmNlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlR3JhcGhFbGVtZW50X2NvbnRhaW5lZF9TaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUdyYXBoRWxlbWVudF9jb250YWluZWRfU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNDIwNjA0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlR3JhcGhFbGVtZW50X2NvbnRhaW5lZF9TaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUdyYXBoRWxlbWVudF9jb250YWluZWRfVGV4dEVsZW1lbnQuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVHcmFwaEVsZW1lbnRfY29udGFpbmVkX1RleHRFbGVtZW50LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDA2NTIwMy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUdyYXBoRWxlbWVudF9jb250YWluZWRfVGV4dEVsZW1lbnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVHcmFwaEVsZW1lbnRfY29udGFpbmVkX1VNQVNlbWFudGljTW9kZWxCcmlkZ2UuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVHcmFwaEVsZW1lbnRfY29udGFpbmVkX1VNQVNlbWFudGljTW9kZWxCcmlkZ2UuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwY2YyN2IyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlR3JhcGhFbGVtZW50X2NvbnRhaW5lZF9VTUFTZW1hbnRpY01vZGVsQnJpZGdlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlR3JhcGhFbGVtZW50X2xpbmtfRGlhZ3JhbUxpbmsuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVHcmFwaEVsZW1lbnRfbGlua19EaWFncmFtTGluay5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmN2VlNTIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVHcmFwaEVsZW1lbnRfbGlua19EaWFncmFtTGluay5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUdyYXBoRWxlbWVudF9wb3NpdGlvbl9Qb2ludC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUdyYXBoRWxlbWVudF9wb3NpdGlvbl9Qb2ludC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyZDQwN2UuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVHcmFwaEVsZW1lbnRfcG9zaXRpb25fUG9pbnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVHcmFwaEVsZW1lbnRfc2VtYW50aWNNb2RlbF9Db3JlU2VtYW50aWNNb2RlbEJyaWRnZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUdyYXBoRWxlbWVudF9zZW1hbnRpY01vZGVsX0NvcmVTZW1hbnRpY01vZGVsQnJpZGdlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWZlNDBjNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUdyYXBoRWxlbWVudF9zZW1hbnRpY01vZGVsX0NvcmVTZW1hbnRpY01vZGVsQnJpZGdlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlR3JhcGhFbGVtZW50X3NlbWFudGljTW9kZWxfU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnQuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVHcmFwaEVsZW1lbnRfc2VtYW50aWNNb2RlbF9TaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0MjA2MDQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVHcmFwaEVsZW1lbnRfc2VtYW50aWNNb2RlbF9TaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUdyYXBoRWxlbWVudF9zZW1hbnRpY01vZGVsX1VNQVNlbWFudGljTW9kZWxCcmlkZ2UuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVHcmFwaEVsZW1lbnRfc2VtYW50aWNNb2RlbF9VTUFTZW1hbnRpY01vZGVsQnJpZGdlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGNmMjdiMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUdyYXBoRWxlbWVudF9zZW1hbnRpY01vZGVsX1VNQVNlbWFudGljTW9kZWxCcmlkZ2UuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVHcmFwaE5vZGVfc2l6ZV9EaW1lbnNpb24uZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVHcmFwaE5vZGVfc2l6ZV9EaW1lbnNpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjY2Q5Mjg5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlR3JhcGhOb2RlX3NpemVfRGltZW5zaW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlS2luZF9hcHBsaWNhYmxlTWV0YUNsYXNzSW5mb19BcHBsaWNhYmxlTWV0YUNsYXNzSW5mby5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUtpbmRfYXBwbGljYWJsZU1ldGFDbGFzc0luZm9fQXBwbGljYWJsZU1ldGFDbGFzc0luZm8uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYWIxZmJjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlS2luZF9hcHBsaWNhYmxlTWV0YUNsYXNzSW5mb19BcHBsaWNhYmxlTWV0YUNsYXNzSW5mby5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZU1ldGhvZEVsZW1lbnRfbWV0aG9kRWxlbWVudFByb3BlcnR5X01ldGhvZEVsZW1lbnRQcm9wZXJ0eS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZU1ldGhvZEVsZW1lbnRfbWV0aG9kRWxlbWVudFByb3BlcnR5X01ldGhvZEVsZW1lbnRQcm9wZXJ0eS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiMmMzZWIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVNZXRob2RFbGVtZW50X21ldGhvZEVsZW1lbnRQcm9wZXJ0eV9NZXRob2RFbGVtZW50UHJvcGVydHkuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVNZXRob2RFbGVtZW50X293bmVkUnVsZXNfQ29uc3RyYWludC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZU1ldGhvZEVsZW1lbnRfb3duZWRSdWxlc19Db25zdHJhaW50LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmNkMzJmNy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZU1ldGhvZEVsZW1lbnRfb3duZWRSdWxlc19Db25zdHJhaW50LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlTWV0aG9kTGlicmFyeV9tZXRob2RNb2RlbHNfTWV0aG9kTW9kZWwuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVNZXRob2RMaWJyYXJ5X21ldGhvZE1vZGVsc19NZXRob2RNb2RlbC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiODJjMzkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVNZXRob2RMaWJyYXJ5X21ldGhvZE1vZGVsc19NZXRob2RNb2RlbC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZU1ldGhvZExpYnJhcnlfbWV0aG9kUGx1Z2luc19NZXRob2RQbHVnaW4uZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVNZXRob2RMaWJyYXJ5X21ldGhvZFBsdWdpbnNfTWV0aG9kUGx1Z2luLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmI4MmMzOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZU1ldGhvZExpYnJhcnlfbWV0aG9kUGx1Z2luc19NZXRob2RQbHVnaW4uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVNZXRob2RMaWJyYXJ5X3ByZWRlZmluZWRDb25maWd1cmF0aW9uc19NZXRob2RDb25maWd1cmF0aW9uLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlTWV0aG9kTGlicmFyeV9wcmVkZWZpbmVkQ29uZmlndXJhdGlvbnNfTWV0aG9kQ29uZmlndXJhdGlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlODk2MDIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVNZXRob2RMaWJyYXJ5X3ByZWRlZmluZWRDb25maWd1cmF0aW9uc19NZXRob2RDb25maWd1cmF0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlTWV0aG9kTGlicmFyeV9wcmVkZWZpbmVkQ29uZmlndXJhdGlvbnNfUHJvY2Vzc0ZhbWlseS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZU1ldGhvZExpYnJhcnlfcHJlZGVmaW5lZENvbmZpZ3VyYXRpb25zX1Byb2Nlc3NGYW1pbHkuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NDY3ZDQyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlTWV0aG9kTGlicmFyeV9wcmVkZWZpbmVkQ29uZmlndXJhdGlvbnNfUHJvY2Vzc0ZhbWlseS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZU1ldGhvZE1vZGVsX21ldGhvZFBhY2thZ2VzX0NvbnRlbnRQYWNrYWdlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlTWV0aG9kTW9kZWxfbWV0aG9kUGFja2FnZXNfQ29udGVudFBhY2thZ2UuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMGEzMTFlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlTWV0aG9kTW9kZWxfbWV0aG9kUGFja2FnZXNfQ29udGVudFBhY2thZ2UuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVNZXRob2RNb2RlbF9tZXRob2RQYWNrYWdlc19Qcm9jZXNzQ29tcG9uZW50LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlTWV0aG9kTW9kZWxfbWV0aG9kUGFja2FnZXNfUHJvY2Vzc0NvbXBvbmVudC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlYWM1OWYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVNZXRob2RNb2RlbF9tZXRob2RQYWNrYWdlc19Qcm9jZXNzQ29tcG9uZW50LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlTWV0aG9kTW9kZWxfbWV0aG9kUGFja2FnZXNfUHJvY2Vzc1BhY2thZ2UuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVNZXRob2RNb2RlbF9tZXRob2RQYWNrYWdlc19Qcm9jZXNzUGFja2FnZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4ZDhjMmQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVNZXRob2RNb2RlbF9tZXRob2RQYWNrYWdlc19Qcm9jZXNzUGFja2FnZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZU1ldGhvZFBhY2thZ2VfY2hpbGRQYWNrYWdlc19Db250ZW50UGFja2FnZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZU1ldGhvZFBhY2thZ2VfY2hpbGRQYWNrYWdlc19Db250ZW50UGFja2FnZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwYTMxMWUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVNZXRob2RQYWNrYWdlX2NoaWxkUGFja2FnZXNfQ29udGVudFBhY2thZ2UuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVNZXRob2RQYWNrYWdlX2NoaWxkUGFja2FnZXNfUHJvY2Vzc0NvbXBvbmVudC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZU1ldGhvZFBhY2thZ2VfY2hpbGRQYWNrYWdlc19Qcm9jZXNzQ29tcG9uZW50LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGVhYzU5Zi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZU1ldGhvZFBhY2thZ2VfY2hpbGRQYWNrYWdlc19Qcm9jZXNzQ29tcG9uZW50LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlTWV0aG9kUGFja2FnZV9jaGlsZFBhY2thZ2VzX1Byb2Nlc3NQYWNrYWdlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlTWV0aG9kUGFja2FnZV9jaGlsZFBhY2thZ2VzX1Byb2Nlc3NQYWNrYWdlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDhkOGMyZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZU1ldGhvZFBhY2thZ2VfY2hpbGRQYWNrYWdlc19Qcm9jZXNzUGFja2FnZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZU1ldGhvZFBsdWdpbl9tZXRob2RQYWNrYWdlc19Db250ZW50UGFja2FnZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZU1ldGhvZFBsdWdpbl9tZXRob2RQYWNrYWdlc19Db250ZW50UGFja2FnZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwYTMxMWUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVNZXRob2RQbHVnaW5fbWV0aG9kUGFja2FnZXNfQ29udGVudFBhY2thZ2UuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVNZXRob2RQbHVnaW5fbWV0aG9kUGFja2FnZXNfUHJvY2Vzc0NvbXBvbmVudC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZU1ldGhvZFBsdWdpbl9tZXRob2RQYWNrYWdlc19Qcm9jZXNzQ29tcG9uZW50LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGVhYzU5Zi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZU1ldGhvZFBsdWdpbl9tZXRob2RQYWNrYWdlc19Qcm9jZXNzQ29tcG9uZW50LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlTWV0aG9kUGx1Z2luX21ldGhvZFBhY2thZ2VzX1Byb2Nlc3NQYWNrYWdlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlTWV0aG9kUGx1Z2luX21ldGhvZFBhY2thZ2VzX1Byb2Nlc3NQYWNrYWdlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDhkOGMyZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZU1ldGhvZFBsdWdpbl9tZXRob2RQYWNrYWdlc19Qcm9jZXNzUGFja2FnZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVBvbHlsaW5lX3dheXBvaW50c19Qb2ludC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVBvbHlsaW5lX3dheXBvaW50c19Qb2ludC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzNzAzZGIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQb2x5bGluZV93YXlwb2ludHNfUG9pbnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcmFjdGljZV9zdWJQcmFjdGljZV9QcmFjdGljZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByYWN0aWNlX3N1YlByYWN0aWNlX1ByYWN0aWNlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjcyMDljYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByYWN0aWNlX3N1YlByYWN0aWNlX1ByYWN0aWNlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJhY3RpY2Vfc3ViUHJhY3RpY2VzX1ByYWN0aWNlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJhY3RpY2Vfc3ViUHJhY3RpY2VzX1ByYWN0aWNlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjcyMDljYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByYWN0aWNlX3N1YlByYWN0aWNlc19QcmFjdGljZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VfaW50ZXJmYWNlSU9fV29ya1Byb2R1Y3REZXNjcmlwdG9yLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZV9pbnRlcmZhY2VJT19Xb3JrUHJvZHVjdERlc2NyaXB0b3IuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MjE4MjI5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZV9pbnRlcmZhY2VJT19Xb3JrUHJvZHVjdERlc2NyaXB0b3IuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlX2ludGVyZmFjZVNwZWNpZmljYXRpb25zX1Rhc2tEZXNjcmlwdG9yLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZV9pbnRlcmZhY2VTcGVjaWZpY2F0aW9uc19UYXNrRGVzY3JpcHRvci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1NGUyNmUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlX2ludGVyZmFjZVNwZWNpZmljYXRpb25zX1Rhc2tEZXNjcmlwdG9yLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc0NvbXBvbmVudF9wcm9jZXNzX0NhcGFiaWxpdHlQYXR0ZXJuLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc0NvbXBvbmVudF9wcm9jZXNzX0NhcGFiaWxpdHlQYXR0ZXJuLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTVmZmJiMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NDb21wb25lbnRfcHJvY2Vzc19DYXBhYmlsaXR5UGF0dGVybi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NDb21wb25lbnRfcHJvY2Vzc19EZWxpdmVyeVByb2Nlc3MuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzQ29tcG9uZW50X3Byb2Nlc3NfRGVsaXZlcnlQcm9jZXNzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2I0MDM2Mi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NDb21wb25lbnRfcHJvY2Vzc19EZWxpdmVyeVByb2Nlc3MuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzQ29tcG9uZW50X3Byb2Nlc3NfUHJvY2Vzc0NvbnRyaWJ1dGlvbi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NDb21wb25lbnRfcHJvY2Vzc19Qcm9jZXNzQ29udHJpYnV0aW9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmIwOTVkOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NDb21wb25lbnRfcHJvY2Vzc19Qcm9jZXNzQ29udHJpYnV0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc0NvbXBvbmVudF9wcm9jZXNzX1Byb2Nlc3NQbGFubmluZ1RlbXBsYXRlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc0NvbXBvbmVudF9wcm9jZXNzX1Byb2Nlc3NQbGFubmluZ1RlbXBsYXRlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTljMWEwOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NDb21wb25lbnRfcHJvY2Vzc19Qcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NFbGVtZW50X3ByZXNlbnRhdGlvbl9BY3Rpdml0eURlc2NyaXB0aW9uLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc0VsZW1lbnRfcHJlc2VudGF0aW9uX0FjdGl2aXR5RGVzY3JpcHRpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjIwZGViLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc0VsZW1lbnRfcHJlc2VudGF0aW9uX0FjdGl2aXR5RGVzY3JpcHRpb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzRWxlbWVudF9wcmVzZW50YXRpb25fQXJ0aWZhY3REZXNjcmlwdGlvbi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NFbGVtZW50X3ByZXNlbnRhdGlvbl9BcnRpZmFjdERlc2NyaXB0aW9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTAxZDIxOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NFbGVtZW50X3ByZXNlbnRhdGlvbl9BcnRpZmFjdERlc2NyaXB0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc0VsZW1lbnRfcHJlc2VudGF0aW9uX0NvbnRlbnREZXNjcmlwdGlvbi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NFbGVtZW50X3ByZXNlbnRhdGlvbl9Db250ZW50RGVzY3JpcHRpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZmYyMzQyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc0VsZW1lbnRfcHJlc2VudGF0aW9uX0NvbnRlbnREZXNjcmlwdGlvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NFbGVtZW50X3ByZXNlbnRhdGlvbl9EZWxpdmVyYWJsZURlc2NyaXB0aW9uLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc0VsZW1lbnRfcHJlc2VudGF0aW9uX0RlbGl2ZXJhYmxlRGVzY3JpcHRpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYTEwNTYzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc0VsZW1lbnRfcHJlc2VudGF0aW9uX0RlbGl2ZXJhYmxlRGVzY3JpcHRpb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzRWxlbWVudF9wcmVzZW50YXRpb25fRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24uZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzRWxlbWVudF9wcmVzZW50YXRpb25fRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YjQwMzYyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc0VsZW1lbnRfcHJlc2VudGF0aW9uX0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc0VsZW1lbnRfcHJlc2VudGF0aW9uX0d1aWRhbmNlRGVzY3JpcHRpb24uZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzRWxlbWVudF9wcmVzZW50YXRpb25fR3VpZGFuY2VEZXNjcmlwdGlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2ZjQ0ZjUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzRWxlbWVudF9wcmVzZW50YXRpb25fR3VpZGFuY2VEZXNjcmlwdGlvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NFbGVtZW50X3ByZXNlbnRhdGlvbl9QcmFjdGljZURlc2NyaXB0aW9uLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc0VsZW1lbnRfcHJlc2VudGF0aW9uX1ByYWN0aWNlRGVzY3JpcHRpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NzIwOWNiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc0VsZW1lbnRfcHJlc2VudGF0aW9uX1ByYWN0aWNlRGVzY3JpcHRpb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzRWxlbWVudF9wcmVzZW50YXRpb25fUm9sZURlc2NyaXB0aW9uLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc0VsZW1lbnRfcHJlc2VudGF0aW9uX1JvbGVEZXNjcmlwdGlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2ZTg4OTYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzRWxlbWVudF9wcmVzZW50YXRpb25fUm9sZURlc2NyaXB0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc0VsZW1lbnRfcHJlc2VudGF0aW9uX1Rhc2tEZXNjcmlwdGlvbi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NFbGVtZW50X3ByZXNlbnRhdGlvbl9UYXNrRGVzY3JpcHRpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YzNiMmI4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc0VsZW1lbnRfcHJlc2VudGF0aW9uX1Rhc2tEZXNjcmlwdGlvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NFbGVtZW50X3ByZXNlbnRhdGlvbl9Xb3JrUHJvZHVjdERlc2NyaXB0aW9uLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc0VsZW1lbnRfcHJlc2VudGF0aW9uX1dvcmtQcm9kdWN0RGVzY3JpcHRpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNTQwZjNkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc0VsZW1lbnRfcHJlc2VudGF0aW9uX1dvcmtQcm9kdWN0RGVzY3JpcHRpb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9PQlNfT0JTLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfT0JTX09CUy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzZThhNjEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9PQlNfT0JTLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfUEJTX1BCUy5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX1BCU19QQlMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YTNhYjRhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfUEJTX1BCUy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX1dCU19XQlMuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9XQlNfV0JTLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGEyY2M1Mi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX1dCU19XQlMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9Xb3JrT3JkZXJfV29ya09yZGVyLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfV29ya09yZGVyX1dvcmtPcmRlci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjZmFjMzEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9Xb3JrT3JkZXJfV29ya09yZGVyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfYnJlYWtkb3duRWxlbWVudHNfQWN0aXZpdHkuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9icmVha2Rvd25FbGVtZW50c19BY3Rpdml0eS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmMjBkZWIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9icmVha2Rvd25FbGVtZW50c19BY3Rpdml0eS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX2JyZWFrZG93bkVsZW1lbnRzX0NhcGFiaWxpdHlQYXR0ZXJuLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfYnJlYWtkb3duRWxlbWVudHNfQ2FwYWJpbGl0eVBhdHRlcm4uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNWZmYmIwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfYnJlYWtkb3duRWxlbWVudHNfQ2FwYWJpbGl0eVBhdHRlcm4uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9icmVha2Rvd25FbGVtZW50c19EZWxpdmVyeVByb2Nlc3MuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9icmVha2Rvd25FbGVtZW50c19EZWxpdmVyeVByb2Nlc3MuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YjQwMzYyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfYnJlYWtkb3duRWxlbWVudHNfRGVsaXZlcnlQcm9jZXNzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfYnJlYWtkb3duRWxlbWVudHNfSXRlcmF0aW9uLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfYnJlYWtkb3duRWxlbWVudHNfSXRlcmF0aW9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDMxMWU0Ni4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX2JyZWFrZG93bkVsZW1lbnRzX0l0ZXJhdGlvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX2JyZWFrZG93bkVsZW1lbnRzX01pbGVzdG9uZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX2JyZWFrZG93bkVsZW1lbnRzX01pbGVzdG9uZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5NjE1ZWIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9icmVha2Rvd25FbGVtZW50c19NaWxlc3RvbmUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9icmVha2Rvd25FbGVtZW50c19NaWxlc3RvbmVzLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfYnJlYWtkb3duRWxlbWVudHNfTWlsZXN0b25lcy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5NjE1ZWIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9icmVha2Rvd25FbGVtZW50c19NaWxlc3RvbmVzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfYnJlYWtkb3duRWxlbWVudHNfUGhhc2UuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9icmVha2Rvd25FbGVtZW50c19QaGFzZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkNjBiZDkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9icmVha2Rvd25FbGVtZW50c19QaGFzZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX2JyZWFrZG93bkVsZW1lbnRzX1Byb2Nlc3NDb21wb25lbnREZXNjcmlwdG9yLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfYnJlYWtkb3duRWxlbWVudHNfUHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3IuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZWFjNTlmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfYnJlYWtkb3duRWxlbWVudHNfUHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3IuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9icmVha2Rvd25FbGVtZW50c19Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfYnJlYWtkb3duRWxlbWVudHNfUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlYWM1OWYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9icmVha2Rvd25FbGVtZW50c19Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfYnJlYWtkb3duRWxlbWVudHNfUHJvY2Vzc0NvbnRyaWJ1dGlvbi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX2JyZWFrZG93bkVsZW1lbnRzX1Byb2Nlc3NDb250cmlidXRpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYjA5NWQ4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfYnJlYWtkb3duRWxlbWVudHNfUHJvY2Vzc0NvbnRyaWJ1dGlvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX2JyZWFrZG93bkVsZW1lbnRzX1Byb2Nlc3NQbGFubmluZ1RlbXBsYXRlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfYnJlYWtkb3duRWxlbWVudHNfUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZjliNzhmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfYnJlYWtkb3duRWxlbWVudHNfUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9icmVha2Rvd25FbGVtZW50c19SZXNvdXJjZURlZmluaXRpb24uZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9icmVha2Rvd25FbGVtZW50c19SZXNvdXJjZURlZmluaXRpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzN2E4NmQxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfYnJlYWtkb3duRWxlbWVudHNfUmVzb3VyY2VEZWZpbml0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfYnJlYWtkb3duRWxlbWVudHNfUm9sZURlc2NyaXB0b3IuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9icmVha2Rvd25FbGVtZW50c19Sb2xlRGVzY3JpcHRvci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2OGM3YjguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9icmVha2Rvd25FbGVtZW50c19Sb2xlRGVzY3JpcHRvci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX2JyZWFrZG93bkVsZW1lbnRzX1Rhc2tEZXNjcmlwdG9yLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfYnJlYWtkb3duRWxlbWVudHNfVGFza0Rlc2NyaXB0b3IuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NTRlMjZlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfYnJlYWtkb3duRWxlbWVudHNfVGFza0Rlc2NyaXB0b3IuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9icmVha2Rvd25FbGVtZW50c19UZWFtLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfYnJlYWtkb3duRWxlbWVudHNfVGVhbS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwOTlmZWEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9icmVha2Rvd25FbGVtZW50c19UZWFtLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfYnJlYWtkb3duRWxlbWVudHNfVGVhbVByb2ZpbGUuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9icmVha2Rvd25FbGVtZW50c19UZWFtUHJvZmlsZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwOTlmZWEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9icmVha2Rvd25FbGVtZW50c19UZWFtUHJvZmlsZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX2JyZWFrZG93bkVsZW1lbnRzX1dvcmtQcm9kdWN0RGVzY3JpcHRvci5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX2JyZWFrZG93bkVsZW1lbnRzX1dvcmtQcm9kdWN0RGVzY3JpcHRvci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyMTgyMjkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9icmVha2Rvd25FbGVtZW50c19Xb3JrUHJvZHVjdERlc2NyaXB0b3IuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9kaWFncmFtc19EaWFncmFtLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfZGlhZ3JhbXNfRGlhZ3JhbS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2ZDg1NTguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9kaWFncmFtc19EaWFncmFtLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfcHJvY2Vzc0VsZW1lbnRzX0FjdGl2aXR5LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfcHJvY2Vzc0VsZW1lbnRzX0FjdGl2aXR5LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2YyMGRlYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX3Byb2Nlc3NFbGVtZW50c19BY3Rpdml0eS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX3Byb2Nlc3NFbGVtZW50c19DYXBhYmlsaXR5UGF0dGVybi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX3Byb2Nlc3NFbGVtZW50c19DYXBhYmlsaXR5UGF0dGVybi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1ZmZiYjAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9wcm9jZXNzRWxlbWVudHNfQ2FwYWJpbGl0eVBhdHRlcm4uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9wcm9jZXNzRWxlbWVudHNfQ29tcG9zaXRlUm9sZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX3Byb2Nlc3NFbGVtZW50c19Db21wb3NpdGVSb2xlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2YwMjkxNS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX3Byb2Nlc3NFbGVtZW50c19Db21wb3NpdGVSb2xlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfcHJvY2Vzc0VsZW1lbnRzX0RlbGl2ZXJ5UHJvY2Vzcy5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX3Byb2Nlc3NFbGVtZW50c19EZWxpdmVyeVByb2Nlc3MuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YjQwMzYyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfcHJvY2Vzc0VsZW1lbnRzX0RlbGl2ZXJ5UHJvY2Vzcy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX3Byb2Nlc3NFbGVtZW50c19JdGVyYXRpb24uZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9wcm9jZXNzRWxlbWVudHNfSXRlcmF0aW9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDMxMWU0Ni4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX3Byb2Nlc3NFbGVtZW50c19JdGVyYXRpb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9wcm9jZXNzRWxlbWVudHNfTWlsZXN0b25lLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfcHJvY2Vzc0VsZW1lbnRzX01pbGVzdG9uZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5NjE1ZWIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9wcm9jZXNzRWxlbWVudHNfTWlsZXN0b25lLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfcHJvY2Vzc0VsZW1lbnRzX1BoYXNlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfcHJvY2Vzc0VsZW1lbnRzX1BoYXNlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWQ2MGJkOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX3Byb2Nlc3NFbGVtZW50c19QaGFzZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX3Byb2Nlc3NFbGVtZW50c19QbGFubmluZ0RhdGEuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9wcm9jZXNzRWxlbWVudHNfUGxhbm5pbmdEYXRhLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzJjZTI2MC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX3Byb2Nlc3NFbGVtZW50c19QbGFubmluZ0RhdGEuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9wcm9jZXNzRWxlbWVudHNfUHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3IuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9wcm9jZXNzRWxlbWVudHNfUHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3IuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZWFjNTlmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfcHJvY2Vzc0VsZW1lbnRzX1Byb2Nlc3NDb21wb25lbnREZXNjcmlwdG9yLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfcHJvY2Vzc0VsZW1lbnRzX1Byb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9wcm9jZXNzRWxlbWVudHNfUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlYWM1OWYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9wcm9jZXNzRWxlbWVudHNfUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX3Byb2Nlc3NFbGVtZW50c19Qcm9jZXNzQ29udHJpYnV0aW9uLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfcHJvY2Vzc0VsZW1lbnRzX1Byb2Nlc3NDb250cmlidXRpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYjA5NWQ4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfcHJvY2Vzc0VsZW1lbnRzX1Byb2Nlc3NDb250cmlidXRpb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9wcm9jZXNzRWxlbWVudHNfUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9wcm9jZXNzRWxlbWVudHNfUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOWMxYTA4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfcHJvY2Vzc0VsZW1lbnRzX1Byb2Nlc3NQbGFubmluZ1RlbXBsYXRlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfcHJvY2Vzc0VsZW1lbnRzX1JvbGVEZXNjcmlwdG9yLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfcHJvY2Vzc0VsZW1lbnRzX1JvbGVEZXNjcmlwdG9yLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzY4YzdiOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX3Byb2Nlc3NFbGVtZW50c19Sb2xlRGVzY3JpcHRvci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX3Byb2Nlc3NFbGVtZW50c19UYXNrRGVzY3JpcHRvci5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX3Byb2Nlc3NFbGVtZW50c19UYXNrRGVzY3JpcHRvci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1NGUyNmUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9wcm9jZXNzRWxlbWVudHNfVGFza0Rlc2NyaXB0b3IuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9wcm9jZXNzRWxlbWVudHNfVGVhbVByb2ZpbGUuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9wcm9jZXNzRWxlbWVudHNfVGVhbVByb2ZpbGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MDk5ZmVhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfcHJvY2Vzc0VsZW1lbnRzX1RlYW1Qcm9maWxlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfcHJvY2Vzc0VsZW1lbnRzX1dvcmtPcmRlci5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX3Byb2Nlc3NFbGVtZW50c19Xb3JrT3JkZXIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYjQxZjNiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfcHJvY2Vzc0VsZW1lbnRzX1dvcmtPcmRlci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX3Byb2Nlc3NFbGVtZW50c19Xb3JrUHJvZHVjdERlc2NyaXB0b3IuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9wcm9jZXNzRWxlbWVudHNfV29ya1Byb2R1Y3REZXNjcmlwdG9yLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjIxODIyOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX3Byb2Nlc3NFbGVtZW50c19Xb3JrUHJvZHVjdERlc2NyaXB0b3IuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9wcm9jZXNzX0NhcGFiaWxpdHlQYXR0ZXJuLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfcHJvY2Vzc19DYXBhYmlsaXR5UGF0dGVybi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1ZmZiYjAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9wcm9jZXNzX0NhcGFiaWxpdHlQYXR0ZXJuLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfcHJvY2Vzc19EZWxpdmVyeVByb2Nlc3MuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9wcm9jZXNzX0RlbGl2ZXJ5UHJvY2Vzcy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiNDAzNjIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9wcm9jZXNzX0RlbGl2ZXJ5UHJvY2Vzcy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX3Byb2Nlc3NfUHJvY2Vzc0NvbnRyaWJ1dGlvbi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX3Byb2Nlc3NfUHJvY2Vzc0NvbnRyaWJ1dGlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiMDk1ZDguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9wcm9jZXNzX1Byb2Nlc3NDb250cmlidXRpb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9wcm9jZXNzX1Byb2Nlc3NQbGFuLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfcHJvY2Vzc19Qcm9jZXNzUGxhbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmZGE1NWQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9wcm9jZXNzX1Byb2Nlc3NQbGFuLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfcHJvY2Vzc19Qcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX3Byb2Nlc3NfUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZjliNzhmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfcHJvY2Vzc19Qcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVJlZ2lvbl9UcmFuc2l0aW9uX1RyYW5zaXRpb24uZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVSZWdpb25fVHJhbnNpdGlvbl9UcmFuc2l0aW9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzQzMWM1OS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVJlZ2lvbl9UcmFuc2l0aW9uX1RyYW5zaXRpb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVSZWdpb25fVmVydGV4X1BzZXVkb1N0YXRlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUmVnaW9uX1ZlcnRleF9Qc2V1ZG9TdGF0ZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzNjhlNmEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVSZWdpb25fVmVydGV4X1BzZXVkb1N0YXRlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUmVnaW9uX1ZlcnRleF9TdGF0ZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVJlZ2lvbl9WZXJ0ZXhfU3RhdGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxY2Y1MDYyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUmVnaW9uX1ZlcnRleF9TdGF0ZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVJlZ2lvbl9WZXJ0ZXhfVmVydGV4LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUmVnaW9uX1ZlcnRleF9WZXJ0ZXguZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiY2EzNzZmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUmVnaW9uX1ZlcnRleF9WZXJ0ZXguZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVTZWN0aW9uX3N1YlNlY3Rpb25zX1NlY3Rpb24uZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVTZWN0aW9uX3N1YlNlY3Rpb25zX1NlY3Rpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ODNjZTkzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlU2VjdGlvbl9zdWJTZWN0aW9uc19TZWN0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlU2VjdGlvbl9zdWJTZWN0aW9uc19TdGVwLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlU2VjdGlvbl9zdWJTZWN0aW9uc19TdGVwLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWM3ZWZjNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVNlY3Rpb25fc3ViU2VjdGlvbnNfU3RlcC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVN0YXRlTWFjaGluZV9SZWdpb25fUmVnaW9uLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlU3RhdGVNYWNoaW5lX1JlZ2lvbl9SZWdpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNmFiN2VmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlU3RhdGVNYWNoaW5lX1JlZ2lvbl9SZWdpb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVTdGF0ZV9SZWdpb25fUmVnaW9uLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlU3RhdGVfUmVnaW9uX1JlZ2lvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2NzZkYjguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVTdGF0ZV9SZWdpb25fUmVnaW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlVGFza19lc3RpbWF0ZV9Fc3RpbWF0ZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVRhc2tfZXN0aW1hdGVfRXN0aW1hdGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ODQ0YmY4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlVGFza19lc3RpbWF0ZV9Fc3RpbWF0ZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVRhc2tfc3RlcHNfU3RlcC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVRhc2tfc3RlcHNfU3RlcC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkYTQ5ZDIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVUYXNrX3N0ZXBzX1N0ZXAuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVUZWFtUHJvZmlsZV9zdWJUZWFtX1RlYW1Qcm9maWxlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlVGVhbVByb2ZpbGVfc3ViVGVhbV9UZWFtUHJvZmlsZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwOTlmZWEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVUZWFtUHJvZmlsZV9zdWJUZWFtX1RlYW1Qcm9maWxlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlVHJhaW5pbmdDbGFzc190cmFpbmluZ01vZHVsZXNfVHJhaW5pbmdNb2R1bGUuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVUcmFpbmluZ0NsYXNzX3RyYWluaW5nTW9kdWxlc19UcmFpbmluZ01vZHVsZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlZjVlZmYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVUcmFpbmluZ0NsYXNzX3RyYWluaW5nTW9kdWxlc19UcmFpbmluZ01vZHVsZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVdvcmtEZWZpbml0aW9uX3Bvc3Rjb25kaXRpb25fQ29uc3RyYWludC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVdvcmtEZWZpbml0aW9uX3Bvc3Rjb25kaXRpb25fQ29uc3RyYWludC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkOTQ0ZDcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVXb3JrRGVmaW5pdGlvbl9wb3N0Y29uZGl0aW9uX0NvbnN0cmFpbnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVXb3JrRGVmaW5pdGlvbl9wcmVjb25kaXRpb25fQ29uc3RyYWludC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVdvcmtEZWZpbml0aW9uX3ByZWNvbmRpdGlvbl9Db25zdHJhaW50LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmQ5NDRkNy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVdvcmtEZWZpbml0aW9uX3ByZWNvbmRpdGlvbl9Db25zdHJhaW50LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlV29ya1Byb2R1Y3RfZXN0aW1hdGVfRXN0aW1hdGUuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVXb3JrUHJvZHVjdF9lc3RpbWF0ZV9Fc3RpbWF0ZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3NmViMWQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVXb3JrUHJvZHVjdF9lc3RpbWF0ZV9Fc3RpbWF0ZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9BY3Rpdml0eS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9BY3Rpdml0eS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmMjBkZWIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvQWN0aXZpdHkuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvQWN0aXZpdHlEZXNjcmlwdGlvbi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9BY3Rpdml0eURlc2NyaXB0aW9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2YyMGRlYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9BY3Rpdml0eURlc2NyaXB0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0FnZ3JlZ2F0ZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9BZ2dyZWdhdGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkM2RjNWE5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0FnZ3JlZ2F0ZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9BcHBsaWNhYmxlTWV0YUNsYXNzSW5mby5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9BcHBsaWNhYmxlTWV0YUNsYXNzSW5mby5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwMGFlZGYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvQXBwbGljYWJsZU1ldGFDbGFzc0luZm8uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvQXJ0aWZhY3QuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvQXJ0aWZhY3QuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MDFkMjE5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0FydGlmYWN0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0FydGlmYWN0RGVzY3JpcHRpb24uZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvQXJ0aWZhY3REZXNjcmlwdGlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwMWQyMTkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvQXJ0aWZhY3REZXNjcmlwdGlvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9BdHRhY2htZW50LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0F0dGFjaG1lbnQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNGE4YWY0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0F0dGFjaG1lbnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvQnJlYWtkb3duRWxlbWVudC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9CcmVha2Rvd25FbGVtZW50LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmFkYWFiMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9CcmVha2Rvd25FbGVtZW50LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0JyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9CcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNWVmODRlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0JyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9DYXBhYmlsaXR5UGF0dGVybi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9DYXBhYmlsaXR5UGF0dGVybi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1ZmZiYjAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvQ2FwYWJpbGl0eVBhdHRlcm4uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvQ2hlY2tsaXN0LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0NoZWNrbGlzdC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4ZjZkOGIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvQ2hlY2tsaXN0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0NsYXNzaWZpZXIuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvQ2xhc3NpZmllci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExN2RjN2QuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvQ2xhc3NpZmllci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Db21wb3NpdGVSb2xlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0NvbXBvc2l0ZVJvbGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NmU4ODk2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0NvbXBvc2l0ZVJvbGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvQ29uY2VwdC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Db25jZXB0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWRmODRkYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Db25jZXB0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0NvbnN0cmFpbnQuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvQ29uc3RyYWludC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiNzQxNGUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvQ29uc3RyYWludC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Db250ZW50Q2F0ZWdvcnkuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvQ29udGVudENhdGVnb3J5LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDU3MzFmZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Db250ZW50Q2F0ZWdvcnkuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvQ29udGVudERlc2NyaXB0aW9uLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0NvbnRlbnREZXNjcmlwdGlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlMjI0NjMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvQ29udGVudERlc2NyaXB0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0NvbnRlbnRFbGVtZW50LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0NvbnRlbnRFbGVtZW50LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTkxNTU5MS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Db250ZW50RWxlbWVudC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Db250ZW50UGFja2FnZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Db250ZW50UGFja2FnZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwYTMxMWUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvQ29udGVudFBhY2thZ2UuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvQ29yZUVsZW1lbnQuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvQ29yZUVsZW1lbnQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMzM3MGM3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0NvcmVFbGVtZW50LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0NvcmVTZW1hbnRpY01vZGVsQnJpZGdlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0NvcmVTZW1hbnRpY01vZGVsQnJpZGdlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTE3ZGM3ZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Db3JlU2VtYW50aWNNb2RlbEJyaWRnZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9DdXN0b21DYXRlZ29yeS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9DdXN0b21DYXRlZ29yeS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmNDc5ODAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvQ3VzdG9tQ2F0ZWdvcnkuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvRGVsaXZlcmFibGUuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvRGVsaXZlcmFibGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYTEwNTYzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0RlbGl2ZXJhYmxlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0RlbGl2ZXJhYmxlRGVzY3JpcHRpb24uZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvRGVsaXZlcmFibGVEZXNjcmlwdGlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhMTA1NjMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvRGVsaXZlcmFibGVEZXNjcmlwdGlvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9EZWxpdmVyeVByb2Nlc3MuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvRGVsaXZlcnlQcm9jZXNzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2I0MDM2Mi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9EZWxpdmVyeVByb2Nlc3MuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24uZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YjQwMzYyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0Rlc2NyaWJhYmxlRWxlbWVudC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9EZXNjcmliYWJsZUVsZW1lbnQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNGFmOGFhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0Rlc2NyaWJhYmxlRWxlbWVudC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9EZXNjcmlwdG9yLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0Rlc2NyaXB0b3IuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMzZlM2IyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0Rlc2NyaXB0b3IuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvRGVzY3JpcHRvckRlc2NyaXB0aW9uLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiNjkyNTYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvRGVzY3JpcHRvckRlc2NyaXB0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0RpYWdyYW0uZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvRGlhZ3JhbS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0YThhZjQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvRGlhZ3JhbS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9EaWFncmFtRWxlbWVudC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9EaWFncmFtRWxlbWVudC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1NzMxZmUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvRGlhZ3JhbUVsZW1lbnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvRGlhZ3JhbUxpbmsuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvRGlhZ3JhbUxpbmsuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjczYTUyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0RpYWdyYW1MaW5rLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0RpbWVuc2lvbi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9EaW1lbnNpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZGQzYjc2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0RpbWVuc2lvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9EaXNjaXBsaW5lLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0Rpc2NpcGxpbmUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNWJkNDc2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0Rpc2NpcGxpbmUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvRGlzY2lwbGluZUdyb3VwaW5nLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0Rpc2NpcGxpbmVHcm91cGluZy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1NTNjMWQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvRGlzY2lwbGluZUdyb3VwaW5nLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0RvbWFpbi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Eb21haW4uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjI4OTI2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0RvbWFpbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9FbGVtZW50LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0VsZW1lbnQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmODA0MWQyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0VsZW1lbnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvRWxsaXBzZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9FbGxpcHNlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTA2ODgxZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9FbGxpcHNlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0VzdGltYXRlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0VzdGltYXRlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTgyZDIxYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Fc3RpbWF0ZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Fc3RpbWF0ZWRNZXRob2RFbGVtZW50LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0VzdGltYXRlZE1ldGhvZEVsZW1lbnQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNGFmOGFhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0VzdGltYXRlZE1ldGhvZEVsZW1lbnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvRXN0aW1hdGluZ0NvbnNpZGVyYXRpb25zLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0VzdGltYXRpbmdDb25zaWRlcmF0aW9ucy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmYzg0ZTQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvRXN0aW1hdGluZ0NvbnNpZGVyYXRpb25zLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0VzdGltYXRpbmdNZXRyaWMuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvRXN0aW1hdGluZ01ldHJpYy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5NDA5NzUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvRXN0aW1hdGluZ01ldHJpYy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Fc3RpbWF0aW5nTW9kZWwuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvRXN0aW1hdGluZ01vZGVsLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2FmMjgwNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Fc3RpbWF0aW5nTW9kZWwuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvRXN0aW1hdGluZ1BhcmFtZXRlci5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Fc3RpbWF0aW5nUGFyYW1ldGVyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTRjOTUzZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Fc3RpbWF0aW5nUGFyYW1ldGVyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0VzdGltYXRpbmdQYXJhbWV0ZXJPd25lci5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Fc3RpbWF0aW5nUGFyYW1ldGVyT3duZXIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OTE1NTkxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0VzdGltYXRpbmdQYXJhbWV0ZXJPd25lci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGZjODRlNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvRXhhbXBsZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9FeGFtcGxlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWI5NDRmZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9FeGFtcGxlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0Z1bGZpbGxhYmxlRWxlbWVudC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9GdWxmaWxsYWJsZUVsZW1lbnQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNWVmODRlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0Z1bGZpbGxhYmxlRWxlbWVudC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9HcmFwaENvbm5lY3Rvci5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9HcmFwaENvbm5lY3Rvci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczOWViYmYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvR3JhcGhDb25uZWN0b3IuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvR3JhcGhFZGdlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0dyYXBoRWRnZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhOWJjNzUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvR3JhcGhFZGdlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0dyYXBoRWxlbWVudC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9HcmFwaEVsZW1lbnQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMzhmYjhkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0dyYXBoRWxlbWVudC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9HcmFwaE5vZGUuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvR3JhcGhOb2RlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTM0NTUxYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9HcmFwaE5vZGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvR3JhcGhpY1ByaW1pdGl2ZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9HcmFwaGljUHJpbWl0aXZlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTBkMjIyOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9HcmFwaGljUHJpbWl0aXZlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0d1aWRhbmNlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0d1aWRhbmNlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjZmNDRmNS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9HdWlkYW5jZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9HdWlkYW5jZURlc2NyaXB0aW9uLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0d1aWRhbmNlRGVzY3JpcHRpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NmY0NGY1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0d1aWRhbmNlRGVzY3JpcHRpb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvR3VpZGVsaW5lLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0d1aWRlbGluZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2ZjQ0ZjUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvR3VpZGVsaW5lLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0ltYWdlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0ltYWdlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWY1NmMxNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9JbWFnZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9JdGVyYXRpb24uZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvSXRlcmF0aW9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDMxMWU0Ni4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9JdGVyYXRpb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvS2luZC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9LaW5kLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWY1NmMxNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9LaW5kLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0xlYWZFbGVtZW50LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0xlYWZFbGVtZW50LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTA2ODgxZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9MZWFmRWxlbWVudC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9NZXRob2RDb25maWd1cmF0aW9uLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L01ldGhvZENvbmZpZ3VyYXRpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZTg5NjAyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L01ldGhvZENvbmZpZ3VyYXRpb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvTWV0aG9kRWxlbWVudC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9NZXRob2RFbGVtZW50LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzRmYjMwZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9NZXRob2RFbGVtZW50LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L01ldGhvZEVsZW1lbnRQcm9wZXJ0eS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9NZXRob2RFbGVtZW50UHJvcGVydHkuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNDE0ZmU5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L01ldGhvZEVsZW1lbnRQcm9wZXJ0eS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9NZXRob2RMaWJyYXJ5LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L01ldGhvZExpYnJhcnkuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMGEzMTFlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L01ldGhvZExpYnJhcnkuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvTWV0aG9kUGFja2FnZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9NZXRob2RQYWNrYWdlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDBhMzExZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9NZXRob2RQYWNrYWdlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L01ldGhvZFBsdWdpbi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9NZXRob2RQbHVnaW4uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYjgyYzM5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L01ldGhvZFBsdWdpbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9NZXRob2RQbHVnaW5fZ3JleS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9NZXRob2RQbHVnaW5fZ3JleS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlNjNhZGUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvTWV0aG9kUGx1Z2luX2dyZXkuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvTWV0aG9kVW5pdC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9NZXRob2RVbml0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWE5YmM3NS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9NZXRob2RVbml0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L01pbGVzdG9uZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9NaWxlc3RvbmUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOTYxNWViLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L01pbGVzdG9uZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9NaWxlc3RvbmVzLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L01pbGVzdG9uZXMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOTYxNWViLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L01pbGVzdG9uZXMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvTmFtZWRFbGVtZW50LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L05hbWVkRWxlbWVudC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0YWY4YWEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvTmFtZWRFbGVtZW50LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L05hbWVzcGFjZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9OYW1lc3BhY2UuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OTgzNjRmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L05hbWVzcGFjZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9PQlMuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvT0JTLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWZiODJlYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9PQlMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvT3V0Y29tZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9PdXRjb21lLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTcwMzUxOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9PdXRjb21lLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1BCUy5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9QQlMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OTgzNjRmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1BCUy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9QYWNrYWdlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1BhY2thZ2UuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMDBhZWRmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1BhY2thZ2UuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUGFja2FnZWFibGVFbGVtZW50LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1BhY2thZ2VhYmxlRWxlbWVudC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwNjg4MWUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUGFja2FnZWFibGVFbGVtZW50LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1BoYXNlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1BoYXNlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWQ2MGJkOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9QaGFzZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9QbGFubmluZ0RhdGEuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUGxhbm5pbmdEYXRhLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTRjOTUzZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9QbGFubmluZ0RhdGEuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUG9pbnQuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUG9pbnQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MzUwMGRhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1BvaW50LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1BvbHlsaW5lLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1BvbHlsaW5lLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2MyYWFhYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Qb2x5bGluZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9QcmFjdGljZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9QcmFjdGljZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3MjA5Y2IuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUHJhY3RpY2UuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUHJhY3RpY2VEZXNjcmlwdGlvbi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9QcmFjdGljZURlc2NyaXB0aW9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjcyMDljYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9QcmFjdGljZURlc2NyaXB0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1Byb2Nlc3MuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUHJvY2Vzcy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlYWM1OWYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUHJvY2Vzcy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Qcm9jZXNzQ29tcG9uZW50LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1Byb2Nlc3NDb21wb25lbnQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZWFjNTlmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1Byb2Nlc3NDb21wb25lbnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3IuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3IuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZWFjNTlmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1Byb2Nlc3NDb21wb25lbnREZXNjcmlwdG9yLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1Byb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlYWM1OWYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Qcm9jZXNzQ29udGV4dC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Qcm9jZXNzQ29udGV4dC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlYWM1OWYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUHJvY2Vzc0NvbnRleHQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUHJvY2Vzc0NvbnRyaWJ1dGlvbi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Qcm9jZXNzQ29udHJpYnV0aW9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmIwOTVkOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Qcm9jZXNzQ29udHJpYnV0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1Byb2Nlc3NEZXNjcmlwdGlvbi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Qcm9jZXNzRGVzY3JpcHRpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZWFjNTlmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1Byb2Nlc3NEZXNjcmlwdGlvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Qcm9jZXNzRWxlbWVudC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Qcm9jZXNzRWxlbWVudC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlYWM1OWYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUHJvY2Vzc0VsZW1lbnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUHJvY2Vzc0ZhbWlseS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Qcm9jZXNzRmFtaWx5LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmI2OTI1Ni4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Qcm9jZXNzRmFtaWx5LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1Byb2Nlc3NQYWNrYWdlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1Byb2Nlc3NQYWNrYWdlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDhkOGMyZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Qcm9jZXNzUGFja2FnZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Qcm9jZXNzUGxhbi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Qcm9jZXNzUGxhbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxZjhhZmEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUHJvY2Vzc1BsYW4uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMzZlM2IyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1Byb2Nlc3NQbGFubmluZ1RlbXBsYXRlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1Byb3BlcnR5LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1Byb3BlcnR5LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTM2ZTNiMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Qcm9wZXJ0eS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Qc2V1ZG9TdGF0ZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Qc2V1ZG9TdGF0ZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0ZmIzMGUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUHNldWRvU3RhdGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUmVmZXJlbmNlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1JlZmVyZW5jZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczOWViYmYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUmVmZXJlbmNlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1JlZ2lvbi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9SZWdpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MzY1OTYwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1JlZ2lvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9SZXBvcnQuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUmVwb3J0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzIyYzg1ZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9SZXBvcnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUmVzb3VyY2VEZWZpbml0aW9uLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1Jlc291cmNlRGVmaW5pdGlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4YjM1MWYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUmVzb3VyY2VEZWZpbml0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1JldXNhYmxlQXNzZXQuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUmV1c2FibGVBc3NldC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1MmNmZmUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUmV1c2FibGVBc3NldC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Sb2FkbWFwLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1JvYWRtYXAuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMTFiYzVkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1JvYWRtYXAuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUm9sZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Sb2xlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzZlODg5Ni4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Sb2xlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1JvbGVEZXNjcmlwdGlvbi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Sb2xlRGVzY3JpcHRpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NmU4ODk2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1JvbGVEZXNjcmlwdGlvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Sb2xlRGVzY3JpcHRvci5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Sb2xlRGVzY3JpcHRvci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2OGM3YjguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUm9sZURlc2NyaXB0b3IuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUm9sZVNldC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Sb2xlU2V0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTA5OWZlYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Sb2xlU2V0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1JvbGVTZXRDYXRlZ29yeS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Sb2xlU2V0Q2F0ZWdvcnkuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NGEzZjY3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1JvbGVTZXRDYXRlZ29yeS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Sb2xlU2V0R3JvdXBpbmcuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUm9sZVNldEdyb3VwaW5nLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTRhM2Y2Ny4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Sb2xlU2V0R3JvdXBpbmcuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvU2VjdGlvbi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9TZWN0aW9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzM5ZWJiZi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9TZWN0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1NlbWFudGljTW9kZWxCcmlkZ2UuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvU2VtYW50aWNNb2RlbEJyaWRnZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzODU0ZTkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvU2VtYW50aWNNb2RlbEJyaWRnZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9TaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9TaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiMTc1NWEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvU3RhdGUuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvU3RhdGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYjE3NTVhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1N0YXRlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1N0YXRlTWFjaGluZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9TdGF0ZU1hY2hpbmUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYWRhYWIwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1N0YXRlTWFjaGluZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9TdGVwLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1N0ZXAuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNWVmODRlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1N0ZXAuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvU3VtbWl0RXN0aW1hdGluZ1BhcmFtZXRlci5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9TdW1taXRFc3RpbWF0aW5nUGFyYW1ldGVyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDU3MzFmZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9TdW1taXRFc3RpbWF0aW5nUGFyYW1ldGVyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1N1cHBvcnRpbmdNYXRlcmlhbC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9TdXBwb3J0aW5nTWF0ZXJpYWwuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNWEyMWVjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1N1cHBvcnRpbmdNYXRlcmlhbC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9UYXNrLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1Rhc2suZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YzNiMmI4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1Rhc2suZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvVGFza0Rlc2NyaXB0aW9uLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1Rhc2tEZXNjcmlwdGlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjM2IyYjguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvVGFza0Rlc2NyaXB0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1Rhc2tEZXNjcmlwdG9yLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1Rhc2tEZXNjcmlwdG9yLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTU0ZTI2ZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9UYXNrRGVzY3JpcHRvci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9UZWFtLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1RlYW0uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MDk5ZmVhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1RlYW0uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvVGVhbVByb2ZpbGUuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvVGVhbVByb2ZpbGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MDk5ZmVhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1RlYW1Qcm9maWxlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1RlY2huaXF1ZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9UZWNobmlxdWUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNjg2NmQ5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1RlY2huaXF1ZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9UZW1wbGF0ZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9UZW1wbGF0ZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3NjMyNTEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvVGVtcGxhdGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvVGVtcGxhdGVEZXNjcmlwdGlvbi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9UZW1wbGF0ZURlc2NyaXB0aW9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzc2MzI1MS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9UZW1wbGF0ZURlc2NyaXB0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1Rlcm1EZWZpbml0aW9uLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1Rlcm1EZWZpbml0aW9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTIxYmZlMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9UZXJtRGVmaW5pdGlvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9UZXh0RWxlbWVudC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9UZXh0RWxlbWVudC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzNDU1MWIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvVGV4dEVsZW1lbnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvVG9vbC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Ub29sLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGYxYjg1YS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Ub29sLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1Rvb2xNZW50b3IuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvVG9vbE1lbnRvci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmMWI4NWEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvVG9vbE1lbnRvci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9UcmFpbmluZ0NsYXNzLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1RyYWluaW5nQ2xhc3MuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MGQxMGY5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1RyYWluaW5nQ2xhc3MuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvVHJhaW5pbmdNb2R1bGUuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvVHJhaW5pbmdNb2R1bGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZjU2YzE0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1RyYWluaW5nTW9kdWxlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1RyYW5zaXRpb24uZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvVHJhbnNpdGlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiYWM0ZmQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvVHJhbnNpdGlvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9UeXBlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1R5cGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMWY4YWZhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1R5cGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvVU1BU2VtYW50aWNNb2RlbEJyaWRnZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9VTUFTZW1hbnRpY01vZGVsQnJpZGdlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODlhZDVkYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9VTUFTZW1hbnRpY01vZGVsQnJpZGdlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1VzZXJEZWZpbmVkQ2F0ZWdvcnkuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvVXNlckRlZmluZWRDYXRlZ29yeS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmNDc5ODAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvVXNlckRlZmluZWRDYXRlZ29yeS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9WYXJpYWJpbGl0eUVsZW1lbnQuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvVmFyaWFiaWxpdHlFbGVtZW50LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGI3NDE0ZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9WYXJpYWJpbGl0eUVsZW1lbnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvVmVydGV4LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1ZlcnRleC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhNWM3MGMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvVmVydGV4LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1dCUy5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9XQlMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZjU2YzE0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1dCUy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9XaGl0ZXBhcGVyLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1doaXRlcGFwZXIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNWI0ODAwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1doaXRlcGFwZXIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvV29ya0JyZWFrZG93bkVsZW1lbnQuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvV29ya0JyZWFrZG93bkVsZW1lbnQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YmFjNGZkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1dvcmtCcmVha2Rvd25FbGVtZW50LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1dvcmtEZWZpbml0aW9uLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1dvcmtEZWZpbml0aW9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjEyNGYzZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Xb3JrRGVmaW5pdGlvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Xb3JrT3JkZXIuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvV29ya09yZGVyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmFkYWFiMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Xb3JrT3JkZXIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvV29ya1Byb2R1Y3QuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvV29ya1Byb2R1Y3QuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNTQwZjNkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1dvcmtQcm9kdWN0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1dvcmtQcm9kdWN0RGVzY3JpcHRpb24uZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvV29ya1Byb2R1Y3REZXNjcmlwdGlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1NDBmM2QuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvV29ya1Byb2R1Y3REZXNjcmlwdGlvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Xb3JrUHJvZHVjdERlc2NyaXB0b3IuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvV29ya1Byb2R1Y3REZXNjcmlwdG9yLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjIxODIyOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Xb3JrUHJvZHVjdERlc2NyaXB0b3IuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvV29ya1Byb2R1Y3RHdWlkZWxpbmUuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvV29ya1Byb2R1Y3RHdWlkZWxpbmUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NTdmYTY1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1dvcmtQcm9kdWN0R3VpZGVsaW5lLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1dvcmtQcm9kdWN0U2hhcGUuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvV29ya1Byb2R1Y3RTaGFwZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1NDBmM2QuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvV29ya1Byb2R1Y3RTaGFwZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Xb3JrUHJvZHVjdFR5cGUuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvV29ya1Byb2R1Y3RUeXBlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTdlY2FjMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Xb3JrUHJvZHVjdFR5cGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3BsdWdpbi5wcm9wZXJ0aWVzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZTMxNWNkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDQ1NiArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUgotCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jIFRvIGNvZGUgZGV2ZWxvcGVyOgotIyAgIERvIE5PVCBjaGFuZ2UgdGhlIHByb3BlcnRpZXMgYmV0d2VlbiB0aGlzIGxpbmUgYW5kIHRoZQotIyAgICIlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUiIGxpbmUuCi0jICAgTWFrZSBhIG5ldyBwcm9wZXJ0eSBuYW1lLCBhcHBlbmQgdG8gdGhlIGVuZCBvZiB0aGUgZmlsZSBhbmQgY2hhbmdlCi0jICAgdGhlIGNvZGUgdG8gdXNlIHRoZSBuZXcgcHJvcGVydHkuCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLXBsdWdpbk5hbWUgPSBFTUYgVU1BIEVkaXQgU3VwcG9ydAotcHJvdmlkZXJOYW1lID0gRWNsaXBzZS5vcmcKLQotX1VJX0NyZWF0ZUNoaWxkX3RleHQgPSB7MH0KLV9VSV9DcmVhdGVDaGlsZF90ZXh0MiA9IHsxfSB7MH0KLV9VSV9DcmVhdGVDaGlsZF90ZXh0MyA9IHsxfQotX1VJX0NyZWF0ZUNoaWxkX3Rvb2x0aXAgPSBDcmVhdGUgTmV3IHswfSBVbmRlciB7MX0gRmVhdHVyZQotX1VJX0NyZWF0ZUNoaWxkX2Rlc2NyaXB0aW9uID0gQ3JlYXRlIGEgbmV3IGNoaWxkIG9mIHR5cGUgezB9IGZvciB0aGUgezF9IGZlYXR1cmUgb2YgdGhlIHNlbGVjdGVkIHsyfS4KLV9VSV9DcmVhdGVTaWJsaW5nX2Rlc2NyaXB0aW9uID0gQ3JlYXRlIGEgbmV3IHNpYmxpbmcgb2YgdHlwZSB7MH0gZm9yIHRoZSBzZWxlY3RlZCB7Mn0sIHVuZGVyIHRoZSB7MX0gZmVhdHVyZSBvZiB0aGVpciBwYXJlbnQuCi0KLV9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24gPSBUaGUgezB9IG9mIHRoZSB7MX0KLQotX1VJX0NsYXNzaWZpZXJfdHlwZSA9IENsYXNzaWZpZXIKLV9VSV9UeXBlX3R5cGUgPSBUeXBlCi1fVUlfRWxlbWVudF90eXBlID0gRWxlbWVudAotX1VJX05hbWVkRWxlbWVudF90eXBlID0gTmFtZWQgRWxlbWVudAotX1VJX1BhY2thZ2VhYmxlRWxlbWVudF90eXBlID0gUGFja2FnZWFibGUgRWxlbWVudAotX1VJX1BhY2thZ2VfdHlwZSA9IFBhY2thZ2UKLV9VSV9OYW1lc3BhY2VfdHlwZSA9IE5hbWVzcGFjZQotX1VJX01ldGhvZEVsZW1lbnRfdHlwZSA9IE1ldGhvZCBFbGVtZW50Ci1fVUlfQ29uc3RyYWludF90eXBlID0gQ29uc3RyYWludAotX1VJX0NvbnRlbnRFbGVtZW50X3R5cGUgPSBDb250ZW50IEVsZW1lbnQKLV9VSV9EZXNjcmliYWJsZUVsZW1lbnRfdHlwZSA9IERlc2NyaWJhYmxlIEVsZW1lbnQKLV9VSV9Db250ZW50RGVzY3JpcHRpb25fdHlwZSA9IENvbnRlbnQgRGVzY3JpcHRpb24KLV9VSV9TZWN0aW9uX3R5cGUgPSBTZWN0aW9uCi1fVUlfUm9sZV90eXBlID0gUm9sZQotX1VJX1dvcmtQcm9kdWN0X3R5cGUgPSBXb3JrIFByb2R1Y3QKLV9VSV9UYXNrX3R5cGUgPSBUYXNrCi1fVUlfV29ya0RlZmluaXRpb25fdHlwZSA9IFdvcmsgRGVmaW5pdGlvbgotX1VJX1N0ZXBfdHlwZSA9IFN0ZXAKLV9VSV9HdWlkYW5jZV90eXBlID0gR3VpZGFuY2UKLV9VSV9BcnRpZmFjdF90eXBlID0gQXJ0aWZhY3QKLV9VSV9EZWxpdmVyYWJsZV90eXBlID0gRGVsaXZlcmFibGUKLV9VSV9PdXRjb21lX3R5cGUgPSBPdXRjb21lCi1fVUlfTWV0aG9kUGFja2FnZV90eXBlID0gTWV0aG9kIFBhY2thZ2UKLV9VSV9Db250ZW50UGFja2FnZV90eXBlID0gQ29udGVudCBQYWNrYWdlCi1fVUlfQXJ0aWZhY3REZXNjcmlwdGlvbl90eXBlID0gQXJ0aWZhY3QgRGVzY3JpcHRpb24KLV9VSV9Xb3JrUHJvZHVjdERlc2NyaXB0aW9uX3R5cGUgPSBXb3JrIFByb2R1Y3QgRGVzY3JpcHRpb24KLV9VSV9EZWxpdmVyYWJsZURlc2NyaXB0aW9uX3R5cGUgPSBEZWxpdmVyYWJsZSBEZXNjcmlwdGlvbgotX1VJX1JvbGVEZXNjcmlwdGlvbl90eXBlID0gUm9sZSBEZXNjcmlwdGlvbgotX1VJX1Rhc2tEZXNjcmlwdGlvbl90eXBlID0gVGFzayBEZXNjcmlwdGlvbgotX1VJX0d1aWRhbmNlRGVzY3JpcHRpb25fdHlwZSA9IEd1aWRhbmNlIERlc2NyaXB0aW9uCi1fVUlfUHJhY3RpY2VEZXNjcmlwdGlvbl90eXBlID0gUHJhY3RpY2UgRGVzY3JpcHRpb24KLV9VSV9Qb2ludF90eXBlID0gUG9pbnQKLV9VSV9HcmFwaEVsZW1lbnRfdHlwZSA9IEdyYXBoIEVsZW1lbnQKLV9VSV9EaWFncmFtRWxlbWVudF90eXBlID0gRGlhZ3JhbSBFbGVtZW50Ci1fVUlfRGlhZ3JhbUxpbmtfdHlwZSA9IERpYWdyYW0gTGluawotX1VJX0dyYXBoQ29ubmVjdG9yX3R5cGUgPSBHcmFwaCBDb25uZWN0b3IKLV9VSV9TZW1hbnRpY01vZGVsQnJpZGdlX3R5cGUgPSBTZW1hbnRpYyBNb2RlbCBCcmlkZ2UKLV9VSV9EaW1lbnNpb25fdHlwZSA9IERpbWVuc2lvbgotX1VJX1JlZmVyZW5jZV90eXBlID0gUmVmZXJlbmNlCi1fVUlfUHJvcGVydHlfdHlwZSA9IFByb3BlcnR5Ci1fVUlfR3JhcGhFZGdlX3R5cGUgPSBHcmFwaCBFZGdlCi1fVUlfRGlhZ3JhbV90eXBlID0gRGlhZ3JhbQotX1VJX0dyYXBoTm9kZV90eXBlID0gR3JhcGggTm9kZQotX1VJX1NpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50X3R5cGUgPSBTaW1wbGUgU2VtYW50aWMgTW9kZWwgRWxlbWVudAotX1VJX1VNQVNlbWFudGljTW9kZWxCcmlkZ2VfdHlwZSA9IFVNQSBTZW1hbnRpYyBNb2RlbCBCcmlkZ2UKLV9VSV9Db3JlU2VtYW50aWNNb2RlbEJyaWRnZV90eXBlID0gQ29yZSBTZW1hbnRpYyBNb2RlbCBCcmlkZ2UKLV9VSV9MZWFmRWxlbWVudF90eXBlID0gTGVhZiBFbGVtZW50Ci1fVUlfVGV4dEVsZW1lbnRfdHlwZSA9IFRleHQgRWxlbWVudAotX1VJX0ltYWdlX3R5cGUgPSBJbWFnZQotX1VJX0dyYXBoaWNQcmltaXRpdmVfdHlwZSA9IEdyYXBoaWMgUHJpbWl0aXZlCi1fVUlfUG9seWxpbmVfdHlwZSA9IFBvbHlsaW5lCi1fVUlfRWxsaXBzZV90eXBlID0gRWxsaXBzZQotX1VJX0FjdGl2aXR5X3R5cGUgPSBBY3Rpdml0eQotX1VJX1dvcmtCcmVha2Rvd25FbGVtZW50X3R5cGUgPSBXb3JrIEJyZWFrZG93biBFbGVtZW50Ci1fVUlfQnJlYWtkb3duRWxlbWVudF90eXBlID0gQnJlYWtkb3duIEVsZW1lbnQKLV9VSV9NaWxlc3RvbmVfdHlwZSA9IE1pbGVzdG9uZQotX1VJX0l0ZXJhdGlvbl90eXBlID0gSXRlcmF0aW9uCi1fVUlfUGhhc2VfdHlwZSA9IFBoYXNlCi1fVUlfVGVhbVByb2ZpbGVfdHlwZSA9IFRlYW0gUHJvZmlsZQotX1VJX1JvbGVEZXNjcmlwdG9yX3R5cGUgPSBSb2xlIERlc2NyaXB0b3IKLV9VSV9Xb3JrT3JkZXJfdHlwZSA9IFdvcmsgT3JkZXIKLV9VSV9Qcm9jZXNzRWxlbWVudF90eXBlID0gUHJvY2VzcyBFbGVtZW50Ci1fVUlfUGxhbm5pbmdEYXRhX3R5cGUgPSBQbGFubmluZyBEYXRhCi1fVUlfRGVzY3JpcHRvcl90eXBlID0gRGVzY3JpcHRvcgotX1VJX1dvcmtQcm9kdWN0RGVzY3JpcHRvcl90eXBlID0gV29yayBQcm9kdWN0IERlc2NyaXB0b3IKLV9VSV9UYXNrRGVzY3JpcHRvcl90eXBlID0gVGFzayBEZXNjcmlwdG9yCi1fVUlfQ29tcG9zaXRlUm9sZV90eXBlID0gQ29tcG9zaXRlIFJvbGUKLV9VSV9CcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb25fdHlwZSA9IEJyZWFrZG93biBFbGVtZW50IERlc2NyaXB0aW9uCi1fVUlfQWN0aXZpdHlEZXNjcmlwdGlvbl90eXBlID0gQWN0aXZpdHkgRGVzY3JpcHRpb24KLV9VSV9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl90eXBlID0gRGVsaXZlcnkgUHJvY2VzcyBEZXNjcmlwdGlvbgotX1VJX1Byb2Nlc3NEZXNjcmlwdGlvbl90eXBlID0gUHJvY2VzcyBEZXNjcmlwdGlvbgotX1VJX0Rlc2NyaXB0b3JEZXNjcmlwdGlvbl90eXBlID0gRGVzY3JpcHRvciBEZXNjcmlwdGlvbgotX1VJX0NvbmNlcHRfdHlwZSA9IENvbmNlcHQKLV9VSV9DaGVja2xpc3RfdHlwZSA9IENoZWNrbGlzdAotX1VJX0V4YW1wbGVfdHlwZSA9IEV4YW1wbGUKLV9VSV9HdWlkZWxpbmVfdHlwZSA9IEd1aWRlbGluZQotX1VJX1JlcG9ydF90eXBlID0gUmVwb3J0Ci1fVUlfVGVtcGxhdGVfdHlwZSA9IFRlbXBsYXRlCi1fVUlfU3VwcG9ydGluZ01hdGVyaWFsX3R5cGUgPSBTdXBwb3J0aW5nIE1hdGVyaWFsCi1fVUlfVG9vbE1lbnRvcl90eXBlID0gVG9vbCBNZW50b3IKLV9VSV9XaGl0ZXBhcGVyX3R5cGUgPSBXaGl0ZXBhcGVyCi1fVUlfVGVybURlZmluaXRpb25fdHlwZSA9IFRlcm0gRGVmaW5pdGlvbgotX1VJX1ByYWN0aWNlX3R5cGUgPSBQcmFjdGljZQotX1VJX0VzdGltYXRpb25Db25zaWRlcmF0aW9uc190eXBlID0gRXN0aW1hdGlvbiBDb25zaWRlcmF0aW9ucwotX1VJX1JldXNhYmxlQXNzZXRfdHlwZSA9IFJldXNhYmxlIEFzc2V0Ci1fVUlfU3RhdGVfdHlwZSA9IFN0YXRlCi1fVUlfVmVydGV4X3R5cGUgPSBWZXJ0ZXgKLV9VSV9SZWdpb25fdHlwZSA9IFJlZ2lvbgotX1VJX1N0YXRlTWFjaGluZV90eXBlID0gU3RhdGUgTWFjaGluZQotX1VJX1RyYW5zaXRpb25fdHlwZSA9IFRyYW5zaXRpb24KLV9VSV9Qc2V1ZG9TdGF0ZV90eXBlID0gUHNldWRvIFN0YXRlCi1fVUlfRGlzY2lwbGluZV90eXBlID0gRGlzY2lwbGluZQotX1VJX0NvbnRlbnRDYXRlZ29yeV90eXBlID0gQ29udGVudCBDYXRlZ29yeQotX1VJX1JvbGVTZXRfdHlwZSA9IFJvbGUgU2V0Ci1fVUlfRG9tYWluX3R5cGUgPSBEb21haW4KLV9VSV9Xb3JrUHJvZHVjdFR5cGVfdHlwZSA9IFdvcmsgUHJvZHVjdCBLaW5kCi1fVUlfRGlzY2lwbGluZUdyb3VwaW5nX3R5cGUgPSBEaXNjaXBsaW5lIEdyb3VwaW5nCi1fVUlfVG9vbF90eXBlID0gVG9vbAotX1VJX1JvbGVTZXRHcm91cGluZ190eXBlID0gUm9sZSBTZXQgR3JvdXBpbmcKLV9VSV9DdXN0b21DYXRlZ29yeV90eXBlID0gQ3VzdG9tIENhdGVnb3J5Ci1fVUlfRGVsaXZlcnlQcm9jZXNzX3R5cGUgPSBEZWxpdmVyeSBQcm9jZXNzCi1fVUlfUHJvY2Vzc190eXBlID0gUHJvY2VzcwotX1VJX0NhcGFiaWxpdHlQYXR0ZXJuX3R5cGUgPSBDYXBhYmlsaXR5IFBhdHRlcm4KLV9VSV9Qcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZV90eXBlID0gUHJvY2VzcyBQbGFubmluZyBUZW1wbGF0ZQotX1VJX1JvYWRtYXBfdHlwZSA9IFJvYWRtYXAKLV9VSV9Qcm9jZXNzQ29tcG9uZW50X3R5cGUgPSBQcm9jZXNzIENvbXBvbmVudAotX1VJX1Byb2Nlc3NQYWNrYWdlX3R5cGUgPSBQcm9jZXNzIFBhY2thZ2UKLV9VSV9Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlX3R5cGUgPSBQcm9jZXNzIENvbXBvbmVudCBJbnRlcmZhY2UKLV9VSV9Qcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvcl90eXBlID0gUHJvY2VzcyBDb21wb25lbnQgRGVzY3JpcHRvcgotX1VJX01ldGhvZFBsdWdpbl90eXBlID0gTWV0aG9kIFBsdWctaW4KLV9VSV9WYXJpYWJpbGl0eUVsZW1lbnRfdHlwZSA9IFZhcmlhYmlsaXR5IEVsZW1lbnQKLV9VSV9NZXRob2RVbml0X3R5cGUgPSBNZXRob2QgVW5pdAotX1VJX01ldGhvZENvbmZpZ3VyYXRpb25fdHlwZSA9IE1ldGhvZCBDb25maWd1cmF0aW9uCi1fVUlfUHJvY2Vzc0ZhbWlseV90eXBlID0gUHJvY2VzcyBGYW1pbHkKLV9VSV9NZXRob2RMaWJyYXJ5X3R5cGUgPSBNZXRob2QgTGlicmFyeQotX1VJX1Vua25vd25fdHlwZSA9IE9iamVjdAotCi1fVUlfVW5rbm93bl9kYXRhdHlwZT0gVmFsdWUKLQotX1VJX05hbWVkRWxlbWVudF9uYW1lX2ZlYXR1cmUgPSBOYW1lCi1fVUlfTWV0aG9kRWxlbWVudF9ndWlkX2ZlYXR1cmUgPSBHVUlECi1fVUlfTWV0aG9kRWxlbWVudF9icmllZkRlc2NyaXB0aW9uX2ZlYXR1cmUgPSBCcmllZiBEZXNjcmlwdGlvbgotX1VJX01ldGhvZEVsZW1lbnRfb3duZWRSdWxlc19mZWF0dXJlID0gT3duZWQgUnVsZXMKLV9VSV9NZXRob2RFbGVtZW50X3N1cHByZXNzZWRfZmVhdHVyZSA9IFN1cHByZXNzZWQKLV9VSV9NZXRob2RFbGVtZW50X29yZGVyaW5nR3VpZGVfZmVhdHVyZSA9IE9yZGVyaW5nIEd1aWRlCi1fVUlfQ29uc3RyYWludF9ib2R5X2ZlYXR1cmUgPSBCb2R5Ci1fVUlfQ29udGVudEVsZW1lbnRfc3VwcG9ydGluZ01hdGVyaWFsc19mZWF0dXJlID0gU3VwcG9ydGluZyBNYXRlcmlhbHMKLV9VSV9Db250ZW50RWxlbWVudF9jb25jZXB0c0FuZFBhcGVyc19mZWF0dXJlID0gQ29uY2VwdHMgQW5kIFBhcGVycwotX1VJX0NvbnRlbnRFbGVtZW50X2NoZWNrbGlzdHNfZmVhdHVyZSA9IENoZWNrbGlzdHMKLV9VSV9Db250ZW50RWxlbWVudF9ndWlkZWxpbmVzX2ZlYXR1cmUgPSBHdWlkZWxpbmVzCi1fVUlfQ29udGVudEVsZW1lbnRfZXhhbXBsZXNfZmVhdHVyZSA9IEV4YW1wbGVzCi1fVUlfQ29udGVudEVsZW1lbnRfYXNzZXRzX2ZlYXR1cmUgPSBBc3NldHMKLV9VSV9EZXNjcmliYWJsZUVsZW1lbnRfcHJlc2VudGF0aW9uTmFtZV9mZWF0dXJlID0gUHJlc2VudGF0aW9uIE5hbWUKLV9VSV9EZXNjcmliYWJsZUVsZW1lbnRfcHJlc2VudGF0aW9uX2ZlYXR1cmUgPSBQcmVzZW50YXRpb24KLV9VSV9EZXNjcmliYWJsZUVsZW1lbnRfc2hhcGVpY29uX2ZlYXR1cmUgPSBTaGFwZWljb24KLV9VSV9EZXNjcmliYWJsZUVsZW1lbnRfbm9kZWljb25fZmVhdHVyZSA9IE5vZGVpY29uCi1fVUlfQ29udGVudERlc2NyaXB0aW9uX21haW5EZXNjcmlwdGlvbl9mZWF0dXJlID0gTWFpbiBEZXNjcmlwdGlvbgotX1VJX0NvbnRlbnREZXNjcmlwdGlvbl9zZWN0aW9uc19mZWF0dXJlID0gU2VjdGlvbnMKLV9VSV9Db250ZW50RGVzY3JpcHRpb25fa2V5Q29uc2lkZXJhdGlvbnNfZmVhdHVyZSA9IEtleSBDb25zaWRlcmF0aW9ucwotX1VJX1NlY3Rpb25fc2VjdGlvbk5hbWVfZmVhdHVyZSA9IFNlY3Rpb24gTmFtZQotX1VJX1NlY3Rpb25fc2VjdGlvbkRlc2NyaXB0aW9uX2ZlYXR1cmUgPSBTZWN0aW9uIERlc2NyaXB0aW9uCi1fVUlfU2VjdGlvbl9zdWJTZWN0aW9uc19mZWF0dXJlID0gU3ViIFNlY3Rpb25zCi1fVUlfU2VjdGlvbl9wcmVkZWNlc3Nvcl9mZWF0dXJlID0gUHJlZGVjZXNzb3IKLV9VSV9Sb2xlX21vZGlmaWVzX2ZlYXR1cmUgPSBNb2RpZmllcwotX1VJX1JvbGVfcmVzcG9uc2libGVGb3JfZmVhdHVyZSA9IFJlc3BvbnNpYmxlIEZvcgotX1VJX1dvcmtQcm9kdWN0X3JlcG9ydHNfZmVhdHVyZSA9IFJlcG9ydHMKLV9VSV9Xb3JrUHJvZHVjdF90ZW1wbGF0ZXNfZmVhdHVyZSA9IFRlbXBsYXRlcwotX1VJX1dvcmtQcm9kdWN0X3Rvb2xNZW50b3JzX2ZlYXR1cmUgPSBUb29sIE1lbnRvcnMKLV9VSV9Xb3JrUHJvZHVjdF9lc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnNfZmVhdHVyZSA9IEVzdGltYXRpb24gQ29uc2lkZXJhdGlvbnMKLV9VSV9UYXNrX3BlcmZvcm1lZEJ5X2ZlYXR1cmUgPSBQZXJmb3JtZWQgQnkKLV9VSV9UYXNrX21hbmRhdG9yeUlucHV0X2ZlYXR1cmUgPSBNYW5kYXRvcnkgSW5wdXQKLV9VSV9UYXNrX291dHB1dF9mZWF0dXJlID0gT3V0cHV0Ci1fVUlfVGFza19hZGRpdGlvbmFsbHlQZXJmb3JtZWRCeV9mZWF0dXJlID0gQWRkaXRpb25hbGx5IFBlcmZvcm1lZCBCeQotX1VJX1Rhc2tfb3B0aW9uYWxJbnB1dF9mZWF0dXJlID0gT3B0aW9uYWwgSW5wdXQKLV9VSV9UYXNrX3N0ZXBzX2ZlYXR1cmUgPSBTdGVwcwotX1VJX1Rhc2tfdG9vbE1lbnRvcnNfZmVhdHVyZSA9IFRvb2wgTWVudG9ycwotX1VJX1Rhc2tfZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zX2ZlYXR1cmUgPSBFc3RpbWF0aW9uIENvbnNpZGVyYXRpb25zCi1fVUlfV29ya0RlZmluaXRpb25fcHJlY29uZGl0aW9uX2ZlYXR1cmUgPSBQcmVjb25kaXRpb24KLV9VSV9Xb3JrRGVmaW5pdGlvbl9wb3N0Y29uZGl0aW9uX2ZlYXR1cmUgPSBQb3N0Y29uZGl0aW9uCi1fVUlfQXJ0aWZhY3RfY29udGFpbmVyQXJ0aWZhY3RfZmVhdHVyZSA9IENvbnRhaW5lciBBcnRpZmFjdAotX1VJX0FydGlmYWN0X2NvbnRhaW5lZEFydGlmYWN0c19mZWF0dXJlID0gQ29udGFpbmVkIEFydGlmYWN0cwotX1VJX0RlbGl2ZXJhYmxlX2RlbGl2ZXJlZFdvcmtQcm9kdWN0c19mZWF0dXJlID0gRGVsaXZlcmVkIFdvcmsgUHJvZHVjdHMKLV9VSV9NZXRob2RQYWNrYWdlX2dsb2JhbF9mZWF0dXJlID0gR2xvYmFsCi1fVUlfTWV0aG9kUGFja2FnZV9yZXVzZWRQYWNrYWdlc19mZWF0dXJlID0gUmV1c2VkIFBhY2thZ2VzCi1fVUlfTWV0aG9kUGFja2FnZV9wYXJlbnRQYWNrYWdlX2ZlYXR1cmUgPSBQYXJlbnQgUGFja2FnZQotX1VJX01ldGhvZFBhY2thZ2VfY2hpbGRQYWNrYWdlc19mZWF0dXJlID0gQ2hpbGQgUGFja2FnZXMKLV9VSV9Db250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfZmVhdHVyZSA9IENvbnRlbnQgRWxlbWVudHMKLV9VSV9BcnRpZmFjdERlc2NyaXB0aW9uX2JyaWVmT3V0bGluZV9mZWF0dXJlID0gQnJpZWYgT3V0bGluZQotX1VJX0FydGlmYWN0RGVzY3JpcHRpb25fcmVwcmVzZW50YXRpb25PcHRpb25zX2ZlYXR1cmUgPSBSZXByZXNlbnRhdGlvbiBPcHRpb25zCi1fVUlfV29ya1Byb2R1Y3REZXNjcmlwdGlvbl9leHRlcm5hbElkX2ZlYXR1cmUgPSBFeHRlcm5hbCBJZAotX1VJX1dvcmtQcm9kdWN0RGVzY3JpcHRpb25fcHVycG9zZV9mZWF0dXJlID0gUHVycG9zZQotX1VJX1dvcmtQcm9kdWN0RGVzY3JpcHRpb25faW1wYWN0T2ZOb3RIYXZpbmdfZmVhdHVyZSA9IEltcGFjdCBPZiBOb3QgSGF2aW5nCi1fVUlfV29ya1Byb2R1Y3REZXNjcmlwdGlvbl9yZWFzb25zRm9yTm90TmVlZGluZ19mZWF0dXJlID0gUmVhc29ucyBGb3IgTm90IE5lZWRpbmcKLV9VSV9EZWxpdmVyYWJsZURlc2NyaXB0aW9uX2V4dGVybmFsRGVzY3JpcHRpb25fZmVhdHVyZSA9IEV4dGVybmFsIERlc2NyaXB0aW9uCi1fVUlfRGVsaXZlcmFibGVEZXNjcmlwdGlvbl9wYWNrYWdpbmdHdWlkYW5jZV9mZWF0dXJlID0gUGFja2FnaW5nIEd1aWRhbmNlCi1fVUlfUm9sZURlc2NyaXB0aW9uX3NraWxsc19mZWF0dXJlID0gU2tpbGxzCi1fVUlfUm9sZURlc2NyaXB0aW9uX2Fzc2lnbm1lbnRBcHByb2FjaGVzX2ZlYXR1cmUgPSBBc3NpZ25tZW50IEFwcHJvYWNoZXMKLV9VSV9Sb2xlRGVzY3JpcHRpb25fc3lub255bXNfZmVhdHVyZSA9IFN5bm9ueW1zCi1fVUlfVGFza0Rlc2NyaXB0aW9uX3B1cnBvc2VfZmVhdHVyZSA9IFB1cnBvc2UKLV9VSV9UYXNrRGVzY3JpcHRpb25fYWx0ZXJuYXRpdmVzX2ZlYXR1cmUgPSBBbHRlcm5hdGl2ZXMKLV9VSV9HdWlkYW5jZURlc2NyaXB0aW9uX2F0dGFjaG1lbnRzX2ZlYXR1cmUgPSBBdHRhY2htZW50cwotX1VJX1ByYWN0aWNlRGVzY3JpcHRpb25fYWRkaXRpb25hbEluZm9fZmVhdHVyZSA9IEFkZGl0aW9uYWwgSW5mbwotX1VJX1ByYWN0aWNlRGVzY3JpcHRpb25fcHJvYmxlbV9mZWF0dXJlID0gUHJvYmxlbQotX1VJX1ByYWN0aWNlRGVzY3JpcHRpb25fYmFja2dyb3VuZF9mZWF0dXJlID0gQmFja2dyb3VuZAotX1VJX1ByYWN0aWNlRGVzY3JpcHRpb25fZ29hbHNfZmVhdHVyZSA9IEdvYWxzCi1fVUlfUHJhY3RpY2VEZXNjcmlwdGlvbl9hcHBsaWNhdGlvbl9mZWF0dXJlID0gQXBwbGljYXRpb24KLV9VSV9QcmFjdGljZURlc2NyaXB0aW9uX2xldmVsc09mQWRvcHRpb25fZmVhdHVyZSA9IExldmVscyBPZiBBZG9wdGlvbgotX1VJX1BvaW50X3hfZmVhdHVyZSA9IFgKLV9VSV9Qb2ludF95X2ZlYXR1cmUgPSBZCi1fVUlfR3JhcGhFbGVtZW50X3Bvc2l0aW9uX2ZlYXR1cmUgPSBQb3NpdGlvbgotX1VJX0dyYXBoRWxlbWVudF9jb250YWluZWRfZmVhdHVyZSA9IENvbnRhaW5lZAotX1VJX0dyYXBoRWxlbWVudF9saW5rX2ZlYXR1cmUgPSBMaW5rCi1fVUlfR3JhcGhFbGVtZW50X2FuY2hvcmFnZV9mZWF0dXJlID0gQW5jaG9yYWdlCi1fVUlfR3JhcGhFbGVtZW50X3NlbWFudGljTW9kZWxfZmVhdHVyZSA9IFNlbWFudGljIE1vZGVsCi1fVUlfRGlhZ3JhbUVsZW1lbnRfaXNWaXNpYmxlX2ZlYXR1cmUgPSBJcyBWaXNpYmxlCi1fVUlfRGlhZ3JhbUVsZW1lbnRfY29udGFpbmVyX2ZlYXR1cmUgPSBDb250YWluZXIKLV9VSV9EaWFncmFtRWxlbWVudF9yZWZlcmVuY2VfZmVhdHVyZSA9IFJlZmVyZW5jZQotX1VJX0RpYWdyYW1FbGVtZW50X3Byb3BlcnR5X2ZlYXR1cmUgPSBQcm9wZXJ0eQotX1VJX0RpYWdyYW1MaW5rX3pvb21fZmVhdHVyZSA9IFpvb20KLV9VSV9EaWFncmFtTGlua192aWV3cG9ydF9mZWF0dXJlID0gVmlld3BvcnQKLV9VSV9EaWFncmFtTGlua19ncmFwaEVsZW1lbnRfZmVhdHVyZSA9IEdyYXBoIEVsZW1lbnQKLV9VSV9EaWFncmFtTGlua19kaWFncmFtX2ZlYXR1cmUgPSBEaWFncmFtCi1fVUlfR3JhcGhDb25uZWN0b3JfZ3JhcGhFbGVtZW50X2ZlYXR1cmUgPSBHcmFwaCBFbGVtZW50Ci1fVUlfR3JhcGhDb25uZWN0b3JfZ3JhcGhFZGdlX2ZlYXR1cmUgPSBHcmFwaCBFZGdlCi1fVUlfU2VtYW50aWNNb2RlbEJyaWRnZV9wcmVzZW50YXRpb25fZmVhdHVyZSA9IFByZXNlbnRhdGlvbgotX1VJX1NlbWFudGljTW9kZWxCcmlkZ2VfZ3JhcGhFbGVtZW50X2ZlYXR1cmUgPSBHcmFwaCBFbGVtZW50Ci1fVUlfU2VtYW50aWNNb2RlbEJyaWRnZV9kaWFncmFtX2ZlYXR1cmUgPSBEaWFncmFtCi1fVUlfRGltZW5zaW9uX3dpZHRoX2ZlYXR1cmUgPSBXaWR0aAotX1VJX0RpbWVuc2lvbl9oZWlnaHRfZmVhdHVyZSA9IEhlaWdodAotX1VJX1JlZmVyZW5jZV9pc0luZGl2aWR1YWxSZXByZXNlbnRhdGlvbl9mZWF0dXJlID0gSXMgSW5kaXZpZHVhbCBSZXByZXNlbnRhdGlvbgotX1VJX1JlZmVyZW5jZV9yZWZlcmVuY2VkX2ZlYXR1cmUgPSBSZWZlcmVuY2VkCi1fVUlfUHJvcGVydHlfa2V5X2ZlYXR1cmUgPSBLZXkKLV9VSV9Qcm9wZXJ0eV92YWx1ZV9mZWF0dXJlID0gVmFsdWUKLV9VSV9HcmFwaEVkZ2VfYW5jaG9yX2ZlYXR1cmUgPSBBbmNob3IKLV9VSV9HcmFwaEVkZ2Vfd2F5cG9pbnRzX2ZlYXR1cmUgPSBXYXlwb2ludHMKLV9VSV9EaWFncmFtX3pvb21fZmVhdHVyZSA9IFpvb20KLV9VSV9EaWFncmFtX3ZpZXdwb2ludF9mZWF0dXJlID0gVmlld3BvaW50Ci1fVUlfRGlhZ3JhbV9kaWFncmFtTGlua19mZWF0dXJlID0gRGlhZ3JhbSBMaW5rCi1fVUlfRGlhZ3JhbV9uYW1lc3BhY2VfZmVhdHVyZSA9IE5hbWVzcGFjZQotX1VJX0dyYXBoTm9kZV9zaXplX2ZlYXR1cmUgPSBTaXplCi1fVUlfU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnRfdHlwZUluZm9fZmVhdHVyZSA9IFR5cGUgSW5mbwotX1VJX1VNQVNlbWFudGljTW9kZWxCcmlkZ2VfZWxlbWVudF9mZWF0dXJlID0gRWxlbWVudAotX1VJX0NvcmVTZW1hbnRpY01vZGVsQnJpZGdlX2VsZW1lbnRfZmVhdHVyZSA9IEVsZW1lbnQKLV9VSV9UZXh0RWxlbWVudF90ZXh0X2ZlYXR1cmUgPSBUZXh0Ci1fVUlfSW1hZ2VfdXJpX2ZlYXR1cmUgPSBVcmkKLV9VSV9JbWFnZV9taW1lVHlwZV9mZWF0dXJlID0gTWltZSBUeXBlCi1fVUlfUG9seWxpbmVfY2xvc2VkX2ZlYXR1cmUgPSBDbG9zZWQKLV9VSV9Qb2x5bGluZV93YXlwb2ludHNfZmVhdHVyZSA9IFdheXBvaW50cwotX1VJX0VsbGlwc2VfcmFkaXVzWF9mZWF0dXJlID0gUmFkaXVzIFgKLV9VSV9FbGxpcHNlX3JhZGl1c1lfZmVhdHVyZSA9IFJhZGl1cyBZCi1fVUlfRWxsaXBzZV9yb3RhdGlvbl9mZWF0dXJlID0gUm90YXRpb24KLV9VSV9FbGxpcHNlX3N0YXJ0QW5nbGVfZmVhdHVyZSA9IFN0YXJ0IEFuZ2xlCi1fVUlfRWxsaXBzZV9lbmRBbmdsZV9mZWF0dXJlID0gRW5kIEFuZ2xlCi1fVUlfRWxsaXBzZV9jZW50ZXJfZmVhdHVyZSA9IENlbnRlcgotX1VJX0FjdGl2aXR5X2JyZWFrZG93bkVsZW1lbnRzX2ZlYXR1cmUgPSBCcmVha2Rvd24gRWxlbWVudHMKLV9VSV9BY3Rpdml0eV9yb2FkbWFwc19mZWF0dXJlID0gUm9hZG1hcHMKLV9VSV9BY3Rpdml0eV9zdXBwb3J0aW5nTWF0ZXJpYWxzX2ZlYXR1cmUgPSBTdXBwb3J0aW5nIE1hdGVyaWFscwotX1VJX0FjdGl2aXR5X2NoZWNrbGlzdHNfZmVhdHVyZSA9IENoZWNrbGlzdHMKLV9VSV9BY3Rpdml0eV9jb25jZXB0c19mZWF0dXJlID0gQ29uY2VwdHMKLV9VSV9BY3Rpdml0eV9leGFtcGxlc19mZWF0dXJlID0gRXhhbXBsZXMKLV9VSV9BY3Rpdml0eV9ndWlkZWxpbmVzX2ZlYXR1cmUgPSBHdWlkZWxpbmVzCi1fVUlfQWN0aXZpdHlfcmV1c2FibGVBc3NldHNfZmVhdHVyZSA9IFJldXNhYmxlIEFzc2V0cwotX1VJX0FjdGl2aXR5X2lzRW5hY3RhYmxlX2ZlYXR1cmUgPSBJcyBFbmFjdGFibGUKLV9VSV9Xb3JrQnJlYWtkb3duRWxlbWVudF9pc1JlcGVhdGFibGVfZmVhdHVyZSA9IElzIFJlcGVhdGFibGUKLV9VSV9Xb3JrQnJlYWtkb3duRWxlbWVudF9pc09uZ29pbmdfZmVhdHVyZSA9IElzIE9uZ29pbmcKLV9VSV9Xb3JrQnJlYWtkb3duRWxlbWVudF9pc0V2ZW50RHJpdmVuX2ZlYXR1cmUgPSBJcyBFdmVudCBEcml2ZW4KLV9VSV9Xb3JrQnJlYWtkb3duRWxlbWVudF9saW5rVG9QcmVkZWNlc3Nvcl9mZWF0dXJlID0gTGluayBUbyBQcmVkZWNlc3NvcgotX1VJX0JyZWFrZG93bkVsZW1lbnRfcHJlZml4X2ZlYXR1cmUgPSBQcmVmaXgKLV9VSV9CcmVha2Rvd25FbGVtZW50X2lzUGxhbm5lZF9mZWF0dXJlID0gSXMgUGxhbm5lZAotX1VJX0JyZWFrZG93bkVsZW1lbnRfaGFzTXVsdGlwbGVPY2N1cnJlbmNlc19mZWF0dXJlID0gSGFzIE11bHRpcGxlIE9jY3VycmVuY2VzCi1fVUlfQnJlYWtkb3duRWxlbWVudF9pc09wdGlvbmFsX2ZlYXR1cmUgPSBJcyBPcHRpb25hbAotX1VJX0JyZWFrZG93bkVsZW1lbnRfcHJlc2VudGVkQWZ0ZXJfZmVhdHVyZSA9IFByZXNlbnRlZCBBZnRlcgotX1VJX0JyZWFrZG93bkVsZW1lbnRfcHJlc2VudGVkQmVmb3JlX2ZlYXR1cmUgPSBQcmVzZW50ZWQgQmVmb3JlCi1fVUlfQnJlYWtkb3duRWxlbWVudF9wbGFubmluZ0RhdGFfZmVhdHVyZSA9IFBsYW5uaW5nIERhdGEKLV9VSV9CcmVha2Rvd25FbGVtZW50X3N1cGVyQWN0aXZpdGllc19mZWF0dXJlID0gU3VwZXIgQWN0aXZpdHkKLV9VSV9UZWFtUHJvZmlsZV90ZWFtUm9sZXNfZmVhdHVyZSA9IFRlYW0gUm9sZXMKLV9VSV9UZWFtUHJvZmlsZV9zdXBlclRlYW1fZmVhdHVyZSA9IFN1cGVyIFRlYW0KLV9VSV9UZWFtUHJvZmlsZV9zdWJUZWFtX2ZlYXR1cmUgPSBTdWIgVGVhbQotX1VJX1JvbGVEZXNjcmlwdG9yX1JvbGVfZmVhdHVyZSA9IFJvbGUKLV9VSV9Sb2xlRGVzY3JpcHRvcl9tb2RpZmllc19mZWF0dXJlID0gTW9kaWZpZXMKLV9VSV9Sb2xlRGVzY3JpcHRvcl9yZXNwb25zaWJsZUZvcl9mZWF0dXJlID0gUmVzcG9uc2libGUgRm9yCi1fVUlfV29ya09yZGVyX2xpbmtUeXBlX2ZlYXR1cmUgPSBMaW5rIFR5cGUKLV9VSV9Xb3JrT3JkZXJfcHJlZF9mZWF0dXJlID0gUHJlZAotX1VJX1BsYW5uaW5nRGF0YV9zdGFydERhdGVfZmVhdHVyZSA9IFN0YXJ0IERhdGUKLV9VSV9QbGFubmluZ0RhdGFfZmluaXNoRGF0ZV9mZWF0dXJlID0gRmluaXNoIERhdGUKLV9VSV9QbGFubmluZ0RhdGFfcmFua19mZWF0dXJlID0gUmFuawotX1VJX0Rlc2NyaXB0b3JfaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlX2ZlYXR1cmUgPSBJcyBTeW5jaHJvbml6ZWQgV2l0aCBTb3VyY2UKLV9VSV9Xb3JrUHJvZHVjdERlc2NyaXB0b3JfYWN0aXZpdHlFbnRyeVN0YXRlX2ZlYXR1cmUgPSBBY3Rpdml0eSBFbnRyeSBTdGF0ZQotX1VJX1dvcmtQcm9kdWN0RGVzY3JpcHRvcl9hY3Rpdml0eUV4aXRTdGF0ZV9mZWF0dXJlID0gQWN0aXZpdHkgRXhpdCBTdGF0ZQotX1VJX1dvcmtQcm9kdWN0RGVzY3JpcHRvcl9Xb3JrUHJvZHVjdF9mZWF0dXJlID0gV29yayBQcm9kdWN0Ci1fVUlfV29ya1Byb2R1Y3REZXNjcmlwdG9yX2ltcGFjdGVkQnlfZmVhdHVyZSA9IEltcGFjdGVkIEJ5Ci1fVUlfV29ya1Byb2R1Y3REZXNjcmlwdG9yX2ltcGFjdHNfZmVhdHVyZSA9IEltcGFjdHMKLV9VSV9Xb3JrUHJvZHVjdERlc2NyaXB0b3JfZGVsaXZlcmFibGVQYXJ0c19mZWF0dXJlID0gRGVsaXZlcmFibGUgUGFydHMKLV9VSV9UYXNrRGVzY3JpcHRvcl9UYXNrX2ZlYXR1cmUgPSBUYXNrCi1fVUlfVGFza0Rlc2NyaXB0b3JfYWRkaXRpb25hbGx5UGVyZm9ybWVkQnlfZmVhdHVyZSA9IEFkZGl0aW9uYWwgUGVyZm9ybWVyCi1fVUlfVGFza0Rlc2NyaXB0b3JfYXNzaXN0ZWRCeV9mZWF0dXJlID0gQXNzaXN0ZWQgQnkKLV9VSV9UYXNrRGVzY3JpcHRvcl9leHRlcm5hbElucHV0X2ZlYXR1cmUgPSBFeHRlcm5hbCBJbnB1dAotX1VJX1Rhc2tEZXNjcmlwdG9yX21hbmRhdG9yeUlucHV0X2ZlYXR1cmUgPSBNYW5kYXRvcnkgSW5wdXQKLV9VSV9UYXNrRGVzY3JpcHRvcl9vcHRpb25hbElucHV0X2ZlYXR1cmUgPSBPcHRpb25hbCBJbnB1dAotX1VJX1Rhc2tEZXNjcmlwdG9yX291dHB1dF9mZWF0dXJlID0gT3V0cHV0Ci1fVUlfVGFza0Rlc2NyaXB0b3JfcGVyZm9ybWVkUHJpbWFyaWx5QnlfZmVhdHVyZSA9IFByaW1hcnkgUGVyZm9ybWVyCi1fVUlfVGFza0Rlc2NyaXB0b3Jfc2VsZWN0ZWRTdGVwc19mZWF0dXJlID0gU2VsZWN0ZWQgU3RlcHMKLV9VSV9Db21wb3NpdGVSb2xlX2FnZ3JlZ2F0ZWRSb2xlc19mZWF0dXJlID0gQWdncmVnYXRlZCBSb2xlcwotX1VJX0JyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbl91c2FnZUd1aWRhbmNlX2ZlYXR1cmUgPSBVc2FnZSBHdWlkYW5jZQotX1VJX0FjdGl2aXR5RGVzY3JpcHRpb25fcHVycG9zZV9mZWF0dXJlID0gUHVycG9zZQotX1VJX0FjdGl2aXR5RGVzY3JpcHRpb25fYWx0ZXJuYXRpdmVzX2ZlYXR1cmUgPSBBbHRlcm5hdGl2ZXMKLV9VSV9BY3Rpdml0eURlc2NyaXB0aW9uX2hvd3RvU3RhZmZfZmVhdHVyZSA9IEhvd3RvIFN0YWZmCi1fVUlfRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fc2NhbGVfZmVhdHVyZSA9IFNjYWxlCi1fVUlfRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fcHJvamVjdENoYXJhY3RlcmlzdGljc19mZWF0dXJlID0gUHJvamVjdCBDaGFyYWN0ZXJpc3RpY3MKLV9VSV9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl9yaXNrTGV2ZWxfZmVhdHVyZSA9IFJpc2sgTGV2ZWwKLV9VSV9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl9lc3RpbWF0aW5nVGVjaG5pcXVlX2ZlYXR1cmUgPSBFc3RpbWF0aW5nIFRlY2huaXF1ZQotX1VJX0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX3Byb2plY3RNZW1iZXJFeHBlcnRpc2VfZmVhdHVyZSA9IFByb2plY3QgTWVtYmVyIEV4cGVydGlzZQotX1VJX0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX3R5cGVPZkNvbnRyYWN0X2ZlYXR1cmUgPSBUeXBlIE9mIENvbnRyYWN0Ci1fVUlfUHJvY2Vzc0Rlc2NyaXB0aW9uX2V4dGVybmFsSWRfZmVhdHVyZSA9IEV4dGVybmFsIElkCi1fVUlfUHJvY2Vzc0Rlc2NyaXB0aW9uX3Njb3BlX2ZlYXR1cmUgPSBTY29wZQotX1VJX1Byb2Nlc3NEZXNjcmlwdGlvbl91c2FnZU5vdGVzX2ZlYXR1cmUgPSBVc2FnZSBOb3RlcwotX1VJX0Rlc2NyaXB0b3JEZXNjcmlwdGlvbl9yZWZpbmVkRGVzY3JpcHRpb25fZmVhdHVyZSA9IFJlZmluZWQgRGVzY3JpcHRpb24KLV9VSV9QcmFjdGljZV9zdWJQcmFjdGljZXNfZmVhdHVyZSA9IFN1YiBQcmFjdGljZXMKLV9VSV9QcmFjdGljZV9jb250ZW50UmVmZXJlbmNlc19mZWF0dXJlID0gQ29udGVudCBSZWZlcmVuY2VzCi1fVUlfUHJhY3RpY2VfYWN0aXZpdHlSZWZlcmVuY2VzX2ZlYXR1cmUgPSBBY3Rpdml0eSBSZWZlcmVuY2VzCi1fVUlfU3RhdGVfV29ya1Byb2R1Y3RfZmVhdHVyZSA9IFdvcmsgUHJvZHVjdAotX1VJX1N0YXRlX1JlZ2lvbl9mZWF0dXJlID0gUmVnaW9uCi1fVUlfU3RhdGVfc3VibWFjaGluZV9mZWF0dXJlID0gU3VibWFjaGluZQotX1VJX1ZlcnRleF9jb250YWluZXJfZmVhdHVyZSA9IENvbnRhaW5lcgotX1VJX1ZlcnRleF9vdXRnb2luZ19mZWF0dXJlID0gT3V0Z29pbmcKLV9VSV9WZXJ0ZXhfaW5jb21pbmdfZmVhdHVyZSA9IEluY29taW5nCi1fVUlfUmVnaW9uX1ZlcnRleF9mZWF0dXJlID0gVmVydGV4Ci1fVUlfUmVnaW9uX1RyYW5zaXRpb25fZmVhdHVyZSA9IFRyYW5zaXRpb24KLV9VSV9SZWdpb25fU3RhdGVfZmVhdHVyZSA9IFN0YXRlCi1fVUlfUmVnaW9uX1N0YXRlTWFjaGluZV9mZWF0dXJlID0gU3RhdGUgTWFjaGluZQotX1VJX1N0YXRlTWFjaGluZV9SZWdpb25fZmVhdHVyZSA9IFJlZ2lvbgotX1VJX1RyYW5zaXRpb25fV29ya0RlZmluaXRpb25fZmVhdHVyZSA9IFdvcmsgRGVmaW5pdGlvbgotX1VJX1RyYW5zaXRpb25fY29udGFpbmVyX2ZlYXR1cmUgPSBDb250YWluZXIKLV9VSV9UcmFuc2l0aW9uX3NvdXJjZV9mZWF0dXJlID0gU291cmNlCi1fVUlfVHJhbnNpdGlvbl90YXJnZXRfZmVhdHVyZSA9IFRhcmdldAotX1VJX0Rpc2NpcGxpbmVfdGFza3NfZmVhdHVyZSA9IFRhc2tzCi1fVUlfRGlzY2lwbGluZV9zdWJkaXNjaXBsaW5lX2ZlYXR1cmUgPSBTdWJkaXNjaXBsaW5lCi1fVUlfRGlzY2lwbGluZV9yZWZlcmVuY2VXb3JrZmxvd3NfZmVhdHVyZSA9IFJlZmVyZW5jZSBXb3JrZmxvd3MKLV9VSV9Sb2xlU2V0X3JvbGVzX2ZlYXR1cmUgPSBSb2xlcwotX1VJX0RvbWFpbl93b3JrUHJvZHVjdHNfZmVhdHVyZSA9IFdvcmsgUHJvZHVjdHMKLV9VSV9Eb21haW5fc3ViZG9tYWluc19mZWF0dXJlID0gU3ViZG9tYWlucwotX1VJX1dvcmtQcm9kdWN0VHlwZV93b3JrUHJvZHVjdHNfZmVhdHVyZSA9IFdvcmsgUHJvZHVjdHMKLV9VSV9EaXNjaXBsaW5lR3JvdXBpbmdfZGlzY2lwbGluZXNfZmVhdHVyZSA9IERpc2NpcGxpbmVzCi1fVUlfVG9vbF90b29sTWVudG9yc19mZWF0dXJlID0gVG9vbCBNZW50b3JzCi1fVUlfUm9sZVNldEdyb3VwaW5nX3JvbGVTZXRzX2ZlYXR1cmUgPSBSb2xlIFNldHMKLV9VSV9DdXN0b21DYXRlZ29yeV9jYXRlZ29yaXplZEVsZW1lbnRzX2ZlYXR1cmUgPSBDYXRlZ29yaXplZCBFbGVtZW50cwotX1VJX0N1c3RvbUNhdGVnb3J5X3N1YkNhdGVnb3JpZXNfZmVhdHVyZSA9IFN1YiBDYXRlZ29yaWVzCi1fVUlfRGVsaXZlcnlQcm9jZXNzX2VkdWNhdGlvbk1hdGVyaWFsc19mZWF0dXJlID0gRWR1Y2F0aW9uIE1hdGVyaWFscwotX1VJX0RlbGl2ZXJ5UHJvY2Vzc19jb21tdW5pY2F0aW9uc01hdGVyaWFsc19mZWF0dXJlID0gQ29tbXVuaWNhdGlvbnMgTWF0ZXJpYWxzCi1fVUlfUHJvY2Vzc19pbmNsdWRlc1BhdHRlcm5zX2ZlYXR1cmUgPSBJbmNsdWRlcyBQYXR0ZXJucwotX1VJX1Byb2Nlc3NfZGVmYXVsdENvbnRleHRfZmVhdHVyZSA9IERlZmF1bHQgQ29udGV4dAotX1VJX1Byb2Nlc3NfdmFsaWRDb250ZXh0X2ZlYXR1cmUgPSBWYWxpZCBDb250ZXh0Ci1fVUlfUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGVfYmFzZWRPblByb2Nlc3Nlc19mZWF0dXJlID0gQmFzZWQgT24gUHJvY2Vzc2VzCi1fVUlfUHJvY2Vzc0NvbXBvbmVudF9pbnRlcmZhY2VzX2ZlYXR1cmUgPSBJbnRlcmZhY2VzCi1fVUlfUHJvY2Vzc0NvbXBvbmVudF9wcm9jZXNzX2ZlYXR1cmUgPSBQcm9jZXNzCi1fVUlfUHJvY2Vzc1BhY2thZ2VfcHJvY2Vzc0VsZW1lbnRzX2ZlYXR1cmUgPSBQcm9jZXNzIEVsZW1lbnRzCi1fVUlfUHJvY2Vzc1BhY2thZ2VfZGlhZ3JhbXNfZmVhdHVyZSA9IERpYWdyYW1zCi1fVUlfUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZV9pbnRlcmZhY2VTcGVjaWZpY2F0aW9uc19mZWF0dXJlID0gSW50ZXJmYWNlIFNwZWNpZmljYXRpb25zCi1fVUlfUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZV9pbnRlcmZhY2VJT19mZWF0dXJlID0gSW50ZXJmYWNlIElPCi1fVUlfUHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3JfUHJvY2Vzc0NvbXBvbmVudF9mZWF0dXJlID0gUHJvY2VzcyBDb21wb25lbnQKLV9VSV9NZXRob2RQbHVnaW5fdXNlckNoYW5nZWFibGVfZmVhdHVyZSA9IFVzZXIgQ2hhbmdlYWJsZQotX1VJX01ldGhvZFBsdWdpbl9tZXRob2RQYWNrYWdlc19mZWF0dXJlID0gTWV0aG9kIFBhY2thZ2VzCi1fVUlfTWV0aG9kUGx1Z2luX2Jhc2VzX2ZlYXR1cmUgPSBCYXNlcwotX1VJX1ZhcmlhYmlsaXR5RWxlbWVudF92YXJpYWJpbGl0eVR5cGVfZmVhdHVyZSA9IFZhcmlhYmlsaXR5IFR5cGUKLV9VSV9WYXJpYWJpbGl0eUVsZW1lbnRfdmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudF9mZWF0dXJlID0gVmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudAotX1VJX01ldGhvZFVuaXRfYXV0aG9yc19mZWF0dXJlID0gQXV0aG9ycwotX1VJX01ldGhvZFVuaXRfY2hhbmdlRGF0ZV9mZWF0dXJlID0gQ2hhbmdlIERhdGUKLV9VSV9NZXRob2RVbml0X2NoYW5nZURlc2NyaXB0aW9uX2ZlYXR1cmUgPSBDaGFuZ2UgRGVzY3JpcHRpb24KLV9VSV9NZXRob2RVbml0X3ZlcnNpb25fZmVhdHVyZSA9IFZlcnNpb24KLV9VSV9NZXRob2RVbml0X2NvcHlyaWdodFN0YXRlbWVudF9mZWF0dXJlID0gQ29weXJpZ2h0IFN0YXRlbWVudAotX1VJX01ldGhvZENvbmZpZ3VyYXRpb25fbWV0aG9kUGx1Z2luU2VsZWN0aW9uX2ZlYXR1cmUgPSBNZXRob2QgUGx1Zy1pbiBTZWxlY3Rpb24KLV9VSV9NZXRob2RDb25maWd1cmF0aW9uX21ldGhvZFBhY2thZ2VTZWxlY3Rpb25fZmVhdHVyZSA9IE1ldGhvZCBQYWNrYWdlIFNlbGVjdGlvbgotX1VJX01ldGhvZENvbmZpZ3VyYXRpb25fcHJvY2Vzc1ZpZXdzX2ZlYXR1cmUgPSBQcm9jZXNzIFZpZXdzCi1fVUlfTWV0aG9kQ29uZmlndXJhdGlvbl9kZWZhdWx0Vmlld19mZWF0dXJlID0gRGVmYXVsdCBWaWV3Ci1fVUlfTWV0aG9kQ29uZmlndXJhdGlvbl9iYXNlQ29uZmlndXJhdGlvbnNfZmVhdHVyZSA9IEJhc2UgQ29uZmlndXJhdGlvbnMKLV9VSV9Qcm9jZXNzRmFtaWx5X2RlbGl2ZXJ5UHJvY2Vzc2VzX2ZlYXR1cmUgPSBEZWxpdmVyeSBQcm9jZXNzZXMKLV9VSV9NZXRob2RMaWJyYXJ5X21ldGhvZFBsdWdpbnNfZmVhdHVyZSA9IE1ldGhvZCBQbHVnLWlucwotX1VJX01ldGhvZExpYnJhcnlfcHJlZGVmaW5lZENvbmZpZ3VyYXRpb25zX2ZlYXR1cmUgPSBQcmVkZWZpbmVkIENvbmZpZ3VyYXRpb25zCi1fVUlfVW5rbm93bl9mZWF0dXJlID0gVW5zcGVjaWZpZWQKLQotX1VJX1dvcmtPcmRlclR5cGVfZmluaXNoVG9TdGFydF9saXRlcmFsID0gZmluaXNoVG9TdGFydAotX1VJX1dvcmtPcmRlclR5cGVfZmluaXNoVG9GaW5pc2hfbGl0ZXJhbCA9IGZpbmlzaFRvRmluaXNoCi1fVUlfV29ya09yZGVyVHlwZV9zdGFydFRvU3RhcnRfbGl0ZXJhbCA9IHN0YXJ0VG9TdGFydAotX1VJX1dvcmtPcmRlclR5cGVfc3RhcnRUb0ZpbmlzaF9saXRlcmFsID0gc3RhcnRUb0ZpbmlzaAotX1VJX1BzZXVkb1N0YXRlS2luZF9pbml0aWFsX2xpdGVyYWwgPSBpbml0aWFsCi1fVUlfUHNldWRvU3RhdGVLaW5kX2pvaW5fbGl0ZXJhbCA9IGpvaW4KLV9VSV9Qc2V1ZG9TdGF0ZUtpbmRfZm9ya19saXRlcmFsID0gZm9yawotX1VJX1BzZXVkb1N0YXRlS2luZF9qdW5jdGlvbl9saXRlcmFsID0ganVuY3Rpb24KLV9VSV9Qc2V1ZG9TdGF0ZUtpbmRfY2hvaWNlX2xpdGVyYWwgPSBjaG9pY2UKLV9VSV9Qc2V1ZG9TdGF0ZUtpbmRfZW50cnlQb2ludF9saXRlcmFsID0gZW50cnlQb2ludAotX1VJX1BzZXVkb1N0YXRlS2luZF9leGl0UG9pbnRfbGl0ZXJhbCA9IGV4aXRQb2ludAotX1VJX1BzZXVkb1N0YXRlS2luZF90ZXJtaW5hdGVfbGl0ZXJhbCA9IHRlcm1pbmF0ZQotX1VJX1ZhcmlhYmlsaXR5VHlwZV9uYV9saXRlcmFsID0gbmEKLV9VSV9WYXJpYWJpbGl0eVR5cGVfY29udHJpYnV0ZXNfbGl0ZXJhbCA9IGNvbnRyaWJ1dGVzCi1fVUlfVmFyaWFiaWxpdHlUeXBlX2V4dGVuZHNfbGl0ZXJhbCA9IGV4dGVuZHMKLV9VSV9WYXJpYWJpbGl0eVR5cGVfcmVwbGFjZXNfbGl0ZXJhbCA9IHJlcGxhY2VzCi1fVUlfVmFyaWFiaWxpdHlUeXBlX2xvY2FsQ29udHJpYnV0aW9uX2xpdGVyYWwgPSBsb2NhbENvbnRyaWJ1dGlvbgotX1VJX1ZhcmlhYmlsaXR5VHlwZV9sb2NhbFJlcGxhY2VtZW50X2xpdGVyYWwgPSBsb2NhbFJlcGxhY2VtZW50Ci1fVUlfQXJ0aWZhY3REZXNjcmlwdG9yX3R5cGUgPSBBcnRpZmFjdCBEZXNjcmlwdG9yCi1fVUlfRGVsaXZlcmFibGVEZXNjcmlwdG9yX3R5cGUgPSBEZWxpdmVyYWJsZSBEZXNjcmlwdG9yCi1fVUlfT3V0Y29tZURlc2NyaXB0b3JfdHlwZSA9IE91dGNvbWUgRGVzY3JpcHRvcgotX1VJX01ldGhvZEVsZW1lbnRQcm9wZXJ0eV90eXBlID0gTWV0aG9kIEVsZW1lbnQgUHJvcGVydHkKLV9VSV9NZXRob2RFbGVtZW50X21ldGhvZEVsZW1lbnRQcm9wZXJ0eV9mZWF0dXJlID0gTWV0aG9kIEVsZW1lbnQgUHJvcGVydHkKLV9VSV9NZXRob2RFbGVtZW50UHJvcGVydHlfdmFsdWVfZmVhdHVyZSA9IFZhbHVlCi1fVUlfTWV0aG9kQ29uZmlndXJhdGlvbl9zdWJ0cmFjdGVkQ2F0ZWdvcnlfZmVhdHVyZSA9IFN1YnRyYWN0ZWQgQ2F0ZWdvcnkKLV9VSV9NZXRob2RDb25maWd1cmF0aW9uX2FkZGVkQ2F0ZWdvcnlfZmVhdHVyZSA9IEFkZGVkIENhdGVnb3J5Ci1fVUlfVmFyaWFiaWxpdHlUeXBlX2V4dGVuZHNSZXBsYWNlc19saXRlcmFsID0gZXh0ZW5kc1JlcGxhY2VzCi1fVUlfQXJ0aWZhY3REZXNjcmlwdGlvbl9yZXByZXNlbnRhdGlvbl9mZWF0dXJlID0gUmVwcmVzZW50YXRpb24KLV9VSV9BcnRpZmFjdERlc2NyaXB0aW9uX25vdGF0aW9uX2ZlYXR1cmUgPSBOb3RhdGlvbgotX1VJX0NvbnRlbnRFbGVtZW50X3Rlcm1EZWZpbml0aW9uX2ZlYXR1cmUgPSBUZXJtIERlZmluaXRpb24KLV9VSV9Db250ZW50RGVzY3JpcHRpb25fZXh0ZXJuYWxJZF9mZWF0dXJlID0gRXh0ZXJuYWwgSWQKLV9VSV9LaW5kX3R5cGUgPSBLaW5kCi1fVUlfRnVsZmlsbGFibGVFbGVtZW50X3R5cGUgPSBGdWxmaWxsYWJsZSBFbGVtZW50Ci1fVUlfQ2xhc3NpZmllcl9pc0Fic3RyYWN0X2ZlYXR1cmUgPSBJcyBBYnN0cmFjdAotX1VJX01ldGhvZEVsZW1lbnRfcHJlc2VudGF0aW9uTmFtZV9mZWF0dXJlID0gUHJlc2VudGF0aW9uIE5hbWUKLV9VSV9NZXRob2RFbGVtZW50X2tpbmRfZmVhdHVyZSA9IEtpbmQKLV9VSV9LaW5kX2FwcGxpY2FibGVNZXRhQ2xhc3NfZmVhdHVyZSA9IEFwcGxpY2FibGUgTWV0YSBDbGFzcwotX1VJX0tpbmRfaXNQcmltYXJ5S2luZF9mZWF0dXJlID0gSXMgUHJpbWFyeSBLaW5kCi1fVUlfQ29udGVudEVsZW1lbnRfdGVybWRlZmluaXRpb25fZmVhdHVyZSA9IFRlcm1kZWZpbml0aW9uCi1fVUlfRnVsZmlsbGFibGVFbGVtZW50X2Z1bGZpbGxzX2ZlYXR1cmUgPSBGdWxmaWxscwotX1VJX0JyZWFrZG93bkVsZW1lbnRfY2hlY2tsaXN0c19mZWF0dXJlID0gQ2hlY2tsaXN0cwotX1VJX0JyZWFrZG93bkVsZW1lbnRfY29uY2VwdHNfZmVhdHVyZSA9IENvbmNlcHRzCi1fVUlfQnJlYWtkb3duRWxlbWVudF9leGFtcGxlc19mZWF0dXJlID0gRXhhbXBsZXMKLV9VSV9CcmVha2Rvd25FbGVtZW50X2d1aWRlbGluZXNfZmVhdHVyZSA9IEd1aWRlbGluZXMKLV9VSV9CcmVha2Rvd25FbGVtZW50X3JldXNhYmxlQXNzZXRzX2ZlYXR1cmUgPSBSZXVzYWJsZSBBc3NldHMKLV9VSV9CcmVha2Rvd25FbGVtZW50X3N1cHBvcnRpbmdNYXRlcmlhbHNfZmVhdHVyZSA9IFN1cHBvcnRpbmcgTWF0ZXJpYWxzCi1fVUlfTWlsZXN0b25lX3JlcXVpcmVkUmVzdWx0c19mZWF0dXJlID0gUmVxdWlyZWQgUmVzdWx0cwotX1VJX1dvcmtQcm9kdWN0RGVzY3JpcHRvcl93b3JrUHJvZHVjdF9mZWF0dXJlID0gV29yayBQcm9kdWN0Ci1fVUlfUm9sZURlc2NyaXB0b3Jfcm9sZV9mZWF0dXJlID0gUm9sZQotX1VJX1Rhc2tEZXNjcmlwdG9yX3Rhc2tfZmVhdHVyZSA9IFRhc2sKLV9VSV9Qcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvcl9fcHJvY2Vzc0NvbXBvbmVudF9mZWF0dXJlID0gcHJvY2VzcyBDb21wb25lbnQKLV9VSV9CcmVha2Rvd25FbGVtZW50X3RlbXBsYXRlc19mZWF0dXJlID0gVGVtcGxhdGVzCi1fVUlfQnJlYWtkb3duRWxlbWVudF9yZXBvcnRzX2ZlYXR1cmUgPSBSZXBvcnRzCi1fVUlfQnJlYWtkb3duRWxlbWVudF9lc3RpbWF0aW9uY29uc2lkZXJhdGlvbnNfZmVhdHVyZSA9IEVzdGltYXRpb25jb25zaWRlcmF0aW9ucwotX1VJX0JyZWFrZG93bkVsZW1lbnRfdG9vbG1lbnRvcl9mZWF0dXJlID0gVG9vbG1lbnRvcgotX1VJX0FwcGxpY2FibGVNZXRhQ2xhc3NJbmZvX3R5cGUgPSBBcHBsaWNhYmxlIE1ldGEgQ2xhc3MgSW5mbwotX1VJX0tpbmRfYXBwbGljYWJsZU1ldGFDbGFzc0luZm9fZmVhdHVyZSA9IEFwcGxpY2FibGUgTWV0YSBDbGFzcyBJbmZvCi1fVUlfQ29udGVudERlc2NyaXB0aW9uX2xvbmdQcmVzZW50YXRpb25OYW1lX2ZlYXR1cmUgPSBMb25nIFByZXNlbnRhdGlvbiBOYW1lCi1fVUlfQXBwbGljYWJsZU1ldGFDbGFzc0luZm9faXNQcmltYXJ5RXh0ZW5zaW9uX2ZlYXR1cmUgPSBJcyBQcmltYXJ5IEV4dGVuc2lvbgotX1VJX01ldGhvZFBsdWdpbl9zdXBwb3J0aW5nX2ZlYXR1cmUgPSBTdXBwb3J0aW5nCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvcGx1Z2luLnhtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZDYyZjA5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLQotPCEtLQotIDxjb3B5cmlnaHQ+Ci0gPC9jb3B5cmlnaHQ+Ci0KLSAkSWQ6IHBsdWdpbi54bWwsdiAxLjEgMjAwOC8wMS8xNSAwODo1Mjo1NCBqdGhhbSBFeHAgJAotLS0+Ci0KLTxwbHVnaW4+Ci0gICAgCi0gIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmVtZi5lZGl0Lml0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3JpZXMiPgotICAgIDxmYWN0b3J5IAotICAgICAgIHVyaSA9ICJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjMvdW1hLmVjb3JlIiAKLSAgICAgICBjbGFzcyA9ICJvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLlVtYUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5IiAKLSAgICAgICBzdXBwb3J0ZWRUeXBlcyA9IAotICAgICAgICAgIm9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyCi0gICAgICAgICAgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyCi0gICAgICAgICAgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyCi0gICAgICAgICAgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyCi0gICAgICAgICAgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZSIgLz4KLSAgPC9leHRlbnNpb24+Ci0KLTwvcGx1Z2luPgotCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvZWRpdC9jb21tYW5kL01ldGhvZEVsZW1lbnRDcmVhdGVDb3B5Q29tbWFuZC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2VkaXQvY29tbWFuZC9NZXRob2RFbGVtZW50Q3JlYXRlQ29weUNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGQ3OWVlMy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvZWRpdC9jb21tYW5kL01ldGhvZEVsZW1lbnRDcmVhdGVDb3B5Q29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0LmNvbW1hbmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ3JlYXRlQ29weUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db3B5Q29tbWFuZC5IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0LmRvbWFpbi5UcmFjZWFibGVBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW47Ci0KLS8qKgotICogQSBjb21tYW5kIHRoYXQgY3JlYXRlcyBhbiB1bmluaXRpYWxpemVkIGNvcHkgb2YgYSBtZXRob2QgZWxlbWVudC4gVGhlCi0gKiBuZWNlc3NhcnkgaW5pdGlhbGl6YXRpb24gd2lsbCBiZSBleGVjdXRlZCB1c2luZwotICoge0BsaW5rIE1ldGhvZEVsZW1lbnRJbml0aWFsaXplQ29weUNvbW1hbmR9LgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTWV0aG9kRWxlbWVudENyZWF0ZUNvcHlDb21tYW5kIGV4dGVuZHMgQ3JlYXRlQ29weUNvbW1hbmQgewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gZG9tYWluCi0JICogICAgICAgICAgICB0aGUgZWRpdGluZyBkb21haW4KLQkgKiBAcGFyYW0gb3duZXIKLQkgKiAgICAgICAgICAgIHRoZSBvYmplY3QgYmVpbmcgY29waWVkCi0JICogQHBhcmFtIGNvcHlIZWxwZXIKLQkgKiAgICAgICAgICAgIGEgaGVscGVyIGNsYXNzIHRoYXQgaXMgdXNlZCB0byBrZWVwIHRyYWNrIG9mIGNvcGllZCBvYmplY3RzCi0JICogICAgICAgICAgICBhbmQgdGhlaXIgYXNzb2NpYXRlZCBjb3BpZXMKLQkgKi8KLQlwdWJsaWMgTWV0aG9kRWxlbWVudENyZWF0ZUNvcHlDb21tYW5kKEVkaXRpbmdEb21haW4gZG9tYWluLCBFT2JqZWN0IG93bmVyLAotCQkJSGVscGVyIGNvcHlIZWxwZXIpIHsKLQkJc3VwZXIoZG9tYWluLCBvd25lciwgY29weUhlbHBlcik7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgcmVzdWx0IG9mIHRoZSBjb3B5IG9wZXJhdGlvbi4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgY29sbGVjdGlvbiBjb250YWluaW5nIHRoZSBjb3BpZWQgbWV0aG9kIGVsZW1lbnQuCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZG9HZXRSZXN1bHQoKSB7Ci0JCUNvbGxlY3Rpb24gY29sbGVjdGlvbiA9IHN1cGVyLmRvR2V0UmVzdWx0KCk7Ci0KLQkJaWYgKGRvbWFpbiBpbnN0YW5jZW9mIFRyYWNlYWJsZUFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbikgewotCQkJKChUcmFjZWFibGVBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW4pIGRvbWFpbikuYWRkQ29weUluZm8oCi0JCQkJCWNvbGxlY3Rpb24sIGNvcHlIZWxwZXIpOwotCQl9Ci0KLQkJcmV0dXJuIGNvbGxlY3Rpb247Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvZWRpdC9jb21tYW5kL01ldGhvZEVsZW1lbnRJbml0aWFsaXplQ29weUNvbW1hbmQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9lZGl0L2NvbW1hbmQvTWV0aG9kRWxlbWVudEluaXRpYWxpemVDb3B5Q29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YjlkYWZlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9lZGl0L2NvbW1hbmQvTWV0aG9kRWxlbWVudEluaXRpYWxpemVDb3B5Q29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC5jb21tYW5kOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuSW5pdGlhbGl6ZUNvcHlDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29weUNvbW1hbmQuSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLnV0aWwuT3Bwb3NpdGVGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuVW1hRWRpdFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLQotLyoqCi0gKiBBIGNvbW1hbmQgdGhhdCB0YWtlcyBhbiB1bmluaXRpYWxpemVkIGNvcHkgb2YgYSBtZXRob2QgZWxlbWVudCBhbmQgc2V0cyBhIG5ldwotICogR1VJRC4gSWYgdGhlIG9yaWdpbmFsIGVsZW1lbnQgaXMgYSA8Y29kZT5Db250ZW50RWxlbWVudDwvY29kZT4gd2l0aCBhIHZhbGlkCi0gKiA8Y29kZT5Db250ZW50RGVzY3JpcHRpb248L2NvZGU+LCBhIGNvcHkgb2YgdGhlCi0gKiA8Y29kZT5Db250ZW50RGVzY3JpcHRpb248L2NvZGU+IGlzIGFsc28gY3JlYXRlZC4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIE1ldGhvZEVsZW1lbnRJbml0aWFsaXplQ29weUNvbW1hbmQgZXh0ZW5kcyBJbml0aWFsaXplQ29weUNvbW1hbmQgewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gZG9tYWluCi0JICogICAgICAgICAgICB0aGUgZWRpdGluZyBkb21haW4KLQkgKiBAcGFyYW0gb3duZXIKLQkgKiAgICAgICAgICAgIHRoZSBvYmplY3QgYmVpbmcgY29waWVkCi0JICogQHBhcmFtIGNvcHlIZWxwZXIKLQkgKiAgICAgICAgICAgIGEgaGVscGVyIGNsYXNzIHRoYXQgaXMgdXNlZCB0byBrZWVwIHRyYWNrIG9mIGNvcGllZCBvYmplY3RzCi0JICogICAgICAgICAgICBhbmQgdGhlaXIgYXNzb2NpYXRlZCBjb3BpZXMKLQkgKi8KLQlwdWJsaWMgTWV0aG9kRWxlbWVudEluaXRpYWxpemVDb3B5Q29tbWFuZChFZGl0aW5nRG9tYWluIGRvbWFpbiwKLQkJCUVPYmplY3Qgb3duZXIsIEhlbHBlciBjb3B5SGVscGVyKSB7Ci0JCXN1cGVyKGRvbWFpbiwgb3duZXIsIGNvcHlIZWxwZXIpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Jbml0aWFsaXplQ29weUNvbW1hbmQjZG9FeGVjdXRlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkb0V4ZWN1dGUoKSB7Ci0JCXN1cGVyLmRvRXhlY3V0ZSgpOwotCi0JCS8vIGdlbmVyYXRlIG5ldyBHVUlEIGZvciB0aGUgY29weQotCQkvLwotCQlpZiAoY29weSBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCU1ldGhvZEVsZW1lbnQgZSA9ICgoTWV0aG9kRWxlbWVudCkgY29weSk7Ci0JCQlpZiAoZSBpbnN0YW5jZW9mIENvbnRlbnREZXNjcmlwdGlvbikgewotCQkJCUVPYmplY3QgZUNvbnRhaW5lciA9IGUuZUNvbnRhaW5lcigpOwotCQkJCWlmIChlQ29udGFpbmVyIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJCQllLnNldEd1aWQoVW1hVXRpbC5nZW5lcmF0ZUdVSUQoKChNZXRob2RFbGVtZW50KSBlQ29udGFpbmVyKQotCQkJCQkJCS5nZXRHdWlkKCkpKTsKLQkJCQl9IGVsc2UgewotCQkJCQllLnNldEd1aWQoVW1hVXRpbC5nZW5lcmF0ZUdVSUQoKSk7Ci0JCQkJCVVtYUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJCQkubG9nKCJNZXRob2RFbGVtZW50SW5pdGlhbGl6ZUNvcHlDb21tYW5kOiBlQ29udGFpbmVyIG5vdCBpbml0aWFsaXplZCBmb3IgIiArIGUpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQllLnNldEd1aWQoVW1hVXRpbC5nZW5lcmF0ZUdVSUQoKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBJdGVyYXRlcyBvdmVyIHRoZSByZWZlcmVuY2VzIG9mIHRoZSBvd25lciBvYmplY3QgYW5kIHNldHMgdGhlbQotCSAqIGFjY29yZGluZ2x5IGluIHRoZSBjb3B5LiBJbmNsdWRlcyBjb3Bpbmcgb2Ygb3Bwb3NpdGUgZmVhdHVyZXMuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGRvQ29weVJlZmVyZW5jZXMoKSB7Ci0JCWlmIChvd25lciBpbnN0YW5jZW9mIENvbnRlbnREZXNjcmlwdGlvbikgewotCQkJc3VwZXIuY29weVJlZmVyZW5jZXMoKTsKLQkJCXJldHVybjsKLQkJfQotCQlmb3IgKEl0ZXJhdG9yIHJlZmVyZW5jZXMgPSBnZXRSZWZlcmVuY2VzVG9Db3B5KCkuaXRlcmF0b3IoKTsgcmVmZXJlbmNlcwotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQlFUmVmZXJlbmNlIHJlZmVyZW5jZSA9IChFUmVmZXJlbmNlKSByZWZlcmVuY2VzLm5leHQoKTsKLQkJCWlmICghcmVmZXJlbmNlLmlzQ2hhbmdlYWJsZSgpIHx8IHJlZmVyZW5jZS5pc0Rlcml2ZWQoKSkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCi0JCQlFUmVmZXJlbmNlIHJldmVyc2VSZWZlcmVuY2UgPSByZWZlcmVuY2UuZ2V0RU9wcG9zaXRlKCk7Ci0KLQkJCU9iamVjdCB2YWx1ZSA9IG93bmVyLmVHZXQocmVmZXJlbmNlKTsKLQkJCWlmICh2YWx1ZSA9PSBudWxsKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0KLQkJCU9wcG9zaXRlRmVhdHVyZSBvcHBvc2l0ZUZlYXR1cmUgPSBPcHBvc2l0ZUZlYXR1cmUKLQkJCQkJLmdldE9wcG9zaXRlRmVhdHVyZShyZWZlcmVuY2UpOwotCQkJYm9vbGVhbiBjb3BpZWRUYXJnZXRSZXF1aXJlZCA9IHJldmVyc2VSZWZlcmVuY2UgIT0gbnVsbAotCQkJCQl8fCByZWZlcmVuY2UuaXNDb250YWlubWVudCgpCi0JCQkJCXx8IChvcHBvc2l0ZUZlYXR1cmUgIT0gbnVsbCAmJiAhb3Bwb3NpdGVGZWF0dXJlLmlzTWFueSgpKTsKLQkJCS8vICJtYW55IiBvcHBvc2l0ZSBmZWF0dXJlIGRvZXMgbm90IHJlcXVpcmUgY29waWVkIHRhcmdldCwgaXQgaXMKLQkJCS8vIHRyZWF0ZWQgYXMgYSByZWd1bGFyIG5vbi1jb250YWlubWVudCByZWZlcmVuY2UKLQkJCS8vIFRPRE86IGJpZGlyZWN0aW9uYWwgcmVsYXRpb25zaGlwcyBhcmUgbm90IGF1dG9tYXRpY2FsbHkgY29waWVkIGluCi0JCQkvLyBFTUYgaW1wbGVtZW50YXRpb24KLQkJCWlmIChyZWZlcmVuY2UuaXNNYW55KCkpIHsKLQkJCQlMaXN0IHZhbHVlTGlzdCA9IChMaXN0KSB2YWx1ZTsKLQkJCQlpZiAoIXZhbHVlTGlzdC5pc0VtcHR5KCkpIHsKLQkJCQkJRUxpc3QgY29weUxpc3QgPSAoRUxpc3QpIGNvcHkuZUdldChyZWZlcmVuY2UpOwotCQkJCQlpbnQgaW5kZXggPSAwOwotCQkJCQlmb3IgKEl0ZXJhdG9yIHZhbHVlSXRlciA9IHZhbHVlTGlzdC5pdGVyYXRvcigpOyB2YWx1ZUl0ZXIKLQkJCQkJCQkuaGFzTmV4dCgpOyArK2luZGV4KSB7Ci0JCQkJCQlFT2JqZWN0IG9iamVjdCA9IG51bGw7Ci0JCQkJCQl0cnkgewotCQkJCQkJCW9iamVjdCA9IChFT2JqZWN0KSB2YWx1ZUl0ZXIubmV4dCgpOwotCQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQlVbWFFZGl0UGx1Z2luLklOU1RBTkNFLmxvZyhlKTsKLQkJCQkJCX0KLQkJCQkJCUVPYmplY3QgdGFyZ2V0ID0gY29weUhlbHBlci5nZXRDb3B5VGFyZ2V0KG9iamVjdCwKLQkJCQkJCQkJY29waWVkVGFyZ2V0UmVxdWlyZWQpOwotCQkJCQkJaWYgKHRhcmdldCA9PSBudWxsKQotCQkJCQkJCWNvbnRpbnVlOwotCQkJCQkJaWYgKHJldmVyc2VSZWZlcmVuY2UgIT0gbnVsbCkgewotCQkJCQkJCWludCBwb3NpdGlvbiA9IGNvcHlMaXN0LmluZGV4T2YodGFyZ2V0KTsKLQkJCQkJCQlpZiAocG9zaXRpb24gPT0gLTEpIHsKLQkJCQkJCQkJY29weUxpc3QuYWRkKGluZGV4LCB0YXJnZXQpOwotCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCWNvcHlMaXN0Lm1vdmUoaW5kZXgsIHRhcmdldCk7Ci0JCQkJCQkJfQotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQljb3B5TGlzdC5hZGQodGFyZ2V0KTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJRU9iamVjdCB0YXJnZXQgPSBjb3B5SGVscGVyLmdldENvcHlUYXJnZXQoKEVPYmplY3QpIHZhbHVlLAotCQkJCQkJY29waWVkVGFyZ2V0UmVxdWlyZWQpOwotCQkJCWlmICh0YXJnZXQgIT0gbnVsbCkgewotCQkJCQljb3B5LmVTZXQocmVmZXJlbmNlLCB0YXJnZXQpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNvcHlSZWZlcmVuY2VzKCkgewotCQlkb0NvcHlSZWZlcmVuY2VzKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvZWRpdC9jb21tYW5kL3BhY2thZ2UuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9lZGl0L2NvbW1hbmQvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MDFlYjhhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9lZGl0L2NvbW1hbmQvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgY29tbWFuZHMgZm9yIGNvcHlpbmcgdGhlIFVNQSBtb2RlbCBvYmplY3RzLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9lZGl0L2RvbWFpbi9UcmFjZWFibGVBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW4uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9lZGl0L2RvbWFpbi9UcmFjZWFibGVBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzc0OGRkZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvZWRpdC9kb21haW4vVHJhY2VhYmxlQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0LmRvbWFpbjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmRTdGFjazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db3B5Q29tbWFuZC5IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci0KLS8qKgotICogQSB0cmFjZWFibGUgYWRhcHRlciBmYWN0b3J5IGVkaXRpbmcgZG9tYWluIHVzZWQgZm9yIGNvcHlpbmcgbWV0aG9kIGVsZW1lbnRzLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgVHJhY2VhYmxlQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluIGV4dGVuZHMKLQkJQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluIHsKLQotCS8vIE1hcHMgY29waWVkIG1ldGhvZCBlbGVtZW50cyB0byB0aGVpciBvcmlnaW5hbCBjb3VudGVycGFydHMuCi0JLy8gTm90ZTogQ29waWVkIGVsZW1lbnRzIGFyZSBjb3BpZXMgb2YgdGhlIGNsaXBib2FyZCBjb3BpZXMuCi0JcHJpdmF0ZSBIYXNoTWFwPE9iamVjdCwgT2JqZWN0PiBjb3B5VG9PcmlnaW5hbE1hcCA9IG51bGw7Ci0KLQkvLyBNYXBzIG9yaWdpbmFsIGVsZW1lbnRzIHRvIHRoZWlyIGNsaXBib2FyZCBjb3BpZXMuCi0JcHJpdmF0ZSBNYXA8T2JqZWN0LCBPYmplY3Q+IG9yaWdpbmFsVG9DbGlwYm9hcmRNYXAgPSBudWxsOwotCQotCXByaXZhdGUgTWFwPEVPYmplY3QsIEVPYmplY3Q+IGNsaXBib2FyZFRvT3JpZ2luYWxNYXA7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqIAotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqICAgICAgICAgICAgYW4gYWRhcHRlciBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHRoZSBhZGFwdGVyIHRvIHdoaWNoIGNhbGxzCi0JICogICAgICAgICAgICBhcmUgZGVsZWdhdGVkCi0JICogQHBhcmFtIGNvbW1hbmRTdGFjawotCSAqICAgICAgICAgICAgYSBjb21tYW5kIHN0YWNrCi0JICovCi0JcHVibGljIFRyYWNlYWJsZUFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwKLQkJCUNvbW1hbmRTdGFjayBjb21tYW5kU3RhY2spIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnksIGNvbW1hbmRTdGFjayk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKiAgICAgICAgICAgIGFuIGFkYXB0ZXIgZmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB0aGUgYWRhcHRlciB0byB3aGljaCBjYWxscwotCSAqICAgICAgICAgICAgYXJlIGRlbGVnYXRlZAotCSAqIEBwYXJhbSBjb21tYW5kU3RhY2sKLQkgKiAgICAgICAgICAgIGEgY29tbWFuZCBzdGFjawotCSAqIEBwYXJhbSByZXNvdXJjZVRvUmVhZE9ubHlNYXAKLQkgKiAgICAgICAgICAgIGNvbnRyb2xzIHdoZXRoZXIgdGhlIGRvbWFpbiBpcyByZWFkIG9ubHkKLQkgKi8KLQlwdWJsaWMgVHJhY2VhYmxlQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LAotCQkJQ29tbWFuZFN0YWNrIGNvbW1hbmRTdGFjaywgTWFwIHJlc291cmNlVG9SZWFkT25seU1hcCkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSwgY29tbWFuZFN0YWNrLCByZXNvdXJjZVRvUmVhZE9ubHlNYXApOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICogCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICogICAgICAgICAgICBhbiBhZGFwdGVyIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdGhlIGFkYXB0ZXIgdG8gd2hpY2ggY2FsbHMKLQkgKiAgICAgICAgICAgIGFyZSBkZWxlZ2F0ZWQKLQkgKiBAcGFyYW0gY29tbWFuZFN0YWNrCi0JICogICAgICAgICAgICBhIGNvbW1hbmQgc3RhY2sKLQkgKiBAcGFyYW0gcmVzb3VyY2VTZXQKLQkgKiAgICAgICAgICAgIGEgcmVzb3VyY2Ugc2V0Ci0JICovCi0JcHVibGljIFRyYWNlYWJsZUFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwKLQkJCUNvbW1hbmRTdGFjayBjb21tYW5kU3RhY2ssIFJlc291cmNlU2V0IHJlc291cmNlU2V0KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5LCBjb21tYW5kU3RhY2ssIHJlc291cmNlU2V0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbWFwIGNvbnRhaW5pbmcgdGhlIGNvcGllZCBlbGVtZW50cyBtYXBwZWQgdG8gdGhlaXIgb3JpZ2luYWwKLQkgKiBjb3VudGVycGFydHMuCi0JICogCi0JICogQHJldHVybiBhIG1hcCBjb250YWluaW5nIHRoZSBjb3BpZWQgZWxlbWVudHMgbWFwcGVkIHRvIHRoZWlyIG9yaWdpbmFsCi0JICogICAgICAgICBjb3VudGVycGFydHMKLQkgKi8KLQlwdWJsaWMgTWFwPD8sID8+IGdldENvcHlUb09yaWdpbmFsTWFwKCkgewotCQlpZiAoY29weVRvT3JpZ2luYWxNYXAgPT0gbnVsbCkgewotCQkJY29weVRvT3JpZ2luYWxNYXAgPSBuZXcgSGFzaE1hcDxPYmplY3QsIE9iamVjdD4oKTsKLQkJfQotCQlyZXR1cm4gY29weVRvT3JpZ2luYWxNYXA7Ci0JfQotCQotCQotCS8qKgotCSAqIFJldHVybnMgYSBtYXAgY29udGFpbmluZyB0aGUgb3JpZ2luYWwgZWxlbWVudHMgbWFwcGVkIHRvIHRoZWlyIGNvcGllZCAKLQkgKiBjb3VudGVycGFydHMgb24gY2xpcGJvYXJkCi0JICogCi0JICogQHJldHVybiBhIG1hcCBjb250YWluaW5nIHRoZSBvcmlnaW5hbCBlbGVtZW50cyBtYXBwZWQgdG8gdGhlaXIgY29waWVkIAotCSAqICAgICAgICAgY291bnRlcnBhcnRzCi0JICovCi0JcHVibGljIE1hcCBnZXRPcmlnaW5hbFRvQ2xpcGJvYXJkTWFwKCkgewotCQlpZiAob3JpZ2luYWxUb0NsaXBib2FyZE1hcCA9PSBudWxsKSB7Ci0JCQlvcmlnaW5hbFRvQ2xpcGJvYXJkTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJfQotCQlyZXR1cm4gb3JpZ2luYWxUb0NsaXBib2FyZE1hcDsKLQl9Ci0KLQkvKioKLQkgKiBVc2VkIGJ5IHRoZSBDcmVhdGVDb3B5Q29tbWFuZC4gQWRkcyBpbmZvbWF0aW9uIHRvIGNvbnN0cnVjdCBtYXBzIHRoYXQKLQkgKiBrZWVwIHRyYWNrIG9mIHRoZSBvcmlnaW5hbCBtZXRob2QgZWxlbWVudHMgYW5kIHRoZWlyIGNvcGllcy4KLQkgKiAKLQkgKiBAcGFyYW0gYwotCSAqICAgICAgICAgICAgYSBjb2xsZWN0aW9uIHRvIHN0b3JlIHRoZSBtYXBwaW5nIGluZm8KLQkgKiBAcGFyYW0gY29weUhlbHBlcgotCSAqICAgICAgICAgICAgYSBoZWxwZXIgY2xhc3MgdGhhdCBpcyB1c2VkIHRvIGtlZXAgdHJhY2sgb2YgY29waWVkIG9iamVjdHMKLQkgKiAgICAgICAgICAgIGFuZCB0aGVpciBhc3NvY2lhdGVkIGNvcGllcwotCSAqLwotCXB1YmxpYyB2b2lkIGFkZENvcHlJbmZvKENvbGxlY3Rpb24gYywgSGVscGVyIGNvcHlIZWxwZXIpIHsKLQkJaWYgKGlzTmV3Q29weShjLCBjb3B5SGVscGVyKSkgewotCQkJYWRkTmV3Q29weShjLCBjb3B5SGVscGVyKTsKLQkJCXJldHVybjsKLQkJfSBlbHNlIHsKLQkJCWNoYWluQ29weShjLCBjb3B5SGVscGVyKTsKLQkJCXJldHVybjsKLQkJfQotCX0KLQotCS8qKgotCSAqIEFkZHMgYSBuZXcgZWxlbWVudCB0aGF0IGlzIGJlaW5nIGNvcGllZCB0byB0aGUgY2xpcGJvYXJkLgotCSAqLwotCXByaXZhdGUgdm9pZCBhZGROZXdDb3B5KENvbGxlY3Rpb24gYywgSGVscGVyIGNvcHlIZWxwZXIpIHsKLQkJLy8gdGhpcyBtZWFucyB3ZSBhcmUgY29weWluZyB0aGUgQ29sbGVjdGlvbiBjIHRvIHRoZSBjbGlwYm9hcmQKLQkJaWYgKG9yaWdpbmFsVG9DbGlwYm9hcmRNYXAgPT0gbnVsbCkKLQkJCW9yaWdpbmFsVG9DbGlwYm9hcmRNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQlpZihjbGlwYm9hcmRUb09yaWdpbmFsTWFwID09IG51bGwpIHsKLQkJCWNsaXBib2FyZFRvT3JpZ2luYWxNYXAgPSBuZXcgSGFzaE1hcDxFT2JqZWN0LCBFT2JqZWN0PigpOwotCQl9Ci0JCUl0ZXJhdG9yIGl0ZXIgPSBjb3B5SGVscGVyLmtleVNldCgpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJRU9iamVjdCBrZXkgPSAoRU9iamVjdCkgaXRlci5uZXh0KCk7Ci0JCQlFT2JqZWN0IHZhbHVlID0gKEVPYmplY3QpIGNvcHlIZWxwZXIuZ2V0KGtleSk7Ci0JCQlvcmlnaW5hbFRvQ2xpcGJvYXJkTWFwLnB1dChrZXksIHZhbHVlKTsKLQkJCWNsaXBib2FyZFRvT3JpZ2luYWxNYXAucHV0KHZhbHVlLCBrZXkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG1hcCBmcm9tIHRoZSBjb3BpZWQgZWxlbWVudHMgdG8gdGhlaXIgb3JpZ2luYWwgY291bnRlcnBhcnRzLgotCSAqLwotCXByaXZhdGUgdm9pZCBjaGFpbkNvcHkoQ29sbGVjdGlvbiBjLCBIZWxwZXIgY29weUhlbHBlcikgewotCQkvLyBjaGFpbiB0aGUgbWFwcyAtIGNoYW5nZSB0aGUgY29weVRvT3JpZ2luYWxNYXAKLQkJaWYgKG9yaWdpbmFsVG9DbGlwYm9hcmRNYXAgIT0gbnVsbCkgewotCQkJaWYgKGNvcHlUb09yaWdpbmFsTWFwID09IG51bGwpCi0JCQkJY29weVRvT3JpZ2luYWxNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQkJSXRlcmF0b3IgaXRlciA9IG9yaWdpbmFsVG9DbGlwYm9hcmRNYXAua2V5U2V0KCkuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJCU9iamVjdCBvMkNLZXkgPSBpdGVyLm5leHQoKTsKLQkJCQlPYmplY3QgbzJDVmFsdWUgPSBvcmlnaW5hbFRvQ2xpcGJvYXJkTWFwLmdldChvMkNLZXkpOwotCQkJCU9iamVjdCBjb3B5VmFsdWUgPSBjb3B5SGVscGVyLmdldChvMkNWYWx1ZSk7Ci0JCQkJaWYgKGNvcHlWYWx1ZSA9PSBudWxsKSB7Ci0JCQkJCS8vIGVycm9yCi0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCQlpZiAobzJDS2V5IGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkKLQkJCQkJY29weVRvT3JpZ2luYWxNYXAucHV0KGNvcHlWYWx1ZSwgbzJDS2V5KTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc05ld0NvcHkoQ29sbGVjdGlvbiBjLCBIZWxwZXIgY29weUhlbHBlcikgewotCQkvLyBvcmlnaW5hbFRvQ2xpcGJvYXJkTWFwIHdhcyBzZXQgdG8gbnVsbCBhdCBzdGFydCBvZiBjb3B5IGNvbW1hbmQKLQkJaWYgKG9yaWdpbmFsVG9DbGlwYm9hcmRNYXAgPT0gbnVsbCkKLQkJCXJldHVybiB0cnVlOwotCi0JCS8vIGl0ZXJhdGUgdGhyb3VnaCBjb3B5SGVscGVyIG1hcCwgc2VlIGlmIGFueSBjb3B5SGVscGVyIGtleXMgYXJlIG8yQwotCQkvLyB2YWx1ZXMsIHdoaWNoIG1lYW5zIHdlIGFyZSBjb3B5aW5nIGNsaXBib2FyZAotCQlJdGVyYXRvciBpdGVyID0gY29weUhlbHBlci5rZXlTZXQoKS5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCU9iamVjdCBjbGlwS2V5ID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAoIW9yaWdpbmFsVG9DbGlwYm9hcmRNYXAuY29udGFpbnNWYWx1ZShjbGlwS2V5KSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplcyB0aGUgY29weSBtYXBzLiBJdCBzaG91bGQgYmUgY2FsbGVkIHdpdGhpbiB0aGUgY29weSBhY3Rpb24uCi0JICovCi0JcHVibGljIHZvaWQgcmVzZXRDb3B5TWFwcygpIHsKLQkJaWYgKG9yaWdpbmFsVG9DbGlwYm9hcmRNYXAgIT0gbnVsbCkgewotCQkJb3JpZ2luYWxUb0NsaXBib2FyZE1hcC5jbGVhcigpOwotCQkJb3JpZ2luYWxUb0NsaXBib2FyZE1hcCA9IG51bGw7Ci0JCX0KLQkJaWYoY2xpcGJvYXJkVG9PcmlnaW5hbE1hcCAhPSBudWxsKSB7Ci0JCQljbGlwYm9hcmRUb09yaWdpbmFsTWFwLmNsZWFyKCk7Ci0JCQljbGlwYm9hcmRUb09yaWdpbmFsTWFwID0gbnVsbDsKLQkJfQotCQlpZiAoY29weVRvT3JpZ2luYWxNYXAgIT0gbnVsbCkgewotCQkJY29weVRvT3JpZ2luYWxNYXAuY2xlYXIoKTsKLQkJCWNvcHlUb09yaWdpbmFsTWFwID0gbnVsbDsKLQkJfQotCX0KLQotCXB1YmxpYyBNYXA8RU9iamVjdCwgRU9iamVjdD4gZ2V0Q2xpcGJvYXJkVG9PcmlnaW5hbE1hcCgpIHsKLQkJcmV0dXJuIGNsaXBib2FyZFRvT3JpZ2luYWxNYXA7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2VkaXQvZG9tYWluL3BhY2thZ2UuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9lZGl0L2RvbWFpbi9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyOWVhNzMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2VkaXQvZG9tYWluL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIHRoZSBkZWZhdWx0IGVkaXRpbmcgZG9tYWluIGZvciB0aGUgVU1BIG1vZGVsIG9iamVjdHMuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0FjdGl2aXR5RGVzY3JpcHRpb25JdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9BY3Rpdml0eURlc2NyaXB0aW9uSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjMmFhMTQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0FjdGl2aXR5RGVzY3JpcHRpb25JdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwMCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHlEZXNjcmlwdGlvbn0gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZpdHlEZXNjcmlwdGlvbkl0ZW1Qcm92aWRlciBleHRlbmRzCi0JCUJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbkl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzCi0JCUlFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFjdGl2aXR5RGVzY3JpcHRpb25JdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJYWRkUHVycG9zZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkQWx0ZXJuYXRpdmVzUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRIb3d0b1N0YWZmUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBQdXJwb3NlIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkUHVycG9zZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9BY3Rpdml0eURlc2NyaXB0aW9uX3B1cnBvc2VfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9BY3Rpdml0eURlc2NyaXB0aW9uX3B1cnBvc2VfZmVhdHVyZSIsICJfVUlfQWN0aXZpdHlEZXNjcmlwdGlvbl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkFDVElWSVRZX0RFU0NSSVBUSU9OX19QVVJQT1NFLAotCQkJCQkJdHJ1ZSwgZmFsc2UsIGZhbHNlLAotCQkJCQkJSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIEFsdGVybmF0aXZlcyBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEFsdGVybmF0aXZlc1Byb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9BY3Rpdml0eURlc2NyaXB0aW9uX2FsdGVybmF0aXZlc19mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0FjdGl2aXR5RGVzY3JpcHRpb25fYWx0ZXJuYXRpdmVzX2ZlYXR1cmUiLCAiX1VJX0FjdGl2aXR5RGVzY3JpcHRpb25fdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5BQ1RJVklUWV9ERVNDUklQVElPTl9fQUxURVJOQVRJVkVTLAotCQkJCQkJdHJ1ZSwgZmFsc2UsIGZhbHNlLAotCQkJCQkJSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIEhvd3RvIFN0YWZmIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkSG93dG9TdGFmZlByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9BY3Rpdml0eURlc2NyaXB0aW9uX2hvd3RvU3RhZmZfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9BY3Rpdml0eURlc2NyaXB0aW9uX2hvd3RvU3RhZmZfZmVhdHVyZSIsICJfVUlfQWN0aXZpdHlEZXNjcmlwdGlvbl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkFDVElWSVRZX0RFU0NSSVBUSU9OX19IT1dUT19TVEFGRiwKLQkJCQkJCXRydWUsIGZhbHNlLCBmYWxzZSwKLQkJCQkJCUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBBY3Rpdml0eURlc2NyaXB0aW9uLmdpZi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKAotCQkJCSJmdWxsL29iajE2L0FjdGl2aXR5RGVzY3JpcHRpb24iKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoQWN0aXZpdHlEZXNjcmlwdGlvbikgb2JqZWN0KS5nZXROYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9BY3Rpdml0eURlc2NyaXB0aW9uX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQlnZXRTdHJpbmcoIl9VSV9BY3Rpdml0eURlc2NyaXB0aW9uX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCi0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChBY3Rpdml0eURlc2NyaXB0aW9uLmNsYXNzKSkgewotCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfREVTQ1JJUFRJT05fX1BVUlBPU0U6Ci0JCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9ERVNDUklQVElPTl9fQUxURVJOQVRJVkVTOgotCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfREVTQ1JJUFRJT05fX0hPV1RPX1NUQUZGOgotCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbgotCQkJCQkuZ2V0Tm90aWZpZXIoKSwgZmFsc2UsIHRydWUpKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbgotCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoCi0JCQlDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9BY3Rpdml0eUl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0FjdGl2aXR5SXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjNDc5NGUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0FjdGl2aXR5SXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMDggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eX0gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZpdHlJdGVtUHJvdmlkZXIgZXh0ZW5kcyBXb3JrQnJlYWtkb3duRWxlbWVudEl0ZW1Qcm92aWRlcgotCQlpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFjdGl2aXR5SXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCWFkZEZ1bGZpbGxzUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRWYXJpYWJpbGl0eVR5cGVQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnRQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZEJyZWFrZG93bkVsZW1lbnRzUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRSb2FkbWFwc1Byb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgRnVsZmlsbHMgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRGdWxmaWxsc1Byb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9GdWxmaWxsYWJsZUVsZW1lbnRfZnVsZmlsbHNfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9GdWxmaWxsYWJsZUVsZW1lbnRfZnVsZmlsbHNfZmVhdHVyZSIsICJfVUlfRnVsZmlsbGFibGVFbGVtZW50X3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuRlVMRklMTEFCTEVfRUxFTUVOVF9fRlVMRklMTFMsCi0JCQkJCQl0cnVlLCBmYWxzZSwgdHJ1ZSwgbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBWYXJpYWJpbGl0eSBUeXBlIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkVmFyaWFiaWxpdHlUeXBlUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX1ZhcmlhYmlsaXR5RWxlbWVudF92YXJpYWJpbGl0eVR5cGVfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9WYXJpYWJpbGl0eUVsZW1lbnRfdmFyaWFiaWxpdHlUeXBlX2ZlYXR1cmUiLCAiX1VJX1ZhcmlhYmlsaXR5RWxlbWVudF90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLlZBUklBQklMSVRZX0VMRU1FTlRfX1ZBUklBQklMSVRZX1RZUEUsCi0JCQkJCQl0cnVlLCBmYWxzZSwgZmFsc2UsCi0JCQkJCQlJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgVmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudCBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnRQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfVmFyaWFiaWxpdHlFbGVtZW50X3ZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnRfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9WYXJpYWJpbGl0eUVsZW1lbnRfdmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudF9mZWF0dXJlIiwgIl9VSV9WYXJpYWJpbGl0eUVsZW1lbnRfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5WQVJJQUJJTElUWV9FTEVNRU5UX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5ULAotCQkJCQkJdHJ1ZSwgZmFsc2UsIHRydWUsIG51bGwsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHNwZWNpZmllcyBob3cgdG8gaW1wbGVtZW50IHtAbGluayAjZ2V0Q2hpbGRyZW59IGFuZCBpcyB1c2VkIHRvIGRlZHVjZSBhbiBhcHByb3ByaWF0ZSBmZWF0dXJlIGZvciBhbgotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkFkZENvbW1hbmR9LCB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5SZW1vdmVDb21tYW5kfSBvcgotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLk1vdmVDb21tYW5kfSBpbiB7QGxpbmsgI2NyZWF0ZUNvbW1hbmR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBDb2xsZWN0aW9uPD8gZXh0ZW5kcyBFU3RydWN0dXJhbEZlYXR1cmU+IGdldENoaWxkcmVuRmVhdHVyZXMoCi0JCQlPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlbkZlYXR1cmVzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldENoaWxkcmVuRmVhdHVyZXMob2JqZWN0KTsKLQkJCWNoaWxkcmVuRmVhdHVyZXMKLQkJCQkJLmFkZChVbWFQYWNrYWdlLkxpdGVyYWxzLldPUktfREVGSU5JVElPTl9fUFJFQ09ORElUSU9OKTsKLQkJCWNoaWxkcmVuRmVhdHVyZXMKLQkJCQkJLmFkZChVbWFQYWNrYWdlLkxpdGVyYWxzLldPUktfREVGSU5JVElPTl9fUE9TVENPTkRJVElPTik7Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuRmVhdHVyZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVTdHJ1Y3R1cmFsRmVhdHVyZSBnZXRDaGlsZEZlYXR1cmUoT2JqZWN0IG9iamVjdCwgT2JqZWN0IGNoaWxkKSB7Ci0JCS8vIENoZWNrIHRoZSB0eXBlIG9mIHRoZSBzcGVjaWZpZWQgY2hpbGQgb2JqZWN0IGFuZCByZXR1cm4gdGhlIHByb3BlciBmZWF0dXJlIHRvIHVzZSBmb3IKLQkJLy8gYWRkaW5nIChzZWUge0BsaW5rIEFkZENvbW1hbmR9KSBpdCBhcyBhIGNoaWxkLgotCi0JCXJldHVybiBzdXBlci5nZXRDaGlsZEZlYXR1cmUob2JqZWN0LCBjaGlsZCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIEJyZWFrZG93biBFbGVtZW50cyBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEJyZWFrZG93bkVsZW1lbnRzUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX0FjdGl2aXR5X2JyZWFrZG93bkVsZW1lbnRzX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfQWN0aXZpdHlfYnJlYWtkb3duRWxlbWVudHNfZmVhdHVyZSIsICJfVUlfQWN0aXZpdHlfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5BQ1RJVklUWV9fQlJFQUtET1dOX0VMRU1FTlRTLCB0cnVlLAotCQkJCQkJZmFsc2UsIHRydWUsIG51bGwsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgUm9hZG1hcHMgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRSb2FkbWFwc1Byb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9BY3Rpdml0eV9yb2FkbWFwc19mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0FjdGl2aXR5X3JvYWRtYXBzX2ZlYXR1cmUiLCAiX1VJX0FjdGl2aXR5X3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuQUNUSVZJVFlfX1JPQURNQVBTLCB0cnVlLCBmYWxzZSwKLQkJCQkJCXRydWUsIG51bGwsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgQWN0aXZpdHkuZ2lmLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoCi0JCQkJImZ1bGwvb2JqMTYvQWN0aXZpdHkiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoQWN0aXZpdHkpIG9iamVjdCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfQWN0aXZpdHlfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCWdldFN0cmluZygiX1VJX0FjdGl2aXR5X3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCi0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChBY3Rpdml0eS5jbGFzcykpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX19WQVJJQUJJTElUWV9UWVBFOgotCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbgotCQkJCQkuZ2V0Tm90aWZpZXIoKSwgZmFsc2UsIHRydWUpKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX19QUkVDT05ESVRJT046Ci0JCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9fUE9TVENPTkRJVElPTjoKLQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24KLQkJCQkJLmdldE5vdGlmaWVyKCksIHRydWUsIGZhbHNlKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4KLQkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKAotCQkJQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcigKLQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLldPUktfREVGSU5JVElPTl9fUFJFQ09ORElUSU9OLAotCQkJCVVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUNvbnN0cmFpbnQoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKAotCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuV09SS19ERUZJTklUSU9OX19QT1NUQ09ORElUSU9OLAotCQkJCVVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUNvbnN0cmFpbnQoKSkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3Ige0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ3JlYXRlQ2hpbGRDb21tYW5kfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldENyZWF0ZUNoaWxkVGV4dChPYmplY3Qgb3duZXIsIE9iamVjdCBmZWF0dXJlLAotCQkJT2JqZWN0IGNoaWxkLCBDb2xsZWN0aW9uPD8+IHNlbGVjdGlvbikgewotCQlPYmplY3QgY2hpbGRGZWF0dXJlID0gZmVhdHVyZTsKLQkJT2JqZWN0IGNoaWxkT2JqZWN0ID0gY2hpbGQ7Ci0KLQkJYm9vbGVhbiBxdWFsaWZ5ID0gY2hpbGRGZWF0dXJlID09IFVtYVBhY2thZ2UuTGl0ZXJhbHMuTUVUSE9EX0VMRU1FTlRfX09XTkVEX1JVTEVTCi0JCQkJfHwgY2hpbGRGZWF0dXJlID09IFVtYVBhY2thZ2UuTGl0ZXJhbHMuV09SS19ERUZJTklUSU9OX19QUkVDT05ESVRJT04KLQkJCQl8fCBjaGlsZEZlYXR1cmUgPT0gVW1hUGFja2FnZS5MaXRlcmFscy5XT1JLX0RFRklOSVRJT05fX1BPU1RDT05ESVRJT047Ci0KLQkJaWYgKHF1YWxpZnkpIHsKLQkJCXJldHVybiBnZXRTdHJpbmcoIl9VSV9DcmVhdGVDaGlsZF90ZXh0MiIsIC8vJE5PTi1OTFMtMSQKLQkJCQkJbmV3IE9iamVjdFtdIHsgZ2V0VHlwZVRleHQoY2hpbGRPYmplY3QpLAotCQkJCQkJCWdldEZlYXR1cmVUZXh0KGNoaWxkRmVhdHVyZSksIGdldFR5cGVUZXh0KG93bmVyKSB9KTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0Q3JlYXRlQ2hpbGRUZXh0KG93bmVyLCBmZWF0dXJlLCBjaGlsZCwgc2VsZWN0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvQXBwbGljYWJsZU1ldGFDbGFzc0luZm9JdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9BcHBsaWNhYmxlTWV0YUNsYXNzSW5mb0l0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZGMwMDJlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9BcHBsaWNhYmxlTWV0YUNsYXNzSW5mb0l0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQXBwbGljYWJsZU1ldGFDbGFzc0luZm99IG9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvSXRlbVByb3ZpZGVyIGV4dGVuZHMgQ2xhc3NpZmllckl0ZW1Qcm92aWRlcgotCQlpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCWFkZElzUHJpbWFyeUV4dGVuc2lvblByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgSXMgUHJpbWFyeSBFeHRlbnNpb24gZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRJc1ByaW1hcnlFeHRlbnNpb25Qcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfQXBwbGljYWJsZU1ldGFDbGFzc0luZm9faXNQcmltYXJ5RXh0ZW5zaW9uX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfQXBwbGljYWJsZU1ldGFDbGFzc0luZm9faXNQcmltYXJ5RXh0ZW5zaW9uX2ZlYXR1cmUiLCAiX1VJX0FwcGxpY2FibGVNZXRhQ2xhc3NJbmZvX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuQVBQTElDQUJMRV9NRVRBX0NMQVNTX0lORk9fX0lTX1BSSU1BUllfRVhURU5TSU9OLAotCQkJCQkJdHJ1ZSwgZmFsc2UsIGZhbHNlLAotCQkJCQkJSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIEFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvLmdpZi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKAotCQkJCSJmdWxsL29iajE2L0FwcGxpY2FibGVNZXRhQ2xhc3NJbmZvIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKEFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvKSBvYmplY3QpLmdldE5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX0FwcGxpY2FibGVNZXRhQ2xhc3NJbmZvX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQlnZXRTdHJpbmcoIl9VSV9BcHBsaWNhYmxlTWV0YUNsYXNzSW5mb190eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoQXBwbGljYWJsZU1ldGFDbGFzc0luZm8uY2xhc3MpKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5BUFBMSUNBQkxFX01FVEFfQ0xBU1NfSU5GT19fSVNfUFJJTUFSWV9FWFRFTlNJT046Ci0JCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uCi0JCQkJCS5nZXROb3RpZmllcigpLCBmYWxzZSwgdHJ1ZSkpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuCi0JICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycygKLQkJCUNvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0FydGlmYWN0RGVzY3JpcHRpb25JdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9BcnRpZmFjdERlc2NyaXB0aW9uSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0ZjYzYjQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0FydGlmYWN0RGVzY3JpcHRpb25JdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyMiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BcnRpZmFjdERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQXJ0aWZhY3REZXNjcmlwdGlvbn0gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQXJ0aWZhY3REZXNjcmlwdGlvbkl0ZW1Qcm92aWRlciBleHRlbmRzCi0JCVdvcmtQcm9kdWN0RGVzY3JpcHRpb25JdGVtUHJvdmlkZXIgaW1wbGVtZW50cwotCQlJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBcnRpZmFjdERlc2NyaXB0aW9uSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCWFkZEJyaWVmT3V0bGluZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkUmVwcmVzZW50YXRpb25PcHRpb25zUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRSZXByZXNlbnRhdGlvblByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkTm90YXRpb25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIEJyaWVmIE91dGxpbmUgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRCcmllZk91dGxpbmVQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfQXJ0aWZhY3REZXNjcmlwdGlvbl9icmllZk91dGxpbmVfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9BcnRpZmFjdERlc2NyaXB0aW9uX2JyaWVmT3V0bGluZV9mZWF0dXJlIiwgIl9VSV9BcnRpZmFjdERlc2NyaXB0aW9uX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuQVJUSUZBQ1RfREVTQ1JJUFRJT05fX0JSSUVGX09VVExJTkUsCi0JCQkJCQl0cnVlLCBmYWxzZSwgZmFsc2UsCi0JCQkJCQlJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgUmVwcmVzZW50YXRpb24gT3B0aW9ucyBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFJlcHJlc2VudGF0aW9uT3B0aW9uc1Byb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9BcnRpZmFjdERlc2NyaXB0aW9uX3JlcHJlc2VudGF0aW9uT3B0aW9uc19mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0FydGlmYWN0RGVzY3JpcHRpb25fcmVwcmVzZW50YXRpb25PcHRpb25zX2ZlYXR1cmUiLCAiX1VJX0FydGlmYWN0RGVzY3JpcHRpb25fdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5BUlRJRkFDVF9ERVNDUklQVElPTl9fUkVQUkVTRU5UQVRJT05fT1BUSU9OUywKLQkJCQkJCXRydWUsIGZhbHNlLCBmYWxzZSwKLQkJCQkJCUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBSZXByZXNlbnRhdGlvbiBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFJlcHJlc2VudGF0aW9uUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX0FydGlmYWN0RGVzY3JpcHRpb25fcmVwcmVzZW50YXRpb25fZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9BcnRpZmFjdERlc2NyaXB0aW9uX3JlcHJlc2VudGF0aW9uX2ZlYXR1cmUiLCAiX1VJX0FydGlmYWN0RGVzY3JpcHRpb25fdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5BUlRJRkFDVF9ERVNDUklQVElPTl9fUkVQUkVTRU5UQVRJT04sCi0JCQkJCQl0cnVlLCBmYWxzZSwgZmFsc2UsCi0JCQkJCQlJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgTm90YXRpb24gZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGROb3RhdGlvblByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9BcnRpZmFjdERlc2NyaXB0aW9uX25vdGF0aW9uX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfQXJ0aWZhY3REZXNjcmlwdGlvbl9ub3RhdGlvbl9mZWF0dXJlIiwgIl9VSV9BcnRpZmFjdERlc2NyaXB0aW9uX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuQVJUSUZBQ1RfREVTQ1JJUFRJT05fX05PVEFUSU9OLAotCQkJCQkJdHJ1ZSwgZmFsc2UsIGZhbHNlLAotCQkJCQkJSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIEFydGlmYWN0RGVzY3JpcHRpb24uZ2lmLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoCi0JCQkJImZ1bGwvb2JqMTYvQXJ0aWZhY3REZXNjcmlwdGlvbiIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChBcnRpZmFjdERlc2NyaXB0aW9uKSBvYmplY3QpLmdldE5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX0FydGlmYWN0RGVzY3JpcHRpb25fdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCWdldFN0cmluZygiX1VJX0FydGlmYWN0RGVzY3JpcHRpb25fdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0KLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKEFydGlmYWN0RGVzY3JpcHRpb24uY2xhc3MpKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5BUlRJRkFDVF9ERVNDUklQVElPTl9fQlJJRUZfT1VUTElORToKLQkJY2FzZSBVbWFQYWNrYWdlLkFSVElGQUNUX0RFU0NSSVBUSU9OX19SRVBSRVNFTlRBVElPTl9PUFRJT05TOgotCQljYXNlIFVtYVBhY2thZ2UuQVJUSUZBQ1RfREVTQ1JJUFRJT05fX1JFUFJFU0VOVEFUSU9OOgotCQljYXNlIFVtYVBhY2thZ2UuQVJUSUZBQ1RfREVTQ1JJUFRJT05fX05PVEFUSU9OOgotCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbgotCQkJCQkuZ2V0Tm90aWZpZXIoKSwgZmFsc2UsIHRydWUpKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbgotCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoCi0JCQlDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9BcnRpZmFjdEl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0FydGlmYWN0SXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmNmNkODAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0FydGlmYWN0SXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFydGlmYWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkFydGlmYWN0fSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBBcnRpZmFjdEl0ZW1Qcm92aWRlciBleHRlbmRzIFdvcmtQcm9kdWN0SXRlbVByb3ZpZGVyIGltcGxlbWVudHMKLQkJSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQXJ0aWZhY3RJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHNwZWNpZmllcyBob3cgdG8gaW1wbGVtZW50IHtAbGluayAjZ2V0Q2hpbGRyZW59IGFuZCBpcyB1c2VkIHRvIGRlZHVjZSBhbiBhcHByb3ByaWF0ZSBmZWF0dXJlIGZvciBhbgotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkFkZENvbW1hbmR9LCB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5SZW1vdmVDb21tYW5kfSBvcgotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLk1vdmVDb21tYW5kfSBpbiB7QGxpbmsgI2NyZWF0ZUNvbW1hbmR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBDb2xsZWN0aW9uPD8gZXh0ZW5kcyBFU3RydWN0dXJhbEZlYXR1cmU+IGdldENoaWxkcmVuRmVhdHVyZXMoCi0JCQlPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlbkZlYXR1cmVzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldENoaWxkcmVuRmVhdHVyZXMob2JqZWN0KTsKLQkJCWNoaWxkcmVuRmVhdHVyZXMKLQkJCQkJLmFkZChVbWFQYWNrYWdlLkxpdGVyYWxzLkFSVElGQUNUX19DT05UQUlORURfQVJUSUZBQ1RTKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW5GZWF0dXJlczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRVN0cnVjdHVyYWxGZWF0dXJlIGdldENoaWxkRmVhdHVyZShPYmplY3Qgb2JqZWN0LCBPYmplY3QgY2hpbGQpIHsKLQkJLy8gQ2hlY2sgdGhlIHR5cGUgb2YgdGhlIHNwZWNpZmllZCBjaGlsZCBvYmplY3QgYW5kIHJldHVybiB0aGUgcHJvcGVyIGZlYXR1cmUgdG8gdXNlIGZvcgotCQkvLyBhZGRpbmcgKHNlZSB7QGxpbmsgQWRkQ29tbWFuZH0pIGl0IGFzIGEgY2hpbGQuCi0KLQkJcmV0dXJuIHN1cGVyLmdldENoaWxkRmVhdHVyZShvYmplY3QsIGNoaWxkKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgQXJ0aWZhY3QuZ2lmLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoCi0JCQkJImZ1bGwvb2JqMTYvQXJ0aWZhY3QiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoQXJ0aWZhY3QpIG9iamVjdCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfQXJ0aWZhY3RfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCWdldFN0cmluZygiX1VJX0FydGlmYWN0X3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCi0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChBcnRpZmFjdC5jbGFzcykpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkFSVElGQUNUX19DT05UQUlORURfQVJUSUZBQ1RTOgotCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbgotCQkJCQkuZ2V0Tm90aWZpZXIoKSwgdHJ1ZSwgZmFsc2UpKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbgotCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoCi0JCQlDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKAotCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuQVJUSUZBQ1RfX0NPTlRBSU5FRF9BUlRJRkFDVFMsCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQXJ0aWZhY3QoKSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9CcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb25JdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9CcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb25JdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmRiNTJlMS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9ufSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb25JdGVtUHJvdmlkZXIgZXh0ZW5kcwotCQlDb250ZW50RGVzY3JpcHRpb25JdGVtUHJvdmlkZXIgaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwKLQkJSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb25JdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJYWRkVXNhZ2VHdWlkYW5jZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgVXNhZ2UgR3VpZGFuY2UgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRVc2FnZUd1aWRhbmNlUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX0JyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbl91c2FnZUd1aWRhbmNlX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uX3VzYWdlR3VpZGFuY2VfZmVhdHVyZSIsICJfVUlfQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX1VTQUdFX0dVSURBTkNFLAotCQkJCQkJdHJ1ZSwgZmFsc2UsIGZhbHNlLAotCQkJCQkJSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIEJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbi5naWYuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgKLQkJCQkiZnVsbC9vYmoxNi9CcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24iKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uKSBvYmplY3QpLmdldE5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX0JyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbl90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJZ2V0U3RyaW5nKCJfVUlfQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCi0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24uY2xhc3MpKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fVVNBR0VfR1VJREFOQ0U6Ci0JCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uCi0JCQkJCS5nZXROb3RpZmllcigpLCBmYWxzZSwgdHJ1ZSkpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuCi0JICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycygKLQkJCUNvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0JyZWFrZG93bkVsZW1lbnRJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9CcmVha2Rvd25FbGVtZW50SXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkYmM5MjMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0JyZWFrZG93bkVsZW1lbnRJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxMSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudH0gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQnJlYWtkb3duRWxlbWVudEl0ZW1Qcm92aWRlciBleHRlbmRzIFByb2Nlc3NFbGVtZW50SXRlbVByb3ZpZGVyCi0JCWltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQnJlYWtkb3duRWxlbWVudEl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIExpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlhZGRQcmVmaXhQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZElzUGxhbm5lZFByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkSGFzTXVsdGlwbGVPY2N1cnJlbmNlc1Byb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkSXNPcHRpb25hbFByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkUHJlc2VudGVkQWZ0ZXJQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZFByZXNlbnRlZEJlZm9yZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkU3VwZXJBY3Rpdml0aWVzUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRDaGVja2xpc3RzUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRDb25jZXB0c1Byb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkRXhhbXBsZXNQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZEd1aWRlbGluZXNQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZFJldXNhYmxlQXNzZXRzUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRTdXBwb3J0aW5nTWF0ZXJpYWxzUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRUZW1wbGF0ZXNQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZFJlcG9ydHNQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZEVzdGltYXRpb25jb25zaWRlcmF0aW9uc1Byb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkVG9vbG1lbnRvclByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgUHJlZml4IGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkUHJlZml4UHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX0JyZWFrZG93bkVsZW1lbnRfcHJlZml4X2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfQnJlYWtkb3duRWxlbWVudF9wcmVmaXhfZmVhdHVyZSIsICJfVUlfQnJlYWtkb3duRWxlbWVudF90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkJSRUFLRE9XTl9FTEVNRU5UX19QUkVGSVgsIHRydWUsCi0JCQkJCQlmYWxzZSwgZmFsc2UsCi0JCQkJCQlJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgSXMgUGxhbm5lZCBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZElzUGxhbm5lZFByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9CcmVha2Rvd25FbGVtZW50X2lzUGxhbm5lZF9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0JyZWFrZG93bkVsZW1lbnRfaXNQbGFubmVkX2ZlYXR1cmUiLCAiX1VJX0JyZWFrZG93bkVsZW1lbnRfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5CUkVBS0RPV05fRUxFTUVOVF9fSVNfUExBTk5FRCwKLQkJCQkJCXRydWUsIGZhbHNlLCBmYWxzZSwKLQkJCQkJCUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBIYXMgTXVsdGlwbGUgT2NjdXJyZW5jZXMgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRIYXNNdWx0aXBsZU9jY3VycmVuY2VzUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX0JyZWFrZG93bkVsZW1lbnRfaGFzTXVsdGlwbGVPY2N1cnJlbmNlc19mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0JyZWFrZG93bkVsZW1lbnRfaGFzTXVsdGlwbGVPY2N1cnJlbmNlc19mZWF0dXJlIiwgIl9VSV9CcmVha2Rvd25FbGVtZW50X3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuQlJFQUtET1dOX0VMRU1FTlRfX0hBU19NVUxUSVBMRV9PQ0NVUlJFTkNFUywKLQkJCQkJCXRydWUsIGZhbHNlLCBmYWxzZSwKLQkJCQkJCUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBJcyBPcHRpb25hbCBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZElzT3B0aW9uYWxQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfQnJlYWtkb3duRWxlbWVudF9pc09wdGlvbmFsX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfQnJlYWtkb3duRWxlbWVudF9pc09wdGlvbmFsX2ZlYXR1cmUiLCAiX1VJX0JyZWFrZG93bkVsZW1lbnRfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5CUkVBS0RPV05fRUxFTUVOVF9fSVNfT1BUSU9OQUwsCi0JCQkJCQl0cnVlLCBmYWxzZSwgZmFsc2UsCi0JCQkJCQlJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgUHJlc2VudGVkIEFmdGVyIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkUHJlc2VudGVkQWZ0ZXJQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfQnJlYWtkb3duRWxlbWVudF9wcmVzZW50ZWRBZnRlcl9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0JyZWFrZG93bkVsZW1lbnRfcHJlc2VudGVkQWZ0ZXJfZmVhdHVyZSIsICJfVUlfQnJlYWtkb3duRWxlbWVudF90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkJSRUFLRE9XTl9FTEVNRU5UX19QUkVTRU5URURfQUZURVIsCi0JCQkJCQl0cnVlLCBmYWxzZSwgdHJ1ZSwgbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBQcmVzZW50ZWQgQmVmb3JlIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkUHJlc2VudGVkQmVmb3JlUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX0JyZWFrZG93bkVsZW1lbnRfcHJlc2VudGVkQmVmb3JlX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfQnJlYWtkb3duRWxlbWVudF9wcmVzZW50ZWRCZWZvcmVfZmVhdHVyZSIsICJfVUlfQnJlYWtkb3duRWxlbWVudF90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkJSRUFLRE9XTl9FTEVNRU5UX19QUkVTRU5URURfQkVGT1JFLAotCQkJCQkJdHJ1ZSwgZmFsc2UsIHRydWUsIG51bGwsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgU3VwZXIgQWN0aXZpdGllcyBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFN1cGVyQWN0aXZpdGllc1Byb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9CcmVha2Rvd25FbGVtZW50X3N1cGVyQWN0aXZpdGllc19mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0JyZWFrZG93bkVsZW1lbnRfc3VwZXJBY3Rpdml0aWVzX2ZlYXR1cmUiLCAiX1VJX0JyZWFrZG93bkVsZW1lbnRfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5CUkVBS0RPV05fRUxFTUVOVF9fU1VQRVJfQUNUSVZJVElFUywKLQkJCQkJCXRydWUsIGZhbHNlLCB0cnVlLCBudWxsLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIENoZWNrbGlzdHMgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRDaGVja2xpc3RzUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX0JyZWFrZG93bkVsZW1lbnRfY2hlY2tsaXN0c19mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0JyZWFrZG93bkVsZW1lbnRfY2hlY2tsaXN0c19mZWF0dXJlIiwgIl9VSV9CcmVha2Rvd25FbGVtZW50X3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuQlJFQUtET1dOX0VMRU1FTlRfX0NIRUNLTElTVFMsCi0JCQkJCQl0cnVlLCBmYWxzZSwgdHJ1ZSwgbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBDb25jZXB0cyBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZENvbmNlcHRzUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX0JyZWFrZG93bkVsZW1lbnRfY29uY2VwdHNfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9CcmVha2Rvd25FbGVtZW50X2NvbmNlcHRzX2ZlYXR1cmUiLCAiX1VJX0JyZWFrZG93bkVsZW1lbnRfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5CUkVBS0RPV05fRUxFTUVOVF9fQ09OQ0VQVFMsIHRydWUsCi0JCQkJCQlmYWxzZSwgdHJ1ZSwgbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBFeGFtcGxlcyBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEV4YW1wbGVzUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX0JyZWFrZG93bkVsZW1lbnRfZXhhbXBsZXNfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9CcmVha2Rvd25FbGVtZW50X2V4YW1wbGVzX2ZlYXR1cmUiLCAiX1VJX0JyZWFrZG93bkVsZW1lbnRfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5CUkVBS0RPV05fRUxFTUVOVF9fRVhBTVBMRVMsIHRydWUsCi0JCQkJCQlmYWxzZSwgdHJ1ZSwgbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBHdWlkZWxpbmVzIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkR3VpZGVsaW5lc1Byb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9CcmVha2Rvd25FbGVtZW50X2d1aWRlbGluZXNfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9CcmVha2Rvd25FbGVtZW50X2d1aWRlbGluZXNfZmVhdHVyZSIsICJfVUlfQnJlYWtkb3duRWxlbWVudF90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkJSRUFLRE9XTl9FTEVNRU5UX19HVUlERUxJTkVTLAotCQkJCQkJdHJ1ZSwgZmFsc2UsIHRydWUsIG51bGwsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgUmV1c2FibGUgQXNzZXRzIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkUmV1c2FibGVBc3NldHNQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfQnJlYWtkb3duRWxlbWVudF9yZXVzYWJsZUFzc2V0c19mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0JyZWFrZG93bkVsZW1lbnRfcmV1c2FibGVBc3NldHNfZmVhdHVyZSIsICJfVUlfQnJlYWtkb3duRWxlbWVudF90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkJSRUFLRE9XTl9FTEVNRU5UX19SRVVTQUJMRV9BU1NFVFMsCi0JCQkJCQl0cnVlLCBmYWxzZSwgdHJ1ZSwgbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBTdXBwb3J0aW5nIE1hdGVyaWFscyBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFN1cHBvcnRpbmdNYXRlcmlhbHNQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfQnJlYWtkb3duRWxlbWVudF9zdXBwb3J0aW5nTWF0ZXJpYWxzX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfQnJlYWtkb3duRWxlbWVudF9zdXBwb3J0aW5nTWF0ZXJpYWxzX2ZlYXR1cmUiLCAiX1VJX0JyZWFrZG93bkVsZW1lbnRfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5CUkVBS0RPV05fRUxFTUVOVF9fU1VQUE9SVElOR19NQVRFUklBTFMsCi0JCQkJCQl0cnVlLCBmYWxzZSwgdHJ1ZSwgbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBUZW1wbGF0ZXMgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRUZW1wbGF0ZXNQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfQnJlYWtkb3duRWxlbWVudF90ZW1wbGF0ZXNfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9CcmVha2Rvd25FbGVtZW50X3RlbXBsYXRlc19mZWF0dXJlIiwgIl9VSV9CcmVha2Rvd25FbGVtZW50X3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuQlJFQUtET1dOX0VMRU1FTlRfX1RFTVBMQVRFUywgdHJ1ZSwKLQkJCQkJCWZhbHNlLCB0cnVlLCBudWxsLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFJlcG9ydHMgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRSZXBvcnRzUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX0JyZWFrZG93bkVsZW1lbnRfcmVwb3J0c19mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0JyZWFrZG93bkVsZW1lbnRfcmVwb3J0c19mZWF0dXJlIiwgIl9VSV9CcmVha2Rvd25FbGVtZW50X3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuQlJFQUtET1dOX0VMRU1FTlRfX1JFUE9SVFMsIHRydWUsCi0JCQkJCQlmYWxzZSwgdHJ1ZSwgbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBFc3RpbWF0aW9uY29uc2lkZXJhdGlvbnMgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRFc3RpbWF0aW9uY29uc2lkZXJhdGlvbnNQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfQnJlYWtkb3duRWxlbWVudF9lc3RpbWF0aW9uY29uc2lkZXJhdGlvbnNfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9CcmVha2Rvd25FbGVtZW50X2VzdGltYXRpb25jb25zaWRlcmF0aW9uc19mZWF0dXJlIiwgIl9VSV9CcmVha2Rvd25FbGVtZW50X3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuQlJFQUtET1dOX0VMRU1FTlRfX0VTVElNQVRJT05DT05TSURFUkFUSU9OUywKLQkJCQkJCXRydWUsIGZhbHNlLCB0cnVlLCBudWxsLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFRvb2xtZW50b3IgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRUb29sbWVudG9yUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX0JyZWFrZG93bkVsZW1lbnRfdG9vbG1lbnRvcl9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0JyZWFrZG93bkVsZW1lbnRfdG9vbG1lbnRvcl9mZWF0dXJlIiwgIl9VSV9CcmVha2Rvd25FbGVtZW50X3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuQlJFQUtET1dOX0VMRU1FTlRfX1RPT0xNRU5UT1IsCi0JCQkJCQl0cnVlLCBmYWxzZSwgdHJ1ZSwgbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgc3BlY2lmaWVzIGhvdyB0byBpbXBsZW1lbnQge0BsaW5rICNnZXRDaGlsZHJlbn0gYW5kIGlzIHVzZWQgdG8gZGVkdWNlIGFuIGFwcHJvcHJpYXRlIGZlYXR1cmUgZm9yIGFuCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQWRkQ29tbWFuZH0sIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLlJlbW92ZUNvbW1hbmR9IG9yCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuTW92ZUNvbW1hbmR9IGluIHtAbGluayAjY3JlYXRlQ29tbWFuZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIENvbGxlY3Rpb248PyBleHRlbmRzIEVTdHJ1Y3R1cmFsRmVhdHVyZT4gZ2V0Q2hpbGRyZW5GZWF0dXJlcygKLQkJCU9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGNoaWxkcmVuRmVhdHVyZXMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0Q2hpbGRyZW5GZWF0dXJlcyhvYmplY3QpOwotCQkJY2hpbGRyZW5GZWF0dXJlcwotCQkJCQkuYWRkKFVtYVBhY2thZ2UuTGl0ZXJhbHMuQlJFQUtET1dOX0VMRU1FTlRfX1BMQU5OSU5HX0RBVEEpOwotCQl9Ci0JCXJldHVybiBjaGlsZHJlbkZlYXR1cmVzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFU3RydWN0dXJhbEZlYXR1cmUgZ2V0Q2hpbGRGZWF0dXJlKE9iamVjdCBvYmplY3QsIE9iamVjdCBjaGlsZCkgewotCQkvLyBDaGVjayB0aGUgdHlwZSBvZiB0aGUgc3BlY2lmaWVkIGNoaWxkIG9iamVjdCBhbmQgcmV0dXJuIHRoZSBwcm9wZXIgZmVhdHVyZSB0byB1c2UgZm9yCi0JCS8vIGFkZGluZyAoc2VlIHtAbGluayBBZGRDb21tYW5kfSkgaXQgYXMgYSBjaGlsZC4KLQotCQlyZXR1cm4gc3VwZXIuZ2V0Q2hpbGRGZWF0dXJlKG9iamVjdCwgY2hpbGQpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChCcmVha2Rvd25FbGVtZW50KSBvYmplY3QpLmdldE5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX0JyZWFrZG93bkVsZW1lbnRfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCWdldFN0cmluZygiX1VJX0JyZWFrZG93bkVsZW1lbnRfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0KLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKEJyZWFrZG93bkVsZW1lbnQuY2xhc3MpKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fUFJFRklYOgotCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX0lTX1BMQU5ORUQ6Ci0JCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fSEFTX01VTFRJUExFX09DQ1VSUkVOQ0VTOgotCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX0lTX09QVElPTkFMOgotCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbgotCQkJCQkuZ2V0Tm90aWZpZXIoKSwgZmFsc2UsIHRydWUpKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19QTEFOTklOR19EQVRBOgotCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbgotCQkJCQkuZ2V0Tm90aWZpZXIoKSwgdHJ1ZSwgZmFsc2UpKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbgotCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoCi0JCQlDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKAotCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuQlJFQUtET1dOX0VMRU1FTlRfX1BMQU5OSU5HX0RBVEEsCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUGxhbm5pbmdEYXRhKCkpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvQ2FwYWJpbGl0eVBhdHRlcm5JdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9DYXBhYmlsaXR5UGF0dGVybkl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZjVmMzUwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9DYXBhYmlsaXR5UGF0dGVybkl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DYXBhYmlsaXR5UGF0dGVybjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkNhcGFiaWxpdHlQYXR0ZXJufSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBDYXBhYmlsaXR5UGF0dGVybkl0ZW1Qcm92aWRlciBleHRlbmRzIFByb2Nlc3NJdGVtUHJvdmlkZXIKLQkJaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDYXBhYmlsaXR5UGF0dGVybkl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIExpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBDYXBhYmlsaXR5UGF0dGVybi5naWYuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgKLQkJCQkiZnVsbC9vYmoxNi9DYXBhYmlsaXR5UGF0dGVybiIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChDYXBhYmlsaXR5UGF0dGVybikgb2JqZWN0KS5nZXROYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9DYXBhYmlsaXR5UGF0dGVybl90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJZ2V0U3RyaW5nKCJfVUlfQ2FwYWJpbGl0eVBhdHRlcm5fdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuCi0JICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycygKLQkJCUNvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5DcmVhdGVDaGlsZENvbW1hbmR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0Q3JlYXRlQ2hpbGRUZXh0KE9iamVjdCBvd25lciwgT2JqZWN0IGZlYXR1cmUsCi0JCQlPYmplY3QgY2hpbGQsIENvbGxlY3Rpb248Pz4gc2VsZWN0aW9uKSB7Ci0JCU9iamVjdCBjaGlsZEZlYXR1cmUgPSBmZWF0dXJlOwotCQlPYmplY3QgY2hpbGRPYmplY3QgPSBjaGlsZDsKLQotCQlib29sZWFuIHF1YWxpZnkgPSBjaGlsZEZlYXR1cmUgPT0gVW1hUGFja2FnZS5MaXRlcmFscy5NRVRIT0RfRUxFTUVOVF9fT1dORURfUlVMRVMKLQkJCQl8fCBjaGlsZEZlYXR1cmUgPT0gVW1hUGFja2FnZS5MaXRlcmFscy5XT1JLX0RFRklOSVRJT05fX1BSRUNPTkRJVElPTgotCQkJCXx8IGNoaWxkRmVhdHVyZSA9PSBVbWFQYWNrYWdlLkxpdGVyYWxzLldPUktfREVGSU5JVElPTl9fUE9TVENPTkRJVElPTjsKLQotCQlpZiAocXVhbGlmeSkgewotCQkJcmV0dXJuIGdldFN0cmluZygiX1VJX0NyZWF0ZUNoaWxkX3RleHQyIiwgLy8kTk9OLU5MUy0xJAotCQkJCQluZXcgT2JqZWN0W10geyBnZXRUeXBlVGV4dChjaGlsZE9iamVjdCksCi0JCQkJCQkJZ2V0RmVhdHVyZVRleHQoY2hpbGRGZWF0dXJlKSwgZ2V0VHlwZVRleHQob3duZXIpIH0pOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRDcmVhdGVDaGlsZFRleHQob3duZXIsIGZlYXR1cmUsIGNoaWxkLCBzZWxlY3Rpb24pOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9DaGVja2xpc3RJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9DaGVja2xpc3RJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTI5MmNhZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvQ2hlY2tsaXN0SXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNoZWNrbGlzdDsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQ2hlY2tsaXN0fSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBDaGVja2xpc3RJdGVtUHJvdmlkZXIgZXh0ZW5kcyBHdWlkYW5jZUl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzCi0JCUlFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENoZWNrbGlzdEl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIExpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBDaGVja2xpc3QuZ2lmLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoCi0JCQkJImZ1bGwvb2JqMTYvQ2hlY2tsaXN0IikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKENoZWNrbGlzdCkgb2JqZWN0KS5nZXROYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9DaGVja2xpc3RfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCWdldFN0cmluZygiX1VJX0NoZWNrbGlzdF90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4KLQkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKAotCQkJQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvQ2xhc3NpZmllckl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0NsYXNzaWZpZXJJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTM3MjE3ZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvQ2xhc3NpZmllckl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNsYXNzaWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5DbGFzc2lmaWVyfSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBDbGFzc2lmaWVySXRlbVByb3ZpZGVyIGV4dGVuZHMgVHlwZUl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzCi0JCUlFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENsYXNzaWZpZXJJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJYWRkSXNBYnN0cmFjdFByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgSXMgQWJzdHJhY3QgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRJc0Fic3RyYWN0UHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX0NsYXNzaWZpZXJfaXNBYnN0cmFjdF9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0NsYXNzaWZpZXJfaXNBYnN0cmFjdF9mZWF0dXJlIiwgIl9VSV9DbGFzc2lmaWVyX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuQ0xBU1NJRklFUl9fSVNfQUJTVFJBQ1QsIHRydWUsCi0JCQkJCQlmYWxzZSwgZmFsc2UsCi0JCQkJCQlJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoQ2xhc3NpZmllcikgb2JqZWN0KS5nZXROYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9DbGFzc2lmaWVyX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQlnZXRTdHJpbmcoIl9VSV9DbGFzc2lmaWVyX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCi0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChDbGFzc2lmaWVyLmNsYXNzKSkgewotCQljYXNlIFVtYVBhY2thZ2UuQ0xBU1NJRklFUl9fSVNfQUJTVFJBQ1Q6Ci0JCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uCi0JCQkJCS5nZXROb3RpZmllcigpLCBmYWxzZSwgdHJ1ZSkpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuCi0JICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycygKLQkJCUNvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0NvbXBvc2l0ZVJvbGVJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9Db21wb3NpdGVSb2xlSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhZGU4NjEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0NvbXBvc2l0ZVJvbGVJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db21wb3NpdGVSb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQ29tcG9zaXRlUm9sZX0gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQ29tcG9zaXRlUm9sZUl0ZW1Qcm92aWRlciBleHRlbmRzIFJvbGVEZXNjcmlwdG9ySXRlbVByb3ZpZGVyCi0JCWltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ29tcG9zaXRlUm9sZUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIExpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlhZGRBZ2dyZWdhdGVkUm9sZXNQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIEFnZ3JlZ2F0ZWQgUm9sZXMgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRBZ2dyZWdhdGVkUm9sZXNQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfQ29tcG9zaXRlUm9sZV9hZ2dyZWdhdGVkUm9sZXNfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9Db21wb3NpdGVSb2xlX2FnZ3JlZ2F0ZWRSb2xlc19mZWF0dXJlIiwgIl9VSV9Db21wb3NpdGVSb2xlX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuQ09NUE9TSVRFX1JPTEVfX0FHR1JFR0FURURfUk9MRVMsCi0JCQkJCQl0cnVlLCBmYWxzZSwgdHJ1ZSwgbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBDb21wb3NpdGVSb2xlLmdpZi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKAotCQkJCSJmdWxsL29iajE2L0NvbXBvc2l0ZVJvbGUiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoQ29tcG9zaXRlUm9sZSkgb2JqZWN0KS5nZXROYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9Db21wb3NpdGVSb2xlX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQlnZXRTdHJpbmcoIl9VSV9Db21wb3NpdGVSb2xlX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbgotCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoCi0JCQlDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9Db25jZXB0SXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvQ29uY2VwdEl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMzQxODNhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9Db25jZXB0SXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbmNlcHQ7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbmNlcHR9IG9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIENvbmNlcHRJdGVtUHJvdmlkZXIgZXh0ZW5kcyBHdWlkYW5jZUl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzCi0JCUlFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENvbmNlcHRJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgQ29uY2VwdC5naWYuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgKLQkJCQkiZnVsbC9vYmoxNi9Db25jZXB0IikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKENvbmNlcHQpIG9iamVjdCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfQ29uY2VwdF90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJZ2V0U3RyaW5nKCJfVUlfQ29uY2VwdF90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4KLQkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKAotCQkJQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvQ29uc3RyYWludEl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0NvbnN0cmFpbnRJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWE1MGIyMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvQ29uc3RyYWludEl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnN0cmFpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db25zdHJhaW50fSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBDb25zdHJhaW50SXRlbVByb3ZpZGVyIGV4dGVuZHMgTWV0aG9kRWxlbWVudEl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzCi0JCUlFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENvbnN0cmFpbnRJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJYWRkQm9keVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgQm9keSBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEJvZHlQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfQ29uc3RyYWludF9ib2R5X2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfQ29uc3RyYWludF9ib2R5X2ZlYXR1cmUiLCAiX1VJX0NvbnN0cmFpbnRfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5DT05TVFJBSU5UX19CT0RZLCB0cnVlLCBmYWxzZSwKLQkJCQkJCWZhbHNlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsCi0JCQkJCQludWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIENvbnN0cmFpbnQuZ2lmLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoCi0JCQkJImZ1bGwvb2JqMTYvQ29uc3RyYWludCIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChDb25zdHJhaW50KSBvYmplY3QpLmdldE5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX0NvbnN0cmFpbnRfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCWdldFN0cmluZygiX1VJX0NvbnN0cmFpbnRfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0KLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKENvbnN0cmFpbnQuY2xhc3MpKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5DT05TVFJBSU5UX19CT0RZOgotCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbgotCQkJCQkuZ2V0Tm90aWZpZXIoKSwgZmFsc2UsIHRydWUpKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbgotCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoCi0JCQlDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9Db250ZW50Q2F0ZWdvcnlJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9Db250ZW50Q2F0ZWdvcnlJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTg0MGVkNy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvQ29udGVudENhdGVnb3J5SXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRDYXRlZ29yeTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudENhdGVnb3J5fSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBDb250ZW50Q2F0ZWdvcnlJdGVtUHJvdmlkZXIgZXh0ZW5kcyBDb250ZW50RWxlbWVudEl0ZW1Qcm92aWRlcgotCQlpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENvbnRlbnRDYXRlZ29yeUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIExpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChDb250ZW50Q2F0ZWdvcnkpIG9iamVjdCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfQ29udGVudENhdGVnb3J5X3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQlnZXRTdHJpbmcoIl9VSV9Db250ZW50Q2F0ZWdvcnlfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuCi0JICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycygKLQkJCUNvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0NvbnRlbnREZXNjcmlwdGlvbkl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0NvbnRlbnREZXNjcmlwdGlvbkl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ODA1NDkwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9Db250ZW50RGVzY3JpcHRpb25JdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RGVzY3JpcHRpb259IG9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIENvbnRlbnREZXNjcmlwdGlvbkl0ZW1Qcm92aWRlciBleHRlbmRzIE1ldGhvZFVuaXRJdGVtUHJvdmlkZXIKLQkJaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb250ZW50RGVzY3JpcHRpb25JdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJYWRkTWFpbkRlc2NyaXB0aW9uUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRFeHRlcm5hbElkUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRLZXlDb25zaWRlcmF0aW9uc1Byb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkTG9uZ1ByZXNlbnRhdGlvbk5hbWVQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIE1haW4gRGVzY3JpcHRpb24gZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRNYWluRGVzY3JpcHRpb25Qcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfQ29udGVudERlc2NyaXB0aW9uX21haW5EZXNjcmlwdGlvbl9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0NvbnRlbnREZXNjcmlwdGlvbl9tYWluRGVzY3JpcHRpb25fZmVhdHVyZSIsICJfVUlfQ29udGVudERlc2NyaXB0aW9uX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuQ09OVEVOVF9ERVNDUklQVElPTl9fTUFJTl9ERVNDUklQVElPTiwKLQkJCQkJCXRydWUsIGZhbHNlLCBmYWxzZSwKLQkJCQkJCUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBFeHRlcm5hbCBJZCBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEV4dGVybmFsSWRQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfQ29udGVudERlc2NyaXB0aW9uX2V4dGVybmFsSWRfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9Db250ZW50RGVzY3JpcHRpb25fZXh0ZXJuYWxJZF9mZWF0dXJlIiwgIl9VSV9Db250ZW50RGVzY3JpcHRpb25fdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5DT05URU5UX0RFU0NSSVBUSU9OX19FWFRFUk5BTF9JRCwKLQkJCQkJCXRydWUsIGZhbHNlLCBmYWxzZSwKLQkJCQkJCUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBLZXkgQ29uc2lkZXJhdGlvbnMgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRLZXlDb25zaWRlcmF0aW9uc1Byb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9Db250ZW50RGVzY3JpcHRpb25fa2V5Q29uc2lkZXJhdGlvbnNfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9Db250ZW50RGVzY3JpcHRpb25fa2V5Q29uc2lkZXJhdGlvbnNfZmVhdHVyZSIsICJfVUlfQ29udGVudERlc2NyaXB0aW9uX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuQ09OVEVOVF9ERVNDUklQVElPTl9fS0VZX0NPTlNJREVSQVRJT05TLAotCQkJCQkJdHJ1ZSwgZmFsc2UsIGZhbHNlLAotCQkJCQkJSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIExvbmcgUHJlc2VudGF0aW9uIE5hbWUgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRMb25nUHJlc2VudGF0aW9uTmFtZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9Db250ZW50RGVzY3JpcHRpb25fbG9uZ1ByZXNlbnRhdGlvbk5hbWVfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9Db250ZW50RGVzY3JpcHRpb25fbG9uZ1ByZXNlbnRhdGlvbk5hbWVfZmVhdHVyZSIsICJfVUlfQ29udGVudERlc2NyaXB0aW9uX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuQ09OVEVOVF9ERVNDUklQVElPTl9fTE9OR19QUkVTRU5UQVRJT05fTkFNRSwKLQkJCQkJCXRydWUsIGZhbHNlLCBmYWxzZSwKLQkJCQkJCUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgc3BlY2lmaWVzIGhvdyB0byBpbXBsZW1lbnQge0BsaW5rICNnZXRDaGlsZHJlbn0gYW5kIGlzIHVzZWQgdG8gZGVkdWNlIGFuIGFwcHJvcHJpYXRlIGZlYXR1cmUgZm9yIGFuCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQWRkQ29tbWFuZH0sIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLlJlbW92ZUNvbW1hbmR9IG9yCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuTW92ZUNvbW1hbmR9IGluIHtAbGluayAjY3JlYXRlQ29tbWFuZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIENvbGxlY3Rpb248PyBleHRlbmRzIEVTdHJ1Y3R1cmFsRmVhdHVyZT4gZ2V0Q2hpbGRyZW5GZWF0dXJlcygKLQkJCU9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGNoaWxkcmVuRmVhdHVyZXMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0Q2hpbGRyZW5GZWF0dXJlcyhvYmplY3QpOwotCQkJY2hpbGRyZW5GZWF0dXJlcwotCQkJCQkuYWRkKFVtYVBhY2thZ2UuTGl0ZXJhbHMuQ09OVEVOVF9ERVNDUklQVElPTl9fU0VDVElPTlMpOwotCQl9Ci0JCXJldHVybiBjaGlsZHJlbkZlYXR1cmVzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFU3RydWN0dXJhbEZlYXR1cmUgZ2V0Q2hpbGRGZWF0dXJlKE9iamVjdCBvYmplY3QsIE9iamVjdCBjaGlsZCkgewotCQkvLyBDaGVjayB0aGUgdHlwZSBvZiB0aGUgc3BlY2lmaWVkIGNoaWxkIG9iamVjdCBhbmQgcmV0dXJuIHRoZSBwcm9wZXIgZmVhdHVyZSB0byB1c2UgZm9yCi0JCS8vIGFkZGluZyAoc2VlIHtAbGluayBBZGRDb21tYW5kfSkgaXQgYXMgYSBjaGlsZC4KLQotCQlyZXR1cm4gc3VwZXIuZ2V0Q2hpbGRGZWF0dXJlKG9iamVjdCwgY2hpbGQpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBDb250ZW50RGVzY3JpcHRpb24uZ2lmLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoCi0JCQkJImZ1bGwvb2JqMTYvQ29udGVudERlc2NyaXB0aW9uIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKENvbnRlbnREZXNjcmlwdGlvbikgb2JqZWN0KS5nZXROYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9Db250ZW50RGVzY3JpcHRpb25fdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCWdldFN0cmluZygiX1VJX0NvbnRlbnREZXNjcmlwdGlvbl90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoQ29udGVudERlc2NyaXB0aW9uLmNsYXNzKSkgewotCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9ERVNDUklQVElPTl9fTUFJTl9ERVNDUklQVElPTjoKLQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfREVTQ1JJUFRJT05fX0VYVEVSTkFMX0lEOgotCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9ERVNDUklQVElPTl9fS0VZX0NPTlNJREVSQVRJT05TOgotCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9ERVNDUklQVElPTl9fTE9OR19QUkVTRU5UQVRJT05fTkFNRToKLQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24KLQkJCQkJLmdldE5vdGlmaWVyKCksIGZhbHNlLCB0cnVlKSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0RFU0NSSVBUSU9OX19TRUNUSU9OUzoKLQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24KLQkJCQkJLmdldE5vdGlmaWVyKCksIHRydWUsIGZhbHNlKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4KLQkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKAotCQkJQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcigKLQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkNPTlRFTlRfREVTQ1JJUFRJT05fX1NFQ1RJT05TLAotCQkJCVVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVNlY3Rpb24oKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKAotCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuQ09OVEVOVF9ERVNDUklQVElPTl9fU0VDVElPTlMsCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlU3RlcCgpKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0NvbnRlbnRFbGVtZW50SXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvQ29udGVudEVsZW1lbnRJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTQxMDg1Ny4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvQ29udGVudEVsZW1lbnRJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwMyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRFbGVtZW50fSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBDb250ZW50RWxlbWVudEl0ZW1Qcm92aWRlciBleHRlbmRzIERlc2NyaWJhYmxlRWxlbWVudEl0ZW1Qcm92aWRlcgotCQlpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENvbnRlbnRFbGVtZW50SXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCWFkZFZhcmlhYmlsaXR5VHlwZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkVmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudFByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkU3VwcG9ydGluZ01hdGVyaWFsc1Byb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkQ29uY2VwdHNBbmRQYXBlcnNQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZENoZWNrbGlzdHNQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZEd1aWRlbGluZXNQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZEV4YW1wbGVzUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRBc3NldHNQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZFRlcm1kZWZpbml0aW9uUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBWYXJpYWJpbGl0eSBUeXBlIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkVmFyaWFiaWxpdHlUeXBlUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX1ZhcmlhYmlsaXR5RWxlbWVudF92YXJpYWJpbGl0eVR5cGVfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9WYXJpYWJpbGl0eUVsZW1lbnRfdmFyaWFiaWxpdHlUeXBlX2ZlYXR1cmUiLCAiX1VJX1ZhcmlhYmlsaXR5RWxlbWVudF90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLlZBUklBQklMSVRZX0VMRU1FTlRfX1ZBUklBQklMSVRZX1RZUEUsCi0JCQkJCQl0cnVlLCBmYWxzZSwgZmFsc2UsCi0JCQkJCQlJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgVmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudCBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnRQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfVmFyaWFiaWxpdHlFbGVtZW50X3ZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnRfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9WYXJpYWJpbGl0eUVsZW1lbnRfdmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudF9mZWF0dXJlIiwgIl9VSV9WYXJpYWJpbGl0eUVsZW1lbnRfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5WQVJJQUJJTElUWV9FTEVNRU5UX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5ULAotCQkJCQkJdHJ1ZSwgZmFsc2UsIHRydWUsIG51bGwsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgQ29uY2VwdHMgQW5kIFBhcGVycyBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZENvbmNlcHRzQW5kUGFwZXJzUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX0NvbnRlbnRFbGVtZW50X2NvbmNlcHRzQW5kUGFwZXJzX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfQ29udGVudEVsZW1lbnRfY29uY2VwdHNBbmRQYXBlcnNfZmVhdHVyZSIsICJfVUlfQ29udGVudEVsZW1lbnRfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5DT05URU5UX0VMRU1FTlRfX0NPTkNFUFRTX0FORF9QQVBFUlMsCi0JCQkJCQl0cnVlLCBmYWxzZSwgdHJ1ZSwgbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBDaGVja2xpc3RzIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkQ2hlY2tsaXN0c1Byb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9Db250ZW50RWxlbWVudF9jaGVja2xpc3RzX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfQ29udGVudEVsZW1lbnRfY2hlY2tsaXN0c19mZWF0dXJlIiwgIl9VSV9Db250ZW50RWxlbWVudF90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkNPTlRFTlRfRUxFTUVOVF9fQ0hFQ0tMSVNUUywgdHJ1ZSwKLQkJCQkJCWZhbHNlLCB0cnVlLCBudWxsLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIEd1aWRlbGluZXMgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRHdWlkZWxpbmVzUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX0NvbnRlbnRFbGVtZW50X2d1aWRlbGluZXNfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9Db250ZW50RWxlbWVudF9ndWlkZWxpbmVzX2ZlYXR1cmUiLCAiX1VJX0NvbnRlbnRFbGVtZW50X3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuQ09OVEVOVF9FTEVNRU5UX19HVUlERUxJTkVTLCB0cnVlLAotCQkJCQkJZmFsc2UsIHRydWUsIG51bGwsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgRXhhbXBsZXMgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRFeGFtcGxlc1Byb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9Db250ZW50RWxlbWVudF9leGFtcGxlc19mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0NvbnRlbnRFbGVtZW50X2V4YW1wbGVzX2ZlYXR1cmUiLCAiX1VJX0NvbnRlbnRFbGVtZW50X3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuQ09OVEVOVF9FTEVNRU5UX19FWEFNUExFUywgdHJ1ZSwKLQkJCQkJCWZhbHNlLCB0cnVlLCBudWxsLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIEFzc2V0cyBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEFzc2V0c1Byb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9Db250ZW50RWxlbWVudF9hc3NldHNfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9Db250ZW50RWxlbWVudF9hc3NldHNfZmVhdHVyZSIsICJfVUlfQ29udGVudEVsZW1lbnRfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5DT05URU5UX0VMRU1FTlRfX0FTU0VUUywgdHJ1ZSwKLQkJCQkJCWZhbHNlLCB0cnVlLCBudWxsLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFRlcm1kZWZpbml0aW9uIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkVGVybWRlZmluaXRpb25Qcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfQ29udGVudEVsZW1lbnRfdGVybWRlZmluaXRpb25fZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9Db250ZW50RWxlbWVudF90ZXJtZGVmaW5pdGlvbl9mZWF0dXJlIiwgIl9VSV9Db250ZW50RWxlbWVudF90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkNPTlRFTlRfRUxFTUVOVF9fVEVSTURFRklOSVRJT04sCi0JCQkJCQl0cnVlLCBmYWxzZSwgdHJ1ZSwgbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBTdXBwb3J0aW5nIE1hdGVyaWFscyBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFN1cHBvcnRpbmdNYXRlcmlhbHNQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfQ29udGVudEVsZW1lbnRfc3VwcG9ydGluZ01hdGVyaWFsc19mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0NvbnRlbnRFbGVtZW50X3N1cHBvcnRpbmdNYXRlcmlhbHNfZmVhdHVyZSIsICJfVUlfQ29udGVudEVsZW1lbnRfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5DT05URU5UX0VMRU1FTlRfX1NVUFBPUlRJTkdfTUFURVJJQUxTLAotCQkJCQkJdHJ1ZSwgZmFsc2UsIHRydWUsIG51bGwsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoQ29udGVudEVsZW1lbnQpIG9iamVjdCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfQ29udGVudEVsZW1lbnRfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCWdldFN0cmluZygiX1VJX0NvbnRlbnRFbGVtZW50X3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCi0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChDb250ZW50RWxlbWVudC5jbGFzcykpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfRUxFTUVOVF9fVkFSSUFCSUxJVFlfVFlQRToKLQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24KLQkJCQkJLmdldE5vdGlmaWVyKCksIGZhbHNlLCB0cnVlKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4KLQkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKAotCQkJQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvQ29udGVudFBhY2thZ2VJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9Db250ZW50UGFja2FnZUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZWRhM2RkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9Db250ZW50UGFja2FnZUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjgyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50UGFja2FnZX0gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQ29udGVudFBhY2thZ2VJdGVtUHJvdmlkZXIgZXh0ZW5kcyBNZXRob2RQYWNrYWdlSXRlbVByb3ZpZGVyCi0JCWltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ29udGVudFBhY2thZ2VJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHNwZWNpZmllcyBob3cgdG8gaW1wbGVtZW50IHtAbGluayAjZ2V0Q2hpbGRyZW59IGFuZCBpcyB1c2VkIHRvIGRlZHVjZSBhbiBhcHByb3ByaWF0ZSBmZWF0dXJlIGZvciBhbgotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkFkZENvbW1hbmR9LCB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5SZW1vdmVDb21tYW5kfSBvcgotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLk1vdmVDb21tYW5kfSBpbiB7QGxpbmsgI2NyZWF0ZUNvbW1hbmR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBDb2xsZWN0aW9uPD8gZXh0ZW5kcyBFU3RydWN0dXJhbEZlYXR1cmU+IGdldENoaWxkcmVuRmVhdHVyZXMoCi0JCQlPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlbkZlYXR1cmVzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldENoaWxkcmVuRmVhdHVyZXMob2JqZWN0KTsKLQkJCWNoaWxkcmVuRmVhdHVyZXMKLQkJCQkJLmFkZChVbWFQYWNrYWdlLkxpdGVyYWxzLkNPTlRFTlRfUEFDS0FHRV9fQ09OVEVOVF9FTEVNRU5UUyk7Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuRmVhdHVyZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVTdHJ1Y3R1cmFsRmVhdHVyZSBnZXRDaGlsZEZlYXR1cmUoT2JqZWN0IG9iamVjdCwgT2JqZWN0IGNoaWxkKSB7Ci0JCS8vIENoZWNrIHRoZSB0eXBlIG9mIHRoZSBzcGVjaWZpZWQgY2hpbGQgb2JqZWN0IGFuZCByZXR1cm4gdGhlIHByb3BlciBmZWF0dXJlIHRvIHVzZSBmb3IKLQkJLy8gYWRkaW5nIChzZWUge0BsaW5rIEFkZENvbW1hbmR9KSBpdCBhcyBhIGNoaWxkLgotCi0JCXJldHVybiBzdXBlci5nZXRDaGlsZEZlYXR1cmUob2JqZWN0LCBjaGlsZCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIENvbnRlbnRQYWNrYWdlLmdpZi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKAotCQkJCSJmdWxsL29iajE2L0NvbnRlbnRQYWNrYWdlIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKENvbnRlbnRQYWNrYWdlKSBvYmplY3QpLmdldE5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX0NvbnRlbnRQYWNrYWdlX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQlnZXRTdHJpbmcoIl9VSV9Db250ZW50UGFja2FnZV90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoQ29udGVudFBhY2thZ2UuY2xhc3MpKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX1BBQ0tBR0VfX0NPTlRFTlRfRUxFTUVOVFM6Ci0JCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uCi0JCQkJCS5nZXROb3RpZmllcigpLCB0cnVlLCBmYWxzZSkpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuCi0JICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycygKLQkJCUNvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5DT05URU5UX1BBQ0tBR0VfX0NPTlRFTlRfRUxFTUVOVFMsCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlS2luZCgpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5DT05URU5UX1BBQ0tBR0VfX0NPTlRFTlRfRUxFTUVOVFMsCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlU3VwcG9ydGluZ01hdGVyaWFsKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcigKLQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkNPTlRFTlRfUEFDS0FHRV9fQ09OVEVOVF9FTEVNRU5UUywKLQkJCQlVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVDb25jZXB0KCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcigKLQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkNPTlRFTlRfUEFDS0FHRV9fQ09OVEVOVF9FTEVNRU5UUywKLQkJCQlVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVDaGVja2xpc3QoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKAotCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuQ09OVEVOVF9QQUNLQUdFX19DT05URU5UX0VMRU1FTlRTLAotCQkJCVVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUd1aWRlbGluZSgpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5DT05URU5UX1BBQ0tBR0VfX0NPTlRFTlRfRUxFTUVOVFMsCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRXhhbXBsZSgpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5DT05URU5UX1BBQ0tBR0VfX0NPTlRFTlRfRUxFTUVOVFMsCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUmV1c2FibGVBc3NldCgpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5DT05URU5UX1BBQ0tBR0VfX0NPTlRFTlRfRUxFTUVOVFMsCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlVGVybURlZmluaXRpb24oKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKAotCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuQ09OVEVOVF9QQUNLQUdFX19DT05URU5UX0VMRU1FTlRTLAotCQkJCVVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVdvcmtQcm9kdWN0KCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcigKLQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkNPTlRFTlRfUEFDS0FHRV9fQ09OVEVOVF9FTEVNRU5UUywKLQkJCQlVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVBcnRpZmFjdCgpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5DT05URU5UX1BBQ0tBR0VfX0NPTlRFTlRfRUxFTUVOVFMsCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUmVwb3J0KCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcigKLQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkNPTlRFTlRfUEFDS0FHRV9fQ09OVEVOVF9FTEVNRU5UUywKLQkJCQlVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVUZW1wbGF0ZSgpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5DT05URU5UX1BBQ0tBR0VfX0NPTlRFTlRfRUxFTUVOVFMsCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlVG9vbE1lbnRvcigpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5DT05URU5UX1BBQ0tBR0VfX0NPTlRFTlRfRUxFTUVOVFMsCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcigKLQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkNPTlRFTlRfUEFDS0FHRV9fQ09OVEVOVF9FTEVNRU5UUywKLQkJCQlVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVEZWxpdmVyYWJsZSgpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5DT05URU5UX1BBQ0tBR0VfX0NPTlRFTlRfRUxFTUVOVFMsCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlT3V0Y29tZSgpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5DT05URU5UX1BBQ0tBR0VfX0NPTlRFTlRfRUxFTUVOVFMsCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlV2hpdGVwYXBlcigpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5DT05URU5UX1BBQ0tBR0VfX0NPTlRFTlRfRUxFTUVOVFMsCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlVGFzaygpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5DT05URU5UX1BBQ0tBR0VfX0NPTlRFTlRfRUxFTUVOVFMsCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUm9sZSgpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5DT05URU5UX1BBQ0tBR0VfX0NPTlRFTlRfRUxFTUVOVFMsCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUm9sZVNldCgpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5DT05URU5UX1BBQ0tBR0VfX0NPTlRFTlRfRUxFTUVOVFMsCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRG9tYWluKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcigKLQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkNPTlRFTlRfUEFDS0FHRV9fQ09OVEVOVF9FTEVNRU5UUywKLQkJCQlVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVXb3JrUHJvZHVjdFR5cGUoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKAotCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuQ09OVEVOVF9QQUNLQUdFX19DT05URU5UX0VMRU1FTlRTLAotCQkJCVVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZURpc2NpcGxpbmVHcm91cGluZygpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5DT05URU5UX1BBQ0tBR0VfX0NPTlRFTlRfRUxFTUVOVFMsCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRGlzY2lwbGluZSgpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5DT05URU5UX1BBQ0tBR0VfX0NPTlRFTlRfRUxFTUVOVFMsCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUm9hZG1hcCgpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5DT05URU5UX1BBQ0tBR0VfX0NPTlRFTlRfRUxFTUVOVFMsCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlVG9vbCgpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5DT05URU5UX1BBQ0tBR0VfX0NPTlRFTlRfRUxFTUVOVFMsCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUm9sZVNldEdyb3VwaW5nKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcigKLQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkNPTlRFTlRfUEFDS0FHRV9fQ09OVEVOVF9FTEVNRU5UUywKLQkJCQlVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVDdXN0b21DYXRlZ29yeSgpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5DT05URU5UX1BBQ0tBR0VfX0NPTlRFTlRfRUxFTUVOVFMsCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUHJhY3RpY2UoKSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9Db3JlU2VtYW50aWNNb2RlbEJyaWRnZUl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0NvcmVTZW1hbnRpY01vZGVsQnJpZGdlSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3MGIxZTEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0NvcmVTZW1hbnRpY01vZGVsQnJpZGdlSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29yZVNlbWFudGljTW9kZWxCcmlkZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db3JlU2VtYW50aWNNb2RlbEJyaWRnZX0gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQ29yZVNlbWFudGljTW9kZWxCcmlkZ2VJdGVtUHJvdmlkZXIgZXh0ZW5kcwotCQlTZW1hbnRpY01vZGVsQnJpZGdlSXRlbVByb3ZpZGVyIGltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsCi0JCUlTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLAotCQlJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ29yZVNlbWFudGljTW9kZWxCcmlkZ2VJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJYWRkRWxlbWVudFByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgRWxlbWVudCBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEVsZW1lbnRQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfQ29yZVNlbWFudGljTW9kZWxCcmlkZ2VfZWxlbWVudF9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0NvcmVTZW1hbnRpY01vZGVsQnJpZGdlX2VsZW1lbnRfZmVhdHVyZSIsICJfVUlfQ29yZVNlbWFudGljTW9kZWxCcmlkZ2VfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5DT1JFX1NFTUFOVElDX01PREVMX0JSSURHRV9fRUxFTUVOVCwKLQkJCQkJCXRydWUsIGZhbHNlLCB0cnVlLCBudWxsLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIENvcmVTZW1hbnRpY01vZGVsQnJpZGdlLmdpZi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKAotCQkJCSJmdWxsL29iajE2L0NvcmVTZW1hbnRpY01vZGVsQnJpZGdlIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKENvcmVTZW1hbnRpY01vZGVsQnJpZGdlKSBvYmplY3QpLmdldE5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX0NvcmVTZW1hbnRpY01vZGVsQnJpZGdlX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQlnZXRTdHJpbmcoIl9VSV9Db3JlU2VtYW50aWNNb2RlbEJyaWRnZV90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4KLQkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKAotCQkJQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvQ3VzdG9tQ2F0ZWdvcnlJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9DdXN0b21DYXRlZ29yeUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDQ0NmZhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9DdXN0b21DYXRlZ29yeUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkN1c3RvbUNhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQ3VzdG9tQ2F0ZWdvcnl9IG9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEN1c3RvbUNhdGVnb3J5SXRlbVByb3ZpZGVyIGV4dGVuZHMgQ29udGVudENhdGVnb3J5SXRlbVByb3ZpZGVyCi0JCWltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ3VzdG9tQ2F0ZWdvcnlJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJYWRkQ2F0ZWdvcml6ZWRFbGVtZW50c1Byb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkU3ViQ2F0ZWdvcmllc1Byb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgQ2F0ZWdvcml6ZWQgRWxlbWVudHMgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRDYXRlZ29yaXplZEVsZW1lbnRzUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX0N1c3RvbUNhdGVnb3J5X2NhdGVnb3JpemVkRWxlbWVudHNfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9DdXN0b21DYXRlZ29yeV9jYXRlZ29yaXplZEVsZW1lbnRzX2ZlYXR1cmUiLCAiX1VJX0N1c3RvbUNhdGVnb3J5X3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuQ1VTVE9NX0NBVEVHT1JZX19DQVRFR09SSVpFRF9FTEVNRU5UUywKLQkJCQkJCXRydWUsIGZhbHNlLCB0cnVlLCBudWxsLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFN1YiBDYXRlZ29yaWVzIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkU3ViQ2F0ZWdvcmllc1Byb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9DdXN0b21DYXRlZ29yeV9zdWJDYXRlZ29yaWVzX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfQ3VzdG9tQ2F0ZWdvcnlfc3ViQ2F0ZWdvcmllc19mZWF0dXJlIiwgIl9VSV9DdXN0b21DYXRlZ29yeV90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkNVU1RPTV9DQVRFR09SWV9fU1VCX0NBVEVHT1JJRVMsCi0JCQkJCQl0cnVlLCBmYWxzZSwgdHJ1ZSwgbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBDdXN0b21DYXRlZ29yeS5naWYuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgKLQkJCQkiZnVsbC9vYmoxNi9DdXN0b21DYXRlZ29yeSIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChDdXN0b21DYXRlZ29yeSkgb2JqZWN0KS5nZXROYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9DdXN0b21DYXRlZ29yeV90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJZ2V0U3RyaW5nKCJfVUlfQ3VzdG9tQ2F0ZWdvcnlfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuCi0JICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycygKLQkJCUNvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0RlbGl2ZXJhYmxlRGVzY3JpcHRpb25JdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9EZWxpdmVyYWJsZURlc2NyaXB0aW9uSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2MjRhMGQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0RlbGl2ZXJhYmxlRGVzY3JpcHRpb25JdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyYWJsZURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcmFibGVEZXNjcmlwdGlvbn0gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRGVsaXZlcmFibGVEZXNjcmlwdGlvbkl0ZW1Qcm92aWRlciBleHRlbmRzCi0JCVdvcmtQcm9kdWN0RGVzY3JpcHRpb25JdGVtUHJvdmlkZXIgaW1wbGVtZW50cwotCQlJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEZWxpdmVyYWJsZURlc2NyaXB0aW9uSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCWFkZEV4dGVybmFsRGVzY3JpcHRpb25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZFBhY2thZ2luZ0d1aWRhbmNlUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBFeHRlcm5hbCBEZXNjcmlwdGlvbiBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEV4dGVybmFsRGVzY3JpcHRpb25Qcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfRGVsaXZlcmFibGVEZXNjcmlwdGlvbl9leHRlcm5hbERlc2NyaXB0aW9uX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfRGVsaXZlcmFibGVEZXNjcmlwdGlvbl9leHRlcm5hbERlc2NyaXB0aW9uX2ZlYXR1cmUiLCAiX1VJX0RlbGl2ZXJhYmxlRGVzY3JpcHRpb25fdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5ERUxJVkVSQUJMRV9ERVNDUklQVElPTl9fRVhURVJOQUxfREVTQ1JJUFRJT04sCi0JCQkJCQl0cnVlLCBmYWxzZSwgZmFsc2UsCi0JCQkJCQlJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgUGFja2FnaW5nIEd1aWRhbmNlIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkUGFja2FnaW5nR3VpZGFuY2VQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfRGVsaXZlcmFibGVEZXNjcmlwdGlvbl9wYWNrYWdpbmdHdWlkYW5jZV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0RlbGl2ZXJhYmxlRGVzY3JpcHRpb25fcGFja2FnaW5nR3VpZGFuY2VfZmVhdHVyZSIsICJfVUlfRGVsaXZlcmFibGVEZXNjcmlwdGlvbl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkRFTElWRVJBQkxFX0RFU0NSSVBUSU9OX19QQUNLQUdJTkdfR1VJREFOQ0UsCi0JCQkJCQl0cnVlLCBmYWxzZSwgZmFsc2UsCi0JCQkJCQlJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgRGVsaXZlcmFibGVEZXNjcmlwdGlvbi5naWYuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgKLQkJCQkiZnVsbC9vYmoxNi9EZWxpdmVyYWJsZURlc2NyaXB0aW9uIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKERlbGl2ZXJhYmxlRGVzY3JpcHRpb24pIG9iamVjdCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfRGVsaXZlcmFibGVEZXNjcmlwdGlvbl90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJZ2V0U3RyaW5nKCJfVUlfRGVsaXZlcmFibGVEZXNjcmlwdGlvbl90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoRGVsaXZlcmFibGVEZXNjcmlwdGlvbi5jbGFzcykpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJBQkxFX0RFU0NSSVBUSU9OX19FWFRFUk5BTF9ERVNDUklQVElPTjoKLQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJBQkxFX0RFU0NSSVBUSU9OX19QQUNLQUdJTkdfR1VJREFOQ0U6Ci0JCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uCi0JCQkJCS5nZXROb3RpZmllcigpLCBmYWxzZSwgdHJ1ZSkpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuCi0JICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycygKLQkJCUNvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0RlbGl2ZXJhYmxlSXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvRGVsaXZlcmFibGVJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2FiMThlOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvRGVsaXZlcmFibGVJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJhYmxlfSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEZWxpdmVyYWJsZUl0ZW1Qcm92aWRlciBleHRlbmRzIFdvcmtQcm9kdWN0SXRlbVByb3ZpZGVyIGltcGxlbWVudHMKLQkJSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRGVsaXZlcmFibGVJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJYWRkRGVsaXZlcmVkV29ya1Byb2R1Y3RzUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBEZWxpdmVyZWQgV29yayBQcm9kdWN0cyBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZERlbGl2ZXJlZFdvcmtQcm9kdWN0c1Byb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9EZWxpdmVyYWJsZV9kZWxpdmVyZWRXb3JrUHJvZHVjdHNfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9EZWxpdmVyYWJsZV9kZWxpdmVyZWRXb3JrUHJvZHVjdHNfZmVhdHVyZSIsICJfVUlfRGVsaXZlcmFibGVfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5ERUxJVkVSQUJMRV9fREVMSVZFUkVEX1dPUktfUFJPRFVDVFMsCi0JCQkJCQl0cnVlLCBmYWxzZSwgdHJ1ZSwgbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBEZWxpdmVyYWJsZS5naWYuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgKLQkJCQkiZnVsbC9vYmoxNi9EZWxpdmVyYWJsZSIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChEZWxpdmVyYWJsZSkgb2JqZWN0KS5nZXROYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9EZWxpdmVyYWJsZV90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJZ2V0U3RyaW5nKCJfVUlfRGVsaXZlcmFibGVfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuCi0JICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycygKLQkJCUNvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uSXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25JdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTNjNzBhZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25JdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9ufSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbkl0ZW1Qcm92aWRlciBleHRlbmRzCi0JCVByb2Nlc3NEZXNjcmlwdGlvbkl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLAotCQlJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCWFkZFNjYWxlUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRQcm9qZWN0Q2hhcmFjdGVyaXN0aWNzUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRSaXNrTGV2ZWxQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZEVzdGltYXRpbmdUZWNobmlxdWVQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZFByb2plY3RNZW1iZXJFeHBlcnRpc2VQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZFR5cGVPZkNvbnRyYWN0UHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBTY2FsZSBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFNjYWxlUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX3NjYWxlX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fc2NhbGVfZmVhdHVyZSIsICJfVUlfRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5ERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19TQ0FMRSwKLQkJCQkJCXRydWUsIGZhbHNlLCBmYWxzZSwKLQkJCQkJCUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBQcm9qZWN0IENoYXJhY3RlcmlzdGljcyBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFByb2plY3RDaGFyYWN0ZXJpc3RpY3NQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fcHJvamVjdENoYXJhY3RlcmlzdGljc19mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX3Byb2plY3RDaGFyYWN0ZXJpc3RpY3NfZmVhdHVyZSIsICJfVUlfRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5ERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19QUk9KRUNUX0NIQVJBQ1RFUklTVElDUywKLQkJCQkJCXRydWUsIGZhbHNlLCBmYWxzZSwKLQkJCQkJCUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBSaXNrIExldmVsIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkUmlza0xldmVsUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX3Jpc2tMZXZlbF9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX3Jpc2tMZXZlbF9mZWF0dXJlIiwgIl9VSV9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkRFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1JJU0tfTEVWRUwsCi0JCQkJCQl0cnVlLCBmYWxzZSwgZmFsc2UsCi0JCQkJCQlJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgRXN0aW1hdGluZyBUZWNobmlxdWUgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRFc3RpbWF0aW5nVGVjaG5pcXVlUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX2VzdGltYXRpbmdUZWNobmlxdWVfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl9lc3RpbWF0aW5nVGVjaG5pcXVlX2ZlYXR1cmUiLCAiX1VJX0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fRVNUSU1BVElOR19URUNITklRVUUsCi0JCQkJCQl0cnVlLCBmYWxzZSwgZmFsc2UsCi0JCQkJCQlJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgUHJvamVjdCBNZW1iZXIgRXhwZXJ0aXNlIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkUHJvamVjdE1lbWJlckV4cGVydGlzZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl9wcm9qZWN0TWVtYmVyRXhwZXJ0aXNlX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fcHJvamVjdE1lbWJlckV4cGVydGlzZV9mZWF0dXJlIiwgIl9VSV9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkRFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1BST0pFQ1RfTUVNQkVSX0VYUEVSVElTRSwKLQkJCQkJCXRydWUsIGZhbHNlLCBmYWxzZSwKLQkJCQkJCUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBUeXBlIE9mIENvbnRyYWN0IGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkVHlwZU9mQ29udHJhY3RQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fdHlwZU9mQ29udHJhY3RfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl90eXBlT2ZDb250cmFjdF9mZWF0dXJlIiwgIl9VSV9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkRFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1RZUEVfT0ZfQ09OVFJBQ1QsCi0JCQkJCQl0cnVlLCBmYWxzZSwgZmFsc2UsCi0JCQkJCQlJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24uZ2lmLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoCi0JCQkJImZ1bGwvb2JqMTYvRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24iKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24pIG9iamVjdCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCWdldFN0cmluZygiX1VJX0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCi0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChEZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbi5jbGFzcykpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1NDQUxFOgotCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fUFJPSkVDVF9DSEFSQUNURVJJU1RJQ1M6Ci0JCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19SSVNLX0xFVkVMOgotCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fRVNUSU1BVElOR19URUNITklRVUU6Ci0JCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19QUk9KRUNUX01FTUJFUl9FWFBFUlRJU0U6Ci0JCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19UWVBFX09GX0NPTlRSQUNUOgotCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbgotCQkJCQkuZ2V0Tm90aWZpZXIoKSwgZmFsc2UsIHRydWUpKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbgotCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoCi0JCQlDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9EZWxpdmVyeVByb2Nlc3NJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9EZWxpdmVyeVByb2Nlc3NJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzJmODhkOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvRGVsaXZlcnlQcm9jZXNzSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcnlQcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcnlQcm9jZXNzfSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEZWxpdmVyeVByb2Nlc3NJdGVtUHJvdmlkZXIgZXh0ZW5kcyBQcm9jZXNzSXRlbVByb3ZpZGVyIGltcGxlbWVudHMKLQkJSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRGVsaXZlcnlQcm9jZXNzSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCWFkZEVkdWNhdGlvbk1hdGVyaWFsc1Byb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkQ29tbXVuaWNhdGlvbnNNYXRlcmlhbHNQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIEVkdWNhdGlvbiBNYXRlcmlhbHMgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRFZHVjYXRpb25NYXRlcmlhbHNQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfRGVsaXZlcnlQcm9jZXNzX2VkdWNhdGlvbk1hdGVyaWFsc19mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0RlbGl2ZXJ5UHJvY2Vzc19lZHVjYXRpb25NYXRlcmlhbHNfZmVhdHVyZSIsICJfVUlfRGVsaXZlcnlQcm9jZXNzX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuREVMSVZFUllfUFJPQ0VTU19fRURVQ0FUSU9OX01BVEVSSUFMUywKLQkJCQkJCXRydWUsIGZhbHNlLCB0cnVlLCBudWxsLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIENvbW11bmljYXRpb25zIE1hdGVyaWFscyBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZENvbW11bmljYXRpb25zTWF0ZXJpYWxzUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX0RlbGl2ZXJ5UHJvY2Vzc19jb21tdW5pY2F0aW9uc01hdGVyaWFsc19mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0RlbGl2ZXJ5UHJvY2Vzc19jb21tdW5pY2F0aW9uc01hdGVyaWFsc19mZWF0dXJlIiwgIl9VSV9EZWxpdmVyeVByb2Nlc3NfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5ERUxJVkVSWV9QUk9DRVNTX19DT01NVU5JQ0FUSU9OU19NQVRFUklBTFMsCi0JCQkJCQl0cnVlLCBmYWxzZSwgdHJ1ZSwgbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBEZWxpdmVyeVByb2Nlc3MuZ2lmLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoCi0JCQkJImZ1bGwvb2JqMTYvRGVsaXZlcnlQcm9jZXNzIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKERlbGl2ZXJ5UHJvY2Vzcykgb2JqZWN0KS5nZXROYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9EZWxpdmVyeVByb2Nlc3NfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCWdldFN0cmluZygiX1VJX0RlbGl2ZXJ5UHJvY2Vzc190eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4KLQkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKAotCQkJQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNyZWF0ZUNoaWxkQ29tbWFuZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRDcmVhdGVDaGlsZFRleHQoT2JqZWN0IG93bmVyLCBPYmplY3QgZmVhdHVyZSwKLQkJCU9iamVjdCBjaGlsZCwgQ29sbGVjdGlvbjw/PiBzZWxlY3Rpb24pIHsKLQkJT2JqZWN0IGNoaWxkRmVhdHVyZSA9IGZlYXR1cmU7Ci0JCU9iamVjdCBjaGlsZE9iamVjdCA9IGNoaWxkOwotCi0JCWJvb2xlYW4gcXVhbGlmeSA9IGNoaWxkRmVhdHVyZSA9PSBVbWFQYWNrYWdlLkxpdGVyYWxzLk1FVEhPRF9FTEVNRU5UX19PV05FRF9SVUxFUwotCQkJCXx8IGNoaWxkRmVhdHVyZSA9PSBVbWFQYWNrYWdlLkxpdGVyYWxzLldPUktfREVGSU5JVElPTl9fUFJFQ09ORElUSU9OCi0JCQkJfHwgY2hpbGRGZWF0dXJlID09IFVtYVBhY2thZ2UuTGl0ZXJhbHMuV09SS19ERUZJTklUSU9OX19QT1NUQ09ORElUSU9OOwotCi0JCWlmIChxdWFsaWZ5KSB7Ci0JCQlyZXR1cm4gZ2V0U3RyaW5nKCJfVUlfQ3JlYXRlQ2hpbGRfdGV4dDIiLCAvLyROT04tTkxTLTEkCi0JCQkJCW5ldyBPYmplY3RbXSB7IGdldFR5cGVUZXh0KGNoaWxkT2JqZWN0KSwKLQkJCQkJCQlnZXRGZWF0dXJlVGV4dChjaGlsZEZlYXR1cmUpLCBnZXRUeXBlVGV4dChvd25lcikgfSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldENyZWF0ZUNoaWxkVGV4dChvd25lciwgZmVhdHVyZSwgY2hpbGQsIHNlbGVjdGlvbik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0Rlc2NyaWJhYmxlRWxlbWVudEl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0Rlc2NyaWJhYmxlRWxlbWVudEl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZDQxNWQ4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9EZXNjcmliYWJsZUVsZW1lbnRJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaWJhYmxlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmliYWJsZUVsZW1lbnR9IG9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERlc2NyaWJhYmxlRWxlbWVudEl0ZW1Qcm92aWRlciBleHRlbmRzIE1ldGhvZEVsZW1lbnRJdGVtUHJvdmlkZXIKLQkJaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEZXNjcmliYWJsZUVsZW1lbnRJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJYWRkSXNBYnN0cmFjdFByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkU2hhcGVpY29uUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGROb2RlaWNvblByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgSXMgQWJzdHJhY3QgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRJc0Fic3RyYWN0UHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX0NsYXNzaWZpZXJfaXNBYnN0cmFjdF9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0NsYXNzaWZpZXJfaXNBYnN0cmFjdF9mZWF0dXJlIiwgIl9VSV9DbGFzc2lmaWVyX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuQ0xBU1NJRklFUl9fSVNfQUJTVFJBQ1QsIHRydWUsCi0JCQkJCQlmYWxzZSwgZmFsc2UsCi0JCQkJCQlJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgU2hhcGVpY29uIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkU2hhcGVpY29uUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX0Rlc2NyaWJhYmxlRWxlbWVudF9zaGFwZWljb25fZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9EZXNjcmliYWJsZUVsZW1lbnRfc2hhcGVpY29uX2ZlYXR1cmUiLCAiX1VJX0Rlc2NyaWJhYmxlRWxlbWVudF90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkRFU0NSSUJBQkxFX0VMRU1FTlRfX1NIQVBFSUNPTiwKLQkJCQkJCXRydWUsIGZhbHNlLCBmYWxzZSwKLQkJCQkJCUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBOb2RlaWNvbiBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZE5vZGVpY29uUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX0Rlc2NyaWJhYmxlRWxlbWVudF9ub2RlaWNvbl9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0Rlc2NyaWJhYmxlRWxlbWVudF9ub2RlaWNvbl9mZWF0dXJlIiwgIl9VSV9EZXNjcmliYWJsZUVsZW1lbnRfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5ERVNDUklCQUJMRV9FTEVNRU5UX19OT0RFSUNPTiwKLQkJCQkJCXRydWUsIGZhbHNlLCBmYWxzZSwKLQkJCQkJCUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgc3BlY2lmaWVzIGhvdyB0byBpbXBsZW1lbnQge0BsaW5rICNnZXRDaGlsZHJlbn0gYW5kIGlzIHVzZWQgdG8gZGVkdWNlIGFuIGFwcHJvcHJpYXRlIGZlYXR1cmUgZm9yIGFuCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQWRkQ29tbWFuZH0sIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLlJlbW92ZUNvbW1hbmR9IG9yCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuTW92ZUNvbW1hbmR9IGluIHtAbGluayAjY3JlYXRlQ29tbWFuZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIENvbGxlY3Rpb248PyBleHRlbmRzIEVTdHJ1Y3R1cmFsRmVhdHVyZT4gZ2V0Q2hpbGRyZW5GZWF0dXJlcygKLQkJCU9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGNoaWxkcmVuRmVhdHVyZXMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0Q2hpbGRyZW5GZWF0dXJlcyhvYmplY3QpOwotCQkJY2hpbGRyZW5GZWF0dXJlcwotCQkJCQkuYWRkKFVtYVBhY2thZ2UuTGl0ZXJhbHMuREVTQ1JJQkFCTEVfRUxFTUVOVF9fUFJFU0VOVEFUSU9OKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW5GZWF0dXJlczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRVN0cnVjdHVyYWxGZWF0dXJlIGdldENoaWxkRmVhdHVyZShPYmplY3Qgb2JqZWN0LCBPYmplY3QgY2hpbGQpIHsKLQkJLy8gQ2hlY2sgdGhlIHR5cGUgb2YgdGhlIHNwZWNpZmllZCBjaGlsZCBvYmplY3QgYW5kIHJldHVybiB0aGUgcHJvcGVyIGZlYXR1cmUgdG8gdXNlIGZvcgotCQkvLyBhZGRpbmcgKHNlZSB7QGxpbmsgQWRkQ29tbWFuZH0pIGl0IGFzIGEgY2hpbGQuCi0KLQkJcmV0dXJuIHN1cGVyLmdldENoaWxkRmVhdHVyZShvYmplY3QsIGNoaWxkKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoRGVzY3JpYmFibGVFbGVtZW50KSBvYmplY3QpLmdldE5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX0Rlc2NyaWJhYmxlRWxlbWVudF90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJZ2V0U3RyaW5nKCJfVUlfRGVzY3JpYmFibGVFbGVtZW50X3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCi0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChEZXNjcmliYWJsZUVsZW1lbnQuY2xhc3MpKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ERVNDUklCQUJMRV9FTEVNRU5UX19JU19BQlNUUkFDVDoKLQkJY2FzZSBVbWFQYWNrYWdlLkRFU0NSSUJBQkxFX0VMRU1FTlRfX1NIQVBFSUNPTjoKLQkJY2FzZSBVbWFQYWNrYWdlLkRFU0NSSUJBQkxFX0VMRU1FTlRfX05PREVJQ09OOgotCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbgotCQkJCQkuZ2V0Tm90aWZpZXIoKSwgZmFsc2UsIHRydWUpKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkRFU0NSSUJBQkxFX0VMRU1FTlRfX1BSRVNFTlRBVElPTjoKLQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24KLQkJCQkJLmdldE5vdGlmaWVyKCksIHRydWUsIGZhbHNlKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4KLQkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKAotCQkJQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcigKLQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkRFU0NSSUJBQkxFX0VMRU1FTlRfX1BSRVNFTlRBVElPTiwKLQkJCQlVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVDb250ZW50RGVzY3JpcHRpb24oKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKAotCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuREVTQ1JJQkFCTEVfRUxFTUVOVF9fUFJFU0VOVEFUSU9OLAotCQkJCVVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVdvcmtQcm9kdWN0RGVzY3JpcHRpb24oKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKAotCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuREVTQ1JJQkFCTEVfRUxFTUVOVF9fUFJFU0VOVEFUSU9OLAotCQkJCVVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUFydGlmYWN0RGVzY3JpcHRpb24oKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKAotCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuREVTQ1JJQkFCTEVfRUxFTUVOVF9fUFJFU0VOVEFUSU9OLAotCQkJCVVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZURlbGl2ZXJhYmxlRGVzY3JpcHRpb24oKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKAotCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuREVTQ1JJQkFCTEVfRUxFTUVOVF9fUFJFU0VOVEFUSU9OLAotCQkJCVVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVJvbGVEZXNjcmlwdGlvbigpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5ERVNDUklCQUJMRV9FTEVNRU5UX19QUkVTRU5UQVRJT04sCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlVGFza0Rlc2NyaXB0aW9uKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcigKLQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkRFU0NSSUJBQkxFX0VMRU1FTlRfX1BSRVNFTlRBVElPTiwKLQkJCQlVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVHdWlkYW5jZURlc2NyaXB0aW9uKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcigKLQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkRFU0NSSUJBQkxFX0VMRU1FTlRfX1BSRVNFTlRBVElPTiwKLQkJCQlVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQcmFjdGljZURlc2NyaXB0aW9uKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcigKLQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkRFU0NSSUJBQkxFX0VMRU1FTlRfX1BSRVNFTlRBVElPTiwKLQkJCQlVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24oKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKAotCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuREVTQ1JJQkFCTEVfRUxFTUVOVF9fUFJFU0VOVEFUSU9OLAotCQkJCVVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUFjdGl2aXR5RGVzY3JpcHRpb24oKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKAotCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuREVTQ1JJQkFCTEVfRUxFTUVOVF9fUFJFU0VOVEFUSU9OLAotCQkJCVVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVByb2Nlc3NEZXNjcmlwdGlvbigpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5ERVNDUklCQUJMRV9FTEVNRU5UX19QUkVTRU5UQVRJT04sCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24oKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKAotCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuREVTQ1JJQkFCTEVfRUxFTUVOVF9fUFJFU0VOVEFUSU9OLAotCQkJCVVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZURlc2NyaXB0b3JEZXNjcmlwdGlvbigpKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0Rlc2NyaXB0b3JEZXNjcmlwdGlvbkl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0Rlc2NyaXB0b3JEZXNjcmlwdGlvbkl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MzE0M2Y0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9EZXNjcmlwdG9yRGVzY3JpcHRpb25JdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmlwdG9yRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmlwdG9yRGVzY3JpcHRpb259IG9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERlc2NyaXB0b3JEZXNjcmlwdGlvbkl0ZW1Qcm92aWRlciBleHRlbmRzCi0JCUJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbkl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzCi0JCUlFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERlc2NyaXB0b3JEZXNjcmlwdGlvbkl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIExpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlhZGRSZWZpbmVkRGVzY3JpcHRpb25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFJlZmluZWQgRGVzY3JpcHRpb24gZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRSZWZpbmVkRGVzY3JpcHRpb25Qcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfRGVzY3JpcHRvckRlc2NyaXB0aW9uX3JlZmluZWREZXNjcmlwdGlvbl9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0Rlc2NyaXB0b3JEZXNjcmlwdGlvbl9yZWZpbmVkRGVzY3JpcHRpb25fZmVhdHVyZSIsICJfVUlfRGVzY3JpcHRvckRlc2NyaXB0aW9uX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuREVTQ1JJUFRPUl9ERVNDUklQVElPTl9fUkVGSU5FRF9ERVNDUklQVElPTiwKLQkJCQkJCXRydWUsIGZhbHNlLCBmYWxzZSwKLQkJCQkJCUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBEZXNjcmlwdG9yRGVzY3JpcHRpb24uZ2lmLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoCi0JCQkJImZ1bGwvb2JqMTYvRGVzY3JpcHRvckRlc2NyaXB0aW9uIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKERlc2NyaXB0b3JEZXNjcmlwdGlvbikgb2JqZWN0KS5nZXROYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9EZXNjcmlwdG9yRGVzY3JpcHRpb25fdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCWdldFN0cmluZygiX1VJX0Rlc2NyaXB0b3JEZXNjcmlwdGlvbl90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoRGVzY3JpcHRvckRlc2NyaXB0aW9uLmNsYXNzKSkgewotCQljYXNlIFVtYVBhY2thZ2UuREVTQ1JJUFRPUl9ERVNDUklQVElPTl9fUkVGSU5FRF9ERVNDUklQVElPTjoKLQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24KLQkJCQkJLmdldE5vdGlmaWVyKCksIGZhbHNlLCB0cnVlKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4KLQkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKAotCQkJQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvRGVzY3JpcHRvckl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0Rlc2NyaXB0b3JJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDgxYWFjNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvRGVzY3JpcHRvckl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmlwdG9yfSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEZXNjcmlwdG9ySXRlbVByb3ZpZGVyIGV4dGVuZHMgQnJlYWtkb3duRWxlbWVudEl0ZW1Qcm92aWRlcgotCQlpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERlc2NyaXB0b3JJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJYWRkSXNTeW5jaHJvbml6ZWRXaXRoU291cmNlUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBJcyBTeW5jaHJvbml6ZWQgV2l0aCBTb3VyY2UgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRJc1N5bmNocm9uaXplZFdpdGhTb3VyY2VQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfRGVzY3JpcHRvcl9pc1N5bmNocm9uaXplZFdpdGhTb3VyY2VfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9EZXNjcmlwdG9yX2lzU3luY2hyb25pemVkV2l0aFNvdXJjZV9mZWF0dXJlIiwgIl9VSV9EZXNjcmlwdG9yX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuREVTQ1JJUFRPUl9fSVNfU1lOQ0hST05JWkVEX1dJVEhfU09VUkNFLAotCQkJCQkJdHJ1ZSwgZmFsc2UsIGZhbHNlLAotCQkJCQkJSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKERlc2NyaXB0b3IpIG9iamVjdCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfRGVzY3JpcHRvcl90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJZ2V0U3RyaW5nKCJfVUlfRGVzY3JpcHRvcl90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoRGVzY3JpcHRvci5jbGFzcykpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkRFU0NSSVBUT1JfX0lTX1NZTkNIUk9OSVpFRF9XSVRIX1NPVVJDRToKLQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24KLQkJCQkJLmdldE5vdGlmaWVyKCksIGZhbHNlLCB0cnVlKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4KLQkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKAotCQkJQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvRGlhZ3JhbUVsZW1lbnRJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9EaWFncmFtRWxlbWVudEl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYTFmMjFhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9EaWFncmFtRWxlbWVudEl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbUVsZW1lbnR9IG9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERpYWdyYW1FbGVtZW50SXRlbVByb3ZpZGVyIGV4dGVuZHMgTWV0aG9kRWxlbWVudEl0ZW1Qcm92aWRlcgotCQlpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERpYWdyYW1FbGVtZW50SXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCWFkZElzVmlzaWJsZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkUmVmZXJlbmNlUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBJcyBWaXNpYmxlIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkSXNWaXNpYmxlUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX0RpYWdyYW1FbGVtZW50X2lzVmlzaWJsZV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0RpYWdyYW1FbGVtZW50X2lzVmlzaWJsZV9mZWF0dXJlIiwgIl9VSV9EaWFncmFtRWxlbWVudF90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkRJQUdSQU1fRUxFTUVOVF9fSVNfVklTSUJMRSwgdHJ1ZSwKLQkJCQkJCWZhbHNlLCBmYWxzZSwKLQkJCQkJCUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBSZWZlcmVuY2UgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRSZWZlcmVuY2VQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfRGlhZ3JhbUVsZW1lbnRfcmVmZXJlbmNlX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfRGlhZ3JhbUVsZW1lbnRfcmVmZXJlbmNlX2ZlYXR1cmUiLCAiX1VJX0RpYWdyYW1FbGVtZW50X3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuRElBR1JBTV9FTEVNRU5UX19SRUZFUkVOQ0UsIHRydWUsCi0JCQkJCQlmYWxzZSwgdHJ1ZSwgbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgc3BlY2lmaWVzIGhvdyB0byBpbXBsZW1lbnQge0BsaW5rICNnZXRDaGlsZHJlbn0gYW5kIGlzIHVzZWQgdG8gZGVkdWNlIGFuIGFwcHJvcHJpYXRlIGZlYXR1cmUgZm9yIGFuCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQWRkQ29tbWFuZH0sIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLlJlbW92ZUNvbW1hbmR9IG9yCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuTW92ZUNvbW1hbmR9IGluIHtAbGluayAjY3JlYXRlQ29tbWFuZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIENvbGxlY3Rpb248PyBleHRlbmRzIEVTdHJ1Y3R1cmFsRmVhdHVyZT4gZ2V0Q2hpbGRyZW5GZWF0dXJlcygKLQkJCU9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGNoaWxkcmVuRmVhdHVyZXMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0Q2hpbGRyZW5GZWF0dXJlcyhvYmplY3QpOwotCQkJY2hpbGRyZW5GZWF0dXJlcy5hZGQoVW1hUGFja2FnZS5MaXRlcmFscy5ESUFHUkFNX0VMRU1FTlRfX1BST1BFUlRZKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW5GZWF0dXJlczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRVN0cnVjdHVyYWxGZWF0dXJlIGdldENoaWxkRmVhdHVyZShPYmplY3Qgb2JqZWN0LCBPYmplY3QgY2hpbGQpIHsKLQkJLy8gQ2hlY2sgdGhlIHR5cGUgb2YgdGhlIHNwZWNpZmllZCBjaGlsZCBvYmplY3QgYW5kIHJldHVybiB0aGUgcHJvcGVyIGZlYXR1cmUgdG8gdXNlIGZvcgotCQkvLyBhZGRpbmcgKHNlZSB7QGxpbmsgQWRkQ29tbWFuZH0pIGl0IGFzIGEgY2hpbGQuCi0KLQkJcmV0dXJuIHN1cGVyLmdldENoaWxkRmVhdHVyZShvYmplY3QsIGNoaWxkKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoRGlhZ3JhbUVsZW1lbnQpIG9iamVjdCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfRGlhZ3JhbUVsZW1lbnRfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCWdldFN0cmluZygiX1VJX0RpYWdyYW1FbGVtZW50X3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCi0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChEaWFncmFtRWxlbWVudC5jbGFzcykpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkRJQUdSQU1fRUxFTUVOVF9fSVNfVklTSUJMRToKLQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24KLQkJCQkJLmdldE5vdGlmaWVyKCksIGZhbHNlLCB0cnVlKSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5ESUFHUkFNX0VMRU1FTlRfX1BST1BFUlRZOgotCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbgotCQkJCQkuZ2V0Tm90aWZpZXIoKSwgdHJ1ZSwgZmFsc2UpKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbgotCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoCi0JCQlDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKAotCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuRElBR1JBTV9FTEVNRU5UX19QUk9QRVJUWSwKLQkJCQlVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQcm9wZXJ0eSgpKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0RpYWdyYW1JdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9EaWFncmFtSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiY2RjZGEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0RpYWdyYW1JdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbX0gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRGlhZ3JhbUl0ZW1Qcm92aWRlciBleHRlbmRzIEdyYXBoTm9kZUl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzCi0JCUlFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERpYWdyYW1JdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJYWRkRGlhZ3JhbUxpbmtQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZFpvb21Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZFZpZXdwb2ludFByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgWm9vbSBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFpvb21Qcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfRGlhZ3JhbV96b29tX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfRGlhZ3JhbV96b29tX2ZlYXR1cmUiLCAiX1VJX0RpYWdyYW1fdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5ESUFHUkFNX19aT09NLCB0cnVlLCBmYWxzZSwgZmFsc2UsCi0JCQkJCQlJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgVmlld3BvaW50IGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkVmlld3BvaW50UHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX0RpYWdyYW1fdmlld3BvaW50X2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfRGlhZ3JhbV92aWV3cG9pbnRfZmVhdHVyZSIsICJfVUlfRGlhZ3JhbV90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkRJQUdSQU1fX1ZJRVdQT0lOVCwgdHJ1ZSwgZmFsc2UsCi0JCQkJCQl0cnVlLCBudWxsLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIERpYWdyYW0gTGluayBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZERpYWdyYW1MaW5rUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX0RpYWdyYW1fZGlhZ3JhbUxpbmtfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9EaWFncmFtX2RpYWdyYW1MaW5rX2ZlYXR1cmUiLCAiX1VJX0RpYWdyYW1fdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5ESUFHUkFNX19ESUFHUkFNX0xJTkssIHRydWUsIGZhbHNlLAotCQkJCQkJdHJ1ZSwgbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgc3BlY2lmaWVzIGhvdyB0byBpbXBsZW1lbnQge0BsaW5rICNnZXRDaGlsZHJlbn0gYW5kIGlzIHVzZWQgdG8gZGVkdWNlIGFuIGFwcHJvcHJpYXRlIGZlYXR1cmUgZm9yIGFuCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQWRkQ29tbWFuZH0sIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLlJlbW92ZUNvbW1hbmR9IG9yCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuTW92ZUNvbW1hbmR9IGluIHtAbGluayAjY3JlYXRlQ29tbWFuZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIENvbGxlY3Rpb248PyBleHRlbmRzIEVTdHJ1Y3R1cmFsRmVhdHVyZT4gZ2V0Q2hpbGRyZW5GZWF0dXJlcygKLQkJCU9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGNoaWxkcmVuRmVhdHVyZXMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0Q2hpbGRyZW5GZWF0dXJlcyhvYmplY3QpOwotCQkJY2hpbGRyZW5GZWF0dXJlcy5hZGQoVW1hUGFja2FnZS5MaXRlcmFscy5ESUFHUkFNX19OQU1FU1BBQ0UpOwotCQl9Ci0JCXJldHVybiBjaGlsZHJlbkZlYXR1cmVzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFU3RydWN0dXJhbEZlYXR1cmUgZ2V0Q2hpbGRGZWF0dXJlKE9iamVjdCBvYmplY3QsIE9iamVjdCBjaGlsZCkgewotCQkvLyBDaGVjayB0aGUgdHlwZSBvZiB0aGUgc3BlY2lmaWVkIGNoaWxkIG9iamVjdCBhbmQgcmV0dXJuIHRoZSBwcm9wZXIgZmVhdHVyZSB0byB1c2UgZm9yCi0JCS8vIGFkZGluZyAoc2VlIHtAbGluayBBZGRDb21tYW5kfSkgaXQgYXMgYSBjaGlsZC4KLQotCQlyZXR1cm4gc3VwZXIuZ2V0Q2hpbGRGZWF0dXJlKG9iamVjdCwgY2hpbGQpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBEaWFncmFtLmdpZi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKAotCQkJCSJmdWxsL29iajE2L0RpYWdyYW0iKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoRGlhZ3JhbSkgb2JqZWN0KS5nZXROYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9EaWFncmFtX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQlnZXRTdHJpbmcoIl9VSV9EaWFncmFtX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCi0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChEaWFncmFtLmNsYXNzKSkgewotCQljYXNlIFVtYVBhY2thZ2UuRElBR1JBTV9fWk9PTToKLQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24KLQkJCQkJLmdldE5vdGlmaWVyKCksIGZhbHNlLCB0cnVlKSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5ESUFHUkFNX19OQU1FU1BBQ0U6Ci0JCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uCi0JCQkJCS5nZXROb3RpZmllcigpLCB0cnVlLCBmYWxzZSkpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuCi0JICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycygKLQkJCUNvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5ESUFHUkFNX19OQU1FU1BBQ0UsIFVtYUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJCQkuY3JlYXRlU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnQoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKAotCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuRElBR1JBTV9fTkFNRVNQQUNFLCBVbWFGYWN0b3J5LmVJTlNUQU5DRQotCQkJCQkJLmNyZWF0ZVVNQVNlbWFudGljTW9kZWxCcmlkZ2UoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKAotCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuRElBR1JBTV9fTkFNRVNQQUNFLCBVbWFGYWN0b3J5LmVJTlNUQU5DRQotCQkJCQkJLmNyZWF0ZUNvcmVTZW1hbnRpY01vZGVsQnJpZGdlKCkpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNyZWF0ZUNoaWxkQ29tbWFuZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRDcmVhdGVDaGlsZFRleHQoT2JqZWN0IG93bmVyLCBPYmplY3QgZmVhdHVyZSwKLQkJCU9iamVjdCBjaGlsZCwgQ29sbGVjdGlvbjw/PiBzZWxlY3Rpb24pIHsKLQkJT2JqZWN0IGNoaWxkRmVhdHVyZSA9IGZlYXR1cmU7Ci0JCU9iamVjdCBjaGlsZE9iamVjdCA9IGNoaWxkOwotCi0JCWJvb2xlYW4gcXVhbGlmeSA9IGNoaWxkRmVhdHVyZSA9PSBVbWFQYWNrYWdlLkxpdGVyYWxzLkRJQUdSQU1fRUxFTUVOVF9fUFJPUEVSVFkKLQkJCQl8fCBjaGlsZEZlYXR1cmUgPT0gVW1hUGFja2FnZS5MaXRlcmFscy5HUkFQSF9FTEVNRU5UX19DT05UQUlORUQKLQkJCQl8fCBjaGlsZEZlYXR1cmUgPT0gVW1hUGFja2FnZS5MaXRlcmFscy5HUkFQSF9FTEVNRU5UX19MSU5LCi0JCQkJfHwgY2hpbGRGZWF0dXJlID09IFVtYVBhY2thZ2UuTGl0ZXJhbHMuR1JBUEhfRUxFTUVOVF9fQU5DSE9SQUdFCi0JCQkJfHwgY2hpbGRGZWF0dXJlID09IFVtYVBhY2thZ2UuTGl0ZXJhbHMuR1JBUEhfRUxFTUVOVF9fU0VNQU5USUNfTU9ERUwKLQkJCQl8fCBjaGlsZEZlYXR1cmUgPT0gVW1hUGFja2FnZS5MaXRlcmFscy5ESUFHUkFNX19OQU1FU1BBQ0U7Ci0KLQkJaWYgKHF1YWxpZnkpIHsKLQkJCXJldHVybiBnZXRTdHJpbmcoIl9VSV9DcmVhdGVDaGlsZF90ZXh0MiIsIC8vJE5PTi1OTFMtMSQKLQkJCQkJbmV3IE9iamVjdFtdIHsgZ2V0VHlwZVRleHQoY2hpbGRPYmplY3QpLAotCQkJCQkJCWdldEZlYXR1cmVUZXh0KGNoaWxkRmVhdHVyZSksIGdldFR5cGVUZXh0KG93bmVyKSB9KTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0Q3JlYXRlQ2hpbGRUZXh0KG93bmVyLCBmZWF0dXJlLCBjaGlsZCwgc2VsZWN0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvRGlhZ3JhbUxpbmtJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9EaWFncmFtTGlua0l0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYjU0NjUwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9EaWFncmFtTGlua0l0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbUxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbUxpbmt9IG9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERpYWdyYW1MaW5rSXRlbVByb3ZpZGVyIGV4dGVuZHMgRGlhZ3JhbUVsZW1lbnRJdGVtUHJvdmlkZXIKLQkJaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEaWFncmFtTGlua0l0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIExpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlhZGRab29tUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRWaWV3cG9ydFByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkRGlhZ3JhbVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgWm9vbSBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFpvb21Qcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfRGlhZ3JhbUxpbmtfem9vbV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0RpYWdyYW1MaW5rX3pvb21fZmVhdHVyZSIsICJfVUlfRGlhZ3JhbUxpbmtfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5ESUFHUkFNX0xJTktfX1pPT00sIHRydWUsIGZhbHNlLAotCQkJCQkJZmFsc2UsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwKLQkJCQkJCW51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgVmlld3BvcnQgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRWaWV3cG9ydFByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9EaWFncmFtTGlua192aWV3cG9ydF9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0RpYWdyYW1MaW5rX3ZpZXdwb3J0X2ZlYXR1cmUiLCAiX1VJX0RpYWdyYW1MaW5rX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuRElBR1JBTV9MSU5LX19WSUVXUE9SVCwgdHJ1ZSwKLQkJCQkJCWZhbHNlLCB0cnVlLCBudWxsLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIERpYWdyYW0gZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGREaWFncmFtUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX0RpYWdyYW1MaW5rX2RpYWdyYW1fZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9EaWFncmFtTGlua19kaWFncmFtX2ZlYXR1cmUiLCAiX1VJX0RpYWdyYW1MaW5rX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuRElBR1JBTV9MSU5LX19ESUFHUkFNLCB0cnVlLCBmYWxzZSwKLQkJCQkJCXRydWUsIG51bGwsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgRGlhZ3JhbUxpbmsuZ2lmLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoCi0JCQkJImZ1bGwvb2JqMTYvRGlhZ3JhbUxpbmsiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoRGlhZ3JhbUxpbmspIG9iamVjdCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfRGlhZ3JhbUxpbmtfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCWdldFN0cmluZygiX1VJX0RpYWdyYW1MaW5rX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCi0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChEaWFncmFtTGluay5jbGFzcykpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkRJQUdSQU1fTElOS19fWk9PTToKLQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24KLQkJCQkJLmdldE5vdGlmaWVyKCksIGZhbHNlLCB0cnVlKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4KLQkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKAotCQkJQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvRGltZW5zaW9uSXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvRGltZW5zaW9uSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkY2Y0NTEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0RpbWVuc2lvbkl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGltZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGltZW5zaW9ufSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEaW1lbnNpb25JdGVtUHJvdmlkZXIgZXh0ZW5kcyBJdGVtUHJvdmlkZXJBZGFwdGVyIGltcGxlbWVudHMKLQkJSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRGltZW5zaW9uSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCWFkZFdpZHRoUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRIZWlnaHRQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFdpZHRoIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkV2lkdGhQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfRGltZW5zaW9uX3dpZHRoX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfRGltZW5zaW9uX3dpZHRoX2ZlYXR1cmUiLCAiX1VJX0RpbWVuc2lvbl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkRJTUVOU0lPTl9fV0lEVEgsIHRydWUsIGZhbHNlLAotCQkJCQkJZmFsc2UsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwKLQkJCQkJCW51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgSGVpZ2h0IGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkSGVpZ2h0UHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX0RpbWVuc2lvbl9oZWlnaHRfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9EaW1lbnNpb25faGVpZ2h0X2ZlYXR1cmUiLCAiX1VJX0RpbWVuc2lvbl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkRJTUVOU0lPTl9fSEVJR0hULCB0cnVlLCBmYWxzZSwKLQkJCQkJCWZhbHNlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsCi0JCQkJCQludWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIERpbWVuc2lvbi5naWYuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgKLQkJCQkiZnVsbC9vYmoxNi9EaW1lbnNpb24iKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCURvdWJsZSBsYWJlbFZhbHVlID0gKChEaW1lbnNpb24pIG9iamVjdCkuZ2V0V2lkdGgoKTsKLQkJU3RyaW5nIGxhYmVsID0gbGFiZWxWYWx1ZSA9PSBudWxsID8gbnVsbCA6IGxhYmVsVmFsdWUudG9TdHJpbmcoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX0RpbWVuc2lvbl90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJZ2V0U3RyaW5nKCJfVUlfRGltZW5zaW9uX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCi0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChEaW1lbnNpb24uY2xhc3MpKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ESU1FTlNJT05fX1dJRFRIOgotCQljYXNlIFVtYVBhY2thZ2UuRElNRU5TSU9OX19IRUlHSFQ6Ci0JCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uCi0JCQkJCS5nZXROb3RpZmllcigpLCBmYWxzZSwgdHJ1ZSkpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuCi0JICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycygKLQkJCUNvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0Rpc2NpcGxpbmVHcm91cGluZ0l0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0Rpc2NpcGxpbmVHcm91cGluZ0l0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NTYxM2JkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9EaXNjaXBsaW5lR3JvdXBpbmdJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaXNjaXBsaW5lR3JvdXBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaXNjaXBsaW5lR3JvdXBpbmd9IG9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERpc2NpcGxpbmVHcm91cGluZ0l0ZW1Qcm92aWRlciBleHRlbmRzIENvbnRlbnRDYXRlZ29yeUl0ZW1Qcm92aWRlcgotCQlpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERpc2NpcGxpbmVHcm91cGluZ0l0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIExpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlhZGREaXNjaXBsaW5lc1Byb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgRGlzY2lwbGluZXMgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGREaXNjaXBsaW5lc1Byb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9EaXNjaXBsaW5lR3JvdXBpbmdfZGlzY2lwbGluZXNfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9EaXNjaXBsaW5lR3JvdXBpbmdfZGlzY2lwbGluZXNfZmVhdHVyZSIsICJfVUlfRGlzY2lwbGluZUdyb3VwaW5nX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuRElTQ0lQTElORV9HUk9VUElOR19fRElTQ0lQTElORVMsCi0JCQkJCQl0cnVlLCBmYWxzZSwgdHJ1ZSwgbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBEaXNjaXBsaW5lR3JvdXBpbmcuZ2lmLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoCi0JCQkJImZ1bGwvb2JqMTYvRGlzY2lwbGluZUdyb3VwaW5nIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKERpc2NpcGxpbmVHcm91cGluZykgb2JqZWN0KS5nZXROYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9EaXNjaXBsaW5lR3JvdXBpbmdfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCWdldFN0cmluZygiX1VJX0Rpc2NpcGxpbmVHcm91cGluZ190eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4KLQkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKAotCQkJQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvRGlzY2lwbGluZUl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0Rpc2NpcGxpbmVJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGI5MjNiOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvRGlzY2lwbGluZUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpc2NpcGxpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlzY2lwbGluZX0gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRGlzY2lwbGluZUl0ZW1Qcm92aWRlciBleHRlbmRzIENvbnRlbnRDYXRlZ29yeUl0ZW1Qcm92aWRlcgotCQlpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERpc2NpcGxpbmVJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJYWRkVGFza3NQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZFJlZmVyZW5jZVdvcmtmbG93c1Byb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgVGFza3MgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRUYXNrc1Byb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9EaXNjaXBsaW5lX3Rhc2tzX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfRGlzY2lwbGluZV90YXNrc19mZWF0dXJlIiwgIl9VSV9EaXNjaXBsaW5lX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuRElTQ0lQTElORV9fVEFTS1MsIHRydWUsIGZhbHNlLAotCQkJCQkJdHJ1ZSwgbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBSZWZlcmVuY2UgV29ya2Zsb3dzIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkUmVmZXJlbmNlV29ya2Zsb3dzUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX0Rpc2NpcGxpbmVfcmVmZXJlbmNlV29ya2Zsb3dzX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfRGlzY2lwbGluZV9yZWZlcmVuY2VXb3JrZmxvd3NfZmVhdHVyZSIsICJfVUlfRGlzY2lwbGluZV90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkRJU0NJUExJTkVfX1JFRkVSRU5DRV9XT1JLRkxPV1MsCi0JCQkJCQl0cnVlLCBmYWxzZSwgdHJ1ZSwgbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgc3BlY2lmaWVzIGhvdyB0byBpbXBsZW1lbnQge0BsaW5rICNnZXRDaGlsZHJlbn0gYW5kIGlzIHVzZWQgdG8gZGVkdWNlIGFuIGFwcHJvcHJpYXRlIGZlYXR1cmUgZm9yIGFuCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQWRkQ29tbWFuZH0sIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLlJlbW92ZUNvbW1hbmR9IG9yCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuTW92ZUNvbW1hbmR9IGluIHtAbGluayAjY3JlYXRlQ29tbWFuZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIENvbGxlY3Rpb248PyBleHRlbmRzIEVTdHJ1Y3R1cmFsRmVhdHVyZT4gZ2V0Q2hpbGRyZW5GZWF0dXJlcygKLQkJCU9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGNoaWxkcmVuRmVhdHVyZXMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0Q2hpbGRyZW5GZWF0dXJlcyhvYmplY3QpOwotCQkJY2hpbGRyZW5GZWF0dXJlcy5hZGQoVW1hUGFja2FnZS5MaXRlcmFscy5ESVNDSVBMSU5FX19TVUJESVNDSVBMSU5FKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW5GZWF0dXJlczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRVN0cnVjdHVyYWxGZWF0dXJlIGdldENoaWxkRmVhdHVyZShPYmplY3Qgb2JqZWN0LCBPYmplY3QgY2hpbGQpIHsKLQkJLy8gQ2hlY2sgdGhlIHR5cGUgb2YgdGhlIHNwZWNpZmllZCBjaGlsZCBvYmplY3QgYW5kIHJldHVybiB0aGUgcHJvcGVyIGZlYXR1cmUgdG8gdXNlIGZvcgotCQkvLyBhZGRpbmcgKHNlZSB7QGxpbmsgQWRkQ29tbWFuZH0pIGl0IGFzIGEgY2hpbGQuCi0KLQkJcmV0dXJuIHN1cGVyLmdldENoaWxkRmVhdHVyZShvYmplY3QsIGNoaWxkKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgRGlzY2lwbGluZS5naWYuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgKLQkJCQkiZnVsbC9vYmoxNi9EaXNjaXBsaW5lIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKERpc2NpcGxpbmUpIG9iamVjdCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfRGlzY2lwbGluZV90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJZ2V0U3RyaW5nKCJfVUlfRGlzY2lwbGluZV90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoRGlzY2lwbGluZS5jbGFzcykpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkRJU0NJUExJTkVfX1NVQkRJU0NJUExJTkU6Ci0JCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uCi0JCQkJCS5nZXROb3RpZmllcigpLCB0cnVlLCBmYWxzZSkpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuCi0JICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycygKLQkJCUNvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5ESVNDSVBMSU5FX19TVUJESVNDSVBMSU5FLAotCQkJCVVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZURpc2NpcGxpbmUoKSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9Eb21haW5JdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9Eb21haW5JdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzM4NTE0MS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvRG9tYWluSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRvbWFpbn0gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRG9tYWluSXRlbVByb3ZpZGVyIGV4dGVuZHMgQ29udGVudENhdGVnb3J5SXRlbVByb3ZpZGVyIGltcGxlbWVudHMKLQkJSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRG9tYWluSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCWFkZFdvcmtQcm9kdWN0c1Byb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgV29yayBQcm9kdWN0cyBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFdvcmtQcm9kdWN0c1Byb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9Eb21haW5fd29ya1Byb2R1Y3RzX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfRG9tYWluX3dvcmtQcm9kdWN0c19mZWF0dXJlIiwgIl9VSV9Eb21haW5fdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5ET01BSU5fX1dPUktfUFJPRFVDVFMsIHRydWUsIGZhbHNlLAotCQkJCQkJdHJ1ZSwgbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgc3BlY2lmaWVzIGhvdyB0byBpbXBsZW1lbnQge0BsaW5rICNnZXRDaGlsZHJlbn0gYW5kIGlzIHVzZWQgdG8gZGVkdWNlIGFuIGFwcHJvcHJpYXRlIGZlYXR1cmUgZm9yIGFuCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQWRkQ29tbWFuZH0sIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLlJlbW92ZUNvbW1hbmR9IG9yCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuTW92ZUNvbW1hbmR9IGluIHtAbGluayAjY3JlYXRlQ29tbWFuZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIENvbGxlY3Rpb248PyBleHRlbmRzIEVTdHJ1Y3R1cmFsRmVhdHVyZT4gZ2V0Q2hpbGRyZW5GZWF0dXJlcygKLQkJCU9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGNoaWxkcmVuRmVhdHVyZXMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0Q2hpbGRyZW5GZWF0dXJlcyhvYmplY3QpOwotCQkJY2hpbGRyZW5GZWF0dXJlcy5hZGQoVW1hUGFja2FnZS5MaXRlcmFscy5ET01BSU5fX1NVQkRPTUFJTlMpOwotCQl9Ci0JCXJldHVybiBjaGlsZHJlbkZlYXR1cmVzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFU3RydWN0dXJhbEZlYXR1cmUgZ2V0Q2hpbGRGZWF0dXJlKE9iamVjdCBvYmplY3QsIE9iamVjdCBjaGlsZCkgewotCQkvLyBDaGVjayB0aGUgdHlwZSBvZiB0aGUgc3BlY2lmaWVkIGNoaWxkIG9iamVjdCBhbmQgcmV0dXJuIHRoZSBwcm9wZXIgZmVhdHVyZSB0byB1c2UgZm9yCi0JCS8vIGFkZGluZyAoc2VlIHtAbGluayBBZGRDb21tYW5kfSkgaXQgYXMgYSBjaGlsZC4KLQotCQlyZXR1cm4gc3VwZXIuZ2V0Q2hpbGRGZWF0dXJlKG9iamVjdCwgY2hpbGQpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBEb21haW4uZ2lmLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoCi0JCQkJImZ1bGwvb2JqMTYvRG9tYWluIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKERvbWFpbikgb2JqZWN0KS5nZXROYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9Eb21haW5fdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCWdldFN0cmluZygiX1VJX0RvbWFpbl90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoRG9tYWluLmNsYXNzKSkgewotCQljYXNlIFVtYVBhY2thZ2UuRE9NQUlOX19TVUJET01BSU5TOgotCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbgotCQkJCQkuZ2V0Tm90aWZpZXIoKSwgdHJ1ZSwgZmFsc2UpKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbgotCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoCi0JCQlDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKAotCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuRE9NQUlOX19TVUJET01BSU5TLCBVbWFGYWN0b3J5LmVJTlNUQU5DRQotCQkJCQkJLmNyZWF0ZURvbWFpbigpKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0VsZW1lbnRJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9FbGVtZW50SXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkNWI2ZjUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0VsZW1lbnRJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkVsZW1lbnR9IG9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEVsZW1lbnRJdGVtUHJvdmlkZXIgZXh0ZW5kcyBJdGVtUHJvdmlkZXJBZGFwdGVyIGltcGxlbWVudHMKLQkJSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRWxlbWVudEl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIExpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIGdldFN0cmluZygiX1VJX0VsZW1lbnRfdHlwZSIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4KLQkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKAotCQkJQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvRWxsaXBzZUl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0VsbGlwc2VJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODZhNjg0Ni4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvRWxsaXBzZUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjY1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRWxsaXBzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5FbGxpcHNlfSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBFbGxpcHNlSXRlbVByb3ZpZGVyIGV4dGVuZHMgR3JhcGhpY1ByaW1pdGl2ZUl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzCi0JCUlFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVsbGlwc2VJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJYWRkQ2VudGVyUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRSYWRpdXNYUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRSYWRpdXNZUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRSb3RhdGlvblByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkU3RhcnRBbmdsZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkRW5kQW5nbGVQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIENlbnRlciBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZENlbnRlclByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9FbGxpcHNlX2NlbnRlcl9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0VsbGlwc2VfY2VudGVyX2ZlYXR1cmUiLCAiX1VJX0VsbGlwc2VfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5FTExJUFNFX19DRU5URVIsIHRydWUsIGZhbHNlLCB0cnVlLAotCQkJCQkJbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBSYWRpdXMgWCBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFJhZGl1c1hQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfRWxsaXBzZV9yYWRpdXNYX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfRWxsaXBzZV9yYWRpdXNYX2ZlYXR1cmUiLCAiX1VJX0VsbGlwc2VfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5FTExJUFNFX19SQURJVVNfWCwgdHJ1ZSwgZmFsc2UsCi0JCQkJCQlmYWxzZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLAotCQkJCQkJbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBSYWRpdXMgWSBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFJhZGl1c1lQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfRWxsaXBzZV9yYWRpdXNZX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfRWxsaXBzZV9yYWRpdXNZX2ZlYXR1cmUiLCAiX1VJX0VsbGlwc2VfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5FTExJUFNFX19SQURJVVNfWSwgdHJ1ZSwgZmFsc2UsCi0JCQkJCQlmYWxzZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLAotCQkJCQkJbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBSb3RhdGlvbiBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFJvdGF0aW9uUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX0VsbGlwc2Vfcm90YXRpb25fZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9FbGxpcHNlX3JvdGF0aW9uX2ZlYXR1cmUiLCAiX1VJX0VsbGlwc2VfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5FTExJUFNFX19ST1RBVElPTiwgdHJ1ZSwgZmFsc2UsCi0JCQkJCQlmYWxzZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLAotCQkJCQkJbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBTdGFydCBBbmdsZSBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFN0YXJ0QW5nbGVQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfRWxsaXBzZV9zdGFydEFuZ2xlX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfRWxsaXBzZV9zdGFydEFuZ2xlX2ZlYXR1cmUiLCAiX1VJX0VsbGlwc2VfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5FTExJUFNFX19TVEFSVF9BTkdMRSwgdHJ1ZSwgZmFsc2UsCi0JCQkJCQlmYWxzZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLAotCQkJCQkJbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBFbmQgQW5nbGUgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRFbmRBbmdsZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9FbGxpcHNlX2VuZEFuZ2xlX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfRWxsaXBzZV9lbmRBbmdsZV9mZWF0dXJlIiwgIl9VSV9FbGxpcHNlX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuRUxMSVBTRV9fRU5EX0FOR0xFLCB0cnVlLCBmYWxzZSwKLQkJCQkJCWZhbHNlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsCi0JCQkJCQludWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIEVsbGlwc2UuZ2lmLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoCi0JCQkJImZ1bGwvb2JqMTYvRWxsaXBzZSIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChFbGxpcHNlKSBvYmplY3QpLmdldE5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX0VsbGlwc2VfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCWdldFN0cmluZygiX1VJX0VsbGlwc2VfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0KLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKEVsbGlwc2UuY2xhc3MpKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5FTExJUFNFX19SQURJVVNfWDoKLQkJY2FzZSBVbWFQYWNrYWdlLkVMTElQU0VfX1JBRElVU19ZOgotCQljYXNlIFVtYVBhY2thZ2UuRUxMSVBTRV9fUk9UQVRJT046Ci0JCWNhc2UgVW1hUGFja2FnZS5FTExJUFNFX19TVEFSVF9BTkdMRToKLQkJY2FzZSBVbWFQYWNrYWdlLkVMTElQU0VfX0VORF9BTkdMRToKLQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24KLQkJCQkJLmdldE5vdGlmaWVyKCksIGZhbHNlLCB0cnVlKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4KLQkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKAotCQkJQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zSXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlYTUwZmEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0VzdGltYXRpb25Db25zaWRlcmF0aW9uc0l0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnM7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkVzdGltYXRpb25Db25zaWRlcmF0aW9uc30gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zSXRlbVByb3ZpZGVyIGV4dGVuZHMgR3VpZGFuY2VJdGVtUHJvdmlkZXIKLQkJaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnNJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zLmdpZi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKAotCQkJCSJmdWxsL29iajE2L0VzdGltYXRpb25Db25zaWRlcmF0aW9ucyIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMpIG9iamVjdCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQlnZXRTdHJpbmcoIl9VSV9Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnNfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuCi0JICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycygKLQkJCUNvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0V4YW1wbGVJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9FeGFtcGxlSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzNDg1MGEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0V4YW1wbGVJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRXhhbXBsZTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRXhhbXBsZX0gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRXhhbXBsZUl0ZW1Qcm92aWRlciBleHRlbmRzIEd1aWRhbmNlSXRlbVByb3ZpZGVyIGltcGxlbWVudHMKLQkJSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRXhhbXBsZUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIExpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBFeGFtcGxlLmdpZi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKAotCQkJCSJmdWxsL29iajE2L0V4YW1wbGUiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoRXhhbXBsZSkgb2JqZWN0KS5nZXROYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9FeGFtcGxlX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQlnZXRTdHJpbmcoIl9VSV9FeGFtcGxlX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbgotCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoCi0JCQlDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9GdWxmaWxsYWJsZUVsZW1lbnRJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9GdWxmaWxsYWJsZUVsZW1lbnRJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjYzODA5Yi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvRnVsZmlsbGFibGVFbGVtZW50SXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRnVsZmlsbGFibGVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRnVsZmlsbGFibGVFbGVtZW50fSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBGdWxmaWxsYWJsZUVsZW1lbnRJdGVtUHJvdmlkZXIgZXh0ZW5kcwotCQlEZXNjcmliYWJsZUVsZW1lbnRJdGVtUHJvdmlkZXIgaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwKLQkJSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBGdWxmaWxsYWJsZUVsZW1lbnRJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJYWRkRnVsZmlsbHNQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIEZ1bGZpbGxzIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkRnVsZmlsbHNQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfRnVsZmlsbGFibGVFbGVtZW50X2Z1bGZpbGxzX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfRnVsZmlsbGFibGVFbGVtZW50X2Z1bGZpbGxzX2ZlYXR1cmUiLCAiX1VJX0Z1bGZpbGxhYmxlRWxlbWVudF90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkZVTEZJTExBQkxFX0VMRU1FTlRfX0ZVTEZJTExTLAotCQkJCQkJdHJ1ZSwgZmFsc2UsIHRydWUsIG51bGwsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgRnVsZmlsbGFibGVFbGVtZW50LmdpZi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKAotCQkJCSJmdWxsL29iajE2L0Z1bGZpbGxhYmxlRWxlbWVudCIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChGdWxmaWxsYWJsZUVsZW1lbnQpIG9iamVjdCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfRnVsZmlsbGFibGVFbGVtZW50X3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQlnZXRTdHJpbmcoIl9VSV9GdWxmaWxsYWJsZUVsZW1lbnRfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuCi0JICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycygKLQkJCUNvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0dyYXBoQ29ubmVjdG9ySXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvR3JhcGhDb25uZWN0b3JJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzM4MDQxNy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvR3JhcGhDb25uZWN0b3JJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaENvbm5lY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoQ29ubmVjdG9yfSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBHcmFwaENvbm5lY3Rvckl0ZW1Qcm92aWRlciBleHRlbmRzIEdyYXBoRWxlbWVudEl0ZW1Qcm92aWRlcgotCQlpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEdyYXBoQ29ubmVjdG9ySXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCWFkZEdyYXBoRWRnZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgR3JhcGggRWRnZSBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEdyYXBoRWRnZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9HcmFwaENvbm5lY3Rvcl9ncmFwaEVkZ2VfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9HcmFwaENvbm5lY3Rvcl9ncmFwaEVkZ2VfZmVhdHVyZSIsICJfVUlfR3JhcGhDb25uZWN0b3JfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5HUkFQSF9DT05ORUNUT1JfX0dSQVBIX0VER0UsIHRydWUsCi0JCQkJCQlmYWxzZSwgdHJ1ZSwgbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBHcmFwaENvbm5lY3Rvci5naWYuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgKLQkJCQkiZnVsbC9vYmoxNi9HcmFwaENvbm5lY3RvciIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChHcmFwaENvbm5lY3Rvcikgb2JqZWN0KS5nZXROYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9HcmFwaENvbm5lY3Rvcl90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJZ2V0U3RyaW5nKCJfVUlfR3JhcGhDb25uZWN0b3JfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuCi0JICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycygKLQkJCUNvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5DcmVhdGVDaGlsZENvbW1hbmR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0Q3JlYXRlQ2hpbGRUZXh0KE9iamVjdCBvd25lciwgT2JqZWN0IGZlYXR1cmUsCi0JCQlPYmplY3QgY2hpbGQsIENvbGxlY3Rpb248Pz4gc2VsZWN0aW9uKSB7Ci0JCU9iamVjdCBjaGlsZEZlYXR1cmUgPSBmZWF0dXJlOwotCQlPYmplY3QgY2hpbGRPYmplY3QgPSBjaGlsZDsKLQotCQlib29sZWFuIHF1YWxpZnkgPSBjaGlsZEZlYXR1cmUgPT0gVW1hUGFja2FnZS5MaXRlcmFscy5ESUFHUkFNX0VMRU1FTlRfX1BST1BFUlRZCi0JCQkJfHwgY2hpbGRGZWF0dXJlID09IFVtYVBhY2thZ2UuTGl0ZXJhbHMuR1JBUEhfRUxFTUVOVF9fQ09OVEFJTkVECi0JCQkJfHwgY2hpbGRGZWF0dXJlID09IFVtYVBhY2thZ2UuTGl0ZXJhbHMuR1JBUEhfRUxFTUVOVF9fTElOSwotCQkJCXx8IGNoaWxkRmVhdHVyZSA9PSBVbWFQYWNrYWdlLkxpdGVyYWxzLkdSQVBIX0VMRU1FTlRfX0FOQ0hPUkFHRQotCQkJCXx8IGNoaWxkRmVhdHVyZSA9PSBVbWFQYWNrYWdlLkxpdGVyYWxzLkdSQVBIX0VMRU1FTlRfX1NFTUFOVElDX01PREVMOwotCi0JCWlmIChxdWFsaWZ5KSB7Ci0JCQlyZXR1cm4gZ2V0U3RyaW5nKCJfVUlfQ3JlYXRlQ2hpbGRfdGV4dDIiLCAvLyROT04tTkxTLTEkCi0JCQkJCW5ldyBPYmplY3RbXSB7IGdldFR5cGVUZXh0KGNoaWxkT2JqZWN0KSwKLQkJCQkJCQlnZXRGZWF0dXJlVGV4dChjaGlsZEZlYXR1cmUpLCBnZXRUeXBlVGV4dChvd25lcikgfSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldENyZWF0ZUNoaWxkVGV4dChvd25lciwgZmVhdHVyZSwgY2hpbGQsIHNlbGVjdGlvbik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0dyYXBoRWRnZUl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0dyYXBoRWRnZUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNThhNDlhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9HcmFwaEVkZ2VJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxNiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaEVkZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhFZGdlfSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBHcmFwaEVkZ2VJdGVtUHJvdmlkZXIgZXh0ZW5kcyBHcmFwaEVsZW1lbnRJdGVtUHJvdmlkZXIgaW1wbGVtZW50cwotCQlJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBHcmFwaEVkZ2VJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJYWRkQW5jaG9yUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBBbmNob3IgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRBbmNob3JQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfR3JhcGhFZGdlX2FuY2hvcl9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0dyYXBoRWRnZV9hbmNob3JfZmVhdHVyZSIsICJfVUlfR3JhcGhFZGdlX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuR1JBUEhfRURHRV9fQU5DSE9SLCB0cnVlLCBmYWxzZSwKLQkJCQkJCXRydWUsIG51bGwsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHNwZWNpZmllcyBob3cgdG8gaW1wbGVtZW50IHtAbGluayAjZ2V0Q2hpbGRyZW59IGFuZCBpcyB1c2VkIHRvIGRlZHVjZSBhbiBhcHByb3ByaWF0ZSBmZWF0dXJlIGZvciBhbgotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkFkZENvbW1hbmR9LCB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5SZW1vdmVDb21tYW5kfSBvcgotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLk1vdmVDb21tYW5kfSBpbiB7QGxpbmsgI2NyZWF0ZUNvbW1hbmR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBDb2xsZWN0aW9uPD8gZXh0ZW5kcyBFU3RydWN0dXJhbEZlYXR1cmU+IGdldENoaWxkcmVuRmVhdHVyZXMoCi0JCQlPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlbkZlYXR1cmVzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldENoaWxkcmVuRmVhdHVyZXMob2JqZWN0KTsKLQkJCWNoaWxkcmVuRmVhdHVyZXMuYWRkKFVtYVBhY2thZ2UuTGl0ZXJhbHMuR1JBUEhfRURHRV9fV0FZUE9JTlRTKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW5GZWF0dXJlczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRVN0cnVjdHVyYWxGZWF0dXJlIGdldENoaWxkRmVhdHVyZShPYmplY3Qgb2JqZWN0LCBPYmplY3QgY2hpbGQpIHsKLQkJLy8gQ2hlY2sgdGhlIHR5cGUgb2YgdGhlIHNwZWNpZmllZCBjaGlsZCBvYmplY3QgYW5kIHJldHVybiB0aGUgcHJvcGVyIGZlYXR1cmUgdG8gdXNlIGZvcgotCQkvLyBhZGRpbmcgKHNlZSB7QGxpbmsgQWRkQ29tbWFuZH0pIGl0IGFzIGEgY2hpbGQuCi0KLQkJcmV0dXJuIHN1cGVyLmdldENoaWxkRmVhdHVyZShvYmplY3QsIGNoaWxkKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgR3JhcGhFZGdlLmdpZi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKAotCQkJCSJmdWxsL29iajE2L0dyYXBoRWRnZSIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChHcmFwaEVkZ2UpIG9iamVjdCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfR3JhcGhFZGdlX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQlnZXRTdHJpbmcoIl9VSV9HcmFwaEVkZ2VfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0KLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKEdyYXBoRWRnZS5jbGFzcykpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkdSQVBIX0VER0VfX1dBWVBPSU5UUzoKLQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24KLQkJCQkJLmdldE5vdGlmaWVyKCksIHRydWUsIGZhbHNlKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4KLQkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKAotCQkJQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcigKLQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkdSQVBIX0VER0VfX1dBWVBPSU5UUywgVW1hRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkJCS5jcmVhdGVQb2ludCgpKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5DcmVhdGVDaGlsZENvbW1hbmR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0Q3JlYXRlQ2hpbGRUZXh0KE9iamVjdCBvd25lciwgT2JqZWN0IGZlYXR1cmUsCi0JCQlPYmplY3QgY2hpbGQsIENvbGxlY3Rpb248Pz4gc2VsZWN0aW9uKSB7Ci0JCU9iamVjdCBjaGlsZEZlYXR1cmUgPSBmZWF0dXJlOwotCQlPYmplY3QgY2hpbGRPYmplY3QgPSBjaGlsZDsKLQotCQlib29sZWFuIHF1YWxpZnkgPSBjaGlsZEZlYXR1cmUgPT0gVW1hUGFja2FnZS5MaXRlcmFscy5ESUFHUkFNX0VMRU1FTlRfX1BST1BFUlRZCi0JCQkJfHwgY2hpbGRGZWF0dXJlID09IFVtYVBhY2thZ2UuTGl0ZXJhbHMuR1JBUEhfRUxFTUVOVF9fQ09OVEFJTkVECi0JCQkJfHwgY2hpbGRGZWF0dXJlID09IFVtYVBhY2thZ2UuTGl0ZXJhbHMuR1JBUEhfRUxFTUVOVF9fTElOSwotCQkJCXx8IGNoaWxkRmVhdHVyZSA9PSBVbWFQYWNrYWdlLkxpdGVyYWxzLkdSQVBIX0VMRU1FTlRfX0FOQ0hPUkFHRQotCQkJCXx8IGNoaWxkRmVhdHVyZSA9PSBVbWFQYWNrYWdlLkxpdGVyYWxzLkdSQVBIX0VMRU1FTlRfX1NFTUFOVElDX01PREVMOwotCi0JCWlmIChxdWFsaWZ5KSB7Ci0JCQlyZXR1cm4gZ2V0U3RyaW5nKCJfVUlfQ3JlYXRlQ2hpbGRfdGV4dDIiLCAvLyROT04tTkxTLTEkCi0JCQkJCW5ldyBPYmplY3RbXSB7IGdldFR5cGVUZXh0KGNoaWxkT2JqZWN0KSwKLQkJCQkJCQlnZXRGZWF0dXJlVGV4dChjaGlsZEZlYXR1cmUpLCBnZXRUeXBlVGV4dChvd25lcikgfSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldENyZWF0ZUNoaWxkVGV4dChvd25lciwgZmVhdHVyZSwgY2hpbGQsIHNlbGVjdGlvbik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0dyYXBoRWxlbWVudEl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0dyYXBoRWxlbWVudEl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNDU4YTQ5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9HcmFwaEVsZW1lbnRJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhFbGVtZW50fSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBHcmFwaEVsZW1lbnRJdGVtUHJvdmlkZXIgZXh0ZW5kcyBEaWFncmFtRWxlbWVudEl0ZW1Qcm92aWRlcgotCQlpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEdyYXBoRWxlbWVudEl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIExpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlhZGRQb3NpdGlvblByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgUG9zaXRpb24gZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRQb3NpdGlvblByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9HcmFwaEVsZW1lbnRfcG9zaXRpb25fZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9HcmFwaEVsZW1lbnRfcG9zaXRpb25fZmVhdHVyZSIsICJfVUlfR3JhcGhFbGVtZW50X3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuR1JBUEhfRUxFTUVOVF9fUE9TSVRJT04sIHRydWUsCi0JCQkJCQlmYWxzZSwgdHJ1ZSwgbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgc3BlY2lmaWVzIGhvdyB0byBpbXBsZW1lbnQge0BsaW5rICNnZXRDaGlsZHJlbn0gYW5kIGlzIHVzZWQgdG8gZGVkdWNlIGFuIGFwcHJvcHJpYXRlIGZlYXR1cmUgZm9yIGFuCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQWRkQ29tbWFuZH0sIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLlJlbW92ZUNvbW1hbmR9IG9yCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuTW92ZUNvbW1hbmR9IGluIHtAbGluayAjY3JlYXRlQ29tbWFuZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIENvbGxlY3Rpb248PyBleHRlbmRzIEVTdHJ1Y3R1cmFsRmVhdHVyZT4gZ2V0Q2hpbGRyZW5GZWF0dXJlcygKLQkJCU9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGNoaWxkcmVuRmVhdHVyZXMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0Q2hpbGRyZW5GZWF0dXJlcyhvYmplY3QpOwotCQkJY2hpbGRyZW5GZWF0dXJlcy5hZGQoVW1hUGFja2FnZS5MaXRlcmFscy5HUkFQSF9FTEVNRU5UX19DT05UQUlORUQpOwotCQkJY2hpbGRyZW5GZWF0dXJlcy5hZGQoVW1hUGFja2FnZS5MaXRlcmFscy5HUkFQSF9FTEVNRU5UX19MSU5LKTsKLQkJCWNoaWxkcmVuRmVhdHVyZXMuYWRkKFVtYVBhY2thZ2UuTGl0ZXJhbHMuR1JBUEhfRUxFTUVOVF9fQU5DSE9SQUdFKTsKLQkJCWNoaWxkcmVuRmVhdHVyZXMKLQkJCQkJLmFkZChVbWFQYWNrYWdlLkxpdGVyYWxzLkdSQVBIX0VMRU1FTlRfX1NFTUFOVElDX01PREVMKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW5GZWF0dXJlczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRVN0cnVjdHVyYWxGZWF0dXJlIGdldENoaWxkRmVhdHVyZShPYmplY3Qgb2JqZWN0LCBPYmplY3QgY2hpbGQpIHsKLQkJLy8gQ2hlY2sgdGhlIHR5cGUgb2YgdGhlIHNwZWNpZmllZCBjaGlsZCBvYmplY3QgYW5kIHJldHVybiB0aGUgcHJvcGVyIGZlYXR1cmUgdG8gdXNlIGZvcgotCQkvLyBhZGRpbmcgKHNlZSB7QGxpbmsgQWRkQ29tbWFuZH0pIGl0IGFzIGEgY2hpbGQuCi0KLQkJcmV0dXJuIHN1cGVyLmdldENoaWxkRmVhdHVyZShvYmplY3QsIGNoaWxkKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoR3JhcGhFbGVtZW50KSBvYmplY3QpLmdldE5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX0dyYXBoRWxlbWVudF90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJZ2V0U3RyaW5nKCJfVUlfR3JhcGhFbGVtZW50X3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCi0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChHcmFwaEVsZW1lbnQuY2xhc3MpKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5HUkFQSF9FTEVNRU5UX19DT05UQUlORUQ6Ci0JCWNhc2UgVW1hUGFja2FnZS5HUkFQSF9FTEVNRU5UX19MSU5LOgotCQljYXNlIFVtYVBhY2thZ2UuR1JBUEhfRUxFTUVOVF9fQU5DSE9SQUdFOgotCQljYXNlIFVtYVBhY2thZ2UuR1JBUEhfRUxFTUVOVF9fU0VNQU5USUNfTU9ERUw6Ci0JCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uCi0JCQkJCS5nZXROb3RpZmllcigpLCB0cnVlLCBmYWxzZSkpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuCi0JICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycygKLQkJCUNvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5HUkFQSF9FTEVNRU5UX19DT05UQUlORUQsCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlR3JhcGhOb2RlKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcigKLQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkdSQVBIX0VMRU1FTlRfX0NPTlRBSU5FRCwKLQkJCQlVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVEaWFncmFtKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcigKLQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkdSQVBIX0VMRU1FTlRfX0NPTlRBSU5FRCwKLQkJCQlVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVSZWZlcmVuY2UoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKAotCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuR1JBUEhfRUxFTUVOVF9fQ09OVEFJTkVELAotCQkJCVVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVByb3BlcnR5KCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcigKLQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkdSQVBIX0VMRU1FTlRfX0NPTlRBSU5FRCwKLQkJCQlVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVEaWFncmFtTGluaygpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5HUkFQSF9FTEVNRU5UX19DT05UQUlORUQsCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlR3JhcGhDb25uZWN0b3IoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKAotCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuR1JBUEhfRUxFTUVOVF9fQ09OVEFJTkVELAotCQkJCVVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUdyYXBoRWRnZSgpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5HUkFQSF9FTEVNRU5UX19DT05UQUlORUQsCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnQoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKAotCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuR1JBUEhfRUxFTUVOVF9fQ09OVEFJTkVELAotCQkJCVVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVVNQVNlbWFudGljTW9kZWxCcmlkZ2UoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKAotCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuR1JBUEhfRUxFTUVOVF9fQ09OVEFJTkVELAotCQkJCVVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUNvcmVTZW1hbnRpY01vZGVsQnJpZGdlKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcigKLQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkdSQVBIX0VMRU1FTlRfX0NPTlRBSU5FRCwKLQkJCQlVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVUZXh0RWxlbWVudCgpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5HUkFQSF9FTEVNRU5UX19DT05UQUlORUQsCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlSW1hZ2UoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKAotCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuR1JBUEhfRUxFTUVOVF9fQ09OVEFJTkVELAotCQkJCVVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVBvbHlsaW5lKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcigKLQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkdSQVBIX0VMRU1FTlRfX0NPTlRBSU5FRCwKLQkJCQlVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVFbGxpcHNlKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcigKLQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkdSQVBIX0VMRU1FTlRfX0xJTkssIFVtYUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJCQkuY3JlYXRlRGlhZ3JhbUxpbmsoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKAotCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuR1JBUEhfRUxFTUVOVF9fQU5DSE9SQUdFLAotCQkJCVVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUdyYXBoQ29ubmVjdG9yKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcigKLQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkdSQVBIX0VMRU1FTlRfX1NFTUFOVElDX01PREVMLAotCQkJCVVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVNpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50KCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcigKLQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkdSQVBIX0VMRU1FTlRfX1NFTUFOVElDX01PREVMLAotCQkJCVVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVVNQVNlbWFudGljTW9kZWxCcmlkZ2UoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKAotCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuR1JBUEhfRUxFTUVOVF9fU0VNQU5USUNfTU9ERUwsCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQ29yZVNlbWFudGljTW9kZWxCcmlkZ2UoKSkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3Ige0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ3JlYXRlQ2hpbGRDb21tYW5kfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldENyZWF0ZUNoaWxkVGV4dChPYmplY3Qgb3duZXIsIE9iamVjdCBmZWF0dXJlLAotCQkJT2JqZWN0IGNoaWxkLCBDb2xsZWN0aW9uPD8+IHNlbGVjdGlvbikgewotCQlPYmplY3QgY2hpbGRGZWF0dXJlID0gZmVhdHVyZTsKLQkJT2JqZWN0IGNoaWxkT2JqZWN0ID0gY2hpbGQ7Ci0KLQkJYm9vbGVhbiBxdWFsaWZ5ID0gY2hpbGRGZWF0dXJlID09IFVtYVBhY2thZ2UuTGl0ZXJhbHMuRElBR1JBTV9FTEVNRU5UX19QUk9QRVJUWQotCQkJCXx8IGNoaWxkRmVhdHVyZSA9PSBVbWFQYWNrYWdlLkxpdGVyYWxzLkdSQVBIX0VMRU1FTlRfX0NPTlRBSU5FRAotCQkJCXx8IGNoaWxkRmVhdHVyZSA9PSBVbWFQYWNrYWdlLkxpdGVyYWxzLkdSQVBIX0VMRU1FTlRfX0xJTksKLQkJCQl8fCBjaGlsZEZlYXR1cmUgPT0gVW1hUGFja2FnZS5MaXRlcmFscy5HUkFQSF9FTEVNRU5UX19BTkNIT1JBR0UKLQkJCQl8fCBjaGlsZEZlYXR1cmUgPT0gVW1hUGFja2FnZS5MaXRlcmFscy5HUkFQSF9FTEVNRU5UX19TRU1BTlRJQ19NT0RFTDsKLQotCQlpZiAocXVhbGlmeSkgewotCQkJcmV0dXJuIGdldFN0cmluZygiX1VJX0NyZWF0ZUNoaWxkX3RleHQyIiwgLy8kTk9OLU5MUy0xJAotCQkJCQluZXcgT2JqZWN0W10geyBnZXRUeXBlVGV4dChjaGlsZE9iamVjdCksCi0JCQkJCQkJZ2V0RmVhdHVyZVRleHQoY2hpbGRGZWF0dXJlKSwgZ2V0VHlwZVRleHQob3duZXIpIH0pOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRDcmVhdGVDaGlsZFRleHQob3duZXIsIGZlYXR1cmUsIGNoaWxkLCBzZWxlY3Rpb24pOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9HcmFwaE5vZGVJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9HcmFwaE5vZGVJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDU5NGEyMy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvR3JhcGhOb2RlSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoTm9kZX0gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgR3JhcGhOb2RlSXRlbVByb3ZpZGVyIGV4dGVuZHMgR3JhcGhFbGVtZW50SXRlbVByb3ZpZGVyIGltcGxlbWVudHMKLQkJSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgR3JhcGhOb2RlSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCWFkZFNpemVQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFNpemUgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRTaXplUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX0dyYXBoTm9kZV9zaXplX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfR3JhcGhOb2RlX3NpemVfZmVhdHVyZSIsICJfVUlfR3JhcGhOb2RlX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuR1JBUEhfTk9ERV9fU0laRSwgdHJ1ZSwgZmFsc2UsCi0JCQkJCQl0cnVlLCBudWxsLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIEdyYXBoTm9kZS5naWYuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgKLQkJCQkiZnVsbC9vYmoxNi9HcmFwaE5vZGUiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoR3JhcGhOb2RlKSBvYmplY3QpLmdldE5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX0dyYXBoTm9kZV90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJZ2V0U3RyaW5nKCJfVUlfR3JhcGhOb2RlX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbgotCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoCi0JCQlDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3Ige0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ3JlYXRlQ2hpbGRDb21tYW5kfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldENyZWF0ZUNoaWxkVGV4dChPYmplY3Qgb3duZXIsIE9iamVjdCBmZWF0dXJlLAotCQkJT2JqZWN0IGNoaWxkLCBDb2xsZWN0aW9uPD8+IHNlbGVjdGlvbikgewotCQlPYmplY3QgY2hpbGRGZWF0dXJlID0gZmVhdHVyZTsKLQkJT2JqZWN0IGNoaWxkT2JqZWN0ID0gY2hpbGQ7Ci0KLQkJYm9vbGVhbiBxdWFsaWZ5ID0gY2hpbGRGZWF0dXJlID09IFVtYVBhY2thZ2UuTGl0ZXJhbHMuRElBR1JBTV9FTEVNRU5UX19QUk9QRVJUWQotCQkJCXx8IGNoaWxkRmVhdHVyZSA9PSBVbWFQYWNrYWdlLkxpdGVyYWxzLkdSQVBIX0VMRU1FTlRfX0NPTlRBSU5FRAotCQkJCXx8IGNoaWxkRmVhdHVyZSA9PSBVbWFQYWNrYWdlLkxpdGVyYWxzLkdSQVBIX0VMRU1FTlRfX0xJTksKLQkJCQl8fCBjaGlsZEZlYXR1cmUgPT0gVW1hUGFja2FnZS5MaXRlcmFscy5HUkFQSF9FTEVNRU5UX19BTkNIT1JBR0UKLQkJCQl8fCBjaGlsZEZlYXR1cmUgPT0gVW1hUGFja2FnZS5MaXRlcmFscy5HUkFQSF9FTEVNRU5UX19TRU1BTlRJQ19NT0RFTDsKLQotCQlpZiAocXVhbGlmeSkgewotCQkJcmV0dXJuIGdldFN0cmluZygiX1VJX0NyZWF0ZUNoaWxkX3RleHQyIiwgLy8kTk9OLU5MUy0xJAotCQkJCQluZXcgT2JqZWN0W10geyBnZXRUeXBlVGV4dChjaGlsZE9iamVjdCksCi0JCQkJCQkJZ2V0RmVhdHVyZVRleHQoY2hpbGRGZWF0dXJlKSwgZ2V0VHlwZVRleHQob3duZXIpIH0pOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRDcmVhdGVDaGlsZFRleHQob3duZXIsIGZlYXR1cmUsIGNoaWxkLCBzZWxlY3Rpb24pOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9HcmFwaGljUHJpbWl0aXZlSXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvR3JhcGhpY1ByaW1pdGl2ZUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2Zjk0Y2VhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9HcmFwaGljUHJpbWl0aXZlSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoaWNQcmltaXRpdmU7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoaWNQcmltaXRpdmV9IG9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEdyYXBoaWNQcmltaXRpdmVJdGVtUHJvdmlkZXIgZXh0ZW5kcyBMZWFmRWxlbWVudEl0ZW1Qcm92aWRlcgotCQlpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEdyYXBoaWNQcmltaXRpdmVJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoR3JhcGhpY1ByaW1pdGl2ZSkgb2JqZWN0KS5nZXROYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9HcmFwaGljUHJpbWl0aXZlX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQlnZXRTdHJpbmcoIl9VSV9HcmFwaGljUHJpbWl0aXZlX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbgotCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoCi0JCQlDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9HdWlkYW5jZURlc2NyaXB0aW9uSXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvR3VpZGFuY2VEZXNjcmlwdGlvbkl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMzNlZmQ0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9HdWlkYW5jZURlc2NyaXB0aW9uSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3VpZGFuY2VEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkd1aWRhbmNlRGVzY3JpcHRpb259IG9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEd1aWRhbmNlRGVzY3JpcHRpb25JdGVtUHJvdmlkZXIgZXh0ZW5kcwotCQlDb250ZW50RGVzY3JpcHRpb25JdGVtUHJvdmlkZXIgaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwKLQkJSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBHdWlkYW5jZURlc2NyaXB0aW9uSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCWFkZEF0dGFjaG1lbnRzUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBBdHRhY2htZW50cyBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEF0dGFjaG1lbnRzUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX0d1aWRhbmNlRGVzY3JpcHRpb25fYXR0YWNobWVudHNfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9HdWlkYW5jZURlc2NyaXB0aW9uX2F0dGFjaG1lbnRzX2ZlYXR1cmUiLCAiX1VJX0d1aWRhbmNlRGVzY3JpcHRpb25fdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5HVUlEQU5DRV9ERVNDUklQVElPTl9fQVRUQUNITUVOVFMsCi0JCQkJCQl0cnVlLCBmYWxzZSwgZmFsc2UsCi0JCQkJCQlJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgR3VpZGFuY2VEZXNjcmlwdGlvbi5naWYuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgKLQkJCQkiZnVsbC9vYmoxNi9HdWlkYW5jZURlc2NyaXB0aW9uIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKEd1aWRhbmNlRGVzY3JpcHRpb24pIG9iamVjdCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfR3VpZGFuY2VEZXNjcmlwdGlvbl90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJZ2V0U3RyaW5nKCJfVUlfR3VpZGFuY2VEZXNjcmlwdGlvbl90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoR3VpZGFuY2VEZXNjcmlwdGlvbi5jbGFzcykpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkdVSURBTkNFX0RFU0NSSVBUSU9OX19BVFRBQ0hNRU5UUzoKLQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24KLQkJCQkJLmdldE5vdGlmaWVyKCksIGZhbHNlLCB0cnVlKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4KLQkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKAotCQkJQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvR3VpZGFuY2VJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9HdWlkYW5jZUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMjA1OGM3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9HdWlkYW5jZUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTExICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HdWlkYW5jZTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuR3VpZGFuY2V9IG9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEd1aWRhbmNlSXRlbVByb3ZpZGVyIGV4dGVuZHMgQ29udGVudEVsZW1lbnRJdGVtUHJvdmlkZXIgaW1wbGVtZW50cwotCQlJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBHdWlkYW5jZUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIExpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChHdWlkYW5jZSkgb2JqZWN0KS5nZXROYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9HdWlkYW5jZV90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJZ2V0U3RyaW5nKCJfVUlfR3VpZGFuY2VfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuCi0JICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycygKLQkJCUNvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0d1aWRlbGluZUl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0d1aWRlbGluZUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNGNlYjY5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9HdWlkZWxpbmVJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3VpZGVsaW5lOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5HdWlkZWxpbmV9IG9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEd1aWRlbGluZUl0ZW1Qcm92aWRlciBleHRlbmRzIEd1aWRhbmNlSXRlbVByb3ZpZGVyIGltcGxlbWVudHMKLQkJSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgR3VpZGVsaW5lSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIEd1aWRlbGluZS5naWYuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgKLQkJCQkiZnVsbC9vYmoxNi9HdWlkZWxpbmUiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoR3VpZGVsaW5lKSBvYmplY3QpLmdldE5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX0d1aWRlbGluZV90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJZ2V0U3RyaW5nKCJfVUlfR3VpZGVsaW5lX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbgotCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoCi0JCQlDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9JbWFnZUl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0ltYWdlSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlYTNhZDIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0ltYWdlSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5JbWFnZX0gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgSW1hZ2VJdGVtUHJvdmlkZXIgZXh0ZW5kcyBMZWFmRWxlbWVudEl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzCi0JCUlFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEltYWdlSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCWFkZFVyaVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkTWltZVR5cGVQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFVyaSBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFVyaVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9JbWFnZV91cmlfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9JbWFnZV91cmlfZmVhdHVyZSIsICJfVUlfSW1hZ2VfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5JTUFHRV9fVVJJLCB0cnVlLCBmYWxzZSwgZmFsc2UsCi0JCQkJCQlJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgTWltZSBUeXBlIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkTWltZVR5cGVQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfSW1hZ2VfbWltZVR5cGVfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9JbWFnZV9taW1lVHlwZV9mZWF0dXJlIiwgIl9VSV9JbWFnZV90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLklNQUdFX19NSU1FX1RZUEUsIHRydWUsIGZhbHNlLAotCQkJCQkJZmFsc2UsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwKLQkJCQkJCW51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgSW1hZ2UuZ2lmLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoCi0JCQkJImZ1bGwvb2JqMTYvSW1hZ2UiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoSW1hZ2UpIG9iamVjdCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfSW1hZ2VfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCWdldFN0cmluZygiX1VJX0ltYWdlX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCi0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChJbWFnZS5jbGFzcykpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLklNQUdFX19VUkk6Ci0JCWNhc2UgVW1hUGFja2FnZS5JTUFHRV9fTUlNRV9UWVBFOgotCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbgotCQkJCQkuZ2V0Tm90aWZpZXIoKSwgZmFsc2UsIHRydWUpKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbgotCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoCi0JCQlDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9JdGVyYXRpb25JdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9JdGVyYXRpb25JdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmY3NWE0Mi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvSXRlcmF0aW9uSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkl0ZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkl0ZXJhdGlvbn0gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgSXRlcmF0aW9uSXRlbVByb3ZpZGVyIGV4dGVuZHMgQWN0aXZpdHlJdGVtUHJvdmlkZXIgaW1wbGVtZW50cwotCQlJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJdGVyYXRpb25JdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgSXRlcmF0aW9uLmdpZi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKAotCQkJCSJmdWxsL29iajE2L0l0ZXJhdGlvbiIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChJdGVyYXRpb24pIG9iamVjdCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfSXRlcmF0aW9uX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQlnZXRTdHJpbmcoIl9VSV9JdGVyYXRpb25fdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuCi0JICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycygKLQkJCUNvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5DcmVhdGVDaGlsZENvbW1hbmR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0Q3JlYXRlQ2hpbGRUZXh0KE9iamVjdCBvd25lciwgT2JqZWN0IGZlYXR1cmUsCi0JCQlPYmplY3QgY2hpbGQsIENvbGxlY3Rpb248Pz4gc2VsZWN0aW9uKSB7Ci0JCU9iamVjdCBjaGlsZEZlYXR1cmUgPSBmZWF0dXJlOwotCQlPYmplY3QgY2hpbGRPYmplY3QgPSBjaGlsZDsKLQotCQlib29sZWFuIHF1YWxpZnkgPSBjaGlsZEZlYXR1cmUgPT0gVW1hUGFja2FnZS5MaXRlcmFscy5NRVRIT0RfRUxFTUVOVF9fT1dORURfUlVMRVMKLQkJCQl8fCBjaGlsZEZlYXR1cmUgPT0gVW1hUGFja2FnZS5MaXRlcmFscy5XT1JLX0RFRklOSVRJT05fX1BSRUNPTkRJVElPTgotCQkJCXx8IGNoaWxkRmVhdHVyZSA9PSBVbWFQYWNrYWdlLkxpdGVyYWxzLldPUktfREVGSU5JVElPTl9fUE9TVENPTkRJVElPTjsKLQotCQlpZiAocXVhbGlmeSkgewotCQkJcmV0dXJuIGdldFN0cmluZygiX1VJX0NyZWF0ZUNoaWxkX3RleHQyIiwgLy8kTk9OLU5MUy0xJAotCQkJCQluZXcgT2JqZWN0W10geyBnZXRUeXBlVGV4dChjaGlsZE9iamVjdCksCi0JCQkJCQkJZ2V0RmVhdHVyZVRleHQoY2hpbGRGZWF0dXJlKSwgZ2V0VHlwZVRleHQob3duZXIpIH0pOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRDcmVhdGVDaGlsZFRleHQob3duZXIsIGZlYXR1cmUsIGNoaWxkLCBzZWxlY3Rpb24pOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9LaW5kSXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvS2luZEl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YzY2YWQ3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9LaW5kSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5LaW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLktpbmR9IG9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEtpbmRJdGVtUHJvdmlkZXIgZXh0ZW5kcyBDb250ZW50RWxlbWVudEl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzCi0JCUlFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEtpbmRJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHNwZWNpZmllcyBob3cgdG8gaW1wbGVtZW50IHtAbGluayAjZ2V0Q2hpbGRyZW59IGFuZCBpcyB1c2VkIHRvIGRlZHVjZSBhbiBhcHByb3ByaWF0ZSBmZWF0dXJlIGZvciBhbgotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkFkZENvbW1hbmR9LCB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5SZW1vdmVDb21tYW5kfSBvcgotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLk1vdmVDb21tYW5kfSBpbiB7QGxpbmsgI2NyZWF0ZUNvbW1hbmR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBDb2xsZWN0aW9uPD8gZXh0ZW5kcyBFU3RydWN0dXJhbEZlYXR1cmU+IGdldENoaWxkcmVuRmVhdHVyZXMoCi0JCQlPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlbkZlYXR1cmVzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldENoaWxkcmVuRmVhdHVyZXMob2JqZWN0KTsKLQkJCWNoaWxkcmVuRmVhdHVyZXMKLQkJCQkJLmFkZChVbWFQYWNrYWdlLkxpdGVyYWxzLktJTkRfX0FQUExJQ0FCTEVfTUVUQV9DTEFTU19JTkZPKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW5GZWF0dXJlczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRVN0cnVjdHVyYWxGZWF0dXJlIGdldENoaWxkRmVhdHVyZShPYmplY3Qgb2JqZWN0LCBPYmplY3QgY2hpbGQpIHsKLQkJLy8gQ2hlY2sgdGhlIHR5cGUgb2YgdGhlIHNwZWNpZmllZCBjaGlsZCBvYmplY3QgYW5kIHJldHVybiB0aGUgcHJvcGVyIGZlYXR1cmUgdG8gdXNlIGZvcgotCQkvLyBhZGRpbmcgKHNlZSB7QGxpbmsgQWRkQ29tbWFuZH0pIGl0IGFzIGEgY2hpbGQuCi0KLQkJcmV0dXJuIHN1cGVyLmdldENoaWxkRmVhdHVyZShvYmplY3QsIGNoaWxkKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgS2luZC5naWYuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgKLQkJCQkiZnVsbC9vYmoxNi9LaW5kIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKEtpbmQpIG9iamVjdCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfS2luZF90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJZ2V0U3RyaW5nKCJfVUlfS2luZF90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoS2luZC5jbGFzcykpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLktJTkRfX0FQUExJQ0FCTEVfTUVUQV9DTEFTU19JTkZPOgotCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbgotCQkJCQkuZ2V0Tm90aWZpZXIoKSwgdHJ1ZSwgZmFsc2UpKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbgotCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoCi0JCQlDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKAotCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuS0lORF9fQVBQTElDQUJMRV9NRVRBX0NMQVNTX0lORk8sCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQXBwbGljYWJsZU1ldGFDbGFzc0luZm8oKSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9MZWFmRWxlbWVudEl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0xlYWZFbGVtZW50SXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhYjRjZTEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0xlYWZFbGVtZW50SXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkxlYWZFbGVtZW50OwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5MZWFmRWxlbWVudH0gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgTGVhZkVsZW1lbnRJdGVtUHJvdmlkZXIgZXh0ZW5kcyBEaWFncmFtRWxlbWVudEl0ZW1Qcm92aWRlcgotCQlpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExlYWZFbGVtZW50SXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKExlYWZFbGVtZW50KSBvYmplY3QpLmdldE5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX0xlYWZFbGVtZW50X3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQlnZXRTdHJpbmcoIl9VSV9MZWFmRWxlbWVudF90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4KLQkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKAotCQkJQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvTWV0aG9kQ29uZmlndXJhdGlvbkl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL01ldGhvZENvbmZpZ3VyYXRpb25JdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjVjNzQxYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvTWV0aG9kQ29uZmlndXJhdGlvbkl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjY1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9ufSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXRob2RDb25maWd1cmF0aW9uSXRlbVByb3ZpZGVyIGV4dGVuZHMgTWV0aG9kVW5pdEl0ZW1Qcm92aWRlcgotCQlpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE1ldGhvZENvbmZpZ3VyYXRpb25JdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJYWRkTWV0aG9kUGx1Z2luU2VsZWN0aW9uUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRNZXRob2RQYWNrYWdlU2VsZWN0aW9uUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRQcm9jZXNzVmlld3NQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZERlZmF1bHRWaWV3UHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRCYXNlQ29uZmlndXJhdGlvbnNQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZFN1YnRyYWN0ZWRDYXRlZ29yeVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkQWRkZWRDYXRlZ29yeVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgTWV0aG9kIFBsdWdpbiBTZWxlY3Rpb24gZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRNZXRob2RQbHVnaW5TZWxlY3Rpb25Qcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfTWV0aG9kQ29uZmlndXJhdGlvbl9tZXRob2RQbHVnaW5TZWxlY3Rpb25fZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9NZXRob2RDb25maWd1cmF0aW9uX21ldGhvZFBsdWdpblNlbGVjdGlvbl9mZWF0dXJlIiwgIl9VSV9NZXRob2RDb25maWd1cmF0aW9uX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuTUVUSE9EX0NPTkZJR1VSQVRJT05fX01FVEhPRF9QTFVHSU5fU0VMRUNUSU9OLAotCQkJCQkJdHJ1ZSwgZmFsc2UsIHRydWUsIG51bGwsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgTWV0aG9kIFBhY2thZ2UgU2VsZWN0aW9uIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkTWV0aG9kUGFja2FnZVNlbGVjdGlvblByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9NZXRob2RDb25maWd1cmF0aW9uX21ldGhvZFBhY2thZ2VTZWxlY3Rpb25fZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9NZXRob2RDb25maWd1cmF0aW9uX21ldGhvZFBhY2thZ2VTZWxlY3Rpb25fZmVhdHVyZSIsICJfVUlfTWV0aG9kQ29uZmlndXJhdGlvbl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLk1FVEhPRF9DT05GSUdVUkFUSU9OX19NRVRIT0RfUEFDS0FHRV9TRUxFQ1RJT04sCi0JCQkJCQl0cnVlLCBmYWxzZSwgdHJ1ZSwgbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBQcm9jZXNzIFZpZXdzIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkUHJvY2Vzc1ZpZXdzUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX01ldGhvZENvbmZpZ3VyYXRpb25fcHJvY2Vzc1ZpZXdzX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfTWV0aG9kQ29uZmlndXJhdGlvbl9wcm9jZXNzVmlld3NfZmVhdHVyZSIsICJfVUlfTWV0aG9kQ29uZmlndXJhdGlvbl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLk1FVEhPRF9DT05GSUdVUkFUSU9OX19QUk9DRVNTX1ZJRVdTLAotCQkJCQkJdHJ1ZSwgZmFsc2UsIHRydWUsIG51bGwsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgRGVmYXVsdCBWaWV3IGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkRGVmYXVsdFZpZXdQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfTWV0aG9kQ29uZmlndXJhdGlvbl9kZWZhdWx0Vmlld19mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX01ldGhvZENvbmZpZ3VyYXRpb25fZGVmYXVsdFZpZXdfZmVhdHVyZSIsICJfVUlfTWV0aG9kQ29uZmlndXJhdGlvbl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLk1FVEhPRF9DT05GSUdVUkFUSU9OX19ERUZBVUxUX1ZJRVcsCi0JCQkJCQl0cnVlLCBmYWxzZSwgdHJ1ZSwgbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBCYXNlIENvbmZpZ3VyYXRpb25zIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkQmFzZUNvbmZpZ3VyYXRpb25zUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX01ldGhvZENvbmZpZ3VyYXRpb25fYmFzZUNvbmZpZ3VyYXRpb25zX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfTWV0aG9kQ29uZmlndXJhdGlvbl9iYXNlQ29uZmlndXJhdGlvbnNfZmVhdHVyZSIsICJfVUlfTWV0aG9kQ29uZmlndXJhdGlvbl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLk1FVEhPRF9DT05GSUdVUkFUSU9OX19CQVNFX0NPTkZJR1VSQVRJT05TLAotCQkJCQkJdHJ1ZSwgZmFsc2UsIHRydWUsIG51bGwsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgU3VidHJhY3RlZCBDYXRlZ29yeSBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFN1YnRyYWN0ZWRDYXRlZ29yeVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9NZXRob2RDb25maWd1cmF0aW9uX3N1YnRyYWN0ZWRDYXRlZ29yeV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX01ldGhvZENvbmZpZ3VyYXRpb25fc3VidHJhY3RlZENhdGVnb3J5X2ZlYXR1cmUiLCAiX1VJX01ldGhvZENvbmZpZ3VyYXRpb25fdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5NRVRIT0RfQ09ORklHVVJBVElPTl9fU1VCVFJBQ1RFRF9DQVRFR09SWSwKLQkJCQkJCXRydWUsIGZhbHNlLCB0cnVlLCBudWxsLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIEFkZGVkIENhdGVnb3J5IGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkQWRkZWRDYXRlZ29yeVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9NZXRob2RDb25maWd1cmF0aW9uX2FkZGVkQ2F0ZWdvcnlfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9NZXRob2RDb25maWd1cmF0aW9uX2FkZGVkQ2F0ZWdvcnlfZmVhdHVyZSIsICJfVUlfTWV0aG9kQ29uZmlndXJhdGlvbl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLk1FVEhPRF9DT05GSUdVUkFUSU9OX19BRERFRF9DQVRFR09SWSwKLQkJCQkJCXRydWUsIGZhbHNlLCB0cnVlLCBudWxsLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIE1ldGhvZENvbmZpZ3VyYXRpb24uZ2lmLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoCi0JCQkJImZ1bGwvb2JqMTYvTWV0aG9kQ29uZmlndXJhdGlvbiIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChNZXRob2RDb25maWd1cmF0aW9uKSBvYmplY3QpLmdldE5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX01ldGhvZENvbmZpZ3VyYXRpb25fdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCWdldFN0cmluZygiX1VJX01ldGhvZENvbmZpZ3VyYXRpb25fdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuCi0JICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycygKLQkJCUNvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL01ldGhvZEVsZW1lbnRJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9NZXRob2RFbGVtZW50SXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlOTQ2ZjEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL01ldGhvZEVsZW1lbnRJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyMCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db3B5Q29tbWFuZC5IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC5jb21tYW5kLk1ldGhvZEVsZW1lbnRDcmVhdGVDb3B5Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQuY29tbWFuZC5NZXRob2RFbGVtZW50SW5pdGlhbGl6ZUNvcHlDb21tYW5kOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50fSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXRob2RFbGVtZW50SXRlbVByb3ZpZGVyIGV4dGVuZHMgUGFja2FnZWFibGVFbGVtZW50SXRlbVByb3ZpZGVyCi0JCWltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTWV0aG9kRWxlbWVudEl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIExpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlhZGRHdWlkUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRQcmVzZW50YXRpb25OYW1lUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRCcmllZkRlc2NyaXB0aW9uUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRLaW5kUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRTdXBwcmVzc2VkUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRPcmRlcmluZ0d1aWRlUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBHdWlkIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkR3VpZFByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9NZXRob2RFbGVtZW50X2d1aWRfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9NZXRob2RFbGVtZW50X2d1aWRfZmVhdHVyZSIsICJfVUlfTWV0aG9kRWxlbWVudF90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLk1FVEhPRF9FTEVNRU5UX19HVUlELCB0cnVlLCBmYWxzZSwKLQkJCQkJCWZhbHNlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsCi0JCQkJCQludWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFByZXNlbnRhdGlvbiBOYW1lIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkUHJlc2VudGF0aW9uTmFtZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9NZXRob2RFbGVtZW50X3ByZXNlbnRhdGlvbk5hbWVfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9NZXRob2RFbGVtZW50X3ByZXNlbnRhdGlvbk5hbWVfZmVhdHVyZSIsICJfVUlfTWV0aG9kRWxlbWVudF90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLk1FVEhPRF9FTEVNRU5UX19QUkVTRU5UQVRJT05fTkFNRSwKLQkJCQkJCXRydWUsIGZhbHNlLCBmYWxzZSwKLQkJCQkJCUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBCcmllZiBEZXNjcmlwdGlvbiBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEJyaWVmRGVzY3JpcHRpb25Qcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfTWV0aG9kRWxlbWVudF9icmllZkRlc2NyaXB0aW9uX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfTWV0aG9kRWxlbWVudF9icmllZkRlc2NyaXB0aW9uX2ZlYXR1cmUiLCAiX1VJX01ldGhvZEVsZW1lbnRfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5NRVRIT0RfRUxFTUVOVF9fQlJJRUZfREVTQ1JJUFRJT04sCi0JCQkJCQl0cnVlLCBmYWxzZSwgZmFsc2UsCi0JCQkJCQlJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgS2luZCBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEtpbmRQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfTWV0aG9kRWxlbWVudF9raW5kX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfTWV0aG9kRWxlbWVudF9raW5kX2ZlYXR1cmUiLCAiX1VJX01ldGhvZEVsZW1lbnRfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5NRVRIT0RfRUxFTUVOVF9fS0lORCwgdHJ1ZSwgZmFsc2UsCi0JCQkJCQl0cnVlLCBudWxsLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFN1cHByZXNzZWQgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRTdXBwcmVzc2VkUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX01ldGhvZEVsZW1lbnRfc3VwcHJlc3NlZF9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX01ldGhvZEVsZW1lbnRfc3VwcHJlc3NlZF9mZWF0dXJlIiwgIl9VSV9NZXRob2RFbGVtZW50X3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuTUVUSE9EX0VMRU1FTlRfX1NVUFBSRVNTRUQsIHRydWUsCi0JCQkJCQlmYWxzZSwgZmFsc2UsCi0JCQkJCQlJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgT3JkZXJpbmcgR3VpZGUgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRPcmRlcmluZ0d1aWRlUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX01ldGhvZEVsZW1lbnRfb3JkZXJpbmdHdWlkZV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX01ldGhvZEVsZW1lbnRfb3JkZXJpbmdHdWlkZV9mZWF0dXJlIiwgIl9VSV9NZXRob2RFbGVtZW50X3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuTUVUSE9EX0VMRU1FTlRfX09SREVSSU5HX0dVSURFLAotCQkJCQkJdHJ1ZSwgZmFsc2UsIGZhbHNlLAotCQkJCQkJSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBzcGVjaWZpZXMgaG93IHRvIGltcGxlbWVudCB7QGxpbmsgI2dldENoaWxkcmVufSBhbmQgaXMgdXNlZCB0byBkZWR1Y2UgYW4gYXBwcm9wcmlhdGUgZmVhdHVyZSBmb3IgYW4KLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5BZGRDb21tYW5kfSwge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuUmVtb3ZlQ29tbWFuZH0gb3IKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Nb3ZlQ29tbWFuZH0gaW4ge0BsaW5rICNjcmVhdGVDb21tYW5kfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQ29sbGVjdGlvbjw/IGV4dGVuZHMgRVN0cnVjdHVyYWxGZWF0dXJlPiBnZXRDaGlsZHJlbkZlYXR1cmVzKAotCQkJT2JqZWN0IG9iamVjdCkgewotCQlpZiAoY2hpbGRyZW5GZWF0dXJlcyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRDaGlsZHJlbkZlYXR1cmVzKG9iamVjdCk7Ci0JCQljaGlsZHJlbkZlYXR1cmVzCi0JCQkJCS5hZGQoVW1hUGFja2FnZS5MaXRlcmFscy5NRVRIT0RfRUxFTUVOVF9fT1dORURfUlVMRVMpOwotCQkJY2hpbGRyZW5GZWF0dXJlcwotCQkJCQkuYWRkKFVtYVBhY2thZ2UuTGl0ZXJhbHMuTUVUSE9EX0VMRU1FTlRfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW5GZWF0dXJlczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRVN0cnVjdHVyYWxGZWF0dXJlIGdldENoaWxkRmVhdHVyZShPYmplY3Qgb2JqZWN0LCBPYmplY3QgY2hpbGQpIHsKLQkJLy8gQ2hlY2sgdGhlIHR5cGUgb2YgdGhlIHNwZWNpZmllZCBjaGlsZCBvYmplY3QgYW5kIHJldHVybiB0aGUgcHJvcGVyIGZlYXR1cmUgdG8gdXNlIGZvcgotCQkvLyBhZGRpbmcgKHNlZSB7QGxpbmsgQWRkQ29tbWFuZH0pIGl0IGFzIGEgY2hpbGQuCi0KLQkJcmV0dXJuIHN1cGVyLmdldENoaWxkRmVhdHVyZShvYmplY3QsIGNoaWxkKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoTWV0aG9kRWxlbWVudCkgb2JqZWN0KS5nZXROYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9NZXRob2RFbGVtZW50X3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQlnZXRTdHJpbmcoIl9VSV9NZXRob2RFbGVtZW50X3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCi0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChNZXRob2RFbGVtZW50LmNsYXNzKSkgewotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfX0dVSUQ6Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9fUFJFU0VOVEFUSU9OX05BTUU6Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9fQlJJRUZfREVTQ1JJUFRJT046Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9fU1VQUFJFU1NFRDoKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19PUkRFUklOR19HVUlERToKLQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24KLQkJCQkJLmdldE5vdGlmaWVyKCksIGZhbHNlLCB0cnVlKSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9fT1dORURfUlVMRVM6Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk6Ci0JCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uCi0JCQkJCS5nZXROb3RpZmllcigpLCB0cnVlLCBmYWxzZSkpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuCi0JICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycygKLQkJCUNvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5NRVRIT0RfRUxFTUVOVF9fT1dORURfUlVMRVMsCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQ29uc3RyYWludCgpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5NRVRIT0RfRUxFTUVOVF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFksCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlTWV0aG9kRWxlbWVudFByb3BlcnR5KCkpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotCi0JLy8tLS0tLS0tLS0tLS0tLS0tLS0tLy8KLQkvLyBTdGFydCBjdXN0b20gY29kZSAvLwotCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS8vCi0KLQlwcm90ZWN0ZWQgQ29tbWFuZCBjcmVhdGVJbml0aWFsaXplQ29weUNvbW1hbmQoRWRpdGluZ0RvbWFpbiBkb21haW4sCi0JCQlFT2JqZWN0IG93bmVyLCBIZWxwZXIgaGVscGVyKSB7Ci0JCXJldHVybiBuZXcgTWV0aG9kRWxlbWVudEluaXRpYWxpemVDb3B5Q29tbWFuZChkb21haW4sIG93bmVyLCBoZWxwZXIpOwotCX0KLQotCXByb3RlY3RlZCBDb21tYW5kIGNyZWF0ZUNyZWF0ZUNvcHlDb21tYW5kKEVkaXRpbmdEb21haW4gZG9tYWluLAotCQkJRU9iamVjdCBvd25lciwgSGVscGVyIGhlbHBlcikgewotCQlyZXR1cm4gbmV3IE1ldGhvZEVsZW1lbnRDcmVhdGVDb3B5Q29tbWFuZChkb21haW4sIG93bmVyLCBoZWxwZXIpOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9NZXRob2RFbGVtZW50UHJvcGVydHlJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9NZXRob2RFbGVtZW50UHJvcGVydHlJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzUwZjdiMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvTWV0aG9kRWxlbWVudFByb3BlcnR5SXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudFByb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudFByb3BlcnR5fSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXRob2RFbGVtZW50UHJvcGVydHlJdGVtUHJvdmlkZXIgZXh0ZW5kcwotCQlQYWNrYWdlYWJsZUVsZW1lbnRJdGVtUHJvdmlkZXIgaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwKLQkJSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBNZXRob2RFbGVtZW50UHJvcGVydHlJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJYWRkVmFsdWVQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFZhbHVlIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkVmFsdWVQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfTWV0aG9kRWxlbWVudFByb3BlcnR5X3ZhbHVlX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfTWV0aG9kRWxlbWVudFByb3BlcnR5X3ZhbHVlX2ZlYXR1cmUiLCAiX1VJX01ldGhvZEVsZW1lbnRQcm9wZXJ0eV90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLk1FVEhPRF9FTEVNRU5UX1BST1BFUlRZX19WQUxVRSwKLQkJCQkJCXRydWUsIGZhbHNlLCBmYWxzZSwKLQkJCQkJCUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBNZXRob2RFbGVtZW50UHJvcGVydHkuZ2lmLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoCi0JCQkJImZ1bGwvb2JqMTYvTWV0aG9kRWxlbWVudFByb3BlcnR5IikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKE1ldGhvZEVsZW1lbnRQcm9wZXJ0eSkgb2JqZWN0KS5nZXROYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9NZXRob2RFbGVtZW50UHJvcGVydHlfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCWdldFN0cmluZygiX1VJX01ldGhvZEVsZW1lbnRQcm9wZXJ0eV90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoTWV0aG9kRWxlbWVudFByb3BlcnR5LmNsYXNzKSkgewotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFlfX1ZBTFVFOgotCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbgotCQkJCQkuZ2V0Tm90aWZpZXIoKSwgZmFsc2UsIHRydWUpKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbgotCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoCi0JCQlDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9NZXRob2RMaWJyYXJ5SXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvTWV0aG9kTGlicmFyeUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NzZmYjYyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9NZXRob2RMaWJyYXJ5SXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeX0gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgTWV0aG9kTGlicmFyeUl0ZW1Qcm92aWRlciBleHRlbmRzIE1ldGhvZFVuaXRJdGVtUHJvdmlkZXIgaW1wbGVtZW50cwotCQlJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBNZXRob2RMaWJyYXJ5SXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBzcGVjaWZpZXMgaG93IHRvIGltcGxlbWVudCB7QGxpbmsgI2dldENoaWxkcmVufSBhbmQgaXMgdXNlZCB0byBkZWR1Y2UgYW4gYXBwcm9wcmlhdGUgZmVhdHVyZSBmb3IgYW4KLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5BZGRDb21tYW5kfSwge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuUmVtb3ZlQ29tbWFuZH0gb3IKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Nb3ZlQ29tbWFuZH0gaW4ge0BsaW5rICNjcmVhdGVDb21tYW5kfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQ29sbGVjdGlvbjw/IGV4dGVuZHMgRVN0cnVjdHVyYWxGZWF0dXJlPiBnZXRDaGlsZHJlbkZlYXR1cmVzKAotCQkJT2JqZWN0IG9iamVjdCkgewotCQlpZiAoY2hpbGRyZW5GZWF0dXJlcyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRDaGlsZHJlbkZlYXR1cmVzKG9iamVjdCk7Ci0JCQljaGlsZHJlbkZlYXR1cmVzCi0JCQkJCS5hZGQoVW1hUGFja2FnZS5MaXRlcmFscy5NRVRIT0RfTElCUkFSWV9fTUVUSE9EX1BMVUdJTlMpOwotCQkJY2hpbGRyZW5GZWF0dXJlcwotCQkJCQkuYWRkKFVtYVBhY2thZ2UuTGl0ZXJhbHMuTUVUSE9EX0xJQlJBUllfX1BSRURFRklORURfQ09ORklHVVJBVElPTlMpOwotCQl9Ci0JCXJldHVybiBjaGlsZHJlbkZlYXR1cmVzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFU3RydWN0dXJhbEZlYXR1cmUgZ2V0Q2hpbGRGZWF0dXJlKE9iamVjdCBvYmplY3QsIE9iamVjdCBjaGlsZCkgewotCQkvLyBDaGVjayB0aGUgdHlwZSBvZiB0aGUgc3BlY2lmaWVkIGNoaWxkIG9iamVjdCBhbmQgcmV0dXJuIHRoZSBwcm9wZXIgZmVhdHVyZSB0byB1c2UgZm9yCi0JCS8vIGFkZGluZyAoc2VlIHtAbGluayBBZGRDb21tYW5kfSkgaXQgYXMgYSBjaGlsZC4KLQotCQlyZXR1cm4gc3VwZXIuZ2V0Q2hpbGRGZWF0dXJlKG9iamVjdCwgY2hpbGQpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBNZXRob2RMaWJyYXJ5LmdpZi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKAotCQkJCSJmdWxsL29iajE2L01ldGhvZExpYnJhcnkiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoTWV0aG9kTGlicmFyeSkgb2JqZWN0KS5nZXROYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9NZXRob2RMaWJyYXJ5X3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQlnZXRTdHJpbmcoIl9VSV9NZXRob2RMaWJyYXJ5X3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCi0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChNZXRob2RMaWJyYXJ5LmNsYXNzKSkgewotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0xJQlJBUllfX01FVEhPRF9QTFVHSU5TOgotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0xJQlJBUllfX1BSRURFRklORURfQ09ORklHVVJBVElPTlM6Ci0JCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uCi0JCQkJCS5nZXROb3RpZmllcigpLCB0cnVlLCBmYWxzZSkpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuCi0JICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycygKLQkJCUNvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5NRVRIT0RfTElCUkFSWV9fTUVUSE9EX1BMVUdJTlMsCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlTWV0aG9kUGx1Z2luKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcigKLQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLk1FVEhPRF9MSUJSQVJZX19QUkVERUZJTkVEX0NPTkZJR1VSQVRJT05TLAotCQkJCVVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZU1ldGhvZENvbmZpZ3VyYXRpb24oKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKAotCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuTUVUSE9EX0xJQlJBUllfX1BSRURFRklORURfQ09ORklHVVJBVElPTlMsCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUHJvY2Vzc0ZhbWlseSgpKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL01ldGhvZFBhY2thZ2VJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9NZXRob2RQYWNrYWdlSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyYTY2ZjkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL01ldGhvZFBhY2thZ2VJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxMyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGFja2FnZX0gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgTWV0aG9kUGFja2FnZUl0ZW1Qcm92aWRlciBleHRlbmRzIE1ldGhvZEVsZW1lbnRJdGVtUHJvdmlkZXIKLQkJaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBNZXRob2RQYWNrYWdlSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCWFkZEdsb2JhbFByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkUmV1c2VkUGFja2FnZXNQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIEdsb2JhbCBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEdsb2JhbFByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9NZXRob2RQYWNrYWdlX2dsb2JhbF9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX01ldGhvZFBhY2thZ2VfZ2xvYmFsX2ZlYXR1cmUiLCAiX1VJX01ldGhvZFBhY2thZ2VfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5NRVRIT0RfUEFDS0FHRV9fR0xPQkFMLCB0cnVlLAotCQkJCQkJZmFsc2UsIGZhbHNlLAotCQkJCQkJSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFJldXNlZCBQYWNrYWdlcyBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFJldXNlZFBhY2thZ2VzUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX01ldGhvZFBhY2thZ2VfcmV1c2VkUGFja2FnZXNfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9NZXRob2RQYWNrYWdlX3JldXNlZFBhY2thZ2VzX2ZlYXR1cmUiLCAiX1VJX01ldGhvZFBhY2thZ2VfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5NRVRIT0RfUEFDS0FHRV9fUkVVU0VEX1BBQ0tBR0VTLAotCQkJCQkJdHJ1ZSwgZmFsc2UsIHRydWUsIG51bGwsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHNwZWNpZmllcyBob3cgdG8gaW1wbGVtZW50IHtAbGluayAjZ2V0Q2hpbGRyZW59IGFuZCBpcyB1c2VkIHRvIGRlZHVjZSBhbiBhcHByb3ByaWF0ZSBmZWF0dXJlIGZvciBhbgotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkFkZENvbW1hbmR9LCB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5SZW1vdmVDb21tYW5kfSBvcgotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLk1vdmVDb21tYW5kfSBpbiB7QGxpbmsgI2NyZWF0ZUNvbW1hbmR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBDb2xsZWN0aW9uPD8gZXh0ZW5kcyBFU3RydWN0dXJhbEZlYXR1cmU+IGdldENoaWxkcmVuRmVhdHVyZXMoCi0JCQlPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlbkZlYXR1cmVzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldENoaWxkcmVuRmVhdHVyZXMob2JqZWN0KTsKLQkJCWNoaWxkcmVuRmVhdHVyZXMKLQkJCQkJLmFkZChVbWFQYWNrYWdlLkxpdGVyYWxzLk1FVEhPRF9QQUNLQUdFX19DSElMRF9QQUNLQUdFUyk7Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuRmVhdHVyZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVTdHJ1Y3R1cmFsRmVhdHVyZSBnZXRDaGlsZEZlYXR1cmUoT2JqZWN0IG9iamVjdCwgT2JqZWN0IGNoaWxkKSB7Ci0JCS8vIENoZWNrIHRoZSB0eXBlIG9mIHRoZSBzcGVjaWZpZWQgY2hpbGQgb2JqZWN0IGFuZCByZXR1cm4gdGhlIHByb3BlciBmZWF0dXJlIHRvIHVzZSBmb3IKLQkJLy8gYWRkaW5nIChzZWUge0BsaW5rIEFkZENvbW1hbmR9KSBpdCBhcyBhIGNoaWxkLgotCi0JCXJldHVybiBzdXBlci5nZXRDaGlsZEZlYXR1cmUob2JqZWN0LCBjaGlsZCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKE1ldGhvZFBhY2thZ2UpIG9iamVjdCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfTWV0aG9kUGFja2FnZV90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJZ2V0U3RyaW5nKCJfVUlfTWV0aG9kUGFja2FnZV90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoTWV0aG9kUGFja2FnZS5jbGFzcykpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9QQUNLQUdFX19HTE9CQUw6Ci0JCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uCi0JCQkJCS5nZXROb3RpZmllcigpLCBmYWxzZSwgdHJ1ZSkpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1BBQ0tBR0VfX0NISUxEX1BBQ0tBR0VTOgotCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbgotCQkJCQkuZ2V0Tm90aWZpZXIoKSwgdHJ1ZSwgZmFsc2UpKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbgotCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoCi0JCQlDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKAotCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuTUVUSE9EX1BBQ0tBR0VfX0NISUxEX1BBQ0tBR0VTLAotCQkJCVVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUNvbnRlbnRQYWNrYWdlKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcigKLQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLk1FVEhPRF9QQUNLQUdFX19DSElMRF9QQUNLQUdFUywKLQkJCQlVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQcm9jZXNzUGFja2FnZSgpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5NRVRIT0RfUEFDS0FHRV9fQ0hJTERfUEFDS0FHRVMsCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUHJvY2Vzc0NvbXBvbmVudCgpKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL01ldGhvZFBsdWdpbkl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL01ldGhvZFBsdWdpbkl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMmQ2M2Q0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9NZXRob2RQbHVnaW5JdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW59IG9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIE1ldGhvZFBsdWdpbkl0ZW1Qcm92aWRlciBleHRlbmRzIE1ldGhvZFVuaXRJdGVtUHJvdmlkZXIgaW1wbGVtZW50cwotCQlJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBNZXRob2RQbHVnaW5JdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJYWRkVXNlckNoYW5nZWFibGVQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZEJhc2VzUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRTdXBwb3J0aW5nUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBVc2VyIENoYW5nZWFibGUgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRVc2VyQ2hhbmdlYWJsZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9NZXRob2RQbHVnaW5fdXNlckNoYW5nZWFibGVfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9NZXRob2RQbHVnaW5fdXNlckNoYW5nZWFibGVfZmVhdHVyZSIsICJfVUlfTWV0aG9kUGx1Z2luX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuTUVUSE9EX1BMVUdJTl9fVVNFUl9DSEFOR0VBQkxFLAotCQkJCQkJdHJ1ZSwgZmFsc2UsIGZhbHNlLAotCQkJCQkJSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIEJhc2VzIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkQmFzZXNQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfTWV0aG9kUGx1Z2luX2Jhc2VzX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfTWV0aG9kUGx1Z2luX2Jhc2VzX2ZlYXR1cmUiLCAiX1VJX01ldGhvZFBsdWdpbl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLk1FVEhPRF9QTFVHSU5fX0JBU0VTLCB0cnVlLCBmYWxzZSwKLQkJCQkJCXRydWUsIG51bGwsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgU3VwcG9ydGluZyBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFN1cHBvcnRpbmdQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfTWV0aG9kUGx1Z2luX3N1cHBvcnRpbmdfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9NZXRob2RQbHVnaW5fc3VwcG9ydGluZ19mZWF0dXJlIiwgIl9VSV9NZXRob2RQbHVnaW5fdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5NRVRIT0RfUExVR0lOX19TVVBQT1JUSU5HLCB0cnVlLAotCQkJCQkJZmFsc2UsIGZhbHNlLAotCQkJCQkJSXRlbVByb3BlcnR5RGVzY3JpcHRvci5CT09MRUFOX1ZBTFVFX0lNQUdFLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBzcGVjaWZpZXMgaG93IHRvIGltcGxlbWVudCB7QGxpbmsgI2dldENoaWxkcmVufSBhbmQgaXMgdXNlZCB0byBkZWR1Y2UgYW4gYXBwcm9wcmlhdGUgZmVhdHVyZSBmb3IgYW4KLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5BZGRDb21tYW5kfSwge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuUmVtb3ZlQ29tbWFuZH0gb3IKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Nb3ZlQ29tbWFuZH0gaW4ge0BsaW5rICNjcmVhdGVDb21tYW5kfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQ29sbGVjdGlvbjw/IGV4dGVuZHMgRVN0cnVjdHVyYWxGZWF0dXJlPiBnZXRDaGlsZHJlbkZlYXR1cmVzKAotCQkJT2JqZWN0IG9iamVjdCkgewotCQlpZiAoY2hpbGRyZW5GZWF0dXJlcyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRDaGlsZHJlbkZlYXR1cmVzKG9iamVjdCk7Ci0JCQljaGlsZHJlbkZlYXR1cmVzCi0JCQkJCS5hZGQoVW1hUGFja2FnZS5MaXRlcmFscy5NRVRIT0RfUExVR0lOX19NRVRIT0RfUEFDS0FHRVMpOwotCQl9Ci0JCXJldHVybiBjaGlsZHJlbkZlYXR1cmVzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFU3RydWN0dXJhbEZlYXR1cmUgZ2V0Q2hpbGRGZWF0dXJlKE9iamVjdCBvYmplY3QsIE9iamVjdCBjaGlsZCkgewotCQkvLyBDaGVjayB0aGUgdHlwZSBvZiB0aGUgc3BlY2lmaWVkIGNoaWxkIG9iamVjdCBhbmQgcmV0dXJuIHRoZSBwcm9wZXIgZmVhdHVyZSB0byB1c2UgZm9yCi0JCS8vIGFkZGluZyAoc2VlIHtAbGluayBBZGRDb21tYW5kfSkgaXQgYXMgYSBjaGlsZC4KLQotCQlyZXR1cm4gc3VwZXIuZ2V0Q2hpbGRGZWF0dXJlKG9iamVjdCwgY2hpbGQpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBNZXRob2RQbHVnaW4uZ2lmLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoCi0JCQkJImZ1bGwvb2JqMTYvTWV0aG9kUGx1Z2luIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKE1ldGhvZFBsdWdpbikgb2JqZWN0KS5nZXROYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9NZXRob2RQbHVnaW5fdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCWdldFN0cmluZygiX1VJX01ldGhvZFBsdWdpbl90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoTWV0aG9kUGx1Z2luLmNsYXNzKSkgewotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1BMVUdJTl9fVVNFUl9DSEFOR0VBQkxFOgotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1BMVUdJTl9fU1VQUE9SVElORzoKLQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24KLQkJCQkJLmdldE5vdGlmaWVyKCksIGZhbHNlLCB0cnVlKSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfUExVR0lOX19NRVRIT0RfUEFDS0FHRVM6Ci0JCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uCi0JCQkJCS5nZXROb3RpZmllcigpLCB0cnVlLCBmYWxzZSkpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuCi0JICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycygKLQkJCUNvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5NRVRIT0RfUExVR0lOX19NRVRIT0RfUEFDS0FHRVMsCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQ29udGVudFBhY2thZ2UoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKAotCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuTUVUSE9EX1BMVUdJTl9fTUVUSE9EX1BBQ0tBR0VTLAotCQkJCVVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVByb2Nlc3NQYWNrYWdlKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcigKLQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLk1FVEhPRF9QTFVHSU5fX01FVEhPRF9QQUNLQUdFUywKLQkJCQlVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQcm9jZXNzQ29tcG9uZW50KCkpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvTWV0aG9kVW5pdEl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL01ldGhvZFVuaXRJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDY2ZGQwZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvTWV0aG9kVW5pdEl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RVbml0fSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXRob2RVbml0SXRlbVByb3ZpZGVyIGV4dGVuZHMgTWV0aG9kRWxlbWVudEl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzCi0JCUlFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE1ldGhvZFVuaXRJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJYWRkQXV0aG9yc1Byb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkQ2hhbmdlRGF0ZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkQ2hhbmdlRGVzY3JpcHRpb25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZFZlcnNpb25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZENvcHlyaWdodFN0YXRlbWVudFByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgQXV0aG9ycyBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEF1dGhvcnNQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfTWV0aG9kVW5pdF9hdXRob3JzX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfTWV0aG9kVW5pdF9hdXRob3JzX2ZlYXR1cmUiLCAiX1VJX01ldGhvZFVuaXRfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5NRVRIT0RfVU5JVF9fQVVUSE9SUywgdHJ1ZSwgZmFsc2UsCi0JCQkJCQlmYWxzZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLAotCQkJCQkJbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBDaGFuZ2UgRGF0ZSBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZENoYW5nZURhdGVQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfTWV0aG9kVW5pdF9jaGFuZ2VEYXRlX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfTWV0aG9kVW5pdF9jaGFuZ2VEYXRlX2ZlYXR1cmUiLCAiX1VJX01ldGhvZFVuaXRfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5NRVRIT0RfVU5JVF9fQ0hBTkdFX0RBVEUsIHRydWUsCi0JCQkJCQlmYWxzZSwgZmFsc2UsCi0JCQkJCQlJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgQ2hhbmdlIERlc2NyaXB0aW9uIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkQ2hhbmdlRGVzY3JpcHRpb25Qcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfTWV0aG9kVW5pdF9jaGFuZ2VEZXNjcmlwdGlvbl9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX01ldGhvZFVuaXRfY2hhbmdlRGVzY3JpcHRpb25fZmVhdHVyZSIsICJfVUlfTWV0aG9kVW5pdF90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLk1FVEhPRF9VTklUX19DSEFOR0VfREVTQ1JJUFRJT04sCi0JCQkJCQl0cnVlLCBmYWxzZSwgZmFsc2UsCi0JCQkJCQlJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgVmVyc2lvbiBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFZlcnNpb25Qcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfTWV0aG9kVW5pdF92ZXJzaW9uX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfTWV0aG9kVW5pdF92ZXJzaW9uX2ZlYXR1cmUiLCAiX1VJX01ldGhvZFVuaXRfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5NRVRIT0RfVU5JVF9fVkVSU0lPTiwgdHJ1ZSwgZmFsc2UsCi0JCQkJCQlmYWxzZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLAotCQkJCQkJbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBDb3B5cmlnaHQgU3RhdGVtZW50IGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkQ29weXJpZ2h0U3RhdGVtZW50UHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX01ldGhvZFVuaXRfY29weXJpZ2h0U3RhdGVtZW50X2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfTWV0aG9kVW5pdF9jb3B5cmlnaHRTdGF0ZW1lbnRfZmVhdHVyZSIsICJfVUlfTWV0aG9kVW5pdF90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLk1FVEhPRF9VTklUX19DT1BZUklHSFRfU1RBVEVNRU5ULAotCQkJCQkJdHJ1ZSwgZmFsc2UsIHRydWUsIG51bGwsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoTWV0aG9kVW5pdCkgb2JqZWN0KS5nZXROYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9NZXRob2RVbml0X3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQlnZXRTdHJpbmcoIl9VSV9NZXRob2RVbml0X3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCi0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChNZXRob2RVbml0LmNsYXNzKSkgewotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1VOSVRfX0FVVEhPUlM6Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfVU5JVF9fQ0hBTkdFX0RBVEU6Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfVU5JVF9fQ0hBTkdFX0RFU0NSSVBUSU9OOgotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1VOSVRfX1ZFUlNJT046Ci0JCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uCi0JCQkJCS5nZXROb3RpZmllcigpLCBmYWxzZSwgdHJ1ZSkpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuCi0JICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycygKLQkJCUNvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL01pbGVzdG9uZUl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL01pbGVzdG9uZUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZWJjYzhkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9NaWxlc3RvbmVJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NaWxlc3RvbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NaWxlc3RvbmV9IG9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIE1pbGVzdG9uZUl0ZW1Qcm92aWRlciBleHRlbmRzIFdvcmtCcmVha2Rvd25FbGVtZW50SXRlbVByb3ZpZGVyCi0JCWltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTWlsZXN0b25lSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCWFkZFJlcXVpcmVkUmVzdWx0c1Byb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgUmVxdWlyZWQgUmVzdWx0cyBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFJlcXVpcmVkUmVzdWx0c1Byb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9NaWxlc3RvbmVfcmVxdWlyZWRSZXN1bHRzX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfTWlsZXN0b25lX3JlcXVpcmVkUmVzdWx0c19mZWF0dXJlIiwgIl9VSV9NaWxlc3RvbmVfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5NSUxFU1RPTkVfX1JFUVVJUkVEX1JFU1VMVFMsIHRydWUsCi0JCQkJCQlmYWxzZSwgdHJ1ZSwgbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBNaWxlc3RvbmUuZ2lmLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoCi0JCQkJImZ1bGwvb2JqMTYvTWlsZXN0b25lIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKE1pbGVzdG9uZSkgb2JqZWN0KS5nZXROYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9NaWxlc3RvbmVfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCWdldFN0cmluZygiX1VJX01pbGVzdG9uZV90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4KLQkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKAotCQkJQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvTmFtZWRFbGVtZW50SXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvTmFtZWRFbGVtZW50SXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxYWY2OGEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL05hbWVkRWxlbWVudEl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk5hbWVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk5hbWVkRWxlbWVudH0gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgTmFtZWRFbGVtZW50SXRlbVByb3ZpZGVyIGV4dGVuZHMgRWxlbWVudEl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzCi0JCUlFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5hbWVkRWxlbWVudEl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIExpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlhZGROYW1lUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBOYW1lIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkTmFtZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9OYW1lZEVsZW1lbnRfbmFtZV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX05hbWVkRWxlbWVudF9uYW1lX2ZlYXR1cmUiLCAiX1VJX05hbWVkRWxlbWVudF90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLk5BTUVEX0VMRU1FTlRfX05BTUUsIHRydWUsIGZhbHNlLAotCQkJCQkJZmFsc2UsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwKLQkJCQkJCW51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoTmFtZWRFbGVtZW50KSBvYmplY3QpLmdldE5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX05hbWVkRWxlbWVudF90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJZ2V0U3RyaW5nKCJfVUlfTmFtZWRFbGVtZW50X3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCi0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChOYW1lZEVsZW1lbnQuY2xhc3MpKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5OQU1FRF9FTEVNRU5UX19OQU1FOgotCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbgotCQkJCQkuZ2V0Tm90aWZpZXIoKSwgZmFsc2UsIHRydWUpKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbgotCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoCi0JCQlDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9OYW1lc3BhY2VJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9OYW1lc3BhY2VJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWVkNzgzYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvTmFtZXNwYWNlSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk5hbWVzcGFjZTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTmFtZXNwYWNlfSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBOYW1lc3BhY2VJdGVtUHJvdmlkZXIgZXh0ZW5kcyBOYW1lZEVsZW1lbnRJdGVtUHJvdmlkZXIgaW1wbGVtZW50cwotCQlJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOYW1lc3BhY2VJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoTmFtZXNwYWNlKSBvYmplY3QpLmdldE5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX05hbWVzcGFjZV90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJZ2V0U3RyaW5nKCJfVUlfTmFtZXNwYWNlX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbgotCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoCi0JCQlDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9PdXRjb21lSXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvT3V0Y29tZUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NGI5ZTZkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9PdXRjb21lSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk91dGNvbWU7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk91dGNvbWV9IG9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIE91dGNvbWVJdGVtUHJvdmlkZXIgZXh0ZW5kcyBXb3JrUHJvZHVjdEl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzCi0JCUlFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE91dGNvbWVJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgT3V0Y29tZS5naWYuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgKLQkJCQkiZnVsbC9vYmoxNi9PdXRjb21lIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKE91dGNvbWUpIG9iamVjdCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfT3V0Y29tZV90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJZ2V0U3RyaW5nKCJfVUlfT3V0Y29tZV90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4KLQkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKAotCQkJQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvUGFja2FnZUl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1BhY2thZ2VJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTgyYWViMy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvUGFja2FnZUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlBhY2thZ2V9IG9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFBhY2thZ2VJdGVtUHJvdmlkZXIgZXh0ZW5kcyBOYW1lc3BhY2VJdGVtUHJvdmlkZXIgaW1wbGVtZW50cwotCQlJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQYWNrYWdlSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIFBhY2thZ2UuZ2lmLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoCi0JCQkJImZ1bGwvb2JqMTYvUGFja2FnZSIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChvcmcuZWNsaXBzZS5lcGYudW1hLlBhY2thZ2UpIG9iamVjdCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfUGFja2FnZV90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJZ2V0U3RyaW5nKCJfVUlfUGFja2FnZV90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4KLQkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKAotCQkJQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvUGFja2FnZWFibGVFbGVtZW50SXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvUGFja2FnZWFibGVFbGVtZW50SXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4ZDg1ZDYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1BhY2thZ2VhYmxlRWxlbWVudEl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTExICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5QYWNrYWdlYWJsZUVsZW1lbnQ7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlBhY2thZ2VhYmxlRWxlbWVudH0gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUGFja2FnZWFibGVFbGVtZW50SXRlbVByb3ZpZGVyIGV4dGVuZHMgTmFtZWRFbGVtZW50SXRlbVByb3ZpZGVyCi0JCWltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUGFja2FnZWFibGVFbGVtZW50SXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKFBhY2thZ2VhYmxlRWxlbWVudCkgb2JqZWN0KS5nZXROYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9QYWNrYWdlYWJsZUVsZW1lbnRfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCWdldFN0cmluZygiX1VJX1BhY2thZ2VhYmxlRWxlbWVudF90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4KLQkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKAotCQkJQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvUGhhc2VJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9QaGFzZUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzN2IyY2FkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9QaGFzZUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5QaGFzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlBoYXNlfSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBQaGFzZUl0ZW1Qcm92aWRlciBleHRlbmRzIEFjdGl2aXR5SXRlbVByb3ZpZGVyIGltcGxlbWVudHMKLQkJSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUGhhc2VJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgUGhhc2UuZ2lmLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoCi0JCQkJImZ1bGwvb2JqMTYvUGhhc2UiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoUGhhc2UpIG9iamVjdCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfUGhhc2VfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCWdldFN0cmluZygiX1VJX1BoYXNlX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbgotCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoCi0JCQlDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3Ige0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ3JlYXRlQ2hpbGRDb21tYW5kfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldENyZWF0ZUNoaWxkVGV4dChPYmplY3Qgb3duZXIsIE9iamVjdCBmZWF0dXJlLAotCQkJT2JqZWN0IGNoaWxkLCBDb2xsZWN0aW9uPD8+IHNlbGVjdGlvbikgewotCQlPYmplY3QgY2hpbGRGZWF0dXJlID0gZmVhdHVyZTsKLQkJT2JqZWN0IGNoaWxkT2JqZWN0ID0gY2hpbGQ7Ci0KLQkJYm9vbGVhbiBxdWFsaWZ5ID0gY2hpbGRGZWF0dXJlID09IFVtYVBhY2thZ2UuTGl0ZXJhbHMuTUVUSE9EX0VMRU1FTlRfX09XTkVEX1JVTEVTCi0JCQkJfHwgY2hpbGRGZWF0dXJlID09IFVtYVBhY2thZ2UuTGl0ZXJhbHMuV09SS19ERUZJTklUSU9OX19QUkVDT05ESVRJT04KLQkJCQl8fCBjaGlsZEZlYXR1cmUgPT0gVW1hUGFja2FnZS5MaXRlcmFscy5XT1JLX0RFRklOSVRJT05fX1BPU1RDT05ESVRJT047Ci0KLQkJaWYgKHF1YWxpZnkpIHsKLQkJCXJldHVybiBnZXRTdHJpbmcoIl9VSV9DcmVhdGVDaGlsZF90ZXh0MiIsIC8vJE5PTi1OTFMtMSQKLQkJCQkJbmV3IE9iamVjdFtdIHsgZ2V0VHlwZVRleHQoY2hpbGRPYmplY3QpLAotCQkJCQkJCWdldEZlYXR1cmVUZXh0KGNoaWxkRmVhdHVyZSksIGdldFR5cGVUZXh0KG93bmVyKSB9KTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0Q3JlYXRlQ2hpbGRUZXh0KG93bmVyLCBmZWF0dXJlLCBjaGlsZCwgc2VsZWN0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvUGxhbm5pbmdEYXRhSXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvUGxhbm5pbmdEYXRhSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyZjZmMjMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1BsYW5uaW5nRGF0YUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlBsYW5uaW5nRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlBsYW5uaW5nRGF0YX0gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUGxhbm5pbmdEYXRhSXRlbVByb3ZpZGVyIGV4dGVuZHMgUHJvY2Vzc0VsZW1lbnRJdGVtUHJvdmlkZXIKLQkJaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQbGFubmluZ0RhdGFJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJYWRkU3RhcnREYXRlUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRGaW5pc2hEYXRlUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRSYW5rUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBTdGFydCBEYXRlIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkU3RhcnREYXRlUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX1BsYW5uaW5nRGF0YV9zdGFydERhdGVfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9QbGFubmluZ0RhdGFfc3RhcnREYXRlX2ZlYXR1cmUiLCAiX1VJX1BsYW5uaW5nRGF0YV90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLlBMQU5OSU5HX0RBVEFfX1NUQVJUX0RBVEUsIHRydWUsCi0JCQkJCQlmYWxzZSwgZmFsc2UsCi0JCQkJCQlJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgRmluaXNoIERhdGUgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRGaW5pc2hEYXRlUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX1BsYW5uaW5nRGF0YV9maW5pc2hEYXRlX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfUGxhbm5pbmdEYXRhX2ZpbmlzaERhdGVfZmVhdHVyZSIsICJfVUlfUGxhbm5pbmdEYXRhX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuUExBTk5JTkdfREFUQV9fRklOSVNIX0RBVEUsIHRydWUsCi0JCQkJCQlmYWxzZSwgZmFsc2UsCi0JCQkJCQlJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgUmFuayBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFJhbmtQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfUGxhbm5pbmdEYXRhX3JhbmtfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9QbGFubmluZ0RhdGFfcmFua19mZWF0dXJlIiwgIl9VSV9QbGFubmluZ0RhdGFfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5QTEFOTklOR19EQVRBX19SQU5LLCB0cnVlLCBmYWxzZSwKLQkJCQkJCWZhbHNlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLklOVEVHUkFMX1ZBTFVFX0lNQUdFLAotCQkJCQkJbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBQbGFubmluZ0RhdGEuZ2lmLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoCi0JCQkJImZ1bGwvb2JqMTYvUGxhbm5pbmdEYXRhIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKFBsYW5uaW5nRGF0YSkgb2JqZWN0KS5nZXROYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9QbGFubmluZ0RhdGFfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCWdldFN0cmluZygiX1VJX1BsYW5uaW5nRGF0YV90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoUGxhbm5pbmdEYXRhLmNsYXNzKSkgewotCQljYXNlIFVtYVBhY2thZ2UuUExBTk5JTkdfREFUQV9fU1RBUlRfREFURToKLQkJY2FzZSBVbWFQYWNrYWdlLlBMQU5OSU5HX0RBVEFfX0ZJTklTSF9EQVRFOgotCQljYXNlIFVtYVBhY2thZ2UuUExBTk5JTkdfREFUQV9fUkFOSzoKLQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24KLQkJCQkJLmdldE5vdGlmaWVyKCksIGZhbHNlLCB0cnVlKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4KLQkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKAotCQkJQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvUG9pbnRJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9Qb2ludEl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZDczNTdhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9Qb2ludEl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qb2ludH0gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUG9pbnRJdGVtUHJvdmlkZXIgZXh0ZW5kcyBJdGVtUHJvdmlkZXJBZGFwdGVyIGltcGxlbWVudHMKLQkJSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUG9pbnRJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJYWRkWFByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkWVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgWCBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFhQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfUG9pbnRfeF9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1BvaW50X3hfZmVhdHVyZSIsICJfVUlfUG9pbnRfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5QT0lOVF9fWCwgdHJ1ZSwgZmFsc2UsIGZhbHNlLAotCQkJCQkJSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFkgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRZUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX1BvaW50X3lfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9Qb2ludF95X2ZlYXR1cmUiLCAiX1VJX1BvaW50X3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuUE9JTlRfX1ksIHRydWUsIGZhbHNlLCBmYWxzZSwKLQkJCQkJCUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBQb2ludC5naWYuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgKLQkJCQkiZnVsbC9vYmoxNi9Qb2ludCIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJRG91YmxlIGxhYmVsVmFsdWUgPSAoKFBvaW50KSBvYmplY3QpLmdldFgoKTsKLQkJU3RyaW5nIGxhYmVsID0gbGFiZWxWYWx1ZSA9PSBudWxsID8gbnVsbCA6IGxhYmVsVmFsdWUudG9TdHJpbmcoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX1BvaW50X3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQlnZXRTdHJpbmcoIl9VSV9Qb2ludF90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoUG9pbnQuY2xhc3MpKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5QT0lOVF9fWDoKLQkJY2FzZSBVbWFQYWNrYWdlLlBPSU5UX19ZOgotCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbgotCQkJCQkuZ2V0Tm90aWZpZXIoKSwgZmFsc2UsIHRydWUpKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbgotCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoCi0JCQlDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9Qb2x5bGluZUl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1BvbHlsaW5lSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiZmQ3OWEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1BvbHlsaW5lSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qb2x5bGluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qb2x5bGluZX0gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUG9seWxpbmVJdGVtUHJvdmlkZXIgZXh0ZW5kcyBHcmFwaGljUHJpbWl0aXZlSXRlbVByb3ZpZGVyCi0JCWltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUG9seWxpbmVJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJYWRkQ2xvc2VkUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBDbG9zZWQgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRDbG9zZWRQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfUG9seWxpbmVfY2xvc2VkX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfUG9seWxpbmVfY2xvc2VkX2ZlYXR1cmUiLCAiX1VJX1BvbHlsaW5lX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuUE9MWUxJTkVfX0NMT1NFRCwgdHJ1ZSwgZmFsc2UsCi0JCQkJCQlmYWxzZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLAotCQkJCQkJbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgc3BlY2lmaWVzIGhvdyB0byBpbXBsZW1lbnQge0BsaW5rICNnZXRDaGlsZHJlbn0gYW5kIGlzIHVzZWQgdG8gZGVkdWNlIGFuIGFwcHJvcHJpYXRlIGZlYXR1cmUgZm9yIGFuCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQWRkQ29tbWFuZH0sIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLlJlbW92ZUNvbW1hbmR9IG9yCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuTW92ZUNvbW1hbmR9IGluIHtAbGluayAjY3JlYXRlQ29tbWFuZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIENvbGxlY3Rpb248PyBleHRlbmRzIEVTdHJ1Y3R1cmFsRmVhdHVyZT4gZ2V0Q2hpbGRyZW5GZWF0dXJlcygKLQkJCU9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGNoaWxkcmVuRmVhdHVyZXMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0Q2hpbGRyZW5GZWF0dXJlcyhvYmplY3QpOwotCQkJY2hpbGRyZW5GZWF0dXJlcy5hZGQoVW1hUGFja2FnZS5MaXRlcmFscy5QT0xZTElORV9fV0FZUE9JTlRTKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW5GZWF0dXJlczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRVN0cnVjdHVyYWxGZWF0dXJlIGdldENoaWxkRmVhdHVyZShPYmplY3Qgb2JqZWN0LCBPYmplY3QgY2hpbGQpIHsKLQkJLy8gQ2hlY2sgdGhlIHR5cGUgb2YgdGhlIHNwZWNpZmllZCBjaGlsZCBvYmplY3QgYW5kIHJldHVybiB0aGUgcHJvcGVyIGZlYXR1cmUgdG8gdXNlIGZvcgotCQkvLyBhZGRpbmcgKHNlZSB7QGxpbmsgQWRkQ29tbWFuZH0pIGl0IGFzIGEgY2hpbGQuCi0KLQkJcmV0dXJuIHN1cGVyLmdldENoaWxkRmVhdHVyZShvYmplY3QsIGNoaWxkKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgUG9seWxpbmUuZ2lmLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoCi0JCQkJImZ1bGwvb2JqMTYvUG9seWxpbmUiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoUG9seWxpbmUpIG9iamVjdCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfUG9seWxpbmVfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCWdldFN0cmluZygiX1VJX1BvbHlsaW5lX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCi0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChQb2x5bGluZS5jbGFzcykpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlBPTFlMSU5FX19DTE9TRUQ6Ci0JCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uCi0JCQkJCS5nZXROb3RpZmllcigpLCBmYWxzZSwgdHJ1ZSkpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuUE9MWUxJTkVfX1dBWVBPSU5UUzoKLQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24KLQkJCQkJLmdldE5vdGlmaWVyKCksIHRydWUsIGZhbHNlKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4KLQkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKAotCQkJQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcigKLQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLlBPTFlMSU5FX19XQVlQT0lOVFMsIFVtYUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJCQkuY3JlYXRlUG9pbnQoKSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9QcmFjdGljZURlc2NyaXB0aW9uSXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvUHJhY3RpY2VEZXNjcmlwdGlvbkl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZjFlYTNkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9QcmFjdGljZURlc2NyaXB0aW9uSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJhY3RpY2VEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlByYWN0aWNlRGVzY3JpcHRpb259IG9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFByYWN0aWNlRGVzY3JpcHRpb25JdGVtUHJvdmlkZXIgZXh0ZW5kcwotCQlDb250ZW50RGVzY3JpcHRpb25JdGVtUHJvdmlkZXIgaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwKLQkJSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQcmFjdGljZURlc2NyaXB0aW9uSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCWFkZEFkZGl0aW9uYWxJbmZvUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRQcm9ibGVtUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRCYWNrZ3JvdW5kUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRHb2Fsc1Byb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkQXBwbGljYXRpb25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZExldmVsc09mQWRvcHRpb25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIEFkZGl0aW9uYWwgSW5mbyBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEFkZGl0aW9uYWxJbmZvUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX1ByYWN0aWNlRGVzY3JpcHRpb25fYWRkaXRpb25hbEluZm9fZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9QcmFjdGljZURlc2NyaXB0aW9uX2FkZGl0aW9uYWxJbmZvX2ZlYXR1cmUiLCAiX1VJX1ByYWN0aWNlRGVzY3JpcHRpb25fdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5QUkFDVElDRV9ERVNDUklQVElPTl9fQURESVRJT05BTF9JTkZPLAotCQkJCQkJdHJ1ZSwgZmFsc2UsIGZhbHNlLAotCQkJCQkJSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFByb2JsZW0gZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRQcm9ibGVtUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX1ByYWN0aWNlRGVzY3JpcHRpb25fcHJvYmxlbV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1ByYWN0aWNlRGVzY3JpcHRpb25fcHJvYmxlbV9mZWF0dXJlIiwgIl9VSV9QcmFjdGljZURlc2NyaXB0aW9uX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX1BST0JMRU0sCi0JCQkJCQl0cnVlLCBmYWxzZSwgZmFsc2UsCi0JCQkJCQlJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgQmFja2dyb3VuZCBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEJhY2tncm91bmRQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJhY3RpY2VEZXNjcmlwdGlvbl9iYWNrZ3JvdW5kX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfUHJhY3RpY2VEZXNjcmlwdGlvbl9iYWNrZ3JvdW5kX2ZlYXR1cmUiLCAiX1VJX1ByYWN0aWNlRGVzY3JpcHRpb25fdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5QUkFDVElDRV9ERVNDUklQVElPTl9fQkFDS0dST1VORCwKLQkJCQkJCXRydWUsIGZhbHNlLCBmYWxzZSwKLQkJCQkJCUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBHb2FscyBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEdvYWxzUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX1ByYWN0aWNlRGVzY3JpcHRpb25fZ29hbHNfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9QcmFjdGljZURlc2NyaXB0aW9uX2dvYWxzX2ZlYXR1cmUiLCAiX1VJX1ByYWN0aWNlRGVzY3JpcHRpb25fdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5QUkFDVElDRV9ERVNDUklQVElPTl9fR09BTFMsIHRydWUsCi0JCQkJCQlmYWxzZSwgZmFsc2UsCi0JCQkJCQlJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgQXBwbGljYXRpb24gZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRBcHBsaWNhdGlvblByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9QcmFjdGljZURlc2NyaXB0aW9uX2FwcGxpY2F0aW9uX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfUHJhY3RpY2VEZXNjcmlwdGlvbl9hcHBsaWNhdGlvbl9mZWF0dXJlIiwgIl9VSV9QcmFjdGljZURlc2NyaXB0aW9uX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0FQUExJQ0FUSU9OLAotCQkJCQkJdHJ1ZSwgZmFsc2UsIGZhbHNlLAotCQkJCQkJSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIExldmVscyBPZiBBZG9wdGlvbiBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZExldmVsc09mQWRvcHRpb25Qcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJhY3RpY2VEZXNjcmlwdGlvbl9sZXZlbHNPZkFkb3B0aW9uX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfUHJhY3RpY2VEZXNjcmlwdGlvbl9sZXZlbHNPZkFkb3B0aW9uX2ZlYXR1cmUiLCAiX1VJX1ByYWN0aWNlRGVzY3JpcHRpb25fdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5QUkFDVElDRV9ERVNDUklQVElPTl9fTEVWRUxTX09GX0FET1BUSU9OLAotCQkJCQkJdHJ1ZSwgZmFsc2UsIGZhbHNlLAotCQkJCQkJSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIFByYWN0aWNlRGVzY3JpcHRpb24uZ2lmLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoCi0JCQkJImZ1bGwvb2JqMTYvUHJhY3RpY2VEZXNjcmlwdGlvbiIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChQcmFjdGljZURlc2NyaXB0aW9uKSBvYmplY3QpLmdldE5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX1ByYWN0aWNlRGVzY3JpcHRpb25fdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCWdldFN0cmluZygiX1VJX1ByYWN0aWNlRGVzY3JpcHRpb25fdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0KLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKFByYWN0aWNlRGVzY3JpcHRpb24uY2xhc3MpKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5QUkFDVElDRV9ERVNDUklQVElPTl9fQURESVRJT05BTF9JTkZPOgotCQljYXNlIFVtYVBhY2thZ2UuUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX1BST0JMRU06Ci0JCWNhc2UgVW1hUGFja2FnZS5QUkFDVElDRV9ERVNDUklQVElPTl9fQkFDS0dST1VORDoKLQkJY2FzZSBVbWFQYWNrYWdlLlBSQUNUSUNFX0RFU0NSSVBUSU9OX19HT0FMUzoKLQkJY2FzZSBVbWFQYWNrYWdlLlBSQUNUSUNFX0RFU0NSSVBUSU9OX19BUFBMSUNBVElPTjoKLQkJY2FzZSBVbWFQYWNrYWdlLlBSQUNUSUNFX0RFU0NSSVBUSU9OX19MRVZFTFNfT0ZfQURPUFRJT046Ci0JCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uCi0JCQkJCS5nZXROb3RpZmllcigpLCBmYWxzZSwgdHJ1ZSkpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuCi0JICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycygKLQkJCUNvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1ByYWN0aWNlSXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvUHJhY3RpY2VJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjdjNWEwYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvUHJhY3RpY2VJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxMCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5QcmFjdGljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5QcmFjdGljZX0gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUHJhY3RpY2VJdGVtUHJvdmlkZXIgZXh0ZW5kcyBHdWlkYW5jZUl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzCi0JCUlFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFByYWN0aWNlSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCWFkZENvbnRlbnRSZWZlcmVuY2VzUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRBY3Rpdml0eVJlZmVyZW5jZXNQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIENvbnRlbnQgUmVmZXJlbmNlcyBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZENvbnRlbnRSZWZlcmVuY2VzUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX1ByYWN0aWNlX2NvbnRlbnRSZWZlcmVuY2VzX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfUHJhY3RpY2VfY29udGVudFJlZmVyZW5jZXNfZmVhdHVyZSIsICJfVUlfUHJhY3RpY2VfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5QUkFDVElDRV9fQ09OVEVOVF9SRUZFUkVOQ0VTLCB0cnVlLAotCQkJCQkJZmFsc2UsIHRydWUsIG51bGwsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgQWN0aXZpdHkgUmVmZXJlbmNlcyBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEFjdGl2aXR5UmVmZXJlbmNlc1Byb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9QcmFjdGljZV9hY3Rpdml0eVJlZmVyZW5jZXNfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9QcmFjdGljZV9hY3Rpdml0eVJlZmVyZW5jZXNfZmVhdHVyZSIsICJfVUlfUHJhY3RpY2VfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5QUkFDVElDRV9fQUNUSVZJVFlfUkVGRVJFTkNFUywKLQkJCQkJCXRydWUsIGZhbHNlLCB0cnVlLCBudWxsLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBzcGVjaWZpZXMgaG93IHRvIGltcGxlbWVudCB7QGxpbmsgI2dldENoaWxkcmVufSBhbmQgaXMgdXNlZCB0byBkZWR1Y2UgYW4gYXBwcm9wcmlhdGUgZmVhdHVyZSBmb3IgYW4KLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5BZGRDb21tYW5kfSwge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuUmVtb3ZlQ29tbWFuZH0gb3IKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Nb3ZlQ29tbWFuZH0gaW4ge0BsaW5rICNjcmVhdGVDb21tYW5kfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQ29sbGVjdGlvbjw/IGV4dGVuZHMgRVN0cnVjdHVyYWxGZWF0dXJlPiBnZXRDaGlsZHJlbkZlYXR1cmVzKAotCQkJT2JqZWN0IG9iamVjdCkgewotCQlpZiAoY2hpbGRyZW5GZWF0dXJlcyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRDaGlsZHJlbkZlYXR1cmVzKG9iamVjdCk7Ci0JCQljaGlsZHJlbkZlYXR1cmVzLmFkZChVbWFQYWNrYWdlLkxpdGVyYWxzLlBSQUNUSUNFX19TVUJfUFJBQ1RJQ0VTKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW5GZWF0dXJlczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRVN0cnVjdHVyYWxGZWF0dXJlIGdldENoaWxkRmVhdHVyZShPYmplY3Qgb2JqZWN0LCBPYmplY3QgY2hpbGQpIHsKLQkJLy8gQ2hlY2sgdGhlIHR5cGUgb2YgdGhlIHNwZWNpZmllZCBjaGlsZCBvYmplY3QgYW5kIHJldHVybiB0aGUgcHJvcGVyIGZlYXR1cmUgdG8gdXNlIGZvcgotCQkvLyBhZGRpbmcgKHNlZSB7QGxpbmsgQWRkQ29tbWFuZH0pIGl0IGFzIGEgY2hpbGQuCi0KLQkJcmV0dXJuIHN1cGVyLmdldENoaWxkRmVhdHVyZShvYmplY3QsIGNoaWxkKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgUHJhY3RpY2UuZ2lmLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoCi0JCQkJImZ1bGwvb2JqMTYvUHJhY3RpY2UiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoUHJhY3RpY2UpIG9iamVjdCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfUHJhY3RpY2VfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCWdldFN0cmluZygiX1VJX1ByYWN0aWNlX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCi0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChQcmFjdGljZS5jbGFzcykpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlBSQUNUSUNFX19TVUJfUFJBQ1RJQ0VTOgotCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbgotCQkJCQkuZ2V0Tm90aWZpZXIoKSwgdHJ1ZSwgZmFsc2UpKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbgotCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoCi0JCQlDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKAotCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuUFJBQ1RJQ0VfX1NVQl9QUkFDVElDRVMsCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUHJhY3RpY2UoKSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9Qcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvckl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1Byb2Nlc3NDb21wb25lbnREZXNjcmlwdG9ySXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1MmViODAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1Byb2Nlc3NDb21wb25lbnREZXNjcmlwdG9ySXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvcn0gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3JJdGVtUHJvdmlkZXIgZXh0ZW5kcwotCQlEZXNjcmlwdG9ySXRlbVByb3ZpZGVyIGltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsCi0JCUlTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLAotCQlJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3JJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJYWRkX3Byb2Nlc3NDb21wb25lbnRQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIHByb2Nlc3MgQ29tcG9uZW50IGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkX3Byb2Nlc3NDb21wb25lbnRQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3JfX3Byb2Nlc3NDb21wb25lbnRfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9Qcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvcl9fcHJvY2Vzc0NvbXBvbmVudF9mZWF0dXJlIiwgIl9VSV9Qcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvcl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLlBST0NFU1NfQ09NUE9ORU5UX0RFU0NSSVBUT1JfX1BST0NFU1NfQ09NUE9ORU5ULAotCQkJCQkJdHJ1ZSwgZmFsc2UsIHRydWUsIG51bGwsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgUHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3IuZ2lmLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoCi0JCQkJImZ1bGwvb2JqMTYvUHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3IiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoUHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3IpIG9iamVjdCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfUHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3JfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCWdldFN0cmluZygiX1VJX1Byb2Nlc3NDb21wb25lbnREZXNjcmlwdG9yX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbgotCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoCi0JCQlDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlSXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NjJjODhjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZX0gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZUl0ZW1Qcm92aWRlciBleHRlbmRzCi0JCUJyZWFrZG93bkVsZW1lbnRJdGVtUHJvdmlkZXIgaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwKLQkJSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBzcGVjaWZpZXMgaG93IHRvIGltcGxlbWVudCB7QGxpbmsgI2dldENoaWxkcmVufSBhbmQgaXMgdXNlZCB0byBkZWR1Y2UgYW4gYXBwcm9wcmlhdGUgZmVhdHVyZSBmb3IgYW4KLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5BZGRDb21tYW5kfSwge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuUmVtb3ZlQ29tbWFuZH0gb3IKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Nb3ZlQ29tbWFuZH0gaW4ge0BsaW5rICNjcmVhdGVDb21tYW5kfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQ29sbGVjdGlvbjw/IGV4dGVuZHMgRVN0cnVjdHVyYWxGZWF0dXJlPiBnZXRDaGlsZHJlbkZlYXR1cmVzKAotCQkJT2JqZWN0IG9iamVjdCkgewotCQlpZiAoY2hpbGRyZW5GZWF0dXJlcyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRDaGlsZHJlbkZlYXR1cmVzKG9iamVjdCk7Ci0JCQljaGlsZHJlbkZlYXR1cmVzCi0JCQkJCS5hZGQoVW1hUGFja2FnZS5MaXRlcmFscy5QUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfX0lOVEVSRkFDRV9TUEVDSUZJQ0FUSU9OUyk7Ci0JCQljaGlsZHJlbkZlYXR1cmVzCi0JCQkJCS5hZGQoVW1hUGFja2FnZS5MaXRlcmFscy5QUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfX0lOVEVSRkFDRV9JTyk7Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuRmVhdHVyZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVTdHJ1Y3R1cmFsRmVhdHVyZSBnZXRDaGlsZEZlYXR1cmUoT2JqZWN0IG9iamVjdCwgT2JqZWN0IGNoaWxkKSB7Ci0JCS8vIENoZWNrIHRoZSB0eXBlIG9mIHRoZSBzcGVjaWZpZWQgY2hpbGQgb2JqZWN0IGFuZCByZXR1cm4gdGhlIHByb3BlciBmZWF0dXJlIHRvIHVzZSBmb3IKLQkJLy8gYWRkaW5nIChzZWUge0BsaW5rIEFkZENvbW1hbmR9KSBpdCBhcyBhIGNoaWxkLgotCi0JCXJldHVybiBzdXBlci5nZXRDaGlsZEZlYXR1cmUob2JqZWN0LCBjaGlsZCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIFByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UuZ2lmLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoCi0JCQkJImZ1bGwvb2JqMTYvUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlKSBvYmplY3QpLmdldE5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX1Byb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCWdldFN0cmluZygiX1VJX1Byb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0KLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKFByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UuY2xhc3MpKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfX0lOVEVSRkFDRV9TUEVDSUZJQ0FUSU9OUzoKLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRV9fSU5URVJGQUNFX0lPOgotCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbgotCQkJCQkuZ2V0Tm90aWZpZXIoKSwgdHJ1ZSwgZmFsc2UpKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbgotCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoCi0JCQlDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5QUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfX0lOVEVSRkFDRV9TUEVDSUZJQ0FUSU9OUywKLQkJCQkJCVVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVRhc2tEZXNjcmlwdG9yKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcigKLQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLlBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRV9fSU5URVJGQUNFX0lPLAotCQkJCVVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVdvcmtQcm9kdWN0RGVzY3JpcHRvcigpKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1Byb2Nlc3NDb21wb25lbnRJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9Qcm9jZXNzQ29tcG9uZW50SXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkNzYxNTkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1Byb2Nlc3NDb21wb25lbnRJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzNCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudH0gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUHJvY2Vzc0NvbXBvbmVudEl0ZW1Qcm92aWRlciBleHRlbmRzIFByb2Nlc3NQYWNrYWdlSXRlbVByb3ZpZGVyCi0JCWltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUHJvY2Vzc0NvbXBvbmVudEl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIExpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlhZGRBdXRob3JzUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRDaGFuZ2VEYXRlUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRDaGFuZ2VEZXNjcmlwdGlvblByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkVmVyc2lvblByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkQ29weXJpZ2h0U3RhdGVtZW50UHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRJbnRlcmZhY2VzUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBBdXRob3JzIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkQXV0aG9yc1Byb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9NZXRob2RVbml0X2F1dGhvcnNfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9NZXRob2RVbml0X2F1dGhvcnNfZmVhdHVyZSIsICJfVUlfTWV0aG9kVW5pdF90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLk1FVEhPRF9VTklUX19BVVRIT1JTLCB0cnVlLCBmYWxzZSwKLQkJCQkJCWZhbHNlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsCi0JCQkJCQludWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIENoYW5nZSBEYXRlIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkQ2hhbmdlRGF0ZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9NZXRob2RVbml0X2NoYW5nZURhdGVfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9NZXRob2RVbml0X2NoYW5nZURhdGVfZmVhdHVyZSIsICJfVUlfTWV0aG9kVW5pdF90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLk1FVEhPRF9VTklUX19DSEFOR0VfREFURSwgdHJ1ZSwKLQkJCQkJCWZhbHNlLCBmYWxzZSwKLQkJCQkJCUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBDaGFuZ2UgRGVzY3JpcHRpb24gZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRDaGFuZ2VEZXNjcmlwdGlvblByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9NZXRob2RVbml0X2NoYW5nZURlc2NyaXB0aW9uX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfTWV0aG9kVW5pdF9jaGFuZ2VEZXNjcmlwdGlvbl9mZWF0dXJlIiwgIl9VSV9NZXRob2RVbml0X3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuTUVUSE9EX1VOSVRfX0NIQU5HRV9ERVNDUklQVElPTiwKLQkJCQkJCXRydWUsIGZhbHNlLCBmYWxzZSwKLQkJCQkJCUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBWZXJzaW9uIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkVmVyc2lvblByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9NZXRob2RVbml0X3ZlcnNpb25fZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9NZXRob2RVbml0X3ZlcnNpb25fZmVhdHVyZSIsICJfVUlfTWV0aG9kVW5pdF90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLk1FVEhPRF9VTklUX19WRVJTSU9OLCB0cnVlLCBmYWxzZSwKLQkJCQkJCWZhbHNlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsCi0JCQkJCQludWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIENvcHlyaWdodCBTdGF0ZW1lbnQgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRDb3B5cmlnaHRTdGF0ZW1lbnRQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfTWV0aG9kVW5pdF9jb3B5cmlnaHRTdGF0ZW1lbnRfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9NZXRob2RVbml0X2NvcHlyaWdodFN0YXRlbWVudF9mZWF0dXJlIiwgIl9VSV9NZXRob2RVbml0X3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuTUVUSE9EX1VOSVRfX0NPUFlSSUdIVF9TVEFURU1FTlQsCi0JCQkJCQl0cnVlLCBmYWxzZSwgdHJ1ZSwgbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBJbnRlcmZhY2VzIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkSW50ZXJmYWNlc1Byb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9jZXNzQ29tcG9uZW50X2ludGVyZmFjZXNfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9Qcm9jZXNzQ29tcG9uZW50X2ludGVyZmFjZXNfZmVhdHVyZSIsICJfVUlfUHJvY2Vzc0NvbXBvbmVudF90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLlBST0NFU1NfQ09NUE9ORU5UX19JTlRFUkZBQ0VTLAotCQkJCQkJdHJ1ZSwgZmFsc2UsIHRydWUsIG51bGwsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHNwZWNpZmllcyBob3cgdG8gaW1wbGVtZW50IHtAbGluayAjZ2V0Q2hpbGRyZW59IGFuZCBpcyB1c2VkIHRvIGRlZHVjZSBhbiBhcHByb3ByaWF0ZSBmZWF0dXJlIGZvciBhbgotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkFkZENvbW1hbmR9LCB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5SZW1vdmVDb21tYW5kfSBvcgotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLk1vdmVDb21tYW5kfSBpbiB7QGxpbmsgI2NyZWF0ZUNvbW1hbmR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBDb2xsZWN0aW9uPD8gZXh0ZW5kcyBFU3RydWN0dXJhbEZlYXR1cmU+IGdldENoaWxkcmVuRmVhdHVyZXMoCi0JCQlPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlbkZlYXR1cmVzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldENoaWxkcmVuRmVhdHVyZXMob2JqZWN0KTsKLQkJCWNoaWxkcmVuRmVhdHVyZXMKLQkJCQkJLmFkZChVbWFQYWNrYWdlLkxpdGVyYWxzLlBST0NFU1NfQ09NUE9ORU5UX19QUk9DRVNTKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW5GZWF0dXJlczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRVN0cnVjdHVyYWxGZWF0dXJlIGdldENoaWxkRmVhdHVyZShPYmplY3Qgb2JqZWN0LCBPYmplY3QgY2hpbGQpIHsKLQkJLy8gQ2hlY2sgdGhlIHR5cGUgb2YgdGhlIHNwZWNpZmllZCBjaGlsZCBvYmplY3QgYW5kIHJldHVybiB0aGUgcHJvcGVyIGZlYXR1cmUgdG8gdXNlIGZvcgotCQkvLyBhZGRpbmcgKHNlZSB7QGxpbmsgQWRkQ29tbWFuZH0pIGl0IGFzIGEgY2hpbGQuCi0KLQkJcmV0dXJuIHN1cGVyLmdldENoaWxkRmVhdHVyZShvYmplY3QsIGNoaWxkKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgUHJvY2Vzc0NvbXBvbmVudC5naWYuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgKLQkJCQkiZnVsbC9vYmoxNi9Qcm9jZXNzQ29tcG9uZW50IikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKFByb2Nlc3NDb21wb25lbnQpIG9iamVjdCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfUHJvY2Vzc0NvbXBvbmVudF90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJZ2V0U3RyaW5nKCJfVUlfUHJvY2Vzc0NvbXBvbmVudF90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoUHJvY2Vzc0NvbXBvbmVudC5jbGFzcykpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX19BVVRIT1JTOgotCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfX0NIQU5HRV9EQVRFOgotCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfX0NIQU5HRV9ERVNDUklQVElPTjoKLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX19WRVJTSU9OOgotCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbgotCQkJCQkuZ2V0Tm90aWZpZXIoKSwgZmFsc2UsIHRydWUpKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX19QUk9DRVNTOgotCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbgotCQkJCQkuZ2V0Tm90aWZpZXIoKSwgdHJ1ZSwgZmFsc2UpKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbgotCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoCi0JCQlDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKAotCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuUFJPQ0VTU19DT01QT05FTlRfX1BST0NFU1MsCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRGVsaXZlcnlQcm9jZXNzKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcigKLQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLlBST0NFU1NfQ09NUE9ORU5UX19QUk9DRVNTLAotCQkJCVVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUNhcGFiaWxpdHlQYXR0ZXJuKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcigKLQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLlBST0NFU1NfQ09NUE9ORU5UX19QUk9DRVNTLAotCQkJCVVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVByb2Nlc3NQbGFubmluZ1RlbXBsYXRlKCkpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNyZWF0ZUNoaWxkQ29tbWFuZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRDcmVhdGVDaGlsZFRleHQoT2JqZWN0IG93bmVyLCBPYmplY3QgZmVhdHVyZSwKLQkJCU9iamVjdCBjaGlsZCwgQ29sbGVjdGlvbjw/PiBzZWxlY3Rpb24pIHsKLQkJT2JqZWN0IGNoaWxkRmVhdHVyZSA9IGZlYXR1cmU7Ci0JCU9iamVjdCBjaGlsZE9iamVjdCA9IGNoaWxkOwotCi0JCWJvb2xlYW4gcXVhbGlmeSA9IGNoaWxkRmVhdHVyZSA9PSBVbWFQYWNrYWdlLkxpdGVyYWxzLlBST0NFU1NfUEFDS0FHRV9fUFJPQ0VTU19FTEVNRU5UUwotCQkJCXx8IGNoaWxkRmVhdHVyZSA9PSBVbWFQYWNrYWdlLkxpdGVyYWxzLlBST0NFU1NfQ09NUE9ORU5UX19QUk9DRVNTOwotCi0JCWlmIChxdWFsaWZ5KSB7Ci0JCQlyZXR1cm4gZ2V0U3RyaW5nKCJfVUlfQ3JlYXRlQ2hpbGRfdGV4dDIiLCAvLyROT04tTkxTLTEkCi0JCQkJCW5ldyBPYmplY3RbXSB7IGdldFR5cGVUZXh0KGNoaWxkT2JqZWN0KSwKLQkJCQkJCQlnZXRGZWF0dXJlVGV4dChjaGlsZEZlYXR1cmUpLCBnZXRUeXBlVGV4dChvd25lcikgfSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldENyZWF0ZUNoaWxkVGV4dChvd25lciwgZmVhdHVyZSwgY2hpbGQsIHNlbGVjdGlvbik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1Byb2Nlc3NEZXNjcmlwdGlvbkl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1Byb2Nlc3NEZXNjcmlwdGlvbkl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MzBmYzFhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9Qcm9jZXNzRGVzY3JpcHRpb25JdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzRGVzY3JpcHRpb259IG9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFByb2Nlc3NEZXNjcmlwdGlvbkl0ZW1Qcm92aWRlciBleHRlbmRzCi0JCUFjdGl2aXR5RGVzY3JpcHRpb25JdGVtUHJvdmlkZXIgaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwKLQkJSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQcm9jZXNzRGVzY3JpcHRpb25JdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJYWRkU2NvcGVQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZFVzYWdlTm90ZXNQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFNjb3BlIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkU2NvcGVQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvY2Vzc0Rlc2NyaXB0aW9uX3Njb3BlX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfUHJvY2Vzc0Rlc2NyaXB0aW9uX3Njb3BlX2ZlYXR1cmUiLCAiX1VJX1Byb2Nlc3NEZXNjcmlwdGlvbl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLlBST0NFU1NfREVTQ1JJUFRJT05fX1NDT1BFLCB0cnVlLAotCQkJCQkJZmFsc2UsIGZhbHNlLAotCQkJCQkJSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFVzYWdlIE5vdGVzIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkVXNhZ2VOb3Rlc1Byb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9jZXNzRGVzY3JpcHRpb25fdXNhZ2VOb3Rlc19mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1Byb2Nlc3NEZXNjcmlwdGlvbl91c2FnZU5vdGVzX2ZlYXR1cmUiLCAiX1VJX1Byb2Nlc3NEZXNjcmlwdGlvbl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLlBST0NFU1NfREVTQ1JJUFRJT05fX1VTQUdFX05PVEVTLAotCQkJCQkJdHJ1ZSwgZmFsc2UsIGZhbHNlLAotCQkJCQkJSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIFByb2Nlc3NEZXNjcmlwdGlvbi5naWYuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgKLQkJCQkiZnVsbC9vYmoxNi9Qcm9jZXNzRGVzY3JpcHRpb24iKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoUHJvY2Vzc0Rlc2NyaXB0aW9uKSBvYmplY3QpLmdldE5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX1Byb2Nlc3NEZXNjcmlwdGlvbl90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJZ2V0U3RyaW5nKCJfVUlfUHJvY2Vzc0Rlc2NyaXB0aW9uX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCi0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChQcm9jZXNzRGVzY3JpcHRpb24uY2xhc3MpKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0RFU0NSSVBUSU9OX19TQ09QRToKLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfREVTQ1JJUFRJT05fX1VTQUdFX05PVEVTOgotCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbgotCQkJCQkuZ2V0Tm90aWZpZXIoKSwgZmFsc2UsIHRydWUpKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbgotCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoCi0JCQlDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9Qcm9jZXNzRWxlbWVudEl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1Byb2Nlc3NFbGVtZW50SXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhZTg0OTkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1Byb2Nlc3NFbGVtZW50SXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NFbGVtZW50OwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzRWxlbWVudH0gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUHJvY2Vzc0VsZW1lbnRJdGVtUHJvdmlkZXIgZXh0ZW5kcyBEZXNjcmliYWJsZUVsZW1lbnRJdGVtUHJvdmlkZXIKLQkJaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQcm9jZXNzRWxlbWVudEl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIExpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChQcm9jZXNzRWxlbWVudCkgb2JqZWN0KS5nZXROYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9Qcm9jZXNzRWxlbWVudF90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJZ2V0U3RyaW5nKCJfVUlfUHJvY2Vzc0VsZW1lbnRfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuCi0JICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycygKLQkJCUNvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1Byb2Nlc3NGYW1pbHlJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9Qcm9jZXNzRmFtaWx5SXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyZWVlN2QuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1Byb2Nlc3NGYW1pbHlJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzRmFtaWx5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0ZhbWlseX0gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUHJvY2Vzc0ZhbWlseUl0ZW1Qcm92aWRlciBleHRlbmRzIE1ldGhvZENvbmZpZ3VyYXRpb25JdGVtUHJvdmlkZXIKLQkJaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQcm9jZXNzRmFtaWx5SXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCWFkZERlbGl2ZXJ5UHJvY2Vzc2VzUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBEZWxpdmVyeSBQcm9jZXNzZXMgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGREZWxpdmVyeVByb2Nlc3Nlc1Byb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9jZXNzRmFtaWx5X2RlbGl2ZXJ5UHJvY2Vzc2VzX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfUHJvY2Vzc0ZhbWlseV9kZWxpdmVyeVByb2Nlc3Nlc19mZWF0dXJlIiwgIl9VSV9Qcm9jZXNzRmFtaWx5X3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuUFJPQ0VTU19GQU1JTFlfX0RFTElWRVJZX1BST0NFU1NFUywKLQkJCQkJCXRydWUsIGZhbHNlLCB0cnVlLCBudWxsLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIFByb2Nlc3NGYW1pbHkuZ2lmLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoCi0JCQkJImZ1bGwvb2JqMTYvUHJvY2Vzc0ZhbWlseSIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChQcm9jZXNzRmFtaWx5KSBvYmplY3QpLmdldE5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX1Byb2Nlc3NGYW1pbHlfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCWdldFN0cmluZygiX1VJX1Byb2Nlc3NGYW1pbHlfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuCi0JICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycygKLQkJCUNvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1Byb2Nlc3NJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9Qcm9jZXNzSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExMzY1NWEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1Byb2Nlc3NJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzfSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9jZXNzSXRlbVByb3ZpZGVyIGV4dGVuZHMgQWN0aXZpdHlJdGVtUHJvdmlkZXIgaW1wbGVtZW50cwotCQlJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQcm9jZXNzSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCWFkZEluY2x1ZGVzUGF0dGVybnNQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZERlZmF1bHRDb250ZXh0UHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRWYWxpZENvbnRleHRQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIEluY2x1ZGVzIFBhdHRlcm5zIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkSW5jbHVkZXNQYXR0ZXJuc1Byb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9jZXNzX2luY2x1ZGVzUGF0dGVybnNfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9Qcm9jZXNzX2luY2x1ZGVzUGF0dGVybnNfZmVhdHVyZSIsICJfVUlfUHJvY2Vzc190eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLlBST0NFU1NfX0lOQ0xVREVTX1BBVFRFUk5TLCB0cnVlLAotCQkJCQkJZmFsc2UsIHRydWUsIG51bGwsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgRGVmYXVsdCBDb250ZXh0IGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkRGVmYXVsdENvbnRleHRQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvY2Vzc19kZWZhdWx0Q29udGV4dF9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1Byb2Nlc3NfZGVmYXVsdENvbnRleHRfZmVhdHVyZSIsICJfVUlfUHJvY2Vzc190eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLlBST0NFU1NfX0RFRkFVTFRfQ09OVEVYVCwgdHJ1ZSwKLQkJCQkJCWZhbHNlLCB0cnVlLCBudWxsLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFZhbGlkIENvbnRleHQgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRWYWxpZENvbnRleHRQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvY2Vzc192YWxpZENvbnRleHRfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9Qcm9jZXNzX3ZhbGlkQ29udGV4dF9mZWF0dXJlIiwgIl9VSV9Qcm9jZXNzX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuUFJPQ0VTU19fVkFMSURfQ09OVEVYVCwgdHJ1ZSwKLQkJCQkJCWZhbHNlLCB0cnVlLCBudWxsLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzcykgb2JqZWN0KS5nZXROYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9Qcm9jZXNzX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9jZXNzX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbgotCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoCi0JCQlDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3Ige0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ3JlYXRlQ2hpbGRDb21tYW5kfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldENyZWF0ZUNoaWxkVGV4dChPYmplY3Qgb3duZXIsIE9iamVjdCBmZWF0dXJlLAotCQkJT2JqZWN0IGNoaWxkLCBDb2xsZWN0aW9uPD8+IHNlbGVjdGlvbikgewotCQlPYmplY3QgY2hpbGRGZWF0dXJlID0gZmVhdHVyZTsKLQkJT2JqZWN0IGNoaWxkT2JqZWN0ID0gY2hpbGQ7Ci0KLQkJYm9vbGVhbiBxdWFsaWZ5ID0gY2hpbGRGZWF0dXJlID09IFVtYVBhY2thZ2UuTGl0ZXJhbHMuTUVUSE9EX0VMRU1FTlRfX09XTkVEX1JVTEVTCi0JCQkJfHwgY2hpbGRGZWF0dXJlID09IFVtYVBhY2thZ2UuTGl0ZXJhbHMuV09SS19ERUZJTklUSU9OX19QUkVDT05ESVRJT04KLQkJCQl8fCBjaGlsZEZlYXR1cmUgPT0gVW1hUGFja2FnZS5MaXRlcmFscy5XT1JLX0RFRklOSVRJT05fX1BPU1RDT05ESVRJT047Ci0KLQkJaWYgKHF1YWxpZnkpIHsKLQkJCXJldHVybiBnZXRTdHJpbmcoIl9VSV9DcmVhdGVDaGlsZF90ZXh0MiIsIC8vJE5PTi1OTFMtMSQKLQkJCQkJbmV3IE9iamVjdFtdIHsgZ2V0VHlwZVRleHQoY2hpbGRPYmplY3QpLAotCQkJCQkJCWdldEZlYXR1cmVUZXh0KGNoaWxkRmVhdHVyZSksIGdldFR5cGVUZXh0KG93bmVyKSB9KTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0Q3JlYXRlQ2hpbGRUZXh0KG93bmVyLCBmZWF0dXJlLCBjaGlsZCwgc2VsZWN0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvUHJvY2Vzc1BhY2thZ2VJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9Qcm9jZXNzUGFja2FnZUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MTE2ODZjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9Qcm9jZXNzUGFja2FnZUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjM2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzUGFja2FnZX0gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUHJvY2Vzc1BhY2thZ2VJdGVtUHJvdmlkZXIgZXh0ZW5kcyBNZXRob2RQYWNrYWdlSXRlbVByb3ZpZGVyCi0JCWltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUHJvY2Vzc1BhY2thZ2VJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHNwZWNpZmllcyBob3cgdG8gaW1wbGVtZW50IHtAbGluayAjZ2V0Q2hpbGRyZW59IGFuZCBpcyB1c2VkIHRvIGRlZHVjZSBhbiBhcHByb3ByaWF0ZSBmZWF0dXJlIGZvciBhbgotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkFkZENvbW1hbmR9LCB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5SZW1vdmVDb21tYW5kfSBvcgotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLk1vdmVDb21tYW5kfSBpbiB7QGxpbmsgI2NyZWF0ZUNvbW1hbmR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBDb2xsZWN0aW9uPD8gZXh0ZW5kcyBFU3RydWN0dXJhbEZlYXR1cmU+IGdldENoaWxkcmVuRmVhdHVyZXMoCi0JCQlPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlbkZlYXR1cmVzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldENoaWxkcmVuRmVhdHVyZXMob2JqZWN0KTsKLQkJCWNoaWxkcmVuRmVhdHVyZXMKLQkJCQkJLmFkZChVbWFQYWNrYWdlLkxpdGVyYWxzLlBST0NFU1NfUEFDS0FHRV9fUFJPQ0VTU19FTEVNRU5UUyk7Ci0JCQljaGlsZHJlbkZlYXR1cmVzLmFkZChVbWFQYWNrYWdlLkxpdGVyYWxzLlBST0NFU1NfUEFDS0FHRV9fRElBR1JBTVMpOwotCQl9Ci0JCXJldHVybiBjaGlsZHJlbkZlYXR1cmVzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFU3RydWN0dXJhbEZlYXR1cmUgZ2V0Q2hpbGRGZWF0dXJlKE9iamVjdCBvYmplY3QsIE9iamVjdCBjaGlsZCkgewotCQkvLyBDaGVjayB0aGUgdHlwZSBvZiB0aGUgc3BlY2lmaWVkIGNoaWxkIG9iamVjdCBhbmQgcmV0dXJuIHRoZSBwcm9wZXIgZmVhdHVyZSB0byB1c2UgZm9yCi0JCS8vIGFkZGluZyAoc2VlIHtAbGluayBBZGRDb21tYW5kfSkgaXQgYXMgYSBjaGlsZC4KLQotCQlyZXR1cm4gc3VwZXIuZ2V0Q2hpbGRGZWF0dXJlKG9iamVjdCwgY2hpbGQpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBQcm9jZXNzUGFja2FnZS5naWYuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgKLQkJCQkiZnVsbC9vYmoxNi9Qcm9jZXNzUGFja2FnZSIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChQcm9jZXNzUGFja2FnZSkgb2JqZWN0KS5nZXROYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9Qcm9jZXNzUGFja2FnZV90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJZ2V0U3RyaW5nKCJfVUlfUHJvY2Vzc1BhY2thZ2VfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0KLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKFByb2Nlc3NQYWNrYWdlLmNsYXNzKSkgewotCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19QQUNLQUdFX19QUk9DRVNTX0VMRU1FTlRTOgotCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19QQUNLQUdFX19ESUFHUkFNUzoKLQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24KLQkJCQkJLmdldE5vdGlmaWVyKCksIHRydWUsIGZhbHNlKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4KLQkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKAotCQkJQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcigKLQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLlBST0NFU1NfUEFDS0FHRV9fUFJPQ0VTU19FTEVNRU5UUywKLQkJCQlVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVBY3Rpdml0eSgpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5QUk9DRVNTX1BBQ0tBR0VfX1BST0NFU1NfRUxFTUVOVFMsCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUGxhbm5pbmdEYXRhKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcigKLQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLlBST0NFU1NfUEFDS0FHRV9fUFJPQ0VTU19FTEVNRU5UUywKLQkJCQlVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVXb3JrT3JkZXIoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKAotCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuUFJPQ0VTU19QQUNLQUdFX19QUk9DRVNTX0VMRU1FTlRTLAotCQkJCVVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZU1pbGVzdG9uZSgpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5QUk9DRVNTX1BBQ0tBR0VfX1BST0NFU1NfRUxFTUVOVFMsCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlV29ya1Byb2R1Y3REZXNjcmlwdG9yKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcigKLQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLlBST0NFU1NfUEFDS0FHRV9fUFJPQ0VTU19FTEVNRU5UUywKLQkJCQlVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVJdGVyYXRpb24oKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKAotCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuUFJPQ0VTU19QQUNLQUdFX19QUk9DRVNTX0VMRU1FTlRTLAotCQkJCVVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVBoYXNlKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcigKLQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLlBST0NFU1NfUEFDS0FHRV9fUFJPQ0VTU19FTEVNRU5UUywKLQkJCQlVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVUZWFtUHJvZmlsZSgpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5QUk9DRVNTX1BBQ0tBR0VfX1BST0NFU1NfRUxFTUVOVFMsCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUm9sZURlc2NyaXB0b3IoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKAotCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuUFJPQ0VTU19QQUNLQUdFX19QUk9DRVNTX0VMRU1FTlRTLAotCQkJCVVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVRhc2tEZXNjcmlwdG9yKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcigKLQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLlBST0NFU1NfUEFDS0FHRV9fUFJPQ0VTU19FTEVNRU5UUywKLQkJCQlVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVDb21wb3NpdGVSb2xlKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcigKLQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLlBST0NFU1NfUEFDS0FHRV9fUFJPQ0VTU19FTEVNRU5UUywKLQkJCQlVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVEZWxpdmVyeVByb2Nlc3MoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKAotCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuUFJPQ0VTU19QQUNLQUdFX19QUk9DRVNTX0VMRU1FTlRTLAotCQkJCVVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUNhcGFiaWxpdHlQYXR0ZXJuKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcigKLQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLlBST0NFU1NfUEFDS0FHRV9fUFJPQ0VTU19FTEVNRU5UUywKLQkJCQlVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSgpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5QUk9DRVNTX1BBQ0tBR0VfX1BST0NFU1NfRUxFTUVOVFMsCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3IoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKAotCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuUFJPQ0VTU19QQUNLQUdFX19QUk9DRVNTX0VMRU1FTlRTLAotCQkJCVVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKAotCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuUFJPQ0VTU19QQUNLQUdFX19ESUFHUkFNUywKLQkJCQlVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVEaWFncmFtKCkpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGVJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9Qcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYzg3ZDgxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9Qcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NQbGFubmluZ1RlbXBsYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGV9IG9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFByb2Nlc3NQbGFubmluZ1RlbXBsYXRlSXRlbVByb3ZpZGVyIGV4dGVuZHMgUHJvY2Vzc0l0ZW1Qcm92aWRlcgotCQlpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFByb2Nlc3NQbGFubmluZ1RlbXBsYXRlSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCWFkZEJhc2VkT25Qcm9jZXNzZXNQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIEJhc2VkIE9uIFByb2Nlc3NlcyBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEJhc2VkT25Qcm9jZXNzZXNQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGVfYmFzZWRPblByb2Nlc3Nlc19mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1Byb2Nlc3NQbGFubmluZ1RlbXBsYXRlX2Jhc2VkT25Qcm9jZXNzZXNfZmVhdHVyZSIsICJfVUlfUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGVfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5QUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19CQVNFRF9PTl9QUk9DRVNTRVMsCi0JCQkJCQl0cnVlLCBmYWxzZSwgdHJ1ZSwgbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZS5naWYuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgKLQkJCQkiZnVsbC9vYmoxNi9Qcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSkgb2JqZWN0KS5nZXROYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9Qcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZV90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJZ2V0U3RyaW5nKCJfVUlfUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGVfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuCi0JICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycygKLQkJCUNvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5DcmVhdGVDaGlsZENvbW1hbmR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0Q3JlYXRlQ2hpbGRUZXh0KE9iamVjdCBvd25lciwgT2JqZWN0IGZlYXR1cmUsCi0JCQlPYmplY3QgY2hpbGQsIENvbGxlY3Rpb248Pz4gc2VsZWN0aW9uKSB7Ci0JCU9iamVjdCBjaGlsZEZlYXR1cmUgPSBmZWF0dXJlOwotCQlPYmplY3QgY2hpbGRPYmplY3QgPSBjaGlsZDsKLQotCQlib29sZWFuIHF1YWxpZnkgPSBjaGlsZEZlYXR1cmUgPT0gVW1hUGFja2FnZS5MaXRlcmFscy5NRVRIT0RfRUxFTUVOVF9fT1dORURfUlVMRVMKLQkJCQl8fCBjaGlsZEZlYXR1cmUgPT0gVW1hUGFja2FnZS5MaXRlcmFscy5XT1JLX0RFRklOSVRJT05fX1BSRUNPTkRJVElPTgotCQkJCXx8IGNoaWxkRmVhdHVyZSA9PSBVbWFQYWNrYWdlLkxpdGVyYWxzLldPUktfREVGSU5JVElPTl9fUE9TVENPTkRJVElPTjsKLQotCQlpZiAocXVhbGlmeSkgewotCQkJcmV0dXJuIGdldFN0cmluZygiX1VJX0NyZWF0ZUNoaWxkX3RleHQyIiwgLy8kTk9OLU5MUy0xJAotCQkJCQluZXcgT2JqZWN0W10geyBnZXRUeXBlVGV4dChjaGlsZE9iamVjdCksCi0JCQkJCQkJZ2V0RmVhdHVyZVRleHQoY2hpbGRGZWF0dXJlKSwgZ2V0VHlwZVRleHQob3duZXIpIH0pOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRDcmVhdGVDaGlsZFRleHQob3duZXIsIGZlYXR1cmUsIGNoaWxkLCBzZWxlY3Rpb24pOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9Qcm9wZXJ0eUl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1Byb3BlcnR5SXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExNTJkMTMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1Byb3BlcnR5SXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvcGVydHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9wZXJ0eX0gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUHJvcGVydHlJdGVtUHJvdmlkZXIgZXh0ZW5kcyBEaWFncmFtRWxlbWVudEl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzCi0JCUlFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFByb3BlcnR5SXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCWFkZEtleVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkVmFsdWVQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIEtleSBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEtleVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eV9rZXlfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9Qcm9wZXJ0eV9rZXlfZmVhdHVyZSIsICJfVUlfUHJvcGVydHlfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5QUk9QRVJUWV9fS0VZLCB0cnVlLCBmYWxzZSwgZmFsc2UsCi0JCQkJCQlJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgVmFsdWUgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRWYWx1ZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eV92YWx1ZV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1Byb3BlcnR5X3ZhbHVlX2ZlYXR1cmUiLCAiX1VJX1Byb3BlcnR5X3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuUFJPUEVSVFlfX1ZBTFVFLCB0cnVlLCBmYWxzZSwKLQkJCQkJCWZhbHNlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsCi0JCQkJCQludWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIFByb3BlcnR5LmdpZi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKAotCQkJCSJmdWxsL29iajE2L1Byb3BlcnR5IikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKFByb3BlcnR5KSBvYmplY3QpLmdldE5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX1Byb3BlcnR5X3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eV90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoUHJvcGVydHkuY2xhc3MpKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9QRVJUWV9fS0VZOgotCQljYXNlIFVtYVBhY2thZ2UuUFJPUEVSVFlfX1ZBTFVFOgotCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbgotCQkJCQkuZ2V0Tm90aWZpZXIoKSwgZmFsc2UsIHRydWUpKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbgotCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoCi0JCQlDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9SZWZlcmVuY2VJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9SZWZlcmVuY2VJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzNhM2IyZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvUmVmZXJlbmNlSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUmVmZXJlbmNlfSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBSZWZlcmVuY2VJdGVtUHJvdmlkZXIgZXh0ZW5kcyBEaWFncmFtRWxlbWVudEl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzCi0JCUlFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJlZmVyZW5jZUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIExpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlhZGRJc0luZGl2aWR1YWxSZXByZXNlbnRhdGlvblByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkUmVmZXJlbmNlZFByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgSXMgSW5kaXZpZHVhbCBSZXByZXNlbnRhdGlvbiBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZElzSW5kaXZpZHVhbFJlcHJlc2VudGF0aW9uUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX1JlZmVyZW5jZV9pc0luZGl2aWR1YWxSZXByZXNlbnRhdGlvbl9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1JlZmVyZW5jZV9pc0luZGl2aWR1YWxSZXByZXNlbnRhdGlvbl9mZWF0dXJlIiwgIl9VSV9SZWZlcmVuY2VfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5SRUZFUkVOQ0VfX0lTX0lORElWSURVQUxfUkVQUkVTRU5UQVRJT04sCi0JCQkJCQl0cnVlLCBmYWxzZSwgZmFsc2UsCi0JCQkJCQlJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgUmVmZXJlbmNlZCBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFJlZmVyZW5jZWRQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfUmVmZXJlbmNlX3JlZmVyZW5jZWRfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9SZWZlcmVuY2VfcmVmZXJlbmNlZF9mZWF0dXJlIiwgIl9VSV9SZWZlcmVuY2VfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5SRUZFUkVOQ0VfX1JFRkVSRU5DRUQsIHRydWUsIGZhbHNlLAotCQkJCQkJdHJ1ZSwgbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBSZWZlcmVuY2UuZ2lmLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoCi0JCQkJImZ1bGwvb2JqMTYvUmVmZXJlbmNlIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKFJlZmVyZW5jZSkgb2JqZWN0KS5nZXROYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9SZWZlcmVuY2VfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCWdldFN0cmluZygiX1VJX1JlZmVyZW5jZV90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoUmVmZXJlbmNlLmNsYXNzKSkgewotCQljYXNlIFVtYVBhY2thZ2UuUkVGRVJFTkNFX19JU19JTkRJVklEVUFMX1JFUFJFU0VOVEFUSU9OOgotCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbgotCQkJCQkuZ2V0Tm90aWZpZXIoKSwgZmFsc2UsIHRydWUpKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbgotCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoCi0JCQlDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9SZXBvcnRJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9SZXBvcnRJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODJmNzY4ZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvUmVwb3J0SXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJlcG9ydDsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUmVwb3J0fSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBSZXBvcnRJdGVtUHJvdmlkZXIgZXh0ZW5kcyBHdWlkYW5jZUl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzCi0JCUlFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJlcG9ydEl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIExpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBSZXBvcnQuZ2lmLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoCi0JCQkJImZ1bGwvb2JqMTYvUmVwb3J0IikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKFJlcG9ydCkgb2JqZWN0KS5nZXROYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9SZXBvcnRfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCWdldFN0cmluZygiX1VJX1JlcG9ydF90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4KLQkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKAotCQkJQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvUmV1c2FibGVBc3NldEl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1JldXNhYmxlQXNzZXRJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODE1YjM1Mi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvUmV1c2FibGVBc3NldEl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5SZXVzYWJsZUFzc2V0OwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5SZXVzYWJsZUFzc2V0fSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBSZXVzYWJsZUFzc2V0SXRlbVByb3ZpZGVyIGV4dGVuZHMgR3VpZGFuY2VJdGVtUHJvdmlkZXIgaW1wbGVtZW50cwotCQlJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZXVzYWJsZUFzc2V0SXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIFJldXNhYmxlQXNzZXQuZ2lmLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoCi0JCQkJImZ1bGwvb2JqMTYvUmV1c2FibGVBc3NldCIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChSZXVzYWJsZUFzc2V0KSBvYmplY3QpLmdldE5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX1JldXNhYmxlQXNzZXRfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCWdldFN0cmluZygiX1VJX1JldXNhYmxlQXNzZXRfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuCi0JICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycygKLQkJCUNvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1JvYWRtYXBJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9Sb2FkbWFwSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlNmI1ZjYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1JvYWRtYXBJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9hZG1hcDsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUm9hZG1hcH0gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUm9hZG1hcEl0ZW1Qcm92aWRlciBleHRlbmRzIEd1aWRhbmNlSXRlbVByb3ZpZGVyIGltcGxlbWVudHMKLQkJSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUm9hZG1hcEl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIExpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBSb2FkbWFwLmdpZi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKAotCQkJCSJmdWxsL29iajE2L1JvYWRtYXAiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoUm9hZG1hcCkgb2JqZWN0KS5nZXROYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9Sb2FkbWFwX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQlnZXRTdHJpbmcoIl9VSV9Sb2FkbWFwX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbgotCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoCi0JCQlDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9Sb2xlRGVzY3JpcHRpb25JdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9Sb2xlRGVzY3JpcHRpb25JdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTc1Y2ZiOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvUm9sZURlc2NyaXB0aW9uSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZURlc2NyaXB0aW9ufSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBSb2xlRGVzY3JpcHRpb25JdGVtUHJvdmlkZXIgZXh0ZW5kcyBDb250ZW50RGVzY3JpcHRpb25JdGVtUHJvdmlkZXIKLQkJaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSb2xlRGVzY3JpcHRpb25JdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJYWRkU2tpbGxzUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRBc3NpZ25tZW50QXBwcm9hY2hlc1Byb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkU3lub255bXNQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFNraWxscyBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFNraWxsc1Byb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9Sb2xlRGVzY3JpcHRpb25fc2tpbGxzX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfUm9sZURlc2NyaXB0aW9uX3NraWxsc19mZWF0dXJlIiwgIl9VSV9Sb2xlRGVzY3JpcHRpb25fdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5ST0xFX0RFU0NSSVBUSU9OX19TS0lMTFMsIHRydWUsCi0JCQkJCQlmYWxzZSwgZmFsc2UsCi0JCQkJCQlJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgQXNzaWdubWVudCBBcHByb2FjaGVzIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkQXNzaWdubWVudEFwcHJvYWNoZXNQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfUm9sZURlc2NyaXB0aW9uX2Fzc2lnbm1lbnRBcHByb2FjaGVzX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfUm9sZURlc2NyaXB0aW9uX2Fzc2lnbm1lbnRBcHByb2FjaGVzX2ZlYXR1cmUiLCAiX1VJX1JvbGVEZXNjcmlwdGlvbl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLlJPTEVfREVTQ1JJUFRJT05fX0FTU0lHTk1FTlRfQVBQUk9BQ0hFUywKLQkJCQkJCXRydWUsIGZhbHNlLCBmYWxzZSwKLQkJCQkJCUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBTeW5vbnltcyBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFN5bm9ueW1zUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX1JvbGVEZXNjcmlwdGlvbl9zeW5vbnltc19mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1JvbGVEZXNjcmlwdGlvbl9zeW5vbnltc19mZWF0dXJlIiwgIl9VSV9Sb2xlRGVzY3JpcHRpb25fdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5ST0xFX0RFU0NSSVBUSU9OX19TWU5PTllNUywgdHJ1ZSwKLQkJCQkJCWZhbHNlLCBmYWxzZSwKLQkJCQkJCUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBSb2xlRGVzY3JpcHRpb24uZ2lmLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoCi0JCQkJImZ1bGwvb2JqMTYvUm9sZURlc2NyaXB0aW9uIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKFJvbGVEZXNjcmlwdGlvbikgb2JqZWN0KS5nZXROYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9Sb2xlRGVzY3JpcHRpb25fdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCWdldFN0cmluZygiX1VJX1JvbGVEZXNjcmlwdGlvbl90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoUm9sZURlc2NyaXB0aW9uLmNsYXNzKSkgewotCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9ERVNDUklQVElPTl9fU0tJTExTOgotCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9ERVNDUklQVElPTl9fQVNTSUdOTUVOVF9BUFBST0FDSEVTOgotCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9ERVNDUklQVElPTl9fU1lOT05ZTVM6Ci0JCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uCi0JCQkJCS5nZXROb3RpZmllcigpLCBmYWxzZSwgdHJ1ZSkpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuCi0JICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycygKLQkJCUNvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1JvbGVEZXNjcmlwdG9ySXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvUm9sZURlc2NyaXB0b3JJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGUzMTE1My4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvUm9sZURlc2NyaXB0b3JJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdG9yfSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBSb2xlRGVzY3JpcHRvckl0ZW1Qcm92aWRlciBleHRlbmRzIERlc2NyaXB0b3JJdGVtUHJvdmlkZXIKLQkJaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSb2xlRGVzY3JpcHRvckl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIExpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlhZGRSb2xlUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRNb2RpZmllc1Byb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkUmVzcG9uc2libGVGb3JQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFJvbGUgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRSb2xlUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX1JvbGVEZXNjcmlwdG9yX1JvbGVfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9Sb2xlRGVzY3JpcHRvcl9Sb2xlX2ZlYXR1cmUiLCAiX1VJX1JvbGVEZXNjcmlwdG9yX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuUk9MRV9ERVNDUklQVE9SX19ST0xFLCB0cnVlLCBmYWxzZSwKLQkJCQkJCXRydWUsIG51bGwsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgTW9kaWZpZXMgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRNb2RpZmllc1Byb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9Sb2xlRGVzY3JpcHRvcl9tb2RpZmllc19mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1JvbGVEZXNjcmlwdG9yX21vZGlmaWVzX2ZlYXR1cmUiLCAiX1VJX1JvbGVEZXNjcmlwdG9yX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuUk9MRV9ERVNDUklQVE9SX19NT0RJRklFUywgdHJ1ZSwKLQkJCQkJCWZhbHNlLCB0cnVlLCBudWxsLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFJlc3BvbnNpYmxlIEZvciBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFJlc3BvbnNpYmxlRm9yUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX1JvbGVEZXNjcmlwdG9yX3Jlc3BvbnNpYmxlRm9yX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfUm9sZURlc2NyaXB0b3JfcmVzcG9uc2libGVGb3JfZmVhdHVyZSIsICJfVUlfUm9sZURlc2NyaXB0b3JfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5ST0xFX0RFU0NSSVBUT1JfX1JFU1BPTlNJQkxFX0ZPUiwKLQkJCQkJCXRydWUsIGZhbHNlLCB0cnVlLCBudWxsLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIFJvbGVEZXNjcmlwdG9yLmdpZi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKAotCQkJCSJmdWxsL29iajE2L1JvbGVEZXNjcmlwdG9yIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKFJvbGVEZXNjcmlwdG9yKSBvYmplY3QpLmdldE5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX1JvbGVEZXNjcmlwdG9yX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQlnZXRTdHJpbmcoIl9VSV9Sb2xlRGVzY3JpcHRvcl90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4KLQkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKAotCQkJQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvUm9sZUl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1JvbGVJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTQzZmFlYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvUm9sZUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlfSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBSb2xlSXRlbVByb3ZpZGVyIGV4dGVuZHMgQ29udGVudEVsZW1lbnRJdGVtUHJvdmlkZXIgaW1wbGVtZW50cwotCQlJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSb2xlSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCWFkZEZ1bGZpbGxzUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRNb2RpZmllc1Byb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkUmVzcG9uc2libGVGb3JQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIEZ1bGZpbGxzIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkRnVsZmlsbHNQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfRnVsZmlsbGFibGVFbGVtZW50X2Z1bGZpbGxzX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfRnVsZmlsbGFibGVFbGVtZW50X2Z1bGZpbGxzX2ZlYXR1cmUiLCAiX1VJX0Z1bGZpbGxhYmxlRWxlbWVudF90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkZVTEZJTExBQkxFX0VMRU1FTlRfX0ZVTEZJTExTLAotCQkJCQkJdHJ1ZSwgZmFsc2UsIHRydWUsIG51bGwsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgTW9kaWZpZXMgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRNb2RpZmllc1Byb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9Sb2xlX21vZGlmaWVzX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfUm9sZV9tb2RpZmllc19mZWF0dXJlIiwgIl9VSV9Sb2xlX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuUk9MRV9fTU9ESUZJRVMsIHRydWUsIGZhbHNlLCB0cnVlLAotCQkJCQkJbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBSZXNwb25zaWJsZSBGb3IgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRSZXNwb25zaWJsZUZvclByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9Sb2xlX3Jlc3BvbnNpYmxlRm9yX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfUm9sZV9yZXNwb25zaWJsZUZvcl9mZWF0dXJlIiwgIl9VSV9Sb2xlX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuUk9MRV9fUkVTUE9OU0lCTEVfRk9SLCB0cnVlLCBmYWxzZSwKLQkJCQkJCXRydWUsIG51bGwsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgUm9sZS5naWYuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgKLQkJCQkiZnVsbC9vYmoxNi9Sb2xlIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKFJvbGUpIG9iamVjdCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfUm9sZV90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJZ2V0U3RyaW5nKCJfVUlfUm9sZV90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4KLQkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKAotCQkJQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvUm9sZVNldEdyb3VwaW5nSXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvUm9sZVNldEdyb3VwaW5nSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0MTE4N2EuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1JvbGVTZXRHcm91cGluZ0l0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVTZXRHcm91cGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVTZXRHcm91cGluZ30gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUm9sZVNldEdyb3VwaW5nSXRlbVByb3ZpZGVyIGV4dGVuZHMgQ29udGVudENhdGVnb3J5SXRlbVByb3ZpZGVyCi0JCWltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUm9sZVNldEdyb3VwaW5nSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCWFkZFJvbGVTZXRzUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBSb2xlIFNldHMgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRSb2xlU2V0c1Byb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9Sb2xlU2V0R3JvdXBpbmdfcm9sZVNldHNfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9Sb2xlU2V0R3JvdXBpbmdfcm9sZVNldHNfZmVhdHVyZSIsICJfVUlfUm9sZVNldEdyb3VwaW5nX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuUk9MRV9TRVRfR1JPVVBJTkdfX1JPTEVfU0VUUywgdHJ1ZSwKLQkJCQkJCWZhbHNlLCB0cnVlLCBudWxsLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIFJvbGVTZXRHcm91cGluZy5naWYuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgKLQkJCQkiZnVsbC9vYmoxNi9Sb2xlU2V0R3JvdXBpbmciKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoUm9sZVNldEdyb3VwaW5nKSBvYmplY3QpLmdldE5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX1JvbGVTZXRHcm91cGluZ190eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJZ2V0U3RyaW5nKCJfVUlfUm9sZVNldEdyb3VwaW5nX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbgotCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoCi0JCQlDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9Sb2xlU2V0SXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvUm9sZVNldEl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YzQ5NjU0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9Sb2xlU2V0SXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVTZXR9IG9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFJvbGVTZXRJdGVtUHJvdmlkZXIgZXh0ZW5kcyBDb250ZW50Q2F0ZWdvcnlJdGVtUHJvdmlkZXIgaW1wbGVtZW50cwotCQlJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSb2xlU2V0SXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCWFkZFJvbGVzUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBSb2xlcyBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFJvbGVzUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX1JvbGVTZXRfcm9sZXNfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9Sb2xlU2V0X3JvbGVzX2ZlYXR1cmUiLCAiX1VJX1JvbGVTZXRfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5ST0xFX1NFVF9fUk9MRVMsIHRydWUsIGZhbHNlLCB0cnVlLAotCQkJCQkJbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBSb2xlU2V0LmdpZi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKAotCQkJCSJmdWxsL29iajE2L1JvbGVTZXQiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoUm9sZVNldCkgb2JqZWN0KS5nZXROYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9Sb2xlU2V0X3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQlnZXRTdHJpbmcoIl9VSV9Sb2xlU2V0X3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbgotCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoCi0JCQlDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9TZWN0aW9uSXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvU2VjdGlvbkl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkM2M5OTk4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9TZWN0aW9uSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5TZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlNlY3Rpb259IG9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFNlY3Rpb25JdGVtUHJvdmlkZXIgZXh0ZW5kcyBWYXJpYWJpbGl0eUVsZW1lbnRJdGVtUHJvdmlkZXIKLQkJaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTZWN0aW9uSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCWFkZFNlY3Rpb25OYW1lUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRTZWN0aW9uRGVzY3JpcHRpb25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZFByZWRlY2Vzc29yUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBTZWN0aW9uIE5hbWUgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRTZWN0aW9uTmFtZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9TZWN0aW9uX3NlY3Rpb25OYW1lX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfU2VjdGlvbl9zZWN0aW9uTmFtZV9mZWF0dXJlIiwgIl9VSV9TZWN0aW9uX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuU0VDVElPTl9fU0VDVElPTl9OQU1FLCB0cnVlLCBmYWxzZSwKLQkJCQkJCWZhbHNlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsCi0JCQkJCQludWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFNlY3Rpb24gRGVzY3JpcHRpb24gZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRTZWN0aW9uRGVzY3JpcHRpb25Qcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfU2VjdGlvbl9zZWN0aW9uRGVzY3JpcHRpb25fZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9TZWN0aW9uX3NlY3Rpb25EZXNjcmlwdGlvbl9mZWF0dXJlIiwgIl9VSV9TZWN0aW9uX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuU0VDVElPTl9fU0VDVElPTl9ERVNDUklQVElPTiwgdHJ1ZSwKLQkJCQkJCWZhbHNlLCBmYWxzZSwKLQkJCQkJCUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBQcmVkZWNlc3NvciBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFByZWRlY2Vzc29yUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX1NlY3Rpb25fcHJlZGVjZXNzb3JfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9TZWN0aW9uX3ByZWRlY2Vzc29yX2ZlYXR1cmUiLCAiX1VJX1NlY3Rpb25fdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5TRUNUSU9OX19QUkVERUNFU1NPUiwgdHJ1ZSwgZmFsc2UsCi0JCQkJCQl0cnVlLCBudWxsLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBzcGVjaWZpZXMgaG93IHRvIGltcGxlbWVudCB7QGxpbmsgI2dldENoaWxkcmVufSBhbmQgaXMgdXNlZCB0byBkZWR1Y2UgYW4gYXBwcm9wcmlhdGUgZmVhdHVyZSBmb3IgYW4KLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5BZGRDb21tYW5kfSwge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuUmVtb3ZlQ29tbWFuZH0gb3IKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Nb3ZlQ29tbWFuZH0gaW4ge0BsaW5rICNjcmVhdGVDb21tYW5kfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQ29sbGVjdGlvbjw/IGV4dGVuZHMgRVN0cnVjdHVyYWxGZWF0dXJlPiBnZXRDaGlsZHJlbkZlYXR1cmVzKAotCQkJT2JqZWN0IG9iamVjdCkgewotCQlpZiAoY2hpbGRyZW5GZWF0dXJlcyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRDaGlsZHJlbkZlYXR1cmVzKG9iamVjdCk7Ci0JCQljaGlsZHJlbkZlYXR1cmVzLmFkZChVbWFQYWNrYWdlLkxpdGVyYWxzLlNFQ1RJT05fX1NVQl9TRUNUSU9OUyk7Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuRmVhdHVyZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVTdHJ1Y3R1cmFsRmVhdHVyZSBnZXRDaGlsZEZlYXR1cmUoT2JqZWN0IG9iamVjdCwgT2JqZWN0IGNoaWxkKSB7Ci0JCS8vIENoZWNrIHRoZSB0eXBlIG9mIHRoZSBzcGVjaWZpZWQgY2hpbGQgb2JqZWN0IGFuZCByZXR1cm4gdGhlIHByb3BlciBmZWF0dXJlIHRvIHVzZSBmb3IKLQkJLy8gYWRkaW5nIChzZWUge0BsaW5rIEFkZENvbW1hbmR9KSBpdCBhcyBhIGNoaWxkLgotCi0JCXJldHVybiBzdXBlci5nZXRDaGlsZEZlYXR1cmUob2JqZWN0LCBjaGlsZCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIFNlY3Rpb24uZ2lmLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoCi0JCQkJImZ1bGwvb2JqMTYvU2VjdGlvbiIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChTZWN0aW9uKSBvYmplY3QpLmdldE5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX1NlY3Rpb25fdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCWdldFN0cmluZygiX1VJX1NlY3Rpb25fdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0KLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKFNlY3Rpb24uY2xhc3MpKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5TRUNUSU9OX19TRUNUSU9OX05BTUU6Ci0JCWNhc2UgVW1hUGFja2FnZS5TRUNUSU9OX19TRUNUSU9OX0RFU0NSSVBUSU9OOgotCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbgotCQkJCQkuZ2V0Tm90aWZpZXIoKSwgZmFsc2UsIHRydWUpKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlNFQ1RJT05fX1NVQl9TRUNUSU9OUzoKLQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24KLQkJCQkJLmdldE5vdGlmaWVyKCksIHRydWUsIGZhbHNlKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4KLQkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKAotCQkJQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcigKLQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLlNFQ1RJT05fX1NVQl9TRUNUSU9OUywgVW1hRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkJCS5jcmVhdGVTZWN0aW9uKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcigKLQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLlNFQ1RJT05fX1NVQl9TRUNUSU9OUywgVW1hRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkJCS5jcmVhdGVTdGVwKCkpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvU2VtYW50aWNNb2RlbEJyaWRnZUl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1NlbWFudGljTW9kZWxCcmlkZ2VJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzYxOTEwZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvU2VtYW50aWNNb2RlbEJyaWRnZUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlNlbWFudGljTW9kZWxCcmlkZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5TZW1hbnRpY01vZGVsQnJpZGdlfSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBTZW1hbnRpY01vZGVsQnJpZGdlSXRlbVByb3ZpZGVyIGV4dGVuZHMgRGlhZ3JhbUVsZW1lbnRJdGVtUHJvdmlkZXIKLQkJaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTZW1hbnRpY01vZGVsQnJpZGdlSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCWFkZFByZXNlbnRhdGlvblByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgUHJlc2VudGF0aW9uIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkUHJlc2VudGF0aW9uUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX1NlbWFudGljTW9kZWxCcmlkZ2VfcHJlc2VudGF0aW9uX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfU2VtYW50aWNNb2RlbEJyaWRnZV9wcmVzZW50YXRpb25fZmVhdHVyZSIsICJfVUlfU2VtYW50aWNNb2RlbEJyaWRnZV90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLlNFTUFOVElDX01PREVMX0JSSURHRV9fUFJFU0VOVEFUSU9OLAotCQkJCQkJdHJ1ZSwgZmFsc2UsIGZhbHNlLAotCQkJCQkJSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKFNlbWFudGljTW9kZWxCcmlkZ2UpIG9iamVjdCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfU2VtYW50aWNNb2RlbEJyaWRnZV90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJZ2V0U3RyaW5nKCJfVUlfU2VtYW50aWNNb2RlbEJyaWRnZV90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoU2VtYW50aWNNb2RlbEJyaWRnZS5jbGFzcykpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlNFTUFOVElDX01PREVMX0JSSURHRV9fUFJFU0VOVEFUSU9OOgotCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbgotCQkJCQkuZ2V0Tm90aWZpZXIoKSwgZmFsc2UsIHRydWUpKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbgotCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoCi0JCQlDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9TaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudEl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1NpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50SXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmMjNjYTMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1NpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50SXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5TaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudH0gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnRJdGVtUHJvdmlkZXIgZXh0ZW5kcwotCQlTZW1hbnRpY01vZGVsQnJpZGdlSXRlbVByb3ZpZGVyIGltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsCi0JCUlTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLAotCQlJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnRJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJYWRkVHlwZUluZm9Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFR5cGUgSW5mbyBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFR5cGVJbmZvUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX1NpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50X3R5cGVJbmZvX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnRfdHlwZUluZm9fZmVhdHVyZSIsICJfVUlfU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnRfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5TSU1QTEVfU0VNQU5USUNfTU9ERUxfRUxFTUVOVF9fVFlQRV9JTkZPLAotCQkJCQkJdHJ1ZSwgZmFsc2UsIGZhbHNlLAotCQkJCQkJSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIFNpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50LmdpZi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKAotCQkJCSJmdWxsL29iajE2L1NpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50IikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKFNpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50KSBvYmplY3QpLmdldE5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX1NpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50X3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQlnZXRTdHJpbmcoIl9VSV9TaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudF90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnQuY2xhc3MpKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5TSU1QTEVfU0VNQU5USUNfTU9ERUxfRUxFTUVOVF9fVFlQRV9JTkZPOgotCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbgotCQkJCQkuZ2V0Tm90aWZpZXIoKSwgZmFsc2UsIHRydWUpKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbgotCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoCi0JCQlDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9TdGVwSXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvU3RlcEl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMDNiMjJlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9TdGVwSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlN0ZXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuU3RlcH0gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgU3RlcEl0ZW1Qcm92aWRlciBleHRlbmRzIFNlY3Rpb25JdGVtUHJvdmlkZXIgaW1wbGVtZW50cwotCQlJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdGVwSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBzcGVjaWZpZXMgaG93IHRvIGltcGxlbWVudCB7QGxpbmsgI2dldENoaWxkcmVufSBhbmQgaXMgdXNlZCB0byBkZWR1Y2UgYW4gYXBwcm9wcmlhdGUgZmVhdHVyZSBmb3IgYW4KLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5BZGRDb21tYW5kfSwge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuUmVtb3ZlQ29tbWFuZH0gb3IKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Nb3ZlQ29tbWFuZH0gaW4ge0BsaW5rICNjcmVhdGVDb21tYW5kfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQ29sbGVjdGlvbjw/IGV4dGVuZHMgRVN0cnVjdHVyYWxGZWF0dXJlPiBnZXRDaGlsZHJlbkZlYXR1cmVzKAotCQkJT2JqZWN0IG9iamVjdCkgewotCQlpZiAoY2hpbGRyZW5GZWF0dXJlcyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRDaGlsZHJlbkZlYXR1cmVzKG9iamVjdCk7Ci0JCQljaGlsZHJlbkZlYXR1cmVzCi0JCQkJCS5hZGQoVW1hUGFja2FnZS5MaXRlcmFscy5XT1JLX0RFRklOSVRJT05fX1BSRUNPTkRJVElPTik7Ci0JCQljaGlsZHJlbkZlYXR1cmVzCi0JCQkJCS5hZGQoVW1hUGFja2FnZS5MaXRlcmFscy5XT1JLX0RFRklOSVRJT05fX1BPU1RDT05ESVRJT04pOwotCQl9Ci0JCXJldHVybiBjaGlsZHJlbkZlYXR1cmVzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFU3RydWN0dXJhbEZlYXR1cmUgZ2V0Q2hpbGRGZWF0dXJlKE9iamVjdCBvYmplY3QsIE9iamVjdCBjaGlsZCkgewotCQkvLyBDaGVjayB0aGUgdHlwZSBvZiB0aGUgc3BlY2lmaWVkIGNoaWxkIG9iamVjdCBhbmQgcmV0dXJuIHRoZSBwcm9wZXIgZmVhdHVyZSB0byB1c2UgZm9yCi0JCS8vIGFkZGluZyAoc2VlIHtAbGluayBBZGRDb21tYW5kfSkgaXQgYXMgYSBjaGlsZC4KLQotCQlyZXR1cm4gc3VwZXIuZ2V0Q2hpbGRGZWF0dXJlKG9iamVjdCwgY2hpbGQpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBTdGVwLmdpZi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKAotCQkJCSJmdWxsL29iajE2L1N0ZXAiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoU3RlcCkgb2JqZWN0KS5nZXROYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9TdGVwX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQlnZXRTdHJpbmcoIl9VSV9TdGVwX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCi0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChTdGVwLmNsYXNzKSkgewotCQljYXNlIFVtYVBhY2thZ2UuU1RFUF9fUFJFQ09ORElUSU9OOgotCQljYXNlIFVtYVBhY2thZ2UuU1RFUF9fUE9TVENPTkRJVElPTjoKLQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24KLQkJCQkJLmdldE5vdGlmaWVyKCksIHRydWUsIGZhbHNlKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4KLQkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKAotCQkJQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcigKLQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLldPUktfREVGSU5JVElPTl9fUFJFQ09ORElUSU9OLAotCQkJCVVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUNvbnN0cmFpbnQoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKAotCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuV09SS19ERUZJTklUSU9OX19QT1NUQ09ORElUSU9OLAotCQkJCVVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUNvbnN0cmFpbnQoKSkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3Ige0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ3JlYXRlQ2hpbGRDb21tYW5kfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldENyZWF0ZUNoaWxkVGV4dChPYmplY3Qgb3duZXIsIE9iamVjdCBmZWF0dXJlLAotCQkJT2JqZWN0IGNoaWxkLCBDb2xsZWN0aW9uPD8+IHNlbGVjdGlvbikgewotCQlPYmplY3QgY2hpbGRGZWF0dXJlID0gZmVhdHVyZTsKLQkJT2JqZWN0IGNoaWxkT2JqZWN0ID0gY2hpbGQ7Ci0KLQkJYm9vbGVhbiBxdWFsaWZ5ID0gY2hpbGRGZWF0dXJlID09IFVtYVBhY2thZ2UuTGl0ZXJhbHMuTUVUSE9EX0VMRU1FTlRfX09XTkVEX1JVTEVTCi0JCQkJfHwgY2hpbGRGZWF0dXJlID09IFVtYVBhY2thZ2UuTGl0ZXJhbHMuV09SS19ERUZJTklUSU9OX19QUkVDT05ESVRJT04KLQkJCQl8fCBjaGlsZEZlYXR1cmUgPT0gVW1hUGFja2FnZS5MaXRlcmFscy5XT1JLX0RFRklOSVRJT05fX1BPU1RDT05ESVRJT047Ci0KLQkJaWYgKHF1YWxpZnkpIHsKLQkJCXJldHVybiBnZXRTdHJpbmcoIl9VSV9DcmVhdGVDaGlsZF90ZXh0MiIsIC8vJE5PTi1OTFMtMSQKLQkJCQkJbmV3IE9iamVjdFtdIHsgZ2V0VHlwZVRleHQoY2hpbGRPYmplY3QpLAotCQkJCQkJCWdldEZlYXR1cmVUZXh0KGNoaWxkRmVhdHVyZSksIGdldFR5cGVUZXh0KG93bmVyKSB9KTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0Q3JlYXRlQ2hpbGRUZXh0KG93bmVyLCBmZWF0dXJlLCBjaGlsZCwgc2VsZWN0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvU3VwcG9ydGluZ01hdGVyaWFsSXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvU3VwcG9ydGluZ01hdGVyaWFsSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzODgzY2MuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1N1cHBvcnRpbmdNYXRlcmlhbEl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5TdXBwb3J0aW5nTWF0ZXJpYWw7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlN1cHBvcnRpbmdNYXRlcmlhbH0gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgU3VwcG9ydGluZ01hdGVyaWFsSXRlbVByb3ZpZGVyIGV4dGVuZHMgR3VpZGFuY2VJdGVtUHJvdmlkZXIKLQkJaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdXBwb3J0aW5nTWF0ZXJpYWxJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgU3VwcG9ydGluZ01hdGVyaWFsLmdpZi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKAotCQkJCSJmdWxsL29iajE2L1N1cHBvcnRpbmdNYXRlcmlhbCIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChTdXBwb3J0aW5nTWF0ZXJpYWwpIG9iamVjdCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfU3VwcG9ydGluZ01hdGVyaWFsX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQlnZXRTdHJpbmcoIl9VSV9TdXBwb3J0aW5nTWF0ZXJpYWxfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuCi0JICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycygKLQkJCUNvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1Rhc2tEZXNjcmlwdGlvbkl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1Rhc2tEZXNjcmlwdGlvbkl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MDFmMmM1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9UYXNrRGVzY3JpcHRpb25JdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRpb259IG9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFRhc2tEZXNjcmlwdGlvbkl0ZW1Qcm92aWRlciBleHRlbmRzIENvbnRlbnREZXNjcmlwdGlvbkl0ZW1Qcm92aWRlcgotCQlpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFRhc2tEZXNjcmlwdGlvbkl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIExpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlhZGRQdXJwb3NlUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRBbHRlcm5hdGl2ZXNQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFB1cnBvc2UgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRQdXJwb3NlUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX1Rhc2tEZXNjcmlwdGlvbl9wdXJwb3NlX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfVGFza0Rlc2NyaXB0aW9uX3B1cnBvc2VfZmVhdHVyZSIsICJfVUlfVGFza0Rlc2NyaXB0aW9uX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuVEFTS19ERVNDUklQVElPTl9fUFVSUE9TRSwgdHJ1ZSwKLQkJCQkJCWZhbHNlLCBmYWxzZSwKLQkJCQkJCUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBBbHRlcm5hdGl2ZXMgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRBbHRlcm5hdGl2ZXNQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfVGFza0Rlc2NyaXB0aW9uX2FsdGVybmF0aXZlc19mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1Rhc2tEZXNjcmlwdGlvbl9hbHRlcm5hdGl2ZXNfZmVhdHVyZSIsICJfVUlfVGFza0Rlc2NyaXB0aW9uX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuVEFTS19ERVNDUklQVElPTl9fQUxURVJOQVRJVkVTLAotCQkJCQkJdHJ1ZSwgZmFsc2UsIGZhbHNlLAotCQkJCQkJSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIFRhc2tEZXNjcmlwdGlvbi5naWYuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgKLQkJCQkiZnVsbC9vYmoxNi9UYXNrRGVzY3JpcHRpb24iKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoVGFza0Rlc2NyaXB0aW9uKSBvYmplY3QpLmdldE5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX1Rhc2tEZXNjcmlwdGlvbl90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJZ2V0U3RyaW5nKCJfVUlfVGFza0Rlc2NyaXB0aW9uX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCi0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChUYXNrRGVzY3JpcHRpb24uY2xhc3MpKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUSU9OX19QVVJQT1NFOgotCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVElPTl9fQUxURVJOQVRJVkVTOgotCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbgotCQkJCQkuZ2V0Tm90aWZpZXIoKSwgZmFsc2UsIHRydWUpKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbgotCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoCi0JCQlDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9UYXNrRGVzY3JpcHRvckl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1Rhc2tEZXNjcmlwdG9ySXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmZmFmNjMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1Rhc2tEZXNjcmlwdG9ySXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMzYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRvcn0gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgVGFza0Rlc2NyaXB0b3JJdGVtUHJvdmlkZXIgZXh0ZW5kcwotCQlXb3JrQnJlYWtkb3duRWxlbWVudEl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLAotCQlJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFRhc2tEZXNjcmlwdG9ySXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCWFkZElzU3luY2hyb25pemVkV2l0aFNvdXJjZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkVGFza1Byb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkQWRkaXRpb25hbGx5UGVyZm9ybWVkQnlQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZEFzc2lzdGVkQnlQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZEV4dGVybmFsSW5wdXRQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZE1hbmRhdG9yeUlucHV0UHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRPcHRpb25hbElucHV0UHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRPdXRwdXRQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZFBlcmZvcm1lZFByaW1hcmlseUJ5UHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRTZWxlY3RlZFN0ZXBzUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBJcyBTeW5jaHJvbml6ZWQgV2l0aCBTb3VyY2UgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRJc1N5bmNocm9uaXplZFdpdGhTb3VyY2VQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfRGVzY3JpcHRvcl9pc1N5bmNocm9uaXplZFdpdGhTb3VyY2VfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9EZXNjcmlwdG9yX2lzU3luY2hyb25pemVkV2l0aFNvdXJjZV9mZWF0dXJlIiwgIl9VSV9EZXNjcmlwdG9yX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuREVTQ1JJUFRPUl9fSVNfU1lOQ0hST05JWkVEX1dJVEhfU09VUkNFLAotCQkJCQkJdHJ1ZSwgZmFsc2UsIGZhbHNlLAotCQkJCQkJSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFRhc2sgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRUYXNrUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX1Rhc2tEZXNjcmlwdG9yX1Rhc2tfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9UYXNrRGVzY3JpcHRvcl9UYXNrX2ZlYXR1cmUiLCAiX1VJX1Rhc2tEZXNjcmlwdG9yX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuVEFTS19ERVNDUklQVE9SX19UQVNLLCB0cnVlLCBmYWxzZSwKLQkJCQkJCXRydWUsIG51bGwsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgQWRkaXRpb25hbGx5IFBlcmZvcm1lZCBCeSBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5UHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX1Rhc2tEZXNjcmlwdG9yX2FkZGl0aW9uYWxseVBlcmZvcm1lZEJ5X2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfVGFza0Rlc2NyaXB0b3JfYWRkaXRpb25hbGx5UGVyZm9ybWVkQnlfZmVhdHVyZSIsICJfVUlfVGFza0Rlc2NyaXB0b3JfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5UQVNLX0RFU0NSSVBUT1JfX0FERElUSU9OQUxMWV9QRVJGT1JNRURfQlksCi0JCQkJCQl0cnVlLCBmYWxzZSwgdHJ1ZSwgbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBBc3Npc3RlZCBCeSBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEFzc2lzdGVkQnlQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfVGFza0Rlc2NyaXB0b3JfYXNzaXN0ZWRCeV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1Rhc2tEZXNjcmlwdG9yX2Fzc2lzdGVkQnlfZmVhdHVyZSIsICJfVUlfVGFza0Rlc2NyaXB0b3JfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5UQVNLX0RFU0NSSVBUT1JfX0FTU0lTVEVEX0JZLCB0cnVlLAotCQkJCQkJZmFsc2UsIHRydWUsIG51bGwsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgRXh0ZXJuYWwgSW5wdXQgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRFeHRlcm5hbElucHV0UHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX1Rhc2tEZXNjcmlwdG9yX2V4dGVybmFsSW5wdXRfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9UYXNrRGVzY3JpcHRvcl9leHRlcm5hbElucHV0X2ZlYXR1cmUiLCAiX1VJX1Rhc2tEZXNjcmlwdG9yX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuVEFTS19ERVNDUklQVE9SX19FWFRFUk5BTF9JTlBVVCwKLQkJCQkJCXRydWUsIGZhbHNlLCB0cnVlLCBudWxsLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIE1hbmRhdG9yeSBJbnB1dCBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZE1hbmRhdG9yeUlucHV0UHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX1Rhc2tEZXNjcmlwdG9yX21hbmRhdG9yeUlucHV0X2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfVGFza0Rlc2NyaXB0b3JfbWFuZGF0b3J5SW5wdXRfZmVhdHVyZSIsICJfVUlfVGFza0Rlc2NyaXB0b3JfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5UQVNLX0RFU0NSSVBUT1JfX01BTkRBVE9SWV9JTlBVVCwKLQkJCQkJCXRydWUsIGZhbHNlLCB0cnVlLCBudWxsLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIE9wdGlvbmFsIElucHV0IGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkT3B0aW9uYWxJbnB1dFByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9UYXNrRGVzY3JpcHRvcl9vcHRpb25hbElucHV0X2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfVGFza0Rlc2NyaXB0b3Jfb3B0aW9uYWxJbnB1dF9mZWF0dXJlIiwgIl9VSV9UYXNrRGVzY3JpcHRvcl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLlRBU0tfREVTQ1JJUFRPUl9fT1BUSU9OQUxfSU5QVVQsCi0JCQkJCQl0cnVlLCBmYWxzZSwgdHJ1ZSwgbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBPdXRwdXQgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRPdXRwdXRQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfVGFza0Rlc2NyaXB0b3Jfb3V0cHV0X2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfVGFza0Rlc2NyaXB0b3Jfb3V0cHV0X2ZlYXR1cmUiLCAiX1VJX1Rhc2tEZXNjcmlwdG9yX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuVEFTS19ERVNDUklQVE9SX19PVVRQVVQsIHRydWUsCi0JCQkJCQlmYWxzZSwgdHJ1ZSwgbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBQZXJmb3JtZWQgUHJpbWFyaWx5IEJ5IGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkUGVyZm9ybWVkUHJpbWFyaWx5QnlQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfVGFza0Rlc2NyaXB0b3JfcGVyZm9ybWVkUHJpbWFyaWx5QnlfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9UYXNrRGVzY3JpcHRvcl9wZXJmb3JtZWRQcmltYXJpbHlCeV9mZWF0dXJlIiwgIl9VSV9UYXNrRGVzY3JpcHRvcl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLlRBU0tfREVTQ1JJUFRPUl9fUEVSRk9STUVEX1BSSU1BUklMWV9CWSwKLQkJCQkJCXRydWUsIGZhbHNlLCB0cnVlLCBudWxsLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFNlbGVjdGVkIFN0ZXBzIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkU2VsZWN0ZWRTdGVwc1Byb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9UYXNrRGVzY3JpcHRvcl9zZWxlY3RlZFN0ZXBzX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfVGFza0Rlc2NyaXB0b3Jfc2VsZWN0ZWRTdGVwc19mZWF0dXJlIiwgIl9VSV9UYXNrRGVzY3JpcHRvcl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLlRBU0tfREVTQ1JJUFRPUl9fU0VMRUNURURfU1RFUFMsCi0JCQkJCQl0cnVlLCBmYWxzZSwgdHJ1ZSwgbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBUYXNrRGVzY3JpcHRvci5naWYuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgKLQkJCQkiZnVsbC9vYmoxNi9UYXNrRGVzY3JpcHRvciIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChUYXNrRGVzY3JpcHRvcikgb2JqZWN0KS5nZXROYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9UYXNrRGVzY3JpcHRvcl90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJZ2V0U3RyaW5nKCJfVUlfVGFza0Rlc2NyaXB0b3JfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0KLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKFRhc2tEZXNjcmlwdG9yLmNsYXNzKSkgewotCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19JU19TWU5DSFJPTklaRURfV0lUSF9TT1VSQ0U6Ci0JCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uCi0JCQkJCS5nZXROb3RpZmllcigpLCBmYWxzZSwgdHJ1ZSkpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuCi0JICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycygKLQkJCUNvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1Rhc2tJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9UYXNrSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmNGY3NzguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1Rhc2tJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2t9IG9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFRhc2tJdGVtUHJvdmlkZXIgZXh0ZW5kcyBDb250ZW50RWxlbWVudEl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzCi0JCUlFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFRhc2tJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJYWRkUGVyZm9ybWVkQnlQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZE1hbmRhdG9yeUlucHV0UHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRPdXRwdXRQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZEFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5UHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRPcHRpb25hbElucHV0UHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRTdGVwc1Byb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkVG9vbE1lbnRvcnNQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZEVzdGltYXRpb25Db25zaWRlcmF0aW9uc1Byb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgUGVyZm9ybWVkIEJ5IGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkUGVyZm9ybWVkQnlQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfVGFza19wZXJmb3JtZWRCeV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1Rhc2tfcGVyZm9ybWVkQnlfZmVhdHVyZSIsICJfVUlfVGFza190eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLlRBU0tfX1BFUkZPUk1FRF9CWSwgdHJ1ZSwgZmFsc2UsCi0JCQkJCQl0cnVlLCBudWxsLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIE1hbmRhdG9yeSBJbnB1dCBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZE1hbmRhdG9yeUlucHV0UHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX1Rhc2tfbWFuZGF0b3J5SW5wdXRfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9UYXNrX21hbmRhdG9yeUlucHV0X2ZlYXR1cmUiLCAiX1VJX1Rhc2tfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5UQVNLX19NQU5EQVRPUllfSU5QVVQsIHRydWUsIGZhbHNlLAotCQkJCQkJdHJ1ZSwgbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBPdXRwdXQgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRPdXRwdXRQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfVGFza19vdXRwdXRfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9UYXNrX291dHB1dF9mZWF0dXJlIiwgIl9VSV9UYXNrX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuVEFTS19fT1VUUFVULCB0cnVlLCBmYWxzZSwgdHJ1ZSwKLQkJCQkJCW51bGwsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgQWRkaXRpb25hbGx5IFBlcmZvcm1lZCBCeSBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5UHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX1Rhc2tfYWRkaXRpb25hbGx5UGVyZm9ybWVkQnlfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9UYXNrX2FkZGl0aW9uYWxseVBlcmZvcm1lZEJ5X2ZlYXR1cmUiLCAiX1VJX1Rhc2tfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5UQVNLX19BRERJVElPTkFMTFlfUEVSRk9STUVEX0JZLAotCQkJCQkJdHJ1ZSwgZmFsc2UsIHRydWUsIG51bGwsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgT3B0aW9uYWwgSW5wdXQgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRPcHRpb25hbElucHV0UHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX1Rhc2tfb3B0aW9uYWxJbnB1dF9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1Rhc2tfb3B0aW9uYWxJbnB1dF9mZWF0dXJlIiwgIl9VSV9UYXNrX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuVEFTS19fT1BUSU9OQUxfSU5QVVQsIHRydWUsIGZhbHNlLAotCQkJCQkJdHJ1ZSwgbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBTdGVwcyBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFN0ZXBzUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX1Rhc2tfc3RlcHNfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9UYXNrX3N0ZXBzX2ZlYXR1cmUiLCAiX1VJX1Rhc2tfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5UQVNLX19TVEVQUywgdHJ1ZSwgZmFsc2UsIHRydWUsCi0JCQkJCQludWxsLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFRvb2wgTWVudG9ycyBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFRvb2xNZW50b3JzUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX1Rhc2tfdG9vbE1lbnRvcnNfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9UYXNrX3Rvb2xNZW50b3JzX2ZlYXR1cmUiLCAiX1VJX1Rhc2tfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5UQVNLX19UT09MX01FTlRPUlMsIHRydWUsIGZhbHNlLAotCQkJCQkJdHJ1ZSwgbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBFc3RpbWF0aW9uIENvbnNpZGVyYXRpb25zIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX1Rhc2tfZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfVGFza19lc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnNfZmVhdHVyZSIsICJfVUlfVGFza190eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLlRBU0tfX0VTVElNQVRJT05fQ09OU0lERVJBVElPTlMsCi0JCQkJCQl0cnVlLCBmYWxzZSwgdHJ1ZSwgbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgc3BlY2lmaWVzIGhvdyB0byBpbXBsZW1lbnQge0BsaW5rICNnZXRDaGlsZHJlbn0gYW5kIGlzIHVzZWQgdG8gZGVkdWNlIGFuIGFwcHJvcHJpYXRlIGZlYXR1cmUgZm9yIGFuCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQWRkQ29tbWFuZH0sIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLlJlbW92ZUNvbW1hbmR9IG9yCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuTW92ZUNvbW1hbmR9IGluIHtAbGluayAjY3JlYXRlQ29tbWFuZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIENvbGxlY3Rpb248PyBleHRlbmRzIEVTdHJ1Y3R1cmFsRmVhdHVyZT4gZ2V0Q2hpbGRyZW5GZWF0dXJlcygKLQkJCU9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGNoaWxkcmVuRmVhdHVyZXMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0Q2hpbGRyZW5GZWF0dXJlcyhvYmplY3QpOwotCQkJY2hpbGRyZW5GZWF0dXJlcwotCQkJCQkuYWRkKFVtYVBhY2thZ2UuTGl0ZXJhbHMuV09SS19ERUZJTklUSU9OX19QUkVDT05ESVRJT04pOwotCQkJY2hpbGRyZW5GZWF0dXJlcwotCQkJCQkuYWRkKFVtYVBhY2thZ2UuTGl0ZXJhbHMuV09SS19ERUZJTklUSU9OX19QT1NUQ09ORElUSU9OKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW5GZWF0dXJlczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRVN0cnVjdHVyYWxGZWF0dXJlIGdldENoaWxkRmVhdHVyZShPYmplY3Qgb2JqZWN0LCBPYmplY3QgY2hpbGQpIHsKLQkJLy8gQ2hlY2sgdGhlIHR5cGUgb2YgdGhlIHNwZWNpZmllZCBjaGlsZCBvYmplY3QgYW5kIHJldHVybiB0aGUgcHJvcGVyIGZlYXR1cmUgdG8gdXNlIGZvcgotCQkvLyBhZGRpbmcgKHNlZSB7QGxpbmsgQWRkQ29tbWFuZH0pIGl0IGFzIGEgY2hpbGQuCi0KLQkJcmV0dXJuIHN1cGVyLmdldENoaWxkRmVhdHVyZShvYmplY3QsIGNoaWxkKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgVGFzay5naWYuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgKLQkJCQkiZnVsbC9vYmoxNi9UYXNrIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKFRhc2spIG9iamVjdCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfVGFza190eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJZ2V0U3RyaW5nKCJfVUlfVGFza190eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoVGFzay5jbGFzcykpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfX1BSRUNPTkRJVElPTjoKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfX1BPU1RDT05ESVRJT046Ci0JCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uCi0JCQkJCS5nZXROb3RpZmllcigpLCB0cnVlLCBmYWxzZSkpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuCi0JICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycygKLQkJCUNvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5XT1JLX0RFRklOSVRJT05fX1BSRUNPTkRJVElPTiwKLQkJCQlVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVDb25zdHJhaW50KCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcigKLQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLldPUktfREVGSU5JVElPTl9fUE9TVENPTkRJVElPTiwKLQkJCQlVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVDb25zdHJhaW50KCkpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNyZWF0ZUNoaWxkQ29tbWFuZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRDcmVhdGVDaGlsZFRleHQoT2JqZWN0IG93bmVyLCBPYmplY3QgZmVhdHVyZSwKLQkJCU9iamVjdCBjaGlsZCwgQ29sbGVjdGlvbjw/PiBzZWxlY3Rpb24pIHsKLQkJT2JqZWN0IGNoaWxkRmVhdHVyZSA9IGZlYXR1cmU7Ci0JCU9iamVjdCBjaGlsZE9iamVjdCA9IGNoaWxkOwotCi0JCWJvb2xlYW4gcXVhbGlmeSA9IGNoaWxkRmVhdHVyZSA9PSBVbWFQYWNrYWdlLkxpdGVyYWxzLk1FVEhPRF9FTEVNRU5UX19PV05FRF9SVUxFUwotCQkJCXx8IGNoaWxkRmVhdHVyZSA9PSBVbWFQYWNrYWdlLkxpdGVyYWxzLldPUktfREVGSU5JVElPTl9fUFJFQ09ORElUSU9OCi0JCQkJfHwgY2hpbGRGZWF0dXJlID09IFVtYVBhY2thZ2UuTGl0ZXJhbHMuV09SS19ERUZJTklUSU9OX19QT1NUQ09ORElUSU9OOwotCi0JCWlmIChxdWFsaWZ5KSB7Ci0JCQlyZXR1cm4gZ2V0U3RyaW5nKCJfVUlfQ3JlYXRlQ2hpbGRfdGV4dDIiLCAvLyROT04tTkxTLTEkCi0JCQkJCW5ldyBPYmplY3RbXSB7IGdldFR5cGVUZXh0KGNoaWxkT2JqZWN0KSwKLQkJCQkJCQlnZXRGZWF0dXJlVGV4dChjaGlsZEZlYXR1cmUpLCBnZXRUeXBlVGV4dChvd25lcikgfSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldENyZWF0ZUNoaWxkVGV4dChvd25lciwgZmVhdHVyZSwgY2hpbGQsIHNlbGVjdGlvbik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1RlYW1Qcm9maWxlSXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvVGVhbVByb2ZpbGVJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDUyNzUwMS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvVGVhbVByb2ZpbGVJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZWFtUHJvZmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlRlYW1Qcm9maWxlfSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBUZWFtUHJvZmlsZUl0ZW1Qcm92aWRlciBleHRlbmRzIEJyZWFrZG93bkVsZW1lbnRJdGVtUHJvdmlkZXIKLQkJaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUZWFtUHJvZmlsZUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIExpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlhZGRUZWFtUm9sZXNQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZFN1cGVyVGVhbVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkU3ViVGVhbVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgVGVhbSBSb2xlcyBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFRlYW1Sb2xlc1Byb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9UZWFtUHJvZmlsZV90ZWFtUm9sZXNfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9UZWFtUHJvZmlsZV90ZWFtUm9sZXNfZmVhdHVyZSIsICJfVUlfVGVhbVByb2ZpbGVfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5URUFNX1BST0ZJTEVfX1RFQU1fUk9MRVMsIHRydWUsCi0JCQkJCQlmYWxzZSwgdHJ1ZSwgbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBTdXBlciBUZWFtIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkU3VwZXJUZWFtUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX1RlYW1Qcm9maWxlX3N1cGVyVGVhbV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1RlYW1Qcm9maWxlX3N1cGVyVGVhbV9mZWF0dXJlIiwgIl9VSV9UZWFtUHJvZmlsZV90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLlRFQU1fUFJPRklMRV9fU1VQRVJfVEVBTSwgdHJ1ZSwKLQkJCQkJCWZhbHNlLCB0cnVlLCBudWxsLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFN1YiBUZWFtIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkU3ViVGVhbVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9UZWFtUHJvZmlsZV9zdWJUZWFtX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfVGVhbVByb2ZpbGVfc3ViVGVhbV9mZWF0dXJlIiwgIl9VSV9UZWFtUHJvZmlsZV90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLlRFQU1fUFJPRklMRV9fU1VCX1RFQU0sIHRydWUsCi0JCQkJCQlmYWxzZSwgdHJ1ZSwgbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBUZWFtUHJvZmlsZS5naWYuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgKLQkJCQkiZnVsbC9vYmoxNi9UZWFtUHJvZmlsZSIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChUZWFtUHJvZmlsZSkgb2JqZWN0KS5nZXROYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9UZWFtUHJvZmlsZV90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJZ2V0U3RyaW5nKCJfVUlfVGVhbVByb2ZpbGVfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuCi0JICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycygKLQkJCUNvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1RlbXBsYXRlSXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvVGVtcGxhdGVJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjRhNDliMy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvVGVtcGxhdGVJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGVtcGxhdGU7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlRlbXBsYXRlfSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBUZW1wbGF0ZUl0ZW1Qcm92aWRlciBleHRlbmRzIEd1aWRhbmNlSXRlbVByb3ZpZGVyIGltcGxlbWVudHMKLQkJSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVGVtcGxhdGVJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgVGVtcGxhdGUuZ2lmLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoCi0JCQkJImZ1bGwvb2JqMTYvVGVtcGxhdGUiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoVGVtcGxhdGUpIG9iamVjdCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfVGVtcGxhdGVfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCWdldFN0cmluZygiX1VJX1RlbXBsYXRlX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbgotCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoCi0JCQlDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9UZXJtRGVmaW5pdGlvbkl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1Rlcm1EZWZpbml0aW9uSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiZjBhY2QuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1Rlcm1EZWZpbml0aW9uSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRlcm1EZWZpbml0aW9uOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZXJtRGVmaW5pdGlvbn0gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgVGVybURlZmluaXRpb25JdGVtUHJvdmlkZXIgZXh0ZW5kcyBHdWlkYW5jZUl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzCi0JCUlFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFRlcm1EZWZpbml0aW9uSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIFRlcm1EZWZpbml0aW9uLmdpZi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKAotCQkJCSJmdWxsL29iajE2L1Rlcm1EZWZpbml0aW9uIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKFRlcm1EZWZpbml0aW9uKSBvYmplY3QpLmdldE5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX1Rlcm1EZWZpbml0aW9uX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQlnZXRTdHJpbmcoIl9VSV9UZXJtRGVmaW5pdGlvbl90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4KLQkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKAotCQkJQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvVGV4dEVsZW1lbnRJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9UZXh0RWxlbWVudEl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MzE4ZDFlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9UZXh0RWxlbWVudEl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRleHRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVGV4dEVsZW1lbnR9IG9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFRleHRFbGVtZW50SXRlbVByb3ZpZGVyIGV4dGVuZHMgTGVhZkVsZW1lbnRJdGVtUHJvdmlkZXIgaW1wbGVtZW50cwotCQlJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUZXh0RWxlbWVudEl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIExpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlhZGRUZXh0UHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBUZXh0IGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkVGV4dFByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9UZXh0RWxlbWVudF90ZXh0X2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfVGV4dEVsZW1lbnRfdGV4dF9mZWF0dXJlIiwgIl9VSV9UZXh0RWxlbWVudF90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLlRFWFRfRUxFTUVOVF9fVEVYVCwgdHJ1ZSwgZmFsc2UsCi0JCQkJCQlmYWxzZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLAotCQkJCQkJbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBUZXh0RWxlbWVudC5naWYuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgKLQkJCQkiZnVsbC9vYmoxNi9UZXh0RWxlbWVudCIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChUZXh0RWxlbWVudCkgb2JqZWN0KS5nZXROYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9UZXh0RWxlbWVudF90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJZ2V0U3RyaW5nKCJfVUlfVGV4dEVsZW1lbnRfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0KLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKFRleHRFbGVtZW50LmNsYXNzKSkgewotCQljYXNlIFVtYVBhY2thZ2UuVEVYVF9FTEVNRU5UX19URVhUOgotCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbgotCQkJCQkuZ2V0Tm90aWZpZXIoKSwgZmFsc2UsIHRydWUpKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbgotCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoCi0JCQlDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9Ub29sSXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvVG9vbEl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOWY4OTYwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9Ub29sSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVG9vbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlRvb2x9IG9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFRvb2xJdGVtUHJvdmlkZXIgZXh0ZW5kcyBDb250ZW50Q2F0ZWdvcnlJdGVtUHJvdmlkZXIgaW1wbGVtZW50cwotCQlJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUb29sSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCWFkZFRvb2xNZW50b3JzUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBUb29sIE1lbnRvcnMgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRUb29sTWVudG9yc1Byb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9Ub29sX3Rvb2xNZW50b3JzX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfVG9vbF90b29sTWVudG9yc19mZWF0dXJlIiwgIl9VSV9Ub29sX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuVE9PTF9fVE9PTF9NRU5UT1JTLCB0cnVlLCBmYWxzZSwKLQkJCQkJCXRydWUsIG51bGwsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgVG9vbC5naWYuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgKLQkJCQkiZnVsbC9vYmoxNi9Ub29sIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKFRvb2wpIG9iamVjdCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfVG9vbF90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJZ2V0U3RyaW5nKCJfVUlfVG9vbF90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4KLQkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKAotCQkJQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvVG9vbE1lbnRvckl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1Rvb2xNZW50b3JJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2Q2MzIzYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvVG9vbE1lbnRvckl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Ub29sTWVudG9yOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Ub29sTWVudG9yfSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBUb29sTWVudG9ySXRlbVByb3ZpZGVyIGV4dGVuZHMgR3VpZGFuY2VJdGVtUHJvdmlkZXIgaW1wbGVtZW50cwotCQlJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUb29sTWVudG9ySXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIFRvb2xNZW50b3IuZ2lmLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoCi0JCQkJImZ1bGwvb2JqMTYvVG9vbE1lbnRvciIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChUb29sTWVudG9yKSBvYmplY3QpLmdldE5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX1Rvb2xNZW50b3JfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCWdldFN0cmluZygiX1VJX1Rvb2xNZW50b3JfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuCi0JICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycygKLQkJCUNvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1R5cGVJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9UeXBlSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmZmE5MTAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1R5cGVJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVHlwZTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVHlwZX0gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgVHlwZUl0ZW1Qcm92aWRlciBleHRlbmRzIFBhY2thZ2VhYmxlRWxlbWVudEl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzCi0JCUlFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFR5cGVJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoVHlwZSkgb2JqZWN0KS5nZXROYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9UeXBlX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQlnZXRTdHJpbmcoIl9VSV9UeXBlX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbgotCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoCi0JCQlDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9VTUFTZW1hbnRpY01vZGVsQnJpZGdlSXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvVU1BU2VtYW50aWNNb2RlbEJyaWRnZUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiODAxZGFhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9VTUFTZW1hbnRpY01vZGVsQnJpZGdlSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVU1BU2VtYW50aWNNb2RlbEJyaWRnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlVNQVNlbWFudGljTW9kZWxCcmlkZ2V9IG9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFVNQVNlbWFudGljTW9kZWxCcmlkZ2VJdGVtUHJvdmlkZXIgZXh0ZW5kcwotCQlTZW1hbnRpY01vZGVsQnJpZGdlSXRlbVByb3ZpZGVyIGltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsCi0JCUlTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLAotCQlJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVU1BU2VtYW50aWNNb2RlbEJyaWRnZUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIExpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlhZGRFbGVtZW50UHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBFbGVtZW50IGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkRWxlbWVudFByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9VTUFTZW1hbnRpY01vZGVsQnJpZGdlX2VsZW1lbnRfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9VTUFTZW1hbnRpY01vZGVsQnJpZGdlX2VsZW1lbnRfZmVhdHVyZSIsICJfVUlfVU1BU2VtYW50aWNNb2RlbEJyaWRnZV90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLlVNQV9TRU1BTlRJQ19NT0RFTF9CUklER0VfX0VMRU1FTlQsCi0JCQkJCQl0cnVlLCBmYWxzZSwgdHJ1ZSwgbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBVTUFTZW1hbnRpY01vZGVsQnJpZGdlLmdpZi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKAotCQkJCSJmdWxsL29iajE2L1VNQVNlbWFudGljTW9kZWxCcmlkZ2UiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoVU1BU2VtYW50aWNNb2RlbEJyaWRnZSkgb2JqZWN0KS5nZXROYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9VTUFTZW1hbnRpY01vZGVsQnJpZGdlX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQlnZXRTdHJpbmcoIl9VSV9VTUFTZW1hbnRpY01vZGVsQnJpZGdlX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbgotCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoCi0JCQlDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9VbWFFZGl0UGx1Z2luLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvVW1hRWRpdFBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NGQxY2QyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9VbWFFZGl0UGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5FTUZQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBjZW50cmFsIHNpbmdsZXRvbiBmb3IgdGhlIFVtYSBlZGl0IHBsdWdpbi4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFVtYUVkaXRQbHVnaW4gZXh0ZW5kcyBFTUZQbHVnaW4gewotCS8qKgotCSAqIEtlZXAgdHJhY2sgb2YgdGhlIHNpbmdsZXRvbi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFVtYUVkaXRQbHVnaW4gSU5TVEFOQ0UgPSBuZXcgVW1hRWRpdFBsdWdpbigpOwotCi0JLyoqCi0JICogS2VlcCB0cmFjayBvZiB0aGUgc2luZ2xldG9uLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIEltcGxlbWVudGF0aW9uIHBsdWdpbjsKLQotCS8qKgotCSAqIENyZWF0ZSB0aGUgaW5zdGFuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFVtYUVkaXRQbHVnaW4oKSB7Ci0JCXN1cGVyKG5ldyBSZXNvdXJjZUxvY2F0b3JbXSB7fSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBFY2xpcHNlIHBsdWdpbi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHNpbmdsZXRvbiBpbnN0YW5jZS4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRQbHVnaW5SZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBwbHVnaW47Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBFY2xpcHNlIHBsdWdpbi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHNpbmdsZXRvbiBpbnN0YW5jZS4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBJbXBsZW1lbnRhdGlvbiBnZXRQbHVnaW4oKSB7Ci0JCXJldHVybiBwbHVnaW47Ci0JfQotCi0JLyoqCi0JICogVGhlIGFjdHVhbCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgRWNsaXBzZSA8Yj5QbHVnaW48L2I+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2xhc3MgSW1wbGVtZW50YXRpb24gZXh0ZW5kcyBFY2xpcHNlUGx1Z2luIHsKLQkJLyoqCi0JCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2UuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgSW1wbGVtZW50YXRpb24oKSB7Ci0JCQlzdXBlcigpOwotCi0JCQkvLyBSZW1lbWJlciB0aGUgc3RhdGljIGluc3RhbmNlLgotCQkJLy8KLQkJCXBsdWdpbiA9IHRoaXM7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9VbWFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1VtYUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzNDgzNGEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1VtYUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDEyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ2hhbmdlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlZEFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklDaGFuZ2VOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRGlzcG9zYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JTm90aWZ5Q2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYUFkYXB0ZXJGYWN0b3J5OwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGZhY3RvcnkgdGhhdCBpcyB1c2VkIHRvIHByb3ZpZGUgdGhlIGludGVyZmFjZXMgbmVlZGVkIHRvIHN1cHBvcnQgVmlld2Vycy4KLSAqIFRoZSBhZGFwdGVycyBnZW5lcmF0ZWQgYnkgdGhpcyBmYWN0b3J5IGNvbnZlcnQgRU1GIGFkYXB0ZXIgbm90aWZpY2F0aW9ucyBpbnRvIGNhbGxzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWQgZmlyZU5vdGlmeUNoYW5nZWR9LgotICogVGhlIGFkYXB0ZXJzIGFsc28gc3VwcG9ydCBFY2xpcHNlIHByb3BlcnR5IHNoZWV0cy4KLSAqIE5vdGUgdGhhdCBtb3N0IG9mIHRoZSBhZGFwdGVycyBhcmUgc2hhcmVkIGFtb25nIG11bHRpcGxlIGluc3RhbmNlcy4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFVtYUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5IGV4dGVuZHMgVW1hQWRhcHRlckZhY3RvcnkgaW1wbGVtZW50cwotCQlDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5LCBJQ2hhbmdlTm90aWZpZXIsIElEaXNwb3NhYmxlIHsKLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSByb290IGFkYXB0ZXIgZmFjdG9yeSB0aGF0IGRlbGVnYXRlcyB0byB0aGlzIGFkYXB0ZXIgZmFjdG9yeS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBwYXJlbnRBZGFwdGVyRmFjdG9yeTsKLQotCS8qKgotCSAqIFRoaXMgaXMgdXNlZCB0byBpbXBsZW1lbnQge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklDaGFuZ2VOb3RpZmllcn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElDaGFuZ2VOb3RpZmllciBjaGFuZ2VOb3RpZmllciA9IG5ldyBDaGFuZ2VOb3RpZmllcigpOwotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiBhbGwgdGhlIHN1cHBvcnRlZCB0eXBlcyBjaGVja2VkIGJ5IHtAbGluayAjaXNGYWN0b3J5Rm9yVHlwZSBpc0ZhY3RvcnlGb3JUeXBlfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29sbGVjdGlvbjxPYmplY3Q+IHN1cHBvcnRlZFR5cGVzID0gbmV3IEFycmF5TGlzdDxPYmplY3Q+KCk7Ci0KLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFVtYUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkgewotCQlzdXBwb3J0ZWRUeXBlcy5hZGQoSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIuY2xhc3MpOwotCQlzdXBwb3J0ZWRUeXBlcy5hZGQoSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJc3VwcG9ydGVkVHlwZXMuYWRkKElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCXN1cHBvcnRlZFR5cGVzLmFkZChJSXRlbUxhYmVsUHJvdmlkZXIuY2xhc3MpOwotCQlzdXBwb3J0ZWRUeXBlcy5hZGQoSUl0ZW1Qcm9wZXJ0eVNvdXJjZS5jbGFzcyk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlBhY2thZ2V9IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUGFja2FnZUl0ZW1Qcm92aWRlciBwYWNrYWdlSXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUGFja2FnZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUGFja2FnZUFkYXB0ZXIoKSB7Ci0JCWlmIChwYWNrYWdlSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCXBhY2thZ2VJdGVtUHJvdmlkZXIgPSBuZXcgUGFja2FnZUl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiBwYWNrYWdlSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db25zdHJhaW50fSBpbnN0YW5jZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbnN0cmFpbnRJdGVtUHJvdmlkZXIgY29uc3RyYWludEl0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnN0cmFpbnR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUNvbnN0cmFpbnRBZGFwdGVyKCkgewotCQlpZiAoY29uc3RyYWludEl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQljb25zdHJhaW50SXRlbVByb3ZpZGVyID0gbmV3IENvbnN0cmFpbnRJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gY29uc3RyYWludEl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudFByb3BlcnR5fSBpbnN0YW5jZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE1ldGhvZEVsZW1lbnRQcm9wZXJ0eUl0ZW1Qcm92aWRlciBtZXRob2RFbGVtZW50UHJvcGVydHlJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50UHJvcGVydHl9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZU1ldGhvZEVsZW1lbnRQcm9wZXJ0eUFkYXB0ZXIoKSB7Ci0JCWlmIChtZXRob2RFbGVtZW50UHJvcGVydHlJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJbWV0aG9kRWxlbWVudFByb3BlcnR5SXRlbVByb3ZpZGVyID0gbmV3IE1ldGhvZEVsZW1lbnRQcm9wZXJ0eUl0ZW1Qcm92aWRlcigKLQkJCQkJdGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gbWV0aG9kRWxlbWVudFByb3BlcnR5SXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5LaW5kfSBpbnN0YW5jZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEtpbmRJdGVtUHJvdmlkZXIga2luZEl0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLktpbmR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUtpbmRBZGFwdGVyKCkgewotCQlpZiAoa2luZEl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlraW5kSXRlbVByb3ZpZGVyID0gbmV3IEtpbmRJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4ga2luZEl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZX0gaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBSb2xlSXRlbVByb3ZpZGVyIHJvbGVJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVSb2xlQWRhcHRlcigpIHsKLQkJaWYgKHJvbGVJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJcm9sZUl0ZW1Qcm92aWRlciA9IG5ldyBSb2xlSXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIHJvbGVJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2t9IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgVGFza0l0ZW1Qcm92aWRlciB0YXNrSXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlVGFza0FkYXB0ZXIoKSB7Ci0JCWlmICh0YXNrSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCXRhc2tJdGVtUHJvdmlkZXIgPSBuZXcgVGFza0l0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiB0YXNrSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5TdGVwfSBpbnN0YW5jZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFN0ZXBJdGVtUHJvdmlkZXIgc3RlcEl0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlN0ZXB9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVN0ZXBBZGFwdGVyKCkgewotCQlpZiAoc3RlcEl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlzdGVwSXRlbVByb3ZpZGVyID0gbmV3IFN0ZXBJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gc3RlcEl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQXJ0aWZhY3R9IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQXJ0aWZhY3RJdGVtUHJvdmlkZXIgYXJ0aWZhY3RJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5BcnRpZmFjdH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQXJ0aWZhY3RBZGFwdGVyKCkgewotCQlpZiAoYXJ0aWZhY3RJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJYXJ0aWZhY3RJdGVtUHJvdmlkZXIgPSBuZXcgQXJ0aWZhY3RJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gYXJ0aWZhY3RJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0fSBpbnN0YW5jZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFdvcmtQcm9kdWN0SXRlbVByb3ZpZGVyIHdvcmtQcm9kdWN0SXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3R9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVdvcmtQcm9kdWN0QWRhcHRlcigpIHsKLQkJaWYgKHdvcmtQcm9kdWN0SXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCXdvcmtQcm9kdWN0SXRlbVByb3ZpZGVyID0gbmV3IFdvcmtQcm9kdWN0SXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIHdvcmtQcm9kdWN0SXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5GdWxmaWxsYWJsZUVsZW1lbnR9IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRnVsZmlsbGFibGVFbGVtZW50SXRlbVByb3ZpZGVyIGZ1bGZpbGxhYmxlRWxlbWVudEl0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkZ1bGZpbGxhYmxlRWxlbWVudH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRnVsZmlsbGFibGVFbGVtZW50QWRhcHRlcigpIHsKLQkJaWYgKGZ1bGZpbGxhYmxlRWxlbWVudEl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlmdWxmaWxsYWJsZUVsZW1lbnRJdGVtUHJvdmlkZXIgPSBuZXcgRnVsZmlsbGFibGVFbGVtZW50SXRlbVByb3ZpZGVyKAotCQkJCQl0aGlzKTsKLQkJfQotCi0JCXJldHVybiBmdWxmaWxsYWJsZUVsZW1lbnRJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJhYmxlfSBpbnN0YW5jZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIERlbGl2ZXJhYmxlSXRlbVByb3ZpZGVyIGRlbGl2ZXJhYmxlSXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcmFibGV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZURlbGl2ZXJhYmxlQWRhcHRlcigpIHsKLQkJaWYgKGRlbGl2ZXJhYmxlSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCWRlbGl2ZXJhYmxlSXRlbVByb3ZpZGVyID0gbmV3IERlbGl2ZXJhYmxlSXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIGRlbGl2ZXJhYmxlSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5PdXRjb21lfSBpbnN0YW5jZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE91dGNvbWVJdGVtUHJvdmlkZXIgb3V0Y29tZUl0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk91dGNvbWV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZU91dGNvbWVBZGFwdGVyKCkgewotCQlpZiAob3V0Y29tZUl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlvdXRjb21lSXRlbVByb3ZpZGVyID0gbmV3IE91dGNvbWVJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gb3V0Y29tZUl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUG9pbnR9IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUG9pbnRJdGVtUHJvdmlkZXIgcG9pbnRJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qb2ludH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUG9pbnRBZGFwdGVyKCkgewotCQlpZiAocG9pbnRJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJcG9pbnRJdGVtUHJvdmlkZXIgPSBuZXcgUG9pbnRJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gcG9pbnRJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW1MaW5rfSBpbnN0YW5jZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIERpYWdyYW1MaW5rSXRlbVByb3ZpZGVyIGRpYWdyYW1MaW5rSXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbUxpbmt9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZURpYWdyYW1MaW5rQWRhcHRlcigpIHsKLQkJaWYgKGRpYWdyYW1MaW5rSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCWRpYWdyYW1MaW5rSXRlbVByb3ZpZGVyID0gbmV3IERpYWdyYW1MaW5rSXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIGRpYWdyYW1MaW5rSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaENvbm5lY3Rvcn0gaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBHcmFwaENvbm5lY3Rvckl0ZW1Qcm92aWRlciBncmFwaENvbm5lY3Rvckl0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoQ29ubmVjdG9yfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVHcmFwaENvbm5lY3RvckFkYXB0ZXIoKSB7Ci0JCWlmIChncmFwaENvbm5lY3Rvckl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlncmFwaENvbm5lY3Rvckl0ZW1Qcm92aWRlciA9IG5ldyBHcmFwaENvbm5lY3Rvckl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiBncmFwaENvbm5lY3Rvckl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGltZW5zaW9ufSBpbnN0YW5jZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIERpbWVuc2lvbkl0ZW1Qcm92aWRlciBkaW1lbnNpb25JdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaW1lbnNpb259LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZURpbWVuc2lvbkFkYXB0ZXIoKSB7Ci0JCWlmIChkaW1lbnNpb25JdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJZGltZW5zaW9uSXRlbVByb3ZpZGVyID0gbmV3IERpbWVuc2lvbkl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiBkaW1lbnNpb25JdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlJlZmVyZW5jZX0gaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBSZWZlcmVuY2VJdGVtUHJvdmlkZXIgcmVmZXJlbmNlSXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUmVmZXJlbmNlfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVSZWZlcmVuY2VBZGFwdGVyKCkgewotCQlpZiAocmVmZXJlbmNlSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCXJlZmVyZW5jZUl0ZW1Qcm92aWRlciA9IG5ldyBSZWZlcmVuY2VJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gcmVmZXJlbmNlSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9wZXJ0eX0gaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBQcm9wZXJ0eUl0ZW1Qcm92aWRlciBwcm9wZXJ0eUl0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlByb3BlcnR5fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVQcm9wZXJ0eUFkYXB0ZXIoKSB7Ci0JCWlmIChwcm9wZXJ0eUl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlwcm9wZXJ0eUl0ZW1Qcm92aWRlciA9IG5ldyBQcm9wZXJ0eUl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiBwcm9wZXJ0eUl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhFZGdlfSBpbnN0YW5jZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEdyYXBoRWRnZUl0ZW1Qcm92aWRlciBncmFwaEVkZ2VJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaEVkZ2V9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUdyYXBoRWRnZUFkYXB0ZXIoKSB7Ci0JCWlmIChncmFwaEVkZ2VJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJZ3JhcGhFZGdlSXRlbVByb3ZpZGVyID0gbmV3IEdyYXBoRWRnZUl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiBncmFwaEVkZ2VJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW19IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRGlhZ3JhbUl0ZW1Qcm92aWRlciBkaWFncmFtSXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRGlhZ3JhbUFkYXB0ZXIoKSB7Ci0JCWlmIChkaWFncmFtSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCWRpYWdyYW1JdGVtUHJvdmlkZXIgPSBuZXcgRGlhZ3JhbUl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiBkaWFncmFtSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaE5vZGV9IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgR3JhcGhOb2RlSXRlbVByb3ZpZGVyIGdyYXBoTm9kZUl0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoTm9kZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlR3JhcGhOb2RlQWRhcHRlcigpIHsKLQkJaWYgKGdyYXBoTm9kZUl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlncmFwaE5vZGVJdGVtUHJvdmlkZXIgPSBuZXcgR3JhcGhOb2RlSXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIGdyYXBoTm9kZUl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnR9IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnRJdGVtUHJvdmlkZXIgc2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnRJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5TaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnRBZGFwdGVyKCkgewotCQlpZiAoc2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnRJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJc2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnRJdGVtUHJvdmlkZXIgPSBuZXcgU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnRJdGVtUHJvdmlkZXIoCi0JCQkJCXRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIHNpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50SXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5VTUFTZW1hbnRpY01vZGVsQnJpZGdlfSBpbnN0YW5jZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFVNQVNlbWFudGljTW9kZWxCcmlkZ2VJdGVtUHJvdmlkZXIgdW1hU2VtYW50aWNNb2RlbEJyaWRnZUl0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlVNQVNlbWFudGljTW9kZWxCcmlkZ2V9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVVNQVNlbWFudGljTW9kZWxCcmlkZ2VBZGFwdGVyKCkgewotCQlpZiAodW1hU2VtYW50aWNNb2RlbEJyaWRnZUl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQl1bWFTZW1hbnRpY01vZGVsQnJpZGdlSXRlbVByb3ZpZGVyID0gbmV3IFVNQVNlbWFudGljTW9kZWxCcmlkZ2VJdGVtUHJvdmlkZXIoCi0JCQkJCXRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIHVtYVNlbWFudGljTW9kZWxCcmlkZ2VJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkNvcmVTZW1hbnRpY01vZGVsQnJpZGdlfSBpbnN0YW5jZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvcmVTZW1hbnRpY01vZGVsQnJpZGdlSXRlbVByb3ZpZGVyIGNvcmVTZW1hbnRpY01vZGVsQnJpZGdlSXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQ29yZVNlbWFudGljTW9kZWxCcmlkZ2V9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUNvcmVTZW1hbnRpY01vZGVsQnJpZGdlQWRhcHRlcigpIHsKLQkJaWYgKGNvcmVTZW1hbnRpY01vZGVsQnJpZGdlSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCWNvcmVTZW1hbnRpY01vZGVsQnJpZGdlSXRlbVByb3ZpZGVyID0gbmV3IENvcmVTZW1hbnRpY01vZGVsQnJpZGdlSXRlbVByb3ZpZGVyKAotCQkJCQl0aGlzKTsKLQkJfQotCi0JCXJldHVybiBjb3JlU2VtYW50aWNNb2RlbEJyaWRnZUl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVGV4dEVsZW1lbnR9IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgVGV4dEVsZW1lbnRJdGVtUHJvdmlkZXIgdGV4dEVsZW1lbnRJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZXh0RWxlbWVudH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlVGV4dEVsZW1lbnRBZGFwdGVyKCkgewotCQlpZiAodGV4dEVsZW1lbnRJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJdGV4dEVsZW1lbnRJdGVtUHJvdmlkZXIgPSBuZXcgVGV4dEVsZW1lbnRJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gdGV4dEVsZW1lbnRJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkltYWdlfSBpbnN0YW5jZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEltYWdlSXRlbVByb3ZpZGVyIGltYWdlSXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuSW1hZ2V9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUltYWdlQWRhcHRlcigpIHsKLQkJaWYgKGltYWdlSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCWltYWdlSXRlbVByb3ZpZGVyID0gbmV3IEltYWdlSXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIGltYWdlSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qb2x5bGluZX0gaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBQb2x5bGluZUl0ZW1Qcm92aWRlciBwb2x5bGluZUl0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlBvbHlsaW5lfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVQb2x5bGluZUFkYXB0ZXIoKSB7Ci0JCWlmIChwb2x5bGluZUl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlwb2x5bGluZUl0ZW1Qcm92aWRlciA9IG5ldyBQb2x5bGluZUl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiBwb2x5bGluZUl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRWxsaXBzZX0gaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFbGxpcHNlSXRlbVByb3ZpZGVyIGVsbGlwc2VJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5FbGxpcHNlfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVFbGxpcHNlQWRhcHRlcigpIHsKLQkJaWYgKGVsbGlwc2VJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJZWxsaXBzZUl0ZW1Qcm92aWRlciA9IG5ldyBFbGxpcHNlSXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIGVsbGlwc2VJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5fSBpbnN0YW5jZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEFjdGl2aXR5SXRlbVByb3ZpZGVyIGFjdGl2aXR5SXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHl9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUFjdGl2aXR5QWRhcHRlcigpIHsKLQkJaWYgKGFjdGl2aXR5SXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCWFjdGl2aXR5SXRlbVByb3ZpZGVyID0gbmV3IEFjdGl2aXR5SXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIGFjdGl2aXR5SXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NaWxlc3RvbmV9IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTWlsZXN0b25lSXRlbVByb3ZpZGVyIG1pbGVzdG9uZUl0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk1pbGVzdG9uZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlTWlsZXN0b25lQWRhcHRlcigpIHsKLQkJaWYgKG1pbGVzdG9uZUl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQltaWxlc3RvbmVJdGVtUHJvdmlkZXIgPSBuZXcgTWlsZXN0b25lSXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIG1pbGVzdG9uZUl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuSXRlcmF0aW9ufSBpbnN0YW5jZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEl0ZXJhdGlvbkl0ZW1Qcm92aWRlciBpdGVyYXRpb25JdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5JdGVyYXRpb259LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUl0ZXJhdGlvbkFkYXB0ZXIoKSB7Ci0JCWlmIChpdGVyYXRpb25JdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJaXRlcmF0aW9uSXRlbVByb3ZpZGVyID0gbmV3IEl0ZXJhdGlvbkl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiBpdGVyYXRpb25JdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlBoYXNlfSBpbnN0YW5jZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFBoYXNlSXRlbVByb3ZpZGVyIHBoYXNlSXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUGhhc2V9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVBoYXNlQWRhcHRlcigpIHsKLQkJaWYgKHBoYXNlSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCXBoYXNlSXRlbVByb3ZpZGVyID0gbmV3IFBoYXNlSXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIHBoYXNlSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZWFtUHJvZmlsZX0gaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBUZWFtUHJvZmlsZUl0ZW1Qcm92aWRlciB0ZWFtUHJvZmlsZUl0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlRlYW1Qcm9maWxlfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVUZWFtUHJvZmlsZUFkYXB0ZXIoKSB7Ci0JCWlmICh0ZWFtUHJvZmlsZUl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQl0ZWFtUHJvZmlsZUl0ZW1Qcm92aWRlciA9IG5ldyBUZWFtUHJvZmlsZUl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiB0ZWFtUHJvZmlsZUl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZURlc2NyaXB0b3J9IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUm9sZURlc2NyaXB0b3JJdGVtUHJvdmlkZXIgcm9sZURlc2NyaXB0b3JJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRvcn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUm9sZURlc2NyaXB0b3JBZGFwdGVyKCkgewotCQlpZiAocm9sZURlc2NyaXB0b3JJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJcm9sZURlc2NyaXB0b3JJdGVtUHJvdmlkZXIgPSBuZXcgUm9sZURlc2NyaXB0b3JJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gcm9sZURlc2NyaXB0b3JJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtPcmRlcn0gaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBXb3JrT3JkZXJJdGVtUHJvdmlkZXIgd29ya09yZGVySXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya09yZGVyfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVXb3JrT3JkZXJBZGFwdGVyKCkgewotCQlpZiAod29ya09yZGVySXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCXdvcmtPcmRlckl0ZW1Qcm92aWRlciA9IG5ldyBXb3JrT3JkZXJJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gd29ya09yZGVySXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5QbGFubmluZ0RhdGF9IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUGxhbm5pbmdEYXRhSXRlbVByb3ZpZGVyIHBsYW5uaW5nRGF0YUl0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlBsYW5uaW5nRGF0YX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUGxhbm5pbmdEYXRhQWRhcHRlcigpIHsKLQkJaWYgKHBsYW5uaW5nRGF0YUl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlwbGFubmluZ0RhdGFJdGVtUHJvdmlkZXIgPSBuZXcgUGxhbm5pbmdEYXRhSXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIHBsYW5uaW5nRGF0YUl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0b3J9IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgVGFza0Rlc2NyaXB0b3JJdGVtUHJvdmlkZXIgdGFza0Rlc2NyaXB0b3JJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRvcn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlVGFza0Rlc2NyaXB0b3JBZGFwdGVyKCkgewotCQlpZiAodGFza0Rlc2NyaXB0b3JJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJdGFza0Rlc2NyaXB0b3JJdGVtUHJvdmlkZXIgPSBuZXcgVGFza0Rlc2NyaXB0b3JJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gdGFza0Rlc2NyaXB0b3JJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvcn0gaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBXb3JrUHJvZHVjdERlc2NyaXB0b3JJdGVtUHJvdmlkZXIgd29ya1Byb2R1Y3REZXNjcmlwdG9ySXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVXb3JrUHJvZHVjdERlc2NyaXB0b3JBZGFwdGVyKCkgewotCQlpZiAod29ya1Byb2R1Y3REZXNjcmlwdG9ySXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCXdvcmtQcm9kdWN0RGVzY3JpcHRvckl0ZW1Qcm92aWRlciA9IG5ldyBXb3JrUHJvZHVjdERlc2NyaXB0b3JJdGVtUHJvdmlkZXIoCi0JCQkJCXRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIHdvcmtQcm9kdWN0RGVzY3JpcHRvckl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQ29tcG9zaXRlUm9sZX0gaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21wb3NpdGVSb2xlSXRlbVByb3ZpZGVyIGNvbXBvc2l0ZVJvbGVJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db21wb3NpdGVSb2xlfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVDb21wb3NpdGVSb2xlQWRhcHRlcigpIHsKLQkJaWYgKGNvbXBvc2l0ZVJvbGVJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJY29tcG9zaXRlUm9sZUl0ZW1Qcm92aWRlciA9IG5ldyBDb21wb3NpdGVSb2xlSXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIGNvbXBvc2l0ZVJvbGVJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbn0gaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb25JdGVtUHJvdmlkZXIgYnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uSXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9ufS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb25BZGFwdGVyKCkgewotCQlpZiAoYnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCWJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbkl0ZW1Qcm92aWRlciA9IG5ldyBCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb25JdGVtUHJvdmlkZXIoCi0JCQkJCXRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIGJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbkl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHlEZXNjcmlwdGlvbn0gaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBBY3Rpdml0eURlc2NyaXB0aW9uSXRlbVByb3ZpZGVyIGFjdGl2aXR5RGVzY3JpcHRpb25JdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eURlc2NyaXB0aW9ufS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVBY3Rpdml0eURlc2NyaXB0aW9uQWRhcHRlcigpIHsKLQkJaWYgKGFjdGl2aXR5RGVzY3JpcHRpb25JdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJYWN0aXZpdHlEZXNjcmlwdGlvbkl0ZW1Qcm92aWRlciA9IG5ldyBBY3Rpdml0eURlc2NyaXB0aW9uSXRlbVByb3ZpZGVyKAotCQkJCQl0aGlzKTsKLQkJfQotCi0JCXJldHVybiBhY3Rpdml0eURlc2NyaXB0aW9uSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbn0gaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBEZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbkl0ZW1Qcm92aWRlciBkZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbkl0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9ufS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVEZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbkFkYXB0ZXIoKSB7Ci0JCWlmIChkZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbkl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlkZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbkl0ZW1Qcm92aWRlciA9IG5ldyBEZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbkl0ZW1Qcm92aWRlcigKLQkJCQkJdGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gZGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25JdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NEZXNjcmlwdGlvbn0gaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBQcm9jZXNzRGVzY3JpcHRpb25JdGVtUHJvdmlkZXIgcHJvY2Vzc0Rlc2NyaXB0aW9uSXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0Rlc2NyaXB0aW9ufS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVQcm9jZXNzRGVzY3JpcHRpb25BZGFwdGVyKCkgewotCQlpZiAocHJvY2Vzc0Rlc2NyaXB0aW9uSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCXByb2Nlc3NEZXNjcmlwdGlvbkl0ZW1Qcm92aWRlciA9IG5ldyBQcm9jZXNzRGVzY3JpcHRpb25JdGVtUHJvdmlkZXIoCi0JCQkJCXRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIHByb2Nlc3NEZXNjcmlwdGlvbkl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpcHRvckRlc2NyaXB0aW9ufSBpbnN0YW5jZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIERlc2NyaXB0b3JEZXNjcmlwdGlvbkl0ZW1Qcm92aWRlciBkZXNjcmlwdG9yRGVzY3JpcHRpb25JdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmlwdG9yRGVzY3JpcHRpb259LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZURlc2NyaXB0b3JEZXNjcmlwdGlvbkFkYXB0ZXIoKSB7Ci0JCWlmIChkZXNjcmlwdG9yRGVzY3JpcHRpb25JdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJZGVzY3JpcHRvckRlc2NyaXB0aW9uSXRlbVByb3ZpZGVyID0gbmV3IERlc2NyaXB0b3JEZXNjcmlwdGlvbkl0ZW1Qcm92aWRlcigKLQkJCQkJdGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gZGVzY3JpcHRvckRlc2NyaXB0aW9uSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db25jZXB0fSBpbnN0YW5jZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbmNlcHRJdGVtUHJvdmlkZXIgY29uY2VwdEl0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbmNlcHR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUNvbmNlcHRBZGFwdGVyKCkgewotCQlpZiAoY29uY2VwdEl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQljb25jZXB0SXRlbVByb3ZpZGVyID0gbmV3IENvbmNlcHRJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gY29uY2VwdEl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQ2hlY2tsaXN0fSBpbnN0YW5jZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENoZWNrbGlzdEl0ZW1Qcm92aWRlciBjaGVja2xpc3RJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5DaGVja2xpc3R9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUNoZWNrbGlzdEFkYXB0ZXIoKSB7Ci0JCWlmIChjaGVja2xpc3RJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJY2hlY2tsaXN0SXRlbVByb3ZpZGVyID0gbmV3IENoZWNrbGlzdEl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiBjaGVja2xpc3RJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkV4YW1wbGV9IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRXhhbXBsZUl0ZW1Qcm92aWRlciBleGFtcGxlSXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRXhhbXBsZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRXhhbXBsZUFkYXB0ZXIoKSB7Ci0JCWlmIChleGFtcGxlSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCWV4YW1wbGVJdGVtUHJvdmlkZXIgPSBuZXcgRXhhbXBsZUl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiBleGFtcGxlSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5HdWlkZWxpbmV9IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgR3VpZGVsaW5lSXRlbVByb3ZpZGVyIGd1aWRlbGluZUl0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkd1aWRlbGluZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlR3VpZGVsaW5lQWRhcHRlcigpIHsKLQkJaWYgKGd1aWRlbGluZUl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlndWlkZWxpbmVJdGVtUHJvdmlkZXIgPSBuZXcgR3VpZGVsaW5lSXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIGd1aWRlbGluZUl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zfSBpbnN0YW5jZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVzdGltYXRpb25Db25zaWRlcmF0aW9uc0l0ZW1Qcm92aWRlciBlc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnNJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnN9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUVzdGltYXRpb25Db25zaWRlcmF0aW9uc0FkYXB0ZXIoKSB7Ci0JCWlmIChlc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnNJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zSXRlbVByb3ZpZGVyID0gbmV3IEVzdGltYXRpb25Db25zaWRlcmF0aW9uc0l0ZW1Qcm92aWRlcigKLQkJCQkJdGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5SZXBvcnR9IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUmVwb3J0SXRlbVByb3ZpZGVyIHJlcG9ydEl0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlJlcG9ydH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUmVwb3J0QWRhcHRlcigpIHsKLQkJaWYgKHJlcG9ydEl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlyZXBvcnRJdGVtUHJvdmlkZXIgPSBuZXcgUmVwb3J0SXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIHJlcG9ydEl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVGVtcGxhdGV9IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgVGVtcGxhdGVJdGVtUHJvdmlkZXIgdGVtcGxhdGVJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZW1wbGF0ZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlVGVtcGxhdGVBZGFwdGVyKCkgewotCQlpZiAodGVtcGxhdGVJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJdGVtcGxhdGVJdGVtUHJvdmlkZXIgPSBuZXcgVGVtcGxhdGVJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gdGVtcGxhdGVJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlN1cHBvcnRpbmdNYXRlcmlhbH0gaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBTdXBwb3J0aW5nTWF0ZXJpYWxJdGVtUHJvdmlkZXIgc3VwcG9ydGluZ01hdGVyaWFsSXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuU3VwcG9ydGluZ01hdGVyaWFsfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVTdXBwb3J0aW5nTWF0ZXJpYWxBZGFwdGVyKCkgewotCQlpZiAoc3VwcG9ydGluZ01hdGVyaWFsSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCXN1cHBvcnRpbmdNYXRlcmlhbEl0ZW1Qcm92aWRlciA9IG5ldyBTdXBwb3J0aW5nTWF0ZXJpYWxJdGVtUHJvdmlkZXIoCi0JCQkJCXRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIHN1cHBvcnRpbmdNYXRlcmlhbEl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVG9vbE1lbnRvcn0gaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBUb29sTWVudG9ySXRlbVByb3ZpZGVyIHRvb2xNZW50b3JJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Ub29sTWVudG9yfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVUb29sTWVudG9yQWRhcHRlcigpIHsKLQkJaWYgKHRvb2xNZW50b3JJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJdG9vbE1lbnRvckl0ZW1Qcm92aWRlciA9IG5ldyBUb29sTWVudG9ySXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIHRvb2xNZW50b3JJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldoaXRlcGFwZXJ9IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgV2hpdGVwYXBlckl0ZW1Qcm92aWRlciB3aGl0ZXBhcGVySXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuV2hpdGVwYXBlcn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlV2hpdGVwYXBlckFkYXB0ZXIoKSB7Ci0JCWlmICh3aGl0ZXBhcGVySXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCXdoaXRlcGFwZXJJdGVtUHJvdmlkZXIgPSBuZXcgV2hpdGVwYXBlckl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiB3aGl0ZXBhcGVySXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZXJtRGVmaW5pdGlvbn0gaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBUZXJtRGVmaW5pdGlvbkl0ZW1Qcm92aWRlciB0ZXJtRGVmaW5pdGlvbkl0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlRlcm1EZWZpbml0aW9ufS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVUZXJtRGVmaW5pdGlvbkFkYXB0ZXIoKSB7Ci0JCWlmICh0ZXJtRGVmaW5pdGlvbkl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQl0ZXJtRGVmaW5pdGlvbkl0ZW1Qcm92aWRlciA9IG5ldyBUZXJtRGVmaW5pdGlvbkl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiB0ZXJtRGVmaW5pdGlvbkl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQXBwbGljYWJsZU1ldGFDbGFzc0luZm99IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQXBwbGljYWJsZU1ldGFDbGFzc0luZm9JdGVtUHJvdmlkZXIgYXBwbGljYWJsZU1ldGFDbGFzc0luZm9JdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5BcHBsaWNhYmxlTWV0YUNsYXNzSW5mb30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQXBwbGljYWJsZU1ldGFDbGFzc0luZm9BZGFwdGVyKCkgewotCQlpZiAoYXBwbGljYWJsZU1ldGFDbGFzc0luZm9JdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJYXBwbGljYWJsZU1ldGFDbGFzc0luZm9JdGVtUHJvdmlkZXIgPSBuZXcgQXBwbGljYWJsZU1ldGFDbGFzc0luZm9JdGVtUHJvdmlkZXIoCi0JCQkJCXRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIGFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5QcmFjdGljZX0gaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBQcmFjdGljZUl0ZW1Qcm92aWRlciBwcmFjdGljZUl0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlByYWN0aWNlfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVQcmFjdGljZUFkYXB0ZXIoKSB7Ci0JCWlmIChwcmFjdGljZUl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlwcmFjdGljZUl0ZW1Qcm92aWRlciA9IG5ldyBQcmFjdGljZUl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiBwcmFjdGljZUl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUmV1c2FibGVBc3NldH0gaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBSZXVzYWJsZUFzc2V0SXRlbVByb3ZpZGVyIHJldXNhYmxlQXNzZXRJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5SZXVzYWJsZUFzc2V0fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVSZXVzYWJsZUFzc2V0QWRhcHRlcigpIHsKLQkJaWYgKHJldXNhYmxlQXNzZXRJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJcmV1c2FibGVBc3NldEl0ZW1Qcm92aWRlciA9IG5ldyBSZXVzYWJsZUFzc2V0SXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIHJldXNhYmxlQXNzZXRJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRpc2NpcGxpbmV9IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRGlzY2lwbGluZUl0ZW1Qcm92aWRlciBkaXNjaXBsaW5lSXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlzY2lwbGluZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRGlzY2lwbGluZUFkYXB0ZXIoKSB7Ci0JCWlmIChkaXNjaXBsaW5lSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCWRpc2NpcGxpbmVJdGVtUHJvdmlkZXIgPSBuZXcgRGlzY2lwbGluZUl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiBkaXNjaXBsaW5lSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlU2V0fSBpbnN0YW5jZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFJvbGVTZXRJdGVtUHJvdmlkZXIgcm9sZVNldEl0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVTZXR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVJvbGVTZXRBZGFwdGVyKCkgewotCQlpZiAocm9sZVNldEl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlyb2xlU2V0SXRlbVByb3ZpZGVyID0gbmV3IFJvbGVTZXRJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gcm9sZVNldEl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRG9tYWlufSBpbnN0YW5jZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIERvbWFpbkl0ZW1Qcm92aWRlciBkb21haW5JdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Eb21haW59LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZURvbWFpbkFkYXB0ZXIoKSB7Ci0JCWlmIChkb21haW5JdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJZG9tYWluSXRlbVByb3ZpZGVyID0gbmV3IERvbWFpbkl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiBkb21haW5JdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0VHlwZX0gaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBXb3JrUHJvZHVjdFR5cGVJdGVtUHJvdmlkZXIgd29ya1Byb2R1Y3RUeXBlSXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3RUeXBlfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVXb3JrUHJvZHVjdFR5cGVBZGFwdGVyKCkgewotCQlpZiAod29ya1Byb2R1Y3RUeXBlSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCXdvcmtQcm9kdWN0VHlwZUl0ZW1Qcm92aWRlciA9IG5ldyBXb3JrUHJvZHVjdFR5cGVJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gd29ya1Byb2R1Y3RUeXBlSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaXNjaXBsaW5lR3JvdXBpbmd9IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRGlzY2lwbGluZUdyb3VwaW5nSXRlbVByb3ZpZGVyIGRpc2NpcGxpbmVHcm91cGluZ0l0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRpc2NpcGxpbmVHcm91cGluZ30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRGlzY2lwbGluZUdyb3VwaW5nQWRhcHRlcigpIHsKLQkJaWYgKGRpc2NpcGxpbmVHcm91cGluZ0l0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlkaXNjaXBsaW5lR3JvdXBpbmdJdGVtUHJvdmlkZXIgPSBuZXcgRGlzY2lwbGluZUdyb3VwaW5nSXRlbVByb3ZpZGVyKAotCQkJCQl0aGlzKTsKLQkJfQotCi0JCXJldHVybiBkaXNjaXBsaW5lR3JvdXBpbmdJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlRvb2x9IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgVG9vbEl0ZW1Qcm92aWRlciB0b29sSXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVG9vbH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlVG9vbEFkYXB0ZXIoKSB7Ci0JCWlmICh0b29sSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCXRvb2xJdGVtUHJvdmlkZXIgPSBuZXcgVG9vbEl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiB0b29sSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlU2V0R3JvdXBpbmd9IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUm9sZVNldEdyb3VwaW5nSXRlbVByb3ZpZGVyIHJvbGVTZXRHcm91cGluZ0l0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVTZXRHcm91cGluZ30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUm9sZVNldEdyb3VwaW5nQWRhcHRlcigpIHsKLQkJaWYgKHJvbGVTZXRHcm91cGluZ0l0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlyb2xlU2V0R3JvdXBpbmdJdGVtUHJvdmlkZXIgPSBuZXcgUm9sZVNldEdyb3VwaW5nSXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIHJvbGVTZXRHcm91cGluZ0l0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQ3VzdG9tQ2F0ZWdvcnl9IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ3VzdG9tQ2F0ZWdvcnlJdGVtUHJvdmlkZXIgY3VzdG9tQ2F0ZWdvcnlJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5DdXN0b21DYXRlZ29yeX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQ3VzdG9tQ2F0ZWdvcnlBZGFwdGVyKCkgewotCQlpZiAoY3VzdG9tQ2F0ZWdvcnlJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJY3VzdG9tQ2F0ZWdvcnlJdGVtUHJvdmlkZXIgPSBuZXcgQ3VzdG9tQ2F0ZWdvcnlJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gY3VzdG9tQ2F0ZWdvcnlJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkNhcGFiaWxpdHlQYXR0ZXJufSBpbnN0YW5jZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENhcGFiaWxpdHlQYXR0ZXJuSXRlbVByb3ZpZGVyIGNhcGFiaWxpdHlQYXR0ZXJuSXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQ2FwYWJpbGl0eVBhdHRlcm59LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUNhcGFiaWxpdHlQYXR0ZXJuQWRhcHRlcigpIHsKLQkJaWYgKGNhcGFiaWxpdHlQYXR0ZXJuSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCWNhcGFiaWxpdHlQYXR0ZXJuSXRlbVByb3ZpZGVyID0gbmV3IENhcGFiaWxpdHlQYXR0ZXJuSXRlbVByb3ZpZGVyKAotCQkJCQl0aGlzKTsKLQkJfQotCi0JCXJldHVybiBjYXBhYmlsaXR5UGF0dGVybkl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcnlQcm9jZXNzfSBpbnN0YW5jZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIERlbGl2ZXJ5UHJvY2Vzc0l0ZW1Qcm92aWRlciBkZWxpdmVyeVByb2Nlc3NJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyeVByb2Nlc3N9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZURlbGl2ZXJ5UHJvY2Vzc0FkYXB0ZXIoKSB7Ci0JCWlmIChkZWxpdmVyeVByb2Nlc3NJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJZGVsaXZlcnlQcm9jZXNzSXRlbVByb3ZpZGVyID0gbmV3IERlbGl2ZXJ5UHJvY2Vzc0l0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiBkZWxpdmVyeVByb2Nlc3NJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NQbGFubmluZ1RlbXBsYXRlfSBpbnN0YW5jZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFByb2Nlc3NQbGFubmluZ1RlbXBsYXRlSXRlbVByb3ZpZGVyIHByb2Nlc3NQbGFubmluZ1RlbXBsYXRlSXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVByb2Nlc3NQbGFubmluZ1RlbXBsYXRlQWRhcHRlcigpIHsKLQkJaWYgKHByb2Nlc3NQbGFubmluZ1RlbXBsYXRlSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCXByb2Nlc3NQbGFubmluZ1RlbXBsYXRlSXRlbVByb3ZpZGVyID0gbmV3IFByb2Nlc3NQbGFubmluZ1RlbXBsYXRlSXRlbVByb3ZpZGVyKAotCQkJCQl0aGlzKTsKLQkJfQotCi0JCXJldHVybiBwcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZUl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUm9hZG1hcH0gaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBSb2FkbWFwSXRlbVByb3ZpZGVyIHJvYWRtYXBJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2FkbWFwfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVSb2FkbWFwQWRhcHRlcigpIHsKLQkJaWYgKHJvYWRtYXBJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJcm9hZG1hcEl0ZW1Qcm92aWRlciA9IG5ldyBSb2FkbWFwSXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIHJvYWRtYXBJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRQYWNrYWdlfSBpbnN0YW5jZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbnRlbnRQYWNrYWdlSXRlbVByb3ZpZGVyIGNvbnRlbnRQYWNrYWdlSXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudFBhY2thZ2V9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUNvbnRlbnRQYWNrYWdlQWRhcHRlcigpIHsKLQkJaWYgKGNvbnRlbnRQYWNrYWdlSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCWNvbnRlbnRQYWNrYWdlSXRlbVByb3ZpZGVyID0gbmV3IENvbnRlbnRQYWNrYWdlSXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIGNvbnRlbnRQYWNrYWdlSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50fSBpbnN0YW5jZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFByb2Nlc3NDb21wb25lbnRJdGVtUHJvdmlkZXIgcHJvY2Vzc0NvbXBvbmVudEl0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVByb2Nlc3NDb21wb25lbnRBZGFwdGVyKCkgewotCQlpZiAocHJvY2Vzc0NvbXBvbmVudEl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlwcm9jZXNzQ29tcG9uZW50SXRlbVByb3ZpZGVyID0gbmV3IFByb2Nlc3NDb21wb25lbnRJdGVtUHJvdmlkZXIoCi0JCQkJCXRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIHByb2Nlc3NDb21wb25lbnRJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NQYWNrYWdlfSBpbnN0YW5jZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFByb2Nlc3NQYWNrYWdlSXRlbVByb3ZpZGVyIHByb2Nlc3NQYWNrYWdlSXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc1BhY2thZ2V9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVByb2Nlc3NQYWNrYWdlQWRhcHRlcigpIHsKLQkJaWYgKHByb2Nlc3NQYWNrYWdlSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCXByb2Nlc3NQYWNrYWdlSXRlbVByb3ZpZGVyID0gbmV3IFByb2Nlc3NQYWNrYWdlSXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIHByb2Nlc3NQYWNrYWdlSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlfSBpbnN0YW5jZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VJdGVtUHJvdmlkZXIgcHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZUl0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2V9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VBZGFwdGVyKCkgewotCQlpZiAocHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZUl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlwcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlSXRlbVByb3ZpZGVyID0gbmV3IFByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VJdGVtUHJvdmlkZXIoCi0JCQkJCXRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIHByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnREZXNjcmlwdG9yfSBpbnN0YW5jZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFByb2Nlc3NDb21wb25lbnREZXNjcmlwdG9ySXRlbVByb3ZpZGVyIHByb2Nlc3NDb21wb25lbnREZXNjcmlwdG9ySXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3J9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVByb2Nlc3NDb21wb25lbnREZXNjcmlwdG9yQWRhcHRlcigpIHsKLQkJaWYgKHByb2Nlc3NDb21wb25lbnREZXNjcmlwdG9ySXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCXByb2Nlc3NDb21wb25lbnREZXNjcmlwdG9ySXRlbVByb3ZpZGVyID0gbmV3IFByb2Nlc3NDb21wb25lbnREZXNjcmlwdG9ySXRlbVByb3ZpZGVyKAotCQkJCQl0aGlzKTsKLQkJfQotCi0JCXJldHVybiBwcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvckl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2lufSBpbnN0YW5jZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE1ldGhvZFBsdWdpbkl0ZW1Qcm92aWRlciBtZXRob2RQbHVnaW5JdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW59LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZU1ldGhvZFBsdWdpbkFkYXB0ZXIoKSB7Ci0JCWlmIChtZXRob2RQbHVnaW5JdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJbWV0aG9kUGx1Z2luSXRlbVByb3ZpZGVyID0gbmV3IE1ldGhvZFBsdWdpbkl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiBtZXRob2RQbHVnaW5JdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnREZXNjcmlwdGlvbn0gaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb250ZW50RGVzY3JpcHRpb25JdGVtUHJvdmlkZXIgY29udGVudERlc2NyaXB0aW9uSXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudERlc2NyaXB0aW9ufS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVDb250ZW50RGVzY3JpcHRpb25BZGFwdGVyKCkgewotCQlpZiAoY29udGVudERlc2NyaXB0aW9uSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCWNvbnRlbnREZXNjcmlwdGlvbkl0ZW1Qcm92aWRlciA9IG5ldyBDb250ZW50RGVzY3JpcHRpb25JdGVtUHJvdmlkZXIoCi0JCQkJCXRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIGNvbnRlbnREZXNjcmlwdGlvbkl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuU2VjdGlvbn0gaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBTZWN0aW9uSXRlbVByb3ZpZGVyIHNlY3Rpb25JdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5TZWN0aW9ufS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVTZWN0aW9uQWRhcHRlcigpIHsKLQkJaWYgKHNlY3Rpb25JdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJc2VjdGlvbkl0ZW1Qcm92aWRlciA9IG5ldyBTZWN0aW9uSXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIHNlY3Rpb25JdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkFydGlmYWN0RGVzY3JpcHRpb259IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQXJ0aWZhY3REZXNjcmlwdGlvbkl0ZW1Qcm92aWRlciBhcnRpZmFjdERlc2NyaXB0aW9uSXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQXJ0aWZhY3REZXNjcmlwdGlvbn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQXJ0aWZhY3REZXNjcmlwdGlvbkFkYXB0ZXIoKSB7Ci0JCWlmIChhcnRpZmFjdERlc2NyaXB0aW9uSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCWFydGlmYWN0RGVzY3JpcHRpb25JdGVtUHJvdmlkZXIgPSBuZXcgQXJ0aWZhY3REZXNjcmlwdGlvbkl0ZW1Qcm92aWRlcigKLQkJCQkJdGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gYXJ0aWZhY3REZXNjcmlwdGlvbkl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdGlvbn0gaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBXb3JrUHJvZHVjdERlc2NyaXB0aW9uSXRlbVByb3ZpZGVyIHdvcmtQcm9kdWN0RGVzY3JpcHRpb25JdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0aW9ufS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVXb3JrUHJvZHVjdERlc2NyaXB0aW9uQWRhcHRlcigpIHsKLQkJaWYgKHdvcmtQcm9kdWN0RGVzY3JpcHRpb25JdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJd29ya1Byb2R1Y3REZXNjcmlwdGlvbkl0ZW1Qcm92aWRlciA9IG5ldyBXb3JrUHJvZHVjdERlc2NyaXB0aW9uSXRlbVByb3ZpZGVyKAotCQkJCQl0aGlzKTsKLQkJfQotCi0JCXJldHVybiB3b3JrUHJvZHVjdERlc2NyaXB0aW9uSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyYWJsZURlc2NyaXB0aW9ufSBpbnN0YW5jZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIERlbGl2ZXJhYmxlRGVzY3JpcHRpb25JdGVtUHJvdmlkZXIgZGVsaXZlcmFibGVEZXNjcmlwdGlvbkl0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJhYmxlRGVzY3JpcHRpb259LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZURlbGl2ZXJhYmxlRGVzY3JpcHRpb25BZGFwdGVyKCkgewotCQlpZiAoZGVsaXZlcmFibGVEZXNjcmlwdGlvbkl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlkZWxpdmVyYWJsZURlc2NyaXB0aW9uSXRlbVByb3ZpZGVyID0gbmV3IERlbGl2ZXJhYmxlRGVzY3JpcHRpb25JdGVtUHJvdmlkZXIoCi0JCQkJCXRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIGRlbGl2ZXJhYmxlRGVzY3JpcHRpb25JdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdGlvbn0gaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBSb2xlRGVzY3JpcHRpb25JdGVtUHJvdmlkZXIgcm9sZURlc2NyaXB0aW9uSXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZURlc2NyaXB0aW9ufS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVSb2xlRGVzY3JpcHRpb25BZGFwdGVyKCkgewotCQlpZiAocm9sZURlc2NyaXB0aW9uSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCXJvbGVEZXNjcmlwdGlvbkl0ZW1Qcm92aWRlciA9IG5ldyBSb2xlRGVzY3JpcHRpb25JdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gcm9sZURlc2NyaXB0aW9uSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRpb259IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgVGFza0Rlc2NyaXB0aW9uSXRlbVByb3ZpZGVyIHRhc2tEZXNjcmlwdGlvbkl0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdGlvbn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlVGFza0Rlc2NyaXB0aW9uQWRhcHRlcigpIHsKLQkJaWYgKHRhc2tEZXNjcmlwdGlvbkl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQl0YXNrRGVzY3JpcHRpb25JdGVtUHJvdmlkZXIgPSBuZXcgVGFza0Rlc2NyaXB0aW9uSXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIHRhc2tEZXNjcmlwdGlvbkl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuR3VpZGFuY2VEZXNjcmlwdGlvbn0gaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBHdWlkYW5jZURlc2NyaXB0aW9uSXRlbVByb3ZpZGVyIGd1aWRhbmNlRGVzY3JpcHRpb25JdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5HdWlkYW5jZURlc2NyaXB0aW9ufS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVHdWlkYW5jZURlc2NyaXB0aW9uQWRhcHRlcigpIHsKLQkJaWYgKGd1aWRhbmNlRGVzY3JpcHRpb25JdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJZ3VpZGFuY2VEZXNjcmlwdGlvbkl0ZW1Qcm92aWRlciA9IG5ldyBHdWlkYW5jZURlc2NyaXB0aW9uSXRlbVByb3ZpZGVyKAotCQkJCQl0aGlzKTsKLQkJfQotCi0JCXJldHVybiBndWlkYW5jZURlc2NyaXB0aW9uSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5QcmFjdGljZURlc2NyaXB0aW9ufSBpbnN0YW5jZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFByYWN0aWNlRGVzY3JpcHRpb25JdGVtUHJvdmlkZXIgcHJhY3RpY2VEZXNjcmlwdGlvbkl0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlByYWN0aWNlRGVzY3JpcHRpb259LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVByYWN0aWNlRGVzY3JpcHRpb25BZGFwdGVyKCkgewotCQlpZiAocHJhY3RpY2VEZXNjcmlwdGlvbkl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlwcmFjdGljZURlc2NyaXB0aW9uSXRlbVByb3ZpZGVyID0gbmV3IFByYWN0aWNlRGVzY3JpcHRpb25JdGVtUHJvdmlkZXIoCi0JCQkJCXRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIHByYWN0aWNlRGVzY3JpcHRpb25JdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb259IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTWV0aG9kQ29uZmlndXJhdGlvbkl0ZW1Qcm92aWRlciBtZXRob2RDb25maWd1cmF0aW9uSXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlTWV0aG9kQ29uZmlndXJhdGlvbkFkYXB0ZXIoKSB7Ci0JCWlmIChtZXRob2RDb25maWd1cmF0aW9uSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCW1ldGhvZENvbmZpZ3VyYXRpb25JdGVtUHJvdmlkZXIgPSBuZXcgTWV0aG9kQ29uZmlndXJhdGlvbkl0ZW1Qcm92aWRlcigKLQkJCQkJdGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gbWV0aG9kQ29uZmlndXJhdGlvbkl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0ZhbWlseX0gaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBQcm9jZXNzRmFtaWx5SXRlbVByb3ZpZGVyIHByb2Nlc3NGYW1pbHlJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzRmFtaWx5fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVQcm9jZXNzRmFtaWx5QWRhcHRlcigpIHsKLQkJaWYgKHByb2Nlc3NGYW1pbHlJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJcHJvY2Vzc0ZhbWlseUl0ZW1Qcm92aWRlciA9IG5ldyBQcm9jZXNzRmFtaWx5SXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIHByb2Nlc3NGYW1pbHlJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnl9IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTWV0aG9kTGlicmFyeUl0ZW1Qcm92aWRlciBtZXRob2RMaWJyYXJ5SXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlTWV0aG9kTGlicmFyeUFkYXB0ZXIoKSB7Ci0JCWlmIChtZXRob2RMaWJyYXJ5SXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCW1ldGhvZExpYnJhcnlJdGVtUHJvdmlkZXIgPSBuZXcgTWV0aG9kTGlicmFyeUl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiBtZXRob2RMaWJyYXJ5SXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcm9vdCBhZGFwdGVyIGZhY3RvcnkgdGhhdCBjb250YWlucyB0aGlzIGZhY3RvcnkuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkgZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCkgewotCQlyZXR1cm4gcGFyZW50QWRhcHRlckZhY3RvcnkgPT0gbnVsbCA/IHRoaXMgOiBwYXJlbnRBZGFwdGVyRmFjdG9yeQotCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHNldHMgdGhlIGNvbXBvc2VkIGFkYXB0ZXIgZmFjdG9yeSB0aGF0IGNvbnRhaW5zIHRoaXMgZmFjdG9yeS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQYXJlbnRBZGFwdGVyRmFjdG9yeSgKLQkJCUNvbXBvc2VkQWRhcHRlckZhY3RvcnkgcGFyZW50QWRhcHRlckZhY3RvcnkpIHsKLQkJdGhpcy5wYXJlbnRBZGFwdGVyRmFjdG9yeSA9IHBhcmVudEFkYXB0ZXJGYWN0b3J5OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGlzRmFjdG9yeUZvclR5cGUoT2JqZWN0IHR5cGUpIHsKLQkJcmV0dXJuIHN1cHBvcnRlZFR5cGVzLmNvbnRhaW5zKHR5cGUpIHx8IHN1cGVyLmlzRmFjdG9yeUZvclR5cGUodHlwZSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiBzdWJzdGl0dXRlcyB0aGUgZmFjdG9yeSBpdHNlbGYgYXMgdGhlIGtleSBmb3IgdGhlIGFkYXB0ZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIEFkYXB0ZXIgYWRhcHQoTm90aWZpZXIgbm90aWZpZXIsIE9iamVjdCB0eXBlKSB7Ci0JCXJldHVybiBzdXBlci5hZGFwdChub3RpZmllciwgdGhpcyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBhZGFwdChPYmplY3Qgb2JqZWN0LCBPYmplY3QgdHlwZSkgewotCQlpZiAoaXNGYWN0b3J5Rm9yVHlwZSh0eXBlKSkgewotCQkJT2JqZWN0IGFkYXB0ZXIgPSBzdXBlci5hZGFwdChvYmplY3QsIHR5cGUpOwotCQkJaWYgKCEodHlwZSBpbnN0YW5jZW9mIENsYXNzKQotCQkJCQl8fCAoKChDbGFzczw/PikgdHlwZSkuaXNJbnN0YW5jZShhZGFwdGVyKSkpIHsKLQkJCQlyZXR1cm4gYWRhcHRlcjsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIGxpc3RlbmVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKElOb3RpZnlDaGFuZ2VkTGlzdGVuZXIgbm90aWZ5Q2hhbmdlZExpc3RlbmVyKSB7Ci0JCWNoYW5nZU5vdGlmaWVyLmFkZExpc3RlbmVyKG5vdGlmeUNoYW5nZWRMaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZW1vdmVzIGEgbGlzdGVuZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoSU5vdGlmeUNoYW5nZWRMaXN0ZW5lciBub3RpZnlDaGFuZ2VkTGlzdGVuZXIpIHsKLQkJY2hhbmdlTm90aWZpZXIucmVtb3ZlTGlzdGVuZXIobm90aWZ5Q2hhbmdlZExpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGRlbGVnYXRlcyB0byB7QGxpbmsgI2NoYW5nZU5vdGlmaWVyfSBhbmQgdG8ge0BsaW5rICNwYXJlbnRBZGFwdGVyRmFjdG9yeX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZmlyZU5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQljaGFuZ2VOb3RpZmllci5maXJlTm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCi0JCWlmIChwYXJlbnRBZGFwdGVyRmFjdG9yeSAhPSBudWxsKSB7Ci0JCQlwYXJlbnRBZGFwdGVyRmFjdG9yeS5maXJlTm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhpcyBkaXNwb3NlcyBhbGwgb2YgdGhlIGl0ZW0gcHJvdmlkZXJzIGNyZWF0ZWQgYnkgdGhpcyBmYWN0b3J5LiAKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlpZiAocGFja2FnZUl0ZW1Qcm92aWRlciAhPSBudWxsKQotCQkJcGFja2FnZUl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7Ci0JCWlmIChjb25zdHJhaW50SXRlbVByb3ZpZGVyICE9IG51bGwpCi0JCQljb25zdHJhaW50SXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJaWYgKG1ldGhvZEVsZW1lbnRQcm9wZXJ0eUl0ZW1Qcm92aWRlciAhPSBudWxsKQotCQkJbWV0aG9kRWxlbWVudFByb3BlcnR5SXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJaWYgKGtpbmRJdGVtUHJvdmlkZXIgIT0gbnVsbCkKLQkJCWtpbmRJdGVtUHJvdmlkZXIuZGlzcG9zZSgpOwotCQlpZiAoY29udGVudERlc2NyaXB0aW9uSXRlbVByb3ZpZGVyICE9IG51bGwpCi0JCQljb250ZW50RGVzY3JpcHRpb25JdGVtUHJvdmlkZXIuZGlzcG9zZSgpOwotCQlpZiAoc3VwcG9ydGluZ01hdGVyaWFsSXRlbVByb3ZpZGVyICE9IG51bGwpCi0JCQlzdXBwb3J0aW5nTWF0ZXJpYWxJdGVtUHJvdmlkZXIuZGlzcG9zZSgpOwotCQlpZiAoc2VjdGlvbkl0ZW1Qcm92aWRlciAhPSBudWxsKQotCQkJc2VjdGlvbkl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7Ci0JCWlmIChjb25jZXB0SXRlbVByb3ZpZGVyICE9IG51bGwpCi0JCQljb25jZXB0SXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJaWYgKGNoZWNrbGlzdEl0ZW1Qcm92aWRlciAhPSBudWxsKQotCQkJY2hlY2tsaXN0SXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJaWYgKGd1aWRlbGluZUl0ZW1Qcm92aWRlciAhPSBudWxsKQotCQkJZ3VpZGVsaW5lSXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJaWYgKGV4YW1wbGVJdGVtUHJvdmlkZXIgIT0gbnVsbCkKLQkJCWV4YW1wbGVJdGVtUHJvdmlkZXIuZGlzcG9zZSgpOwotCQlpZiAocmV1c2FibGVBc3NldEl0ZW1Qcm92aWRlciAhPSBudWxsKQotCQkJcmV1c2FibGVBc3NldEl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7Ci0JCWlmICh0ZXJtRGVmaW5pdGlvbkl0ZW1Qcm92aWRlciAhPSBudWxsKQotCQkJdGVybURlZmluaXRpb25JdGVtUHJvdmlkZXIuZGlzcG9zZSgpOwotCQlpZiAoYXBwbGljYWJsZU1ldGFDbGFzc0luZm9JdGVtUHJvdmlkZXIgIT0gbnVsbCkKLQkJCWFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvSXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJaWYgKGFydGlmYWN0SXRlbVByb3ZpZGVyICE9IG51bGwpCi0JCQlhcnRpZmFjdEl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7Ci0JCWlmICh3b3JrUHJvZHVjdEl0ZW1Qcm92aWRlciAhPSBudWxsKQotCQkJd29ya1Byb2R1Y3RJdGVtUHJvdmlkZXIuZGlzcG9zZSgpOwotCQlpZiAoZnVsZmlsbGFibGVFbGVtZW50SXRlbVByb3ZpZGVyICE9IG51bGwpCi0JCQlmdWxmaWxsYWJsZUVsZW1lbnRJdGVtUHJvdmlkZXIuZGlzcG9zZSgpOwotCQlpZiAocmVwb3J0SXRlbVByb3ZpZGVyICE9IG51bGwpCi0JCQlyZXBvcnRJdGVtUHJvdmlkZXIuZGlzcG9zZSgpOwotCQlpZiAodGVtcGxhdGVJdGVtUHJvdmlkZXIgIT0gbnVsbCkKLQkJCXRlbXBsYXRlSXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJaWYgKHRvb2xNZW50b3JJdGVtUHJvdmlkZXIgIT0gbnVsbCkKLQkJCXRvb2xNZW50b3JJdGVtUHJvdmlkZXIuZGlzcG9zZSgpOwotCQlpZiAoZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zSXRlbVByb3ZpZGVyICE9IG51bGwpCi0JCQllc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnNJdGVtUHJvdmlkZXIuZGlzcG9zZSgpOwotCQlpZiAoZGVsaXZlcmFibGVJdGVtUHJvdmlkZXIgIT0gbnVsbCkKLQkJCWRlbGl2ZXJhYmxlSXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJaWYgKG91dGNvbWVJdGVtUHJvdmlkZXIgIT0gbnVsbCkKLQkJCW91dGNvbWVJdGVtUHJvdmlkZXIuZGlzcG9zZSgpOwotCQlpZiAoc3RlcEl0ZW1Qcm92aWRlciAhPSBudWxsKQotCQkJc3RlcEl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7Ci0JCWlmICh3aGl0ZXBhcGVySXRlbVByb3ZpZGVyICE9IG51bGwpCi0JCQl3aGl0ZXBhcGVySXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJaWYgKHRhc2tJdGVtUHJvdmlkZXIgIT0gbnVsbCkKLQkJCXRhc2tJdGVtUHJvdmlkZXIuZGlzcG9zZSgpOwotCQlpZiAocm9sZUl0ZW1Qcm92aWRlciAhPSBudWxsKQotCQkJcm9sZUl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7Ci0JCWlmIChhcnRpZmFjdERlc2NyaXB0aW9uSXRlbVByb3ZpZGVyICE9IG51bGwpCi0JCQlhcnRpZmFjdERlc2NyaXB0aW9uSXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJaWYgKHdvcmtQcm9kdWN0RGVzY3JpcHRpb25JdGVtUHJvdmlkZXIgIT0gbnVsbCkKLQkJCXdvcmtQcm9kdWN0RGVzY3JpcHRpb25JdGVtUHJvdmlkZXIuZGlzcG9zZSgpOwotCQlpZiAoZGVsaXZlcmFibGVEZXNjcmlwdGlvbkl0ZW1Qcm92aWRlciAhPSBudWxsKQotCQkJZGVsaXZlcmFibGVEZXNjcmlwdGlvbkl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7Ci0JCWlmIChyb2xlRGVzY3JpcHRpb25JdGVtUHJvdmlkZXIgIT0gbnVsbCkKLQkJCXJvbGVEZXNjcmlwdGlvbkl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7Ci0JCWlmICh0YXNrRGVzY3JpcHRpb25JdGVtUHJvdmlkZXIgIT0gbnVsbCkKLQkJCXRhc2tEZXNjcmlwdGlvbkl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7Ci0JCWlmIChndWlkYW5jZURlc2NyaXB0aW9uSXRlbVByb3ZpZGVyICE9IG51bGwpCi0JCQlndWlkYW5jZURlc2NyaXB0aW9uSXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJaWYgKHByYWN0aWNlRGVzY3JpcHRpb25JdGVtUHJvdmlkZXIgIT0gbnVsbCkKLQkJCXByYWN0aWNlRGVzY3JpcHRpb25JdGVtUHJvdmlkZXIuZGlzcG9zZSgpOwotCQlpZiAocm9sZVNldEl0ZW1Qcm92aWRlciAhPSBudWxsKQotCQkJcm9sZVNldEl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7Ci0JCWlmIChkb21haW5JdGVtUHJvdmlkZXIgIT0gbnVsbCkKLQkJCWRvbWFpbkl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7Ci0JCWlmICh3b3JrUHJvZHVjdFR5cGVJdGVtUHJvdmlkZXIgIT0gbnVsbCkKLQkJCXdvcmtQcm9kdWN0VHlwZUl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7Ci0JCWlmIChkaXNjaXBsaW5lR3JvdXBpbmdJdGVtUHJvdmlkZXIgIT0gbnVsbCkKLQkJCWRpc2NpcGxpbmVHcm91cGluZ0l0ZW1Qcm92aWRlci5kaXNwb3NlKCk7Ci0JCWlmIChkaXNjaXBsaW5lSXRlbVByb3ZpZGVyICE9IG51bGwpCi0JCQlkaXNjaXBsaW5lSXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJaWYgKGFjdGl2aXR5SXRlbVByb3ZpZGVyICE9IG51bGwpCi0JCQlhY3Rpdml0eUl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7Ci0JCWlmIChwbGFubmluZ0RhdGFJdGVtUHJvdmlkZXIgIT0gbnVsbCkKLQkJCXBsYW5uaW5nRGF0YUl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7Ci0JCWlmICh3b3JrT3JkZXJJdGVtUHJvdmlkZXIgIT0gbnVsbCkKLQkJCXdvcmtPcmRlckl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7Ci0JCWlmIChyb2FkbWFwSXRlbVByb3ZpZGVyICE9IG51bGwpCi0JCQlyb2FkbWFwSXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJaWYgKHRvb2xJdGVtUHJvdmlkZXIgIT0gbnVsbCkKLQkJCXRvb2xJdGVtUHJvdmlkZXIuZGlzcG9zZSgpOwotCQlpZiAocm9sZVNldEdyb3VwaW5nSXRlbVByb3ZpZGVyICE9IG51bGwpCi0JCQlyb2xlU2V0R3JvdXBpbmdJdGVtUHJvdmlkZXIuZGlzcG9zZSgpOwotCQlpZiAoY3VzdG9tQ2F0ZWdvcnlJdGVtUHJvdmlkZXIgIT0gbnVsbCkKLQkJCWN1c3RvbUNhdGVnb3J5SXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJaWYgKGNvbnRlbnRQYWNrYWdlSXRlbVByb3ZpZGVyICE9IG51bGwpCi0JCQljb250ZW50UGFja2FnZUl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7Ci0JCWlmIChtaWxlc3RvbmVJdGVtUHJvdmlkZXIgIT0gbnVsbCkKLQkJCW1pbGVzdG9uZUl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7Ci0JCWlmICh3b3JrUHJvZHVjdERlc2NyaXB0b3JJdGVtUHJvdmlkZXIgIT0gbnVsbCkKLQkJCXdvcmtQcm9kdWN0RGVzY3JpcHRvckl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7Ci0JCWlmIChpdGVyYXRpb25JdGVtUHJvdmlkZXIgIT0gbnVsbCkKLQkJCWl0ZXJhdGlvbkl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7Ci0JCWlmIChwaGFzZUl0ZW1Qcm92aWRlciAhPSBudWxsKQotCQkJcGhhc2VJdGVtUHJvdmlkZXIuZGlzcG9zZSgpOwotCQlpZiAodGVhbVByb2ZpbGVJdGVtUHJvdmlkZXIgIT0gbnVsbCkKLQkJCXRlYW1Qcm9maWxlSXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJaWYgKHJvbGVEZXNjcmlwdG9ySXRlbVByb3ZpZGVyICE9IG51bGwpCi0JCQlyb2xlRGVzY3JpcHRvckl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7Ci0JCWlmICh0YXNrRGVzY3JpcHRvckl0ZW1Qcm92aWRlciAhPSBudWxsKQotCQkJdGFza0Rlc2NyaXB0b3JJdGVtUHJvdmlkZXIuZGlzcG9zZSgpOwotCQlpZiAoY29tcG9zaXRlUm9sZUl0ZW1Qcm92aWRlciAhPSBudWxsKQotCQkJY29tcG9zaXRlUm9sZUl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7Ci0JCWlmIChkZWxpdmVyeVByb2Nlc3NJdGVtUHJvdmlkZXIgIT0gbnVsbCkKLQkJCWRlbGl2ZXJ5UHJvY2Vzc0l0ZW1Qcm92aWRlci5kaXNwb3NlKCk7Ci0JCWlmIChjYXBhYmlsaXR5UGF0dGVybkl0ZW1Qcm92aWRlciAhPSBudWxsKQotCQkJY2FwYWJpbGl0eVBhdHRlcm5JdGVtUHJvdmlkZXIuZGlzcG9zZSgpOwotCQlpZiAobWV0aG9kQ29uZmlndXJhdGlvbkl0ZW1Qcm92aWRlciAhPSBudWxsKQotCQkJbWV0aG9kQ29uZmlndXJhdGlvbkl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7Ci0JCWlmIChtZXRob2RQbHVnaW5JdGVtUHJvdmlkZXIgIT0gbnVsbCkKLQkJCW1ldGhvZFBsdWdpbkl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7Ci0JCWlmIChwcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZUl0ZW1Qcm92aWRlciAhPSBudWxsKQotCQkJcHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGVJdGVtUHJvdmlkZXIuZGlzcG9zZSgpOwotCQlpZiAocHJhY3RpY2VJdGVtUHJvdmlkZXIgIT0gbnVsbCkKLQkJCXByYWN0aWNlSXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJaWYgKGJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbkl0ZW1Qcm92aWRlciAhPSBudWxsKQotCQkJYnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uSXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJaWYgKGFjdGl2aXR5RGVzY3JpcHRpb25JdGVtUHJvdmlkZXIgIT0gbnVsbCkKLQkJCWFjdGl2aXR5RGVzY3JpcHRpb25JdGVtUHJvdmlkZXIuZGlzcG9zZSgpOwotCQlpZiAoZGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25JdGVtUHJvdmlkZXIgIT0gbnVsbCkKLQkJCWRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uSXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJaWYgKHByb2Nlc3NEZXNjcmlwdGlvbkl0ZW1Qcm92aWRlciAhPSBudWxsKQotCQkJcHJvY2Vzc0Rlc2NyaXB0aW9uSXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJaWYgKGRlc2NyaXB0b3JEZXNjcmlwdGlvbkl0ZW1Qcm92aWRlciAhPSBudWxsKQotCQkJZGVzY3JpcHRvckRlc2NyaXB0aW9uSXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJaWYgKHByb2Nlc3NDb21wb25lbnREZXNjcmlwdG9ySXRlbVByb3ZpZGVyICE9IG51bGwpCi0JCQlwcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvckl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7Ci0JCWlmIChwcm9jZXNzQ29tcG9uZW50SXRlbVByb3ZpZGVyICE9IG51bGwpCi0JCQlwcm9jZXNzQ29tcG9uZW50SXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJaWYgKHByb2Nlc3NQYWNrYWdlSXRlbVByb3ZpZGVyICE9IG51bGwpCi0JCQlwcm9jZXNzUGFja2FnZUl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7Ci0JCWlmIChkaWFncmFtSXRlbVByb3ZpZGVyICE9IG51bGwpCi0JCQlkaWFncmFtSXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJaWYgKGdyYXBoTm9kZUl0ZW1Qcm92aWRlciAhPSBudWxsKQotCQkJZ3JhcGhOb2RlSXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJaWYgKHJlZmVyZW5jZUl0ZW1Qcm92aWRlciAhPSBudWxsKQotCQkJcmVmZXJlbmNlSXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJaWYgKHByb3BlcnR5SXRlbVByb3ZpZGVyICE9IG51bGwpCi0JCQlwcm9wZXJ0eUl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7Ci0JCWlmIChwb2ludEl0ZW1Qcm92aWRlciAhPSBudWxsKQotCQkJcG9pbnRJdGVtUHJvdmlkZXIuZGlzcG9zZSgpOwotCQlpZiAoZGlhZ3JhbUxpbmtJdGVtUHJvdmlkZXIgIT0gbnVsbCkKLQkJCWRpYWdyYW1MaW5rSXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJaWYgKGdyYXBoQ29ubmVjdG9ySXRlbVByb3ZpZGVyICE9IG51bGwpCi0JCQlncmFwaENvbm5lY3Rvckl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7Ci0JCWlmIChncmFwaEVkZ2VJdGVtUHJvdmlkZXIgIT0gbnVsbCkKLQkJCWdyYXBoRWRnZUl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7Ci0JCWlmIChkaW1lbnNpb25JdGVtUHJvdmlkZXIgIT0gbnVsbCkKLQkJCWRpbWVuc2lvbkl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7Ci0JCWlmIChwcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlSXRlbVByb3ZpZGVyICE9IG51bGwpCi0JCQlwcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlSXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJaWYgKHNpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50SXRlbVByb3ZpZGVyICE9IG51bGwpCi0JCQlzaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudEl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7Ci0JCWlmICh1bWFTZW1hbnRpY01vZGVsQnJpZGdlSXRlbVByb3ZpZGVyICE9IG51bGwpCi0JCQl1bWFTZW1hbnRpY01vZGVsQnJpZGdlSXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJaWYgKGNvcmVTZW1hbnRpY01vZGVsQnJpZGdlSXRlbVByb3ZpZGVyICE9IG51bGwpCi0JCQljb3JlU2VtYW50aWNNb2RlbEJyaWRnZUl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7Ci0JCWlmICh0ZXh0RWxlbWVudEl0ZW1Qcm92aWRlciAhPSBudWxsKQotCQkJdGV4dEVsZW1lbnRJdGVtUHJvdmlkZXIuZGlzcG9zZSgpOwotCQlpZiAoaW1hZ2VJdGVtUHJvdmlkZXIgIT0gbnVsbCkKLQkJCWltYWdlSXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJaWYgKHBvbHlsaW5lSXRlbVByb3ZpZGVyICE9IG51bGwpCi0JCQlwb2x5bGluZUl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7Ci0JCWlmIChlbGxpcHNlSXRlbVByb3ZpZGVyICE9IG51bGwpCi0JCQllbGxpcHNlSXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJaWYgKHByb2Nlc3NGYW1pbHlJdGVtUHJvdmlkZXIgIT0gbnVsbCkKLQkJCXByb2Nlc3NGYW1pbHlJdGVtUHJvdmlkZXIuZGlzcG9zZSgpOwotCQlpZiAobWV0aG9kTGlicmFyeUl0ZW1Qcm92aWRlciAhPSBudWxsKQotCQkJbWV0aG9kTGlicmFyeUl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvVmFyaWFiaWxpdHlFbGVtZW50SXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvVmFyaWFiaWxpdHlFbGVtZW50SXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5N2Q1NzkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1ZhcmlhYmlsaXR5RWxlbWVudEl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQ7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudH0gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgVmFyaWFiaWxpdHlFbGVtZW50SXRlbVByb3ZpZGVyIGV4dGVuZHMgTWV0aG9kRWxlbWVudEl0ZW1Qcm92aWRlcgotCQlpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFZhcmlhYmlsaXR5RWxlbWVudEl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIExpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlhZGRWYXJpYWJpbGl0eVR5cGVQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnRQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFZhcmlhYmlsaXR5IFR5cGUgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRWYXJpYWJpbGl0eVR5cGVQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfVmFyaWFiaWxpdHlFbGVtZW50X3ZhcmlhYmlsaXR5VHlwZV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1ZhcmlhYmlsaXR5RWxlbWVudF92YXJpYWJpbGl0eVR5cGVfZmVhdHVyZSIsICJfVUlfVmFyaWFiaWxpdHlFbGVtZW50X3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuVkFSSUFCSUxJVFlfRUxFTUVOVF9fVkFSSUFCSUxJVFlfVFlQRSwKLQkJCQkJCXRydWUsIGZhbHNlLCBmYWxzZSwKLQkJCQkJCUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBWYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50IGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkVmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudFByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9WYXJpYWJpbGl0eUVsZW1lbnRfdmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudF9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1ZhcmlhYmlsaXR5RWxlbWVudF92YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50X2ZlYXR1cmUiLCAiX1VJX1ZhcmlhYmlsaXR5RWxlbWVudF90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLlZBUklBQklMSVRZX0VMRU1FTlRfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQsCi0JCQkJCQl0cnVlLCBmYWxzZSwgdHJ1ZSwgbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChWYXJpYWJpbGl0eUVsZW1lbnQpIG9iamVjdCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfVmFyaWFiaWxpdHlFbGVtZW50X3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQlnZXRTdHJpbmcoIl9VSV9WYXJpYWJpbGl0eUVsZW1lbnRfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0KLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKFZhcmlhYmlsaXR5RWxlbWVudC5jbGFzcykpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlZBUklBQklMSVRZX0VMRU1FTlRfX1ZBUklBQklMSVRZX1RZUEU6Ci0JCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uCi0JCQkJCS5nZXROb3RpZmllcigpLCBmYWxzZSwgdHJ1ZSkpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuCi0JICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycygKLQkJCUNvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1doaXRlcGFwZXJJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9XaGl0ZXBhcGVySXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5MGM4YmMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1doaXRlcGFwZXJJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV2hpdGVwYXBlcjsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuV2hpdGVwYXBlcn0gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgV2hpdGVwYXBlckl0ZW1Qcm92aWRlciBleHRlbmRzIENvbmNlcHRJdGVtUHJvdmlkZXIgaW1wbGVtZW50cwotCQlJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBXaGl0ZXBhcGVySXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIFdoaXRlcGFwZXIuZ2lmLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoCi0JCQkJImZ1bGwvb2JqMTYvV2hpdGVwYXBlciIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChXaGl0ZXBhcGVyKSBvYmplY3QpLmdldE5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX1doaXRlcGFwZXJfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCWdldFN0cmluZygiX1VJX1doaXRlcGFwZXJfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuCi0JICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycygKLQkJCUNvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1dvcmtCcmVha2Rvd25FbGVtZW50SXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvV29ya0JyZWFrZG93bkVsZW1lbnRJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjVkNjY4ZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvV29ya0JyZWFrZG93bkVsZW1lbnRJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwOCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya0JyZWFrZG93bkVsZW1lbnQ7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtCcmVha2Rvd25FbGVtZW50fSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBXb3JrQnJlYWtkb3duRWxlbWVudEl0ZW1Qcm92aWRlciBleHRlbmRzCi0JCUJyZWFrZG93bkVsZW1lbnRJdGVtUHJvdmlkZXIgaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwKLQkJSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBXb3JrQnJlYWtkb3duRWxlbWVudEl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIExpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlhZGRJc1JlcGVhdGFibGVQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZElzT25nb2luZ1Byb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkSXNFdmVudERyaXZlblByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkTGlua1RvUHJlZGVjZXNzb3JQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIElzIFJlcGVhdGFibGUgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRJc1JlcGVhdGFibGVQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfV29ya0JyZWFrZG93bkVsZW1lbnRfaXNSZXBlYXRhYmxlX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfV29ya0JyZWFrZG93bkVsZW1lbnRfaXNSZXBlYXRhYmxlX2ZlYXR1cmUiLCAiX1VJX1dvcmtCcmVha2Rvd25FbGVtZW50X3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuV09SS19CUkVBS0RPV05fRUxFTUVOVF9fSVNfUkVQRUFUQUJMRSwKLQkJCQkJCXRydWUsIGZhbHNlLCBmYWxzZSwKLQkJCQkJCUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBJcyBPbmdvaW5nIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkSXNPbmdvaW5nUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX1dvcmtCcmVha2Rvd25FbGVtZW50X2lzT25nb2luZ19mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1dvcmtCcmVha2Rvd25FbGVtZW50X2lzT25nb2luZ19mZWF0dXJlIiwgIl9VSV9Xb3JrQnJlYWtkb3duRWxlbWVudF90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLldPUktfQlJFQUtET1dOX0VMRU1FTlRfX0lTX09OR09JTkcsCi0JCQkJCQl0cnVlLCBmYWxzZSwgZmFsc2UsCi0JCQkJCQlJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgSXMgRXZlbnQgRHJpdmVuIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkSXNFdmVudERyaXZlblByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9Xb3JrQnJlYWtkb3duRWxlbWVudF9pc0V2ZW50RHJpdmVuX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfV29ya0JyZWFrZG93bkVsZW1lbnRfaXNFdmVudERyaXZlbl9mZWF0dXJlIiwgIl9VSV9Xb3JrQnJlYWtkb3duRWxlbWVudF90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLldPUktfQlJFQUtET1dOX0VMRU1FTlRfX0lTX0VWRU5UX0RSSVZFTiwKLQkJCQkJCXRydWUsIGZhbHNlLCBmYWxzZSwKLQkJCQkJCUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBMaW5rIFRvIFByZWRlY2Vzc29yIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkTGlua1RvUHJlZGVjZXNzb3JQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfV29ya0JyZWFrZG93bkVsZW1lbnRfbGlua1RvUHJlZGVjZXNzb3JfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9Xb3JrQnJlYWtkb3duRWxlbWVudF9saW5rVG9QcmVkZWNlc3Nvcl9mZWF0dXJlIiwgIl9VSV9Xb3JrQnJlYWtkb3duRWxlbWVudF90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLldPUktfQlJFQUtET1dOX0VMRU1FTlRfX0xJTktfVE9fUFJFREVDRVNTT1IsCi0JCQkJCQl0cnVlLCBmYWxzZSwgdHJ1ZSwgbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChXb3JrQnJlYWtkb3duRWxlbWVudCkgb2JqZWN0KS5nZXROYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9Xb3JrQnJlYWtkb3duRWxlbWVudF90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJZ2V0U3RyaW5nKCJfVUlfV29ya0JyZWFrZG93bkVsZW1lbnRfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0KLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKFdvcmtCcmVha2Rvd25FbGVtZW50LmNsYXNzKSkgewotCQljYXNlIFVtYVBhY2thZ2UuV09SS19CUkVBS0RPV05fRUxFTUVOVF9fSVNfUkVQRUFUQUJMRToKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfQlJFQUtET1dOX0VMRU1FTlRfX0lTX09OR09JTkc6Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19JU19FVkVOVF9EUklWRU46Ci0JCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uCi0JCQkJCS5nZXROb3RpZmllcigpLCBmYWxzZSwgdHJ1ZSkpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuCi0JICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycygKLQkJCUNvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1dvcmtEZWZpbml0aW9uSXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvV29ya0RlZmluaXRpb25JdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTJjMDlkMS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvV29ya0RlZmluaXRpb25JdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrRGVmaW5pdGlvbjsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya0RlZmluaXRpb259IG9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFdvcmtEZWZpbml0aW9uSXRlbVByb3ZpZGVyIGV4dGVuZHMgTWV0aG9kRWxlbWVudEl0ZW1Qcm92aWRlcgotCQlpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFdvcmtEZWZpbml0aW9uSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBzcGVjaWZpZXMgaG93IHRvIGltcGxlbWVudCB7QGxpbmsgI2dldENoaWxkcmVufSBhbmQgaXMgdXNlZCB0byBkZWR1Y2UgYW4gYXBwcm9wcmlhdGUgZmVhdHVyZSBmb3IgYW4KLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5BZGRDb21tYW5kfSwge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuUmVtb3ZlQ29tbWFuZH0gb3IKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Nb3ZlQ29tbWFuZH0gaW4ge0BsaW5rICNjcmVhdGVDb21tYW5kfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQ29sbGVjdGlvbjw/IGV4dGVuZHMgRVN0cnVjdHVyYWxGZWF0dXJlPiBnZXRDaGlsZHJlbkZlYXR1cmVzKAotCQkJT2JqZWN0IG9iamVjdCkgewotCQlpZiAoY2hpbGRyZW5GZWF0dXJlcyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRDaGlsZHJlbkZlYXR1cmVzKG9iamVjdCk7Ci0JCQljaGlsZHJlbkZlYXR1cmVzCi0JCQkJCS5hZGQoVW1hUGFja2FnZS5MaXRlcmFscy5XT1JLX0RFRklOSVRJT05fX1BSRUNPTkRJVElPTik7Ci0JCQljaGlsZHJlbkZlYXR1cmVzCi0JCQkJCS5hZGQoVW1hUGFja2FnZS5MaXRlcmFscy5XT1JLX0RFRklOSVRJT05fX1BPU1RDT05ESVRJT04pOwotCQl9Ci0JCXJldHVybiBjaGlsZHJlbkZlYXR1cmVzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFU3RydWN0dXJhbEZlYXR1cmUgZ2V0Q2hpbGRGZWF0dXJlKE9iamVjdCBvYmplY3QsIE9iamVjdCBjaGlsZCkgewotCQkvLyBDaGVjayB0aGUgdHlwZSBvZiB0aGUgc3BlY2lmaWVkIGNoaWxkIG9iamVjdCBhbmQgcmV0dXJuIHRoZSBwcm9wZXIgZmVhdHVyZSB0byB1c2UgZm9yCi0JCS8vIGFkZGluZyAoc2VlIHtAbGluayBBZGRDb21tYW5kfSkgaXQgYXMgYSBjaGlsZC4KLQotCQlyZXR1cm4gc3VwZXIuZ2V0Q2hpbGRGZWF0dXJlKG9iamVjdCwgY2hpbGQpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChXb3JrRGVmaW5pdGlvbikgb2JqZWN0KS5nZXROYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9Xb3JrRGVmaW5pdGlvbl90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJZ2V0U3RyaW5nKCJfVUlfV29ya0RlZmluaXRpb25fdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0KLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKFdvcmtEZWZpbml0aW9uLmNsYXNzKSkgewotCQljYXNlIFVtYVBhY2thZ2UuV09SS19ERUZJTklUSU9OX19QUkVDT05ESVRJT046Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX0RFRklOSVRJT05fX1BPU1RDT05ESVRJT046Ci0JCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uCi0JCQkJCS5nZXROb3RpZmllcigpLCB0cnVlLCBmYWxzZSkpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuCi0JICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycygKLQkJCUNvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5XT1JLX0RFRklOSVRJT05fX1BSRUNPTkRJVElPTiwKLQkJCQlVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVDb25zdHJhaW50KCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcigKLQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLldPUktfREVGSU5JVElPTl9fUE9TVENPTkRJVElPTiwKLQkJCQlVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVDb25zdHJhaW50KCkpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNyZWF0ZUNoaWxkQ29tbWFuZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRDcmVhdGVDaGlsZFRleHQoT2JqZWN0IG93bmVyLCBPYmplY3QgZmVhdHVyZSwKLQkJCU9iamVjdCBjaGlsZCwgQ29sbGVjdGlvbjw/PiBzZWxlY3Rpb24pIHsKLQkJT2JqZWN0IGNoaWxkRmVhdHVyZSA9IGZlYXR1cmU7Ci0JCU9iamVjdCBjaGlsZE9iamVjdCA9IGNoaWxkOwotCi0JCWJvb2xlYW4gcXVhbGlmeSA9IGNoaWxkRmVhdHVyZSA9PSBVbWFQYWNrYWdlLkxpdGVyYWxzLk1FVEhPRF9FTEVNRU5UX19PV05FRF9SVUxFUwotCQkJCXx8IGNoaWxkRmVhdHVyZSA9PSBVbWFQYWNrYWdlLkxpdGVyYWxzLldPUktfREVGSU5JVElPTl9fUFJFQ09ORElUSU9OCi0JCQkJfHwgY2hpbGRGZWF0dXJlID09IFVtYVBhY2thZ2UuTGl0ZXJhbHMuV09SS19ERUZJTklUSU9OX19QT1NUQ09ORElUSU9OOwotCi0JCWlmIChxdWFsaWZ5KSB7Ci0JCQlyZXR1cm4gZ2V0U3RyaW5nKCJfVUlfQ3JlYXRlQ2hpbGRfdGV4dDIiLCAvLyROT04tTkxTLTEkCi0JCQkJCW5ldyBPYmplY3RbXSB7IGdldFR5cGVUZXh0KGNoaWxkT2JqZWN0KSwKLQkJCQkJCQlnZXRGZWF0dXJlVGV4dChjaGlsZEZlYXR1cmUpLCBnZXRUeXBlVGV4dChvd25lcikgfSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldENyZWF0ZUNoaWxkVGV4dChvd25lciwgZmVhdHVyZSwgY2hpbGQsIHNlbGVjdGlvbik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1dvcmtPcmRlckl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1dvcmtPcmRlckl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZDgwMDcxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9Xb3JrT3JkZXJJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya09yZGVyOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrT3JkZXJ9IG9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFdvcmtPcmRlckl0ZW1Qcm92aWRlciBleHRlbmRzIFByb2Nlc3NFbGVtZW50SXRlbVByb3ZpZGVyIGltcGxlbWVudHMKLQkJSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgV29ya09yZGVySXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCWFkZExpbmtUeXBlUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRQcmVkUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBMaW5rIFR5cGUgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRMaW5rVHlwZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9Xb3JrT3JkZXJfbGlua1R5cGVfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9Xb3JrT3JkZXJfbGlua1R5cGVfZmVhdHVyZSIsICJfVUlfV29ya09yZGVyX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuV09SS19PUkRFUl9fTElOS19UWVBFLCB0cnVlLCBmYWxzZSwKLQkJCQkJCWZhbHNlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsCi0JCQkJCQludWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFByZWQgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRQcmVkUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX1dvcmtPcmRlcl9wcmVkX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfV29ya09yZGVyX3ByZWRfZmVhdHVyZSIsICJfVUlfV29ya09yZGVyX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuV09SS19PUkRFUl9fUFJFRCwgdHJ1ZSwgZmFsc2UsCi0JCQkJCQl0cnVlLCBudWxsLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIFdvcmtPcmRlci5naWYuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgKLQkJCQkiZnVsbC9vYmoxNi9Xb3JrT3JkZXIiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoV29ya09yZGVyKSBvYmplY3QpLmdldE5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX1dvcmtPcmRlcl90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJZ2V0U3RyaW5nKCJfVUlfV29ya09yZGVyX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCi0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChXb3JrT3JkZXIuY2xhc3MpKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX09SREVSX19MSU5LX1RZUEU6Ci0JCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uCi0JCQkJCS5nZXROb3RpZmllcigpLCBmYWxzZSwgdHJ1ZSkpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuCi0JICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycygKLQkJCUNvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1dvcmtQcm9kdWN0RGVzY3JpcHRpb25JdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9Xb3JrUHJvZHVjdERlc2NyaXB0aW9uSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxNWQ2OGQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1dvcmtQcm9kdWN0RGVzY3JpcHRpb25JdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwMCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdGlvbjsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdGlvbn0gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgV29ya1Byb2R1Y3REZXNjcmlwdGlvbkl0ZW1Qcm92aWRlciBleHRlbmRzCi0JCUNvbnRlbnREZXNjcmlwdGlvbkl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLAotCQlJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFdvcmtQcm9kdWN0RGVzY3JpcHRpb25JdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJYWRkUHVycG9zZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkSW1wYWN0T2ZOb3RIYXZpbmdQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZFJlYXNvbnNGb3JOb3ROZWVkaW5nUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBQdXJwb3NlIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkUHVycG9zZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9Xb3JrUHJvZHVjdERlc2NyaXB0aW9uX3B1cnBvc2VfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9Xb3JrUHJvZHVjdERlc2NyaXB0aW9uX3B1cnBvc2VfZmVhdHVyZSIsICJfVUlfV29ya1Byb2R1Y3REZXNjcmlwdGlvbl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLldPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fUFVSUE9TRSwKLQkJCQkJCXRydWUsIGZhbHNlLCBmYWxzZSwKLQkJCQkJCUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBJbXBhY3QgT2YgTm90IEhhdmluZyBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEltcGFjdE9mTm90SGF2aW5nUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX1dvcmtQcm9kdWN0RGVzY3JpcHRpb25faW1wYWN0T2ZOb3RIYXZpbmdfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9Xb3JrUHJvZHVjdERlc2NyaXB0aW9uX2ltcGFjdE9mTm90SGF2aW5nX2ZlYXR1cmUiLCAiX1VJX1dvcmtQcm9kdWN0RGVzY3JpcHRpb25fdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5XT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX0lNUEFDVF9PRl9OT1RfSEFWSU5HLAotCQkJCQkJdHJ1ZSwgZmFsc2UsIGZhbHNlLAotCQkJCQkJSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFJlYXNvbnMgRm9yIE5vdCBOZWVkaW5nIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkUmVhc29uc0Zvck5vdE5lZWRpbmdQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfV29ya1Byb2R1Y3REZXNjcmlwdGlvbl9yZWFzb25zRm9yTm90TmVlZGluZ19mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1dvcmtQcm9kdWN0RGVzY3JpcHRpb25fcmVhc29uc0Zvck5vdE5lZWRpbmdfZmVhdHVyZSIsICJfVUlfV29ya1Byb2R1Y3REZXNjcmlwdGlvbl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLldPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fUkVBU09OU19GT1JfTk9UX05FRURJTkcsCi0JCQkJCQl0cnVlLCBmYWxzZSwgZmFsc2UsCi0JCQkJCQlJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgV29ya1Byb2R1Y3REZXNjcmlwdGlvbi5naWYuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgKLQkJCQkiZnVsbC9vYmoxNi9Xb3JrUHJvZHVjdERlc2NyaXB0aW9uIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKFdvcmtQcm9kdWN0RGVzY3JpcHRpb24pIG9iamVjdCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfV29ya1Byb2R1Y3REZXNjcmlwdGlvbl90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJZ2V0U3RyaW5nKCJfVUlfV29ya1Byb2R1Y3REZXNjcmlwdGlvbl90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoV29ya1Byb2R1Y3REZXNjcmlwdGlvbi5jbGFzcykpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fUFVSUE9TRToKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fSU1QQUNUX09GX05PVF9IQVZJTkc6Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX1JFQVNPTlNfRk9SX05PVF9ORUVESU5HOgotCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbgotCQkJCQkuZ2V0Tm90aWZpZXIoKSwgZmFsc2UsIHRydWUpKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbgotCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoCi0JCQlDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9Xb3JrUHJvZHVjdERlc2NyaXB0b3JJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9Xb3JrUHJvZHVjdERlc2NyaXB0b3JJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmM5Yjk5ZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvV29ya1Byb2R1Y3REZXNjcmlwdG9ySXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvcjsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yfSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBXb3JrUHJvZHVjdERlc2NyaXB0b3JJdGVtUHJvdmlkZXIgZXh0ZW5kcyBEZXNjcmlwdG9ySXRlbVByb3ZpZGVyCi0JCWltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgV29ya1Byb2R1Y3REZXNjcmlwdG9ySXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCWFkZEFjdGl2aXR5RW50cnlTdGF0ZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkQWN0aXZpdHlFeGl0U3RhdGVQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZFdvcmtQcm9kdWN0UHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRJbXBhY3RlZEJ5UHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRJbXBhY3RzUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGREZWxpdmVyYWJsZVBhcnRzUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBBY3Rpdml0eSBFbnRyeSBTdGF0ZSBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEFjdGl2aXR5RW50cnlTdGF0ZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9Xb3JrUHJvZHVjdERlc2NyaXB0b3JfYWN0aXZpdHlFbnRyeVN0YXRlX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfV29ya1Byb2R1Y3REZXNjcmlwdG9yX2FjdGl2aXR5RW50cnlTdGF0ZV9mZWF0dXJlIiwgIl9VSV9Xb3JrUHJvZHVjdERlc2NyaXB0b3JfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fQUNUSVZJVFlfRU5UUllfU1RBVEUsCi0JCQkJCQl0cnVlLCBmYWxzZSwgZmFsc2UsCi0JCQkJCQlJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgQWN0aXZpdHkgRXhpdCBTdGF0ZSBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEFjdGl2aXR5RXhpdFN0YXRlUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX1dvcmtQcm9kdWN0RGVzY3JpcHRvcl9hY3Rpdml0eUV4aXRTdGF0ZV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1dvcmtQcm9kdWN0RGVzY3JpcHRvcl9hY3Rpdml0eUV4aXRTdGF0ZV9mZWF0dXJlIiwgIl9VSV9Xb3JrUHJvZHVjdERlc2NyaXB0b3JfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fQUNUSVZJVFlfRVhJVF9TVEFURSwKLQkJCQkJCXRydWUsIGZhbHNlLCBmYWxzZSwKLQkJCQkJCUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBXb3JrIFByb2R1Y3QgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRXb3JrUHJvZHVjdFByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9Xb3JrUHJvZHVjdERlc2NyaXB0b3JfV29ya1Byb2R1Y3RfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9Xb3JrUHJvZHVjdERlc2NyaXB0b3JfV29ya1Byb2R1Y3RfZmVhdHVyZSIsICJfVUlfV29ya1Byb2R1Y3REZXNjcmlwdG9yX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX1dPUktfUFJPRFVDVCwKLQkJCQkJCXRydWUsIGZhbHNlLCB0cnVlLCBudWxsLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIEltcGFjdGVkIEJ5IGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkSW1wYWN0ZWRCeVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9Xb3JrUHJvZHVjdERlc2NyaXB0b3JfaW1wYWN0ZWRCeV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1dvcmtQcm9kdWN0RGVzY3JpcHRvcl9pbXBhY3RlZEJ5X2ZlYXR1cmUiLCAiX1VJX1dvcmtQcm9kdWN0RGVzY3JpcHRvcl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX19JTVBBQ1RFRF9CWSwKLQkJCQkJCXRydWUsIGZhbHNlLCB0cnVlLCBudWxsLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIEltcGFjdHMgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRJbXBhY3RzUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX1dvcmtQcm9kdWN0RGVzY3JpcHRvcl9pbXBhY3RzX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfV29ya1Byb2R1Y3REZXNjcmlwdG9yX2ltcGFjdHNfZmVhdHVyZSIsICJfVUlfV29ya1Byb2R1Y3REZXNjcmlwdG9yX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0lNUEFDVFMsCi0JCQkJCQl0cnVlLCBmYWxzZSwgdHJ1ZSwgbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBEZWxpdmVyYWJsZSBQYXJ0cyBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZERlbGl2ZXJhYmxlUGFydHNQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfV29ya1Byb2R1Y3REZXNjcmlwdG9yX2RlbGl2ZXJhYmxlUGFydHNfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9Xb3JrUHJvZHVjdERlc2NyaXB0b3JfZGVsaXZlcmFibGVQYXJ0c19mZWF0dXJlIiwgIl9VSV9Xb3JrUHJvZHVjdERlc2NyaXB0b3JfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fREVMSVZFUkFCTEVfUEFSVFMsCi0JCQkJCQl0cnVlLCBmYWxzZSwgdHJ1ZSwgbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBXb3JrUHJvZHVjdERlc2NyaXB0b3IuZ2lmLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoCi0JCQkJImZ1bGwvb2JqMTYvV29ya1Byb2R1Y3REZXNjcmlwdG9yIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgb2JqZWN0KS5nZXROYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9Xb3JrUHJvZHVjdERlc2NyaXB0b3JfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCWdldFN0cmluZygiX1VJX1dvcmtQcm9kdWN0RGVzY3JpcHRvcl90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoV29ya1Byb2R1Y3REZXNjcmlwdG9yLmNsYXNzKSkgewotCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0FDVElWSVRZX0VOVFJZX1NUQVRFOgotCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0FDVElWSVRZX0VYSVRfU1RBVEU6Ci0JCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uCi0JCQkJCS5nZXROb3RpZmllcigpLCBmYWxzZSwgdHJ1ZSkpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuCi0JICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycygKLQkJCUNvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1dvcmtQcm9kdWN0SXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvV29ya1Byb2R1Y3RJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDdjNTBjZi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvV29ya1Byb2R1Y3RJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyNSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3Q7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0fSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBXb3JrUHJvZHVjdEl0ZW1Qcm92aWRlciBleHRlbmRzIENvbnRlbnRFbGVtZW50SXRlbVByb3ZpZGVyCi0JCWltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgV29ya1Byb2R1Y3RJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJYWRkRnVsZmlsbHNQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZFJlcG9ydHNQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZFRlbXBsYXRlc1Byb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkVG9vbE1lbnRvcnNQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZEVzdGltYXRpb25Db25zaWRlcmF0aW9uc1Byb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgRnVsZmlsbHMgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRGdWxmaWxsc1Byb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9GdWxmaWxsYWJsZUVsZW1lbnRfZnVsZmlsbHNfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9GdWxmaWxsYWJsZUVsZW1lbnRfZnVsZmlsbHNfZmVhdHVyZSIsICJfVUlfRnVsZmlsbGFibGVFbGVtZW50X3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuRlVMRklMTEFCTEVfRUxFTUVOVF9fRlVMRklMTFMsCi0JCQkJCQl0cnVlLCBmYWxzZSwgdHJ1ZSwgbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBSZXBvcnRzIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkUmVwb3J0c1Byb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9Xb3JrUHJvZHVjdF9yZXBvcnRzX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfV29ya1Byb2R1Y3RfcmVwb3J0c19mZWF0dXJlIiwgIl9VSV9Xb3JrUHJvZHVjdF90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLldPUktfUFJPRFVDVF9fUkVQT1JUUywgdHJ1ZSwgZmFsc2UsCi0JCQkJCQl0cnVlLCBudWxsLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFRlbXBsYXRlcyBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFRlbXBsYXRlc1Byb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9Xb3JrUHJvZHVjdF90ZW1wbGF0ZXNfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9Xb3JrUHJvZHVjdF90ZW1wbGF0ZXNfZmVhdHVyZSIsICJfVUlfV29ya1Byb2R1Y3RfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5XT1JLX1BST0RVQ1RfX1RFTVBMQVRFUywgdHJ1ZSwKLQkJCQkJCWZhbHNlLCB0cnVlLCBudWxsLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFRvb2wgTWVudG9ycyBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFRvb2xNZW50b3JzUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX1dvcmtQcm9kdWN0X3Rvb2xNZW50b3JzX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfV29ya1Byb2R1Y3RfdG9vbE1lbnRvcnNfZmVhdHVyZSIsICJfVUlfV29ya1Byb2R1Y3RfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5XT1JLX1BST0RVQ1RfX1RPT0xfTUVOVE9SUywgdHJ1ZSwKLQkJCQkJCWZhbHNlLCB0cnVlLCBudWxsLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIEVzdGltYXRpb24gQ29uc2lkZXJhdGlvbnMgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnNQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfV29ya1Byb2R1Y3RfZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfV29ya1Byb2R1Y3RfZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zX2ZlYXR1cmUiLCAiX1VJX1dvcmtQcm9kdWN0X3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuV09SS19QUk9EVUNUX19FU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TLAotCQkJCQkJdHJ1ZSwgZmFsc2UsIHRydWUsIG51bGwsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgV29ya1Byb2R1Y3QuZ2lmLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoCi0JCQkJImZ1bGwvb2JqMTYvV29ya1Byb2R1Y3QiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoV29ya1Byb2R1Y3QpIG9iamVjdCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfV29ya1Byb2R1Y3RfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCWdldFN0cmluZygiX1VJX1dvcmtQcm9kdWN0X3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbgotCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoCi0JCQlDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9Xb3JrUHJvZHVjdFR5cGVJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9Xb3JrUHJvZHVjdFR5cGVJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDg0NDY1NS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvV29ya1Byb2R1Y3RUeXBlSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0VHlwZTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3RUeXBlfSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBXb3JrUHJvZHVjdFR5cGVJdGVtUHJvdmlkZXIgZXh0ZW5kcyBDb250ZW50Q2F0ZWdvcnlJdGVtUHJvdmlkZXIKLQkJaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBXb3JrUHJvZHVjdFR5cGVJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJYWRkV29ya1Byb2R1Y3RzUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBXb3JrIFByb2R1Y3RzIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkV29ya1Byb2R1Y3RzUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX1dvcmtQcm9kdWN0VHlwZV93b3JrUHJvZHVjdHNfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9Xb3JrUHJvZHVjdFR5cGVfd29ya1Byb2R1Y3RzX2ZlYXR1cmUiLCAiX1VJX1dvcmtQcm9kdWN0VHlwZV90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLldPUktfUFJPRFVDVF9UWVBFX19XT1JLX1BST0RVQ1RTLAotCQkJCQkJdHJ1ZSwgZmFsc2UsIHRydWUsIG51bGwsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgV29ya1Byb2R1Y3RUeXBlLmdpZi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKAotCQkJCSJmdWxsL29iajE2L1dvcmtQcm9kdWN0VHlwZSIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChXb3JrUHJvZHVjdFR5cGUpIG9iamVjdCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfV29ya1Byb2R1Y3RUeXBlX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQlnZXRTdHJpbmcoIl9VSV9Xb3JrUHJvZHVjdFR5cGVfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuCi0JICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycygKLQkJCUNvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL3BhY2thZ2UuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzZjhlYmMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIGl0ZW0gcHJvdmlkZXJzIGZvciBkaXNwbGF5aW5nIGFuZCBlZGl0aW5nIHRoZSBVTUEgbW9kZWwgb2JqZWN0cy4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLy5jbGFzc3BhdGggYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2NWFjMDYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS8ucHJvamVjdCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2ZTI3ZmIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmVwZi51bWE8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiOWY1ZDguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5lcGYudW1hO3NpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuNS4wLnF1YWxpZmllcgotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLAotIG9yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmU7dmlzaWJpbGl0eTo9cmVleHBvcnQsCi0gb3JnLmVjbGlwc2UuZXBmLmNvbW1vbgotRWNsaXBzZS1MYXp5U3RhcnQ6IHRydWUKLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5lcGYudW1hLAotIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbCwKLSBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9idWlsZC5wcm9wZXJ0aWVzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMmJhZmQ1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotc291cmNlLi4gPSBzcmMvCi1vdXRwdXQuLiA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IC4sXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvbW9kZWwvMS4wLjIvdW1hLmVjb3JlIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9tb2RlbC8xLjAuMi91bWEuZWNvcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhNTgwOTkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9tb2RlbC8xLjAuMi91bWEuZWNvcmUKKysrIC9kZXYvbnVsbApAQCAtMSwxMjE0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZWNvcmU6RVBhY2thZ2UgeG1pOnZlcnNpb249IjIuMCIKLSAgICB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgeG1sbnM6ZWNvcmU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUiIG5hbWU9InVtYSIKLSAgICBuc1VSST0iaHR0cDovL3d3dy5pYm0uY29tL3VtYS8xLjAuMi91bWEuZWNvcmUiIG5zUHJlZml4PSJjb20uaWJtLnVtYSI+Ci0gIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSIwMyIvPgotICA8L2VBbm5vdGF0aW9ucz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJEYXRlIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS51dGlsLkRhdGUiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkRhdGEgdHlwZSB1c2VkIGZvciBhdHRyaWJ1dGVzIG9mIG1ldGEtbW9kZWwgY2xhc3NlcyBvZiB0aGUgdHlwZSBEYXRlLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJVcmkiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLm5ldC5VUkkiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkRhdGEgdHlwZSB1c2VkIGZvciBhdHRyaWJ1dGVzIG9mIG1ldGEtbW9kZWwgY2xhc3NlcyB0aGF0IHBvaW50IHRvIHJlc291cmNlcyBzdWNoIGFzIGZpbGVzLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJVbmxpbWl0ZWROYXR1cmFsIiBpbnN0YW5jZUNsYXNzTmFtZT0iaW50Ii8+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iU3RyaW5nIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5sYW5nLlN0cmluZyIvPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IlNldCIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEudXRpbC5TZXQiLz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJTZXF1ZW5jZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEudXRpbC5MaXN0Ii8+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iSW50ZWdlciIgaW5zdGFuY2VDbGFzc05hbWU9ImludCIvPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkNsYXNzaWZpZXIiIGFic3RyYWN0PSJ0cnVlIiBlU3VwZXJUeXBlcz0iIy8vVHlwZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVU1MIDIuMCBtZXRhLWNsYXNzIENsYXNzaWZpZXIuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlR5cGUiIGFic3RyYWN0PSJ0cnVlIiBlU3VwZXJUeXBlcz0iIy8vUGFja2FnZWFibGVFbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJVTUwgMi4wIG1ldGEtY2xhc3MgVHlwZS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRWxlbWVudCIgYWJzdHJhY3Q9InRydWUiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlVNTCAyLjAgbWV0YS1jbGFzcyBFbGVtZW50LiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJOYW1lZEVsZW1lbnQiIGFic3RyYWN0PSJ0cnVlIiBlU3VwZXJUeXBlcz0iIy8vRWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVU1MIDIuMCBtZXRhLWNsYXNzIE5hbWVkIEVsZW1lbnQuICBEZWZpbmVkIHRoYXQgZXZlcnkgZWxlbWVudCBoYXMgYSBuYW1lLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJuYW1lIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUGFja2FnZWFibGVFbGVtZW50IiBhYnN0cmFjdD0idHJ1ZSIKLSAgICAgIGVTdXBlclR5cGVzPSIjLy9OYW1lZEVsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlVNTCAyLjAgbWV0YS1jbGFzcyBQYWNrYWdhYmxlIEVsZW1lbnQuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlBhY2thZ2UiIGVTdXBlclR5cGVzPSIjLy9OYW1lc3BhY2UgIy8vUGFja2FnZWFibGVFbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJVTUwgMi4wIG1ldGEtY2xhc3MgUGFja2FnZS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iTmFtZXNwYWNlIiBhYnN0cmFjdD0idHJ1ZSIgZVN1cGVyVHlwZXM9IiMvL05hbWVkRWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVU1MIDIuMCBtZXRhLWNsYXNzIE5hbWVzcGFjZS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iTWV0aG9kRWxlbWVudCIgYWJzdHJhY3Q9InRydWUiIGVTdXBlclR5cGVzPSIjLy9QYWNrYWdlYWJsZUVsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkV2ZXJ5IGNsYXNzIGRlZmluZWQgaW4gdGhpcyBzcGVjaWZpY2F0aW9uIGlzIGRlcml2ZWQgZnJvbSBNZXRob2QgRWxlbWVudC4gIEluIG90aGVyIHdvcmRzIE1ldGhvZCBFbGVtZW50IGlzIHRoZSByb290IGdlbmVyYWxpemF0aW9uIGZvciBhbGwgVU1BIGNsYXNzZXMgYW5kIGRlZmluZXMgYSBjb21tb24gc2V0IG9mIGF0dHJpYnV0ZXMgaW5oZXJpdGVkIGJ5IGV2ZXJ5IG90aGVyIGVsZW1lbnQgdHlwZSBvZiB0aGlzIG1vZGVsLiAgTWV0aG9kIEVsZW1lbnQgaXRzZWxmIGlzIGRlcml2ZWQgZnJvbSBQYWNrYWdlYWJsZSBFbGVtZW50IGZyb20gdGhlIFVNTCAyLjAgSW5mcmFzdHJ1Y3R1cmUuICBNZXRob2QgRWxlbWVudCBpbmhlcml0cyB0aGUgTmFtZSBhdHRyaWJ1dGUgZnJvbSBQYWNrYWdlYWJsZSBFbGVtZW50J3Mgc3VwZXIgY2xhc3MuICBFdmVyeSBlbGVtZW50IGRlZmluZWQgYXMgYSBVTUEgaW5zdGFuY2UgaXMgZGVyaXZlZCBmcm9tIE1vZGVsIEVsZW1lbnQuICBFdmVyeSBNZXRob2QgRWxlbWVudCBpbi1zdGFuY2UgaXMgYXQgbGVhc3QgZGVmaW5lZCBieSBhIHVuaXF1ZSBpZCwgYSBuYW1lLCBhcyB3ZWxsIGFzIGJyaWVmIGRlc2NyaXB0aW9uLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJndWlkIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJFdmVyeSBpbnN0YW5jZSBvZiBNZXRob2QgRWxlbWVudCBoYXMgYSBnbG9iYWwgdW5pcXVlIGlkLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJicmllZkRlc2NyaXB0aW9uIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJFdmVyeSBpbnN0YW5jZSBvZiBNZXRob2QgRWxlbWVudCBzaGFsbCBiZSBicmllZmx5IGRlc2NyaWJlZCB3aXRoIG9uZSBvciB0d28gc2VudGVuY2VzIHN1bW1hcml6aW5nIHRoZSBlbGVtZW50LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJvd25lZFJ1bGVzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Db25zdHJhaW50IiBjb250YWlubWVudD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzdXBwcmVzc2VkIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbk9iamVjdCIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJJZiBhIFZhcmlhYmlsaXR5IEVsZW1lbnQgaXMgZGVyaXZlZCBmcm9tIGFub3RoZXIgVmFyaWFiaWxpdHkgRWxlbWVudCB1c2luZyB0aGUgRXh0ZW5kcyBWYXJpYWJpbGl0eSBTcGVjaWFsaXphdGlvbiB0aGVuIHRoaXMgYXR0cmlidXRlIGNhbiBiZSB1c2VkIHRvIHN1cHByZXNzIGluaGVyaXRlZCBNZXRob2QgRWxlbWVudHMgdGhhdCB3ZXJlIHBhcnQgb2YgdGhlIGJhc2VkLW9uIFZhcmlhYmlsaXR5IEVsZW1lbnQsIHdoaWNoIGNhbiBiZSBhbnkgdHlwZSBvZiBNZXRob2QgRWxlbWVudC4gIEluIG90aGVyIHdvcmRzLCBpZiB0aGlzIGF0dHJpYnV0ZSBpcyBzZXQgdG8gdHJ1ZSBvbiBhIE1ldGhvZCBFbGVtZW50IHRoYXQgaGFzIHRoZSBzYW1lIG5hbWUgdGhhbiBhbiBpbmhlcml0ZWQgbWV0aG9kIGVsZW1lbnQgdGhlbiBpdCB3aWxsIG5vdCBiZSByZWdhcmRlZCBhcyBpbmhlcml0ZWQgYXQgYWxsLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJvcmRlcmluZ0d1aWRlIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGlzIGF0dHJpYnV0ZSBpcyB1c2VkIGZvciBDQVNFIHRvb2wgcmVhbGl6YXRpb25zIG9mIHRoaXMgbW9kZWwgdG8gY29udGFpbiBpbmZvcm1hdGlvbiBhYm91dCBsYXlvdXQgYW5kIG9yZGVyaW5nIG9mIHRoZSBtZXRob2QgZWxlbWVudCBhbmQgaXRzIHBhcnRzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJDb25zdHJhaW50IiBlU3VwZXJUeXBlcz0iIy8vTWV0aG9kRWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBDb25zdHJhaW50IGlzIGEgTWV0aG9kIEVsZW1lbnQgdGhhdCByZXByZXNlbnRzIGEgY29uZGl0aW9uIG9yIHJlc3RyaWN0aW9uIGV4cHJlc3NlZCBpbiBuYXR1cmFsIGxhbmd1YWdlIHRleHQgb3IgaW4gYSBtYWNoaW5lIHJlYWRhYmxlIGxhbmd1YWdlIGZvciB0aGUgcHVycG9zZSBvZiBkZWNsYXJpbmcgc29tZSBvZiB0aGUgc2VtYW50aWNzIG9mIGEgTWV0aG9kIEVsZW1lbnQuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImJvZHkiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoaXMgYXR0cmlidXRlIHN0b3JlcyB0aGUgZGVmaW5pdGlvbiBvZiB0aGUgY29uc3RyYWludC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQ29udGVudEVsZW1lbnQiIGFic3RyYWN0PSJ0cnVlIiBlU3VwZXJUeXBlcz0iIy8vRGVzY3JpYmFibGVFbGVtZW50ICMvL1ZhcmlhYmlsaXR5RWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQ29udGVudCBFbGVtZW50IGlzIGEgRGVzY3JpYmFibGUgRWxlbWVudCB0aGF0IHJlcHJlc2VudHMgYW4gYWJzdHJhY3QgZ2VuZXJhbGl6YXRpb24gZm9yIGFsbCBlbGVtZW50cyB0aGF0IGFyZSBjb25zaWRlcmVkIHRvIGJlIGFuZCBtYW5hZ2VkIGFzIE1ldGhvZCBDb250ZW50LiYjeEQ7JiN4QTtDb250ZW50IEVsZW1lbnRzIHJlcHJlc2VudHMgcmV1c2FibGUgTWV0aG9kIENvbnRlbnQgdGhhdCBpcyBzdXBwb3NlZCB0byBiZSBtYW5hZ2VkIGluIENvbnRlbnQgUGFja2FnZXMuICBUaGUgc2VwYXJhdGlvbiBvZiBDb250ZW50IEVsZW1lbnQgZnJvbSBQcm9jZXNzIEVsZW1lbnQgYWxsb3dzIHRvIGNsZWFybHkgZGlzdGluZ3Vpc2ggYmV0d2VlbiBwdXJlIG1ldGhvZCBjb250ZW50IGZyb20gY29udGVudCB0aGF0IGlzIHJlcHJlc2VudGVkIGluIHByb2Nlc3Nlcy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ic3VwcG9ydGluZ01hdGVyaWFscyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vU3VwcG9ydGluZ01hdGVyaWFsIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImNvbmNlcHRzQW5kUGFwZXJzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Db25jZXB0Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImNoZWNrbGlzdHMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0NoZWNrbGlzdCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJndWlkZWxpbmVzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9HdWlkZWxpbmUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZXhhbXBsZXMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0V4YW1wbGUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iYXNzZXRzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9SZXVzYWJsZUFzc2V0Ii8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkRlc2NyaWJhYmxlRWxlbWVudCIgYWJzdHJhY3Q9InRydWUiCi0gICAgICBlU3VwZXJUeXBlcz0iIy8vTWV0aG9kRWxlbWVudCAjLy9DbGFzc2lmaWVyIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJEZXNjcmliYWJsZSBFbGVtZW50IGlzIGFuIGFic3RyYWN0IGdlbmVyYWxpemF0aW9uIG9mIE1ldGhvZCBFbGVtZW50cyBmb3Igd2hpY2ggZXh0ZXJuYWwgcHJlc2VudGF0aW9uIG5hbWVzIGFzIHdlbGwgYXMgY29udGVudCBkZXNjcmlwdGlvbnMgaGF2ZSBiZWVuIGRlZmluZWQsIHN1Y2ggYXMgUm9sZXMgb3IgV29yayBQcm9kdWN0cy4gIFByZXNlbnRhdGlvbiBOYW1lIGFuZCBDb250ZW50IERlc2NyaXB0aW9ucyBhcmUgdHlwaWNhbGx5IGxvY2FsaXplZCB1c2luZyBhIHJlc291cmNlIGFsbG9jYXRpb24gbWVjaGFuaXNtIGZvciBpdHMgU3RyaW5nIHR5cGUgYXR0cmlidXRlcy4mI3hEOyYjeEE7VGhpcyBhYnN0cmFjdGlvbiByZXByZXNlbnRzIGFsbCBlbGVtZW50cyBpbiB0aGUgTWV0aG9kIENvbnRlbnQgYXMgd2VsbCBhcyBQcm9jZXNzIHNwYWNlIGZvciB3aGljaCBjb25jcmV0ZSB0ZXh0dWFsIGRlc2NyaXB0aW9ucyBhcmUgZGVmaW5lZCBpbiB0aGUgZm9ybSBvZiBkb2N1bWVudGluZyBhdHRyaWJ1dGVzIGdyb3VwZWQgaW4gYSBtYXRjaGluZyBDb250ZW50IERlc2NyaXB0aW9uIGluc3RhbmNlIChzZWUgU2VjdGlvbiA0LjEuNCkuICBEZXNjcmliYWJsZSBFbGVtZW50cyBhcmUgaW50ZW5kZWQgdG8gYmUgcHVibGlzaGVkIGluIG1ldGhvZCBvciBwcm9jZXNzIHB1YmxpY2F0aW9ucyAoc2ltaWxhciB0byB0aGUgSUJNIFJhdGlvbmFsIFVuaWZpZWQgUHJvY2VzcyB3ZWIpLiAgRGVzY3JpYmFibGUgRWxlbWVudCBkZWZpbmVzIHRoYXQgdGhlIGVsZW1lbnQgaXQgcmVwcmVzZW50cyB3aWxsIGhhdmUgY29udGVudCAnYXR0YWNoZWQnIHRvIGl0LiAgQ29udGVudCBEZXNjcmlwdGlvbiBpcyB0aGUgYWJzdHJhY3Rpb24gZm9yIHRoZSBhY3R1YWwgcGxhY2VzIGluIHdoaWNoIHRoZSBjb250ZW50IGlzIGJlaW5nIHJlcHJlc2VudGVkLiAgVGhpcyBzZXBhcmF0aW9uIGFsbG93cyBhIGRpc3RpbmN0aW9uIGJldHdlZW4gY29yZSBtZXRob2QgbW9kZWwgZWxlbWVudHMgZGVzY3JpYmluZyB0aGUgc3RydWN0dXJlIG9mIHRoZSBtb2RlbCBmcm9tIHRoZSBhY3R1YWwgZGVzY3JpcHRpb24gY29udGFpbmVyIHByb3ZpZGluZywgZm9yIGV4YW1wbGUsIHRoZSBkb2N1bWVudGF0aW9uIG9mIHRoZSBjb250ZW50IGVsZW1lbnQgaW4gZGlmZmVyZW50IGFsdGVybmF0aXZlcyBsYW5ndWFnZXMsIGF1ZGllbmNlcywgbGljZW5zaW5nIGxldmVscywgZXRjLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwcmVzZW50YXRpb25OYW1lIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJFdmVyeSBEZXNjcmliYWJsZSBFbGVtZW50IGhhcyBhIHByZXNlbnRhdGlvbiBuYW1lLCB3aGljaCBpcyB1c2VkIGZvciBleHRlcm5hbCBwcmVzZW50YXRpb24gb2YgdGhlIGVsZW1lbnQuICBGb3IgZXhhbXBsZSwgbmFtZSAodGhlIGludGVybmFsIHJlcHJlc2VudGF0aW9uKSBtaWdodCBiZSBzZXQgdG8gJnF1b3Q7cnVwX2FyY2hpdGVjdHVyZV9kb2N1bWVudCZxdW90OyB0byBkaWZmZXJlbnRpYXRlIGZyb20gYSAmcXVvdDtqMmVlX2FyY2hpdGN0dXJlX2RvY3VtZW50JnF1b3Q7IHdoZXJlYXMgdGhlIGV4dGVybmFsIHByZXNlbnRhdGlvbiB3b3VsZCBhbHdheXMgYmUgJnF1b3Q7QXJjaGl0ZWN0dXJlIERvY3VtZW50JnF1b3Q7LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJwcmVzZW50YXRpb24iIGVUeXBlPSIjLy9Db250ZW50RGVzY3JpcHRpb24iCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InNoYXBlaWNvbiIgZVR5cGU9IiMvL1VyaSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgcmVmZXJlbmNlIHRvIGFuIGljb24gdGhhdCBjYW4gYmUgdXNlZCBmb3IgbW9kZWxpbmcgd2l0aCBzcGVjaWZpYyBDb250ZW50IEVsZW1lbnQgaW5zdGFuY2VzIChhcyBncmFwaGljYWwgc3RlcmVvdHlwZXMsIGUuZy4gYSB1c2UgY2FzZSBzeW1ib2wgZm9yIGEgdXNlIGNhc2UgYXJ0aWZhY3QpIGFzIHdlbGwgYXMgcHVibGljYXRpb24gb2YgY29udGVudC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibm9kZWljb24iIGVUeXBlPSIjLy9VcmkiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIHJlZmVyZW5jZSB0byBhbiBpY29uIHRoYXQgY2FuIGJlIHVzZWQgaW4gdHJlZSBicm93c2VyIHByZXNlbnRhdGlvbnMgYW5kIGJyZWFrZG93biBzdHJ1Y3R1cmVzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJDb250ZW50RGVzY3JpcHRpb24iIGVTdXBlclR5cGVzPSIjLy9NZXRob2RVbml0Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJDb250ZW50IERlc2NyaXB0aW9uIGlzIGEgTWV0aG9kIEVsZW1lbnQgdGhhdCBpcyB1c2VkIHRvIHN0b3JlIHRoZSB0ZXh0dWFsIGRlc2NyaXB0aW9uIGZvciBhIENvbnRlbnQgRWxlbWVudC4gIEl0IGRlZmluZXMgc3RhbmRhcmQgYXR0cmlidXRlcyBhcHBsaWNhYmxlIGZvciBhbGwgQ29udGVudCBFbGVtZW50IHR5cGVzLiAgU3BlY2lmaWMgQ29udGVudCBFbGVtZW50IHN1Yi10eXBlcyBjYW4gZGVmaW5lIHRoZWlyIG93biBtYXRjaGluZyBDb250ZW50IERlc2NyaXB0aW9uIHN1Yi10eXBlcy4gIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im1haW5EZXNjcmlwdGlvbiIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhpcyBhdHRyaWJ1dGUgc3RvcmUgdGhlIG1haW4gZGVzY3JpcHRpdmUgdGV4dCBmb3IgdGhlIENvbnRlbnQgRWxlbWVudC4gIEFsbCB0ZXh0IHRoYXQgaXMgbm90IHBhcnQgb2YgYW55IG9mIHRoZSBtb3JlIHNwZWNpZmljIGF0dHJpYnV0ZXMgc2hhbGwgYmUgc3RvcmVkIGhlcmUuICBJZiB0aGUgQ29udGVudCBEZXNjcmlwdGlvbiBpcyBkaXZpZGVkIGludG8gc2VjdGlvbnMgdXNpbmcgdGhlIFNlY3Rpb24gY2xhc3MsIHRoZW4gb25seSB0aGUgdGV4dCBmcm9tIHRoZSAnc3RhcnQnIG9mIHRoZSBjb250ZW50IGRlc2NyaXB0aW9uIHRvIHRoZSBmaXJzdCBzZWN0aW9uIHdpbGwgYmUgc3RvcmVkIGhlcmUgKHNpbWlsYXIgdG8gYSBub3JtYWwgZG9jdW1lbnQgd2hlcmUgeW91IGNhbiBwbGFjZSB0ZXh0IGJldHdlZW4gaXRzIGJlZ2lubmluZyB0byBpdHMgZmlyc3QgZGljdGlvbiBoZWFkaW5nKS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ic2VjdGlvbnMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1NlY3Rpb24iIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImtleUNvbnNpZGVyYXRpb25zIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJLZXkgQ29uc2lkZXJhdGlvbnMgcHJvdmlkZXMgYWR2aXNlIGFuZCBndWlkYW5jZSBvZiBhIGNyaXRpY2FsIG5hdHVyZSBmb3IgdGhlIGNvbnRlbnQgZWxlbWVudCBhcyB3ZWxsIGFzIHdhcm5pbmdzLCBjYXV0aW9ucywgcGl0ZmFsbHMsIGRhbmdlcnMuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlNlY3Rpb24iIGVTdXBlclR5cGVzPSIjLy9WYXJpYWJpbGl0eUVsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgU2VjdGlvbiBpcyBhIHNwZWNpYWwgTWV0aG9kIEVsZW1lbnQgdGhhdCByZXByZXNlbnRzIHN0cnVjdHVyYWwgc3Vic2VjdGlvbnMgb2YgYSBDb250ZW50IERlc2NyaXB0aW9uJ3Mgc2VjdGlvbkRlc2NyaXB0aW9uIGF0dHJpYnV0ZS4gIEl0IGlzIHVzZWQgZm9yIGVpdGhlciBsYXJnZSBzY2FsZSBkb2N1bWVudGF0aW9uIG9mIENvbnRlbnQgRWxlbWVudHMgb3JnYW5pemVkIGludG8gc2VjdGlvbnMgYXMgd2VsbCBhcyB0byBmbGV4aWJseSBhZGQgbmV3IFNlY3Rpb25zIHRvIENvbnRlbnQgRWxlbWVudHMgdXNpbmcgY29udHJpYnV0aW9uIHZhcmlhYmlsaXR5IGFkZGVkIHRvIHRoZSBTZWN0aW9uIGNvbmNlcHQgZm9yIE1ldGhvZCBQbHVnLWlucy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic2VjdGlvbk5hbWUiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkV2ZXJ5IFNlY3Rpb24gaGFzIGEgbmFtZSB1c2VkIGZvciBleHRlcm5hbCBwcmVzZW50YXRpb24gb2YgdGhlIHNlY3Rpb24sIGUuZy4gd2hlbiBwdWJsaXNoZWQgb3Igd2hlbiBzZWN0aW9uIGhlYWRpbmcgYXJlIGxpc3RlZCBpbiBhIHRhYmxlIG9mIGNvbnRlbnRzLiAgVGhpcyBhdHRyaWJ1dGUgaXMgc2ltaWxhciB0byBQcmVzZW50YXRpb24gTmFtZSBmb3IgQ29udGVudCBFbGVtZW50cy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic2VjdGlvbkRlc2NyaXB0aW9uIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGlzIGF0dHJpYnV0ZXMgc3RvcmUgdGhlIGRlc2NyaXB0aW9uIHRleHQgZm9yIGEgQ29udGVudCBEZXNjcmlwdGlvbidzIFNlY3Rpb24uIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InN1YlNlY3Rpb25zIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9TZWN0aW9uIiBjb250YWlubWVudD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJwcmVkZWNlc3NvciIgZVR5cGU9IiMvL1NlY3Rpb24iLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUm9sZSIgZVN1cGVyVHlwZXM9IiMvL0NvbnRlbnRFbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIFJvbGUgaXMgYSBjb250ZW50IGVsZW1lbnQgdGhhdCBkZWZpbmVzIGEgc2V0IG9mIHJlbGF0ZWQgc2tpbGxzLCBjb21wZXRlbmNpZXMsIGFuZCByZXNwb25zaWJpbGl0aWVzLiAgUm9sZXMgYXJlIHVzZWQgYnkgVGFza3MgdG8gZGVmaW5lIHdobyBwZXJmb3JtcyB0aGVtIGFzIHdlbGwgYXMgZGVmaW5lIGEgc2V0IG9mIHdvcmsgcHJvZHVjdHMgdGhleSBhcmUgcmVzcG9uc2libGUgZm9yLiAgJiN4RDsmI3hBO0EgUm9sZSBkZWZpbmVzIGEgc2V0IG9mIHJlbGF0ZWQgc2tpbGxzLCBjb21wZXRlbmNpZXMsIGFuZCByZXNwb25zaWJpbGl0aWVzIG9mIGFuIGluZGl2aWR1YWwgb3IgYSBzZXQgb2YgaW5kaXZpZHVhbHMuICBSb2xlcyBhcmUgbm90IGluZGl2aWR1YWxzIG9yIHJlc291cmNlcy4gIEluZGl2aWR1YWwgbWVtYmVycyBvZiB0aGUgZGV2ZWxvcG1lbnQgb3JnYW5pemF0aW9uIHdpbGwgd2VhciBkaWZmZXJlbnQgaGF0cywgb3IgcGVyZm9ybSBkaWZmZXJlbnQgcm9sZXMuIFRoZSBtYXBwaW5nIGZyb20gaW5kaXZpZHVhbCB0byByb2xlLCBwZXJmb3JtZWQgYnkgdGhlIHByb2plY3QgbWFuYWdlciB3aGVuIHBsYW5uaW5nIGFuZCBzdGFmZmluZyBmb3IgYSBwcm9qZWN0LCBhbGxvd3MgZGlmZmVyZW50IGluZGl2aWR1YWxzIHRvIGFjdCBhcyBzZXZlcmFsIGRpZmZlcmVudCByb2xlcywgYW5kIGZvciBhIHJvbGUgdG8gYmUgcGxheWVkIGJ5IHNldmVyYWwgaW5kaXZpZHVhbHMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im1vZGlmaWVzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Xb3JrUHJvZHVjdCIgY2hhbmdlYWJsZT0iZmFsc2UiIHZvbGF0aWxlPSJ0cnVlIgotICAgICAgICB0cmFuc2llbnQ9InRydWUiIGRlcml2ZWQ9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icmVzcG9uc2libGVGb3IiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1dvcmtQcm9kdWN0Ii8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IldvcmtQcm9kdWN0IiBhYnN0cmFjdD0idHJ1ZSIgZVN1cGVyVHlwZXM9IiMvL0NvbnRlbnRFbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXb3JrIFByb2R1Y3QgaXMgYW4gYWJzdHJhY3QgY2xhc3Mgd2hpY2ggcHJvdmlkZXMgYSBnZW5lcmFsaXphdGlvbiBmb3IgdGhlIGNvbnRlbnQgZWxlbWVudCB0eXBlcyBBcnRpZmFjdCwgT3V0Y29tZSwgYW5kIERlbGl2ZXJhYmxlLiAgVGhlIG1ldGEtbW9kZWwgY2xhc3MgV29yayBQcm9kdWN0IGFjdHVhbGx5IHJlcHJlc2VudHMgd29yayBwcm9kdWN0IHR5cGVzLCBpLmUuIGFuIGluc3RhbmNlIG9mIFdvcmsgUHJvZHVjdCBpcyBhIGRlc2NyaXB0aW9uIG9mIGEgc3BlY2lmaWMgdHlwZSBvZiB3b3JrIHByb2R1Y3QgYW5kIG5vdCBhbiBpbmRpdmlkdWFsIHdvcmsgcHJvZHVjdCBpbnN0YW5jZS4gIEhvd2V2ZXIsIGZvciBzaW1wbGljaXR5IHJlYXNvbnMgYW5kIGJlY2F1c2Ugb2YgbG93IHJpc2sgb2YgbWlzaW50ZXJwcmV0YXRpb24gd2UgZGlkIG5vdCBhcHBlbmQgdGhlIHdvcmQgJ3R5cGUnIHRvIGV2ZXJ5IG1ldGEtY2xhc3MuJiN4RDsmI3hBO0Egd29yayBwcm9kdWN0IGlzIGFuIGFic3RyYWN0aW9uIGZvciBkZXNjcmlwdGlvbnMgb2YgY29udGVudCBlbGVtZW50cyB0aGF0IGFyZSB1c2VkIHRvIGRlZmluZSBhbnl0aGluZyB1c2VkLCBwcm9kdWNlZCwgb3IgbW9kaWZpZWQgYnkgYSB0YXNrLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJlc3RpbWF0ZSIgZVR5cGU9IiMvL0VzdGltYXRlIgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJyZXBvcnRzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9SZXBvcnQiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0idGVtcGxhdGVzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9UZW1wbGF0ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ0b29sTWVudG9ycyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vVG9vbE1lbnRvciIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJUYXNrIiBlU3VwZXJUeXBlcz0iIy8vQ29udGVudEVsZW1lbnQgIy8vV29ya0RlZmluaXRpb24iPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgVGFzayBpcyBhIGNvbnRlbnQgZWxlbWVudCB0aGF0IGRlc2NyaWJlcyB3b3JrIGJlaW5nIHBlcmZvcm1lZCBieSBSb2xlcy4gIEl0IGRlZmluZXMgb25lIGRlZmF1bHQgcGVyZm9ybWluZyBSb2xlIGFzIHdlbGwgYXMgbWFueSBhZGRpdGlvbmFsIHBlcmZvcm1lcnMuICBBIFRhc2sgaXMgYXNzb2NpYXRlZCB0byBpbnB1dCBhbmQgb3V0cHV0IHdvcmsgcHJvZHVjdHMuICBJbnB1dHMgYXJlIGRpZmZlcmVudGlhdGVkIGluIG1hbmRhdG9yeSB2ZXJzdXMgb3B0aW9uYWwgaW5wdXRzLiAgVGhlIGFzc29jaWF0aW9ucyB0byBXb3JrIFByb2R1Y3RzIGFyZSBub3QgaW5zdGFudGlhdGFibGUvdmFyaWFibGUtbGlrZSBwYXJhbWV0ZXJzLiAgVGhleSByYXRoZXIgZXhwcmVzcyAoaHlwZXItKWxpbmtzIHRvIHRoZSBkZXNjcmlwdGlvbnMgb2YgdGhlIHdvcmsgcHJvZHVjdHMgdHlwZXMgdGhhdCBhcmUgcmVsYXRlZCB0byB0aGUgVGFzayBhcyBpbnB1dHMgYW5kIG91dHB1dHMuICBJbiBvdGhlciB3b3JkcywgdGhlc2UgYXNzb2NpYXRpb25zIGFyZSBub3QgaW50ZW5kZWQgdG8gYmUgdXNlZCB0byBjYXB0dXJlIHdoaWNoIGNvbmNyZXRlIGluc3RhbmNlcyB3aWxsIGJlIHBhc3NlZCB3aGVuIGluc3RhbnRpYXRpbmcgdGhlIG1ldGhvZCBpbiBhIHByb2plY3QuICBBbGwgb2YgdGhlIFRhc2sncyBkZWZhdWx0IGFzc29jaWF0aW9ucyBjYW4gYmUgb3ZlcnJpZGRlbiBpbiBhbiBhY3R1YWwgcHJvY2VzcyBkZWZpbml0aW9uLiYjeEQ7JiN4QTtBIFRhc2sgZGVzY3JpYmVzIGFuIGFzc2lnbmFibGUgdW5pdCBvZiB3b3JrLiAgRXZlcnkgVGFzayBpcyBhc3NpZ25lZCB0byBzcGVjaWZpYyBSb2xlcy4gIFRoZSBncmFudWxhcml0eSBvZiBhIFRhc2sgaXMgZ2VuZXJhbGx5IGEgZmV3IGhvdXJzIHRvIGEgZmV3IGRheXMuICBJdCB1c3VhbGx5IGFmZmVjdHMgb25lIG9yIG9ubHkgYSBzbWFsbCBudW1iZXIgb2Ygd29yayBwcm9kdWN0cy4gQSBUYXNrIGlzIHVzZWQgYXMgYW4gZWxlbWVudCBvZiBkZWZpbmluZyBhIHByb2Nlc3MuIFRhc2tzIGFyZSBmdXJ0aGVyIHVzZWQgZm9yIHBsYW5uaW5nIGFuZCB0cmFja2luZyBwcm9ncmVzczsgdGhlcmVmb3JlLCBpZiB0aGV5IGFyZSBkZWZpbmVkIHRvbyBmaW5lLWdyYWluZWQsIHRoZXkgd2lsbCBiZSBuZWdsZWN0ZWQsIGFuZCBpZiB0aGV5IGFyZSB0b28gbGFyZ2UsIHByb2dyZXNzIHdvdWxkIGhhdmUgdG8gYmUgZXhwcmVzc2VkIGluIHRlcm1zIG9mIGEgVGFzaydzIHBhcnRzIChlLmcuIFN0ZXBzLCB3aGljaCBpcyBub3QgcmVjb21tZW5kZWQpLiAmI3hEOyYjeEE7QSBUYXNrIGhhcyBhIGNsZWFyIHB1cnBvc2UgaW4gd2hpY2ggdGhlIHBlcmZvcm1pbmcgcm9sZXMgYWNoaWV2ZSBhIHdlbGwgZGVmaW5lZCBnb2FsLiAgSXQgcHJvdmlkZXMgY29tcGxldGUgc3RlcC1ieS1zdGVwIGV4cGxhbmF0aW9ucyBvZiBkb2luZyBhbGwgdGhlIHdvcmsgdGhhdCBuZWVkcyB0byBiZSBkb25lIHRvIGFjaGlldmUgdGhpcyBnb2FsLiAgVGhpcyBkZXNjcmlwdGlvbiBpcyBjb21wbGV0ZSwgaW5kZXBlbmRlbnQgb2Ygd2hlbiBpbiBhIHByb2Nlc3MgbGlmZWN5Y2xlIHRoZSB3b3JrIHdvdWxkIGFjdHVhbGx5IGJlIGRvbmUuICBJdCB0aGVyZWZvcmUgZG9lcyBub3QgZGVzY3JpYmUgd2hlbiB5b3UgZG8gd2hhdCB3b3JrIGF0IHdoYXQgcG9pbnQgb2YgdGltZSwgYnV0IGRlc2NyaWJlcyBhbGwgdGhlIHdvcmsgdGhhdCBnZXRzIGRvbmUgdGhyb3VnaG91dCB0aGUgZGV2ZWxvcG1lbnQgbGlmZWN5Y2xlIHRoYXQgY29udHJpYnV0ZXMgdG8gdGhlIGFjaGlldmVtZW50IG9mIHRoaXMgZ29hbC4gIFdoZW4gdGhlIFRhc2sgaXMgYmVpbmcgYXBwbGllZCBpbiBhIHByb2Nlc3MgdGhlbiB0aGlzIHByb2Nlc3MgYXBwbGljYXRpb24gKGRlZmluZWQgYXMgVGFzayBEZXNjcmlwdG9yKSBwcm92aWRlcyB0aGUgaW5mb3JtYXRpb24gb2Ygd2hpY2ggcGllY2VzIG9mIHRoZSBUYXNrIHdpbGwgYWN0dWFsbHkgYmUgcGVyZm9ybWVkIGF0IGFueSBwYXJ0aWN1bGFyIHBvaW50IGluIHRpbWUuIFRoaXMgYXNzdW1lcyB0aGF0IHRoZSBUYXNrIHdpbGwgYmUgcGVyZm9ybWVkIGluIHRoZSBwcm9jZXNzIG92ZXIgYW5kIG92ZXIgYWdhaW4sIGJ1dCBlYWNoIHRpbWUgd2l0aCBhIHNsaWdodGx5IGRpZmZlcmVudCBlbXBoYXNpcyBvbiBkaWZmZXJlbnQgc3RlcHMgb3IgYXNwZWN0cyBvZiB0aGUgdGFzayBkZXNjcmlwdGlvbi4gJiN4RDsmI3hBO0ZvciBleGFtcGxlLCBhIFRhc2sgc3VjaCBhcyAmcXVvdDtEZXZlbG9wIFVzZSBDYXNlIE1vZGVsJnF1b3Q7IGRlc2NyaWJlcyBhbGwgdGhlIHdvcmsgdGhhdCBuZWVkcyB0byBiZSBkb25lIHRvIGRldmVsb3AgYSBjb21wbGV0ZSB1c2UgY2FzZSBtb2RlbC4gVGhpcyB3b3VsZCBjb21wcmlzZSBvZiB0aGUgaWRlbnRpZmljYXRpb24gYW5kIG5hbWluZyBvZiB1c2UgY2FzZXMgYW5kIGFjdG9ycywgdGhlIHdyaXRpbmcgb2YgYSBicmllZiBkZXNjcmlwdGlvbiwgdGhlIG1vZGVsaW5nIG9mIHVzZSBjYXNlcyBhbmQgdGhlaXIgcmVsYXRpb25zaGlwcyBpbiBkaWFncmFtcywgdGhlIGRldGFpbGVkIGRlc2NyaXB0aW9uIG9mIGEgYmFzaWMgZmxvdywgdGhlIGRldGFpbGVkIGRlc2NyaXB0aW9uIG9mIGFsdGVybmF0aXZlcyBmbG93cywgcGVyZm9ybWluZyBvZiB3YWxrdGhyb3VnaHMgd29ya3Nob3BzIGFuZCByZXZpZXdzLCBldGMuICBBbGwgb2YgdGhlc2UgcGFydHMgY29udHJpYnV0ZSB0byB0aGUgZGV2ZWxvcG1lbnQgZ29hbCBvZiBkZXZlbG9waW5nIHRoZSB1c2UgY2FzZSBtb2RlbCwgYnV0IHRoZSBwYXJ0cyB3aWxsIGJlIHBlcmZvcm1lZCBhdCBkaWZmZXJlbnQgcG9pbnRzIGluIHRpbWUgaW4gYSBwcm9jZXNzLiAgSWRlbnRpZmljYXRpb24sIG5hbWluZywgYW5kIGJyaWVmIGRlc2NyaXB0aW9ucyB3b3VsZCBiZSBwZXJmb3JtZWQgZWFybHkgaW4gYSB0eXBpY2FsIGRldmVsb3BtZW50IHByb2Nlc3MgdmVyc3VzIHRoZSB3cml0aW5nIG9mIGRldGFpbGVkIGFsdGVybmF0aXZlIGZsb3dzIHdoaWNoIHdvdWxkIGJlIHBlcmZvcm1lZCBtdWNoIGxhdGVyLiAgQWxsIHRoZXNlIHBhcnRzIG9yIHN0ZXBzIHdpdGhpbiB0aGUgc2FtZSBUYXNrIGRlZmluZSB0aGUgJnF1b3Q7bWV0aG9kJnF1b3Q7IG9mIERldmVsb3BpbmcgYSBVc2UgQ2FzZSBNb2RlbC4gIEFwcGx5aW5nIHN1Y2ggYSBtZXRob2QgaW4gYSBsaWZlY3ljbGUgKGkuZS4gaW4gYSBwcm9jZXNzKSBpcyBkZWZpbmluZyB3aGljaCBzdGVwcyBhcmUgZG9uZSB3aGVuIGdvaW5nIGZyb20gb25lIGl0ZXJhdGlvbiB0byB0aGUgbmV4dC4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icGVyZm9ybWVkQnkiIGVUeXBlPSIjLy9Sb2xlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im1hbmRhdG9yeUlucHV0IiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Xb3JrUHJvZHVjdCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJvdXRwdXQiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1dvcmtQcm9kdWN0Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5IgotICAgICAgICBvcmRlcmVkPSJmYWxzZSIgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Sb2xlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im9wdGlvbmFsSW5wdXQiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1dvcmtQcm9kdWN0Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InN0ZXBzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9TdGVwIiBjaGFuZ2VhYmxlPSJmYWxzZSIgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIKLSAgICAgICAgZGVyaXZlZD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ0b29sTWVudG9ycyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vVG9vbE1lbnRvciIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJlc3RpbWF0ZSIgZVR5cGU9IiMvL0VzdGltYXRlIgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJXb3JrRGVmaW5pdGlvbiIgYWJzdHJhY3Q9InRydWUiIGVTdXBlclR5cGVzPSIjLy9NZXRob2RFbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXb3JrIERlZmluaXRpb24gaXMgYW4gYWJzdHJhY3QgTWV0aG9kIEVsZW1lbnQgdGhhdCBnZW5lcmFsaXplcyBhbGwgZGVzY3JpcHRpb25zIG9mIHdvcmsgd2l0aGluIHRoZSBVbmlmaWVkIE1ldGhvZCBBcmNoaXRlY3R1cmUuICBUaGlzIHBhY2thZ2UgaW50cm9kdWNlcyB0d28gY29uY3JldGUgdHlwZXMgb2YgV29yayBEZWZpbml0aW9uczogVGFzayBhbmQgU3RlcC4gIFdvcmsgRGVmaW5pdGlvbnMgY2FuIGNvbnRhaW4gc2V0cyBvZiBwcmUtIGFuZCBwb3N0LWNvbmRpdGlvbnMgZGVmaW5pbmcgY29uc3RyYWludHMgdGhhdCBuZWVkIHRvIGJlIHZhbGlkIGJlZm9yZSB0aGUgZGVzY3JpYmVkIHdvcmsgY2FuIGJlZ2luIG9yIGJlZm9yZSBpdCBjYW4gYmUgZGVjbGFyZWQgYXMgZmluaXNoZWQuICBOb3RlIHRoYXQgZ2VuZXJhbCBvd25lZFJ1bGVzIGNhbiBiZSB1c2VkIHRvIGRlZmluZSBhZGRpdGlvbmFsIGNvbnN0cmFpbnRzIGFuZCBydWxlcyBmb3IgV29yayBEZWZpbml0aW9ucy4mI3hEOyYjeEE7V29yayBEZWZpbml0aW9ucyByZXByZXNlbnQgYmVoYXZpb3JhbCBkZXNjcmlwdGlvbnMgZm9yIGRvaW5nIHdvcmsuICBUaGVzZSBiZWhhdmlvcmFsIGRlc2NyaXB0aW9ucyBhcmUgbm90IGJvdW5kIHRvIG9uZSBzcGVjaWZpYyBjbGFzc2lmaWVyLCBidXQgcmVwcmVzZW50IGFuIGFyYml0cmFyeSBkZWZpbml0aW9uIG9mIHdvcmsuICBGb3IgZXhhbXBsZSwgYSBXb3JrIERlZmluaXRpb24gY291bGQgcmVwcmVzZW50IHdvcmsgdGhhdCBpcyBiZWluZyBwZXJmb3JtZWQgYnkgYSBzcGVjaWZpYyBSb2xlIChlLmcuIGEgUm9sZSBwZXJmb3JtaW5nIGEgc3BlY2lmaWMgVGFzayBvciBTdGVwcyBvZiBhIFRhc2spLCBieSBtYW55IFJvbGVzIHdvcmtpbmcgaW4gY2xvc2UgY29sbGFib3JhdGlvbiAobWFueSBSb2xlcyBhbGwgd29ya2luZyB0b2dldGhlciBvbiB0aGUgc2FtZSBpbnRlcmRpc2NpcGxpbmFyeSBUYXNrKSwgb3IgY29tcGxleCB3b3JrIHRoYXQgaXMgcGVyZm9ybWVkIHRocm91Z2hvdXQgdGhlIGxpZmVjeWNsZSAoZS5nLiBhIHByb2Nlc3MgZGVmaW5pbmcgYSBicmVha2Rvd24gc3RydWN0dXJlIGZvciBvcmdhbml6aW5nIGxhcmdlciBjb21wb3NpdGUgdW5pdHMgb2Ygd29yayBwZXJmb3JtZWQgYnkgbWFueSBSb2xlcyB3b3JraW5nIGluIGNvbGxhYm9yYXRpb24pLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJwcmVjb25kaXRpb24iIGVUeXBlPSIjLy9Db25zdHJhaW50IgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJwb3N0Y29uZGl0aW9uIiBlVHlwZT0iIy8vQ29uc3RyYWludCIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iU3RlcCIgZVN1cGVyVHlwZXM9IiMvL1NlY3Rpb24gIy8vV29ya0RlZmluaXRpb24iPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgU3RlcCBpcyBhIFNlY3Rpb24gYW5kIFdvcmsgRGVmaW5pdGlvbiB0aGF0IGlzIHVzZWQgdG8gb3JnYW5pemUgVGFza3MgaW50byBwYXJ0cyBvciBzdWJ1bml0cyBvZiB3b3JrLiAgU3RlcHMgaW5oZXJpdCB0aGUgc3ViU2VjdGlvbnMgZGVjb21wb3NpdGlvbiBmcm9tIFNlY3Rpb24gYW5kIGNhbiB0aGVyZWZvcmUgZGVzY3JpYmUgU3ViLVN0ZXBzIG5lc3RlZCBpbnRvIFN0ZXBzLiYjeEQ7JiN4QTtBIFN0ZXAgZGVzY3JpYmVzIGEgbWVhbmluZ2Z1bCBhbmQgY29uc2lzdCBwYXJ0IG9mIHRoZSBvdmVyYWxsIHdvcmsgZGVzY3JpYmVkIGZvciBhIFRhc2suICBUaGUgY29sbGVjdGlvbiBvZiBTdGVwcyBkZWZpbmVkIGZvciBhIFRhc2sgcmVwcmVzZW50cyBhbGwgdGhlIHdvcmsgdGhhdCBzaG91bGQgYmUgZG9uZSB0byBhY2hpZXZlIHRoZSBvdmVyYWxsIGRldmVsb3BtZW50IGdvYWwgb2YgdGhlIFRhc2suICBOb3QgYWxsIHN0ZXBzIGFyZSBuZWNlc3NhcmlseSBwZXJmb3JtZWQgZWFjaCB0aW1lIGEgVGFzayBpcyBpbnZva2VkIGluIGEgUHJvY2VzcyAoc2VlIFRhc2sgRGVzY3JpcHRvciksIHNvIHRoZXkgY2FuIGFsc28gYmUgZXhwcmVzc2VkIGluIHRoZSBmb3JtIG9mIGFsdGVybmF0ZSAnZmxvd3MnIG9mIHdvcmsuICBEaWZmZXJlbnQgd2F5cyBvZiBhY2hpZXZpbmcgdGhlIHNhbWUgZGV2ZWxvcG1lbnQgZ29hbCBjYW4gdGhlbiBiZSAnYXNzZW1ibGVkJyBieSBzZWxlY3RpbmcgZGlmZmVyZW50IGNvbWJpbmF0aW9ucyBvZiBzdGVwcyB3aGVuIGFwcGx5aW5nIHRoZSBUYXNrIGluIGEgUHJvY2Vzcy4gIFR5cGljYWwga2luZHMgb2Ygc3RlcHMgYSBUYXNrIGF1dGhvciBzaG91bGQgY29uc2lkZXIgYXJlOiBUaGlua2luZyBzdGVwczogd2hlcmUgdGhlIGluZGl2aWR1YWwgcm9sZXMgdW5kZXJzdGFuZCB0aGUgbmF0dXJlIG9mIHRoZSB0YXNrLCBnYXRoZXJzIGFuZCBleGFtaW5lcyB0aGUgaW5wdXQgYXJ0aWZhY3RzLCBhbmQgZm9ybXVsYXRlcyB0aGUgb3V0Y29tZS4gUGVyZm9ybWluZyBzdGVwczogd2hlcmUgdGhlIGluZGl2aWR1YWwgcm9sZXMgY3JlYXRlIG9yIHVwZGF0ZSBzb21lIGFydGlmYWN0cy4gUmV2aWV3aW5nIHN0ZXBzOiB3aGVyZSB0aGUgaW5kaXZpZHVhbCByb2xlcyBpbnNwZWN0cyB0aGUgcmVzdWx0cyBhZ2FpbnN0IHNvbWUgY3JpdGVyaWEuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ikd1aWRhbmNlIiBhYnN0cmFjdD0idHJ1ZSIgZVN1cGVyVHlwZXM9IiMvL0NvbnRlbnRFbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJHdWlkYW5jZSBpcyBhbiBhYnN0cmFjdCBnZW5lcmFsaXphdGlvbiBvZiBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlbGF0ZWQgdG8gY29udGVudCBlbGVtZW50cyBzdWNoIGFzIFJvbGVzLCBUYXNrcywgYW5kIFdvcmsgUHJvZHVjdHMuICBFeGFtcGxlcyBmb3IgR3VpZGFuY2UgYXJlIEd1aWRlbGluZXMsIFRlbXBsYXRlcywgQ2hlY2tsaXN0cywgVG9vbCBNZW50b3JzLCBFc3RpbWF0ZXMsIFN1cHBvcnRpbmcgTWF0ZXJpYWxzLCBSZXBvcnRzLCBDb25jZXB0cywgZXRjLiAgVGhpcyBwYWNrYWdlIG9ubHkgY29udGFpbnMgdGhlIGRlZmluaXRpb24gb2YgdGhlIGFic3RyYWN0IEd1aWRhbmNlIGNsYXNzLiAgVGhlIHBhY2thZ2UgR3VpZGFuY2UgVHlwZXMgZGVmaW5lcyBjb25jcmV0ZSBndWlkYW5jZSB0eXBlcy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQXJ0aWZhY3QiIGVTdXBlclR5cGVzPSIjLy9Xb3JrUHJvZHVjdCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQXJ0aWZhY3QgaXMgYSBXb3JrIFByb2R1Y3QgdGhhdCBwcm92aWRlcyBhIGRlc2NyaXB0aW9uIGFuZCBkZWZpbml0aW9uIGZvciB0YW5naWJsZSB3b3JrIHByb2R1Y3QgdHlwZXMuIEFydGlmYWN0cyBtYXkgYmUgY29tcG9zZWQgb2Ygb3RoZXIgYXJ0aWZhY3RzLiBGb3IgZXhhbXBsZSwgYSBtb2RlbCBhcnRpZmFjdCBjYW4gYmUgY29tcG9zZWQgb2YgbW9kZWwgZWxlbWVudHMsIHdoaWNoIGFyZSBhbHNvIGFydGlmYWN0cy4mI3hEOyYjeEE7QXJ0aWZhY3RzIGFyZSB0YW5naWJsZSB3b3JrIHByb2R1Y3RzIGNvbnN1bWVkLCBwcm9kdWNlZCwgb3IgbW9kaWZpZWQgYnkgVGFza3MuICBJdCBtYXkgc2VydmUgYXMgYSBiYXNpcyBmb3IgZGVmaW5pbmcgcmV1c2FibGUgYXNzZXRzLiAgUm9sZXMgdXNlIEFydGlmYWN0cyB0byBwZXJmb3JtIFRhc2tzIGFuZCBwcm9kdWNlIEFydGlmYWN0cyBpbiB0aGUgY291cnNlIG9mIHBlcmZvcm1pbmcgVGFza3MuICBBcnRpZmFjdHMgYXJlIHRoZSByZXNwb25zaWJpbGl0eSBvZiBhIHNpbmdsZSBSb2xlLCBtYWtpbmcgcmVzcG9uc2liaWxpdHkgZWFzeSB0byBpZGVudGlmeSBhbmQgdW5kZXJzdGFuZCwgYW5kIHByb21vdGluZyB0aGUgaWRlYSB0aGF0IGV2ZXJ5IHBpZWNlIG9mIGluZm9ybWF0aW9uIHByb2R1Y2VkIGluIHRoZSBtZXRob2QgcmVxdWlyZXMgdGhlIGFwcHJvcHJpYXRlIHNldCBvZiBza2lsbHMuIEV2ZW4gdGhvdWdoIG9uZSByb2xlIG1pZ2h0ICZxdW90O293biZxdW90OyBhIHNwZWNpZmljIHR5cGUgb2YgQXJ0aWZhY3RzLCBvdGhlciByb2xlcyBjYW4gc3RpbGwgdXNlIHRoZSBBcnRpZmFjdHM7IHBlcmhhcHMgZXZlbiB1cGRhdGUgdGhlbSBpZiB0aGUgUm9sZSBoYXMgYmVlbiBnaXZlbiBwZXJtaXNzaW9uIHRvIGRvIHNvLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJjb250YWluZXJBcnRpZmFjdCIgZVR5cGU9IiMvL0FydGlmYWN0IgotICAgICAgICB0cmFuc2llbnQ9InRydWUiIGVPcHBvc2l0ZT0iIy8vQXJ0aWZhY3QvY29udGFpbmVkQXJ0aWZhY3RzIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImNvbnRhaW5lZEFydGlmYWN0cyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vQXJ0aWZhY3QiIGNvbnRhaW5tZW50PSJ0cnVlIiBlT3Bwb3NpdGU9IiMvL0FydGlmYWN0L2NvbnRhaW5lckFydGlmYWN0Ii8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkRlbGl2ZXJhYmxlIiBlU3VwZXJUeXBlcz0iIy8vV29ya1Byb2R1Y3QiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgZGVsaXZlcmFibGUgaXMgYSBXb3JrIFByb2R1Y3QgdGhhdCBwcm92aWRlcyBhIGRlc2NyaXB0aW9uIGFuZCBkZWZpbml0aW9uIGZvciBwYWNrYWdpbmcgb3RoZXIgV29yayBQcm9kdWN0cywgYW5kIG1heSBiZSBkZWxpdmVyZWQgdG8gYW4gaW50ZXJuYWwgb3IgZXh0ZXJuYWwgcGFydHkuICBUaGVyZWZvcmUsIGEgRGVsaXZlcmFibGUgYWdncmVnYXRlcyBvdGhlciBXb3JrIFByb2R1Y3RzLiBUaGVyZWZvcmUsIGEgRGVsaXZlcmFibGUgYWdncmVnYXRlcyBvdGhlciBXb3JrIFByb2R1Y3RzLiAgQSBEZWxpdmVyYWJsZSBpcyB1c2VkIHRvIHByZS1kZWZpbmUgdHlwaWNhbCBvciByZWNvbW1lbmRlZCBjb250ZW50IGluIHRoZSBmb3JtIG9yIHdvcmsgcHJvZHVjdHMgdGhhdCB3b3VsZCBiZSBwYWNrYWdlZCBmb3IgZGVsaXZlcnkuICBUaGUgYWN0dWFsIHBhY2thZ2luZyBvZiB0aGUgRGVsaXZlcmFibGUgaW4gYW4gYWN0dWFsIHByb2Nlc3Mgb3IgZXZlbiBwcm9qZWN0IGNvdWxkIGJlIGEgbW9kaWZpY2F0aW9uIG9mIHRoaXMgcmVjb21tZW5kYXRpb24uICBEZWxpdmVyYWJsZXMgYXJlIHVzZWQgdG8gcmVwcmVzZW50IGFuIG91dHB1dCBmcm9tIGEgcHJvY2VzcyB0aGF0IGhhcyB2YWx1ZSwgbWF0ZXJpYWwgb3Igb3RoZXJ3aXNlLCB0byBhIGNsaWVudCwgY3VzdG9tZXIgb3Igb3RoZXIgc3Rha2Vob2xkZXIuICIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJkZWxpdmVyZWRXb3JrUHJvZHVjdHMiCi0gICAgICAgIG9yZGVyZWQ9ImZhbHNlIiB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1dvcmtQcm9kdWN0Ii8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ik91dGNvbWUiIGVTdXBlclR5cGVzPSIjLy9Xb3JrUHJvZHVjdCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQW4gb3V0Y29tZSBkZXNjcmliZXMgaW50YW5naWJsZSB3b3JrIHByb2R1Y3RzIHRoYXQgYXJlIGEgcmVzdWx0IG9yIHN0YXRlLiBPdXRjb21lcyBtYXkgYWxzbyBiZSB1c2VkIHRvIGRlc2NyaWJlIHdvcmsgcHJvZHVjdHMgdGhhdCBhcmUgbm90IGZvcm1hbGx5IGRlZmluZWQuICBBIGtleSBkaWZmZXJlbnRpYXRvciBmb3Igb3V0Y29tZXMgYWdhaW5zdCBhcnRpZmFjdHMgaXMgdGhhdCBvdXRjb21lcyBhcmUgbm90IGNhbmRpZGF0ZXMgZm9yIGhhcnZlc3RpbmcgYXMgcmV1c2FibGUgYXNzZXRzLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJNZXRob2RQYWNrYWdlIiBhYnN0cmFjdD0idHJ1ZSIgZVN1cGVyVHlwZXM9IiMvL01ldGhvZEVsZW1lbnQgIy8vUGFja2FnZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBNZXRob2QgUGFja2FnZSBpcyBhbiBhYnN0cmFjdCBjbGFzcyBmb3IgcGFja2FnaW5nIE1ldGhvZCBFbGVtZW50cy4gIEFsbCBNZXRob2QgRWxlbWVudHMgc2hhbGwgYmUgbG9jYXRlZCBpbiBleGFjdGx5IG9uZSBvZiBNZXRob2QgUGFja2FnZSdzIGNvbmNyZXRlIHNwZWNpYWxpemF0aW9ucyAoZS5nLiBDb250ZW50IFBhY2thZ2UpLiAgIE1ldGhvZCBQYWNrYWdlIGRlZmluZXMgY29tbW9uIHByb3BlcnRpZXMgZm9yIGFsbCBvZiBpdHMgc3BlY2lhbGl6YXRpb25zLiBFbGVtZW50cyBhcmUgb3JnYW5pemVkIGluIE1ldGhvZCBQYWNrYWdlcyB0byBzdHJ1Y3R1cmUgbGFyZ2Ugc2NhbGUgb2YgbWV0aG9kIGNvbnRlbnQgYW5kIHByb2Nlc3NlcyBhcyB3ZWxsIGFzIHRvIGRlZmluZSBhIG1lY2hhbmlzbSBmb3IgcmV1c2UuICBNZXRob2QgRWxlbWVudHMgZnJvbSBvbmUgcGFja2FnZSBjYW4gcmV1c2UgZWxlbWVudCBmcm9tIG90aGVyIHBhY2thZ2VzIGJ5IGRlZmluaW5nIGEgcmV1c2VkUGFja2FnZXMgbGluay4gIEZvciBleGFtcGxlLCBhIHdvcmsgcHJvZHVjdCBkZWZpbmVkIGluIG9uZSBwYWNrYWdlIGNhbiBiZSB1c2VkIGFzIGFuIGlucHV0IGZvciBUYXNrcyBkZWZpbmVkIGluIG90aGVyIHBhY2thZ2VzLiAgQnkgcmV1c2luZyBpdCBmcm9tIG9uZSBjb21tb24gcGxhY2UgKGkuZS4gdGhlIHBhY2thZ2UgaW4gd2hpY2ggaXQgaGFzIGJlZW4gZGVmaW5lZCkgZW5zdXJlcyB0aGF0IG5vIHJlZHVuZGFudCBkZWZpbml0aW9ucyBvZiB0aGUgc2FtZSBlbGVtZW50cyBhcmUgcmVxdWlyZWQuICBBbHNvIG1haW50ZW5hbmNlIG9mIG1ldGhvZCBjb250ZW50IGlzIGdyZWF0bHkgaW1wcm92ZWQgYXMgY2hhbmdlcyBjYW4gYmUgcGVyZm9ybWVkIGluIG9ubHkgb25lIHBsYWNlLiAgTm90ZSwgdGhhdCBvdGhlciBwYWNrYWdlcyB3aWxsIGludHJvZHVjZSBtb3JlIHNwZWNpYWxpemF0aW9ucyBvZiBNZXRob2QgUGFja2FnZSwgZS5nLiBQcm9jZXNzIFBhY2thZ2UgYW5kIFByb2Nlc3MgQ29tcG9uZW50LiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJnbG9iYWwiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuT2JqZWN0IgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9Ik1ldGhvZCBQYWNrYWdlcyBjYW4gaGF2ZSBhIGdsb2JhbCBzY29wZS4gIFRoaXMgbWVhbnMgdGhhdCBldmVyeSBlbGVtZW50IG9mIGV2ZXJ5IG90aGVyIE1ldGhvZCBQYWNrYWdlIGNhbiBzZWUgdGhlIGdsb2JhbCBwYWNrYWdlJ3MgY29udGVudHMuICBHbG9iYWwgTWV0aG9kIFBhY2thZ2VzIGFyZSBwcmltYXJpbHkgdXNlZCB0byBzdG9yZSBjb21tb25seSB1c2VkIGNhdGVnb3J5IGRlZmluaXRpb25zIHN1Y2ggYXMgZm9yIERpc2NpcGxpbmVzIG9yIERvbWFpbnMsIHdoaWNoIGFyZSB1c2VkIGJ5IG1hbnkgVGFzayBhbmQgV29yayBQcm9kdWN0cyByZXNwZWN0aXZlbHkuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InJldXNlZFBhY2thZ2VzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9NZXRob2RQYWNrYWdlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InBhcmVudFBhY2thZ2UiIGVUeXBlPSIjLy9NZXRob2RQYWNrYWdlIgotICAgICAgICB0cmFuc2llbnQ9InRydWUiIGVPcHBvc2l0ZT0iIy8vTWV0aG9kUGFja2FnZS9jaGlsZFBhY2thZ2VzIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImNoaWxkUGFja2FnZXMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL01ldGhvZFBhY2thZ2UiIGNvbnRhaW5tZW50PSJ0cnVlIiBlT3Bwb3NpdGU9IiMvL01ldGhvZFBhY2thZ2UvcGFyZW50UGFja2FnZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJDb250ZW50UGFja2FnZSIgZVN1cGVyVHlwZXM9IiMvL01ldGhvZFBhY2thZ2UiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgQ29udGVudCBQYWNrYWdlIGlzIHNwZWNpYWwgTWV0aG9kIFBhY2thZ2UgdGhhdCBjb250YWlucyBDb250ZW50IEVsZW1lbnRzIGFuZCBDb250ZW50IEVsZW1lbnRzLCBvbmx5LiAgRXhhbXBsZXMgZm9yIENvbnRlbnQgRWxlbWVudCBhcmUgQXJ0aWZhY3RzLCBUYXNrcywgUm9sZXMsIGV0Yy4gIEEga2V5IHNlcGFyYXRpb24gb2YgY29uY2VybnMgaW4gVU1BIGlzIHRoZSBkaXN0aW5jdGlvbiBiZXR3ZWVuIE1ldGhvZCBDb250ZW50IGFuZCBQcm9jZXNzLiAgVGhpcyBzZXBhcmF0aW9uIGlzIGVuZm9yY2VkIGJ5IHNwZWNpYWwgcGFja2FnZSB0eXBlcywgd2hpY2ggZG8gbm90IGFsbG93IHRoZSBtaXhpbmcgb2YgbWV0aG9kIGNvbnRlbnQgd2l0aCBwcm9jZXNzZXMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImNvbnRlbnRFbGVtZW50cyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vQ29udGVudEVsZW1lbnQiIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkFydGlmYWN0RGVzY3JpcHRpb24iIGVTdXBlclR5cGVzPSIjLy9Xb3JrUHJvZHVjdERlc2NyaXB0aW9uIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYnJpZWZPdXRsaW5lIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJQcm92aWRlcyBhIGJyaWVmIGRlc2NyaXB0aW9uIG9mIHRoZSBpbmZvcm1hdGlvbiB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGlzIGFydGlmYWN0LiBGb3IgZXhhbXBsZSwgZGlzY3Vzc2VzIHRoZSBjb250ZW50cyBmb3Iga2V5IGNoYXB0ZXJzIG9mIGEgZG9jdW1lbnQgYXJ0aWZhY3Qgb3IgdGhlIGtleSBwYWNrYWdlcyBhbmQgbW9kdWxlcyBvZiBhIG1vZGVsIGFydGlmYWN0LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyZXByZXNlbnRhdGlvbk9wdGlvbnMiCi0gICAgICAgIGVUeXBlPSIjLy9TdHJpbmciIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkRpc2N1c3NlcyBkaWZmZXJlbnQgcG9zc2libGUgYWx0ZXJuYXRpdmUgcmVwcmVzZW50YXRpb25zIGZvciB0aGUgYXJ0aWZhY3QuIEZvciBleGFtcGxlIGEgZGVzaWduIG1vZGVsIGNhbiBiZSByZXByZXNlbnRlZCBhcyBhIFVNTCBtb2RlbCBvciBhbiBpbmZvcm1hbCBibG9jayBkaWFncmFtIG9yIGJ5IHRleHR1YWwgZGVzY3JpcHRpb24gb25seS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iV29ya1Byb2R1Y3REZXNjcmlwdGlvbiIgZVN1cGVyVHlwZXM9IiMvL0NvbnRlbnREZXNjcmlwdGlvbiI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImV4dGVybmFsSWQiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkFuIGV4dGVybmFsIHZpc2libGUgbnVtYmVyIHRoYXQgaXMgdXNlZCB0byByZWZlcmVuY2UgdGhpcyBhcnRpZmFjdC4gVXNlZCBsaWtlIGEgc3lub255bS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icHVycG9zZSIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRGVzY3JpYmVzIHdoeSB0aGUgd29yayBwcm9kdWN0IGlzIHByb2R1Y2VkIGFuZCB0byB3aGF0IHVzZSBpdCB3aWxsIGJlIHB1dC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaW1wYWN0T2ZOb3RIYXZpbmciIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkRlc2NyaWJlcyB0aGUgY29uc2VxdWVuY2VzIG9mIG5vdCBwcm9kdWNpbmcgdGhlIHdvcmsgcHJvZHVjdC4gIFRoaXMgaXMgaW50ZW5kZWQgdG8gYWlkIGluIHRoZSB0YWlsb3JpbmcgdGhlIG1ldGhvZC9wcm9jZXNzIHRvIHRoZSBuZWVkcyBvZiBhIHNwZWNpZmljIHByb2plY3QuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJlYXNvbnNGb3JOb3ROZWVkaW5nIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJEZXNjcmliZXMgdGhlIGNpcmN1bXN0YW5jZXMgaW4gd2hpY2ggaXQgaXMgcmVhc29uYWJsZSBub3QgdG8gcHJvZHVjZSB0aGUgd29yayBwcm9kdWN0LiAgVGhpcyBpcyBpbnRlbmRlZCB0byBhaWQgaW4gdGhlIHRhaWxvcmluZyBvZiB0aGUgbWV0aG9kL3Byb2Nlc3MgdG8gdGhlIG5lZWRzIG9mIGEgc3BlY2lmaWMgcHJvamVjdC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRGVsaXZlcmFibGVEZXNjcmlwdGlvbiIgZVN1cGVyVHlwZXM9IiMvL1dvcmtQcm9kdWN0RGVzY3JpcHRpb24iPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJleHRlcm5hbERlc2NyaXB0aW9uIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZGVzY3JpcHRpb24gb2YgdGhlIERlbGl2ZXJhYmxlIHVzZWQgZm9yIGNsaWVudCBkb2N1bWVudHMgKHByb3Bvc2FsLCBzdGF0ZW1lbnRzIG9mIHdvcmsgb3IgY29udHJhY3R1YWwgYWdyZWVtZW50cykuICBJdCBtaWdodCB1c2UgYSBkaWZmZXJlbnQgbGFuZ3VhZ2UgYW5kIGZvbGxvdyBsZWdhbCBjb25zdHJhaW50cy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icGFja2FnaW5nR3VpZGFuY2UiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlByb3ZpZGVzIGd1aWRhbmNlIG9uIGhvdyB0byBhc3NlbWJsZSB0aGUgZGVsaXZlcmFibGUgZnJvbSBhbGwgaXRzIHJlcXVpcmVkIGlucHV0cy4gIFRoaXMgc2VjdGlvbiBkZXNjcmliZXMgdGhlIG1vc3QgY29tbW9uIGNvbnRlbnQgbWVkaXVtIGFuZCBmb3JtYXQuICBEaXN0cmlidXRpb24gb2YgdGhlIGRlbGl2ZXJhYmxlIGlzIGFkZHJlc3NlZCBpbiB0aGlzIHNlY3Rpb24sIGlmIG5lY2Vzc2FyeS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUm9sZURlc2NyaXB0aW9uIiBlU3VwZXJUeXBlcz0iIy8vQ29udGVudERlc2NyaXB0aW9uIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic2tpbGxzIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJMaXN0cyBvZiBzZXQgb2YgcmVxdWlyZWQgc2tpbGxzIGEgcGVyc29uIG5lZWRzIHRvIHBvc3Nlc3MgdG8gZnVsZmlsbCB0aGF0IFJvbGUuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFzc2lnbm1lbnRBcHByb2FjaGVzIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJQcm92aWRlcyBndWlkYW5jZSBvbiBmb3IgYXNzaWduaW5nIGluZGl2aWR1YWxzIHRvIHRoZSBSb2xlIGluIHRlcm1zIG9mIHdoYXQgb3RoZXIgcm9sZXMgdGhlc2UgaW5kaXZpZHVhbHMgY291bGQgcGVyZm9ybSBhbmQgd2hhdCByZXNwb25zaWJpbGl0eSBkaWZmZXJlbnQgaW5kaXZpZHVhbHMgYXNzaWduZWQgdG8gdGhpcyByb2xlIG1pZ2h0IGhhdmUuICBUaGUgZ3VpZGFuY2UgY2FuIGFsc28gZGVzY3JpYmUgZGlmZmVyZW50IGFzc2lnbm1lbnQgYXBwcm9hY2hlcyBmb3IgZGlmZmVyZW50IHR5cGVzIG9mIHByb2plY3RzLCBlLmcuIGZvciBsYXJnZSB2ZXJzdXMgc21hbGwgdGVhbXMgd2hlcmUgaW5kaXZpZHVhbHMgY291bGQgYmUgYWxsb2NhdGVkIHRvIHJvbGVzIGZ1bGwgdGltZSB2ZXJzdXMgc2hhcmluZyByb2xlcyB3aXRoaW4gdGhlIHRlYW0uIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InN5bm9ueW1zIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJMaXN0cyBzeW5vbnltcywgaS5lLiBvdGhlciBuYW1lcyB0aGUgUm9sZSBtaWdodCBiZSByZWZlcnJlZCBieS4gIFRvb2wgc3VwcG9ydCBmb3IgdGhlIG1ldGEtbW9kZWwgbWlnaHQgc3VwcG9ydCB0aGF0IGEgUm9sZSBuYW1lIGNhbiBiZSBjb25zaXN0ZW50bHkgYmUgcmVwbGFjZWQgd2l0aCBvbmUgb2YgaXRzIHN5bm9ueW1zIHRocm91Z2h0IGEgUHJvY2Vzcy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iVGFza0Rlc2NyaXB0aW9uIiBlU3VwZXJUeXBlcz0iIy8vQ29udGVudERlc2NyaXB0aW9uIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icHVycG9zZSIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iU3VtbWFyaXplcyB0aGUgbWFpbiByZWFzb24gZm9yIHBlcmZvcm1pbmcgdGhpcyBUYXNrIGFuZCB3aGF0IGlzIGludGVuZGVkIHRvIGJlIGFjaGlldmVkLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhbHRlcm5hdGl2ZXMiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkNvbXByaXNlcyBvZiBzdW1tYXJpZXMgZGVzY3JpYmluZyBpbXBvcnRhbnQgZXhjZXB0aW9uYWwgYW5kIG5vbi1zdGFuZGFyZCB3YXlzIG9mIGFjaGlldmluZyB0aGlzIFRhc2sncyBkZXZlbG9wbWVudCBnb2FscyB0aGF0IHdlcmUgbm90IGNvdmVyZWQgYnkgdGhlIFRhc2sncyBTdGVwcy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iR3VpZGFuY2VEZXNjcmlwdGlvbiIgZVN1cGVyVHlwZXM9IiMvL0NvbnRlbnREZXNjcmlwdGlvbiI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImF0dGFjaG1lbnRzIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGlzIGZpZWxkIGlzIHByaW1hcmlseSB1c2VkIGZvciBhdHRhY2htZW50cyBhdWdtZW50aW5nIHRoZSBpbmZvcm1hdGlvbiBwcm92aWRlZCBmb3IgZ3VpZGFuY2UuICBJbiBwYXJ0aWN1bGFyIHRoZSBhdHRyaWJ1dGUgaXMgdXNlZCBmb3IgVGVtcGxhdGVzLCBFeGFtcGxlcywgYW5kIFJldXNhYmxlIEFzc2V0cyB0byBjb250YWluIHRoZSBhY3R1YWwgYXR0YWNobWVudCBkZXNjcmliZWQgaW4gdGhlIG1haW5EZXNjcmlwdGlvbi4gIEl0IGNhbiBhZGRpdGlvbmFsbHkgY29udGFpbiByZXByZXNlbnRhdGlvbnMgb2YgdGhlIGd1aWRhbmNlIGluIGp1c3QgYSB0aGlyZCBwYXJ0eSBmb3JtYXQsIGUuZy4gUERGLCBNUyBXb3JkLCBvciBXb3JkIFBlcmZlY3QuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlByYWN0aWNlRGVzY3JpcHRpb24iIGVTdXBlclR5cGVzPSIjLy9Db250ZW50RGVzY3JpcHRpb24iPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhZGRpdGlvbmFsSW5mbyIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQW55IGFkZGl0aW9uYWwgSW5mb3JtYXRpb24gbm90IGNvdmVyZWQgYnkgdGhlIG90aGVyIGF0dHJpYnV0ZXMuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InByb2JsZW0iIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgZGVzY3JpcHRpb24gb2YgdGhlIHByb2JsZW0gdGhlIFByYWN0aWNlIGFkZHJlc3Nlcy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYmFja2dyb3VuZCIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRWxhYm9yYXRpb24gb24gdGhlIGJhY2tncm91bmQgYW5kIHRoZSBjb250ZXh0IGluIHdoaWNoIHRoZSBwcm9ibGVtIG9jY3VycyBhbmQgd2hlcmUgdGhlIHNvbHV0aW9uIGRlc2NyaWJlZCBieSB0aGlzIFByYWN0aWNlIHdpbGwgZml0IGluLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJnb2FscyIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBzdW1tYXJ5IG9mIHRoZSBvdmVyYWxsIGdvYWxzIHRvIGJlIGFkZHJlc3NlZCBieSB0aGUgUHJhY3RpY2UuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFwcGxpY2F0aW9uIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJEZXNjcmliZXMgaG93IHRoZSBQcmFjdGljZSBpcyBiZWluZyBhcHBsaWVkIG9yIGludHJvZHVjZWQgaW50byB0aGUgY29udGV4dCBkZXNjcmliZWQgaW4gYmFja2dyb3VuZC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibGV2ZWxzT2ZBZG9wdGlvbiIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iT3V0bGluZXMgdGhlIGRpZmZlcmVudCBmb3JtcyBvciB2YXJpYW50cyBpbiB3aGljaCB0aGUgcHJhY3RpY2UgY291bGQgYmUgcmVhbGl6ZWQuIChlLmcuIGZ1bGwgYWRvcHRpb24gdmVydXMgYSBwYXJ0aWFsIGFkb3B0aW9uIG9mIHRoZSBQcmFjdGljZSkiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUG9pbnQiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ4IiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FRG91YmxlT2JqZWN0Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InkiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VEb3VibGVPYmplY3QiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iR3JhcGhFbGVtZW50IiBhYnN0cmFjdD0idHJ1ZSIgZVN1cGVyVHlwZXM9IiMvL0RpYWdyYW1FbGVtZW50Ij4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icG9zaXRpb24iIGVUeXBlPSIjLy9Qb2ludCIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iY29udGFpbmVkIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9EaWFncmFtRWxlbWVudCIgY29udGFpbm1lbnQ9InRydWUiIGVPcHBvc2l0ZT0iIy8vRGlhZ3JhbUVsZW1lbnQvY29udGFpbmVyIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImxpbmsiIG9yZGVyZWQ9ImZhbHNlIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL0RpYWdyYW1MaW5rIiBjb250YWlubWVudD0idHJ1ZSIgZU9wcG9zaXRlPSIjLy9EaWFncmFtTGluay9ncmFwaEVsZW1lbnQiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iYW5jaG9yYWdlIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9HcmFwaENvbm5lY3RvciIgY29udGFpbm1lbnQ9InRydWUiIGVPcHBvc2l0ZT0iIy8vR3JhcGhDb25uZWN0b3IvZ3JhcGhFbGVtZW50Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InNlbWFudGljTW9kZWwiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSIjLy9TZW1hbnRpY01vZGVsQnJpZGdlIiBjb250YWlubWVudD0idHJ1ZSIgZU9wcG9zaXRlPSIjLy9TZW1hbnRpY01vZGVsQnJpZGdlL2dyYXBoRWxlbWVudCIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJEaWFncmFtRWxlbWVudCIgYWJzdHJhY3Q9InRydWUiIGVTdXBlclR5cGVzPSIjLy9NZXRob2RFbGVtZW50Ij4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaXNWaXNpYmxlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbk9iamVjdCIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJjb250YWluZXIiIGVUeXBlPSIjLy9HcmFwaEVsZW1lbnQiCi0gICAgICAgIHRyYW5zaWVudD0idHJ1ZSIgZU9wcG9zaXRlPSIjLy9HcmFwaEVsZW1lbnQvY29udGFpbmVkIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InJlZmVyZW5jZSIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vUmVmZXJlbmNlIiBlT3Bwb3NpdGU9IiMvL1JlZmVyZW5jZS9yZWZlcmVuY2VkIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InByb3BlcnR5IiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Qcm9wZXJ0eSIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRGlhZ3JhbUxpbmsiIGVTdXBlclR5cGVzPSIjLy9EaWFncmFtRWxlbWVudCI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Inpvb20iIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VEb3VibGVPYmplY3QiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0idmlld3BvcnQiIGVUeXBlPSIjLy9Qb2ludCIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZ3JhcGhFbGVtZW50IiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iIy8vR3JhcGhFbGVtZW50IiB0cmFuc2llbnQ9InRydWUiIGVPcHBvc2l0ZT0iIy8vR3JhcGhFbGVtZW50L2xpbmsiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZGlhZ3JhbSIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9IiMvL0RpYWdyYW0iIGVPcHBvc2l0ZT0iIy8vRGlhZ3JhbS9kaWFncmFtTGluayIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJHcmFwaENvbm5lY3RvciIgZVN1cGVyVHlwZXM9IiMvL0dyYXBoRWxlbWVudCI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImdyYXBoRWxlbWVudCIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9IiMvL0dyYXBoRWxlbWVudCIgdHJhbnNpZW50PSJ0cnVlIiBlT3Bwb3NpdGU9IiMvL0dyYXBoRWxlbWVudC9hbmNob3JhZ2UiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZ3JhcGhFZGdlIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9HcmFwaEVkZ2UiIGVPcHBvc2l0ZT0iIy8vR3JhcGhFZGdlL2FuY2hvciIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJTZW1hbnRpY01vZGVsQnJpZGdlIiBhYnN0cmFjdD0idHJ1ZSIKLSAgICAgIGVTdXBlclR5cGVzPSIjLy9EaWFncmFtRWxlbWVudCI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InByZXNlbnRhdGlvbiIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImdyYXBoRWxlbWVudCIgZVR5cGU9IiMvL0dyYXBoRWxlbWVudCIKLSAgICAgICAgdHJhbnNpZW50PSJ0cnVlIiBlT3Bwb3NpdGU9IiMvL0dyYXBoRWxlbWVudC9zZW1hbnRpY01vZGVsIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImRpYWdyYW0iIGVUeXBlPSIjLy9EaWFncmFtIgotICAgICAgICB0cmFuc2llbnQ9InRydWUiIGVPcHBvc2l0ZT0iIy8vRGlhZ3JhbS9uYW1lc3BhY2UiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRGltZW5zaW9uIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0id2lkdGgiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VEb3VibGVPYmplY3QiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaGVpZ2h0IiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FRG91YmxlT2JqZWN0Ii8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlJlZmVyZW5jZSIgZVN1cGVyVHlwZXM9IiMvL0RpYWdyYW1FbGVtZW50Ij4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaXNJbmRpdmlkdWFsUmVwcmVzZW50YXRpb24iCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuT2JqZWN0Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InJlZmVyZW5jZWQiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSIjLy9EaWFncmFtRWxlbWVudCIgZU9wcG9zaXRlPSIjLy9EaWFncmFtRWxlbWVudC9yZWZlcmVuY2UiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUHJvcGVydHkiIGVTdXBlclR5cGVzPSIjLy9EaWFncmFtRWxlbWVudCI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImtleSIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InZhbHVlIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iR3JhcGhFZGdlIiBlU3VwZXJUeXBlcz0iIy8vR3JhcGhFbGVtZW50Ij4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iYW5jaG9yIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgbG93ZXJCb3VuZD0iMiIgdXBwZXJCb3VuZD0iMiIgZVR5cGU9IiMvL0dyYXBoQ29ubmVjdG9yIiBlT3Bwb3NpdGU9IiMvL0dyYXBoQ29ubmVjdG9yL2dyYXBoRWRnZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ3YXlwb2ludHMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICBsb3dlckJvdW5kPSIyIiB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1BvaW50IiBjb250YWlubWVudD0idHJ1ZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJEaWFncmFtIiBlU3VwZXJUeXBlcz0iIy8vR3JhcGhOb2RlIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iem9vbSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRURvdWJsZU9iamVjdCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ2aWV3cG9pbnQiIGVUeXBlPSIjLy9Qb2ludCIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZGlhZ3JhbUxpbmsiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0RpYWdyYW1MaW5rIiBlT3Bwb3NpdGU9IiMvL0RpYWdyYW1MaW5rL2RpYWdyYW0iLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ibmFtZXNwYWNlIiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iIy8vU2VtYW50aWNNb2RlbEJyaWRnZSIgY29udGFpbm1lbnQ9InRydWUiIGVPcHBvc2l0ZT0iIy8vU2VtYW50aWNNb2RlbEJyaWRnZS9kaWFncmFtIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkdyYXBoTm9kZSIgZVN1cGVyVHlwZXM9IiMvL0dyYXBoRWxlbWVudCI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InNpemUiIGVUeXBlPSIjLy9EaW1lbnNpb24iCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlNpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50IiBlU3VwZXJUeXBlcz0iIy8vU2VtYW50aWNNb2RlbEJyaWRnZSI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InR5cGVJbmZvIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iVU1BU2VtYW50aWNNb2RlbEJyaWRnZSIgZVN1cGVyVHlwZXM9IiMvL1NlbWFudGljTW9kZWxCcmlkZ2UiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJlbGVtZW50IiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iIy8vTWV0aG9kRWxlbWVudCIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJDb3JlU2VtYW50aWNNb2RlbEJyaWRnZSIgZVN1cGVyVHlwZXM9IiMvL1NlbWFudGljTW9kZWxCcmlkZ2UiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJlbGVtZW50IiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iIy8vRWxlbWVudCIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJMZWFmRWxlbWVudCIgYWJzdHJhY3Q9InRydWUiIGVTdXBlclR5cGVzPSIjLy9EaWFncmFtRWxlbWVudCIvPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlRleHRFbGVtZW50IiBlU3VwZXJUeXBlcz0iIy8vTGVhZkVsZW1lbnQiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ0ZXh0IiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iSW1hZ2UiIGVTdXBlclR5cGVzPSIjLy9MZWFmRWxlbWVudCI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InVyaSIgZVR5cGU9IiMvL1VyaSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJtaW1lVHlwZSIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkdyYXBoaWNQcmltaXRpdmUiIGFic3RyYWN0PSJ0cnVlIiBlU3VwZXJUeXBlcz0iIy8vTGVhZkVsZW1lbnQiLz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQb2x5bGluZSIgZVN1cGVyVHlwZXM9IiMvL0dyYXBoaWNQcmltaXRpdmUiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjbG9zZWQiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuT2JqZWN0IgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9IndheXBvaW50cyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIGxvd2VyQm91bmQ9IjIiIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vUG9pbnQiIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkVsbGlwc2UiIGVTdXBlclR5cGVzPSIjLy9HcmFwaGljUHJpbWl0aXZlIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmFkaXVzWCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRURvdWJsZU9iamVjdCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyYWRpdXNZIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FRG91YmxlT2JqZWN0Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJvdGF0aW9uIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FRG91YmxlT2JqZWN0Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InN0YXJ0QW5nbGUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VEb3VibGVPYmplY3QiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZW5kQW5nbGUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VEb3VibGVPYmplY3QiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iY2VudGVyIiBlVHlwZT0iIy8vUG9pbnQiCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkFjdGl2aXR5IiBlU3VwZXJUeXBlcz0iIy8vV29ya0JyZWFrZG93bkVsZW1lbnQgIy8vVmFyaWFiaWxpdHlFbGVtZW50ICMvL1dvcmtEZWZpbml0aW9uIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBbiBBY3Rpdml0eSBpcyBhIFdvcmsgQnJlYWtkb3duIEVsZW1lbnQgYW5kIFdvcmsgRGVmaW5pdGlvbiB3aGljaCBzdXBwb3J0cyB0aGUgbmVzdGluZyBhbmQgbG9naWNhbCBncm91cGluZyBvZiByZWxhdGVkIEJyZWFrZG93biBFbGVtZW50cyBmb3JtaW5nIGJyZWFrZG93biBzdHJ1Y3R1cmVzLiAgQWx0aG91Z2ggQWN0aXZpdHkgaXMgYSBjb25jcmV0ZSBtZXRhLWNsYXNzLCBvdGhlciBjbGFzc2VzIHdoaWNoIHJlcHJlc2VudCBicmVha2Rvd24gc3RydWN0dXJlcyBkZXJpdmUgZnJvbSBpdDsgc3VjaCBhcyBQaGFzZSwgSXRlcmF0aW9uLCBEZWxpdmVyeSBQcm9jZXNzLCBvciBDYXBhYmlsaXR5IFBhdHRlcm4uJiN4RDsmI3hBO0FjdGl2aXR5IHJlcHJlc2VudHMgYSBncm91cGluZyBlbGVtZW50IGZvciBvdGhlciBCcmVha2Rvd24gRWxlbWVudHMgc3VjaCBhcyBBY3Rpdml0aWVzLCBEZXNjcmlwdG9ycywgTWlsZXN0b25lcywgZXRjLiAgSXQgaXMgbm90IHBlci1zZSBhICdoaWdoLWxldmVsJyBncm91cGluZyBvZiBvbmx5IHdvcmsgYXMgaW4gb3RoZXIgbWV0YS1tb2RlbHMsIGJ1dCBncm91cHMgYW55IGtpbmQgb2YgQnJlYWtkb3duIEVsZW1lbnRzLiAgRm9yIGV4YW1wbGUsIG9uZSBjYW4gZGVmaW5lIHZhbGlkIEFjdGl2aXRpZXMgdGhhdCBncm91cCBvbmx5IFdvcmsgUHJvZHVjdHMgRGVzY3JpcHRvcnMgd2l0aG91dCBhbnkgbWF0Y2hpbmcgVGFzayBEZXNjcmlwdG9ycy4gIEFjdGl2aXRpZXMgYWxzbyBpbmhlcml0IGFsbCBwcm9wZXJ0aWVzIGZyb20gV29yayBCcmVha2Rvd24gRWxlbWVudCBhbmQgaW5kaXJlY3RseSBmcm9tIFByb2Nlc3MgRWxlbWVudDsgaS5lLiBBY3Rpdml0eSBpcyByZWFkeSB0byBoYXZlIGEgZnVsbCBjb250ZW50IGRlc2NyaXB0aW9uIGF0dGFjaGVkIHRvIGl0LiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJicmVha2Rvd25FbGVtZW50cyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vQnJlYWtkb3duRWxlbWVudCIgZU9wcG9zaXRlPSIjLy9CcmVha2Rvd25FbGVtZW50L3N1cGVyQWN0aXZpdGllcyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJyb2FkbWFwcyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vUm9hZG1hcCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJzdXBwb3J0aW5nTWF0ZXJpYWxzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9TdXBwb3J0aW5nTWF0ZXJpYWwiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iY2hlY2tsaXN0cyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vQ2hlY2tsaXN0Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImNvbmNlcHRzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Db25jZXB0Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImV4YW1wbGVzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9FeGFtcGxlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Imd1aWRlbGluZXMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0d1aWRlbGluZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJyZXVzYWJsZUFzc2V0cyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vUmV1c2FibGVBc3NldCIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJXb3JrQnJlYWtkb3duRWxlbWVudCIgYWJzdHJhY3Q9InRydWUiCi0gICAgICBlU3VwZXJUeXBlcz0iIy8vQnJlYWtkb3duRWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBXb3JrIEJyZWFrZG93biBFbGVtZW50IGlzIGEgc3BlY2lhbCBCcmVha2Rvd24gRWxlbWVudCB0aGF0IHByb3ZpZGVzIHNwZWNpZmljIHByb3BlcnRpZXMgZm9yIEJyZWFrZG93biBFbGVtZW50cyB0aGF0IHJlcHJlc2VudCBvciByZWZlciB0byBXb3JrIERlZmluaXRpb25zLiAgRm9yIGV4YW1wbGUgaXRzIHN1YmNsYXNzIEFjdGl2aXR5IGRlZmluZXMgd29yayBhcyBpdCBpcyBhbHNvIGEgc3ViY2xhc3Mgb2YgV29yayBEZWZpbml0aW9uLiAgSXRzIHN1YmNsYXNzIFRhc2sgRGVzY3JpcHRvciBkb2VzIG5vdCBkZWZpbmUgd29yayBieSBpdHNlbGYsIGJ1dCByZWZlcnMgdG8gYSBXb3JrIERlZmluaXRpb24gYW5kIHRoZXJlZm9yZSBjYW4gaGF2ZSB0aGUgc2FtZSBjb21tb24gcHJvcGVydGllcyBhbmQgV29yayBCcmVha2Rvd24gRWxlbWVudCBoYXMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImlzUmVwZWF0YWJsZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW5PYmplY3QiCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhpcyBhdHRyaWJ1dGUgaXMgdXNlZCB0byBkZWZpbmUgcmVwZXRpdGlvbiBvZiB3b3JrLCBlLmcuIGl0ZXJhdGlvbnMuICBBIFByb2Nlc3MgV29yayBEZWZpbml0aW9uIHdpdGggdGhpcyBhdHRyaWJ1dGUgc2V0IHRvIFRydWUgc2hhbGwgYmUgcmVwZWF0ZWQgbW9yZSB0aGFuIG9uY2Ugb24gdGhlIHNhbWUgc2V0IG9mIGFydGlmYWN0cy4gIEZvciBleGFtcGxlLCBmb3IgYW4gaW5zdGFuY2Ugb2YgSXRlcmF0aW9uIChkZWZpbmVkIGFzIGEgc3BlY2lhbCBQcm9jZXNzIFdvcmsgRGVmaW5pdGlvbiBiZWxvdykgdGhpcyBhdHRyaWJ1dGUgaXMgc2V0IHRvIFRydWUgYnkgZGVmYXVsdCBpbmRpY2F0aW5nIHRoYXQgZXZlcnkgc3ViLUFjdGl2aXR5IHdpbGwgYmUgcmVwZWF0ZWQgbW9yZSB0aGFuIG9uY2UuICBIb3dldmVyLCBhbnkgUHJvY2VzcyBXb3JrIERlZmluaXRpb24gY2FuIHNldCB0aGlzIGF0dHJpYnV0ZSB0byBUcnVlIHRvIGRlZmluZSBpdGVyYXRpb25zIChlLmcuIHRvIGl0ZXJhdGUgb25lIEFjdGl2aXR5IGNvbnNpc3Rpbmcgb2YgbWFueSBzdWItYWN0aXZpdGllcyBvciBldmVuIFBoYXNlcywgYnV0IHRvIGl0ZXJhdGUganVzdCBvbmUgVGFzaykuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImlzT25nb2luZyIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW5PYmplY3QiCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iSWYgdGhlIGlzT25nb2luZyBhdHRyaWJ1dGUgaXMgc2V0IHRvIFRydWUgZm9yIGEgUHJvY2VzcyBXb3JrIERlZmluaXRpb24gaW5zdGFuY2UsIHRoZW4gdGhlIGVsZW1lbnQgZGVzY3JpYmVzIGFuIG9uZ29pbmcgcGllY2Ugb2Ygd29yayB3aXRob3V0IGEgZml4ZWQgZHVyYXRpb24gb3IgZW5kIHN0YXRlLiAgRm9yIGV4YW1wbGUsIHRoZSBQcm9jZXNzIFdvcmsgRGVmaW5pdGlvbiBjb3VsZCByZXByZXNlbnQgd29yayBvZiBhbiBhZG1pbmlzdHJhdG9yIGNvbnRpbnVvdXNseSAoZS5nLiAzaCBhIGRheSkgd29ya2luZyB0byBlbnN1cmUgdGhhdCBzeXN0ZW1zIGFyZSBrZXB0IGluIGEgY2VydGFpbiBzdGF0ZS4gIEFub3RoZXIgZXhhbXBsZSB3b3VsZCBiZSBwcm9ncmFtIG1hbmFnZW1lbnQgd29yayBvdmVyc2VlaW5nIG1hbnkgZGlmZmVyZW50IHByb2plY3RzIGJlaW5nIHNjaGVkdWxlZCBmb3Igb25lIHBhcnRpY3VsYXIgcHJvamVjdCBhdCBzcGVjaWZpYyByZW9jY3VycmluZyBpbnRlcnZhbHMgZHVyaW5nIHRoZSB3aG9sZSBsaWZlY3ljbGUgb2YgdGhlIHByb2plY3QuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImlzRXZlbnREcml2ZW4iIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuT2JqZWN0IgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBpc0V2ZW50RHJpdmVuIGF0dHJpYnV0ZSBpbmRpY2F0ZXMgdGhhdCB0aGUgUHJvY2VzcyBXb3JrIERlZmluaXRpb24gZGVzY3JpYmVzIGFuIGluc3RhbmNlIG9mIHdvcmsgd2hpY2ggaXMgbm90IHN0YXJ0ZWQgYmVjYXVzZSBpdCBoYXMgYmVlbiBzY2hlZHVsZWQgdG8gc3RhcnQgYXQgYSBjZXJ0YWluIHBvaW50IG9mIHRpbWUsIGJlY2F1c2UgcHJlY2VkaW5nIHdvcmsgaXMgYmVpbmcgY29tcGxldGVkLCBvciBpbnB1dCB3b3JrIHByb2R1Y3RzIGFyZSBhdmFpbGFibGUsIGJ1dCBiZWNhdXNlIGFub3RoZXIgc3BlY2lmaWMgZXZlbnQgaGFzIG9jY3VycmVkLiAgRXhhbXBsZXMgZm9yIHN1Y2ggZXZlbnRzIGFyZSBleGNlcHRpb25zIG9yIHByb2JsZW0gc2l0dWF0aW9ucyB3aGljaCByZXF1aXJlIHNwZWNpZmljIHdvcmsgdG8gYmUgcGVyZm9ybWVkIGFzIGEgcmVzdWx0LiAgQWxzbyBjaGFuZ2UgbWFuYWdlbWVudCB3b3JrIGNhbiBiZSBtb2RlbGVkIGFzIGV2ZW50IGRyaXZlbiB3b3JrIGFuYWx5emluZyBhIGNoYW5nZSByZXF1ZXN0IG9yIGRlZmVjdCBhbmQgYWxsb2NhdGluZyB3b3JrIGR5bmFtaWNhbGx5IHRvIHJlc291cmNlcyB0byBkZWFsIHdpdGggaXQgZm9sbG93aW5nIHRoZSB3b3JrIGRlc2NyaWJlZCB3aXRoIHN1Y2ggUHJvY2VzcyBXb3JrIERlZmluaXRpb24uICBUaGUgZXZlbnRzIHRoZW1zZWx2ZXMgYXJlIG5vdCBtb2RlbGVkIGluIHRoaXMgdmVyc2lvbiBvZiB0aGUgc3BlY2lmaWNhdGlvbi4gIFRoZXkgc2hhbGwgYmUgZGVzY3JpYmVkIGFzIHBhcnQgb2YgdGhlIG5vcm1hbCBkZXNjcmlwdGlvbnMgZmllbGRzIGF2YWlsYWJsZS4mI3hEOyYjeEE7JiN4RDsmI3hBOyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJsaW5rVG9QcmVkZWNlc3NvciIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vV29ya09yZGVyIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkJyZWFrZG93bkVsZW1lbnQiIGFic3RyYWN0PSJ0cnVlIiBlU3VwZXJUeXBlcz0iIy8vUHJvY2Vzc0VsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkJyZWFrZG93biBFbGVtZW50IGlzIGFuIGFic3RyYWN0IGdlbmVyYWxpemF0aW9uIGZvciBhbnkgdHlwZSBvZiBNZXRob2QgRWxlbWVudCB0aGF0IGlzIHBhcnQgb2YgYSBicmVha2Rvd24gc3RydWN0dXJlLiAgSXQgZGVmaW5lcyBhIHNldCBvZiBwcm9wZXJ0aWVzIGF2YWlsYWJsZSB0byBhbGwgb2YgaXRzIHNwZWNpYWxpemF0aW9ucy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icHJlZml4IiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJQcmVmaXggcmVwcmVzZW50cyBhbiBhZGRpdGlvbmFsIGxhYmVsIHRoYXQgd2lsbCBiZSBwcmVzZW50ZWQgYXMgYSBwcmVmaXggdG8gYW55IEJyZWFrZG93biBFbGVtZW50IHRvIGluZGljYXRlIGEgdXNlci1kZWZpbmVkIHN1Yi10eXBlIGZvciB0aGUgZWxlbWVudC4gIEZvciBleGFtcGxlLCBpZiB0aGUgcHJvY2VzcyBlbmdpbmVlciB3b3VsZCBsaWtlIHRvIGRpc3Rpbmd1aXNoIGhpcyBBY3Rpdml0aWVzIGJ5ICdNb2R1bGUnIChhcyBkb25lIGluIHRoZSBJQk0gUmF0aW9uYWwgU3VtbWl0IEFzY2VuZGFudCBNZXRob2QpLCBoZSBjYW4gZGVmaW5lIGEgZGlmZmVyZW50IHByZWZpeCBmb3IgZXZlcnkgbW9kZWwgdG8gYmUgdXNlZCBpbiBhZGRpdGlvbiB0byBuYW1pbmcgQWN0aXZpdGllcywgZS5nLiAmcXVvdDtTUkEuRXN0YWJsaXNoIFJlcXVpcmVtZW50cyZxdW90OyB3aXRoIFNSQSBpbmRpY2F0aW5nIHRoYXQgdGhpcyBBY3Rpdml0eSBiZWxvbmdzIHRvIHRoZSAmcXVvdDtTb2Z0d2FyZSBSZXF1aXJlbWVudHMgQW5hbHlzaXMmcXVvdDsgbW9kdWxlLiAgQW5vdGhlciBjb21tb24gYXBwbGljYXRpb24gZm9yIHByZWZpeCBpcyB0byBxdWFsaWZ5IHJvbGVzIGluIFJvbGUgRGVzY3JpcHRvcnMuICBGb3IgZXhhbXBsZSwgJnF1b3Q7Q3VzdG9tZXIuQXJjaGl0ZWN0JnF1b3Q7IHdvdWxkIGRlZmluZSBhICZxdW90O0N1c3RvbWVyJnF1b3Q7IHByZWZpeCBmb3IgdGhlIFJvbGUgRGVzY3JpcHRvciAmcXVvdDtBcmNoaXRlY3QmcXVvdDsgZXhwcmVzc2luZyB0aGF0IHRoaXMgaXMgYW4gYXJjaGl0ZWN0IG9uIHRoZSBjdXN0b21lciBzaWRlIGFuZCBub3QgdGhlIGRldmVsb3BtZW50IHRlYW0gc2lkZS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaXNQbGFubmVkIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbk9iamVjdCIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEga2V5IGFwcGxpY2F0aW9uIGZvciBEZXZlbG9wbWVudCBQcm9jZXNzZXMgZXhwcmVzc2VkIHdpdGggQnJlYWtkb3duIHN0cnVjdHVyZXMgaXMgdG8gZ2VuZXJhdGUgYSBwcm9qZWN0IHBsYW4gZnJvbSBpdC4gIEEgcHJvY2VzcyBhcyBkZWZpbmVkIGluIFVNQSAoY2YuIHdpdGggU2VjdGlvbnMgWFggYW5kIDUuMikgaXMgYSBtdWx0aS1kaW1lbnNpb25hbCBzdHJ1Y3R1cmUgZGVmaW5pbmcgd2hhdCB3b3JrIGlzIGJlaW5nIHBlcmZvcm1lZCBhdCB3aGF0IHRpbWUgYnkgd2hpY2ggcm9sZXMgdXNpbmcgd2hpY2ggaW5wdXQgYW5kIHByb2R1Y2luZyB3aGF0IG91dHB1dHMuICBBIHByb2plY3QgcGxhbiBhcyBpdCBpcyByZXByZXNlbnRlZCBpbiBwcm9qZWN0IHBsYW5uaW5nIHRvb2xzIHN1Y2ggYXMgSUJNIFJhdGlvbmFsIFBvcnRmb2xpbyBNYW5hZ2VyIG9yIE1pY3Jvc29mdCBQcm9qZWN0IG5vcm1hbGx5IGRvZXMgbm90IG5lZWQgYWxsIHRoaXMgaW5mb3JtYXRpb24gYW5kIGlzIG5vcm1hbGx5IGxpbWl0ZWQgdG8ganVzdCByZXByZXNlbnRpbmcgYSBzdWJzZXQuICBGb3IgZXhhbXBsZSwgYSB0eXBpY2FsIE1TIFByb2plY3QgcGxhbiBvbmx5IHJlcHJlc2VudHMgdGhlIHdvcmsgYnJlYWtkb3duIGNvbnNpc3Rpbmcgb2YgVGFza3MgYW5kIEFjdGl2aXRpZXMgKHNvbWV0aW1lcyByZWZlcnJlZCB0byBhcyBzdW1tYXJ5IHRhc2tzKS4gIEl0IGRvZXMgbm90IHNob3cgdGhlIGlucHV0IGFuZCBvdXRwdXQgV29yayBQcm9kdWN0cyBmb3IgYSBUYXNrLCBidXQgaXQgY2FuIHNob3cgd2hpY2ggcm9sZXMgc2hhbGwgYmUgc3RhZmZlZCBmb3IgcGVyZm9ybWluZyB0aGUgVGFzay4gIEhvd2V2ZXIsIHN1Y2ggcm9sZSBhbGxvY2F0aW9uIG5lZWQgdG8gYmUgcmVwbGFjZWQgd2l0aCBjb25jcmV0ZSByZXNvdXJjZXMgd2hlbiBpbnN0YW50aWF0aW5nIHRoZSBwbGFuIGZvciBhIGNvbmNyZXRlIHByb2plY3QuICBTb21ldGltZXMgcHJvamVjdCBwbGFucyBjYW4gdGhlbiBhZ2FpbiBiZSBvcmdhbml6ZWQgZGlmZmVyZW50bHkgYnkgb3JnYW5pemluZyB3b3JrIGJ5IGRlbGl2ZXJhYmxlcyBpbiB3aGljaCBXb3JrIFByb2R1Y3RzIGFyZSBtYXBwZWQgdG8gdGhlIHBsYW4ncyBzdW1tYXJ5IHRhc2tzIGFuZCBUYXNrIHRoYXQgaGF2ZSB0aGVzZSB3b3JrIHByb2R1Y3RzIGFzIG91dHB1dCBtYXBwZWQgYmVsb3cgc3VjaCBhcyBzdW1tYXJ5IHRhc2suICBUaGVyZWZvcmUsIGEgcHJvY2VzcyBjYW4gbWFrZSByZWNvbW1lbmRhdGlvbnMgYWJvdXQgd2hpY2ggZWxlbWVudHMgdG8gaW5jbHVkZSBhbmQgd2hpY2ggdG8gZXhjbHVkZSB3aGVuIGdlbmVyYXRpbmcgYSBwbGFuLiAgV2hlbiB0aGUgaXNQbGFubmVkIGF0dHJpYnV0ZSBpcyBzZXQgdG8gRmFsc2UgZm9yIGFuIGluc3RhbmNlIG9mIGEgQnJlYWtkb3duIEVsZW1lbnQsIHRoZW4gdGhpcyBlbGVtZW50IHNoYWxsIG5vdCBiZSBub3QgaW5jbHVkZWQgd2hlbiBhIGNvbmNyZXRlIHByb2plY3QgcGxhbiBpcyBiZWluZyBnZW5lcmF0ZWQgZnJvbSB0aGUgYnJlYWtkb3duIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zIHRoaXMgZWxlbWVudC4mI3hEOyYjeEE7JiN4RDsmI3hBOyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJoYXNNdWx0aXBsZU9jY3VycmVuY2VzIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbk9iamVjdCIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJKdXN0IGFzIHRoZSBpc1BsYW5uZWQgYXR0cmlidXRlIHRoZSBoYXNNdWx0aXBsZU9jY3VycmVuY2VzIGF0dHJpYnV0ZSBoYXMgYW4gaW1wYWN0IG9uIGdlbmVyYXRpbmcgcGxhbnMgZnJvbSBhIFByb2Nlc3MuICBXaGVuIHRoaXMgYXR0cmlidXRlIGlzIHNldCB0byBUcnVlIGZvciBhIEJyZWFrZG93biBFbGVtZW50IHRoZW4gaXQgd2lsbCB0eXBpY2FsbHkgb2NjdXIgbXVsdGlwbGUgdGltZXMgd2l0aGluIHRoZSBzYW1lIEFjdGl2aXR5LiAgRm9yIGV4YW1wbGUsIGEgVGFzayBzdWNoIGFzICZxdW90O0RldGFpbCBVc2UgQ2FzZSZxdW90OyB3b3VsZCBiZSBwZXJmb3JtZWQgZm9yIGV2ZXJ5IHVzZSBjYXNlIGlkZW50aWZpZWQgZm9yIGEgcGFydGljdWxhciBJdGVyYXRpb24gb3IgQWN0aXZpdHkuICBHZW5lcmF0aW5nIGEgcGxhbiB3b3VsZCBsaXN0IG9uZSBUYXNrIGluc3RhbmNlIHBlciB1c2UgY2FzZS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaXNPcHRpb25hbCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW5PYmplY3QiCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGlzT3B0aW9uYWwgYXR0cmlidXRlIGluZGljYXRlcyB0aGF0IHRoZSBCcmVha2Rvd24gRWxlbWVudCBkZXNjcmliZXMgd29yaywgYSB3b3JrIHJlc3VsdCwgb3IgZXZlbiB3b3JrIHJlc291cmNlcywgd2hpY2ggaW5jbHVzaW9uIGlzIG5vdCBtYW5kYXRvcnkgd2hlbiBwZXJmb3JtaW5nIGEgcHJvamVjdCB0aGF0IGlzIHBsYW5uZWQgYmFzZWQgb24gYSBwcm9jZXNzIGNvbnRhaW5pbmcgdGhpcyBlbGVtZW50LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJwcmVzZW50ZWRBZnRlciIgZVR5cGU9IiMvL0JyZWFrZG93bkVsZW1lbnQiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icHJlc2VudGVkQmVmb3JlIiBlVHlwZT0iIy8vQnJlYWtkb3duRWxlbWVudCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJwbGFubmluZ0RhdGEiIGVUeXBlPSIjLy9QbGFubmluZ0RhdGEiCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InN1cGVyQWN0aXZpdGllcyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vQWN0aXZpdHkiIGVPcHBvc2l0ZT0iIy8vQWN0aXZpdHkvYnJlYWtkb3duRWxlbWVudHMiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iTWlsZXN0b25lIiBlU3VwZXJUeXBlcz0iIy8vV29ya0JyZWFrZG93bkVsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgTWlsZXN0b25lIGRlc2NyaWJlcyBhIHNpZ25pZmljYW50IGV2ZW50IGluIGEgZGV2ZWxvcG1lbnQgcHJvamVjdCwgc3VjaCBhcyBhIG1ham9yIGRlY2lzaW9uLCBjb21wbGV0aW9uIG9mIGEgZGVsaXZlcmFibGUsIG9yIG1lZXRpbmcgb2YgYSBtYWpvciBkZXBlbmRlbmN5IChsaWtlIGNvbXBsZXRpb24gb2YgYSBwcm9qZWN0IHBoYXNlKS4gIEJlY2F1c2UsIE1pbGVzdG9uZSBpcyBjb21tb25seSB1c2VkIHRvIHJlZmVyIHRvIGJvdGggdGhlIGV2ZW50IGl0c2VsZiBhbmQgdGhlIHBvaW50IGluIHRpbWUgYXQgd2hpY2ggdGhlIGV2ZW50IGlzIHNjaGVkdWxlZCB0byBoYXBwZW4sIGl0IGlzIG1vZGVsZWQgYXMgYSBCcmVha2Rvd24gRWxlbWVudCAoaS5lLiBpdCBhcHBlYXJzIGFzIHBhcnQgb2YgYSBicmVha2Rvd24gc3RydWN0dXJlKS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iSXRlcmF0aW9uIiBlU3VwZXJUeXBlcz0iIy8vQWN0aXZpdHkiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9Ikl0ZXJhdGlvbiBpcyBhIHNwZWNpYWwgQWN0aXZpdHksIHdoaWNoIHByZXNjcmliZXMgcHJlLWRlZmluZWQgdmFsdWVzIGZvciBpdHMgaW5zdGFuY2VzIGZvciB0aGUgYXR0cmlidXRlcyBwcmVmaXggKCdJdGVyYXRpb24nKSBhbmQgaXNSZXBlYXRhYmxlICgnVHJ1ZScpLiAgSXQgaGFzIGJlZW4gaW5jbHVkZWQgaW50byB0aGUgbWV0YS1tb2RlbCBmb3IgY29udmVuaWVuY2UgYW5kIHRvIHByb3ZpZGUgYSBzcGVjaWFsIHN0ZXJlb3R5cGUsIGJlY2F1c2UgaXQgcmVwcmVzZW50cyBhIHZlcnkgY29tbW9ubHkgdXNlZCBBY3Rpdml0eSB0eXBlLiYjeEQ7JiN4QTtJdGVyYXRpb24gZ3JvdXBzIGEgc2V0IG9mIG5lc3RlZCBBY3Rpdml0aWVzIHRoYXQgYXJlIHJlcGVhdGVkIG1vcmUgdGhhbiBvbmNlLiAgSXQgcmVwcmVzZW50cyBhbiBpbXBvcnRhbnQgc3RydWN0dXJpbmcgZWxlbWVudCB0byBvcmdhbml6ZSB3b3JrIGluIHJlcGV0aXRpdmUgY3ljbGVzLiAgVGhlIGNvbmNlcHQgb2YgSXRlcmF0aW9uIGNhbiBiZSBhc3NvY2lhdGVkIHdpdGggZGlmZmVyZW50IHJ1bGVzIGluIGRpZmZlcmVudCBtZXRob2RzLiAgRm9yIGV4YW1wbGUsIHRoZSBJQk0gUmF0aW9uYWwgVW5pZmllZCBQcm9jZXNzIG1ldGhvZCBmcmFtZXdvcmsgKFJVUCkgZGVmaW5lcyBhIHJ1bGUgdGhhdCBJdGVyYXRpb25zIGFyZSBub3QgYWxsb3dlZCB0byBzcGFuIGFjcm9zcyBQaGFzZXMuICBJbiBjb250cmFzdCBJQk0gR2xvYmFsIFNlcnZpY2VzIE1ldGhvZCAoR1NNZXRob2QpIGJhc2VkIG1ldGhvZCBmcmFtZXdvcmtzIHRoaXMgcnVsZSBkb2VzIG5vdCBhcHBseSBhbmQgSXRlcmF0aW9uIGNhbiBiZSBkZWZpbmVkIHdoaWNoIG5lc3QgUGhhc2VzLiAgUnVsZXMgbGlrZSB0aGVzZSwgd2hpY2ggcGxheSBhbiBpbXBvcnRhbnQgcm9sZSBmb3IgZWFjaCBpbmRpdmlkdWFsIG1ldGhvZCBhbmQgYXJlIHRoZXJlZm9yZSBub3QgZW5mb3JjZWQgYnkgdGhpcyBtZXRhLW1vZGVsLiAgSW5zdGVhZCwgcHJvY2VzcyBhdXRob3JzIGFyZSBleHBlY3RlZCB0byBmb2xsb3cgYW5kIGNoZWNrIHRoZXNlIHJ1bGVzIG1hbnVhbGx5LiAgKE5vdGU6IEFueSBCcmVha2Rvd24gRWxlbWVudCBjYW4gYmUgcmVwZWF0ZWQ7IGhvd2V2ZXIsIEl0ZXJhdGlvbnMgaGFzIGJlZW4gaW50cm9kdWNlZCBhcyBhIHNwZWNpYWwgbWV0YS1tb2RlbCBjb25jZXB0LCBiZWNhdXNlIG9mIGl0cyBpbXBvcnRhbnQgcm9sZSBmb3IgbWFueSBtZXRob2RzLikiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUGhhc2UiIGVTdXBlclR5cGVzPSIjLy9BY3Rpdml0eSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iUGhhc2UgaXMgYSBzcGVjaWFsIEFjdGl2aXR5LCB3aGljaCBwcmVzY3JpYmVzIHByZS1kZWZpbmVkIHZhbHVlcyBmb3IgaXRzIGluc3RhbmNlcyBmb3IgdGhlIGF0dHJpYnV0ZXMgcHJlZml4ICgnUGhhc2UnKSBhbmQgaXNSZXBlYXRhYmxlICgnRmFsc2UnKS4gIEl0IGhhcyBiZWVuIGluY2x1ZGVkIGludG8gdGhlIG1ldGEtbW9kZWwgZm9yIGNvbnZlbmllbmNlIGFuZCB0byBwcm92aWRlIGEgc3BlY2lhbCBzdGVyZW90eXBlLCBiZWNhdXNlIGl0IHJlcHJlc2VudHMgYSB2ZXJ5IGNvbW1vbmx5IHVzZWQgQWN0aXZpdHkgdHlwZS4mI3hEOyYjeEE7UGhhc2UgcmVwcmVzZW50IGEgc2lnbmlmaWNhbnQgcGVyaW9kIGluIGEgcHJvamVjdCwgZW5kaW5nIHdpdGggbWFqb3IgbWFuYWdlbWVudCBjaGVja3BvaW50LCBtaWxlc3RvbmUgb3Igc2V0IG9mIERlbGl2ZXJhYmxlcy4gIEl0IGlzIGluY2x1ZGVkIGluIHRoZSBtb2RlbCBhcyBhIHByZWRlZmluZWQgc3BlY2lhbCBBY3Rpdml0eSwgYmVjYXVzZSBvZiBpdHMgc2lnbmlmaWNhbmNlIGluIGRlZmluaW5nIGJyZWFrZG93bnMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlRlYW1Qcm9maWxlIiBlU3VwZXJUeXBlcz0iIy8vQnJlYWtkb3duRWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBUZWFtIFByb2ZpbGUgaXMgYSBCcmVha2Rvd24gRWxlbWVudCB0aGF0IGdyb3VwcyBSb2xlIERlc2NyaXB0b3JzIG9yIFJlc291cmNlIERlZmluaXRpb25zIGRlZmluaW5nIGEgbmVzdGVkIGhpZXJhcmNoeSBvZiB0ZWFtcyBhbmQgdGVhbSBtZW1iZXJzLiYjeEQ7JiN4QTtXb3JrIGFzc2lnbm1lbnRzIGFuZCBXb3JrIFByb2R1Y3QgcmVzcG9uc2liaWxpdGllcyBjYW4gYmUgZGlmZmVyZW50IGZyb20gQWN0aXZpdHkgdG8gQWN0aXZpdHkgaW4gYSBkZXZlbG9wbWVudCBwcm9qZWN0LiBEaWZmZXJlbnQgcGhhc2VzIHJlcXVpcmUgZGlmZmVyZW50IHN0YWZmaW5nIHByb2ZpbGVzLCBpLmUuIGRpZmZlcmVudCBza2lsbHMgYW5kIHJlc291cmNlcyBkb2luZyBkaWZmZXJlbnQgdHlwZXMgb2Ygd29yay4gIFRoZXJlZm9yZSwgYSBwcm9jZXNzIG5lZWRzIHRvIGRlZmluZSBzdWNoIGRpZmZlcmVudCBwcm9maWxlcyBpbiBhIGZsZXhpYmxlIG1hbm5lci4gIFdoZXJlYXMgQ29yZSBNZXRob2QgQ29udGVudCBkZWZpbmVzIHN0YW5kYXJkIHJlc3BvbnNpYmlsaXRpZXMgYW5kIGFzc2lnbm1lbnRzLCBhIHByb2Nlc3MgZXhwcmVzcyBieSBhIGJyZWFrZG93biBzdHJ1Y3R1cmVzIG5lZWRzIHRvIGJlIGFibGUgcmVmaW5lIGFuZCByZWRlZmluZSB0aGVzZSB0aHJvdWdob3V0IGl0cyBkZWZpbml0aW9uLiAgUm9sZSBEZXNjcmlwdG9ycywgUmVzb3VyY2UgRGVmaW5pdGlvbnMsIGFzIHdlbGwgYXMgVGVhbSBQcm9maWxlcyBwcm92aWRlIHRoZSBkYXRhIHN0cnVjdHVyZSBuZWNlc3NhcnkgdG8gYWNoaWV2ZSB0aGlzIGZsZXhpYmlsaXR5IGFuZCB0byBwcm92aWRlIGEgcHJvY2VzcyB1c2VyIHdpdGggdGhlIGNhcGFiaWxpdHkgdG8gZGVmaW5lIGRpZmZlcmVudCB0ZWFtcyBhbmQgcm9sZSByZWxhdGlvbnNoaXBzIGZvciBldmVyeSBBY3Rpdml0eSAoaW5jbHVkaW5nIEFjdGl2aXRpZXMgb24gYW55IG5lc3RpbmctbGV2ZWwgYXMgd2VsbCBhcyBJdGVyYXRpb25zIG9yIFBoYXNlcykuJiN4RDsmI3hBO0hlbmNlLCBpbiBhZGRpdGlvbiB0byB0aGUgd29yayBicmVha2Rvd24gYW5kIHdvcmsgcHJvZHVjdCBicmVha2Rvd24gc3RydWN0dXJlcyBkZWZpbmVkIHNvIGZhciwgVGVhbSBQcm9maWxlcyBhcmUgdXNlZCB0byBkZWZpbmUgYSB0aGlyZCB0eXBlIG9mIGJyZWFrZG93biBzdHJ1Y3R1cmU6IHRlYW0gYnJlYWtkb3duIHN0cnVjdHVyZXMuICBUaGVzZSBhcmUgY3JlYXRlZCBhcyBhbiBBY3Rpdml0eSBzcGVjaWZpYyBoaWVyYXJjaHkgb2YgVGVhbSBQcm9maWxlcyBjb21wcmlzaW5nIG9mIFJvbGUgRGVzY3JpcHRvcnMgYW5kIFJlc291cmNlIERlZmluaXRpb25zLiAgVGhlc2Ugc3RydWN0dXJlcyBjYW4gYmUgcHJlc2VudGVkIGFzIHdlbGwta25vd24gT3JnLUNoYXJ0cy4gIEp1c3QgYXMgd2l0aCBhbnkgb3RoZXIgQnJlYWtkb3duIEVsZW1lbnQgYW5kIERlc2NyaXB0b3JzLCBUZWFtIFByb2ZpbGVzIGNhbiBiZSBkZWZpbmVkIHdpdGhpbiB0aGUgc2NvcGUgb2YgYW55IEFjdGl2aXR5IGluIGEgYnJlYWtkb3duIHN0cnVjdHVyZS4gIEluIG90aGVyIHdvcmRzIGV2ZXJ5IEFjdGl2aXR5IGNhbiBkZWZpbmUgaXRzIG93biBUZWFtIFByb2ZpbGVzIGNvbnNpc3Rpbmcgb2YgQWN0aXZpdHkgc3BlY2lmaWMgUm9sZSBEZXNjcmlwdG9ycyBhbmQgUmVzb3VyY2UgRGVmaW5pdGlvbnMuICBUeXBpY2FsbHksIFRlYW0gUHJvZmlsZXMgYXJlIGRlZmluZWQgb24gdGhlIGxldmVsIG9mIEl0ZXJhdGlvbnMgb3IgUGhhc2VzIG9yIG90aGVyIGhpZ2hlci1sZXZlbCBBY3Rpdml0eS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0idGVhbVJvbGVzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Sb2xlRGVzY3JpcHRvciIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJzdXBlclRlYW0iIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSIjLy9UZWFtUHJvZmlsZSIgZU9wcG9zaXRlPSIjLy9UZWFtUHJvZmlsZS9zdWJUZWFtIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InN1YlRlYW0iIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1RlYW1Qcm9maWxlIiBlT3Bwb3NpdGU9IiMvL1RlYW1Qcm9maWxlL3N1cGVyVGVhbSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJSb2xlRGVzY3JpcHRvciIgZVN1cGVyVHlwZXM9IiMvL0Rlc2NyaXB0b3IiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgUm9sZSBEZXNjcmlwdG9yIHJlcHJlc2VudHMgYSBSb2xlIGluIHRoZSBjb250ZXh0IG9mIG9uZSBzcGVjaWZpYyBBY3Rpdml0eS4gIEV2ZXJ5IGJyZWFrZG93biBzdHJ1Y3R1cmUgY2FuIGRlZmluZSBkaWZmZXJlbnQgcmVsYXRpb25zaGlwcyBvZiBSb2xlIERlc2NyaXB0b3JzIHRvIFRhc2sgRGVzY3JpcHRvcnMgYW5kIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9ycy4gIFRoZXJlZm9yZSBvbmUgUm9sZSBjYW4gYmUgcmVwcmVzZW50ZWQgYnkgbWFueSBSb2xlIERlc2NyaXB0b3JzIGVhY2ggd2l0aGluIHRoZSBjb250ZXh0IG9mIGFuIEFjdGl2aXR5IHdpdGggaXRzIG93biBzZXQgb2YgcmVsYXRpb25zaGlwcy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iUm9sZSIgZVR5cGU9IiMvL1JvbGUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icGVyZm9ybXNBZGRpdGlvbmFsbHkiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1Rhc2tEZXNjcmlwdG9yIiBlT3Bwb3NpdGU9IiMvL1Rhc2tEZXNjcmlwdG9yL2FkZGl0aW9uYWxseVBlcmZvcm1lZEJ5Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImFzc2lzdHNJbiIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vVGFza0Rlc2NyaXB0b3IiIGVPcHBvc2l0ZT0iIy8vVGFza0Rlc2NyaXB0b3IvYXNzaXN0ZWRCeSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJtb2RpZmllcyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vV29ya1Byb2R1Y3REZXNjcmlwdG9yIiBjaGFuZ2VhYmxlPSJmYWxzZSIgdm9sYXRpbGU9InRydWUiCi0gICAgICAgIHRyYW5zaWVudD0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIgZU9wcG9zaXRlPSIjLy9Xb3JrUHJvZHVjdERlc2NyaXB0b3Ivd29ya2VkT25CeSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJwZXJmb3Jtc0FzT3duZXIiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1Rhc2tEZXNjcmlwdG9yIiBlT3Bwb3NpdGU9IiMvL1Rhc2tEZXNjcmlwdG9yL3BlcmZvcm1lZFByaW1hcmlseUJ5Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InJlc3BvbnNpYmxlRm9yIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Xb3JrUHJvZHVjdERlc2NyaXB0b3IiIGVPcHBvc2l0ZT0iIy8vV29ya1Byb2R1Y3REZXNjcmlwdG9yL3Jlc3BvbnNpYmxlUm9sZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUVudW0iIG5hbWU9IldvcmtPcmRlclR5cGUiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldvcmsgT3JkZXIgcmVwcmVzZW50cyBhIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHR3byBCcmVha2Rvd24gRWxlbWVudCBpbiB3aGljaCBvbmUgQnJlYWtkb3duIEVsZW1lbnQgKHJlZmVycmVkIHRvIGFzIChCKSBiZWxvdykgZGVwZW5kcyBvbiB0aGUgc3RhcnQgb3IgZmluaXNoIG9mIGFub3RoZXIgQnJlYWtkb3duIEVsZW1lbnQgKHJlZmVycmVkIHRvIGFzIChBKSBiZWxvdykgaW4gb3JkZXIgdG8gYmVnaW4gb3IgZW5kLiBUaGlzIGVudW1lcmF0aW9uIGRlZmluZXMgdGhlIGRpZmZlcmVudCB0eXBlcyBvZiBXb3JrIE9yZGVyIHJlbGF0aW9uc2hpcHMgYXZhaWxhYmxlIGluIFVNQSBhbmQgaXMgdXNlZCB0byBwcm92aWRlIHZhbHVlcyBmb3IgV29yayBPcmRlcidzIGxpbmtUeXBlIGF0dHJpYnV0ZS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9ImZpbmlzaFRvU3RhcnQiLz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9ImZpbmlzaFRvRmluaXNoIiB2YWx1ZT0iMSIvPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0ic3RhcnRUb1N0YXJ0IiB2YWx1ZT0iMiIvPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0ic3RhcnRUb0ZpbmlzaCIgdmFsdWU9IjMiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iV29ya09yZGVyIiBlU3VwZXJUeXBlcz0iIy8vUHJvY2Vzc0VsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldvcmsgT3JkZXIgaXMgYSBNZXRob2QgRWxlbWVudCB0aGF0IHJlcHJlc2VudHMgYSByZWxhdGlvbnNoaXAgYmV0d2VlbiB0d28gQnJlYWtkb3duIEVsZW1lbnRzIGluIHdoaWNoIG9uZSBCcmVha2Rvd24gRWxlbWVudHMgZGVwZW5kcyBvbiB0aGUgc3RhcnQgb3IgZmluaXNoIG9mIGFub3RoZXIgQnJlYWtkb3duIEVsZW1lbnRzIGluIG9yZGVyIHRvIGJlZ2luIG9yIGVuZC4gICYjeEQ7JiN4QTsoTm90ZSwgV29yayBPcmRlciBpcyBub3QgbW9kZWxlZCBhcyBhbiBBc3NvY2lhdGlvbiBDbGFzcyB0byBwcm92aWRlIGEgc3RyYWlnaHRmb3J3YXJkIG1hcHBpbmcgIHRvIFhNSSBhbmQgRU1GLikmI3hEOyYjeEE7VGhlIFdvcmsgT3JkZXIgY2xhc3MgZGVmaW5lcyBwcmVkZWNlc3NvciBhbmQgc3VjY2Vzc29yIHJlbGF0aW9ucyBhbW9uZ3N0IEJyZWFrZG93biBFbGVtZW50cy4gIFRoaXMgaW5mb3JtYXRpb24gaXMgaW4gcGFydGljdWxhciBjcml0aWNhbCBmb3IgcGxhbm5pbmcgYXBwbGljYXRpb25zLiAgU2VlIG1vcmUgZGV0YWlscyBvbiBkaWZmZXJlbnQgdHlwZXMgb2YgV29yayBPcmRlciByZWxhdGlvbnNoaXBzIGF0IFdvcmsgT3JkZXIgVHlwZS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibGlua1R5cGUiIGVUeXBlPSIjLy9Xb3JrT3JkZXJUeXBlIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmaW5pc2hUb1N0YXJ0Ij4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhpcyBhdHRyaWJ1dGUgZXhwcmVzc2VzIHRoZSB0eXBlIG9mIHRoZSBXb3JrIE9yZGVyIHJlbGF0aW9uc2hpcCBieSBhc3NpZ25pbmcgYSB2YWx1ZSBmcm9tIHRoZSBXb3JrIE9yZGVyIFR5cGUgZW51bWVyYXRpb24uIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InByZWQiIGxvd2VyQm91bmQ9IjEiIGVUeXBlPSIjLy9Xb3JrQnJlYWtkb3duRWxlbWVudCIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQcm9jZXNzRWxlbWVudCIgYWJzdHJhY3Q9InRydWUiIGVTdXBlclR5cGVzPSIjLy9EZXNjcmliYWJsZUVsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlByb2Nlc3MgRWxlbWVudCBpcyBhIERlc2NyaWJhYmxlIEVsZW1lbnQgdGhhdCByZXByZXNlbnRzIGFuIGFic3RyYWN0IGdlbmVyYWxpemF0aW9uIGZvciBhbGwgZWxlbWVudHMgZGVmaW5lZCBpbiB0aGUgUHJvY2VzcyBwYWNrYWdlLiYjeEQ7JiN4QTtQcm9jZXNzIEVsZW1lbnRzIHJlcHJlc2VudHMgUHJvY2VzcyBzcGVjaWZpYyBlbGVtZW50cyB0aGF0IGFyZSBzdXBwb3NlZCB0byBiZSBtYW5hZ2VkIGluIFByb2Nlc3MgUGFja2FnZXMuICBUaGUgc2VwYXJhdGlvbiBvZiBQcm9jZXNzIEVsZW1lbnQgZnJvbSBDb250ZW50IEVsZW1lbnQgYWxsb3dzIHRvIGNsZWFybHkgZGlzdGluZ3Vpc2ggYmV0d2VlbiBwdXJlIG1ldGhvZCBjb250ZW50IGZyb20gY29udGVudCB0aGF0IGlzIHJlcHJlc2VudGVkIGluIHByb2Nlc3Nlcy4gIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlBsYW5uaW5nRGF0YSIgZVN1cGVyVHlwZXM9IiMvL1Byb2Nlc3NFbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJQbGFubmluZyBEYXRhIGlzIGEgTWV0aG9kIEVsZW1lbnQgdGhhdCBhZGRzIHBsYW5uaW5nIGRhdGEgdG8gQnJlYWtkb3duIEVsZW1lbnRzIHdoZW4gaXQgaXMgdXNlZCBmb3IgYSBQcm9jZXNzIFBsYW5uaW5nIFRlbXBsYXRlLiAgRm9yIERlbGl2ZXJ5IFByb2Nlc3NlcyBhbmQgQ2FwYWJpbGl0eSBQYXR0ZXJucyB0aGlzIGNsYXNzIGNhbiBlaXRoZXIgbm90IGJlIGluc3RhbnRpYXRlZCBvciBwb3B1bGF0ZWQgd2l0aCBkZWZhdWx0IGRhdGEuJiN4RDsmI3hBO1BsYW5uaW5nIERhdGEgZmFjdG9ycyBvdXQgc3BlY2lmaWMgb3B0aW9uYWwgZGF0YSBuZWVkZWQgZm9yIHJlcHJlc2VudGluZyBwbGFubmluZyB0ZW1wbGF0ZXMuICBUaGlzIGFzc29jaWF0aW9uIGFsbG93cyB0byBhY2Nlc3MgcGxhbm5pbmcgZGF0YSBpZiBpdCBpcyBzdG9yZWQgZm9yIHRoZSBCcmVha2Rvd24gRWxlbWVudC4mI3hEOyYjeEE7KE5PVEUsIFRIRSBBVFRSSUJVVEVTIEZPUiBUSElTIENMQVNTIEFSRSBOT1QgQ09NUExFVEUsIFlFVCkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic3RhcnREYXRlIiBlVHlwZT0iIy8vRGF0ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBkZWZhdWx0IHN0YXJ0IGRhdGUgZm9yIGEgcGxhbmVkIFRhc2suIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImZpbmlzaERhdGUiIGVUeXBlPSIjLy9EYXRlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGRlZmF1bHQgZmluaXNoIGRhdGUgZm9yIGEgcGxhbmVkIFRhc2suIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJhbmsiIGVUeXBlPSIjLy9JbnRlZ2VyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGRlZmF1bHQgcmFuayBmb3IgYSBwbGFuZWQgVGFzay4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRGVzY3JpcHRvciIgYWJzdHJhY3Q9InRydWUiIGVTdXBlclR5cGVzPSIjLy9CcmVha2Rvd25FbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIERlc2NyaXB0b3IgaXMgYW4gYWJzdHJhY3QgZ2VuZXJhbGl6YXRpb24gZm9yIHNwZWNpYWwgQnJlYWtkb3duIEVsZW1lbnRzIHRoYXQgcmVmZXJlbmNlcyBvbmUgY29uY3JldGUgQ29udGVudCBFbGVtZW50LiAgQSBkZXNjcmlwdG9yIHByb3ZpZGVzIGEgcmVwcmVzZW50YXRpb24gb2YgYSBDb250ZW50IEVsZW1lbnQgd2l0aGluIGJyZWFrZG93biBzdHJ1Y3R1cmVzLiAgSW4gYWRkaXRpb24gdG8ganVzdCByZWZlcmVuY2luZyBDb250ZW50IEVsZW1lbnRzIGl0IGFsbG93cyBvdmVycmlkaW5nIHRoZSBDb250ZW50IEVsZW1lbnRzIHN0cnVjdHVyYWwgcmVsYXRpb25zaGlwcyBieSBkZWZpbmluZyBpdHMgb3duIHNldHMgb2YgYXNzb2NpYXRpb25zLiYjeEQ7JiN4QTtEZXNjcmlwdG9ycyBhcmUgdGhlIGtleSBjb25jZXB0IGZvciByZWFsaXppbmcgdGhlIHNlcGFyYXRpb24gb2YgcHJvY2Vzc2VzIGZyb20gbWV0aG9kIGNvbnRlbnQuICBBIERlc2NyaXB0b3IgY2FuIGJlIGNoYXJhY3Rlcml6ZWQgYXMgYSByZWZlcmVuY2Ugb2JqZWN0IGZvciBvbmUgcGFydGljdWxhciBDb250ZW50IEVsZW1lbnQsIHdoaWNoIGhhcyBpdHMgb3duIHJlbGF0aW9uc2hpcHMgYW5kIHByb3BlcnRpZXMuICBXaGVuIGEgRGVzY3JpcHRvciBpcyBjcmVhdGVkIGl0IHNoYWxsIGJlIHByb3ZpZGVkIHdpdGggY29uZ3J1ZW50IGNvcGllcyBvZiB0aGUgcmVsYXRpb25zaGlwcyBkZWZpbmVkIGZvciB0aGUgcmVmZXJlbmNlZCBjb250ZW50IGVsZW1lbnQuICBIb3dldmVyLCBhIHVzZXIgY2FuIG1vZGlmeSB0aGVzZSByZWxhdGlvbnNoaXBzIGZvciB0aGUgcGFydGljdWxhciBwcm9jZXNzIHNpdHVhdGlvbiBmb3Igd2hpY2ggdGhlIGRlc2NyaXB0b3IgaGFzIGJlZW4gY3JlYXRlZC4gIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImlzU3luY2hyb25pemVkV2l0aFNvdXJjZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW5PYmplY3QiCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9InRydWUiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iVGFza0Rlc2NyaXB0b3IiIGVTdXBlclR5cGVzPSIjLy9Xb3JrQnJlYWtkb3duRWxlbWVudCAjLy9EZXNjcmlwdG9yIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIFRhc2sgRGVzY3JpcHRvciBpcyBhIERlc2NyaXB0b3IgYW5kIFdvcmsgQnJlYWtkb3duIEVsZW1lbnQgdGhhdCByZXByZXNlbnRzIGEgcHJveHkgZm9yIGEgVGFzayBpbiB0aGUgY29udGV4dCBvZiBvbmUgc3BlY2lmaWMgQWN0aXZpdHkuICBFdmVyeSBicmVha2Rvd24gc3RydWN0dXJlIGNhbiBkZWZpbmUgZGlmZmVyZW50IHJlbGF0aW9uc2hpcHMgb2YgVGFzayBEZXNjcmlwdG9ycyB0byBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvcnMgYW5kIFJvbGUgRGVzY3JpcHRvcnMuIFRoZXJlZm9yZSBvbmUgVGFzayBjYW4gYmUgcmVwcmVzZW50ZWQgYnkgbWFueSBUYXNrIERlc2NyaXB0b3JzIGVhY2ggd2l0aGluIHRoZSBjb250ZXh0IG9mIGFuIEFjdGl2aXR5IHdpdGggaXRzIG93biBzZXQgb2YgcmVsYXRpb25zaGlwcy4mI3hEOyYjeEE7QSBrZXkgZGlmZmVyZW5jZSBiZXR3ZWVuIE1ldGhvZCBDb250ZW50IGFuZCBQcm9jZXNzIGlzIHRoYXQgYSBDb250ZW50IEVsZW1lbnQgc3VjaCBhcyBUYXNrIGRlc2NyaWJlcyBhbGwgYXNwZWN0cyBvZiBkb2luZyB3b3JrIGRlZmluZWQgYXJvdW5kIHRoaXMgVGFzay4gIFRoaXMgZGVzY3JpcHRpb24gaXMgbWFuYWdlZCBpbiBzdGVwcywgd2hpY2ggYXJlIG1vZGVsZWQgYXMgU2VjdGlvbnMgb2YgdGhlIFRhc2tzJyBDb250ZW50IERlc2NyaXB0aW9ucy4gIFdoZW4gYXBwbHlpbmcgYSBUYXNrIGluIGEgUHJvY2VzcycgQWN0aXZpdHkgd2l0aCBhIFRhc2sgRGVzY3JpcHRvciBhIFByb2Nlc3MgRW5naW5lZXIgbmVlZHMgdG8gaW5kaWNhdGUgdGhhdCBhdCB0aGF0IHBhcnRpY3VsYXIgcG9pbnQgaW4gdGltZSBpbiB0aGUgUHJvY2VzcyBkZWZpbml0aW9uIGZvciB3aGljaCB0aGUgVGFzayBEZXNjcmlwdG9yIGhhcyBiZWVuIGNyZWF0ZWQsIG9ubHkgYSBzdWJzZXQgb2Ygc3RlcHMgc2hhbGwgYmUgcGVyZm9ybWVkLiAgSGUgZGVmaW5lcyB0aGlzIHNlbGVjdGlvbiB1c2luZyB0aGUgc2VsZWN0ZWRTdGVwcyBhc3NvY2lhdGlvbi4gIElmIGhlIHdhbnRzIHRvIGFkZCBzdGVwcyB0byBhIFRhc2sgRGVzY3JpcHRvciwgaGUgY2FuIGRlc2NyaWJlIHRoZXNlIGVpdGhlciBwcmFnbWF0aWNhbGx5IGluIHRoZSByZWZpbmVkRGVzY3JpcHRpb24gYXR0cmlidXRlIG9yICdwcm9wZXJseScgY3JlYXRlIGEgY29udHJpYnV0aW5nIFRhc2sgdG8gdGhlIFRhc2sgdGhlIFRhc2sgRGVzY3JpcHRvciByZWZlcnMgdG8uJiN4RDsmI3hBOyIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJUYXNrIiBlVHlwZT0iIy8vVGFzayIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJhZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSIKLSAgICAgICAgb3JkZXJlZD0iZmFsc2UiIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vUm9sZURlc2NyaXB0b3IiIGVPcHBvc2l0ZT0iIy8vUm9sZURlc2NyaXB0b3IvcGVyZm9ybXNBZGRpdGlvbmFsbHkiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iYXNzaXN0ZWRCeSIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vUm9sZURlc2NyaXB0b3IiIGVPcHBvc2l0ZT0iIy8vUm9sZURlc2NyaXB0b3IvYXNzaXN0c0luIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImV4dGVybmFsSW5wdXQiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1dvcmtQcm9kdWN0RGVzY3JpcHRvciIgZU9wcG9zaXRlPSIjLy9Xb3JrUHJvZHVjdERlc2NyaXB0b3IvZXh0ZXJuYWxJbnB1dFRvIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im1hbmRhdG9yeUlucHV0IiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Xb3JrUHJvZHVjdERlc2NyaXB0b3IiIGVPcHBvc2l0ZT0iIy8vV29ya1Byb2R1Y3REZXNjcmlwdG9yL21hbmRhdG9yeUlucHV0VG8iLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ib3B0aW9uYWxJbnB1dCIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vV29ya1Byb2R1Y3REZXNjcmlwdG9yIiBlT3Bwb3NpdGU9IiMvL1dvcmtQcm9kdWN0RGVzY3JpcHRvci9PcHRpb25hbElucHV0VG8iLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ib3V0cHV0IiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Xb3JrUHJvZHVjdERlc2NyaXB0b3IiIGVPcHBvc2l0ZT0iIy8vV29ya1Byb2R1Y3REZXNjcmlwdG9yL291dHB1dEZyb20iLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icGVyZm9ybWVkUHJpbWFyaWx5QnkiIGVUeXBlPSIjLy9Sb2xlRGVzY3JpcHRvciIKLSAgICAgICAgZU9wcG9zaXRlPSIjLy9Sb2xlRGVzY3JpcHRvci9wZXJmb3Jtc0FzT3duZXIiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ic2VsZWN0ZWRTdGVwcyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vU2VjdGlvbiIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJXb3JrUHJvZHVjdERlc2NyaXB0b3IiIGVTdXBlclR5cGVzPSIjLy9EZXNjcmlwdG9yIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9yIHJlcHJlc2VudHMgYSBXb3JrIFByb2R1Y3QgaW4gdGhlIGNvbnRleHQgb2Ygb25lIHNwZWNpZmljIEFjdGl2aXR5LiAgRXZlcnkgYnJlYWtkb3duIHN0cnVjdHVyZSBjYW4gZGVmaW5lIGRpZmZlcmVudCByZWxhdGlvbnNoaXBzIG9mIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9ycyB0byBUYXNrIERlc2NyaXB0b3JzIGFuZCBSb2xlIERlc2NyaXB0b3JzLiAgVGhlcmVmb3JlIG9uZSBXb3JrIFByb2R1Y3QgY2FuIGJlIHJlcHJlc2VudGVkIGJ5IG1hbnkgV29yayBQcm9kdWN0IERlc2NyaXB0b3JzIGVhY2ggd2l0aGluIHRoZSBjb250ZXh0IG9mIGFuIEFjdGl2aXR5IHdpdGggaXRzIG93biBzZXQgb2YgcmVsYXRpb25zaGlwcy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYWN0aXZpdHlFbnRyeVN0YXRlIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJHaXZlbiB0aGF0IGFuIGluc3RhbmNlIG9mIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9yIGhhcyBiZWVuIGNyZWF0ZWQgZm9yIGEgc3BlY2lmaWMgQWN0aXZpdHksIHRoZW4gdGhlIEFjdGl2aXR5IEVudHJ5IFN0YXRlIGF0dHJpYnV0ZSBzcGVjaWZpZXMgdGhlIGRlc2lyZWQgc3RhdGUgb2YgaW5zdGFuY2VzIG9mIHRoZSByZWZlcmVuY2VkIFdvcmsgUHJvZHVjdCB3aGVuIHdvcmsgb24gdGhlIEFjdGl2aXR5IGlzIGluaXRpYXRlZCAoaS5lLiB3b3JrIG9uIHRoZSBBY3Rpdml0eSdzIFRhc2sgRGVzY3JpcHRvcnMgaXMgYmVpbmcgaW5pdGlhdGVkIHRoYXQgdXNlIHRoaXMgV29yayBQcm9kdWN0IERlc2NyaXB0b3IgYXMgaW5wdXQpLiAgJiN4RDsmI3hBO0ZvciBzb21lIFdvcmsgUHJvZHVjdHMgc3RhdGUgaXMgZXhwcmVzc2VkIGluIHBlcmNlbnRhZ2Ugb2YgY29tcGxldGlvbiwgY29tcGxpYW5jZSB0byB3b3JrIHByb2R1Y3QgY2hlY2tsaXN0LCBpbmZvcm1hbCBzdGF0ZSBkZXNjcmlwdGlvbnMsIGV0Yy4gIE90aGVycyBoYXZlIHZlcnkgc3BlY2lmaWMgc3RhdGVzIGV4cHJlc3NlZCBhcyBlbnVtZXJhdGlvbnMgc3VjaCBhcyBbaWRlbnRpZmllZCwgYnJpZWZseSBkZXNjcmliZWQsIG91dGxpbmVkLCBkZXRhaWxlZF0gZm9yIHVzZSBjYXNlcy4gIE90aGVyIFdvcmsgUHJvZHVjdCBzdGF0ZXMgcmVsYXRlIHRvIHNvbWUgcXVhbGl0eSBtZWFzdXJlcyBvciBsaWZlY3ljbGUgc3RhdGVzIHN1Y2ggYXMgW3Jldmlld2VkLCBpbXBsZW1lbnRlZCwgdGVzdGVkXS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYWN0aXZpdHlFeGl0U3RhdGUiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkdpdmVuIHRoYXQgYW4gaW5zdGFuY2Ugb2YgV29yayBQcm9kdWN0IERlc2NyaXB0b3IgaGFzIGJlZW4gY3JlYXRlZCBmb3IgYSBzcGVjaWZpYyBBY3Rpdml0eSwgdGhlbiB0aGUgQWN0aXZpdHkgRXhpc3QgU3RhdGUgYXR0cmlidXRlIHNwZWNpZmllcyB0aGUgZGVzaXJlZCBzdGF0ZSBvZiBpbnN0YW5jZXMgb2YgdGhlIHJlZmVyZW5jZWQgV29yayBQcm9kdWN0IHdoZW4gd29yayBvbiB0aGUgQWN0aXZpdHkgaXMgZmluaXNoZWQgKGkuZS4gd29yayBvbiB0aGUgQWN0aXZpdHkncyBUYXNrIERlc2NyaXB0b3JzIGhhcyBmaW5pc2hlZCB0aGF0IGhhdmUgdGhpcyBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvciBhcyBvdXRwdXQpLiYjeEQ7JiN4QTtGb3Igc29tZSBXb3JrIFByb2R1Y3RzIHN0YXRlIGlzIGV4cHJlc3NlZCBpbiBwZXJjZW50YWdlIG9mIGNvbXBsZXRpb24sIGNvbXBsaWFuY2UgdG8gd29yayBwcm9kdWN0IGNoZWNrbGlzdCwgaW5mb3JtYWwgc3RhdGUgZGVzY3JpcHRpb25zLCBldGMuICBPdGhlcnMgaGF2ZSB2ZXJ5IHNwZWNpZmljIHN0YXRlcyBleHByZXNzZWQgYXMgZW51bWVyYXRpb25zIHN1Y2ggYXMgW2lkZW50aWZpZWQsIGJyaWVmbHkgZGVzY3JpYmVkLCBvdXRsaW5lZCwgZGV0YWlsZWRdIGZvciB1c2UgY2FzZXMuICBPdGhlciBXb3JrIFByb2R1Y3Qgc3RhdGVzIHJlbGF0ZSB0byBzb21lIHF1YWxpdHkgbWVhc3VyZXMgb3IgbGlmZWN5Y2xlIHN0YXRlcyBzdWNoIGFzIFtyZXZpZXdlZCwgaW1wbGVtZW50ZWQsIHRlc3RlZF0uIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9IldvcmtQcm9kdWN0IiBlVHlwZT0iIy8vV29ya1Byb2R1Y3QiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZXh0ZXJuYWxJbnB1dFRvIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9UYXNrRGVzY3JpcHRvciIgZU9wcG9zaXRlPSIjLy9UYXNrRGVzY3JpcHRvci9leHRlcm5hbElucHV0Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImltcGFjdGVkQnkiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1dvcmtQcm9kdWN0RGVzY3JpcHRvciIgZU9wcG9zaXRlPSIjLy9Xb3JrUHJvZHVjdERlc2NyaXB0b3IvaW1wYWN0cyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJpbXBhY3RzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Xb3JrUHJvZHVjdERlc2NyaXB0b3IiIGVPcHBvc2l0ZT0iIy8vV29ya1Byb2R1Y3REZXNjcmlwdG9yL2ltcGFjdGVkQnkiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ibWFuZGF0b3J5SW5wdXRUbyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vVGFza0Rlc2NyaXB0b3IiIGVPcHBvc2l0ZT0iIy8vVGFza0Rlc2NyaXB0b3IvbWFuZGF0b3J5SW5wdXQiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0id29ya2VkT25CeSIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vUm9sZURlc2NyaXB0b3IiIGNoYW5nZWFibGU9ImZhbHNlIiB2b2xhdGlsZT0idHJ1ZSIKLSAgICAgICAgdHJhbnNpZW50PSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIiBlT3Bwb3NpdGU9IiMvL1JvbGVEZXNjcmlwdG9yL21vZGlmaWVzIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Ik9wdGlvbmFsSW5wdXRUbyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vVGFza0Rlc2NyaXB0b3IiIGVPcHBvc2l0ZT0iIy8vVGFza0Rlc2NyaXB0b3Ivb3B0aW9uYWxJbnB1dCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJvdXRwdXRGcm9tIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9UYXNrRGVzY3JpcHRvciIgZU9wcG9zaXRlPSIjLy9UYXNrRGVzY3JpcHRvci9vdXRwdXQiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZGVsaXZlcmFibGVQYXJ0cyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vV29ya1Byb2R1Y3REZXNjcmlwdG9yIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InJlc3BvbnNpYmxlUm9sZSIgZVR5cGU9IiMvL1JvbGVEZXNjcmlwdG9yIgotICAgICAgICBlT3Bwb3NpdGU9IiMvL1JvbGVEZXNjcmlwdG9yL3Jlc3BvbnNpYmxlRm9yIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkNvbXBvc2l0ZVJvbGUiIGVTdXBlclR5cGVzPSIjLy9Sb2xlRGVzY3JpcHRvciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBDb21wb3NpdGUgUm9sZSBpcyBhIHNwZWNpYWwgUm9sZSBEZXNjcmlwdG9yIHRoYXQgcmVsYXRlcyB0byBtb3JlIHRoZW4gb25lIFJvbGUuICBJdCByZXByZXNlbnRzIGEgZ3JvdXBpbmcgb2YgUm9sZXMgd2l0aCB0aGUgbWFpbiBwdXJwb3NlIG9mIHNpbXBsaWZpY2F0aW9uLCBpLmUuIHJlZHVjaW5nIHRoZSBudW1iZXIgb2Ygcm9sZXMgZm9yIGEgcHJvY2Vzcy4mI3hEOyYjeEE7QSBDb21wb3NpdGUgUm9sZSBpcyBhIGdyb3VwaW5nIG9mIFJvbGVzIHRoYXQgY2FuIGJlIHVzZWQgaW4gYW4gQWN0aXZpdHkgb3IgUHJvY2VzcyB0byByZWR1Y2UgdGhlIG51bWJlciBvZiBSb2xlcy4gIEEgdHlwaWNhbCBhcHBsaWNhdGlvbiB3b3VsZCBiZSBhIHByb2Nlc3MgZm9yIGEgc21hbGwgdGVhbSBpbiB3aGljaCBhIHN0YW5kYXJkIHNldCBvZiByb2xlcyBmcm9tIHRoZSBtZXRob2QgY29udGVudCB3b3VsZCBiZSBhbGwgcGVyZm9ybWVkIGJ5IG9uZSBvciBtb3JlIHJlc291cmNlLiAgQnkgdXNpbmcgQ29tcG9zaXRlIFJvbGUgdGhlIHByb2Nlc3Mgd291bGQgc3VnZ2VzdCBhIHR5cGljYWwgY2x1c3RlcmluZyBvZiBSb2xlcyB0byBSZXNvdXJjZXMuICBBIENvbXBvc2l0ZSBSb2xlIGNvdWxkIHBlcmZvcm0gYWxsIFRhc2tzIGRlZmluZWQgZm9yIHRoZSBSb2xlcyBpdCByZWZlcnMgdG8uIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImFnZ3JlZ2F0ZWRSb2xlcyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vUm9sZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24iIGVTdXBlclR5cGVzPSIjLy9Db250ZW50RGVzY3JpcHRpb24iPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ1c2FnZUd1aWRhbmNlIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJQcm92aWRlcyBpbmZvcm1hdGlvbiBhbmQgZ3VpZGFuY2Ugb24gdGhlIG1lYW5pbmcgb2YgdGhlIEJvb2xlYW4gZmxhZyB2YWx1ZXMgYW5kIHVuZGVyIHdoYXQgY2lyY3Vtc3RhbmNlcyB0aGV5IHNob3VsZCBiZSBvdmVycmlkZGVuLiBGb3IgZXhhbXBsZSwgaXQgZGVzY3JpYmVzIHdoeSB0aGUgYnJlYWtkb3duIGVsZW1lbnQgaXMgb3B0aW9uYWwgb3IgY29uc2lkZXJhdGlvbnMgZm9yIHJlcGVhdGluZyBpdCBhbmQgZGlmZmVyZW5jZXMgaW4gdGhlIGluZGl2aWR1YWwgb2NjdXJyZW5jZXMgb2YgdGhpcyBCcmVha2Rvd24gRWxlbWVudCBhY3Jvc3MgdGhlIGxpZmVjeWNsZS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQWN0aXZpdHlEZXNjcmlwdGlvbiIgZVN1cGVyVHlwZXM9IiMvL0JyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbiI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InB1cnBvc2UiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlN1bW1hcml6ZXMgdGhlIG1haW4gcmVhc29uIGZvciBwZXJmb3JtaW5nIHRoaXMgQWN0aXZpdHksIGRlc2NyaWJlcyB3aGF0IHRoZSBhY3Rpdml0eSBhcyBhIHdob2xlIGlzIGludGVuZGVkIHRvIGFjaGlldmUuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFsdGVybmF0aXZlcyIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQ29tcHJpc2VzIG9mIHN1bW1hcmllcyBkZXNjcmliaW5nIGltcG9ydGFudCBleGNlcHRpb25hbCBhbmQgbm9uLXN0YW5kYXJkIHdheXMgb2YgZG9pbmcgdGhlIHdvcmsgb2YgdGhpcyBBY3Rpdml0eSBub3QgY292ZXJlZCBieSB0aGUgQWN0aXZpdHkncyBUYXNrcy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaG93dG9TdGFmZiIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iUHJvdmlkZXMgYmFja2dyb3VuZCBvbiB3aG8gc2hvdWxkIGJlIGludm9sdmVkIGluIHRoaXMgYWN0aXZpdHkgd2hhdCBhcmUgdGhlIHJlcXVpcmVkIHNraWxscywgZXhwZXJpZW5jZSwgIGFuZCBwZXJoYXBzIGF0dGl0dWRlcy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24iIGVTdXBlclR5cGVzPSIjLy9Qcm9jZXNzRGVzY3JpcHRpb24iPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzY2FsZSIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iT3V0bGluZXMgY2hhcmFjdGVyaXN0aWNzIGFib3V0IHRoZSBzaXplIG9mIGEgdHlwaWNhbCBwcm9qZWN0IHRoYXQgcGVyZm9ybXMgdGhpcyBwcm9qZWN0IGV4cHJlc3NlZCBpbiB0ZWFtIHNpemUsIG1hbiB5ZWFycywgZXRjLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwcm9qZWN0Q2hhcmFjdGVyaXN0aWNzIgotICAgICAgICBlVHlwZT0iIy8vU3RyaW5nIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJDaGFyYWN0ZXJpemVzIHRoZSBwcm9qZWN0IHRoYXQgd291bGQgdHlwaWNhbGx5IHBlcmZvcm0gdGhpcyBQcm9jZXNzIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJpc2tMZXZlbCIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iT3V0bGluZXMgdHlwaWNhbCBwcm9qZWN0IHJpc2tzIHRoYXQgYXJlIGFkZHJlc3NlZCB3aXRoIHRoaXMgcHJvY2Vzcy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZXN0aW1hdGluZ1RlY2huaXF1ZSIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRGVzY3JpYmVzIHRoZSBFc3RpbWF0aW9uIFRlY2huaXF1ZXMgcHJvdmlkZWQgZm9yIHRoaXMgUHJvY2Vzcy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icHJvamVjdE1lbWJlckV4cGVydGlzZSIKLSAgICAgICAgZVR5cGU9IiMvL1N0cmluZyIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iUHJvdmlkZXMgYSBwcm9maWxlIG9mIGEgdHlwaWNhbCBwcm9qZWN0IHRlYW0sIHRoZSBkaXN0cmlidXRpb24gb2Ygcm9sZXMsIHNraWxscyByZXF1aXJlZCBmb3IgYSB0ZWFtIHBlcmZvcm1zIGEgcHJvamVjdCBiYXNlZCBvbiB0aGlzIHByb2Nlc3MuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InR5cGVPZkNvbnRyYWN0IiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJQcm92aWRlcyBiYWNrZ3JvdW5kIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjb250cmFjdHMgdGhhdCBuZWVkIHRvIGJlIGVzdGFibGlzaGVkIGJldHdlZW4gYSBwcm9qZWN0IHRlYW0gdGhhdCBwZXJmb3JtcyB0aGlzIHByb2Nlc3MgYW5kIGEgY2xpZW50IChlLmcuIGZvciBhbiBJR1MgZW5nYWdlbWVudCkuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlByb2Nlc3NEZXNjcmlwdGlvbiIgZVN1cGVyVHlwZXM9IiMvL0FjdGl2aXR5RGVzY3JpcHRpb24iPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJleHRlcm5hbElkIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBbiBleHRlcm5hbCB2aXNpYmxlIG51bWJlciB0aGF0IGlzIHVzZWQgdG8gcmVmZXJlbmNlIHRoaXMgZGVsaXZlcnkgcGF0dGVybnMgYW5kIG1vZGVscy4gSXQgaXMgdXNlZCBsaWtlIGEgc3lub255bS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic2NvcGUiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkRlZmluZXMgdGhlIHNjb3BlIG9mIHRoZSBQcm9jZXNzLCBpLmUuIHdoaWNoIHR5cGVzIG9mIHByb2plY3RzIGRvZXMgaXQgYWRkcmVzcyBhbmQgd2hpY2ggbm90LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ1c2FnZU5vdGVzIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBbnkgYWRkaXRpb25hbCBub3RlcyBvbiBob3cgdG8gYXBwbHkgYW5kIGluc3RhbnRpYXRlIHRoaXMgcHJvY2VzcyBmb3IgYSBwcm9qZWN0LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJEZXNjcmlwdG9yRGVzY3JpcHRpb24iIGVTdXBlclR5cGVzPSIjLy9CcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24iPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyZWZpbmVkRGVzY3JpcHRpb24iIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgRGVzY3JpcHRvciBtaWdodCBhZGQgcmVmaW5lbWVudHMgdG8gdGhlIG1haW4gZGVzY3JpcHRpb24gb2YgdGhlIENvbnRlbnQgRWxlbWVudCBpdCByZWZlcnMgdG8uICBGb3IgZXhhbXBsZSwgaXQgY291bGQgcHJvdmlkZSBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGFib3V0IGEgV29yayBQcm9kdWN0IHJlbGV2YW50IGZvciB0aGUgc3BlY2lmaWMgcG9pbnQgaW4gdGltZSBpbiB0aGUgcHJvY2VzcyB0aGlzIFdvcmsgUHJvZHVjdCB0eXBlIGlzIGJlaW5nIHVzZWQuICBJdCBjb3VsZCBkZXNjcmliZSBhZGRpdGlvbmFsIHNraWxscyBuZWVkZWQgZm9yIGEgUm9sZSBhdCB0aGF0IHBhcnRpY3VsYXIgcG9pbnQgaW4gdGltZSBpbiBhIHByb2Nlc3MsIGV0Yy4gIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkNvbmNlcHQiIGVTdXBlclR5cGVzPSIjLy9HdWlkYW5jZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBDb25jZXB0IGlzIGEgc3BlY2lmaWMgdHlwZSBvZiBndWlkYW5jZSB0aGF0IG91dGxpbmVzIGtleSBpZGVhcyBhc3NvY2lhdGVkIHdpdGggYmFzaWMgcHJpbmNpcGxlcyB1bmRlcmx5aW5nIHRoZSByZWZlcmVuY2VkIGl0ZW0uIENvbmNlcHRzIG5vcm1hbGx5IGFkZHJlc3MgbW9yZSBnZW5lcmFsIHRvcGljcyB0aGFuIEd1aWRlbGluZXMgYW5kIHNwYW4gYWNyb3NzIHNldi1lcmFsIHdvcmsgcHJvZHVjdCBhbmQvb3IgdGFza3MvYWN0aXZpdGllcy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQ2hlY2tsaXN0IiBlU3VwZXJUeXBlcz0iIy8vR3VpZGFuY2UiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgQ2hlY2tsaXN0IGlzIGEgc3BlY2lmaWMgdHlwZSBvZiBndWlkYW5jZSB0aGF0IGlkZW50aWZpZXMgYSBzZXJpZXMgb2YgaXRlbXMgdGhhdCBuZWVkIHRvIGJlIGNvbXBsZXRlZCBvciB2ZXJpLWZpZWQuICBDaGVja2xpc3RzIGFyZSBvZnRlbiB1c2VkIGluIHJldmlld3Mgc3VjaCBhcyB3YWxrdGhyb3VnaHMgb3IgaW5zcGVjdGlvbnMuICIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJFeGFtcGxlIiBlU3VwZXJUeXBlcz0iIy8vR3VpZGFuY2UiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkFuIEV4YW1wbGUgaXMgYSBzcGVjaWZpYyB0eXBlIG9mIEd1aWRhbmNlIHRoYXQgcmVwcmVzZW50cyBhIHR5cGljYWwsIHBhcnRpYWxseSBjb21wbGV0ZWQsIHNhbXBsZSBpbnN0YW5jZSBvZiBvbmUgb3IgbW9yZSB3b3JrIHByb2R1Y3RzIG9yIHNjZW5hcmlvIGxpa2UgZGVzY3JpcHRpb25zIG9mIGhvdyBUYXNrIG1heSBiZSBwZXJmb3JtZWQuIEV4YW1wbGVzIGNhbiBiZSByZWxhdGVkIHRvIFdvcmsgUHJvZHVjdHMgYXMgd2VsbCBhcyBUYXNrcyB0aGF0IHByb2R1Y2UgdGhlbSBhcyB3ZWxsIGFzIGFueSBvdGhlciBDb250ZW50IEVsZW1lbnQuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ikd1aWRlbGluZSIgZVN1cGVyVHlwZXM9IiMvL0d1aWRhbmNlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIEd1aWRlbGluZSBpcyBhIHNwZWNpZmljIHR5cGUgb2YgZ3VpZGFuY2UgdGhhdCBwcm92aWRlcyBhZGRpdGlvbmFsIGRldGFpbCBvbiBob3cgdG8gcGVyZm9ybSBhIHBhcnRpY3VsYXIgdGFzayBvciBncm91cGluZyBvZiB0YXNrcyAoZS5nLiBncm91cGVkIHRvZ2V0aGVyIGFzIGFjdGl2aXRpZXMpIG9yIHRoYXQgcHJvdmlkZXMgYWRkaXRpb25hbCBkZXRhaWwsIHJ1bGVzLCBhbmQgcmVjb21tZW5kYXRpb25zIG9uIHdvcmsgcHJvZHVjdHMgYW5kIHRoZWlyIHByb3BlcnRpZXMuICBBbW9uZ3N0IG90aGVycywgaXQgY2FuIGluY2x1ZGUgZGV0YWlscyBhYm91dCBiZXN0IHByYWN0aWNlcyBhbmQgZGlmZmVyZW50IGFwcHJvYWNoZXMgZm9yIGRvaW5nIHdvcmssIGhvdyB0byB1c2UgcGFydGljdWxhciB0eXBlcyBvZiB3b3JrIHByb2R1Y3RzLCBpbmZvcm1hdGlvbiBvbiBkaWZmZXJlbnQgc3VidHlwZXMgYW5kIHZhcmlhbnRzIG9mIHRoZSB3b3JrIHByb2R1Y3QgYW5kIGhvdyB0aGV5IGV2b2x2ZSB0aHJvdWdob3V0IGEgbGlmZWN5Y2xlLCBkaXNjdXNzaW9ucyBvbiBza2lsbHMgdGhlIHBlcmZvcm1pbmcgcm9sZXMgc2hvdWxkIGFjcXVpcmUgb3IgaW1wcm92ZSB1cG9uLCBtZWFzdXJlbWVudHMgZm9yIHByb2dyZXNzIGFuZCBtYXR1cml0eSwgZXRjLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJFc3RpbWF0ZSIgZVN1cGVyVHlwZXM9IiMvL0d1aWRhbmNlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBbiBFc3RpbWF0ZSBpcyBhIHNwZWNpZmljIHR5cGUgb2YgR3VpZGFuY2UgdGhhdCBwcm92aWRlcyBzaXppbmcgbWVhc3VyZXMsIG9yIHN0YW5kYXJkcyBmb3Igc2l6aW5nIHRoZSB3b3JrIGVmZm9ydCBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyBhIHBhcnRpY3VsYXIgcGllY2Ugb2Ygd29yayBhbmQgaW5zdHJ1Y3Rpb25zIGZvciB0aGVpciBzdWNjZXNzZnVsIHVzZS4gSXQgbWF5IGJlIGNvbXByaXNlZCBvZiBlc3RpbWF0aW9uIGNvbnNpZGVyYXRpb25zIGFuZCBlc3RpbWF0aW9uIG1ldHJpY3MuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImVzdGltYXRpb25NZXRyaWMiIGVUeXBlPSIjLy9Fc3RpbWF0aW5nTWV0cmljIgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJlc3RpbWF0aW9uQ29uZGVyYXRpb25zIgotICAgICAgICBlVHlwZT0iIy8vRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIiBjb250YWlubWVudD0idHJ1ZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJFc3RpbWF0aW5nTWV0cmljIiBlU3VwZXJUeXBlcz0iIy8vR3VpZGFuY2UiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkVzdGltYXRpb24gTWV0cmljIGRlc2NyaWJlcyBhIG1ldHJpYyBvciBtZWFzdXJlIHRoYXQgaXMgYXNzb2NpYXRlZCB3aXRoIGFuIGVsZW1lbnQgYW5kIHdoaWNoIGlzIHVzZWQgdG8gY2FsY3VsYXRlIHRoZSBzaXplIG9mIHRoZSB3b3JrIGVmZm9ydCBhcyB3ZWxsIGFzIGEgcmFuZ2Ugb2YgcG90ZW50aWFsIGxhYm9yLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMiIGVTdXBlclR5cGVzPSIjLy9HdWlkYW5jZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRXN0aW1hdGlvbiBDb25zaWRlcmF0aW9ucyBxdWFsaWZ5IHRoZSB1c2FnZSBhbmQgYXBwbGljYXRpb24gb2YgZXN0aW1hdGlvbiBtZXRyaWNzIGluIHRoZSBkZXZlbG9wbWVudCBvZiBhbiBhY3R1YWwgZXN0aW1hdGUuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlJlcG9ydCIgZVN1cGVyVHlwZXM9IiMvL0d1aWRhbmNlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIFJlcG9ydCBpcyBhIHByZWRlZmluZWQgdGVtcGxhdGUgb2YgYSByZXN1bHQgdGhhdCBpcyBnZW5lcmF0ZWQgb24gdGhlIGJhc2lzIG9mIG90aGVyIHdvcmsgcHJvZHVjdHMgYXMgYW4gb3V0cHV0IGZyb20gc29tZSBmb3JtIG9mIHRvb2wgYXV0b21hdGlvbi4gQW4gZXhhbXBsZSBmb3IgYSByZXBvcnQgd291bGQgYmUgYSB1c2UgY2FzZSBtb2RlbCBzdXJ2ZXksIHdoaWNoIGlzIGdlbmVyYXRlZCBieSBleHRyYWN0aW5nIGRpYWdyYW0gaW5mb3JtYXRpb24gZnJvbSBhIGdyYXBoaWNhbCBtb2RlbCBhbmQgdGV4dHVhbCBpbmZvcm1hdGlvbiBmcm9tIGRvY3VtZW50cyBhbmQgY29tYmluZXMgdGhlc2UgdHdvIHR5cGVzIG9mIGluZm9ybWF0aW9uIGludG8gYSByZXBvcnQuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlRlbXBsYXRlIiBlU3VwZXJUeXBlcz0iIy8vR3VpZGFuY2UiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgVGVtcGxhdGUgaXMgYSBzcGVjaWZpYyB0eXBlIG9mIGd1aWRhbmNlIHRoYXQgcHJvdmlkZXMgZm9yIGEgd29yayBwcm9kdWN0IGEgcHJlLWRlZmluZWQgdGFibGUgb2YgY29udGVudHMsIHNlY3Rpb25zLCBwYWNrYWdlcywgYW5kL29yIGhlYWRpbmdzLCBhIHN0YW5kYXJkaXplZCBmb3JtYXQsIGFzIHdlbGwgYXMgZGVzY3JpcHRpb25zIGhvdyB0aGUgc2VjdGlvbnMgYW5kIHBhY2thZ2VzIGFyZSBzdXBwb3NlZCB0byBiZSB1c2VkIGFuZCBjb21wbGV0ZWQuIFRlbXBsYXRlcyBjYW5ub3Qgb25seSBiZSBwcm92aWRlZCBmb3IgZG9jdW1lbnRzLCBidXQgYWxzbyBmb3IgY29uY2VwdHVhbCBtb2RlbHMgb3IgcGh5c2ljYWwgZGF0YSBzdG9yZXMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlN1cHBvcnRpbmdNYXRlcmlhbCIgZVN1cGVyVHlwZXM9IiMvL0d1aWRhbmNlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJTdXBwb3J0aW5nIE1hdGVyaWFscyBpcyBjYXRjaGFsbCBmb3Igb3RoZXIgdHlwZXMgb2YgZ3VpZGFuY2Ugbm90IHNwZWNpZmljYWxseSBkZWZpbmVkIGVsc2V3aGVyZS4gSXQgY2FuIGJlIHJlbGF0ZWQgdG8gYWxsIGtpbmRzIG9mIENvbnRlbnQgRWxlbWVudHMsIGkuZS4gaW5jbHVkaW5nIG90aGVyIGd1aWRhbmNlIGVsZW1lbnRzLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJUb29sTWVudG9yIiBlU3VwZXJUeXBlcz0iIy8vR3VpZGFuY2UiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgVG9vbCBNZW50b3IgaXMgYSBzcGVjaWZpYyB0eXBlIG9mIGd1aWRhbmNlIHRoYXQgc2hvd3MgaG93IHRvIHVzZSBhIHNwZWNpZmljIHRvb2wgdG8gYWNjb21wbGlzaCBzb21lIHBpZWNlIG9mIHdvcmsgYSBXb3JrIFByb2R1Y3QgZWl0aGVyIGluIHRoZSBjb250ZXh0IG9mIG9yIGluZGVwZW5kZW50IGZyb20gYSBUYXNrIG9yIEFjdGl2aXR5LiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJXaGl0ZXBhcGVyIiBlU3VwZXJUeXBlcz0iIy8vQ29uY2VwdCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV2hpdGVwYXBlcnMgYXJlIGEgc3BlY2lhbCBDb25jZXB0IGd1aWRhbmNlIHRoYXQgaGF2ZSBiZWVuIGV4dGVybmFsbHkgcmV2aWV3ZWQgb3IgcHVibGlzaGVkIGFuZCBjYW4gYmUgcmVhZCBhbmQgdW5kZXJzdG9vZCBpbiBpc29sYXRpb24gb2Ygb3RoZXIgY29udGVudCBlbGVtZW50cyBhbmQgZ3VpZGFuY2UuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlRlcm1EZWZpbml0aW9uIiBlU3VwZXJUeXBlcz0iIy8vR3VpZGFuY2UiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRlcm1EZWZpbml0aW9ucyBkZWZpbmUgY29uY2VwdHMgYW5kIGFyZSB1c2VkIHRvIGJ1aWxkIHVwIHRoZSBHbG9zc2FyeS4gVGhleSBhcmUgbm90IGRpcmVjdGx5IHJlbGF0ZWQgdG8gQ29udGVudEVsZW1lbnRzLCBidXQgdGhlaXIgcmVsYXRpb25zaGlwIGlzIGJlaW5nIGRlcml2ZWQgd2hlbiB0aGUgVGVybSBpcyB1c2VkIGluIHRoZSBDb250ZW50RWxlbWVudHMgZGVzY3JpcHRpb24gdGV4dC4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUHJhY3RpY2UiIGVTdXBlclR5cGVzPSIjLy9HdWlkYW5jZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBQcmFjdGljZSByZXByZXNlbnRzIGEgcHJvdmVuIHdheSBvciBzdHJhdGVneSBvZiBkb2luZyB3b3JrIHRvIGFjaGlldmUgYSBnb2FsIHRoYXQgaGFzIGEgcG9zaXRpdmUgaW1wYWN0IG9uIHdvcmsgcHJvZHVjdCBvciBwcm9jZXNzIHF1YWxpdHkuICBQcmFjdGljZXMgYXJlIGRlZmluZWQgb3J0aG9nb25hbCB0byBtZXRob2RzIGFuZCBwcm9jZXNzZXMuICBUaGV5IGNvdWxkIHN1bW1hcml6ZSBhc3BlY3RzIHRoYXQgaW1wYWN0IG1hbnkgZGlmZmVyZW50IHBhcnRzIG9mIGEgbWV0aG9kIG9yIHNwZWNpZmljIHByb2Nlc3Nlcy4gIEV4YW1wbGVzIGZvciBwcmFjdGljZXMgd291bGQgYmUgJnF1b3Q7TWFuYWdlIFJpc2tzJnF1b3Q7LCAmcXVvdDtDb250aW51b3VzbHkgdmVyaWZ5IHF1YWxpdHkmcXVvdDssICZxdW90O0FyY2hpdGVjdHVyZS1jZW50cmljIGFuZCBjb21wb25lbnQtYmFzZWQgZGV2ZWxvcG1lbnQmcXVvdDssIGV0Yy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ic3ViUHJhY3RpY2VzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9QcmFjdGljZSIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iY29udGVudFJlZmVyZW5jZXMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0NvbnRlbnRFbGVtZW50Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImFjdGl2aXR5UmVmZXJlbmNlcyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vQWN0aXZpdHkiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUmV1c2FibGVBc3NldCIgZVN1cGVyVHlwZXM9IiMvL0d1aWRhbmNlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIFJldXNhYmxlIEFzc2V0IHByb3ZpZGVzIGEgc29sdXRpb24gdG8gYSBwcm9ibGVtIGZvciBhIGdpdmVuIGNvbnRleHQuIFRoZSBhc3NldCBtYXkgaGF2ZSBhIHZhcmlhYmlsaXR5IHBvaW50LCB3aGljaCBpcyBhIGxvY2F0aW9uIGluIHRoZSBhc3NldCB0aGF0IG1heSBoYXZlIGEgdmFsdWUgcHJvdmlkZWQgb3IgY3VzdG9taXplZCBieSB0aGUgYXNzZXQgY29uc3VtZXIuIFRoZSBhc3NldCBoYXMgcnVsZXMgZm9yIHVzYWdlIHdoaWNoIGFyZSB0aGUgaW5zdHJ1Y3Rpb25zIGRlc2NyaWJpbmcmI3hEOyYjeEE7aG93IHRoZSBhc3NldCBzaG91bGQgYmUgdXNlZC4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRGlzY2lwbGluZSIgZVN1cGVyVHlwZXM9IiMvL0NvbnRlbnRDYXRlZ29yeSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBEaXNjaXBsaW5lIGlzIGEgY2F0ZWdvcml6YXRpb24gb2Ygd29yayAoaS5lLiBUYXNrcyBmb3IgTWV0aG9kIENvbnRlbnQpLCBiYXNlZCB1cG9uIHNpbWlsYXJpdHkgb2YgY29uY2VybnMgYW5kIGNvb3BlcmF0aW9uIG9mIHdvcmsgZWZmb3J0LiYjeEQ7JiN4QTtBIGRpc2NpcGxpbmUgaXMgYSBjb2xsZWN0aW9uIG9mIFRhc2tzIHRoYXQgYXJlIHJlbGF0ZWQgdG8gYSBtYWpvciAnYXJlYSBvZiBjb25jZXJuJyB3aXRoaW4gdGhlIG92ZXJhbGwgcHJvamVjdC4gVGhlIGdyb3VwaW5nIG9mIFRhc2tzIGludG8gZGlzY2lwbGluZXMgaXMgbWFpbmx5IGFuIGFpZCB0byB1bmRlcnN0YW5kaW5nIHRoZSBwcm9qZWN0IGZyb20gYSAndHJhZGl0aW9uYWwnIHdhdGVyZmFsbCBwZXJzcGVjdGl2ZS4gSG93ZXZlciwgdHlwaWNhbGx5LCBmb3IgZXhhbXBsZSwgaXQgaXMgbW9yZSBjb21tb24gdG8gcGVyZm9ybSBjZXJ0YWluIHJlcXVpcmVtZW50cyBhY3Rpdml0aWVzIGluIGNsb3NlIGNvb3JkaW5hdGlvbiB3aXRoIGFuYWx5c2lzIGFuZCBkZXNpZ24gYWN0aXZpdGllcy4gU2VwYXJhdGluZyB0aGVzZSBhY3Rpdml0aWVzIGludG8gc2VwYXJhdGUgZGlzY2lwbGluZXMgbWFrZXMgdGhlIGFjdGl2aXRpZXMgZWFzaWVyIHRvIGNvbXByZWhlbmQuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InRhc2tzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgbG93ZXJCb3VuZD0iMSIgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9UYXNrIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InJlZmVyZW5jZVdvcmtmbG93cyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vQWN0aXZpdHkiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQ29udGVudENhdGVnb3J5IiBhYnN0cmFjdD0idHJ1ZSIgZVN1cGVyVHlwZXM9IiMvL0NvbnRlbnRFbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJDb250ZW50IENhdGVnb3J5IGlzIGFuIGFic3RyYWN0IGNsYXNzIGdlbmVyYWxpemluZyBjb250ZW50IGNhdGVnb3J5IHR5cGVzLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJSb2xlU2V0IiBlU3VwZXJUeXBlcz0iIy8vQ29udGVudENhdGVnb3J5Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIFJvbGUgU2V0IG9yZ2FuaXplcyBSb2xlcyBpbnRvIGNhdGVnb3JpZXMuICBJdCBpcyB1c2VkIHRvIGdyb3VwIHJvbGVzIHRvZ2V0aGVyIHRoYXQgaGF2ZSBjZXJ0YWluIGNvbW1vbmFsaXRpZXMuICBGb3IgZXhhbXBsZSwgdGhlICZxdW90O0FuYWx5c3RzJnF1b3Q7IFJvbGUgU2V0IGNvdWxkIGdyb3VwIHRoZSAmcXVvdDtCdXNpbmVzcyBQcm9jZXNzIEFuYWx5c3QmcXVvdDssICZxdW90O1N5c3RlbSBBbmFseXN0JnF1b3Q7LCBhcyB3ZWxsIGFzICZxdW90O1JlcXVpcmVtZW50cyBTcGVjaWZpZXImcXVvdDsgcm9sZXMuICBBbGwgb2YgdGhlc2Ugd29yayB3aXRoIHNpbWlsYXIgdGVjaG5pcXVlcyBhbmQgaGF2ZSBvdmVybGFwcGluZyBza2lsbHMsIGJ1dCBhcmUgcmVxdWlyZWQgYXMgZGlzdGluY3Qgcm9sZXMgZm9yIGEgbWV0aG9kIChlLmcuIHRoZSBtZXRob2QgdGhlIElCTSBSYXRpb25hbCBVbmlmaWVkIFByb2Nlc3MgaXMgYmFzZWQgb24pLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJyb2xlcyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIGxvd2VyQm91bmQ9IjEiIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vUm9sZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJEb21haW4iIGVTdXBlclR5cGVzPSIjLy9Db250ZW50Q2F0ZWdvcnkiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkRvbWFpbiBpcyBhIHJlZmluZWFibGUgaGllcmFyY2h5IGdyb3VwaW5nIHJlbGF0ZWQgd29yayBwcm9kdWN0cy4gIEluIG90aGVyIHdvcmRzLCBEb21haW5zIGNhbiBiZSBmdXJ0aGVyIGRpdmlkZWQgaW50byBzdWItZG9tYWlucywgd2l0aCB3b3JrIHByb2R1Y3QgZWxlbWVudHMgdG8gYmUgY2F0ZWdvcml6ZWQgb25seSBhdCB0aGUgbGVhZi1sZXZlbCBvZiB0aGlzIGhpZXJhcmNoeS4mI3hEOyYjeEE7RG9tYWluIGlzIGEgbG9naWNhbCBncm91cGluZyBvZiB3b3JrIHByb2R1Y3RzIHRoYXQgaGF2ZSBhbiBhZmZpbml0eSB0byBlYWNoIG90aGVyIGJhc2VkIG9uIHJlc291cmNlcywgdGltaW5nLCBvciByZWxhdGlvbnNoaXAuICBBIERvbWFpbiBtYXkgYmUgZGl2aWRlZCBpbnRvIHN1YmRvbWFpbnMuICBGb3IgZXhhbXBsZSwgR1MgTWV0aG9kIHVzZXMgc2l4IHByZWRlZmluZWQgRG9tYWlucyBmb3IgV29yayBQcm9kdWN0czogQXBwbGljYXRpb24sIEFyY2hpdGVjdHVyZSwgQnVzaW5lc3MsIEVuZ2FnZW1lbnQsIE9wZXJhdGlvbnMgYW5kIE9yZ2FuaXphdGlvbi4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0id29ya1Byb2R1Y3RzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Xb3JrUHJvZHVjdCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJzdWJkb21haW5zIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Eb21haW4iIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IldvcmtQcm9kdWN0VHlwZSIgZVN1cGVyVHlwZXM9IiMvL0NvbnRlbnRDYXRlZ29yeSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV29yayBQcm9kdWN0IFR5cGUgaXMgYSBzZWNvbmQgY2F0ZWdvcnkgZm9yIHdvcmsgcHJvZHVjdHMsIHdoaWNoIGluIGNvbnRyYXN0IHRvIERvbWFpbiBpcyBtb3JlIHByZXNlbnRhdGlvbiBvcmllbnRlZC4gIEEgd29yayBwcm9kdWN0IGNhbiBoYXZlIG1hbnkgV29yayBQcm9kdWN0IFR5cGVzLiAgRXhhbXBsZXMsIGZvciBhIFdvcmsgUHJvZHVjdCBUeXBlIGlzICZxdW90O0NsYXNzIERpYWdyYW0mcXVvdDssIHdoaWNoIGNhdGVnb3JpemVzIHRoZSBBcnRpZmFjdHMgQW5hbHlzaXMgTW9kZWwsIERlc2lnbiBNb2RlbCwgVXNlciBFeHBlcmllbmNlIE1vZGVsLCBvciAmcXVvdDtTcGVjaWZpY2F0aW9uJnF1b3Q7LCB3aGljaCBjYXRlZ29yaXplcyByZXF1aXJlbWVudHMgc3BlY2lmaWNhdGlvbnMgdGhhdCBkZWZpbmUgYSBzeXN0ZW0gd2l0aCBhIHdlbGwtZGVmaW5lZCBzeXN0ZW0gYm91bmRhcnksIHN1Y2ggYXMgdXNlIGNhc2Ugb3IgZnVuY3Rpb25hbCByZXF1aXJlbWVudHMgc3BlY2lmaWNhdGlvbi4gIEEgV29yayBQcm9kdWN0IGNhbiBiZSBjYXRlZ29yaXplZCB0byBiZSBvZiBtYW55IFdvcmsgUHJvZHVjdCBUeXBlcy4gIEZvciBleGFtcGxlLCBhIHVzZSBjYXNlIG1vZGVsIGNhbiBiZSBjYXRlZ29yaXplZCBhcyBhIFNwZWNpZmljYXRpb24gYXMgd2VsbCBhcyBEaWFncmFtIFdvcmsgUHJvZHVjdCBUeXBlLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ3b3JrUHJvZHVjdHMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1dvcmtQcm9kdWN0Ii8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkRpc2NpcGxpbmVHcm91cGluZyIgZVN1cGVyVHlwZXM9IiMvL0NvbnRlbnRDYXRlZ29yeSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRGlzY2lwbGluZSBHcm91cGluZ3MgYXJlIHVzZWQgdG8gZ3JvdXAgRGlzY2lwbGluZXMuICBGb3IgZXhhbXBsZSwgdGhlIERpc2NpcGxpbmUgR3JvdXBpbmcgJnF1b3Q7U29mdHdhcmUgRGlzY2lwbGluZXMmcXVvdDsgd291bGQgYmUgdGhlIGdyb3VwIG9mIGFsbCBkaXNjaXBsaW5lcyByZWxhdGVkIHRvIGRldmVsb3Bpbmcgc29mdHdhcmUgc3VjaCBhcyAmcXVvdDtSZXF1aXJlbWVudHMgTWFuYWdlbWVudCZxdW90OyBvciAmcXVvdDtUZXN0aW5nJnF1b3Q7OyAmcXVvdDtJVCBJbmZyYXN0cnVjdHVyZSBNYW5hZ2VtZW50JnF1b3Q7IHdvdWxkIGJlIGEgRGlzY2lwbGluZXMgR3JvdXBpbmcgZm9yIGRpc2NpcGxpbmVzIHN1Y2ggYXMgJnF1b3Q7SVQgT3BlcmF0aW9uYWwgU2VydmljZXMmcXVvdDssICZxdW90O0lUIEN1c3RvbWVyIFJlbGF0aW9uc2hpcHMmcXVvdDssIG9yICZxdW90O0lUIEVuYWJsaW5nIFNlcnZpY2VzJnF1b3Q7LiAgRGlzY2lwbGluZXMgY2FuIGJlIGFzc29jaWF0ZWQgdG8gbW9yZSB0aGFuIG9uZSBEaXNjaXBsaW5lIEdyb3VwaW5nLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJkaXNjaXBsaW5lcyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vRGlzY2lwbGluZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJUb29sIiBlU3VwZXJUeXBlcz0iIy8vQ29udGVudENhdGVnb3J5Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIFRvb2wgaXMgYSBjb250YWluZXIvYWdncmVnYXRlIGZvciBUb29sTWVudG9ycy4gIEl0IGNhbiBhbHNvIHByb3ZpZGUgZ2VuZXJhbCBkZXNjcmlwdGlvbnMgb2YgdGhlIHRvb2wgYW5kIGl0cyBnZW5lcmFsIGNhcGFiaWxpdGllcy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0idG9vbE1lbnRvcnMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICBsb3dlckJvdW5kPSIxIiB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1Rvb2xNZW50b3IiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUm9sZVNldEdyb3VwaW5nIiBlU3VwZXJUeXBlcz0iIy8vQ29udGVudENhdGVnb3J5Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJSb2xlIFNldHMgY2FuIGJlIGNhdGVnb3JpemVkIGludG8gUm9sZSBTZXQgR3JvdXBpbmdzLiAgRm9yIGV4YW1wbGUsIGRpZmZlcmVudCBtZXRob2RzIG1pZ2h0IGRlZmluZSBzaW1pbGFyIFJvbGUgU2V0cywgd2hpY2ggaG93ZXZlciBuZWVkIHRvIGJlIGRpc3Rpbmd1aXNoZWQgZnJvbSBlYWNoIG90aGVyIG9uIGEgZ2xvYmFsIHNjYWxlLiAgVGh1cywgUm9sZSBTZXQgR3JvdXBpbmdzIGFsbG93IGRpc3Rpbmd1aXNoaW5nLCBmb3IgZXhhbXBsZSwgU29mdHdhcmUgU2VydmljZXMgTWFuYWdlciBSb2xlIFNldHMgZnJvbSBTb2Z0d2FyZSBEZXZlbG9wbWVudCBPcmdhbml6YXRpb24gTWFuYWdlciBSb2xlIFNldHMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InJvbGVTZXRzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Sb2xlU2V0Ii8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkN1c3RvbUNhdGVnb3J5IiBlU3VwZXJUeXBlcz0iIy8vQ29udGVudENhdGVnb3J5Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIEN1c3RvbSBDYXRlZ29yeSBpcyBhIGNhdGVnb3J5IGludHJvZHVjZWQgYnkgYSBtZXRob2QgY29udGVudCBhdXRob3IgdG8gc3RydWN0dXJlIGFueSBudW1iZXIgb2YgbWV0aG9kIENvbnRlbnQgRWxlbWVudHMgb2YgYW55IHN1YnR5cGUgYmFzZWQgb24gdXNlci1kZWZpbmVkIGNyaXRlcmlhLiAgQmVjYXVzZSBDb250ZW50IENhdGVnb3JpZXMgKGFuZCB0aGVyZWZvcmUgQ3VzdG9tIENhdGVnb3JpZXMsIHRvbykgYXJlIENvbnRlbnQgRWxlbWVudHMgdGhlbXNlbHZlcywgQ3VzdG9tIENhdGVnb3JpZXMgY2FuIGJlIHVzZWQgdG8gcmVjdXJzaXZlbHkgY2F0ZWdvcml6ZSBDb250ZW50IENhdGVnb3JpZXMgYXMgd2VsbC4gIEN1c3RvbSBDYXRlZ29yaWVzIGNhbiBhbHNvIGJlIG5lc3RlZCB3aXRoIGFueSBDb250ZW50IENhdGVnb3J5LiAgQ3VzdG9tIGNhdGVnb3JpZXMgY2FuIGJlIHVzZWQgdG8gY2F0ZWdvcml6ZSBjb250ZW50IGJhc2VkIG9uIHRoZSB1c2VyJ3MgY3JpdGVyaWEgYXMgd2VsbCBhcyB0byBkZWZpbmUgd2hvbGUgdHJlZS1zdHJ1Y3R1cmVzIG9mIG5lc3RlZCBjYXRlZ29yaWVzIGFsbG93aW5nIHRoZSB1c2VyIHRvIHN5c3RlbWF0aWNhbGx5IG5hdmlnYXRlIGFuZCBicm93c2UgbWV0aG9kIGNvbnRlbnQgYW5kIHByb2Nlc3NlcyBiYXNlZCBvbiB0aGVzZSBjYXRlZ29yaWVzLiAgRm9yIGV4YW1wbGUsIG9uZSBjb3VsZCBjcmVhdGUgYSBjdXN0b20gY2F0ZWdvcnkgdG8gbG9naWNhbGx5IG9yZ2FuaXplIGNvbnRlbnQgcmVsZXZhbnQgZm9yIHRoZSB1c2VyJ3MgZGV2ZWxvcG1lbnQgb3JnYW5pemF0aW9uIGRlcGFydG1lbnRzOyBlLmcuIGEgJnF1b3Q7VGVzdGluZyZxdW90OyBjYXRlZ29yeSB0aGF0IGdyb3VwcyB0b2dldGhlciBhbGwgcm9sZXMsIHdvcmsgcHJvZHVjdHMsIHRhc2tzLCBhbmQgZ3VpZGFuY2UgZWxlbWVudCByZWxldmFudCB0byB0ZXN0aW5nLiAgQW5vdGhlciBleGFtcGxlIHdvdWxkIGJlIGNhdGVnb3JpZXMgdGhhdCBleHByZXNzIGxpY2Vuc2luZyBsZXZlbHMgb2YgdGhlIGNvbnRlbnQgZ3JvdXBpbmcgZnJlZWx5IGRpc3RyaWJ1dGFibGUgbWV0aG9kIGNvbnRlbnQgdmVyc3VzIGNvbnRlbnQgdGhhdCByZXByZXNlbnQgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGFuZCByZXF1aXJlcyBhIGxpY2Vuc2UgdG8gYmUgcHVyY2hhc2VkIHRvIGJlIGFibGUgdG8gdXNlIGl0LiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJjYXRlZ29yaXplZEVsZW1lbnRzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9EZXNjcmliYWJsZUVsZW1lbnQiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ic3ViQ2F0ZWdvcmllcyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vQ29udGVudENhdGVnb3J5Ii8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkRlbGl2ZXJ5UHJvY2VzcyIgZVN1cGVyVHlwZXM9IiMvL1Byb2Nlc3MiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgRGVsaXZlcnkgUHJvY2Vzc2VzIGlzIGEgc3BlY2lhbCBQcm9jZXNzIGRlc2NyaWJpbmcgYSBjb21wbGV0ZSBhbmQgaW50ZWdyYXRlZCBhcHByb2FjaCBmb3IgcGVyZm9ybWluZyBhIHNwZWNpZmljIHByb2plY3QgdHlwZS4gIEl0IGRlc2NyaWJlcyBhIGNvbXBsZXRlIHByb2plY3QgbGlmZWN5Y2xlIGVuZC10by1lbmQgYW5kIHNoYWxsIGJlIHVzZWQgYXMgYSByZWZlcmVuY2UgZm9yIHJ1bm5pbmcgcHJvamVjdHMgd2l0aCBzaW1pbGFyIGNoYXJhY3RlcmlzdGljcyBhcyBkZWZpbmVkIGZvciB0aGUgcHJvY2Vzcy4gIEEgRGVsaXZlcnkgUHJvY2VzcyBpcyByZWxhdGVkIHRvIHNwZWNpZmljIHN1cHBvcnRpbmcgaW5mb3JtYXRpb24gc3VjaCBhcyBSb2FkbWFwcyAoaW5oZXJpdGVkIHZpYSBBY3Rpdml0eSkgYXMgd2VsbCBhcyBDb21tdW5pY2F0aW9ucyBhbmQgRWR1Y2F0aW9uIE1hdGVyaWFsLiYjeEQ7JiN4QTtBIERlbGl2ZXJ5IFByb2Nlc3MgaXMgYSBQcm9jZXNzIHRoYXQgY292ZXJzIGEgd2hvbGUgZGV2ZWxvcG1lbnQgbGlmZWN5Y2xlIGZyb20gYmVnaW5uaW5nIHRvIGVuZC4gIEEgRGVsaXZlcnkgUHJvY2VzcyBzaGFsbCBiZSB1c2VkIGFzIGEgdGVtcGxhdGUgZm9yIHBsYW5uaW5nIGFuZCBydW5uaW5nIGEgcHJvamVjdC4gIEl0IHByb3ZpZGVzIGEgY29tcGxldGUgbGlmZWN5Y2xlIG1vZGVsIHdpdGggcHJlZGVmaW5lZCBwaGFzZXMsIGl0ZXJhdGlvbnMsIGFuZCBhY3Rpdml0aWVzIHRoYXQgaGF2ZSBiZWVuIGRldGFpbGVkIGJ5IHNlcXVlbmNpbmcgcmVmZXJlbmNpbmcgbWV0aG9kIGNvbnRlbnQgaW4gYnJlYWtkb3duIHN0cnVjdHVyZXMuICBJdCBpcyBkZWZpbmVkIG9uIHRoZSBiYXNpcyBvZiBleHBlcmllbmNlIHdpdGggcGFzdCBwcm9qZWN0cyBvciBlbmdhZ2VtZW50cywgYW5kL29yIHRoZSBiZXN0IHByYWN0aWNlIHVzZSBvZiBhIGRldmVsb3BtZW50IG9yIGRlbGl2ZXJ5IGFwcHJvYWNoLiAgSXQgZGVmaW5lcyB3aGF0IGdldHMgcHJvZHVjZWQsIGhvdyB0aG9zZSBpdGVtcyBhcmUgcHJvZHVjZWQsIGFuZCB0aGUgcmVxdWlyZWQgc3RhZmZpbmcgaW4gdGhlIGZvcm0gb2YgaW50ZWdyYXRlZCBXb3JrLCBXb3JrIFByb2R1Y3QsIGFuZCBUZWFtIEJyZWFrZG93biBTdHJ1Y3R1cmVzLiAgRm9yIGV4YW1wbGUsIGEgcHJvY2VzcyBlbmdpbmVlciBjYW4gZGVmaW5lIGFsdGVybmF0aXZlIERlbGl2ZXJ5IFByb2Nlc3NlcyBmb3Igc29mdHdhcmUgZGV2ZWxvcG1lbnQgcHJvamVjdHMgdGhhdCBkaWZmZXIgaW4gdGhlIHNjYWxlIG9mIHRoZSBlbmdhZ2VtZW50IGFuZCBzdGFmZmluZyBuZWNlc3NhcnksIHRoZSB0eXBlIG9mIHRoZSBzb2Z0d2FyZSBhcHBsaWNhdGlvbiB0byBiZSBkZXZlbG9wZWQsIHRoZSBkZXZlbG9wbWVudCBtZXRob2RzIGFuZCB0ZWNobm9sb2dpZXMgdG8gYmUgdXNlZCwgZXRjLiAgQWx0aG91Z2gsIHRoZSBEZWxpdmVyeSBQcm9jZXNzIGFpbXMgdG8gY292ZXIgYSB3aG9sZSBwcm9qZWN0IGl0IGtlZXBzIGNlcnRhaW4gZGVjaXNpb24gdGhhdCBhcmUgdG9vIHByb2plY3Qgc3BlY2lmaWMgb3Blbi4gIEZvciBleGFtcGxlLCB0aGUgYnJlYWtkb3duIHN0cnVjdHVyZSBkZWZpbmVzIHdoaWNoIEJyZWFrZG93biBFbGVtZW50cyBoYXZlIG11bHRpcGxlIG9jY3VycmVuY2VzIG9yIGlzIHJlcGVhdGFibGUgdmlhIGl0IHJlc3BlY3RpdmUgYXR0cmlidXRlcywgYnV0IGRvZXMgbm90IHNheSBob3cgbWFueSBvY2N1cnJlbmNlcyBhbmQgaG93IG1hbnkgcmVwZWF0cy9pdGVyYXRpb25zIGl0IHdpbGwgaGF2ZS4gIFRoZXNlIGRlY2lzaW9ucyBoYXZlIHRvIGJlIGRvbmUgYnkgYSBwcm9qZWN0IG1hbmFnZXIgd2hlbiBwbGFubmluZyBhIGNvbmNyZXRlIHByb2plY3QsIHByb2plY3QgcGhhc2UsIG9yIHByb2plY3QgaXRlcmF0aW9ucy4gIEEgRGVsaXZlcnkgUHJvY2VzcyBpcyBhbHdheXMgYSBjb21wbGV0ZSBkZXNjcmlwdGlvbiBvZiBhIHByb2Nlc3MgaW4gdGVybXMgb2YgY29tcGxldGVuZXNzIG9mIHRoZSBsaWZlY3ljbGUsIGFzIHdlbGwgYXMgaW4gdGVybXMgb2YgYWxsIHRocmVlIHZpZXdzIG9uIHRoZSBwcm9jZXNzIHdoaWNoIGFyZSB0aGUgV29yayBCcmVha2Rvd24gU3RydWN0dXJlLCBXb3JrIFByb2R1Y3QgQnJlYWtkb3duIFN0cnVjdHVyZSwgYW5kIFRlYW0gQnJlYWtkb3duIFN0cnVjdHVyZSBoYXZlIHRvIGJlIGZ1bGx5IGFuZCBjb25zaXN0ZW50bHkgcG9wdWxhdGVkLiAgQ29uc2lzdGVuY3kgb2YgYSBEZWxpdmVyeSBQcm9jZXNzIGlzIGFjdHVhbGx5IGVuc3VyZWQgYnkgdGhlIGZhY3QgdGhhdCBhbGwgdGhyZWUgYnJlYWtkb3ducyBhcmUgcmVwcmVzZW50ZWQgYnkgb25lIHNpbmdsZSBkYXRhIHN0cnVjdHVyZSBhbmQgb25lIHBhcnRpY3VsYXIgYnJlYWtkb3duIHN1Y2ggYXMgVGVhbSBCcmVha2Rvd24gaXMganVzdCBhIHZpZXcgb24gdGhhdCBkYXRhIHN0cnVjdHVyZS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZWR1Y2F0aW9uTWF0ZXJpYWxzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9TdXBwb3J0aW5nTWF0ZXJpYWwiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iY29tbXVuaWNhdGlvbnNNYXRlcmlhbHMiCi0gICAgICAgIG9yZGVyZWQ9ImZhbHNlIiB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1N1cHBvcnRpbmdNYXRlcmlhbCIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQcm9jZXNzIiBhYnN0cmFjdD0idHJ1ZSIgZVN1cGVyVHlwZXM9IiMvL0FjdGl2aXR5Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIFByb2Nlc3MgaXMgYSBzcGVjaWFsIEFjdGl2aXR5IHRoYXQgZGVzY3JpYmVzIGEgc3RydWN0dXJlIGZvciBwYXJ0aWN1bGFyIHR5cGVzIG9mIGRldmVsb3BtZW50IHByb2plY3RzLiAgVG8gcGVyZm9ybSBzdWNoIGEgZGV2ZWxvcG1lbnQgcHJvamVjdCBhIFByb2Nlc3NlcyB3b3VsZCBiZSAnaW5zdGFudGlhdGVkJyBhbmQgYWRhcHRlZCBmb3IgdGhlIHNwZWNpZmljIHNpdHVhdGlvbi4gIFByb2Nlc3MgaXMgYW4gYWJzdHJhY3QgY2xhc3MgYW5kIHRoaXMgbWV0YS1tb2RlbCBkZWZpbmVzIGRpZmZlcmVudCBzcGVjaWFsIHR5cGVzIG9mIFByb2Nlc3NlcyBmb3IgZGlmZmVyZW50IHByb2Nlc3MgbWFuYWdlbWVudCBhcHBsaWNhdGlvbnMgYW5kIGRpZmZlcmVudCBzaXR1YXRpb25zIG9mIHByb2Nlc3MgcmV1c2UuICBFdmVyeSBQcm9jZXNzIGNvbXByaXNlcyBvZiBhbmQgaXMgdGhlIHRvcC1sZXZlbCBlbGVtZW50IG9mIGFuIG4tbGV2ZWwgYnJlYWtkb3duIHN0cnVjdHVyZSB1c2luZyB0aGUgTmVzdGluZyBhc3NvY2lhdGlvbiBkZWZpbmVkIG9uIEFjdGl2aXR5LiYjeEQ7JiN4QTtDb3JlIE1ldGhvZCBDb250ZW50IHByb3ZpZGVzIHN0ZXAtYnktc3RlcCBleHBsYW5hdGlvbnMsIGRlc2NyaWJpbmcgaG93IHZlcnkgc3BlY2lmaWMgZGV2ZWxvcG1lbnQgZ29hbHMgYXJlIGFjaGlldmVkIGluZGVwZW5kZW50IG9mIHRoZSBwbGFjZW1lbnQgb2YgdGhlc2Ugc3RlcHMgd2l0aGluIGEgZGV2ZWxvcG1lbnQgbGlmZWN5Y2xlLiAgUHJvY2Vzc2VzIHRha2UgdGhlc2UgbWV0aG9kIGVsZW1lbnRzIGFuZCByZWxhdGUgdGhlbSBpbnRvIHNlbWktb3JkZXJlZCBzZXF1ZW5jZXMgdGhhdCBhcmUgY3VzdG9taXplZCB0byBzcGVjaWZpYyB0eXBlcyBvZiBwcm9qZWN0cy4gIFRodXMsIGEgcHJvY2VzcyBpcyBhIHNldCBvZiBwYXJ0aWFsbHkgb3JkZXJlZCB3b3JrIGRlc2NyaXB0aW9ucyBpbnRlbmRlZCB0byByZWFjaCBhIGhpZ2hlciBkZXZlbG9wbWVudCBnb2FsLCBzdWNoIGFzIHRoZSByZWxlYXNlIG9mIGEgc3BlY2lmaWMgc29mdHdhcmUgc3lzdGVtLiAgQSBwcm9jZXNzIGFuZCB0aGUgcHJvY2VzcyBtZXRhLW1vZGVsIHN0cnVjdHVyZSBkZWZpbmVkIGluIHRoaXMgc3BlY2lmaWNhdGlvbiBmb2N1c2VzIG9uIHRoZSBsaWZlY3ljbGUgYW5kIHRoZSBzZXF1ZW5jaW5nIG9mIHdvcmsgaW4gYnJlYWtkb3duIHN0cnVjdHVyZXMuICBUbyBhY2hpZXZlIHRoaXMgaXQgdXNlcyB0aGUgRGVzY3JpcHRvciBjb25jZXB0IHJlZmVyZW5jaW5nIG1ldGhvZCBjb250ZW50IGFuZCBhbGxvd2luZyBkZWZpbmluZyB0aW1lLXNwZWNpZmljIGN1c3RvbWl6YXRpb25zIG9mIHRoZSByZWZlcmVuY2VkIGNvbnRlbnQgKGUuZy4gZGVmaW5pbmcgYSBmb2N1cyBvbiBkaWZmZXJlbnQgc3RlcHMgb2YgdGhlIHNhbWUgVGFzayBhbmQgcHJvdmlkaW5nIGlucHV0IFdvcmsgUHJvZHVjdHMgaW4gZGlmZmVyZW50IHN0YXRlcyB3aXRoaW4gdGhlIGRpZmZlcmVudCBQaGFzZXMgb2YgYSBwcm9jZXNzIGxpZmVjeWNsZSBpbiB3aGljaCB0aGUgc2FtZSBUYXNrIGlzIHBlcmZvcm1lZCkuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImluY2x1ZGVzUGF0dGVybnMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0NhcGFiaWxpdHlQYXR0ZXJuIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImRlZmF1bHRDb250ZXh0IiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iIy8vTWV0aG9kQ29uZmlndXJhdGlvbiIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ2YWxpZENvbnRleHQiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL01ldGhvZENvbmZpZ3VyYXRpb24iLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQ2FwYWJpbGl0eVBhdHRlcm4iIGVTdXBlclR5cGVzPSIjLy9Qcm9jZXNzIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIENhcGFiaWxpdHkgUGF0dGVybiBpcyBhIHNwZWNpYWwgUHJvY2VzcyB0aGF0IGRlc2NyaWJlcyBhIHJldXNhYmxlIGNsdXN0ZXIgb2YgZG9pbmcgd29yayBpbiBjb21tb24gcHJvY2VzcyBhcmVhcy4gIENhcGFiaWxpdGllcyBQYXR0ZXJucyBleHByZXNzIGFuZCBjb21tdW5pY2F0ZSBwcm9jZXNzIGtub3dsZWRnZSBmb3IgYSBrZXkgYXJlYSBvZiBpbnRlcmVzdCBzdWNoIGFzIGEgRGlzY2lwbGluZSBhbmQgY2FuIGJlIGRpcmVjdGx5IHVzZWQgYnkgcHJvY2VzcyBwcmFjdGl0aW9uZXIgdG8gZ3VpZGUgaGlzIHdvcmsuICBUaGV5IGFyZSBhbHNvIHVzZWQgYXMgYnVpbGRpbmcgYmxvY2tzIHRvIGFzc2VtYmxlIERlbGl2ZXJ5IFByb2Nlc3NlcyBvciBsYXJnZXIgQ2FwYWJpbGl0eSBQYXR0ZXJucyBlbnN1cmluZyBvcHRpbWFsIHJldXNlIGFuZCBhcHBsaWNhdGlvbiBvZiB0aGUga2V5IHByYWN0aWNlcyB0aGV5IGV4cHJlc3MuJiN4RDsmI3hBO0EgQ2FwYWJpbGl0eSBQYXR0ZXJuIGlzIGEgc3BlY2lhbCBQcm9jZXNzIHRoYXQgZGVzY3JpYmVzIGEgcmV1c2FibGUgY2x1c3RlciBvZiBkb2luZyB3b3JrIGluIGEgZ2VuZXJhbCBwcm9jZXNzIGFyZWEgdGhhdCBwcm92aWRlcyBhIGNvbnNpc3RlbnQgZGV2ZWxvcG1lbnQgYXBwcm9hY2ggdG8gY29tbW9uIHByb2JsZW1zLiAgRXhhbXBsZXMgZm9yIENhcGFiaWxpdHkgUGF0dGVybiBjb3VsZCBiZSAndXNlIGNhc2UtYmFzZWQgcmVxdWlyZW1lbnRzIG1hbmFnZW1lbnQnLCAndXNlIGNhc2UgYW5hbHlzaXMnLCBvciAndW5pdCB0ZXN0aW5nJy4gVHlwaWNhbGx5IGJ1dCBub3QgbmVjZXNzYXJpbHksIENhcGFiaWxpdHkgUGF0dGVybnMgaGF2ZSB0aGUgc2NvcGUgb2Ygb25lIGRpc2NpcGxpbmUgcHJvdmlkaW5nIGEgYnJlYWtkb3duIG9mIHJldXNhYmxlIGNvbXBsZXggQWN0aXZpdGllcywgcmVsYXRpb25zaGlwcyB0byB0aGUgUm9sZXMgd2hpY2ggcGVyZm9ybSBUYXNrcyB3aXRoaW4gdGhlc2UgQWN0aXZpdGllcywgYXMgd2VsbCBhcyB0byB0aGUgV29yayBQcm9kdWN0cyB0aGF0IGFyZSB1c2VkIGFuZCBwcm9kdWNlZC4gIEEgY2FwYWJpbGl0eSBwYXR0ZXJuIGRvZXMgbm90IHJlbGF0ZSB0byBhbnkgc3BlY2lmaWMgcGhhc2Ugb3IgaXRlcmF0aW9uIG9mIGEgZGV2ZWxvcG1lbnQgbGlmZWN5Y2xlLCBhbmQgc2hvdWxkIG5vdCBpbXBseSBhbnkuICBJbiBvdGhlciB3b3JkcywgYSBwYXR0ZXJuIHNob3VsZCBiZSBkZXNpZ25lZCBpbiBhIHdheSB0aGF0IGl0IGlzIGFwcGxpY2FibGUgYW55d2hlcmUgaW4gYSBEZWxpdmVyeSBQcm9jZXNzLiAgVGhpcyBlbmFibGVzIGl0cyBBY3Rpdml0aWVzIHRvIGJlIGZsZXhpYmx5IGFzc2lnbmVkIHRvIHdoYXRldmVyIHBoYXNlcyB0aGVyZSBhcmUgaW4gdGhlIERlbGl2ZXJ5IFByb2Nlc3MgdG8gd2hpY2ggaXQgaXMgYmVpbmcgYXBwbGllZC4gIEl0IGlzIGEgZ29vZCBwcmFjdGljZSB0byBkZXNpZ24gYSBDYXBhYmlsaXR5IFBhdHRlcm4gdG8gcHJvZHVjZSBvbmUgb3IgbW9yZSBnZW5lcmljIERlbGl2ZXJhYmxlcy4gIFRoZSB0eXBpY2FsIGNvbmZpZ3VyYXRpb24gaXMgdGhhdCBlYWNoIEFjdGl2aXR5IGluIHRoZSBDYXBhYmlsaXR5IFBhdHRlcm4gcHJvZHVjZXMgb25lIERlbGl2ZXJhYmxlLCBhbmQgdGhlIGxhc3QgVGFzayBEZXNjcmlwdG9yIGluIHRoZSBBY3Rpdml0eSBleHBsaWNpdGx5IG91dHB1dHMganVzdCB0aGlzIERlbGl2ZXJhYmxlLiAgVGhpcyBlbmFibGVzIHRoZSBwcm9jZXNzIGVuZ2luZWVyIHRvIHNlbGVjdCBQYXR0ZXJucyBvciBqdXN0IEFjdGl2aXRpZXMgYnkgZGVjaWRpbmcgd2hpY2ggRGVsaXZlcmFibGVzIGFyZSByZXF1aXJlZC4gIEl0IGFsc28gb2ZmZXJzIGEgc2ltcGxlIGludGVncmF0aW9uIGFwcHJvYWNoOiBhbiBBY3Rpdml0eSBmcm9tIGEgY2FwYWJpbGl0eSBwYXR0ZXJuIGlzIGxpbmtlZCB0byB0aGUgUGhhc2Ugb3IgSXRlcmF0aW9uIHdoaWNoIGlzIHJlcXVpcmVkIHRvIHByb2R1Y2UgdGhlIEFjdGl2aXR5J3MgRGVsaXZlcmFibGUuICBLZXkgYXBwbGljYXRpb25zIGFyZWFzIG9mIC8gYXJlYXMgb2YgcmV1c2UgZm9yIENhcGFiaWxpdHkgUGF0dGVybnMgYXJlOiYjeEQ7JiN4QTstIFRvIHNlcnZlIGFzIGJ1aWxkaW5nIGJsb2NrcyBmb3IgYXNzZW1ibGluZyBEZWxpdmVyeSBQcm9jZXNzZXMgb3IgbGFyZ2VyIENhcGFiaWxpdHkgUGF0dGVybnMuICBOb3JtYWxseSBkZXZlbG9waW5nIGEgRGVsaXZlcnkgUHJvY2VzcyBpcyBub3QgZG9uZSBmcm9tIHNjcmF0Y2ggYnV0IGJ5IHN5c3RlbWF0aWNhbGx5IGFwcGx5aW5nIGFuZCBiaW5kaW5nIHBhdHRlcm5zLiAgSW4gYWRkaXRpb24gdG8gdGhlIHN0YW5kYXJkIHBhdHRlcm4gYXBwbGljYXRpb24gb2YgJ2NvcHktYW5kLW1vZGlmeScsIHdoaWNoIGFsbG93cyB0aGUgcHJvY2VzcyBlbmdpbmVlciB0byBpbmRpdmlkdWFsbHkgY3VzdG9taXplIHRoZSBwYXR0ZXJuJ3MgY29udGVudCB0byB0aGUgcGFydGljdWxhciBzaXR1YXRpb24gaXQgaXMgYXBwbGllZCBmb3IsIHRoZSBQbHVnaW4gbWV0YS1tb2RlbCBwYWNrYWdlIChTZWN0aW9uIDYuMSkgaW50cm9kdWNlcyBldmVuIG1vcmUgc29waGlzdGljYXRlZCBpbmhlcml0YW5jZSByZWxhdGlvbnNoaXBzIHRoYXQgc3VwcG9ydCBkeW5hbWljIGJpbmRpbmcgb2YgcGF0dGVybnMgKGkuZS4gdGhlIHBhdHRlcm4gaXMgcmVmZXJlbmNlZCBhbmQgbm90IGNvcGllZCkuICBUaGlzIHVuaXF1ZSBuZXcgd2F5IG9mIHJldXNpbmcgcHJvY2VzcyBrbm93bGVkZ2UgYWxsb3dzIHRvIGZhY3RvciBvdXQgY29tbW9ubHkgcmVvY2N1cnJpbmcgQWN0aXZpdGllcyBpbnRvIHBhdHRlcm5zIGFuZCB0byBhcHBseSB0aGVtIG92ZXIgYW5kIG92ZXIgYWdhaW4gZm9yIGEgcHJvY2Vzcy4gIFdoZW4gdGhlIHBhdHRlcm4gaXMgYmVpbmcgcmV2aXNlZCBvciB1cGRhdGVkLCBhbGwgY2hhbmdlcyB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgcmVmbGVjdGVkIGluIGFsbCBwYXR0ZXJuIGFwcGxpY2F0aW9uIGluIGFsbCBwcm9jZXNzZXMgYmVjYXVzZSBvZiB0aGUgZHluYW1pYyBiaW5kaW5nLiYjeEQ7JiN4QTstIFRvIHN1cHBvcnQgZGlyZWN0IGV4ZWN1dGlvbiBpbiBhIGRldmVsb3BtZW50IHByb2plY3QgdGhhdCBkb2VzIG5vdCB3b3JrIGZvbGxvd2luZyBhIHdlbGwtZGVmaW5lZCBwcm9jZXNzLCBidXQgd29ya3MgYmFzZWQgb24gbG9vc2VseSBjb25uZWN0ZWQgcHJvY2VzcyBmcmFnbWVudHMgb2YgYmVzdCBwcmFjdGljZXMgaW4gYSBmbGV4aWJsZSBtYW5uZXIgKGUuZy4gQWdpbGUgRGV2ZWxvcG1lbnQpLiYjeEQ7JiN4QTstIFRvIHN1cHBvcnQgcHJvY2VzcyBlZHVjYXRpb24gYnkgZGVzY3JpYmluZyBrbm93bGVkZ2UgZm9yIGEga2V5IGFyZWEgc3VjaCBhcyBiZXN0IHByYWN0aWNlcyBvbiBob3cgdG8gcGVyZm9ybSB0aGUgd29yayBmb3IgYSBEaXNjaXBsaW5lIChlLmcuIFJlcXVpcmVtZW50cyBNYW5hZ2VtZW50KSwgZm9yIGEgc3BlY2lmaWMgZGV2ZWxvcG1lbnQgdGVjaG5pcXVlIChhc3BlY3Qtb3JpZW50ZWQgZGV2ZWxvcG1lbnQpLCBvciBhIHNwZWNpZmljIHRlY2huaWNhbCBhcmVhIChlLmcuIHJlbGF0aW9uYWwgZGF0YWJhc2UgZGVzaWduKSwgd2hpY2ggaXMgdXNlZCBmb3IgZWR1Y2F0aW9uIGFuZCB0ZWFjaGluZy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUiIGVTdXBlclR5cGVzPSIjLy9Qcm9jZXNzIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIFByb2Nlc3MgUGxhbm5pbmcgVGVtcGxhdGUgaXMgYSBzcGVjaWFsIFByb2Nlc3MgdGhhdCBpcyBwcmVwYXJlZCBmb3IgaW5zdGFudGlhdGlvbiBieSBhIHByb2plY3QgcGxhbm5pbmcgdG9vbC4gIFR5cGljYWxseSwgaXQgaXMgY3JlYXRlZCBiYXNlZCBvbiBhIFByb2Nlc3Mgc3VjaCBhcyBhIERlbGl2ZXJ5IFByb2Nlc3MgYXMgYSB3aG9sZSAoZS5nLiBpbiBjYXNlIG9mIGEgd2F0ZXJmYWxsLWJhc2VkIGRldmVsb3BtZW50IGFwcHJvYWNoKSBvciBpbiBwYXJ0cyAoZS5nLiBpbiBjYXNlIG9mIGFuIGl0ZXJhdGl2ZSBkZXZlbG9wbWVudCBhcHByb2FjaCkuJiN4RDsmI3hBO0EgUHJvY2VzcyBQbGFubmluZyBUZW1wbGF0ZSByZXByZXNlbnRzIGEgcGFydGlhbGx5IGZpbmlzaGVkIHBsYW4gZm9yIGEgY29uY3JldGUgcHJvamVjdC4gIEl0IHVzZXMgdGhlIHNhbWUgaW5mb3JtYXRpb24gc3RydWN0dXJlcyBhcyBhbGwgb3RoZXIgUHJvY2VzcyBUeXBlcyB0byByZXByZXNlbnQgdGVtcGxhdGVzIGZvciBwcm9qZWN0IHBsYW5zLiAgSG93ZXZlciwgY2VydGFpbiBwbGFubmluZyBkZWNpc2lvbnMgaGF2ZSBhbHJlYWR5IGJlZW4gYXBwbGllZCB0byB0aGUgdGVtcGxhdGUgYXMgd2VsbCBhcyBpbmZvcm1hdGlvbiBoYXMgYmVlbiByZW1vdmVkIGFuZC9vciByZWZvcm1hdHRlZCB0byBiZSByZWFkeSBmb3IgZXhwb3J0IHRvIGEgc3BlY2lmaWMgcGxhbm5pbmcgdG9vbC4gIEV4YW1wbGVzIGZvciBzdWNoIGRlY2lzaW9ucyBhcmU6IGEgdGVtcGxhdGUgaGFzIGJlZW4gY3JlYXRlZCB0byByZXByZXNlbnQgYSBwbGFuIGZvciBhIHBhcnRpY3VsYXIgSXRlcmF0aW9uIGluIGFuIGl0ZXJhdGl2ZSBkZXZlbG9wbWVudCBwcm9qZWN0LCB3aGljaCBmciBleGFtcGxlIGRpc3Rpbmd1aXNoZXMgZWFybHkgZnJvbSBsYXRlIGl0ZXJhdGlvbnMgaW4gdGhlIEVsYWJvcmF0aW9uIHBoYXNlIG9mIGEgcHJvamVjdDsgaWYgdGhlIHRhcmdldGVkIHBsYW5uaW5nIHRvb2wgY2Fubm90IHJlcHJlc2VudCBpbnB1dCBhbmQgb3V0cHV0IG9mIFRhc2ssIHRoZW4gdGhlc2UgaGF2ZSBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgc3RydWN0dXJlOyBjZXJ0YWluIHJlcGV0aXRpb25zIGhhdmUgYmVlbiBhbHJlYWR5IGFwcGxpZWQsIGUuZy4gc3RhdGluZyB0aGF0IGEgY3ljbGUgb2Ygc3BlY2lmaWMgVGFzayBncm91cGVkIGluIGFuIEFjdGl2aXR5IGhhdmUgdG8gYmUgcmVwZWF0ZWQgbi10aW1lczsgZXRjLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJiYXNlZE9uUHJvY2Vzc2VzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Qcm9jZXNzIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlJvYWRtYXAiIGVTdXBlclR5cGVzPSIjLy9HdWlkYW5jZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBSb2FkbWFwIGlzIGEgc3BlY2lhbCBHdWlkYW5jZSBUeXBlIHdoaWNoIGlzIG9ubHkgcmVsYXRlZCB0byBBY3RpdmF0ZXMgYW5kIHRoZXJlZm9yZSBoYXMgYmVlbiBhZGRlZCBieSB0aGlzIHBhY2thZ2UgdG8gdGhlIGxpc3Qgb2YgR3VpZGFuY2UgVHlwZXMgcmF0aGVyIHRoYW4gbGlzdGVkIGluIHRoZSBHdWlkYW5jZSBUeXBlcyBwYWNrYWdlLiAgQSBSb2FkbWFwIHJlcHJlc2VudHMgYSBsaW5lYXIgd2Fsa3Rocm91Z2ggb2YgYW4gQWN0aXZpdHksIHR5cGljYWxseSBhIFByb2Nlc3MuJiN4RDsmI3hBO0FuIGluc3RhbmNlIG9mIGEgUm9hZG1hcCByZXByZXNlbnRzIGltcG9ydGFudCBkb2N1bWVudGF0aW9uIGZvciB0aGUgQWN0aXZpdHkgb3IgUHJvY2VzcyBpdCBpcyByZWxhdGVkIHRvLiAgT2Z0ZW4gYSBjb21wbGV4IEFjdGl2aXR5IHN1Y2ggYXMgYSBQcm9jZXNzIGNhbiBiZSBtdWNoIGVhc2llciB1bmRlcnN0b29kIGJ5IHByb3ZpZGluZyBhIHdhbGt0aHJvdWdoIHdpdGggYSBsaW5lYXIgdGhyZWFkIG9mIGEgdHlwaWNhbCBpbnN0YW50aWF0aW9uIG9mIHRoaXMgQWN0aXZpdHkuICBJbiBhZGRpdGlvbiB0byBtYWtpbmcgdGhlIHByb2Nlc3MgcHJhY3RpdGlvbmVyIHVuZGVyc3RhbmQgaG93IHdvcmsgaW4gdGhlIHByb2Nlc3MgaXMgYmVpbmcgcGVyZm9ybWVkLCBhIFJvYWRtYXAgcHJvdmlkZXMgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCBob3cgQWN0aXZpdGllcyBhbmQgVGFza3MgcmVsYXRlIHRvIGVhY2ggb3RoZXIgb3ZlciB0aW1lLiAgUm9hZG1hcHMgYXJlIGFsc28gdXNlZCB0byBzaG93IGhvdyBzcGVjaWZpYyBhc3BlY3RzIGFyZSBkaXN0cmlidXRlZCBvdmVyIGEgd2hvbGUgcHJvY2VzcyBwcm92aWRpbmcgYSBraW5kIG9mIGZpbHRlciBvbiB0aGUgcHJvY2VzcyBmb3IgdGhpcyBpbmZvcm1hdGlvbi4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUHJvY2Vzc0NvbXBvbmVudCIgZVN1cGVyVHlwZXM9IiMvL1Byb2Nlc3NQYWNrYWdlICMvL01ldGhvZFVuaXQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgUHJvY2VzcyBDb21wb25lbnQgaXMgYSBzcGVjaWFsIFByb2Nlc3MgUGFja2FnZSB0aGF0IGFwcGxpZXMgdGhlIHByaW5jaXBsZXMgb2YgZW5jYXBzdWxhdGlvbi4gIEEgUHJvY2VzcyBDb21wb25lbnQgcmVhbGl6ZXMgb25lIG9yIG1vcmUgSW50ZXJmYWNlcyB3aGljaCBzcGVjaWZ5IGlucHV0cyBhbmQgb3V0cHV0cyBvZiB0aGUgY29tcG9uZW50LiBUaGVyZSBtaWdodCBiZSBtYW55IGNvbXBvbmVudHMgcmVhbGl6aW5nIHRoZSBzYW1lIGludGVyZmFjZXMsIGJ1dCB1c2luZyBkaWZmZXJlbnQgdGVjaG5pcXVlcyB0byBhY2hpZXZlIHNpbWlsYXIgb3V0cHV0cyBmb3Igc2ltaWxhciBpbnB1dHMuICBXaGVyZWFzIHRoZSBDb21wb25lbnQgSW50ZXJmYWNlcyByZXByZXNlbnQgY29tcG9uZW50IHNwZWNpZmljYXRpb25zIChibGFjayBib3ggZGVzY3JpcHRpb25zIG9mIHRoZSBjb21wb25lbnQpLCBnb29kIGNhbmRpZGF0ZXMgZm9yIGNvbXBvbmVudCByZWFsaXphdGlvbnMgY2FuIGJlIGZvdW5kIGluIENhcGFiaWxpdHkgUGF0dGVybnMgKHdoaXRlIGJveCBkZXNjcmlwdGlvbnMgZm9yIHRoZSBjb21wb25lbnQpLiYjeEQ7JiN4QTtVTUEgc3VwcG9ydHMgcmVwbGFjZWFibGUgYW5kIHJldXNhYmxlIFByb2Nlc3MgQ29tcG9uZW50cyByZWFsaXppbmcgdGhlIHByaW5jaXBsZXMgb2YgZW5jYXBzdWxhdGlvbi4gQ2VydGFpbiBzaXR1YXRpb25zIGluIGEgc29mdHdhcmUgZGV2ZWxvcG1lbnQgcHJvamVjdCBtaWdodCByZXF1aXJlIHRoYXQgY29uY3JldGUgcmVhbGl6YXRpb25zIG9mIHBhcnRzIG9mIHRoZSBwcm9jZXNzIHJlbWFpbiB1bmRlY2lkZWQgb3Igd2lsbCBiZSBkZWNpZGVkIGJ5IHRoZSBleGVjdXRpbmcgdGVhbSBpdHNlbGYgKGUuZy4gaW4gb3V0c291cmNpbmcgc2l0dWF0aW9ucykuICBVTUEgcHJvdmlkZXMgYSB1bmlxdWUgY29tcG9uZW50IGNvbmNlcHQgZGVmaW5pbmcgaW50ZXJmYWNlcyBmb3Igd29yayBwcm9kdWN0IGlucHV0IGFuZCBvdXRwdXQsIGFsbG93aW5nIHRyZWF0aW5nIHRoZSBhY3R1YWwgZGVmaW5pdGlvbiBvZiB0aGUgd29yayB0aGF0IHByb2R1Y2VzIHRoZSBvdXRwdXRzIGFzIGEgJnF1b3Q7YmxhY2sgYm94JnF1b3Q7LiAgQXQgYW55IHBvaW50IGR1cmluZyBhIHByb2plY3QgdGhlIGNvbXBvbmVudCAmcXVvdDtyZWFsaXphdGlvbiZxdW90OyBkZXRhaWxpbmcgdGhlIHdvcmsgY2FuIGJlIGFkZGVkIHRvIHRoZSBwcm9jZXNzLiAgVGhlIGNvbXBvbmVudCBhcHByb2FjaCBhbHNvIGFsbG93cyB0aGF0IGRpZmZlcmVudCBzdHlsZXMgb3IgdGVjaG5pcXVlcyBvZiBkb2luZyB3b3JrIGNhbiBiZSByZXBsYWNlZCB3aXRoIG9uZSBhbm90aGVyLiAgRm9yIGV4YW1wbGUsIGEgc29mdHdhcmUgY29kZSBvdXRwdXQgb2YgYSBjb21wb25lbnQgY291bGQgYmUgcHJvZHVjZWQgd2l0aCBhIG1vZGVsLWRyaXZlbiBkZXZlbG9wbWVudCBvciBhIGNvZGUtY2VudHJpYyB0ZWNobmlxdWUuICBUaGUgY29tcG9uZW50IGNvbmNlcHQgZW5jYXBzdWxhdGVzIHRoZSBhY3R1YWwgd29yayBhbmQgbGV0cyB0aGUgZGV2ZWxvcG1lbnQgdGVhbSBjaG9vc2UgdGhlIGFwcHJvcHJpYXRlIHRlY2huaXF1ZSBhbmQgZmlsbCB0aGUgY29tcG9uZW50J3MgcmVhbGl6YXRpb24gd2l0aCB0aGVpciBjaG9pY2Ugb2YgQWN0aXZpdGllcyB0aGF0IHByb2R1Y2UgdGhlIHJlcXVpcmVkIG91dHB1dHMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImludGVyZmFjZXMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICBsb3dlckJvdW5kPSIxIiB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1Byb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icHJvY2VzcyIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9IiMvL1Byb2Nlc3MiIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlByb2Nlc3NQYWNrYWdlIiBlU3VwZXJUeXBlcz0iIy8vTWV0aG9kUGFja2FnZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iUHJvY2VzcyBQYWNrYWdlIGlzIGEgc3BlY2lhbCBNZXRob2QgUGFja2FnZSB0aGF0IGNvbnRhaW5zIFByb2Nlc3MgRWxlbWVudHMsIG9ubHkuJiN4RDsmI3hBO0Ega2V5IHNlcGFyYXRpb24gb2YgY29uY2VybnMgaW4gVU1BIGlzIHRoZSBkaXN0aW5jdGlvbiBiZXR3ZWVuIE1ldGhvZCBDb250ZW50IGFuZCBQcm9jZXNzLiAgVGhpcyBzZXBhcmF0aW9uIGlzIGVuZm9yY2VkIGJ5IHNwZWNpYWwgcGFja2FnZSB0eXBlcywgd2hpY2ggZG8gbm90IGFsbG93IHRoZSBtaXhpbmcgb2YgbWV0aG9kIGNvbnRlbnQgd2l0aCBwcm9jZXNzZXMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InByb2Nlc3NFbGVtZW50cyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vUHJvY2Vzc0VsZW1lbnQiIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImRpYWdyYW1zIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9EaWFncmFtIiBjb250YWlubWVudD0idHJ1ZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlIiBlU3VwZXJUeXBlcz0iIy8vQnJlYWtkb3duRWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBQcm9jZXNzIENvbXBvbmVudCBJbnRlcmZhY2UgY29tcHJpc2VzIG9mIGEgbGlzdCBvZiBpbnRlcmZhY2Ugc3BlY2lmaWNhdGlvbnMgKHNpbWlsYXIgdG8gb3BlcmF0aW9uIGRlY2xhcmF0aW9ucykgdGhhdCBleHByZXNzIGlucHV0cyBhbmQgb3V0cHV0cyBmb3IgYSBwcm9jZXNzIGNvbXBvbmVudC4gIFRoZXNlIGludGVyZmFjZSBzcGVjaWZpY2F0aW9ucyBhcmUgZXhwcmVzc2VkIHVzaW5nIFRhc2sgRGVzY3JpcHRvcnMgd2hpY2ggYXJlIG5vdCBsaW5rZWQgdG8gVGFza3MgdGhhdCBhcmUgcmVsYXRlZCB0byBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvcnMgYXMgd2VsbCBhcyBvcHRpb25hbCBhIFJvbGUgRGVzY3JpcHRvci4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iaW50ZXJmYWNlU3BlY2lmaWNhdGlvbnMiCi0gICAgICAgIG9yZGVyZWQ9ImZhbHNlIiB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1Rhc2tEZXNjcmlwdG9yIiBjb250YWlubWVudD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJpbnRlcmZhY2VJTyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vV29ya1Byb2R1Y3REZXNjcmlwdG9yIiBjb250YWlubWVudD0idHJ1ZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvciIgZVN1cGVyVHlwZXM9IiMvL0Rlc2NyaXB0b3IiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgUHJvY2VzcyBDb21wb25lbnQgRGVzY3JpcHRvciByZXByZXNlbnRzIGEgUHJvY2VzcyBDb21wb25lbnQgYXBwbGljYXRpb24gaW4gYSBQcm9jZXNzLCBpLmUuIHRoZSBicmVha2Rvd24gc3RydWN0dXJlIGRlZmluaW5nIHRoZSBQcm9jZXNzLiAgVGhlIFByb2Nlc3MgQ29tcG9uZW50IERlc2NyaXB0b3IgaXMgdXNlZCB0byBlbmNhcHN1bGF0ZSB0aGUgZGV0YWlscyBvZiB0aGUgY29tcG9uZW50IGluIGEgYnJlYWtkb3duIHN0cnVjdHVyZSBhbmQgdG8gcHJvdmlkZSBpdHMgb3duIHNldCBvZiByZWxhdGlvbnNoaXBzIHN1Y2ggYXMgaXQgb3duIHByZWRlY2Vzc29ycyBhbmQgc3VjY2Vzc29ycy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iUHJvY2Vzc0NvbXBvbmVudCIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9IiMvL1Byb2Nlc3NDb21wb25lbnQiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iTWV0aG9kUGx1Z2luIiBlU3VwZXJUeXBlcz0iIy8vTWV0aG9kVW5pdCAjLy9QYWNrYWdlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIE1ldGhvZCBQbHVnaW4gaXMgYSBNZXRob2QgRWxlbWVudCB0aGF0IHJlcHJlc2VudHMgYSBwaHlzaWNhbCBjb250YWluZXIgZm9yIE1ldGhvZCBQYWNrYWdlcy4gIEl0IGRlZmluZXMgYSBncmFudWxhcml0eSBsZXZlbCBmb3IgdGhlIG1vZHVsYXJpemF0aW9uIGFuZCBvcmdhbml6YXRpb24gb2YgbWV0aG9kIGNvbnRlbnQgYW5kIHByb2Nlc3Nlcy4gIEEgTWV0aG9kIFBsdWdpbiBjYW4gZXh0ZW5kIG1hbnkgb3RoZXIgTWV0aG9kIFBsdWdpbnMgYW5kIGl0IGNhbiBiZSBleHRlbmRlZCBieSBtYW55IE1ldGhvZCBQbHVnaW5zLiAgSXQgY2FuIGFsc28gYmUgdXNlZCBzdGFuZC1hbG9uZSwgaS5lLiB3aXRoIG5vIEV4dGVuc2lvbiByZWxhdGlvbnNoaXAgdG8gb3RoZXIgcGx1Zy1pbnMuJiN4RDsmI3hBO01ldGhvZCBQbHVnaW4gY29uY2VwdHVhbGx5IHJlcHJlc2VudHMgYSB1bml0IGZvciBjb25maWd1cmF0aW9uLCBtb2R1bGFyaXphdGlvbiwgZXh0ZW5zaW9uLCBwYWNrYWdpbmcsIGFuZCBkZXBsb3ltZW50IG9mIG1ldGhvZCBjb250ZW50IGFuZCBwcm9jZXNzZXMuICBBIFByb2Nlc3MgRW5naW5lZXIgc2hhbGwgZGVzaWduIGhpcyBQbHVnaW5zIGFuZCBhbGxvY2F0ZSBoaXMgY29udGVudCB0byB0aGVzZSBQbHVnaW5zIHdpdGggcmVxdWlyZW1lbnRzIGZvciBleHRlbnNpYmlsaXR5LCBtb2R1bGFyaXR5LCByZXVzZSwgYW5kIG1haW50YWluYWJpbGl0eSBpbiBtaW5kLiYjeEQ7JiN4QTtTcGVjaWFsIGV4dGVuc2liaWxpdHkgbWVjaGFuaXNtcyBkZWZpbmVkIGZvciB0aGUgbWV0YS1jbGFzc2VzIFZhcmlhYmlsaXR5IEVsZW1lbnQgYW5kIFByb2Nlc3MgQ29udHJpYnV0aW9uIGFsbG93IFBsdWdpbiBjb250ZW50IHRvIGRpcmVjdGx5IGNvbnRyaWJ1dGUgbmV3IGNvbnRlbnQsIHJlcGxhY2UgZXhpc3RpbmcgY29udGVudCwgb3IgdG8gY3Jvc3MtcmVmZXJlbmNlIHRvIGFueSBDb250ZW50IEVsZW1lbnQgb3IgUHJvY2VzcyB3aXRoaW4gYW5vdGhlciBQbHVnaW4gdGhhdCBpdCBleHRlbmRzLiAgU2ltaWxhciB0byBVTUwgMi4wJ3MgJ3BhY2thZ2UgbWVyZ2UnIG1lY2hhbmlzbSB0cmFuc2Zvcm1hdGlvbiBpbnRlcnByZXRhdGlvbnMsIGludGVycHJldGluZyB0aGVzZSBNZXRob2QgUGx1Z2luIG1lY2hhbmlzbXMgcmVzdWx0cyBpbnRvIG5ldyBleHRlbmRlZCBNZXRob2QgQ29udGVudCBhbmQgUHJvY2Vzc2VzLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ1c2VyQ2hhbmdlYWJsZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW5PYmplY3QiCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im1ldGhvZFBhY2thZ2VzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgbG93ZXJCb3VuZD0iMSIgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9NZXRob2RQYWNrYWdlIiBjb250YWlubWVudD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJiYXNlcyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vTWV0aG9kUGx1Z2luIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlZhcmlhYmlsaXR5RWxlbWVudCIgYWJzdHJhY3Q9InRydWUiCi0gICAgICBlU3VwZXJUeXBlcz0iIy8vTWV0aG9kRWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVmFyaWFiaWxpdHkgRWxlbWVudCBpcyBhbiBhYnN0cmFjdCBjbGFzcyBkZXJpdmVkIGZyb20gTWV0aG9kIEVsZW1lbnQgdGhhdCBwcm92aWRlcyBuZXcgY2FwYWJpbGl0aWVzIGZvciBjb250ZW50IHZhcmlhdGlvbiBhbmQgZXh0ZW5zaW9uIHRvIENvbnRlbnQgRWxlbWVudHMgb3IgYW55IG90aGVyIE1ldGhvZCBFbGVtZW50IHRoYXQgZGVyaXZlcyBmcm9tIGl0LiAgSXQgaGFzIGJlZW4gcGxhY2VkIGluLWJldHdlZW4gdGhlIGNsYXNzZXMgTWV0aG9kIEVsZW1lbnQgYW5kIENvbnRlbnQgRWxlbWVudCBpbiB0aGUgb3ZlcmFsbCBVTUEgdGF4b25vbXkgb2YgY2xhc3NlcyB1c2luZyB0aGUgVU1MIDIuMCBwYWNrYWdlIG1lcmdlIG1lY2hhbmlzbS4gIFRoZSBhc3NvY2lhdGlvbiBWYXJpYWJpbGl0eSBTcGVjaWFsaXphdGlvbiBzaGFsbCBvbmx5IGJlIGluc3RhbnRpYXRlZCBiZXR3ZWVuIHR3byBzdWJjbGFzc2VzIG9mIFZhcmlhYmlsaXR5IEVsZW1lbnQgb2YgdGhlIHNhbWUgdHlwZS4gIFRoZSBlbGVtZW50IG9uIHZhcmFpYmlsaXR5U3BlY2lhbEVsZW1lbnQgc2lkZSBvZiB0aGUgcmVsYXRpb25zaGlwIGRlZmluZXMgYSB2YWx1ZSBmb3IgdGhlIGF0dHJpYnV0ZSB2YXJpYWJpbGl0eVR5cGUgZGVmaW5pbmcgdGhlIG5hdHVyZSBvZiB0aGUgcmVsYXRpb25zaGlwIHVzaW5nIGEgbGl0ZXJhbCBmcm9tIHRoZSBlbnVtZXJhdGlvbiBWYXJpYWJpbGl0eSBUeXBlLiYjeEQ7JiN4QTtWYXJpYWJpbGl0eSBFbGVtZW50IG9mIHRoZSBtZXRhLW1vZGVsIHBhY2thZ2UgTWV0aG9kIFBsdWdpbnMgYWRkcyB0aGUgY2FwYWJpbGl0aWVzIG9mIHZhcmlhdGlvbiBhbmQgZXh0ZW5zaW9uIHRvIE1ldGhvZCBFbGVtZW50cyB0aGF0IGRlcml2ZSBmcm9tIGl0LiAgQnkgZGVmYXVsdCBhbGwgQ29udGVudCBFbGVtZW50cyBzdWNoIGFzIFJvbGUsIFRhc2ssIEd1aWRhbmNlIFR5cGVzLCBvciBBY3Rpdml0aWVzIGFyZSBkZWZpbmVkIHRvIGJlIFZhcmlhYmlsaXR5IEVsZW1lbnRzLiYjeEQ7JiN4QTtWYXJpYWJpbGl0eSBhbmQgZXh0ZW5zaW9uIHByb3ZpZGVzIHVuaXF1ZSBtZWNoYW5pc21zIGZvciBjdXN0b21pemluZyBtZXRob2QgY29udGVudCB3aXRob3V0IGFjdHVhbGx5IGRpcmVjdGx5IG1vZGlmeWluZyB0aGUgb3JpZ2luYWwgY29udGVudCwgYnV0IGJ5IGp1c3QgYmUgYWJsZSB0byBkZXNjcmliZSB3aXRoIHNlcGFyYXRlIG9iamVjdHMgdGhlIGRpZmZlcmVuY2VzIChhZGRpdGlvbnMsIGNoYW5nZXMsIG9taXNzaW9ucykgcmVsYXRpdmUgdG8gdGhlIG9yaWdpbmFsLiAgVGhpcyBwbHVnLWluIGNvbmNlcHQgYWxsb3dzIHVzZXJzIHRvIGZhY3RvciB0aGVpciBtZXRob2QgY29udGVudCBhbmQgcHJvY2Vzc2VzIGluIGludGVycmVsYXRlZCB1bml0cyBhbmQgZXZlbiB0byBhcmNoaXRlY3QgbWV0aG9kIGNvbnRlbnQgYW5kIHByb2Nlc3NlcyBpbiBsYXllcnMgdGhhdCBleHRlbmQgZWFjaCBvdGhlciB3aXRoIG5ldyBjYXBhYmlsaXRpZXMuICBUaGUgcmVzdWx0aW5nIG1ldGhvZCBhbmQgcHJvY2VzcyBkZXNpZ24gY2FuIGJlIGR5bmFtaWNhbGx5IGNvbWJpbmVkIGFuZCBhcHBsaWVkIG9uIGRlbWFuZCB1c2luZyB0aGUgaW50ZXJwcmV0YXRpb24gcnVsZXMgZGVmaW5lZCBmb3IgVmFyaWFiaWxpdHkgRWxlbWVudCBTcGVjaWFsaXphdGlvbnMgYXNzZW1ibGluZyB0byBwcm9jZXNzIHByYWN0aXRpb25lcnMgdGhlIG1vc3QgYWNjdXJhdGUgbWV0aG9kIGFuZCBwcm9jZXNzIGRlc2NyaXB0aW9ucyBwb3NzaWJsZS4gIEl0IGFsc28gYWxsb3dzIHByb2Nlc3MgcHJhY3RpdGlvbmVycyB0byBleHRlbmRzIGFuZCB0YWlsb3IgbWV0aG9kIGNvbnRlbnQgYW5kIHByb2Nlc3NlcyB0aGV5IGRvIG5vdCBvd24gYW5kIHRvIGVhc2lseSB1cGdyYWRlIHRvIG5ld2VyIHZlcnNpb25zIGJ5IHNpbXBseSByZWFwcGx5IHRoZWlyIHBlcnNvbmFsIGNoYW5nZXMgdG8gdGhlc2UgdXBncmFkZXMuJiN4RDsmI3hBO1ZhcmlhYmlsaXR5IEVsZW1lbnQgZGVmaW5lcyB0d28gdHlwZXMgb2YgdmFyaWFiaWxpdHkgYW5kIG9uZSB0eXBlIG9mIGV4dGVuc2lvbiB3aGljaCBhcmUgZm9ybWFsbHkgZGVmaW5lZCBmb3IgdGhlIGVudW1lcmF0aW9uIFZhcmlhYmlsaXR5IFR5cGUuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InZhcmlhYmlsaXR5VHlwZSIgZVR5cGU9IiMvL1ZhcmlhYmlsaXR5VHlwZSIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0ibmEiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJJZiBpbiBpbnN0YW5jZSBvZiB0aGUgdmFyaWFiaWxpdHlTcGVjaWFsaXphdGlvbiBhc3NvY2lhdGlvbiBiZXR3ZWVuIHR3byBWYXJpYWJpbGl0eSBFbGVtZW50cyBvZiB0aGUgc2FtZSB0eXBlIGV4aXN0cywgdGhlbiB0aGUgdmFyaWFiaWxpdHlUeXBlIGF0dHJpYnV0ZSBzcGVjaWZpZXMgaG93IHRoZSBlbGVtZW50IGF0IHRoZSB2YXJpYWJpbGl0eVNwZWNpYWxFbGVtZW50IGVuZCBvZiB0aGUgYXNzb2NpYXRpb24gY2hhbmdlcyB0aGUgQ29udGVudCBFbGVtZW50IGF0IHRoZSB2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50IGVuZC4gU2VlIHRoZSBWYXJpYWJpbGl0eSBUeXBlIGVudW1lcmF0aW9uIGNsYXNzIGZvciBkZWZpbml0aW9ucyBmb3IgdGhlIGRpZmZlcmVudCB0eXBlcyBvZiB2YXJpYWJpbGl0eS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0idmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCIKLSAgICAgICAgbG93ZXJCb3VuZD0iMSIgZVR5cGU9IiMvL1ZhcmlhYmlsaXR5RWxlbWVudCIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUVudW0iIG5hbWU9IlZhcmlhYmlsaXR5VHlwZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVmFyaWFiaWxpdHkgVHlwZSBpcyBhbiBFbnVtZXJhdGlvbiB1c2VkIGZvciB2YWx1ZXMgZm9yIGluc3RhbmNlcyBvZiBWYXJpYWJpbGl0eSBFbGVtZW50J3MgYXR0cmlidXRlIHZhcmlhYmlsaXR5VHlwZS4gIEl0IGRlZmluZXMgdGhlIG5hdHVyZSBvZiBob3cgYSBWYXJpYWJpbGl0eSBFbGVtZW50IGV4dGVuZHMgYW5vdGhlciBWYXJpYWJpbGl0eSBFbGVtZW50LiBTZWUgZW51bWVyYXRpb24gbGl0ZXJhbHMgZm9yIGRlZmluaXRpb25zIGZvciBlYWNoIHR5cGUuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJuYSIvPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iY29udHJpYnV0ZXMiIHZhbHVlPSIxIi8+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJleHRlbmRzIiB2YWx1ZT0iMiIvPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0icmVwbGFjZXMiIHZhbHVlPSIzIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlByb2Nlc3NDb250cmlidXRpb24iIGVTdXBlclR5cGVzPSIjLy9Qcm9jZXNzIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIFByb2Nlc3MgQ29udHJpYnV0aW9uIGlzIGEgc3BlY2lhbCBQcm9jZXNzIHRoYXQgZXh0ZXJuYWxseSBkZWZpbmVzIGFkZGl0aW9ucyBhbmQgY2hhbmdlcyB0byBhbiBleGlzdGluZyBQcm9jZXNzIHdpdGhvdXQgZGlyZWN0bHkgbW9kaWZ5aW5nIHRoZSBleGlzdGluZyBQcm9jZXNzLiAgSXQgYWNoaWV2ZXMgdGhpcyBieSBkZXNjcmliaW5nIHRoZXNlIGFkZGl0aW9ucyBhbmQgY2hhbmdlcyBpbiBhIHNlcGFyYXRlIFByb2Nlc3Mgc3RydWN0dXJlLiAgVGhpcyBzdHJ1Y3R1cmUncyBlbGVtZW50cyByZWxhdGUgdG8gdGhlIG90aGVyIFByb2Nlc3MnIGVsZW1lbnRzIHVzaW5nIENvbnRyaWJ1dGVzIGFuZCBSZXBsYWNlIFZhcmlhYmlsaXR5IFNwZWNpYWxpemF0aW9ucy4gIFByb2Nlc3MgQ29udHJpYnV0aW9ucyBhcmUgbm9ybWFsbHkgcGFja2FnZWQgd2l0aCBNZXRob2QgUGx1Z2lucyB0aGF0IGV4dGVuZCBleGlzdGluZyBNZXRob2QgUGx1Z2luIHdpdGggbmV3IGNhcGFiaWxpdGllcy4mI3hEOyYjeEE7QSBQcm9jZXNzIENvbnRyaWJ1dGlvbiBpcyBhIHNwZWNpYWwgUHJvY2VzcyB0aGF0IGFwcGxpZXMgdGhlIHNlbWFudGljcyBvZiB0aGUgQ29udHJpYnV0ZXMgYW5kIFJlcGxhY2VzIFZhcmlhYmlsaXR5IFNwZWNpYWxpemF0aW9uIG9uIFByb2Nlc3Nlcy4gIEEgUHJvY2VzcyBDb250cmlidXRpb24gaXMgYSBraW5kIG9mICdwcm9jZXNzIHBsdWctaW4nIHRoYXQgJ3BsdWdzJyBhZGRpdGlvbmFsIGJyZWFrZG93biBzdHJ1Y3R1cmVzIGludG8gYW4gZXhpdGluZyBwcm9jZXNzIGFuZCB0aGVyZWZvcmUgdXBkYXRlcyBpdCBhLXBvc3Rlcmlvcmkgd2l0aCBuZXcgb3IgY2hhbmdlZCBjYXBhYmlsaXRpZXMuICBUeXBpY2FsIGFwcGxpY2F0aW9ucyBvZiBQcm9jZXNzIENvbnRyaWJ1dGlvbnMgYXJlIE1ldGhvZCBQbHVnaW5zIHRoYXQgYWRkIGNvbnRlbnQgZnJvbSBzcGVjaWZpYyBhcmVhcyB0byBhbiBleGlzdGluZyBkb21haW4uICBJbiBhZGRpdGlvbiB0byBqdXN0IGNvbnRyaWJ1dGluZyBuZXcgbWV0aG9kIGNvbnRlbnQgdG8gY29udGVudCBlbGVtZW50cyBzdWNoIGFzIFRhc2sgYW5kIFdvcmsgUHJvZHVjdHMsIFByb2Nlc3MgQ29udHJpYnV0aW9ucyBjYW4gYWxzbyBkZWZpbmUgd2hlcmUgaW4gdGhlIFByb2Nlc3NlcyB0aGF0IGhhdmUgYmVlbiBkZWZpbmVkIHdpdGggdGhpcyBtZXRob2QgY29udGVudCB0aG9zZSBuZXcgYWRkaXRpb25zIHNob3VsZCBiZSBhcHBsaWVkLiAgTW9yZW92ZXIsIGl0IGFsbG93cyBkZWZpbmluZyB3aG9sZSBuZXcgb3IgY2hhbmdlZCBBY3Rpdml0aWVzIHdpdGhpbiB0aGVzZSBwcm9jZXNzZXMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImJhc2VQcm9jZXNzIiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iIy8vUHJvY2VzcyIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJNZXRob2RVbml0IiBhYnN0cmFjdD0idHJ1ZSIgZVN1cGVyVHlwZXM9IiMvL01ldGhvZEVsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgTWV0aG9kIFVuaXQgaXMgYSBzcGVjaWFsIE1ldGhvZCBFbGVtZW50IHRoYXQgc2hhbGwgYmUgbWFpbnRhaW5lZCBpbiBhIE1ldGhvZCBMaWJyYXJ5IGFzIGEgc2VwYXJhdGUgdW5pdCBvZiBjb250cm9sLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhdXRob3JzIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJFdmVyeSBNZXRob2QgVW5pdCBpcyBiZWluZyBjcmVhdGVkIGFuZCBvd25lZCBieSBhbiBhdXRob3Igb3IgYXV0aG9yaW5nIHRlYW0uIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNoYW5nZURhdGUiIGVUeXBlPSIjLy9EYXRlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGRhdGUgdGhlIGxhc3QgY2hhbmdlIHRoYXQgcmVzdWx0ZWQgaW50byB0aGlzIHZlcnNpb24gaGFzIGJlZW4gbWFkZS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY2hhbmdlRGVzY3JpcHRpb24iIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgbGFzdCBjaGFuZ2UgdGhhdCByZXN1bHRlZCBpbnRvIHRoaXMgdmVyc2lvbi4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idmVyc2lvbiIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRXZlcnkgUGFja2FnZSBoYXMgYSB2ZXJzaW9uIG51bWJlciB1c2VkIHRvIHRyYWNrIGNoYW5nZXMuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImNvcHlyaWdodFN0YXRlbWVudCIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9IiMvL1N1cHBvcnRpbmdNYXRlcmlhbCIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJNZXRob2RDb25maWd1cmF0aW9uIiBlU3VwZXJUeXBlcz0iIy8vTWV0aG9kRWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBNZXRob2QgQ29uZmlndXJhdGlvbiBpcyBhIGNvbGxlY3Rpb24gb2Ygc2VsZWN0ZWQgTWV0aG9kIE1vZGVscyBhbmQgTWV0aG9kUGFja2FnZXMuIEEgY29uZmlndXJhdGlvbiBjYW4gYmUgZXhwb3J0ZWQgaW50byBpdHMgb3duIHN0YW5kYWxvbmUgbGlicmFyeSB3aGVuIGl0IGluY2x1ZGVzIHRoZSBmdWxsIHRyYW5zaXRpdmUgY2xvc3VyZSBvZiBhbGwgZWxlbWVudHMgYWxsIG90aGVyIGVsZW1lbnRzIGRlcGVuZCBvbi4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ibWV0aG9kUGx1Z2luU2VsZWN0aW9uIgotICAgICAgICBvcmRlcmVkPSJmYWxzZSIgbG93ZXJCb3VuZD0iMSIgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9NZXRob2RQbHVnaW4iLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ibWV0aG9kUGFja2FnZVNlbGVjdGlvbiIKLSAgICAgICAgb3JkZXJlZD0iZmFsc2UiIGxvd2VyQm91bmQ9IjEiIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vTWV0aG9kUGFja2FnZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJwcm9jZXNzVmlld3MiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0NvbnRlbnRDYXRlZ29yeSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJkZWZhdWx0VmlldyIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9IiMvL0NvbnRlbnRDYXRlZ29yeSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJiYXNlQ29uZmlndXJhdGlvbnMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL01ldGhvZENvbmZpZ3VyYXRpb24iLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUHJvY2Vzc0ZhbWlseSIgZVN1cGVyVHlwZXM9IiMvL01ldGhvZENvbmZpZ3VyYXRpb24iPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgRGVsaXZlcnkgTW9kZWwgRmFtaWx5IGlzIGEgY29udmVuaWVudCBncm91cGluZyBvZiBEZWxpdmVyeSBQcm9jZXNzZXMgYW5kIENhcGFiaWxpdHkgUGF0dGVybnMgb2YgaW50ZXJlc3QgdG8gc29tZSBzcGVjaWZpYyB1c2VyIGNvbW11bml0eS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZGVsaXZlcnlQcm9jZXNzZXMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0RlbGl2ZXJ5UHJvY2VzcyIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJNZXRob2RMaWJyYXJ5IiBlU3VwZXJUeXBlcz0iIy8vTWV0aG9kVW5pdCAjLy9QYWNrYWdlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIE1ldGhvZCBMaWJyYXJ5IGlzIGEgcGh5c2ljYWwgY29udGFpbmVyIGZvciBNZXRob2QgUGx1Z2lucyBhbmQgTWV0aG9kIENvbmZpZ3VyYXRpb24gZGVmaW5pdGlvbnMuICBBbGwgTWV0aG9kIEVsZW1lbnRzIGFyZSBzdG9yZWQgaW4gYSBNZXRob2QgTGlicmFyeS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ibWV0aG9kUGx1Z2lucyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vTWV0aG9kUGx1Z2luIiBjb250YWlubWVudD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJwcmVkZWZpbmVkQ29uZmlndXJhdGlvbnMiCi0gICAgICAgIG9yZGVyZWQ9ImZhbHNlIiB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL01ldGhvZENvbmZpZ3VyYXRpb24iIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotPC9lY29yZTpFUGFja2FnZT4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvbW9kZWwvMS4wLjIvdW1hLmdlbm1vZGVsIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9tb2RlbC8xLjAuMi91bWEuZ2VubW9kZWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhNjkwNTguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9tb2RlbC8xLjAuMi91bWEuZ2VubW9kZWwKKysrIC9kZXYvbnVsbApAQCAtMSw0NjYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxnZW5tb2RlbDpHZW5Nb2RlbCB4bWk6dmVyc2lvbj0iMi4wIgotICAgIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6ZWNvcmU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUiCi0gICAgeG1sbnM6Z2VubW9kZWw9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiIGNvcHlyaWdodFRleHQ9IklCTSBSYXRpb25hbCBTb2Z0d2FyZSIKLSAgICBtb2RlbERpcmVjdG9yeT0iL2NvbS5pYm0udW1hL3NyYyIgZWRpdERpcmVjdG9yeT0iL2NvbS5pYm0udW1hLmVkaXQvc3JjIiBlZGl0b3JEaXJlY3Rvcnk9Ii9jb20uaWJtLnVtYS5lZGl0b3Ivc3JjIgotICAgIG1vZGVsUGx1Z2luSUQ9ImNvbS5pYm0udW1hIiB0ZW1wbGF0ZURpcmVjdG9yeT0iL2NvbS5pYm0udW1hLmVjb3JlL3RlbXBsYXRlcyIgcnVudGltZUphcj0idHJ1ZSIKLSAgICBkeW5hbWljVGVtcGxhdGVzPSJ0cnVlIiBtb2RlbE5hbWU9IlVtYSIgZWRpdFBsdWdpbkNsYXNzPSJjb20uaWJtLnVtYS5wcm92aWRlci5VbWFFZGl0UGx1Z2luIgotICAgIGVkaXRvclBsdWdpbkNsYXNzPSJjb20uaWJtLnVtYS5wcmVzZW50YXRpb24uVW1hRWRpdG9yUGx1Z2luIiBub25OTFNNYXJrZXJzPSJ0cnVlIgotICAgIHJvb3RFeHRlbmRzSW50ZXJmYWNlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuc2RvLkVEYXRhT2JqZWN0IiByb290RXh0ZW5kc0NsYXNzPSJjb20uaWJtLnVtYWYuZWNvcmUuaW1wbC5NdWx0aVJlc291cmNlRU9iamVjdCIKLSAgICByb290SW1wbGVtZW50c0ludGVyZmFjZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnNkby5JbnRlcm5hbEVEYXRhT2JqZWN0IiBzdXBwcmVzc0VNRlR5cGVzPSJ0cnVlIgotICAgIGZlYXR1cmVNYXBXcmFwcGVySW50ZXJmYWNlPSJjb21tb25qLnNkby5TZXF1ZW5jZSIgZmVhdHVyZU1hcFdyYXBwZXJJbnRlcm5hbEludGVyZmFjZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnNkby51dGlsLkVTZXF1ZW5jZSIKLSAgICBmZWF0dXJlTWFwV3JhcHBlckNsYXNzPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuc2RvLnV0aWwuQmFzaWNFU2VxdWVuY2UiPgotICA8Zm9yZWlnbk1vZGVsPkM6XEhvbWVccGhUTkdcVE5HX2RvY3NcT09BRFxDb250ZW50QXJjaGl0ZWN0dXJlXE1vZGVsc1xVTUEwMlxVbmlmaWVkTWV0aG9kQXJjaGl0ZWN0dXJlLm1kbDwvZm9yZWlnbk1vZGVsPgotICA8c3RhdGljUGFja2FnZXM+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9TRE88L3N0YXRpY1BhY2thZ2VzPgotICA8bW9kZWxQbHVnaW5WYXJpYWJsZXM+RU1GX0NPTU1PTkpfU0RPPW9yZy5lY2xpcHNlLmVtZi5jb21tb25qLnNkbzwvbW9kZWxQbHVnaW5WYXJpYWJsZXM+Ci0gIDxtb2RlbFBsdWdpblZhcmlhYmxlcz5FTUZfRUNPUkVfU0RPPW9yZy5lY2xpcHNlLmVtZi5lY29yZS5zZG88L21vZGVsUGx1Z2luVmFyaWFibGVzPgotICA8Z2VuUGFja2FnZXMgcHJlZml4PSJVbWEiIGJhc2VQYWNrYWdlPSJjb20uaWJtIiBkaXNwb3NhYmxlUHJvdmlkZXJGYWN0b3J5PSJ0cnVlIgotICAgICAgZWNvcmVQYWNrYWdlPSJ1bWEuZWNvcmUjLyI+Ci0gICAgPGdlbkVudW1zIGVjb3JlRW51bT0idW1hLmVjb3JlIy8vV29ya09yZGVyVHlwZSI+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9InVtYS5lY29yZSMvL1dvcmtPcmRlclR5cGUvZmluaXNoVG9TdGFydCIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJ1bWEuZWNvcmUjLy9Xb3JrT3JkZXJUeXBlL2ZpbmlzaFRvRmluaXNoIi8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9InVtYS5lY29yZSMvL1dvcmtPcmRlclR5cGUvc3RhcnRUb1N0YXJ0Ii8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9InVtYS5lY29yZSMvL1dvcmtPcmRlclR5cGUvc3RhcnRUb0ZpbmlzaCIvPgotICAgIDwvZ2VuRW51bXM+Ci0gICAgPGdlbkVudW1zIGVjb3JlRW51bT0idW1hLmVjb3JlIy8vVmFyaWFiaWxpdHlUeXBlIj4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0idW1hLmVjb3JlIy8vVmFyaWFiaWxpdHlUeXBlL25hIi8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9InVtYS5lY29yZSMvL1ZhcmlhYmlsaXR5VHlwZS9jb250cmlidXRlcyIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJ1bWEuZWNvcmUjLy9WYXJpYWJpbGl0eVR5cGUvZXh0ZW5kcyIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJ1bWEuZWNvcmUjLy9WYXJpYWJpbGl0eVR5cGUvcmVwbGFjZXMiLz4KLSAgICA8L2dlbkVudW1zPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0idW1hLmVjb3JlIy8vRGF0ZSIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0idW1hLmVjb3JlIy8vVXJpIi8+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJ1bWEuZWNvcmUjLy9VbmxpbWl0ZWROYXR1cmFsIi8+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJ1bWEuZWNvcmUjLy9TdHJpbmciLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9InVtYS5lY29yZSMvL1NldCIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0idW1hLmVjb3JlIy8vU2VxdWVuY2UiLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9InVtYS5lY29yZSMvL0ludGVnZXIiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9DbGFzc2lmaWVyIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vVHlwZSIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0VsZW1lbnQiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9OYW1lZEVsZW1lbnQiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL05hbWVkRWxlbWVudC9uYW1lIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1BhY2thZ2VhYmxlRWxlbWVudCIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1BhY2thZ2UiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9OYW1lc3BhY2UiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9NZXRob2RFbGVtZW50Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9NZXRob2RFbGVtZW50L2d1aWQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9NZXRob2RFbGVtZW50L2JyaWVmRGVzY3JpcHRpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vTWV0aG9kRWxlbWVudC9vd25lZFJ1bGVzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vTWV0aG9kRWxlbWVudC9zdXBwcmVzc2VkIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vTWV0aG9kRWxlbWVudC9vcmRlcmluZ0d1aWRlIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0NvbnN0cmFpbnQiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0NvbnN0cmFpbnQvYm9keSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Db250ZW50RWxlbWVudCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vQ29udGVudEVsZW1lbnQvc3VwcG9ydGluZ01hdGVyaWFscyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0NvbnRlbnRFbGVtZW50L2NvbmNlcHRzQW5kUGFwZXJzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vQ29udGVudEVsZW1lbnQvY2hlY2tsaXN0cyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0NvbnRlbnRFbGVtZW50L2d1aWRlbGluZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Db250ZW50RWxlbWVudC9leGFtcGxlcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0NvbnRlbnRFbGVtZW50L2Fzc2V0cyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9EZXNjcmliYWJsZUVsZW1lbnQiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0Rlc2NyaWJhYmxlRWxlbWVudC9wcmVzZW50YXRpb25OYW1lIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0Rlc2NyaWJhYmxlRWxlbWVudC9wcmVzZW50YXRpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9EZXNjcmliYWJsZUVsZW1lbnQvc2hhcGVpY29uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vRGVzY3JpYmFibGVFbGVtZW50L25vZGVpY29uIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0NvbnRlbnREZXNjcmlwdGlvbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vQ29udGVudERlc2NyaXB0aW9uL21haW5EZXNjcmlwdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Db250ZW50RGVzY3JpcHRpb24vc2VjdGlvbnMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9Db250ZW50RGVzY3JpcHRpb24va2V5Q29uc2lkZXJhdGlvbnMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vU2VjdGlvbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vU2VjdGlvbi9zZWN0aW9uTmFtZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1NlY3Rpb24vc2VjdGlvbkRlc2NyaXB0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1NlY3Rpb24vc3ViU2VjdGlvbnMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9TZWN0aW9uL3ByZWRlY2Vzc29yIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1JvbGUiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJSZWFkb25seSIgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vUm9sZS9tb2RpZmllcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1JvbGUvcmVzcG9uc2libGVGb3IiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vV29ya1Byb2R1Y3QiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Xb3JrUHJvZHVjdC9lc3RpbWF0ZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1dvcmtQcm9kdWN0L3JlcG9ydHMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Xb3JrUHJvZHVjdC90ZW1wbGF0ZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Xb3JrUHJvZHVjdC90b29sTWVudG9ycyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9UYXNrIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9UYXNrL3BlcmZvcm1lZEJ5Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vVGFzay9tYW5kYXRvcnlJbnB1dCIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1Rhc2svb3V0cHV0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vVGFzay9hZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1Rhc2svb3B0aW9uYWxJbnB1dCIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJSZWFkb25seSIgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vVGFzay9zdGVwcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1Rhc2svdG9vbE1lbnRvcnMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vVGFzay9lc3RpbWF0ZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Xb3JrRGVmaW5pdGlvbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1dvcmtEZWZpbml0aW9uL3ByZWNvbmRpdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Xb3JrRGVmaW5pdGlvbi9wb3N0Y29uZGl0aW9uIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1N0ZXAiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9HdWlkYW5jZSIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0FydGlmYWN0Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vQXJ0aWZhY3QvY29udGFpbmVyQXJ0aWZhY3QiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vQXJ0aWZhY3QvY29udGFpbmVkQXJ0aWZhY3RzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0RlbGl2ZXJhYmxlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9EZWxpdmVyYWJsZS9kZWxpdmVyZWRXb3JrUHJvZHVjdHMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vT3V0Y29tZSIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL01ldGhvZFBhY2thZ2UiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL01ldGhvZFBhY2thZ2UvZ2xvYmFsIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vTWV0aG9kUGFja2FnZS9yZXVzZWRQYWNrYWdlcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9NZXRob2RQYWNrYWdlL3BhcmVudFBhY2thZ2UiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vTWV0aG9kUGFja2FnZS9jaGlsZFBhY2thZ2VzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0NvbnRlbnRQYWNrYWdlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vQ29udGVudFBhY2thZ2UvY29udGVudEVsZW1lbnRzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0FydGlmYWN0RGVzY3JpcHRpb24iPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0FydGlmYWN0RGVzY3JpcHRpb24vYnJpZWZPdXRsaW5lIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vQXJ0aWZhY3REZXNjcmlwdGlvbi9yZXByZXNlbnRhdGlvbk9wdGlvbnMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vV29ya1Byb2R1Y3REZXNjcmlwdGlvbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vV29ya1Byb2R1Y3REZXNjcmlwdGlvbi9leHRlcm5hbElkIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vV29ya1Byb2R1Y3REZXNjcmlwdGlvbi9wdXJwb3NlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vV29ya1Byb2R1Y3REZXNjcmlwdGlvbi9pbXBhY3RPZk5vdEhhdmluZyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1dvcmtQcm9kdWN0RGVzY3JpcHRpb24vcmVhc29uc0Zvck5vdE5lZWRpbmciLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vRGVsaXZlcmFibGVEZXNjcmlwdGlvbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vRGVsaXZlcmFibGVEZXNjcmlwdGlvbi9leHRlcm5hbERlc2NyaXB0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vRGVsaXZlcmFibGVEZXNjcmlwdGlvbi9wYWNrYWdpbmdHdWlkYW5jZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Sb2xlRGVzY3JpcHRpb24iPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1JvbGVEZXNjcmlwdGlvbi9za2lsbHMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9Sb2xlRGVzY3JpcHRpb24vYXNzaWdubWVudEFwcHJvYWNoZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9Sb2xlRGVzY3JpcHRpb24vc3lub255bXMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vVGFza0Rlc2NyaXB0aW9uIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9UYXNrRGVzY3JpcHRpb24vcHVycG9zZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1Rhc2tEZXNjcmlwdGlvbi9hbHRlcm5hdGl2ZXMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vR3VpZGFuY2VEZXNjcmlwdGlvbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vR3VpZGFuY2VEZXNjcmlwdGlvbi9hdHRhY2htZW50cyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9QcmFjdGljZURlc2NyaXB0aW9uIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9QcmFjdGljZURlc2NyaXB0aW9uL2FkZGl0aW9uYWxJbmZvIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vUHJhY3RpY2VEZXNjcmlwdGlvbi9wcm9ibGVtIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vUHJhY3RpY2VEZXNjcmlwdGlvbi9iYWNrZ3JvdW5kIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vUHJhY3RpY2VEZXNjcmlwdGlvbi9nb2FscyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1ByYWN0aWNlRGVzY3JpcHRpb24vYXBwbGljYXRpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9QcmFjdGljZURlc2NyaXB0aW9uL2xldmVsc09mQWRvcHRpb24iLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vUG9pbnQiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1BvaW50L3giLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9Qb2ludC95Ii8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0dyYXBoRWxlbWVudCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0dyYXBoRWxlbWVudC9wb3NpdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9HcmFwaEVsZW1lbnQvY29udGFpbmVkIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0dyYXBoRWxlbWVudC9saW5rIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0dyYXBoRWxlbWVudC9hbmNob3JhZ2UiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vR3JhcGhFbGVtZW50L3NlbWFudGljTW9kZWwiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vRGlhZ3JhbUVsZW1lbnQiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0RpYWdyYW1FbGVtZW50L2lzVmlzaWJsZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9EaWFncmFtRWxlbWVudC9jb250YWluZXIiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9EaWFncmFtRWxlbWVudC9yZWZlcmVuY2UiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vRGlhZ3JhbUVsZW1lbnQvcHJvcGVydHkiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vRGlhZ3JhbUxpbmsiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0RpYWdyYW1MaW5rL3pvb20iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vRGlhZ3JhbUxpbmsvdmlld3BvcnQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vRGlhZ3JhbUxpbmsvZ3JhcGhFbGVtZW50Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vRGlhZ3JhbUxpbmsvZGlhZ3JhbSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9HcmFwaENvbm5lY3RvciI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0dyYXBoQ29ubmVjdG9yL2dyYXBoRWxlbWVudCIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0dyYXBoQ29ubmVjdG9yL2dyYXBoRWRnZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9TZW1hbnRpY01vZGVsQnJpZGdlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9TZW1hbnRpY01vZGVsQnJpZGdlL3ByZXNlbnRhdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9TZW1hbnRpY01vZGVsQnJpZGdlL2dyYXBoRWxlbWVudCIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9TZW1hbnRpY01vZGVsQnJpZGdlL2RpYWdyYW0iLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vRGltZW5zaW9uIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9EaW1lbnNpb24vd2lkdGgiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9EaW1lbnNpb24vaGVpZ2h0Ii8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1JlZmVyZW5jZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vUmVmZXJlbmNlL2lzSW5kaXZpZHVhbFJlcHJlc2VudGF0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vUmVmZXJlbmNlL3JlZmVyZW5jZWQiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vUHJvcGVydHkiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1Byb3BlcnR5L2tleSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1Byb3BlcnR5L3ZhbHVlIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0dyYXBoRWRnZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vR3JhcGhFZGdlL2FuY2hvciIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9HcmFwaEVkZ2Uvd2F5cG9pbnRzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0RpYWdyYW0iPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0RpYWdyYW0vem9vbSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9EaWFncmFtL3ZpZXdwb2ludCIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0RpYWdyYW0vZGlhZ3JhbUxpbmsiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vRGlhZ3JhbS9uYW1lc3BhY2UiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vR3JhcGhOb2RlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vR3JhcGhOb2RlL3NpemUiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnQiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1NpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50L3R5cGVJbmZvIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1VNQVNlbWFudGljTW9kZWxCcmlkZ2UiPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1VNQVNlbWFudGljTW9kZWxCcmlkZ2UvZWxlbWVudCIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Db3JlU2VtYW50aWNNb2RlbEJyaWRnZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vQ29yZVNlbWFudGljTW9kZWxCcmlkZ2UvZWxlbWVudCIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9MZWFmRWxlbWVudCIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1RleHRFbGVtZW50Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9UZXh0RWxlbWVudC90ZXh0Ii8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0ltYWdlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9JbWFnZS91cmkiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9JbWFnZS9taW1lVHlwZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9HcmFwaGljUHJpbWl0aXZlIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vUG9seWxpbmUiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1BvbHlsaW5lL2Nsb3NlZCIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Qb2x5bGluZS93YXlwb2ludHMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vRWxsaXBzZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vRWxsaXBzZS9yYWRpdXNYIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vRWxsaXBzZS9yYWRpdXNZIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vRWxsaXBzZS9yb3RhdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0VsbGlwc2Uvc3RhcnRBbmdsZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0VsbGlwc2UvZW5kQW5nbGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vRWxsaXBzZS9jZW50ZXIiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vQWN0aXZpdHkiPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0FjdGl2aXR5L2JyZWFrZG93bkVsZW1lbnRzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vQWN0aXZpdHkvcm9hZG1hcHMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9BY3Rpdml0eS9zdXBwb3J0aW5nTWF0ZXJpYWxzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vQWN0aXZpdHkvY2hlY2tsaXN0cyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0FjdGl2aXR5L2NvbmNlcHRzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vQWN0aXZpdHkvZXhhbXBsZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9BY3Rpdml0eS9ndWlkZWxpbmVzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vQWN0aXZpdHkvcmV1c2FibGVBc3NldHMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vV29ya0JyZWFrZG93bkVsZW1lbnQiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1dvcmtCcmVha2Rvd25FbGVtZW50L2lzUmVwZWF0YWJsZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1dvcmtCcmVha2Rvd25FbGVtZW50L2lzT25nb2luZyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1dvcmtCcmVha2Rvd25FbGVtZW50L2lzRXZlbnREcml2ZW4iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Xb3JrQnJlYWtkb3duRWxlbWVudC9saW5rVG9QcmVkZWNlc3NvciIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9CcmVha2Rvd25FbGVtZW50Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9CcmVha2Rvd25FbGVtZW50L3ByZWZpeCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0JyZWFrZG93bkVsZW1lbnQvaXNQbGFubmVkIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vQnJlYWtkb3duRWxlbWVudC9oYXNNdWx0aXBsZU9jY3VycmVuY2VzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vQnJlYWtkb3duRWxlbWVudC9pc09wdGlvbmFsIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vQnJlYWtkb3duRWxlbWVudC9wcmVzZW50ZWRBZnRlciIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0JyZWFrZG93bkVsZW1lbnQvcHJlc2VudGVkQmVmb3JlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0JyZWFrZG93bkVsZW1lbnQvcGxhbm5pbmdEYXRhIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vQnJlYWtkb3duRWxlbWVudC9zdXBlckFjdGl2aXRpZXMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vTWlsZXN0b25lIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vSXRlcmF0aW9uIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vUGhhc2UiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9UZWFtUHJvZmlsZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vVGVhbVByb2ZpbGUvdGVhbVJvbGVzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vVGVhbVByb2ZpbGUvc3VwZXJUZWFtIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vVGVhbVByb2ZpbGUvc3ViVGVhbSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Sb2xlRGVzY3JpcHRvciI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vUm9sZURlc2NyaXB0b3IvUm9sZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1JvbGVEZXNjcmlwdG9yL3BlcmZvcm1zQWRkaXRpb25hbGx5Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vUm9sZURlc2NyaXB0b3IvYXNzaXN0c0luIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9IlJlYWRvbmx5IiBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Sb2xlRGVzY3JpcHRvci9tb2RpZmllcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1JvbGVEZXNjcmlwdG9yL3BlcmZvcm1zQXNPd25lciIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1JvbGVEZXNjcmlwdG9yL3Jlc3BvbnNpYmxlRm9yIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1dvcmtPcmRlciI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vV29ya09yZGVyL2xpbmtUeXBlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vV29ya09yZGVyL3ByZWQiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vUHJvY2Vzc0VsZW1lbnQiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9QbGFubmluZ0RhdGEiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1BsYW5uaW5nRGF0YS9zdGFydERhdGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9QbGFubmluZ0RhdGEvZmluaXNoRGF0ZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1BsYW5uaW5nRGF0YS9yYW5rIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0Rlc2NyaXB0b3IiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0Rlc2NyaXB0b3IvaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1Rhc2tEZXNjcmlwdG9yIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9UYXNrRGVzY3JpcHRvci9UYXNrIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vVGFza0Rlc2NyaXB0b3IvYWRkaXRpb25hbGx5UGVyZm9ybWVkQnkiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9UYXNrRGVzY3JpcHRvci9hc3Npc3RlZEJ5Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vVGFza0Rlc2NyaXB0b3IvZXh0ZXJuYWxJbnB1dCIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1Rhc2tEZXNjcmlwdG9yL21hbmRhdG9yeUlucHV0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vVGFza0Rlc2NyaXB0b3Ivb3B0aW9uYWxJbnB1dCIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1Rhc2tEZXNjcmlwdG9yL291dHB1dCIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1Rhc2tEZXNjcmlwdG9yL3BlcmZvcm1lZFByaW1hcmlseUJ5Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vVGFza0Rlc2NyaXB0b3Ivc2VsZWN0ZWRTdGVwcyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Xb3JrUHJvZHVjdERlc2NyaXB0b3IiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1dvcmtQcm9kdWN0RGVzY3JpcHRvci9hY3Rpdml0eUVudHJ5U3RhdGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9Xb3JrUHJvZHVjdERlc2NyaXB0b3IvYWN0aXZpdHlFeGl0U3RhdGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Xb3JrUHJvZHVjdERlc2NyaXB0b3IvV29ya1Byb2R1Y3QiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Xb3JrUHJvZHVjdERlc2NyaXB0b3IvZXh0ZXJuYWxJbnB1dFRvIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vV29ya1Byb2R1Y3REZXNjcmlwdG9yL2ltcGFjdGVkQnkiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Xb3JrUHJvZHVjdERlc2NyaXB0b3IvaW1wYWN0cyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1dvcmtQcm9kdWN0RGVzY3JpcHRvci9tYW5kYXRvcnlJbnB1dFRvIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9IlJlYWRvbmx5IiBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Xb3JrUHJvZHVjdERlc2NyaXB0b3Ivd29ya2VkT25CeSIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1dvcmtQcm9kdWN0RGVzY3JpcHRvci9PcHRpb25hbElucHV0VG8iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Xb3JrUHJvZHVjdERlc2NyaXB0b3Ivb3V0cHV0RnJvbSIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1dvcmtQcm9kdWN0RGVzY3JpcHRvci9kZWxpdmVyYWJsZVBhcnRzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vV29ya1Byb2R1Y3REZXNjcmlwdG9yL3Jlc3BvbnNpYmxlUm9sZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Db21wb3NpdGVSb2xlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Db21wb3NpdGVSb2xlL2FnZ3JlZ2F0ZWRSb2xlcyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9CcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24iPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0JyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbi91c2FnZUd1aWRhbmNlIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0FjdGl2aXR5RGVzY3JpcHRpb24iPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0FjdGl2aXR5RGVzY3JpcHRpb24vcHVycG9zZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0FjdGl2aXR5RGVzY3JpcHRpb24vYWx0ZXJuYXRpdmVzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vQWN0aXZpdHlEZXNjcmlwdGlvbi9ob3d0b1N0YWZmIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbi9zY2FsZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uL3Byb2plY3RDaGFyYWN0ZXJpc3RpY3MiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbi9yaXNrTGV2ZWwiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbi9lc3RpbWF0aW5nVGVjaG5pcXVlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24vcHJvamVjdE1lbWJlckV4cGVydGlzZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uL3R5cGVPZkNvbnRyYWN0Ii8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1Byb2Nlc3NEZXNjcmlwdGlvbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vUHJvY2Vzc0Rlc2NyaXB0aW9uL2V4dGVybmFsSWQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9Qcm9jZXNzRGVzY3JpcHRpb24vc2NvcGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9Qcm9jZXNzRGVzY3JpcHRpb24vdXNhZ2VOb3RlcyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9EZXNjcmlwdG9yRGVzY3JpcHRpb24iPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0Rlc2NyaXB0b3JEZXNjcmlwdGlvbi9yZWZpbmVkRGVzY3JpcHRpb24iLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vQ29uY2VwdCIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0NoZWNrbGlzdCIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0V4YW1wbGUiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9HdWlkZWxpbmUiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Fc3RpbWF0ZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0VzdGltYXRlL2VzdGltYXRpb25NZXRyaWMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vRXN0aW1hdGUvZXN0aW1hdGlvbkNvbmRlcmF0aW9ucyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Fc3RpbWF0aW5nTWV0cmljIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vUmVwb3J0Ii8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vVGVtcGxhdGUiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9TdXBwb3J0aW5nTWF0ZXJpYWwiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Ub29sTWVudG9yIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vV2hpdGVwYXBlciIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1Rlcm1EZWZpbml0aW9uIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vUHJhY3RpY2UiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9QcmFjdGljZS9zdWJQcmFjdGljZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9QcmFjdGljZS9jb250ZW50UmVmZXJlbmNlcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1ByYWN0aWNlL2FjdGl2aXR5UmVmZXJlbmNlcyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9SZXVzYWJsZUFzc2V0Ii8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vRGlzY2lwbGluZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vRGlzY2lwbGluZS90YXNrcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0Rpc2NpcGxpbmUvcmVmZXJlbmNlV29ya2Zsb3dzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0NvbnRlbnRDYXRlZ29yeSIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1JvbGVTZXQiPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1JvbGVTZXQvcm9sZXMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vRG9tYWluIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Eb21haW4vd29ya1Byb2R1Y3RzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0RvbWFpbi9zdWJkb21haW5zIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1dvcmtQcm9kdWN0VHlwZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vV29ya1Byb2R1Y3RUeXBlL3dvcmtQcm9kdWN0cyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9EaXNjaXBsaW5lR3JvdXBpbmciPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0Rpc2NpcGxpbmVHcm91cGluZy9kaXNjaXBsaW5lcyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Ub29sIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Ub29sL3Rvb2xNZW50b3JzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1JvbGVTZXRHcm91cGluZyI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vUm9sZVNldEdyb3VwaW5nL3JvbGVTZXRzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0N1c3RvbUNhdGVnb3J5Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9DdXN0b21DYXRlZ29yeS9jYXRlZ29yaXplZEVsZW1lbnRzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vQ3VzdG9tQ2F0ZWdvcnkvc3ViQ2F0ZWdvcmllcyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9EZWxpdmVyeVByb2Nlc3MiPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0RlbGl2ZXJ5UHJvY2Vzcy9lZHVjYXRpb25NYXRlcmlhbHMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9EZWxpdmVyeVByb2Nlc3MvY29tbXVuaWNhdGlvbnNNYXRlcmlhbHMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vUHJvY2VzcyI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vUHJvY2Vzcy9pbmNsdWRlc1BhdHRlcm5zIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vUHJvY2Vzcy9kZWZhdWx0Q29udGV4dCIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1Byb2Nlc3MvdmFsaWRDb250ZXh0Ii8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0NhcGFiaWxpdHlQYXR0ZXJuIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUiPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1Byb2Nlc3NQbGFubmluZ1RlbXBsYXRlL2Jhc2VkT25Qcm9jZXNzZXMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vUm9hZG1hcCIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1Byb2Nlc3NDb21wb25lbnQiPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1Byb2Nlc3NDb21wb25lbnQvaW50ZXJmYWNlcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Qcm9jZXNzQ29tcG9uZW50L3Byb2Nlc3MiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vUHJvY2Vzc1BhY2thZ2UiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Qcm9jZXNzUGFja2FnZS9wcm9jZXNzRWxlbWVudHMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vUHJvY2Vzc1BhY2thZ2UvZGlhZ3JhbXMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1Byb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UvaW50ZXJmYWNlU3BlY2lmaWNhdGlvbnMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZS9pbnRlcmZhY2VJTyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Qcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvciI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vUHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3IvUHJvY2Vzc0NvbXBvbmVudCIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9NZXRob2RQbHVnaW4iPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL01ldGhvZFBsdWdpbi91c2VyQ2hhbmdlYWJsZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9NZXRob2RQbHVnaW4vbWV0aG9kUGFja2FnZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9NZXRob2RQbHVnaW4vYmFzZXMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vVmFyaWFiaWxpdHlFbGVtZW50Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9WYXJpYWJpbGl0eUVsZW1lbnQvdmFyaWFiaWxpdHlUeXBlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vVmFyaWFiaWxpdHlFbGVtZW50L3ZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vUHJvY2Vzc0NvbnRyaWJ1dGlvbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vUHJvY2Vzc0NvbnRyaWJ1dGlvbi9iYXNlUHJvY2VzcyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9NZXRob2RVbml0Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9NZXRob2RVbml0L2F1dGhvcnMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9NZXRob2RVbml0L2NoYW5nZURhdGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9NZXRob2RVbml0L2NoYW5nZURlc2NyaXB0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vTWV0aG9kVW5pdC92ZXJzaW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vTWV0aG9kVW5pdC9jb3B5cmlnaHRTdGF0ZW1lbnQiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vTWV0aG9kQ29uZmlndXJhdGlvbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vTWV0aG9kQ29uZmlndXJhdGlvbi9tZXRob2RQbHVnaW5TZWxlY3Rpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9NZXRob2RDb25maWd1cmF0aW9uL21ldGhvZFBhY2thZ2VTZWxlY3Rpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9NZXRob2RDb25maWd1cmF0aW9uL3Byb2Nlc3NWaWV3cyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL01ldGhvZENvbmZpZ3VyYXRpb24vZGVmYXVsdFZpZXciLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9NZXRob2RDb25maWd1cmF0aW9uL2Jhc2VDb25maWd1cmF0aW9ucyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Qcm9jZXNzRmFtaWx5Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Qcm9jZXNzRmFtaWx5L2RlbGl2ZXJ5UHJvY2Vzc2VzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL01ldGhvZExpYnJhcnkiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9NZXRob2RMaWJyYXJ5L21ldGhvZFBsdWdpbnMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vTWV0aG9kTGlicmFyeS9wcmVkZWZpbmVkQ29uZmlndXJhdGlvbnMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gIDwvZ2VuUGFja2FnZXM+Ci08L2dlbm1vZGVsOkdlbk1vZGVsPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9tb2RlbC8xLjAuMy9wcm9wZXJ0aWVzLnR4dCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvbW9kZWwvMS4wLjMvcHJvcGVydGllcy50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmYjNmOWMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9tb2RlbC8xLjAuMy9wcm9wZXJ0aWVzLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotTm9uLU5MUyBNYXJrZXJzOgl0cnVlCi1Db250YWlubWVudCBQcm94aWVzOgl0cnVlCi1TdXBwcmVzcyBFTUYgTWV0YWRhdGE6CWZhbHNlCi1Sb290IEV4dGVuZHMgQ2xhc3M6CW9yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUuaW1wbC5NdWx0aVJlc291cmNlRU9iamVjdAotUm9vdCBFeHRlbmRzIEludGVyZmFjZToJb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS5JTW9kZWxPYmplY3QKLUNvZGUgRm9ybWF0dGluZzoJdHJ1ZQotRHluYW1pYyBUZW1wbGF0ZXM6CXRydWUKLVRlbXBsYXRlIERpcmVjdG9yeToJL29yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUvdGVtcGxhdGVzCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL21vZGVsLzEuMC4zL3VtYS5lY29yZSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvbW9kZWwvMS4wLjMvdW1hLmVjb3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZGM1NzcwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvbW9kZWwvMS4wLjMvdW1hLmVjb3JlCisrKyAvZGV2L251bGwKQEAgLTEsMTIyOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGVjb3JlOkVQYWNrYWdlIHhtaTp2ZXJzaW9uPSIyLjAiCi0gICAgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICAgIHhtbG5zOmVjb3JlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIiBuYW1lPSJ1bWEiCi0gICAgbnNVUkk9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuMy91bWEuZWNvcmUiIG5zUHJlZml4PSJvcmcuZWNsaXBzZS5lcGYudW1hIj4KLSAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IjAzIi8+Ci0gIDwvZUFubm90YXRpb25zPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IkRhdGUiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLnV0aWwuRGF0ZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRGF0YSB0eXBlIHVzZWQgZm9yIGF0dHJpYnV0ZXMgb2YgbWV0YS1tb2RlbCBjbGFzc2VzIG9mIHRoZSB0eXBlIERhdGUuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IlVyaSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubmV0LlVSSSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRGF0YSB0eXBlIHVzZWQgZm9yIGF0dHJpYnV0ZXMgb2YgbWV0YS1tb2RlbCBjbGFzc2VzIHRoYXQgcG9pbnQgdG8gcmVzb3VyY2VzIHN1Y2ggYXMgZmlsZXMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IlVubGltaXRlZE5hdHVyYWwiIGluc3RhbmNlQ2xhc3NOYW1lPSJpbnQiLz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJTdHJpbmciIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLmxhbmcuU3RyaW5nIi8+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iU2V0IiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS51dGlsLlNldCIvPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IlNlcXVlbmNlIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS51dGlsLkxpc3QiLz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJJbnRlZ2VyIiBpbnN0YW5jZUNsYXNzTmFtZT0iaW50Ii8+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iRmxvYXQiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLmxhbmcuRmxvYXQiLz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJDbGFzc2lmaWVyIiBhYnN0cmFjdD0idHJ1ZSIgZVN1cGVyVHlwZXM9IiMvL1R5cGUiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlVNTCAyLjAgbWV0YS1jbGFzcyBDbGFzc2lmaWVyLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJUeXBlIiBhYnN0cmFjdD0idHJ1ZSIgZVN1cGVyVHlwZXM9IiMvL1BhY2thZ2VhYmxlRWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVU1MIDIuMCBtZXRhLWNsYXNzIFR5cGUuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkVsZW1lbnQiIGFic3RyYWN0PSJ0cnVlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJVTUwgMi4wIG1ldGEtY2xhc3MgRWxlbWVudC4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iTmFtZWRFbGVtZW50IiBhYnN0cmFjdD0idHJ1ZSIgZVN1cGVyVHlwZXM9IiMvL0VsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlVNTCAyLjAgbWV0YS1jbGFzcyBOYW1lZCBFbGVtZW50LiAgRGVmaW5lZCB0aGF0IGV2ZXJ5IGVsZW1lbnQgaGFzIGEgbmFtZS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibmFtZSIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlBhY2thZ2VhYmxlRWxlbWVudCIgYWJzdHJhY3Q9InRydWUiCi0gICAgICBlU3VwZXJUeXBlcz0iIy8vTmFtZWRFbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJVTUwgMi4wIG1ldGEtY2xhc3MgUGFja2FnYWJsZSBFbGVtZW50LiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQYWNrYWdlIiBlU3VwZXJUeXBlcz0iIy8vTmFtZXNwYWNlICMvL1BhY2thZ2VhYmxlRWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVU1MIDIuMCBtZXRhLWNsYXNzIFBhY2thZ2UuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ik5hbWVzcGFjZSIgYWJzdHJhY3Q9InRydWUiIGVTdXBlclR5cGVzPSIjLy9OYW1lZEVsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlVNTCAyLjAgbWV0YS1jbGFzcyBOYW1lc3BhY2UuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ik1ldGhvZEVsZW1lbnQiIGFic3RyYWN0PSJ0cnVlIiBlU3VwZXJUeXBlcz0iIy8vUGFja2FnZWFibGVFbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJFdmVyeSBjbGFzcyBkZWZpbmVkIGluIHRoaXMgc3BlY2lmaWNhdGlvbiBpcyBkZXJpdmVkIGZyb20gTWV0aG9kIEVsZW1lbnQuICBJbiBvdGhlciB3b3JkcyBNZXRob2QgRWxlbWVudCBpcyB0aGUgcm9vdCBnZW5lcmFsaXphdGlvbiBmb3IgYWxsIFVNQSBjbGFzc2VzIGFuZCBkZWZpbmVzIGEgY29tbW9uIHNldCBvZiBhdHRyaWJ1dGVzIGluaGVyaXRlZCBieSBldmVyeSBvdGhlciBlbGVtZW50IHR5cGUgb2YgdGhpcyBtb2RlbC4gIE1ldGhvZCBFbGVtZW50IGl0c2VsZiBpcyBkZXJpdmVkIGZyb20gUGFja2FnZWFibGUgRWxlbWVudCBmcm9tIHRoZSBVTUwgMi4wIEluZnJhc3RydWN0dXJlLiAgTWV0aG9kIEVsZW1lbnQgaW5oZXJpdHMgdGhlIE5hbWUgYXR0cmlidXRlIGZyb20gUGFja2FnZWFibGUgRWxlbWVudCdzIHN1cGVyIGNsYXNzLiAgRXZlcnkgZWxlbWVudCBkZWZpbmVkIGFzIGEgVU1BIGluc3RhbmNlIGlzIGRlcml2ZWQgZnJvbSBNb2RlbCBFbGVtZW50LiAgRXZlcnkgTWV0aG9kIEVsZW1lbnQgaW4tc3RhbmNlIGlzIGF0IGxlYXN0IGRlZmluZWQgYnkgYSB1bmlxdWUgaWQsIGEgbmFtZSwgYXMgd2VsbCBhcyBicmllZiBkZXNjcmlwdGlvbi4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZ3VpZCIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRXZlcnkgaW5zdGFuY2Ugb2YgTWV0aG9kIEVsZW1lbnQgaGFzIGEgZ2xvYmFsIHVuaXF1ZSBpZC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYnJpZWZEZXNjcmlwdGlvbiIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL1N0cmluZyIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRXZlcnkgaW5zdGFuY2Ugb2YgTWV0aG9kIEVsZW1lbnQgc2hhbGwgYmUgYnJpZWZseSBkZXNjcmliZWQgd2l0aCBvbmUgb3IgdHdvIHNlbnRlbmNlcyBzdW1tYXJpemluZyB0aGUgZWxlbWVudC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ib3duZWRSdWxlcyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vQ29uc3RyYWludCIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic3VwcHJlc3NlZCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW5PYmplY3QiCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iSWYgYSBWYXJpYWJpbGl0eSBFbGVtZW50IGlzIGRlcml2ZWQgZnJvbSBhbm90aGVyIFZhcmlhYmlsaXR5IEVsZW1lbnQgdXNpbmcgdGhlIEV4dGVuZHMgVmFyaWFiaWxpdHkgU3BlY2lhbGl6YXRpb24gdGhlbiB0aGlzIGF0dHJpYnV0ZSBjYW4gYmUgdXNlZCB0byBzdXBwcmVzcyBpbmhlcml0ZWQgTWV0aG9kIEVsZW1lbnRzIHRoYXQgd2VyZSBwYXJ0IG9mIHRoZSBiYXNlZC1vbiBWYXJpYWJpbGl0eSBFbGVtZW50LCB3aGljaCBjYW4gYmUgYW55IHR5cGUgb2YgTWV0aG9kIEVsZW1lbnQuICBJbiBvdGhlciB3b3JkcywgaWYgdGhpcyBhdHRyaWJ1dGUgaXMgc2V0IHRvIHRydWUgb24gYSBNZXRob2QgRWxlbWVudCB0aGF0IGhhcyB0aGUgc2FtZSBuYW1lIHRoYW4gYW4gaW5oZXJpdGVkIG1ldGhvZCBlbGVtZW50IHRoZW4gaXQgd2lsbCBub3QgYmUgcmVnYXJkZWQgYXMgaW5oZXJpdGVkIGF0IGFsbC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ib3JkZXJpbmdHdWlkZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL1N0cmluZyIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhpcyBhdHRyaWJ1dGUgaXMgdXNlZCBmb3IgQ0FTRSB0b29sIHJlYWxpemF0aW9ucyBvZiB0aGlzIG1vZGVsIHRvIGNvbnRhaW4gaW5mb3JtYXRpb24gYWJvdXQgbGF5b3V0IGFuZCBvcmRlcmluZyBvZiB0aGUgbWV0aG9kIGVsZW1lbnQgYW5kIGl0cyBwYXJ0cy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQ29uc3RyYWludCIgZVN1cGVyVHlwZXM9IiMvL01ldGhvZEVsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgQ29uc3RyYWludCBpcyBhIE1ldGhvZCBFbGVtZW50IHRoYXQgcmVwcmVzZW50cyBhIGNvbmRpdGlvbiBvciByZXN0cmljdGlvbiBleHByZXNzZWQgaW4gbmF0dXJhbCBsYW5ndWFnZSB0ZXh0IG9yIGluIGEgbWFjaGluZSByZWFkYWJsZSBsYW5ndWFnZSBmb3IgdGhlIHB1cnBvc2Ugb2YgZGVjbGFyaW5nIHNvbWUgb2YgdGhlIHNlbWFudGljcyBvZiBhIE1ldGhvZCBFbGVtZW50LiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJib2R5IiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGlzIGF0dHJpYnV0ZSBzdG9yZXMgdGhlIGRlZmluaXRpb24gb2YgdGhlIGNvbnN0cmFpbnQuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkNvbnRlbnRFbGVtZW50IiBhYnN0cmFjdD0idHJ1ZSIgZVN1cGVyVHlwZXM9IiMvL0Rlc2NyaWJhYmxlRWxlbWVudCAjLy9WYXJpYWJpbGl0eUVsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkNvbnRlbnQgRWxlbWVudCBpcyBhIERlc2NyaWJhYmxlIEVsZW1lbnQgdGhhdCByZXByZXNlbnRzIGFuIGFic3RyYWN0IGdlbmVyYWxpemF0aW9uIGZvciBhbGwgZWxlbWVudHMgdGhhdCBhcmUgY29uc2lkZXJlZCB0byBiZSBhbmQgbWFuYWdlZCBhcyBNZXRob2QgQ29udGVudC4mI3hEOyYjeEE7Q29udGVudCBFbGVtZW50cyByZXByZXNlbnRzIHJldXNhYmxlIE1ldGhvZCBDb250ZW50IHRoYXQgaXMgc3VwcG9zZWQgdG8gYmUgbWFuYWdlZCBpbiBDb250ZW50IFBhY2thZ2VzLiAgVGhlIHNlcGFyYXRpb24gb2YgQ29udGVudCBFbGVtZW50IGZyb20gUHJvY2VzcyBFbGVtZW50IGFsbG93cyB0byBjbGVhcmx5IGRpc3Rpbmd1aXNoIGJldHdlZW4gcHVyZSBtZXRob2QgY29udGVudCBmcm9tIGNvbnRlbnQgdGhhdCBpcyByZXByZXNlbnRlZCBpbiBwcm9jZXNzZXMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InN1cHBvcnRpbmdNYXRlcmlhbHMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1N1cHBvcnRpbmdNYXRlcmlhbCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJjb25jZXB0c0FuZFBhcGVycyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vQ29uY2VwdCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJjaGVja2xpc3RzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9DaGVja2xpc3QiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZ3VpZGVsaW5lcyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vR3VpZGVsaW5lIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImV4YW1wbGVzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9FeGFtcGxlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImFzc2V0cyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vUmV1c2FibGVBc3NldCIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJEZXNjcmliYWJsZUVsZW1lbnQiIGFic3RyYWN0PSJ0cnVlIgotICAgICAgZVN1cGVyVHlwZXM9IiMvL01ldGhvZEVsZW1lbnQgIy8vQ2xhc3NpZmllciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRGVzY3JpYmFibGUgRWxlbWVudCBpcyBhbiBhYnN0cmFjdCBnZW5lcmFsaXphdGlvbiBvZiBNZXRob2QgRWxlbWVudHMgZm9yIHdoaWNoIGV4dGVybmFsIHByZXNlbnRhdGlvbiBuYW1lcyBhcyB3ZWxsIGFzIGNvbnRlbnQgZGVzY3JpcHRpb25zIGhhdmUgYmVlbiBkZWZpbmVkLCBzdWNoIGFzIFJvbGVzIG9yIFdvcmsgUHJvZHVjdHMuICBQcmVzZW50YXRpb24gTmFtZSBhbmQgQ29udGVudCBEZXNjcmlwdGlvbnMgYXJlIHR5cGljYWxseSBsb2NhbGl6ZWQgdXNpbmcgYSByZXNvdXJjZSBhbGxvY2F0aW9uIG1lY2hhbmlzbSBmb3IgaXRzIFN0cmluZyB0eXBlIGF0dHJpYnV0ZXMuJiN4RDsmI3hBO1RoaXMgYWJzdHJhY3Rpb24gcmVwcmVzZW50cyBhbGwgZWxlbWVudHMgaW4gdGhlIE1ldGhvZCBDb250ZW50IGFzIHdlbGwgYXMgUHJvY2VzcyBzcGFjZSBmb3Igd2hpY2ggY29uY3JldGUgdGV4dHVhbCBkZXNjcmlwdGlvbnMgYXJlIGRlZmluZWQgaW4gdGhlIGZvcm0gb2YgZG9jdW1lbnRpbmcgYXR0cmlidXRlcyBncm91cGVkIGluIGEgbWF0Y2hpbmcgQ29udGVudCBEZXNjcmlwdGlvbiBpbnN0YW5jZSAoc2VlIFNlY3Rpb24gNC4xLjQpLiAgRGVzY3JpYmFibGUgRWxlbWVudHMgYXJlIGludGVuZGVkIHRvIGJlIHB1Ymxpc2hlZCBpbiBtZXRob2Qgb3IgcHJvY2VzcyBwdWJsaWNhdGlvbnMgKHNpbWlsYXIgdG8gdGhlIElCTSBSYXRpb25hbCBVbmlmaWVkIFByb2Nlc3Mgd2ViKS4gIERlc2NyaWJhYmxlIEVsZW1lbnQgZGVmaW5lcyB0aGF0IHRoZSBlbGVtZW50IGl0IHJlcHJlc2VudHMgd2lsbCBoYXZlIGNvbnRlbnQgJ2F0dGFjaGVkJyB0byBpdC4gIENvbnRlbnQgRGVzY3JpcHRpb24gaXMgdGhlIGFic3RyYWN0aW9uIGZvciB0aGUgYWN0dWFsIHBsYWNlcyBpbiB3aGljaCB0aGUgY29udGVudCBpcyBiZWluZyByZXByZXNlbnRlZC4gIFRoaXMgc2VwYXJhdGlvbiBhbGxvd3MgYSBkaXN0aW5jdGlvbiBiZXR3ZWVuIGNvcmUgbWV0aG9kIG1vZGVsIGVsZW1lbnRzIGRlc2NyaWJpbmcgdGhlIHN0cnVjdHVyZSBvZiB0aGUgbW9kZWwgZnJvbSB0aGUgYWN0dWFsIGRlc2NyaXB0aW9uIGNvbnRhaW5lciBwcm92aWRpbmcsIGZvciBleGFtcGxlLCB0aGUgZG9jdW1lbnRhdGlvbiBvZiB0aGUgY29udGVudCBlbGVtZW50IGluIGRpZmZlcmVudCBhbHRlcm5hdGl2ZXMgbGFuZ3VhZ2VzLCBhdWRpZW5jZXMsIGxpY2Vuc2luZyBsZXZlbHMsIGV0Yy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icHJlc2VudGF0aW9uTmFtZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL1N0cmluZyIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRXZlcnkgRGVzY3JpYmFibGUgRWxlbWVudCBoYXMgYSBwcmVzZW50YXRpb24gbmFtZSwgd2hpY2ggaXMgdXNlZCBmb3IgZXh0ZXJuYWwgcHJlc2VudGF0aW9uIG9mIHRoZSBlbGVtZW50LiAgRm9yIGV4YW1wbGUsIG5hbWUgKHRoZSBpbnRlcm5hbCByZXByZXNlbnRhdGlvbikgbWlnaHQgYmUgc2V0IHRvICZxdW90O3J1cF9hcmNoaXRlY3R1cmVfZG9jdW1lbnQmcXVvdDsgdG8gZGlmZmVyZW50aWF0ZSBmcm9tIGEgJnF1b3Q7ajJlZV9hcmNoaXRjdHVyZV9kb2N1bWVudCZxdW90OyB3aGVyZWFzIHRoZSBleHRlcm5hbCBwcmVzZW50YXRpb24gd291bGQgYWx3YXlzIGJlICZxdW90O0FyY2hpdGVjdHVyZSBEb2N1bWVudCZxdW90Oy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icHJlc2VudGF0aW9uIiBlVHlwZT0iIy8vQ29udGVudERlc2NyaXB0aW9uIgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzaGFwZWljb24iIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9VcmkiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIHJlZmVyZW5jZSB0byBhbiBpY29uIHRoYXQgY2FuIGJlIHVzZWQgZm9yIG1vZGVsaW5nIHdpdGggc3BlY2lmaWMgQ29udGVudCBFbGVtZW50IGluc3RhbmNlcyAoYXMgZ3JhcGhpY2FsIHN0ZXJlb3R5cGVzLCBlLmcuIGEgdXNlIGNhc2Ugc3ltYm9sIGZvciBhIHVzZSBjYXNlIGFydGlmYWN0KSBhcyB3ZWxsIGFzIHB1YmxpY2F0aW9uIG9mIGNvbnRlbnQuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im5vZGVpY29uIiBlVHlwZT0iIy8vVXJpIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSByZWZlcmVuY2UgdG8gYW4gaWNvbiB0aGF0IGNhbiBiZSB1c2VkIGluIHRyZWUgYnJvd3NlciBwcmVzZW50YXRpb25zIGFuZCBicmVha2Rvd24gc3RydWN0dXJlcy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQ29udGVudERlc2NyaXB0aW9uIiBlU3VwZXJUeXBlcz0iIy8vTWV0aG9kVW5pdCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQ29udGVudCBEZXNjcmlwdGlvbiBpcyBhIE1ldGhvZCBFbGVtZW50IHRoYXQgaXMgdXNlZCB0byBzdG9yZSB0aGUgdGV4dHVhbCBkZXNjcmlwdGlvbiBmb3IgYSBDb250ZW50IEVsZW1lbnQuICBJdCBkZWZpbmVzIHN0YW5kYXJkIGF0dHJpYnV0ZXMgYXBwbGljYWJsZSBmb3IgYWxsIENvbnRlbnQgRWxlbWVudCB0eXBlcy4gIFNwZWNpZmljIENvbnRlbnQgRWxlbWVudCBzdWItdHlwZXMgY2FuIGRlZmluZSB0aGVpciBvd24gbWF0Y2hpbmcgQ29udGVudCBEZXNjcmlwdGlvbiBzdWItdHlwZXMuICIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJtYWluRGVzY3JpcHRpb24iIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoaXMgYXR0cmlidXRlIHN0b3JlIHRoZSBtYWluIGRlc2NyaXB0aXZlIHRleHQgZm9yIHRoZSBDb250ZW50IEVsZW1lbnQuICBBbGwgdGV4dCB0aGF0IGlzIG5vdCBwYXJ0IG9mIGFueSBvZiB0aGUgbW9yZSBzcGVjaWZpYyBhdHRyaWJ1dGVzIHNoYWxsIGJlIHN0b3JlZCBoZXJlLiAgSWYgdGhlIENvbnRlbnQgRGVzY3JpcHRpb24gaXMgZGl2aWRlZCBpbnRvIHNlY3Rpb25zIHVzaW5nIHRoZSBTZWN0aW9uIGNsYXNzLCB0aGVuIG9ubHkgdGhlIHRleHQgZnJvbSB0aGUgJ3N0YXJ0JyBvZiB0aGUgY29udGVudCBkZXNjcmlwdGlvbiB0byB0aGUgZmlyc3Qgc2VjdGlvbiB3aWxsIGJlIHN0b3JlZCBoZXJlIChzaW1pbGFyIHRvIGEgbm9ybWFsIGRvY3VtZW50IHdoZXJlIHlvdSBjYW4gcGxhY2UgdGV4dCBiZXR3ZWVuIGl0cyBiZWdpbm5pbmcgdG8gaXRzIGZpcnN0IGRpY3Rpb24gaGVhZGluZykuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InNlY3Rpb25zIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9TZWN0aW9uIiBjb250YWlubWVudD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJrZXlDb25zaWRlcmF0aW9ucyIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iS2V5IENvbnNpZGVyYXRpb25zIHByb3ZpZGVzIGFkdmlzZSBhbmQgZ3VpZGFuY2Ugb2YgYSBjcml0aWNhbCBuYXR1cmUgZm9yIHRoZSBjb250ZW50IGVsZW1lbnQgYXMgd2VsbCBhcyB3YXJuaW5ncywgY2F1dGlvbnMsIHBpdGZhbGxzLCBkYW5nZXJzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJTZWN0aW9uIiBlU3VwZXJUeXBlcz0iIy8vVmFyaWFiaWxpdHlFbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIFNlY3Rpb24gaXMgYSBzcGVjaWFsIE1ldGhvZCBFbGVtZW50IHRoYXQgcmVwcmVzZW50cyBzdHJ1Y3R1cmFsIHN1YnNlY3Rpb25zIG9mIGEgQ29udGVudCBEZXNjcmlwdGlvbidzIHNlY3Rpb25EZXNjcmlwdGlvbiBhdHRyaWJ1dGUuICBJdCBpcyB1c2VkIGZvciBlaXRoZXIgbGFyZ2Ugc2NhbGUgZG9jdW1lbnRhdGlvbiBvZiBDb250ZW50IEVsZW1lbnRzIG9yZ2FuaXplZCBpbnRvIHNlY3Rpb25zIGFzIHdlbGwgYXMgdG8gZmxleGlibHkgYWRkIG5ldyBTZWN0aW9ucyB0byBDb250ZW50IEVsZW1lbnRzIHVzaW5nIGNvbnRyaWJ1dGlvbiB2YXJpYWJpbGl0eSBhZGRlZCB0byB0aGUgU2VjdGlvbiBjb25jZXB0IGZvciBNZXRob2QgUGx1Zy1pbnMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InNlY3Rpb25OYW1lIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJFdmVyeSBTZWN0aW9uIGhhcyBhIG5hbWUgdXNlZCBmb3IgZXh0ZXJuYWwgcHJlc2VudGF0aW9uIG9mIHRoZSBzZWN0aW9uLCBlLmcuIHdoZW4gcHVibGlzaGVkIG9yIHdoZW4gc2VjdGlvbiBoZWFkaW5nIGFyZSBsaXN0ZWQgaW4gYSB0YWJsZSBvZiBjb250ZW50cy4gIFRoaXMgYXR0cmlidXRlIGlzIHNpbWlsYXIgdG8gUHJlc2VudGF0aW9uIE5hbWUgZm9yIENvbnRlbnQgRWxlbWVudHMuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InNlY3Rpb25EZXNjcmlwdGlvbiIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhpcyBhdHRyaWJ1dGVzIHN0b3JlIHRoZSBkZXNjcmlwdGlvbiB0ZXh0IGZvciBhIENvbnRlbnQgRGVzY3JpcHRpb24ncyBTZWN0aW9uLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJzdWJTZWN0aW9ucyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vU2VjdGlvbiIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icHJlZGVjZXNzb3IiIGVUeXBlPSIjLy9TZWN0aW9uIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlJvbGUiIGVTdXBlclR5cGVzPSIjLy9Db250ZW50RWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBSb2xlIGlzIGEgY29udGVudCBlbGVtZW50IHRoYXQgZGVmaW5lcyBhIHNldCBvZiByZWxhdGVkIHNraWxscywgY29tcGV0ZW5jaWVzLCBhbmQgcmVzcG9uc2liaWxpdGllcy4gIFJvbGVzIGFyZSB1c2VkIGJ5IFRhc2tzIHRvIGRlZmluZSB3aG8gcGVyZm9ybXMgdGhlbSBhcyB3ZWxsIGFzIGRlZmluZSBhIHNldCBvZiB3b3JrIHByb2R1Y3RzIHRoZXkgYXJlIHJlc3BvbnNpYmxlIGZvci4gICYjeEQ7JiN4QTtBIFJvbGUgZGVmaW5lcyBhIHNldCBvZiByZWxhdGVkIHNraWxscywgY29tcGV0ZW5jaWVzLCBhbmQgcmVzcG9uc2liaWxpdGllcyBvZiBhbiBpbmRpdmlkdWFsIG9yIGEgc2V0IG9mIGluZGl2aWR1YWxzLiAgUm9sZXMgYXJlIG5vdCBpbmRpdmlkdWFscyBvciByZXNvdXJjZXMuICBJbmRpdmlkdWFsIG1lbWJlcnMgb2YgdGhlIGRldmVsb3BtZW50IG9yZ2FuaXphdGlvbiB3aWxsIHdlYXIgZGlmZmVyZW50IGhhdHMsIG9yIHBlcmZvcm0gZGlmZmVyZW50IHJvbGVzLiBUaGUgbWFwcGluZyBmcm9tIGluZGl2aWR1YWwgdG8gcm9sZSwgcGVyZm9ybWVkIGJ5IHRoZSBwcm9qZWN0IG1hbmFnZXIgd2hlbiBwbGFubmluZyBhbmQgc3RhZmZpbmcgZm9yIGEgcHJvamVjdCwgYWxsb3dzIGRpZmZlcmVudCBpbmRpdmlkdWFscyB0byBhY3QgYXMgc2V2ZXJhbCBkaWZmZXJlbnQgcm9sZXMsIGFuZCBmb3IgYSByb2xlIHRvIGJlIHBsYXllZCBieSBzZXZlcmFsIGluZGl2aWR1YWxzLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJtb2RpZmllcyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vV29ya1Byb2R1Y3QiIGNoYW5nZWFibGU9ImZhbHNlIiB2b2xhdGlsZT0idHJ1ZSIKLSAgICAgICAgdHJhbnNpZW50PSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InJlc3BvbnNpYmxlRm9yIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Xb3JrUHJvZHVjdCIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJXb3JrUHJvZHVjdCIgYWJzdHJhY3Q9InRydWUiIGVTdXBlclR5cGVzPSIjLy9Db250ZW50RWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV29yayBQcm9kdWN0IGlzIGFuIGFic3RyYWN0IGNsYXNzIHdoaWNoIHByb3ZpZGVzIGEgZ2VuZXJhbGl6YXRpb24gZm9yIHRoZSBjb250ZW50IGVsZW1lbnQgdHlwZXMgQXJ0aWZhY3QsIE91dGNvbWUsIGFuZCBEZWxpdmVyYWJsZS4gIFRoZSBtZXRhLW1vZGVsIGNsYXNzIFdvcmsgUHJvZHVjdCBhY3R1YWxseSByZXByZXNlbnRzIHdvcmsgcHJvZHVjdCB0eXBlcywgaS5lLiBhbiBpbnN0YW5jZSBvZiBXb3JrIFByb2R1Y3QgaXMgYSBkZXNjcmlwdGlvbiBvZiBhIHNwZWNpZmljIHR5cGUgb2Ygd29yayBwcm9kdWN0IGFuZCBub3QgYW4gaW5kaXZpZHVhbCB3b3JrIHByb2R1Y3QgaW5zdGFuY2UuICBIb3dldmVyLCBmb3Igc2ltcGxpY2l0eSByZWFzb25zIGFuZCBiZWNhdXNlIG9mIGxvdyByaXNrIG9mIG1pc2ludGVycHJldGF0aW9uIHdlIGRpZCBub3QgYXBwZW5kIHRoZSB3b3JkICd0eXBlJyB0byBldmVyeSBtZXRhLWNsYXNzLiYjeEQ7JiN4QTtBIHdvcmsgcHJvZHVjdCBpcyBhbiBhYnN0cmFjdGlvbiBmb3IgZGVzY3JpcHRpb25zIG9mIGNvbnRlbnQgZWxlbWVudHMgdGhhdCBhcmUgdXNlZCB0byBkZWZpbmUgYW55dGhpbmcgdXNlZCwgcHJvZHVjZWQsIG9yIG1vZGlmaWVkIGJ5IGEgdGFzay4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icmVwb3J0cyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vUmVwb3J0Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InRlbXBsYXRlcyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vVGVtcGxhdGUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0idG9vbE1lbnRvcnMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1Rvb2xNZW50b3IiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIgotICAgICAgICBvcmRlcmVkPSJmYWxzZSIgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iVGFzayIgZVN1cGVyVHlwZXM9IiMvL0NvbnRlbnRFbGVtZW50ICMvL1dvcmtEZWZpbml0aW9uIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIFRhc2sgaXMgYSBjb250ZW50IGVsZW1lbnQgdGhhdCBkZXNjcmliZXMgd29yayBiZWluZyBwZXJmb3JtZWQgYnkgUm9sZXMuICBJdCBkZWZpbmVzIG9uZSBkZWZhdWx0IHBlcmZvcm1pbmcgUm9sZSBhcyB3ZWxsIGFzIG1hbnkgYWRkaXRpb25hbCBwZXJmb3JtZXJzLiAgQSBUYXNrIGlzIGFzc29jaWF0ZWQgdG8gaW5wdXQgYW5kIG91dHB1dCB3b3JrIHByb2R1Y3RzLiAgSW5wdXRzIGFyZSBkaWZmZXJlbnRpYXRlZCBpbiBtYW5kYXRvcnkgdmVyc3VzIG9wdGlvbmFsIGlucHV0cy4gIFRoZSBhc3NvY2lhdGlvbnMgdG8gV29yayBQcm9kdWN0cyBhcmUgbm90IGluc3RhbnRpYXRhYmxlL3ZhcmlhYmxlLWxpa2UgcGFyYW1ldGVycy4gIFRoZXkgcmF0aGVyIGV4cHJlc3MgKGh5cGVyLSlsaW5rcyB0byB0aGUgZGVzY3JpcHRpb25zIG9mIHRoZSB3b3JrIHByb2R1Y3RzIHR5cGVzIHRoYXQgYXJlIHJlbGF0ZWQgdG8gdGhlIFRhc2sgYXMgaW5wdXRzIGFuZCBvdXRwdXRzLiAgSW4gb3RoZXIgd29yZHMsIHRoZXNlIGFzc29jaWF0aW9ucyBhcmUgbm90IGludGVuZGVkIHRvIGJlIHVzZWQgdG8gY2FwdHVyZSB3aGljaCBjb25jcmV0ZSBpbnN0YW5jZXMgd2lsbCBiZSBwYXNzZWQgd2hlbiBpbnN0YW50aWF0aW5nIHRoZSBtZXRob2QgaW4gYSBwcm9qZWN0LiAgQWxsIG9mIHRoZSBUYXNrJ3MgZGVmYXVsdCBhc3NvY2lhdGlvbnMgY2FuIGJlIG92ZXJyaWRkZW4gaW4gYW4gYWN0dWFsIHByb2Nlc3MgZGVmaW5pdGlvbi4mI3hEOyYjeEE7QSBUYXNrIGRlc2NyaWJlcyBhbiBhc3NpZ25hYmxlIHVuaXQgb2Ygd29yay4gIEV2ZXJ5IFRhc2sgaXMgYXNzaWduZWQgdG8gc3BlY2lmaWMgUm9sZXMuICBUaGUgZ3JhbnVsYXJpdHkgb2YgYSBUYXNrIGlzIGdlbmVyYWxseSBhIGZldyBob3VycyB0byBhIGZldyBkYXlzLiAgSXQgdXN1YWxseSBhZmZlY3RzIG9uZSBvciBvbmx5IGEgc21hbGwgbnVtYmVyIG9mIHdvcmsgcHJvZHVjdHMuIEEgVGFzayBpcyB1c2VkIGFzIGFuIGVsZW1lbnQgb2YgZGVmaW5pbmcgYSBwcm9jZXNzLiBUYXNrcyBhcmUgZnVydGhlciB1c2VkIGZvciBwbGFubmluZyBhbmQgdHJhY2tpbmcgcHJvZ3Jlc3M7IHRoZXJlZm9yZSwgaWYgdGhleSBhcmUgZGVmaW5lZCB0b28gZmluZS1ncmFpbmVkLCB0aGV5IHdpbGwgYmUgbmVnbGVjdGVkLCBhbmQgaWYgdGhleSBhcmUgdG9vIGxhcmdlLCBwcm9ncmVzcyB3b3VsZCBoYXZlIHRvIGJlIGV4cHJlc3NlZCBpbiB0ZXJtcyBvZiBhIFRhc2sncyBwYXJ0cyAoZS5nLiBTdGVwcywgd2hpY2ggaXMgbm90IHJlY29tbWVuZGVkKS4gJiN4RDsmI3hBO0EgVGFzayBoYXMgYSBjbGVhciBwdXJwb3NlIGluIHdoaWNoIHRoZSBwZXJmb3JtaW5nIHJvbGVzIGFjaGlldmUgYSB3ZWxsIGRlZmluZWQgZ29hbC4gIEl0IHByb3ZpZGVzIGNvbXBsZXRlIHN0ZXAtYnktc3RlcCBleHBsYW5hdGlvbnMgb2YgZG9pbmcgYWxsIHRoZSB3b3JrIHRoYXQgbmVlZHMgdG8gYmUgZG9uZSB0byBhY2hpZXZlIHRoaXMgZ29hbC4gIFRoaXMgZGVzY3JpcHRpb24gaXMgY29tcGxldGUsIGluZGVwZW5kZW50IG9mIHdoZW4gaW4gYSBwcm9jZXNzIGxpZmVjeWNsZSB0aGUgd29yayB3b3VsZCBhY3R1YWxseSBiZSBkb25lLiAgSXQgdGhlcmVmb3JlIGRvZXMgbm90IGRlc2NyaWJlIHdoZW4geW91IGRvIHdoYXQgd29yayBhdCB3aGF0IHBvaW50IG9mIHRpbWUsIGJ1dCBkZXNjcmliZXMgYWxsIHRoZSB3b3JrIHRoYXQgZ2V0cyBkb25lIHRocm91Z2hvdXQgdGhlIGRldmVsb3BtZW50IGxpZmVjeWNsZSB0aGF0IGNvbnRyaWJ1dGVzIHRvIHRoZSBhY2hpZXZlbWVudCBvZiB0aGlzIGdvYWwuICBXaGVuIHRoZSBUYXNrIGlzIGJlaW5nIGFwcGxpZWQgaW4gYSBwcm9jZXNzIHRoZW4gdGhpcyBwcm9jZXNzIGFwcGxpY2F0aW9uIChkZWZpbmVkIGFzIFRhc2sgRGVzY3JpcHRvcikgcHJvdmlkZXMgdGhlIGluZm9ybWF0aW9uIG9mIHdoaWNoIHBpZWNlcyBvZiB0aGUgVGFzayB3aWxsIGFjdHVhbGx5IGJlIHBlcmZvcm1lZCBhdCBhbnkgcGFydGljdWxhciBwb2ludCBpbiB0aW1lLiBUaGlzIGFzc3VtZXMgdGhhdCB0aGUgVGFzayB3aWxsIGJlIHBlcmZvcm1lZCBpbiB0aGUgcHJvY2VzcyBvdmVyIGFuZCBvdmVyIGFnYWluLCBidXQgZWFjaCB0aW1lIHdpdGggYSBzbGlnaHRseSBkaWZmZXJlbnQgZW1waGFzaXMgb24gZGlmZmVyZW50IHN0ZXBzIG9yIGFzcGVjdHMgb2YgdGhlIHRhc2sgZGVzY3JpcHRpb24uICYjeEQ7JiN4QTtGb3IgZXhhbXBsZSwgYSBUYXNrIHN1Y2ggYXMgJnF1b3Q7RGV2ZWxvcCBVc2UgQ2FzZSBNb2RlbCZxdW90OyBkZXNjcmliZXMgYWxsIHRoZSB3b3JrIHRoYXQgbmVlZHMgdG8gYmUgZG9uZSB0byBkZXZlbG9wIGEgY29tcGxldGUgdXNlIGNhc2UgbW9kZWwuIFRoaXMgd291bGQgY29tcHJpc2Ugb2YgdGhlIGlkZW50aWZpY2F0aW9uIGFuZCBuYW1pbmcgb2YgdXNlIGNhc2VzIGFuZCBhY3RvcnMsIHRoZSB3cml0aW5nIG9mIGEgYnJpZWYgZGVzY3JpcHRpb24sIHRoZSBtb2RlbGluZyBvZiB1c2UgY2FzZXMgYW5kIHRoZWlyIHJlbGF0aW9uc2hpcHMgaW4gZGlhZ3JhbXMsIHRoZSBkZXRhaWxlZCBkZXNjcmlwdGlvbiBvZiBhIGJhc2ljIGZsb3csIHRoZSBkZXRhaWxlZCBkZXNjcmlwdGlvbiBvZiBhbHRlcm5hdGl2ZXMgZmxvd3MsIHBlcmZvcm1pbmcgb2Ygd2Fsa3Rocm91Z2hzIHdvcmtzaG9wcyBhbmQgcmV2aWV3cywgZXRjLiAgQWxsIG9mIHRoZXNlIHBhcnRzIGNvbnRyaWJ1dGUgdG8gdGhlIGRldmVsb3BtZW50IGdvYWwgb2YgZGV2ZWxvcGluZyB0aGUgdXNlIGNhc2UgbW9kZWwsIGJ1dCB0aGUgcGFydHMgd2lsbCBiZSBwZXJmb3JtZWQgYXQgZGlmZmVyZW50IHBvaW50cyBpbiB0aW1lIGluIGEgcHJvY2Vzcy4gIElkZW50aWZpY2F0aW9uLCBuYW1pbmcsIGFuZCBicmllZiBkZXNjcmlwdGlvbnMgd291bGQgYmUgcGVyZm9ybWVkIGVhcmx5IGluIGEgdHlwaWNhbCBkZXZlbG9wbWVudCBwcm9jZXNzIHZlcnN1cyB0aGUgd3JpdGluZyBvZiBkZXRhaWxlZCBhbHRlcm5hdGl2ZSBmbG93cyB3aGljaCB3b3VsZCBiZSBwZXJmb3JtZWQgbXVjaCBsYXRlci4gIEFsbCB0aGVzZSBwYXJ0cyBvciBzdGVwcyB3aXRoaW4gdGhlIHNhbWUgVGFzayBkZWZpbmUgdGhlICZxdW90O21ldGhvZCZxdW90OyBvZiBEZXZlbG9waW5nIGEgVXNlIENhc2UgTW9kZWwuICBBcHBseWluZyBzdWNoIGEgbWV0aG9kIGluIGEgbGlmZWN5Y2xlIChpLmUuIGluIGEgcHJvY2VzcykgaXMgZGVmaW5pbmcgd2hpY2ggc3RlcHMgYXJlIGRvbmUgd2hlbiBnb2luZyBmcm9tIG9uZSBpdGVyYXRpb24gdG8gdGhlIG5leHQuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InBlcmZvcm1lZEJ5IiBlVHlwZT0iIy8vUm9sZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJtYW5kYXRvcnlJbnB1dCIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vV29ya1Byb2R1Y3QiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ib3V0cHV0IiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Xb3JrUHJvZHVjdCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJhZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSIKLSAgICAgICAgb3JkZXJlZD0iZmFsc2UiIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vUm9sZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJvcHRpb25hbElucHV0IiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Xb3JrUHJvZHVjdCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJzdGVwcyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vU3RlcCIgY2hhbmdlYWJsZT0iZmFsc2UiIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiCi0gICAgICAgIGRlcml2ZWQ9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0idG9vbE1lbnRvcnMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1Rvb2xNZW50b3IiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIgotICAgICAgICBvcmRlcmVkPSJmYWxzZSIgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iV29ya0RlZmluaXRpb24iIGFic3RyYWN0PSJ0cnVlIiBlU3VwZXJUeXBlcz0iIy8vTWV0aG9kRWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV29yayBEZWZpbml0aW9uIGlzIGFuIGFic3RyYWN0IE1ldGhvZCBFbGVtZW50IHRoYXQgZ2VuZXJhbGl6ZXMgYWxsIGRlc2NyaXB0aW9ucyBvZiB3b3JrIHdpdGhpbiB0aGUgVW5pZmllZCBNZXRob2QgQXJjaGl0ZWN0dXJlLiAgVGhpcyBwYWNrYWdlIGludHJvZHVjZXMgdHdvIGNvbmNyZXRlIHR5cGVzIG9mIFdvcmsgRGVmaW5pdGlvbnM6IFRhc2sgYW5kIFN0ZXAuICBXb3JrIERlZmluaXRpb25zIGNhbiBjb250YWluIHNldHMgb2YgcHJlLSBhbmQgcG9zdC1jb25kaXRpb25zIGRlZmluaW5nIGNvbnN0cmFpbnRzIHRoYXQgbmVlZCB0byBiZSB2YWxpZCBiZWZvcmUgdGhlIGRlc2NyaWJlZCB3b3JrIGNhbiBiZWdpbiBvciBiZWZvcmUgaXQgY2FuIGJlIGRlY2xhcmVkIGFzIGZpbmlzaGVkLiAgTm90ZSB0aGF0IGdlbmVyYWwgb3duZWRSdWxlcyBjYW4gYmUgdXNlZCB0byBkZWZpbmUgYWRkaXRpb25hbCBjb25zdHJhaW50cyBhbmQgcnVsZXMgZm9yIFdvcmsgRGVmaW5pdGlvbnMuJiN4RDsmI3hBO1dvcmsgRGVmaW5pdGlvbnMgcmVwcmVzZW50IGJlaGF2aW9yYWwgZGVzY3JpcHRpb25zIGZvciBkb2luZyB3b3JrLiAgVGhlc2UgYmVoYXZpb3JhbCBkZXNjcmlwdGlvbnMgYXJlIG5vdCBib3VuZCB0byBvbmUgc3BlY2lmaWMgY2xhc3NpZmllciwgYnV0IHJlcHJlc2VudCBhbiBhcmJpdHJhcnkgZGVmaW5pdGlvbiBvZiB3b3JrLiAgRm9yIGV4YW1wbGUsIGEgV29yayBEZWZpbml0aW9uIGNvdWxkIHJlcHJlc2VudCB3b3JrIHRoYXQgaXMgYmVpbmcgcGVyZm9ybWVkIGJ5IGEgc3BlY2lmaWMgUm9sZSAoZS5nLiBhIFJvbGUgcGVyZm9ybWluZyBhIHNwZWNpZmljIFRhc2sgb3IgU3RlcHMgb2YgYSBUYXNrKSwgYnkgbWFueSBSb2xlcyB3b3JraW5nIGluIGNsb3NlIGNvbGxhYm9yYXRpb24gKG1hbnkgUm9sZXMgYWxsIHdvcmtpbmcgdG9nZXRoZXIgb24gdGhlIHNhbWUgaW50ZXJkaXNjaXBsaW5hcnkgVGFzayksIG9yIGNvbXBsZXggd29yayB0aGF0IGlzIHBlcmZvcm1lZCB0aHJvdWdob3V0IHRoZSBsaWZlY3ljbGUgKGUuZy4gYSBwcm9jZXNzIGRlZmluaW5nIGEgYnJlYWtkb3duIHN0cnVjdHVyZSBmb3Igb3JnYW5pemluZyBsYXJnZXIgY29tcG9zaXRlIHVuaXRzIG9mIHdvcmsgcGVyZm9ybWVkIGJ5IG1hbnkgUm9sZXMgd29ya2luZyBpbiBjb2xsYWJvcmF0aW9uKS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icHJlY29uZGl0aW9uIiBlVHlwZT0iIy8vQ29uc3RyYWludCIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icG9zdGNvbmRpdGlvbiIgZVR5cGU9IiMvL0NvbnN0cmFpbnQiCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlN0ZXAiIGVTdXBlclR5cGVzPSIjLy9TZWN0aW9uICMvL1dvcmtEZWZpbml0aW9uIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIFN0ZXAgaXMgYSBTZWN0aW9uIGFuZCBXb3JrIERlZmluaXRpb24gdGhhdCBpcyB1c2VkIHRvIG9yZ2FuaXplIFRhc2tzIGludG8gcGFydHMgb3Igc3VidW5pdHMgb2Ygd29yay4gIFN0ZXBzIGluaGVyaXQgdGhlIHN1YlNlY3Rpb25zIGRlY29tcG9zaXRpb24gZnJvbSBTZWN0aW9uIGFuZCBjYW4gdGhlcmVmb3JlIGRlc2NyaWJlIFN1Yi1TdGVwcyBuZXN0ZWQgaW50byBTdGVwcy4mI3hEOyYjeEE7QSBTdGVwIGRlc2NyaWJlcyBhIG1lYW5pbmdmdWwgYW5kIGNvbnNpc3QgcGFydCBvZiB0aGUgb3ZlcmFsbCB3b3JrIGRlc2NyaWJlZCBmb3IgYSBUYXNrLiAgVGhlIGNvbGxlY3Rpb24gb2YgU3RlcHMgZGVmaW5lZCBmb3IgYSBUYXNrIHJlcHJlc2VudHMgYWxsIHRoZSB3b3JrIHRoYXQgc2hvdWxkIGJlIGRvbmUgdG8gYWNoaWV2ZSB0aGUgb3ZlcmFsbCBkZXZlbG9wbWVudCBnb2FsIG9mIHRoZSBUYXNrLiAgTm90IGFsbCBzdGVwcyBhcmUgbmVjZXNzYXJpbHkgcGVyZm9ybWVkIGVhY2ggdGltZSBhIFRhc2sgaXMgaW52b2tlZCBpbiBhIFByb2Nlc3MgKHNlZSBUYXNrIERlc2NyaXB0b3IpLCBzbyB0aGV5IGNhbiBhbHNvIGJlIGV4cHJlc3NlZCBpbiB0aGUgZm9ybSBvZiBhbHRlcm5hdGUgJ2Zsb3dzJyBvZiB3b3JrLiAgRGlmZmVyZW50IHdheXMgb2YgYWNoaWV2aW5nIHRoZSBzYW1lIGRldmVsb3BtZW50IGdvYWwgY2FuIHRoZW4gYmUgJ2Fzc2VtYmxlZCcgYnkgc2VsZWN0aW5nIGRpZmZlcmVudCBjb21iaW5hdGlvbnMgb2Ygc3RlcHMgd2hlbiBhcHBseWluZyB0aGUgVGFzayBpbiBhIFByb2Nlc3MuICBUeXBpY2FsIGtpbmRzIG9mIHN0ZXBzIGEgVGFzayBhdXRob3Igc2hvdWxkIGNvbnNpZGVyIGFyZTogVGhpbmtpbmcgc3RlcHM6IHdoZXJlIHRoZSBpbmRpdmlkdWFsIHJvbGVzIHVuZGVyc3RhbmQgdGhlIG5hdHVyZSBvZiB0aGUgdGFzaywgZ2F0aGVycyBhbmQgZXhhbWluZXMgdGhlIGlucHV0IGFydGlmYWN0cywgYW5kIGZvcm11bGF0ZXMgdGhlIG91dGNvbWUuIFBlcmZvcm1pbmcgc3RlcHM6IHdoZXJlIHRoZSBpbmRpdmlkdWFsIHJvbGVzIGNyZWF0ZSBvciB1cGRhdGUgc29tZSBhcnRpZmFjdHMuIFJldmlld2luZyBzdGVwczogd2hlcmUgdGhlIGluZGl2aWR1YWwgcm9sZXMgaW5zcGVjdHMgdGhlIHJlc3VsdHMgYWdhaW5zdCBzb21lIGNyaXRlcmlhLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJHdWlkYW5jZSIgYWJzdHJhY3Q9InRydWUiIGVTdXBlclR5cGVzPSIjLy9Db250ZW50RWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iR3VpZGFuY2UgaXMgYW4gYWJzdHJhY3QgZ2VuZXJhbGl6YXRpb24gb2YgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWxhdGVkIHRvIGNvbnRlbnQgZWxlbWVudHMgc3VjaCBhcyBSb2xlcywgVGFza3MsIGFuZCBXb3JrIFByb2R1Y3RzLiAgRXhhbXBsZXMgZm9yIEd1aWRhbmNlIGFyZSBHdWlkZWxpbmVzLCBUZW1wbGF0ZXMsIENoZWNrbGlzdHMsIFRvb2wgTWVudG9ycywgRXN0aW1hdGVzLCBTdXBwb3J0aW5nIE1hdGVyaWFscywgUmVwb3J0cywgQ29uY2VwdHMsIGV0Yy4gIFRoaXMgcGFja2FnZSBvbmx5IGNvbnRhaW5zIHRoZSBkZWZpbml0aW9uIG9mIHRoZSBhYnN0cmFjdCBHdWlkYW5jZSBjbGFzcy4gIFRoZSBwYWNrYWdlIEd1aWRhbmNlIFR5cGVzIGRlZmluZXMgY29uY3JldGUgZ3VpZGFuY2UgdHlwZXMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkFydGlmYWN0IiBlU3VwZXJUeXBlcz0iIy8vV29ya1Byb2R1Y3QiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkFydGlmYWN0IGlzIGEgV29yayBQcm9kdWN0IHRoYXQgcHJvdmlkZXMgYSBkZXNjcmlwdGlvbiBhbmQgZGVmaW5pdGlvbiBmb3IgdGFuZ2libGUgd29yayBwcm9kdWN0IHR5cGVzLiBBcnRpZmFjdHMgbWF5IGJlIGNvbXBvc2VkIG9mIG90aGVyIGFydGlmYWN0cy4gRm9yIGV4YW1wbGUsIGEgbW9kZWwgYXJ0aWZhY3QgY2FuIGJlIGNvbXBvc2VkIG9mIG1vZGVsIGVsZW1lbnRzLCB3aGljaCBhcmUgYWxzbyBhcnRpZmFjdHMuJiN4RDsmI3hBO0FydGlmYWN0cyBhcmUgdGFuZ2libGUgd29yayBwcm9kdWN0cyBjb25zdW1lZCwgcHJvZHVjZWQsIG9yIG1vZGlmaWVkIGJ5IFRhc2tzLiAgSXQgbWF5IHNlcnZlIGFzIGEgYmFzaXMgZm9yIGRlZmluaW5nIHJldXNhYmxlIGFzc2V0cy4gIFJvbGVzIHVzZSBBcnRpZmFjdHMgdG8gcGVyZm9ybSBUYXNrcyBhbmQgcHJvZHVjZSBBcnRpZmFjdHMgaW4gdGhlIGNvdXJzZSBvZiBwZXJmb3JtaW5nIFRhc2tzLiAgQXJ0aWZhY3RzIGFyZSB0aGUgcmVzcG9uc2liaWxpdHkgb2YgYSBzaW5nbGUgUm9sZSwgbWFraW5nIHJlc3BvbnNpYmlsaXR5IGVhc3kgdG8gaWRlbnRpZnkgYW5kIHVuZGVyc3RhbmQsIGFuZCBwcm9tb3RpbmcgdGhlIGlkZWEgdGhhdCBldmVyeSBwaWVjZSBvZiBpbmZvcm1hdGlvbiBwcm9kdWNlZCBpbiB0aGUgbWV0aG9kIHJlcXVpcmVzIHRoZSBhcHByb3ByaWF0ZSBzZXQgb2Ygc2tpbGxzLiBFdmVuIHRob3VnaCBvbmUgcm9sZSBtaWdodCAmcXVvdDtvd24mcXVvdDsgYSBzcGVjaWZpYyB0eXBlIG9mIEFydGlmYWN0cywgb3RoZXIgcm9sZXMgY2FuIHN0aWxsIHVzZSB0aGUgQXJ0aWZhY3RzOyBwZXJoYXBzIGV2ZW4gdXBkYXRlIHRoZW0gaWYgdGhlIFJvbGUgaGFzIGJlZW4gZ2l2ZW4gcGVybWlzc2lvbiB0byBkbyBzby4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iY29udGFpbmVyQXJ0aWZhY3QiIGVUeXBlPSIjLy9BcnRpZmFjdCIKLSAgICAgICAgdHJhbnNpZW50PSJ0cnVlIiBlT3Bwb3NpdGU9IiMvL0FydGlmYWN0L2NvbnRhaW5lZEFydGlmYWN0cyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJjb250YWluZWRBcnRpZmFjdHMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0FydGlmYWN0IiBjb250YWlubWVudD0idHJ1ZSIgZU9wcG9zaXRlPSIjLy9BcnRpZmFjdC9jb250YWluZXJBcnRpZmFjdCIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJEZWxpdmVyYWJsZSIgZVN1cGVyVHlwZXM9IiMvL1dvcmtQcm9kdWN0Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIGRlbGl2ZXJhYmxlIGlzIGEgV29yayBQcm9kdWN0IHRoYXQgcHJvdmlkZXMgYSBkZXNjcmlwdGlvbiBhbmQgZGVmaW5pdGlvbiBmb3IgcGFja2FnaW5nIG90aGVyIFdvcmsgUHJvZHVjdHMsIGFuZCBtYXkgYmUgZGVsaXZlcmVkIHRvIGFuIGludGVybmFsIG9yIGV4dGVybmFsIHBhcnR5LiAgVGhlcmVmb3JlLCBhIERlbGl2ZXJhYmxlIGFnZ3JlZ2F0ZXMgb3RoZXIgV29yayBQcm9kdWN0cy4gVGhlcmVmb3JlLCBhIERlbGl2ZXJhYmxlIGFnZ3JlZ2F0ZXMgb3RoZXIgV29yayBQcm9kdWN0cy4gIEEgRGVsaXZlcmFibGUgaXMgdXNlZCB0byBwcmUtZGVmaW5lIHR5cGljYWwgb3IgcmVjb21tZW5kZWQgY29udGVudCBpbiB0aGUgZm9ybSBvciB3b3JrIHByb2R1Y3RzIHRoYXQgd291bGQgYmUgcGFja2FnZWQgZm9yIGRlbGl2ZXJ5LiAgVGhlIGFjdHVhbCBwYWNrYWdpbmcgb2YgdGhlIERlbGl2ZXJhYmxlIGluIGFuIGFjdHVhbCBwcm9jZXNzIG9yIGV2ZW4gcHJvamVjdCBjb3VsZCBiZSBhIG1vZGlmaWNhdGlvbiBvZiB0aGlzIHJlY29tbWVuZGF0aW9uLiAgRGVsaXZlcmFibGVzIGFyZSB1c2VkIHRvIHJlcHJlc2VudCBhbiBvdXRwdXQgZnJvbSBhIHByb2Nlc3MgdGhhdCBoYXMgdmFsdWUsIG1hdGVyaWFsIG9yIG90aGVyd2lzZSwgdG8gYSBjbGllbnQsIGN1c3RvbWVyIG9yIG90aGVyIHN0YWtlaG9sZGVyLiAiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZGVsaXZlcmVkV29ya1Byb2R1Y3RzIgotICAgICAgICBvcmRlcmVkPSJmYWxzZSIgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Xb3JrUHJvZHVjdCIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJPdXRjb21lIiBlU3VwZXJUeXBlcz0iIy8vV29ya1Byb2R1Y3QiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkFuIG91dGNvbWUgZGVzY3JpYmVzIGludGFuZ2libGUgd29yayBwcm9kdWN0cyB0aGF0IGFyZSBhIHJlc3VsdCBvciBzdGF0ZS4gT3V0Y29tZXMgbWF5IGFsc28gYmUgdXNlZCB0byBkZXNjcmliZSB3b3JrIHByb2R1Y3RzIHRoYXQgYXJlIG5vdCBmb3JtYWxseSBkZWZpbmVkLiAgQSBrZXkgZGlmZmVyZW50aWF0b3IgZm9yIG91dGNvbWVzIGFnYWluc3QgYXJ0aWZhY3RzIGlzIHRoYXQgb3V0Y29tZXMgYXJlIG5vdCBjYW5kaWRhdGVzIGZvciBoYXJ2ZXN0aW5nIGFzIHJldXNhYmxlIGFzc2V0cy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iTWV0aG9kUGFja2FnZSIgYWJzdHJhY3Q9InRydWUiIGVTdXBlclR5cGVzPSIjLy9NZXRob2RFbGVtZW50ICMvL1BhY2thZ2UiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgTWV0aG9kIFBhY2thZ2UgaXMgYW4gYWJzdHJhY3QgY2xhc3MgZm9yIHBhY2thZ2luZyBNZXRob2QgRWxlbWVudHMuICBBbGwgTWV0aG9kIEVsZW1lbnRzIHNoYWxsIGJlIGxvY2F0ZWQgaW4gZXhhY3RseSBvbmUgb2YgTWV0aG9kIFBhY2thZ2UncyBjb25jcmV0ZSBzcGVjaWFsaXphdGlvbnMgKGUuZy4gQ29udGVudCBQYWNrYWdlKS4gICBNZXRob2QgUGFja2FnZSBkZWZpbmVzIGNvbW1vbiBwcm9wZXJ0aWVzIGZvciBhbGwgb2YgaXRzIHNwZWNpYWxpemF0aW9ucy4gRWxlbWVudHMgYXJlIG9yZ2FuaXplZCBpbiBNZXRob2QgUGFja2FnZXMgdG8gc3RydWN0dXJlIGxhcmdlIHNjYWxlIG9mIG1ldGhvZCBjb250ZW50IGFuZCBwcm9jZXNzZXMgYXMgd2VsbCBhcyB0byBkZWZpbmUgYSBtZWNoYW5pc20gZm9yIHJldXNlLiAgTWV0aG9kIEVsZW1lbnRzIGZyb20gb25lIHBhY2thZ2UgY2FuIHJldXNlIGVsZW1lbnQgZnJvbSBvdGhlciBwYWNrYWdlcyBieSBkZWZpbmluZyBhIHJldXNlZFBhY2thZ2VzIGxpbmsuICBGb3IgZXhhbXBsZSwgYSB3b3JrIHByb2R1Y3QgZGVmaW5lZCBpbiBvbmUgcGFja2FnZSBjYW4gYmUgdXNlZCBhcyBhbiBpbnB1dCBmb3IgVGFza3MgZGVmaW5lZCBpbiBvdGhlciBwYWNrYWdlcy4gIEJ5IHJldXNpbmcgaXQgZnJvbSBvbmUgY29tbW9uIHBsYWNlIChpLmUuIHRoZSBwYWNrYWdlIGluIHdoaWNoIGl0IGhhcyBiZWVuIGRlZmluZWQpIGVuc3VyZXMgdGhhdCBubyByZWR1bmRhbnQgZGVmaW5pdGlvbnMgb2YgdGhlIHNhbWUgZWxlbWVudHMgYXJlIHJlcXVpcmVkLiAgQWxzbyBtYWludGVuYW5jZSBvZiBtZXRob2QgY29udGVudCBpcyBncmVhdGx5IGltcHJvdmVkIGFzIGNoYW5nZXMgY2FuIGJlIHBlcmZvcm1lZCBpbiBvbmx5IG9uZSBwbGFjZS4gIE5vdGUsIHRoYXQgb3RoZXIgcGFja2FnZXMgd2lsbCBpbnRyb2R1Y2UgbW9yZSBzcGVjaWFsaXphdGlvbnMgb2YgTWV0aG9kIFBhY2thZ2UsIGUuZy4gUHJvY2VzcyBQYWNrYWdlIGFuZCBQcm9jZXNzIENvbXBvbmVudC4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZ2xvYmFsIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbk9iamVjdCIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJNZXRob2QgUGFja2FnZXMgY2FuIGhhdmUgYSBnbG9iYWwgc2NvcGUuICBUaGlzIG1lYW5zIHRoYXQgZXZlcnkgZWxlbWVudCBvZiBldmVyeSBvdGhlciBNZXRob2QgUGFja2FnZSBjYW4gc2VlIHRoZSBnbG9iYWwgcGFja2FnZSdzIGNvbnRlbnRzLiAgR2xvYmFsIE1ldGhvZCBQYWNrYWdlcyBhcmUgcHJpbWFyaWx5IHVzZWQgdG8gc3RvcmUgY29tbW9ubHkgdXNlZCBjYXRlZ29yeSBkZWZpbml0aW9ucyBzdWNoIGFzIGZvciBEaXNjaXBsaW5lcyBvciBEb21haW5zLCB3aGljaCBhcmUgdXNlZCBieSBtYW55IFRhc2sgYW5kIFdvcmsgUHJvZHVjdHMgcmVzcGVjdGl2ZWx5LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJyZXVzZWRQYWNrYWdlcyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vTWV0aG9kUGFja2FnZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJjaGlsZFBhY2thZ2VzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9NZXRob2RQYWNrYWdlIiBjb250YWlubWVudD0idHJ1ZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJDb250ZW50UGFja2FnZSIgZVN1cGVyVHlwZXM9IiMvL01ldGhvZFBhY2thZ2UiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgQ29udGVudCBQYWNrYWdlIGlzIHNwZWNpYWwgTWV0aG9kIFBhY2thZ2UgdGhhdCBjb250YWlucyBDb250ZW50IEVsZW1lbnRzIGFuZCBDb250ZW50IEVsZW1lbnRzLCBvbmx5LiAgRXhhbXBsZXMgZm9yIENvbnRlbnQgRWxlbWVudCBhcmUgQXJ0aWZhY3RzLCBUYXNrcywgUm9sZXMsIGV0Yy4gIEEga2V5IHNlcGFyYXRpb24gb2YgY29uY2VybnMgaW4gVU1BIGlzIHRoZSBkaXN0aW5jdGlvbiBiZXR3ZWVuIE1ldGhvZCBDb250ZW50IGFuZCBQcm9jZXNzLiAgVGhpcyBzZXBhcmF0aW9uIGlzIGVuZm9yY2VkIGJ5IHNwZWNpYWwgcGFja2FnZSB0eXBlcywgd2hpY2ggZG8gbm90IGFsbG93IHRoZSBtaXhpbmcgb2YgbWV0aG9kIGNvbnRlbnQgd2l0aCBwcm9jZXNzZXMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImNvbnRlbnRFbGVtZW50cyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vQ29udGVudEVsZW1lbnQiIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkFydGlmYWN0RGVzY3JpcHRpb24iIGVTdXBlclR5cGVzPSIjLy9Xb3JrUHJvZHVjdERlc2NyaXB0aW9uIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYnJpZWZPdXRsaW5lIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJQcm92aWRlcyBhIGJyaWVmIGRlc2NyaXB0aW9uIG9mIHRoZSBpbmZvcm1hdGlvbiB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGlzIGFydGlmYWN0LiBGb3IgZXhhbXBsZSwgZGlzY3Vzc2VzIHRoZSBjb250ZW50cyBmb3Iga2V5IGNoYXB0ZXJzIG9mIGEgZG9jdW1lbnQgYXJ0aWZhY3Qgb3IgdGhlIGtleSBwYWNrYWdlcyBhbmQgbW9kdWxlcyBvZiBhIG1vZGVsIGFydGlmYWN0LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyZXByZXNlbnRhdGlvbk9wdGlvbnMiCi0gICAgICAgIGVUeXBlPSIjLy9TdHJpbmciIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkRpc2N1c3NlcyBkaWZmZXJlbnQgcG9zc2libGUgYWx0ZXJuYXRpdmUgcmVwcmVzZW50YXRpb25zIGZvciB0aGUgYXJ0aWZhY3QuIEZvciBleGFtcGxlIGEgZGVzaWduIG1vZGVsIGNhbiBiZSByZXByZXNlbnRlZCBhcyBhIFVNTCBtb2RlbCBvciBhbiBpbmZvcm1hbCBibG9jayBkaWFncmFtIG9yIGJ5IHRleHR1YWwgZGVzY3JpcHRpb24gb25seS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iV29ya1Byb2R1Y3REZXNjcmlwdGlvbiIgZVN1cGVyVHlwZXM9IiMvL0NvbnRlbnREZXNjcmlwdGlvbiI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImV4dGVybmFsSWQiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkFuIGV4dGVybmFsIHZpc2libGUgbnVtYmVyIHRoYXQgaXMgdXNlZCB0byByZWZlcmVuY2UgdGhpcyBhcnRpZmFjdC4gVXNlZCBsaWtlIGEgc3lub255bS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icHVycG9zZSIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRGVzY3JpYmVzIHdoeSB0aGUgd29yayBwcm9kdWN0IGlzIHByb2R1Y2VkIGFuZCB0byB3aGF0IHVzZSBpdCB3aWxsIGJlIHB1dC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaW1wYWN0T2ZOb3RIYXZpbmciIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkRlc2NyaWJlcyB0aGUgY29uc2VxdWVuY2VzIG9mIG5vdCBwcm9kdWNpbmcgdGhlIHdvcmsgcHJvZHVjdC4gIFRoaXMgaXMgaW50ZW5kZWQgdG8gYWlkIGluIHRoZSB0YWlsb3JpbmcgdGhlIG1ldGhvZC9wcm9jZXNzIHRvIHRoZSBuZWVkcyBvZiBhIHNwZWNpZmljIHByb2plY3QuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJlYXNvbnNGb3JOb3ROZWVkaW5nIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJEZXNjcmliZXMgdGhlIGNpcmN1bXN0YW5jZXMgaW4gd2hpY2ggaXQgaXMgcmVhc29uYWJsZSBub3QgdG8gcHJvZHVjZSB0aGUgd29yayBwcm9kdWN0LiAgVGhpcyBpcyBpbnRlbmRlZCB0byBhaWQgaW4gdGhlIHRhaWxvcmluZyBvZiB0aGUgbWV0aG9kL3Byb2Nlc3MgdG8gdGhlIG5lZWRzIG9mIGEgc3BlY2lmaWMgcHJvamVjdC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRGVsaXZlcmFibGVEZXNjcmlwdGlvbiIgZVN1cGVyVHlwZXM9IiMvL1dvcmtQcm9kdWN0RGVzY3JpcHRpb24iPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJleHRlcm5hbERlc2NyaXB0aW9uIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZGVzY3JpcHRpb24gb2YgdGhlIERlbGl2ZXJhYmxlIHVzZWQgZm9yIGNsaWVudCBkb2N1bWVudHMgKHByb3Bvc2FsLCBzdGF0ZW1lbnRzIG9mIHdvcmsgb3IgY29udHJhY3R1YWwgYWdyZWVtZW50cykuICBJdCBtaWdodCB1c2UgYSBkaWZmZXJlbnQgbGFuZ3VhZ2UgYW5kIGZvbGxvdyBsZWdhbCBjb25zdHJhaW50cy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icGFja2FnaW5nR3VpZGFuY2UiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlByb3ZpZGVzIGd1aWRhbmNlIG9uIGhvdyB0byBhc3NlbWJsZSB0aGUgZGVsaXZlcmFibGUgZnJvbSBhbGwgaXRzIHJlcXVpcmVkIGlucHV0cy4gIFRoaXMgc2VjdGlvbiBkZXNjcmliZXMgdGhlIG1vc3QgY29tbW9uIGNvbnRlbnQgbWVkaXVtIGFuZCBmb3JtYXQuICBEaXN0cmlidXRpb24gb2YgdGhlIGRlbGl2ZXJhYmxlIGlzIGFkZHJlc3NlZCBpbiB0aGlzIHNlY3Rpb24sIGlmIG5lY2Vzc2FyeS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUm9sZURlc2NyaXB0aW9uIiBlU3VwZXJUeXBlcz0iIy8vQ29udGVudERlc2NyaXB0aW9uIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic2tpbGxzIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJMaXN0cyBvZiBzZXQgb2YgcmVxdWlyZWQgc2tpbGxzIGEgcGVyc29uIG5lZWRzIHRvIHBvc3Nlc3MgdG8gZnVsZmlsbCB0aGF0IFJvbGUuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFzc2lnbm1lbnRBcHByb2FjaGVzIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJQcm92aWRlcyBndWlkYW5jZSBvbiBmb3IgYXNzaWduaW5nIGluZGl2aWR1YWxzIHRvIHRoZSBSb2xlIGluIHRlcm1zIG9mIHdoYXQgb3RoZXIgcm9sZXMgdGhlc2UgaW5kaXZpZHVhbHMgY291bGQgcGVyZm9ybSBhbmQgd2hhdCByZXNwb25zaWJpbGl0eSBkaWZmZXJlbnQgaW5kaXZpZHVhbHMgYXNzaWduZWQgdG8gdGhpcyByb2xlIG1pZ2h0IGhhdmUuICBUaGUgZ3VpZGFuY2UgY2FuIGFsc28gZGVzY3JpYmUgZGlmZmVyZW50IGFzc2lnbm1lbnQgYXBwcm9hY2hlcyBmb3IgZGlmZmVyZW50IHR5cGVzIG9mIHByb2plY3RzLCBlLmcuIGZvciBsYXJnZSB2ZXJzdXMgc21hbGwgdGVhbXMgd2hlcmUgaW5kaXZpZHVhbHMgY291bGQgYmUgYWxsb2NhdGVkIHRvIHJvbGVzIGZ1bGwgdGltZSB2ZXJzdXMgc2hhcmluZyByb2xlcyB3aXRoaW4gdGhlIHRlYW0uIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InN5bm9ueW1zIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJMaXN0cyBzeW5vbnltcywgaS5lLiBvdGhlciBuYW1lcyB0aGUgUm9sZSBtaWdodCBiZSByZWZlcnJlZCBieS4gIFRvb2wgc3VwcG9ydCBmb3IgdGhlIG1ldGEtbW9kZWwgbWlnaHQgc3VwcG9ydCB0aGF0IGEgUm9sZSBuYW1lIGNhbiBiZSBjb25zaXN0ZW50bHkgYmUgcmVwbGFjZWQgd2l0aCBvbmUgb2YgaXRzIHN5bm9ueW1zIHRocm91Z2h0IGEgUHJvY2Vzcy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iVGFza0Rlc2NyaXB0aW9uIiBlU3VwZXJUeXBlcz0iIy8vQ29udGVudERlc2NyaXB0aW9uIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icHVycG9zZSIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iU3VtbWFyaXplcyB0aGUgbWFpbiByZWFzb24gZm9yIHBlcmZvcm1pbmcgdGhpcyBUYXNrIGFuZCB3aGF0IGlzIGludGVuZGVkIHRvIGJlIGFjaGlldmVkLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhbHRlcm5hdGl2ZXMiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkNvbXByaXNlcyBvZiBzdW1tYXJpZXMgZGVzY3JpYmluZyBpbXBvcnRhbnQgZXhjZXB0aW9uYWwgYW5kIG5vbi1zdGFuZGFyZCB3YXlzIG9mIGFjaGlldmluZyB0aGlzIFRhc2sncyBkZXZlbG9wbWVudCBnb2FscyB0aGF0IHdlcmUgbm90IGNvdmVyZWQgYnkgdGhlIFRhc2sncyBTdGVwcy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iR3VpZGFuY2VEZXNjcmlwdGlvbiIgZVN1cGVyVHlwZXM9IiMvL0NvbnRlbnREZXNjcmlwdGlvbiI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImF0dGFjaG1lbnRzIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGlzIGZpZWxkIGlzIHByaW1hcmlseSB1c2VkIGZvciBhdHRhY2htZW50cyBhdWdtZW50aW5nIHRoZSBpbmZvcm1hdGlvbiBwcm92aWRlZCBmb3IgZ3VpZGFuY2UuICBJbiBwYXJ0aWN1bGFyIHRoZSBhdHRyaWJ1dGUgaXMgdXNlZCBmb3IgVGVtcGxhdGVzLCBFeGFtcGxlcywgYW5kIFJldXNhYmxlIEFzc2V0cyB0byBjb250YWluIHRoZSBhY3R1YWwgYXR0YWNobWVudCBkZXNjcmliZWQgaW4gdGhlIG1haW5EZXNjcmlwdGlvbi4gIEl0IGNhbiBhZGRpdGlvbmFsbHkgY29udGFpbiByZXByZXNlbnRhdGlvbnMgb2YgdGhlIGd1aWRhbmNlIGluIGp1c3QgYSB0aGlyZCBwYXJ0eSBmb3JtYXQsIGUuZy4gUERGLCBNUyBXb3JkLCBvciBXb3JkIFBlcmZlY3QuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlByYWN0aWNlRGVzY3JpcHRpb24iIGVTdXBlclR5cGVzPSIjLy9Db250ZW50RGVzY3JpcHRpb24iPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhZGRpdGlvbmFsSW5mbyIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQW55IGFkZGl0aW9uYWwgSW5mb3JtYXRpb24gbm90IGNvdmVyZWQgYnkgdGhlIG90aGVyIGF0dHJpYnV0ZXMuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InByb2JsZW0iIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgZGVzY3JpcHRpb24gb2YgdGhlIHByb2JsZW0gdGhlIFByYWN0aWNlIGFkZHJlc3Nlcy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYmFja2dyb3VuZCIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRWxhYm9yYXRpb24gb24gdGhlIGJhY2tncm91bmQgYW5kIHRoZSBjb250ZXh0IGluIHdoaWNoIHRoZSBwcm9ibGVtIG9jY3VycyBhbmQgd2hlcmUgdGhlIHNvbHV0aW9uIGRlc2NyaWJlZCBieSB0aGlzIFByYWN0aWNlIHdpbGwgZml0IGluLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJnb2FscyIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBzdW1tYXJ5IG9mIHRoZSBvdmVyYWxsIGdvYWxzIHRvIGJlIGFkZHJlc3NlZCBieSB0aGUgUHJhY3RpY2UuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFwcGxpY2F0aW9uIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJEZXNjcmliZXMgaG93IHRoZSBQcmFjdGljZSBpcyBiZWluZyBhcHBsaWVkIG9yIGludHJvZHVjZWQgaW50byB0aGUgY29udGV4dCBkZXNjcmliZWQgaW4gYmFja2dyb3VuZC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibGV2ZWxzT2ZBZG9wdGlvbiIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iT3V0bGluZXMgdGhlIGRpZmZlcmVudCBmb3JtcyBvciB2YXJpYW50cyBpbiB3aGljaCB0aGUgcHJhY3RpY2UgY291bGQgYmUgcmVhbGl6ZWQuIChlLmcuIGZ1bGwgYWRvcHRpb24gdmVydXMgYSBwYXJ0aWFsIGFkb3B0aW9uIG9mIHRoZSBQcmFjdGljZSkiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUG9pbnQiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ4IiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FRG91YmxlT2JqZWN0Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InkiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VEb3VibGVPYmplY3QiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iR3JhcGhFbGVtZW50IiBhYnN0cmFjdD0idHJ1ZSIgZVN1cGVyVHlwZXM9IiMvL0RpYWdyYW1FbGVtZW50Ij4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icG9zaXRpb24iIGVUeXBlPSIjLy9Qb2ludCIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iY29udGFpbmVkIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9EaWFncmFtRWxlbWVudCIgY29udGFpbm1lbnQ9InRydWUiIGVPcHBvc2l0ZT0iIy8vRGlhZ3JhbUVsZW1lbnQvY29udGFpbmVyIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImxpbmsiIG9yZGVyZWQ9ImZhbHNlIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL0RpYWdyYW1MaW5rIiBjb250YWlubWVudD0idHJ1ZSIgZU9wcG9zaXRlPSIjLy9EaWFncmFtTGluay9ncmFwaEVsZW1lbnQiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iYW5jaG9yYWdlIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9HcmFwaENvbm5lY3RvciIgY29udGFpbm1lbnQ9InRydWUiIGVPcHBvc2l0ZT0iIy8vR3JhcGhDb25uZWN0b3IvZ3JhcGhFbGVtZW50Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InNlbWFudGljTW9kZWwiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9TZW1hbnRpY01vZGVsQnJpZGdlIiBjb250YWlubWVudD0idHJ1ZSIgZU9wcG9zaXRlPSIjLy9TZW1hbnRpY01vZGVsQnJpZGdlL2dyYXBoRWxlbWVudCIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJEaWFncmFtRWxlbWVudCIgYWJzdHJhY3Q9InRydWUiIGVTdXBlclR5cGVzPSIjLy9NZXRob2RFbGVtZW50Ij4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaXNWaXNpYmxlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbk9iamVjdCIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJjb250YWluZXIiIGVUeXBlPSIjLy9HcmFwaEVsZW1lbnQiCi0gICAgICAgIHRyYW5zaWVudD0idHJ1ZSIgZU9wcG9zaXRlPSIjLy9HcmFwaEVsZW1lbnQvY29udGFpbmVkIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InJlZmVyZW5jZSIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vUmVmZXJlbmNlIiBlT3Bwb3NpdGU9IiMvL1JlZmVyZW5jZS9yZWZlcmVuY2VkIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InByb3BlcnR5IiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Qcm9wZXJ0eSIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRGlhZ3JhbUxpbmsiIGVTdXBlclR5cGVzPSIjLy9EaWFncmFtRWxlbWVudCI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Inpvb20iIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VEb3VibGVPYmplY3QiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0idmlld3BvcnQiIGVUeXBlPSIjLy9Qb2ludCIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZ3JhcGhFbGVtZW50IiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iIy8vR3JhcGhFbGVtZW50IiB0cmFuc2llbnQ9InRydWUiIGVPcHBvc2l0ZT0iIy8vR3JhcGhFbGVtZW50L2xpbmsiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZGlhZ3JhbSIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9IiMvL0RpYWdyYW0iIGVPcHBvc2l0ZT0iIy8vRGlhZ3JhbS9kaWFncmFtTGluayIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJHcmFwaENvbm5lY3RvciIgZVN1cGVyVHlwZXM9IiMvL0dyYXBoRWxlbWVudCI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImdyYXBoRWxlbWVudCIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9IiMvL0dyYXBoRWxlbWVudCIgdHJhbnNpZW50PSJ0cnVlIiBlT3Bwb3NpdGU9IiMvL0dyYXBoRWxlbWVudC9hbmNob3JhZ2UiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZ3JhcGhFZGdlIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9HcmFwaEVkZ2UiIGVPcHBvc2l0ZT0iIy8vR3JhcGhFZGdlL2FuY2hvciIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJTZW1hbnRpY01vZGVsQnJpZGdlIiBhYnN0cmFjdD0idHJ1ZSIKLSAgICAgIGVTdXBlclR5cGVzPSIjLy9EaWFncmFtRWxlbWVudCI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InByZXNlbnRhdGlvbiIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImdyYXBoRWxlbWVudCIgZVR5cGU9IiMvL0dyYXBoRWxlbWVudCIKLSAgICAgICAgdHJhbnNpZW50PSJ0cnVlIiBlT3Bwb3NpdGU9IiMvL0dyYXBoRWxlbWVudC9zZW1hbnRpY01vZGVsIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImRpYWdyYW0iIGVUeXBlPSIjLy9EaWFncmFtIgotICAgICAgICB0cmFuc2llbnQ9InRydWUiIGVPcHBvc2l0ZT0iIy8vRGlhZ3JhbS9uYW1lc3BhY2UiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRGltZW5zaW9uIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0id2lkdGgiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VEb3VibGVPYmplY3QiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaGVpZ2h0IiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FRG91YmxlT2JqZWN0Ii8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlJlZmVyZW5jZSIgZVN1cGVyVHlwZXM9IiMvL0RpYWdyYW1FbGVtZW50Ij4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaXNJbmRpdmlkdWFsUmVwcmVzZW50YXRpb24iCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuT2JqZWN0Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InJlZmVyZW5jZWQiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSIjLy9EaWFncmFtRWxlbWVudCIgZU9wcG9zaXRlPSIjLy9EaWFncmFtRWxlbWVudC9yZWZlcmVuY2UiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUHJvcGVydHkiIGVTdXBlclR5cGVzPSIjLy9EaWFncmFtRWxlbWVudCI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImtleSIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InZhbHVlIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iR3JhcGhFZGdlIiBlU3VwZXJUeXBlcz0iIy8vR3JhcGhFbGVtZW50Ij4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iYW5jaG9yIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iMiIgZVR5cGU9IiMvL0dyYXBoQ29ubmVjdG9yIiBlT3Bwb3NpdGU9IiMvL0dyYXBoQ29ubmVjdG9yL2dyYXBoRWRnZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ3YXlwb2ludHMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1BvaW50IiBjb250YWlubWVudD0idHJ1ZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJEaWFncmFtIiBlU3VwZXJUeXBlcz0iIy8vR3JhcGhOb2RlIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iem9vbSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRURvdWJsZU9iamVjdCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ2aWV3cG9pbnQiIGVUeXBlPSIjLy9Qb2ludCIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZGlhZ3JhbUxpbmsiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0RpYWdyYW1MaW5rIiBlT3Bwb3NpdGU9IiMvL0RpYWdyYW1MaW5rL2RpYWdyYW0iLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ibmFtZXNwYWNlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vU2VtYW50aWNNb2RlbEJyaWRnZSIgY29udGFpbm1lbnQ9InRydWUiIGVPcHBvc2l0ZT0iIy8vU2VtYW50aWNNb2RlbEJyaWRnZS9kaWFncmFtIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkdyYXBoTm9kZSIgZVN1cGVyVHlwZXM9IiMvL0dyYXBoRWxlbWVudCI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InNpemUiIGVUeXBlPSIjLy9EaW1lbnNpb24iCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlNpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50IiBlU3VwZXJUeXBlcz0iIy8vU2VtYW50aWNNb2RlbEJyaWRnZSI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InR5cGVJbmZvIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iVU1BU2VtYW50aWNNb2RlbEJyaWRnZSIgZVN1cGVyVHlwZXM9IiMvL1NlbWFudGljTW9kZWxCcmlkZ2UiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJlbGVtZW50IiBlVHlwZT0iIy8vTWV0aG9kRWxlbWVudCIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJDb3JlU2VtYW50aWNNb2RlbEJyaWRnZSIgZVN1cGVyVHlwZXM9IiMvL1NlbWFudGljTW9kZWxCcmlkZ2UiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJlbGVtZW50IiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iIy8vRWxlbWVudCIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJMZWFmRWxlbWVudCIgYWJzdHJhY3Q9InRydWUiIGVTdXBlclR5cGVzPSIjLy9EaWFncmFtRWxlbWVudCIvPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlRleHRFbGVtZW50IiBlU3VwZXJUeXBlcz0iIy8vTGVhZkVsZW1lbnQiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ0ZXh0IiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iSW1hZ2UiIGVTdXBlclR5cGVzPSIjLy9MZWFmRWxlbWVudCI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InVyaSIgZVR5cGU9IiMvL1VyaSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJtaW1lVHlwZSIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkdyYXBoaWNQcmltaXRpdmUiIGFic3RyYWN0PSJ0cnVlIiBlU3VwZXJUeXBlcz0iIy8vTGVhZkVsZW1lbnQiLz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQb2x5bGluZSIgZVN1cGVyVHlwZXM9IiMvL0dyYXBoaWNQcmltaXRpdmUiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjbG9zZWQiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuT2JqZWN0IgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9IndheXBvaW50cyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIGxvd2VyQm91bmQ9IjIiIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vUG9pbnQiIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkVsbGlwc2UiIGVTdXBlclR5cGVzPSIjLy9HcmFwaGljUHJpbWl0aXZlIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmFkaXVzWCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRURvdWJsZU9iamVjdCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyYWRpdXNZIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FRG91YmxlT2JqZWN0Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJvdGF0aW9uIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FRG91YmxlT2JqZWN0Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InN0YXJ0QW5nbGUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VEb3VibGVPYmplY3QiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZW5kQW5nbGUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VEb3VibGVPYmplY3QiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iY2VudGVyIiBlVHlwZT0iIy8vUG9pbnQiCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkFjdGl2aXR5IiBlU3VwZXJUeXBlcz0iIy8vV29ya0JyZWFrZG93bkVsZW1lbnQgIy8vVmFyaWFiaWxpdHlFbGVtZW50ICMvL1dvcmtEZWZpbml0aW9uIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBbiBBY3Rpdml0eSBpcyBhIFdvcmsgQnJlYWtkb3duIEVsZW1lbnQgYW5kIFdvcmsgRGVmaW5pdGlvbiB3aGljaCBzdXBwb3J0cyB0aGUgbmVzdGluZyBhbmQgbG9naWNhbCBncm91cGluZyBvZiByZWxhdGVkIEJyZWFrZG93biBFbGVtZW50cyBmb3JtaW5nIGJyZWFrZG93biBzdHJ1Y3R1cmVzLiAgQWx0aG91Z2ggQWN0aXZpdHkgaXMgYSBjb25jcmV0ZSBtZXRhLWNsYXNzLCBvdGhlciBjbGFzc2VzIHdoaWNoIHJlcHJlc2VudCBicmVha2Rvd24gc3RydWN0dXJlcyBkZXJpdmUgZnJvbSBpdDsgc3VjaCBhcyBQaGFzZSwgSXRlcmF0aW9uLCBEZWxpdmVyeSBQcm9jZXNzLCBvciBDYXBhYmlsaXR5IFBhdHRlcm4uJiN4RDsmI3hBO0FjdGl2aXR5IHJlcHJlc2VudHMgYSBncm91cGluZyBlbGVtZW50IGZvciBvdGhlciBCcmVha2Rvd24gRWxlbWVudHMgc3VjaCBhcyBBY3Rpdml0aWVzLCBEZXNjcmlwdG9ycywgTWlsZXN0b25lcywgZXRjLiAgSXQgaXMgbm90IHBlci1zZSBhICdoaWdoLWxldmVsJyBncm91cGluZyBvZiBvbmx5IHdvcmsgYXMgaW4gb3RoZXIgbWV0YS1tb2RlbHMsIGJ1dCBncm91cHMgYW55IGtpbmQgb2YgQnJlYWtkb3duIEVsZW1lbnRzLiAgRm9yIGV4YW1wbGUsIG9uZSBjYW4gZGVmaW5lIHZhbGlkIEFjdGl2aXRpZXMgdGhhdCBncm91cCBvbmx5IFdvcmsgUHJvZHVjdHMgRGVzY3JpcHRvcnMgd2l0aG91dCBhbnkgbWF0Y2hpbmcgVGFzayBEZXNjcmlwdG9ycy4gIEFjdGl2aXRpZXMgYWxzbyBpbmhlcml0IGFsbCBwcm9wZXJ0aWVzIGZyb20gV29yayBCcmVha2Rvd24gRWxlbWVudCBhbmQgaW5kaXJlY3RseSBmcm9tIFByb2Nlc3MgRWxlbWVudDsgaS5lLiBBY3Rpdml0eSBpcyByZWFkeSB0byBoYXZlIGEgZnVsbCBjb250ZW50IGRlc2NyaXB0aW9uIGF0dGFjaGVkIHRvIGl0LiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJicmVha2Rvd25FbGVtZW50cyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vQnJlYWtkb3duRWxlbWVudCIgZU9wcG9zaXRlPSIjLy9CcmVha2Rvd25FbGVtZW50L3N1cGVyQWN0aXZpdGllcyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJyb2FkbWFwcyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vUm9hZG1hcCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJzdXBwb3J0aW5nTWF0ZXJpYWxzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9TdXBwb3J0aW5nTWF0ZXJpYWwiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iY2hlY2tsaXN0cyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vQ2hlY2tsaXN0Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImNvbmNlcHRzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Db25jZXB0Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImV4YW1wbGVzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9FeGFtcGxlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Imd1aWRlbGluZXMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0d1aWRlbGluZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJyZXVzYWJsZUFzc2V0cyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vUmV1c2FibGVBc3NldCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpc0VuYWN0YWJsZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW5PYmplY3QiCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IldvcmtCcmVha2Rvd25FbGVtZW50IiBhYnN0cmFjdD0idHJ1ZSIKLSAgICAgIGVTdXBlclR5cGVzPSIjLy9CcmVha2Rvd25FbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIFdvcmsgQnJlYWtkb3duIEVsZW1lbnQgaXMgYSBzcGVjaWFsIEJyZWFrZG93biBFbGVtZW50IHRoYXQgcHJvdmlkZXMgc3BlY2lmaWMgcHJvcGVydGllcyBmb3IgQnJlYWtkb3duIEVsZW1lbnRzIHRoYXQgcmVwcmVzZW50IG9yIHJlZmVyIHRvIFdvcmsgRGVmaW5pdGlvbnMuICBGb3IgZXhhbXBsZSBpdHMgc3ViY2xhc3MgQWN0aXZpdHkgZGVmaW5lcyB3b3JrIGFzIGl0IGlzIGFsc28gYSBzdWJjbGFzcyBvZiBXb3JrIERlZmluaXRpb24uICBJdHMgc3ViY2xhc3MgVGFzayBEZXNjcmlwdG9yIGRvZXMgbm90IGRlZmluZSB3b3JrIGJ5IGl0c2VsZiwgYnV0IHJlZmVycyB0byBhIFdvcmsgRGVmaW5pdGlvbiBhbmQgdGhlcmVmb3JlIGNhbiBoYXZlIHRoZSBzYW1lIGNvbW1vbiBwcm9wZXJ0aWVzIGFuZCBXb3JrIEJyZWFrZG93biBFbGVtZW50IGhhcy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaXNSZXBlYXRhYmxlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbk9iamVjdCIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGlzIGF0dHJpYnV0ZSBpcyB1c2VkIHRvIGRlZmluZSByZXBldGl0aW9uIG9mIHdvcmssIGUuZy4gaXRlcmF0aW9ucy4gIEEgUHJvY2VzcyBXb3JrIERlZmluaXRpb24gd2l0aCB0aGlzIGF0dHJpYnV0ZSBzZXQgdG8gVHJ1ZSBzaGFsbCBiZSByZXBlYXRlZCBtb3JlIHRoYW4gb25jZSBvbiB0aGUgc2FtZSBzZXQgb2YgYXJ0aWZhY3RzLiAgRm9yIGV4YW1wbGUsIGZvciBhbiBpbnN0YW5jZSBvZiBJdGVyYXRpb24gKGRlZmluZWQgYXMgYSBzcGVjaWFsIFByb2Nlc3MgV29yayBEZWZpbml0aW9uIGJlbG93KSB0aGlzIGF0dHJpYnV0ZSBpcyBzZXQgdG8gVHJ1ZSBieSBkZWZhdWx0IGluZGljYXRpbmcgdGhhdCBldmVyeSBzdWItQWN0aXZpdHkgd2lsbCBiZSByZXBlYXRlZCBtb3JlIHRoYW4gb25jZS4gIEhvd2V2ZXIsIGFueSBQcm9jZXNzIFdvcmsgRGVmaW5pdGlvbiBjYW4gc2V0IHRoaXMgYXR0cmlidXRlIHRvIFRydWUgdG8gZGVmaW5lIGl0ZXJhdGlvbnMgKGUuZy4gdG8gaXRlcmF0ZSBvbmUgQWN0aXZpdHkgY29uc2lzdGluZyBvZiBtYW55IHN1Yi1hY3Rpdml0aWVzIG9yIGV2ZW4gUGhhc2VzLCBidXQgdG8gaXRlcmF0ZSBqdXN0IG9uZSBUYXNrKS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaXNPbmdvaW5nIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbk9iamVjdCIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJJZiB0aGUgaXNPbmdvaW5nIGF0dHJpYnV0ZSBpcyBzZXQgdG8gVHJ1ZSBmb3IgYSBQcm9jZXNzIFdvcmsgRGVmaW5pdGlvbiBpbnN0YW5jZSwgdGhlbiB0aGUgZWxlbWVudCBkZXNjcmliZXMgYW4gb25nb2luZyBwaWVjZSBvZiB3b3JrIHdpdGhvdXQgYSBmaXhlZCBkdXJhdGlvbiBvciBlbmQgc3RhdGUuICBGb3IgZXhhbXBsZSwgdGhlIFByb2Nlc3MgV29yayBEZWZpbml0aW9uIGNvdWxkIHJlcHJlc2VudCB3b3JrIG9mIGFuIGFkbWluaXN0cmF0b3IgY29udGludW91c2x5IChlLmcuIDNoIGEgZGF5KSB3b3JraW5nIHRvIGVuc3VyZSB0aGF0IHN5c3RlbXMgYXJlIGtlcHQgaW4gYSBjZXJ0YWluIHN0YXRlLiAgQW5vdGhlciBleGFtcGxlIHdvdWxkIGJlIHByb2dyYW0gbWFuYWdlbWVudCB3b3JrIG92ZXJzZWVpbmcgbWFueSBkaWZmZXJlbnQgcHJvamVjdHMgYmVpbmcgc2NoZWR1bGVkIGZvciBvbmUgcGFydGljdWxhciBwcm9qZWN0IGF0IHNwZWNpZmljIHJlb2NjdXJyaW5nIGludGVydmFscyBkdXJpbmcgdGhlIHdob2xlIGxpZmVjeWNsZSBvZiB0aGUgcHJvamVjdC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaXNFdmVudERyaXZlbiIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW5PYmplY3QiCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGlzRXZlbnREcml2ZW4gYXR0cmlidXRlIGluZGljYXRlcyB0aGF0IHRoZSBQcm9jZXNzIFdvcmsgRGVmaW5pdGlvbiBkZXNjcmliZXMgYW4gaW5zdGFuY2Ugb2Ygd29yayB3aGljaCBpcyBub3Qgc3RhcnRlZCBiZWNhdXNlIGl0IGhhcyBiZWVuIHNjaGVkdWxlZCB0byBzdGFydCBhdCBhIGNlcnRhaW4gcG9pbnQgb2YgdGltZSwgYmVjYXVzZSBwcmVjZWRpbmcgd29yayBpcyBiZWluZyBjb21wbGV0ZWQsIG9yIGlucHV0IHdvcmsgcHJvZHVjdHMgYXJlIGF2YWlsYWJsZSwgYnV0IGJlY2F1c2UgYW5vdGhlciBzcGVjaWZpYyBldmVudCBoYXMgb2NjdXJyZWQuICBFeGFtcGxlcyBmb3Igc3VjaCBldmVudHMgYXJlIGV4Y2VwdGlvbnMgb3IgcHJvYmxlbSBzaXR1YXRpb25zIHdoaWNoIHJlcXVpcmUgc3BlY2lmaWMgd29yayB0byBiZSBwZXJmb3JtZWQgYXMgYSByZXN1bHQuICBBbHNvIGNoYW5nZSBtYW5hZ2VtZW50IHdvcmsgY2FuIGJlIG1vZGVsZWQgYXMgZXZlbnQgZHJpdmVuIHdvcmsgYW5hbHl6aW5nIGEgY2hhbmdlIHJlcXVlc3Qgb3IgZGVmZWN0IGFuZCBhbGxvY2F0aW5nIHdvcmsgZHluYW1pY2FsbHkgdG8gcmVzb3VyY2VzIHRvIGRlYWwgd2l0aCBpdCBmb2xsb3dpbmcgdGhlIHdvcmsgZGVzY3JpYmVkIHdpdGggc3VjaCBQcm9jZXNzIFdvcmsgRGVmaW5pdGlvbi4gIFRoZSBldmVudHMgdGhlbXNlbHZlcyBhcmUgbm90IG1vZGVsZWQgaW4gdGhpcyB2ZXJzaW9uIG9mIHRoZSBzcGVjaWZpY2F0aW9uLiAgVGhleSBzaGFsbCBiZSBkZXNjcmliZWQgYXMgcGFydCBvZiB0aGUgbm9ybWFsIGRlc2NyaXB0aW9ucyBmaWVsZHMgYXZhaWxhYmxlLiYjeEQ7JiN4QTsmI3hEOyYjeEE7Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImxpbmtUb1ByZWRlY2Vzc29yIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Xb3JrT3JkZXIiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQnJlYWtkb3duRWxlbWVudCIgYWJzdHJhY3Q9InRydWUiIGVTdXBlclR5cGVzPSIjLy9Qcm9jZXNzRWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQnJlYWtkb3duIEVsZW1lbnQgaXMgYW4gYWJzdHJhY3QgZ2VuZXJhbGl6YXRpb24gZm9yIGFueSB0eXBlIG9mIE1ldGhvZCBFbGVtZW50IHRoYXQgaXMgcGFydCBvZiBhIGJyZWFrZG93biBzdHJ1Y3R1cmUuICBJdCBkZWZpbmVzIGEgc2V0IG9mIHByb3BlcnRpZXMgYXZhaWxhYmxlIHRvIGFsbCBvZiBpdHMgc3BlY2lhbGl6YXRpb25zLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwcmVmaXgiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlByZWZpeCByZXByZXNlbnRzIGFuIGFkZGl0aW9uYWwgbGFiZWwgdGhhdCB3aWxsIGJlIHByZXNlbnRlZCBhcyBhIHByZWZpeCB0byBhbnkgQnJlYWtkb3duIEVsZW1lbnQgdG8gaW5kaWNhdGUgYSB1c2VyLWRlZmluZWQgc3ViLXR5cGUgZm9yIHRoZSBlbGVtZW50LiAgRm9yIGV4YW1wbGUsIGlmIHRoZSBwcm9jZXNzIGVuZ2luZWVyIHdvdWxkIGxpa2UgdG8gZGlzdGluZ3Vpc2ggaGlzIEFjdGl2aXRpZXMgYnkgJ01vZHVsZScgKGFzIGRvbmUgaW4gdGhlIElCTSBSYXRpb25hbCBTdW1taXQgQXNjZW5kYW50IE1ldGhvZCksIGhlIGNhbiBkZWZpbmUgYSBkaWZmZXJlbnQgcHJlZml4IGZvciBldmVyeSBtb2RlbCB0byBiZSB1c2VkIGluIGFkZGl0aW9uIHRvIG5hbWluZyBBY3Rpdml0aWVzLCBlLmcuICZxdW90O1NSQS5Fc3RhYmxpc2ggUmVxdWlyZW1lbnRzJnF1b3Q7IHdpdGggU1JBIGluZGljYXRpbmcgdGhhdCB0aGlzIEFjdGl2aXR5IGJlbG9uZ3MgdG8gdGhlICZxdW90O1NvZnR3YXJlIFJlcXVpcmVtZW50cyBBbmFseXNpcyZxdW90OyBtb2R1bGUuICBBbm90aGVyIGNvbW1vbiBhcHBsaWNhdGlvbiBmb3IgcHJlZml4IGlzIHRvIHF1YWxpZnkgcm9sZXMgaW4gUm9sZSBEZXNjcmlwdG9ycy4gIEZvciBleGFtcGxlLCAmcXVvdDtDdXN0b21lci5BcmNoaXRlY3QmcXVvdDsgd291bGQgZGVmaW5lIGEgJnF1b3Q7Q3VzdG9tZXImcXVvdDsgcHJlZml4IGZvciB0aGUgUm9sZSBEZXNjcmlwdG9yICZxdW90O0FyY2hpdGVjdCZxdW90OyBleHByZXNzaW5nIHRoYXQgdGhpcyBpcyBhbiBhcmNoaXRlY3Qgb24gdGhlIGN1c3RvbWVyIHNpZGUgYW5kIG5vdCB0aGUgZGV2ZWxvcG1lbnQgdGVhbSBzaWRlLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpc1BsYW5uZWQiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuT2JqZWN0IgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBrZXkgYXBwbGljYXRpb24gZm9yIERldmVsb3BtZW50IFByb2Nlc3NlcyBleHByZXNzZWQgd2l0aCBCcmVha2Rvd24gc3RydWN0dXJlcyBpcyB0byBnZW5lcmF0ZSBhIHByb2plY3QgcGxhbiBmcm9tIGl0LiAgQSBwcm9jZXNzIGFzIGRlZmluZWQgaW4gVU1BIChjZi4gd2l0aCBTZWN0aW9ucyBYWCBhbmQgNS4yKSBpcyBhIG11bHRpLWRpbWVuc2lvbmFsIHN0cnVjdHVyZSBkZWZpbmluZyB3aGF0IHdvcmsgaXMgYmVpbmcgcGVyZm9ybWVkIGF0IHdoYXQgdGltZSBieSB3aGljaCByb2xlcyB1c2luZyB3aGljaCBpbnB1dCBhbmQgcHJvZHVjaW5nIHdoYXQgb3V0cHV0cy4gIEEgcHJvamVjdCBwbGFuIGFzIGl0IGlzIHJlcHJlc2VudGVkIGluIHByb2plY3QgcGxhbm5pbmcgdG9vbHMgc3VjaCBhcyBJQk0gUmF0aW9uYWwgUG9ydGZvbGlvIE1hbmFnZXIgb3IgTWljcm9zb2Z0IFByb2plY3Qgbm9ybWFsbHkgZG9lcyBub3QgbmVlZCBhbGwgdGhpcyBpbmZvcm1hdGlvbiBhbmQgaXMgbm9ybWFsbHkgbGltaXRlZCB0byBqdXN0IHJlcHJlc2VudGluZyBhIHN1YnNldC4gIEZvciBleGFtcGxlLCBhIHR5cGljYWwgTVMgUHJvamVjdCBwbGFuIG9ubHkgcmVwcmVzZW50cyB0aGUgd29yayBicmVha2Rvd24gY29uc2lzdGluZyBvZiBUYXNrcyBhbmQgQWN0aXZpdGllcyAoc29tZXRpbWVzIHJlZmVycmVkIHRvIGFzIHN1bW1hcnkgdGFza3MpLiAgSXQgZG9lcyBub3Qgc2hvdyB0aGUgaW5wdXQgYW5kIG91dHB1dCBXb3JrIFByb2R1Y3RzIGZvciBhIFRhc2ssIGJ1dCBpdCBjYW4gc2hvdyB3aGljaCByb2xlcyBzaGFsbCBiZSBzdGFmZmVkIGZvciBwZXJmb3JtaW5nIHRoZSBUYXNrLiAgSG93ZXZlciwgc3VjaCByb2xlIGFsbG9jYXRpb24gbmVlZCB0byBiZSByZXBsYWNlZCB3aXRoIGNvbmNyZXRlIHJlc291cmNlcyB3aGVuIGluc3RhbnRpYXRpbmcgdGhlIHBsYW4gZm9yIGEgY29uY3JldGUgcHJvamVjdC4gIFNvbWV0aW1lcyBwcm9qZWN0IHBsYW5zIGNhbiB0aGVuIGFnYWluIGJlIG9yZ2FuaXplZCBkaWZmZXJlbnRseSBieSBvcmdhbml6aW5nIHdvcmsgYnkgZGVsaXZlcmFibGVzIGluIHdoaWNoIFdvcmsgUHJvZHVjdHMgYXJlIG1hcHBlZCB0byB0aGUgcGxhbidzIHN1bW1hcnkgdGFza3MgYW5kIFRhc2sgdGhhdCBoYXZlIHRoZXNlIHdvcmsgcHJvZHVjdHMgYXMgb3V0cHV0IG1hcHBlZCBiZWxvdyBzdWNoIGFzIHN1bW1hcnkgdGFzay4gIFRoZXJlZm9yZSwgYSBwcm9jZXNzIGNhbiBtYWtlIHJlY29tbWVuZGF0aW9ucyBhYm91dCB3aGljaCBlbGVtZW50cyB0byBpbmNsdWRlIGFuZCB3aGljaCB0byBleGNsdWRlIHdoZW4gZ2VuZXJhdGluZyBhIHBsYW4uICBXaGVuIHRoZSBpc1BsYW5uZWQgYXR0cmlidXRlIGlzIHNldCB0byBGYWxzZSBmb3IgYW4gaW5zdGFuY2Ugb2YgYSBCcmVha2Rvd24gRWxlbWVudCwgdGhlbiB0aGlzIGVsZW1lbnQgc2hhbGwgbm90IGJlIG5vdCBpbmNsdWRlZCB3aGVuIGEgY29uY3JldGUgcHJvamVjdCBwbGFuIGlzIGJlaW5nIGdlbmVyYXRlZCBmcm9tIHRoZSBicmVha2Rvd24gc3RydWN0dXJlIHRoYXQgY29udGFpbnMgdGhpcyBlbGVtZW50LiYjeEQ7JiN4QTsmI3hEOyYjeEE7Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Imhhc011bHRpcGxlT2NjdXJyZW5jZXMiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuT2JqZWN0IgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9Ikp1c3QgYXMgdGhlIGlzUGxhbm5lZCBhdHRyaWJ1dGUgdGhlIGhhc011bHRpcGxlT2NjdXJyZW5jZXMgYXR0cmlidXRlIGhhcyBhbiBpbXBhY3Qgb24gZ2VuZXJhdGluZyBwbGFucyBmcm9tIGEgUHJvY2Vzcy4gIFdoZW4gdGhpcyBhdHRyaWJ1dGUgaXMgc2V0IHRvIFRydWUgZm9yIGEgQnJlYWtkb3duIEVsZW1lbnQgdGhlbiBpdCB3aWxsIHR5cGljYWxseSBvY2N1ciBtdWx0aXBsZSB0aW1lcyB3aXRoaW4gdGhlIHNhbWUgQWN0aXZpdHkuICBGb3IgZXhhbXBsZSwgYSBUYXNrIHN1Y2ggYXMgJnF1b3Q7RGV0YWlsIFVzZSBDYXNlJnF1b3Q7IHdvdWxkIGJlIHBlcmZvcm1lZCBmb3IgZXZlcnkgdXNlIGNhc2UgaWRlbnRpZmllZCBmb3IgYSBwYXJ0aWN1bGFyIEl0ZXJhdGlvbiBvciBBY3Rpdml0eS4gIEdlbmVyYXRpbmcgYSBwbGFuIHdvdWxkIGxpc3Qgb25lIFRhc2sgaW5zdGFuY2UgcGVyIHVzZSBjYXNlLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpc09wdGlvbmFsIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbk9iamVjdCIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgaXNPcHRpb25hbCBhdHRyaWJ1dGUgaW5kaWNhdGVzIHRoYXQgdGhlIEJyZWFrZG93biBFbGVtZW50IGRlc2NyaWJlcyB3b3JrLCBhIHdvcmsgcmVzdWx0LCBvciBldmVuIHdvcmsgcmVzb3VyY2VzLCB3aGljaCBpbmNsdXNpb24gaXMgbm90IG1hbmRhdG9yeSB3aGVuIHBlcmZvcm1pbmcgYSBwcm9qZWN0IHRoYXQgaXMgcGxhbm5lZCBiYXNlZCBvbiBhIHByb2Nlc3MgY29udGFpbmluZyB0aGlzIGVsZW1lbnQuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InByZXNlbnRlZEFmdGVyIiBlVHlwZT0iIy8vQnJlYWtkb3duRWxlbWVudCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJwcmVzZW50ZWRCZWZvcmUiIGVUeXBlPSIjLy9CcmVha2Rvd25FbGVtZW50Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InBsYW5uaW5nRGF0YSIgZVR5cGU9IiMvL1BsYW5uaW5nRGF0YSIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ic3VwZXJBY3Rpdml0aWVzIiBlVHlwZT0iIy8vQWN0aXZpdHkiCi0gICAgICAgIGVPcHBvc2l0ZT0iIy8vQWN0aXZpdHkvYnJlYWtkb3duRWxlbWVudHMiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iTWlsZXN0b25lIiBlU3VwZXJUeXBlcz0iIy8vV29ya0JyZWFrZG93bkVsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgTWlsZXN0b25lIGRlc2NyaWJlcyBhIHNpZ25pZmljYW50IGV2ZW50IGluIGEgZGV2ZWxvcG1lbnQgcHJvamVjdCwgc3VjaCBhcyBhIG1ham9yIGRlY2lzaW9uLCBjb21wbGV0aW9uIG9mIGEgZGVsaXZlcmFibGUsIG9yIG1lZXRpbmcgb2YgYSBtYWpvciBkZXBlbmRlbmN5IChsaWtlIGNvbXBsZXRpb24gb2YgYSBwcm9qZWN0IHBoYXNlKS4gIEJlY2F1c2UsIE1pbGVzdG9uZSBpcyBjb21tb25seSB1c2VkIHRvIHJlZmVyIHRvIGJvdGggdGhlIGV2ZW50IGl0c2VsZiBhbmQgdGhlIHBvaW50IGluIHRpbWUgYXQgd2hpY2ggdGhlIGV2ZW50IGlzIHNjaGVkdWxlZCB0byBoYXBwZW4sIGl0IGlzIG1vZGVsZWQgYXMgYSBCcmVha2Rvd24gRWxlbWVudCAoaS5lLiBpdCBhcHBlYXJzIGFzIHBhcnQgb2YgYSBicmVha2Rvd24gc3RydWN0dXJlKS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iSXRlcmF0aW9uIiBlU3VwZXJUeXBlcz0iIy8vQWN0aXZpdHkiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9Ikl0ZXJhdGlvbiBpcyBhIHNwZWNpYWwgQWN0aXZpdHksIHdoaWNoIHByZXNjcmliZXMgcHJlLWRlZmluZWQgdmFsdWVzIGZvciBpdHMgaW5zdGFuY2VzIGZvciB0aGUgYXR0cmlidXRlcyBwcmVmaXggKCdJdGVyYXRpb24nKSBhbmQgaXNSZXBlYXRhYmxlICgnVHJ1ZScpLiAgSXQgaGFzIGJlZW4gaW5jbHVkZWQgaW50byB0aGUgbWV0YS1tb2RlbCBmb3IgY29udmVuaWVuY2UgYW5kIHRvIHByb3ZpZGUgYSBzcGVjaWFsIHN0ZXJlb3R5cGUsIGJlY2F1c2UgaXQgcmVwcmVzZW50cyBhIHZlcnkgY29tbW9ubHkgdXNlZCBBY3Rpdml0eSB0eXBlLiYjeEQ7JiN4QTtJdGVyYXRpb24gZ3JvdXBzIGEgc2V0IG9mIG5lc3RlZCBBY3Rpdml0aWVzIHRoYXQgYXJlIHJlcGVhdGVkIG1vcmUgdGhhbiBvbmNlLiAgSXQgcmVwcmVzZW50cyBhbiBpbXBvcnRhbnQgc3RydWN0dXJpbmcgZWxlbWVudCB0byBvcmdhbml6ZSB3b3JrIGluIHJlcGV0aXRpdmUgY3ljbGVzLiAgVGhlIGNvbmNlcHQgb2YgSXRlcmF0aW9uIGNhbiBiZSBhc3NvY2lhdGVkIHdpdGggZGlmZmVyZW50IHJ1bGVzIGluIGRpZmZlcmVudCBtZXRob2RzLiAgRm9yIGV4YW1wbGUsIHRoZSBJQk0gUmF0aW9uYWwgVW5pZmllZCBQcm9jZXNzIG1ldGhvZCBmcmFtZXdvcmsgKFJVUCkgZGVmaW5lcyBhIHJ1bGUgdGhhdCBJdGVyYXRpb25zIGFyZSBub3QgYWxsb3dlZCB0byBzcGFuIGFjcm9zcyBQaGFzZXMuICBJbiBjb250cmFzdCBJQk0gR2xvYmFsIFNlcnZpY2VzIE1ldGhvZCAoR1NNZXRob2QpIGJhc2VkIG1ldGhvZCBmcmFtZXdvcmtzIHRoaXMgcnVsZSBkb2VzIG5vdCBhcHBseSBhbmQgSXRlcmF0aW9uIGNhbiBiZSBkZWZpbmVkIHdoaWNoIG5lc3QgUGhhc2VzLiAgUnVsZXMgbGlrZSB0aGVzZSwgd2hpY2ggcGxheSBhbiBpbXBvcnRhbnQgcm9sZSBmb3IgZWFjaCBpbmRpdmlkdWFsIG1ldGhvZCBhbmQgYXJlIHRoZXJlZm9yZSBub3QgZW5mb3JjZWQgYnkgdGhpcyBtZXRhLW1vZGVsLiAgSW5zdGVhZCwgcHJvY2VzcyBhdXRob3JzIGFyZSBleHBlY3RlZCB0byBmb2xsb3cgYW5kIGNoZWNrIHRoZXNlIHJ1bGVzIG1hbnVhbGx5LiAgKE5vdGU6IEFueSBCcmVha2Rvd24gRWxlbWVudCBjYW4gYmUgcmVwZWF0ZWQ7IGhvd2V2ZXIsIEl0ZXJhdGlvbnMgaGFzIGJlZW4gaW50cm9kdWNlZCBhcyBhIHNwZWNpYWwgbWV0YS1tb2RlbCBjb25jZXB0LCBiZWNhdXNlIG9mIGl0cyBpbXBvcnRhbnQgcm9sZSBmb3IgbWFueSBtZXRob2RzLikiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUGhhc2UiIGVTdXBlclR5cGVzPSIjLy9BY3Rpdml0eSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iUGhhc2UgaXMgYSBzcGVjaWFsIEFjdGl2aXR5LCB3aGljaCBwcmVzY3JpYmVzIHByZS1kZWZpbmVkIHZhbHVlcyBmb3IgaXRzIGluc3RhbmNlcyBmb3IgdGhlIGF0dHJpYnV0ZXMgcHJlZml4ICgnUGhhc2UnKSBhbmQgaXNSZXBlYXRhYmxlICgnRmFsc2UnKS4gIEl0IGhhcyBiZWVuIGluY2x1ZGVkIGludG8gdGhlIG1ldGEtbW9kZWwgZm9yIGNvbnZlbmllbmNlIGFuZCB0byBwcm92aWRlIGEgc3BlY2lhbCBzdGVyZW90eXBlLCBiZWNhdXNlIGl0IHJlcHJlc2VudHMgYSB2ZXJ5IGNvbW1vbmx5IHVzZWQgQWN0aXZpdHkgdHlwZS4mI3hEOyYjeEE7UGhhc2UgcmVwcmVzZW50IGEgc2lnbmlmaWNhbnQgcGVyaW9kIGluIGEgcHJvamVjdCwgZW5kaW5nIHdpdGggbWFqb3IgbWFuYWdlbWVudCBjaGVja3BvaW50LCBtaWxlc3RvbmUgb3Igc2V0IG9mIERlbGl2ZXJhYmxlcy4gIEl0IGlzIGluY2x1ZGVkIGluIHRoZSBtb2RlbCBhcyBhIHByZWRlZmluZWQgc3BlY2lhbCBBY3Rpdml0eSwgYmVjYXVzZSBvZiBpdHMgc2lnbmlmaWNhbmNlIGluIGRlZmluaW5nIGJyZWFrZG93bnMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlRlYW1Qcm9maWxlIiBlU3VwZXJUeXBlcz0iIy8vQnJlYWtkb3duRWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBUZWFtIFByb2ZpbGUgaXMgYSBCcmVha2Rvd24gRWxlbWVudCB0aGF0IGdyb3VwcyBSb2xlIERlc2NyaXB0b3JzIG9yIFJlc291cmNlIERlZmluaXRpb25zIGRlZmluaW5nIGEgbmVzdGVkIGhpZXJhcmNoeSBvZiB0ZWFtcyBhbmQgdGVhbSBtZW1iZXJzLiYjeEQ7JiN4QTtXb3JrIGFzc2lnbm1lbnRzIGFuZCBXb3JrIFByb2R1Y3QgcmVzcG9uc2liaWxpdGllcyBjYW4gYmUgZGlmZmVyZW50IGZyb20gQWN0aXZpdHkgdG8gQWN0aXZpdHkgaW4gYSBkZXZlbG9wbWVudCBwcm9qZWN0LiBEaWZmZXJlbnQgcGhhc2VzIHJlcXVpcmUgZGlmZmVyZW50IHN0YWZmaW5nIHByb2ZpbGVzLCBpLmUuIGRpZmZlcmVudCBza2lsbHMgYW5kIHJlc291cmNlcyBkb2luZyBkaWZmZXJlbnQgdHlwZXMgb2Ygd29yay4gIFRoZXJlZm9yZSwgYSBwcm9jZXNzIG5lZWRzIHRvIGRlZmluZSBzdWNoIGRpZmZlcmVudCBwcm9maWxlcyBpbiBhIGZsZXhpYmxlIG1hbm5lci4gIFdoZXJlYXMgQ29yZSBNZXRob2QgQ29udGVudCBkZWZpbmVzIHN0YW5kYXJkIHJlc3BvbnNpYmlsaXRpZXMgYW5kIGFzc2lnbm1lbnRzLCBhIHByb2Nlc3MgZXhwcmVzcyBieSBhIGJyZWFrZG93biBzdHJ1Y3R1cmVzIG5lZWRzIHRvIGJlIGFibGUgcmVmaW5lIGFuZCByZWRlZmluZSB0aGVzZSB0aHJvdWdob3V0IGl0cyBkZWZpbml0aW9uLiAgUm9sZSBEZXNjcmlwdG9ycywgUmVzb3VyY2UgRGVmaW5pdGlvbnMsIGFzIHdlbGwgYXMgVGVhbSBQcm9maWxlcyBwcm92aWRlIHRoZSBkYXRhIHN0cnVjdHVyZSBuZWNlc3NhcnkgdG8gYWNoaWV2ZSB0aGlzIGZsZXhpYmlsaXR5IGFuZCB0byBwcm92aWRlIGEgcHJvY2VzcyB1c2VyIHdpdGggdGhlIGNhcGFiaWxpdHkgdG8gZGVmaW5lIGRpZmZlcmVudCB0ZWFtcyBhbmQgcm9sZSByZWxhdGlvbnNoaXBzIGZvciBldmVyeSBBY3Rpdml0eSAoaW5jbHVkaW5nIEFjdGl2aXRpZXMgb24gYW55IG5lc3RpbmctbGV2ZWwgYXMgd2VsbCBhcyBJdGVyYXRpb25zIG9yIFBoYXNlcykuJiN4RDsmI3hBO0hlbmNlLCBpbiBhZGRpdGlvbiB0byB0aGUgd29yayBicmVha2Rvd24gYW5kIHdvcmsgcHJvZHVjdCBicmVha2Rvd24gc3RydWN0dXJlcyBkZWZpbmVkIHNvIGZhciwgVGVhbSBQcm9maWxlcyBhcmUgdXNlZCB0byBkZWZpbmUgYSB0aGlyZCB0eXBlIG9mIGJyZWFrZG93biBzdHJ1Y3R1cmU6IHRlYW0gYnJlYWtkb3duIHN0cnVjdHVyZXMuICBUaGVzZSBhcmUgY3JlYXRlZCBhcyBhbiBBY3Rpdml0eSBzcGVjaWZpYyBoaWVyYXJjaHkgb2YgVGVhbSBQcm9maWxlcyBjb21wcmlzaW5nIG9mIFJvbGUgRGVzY3JpcHRvcnMgYW5kIFJlc291cmNlIERlZmluaXRpb25zLiAgVGhlc2Ugc3RydWN0dXJlcyBjYW4gYmUgcHJlc2VudGVkIGFzIHdlbGwta25vd24gT3JnLUNoYXJ0cy4gIEp1c3QgYXMgd2l0aCBhbnkgb3RoZXIgQnJlYWtkb3duIEVsZW1lbnQgYW5kIERlc2NyaXB0b3JzLCBUZWFtIFByb2ZpbGVzIGNhbiBiZSBkZWZpbmVkIHdpdGhpbiB0aGUgc2NvcGUgb2YgYW55IEFjdGl2aXR5IGluIGEgYnJlYWtkb3duIHN0cnVjdHVyZS4gIEluIG90aGVyIHdvcmRzIGV2ZXJ5IEFjdGl2aXR5IGNhbiBkZWZpbmUgaXRzIG93biBUZWFtIFByb2ZpbGVzIGNvbnNpc3Rpbmcgb2YgQWN0aXZpdHkgc3BlY2lmaWMgUm9sZSBEZXNjcmlwdG9ycyBhbmQgUmVzb3VyY2UgRGVmaW5pdGlvbnMuICBUeXBpY2FsbHksIFRlYW0gUHJvZmlsZXMgYXJlIGRlZmluZWQgb24gdGhlIGxldmVsIG9mIEl0ZXJhdGlvbnMgb3IgUGhhc2VzIG9yIG90aGVyIGhpZ2hlci1sZXZlbCBBY3Rpdml0eS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0idGVhbVJvbGVzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Sb2xlRGVzY3JpcHRvciIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJzdXBlclRlYW0iIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSIjLy9UZWFtUHJvZmlsZSIgZU9wcG9zaXRlPSIjLy9UZWFtUHJvZmlsZS9zdWJUZWFtIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InN1YlRlYW0iIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1RlYW1Qcm9maWxlIiBlT3Bwb3NpdGU9IiMvL1RlYW1Qcm9maWxlL3N1cGVyVGVhbSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJSb2xlRGVzY3JpcHRvciIgZVN1cGVyVHlwZXM9IiMvL0Rlc2NyaXB0b3IiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgUm9sZSBEZXNjcmlwdG9yIHJlcHJlc2VudHMgYSBSb2xlIGluIHRoZSBjb250ZXh0IG9mIG9uZSBzcGVjaWZpYyBBY3Rpdml0eS4gIEV2ZXJ5IGJyZWFrZG93biBzdHJ1Y3R1cmUgY2FuIGRlZmluZSBkaWZmZXJlbnQgcmVsYXRpb25zaGlwcyBvZiBSb2xlIERlc2NyaXB0b3JzIHRvIFRhc2sgRGVzY3JpcHRvcnMgYW5kIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9ycy4gIFRoZXJlZm9yZSBvbmUgUm9sZSBjYW4gYmUgcmVwcmVzZW50ZWQgYnkgbWFueSBSb2xlIERlc2NyaXB0b3JzIGVhY2ggd2l0aGluIHRoZSBjb250ZXh0IG9mIGFuIEFjdGl2aXR5IHdpdGggaXRzIG93biBzZXQgb2YgcmVsYXRpb25zaGlwcy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iUm9sZSIgZVR5cGU9IiMvL1JvbGUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ibW9kaWZpZXMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1dvcmtQcm9kdWN0RGVzY3JpcHRvciIgY2hhbmdlYWJsZT0iZmFsc2UiIHZvbGF0aWxlPSJ0cnVlIgotICAgICAgICB0cmFuc2llbnQ9InRydWUiIGRlcml2ZWQ9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icmVzcG9uc2libGVGb3IiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1dvcmtQcm9kdWN0RGVzY3JpcHRvciIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUVudW0iIG5hbWU9IldvcmtPcmRlclR5cGUiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldvcmsgT3JkZXIgcmVwcmVzZW50cyBhIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHR3byBCcmVha2Rvd24gRWxlbWVudCBpbiB3aGljaCBvbmUgQnJlYWtkb3duIEVsZW1lbnQgKHJlZmVycmVkIHRvIGFzIChCKSBiZWxvdykgZGVwZW5kcyBvbiB0aGUgc3RhcnQgb3IgZmluaXNoIG9mIGFub3RoZXIgQnJlYWtkb3duIEVsZW1lbnQgKHJlZmVycmVkIHRvIGFzIChBKSBiZWxvdykgaW4gb3JkZXIgdG8gYmVnaW4gb3IgZW5kLiBUaGlzIGVudW1lcmF0aW9uIGRlZmluZXMgdGhlIGRpZmZlcmVudCB0eXBlcyBvZiBXb3JrIE9yZGVyIHJlbGF0aW9uc2hpcHMgYXZhaWxhYmxlIGluIFVNQSBhbmQgaXMgdXNlZCB0byBwcm92aWRlIHZhbHVlcyBmb3IgV29yayBPcmRlcidzIGxpbmtUeXBlIGF0dHJpYnV0ZS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9ImZpbmlzaFRvU3RhcnQiLz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9ImZpbmlzaFRvRmluaXNoIiB2YWx1ZT0iMSIvPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0ic3RhcnRUb1N0YXJ0IiB2YWx1ZT0iMiIvPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0ic3RhcnRUb0ZpbmlzaCIgdmFsdWU9IjMiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iV29ya09yZGVyIiBlU3VwZXJUeXBlcz0iIy8vUHJvY2Vzc0VsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldvcmsgT3JkZXIgaXMgYSBNZXRob2QgRWxlbWVudCB0aGF0IHJlcHJlc2VudHMgYSByZWxhdGlvbnNoaXAgYmV0d2VlbiB0d28gQnJlYWtkb3duIEVsZW1lbnRzIGluIHdoaWNoIG9uZSBCcmVha2Rvd24gRWxlbWVudHMgZGVwZW5kcyBvbiB0aGUgc3RhcnQgb3IgZmluaXNoIG9mIGFub3RoZXIgQnJlYWtkb3duIEVsZW1lbnRzIGluIG9yZGVyIHRvIGJlZ2luIG9yIGVuZC4gICYjeEQ7JiN4QTsoTm90ZSwgV29yayBPcmRlciBpcyBub3QgbW9kZWxlZCBhcyBhbiBBc3NvY2lhdGlvbiBDbGFzcyB0byBwcm92aWRlIGEgc3RyYWlnaHRmb3J3YXJkIG1hcHBpbmcgIHRvIFhNSSBhbmQgRU1GLikmI3hEOyYjeEE7VGhlIFdvcmsgT3JkZXIgY2xhc3MgZGVmaW5lcyBwcmVkZWNlc3NvciBhbmQgc3VjY2Vzc29yIHJlbGF0aW9ucyBhbW9uZ3N0IEJyZWFrZG93biBFbGVtZW50cy4gIFRoaXMgaW5mb3JtYXRpb24gaXMgaW4gcGFydGljdWxhciBjcml0aWNhbCBmb3IgcGxhbm5pbmcgYXBwbGljYXRpb25zLiAgU2VlIG1vcmUgZGV0YWlscyBvbiBkaWZmZXJlbnQgdHlwZXMgb2YgV29yayBPcmRlciByZWxhdGlvbnNoaXBzIGF0IFdvcmsgT3JkZXIgVHlwZS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibGlua1R5cGUiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9Xb3JrT3JkZXJUeXBlIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmaW5pc2hUb1N0YXJ0Ij4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhpcyBhdHRyaWJ1dGUgZXhwcmVzc2VzIHRoZSB0eXBlIG9mIHRoZSBXb3JrIE9yZGVyIHJlbGF0aW9uc2hpcCBieSBhc3NpZ25pbmcgYSB2YWx1ZSBmcm9tIHRoZSBXb3JrIE9yZGVyIFR5cGUgZW51bWVyYXRpb24uIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InByZWQiIGxvd2VyQm91bmQ9IjEiIGVUeXBlPSIjLy9Xb3JrQnJlYWtkb3duRWxlbWVudCIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQcm9jZXNzRWxlbWVudCIgYWJzdHJhY3Q9InRydWUiIGVTdXBlclR5cGVzPSIjLy9EZXNjcmliYWJsZUVsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlByb2Nlc3MgRWxlbWVudCBpcyBhIERlc2NyaWJhYmxlIEVsZW1lbnQgdGhhdCByZXByZXNlbnRzIGFuIGFic3RyYWN0IGdlbmVyYWxpemF0aW9uIGZvciBhbGwgZWxlbWVudHMgZGVmaW5lZCBpbiB0aGUgUHJvY2VzcyBwYWNrYWdlLiYjeEQ7JiN4QTtQcm9jZXNzIEVsZW1lbnRzIHJlcHJlc2VudHMgUHJvY2VzcyBzcGVjaWZpYyBlbGVtZW50cyB0aGF0IGFyZSBzdXBwb3NlZCB0byBiZSBtYW5hZ2VkIGluIFByb2Nlc3MgUGFja2FnZXMuICBUaGUgc2VwYXJhdGlvbiBvZiBQcm9jZXNzIEVsZW1lbnQgZnJvbSBDb250ZW50IEVsZW1lbnQgYWxsb3dzIHRvIGNsZWFybHkgZGlzdGluZ3Vpc2ggYmV0d2VlbiBwdXJlIG1ldGhvZCBjb250ZW50IGZyb20gY29udGVudCB0aGF0IGlzIHJlcHJlc2VudGVkIGluIHByb2Nlc3Nlcy4gIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlBsYW5uaW5nRGF0YSIgZVN1cGVyVHlwZXM9IiMvL1Byb2Nlc3NFbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJQbGFubmluZyBEYXRhIGlzIGEgTWV0aG9kIEVsZW1lbnQgdGhhdCBhZGRzIHBsYW5uaW5nIGRhdGEgdG8gQnJlYWtkb3duIEVsZW1lbnRzIHdoZW4gaXQgaXMgdXNlZCBmb3IgYSBQcm9jZXNzIFBsYW5uaW5nIFRlbXBsYXRlLiAgRm9yIERlbGl2ZXJ5IFByb2Nlc3NlcyBhbmQgQ2FwYWJpbGl0eSBQYXR0ZXJucyB0aGlzIGNsYXNzIGNhbiBlaXRoZXIgbm90IGJlIGluc3RhbnRpYXRlZCBvciBwb3B1bGF0ZWQgd2l0aCBkZWZhdWx0IGRhdGEuJiN4RDsmI3hBO1BsYW5uaW5nIERhdGEgZmFjdG9ycyBvdXQgc3BlY2lmaWMgb3B0aW9uYWwgZGF0YSBuZWVkZWQgZm9yIHJlcHJlc2VudGluZyBwbGFubmluZyB0ZW1wbGF0ZXMuICBUaGlzIGFzc29jaWF0aW9uIGFsbG93cyB0byBhY2Nlc3MgcGxhbm5pbmcgZGF0YSBpZiBpdCBpcyBzdG9yZWQgZm9yIHRoZSBCcmVha2Rvd24gRWxlbWVudC4mI3hEOyYjeEE7KE5PVEUsIFRIRSBBVFRSSUJVVEVTIEZPUiBUSElTIENMQVNTIEFSRSBOT1QgQ09NUExFVEUsIFlFVCkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic3RhcnREYXRlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vRGF0ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBkZWZhdWx0IHN0YXJ0IGRhdGUgZm9yIGEgcGxhbmVkIFRhc2suIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImZpbmlzaERhdGUiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9EYXRlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGRlZmF1bHQgZmluaXNoIGRhdGUgZm9yIGEgcGxhbmVkIFRhc2suIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJhbmsiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSIjLy9JbnRlZ2VyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGRlZmF1bHQgcmFuayBmb3IgYSBwbGFuZWQgVGFzay4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRGVzY3JpcHRvciIgYWJzdHJhY3Q9InRydWUiIGVTdXBlclR5cGVzPSIjLy9CcmVha2Rvd25FbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIERlc2NyaXB0b3IgaXMgYW4gYWJzdHJhY3QgZ2VuZXJhbGl6YXRpb24gZm9yIHNwZWNpYWwgQnJlYWtkb3duIEVsZW1lbnRzIHRoYXQgcmVmZXJlbmNlcyBvbmUgY29uY3JldGUgQ29udGVudCBFbGVtZW50LiAgQSBkZXNjcmlwdG9yIHByb3ZpZGVzIGEgcmVwcmVzZW50YXRpb24gb2YgYSBDb250ZW50IEVsZW1lbnQgd2l0aGluIGJyZWFrZG93biBzdHJ1Y3R1cmVzLiAgSW4gYWRkaXRpb24gdG8ganVzdCByZWZlcmVuY2luZyBDb250ZW50IEVsZW1lbnRzIGl0IGFsbG93cyBvdmVycmlkaW5nIHRoZSBDb250ZW50IEVsZW1lbnRzIHN0cnVjdHVyYWwgcmVsYXRpb25zaGlwcyBieSBkZWZpbmluZyBpdHMgb3duIHNldHMgb2YgYXNzb2NpYXRpb25zLiYjeEQ7JiN4QTtEZXNjcmlwdG9ycyBhcmUgdGhlIGtleSBjb25jZXB0IGZvciByZWFsaXppbmcgdGhlIHNlcGFyYXRpb24gb2YgcHJvY2Vzc2VzIGZyb20gbWV0aG9kIGNvbnRlbnQuICBBIERlc2NyaXB0b3IgY2FuIGJlIGNoYXJhY3Rlcml6ZWQgYXMgYSByZWZlcmVuY2Ugb2JqZWN0IGZvciBvbmUgcGFydGljdWxhciBDb250ZW50IEVsZW1lbnQsIHdoaWNoIGhhcyBpdHMgb3duIHJlbGF0aW9uc2hpcHMgYW5kIHByb3BlcnRpZXMuICBXaGVuIGEgRGVzY3JpcHRvciBpcyBjcmVhdGVkIGl0IHNoYWxsIGJlIHByb3ZpZGVkIHdpdGggY29uZ3J1ZW50IGNvcGllcyBvZiB0aGUgcmVsYXRpb25zaGlwcyBkZWZpbmVkIGZvciB0aGUgcmVmZXJlbmNlZCBjb250ZW50IGVsZW1lbnQuICBIb3dldmVyLCBhIHVzZXIgY2FuIG1vZGlmeSB0aGVzZSByZWxhdGlvbnNoaXBzIGZvciB0aGUgcGFydGljdWxhciBwcm9jZXNzIHNpdHVhdGlvbiBmb3Igd2hpY2ggdGhlIGRlc2NyaXB0b3IgaGFzIGJlZW4gY3JlYXRlZC4gIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImlzU3luY2hyb25pemVkV2l0aFNvdXJjZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW5PYmplY3QiCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9InRydWUiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iV29ya1Byb2R1Y3REZXNjcmlwdG9yIiBlU3VwZXJUeXBlcz0iIy8vRGVzY3JpcHRvciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvciByZXByZXNlbnRzIGEgV29yayBQcm9kdWN0IGluIHRoZSBjb250ZXh0IG9mIG9uZSBzcGVjaWZpYyBBY3Rpdml0eS4gIEV2ZXJ5IGJyZWFrZG93biBzdHJ1Y3R1cmUgY2FuIGRlZmluZSBkaWZmZXJlbnQgcmVsYXRpb25zaGlwcyBvZiBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvcnMgdG8gVGFzayBEZXNjcmlwdG9ycyBhbmQgUm9sZSBEZXNjcmlwdG9ycy4gIFRoZXJlZm9yZSBvbmUgV29yayBQcm9kdWN0IGNhbiBiZSByZXByZXNlbnRlZCBieSBtYW55IFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9ycyBlYWNoIHdpdGhpbiB0aGUgY29udGV4dCBvZiBhbiBBY3Rpdml0eSB3aXRoIGl0cyBvd24gc2V0IG9mIHJlbGF0aW9uc2hpcHMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFjdGl2aXR5RW50cnlTdGF0ZSIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iR2l2ZW4gdGhhdCBhbiBpbnN0YW5jZSBvZiBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvciBoYXMgYmVlbiBjcmVhdGVkIGZvciBhIHNwZWNpZmljIEFjdGl2aXR5LCB0aGVuIHRoZSBBY3Rpdml0eSBFbnRyeSBTdGF0ZSBhdHRyaWJ1dGUgc3BlY2lmaWVzIHRoZSBkZXNpcmVkIHN0YXRlIG9mIGluc3RhbmNlcyBvZiB0aGUgcmVmZXJlbmNlZCBXb3JrIFByb2R1Y3Qgd2hlbiB3b3JrIG9uIHRoZSBBY3Rpdml0eSBpcyBpbml0aWF0ZWQgKGkuZS4gd29yayBvbiB0aGUgQWN0aXZpdHkncyBUYXNrIERlc2NyaXB0b3JzIGlzIGJlaW5nIGluaXRpYXRlZCB0aGF0IHVzZSB0aGlzIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9yIGFzIGlucHV0KS4gICYjeEQ7JiN4QTtGb3Igc29tZSBXb3JrIFByb2R1Y3RzIHN0YXRlIGlzIGV4cHJlc3NlZCBpbiBwZXJjZW50YWdlIG9mIGNvbXBsZXRpb24sIGNvbXBsaWFuY2UgdG8gd29yayBwcm9kdWN0IGNoZWNrbGlzdCwgaW5mb3JtYWwgc3RhdGUgZGVzY3JpcHRpb25zLCBldGMuICBPdGhlcnMgaGF2ZSB2ZXJ5IHNwZWNpZmljIHN0YXRlcyBleHByZXNzZWQgYXMgZW51bWVyYXRpb25zIHN1Y2ggYXMgW2lkZW50aWZpZWQsIGJyaWVmbHkgZGVzY3JpYmVkLCBvdXRsaW5lZCwgZGV0YWlsZWRdIGZvciB1c2UgY2FzZXMuICBPdGhlciBXb3JrIFByb2R1Y3Qgc3RhdGVzIHJlbGF0ZSB0byBzb21lIHF1YWxpdHkgbWVhc3VyZXMgb3IgbGlmZWN5Y2xlIHN0YXRlcyBzdWNoIGFzIFtyZXZpZXdlZCwgaW1wbGVtZW50ZWQsIHRlc3RlZF0uIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFjdGl2aXR5RXhpdFN0YXRlIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJHaXZlbiB0aGF0IGFuIGluc3RhbmNlIG9mIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9yIGhhcyBiZWVuIGNyZWF0ZWQgZm9yIGEgc3BlY2lmaWMgQWN0aXZpdHksIHRoZW4gdGhlIEFjdGl2aXR5IEV4aXN0IFN0YXRlIGF0dHJpYnV0ZSBzcGVjaWZpZXMgdGhlIGRlc2lyZWQgc3RhdGUgb2YgaW5zdGFuY2VzIG9mIHRoZSByZWZlcmVuY2VkIFdvcmsgUHJvZHVjdCB3aGVuIHdvcmsgb24gdGhlIEFjdGl2aXR5IGlzIGZpbmlzaGVkIChpLmUuIHdvcmsgb24gdGhlIEFjdGl2aXR5J3MgVGFzayBEZXNjcmlwdG9ycyBoYXMgZmluaXNoZWQgdGhhdCBoYXZlIHRoaXMgV29yayBQcm9kdWN0IERlc2NyaXB0b3IgYXMgb3V0cHV0KS4mI3hEOyYjeEE7Rm9yIHNvbWUgV29yayBQcm9kdWN0cyBzdGF0ZSBpcyBleHByZXNzZWQgaW4gcGVyY2VudGFnZSBvZiBjb21wbGV0aW9uLCBjb21wbGlhbmNlIHRvIHdvcmsgcHJvZHVjdCBjaGVja2xpc3QsIGluZm9ybWFsIHN0YXRlIGRlc2NyaXB0aW9ucywgZXRjLiAgT3RoZXJzIGhhdmUgdmVyeSBzcGVjaWZpYyBzdGF0ZXMgZXhwcmVzc2VkIGFzIGVudW1lcmF0aW9ucyBzdWNoIGFzIFtpZGVudGlmaWVkLCBicmllZmx5IGRlc2NyaWJlZCwgb3V0bGluZWQsIGRldGFpbGVkXSBmb3IgdXNlIGNhc2VzLiAgT3RoZXIgV29yayBQcm9kdWN0IHN0YXRlcyByZWxhdGUgdG8gc29tZSBxdWFsaXR5IG1lYXN1cmVzIG9yIGxpZmVjeWNsZSBzdGF0ZXMgc3VjaCBhcyBbcmV2aWV3ZWQsIGltcGxlbWVudGVkLCB0ZXN0ZWRdLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJXb3JrUHJvZHVjdCIgZVR5cGU9IiMvL1dvcmtQcm9kdWN0Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImltcGFjdGVkQnkiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1dvcmtQcm9kdWN0RGVzY3JpcHRvciIgZU9wcG9zaXRlPSIjLy9Xb3JrUHJvZHVjdERlc2NyaXB0b3IvaW1wYWN0cyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJpbXBhY3RzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Xb3JrUHJvZHVjdERlc2NyaXB0b3IiIGVPcHBvc2l0ZT0iIy8vV29ya1Byb2R1Y3REZXNjcmlwdG9yL2ltcGFjdGVkQnkiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZGVsaXZlcmFibGVQYXJ0cyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vV29ya1Byb2R1Y3REZXNjcmlwdG9yIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlRhc2tEZXNjcmlwdG9yIiBlU3VwZXJUeXBlcz0iIy8vV29ya0JyZWFrZG93bkVsZW1lbnQgIy8vRGVzY3JpcHRvciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBUYXNrIERlc2NyaXB0b3IgaXMgYSBEZXNjcmlwdG9yIGFuZCBXb3JrIEJyZWFrZG93biBFbGVtZW50IHRoYXQgcmVwcmVzZW50cyBhIHByb3h5IGZvciBhIFRhc2sgaW4gdGhlIGNvbnRleHQgb2Ygb25lIHNwZWNpZmljIEFjdGl2aXR5LiAgRXZlcnkgYnJlYWtkb3duIHN0cnVjdHVyZSBjYW4gZGVmaW5lIGRpZmZlcmVudCByZWxhdGlvbnNoaXBzIG9mIFRhc2sgRGVzY3JpcHRvcnMgdG8gV29yayBQcm9kdWN0IERlc2NyaXB0b3JzIGFuZCBSb2xlIERlc2NyaXB0b3JzLiBUaGVyZWZvcmUgb25lIFRhc2sgY2FuIGJlIHJlcHJlc2VudGVkIGJ5IG1hbnkgVGFzayBEZXNjcmlwdG9ycyBlYWNoIHdpdGhpbiB0aGUgY29udGV4dCBvZiBhbiBBY3Rpdml0eSB3aXRoIGl0cyBvd24gc2V0IG9mIHJlbGF0aW9uc2hpcHMuJiN4RDsmI3hBO0Ega2V5IGRpZmZlcmVuY2UgYmV0d2VlbiBNZXRob2QgQ29udGVudCBhbmQgUHJvY2VzcyBpcyB0aGF0IGEgQ29udGVudCBFbGVtZW50IHN1Y2ggYXMgVGFzayBkZXNjcmliZXMgYWxsIGFzcGVjdHMgb2YgZG9pbmcgd29yayBkZWZpbmVkIGFyb3VuZCB0aGlzIFRhc2suICBUaGlzIGRlc2NyaXB0aW9uIGlzIG1hbmFnZWQgaW4gc3RlcHMsIHdoaWNoIGFyZSBtb2RlbGVkIGFzIFNlY3Rpb25zIG9mIHRoZSBUYXNrcycgQ29udGVudCBEZXNjcmlwdGlvbnMuICBXaGVuIGFwcGx5aW5nIGEgVGFzayBpbiBhIFByb2Nlc3MnIEFjdGl2aXR5IHdpdGggYSBUYXNrIERlc2NyaXB0b3IgYSBQcm9jZXNzIEVuZ2luZWVyIG5lZWRzIHRvIGluZGljYXRlIHRoYXQgYXQgdGhhdCBwYXJ0aWN1bGFyIHBvaW50IGluIHRpbWUgaW4gdGhlIFByb2Nlc3MgZGVmaW5pdGlvbiBmb3Igd2hpY2ggdGhlIFRhc2sgRGVzY3JpcHRvciBoYXMgYmVlbiBjcmVhdGVkLCBvbmx5IGEgc3Vic2V0IG9mIHN0ZXBzIHNoYWxsIGJlIHBlcmZvcm1lZC4gIEhlIGRlZmluZXMgdGhpcyBzZWxlY3Rpb24gdXNpbmcgdGhlIHNlbGVjdGVkU3RlcHMgYXNzb2NpYXRpb24uICBJZiBoZSB3YW50cyB0byBhZGQgc3RlcHMgdG8gYSBUYXNrIERlc2NyaXB0b3IsIGhlIGNhbiBkZXNjcmliZSB0aGVzZSBlaXRoZXIgcHJhZ21hdGljYWxseSBpbiB0aGUgcmVmaW5lZERlc2NyaXB0aW9uIGF0dHJpYnV0ZSBvciAncHJvcGVybHknIGNyZWF0ZSBhIGNvbnRyaWJ1dGluZyBUYXNrIHRvIHRoZSBUYXNrIHRoZSBUYXNrIERlc2NyaXB0b3IgcmVmZXJzIHRvLiYjeEQ7JiN4QTsiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iVGFzayIgZVR5cGU9IiMvL1Rhc2siLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iYWRkaXRpb25hbGx5UGVyZm9ybWVkQnkiCi0gICAgICAgIG9yZGVyZWQ9ImZhbHNlIiB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1JvbGVEZXNjcmlwdG9yIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImFzc2lzdGVkQnkiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1JvbGVEZXNjcmlwdG9yIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImV4dGVybmFsSW5wdXQiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1dvcmtQcm9kdWN0RGVzY3JpcHRvciIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJtYW5kYXRvcnlJbnB1dCIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vV29ya1Byb2R1Y3REZXNjcmlwdG9yIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im9wdGlvbmFsSW5wdXQiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1dvcmtQcm9kdWN0RGVzY3JpcHRvciIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJvdXRwdXQiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1dvcmtQcm9kdWN0RGVzY3JpcHRvciIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJwZXJmb3JtZWRQcmltYXJpbHlCeSIgZVR5cGU9IiMvL1JvbGVEZXNjcmlwdG9yIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InNlbGVjdGVkU3RlcHMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1NlY3Rpb24iLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQ29tcG9zaXRlUm9sZSIgZVN1cGVyVHlwZXM9IiMvL1JvbGVEZXNjcmlwdG9yIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIENvbXBvc2l0ZSBSb2xlIGlzIGEgc3BlY2lhbCBSb2xlIERlc2NyaXB0b3IgdGhhdCByZWxhdGVzIHRvIG1vcmUgdGhlbiBvbmUgUm9sZS4gIEl0IHJlcHJlc2VudHMgYSBncm91cGluZyBvZiBSb2xlcyB3aXRoIHRoZSBtYWluIHB1cnBvc2Ugb2Ygc2ltcGxpZmljYXRpb24sIGkuZS4gcmVkdWNpbmcgdGhlIG51bWJlciBvZiByb2xlcyBmb3IgYSBwcm9jZXNzLiYjeEQ7JiN4QTtBIENvbXBvc2l0ZSBSb2xlIGlzIGEgZ3JvdXBpbmcgb2YgUm9sZXMgdGhhdCBjYW4gYmUgdXNlZCBpbiBhbiBBY3Rpdml0eSBvciBQcm9jZXNzIHRvIHJlZHVjZSB0aGUgbnVtYmVyIG9mIFJvbGVzLiAgQSB0eXBpY2FsIGFwcGxpY2F0aW9uIHdvdWxkIGJlIGEgcHJvY2VzcyBmb3IgYSBzbWFsbCB0ZWFtIGluIHdoaWNoIGEgc3RhbmRhcmQgc2V0IG9mIHJvbGVzIGZyb20gdGhlIG1ldGhvZCBjb250ZW50IHdvdWxkIGJlIGFsbCBwZXJmb3JtZWQgYnkgb25lIG9yIG1vcmUgcmVzb3VyY2UuICBCeSB1c2luZyBDb21wb3NpdGUgUm9sZSB0aGUgcHJvY2VzcyB3b3VsZCBzdWdnZXN0IGEgdHlwaWNhbCBjbHVzdGVyaW5nIG9mIFJvbGVzIHRvIFJlc291cmNlcy4gIEEgQ29tcG9zaXRlIFJvbGUgY291bGQgcGVyZm9ybSBhbGwgVGFza3MgZGVmaW5lZCBmb3IgdGhlIFJvbGVzIGl0IHJlZmVycyB0by4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iYWdncmVnYXRlZFJvbGVzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Sb2xlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbiIgZVN1cGVyVHlwZXM9IiMvL0NvbnRlbnREZXNjcmlwdGlvbiI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InVzYWdlR3VpZGFuY2UiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlByb3ZpZGVzIGluZm9ybWF0aW9uIGFuZCBndWlkYW5jZSBvbiB0aGUgbWVhbmluZyBvZiB0aGUgQm9vbGVhbiBmbGFnIHZhbHVlcyBhbmQgdW5kZXIgd2hhdCBjaXJjdW1zdGFuY2VzIHRoZXkgc2hvdWxkIGJlIG92ZXJyaWRkZW4uIEZvciBleGFtcGxlLCBpdCBkZXNjcmliZXMgd2h5IHRoZSBicmVha2Rvd24gZWxlbWVudCBpcyBvcHRpb25hbCBvciBjb25zaWRlcmF0aW9ucyBmb3IgcmVwZWF0aW5nIGl0IGFuZCBkaWZmZXJlbmNlcyBpbiB0aGUgaW5kaXZpZHVhbCBvY2N1cnJlbmNlcyBvZiB0aGlzIEJyZWFrZG93biBFbGVtZW50IGFjcm9zcyB0aGUgbGlmZWN5Y2xlLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJBY3Rpdml0eURlc2NyaXB0aW9uIiBlU3VwZXJUeXBlcz0iIy8vQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icHVycG9zZSIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iU3VtbWFyaXplcyB0aGUgbWFpbiByZWFzb24gZm9yIHBlcmZvcm1pbmcgdGhpcyBBY3Rpdml0eSwgZGVzY3JpYmVzIHdoYXQgdGhlIGFjdGl2aXR5IGFzIGEgd2hvbGUgaXMgaW50ZW5kZWQgdG8gYWNoaWV2ZS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYWx0ZXJuYXRpdmVzIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJDb21wcmlzZXMgb2Ygc3VtbWFyaWVzIGRlc2NyaWJpbmcgaW1wb3J0YW50IGV4Y2VwdGlvbmFsIGFuZCBub24tc3RhbmRhcmQgd2F5cyBvZiBkb2luZyB0aGUgd29yayBvZiB0aGlzIEFjdGl2aXR5IG5vdCBjb3ZlcmVkIGJ5IHRoZSBBY3Rpdml0eSdzIFRhc2tzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJob3d0b1N0YWZmIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJQcm92aWRlcyBiYWNrZ3JvdW5kIG9uIHdobyBzaG91bGQgYmUgaW52b2x2ZWQgaW4gdGhpcyBhY3Rpdml0eSB3aGF0IGFyZSB0aGUgcmVxdWlyZWQgc2tpbGxzLCBleHBlcmllbmNlLCAgYW5kIHBlcmhhcHMgYXR0aXR1ZGVzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJEZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbiIgZVN1cGVyVHlwZXM9IiMvL1Byb2Nlc3NEZXNjcmlwdGlvbiI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InNjYWxlIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJPdXRsaW5lcyBjaGFyYWN0ZXJpc3RpY3MgYWJvdXQgdGhlIHNpemUgb2YgYSB0eXBpY2FsIHByb2plY3QgdGhhdCBwZXJmb3JtcyB0aGlzIHByb2plY3QgZXhwcmVzc2VkIGluIHRlYW0gc2l6ZSwgbWFuIHllYXJzLCBldGMuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InByb2plY3RDaGFyYWN0ZXJpc3RpY3MiCi0gICAgICAgIGVUeXBlPSIjLy9TdHJpbmciIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkNoYXJhY3Rlcml6ZXMgdGhlIHByb2plY3QgdGhhdCB3b3VsZCB0eXBpY2FsbHkgcGVyZm9ybSB0aGlzIFByb2Nlc3MiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmlza0xldmVsIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJPdXRsaW5lcyB0eXBpY2FsIHByb2plY3Qgcmlza3MgdGhhdCBhcmUgYWRkcmVzc2VkIHdpdGggdGhpcyBwcm9jZXNzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJlc3RpbWF0aW5nVGVjaG5pcXVlIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJEZXNjcmliZXMgdGhlIEVzdGltYXRpb24gVGVjaG5pcXVlcyBwcm92aWRlZCBmb3IgdGhpcyBQcm9jZXNzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwcm9qZWN0TWVtYmVyRXhwZXJ0aXNlIgotICAgICAgICBlVHlwZT0iIy8vU3RyaW5nIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJQcm92aWRlcyBhIHByb2ZpbGUgb2YgYSB0eXBpY2FsIHByb2plY3QgdGVhbSwgdGhlIGRpc3RyaWJ1dGlvbiBvZiByb2xlcywgc2tpbGxzIHJlcXVpcmVkIGZvciBhIHRlYW0gcGVyZm9ybXMgYSBwcm9qZWN0IGJhc2VkIG9uIHRoaXMgcHJvY2Vzcy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idHlwZU9mQ29udHJhY3QiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlByb3ZpZGVzIGJhY2tncm91bmQgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGNvbnRyYWN0cyB0aGF0IG5lZWQgdG8gYmUgZXN0YWJsaXNoZWQgYmV0d2VlbiBhIHByb2plY3QgdGVhbSB0aGF0IHBlcmZvcm1zIHRoaXMgcHJvY2VzcyBhbmQgYSBjbGllbnQgKGUuZy4gZm9yIGFuIElHUyBlbmdhZ2VtZW50KS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUHJvY2Vzc0Rlc2NyaXB0aW9uIiBlU3VwZXJUeXBlcz0iIy8vQWN0aXZpdHlEZXNjcmlwdGlvbiI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImV4dGVybmFsSWQiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkFuIGV4dGVybmFsIHZpc2libGUgbnVtYmVyIHRoYXQgaXMgdXNlZCB0byByZWZlcmVuY2UgdGhpcyBkZWxpdmVyeSBwYXR0ZXJucyBhbmQgbW9kZWxzLiBJdCBpcyB1c2VkIGxpa2UgYSBzeW5vbnltLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzY29wZSIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRGVmaW5lcyB0aGUgc2NvcGUgb2YgdGhlIFByb2Nlc3MsIGkuZS4gd2hpY2ggdHlwZXMgb2YgcHJvamVjdHMgZG9lcyBpdCBhZGRyZXNzIGFuZCB3aGljaCBub3QuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InVzYWdlTm90ZXMiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkFueSBhZGRpdGlvbmFsIG5vdGVzIG9uIGhvdyB0byBhcHBseSBhbmQgaW5zdGFudGlhdGUgdGhpcyBwcm9jZXNzIGZvciBhIHByb2plY3QuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkRlc2NyaXB0b3JEZXNjcmlwdGlvbiIgZVN1cGVyVHlwZXM9IiMvL0JyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbiI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJlZmluZWREZXNjcmlwdGlvbiIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBEZXNjcmlwdG9yIG1pZ2h0IGFkZCByZWZpbmVtZW50cyB0byB0aGUgbWFpbiBkZXNjcmlwdGlvbiBvZiB0aGUgQ29udGVudCBFbGVtZW50IGl0IHJlZmVycyB0by4gIEZvciBleGFtcGxlLCBpdCBjb3VsZCBwcm92aWRlIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gYWJvdXQgYSBXb3JrIFByb2R1Y3QgcmVsZXZhbnQgZm9yIHRoZSBzcGVjaWZpYyBwb2ludCBpbiB0aW1lIGluIHRoZSBwcm9jZXNzIHRoaXMgV29yayBQcm9kdWN0IHR5cGUgaXMgYmVpbmcgdXNlZC4gIEl0IGNvdWxkIGRlc2NyaWJlIGFkZGl0aW9uYWwgc2tpbGxzIG5lZWRlZCBmb3IgYSBSb2xlIGF0IHRoYXQgcGFydGljdWxhciBwb2ludCBpbiB0aW1lIGluIGEgcHJvY2VzcywgZXRjLiAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQ29uY2VwdCIgZVN1cGVyVHlwZXM9IiMvL0d1aWRhbmNlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIENvbmNlcHQgaXMgYSBzcGVjaWZpYyB0eXBlIG9mIGd1aWRhbmNlIHRoYXQgb3V0bGluZXMga2V5IGlkZWFzIGFzc29jaWF0ZWQgd2l0aCBiYXNpYyBwcmluY2lwbGVzIHVuZGVybHlpbmcgdGhlIHJlZmVyZW5jZWQgaXRlbS4gQ29uY2VwdHMgbm9ybWFsbHkgYWRkcmVzcyBtb3JlIGdlbmVyYWwgdG9waWNzIHRoYW4gR3VpZGVsaW5lcyBhbmQgc3BhbiBhY3Jvc3Mgc2V2LWVyYWwgd29yayBwcm9kdWN0IGFuZC9vciB0YXNrcy9hY3Rpdml0aWVzLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJDaGVja2xpc3QiIGVTdXBlclR5cGVzPSIjLy9HdWlkYW5jZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBDaGVja2xpc3QgaXMgYSBzcGVjaWZpYyB0eXBlIG9mIGd1aWRhbmNlIHRoYXQgaWRlbnRpZmllcyBhIHNlcmllcyBvZiBpdGVtcyB0aGF0IG5lZWQgdG8gYmUgY29tcGxldGVkIG9yIHZlcmktZmllZC4gIENoZWNrbGlzdHMgYXJlIG9mdGVuIHVzZWQgaW4gcmV2aWV3cyBzdWNoIGFzIHdhbGt0aHJvdWdocyBvciBpbnNwZWN0aW9ucy4gIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkV4YW1wbGUiIGVTdXBlclR5cGVzPSIjLy9HdWlkYW5jZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQW4gRXhhbXBsZSBpcyBhIHNwZWNpZmljIHR5cGUgb2YgR3VpZGFuY2UgdGhhdCByZXByZXNlbnRzIGEgdHlwaWNhbCwgcGFydGlhbGx5IGNvbXBsZXRlZCwgc2FtcGxlIGluc3RhbmNlIG9mIG9uZSBvciBtb3JlIHdvcmsgcHJvZHVjdHMgb3Igc2NlbmFyaW8gbGlrZSBkZXNjcmlwdGlvbnMgb2YgaG93IFRhc2sgbWF5IGJlIHBlcmZvcm1lZC4gRXhhbXBsZXMgY2FuIGJlIHJlbGF0ZWQgdG8gV29yayBQcm9kdWN0cyBhcyB3ZWxsIGFzIFRhc2tzIHRoYXQgcHJvZHVjZSB0aGVtIGFzIHdlbGwgYXMgYW55IG90aGVyIENvbnRlbnQgRWxlbWVudC4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iR3VpZGVsaW5lIiBlU3VwZXJUeXBlcz0iIy8vR3VpZGFuY2UiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgR3VpZGVsaW5lIGlzIGEgc3BlY2lmaWMgdHlwZSBvZiBndWlkYW5jZSB0aGF0IHByb3ZpZGVzIGFkZGl0aW9uYWwgZGV0YWlsIG9uIGhvdyB0byBwZXJmb3JtIGEgcGFydGljdWxhciB0YXNrIG9yIGdyb3VwaW5nIG9mIHRhc2tzIChlLmcuIGdyb3VwZWQgdG9nZXRoZXIgYXMgYWN0aXZpdGllcykgb3IgdGhhdCBwcm92aWRlcyBhZGRpdGlvbmFsIGRldGFpbCwgcnVsZXMsIGFuZCByZWNvbW1lbmRhdGlvbnMgb24gd29yayBwcm9kdWN0cyBhbmQgdGhlaXIgcHJvcGVydGllcy4gIEFtb25nc3Qgb3RoZXJzLCBpdCBjYW4gaW5jbHVkZSBkZXRhaWxzIGFib3V0IGJlc3QgcHJhY3RpY2VzIGFuZCBkaWZmZXJlbnQgYXBwcm9hY2hlcyBmb3IgZG9pbmcgd29yaywgaG93IHRvIHVzZSBwYXJ0aWN1bGFyIHR5cGVzIG9mIHdvcmsgcHJvZHVjdHMsIGluZm9ybWF0aW9uIG9uIGRpZmZlcmVudCBzdWJ0eXBlcyBhbmQgdmFyaWFudHMgb2YgdGhlIHdvcmsgcHJvZHVjdCBhbmQgaG93IHRoZXkgZXZvbHZlIHRocm91Z2hvdXQgYSBsaWZlY3ljbGUsIGRpc2N1c3Npb25zIG9uIHNraWxscyB0aGUgcGVyZm9ybWluZyByb2xlcyBzaG91bGQgYWNxdWlyZSBvciBpbXByb3ZlIHVwb24sIG1lYXN1cmVtZW50cyBmb3IgcHJvZ3Jlc3MgYW5kIG1hdHVyaXR5LCBldGMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlJlcG9ydCIgZVN1cGVyVHlwZXM9IiMvL0d1aWRhbmNlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIFJlcG9ydCBpcyBhIHByZWRlZmluZWQgdGVtcGxhdGUgb2YgYSByZXN1bHQgdGhhdCBpcyBnZW5lcmF0ZWQgb24gdGhlIGJhc2lzIG9mIG90aGVyIHdvcmsgcHJvZHVjdHMgYXMgYW4gb3V0cHV0IGZyb20gc29tZSBmb3JtIG9mIHRvb2wgYXV0b21hdGlvbi4gQW4gZXhhbXBsZSBmb3IgYSByZXBvcnQgd291bGQgYmUgYSB1c2UgY2FzZSBtb2RlbCBzdXJ2ZXksIHdoaWNoIGlzIGdlbmVyYXRlZCBieSBleHRyYWN0aW5nIGRpYWdyYW0gaW5mb3JtYXRpb24gZnJvbSBhIGdyYXBoaWNhbCBtb2RlbCBhbmQgdGV4dHVhbCBpbmZvcm1hdGlvbiBmcm9tIGRvY3VtZW50cyBhbmQgY29tYmluZXMgdGhlc2UgdHdvIHR5cGVzIG9mIGluZm9ybWF0aW9uIGludG8gYSByZXBvcnQuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlRlbXBsYXRlIiBlU3VwZXJUeXBlcz0iIy8vR3VpZGFuY2UiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgVGVtcGxhdGUgaXMgYSBzcGVjaWZpYyB0eXBlIG9mIGd1aWRhbmNlIHRoYXQgcHJvdmlkZXMgZm9yIGEgd29yayBwcm9kdWN0IGEgcHJlLWRlZmluZWQgdGFibGUgb2YgY29udGVudHMsIHNlY3Rpb25zLCBwYWNrYWdlcywgYW5kL29yIGhlYWRpbmdzLCBhIHN0YW5kYXJkaXplZCBmb3JtYXQsIGFzIHdlbGwgYXMgZGVzY3JpcHRpb25zIGhvdyB0aGUgc2VjdGlvbnMgYW5kIHBhY2thZ2VzIGFyZSBzdXBwb3NlZCB0byBiZSB1c2VkIGFuZCBjb21wbGV0ZWQuIFRlbXBsYXRlcyBjYW5ub3Qgb25seSBiZSBwcm92aWRlZCBmb3IgZG9jdW1lbnRzLCBidXQgYWxzbyBmb3IgY29uY2VwdHVhbCBtb2RlbHMgb3IgcGh5c2ljYWwgZGF0YSBzdG9yZXMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlN1cHBvcnRpbmdNYXRlcmlhbCIgZVN1cGVyVHlwZXM9IiMvL0d1aWRhbmNlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJTdXBwb3J0aW5nIE1hdGVyaWFscyBpcyBjYXRjaGFsbCBmb3Igb3RoZXIgdHlwZXMgb2YgZ3VpZGFuY2Ugbm90IHNwZWNpZmljYWxseSBkZWZpbmVkIGVsc2V3aGVyZS4gSXQgY2FuIGJlIHJlbGF0ZWQgdG8gYWxsIGtpbmRzIG9mIENvbnRlbnQgRWxlbWVudHMsIGkuZS4gaW5jbHVkaW5nIG90aGVyIGd1aWRhbmNlIGVsZW1lbnRzLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJUb29sTWVudG9yIiBlU3VwZXJUeXBlcz0iIy8vR3VpZGFuY2UiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgVG9vbCBNZW50b3IgaXMgYSBzcGVjaWZpYyB0eXBlIG9mIGd1aWRhbmNlIHRoYXQgc2hvd3MgaG93IHRvIHVzZSBhIHNwZWNpZmljIHRvb2wgdG8gYWNjb21wbGlzaCBzb21lIHBpZWNlIG9mIHdvcmsgYSBXb3JrIFByb2R1Y3QgZWl0aGVyIGluIHRoZSBjb250ZXh0IG9mIG9yIGluZGVwZW5kZW50IGZyb20gYSBUYXNrIG9yIEFjdGl2aXR5LiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJXaGl0ZXBhcGVyIiBlU3VwZXJUeXBlcz0iIy8vQ29uY2VwdCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV2hpdGVwYXBlcnMgYXJlIGEgc3BlY2lhbCBDb25jZXB0IGd1aWRhbmNlIHRoYXQgaGF2ZSBiZWVuIGV4dGVybmFsbHkgcmV2aWV3ZWQgb3IgcHVibGlzaGVkIGFuZCBjYW4gYmUgcmVhZCBhbmQgdW5kZXJzdG9vZCBpbiBpc29sYXRpb24gb2Ygb3RoZXIgY29udGVudCBlbGVtZW50cyBhbmQgZ3VpZGFuY2UuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlRlcm1EZWZpbml0aW9uIiBlU3VwZXJUeXBlcz0iIy8vR3VpZGFuY2UiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRlcm1EZWZpbml0aW9ucyBkZWZpbmUgY29uY2VwdHMgYW5kIGFyZSB1c2VkIHRvIGJ1aWxkIHVwIHRoZSBHbG9zc2FyeS4gVGhleSBhcmUgbm90IGRpcmVjdGx5IHJlbGF0ZWQgdG8gQ29udGVudEVsZW1lbnRzLCBidXQgdGhlaXIgcmVsYXRpb25zaGlwIGlzIGJlaW5nIGRlcml2ZWQgd2hlbiB0aGUgVGVybSBpcyB1c2VkIGluIHRoZSBDb250ZW50RWxlbWVudHMgZGVzY3JpcHRpb24gdGV4dC4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUHJhY3RpY2UiIGVTdXBlclR5cGVzPSIjLy9HdWlkYW5jZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBQcmFjdGljZSByZXByZXNlbnRzIGEgcHJvdmVuIHdheSBvciBzdHJhdGVneSBvZiBkb2luZyB3b3JrIHRvIGFjaGlldmUgYSBnb2FsIHRoYXQgaGFzIGEgcG9zaXRpdmUgaW1wYWN0IG9uIHdvcmsgcHJvZHVjdCBvciBwcm9jZXNzIHF1YWxpdHkuICBQcmFjdGljZXMgYXJlIGRlZmluZWQgb3J0aG9nb25hbCB0byBtZXRob2RzIGFuZCBwcm9jZXNzZXMuICBUaGV5IGNvdWxkIHN1bW1hcml6ZSBhc3BlY3RzIHRoYXQgaW1wYWN0IG1hbnkgZGlmZmVyZW50IHBhcnRzIG9mIGEgbWV0aG9kIG9yIHNwZWNpZmljIHByb2Nlc3Nlcy4gIEV4YW1wbGVzIGZvciBwcmFjdGljZXMgd291bGQgYmUgJnF1b3Q7TWFuYWdlIFJpc2tzJnF1b3Q7LCAmcXVvdDtDb250aW51b3VzbHkgdmVyaWZ5IHF1YWxpdHkmcXVvdDssICZxdW90O0FyY2hpdGVjdHVyZS1jZW50cmljIGFuZCBjb21wb25lbnQtYmFzZWQgZGV2ZWxvcG1lbnQmcXVvdDssIGV0Yy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ic3ViUHJhY3RpY2VzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9QcmFjdGljZSIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iY29udGVudFJlZmVyZW5jZXMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0NvbnRlbnRFbGVtZW50Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImFjdGl2aXR5UmVmZXJlbmNlcyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vQWN0aXZpdHkiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIiBlU3VwZXJUeXBlcz0iIy8vR3VpZGFuY2UiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkVzdGltYXRpb24gQ29uc2lkZXJhdGlvbnMgcXVhbGlmeSB0aGUgdXNhZ2UgYW5kIGFwcGxpY2F0aW9uIG9mIGVzdGltYXRpb24gbWV0cmljcyBpbiB0aGUgZGV2ZWxvcG1lbnQgb2YgYW4gYWN0dWFsIGVzdGltYXRlLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJSZXVzYWJsZUFzc2V0IiBlU3VwZXJUeXBlcz0iIy8vR3VpZGFuY2UiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgUmV1c2FibGUgQXNzZXQgcHJvdmlkZXMgYSBzb2x1dGlvbiB0byBhIHByb2JsZW0gZm9yIGEgZ2l2ZW4gY29udGV4dC4gVGhlIGFzc2V0IG1heSBoYXZlIGEgdmFyaWFiaWxpdHkgcG9pbnQsIHdoaWNoIGlzIGEgbG9jYXRpb24gaW4gdGhlIGFzc2V0IHRoYXQgbWF5IGhhdmUgYSB2YWx1ZSBwcm92aWRlZCBvciBjdXN0b21pemVkIGJ5IHRoZSBhc3NldCBjb25zdW1lci4gVGhlIGFzc2V0IGhhcyBydWxlcyBmb3IgdXNhZ2Ugd2hpY2ggYXJlIHRoZSBpbnN0cnVjdGlvbnMgZGVzY3JpYmluZyYjeEQ7JiN4QTtob3cgdGhlIGFzc2V0IHNob3VsZCBiZSB1c2VkLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJTdGF0ZSIgZVN1cGVyVHlwZXM9IiMvL1ZlcnRleCI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9IldvcmtQcm9kdWN0IiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgbG93ZXJCb3VuZD0iMSIgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Xb3JrUHJvZHVjdCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJSZWdpb24iIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1JlZ2lvbiIgY29udGFpbm1lbnQ9InRydWUiIGVPcHBvc2l0ZT0iIy8vUmVnaW9uL1N0YXRlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InN1Ym1hY2hpbmUiIGVUeXBlPSIjLy9TdGF0ZU1hY2hpbmUiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iVmVydGV4Ij4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iY29udGFpbmVyIiBlVHlwZT0iIy8vUmVnaW9uIgotICAgICAgICB0cmFuc2llbnQ9InRydWUiIGVPcHBvc2l0ZT0iIy8vUmVnaW9uL1ZlcnRleCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJvdXRnb2luZyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vVHJhbnNpdGlvbiIgZU9wcG9zaXRlPSIjLy9UcmFuc2l0aW9uL3NvdXJjZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJpbmNvbWluZyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vVHJhbnNpdGlvbiIgZU9wcG9zaXRlPSIjLy9UcmFuc2l0aW9uL3RhcmdldCIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJSZWdpb24iPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJWZXJ0ZXgiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1ZlcnRleCIgY29udGFpbm1lbnQ9InRydWUiIGVPcHBvc2l0ZT0iIy8vVmVydGV4L2NvbnRhaW5lciIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJUcmFuc2l0aW9uIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9UcmFuc2l0aW9uIiBjb250YWlubWVudD0idHJ1ZSIgZU9wcG9zaXRlPSIjLy9UcmFuc2l0aW9uL2NvbnRhaW5lciIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJTdGF0ZSIgZVR5cGU9IiMvL1N0YXRlIgotICAgICAgICB0cmFuc2llbnQ9InRydWUiIGVPcHBvc2l0ZT0iIy8vU3RhdGUvUmVnaW9uIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9IlN0YXRlTWFjaGluZSIgZVR5cGU9IiMvL1N0YXRlTWFjaGluZSIKLSAgICAgICAgdHJhbnNpZW50PSJ0cnVlIiBlT3Bwb3NpdGU9IiMvL1N0YXRlTWFjaGluZS9SZWdpb24iLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iU3RhdGVNYWNoaW5lIiBlU3VwZXJUeXBlcz0iIy8vV29ya0RlZmluaXRpb24iPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJSZWdpb24iIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICBsb3dlckJvdW5kPSIxIiB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1JlZ2lvbiIgY29udGFpbm1lbnQ9InRydWUiIGVPcHBvc2l0ZT0iIy8vUmVnaW9uL1N0YXRlTWFjaGluZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJUcmFuc2l0aW9uIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iV29ya0RlZmluaXRpb24iIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICBsb3dlckJvdW5kPSIxIiB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1dvcmtEZWZpbml0aW9uIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImNvbnRhaW5lciIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9IiMvL1JlZ2lvbiIgdHJhbnNpZW50PSJ0cnVlIiBlT3Bwb3NpdGU9IiMvL1JlZ2lvbi9UcmFuc2l0aW9uIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InNvdXJjZSIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9IiMvL1ZlcnRleCIgZU9wcG9zaXRlPSIjLy9WZXJ0ZXgvb3V0Z29pbmciLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0idGFyZ2V0IiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iIy8vVmVydGV4IiBlT3Bwb3NpdGU9IiMvL1ZlcnRleC9pbmNvbWluZyIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQc2V1ZG9TdGF0ZSIgZVN1cGVyVHlwZXM9IiMvL1ZlcnRleCIvPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRW51bSIgbmFtZT0iUHNldWRvU3RhdGVLaW5kIj4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9ImluaXRpYWwiLz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9ImpvaW4iIHZhbHVlPSIxIi8+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJmb3JrIiB2YWx1ZT0iMiIvPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0ianVuY3Rpb24iIHZhbHVlPSIzIi8+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJjaG9pY2UiIHZhbHVlPSI0Ii8+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJlbnRyeVBvaW50IiB2YWx1ZT0iNSIvPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iZXhpdFBvaW50IiB2YWx1ZT0iNiIvPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0idGVybWluYXRlIiB2YWx1ZT0iNyIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJEaXNjaXBsaW5lIiBlU3VwZXJUeXBlcz0iIy8vQ29udGVudENhdGVnb3J5Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIERpc2NpcGxpbmUgaXMgYSBjYXRlZ29yaXphdGlvbiBvZiB3b3JrIChpLmUuIFRhc2tzIGZvciBNZXRob2QgQ29udGVudCksIGJhc2VkIHVwb24gc2ltaWxhcml0eSBvZiBjb25jZXJucyBhbmQgY29vcGVyYXRpb24gb2Ygd29yayBlZmZvcnQuJiN4RDsmI3hBO0EgZGlzY2lwbGluZSBpcyBhIGNvbGxlY3Rpb24gb2YgVGFza3MgdGhhdCBhcmUgcmVsYXRlZCB0byBhIG1ham9yICdhcmVhIG9mIGNvbmNlcm4nIHdpdGhpbiB0aGUgb3ZlcmFsbCBwcm9qZWN0LiBUaGUgZ3JvdXBpbmcgb2YgVGFza3MgaW50byBkaXNjaXBsaW5lcyBpcyBtYWlubHkgYW4gYWlkIHRvIHVuZGVyc3RhbmRpbmcgdGhlIHByb2plY3QgZnJvbSBhICd0cmFkaXRpb25hbCcgd2F0ZXJmYWxsIHBlcnNwZWN0aXZlLiBIb3dldmVyLCB0eXBpY2FsbHksIGZvciBleGFtcGxlLCBpdCBpcyBtb3JlIGNvbW1vbiB0byBwZXJmb3JtIGNlcnRhaW4gcmVxdWlyZW1lbnRzIGFjdGl2aXRpZXMgaW4gY2xvc2UgY29vcmRpbmF0aW9uIHdpdGggYW5hbHlzaXMgYW5kIGRlc2lnbiBhY3Rpdml0aWVzLiBTZXBhcmF0aW5nIHRoZXNlIGFjdGl2aXRpZXMgaW50byBzZXBhcmF0ZSBkaXNjaXBsaW5lcyBtYWtlcyB0aGUgYWN0aXZpdGllcyBlYXNpZXIgdG8gY29tcHJlaGVuZC4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0idGFza3MiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1Rhc2siLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ic3ViZGlzY2lwbGluZSIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vRGlzY2lwbGluZSIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icmVmZXJlbmNlV29ya2Zsb3dzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9BY3Rpdml0eSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJDb250ZW50Q2F0ZWdvcnkiIGFic3RyYWN0PSJ0cnVlIiBlU3VwZXJUeXBlcz0iIy8vQ29udGVudEVsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkNvbnRlbnQgQ2F0ZWdvcnkgaXMgYW4gYWJzdHJhY3QgY2xhc3MgZ2VuZXJhbGl6aW5nIGNvbnRlbnQgY2F0ZWdvcnkgdHlwZXMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlJvbGVTZXQiIGVTdXBlclR5cGVzPSIjLy9Db250ZW50Q2F0ZWdvcnkiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgUm9sZSBTZXQgb3JnYW5pemVzIFJvbGVzIGludG8gY2F0ZWdvcmllcy4gIEl0IGlzIHVzZWQgdG8gZ3JvdXAgcm9sZXMgdG9nZXRoZXIgdGhhdCBoYXZlIGNlcnRhaW4gY29tbW9uYWxpdGllcy4gIEZvciBleGFtcGxlLCB0aGUgJnF1b3Q7QW5hbHlzdHMmcXVvdDsgUm9sZSBTZXQgY291bGQgZ3JvdXAgdGhlICZxdW90O0J1c2luZXNzIFByb2Nlc3MgQW5hbHlzdCZxdW90OywgJnF1b3Q7U3lzdGVtIEFuYWx5c3QmcXVvdDssIGFzIHdlbGwgYXMgJnF1b3Q7UmVxdWlyZW1lbnRzIFNwZWNpZmllciZxdW90OyByb2xlcy4gIEFsbCBvZiB0aGVzZSB3b3JrIHdpdGggc2ltaWxhciB0ZWNobmlxdWVzIGFuZCBoYXZlIG92ZXJsYXBwaW5nIHNraWxscywgYnV0IGFyZSByZXF1aXJlZCBhcyBkaXN0aW5jdCByb2xlcyBmb3IgYSBtZXRob2QgKGUuZy4gdGhlIG1ldGhvZCB0aGUgSUJNIFJhdGlvbmFsIFVuaWZpZWQgUHJvY2VzcyBpcyBiYXNlZCBvbikuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InJvbGVzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Sb2xlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkRvbWFpbiIgZVN1cGVyVHlwZXM9IiMvL0NvbnRlbnRDYXRlZ29yeSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRG9tYWluIGlzIGEgcmVmaW5lYWJsZSBoaWVyYXJjaHkgZ3JvdXBpbmcgcmVsYXRlZCB3b3JrIHByb2R1Y3RzLiAgSW4gb3RoZXIgd29yZHMsIERvbWFpbnMgY2FuIGJlIGZ1cnRoZXIgZGl2aWRlZCBpbnRvIHN1Yi1kb21haW5zLCB3aXRoIHdvcmsgcHJvZHVjdCBlbGVtZW50cyB0byBiZSBjYXRlZ29yaXplZCBvbmx5IGF0IHRoZSBsZWFmLWxldmVsIG9mIHRoaXMgaGllcmFyY2h5LiYjeEQ7JiN4QTtEb21haW4gaXMgYSBsb2dpY2FsIGdyb3VwaW5nIG9mIHdvcmsgcHJvZHVjdHMgdGhhdCBoYXZlIGFuIGFmZmluaXR5IHRvIGVhY2ggb3RoZXIgYmFzZWQgb24gcmVzb3VyY2VzLCB0aW1pbmcsIG9yIHJlbGF0aW9uc2hpcC4gIEEgRG9tYWluIG1heSBiZSBkaXZpZGVkIGludG8gc3ViZG9tYWlucy4gIEZvciBleGFtcGxlLCBHUyBNZXRob2QgdXNlcyBzaXggcHJlZGVmaW5lZCBEb21haW5zIGZvciBXb3JrIFByb2R1Y3RzOiBBcHBsaWNhdGlvbiwgQXJjaGl0ZWN0dXJlLCBCdXNpbmVzcywgRW5nYWdlbWVudCwgT3BlcmF0aW9ucyBhbmQgT3JnYW5pemF0aW9uLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ3b3JrUHJvZHVjdHMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1dvcmtQcm9kdWN0Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InN1YmRvbWFpbnMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0RvbWFpbiIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iV29ya1Byb2R1Y3RUeXBlIiBlU3VwZXJUeXBlcz0iIy8vQ29udGVudENhdGVnb3J5Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXb3JrIFByb2R1Y3QgVHlwZSBpcyBhIHNlY29uZCBjYXRlZ29yeSBmb3Igd29yayBwcm9kdWN0cywgd2hpY2ggaW4gY29udHJhc3QgdG8gRG9tYWluIGlzIG1vcmUgcHJlc2VudGF0aW9uIG9yaWVudGVkLiAgQSB3b3JrIHByb2R1Y3QgY2FuIGhhdmUgbWFueSBXb3JrIFByb2R1Y3QgVHlwZXMuICBFeGFtcGxlcywgZm9yIGEgV29yayBQcm9kdWN0IFR5cGUgaXMgJnF1b3Q7Q2xhc3MgRGlhZ3JhbSZxdW90Oywgd2hpY2ggY2F0ZWdvcml6ZXMgdGhlIEFydGlmYWN0cyBBbmFseXNpcyBNb2RlbCwgRGVzaWduIE1vZGVsLCBVc2VyIEV4cGVyaWVuY2UgTW9kZWwsIG9yICZxdW90O1NwZWNpZmljYXRpb24mcXVvdDssIHdoaWNoIGNhdGVnb3JpemVzIHJlcXVpcmVtZW50cyBzcGVjaWZpY2F0aW9ucyB0aGF0IGRlZmluZSBhIHN5c3RlbSB3aXRoIGEgd2VsbC1kZWZpbmVkIHN5c3RlbSBib3VuZGFyeSwgc3VjaCBhcyB1c2UgY2FzZSBvciBmdW5jdGlvbmFsIHJlcXVpcmVtZW50cyBzcGVjaWZpY2F0aW9uLiAgQSBXb3JrIFByb2R1Y3QgY2FuIGJlIGNhdGVnb3JpemVkIHRvIGJlIG9mIG1hbnkgV29yayBQcm9kdWN0IFR5cGVzLiAgRm9yIGV4YW1wbGUsIGEgdXNlIGNhc2UgbW9kZWwgY2FuIGJlIGNhdGVnb3JpemVkIGFzIGEgU3BlY2lmaWNhdGlvbiBhcyB3ZWxsIGFzIERpYWdyYW0gV29yayBQcm9kdWN0IFR5cGUuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9IndvcmtQcm9kdWN0cyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vV29ya1Byb2R1Y3QiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRGlzY2lwbGluZUdyb3VwaW5nIiBlU3VwZXJUeXBlcz0iIy8vQ29udGVudENhdGVnb3J5Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJEaXNjaXBsaW5lIEdyb3VwaW5ncyBhcmUgdXNlZCB0byBncm91cCBEaXNjaXBsaW5lcy4gIEZvciBleGFtcGxlLCB0aGUgRGlzY2lwbGluZSBHcm91cGluZyAmcXVvdDtTb2Z0d2FyZSBEaXNjaXBsaW5lcyZxdW90OyB3b3VsZCBiZSB0aGUgZ3JvdXAgb2YgYWxsIGRpc2NpcGxpbmVzIHJlbGF0ZWQgdG8gZGV2ZWxvcGluZyBzb2Z0d2FyZSBzdWNoIGFzICZxdW90O1JlcXVpcmVtZW50cyBNYW5hZ2VtZW50JnF1b3Q7IG9yICZxdW90O1Rlc3RpbmcmcXVvdDs7ICZxdW90O0lUIEluZnJhc3RydWN0dXJlIE1hbmFnZW1lbnQmcXVvdDsgd291bGQgYmUgYSBEaXNjaXBsaW5lcyBHcm91cGluZyBmb3IgZGlzY2lwbGluZXMgc3VjaCBhcyAmcXVvdDtJVCBPcGVyYXRpb25hbCBTZXJ2aWNlcyZxdW90OywgJnF1b3Q7SVQgQ3VzdG9tZXIgUmVsYXRpb25zaGlwcyZxdW90Oywgb3IgJnF1b3Q7SVQgRW5hYmxpbmcgU2VydmljZXMmcXVvdDsuICBEaXNjaXBsaW5lcyBjYW4gYmUgYXNzb2NpYXRlZCB0byBtb3JlIHRoYW4gb25lIERpc2NpcGxpbmUgR3JvdXBpbmcuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImRpc2NpcGxpbmVzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9EaXNjaXBsaW5lIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlRvb2wiIGVTdXBlclR5cGVzPSIjLy9Db250ZW50Q2F0ZWdvcnkiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgVG9vbCBpcyBhIGNvbnRhaW5lci9hZ2dyZWdhdGUgZm9yIFRvb2xNZW50b3JzLiAgSXQgY2FuIGFsc28gcHJvdmlkZSBnZW5lcmFsIGRlc2NyaXB0aW9ucyBvZiB0aGUgdG9vbCBhbmQgaXRzIGdlbmVyYWwgY2FwYWJpbGl0aWVzLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ0b29sTWVudG9ycyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vVG9vbE1lbnRvciIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJSb2xlU2V0R3JvdXBpbmciIGVTdXBlclR5cGVzPSIjLy9Db250ZW50Q2F0ZWdvcnkiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlJvbGUgU2V0cyBjYW4gYmUgY2F0ZWdvcml6ZWQgaW50byBSb2xlIFNldCBHcm91cGluZ3MuICBGb3IgZXhhbXBsZSwgZGlmZmVyZW50IG1ldGhvZHMgbWlnaHQgZGVmaW5lIHNpbWlsYXIgUm9sZSBTZXRzLCB3aGljaCBob3dldmVyIG5lZWQgdG8gYmUgZGlzdGluZ3Vpc2hlZCBmcm9tIGVhY2ggb3RoZXIgb24gYSBnbG9iYWwgc2NhbGUuICBUaHVzLCBSb2xlIFNldCBHcm91cGluZ3MgYWxsb3cgZGlzdGluZ3Vpc2hpbmcsIGZvciBleGFtcGxlLCBTb2Z0d2FyZSBTZXJ2aWNlcyBNYW5hZ2VyIFJvbGUgU2V0cyBmcm9tIFNvZnR3YXJlIERldmVsb3BtZW50IE9yZ2FuaXphdGlvbiBNYW5hZ2VyIFJvbGUgU2V0cy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icm9sZVNldHMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1JvbGVTZXQiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQ3VzdG9tQ2F0ZWdvcnkiIGVTdXBlclR5cGVzPSIjLy9Db250ZW50Q2F0ZWdvcnkiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgQ3VzdG9tIENhdGVnb3J5IGlzIGEgY2F0ZWdvcnkgaW50cm9kdWNlZCBieSBhIG1ldGhvZCBjb250ZW50IGF1dGhvciB0byBzdHJ1Y3R1cmUgYW55IG51bWJlciBvZiBtZXRob2QgQ29udGVudCBFbGVtZW50cyBvZiBhbnkgc3VidHlwZSBiYXNlZCBvbiB1c2VyLWRlZmluZWQgY3JpdGVyaWEuICBCZWNhdXNlIENvbnRlbnQgQ2F0ZWdvcmllcyAoYW5kIHRoZXJlZm9yZSBDdXN0b20gQ2F0ZWdvcmllcywgdG9vKSBhcmUgQ29udGVudCBFbGVtZW50cyB0aGVtc2VsdmVzLCBDdXN0b20gQ2F0ZWdvcmllcyBjYW4gYmUgdXNlZCB0byByZWN1cnNpdmVseSBjYXRlZ29yaXplIENvbnRlbnQgQ2F0ZWdvcmllcyBhcyB3ZWxsLiAgQ3VzdG9tIENhdGVnb3JpZXMgY2FuIGFsc28gYmUgbmVzdGVkIHdpdGggYW55IENvbnRlbnQgQ2F0ZWdvcnkuICBDdXN0b20gY2F0ZWdvcmllcyBjYW4gYmUgdXNlZCB0byBjYXRlZ29yaXplIGNvbnRlbnQgYmFzZWQgb24gdGhlIHVzZXIncyBjcml0ZXJpYSBhcyB3ZWxsIGFzIHRvIGRlZmluZSB3aG9sZSB0cmVlLXN0cnVjdHVyZXMgb2YgbmVzdGVkIGNhdGVnb3JpZXMgYWxsb3dpbmcgdGhlIHVzZXIgdG8gc3lzdGVtYXRpY2FsbHkgbmF2aWdhdGUgYW5kIGJyb3dzZSBtZXRob2QgY29udGVudCBhbmQgcHJvY2Vzc2VzIGJhc2VkIG9uIHRoZXNlIGNhdGVnb3JpZXMuICBGb3IgZXhhbXBsZSwgb25lIGNvdWxkIGNyZWF0ZSBhIGN1c3RvbSBjYXRlZ29yeSB0byBsb2dpY2FsbHkgb3JnYW5pemUgY29udGVudCByZWxldmFudCBmb3IgdGhlIHVzZXIncyBkZXZlbG9wbWVudCBvcmdhbml6YXRpb24gZGVwYXJ0bWVudHM7IGUuZy4gYSAmcXVvdDtUZXN0aW5nJnF1b3Q7IGNhdGVnb3J5IHRoYXQgZ3JvdXBzIHRvZ2V0aGVyIGFsbCByb2xlcywgd29yayBwcm9kdWN0cywgdGFza3MsIGFuZCBndWlkYW5jZSBlbGVtZW50IHJlbGV2YW50IHRvIHRlc3RpbmcuICBBbm90aGVyIGV4YW1wbGUgd291bGQgYmUgY2F0ZWdvcmllcyB0aGF0IGV4cHJlc3MgbGljZW5zaW5nIGxldmVscyBvZiB0aGUgY29udGVudCBncm91cGluZyBmcmVlbHkgZGlzdHJpYnV0YWJsZSBtZXRob2QgY29udGVudCB2ZXJzdXMgY29udGVudCB0aGF0IHJlcHJlc2VudCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgYW5kIHJlcXVpcmVzIGEgbGljZW5zZSB0byBiZSBwdXJjaGFzZWQgdG8gYmUgYWJsZSB0byB1c2UgaXQuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImNhdGVnb3JpemVkRWxlbWVudHMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0Rlc2NyaWJhYmxlRWxlbWVudCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJzdWJDYXRlZ29yaWVzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Db250ZW50Q2F0ZWdvcnkiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRGVsaXZlcnlQcm9jZXNzIiBlU3VwZXJUeXBlcz0iIy8vUHJvY2VzcyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBEZWxpdmVyeSBQcm9jZXNzZXMgaXMgYSBzcGVjaWFsIFByb2Nlc3MgZGVzY3JpYmluZyBhIGNvbXBsZXRlIGFuZCBpbnRlZ3JhdGVkIGFwcHJvYWNoIGZvciBwZXJmb3JtaW5nIGEgc3BlY2lmaWMgcHJvamVjdCB0eXBlLiAgSXQgZGVzY3JpYmVzIGEgY29tcGxldGUgcHJvamVjdCBsaWZlY3ljbGUgZW5kLXRvLWVuZCBhbmQgc2hhbGwgYmUgdXNlZCBhcyBhIHJlZmVyZW5jZSBmb3IgcnVubmluZyBwcm9qZWN0cyB3aXRoIHNpbWlsYXIgY2hhcmFjdGVyaXN0aWNzIGFzIGRlZmluZWQgZm9yIHRoZSBwcm9jZXNzLiAgQSBEZWxpdmVyeSBQcm9jZXNzIGlzIHJlbGF0ZWQgdG8gc3BlY2lmaWMgc3VwcG9ydGluZyBpbmZvcm1hdGlvbiBzdWNoIGFzIFJvYWRtYXBzIChpbmhlcml0ZWQgdmlhIEFjdGl2aXR5KSBhcyB3ZWxsIGFzIENvbW11bmljYXRpb25zIGFuZCBFZHVjYXRpb24gTWF0ZXJpYWwuJiN4RDsmI3hBO0EgRGVsaXZlcnkgUHJvY2VzcyBpcyBhIFByb2Nlc3MgdGhhdCBjb3ZlcnMgYSB3aG9sZSBkZXZlbG9wbWVudCBsaWZlY3ljbGUgZnJvbSBiZWdpbm5pbmcgdG8gZW5kLiAgQSBEZWxpdmVyeSBQcm9jZXNzIHNoYWxsIGJlIHVzZWQgYXMgYSB0ZW1wbGF0ZSBmb3IgcGxhbm5pbmcgYW5kIHJ1bm5pbmcgYSBwcm9qZWN0LiAgSXQgcHJvdmlkZXMgYSBjb21wbGV0ZSBsaWZlY3ljbGUgbW9kZWwgd2l0aCBwcmVkZWZpbmVkIHBoYXNlcywgaXRlcmF0aW9ucywgYW5kIGFjdGl2aXRpZXMgdGhhdCBoYXZlIGJlZW4gZGV0YWlsZWQgYnkgc2VxdWVuY2luZyByZWZlcmVuY2luZyBtZXRob2QgY29udGVudCBpbiBicmVha2Rvd24gc3RydWN0dXJlcy4gIEl0IGlzIGRlZmluZWQgb24gdGhlIGJhc2lzIG9mIGV4cGVyaWVuY2Ugd2l0aCBwYXN0IHByb2plY3RzIG9yIGVuZ2FnZW1lbnRzLCBhbmQvb3IgdGhlIGJlc3QgcHJhY3RpY2UgdXNlIG9mIGEgZGV2ZWxvcG1lbnQgb3IgZGVsaXZlcnkgYXBwcm9hY2guICBJdCBkZWZpbmVzIHdoYXQgZ2V0cyBwcm9kdWNlZCwgaG93IHRob3NlIGl0ZW1zIGFyZSBwcm9kdWNlZCwgYW5kIHRoZSByZXF1aXJlZCBzdGFmZmluZyBpbiB0aGUgZm9ybSBvZiBpbnRlZ3JhdGVkIFdvcmssIFdvcmsgUHJvZHVjdCwgYW5kIFRlYW0gQnJlYWtkb3duIFN0cnVjdHVyZXMuICBGb3IgZXhhbXBsZSwgYSBwcm9jZXNzIGVuZ2luZWVyIGNhbiBkZWZpbmUgYWx0ZXJuYXRpdmUgRGVsaXZlcnkgUHJvY2Vzc2VzIGZvciBzb2Z0d2FyZSBkZXZlbG9wbWVudCBwcm9qZWN0cyB0aGF0IGRpZmZlciBpbiB0aGUgc2NhbGUgb2YgdGhlIGVuZ2FnZW1lbnQgYW5kIHN0YWZmaW5nIG5lY2Vzc2FyeSwgdGhlIHR5cGUgb2YgdGhlIHNvZnR3YXJlIGFwcGxpY2F0aW9uIHRvIGJlIGRldmVsb3BlZCwgdGhlIGRldmVsb3BtZW50IG1ldGhvZHMgYW5kIHRlY2hub2xvZ2llcyB0byBiZSB1c2VkLCBldGMuICBBbHRob3VnaCwgdGhlIERlbGl2ZXJ5IFByb2Nlc3MgYWltcyB0byBjb3ZlciBhIHdob2xlIHByb2plY3QgaXQga2VlcHMgY2VydGFpbiBkZWNpc2lvbiB0aGF0IGFyZSB0b28gcHJvamVjdCBzcGVjaWZpYyBvcGVuLiAgRm9yIGV4YW1wbGUsIHRoZSBicmVha2Rvd24gc3RydWN0dXJlIGRlZmluZXMgd2hpY2ggQnJlYWtkb3duIEVsZW1lbnRzIGhhdmUgbXVsdGlwbGUgb2NjdXJyZW5jZXMgb3IgaXMgcmVwZWF0YWJsZSB2aWEgaXQgcmVzcGVjdGl2ZSBhdHRyaWJ1dGVzLCBidXQgZG9lcyBub3Qgc2F5IGhvdyBtYW55IG9jY3VycmVuY2VzIGFuZCBob3cgbWFueSByZXBlYXRzL2l0ZXJhdGlvbnMgaXQgd2lsbCBoYXZlLiAgVGhlc2UgZGVjaXNpb25zIGhhdmUgdG8gYmUgZG9uZSBieSBhIHByb2plY3QgbWFuYWdlciB3aGVuIHBsYW5uaW5nIGEgY29uY3JldGUgcHJvamVjdCwgcHJvamVjdCBwaGFzZSwgb3IgcHJvamVjdCBpdGVyYXRpb25zLiAgQSBEZWxpdmVyeSBQcm9jZXNzIGlzIGFsd2F5cyBhIGNvbXBsZXRlIGRlc2NyaXB0aW9uIG9mIGEgcHJvY2VzcyBpbiB0ZXJtcyBvZiBjb21wbGV0ZW5lc3Mgb2YgdGhlIGxpZmVjeWNsZSwgYXMgd2VsbCBhcyBpbiB0ZXJtcyBvZiBhbGwgdGhyZWUgdmlld3Mgb24gdGhlIHByb2Nlc3Mgd2hpY2ggYXJlIHRoZSBXb3JrIEJyZWFrZG93biBTdHJ1Y3R1cmUsIFdvcmsgUHJvZHVjdCBCcmVha2Rvd24gU3RydWN0dXJlLCBhbmQgVGVhbSBCcmVha2Rvd24gU3RydWN0dXJlIGhhdmUgdG8gYmUgZnVsbHkgYW5kIGNvbnNpc3RlbnRseSBwb3B1bGF0ZWQuICBDb25zaXN0ZW5jeSBvZiBhIERlbGl2ZXJ5IFByb2Nlc3MgaXMgYWN0dWFsbHkgZW5zdXJlZCBieSB0aGUgZmFjdCB0aGF0IGFsbCB0aHJlZSBicmVha2Rvd25zIGFyZSByZXByZXNlbnRlZCBieSBvbmUgc2luZ2xlIGRhdGEgc3RydWN0dXJlIGFuZCBvbmUgcGFydGljdWxhciBicmVha2Rvd24gc3VjaCBhcyBUZWFtIEJyZWFrZG93biBpcyBqdXN0IGEgdmlldyBvbiB0aGF0IGRhdGEgc3RydWN0dXJlLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJlZHVjYXRpb25NYXRlcmlhbHMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1N1cHBvcnRpbmdNYXRlcmlhbCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJjb21tdW5pY2F0aW9uc01hdGVyaWFscyIKLSAgICAgICAgb3JkZXJlZD0iZmFsc2UiIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vU3VwcG9ydGluZ01hdGVyaWFsIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlByb2Nlc3MiIGFic3RyYWN0PSJ0cnVlIiBlU3VwZXJUeXBlcz0iIy8vQWN0aXZpdHkiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgUHJvY2VzcyBpcyBhIHNwZWNpYWwgQWN0aXZpdHkgdGhhdCBkZXNjcmliZXMgYSBzdHJ1Y3R1cmUgZm9yIHBhcnRpY3VsYXIgdHlwZXMgb2YgZGV2ZWxvcG1lbnQgcHJvamVjdHMuICBUbyBwZXJmb3JtIHN1Y2ggYSBkZXZlbG9wbWVudCBwcm9qZWN0IGEgUHJvY2Vzc2VzIHdvdWxkIGJlICdpbnN0YW50aWF0ZWQnIGFuZCBhZGFwdGVkIGZvciB0aGUgc3BlY2lmaWMgc2l0dWF0aW9uLiAgUHJvY2VzcyBpcyBhbiBhYnN0cmFjdCBjbGFzcyBhbmQgdGhpcyBtZXRhLW1vZGVsIGRlZmluZXMgZGlmZmVyZW50IHNwZWNpYWwgdHlwZXMgb2YgUHJvY2Vzc2VzIGZvciBkaWZmZXJlbnQgcHJvY2VzcyBtYW5hZ2VtZW50IGFwcGxpY2F0aW9ucyBhbmQgZGlmZmVyZW50IHNpdHVhdGlvbnMgb2YgcHJvY2VzcyByZXVzZS4gIEV2ZXJ5IFByb2Nlc3MgY29tcHJpc2VzIG9mIGFuZCBpcyB0aGUgdG9wLWxldmVsIGVsZW1lbnQgb2YgYW4gbi1sZXZlbCBicmVha2Rvd24gc3RydWN0dXJlIHVzaW5nIHRoZSBOZXN0aW5nIGFzc29jaWF0aW9uIGRlZmluZWQgb24gQWN0aXZpdHkuJiN4RDsmI3hBO0NvcmUgTWV0aG9kIENvbnRlbnQgcHJvdmlkZXMgc3RlcC1ieS1zdGVwIGV4cGxhbmF0aW9ucywgZGVzY3JpYmluZyBob3cgdmVyeSBzcGVjaWZpYyBkZXZlbG9wbWVudCBnb2FscyBhcmUgYWNoaWV2ZWQgaW5kZXBlbmRlbnQgb2YgdGhlIHBsYWNlbWVudCBvZiB0aGVzZSBzdGVwcyB3aXRoaW4gYSBkZXZlbG9wbWVudCBsaWZlY3ljbGUuICBQcm9jZXNzZXMgdGFrZSB0aGVzZSBtZXRob2QgZWxlbWVudHMgYW5kIHJlbGF0ZSB0aGVtIGludG8gc2VtaS1vcmRlcmVkIHNlcXVlbmNlcyB0aGF0IGFyZSBjdXN0b21pemVkIHRvIHNwZWNpZmljIHR5cGVzIG9mIHByb2plY3RzLiAgVGh1cywgYSBwcm9jZXNzIGlzIGEgc2V0IG9mIHBhcnRpYWxseSBvcmRlcmVkIHdvcmsgZGVzY3JpcHRpb25zIGludGVuZGVkIHRvIHJlYWNoIGEgaGlnaGVyIGRldmVsb3BtZW50IGdvYWwsIHN1Y2ggYXMgdGhlIHJlbGVhc2Ugb2YgYSBzcGVjaWZpYyBzb2Z0d2FyZSBzeXN0ZW0uICBBIHByb2Nlc3MgYW5kIHRoZSBwcm9jZXNzIG1ldGEtbW9kZWwgc3RydWN0dXJlIGRlZmluZWQgaW4gdGhpcyBzcGVjaWZpY2F0aW9uIGZvY3VzZXMgb24gdGhlIGxpZmVjeWNsZSBhbmQgdGhlIHNlcXVlbmNpbmcgb2Ygd29yayBpbiBicmVha2Rvd24gc3RydWN0dXJlcy4gIFRvIGFjaGlldmUgdGhpcyBpdCB1c2VzIHRoZSBEZXNjcmlwdG9yIGNvbmNlcHQgcmVmZXJlbmNpbmcgbWV0aG9kIGNvbnRlbnQgYW5kIGFsbG93aW5nIGRlZmluaW5nIHRpbWUtc3BlY2lmaWMgY3VzdG9taXphdGlvbnMgb2YgdGhlIHJlZmVyZW5jZWQgY29udGVudCAoZS5nLiBkZWZpbmluZyBhIGZvY3VzIG9uIGRpZmZlcmVudCBzdGVwcyBvZiB0aGUgc2FtZSBUYXNrIGFuZCBwcm92aWRpbmcgaW5wdXQgV29yayBQcm9kdWN0cyBpbiBkaWZmZXJlbnQgc3RhdGVzIHdpdGhpbiB0aGUgZGlmZmVyZW50IFBoYXNlcyBvZiBhIHByb2Nlc3MgbGlmZWN5Y2xlIGluIHdoaWNoIHRoZSBzYW1lIFRhc2sgaXMgcGVyZm9ybWVkKS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iaW5jbHVkZXNQYXR0ZXJucyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vQ2FwYWJpbGl0eVBhdHRlcm4iLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZGVmYXVsdENvbnRleHQiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSIjLy9NZXRob2RDb25maWd1cmF0aW9uIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InZhbGlkQ29udGV4dCIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vTWV0aG9kQ29uZmlndXJhdGlvbiIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJDYXBhYmlsaXR5UGF0dGVybiIgZVN1cGVyVHlwZXM9IiMvL1Byb2Nlc3MiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgQ2FwYWJpbGl0eSBQYXR0ZXJuIGlzIGEgc3BlY2lhbCBQcm9jZXNzIHRoYXQgZGVzY3JpYmVzIGEgcmV1c2FibGUgY2x1c3RlciBvZiBkb2luZyB3b3JrIGluIGNvbW1vbiBwcm9jZXNzIGFyZWFzLiAgQ2FwYWJpbGl0aWVzIFBhdHRlcm5zIGV4cHJlc3MgYW5kIGNvbW11bmljYXRlIHByb2Nlc3Mga25vd2xlZGdlIGZvciBhIGtleSBhcmVhIG9mIGludGVyZXN0IHN1Y2ggYXMgYSBEaXNjaXBsaW5lIGFuZCBjYW4gYmUgZGlyZWN0bHkgdXNlZCBieSBwcm9jZXNzIHByYWN0aXRpb25lciB0byBndWlkZSBoaXMgd29yay4gIFRoZXkgYXJlIGFsc28gdXNlZCBhcyBidWlsZGluZyBibG9ja3MgdG8gYXNzZW1ibGUgRGVsaXZlcnkgUHJvY2Vzc2VzIG9yIGxhcmdlciBDYXBhYmlsaXR5IFBhdHRlcm5zIGVuc3VyaW5nIG9wdGltYWwgcmV1c2UgYW5kIGFwcGxpY2F0aW9uIG9mIHRoZSBrZXkgcHJhY3RpY2VzIHRoZXkgZXhwcmVzcy4mI3hEOyYjeEE7QSBDYXBhYmlsaXR5IFBhdHRlcm4gaXMgYSBzcGVjaWFsIFByb2Nlc3MgdGhhdCBkZXNjcmliZXMgYSByZXVzYWJsZSBjbHVzdGVyIG9mIGRvaW5nIHdvcmsgaW4gYSBnZW5lcmFsIHByb2Nlc3MgYXJlYSB0aGF0IHByb3ZpZGVzIGEgY29uc2lzdGVudCBkZXZlbG9wbWVudCBhcHByb2FjaCB0byBjb21tb24gcHJvYmxlbXMuICBFeGFtcGxlcyBmb3IgQ2FwYWJpbGl0eSBQYXR0ZXJuIGNvdWxkIGJlICd1c2UgY2FzZS1iYXNlZCByZXF1aXJlbWVudHMgbWFuYWdlbWVudCcsICd1c2UgY2FzZSBhbmFseXNpcycsIG9yICd1bml0IHRlc3RpbmcnLiBUeXBpY2FsbHkgYnV0IG5vdCBuZWNlc3NhcmlseSwgQ2FwYWJpbGl0eSBQYXR0ZXJucyBoYXZlIHRoZSBzY29wZSBvZiBvbmUgZGlzY2lwbGluZSBwcm92aWRpbmcgYSBicmVha2Rvd24gb2YgcmV1c2FibGUgY29tcGxleCBBY3Rpdml0aWVzLCByZWxhdGlvbnNoaXBzIHRvIHRoZSBSb2xlcyB3aGljaCBwZXJmb3JtIFRhc2tzIHdpdGhpbiB0aGVzZSBBY3Rpdml0aWVzLCBhcyB3ZWxsIGFzIHRvIHRoZSBXb3JrIFByb2R1Y3RzIHRoYXQgYXJlIHVzZWQgYW5kIHByb2R1Y2VkLiAgQSBjYXBhYmlsaXR5IHBhdHRlcm4gZG9lcyBub3QgcmVsYXRlIHRvIGFueSBzcGVjaWZpYyBwaGFzZSBvciBpdGVyYXRpb24gb2YgYSBkZXZlbG9wbWVudCBsaWZlY3ljbGUsIGFuZCBzaG91bGQgbm90IGltcGx5IGFueS4gIEluIG90aGVyIHdvcmRzLCBhIHBhdHRlcm4gc2hvdWxkIGJlIGRlc2lnbmVkIGluIGEgd2F5IHRoYXQgaXQgaXMgYXBwbGljYWJsZSBhbnl3aGVyZSBpbiBhIERlbGl2ZXJ5IFByb2Nlc3MuICBUaGlzIGVuYWJsZXMgaXRzIEFjdGl2aXRpZXMgdG8gYmUgZmxleGlibHkgYXNzaWduZWQgdG8gd2hhdGV2ZXIgcGhhc2VzIHRoZXJlIGFyZSBpbiB0aGUgRGVsaXZlcnkgUHJvY2VzcyB0byB3aGljaCBpdCBpcyBiZWluZyBhcHBsaWVkLiAgSXQgaXMgYSBnb29kIHByYWN0aWNlIHRvIGRlc2lnbiBhIENhcGFiaWxpdHkgUGF0dGVybiB0byBwcm9kdWNlIG9uZSBvciBtb3JlIGdlbmVyaWMgRGVsaXZlcmFibGVzLiAgVGhlIHR5cGljYWwgY29uZmlndXJhdGlvbiBpcyB0aGF0IGVhY2ggQWN0aXZpdHkgaW4gdGhlIENhcGFiaWxpdHkgUGF0dGVybiBwcm9kdWNlcyBvbmUgRGVsaXZlcmFibGUsIGFuZCB0aGUgbGFzdCBUYXNrIERlc2NyaXB0b3IgaW4gdGhlIEFjdGl2aXR5IGV4cGxpY2l0bHkgb3V0cHV0cyBqdXN0IHRoaXMgRGVsaXZlcmFibGUuICBUaGlzIGVuYWJsZXMgdGhlIHByb2Nlc3MgZW5naW5lZXIgdG8gc2VsZWN0IFBhdHRlcm5zIG9yIGp1c3QgQWN0aXZpdGllcyBieSBkZWNpZGluZyB3aGljaCBEZWxpdmVyYWJsZXMgYXJlIHJlcXVpcmVkLiAgSXQgYWxzbyBvZmZlcnMgYSBzaW1wbGUgaW50ZWdyYXRpb24gYXBwcm9hY2g6IGFuIEFjdGl2aXR5IGZyb20gYSBjYXBhYmlsaXR5IHBhdHRlcm4gaXMgbGlua2VkIHRvIHRoZSBQaGFzZSBvciBJdGVyYXRpb24gd2hpY2ggaXMgcmVxdWlyZWQgdG8gcHJvZHVjZSB0aGUgQWN0aXZpdHkncyBEZWxpdmVyYWJsZS4gIEtleSBhcHBsaWNhdGlvbnMgYXJlYXMgb2YgLyBhcmVhcyBvZiByZXVzZSBmb3IgQ2FwYWJpbGl0eSBQYXR0ZXJucyBhcmU6JiN4RDsmI3hBOy0gVG8gc2VydmUgYXMgYnVpbGRpbmcgYmxvY2tzIGZvciBhc3NlbWJsaW5nIERlbGl2ZXJ5IFByb2Nlc3NlcyBvciBsYXJnZXIgQ2FwYWJpbGl0eSBQYXR0ZXJucy4gIE5vcm1hbGx5IGRldmVsb3BpbmcgYSBEZWxpdmVyeSBQcm9jZXNzIGlzIG5vdCBkb25lIGZyb20gc2NyYXRjaCBidXQgYnkgc3lzdGVtYXRpY2FsbHkgYXBwbHlpbmcgYW5kIGJpbmRpbmcgcGF0dGVybnMuICBJbiBhZGRpdGlvbiB0byB0aGUgc3RhbmRhcmQgcGF0dGVybiBhcHBsaWNhdGlvbiBvZiAnY29weS1hbmQtbW9kaWZ5Jywgd2hpY2ggYWxsb3dzIHRoZSBwcm9jZXNzIGVuZ2luZWVyIHRvIGluZGl2aWR1YWxseSBjdXN0b21pemUgdGhlIHBhdHRlcm4ncyBjb250ZW50IHRvIHRoZSBwYXJ0aWN1bGFyIHNpdHVhdGlvbiBpdCBpcyBhcHBsaWVkIGZvciwgdGhlIFBsdWdpbiBtZXRhLW1vZGVsIHBhY2thZ2UgKFNlY3Rpb24gNi4xKSBpbnRyb2R1Y2VzIGV2ZW4gbW9yZSBzb3BoaXN0aWNhdGVkIGluaGVyaXRhbmNlIHJlbGF0aW9uc2hpcHMgdGhhdCBzdXBwb3J0IGR5bmFtaWMgYmluZGluZyBvZiBwYXR0ZXJucyAoaS5lLiB0aGUgcGF0dGVybiBpcyByZWZlcmVuY2VkIGFuZCBub3QgY29waWVkKS4gIFRoaXMgdW5pcXVlIG5ldyB3YXkgb2YgcmV1c2luZyBwcm9jZXNzIGtub3dsZWRnZSBhbGxvd3MgdG8gZmFjdG9yIG91dCBjb21tb25seSByZW9jY3VycmluZyBBY3Rpdml0aWVzIGludG8gcGF0dGVybnMgYW5kIHRvIGFwcGx5IHRoZW0gb3ZlciBhbmQgb3ZlciBhZ2FpbiBmb3IgYSBwcm9jZXNzLiAgV2hlbiB0aGUgcGF0dGVybiBpcyBiZWluZyByZXZpc2VkIG9yIHVwZGF0ZWQsIGFsbCBjaGFuZ2VzIHdpbGwgYmUgYXV0b21hdGljYWxseSByZWZsZWN0ZWQgaW4gYWxsIHBhdHRlcm4gYXBwbGljYXRpb24gaW4gYWxsIHByb2Nlc3NlcyBiZWNhdXNlIG9mIHRoZSBkeW5hbWljIGJpbmRpbmcuJiN4RDsmI3hBOy0gVG8gc3VwcG9ydCBkaXJlY3QgZXhlY3V0aW9uIGluIGEgZGV2ZWxvcG1lbnQgcHJvamVjdCB0aGF0IGRvZXMgbm90IHdvcmsgZm9sbG93aW5nIGEgd2VsbC1kZWZpbmVkIHByb2Nlc3MsIGJ1dCB3b3JrcyBiYXNlZCBvbiBsb29zZWx5IGNvbm5lY3RlZCBwcm9jZXNzIGZyYWdtZW50cyBvZiBiZXN0IHByYWN0aWNlcyBpbiBhIGZsZXhpYmxlIG1hbm5lciAoZS5nLiBBZ2lsZSBEZXZlbG9wbWVudCkuJiN4RDsmI3hBOy0gVG8gc3VwcG9ydCBwcm9jZXNzIGVkdWNhdGlvbiBieSBkZXNjcmliaW5nIGtub3dsZWRnZSBmb3IgYSBrZXkgYXJlYSBzdWNoIGFzIGJlc3QgcHJhY3RpY2VzIG9uIGhvdyB0byBwZXJmb3JtIHRoZSB3b3JrIGZvciBhIERpc2NpcGxpbmUgKGUuZy4gUmVxdWlyZW1lbnRzIE1hbmFnZW1lbnQpLCBmb3IgYSBzcGVjaWZpYyBkZXZlbG9wbWVudCB0ZWNobmlxdWUgKGFzcGVjdC1vcmllbnRlZCBkZXZlbG9wbWVudCksIG9yIGEgc3BlY2lmaWMgdGVjaG5pY2FsIGFyZWEgKGUuZy4gcmVsYXRpb25hbCBkYXRhYmFzZSBkZXNpZ24pLCB3aGljaCBpcyB1c2VkIGZvciBlZHVjYXRpb24gYW5kIHRlYWNoaW5nLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSIgZVN1cGVyVHlwZXM9IiMvL1Byb2Nlc3MiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgUHJvY2VzcyBQbGFubmluZyBUZW1wbGF0ZSBpcyBhIHNwZWNpYWwgUHJvY2VzcyB0aGF0IGlzIHByZXBhcmVkIGZvciBpbnN0YW50aWF0aW9uIGJ5IGEgcHJvamVjdCBwbGFubmluZyB0b29sLiAgVHlwaWNhbGx5LCBpdCBpcyBjcmVhdGVkIGJhc2VkIG9uIGEgUHJvY2VzcyBzdWNoIGFzIGEgRGVsaXZlcnkgUHJvY2VzcyBhcyBhIHdob2xlIChlLmcuIGluIGNhc2Ugb2YgYSB3YXRlcmZhbGwtYmFzZWQgZGV2ZWxvcG1lbnQgYXBwcm9hY2gpIG9yIGluIHBhcnRzIChlLmcuIGluIGNhc2Ugb2YgYW4gaXRlcmF0aXZlIGRldmVsb3BtZW50IGFwcHJvYWNoKS4mI3hEOyYjeEE7QSBQcm9jZXNzIFBsYW5uaW5nIFRlbXBsYXRlIHJlcHJlc2VudHMgYSBwYXJ0aWFsbHkgZmluaXNoZWQgcGxhbiBmb3IgYSBjb25jcmV0ZSBwcm9qZWN0LiAgSXQgdXNlcyB0aGUgc2FtZSBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmVzIGFzIGFsbCBvdGhlciBQcm9jZXNzIFR5cGVzIHRvIHJlcHJlc2VudCB0ZW1wbGF0ZXMgZm9yIHByb2plY3QgcGxhbnMuICBIb3dldmVyLCBjZXJ0YWluIHBsYW5uaW5nIGRlY2lzaW9ucyBoYXZlIGFscmVhZHkgYmVlbiBhcHBsaWVkIHRvIHRoZSB0ZW1wbGF0ZSBhcyB3ZWxsIGFzIGluZm9ybWF0aW9uIGhhcyBiZWVuIHJlbW92ZWQgYW5kL29yIHJlZm9ybWF0dGVkIHRvIGJlIHJlYWR5IGZvciBleHBvcnQgdG8gYSBzcGVjaWZpYyBwbGFubmluZyB0b29sLiAgRXhhbXBsZXMgZm9yIHN1Y2ggZGVjaXNpb25zIGFyZTogYSB0ZW1wbGF0ZSBoYXMgYmVlbiBjcmVhdGVkIHRvIHJlcHJlc2VudCBhIHBsYW4gZm9yIGEgcGFydGljdWxhciBJdGVyYXRpb24gaW4gYW4gaXRlcmF0aXZlIGRldmVsb3BtZW50IHByb2plY3QsIHdoaWNoIGZyIGV4YW1wbGUgZGlzdGluZ3Vpc2hlcyBlYXJseSBmcm9tIGxhdGUgaXRlcmF0aW9ucyBpbiB0aGUgRWxhYm9yYXRpb24gcGhhc2Ugb2YgYSBwcm9qZWN0OyBpZiB0aGUgdGFyZ2V0ZWQgcGxhbm5pbmcgdG9vbCBjYW5ub3QgcmVwcmVzZW50IGlucHV0IGFuZCBvdXRwdXQgb2YgVGFzaywgdGhlbiB0aGVzZSBoYXZlIGJlZW4gcmVtb3ZlZCBmcm9tIHRoZSBzdHJ1Y3R1cmU7IGNlcnRhaW4gcmVwZXRpdGlvbnMgaGF2ZSBiZWVuIGFscmVhZHkgYXBwbGllZCwgZS5nLiBzdGF0aW5nIHRoYXQgYSBjeWNsZSBvZiBzcGVjaWZpYyBUYXNrIGdyb3VwZWQgaW4gYW4gQWN0aXZpdHkgaGF2ZSB0byBiZSByZXBlYXRlZCBuLXRpbWVzOyBldGMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImJhc2VkT25Qcm9jZXNzZXMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1Byb2Nlc3MiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUm9hZG1hcCIgZVN1cGVyVHlwZXM9IiMvL0d1aWRhbmNlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIFJvYWRtYXAgaXMgYSBzcGVjaWFsIEd1aWRhbmNlIFR5cGUgd2hpY2ggaXMgb25seSByZWxhdGVkIHRvIEFjdGl2YXRlcyBhbmQgdGhlcmVmb3JlIGhhcyBiZWVuIGFkZGVkIGJ5IHRoaXMgcGFja2FnZSB0byB0aGUgbGlzdCBvZiBHdWlkYW5jZSBUeXBlcyByYXRoZXIgdGhhbiBsaXN0ZWQgaW4gdGhlIEd1aWRhbmNlIFR5cGVzIHBhY2thZ2UuICBBIFJvYWRtYXAgcmVwcmVzZW50cyBhIGxpbmVhciB3YWxrdGhyb3VnaCBvZiBhbiBBY3Rpdml0eSwgdHlwaWNhbGx5IGEgUHJvY2Vzcy4mI3hEOyYjeEE7QW4gaW5zdGFuY2Ugb2YgYSBSb2FkbWFwIHJlcHJlc2VudHMgaW1wb3J0YW50IGRvY3VtZW50YXRpb24gZm9yIHRoZSBBY3Rpdml0eSBvciBQcm9jZXNzIGl0IGlzIHJlbGF0ZWQgdG8uICBPZnRlbiBhIGNvbXBsZXggQWN0aXZpdHkgc3VjaCBhcyBhIFByb2Nlc3MgY2FuIGJlIG11Y2ggZWFzaWVyIHVuZGVyc3Rvb2QgYnkgcHJvdmlkaW5nIGEgd2Fsa3Rocm91Z2ggd2l0aCBhIGxpbmVhciB0aHJlYWQgb2YgYSB0eXBpY2FsIGluc3RhbnRpYXRpb24gb2YgdGhpcyBBY3Rpdml0eS4gIEluIGFkZGl0aW9uIHRvIG1ha2luZyB0aGUgcHJvY2VzcyBwcmFjdGl0aW9uZXIgdW5kZXJzdGFuZCBob3cgd29yayBpbiB0aGUgcHJvY2VzcyBpcyBiZWluZyBwZXJmb3JtZWQsIGEgUm9hZG1hcCBwcm92aWRlcyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGFib3V0IGhvdyBBY3Rpdml0aWVzIGFuZCBUYXNrcyByZWxhdGUgdG8gZWFjaCBvdGhlciBvdmVyIHRpbWUuICBSb2FkbWFwcyBhcmUgYWxzbyB1c2VkIHRvIHNob3cgaG93IHNwZWNpZmljIGFzcGVjdHMgYXJlIGRpc3RyaWJ1dGVkIG92ZXIgYSB3aG9sZSBwcm9jZXNzIHByb3ZpZGluZyBhIGtpbmQgb2YgZmlsdGVyIG9uIHRoZSBwcm9jZXNzIGZvciB0aGlzIGluZm9ybWF0aW9uLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQcm9jZXNzQ29tcG9uZW50IiBlU3VwZXJUeXBlcz0iIy8vUHJvY2Vzc1BhY2thZ2UgIy8vTWV0aG9kVW5pdCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBQcm9jZXNzIENvbXBvbmVudCBpcyBhIHNwZWNpYWwgUHJvY2VzcyBQYWNrYWdlIHRoYXQgYXBwbGllcyB0aGUgcHJpbmNpcGxlcyBvZiBlbmNhcHN1bGF0aW9uLiAgQSBQcm9jZXNzIENvbXBvbmVudCByZWFsaXplcyBvbmUgb3IgbW9yZSBJbnRlcmZhY2VzIHdoaWNoIHNwZWNpZnkgaW5wdXRzIGFuZCBvdXRwdXRzIG9mIHRoZSBjb21wb25lbnQuIFRoZXJlIG1pZ2h0IGJlIG1hbnkgY29tcG9uZW50cyByZWFsaXppbmcgdGhlIHNhbWUgaW50ZXJmYWNlcywgYnV0IHVzaW5nIGRpZmZlcmVudCB0ZWNobmlxdWVzIHRvIGFjaGlldmUgc2ltaWxhciBvdXRwdXRzIGZvciBzaW1pbGFyIGlucHV0cy4gIFdoZXJlYXMgdGhlIENvbXBvbmVudCBJbnRlcmZhY2VzIHJlcHJlc2VudCBjb21wb25lbnQgc3BlY2lmaWNhdGlvbnMgKGJsYWNrIGJveCBkZXNjcmlwdGlvbnMgb2YgdGhlIGNvbXBvbmVudCksIGdvb2QgY2FuZGlkYXRlcyBmb3IgY29tcG9uZW50IHJlYWxpemF0aW9ucyBjYW4gYmUgZm91bmQgaW4gQ2FwYWJpbGl0eSBQYXR0ZXJucyAod2hpdGUgYm94IGRlc2NyaXB0aW9ucyBmb3IgdGhlIGNvbXBvbmVudCkuJiN4RDsmI3hBO1VNQSBzdXBwb3J0cyByZXBsYWNlYWJsZSBhbmQgcmV1c2FibGUgUHJvY2VzcyBDb21wb25lbnRzIHJlYWxpemluZyB0aGUgcHJpbmNpcGxlcyBvZiBlbmNhcHN1bGF0aW9uLiBDZXJ0YWluIHNpdHVhdGlvbnMgaW4gYSBzb2Z0d2FyZSBkZXZlbG9wbWVudCBwcm9qZWN0IG1pZ2h0IHJlcXVpcmUgdGhhdCBjb25jcmV0ZSByZWFsaXphdGlvbnMgb2YgcGFydHMgb2YgdGhlIHByb2Nlc3MgcmVtYWluIHVuZGVjaWRlZCBvciB3aWxsIGJlIGRlY2lkZWQgYnkgdGhlIGV4ZWN1dGluZyB0ZWFtIGl0c2VsZiAoZS5nLiBpbiBvdXRzb3VyY2luZyBzaXR1YXRpb25zKS4gIFVNQSBwcm92aWRlcyBhIHVuaXF1ZSBjb21wb25lbnQgY29uY2VwdCBkZWZpbmluZyBpbnRlcmZhY2VzIGZvciB3b3JrIHByb2R1Y3QgaW5wdXQgYW5kIG91dHB1dCwgYWxsb3dpbmcgdHJlYXRpbmcgdGhlIGFjdHVhbCBkZWZpbml0aW9uIG9mIHRoZSB3b3JrIHRoYXQgcHJvZHVjZXMgdGhlIG91dHB1dHMgYXMgYSAmcXVvdDtibGFjayBib3gmcXVvdDsuICBBdCBhbnkgcG9pbnQgZHVyaW5nIGEgcHJvamVjdCB0aGUgY29tcG9uZW50ICZxdW90O3JlYWxpemF0aW9uJnF1b3Q7IGRldGFpbGluZyB0aGUgd29yayBjYW4gYmUgYWRkZWQgdG8gdGhlIHByb2Nlc3MuICBUaGUgY29tcG9uZW50IGFwcHJvYWNoIGFsc28gYWxsb3dzIHRoYXQgZGlmZmVyZW50IHN0eWxlcyBvciB0ZWNobmlxdWVzIG9mIGRvaW5nIHdvcmsgY2FuIGJlIHJlcGxhY2VkIHdpdGggb25lIGFub3RoZXIuICBGb3IgZXhhbXBsZSwgYSBzb2Z0d2FyZSBjb2RlIG91dHB1dCBvZiBhIGNvbXBvbmVudCBjb3VsZCBiZSBwcm9kdWNlZCB3aXRoIGEgbW9kZWwtZHJpdmVuIGRldmVsb3BtZW50IG9yIGEgY29kZS1jZW50cmljIHRlY2huaXF1ZS4gIFRoZSBjb21wb25lbnQgY29uY2VwdCBlbmNhcHN1bGF0ZXMgdGhlIGFjdHVhbCB3b3JrIGFuZCBsZXRzIHRoZSBkZXZlbG9wbWVudCB0ZWFtIGNob29zZSB0aGUgYXBwcm9wcmlhdGUgdGVjaG5pcXVlIGFuZCBmaWxsIHRoZSBjb21wb25lbnQncyByZWFsaXphdGlvbiB3aXRoIHRoZWlyIGNob2ljZSBvZiBBY3Rpdml0aWVzIHRoYXQgcHJvZHVjZSB0aGUgcmVxdWlyZWQgb3V0cHV0cy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iaW50ZXJmYWNlcyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJwcm9jZXNzIiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iIy8vUHJvY2VzcyIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUHJvY2Vzc1BhY2thZ2UiIGVTdXBlclR5cGVzPSIjLy9NZXRob2RQYWNrYWdlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJQcm9jZXNzIFBhY2thZ2UgaXMgYSBzcGVjaWFsIE1ldGhvZCBQYWNrYWdlIHRoYXQgY29udGFpbnMgUHJvY2VzcyBFbGVtZW50cywgb25seS4mI3hEOyYjeEE7QSBrZXkgc2VwYXJhdGlvbiBvZiBjb25jZXJucyBpbiBVTUEgaXMgdGhlIGRpc3RpbmN0aW9uIGJldHdlZW4gTWV0aG9kIENvbnRlbnQgYW5kIFByb2Nlc3MuICBUaGlzIHNlcGFyYXRpb24gaXMgZW5mb3JjZWQgYnkgc3BlY2lhbCBwYWNrYWdlIHR5cGVzLCB3aGljaCBkbyBub3QgYWxsb3cgdGhlIG1peGluZyBvZiBtZXRob2QgY29udGVudCB3aXRoIHByb2Nlc3Nlcy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icHJvY2Vzc0VsZW1lbnRzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Qcm9jZXNzRWxlbWVudCIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZGlhZ3JhbXMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0RpYWdyYW0iIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UiIGVTdXBlclR5cGVzPSIjLy9CcmVha2Rvd25FbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIFByb2Nlc3MgQ29tcG9uZW50IEludGVyZmFjZSBjb21wcmlzZXMgb2YgYSBsaXN0IG9mIGludGVyZmFjZSBzcGVjaWZpY2F0aW9ucyAoc2ltaWxhciB0byBvcGVyYXRpb24gZGVjbGFyYXRpb25zKSB0aGF0IGV4cHJlc3MgaW5wdXRzIGFuZCBvdXRwdXRzIGZvciBhIHByb2Nlc3MgY29tcG9uZW50LiAgVGhlc2UgaW50ZXJmYWNlIHNwZWNpZmljYXRpb25zIGFyZSBleHByZXNzZWQgdXNpbmcgVGFzayBEZXNjcmlwdG9ycyB3aGljaCBhcmUgbm90IGxpbmtlZCB0byBUYXNrcyB0aGF0IGFyZSByZWxhdGVkIHRvIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9ycyBhcyB3ZWxsIGFzIG9wdGlvbmFsIGEgUm9sZSBEZXNjcmlwdG9yLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJpbnRlcmZhY2VTcGVjaWZpY2F0aW9ucyIKLSAgICAgICAgb3JkZXJlZD0iZmFsc2UiIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vVGFza0Rlc2NyaXB0b3IiIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImludGVyZmFjZUlPIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Xb3JrUHJvZHVjdERlc2NyaXB0b3IiIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlByb2Nlc3NDb21wb25lbnREZXNjcmlwdG9yIiBlU3VwZXJUeXBlcz0iIy8vRGVzY3JpcHRvciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBQcm9jZXNzIENvbXBvbmVudCBEZXNjcmlwdG9yIHJlcHJlc2VudHMgYSBQcm9jZXNzIENvbXBvbmVudCBhcHBsaWNhdGlvbiBpbiBhIFByb2Nlc3MsIGkuZS4gdGhlIGJyZWFrZG93biBzdHJ1Y3R1cmUgZGVmaW5pbmcgdGhlIFByb2Nlc3MuICBUaGUgUHJvY2VzcyBDb21wb25lbnQgRGVzY3JpcHRvciBpcyB1c2VkIHRvIGVuY2Fwc3VsYXRlIHRoZSBkZXRhaWxzIG9mIHRoZSBjb21wb25lbnQgaW4gYSBicmVha2Rvd24gc3RydWN0dXJlIGFuZCB0byBwcm92aWRlIGl0cyBvd24gc2V0IG9mIHJlbGF0aW9uc2hpcHMgc3VjaCBhcyBpdCBvd24gcHJlZGVjZXNzb3JzIGFuZCBzdWNjZXNzb3JzLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJQcm9jZXNzQ29tcG9uZW50IiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iIy8vUHJvY2Vzc0NvbXBvbmVudCIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJNZXRob2RQbHVnaW4iIGVTdXBlclR5cGVzPSIjLy9NZXRob2RVbml0ICMvL1BhY2thZ2UiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgTWV0aG9kIFBsdWdpbiBpcyBhIE1ldGhvZCBFbGVtZW50IHRoYXQgcmVwcmVzZW50cyBhIHBoeXNpY2FsIGNvbnRhaW5lciBmb3IgTWV0aG9kIFBhY2thZ2VzLiAgSXQgZGVmaW5lcyBhIGdyYW51bGFyaXR5IGxldmVsIGZvciB0aGUgbW9kdWxhcml6YXRpb24gYW5kIG9yZ2FuaXphdGlvbiBvZiBtZXRob2QgY29udGVudCBhbmQgcHJvY2Vzc2VzLiAgQSBNZXRob2QgUGx1Z2luIGNhbiBleHRlbmQgbWFueSBvdGhlciBNZXRob2QgUGx1Z2lucyBhbmQgaXQgY2FuIGJlIGV4dGVuZGVkIGJ5IG1hbnkgTWV0aG9kIFBsdWdpbnMuICBJdCBjYW4gYWxzbyBiZSB1c2VkIHN0YW5kLWFsb25lLCBpLmUuIHdpdGggbm8gRXh0ZW5zaW9uIHJlbGF0aW9uc2hpcCB0byBvdGhlciBwbHVnLWlucy4mI3hEOyYjeEE7TWV0aG9kIFBsdWdpbiBjb25jZXB0dWFsbHkgcmVwcmVzZW50cyBhIHVuaXQgZm9yIGNvbmZpZ3VyYXRpb24sIG1vZHVsYXJpemF0aW9uLCBleHRlbnNpb24sIHBhY2thZ2luZywgYW5kIGRlcGxveW1lbnQgb2YgbWV0aG9kIGNvbnRlbnQgYW5kIHByb2Nlc3Nlcy4gIEEgUHJvY2VzcyBFbmdpbmVlciBzaGFsbCBkZXNpZ24gaGlzIFBsdWdpbnMgYW5kIGFsbG9jYXRlIGhpcyBjb250ZW50IHRvIHRoZXNlIFBsdWdpbnMgd2l0aCByZXF1aXJlbWVudHMgZm9yIGV4dGVuc2liaWxpdHksIG1vZHVsYXJpdHksIHJldXNlLCBhbmQgbWFpbnRhaW5hYmlsaXR5IGluIG1pbmQuJiN4RDsmI3hBO1NwZWNpYWwgZXh0ZW5zaWJpbGl0eSBtZWNoYW5pc21zIGRlZmluZWQgZm9yIHRoZSBtZXRhLWNsYXNzZXMgVmFyaWFiaWxpdHkgRWxlbWVudCBhbmQgUHJvY2VzcyBDb250cmlidXRpb24gYWxsb3cgUGx1Z2luIGNvbnRlbnQgdG8gZGlyZWN0bHkgY29udHJpYnV0ZSBuZXcgY29udGVudCwgcmVwbGFjZSBleGlzdGluZyBjb250ZW50LCBvciB0byBjcm9zcy1yZWZlcmVuY2UgdG8gYW55IENvbnRlbnQgRWxlbWVudCBvciBQcm9jZXNzIHdpdGhpbiBhbm90aGVyIFBsdWdpbiB0aGF0IGl0IGV4dGVuZHMuICBTaW1pbGFyIHRvIFVNTCAyLjAncyAncGFja2FnZSBtZXJnZScgbWVjaGFuaXNtIHRyYW5zZm9ybWF0aW9uIGludGVycHJldGF0aW9ucywgaW50ZXJwcmV0aW5nIHRoZXNlIE1ldGhvZCBQbHVnaW4gbWVjaGFuaXNtcyByZXN1bHRzIGludG8gbmV3IGV4dGVuZGVkIE1ldGhvZCBDb250ZW50IGFuZCBQcm9jZXNzZXMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InVzZXJDaGFuZ2VhYmxlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbk9iamVjdCIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJtZXRob2RQYWNrYWdlcyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vTWV0aG9kUGFja2FnZSIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iYmFzZXMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL01ldGhvZFBsdWdpbiIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJWYXJpYWJpbGl0eUVsZW1lbnQiIGFic3RyYWN0PSJ0cnVlIgotICAgICAgZVN1cGVyVHlwZXM9IiMvL01ldGhvZEVsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlZhcmlhYmlsaXR5IEVsZW1lbnQgaXMgYW4gYWJzdHJhY3QgY2xhc3MgZGVyaXZlZCBmcm9tIE1ldGhvZCBFbGVtZW50IHRoYXQgcHJvdmlkZXMgbmV3IGNhcGFiaWxpdGllcyBmb3IgY29udGVudCB2YXJpYXRpb24gYW5kIGV4dGVuc2lvbiB0byBDb250ZW50IEVsZW1lbnRzIG9yIGFueSBvdGhlciBNZXRob2QgRWxlbWVudCB0aGF0IGRlcml2ZXMgZnJvbSBpdC4gIEl0IGhhcyBiZWVuIHBsYWNlZCBpbi1iZXR3ZWVuIHRoZSBjbGFzc2VzIE1ldGhvZCBFbGVtZW50IGFuZCBDb250ZW50IEVsZW1lbnQgaW4gdGhlIG92ZXJhbGwgVU1BIHRheG9ub215IG9mIGNsYXNzZXMgdXNpbmcgdGhlIFVNTCAyLjAgcGFja2FnZSBtZXJnZSBtZWNoYW5pc20uICBUaGUgYXNzb2NpYXRpb24gVmFyaWFiaWxpdHkgU3BlY2lhbGl6YXRpb24gc2hhbGwgb25seSBiZSBpbnN0YW50aWF0ZWQgYmV0d2VlbiB0d28gc3ViY2xhc3NlcyBvZiBWYXJpYWJpbGl0eSBFbGVtZW50IG9mIHRoZSBzYW1lIHR5cGUuICBUaGUgZWxlbWVudCBvbiB2YXJhaWJpbGl0eVNwZWNpYWxFbGVtZW50IHNpZGUgb2YgdGhlIHJlbGF0aW9uc2hpcCBkZWZpbmVzIGEgdmFsdWUgZm9yIHRoZSBhdHRyaWJ1dGUgdmFyaWFiaWxpdHlUeXBlIGRlZmluaW5nIHRoZSBuYXR1cmUgb2YgdGhlIHJlbGF0aW9uc2hpcCB1c2luZyBhIGxpdGVyYWwgZnJvbSB0aGUgZW51bWVyYXRpb24gVmFyaWFiaWxpdHkgVHlwZS4mI3hEOyYjeEE7VmFyaWFiaWxpdHkgRWxlbWVudCBvZiB0aGUgbWV0YS1tb2RlbCBwYWNrYWdlIE1ldGhvZCBQbHVnaW5zIGFkZHMgdGhlIGNhcGFiaWxpdGllcyBvZiB2YXJpYXRpb24gYW5kIGV4dGVuc2lvbiB0byBNZXRob2QgRWxlbWVudHMgdGhhdCBkZXJpdmUgZnJvbSBpdC4gIEJ5IGRlZmF1bHQgYWxsIENvbnRlbnQgRWxlbWVudHMgc3VjaCBhcyBSb2xlLCBUYXNrLCBHdWlkYW5jZSBUeXBlcywgb3IgQWN0aXZpdGllcyBhcmUgZGVmaW5lZCB0byBiZSBWYXJpYWJpbGl0eSBFbGVtZW50cy4mI3hEOyYjeEE7VmFyaWFiaWxpdHkgYW5kIGV4dGVuc2lvbiBwcm92aWRlcyB1bmlxdWUgbWVjaGFuaXNtcyBmb3IgY3VzdG9taXppbmcgbWV0aG9kIGNvbnRlbnQgd2l0aG91dCBhY3R1YWxseSBkaXJlY3RseSBtb2RpZnlpbmcgdGhlIG9yaWdpbmFsIGNvbnRlbnQsIGJ1dCBieSBqdXN0IGJlIGFibGUgdG8gZGVzY3JpYmUgd2l0aCBzZXBhcmF0ZSBvYmplY3RzIHRoZSBkaWZmZXJlbmNlcyAoYWRkaXRpb25zLCBjaGFuZ2VzLCBvbWlzc2lvbnMpIHJlbGF0aXZlIHRvIHRoZSBvcmlnaW5hbC4gIFRoaXMgcGx1Zy1pbiBjb25jZXB0IGFsbG93cyB1c2VycyB0byBmYWN0b3IgdGhlaXIgbWV0aG9kIGNvbnRlbnQgYW5kIHByb2Nlc3NlcyBpbiBpbnRlcnJlbGF0ZWQgdW5pdHMgYW5kIGV2ZW4gdG8gYXJjaGl0ZWN0IG1ldGhvZCBjb250ZW50IGFuZCBwcm9jZXNzZXMgaW4gbGF5ZXJzIHRoYXQgZXh0ZW5kIGVhY2ggb3RoZXIgd2l0aCBuZXcgY2FwYWJpbGl0aWVzLiAgVGhlIHJlc3VsdGluZyBtZXRob2QgYW5kIHByb2Nlc3MgZGVzaWduIGNhbiBiZSBkeW5hbWljYWxseSBjb21iaW5lZCBhbmQgYXBwbGllZCBvbiBkZW1hbmQgdXNpbmcgdGhlIGludGVycHJldGF0aW9uIHJ1bGVzIGRlZmluZWQgZm9yIFZhcmlhYmlsaXR5IEVsZW1lbnQgU3BlY2lhbGl6YXRpb25zIGFzc2VtYmxpbmcgdG8gcHJvY2VzcyBwcmFjdGl0aW9uZXJzIHRoZSBtb3N0IGFjY3VyYXRlIG1ldGhvZCBhbmQgcHJvY2VzcyBkZXNjcmlwdGlvbnMgcG9zc2libGUuICBJdCBhbHNvIGFsbG93cyBwcm9jZXNzIHByYWN0aXRpb25lcnMgdG8gZXh0ZW5kcyBhbmQgdGFpbG9yIG1ldGhvZCBjb250ZW50IGFuZCBwcm9jZXNzZXMgdGhleSBkbyBub3Qgb3duIGFuZCB0byBlYXNpbHkgdXBncmFkZSB0byBuZXdlciB2ZXJzaW9ucyBieSBzaW1wbHkgcmVhcHBseSB0aGVpciBwZXJzb25hbCBjaGFuZ2VzIHRvIHRoZXNlIHVwZ3JhZGVzLiYjeEQ7JiN4QTtWYXJpYWJpbGl0eSBFbGVtZW50IGRlZmluZXMgdHdvIHR5cGVzIG9mIHZhcmlhYmlsaXR5IGFuZCBvbmUgdHlwZSBvZiBleHRlbnNpb24gd2hpY2ggYXJlIGZvcm1hbGx5IGRlZmluZWQgZm9yIHRoZSBlbnVtZXJhdGlvbiBWYXJpYWJpbGl0eSBUeXBlLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ2YXJpYWJpbGl0eVR5cGUiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9WYXJpYWJpbGl0eVR5cGUiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9Im5hIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iSWYgaW4gaW5zdGFuY2Ugb2YgdGhlIHZhcmlhYmlsaXR5U3BlY2lhbGl6YXRpb24gYXNzb2NpYXRpb24gYmV0d2VlbiB0d28gVmFyaWFiaWxpdHkgRWxlbWVudHMgb2YgdGhlIHNhbWUgdHlwZSBleGlzdHMsIHRoZW4gdGhlIHZhcmlhYmlsaXR5VHlwZSBhdHRyaWJ1dGUgc3BlY2lmaWVzIGhvdyB0aGUgZWxlbWVudCBhdCB0aGUgdmFyaWFiaWxpdHlTcGVjaWFsRWxlbWVudCBlbmQgb2YgdGhlIGFzc29jaWF0aW9uIGNoYW5nZXMgdGhlIENvbnRlbnQgRWxlbWVudCBhdCB0aGUgdmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCBlbmQuIFNlZSB0aGUgVmFyaWFiaWxpdHkgVHlwZSBlbnVtZXJhdGlvbiBjbGFzcyBmb3IgZGVmaW5pdGlvbnMgZm9yIHRoZSBkaWZmZXJlbnQgdHlwZXMgb2YgdmFyaWFiaWxpdHkuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQiCi0gICAgICAgIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSIjLy9WYXJpYWJpbGl0eUVsZW1lbnQiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVFbnVtIiBuYW1lPSJWYXJpYWJpbGl0eVR5cGUiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlZhcmlhYmlsaXR5IFR5cGUgaXMgYW4gRW51bWVyYXRpb24gdXNlZCBmb3IgdmFsdWVzIGZvciBpbnN0YW5jZXMgb2YgVmFyaWFiaWxpdHkgRWxlbWVudCdzIGF0dHJpYnV0ZSB2YXJpYWJpbGl0eVR5cGUuICBJdCBkZWZpbmVzIHRoZSBuYXR1cmUgb2YgaG93IGEgVmFyaWFiaWxpdHkgRWxlbWVudCBleHRlbmRzIGFub3RoZXIgVmFyaWFiaWxpdHkgRWxlbWVudC4gU2VlIGVudW1lcmF0aW9uIGxpdGVyYWxzIGZvciBkZWZpbml0aW9ucyBmb3IgZWFjaCB0eXBlLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0ibmEiLz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9ImNvbnRyaWJ1dGVzIiB2YWx1ZT0iMSIvPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iZXh0ZW5kcyIgdmFsdWU9IjIiLz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9InJlcGxhY2VzIiB2YWx1ZT0iMyIvPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0ibG9jYWxDb250cmlidXRpb24iIHZhbHVlPSI0Ii8+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJsb2NhbFJlcGxhY2VtZW50IiB2YWx1ZT0iNSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJNZXRob2RVbml0IiBhYnN0cmFjdD0idHJ1ZSIgZVN1cGVyVHlwZXM9IiMvL01ldGhvZEVsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgTWV0aG9kIFVuaXQgaXMgYSBzcGVjaWFsIE1ldGhvZCBFbGVtZW50IHRoYXQgc2hhbGwgYmUgbWFpbnRhaW5lZCBpbiBhIE1ldGhvZCBMaWJyYXJ5IGFzIGEgc2VwYXJhdGUgdW5pdCBvZiBjb250cm9sLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhdXRob3JzIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJFdmVyeSBNZXRob2QgVW5pdCBpcyBiZWluZyBjcmVhdGVkIGFuZCBvd25lZCBieSBhbiBhdXRob3Igb3IgYXV0aG9yaW5nIHRlYW0uIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNoYW5nZURhdGUiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9EYXRlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGRhdGUgdGhlIGxhc3QgY2hhbmdlIHRoYXQgcmVzdWx0ZWQgaW50byB0aGlzIHZlcnNpb24gaGFzIGJlZW4gbWFkZS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY2hhbmdlRGVzY3JpcHRpb24iIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9TdHJpbmciIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgbGFzdCBjaGFuZ2UgdGhhdCByZXN1bHRlZCBpbnRvIHRoaXMgdmVyc2lvbi4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idmVyc2lvbiIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRXZlcnkgUGFja2FnZSBoYXMgYSB2ZXJzaW9uIG51bWJlciB1c2VkIHRvIHRyYWNrIGNoYW5nZXMuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImNvcHlyaWdodFN0YXRlbWVudCIgZVR5cGU9IiMvL1N1cHBvcnRpbmdNYXRlcmlhbCIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJNZXRob2RDb25maWd1cmF0aW9uIiBlU3VwZXJUeXBlcz0iIy8vTWV0aG9kVW5pdCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBNZXRob2QgQ29uZmlndXJhdGlvbiBpcyBhIGNvbGxlY3Rpb24gb2Ygc2VsZWN0ZWQgTWV0aG9kIE1vZGVscyBhbmQgTWV0aG9kUGFja2FnZXMuIEEgY29uZmlndXJhdGlvbiBjYW4gYmUgZXhwb3J0ZWQgaW50byBpdHMgb3duIHN0YW5kYWxvbmUgbGlicmFyeSB3aGVuIGl0IGluY2x1ZGVzIHRoZSBmdWxsIHRyYW5zaXRpdmUgY2xvc3VyZSBvZiBhbGwgZWxlbWVudHMgYWxsIG90aGVyIGVsZW1lbnRzIGRlcGVuZCBvbi4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ibWV0aG9kUGx1Z2luU2VsZWN0aW9uIgotICAgICAgICBvcmRlcmVkPSJmYWxzZSIgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9NZXRob2RQbHVnaW4iLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ibWV0aG9kUGFja2FnZVNlbGVjdGlvbiIKLSAgICAgICAgb3JkZXJlZD0iZmFsc2UiIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vTWV0aG9kUGFja2FnZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJwcm9jZXNzVmlld3MiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0NvbnRlbnRDYXRlZ29yeSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJkZWZhdWx0VmlldyIgZVR5cGU9IiMvL0NvbnRlbnRDYXRlZ29yeSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJiYXNlQ29uZmlndXJhdGlvbnMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL01ldGhvZENvbmZpZ3VyYXRpb24iLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUHJvY2Vzc0ZhbWlseSIgZVN1cGVyVHlwZXM9IiMvL01ldGhvZENvbmZpZ3VyYXRpb24iPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgRGVsaXZlcnkgTW9kZWwgRmFtaWx5IGlzIGEgY29udmVuaWVudCBncm91cGluZyBvZiBEZWxpdmVyeSBQcm9jZXNzZXMgYW5kIENhcGFiaWxpdHkgUGF0dGVybnMgb2YgaW50ZXJlc3QgdG8gc29tZSBzcGVjaWZpYyB1c2VyIGNvbW11bml0eS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZGVsaXZlcnlQcm9jZXNzZXMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0RlbGl2ZXJ5UHJvY2VzcyIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJNZXRob2RMaWJyYXJ5IiBlU3VwZXJUeXBlcz0iIy8vTWV0aG9kVW5pdCAjLy9QYWNrYWdlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIE1ldGhvZCBMaWJyYXJ5IGlzIGEgcGh5c2ljYWwgY29udGFpbmVyIGZvciBNZXRob2QgUGx1Z2lucyBhbmQgTWV0aG9kIENvbmZpZ3VyYXRpb24gZGVmaW5pdGlvbnMuICBBbGwgTWV0aG9kIEVsZW1lbnRzIGFyZSBzdG9yZWQgaW4gYSBNZXRob2QgTGlicmFyeS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ibWV0aG9kUGx1Z2lucyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vTWV0aG9kUGx1Z2luIiBjb250YWlubWVudD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJwcmVkZWZpbmVkQ29uZmlndXJhdGlvbnMiCi0gICAgICAgIG9yZGVyZWQ9ImZhbHNlIiB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL01ldGhvZENvbmZpZ3VyYXRpb24iIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotPC9lY29yZTpFUGFja2FnZT4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvbW9kZWwvMS4wLjMvdW1hLmdlbm1vZGVsIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9tb2RlbC8xLjAuMy91bWEuZ2VubW9kZWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5NzBlNTcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9tb2RlbC8xLjAuMy91bWEuZ2VubW9kZWwKKysrIC9kZXYvbnVsbApAQCAtMSw0OTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxnZW5tb2RlbDpHZW5Nb2RlbCB4bWk6dmVyc2lvbj0iMi4wIgotICAgIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6ZWNvcmU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUiCi0gICAgeG1sbnM6Z2VubW9kZWw9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiIG1vZGVsRGlyZWN0b3J5PSIvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMiCi0gICAgZWRpdERpcmVjdG9yeT0iL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMiIGVkaXRvckRpcmVjdG9yeT0iL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdG9yL3NyYyIKLSAgICBtb2RlbFBsdWdpbklEPSJvcmcuZWNsaXBzZS5lcGYudW1hIiB0ZW1wbGF0ZURpcmVjdG9yeT0iL29yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUvdGVtcGxhdGVzIgotICAgIHJ1bnRpbWVKYXI9InRydWUiIGR5bmFtaWNUZW1wbGF0ZXM9InRydWUiIG1vZGVsTmFtZT0iVW1hIiBlZGl0UGx1Z2luQ2xhc3M9Im9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuVW1hRWRpdFBsdWdpbiIKLSAgICBlZGl0b3JQbHVnaW5DbGFzcz0ib3JnLmVjbGlwc2UuZXBmLnVtYS5wcmVzZW50YXRpb24uVW1hRWRpdG9yUGx1Z2luIiBub25OTFNNYXJrZXJzPSJ0cnVlIgotICAgIHJvb3RFeHRlbmRzSW50ZXJmYWNlPSJvcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLklNb2RlbE9iamVjdCIgcm9vdEV4dGVuZHNDbGFzcz0ib3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS5pbXBsLk11bHRpUmVzb3VyY2VFT2JqZWN0IgotICAgIHJvb3RJbXBsZW1lbnRzSW50ZXJmYWNlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuc2RvLkludGVybmFsRURhdGFPYmplY3QiIHN1cHByZXNzRU1GVHlwZXM9InRydWUiCi0gICAgZmVhdHVyZU1hcFdyYXBwZXJJbnRlcmZhY2U9ImNvbW1vbmouc2RvLlNlcXVlbmNlIiBmZWF0dXJlTWFwV3JhcHBlckludGVybmFsSW50ZXJmYWNlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuc2RvLnV0aWwuRVNlcXVlbmNlIgotICAgIGZlYXR1cmVNYXBXcmFwcGVyQ2xhc3M9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5zZG8udXRpbC5CYXNpY0VTZXF1ZW5jZSIgY29kZUZvcm1hdHRpbmc9InRydWUiCi0gICAgY29udGFpbm1lbnRQcm94aWVzPSJ0cnVlIj4KLSAgPGZvcmVpZ25Nb2RlbD5DOlxIb21lXHBoVE5HXFROR19kb2NzXE9PQURcQ29udGVudEFyY2hpdGVjdHVyZVxNb2RlbHNcVU1BMDNcVW5pZmllZE1ldGhvZEFyY2hpdGVjdHVyZS5tZGw8L2ZvcmVpZ25Nb2RlbD4KLSAgPHN0YXRpY1BhY2thZ2VzPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvU0RPPC9zdGF0aWNQYWNrYWdlcz4KLSAgPG1vZGVsUGx1Z2luVmFyaWFibGVzPkVNRl9DT01NT05KX1NETz1vcmcuZWNsaXBzZS5lbWYuY29tbW9uai5zZG88L21vZGVsUGx1Z2luVmFyaWFibGVzPgotICA8bW9kZWxQbHVnaW5WYXJpYWJsZXM+RU1GX0VDT1JFX1NETz1vcmcuZWNsaXBzZS5lbWYuZWNvcmUuc2RvPC9tb2RlbFBsdWdpblZhcmlhYmxlcz4KLSAgPGdlblBhY2thZ2VzIHByZWZpeD0iVW1hIiBiYXNlUGFja2FnZT0ib3JnLmVjbGlwc2UuZXBmIiBkaXNwb3NhYmxlUHJvdmlkZXJGYWN0b3J5PSJ0cnVlIgotICAgICAgZWNvcmVQYWNrYWdlPSJ1bWEuZWNvcmUjLyI+Ci0gICAgPGdlbkVudW1zIGVjb3JlRW51bT0idW1hLmVjb3JlIy8vV29ya09yZGVyVHlwZSI+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9InVtYS5lY29yZSMvL1dvcmtPcmRlclR5cGUvZmluaXNoVG9TdGFydCIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJ1bWEuZWNvcmUjLy9Xb3JrT3JkZXJUeXBlL2ZpbmlzaFRvRmluaXNoIi8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9InVtYS5lY29yZSMvL1dvcmtPcmRlclR5cGUvc3RhcnRUb1N0YXJ0Ii8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9InVtYS5lY29yZSMvL1dvcmtPcmRlclR5cGUvc3RhcnRUb0ZpbmlzaCIvPgotICAgIDwvZ2VuRW51bXM+Ci0gICAgPGdlbkVudW1zIGVjb3JlRW51bT0idW1hLmVjb3JlIy8vUHNldWRvU3RhdGVLaW5kIj4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0idW1hLmVjb3JlIy8vUHNldWRvU3RhdGVLaW5kL2luaXRpYWwiLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0idW1hLmVjb3JlIy8vUHNldWRvU3RhdGVLaW5kL2pvaW4iLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0idW1hLmVjb3JlIy8vUHNldWRvU3RhdGVLaW5kL2ZvcmsiLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0idW1hLmVjb3JlIy8vUHNldWRvU3RhdGVLaW5kL2p1bmN0aW9uIi8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9InVtYS5lY29yZSMvL1BzZXVkb1N0YXRlS2luZC9jaG9pY2UiLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0idW1hLmVjb3JlIy8vUHNldWRvU3RhdGVLaW5kL2VudHJ5UG9pbnQiLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0idW1hLmVjb3JlIy8vUHNldWRvU3RhdGVLaW5kL2V4aXRQb2ludCIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJ1bWEuZWNvcmUjLy9Qc2V1ZG9TdGF0ZUtpbmQvdGVybWluYXRlIi8+Ci0gICAgPC9nZW5FbnVtcz4KLSAgICA8Z2VuRW51bXMgZWNvcmVFbnVtPSJ1bWEuZWNvcmUjLy9WYXJpYWJpbGl0eVR5cGUiPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJ1bWEuZWNvcmUjLy9WYXJpYWJpbGl0eVR5cGUvbmEiLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0idW1hLmVjb3JlIy8vVmFyaWFiaWxpdHlUeXBlL2NvbnRyaWJ1dGVzIi8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9InVtYS5lY29yZSMvL1ZhcmlhYmlsaXR5VHlwZS9leHRlbmRzIi8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9InVtYS5lY29yZSMvL1ZhcmlhYmlsaXR5VHlwZS9yZXBsYWNlcyIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJ1bWEuZWNvcmUjLy9WYXJpYWJpbGl0eVR5cGUvbG9jYWxDb250cmlidXRpb24iLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0idW1hLmVjb3JlIy8vVmFyaWFiaWxpdHlUeXBlL2xvY2FsUmVwbGFjZW1lbnQiLz4KLSAgICA8L2dlbkVudW1zPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0idW1hLmVjb3JlIy8vRGF0ZSIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0idW1hLmVjb3JlIy8vVXJpIi8+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJ1bWEuZWNvcmUjLy9VbmxpbWl0ZWROYXR1cmFsIi8+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJ1bWEuZWNvcmUjLy9TdHJpbmciLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9InVtYS5lY29yZSMvL1NldCIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0idW1hLmVjb3JlIy8vU2VxdWVuY2UiLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9InVtYS5lY29yZSMvL0ludGVnZXIiLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9InVtYS5lY29yZSMvL0Zsb2F0Ii8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vQ2xhc3NpZmllciIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1R5cGUiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9FbGVtZW50Ii8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vTmFtZWRFbGVtZW50Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9OYW1lZEVsZW1lbnQvbmFtZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9QYWNrYWdlYWJsZUVsZW1lbnQiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9QYWNrYWdlIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vTmFtZXNwYWNlIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vTWV0aG9kRWxlbWVudCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vTWV0aG9kRWxlbWVudC9ndWlkIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vTWV0aG9kRWxlbWVudC9icmllZkRlc2NyaXB0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL01ldGhvZEVsZW1lbnQvb3duZWRSdWxlcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL01ldGhvZEVsZW1lbnQvc3VwcHJlc3NlZCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL01ldGhvZEVsZW1lbnQvb3JkZXJpbmdHdWlkZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Db25zdHJhaW50Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9Db25zdHJhaW50L2JvZHkiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vQ29udGVudEVsZW1lbnQiPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0NvbnRlbnRFbGVtZW50L3N1cHBvcnRpbmdNYXRlcmlhbHMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Db250ZW50RWxlbWVudC9jb25jZXB0c0FuZFBhcGVycyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0NvbnRlbnRFbGVtZW50L2NoZWNrbGlzdHMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Db250ZW50RWxlbWVudC9ndWlkZWxpbmVzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vQ29udGVudEVsZW1lbnQvZXhhbXBsZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Db250ZW50RWxlbWVudC9hc3NldHMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vRGVzY3JpYmFibGVFbGVtZW50Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9EZXNjcmliYWJsZUVsZW1lbnQvcHJlc2VudGF0aW9uTmFtZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9EZXNjcmliYWJsZUVsZW1lbnQvcHJlc2VudGF0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vRGVzY3JpYmFibGVFbGVtZW50L3NoYXBlaWNvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0Rlc2NyaWJhYmxlRWxlbWVudC9ub2RlaWNvbiIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Db250ZW50RGVzY3JpcHRpb24iPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0NvbnRlbnREZXNjcmlwdGlvbi9tYWluRGVzY3JpcHRpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vQ29udGVudERlc2NyaXB0aW9uL3NlY3Rpb25zIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vQ29udGVudERlc2NyaXB0aW9uL2tleUNvbnNpZGVyYXRpb25zIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1NlY3Rpb24iPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1NlY3Rpb24vc2VjdGlvbk5hbWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9TZWN0aW9uL3NlY3Rpb25EZXNjcmlwdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9TZWN0aW9uL3N1YlNlY3Rpb25zIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vU2VjdGlvbi9wcmVkZWNlc3NvciIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Sb2xlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iUmVhZG9ubHkiIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1JvbGUvbW9kaWZpZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Sb2xlL3Jlc3BvbnNpYmxlRm9yIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1dvcmtQcm9kdWN0Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Xb3JrUHJvZHVjdC9yZXBvcnRzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vV29ya1Byb2R1Y3QvdGVtcGxhdGVzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vV29ya1Byb2R1Y3QvdG9vbE1lbnRvcnMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Xb3JrUHJvZHVjdC9lc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vVGFzayI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vVGFzay9wZXJmb3JtZWRCeSIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1Rhc2svbWFuZGF0b3J5SW5wdXQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9UYXNrL291dHB1dCIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1Rhc2svYWRkaXRpb25hbGx5UGVyZm9ybWVkQnkiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9UYXNrL29wdGlvbmFsSW5wdXQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iUmVhZG9ubHkiIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1Rhc2svc3RlcHMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9UYXNrL3Rvb2xNZW50b3JzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vVGFzay9lc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vV29ya0RlZmluaXRpb24iPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Xb3JrRGVmaW5pdGlvbi9wcmVjb25kaXRpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vV29ya0RlZmluaXRpb24vcG9zdGNvbmRpdGlvbiIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9TdGVwIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vR3VpZGFuY2UiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9BcnRpZmFjdCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0FydGlmYWN0L2NvbnRhaW5lckFydGlmYWN0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0FydGlmYWN0L2NvbnRhaW5lZEFydGlmYWN0cyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9EZWxpdmVyYWJsZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vRGVsaXZlcmFibGUvZGVsaXZlcmVkV29ya1Byb2R1Y3RzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL091dGNvbWUiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9NZXRob2RQYWNrYWdlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9NZXRob2RQYWNrYWdlL2dsb2JhbCIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL01ldGhvZFBhY2thZ2UvcmV1c2VkUGFja2FnZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vTWV0aG9kUGFja2FnZS9wYXJlbnRQYWNrYWdlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL01ldGhvZFBhY2thZ2UvY2hpbGRQYWNrYWdlcyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Db250ZW50UGFja2FnZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0NvbnRlbnRQYWNrYWdlL2NvbnRlbnRFbGVtZW50cyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9BcnRpZmFjdERlc2NyaXB0aW9uIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9BcnRpZmFjdERlc2NyaXB0aW9uL2JyaWVmT3V0bGluZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0FydGlmYWN0RGVzY3JpcHRpb24vcmVwcmVzZW50YXRpb25PcHRpb25zIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1dvcmtQcm9kdWN0RGVzY3JpcHRpb24iPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1dvcmtQcm9kdWN0RGVzY3JpcHRpb24vZXh0ZXJuYWxJZCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1dvcmtQcm9kdWN0RGVzY3JpcHRpb24vcHVycG9zZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1dvcmtQcm9kdWN0RGVzY3JpcHRpb24vaW1wYWN0T2ZOb3RIYXZpbmciLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9Xb3JrUHJvZHVjdERlc2NyaXB0aW9uL3JlYXNvbnNGb3JOb3ROZWVkaW5nIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0RlbGl2ZXJhYmxlRGVzY3JpcHRpb24iPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0RlbGl2ZXJhYmxlRGVzY3JpcHRpb24vZXh0ZXJuYWxEZXNjcmlwdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0RlbGl2ZXJhYmxlRGVzY3JpcHRpb24vcGFja2FnaW5nR3VpZGFuY2UiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vUm9sZURlc2NyaXB0aW9uIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9Sb2xlRGVzY3JpcHRpb24vc2tpbGxzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vUm9sZURlc2NyaXB0aW9uL2Fzc2lnbm1lbnRBcHByb2FjaGVzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vUm9sZURlc2NyaXB0aW9uL3N5bm9ueW1zIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1Rhc2tEZXNjcmlwdGlvbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vVGFza0Rlc2NyaXB0aW9uL3B1cnBvc2UiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9UYXNrRGVzY3JpcHRpb24vYWx0ZXJuYXRpdmVzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0d1aWRhbmNlRGVzY3JpcHRpb24iPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0d1aWRhbmNlRGVzY3JpcHRpb24vYXR0YWNobWVudHMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vUHJhY3RpY2VEZXNjcmlwdGlvbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vUHJhY3RpY2VEZXNjcmlwdGlvbi9hZGRpdGlvbmFsSW5mbyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1ByYWN0aWNlRGVzY3JpcHRpb24vcHJvYmxlbSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1ByYWN0aWNlRGVzY3JpcHRpb24vYmFja2dyb3VuZCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1ByYWN0aWNlRGVzY3JpcHRpb24vZ29hbHMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9QcmFjdGljZURlc2NyaXB0aW9uL2FwcGxpY2F0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vUHJhY3RpY2VEZXNjcmlwdGlvbi9sZXZlbHNPZkFkb3B0aW9uIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1BvaW50Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9Qb2ludC94Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vUG9pbnQveSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9HcmFwaEVsZW1lbnQiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9HcmFwaEVsZW1lbnQvcG9zaXRpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vR3JhcGhFbGVtZW50L2NvbnRhaW5lZCIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9HcmFwaEVsZW1lbnQvbGluayIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9HcmFwaEVsZW1lbnQvYW5jaG9yYWdlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0dyYXBoRWxlbWVudC9zZW1hbnRpY01vZGVsIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0RpYWdyYW1FbGVtZW50Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9EaWFncmFtRWxlbWVudC9pc1Zpc2libGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vRGlhZ3JhbUVsZW1lbnQvY29udGFpbmVyIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vRGlhZ3JhbUVsZW1lbnQvcmVmZXJlbmNlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0RpYWdyYW1FbGVtZW50L3Byb3BlcnR5Ii8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0RpYWdyYW1MaW5rIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9EaWFncmFtTGluay96b29tIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0RpYWdyYW1MaW5rL3ZpZXdwb3J0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0RpYWdyYW1MaW5rL2dyYXBoRWxlbWVudCIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0RpYWdyYW1MaW5rL2RpYWdyYW0iLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vR3JhcGhDb25uZWN0b3IiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9HcmFwaENvbm5lY3Rvci9ncmFwaEVsZW1lbnQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9HcmFwaENvbm5lY3Rvci9ncmFwaEVkZ2UiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vU2VtYW50aWNNb2RlbEJyaWRnZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vU2VtYW50aWNNb2RlbEJyaWRnZS9wcmVzZW50YXRpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vU2VtYW50aWNNb2RlbEJyaWRnZS9ncmFwaEVsZW1lbnQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vU2VtYW50aWNNb2RlbEJyaWRnZS9kaWFncmFtIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0RpbWVuc2lvbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vRGltZW5zaW9uL3dpZHRoIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vRGltZW5zaW9uL2hlaWdodCIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9SZWZlcmVuY2UiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1JlZmVyZW5jZS9pc0luZGl2aWR1YWxSZXByZXNlbnRhdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1JlZmVyZW5jZS9yZWZlcmVuY2VkIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1Byb3BlcnR5Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9Qcm9wZXJ0eS9rZXkiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9Qcm9wZXJ0eS92YWx1ZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9HcmFwaEVkZ2UiPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0dyYXBoRWRnZS9hbmNob3IiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vR3JhcGhFZGdlL3dheXBvaW50cyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9EaWFncmFtIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9EaWFncmFtL3pvb20iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vRGlhZ3JhbS92aWV3cG9pbnQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9EaWFncmFtL2RpYWdyYW1MaW5rIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0RpYWdyYW0vbmFtZXNwYWNlIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0dyYXBoTm9kZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0dyYXBoTm9kZS9zaXplIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1NpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9TaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudC90eXBlSW5mbyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9VTUFTZW1hbnRpY01vZGVsQnJpZGdlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9VTUFTZW1hbnRpY01vZGVsQnJpZGdlL2VsZW1lbnQiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vQ29yZVNlbWFudGljTW9kZWxCcmlkZ2UiPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0NvcmVTZW1hbnRpY01vZGVsQnJpZGdlL2VsZW1lbnQiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vTGVhZkVsZW1lbnQiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9UZXh0RWxlbWVudCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vVGV4dEVsZW1lbnQvdGV4dCIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9JbWFnZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vSW1hZ2UvdXJpIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vSW1hZ2UvbWltZVR5cGUiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vR3JhcGhpY1ByaW1pdGl2ZSIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1BvbHlsaW5lIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9Qb2x5bGluZS9jbG9zZWQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vUG9seWxpbmUvd2F5cG9pbnRzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0VsbGlwc2UiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0VsbGlwc2UvcmFkaXVzWCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0VsbGlwc2UvcmFkaXVzWSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0VsbGlwc2Uvcm90YXRpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9FbGxpcHNlL3N0YXJ0QW5nbGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9FbGxpcHNlL2VuZEFuZ2xlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0VsbGlwc2UvY2VudGVyIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0FjdGl2aXR5Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9BY3Rpdml0eS9icmVha2Rvd25FbGVtZW50cyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0FjdGl2aXR5L3JvYWRtYXBzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vQWN0aXZpdHkvc3VwcG9ydGluZ01hdGVyaWFscyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0FjdGl2aXR5L2NoZWNrbGlzdHMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9BY3Rpdml0eS9jb25jZXB0cyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0FjdGl2aXR5L2V4YW1wbGVzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vQWN0aXZpdHkvZ3VpZGVsaW5lcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0FjdGl2aXR5L3JldXNhYmxlQXNzZXRzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vQWN0aXZpdHkvaXNFbmFjdGFibGUiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vV29ya0JyZWFrZG93bkVsZW1lbnQiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1dvcmtCcmVha2Rvd25FbGVtZW50L2lzUmVwZWF0YWJsZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1dvcmtCcmVha2Rvd25FbGVtZW50L2lzT25nb2luZyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1dvcmtCcmVha2Rvd25FbGVtZW50L2lzRXZlbnREcml2ZW4iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Xb3JrQnJlYWtkb3duRWxlbWVudC9saW5rVG9QcmVkZWNlc3NvciIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9CcmVha2Rvd25FbGVtZW50Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9CcmVha2Rvd25FbGVtZW50L3ByZWZpeCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0JyZWFrZG93bkVsZW1lbnQvaXNQbGFubmVkIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vQnJlYWtkb3duRWxlbWVudC9oYXNNdWx0aXBsZU9jY3VycmVuY2VzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vQnJlYWtkb3duRWxlbWVudC9pc09wdGlvbmFsIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vQnJlYWtkb3duRWxlbWVudC9wcmVzZW50ZWRBZnRlciIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0JyZWFrZG93bkVsZW1lbnQvcHJlc2VudGVkQmVmb3JlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0JyZWFrZG93bkVsZW1lbnQvcGxhbm5pbmdEYXRhIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vQnJlYWtkb3duRWxlbWVudC9zdXBlckFjdGl2aXRpZXMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vTWlsZXN0b25lIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vSXRlcmF0aW9uIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vUGhhc2UiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9UZWFtUHJvZmlsZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vVGVhbVByb2ZpbGUvdGVhbVJvbGVzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vVGVhbVByb2ZpbGUvc3VwZXJUZWFtIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vVGVhbVByb2ZpbGUvc3ViVGVhbSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Sb2xlRGVzY3JpcHRvciI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vUm9sZURlc2NyaXB0b3IvUm9sZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJSZWFkb25seSIgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vUm9sZURlc2NyaXB0b3IvbW9kaWZpZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Sb2xlRGVzY3JpcHRvci9yZXNwb25zaWJsZUZvciIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Xb3JrT3JkZXIiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1dvcmtPcmRlci9saW5rVHlwZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1dvcmtPcmRlci9wcmVkIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1Byb2Nlc3NFbGVtZW50Ii8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vUGxhbm5pbmdEYXRhIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9QbGFubmluZ0RhdGEvc3RhcnREYXRlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vUGxhbm5pbmdEYXRhL2ZpbmlzaERhdGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9QbGFubmluZ0RhdGEvcmFuayIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9EZXNjcmlwdG9yIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9EZXNjcmlwdG9yL2lzU3luY2hyb25pemVkV2l0aFNvdXJjZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Xb3JrUHJvZHVjdERlc2NyaXB0b3IiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1dvcmtQcm9kdWN0RGVzY3JpcHRvci9hY3Rpdml0eUVudHJ5U3RhdGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9Xb3JrUHJvZHVjdERlc2NyaXB0b3IvYWN0aXZpdHlFeGl0U3RhdGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Xb3JrUHJvZHVjdERlc2NyaXB0b3IvV29ya1Byb2R1Y3QiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Xb3JrUHJvZHVjdERlc2NyaXB0b3IvaW1wYWN0ZWRCeSIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1dvcmtQcm9kdWN0RGVzY3JpcHRvci9pbXBhY3RzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vV29ya1Byb2R1Y3REZXNjcmlwdG9yL2RlbGl2ZXJhYmxlUGFydHMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vVGFza0Rlc2NyaXB0b3IiPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1Rhc2tEZXNjcmlwdG9yL1Rhc2siLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9UYXNrRGVzY3JpcHRvci9hZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1Rhc2tEZXNjcmlwdG9yL2Fzc2lzdGVkQnkiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9UYXNrRGVzY3JpcHRvci9leHRlcm5hbElucHV0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vVGFza0Rlc2NyaXB0b3IvbWFuZGF0b3J5SW5wdXQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9UYXNrRGVzY3JpcHRvci9vcHRpb25hbElucHV0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vVGFza0Rlc2NyaXB0b3Ivb3V0cHV0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vVGFza0Rlc2NyaXB0b3IvcGVyZm9ybWVkUHJpbWFyaWx5QnkiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9UYXNrRGVzY3JpcHRvci9zZWxlY3RlZFN0ZXBzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0NvbXBvc2l0ZVJvbGUiPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0NvbXBvc2l0ZVJvbGUvYWdncmVnYXRlZFJvbGVzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0JyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uL3VzYWdlR3VpZGFuY2UiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vQWN0aXZpdHlEZXNjcmlwdGlvbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vQWN0aXZpdHlEZXNjcmlwdGlvbi9wdXJwb3NlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vQWN0aXZpdHlEZXNjcmlwdGlvbi9hbHRlcm5hdGl2ZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9BY3Rpdml0eURlc2NyaXB0aW9uL2hvd3RvU3RhZmYiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24iPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uL3NjYWxlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24vcHJvamVjdENoYXJhY3RlcmlzdGljcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uL3Jpc2tMZXZlbCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uL2VzdGltYXRpbmdUZWNobmlxdWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbi9wcm9qZWN0TWVtYmVyRXhwZXJ0aXNlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24vdHlwZU9mQ29udHJhY3QiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vUHJvY2Vzc0Rlc2NyaXB0aW9uIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9Qcm9jZXNzRGVzY3JpcHRpb24vZXh0ZXJuYWxJZCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1Byb2Nlc3NEZXNjcmlwdGlvbi9zY29wZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1Byb2Nlc3NEZXNjcmlwdGlvbi91c2FnZU5vdGVzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0Rlc2NyaXB0b3JEZXNjcmlwdGlvbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vRGVzY3JpcHRvckRlc2NyaXB0aW9uL3JlZmluZWREZXNjcmlwdGlvbiIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Db25jZXB0Ii8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vQ2hlY2tsaXN0Ii8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vRXhhbXBsZSIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0d1aWRlbGluZSIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1JlcG9ydCIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1RlbXBsYXRlIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vU3VwcG9ydGluZ01hdGVyaWFsIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vVG9vbE1lbnRvciIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1doaXRlcGFwZXIiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9UZXJtRGVmaW5pdGlvbiIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1ByYWN0aWNlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vUHJhY3RpY2Uvc3ViUHJhY3RpY2VzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vUHJhY3RpY2UvY29udGVudFJlZmVyZW5jZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9QcmFjdGljZS9hY3Rpdml0eVJlZmVyZW5jZXMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vUmV1c2FibGVBc3NldCIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1N0YXRlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9TdGF0ZS9Xb3JrUHJvZHVjdCIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9TdGF0ZS9SZWdpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9TdGF0ZS9zdWJtYWNoaW5lIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1ZlcnRleCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1ZlcnRleC9jb250YWluZXIiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9WZXJ0ZXgvb3V0Z29pbmciLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9WZXJ0ZXgvaW5jb21pbmciLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vUmVnaW9uIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vUmVnaW9uL1ZlcnRleCIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9SZWdpb24vVHJhbnNpdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9SZWdpb24vU3RhdGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vUmVnaW9uL1N0YXRlTWFjaGluZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9TdGF0ZU1hY2hpbmUiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9TdGF0ZU1hY2hpbmUvUmVnaW9uIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1RyYW5zaXRpb24iPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1RyYW5zaXRpb24vV29ya0RlZmluaXRpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vVHJhbnNpdGlvbi9jb250YWluZXIiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9UcmFuc2l0aW9uL3NvdXJjZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1RyYW5zaXRpb24vdGFyZ2V0Ii8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1BzZXVkb1N0YXRlIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vRGlzY2lwbGluZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vRGlzY2lwbGluZS90YXNrcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9EaXNjaXBsaW5lL3N1YmRpc2NpcGxpbmUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9EaXNjaXBsaW5lL3JlZmVyZW5jZVdvcmtmbG93cyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Db250ZW50Q2F0ZWdvcnkiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Sb2xlU2V0Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Sb2xlU2V0L3JvbGVzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0RvbWFpbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vRG9tYWluL3dvcmtQcm9kdWN0cyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Eb21haW4vc3ViZG9tYWlucyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Xb3JrUHJvZHVjdFR5cGUiPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1dvcmtQcm9kdWN0VHlwZS93b3JrUHJvZHVjdHMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vRGlzY2lwbGluZUdyb3VwaW5nIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9EaXNjaXBsaW5lR3JvdXBpbmcvZGlzY2lwbGluZXMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vVG9vbCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vVG9vbC90b29sTWVudG9ycyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Sb2xlU2V0R3JvdXBpbmciPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1JvbGVTZXRHcm91cGluZy9yb2xlU2V0cyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9DdXN0b21DYXRlZ29yeSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vQ3VzdG9tQ2F0ZWdvcnkvY2F0ZWdvcml6ZWRFbGVtZW50cyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0N1c3RvbUNhdGVnb3J5L3N1YkNhdGVnb3JpZXMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vRGVsaXZlcnlQcm9jZXNzIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9EZWxpdmVyeVByb2Nlc3MvZWR1Y2F0aW9uTWF0ZXJpYWxzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vRGVsaXZlcnlQcm9jZXNzL2NvbW11bmljYXRpb25zTWF0ZXJpYWxzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1Byb2Nlc3MiPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1Byb2Nlc3MvaW5jbHVkZXNQYXR0ZXJucyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1Byb2Nlc3MvZGVmYXVsdENvbnRleHQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Qcm9jZXNzL3ZhbGlkQ29udGV4dCIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9DYXBhYmlsaXR5UGF0dGVybiIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1Byb2Nlc3NQbGFubmluZ1RlbXBsYXRlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Qcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZS9iYXNlZE9uUHJvY2Vzc2VzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1JvYWRtYXAiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Qcm9jZXNzQ29tcG9uZW50Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Qcm9jZXNzQ29tcG9uZW50L2ludGVyZmFjZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vUHJvY2Vzc0NvbXBvbmVudC9wcm9jZXNzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1Byb2Nlc3NQYWNrYWdlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vUHJvY2Vzc1BhY2thZ2UvcHJvY2Vzc0VsZW1lbnRzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1Byb2Nlc3NQYWNrYWdlL2RpYWdyYW1zIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1Byb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlL2ludGVyZmFjZVNwZWNpZmljYXRpb25zIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1Byb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UvaW50ZXJmYWNlSU8iLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vUHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3IiPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1Byb2Nlc3NDb21wb25lbnREZXNjcmlwdG9yL1Byb2Nlc3NDb21wb25lbnQiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vTWV0aG9kUGx1Z2luIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9NZXRob2RQbHVnaW4vdXNlckNoYW5nZWFibGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vTWV0aG9kUGx1Z2luL21ldGhvZFBhY2thZ2VzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vTWV0aG9kUGx1Z2luL2Jhc2VzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1ZhcmlhYmlsaXR5RWxlbWVudCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vVmFyaWFiaWxpdHlFbGVtZW50L3ZhcmlhYmlsaXR5VHlwZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1ZhcmlhYmlsaXR5RWxlbWVudC92YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50Ii8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL01ldGhvZFVuaXQiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL01ldGhvZFVuaXQvYXV0aG9ycyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL01ldGhvZFVuaXQvY2hhbmdlRGF0ZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL01ldGhvZFVuaXQvY2hhbmdlRGVzY3JpcHRpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9NZXRob2RVbml0L3ZlcnNpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9NZXRob2RVbml0L2NvcHlyaWdodFN0YXRlbWVudCIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9NZXRob2RDb25maWd1cmF0aW9uIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9NZXRob2RDb25maWd1cmF0aW9uL21ldGhvZFBsdWdpblNlbGVjdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL01ldGhvZENvbmZpZ3VyYXRpb24vbWV0aG9kUGFja2FnZVNlbGVjdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL01ldGhvZENvbmZpZ3VyYXRpb24vcHJvY2Vzc1ZpZXdzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vTWV0aG9kQ29uZmlndXJhdGlvbi9kZWZhdWx0VmlldyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL01ldGhvZENvbmZpZ3VyYXRpb24vYmFzZUNvbmZpZ3VyYXRpb25zIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1Byb2Nlc3NGYW1pbHkiPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1Byb2Nlc3NGYW1pbHkvZGVsaXZlcnlQcm9jZXNzZXMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vTWV0aG9kTGlicmFyeSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL01ldGhvZExpYnJhcnkvbWV0aG9kUGx1Z2lucyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9NZXRob2RMaWJyYXJ5L3ByZWRlZmluZWRDb25maWd1cmF0aW9ucyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgPC9nZW5QYWNrYWdlcz4KLTwvZ2VubW9kZWw6R2VuTW9kZWw+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL21vZGVsLzEuMC40L1VuaWZpZWRNZXRob2RBcmNoaXRlY3R1cmUuZW14IGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9tb2RlbC8xLjAuNC9VbmlmaWVkTWV0aG9kQXJjaGl0ZWN0dXJlLmVteApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODg2ZTRkMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL21vZGVsLzEuMC40L1VuaWZpZWRNZXRob2RBcmNoaXRlY3R1cmUuZW14CisrKyAvZGV2L251bGwKQEAgLTEsMjcyMTYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS14dG9vbHMyX3VuaXZlcnNhbF90eXBlX21hbmFnZXItLT4KLTw/Y29tLmlibS54dG9vbHMuZW1mLmNvcmUuc2lnbmF0dXJlIDxzaWduYXR1cmUgaWQ9ImNvbS5pYm0ueHRvb2xzLm1taS51aS5zaWduYXR1cmVzLmRpYWdyYW0iIHZlcnNpb249IjcuMC4wIj48ZmVhdHVyZSBkZXNjcmlwdGlvbj0iIiBuYW1lPSJSYXRpb25hbCBNb2RlbGluZyBQbGF0Zm9ybSAoY29tLmlibS54dG9vbHMucm1wKSIgdXJsPSIiIHZlcnNpb249IjcuMC4wIi8+PC9zaWduYXR1cmU+Pz4KLTw/Y29tLmlibS54dG9vbHMuZW1mLmNvcmUuc2lnbmF0dXJlIDxzaWduYXR1cmUgaWQ9ImNvbS5pYm0ueHRvb2xzLnVtbC5tc2wubW9kZWwiIHZlcnNpb249IjcuMC4wIj48ZmVhdHVyZSBkZXNjcmlwdGlvbj0iIiBuYW1lPSJjb20uaWJtLnh0b29scy5ydW1sLmZlYXR1cmUiIHVybD0iIiB2ZXJzaW9uPSI3LjAuMCIvPjwvc2lnbmF0dXJlPj8+Ci08eG1pOlhNSSB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhtbG5zOkRlZmF1bHQ9Imh0dHA6Ly8vc2NoZW1hcy9EZWZhdWx0LzEiIHhtbG5zOkVjb3JlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3VtbDIvc2NoZW1hcy9FY29yZS8zIiB4bWxuczplY29yZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSIgeG1sbnM6bm90YXRpb249Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZ21mL3J1bnRpbWUvMS4wLjAvbm90YXRpb24iIHhtbG5zOnVtbD0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy91bWwyLzIuMC4wL1VNTCIgeG1sbnM6dW1sbm90YXRpb249Imh0dHA6Ly93d3cuaWJtLmNvbS94dG9vbHMvMS41LjIvVW1sbm90YXRpb24iIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovLy9zY2hlbWFzL0RlZmF1bHQvMSBwYXRobWFwOi8vVU1MMl9NU0xfUFJPRklMRVMvRGVmYXVsdC5lcHgjX0lOOGs4TW1CRWRxQmNOMVI2RXZXVXc/RGVmYXVsdC9EZWZhdWx0PyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3VtbDIvc2NoZW1hcy9FY29yZS8zIHBhdGhtYXA6Ly9VTUxfUFJPRklMRVMvRWNvcmUucHJvZmlsZS51bWwjX3Z5LUhVWWluRWRxdHZibmZCMkxfNXciPgotICA8dW1sOk1vZGVsIHhtaTppZD0iM0FEQzdCNzQwMjJEIiBuYW1lPSJVbmlmaWVkTWV0aG9kQXJjaGl0ZWN0dXJlIj4KLSAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iX0JUTnFBT3hoRWR1SGplM3BQYWhONEEiIHNvdXJjZT0idW1sMi5kaWFncmFtcyIvPgotICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfUDRvc1lPb2VFZHVWQTd2dDVxYklKUSIgYW5ub3RhdGVkRWxlbWVudD0iM0FEQzdCNzQwMjJEIj4KLSAgICAgIDxib2R5Pk9wZW4gSXNzdWUgYW5kIFRvRG9zOiYjeEQ7Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tJiN4RDsKLS0gSXNzdWU6IFVNTCAyLjAgbmFtaW5nIGNvbnZlbnRpb25zIGRvZXMgbm90IGFsbG93IHBsdXJhbCByb2xlIG5hbWVzJiN4RDsKLS0gc3luYyB1cCBuYW1lcyB0byBVSSBuYW1lczsgZS5nLiBQYWNrYWdpbmcgSW5zdHJ1Y3Rpb25zJiN4RDsKLS0gbWFrZSBBY3Rpdml0eSB0byBCcmVha2Rvd24gRWxlbWVudCBhZ2dyZWdhdGlvbiBhIGNvbXBvc2l0aW9uJiN4RDsKLS0gQWRkIEluZGV4LCBMaXRlcmF0dXJlIFJlZmVyZW5jZXMgdG8gbWV0YS1tb2RlbCYjeEQ7Ci0mI3hEOwotVmVyc2lvbiAyLjAgY2hhbmdlczomI3hEOwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0mI3hEOwotLSBub3Qgc3RhcnRlZCwgeWV0JiN4RDsKLSYjeEQ7Ci1WZXJzaW9uIDEuMC40IGNoYW5nZXM6JiN4RDsKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0mI3hEOwotLSBNb3ZlZCBleHRlcm5hbElkIHVwIGZyb20gV29yayBQcm9kdWN0IGFuZCBQcm9jZXNzIGRlc2NyaXB0aW9uICYjeEQ7Ci0gIHRvIHRoZSBnZW5lcmFsIGNvbnRlbnQgZGVzY3JpcHRpb24mI3hEOwotLSBBZGRlZCBhc3NvY2lhdGlvbiBiZXR3ZWVuIGNvbnRlbnQgZWxlbWVudCBhbmQgdGVybSBkZWZpbml0aW9uIHRvIGFsbG93IGFzc2lnbmluZyYjeEQ7Ci0gIGdsb3NzYXkgdGVybXMgYXMgZ3VpZGFuY2UmI3hEOwotLSBBZGRlZCB0d28gbmV3IGF0dHJpYnV0ZXMgZm9yIEFydGlmYWN0IERlc2NyaXB0aW9uOiAmI3hEOwotICByZXByZXNlbnRhdGlvbiBhbmQgbm90YXRpb24mI3hEOwotLSBBZGRlZCBhZGRpdGlvbmFsIHJlbGF0aW9uc2hpcHMgYmV0d2VlbiBDb25maWd1cmF0aW9uIGFuZCBDYXRlZ29yaWVzIHRvICYjeEQ7Ci0gIG1vZGVsIGNvbmZpZ3VyYXRpb24gc3BlY2lmaWNhdGlvbnMgd2l0aCBjYXRlZ29yaWVzIGFuZCBuZWdhdGl2ZSBzZXRzJiN4RDsKLS0gTWFkZSBEb21haW4gdG8gV29yayBQcm9kdWN0IGFzc29jaWF0aW9uIG1hbnktdG8tbWFueSYjeEQ7Ci0tIE1hZGUgTWV0aG9kIFBhY2thZ2UgbmVzdGluZyBhc3NvY2lhdGlvbiB1bmlkaXJlY3Rpb25hbCYjeEQ7Ci0tIEFkZGVkIE1ldGhvZEVsZW1lbnRQcm9wZXJ0eSBmb3IgZGVmaW5pbmcgYXBwbGljYXRpb24gc3BlY2lmaWMgYXR0cmlidXRlcyAmI3hEOwotICBzdWNoIGFzIHB1YmxpY2F0aW9uIGZsYWdzIGFuZCBmbGFnZ2luZyB1c2VyIHBsdWctaW5zJiN4RDsKLS0gQ2hhbmdlZCAxLi4qIG11bHRpcGxpY2l0aWVzIGZvciBzdGFuZGFyZCBjYXRlZ29yaWVzIHRvIComI3hEOwotJiN4RDsKLVZlcnNpb24gMS4wLjMgY2hhbmdlczomI3hEOwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSYjeEQ7Ci0wNy8yNi8wNiYjeEQ7Ci0tIENvcnJlY3RlZCBkZWZhdWx0IHZhbHVlIG9mIE1ldGhvZFBsdWdpbjo6VXNlckNoYW5nZWFibGUgdG8gdHJ1ZSYjeEQ7Ci0wNy8wNi8wNiYjeEQ7Ci0tIFJlbW92ZWQgRXN0aW1hdGUgICBhbmQgRXN0aW1hdGlvbiBNZXRyaWMgR3VpZGFuY2UgZWxlbWVudHM7ICYjeEQ7Ci0gIG9ubHkga2VwdCBFc3RpbWF0aW9uIENvbnNpZGVyYXRpb24mI3hEOwotMDYvMjAvMDYmI3hEOwotLSBDaGFuZ2VkIG11bHRpcGxpY2l0eSBmcm9tIGRpc2NpcGxpbmUgdG8gYWN0aXZpdHkgdG8gbWFueSB0byBtYW55JiN4RDsKLTA2LzE1LzA2JiN4RDsKLS0gQ2hhbmdlZCBtdWx0aXBsaWNpdHkgb2Ygcm9sZSBkZXNjcmlwdG9yIHRvIHdvcmsgcHJvZHVjdHMgZGVzY3JpcHRvciB0byAmI3hEOwotICBtYW55IHRvIG1hbnkmI3hEOwotMDYvMTMvMDYmI3hEOwotLSBBZGRlZCBkaXJlY3Rpb25zIHRvIGRlc2NyaXB0b3IgYXNzb2NpYXRpb25zIHRvIGF2b2lkIHRoYXQgZGVzY3JpcHRvcnMmI3hEOwotICBhZGRlZCB0byBhbiBhY3Rpdml0eSB2aWEgbG9jYWwgY29udHJpYnV0aW9uIG1vZGlmeSBpbmhlcml0ZWQgZGVzY3JpcHRvcnMmI3hEOwotMDUvMDEvMjAwNiYjeEQ7Ci0tIE1vdmVkIFVNTDIgRGlhZ3JhbSBJbnRlcmNoYW5nZSB0byB0b3AtbGV2ZWwgcGFja2FnZSYjeEQ7Ci0tIENoYW5nZWQgbXVsdGlwbGljaXR5IG9mIGJyZWFrZG93biBlbGVtZW50cyB0byBhY3Rpdml0aWVzIHRvIDEmI3hEOwotLSBNYWRlIE1ldGhvZCBDb25maWd1cmF0aW9uIGEgTWV0aG9kIFVuaXQmI3hEOwotLSBDaGFuZ2VkIG11bHRpcGxpY2l0eSBmb3IgVGFzayB0byBEaXNjaXBsaW5lOiBhIFRhc2sgY2FuIG5vdyBiZSBjYXRlZ29yaXplZCYjeEQ7Ci0gIGJ5IG1vcmUgdGhhbiBvbmUgRGlzY2lwbGluZSB0byBhbGxvdyBtb2RlbGluZyByZXBsYWNpbmcgZGlzY2lwbGluZXMmI3hEOwotLSBDaGFuZ2VkIG11bHRpcGxpY2l0eSBmb3IgUm9sZSB0byBXUDogYSBXUCBjYW4gaGF2ZSBtb3JlIHRoYW4gb25lICYjeEQ7Ci0gIHJlc3BvbnNpYmxlIFJvbGUgdG8gYWxsb3cgbW9kZWxpbmcgcmVwbGFjaW5nIHJvbGVzJiN4RDsKLS0gTmVzdGluZyBvZiBkaXNjaXBsaW5lcyYjeEQ7Ci0tIFJlbW92ZWQgJnF1b3Q7d29ya2VkT25CeSZxdW90OyBkZXJyaXZlZCBwcm9wZXJ0eSBmb3IgUm9sZURlc2NyaXB0b3IgdG8gV1A7JiN4RDsKLSAgbW9kaWZpZXMgcHJvcGVydHkgaXMgc3VmZmljaWVudCYjeEQ7Ci0tIGFkZGVkIHR3byBtb3JlIHZhcmlhYmlsaXR5IHR5cGVzIHVzZWQgYnkgYWN0aXZpdGllczogbG9jYWxDb250cmlidXRpb24mI3hEOwotICBhbmQgbG9jYWxSZXBsYWNlbWVudDsgdGhpcyBjaGFuZ2UgaXMgb25seSB0ZW1wb3JhcmlseSB0byBtaW5pbWl6ZSBtaWdyYXRpb25zJiN4RDsKLSAgaXNzdWVzOiBpbiB0aGUgZnV0dXJlIHRoZXNlIG5lZWQgdG8gYmUgbW9kZWxlZCBhcyBpbiBTUEVNMiBhcyBhIHNlcGVyYXRlICYjeEQ7Ci0gIEFjdGl2aXR5VXNlIGNsYXNzIGFuZCBBY3Rpdml0eVVzZVR5cGUgZW51bWVyYXRpb24mI3hEOwotLSBDcmVhdGVkIEFjdGl2aXR5IHNwZWNpYWxpemF0aW9uIHRoYXQgYWRkcyBpc0VuYWN0YWJsZT1mYWxzZSBhdHRyaWJ1dGUgaW4mI3hEOwotICB0aGUgcGFja2FnZSBQcm9jZXNzIC0tPiBXb3JrZmxvdyBwYWNrYWdlJiN4RDsKLS0gQWRkZWQgZGlyZWN0IGFzc29jaWF0aW9ucyBmcm9tIFdQIGFuZCBUYXNrIHRvIEVzdGltYXRpb25Db25zaWRlcmF0aW9ucyYjeEQ7Ci0gIHVudGlsIEVzdGltYXRlIGlzIHVzZWQ7IGFsbG93cyBsaW5raW5nIG9mIGNvbnNpZGVyYXRvbnMgdG8gdGhlc2UgZWxlbWVudHMmI3hEOwotLSBSZW1vdmVkIFByb2Nlc3MgQ29udHJpYnV0aW9uIGFzIGl0IGlzIHJlZHVuZGFudCB3aXRoIGNyZWF0aW5nIGV4dGVuZHMgJiN4RDsKLSAgYmV0d2VlbiBQcm9jZXNzZXMgZGlyZWN0bHk8L2JvZHk+Ci0gICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgPHBhY2thZ2VJbXBvcnQgeG1pOmlkPSJfR2kzZHhlZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICA8aW1wb3J0ZWRQYWNrYWdlIHhtaTp0eXBlPSJ1bWw6TW9kZWwiIGhyZWY9InBhdGhtYXA6Ly9VTUxfTElCUkFSSUVTL1VNTFByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sI18wIi8+Ci0gICAgPC9wYWNrYWdlSW1wb3J0PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpQYWNrYWdlIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTUxRjY2QjAxNTUiIG5hbWU9IlVNTDJEaWFncmFtSW50ZXJjaGFuZ2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il9HejJnSHVmWEVkdXFIb09KYlVSWlJ3IiBzb3VyY2U9InVtbDIuZGlhZ3JhbXMiIHJlZmVyZW5jZXM9Il8zQURDN0I3NDAyMkQ0MTUxRjcxRTAzRTciPgotICAgICAgICA8Y29udGVudHMgeG1pOnR5cGU9Im5vdGF0aW9uOkRpYWdyYW0iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxNTFGNzFFMDNFNyIgdHlwZT0iQ2xhc3MiIG5hbWU9IkRpYWdyYW1zIj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5WWEVPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTMwQTM3MDExQiI+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5WWEUtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9ITlZYRk9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMzAxNCIgaGVpZ2h0PSIxMTUxIi8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOVlhGZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITlZYRnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5WWEYtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5WWEdPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE5WWEdlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITlZYR3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE5WWEctZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITlZYSE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE5WWEhlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITlZYSHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hOVlhILWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9ITlZYRWVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSE5WWEV1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTc3OTYiIHk9Ijk4MzgiLz4KLSAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITlZYSU9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE1MUY3NEQwMDkxIj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITlZYSS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hOVlhKT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5WWEplZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOVlhKdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITlZYSi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITlZYS09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE5WWEtlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITlZYS3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE5WWEstZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITlZYTE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE5WWExlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITlZYTHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hOVlhMLWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9ITlZYSWVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSE5WWEl1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTM2NjUiIHk9IjEyODY5Ii8+Ci0gICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5WWE1PZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTMwOTBFMDBCMCI+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5WWE0tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9ITlZYTk9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iNjIzMSIgaGVpZ2h0PSIxMTUxIi8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOVlhOZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITlZYTnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5WWE4tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5WWE9PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE5WWE9lZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITlZYT3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE5WWE8tZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITlZYUE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE5WWFBlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITlZYUHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hOVlhQLWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9ITlZYTWVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iTm9uZSIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSE5WWE11ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMjIzMzUiIHk9IjMxMzIiLz4KLSAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITlZYUU9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE1MzA5ODIwM0JBIj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITlZYUS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hOVlhST2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIyNTU2IiBoZWlnaHQ9IjE1NzQiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5WWFJlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOVlhSdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITlZYUi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITlZYU09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITlZYU2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOVlhTdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITlZYUy1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOVlhUT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITlZYVGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOVlhUdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE5WWFQtZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hOVlhRZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJOb25lIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ITlZYUXVmWEVkdXFIb09KYlVSWlJ3IiB4PSI2NzQ3IiB5PSI0NjQ4Ii8+Ci0gICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5WWFVPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTMwQTEyMDI0NSI+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5WWFUtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9ITlZYVk9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMjIwMSIgaGVpZ2h0PSIxMDY2Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOVlhWZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITlZYVnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5WWFYtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5WWFdPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE5WWFdlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITlZYV3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE5WWFctZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITlZYWE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE5WWFhlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITlZYWHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hOVlhYLWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9ITlZYVWVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSE5WWFV1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTI2NjYiIHk9IjEwMjg3Ii8+Ci0gICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5WWGctZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTIxN0MxMDNCRSI+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5WWGh1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9ITlZYaC1mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iNDM2OCIgaGVpZ2h0PSIxMTY4Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOVlhpT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITmZJRU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5mSUVlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5mSUV1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE5mSUUtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITmZJRk9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE5mSUZlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITmZJRnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE5mSUYtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITmZJR09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hOZklHZWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9ITlZYaE9mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iTm9uZSIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSE5WWGhlZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTIxNDEiIHk9IjI5NzEiLz4KLSAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITmZJWU9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE1MzA5RkQwMTdDIj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITmZJWS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hOZklaT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIyOTEyIiBoZWlnaHQ9IjEwNjYiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5mSVplZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOZkladWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITmZJWi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITmZJYU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITmZJYWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOZklhdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITmZJYS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOZkliT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITmZJYmVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOZklidWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE5mSWItZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hOZklZZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ITmZJWXVmWEVkdXFIb09KYlVSWlJ3IiB4PSI0Mzg1IiB5PSIxMDIzNiIvPgotICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOZklrLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTUxRjdGQTAyOTUiPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOZklsdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSE5mSWwtZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjI3NjAiIGhlaWdodD0iMTE1MSIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITmZJbU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5mSW1lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOZkltdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOZkltLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hOZkluT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5mSW5lZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hOZkludWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5mSW4tZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hOZklvT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5mSW9lZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITmZJb3VmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSE5mSWxPZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9Ik5vbmUiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hOZklsZWZYRWR1cUhvT0piVVJaUnciIHg9IjEzMTQ4IiB5PSI2OTQyIi8+Ci0gICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5vU0wtZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTMwQTI2MDJGOCI+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5vU011ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9ITm9TTS1mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMjg3OCIgaGVpZ2h0PSIxNTc0Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOb1NOT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITm9TTmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5vU051ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5vU04tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE5vU09PZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITm9TT2VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE5vU091ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITm9TTy1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE5vU1BPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITm9TUGVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hOb1NQdWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9ITm9TTU9mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iTm9uZSIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSE5vU01lZlhFZHVxSG9PSmJVUlpSdyIgeD0iMjIyMzMiIHk9IjY2ODAiLz4KLSAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITm9TWXVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE1MzE2NkEwMjAyIj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITm9TWmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hOb1NadWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIzODQzIiBoZWlnaHQ9IjExNTEiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5vU1otZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOb1NhT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITm9TYWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITm9TYXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITm9TYS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOb1NiT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITm9TYmVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOb1NidWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITm9TYi1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOb1NjT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE5vU2NlZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hOb1NZLWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJOb25lIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ITm9TWk9mWEVkdXFIb09KYlVSWlJ3IiB4PSIxMTEzMyIgeT0iMTU0MjYiLz4KLSAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITm9TbGVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE1MzBFMzQwMTU2Ij4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITm9TbU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hOb1NtZWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIzMDgxIiBoZWlnaHQ9IjE1NzQiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5vU211ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOb1NtLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITm9Tbk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITm9TbmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITm9TbnVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOb1NuLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITm9Tb09mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOb1NvZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITm9Tb3VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOb1NvLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE5vU3BPZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hOb1NsdWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJOb25lIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ITm9TbC1mWEVkdXFIb09KYlVSWlJ3IiB4PSIxNzc2MyIgeT0iMTI0MjAiLz4KLSAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITnlETS1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE1MzFENjQwMzQxIj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITnlETnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hOeUROLWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSI1MjE1IiBoZWlnaHQ9IjExNTEiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE55RE9PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOeURPZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITnlET3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITnlETy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITnlEUE9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOeURQZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITnlEUHVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOeURQLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITnlEUU9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOeURRZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE55RFF1ZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hOeUROT2ZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJOb25lIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ITnlETmVmWEVkdXFIb09KYlVSWlJ3IiB4PSIzNTM5IiB5PSIxNzg2NCIvPgotICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOeURUT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyODAiPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOeURULWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSE55RFVPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjI4NDQiIGhlaWdodD0iMTA2NiIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITnlEVWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE55RFV1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOeURVLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOeURWT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITnlEVmVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOeURWdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITnlEVi1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOeURXT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITnlEV2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOeURXdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE55RFctZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hOeURUZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjEyNjMyMjU2IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSE55RFR1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTc2MjciIHk9IjIwODAyIi8+Ci0gICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE55RFhPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTMxRDcxMDAwQiI+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE55RFgtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9ITnlEWU9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iNDUyMSIgaGVpZ2h0PSIxMDY2Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOeURZZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITnlEWXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE55RFktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE55RFpPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE55RFplZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITnlEWnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE55RFotZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITnlEYU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE55RGFlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITnlEYXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hOeURhLWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9ITnlEWGVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSE55RFh1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTY3ODkiIHk9IjE4MTEwIi8+Ci0gICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE55RG1PZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTMzNDJBMDFGQSI+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE55RG0tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9ITnlEbk9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMjM4NyIgaGVpZ2h0PSIxMTUxIi8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOeURuZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITnlEbnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE55RG4tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE55RG9PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE55RG9lZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITnlEb3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE55RG8tZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITnlEcE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE55RHBlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITnlEcHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hOeURwLWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9ITnlEbWVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSE55RG11ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMjY0NDEiIHk9IjEwNzAxIi8+Ci0gICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE55RHFPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTMzNDM2MDIzRCI+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE55RHEtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9ITnlEck9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMjMzNiIgaGVpZ2h0PSIxMTUxIi8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOeURyZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITnlEcnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE55RHItZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE55RHNPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE55RHNlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITnlEc3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE55RHMtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITjdNOE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE43TThlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITjdNOHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hON004LWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9ITnlEcWVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iTm9uZSIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSE55RHF1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMjI1MDciIHk9IjEzOTQ4Ii8+Ci0gICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE43TTlPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTMzNDNGMDAxOSI+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE43TTktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9ITjdNLU9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMzM4NiIgaGVpZ2h0PSIxNTc0Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hON00tZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITjdNLXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE43TS0tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE43TV9PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE43TV9lZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITjdNX3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE43TV8tZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITjdOQU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE43TkFlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITjdOQXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hON05BLWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9ITjdNOWVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iTm9uZSIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSE43TTl1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMjUzODMiIHk9IjEzODQzIi8+Ci0gICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE43TkJPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTMzNDQ2MDAzNyI+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE43TkItZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9ITjdOQ09mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMjk5NyIgaGVpZ2h0PSIxMTUxIi8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hON05DZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITjdOQ3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE43TkMtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE43TkRPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE43TkRlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITjdORHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE43TkQtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITjdORU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE43TkVlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITjdORXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hON05FLWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9ITjdOQmVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSE43TkJ1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMjg4NzkiIHk9IjEzODUxIi8+Ci0gICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE43TkZPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTMzNTA5MDAzOCI+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE43TkYtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9ITjdOR09mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMzQ1NCIgaGVpZ2h0PSIzMzAyIi8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hON05HZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITjdOR3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE43TkctZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE43TkhPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE43TkhlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITjdOSHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE43TkgtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITjdOSU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE43TkllZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITjdOSXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hON05JLWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9ITjdORmVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iTm9uZSIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSE43TkZ1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMzEzOTQiIHk9IjE3NDQ5Ii8+Ci0gICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE43TkpPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTFGNzREMDA5MSI+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE43TkotZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9ITjdOS09mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hON05LZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITjdOS3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE43TkstZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE43TkxPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hON05MZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE43Tkx1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hON05MLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE43Tk1PZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hON05NZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE43Tk11ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITjdOTS1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSE43TkplZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hON05KdWZYRWR1cUhvT0piVVJaUnciIHg9IjI3NTIwIiB5PSIyMDExOCIvPgotICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hON05OT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTUzMzUwMTAxODEiPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hON05OLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSE43Tk9PZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjQwODAiIGhlaWdodD0iMTE1MSIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITjdOT2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE43Tk91ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hON05PLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hON05QT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hON05QZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE43TlB1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hON05QLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE43TlFPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hON05RZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE43TlF1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITjdOUS1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSE43Tk5lZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9Ik5vbmUiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hON05OdWZYRWR1cUhvT0piVVJaUnciIHg9IjI3MDY3IiB5PSIxNzQ1OCIvPgotICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hON05sT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyODAiPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hON05sLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSE43Tm1PZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjUwOTYiIGhlaWdodD0iMTk4MSIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITjdObWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE43Tm11ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hON05tLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hON05uT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hON05uZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE43Tm51ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hON05uLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE43Tm9PZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hON05vZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE43Tm91ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITjdOby1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSE43TmxlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJOb25lIiBzaG93TGlzdFZpc2liaWxpdHk9Ik5vbmUiIGxpbmVDb2xvcj0iMTI2MzIyNTYiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ITjdObHVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxMTg1MyIgeT0iNjYwIi8+Ci0gICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE43TnJlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRERFNjY4MDBDRSI+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE43TnNPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9ITjdOc2VmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMjE1MCIgaGVpZ2h0PSIxMDMyIi8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hON05zdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IT0U5OE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE9FOThlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE9FOTh1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hPRTk4LWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE9FOTlPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hPRTk5ZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE9FOTl1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hPRTk5LWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE9FOS1PZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IT0U5LWVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSE43TnJ1ZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hON05yLWZYRWR1cUhvT0piVVJaUnciIHg9IjExODI3IiB5PSIyMDg3MCIvPgotICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hPRTktdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTUzMUQ4MjAyOUEiPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hPRTlfZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSE9FOV91ZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjQ1MjEiIGhlaWdodD0iMTA2NiIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IT0U5Xy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE9FLUFPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hPRS1BZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hPRS1BdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hPRS1BLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE9FLUJPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hPRS1CZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE9FLUJ1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hPRS1CLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE9FLUNPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IT0UtQ2VmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSE9FOS0tZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hPRTlfT2ZYRWR1cUhvT0piVVJaUnciIHg9IjEwNjQyIiB5PSIxODIxMSIvPgotICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MRGlhZ3JhbVN0eWxlIiB4bWk6aWQ9Il9HejJnSU9mWEVkdXFIb09KYlVSWlJ3IiBkZXNjcmlwdGlvbj0iVGhpcyBkaWFncmFtIHNob3dzIHRoZSBhbG1vc3QgZXhhY3QgaW1wbGVtZW50YXRpb24gb2YgdGhlIFVNTCAyLjAgRGlhZ3JhbSBJbnRlcmNoYW5nZSBNZXRhLU1vZGVsLiAgU29tZSBleHRlbnNpb25zIGhhZCBiZWVuIGFkZGVkLCBlLmcuIGRlcnJpdmluZyBhbGwgbm9uLXZhbHVlIGNsYXNzZXMgZnJvbSBNZXRob2RFbGVtZW50LiBBbm90aGVyIG1pbm9yIGRpZmZlcmVuY2UgdG8gdGhlIHN0YW5kYXJkIGlzIHRoYXQgUm9zZS9FTUYgZG8gbm90IHN1cHBvcnQgYXR0cmlidXRlIGFycmF5cywgd2hpY2ggaGFzIGJlZW4gbW9kZWxlZCBoZXJlIHdpdGggYXNzb2NpYXRpb25zLiAgRm9yIGRvY3VtZW50YXRpb24gb2YgdGhlIGluZGl2aWR1YWwgY2xhc3NlcyBzZWUgdGhlIHN0YW5kYXJkIGRvY3VtZW50IGF0IHd3dy51bWwub3JnLiIvPgotICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4KLSAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSE5WWFlPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTMxNDg1MDM5NiIgc291cmNlPSJfSE5WWFVPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSE5WWElPZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5WWFktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOVlhaZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOVlhadWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hOVlhaT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5WWFotZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTMxNDg2MDI2RCI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITlZYYWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hOVlhhT2ZYRWR1cUhvT0piVVJaUnciIHg9IjI3IiB5PSItMjI5Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOVlhhdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTMxNDg2MDI2RCI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITlZYYk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ITlZYYS1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMzk3Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOVlhiZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTMxNDg2MDI2QiI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITlZYYi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSE5WWGJ1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTE1MCIgeT0iLTQ0OSIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITlZYY09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE1MzE0ODYwMjZCIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOVlhjdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSE5WWGNlZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTM3OCIgeT0iMTMzNyIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITlZYYy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE1MzE0ODYwMjZEIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOVlhkZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE5WWGR1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hOVlhkT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5WWGQtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE1MzE0ODYwMjZCIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOVlhlZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE5WWGV1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hOVlhlT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5WWGUtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTUzMTQ4NjAyNkQiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5WWGZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITlZYZnVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSE5WWGZPZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITlZYZi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE1MzE0ODYwMjZCIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOVlhnZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITlZYZ3VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSE5WWGdPZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9ITlZYWWVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSE5WWFl1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTExMCwgNTI0LCAtOCwgLTE5NjRdJFstMTEwLCAyMDQ4LCAtOCwgLTQ0MF0iLz4KLSAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9ITmZJR3VmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE1MzA5MzgwMzQ2IiBzb3VyY2U9Il9ITlZYTU9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9ITlZYZy1mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITmZJSGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5mSUgtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5mSUlPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSE5mSUh1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITmZJSWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE1MzA5MzkwMjEzIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOZklJLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSE5mSUl1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTM0OSIgeT0iMTg2Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOZklKT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE1MzA5MzkwMjEzIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOZklKdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hOZklKZWZYRWR1cUhvT0piVVJaUnciIHg9IjI3OCIgeT0iLTI4MCIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITmZJSi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTUzMDkzOTAyMTEiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5mSUtlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hOZklLT2ZYRWR1cUhvT0piVVJaUnciIHg9IjQ1MCIgeT0iMTg2Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOZklLdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTUzMDkzOTAyMTEiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5mSUxPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ITmZJSy1mWEVkdXFIb09KYlVSWlJ3IiB4PSItNDczIiB5PSItMjQ2Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOZklMZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTUzMDkzOTAyMTMiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5mSUwtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITmZJTU9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSE5mSUx1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITmZJTWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTUzMDkzOTAyMTEiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5mSU0tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITmZJTk9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSE5mSU11ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITmZJTmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTMwOTM5MDIxMyI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITmZJTi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hOZklPT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ITmZJTnVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOZklPZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTUzMDkzOTAyMTEiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5mSU8tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hOZklQT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ITmZJT3VmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hOZklHLWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9ITmZJSE9mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMzExNSwgMjYyLCA4MDA5LCA0MTRdJFstODk0MCwgMjYyLCAyMTg0LCA0MTRdIi8+Ci0gICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSE5mSVBlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTMwOUJDMDI0MSIgc291cmNlPSJfSE5WWGctZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSE5WWFFPZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5mSVFPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOZklRdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOZklRLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hOZklRZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5mSVJPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTMwOUJEMDE1RSI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITmZJUnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hOZklSZWZYRWR1cUhvT0piVVJaUnciIHg9Ii04MiIgeT0iLTI4OCIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITmZJUi1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTUzMDlCRDAxNUUiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5mSVNlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSE5mSVNPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTM5NyIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITmZJU3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTUzMDlCRDAxNUMiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5mSVRPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hOZklTLWZYRWR1cUhvT0piVVJaUnciIHg9Ii00NzAiIHk9IjIyMSIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITmZJVGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE1MzA5QkQwMTVDIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOZklULWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSE5mSVR1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTM3NyIgeT0iLTIwMyIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITmZJVU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE1MzA5QkQwMTVFIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOZklVdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE5mSVUtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hOZklVZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5mSVZPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE1MzA5QkQwMTVDIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOZklWdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE5mSVYtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hOZklWZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5mSVdPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTUzMDlCRDAxNUUiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5mSVd1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITmZJVy1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSE5mSVdlZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITmZJWE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE1MzA5QkQwMTVDIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOZklYdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITmZJWC1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSE5mSVhlZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9ITmZJUHVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSE5mSVAtZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTIxODQsIDQzMSwgNDExNCwgLTE0NDddJFstMzExNSwgNDMxLCAzMTgzLCAtMTQ0N10kWy0zMTE1LCAyMDMyLCAzMTgzLCAxNTJdJFstNTAyMCwgMjAzMiwgMTI3OCwgMTUyXSIvPgotICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hOZkljT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTUzMEZGMjAzNjAiIHNvdXJjZT0iX0hOZklZT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hOVlhVT2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOZkljLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITmZJZGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITmZJZHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ITmZJZE9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOZklkLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTUzMEZGMzAxNjQiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5mSWVlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ITmZJZU9mWEVkdXFIb09KYlVSWlJ3IiB4PSItNDIzIiB5PSItMjE5Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOZklldWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE1MzBGRjMwMTY0Ij4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOZklmT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hOZkllLWZYRWR1cUhvT0piVVJaUnciIHg9IjExMCIgeT0iMzMxIi8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOZklmZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTMwRkYzMDE2MiI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITmZJZi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSE5mSWZ1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iNTEiIHk9Ii0yMzYiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5mSWdPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTMwRkYzMDE2MiI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITmZJZ3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hOZklnZWZYRWR1cUhvT0piVVJaUnciIHg9Ii00OTkiIHk9IjI5NyIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITmZJZy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE1MzBGRjMwMTY0Ij4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOZkloZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE5mSWh1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hOZkloT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5mSWgtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE1MzBGRjMwMTYyIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOZklpZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE5mSWl1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hOZklpT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5mSWktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTUzMEZGMzAxNjQiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5mSWplZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITmZJanVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSE5mSWpPZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITmZJai1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE1MzBGRjMwMTYyIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOZklrZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITmZJa3VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSE5mSWtPZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9ITmZJY2VmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSE5mSWN1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMTQ1NiwgMzMsIC02NDY4LCAtMTZdJFs2ODI0LCAzMywgLTExMDAsIC0xNl0iLz4KLSAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9ITmZJby1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE1MzA3NTgwMTFGIiBzb3VyY2U9Il9ITmZJay1mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9ITlZYZy1mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITmZJcHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5mSXFPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5mSXFlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSE5mSXAtZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITmZJcXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE1MzA3NTkwMDQ0Ij4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOZklyT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSE5mSXEtZlhFZHVxSG9PSmJVUlpSdyIgeD0iMjkyIiB5PSIzOTAiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5mSXJlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTUzMDc1OTAwNDQiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5mSXItZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSE5mSXJ1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMzQzIiB5PSItOTU3Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOZklzT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTMwNzU5MDAzQSI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITmZJc3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSE5mSXNlZlhFZHVxSG9PSmJVUlpSdyIgeD0iOTAiIHk9Ii0zODkiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5mSXMtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTMwNzU5MDAzQSI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITmZJdGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hOZkl0T2ZYRWR1cUhvT0piVVJaUnciIHg9Ii0zMDMiIHk9Ii0xMTY1Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOZkl0dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTUzMDc1OTAwNDQiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5mSXVPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITmZJdWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSE5mSXQtZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITmZJdXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTUzMDc1OTAwM0EiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5mSXZPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITmZJdmVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSE5mSXUtZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITmZJdnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTMwNzU5MDA0NCI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITmZJd09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hOZkl3ZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ITmZJdi1mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOZkl3dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTUzMDc1OTAwM0EiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5mSXhPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hOZkl4ZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ITmZJdy1mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hOZklwT2ZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9ITmZJcGVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstNDc0LCAtNTg0LCAtMjcwLCAzMzc4XSRbLTQ3NCwgLTMzNzgsIC0yNzAsIDU4NF0iLz4KLSAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9ITmZJeHVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE1MzBFMjkwMTUwIiBzb3VyY2U9Il9ITlZYVU9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9ITmZJay1mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITmZJeWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5mSXktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5vU0FPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSE5mSXl1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9ITmZJeC1mWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9ITmZJeU9mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlsxMTAsIC01NDEsIC02NTEsIDI3NjBdJFs2MDksIC0yNzI2LCAtMTUyLCA1NzVdIi8+Ci0gICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSE5vU0FlZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSE5vU0F1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSE5vU0EtZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTMwRTJCMDIxQiIgc291cmNlPSJfSE5WWEVPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSE5mSWstZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5vU0J1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOb1NDT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOb1NDZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hOb1NCLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSE5vU0JPZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSE5vU0JlZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTk0OCwgLTU4NCwgMzgyNiwgMjMxMV0kWy0zODEwLCAtMjMxOSwgOTY1LCA1NzVdIi8+Ci0gICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSE5vU0N1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSE5vU0MtZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSE5vU0RPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTMwRTdDMDBENyIgc291cmNlPSJfSE5mSWstZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSE5mSVlPZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5vU0QtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOb1NFZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOb1NFdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hOb1NFT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5vU0UtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTMwRTdFMDE3QSI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITm9TRmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hOb1NGT2ZYRWR1cUhvT0piVVJaUnciIHg9Ii03NzkiIHk9Ii0yNzEiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5vU0Z1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTUzMEU3RTAxN0EiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5vU0dPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSE5vU0YtZlhFZHVxSG9PSmJVUlpSdyIgeD0iOTQ5IiB5PSItMzM5Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOb1NHZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTMwRTdFMDE3MCI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITm9TRy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSE5vU0d1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iOTE0IiB5PSItNDU3Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOb1NIT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTUzMEU3RTAxNzAiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5vU0h1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ITm9TSGVmWEVkdXFIb09KYlVSWlJ3IiB4PSI4ODgiIHk9IjExOTQiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5vU0gtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTMwRTdFMDE3QSI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITm9TSWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hOb1NJdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ITm9TSU9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOb1NJLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTMwRTdFMDE3MCI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITm9TSmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hOb1NKdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ITm9TSk9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOb1NKLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE1MzBFN0UwMTdBIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOb1NLZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE5vU0t1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hOb1NLT2ZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5vU0stZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTMwRTdFMDE3MCI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITm9TTGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE5vU0x1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hOb1NMT2ZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSE5vU0RlZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hOb1NEdWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0xMzgwLCAzMTMsIDczMDYsIC0yOTM3XSRbLTgyMjksIDMxMywgNDU3LCAtMjkzN10kWy04MjI5LCAyNzE3LCA0NTcsIC01MzNdIi8+Ci0gICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSE5vU1AtZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTMwRTQ1MDM5RiIgc291cmNlPSJfSE5mSWstZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSE5vU0wtZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5vU1F1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOb1NST2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOb1NSZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hOb1NRLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5vU1J1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTMwRTQ2MDI5RSI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITm9TU09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hOb1NSLWZYRWR1cUhvT0piVVJaUnciIHg9Ii0zMjIiIHk9IjIyMCIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITm9TU2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTMwRTQ2MDI5RSI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITm9TUy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ITm9TU3VmWEVkdXFIb09KYlVSWlJ3IiB4PSI5OTkiIHk9Ii0yNTQiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5vU1RPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE1MzBFNDYwMjlDIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOb1NUdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ITm9TVGVmWEVkdXFIb09KYlVSWlJ3IiB4PSI0NzUiIHk9IjMxMyIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITm9TVC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE1MzBFNDYwMjlDIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOb1NVZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSE5vU1VPZlhFZHVxSG9PSmJVUlpSdyIgeD0iMjk3IiB5PSItMzM5Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOb1NVdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTUzMEU0NjAyOUUiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5vU1ZPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITm9TVmVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSE5vU1UtZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITm9TVnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTUzMEU0NjAyOUMiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5vU1dPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITm9TV2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSE5vU1YtZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITm9TV3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTMwRTQ2MDI5RSI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITm9TWE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hOb1NYZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ITm9TVy1mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOb1NYdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTUzMEU0NjAyOUMiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5vU1lPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hOb1NZZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ITm9TWC1mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hOb1NRT2ZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9ITm9TUWVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlsxMzgwLCAtMTEwLCAtNzc2MywgLTU5XSRbNzcwNCwgLTExMCwgLTE0MzksIC01OV0iLz4KLSAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9ITm9TY3VmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE1MzE2OTcwMzAyIiBzb3VyY2U9Il9ITmZJay1mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9ITm9TWXVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITm9TZGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5vU2QtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5vU2VPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSE5vU2R1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITm9TZWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE1MzE2OTkwMDAzIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOb1NlLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSE5vU2V1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTMxMDMiIHk9Ii0yNjIiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5vU2ZPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTUzMTY5OTAwMDMiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5vU2Z1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSE5vU2ZlZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTIxODAiIHk9IjIzOCIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITm9TZi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTUzMTY5OTAwMDEiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5vU2dlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hOb1NnT2ZYRWR1cUhvT0piVVJaUnciIHg9IjM1MTgiIHk9IjI0NiIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITm9TZ3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE1MzE2OTkwMDAxIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOb1NoT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSE5vU2ctZlhFZHVxSG9PSmJVUlpSdyIgeD0iMjA2MiIgeT0iLTM1NSIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITm9TaGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE1MzE2OTkwMDAzIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOb1NoLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE5vU2lPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hOb1NodWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5vU2llZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE1MzE2OTkwMDAxIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOb1NpLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE5vU2pPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hOb1NpdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5vU2plZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTUzMTY5OTAwMDMiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5vU2otZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITm9Ta09mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSE5vU2p1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITm9Ta2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE1MzE2OTkwMDAxIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOb1NrLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITm9TbE9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSE5vU2t1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9ITm9TYy1mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgc2hvd0xpc3RWaXNpYmlsaXR5PSJOb25lIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9ITm9TZE9mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMTM4MCwgLTQwNiwgOTMsIC04ODkwXSRbLTEwODU0LCAtNDA2LCAtOTM4MSwgLTg4OTBdJFstMTA4NTQsIDgwODUsIC05MzgxLCAtMzk3XSRbLTMzOTUsIDgwODUsIC0xOTIxLCAtMzk3XSIvPgotICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hOb1NwZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTUzMEUzQTAzQ0IiIHNvdXJjZT0iX0hOb1NsZWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hOVlhFT2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOb1NxT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITm9TcXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITm9TcS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ITm9TcWVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hOb1NwdWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hOb1NwLWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzAsIC03OTUsIDAsIDE5OThdJFswLCAtMjIxOCwgMCwgNTc1XSIvPgotICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hOb1NyT2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hOb1NyZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hOb1NydWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTUzMTVEQjAzMDEiIHNvdXJjZT0iX0hOb1NsZWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hOb1NMLWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOb1NzZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITm9Tcy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITm9TdE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ITm9Tc3VmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOb1N0ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTUzMTVERDAwNDciPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5vU3QtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ITm9TdHVmWEVkdXFIb09KYlVSWlJ3IiB4PSItODMzIiB5PSIzMzgiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5vU3VPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTUzMTVERDAwNDciPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5vU3V1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSE5vU3VlZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTI5MSIgeT0iLTI5NyIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITm9TdS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTUzMTVERDAwM0QiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5vU3ZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hOb1N2T2ZYRWR1cUhvT0piVVJaUnciIHg9Ijc2NSIgeT0iNDU3Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOb1N2dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTUzMTVERDAwM0QiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5vU3dPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ITm9Tdi1mWEVkdXFIb09KYlVSWlJ3IiB4PSI3NjUiIHk9Ii0xMzEzIi8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOeURBT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTUzMTVERDAwNDciPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE55REF1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITnlEQS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSE55REFlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITnlEQk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTUzMTVERDAwM0QiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE55REJ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITnlEQi1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSE55REJlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITnlEQ09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTMxNUREMDA0NyI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITnlEQ3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hOeURDLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ITnlEQ2VmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOeURET2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTUzMTVERDAwM0QiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE55RER1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hOeURELWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ITnlERGVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hOb1NyLWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9ITm9Tc09mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlsxNTQwLCAwLCAtMjgyNywgNTc0MF0kWzQyODQsIDAsIC04NCwgNTc0MF0kWzQyODQsIC00OTUzLCAtODQsIDc4N10iLz4KLSAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9ITnlERU9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE1MzFDMTcwMTREIiBzb3VyY2U9Il9ITm9TbGVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9ITm9TWXVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITnlERS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE55REZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE55REZ1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSE55REZPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITnlERi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE1MzFDMTgwMTAxIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOeURHZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSE55REdPZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTEyOSIgeT0iLTQ0OCIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITnlER3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTMxQzE4MDEwMSI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITnlESE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ITnlERy1mWEVkdXFIb09KYlVSWlJ3IiB4PSItMTEyIiB5PSI5MTYiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE55REhlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE1MzFDMTgwMEZGIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOeURILWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ITnlESHVmWEVkdXFIb09KYlVSWlJ3IiB4PSI1NjkiIHk9Ii0yODgiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE55RElPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTMxQzE4MDBGRiI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITnlESXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hOeURJZWZYRWR1cUhvT0piVVJaUnciIHg9Ii01NDkiIHk9IjI3OSIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITnlESS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE1MzFDMTgwMTAxIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOeURKZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE55REp1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hOeURKT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE55REotZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE1MzFDMTgwMEZGIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOeURLZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE55REt1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hOeURLT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE55REstZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTUzMUMxODAxMDEiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE55RExlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITnlETHVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSE55RExPZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITnlETC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE1MzFDMTgwMEZGIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOeURNZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITnlETXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSE55RE1PZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9ITnlERWVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSE55REV1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTg0LCA3ODcsIDYxNjMsIC0yMDA2XSRbLTg0LCAyNDI5LCA2MTYzLCAtMzY0XSRbLTQzMjYsIDI0MjksIDE5MjEsIC0zNjRdIi8+Ci0gICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSE55RFEtZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTMxREEwMDFCNyIgc291cmNlPSJfSE55RE0tZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSE5vU1l1ZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE55RFJ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOeURTT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOeURTZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hOeURSLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSE55RFJPZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSE55RFJlZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMTYyNSwgLTU4NCwgLTUyODMsIDE4NTRdJFs1MjU3LCAtMTg2MiwgLTE2NTEsIDU3NV0iLz4KLSAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9ITnlEU3VmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9ITnlEUy1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9ITnlEYk9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE1MzFEQTMwMTg5IiBzb3VyY2U9Il9ITnlEWE9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9ITm9TWXVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITnlEYi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE55RGNlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE55RGN1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSE55RGNPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9ITnlEYmVmWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9ITnlEYnVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMTIxMCwgLTU0MSwgNDc4MywgMjA5OV0kWy00NjkwLCAtMjA2NSwgMTMwMywgNTc1XSIvPgotICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hOeURjLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hOeURkT2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hOeURkZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTUzMkZFMzAxMjMiIHNvdXJjZT0iX0hOeURYT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hOeURUT2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOeURlT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITnlEZXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITnlEZS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ITnlEZWVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOeURmT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTUzMkZFMzAzNDAiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE55RGZ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ITnlEZmVmWEVkdXFIb09KYlVSWlJ3IiB4PSI2MSIgeT0iMzE0Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOeURmLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTMyRkUzMDM0MCI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITnlEZ2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ITnlEZ09mWEVkdXFIb09KYlVSWlJ3IiB5PSItMzk3Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOeURndWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTMyRkUzMDMyQyI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITnlEaE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSE55RGctZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTI5OCIgeT0iMjg4Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOeURoZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTUzMkZFMzAzMkMiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE55RGgtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ITnlEaHVmWEVkdXFIb09KYlVSWlJ3IiB4PSItMjk4IiB5PSItMTEwMCIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITnlEaU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE1MzJGRTMwMzQwIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOeURpdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE55RGktZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hOeURpZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE55RGpPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE1MzJGRTMwMzJDIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOeURqdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE55RGotZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hOeURqZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE55RGtPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTUzMkZFMzAzNDAiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE55RGt1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITnlEay1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSE55RGtlZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITnlEbE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE1MzJGRTMwMzJDIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOeURsdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITnlEbC1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSE55RGxlZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9ITnlEZHVmWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9ITnlEZC1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlswLCA1MzMsIDAsIC0yMTU5XSRbMCwgMjE1MCwgMCwgLTU0MV0iLz4KLSAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9ITjdOUk9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE1MzM1OEIwMTYxIiBzb3VyY2U9Il9ITjdOTk9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9ITjdOSk9mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITjdOUi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE43TlNlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE43TlN1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSE43TlNPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITjdOUy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE1MzM1OEIwMzc0Ij4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hON05UZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSE43TlRPZlhFZHVxSG9PSmJVUlpSdyIgeD0iNjUiIHk9Ii0yNjIiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE43TlR1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE1MzM1OEIwMzc0Ij4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hON05VT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hON05ULWZYRWR1cUhvT0piVVJaUnciIHk9Ii0zOTciLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE43TlVlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE1MzM1OEIwMzZBIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hON05VLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ITjdOVXVmWEVkdXFIb09KYlVSWlJ3IiB4PSItMTc1IiB5PSItNDE1Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hON05WT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTUzMzU4QjAzNkEiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE43TlZ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ITjdOVmVmWEVkdXFIb09KYlVSWlJ3IiB4PSItMzcwIiB5PSIxMTUyIi8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hON05WLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTUzMzU4QjAzNzQiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE43TldlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITjdOV3VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSE43TldPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITjdOVy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTUzMzU4QjAzNkEiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE43TlhlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITjdOWHVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSE43TlhPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITjdOWC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTMzNThCMDM3NCI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITjdOWWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hON05ZdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ITjdOWU9mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hON05ZLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTUzMzU4QjAzNkEiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE43TlplZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hON05adWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ITjdOWk9mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hON05SZWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hON05SdWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzAsIDU3NSwgMCwgLTIzNzBdJFswLCAyNDQ2LCAwLCAtNDk5XSIvPgotICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hON05aLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTUzMzUxQjAzRTEiIHNvdXJjZT0iX0hON05GT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hON05CT2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hON05hdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITjdOYk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITjdOYmVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ITjdOYS1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hON05hT2ZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hON05hZWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy05ODIsIC0xNjU5LCAxNzYxLCAzMDE0XSRbLTI0MTMsIC00MDk3LCAzMzAsIDU3NV0iLz4KLSAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9ITjdOYnVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9ITjdOYi1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9ITjdOY09mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE1MzM1MTgwMzI4IiBzb3VyY2U9Il9ITjdOTk9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9ITjdOQk9mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITjdOYy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE43TmRlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE43TmR1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSE43TmRPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9ITjdOY2VmWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9ITjdOY3VmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlsxODYsIC01ODQsIC0xMDgzLCAzMDIyXSRbMTA0OSwgLTMwMzEsIC0yMjAsIDU3NV0iLz4KLSAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9ITjdOZC1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9ITjdOZU9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9ITjdOZWVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE1MzM2OUYwMDhDIiBzb3VyY2U9Il9ITnlEcU9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9ITnlEbU9mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITjdOZk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE43TmZ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE43TmYtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSE43TmZlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9ITjdOZXVmWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9ITjdOZS1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9Ils2MjYsIC01ODQsIC0yODc4LCAyNTY1XSRbMjg0NCwgLTI1NzMsIC02NjAsIDU3NV0iLz4KLSAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9ITjdOZ09mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9ITjdOZ2VmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9ITjdOZ3VmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE1MzM2QTEwMkQzIiBzb3VyY2U9Il9ITjdNOU9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9ITnlEbU9mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITjdOaGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE43TmgtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE43TmlPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSE43Tmh1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9ITjdOZy1mWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9ITjdOaE9mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlsxMjcsIC03OTUsIC00MzEsIDI1NTZdJFs0NDgsIC0yNzc3LCAtMTEwLCA1NzVdIi8+Ci0gICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSE43TmllZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSE43Tml1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSE43TmktZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTMzNkE0MDI5MiIgc291cmNlPSJfSE43TkJPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSE55RG1PZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE43Tmp1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hON05rT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hON05rZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hON05qLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSE43TmpPZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSE43TmplZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTUwOCwgLTU4NCwgMjIzNSwgMjU2NV0kWy0yMjQzLCAtMjU3MywgNDk5LCA1NzVdIi8+Ci0gICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSE43Tmt1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSE43TmstZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSE43TnBPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRTIxMjdBMDE4RCIgc291cmNlPSJfSE5mSVlPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSE5mSWstZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE43TnAtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hON05xZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hON05xdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hON05xT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSE43TnBlZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSE43TnB1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMTQ1NiwgLTM3MiwgLTcyMzAsIDI4NzhdJFs1NzA2LCAtMTQwNSwgLTI5ODAsIDE4NDVdJFs3NzMwLCAtMjY3NSwgLTk1NiwgNTc1XSIvPgotICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hON05xLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hON05yT2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hPRS1DdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTUzMURBNTAyNjgiIHNvdXJjZT0iX0hPRTktdWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hOb1NZdWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hPRS1EZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IT0UtRC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IT0UtRU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IT0UtRHVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hPRS1DLWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IT0UtRE9mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlsxNjksIC01NDEsIDE2LCAyMjAxXSRbMTY5LCAtMjE2NywgMTYsIDU3NV0iLz4KLSAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IT0UtRWVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IT0UtRXVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IT0UtRS1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE1MzJGQzQwMzI3IiBzb3VyY2U9Il9IT0U5LXVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9ITjdOcmVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IT0UtRnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE9FLUdPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE9FLUdlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSE9FLUYtZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IT0UtR3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE1MzJGQzUwMUEzIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hPRS1IT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSE9FLUctZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTQzIiB5PSItMzgxIi8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hPRS1IZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTMyRkM1MDFBMyI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IT0UtSC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IT0UtSHVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMzk3Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hPRS1JT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTMyRkM1MDE5OCI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IT0UtSXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSE9FLUllZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTY2IiB5PSItMzU1Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hPRS1JLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTUzMkZDNTAxOTgiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE9FLUplZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IT0UtSk9mWEVkdXFIb09KYlVSWlJ3IiB4PSItMzU0IiB5PSI5ODIiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE9FLUp1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTMyRkM1MDFBMyI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IT0UtS09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hPRS1LZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IT0UtSi1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hPRS1LdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTMyRkM1MDE5OCI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IT0UtTE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hPRS1MZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IT0UtSy1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hPRS1MdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE1MzJGQzUwMUEzIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hPRS1NT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE9FLU1lZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hPRS1MLWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE9FLU11ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTMyRkM1MDE5OCI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IT0UtTk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE9FLU5lZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hPRS1NLWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSE9FLUZPZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSE9FLUZlZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMCwgNTMzLCAwLCAtMjEwOF0kWzAsIDIxMTYsIDAsIC01MjRdIi8+Ci0gICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSE9FLU51ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRTQ5NEREMDJDOSIgc291cmNlPSJfSE5vU1l1ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSE5WWGctZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE9FLU9lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hPRS1PLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hPRS1QT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hPRS1PdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSE9FLU4tZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hPRS1PT2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0xOTIxLCAxOTQsIC0zMTkxLCAxMjY0MF0kWy0xMDA0MSwgMTk0LCAtMTEzMTEsIDEyNjQwXSRbLTEwMDQxLCAtMTI4ODYsIC0xMTMxMSwgLTQ0MF0kWy05MTQsIC0xMjg4NiwgLTIxODQsIC00NDBdIi8+Ci0gICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSE9FLVBlZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSE9FLVB1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSE9FLVAtZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRTIxMjQ4MDAxRiIgc291cmNlPSJfSE5WWFFPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSE5WWGctZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE9FLVF1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hPRS1ST2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hPRS1SZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hPRS1RLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSE9FLVFPZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hPRS1RZWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzU3NSwgLTc4NywgLTU3MjMsIDEwOTJdJFs1NzUsIC0yMDMyLCAtNTcyMywgLTE1Ml0kWzQxMTQsIC0yMDMyLCAtMjE4NCwgLTE1Ml0iLz4KLSAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IT0UtUnVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IT0UtUi1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IT0UtU09mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFMjEyMzcwMThFIiBzb3VyY2U9Il9ITlZYZy1mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9ITjdObE9mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IT0UtUy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE9FLVRlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE9FLVR1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSE9FLVRPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IT0UtU2VmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSE9FLVN1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTEwMSwgLTU4NCwgLTE1MiwgMTk1NV0kWy0xMDEsIC0xNTQ5LCAtMTUyLCA5OTBdIi8+Ci0gICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSE9FLVQtZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSE9FLVVPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSE9FLVVlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTMwOTM1MDA0OCIgc291cmNlPSJfSE5WWE1PZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSE5WWGctZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE9FLVZPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hPRS1WdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hPRS1WLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hPRS1WZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSE9FLVV1ZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hPRS1VLWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0zMTE1LCAtNDY1LCA4MDA5LCAtMzEzXSRbLTg5NDAsIC00NjUsIDIxODQsIC0zMTNdIi8+Ci0gICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSE9FLVdPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSE9FLVdlZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSE9FLVd1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTM2OERCMDNFNCIgc291cmNlPSJfSE5mSWstZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSE5WWGctZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE9FLVhlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hPRS1YLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hPRS1ZT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hPRS1YdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSE9FLVctZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hPRS1YT2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzMyMSwgLTU3NSwgNTI0LCAzMzg2XSRbMzIxLCAtMzM3OCwgNTI0LCA1ODRdIi8+Ci0gICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSE9FLVllZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSE9FLVl1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSE9FLVktZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRTIyRkU2MDExMSIgc291cmNlPSJfSE5vU0wtZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSE5WWGctZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE9FLVp1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hPRS1hT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hPRS1hZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hPRS1aLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSE9FLVpPZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hPRS1aZWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy05MywgLTc4NywgOTI1NCwgMzEyNF0kWy05MywgLTE0MTMsIDkyNTQsIDI0OTddJFstODM1NiwgLTE0MTMsIDk5MCwgMjQ5N10kWy04MzU2LCAtMzMyNywgOTkwLCA1ODRdIi8+Ci0gICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSE9FLWF1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSE9FLWEtZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSE9FLWJPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTMzNDlDMDE3MSIgc291cmNlPSJfSE55RG1PZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSE5WWGctZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE9FLWItZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hPRS1jZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hPRS1jdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hPRS1jT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSE9FLWJlZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hPRS1idWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0zOTcsIC00NzYsIDEzNTk5LCA3MjIzXSRbLTM5NywgLTU3MTUsIDEzNTk5LCAxOTg0XSRbLTEzNTIwLCAtNTcxNSwgNDc2LCAxOTg0XSRbLTEzNTIwLCAtNzE5NywgNDc2LCA1MDJdIi8+Ci0gICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSE9FLWMtZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSE9FLWRPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgPC9jb250ZW50cz4KLSAgICAgICAgPGNvbnRlbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpEaWFncmFtIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTUyMTZFNDAxRTMiIHR5cGU9IkNsYXNzIiBuYW1lPSJUeXBlcyI+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hPRS1kZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTUxRjc0RDAwOTEiPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hPRS1lT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSE9FLWVlZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjE5NjQiIGhlaWdodD0iMTk2NCIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IT0UtZXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE9FLWUtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hPRS1mT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hPRS1mZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hPRS1mdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE9FLWYtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE9FLWdPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IT0UtZ2VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE9FLWd1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IT0UtZy1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hPRS1oT2ZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IT0UtZHVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iTm9uZSIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSE9FLWQtZlhFZHVxSG9PSmJVUlpSdyIgeD0iNzQ1IiB5PSI2NDMiLz4KLSAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IT0UtaGVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE1MjBCMUMwMkUxIj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IT0UtaU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hPRS1pZWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIyNzYwIiBoZWlnaHQ9IjE5NjQiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE9FLWl1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hPRS1pLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IT0Utak9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IT0UtamVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IT0UtanVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hPRS1qLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hPRS1rT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE9FLWtlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hPT3U4T2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE9PdThlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IT091OHVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSE9FLWh1ZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9Ik5vbmUiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hPRS1oLWZYRWR1cUhvT0piVVJaUnciIHg9IjMyOTMiIHk9IjU5MiIvPgotICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MRGlhZ3JhbVN0eWxlIiB4bWk6aWQ9Il9HejJnSXVmWEVkdXFIb09KYlVSWlJ3IiBkZXNjcmlwdGlvbj0iVGhlc2UgdHdwIGRhdGEgdHlwZSBhcmUgYmVpbmcgdXNlZCBieSB0aGUgZGlhbWdyYW0gaW50ZXJjaGFuZ2UuICBUaGV5IG1pZ2h0IGJlIHJlcGxhY2VkIHdpdGggdHlwZXMgb2YgdGhlIGltcGxlbWVudGF0aW9uIHBsYXRmb3JtIGFzIGxvbmcgYXMgdGhlIGFsbG93IHRoZSBzYW1lIHR5cGUgb2Ygc2VyaWFsaXphdGlvbiBmb3IgcGVyc2lzdGVuY3kuIi8+Ci0gICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPgotICAgICAgICA8L2NvbnRlbnRzPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0d4Nm1ZT2ZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTUxRjY2QjAxNTUiPgotICAgICAgICA8Ym9keT4wMTwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPHBhY2thZ2VJbXBvcnQgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDFFNTc3NDAwMjNEIiBpbXBvcnRlZFBhY2thZ2U9Il8zQURDN0I3NDAyMkQ0MURERjg2OTAxMkUiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iX0d4Nm1adWZYRWR1cUhvT0piVVJaUnciIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy91bWwyLzIuMC4wL1VNTCIvPgotICAgICAgPC9wYWNrYWdlSW1wb3J0PgotICAgICAgPHBhY2thZ2VJbXBvcnQgeG1pOmlkPSJfeWt3OHdPeFpFZHVPTnJNUmdtejQ4QSIgaW1wb3J0ZWRQYWNrYWdlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjYyIi8+Ci0gICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxNTFGNzREMDA5MSIgbmFtZT0iUG9pbnQiPgotICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDE1Mzc1RjMwMjVFIiBuYW1lPSJ4IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il9BVXE4SU94M0VkdTUtdlZqbGZWc2ZRIi8+Ci0gICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTUzNzVGQzAyRDkiIG5hbWU9InkiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX0FVcThJT3gzRWR1NS12VmpsZlZzZlEiLz4KLSAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTUxRjdGQTAyOTUiIG5hbWU9IkdyYXBoRWxlbWVudCIgaXNBYnN0cmFjdD0idHJ1ZSI+Ci0gICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTUzNjhEQjAzRTQiIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0MTUyMTdDMTAzQkUiLz4KLSAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxNTIwQjZBMDNBMyIgbmFtZT0icG9zaXRpb24iIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQxNTFGNzREMDA5MSIvPgotICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDE1MzA3NTkwMDNBIiBuYW1lPSJjb250YWluZWQiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQxNTIxN0MxMDNCRSIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MTUzMDc1ODAxMUYiPgotICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0d6amxTdWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3pqbFNlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDE1MzBFNDYwMjlDIiBuYW1lPSJsaW5rIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MTUzMEEyNjAyRjgiIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDE1MzBFNDUwMzlGIj4KLSAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HenN2RS1mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0d6c3ZFdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxNTMwRTdFMDE3MCIgbmFtZT0iYW5jaG9yYWdlIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MTUzMDlGRDAxN0MiIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDE1MzBFN0MwMEQ3Ij4KLSAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HenN2R3VmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0d6c3ZHZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxNTMxNjk5MDAwMSIgbmFtZT0ic2VtYW50aWNNb2RlbCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDE1MzE2NkEwMjAyIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQxNTMxNjk3MDMwMiI+Ci0gICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3pzdk51ZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IjEiLz4KLSAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HenN2TmVmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iMSIvPgotICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxNTIwQjFDMDJFMSIgbmFtZT0iRGltZW5zaW9uIj4KLSAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxNTM3NjA1MDE1NSIgbmFtZT0id2lkdGgiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX0FVcThJT3gzRWR1NS12VmpsZlZzZlEiLz4KLSAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxNTM3NjBFMDE2QyIgbmFtZT0iaGVpZ2h0IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il9BVXE4SU94M0VkdTUtdlZqbGZWc2ZRIi8+Ci0gICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDE1MjE3QzEwM0JFIiBuYW1lPSJEaWFncmFtRWxlbWVudCIgaXNBYnN0cmFjdD0idHJ1ZSI+Ci0gICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MUUyMTIzNzAxOEUiIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyODAiLz4KLSAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxNTMwNjk4MDE4NyIgbmFtZT0iaXNWaXNpYmxlIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il81R2NZQU9pZUVkdVFidVk2VXdNU1FnIj4KLSAgICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJfR3paMEwtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iXzVHY1lBT2llRWR1UWJ1WTZVd01TUWciPgotICAgICAgICAgICAgPGJvZHk+dHJ1ZTwvYm9keT4KLSAgICAgICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxNTMwNzU5MDA0NCIgbmFtZT0iY29udGFpbmVyIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MTUxRjdGQTAyOTUiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDE1MzA3NTgwMTFGIj4KLSAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HempsVGVmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iMSIvPgotICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0d6amxUT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxNTMwOTM5MDIxMyIgbmFtZT0icmVmZXJlbmNlIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MTUzMDkwRTAwQjAiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDE1MzA5MzgwMzQ2Ij4KLSAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HempsVk9mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0d6amxVLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxNTMwOUJEMDE1QyIgbmFtZT0icHJvcGVydHkiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQxNTMwOTgyMDNCQSIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MTUzMDlCQzAyNDEiPgotICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0d6amxXT2ZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3pqbFYtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxNTMwOTBFMDBCMCIgbmFtZT0iUmVmZXJlbmNlIj4KLSAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxNTMwOTM1MDA0OCIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQxNTIxN0MxMDNCRSIvPgotICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDE1MzA5MTYwMDI2IiBuYW1lPSJpc0luZGl2aWR1YWxSZXByZXNlbnRhdGlvbiIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfNUdjWUFPaWVFZHVRYnVZNlV3TVNRZyI+Ci0gICAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxCb29sZWFuIiB4bWk6aWQ9Il90S1VGY095SkVkdTUtdlZqbGZWc2ZRIiB0eXBlPSJfNUdjWUFPaWVFZHVRYnVZNlV3TVNRZyIvPgotICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDE1MzA5MzkwMjExIiBuYW1lPSJyZWZlcmVuY2VkIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MTUyMTdDMTAzQkUiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDE1MzA5MzgwMzQ2Ij4KLSAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HempsVWVmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iMSIvPgotICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0d6amxVT2ZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIxIi8+Ci0gICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDE1MzA5ODIwM0JBIiBuYW1lPSJQcm9wZXJ0eSI+Ci0gICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MUUyMTI0ODAwMUYiIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0MTUyMTdDMTAzQkUiLz4KLSAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxNTMwOUE5MDA4MSIgbmFtZT0ia2V5IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiPgotICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3ZzbFZRZXlHRWR1NS12VmpsZlZzZlEiIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfdnNsVlFPeUdFZHU1LXZWamxmVnNmUSIvPgotICAgICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il92a1BSa095R0VkdTUtdlZqbGZWc2ZRIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIiB2YWx1ZT0iIi8+Ci0gICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTUzMDlBRDAyMzUiIG5hbWU9InZhbHVlIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiPgotICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0RmbFR3ZXlKRWR1NS12VmpsZlZzZlEiIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfRGZsVHdPeUpFZHU1LXZWamxmVnNmUSIvPgotICAgICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il9EV0M5UU95SkVkdTUtdlZqbGZWc2ZRIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIiB2YWx1ZT0iIi8+Ci0gICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDE1MzA5RkQwMTdDIiBuYW1lPSJHcmFwaENvbm5lY3RvciI+Ci0gICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MUUyMTI3QTAxOEQiIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0MTUxRjdGQTAyOTUiLz4KLSAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxNTMwRTdFMDE3QSIgbmFtZT0iZ3JhcGhFbGVtZW50IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MTUxRjdGQTAyOTUiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDE1MzBFN0MwMEQ3Ij4KLSAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HenN2SGVmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iMSIvPgotICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0d6c3ZIT2ZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIxIi8+Ci0gICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTUzMEZGMzAxNjIiIG5hbWU9ImdyYXBoRWRnZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDE1MzBBMTIwMjQ1IiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQxNTMwRkYyMDM2MCI+Ci0gICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3pzdkllZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HenN2SU9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDE1MzBBMTIwMjQ1IiBuYW1lPSJHcmFwaEVkZ2UiPgotICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDE1MzBFMjkwMTUwIiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDE1MUY3RkEwMjk1Ii8+Ci0gICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTUzMEZGMzAxNjQiIG5hbWU9ImFuY2hvciIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDE1MzA5RkQwMTdDIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQxNTMwRkYyMDM2MCI+Ci0gICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3pzdkpPZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IjIiLz4KLSAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HenN2SS1mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iMiIvPgotICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDE1MzE0ODYwMjZCIiBuYW1lPSJ3YXlwb2ludHMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQxNTFGNzREMDA5MSIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MTUzMTQ4NTAzOTYiPgotICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0d6c3ZLT2ZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3pzdkotZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IjIiLz4KLSAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTUzMEEyNjAyRjgiIG5hbWU9IkRpYWdyYW1MaW5rIj4KLSAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxRTIyRkU2MDExMSIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQxNTIxN0MxMDNCRSIvPgotICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDE1MzFDREIwMUYwIiBuYW1lPSJ6b29tIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il9BVXE4SU94M0VkdTUtdlZqbGZWc2ZRIi8+Ci0gICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTUzMUNFNDAyRDkiIG5hbWU9InZpZXdwb3J0IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MTUxRjc0RDAwOTEiLz4KLSAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxNTMwRTQ2MDI5RSIgbmFtZT0iZ3JhcGhFbGVtZW50IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MTUxRjdGQTAyOTUiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDE1MzBFNDUwMzlGIj4KLSAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HenN2RnVmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iMSIvPgotICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0d6c3ZGZWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIxIi8+Ci0gICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTUzMTVERDAwNDciIG5hbWU9ImRpYWdyYW0iIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQxNTMwRTM0MDE1NiIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MTUzMTVEQjAzMDEiPgotICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0d6c3ZNdWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3pzdk1lZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IjEiLz4KLSAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTUzMEEzNzAxMUIiIG5hbWU9IkdyYXBoTm9kZSI+Ci0gICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTUzMEUyQjAyMUIiIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0MTUxRjdGQTAyOTUiLz4KLSAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxNTMxNUFCMDBBOSIgbmFtZT0ic2l6ZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDE1MjBCMUMwMkUxIi8+Ci0gICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDE1MzBFMzQwMTU2IiBuYW1lPSJEaWFncmFtIj4KLSAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxNTMwRTNBMDNDQiIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQxNTMwQTM3MDExQiIvPgotICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDE1MzE1QzUwMDEwIiBuYW1lPSJ6b29tIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il9BVXE4SU94M0VkdTUtdlZqbGZWc2ZRIj4KLSAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9kNFVJd2V5T0VkdUZLSm92Qkw2NFhRIiB2YWx1ZT0iMSIvPgotICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX2Q0VUl3T3lPRWR1RktKb3ZCTDY0WFEiLz4KLSAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxNTMxNUNDMDI2OSIgbmFtZT0idmlld3BvaW50IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MTUxRjc0RDAwOTEiLz4KLSAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxNTMxNUREMDAzRCIgbmFtZT0iZGlhZ3JhbUxpbmsiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQxNTMwQTI2MDJGOCIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MTUzMTVEQjAzMDEiPgotICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0d6c3ZMLWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3pzdkx1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDE1MzFDMTgwMEZGIiBuYW1lPSJuYW1lc3BhY2UiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQxNTMxNjZBMDIwMiIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MTUzMUMxNzAxNEQiPgotICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0d6c3ZQZWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3pzdlBPZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IjEiLz4KLSAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTUzMTY2QTAyMDIiIG5hbWU9IlNlbWFudGljTW9kZWxCcmlkZ2UiIGlzQWJzdHJhY3Q9InRydWUiPgotICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDFFNDk0REQwMkM5IiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDE1MjE3QzEwM0JFIi8+Ci0gICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTUzMUQzQTAwQ0EiIG5hbWU9InByZXNlbnRhdGlvbiIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIj4KLSAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9QXzB6SWV5SEVkdTUtdlZqbGZWc2ZRIiB2YWx1ZT0iMSIvPgotICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX1BfMHpJT3lIRWR1NS12VmpsZlZzZlEiLz4KLSAgICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfUlF2QllPeUhFZHU1LXZWamxmVnNmUSIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyIgdmFsdWU9IiIvPgotICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDE1MzE2OTkwMDAzIiBuYW1lPSJncmFwaEVsZW1lbnQiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQxNTFGN0ZBMDI5NSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MTUzMTY5NzAzMDIiPgotICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0d6c3ZPZWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3pzdk9PZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDE1MzFDMTgwMTAxIiBuYW1lPSJkaWFncmFtIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MTUzMEUzNDAxNTYiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDE1MzFDMTcwMTREIj4KLSAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HenN2UU9mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iMSIvPgotICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0d6c3ZQLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTUzMUQ2NDAzNDEiIG5hbWU9IlNpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50Ij4KLSAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxNTMxREEwMDFCNyIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQxNTMxNjZBMDIwMiIvPgotICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDE1MzFEOTMwMzUzIiBuYW1lPSJ0eXBlSW5mbyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIj4KLSAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9iaGIxSWV5SEVkdTUtdlZqbGZWc2ZRIiB2YWx1ZT0iMSIvPgotICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX2JoYjFJT3lIRWR1NS12VmpsZlZzZlEiLz4KLSAgICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfYlJmVW9PeUhFZHU1LXZWamxmVnNmUSIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyIgdmFsdWU9IiIvPgotICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxNTMxRDcxMDAwQiIgbmFtZT0iVU1BU2VtYW50aWNNb2RlbEJyaWRnZSI+Ci0gICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTUzMURBMzAxODkiIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0MTUzMTY2QTAyMDIiLz4KLSAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxNTMyRkUzMDMyQyIgbmFtZT0iZWxlbWVudCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjgwIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQxNTMyRkUzMDEyMyI+Ci0gICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3oyZ0UtZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IjEiLz4KLSAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HejJnRXVmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iMSIvPgotICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxNTMxRDgyMDI5QSIgbmFtZT0iQ29yZVNlbWFudGljTW9kZWxCcmlkZ2UiPgotICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDE1MzFEQTUwMjY4IiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDE1MzE2NkEwMjAyIi8+Ci0gICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTUzMkZDNTAxOTgiIG5hbWU9ImVsZW1lbnQiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQxRERFNjY4MDBDRSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MTUzMkZDNDAzMjciPgotICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0d6c3ZST2ZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3pzdlEtZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IjEiLz4KLSAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTUzMzQyQTAxRkEiIG5hbWU9IkxlYWZFbGVtZW50IiBpc0Fic3RyYWN0PSJ0cnVlIj4KLSAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxNTMzNDlDMDE3MSIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQxNTIxN0MxMDNCRSIvPgotICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxNTMzNDM2MDIzRCIgbmFtZT0iVGV4dEVsZW1lbnQiPgotICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDE1MzM2OUYwMDhDIiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDE1MzM0MkEwMUZBIi8+Ci0gICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTUzMzVDQzAzNDUiIG5hbWU9InRleHQiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyI+Ci0gICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfSGxseHdleUhFZHU1LXZWamxmVnNmUSIgdmFsdWU9IjEiLz4KLSAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9IbGx4d095SEVkdTUtdlZqbGZWc2ZRIi8+Ci0gICAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iX0hXc2FJT3lIRWR1NS12VmpsZlZzZlEiIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiIHZhbHVlPSIiLz4KLSAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTUzMzQzRjAwMTkiIG5hbWU9IkltYWdlIj4KLSAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxNTMzNkExMDJEMyIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQxNTMzNDJBMDFGQSIvPgotICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDE1MzM1RDMwMUU3IiBuYW1lPSJ1cmkiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQxMTNFQTI5MDJGRSI+Ci0gICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeXFSNzBleU9FZHVGS0pvdkJMNjRYUSIgdmFsdWU9IjEiLz4KLSAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95cVI3ME95T0VkdUZLSm92Qkw2NFhRIi8+Ci0gICAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iX3lnUzVZT3lPRWR1RktKb3ZCTDY0WFEiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MTEzRUEyOTAyRkUiIHZhbHVlPSIiLz4KLSAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxNTMzNjhBMDE4NiIgbmFtZT0ibWltZVR5cGUiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyI+Ci0gICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfWm1VQnNleUdFZHU1LXZWamxmVnNmUSIgdmFsdWU9IjEiLz4KLSAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9abVVCc095R0VkdTUtdlZqbGZWc2ZRIi8+Ci0gICAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iX1plYXA4T3lHRWR1NS12VmpsZlZzZlEiIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiIHZhbHVlPSIiLz4KLSAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTUzMzQ0NjAwMzciIG5hbWU9IkdyYXBoaWNQcmltaXRpdmUiIGlzQWJzdHJhY3Q9InRydWUiPgotICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDE1MzM2QTQwMjkyIiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDE1MzM0MkEwMUZBIi8+Ci0gICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDE1MzM1MDEwMTgxIiBuYW1lPSJQb2x5bGluZSI+Ci0gICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTUzMzUxODAzMjgiIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0MTUzMzQ0NjAwMzciLz4KLSAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxNTMzNkU5MDNEQiIgbmFtZT0iY2xvc2VkIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il81R2NZQU9pZUVkdVFidVk2VXdNU1FnIj4KLSAgICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJfR3pqbFB1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iXzVHY1lBT2llRWR1UWJ1WTZVd01TUWciPgotICAgICAgICAgICAgPGJvZHk+dHJ1ZTwvYm9keT4KLSAgICAgICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxNTMzNThCMDM2QSIgbmFtZT0id2F5cG9pbnRzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MTUxRjc0RDAwOTEiIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDE1MzM1OEIwMTYxIj4KLSAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HejJnR3VmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0d6MmdHZWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIyIi8+Ci0gICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDE1MzM1MDkwMDM4IiBuYW1lPSJFbGxpcHNlIj4KLSAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxNTMzNTFCMDNFMSIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQxNTMzNDQ2MDAzNyIvPgotICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDE1MzM1MjMwMDIxIiBuYW1lPSJjZW50ZXIiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQxNTFGNzREMDA5MSIvPgotICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDE1MzM1MjkwMDg0IiBuYW1lPSJyYWRpdXNYIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il9BVXE4SU94M0VkdTUtdlZqbGZWc2ZRIi8+Ci0gICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTUzMzUzMTAzNTYiIG5hbWU9InJhZGl1c1kiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX0FVcThJT3gzRWR1NS12VmpsZlZzZlEiLz4KLSAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxNTMzNTNEMDM3MiIgbmFtZT0icm90YXRpb24iIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX0FVcThJT3gzRWR1NS12VmpsZlZzZlEiLz4KLSAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxNTMzNTQ3MDM0RSIgbmFtZT0ic3RhcnRBbmdsZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfQVVxOElPeDNFZHU1LXZWamxmVnNmUSIvPgotICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDE1MzM1NTYwMkY1IiBuYW1lPSJlbmRBbmdsZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfQVVxOElPeDNFZHU1LXZWamxmVnNmUSIvPgotICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxNTMwNzU4MDExRiIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDE1MzA3NTkwMDNBIF8zQURDN0I3NDAyMkQ0MTUzMDc1OTAwNDQiLz4KLSAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDE1MzA5MzgwMzQ2IiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0MTUzMDkzOTAyMTEgXzNBREM3Qjc0MDIyRDQxNTMwOTM5MDIxMyIvPgotICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTUzMDlCQzAyNDEiIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQxNTMwOUJEMDE1QyBfM0FEQzdCNzQwMjJENDE1MzA5QkQwMTVFIj4KLSAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxNTMwOUJEMDE1RSIgbmFtZT0iX2RpYWdyYW1FbGVtZW50IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MTUyMTdDMTAzQkUiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MTUzMDlCQzAyNDEiPgotICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0d6amxXLWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3pqbFd1ZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IjEiLz4KLSAgICAgICAgPC9vd25lZEVuZD4KLSAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTUzMEU0NTAzOUYiIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQxNTMwRTQ2MDI5QyBfM0FEQzdCNzQwMjJENDE1MzBFNDYwMjlFIi8+Ci0gICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxNTMwRTdDMDBENyIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDE1MzBFN0UwMTcwIF8zQURDN0I3NDAyMkQ0MTUzMEU3RTAxN0EiLz4KLSAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDE1MzBGRjIwMzYwIiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0MTUzMEZGMzAxNjIgXzNBREM3Qjc0MDIyRDQxNTMwRkYzMDE2NCIvPgotICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTUzMTQ4NTAzOTYiIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQxNTMxNDg2MDI2QiBfM0FEQzdCNzQwMjJENDE1MzE0ODYwMjZEIj4KLSAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxNTMxNDg2MDI2RCIgbmFtZT0iX2dyYXBoRWRnZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDE1MzBBMTIwMjQ1IiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDE1MzE0ODUwMzk2Ij4KLSAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HenN2Sy1mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iMSIvPgotICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0d6c3ZLdWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIxIi8+Ci0gICAgICAgIDwvb3duZWRFbmQ+Ci0gICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDE1MzE1REIwMzAxIiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0MTUzMTVERDAwM0QgXzNBREM3Qjc0MDIyRDQxNTMxNUREMDA0NyIvPgotICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTUzMTY5NzAzMDIiIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQxNTMxNjk5MDAwMSBfM0FEQzdCNzQwMjJENDE1MzE2OTkwMDAzIi8+Ci0gICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxNTMxQzE3MDE0RCIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDE1MzFDMTgwMEZGIF8zQURDN0I3NDAyMkQ0MTUzMUMxODAxMDEiLz4KLSAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDE1MzJGQzQwMzI3IiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0MTUzMkZDNTAxOTggXzNBREM3Qjc0MDIyRDQxNTMyRkM1MDFBMyI+Ci0gICAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTUzMkZDNTAxQTMiIG5hbWU9Il9jb3JlU2VtYW50aWNNb2RlbEJyaWRnZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDE1MzFEODIwMjlBIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDE1MzJGQzQwMzI3Ij4KLSAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HenN2Ui1mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0d6c3ZSdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgPC9vd25lZEVuZD4KLSAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTUzMkZFMzAxMjMiIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQxNTMyRkUzMDMyQyBfM0FEQzdCNzQwMjJENDE1MzJGRTMwMzQwIj4KLSAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxNTMyRkUzMDM0MCIgbmFtZT0iX3VNQVNlbWFudGljTW9kZWxCcmlkZ2UiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQxNTMxRDcxMDAwQiIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQxNTMyRkUzMDEyMyI+Ci0gICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3oyZ0Z1ZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HejJnRmVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgIDwvb3duZWRFbmQ+Ci0gICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDE1MzM1OEIwMTYxIiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0MTUzMzU4QjAzNkEgXzNBREM3Qjc0MDIyRDQxNTMzNThCMDM3NCI+Ci0gICAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTUzMzU4QjAzNzQiIG5hbWU9Il9wb2x5bGluZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDE1MzM1MDEwMTgxIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDE1MzM1OEIwMTYxIj4KLSAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HejJnSGVmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iMSIvPgotICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0d6MmdIT2ZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIxIi8+Ci0gICAgICAgIDwvb3duZWRFbmQ+Ci0gICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6UGFja2FnZSIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDFEREU2MjAwMUNGIiBuYW1lPSJVTUwySW5mcmFzdHJ1Y3R1cmVNaW5pIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfR3h3MWF1ZlhFZHVxSG9PSmJVUlpSdyIgc291cmNlPSJ1bWwyLmRpYWdyYW1zIiByZWZlcmVuY2VzPSJfM0FEQzdCNzQwMjJENDFERjJDNDMwMTUxIj4KLSAgICAgICAgPGNvbnRlbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpEaWFncmFtIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MURGMkM0MzAxNTEiIHR5cGU9IkNsYXNzIiBuYW1lPSJNYWluIj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5DY3MtZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRERGODY5MDEyRSI+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5DY3R1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9ITkNjdC1mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOTG1FT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITkxtRWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5MbUV1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5MbUUtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlBhY2thZ2VDb250ZW50cyI+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE5MbUZPZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIgY29sbGFwc2VkPSJ0cnVlIi8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSE5DY3RPZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJOb25lIiBzaG93TGlzdFZpc2liaWxpdHk9Ik5vbmUiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hOQ2N0ZWZYRWR1cUhvT0piVVJaUnciIHg9IjM1NSIgeT0iODYzIiB3aWR0aD0iMjU0MCIgaGVpZ2h0PSIxNjc2Ii8+Ci0gICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5MbUZlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxMTlBNjJCMDM2RiI+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5MbUdPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9ITkxtR2VmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOTG1HdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITkxtRy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5MbUhPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5MbUhlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlBhY2thZ2VDb250ZW50cyI+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE5MbUh1ZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIgY29sbGFwc2VkPSJ0cnVlIi8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSE5MbUZ1ZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJOb25lIiBzaG93TGlzdFZpc2liaWxpdHk9Ik5vbmUiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hOTG1GLWZYRWR1cUhvT0piVVJaUnciIHg9IjMwOTgiIHk9Ijg2MyIgd2lkdGg9IjMyMjciIGhlaWdodD0iMTY3NiIvPgotICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MRGlhZ3JhbVN0eWxlIiB4bWk6aWQ9Il9HeHcxYk9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPgotICAgICAgICA8L2NvbnRlbnRzPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0d3dVRvT2ZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURERTYyMDAxQ0YiPgotICAgICAgICA8Ym9keT4wMjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOlBhY2thZ2UiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxMTlBNjJCMDM2RiIgbmFtZT0iUHJpbWl0aXZlVHlwZXMiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iX0d4ZDZjT2ZYRWR1cUhvT0piVVJaUnciIHNvdXJjZT0idW1sMi5kaWFncmFtcyIvPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0d3NEVrdWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTE5QTYyQjAzNkYiPgotICAgICAgICAgIDxib2R5PjAwPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjQ0OThEMDE4NSIgbmFtZT0iRGF0ZSI+Ci0gICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HdzRFbGVmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGNDQ5OEQwMTg1Ij4KLSAgICAgICAgICAgIDxib2R5PkRhdGEgdHlwZSB1c2VkIGZvciBhdHRyaWJ1dGVzIG9mIG1ldGEtbW9kZWwgY2xhc3NlcyBvZiB0aGUgdHlwZSBEYXRlLjwvYm9keT4KLSAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTEzRUEyOTAyRkUiIG5hbWU9IlVyaSI+Ci0gICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HeEJPZ2VmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDExM0VBMjkwMkZFIj4KLSAgICAgICAgICAgIDxib2R5PkRhdGEgdHlwZSB1c2VkIGZvciBhdHRyaWJ1dGVzIG9mIG1ldGEtbW9kZWwgY2xhc3NlcyB0aGF0IHBvaW50IHRvIHJlc291cmNlcyBzdWNoIGFzIGZpbGVzLjwvYm9keT4KLSAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiIG5hbWU9IlN0cmluZyI+Ci0gICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9pN0ZUb09pZkVkdVFidVk2VXdNU1FnIiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIj4KLSAgICAgICAgICAgIDxib2R5PkEgc3RyaW5nIGlzIGEgc2VxdWVuY2Ugb2YgY2hhcmFjdGVycyBpbiBzb21lIHN1aXRhYmxlIGNoYXJhY3RlciBzZXQgdXNlZCB0byBkaXNwbGF5IGluZm9ybWF0aW9uIGFib3V0IHRoZSBtb2RlbC4gQ2hhcmFjdGVyIHNldHMgbWF5IGluY2x1ZGUgbm9uLVJvbWFuIGFscGhhYmV0cyBhbmQgY2hhcmFjdGVycy48L2JvZHk+Ci0gICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgeG1pOmlkPSJfM0FEQzdCNzQwMjJEM0YwOTg5QjkwMjkwIiBuYW1lPSJTZXQiLz4KLSAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDNGMDk4OTlDMDBFQSIgbmFtZT0iU2VxdWVuY2UiLz4KLSAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDNDQTAxMEE0MDA3QiIgbmFtZT0iSW50ZWdlciI+Ci0gICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9kVWM2b09vRkVkdU9CUFFBMmhLcVVRIiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJEM0NBMDEwQTQwMDdCIj4KLSAgICAgICAgICAgIDxib2R5PkFuIGludGVnZXIgaXMgYSBwcmltaXRpdmUgdHlwZSByZXByZXNlbnRpbmcgaW50ZWdlciB2YWx1ZXMuPC9ib2R5PgotICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIHhtaTppZD0iXzVHY1lBT2llRWR1UWJ1WTZVd01TUWciIG5hbWU9IkJvb2xlYW4iPgotICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfNUdjWUFlaWVFZHVRYnVZNlV3TVNRZyIgYW5ub3RhdGVkRWxlbWVudD0iXzVHY1lBT2llRWR1UWJ1WTZVd01TUWciPgotICAgICAgICAgICAgPGJvZHk+QSBCb29sZWFuIHR5cGUgaXMgdXNlZCBmb3IgbG9naWNhbCBleHByZXNzaW9uLCBjb25zaXN0aW5nIG9mIHRoZSBwcmVkZWZpbmVkIHZhbHVlcyB0cnVlIGFuZCBmYWxzZS48L2JvZHk+Ci0gICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgeG1pOmlkPSJfQVVxOElPeDNFZHU1LXZWamxmVnNmUSIgbmFtZT0iRG91YmxlIi8+Ci0gICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpQYWNrYWdlIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MURERjg2OTAxMkUiIG5hbWU9IkNvbnN0cnVjdHMiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iX0d4dzFaLWZYRWR1cUhvT0piVVJaUnciIHNvdXJjZT0idW1sMi5kaWFncmFtcyIgcmVmZXJlbmNlcz0iXzNBREM3Qjc0MDIyRDQxRERFNjM2MDAwNCI+Ci0gICAgICAgICAgPGNvbnRlbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpEaWFncmFtIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MURERTYzNjAwMDQiIHR5cGU9IkNsYXNzIiBuYW1lPSJNYWluIj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITTRyY3VmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFEREU2NjgwMENFIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hNNHJkZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9ITTRyZHVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTY5MyIgaGVpZ2h0PSIxMDgzIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITTRyZC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITTRyZU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITTRyZWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hNNHJldWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hNNHJlLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hNNHJmT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hNNHJmZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hNNHJmdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hNNHJmLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hNNHJnT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITTRyZ2VmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hNNHJjLWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hNNHJkT2ZYRWR1cUhvT0piVVJaUnciIHg9IjU5MzciIHk9Ijk5NiIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITTRyZ3VmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFEREVDQjUwMDk4Ij4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hNNHJoZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9ITTRyaHVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITTRyaC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITTRyaU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITTRyaWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hNNHJpdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hNNHJpLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hNNHJqT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hNNHJqZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hNNHJqdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hNNHJqLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hNNHJrT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITTRya2VmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hNNHJnLWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hNNHJoT2ZYRWR1cUhvT0piVVJaUnciIHg9Ijk2NSIgeT0iNjgyNCIgd2lkdGg9IjE1MjQiIGhlaWdodD0iNzY1Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hNNHJrdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURERTY1ODAxNTciPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE00cmxlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hNNHJsdWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOQ2NJT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOQ2NJZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOQ2NJdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5DY0ktZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE5DY0pPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5DY0plZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE5DY0p1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5DY0otZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE5DY0tPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5DY0tlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hOQ2NLdWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSE00cmstZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSE00cmxPZlhFZHVxSG9PSmJVUlpSdyIgeD0iNzk1IiB5PSI5MjIwIiB3aWR0aD0iMjM2NCIgaGVpZ2h0PSI5MDciLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5DY05PZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRERGQTQ0MDNBOCI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITkNjTi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSE5DY09PZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5DY09lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5DY091ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5DY08tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITkNjUE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITkNjUGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITkNjUHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITkNjUC1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITkNjUU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITkNjUWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITkNjUXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE5DY1EtZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9ITkNjTmVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ITkNjTnVmWEVkdXFIb09KYlVSWlJ3IiB4PSI5MjIwIiB5PSI1MzAwIiB3aWR0aD0iMzEzMiIgaGVpZ2h0PSI3MTIiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5DY1JPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRERFMDYyMDJENSI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITkNjUi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSE5DY1NPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5DY1NlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5DY1N1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5DY1MtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITkNjVE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hOQ2NUZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOQ2NUdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hOQ2NULWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOQ2NVT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hOQ2NVZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOQ2NVdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITkNjVS1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hOQ2NSZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iTm9uZSIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hOQ2NSdWZYRWR1cUhvT0piVVJaUnciIHg9IjUyNDkiIHk9IjI2NjciIHdpZHRoPSIzMjg2IiBoZWlnaHQ9IjExMjQiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5DY2ItZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRERFODMzMDFBNSI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITkNjY3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSE5DY2MtZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5DY2RPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5DY2RlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5DY2R1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITkNjZC1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITkNjZU9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITkNjZWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITkNjZXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITkNjZS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITkNjZk9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITkNjZmVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE5DY2Z1ZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9ITkNjY09mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ITkNjY2VmWEVkdXFIb09KYlVSWlJ3IiB4PSI0NzE1IiB5PSI1MzUwIiB3aWR0aD0iNDE0MSIgaGVpZ2h0PSI2NTkiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5DY2tlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRERGQTM2MDJDMSI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITkNjbE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSE5DY2xlZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5DY2x1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5DY2wtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5DY21PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITkNjbWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITkNjbXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITkNjbS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITkNjbk9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITkNjbmVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITkNjbnVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITkNjbi1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE5DY29PZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9ITkNja3VmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ITkNjay1mWEVkdXFIb09KYlVSWlJ3IiB4PSI5NDkxIiB5PSI4NjYxIiB3aWR0aD0iMjIyMCIgaGVpZ2h0PSI4MjciLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxEaWFncmFtU3R5bGUiIHhtaTppZD0iX0d4dzFhZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4KLSAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9ITkNjSy1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFEREY4QkQwMjhGIiBzb3VyY2U9Il9ITTRya3VmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9ITTRyZ3VmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOQ2NMdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOQ2NNT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5DY01lZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ITkNjTC1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9ITkNjTE9mWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hOQ2NMZWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzAsIC01NDEsIDAsIDE4NDVdJFswLCAtMTg0NSwgMCwgNTQxXSIvPgotICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSE5DY011ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9ITkNjTS1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSE5DY1ZPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRERFQ0FGMDIwMiIgc291cmNlPSJfSE5DY1JPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSE00cmN1ZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITkNjVi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITkNjV2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOQ2NXdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSE5DY1dPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSE5DY1ZlZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9ITkNjVnVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9Ils4LCAtNzk1LCAtNDIsIDE0OTBdJFszMywgLTE3NDQsIC0xNiwgNTQxXSIvPgotICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSE5DY1ctZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9ITkNjWE9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSE5DY1hlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRERGOTEyMDNDMCIgc291cmNlPSJfSE00cmd1ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSE5DY1JPZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITkNjWU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITkNjWXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOQ2NZLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSE5DY1llZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSE5DY1h1ZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9ITkNjWC1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9Ils2NjgsIC01NTAsIC00MjU4LCAzMzYxXSRbMzkyMCwgLTMxMjQsIC0xMDA3LCA3ODddIi8+Ci0gICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9ITkNjWk9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hOQ2NaZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9ITkNjWnVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFEREZCNDUwM0Q1IiBzb3VyY2U9Il9ITkNjTk9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9ITkNjUk9mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOQ2NhZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOQ2NhLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5DY2JPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ITkNjYXVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9ITkNjWi1mWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hOQ2NhT2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy04NDYsIC01NTAsIDI4NjEsIDE4MzddJFstMjQ3MiwgLTE2MDAsIDEyMzYsIDc4N10iLz4KLSAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hOQ2NiZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSE5DY2J1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hOQ2NmLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURERjhENDAyMTEiIHNvdXJjZT0iX0hOQ2NiLWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hOQ2NST2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5DY2d1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5DY2hPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITkNjaGVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hOQ2NnLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hOQ2NnT2ZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSE5DY2dlZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMCwgLTU1MCwgMCwgMTg4OF0kWzAsIC0xNjUxLCAwLCA3ODddIi8+Ci0gICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9ITkNjaHVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hOQ2NoLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9ITkNjaU9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFEREY3MUIwM0E4IiBzb3VyY2U9Il9ITTRyZ3VmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9ITkNjYi1mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOQ2NpLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOQ2NqZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5DY2p1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ITkNjak9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9ITkNjaWVmWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hOQ2NpdWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzc2MiwgLTIzNywgLTQxNjUsIDEyMzZdJFszMDkwLCAtOTMxLCAtMTgzNywgNTQxXSIvPgotICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSE5DY2otZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9ITkNja09mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSE5DY29lZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRERGQkNBMDBFOSIgc291cmNlPSJfSE5DY2tlZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSE5DY05PZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITkNjcE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITkNjcHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOQ2NwLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSE5DY3BlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSE5DY291ZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9ITkNjby1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlswLCAtNTQxLCAwLCAyODEwXSRbMCwgLTI4MTAsIDAsIDU0MV0iLz4KLSAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hOQ2NxT2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSE5DY3FlZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hOQ2NxdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURERkJDRjAyQTkiIHNvdXJjZT0iX0hOQ2NrZWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hOQ2NiLWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5DY3JlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5DY3ItZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITkNjc09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hOQ2NydWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hOQ2NxLWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSE5DY3JPZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTYwMSwgLTU0MSwgMzEwNywgMjc2MF0kWy0zMDk4LCAtMjc2MCwgNjA5LCA1NDFdIi8+Ci0gICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9ITkNjc2VmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hOQ2NzdWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICA8L2NvbnRlbnRzPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MURERTY1ODAxNTciIG5hbWU9IkNsYXNzaWZpZXIiIGlzQWJzdHJhY3Q9InRydWUiPgotICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3hkNmR1ZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRERFNjU4MDE1NyI+Ci0gICAgICAgICAgICA8Ym9keT5VTUwgMi4wIG1ldGEtY2xhc3MgQ2xhc3NpZmllci48L2JvZHk+Ci0gICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxRERGOEJEMDI4RiIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQxRERFQ0I1MDA5OCIvPgotICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MURERTY2ODAwQ0UiIG5hbWU9IkVsZW1lbnQiIGlzQWJzdHJhY3Q9InRydWUiPgotICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3hucmMtZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRERFNjY4MDBDRSI+Ci0gICAgICAgICAgICA8Ym9keT5VTUwgMi4wIG1ldGEtY2xhc3MgRWxlbWVudC48L2JvZHk+Ci0gICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxRERFMDYyMDJENSIgbmFtZT0iTmFtZWRFbGVtZW50IiBpc0Fic3RyYWN0PSJ0cnVlIj4KLSAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0d4bnJkdWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURERTA2MjAyRDUiPgotICAgICAgICAgICAgPGJvZHk+VU1MIDIuMCBtZXRhLWNsYXNzIE5hbWVkIEVsZW1lbnQuICBEZWZpbmVkIHRoYXQgZXZlcnkgZWxlbWVudCBoYXMgYSBuYW1lLjwvYm9keT4KLSAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDFEREVDQUYwMjAyIiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDFEREU2NjgwMENFIi8+Ci0gICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxRERGQzhFMDBCNiIgbmFtZT0ibmFtZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIj4KLSAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0Vnc3lnZXlKRWR1NS12VmpsZlZzZlEiIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9FZ3N5Z095SkVkdTUtdlZqbGZWc2ZRIi8+Ci0gICAgICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfRVlwcHdPeUpFZHU1LXZWamxmVnNmUSIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyIgdmFsdWU9IiIvPgotICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxRERFODMzMDFBNSIgbmFtZT0iUGFja2FnZWFibGVFbGVtZW50IiBpc0Fic3RyYWN0PSJ0cnVlIj4KLSAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0d4bnJlLWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURERTgzMzAxQTUiPgotICAgICAgICAgICAgPGJvZHk+VU1MIDIuMCBtZXRhLWNsYXNzIFBhY2thZ2FibGUgRWxlbWVudC48L2JvZHk+Ci0gICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxRERGOEQ0MDIxMSIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQxRERFMDYyMDJENSIvPgotICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MURERUNCNTAwOTgiIG5hbWU9IlR5cGUiIGlzQWJzdHJhY3Q9InRydWUiPgotICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3hucmYtZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRERFQ0I1MDA5OCI+Ci0gICAgICAgICAgICA8Ym9keT5VTUwgMi4wIG1ldGEtY2xhc3MgVHlwZS48L2JvZHk+Ci0gICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxRERGNzFCMDNBOCIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQxRERFODMzMDFBNSIvPgotICAgICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MURERjkxMjAzQzAiIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0MURERTA2MjAyRDUiLz4KLSAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDFEREZBMzYwMkMxIiBuYW1lPSJQYWNrYWdlIj4KLSAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0d4bnJoT2ZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURERkEzNjAyQzEiPgotICAgICAgICAgICAgPGJvZHk+VU1MIDIuMCBtZXRhLWNsYXNzIFBhY2thZ2UuPC9ib2R5PgotICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MURERkJDQTAwRTkiIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0MURERkE0NDAzQTgiLz4KLSAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDFEREZCQ0YwMkE5IiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDFEREU4MzMwMUE1Ii8+Ci0gICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxRERGQTQ0MDNBOCIgbmFtZT0iTmFtZXNwYWNlIiBpc0Fic3RyYWN0PSJ0cnVlIj4KLSAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0d4dzFaT2ZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURERkE0NDAzQTgiPgotICAgICAgICAgICAgPGJvZHk+VU1MIDIuMCBtZXRhLWNsYXNzIE5hbWVzcGFjZS48L2JvZHk+Ci0gICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxRERGQjQ1MDNENSIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQxRERFMDYyMDJENSIvPgotICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpQYWNrYWdlIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkQwNDAwRjEiIG5hbWU9IlVuaWZpZWRNZXRob2RBcmNoaXRlY3R1cmUiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il9Hd3VUbXVmWEVkdXFIb09KYlVSWlJ3IiBzb3VyY2U9InVtbDIuZGlhZ3JhbXMiIHJlZmVyZW5jZXM9Il8zQURDN0I3NDAyMkQ0MEY1NjRGQTAwOTUiPgotICAgICAgICA8Y29udGVudHMgeG1pOnR5cGU9Im5vdGF0aW9uOkRpYWdyYW0iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjU2NEZBMDA5NSIgdHlwZT0iQ2xhc3MiIG5hbWU9Ik1haW4iPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITEdpdHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOb3RlIj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITEdpdWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJEaWFncmFtTmFtZSI+Ci0gICAgICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSExHaXV1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRGVzY3JpcHRpb24iPgotICAgICAgICAgICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246U2hhcGVTdHlsZSIgeG1pOmlkPSJfSExHaXQtZlhFZHVxSG9PSmJVUlpSdyIgZm9udE5hbWU9IkFyaWFsIiBkZXNjcmlwdGlvbj0iRGVmaW5lcyBkaWFncmFtcyBmb3IgcHJvY2VzcyB2aXN1YWxpemF0aW9uIGJhc2VkIG9uIHRoZSBVTUwyIGRpYWdyYW0gaW50ZXJjaGFuZ2Ugc3RhbmRhcmQuICBDb250YWlucyBkaWFncmFtcyBmb3Igd29ya2Zsb3dzLCB3b3JrIHByb2R1Y3QgZGVwZW5kZW5jaWVzLCBhbmQgdGVhbSBicmVha2Rvd25zLiIgbGluZUNvbG9yPSIwIi8+Ci0gICAgICAgICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+Ci0gICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ITEdpdU9mWEVkdXFIb09KYlVSWlJ3IiB4PSIyMjcwNyIgeT0iNDQ2MSIgd2lkdGg9Ijc1MjYiIGhlaWdodD0iMjA0OCIvPgotICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hMR2l1LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5vdGUiPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hMR2l2dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkRpYWdyYW1OYW1lIj4KLSAgICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITEdpdi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJEZXNjcmlwdGlvbiI+Ci0gICAgICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpTaGFwZVN0eWxlIiB4bWk6aWQ9Il9ITEdpdk9mWEVkdXFIb09KYlVSWlJ3IiBmb250TmFtZT0iQXJpYWwiIGRlc2NyaXB0aW9uPSJEZWZpbmVzIGhvdyBjb3JlIGNvbnRlbnQgZWxlbWVudHMgY2FuIGJlIG9yZ2FuaXplZCBmb3IgaW5zdGFudGlhdGlvbiBpbiBwcm9jZXNzZXMuICBQcm9jZXNzZXMgaGF2ZSBsb2NhbCBzY2hlbWVzIGZhY2lsaXRhdGluZyByZWRlZmluaXRpb24gb2YgcmVsYXRpb25zaGlwcyBiZXR3ZWVuIFJvbGVzLCBUYXNrcywgYW5kIFdvcmtQcm9kdWN0cy4gVGhlcmUgYXJlIHR3byBtYWluIHZhcmlhdGlvbnMgb2YgcHJvY2VzcyBkZWZpbmVkOiBEZWxpdmVyeSBQcm9jZXNzZXMsIHdoaWNoIGRlc2NyaWJlcyBlbmQtdG8tZW5kIHdheXMgb2YgZG9pbmcgYSAmcXVvdDtwcm9qZWN0JnF1b3Q7IGFzIHdlbGwgYXMgQ2FwYWJpbGl0eSBQYXR0ZXJucywgd2hpY2ggcHJvdmlkZSByZXVzdWFibGUgcGFydHMgdGhhdCBjYW4gYmUgdXNlZCB0byBjb21wb3NlIERlbGl2ZXJ5IFByb2Nlc3Nlcy4mI3hBOyIgbGluZUNvbG9yPSIwIi8+Ci0gICAgICAgICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+Ci0gICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ITEdpdmVmWEVkdXFIb09KYlVSWlJ3IiB4PSIyMjc0OSIgeT0iNzY4NyIgd2lkdGg9IjcwMzUiIGhlaWdodD0iNDU0NiIvPgotICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hMR2l3T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5vdGUiPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hMR2l3LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkRpYWdyYW1OYW1lIj4KLSAgICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITEdpeE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJEZXNjcmlwdGlvbiI+Ci0gICAgICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpTaGFwZVN0eWxlIiB4bWk6aWQ9Il9ITEdpd2VmWEVkdXFIb09KYlVSWlJ3IiBmb250TmFtZT0iQXJpYWwiIGRlc2NyaXB0aW9uPSJEZWZpbmVzIGEgcGx1Z2luIG1lY2hhbmlzbSB3aGljaCByZWxpZXMgb24gcGFja2FnaW5nIGFzIHdlbGwgYXMgbmV3IHJlbGF0aW9uc2hpcCB0eXBlcyBmb3IgY29udGVudCBhbmQgcHJvY2VzcyBlbGVtZW50cyB0aGF0IGFsbG93IGRlY2xhcmluZyBjaGFuZ2UgZGVsdGFzIHdpdGhvdXQgZGlyZWN0bHkgbW9kaWZ5aW5nIHRoZSBzb3VyY2UuIiBsaW5lQ29sb3I9IjAiLz4KLSAgICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4KLSAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hMR2l3dWZYRWR1cUhvT0piVVJaUnciIHg9IjMxNyIgeT0iMjg1MyIgd2lkdGg9IjY1NDQiIGhlaWdodD0iMjMxMSIvPgotICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hMR2l4ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5vdGUiPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hMR2l5T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkRpYWdyYW1OYW1lIj4KLSAgICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITEdpeWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJEZXNjcmlwdGlvbiI+Ci0gICAgICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpTaGFwZVN0eWxlIiB4bWk6aWQ9Il9ITEdpeHVmWEVkdXFIb09KYlVSWlJ3IiBmb250TmFtZT0iQXJpYWwiIGRlc2NyaXB0aW9uPSJEZWZpbmVzIGtleSBjb250ZW50IGVsZW1lbnRzIHN1Y2ggYXMgUm9sZXMsIFdvcmtQcm9kdWN0cywgVGFza3MsIHRoZWlyIGF0dHJpYnV0ZXMsIGFuZCB0aGVpciBkZWZhdWx0IHJlbGF0aW9uc2hpcHMuIEFsc28gZGVmaW5lcyBhIGJhc2ljIG1lY2hhbmlzbXMgdG8gb3JnYW5pemUgY29yZSBjb250ZW50IGluIHBhY2thZ2VzLiIgbGluZUNvbG9yPSIwIi8+Ci0gICAgICAgICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+Ci0gICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ITEdpeC1mWEVkdXFIb09KYlVSWlJ3IiB4PSI2MzQiIHk9Ijk4MjciIHdpZHRoPSI2MjgyIiBoZWlnaHQ9IjI4MDIiLz4KLSAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITEdpeXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOb3RlIj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITEdpemVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJEaWFncmFtTmFtZSI+Ci0gICAgICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSExQc1lPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRGVzY3JpcHRpb24iPgotICAgICAgICAgICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246U2hhcGVTdHlsZSIgeG1pOmlkPSJfSExHaXktZlhFZHVxSG9PSmJVUlpSdyIgZm9udE5hbWU9IkFyaWFsIiBkZXNjcmlwdGlvbj0iRGVmaW5lcyBob3cgcGx1Z2lucyBhcmUgZnVydGhlciBwYWNrYWdlZCBpbiBsaWJyYXJpZXMgYXMgd2VsbCBhcyBkZWZpbmVzIHRoZSBjb25jZXB0IG9mIGNvbmZpZ3VyYXRpb25zIGV4dGVuZGluZyB0aGUgcGx1Z2luIG1lY2hhbWlzbS4iIGxpbmVDb2xvcj0iMCIvPgotICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPgotICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSExHaXpPZlhFZHVxSG9PSmJVUlpSdyIgeD0iMjI3MDciIHk9IjE0OTAiIHdpZHRoPSI2Mjk5IiBoZWlnaHQ9IjE2OTMiLz4KLSAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITFBzWWVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUQwM0JGIj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITFBzWk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hMUHNaZWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSExQc1p1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hMUHNaLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITFBzYU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITFBzYWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iUGFja2FnZUNvbnRlbnRzIj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITFBzYXVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIiBjb2xsYXBzZWQ9InRydWUiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9ITFBzWXVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9Ik5vbmUiIHNob3dMaXN0VmlzaWJpbGl0eT0iTm9uZSIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSExQc1ktZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTQ5MzUiIHk9Ijg3MzciIHdpZHRoPSIzODYwIiBoZWlnaHQ9IjE2NzYiLz4KLSAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITFBzYS1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMEZCIj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITFBzYnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hMUHNiLWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSExQc2NPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hMUHNjZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITFBzY3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITFBzYy1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iUGFja2FnZUNvbnRlbnRzIj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITFBzZE9mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIiBjb2xsYXBzZWQ9InRydWUiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9ITFBzYk9mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9Ik5vbmUiIHNob3dMaXN0VmlzaWJpbGl0eT0iTm9uZSIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSExQc2JlZlhFZHVxSG9PSmJVUlpSdyIgeD0iODQ4MyIgeT0iMjc5NCIgd2lkdGg9IjM4NjAiIGhlaWdodD0iMTY3NiIvPgotICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hMUHNkZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRleHQiPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hMUHNlT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkRpYWdyYW1OYW1lIj4KLSAgICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITFBzZWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJEZXNjcmlwdGlvbiI+Ci0gICAgICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpTaGFwZVN0eWxlIiB4bWk6aWQ9Il9ITFBzZHVmWEVkdXFIb09KYlVSWlJ3IiBmb250TmFtZT0iQXJpYWwiIGZvbnRIZWlnaHQ9IjEyIiBib2xkPSJ0cnVlIiBkZXNjcmlwdGlvbj0iSUJNIFVuaWZpZWQgTWV0aG9kcyBBcmNoaXRlY3R1cmUgdjEuMC40OiBDb25jZXB0dWFsIE1ldGEtTW9kZWwiIGxpbmVDb2xvcj0iMCIvPgotICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPgotICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSExQc2QtZlhFZHVxSG9PSmJVUlpSdyIgeD0iMzU1IiB5PSI0NTciIHdpZHRoPSIxMzkxOSIgaGVpZ2h0PSI1MjQiLz4KLSAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITFBzZi1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDExOTk0QkYwMjgyIj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITFBzZ3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hMUHNnLWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSExQc2hPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hMUHNoZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITFBzaHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITFBzaC1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iUGFja2FnZUNvbnRlbnRzIj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITFBzaU9mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIiBjb2xsYXBzZWQ9InRydWUiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9ITFBzZ09mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9Ik5vbmUiIHNob3dMaXN0VmlzaWJpbGl0eT0iTm9uZSIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSExQc2dlZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTgxMDEiIHk9IjQ1NzIiIHdpZHRoPSIzNzI1IiBoZWlnaHQ9IjE2NzYiLz4KLSAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITFBzay1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMTdCIj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITFBzbHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hMUHNsLWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSExQc21PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hMUHNtZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITFBzbXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITFBzbS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iUGFja2FnZUNvbnRlbnRzIj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITFBzbk9mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIiBjb2xsYXBzZWQ9InRydWUiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9ITFBzbE9mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9Ik5vbmUiIHNob3dMaXN0VmlzaWJpbGl0eT0iTm9uZSIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSExQc2xlZlhFZHVxSG9PSmJVUlpSdyIgeD0iODEwMiIgeT0iMTAzNDYiIHdpZHRoPSIzNjE1IiBoZWlnaHQ9IjE3MTAiLz4KLSAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITFBzcS1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNTcwMDNCIj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITFBzcnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hMUHNyLWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSExQc3NPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hMUHNzZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITFBzc3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITFBzcy1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iUGFja2FnZUNvbnRlbnRzIj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITFBzdE9mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIiBjb2xsYXBzZWQ9InRydWUiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9ITFBzck9mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9Ik5vbmUiIHNob3dMaXN0VmlzaWJpbGl0eT0iTm9uZSIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSExQc3JlZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTUyODIiIHk9IjE0MTMiIHdpZHRoPSIzNDc5IiBoZWlnaHQ9IjE3MDEiLz4KLSAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTERpYWdyYW1TdHlsZSIgeG1pOmlkPSJfR3d1VG5PZlhFZHVxSG9PSmJVUlpSdyIgZGVzY3JpcHRpb249IlRoZSBVTUEgTWV0YS1Nb2RlbCBpcyBzdHJ1Y3R1cmVkIGFzIGRlcGljdGVkIGluIHRoZSBkaWFncmFtLiAgVGhlIHN0cnVjdHVyZSBkaXZpZGVzIHRoZSBtb2RlbCBpbiBsb2dpY2FsIHVuaXRzLiAgRWFjaCB1bml0IGV4dGVuZHMgdGhlIHVuaXRzIGl0IGRlcGVuZHMgdXBvbiBwcm92aWRpbmcgYWRkaXRpb25hbCBzdHJ1Y3R1cmVzIGFuZCBjYXBhYmlsaXRpZXMuICBPdmVyYWxsIHRoZSBVTUwgMi4wIHBhY2thZ2UgbWVyZ2UgbWVjaGFuaXNtIGFwcGxpZWQgdG8gdGhlIHBhY2thZ2VzIHJlYWxpemVzIGEgZ3JhZHVhbCBleHRlbnNpb24gb2YgdGhlIGNhcGFiaWxpdGllcyBtb2RlbGVkIHVuaXQgYnkgdW5pdC4gIEFzIGEgcmVzdWx0LCB1bml0cyBkZWZpbmVkIG9uIGEgbG93ZXIgbGF5ZXIgY2FuIGJlIHJlYWxpemVkIGJ5IGEgVU1BIHN1YnNldC1pbXBsZW1lbnRhdGlvbiB3aXRob3V0IHRoZSBoaWdoZXIgbGV2ZWwgdW5pdHMuICBGb3IgZXhhbXBsZSwgYW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIGNvdWxkIGJlIGJhc2VkIGp1c3Qgb24gdGhlIE1ldGhvZCBDb3JlIGFuZCBNZXRob2QgUGx1Z2luIHBhY2thZ2VzIHdpdGhvdXQgdXNpbmcgdGhlIGVsZW1lbnRzIGRlZmluZWQgaW4gdGhlIFByb2Nlc3MgcGFja2FnZS4gIEhvd2V2ZXIsIGlmIHRoZSBQcm9jZXNzIHBhY2thZ2Ugd291bGQgYmUgaW5jbHVkZWQgYXMgd2VsbCBmb3IgdGhlIGltcGxlbWVudGF0aW9uIHRoZW4gYWRkaXRpb25hbCBjYXBhYmlsaXRpZXMgZnJvbSB0aGUgUHJvY2VzcyBwYWNrYWdlIHdvdWxkIGJlIG1lcmdlZCBpbnRvIHRoZSBNZXRob2QgUGx1Z2luIHBhY2thZ2UuIi8+Ci0gICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPgotICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9ITFBzZXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOb3RlQXR0YWNobWVudCIgc291cmNlPSJfSExHaXUtZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSExQc1llZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSExQc2UtZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIvPgotICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPgotICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSExQc2ZPZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTM1MjIsIC0zMjEsIDU4NzUsIDU5XSRbLTc0NjcsIC0zMjEsIDE5MzAsIDU5XSIvPgotICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hMUHNmZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hMUHNmdWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hMUHNpZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5vdGVBdHRhY2htZW50IiBzb3VyY2U9Il9ITEdpdHVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9ITFBzZi1mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkNvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9ITFBzaXVmWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjAiLz4KLSAgICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4KLSAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hMUHNpLWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0zNzY3LCAwLCAyNzM0LCA3Nl0kWy00NjM5LCAwLCAxODYyLCA3Nl0iLz4KLSAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9ITFBzak9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9ITFBzamVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9ITFBzanVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOb3RlQXR0YWNobWVudCIgc291cmNlPSJfSExHaXdPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSExQc2EtZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSExQc2otZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIvPgotICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPgotICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSExQc2tPZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMzI2OCwgLTYzNSwgLTM0MzcsIC00NTddJFs0NzY2LCAtNjM1LCAtMTkzOCwgLTQ1N10iLz4KLSAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9ITFBza2VmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9ITFBza3VmWEVkdXFIb09KYlVSWlJ3IiBpZD0iKDAuMDg0NzE1MDIsMC44MTA4NTkyKSIvPgotICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hMUHNwdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5vdGVBdHRhY2htZW50IiBzb3VyY2U9Il9ITEdpeGVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9ITFBzay1mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkNvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9ITFBzcC1mWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjQxOTQzNjgiLz4KLSAgICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4KLSAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hMUHNxT2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzQzODUsIDYzNSwgLTE4MTEsIC0yMDNdJFszMTQxLCA0NTcsIC0zMDU2LCAtMzgxXSIvPgotICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hMUHNxZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hMUHNxdWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hMUHN4LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5vdGVBdHRhY2htZW50IiBzb3VyY2U9Il9ITEdpeXVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9ITFBzcS1mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkNvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9ITFBzeU9mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4Ii8+Ci0gICAgICAgICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+Ci0gICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9ITFBzeWVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstNzEwMywgLTkzLCAxNzM1LCAtMTZdJFstMzE1OCwgLTkzLCA1NjgxLCAtMTZdIi8+Ci0gICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSExQc3l1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSExQc3ktZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgPC9jb250ZW50cz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HaEV1QXVmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZEMDQwMEYxIj4KLSAgICAgICAgPGJvZHk+MDE8L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpQYWNrYWdlIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RDAzQkYiIG5hbWU9IlByb2Nlc3MiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iX0dvT2U2dWZYRWR1cUhvT0piVVJaUnciIHNvdXJjZT0idW1sMi5kaWFncmFtcyIgcmVmZXJlbmNlcz0iXzNBREM3Qjc0MDIyRDQwRkQ4NTZCMDI3NiI+Ci0gICAgICAgICAgPGNvbnRlbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpEaWFncmFtIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEZEODU2QjAyNzYiIHR5cGU9IkNsYXNzIiBuYW1lPSJNYWluIj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX1V3cHVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERTQ3OEUwMDBEIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfVXdxZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HX1V3cXVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX1V3cS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX1V3ck9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX1V3cmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfVXdydWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJQYWNrYWdlQ29udGVudHMiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfR19Vd3ItZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIgY29sbGFwc2VkPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0dfVXdwLWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iTm9uZSIgc2hvd0xpc3RWaXNpYmlsaXR5PSJOb25lIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0dfVXdxT2ZYRWR1cUhvT0piVVJaUnciIHg9IjMzNjAiIHk9IjExNDU2IiB3aWR0aD0iMzM5OCIgaGVpZ2h0PSIxNjc2Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfVXdzT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEZEODU0NjAwRDgiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19laFFPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0dfZWhRZWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfZWhRdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfZWhRLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfZWhST2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19laFJlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlBhY2thZ2VDb250ZW50cyI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HX2VoUnVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIiBjb2xsYXBzZWQ9InRydWUiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfR19Vd3NlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJOb25lIiBzaG93TGlzdFZpc2liaWxpdHk9Ik5vbmUiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfR19Vd3N1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMzc4OSIgeT0iODMzNCIgd2lkdGg9IjI1NDAiIGhlaWdodD0iMTY3NiIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX2VoUi1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGRDg5MUYwMkNEIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfZWhTdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HX2VoUy1mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX2VoVE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX2VoVGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX2VoVHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfZWhULWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJQYWNrYWdlQ29udGVudHMiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfR19laFVPZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIgY29sbGFwc2VkPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0dfZWhTT2ZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iTm9uZSIgc2hvd0xpc3RWaXNpYmlsaXR5PSJOb25lIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0dfZWhTZWZYRWR1cUhvT0piVVJaUnciIHg9IjM1MTEiIHk9IjU1MDUiIHdpZHRoPSIzMDk2IiBoZWlnaHQ9IjE2NzYiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19uclF1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRTBEMEVEMDEwNCI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX3hjTU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfR194Y01lZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR194Y011ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR194Y00tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR194Y05PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX3hjTmVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iUGFja2FnZUNvbnRlbnRzIj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0dfeGNOdWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiIGNvbGxhcHNlZD0idHJ1ZSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HX25yUS1mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9Ik5vbmUiIHNob3dMaXN0VmlzaWJpbGl0eT0iTm9uZSIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HX25yUk9mWEVkdXFIb09KYlVSWlJ3IiB4PSIzMjk5IiB5PSItMzExIiB3aWR0aD0iMzUyMCIgaGVpZ2h0PSIxNjg0Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfeGNTZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURGMkExQjAyRTciPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR194Y1RPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0dfeGNUZWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfeGNUdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfeGNULWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfeGNVT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR194Y1VlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlBhY2thZ2VDb250ZW50cyI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HX3hjVXVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIiBjb2xsYXBzZWQ9InRydWUiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfR194Y1N1ZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJOb25lIiBzaG93TGlzdFZpc2liaWxpdHk9Ik5vbmUiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfR194Y1MtZlhFZHVxSG9PSmJVUlpSdyIgeD0iMjk1NCIgeT0iMjQ3MCIgd2lkdGg9IjQyMDkiIGhlaWdodD0iMTY4NCIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTERpYWdyYW1TdHlsZSIgeG1pOmlkPSJfR29PZTdPZlhFZHVxSG9PSmJVUlpSdyIgZGVzY3JpcHRpb249InxVTUEgc2VwYXJhdGVzIHJldXNhYmxlIGNvcmUgbWV0aG9kIGNvbnRlbnQgZnJvbSBpdHMgYXBwbGljYXRpb24gaW4gcHJvY2Vzc2VzLiAgQSBEZXZlbG9wbWVudCBQcm9jZXNzIGRlZmluZXMgdGhlIHN0cnVjdHVyZWQgd29yayBkZWZpbml0aW9ucyB0aGF0IG5lZWQgdG8gYmUgcGVyZm9ybWVkIHRvIGRldmVsb3AgYSBzeXN0ZW0sIGUuZy4gYnkgcGVyZm9ybWluZyBhIHByb2plY3QgdGhhdCBmb2xsb3dzIHRoZSBwcm9jZXNzLiAgU3VjaCBzdHJ1Y3R1cmVkIHdvcmsgZGVmaW5pdGlvbnMgZGVsaW5lYXRlIHRoZSB3b3JrIHRvIGJlIHBlcmZvcm1lZCBhbG9uZyBhIHRpbWVsaW5lIG9yIGxpZmVjeWNsZSBhbmQgb3JnYW5pemUgaXQgaW4gc28gY2FsbGVkIGJyZWFrZG93biBzdHJ1Y3R1cmVzLiAgVGFza3MgKGFzIHRoZXkgaGF2ZSBiZWVuIGludHJvZHVjZWQgYXMgcGFydCBvZiB0aGUgY29yZSBtZXRob2QgY29udGVudCkgcHJvdmlkZSBjb21wbGV0ZSBzdGVwLWJ5LXN0ZXAgZXhwbGFuYXRpb25zIGZvciB3b3JrIHRoYXQgbmVlZHMgdG8gYmUgcGVyZm9ybWVkIHRvIGFjaGlldmUgYSBwYXJ0aWN1bGFyIGRldmVsb3BtZW50IGdvYWwuICBBIFRhc2sgZG9lcyBub3QgbG9vayBhdCB0aGUgJ2JpZyBwaWN0dXJlJyBvZiBob3cgdGhlIHdvcmsgZGVzY3JpYmVkIHJlbGF0ZXMgdG8gb3RoZXIgVGFzaydzIHdvcmsuICBUaGV5IGhhdmUgYmVlbiBkZWZpbmVkIGFzIHJldXNhYmxlIGNvcmUgbWV0aG9kIGNvbnRlbnQgaW5kZXBlbmRlbnQgb2YgdGhlaXIgcGxhY2VtZW50IHdpdGhpbiBhIGRldmVsb3BtZW50IGxpZmVjeWNsZS4gIEFsbCB0aGF0IGlzIGRlZmluZWQgZm9yIGEgVGFzayBhcmUgdGhlIHR5cGVzIG9mIHRoZSBpbnB1dCBhbmQgb3V0cHV0IHdvcmsgcHJvZHVjdHMsIHRoZSBjb25jcmV0ZSBzdGVwcyB0byBwZXJmb3JtLCBhcyB3ZWxsIGFzIHdoYXQgc2tpbGxzIGFyZSByZXF1aXJlZCB0byBwZXJmb3JtIHRoZSB3b3JrIChyb2xlcykuICBXaGljaCBUYXNrcyBoYXZlIHRvIHByZWNlZGUgYW5kIHN1Y2NlZWQgYSBUYXNrIGFzIHdlbGwgYXMgd2hhdCBzdGVwcyB0byBmb2N1cyBvbiBhdCB3aGF0IHBvaW50IG9mIHRpbWUgaW4gdGhlIGxpZmVjeWNsZSBhcmUgaW50ZW50aW9uYWxseSBub3QgZGVmaW5lZCBmb3IgY29yZSBtZXRob2QgY29udGVudC4gIFRoZSBnb2FsIGlzIHByb3ZpZGUgVGFza3MgdGhhdCBjYW4gYmUgcmV1c2VkIGZvciBtYW55IGRpZmZlcmVudCBkZXZlbG9wbWVudCBzaXR1YXRpb25zLiYjeEE7fFRoZSBzY29wZSBvZiBhIHByb2Nlc3MgaXMgdG8gcHJvdmlkZSBleHRlbmRlZCBhcyB3ZWxsIGFzIGNvbmNyZXRlIHdvcmsgc3RydWN0dXJlcyBmb3IgYSBzcGVjaWZpYyBkZXZlbG9wbWVudCBzaXR1YXRpb24uICBUaGVyZWZvcmUsIGEgcHJvY2VzcyB0YWtlcyByZXVzYWJsZSBjb3JlIG1ldGhvZCBlbGVtZW50cyBzdWNoIGFzIFRhc2tzIGFuZCBXb3JrIFByb2R1Y3RzIGFuZCByZWxhdGVzIHRoZW0gaW50byBzZW1pLW9yZGVyZWQgc2VxdWVuY2VzIHRoYXQgYXJlIGN1c3RvbWl6ZWQgdG8gc3BlY2lmaWMgdHlwZXMgb2YgcHJvamVjdHMuICBUbyBkbyBzbywgVU1BJ3MgUHJvY2VzcyBQYWNrYWdlIHByb3ZpZGVzIGRhdGEgc3RydWN0dXJlcyB0aGF0IHJlZmxlY3QgdGhlIGluZHVzdHJpZXMgYmVzdCBwcmFjdGljZXMuICBUaGlzIHNlY3Rpb24gZGVmaW5lcyBCcmVha2Rvd24gc3RydWN0dXJlIG1ldGEtbW9kZWxzIHRoYXQgY29tcHJpc2Ugb2YgZGlmZmVyZW50IHR5cGVzIG9mIGJyZWFrZG93biBlbGVtZW50cyBzdWNoIGFzIEFjdGl2aXRpZXMsIHdoaWNoIGFyZSBoaWdoZXIgbGV2ZWwgZ3JvdXBpbmdzIG9mIHdvcmsgY29tcHJpc2luZyBvZiBUYXNrcyBvciBvdGhlciBBY3Rpdml0aWVzIGRlZmluaW5nIHNlcXVlbmNlcyBhbmQgY29uZGl0aW9ucyBvbiBUYXNrcy4gIEluIGZhY3QsIGEgcHJvY2VzcyBpcyBkZWZpbmVkIGFzIGEgc3BlY2lhbCBraW5kIG9mIEFjdGl2aXR5IGl0c2VsZi4gIFRoaXMgYnJlYWtkb3duIHN0cnVjdHVyZXMgbWV0YS1tb2RlbCBoYXMgYmVlbiBkZWZpbmVkIGluZGVwZW5kZW50IG9mIHRoZSBjb25jcmV0ZSBsaWZlY3ljbGUgbW9kZWxzIHRoZSBwcm9jZXNzIGVuZ2luZWVyIHdhbnRzIHRvIGV4cHJlc3Mgd2l0aCB0aGVtLiAgSW4gb3RoZXIgd29yZHMgdGhlIG1ldGEtbW9kZWwgaXMgYWJsZSB0byByZXByZXNlbnQgJ2RpZmZlcmVudCB0eXBlcyBvZicgd2F0ZXJmYWxsIHByb2Nlc3NlcyBhcyB3ZWxsIGFzIGl0ZXJhdGl2ZSBvciBpbmNyZW1lbnRhbCBwcm9jZXNzIG1vZGVscy4gIEZpbmFsbHksIFVNQSBlbmFibGVzIGRpZmZlcmVudCB0eXBlIG9mIHByZXNlbnRhdGlvbnMgZm9yIGJyZWFrZG93biBzdHJ1Y3R1cmVzLCBhcyBpbGx1c3RyYXRlZCB3aXRoIGV4YW1wbGUgaW4gdGhlIHNlY3Rpb25zIGJlbG93LCBzdWNoIGFzIHByb2plY3QgcGxhbi1saWtlIHN0cnVjdHVyZWQgbGlzdCwgd29ya2Zsb3cgb3IgYWN0aXZpdHkgZGlhZ3JhbXMsIGFuZCBzdGF0aWMgc3RydWN0dXJlIGRpYWdyYW1zIHNob3cgaW5wdXRzL291dHB1dHMgdG8gd29yayBhcyB3ZWxsIGFzIHBlcmZvcm1pbmcgcm9sZXMuICBVTUEncyBQcm9jZXNzIHBhY2thZ2UgZXh0ZW5kcyB0aGUgY29uY2VwdHMgZGVmaW5lZCBpbiBNZXRob2QgQ29yZSB0aHJvdWdoIHBhY2thZ2UgbWVyZ2UgYXMgZGVwaWN0ZWQgaW4gdGhlIGRpYWdyYW0uICBCcmVha2Rvd24gbWVyZ2VzIHRoZSB3aG9sZSBvZiBNZXRob2QgQ29yZSBieSBtZXJnaW5nIHRoZSBNZXRob2QgUGFja2FnZSBwYWNrYWdlLiAgUHJvY2VzcyBpcyBzcGVjaWZpZWQgaW4gVU1BIHdpdGggdGhlIGZvbGxvd2luZyBmaXZlIHBhY2thZ2VzLiAgVGhlIEJyZWFrZG93biBwYWNrYWdlIGNvbnRhaW5zIHRoZSBkZWZpbml0aW9uIG9mIGJyZWFrZG93biBlbGVtZW50cyB0aGF0IGZvcm0gYnJlYWtkb3duIHN0cnVjdHVyZXMuICBQcm9jZXNzIFR5cGVzIGRlZmluZSBQcm9jZXNzZXMgYXMgc3BlY2lhbCBBY3Rpdml0aWVzIChkZWZpbmVkIGluIGJyZWFrZG93biBlbGVtZW50cykgYW5kIGludHJvZHVjZSBkaWZmZXJlbnQgdHlwZXMgb2YgUHJvY2Vzc2VzIHN1Y2ggYXMgRGVsaXZlcnkgUHJvY2VzcyBvciBDYXBhYmlsaXR5IFBhdHRlcm5zLiAgUHJvY2VzcyBQYWNrYWdlIHJlZmluZXMgdGhlIE1ldGhvZCBQYWNrYWdlIGNvbmNlcHRzIGRlZmluZWQgaW4gTWV0aG9kIENvcmUgd2l0aCBuZXcgcGFja2FnZXMgdGhhdCBvcmdhbml6ZSBwcm9jZXNzZXMgYW5kIGJyZWFrZG93biBzdHJ1Y3R1cmVzLiAgUHJvY2VzcyBEZXNjcmlwdGlvbnMgcHJvdmlkZXMgcHJvY2VzcyBzcGVjaWZpYyBjb250ZW50IGRlc2NyaXB0aW9ucyBleHRlbmRpbmcgdGhlIHRheG9ub215IGJhc2VkIG9uIHRoZSBDb250ZW50IERlc2NyaXB0aW9uIGNsYXNzIGRlZmluZWQgaW4gTWV0aG9kIENvcmUuICBGaW5hbGx5LCBXb3JrZmxvdyBkZWZpbmVzIGhvdyBwcm9jZXNzIGNhbiBiZSBlbmFjdGVkIGJ5IHByb3ZpZGluZyBleHRlbmRlZCBkYXRhIHN0cnVjdHVyZXMgdGhhdCBhbGxvdyBjcmVhdGluZyBtb2RlbHMgZml0IGZvciBpbnN0YW50aWF0aW9uIG9uIHRoZSBNMCBsZXZlbC4gIEluIG90aGVyIHdvcmRzLCBpdCBwcm92aWRlcyBhIG1ldGEtc2NoZW1hIGZvciB3b3JrZmxvdyBtb2RlbHMgdGhhdCBjYW4gcnVuIGluIGEgd29ya2Zsb3cgc2ltdWxhdG9yIHN1Y2ggYXMgSUJNIFdlYnNwaGVyZSBCdXNpbmVzcyBJbnRlZ3JhdGlvbiBNb2RlbGVyLiYjeEE7Ii8+Ci0gICAgICAgICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+Ci0gICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRHhueXNPeE1FZHVPTnJNUmdtejQ4QSIgZWxlbWVudD0iX0R4TEd3T3hNRWR1T05yTVJnbXo0OEEiIHNvdXJjZT0iX0dfVXdzT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0dfVXdwdWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRHhueXMteE1FZHVPTnJNUmdtejQ4QSIgdHlwZT0iS2luZExhYmVsIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRHhueXRleE1FZHVPTnJNUmdtejQ4QSIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9EeG55dC14TUVkdU9Ock1SZ216NDhBIiB0eXBlPSJLaW5kIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0R4bnl0dXhNRWR1T05yTVJnbXo0OEEiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9EeG55dE94TUVkdU9Ock1SZ216NDhBIiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9EeG55c2V4TUVkdU9Ock1SZ216NDhBIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0R4bnlzdXhNRWR1T05yTVJnbXo0OEEiIHBvaW50cz0iWzMsIDMyLCAtNiwgLTg1XSRbMTEsIDE1MCwgMiwgMzNdIi8+Ci0gICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0ZvUFdFZXhNRWR1T05yTVJnbXo0OEEiIGVsZW1lbnQ9Il9Gb1BXRU94TUVkdU9Ock1SZ216NDhBIiBzb3VyY2U9Il9HX2VoUi1mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HX1V3c09mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ZvUFdGT3hNRWR1T05yTVJnbXo0OEEiIHR5cGU9IktpbmRMYWJlbCI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ZvUFdGdXhNRWR1T05yTVJnbXo0OEEiIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRm9QV0dPeE1FZHVPTnJNUmdtejQ4QSIgdHlwZT0iS2luZCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9Gb1BXRi14TUVkdU9Ock1SZ216NDhBIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRm9QV0ZleE1FZHVPTnJNUmdtejQ4QSIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRm9QV0V1eE1FZHVPTnJNUmdtejQ4QSIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9Gb1BXRS14TUVkdU9Ock1SZ216NDhBIiBwb2ludHM9IlsyLCAzMiwgLTgsIC05MV0kWzExLCAxNTUsIDEsIDMyXSIvPgotICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9JWnRfTWV4TUVkdU9Ock1SZ216NDhBIiBlbGVtZW50PSJfSVp0X01PeE1FZHVPTnJNUmdtejQ4QSIgc291cmNlPSJfR194Y1NlZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfR19laFItZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9JWnRfTk94TUVkdU9Ock1SZ216NDhBIiB0eXBlPSJLaW5kTGFiZWwiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9JWnRfTnV4TUVkdU9Ock1SZ216NDhBIiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ladF9PT3hNRWR1T05yTVJnbXo0OEEiIHR5cGU9IktpbmQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSVp0X04teE1FZHVPTnJNUmdtejQ4QSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0ladF9OZXhNRWR1T05yTVJnbXo0OEEiIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0ladF9NdXhNRWR1T05yTVJnbXo0OEEiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSVp0X00teE1FZHVPTnJNUmdtejQ4QSIgcG9pbnRzPSJbODEsIDE3LCAtMTI3LCAtMTRdJFsxNTcsIDYzLCAtNTEsIDMyXSIvPgotICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9yMFZSSWV4aEVkdUhqZTNwUGFoTjRBIiBlbGVtZW50PSJfcjBWUklPeGhFZHVIamUzcFBhaE40QSIgc291cmNlPSJfR19uclF1ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfR194Y1NlZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9yMFZSSk94aEVkdUhqZTNwUGFoTjRBIiB0eXBlPSJLaW5kTGFiZWwiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9yMFZSSnV4aEVkdUhqZTNwUGFoTjRBIiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3IwVlJLT3hoRWR1SGplM3BQYWhONEEiIHR5cGU9IktpbmQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfcjBWUkoteGhFZHVIamUzcFBhaE40QSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX3IwVlJKZXhoRWR1SGplM3BQYWhONEEiIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX3IwVlJJdXhoRWR1SGplM3BQYWhONEEiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfcjBWUkkteGhFZHVIamUzcFBhaE40QSIgcG9pbnRzPSJbLTY4LCAzLCAzNDAsIC0yMF0kWy0zMjgsIDE4LCA4MCwgLTVdIi8+Ci0gICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgIDwvY29udGVudHM+Ci0gICAgICAgICAgPGNvbnRlbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpEaWFncmFtIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEY1RjUwOTAyMDYiIHR5cGU9IkNsYXNzIiBuYW1lPSJUYXhvbm9teSI+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR194Y1plZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI4MCI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX3hjYU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfR194Y2FlZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR194Y2F1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR194Y2EtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR194Y2JPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX3hjYmVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HX3hjYnVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX3hjYi1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HX3hjY09mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX3hjY2VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HX3hjY3VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX3hjYy1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfR194Y2RPZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HX3hjWnVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HX3hjWi1mWEVkdXFIb09KYlVSWlJ3IiB4PSIxNTIxNiIgeT0iMzE3Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfN05NT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwNzciPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR183Tk0tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0dfN05OT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfN05OZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfN05OdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfN05OLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR183Tk9PZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfR183Tk9lZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR183Tk91ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfR183Tk8tZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR183TlBPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfR183TlBlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR183TlB1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0dfN05QLWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfR183Tk1lZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfR183Tk11ZlhFZHVxSG9PSmJVUlpSdyIgeD0iODg3NiIgeT0iMTgwOTUiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR183TlFPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDBEQyI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HXzdOUS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfR183TlJPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR183TlJlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR183TlJ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR183TlItZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HXzdOU09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HXzdOU2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HXzdOU3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HXzdOUy1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HXzdOVE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HXzdOVGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HXzdOVHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfR183TlQtZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HXzdOUWVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HXzdOUXVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxMjEwNyIgeT0iMTgwMjUiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR183TlVPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDBFNSI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HXzdOVS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfR183TlZPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR183TlZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR183TlZ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR183TlYtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HXzdOV09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HXzdOV2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HXzdOV3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HXzdOVy1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HXzdOWE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HXzdOWGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HXzdOWHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfR183TlgtZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HXzdOVWVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HXzdOVXVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxNTg1MCIgeT0iMTgwNjkiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR183TllPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDBFNiI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HXzdOWS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfR183TlpPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR183TlplZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR183Tlp1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR183TlotZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HXzdOYU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HXzdOYWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HXzdOYXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HXzdOYS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HXzdOYk9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HXzdOYmVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HXzdOYnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfR183TmItZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HXzdOWWVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HXzdOWXVmWEVkdXFIb09KYlVSWlJ3IiB4PSIzMzYxIiB5PSI4NzcxIi8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfN05jT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwNjMiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR183TmMtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0dfN05kT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfN05kZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfN05kdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfN05kLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR183TmVPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfR183TmVlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR183TmV1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfR183TmUtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR183TmZPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfR183TmZlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR183TmZ1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0dfN05mLWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfR183TmNlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfR183TmN1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iNTkwMSIgeT0iODc3OSIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HXzdOZ09mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDhCIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfN05nLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HXzdOaE9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HXzdOaGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HXzdOaHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HXzdOaC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfN05pT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0dfN05pZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfN05pdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0dfN05pLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfN05qT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0dfN05qZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfN05qdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HXzdOai1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0dfN05nZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0dfN05ndWZYRWR1cUhvT0piVVJaUnciIHg9IjIzNyIgeT0iMTEwNjUiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR183Tm1lZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDA0NSI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HXzdObk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfR183Tm5lZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR183Tm51ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR183Tm4tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR183Tm9PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HXzdOb2VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HXzdOb3VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HXzdOby1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HXzdOcE9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HXzdOcGVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HXzdOcHVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HXzdOcC1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfR183TnFPZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HXzdObXVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HXzdObS1mWEVkdXFIb09KYlVSWlJ3IiB4PSIzMTMyIiB5PSIxMTA1NyIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HXzdOc3VmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUQwM0NCIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfN050ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HXzdOdHVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HXzdOdC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HXzdOdU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HXzdOdWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfN051dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0dfN051LWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfN052T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0dfN052ZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfN052dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0dfN052LWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfN053T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HXzdOd2VmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0dfN05zLWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0dfN050T2ZYRWR1cUhvT0piVVJaUnciIHg9IjkzMDQiIHk9IjEzNDAyIi8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfN053dWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwMzEiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR183TnhlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0dfN054dWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfN054LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfN055T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfN055ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR183Tnl1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfR183TnktZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR183TnpPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfR183TnplZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR183Tnp1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfR183TnotZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR183TjBPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0dfN04wZWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfR183TnctZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfR183TnhPZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTAzMjAiIHk9IjExMDY1Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBRVhJT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RDAzQ0EiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFFWEktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hBRVhKT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBRVhKZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBRVhKdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBRVhKLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFFWEtPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEFFWEtlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFFWEt1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEFFWEstZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFFWExPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEFFWExlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFFWEx1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hBRVhMLWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEFFWEllZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEFFWEl1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTE4NDQiIHk9IjEzNDAyIi8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBRVhNT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwMDkiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFFWE0tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hBRVhOT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBRVhOZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBRVhOdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBRVhOLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFFWE9PZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEFFWE9lZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFFWE91ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEFFWE8tZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFFWFBPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEFFWFBlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFFWFB1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hBRVhQLWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEFFWE1lZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEFFWE11ZlhFZHVxSG9PSmJVUlpSdyIgeD0iNzMxNSIgeT0iMTEwNjUiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFFWFFPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDA5RiI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQUVYUS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEFFWFJPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFFWFJlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFFWFJ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFFWFItZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQUVYU09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQUVYU2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQUVYU3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQUVYUy1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQUVYVE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQUVYVGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQUVYVHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEFFWFQtZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IQUVYUWVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IQUVYUXVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxNDM3NiIgeT0iMTU2ODAiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFFWGEtZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVEMDNEMyI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQUVYYnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEFFWGItZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFFWGNPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFFWGNlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFFWGN1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQUVYYy1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQUVYZE9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQUVYZGVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQUVYZHVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQUVYZC1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQUVYZU9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQUVYZWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEFFWGV1ZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IQUVYYk9mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93UGFyZW50PSJOYW1lIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IQUVYYmVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxMzAxMyIgeT0iMTEwNjUiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFFWGplZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRTBGRTkzMDA3NyI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQUVYa09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEFFWGtlZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjI2NDEiIGhlaWdodD0iMTAzMiIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFFWGt1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFFWGstZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFFWGxPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQUVYbGVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQUVYbHVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQUVYbC1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQUVYbU9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQUVYbWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQUVYbXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQUVYbS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEFFWG5PZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IQUVYanVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93UGFyZW50PSJOYW1lIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IQUVYai1mWEVkdXFIb09KYlVSWlJ3IiB4PSIxNDM3NiIgeT0iMTM0MDIiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFFWHItZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxMTlBNEU2MDJDMSI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQUVYc3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEFFWHMtZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjI0NTUiIGhlaWdodD0iMTA0OSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFFWHRPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFFWHRlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFFWHR1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQUVYdC1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQUVYdU9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQUVYdWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQUVYdXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQUVYdS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQUVYdk9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQUVYdmVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEFFWHZ1ZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IQUVYc09mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IQUVYc2VmWEVkdXFIb09KYlVSWlJ3IiB4PSIxMjU4OSIgeT0iNjQzNCIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQUVYdi1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMEVGIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBRVh3dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IQUVYdy1mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQUVYeE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQUVYeGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQUVYeHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBRVh4LWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hBRVh5T2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBT0lJT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hBT0lJZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBT0lJdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hBT0lJLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBT0lKT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQU9JSmVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hBRVh3T2ZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hBRVh3ZWZYRWR1cUhvT0piVVJaUnciIHg9Ijg5MjMiIHk9IjY0MzQiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFPSU9PZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyODNFOEExMDM0MSI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQU9JTy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEFPSVBPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjI5NDYiIGhlaWdodD0iMTAzMiIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFPSVBlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFPSVB1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFPSVAtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQU9JUU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQU9JUWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQU9JUXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQU9JUS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQU9JUk9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQU9JUmVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQU9JUnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEFPSVItZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IQU9JT2VmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IQU9JT3VmWEVkdXFIb09KYlVSWlJ3IiB4PSIxMjM0NCIgeT0iNDE1NyIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQU9JWS1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTgyRDMwMTdGIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBT0ladWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IQU9JWi1mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMzY5MSIgaGVpZ2h0PSIxMDMyIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQU9JYU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQU9JYWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQU9JYXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBT0lhLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hBT0liT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBT0liZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hBT0lidWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBT0liLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hBT0ljT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBT0ljZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQU9JY3VmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hBT0laT2ZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hBT0laZWZYRWR1cUhvT0piVVJaUnciIHg9IjE2MDM1IiB5PSI4Nzc5Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBT0lmT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBOTI1NDAyMjciPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFPSWYtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hBT0lnT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSI0MjY3IiBoZWlnaHQ9IjEwMzIiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBT0lnZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBT0lndWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBT0lnLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFPSWhPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEFPSWhlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFPSWh1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEFPSWgtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFPSWlPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEFPSWllZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFPSWl1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hBT0lpLWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEFPSWZlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEFPSWZ1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iODQ4MyIgeT0iODc3OSIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQU9Jak9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDEwODE4NzkwMjg4Ij4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBT0lqLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IQU9Ja09mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMjMxOSIgaGVpZ2h0PSIxMDQ5Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQU9Ja2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQU9Ja3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQU9Jay1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBT0lsT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hBT0lsZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBT0lsdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hBT0lsLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBT0ltT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hBT0ltZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBT0ltdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQU9JbS1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hBT0lqZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hBT0lqdWZYRWR1cUhvT0piVVJaUnciIHg9IjE1NDAwIiB5PSI2NDM0Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBT0l5ZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjk0RUI5MDAwRkMiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFPSXpPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hBT0l6ZWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIzNTg5IiBoZWlnaHQ9IjEwMzIiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBT0l6dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBT0l6LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBT0kwT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFPSTBlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEFPSTB1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFPSTAtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEFPSTFPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFPSTFlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEFPSTF1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFPSTEtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hBT0kyT2ZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEFPSXl1ZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEFPSXktZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTIwMjIiIHk9IjIxNzUiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxEaWFncmFtU3R5bGUiIHhtaTppZD0iX0dvT2U3dWZYRWR1cUhvT0piVVJaUnciIGRlc2NyaXB0aW9uPSJUaGlzIGRpYWdyYW0gcHJvdmlkZXMgdGhlIHRheG9ub215IG9mIGFsbCB0aGUgbWFpbiBjbGFzc2VzIG9mIHRoZSBQcm9jZXNzIHBhY2thZ2UuIi8+Ci0gICAgICAgICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+Ci0gICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfR183TmtPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDE2MCIgc291cmNlPSJfR183TmdPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfR183TllPZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HXzdOay1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HXzdObGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfN05sdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfR183TmxPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfR183TmtlZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HXzdOa3VmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9Ils2NjAsIC01MjQsIC0yMjg2LCAxNzYxXSRbMjI1MiwgLTE3NjEsIC02OTQsIDUyNF0iLz4KLSAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0dfN05sLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfR183Tm1PZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0dfN05xZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzRDYiIHNvdXJjZT0iX0dfN05tZWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0dfN05ZT2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR183TnJPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR183TnJ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HXzdOci1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0dfN05yZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0dfN05xdWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfR183TnEtZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTE0MywgLTUzMywgNDY1LCAxNzUyXSRbLTQ3NCwgLTE3NjEsIDEzNSwgNTI0XSIvPgotICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfR183TnNPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HXzdOc2VmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEFFWFVPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDExMCIgc291cmNlPSJfR183Tk1PZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEFFWFFPZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQUVYVS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQUVYVmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBRVhWdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEFFWFZPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEFFWFVlZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IQUVYVXVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlsxMTQzLCAtNTI0LCAtNDA4OSwgMTgxMV0kWzQwMzgsIC0xODExLCAtMTE5MywgNTI0XSIvPgotICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEFFWFYtZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IQUVYV09mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEFFWFdlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDI4RCIgc291cmNlPSJfR183TlFPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEFFWFFPZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQUVYWE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQUVYWHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBRVhYLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEFFWFhlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEFFWFd1ZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IQUVYVy1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9Ils0NDgsIC01MjQsIC0xNTgzLCAxODExXSRbMTU2NiwgLTE4MTEsIC00NjUsIDUyNF0iLz4KLSAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hBRVhZT2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEFFWFllZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hBRVhZdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyOEUiIHNvdXJjZT0iX0dfN05VT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hBRVhRT2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFFWFplZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFFWFotZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQUVYYU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hBRVhadWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hBRVhZLWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEFFWFpPZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTQ1NywgLTUyNCwgMTU3NCwgMTgxMV0kWy0xNTc0LCAtMTgxMSwgNDU3LCA1MjRdIi8+Ci0gICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IQUVYYWVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hBRVhhdWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IQUVYZS1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMkEwIiBzb3VyY2U9Il9HXzdOc3VmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IQUVYYS1mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBRVhmdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBRVhnT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFFWGdlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IQUVYZi1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IQUVYZk9mWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hBRVhmZWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzgxMiwgLTUyNCwgLTI4OTUsIDE4MTFdJFsyODcwLCAtMTgyMCwgLTgzOCwgNTE2XSIvPgotICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEFFWGd1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IQUVYZy1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEFFWGhPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDI5RiIgc291cmNlPSJfSEFFWElPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEFFWGEtZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQUVYaC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQUVYaWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBRVhpdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEFFWGlPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEFFWGhlZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IQUVYaHVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlsyNDUsIC01MjQsIC05MjIsIDE4MTFdJFs4OTcsIC0xODIwLCAtMjcwLCA1MTZdIi8+Ci0gICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IQUVYaS1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hBRVhqT2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IQUVYbmVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFMEZFRDYwMkFFIiBzb3VyY2U9Il9IQUVYUU9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IQUVYamVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBRVhvT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBRVhvdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFFWG8tZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IQUVYb2VmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IQUVYbnVmWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hBRVhuLWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzAsIC01MzMsIDAsIDE3NTJdJFswLCAtMTc2OSwgMCwgNTE2XSIvPgotICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEFFWHBPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IQUVYcGVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEFPSUp1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDI4RiIgc291cmNlPSJfR183TllPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEFFWHYtZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQU9JS2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQU9JSy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBT0lMT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEFPSUt1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEFPSUotZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IQU9JS09mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlsxMTU5LCAtNDU3LCAtNDkzNiwgMTg3OV0kWzQ3MDcsIC0xODExLCAtMTM4OCwgNTI0XSIvPgotICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEFPSUxlZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IQU9JTHVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEFPSUwtZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDAzRSIgc291cmNlPSJfR183TmNPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEFFWHYtZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQU9JTXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQU9JTk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBT0lOZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEFPSU0tZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEFPSU1PZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IQU9JTWVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9Ils3NzgsIC01MjQsIC0yNzc3LCAxODExXSRbMjc0MywgLTE4MTEsIC04MTIsIDUyNF0iLz4KLSAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hBT0lOdWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEFPSU4tZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hBT0lTT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjgzRTkxRjAwNjEiIHNvdXJjZT0iX0hBRVh2LWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hBT0lPT2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFPSVMtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFPSVRlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQU9JVHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hBT0lUT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hBT0lTZWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEFPSVN1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbNzI4LCAtNTMzLCAtMjQ3MiwgMTc1Ml0kWzI0NDYsIC0xNzY5LCAtNzUzLCA1MTZdIi8+Ci0gICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IQU9JVC1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hBT0lVT2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IQU9JVWVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI4M0VFRjkwMEUyIiBzb3VyY2U9Il9IQUVYci1mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IQU9JT09mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBT0lWT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBT0lWdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFPSVYtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IQU9JVmVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IQU9JVXVmWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hBT0lVLWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzAsIC01MzMsIDAsIDE3NTJdJFswLCAtMTc2OSwgMCwgNTE2XSIvPgotICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEFPSVdPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IQU9JV2VmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEFPSVd1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDMwMyIgc291cmNlPSJfSEFFWE1PZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfR183TllPZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQU9JWGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQU9JWC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBT0lZT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEFPSVh1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEFPSVctZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IQU9JWE9mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstOTM5LCAtNTI0LCAzMjI1LCAxNzYxXSRbLTMxOTEsIC0xNzYxLCA5NzMsIDUyNF0iLz4KLSAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hBT0lZZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEFPSVl1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hBT0ljLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjhDRDMyOTAxRkQiIHNvdXJjZT0iX0hBRVhhLWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hBT0lZLWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFPSWR1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFPSWVPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQU9JZWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hBT0lkLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hBT0lkT2ZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEFPSWRlZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbODIxLCAtNTI0LCAtMjg4NywgMTc2MV0kWzI4MzYsIC0xNzY5LCAtODcyLCA1MTZdIi8+Ci0gICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IQU9JZXVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hBT0llLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IQU9Jbk9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI4M0VENkQwMDg4IiBzb3VyY2U9Il9IQU9Jak9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IQU9JT09mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBT0luLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBT0lvZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFPSW91ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IQU9Jb09mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IQU9JbmVmWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hBT0ludWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy02MzUsIC01MzMsIDIxMDgsIDE3NTJdJFstMjEyNSwgLTE3NjksIDYxOCwgNTE2XSIvPgotICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEFPSW8tZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IQU9JcE9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEFPSXBlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E5MjgyMDM5MiIgc291cmNlPSJfSEFFWGEtZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEFPSWZPZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQU9JcU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQU9JcXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBT0lxLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEFPSXFlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEFPSXB1ZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IQU9JcC1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstODA0LCAtNTI0LCAyNzUxLCAxNzYxXSRbLTI3NDMsIC0xNzY5LCA4MTIsIDUxNl0iLz4KLSAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hBT0lyT2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEFPSXJlZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hBT0lydWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBOTIzQjAwMDIiIHNvdXJjZT0iX0hBRVhNT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hBT0lmT2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFPSXNlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFPSXMtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQU9JdE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hBT0lzdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hBT0lyLWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEFPSXNPZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbNDMxLCAtNTI0LCAtMTQ5OCwgMTc2MV0kWzE0ODEsIC0xNzY5LCAtNDQ4LCA1MTZdIi8+Ci0gICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IQU9JdGVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hBT0l0dWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IQU9JdC1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI4Q0QzMjMwMTlBIiBzb3VyY2U9Il9IQU9JZk9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IQUVYdi1mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBT0l1dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBT0l2T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFPSXZlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IQU9JdS1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IQU9JdU9mWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hBT0l1ZWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzAsIC01MjQsIDAsIDE4MTFdJFswLCAtMTgxMSwgMCwgNTI0XSIvPgotICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEFPSXZ1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IQU9Jdi1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEFPSXdPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E4MkYzMDI2RSIgc291cmNlPSJfSEFPSVktZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfR194Y1plZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQU9Jdy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQU9JeGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBT0l4dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEFPSXhPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEFPSXdlZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IQU9Jd3VmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlsyMTIsIC0zMTgsIDE4NTMsIDgxNzVdJFsyMTIsIC0zODM3LCAxODUzLCA0NjU2XSRbLTE1MDgsIC04MTc2LCAxMzMsIDMxN10iLz4KLSAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hBT0l4LWZYRWR1cUhvT0piVVJaUnciIGlkPSIoMC44NzAwMzI1NSwwLjQ2NTQwODgpIi8+Ci0gICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IQU9JeU9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEFYNUlPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyOTRFQ0MxMDMxRSIgc291cmNlPSJfSEFPSU9PZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEFPSXllZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQVg1SS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQVg1SmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBWDVKdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEFYNUpPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEFYNUllZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IQVg1SXVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlswLCAtNTI0LCAwLCAxNDU2XSRbMCwgLTE0NjQsIDAsIDUxNl0iLz4KLSAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hBWDVKLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEFYNUtPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hBWDVLZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjk0RUMyQjAxQ0EiIHNvdXJjZT0iX0hBT0l5ZWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0dfeGNaZWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFYNUxPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFYNUx1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQVg1TC1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hBWDVMZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hBWDVLdWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEFYNUstZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbNTI0LCAtNTI0LCAtMTQwNSwgMTM1NF0kWzEzODAsIC0xMzU0LCAtNTUwLCA1MjRdIi8+Ci0gICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IQVg1TU9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hBWDVNZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IQVg1TXVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDJCMUVDMUIwMzQ5IiBzb3VyY2U9Il9HXzdOd3VmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IQU9JZk9mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBWDVOZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBWDVOLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFYNU9PZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IQVg1TnVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IQVg1TS1mWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hBWDVOT2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0yMDMsIC01MjQsIDY2MCwgMTc2MV0kWy02NzcsIC0xNzY5LCAxODYsIDUxNl0iLz4KLSAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hBWDVPZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEFYNU91ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgIDwvY29udGVudHM+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0doT2ZBdWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RDAzQkYiPgotICAgICAgICAgIDxib2R5PjAyPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOlBhY2thZ2UiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRkQ4NTQ2MDBEOCIgbmFtZT0iQnJlYWtkb3duIj4KLSAgICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iX0drOUlnT2ZYRWR1cUhvT0piVVJaUnciIHNvdXJjZT0idW1sMi5kaWFncmFtcyIgcmVmZXJlbmNlcz0iXzNBREM3Qjc0MDIyRDQxRjA1RUNEMDM5MCI+Ci0gICAgICAgICAgICA8Y29udGVudHMgeG1pOnR5cGU9Im5vdGF0aW9uOkRpYWdyYW0iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxRjA1RUNEMDM5MCIgdHlwZT0iQ2xhc3MiIG5hbWU9IkJyZWFrZG93bkVsZW1lbnQiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzFNajRPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDBFNiI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cxTWo0LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0cxTWo1T2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIyMDgyIiBoZWlnaHQ9IjkwNSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cxTWo1ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzFNajV1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMU1qNS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzFNajZPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMU1qNmVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzFNajZ1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMU1qNi1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzFNajdPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMU1qN2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzFNajd1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzFNajctZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzFNajRlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HMU1qNHVmWEVkdXFIb09KYlVSWlJ3IiB4PSI5MjIwIiB5PSIxMDg3OSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzFNajhPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDJCQyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cxTWo4LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0cxTWo5T2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSI0NDcwIiBoZWlnaHQ9IjExMTciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMVZ0ME9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cxVnQwZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzFWdDB1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cxVnQwLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzFWdDFPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cxVnQxZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzFWdDF1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cxVnQxLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzFWdDJPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cxVnQyZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cxVnQydWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0cxTWo4ZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjEyNjMyMjU2IiBzaG93UGFyZW50PSJOYW1lIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0cxTWo4dWZYRWR1cUhvT0piVVJaUnciIHg9Ijc4MjMiIHk9IjE1Nzk4Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMVZ0Mi1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDQ1Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzFWdDN1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzFWdDMtZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjQwMTMiIGhlaWdodD0iOTA1Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzFWdDRPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMVZ0NGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cxVnQ0dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMVZ0NC1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cxVnQ1T2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMVZ0NWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cxVnQ1dWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMVZ0NS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cxVnQ2T2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMVZ0NmVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMVZ0NnVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HMVZ0M09mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0cxVnQzZWZYRWR1cUhvT0piVVJaUnciIHg9IjcyOTEiIHk9IjEzMzE0Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMThLMGVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjlFIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzE4SzFPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzE4SzFlZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjQxODIiIGhlaWdodD0iMTExNyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cxOEsxdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzE4SzEtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMThLMk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzE4SzJlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMThLMnVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzE4SzItZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMThLM09mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzE4SzNlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMThLM3VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzE4SzMtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzE4SzRPZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzE4SzB1ZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMTI2MzIyNTYiIHNob3dQYXJlbnQ9Ik5hbWUiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzE4SzAtZlhFZHVxSG9PSmJVUlpSdyIgeD0iMzU0NyIgeT0iMTU3OTgiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cxOEs0ZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwMDkiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMThLNU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HMThLNWVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMjcyNiIgaGVpZ2h0PSI5MDUiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMThLNXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cxOEs1LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzE4SzZPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cxOEs2ZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzE4SzZ1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cxOEs2LWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzE4SzdPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cxOEs3ZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzE4Szd1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cxOEs3LWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cxOEs4T2ZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0cxOEs0dWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzE4SzQtZlhFZHVxSG9PSmJVUlpSdyIgeD0iMzgwNCIgeT0iMTMzMTQiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyRlVzT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwNjMiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMkZVcy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HMkZVdE9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMjI2OSIgaGVpZ2h0PSI5MDUiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMkZVdGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyRlV0dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJGVXQtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyRlV1T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzJGVXVlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyRlV1dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzJGVXUtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyRlV2T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzJGVXZlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyRlV2dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cyRlV2LWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0cyRlVzZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzJGVXN1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTM2OTkiIHk9IjEwODc5Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMkZVd09mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDhCIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJGVXctZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzJGVXhPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjI2NzUiIGhlaWdodD0iOTA1Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJGVXhlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMkZVeHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyRlV4LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMkZVeU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cyRlV5ZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMkZVeXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cyRlV5LWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMkZVek9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cyRlV6ZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMkZVenVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMkZVei1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HMkZVd2VmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0cyRlV3dWZYRWR1cUhvT0piVVJaUnciIHg9IjEyNjgwIiB5PSIxMzMxNCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJGVV9PZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI5NiI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyRlVfLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0cyRlZBT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSI0MDEzIiBoZWlnaHQ9IjExMTciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMkZWQWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyRlZBdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJGVkEtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyRlZCT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzJGVkJlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyRlZCdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzJGVkItZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyRlZDT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzJGVkNlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyRlZDdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cyRlZDLWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0cyRlVfZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjEyNjMyMjU2IiBzaG93UGFyZW50PSJOYW1lIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0cyRlVfdWZYRWR1cUhvT0piVVJaUnciIHg9IjEyNDIwIiB5PSIxNTc5OCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJQRnRPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRjA2QjY1MDBFNiI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyUEZ0LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0cyUEZ1T2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIyNzQzIiBoZWlnaHQ9Ijk5MCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyUEZ1ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJQRnV1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMlBGdS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJQRnZPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMlBGdmVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJQRnZ1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMlBGdi1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJQRndPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMlBGd2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJQRnd1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzJQRnctZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzJQRnRlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HMlBGdHVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxNjc2NCIgeT0iMTQyOTEiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyUEY4T2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RDAzRDMiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMlBGOC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HMlBGOU9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTU3NCIgaGVpZ2h0PSI5MDUiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMlBGOWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyUEY5dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJQRjktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyUEYtT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzJQRi1lZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyUEYtdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzJQRi0tZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyUEZfT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzJQRl9lZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyUEZfdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cyUEZfLWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0cyUEY4ZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzJQRjh1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iNjA1NSIgeT0iMTA5ODQiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyUEdBT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwRUYiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMlBHQS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HMlBHQk9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJQR0JlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMlBHQnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyUEdCLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMlBHQ09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cyUEdDZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMlBHQ3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cyUEdDLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMlBHRE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cyUEdEZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMlBHRHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMlBHRC1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HMlBHQWVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0cyUEdBdWZYRWR1cUhvT0piVVJaUnciIHg9Ijk3NjIiIHk9IjcyMTMiIHdpZHRoPSIzODU5IiBoZWlnaHQ9IjEyMTkiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyWTIxZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTE5QTRFNjAyQzEiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMlkyMk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HMlkyMmVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMjQzOCIgaGVpZ2h0PSI5MDUiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMlkyMnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyWTIyLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJZMjNPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyWTIzZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzJZMjN1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyWTIzLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzJZMjRPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyWTI0ZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzJZMjR1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyWTI0LWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cyWTI1T2ZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0cyWTIxdWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzJZMjEtZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTYyNTYiIHk9Ijc1MjYiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyWTNFZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjgzRThBMTAzNDEiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMlkzRk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HMlkzRmVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMjk0NiIgaGVpZ2h0PSI5MDUiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMlkzRnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyWTNGLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJZM0dPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyaUFvT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzJpQW9lZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyaUFvdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzJpQW8tZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyaUFwT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzJpQXBlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyaUFwdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cyaUFwLWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0cyWTNFdWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzJZM0UtZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTAwMDciIHk9IjU1NDUiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyaUF1dWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyODAiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMmlBdmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HMmlBdnVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMjgyNyIgaGVpZ2h0PSIxMDMyIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJpQXYtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMmlBd09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyaUF3ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMmlBd3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cyaUF3LWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMmlBeE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cyaUF4ZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMmlBeHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cyaUF4LWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMmlBeU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMmlBeWVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HMmlBdS1mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIxMjYzMjI1NiIgc2hvd1BhcmVudD0iTmFtZSIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HMmlBdk9mWEVkdXFIb09KYlVSWlJ3IiB4PSI2MjU2IiB5PSIxMTU5Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMmlBeXVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTkyNTQwMjI3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJpQXplZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzJpQXp1ZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjQyNjciIGhlaWdodD0iOTA1Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJpQXotZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMmlBME9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyaUEwZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMmlBMHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cyaUEwLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMmlBMU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cyaUExZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMmlBMXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cyaUExLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMmlBMk9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMmlBMmVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HMmlBeS1mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0cyaUF6T2ZYRWR1cUhvT0piVVJaUnciIHg9IjE5ODEiIHk9IjgyODgiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyaUEydWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTA4MTg3OTAyODgiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMmlBM2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HMmlBM3VmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMjE1MCIgaGVpZ2h0PSI5MDUiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMnJ4b09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cycnhvZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJyeG91ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cycnhvLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzJyeHBPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cycnhwZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzJyeHB1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cycnhwLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzJyeHFPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cycnhxZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cycnhxdWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0cyaUEyLWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzJpQTNPZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTU1MzMiIHk9IjU3MDYiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cycnh4dWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBODJEMzAxN0YiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMnJ4eWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HMnJ4eXVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMzY5MSIgaGVpZ2h0PSIxMDMyIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJyeHktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMnJ4ek9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cycnh6ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMnJ4enVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cycnh6LWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMnJ4ME9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cycngwZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMnJ4MHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cycngwLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMnJ4MU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMnJ4MWVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HMnJ4eC1mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIxMjYzMjI1NiIgc2hvd1BhcmVudD0iTmFtZSIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HMnJ4eU9mWEVkdXFIb09KYlVSWlJ3IiB4PSIxMTAwIiB5PSIyODM2Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMnJ4LXVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI5NEVCOTAwMEZDIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJyeF9lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzJyeF91ZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjM1ODkiIGhlaWdodD0iMTAzMiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cycnhfLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJyeUFPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMnJ5QWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJyeUF1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMnJ5QS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJyeUJPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMnJ5QmVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJyeUJ1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMnJ5Qi1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJyeUNPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzJyeUNlZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzJyeC0tZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMTI2MzIyNTYiIHNob3dQYXJlbnQ9Ik5hbWUiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzJyeF9PZlhFZHVxSG9PSmJVUlpSdyIgeD0iOTc4NyIgeT0iMzAzOSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJyeUhPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDAzMSI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cycnlILWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0cycnlJT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxODYyIiBoZWlnaHQ9IjkwNSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cycnlJZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJyeUl1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMnJ5SS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJyeUpPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMnJ5SmVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJyeUp1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMnJ5Si1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJyeUtPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMnJ5S2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJyeUt1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzJyeUstZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzJyeUhlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HMnJ5SHVmWEVkdXFIb09KYlVSWlJ3IiB4PSIyMjE4IiB5PSIxMDIxOSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxEaWFncmFtU3R5bGUiIHhtaTppZD0iX0drOUlndWZYRWR1cUhvT0piVVJaUnciIGRlc2NyaXB0aW9uPSJUaGUgQnJlYWtkb3duIHBhY2thZ2UgY29udGFpbnMgdGhlIGRlZmluaXRpb24gb2YgYnJlYWtkb3duIGVsZW1lbnRzIHRoYXQgZm9ybSBicmVha2Rvd24gc3RydWN0dXJlcy4gIFRoZSBkaWFncmFtIHNob3dzIHRoZSB0YXhvbm9teSBvZiB0aGUgbWFpbiBjbGFzc2VzLiAgSXQgcHJlc2VudCB0aGUgZGlmZmVyZW50IHR5cGVzIG9mIEJyZWFrZG93biBFbGVtZW50cyBzdWNoIGFzIEFjdGl2aXR5IGFuZCBEZXNjcmlwdG9yIGFzIHdlbGwgYXMgdGhlaXIga2V5IHJlbGF0aW9uc2hpcHMgZGVmaW5lZCBpbiB0aGUgZm9sbG93aW5nIHNlY3Rpb25zLiIvPgotICAgICAgICAgICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HMVZ0Ni1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwM0Q2IiBzb3VyY2U9Il9HMVZ0Mi1mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HMU1qNE9mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzFWdDd1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMVZ0OE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzFWdDhlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0cxVnQ3LWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HMVZ0N09mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0cxVnQ3ZWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzE1MiwgLTQ1NywgMCwgMjA4Ml0kWzE1MiwgLTIwOTEsIDAsIDQ0OF0iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzFWdDh1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0cxVnQ4LWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzF5WndPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDNENyIgc291cmNlPSJfRzFNajhPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzFWdDItZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cxeVp3LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzF5WnhlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cxeVp4dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HMXlaeE9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzF5WngtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDNEQSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzF5WnllZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzF5WnlPZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTUwIiB5PSI0NTciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMXlaeXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzREEiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cxeVp6T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HMXlaeS1mWEVkdXFIb09KYlVSWlJ3IiB4PSItNzAiIHk9Ii0zNDciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMXlaemVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzRDgiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cxeVp6LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzF5Wnp1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTQ2IiB5PSIyMTIiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMXlaME9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDNEOCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzE4S3dPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzF5WjBlZlhFZHVxSG9PSmJVUlpSdyIgeD0iNjQiIHk9Ii0zNDciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMThLd2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwM0RBIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMThLdy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMThLeE9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HMThLd3VmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzE4S3hlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwM0Q4Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMThLeC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMThLeU9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HMThLeHVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzE4S3llZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzREEiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cxOEt5LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cxOEt6T2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0cxOEt5dWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMThLemVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwM0Q4Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMThLei1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cxOEswT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0cxOEt6dWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HMXlad2VmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0cxeVp3dWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzAsIC01NTgsIC01MCwgMTkzMF0kWzAsIC0yMDQwLCAtNTAsIDQ0OF0iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0cxOEs4ZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzMEQiIHNvdXJjZT0iX0cxOEswZWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0cxOEs0ZWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMThLOU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cxOEs5dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMThLOS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzE4SzllZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cxOEstT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzMTAiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cxOEstdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0cxOEstZWZYRWR1cUhvT0piVVJaUnciIHg9IjE0OCIgeT0iNDUwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzE4Sy0tZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzEwIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMThLX2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzE4S19PZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTcyIiB5PSItMzQ2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzE4S191ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzBFIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMThMQU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0cxOEtfLWZYRWR1cUhvT0piVVJaUnciIHg9Ii03NiIgeT0iMjA0Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzE4TEFlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzMEUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cxOExBLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0cxOExBdWZYRWR1cUhvT0piVVJaUnciIHg9IjU5IiB5PSItMzQ2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzE4TEJPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDMxMCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzE4TEJ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzE4TEItZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzE4TEJlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cxOExDT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDMwRSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzE4TEN1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzE4TEMtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzE4TENlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cxOExET2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzEwIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMThMRHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMThMRC1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HMThMRGVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzE4TEVPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDMwRSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzE4TEV1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMThMRS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HMThMRWVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzE4Szh1ZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HMThLOC1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlszNzIsIC01NTgsIC02NDMsIDE5MzBdJFszNzIsIC0yMDQ4LCAtNjQzLCA0NDBdIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HMkZVME9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTYwIiBzb3VyY2U9Il9HMkZVd09mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HMU1qNE9mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJGVTAtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMkZVMWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJGVTF1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0cyRlUxT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HMkZVMGVmWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzJGVTB1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTU4NCwgLTQ1NywgMjcxNywgMjA4Ml0kWy0yNzE3LCAtMjA5MSwgNTg0LCA0NDhdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0cyRlUxLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HMkZVMk9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0cyRlUyZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwM0YiIHNvdXJjZT0iX0cyRlV3T2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0cyRlVzT2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMkZVM09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyRlUzdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMkZVMy1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzJGVTNlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyRlU0T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwNDIiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyRlU0dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0cyRlU0ZWZYRWR1cUhvT0piVVJaUnciIHg9Ijg0IiB5PSItMTM1Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJGVTQtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwNDIiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyRlU1ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HMkZVNU9mWEVkdXFIb09KYlVSWlJ3IiB4PSIxODMiIHk9IjExMDYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMkZVNXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwNDAiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyRlU2T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzJGVTUtZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTM2OCIgeT0iLTEzNSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyRlU2ZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDQwIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMkZVNi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HMkZVNnVmWEVkdXFIb09KYlVSWlJ3IiB4PSI3MiIgeT0iLTM0NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyRlU3T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwNDIiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyRlU3dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cyRlU3LWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0cyRlU3ZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMkZVOE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwNDAiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyRlU4dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cyRlU4LWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0cyRlU4ZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMkZVOU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDA0MiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJGVTl1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzJGVTktZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzJGVTllZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyRlUtT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwNDAiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyRlUtdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzJGVS0tZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzJGVS1lZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0cyRlUydWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzJGVTItZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbNzM2LCAtNDQ4LCAtNTMzLCAyMDkxXSRbNzM2LCAtMjA5MSwgLTUzMywgNDQ4XSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzJGVkRPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDE2QSIgc291cmNlPSJfRzJGVV9PZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzJGVXdPZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyRlZELWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJGVkVlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyRlZFdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HMkZWRU9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJGVkUtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDE2RCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJGVkZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzJGVkZPZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTY0IiB5PSI0MDYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMkZWRnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxNkQiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyRlZHT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HMkZWRi1mWEVkdXFIb09KYlVSWlJ3IiB4PSItNjQiIHk9Ii0zNDgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMkZWR2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxNkIiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyRlZHLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzJGVkd1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTE3IiB5PSIxOTQiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMkZWSE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDE2QiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJGVkh1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzJGVkhlZlhFZHVxSG9PSmJVUlpSdyIgeD0iNTkiIHk9Ii0zNDgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMkZWSC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTZEIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMkZWSWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMkZWSXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HMkZWSU9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJGVkktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTZCIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMkZWSmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMkZWSnVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HMkZWSk9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJGVkotZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxNkQiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyRlZLZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cyRlZLdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0cyRlZLT2ZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMlBGc09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTZCIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMlBGc3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cyUEZzLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0cyUEZzZWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HMkZWRGVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0cyRlZEdWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0yNDUsIC01NjcsIDYxOCwgMTkyMV0kWy0yNDUsIC0yMDQ4LCA2MTgsIDQ0MF0iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0cyUEZ4T2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUYwNkJCQzAzMEQiIHNvdXJjZT0iX0cyUEZ0T2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0cyRlVfT2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMlBGeC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyUEZ5ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMlBGeXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzJQRnlPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyUEZ5LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUYwNkJCRTAwRTkiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyUEZ6ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0cyUEZ6T2ZYRWR1cUhvT0piVVJaUnciIHg9Ii0xNzkiIHk9Ii0yMzAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMlBGenVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUYwNkJCRTAwRTkiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyUEYwT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HMlBGei1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMzk3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJQRjBlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFGMDZCQkUwMERGIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMlBGMC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0cyUEYwdWZYRWR1cUhvT0piVVJaUnciIHg9Ii0xMDkiIHk9IjY3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJQRjFPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRjA2QkJFMDBERiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJQRjF1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzJQRjFlZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTE1ODciIHk9Ii0zNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMlBGMS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFGMDZCQkUwMEU5Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMlBGMmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMlBGMnVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HMlBGMk9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJQRjItZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFGMDZCQkUwMERGIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMlBGM2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMlBGM3VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HMlBGM09mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJQRjMtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUYwNkJCRTAwRTkiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyUEY0ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cyUEY0dWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0cyUEY0T2ZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMlBGNC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFGMDZCQkUwMERGIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMlBGNWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cyUEY1dWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0cyUEY1T2ZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HMlBGeGVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0cyUEZ4dWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzE0MywgNDkxLCAzODUyLCAtMTA4M10kWzE0MywgMTI5NSwgMzg1MiwgLTI3OV0kWy0xNzAxLCAxMjk1LCAyMDA2LCAtMjc5XSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzJQRjUtZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRjk0QUI5MDAxNSIgc291cmNlPSJfRzJQRnRPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzJGVXdPZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyUEY2dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJQRjdPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyUEY3ZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HMlBGNi1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzJQRjZPZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0cyUEY2ZWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0xMzgwLCAtMjg3LCAzMTkxLCA2MjZdJFstMzIzNCwgLTY2MCwgMTMzNywgMjU0XSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HMlBGN3VmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzJQRjctZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HMlBHRU9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFMEZGRDMwMEVGIiBzb3VyY2U9Il9HMlBHQU9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HMlBGOE9mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJQR0UtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMlBHRmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJQR0Z1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzJQR0ZPZlhFZHVxSG9PSmJVUlpSdyIgeD0iMzM4IiB5PSItNzcwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJQR0YtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRTBGRkQzMDBGMSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJQR0dlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzJQR0dPZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTUzOCIgeT0iLTI0NSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyUEdHdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFMEZGRDMwMEYxIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMlBHSE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzJQR0ctZlhFZHVxSG9PSmJVUlpSdyIgeD0iOTQzIiB5PSIyMzciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMlBHSGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUUwRkZEMzAwRjAiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyUEdILWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzJQR0h1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iNTM5IiB5PSItNDU3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJZMnNPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRTBGRkQzMDBGMCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJZMnN1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzJZMnNlZlhFZHVxSG9PSmJVUlpSdyIgeD0iNjUiIHk9Ii0xMjUzIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJZMnMtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRTBGRkQzMDBGMSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJZMnRlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzJZMnR1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzJZMnRPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyWTJ0LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRTBGRkQzMDBGMCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJZMnVlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzJZMnV1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzJZMnVPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyWTJ1LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFMEZGRDMwMEYxIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMlkydmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMlkydnVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HMlkydk9mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJZMnYtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRTBGRkQzMDBGMCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJZMndlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMlkyd3VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HMlkyd09mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzJQR0VlZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HMlBHRXVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMTcxOCwgMzgxLCAxOTM4LCAtMzEyNF0kWy00MTA2LCAzODEsIC00NDgsIC0zMTI0XSRbLTQxMDYsIDMwNTYsIC00NDgsIC00NDhdIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HMlkydy1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjhGIiBzb3VyY2U9Il9HMU1qNE9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HMlBHQU9mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJZMnh1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMlkyeU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJZMnllZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0cyWTJ4LWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HMlkyeE9mWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzJZMnhlZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMTUyLCAtNDU3LCAtMTA2NiwgMzA0OF0kWzk5OSwgLTI4OTUsIC0yMjAsIDYwOV0iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzJZMnl1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0cyWTJ5LWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzJZMnpPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDAzRSIgc291cmNlPSJfRzJGVXNPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzJQR0FPZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyWTJ6LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJZMjBlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyWTIwdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HMlkyME9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzJZMnplZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0cyWTJ6dWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy00NDAsIC00NTcsIDI5MTIsIDMwNDhdJFstMjc2OCwgLTI4OTUsIDU4NCwgNjA5XSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HMlkyMC1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzJZMjFPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HMlkyNWVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDExOUE0RjgwMjBBIiBzb3VyY2U9Il9HMlBHQU9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HMlkyMWVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJZMjZPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMlkyNnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJZMjYtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0cyWTI2ZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMlkyN09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxMTlBNEY5MDA3MyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJZMjd1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzJZMjdlZlhFZHVxSG9PSmJVUlpSdyIgeT0iMzk2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJZMjctZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDExOUE0RjkwMDczIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMlkyOGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzJZMjhPZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTE1MSIgeT0iLTM0NyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyWTI4dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxMTlBNEY5MDA2OSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJZMjlPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HMlkyOC1mWEVkdXFIb09KYlVSWlJ3IiB4PSItMjg3IiB5PSItMjQ1Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJZMjllZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxMTlBNEY5MDA2OSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJZMjktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzJZMjl1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTkzMCIgeT0iMzEzIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJZMi1PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxMTlBNEY5MDA3MyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJZMi11ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzJZMi0tZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzJZMi1lZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyWTJfT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxMTlBNEY5MDA2OSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJZMl91ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzJZMl8tZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzJZMl9lZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyWTNBT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDExOUE0RjkwMDczIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMlkzQXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMlkzQS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HMlkzQWVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJZM0JPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxMTlBNEY5MDA2OSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJZM0J1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMlkzQi1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HMlkzQmVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzJZMjV1ZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HMlkyNS1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlsxNzE4LCAxNTIsIC00Mjc1LCAwXSRbNDc3NSwgMTUyLCAtMTIxOSwgMF0iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0cyWTNDT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzMDMiIHNvdXJjZT0iX0cxOEs0ZWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0cxTWo0T2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMlkzQy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyWTNEZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMlkzRHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzJZM0RPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0cyWTNDZWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HMlkzQ3VmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9Ils2MTgsIC00NTcsIC0yOTg4LCAyMDgyXSRbMjk0NiwgLTIwOTEsIC02NjAsIDQ0OF0iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzJZM0QtZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0cyWTNFT2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzJpQXFPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyODNFOTFGMDA2MSIgc291cmNlPSJfRzJQR0FPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzJZM0VlZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyaUFxLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJpQXJlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyaUFydWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HMmlBck9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzJpQXFlZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0cyaUFxdWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzAsIC02MTgsIDAsIDEyMTBdJFswLCAtMTM4MCwgMCwgNDQ4XSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HMmlBci1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzJpQXNPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HMmlBc2VmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI4M0VFRjkwMEUyIiBzb3VyY2U9Il9HMlkyMWVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HMlkzRWVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJpQXRPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMmlBdHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJpQXQtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0cyaUF0ZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HMmlBc3VmWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzJpQXMtZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTEyMjcsIC00MjMsIDQ3NjYsIDE1NTddJFstNDYyMiwgLTE1MzIsIDEzNzEsIDQ0OF0iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzJpQXVPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0cyaUF1ZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzJyeHEtZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyODNFRDZEMDA4OCIgc291cmNlPSJfRzJpQTJ1ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzJZM0VlZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cycnhydWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJyeHNPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cycnhzZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HMnJ4ci1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzJyeHJPZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0cycnhyZWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0xMDgzLCAtMTUyLCA0NzU4LCA2MDldJFstNDM2OCwgLTU3NSwgMTQ3MywgMTg2XSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HMnJ4c3VmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzJyeHMtZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HMnJ4dE9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTkyM0IwMDAyIiBzb3VyY2U9Il9HMThLNGVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HMmlBeXVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJyeHQtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMnJ4dWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJyeHV1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0cycnh1T2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HMnJ4dGVmWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzJyeHR1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTIzNywgLTQ1NywgMjMwMiwgNDY3M10kWy0yMzI4LCAtNDY4MiwgMjExLCA0NDhdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0cycnh1LWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HMnJ4dk9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0cycnh2ZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjhDRDMyMzAxOUEiIHNvdXJjZT0iX0cyaUF5dWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0cyUEdBT2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMnJ4d09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cycnh3dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMnJ4dy1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzJyeHdlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0cycnh2dWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzJyeHYtZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbOTE0LCAtNDQ4LCAtNjQ1MSwgNDY1XSRbOTE0LCAtMTI3OCwgLTY0NTEsIC0zNjRdJFs1NjQ3LCAtMTI3OCwgLTE3MTgsIC0zNjRdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0cycnh4T2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HMnJ4eGVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0cycngxdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBODJGMzAyNkUiIHNvdXJjZT0iX0cycnh4dWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0cyaUF1dWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMnJ4MmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cycngyLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMnJ4M09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzJyeDJ1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0cycngxLWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iMTI2MzIyNTYiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzJyeDJPZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMTQyMiwgLTUyNCwgLTMzMDIsIDExNTFdJFszMzAyLCAtMTE4NSwgLTE0MjIsIDQ5MV0iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzJyeDNlZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0cycngzdWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzJyeDMtZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E5MjgyMDM5MiIgc291cmNlPSJfRzJQRjhPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzJpQXl1ZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cycng0dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJyeDVPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cycng1ZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HMnJ4NC1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzJyeDRPZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0cycng0ZWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy02NDMsIC00NTcsIDMwNjQsIDIxMzNdJFstMzA3MywgLTIxNDIsIDYzNSwgNDQ4XSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HMnJ4NXVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzJyeDUtZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HMnJ4Nk9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI4Q0QzMjkwMUZEIiBzb3VyY2U9Il9HMlBGOE9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HMnJ4eHVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJyeDYtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMnJ4N2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJyeDd1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0cycng3T2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HMnJ4NmVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0cycng2dWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy05NTIsIC0xMzIsIDQzOTIsIDc5MTFdJFstNjUzNSwgLTEzMiwgLTExOTEsIDc5MTFdJFstNjUzNSwgLTc3MjUsIC0xMTkxLCAzMThdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0cycng3LWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HMnJ4OE9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0cycng4ZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBODMxODAwQjgiIHNvdXJjZT0iX0cxOEswZWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0cycnh4dWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMnJ4OU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cycng5dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMnJ4OS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzJyeDllZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0cycng4dWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzJyeDgtZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTIxMTcsIC0yMTIsIDkyNiwgMTI5MzhdJFstNTIxMywgLTIxMiwgLTIxNzAsIDEyOTM4XSRbLTUyMTMsIC0xMzI1NiwgLTIxNzAsIC0xMDZdJFstNDU3OCwgLTEzMjU2LCAtMTUzNSwgLTEwNl0iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzJyeC1PZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0cycngtZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzJyeUN1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyOTRFQ0MxMDMxRSIgc291cmNlPSJfRzJZM0VlZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzJyeC11ZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cycnlEZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJyeUQtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cycnlFT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HMnJ5RHVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzJyeUMtZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HMnJ5RE9mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlswLCAtNDQ4LCAtMTAxLCAxOTg5XSRbMCwgLTE5MzAsIC0xMDEsIDUwOF0iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzJyeUVlZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0cycnlFdWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzJyeUUtZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyOTRFQzJCMDFDQSIgc291cmNlPSJfRzJyeC11ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzJpQXV1ZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cycnlGdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJyeUdPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cycnlHZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HMnJ5Ri1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzJyeUZPZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSIxMjYzMjI1NiIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HMnJ5RmVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMTA3NSwgLTUyNCwgMjgzNiwgMTM1NF0kWy0yODM2LCAtMTM2MywgMTA3NSwgNTE2XSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HMnJ5R3VmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzJyeUctZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HMnJ5TE9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDJCMUVDMUIwMzQ5IiBzb3VyY2U9Il9HMnJ5SE9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HMmlBeXVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzIxaW9PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMjFpb3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzIxaW8tZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0cyMWlvZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HMnJ5TGVmWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzJyeUx1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMjIwLCAtNDU3LCAtNzQ1LCAxNDczXSRbNzI4LCAtMTQ4MSwgLTIzNywgNDQ4XSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HMjFpcE9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzIxaXBlZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICA8L2NvbnRlbnRzPgotICAgICAgICAgICAgPGNvbnRlbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpEaWFncmFtIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEY1QzUxMzAyMDMiIHR5cGU9IkNsYXNzIiBuYW1lPSJXb3JrQnJlYWtkb3duU3RydWN0dXJlIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyMWlwdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5vdGUiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMjFpcWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJEaWFncmFtTmFtZSI+Ci0gICAgICAgICAgICAgICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzIxaXF1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRGVzY3JpcHRpb24iPgotICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246U2hhcGVTdHlsZSIgeG1pOmlkPSJfRzIxaXAtZlhFZHVxSG9PSmJVUlpSdyIgZGVzY3JpcHRpb249IntJdGVyYXRpb24ucHJlZml4ID0gJnF1b3Q7SXRlcmF0aW9uJnF1b3Q7fSYjeEE7IiBsaW5lQ29sb3I9IjAiLz4KLSAgICAgICAgICAgICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzIxaXFPZlhFZHVxSG9PSmJVUlpSdyIgeD0iMjA5MjEiIHk9IjEzODU5IiB3aWR0aD0iMzE3NSIgaGVpZ2h0PSIxMjQ0Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMjFpcS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOb3RlIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzIxaXJ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRGlhZ3JhbU5hbWUiPgotICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyMWlyLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkRlc2NyaXB0aW9uIj4KLSAgICAgICAgICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOlNoYXBlU3R5bGUiIHhtaTppZD0iX0cyMWlyT2ZYRWR1cUhvT0piVVJaUnciIGRlc2NyaXB0aW9uPSJ7UGhhc2UucHJlZml4ID0gJnF1b3Q7UGhhc2UmcXVvdDt9JiN4QTsiIGxpbmVDb2xvcj0iMCIvPgotICAgICAgICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HMjFpcmVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxNzc1NCIgeT0iMTM4NTkiIHdpZHRoPSIyODAyIiBoZWlnaHQ9IjEyNDQiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyMWlzT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RDAzQ0IiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMjFpcy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HMjFpdE9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzIxaXRlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMjFpdHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyMWl0LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMjFpdU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cyMWl1ZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMjFpdXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cyMWl1LWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMjFpdk9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cyMWl2ZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMjFpdnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMjFpdi1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HMjFpc2VmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iTm9uZSIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0cyMWlzdWZYRWR1cUhvT0piVVJaUnciIHg9IjIxNTgxIiB5PSIxMjA1NiIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzIxaXdPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVEMDNDQSI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyMWl3LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0cyMWl4T2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMjFpeGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyLXNrT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzItc2tlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyLXNrdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzItc2stZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyLXNsT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzItc2xlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyLXNsdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzItc2wtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyLXNtT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cyLXNtZWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0cyMWl3ZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJOb25lIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzIxaXd1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTkxNTEiIHk9IjEyMTA3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMi1zbXVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMEU2Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzItc25lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzItc251ZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyLXNuLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzItc29PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMi1zb2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzItc291ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMi1zby1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzItc3BPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMi1zcGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzItc3B1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMi1zcC1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzItc3FPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzItc3FlZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzItc20tZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9Ik5vbmUiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HMi1zbk9mWEVkdXFIb09KYlVSWlJ3IiB4PSIxMzc3NSIgeT0iODE0NCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzItc3F1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI5RSI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyLXNyZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0cyLXNydWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMi1zci1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyLXNzT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzItc3NlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyLXNzdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzItc3MtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyLXN0T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzItc3RlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyLXN0dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzItc3QtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyLXN1T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cyLXN1ZWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0cyLXNxLWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzItc3JPZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTQxOTAiIHk9IjEzOTM0Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMi1zdXVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDA5Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzItc3ZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzItc3Z1ZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyLXN2LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzItc3dPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMi1zd2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzItc3d1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMi1zdy1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzItc3hPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMi1zeGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzItc3h1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMi1zeC1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzItc3lPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzItc3llZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzItc3UtZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9Ik5vbmUiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HMi1zdk9mWEVkdXFIb09KYlVSWlJ3IiB4PSIxMzM1MSIgeT0iMTE3MDAiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyLXM3ZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwMzEiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMi1zOE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HMi1zOGVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzItczh1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMi1zOC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyLXM5T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMi1zOWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cyLXM5dWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMi1zOS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cyLXMtT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMi1zLWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cyLXMtdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMi1zLS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMi1zX09mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HMi1zN3VmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iTm9uZSIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0cyLXM3LWZYRWR1cUhvT0piVVJaUnciIHg9IjExNjU4IiB5PSI3MDI3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMi1zX2VmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDEwODAwNTcwMjc2Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNJZGtPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzNJZGtlZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czSWRrdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNJZGstZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iS2luZCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM0lkbE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czSWRsZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM0lkbHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJFbnVtZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HM0lkbC1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNJZG1PZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HM0lkbWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNJZG11ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HM0lkbS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HMi1zX3VmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iTm9uZSIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0cyLXNfLWZYRWR1cUhvT0piVVJaUnciIHg9IjU0NTkiIHk9IjEyMzQ3IiB3aWR0aD0iMzIzNCIgaGVpZ2h0PSIyNzE2Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM1JuaC1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUQwM0QzIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNSbml1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzNSbmktZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czUm5qT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNSbmplZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM1JuanVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNSbmotZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HM1Jua09mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNSbmtlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HM1Jua3VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNSbmstZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HM1JubE9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNSbmxlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzNSbmx1ZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzNSbmlPZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9Ik5vbmUiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HM1JuaWVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxOTEyNiIgeT0iODEzNiIgd2lkdGg9IjI3OTQiIGhlaWdodD0iMjExNiIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNSbnFlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDBFRiI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czUm5yT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0czUm5yZWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM1JucnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czUm5yLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNSbnNPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czUm5zZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HM1Juc3VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNSbnMtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HM1JudE9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNSbnRlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HM1JudHVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNSbnQtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzNSbnVPZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzNSbnF1ZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9Ik5vbmUiIHNob3dMaXN0U2lnbmF0dXJlPSJ0cnVlIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzNSbnEtZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTY4MTQiIHk9IjE4ODgiIHdpZHRoPSI3NTI2IiBoZWlnaHQ9IjI4MjciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czYll2ZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTA4MTg3OTAyODgiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM2JZd09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HM2JZd2VmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNiWXd1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM2JZdy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czYll4T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM2JZeGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzNiWXh1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czYll4LWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzNiWXlPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czYll5ZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzNiWXl1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czYll5LWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0czYll6T2ZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0czYll2dWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJOb25lIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzNiWXYtZlhFZHVxSG9PSmJVUlpSdyIgeD0iNDM2MCIgeT0iMTAzNjMiIHdpZHRoPSI3MjMwIiBoZWlnaHQ9IjE1MjQiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czYll6ZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBOTI1NDAyMjciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM2JZME9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HM2JZMGVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNiWTB1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM2JZMC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czYlkxT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM2JZMWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzNiWTF1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czYlkxLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzNiWTJPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czYlkyZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzNiWTJ1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czYlkyLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0czYlkzT2ZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0czYll6dWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBzaG93TGlzdFNpZ25hdHVyZT0idHJ1ZSIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0czYll6LWZYRWR1cUhvT0piVVJaUnciIHg9IjU2NjQiIHk9IjM3NTAiIHdpZHRoPSI1OTQzIiBoZWlnaHQ9IjIzNTMiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MRGlhZ3JhbVN0eWxlIiB4bWk6aWQ9Il9HbEdTWWVmWEVkdXFIb09KYlVSWlJ3IiBkZXNjcmlwdGlvbj0iVGhpcyBkaWFncmFtIHNob3dzIHRoZSB2aWV3IG9uIEJyZWFrZG93biBFbGVtZW50cyBmcm9tIGEgd29yayBicmVha2Rvd24gcGVyc3BlY3RpdmUgY2FsbGVkIFdCUyAoV29yayBCcmVha2Rvd24gU3RydWN0dXJlKSB0aGF0IGluY2x1ZGVzIFRhc2tzIGFuZCBBY3Rpdml0aWVzIChidXQgYWxzbyB0aGUgbm90aW9uIG9mIE1pbGVzdG9uZXMgdGhhdCBkbyBub3QgcmVwcmVzZW50IHdvcmspLiAgVU1BIGFsc28gZGVmaW5lcyB0d28gbW9yZSB2aWV3cyB0aGF0IGhhdmUgYmVlbiBkZWZpbmVkIGFzIFdvcmsgUHJvZHVjdCBCcmVha2Rvd24gU3RydWN0dXJlIGFuZCBUZWFtIFByb2ZpbGUgQnJlYWtkb3duIFN0cnVjdHVyZS4iLz4KLSAgICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzItc3l1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDMwRCIgc291cmNlPSJfRzItc3F1ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzItc3V1ZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyLXN6ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzItc3otZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyLXMwT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HMi1zenVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzItczBlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDMxMCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzItczAtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzItczB1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMjQ0IiB5PSI0MDYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMi1zMU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzMTAiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyLXMxdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HMi1zMWVmWEVkdXFIb09KYlVSWlJ3IiB4PSItMTAzIiB5PSItMzQ4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzItczEtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzBFIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMi1zMmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0cyLXMyT2ZYRWR1cUhvT0piVVJaUnciIHg9IjUiIHk9IjIxMSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyLXMydWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzBFIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMi1zM09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HMi1zMi1mWEVkdXFIb09KYlVSWlJ3IiB4PSI5OCIgeT0iLTM0OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyLXMzZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzMTAiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyLXMzLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cyLXM0T2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0cyLXMzdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMi1zNGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzMEUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyLXM0LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cyLXM1T2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0cyLXM0dWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMi1zNWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDMxMCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzItczUtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzItczZPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzItczV1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyLXM2ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzMEUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyLXM2LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzItczdPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzItczZ1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0cyLXN5LWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzItc3pPZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTMzLCAtNTU4LCAxNiwgMjU5MF0kWy0zMywgLTI2NTgsIDE2LCA0OTFdIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HM0lkbk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOb3RlQXR0YWNobWVudCIgc291cmNlPSJfRzIxaXEtZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzIxaXdPZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246Q29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0czSWRuZWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iMCIvPgotICAgICAgICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HM0lkbnVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlswLCAtNjI2LCAwLCAxMjUzXSRbMCwgLTEzODgsIDAsIDQ5MV0iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzNSbmdPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0czUm5nZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzNSbmd1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTm90ZUF0dGFjaG1lbnQiIHNvdXJjZT0iX0cyMWlwdWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0cyMWlzT2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkNvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HM1JuZy1mWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjAiLz4KLSAgICAgICAgICAgICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzNSbmhPZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTI1LCAtNjI2LCAyNSwgMTMwM10kWy00MiwgLTE0MzksIDgsIDQ5MV0iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzNSbmhlZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0czUm5odWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzNSbmwtZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDJBMCIgc291cmNlPSJfRzIxaXNPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzNSbmgtZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czUm5tdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNSbm5PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czUm5uZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HM1JubS1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzNSbm1PZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0czUm5tZWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0yODcsIC00OTksIDE2NDIsIDI4NTNdJFstMTMyOSwgLTIyOTQsIDYwMSwgMTA1OF0iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzNSbm51ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0czUm5uLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzNSbm9PZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDI5RiIgc291cmNlPSJfRzIxaXdPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzNSbmgtZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czUm5vLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNSbnBlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czUm5wdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HM1JucE9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzNSbm9lZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0czUm5vdWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzE4NiwgLTQ5OSwgLTExODUsIDI5MDRdJFs5MzksIC0yMzQ1LCAtNDMxLCAxMDU4XSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HM1JucC1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzNSbnFPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HM1JudWVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMkI1IiBzb3VyY2U9Il9HM1JucWVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HM1JucWVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNSbnZPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM1JudnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNSbnYtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzNSbnZlZlhFZHVxSG9PSmJVUlpSdyIgeD0iOTQ4IiB5PSItMjc4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czUm53T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyQjgiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czUm53dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0czUm53ZWZYRWR1cUhvT0piVVJaUnciIHg9IjIyNCIgeT0iLTU3OSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czUm53LWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDJCOCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNSbnhlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0czUm54T2ZYRWR1cUhvT0piVVJaUnciIHg9IjE0NDkiIHk9Ii01MDQiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM1JueHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyQjYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czUm55T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzNSbngtZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTU1NiIgeT0iLTI0MSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czUm55ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyQjYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czUm55LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0czUm55dWZYRWR1cUhvT0piVVJaUnciIHg9Ii0xNDUiIHk9IjMzNCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czUm56T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyQjgiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czUm56dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0czUm56LWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0czUm56ZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM1JuME9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyQjYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czUm4wdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0czUm4wLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0czUm4wZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM1JuMU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDJCOCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNSbjF1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzNSbjEtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzNSbjFlZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czUm4yT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyQjYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czUm4ydWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzNSbjItZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzNSbjJlZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0czUm51dWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzNSbnUtZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMzc1NywgLTY2MiwgMzc1NywgLTY2Ml0kWzYxMzgsIC02NjIsIDYxMzgsIC02NjJdJFs2MTM4LCAtMjMyOSwgNjEzOCwgLTIzMjldJFs1MDIsIC0yMzI5LCA1MDIsIC0yMzI5XSRbNTAyLCAtMTQyOSwgNTAyLCAtMTQyOV0iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0czUm4zT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyOEYiIHNvdXJjZT0iX0cyLXNtdWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0czUm5xZWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM1JuMy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czUm40ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM1JuNHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzNSbjRPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0czUm4zZWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HM1JuM3VmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9Ils1MTYsIC00OTksIC01Mjc0LCA0ODM0XSRbNDIzMywgLTM5MjAsIC0xNTU3LCAxNDEzXSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HM1JuNC1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzNSbjVPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HM1JuNWVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFMEZGRDMwMEVGIiBzb3VyY2U9Il9HM1JucWVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HM1JuaC1mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNSbjZPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM1JuNnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNSbjYtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzNSbjZlZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTc2MyIgeT0iOTIzIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNSbjdPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRTBGRkQzMDBGMSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNiWWdPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzNSbjdlZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTE2ODQiIHk9IjMzNSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czYllnZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFMEZGRDMwMEYxIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM2JZZy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzNiWWd1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTIyOSIgeT0iLTI3MCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czYlloT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRTBGRkQzMDBGMCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNiWWh1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HM2JZaGVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxNDEwIiB5PSItMjU0Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNiWWgtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRTBGRkQzMDBGMCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNiWWllZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzNiWWlPZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTIzIiB5PSIyNjIiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM2JZaXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFMEZGRDMwMEYxIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM2JZak9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HM2JZamVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HM2JZaS1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNiWWp1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFMEZGRDMwMEYwIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM2JZa09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HM2JZa2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HM2JZai1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNiWWt1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUUwRkZEMzAwRjEiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czYllsT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0czYllsZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0czYllrLWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM2JZbHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFMEZGRDMwMEYwIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM2JZbU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0czYlltZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0czYllsLWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HM1JuNXVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0czUm41LWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzM3NTcsIDgyMCwgMzgxMCwgLTUwNTRdJFs2ODI2LCA4MjAsIDY4NzksIC01MDU0XSRbNjgyNiwgNTc5NCwgNjg3OSwgLTgwXSRbMTM0OSwgNTc5NCwgMTQwMiwgLTgwXSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzNiWW11ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMUU4RjBDMDI4MSIgc291cmNlPSJfRzNSbnFlZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzNSbnFlZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czYlluZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNiWW4tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czYllvT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HM2JZbnVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNiWW9lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMUU4RjBFMDI2NiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNiWW8tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzNiWW91ZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTE0OSIgeT0iNTQ4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNiWXBPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRThGMEUwMjY2Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM2JZcHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzNiWXBlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTM5NyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czYllwLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMUU4RjBFMDIzNCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNiWXFlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HM2JZcU9mWEVkdXFIb09KYlVSWlJ3IiB4PSIxMTUzIiB5PSI1MzIiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM2JZcXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRThGMEUwMjM0Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM2JZck9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HM2JZcS1mWEVkdXFIb09KYlVSWlJ3IiB4PSI0MjgiIHk9Ii0zMjYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM2JZcmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRThGMEUwMjY2Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM2JZci1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HM2JZc09mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HM2JZcnVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNiWXNlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRThGMEUwMjM0Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM2JZcy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HM2JZdE9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HM2JZc3VmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNiWXRlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjFFOEYwRTAyNjYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czYll0LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0czYll1T2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0czYll0dWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM2JZdWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRThGMEUwMjM0Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM2JZdS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0czYll2T2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0czYll1dWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HM2JZbS1mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0czYlluT2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0zNzU3LCAtNzY3LCAtMzc1NywgLTc2N10kWy01MTA3LCAtNzY3LCAtNTEwNywgLTc2N10kWy01MTA3LCAtMjMyOSwgLTUxMDcsIC0yMzI5XSRbLTg0NywgLTIzMjksIC04NDcsIC0yMzI5XSRbLTg0NywgLTE0MjksIC04NDcsIC0xNDI5XSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzNiWTNlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyODBFRDM4MDBBMCIgc291cmNlPSJfRzNiWXZlZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzNiWXplZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czYlk0T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNiWTR1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czYlk0LWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HM2JZNGVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNiWTVPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyODBFRDM4MDBBMiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNiWTV1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzNiWTVlZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTI2NiIgeT0iMTQ0Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNiWTUtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjgwRUQzODAwQTIiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czYlk2ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HM2JZNk9mWEVkdXFIb09KYlVSWlJ3IiB4PSItMjU4IiB5PSItMTYyNiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czYlk2dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyODBFRDM4MDBBMSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNiWTdPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HM2JZNi1mWEVkdXFIb09KYlVSWlJ3IiB4PSIxNzAiIHk9IjI0NSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czYlk3ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjgwRUQzODAwQTEiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czYlk3LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0czYlk3dWZYRWR1cUhvT0piVVJaUnciIHg9IjE1MyIgeT0iLTUwOCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czYlk4T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjgwRUQzODAwQTIiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czYlk4dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0czYlk4LWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0czYlk4ZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM2JZOU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjgwRUQzODAwQTEiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czYlk5dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0czYlk5LWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0czYlk5ZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM2JZLU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyODBFRDM4MDBBMiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNiWS11ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzNiWS0tZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzNiWS1lZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czYllfT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjgwRUQzODAwQTEiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czYllfdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzNiWV8tZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzNiWV9lZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0czYlkzdWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzNiWTMtZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTExODUsIC03NjIsIC0xODQ1LCA1NDM1XSRbLTExODUsIC01MDIwLCAtMTg0NSwgMTE3Nl0iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0czbEpnT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjgwRUQ0MDAwQ0QiIHNvdXJjZT0iX0czYll2ZWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0czYll6ZWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM2xKZy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czbEpoZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM2xKaHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HM2xKaE9mWEVkdXFIb09KYlVSWlJ3IiB4PSI3NTAiIHk9IjEwMjYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM2xKaC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI4MEVENDAwMENGIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM2xKaWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HM2xKaU9mWEVkdXFIb09KYlVSWlJ3IiB4PSItMjY4IiB5PSItMTc3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNsSml1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjgwRUQ0MDAwQ0YiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czbEpqT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HM2xKaS1mWEVkdXFIb09KYlVSWlJ3IiB4PSItMjM0IiB5PSIxNzcxIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNsSmplZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI4MEVENDAwMENFIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM2xKai1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0czbEpqdWZYRWR1cUhvT0piVVJaUnciIHg9IjE5NCIgeT0iLTE1NyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czbEprT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjgwRUQ0MDAwQ0UiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czbEprdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0czbEprZWZYRWR1cUhvT0piVVJaUnciIHg9IjE2OSIgeT0iNjMxIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNsSmstZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyODBFRDQwMDBDRiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNsSmxlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzNsSmx1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzNsSmxPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czbEpsLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyODBFRDQwMDBDRSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNsSm1lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzNsSm11ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzNsSm1PZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czbEptLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI4MEVENDAwMENGIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM2xKbmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HM2xKbnVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HM2xKbk9mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNsSm4tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyODBFRDQwMDBDRSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNsSm9lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HM2xKb3VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HM2xKb09mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzNsSmdlZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HM2xKZ3VmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlszOTcsIC03NjIsIC0yNjIsIDU0MzVdJFszOTcsIC01MDI5LCAtMjYyLCAxMTY4XSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzNsSm8tZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDMwMyIgc291cmNlPSJfRzItc3V1ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzItc211ZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czbEpwdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNsSnFPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czbEpxZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HM2xKcC1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzNsSnBPZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HM2xKcGVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlsyNSwgLTQ5OSwgLTI1LCAzMDU2XSRbMjUsIC0zMDczLCAtMjUsIDQ4Ml0iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzNsSnF1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0czbEpxLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzNsSnJPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E5MjNCMDAwMiIgc291cmNlPSJfRzItc3V1ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzNiWXplZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czbEpyLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNsSnNlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czbEpzdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HM2xKc09mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzNsSnJlZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0czbEpydWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy00MTQsIC00OTksIDU2ODEsIDY3NjRdJFstNTEwNSwgLTYwODcsIDk5MCwgMTE3Nl0iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzNsSnMtZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0czbEp0T2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzNsSnRlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E5MjgyMDM5MiIgc291cmNlPSJfRzNSbmgtZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzNiWXplZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czbEp1T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNsSnV1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czbEp1LWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HM2xKdWVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzNsSnR1ZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0czbEp0LWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0xNDA1LCAtNTE2LCAxMDQ4MSwgMzc1MF0kWy04OTE1LCAtMzIwMCwgMjk3MSwgMTA2Nl0iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzNsSnZPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0czbEp2ZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzNsSnZ1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyOENEMzIzMDE5QSIgc291cmNlPSJfRzNiWXplZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzNSbnFlZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czbEp3ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNsSnctZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czbEp4T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HM2xKd3VmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzNsSnYtZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0czbEp3T2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzI5NzEsIC00MDYsIC04OTY2LCAxMjE5XSRbODE3MCwgLTExMTcsIC0zNzY3LCA1MDhdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0czbEp4ZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HM2xKeHVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0czbEp4LWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MkIxRUMxQjAzNDkiIHNvdXJjZT0iX0cyLXM3ZWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0czYll6ZWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM2xKeXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czbEp6T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM2xKemVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzNsSnktZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0czbEp5T2ZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HM2xKeWVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstNzUzLCAtNDk5LCAzMjA4LCAyMDkxXSRbLTIxNTksIC0xNDEzLCAxODAzLCAxMTc2XSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HM2xKenVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzNsSnotZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICA8L2NvbnRlbnRzPgotICAgICAgICAgICAgPGNvbnRlbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpEaWFncmFtIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEY1RjFFODAyODMiIHR5cGU9IkNsYXNzIiBuYW1lPSJUZWFtQnJlYWtkb3duU3RydWN0dXJlIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czdVRjT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5vdGUiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM3VUYy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJEaWFncmFtTmFtZSI+Ci0gICAgICAgICAgICAgICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzN1VGRPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRGVzY3JpcHRpb24iPgotICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246U2hhcGVTdHlsZSIgeG1pOmlkPSJfRzN1VGNlZlhFZHVxSG9PSmJVUlpSdyIgZGVzY3JpcHRpb249IntSb2xlRGVzY3JpcHRvci5tb2RpZmllcyA9IFJvbGUucGVyZm9ybXNBc093bmVyLm91dHB1dCB1bmlvbiBSb2xlLnBlcmZvcm1zQWRkaXRpb25hbGx5Lm91dHB1dCB1bmlvbiBSb2xlLmFzc2lzdHNJbi5vdXRwdXR9IiBsaW5lQ29sb3I9IjAiLz4KLSAgICAgICAgICAgICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzN1VGN1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTA3MjYiIHk9IjE3MzcwIiB3aWR0aD0iNjE0NyIgaGVpZ2h0PSIxODUyIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM3VUZGVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMEU2Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzN1VGVPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzN1VGVlZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czdVRldWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzN1VGUtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM3VUZk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzN1VGZlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HM3VUZnVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzN1VGYtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HM3VUZ09mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzN1VGdlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HM3VUZ3VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzN1VGctZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzN1VGhPZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzN1VGR1ZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9Ik5vbmUiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HM3VUZC1mWEVkdXFIb09KYlVSWlJ3IiB4PSIxNDk3NyIgeT0iODg5MCIgd2lkdGg9IjI4NjEiIGhlaWdodD0iMTczNSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzN1VGhlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDBFRiI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czdVRpT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0czdVRpZWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSI3NTg2IiBoZWlnaHQ9IjI2NDEiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM3VUaXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czdVRpLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzN1VGpPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czdVRqZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HM3VUanVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzN1VGotZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HM3VUa09mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzN1VGtlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HM3VUa3VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzN1VGstZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzN1VGxPZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzN1VGh1ZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HM3VUaC1mWEVkdXFIb09KYlVSWlJ3IiB4PSI3OTkyIiB5PSI0MDY0Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMzRFaWVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDQ1Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzM0RWpPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzM0RWplZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czNEVqdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzM0RWotZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMzRFa09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzM0RWtlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0czNEVrdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMzRFay1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0czNEVsT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMzRFbGVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0czNEVsdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMzRFbC1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMzRFbU9mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HMzRFaXVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iTm9uZSIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0czNEVpLWZYRWR1cUhvT0piVVJaUnciIHg9IjE1NzA1IiB5PSIxMjk1NCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzM0RW91ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDA2MyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czNEVwZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0czNEVwdWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMzRFcC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czNEVxT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzM0RXFlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czNEVxdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzM0RXEtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czNEVyT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzM0RXJlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czNEVydWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzM0RXItZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czNEVzT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0czNEVzZWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0czNEVvLWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJOb25lIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzM0RXBPZlhFZHVxSG9PSmJVUlpSdyIgeD0iNjY5NyIgeT0iODU1OSIgd2lkdGg9IjI3MzIiIGhlaWdodD0iMjE4NCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRCMWVlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDA4QiI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0QjFmT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c0QjFmZWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEIxZnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0QjFmLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRCMWdPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0QjFnZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzRCMWd1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0QjFnLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzRCMWhPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0QjFoZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzRCMWh1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0QjFoLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0QjFpT2ZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c0QjFldWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJOb25lIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzRCMWUtZlhFZHVxSG9PSmJVUlpSdyIgeD0iNTcyNiIgeT0iMTMyMTYiIHdpZHRoPSIzMTQ2IiBoZWlnaHQ9IjI0MjkiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0QjJBT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUYwNkI2NTAwRTYiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEIyQS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HNEIyQk9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRCMkJlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEIyQnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0QjJCLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEIyQ09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0QjJDZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEIyQ3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0QjJDLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEtfWU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0S19ZZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEtfWXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNEtfWS1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HNEIyQWVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c0QjJBdWZYRWR1cUhvT0piVVJaUnciIHg9IjExMDAiIHk9IjE1NjI5IiB3aWR0aD0iMzc5MyIgaGVpZ2h0PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEtfWk9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjk2Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRLX1otZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzRLX2FPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0S19hZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRLX2F1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEtfYS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRLX2JPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNEtfYmVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRLX2J1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNEtfYi1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRLX2NPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNEtfY2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRLX2N1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzRLX2MtZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzRLX1plZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNEtfWnVmWEVkdXFIb09KYlVSWlJ3IiB4PSI0MTMxIiB5PSIxNzMzMSIgd2lkdGg9IjQyMzMiIGhlaWdodD0iMTMwMyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxEaWFncmFtU3R5bGUiIHhtaTppZD0iX0dsR1NZLWZYRWR1cUhvT0piVVJaUnciIGRlc2NyaXB0aW9uPSJUaGlzIGRpYWdyYW0gc2hvd3MgdGhlIHZpZXcgb24gYSBwcm9jZXNzIGZyb20gYSBUZWFtIGFuZCBSb2xlIHBlcnNwZWN0aXZlIGNhbGxlZCBUQlMgKFRlYW0gQnJlYWtkb3duIFN0cnVjdHVyZSkuIi8+Ci0gICAgICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0czdVRsZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyQjUiIHNvdXJjZT0iX0czdVRoZWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0czdVRoZWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM3VUbU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czdVRtdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM3VUbS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzN1VG1lZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czdVRuT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyQjgiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czdVRudWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0czdVRuZWZYRWR1cUhvT0piVVJaUnciIHg9IjEzNzgiIHk9IjM4MCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czdVRuLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDJCOCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzN1VG9lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0czdVRvT2ZYRWR1cUhvT0piVVJaUnciIHg9IjE0OTUiIHk9IjM5OSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czdVRvdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDJCNiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzN1VHBPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HM3VUby1mWEVkdXFIb09KYlVSWlJ3IiB4PSItMTA1MyIgeT0iMTkyIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzN1VHBlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDJCNiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzN1VHAtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzN1VHB1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTI3NSIgeT0iLTI3NCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czdVRxT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyQjgiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czdVRxdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0czdVRxLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0czdVRxZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM3VUck9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyQjYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czdVRydWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0czdVRyLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0czdVRyZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM3VUc09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDJCOCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzN1VHN1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzN1VHMtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzN1VHNlZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czdVR0T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyQjYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czdVR0dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzN1VHQtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzN1VHRlZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0czdVRsdWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzN1VGwtZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTI3MjUsIC0yNiwgLTI3MjUsIC0yNl0kWy01Njg4LCAtMjYsIC01Njg4LCAtMjZdJFstNTY4OCwgLTI5MzcsIC01Njg4LCAtMjkzN10kWy0xNTg3LCAtMjkzNywgLTE1ODcsIC0yOTM3XSRbLTE1ODcsIC0xMDU4LCAtMTU4NywgLTEwNThdIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HM3VUdU9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjhGIiBzb3VyY2U9Il9HM3VUZGVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HM3VUaGVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzN1VHUtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM3VUdmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzN1VHZ1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0czdVR2T2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HM3VUdWVmWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzN1VHV1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTkzMSwgLTg3MiwgMzY5MSwgMzQ5Nl0kWy0zMjM0LCAtMzA0OCwgMTM4OCwgMTMyMF0iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzN1VHYtZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0czdVR3T2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzN1VHdlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMUU4RjBDMDI4MSIgc291cmNlPSJfRzN1VGhlZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzN1VGhlZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czdVR4T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzN1VHh1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czdVR4LWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HM3VUeGVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzN1VHlPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMUU4RjBFMDI2NiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzN1VHl1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzN1VHllZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTQ0NSIgeT0iLTQyNyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czNEVjT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMUU4RjBFMDI2NiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzM0RWN1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0czNEVjZWZYRWR1cUhvT0piVVJaUnciIHg9IjExOTAiIHk9IjI4NyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czNEVjLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMUU4RjBFMDIzNCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzM0RWRlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HMzRFZE9mWEVkdXFIb09KYlVSWlJ3IiB4PSItMTA1OSIgeT0iLTIwNyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czNEVkdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjFFOEYwRTAyMzQiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czNEVlT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0czNEVkLWZYRWR1cUhvT0piVVJaUnciIHg9Ii03NSIgeT0iMjIxIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzM0RWVlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMUU4RjBFMDI2NiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzM0RWUtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzM0RWZPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzM0RWV1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czNEVmZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMUU4RjBFMDIzNCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzM0RWYtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzM0RWdPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzM0RWZ1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czNEVnZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRThGMEUwMjY2Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMzRFZy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMzRFaE9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HMzRFZ3VmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzM0RWhlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMUU4RjBFMDIzNCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzM0RWgtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMzRFaU9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HMzRFaHVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzN1VHd1ZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HM3VUdy1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlsyNjk5LCAtMjYsIDI2OTksIC0yNl0kWzU4NzQsIC0yNiwgNTg3NCwgLTI2XSRbNTg3NCwgLTI5NjMsIDU4NzQsIC0yOTYzXSRbMTQwMiwgLTI5NjMsIDE0MDIsIC0yOTYzXSRbMTQwMiwgLTEwNTgsIDE0MDIsIC0xMDU4XSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzM0RW1lZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDNENiIgc291cmNlPSJfRzM0RWllZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzN1VGRlZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czNEVuT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzM0RW51ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czNEVuLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HMzRFbmVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzM0RW11ZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HMzRFbS1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMzEzLCAtODcyLCAxMTA5LCAzMTkxXSRbLTExMzQsIC0zMjAwLCAyODcsIDg2M10iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzM0RW9PZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0czNEVvZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzM0RXN1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDA1MiIgc291cmNlPSJfRzM0RW91ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzM0RW91ZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czNEV0ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzM0RXQtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czNEV1T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HMzRFdHVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzM0RXVlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDA1NSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzM0RXUtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzM0RXV1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iNDM2IiB5PSIyMzgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMzRFdk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDA1NSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzM0RXZ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0czNEV2ZWZYRWR1cUhvT0piVVJaUnciIHg9Ii03MTQiIHk9Ii0zMzMiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMzRFdi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwNTMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czNEV3ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzM0RXdPZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTM2MCIgeT0iMjQyIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzM0RXd1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDA1MyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzM0RXhPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzM0RXctZlhFZHVxSG9PSmJVUlpSdyIgeD0iNzIiIHk9Ii0yODgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMzRFeGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDU1Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMzRFeC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMzRFeU9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HMzRFeHVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzM0RXllZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDUzIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMzRFeS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMzRFek9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HMzRFeXVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzM0RXplZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwNTUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czNEV6LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0czNEUwT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0czNEV6dWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMzRFMGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDUzIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMzRFMC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0czNEUxT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0czNEUwdWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HMzRFcy1mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0czNEV0T2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0xMTc2LCA0MiwgLTExNzYsIDQyXSRbLTI1NzMsIDQyLCAtMjU3MywgNDJdJFstMjU3MywgLTE3NjEsIC0yNTczLCAtMTc2MV0kWy01MCwgLTE3NjEsIC01MCwgLTE3NjFdJFstNTAsIC0xMDkyLCAtNTAsIC0xMDkyXSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzRCMWNPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDAzRSIgc291cmNlPSJfRzM0RW91ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzN1VGhlZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0QjFjLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRCMWRlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0QjFkdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNEIxZE9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzRCMWNlZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c0QjFjdWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzk5OSwgLTExMDAsIC0yOTEyLCAzMTY2XSRbMjY4MywgLTI5NDYsIC0xMjI3LCAxMzIwXSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HNEIxZC1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzRCMWVPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HNEIxaWVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTdFIiBzb3VyY2U9Il9HNEIxZWVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HMzRFaWVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRCMWpPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEIxanVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRCMWotZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzRCMWplZlhFZHVxSG9PSmJVUlpSdyIgeD0iOTciIHk9Ii0zMjMiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEIxa09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTg4Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEIxa3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNEIxa2VmWEVkdXFIb09KYlVSWlJ3IiB4PSItNjcyIiB5PSItMTk2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRCMWstZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxODgiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0QjFsZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNEIxbE9mWEVkdXFIb09KYlVSWlJ3IiB4PSI0NzciIHk9IjI5MyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0QjFsdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDE3RiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRCMW1PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNEIxbC1mWEVkdXFIb09KYlVSWlJ3IiB4PSI4MjQiIHk9Ii0xODciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEIxbWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTdGIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEIxbS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNEIxbXVmWEVkdXFIb09KYlVSWlJ3IiB4PSItNDQ2IiB5PSIzMzgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEIxbk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTg4Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEIxbnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNEIxbi1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNEIxbmVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRCMW9PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTdGIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEIxb3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNEIxby1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNEIxb2VmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRCMXBPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxODgiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0QjFwdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0QjFwLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0QjFwZWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEIxcU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTdGIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEIxcXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0QjFxLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0QjFxZWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HNEIxaXVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c0QjFpLWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzEzOTcsIC05NTYsIC04OTY2LCAtMzQ3XSRbODIzOCwgLTk1NiwgLTIxMjUsIC0zNDddIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HNEIxck9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTlDIiBzb3VyY2U9Il9HNEIxZWVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HMzRFaWVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRCMXItZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEIxc2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRCMXN1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzRCMXNPZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTUzNyIgeT0iLTE5NSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0QjFzLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxOUYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0QjF0ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0QjF0T2ZYRWR1cUhvT0piVVJaUnciIHg9Ii04NjgiIHk9Ii0zNzYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEIxdHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxOUYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0QjF1T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNEIxdC1mWEVkdXFIb09KYlVSWlJ3IiB4PSI0NTAiIHk9Ii0zODEiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEIxdWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxOUQiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0QjF1LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzRCMXV1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTIzOCIgeT0iMTU5Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRCMXZPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDE5RCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRCMXZ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzRCMXZlZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTMzNyIgeT0iLTk3MyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0QjF2LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxOUYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0QjF3ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0QjF3dWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0QjF3T2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEIxdy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxOUQiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0QjF4ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0QjF4dWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0QjF4T2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEIxeC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDE5RiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRCMXllZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzRCMXl1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzRCMXlPZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0QjF5LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxOUQiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0QjF6ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzRCMXp1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzRCMXpPZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c0QjFyZWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzRCMXJ1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbOTMsIDEyMTAsIC0xMDI3MCwgMTgyMF0kWzkzLCAyMDU3LCAtMTAyNzAsIDI2NjddJFs5Mjc5LCAyMDU3LCAtMTA4MywgMjY2N10kWzkyNzksIDI1NCwgLTEwODMsIDg2M10iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c0QjF6LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5vdGVBdHRhY2htZW50IiBzb3VyY2U9Il9HM3VUY09mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HNEIxck9mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzRCMTBPZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSIwIi8+Ci0gICAgICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c0QjEwZWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy04NzIsIC0xMTU5LCAxMDI0LCAxMzU0XSRbLTE4OTYsIC0yNTE0LCAwLCAwXSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HNEIxMHVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzRCMTAtZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HNEIxMU9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTYwIiBzb3VyY2U9Il9HNEIxZWVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HM3VUZGVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRCMTEtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEIxMmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRCMTJ1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c0QjEyT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HNEIxMWVmWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzRCMTF1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMTAzMiwgLTEyMTksIC03OTA3LCAzNDU0XSRbNDAyMSwgLTQ2NTYsIC00OTE5LCAxNl0kWzc1MDEsIC00NjczLCAtMTQzOSwgMF0iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzRCMTItZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c0QjEzT2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzRCMTNlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDAzRiIgc291cmNlPSJfRzRCMWVlZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzM0RW91ZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0QjE0T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRCMTR1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0QjE0LWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNEIxNGVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRCMTVPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDA0MiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRCMTV1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzRCMTVlZlhFZHVxSG9PSmJVUlpSdyIgeD0iMjY2IiB5PSIyNzEiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEIxNS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDA0MiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRCMTZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0QjE2T2ZYRWR1cUhvT0piVVJaUnciIHg9IjI4MyIgeT0iLTExMDkiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEIxNnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwNDAiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0QjE3T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzRCMTYtZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTI5MCIgeT0iMjcxIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRCMTdlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwNDAiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0QjE3LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0QjE3dWZYRWR1cUhvT0piVVJaUnciIHg9IjExNiIgeT0iLTM0NyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0QjE4T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwNDIiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0QjE4dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0QjE4LWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0QjE4ZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEIxOU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwNDAiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0QjE5dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0QjE5LWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0QjE5ZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEIxLU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDA0MiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRCMS11ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzRCMS0tZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzRCMS1lZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0QjFfT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwNDAiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0QjFfdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzRCMV8tZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzRCMV9lZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c0QjEzdWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzRCMTMtZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbOTMsIC0xMjEwLCAtMzEzLCAzNTY0XSRbOTMsIC0zNjgzLCAtMzEzLCAxMDkyXSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzRLX2RPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDE2QSIgc291cmNlPSJfRzRLX1pPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzRCMWVlZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0S19kLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRLX2VlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0S19ldWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNEtfZU9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRLX2UtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDE2RCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRLX2ZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzRLX2ZPZlhFZHVxSG9PSmJVUlpSdyIgeD0iMjEwIiB5PSItMzc0Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRLX2Z1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTZEIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEtfZ09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzRLX2YtZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTgwIiB5PSItMzQ1Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRLX2dlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTZCIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEtfZy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0S19ndWZYRWR1cUhvT0piVVJaUnciIHg9Ii0xNTMiIHk9Ii0zNjEiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEtfaE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDE2QiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRLX2h1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzRLX2hlZlhFZHVxSG9PSmJVUlpSdyIgeD0iODQiIHk9Ii0zMzkiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEtfaC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTZEIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEtfaWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNEtfaXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNEtfaU9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRLX2ktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTZCIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEtfamVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNEtfanVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNEtfak9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRLX2otZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxNkQiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0S19rZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0S19rdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0S19rT2ZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEtfay1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTZCIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEtfbGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0S19sdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0S19sT2ZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HNEtfZGVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c0S19kdWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzIyMCwgLTY2MCwgLTk5OSwgMjg5NV0kWzc4NywgLTIzNDUsIC00MzEsIDEyMTBdIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HNEtfbC1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFGMDZCQkMwMzBEIiBzb3VyY2U9Il9HNEIyQU9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HNEtfWk9mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRLX211ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEtfbk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRLX25lZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c0S19tLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEtfbnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFGMDZCQkUwMEU5Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEtfb09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNEtfbi1mWEVkdXFIb09KYlVSWlJ3IiB4PSItMTI0IiB5PSItMjc5Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRLX29lZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFGMDZCQkUwMEU5Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEtfby1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzRLX291ZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTY1IiB5PSIzNDciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEtfcE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUYwNkJCRTAwREYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0S19wdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzRLX3BlZlhFZHVxSG9PSmJVUlpSdyIgeD0iMjM2IiB5PSItMjg3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRLX3AtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRjA2QkJFMDBERiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRLX3FlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzRLX3FPZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTEwOTMiIHk9IjM4MSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0S19xdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUYwNkJCRTAwRTkiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0S19yT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0S19yZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0S19xLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEtfcnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUYwNkJCRTAwREYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0S19zT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0S19zZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0S19yLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEtfc3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRjA2QkJFMDBFOSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRLX3RPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzRLX3RlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzRLX3MtZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0S190dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUYwNkJCRTAwREYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0S191T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzRLX3VlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzRLX3QtZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c0S19tT2ZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzRLX21lZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTUwOCwgNTI0LCAtMzc1OSwgLTEzMDNdJFstNTA4LCAxOTEzLCAtMzc1OSwgODRdJFsxMTM0LCAxOTEzLCAtMjExNiwgODRdIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HNEtfdXVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFGOTRBQjkwMDE1IiBzb3VyY2U9Il9HNEIyQU9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HNEIxZWVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRLX3ZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEtfdi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRLX3dPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c0S192dWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HNEtfdS1mWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzRLX3ZPZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMTM0NiwgLTUzMywgLTMxMjQsIDExOTNdJFszMDY0LCAtMTE5MywgLTE0MDUsIDUzM10iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzRLX3dlZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c0S193dWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgPC9jb250ZW50cz4KLSAgICAgICAgICAgIDxjb250ZW50cyB4bWk6dHlwZT0ibm90YXRpb246RGlhZ3JhbSIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGNUMzMEYwMDI2IiB0eXBlPSJDbGFzcyIgbmFtZT0iV29ya1Byb2R1Y3RCcmVha2Rvd25TdHJ1Y3R1cmUiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRVd1lPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDBFNiI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0VXdZLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c0VXdaT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNFV3WmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0VXdadWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRVd1otZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0VXdhT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzRVd2FlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0VXdhdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzRVd2EtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0VXdiT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzRVd2JlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0VXdidWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0VXdiLWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c0VXdZZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJOb25lIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzRVd1l1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iNjM2NiIgeT0iNTkyMyIgaGVpZ2h0PSI5NTQiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0VXdjT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyQkMiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNFV3Yy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HNFV3ZE9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRVd2RlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNFV3ZHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0VXdkLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNFV3ZU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0VXdlZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNFV3ZXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0VXdlLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNFV3Zk9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0VXdmZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNFV3ZnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNFV3Zi1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HNFV3Y2VmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c0VXdjdWZYRWR1cUhvT0piVVJaUnciIHg9IjYxODkiIHk9IjEzNjk4Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNFV3Z09mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDQ1Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRVd2ctZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzRVd2hPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0VXdoZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRVd2h1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNFV3aC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRVd2lPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0VXdpZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNFV3aXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0VXdpLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNFV3ak9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0VXdqZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNFV3anVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNFV3ai1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HNFV3Z2VmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iTm9uZSIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c0VXdndWZYRWR1cUhvT0piVVJaUnciIHg9IjUxNDMiIHk9IjEwMzI5Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNGQ2ZWVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDA5Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRkNmZPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzRkNmZlZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0ZDZmdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRkNmYtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNGQ2Z09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRkNmdlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNGQ2Z3VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRkNmctZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNGQ2aE9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRkNmhlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNGQ2aHVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRkNmgtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzRkNmlPZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzRkNmV1ZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9Ik5vbmUiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNGQ2ZS1mWEVkdXFIb09KYlVSWlJ3IiB4PSIxNTA4NyIgeT0iMTMxODIiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0ZDZ0ZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwRUYiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNGQ2dU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HNGQ2dWVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iNzM2NiIgaGVpZ2h0PSIyNDM4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRkNnV1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNGQ2dS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0ZDZ2T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNGQ2dmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzRkNnZ1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0ZDZ2LWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzRkNndPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0ZDZ3ZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzRkNnd1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0ZDZ3LWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0ZDZ4T2ZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c0ZDZ0dWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzRkNnQtZlhFZHVxSG9PSmJVUlpSdyIgeD0iMzczMyIgeT0iMjM4NyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxEaWFncmFtU3R5bGUiIHhtaTppZD0iX0dsUURZZWZYRWR1cUhvT0piVVJaUnciIGRlc2NyaXB0aW9uPSJUaGlzIGRpYWdyYW0gc2hvd3MgdGhlIHZpZXcgb24gYSBwcm9jZXNzIGZyb20gYSBXb3JrIFByb2R1Y3QgcGVyc3BlY3RpdmUgY2FsbGVkIFdQQlMgKFdvcmsgUHJvZHVjdCBCcmVha2Rvd24gU3RydWN0dXJlKS4iLz4KLSAgICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzRVd2tPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDAwQyIgc291cmNlPSJfRzRVd2dPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzRVd2dPZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0VXdrLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRVd2xlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0VXdsdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c0VXdsT2ZYRWR1cUhvT0piVVJaUnciIHg9Ii0xMDgyIiB5PSIyNDIiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNFV3bC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDBGIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNFV3bWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNFV3bU9mWEVkdXFIb09KYlVSWlJ3IiB4PSIxMTk4IiB5PSItMjk0Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRVd211ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwMEYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0VXduT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNFV3bS1mWEVkdXFIb09KYlVSWlJ3IiB4PSIzMSIgeT0iMjgxIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRVd25lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDBEIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNFV3bi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0VXdudWZYRWR1cUhvT0piVVJaUnciIHg9Ii01NjEiIHk9Ii05OTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNFV3b09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDBEIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNFV3b3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNFV3b2VmWEVkdXFIb09KYlVSWlJ3IiB4PSI1OTciIHk9Ii03NjEiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNFV3by1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDBGIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNFV3cGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNFV3cHVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNFV3cE9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRVd3AtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDBEIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNFV3cWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNFV3cXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNFV3cU9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRVd3EtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwMEYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0VXdyZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0VXdydWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0VXdyT2ZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNFV3ci1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDBEIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNFV3c2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0VXdzdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0VXdzT2ZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HNFV3a2VmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c0VXdrdWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0xODIwLCAtODQ2LCAtMTgyMCwgLTg0Nl0kWy0xODIwLCAtMTk3MiwgLTE4MjAsIC0xOTcyXSRbLTYxODksIC0xOTcyLCAtNjE4OSwgLTE5NzJdJFstNjE4OSwgMCwgLTYxODksIDBdJFstMjE5MiwgMCwgLTIxOTIsIDBdIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HNFV3cy1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDIwIiBzb3VyY2U9Il9HNFV3Z09mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HNFV3Z09mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRVd3R1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNFV3dU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRVd3VlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzRVd3QtZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTI5OCIgeT0iMzAyIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRVd3V1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDAyMyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRVd3ZPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzRVd3UtZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTI5MSIgeT0iLTMwNiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0VXd2ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDIzIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNFV3di1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzRVd3Z1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTUwNSIgeT0iMjk1Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRVd3dPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDIxIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNFV3d3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0VXd3ZWZYRWR1cUhvT0piVVJaUnciIHg9Ii0xNTI4IiB5PSIyOTEiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNFV3dy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDIxIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNFV3eGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNFV3eE9mWEVkdXFIb09KYlVSWlJ3IiB4PSItNzYwIiB5PSItMjUyIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRVd3h1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDAyMyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRVd3lPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzRVd3llZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzRVd3gtZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0VXd5dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDAyMSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRVd3pPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzRVd3plZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzRVd3ktZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0VXd6dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDIzIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNFV3ME9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNFV3MGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNFV3ei1mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRVdzB1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDAyMSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRVdzFPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNFV3MWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNFV3MC1mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzRVd3RPZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HNFV3dGVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlsyMjIyLCAtMjExLCAyMjIyLCAtMjExXSRbNTk4MCwgLTIxMSwgNTk4MCwgLTIxMV0kWzU5ODAsIC0yMDg3LCA1OTgwLCAtMjA4N10kWzk1MiwgLTIwODcsIDk1MiwgLTIwODddJFs5NTIsIC02ODgsIDk1MiwgLTY4OF0iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c0VXcxdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzRDYiIHNvdXJjZT0iX0c0VXdnT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c0VXdZT2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNGQ2VU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0ZDZVdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNGQ2VS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzRkNlVlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c0VXcxLWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzRVdzJPZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTYwOSwgLTY4OCwgLTc2OCwgMzk0Ml0kWy02MDksIC00MTU0LCAtNzY4LCA0NzZdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c0ZDZWT2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HNGQ2VmVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c0ZDZWdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzRDciIHNvdXJjZT0iX0c0VXdjT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c0VXdnT2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNGQ2V2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0ZDZXLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNGQ2WE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzRkNld1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0ZDZYZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzREEiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0ZDZYLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0ZDZYdWZYRWR1cUhvT0piVVJaUnciIHg9IjE2OSIgeT0iLTQ4MiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0ZDZZT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDNEQSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRkNll1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0ZDZZZWZYRWR1cUhvT0piVVJaUnciIHg9Ii0xNTMiIHk9Ii0zNDciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNGQ2WS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzRDgiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0ZDZaZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzRkNlpPZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTEwNCIgeT0iLTI4MyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0ZDZadWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwM0Q4Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNGQ2YU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNGQ2Wi1mWEVkdXFIb09KYlVSWlJ3IiB4PSIxNjEiIHk9Ii0zNDciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNGQ2YWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwM0RBIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNGQ2YS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNGQ2Yk9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNGQ2YXVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRkNmJlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwM0Q4Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNGQ2Yi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNGQ2Y09mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNGQ2YnVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRkNmNlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzREEiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0ZDZjLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0ZDZkT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0ZDZjdWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNGQ2ZGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwM0Q4Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNGQ2ZC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0ZDZlT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0ZDZkdWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HNGQ2Vi1mWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzRkNldPZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMCwgLTU3NSwgMCwgMzk5Nl0kWzAsIC0zNzI1LCAwLCA4NDZdIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HNGQ2aWVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjNEIiBzb3VyY2U9Il9HNFV3Z09mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HNGQ2ZWVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRkNmpPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNGQ2anVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRkNmotZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzRkNmplZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTc0OCIgeT0iLTQ0NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0ZDZrT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyNDgiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0ZDZrdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0ZDZrZWZYRWR1cUhvT0piVVJaUnciIHg9Ii00MyIgeT0iLTI3MyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0ZDZrLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjQ4Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNGQ2bGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzRkNmxPZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTc3MSIgeT0iNTUyIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRkNmx1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjQ2Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNGQ2bU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0ZDZsLWZYRWR1cUhvT0piVVJaUnciIHg9IjU1NSIgeT0iMjk3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRkNm1lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDI0NiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRkNm0tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzRkNm11ZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTQyNyIgeT0iLTI5NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0ZDZuT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyNDgiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0ZDZudWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0ZDZuLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0ZDZuZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNGQ2b09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyNDYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0ZDZvdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0ZDZvLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0ZDZvZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNGQ2cE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDI0OCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRkNnB1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzRkNnAtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzRkNnBlZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0ZDZxT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyNDYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0ZDZxdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzRkNnEtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzRkNnFlZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c0ZDZpdWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HNGQ2aS1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlsxNzk0LCA4NDYsIC03MjQ3LCAtMTY0Ml0kWzUyODMsIDI0ODAsIC0zNzU5LCAtOF0kWzc2NjIsIDI0ODAsIC0xMzgwLCAtOF0iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c0ZDZyT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzMDMiIHNvdXJjZT0iX0c0ZDZlZWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c0VXdZT2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNGQ2ci1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0ZDZzZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNGQ2c3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzRkNnNPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c0ZDZyZWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzRkNnJ1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTc5LCAtMzE3LCA4OTk2LCA2NDMwXSRbLTc5LCAtNjc3MywgODk5NiwgLTI2XSRbLTc5MzgsIC02NzczLCAxMTM3LCAtMjZdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c0ZDZzLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HNGQ2dE9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c0ZDZ4ZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyQjUiIHNvdXJjZT0iX0c0ZDZ0ZWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c0ZDZ0ZWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNGQ2eU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0ZDZ5dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNGQ2eS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzRkNnllZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0ZDZ6T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyQjgiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0ZDZ6dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0ZDZ6ZWZYRWR1cUhvT0piVVJaUnciIHg9Ii0yODEiIHk9Ijc2MSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0ZDZ6LWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDJCOCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRkNjBlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0ZDYwT2ZYRWR1cUhvT0piVVJaUnciIHg9IjEyNTAiIHk9IjUwNCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0ZDYwdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDJCNiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRkNjFPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNGQ2MC1mWEVkdXFIb09KYlVSWlJ3IiB4PSItNDU4IiB5PSIyODciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNGQ2MWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMkI2Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNGQ2MS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNGQ2MXVmWEVkdXFIb09KYlVSWlJ3IiB4PSIyODQiIHk9Ii0zMzEiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNGQ2Mk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMkI4Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNGQ2MnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNGQ2Mi1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNGQ2MmVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRkNjNPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMkI2Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNGQ2M3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNGQ2My1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNGQ2M2VmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRkNjRPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyQjgiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0ZDY0dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0ZDY0LWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0ZDY0ZWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNGQ2NU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMkI2Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNGQ2NXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0ZDY1LWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0ZDY1ZWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HNGQ2eHVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c0ZDZ4LWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0zNjgzLCAtNDc0LCAtMzY4MywgLTQ3NF0kWy01MTEzLCAtNDc0LCAtNTExMywgLTQ3NF0kWy01MTEzLCAtMjE0MiwgLTUxMTMsIC0yMTQyXSRbLTE3NjEsIC0yMTQyLCAtMTc2MSwgLTIxNDJdJFstMTc2MSwgLTEyMTksIC0xNzYxLCAtMTIxOV0iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c0bnJVT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyOEYiIHNvdXJjZT0iX0c0VXdZT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c0ZDZ0ZWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNG5yVS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0bnJWZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNG5yVnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzRuclZPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c0bnJVZWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzRuclV1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMCwgLTQ5OSwgLTUwLCAzMDA1XSRbMCwgLTIyODYsIC01MCwgMTIxOV0iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzRuclYtZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c0bnJXT2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzRucldlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMUU4RjBDMDI4MSIgc291cmNlPSJfRzRkNnRlZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzRkNnRlZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0bnJYT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRuclh1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0bnJYLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNG5yWGVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRucllPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMUU4RjBFMDI2NiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRucll1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzRuclllZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTk5IiB5PSItNzM1Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRuclktZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRThGMEUwMjY2Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNG5yWmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzRuclpPZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTkxOSIgeT0iNzMiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNG5yWnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjFFOEYwRTAyMzQiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0bnJhT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzRuclotZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTUzNSIgeT0iLTIzNCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0bnJhZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjFFOEYwRTAyMzQiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0bnJhLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0bnJhdWZYRWR1cUhvT0piVVJaUnciIHg9IjM0MCIgeT0iMjg5Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRucmJPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMUU4RjBFMDI2NiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRucmJ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzRucmItZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzRucmJlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0bnJjT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMUU4RjBFMDIzNCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRucmN1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzRucmMtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzRucmNlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0bnJkT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRThGMEUwMjY2Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNG5yZHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNG5yZC1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNG5yZGVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRucmVPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMUU4RjBFMDIzNCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRucmV1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNG5yZS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNG5yZWVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzRucld1ZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HNG5yVy1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlszNjgzLCAtMzA0LCAzNjgzLCAtMzA0XSRbNDczMiwgLTMwNCwgNDczMiwgLTMwNF0kWzQ3MzIsIC0yMTA4LCA0NzMyLCAtMjEwOF0kWzEyNzAsIC0yMTA4LCAxMjcwLCAtMjEwOF0kWzEyNzAsIC0xMjE5LCAxMjcwLCAtMTIxOV0iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgIDwvY29udGVudHM+Ci0gICAgICAgICAgICA8Y29udGVudHMgeG1pOnR5cGU9Im5vdGF0aW9uOkRpYWdyYW0iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxMUMxQ0UzMDNEMyIgdHlwZT0iQ2xhc3MiIG5hbWU9IlRlYW1CcmVha2Rvd25TdHJ1Y3R1cmUgKHNpbXBsaWZpZWQpIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0bnJmT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwRUYiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNG5yZi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HNG5yZ09mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRucmdlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNG5yZ3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0bnJnLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNG5yaE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0bnJoZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNG5yaHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0bnJoLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNG5yaU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0bnJpZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNG5yaXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNG5yaS1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HNG5yZmVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c0bnJmdWZYRWR1cUhvT0piVVJaUnciIHg9IjExNzA5IiB5PSI2NzciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0bnJqT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwRTYiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNG5yai1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HNG5ya09mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMjA4MiIgaGVpZ2h0PSI5MDUiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNG5ya2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0bnJrdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRucmstZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0bnJsT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzRucmxlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0bnJsdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzRucmwtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0bnJtT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzRucm1lZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0bnJtdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0bnJtLWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c0bnJqZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzRucmp1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iNjE3MiIgeT0iMTc4NiIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRucnBlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDA2MyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0bnJxT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c0bnJxZWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNG5ycXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0bnJxLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzR4Y1VPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0eGNVZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzR4Y1V1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0eGNVLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzR4Y1ZPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0eGNWZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzR4Y1Z1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0eGNWLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0eGNXT2ZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c0bnJwdWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzRucnAtZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTIyNjgiIHk9IjM2NjYiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0eGNoZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwOEIiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNHhjaU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HNHhjaWVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzR4Y2l1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNHhjaS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0eGNqT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNHhjamVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0eGNqdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNHhjai1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0eGNrT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNHhja2VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0eGNrdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNHhjay1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNHhjbE9mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HNHhjaHVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c0eGNoLWZYRWR1cUhvT0piVVJaUnciIHg9IjU5MjYiIHk9IjM2NjYiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0eGN3ZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUYwNkI2NTAwRTYiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNHhjeE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HNHhjeGVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMjc0MyIgaGVpZ2h0PSI5OTAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNHhjeHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0eGN4LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzR4Y3lPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0eGN5ZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzR4Y3l1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0eGN5LWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzR4Y3pPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0eGN6ZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzR4Y3p1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0eGN6LWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0eGMwT2ZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c0eGN3dWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzR4Y3ctZlhFZHVxSG9PSmJVUlpSdyIgeD0iNTk0MyIgeT0iNjcyMiIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzR4YzJ1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI5NiI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0eGMzZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c0eGMzdWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSI0MDEzIiBoZWlnaHQ9IjExMTciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNHhjMy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0eGM0T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzR4YzRlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0eGM0dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzR4YzQtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0eGM1T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzR4YzVlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0eGM1dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzR4YzUtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0eGM2T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0eGM2ZWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c0eGMyLWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzR4YzNPZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTA5MiIgeT0iNTEzMCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxEaWFncmFtU3R5bGUiIHhtaTppZD0iX0dsUURZLWZYRWR1cUhvT0piVVJaUnciIGRlc2NyaXB0aW9uPSJUaGlzIGRpYWdyYW0gcHJvdmlkZXMgYSBzaW1wbGlmaWVkIHZpZXcgb24gdGhlIFRlYW0gQnJlYWtkb3duIFN0cnVjdHVyZSBvbmx5IHRoZSBrZXkgY2xhc3NlcyBhbmQgcmVsYXRpb25zaGlwcy4iLz4KLSAgICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzRucm5PZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDI4RiIgc291cmNlPSJfRzRucmpPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzRucmZPZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0bnJuLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRucm9lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0bnJvdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNG5yb09mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzRucm5lZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c0bnJudWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzEwNDEsIC0xODYsIC01MTU2LCA4ODBdJFs0NDg3LCAtNzc4LCAtMTcxMCwgMjg3XSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HNG5yby1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzRucnBPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HNHhjV2VmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDUyIiBzb3VyY2U9Il9HNG5ycGVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HNG5ycGVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzR4Y1hPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNHhjWHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzR4Y1gtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c0eGNYZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNHhjWU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDU1Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNHhjWXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNHhjWWVmWEVkdXFIb09KYlVSWlJ3IiB4PSI4MDYiIHk9IjI4MyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0eGNZLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDU1Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNHhjWmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzR4Y1pPZlhFZHVxSG9PSmJVUlpSdyIgeD0iNzE0IiB5PSItOTMwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzR4Y1p1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDUzIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNHhjYU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0eGNaLWZYRWR1cUhvT0piVVJaUnciIHg9Ii03ODQiIHk9IjMxMSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0eGNhZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwNTMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0eGNhLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0eGNhdWZYRWR1cUhvT0piVVJaUnciIHg9Ii01NSIgeT0iLTMwOSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0eGNiT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwNTUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0eGNidWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0eGNiLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0eGNiZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNHhjY09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwNTMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0eGNjdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0eGNjLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0eGNjZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNHhjZE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDA1NSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzR4Y2R1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzR4Y2QtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzR4Y2RlZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0eGNlT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwNTMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0eGNldWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzR4Y2UtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzR4Y2VlZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c0eGNXdWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzR4Y1ctZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMTE0MywgMCwgMTE0MywgMF0kWzI2NDEsIDAsIDI2NDEsIDBdJFsyNjQxLCAxOTEzLCAyNjQxLCAxOTEzXSRbMCwgMTkxMywgMCwgMTkxM10kWzAsIDQ0OCwgMCwgNDQ4XSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzR4Y2ZPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDAzRSIgc291cmNlPSJfRzRucnBlZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzRucmZPZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0eGNmLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzR4Y2dlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0eGNndWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNHhjZ09mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzR4Y2ZlZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c0eGNmdWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzAsIC00NTcsIDAsIDI0ODldJFswLCAtMjQ1NSwgMCwgNDkxXSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HNHhjZy1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzR4Y2hPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HNHhjbGVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTYwIiBzb3VyY2U9Il9HNHhjaGVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HNG5yak9mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzR4Y21PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNHhjbXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzR4Y20tZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c0eGNtZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HNHhjbHVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c0eGNsLWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy01MCwgLTQ0OCwgMCwgMTQzMF0kWy01MCwgLTE0MzAsIDAsIDQ0OF0iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzR4Y25PZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c0eGNuZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzR4Y251ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDAzRiIgc291cmNlPSJfRzR4Y2hlZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzRucnBlZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0eGNvZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzR4Y28tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0eGNwT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNHhjb3VmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzR4Y3BlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDA0MiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzR4Y3AtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzR4Y3B1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTI5IiB5PSIyMzUiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNHhjcU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDA0MiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzR4Y3F1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0eGNxZWZYRWR1cUhvT0piVVJaUnciIHg9IjgyMiIgeT0iLTI5NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0eGNxLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDA0MCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzR4Y3JlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNHhjck9mWEVkdXFIb09KYlVSWlJ3IiB4PSIyMDQiIHk9Ii0xODkiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNHhjcnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDA0MCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzR4Y3NPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzR4Y3ItZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTY5IiB5PSItMzQ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzR4Y3NlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDA0MiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzR4Y3MtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzR4Y3RPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzR4Y3N1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0eGN0ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDA0MCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzR4Y3QtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzR4Y3VPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzR4Y3R1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0eGN1ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDQyIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNHhjdS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNHhjdk9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNHhjdXVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzR4Y3ZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDA0MCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzR4Y3YtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNHhjd09mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNHhjdnVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzR4Y24tZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c0eGNvT2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzEzMzcsIDAsIC00ODA5LCAwXSRbNDk5NSwgMCwgLTExNTEsIDBdIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HNHhjMGVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFGOTRBQjkwMDE1IiBzb3VyY2U9Il9HNHhjd2VmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HNHhjaGVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzR4YzFPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNHhjMXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzR4YzEtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c0eGMxZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HNHhjMHVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c0eGMwLWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy01MCwgLTQ5OSwgMCwgMjU5OV0kWy01MCwgLTI2NTAsIDAsIDQ0OF0iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzR4YzJPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c0eGMyZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzR4YzZ1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDE2QSIgc291cmNlPSJfRzR4YzJ1ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzR4Y2hlZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0Nm1RT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzQ2bVF1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0Nm1RLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNDZtUWVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzQ2bVJPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDE2RCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzQ2bVJ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzQ2bVJlZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTEzNSIgeT0iNDA2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzQ2bVItZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTZEIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNDZtU2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzQ2bVNPZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTIwMiIgeT0iLTM0NyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0Nm1TdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDE2QiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzQ2bVRPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNDZtUy1mWEVkdXFIb09KYlVSWlJ3IiB4PSIzOTEiIHk9IjI5NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0Nm1UZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTZCIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNDZtVC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNDZtVHVmWEVkdXFIb09KYlVSWlJ3IiB4PSIyMDQiIHk9Ii0zNDgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNDZtVU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTZEIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNDZtVXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNDZtVS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNDZtVWVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzQ2bVZPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTZCIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNDZtVnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNDZtVi1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNDZtVmVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzQ2bVdPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxNkQiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0Nm1XdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0Nm1XLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0Nm1XZWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNDZtWE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTZCIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNDZtWHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0Nm1YLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0Nm1YZWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HNHhjNi1mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c0eGM3T2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzEzMywgLTMxNywgLTU1MjksIDExMzhdJFsxMzMsIC0xNjEzLCAtNTUyOSwgLTE1OF0kWzQxMjgsIC0xNjEzLCAtMTUzNCwgLTE1OF0iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c0Nm1ZT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUYwNkJCQzAzMEQiIHNvdXJjZT0iX0c0eGN3ZWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c0eGMydWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNDZtWS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0Nm1aZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNDZtWnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzQ2bVpPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0Nm1aLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUYwNkJCRTAwRTkiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0Nm1hZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0Nm1hT2ZYRWR1cUhvT0piVVJaUnciIHg9Ii00NjgiIHk9Ii0yNDUiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNDZtYXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUYwNkJCRTAwRTkiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0Nm1iT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNDZtYS1mWEVkdXFIb09KYlVSWlJ3IiB4PSItMjA2IiB5PSIzNDgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNDZtYmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUYwNkJCRTAwREYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0Nm1iLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzQ2bWJ1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMyIgeT0iLTE1MyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0Nm1jT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUYwNkJCRTAwREYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0Nm1jdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0Nm1jZWZYRWR1cUhvT0piVVJaUnciIHg9IjgwIiB5PSIxNDcyIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzQ2bWMtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRjA2QkJFMDBFOSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzQ2bWRlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzQ2bWR1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzQ2bWRPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0Nm1kLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRjA2QkJFMDBERiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzQ2bWVlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzQ2bWV1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzQ2bWVPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0Nm1lLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFGMDZCQkUwMEU5Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNDZtZmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNDZtZnVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNDZtZk9mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzQ2bWYtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRjA2QkJFMDBERiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzQ2bWdlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNDZtZ3VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNDZtZ09mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzQ2bVllZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HNDZtWXVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMTUzNSwgMCwgNDE1NCwgMTYxNF0kWy01NTU2LCAwLCAxMzMsIDE2MTRdJFstNTU1NiwgLTEyOTYsIDEzMywgMzE4XSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgPC9jb250ZW50cz4KLSAgICAgICAgICAgIDxjb250ZW50cyB4bWk6dHlwZT0ibm90YXRpb246RGlhZ3JhbSIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDExQzQ2MUMwMkY3IiB0eXBlPSJDbGFzcyIgbmFtZT0iV29ya1Byb2R1Y3RCcmVha2Rvd25TdHJ1Y3R1cmUgKHNpbXBsaWZpZWQpIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0Nm1nLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwRUYiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNDZtaHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HNDZtaC1mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzQ2bWlPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNDZtaWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0Nm1pdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNDZtaS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0Nm1qT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNDZtamVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0Nm1qdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNDZtai1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0Nm1rT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNDZta2VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNDZta3VmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HNDZtaE9mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c0Nm1oZWZYRWR1cUhvT0piVVJaUnciIHg9IjQ3MDciIHk9Ijk3MyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzQ2bWstZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDBFNiI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0Nm1sdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c0Nm1sLWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNDZtbU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1RVhRT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVFWFFlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1RVhRdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzVFWFEtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1RVhST2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzVFWFJlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1RVhSdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzVFWFItZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1RVhTT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1RVhTZWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c0Nm1sT2ZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzQ2bWxlZlhFZHVxSG9PSmJVUlpSdyIgeD0iNTU5NiIgeT0iMzExNSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVFWFUtZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDA0NSI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1RVhWdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c1RVhWLWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNUVYV09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1RVhXZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVFWFd1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1RVhXLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNUVYWE9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVFWFhlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNUVYWHVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVFWFgtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNUVYWU9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVFWFllZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzVFWFl1ZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzVFWFZPZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNUVYVmVmWEVkdXFIb09KYlVSWlJ3IiB4PSI0MDk3IiB5PSI1NDY5IiB3aWR0aD0iNDkxOSIgaGVpZ2h0PSIyMTc1Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNUVYcWVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDA5Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVFWHJPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzVFWHJlZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1RVhydWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVFWHItZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNUVYc09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVFWHNlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNUVYc3VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVFWHMtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNUVYdE9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVFWHRlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNUVYdHVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVFWHQtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzVFWHVPZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzVFWHF1ZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNUVYcS1mWEVkdXFIb09KYlVSWlJ3IiB4PSI1MDcxIiB5PSIxMTE0MiIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxEaWFncmFtU3R5bGUiIHhtaTppZD0iX0dsUURaZWZYRWR1cUhvT0piVVJaUnciIGRlc2NyaXB0aW9uPSJUaGlzIGRpYWdyYW0gcHJvdmlkZXMgYSBzaW1wbGlmaWVkIHZpZXcgb24gdGhlIFdvcmsgUHJvZHVjdCBCcmVha2Rvd24gU3RydWN0dXJlIG9ubHkgdGhlIGtleSBjbGFzc2VzIGFuZCByZWxhdGlvbnNoaXBzLiIvPgotICAgICAgICAgICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HNUVYU3VmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjhGIiBzb3VyY2U9Il9HNDZtay1mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HNDZtZy1mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVFWFRlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNUVYVC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVFWFVPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c1RVhUdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HNUVYUy1mWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzVFWFRPZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMCwgLTQ5OSwgMCwgMTYzNF0kWzAsIC0xNjM0LCAwLCA0OTldIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c1RVhVZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HNUVYVXVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c1RVhZLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwMEMiIHNvdXJjZT0iX0c1RVhVLWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c1RVhVLWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNUVYWnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1RVhhT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNUVYYWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNUVYWi1mWEVkdXFIb09KYlVSWlJ3IiB4PSI0MTciIHk9IjEwNjMiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNUVYYXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDBGIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNUVYYk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNUVYYS1mWEVkdXFIb09KYlVSWlJ3IiB4PSIzMDciIHk9IjY4MyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1RVhiZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDBGIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNUVYYi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzVFWGJ1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTEyNjEiIHk9Ijc5OSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1RVhjT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDAwRCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVFWGN1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNUVYY2VmWEVkdXFIb09KYlVSWlJ3IiB4PSItOTI3IiB5PSIyOTIiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNUVYYy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDBEIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNUVYZGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNUVYZE9mWEVkdXFIb09KYlVSWlJ3IiB4PSItMTM4IiB5PSItMjgyIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVFWGR1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDAwRiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVFWGVPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzVFWGVlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzVFWGQtZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1RVhldWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDAwRCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVFWGZPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzVFWGZlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzVFWGUtZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1RVhmdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDBGIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNUVYZ09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNUVYZ2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNUVYZi1mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVFWGd1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDAwRCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVFWGhPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNUVYaGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNUVYZy1mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzVFWFpPZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HNUVYWmVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlsyNDYwLCAtODAsIDI0NjAsIC04MF0kWzQ5NzQsIC04MCwgNDk3NCwgLTgwXSRbNDk3NCwgMjQwNywgNDk3NCwgMjQwN10kWzE1ODcsIDI0MDcsIDE1ODcsIDI0MDddJFsxNTg3LCAxMDg1LCAxNTg3LCAxMDg1XSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzVFWGh1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDAyMCIgc291cmNlPSJfRzVFWFUtZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzVFWFUtZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1RVhpZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVFWGktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1RVhqT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c1RVhpdWZYRWR1cUhvT0piVVJaUnciIHg9Ii0xMzM4IiB5PSItMzEzIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVFWGplZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDAyMyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVFWGotZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzVFWGp1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iNzY5IiB5PSIyNTkiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNUVYa09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDAyMyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVFWGt1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1RVhrZWZYRWR1cUhvT0piVVJaUnciIHg9IjIyOSIgeT0iLTMxMiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1RVhrLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDAyMSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVFWGxlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNUVYbE9mWEVkdXFIb09KYlVSWlJ3IiB4PSItODEzIiB5PSIxNjYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNUVYbHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDIxIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNUVYbU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNUVYbC1mWEVkdXFIb09KYlVSWlJ3IiB4PSIzNDMiIHk9IjczNyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1RVhtZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwMjMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1RVhtLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1RVhuT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1RVhtdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNUVYbmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwMjEiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1RVhuLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1RVhvT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1RVhudWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNUVYb2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDAyMyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVFWG8tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzVFWHBPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzVFWG91ZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1RVhwZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwMjEiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1RVhwLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzVFWHFPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzVFWHB1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c1RVhoLWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzVFWGlPZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTE4MzcsIDEwODMsIC0xODM3LCAxMDgzXSRbLTE4MzcsIDIzNjIsIC0xODM3LCAyMzYyXSRbLTQwMjEsIDIzNjIsIC00MDIxLCAyMzYyXSRbLTQwMjEsIC0yMzcsIC00MDIxLCAtMjM3XSRbLTI0NTUsIC0yMzcsIC0yNDU1LCAtMjM3XSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzVFWHVlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDIzRCIgc291cmNlPSJfRzVFWFUtZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzVFWHFlZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1RVh2T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVFWHZ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1RVh2LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c1RVh2ZWZYRWR1cUhvT0piVVJaUnciIHg9IjIxIiB5PSItNjQzIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVFWHdPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDI0OCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVFWHd1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzVFWHdlZlhFZHVxSG9PSmJVUlpSdyIgeD0iNzIiIHk9IjE5OSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1RVh3LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjQ4Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNUVYeGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzVFWHhPZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTMzIiB5PSItNzQ1Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVFWHh1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjQ2Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNUVYeU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1RVh4LWZYRWR1cUhvT0piVVJaUnciIHg9IjIwNyIgeT0iLTIwMiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1RVh5ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyNDYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1RVh5LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1RVh5dWZYRWR1cUhvT0piVVJaUnciIHg9IjE5OCIgeT0iMTIwMyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1RVh6T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyNDgiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1RVh6dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1RVh6LWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1RVh6ZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNUVYME9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyNDYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1RVgwdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1RVgwLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1RVgwZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNUVYMU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDI0OCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVPSVFPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzVPSVFlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzVFWDFlZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1T0lRdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyNDYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1T0lST2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzVPSVJlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzVPSVEtZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c1RVh1dWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzVFWHUtZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTI2MiwgMTA3NSwgLTE2MCwgLTQwMDRdJFstMjYyLCA0NTg4LCAtMTYwLCAtNDkxXSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzVPSVJ1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDNENiIgc291cmNlPSJfRzVFWFUtZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzQ2bWstZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1T0lTZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVPSVMtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1T0lUT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNU9JU3VmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzVPSVItZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HNU9JU09mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstNDIsIC0xMDkyLCAtOTMsIDE4NTRdJFstNDIsIC0yNDU1LCAtOTMsIDQ5MV0iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzVPSVRlZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c1T0lUdWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzVPSVQtZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDMwMyIgc291cmNlPSJfRzVFWHFlZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzQ2bWstZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1T0lVdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVPSVZPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1T0lWZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNU9JVS1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzVPSVVPZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HNU9JVWVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlsxMzgwLCAtMTYsIDEyMjcsIDgwMDldJFs3MTI4LCAtMTYsIDY5NzYsIDgwMDldJFs3MTI4LCAtODA4NSwgNjk3NiwgLTU5XSRbMTE1OSwgLTgwODUsIDEwMDcsIC01OV0iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzVPSVZ1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c1T0lWLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgPC9jb250ZW50cz4KLSAgICAgICAgICAgIDxjb250ZW50cyB4bWk6dHlwZT0ibm90YXRpb246RGlhZ3JhbSIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDExQzQ5NDYwMzFFIiB0eXBlPSJDbGFzcyIgbmFtZT0iV29ya0JyZWFrZG93blN0cnVjdHVyZSAoc2ltcGxpZmllZCkiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVPSVdPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDAwOSI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1T0lXLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c1T0lYT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNU9JWGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1T0lYdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVPSVgtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1T0lZT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzVPSVllZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1T0lZdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzVPSVktZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1T0laT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzVPSVplZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1T0ladWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1T0laLWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c1T0lXZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzVPSVd1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iNTk5NCIgeT0iNjU2MSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVPSWFPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDBFNiI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1T0lhLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c1T0liT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNU9JYmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1T0lidWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVPSWItZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1T0ljT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzVPSWNlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1T0ljdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzVPSWMtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1T0lkT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzVPSWRlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1T0lkdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1T0lkLWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c1T0lhZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzVPSWF1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iNTU2MiIgeT0iNDMyNiIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVPSWVPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVEMDNDQSI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1T0llLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c1T0lmT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNU9JZmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1T0lmdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVPSWYtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1T0lnT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzVPSWdlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1T0lndWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzVPSWctZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1T0loT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzVPSWhlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1T0lodWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1T0loLWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c1T0llZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzVPSWV1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTQzMCIgeT0iNjYzOCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVPSWlPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVEMDNDQiI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1T0lpLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c1T0lqT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxNjU5IiBoZWlnaHQ9IjkwNSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1T0lqZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVPSWp1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNU9Jai1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVPSWtPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNU9Ja2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVPSWt1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNU9Jay1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVPSWxPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNU9JbGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVPSWx1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzVPSWwtZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzVPSWllZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNU9JaXVmWEVkdXFIb09KYlVSWlJ3IiB4PSIzMjAwIiB5PSI2NjkxIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNU9JbU9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMEVGIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVPSW0tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzVPSW5PZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1T0luZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVPSW51ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNU9Jbi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVPSW9PZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNU9Jb2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVPSW91ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNU9Jby1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVPSXBPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNU9JcGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVPSXB1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzVPSXAtZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzVPSW1lZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNU9JbXVmWEVkdXFIb09KYlVSWlJ3IiB4PSIzMzg2IiB5PSIxNTMyIiB3aWR0aD0iNTkyNiIgaGVpZ2h0PSIxMDA3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNVhTT2VmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUQwM0QzIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVYU1BPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzVYU1BlZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjIyMTgiIGhlaWdodD0iODQ2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVYU1B1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNVhTUC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1WFNRT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNVhTUWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1WFNRdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNVhTUS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1WFNST2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNVhTUmVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1WFNSdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNVhTUi1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNVhTU09mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HNVhTT3VmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c1WFNPLWZYRWR1cUhvT0piVVJaUnciIHg9IjI0OTciIHk9IjQzNTEiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1WFNiT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBOTI1NDAyMjciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNVhTYi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HNVhTY09mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iNDI2NyIgaGVpZ2h0PSI5OTAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNVhTY2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1WFNjdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVYU2MtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1WFNkT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzVYU2RlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1WFNkdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzVYU2QtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1WFNlT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzVYU2VlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1WFNldWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1WFNlLWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c1WFNiZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzVYU2J1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iNTI4MyIgeT0iODY1MiIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVYU2p1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDAzMSI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1WFNrZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c1WFNrdWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxODYyIiBoZWlnaHQ9IjkwNSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1WFNrLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVYU2xPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNVhTbGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVYU2x1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNVhTbC1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVYU21PZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNVhTbWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVYU211ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNVhTbS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVYU25PZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzVYU25lZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzVYU2otZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNVhTa09mWEVkdXFIb09KYlVSWlJ3IiB4PSI5MTY1IiB5PSI2NTYxIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTERpYWdyYW1TdHlsZSIgeG1pOmlkPSJfR2xRRFotZlhFZHVxSG9PSmJVUlpSdyIgZGVzY3JpcHRpb249IlRoaXMgaXMgYSBzaW1wbGlmaWVkIHJlcHJlc2VudGF0aW9uIG9mIGEgV0JTIG9ubHkgc2hvd2luZyBrZXkgZWxlbWVudHMgYW5kIHRoZWlyIHJlbGF0aW9uc2hpcHMuIi8+Ci0gICAgICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c1WFNNT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyOEYiIHNvdXJjZT0iX0c1T0lhT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c1T0ltT2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNVhTTS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1WFNOZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNVhTTnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzVYU05PZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c1WFNNZWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzVYU011ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMCwgLTQ0OCwgMjU0LCAyMjk0XSRbMCwgLTIyNDMsIDI1NCwgNDk5XSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HNVhTTi1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzVYU09PZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HNVhTU2VmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFMEZGRDMwMEVGIiBzb3VyY2U9Il9HNU9JbU9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HNVhTT2VmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVYU1RPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNVhTVHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVYU1QtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzVYU1RlZlhFZHVxSG9PSmJVUlpSdyIgeD0iMjMwIiB5PSI3OTYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNVhTVU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFMEZGRDMwMEYxIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNVhTVXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNVhTVWVmWEVkdXFIb09KYlVSWlJ3IiB4PSItMjg3IiB5PSItMjYxIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVYU1UtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFMEZGRDMwMEYxIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNVhTVmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzVYU1ZPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTM5NyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1WFNWdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRTBGRkQzMDBGMCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVYU1dPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNVhTVi1mWEVkdXFIb09KYlVSWlJ3IiB4PSItNzUiIHk9Ii0xOTQiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNVhTV2VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRTBGRkQzMDBGMCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVYU1ctZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzVYU1d1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTM5NyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1WFNYT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUUwRkZEMzAwRjEiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1WFNYdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1WFNYLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1WFNYZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNVhTWU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUUwRkZEMzAwRjAiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1WFNZdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1WFNZLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1WFNZZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNVhTWk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRTBGRkQzMDBGMSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVYU1p1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzVYU1otZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzVYU1plZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1WFNhT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUUwRkZEMzAwRjAiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1WFNhdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzVYU2EtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzVYU2FlZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c1WFNTdWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzVYU1MtZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTI5NjMsIC0xMDEsIC0yMjAsIC0yODQ0XSRbLTM1OTgsIC0xMDEsIC04NTUsIC0yODQ0XSRbLTM1OTgsIDIzMTksIC04NTUsIC00MjNdIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HNVhTZk9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMkEwIiBzb3VyY2U9Il9HNU9JaU9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HNVhTT2VmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVYU2YtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNVhTZ2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVYU2d1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c1WFNnT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HNVhTZmVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c1WFNmdWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0zODEsIC00NDgsIDIyOCwgMTgzN10kWy0zODEsIC0xODYyLCAyMjgsIDQyM10iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzVYU2ctZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c1WFNoT2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzVYU2hlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDI5RiIgc291cmNlPSJfRzVPSWVPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzVYU09lZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1WFNpT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVYU2l1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1WFNpLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNVhTaWVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzVYU2h1ZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HNVhTaC1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9Ils1NTYsIC0zMTgsIC02NjEsIDE5NThdJFs1NTYsIC0xOTU4LCAtNjYxLCAzMThdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c1WFNqT2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HNVhTamVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c1WFNudWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MkIxRUMxQjAzNDkiIHNvdXJjZT0iX0c1WFNqdWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c1WFNiT2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNVhTb2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1WFNvLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNVhTcE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzVYU291ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c1WFNuLWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzVYU29PZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTM2NCwgNDQ4LCAxOTcyLCAtMTY4NF0kWy0zNjQsIDE2MzQsIDE5NzIsIC00OTldIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c1WFNwZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HNVhTcHVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c1WFNwLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjhDRDMyMzAxOUEiIHNvdXJjZT0iX0c1WFNiT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c1T0ltT2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNVhTcXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1WFNyT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNVhTcmVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzVYU3EtZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c1WFNxT2ZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzVYU3FlZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMTUzNCwgLTMxOCwgMjc3OCwgNjY0MV0kWzE1MzQsIC02NDgyLCAyNzc4LCA0NzddIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c1WFNydWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HNVhTci1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c1WFNzT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBOTI4MjAzOTIiIHNvdXJjZT0iX0c1WFNPZWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c1WFNiT2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNVhTcy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1WFN0ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNVhTdHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzVYU3RPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c1WFNzZWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzVYU3N1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbOTI2LCAzMTgsIC0zMjAyLCAtMzk5NV0kWzkyNiwgMTMyMywgLTMyMDIsIC0yOTkwXSRbMjMyOCwgMTMyMywgLTE4MDAsIC0yOTkwXSRbMjMyOCwgMzk5NSwgLTE4MDAsIC0zMThdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c1WFN0LWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HNVhTdU9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c1WFN1ZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzMDMiIHNvdXJjZT0iX0c1T0lXT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c1T0lhT2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNVhTdk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1WFN2dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNVhTdi1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzVYU3ZlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c1WFN1dWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzVYU3UtZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTQwNiwgLTQ1NywgMzU1LCAxNzc4XSRbLTQwNiwgLTE3ODYsIDM1NSwgNDQ4XSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HNVhTd09mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzVYU3dlZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HNVhTd3VmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTkyM0IwMDAyIiBzb3VyY2U9Il9HNU9JV09mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HNVhTYk9mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVYU3hlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNVhTeC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVYU3lPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c1WFN4dWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HNVhTdy1mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c1WFN4T2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0zMTcsIDMxNywgLTM5NywgLTE3NzNdJFstMzE3LCAxNzcyLCAtMzk3LCAtMzE4XSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HNVhTeWVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzVYU3l1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICA8L2NvbnRlbnRzPgotICAgICAgICAgICAgPGNvbnRlbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpEaWFncmFtIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTAxNTgwRjAwQzQiIHR5cGU9IkNsYXNzIiBuYW1lPSJEZXNjcmlwdG9yUmVsYXRpb25zaGlwcyI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNWhETU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOb3RlIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVoRE0tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRGlhZ3JhbU5hbWUiPgotICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1aEROT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkRlc2NyaXB0aW9uIj4KLSAgICAgICAgICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOlNoYXBlU3R5bGUiIHhtaTppZD0iX0c1aERNZWZYRWR1cUhvT0piVVJaUnciIGZvbnROYW1lPSJBcmlhbCIgZm9udEhlaWdodD0iOCIgZGVzY3JpcHRpb249IntSb2xlRGVzY3JpcHRvci5tb2RpZmllcyA9IFJvbGUucGVyZm9ybXNBc093bmVyLm91dHB1dCB1bmlvbiBSb2xlLnBlcmZvcm1zQWRkaXRpb25hbGx5Lm91dHB1dCB1bmlvbiBSb2xlLmFzc2lzdHNJbi5vdXRwdXR9IiBsaW5lQ29sb3I9IjAiLz4KLSAgICAgICAgICAgICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzVoRE11ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTc3NzEiIHk9IjIzNzkiIHdpZHRoPSI1NTAzIiBoZWlnaHQ9IjE3NTIiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1aEROZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyOTYiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNWhET09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HNWhET2VmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVoRE91ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNWhETy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1aERQT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNWhEUGVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1aERQdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNWhEUC1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1aERRT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNWhEUWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1aERRdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNWhEUS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNWhEUk9mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HNWhETnVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93UGFyZW50PSJOYW1lIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c1aEROLWZYRWR1cUhvT0piVVJaUnciIHg9IjMzMzI0IiB5PSI1NzQwIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNWhEUmVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjlFIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVoRFNPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzVoRFNlZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1aERTdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVoRFMtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNWhEVE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVoRFRlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNWhEVHVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVoRFQtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNWhEVU9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVoRFVlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNWhEVXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVxTklPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzVxTkllZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzVoRFJ1ZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1BhcmVudD0iTmFtZSIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNWhEUi1mWEVkdXFIb09KYlVSWlJ3IiB4PSIxNzE3MCIgeT0iMTUxMzgiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1cU5JdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwOEIiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXFOSmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HNXFOSnVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVxTkotZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXFOS09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1cU5LZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXFOS3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1cU5LLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXFOTE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1cU5MZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXFOTHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1cU5MLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXFOTU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNXFOTWVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HNXFOSS1mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c1cU5KT2ZYRWR1cUhvT0piVVJaUnciIHg9IjI2OTkxIiB5PSI0NjIyIiB3aWR0aD0iNDQ0NSIgaGVpZ2h0PSIzODYwIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXFOVmVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDA5Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVxTldPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzVxTldlZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1cU5XdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVxTlctZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXFOWE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVxTlhlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNXFOWHVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVxTlgtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNXFOWU9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVxTlllZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNXFOWXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVxTlktZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzVxTlpPZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzVxTlZ1ZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNXFOVi1mWEVkdXFIb09KYlVSWlJ3IiB4PSIxNjg4MiIgeT0iODcyMCIgd2lkdGg9IjQ0NDUiIGhlaWdodD0iNDgxNyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzV6LVZPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDJCQyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1ei1WLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c1ei1XT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIzNzU5IiBoZWlnaHQ9IjExMTciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXotV2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1ei1XdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzV6LVctZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1ei1YT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzV6LVhlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1ei1YdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzV6LVgtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1ei1ZT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzV6LVllZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1ei1ZdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1ei1ZLWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c1ei1WZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dQYXJlbnQ9Ik5hbWUiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzV6LVZ1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMjY5MiIgeT0iMTAyNjEiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1ei1aT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwNDUiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXotWi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HNXotYU9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzV6LWFlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXotYXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1ei1hLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXotYk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzV6LWJlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1ei1idWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzV6LWItZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1ei1jT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzV6LWNlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1ei1jdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1ei1jLWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c1ei1aZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJOb25lIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzV6LVp1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iODE3OCIgeT0iNDI5MiIgd2lkdGg9IjY1MTAiIGhlaWdodD0iMzkyMCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxEaWFncmFtU3R5bGUiIHhtaTppZD0iX0dsUURhZWZYRWR1cUhvT0piVVJaUnciIGRlc2NyaXB0aW9uPSJUaGlzIGRpYWdyYW0gcHJvdmlkZXMgYW4gb3ZlcnZpZXcgdG8gYWxsIERlc2NyaXB0b3IgdHlwZXMgZGVmaW5lZCBpbiB0aGUgUHJvY2VzcyBwYWNrYWdlLCB0aGVpciBhdHRyaWJ1dGVzIGFuZCBhc3NvY2lhdGlvbnMuICBXZSBzZWUgdGhhdCBlYWNoIERlc2NyaXB0b3IgdHJhY2VzIGJhY2sgdG8gdGhlIGNvcmUgY29udGVudCBlbGVtZW50IHRoZXkgcmVmZXIgdG8uICBEZXNjcmlwdG9ycyBhbHNvIGRlZmluZSBhZGRpdGlvbmFsIGFzc29jaWF0aW9ucyB0aGFuIHRoZSBhc3NvY2lhdGlvbnMgZGVmaW5lZCBhbW9uZ3N0IHRoZSBjb3JlIGNvbnRlbnQgZWxlbWVudHMuICBGb3IgZXhhbXBsZSwgRXh0ZXJuYWwgSW5wdXRzIGJldHdlZW4gVGFza3MgRGVzY3JpcHRvcnMgYW5kIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9ycyBhcmUgbm90IGRlZmluZWQgaW4gQ29yZSBNZXRob2QgQ29udGVudCwgYmVjYXVzZSBpdCBleHByZXNzZXMgaW5mb3JtYXRpb24gdGhhdCBpcyBzcGVjaWZpYyB0byBhIHByb2Nlc3MgYW5kIG5vdCBhdmFpbGFibGUva25vd24gZm9yIG1ldGhvZCBjb250ZW50LiIvPgotICAgICAgICAgICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HNXFOTXVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTZBIiBzb3VyY2U9Il9HNWhETmVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HNXFOSXVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVxTk5lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXFOTi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVxTk9PZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c1cU5OdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXFOT2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTZEIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXFOTy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNXFOT3VmWEVkdXFIb09KYlVSWlJ3IiB4PSI0IiB5PSIyODAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXFOUE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDE2RCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVxTlB1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1cU5QZWZYRWR1cUhvT0piVVJaUnciIHg9IjQ2NiIgeT0iLTI4NyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1cU5QLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDE2QiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVxTlFlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNXFOUU9mWEVkdXFIb09KYlVSWlJ3IiB4PSIxMDAiIHk9IjEyOCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1cU5RdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTZCIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXFOUk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNXFOUS1mWEVkdXFIb09KYlVSWlJ3IiB4PSI4MyIgeT0iMzQ4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVxTlJlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDE2RCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVxTlItZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzVxTlNPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzVxTlJ1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1cU5TZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDE2QiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVxTlMtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzVxTlRPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzVxTlN1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1cU5UZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTZEIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXFOVC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNXFOVU9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNXFOVHVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVxTlVlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDE2QiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVxTlUtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNXFOVk9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNXFOVXVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzVxTk0tZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HNXFOTk9mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMTg3OSwgLTI1LCA0MTE0LCAtMjc5XSRbLTM3NzYsIC0yNSwgMjIxOCwgLTI3OV0iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c1cU5aZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzMjEiIHNvdXJjZT0iX0c1cU5WZWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c1cU5JdWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXFOYU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1cU5hdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXFOYS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNXFOYWVmWEVkdXFIb09KYlVSWlJ3IiB4PSItMTU3IiB5PSItMjYzIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVxTmJPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDMyQiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVxTmJ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzVxTmJlZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTg5NSIgeT0iLTE4NyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1cU5iLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzJCIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXFOY2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzVxTmNPZlhFZHVxSG9PSmJVUlpSdyIgeD0iNzIyIiB5PSIyODciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXFOY3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzMjIiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1cU5kT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzVxTmMtZlhFZHVxSG9PSmJVUlpSdyIgeD0iODM1IiB5PSIxOTYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXFOZGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzIyIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXFOZC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNXFOZHVmWEVkdXFIb09KYlVSWlJ3IiB4PSI4MzUiIHk9Ii0yMzEwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVxTmVPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDMyQiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVxTmV1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzVxTmUtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzVxTmVlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1cU5mT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDMyMiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVxTmZ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzVxTmYtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzVxTmZlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1cU5nT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzJCIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXFOZ3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNXFOZy1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNXFOZ2VmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVxTmhPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDMyMiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVxTmh1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNXFOaC1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNXFOaGVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzVxTlp1ZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HNXFOWi1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlsyMjE4LCAtMTQyMiwgLTc4OTAsIDMxNDldJFs4NjUyLCAtMTQyMiwgLTE0NTYsIDMxNDldJFs4NjUyLCAtMjY0MSwgLTE0NTYsIDE5MzBdIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HNXFOaU9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzNGIiBzb3VyY2U9Il9HNXFOVmVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HNXFOSXVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVxTmktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXFOamVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVxTmp1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzVxTmpPZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTEyMTUiIHk9Ii0zMjEiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXFOai1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzQyIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXFOa2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNXFOa09mWEVkdXFIb09KYlVSWlJ3IiB4PSItMTkyMCIgeT0iLTI1NCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1cU5rdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzQyIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXFObE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzVxTmstZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTExNTgiIHk9IjIzNyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1cU5sZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDM0MCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVxTmwtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNXFObHVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxNzgzIiB5PSItMTM0Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVxTm1PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDM0MCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVxTm11ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzVxTm1lZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTgxNyIgeT0iMTIwMyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1cU5tLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzNDIiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1cU5uZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1cU5udWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1cU5uT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXFObi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzNDAiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1cU5vZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1cU5vdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1cU5vT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXFOby1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDM0MiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVxTnBlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzVxTnB1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzVxTnBPZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1cU5wLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzNDAiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1cU5xZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzVxTnF1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzVxTnFPZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c1cU5pZWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzVxTml1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMjIxOCwgMTg5NiwgLTc4OTAsIDY0NjhdJFsxMTcxNywgMTg5NiwgMTYwOCwgNjQ2OF0kWzExNzE3LCAtMjY0MSwgMTYwOCwgMTkzMF0iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c1cU5xLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzNTMiIHNvdXJjZT0iX0c1cU5WZWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c1cU5JdWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXFOcnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1cU5zT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXFOc2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNXFOci1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMjYyIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVxTnN1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDM1NiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVxTnRPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzVxTnMtZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTEzNjMiIHk9Ii0yODgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXFOdGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDM1NiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVxTnQtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1cU50dWZYRWR1cUhvT0piVVJaUnciIHg9IjIxMiIgeT0iMjQ2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVxTnVPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzU0Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXFOdXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1cU51ZWZYRWR1cUhvT0piVVJaUnciIHg9IjEyMzYiIHk9IjQzMyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1cU51LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzNTQiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1ei1JT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1cU52T2ZYRWR1cUhvT0piVVJaUnciIHg9IjYyNiIgeT0iMTExMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1ei1JZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzNTYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1ei1JLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1ei1KT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1ei1JdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXotSmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzNTQiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1ei1KLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1ei1LT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1ei1KdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXotS2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDM1NiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzV6LUstZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzV6LUxPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzV6LUt1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1ei1MZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzNTQiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1ei1MLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzV6LU1PZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzV6LUx1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c1cU5yT2ZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzVxTnJlZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMjIxOCwgNTksIC03ODkwLCA0NjMxXSRbOTc4NywgNTksIC0zMjEsIDQ2MzFdJFs5Nzg3LCAtMjY0MSwgLTMyMSwgMTkzMF0iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c1ei1NZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzMEQiIHNvdXJjZT0iX0c1aERSZWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c1cU5WZWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXotTk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1ei1OdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXotTi1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzV6LU5lZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1ei1PT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzMTAiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1ei1PdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1ei1PZWZYRWR1cUhvT0piVVJaUnciIHg9IjgyIiB5PSItNDA2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzV6LU8tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzMTAiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1ei1QZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNXotUE9mWEVkdXFIb09KYlVSWlJ3IiB4PSIxNjAiIHk9IjU3OSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1ei1QdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDMwRSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzV6LVFPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNXotUC1mWEVkdXFIb09KYlVSWlJ3IiB4PSItMTI3IiB5PSItMjM5Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzV6LVFlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzMEUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1ei1RLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1ei1RdWZYRWR1cUhvT0piVVJaUnciIHg9Ijc2IiB5PSItMzQ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzV6LVJPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDMxMCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzV6LVJ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzV6LVItZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzV6LVJlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1ei1TT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDMwRSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzV6LVN1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzV6LVMtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzV6LVNlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1ei1UT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzEwIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXotVHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNXotVC1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNXotVGVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzV6LVVPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDMwRSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzV6LVV1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNXotVS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNXotVWVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzV6LU11ZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HNXotTS1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlsxMzUsIC01NTgsIDg0LCA0MDEzXSRbMTM1LCAtMjE2NywgODQsIDI0MDRdIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HNXotZE9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDIwIiBzb3VyY2U9Il9HNXotWk9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HNXotWk9mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzV6LWQtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXotZWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzV6LWV1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzV6LWVPZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTIwNzMiIHk9IjI1NCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1ei1lLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwMjMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1ei1mZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1ei1mT2ZYRWR1cUhvT0piVVJaUnciIHg9IjIxNSIgeT0iMjc1Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzV6LWZ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwMjMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1ei1nT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNXotZi1mWEVkdXFIb09KYlVSWlJ3IiB4PSIxNTAiIHk9Ii04NjUiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXotZ2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwMjEiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1ei1nLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzV6LWd1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTIxNTYiIHk9Ii0zNTkiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXotaE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDIxIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXotaHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNXotaGVmWEVkdXFIb09KYlVSWlJ3IiB4PSItNjcxIiB5PSItMTE1NyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1ei1oLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwMjMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1ei1pZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1ei1pdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1ei1pT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXotaS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwMjEiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1ei1qZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1ei1qdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1ei1qT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXotai1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDAyMyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzV6LWtlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzV6LWt1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzV6LWtPZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1ei1rLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwMjEiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1ei1sZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzV6LWx1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzV6LWxPZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c1ei1kZWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzV6LWR1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMjUxNCwgLTE5NTUsIDI1MTQsIC0xOTU1XSRbMjUxNCwgLTM1MjIsIDI1MTQsIC0zNTIyXSRbLTkyMiwgLTM1MjIsIC05MjIsIC0zNTIyXSRbLTkyMiwgLTE5NTUsIC05MjIsIC0xOTU1XSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzV6LWwtZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDAwQyIgc291cmNlPSJfRzV6LVpPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzV6LVpPZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1ei1tdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzV6LW5PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1ei1uZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c1ei1tLWZYRWR1cUhvT0piVVJaUnciIHg9Ii03NDkiIHk9Ii04MzEiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXotbnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDBGIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXotb09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNXotbi1mWEVkdXFIb09KYlVSWlJ3IiB4PSItODE5IiB5PSItNDQ4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzV6LW9lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwMEYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1ei1vLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNXotb3VmWEVkdXFIb09KYlVSWlJ3IiB4PSI4MyIgeT0iMzA2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzV6LXBPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDBEIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXotcHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1ei1wZWZYRWR1cUhvT0piVVJaUnciIHg9IjE5OSIgeT0iLTIzNyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1ei1wLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwMEQiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1ei1xZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1ei1xT2ZYRWR1cUhvT0piVVJaUnciIHg9IjE5MSIgeT0iMzQ0Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzV6LXF1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDAwRiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzV6LXJPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzV6LXJlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzV6LXEtZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1ei1ydWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDAwRCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzV6LXNPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzV6LXNlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzV6LXItZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1ei1zdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDBGIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXotdE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNXotdGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNXotcy1mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzU5dklPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDAwRCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzU5dkl1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNTl2SS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNTl2SWVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzV6LW1PZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HNXotbWVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMjcwMCwgLTE5NTUsIC0yNzAwLCAtMTk1NV0kWy0yNzAwLCAtMjY3NSwgLTI3MDAsIC0yNjc1XSRbLTczODIsIC0yNjc1LCAtNzM4MiwgLTI2NzVdJFstNzM4MiwgLTg1NSwgLTczODIsIC04NTVdJFstMzI1MSwgLTg1NSwgLTMyNTEsIC04NTVdIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HNTl2Sk9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTdFIiBzb3VyY2U9Il9HNXFOSXVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HNXotWk9mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzU5dkotZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNTl2S2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzU5dkt1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzU5dktPZlhFZHVxSG9PSmJVUlpSdyIgeD0iMzYyIiB5PSItMjg4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzU5dkstZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDE4OCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzU5dkxlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzU5dkxPZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTE0ODIiIHk9Ii0zNTYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNTl2THVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDE4OCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzU5dk1PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1OXZMLWZYRWR1cUhvT0piVVJaUnciIHg9IjQ0MCIgeT0iMjQ2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzU5dk1lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTdGIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNTl2TS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1OXZNdWZYRWR1cUhvT0piVVJaUnciIHg9IjE2NDAiIHk9Ii0zNDciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNTl2Tk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTdGIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNTl2TnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNTl2TmVmWEVkdXFIb09KYlVSWlJ3IiB4PSI0NTUiIHk9IjIzNyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1OXZOLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxODgiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1OXZPZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1OXZPdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1OXZPT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNTl2Ty1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxN0YiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1OXZQZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1OXZQdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1OXZQT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNTl2UC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDE4OCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzU5dlFlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzU5dlF1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzU5dlFPZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1OXZRLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxN0YiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1OXZSZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzU5dlJ1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzU5dlJPZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c1OXZKZWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzU5dkp1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTIyMTgsIDQ1NywgMTU1NjEsIDc2Ml0kWy0xNDUyOCwgNDU3LCAzMjUxLCA3NjJdIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HNTl2Ui1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTlDIiBzb3VyY2U9Il9HNXFOSXVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HNXotWk9mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzU5dlN1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNTl2VE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzU5dlRlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzU5dlMtZlhFZHVxSG9PSmJVUlpSdyIgeD0iODcwIiB5PSItMjc4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzU5dlR1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDE5RiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzU5dlVPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzU5dlQtZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTE0ODIiIHk9Ii0zMjkiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNTl2VWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxOUYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1OXZVLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNTl2VXVmWEVkdXFIb09KYlVSWlJ3IiB4PSItMzgyIiB5PSIyNjMiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNTl2Vk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxOUQiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1OXZWdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzU5dlZlZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTYzMiIgeT0iLTI0NSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1OXZWLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxOUQiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1OXZXZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1OXZXT2ZYRWR1cUhvT0piVVJaUnciIHg9Ijc3NiIgeT0iMjgwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzU5dld1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDE5RiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzU5dlhPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzU5dlhlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzU5dlctZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1OXZYdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDE5RCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzU5dllPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzU5dlllZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzU5dlgtZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1OXZZdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTlGIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNTl2Wk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNTl2WmVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNTl2WS1mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzU5dlp1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDE5RCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzU5dmFPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNTl2YWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNTl2Wi1mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzU5dlNPZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HNTl2U2VmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMjIxOCwgLTExMDAsIDE1NTYxLCAtNzk1XSRbLTE0NTI4LCAtMTEwMCwgMzI1MSwgLTc5NV0iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c1OXZhdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5vdGVBdHRhY2htZW50IiBzb3VyY2U9Il9HNWhETU9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HNTl2Ui1mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzU5dmEtZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSIwIi8+Ci0gICAgICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c1OXZiT2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzExMCwgODcyLCAtMjAzLCAtMTMyOV0kWzMxMywgMjIwMSwgMCwgMF0iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzU5dmJlZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c1OXZidWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzU5dmItZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDIyOSIgc291cmNlPSJfRzV6LVpPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzVxTlZlZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1OXZjdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzU5dmRPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1OXZkZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c1OXZjLWZYRWR1cUhvT0piVVJaUnciIHg9IjUyOSIgeT0iLTMwNCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1OXZkdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyMkMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1OXZlT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1OXZkLWZYRWR1cUhvT0piVVJaUnciIHg9Ii00NzYiIHk9IjE5NSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1OXZlZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjJDIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNTl2ZS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzU5dmV1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTQ1OSIgeT0iLTExOTQiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNTl2Zk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyMkEiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1OXZmdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzU5dmZlZlhFZHVxSG9PSmJVUlpSdyIgeD0iNDE4IiB5PSItMjk1Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzU5dmYtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDIyQSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzU5dmdlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzU5dmdPZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTYwNyIgeT0iMjYzIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzU5dmd1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDIyQyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzU5dmhPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzU5dmhlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzU5dmctZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1OXZodWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDIyQSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzU5dmlPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzU5dmllZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzU5dmgtZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1OXZpdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjJDIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNTl2ak9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNTl2amVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNTl2aS1mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzU5dmp1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDIyQSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzU5dmtPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNTl2a2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNTl2ai1mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzU5dmNPZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HNTl2Y2VmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlsyMjE4LCAxOTU1LCAtNTQ1MiwgLTI5MjFdJFsyMjE4LCAzNjk5LCAtNTQ1MiwgLTExNzZdJFs1NDUyLCAzNjk5LCAtMjIxOCwgLTExNzZdIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HNTl2a3VmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjNEIiBzb3VyY2U9Il9HNXotWk9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HNXFOVmVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzU5dmxlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNTl2bC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzU5dm1PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzU5dmx1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iNjI3IiB5PSItMjcxIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzU5dm1lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDI0OCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzU5dm0tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzU5dm11ZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTEyOTkiIHk9Ii0yNDUiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNTl2bk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDI0OCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzU5dm51ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1OXZuZWZYRWR1cUhvT0piVVJaUnciIHg9Ii0xMDE5IiB5PSIxIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzU5dm4tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjQ2Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNTl2b2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1OXZvT2ZYRWR1cUhvT0piVVJaUnciIHg9IjEzOTMiIHk9Ii0xOTUiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNTl2b3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjQ2Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNTl2cE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNTl2by1mWEVkdXFIb09KYlVSWlJ3IiB4PSI1MDQiIHk9IjI3MSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1OXZwZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyNDgiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1OXZwLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1OXZxT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1OXZwdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNTl2cWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyNDYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1OXZxLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1OXZyT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1OXZxdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNTl2cmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDI0OCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzU5dnItZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzU5dnNPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzU5dnJ1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1OXZzZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyNDYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1OXZzLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzU5dnRPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzU5dnN1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c1OXZrLWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzU5dmxPZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTI2NDYsIDE5NTgsIC0xMDMxOCwgLTI5MTBdJFstMjY0NiwgNTgyMSwgLTEwMzE4LCA5NTNdJFs1NDUwLCA1ODIxLCAtMjIyMiwgOTUzXSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzZHNUVPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDI1QiIgc291cmNlPSJfRzVxTlZlZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzV6LVpPZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2RzVFLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZHNUZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2RzVGdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c2RzVGT2ZYRWR1cUhvT0piVVJaUnciIHg9Ii05MTAiIHk9IjI1NCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2RzVGLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyNUUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2RzVHZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c2RzVHT2ZYRWR1cUhvT0piVVJaUnciIHg9Ii0xODIzIiB5PSIyNzkiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNkc1R3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDI1RSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZHNUhPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c2RzVHLWZYRWR1cUhvT0piVVJaUnciIHg9Ii01MzYiIHk9Ii0zMTQiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNkc1SGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyNUMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2RzVILWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzZHNUh1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTYzNyIgeT0iMjAzIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZHNUlPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDI1QyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZHNUl1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzZHNUllZlhFZHVxSG9PSmJVUlpSdyIgeD0iOTMiIHk9Ijk3NCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2RzVJLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyNUUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2RzVKZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2RzVKdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c2RzVKT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNkc1Si1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyNUMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2RzVLZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2RzVLdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c2RzVLT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNkc1Sy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDI1RSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZHNUxlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzZHNUx1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzZHNUxPZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2RzVMLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyNUMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2RzVNZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzZHNU11ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzZHNU1PZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c2RzVFZWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzZHNUV1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTIyMjIsIDMxOCwgNTQ1MCwgNTE4Nl0kWy05MDQ4LCAzMTgsIC0xMzc2LCA1MTg2XSRbLTkwNDgsIC0yOTEwLCAtMTM3NiwgMTk1OF0iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c2RzVNLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTZENzVBQTAwNEIiIHNvdXJjZT0iX0c1cU5WZWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c1ei1aT2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNkc1TnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2RzVPT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNkc1T2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNkc1Ti1mWEVkdXFIb09KYlVSWlJ3IiB4PSItMzQzIiB5PSIyNzEiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNkc1T3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE2RDc1QUIwMjk1Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNkc1UE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNkc1Ty1mWEVkdXFIb09KYlVSWlJ3IiB4PSItMTA2MiIgeT0iMjQ1Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZHNVBlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTZENzVBQjAyOTUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2RzVQLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNkc1UHVmWEVkdXFIb09KYlVSWlJ3IiB4PSIzMjciIHk9Ii0yMjAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNkc1UU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTZENzVBQjAyODEiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2RzVRdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzZHNVFlZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTAwMyIgeT0iMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZHNVEtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNkQ3NUFCMDI4MSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZHNVJlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzZHNVJPZlhFZHVxSG9PSmJVUlpSdyIgeD0iNjU2IiB5PSIxMDI0Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZHNVJ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNkQ3NUFCMDI5NSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZHNVNPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzZHNVNlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzZHNVItZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2RzVTdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNkQ3NUFCMDI4MSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZHNVRPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzZHNVRlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzZHNVMtZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2RzVUdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE2RDc1QUIwMjk1Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNkc1VU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNkc1VWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNkc1VC1mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZHNVV1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNkQ3NUFCMDI4MSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZHNVZPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNkc1VmVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNkc1VS1mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzZHNU5PZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HNkc1TmVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMjIxOCwgOCwgNTQ1MiwgNDg4NV0kWy03OTkyLCA4LCAtMzIxLCA0ODg1XSRbLTc5OTIsIC0yOTIxLCAtMzIxLCAxOTU1XSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzZHNVZ1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDNENyIgc291cmNlPSJfRzV6LVZPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzV6LVpPZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2RzVXZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZHNVctZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2RzVYT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNkc1V3VmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZHNVhlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDNEQSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZHNVgtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzZHNVh1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTIxNyIgeT0iNDI5Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZHNVlPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzREEiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2RzVZdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNkc1WWVmWEVkdXFIb09KYlVSWlJ3IiB4PSItMjY2IiB5PSItMTE3MCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2RzVZLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDNEOCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZHNVplZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNkc1Wk9mWEVkdXFIb09KYlVSWlJ3IiB4PSI1MzYiIHk9IjQ1NyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2RzVadWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwM0Q4Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNkc1YU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNkc1Wi1mWEVkdXFIb09KYlVSWlJ3IiB4PSIyNjQiIHk9Ii0zNDciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNkc1YWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwM0RBIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNkc1YS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNkc1Yk9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNkc1YXVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZHNWJlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwM0Q4Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNkc1Yi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNkc1Y09mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNkc1YnVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZHNWNlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzREEiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2RzVjLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2RzVkT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c2RzVjdWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNkc1ZGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwM0Q4Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNkc1ZC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2RzVlT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c2RzVkdWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HNkc1Vi1mWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzZHNVdPZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMCwgLTU2NywgLTY4NTgsIDQwMDRdJFszMywgLTIyOTQsIC02ODI0LCAyMjc3XSRbMzU5OCwgLTM0OTYsIC0zMjU5LCAxMDc1XSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgPC9jb250ZW50cz4KLSAgICAgICAgICAgIDxjb250ZW50cyB4bWk6dHlwZT0ibm90YXRpb246RGlhZ3JhbSIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDExQzRDQzUwMjYwIiB0eXBlPSJDbGFzcyIgbmFtZT0iRGVzY3JpcHRvclJlbGF0aW9uc2hpcHMgKHNpbXBsaWZpZWQpIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2UXFFT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwOEIiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNlFxRS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HNlFxRk9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZRcUZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNlFxRnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2UXFGLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNlFxR09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2UXFHZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNlFxR3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2UXFHLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNlFxSE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2UXFIZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNlFxSHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNlFxSC1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HNlFxRWVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c2UXFFdWZYRWR1cUhvT0piVVJaUnciIHg9IjE1NzA1IiB5PSIyNDk3IiB3aWR0aD0iMzIzNCIgaGVpZ2h0PSIxMjAyIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNlFxSU9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDQ1Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZRcUktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzZRcUpPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2UXFKZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZRcUp1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNlFxSi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZRcUtPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNlFxS2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZRcUt1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNlFxSy1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZRcUxPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNlFxTGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZRcUx1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzZRcUwtZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzZRcUllZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNlFxSXVmWEVkdXFIb09KYlVSWlJ3IiB4PSI2MDEiIHk9IjIzNzAiIHdpZHRoPSI0NzkyIiBoZWlnaHQ9IjE3NjEiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2UXFkdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwMDkiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNlFxZWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HNlFxZXVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZRcWUtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNlFxZk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2UXFmZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNlFxZnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2UXFmLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmFiRU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2YWJFZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmFiRXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2YWJFLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmFiRk9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNmFiRmVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HNlFxZC1mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c2UXFlT2ZYRWR1cUhvT0piVVJaUnciIHg9Ijg3NzkiIHk9IjYzMjQiIHdpZHRoPSIzMzY5IiBoZWlnaHQ9IjE3NzgiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MRGlhZ3JhbVN0eWxlIiB4bWk6aWQ9Il9HbFpOVWVmWEVkdXFIb09KYlVSWlJ3IiBkZXNjcmlwdGlvbj0iVGhpcyBkaWFncmFtIHByb3ZpZGVzIGEgc2ltcGxpZmllZCBvdmVydmlldyBvZiB0aGUgZGlmZmVyZW50IERlc2NyaXB0b3IgdHlwZXMgZGVmaW5lZCBpbiB0aGlzIFByb2Nlc3MgcGFja2FnZSBhbmQgdGhlaXIgcmVsYXRpb25zaGlwcyBub3Qgc2hvd2luZyBjbGFzcyBhdHRyaWJ1dGVzIG9yIGFzc29jaWF0aW9uIHJvbGVzLiIvPgotICAgICAgICAgICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HNlFxTU9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTdFIiBzb3VyY2U9Il9HNlFxRU9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HNlFxSU9mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZRcU0tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNlFxTmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZRcU51ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzZRcU5PZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTI3IiB5PSIyNTQiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNlFxTi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTg4Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNlFxT2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNlFxT09mWEVkdXFIb09KYlVSWlJ3IiB4PSItMTEyNCIgeT0iLTI4OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2UXFPdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDE4OCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZRcVBPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c2UXFPLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0zOTciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNlFxUGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxN0YiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2UXFQLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzZRcVB1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTIwOSIgeT0iLTQ0OSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2UXFRT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTdGIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNlFxUXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNlFxUWVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMzk3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZRcVEtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDE4OCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZRcVJlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzZRcVJ1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzZRcVJPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2UXFSLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDE3RiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZRcVNlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzZRcVN1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzZRcVNPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2UXFTLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTg4Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNlFxVGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNlFxVHVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNlFxVE9mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZRcVQtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDE3RiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZRcVVlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNlFxVXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNlFxVU9mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzZRcU1lZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HNlFxTXVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMTYxNywgOTMsIDEyNzA4LCAtNTldJFstMTE5MjksIDkzLCAyMzk2LCAtNTldIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HNlFxVS1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTlDIiBzb3VyY2U9Il9HNlFxRU9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HNlFxSU9mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZRcVZ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNlFxV09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZRcVdlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzZRcVYtZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTgyIiB5PSIyNzkiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNlFxV3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTlGIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNlFxWE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNlFxVy1mWEVkdXFIb09KYlVSWlJ3IiB4PSItNjI2IiB5PSItNTI1Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZRcVhlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTlGIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNlFxWC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzZRcVh1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTc5NSIgeT0iMzQ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZRcVlPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTlEIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNlFxWXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c2UXFZZWZYRWR1cUhvT0piVVJaUnciIHg9IjEwNTAiIHk9Ii0xMDA3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZRcVktZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxOUQiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2UXFaZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c2UXFaT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0zOTciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNlFxWnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTlGIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNlFxYU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNlFxYWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNlFxWi1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZRcWF1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTlEIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNlFxYk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNlFxYmVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNlFxYS1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZRcWJ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxOUYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2UXFjT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2UXFjZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c2UXFiLWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNlFxY3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTlEIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNlFxZE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2UXFkZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c2UXFjLWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HNlFxVk9mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c2UXFWZWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy00NjUsIC02MDEsIDEzODU5LCAtNzUzXSRbLTQ2NSwgLTE5MzAsIDEzODU5LCAtMjA4Ml0kWy0xMzk2MSwgLTE5MzAsIDM2NCwgLTIwODJdJFstMTM5NjEsIC03MjgsIDM2NCwgLTg4MF0iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c2YWJGdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzMjEiIHNvdXJjZT0iX0c2UXFkdWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c2UXFFT2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmFiR2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2YWJHLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmFiSE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNmFiR3VmWEVkdXFIb09KYlVSWlJ3IiB4PSItMTEyMiIgeT0iMjYyIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZhYkhlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDMyQiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZhYkgtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzZhYkh1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTgyNyIgeT0iOTA2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZhYklPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzJCIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmFiSXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzZhYkllZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTM5NyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2YWJJLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDMyMiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZhYkplZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNmFiSk9mWEVkdXFIb09KYlVSWlJ3IiB4PSI3MDkiIHk9IjIxMiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2YWJKdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzIyIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmFiS09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNmFiSi1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMzk3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZhYktlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDMyQiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZhYkstZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzZhYkxPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzZhYkt1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2YWJMZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDMyMiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZhYkwtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzZhYk1PZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzZhYkx1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2YWJNZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzJCIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmFiTS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNmFiTk9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNmFiTXVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZhYk5lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDMyMiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZhYk4tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNmFiT09mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNmFiTnVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzZhYkYtZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HNmFiR09mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlsxNjg0LCAtODIxLCAtNTE3MywgMzI5M10kWzU0NjksIC04MjEsIC0xMzg4LCAzMjkzXSRbNTQ2OSwgLTM1MTMsIC0xMzg4LCA2MDFdIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HNmFiT2VmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzNGIiBzb3VyY2U9Il9HNlFxZHVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HNlFxRU9mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZhYlBPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmFiUHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZhYlAtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzZhYlBlZlhFZHVxSG9PSmJVUlpSdyIgeD0iNDAwIiB5PSIyOTUiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmFiUU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzQyIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmFiUXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNmFiUWVmWEVkdXFIb09KYlVSWlJ3IiB4PSItMTQyNCIgeT0iMzU2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZhYlEtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzQyIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmFiUmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzZhYlJPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTM5NyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2YWJSdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDM0MCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZhYlNPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNmFiUi1mWEVkdXFIb09KYlVSWlJ3IiB4PSIxMzE0IiB5PSItMTY4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZhYlNlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzNDAiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2YWJTLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c2YWJTdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0zOTciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmFiVE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzQyIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmFiVHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNmFiVC1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNmFiVGVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZhYlVPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzQwIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmFiVXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNmFiVS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNmFiVWVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZhYlZPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzNDIiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2YWJWdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2YWJWLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c2YWJWZWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmFiV09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzQwIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmFiV3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2YWJXLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c2YWJXZWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HNmFiT3VmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c2YWJPLWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzE2ODQsIDY2MCwgLTUxNzMsIDQ3NzVdJFs4MDg1LCA2NjAsIDEyMjcsIDQ3NzVdJFs4MDg1LCAtMzUxMywgMTIyNywgNjAxXSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzZhYlhPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDM1MyIgc291cmNlPSJfRzZRcWR1ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzZRcUVPZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2YWJYLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZhYlllZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2YWJZdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c2YWJZT2ZYRWR1cUhvT0piVVJaUnciIHg9Ii04OTUiIHk9IjM4NyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2YWJZLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzNTYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2YWJaZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c2YWJaT2ZYRWR1cUhvT0piVVJaUnciIHg9Ii0xMTM3IiB5PSItOTQwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZhYlp1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzU2Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmFiYU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzZhYlotZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTM5NyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2YWJhZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDM1NCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZhYmEtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNmFiYXVmWEVkdXFIb09KYlVSWlJ3IiB4PSI5ODUiIHk9IjM5MSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2YWJiT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzU0Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmFiYnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNmFiYmVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMzk3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZhYmItZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDM1NiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZhYmNlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzZhYmN1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzZhYmNPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2YWJjLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDM1NCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZhYmRlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzZhYmR1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzZhYmRPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2YWJkLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzU2Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmFiZWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNmFiZXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNmFiZU9mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZhYmUtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDM1NCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZhYmZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNmFiZnVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNmFiZk9mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzZhYlhlZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HNmFiWHVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlsxNjg0LCAtMTE4LCAtNTE3MywgMzk5Nl0kWzU4MzMsIC0xMTgsIC0xMDI0LCAzOTk2XSRbNjU0NCwgLTU5LCAtMzEzLCA0MDU1XSRbNjU0NCwgLTM1MTMsIC0zMTMsIDYwMV0iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c2YWJmLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyMjkiIHNvdXJjZT0iX0c2UXFJT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c2UXFkdWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmFiZ3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2YWJoT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmFiaGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNmFiZy1mWEVkdXFIb09KYlVSWlJ3IiB4PSItMzk4IiB5PSItMjQ2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZhYmh1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDIyQyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZhYmlPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzZhYmgtZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTI5NiIgeT0iLTY3NyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2YWJpZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDIyQyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZhYmktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c2YWJpdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0zOTciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmFiak9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyMkEiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2YWJqdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzZhYmplZlhFZHVxSG9PSmJVUlpSdyIgeD0iODEzIiB5PSItMjEyIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZhYmotZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyMkEiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2YWJrZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c2YWJrT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0zOTciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmFia3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjJDIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmFibE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNmFibGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNmFiay1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZhYmx1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjJBIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmFibU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNmFibWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNmFibC1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZhYm11ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyMkMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2YWJuT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2YWJuZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c2YWJtLWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmFibnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjJBIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmFib09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2YWJvZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c2YWJuLWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HNmFiZ09mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c2YWJnZWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzE2MzQsIDg4MCwgLTU4MzMsIC0zMDgxXSRbMTYzNCwgMTg3MSwgLTU4MzMsIC0yMDkxXSRbNjcyMiwgMTg3MSwgLTc0NSwgLTIwOTFdJFs2NzIyLCAzMDczLCAtNzQ1LCAtODg5XSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzZhYm91ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDIzRCIgc291cmNlPSJfRzZRcUlPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzZRcWR1ZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2YWJwZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZhYnAtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2YWJxT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c2YWJwdWZYRWR1cUhvT0piVVJaUnciIHg9Ii0xMTYiIHk9Ii0yNjIiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmFicWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjQ4Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmpsQU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNmFicXVmWEVkdXFIb09KYlVSWlJ3IiB4PSItMTMxNiIgeT0iLTEzNSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2amxBZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDI0OCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZqbEEtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c2amxBdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0zOTciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmpsQk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyNDYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2amxCdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzZqbEJlZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTUxOSIgeT0iLTMxMyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2amxCLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjQ2Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmpsQ2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNmpsQ09mWEVkdXFIb09KYlVSWlJ3IiB5PSItMzk3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZqbEN1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDI0OCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZqbERPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzZqbERlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzZqbEMtZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2amxEdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDI0NiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZqbEVPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzZqbEVlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzZqbEQtZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2amxFdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjQ4Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmpsRk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNmpsRmVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNmpsRS1mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZqbEZ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDI0NiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZqbEdPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNmpsR2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNmpsRi1mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzZhYm8tZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HNmFicE9mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMTk0NywgODgwLCAtOTQxNCwgLTMwODFdJFstMTk0NywgNDQ2MSwgLTk0MTQsIDQ5OV0kWzEzNSwgNDQzNiwgLTczMzIsIDQ3NF0kWzU3ODIsIDQ0MzYsIC0xNjg0LCA0NzRdIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HNmpsR3VmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjVCIiBzb3VyY2U9Il9HNlFxZHVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HNlFxSU9mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZqbEhlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmpsSC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZqbElPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzZqbEh1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTY3MyIgeT0iMzA1Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZqbEllZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDI1RSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZqbEktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzZqbEl1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTEyMDMiIHk9IjI3MSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2amxKT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDI1RSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZqbEp1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c2amxKZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0zOTciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmpsSi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyNUMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2amxLZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzZqbEtPZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTE1MyIgeT0iMTg3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZqbEt1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyNUMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2amxMT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c2amxLLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0zOTciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmpsTGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjVFIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmpsTC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNmpsTU9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNmpsTHVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZqbE1lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjVDIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmpsTS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNmpsTk9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNmpsTXVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZqbE5lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyNUUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2amxOLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2amxPT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c2amxOdWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmpsT2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjVDIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmpsTy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2amxQT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c2amxPdWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HNmpsRy1mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c2amxIT2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0xNjg0LCAtMzM4LCA1NzgyLCAzNjIzXSRbLTgzODIsIC0zMzgsIC05MTQsIDM2MjNdJFstODM4MiwgLTMwODEsIC05MTQsIDg4MF0iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c2amxQZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTZENzVBQTAwNEIiIHNvdXJjZT0iX0c2UXFkdWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c2UXFJT2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmpsUU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2amxRdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmpsUS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNmpsUWVmWEVkdXFIb09KYlVSWlJ3IiB4PSItNDAzIiB5PSIzMDUiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmpsUk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE2RDc1QUIwMjk1Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmpsUnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNmpsUmVmWEVkdXFIb09KYlVSWlJ3IiB4PSItOTc1IiB5PSItMjExIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZqbFItZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE2RDc1QUIwMjk1Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmpsU2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzZqbFNPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTM5NyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2amxTdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNkQ3NUFCMDI4MSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZqbFRPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNmpsUy1mWEVkdXFIb09KYlVSWlJ3IiB4PSI4MzAiIHk9IjIxMSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2amxUZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE2RDc1QUIwMjgxIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmpsVC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNmpsVHVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMzk3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZqbFVPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNkQ3NUFCMDI5NSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZqbFV1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzZqbFUtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzZqbFVlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2amxWT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNkQ3NUFCMDI4MSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZqbFZ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzZqbFYtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzZqbFZlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2amxXT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE2RDc1QUIwMjk1Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmpsV3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNmpsVy1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNmpsV2VmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZqbFhPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNkQ3NUFCMDI4MSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZqbFh1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNmpsWC1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNmpsWGVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzZqbFB1ZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HNmpsUC1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMTQ3MywgLTg4OSwgNTk5NCwgMzA3M10kWy0xNDczLCAtMTI2MSwgNTk5NCwgMjcwMF0kWy02OTU5LCAtMTI2MSwgNTA4LCAyNzAwXSRbLTY5NTksIC0zMDgxLCA1MDgsIDg4MF0iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgIDwvY29udGVudHM+Ci0gICAgICAgICAgICA8Y29udGVudHMgeG1pOnR5cGU9Im5vdGF0aW9uOkRpYWdyYW0iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxRTc5MDU0MDIyNSIgdHlwZT0iQ2xhc3MiIG5hbWU9IkFjdGl2aXR5Ij4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2amxZT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwRUYiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmpsWS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HNmpsWk9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iNjg5MSIgaGVpZ2h0PSIyNDIxIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZqbFplZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmpsWnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2amxaLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmpsYU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzZqbGFlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2amxhdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzZqbGEtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2amxiT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzZqbGJlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2dFdBT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2dFdBZWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c2amxZZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzZqbFl1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iNjcxNCIgeT0iMTU4MyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZ0V0F1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVEMDNEMyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2dFdCZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c2dFdCdWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxNTc0IiBoZWlnaHQ9IjkwNSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2dFdCLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZ0V0NPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNnRXQ2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZ0V0N1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNnRXQy1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZ0V0RPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNnRXRGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZ0V0R1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNnRXRC1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZ0V0VPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzZ0V0VlZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzZ0V0EtZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNnRXQk9mWEVkdXFIb09KYlVSWlJ3IiB4PSI2NjI5IiB5PSI3MjcyIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNnRXTmVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUQwM0NCIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZ0V09PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzZ0V09lZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjE2NTkiIGhlaWdodD0iOTA1Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZ0V091ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNnRXTy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2dFdQT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNnRXUGVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2dFdQdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNnRXUC1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2dFdRT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNnRXUWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2dFdRdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNnRXUS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNnRXUk9mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HNnRXTnVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c2dFdOLWZYRWR1cUhvT0piVVJaUnciIHg9Ijc4MDYiIHk9IjkxMDEiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2dFdUdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RDAzQ0EiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNnRXVWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HNnRXVXVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZ0V1UtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNnRXVk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2dFdWZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNnRXVnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2dFdWLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNnRXV09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2dFdXZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNnRXV3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2dFdXLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNnRXWE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNnRXWGVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HNnRXVC1mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c2dFdVT2ZYRWR1cUhvT0piVVJaUnciIHg9IjYxNDYiIHk9IjkxMDEiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2dFdaLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBOTI1NDAyMjciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNnRXYXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HNnRXYS1mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iNDI1MCIgaGVpZ2h0PSI5MDUiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNnRXYk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2dFdiZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZ0V2J1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2dFdiLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzZ0V2NPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2dFdjZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzZ0V2N1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2dFdjLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzZ0V2RPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2dFdkZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2dFdkdWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c2dFdhT2ZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzZ0V2FlZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTgxOSIgeT0iNTAzNSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZ0V2llZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E4MkQzMDE3RiI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2dFdqT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c2dFdqZWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIzNjkxIiBoZWlnaHQ9IjEwMzIiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNnRXanVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2dFdqLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZ0V2tPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2dFdrZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzZ0V2t1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2dFdrLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzZ0V2xPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2dFdsZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzZ0V2x1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2dFdsLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2dFdtT2ZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c2dFdpdWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzZ0V2ktZlhFZHVxSG9PSmJVUlpSdyIgeD0iNjY4OCIgeT0iNTA3MiIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxEaWFncmFtU3R5bGUiIHhtaTppZD0iX0dsWk5VLWZYRWR1cUhvT0piVVJaUnciIGRlc2NyaXB0aW9uPSJUaGlzIGRpYWdyYW0gc2hvd3Mga2V5IGF0dHJpYnV0ZXMgYW5kIHJlbGF0aW9uc2hpcHMgZGVmaW5lZCBmb3IgQWN0aXZpdHkgaW4gdGhlIFByb2Nlc3MgQnJlYWtkb3duIHBhY2thZ2UuICBPbmUgY2FuIHNlZSB0aGF0IHRoZSBjb25jZXB0cyBvZiBQaGFzZSBhbmQgSXRlcmF0aW9uIGhhdmUgYmVlbiBkZWZpbmVkIGFzIHNwZWNpYWwgQWN0aXZpdGllcy4gIi8+Ci0gICAgICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c2dFdFdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUUwRkZEMzAwRUYiIHNvdXJjZT0iX0c2amxZT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c2dFdBdWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNnRXRmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2dFdGLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNnRXR09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNnRXRnVmWEVkdXFIb09KYlVSWlJ3IiB4PSItNzQ5IiB5PSIxNTkyIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZ0V0dlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRTBGRkQzMDBGMSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZ0V0ctZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzZ0V0d1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTQ3OSIgeT0iLTI0OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2dFdIT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFMEZGRDMwMEYxIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNnRXSHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzZ0V0hlZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTUzOSIgeT0iMTY5MiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2dFdILWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRTBGRkQzMDBGMCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZ0V0llZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNnRXSU9mWEVkdXFIb09KYlVSWlJ3IiB4PSI1MzYiIHk9IjE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2dFdJdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUUwRkZEMzAwRjAiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2dFdKT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c2dFdJLWZYRWR1cUhvT0piVVJaUnciIHg9Ii00MTQiIHk9Ii0zNDAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNnRXSmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFMEZGRDMwMEYxIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNnRXSi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNnRXS09mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNnRXSnVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZ0V0tlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFMEZGRDMwMEYwIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNnRXSy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNnRXTE9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNnRXS3VmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZ0V0xlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUUwRkZEMzAwRjEiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2dFdMLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2dFdNT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c2dFdMdWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNnRXTWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFMEZGRDMwMEYwIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNnRXTS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2dFdOT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c2dFdNdWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HNnRXRS1mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c2dFdGT2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzE4NTIsIDEwNTgsIDM3MDQsIC0zODkwXSRbMTg1MiwgNTAwMSwgMzcwNCwgNTNdJFstOTI2LCA1MDAxLCA5MjYsIDUzXSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzZ0V1JlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDJBMCIgc291cmNlPSJfRzZ0V05lZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzZ0V0F1ZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2dFdTT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZ0V1N1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2dFdTLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNnRXU2VmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzZ0V1J1ZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c2dFdSLWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0zMDQsIC00NTcsIDkxNCwgMTM3MV0kWy05MjIsIC0xMzgwLCAyOTYsIDQ0OF0iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzZ0V1RPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c2dFdUZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzZ0V1h1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDI5RiIgc291cmNlPSJfRzZ0V1R1ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzZ0V0F1ZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2dFdZZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZ0V1ktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2dFdaT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNnRXWXVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzZ0V1gtZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c2dFdZT2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzMwNCwgLTQ1NywgLTk2NSwgMTM3MV0kWzk0OCwgLTEzODAsIC0zMjEsIDQ0OF0iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzZ0V1plZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c2dFdadWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzZ0V2QtZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E5MjgyMDM5MiIgc291cmNlPSJfRzZ0V0F1ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzZ0V1otZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2dFdldWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZ0V2ZPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2dFdmZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNnRXZS1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzZ0V2VPZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HNnRXZWVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstOTUzLCA1MywgMjUxMywgMjI3Nl0kWy00NDQ1LCA1MywgLTk3OSwgMjI3Nl0kWy00NDQ1LCAtMTkwNSwgLTk3OSwgMzE4XSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HNnRXZnVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzZ0V2YtZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HNnRXZ09mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI4Q0QzMjMwMTlBIiBzb3VyY2U9Il9HNnRXWi1mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HNmpsWU9mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZ0V2ctZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNnRXaGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZ0V2h1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c2dFdoT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HNnRXZ2VmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c2dFdndWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzEyNywgLTQ0OCwgLTU2NjQsIDIyOTRdJFsxMjcsIC0yNjI0LCAtNTY2NCwgMTE4XSRbMjM0NSwgLTI2MjQsIC0zNDQ1LCAxMThdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c2dFdoLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HNnRXaU9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c2dFdtZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjhDRDMyOTAxRkQiIHNvdXJjZT0iX0c2dFdBdWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c2dFdpZWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNnRXbk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2dFdudWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNnRXbi1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzZ0V25lZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c2dFdtdWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzZ0V20tZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMjUsIC00NTcsIC0xMDkyLCAxNzI3XSRbMjUsIC0xNjY3LCAtMTA5MiwgNTE2XSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HNjJmOE9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzYyZjhlZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICA8L2NvbnRlbnRzPgotICAgICAgICAgICAgPGNvbnRlbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpEaWFncmFtIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MjdBOTJENDAwN0UiIHR5cGU9IkNsYXNzIiBuYW1lPSJXb3JrRGVmaW5pdGlvbkFuZEJyZWFrZG93biI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNjJmOHVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTkyNTQwMjI3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzYyZjllZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzYyZjl1ZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjUxNjQiIGhlaWdodD0iMjA2NSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2MmY5LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzYyZi1PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNjJmLWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzYyZi11ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2MmYtLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNjJmX09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2MmZfZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNjJmX3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2MmZfLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNjJnQU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNjJnQWVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HNjJmOC1mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iTm9uZSIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c2MmY5T2ZYRWR1cUhvT0piVVJaUnciIHg9IjE1ODA3IiB5PSIxMTg3MCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzYyZ0F1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDBFNiI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2MmdCZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c2MmdCdWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSI3MzgyIiBoZWlnaHQ9IjExODUiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNjJnQi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2MmdDT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzYyZ0NlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2MmdDdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNjJnQy1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzYyZ0RPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNjJnRGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzYyZ0R1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNjJnRC1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzYyZ0VPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzYyZ0VlZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzYyZ0EtZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNjJnQk9mWEVkdXFIb09KYlVSWlJ3IiB4PSI1MTk4IiB5PSIxMTg1MyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzYyZ0V1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDAwOSI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2MmdGZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c2MmdGdWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIyNzI2IiBoZWlnaHQ9IjExMDAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNjJnRi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2MmdHT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzYyZ0dlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2MmdHdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNjJnRy1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzYyZ0hPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNjJnSGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzYyZ0h1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNjJnSC1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzYyZ0lPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzYyZ0llZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzYyZ0UtZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNjJnRk9mWEVkdXFIb09KYlVSWlJ3IiB4PSIxMjYzMCIgeT0iMTUzMjQiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2MmdJdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwNDUiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNjJnSmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HNjJnSnVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iNDMxOCIgaGVpZ2h0PSIxNjI1Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzYyZ0otZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNjJnS09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2MmdLZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNjJnS3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzYyZ0stZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2MmdMT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzYyZ0xlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2MmdMdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzYyZ0wtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2MmdNT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2MmdNZWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c2MmdJLWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzYyZ0pPZlhFZHVxSG9PSmJVUlpSdyIgeD0iNDY5OSIgeT0iMTUyOTAiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2MmdNdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwOEIiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNjJnTmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HNjJnTnVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMjY3NSIgaGVpZ2h0PSIxMTAwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzYyZ04tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNjJnT09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2MmdPZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNjJnT3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzYyZ08tZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2MmdQT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzYyZ1BlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2MmdQdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzYyZ1AtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2MmdRT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2MmdRZWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c2MmdNLWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzYyZ05PZlhFZHVxSG9PSmJVUlpSdyIgeD0iOTM2MiIgeT0iMTUyOTkiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2MmdRdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwNjMiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNjJnUmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HNjJnUnVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMjIzNSIgaGVpZ2h0PSIxMTAwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzYyZ1ItZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNjJnU09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2MmdTZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNjJnU3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzYyZ1MtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2MmdUT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzYyZ1RlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2MmdUdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzYyZ1QtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2MmdVT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2MmdVZWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c2MmdRLWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzYyZ1JPZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTk2OCIgeT0iMTUyOTkiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3QVE4T2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBODJEMzAxN0YiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0FROC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HN0FROU9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMzUyMiIgaGVpZ2h0PSIxNTI0Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdBUTllZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0FROXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3QVE5LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0FRLU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzdBUS1lZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3QVEtdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzdBUS0tZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3QVFfT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzdBUV9lZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3QVFfdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3QVFfLWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c3QVE4ZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjEyNjMyMjU2IiBzaG93UGFyZW50PSJOYW1lIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c3QVE4dWZYRWR1cUhvT0piVVJaUnciIHg9IjE3MzM5IiB5PSI1MDgwIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0FSQU9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjgwIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdBUkEtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzdBUkJPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjI4NDQiIGhlaWdodD0iMTA2NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3QVJCZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdBUkJ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0FSQi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdBUkNPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN0FSQ2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdBUkN1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN0FSQy1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdBUkRPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN0FSRGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdBUkR1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzdBUkQtZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzdBUkFlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMTI2MzIyNTYiIHNob3dQYXJlbnQ9Ik5hbWUiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzdBUkF1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTMzNjAiIHk9IjkzOSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdBUkdlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyODNFOEExMDM0MSI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3QVJIT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c3QVJIZWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIyOTk3IiBoZWlnaHQ9IjExMTciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0FSSHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3QVJILWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdBUklPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3QVJJZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN0FSSXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdBUkktZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN0FSSk9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdBUkplZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN0FSSnVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdBUkotZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzdBUktPZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzdBUkd1ZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HN0FSRy1mWEVkdXFIb09KYlVSWlJ3IiB4PSI3NzQ3IiB5PSI1Mzg0Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0FSS2VmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMEVGIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdBUkxPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzdBUkxlZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjY4NzQiIGhlaWdodD0iMjUwNiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3QVJMdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdBUkwtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0FSTU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdBUk1lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3QVJNdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0FSTS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3QVJOT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0FSTmVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3QVJOdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0FSTi1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN0FST09mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HN0FSS3VmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iTm9uZSIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c3QVJLLWZYRWR1cUhvT0piVVJaUnciIHg9IjU3NTciIHk9Ijc4NDAiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3QVJPZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RDAzRDMiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0FSUE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HN0FSUGVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTU1NyIgaGVpZ2h0PSIxMTE3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdBUlB1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0FSUC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3QVJRT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0FSUWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzdBUlF1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3QVJRLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzdBUlJPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3QVJSZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzdBUlJ1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3QVJSLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3QVJTT2ZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c3QVJPdWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzdBUk8tZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTg5MzEiIHk9Ijg1MzQiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3S0I4dWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjk0RUI5MDAwRkMiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0tCOWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HN0tCOXVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iNDcwNyIgaGVpZ2h0PSIxNTU3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdLQjktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0tCLU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3S0ItZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0tCLXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzdLQi0tZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3S0JfT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzdLQl9lZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3S0JfdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzdLQl8tZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3S0NBT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3S0NBZWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c3S0I4LWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iTm9uZSIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjEyNjMyMjU2IiBzaG93UGFyZW50PSJOYW1lIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c3S0I5T2ZYRWR1cUhvT0piVVJaUnciIHg9Ijk2ODUiIHk9IjI5MjkiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3S0NGT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwMzEiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0tDRi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HN0tDR09mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTkzMCIgaGVpZ2h0PSIxMTE3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdLQ0dlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0tDR3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3S0NHLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0tDSE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzdLQ0hlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3S0NIdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzdLQ0gtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3S0NJT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzdLQ0llZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3S0NJdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3S0NJLWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c3S0NGZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzdLQ0Z1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTcwMjciIHk9IjE1MzQyIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTERpYWdyYW1TdHlsZSIgeG1pOmlkPSJfR2xpLVVlZlhFZHVxSG9PSmJVUlpSdyIgZGVzY3JpcHRpb249IlRoaXMgZGlhZ3JhbSBwcm92aWRlIGEgZ2VuZXJhbCBvdmVydmlldyB0byB0aGUgdGF4b25vbXkgZGVmaW5lZCBpbiBQcm9jZXNzIEJyZWFrZG93biBwcmVzZW50aW5nIHRoZSB0d28ga2V5IGFic3RyYWN0aW9ucyBQcm9jZXNzIFdvcmsgRGVmaW5pdGlvbiBhbmQgQnJlYWtkb3duIEVsZW1lbnQgd2l0aCB0aGVpciBtb3N0IGltcG9ydGFudCBzdWItY2xhc3Nlcy4iLz4KLSAgICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzdBUkVPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E4MkYzMDI2RSIgc291cmNlPSJfRzdBUThPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzdBUkFPZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3QVJFLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdBUkZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3QVJGdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HN0FSRk9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzdBUkVlZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSIxMjYzMjI1NiIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HN0FSRXVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstNzYyLCAtNzcwLCAzNTU2LCAzNTk4XSRbLTM3OTMsIC0zODM1LCA1MjQsIDUzM10iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzdBUkYtZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c3QVJHT2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzdBUlNlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRTBGRkQzMDBFRiIgc291cmNlPSJfRzdBUktlZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzdBUk9lZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3QVJUT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdBUlR1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3QVJULWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c3QVJUZWZYRWR1cUhvT0piVVJaUnciIHg9Ii02NSIgeT0iMzQ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdBUlVPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRTBGRkQzMDBGMSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdBUlV1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzdBUlVlZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTc1OCIgeT0iMzA1Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdBUlUtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUUwRkZEMzAwRjEiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3QVJWZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HN0FSVk9mWEVkdXFIb09KYlVSWlJ3IiB4PSI4NzYiIHk9Ii0yNDYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0FSVnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUUwRkZEMzAwRjAiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3QVJXT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzdBUlYtZlhFZHVxSG9PSmJVUlpSdyIgeD0iODI5IiB5PSItMjYwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdBUldlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRTBGRkQzMDBGMCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdBUlctZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzdBUld1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTg4IiB5PSIzNTciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0FSWE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFMEZGRDMwMEYxIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0FSWHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN0FSWC1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HN0FSWGVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdBUllPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFMEZGRDMwMEYwIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0FSWXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN0FSWS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HN0FSWWVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdBUlpPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUUwRkZEMzAwRjEiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3QVJadWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3QVJaLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c3QVJaZWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0FSYU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFMEZGRDMwMEYwIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0FSYXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3QVJhLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c3QVJhZWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HN0FSU3VmWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzdBUlMtZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMzQzNywgMCwgLTcwNzgsIDBdJFs5NzI4LCAwLCAtNzg3LCAwXSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzdBUmJPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E5MjgyMDM5MiIgc291cmNlPSJfRzdBUk9lZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzYyZjh1ZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3QVJiLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdBUmNlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3QVJjdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HN0FSY09mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzdBUmJlZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HN0FSYnVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMTE4LCA1NTAsIDEyMDIsIC0zMjU5XSRbLTExOCwgMjc2OCwgMTIwMiwgLTEwNDFdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c3QVJjLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HN0FSZE9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c3QVJkZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjhDRDMyOTAxRkQiIHNvdXJjZT0iX0c3QVJPZWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c3QVE4T2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0FSZU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3QVJldWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0FSZS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzdBUmVlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c3QVJkdWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzdBUmQtZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbOCwgLTU1OCwgNjE4LCAyNjkyXSRbOCwgLTI0ODksIDYxOCwgNzYyXSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HN0FSZk9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzdBUmZlZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HN0FSZnVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI4M0U5MUYwMDYxIiBzb3VyY2U9Il9HN0FSS2VmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HN0FSR2VmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdBUmdlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0FSZy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdBUmhPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c3QVJndWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HN0FSZi1mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c3QVJnT2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzUwLCAtMTI1MywgMCwgMTg5Nl0kWzUwLCAtMjU5MCwgMCwgNTU4XSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HN0FSaGVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzdBUmh1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HN0FSaC1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTkyM0IwMDAyIiBzb3VyY2U9Il9HNjJnRXVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HNjJmOHVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdBUml1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0FSak9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdBUmplZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c3QVJpLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HN0FSaU9mWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzdBUmllZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbOTE0LCAtNTU4LCAtNDA2NCwgMjM4N10kWzMyMDAsIC0xOTEzLCAtMTc3OCwgMTAzMl0iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzdBUmp1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c3QVJqLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzdBUmtPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDMwMyIgc291cmNlPSJfRzYyZ0V1ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzYyZ0F1ZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3QVJrLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdBUmxlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3QVJsdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HN0FSbE9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzdBUmtlZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HN0FSa3VmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMTEwMCwgLTU1MCwgMzQyMCwgMjg1M10kWy0xMTAwLCAtMjgxOSwgMzQyMCwgNTg0XSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HN0tCOE9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzdLQjhlZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HN0tDQXVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI5NEVDQzEwMzFFIiBzb3VyY2U9Il9HN0FSR2VmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HN0tCOHVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdLQ0JlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0tDQi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdLQ0NPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c3S0NCdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HN0tDQS1mWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzdLQ0JPZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbNjk0LCAtNTY3LCAtMjA5OSwgMTY2N10kWzE4MDMsIC0xNDU2LCAtOTkwLCA3NzhdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c3S0NDZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HN0tDQ3VmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c3S0NDLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjk0RUMyQjAxQ0EiIHNvdXJjZT0iX0c3S0I4dWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c3QVJBT2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0tDRHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3S0NFT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0tDRWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzdLQ0QtZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c3S0NET2ZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iMTI2MzIyNTYiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzdLQ0RlZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbOTU2LCAtNzg3LCAtMTc4NiwgMTQ0N10kWzIwNzQsIC0xNzAxLCAtNjY4LCA1MzNdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c3S0NFdWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HN0tDRS1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c3S0NKT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MkIxRUMxQjAzNDkiIHNvdXJjZT0iX0c3S0NGT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c2MmY4dWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0tDSi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3S0NLZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0tDS3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzdLQ0tPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c3S0NKZWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HN0tDSnVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlswLCAtNTY3LCAwLCAyMzc5XSRbMCwgLTE5MTMsIDAsIDEwMzJdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c3S0NLLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HN0tDTE9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c3S0NMZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjhDRDMyMzAxOUEiIHNvdXJjZT0iX0c2MmY4dWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c3QVJLZWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0tDTU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3S0NNdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0tDTS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzdLQ01lZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c3S0NMdWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HN0tDTC1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMjQ5NywgLTEwNDEsIDY2OTcsIDI3NjhdJFstNjE0NiwgLTI1NTYsIDMwNDgsIDEyNTNdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c3S0NOT2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HN0tDTmVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c3S0NOdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyOEYiIHNvdXJjZT0iX0c2MmdBdWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c3QVJLZWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0tDT2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3S0NPLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0tDUE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzdLQ091ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c3S0NOLWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzdLQ09PZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTEyNywgLTU5MiwgLTQzMSwgMjc2MF0kWy0xMjcsIC0yMDk5LCAtNDMxLCAxMjUzXSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HN0tDUGVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzdLQ1B1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HN0tDUC1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwM0Q2IiBzb3VyY2U9Il9HNjJnSXVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HNjJnQXVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdLQ1F1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0tDUk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdLQ1JlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c3S0NRLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HN0tDUU9mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c3S0NRZWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzEzNSwgLTgxMiwgLTE4OTYsIDI4NDRdJFsxMzUsIC0zMDY0LCAtMTg5NiwgNTkyXSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HN0tDUnVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzdLQ1ItZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HN0tDU09mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDNFIiBzb3VyY2U9Il9HNjJnUXVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HN0FSS2VmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdLQ1MtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0tDVGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdLQ1R1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c3S0NUT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HN0tDU2VmWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzdLQ1N1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTI2LCAtNDc3LCAtNTEwNiwgNjQwMl0kWy0yNiwgLTMzNjEsIC01MTA2LCAzNTE4XSRbMzU0NiwgLTU4MjEsIC0xNTM0LCAxMDU4XSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HN0tDVC1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzdLQ1VPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HN0tDVWVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTYwIiBzb3VyY2U9Il9HNjJnTXVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HNjJnQXVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdLQ1ZPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0tDVnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdLQ1YtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c3S0NWZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HN0tDVXVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c3S0NVLWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzY3LCAtNTUwLCAxNjkzLCAyODUzXSRbNjcsIC0yODE5LCAxNjkzLCA1ODRdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c3S0NXT2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HN0tDV2VmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgIDwvY29udGVudHM+Ci0gICAgICAgICAgICA8Y29udGVudHMgeG1pOnR5cGU9Im5vdGF0aW9uOkRpYWdyYW0iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyODNFOEM4MDA1NiIgdHlwZT0iQ2xhc3MiIG5hbWU9IlByb2Nlc3NFbGVtZW50Ij4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3S0NXdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwRUYiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0tDWGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HN0tDWHVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMzQwMyIgaGVpZ2h0PSI5MDUiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0tDWC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3S0NZT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdLQ1llZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3S0NZdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzdLQ1ktZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3S0NaT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzdLQ1plZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3S0NadWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzdLQ1otZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3VEw0T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3VEw0ZWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c3S0NXLWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzdLQ1hPZlhFZHVxSG9PSmJVUlpSdyIgeD0iODY2MSIgeT0iNzE3MSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdUTDR1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI4MCI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3VEw1ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c3VEw1dWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIyODI3IiBoZWlnaHQ9IjEwMzIiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN1RMNS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3VEw2T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdUTDZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3VEw2dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzdUTDYtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3VEw3T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzdUTDdlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3VEw3dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzdUTDctZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3VEw4T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3VEw4ZWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c3VEw0LWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjEyNjMyMjU2IiBzaG93UGFyZW50PSJOYW1lIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c3VEw1T2ZYRWR1cUhvT0piVVJaUnciIHg9Ijg4OTgiIHk9IjQ0OCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdUTDh1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyODNFOEExMDM0MSI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3VEw5ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c3VEw5dWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIzMDE0IiBoZWlnaHQ9IjkwNSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3VEw5LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdUTC1PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN1RMLWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdUTC11ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN1RMLS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdUTF9PZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN1RMX2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdUTF91ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN1RMXy1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdUTUFPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzdUTUFlZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzdUTDgtZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HN1RMOU9mWEVkdXFIb09KYlVSWlJ3IiB4PSI4ODA1IiB5PSI1MjQwIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN1RNQy1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERTRBOTcwMTIzIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdUTUR1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzdUTUQtZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjMzODYiIGhlaWdodD0iMTAzMiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3VE1FT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdUTUVlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN1RNRXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdUTUUtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN1RNRk9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdUTUZlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN1RNRnVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdUTUYtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN1RNR09mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdUTUdlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzdUTUd1ZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzdUTURPZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMTI2MzIyNTYiIHNob3dQYXJlbnQ9Ik5hbWUiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzdUTURlZlhFZHVxSG9PSmJVUlpSdyIgeD0iNzk1IiB5PSIyOTg4Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN1RNSk9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI5NEVCOTAwMEZDIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdUTUotZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzdUTUtPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjM1ODkiIGhlaWdodD0iOTkwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdUTUtlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN1RNS3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3VE1LLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN1RNTE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3VE1MZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN1RNTHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3VE1MLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN1RNTU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3VE1NZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN1RNTXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN1RNTS1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HN1RNSmVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIxMjYzMjI1NiIgc2hvd1BhcmVudD0iTmFtZSIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HN1RNSnVmWEVkdXFIb09KYlVSWlJ3IiB4PSI4NTY4IiB5PSIyOTYzIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTERpYWdyYW1TdHlsZSIgeG1pOmlkPSJfR2xpLVUtZlhFZHVxSG9PSmJVUlpSdyIgZGVzY3JpcHRpb249IlRoaXMgZGlhZ3JhbSBzaG93cyB0aGUgZ2VuZXJhbCBkZWZpbml0aW9uIG9mIFByb2Nlc3MgRWxlbWVudC4gIFByb2Nlc3MgRWxlbWVudCBpcyBkZXJyaXZlZCBmcm9tIE1ldGhvZCBFbGVtZW50IGRlZmluZSBpbiBDb3JlIE1ldGhvZCBDb250ZW50LiAgSnVzdCBsaWtlIHRoZSBDb250ZW50IERlc2NyaXB0aW9uIGZvciBtZXRob2QgY29udGVudCBQcm9jZXNzIEVsZW1lbnQgY29udGFpbnMgYSBDb250ZW50IERlc2NyaXB0aW9uIHRoYXQgY2FuIGNvbXByb3NlIG9mIGEgbnVtYmVyIG9mIGF0dHJpYnV0ZXMgY29udGFpbmluZyB0ZXh0dWFsIGRlc2NycHRpb25zIGZvciB0aGUgUHJvY2VzcyBFbGVtZW50LiIvPgotICAgICAgICAgICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HN1RNQXVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI4M0U5MUYwMDYxIiBzb3VyY2U9Il9HN0tDV3VmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HN1RMOHVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdUTUJlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN1RNQi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdUTUNPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c3VE1CdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HN1RNQS1mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c3VE1CT2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy01MCwgLTQ1NywgMCwgMTQ3M10kWy01MCwgLTE0ODEsIDAsIDQ0OF0iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzdUTUNlZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c3VE1DdWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzdUTUctZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMDA1ODNCMDFFNiIgc291cmNlPSJfRzdUTUMtZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzdUTDR1ZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3VE1IdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdUTUlPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3VE1JZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HN1RNSC1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzdUTUhPZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSIxMjYzMjI1NiIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HN1RNSGVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlswLCAtNTI0LCAtNzgyMywgMjAxNV0kWzAsIC0xNDM5LCAtNzgyMywgMTEwMF0kWzY0MDAsIC0yMzQ1LCAtMTQyMiwgMTk0XSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HN1RNSXVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzdUTUktZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HN1RNTk9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI5NEVDNjAwMkJEIiBzb3VyY2U9Il9HN1RNQy1mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HN1RNSk9mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdUTU4tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN1RNT2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdUTU91ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c3VE1PT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN1RNTy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI5NEVDNjAwMkJGIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN1RNUGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HN1RNUE9mWEVkdXFIb09KYlVSWlJ3IiB4PSItMTMiIHk9IjI2MiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3VE1QdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI5NEVDNjAwMkJGIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN1RNUU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzdUTVAtZlhFZHVxSG9PSmJVUlpSdyIgeD0iNzA2IiB5PSItMjg5Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdUTVFlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI5NEVDNjAwMkJFIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN1RNUS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c3VE1RdWZYRWR1cUhvT0piVVJaUnciIHg9IjQwIiB5PSIyODciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN1RNUk9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyOTRFQzYwMDJCRSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdUTVJ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzdUTVJlZlhFZHVxSG9PSmJVUlpSdyIgeD0iMjA5IiB5PSItMzQ4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdUTVItZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyOTRFQzYwMDJCRiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdUTVNlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzdUTVN1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzdUTVNPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3VE1TLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyOTRFQzYwMDJCRSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdUTVRlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzdUTVR1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzdUTVRPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3VE1ULWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI5NEVDNjAwMkJGIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN1RNVWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN1RNVXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HN1RNVU9mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdUTVUtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyOTRFQzYwMDJCRSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdUTVZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN1RNVnVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HN1RNVk9mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzdUTU5lZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMTI2MzIyNTYiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzdUTU51ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMTY5MywgLTI1LCAtNjE4MCwgMjVdJFs2MDc5LCAtMjUsIC0xNzk0LCAyNV0iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c3VE1WLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjk0RUMyQjAxQ0EiIHNvdXJjZT0iX0c3VE1KT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c3VEw0dWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN1RNV3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3VE1YT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN1RNWGVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzdUTVctZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c3VE1XT2ZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjEyNjMyMjU2IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c3VE1XZWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy01MCwgLTQ5MSwgMCwgMTk5OF0kWy01MCwgLTE5NzIsIDAsIDUxNl0iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzdUTVh1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c3VE1YLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzdUTVlPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyOTRFQ0MxMDMxRSIgc291cmNlPSJfRzdUTDh1ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzdUTUpPZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3VE1ZLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdUTVplZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3VE1adWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HN1RNWk9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzdUTVllZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HN1RNWXVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9Ils4LCAtNDQ4LCAtNDIsIDE3ODZdJFs4LCAtMTc1MiwgLTQyLCA0ODJdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c3VE1aLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HN1RNYU9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgIDwvY29udGVudHM+Ci0gICAgICAgICAgICA8Y29udGVudHMgeG1pOnR5cGU9Im5vdGF0aW9uOkRpYWdyYW0iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyMzc1RUExMDI4NSIgdHlwZT0iQ2xhc3MiIG5hbWU9IlNlbGVjdGVkVGFza1N0ZXBzIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3Yzg0T2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURFNTM1MTAwMTMiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN2M4NC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HN2M4NU9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMzk3OSIgaGVpZ2h0PSIxMDQ5Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdjODVlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN2M4NXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3Yzg1LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN2M4Nk9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3Yzg2ZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN2M4NnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3Yzg2LWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN2M4N09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3Yzg3ZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN2M4N3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN2M4Ny1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HN2M4NGVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c3Yzg0dWZYRWR1cUhvT0piVVJaUnciIHg9Ijc2MDgiIHk9IjUzODkiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3Yzg4T2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjc5N0Y3NDAzOTIiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN2M4OC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HN2M4OU9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMzk3OSIgaGVpZ2h0PSIxMDMyIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdjODllZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN2M4OXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3Yzg5LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN2M4LU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3YzgtZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN2M4LXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3YzgtLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN2M4X09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3YzhfZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN2M4X3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN2M4Xy1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HN2M4OGVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c3Yzg4dWZYRWR1cUhvT0piVVJaUnciIHg9Ijc1MDkiIHk9IjM2NDkiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3YzlDZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyOUUiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN2M5RE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HN2M5RGVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMzY5MSIgaGVpZ2h0PSIxMDMyIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdjOUR1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN2M5RC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3YzlFT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN2M5RWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3YzlFdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN2M5RS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3YzlGT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN2M5RmVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3YzlGdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN2M5Ri1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN2M5R09mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HN2M5Q3VmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c3YzlDLWZYRWR1cUhvT0piVVJaUnciIHg9IjI1MzYiIHk9Ijc2MDgiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3YzlHZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjc5NEE2NjAzNjgiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN2M5SE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HN2M5SGVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMzY5MSIgaGVpZ2h0PSIxMDMyIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdjOUh1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN2M5SC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3YzlJT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN2M5SWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3YzlJdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN2M5SS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3YzlKT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN2M5SmVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3YzlKdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN2M5Si1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN2M5S09mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HN2M5R3VmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c3YzlHLWZYRWR1cUhvT0piVVJaUnciIHg9IjEzNTQ2IiB5PSI3NTYwIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN210LXVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjZDIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdtdF9lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzdtdF91ZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjI4NzgiIGhlaWdodD0iMTAzMiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3bXRfLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdtdUFPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN211QWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdtdUF1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN211QS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdtdUJPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN211QmVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdtdUJ1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN211Qi1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdtdUNPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzdtdUNlZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzdtdC0tZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HN210X09mWEVkdXFIb09KYlVSWlJ3IiB4PSIxNDA1IiB5PSIzOTUzIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN211RS1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDA5Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdtdUZ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzdtdUYtZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjI3MjYiIGhlaWdodD0iMTAzMiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3bXVHT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdtdUdlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN211R3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdtdUctZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN211SE9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdtdUhlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN211SHVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdtdUgtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN211SU9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdtdUllZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzdtdUl1ZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzdtdUZPZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HN211RmVmWEVkdXFIb09KYlVSWlJ3IiB4PSIyMDI4OCIgeT0iMTI2OCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdtdUktZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMUU0Q0YzMDFBRSI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3bXVKdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c3bXVKLWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIyNzk0IiBoZWlnaHQ9IjEwNDkiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN211S09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3bXVLZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdtdUt1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3bXVLLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzdtdUxPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3bXVMZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzdtdUx1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3bXVMLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzdtdU1PZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3bXVNZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3bXVNdWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c3bXVKT2ZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzdtdUplZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTM5NDQiIHk9IjEzNTQiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3bXVYLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURFNEE5NzAxMjMiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN211WXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HN211WS1mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMzQwMyIgaGVpZ2h0PSIxMDQ5Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdtdVpPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN211WmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3bXVadWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN211Wi1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3bXVhT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN211YWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3bXVhdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN211YS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3bXViT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN211YmVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN211YnVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HN211WU9mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c3bXVZZWZYRWR1cUhvT0piVVJaUnciIHg9Ijc3OTciIHk9IjEzNTQiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3djMyT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjk0RUI5MDAwRkMiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN3YzMi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HN3YzM09mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMzU4OSIgaGVpZ2h0PSI5OTAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN3YzM2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3djMzdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzd2MzMtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3djM0T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzd2MzRlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3djM0dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzd2MzQtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3djM1T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzd2MzVlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3djM1dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3djM1LWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c3djMyZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzd2MzJ1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTEwMCIgeT0iMTM4OCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxEaWFncmFtU3R5bGUiIHhtaTppZD0iX0dsaS1WZWZYRWR1cUhvT0piVVJaUnciIGRlc2NyaXB0aW9uPSJBIGtleSBkaWZmZXJlbmNlIGJldHdlZW4gTWV0aG9kIENvbnRlbnQgYW5kIFByb2Nlc3MgaXMgdGhhdCBhIENvbnRlbnQgRWxlbWVudCBzdWNoIGFzIFRhc2sgZGVzY3JpYmVzIGFsbCBhc3BlY3RzIG9mIGRvaW5nIHdvcmsgZGVmaW5lZCBhcm91bmQgdGhpcyBUYXNrLiAgVGhpcyBkZXNjcmlwdGlvbiBpcyBtYW5hZ2VkIGluIHN0ZXBzLCB3aGljaCBhcmUgbW9kZWxlZCBhcyBTZWN0aW9ucyBvZiB0aGUgVGFza3MnIENvbnRlbnQgRGVzY3JpcHRpb25zLiAgV2hlbiBhcHBseWluZyBhIFRhc2sgaW4gYSBQcm9jZXNzJyBBY3Rpdml0eSB3aXRoIGEgVGFzayBEZXNjcmlwdG9yIGEgUHJvY2VzcyBFbmdpbmVlciBuZWVkcyB0byBpbmRpY2F0ZSB0aGF0IGF0IHRoYXQgcGFydGljdWxhciBwb2ludCBpbiB0aW1lIGluIHRoZSBQcm9jZXNzIGRlZmluaXRpb24gZm9yIHdoaWNoIHRoZSBUYXNrIERlc2NyaXB0b3IgaGFzIGJlZW4gY3JlYXRlZCwgb25seSBhIHN1YnNldCBvZiBzdGVwcyBzaGFsbCBiZSBwZXJmb3JtZWQuICBIZSBkZWZpbmVzIHRoaXMgc2VsZWN0aW9uIHVzaW5nIHRoZSBzZWxlY3RlZFN0ZXBzIGFzc29jaWF0aW9uIGRlcGljdGVkIGluIHRoZSBkaWFncmFtLiAgSWYgaGUgd2FudHMgdG8gYWRkIHN0ZXBzIHRvIGEgVGFzayBEZXNjcmlwdG9yLCBoZSBjYW4gZGVzY3JpYmUgdGhlc2UgZWl0aGVyIHByYWdtYXRpY2FsbHkgaW4gdGhlIHJlZmluZWREZXNjcmlwdGlvbiBhdHRyaWJ1dGUgb3IgJ3Byb3Blcmx5JyBjcmVhdGUgYSBjb250cmlidXRpbmcgVGFzayB0byB0aGUgVGFzayB0aGUgVGFzayBEZXNjcmlwdG9yIHJlZmVycyB0byAoc2VlIENvbnRyaWJ1dGlvbiBpbiBwYWNrYWdlIFBsdWdpbiBmb3IgZGV0YWlscykuIi8+Ci0gICAgICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c3YzlBT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjc5ODQ5RTAwMDEiIHNvdXJjZT0iX0c3Yzg0T2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c3Yzg4T2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN2M5QS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3YzlCZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN2M5QnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzdjOUJPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c3YzlBZWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HN2M5QXVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlswLCAtNTMzLCAwLCAxNzAxXSRbMCwgLTE3MTgsIDAsIDUxNl0iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzdjOUItZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c3YzlDT2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzdjOUtlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyNzk2MkQzMDAzRiIgc291cmNlPSJfRzdjOUNlZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzdjOUdlZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3YzlMT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdjOUx1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3YzlMLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HN2M5TGVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdjOU1PZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjc5NjJENDAyMEUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3bXQ0T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c3YzlNZWZYRWR1cUhvT0piVVJaUnciIHk9IjM5NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3bXQ0ZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyNzk2MkQ0MDIwRSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdtdDQtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c3bXQ0dWZYRWR1cUhvT0piVVJaUnciIHg9Ii00NDYiIHk9Ii0zNDciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN210NU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjc5NjJENDAyMDMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3bXQ1dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzdtdDVlZlhFZHVxSG9PSmJVUlpSdyIgeD0iODEzIiB5PSIyOTYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN210NS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3OTYyRDQwMjAzIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN210NmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HN210Nk9mWEVkdXFIb09KYlVSWlJ3IiB4PSI0MjMiIHk9Ii0zNDciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN210NnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3OTYyRDQwMjBFIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN210N09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN210N2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HN210Ni1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdtdDd1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3OTYyRDQwMjAzIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN210OE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN210OGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HN210Ny1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdtdDh1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjc5NjJENDAyMEUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3bXQ5T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3bXQ5ZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c3bXQ4LWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN210OXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3OTYyRDQwMjAzIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN210LU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3bXQtZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c3bXQ5LWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HN2M5S3VmWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzdjOUstZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMTg0NSwgMCwgLTEwNzAxLCAwXSRbMTA2OTMsIDAsIC0xODU0LCAwXSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzdtdUN1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDMyRiIgc291cmNlPSJfRzdjOUNlZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzdtdC11ZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3bXVEZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdtdUQtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3bXVFT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HN211RHVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzdtdUMtZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c3bXVET2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzAsIC01MjQsIDAsIDMwODFdJFswLCAtMzA5MCwgMCwgNTE2XSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HN211RWVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzdtdUV1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HN211TS1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3OTgzMEUwMTUwIiBzb3VyY2U9Il9HN2M5R2VmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HN211SS1mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdtdU51ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN211T09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdtdU9lZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c3bXVOLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HN211Tk9mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c3bXVOZWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy01MCwgLTUxNiwgMCwgNTY4MV0kWy01MCwgLTU2NzIsIDAsIDUyNF0iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzdtdU91ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c3bXVPLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzdtdVBPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMzc1RTA0MDM5MCIgc291cmNlPSJfRzdtdUUtZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzdtdUktZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3bXVQLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdtdVFlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3bXVRdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HN211UU9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdtdVEtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMzc1RTA1MDE3NSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdtdVJlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzdtdVJPZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTYzIiB5PSI5NCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3bXVSdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMzc1RTA1MDE3NSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdtdVNPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c3bXVSLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0zOTciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN211U2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjM3NUUwNTAxNzMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3bXVTLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzdtdVN1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTIiIHk9IjEzNiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3bXVUT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjM3NUUwNTAxNzMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3bXVUdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c3bXVUZWZYRWR1cUhvT0piVVJaUnciIHg9Ii03MzIiIHk9Ii0zMDIiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN211VC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIzNzVFMDUwMTc1Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN211VWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN211VXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HN211VU9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdtdVUtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIzNzVFMDUwMTczIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN211VmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN211VnVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HN211Vk9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdtdVYtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjM3NUUwNTAxNzUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3bXVXZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3bXVXdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c3bXVXT2ZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN211Vy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIzNzVFMDUwMTczIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN211WGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3bXVYdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c3bXVYT2ZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HN211UGVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c3bXVQdWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0xMzYzLCAtNzYsIDQ4ODUsIDI1XSRbLTQ4NTEsIC03NiwgMTM5NywgMjVdIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HN211ZU9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRTREQUMwMUEwIiBzb3VyY2U9Il9HN211WC1mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HN211SS1mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdtdWUtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN211ZmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdtdWZ1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c3bXVmT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN211Zi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRTREQUQwMDU3Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN211Z2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HN211Z09mWEVkdXFIb09KYlVSWlJ3IiB4PSI0NzkiIHk9Ii0xNzciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN211Z3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjFFNERBRDAwNTciPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3bXVoT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HN211Zy1mWEVkdXFIb09KYlVSWlJ3IiB4PSItMTMxIiB5PSIzNTYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN211aGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjFFNERBRDAwNEQiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3bXVoLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzdtdWh1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTc5IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdtdWlPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMUU0REFEMDA0RCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdtdWl1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzdtdWllZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTYyMSIgeT0iMjQ2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdtdWktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMUU0REFEMDA1NyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdtdWplZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzdtdWp1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzdtdWpPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3bXVqLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMUU0REFEMDA0RCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdtdWtlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzdtdWt1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzdtdWtPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3djMwT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRTREQUQwMDU3Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN3YzMHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN3YzMC1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HN3YzMGVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzd2MzFPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMUU0REFEMDA0RCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzd2MzF1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN3YzMS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HN3YzMWVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzdtdWVlZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HN211ZXVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlsxNzAxLCAyNSwgLTQxNDAsIDI1XSRbNDQ0NSwgMjUsIC0xMzk3LCAyNV0iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c3djM2T2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjk0RUM0QTAzMDYiIHNvdXJjZT0iX0c3bXQtdWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c3djMyT2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN3YzNi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3djM3ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN3YzN3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzd2MzdPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c3djM2ZWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzd2MzZ1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMCwgLTUxNiwgLTUwLCAyMDc0XSRbMCwgLTIxMDgsIC01MCwgNDgyXSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HN3YzNy1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzd2MzhPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HN3YzOGVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI5NEVDNjAwMkJEIiBzb3VyY2U9Il9HN211WC1mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HN3YzMk9mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzd2MzlPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN3YzOXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzd2MzktZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c3djM5ZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN3YzLU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI5NEVDNjAwMkJGIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN3YzLXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HN3YzLWVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxNTIiIHk9IjE1MiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3djMtLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI5NEVDNjAwMkJGIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN3YzX2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzd2M19PZlhFZHVxSG9PSmJVUlpSdyIgeD0iNzg3IiB5PSItMjEyIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzd2M191ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI5NEVDNjAwMkJFIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN3Y0QU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c3djNfLWZYRWR1cUhvT0piVVJaUnciIHg9Ii0xOTkiIHk9IjI0MCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3djRBZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI5NEVDNjAwMkJFIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN3Y0QS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HN3Y0QXVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxNDMiIHk9IjM0NyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3djRCT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjk0RUM2MDAyQkYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3djRCdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3djRCLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c3djRCZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN3Y0Q09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjk0RUM2MDAyQkUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3djRDdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3djRDLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c3djRDZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN3Y0RE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyOTRFQzYwMDJCRiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzd2NER1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzd2NEQtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzd2NERlZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3djRFT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjk0RUM2MDAyQkUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3djRFdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzd2NEUtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzd2NEVlZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c3djM4dWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HN3YzOC1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMTcxMCwgMCwgNDg5MywgMF0kWy00ODA5LCAwLCAxNzk0LCAwXSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgPC9jb250ZW50cz4KLSAgICAgICAgICAgIDxjb250ZW50cyB4bWk6dHlwZT0ibm90YXRpb246RGlhZ3JhbSIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDJEMzEyRjIwMzU4IiB0eXBlPSJDbGFzcyIgbmFtZT0iRGVzY3JpcHRvciI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN3Y0Rk9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMEU2Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzd2NEYtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzd2NEdPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjIwNjUiIGhlaWdodD0iOTA1Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzd2NEdlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN3Y0R3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3djRHLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN3Y0SE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3djRIZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN3Y0SHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3djRILWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN3Y0SU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3djRJZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN3Y0SXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN3Y0SS1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HN3Y0RmVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c3djRGdWZYRWR1cUhvT0piVVJaUnciIHg9IjkwMjUiIHk9IjQ4ODUiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3djRKT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwMDkiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN3Y0Si1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HN3Y0S09mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMjcyNiIgaGVpZ2h0PSI5MDUiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN3Y0S2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3djRLdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzd2NEstZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3djRMT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzd2NExlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3djRMdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzd2NEwtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3djRNT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzd2NE1lZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3djRNdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3djRNLWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c3djRKZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzd2NEp1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iNTM5NyIgeT0iNzM5OSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzd2NFBlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDA0NSI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3djRRT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c3djRRZWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSI0MDEzIiBoZWlnaHQ9IjkwNSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3djRRdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzd2NFEtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN3Y0Uk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzd2NFJlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN3Y0UnVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzc1bzBPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNzVvMGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzc1bzB1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNzVvMC1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzc1bzFPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzc1bzFlZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzd2NFB1ZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HN3Y0UC1mWEVkdXFIb09KYlVSWlJ3IiB4PSIxMjAzNSIgeT0iNzM0NyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzc1bzF1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDA4QiI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3NW8yZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c3NW8ydWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIyNjc1IiBoZWlnaHQ9IjkwNSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3NW8yLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzc1bzNPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNzVvM2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzc1bzN1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNzVvMy1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzc1bzRPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNzVvNGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzc1bzR1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNzVvNC1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzc1bzVPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzc1bzVlZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzc1bzEtZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNzVvMk9mWEVkdXFIb09KYlVSWlJ3IiB4PSI4NzIwIiB5PSI3Mzc0Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOEN5eWVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMEVGIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhDeXpPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzhDeXplZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjM0MDMiIGhlaWdodD0iOTA1Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhDeXp1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOEN5ei1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4Q3kwT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOEN5MGVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4Q3kwdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOEN5MC1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4Q3kxT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOEN5MWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4Q3kxdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOEN5MS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOEN5Mk9mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HOEN5eXVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c4Q3l5LWZYRWR1cUhvT0piVVJaUnciIHg9IjgzNTYiIHk9IjE0ODEiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4Q3k0dWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RDAzRDMiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOEN5NWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HOEN5NXVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTU3NCIgaGVpZ2h0PSI5MDUiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOEN5NS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4Q3k2T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhDeTZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4Q3k2dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzhDeTYtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4Q3k3T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzhDeTdlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4Q3k3dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzhDeTctZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4Q3k4T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4Q3k4ZWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c4Q3k0LWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzhDeTVPZlhFZHVxSG9PSmJVUlpSdyIgeD0iNjEyMSIgeT0iNDU4MCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhNajBPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E5MjU0MDIyNyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4TWowLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c4TWoxT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSI0MjY3IiBoZWlnaHQ9IjkwNSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4TWoxZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhNajF1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOE1qMS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhNajJPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOE1qMmVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhNajJ1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOE1qMi1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhNajNPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOE1qM2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhNajN1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzhNajMtZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzhNajBlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HOE1qMHVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxNDczIiB5PSIyNDQ2Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTERpYWdyYW1TdHlsZSIgeG1pOmlkPSJfR2xpLVYtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HN3Y0Tk9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzAzIiBzb3VyY2U9Il9HN3Y0Sk9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HN3Y0Rk9mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzd2NE4tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN3Y0T2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzd2NE91ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c3djRPT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HN3Y0TmVmWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzd2NE51ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbNDkxLCAtNDU3LCAtMjMwMiwgMjAzMl0kWzIyNjAsIC0yMDQwLCAtNTMzLCA0NDhdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c3djRPLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HN3Y0UE9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c3NW81dWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxNjAiIHNvdXJjZT0iX0c3NW8xdWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c3djRGT2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNzVvNmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3NW82LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNzVvN09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzc1bzZ1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c3NW81LWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HNzVvNk9mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlswLCAtNDU3LCAwLCAyMDMyXSRbMCwgLTIwNDAsIDAsIDQ0OF0iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzc1bzdlZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c3NW83dWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzhDeXdPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDNENiIgc291cmNlPSJfRzd2NFBlZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzd2NEZPZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4Q3l3LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhDeXhlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4Q3l4dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HOEN5eE9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzhDeXdlZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c4Q3l3dWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy02MjYsIC00NTcsIDI4MjcsIDIwMzJdJFstMjgxOSwgLTIwNDAsIDYzNSwgNDQ4XSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HOEN5eC1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzhDeXlPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HOEN5MmVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjhGIiBzb3VyY2U9Il9HN3Y0Rk9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HOEN5eWVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhDeTNPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOEN5M3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhDeTMtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c4Q3kzZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HOEN5MnVmWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzhDeTItZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMCwgLTQ1NywgMCwgMjk0Nl0kWzAsIC0yOTU0LCAwLCA0NDhdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c4Q3k0T2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HOEN5NGVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c4Q3k4dWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUUwRkZEMzAwRUYiIHNvdXJjZT0iX0c4Q3l5ZWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c4Q3k0dWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOEN5OWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4Q3k5LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOEN5LU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HOEN5OXVmWEVkdXFIb09KYlVSWlJ3IiB4PSItNjc3IiB5PSI3MDMiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOEN5LWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFMEZGRDMwMEYxIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOEN5LS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOEN5LXVmWEVkdXFIb09KYlVSWlJ3IiB4PSItMjUzIiB5PSItMTY5Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhDeV9PZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFMEZGRDMwMEYxIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOEN5X3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzhDeV9lZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTM5NyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4Q3lfLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRTBGRkQzMDBGMCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhDekFlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOEN6QU9mWEVkdXFIb09KYlVSWlJ3IiB4PSIzMTYiIHk9IjMwNiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4Q3pBdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFMEZGRDMwMEYwIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOEN6Qk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOEN6QS1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMzk3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhNandPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRTBGRkQzMDBGMSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhNand1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzhNanctZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzhNandlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4TWp4T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRTBGRkQzMDBGMCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhNanh1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzhNangtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzhNanhlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4TWp5T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFMEZGRDMwMEYxIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOE1qeXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOE1qeS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOE1qeWVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhNanpPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRTBGRkQzMDBGMCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhNanp1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOE1qei1mWEVkdXFIb09KYlVSWlJ3IiBjb2xsYXBzZWQ9InRydWUiLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c4TWp6ZWZYRWR1cUhvT0piVVJaUnciIHg9IjQ3NyIgeT0iLTEyNDMiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HOEN5OC1mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c4Q3k5T2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0xMTY0LCAzMTcsIDE5ODQsIC0yNzc4XSRbLTExNjQsIDMxNzUsIDE5ODQsIDgwXSRbLTIyMjIsIDMxNzUsIDkyNiwgODBdIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HOE1qNE9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTkyODIwMzkyIiBzb3VyY2U9Il9HOEN5NHVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HOE1qME9mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhNajQtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOE1qNWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhNajV1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c4TWo1T2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HOE1qNGVmWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzhNajR1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTcwMiwgLTQ1NywgMjU5OSwgMTY3Nl0kWy0yNjE2LCAtMTY4NCwgNjg1LCA0NDhdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c4TWo1LWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HOE1qNk9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c4TWo2ZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBOTIzQjAwMDIiIHNvdXJjZT0iX0c3djRKT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c4TWowT2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOE1qN09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4TWo3dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOE1qNy1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzhNajdlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c4TWo2dWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HOE1qNi1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMzQ3LCAtNDU3LCAzMzEwLCA0NDcwXSRbLTMzMjcsIC00NDc4LCAzMzAsIDQ0OF0iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzhNajhPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c4TWo4ZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzhNajh1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyOENEMzIzMDE5QSIgc291cmNlPSJfRzhNajBPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzhDeXllZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4TWo5ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhNajktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4TWotT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HOE1qOXVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzhNajgtZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c4TWo5T2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzIxMzMsIC0zMzAsIC00MzE4LCA2MzVdJFs0NzQxLCAtNzI4LCAtMTcxMCwgMjM3XSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HOE1qLWVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzhNai11ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICA8L2NvbnRlbnRzPgotICAgICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR2hoWjlPZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRkQ4NTQ2MDBEOCI+Ci0gICAgICAgICAgICA8Ym9keT4wMTwvYm9keT4KLSAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICA8cGFja2FnZU1lcmdlIHhtaTppZD0iX0R4TEd3T3hNRWR1T05yTVJnbXo0OEEiIG1lcmdlZFBhY2thZ2U9Il8zQURDN0I3NDAyMkQ0MURFNDc4RTAwMEQiLz4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVEMDNEMyIgbmFtZT0iQWN0aXZpdHkiPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HaHJLLXVmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUQwM0QzIj4KLSAgICAgICAgICAgICAgPGJvZHk+QW4gQWN0aXZpdHkgaXMgYSBXb3JrIEJyZWFrZG93biBFbGVtZW50IGFuZCBXb3JrIERlZmluaXRpb24gd2hpY2ggc3VwcG9ydHMgdGhlIG5lc3RpbmcgYW5kIGxvZ2ljYWwgZ3JvdXBpbmcgb2YgcmVsYXRlZCBCcmVha2Rvd24gRWxlbWVudHMgZm9ybWluZyBicmVha2Rvd24gc3RydWN0dXJlcy4gIEFsdGhvdWdoIEFjdGl2aXR5IGlzIGEgY29uY3JldGUgbWV0YS1jbGFzcywgb3RoZXIgY2xhc3NlcyB3aGljaCByZXByZXNlbnQgYnJlYWtkb3duIHN0cnVjdHVyZXMgZGVyaXZlIGZyb20gaXQ7IHN1Y2ggYXMgUGhhc2UsIEl0ZXJhdGlvbiwgRGVsaXZlcnkgUHJvY2Vzcywgb3IgQ2FwYWJpbGl0eSBQYXR0ZXJuLgotQWN0aXZpdHkgcmVwcmVzZW50cyBhIGdyb3VwaW5nIGVsZW1lbnQgZm9yIG90aGVyIEJyZWFrZG93biBFbGVtZW50cyBzdWNoIGFzIEFjdGl2aXRpZXMsIERlc2NyaXB0b3JzLCBNaWxlc3RvbmVzLCBldGMuICBJdCBpcyBub3QgcGVyLXNlIGEgJ2hpZ2gtbGV2ZWwnIGdyb3VwaW5nIG9mIG9ubHkgd29yayBhcyBpbiBvdGhlciBtZXRhLW1vZGVscywgYnV0IGdyb3VwcyBhbnkga2luZCBvZiBCcmVha2Rvd24gRWxlbWVudHMuICBGb3IgZXhhbXBsZSwgb25lIGNhbiBkZWZpbmUgdmFsaWQgQWN0aXZpdGllcyB0aGF0IGdyb3VwIG9ubHkgV29yayBQcm9kdWN0cyBEZXNjcmlwdG9ycyB3aXRob3V0IGFueSBtYXRjaGluZyBUYXNrIERlc2NyaXB0b3JzLiAgQWN0aXZpdGllcyBhbHNvIGluaGVyaXQgYWxsIHByb3BlcnRpZXMgZnJvbSBXb3JrIEJyZWFrZG93biBFbGVtZW50IGFuZCBpbmRpcmVjdGx5IGZyb20gUHJvY2VzcyBFbGVtZW50OyBpLmUuIEFjdGl2aXR5IGlzIHJlYWR5IHRvIGhhdmUgYSBmdWxsIGNvbnRlbnQgZGVzY3JpcHRpb24gYXR0YWNoZWQgdG8gaXQuCi08L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MjdBOTI4MjAzOTIiIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0MjdBOTI1NDAyMjciLz4KLSAgICAgICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MjhDRDMyOTAxRkQiIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0MjdBODJEMzAxN0YiLz4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MUUwRkZEMzAwRjEiIG5hbWU9ImJyZWFrZG93bkVsZW1lbnRzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwRUYiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDFFMEZGRDMwMEVGIj4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR21TbFAtZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR21TbFB1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDAzMSIgbmFtZT0iTWlsZXN0b25lIj4KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR2gwVTVPZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDAzMSI+Ci0gICAgICAgICAgICAgIDxib2R5PkEgTWlsZXN0b25lIGRlc2NyaWJlcyBhIHNpZ25pZmljYW50IGV2ZW50IGluIGEgZGV2ZWxvcG1lbnQgcHJvamVjdCwgc3VjaCBhcyBhIG1ham9yIGRlY2lzaW9uLCBjb21wbGV0aW9uIG9mIGEgZGVsaXZlcmFibGUsIG9yIG1lZXRpbmcgb2YgYSBtYWpvciBkZXBlbmRlbmN5IChsaWtlIGNvbXBsZXRpb24gb2YgYSBwcm9qZWN0IHBoYXNlKS4gIEJlY2F1c2UsIE1pbGVzdG9uZSBpcyBjb21tb25seSB1c2VkIHRvIHJlZmVyIHRvIGJvdGggdGhlIGV2ZW50IGl0c2VsZiBhbmQgdGhlIHBvaW50IGluIHRpbWUgYXQgd2hpY2ggdGhlIGV2ZW50IGlzIHNjaGVkdWxlZCB0byBoYXBwZW4sIGl0IGlzIG1vZGVsZWQgYXMgYSBCcmVha2Rvd24gRWxlbWVudCAoaS5lLiBpdCBhcHBlYXJzIGFzIHBhcnQgb2YgYSBicmVha2Rvd24gc3RydWN0dXJlKS48L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MkIxRUMxQjAzNDkiIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0MjdBOTI1NDAyMjciLz4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVEMDNDQiIgbmFtZT0iSXRlcmF0aW9uIj4KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR2gwVTZPZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVEMDNDQiI+Ci0gICAgICAgICAgICAgIDxib2R5Pkl0ZXJhdGlvbiBpcyBhIHNwZWNpYWwgQWN0aXZpdHksIHdoaWNoIHByZXNjcmliZXMgcHJlLWRlZmluZWQgdmFsdWVzIGZvciBpdHMgaW5zdGFuY2VzIGZvciB0aGUgYXR0cmlidXRlcyBwcmVmaXggKCdJdGVyYXRpb24nKSBhbmQgaXNSZXBlYXRhYmxlICgnVHJ1ZScpLiAgSXQgaGFzIGJlZW4gaW5jbHVkZWQgaW50byB0aGUgbWV0YS1tb2RlbCBmb3IgY29udmVuaWVuY2UgYW5kIHRvIHByb3ZpZGUgYSBzcGVjaWFsIHN0ZXJlb3R5cGUsIGJlY2F1c2UgaXQgcmVwcmVzZW50cyBhIHZlcnkgY29tbW9ubHkgdXNlZCBBY3Rpdml0eSB0eXBlLgotSXRlcmF0aW9uIGdyb3VwcyBhIHNldCBvZiBuZXN0ZWQgQWN0aXZpdGllcyB0aGF0IGFyZSByZXBlYXRlZCBtb3JlIHRoYW4gb25jZS4gIEl0IHJlcHJlc2VudHMgYW4gaW1wb3J0YW50IHN0cnVjdHVyaW5nIGVsZW1lbnQgdG8gb3JnYW5pemUgd29yayBpbiByZXBldGl0aXZlIGN5Y2xlcy4gIFRoZSBjb25jZXB0IG9mIEl0ZXJhdGlvbiBjYW4gYmUgYXNzb2NpYXRlZCB3aXRoIGRpZmZlcmVudCBydWxlcyBpbiBkaWZmZXJlbnQgbWV0aG9kcy4gIEZvciBleGFtcGxlLCB0aGUgSUJNIFJhdGlvbmFsIFVuaWZpZWQgUHJvY2VzcyBtZXRob2QgZnJhbWV3b3JrIChSVVApIGRlZmluZXMgYSBydWxlIHRoYXQgSXRlcmF0aW9ucyBhcmUgbm90IGFsbG93ZWQgdG8gc3BhbiBhY3Jvc3MgUGhhc2VzLiAgSW4gY29udHJhc3QgSUJNIEdsb2JhbCBTZXJ2aWNlcyBNZXRob2QgKEdTTWV0aG9kKSBiYXNlZCBtZXRob2QgZnJhbWV3b3JrcyB0aGlzIHJ1bGUgZG9lcyBub3QgYXBwbHkgYW5kIEl0ZXJhdGlvbiBjYW4gYmUgZGVmaW5lZCB3aGljaCBuZXN0IFBoYXNlcy4gIFJ1bGVzIGxpa2UgdGhlc2UsIHdoaWNoIHBsYXkgYW4gaW1wb3J0YW50IHJvbGUgZm9yIGVhY2ggaW5kaXZpZHVhbCBtZXRob2QgYW5kIGFyZSB0aGVyZWZvcmUgbm90IGVuZm9yY2VkIGJ5IHRoaXMgbWV0YS1tb2RlbC4gIEluc3RlYWQsIHByb2Nlc3MgYXV0aG9ycyBhcmUgZXhwZWN0ZWQgdG8gZm9sbG93IGFuZCBjaGVjayB0aGVzZSBydWxlcyBtYW51YWxseS4gIChOb3RlOiBBbnkgQnJlYWtkb3duIEVsZW1lbnQgY2FuIGJlIHJlcGVhdGVkOyBob3dldmVyLCBJdGVyYXRpb25zIGhhcyBiZWVuIGludHJvZHVjZWQgYXMgYSBzcGVjaWFsIG1ldGEtbW9kZWwgY29uY2VwdCwgYmVjYXVzZSBvZiBpdHMgaW1wb3J0YW50IHJvbGUgZm9yIG1hbnkgbWV0aG9kcy4pCi08L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAyQTAiIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RDAzRDMiLz4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVEMDNDQSIgbmFtZT0iUGhhc2UiPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HaC1GNC1mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUQwM0NBIj4KLSAgICAgICAgICAgICAgPGJvZHk+UGhhc2UgaXMgYSBzcGVjaWFsIEFjdGl2aXR5LCB3aGljaCBwcmVzY3JpYmVzIHByZS1kZWZpbmVkIHZhbHVlcyBmb3IgaXRzIGluc3RhbmNlcyBmb3IgdGhlIGF0dHJpYnV0ZXMgcHJlZml4ICgnUGhhc2UnKSBhbmQgaXNSZXBlYXRhYmxlICgnRmFsc2UnKS4gIEl0IGhhcyBiZWVuIGluY2x1ZGVkIGludG8gdGhlIG1ldGEtbW9kZWwgZm9yIGNvbnZlbmllbmNlIGFuZCB0byBwcm92aWRlIGEgc3BlY2lhbCBzdGVyZW90eXBlLCBiZWNhdXNlIGl0IHJlcHJlc2VudHMgYSB2ZXJ5IGNvbW1vbmx5IHVzZWQgQWN0aXZpdHkgdHlwZS4KLVBoYXNlIHJlcHJlc2VudCBhIHNpZ25pZmljYW50IHBlcmlvZCBpbiBhIHByb2plY3QsIGVuZGluZyB3aXRoIG1ham9yIG1hbmFnZW1lbnQgY2hlY2twb2ludCwgbWlsZXN0b25lIG9yIHNldCBvZiBEZWxpdmVyYWJsZXMuICBJdCBpcyBpbmNsdWRlZCBpbiB0aGUgbW9kZWwgYXMgYSBwcmVkZWZpbmVkIHNwZWNpYWwgQWN0aXZpdHksIGJlY2F1c2Ugb2YgaXRzIHNpZ25pZmljYW5jZSBpbiBkZWZpbmluZyBicmVha2Rvd25zLgotPC9ib2R5PgotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMjlGIiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDBGMzZDNUQwM0QzIi8+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwNjMiIG5hbWU9IlRlYW1Qcm9maWxlIj4KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR2gtRjUtZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDA2MyI+Ci0gICAgICAgICAgICAgIDxib2R5PkEgVGVhbSBQcm9maWxlIGlzIGEgQnJlYWtkb3duIEVsZW1lbnQgdGhhdCBncm91cHMgUm9sZSBEZXNjcmlwdG9ycyBvciBSZXNvdXJjZSBEZWZpbml0aW9ucyBkZWZpbmluZyBhIG5lc3RlZCBoaWVyYXJjaHkgb2YgdGVhbXMgYW5kIHRlYW0gbWVtYmVycy4KLVdvcmsgYXNzaWdubWVudHMgYW5kIFdvcmsgUHJvZHVjdCByZXNwb25zaWJpbGl0aWVzIGNhbiBiZSBkaWZmZXJlbnQgZnJvbSBBY3Rpdml0eSB0byBBY3Rpdml0eSBpbiBhIGRldmVsb3BtZW50IHByb2plY3QuIERpZmZlcmVudCBwaGFzZXMgcmVxdWlyZSBkaWZmZXJlbnQgc3RhZmZpbmcgcHJvZmlsZXMsIGkuZS4gZGlmZmVyZW50IHNraWxscyBhbmQgcmVzb3VyY2VzIGRvaW5nIGRpZmZlcmVudCB0eXBlcyBvZiB3b3JrLiAgVGhlcmVmb3JlLCBhIHByb2Nlc3MgbmVlZHMgdG8gZGVmaW5lIHN1Y2ggZGlmZmVyZW50IHByb2ZpbGVzIGluIGEgZmxleGlibGUgbWFubmVyLiAgV2hlcmVhcyBDb3JlIE1ldGhvZCBDb250ZW50IGRlZmluZXMgc3RhbmRhcmQgcmVzcG9uc2liaWxpdGllcyBhbmQgYXNzaWdubWVudHMsIGEgcHJvY2VzcyBleHByZXNzIGJ5IGEgYnJlYWtkb3duIHN0cnVjdHVyZXMgbmVlZHMgdG8gYmUgYWJsZSByZWZpbmUgYW5kIHJlZGVmaW5lIHRoZXNlIHRocm91Z2hvdXQgaXRzIGRlZmluaXRpb24uICBSb2xlIERlc2NyaXB0b3JzLCBSZXNvdXJjZSBEZWZpbml0aW9ucywgYXMgd2VsbCBhcyBUZWFtIFByb2ZpbGVzIHByb3ZpZGUgdGhlIGRhdGEgc3RydWN0dXJlIG5lY2Vzc2FyeSB0byBhY2hpZXZlIHRoaXMgZmxleGliaWxpdHkgYW5kIHRvIHByb3ZpZGUgYSBwcm9jZXNzIHVzZXIgd2l0aCB0aGUgY2FwYWJpbGl0eSB0byBkZWZpbmUgZGlmZmVyZW50IHRlYW1zIGFuZCByb2xlIHJlbGF0aW9uc2hpcHMgZm9yIGV2ZXJ5IEFjdGl2aXR5IChpbmNsdWRpbmcgQWN0aXZpdGllcyBvbiBhbnkgbmVzdGluZy1sZXZlbCBhcyB3ZWxsIGFzIEl0ZXJhdGlvbnMgb3IgUGhhc2VzKS4KLUhlbmNlLCBpbiBhZGRpdGlvbiB0byB0aGUgd29yayBicmVha2Rvd24gYW5kIHdvcmsgcHJvZHVjdCBicmVha2Rvd24gc3RydWN0dXJlcyBkZWZpbmVkIHNvIGZhciwgVGVhbSBQcm9maWxlcyBhcmUgdXNlZCB0byBkZWZpbmUgYSB0aGlyZCB0eXBlIG9mIGJyZWFrZG93biBzdHJ1Y3R1cmU6IHRlYW0gYnJlYWtkb3duIHN0cnVjdHVyZXMuICBUaGVzZSBhcmUgY3JlYXRlZCBhcyBhbiBBY3Rpdml0eSBzcGVjaWZpYyBoaWVyYXJjaHkgb2YgVGVhbSBQcm9maWxlcyBjb21wcmlzaW5nIG9mIFJvbGUgRGVzY3JpcHRvcnMgYW5kIFJlc291cmNlIERlZmluaXRpb25zLiAgVGhlc2Ugc3RydWN0dXJlcyBjYW4gYmUgcHJlc2VudGVkIGFzIHdlbGwta25vd24gT3JnLUNoYXJ0cy4gIEp1c3QgYXMgd2l0aCBhbnkgb3RoZXIgQnJlYWtkb3duIEVsZW1lbnQgYW5kIERlc2NyaXB0b3JzLCBUZWFtIFByb2ZpbGVzIGNhbiBiZSBkZWZpbmVkIHdpdGhpbiB0aGUgc2NvcGUgb2YgYW55IEFjdGl2aXR5IGluIGEgYnJlYWtkb3duIHN0cnVjdHVyZS4gIEluIG90aGVyIHdvcmRzIGV2ZXJ5IEFjdGl2aXR5IGNhbiBkZWZpbmUgaXRzIG93biBUZWFtIFByb2ZpbGVzIGNvbnNpc3Rpbmcgb2YgQWN0aXZpdHkgc3BlY2lmaWMgUm9sZSBEZXNjcmlwdG9ycyBhbmQgUmVzb3VyY2UgRGVmaW5pdGlvbnMuICBUeXBpY2FsbHksIFRlYW0gUHJvZmlsZXMgYXJlIGRlZmluZWQgb24gdGhlIGxldmVsIG9mIEl0ZXJhdGlvbnMgb3IgUGhhc2VzIG9yIG90aGVyIGhpZ2hlci1sZXZlbCBBY3Rpdml0eS4KLTwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDAzRSIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDBFRiIvPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDA0MiIgbmFtZT0idGVhbVJvbGVzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwOEIiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDNGIj4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR2o1X2t1ZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR2o1X2tlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwNTMiIG5hbWU9InN1cGVyVGVhbSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDYzIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDA1MiI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0drRHdrLWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0drRHdrdWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDA1NSIgbmFtZT0ic3ViVGVhbSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDYzIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDA1MiI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0drRHdsdWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0drRHdsZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkVudW1lcmF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTA4MDA1NzAyNzYiIG5hbWU9IldvcmtPcmRlclR5cGUiPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HaUgyNC1mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDEwODAwNTcwMjc2Ij4KLSAgICAgICAgICAgICAgPGJvZHk+V29yayBPcmRlciByZXByZXNlbnRzIGEgcmVsYXRpb25zaGlwIGJldHdlZW4gdHdvIEJyZWFrZG93biBFbGVtZW50IGluIHdoaWNoIG9uZSBCcmVha2Rvd24gRWxlbWVudCAocmVmZXJyZWQgdG8gYXMgKEIpIGJlbG93KSBkZXBlbmRzIG9uIHRoZSBzdGFydCBvciBmaW5pc2ggb2YgYW5vdGhlciBCcmVha2Rvd24gRWxlbWVudCAocmVmZXJyZWQgdG8gYXMgKEEpIGJlbG93KSBpbiBvcmRlciB0byBiZWdpbiBvciBlbmQuIFRoaXMgZW51bWVyYXRpb24gZGVmaW5lcyB0aGUgZGlmZmVyZW50IHR5cGVzIG9mIFdvcmsgT3JkZXIgcmVsYXRpb25zaGlwcyBhdmFpbGFibGUgaW4gVU1BIGFuZCBpcyB1c2VkIHRvIHByb3ZpZGUgdmFsdWVzIGZvciBXb3JrIE9yZGVyJ3MgbGlua1R5cGUgYXR0cmlidXRlLjwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPG93bmVkTGl0ZXJhbCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTA4MTlFRDAxRUQiIG5hbWU9ImZpbmlzaFRvU3RhcnQiPgotICAgICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dpSDI1dWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTA4MTlFRDAxRUQiPgotICAgICAgICAgICAgICAgIDxib2R5PkJyZWFrZG93biBFbGVtZW50IChCKSBjYW5ub3Qgc3RhcnQgdW50aWwgQnJlYWtkb3duIEVsZW1lbnQgKEEpIGZpbmlzaGVzLiBGb3IgZXhhbXBsZSwgaWYgeW91IGhhdmUgdHdvIEJyZWFrZG93biBFbGVtZW50cywgJnF1b3Q7Q29uc3RydWN0IGZlbmNlJnF1b3Q7IGFuZCAmcXVvdDtQYWludCBmZW5jZSwmcXVvdDsgJnF1b3Q7UGFpbnQgZmVuY2UmcXVvdDsgY2FuJ3Qgc3RhcnQgdW50aWwgJnF1b3Q7Q29uc3RydWN0IGZlbmNlJnF1b3Q7IGZpbmlzaGVzLiBUaGlzIGlzIHRoZSBtb3N0IGNvbW1vbiB0eXBlIG9mIGRlcGVuZGVuY3kgYW5kIHRoZSBkZWZhdWx0IGZvciBhIG5ldyBXb3JrIE9yZGVyIGluc3RhbmNlLgotPC9ib2R5PgotICAgICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDwvb3duZWRMaXRlcmFsPgotICAgICAgICAgICAgPG93bmVkTGl0ZXJhbCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTA4MUM3MjAzQzciIG5hbWU9ImZpbmlzaFRvRmluaXNoIj4KLSAgICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HaVJBMGVmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDEwODFDNzIwM0M3Ij4KLSAgICAgICAgICAgICAgICA8Ym9keT5CcmVha2Rvd24gRWxlbWVudCAoQikgY2Fubm90IGZpbmlzaCB1bnRpbCBCcmVha2Rvd24gRWxlbWVudCAoQSkgZmluaXNoZXMuIEZvciBleGFtcGxlLCBpZiB5b3UgaGF2ZSB0d28gQnJlYWtkb3duIEVsZW1lbnRzLCAmcXVvdDtBZGQgd2lyaW5nJnF1b3Q7IGFuZCAmcXVvdDtJbnNwZWN0IGVsZWN0cmljYWwsJnF1b3Q7ICZxdW90O0luc3BlY3QgZWxlY3RyaWNhbCZxdW90OyBjYW4ndCBmaW5pc2ggdW50aWwgJnF1b3Q7QWRkIHdpcmluZyZxdW90OyBmaW5pc2hlcy4KLTwvYm9keT4KLSAgICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICA8L293bmVkTGl0ZXJhbD4KLSAgICAgICAgICAgIDxvd25lZExpdGVyYWwgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDEwODFCRTgwMjk2IiBuYW1lPSJzdGFydFRvU3RhcnQiPgotICAgICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dpUkExT2ZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTA4MUJFODAyOTYiPgotICAgICAgICAgICAgICAgIDxib2R5PkJyZWFrZG93biBFbGVtZW50IChCKSBjYW5ub3Qgc3RhcnQgdW50aWwgQnJlYWtkb3duIEVsZW1lbnQgKEEpIHN0YXJ0cy4gRm9yIGV4YW1wbGUsIGlmIHlvdSBoYXZlIHR3byBCcmVha2Rvd24gRWxlbWVudHMsICZxdW90O1BvdXIgZm91bmRhdGlvbiZxdW90OyBhbmQgJnF1b3Q7TGV2ZWwgY29uY3JldGUsJnF1b3Q7ICZxdW90O0xldmVsIGNvbmNyZXRlJnF1b3Q7IGNhbid0IGJlZ2luIHVudGlsICZxdW90O1BvdXIgZm91bmRhdGlvbiZxdW90OyBiZWdpbnMuCi08L2JvZHk+Ci0gICAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPC9vd25lZExpdGVyYWw+Ci0gICAgICAgICAgICA8b3duZWRMaXRlcmFsIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxMDgxQzUxMDEzQyIgbmFtZT0ic3RhcnRUb0ZpbmlzaCI+Ci0gICAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR2lSQTEtZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxMDgxQzUxMDEzQyI+Ci0gICAgICAgICAgICAgICAgPGJvZHk+QnJlYWtkb3duIEVsZW1lbnQgKEIpIGNhbm5vdCBmaW5pc2ggdW50aWwgQnJlYWtkb3duIEVsZW1lbnQgKEEpIHN0YXJ0cy4gVGhpcyBkZXBlbmRlbmN5IHR5cGUgY2FuIGJlIHVzZWQgZm9yIGp1c3QtaW4tdGltZSBzY2hlZHVsaW5nIHVwIHRvIGEgbWlsZXN0b25lIG9yIHRoZSBwcm9qZWN0IGZpbmlzaCBkYXRlIHRvIG1pbmltaXplIHRoZSByaXNrIG9mIGEgQnJlYWtkb3duIEVsZW1lbnQgZmluaXNoaW5nIGxhdGUgaWYgaXRzIGRlcGVuZGVudCBCcmVha2Rvd24gRWxlbWVudHMgc2xpcC4gSWYgYSByZWxhdGVkIEJyZWFrZG93biBFbGVtZW50IG5lZWRzIHRvIGZpbmlzaCBiZWZvcmUgdGhlIG1pbGVzdG9uZSBvciBwcm9qZWN0IGZpbmlzaCBkYXRlLCBidXQgaXQgZG9lc24ndCBtYXR0ZXIgZXhhY3RseSB3aGVuIGFuZCB5b3UgZG9uJ3Qgd2FudCBhIGxhdGUgZmluaXNoIHRvIGFmZmVjdCB0aGUganVzdC1pbi10aW1lIEJyZWFrZG93biBFbGVtZW50LCB5b3UgY2FuIGNyZWF0ZSBhbiBTRiBkZXBlbmRlbmN5IGJldHdlZW4gdGhlIEJyZWFrZG93biBFbGVtZW50IHlvdSB3YW50IHNjaGVkdWxlZCBqdXN0IGluIHRpbWUgKHRoZSBwcmVkZWNlc3NvcikgYW5kIGl0cyByZWxhdGVkIEJyZWFrZG93biBFbGVtZW50ICh0aGUgc3VjY2Vzc29yKS4gVGhlbiBpZiB5b3UgdXBkYXRlIHByb2dyZXNzIG9uIHRoZSBzdWNjZXNzb3IgQnJlYWtkb3duIEVsZW1lbnQsIGl0IHdvbid0IGFmZmVjdCB0aGUgc2NoZWR1bGVkIGRhdGVzIG9mIHRoZSBwcmVkZWNlc3NvciBCcmVha2Rvd24gRWxlbWVudC48L2JvZHk+Ci0gICAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPC9vd25lZExpdGVyYWw+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTA4MTg3OTAyODgiIG5hbWU9IldvcmtPcmRlciI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dpYXgwdWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTA4MTg3OTAyODgiPgotICAgICAgICAgICAgICA8Ym9keT5Xb3JrIE9yZGVyIGlzIGEgTWV0aG9kIEVsZW1lbnQgdGhhdCByZXByZXNlbnRzIGEgcmVsYXRpb25zaGlwIGJldHdlZW4gdHdvIEJyZWFrZG93biBFbGVtZW50cyBpbiB3aGljaCBvbmUgQnJlYWtkb3duIEVsZW1lbnRzIGRlcGVuZHMgb24gdGhlIHN0YXJ0IG9yIGZpbmlzaCBvZiBhbm90aGVyIEJyZWFrZG93biBFbGVtZW50cyBpbiBvcmRlciB0byBiZWdpbiBvciBlbmQuICAKLShOb3RlLCBXb3JrIE9yZGVyIGlzIG5vdCBtb2RlbGVkIGFzIGFuIEFzc29jaWF0aW9uIENsYXNzIHRvIHByb3ZpZGUgYSBzdHJhaWdodGZvcndhcmQgbWFwcGluZyAgdG8gWE1JIGFuZCBFTUYuKQotVGhlIFdvcmsgT3JkZXIgY2xhc3MgZGVmaW5lcyBwcmVkZWNlc3NvciBhbmQgc3VjY2Vzc29yIHJlbGF0aW9ucyBhbW9uZ3N0IEJyZWFrZG93biBFbGVtZW50cy4gIFRoaXMgaW5mb3JtYXRpb24gaXMgaW4gcGFydGljdWxhciBjcml0aWNhbCBmb3IgcGxhbm5pbmcgYXBwbGljYXRpb25zLiAgU2VlIG1vcmUgZGV0YWlscyBvbiBkaWZmZXJlbnQgdHlwZXMgb2YgV29yayBPcmRlciByZWxhdGlvbnNoaXBzIGF0IFdvcmsgT3JkZXIgVHlwZS4KLTwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyODNFRDZEMDA4OCIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQyODNFOEExMDM0MSIvPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxMDgxOEVFMDA5RiIgbmFtZT0ibGlua1R5cGUiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQxMDgwMDU3MDI3NiI+Ci0gICAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR2lheDF1ZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxMDgxOEVFMDA5RiI+Ci0gICAgICAgICAgICAgICAgPGJvZHk+VGhpcyBhdHRyaWJ1dGUgZXhwcmVzc2VzIHRoZSB0eXBlIG9mIHRoZSBXb3JrIE9yZGVyIHJlbGF0aW9uc2hpcCBieSBhc3NpZ25pbmcgYSB2YWx1ZSBmcm9tIHRoZSBXb3JrIE9yZGVyIFR5cGUgZW51bWVyYXRpb24uPC9ib2R5PgotICAgICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iX0dpYXgyT2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxib2R5PmZpbmlzaFRvU3RhcnQ8L2JvZHk+Ci0gICAgICAgICAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MjgwRUQzODAwQTEiIG5hbWU9InByZWQiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQyN0E5MjU0MDIyNyIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MjgwRUQzODAwQTAiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HazlJYy1mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iMSIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HazlJY3VmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iMSIvPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxMTlBNEU2MDJDMSIgbmFtZT0iUGxhbm5pbmdEYXRhIj4KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR2lheDJ1ZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxMTlBNEU2MDJDMSI+Ci0gICAgICAgICAgICAgIDxib2R5PlBsYW5uaW5nIERhdGEgaXMgYSBNZXRob2QgRWxlbWVudCB0aGF0IGFkZHMgcGxhbm5pbmcgZGF0YSB0byBCcmVha2Rvd24gRWxlbWVudHMgd2hlbiBpdCBpcyB1c2VkIGZvciBhIFByb2Nlc3MgUGxhbm5pbmcgVGVtcGxhdGUuICBGb3IgRGVsaXZlcnkgUHJvY2Vzc2VzIGFuZCBDYXBhYmlsaXR5IFBhdHRlcm5zIHRoaXMgY2xhc3MgY2FuIGVpdGhlciBub3QgYmUgaW5zdGFudGlhdGVkIG9yIHBvcHVsYXRlZCB3aXRoIGRlZmF1bHQgZGF0YS4KLVBsYW5uaW5nIERhdGEgZmFjdG9ycyBvdXQgc3BlY2lmaWMgb3B0aW9uYWwgZGF0YSBuZWVkZWQgZm9yIHJlcHJlc2VudGluZyBwbGFubmluZyB0ZW1wbGF0ZXMuICBUaGlzIGFzc29jaWF0aW9uIGFsbG93cyB0byBhY2Nlc3MgcGxhbm5pbmcgZGF0YSBpZiBpdCBpcyBzdG9yZWQgZm9yIHRoZSBCcmVha2Rvd24gRWxlbWVudC4KLShOT1RFLCBUSEUgQVRUUklCVVRFUyBGT1IgVEhJUyBDTEFTUyBBUkUgTk9UIENPTVBMRVRFLCBZRVQpCi08L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MjgzRUVGOTAwRTIiIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0MjgzRThBMTAzNDEiLz4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTE5QTU4RDAwRDkiIG5hbWU9InN0YXJ0RGF0ZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGNDQ5OEQwMTg1Ij4KLSAgICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HaWtpMC1mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDExOUE1OEQwMEQ5Ij4KLSAgICAgICAgICAgICAgICA8Ym9keT5UaGUgZGVmYXVsdCBzdGFydCBkYXRlIGZvciBhIHBsYW5lZCBUYXNrLjwvYm9keT4KLSAgICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxMTlBNTlBMDEyOSIgbmFtZT0iZmluaXNoRGF0ZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGNDQ5OEQwMTg1Ij4KLSAgICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HaWtpMXVmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDExOUE1OUEwMTI5Ij4KLSAgICAgICAgICAgICAgICA8Ym9keT5UaGUgZGVmYXVsdCBmaW5pc2ggZGF0ZSBmb3IgYSBwbGFuZWQgVGFzay48L2JvZHk+Ci0gICAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTE5QTc1QzAzREIiIG5hbWU9InJhbmsiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEE0MDA3QiI+Ci0gICAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR2lraTJlZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxMTlBNzVDMDNEQiI+Ci0gICAgICAgICAgICAgICAgPGJvZHk+VGhlIGRlZmF1bHQgcmFuayBmb3IgYSBwbGFuZWQgVGFzay48L2JvZHk+Ci0gICAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDBFRiIgbmFtZT0iQnJlYWtkb3duRWxlbWVudCIgaXNBYnN0cmFjdD0idHJ1ZSI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dpdHN3dWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwRUYiPgotICAgICAgICAgICAgICA8Ym9keT5CcmVha2Rvd24gRWxlbWVudCBpcyBhbiBhYnN0cmFjdCBnZW5lcmFsaXphdGlvbiBmb3IgYW55IHR5cGUgb2YgTWV0aG9kIEVsZW1lbnQgdGhhdCBpcyBwYXJ0IG9mIGEgYnJlYWtkb3duIHN0cnVjdHVyZS4gIEl0IGRlZmluZXMgYSBzZXQgb2YgcHJvcGVydGllcyBhdmFpbGFibGUgdG8gYWxsIG9mIGl0cyBzcGVjaWFsaXphdGlvbnMuPC9ib2R5PgotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDFFQzM5ODAwMzI0IiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDFEREU2NTgwMTU3Ii8+Ci0gICAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDI4M0U5MUYwMDYxIiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDI4M0U4QTEwMzQxIi8+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwM0I2IiBuYW1lPSJwcmVmaXgiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyI+Ci0gICAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR2l0c3gtZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDNCNiI+Ci0gICAgICAgICAgICAgICAgPGJvZHk+UHJlZml4IHJlcHJlc2VudHMgYW4gYWRkaXRpb25hbCBsYWJlbCB0aGF0IHdpbGwgYmUgcHJlc2VudGVkIGFzIGEgcHJlZml4IHRvIGFueSBCcmVha2Rvd24gRWxlbWVudCB0byBpbmRpY2F0ZSBhIHVzZXItZGVmaW5lZCBzdWItdHlwZSBmb3IgdGhlIGVsZW1lbnQuICBGb3IgZXhhbXBsZSwgaWYgdGhlIHByb2Nlc3MgZW5naW5lZXIgd291bGQgbGlrZSB0byBkaXN0aW5ndWlzaCBoaXMgQWN0aXZpdGllcyBieSAnTW9kdWxlJyAoYXMgZG9uZSBpbiB0aGUgSUJNIFJhdGlvbmFsIFN1bW1pdCBBc2NlbmRhbnQgTWV0aG9kKSwgaGUgY2FuIGRlZmluZSBhIGRpZmZlcmVudCBwcmVmaXggZm9yIGV2ZXJ5IG1vZGVsIHRvIGJlIHVzZWQgaW4gYWRkaXRpb24gdG8gbmFtaW5nIEFjdGl2aXRpZXMsIGUuZy4gJnF1b3Q7U1JBLkVzdGFibGlzaCBSZXF1aXJlbWVudHMmcXVvdDsgd2l0aCBTUkEgaW5kaWNhdGluZyB0aGF0IHRoaXMgQWN0aXZpdHkgYmVsb25ncyB0byB0aGUgJnF1b3Q7U29mdHdhcmUgUmVxdWlyZW1lbnRzIEFuYWx5c2lzJnF1b3Q7IG1vZHVsZS4gIEFub3RoZXIgY29tbW9uIGFwcGxpY2F0aW9uIGZvciBwcmVmaXggaXMgdG8gcXVhbGlmeSByb2xlcyBpbiBSb2xlIERlc2NyaXB0b3JzLiAgRm9yIGV4YW1wbGUsICZxdW90O0N1c3RvbWVyLkFyY2hpdGVjdCZxdW90OyB3b3VsZCBkZWZpbmUgYSAmcXVvdDtDdXN0b21lciZxdW90OyBwcmVmaXggZm9yIHRoZSBSb2xlIERlc2NyaXB0b3IgJnF1b3Q7QXJjaGl0ZWN0JnF1b3Q7IGV4cHJlc3NpbmcgdGhhdCB0aGlzIGlzIGFuIGFyY2hpdGVjdCBvbiB0aGUgY3VzdG9tZXIgc2lkZSBhbmQgbm90IHRoZSBkZXZlbG9wbWVudCB0ZWFtIHNpZGUuCi08L2JvZHk+Ci0gICAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9xV2U5MGV5SEVkdTUtdlZqbGZWc2ZRIiB2YWx1ZT0iMSIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9xV2U5ME95SEVkdTUtdlZqbGZWc2ZRIi8+Ci0gICAgICAgICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il9ySEVHTU95SEVkdTUtdlZqbGZWc2ZRIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIiB2YWx1ZT0iIi8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDNDQSIgbmFtZT0iaXNQbGFubmVkIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il81R2NZQU9pZUVkdVFidVk2VXdNU1FnIj4KLSAgICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HaTNkd3VmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwM0NBIj4KLSAgICAgICAgICAgICAgICA8Ym9keT5BIGtleSBhcHBsaWNhdGlvbiBmb3IgRGV2ZWxvcG1lbnQgUHJvY2Vzc2VzIGV4cHJlc3NlZCB3aXRoIEJyZWFrZG93biBzdHJ1Y3R1cmVzIGlzIHRvIGdlbmVyYXRlIGEgcHJvamVjdCBwbGFuIGZyb20gaXQuICBBIHByb2Nlc3MgYXMgZGVmaW5lZCBpbiBVTUEgKGNmLiB3aXRoIFNlY3Rpb25zIFhYIGFuZCA1LjIpIGlzIGEgbXVsdGktZGltZW5zaW9uYWwgc3RydWN0dXJlIGRlZmluaW5nIHdoYXQgd29yayBpcyBiZWluZyBwZXJmb3JtZWQgYXQgd2hhdCB0aW1lIGJ5IHdoaWNoIHJvbGVzIHVzaW5nIHdoaWNoIGlucHV0IGFuZCBwcm9kdWNpbmcgd2hhdCBvdXRwdXRzLiAgQSBwcm9qZWN0IHBsYW4gYXMgaXQgaXMgcmVwcmVzZW50ZWQgaW4gcHJvamVjdCBwbGFubmluZyB0b29scyBzdWNoIGFzIElCTSBSYXRpb25hbCBQb3J0Zm9saW8gTWFuYWdlciBvciBNaWNyb3NvZnQgUHJvamVjdCBub3JtYWxseSBkb2VzIG5vdCBuZWVkIGFsbCB0aGlzIGluZm9ybWF0aW9uIGFuZCBpcyBub3JtYWxseSBsaW1pdGVkIHRvIGp1c3QgcmVwcmVzZW50aW5nIGEgc3Vic2V0LiAgRm9yIGV4YW1wbGUsIGEgdHlwaWNhbCBNUyBQcm9qZWN0IHBsYW4gb25seSByZXByZXNlbnRzIHRoZSB3b3JrIGJyZWFrZG93biBjb25zaXN0aW5nIG9mIFRhc2tzIGFuZCBBY3Rpdml0aWVzIChzb21ldGltZXMgcmVmZXJyZWQgdG8gYXMgc3VtbWFyeSB0YXNrcykuICBJdCBkb2VzIG5vdCBzaG93IHRoZSBpbnB1dCBhbmQgb3V0cHV0IFdvcmsgUHJvZHVjdHMgZm9yIGEgVGFzaywgYnV0IGl0IGNhbiBzaG93IHdoaWNoIHJvbGVzIHNoYWxsIGJlIHN0YWZmZWQgZm9yIHBlcmZvcm1pbmcgdGhlIFRhc2suICBIb3dldmVyLCBzdWNoIHJvbGUgYWxsb2NhdGlvbiBuZWVkIHRvIGJlIHJlcGxhY2VkIHdpdGggY29uY3JldGUgcmVzb3VyY2VzIHdoZW4gaW5zdGFudGlhdGluZyB0aGUgcGxhbiBmb3IgYSBjb25jcmV0ZSBwcm9qZWN0LiAgU29tZXRpbWVzIHByb2plY3QgcGxhbnMgY2FuIHRoZW4gYWdhaW4gYmUgb3JnYW5pemVkIGRpZmZlcmVudGx5IGJ5IG9yZ2FuaXppbmcgd29yayBieSBkZWxpdmVyYWJsZXMgaW4gd2hpY2ggV29yayBQcm9kdWN0cyBhcmUgbWFwcGVkIHRvIHRoZSBwbGFuJ3Mgc3VtbWFyeSB0YXNrcyBhbmQgVGFzayB0aGF0IGhhdmUgdGhlc2Ugd29yayBwcm9kdWN0cyBhcyBvdXRwdXQgbWFwcGVkIGJlbG93IHN1Y2ggYXMgc3VtbWFyeSB0YXNrLiAgVGhlcmVmb3JlLCBhIHByb2Nlc3MgY2FuIG1ha2UgcmVjb21tZW5kYXRpb25zIGFib3V0IHdoaWNoIGVsZW1lbnRzIHRvIGluY2x1ZGUgYW5kIHdoaWNoIHRvIGV4Y2x1ZGUgd2hlbiBnZW5lcmF0aW5nIGEgcGxhbi4gIFdoZW4gdGhlIGlzUGxhbm5lZCBhdHRyaWJ1dGUgaXMgc2V0IHRvIEZhbHNlIGZvciBhbiBpbnN0YW5jZSBvZiBhIEJyZWFrZG93biBFbGVtZW50LCB0aGVuIHRoaXMgZWxlbWVudCBzaGFsbCBub3QgYmUgbm90IGluY2x1ZGVkIHdoZW4gYSBjb25jcmV0ZSBwcm9qZWN0IHBsYW4gaXMgYmVpbmcgZ2VuZXJhdGVkIGZyb20gdGhlIGJyZWFrZG93biBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucyB0aGlzIGVsZW1lbnQuCi0KLQotPC9ib2R5PgotICAgICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iX0dpM2R4T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Il81R2NZQU9pZUVkdVFidVk2VXdNU1FnIj4KLSAgICAgICAgICAgICAgICA8Ym9keT50cnVlPC9ib2R5PgotICAgICAgICAgICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwM0Q0IiBuYW1lPSJoYXNNdWx0aXBsZU9jY3VycmVuY2VzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il81R2NZQU9pZUVkdVFidVk2VXdNU1FnIj4KLSAgICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HaTNkeC1mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwM0Q0Ij4KLSAgICAgICAgICAgICAgICA8Ym9keT5KdXN0IGFzIHRoZSBpc1BsYW5uZWQgYXR0cmlidXRlIHRoZSBoYXNNdWx0aXBsZU9jY3VycmVuY2VzIGF0dHJpYnV0ZSBoYXMgYW4gaW1wYWN0IG9uIGdlbmVyYXRpbmcgcGxhbnMgZnJvbSBhIFByb2Nlc3MuICBXaGVuIHRoaXMgYXR0cmlidXRlIGlzIHNldCB0byBUcnVlIGZvciBhIEJyZWFrZG93biBFbGVtZW50IHRoZW4gaXQgd2lsbCB0eXBpY2FsbHkgb2NjdXIgbXVsdGlwbGUgdGltZXMgd2l0aGluIHRoZSBzYW1lIEFjdGl2aXR5LiAgRm9yIGV4YW1wbGUsIGEgVGFzayBzdWNoIGFzICZxdW90O0RldGFpbCBVc2UgQ2FzZSZxdW90OyB3b3VsZCBiZSBwZXJmb3JtZWQgZm9yIGV2ZXJ5IHVzZSBjYXNlIGlkZW50aWZpZWQgZm9yIGEgcGFydGljdWxhciBJdGVyYXRpb24gb3IgQWN0aXZpdHkuICBHZW5lcmF0aW5nIGEgcGxhbiB3b3VsZCBsaXN0IG9uZSBUYXNrIGluc3RhbmNlIHBlciB1c2UgY2FzZS4KLTwvYm9keT4KLSAgICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9Il9HaTNkeWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJfNUdjWUFPaWVFZHVRYnVZNlV3TVNRZyI+Ci0gICAgICAgICAgICAgICAgPGJvZHk+ZmFsc2U8L2JvZHk+Ci0gICAgICAgICAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTAwNkE2QjAxRkIiIG5hbWU9ImlzT3B0aW9uYWwiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzVHY1lBT2llRWR1UWJ1WTZVd01TUWciPgotICAgICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dpM2R5LWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTAwNkE2QjAxRkIiPgotICAgICAgICAgICAgICAgIDxib2R5PlRoZSBpc09wdGlvbmFsIGF0dHJpYnV0ZSBpbmRpY2F0ZXMgdGhhdCB0aGUgQnJlYWtkb3duIEVsZW1lbnQgZGVzY3JpYmVzIHdvcmssIGEgd29yayByZXN1bHQsIG9yIGV2ZW4gd29yayByZXNvdXJjZXMsIHdoaWNoIGluY2x1c2lvbiBpcyBub3QgbWFuZGF0b3J5IHdoZW4gcGVyZm9ybWluZyBhIHByb2plY3QgdGhhdCBpcyBwbGFubmVkIGJhc2VkIG9uIGEgcHJvY2VzcyBjb250YWluaW5nIHRoaXMgZWxlbWVudC48L2JvZHk+Ci0gICAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJfR2kzZHplZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iXzVHY1lBT2llRWR1UWJ1WTZVd01TUWciPgotICAgICAgICAgICAgICAgIDxib2R5PmZhbHNlPC9ib2R5PgotICAgICAgICAgICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMkI2IiBuYW1lPSJwcmVzZW50ZWRBZnRlciIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMEVGIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDJCNSI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0drRHduT2ZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0drRHdtLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDIxRThGMEUwMjM0IiBuYW1lPSJwcmVzZW50ZWRCZWZvcmUiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDBFRiIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MjFFOEYwQzAyODEiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9Ha3pYZy1mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iMSIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9Ha3pYZ3VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxMTlBNEY5MDA2OSIgbmFtZT0icGxhbm5pbmdEYXRhIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MTE5QTRFNjAyQzEiIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDExOUE0RjgwMjBBIj4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR21KYlEtZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IjEiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR21KYlF1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MUUwRkZEMzAwRjAiIG5hbWU9InN1cGVyQWN0aXZpdGllcyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUQwM0QzIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQxRTBGRkQzMDBFRiI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0dtU2xQT2ZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0dtU2xPLWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMEU2IiBuYW1lPSJEZXNjcmlwdG9yIiBpc0Fic3RyYWN0PSJ0cnVlIj4KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR2pBbnNlZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDBFNiI+Ci0gICAgICAgICAgICAgIDxib2R5PkEgRGVzY3JpcHRvciBpcyBhbiBhYnN0cmFjdCBnZW5lcmFsaXphdGlvbiBmb3Igc3BlY2lhbCBCcmVha2Rvd24gRWxlbWVudHMgdGhhdCByZWZlcmVuY2VzIG9uZSBjb25jcmV0ZSBDb250ZW50IEVsZW1lbnQuICBBIGRlc2NyaXB0b3IgcHJvdmlkZXMgYSByZXByZXNlbnRhdGlvbiBvZiBhIENvbnRlbnQgRWxlbWVudCB3aXRoaW4gYnJlYWtkb3duIHN0cnVjdHVyZXMuICBJbiBhZGRpdGlvbiB0byBqdXN0IHJlZmVyZW5jaW5nIENvbnRlbnQgRWxlbWVudHMgaXQgYWxsb3dzIG92ZXJyaWRpbmcgdGhlIENvbnRlbnQgRWxlbWVudHMgc3RydWN0dXJhbCByZWxhdGlvbnNoaXBzIGJ5IGRlZmluaW5nIGl0cyBvd24gc2V0cyBvZiBhc3NvY2lhdGlvbnMuCi1EZXNjcmlwdG9ycyBhcmUgdGhlIGtleSBjb25jZXB0IGZvciByZWFsaXppbmcgdGhlIHNlcGFyYXRpb24gb2YgcHJvY2Vzc2VzIGZyb20gbWV0aG9kIGNvbnRlbnQuICBBIERlc2NyaXB0b3IgY2FuIGJlIGNoYXJhY3Rlcml6ZWQgYXMgYSByZWZlcmVuY2Ugb2JqZWN0IGZvciBvbmUgcGFydGljdWxhciBDb250ZW50IEVsZW1lbnQsIHdoaWNoIGhhcyBpdHMgb3duIHJlbGF0aW9uc2hpcHMgYW5kIHByb3BlcnRpZXMuICBXaGVuIGEgRGVzY3JpcHRvciBpcyBjcmVhdGVkIGl0IHNoYWxsIGJlIHByb3ZpZGVkIHdpdGggY29uZ3J1ZW50IGNvcGllcyBvZiB0aGUgcmVsYXRpb25zaGlwcyBkZWZpbmVkIGZvciB0aGUgcmVmZXJlbmNlZCBjb250ZW50IGVsZW1lbnQuICBIb3dldmVyLCBhIHVzZXIgY2FuIG1vZGlmeSB0aGVzZSByZWxhdGlvbnNoaXBzIGZvciB0aGUgcGFydGljdWxhciBwcm9jZXNzIHNpdHVhdGlvbiBmb3Igd2hpY2ggdGhlIGRlc2NyaXB0b3IgaGFzIGJlZW4gY3JlYXRlZC4gCi08L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyOEYiIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwRUYiLz4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MjgxNDJCQjAzQjUiIG5hbWU9ImlzU3luY2hyb25pemVkV2l0aFNvdXJjZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfNUdjWUFPaWVFZHVRYnVZNlV3TVNRZyI+Ci0gICAgICAgICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9Il9HakFudGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJfNUdjWUFPaWVFZHVRYnVZNlV3TVNRZyI+Ci0gICAgICAgICAgICAgICAgPGJvZHk+dHJ1ZTwvYm9keT4KLSAgICAgICAgICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDhCIiBuYW1lPSJSb2xlRGVzY3JpcHRvciI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dqQW50LWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwOEIiPgotICAgICAgICAgICAgICA8Ym9keT5BIFJvbGUgRGVzY3JpcHRvciByZXByZXNlbnRzIGEgUm9sZSBpbiB0aGUgY29udGV4dCBvZiBvbmUgc3BlY2lmaWMgQWN0aXZpdHkuICBFdmVyeSBicmVha2Rvd24gc3RydWN0dXJlIGNhbiBkZWZpbmUgZGlmZmVyZW50IHJlbGF0aW9uc2hpcHMgb2YgUm9sZSBEZXNjcmlwdG9ycyB0byBUYXNrIERlc2NyaXB0b3JzIGFuZCBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvcnMuICBUaGVyZWZvcmUgb25lIFJvbGUgY2FuIGJlIHJlcHJlc2VudGVkIGJ5IG1hbnkgUm9sZSBEZXNjcmlwdG9ycyBlYWNoIHdpdGhpbiB0aGUgY29udGV4dCBvZiBhbiBBY3Rpdml0eSB3aXRoIGl0cyBvd24gc2V0IG9mIHJlbGF0aW9uc2hpcHMuPC9ib2R5PgotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTYwIiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMEU2Ii8+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTZEIiBuYW1lPSJyb2xlIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyOTYiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTZBIj4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR2tNNmotZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IjEiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR2tNNmp1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxOUQiIG5hbWU9Im1vZGlmaWVzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwNDUiIGlzRGVyaXZlZD0idHJ1ZSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxOUMiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9Ha2djak9mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9Ha2djaS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDE3RiIgbmFtZT0icmVzcG9uc2libGVGb3IiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDA0NSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxN0UiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9Ha3pYYy1mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9Ha3pYY3VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDA5IiBuYW1lPSJUYXNrRGVzY3JpcHRvciI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dqQW51LWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwMDkiPgotICAgICAgICAgICAgICA8Ym9keT5BIFRhc2sgRGVzY3JpcHRvciBpcyBhIERlc2NyaXB0b3IgYW5kIFdvcmsgQnJlYWtkb3duIEVsZW1lbnQgdGhhdCByZXByZXNlbnRzIGEgcHJveHkgZm9yIGEgVGFzayBpbiB0aGUgY29udGV4dCBvZiBvbmUgc3BlY2lmaWMgQWN0aXZpdHkuICBFdmVyeSBicmVha2Rvd24gc3RydWN0dXJlIGNhbiBkZWZpbmUgZGlmZmVyZW50IHJlbGF0aW9uc2hpcHMgb2YgVGFzayBEZXNjcmlwdG9ycyB0byBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvcnMgYW5kIFJvbGUgRGVzY3JpcHRvcnMuIFRoZXJlZm9yZSBvbmUgVGFzayBjYW4gYmUgcmVwcmVzZW50ZWQgYnkgbWFueSBUYXNrIERlc2NyaXB0b3JzIGVhY2ggd2l0aGluIHRoZSBjb250ZXh0IG9mIGFuIEFjdGl2aXR5IHdpdGggaXRzIG93biBzZXQgb2YgcmVsYXRpb25zaGlwcy4KLUEga2V5IGRpZmZlcmVuY2UgYmV0d2VlbiBNZXRob2QgQ29udGVudCBhbmQgUHJvY2VzcyBpcyB0aGF0IGEgQ29udGVudCBFbGVtZW50IHN1Y2ggYXMgVGFzayBkZXNjcmliZXMgYWxsIGFzcGVjdHMgb2YgZG9pbmcgd29yayBkZWZpbmVkIGFyb3VuZCB0aGlzIFRhc2suICBUaGlzIGRlc2NyaXB0aW9uIGlzIG1hbmFnZWQgaW4gc3RlcHMsIHdoaWNoIGFyZSBtb2RlbGVkIGFzIFNlY3Rpb25zIG9mIHRoZSBUYXNrcycgQ29udGVudCBEZXNjcmlwdGlvbnMuICBXaGVuIGFwcGx5aW5nIGEgVGFzayBpbiBhIFByb2Nlc3MnIEFjdGl2aXR5IHdpdGggYSBUYXNrIERlc2NyaXB0b3IgYSBQcm9jZXNzIEVuZ2luZWVyIG5lZWRzIHRvIGluZGljYXRlIHRoYXQgYXQgdGhhdCBwYXJ0aWN1bGFyIHBvaW50IGluIHRpbWUgaW4gdGhlIFByb2Nlc3MgZGVmaW5pdGlvbiBmb3Igd2hpY2ggdGhlIFRhc2sgRGVzY3JpcHRvciBoYXMgYmVlbiBjcmVhdGVkLCBvbmx5IGEgc3Vic2V0IG9mIHN0ZXBzIHNoYWxsIGJlIHBlcmZvcm1lZC4gIEhlIGRlZmluZXMgdGhpcyBzZWxlY3Rpb24gdXNpbmcgdGhlIHNlbGVjdGVkU3RlcHMgYXNzb2NpYXRpb24uICBJZiBoZSB3YW50cyB0byBhZGQgc3RlcHMgdG8gYSBUYXNrIERlc2NyaXB0b3IsIGhlIGNhbiBkZXNjcmliZSB0aGVzZSBlaXRoZXIgcHJhZ21hdGljYWxseSBpbiB0aGUgcmVmaW5lZERlc2NyaXB0aW9uIGF0dHJpYnV0ZSBvciAncHJvcGVybHknIGNyZWF0ZSBhIGNvbnRyaWJ1dGluZyBUYXNrIHRvIHRoZSBUYXNrIHRoZSBUYXNrIERlc2NyaXB0b3IgcmVmZXJzIHRvLgotCi08L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzMDMiIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwRTYiLz4KLSAgICAgICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MjdBOTIzQjAwMDIiIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0MjdBOTI1NDAyMjciLz4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzMTAiIG5hbWU9InRhc2siIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI5RSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzMEQiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9Ha0R3cU9mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iMSIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9Ha0R3cC1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDMyMiIgbmFtZT0iYWRkaXRpb25hbGx5UGVyZm9ybWVkQnkiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDA4QiIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzMjEiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9Ha002bGVmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9Ha002bE9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDM0MCIgbmFtZT0iYXNzaXN0ZWRCeSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDhCIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDMzRiI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0drV3JnLWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0drV3JndWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjVDIiBuYW1lPSJleHRlcm5hbElucHV0IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwNDUiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjVCIj4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR2tXcmpPZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR2tXcmktZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTZENzVBQjAyODEiIG5hbWU9Im1hbmRhdG9yeUlucHV0IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwNDUiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDE2RDc1QUEwMDRCIj4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR2tnY2ctZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR2tnY2d1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyMkMiIG5hbWU9Im9wdGlvbmFsSW5wdXQiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDA0NSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyMjkiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9Ha2djbU9mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9Ha2djbC1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDI0OCIgbmFtZT0ib3V0cHV0IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwNDUiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjNEIj4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR2twbWR1ZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR2twbWRlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzNTQiIG5hbWU9InBlcmZvcm1lZFByaW1hcmlseUJ5IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwOEIiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzUzIj4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR2twbWhlZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IjEiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR2twbWhPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MjM3NUUwNTAxNzMiIG5hbWU9InNlbGVjdGVkU3RlcHMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQyMUU0Q0YzMDFBRSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MjM3NUUwNDAzOTAiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9Hb09lNC1mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9Hb09lNHVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDQ1IiBuYW1lPSJXb3JrUHJvZHVjdERlc2NyaXB0b3IiPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HakFud09mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDQ1Ij4KLSAgICAgICAgICAgICAgPGJvZHk+QSBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvciByZXByZXNlbnRzIGEgV29yayBQcm9kdWN0IGluIHRoZSBjb250ZXh0IG9mIG9uZSBzcGVjaWZpYyBBY3Rpdml0eS4gIEV2ZXJ5IGJyZWFrZG93biBzdHJ1Y3R1cmUgY2FuIGRlZmluZSBkaWZmZXJlbnQgcmVsYXRpb25zaGlwcyBvZiBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvcnMgdG8gVGFzayBEZXNjcmlwdG9ycyBhbmQgUm9sZSBEZXNjcmlwdG9ycy4gIFRoZXJlZm9yZSBvbmUgV29yayBQcm9kdWN0IGNhbiBiZSByZXByZXNlbnRlZCBieSBtYW55IFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9ycyBlYWNoIHdpdGhpbiB0aGUgY29udGV4dCBvZiBhbiBBY3Rpdml0eSB3aXRoIGl0cyBvd24gc2V0IG9mIHJlbGF0aW9uc2hpcHMuPC9ib2R5PgotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwM0Q2IiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMEU2Ii8+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDEyQTVGODYwMkY2IiBuYW1lPSJhY3Rpdml0eUVudHJ5U3RhdGUiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyI+Ci0gICAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR2pLWXMtZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxMkE1Rjg2MDJGNiI+Ci0gICAgICAgICAgICAgICAgPGJvZHk+R2l2ZW4gdGhhdCBhbiBpbnN0YW5jZSBvZiBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvciBoYXMgYmVlbiBjcmVhdGVkIGZvciBhIHNwZWNpZmljIEFjdGl2aXR5LCB0aGVuIHRoZSBBY3Rpdml0eSBFbnRyeSBTdGF0ZSBhdHRyaWJ1dGUgc3BlY2lmaWVzIHRoZSBkZXNpcmVkIHN0YXRlIG9mIGluc3RhbmNlcyBvZiB0aGUgcmVmZXJlbmNlZCBXb3JrIFByb2R1Y3Qgd2hlbiB3b3JrIG9uIHRoZSBBY3Rpdml0eSBpcyBpbml0aWF0ZWQgKGkuZS4gd29yayBvbiB0aGUgQWN0aXZpdHkncyBUYXNrIERlc2NyaXB0b3JzIGlzIGJlaW5nIGluaXRpYXRlZCB0aGF0IHVzZSB0aGlzIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9yIGFzIGlucHV0KS4gIAotRm9yIHNvbWUgV29yayBQcm9kdWN0cyBzdGF0ZSBpcyBleHByZXNzZWQgaW4gcGVyY2VudGFnZSBvZiBjb21wbGV0aW9uLCBjb21wbGlhbmNlIHRvIHdvcmsgcHJvZHVjdCBjaGVja2xpc3QsIGluZm9ybWFsIHN0YXRlIGRlc2NyaXB0aW9ucywgZXRjLiAgT3RoZXJzIGhhdmUgdmVyeSBzcGVjaWZpYyBzdGF0ZXMgZXhwcmVzc2VkIGFzIGVudW1lcmF0aW9ucyBzdWNoIGFzIFtpZGVudGlmaWVkLCBicmllZmx5IGRlc2NyaWJlZCwgb3V0bGluZWQsIGRldGFpbGVkXSBmb3IgdXNlIGNhc2VzLiAgT3RoZXIgV29yayBQcm9kdWN0IHN0YXRlcyByZWxhdGUgdG8gc29tZSBxdWFsaXR5IG1lYXN1cmVzIG9yIGxpZmVjeWNsZSBzdGF0ZXMgc3VjaCBhcyBbcmV2aWV3ZWQsIGltcGxlbWVudGVkLCB0ZXN0ZWRdLgotPC9ib2R5PgotICAgICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfS2MxWndPeUpFZHU1LXZWamxmVnNmUSIgdmFsdWU9IjEiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfS2Nyb3dPeUpFZHU1LXZWamxmVnNmUSIvPgotICAgICAgICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfS1ZZRzRPeUpFZHU1LXZWamxmVnNmUSIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyIgdmFsdWU9IiIvPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTNFQzAxODAzNDAiIG5hbWU9ImFjdGl2aXR5RXhpdFN0YXRlIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiPgotICAgICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dqS1l0dWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTNFQzAxODAzNDAiPgotICAgICAgICAgICAgICAgIDxib2R5PkdpdmVuIHRoYXQgYW4gaW5zdGFuY2Ugb2YgV29yayBQcm9kdWN0IERlc2NyaXB0b3IgaGFzIGJlZW4gY3JlYXRlZCBmb3IgYSBzcGVjaWZpYyBBY3Rpdml0eSwgdGhlbiB0aGUgQWN0aXZpdHkgRXhpc3QgU3RhdGUgYXR0cmlidXRlIHNwZWNpZmllcyB0aGUgZGVzaXJlZCBzdGF0ZSBvZiBpbnN0YW5jZXMgb2YgdGhlIHJlZmVyZW5jZWQgV29yayBQcm9kdWN0IHdoZW4gd29yayBvbiB0aGUgQWN0aXZpdHkgaXMgZmluaXNoZWQgKGkuZS4gd29yayBvbiB0aGUgQWN0aXZpdHkncyBUYXNrIERlc2NyaXB0b3JzIGhhcyBmaW5pc2hlZCB0aGF0IGhhdmUgdGhpcyBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvciBhcyBvdXRwdXQpLgotRm9yIHNvbWUgV29yayBQcm9kdWN0cyBzdGF0ZSBpcyBleHByZXNzZWQgaW4gcGVyY2VudGFnZSBvZiBjb21wbGV0aW9uLCBjb21wbGlhbmNlIHRvIHdvcmsgcHJvZHVjdCBjaGVja2xpc3QsIGluZm9ybWFsIHN0YXRlIGRlc2NyaXB0aW9ucywgZXRjLiAgT3RoZXJzIGhhdmUgdmVyeSBzcGVjaWZpYyBzdGF0ZXMgZXhwcmVzc2VkIGFzIGVudW1lcmF0aW9ucyBzdWNoIGFzIFtpZGVudGlmaWVkLCBicmllZmx5IGRlc2NyaWJlZCwgb3V0bGluZWQsIGRldGFpbGVkXSBmb3IgdXNlIGNhc2VzLiAgT3RoZXIgV29yayBQcm9kdWN0IHN0YXRlcyByZWxhdGUgdG8gc29tZSBxdWFsaXR5IG1lYXN1cmVzIG9yIGxpZmVjeWNsZSBzdGF0ZXMgc3VjaCBhcyBbcmV2aWV3ZWQsIGltcGxlbWVudGVkLCB0ZXN0ZWRdLgotPC9ib2R5PgotICAgICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfWXRzWG9leUdFZHU1LXZWamxmVnNmUSIgdmFsdWU9IjEiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfWXRzWG9PeUdFZHU1LXZWamxmVnNmUSIvPgotICAgICAgICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfWWhCMG9PeUdFZHU1LXZWamxmVnNmUSIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyIgdmFsdWU9IiIvPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzREEiIG5hbWU9IndvcmtQcm9kdWN0IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyQkMiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwM0Q3Ij4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR2tNNmh1ZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IjEiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR2tNNmhlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwMjEiIG5hbWU9ImltcGFjdGVkQnkiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDA0NSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwMjAiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9Ha1dybGVmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9Ha1dybE9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDAyMyIgbmFtZT0iaW1wYWN0cyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDQ1IiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDAyMCI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0drV3JtT2ZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0drV3JsLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDBGIiBuYW1lPSJkZWxpdmVyYWJsZVBhcnRzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwNDUiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDBDIj4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR2twbWYtZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR2twbWZ1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxRjA2QjY1MDBFNiIgbmFtZT0iQ29tcG9zaXRlUm9sZSI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dqS1l1ZWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUYwNkI2NTAwRTYiPgotICAgICAgICAgICAgICA8Ym9keT5BIENvbXBvc2l0ZSBSb2xlIGlzIGEgc3BlY2lhbCBSb2xlIERlc2NyaXB0b3IgdGhhdCByZWxhdGVzIHRvIG1vcmUgdGhlbiBvbmUgUm9sZS4gIEl0IHJlcHJlc2VudHMgYSBncm91cGluZyBvZiBSb2xlcyB3aXRoIHRoZSBtYWluIHB1cnBvc2Ugb2Ygc2ltcGxpZmljYXRpb24sIGkuZS4gcmVkdWNpbmcgdGhlIG51bWJlciBvZiByb2xlcyBmb3IgYSBwcm9jZXNzLgotQSBDb21wb3NpdGUgUm9sZSBpcyBhIGdyb3VwaW5nIG9mIFJvbGVzIHRoYXQgY2FuIGJlIHVzZWQgaW4gYW4gQWN0aXZpdHkgb3IgUHJvY2VzcyB0byByZWR1Y2UgdGhlIG51bWJlciBvZiBSb2xlcy4gIEEgdHlwaWNhbCBhcHBsaWNhdGlvbiB3b3VsZCBiZSBhIHByb2Nlc3MgZm9yIGEgc21hbGwgdGVhbSBpbiB3aGljaCBhIHN0YW5kYXJkIHNldCBvZiByb2xlcyBmcm9tIHRoZSBtZXRob2QgY29udGVudCB3b3VsZCBiZSBhbGwgcGVyZm9ybWVkIGJ5IG9uZSBvciBtb3JlIHJlc291cmNlLiAgQnkgdXNpbmcgQ29tcG9zaXRlIFJvbGUgdGhlIHByb2Nlc3Mgd291bGQgc3VnZ2VzdCBhIHR5cGljYWwgY2x1c3RlcmluZyBvZiBSb2xlcyB0byBSZXNvdXJjZXMuICBBIENvbXBvc2l0ZSBSb2xlIGNvdWxkIHBlcmZvcm0gYWxsIFRhc2tzIGRlZmluZWQgZm9yIHRoZSBSb2xlcyBpdCByZWZlcnMgdG8uCi08L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MUY5NEFCOTAwMTUiIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwOEIiLz4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MUYwNkJCRTAwREYiIG5hbWU9ImFnZ3JlZ2F0ZWRSb2xlcyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjk2IiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQxRjA2QkJDMDMwRCI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0drelhldWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0drelhlZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MjdBOTI1NDAyMjciIG5hbWU9IldvcmtCcmVha2Rvd25FbGVtZW50IiBpc0Fic3RyYWN0PSJ0cnVlIj4KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR2pVSnMtZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E5MjU0MDIyNyI+Ci0gICAgICAgICAgICAgIDxib2R5PkEgV29yayBCcmVha2Rvd24gRWxlbWVudCBpcyBhIHNwZWNpYWwgQnJlYWtkb3duIEVsZW1lbnQgdGhhdCBwcm92aWRlcyBzcGVjaWZpYyBwcm9wZXJ0aWVzIGZvciBCcmVha2Rvd24gRWxlbWVudHMgdGhhdCByZXByZXNlbnQgb3IgcmVmZXIgdG8gV29yayBEZWZpbml0aW9ucy4gIEZvciBleGFtcGxlIGl0cyBzdWJjbGFzcyBBY3Rpdml0eSBkZWZpbmVzIHdvcmsgYXMgaXQgaXMgYWxzbyBhIHN1YmNsYXNzIG9mIFdvcmsgRGVmaW5pdGlvbi4gIEl0cyBzdWJjbGFzcyBUYXNrIERlc2NyaXB0b3IgZG9lcyBub3QgZGVmaW5lIHdvcmsgYnkgaXRzZWxmLCBidXQgcmVmZXJzIHRvIGEgV29yayBEZWZpbml0aW9uIGFuZCB0aGVyZWZvcmUgY2FuIGhhdmUgdGhlIHNhbWUgY29tbW9uIHByb3BlcnRpZXMgYW5kIFdvcmsgQnJlYWtkb3duIEVsZW1lbnQgaGFzLjwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyOENEMzIzMDE5QSIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDBFRiIvPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDNDMCIgbmFtZT0iaXNSZXBlYXRhYmxlIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il81R2NZQU9pZUVkdVFidVk2VXdNU1FnIj4KLSAgICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HamRUby1mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwM0MwIj4KLSAgICAgICAgICAgICAgICA8Ym9keT5UaGlzIGF0dHJpYnV0ZSBpcyB1c2VkIHRvIGRlZmluZSByZXBldGl0aW9uIG9mIHdvcmssIGUuZy4gaXRlcmF0aW9ucy4gIEEgUHJvY2VzcyBXb3JrIERlZmluaXRpb24gd2l0aCB0aGlzIGF0dHJpYnV0ZSBzZXQgdG8gVHJ1ZSBzaGFsbCBiZSByZXBlYXRlZCBtb3JlIHRoYW4gb25jZSBvbiB0aGUgc2FtZSBzZXQgb2YgYXJ0aWZhY3RzLiAgRm9yIGV4YW1wbGUsIGZvciBhbiBpbnN0YW5jZSBvZiBJdGVyYXRpb24gKGRlZmluZWQgYXMgYSBzcGVjaWFsIFByb2Nlc3MgV29yayBEZWZpbml0aW9uIGJlbG93KSB0aGlzIGF0dHJpYnV0ZSBpcyBzZXQgdG8gVHJ1ZSBieSBkZWZhdWx0IGluZGljYXRpbmcgdGhhdCBldmVyeSBzdWItQWN0aXZpdHkgd2lsbCBiZSByZXBlYXRlZCBtb3JlIHRoYW4gb25jZS4gIEhvd2V2ZXIsIGFueSBQcm9jZXNzIFdvcmsgRGVmaW5pdGlvbiBjYW4gc2V0IHRoaXMgYXR0cmlidXRlIHRvIFRydWUgdG8gZGVmaW5lIGl0ZXJhdGlvbnMgKGUuZy4gdG8gaXRlcmF0ZSBvbmUgQWN0aXZpdHkgY29uc2lzdGluZyBvZiBtYW55IHN1Yi1hY3Rpdml0aWVzIG9yIGV2ZW4gUGhhc2VzLCBidXQgdG8gaXRlcmF0ZSBqdXN0IG9uZSBUYXNrKS48L2JvZHk+Ci0gICAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJfR2pkVHBlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iXzVHY1lBT2llRWR1UWJ1WTZVd01TUWciPgotICAgICAgICAgICAgICAgIDxib2R5PmZhbHNlPC9ib2R5PgotICAgICAgICAgICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwM0Q1IiBuYW1lPSJpc09uZ29pbmciIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzVHY1lBT2llRWR1UWJ1WTZVd01TUWciPgotICAgICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dqZFRwLWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAzRDUiPgotICAgICAgICAgICAgICAgIDxib2R5PklmIHRoZSBpc09uZ29pbmcgYXR0cmlidXRlIGlzIHNldCB0byBUcnVlIGZvciBhIFByb2Nlc3MgV29yayBEZWZpbml0aW9uIGluc3RhbmNlLCB0aGVuIHRoZSBlbGVtZW50IGRlc2NyaWJlcyBhbiBvbmdvaW5nIHBpZWNlIG9mIHdvcmsgd2l0aG91dCBhIGZpeGVkIGR1cmF0aW9uIG9yIGVuZCBzdGF0ZS4gIEZvciBleGFtcGxlLCB0aGUgUHJvY2VzcyBXb3JrIERlZmluaXRpb24gY291bGQgcmVwcmVzZW50IHdvcmsgb2YgYW4gYWRtaW5pc3RyYXRvciBjb250aW51b3VzbHkgKGUuZy4gM2ggYSBkYXkpIHdvcmtpbmcgdG8gZW5zdXJlIHRoYXQgc3lzdGVtcyBhcmUga2VwdCBpbiBhIGNlcnRhaW4gc3RhdGUuICBBbm90aGVyIGV4YW1wbGUgd291bGQgYmUgcHJvZ3JhbSBtYW5hZ2VtZW50IHdvcmsgb3ZlcnNlZWluZyBtYW55IGRpZmZlcmVudCBwcm9qZWN0cyBiZWluZyBzY2hlZHVsZWQgZm9yIG9uZSBwYXJ0aWN1bGFyIHByb2plY3QgYXQgc3BlY2lmaWMgcmVvY2N1cnJpbmcgaW50ZXJ2YWxzIGR1cmluZyB0aGUgd2hvbGUgbGlmZWN5Y2xlIG9mIHRoZSBwcm9qZWN0LjwvYm9keT4KLSAgICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9Il9HamRUcWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJfNUdjWUFPaWVFZHVRYnVZNlV3TVNRZyI+Ci0gICAgICAgICAgICAgICAgPGJvZHk+ZmFsc2U8L2JvZHk+Ci0gICAgICAgICAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAzREUiIG5hbWU9ImlzRXZlbnREcml2ZW4iIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzVHY1lBT2llRWR1UWJ1WTZVd01TUWciPgotICAgICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dqZFRxLWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAzREUiPgotICAgICAgICAgICAgICAgIDxib2R5PlRoZSBpc0V2ZW50RHJpdmVuIGF0dHJpYnV0ZSBpbmRpY2F0ZXMgdGhhdCB0aGUgUHJvY2VzcyBXb3JrIERlZmluaXRpb24gZGVzY3JpYmVzIGFuIGluc3RhbmNlIG9mIHdvcmsgd2hpY2ggaXMgbm90IHN0YXJ0ZWQgYmVjYXVzZSBpdCBoYXMgYmVlbiBzY2hlZHVsZWQgdG8gc3RhcnQgYXQgYSBjZXJ0YWluIHBvaW50IG9mIHRpbWUsIGJlY2F1c2UgcHJlY2VkaW5nIHdvcmsgaXMgYmVpbmcgY29tcGxldGVkLCBvciBpbnB1dCB3b3JrIHByb2R1Y3RzIGFyZSBhdmFpbGFibGUsIGJ1dCBiZWNhdXNlIGFub3RoZXIgc3BlY2lmaWMgZXZlbnQgaGFzIG9jY3VycmVkLiAgRXhhbXBsZXMgZm9yIHN1Y2ggZXZlbnRzIGFyZSBleGNlcHRpb25zIG9yIHByb2JsZW0gc2l0dWF0aW9ucyB3aGljaCByZXF1aXJlIHNwZWNpZmljIHdvcmsgdG8gYmUgcGVyZm9ybWVkIGFzIGEgcmVzdWx0LiAgQWxzbyBjaGFuZ2UgbWFuYWdlbWVudCB3b3JrIGNhbiBiZSBtb2RlbGVkIGFzIGV2ZW50IGRyaXZlbiB3b3JrIGFuYWx5emluZyBhIGNoYW5nZSByZXF1ZXN0IG9yIGRlZmVjdCBhbmQgYWxsb2NhdGluZyB3b3JrIGR5bmFtaWNhbGx5IHRvIHJlc291cmNlcyB0byBkZWFsIHdpdGggaXQgZm9sbG93aW5nIHRoZSB3b3JrIGRlc2NyaWJlZCB3aXRoIHN1Y2ggUHJvY2VzcyBXb3JrIERlZmluaXRpb24uICBUaGUgZXZlbnRzIHRoZW1zZWx2ZXMgYXJlIG5vdCBtb2RlbGVkIGluIHRoaXMgdmVyc2lvbiBvZiB0aGUgc3BlY2lmaWNhdGlvbi4gIFRoZXkgc2hhbGwgYmUgZGVzY3JpYmVkIGFzIHBhcnQgb2YgdGhlIG5vcm1hbCBkZXNjcmlwdGlvbnMgZmllbGRzIGF2YWlsYWJsZS4KLQotCi08L2JvZHk+Ci0gICAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJfR2pkVHJlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iXzVHY1lBT2llRWR1UWJ1WTZVd01TUWciPgotICAgICAgICAgICAgICAgIDxib2R5PmZhbHNlPC9ib2R5PgotICAgICAgICAgICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDI4MEVENDAwMENGIiBuYW1lPSJsaW5rVG9QcmVkZWNlc3NvciIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDEwODE4NzkwMjg4IiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQyODBFRDQwMDBDRCI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0drOUlmLWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0drOUlmdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MjgzRThBMTAzNDEiIG5hbWU9IlByb2Nlc3NFbGVtZW50IiBpc0Fic3RyYWN0PSJ0cnVlIj4KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR2pkVHItZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyODNFOEExMDM0MSI+Ci0gICAgICAgICAgICAgIDxib2R5PlByb2Nlc3MgRWxlbWVudCBpcyBhIERlc2NyaWJhYmxlIEVsZW1lbnQgdGhhdCByZXByZXNlbnRzIGFuIGFic3RyYWN0IGdlbmVyYWxpemF0aW9uIGZvciBhbGwgZWxlbWVudHMgZGVmaW5lZCBpbiB0aGUgUHJvY2VzcyBwYWNrYWdlLgotUHJvY2VzcyBFbGVtZW50cyByZXByZXNlbnRzIFByb2Nlc3Mgc3BlY2lmaWMgZWxlbWVudHMgdGhhdCBhcmUgc3VwcG9zZWQgdG8gYmUgbWFuYWdlZCBpbiBQcm9jZXNzIFBhY2thZ2VzLiAgVGhlIHNlcGFyYXRpb24gb2YgUHJvY2VzcyBFbGVtZW50IGZyb20gQ29udGVudCBFbGVtZW50IGFsbG93cyB0byBjbGVhcmx5IGRpc3Rpbmd1aXNoIGJldHdlZW4gcHVyZSBtZXRob2QgY29udGVudCBmcm9tIGNvbnRlbnQgdGhhdCBpcyByZXByZXNlbnRlZCBpbiBwcm9jZXNzZXMuIAotPC9ib2R5PgotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDI5NEVDQzEwMzFFIiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDI5NEVCOTAwMEZDIi8+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwM0YiIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDA0MCBfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDQyIj4KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR2puRW8tZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDAzRiI+Ci0gICAgICAgICAgICAgIDxib2R5PlRoaXMgYWdncmVnYXRpb24gYXNzb2NpYXRpb24gc3BlY2lmaWVzIHRoZSByb2xlcyBvZiB0ZWFtIG1lbWJlcnMgd2l0aCBSb2xlIERlc2NyaXB0b3JzLjwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDA0MCIgbmFtZT0iX3RlYW1Qcm9maWxlIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwNjMiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwM0YiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9Ham5FcC1mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9Ham5FcHVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkRW5kPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDUyIiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwNTMgXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDA1NSI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dqNV9sT2ZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwNTIiPgotICAgICAgICAgICAgICA8Ym9keT5UaGlzIGFzc29jaWF0aW9uIHJlbGF0ZXMgYSBTdWItVGVhbSB0byBpdHMgU3VwZXItVGVhbSwgaS5lLiB0aGUgVGVhbSB0aGF0IGl0IGlzIHBhcnQgb2YuPC9ib2R5PgotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyQjUiIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDJCNiBfM0FEQzdCNzQwMjJENDBGMzZDNjAwMkI4Ij4KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR2tEd21PZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDJCNSI+Ci0gICAgICAgICAgICAgIDxib2R5PkJyZWFrZG93biBzdHJ1Y3R1cmVzIGFyZSBuZXN0ZWQgc3RydWN0dXJlcyAoc2VlIHN1cGVyQWN0aXZpdGllcyBhc3NvY2lhdGlvbikgcHJlc2VudGVkIG5vcm1hbGx5IGFzIGluZGVudGVkIGxpc3RzLiAgV2l0aGluIHRoaXMgbmVzdGluZyBjaGlsZHJlbiBvbiB0aGUgc2FtZSBsZXZlbCBhcmUgbm90IHNwZWNpZmljYWxseSBvcmRlcmVkLiAgSG93ZXZlciwgYSB1c2VyIG9mIHRoZXNlIGRhdGEgc3RydWN0dXJlcyB3b3VsZCBleHBlY3QgdG8gb3JkZXIgZWxlbWVudHMgd2l0aGluIGEgbGlzdC4gIFRoaXMgYXNzb2NpYXRpb24gaXMgdXNlZCB0byBzdG9yZSB0aGUgcHJlc2VudGF0aW9uIHNlcXVlbmNlIGFtb25nc3QgQnJlYWtkb3duIEVsZW1lbnRzLiAgVGhlIGFzc29jaWF0aW9uIHByZXNlbnRlZEFmdGVyIGlzIHJlZHVuZGFudCB0byB0aGUgYXNzb2NpYXRpb24gcHJlc2VudGVkQmVmb3JlLiAgVGhpcyByZWR1bmRhbmN5IGlzIHJlcXVpcmVkIHRvIHN1cHBvcnQgUHJvY2VzcyBDb250cmlidXRpb25zIChzZWUgcGx1Z2lucykuPC9ib2R5PgotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICA8b3duZWRFbmQgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMkI4IiBuYW1lPSJfYnJlYWtkb3duRWxlbWVudCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMEVGIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMkI1Ij4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR2tEd24tZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IjEiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR2tEd251ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEVuZD4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDMwRCIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzBFIF8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzMTAiPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9Ha0R3b2VmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzBEIj4KLSAgICAgICAgICAgICAgPGJvZHk+VGhpcyBhc3NvY2lhdGlvbiByZXByZXNlbnRzIHRoZSByZWZlcmVuY2UgZnJvbSB0aGUgZGVzY3JpcHRvciB0byB0aGUgY29yZSBjb250ZW50IGVsZW1lbnQgaXQgcmVmZXJzIHRvLiAgRXZlcnkgVGFzayBEZXNjcmlwdG9yIGNhbiByZWZlcmVuY2Ugb25seSBvbiBUYXNrLiAgSG93ZXZlciwgYSBUYXNrIGNhbiBiZSByZXByZXNlbnRlZCBieSBtYW55IFRhc2sgRGVzY3JpcHRvcnMuICBJbiB0aGUgVU1BIFByb2ZpbGUgdGhpcyBhc3NvY2lhdGlvbiBpcyBpbnN0YW50aWF0ZWQgYnkgYSBkZXBlbmRlbmN5IHJlbGF0aW9uc2hpcCB3aXRoIGEgdHJhY2Ugc3RlcmVvdHlwZS48L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzMEUiIG5hbWU9InRhc2tEZXNjcmlwdG9yIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwMDkiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzBEIj4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR2tEd3BlZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR2tEd3BPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEVuZD4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDNENyIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwM0Q4IF8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzREEiPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9Ha0R3cXVmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwM0Q3Ij4KLSAgICAgICAgICAgICAgPGJvZHk+VGhpcyBhc3NvY2lhdGlvbiByZXByZXNlbnRzIHRoZSByZWZlcmVuY2UgZnJvbSB0aGUgZGVzY3JpcHRvciB0byB0aGUgY29yZSBjb250ZW50IGVsZW1lbnQgaXQgcmVmZXJzIHRvLiAgRXZlcnkgV29yayBQcm9kdWN0IERlc2NyaXB0b3IgY2FuIHJlZmVyZW5jZSBvbmx5IG9uZSBXb3JrIFByb2R1Y3QuICBIb3dldmVyLCBhIFdvcmsgUHJvZHVjdCBjYW4gYmUgcmVwcmVzZW50ZWQgYnkgbWFueSBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvcnMuICBJbiB0aGUgVU1BIFByb2ZpbGUgdGhpcyBhc3NvY2lhdGlvbiBpcyBpbnN0YW50aWF0ZWQgYnkgYSBkZXBlbmRlbmN5IHJlbGF0aW9uc2hpcCB3aXRoIGEgdHJhY2Ugc3RlcmVvdHlwZS48L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzRDgiIG5hbWU9IndvcmtQcm9kdWN0RGVzY3JpcHRvciIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDQ1IiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDNENyI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0drTTZnLWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0drTTZndWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRFbmQ+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxNkEiIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDE2QiBfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTZEIj4KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR2tNNmlPZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDE2QSI+Ci0gICAgICAgICAgICAgIDxib2R5PlRoaXMgYXNzb2NpYXRpb24gcmVwcmVzZW50cyB0aGUgcmVmZXJlbmNlIGZyb20gdGhlIGRlc2NyaXB0b3IgdG8gdGhlIGNvcmUgY29udGVudCBlbGVtZW50IGl0IHJlZmVycyB0by4gIEV2ZXJ5IFJvbGUgRGVzY3JpcHRvciBjYW4gcmVmZXJlbmNlIG9ubHkgb25lIFJvbGUuICBIb3dldmVyLCBhIFJvbGUgY2FuIGJlIHJlcHJlc2VudGVkIGJ5IG1hbnkgUm9sZSBEZXNjcmlwdG9ycy4gIEluIHRoZSBVTUEgUHJvZmlsZSB0aGlzIGFzc29jaWF0aW9uIGlzIGluc3RhbnRpYXRlZCBieSBhIGRlcGVuZGVuY3kgcmVsYXRpb25zaGlwIHdpdGggYSB0cmFjZSBzdGVyZW90eXBlLjwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDE2QiIgbmFtZT0icm9sZURlc2NyaXB0b3IiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDA4QiIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxNkEiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9Ha002ak9mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9Ha002aS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkRW5kPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzIxIiBuYW1lPSJBZGRpdGlvbmFsbHlQZXJmb3JtcyIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzIyIF8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzMkIiPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9Ha002a2VmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzIxIj4KLSAgICAgICAgICAgICAgPGJvZHk+VGhpcyBhc3NvY2lhdGlvbiBtYXBzIHRvIHRoZSByZXNwZWN0aXZlIGFzc29jaWF0aW9uIGluIENvcmUgQ29udGVudCBFbGVtZW50cy4gIEl0IHNwZWNpZmllcyBkZXNjcmlwdG9ycyBmb3IgYWRkaXRpb25hbCByb2xlcyBuZWNlc3NhcnkgdG8gY29tcGxldGUgdGhlIHJlZmVycmVkIFRhc2suICBJbnN0YW5jZXMgb2YgdGhlc2Ugcm9sZXMgd291bGQgc2hvdyB1cCBhcyBzY2hlZHVsZWQgcmVzb3VyY2VzIG9uIGEgY29ycmVzcG9uZGluZyBwcm9qZWN0IHBsYW4gZ2VuZXJhdGVkIGZyb20gdGhpcyBzdHJ1Y3R1cmUuPC9ib2R5PgotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICA8b3duZWRFbmQgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzJCIiBuYW1lPSJwZXJmb3Jtc0FkZGl0aW9uYWxseSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDA5IiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDMyMSI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0drTTZtT2ZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0drTTZsLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRFbmQ+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzM0YiIG5hbWU9IkFzc2lzdHMiIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDM0MCBfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzQyIj4KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR2tNNm11ZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDMzRiI+Ci0gICAgICAgICAgICAgIDxib2R5PlRoaXMgYXNzb2NpYXRpb24gaXMgc3BlY2lmaWMgdG8gYSBwcm9jZXNzLCBpLmUuIG5vIGRlZmF1bHRzIGhhdmUgYmVlbiBkZWZpbmVkIGluIENvcmUgQ29udGVudCBFbGVtZW50cy4gIEl0IHNwZWNpZmllcyBkZXNjcmlwdG9ycyBmb3IgYWRkaXRpb25hbCByb2xlcyB0aGF0IG1heSBwcm92aWRlIGluZm9ybWF0aW9uIG9yIGFzc2lzdGFuY2UgaGVscGZ1bCwgYnV0IG5vdCBtYW5kYXRvcnkgdG8gdGhlIGNvbXBsZXRpb24gb2YgdGhlIFRhc2suICBJbnN0YW5jZXMgb2YgdGhlc2Ugcm9sZXMgd291bGQgbm90IHNob3cgdXAgYXMgc2NoZWR1bGVkIHJlc291cmNlcyBvbiB0aGUgY29ycmVzcG9uZGluZyBwcm9qZWN0IHBsYW4gZ2VuZXJhdGVkIGZyb20gdGhpcyBzdHJ1Y3R1cmUuPC9ib2R5PgotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICA8b3duZWRFbmQgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzQyIiBuYW1lPSJhc3Npc3RzSW4iIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDAwOSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzM0YiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9Ha1dyaHVmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9Ha1dyaGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkRW5kPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjVCIiBuYW1lPSJFeHRlcm5hbElucHV0IiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyNUMgXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDI1RSI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0drV3JpT2ZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyNUIiPgotICAgICAgICAgICAgICA8Ym9keT5UaGlzIGFzc29jaWF0aW9uIGlzIHNwZWNpZmljIHRvIGEgcHJvY2VzcywgaS5lLiBubyBkZWZhdWx0cyB3aWxsIGJlIGRlZmluZWQgaW4gQ29yZSBDb250ZW50IEVsZW1lbnRzLiAgSXQgc3BlY2lmaWVzIGRlc2NyaXB0b3JzIGZvciBXb3JrIFByb2R1Y3RzIHVzZWQgYXMgaW5wdXRzIHRoYXQgYXJlIG5vdCBwcm9kdWNlZCBieSBUYXNrcyB3aXRoaW4gdGhlIHNhbWUgUHJvY2VzcywgYnV0IGJ5IGFub3RoZXIgZXh0ZXJuYWwgcHJvY2VzcyBvciBhbiB1bmtub3duIHNvdXJjZS48L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyNUUiIG5hbWU9ImV4dGVybmFsSW5wdXRUbyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDA5IiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDI1QiI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0drV3JqLWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0drV3JqdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRFbmQ+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwMjAiIG5hbWU9IkltcGFjdHNEZXBlbmRlbmN5IiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwMjEgXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDAyMyI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0drV3JrZWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwMjAiPgotICAgICAgICAgICAgICA8Ym9keT5UaGlzIGFzc29jaWF0aW9uIGlzIHVzZWQgdG8gc2VtaS1mb3JtYWxseSBzcGVjaWZ5IHRyYWNlYWJpbGl0eSByZWxhdGlvbnNoaXBzIGJldHdlZW4gV29yayBQcm9kdWN0cyB3aXRoaW4gdGhlIHNjb3BlIG9mIGFuIEFjdGl2aXR5LiAgQSBsaW5rIGZyb20gb25lIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9yIHRvIGFub3RoZXIgaW5kaWNhdGVzIHRoYXQgb25lIFdvcmsgUHJvZHVjdCBpcyByZXF1aXJlZCBhcyBpbnB1dCB0byBhIFRhc2sgdGhhdCBwcm9kdWNlcyB0aGUgcmVsYXRlZCBXb3JrIFByb2R1Y3QgKCdpbXBhY3RzJyByb2xlIGVuZCkuICBJdCB3b3VsZCBhbHNvIG1lYW4gdGhhdCBhIGNoYW5nZSBvbiBvbmUgV29yayBQcm9kdWN0IGluc3RhbmNlIG1heSBhZmZlY3QgYSBjaGFuZ2Ugb24gdGhlIHJlbGF0ZWQgcHJvZHVjdC48L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxNkQ3NUFBMDA0QiIgbmFtZT0iTWFuZGF0b3J5SW5wdXQiIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQxNkQ3NUFCMDI4MSBfM0FEQzdCNzQwMjJENDE2RDc1QUIwMjk1Ij4KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR2tXcm11ZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNkQ3NUFBMDA0QiI+Ci0gICAgICAgICAgICAgIDxib2R5PlRoaXMgYXNzb2NpYXRpb24gbWFwcyB0byB0aGUgcmVzcGVjdGl2ZSBhc3NvY2lhdGlvbiBpbiBDb3JlIENvbnRlbnQgRWxlbWVudHMuICBJdCBwb2ludHMgdG8gZGVzY3JpcHRvcnMgZm9yIFdvcmsgUHJvZHVjdHMgdGhhdCBhcmUgbWFuZGF0b3J5IGZvciB0aGUgVGFzayB0byBiZSBwZXJmb3JtZWQuPC9ib2R5PgotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICA8b3duZWRFbmQgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDE2RDc1QUIwMjk1IiBuYW1lPSJtYW5kYXRvcnlJbnB1dFRvIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwMDkiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDE2RDc1QUEwMDRCIj4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR2tnY2h1ZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR2tnY2hlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEVuZD4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDE5QyIgbmFtZT0iTW9kaWZpZXMiIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDE5RCBfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTlGIiBpc0Rlcml2ZWQ9InRydWUiPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9Ha2djaU9mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTlDIj4KLSAgICAgICAgICAgICAgPGJvZHk+VGhpcyBkZXJpdmVkIGFzc29jaWF0aW9uIG1hcHMgdG8gdGhlIE1vZGlmaWVzIGFzc29jaWF0aW9uIGRlZmluZWQgYmV0d2VlbiBXb3JrIFByb2R1Y3RzIGFuZCBUYXNrcyBpbiBDb3JlIE1ldGhvZCBDb250ZW50LiAgVGhlIHNhbWUgZGVyaXZhdGlvbiBydWxlIGFzIGZvciB0aGUgY29yZSBjb250ZW50IGVsZW1lbnRzIGFwcGxpZXMuPC9ib2R5PgotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICA8b3duZWRFbmQgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTlGIiBuYW1lPSJfcm9sZURlc2NyaXB0b3IiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDA4QiIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDE5QyI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0drZ2NqLWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0drZ2NqdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRFbmQ+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyMjkiIG5hbWU9Ik9wdGlvbmFsSW5wdXQiIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDIyQSBfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjJDIj4KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR2tnY2tlZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDIyOSI+Ci0gICAgICAgICAgICAgIDxib2R5PlRoaXMgYXNzb2NpYXRpb24gbWFwcyB0byB0aGUgcmVzcGVjdGl2ZSBhc3NvY2lhdGlvbiBpbiBDb3JlIENvbnRlbnQgRWxlbWVudHMuICBJdCBwb2ludHMgdG8gZGVzY3JpcHRvcnMgZm9yIFdvcmsgUHJvZHVjdHMgdGhhdCBhcmUgb3B0aW9uYWwgZm9yIHRoZSBUYXNrIHRvIGJlIHBlcmZvcm1lZC48L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyMkEiIG5hbWU9Ik9wdGlvbmFsSW5wdXRUbyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDA5IiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDIyOSI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0drZ2NsZWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0drZ2NsT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRFbmQ+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyM0QiIG5hbWU9Ik91dHB1dCIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjQ2IF8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyNDgiPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9Ha2djbXVmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjNEIj4KLSAgICAgICAgICAgICAgPGJvZHk+VGhpcyBhc3NvY2lhdGlvbiBtYXBzIHRvIHRoZSByZXNwZWN0aXZlIGFzc29jaWF0aW9uIGluIENvcmUgQ29udGVudCBFbGVtZW50cy4gIEl0IHBvaW50cyB0byBkZXNjcmlwdG9ycyBmb3IgV29yayBQcm9kdWN0cyB0aGF0IGFyZSBvdXRwdXRzIGZvciBwZXJmb3JtaW5nIHRoZSByZWZlcnJlZCBUYXNrLjwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDI0NiIgbmFtZT0ib3V0cHV0RnJvbSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDA5IiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDIzRCI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0drcG1jLWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0drcG1jdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRFbmQ+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwMEMiIG5hbWU9IlBhY2thZ2VkV1AiIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDAwRCBfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDBGIj4KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR2twbWVPZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDAwQyI+Ci0gICAgICAgICAgICAgIDxib2R5PklmIGEgV29yayBQcm9kdWN0IERlc2NyaXB0b3IgcmVmZXJzIGF0IHRoZSAnZGVsaXZlcmFibGUnIHJvbGUgZW5kIHRvIGEgRGVsaXZlcmFibGUgV29yayBQcm9kdWN0IHRoZW4gdGhpcyBhc3NvY2lhdGlvbiBpcyB1c2VkIHRvIHNwZWNpZnkgdGhlIERlbGl2ZXJhYmxlJ3MgV29yayBQcm9kdWN0IHBhcnRzLiAgQXMgaW5kaWNhdGVkIGZvciBEZWxpdmVyYWJsZSBpbiB0aGUgQ29yZSBNZXRob2QgQ29udGVudCBwYWNrYWdlLCB0aGlzIGFzc29jaWF0aW9uIG92ZXJyaWRlcyB0aGUgJ2RlbGl2ZXJlZFdvcmtQcm9kdWN0cycgYXNzb2NpYXRpb24gb2YgdGhlIFdvcmsgUHJvZHVjdCwgd2hpY2ggc3RvcmVzIHRoZSByZWNvbW1lbmRlZCBkZWxpdmVyYWJsZSBwYXJ0cywgYnV0IGNhbiBiZSBjdXN0b21pemVkIGZvciBldmVyeSBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvci4gPC9ib2R5PgotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICA8b3duZWRFbmQgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDBEIiBuYW1lPSJkZWxpdmVyYWJsZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDQ1IiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDAwQyI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0drcG1mT2ZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0drcG1lLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRFbmQ+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzNTMiIG5hbWU9IlByaW1hcnlQZXJmb3JtcyIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzU0IF8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzNTYiPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9Ha3BtZ2VmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzUzIj4KLSAgICAgICAgICAgICAgPGJvZHk+VGhpcyBhc3NvY2lhdGlvbiBtYXBzIHRvIHRoZSByZXNwZWN0aXZlIGFzc29jaWF0aW9uIGluIENvcmUgQ29udGVudCBFbGVtZW50cy4gIEl0IHBvaW50cyB0byBhIGRlc2NyaXB0b3IgZm9yIHRoZSBvbmUgcm9sZSByZXNwb25zaWJsZSBmb3IgdGhlIGNvbXBsZXRpb24gb2YgdGhlIHRhc2suICBBbiBpbnN0YW5jZSBvZiB0aGlzIHJvbGUgd291bGQgc2hvdyB1cCBhcyBhIHNjaGVkdWxlZCByZXNvdXJjZSBvbiBhIGNvcnJlc3BvbmRpbmcgcHJvamVjdCBwbGFuIGdlbmVyYXRlZCBmcm9tIHRoaXMgc3RydWN0dXJlLjwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDM1NiIgbmFtZT0icGVyZm9ybXNBc093bmVyIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwMDkiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzUzIj4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR2twbWlPZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR2twbWgtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEVuZD4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDE3RSIgbmFtZT0iUmVzcG9uc2libGUiIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDE3RiBfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTg4Ij4KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR2twbWl1ZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDE3RSI+Ci0gICAgICAgICAgICAgIDxib2R5PlRoaXMgYXNzb2NpYXRpb24gcmVwcmVzZW50cyByZXNwb25zaWJpbGl0eSBmb3IgV29yayBQcm9kdWN0IGluc3RhbmNlcy4gIEl0IGluZGljYXRlcyBvd25lcnNoaXAgYW5kIGZvciBleGFtcGxlIHdvdWxkIGRlZmluZSB0aGUgUm9sZSB0aGF0IGFuc3dlcnMgdG8gbWFuYWdlbWVudCBxdWVzdGlvbnMgYWJvdXQgdGhlIHF1YWxpdHkgd29yayBwcm9kdWN0LjwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDE4OCIgbmFtZT0icmVzcG9uc2libGVSb2xlIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwOEIiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTdFIj4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR2t6WGR1ZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR2t6WGRlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEVuZD4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxRjA2QkJDMDMwRCIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDFGMDZCQkUwMERGIF8zQURDN0I3NDAyMkQ0MUYwNkJCRTAwRTkiPgotICAgICAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxRjA2QkJFMDBFOSIgbmFtZT0iX2NvbXBvc2l0ZVJvbGUiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQxRjA2QjY1MDBFNiIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQxRjA2QkJDMDMwRCI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0drelhmZWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0drelhmT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRFbmQ+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MjFFOEYwQzAyODEiIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQyMUU4RjBFMDIzNCBfM0FEQzdCNzQwMjJENDIxRThGMEUwMjY2Ij4KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR2t6WGYtZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMUU4RjBDMDI4MSI+Ci0gICAgICAgICAgICAgIDxib2R5PkJyZWFrZG93biBzdHJ1Y3R1cmVzIGFyZSBuZXN0ZWQgc3RydWN0dXJlcyAoc2VlIHN1cGVyQWN0aXZpdGllcyBhc3NvY2lhdGlvbikgcHJlc2VudGVkIG5vcm1hbGx5IGFzIGluZGVudGVkIGxpc3RzLiAgV2l0aGluIHRoaXMgbmVzdGluZyBjaGlsZHJlbiBvbiB0aGUgc2FtZSBsZXZlbCBhcmUgbm90IHNwZWNpZmljYWxseSBvcmRlcmVkLiAgSG93ZXZlciwgYSB1c2VyIG9mIHRoZXNlIGRhdGEgc3RydWN0dXJlcyB3b3VsZCBleHBlY3QgdG8gb3JkZXIgZWxlbWVudHMgd2l0aGluIGEgbGlzdC4gIFRoaXMgYXNzb2NpYXRpb24gaXMgdXNlZCB0byBzdG9yZSB0aGUgcHJlc2VudGF0aW9uIHNlcXVlbmNlIGFtb25nc3QgQnJlYWtkb3duIEVsZW1lbnRzLiAgVGhlIGFzc29jaWF0aW9uIHByZXNlbnRlZEJlZm9yZSBpcyByZWR1bmRhbnQgdG8gdGhlIGFzc29jaWF0aW9uIHByZXNlbnRlZEFmdGVyLiAgVGhpcyByZWR1bmRhbmN5IGlzIHJlcXVpcmVkIHRvIHN1cHBvcnQgUHJvY2VzcyBDb250cmlidXRpb25zIChzZWUgcGx1Z2lucykuPC9ib2R5PgotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICA8b3duZWRFbmQgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDIxRThGMEUwMjY2IiBuYW1lPSJfYnJlYWtkb3duRWxlbWVudCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMEVGIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDIxRThGMEMwMjgxIj4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR2t6WGh1ZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IjEiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR2t6WGhlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEVuZD4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyODBFRDM4MDBBMCIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDI4MEVEMzgwMEExIF8zQURDN0I3NDAyMkQ0MjgwRUQzODAwQTIiPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9Ha3pYaU9mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDI4MEVEMzgwMEEwIj4KLSAgICAgICAgICAgICAgPGJvZHk+VGhlIFdvcmsgT3JkZXIgY2xhc3MgZGVmaW5lcyBwcmVkZWNlc3NvciBhbmQgc3VjY2Vzc29yIHJlbGF0aW9ucyBhbW9uZ3N0IEJyZWFrZG93biBFbGVtZW50cy4gIFRoaXMgYXNzb2NpYXRpb24gbGlua3MgYSBXb3JrIEJyZWFrZG93biBFbGVtZW50IHRvIGl0cyBzdWNjZXNzb3IgV29yayBCcmVha2Rvd24gRWxlbWVudC48L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MjgwRUQzODAwQTIiIG5hbWU9ImxpbmtUb1N1Y2Nlc3NvciIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDEwODE4NzkwMjg4IiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQyODBFRDM4MDBBMCI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0drOUlkdWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0drOUlkZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRFbmQ+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MjgwRUQ0MDAwQ0QiIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQyODBFRDQwMDBDRSBfM0FEQzdCNzQwMjJENDI4MEVENDAwMENGIj4KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR2s5SWVPZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyODBFRDQwMDBDRCI+Ci0gICAgICAgICAgICAgIDxib2R5PlRoaXMgYXNzb2NpYXRpb24gbGlua3MgYSBXb3JrIEJyZWFrZG93biBFbGVtZW50IHRvIGl0cyBwcmVkZWNlc3Nvci4gIEV2ZXJ5IFdvcmsgQnJlYWtkb3duIEVsZW1lbnQgY2FuIGhhdmUgcHJlZGVjZXNzb3IgaW5mb3JtYXRpb24gYXNzb2NpYXRlZCB0byBpdC4gIFNwZWNpZmljIHByZWRlY2Vzc29yIGluZm9ybWF0aW9uIGlzIHN0b3JlZCBpbiBpbnN0YW5jZXMgb2YgdGhlIGNsYXNzIFdvcmsgT3JkZXIsIHdoaWNoIGRlZmluZXMgdGhlIGtpbmQgb2YgcHJlZGVjZXNzb3IgYW5vdGhlciBXb3JrIEJyZWFrZG93biBFbGVtZW50IHJlcHJlc2VudHMgZm9yIGFub3RoZXIuPC9ib2R5PgotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICA8b3duZWRFbmQgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDI4MEVENDAwMENFIiBuYW1lPSJzdWNjIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MjdBOTI1NDAyMjciIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDI4MEVENDAwMENEIj4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR2s5SWZPZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IjEiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR2s5SWUtZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IjEiLz4KLSAgICAgICAgICAgIDwvb3duZWRFbmQ+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6UGFja2FnZSIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGRDg5MUYwMkNEIiBuYW1lPSJQcm9jZXNzVHlwZXMiPgotICAgICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfR21sZ04tZlhFZHVxSG9PSmJVUlpSdyIgc291cmNlPSJ1bWwyLmRpYWdyYW1zIiByZWZlcmVuY2VzPSJfM0FEQzdCNzQwMjJENDFFMTAwN0MwMzFGIj4KLSAgICAgICAgICAgIDxjb250ZW50cyB4bWk6dHlwZT0ibm90YXRpb246RGlhZ3JhbSIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDFFMTAwN0MwMzFGIiB0eXBlPSJDbGFzcyIgbmFtZT0iUHJvY2VzcyI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOE1qLS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOb3RlIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE5MjlFOTkwMjlDIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhNal91ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRGlhZ3JhbU5hbWUiPgotICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4TWpfLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJEZXNjcmlwdGlvbiI+Ci0gICAgICAgICAgICAgICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HOE1qX09mWEVkdXFIb09KYlVSWlJ3IiBmb250TmFtZT0iQXJpYWwiIGZvbnRIZWlnaHQ9IjgiIHVuZGVybGluZT0idHJ1ZSIgZGVzY3JpcHRpb249IkNsYXNzIERpYWdyYW06IFByb2Nlc3NUeXBlcyAvIFByb2Nlc3NCcmVha2Rvd24iIGxpbmVDb2xvcj0iNDE5NDM2OCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c4TWpfZWZYRWR1cUhvT0piVVJaUnciIHg9IjExNzkiIHk9Ijk2MjYiIHdpZHRoPSI0NDQ1IiBoZWlnaHQ9IjExMDkiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4V1V3T2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUUwRkU5MzAwNzciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOFdVdy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HOFdVeE9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTU3NCIgaGVpZ2h0PSI5MDUiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOFdVeGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4V1V4dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhXVXgtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4V1V5T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzhXVXllZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4V1V5dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzhXVXktZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4V1V6T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzhXVXplZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4V1V6dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4V1V6LWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c4V1V3ZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzhXVXd1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iNjY5MCIgeT0iMTAyNyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhXVTBPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDA3NyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4V1UwLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c4V1UxT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIyOTk3IiBoZWlnaHQ9IjkwNSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4V1UxZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhXVTF1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOFdVMS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhXVTJPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOFdVMmVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhXVTJ1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOFdVMi1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhXVTNPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOFdVM2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhXVTN1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzhXVTMtZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzhXVTBlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HOFdVMHVmWEVkdXFIb09KYlVSWlJ3IiB4PSI2NDIwIiB5PSI3NzQ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOFdVLWVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMEU1Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhXVV9PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzhXVV9lZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjQ1MjEiIGhlaWdodD0iOTA1Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhXVV91ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOFdVXy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4V1ZBT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOFdWQWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4V1ZBdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOFdWQS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4V1ZCT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOFdWQmVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4V1ZCdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOFdWQi1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOFdWQ09mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HOFdVLXVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c4V1UtLWZYRWR1cUhvT0piVVJaUnciIHg9IjEyODkiIHk9Ijc3NDciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4V1ZDZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwOUYiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOFdWRE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HOFdWRGVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhXVkR1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOFdWRC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4V1ZFT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOFdWRWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4V1ZFdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOFdWRS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4V1ZGT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOFdWRmVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4V1ZGdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOFdWRi1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOFdWR09mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HOFdWQ3VmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c4V1ZDLWZYRWR1cUhvT0piVVJaUnciIHg9IjY2NTciIHk9IjI4NTMiIHdpZHRoPSIyMTE2IiBoZWlnaHQ9IjMyNzYiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4V1ZWLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwREMiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOFdWV3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HOFdWVy1mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMzExNSIgaGVpZ2h0PSI5MDUiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOFdWWE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4V1ZYZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhXVlh1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4V1ZYLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzhXVllPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4V1ZZZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzhXVll1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4V1ZZLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzhXVlpPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4V1ZaZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4V1ZadWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c4V1ZXT2ZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzhXVldlZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTI5MTQiIHk9Ijc3OTciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MRGlhZ3JhbVN0eWxlIiB4bWk6aWQ9Il9HbWxnT2VmWEVkdXFIb09KYlVSWlJ3IiBkZXNjcmlwdGlvbj0iVGhlIFByb2Nlc3MgVHlwZXMgcGFja2FnZSBjb250YWlucyB0aGUgZGVmaW5pdGlvbiBvZiBQcm9jZXNzLiAgQXMgZGVwaWN0ZWQgaW4gdGhpcyBkaWFncmFtLCBpdCBkaXN0aW5ndWlzaGVzIGRpZmZlcmVudCB0eXBlcyBvZiBwcm9jZXNzZXMgbmVlZGVkIHRvIHJlcHJlc2VudCBidWlsZGluZyBibG9ja3MgZm9yIG90aGVyIHByb2Nlc3NlcyAoQ2FwYWJpbGl0eSBQYXR0ZXJuKSwgY29tcGxldGUgZW5kLXRvLWVuZCBwcm9jZXNzZXMgKERlbGl2ZXJ5IFByb2Nlc3MpLCBvciBwcm9jZXNzZXMgdGhhdCBoYXZlIGJlZW4gcmVkdWNlZCB0byB0aGUgZXNzZW50aWFsIGluZm9ybWF0aW9uIG5lY2Vzc2FyeSBmb3IgZXhwb3J0aW5nIGFuZCBwbGFubmluZyBhIHByb2plY3Qgd2l0aCBhIHRoaXJkLXBhcnR5IHBsYW5uaW5nIHRvb2wgKFByb2Nlc3MgUGxhbm5pbmcgVGVtcGxhdGUpLiAgKE5vdGUsIHRoZSBwYWNrYWdlIE1ldGhvZCBQbHVnLWluIHdpbGwgcHJvdmlkZSBhbm90aGVyIHR5cGUgb2YgUHJvY2VzcyBjYWxsZWQgUHJvY2VzcyBDb250cmlidXRpb24uKSAgVGhlIFByb2Nlc3MgVHlwZXMgcGFja2FnZSBhbHNvIGRlZmluZXMgcHJvY2Vzcy1zcGVjaWZpYyBleHRlbnNpb24gdG8gR3VpZGFuY2UgVHlwZXMgYXMgd2VsbCBDYXRlZ29yaWVzLiAgV2hlcmVhcyB0aGUgQnJlYWtkb3duIHBhY2thZ2UgZGVmaW5lZCB0aGUgYmFzaWMgcGllY2VzIGZvciBkZXNjcmliaW5nIGJyZWFrZG93biBzdHJ1Y3R1cmVzLCB0aGlzIHBhY2thZ2UgdGFrZXMgdGhlc2UgcGllY2VzIGFuZCBwbGFjZXMgdGhlbSBpbnRvIGhpZ2hlciBvcmdhbml6YXRpb24gc3RydWN0dXJlcyBmb3IgYnJlYWtkb3duOiBQcm9jZXNzZXMuICBBIHByb2Nlc3MgaXMgZGVmaW5lZCBhcyBhIHNwZWNpYWwgQWN0aXZpdHkgYW5kIHRoZXJlZm9yZSBjb25zdGl0dXRlcyB0aGUgdG9wLWxldmVsIGVsZW1lbnQgb2YgYSBicmVha2Rvd24uICBIb3dldmVyLCBQcm9jZXNzIGNvbnRhaW5zIHNwZWNpYWwgcHJvcGVydGllcyBhbmQgZXh0ZW5kZWQgc2VtYW50aWNzIHRoYW4gQWN0aXZpdHkuIi8+Ci0gICAgICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c4V1ZHZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTE5QTQwMDAwRTYiIHNvdXJjZT0iX0c4V1UtZWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c4V1ZDZWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOFdWSE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4V1ZIdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOFdWSC1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzhXVkhlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4V1ZJT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTE5QTQwMTAwMkIiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4V1ZJdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c4V1ZJZWZYRWR1cUhvT0piVVJaUnciIHg9Ii02MjMiIHk9IjIyOCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4V1ZJLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxMTlBNDAxMDAyQiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhXVkplZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c4V1ZKT2ZYRWR1cUhvT0piVVJaUnciIHg9Ii00ODciIHk9Ii0zNDciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOFdWSnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTE5QTQwMTAwMTciPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4V1ZLT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzhXVkotZlhFZHVxSG9PSmJVUlpSdyIgeD0iODExIiB5PSIyNzEiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOFdWS2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDExOUE0MDEwMDE3Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOFdWSy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOFdWS3VmWEVkdXFIb09KYlVSWlJ3IiB4PSItMTcxMiIgeT0iLTI1NCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4V1ZMT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTE5QTQwMTAwMkIiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4V1ZMdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4V1ZMLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c4V1ZMZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOFdWTU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTE5QTQwMTAwMTciPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4V1ZNdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4V1ZNLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c4V1ZNZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOFdWTk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxMTlBNDAxMDAyQiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhXVk51ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzhXVk4tZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzhXVk5lZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4V1ZPT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTE5QTQwMTAwMTciPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4V1ZPdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzhXVk8tZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzhXVk9lZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c4V1ZHdWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzhXVkctZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTg3MiwgLTQ1NywgLTUwMzcsIDMyNTFdJFstODcyLCAtNDUyMSwgLTUwMzcsIC04MTJdJFszMTA3LCAtNDUyMSwgLTEwNTgsIC04MTJdIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HOFdWUE9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjhFIiBzb3VyY2U9Il9HOFdVLWVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HOFdWQ2VmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhXVlAtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOFdWUWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhXVlF1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c4V1ZRT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HOFdWUGVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c4V1ZQdWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzkzMSwgLTQ0OCwgLTMyMzQsIDMyNTldJFs5MzEsIC0yNjUwLCAtMzIzNCwgMTA1OF0kWzMxMDcsIC0yNjUwLCAtMTA1OCwgMTA1OF0iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzhXVlEtZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c4V1ZST2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzhXVlJlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDExMCIgc291cmNlPSJfRzhXVTBPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzhXVkNlZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4V1ZTT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhXVlN1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4V1ZTLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HOFdWU2VmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzhXVlJ1ZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HOFdWUi1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMTk0LCAtNDU3LCA4LCAzMjUxXSRbLTE5NCwgLTIwNzQsIDgsIDE2MzRdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c4V1ZUT2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HOFdWVGVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c4V1ZUdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUUwRkVENjAyQUUiIHNvdXJjZT0iX0c4V1ZDZWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c4V1V3T2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOFdWVWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4V1ZVLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOFdWVk9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzhXVlV1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c4V1ZULWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzhXVlVPZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMTE4LCAtMTY0MiwgLTMzLCAyNDIxXSRbMTE4LCAtMzYxNSwgLTMzLCA0NDhdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c4V1ZWZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HOFdWVnVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c4V1ZaLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTE5QTNGMjAyMzgiIHNvdXJjZT0iX0c4V1ZDZWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c4V1ZWLWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOFdWYXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4V1ZiT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOFdWYmVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzhXVmEtZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4ZmVzT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTE5QTNGMzAxRUMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4ZmVzdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c4ZmVzZWZYRWR1cUhvT0piVVJaUnciIHg9Ii0zOTkiIHk9IjMyMiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4ZmVzLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxMTlBM0YzMDFFQyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhmZXRlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c4ZmV0T2ZYRWR1cUhvT0piVVJaUnciIHg9Ii0zMzEiIHk9IjM2NCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4ZmV0dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxMTlBM0YzMDFFMiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhmZXVPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOGZldC1mWEVkdXFIb09KYlVSWlJ3IiB4PSI0OTMiIHk9Ii0xNzciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOGZldWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDExOUEzRjMwMUUyIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOGZldS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOGZldXVmWEVkdXFIb09KYlVSWlJ3IiB4PSItNjI1IiB5PSIzMTQiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOGZldk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDExOUEzRjMwMUVDIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOGZldnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOGZldi1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOGZldmVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhmZXdPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDExOUEzRjMwMUUyIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOGZld3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOGZldy1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOGZld2VmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhmZXhPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTE5QTNGMzAxRUMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4ZmV4dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4ZmV4LWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c4ZmV4ZWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOGZleU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDExOUEzRjMwMUUyIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOGZleXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4ZmV5LWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c4ZmV5ZWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HOFdWYU9mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c4V1ZhZWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzEwNTgsIDExODUsIC01Njk4LCAtMjU3M10kWzI3NjgsIDExODUsIC0zOTg3LCAtMjU3M10kWzI3NjgsIDM3MTYsIC0zOTg3LCAtNDJdJFs1MTk4LCAzNzE2LCAtMTU1NywgLTQyXSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzhmZXpPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDI4RCIgc291cmNlPSJfRzhXVlYtZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzhXVkNlZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4ZmV6LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhmZTBlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4ZmUwdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HOGZlME9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzhmZXplZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HOGZlenVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMjAzLCAtNDQ4LCA2NTUzLCAzMzEwXSRbLTIwMywgLTMyNDIsIDY1NTMsIDUxNl0kWy01Njk4LCAtMzI0MiwgMTA1OCwgNTE2XSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HOGZlMC1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzhmZTFPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICA8L2NvbnRlbnRzPgotICAgICAgICAgICAgPGNvbnRlbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpEaWFncmFtIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTkyOUU5OTAyOUMiIHR5cGU9IkNsYXNzIiBuYW1lPSJQcm9jZXNzQnJlYWtkb3duIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4cFBzT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwRTYiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHBQcy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HOHBQdE9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhwUHRlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHBQdHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4cFB0LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHBQdU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4cFB1ZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHBQdXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4cFB1LWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHBQdk9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4cFB2ZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHBQdnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOHBQdi1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HOHBQc2VmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c4cFBzdWZYRWR1cUhvT0piVVJaUnciIHg9IjkyMjAiIHk9IjExOTYzIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHBQd09mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDMxIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhwUHctZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzhwUHhPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4cFB4ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhwUHh1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHBQeC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhwUHlPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOHBQeWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhwUHl1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOHBQeS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhwUHpPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOHBQemVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhwUHp1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzhwUHotZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzhwUHdlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HOHBQd3VmWEVkdXFIb09KYlVSWlJ3IiB4PSIxNjQ1OSIgeT0iNDk2OSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhwUDBPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDA5RiI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4cFAwLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c4cFAxT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxNjc2IiBoZWlnaHQ9IjkzMSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4cFAxZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhwUDF1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHBQMS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhwUDJPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOHBQMmVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhwUDJ1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOHBQMi1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhwUDNPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOHBQM2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhwUDN1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzhwUDMtZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzhwUDBlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HOHBQMHVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxMzEzMSIgeT0iNjAxIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHBQNE9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMEVGIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhwUDQtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzhwUDVPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4cFA1ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhwUDV1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHBQNS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhwUDZPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOHBQNmVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhwUDZ1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOHBQNi1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhwUDdPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOHBQN2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhwUDd1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzhwUDctZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzhwUDRlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HOHBQNHVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxMjM0NCIgeT0iODgyMiIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhwUC1lZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVEMDNEMyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4cFBfT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c4cFBfZWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHBQX3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4cFBfLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhwUUFPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4cFFBZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzhwUUF1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4cFFBLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzhwUUJPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4cFFCZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzhwUUJ1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4cFFCLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4cFFDT2ZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c4cFAtdWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzhwUC0tZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTI5MDMiIHk9IjUwNzEiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4ekF0T2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUUwRkU5MzAwNzciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHpBdC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HOHpBdU9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTYyNSIgaGVpZ2h0PSI4OTciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHpBdWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4ekF1dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzh6QXUtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4ekF2T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzh6QXZlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4ekF2dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzh6QXYtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4ekF3T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzh6QXdlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4ekF3dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4ekF3LWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c4ekF0ZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dQYXJlbnQ9Ik5hbWUiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzh6QXR1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTIzODkiIHk9IjIxMzYiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4ekExdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwMDkiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHpBMmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HOHpBMnVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzh6QTItZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHpBM09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4ekEzZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHpBM3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4ekEzLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHpBNE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4ekE0ZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHpBNHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4ekE0LWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHpBNU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOHpBNWVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HOHpBMS1mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c4ekEyT2ZYRWR1cUhvT0piVVJaUnciIHg9Ijg2NTIiIHk9IjE1MjMxIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHpBNy1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDQ1Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzh6QTh1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzh6QTgtZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4ekE5T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzh6QTllZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHpBOXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzh6QTktZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOHpBLU9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzh6QS1lZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOHpBLXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzh6QS0tZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOHpBX09mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzh6QV9lZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzh6QV91ZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzh6QThPZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HOHpBOGVmWEVkdXFIb09KYlVSWlJ3IiB4PSIzNTY0IiB5PSIxNTIxNCIgd2lkdGg9IjQ2MzEiIGhlaWdodD0iMTE3NiIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzh6Qkl1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDA4QiI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4ekJKZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c4ekJKdWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHpCSi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4ekJLT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzh6QktlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4ekJLdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzh6QkstZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4ekJMT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzh6QkxlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4ekJMdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzh6QkwtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4ekJNT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4ekJNZWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c4ekJJLWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzh6QkpPZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTI0ODgiIHk9IjE1MTI5Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHpCTXVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDYzIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzh6Qk5lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzh6Qk51ZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4ekJOLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzh6Qk9PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHpCT2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzh6Qk91ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOHpCTy1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzh6QlBPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOHpCUGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzh6QlB1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOHpCUC1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzh6QlFPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzh6QlFlZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzh6Qk0tZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HOHpCTk9mWEVkdXFIb09KYlVSWlJ3IiB4PSIxNjM1NCIgeT0iMTE5OTYiIHdpZHRoPSIyNzA5IiBoZWlnaHQ9IjIyMzUiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4OEs2dWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBOTI1NDAyMjciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HODhLN2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HODhLN3VmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iNDI1MCIgaGVpZ2h0PSIxMDQ5Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzg4SzctZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HODhLOE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4OEs4ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HODhLOHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4OEs4LWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HODhLOU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4OEs5ZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HODhLOXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4OEs5LWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HODhLLU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HODhLLWVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HODhLNi1mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c4OEs3T2ZYRWR1cUhvT0piVVJaUnciIHg9IjExOTQ2IiB5PSI2ODQxIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HODhMRE9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUQwM0NCIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzg4TEQtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzg4TEVPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjIzNTMiIGhlaWdodD0iMTA0OSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4OExFZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzg4TEV1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HODhMRS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzg4TEZPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HODhMRmVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzg4TEZ1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HODhMRi1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzg4TEdPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HODhMR2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzg4TEd1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzg4TEctZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzg4TERlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HODhMRHVmWEVkdXFIb09KYlVSWlJ3IiB4PSI5Nzk1IiB5PSIyOTI5Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HODhMSmVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUQwM0NBIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzg4TEtPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzg4TEtlZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjIzNTMiIGhlaWdodD0iMTA0OSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4OExLdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzg4TEstZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HODhMTE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzg4TExlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HODhMTHVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzg4TEwtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HODhMTU9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzg4TE1lZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HODhMTXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzg4TE0tZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzg4TE5PZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzg4TEp1ZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HODhMSi1mWEVkdXFIb09KYlVSWlJ3IiB4PSIxNTg5MSIgeT0iMjgyNyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxEaWFncmFtU3R5bGUiIHhtaTppZD0iX0dtdlJJZWZYRWR1cUhvT0piVVJaUnciIGRlc2NyaXB0aW9uPSJUaGlzIGRpYWdyYW0gc2hvd3MgdGhlIG1haW4gc3RydWN0dXJlIHVzZWQgdG8gcmVwcmVzZW50IGEgcHJvY2Vzcy4gIEEgcHJvY2VzcyBpcyByZXByZXNlbnRlZCBieSBhIGJyZWFrZG93biBvZiBBY3Rpdml0aWVzLCB3aGljaCBoYXMgIi8+Ci0gICAgICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c4cFA4T2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyOEYiIHNvdXJjZT0iX0c4cFBzT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c4cFA0T2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHBQOC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4cFA5ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHBQOXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzhwUDlPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c4cFA4ZWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HOHBQOHVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9Ils2MDksIC01NDEsIC0zMDQ4LCAyNjA3XSRbMzAyMiwgLTI2MjQsIC02MzUsIDUyNF0iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzhwUDktZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c4cFAtT2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzhwUUNlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRTBGRkQzMDBFRiIgc291cmNlPSJfRzhwUDRPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzhwUC1lZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4cFFET2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhwUUR1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4cFFELWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c4cFFEZWZYRWR1cUhvT0piVVJaUnciIHg9IjY0IiB5PSI2NjgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHBRRU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFMEZGRDMwMEYxIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHBRRXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOHBRRWVmWEVkdXFIb09KYlVSWlJ3IiB4PSItOTgxIiB5PSIyNjIiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHBRRS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRTBGRkQzMDBGMSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhwUUZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c4cFFGT2ZYRWR1cUhvT0piVVJaUnciIHg9IjM2MiIgeT0iLTMxOSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4cFFGdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRTBGRkQzMDBGMCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhwUUdPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOHBRRi1mWEVkdXFIb09KYlVSWlJ3IiB4PSIxMTg1IiB5PSIyMjkiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHBRR2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFMEZGRDMwMEYwIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHBRRy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOHBRR3VmWEVkdXFIb09KYlVSWlJ3IiB4PSItNDY0IiB5PSItMjYzIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhwUUhPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRTBGRkQzMDBGMSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhwUUh1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzhwUUgtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzhwUUhlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4cFFJT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRTBGRkQzMDBGMCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhwUUl1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzhwUUktZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzhwUUllZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4cFFKT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFMEZGRDMwMEYxIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHBRSnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOHBRSi1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOHBRSmVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzh6QXNPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRTBGRkQzMDBGMCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzh6QXN1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOHpBcy1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOHpBc2VmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzhwUUN1ZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HOHBRQy1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMTg3OSwgLTIzOCwgLTE1MDgsIDM1MTldJFstNDQ0NSwgLTIzOCwgLTQwNzQsIDM1MTldJFstNDQ0NSwgLTM2NTIsIC00MDc0LCAxMDVdJFstMTMyMywgLTM2NTIsIC05NTIsIDEwNV0iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c4ekF4T2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUUwRkVENjAyQUUiIHNvdXJjZT0iX0c4cFAwT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c4ekF0T2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHpBeC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4ekF5ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHpBeXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzh6QXlPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c4ekF4ZWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HOHpBeHVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlswLCA0NjUsIDAsIC0xODIwXSRbMCwgMTgyOCwgMCwgLTQ1N10iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzh6QXktZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c4ekF6T2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzh6QTV1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDMwMyIgc291cmNlPSJfRzh6QTF1ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzhwUHNPZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4ekE2ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzh6QTYtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4ekE3T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HOHpBNnVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzh6QTUtZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HOHpBNk9mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlsyOTYsIC01MjQsIC04LCAyNzI2XSRbMjk2LCAtMjcxNywgLTgsIDUzM10iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzh6QTdlZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c4ekE3dWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzh6QV8tZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDAwQyIgc291cmNlPSJfRzh6QTctZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzh6QTctZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4ekJBdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzh6QkJPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4ekJCZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c4ekJBLWZYRWR1cUhvT0piVVJaUnciIHg9Ii04NzYiIHk9IjM5MyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4ekJCdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwMEYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4ekJDT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c4ekJCLWZYRWR1cUhvT0piVVJaUnciIHg9Ii0xMjIiIHk9IjYzNiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4ekJDZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDBGIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHpCQy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzh6QkN1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iNDYyIiB5PSItMzcxIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzh6QkRPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDBEIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHpCRHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c4ekJEZWZYRWR1cUhvT0piVVJaUnciIHg9Ii04NjciIHk9IjE3MSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4ekJELWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwMEQiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4ekJFZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c4ekJFT2ZYRWR1cUhvT0piVVJaUnciIHg9Ii04MDIiIHk9Ii0xMTExIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzh6QkV1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDAwRiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzh6QkZPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzh6QkZlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzh6QkUtZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4ekJGdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDAwRCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzh6QkdPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzh6QkdlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzh6QkYtZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4ekJHdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDBGIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHpCSE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOHpCSGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOHpCRy1mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzh6Qkh1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDAwRCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzh6QklPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOHpCSWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOHpCSC1mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzh6QkFPZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HOHpCQWVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlsxNzcsIDU4NCwgMTc3LCA1ODRdJFsxNzcsIDI0NDYsIDE3NywgMjQ0Nl0kWy0zNDYyLCAyNDQ2LCAtMzQ2MiwgMjQ0Nl0kWy0zNDYyLCAzOTcsIC0zNDYyLCAzOTddJFstMTk5OCwgMzk3LCAtMTk5OCwgMzk3XSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzh6QlF1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDA1MiIgc291cmNlPSJfRzh6Qk11ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzh6Qk11ZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4ekJSZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzh6QlItZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4ekJTT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HOHpCUnVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzh6QlNlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDA1NSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzh6QlMtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzh6QlN1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iNjI3IiB5PSIyIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzh6QlRPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwNTUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4ekJUdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOHpCVGVmWEVkdXFIb09KYlVSWlJ3IiB4PSItNTQ3IiB5PSIyNjAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHpCVC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwNTMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4ekJVZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzh6QlVPZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTgwNyIgeT0iLTI5MCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4ekJVdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwNTMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4ekJWT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c4ekJVLWZYRWR1cUhvT0piVVJaUnciIHg9Ii0xNTEiIHk9IjI0NyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4ekJWZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwNTUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4ekJWLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4ekJXT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c4ekJWdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HODhLb09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwNTMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4OEtvdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4OEtvLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c4OEtvZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HODhLcE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDA1NSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzg4S3B1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzg4S3AtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzg4S3BlZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4OEtxT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwNTMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4OEtxdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzg4S3EtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzg4S3FlZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c4ekJRLWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzh6QlJPZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMTM1NCwgMCwgMTM1NCwgMF0kWzMzOTUsIDAsIDMzOTUsIDBdJFszMzk1LCAtMTkyMSwgMzM5NSwgLTE5MjFdJFsxODYsIC0xOTIxLCAxODYsIC0xOTIxXSRbMTg2LCAtMTExNywgMTg2LCAtMTExN10iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c4OEtyT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwM0UiIHNvdXJjZT0iX0c4ekJNdWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c4cFA0T2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HODhLci1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4OEtzZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HODhLc3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzg4S3NPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c4OEtyZWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HODhLcnVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMTEyNiwgLTExMjYsIDI0MjksIDI0MjldJFstMzAzMSwgLTMwMzEsIDUyNCwgNTI0XSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HODhLcy1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzg4S3RPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HODhLdGVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDNGIiBzb3VyY2U9Il9HOHpCSXVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HOHpCTXVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzg4S3VPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HODhLdXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzg4S3UtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzg4S3VlZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTE3MyIgeT0iLTQ5OSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4OEt2T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwNDIiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4OEt2dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c4OEt2ZWZYRWR1cUhvT0piVVJaUnciIHg9Ii0xMzMiIHk9Ii0yNDUiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HODhLdi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDA0MiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzg4S3dlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c4OEt3T2ZYRWR1cUhvT0piVVJaUnciIHg9IjUyNyIgeT0iMzM5Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzg4S3d1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDQwIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HODhLeE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c4OEt3LWZYRWR1cUhvT0piVVJaUnciIHg9Ii0yIiB5PSIyMTMiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HODhLeGVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDA0MCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzg4S3gtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzg4S3h1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTY3IiB5PSItMzQ2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzg4S3lPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDA0MiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzg4S3l1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzg4S3ktZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzg4S3llZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4OEt6T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDA0MCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzg4S3p1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzg4S3otZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzg4S3plZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4OEswT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDQyIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HODhLMHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HODhLMC1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HODhLMGVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzg4SzFPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDA0MCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzg4SzF1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HODhLMS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HODhLMWVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzg4S3R1ZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HODhLdC1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlsxNTA4LCAtMjcsIC0yMTk2LCAyMzAyXSRbMzU0NSwgLTI3LCAtMTU5LCAyMzAyXSRbMzU0NSwgLTEyMTcsIC0xNTksIDExMTJdIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HODhLMk9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTYwIiBzb3VyY2U9Il9HOHpCSXVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HOHBQc09mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzg4SzItZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HODhLM2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzg4SzN1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c4OEszT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HODhLMmVmWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzg4SzJ1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTU2NywgLTUyNCwgMjg4NywgMjYyNF0kWy0yODcwLCAtMjYxNiwgNTg0LCA1MzNdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c4OEszLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HODhLNE9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c4OEs0ZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzRDYiIHNvdXJjZT0iX0c4ekE3LWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c4cFBzT2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HODhLNU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4OEs1dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HODhLNS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzg4SzVlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c4OEs0dWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HODhLNC1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9Ils3MjgsIC01OTIsIC0zNDM3LCAyNzA5XSRbMzQ3MSwgLTI3NjgsIC02OTQsIDUzM10iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzg4SzZPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c4OEs2ZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzg4Sy11ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E5MjgyMDM5MiIgc291cmNlPSJfRzhwUC1lZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzg4SzZ1ZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4OEtfZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzg4S18tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4OExBT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HODhLX3VmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzg4Sy0tZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HODhLX09mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlswLCA1MTYsIC0xMDEsIC0xMjYxXSRbMCwgMTI1MywgLTEwMSwgLTUyNF0iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzg4TEFlZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c4OExBdWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzg4TEEtZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyOENEMzIzMDE5QSIgc291cmNlPSJfRzg4SzZ1ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzhwUDRPZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4OExCdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzg4TENPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4OExDZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HODhMQi1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzg4TEJPZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HODhMQmVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMjM4LCAzMTgsIC0yMTIsIC0xNjY3XSRbLTIzOCwgMTY2NywgLTIxMiwgLTMxOF0iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzg4TEN1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c4OExDLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzg4TEhPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDJBMCIgc291cmNlPSJfRzg4TERPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzhwUC1lZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4OExILWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzg4TEllZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4OExJdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HODhMSU9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzg4TEhlZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c4OExIdWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzcyOCwgNTI0LCAtMjI2OSwgLTE2MDhdJFsyMjYwLCAxNjA4LCAtNzM2LCAtNTI0XSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HODhMSS1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzg4TEpPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HODhMTmVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMjlGIiBzb3VyY2U9Il9HODhMSmVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HOHBQLWVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzg4TE9PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HODhMT3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzg4TE8tZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c4OExPZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HODhMTnVmWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzg4TE4tZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTc1MywgNTI0LCAyMzQ1LCAtMTcxMF0kWy0yMzg3LCAxNzEwLCA3MTEsIC01MjRdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c4OExQT2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HODhMUGVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c4OExQdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MkIxRUMxQjAzNDkiIHNvdXJjZT0iX0c4cFB3T2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c4OEs2dWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HODhMUWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4OExRLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HODhMUk9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzg4TFF1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c4OExQLWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HODhMUU9mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstOTY1LCA1MTYsIDI0ODksIC0xMzYzXSRbLTI1MDYsIDEzNDYsIDk0OCwgLTUzM10iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzg4TFJlZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c4OExSdWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgPC9jb250ZW50cz4KLSAgICAgICAgICAgIDxjb250ZW50cyB4bWk6dHlwZT0ibm90YXRpb246RGlhZ3JhbSIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGNUY2NzgwMDQ1IiB0eXBlPSJDbGFzcyIgbmFtZT0iUHJvY2Vzc0d1aWRhbmNlIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5RjdvT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwOUYiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOUY3by1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HOUY3cE9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTY3NiIgaGVpZ2h0PSI5MTQiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOUY3cGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5RjdwdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlGN3AtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5RjdxT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlGN3FlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5RjdxdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlGN3EtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5RjdyT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlGN3JlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5RjdydWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5RjdyLWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c5RjdvZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzlGN291ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTQ0NyIgeT0iMTMxNTciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5RjcwT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwNzciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOUY3MC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HOUY3MU9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlGNzFlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOUY3MXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5RjcxLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOUY3Mk9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5RjcyZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOUY3MnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5RjcyLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOUY3M09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5RjczZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOUY3M3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOUY3My1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HOUY3MGVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c5RjcwdWZYRWR1cUhvT0piVVJaUnciIHg9IjgxMiIgeT0iMTUxMTMiIGhlaWdodD0iMTY2NyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlGNzRPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDFDMiI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5UEZrdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c5UEZrLWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVBGbE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5UEZsZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlQRmx1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5UEZsLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlQRm1PZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5UEZtZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlQRm11ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5UEZtLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlQRm5PZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5UEZuZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5UEZudWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c5UEZrT2ZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzlQRmtlZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTEzNDYiIHk9IjEwMTYxIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVBGbi1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTlFODYwMTdFIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlQRm91ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzlQRm8tZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjE2NTkiIGhlaWdodD0iOTA1Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlQRnBPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVBGcGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5UEZwdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVBGcC1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5UEZxT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVBGcWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5UEZxdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVBGcS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5UEZyT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVBGcmVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOVBGcnVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HOVBGb09mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c5UEZvZWZYRWR1cUhvT0piVVJaUnciIHg9IjExMTU5IiB5PSI4NjQ0Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVBGdU9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMUMxIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlQRnUtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzlQRnZPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5UEZ2ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlQRnZ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVBGdi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlQRndPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOVBGd2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlQRnd1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOVBGdy1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlQRnhPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOVBGeGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlQRnh1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlQRngtZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzlQRnVlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMTI2MzIyNTYiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzlQRnV1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTExOTIiIHk9IjExNDgwIiB3aWR0aD0iNDMzNiIgaGVpZ2h0PSI1MzkzIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVBHRHVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMTlBIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlQR0VlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzlQR0V1ZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjI5MjkiIGhlaWdodD0iMTAzMiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5UEdFLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlQR0ZPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVBHRmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlQR0Z1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOVBHRi1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlQR0dPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOVBHR2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlQR0d1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOVBHRy1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlQR0hPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlQR0hlZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzlQR0QtZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMTI2MzIyNTYiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzlQR0VPZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTExODQiIHk9IjI1MzEiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5UEdIdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxOTkiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVBHSWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HOVBHSXVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMjkyOSIgaGVpZ2h0PSIxMDMyIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlQR0ktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVBHSk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5UEdKZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVBHSnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5UEdKLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVBHS09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5UEdLZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVBHS3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5UEdLLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVBHTE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOVBHTGVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HOVBHSC1mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIxMjYzMjI1NiIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HOVBHSU9mWEVkdXFIb09KYlVSWlJ3IiB4PSIxMTE4NCIgeT0iMzc1MCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlQR0x1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDFBMyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5UEdNZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c5UEdNdWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIyOTI5IiBoZWlnaHQ9IjEwMzIiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVBHTS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5UEdOT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlQR05lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5UEdOdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlQR04tZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5UEdPT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlQR09lZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5WTJrT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlZMmtlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5WTJrdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5WTJrLWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c5UEdMLWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjEyNjMyMjU2IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c5UEdNT2ZYRWR1cUhvT0piVVJaUnciIHg9IjExMTg0IiB5PSI0OTY5Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVkybE9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMUE0Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlZMmwtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzlZMm1PZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjI5MjkiIGhlaWdodD0iMTAzMiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5WTJtZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlZMm11ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVkybS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlZMm5PZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOVkybmVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlZMm51ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOVkybi1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlZMm9PZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOVkyb2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlZMm91ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlZMm8tZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzlZMmxlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMTI2MzIyNTYiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzlZMmx1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTExODQiIHk9IjYxODkiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5WTJwT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjEzQzkxMzAyQzUiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVkycC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HOVkycU9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMjkyOSIgaGVpZ2h0PSIxMDMyIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlZMnFlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVkycXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5WTJxLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVkyck9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5WTJyZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVkycnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5WTJyLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVkyc09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5WTJzZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVkyc3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOVkycy1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HOVkycGVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIxMjYzMjI1NiIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HOVkycHVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxMTE4NCIgeT0iNzQwOCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlZMnRPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRTBGRTkzMDA3NyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5WTJ0LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c5WTJ1T2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVkydWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5WTJ1dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlZMnUtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5WTJ2T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlZMnZlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5WTJ2dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlZMnYtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5WTJ3T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlZMndlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5WTJ3dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5WTJ3LWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c5WTJ0ZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzlZMnR1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTEwMCIgeT0iMjUwNiIgd2lkdGg9IjIzNzkiIGhlaWdodD0iOTYyNiIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxEaWFncmFtU3R5bGUiIHhtaTppZD0iX0dtdlJJLWZYRWR1cUhvT0piVVJaUnciIGRlc2NyaXB0aW9uPSJUaGlzIGRpYWdyYW0gcHJvdmlkZXMgYW4gb3ZlcnZpZXcgdG8gdGhlIGRpZmZlcmVudCBQcm9jZXNzLXNwZWNpZmljIEd1aWRhbmNlIFR5cGVzIGFkZGVkIHRvIHRoZSBHdWlkYW5jZSBUeXBlcyBhbHJlYWR5IGRlZmluZWQgaW4gQ29yZSBNZXRob2QgQ29udGVudCBmb3IgUHJvY2Vzc2VzLiIvPgotICAgICAgICAgICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HOVBGeU9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTFBIiBzb3VyY2U9Il9HOVBGdU9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HOUY3ME9mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlQRnktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVBGemVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlQRnp1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c5UEZ6T2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVBGei1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTFEIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVBGMGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOVBGME9mWEVkdXFIb09KYlVSWlJ3IiB4PSItNzMyIiB5PSItNDU3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlQRjB1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxMUQiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5UEYxT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOVBGMC1mWEVkdXFIb09KYlVSWlJ3IiB4PSI5NzgiIHk9IjI4OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5UEYxZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDExQiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlQRjEtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOVBGMXVmWEVkdXFIb09KYlVSWlJ3IiB4PSI3NDIiIHk9Ii00NTciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVBGMk9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDExQiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlQRjJ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzlQRjJlZlhFZHVxSG9PSmJVUlpSdyIgeD0iMzYxIiB5PSIzNDciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVBGMi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTFEIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVBGM2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOVBGM3VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOVBGM09mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlQRjMtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTFCIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVBGNGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOVBGNHVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOVBGNE9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlQRjQtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxMUQiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5UEY1ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5UEY1dWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c5UEY1T2ZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVBGNS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTFCIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVBGNmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5UEY2dWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c5UEY2T2ZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HOVBGeWVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c5UEZ5dWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0xNTA3LCAyNDEzLCA4OTA2LCA1ODRdJFstODk0MCwgMjQxMywgMTQ3MywgNTg0XSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzlQRjYtZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDEyRSIgc291cmNlPSJfRzlQRnVPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzlGNzBPZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5UEY3dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlQRjhPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5UEY4ZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HOVBGNy1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlQRjh1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDEzMSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlQRjlPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzlQRjgtZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTczMiIgeT0iLTQ1NyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5UEY5ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTMxIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVBGOS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzlQRjl1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTIwNiIgeT0iMzM4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlQRi1PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTJGIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVBGLXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c5UEYtZWZYRWR1cUhvT0piVVJaUnciIHg9Ijc0MiIgeT0iLTQ1NyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5UEYtLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTJGIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVBGX2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOVBGX09mWEVkdXFIb09KYlVSWlJ3IiB4PSIzNjEiIHk9IjM0NyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5UEZfdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxMzEiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5UEdBT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5UEdBZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c5UEZfLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVBHQXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxMkYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5UEdCT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5UEdCZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c5UEdBLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVBHQnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDEzMSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlQR0NPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlQR0NlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzlQR0ItZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5UEdDdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxMkYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5UEdET2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlQR0RlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzlQR0MtZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c5UEY3T2ZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzlQRjdlZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTIxNzAsIDk3OSwgODgzNywgLTI5MV0kWy05NDQ2LCA5NzksIDE1NjEsIC0yOTFdIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HOVkyeE9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGRDU2MUEwMzk2IiBzb3VyY2U9Il9HOVkydE9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HOUY3NE9mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlZMngtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVkyeWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlZMnl1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c5WTJ5T2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVkyeS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGRDU2MUMwMDc5Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVkyemVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOVkyek9mWEVkdXFIb09KYlVSWlJ3IiB4PSItOTE5IiB5PSIzMDUiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVkyenVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRkQ1NjFDMDA3OSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlZMjBPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c5WTJ6LWZYRWR1cUhvT0piVVJaUnciIHg9Ii00MDMiIHk9Ii0xOTQiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVkyMGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEZENTYxQzAwNjUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5WTIwLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzlZMjB1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iNjY0IiB5PSIyODAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVkyMU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGRDU2MUMwMDY1Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVkyMXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOVkyMWVmWEVkdXFIb09KYlVSWlJ3IiB4PSI1NSIgeT0iLTIyMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5WTIxLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEZENTYxQzAwNzkiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5WTIyZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5WTIydWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c5WTIyT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVkyMi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEZENTYxQzAwNjUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5WTIzZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5WTIzdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c5WTIzT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVkyMy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRkQ1NjFDMDA3OSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlZMjRlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlZMjR1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzlZMjRPZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5WTI0LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEZENTYxQzAwNjUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5WTI1ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlZMjV1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzlZMjVPZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c5WTJ4ZWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzlZMnh1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMTE4NSwgMzMzNSwgLTg2MTksIDg0XSRbODgyMiwgMzMzNSwgLTk4MiwgODRdIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HOVkyNS1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTlFRkUwMUNBIiBzb3VyY2U9Il9HOVBGbi1mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HOVkydE9mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlZMjZ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVkyN09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlZMjdlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c5WTI2LWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVkyN3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTlFRkYwMUE0Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVkyOE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOVkyNy1mWEVkdXFIb09KYlVSWlJ3IiB4PSItOTQyIiB5PSItMjQ1Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlZMjhlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTlFRkYwMUE0Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVkyOC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzlZMjh1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTM5NyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5WTI5T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E5RUZGMDE5QSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlZMjl1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOVkyOWVmWEVkdXFIb09KYlVSWlJ3IiB4PSI2ODkiIHk9Ii0yNDUiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVkyOS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTlFRkYwMTlBIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVkyLWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOVkyLU9mWEVkdXFIb09KYlVSWlJ3IiB4PSItNjgzIiB5PSIxOTUiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVkyLXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTlFRkYwMUE0Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVkyX09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOVkyX2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOVkyLS1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlZMl91ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTlFRkYwMTlBIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVkzQU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOVkzQWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOVkyXy1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlZM0F1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBOUVGRjAxQTQiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5WTNCT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5WTNCZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c5WTNBLWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVkzQnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTlFRkYwMTlBIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVkzQ09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5WTNDZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c5WTNCLWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HOVkyNk9mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c5WTI2ZWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy04MjksIDAsIDg4NzMsIDE3NzhdJFstODUxNywgMCwgMTE4NSwgMTc3OF0iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c5WTNDdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBOUY1MDAzMjUiIHNvdXJjZT0iX0c5WTJ0T2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c5UEZ1T2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVkzRGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5WTNELWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVkzRU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzlZM0R1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5WTNFZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBOUY1MjAwNDUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5WTNFLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c5WTNFdWZYRWR1cUhvT0piVVJaUnciIHg9Ii03NzAiIHk9IjMwNSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5WTNGT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E5RjUyMDA0NSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlZM0Z1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c5WTNGZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0zOTciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVkzRi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBOUY1MjAwNDMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5WTNHZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzlZM0dPZlhFZHVxSG9PSmJVUlpSdyIgeD0iNzE5IiB5PSIzMDUiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVkzR3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTlGNTIwMDQzIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVkzSE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOVkzRy1mWEVkdXFIb09KYlVSWlJ3IiB4PSItNjUyIiB5PSItMjQ2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlZM0hlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E5RjUyMDA0NSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlZM0gtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlZM0lPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzlZM0h1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5WTNJZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E5RjUyMDA0MyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlZM0ktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlZM0pPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzlZM0l1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5WTNKZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTlGNTIwMDQ1Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVkzSi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOVkzS09mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOVkzSnVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlZM0tlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E5RjUyMDA0MyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlZM0stZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOVkzTE9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOVkzS3VmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzlZM0MtZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HOVkzRE9mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlsxMTg1LCA0NjMxLCAtOTIyOCwgLTIyMjZdJFs4OTA2LCA0NjMxLCAtMTUwNywgLTIyMjZdIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HOVkzTGVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTlGOEMwMEM1IiBzb3VyY2U9Il9HOVkydE9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HOVBHRHVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlZM01PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVkzTXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlZM00tZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c5WTNNZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVkzTk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTlGOEQwMDFEIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVkzTnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOVkzTmVmWEVkdXFIb09KYlVSWlJ3IiB4PSItODU0IiB5PSIyOTUiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVkzTi1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBOUY4RDAwMUQiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5WTNPZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOVkzT09mWEVkdXFIb09KYlVSWlJ3IiB5PSItMzk3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlZM091ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTlGOEQwMDEzIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVkzUE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c5WTNPLWZYRWR1cUhvT0piVVJaUnciIHg9Ijc1MiIgeT0iMjk1Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlZM1BlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E5RjhEMDAxMyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlZM1AtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzlZM1B1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTc4IiB5PSItMTg3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlZM1FPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E5RjhEMDAxRCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlpbmtPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlpbmtlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzlZM1FlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5aW5rdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E5RjhEMDAxMyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlpbmxPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlpbmxlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzlpbmstZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5aW5sdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTlGOEQwMDFEIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOWlubU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOWlubWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOWlubC1mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlpbm11ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E5RjhEMDAxMyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlpbm5PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOWlubmVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOWlubS1mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzlZM0x1ZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HOVkzTC1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlsxMTg1LCAtNDI3NSwgLTkxNzcsIC04XSRbODg5OCwgLTQyNzUsIC0xNDY0LCAtOF0iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c5aW5udWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBOUY5MDAyNTIiIHNvdXJjZT0iX0c5WTJ0T2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c5UEdIdWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOWlub2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5aW5vLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOWlucE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzlpbm91ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5aW5wZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBOUY5MTAxQjQiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5aW5wLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c5aW5wdWZYRWR1cUhvT0piVVJaUnciIHg9Ii05MzAiIHk9IjI5NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5aW5xT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E5RjkxMDFCNCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlpbnF1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c5aW5xZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0zOTciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOWlucS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBOUY5MTAxQTkiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5aW5yZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzlpbnJPZlhFZHVxSG9PSmJVUlpSdyIgeD0iNzYwIiB5PSIyOTYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOWlucnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTlGOTEwMUE5Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOWluc09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOWluci1mWEVkdXFIb09KYlVSWlJ3IiB4PSItMTAiIHk9Ii0yNDYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOWluc2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTlGOTEwMUI0Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOWlucy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOWludE9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOWluc3VmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlpbnRlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTlGOTEwMUE5Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOWludC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOWludU9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOWludHVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlpbnVlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBOUY5MTAxQjQiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5aW51LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5aW52T2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c5aW51dWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOWludmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTlGOTEwMUE5Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOWludi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5aW53T2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c5aW52dWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HOWlubi1mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c5aW5vT2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzExODUsIC0zMDQ4LCAtOTE3NywgMF0kWzg4OTgsIC0zMDQ4LCAtMTQ2NCwgMF0iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c5aW53ZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBOUY5NDAzQjciIHNvdXJjZT0iX0c5WTJ0T2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c5UEdMdWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOWlueE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5aW54dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOWlueC1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzlpbnhlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5aW55T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBOUY5NTAzMkMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5aW55dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c5aW55ZWZYRWR1cUhvT0piVVJaUnciIHg9Ii05MDUiIHk9IjMxMiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5aW55LWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E5Rjk1MDMyQyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlpbnplZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c5aW56T2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0zOTciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOWluenVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBOUY5NTAzMjIiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5aW4wT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzlpbnotZlhFZHVxSG9PSmJVUlpSdyIgeD0iNzAxIiB5PSIyODciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOWluMGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTlGOTUwMzIyIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOWluMC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOWluMHVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxMDgiIHk9Ii0yODAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOWluMU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTlGOTUwMzJDIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOWluMXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOWluMS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOWluMWVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlpbjJPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTlGOTUwMzIyIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOWluMnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOWluMi1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOWluMmVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlpbjNPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBOUY5NTAzMkMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5aW4zdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5aW4zLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c5aW4zZWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOWluNE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTlGOTUwMzIyIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOWluNHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5aW40LWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c5aW40ZWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HOWlud3VmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c5aW53LWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzExODUsIC0xODI4LCAtOTE3NywgMF0kWzg4OTgsIC0xODI4LCAtMTQ2NCwgMF0iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c5aW41T2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBOUY5OTAzODMiIHNvdXJjZT0iX0c5WTJ0T2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c5WTJsT2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOWluNS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5aW42ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOWluNnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzlpbjZPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5aW42LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBOUY5QTAyRTQiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5aW43ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c5aW43T2ZYRWR1cUhvT0piVVJaUnciIHg9Ii04NzkiIHk9IjM2MyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5aW43dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E5RjlBMDJFNCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlpbjhPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c5aW43LWZYRWR1cUhvT0piVVJaUnciIHk9Ii0zOTciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOWluOGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBOUY5QTAyREEiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5aW44LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzlpbjh1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iNjc1IiB5PSIyNjIiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOWluOU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTlGOUEwMkRBIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOWluOXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOWluOWVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxMjUiIHk9Ii0zNDAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOWluOS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTlGOUEwMkU0Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOWluLWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOWluLXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOWluLU9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlpbi0tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTlGOUEwMkRBIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOWluX2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOWluX3VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOWluX09mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlpbl8tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBOUY5QTAyRTQiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5aW9BZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5aW9BdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c5aW9BT2ZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOWlvQS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTlGOUEwMkRBIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOWlvQmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5aW9CdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c5aW9CT2ZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HOWluNWVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c5aW41dWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzExODUsIC02MDksIC05MTc3LCAwXSRbODg5OCwgLTYwOSwgLTE0NjQsIDBdIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HOWlvQi1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTlGOUUwMTc4IiBzb3VyY2U9Il9HOVkydE9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HOVkycE9mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlpb0N1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOWlvRE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlpb0RlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c5aW9DLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOWlvRHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E5RjlGMDA4QiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlpb0VPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzlpb0QtZlhFZHVxSG9PSmJVUlpSdyIgeT0iMzk2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlpb0VlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTlGOUYwMDhCIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOWlvRS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzlpb0V1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTM5NyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5aW9GT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E5RjlGMDA4OSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlpb0Z1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOWlvRmVmWEVkdXFIb09KYlVSWlJ3IiB4PSI3NjAiIHk9IjI2MyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5aW9GLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBOUY5RjAwODkiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5aW9HZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c5aW9HT2ZYRWR1cUhvT0piVVJaUnciIHg9Ii0yOTAiIHk9Ii0yODgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOWlvR3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTlGOUYwMDhCIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOWlvSE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOWlvSGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOWlvRy1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlpb0h1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTlGOUYwMDg5Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOWlvSU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOWlvSWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOWlvSC1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlpb0l1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBOUY5RjAwOEIiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5aW9KT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5aW9KZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c5aW9JLWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOWlvSnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTlGOUYwMDg5Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOWlvS09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5aW9LZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c5aW9KLWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HOWlvQ09mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c5aW9DZWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzExODUsIDYwOSwgLTkxNzcsIDBdJFs4ODk4LCA2MDksIC0xNDY0LCAwXSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzlpb0t1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRTBGRUQ2MDJBRSIgc291cmNlPSJfRzlGN29PZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzlZMnRPZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5aW9MZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlpb0wtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5aW9NT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HOWlvTHVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzlpb0stZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HOWlvTE9mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9Ils4NCwgLTQ2NSwgODQsIDU4MzNdJFs4NCwgLTE0OTgsIDg0LCA0ODAwXSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HOWlvTWVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzlpb011ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HOWlvTS1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTEwIiBzb3VyY2U9Il9HOUY3ME9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HOUY3b09mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlpb051ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOWlvT09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlpb09lZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c5aW9OLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HOWlvTk9mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c5aW9OZWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy01MywgLTMxOCwgLTUzLCAxNjQwXSRbLTUzLCAtMTY0MSwgLTUzLCAzMTddIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c5aW9PdWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HOWlvTy1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgIDwvY29udGVudHM+Ci0gICAgICAgICAgICA8Y29udGVudHMgeG1pOnR5cGU9Im5vdGF0aW9uOkRpYWdyYW0iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyMTI0QkNEMDMxQSIgdHlwZT0iQ2xhc3MiIG5hbWU9IlJlZmVyZW5jZVdvcmtmbG93cyI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOXJ4a09mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDlGIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlyeGstZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzlyeGxPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjE3MjciIGhlaWdodD0iOTA1Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlyeGxlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOXJ4bHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5cnhsLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOXJ4bU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5cnhtZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOXJ4bXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5cnhtLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOXJ4bk9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5cnhuZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOXJ4bnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOXJ4bi1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HOXJ4a2VmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c5cnhrdWZYRWR1cUhvT0piVVJaUnciIHg9Ijc2MDgiIHk9IjM0ODciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5cnhvT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUUwRkU5MzAwNzciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOXJ4by1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HOXJ4cE9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTU3NCIgaGVpZ2h0PSI5MDUiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOXJ4cGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5cnhwdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlyeHAtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5cnhxT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlyeHFlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5cnhxdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlyeHEtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5cnhyT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlyeHJlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5cnhydWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5cnhyLWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c5cnhvZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzlyeG91ZlhFZHVxSG9PSmJVUlpSdyIgeD0iNzY4NCIgeT0iMTY1OCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlyeHVlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMTI0QkVFMDBEQyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5cnh2T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c5cnh2ZWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxODYyIiBoZWlnaHQ9IjkwNSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5cnh2dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlyeHYtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOXJ4d09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlyeHdlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOXJ4d3VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlyeHctZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOXJ4eE9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlyeHhlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOXJ4eHVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlyeHgtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlyeHlPZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzlyeHV1ZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HOXJ4dS1mWEVkdXFIb09KYlVSWlJ3IiB4PSI5MzYiIHk9IjE3NjAiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5cng5ZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwREMiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOXJ4LU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HOXJ4LWVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMzExNSIgaGVpZ2h0PSI5MDUiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOXJ4LXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5cngtLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlyeF9PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5cnhfZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlyeF91ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5MWlnT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzkxaWdlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5MWlndWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzkxaWctZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5MWloT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5MWloZWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c5cng5dWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzlyeDktZlhFZHVxSG9PSmJVUlpSdyIgeD0iNjkxMyIgeT0iNTYyMSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxEaWFncmFtU3R5bGUiIHhtaTppZD0iX0dtdlJKZWZYRWR1cUhvT0piVVJaUnciIGRlc2NyaXB0aW9uPSJUaGlzIGRpYWdyYW0gc2hvd3MgaG93IHRoZSBjYXRlZ29yeSBkaXNjaXBsaW5lIGhhcyBiZWVuIGV4dGVuZGVkIGluIHRoaXMgcGFja2FnZSB3aXRoIGFuIGFkZGl0b25hbCBhc3NvY2F0aW9uIHRvIEFjdGl2aXR5IHByb3ZpZGluZyBzdGFuZGFyZCBvciByZWZlcmVuY2Ugd2F5cyBvZiBkb2luZyB0aGUgd29yayBkZXNjcmliZWQgYnkgdGhlIERpc2NpcGxpbmUuIi8+Ci0gICAgICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c5cnhzT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUUwRkVENjAyQUUiIHNvdXJjZT0iX0c5cnhrT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c5cnhvT2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOXJ4cy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5cnh0ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOXJ4dHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzlyeHRPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c5cnhzZWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HOXJ4c3VmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlswLCAtNDU3LCAwLCAxMzcxXSRbMCwgLTEzODAsIDAsIDQ0OF0iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzlyeHQtZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c5cnh1T2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzlyeDB1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMTI0QzNBMDI0RSIgc291cmNlPSJfRzlyeHVlZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzlyeG9PZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5cngxZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlyeDEtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5cngyT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HOXJ4MXVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlyeDJlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMTI0QzNCMDEzNyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlyeDItZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzlyeDJ1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iNDYiIHk9IjMwNCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5cngzT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMTI0QzNCMDEzNyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlyeDN1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c5cngzZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0zOTciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOXJ4My1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjEyNEMzQjAxMEYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5cng0ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzlyeDRPZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTMiIHk9IjI5NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5cng0dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjEyNEMzQjAxMEYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5cng1T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c5cng0LWZYRWR1cUhvT0piVVJaUnciIHg9Ii0xMTU1IiB5PSItMjIxIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlyeDVlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMTI0QzNCMDEzNyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlyeDUtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlyeDZPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzlyeDV1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5cng2ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMTI0QzNCMDEwRiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlyeDYtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlyeDdPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzlyeDZ1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5cng3ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxMjRDM0IwMTM3Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOXJ4Ny1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOXJ4OE9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOXJ4N3VmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlyeDhlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMTI0QzNCMDEwRiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlyeDgtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOXJ4OU9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOXJ4OHVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzlyeDAtZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HOXJ4MU9mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9Ils5MzEsIC0yNSwgLTU2NzIsIDc2XSRbNTgxNiwgLTI1LCAtNzg3LCA3Nl0iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c5MWlodWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyOEQiIHNvdXJjZT0iX0c5cng5ZWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c5cnhrT2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOTFpaWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5MWlpLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOTFpak9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzkxaWl1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c5MWloLWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HOTFpaU9mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlswLCAtNDU3LCAwLCAxNjc2XSRbMCwgLTE2ODQsIDAsIDQ0OF0iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzkxaWplZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c5MWlqdWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgPC9jb250ZW50cz4KLSAgICAgICAgICAgIDxjb250ZW50cyB4bWk6dHlwZT0ibm90YXRpb246RGlhZ3JhbSIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDI4M0NFOUYwMjkxIiB0eXBlPSJDbGFzcyIgbmFtZT0iUHJvY2Vzc1dvcmtEZWZpbml0aW9uIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5MWlxT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBOTI1NDAyMjciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOTFpcS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HOTFpck9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iNDI2NyIgaGVpZ2h0PSIxMDMyIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzkxaXJlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOTFpcnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5MWlyLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOTFpc09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5MWlzZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOTFpc3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5MWlzLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOTFpdE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5MWl0ZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOTFpdHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOTFpdC1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HOTFpcWVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c5MWlxdWZYRWR1cUhvT0piVVJaUnciIHg9IjUxMzAiIHk9IjMzNDQiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5MWl1T2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RDAzQ0EiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOTFpdS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HOTFpdk9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMjMxOSIgaGVpZ2h0PSIxMDMyIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzkxaXZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOTFpdnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5MWl2LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOTFpd09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5MWl3ZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOTFpd3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5MWl3LWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOTFpeE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5MWl4ZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOTFpeHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOTFpeC1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HOTFpdWVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c5MWl1dWZYRWR1cUhvT0piVVJaUnciIHg9IjI4NTMiIHk9Ijc2MDgiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5MWl5T2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RDAzQ0IiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOTFpeS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HOTFpek9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMjMxOSIgaGVpZ2h0PSIxMDMyIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzkxaXplZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOTFpenVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5MWl6LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOTFpME9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5MWkwZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOTFpMHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5MWkwLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOTFpMU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5MWkxZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOTFpMXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOTFpMS1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HOTFpeWVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c5MWl5dWZYRWR1cUhvT0piVVJaUnciIHg9IjMxNyIgeT0iNzYwOCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzkxaTJPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDAwOSI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5MWkyLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c5MWkzT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIyNzI2IiBoZWlnaHQ9IjEwMzIiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOTFpM2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5MWkzdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzkxaTMtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5MWk0T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzkxaTRlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5MWk0dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzkxaTQtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5MWk1T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzkxaTVlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5MWk1dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5MWk1LWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c5MWkyZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzkxaTJ1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iNTkwMSIgeT0iNTYzMCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlfVGllZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E4MkQzMDE3RiI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5X1RqT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c5X1RqZWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIzNjkxIiBoZWlnaHQ9IjEwMzIiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOV9UanVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5X1RqLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlfVGtPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5X1RrZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlfVGt1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5X1RrLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlfVGxPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5X1RsZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlfVGx1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5X1RsLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5X1RtT2ZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c5X1RpdWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjEyNjMyMjU2IiBzaG93UGFyZW50PSJOYW1lIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c5X1RpLWZYRWR1cUhvT0piVVJaUnciIHg9IjI4NTMiIHk9IjEyNjgiIGhlaWdodD0iMTM3NSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlfVG1lZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E4NTdCMDMzMyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5X1RuT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c5X1RuZWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIyNzk0IiBoZWlnaHQ9IjEwMzIiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOV9UbnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5X1RuLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlfVG9PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5X1RvZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlfVG91ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5X1RvLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlfVHBPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5X1RwZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlfVHB1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5X1RwLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5X1RxT2ZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c5X1RtdWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjEyNjMyMjU2IiBzaG93UGFyZW50PSJOYW1lIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c5X1RtLWZYRWR1cUhvT0piVVJaUnciIHg9IjEwNzc4IiB5PSIxMjY4IiBoZWlnaHQ9IjEzMjIiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5X1Q3LWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUUwRkU5MzAwNzciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOV9UOHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HOV9UOC1mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTU5MSIgaGVpZ2h0PSI5MDUiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOV9UOU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5X1Q5ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlfVDl1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5X1Q5LWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlfVC1PZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5X1QtZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlfVC11ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5X1QtLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlfVF9PZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5X1RfZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5X1RfdWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c5X1Q4T2ZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dQYXJlbnQ9Ik5hbWUiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzlfVDhlZlhFZHVxSG9PSmJVUlpSdyIgeD0iNTM4OSIgeT0iNjk3NCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlfVF8tZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDBEQyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5X1VBdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c5X1VBLWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIzMTE1IiBoZWlnaHQ9IjkwNSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5X1VCT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlfVUJlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOV9VQnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlfVUItZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOV9VQ09mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlfVUNlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOV9VQ3VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlfVUMtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOV9VRE9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlfVURlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlfVUR1ZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzlfVUFPZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HOV9VQWVmWEVkdXFIb09KYlVSWlJ3IiB4PSI3OTI1IiB5PSIxMDE0NCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlfVUQtZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDA5RiI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5X1VFdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c5X1VFLWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxNzI3IiBoZWlnaHQ9IjkwNSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5X1VGT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlfVUZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOV9VRnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlfVUYtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOV9VR09mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlfVUdlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOV9VR3VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlfVUctZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOV9VSE9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlfVUhlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlfVUh1ZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzlfVUVPZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HOV9VRWVmWEVkdXFIb09KYlVSWlJ3IiB4PSI2NjU3IiB5PSI4NTU5Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOV9VS09mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDc3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1JZGNPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRy1JZGNlZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjI4NDQiIGhlaWdodD0iOTA1Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1JZGN1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLUlkYy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctSWRkT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLUlkZGVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctSWRkdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLUlkZC1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctSWRlT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLUlkZWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctSWRldWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLUlkZS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLUlkZk9mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HOV9VS2VmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c5X1VLdWZYRWR1cUhvT0piVVJaUnciIHg9IjQwNjQiIHk9IjEwMjE5Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLUlkai1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUQwM0QzIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1JZGt1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRy1JZGstZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjIzMTkiIGhlaWdodD0iMTAzMiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctSWRsT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1JZGxlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLUlkbHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1JZGwtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLUlkbU9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1JZG1lZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLUlkbXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1JZG0tZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLUlkbk9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1JZG5lZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy1JZG51ZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRy1JZGtPZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1BhcmVudD0iTmFtZSIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HLUlka2VmWEVkdXFIb09KYlVSWlJ3IiB4PSIyNTM2IiB5PSI0NDM4Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLUlkcU9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMEVGIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1JZHEtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRy1JZHJPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjMzODYiIGhlaWdodD0iMTAzMiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctSWRyZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1JZHJ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLUlkci1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1JZHNPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLUlkc2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1JZHN1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLUlkcy1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1JZHRPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLUlkdGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1JZHR1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy1JZHQtZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRy1JZHFlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HLUlkcXVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxMDY1MSIgeT0iMzM0NCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1JZDNPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDAzMSI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctSWQzLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0ctSWQ0T2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIyMzE5IiBoZWlnaHQ9IjEwMzIiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLUlkNGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctSWQ0dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1JZDQtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctSWQ1T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy1JZDVlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctSWQ1dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy1JZDUtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctSWQ2T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy1JZDZlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctSWQ2dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctSWQ2LWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0ctSWQzZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRy1JZDN1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iOTE5MyIgeT0iNTYzMCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxEaWFncmFtU3R5bGUiIHhtaTppZD0iX0dtdlJKLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzlfVGdPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E5MjNCMDAwMiIgc291cmNlPSJfRzkxaTJPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzkxaXFPZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5X1RnLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlfVGhlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5X1RodWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HOV9UaE9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzlfVGdlZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c5X1RndWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzAsIC01MjQsIDAsIDE3NjFdJFswLCAtMTc2OSwgMCwgNTE2XSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HOV9UaC1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzlfVGlPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HOV9UcWVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTg3RTkwMDYxIiBzb3VyY2U9Il9HOV9UaWVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HOV9UbWVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlfVHJPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOV9UcnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlfVHItZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c5X1RyZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOV9Uc09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E4N0U5MDJEOSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlfVHN1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzlfVHNlZlhFZHVxSG9PSmJVUlpSdyIgeT0iMzk2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlfVHMtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTg3RTkwMkQ5Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOV9UdGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzlfVHRPZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTIwMiIgeT0iLTM0NyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5X1R0dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E4N0U5MDJDRiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlfVHVPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOV9UdC1mWEVkdXFIb09KYlVSWlJ3IiB4PSItMzgiIHk9IjI1OSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5X1R1ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBODdFOTAyQ0YiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5X1R1LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c5X1R1dWZYRWR1cUhvT0piVVJaUnciIHg9Ii01NzgiIHk9Ii0xNzUiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOV9Udk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTg3RTkwMkQ5Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOV9UdnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOV9Udi1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOV9UdmVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlfVHdPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTg3RTkwMkNGIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOV9Ud3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOV9Udy1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOV9Ud2VmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlfVHhPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBODdFOTAyRDkiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5X1R4dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5X1R4LWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c5X1R4ZWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOV9UeU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTg3RTkwMkNGIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOV9UeXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5X1R5LWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c5X1R5ZWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HOV9UcXVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIxMjYzMjI1NiIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HOV9UcS1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlsyMDkwLCA2MDksIC01MzQ1LCA2MzVdJFs1ODIxLCA2MDksIC0xNjE0LCA2MzVdIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HOV9Uek9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTg4MzQwMTEwIiBzb3VyY2U9Il9HOV9UaWVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HOV9UbWVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlfVHotZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOV9UMGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlfVDB1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c5X1QwT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOV9UMC1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E4ODM0MDJFOCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlfVDFlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzlfVDFPZlhFZHVxSG9PSmJVUlpSdyIgeT0iMzk2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlfVDF1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTg4MzQwMkU4Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOV9UMk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzlfVDEtZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTIwMiIgeT0iLTM0OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5X1QyZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E4ODM0MDJERSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlfVDItZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOV9UMnVmWEVkdXFIb09KYlVSWlJ3IiB4PSItOTAiIHk9IjE1NyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5X1QzT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBODgzNDAyREUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5X1QzdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c5X1QzZWZYRWR1cUhvT0piVVJaUnciIHg9Ii03ODgiIHk9Ii0xNzAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOV9UMy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTg4MzQwMkU4Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOV9UNGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOV9UNHVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOV9UNE9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlfVDQtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTg4MzQwMkRFIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOV9UNWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOV9UNXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOV9UNU9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlfVDUtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBODgzNDAyRTgiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5X1Q2ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5X1Q2dWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c5X1Q2T2ZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOV9UNi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTg4MzQwMkRFIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOV9UN2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5X1Q3dWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c5X1Q3T2ZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HOV9UemVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIxMjYzMjI1NiIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HOV9UenVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlsxODQ1LCAtMzg5LCAtNTYyMSwgLTM4OV0kWzYwNzAsIC0zODksIC0xMzk3LCAtMzg5XSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzlfVUgtZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRTBGRUQ2MDJBRSIgc291cmNlPSJfRzlfVUQtZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzlfVDctZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5X1VJdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlfVUpPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5X1VKZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HOV9VSS1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzlfVUlPZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c5X1VJZWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy01NTAsIC00NTcsIDIxNDIsIDE3NzhdJFstMjE1MCwgLTE3ODYsIDU0MSwgNDQ4XSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HOV9VSnVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzlfVUotZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HLUlkZmVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTEwIiBzb3VyY2U9Il9HOV9VS09mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HOV9VRC1mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1JZGdPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLUlkZ3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1JZGctZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0ctSWRnZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HLUlkZnVmWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRy1JZGYtZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMzMwLCAtNDU3LCAtMTM5NywgMTgyOF0kWzEzNzEsIC0xODM3LCAtMzU1LCA0NDhdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0ctSWRoT2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HLUlkaGVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0ctSWRodWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyOEQiIHNvdXJjZT0iX0c5X1RfLWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c5X1VELWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLUlkaWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctSWRpLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLUlkak9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRy1JZGl1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0ctSWRoLWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HLUlkaU9mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMjg3LCAtNDU3LCAxMTM0LCAxODI4XSRbLTExNTEsIC0xODM3LCAyNzAsIDQ0OF0iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRy1JZGplZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0ctSWRqdWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRy1JZG4tZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDJBMCIgc291cmNlPSJfRzkxaXlPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRy1JZGotZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctSWRvdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1JZHBPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctSWRwZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HLUlkby1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRy1JZG9PZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0ctSWRvZWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzU5MiwgLTUyNCwgLTIwOTksIDE4MTFdJFsyMDgyLCAtMTgyMCwgLTYwOSwgNTE2XSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HLUlkcHVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRy1JZHAtZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HLUlkdU9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI4Q0QzMjMwMTlBIiBzb3VyY2U9Il9HOTFpcU9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HLUlkcU9mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1JZHUtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLUlkdmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1JZHZ1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0ctSWR2T2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HLUlkdWVmWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRy1JZHV1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMjEzMywgMCwgLTI5NDYsIDBdJFszMzc4LCAwLCAtMTcwMSwgMF0iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRy1JZHYtZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0ctSWR3T2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRy1JZHdlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDI5RiIgc291cmNlPSJfRzkxaXVPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRy1JZGotZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctSWR4T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1JZHh1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctSWR4LWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HLUlkeGVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRy1JZHd1ZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HLUlkdy1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMTM1LCAtNTE2LCAtODQsIDE4MjBdJFstMTM1LCAtMTgyMCwgLTg0LCA1MTZdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0ctSWR5T2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HLUlkeWVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0ctSWR5dWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBOTI4MjAzOTIiIHNvdXJjZT0iX0ctSWRqLWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c5MWlxT2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLUlkemVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctSWR6LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLUlkME9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRy1JZHp1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0ctSWR5LWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HLUlkek9mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9Ils2NjAsIC01MjQsIC0yMjM1LCAxNzEwXSRbMjIwOSwgLTE3MTgsIC02ODUsIDUxNl0iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRy1JZDBlZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0ctSWQwdWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRy1JZDAtZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyOENEMzI5MDFGRCIgc291cmNlPSJfRy1JZGotZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzlfVGllZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctSWQxdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1JZDJPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctSWQyZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HLUlkMS1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRy1JZDFPZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HLUlkMWVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMzIxLCAtNTE2LCAtNzI4LCAzNTQ3XSRbLTMyMSwgLTM1NDcsIC03MjgsIDUxNl0iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRy1JZDJ1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0ctSWQyLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRy1JZDdPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyQjFFQzFCMDM0OSIgc291cmNlPSJfRy1JZDNPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzkxaXFPZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctSWQ3LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1JZDhlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctSWQ4dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HLUlkOE9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRy1JZDdlZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0ctSWQ3dWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy02NDMsIC01MjQsIDIxNTAsIDE3NjFdJFstMjE2NywgLTE3NjksIDYyNiwgNTE2XSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HLUlkOC1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRy1JZDlPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICA8L2NvbnRlbnRzPgotICAgICAgICAgICAgPGNvbnRlbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpEaWFncmFtIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MkRERThGMjAxMjUiIHR5cGU9IkNsYXNzIiBuYW1lPSJXb3JrRGVmaW5pdGlvblRheG9ub215Ij4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctU09jT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBODJEMzAxN0YiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLVNPYy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HLVNPZE9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMzY5MSIgaGVpZ2h0PSIxMDMyIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1TT2RlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLVNPZHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctU09kLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLVNPZU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctU09lZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLVNPZXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctU09lLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLVNPZk9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctU09mZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLVNPZnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLVNPZi1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HLVNPY2VmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93UGFyZW50PSJOYW1lIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0ctU09jdWZYRWR1cUhvT0piVVJaUnciIHg9Ijg4MjIiIHk9IjEwMDciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctU09nT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RDAzRDMiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLVNPZy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HLVNPaE9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMjMxOSIgaGVpZ2h0PSIxMDMyIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1TT2hlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLVNPaHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctU09oLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLVNPaU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctU09pZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLVNPaXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctU09pLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLVNPak9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctU09qZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLVNPanVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLVNPai1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HLVNPZ2VmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93UGFyZW50PSJOYW1lIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0ctU09ndWZYRWR1cUhvT0piVVJaUnciIHg9IjI3NTEiIHk9IjI4ODciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctU09tZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjc5NEE2NjAzNjgiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLVNPbk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HLVNPbmVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMzY5MSIgaGVpZ2h0PSIxMDMyIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1TT251ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLVNPbi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctU09vT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLVNPb2VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctU09vdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLVNPby1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctU09wT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLVNPcGVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctU09wdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLVNPcC1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLVNPcU9mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HLVNPbXVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93UGFyZW50PSJOYW1lIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0ctU09tLWZYRWR1cUhvT0piVVJaUnciIHg9IjkwMDYiIHk9IjQ3NTUiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctU09zdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyOUUiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLVNPdGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HLVNPdHVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMzY5MSIgaGVpZ2h0PSIxMDMyIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1TT3QtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLVNPdU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctU091ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLVNPdXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctU091LWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLVNPdk9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctU092ZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLVNPdnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctU092LWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLVNPd09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLVNPd2VmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HLVNPcy1mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93UGFyZW50PSJOYW1lIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0ctU090T2ZYRWR1cUhvT0piVVJaUnciIHg9IjE1NDI5IiB5PSI0NzU1Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLVNPN3VmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDA5Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1TTzhlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRy1TTzh1ZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjI3MjYiIGhlaWdodD0iMTAzMiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctU084LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1TTzlPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLVNPOWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1TTzl1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLVNPOS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1TTy1PZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLVNPLWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1TTy11ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLVNPLS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1TT19PZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy1TT19lZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRy1TTzctZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1BhcmVudD0iTmFtZSIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HLVNPOE9mWEVkdXFIb09KYlVSWlJ3IiB4PSIxNjMwMiIgeT0iNzA3OSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1iWWQtZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRTBGRTkzMDA3NyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctYllldWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0ctYlllLWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxNTc0IiBoZWlnaHQ9IjkwNSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctYllmT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1iWWZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWJZZnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1iWWYtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLWJZZ09mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1iWWdlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLWJZZ3VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1iWWctZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLWJZaE9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1iWWhlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy1iWWh1ZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRy1iWWVPZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1BhcmVudD0iTmFtZSIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HLWJZZWVmWEVkdXFIb09KYlVSWlJ3IiB4PSItNjM0IiB5PSI0NzU1Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWJZa09mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDlGIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1iWWstZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRy1iWWxPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjE3MjciIGhlaWdodD0iOTA1Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1iWWxlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWJZbHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctYllsLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWJZbU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctYlltZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWJZbXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctYlltLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWJZbk9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctYlluZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWJZbnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLWJZbi1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HLWJZa2VmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93UGFyZW50PSJOYW1lIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0ctYllrdWZYRWR1cUhvT0piVVJaUnciIHg9Ii01NTYiIHk9IjY2NTciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctYllxZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RDAzQ0IiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWJZck9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HLWJZcmVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMjMxOSIgaGVpZ2h0PSIxMDMyIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1iWXJ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWJZci1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctYllzT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWJZc2VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctYllzdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWJZcy1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctYll0T2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWJZdGVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctYll0dWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWJZdC1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLWJZdU9mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HLWJZcXVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93UGFyZW50PSJOYW1lIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0ctYllxLWZYRWR1cUhvT0piVVJaUnciIHg9IjI3NTEiIHk9IjQ3NTUiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctYll3dWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RDAzQ0EiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWJZeGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HLWJZeHVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMjMxOSIgaGVpZ2h0PSIxMDMyIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1iWXgtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWJZeU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctYll5ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWJZeXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctYll5LWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWJZek9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctYll6ZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWJZenVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctYll6LWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWJZME9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLWJZMGVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HLWJZdy1mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93UGFyZW50PSJOYW1lIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0ctYll4T2ZYRWR1cUhvT0piVVJaUnciIHg9IjU2OTgiIHk9IjQ3NTUiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MRGlhZ3JhbVN0eWxlIiB4bWk6aWQ9Il9HbTVDSWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0ctU09rT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjhDRDMyOTAxRkQiIHNvdXJjZT0iX0ctU09nT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0ctU09jT2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLVNPay1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctU09sZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLVNPbHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRy1TT2xPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0ctU09rZWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HLVNPa3VmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlsxMTU5LCAtMzM4LCAtNTU5NiwgMTU0MF0kWzQ5MDIsIC0xMzcxLCAtMTg1NCwgNTA4XSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HLVNPbC1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRy1TT21PZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HLVNPcWVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTgzMjMwMEZFIiBzb3VyY2U9Il9HLVNPbWVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HLVNPY09mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1TT3JPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLVNPcnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1TT3ItZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0ctU09yZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HLVNPcXVmWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRy1TT3EtZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMCwgLTUyNCwgMCwgMzIzNF0kWzAsIC0zMjQyLCAwLCA1MTZdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0ctU09zT2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HLVNPc2VmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0ctU093dWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBODMxODAwQjgiIHNvdXJjZT0iX0ctU09zdWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0ctU09jT2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLVNPeGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctU094LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLVNPeU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRy1TT3h1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0ctU093LWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HLVNPeE9mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstNzQ1LCAtNTI0LCA0NzQxLCAzMjg1XSRbLTQ3NDEsIC0zMjkzLCA3NDUsIDUxNl0iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRy1TT3llZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0ctU095dWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRy1TT3ktZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyNzk2MkQzMDAzRiIgc291cmNlPSJfRy1TT3N1ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRy1TT21lZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctU096dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1TTzBPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctU08wZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HLVNPei1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1TTzB1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjc5NjJENDAyMEUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctU08xT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0ctU08wLWZYRWR1cUhvT0piVVJaUnciIHk9IjM5NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctU08xZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyNzk2MkQ0MDIwRSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1TTzEtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0ctU08xdWZYRWR1cUhvT0piVVJaUnciIHg9Ii04MCIgeT0iMzQ1Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1TTzJPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3OTYyRDQwMjAzIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLVNPMnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0ctU08yZWZYRWR1cUhvT0piVVJaUnciIHg9Ii0yNzYiIHk9Ii0yOTkiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLVNPMi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3OTYyRDQwMjAzIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLVNPM2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HLVNPM09mWEVkdXFIb09KYlVSWlJ3IiB4PSItNTE3IiB5PSIyMzUiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLVNPM3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3OTYyRDQwMjBFIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLVNPNE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLVNPNGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HLVNPMy1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1TTzR1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3OTYyRDQwMjAzIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLVNPNU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLVNPNWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HLVNPNC1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1TTzV1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjc5NjJENDAyMEUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctU082T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctU082ZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0ctU081LWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLVNPNnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3OTYyRDQwMjAzIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLVNPN09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctU083ZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0ctU082LWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HLVNPek9mWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRy1TT3plZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTE4NTQsIC0yNSwgMzYzMiwgMjVdJFstMzY0MCwgLTQyLCAxODQ1LCA4XSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRy1TT191ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDMwRCIgc291cmNlPSJfRy1TT3N1ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRy1TTzd1ZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctU1BBZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1TUEEtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctU1BCT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HLVNQQXVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1TUEJlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDMxMCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1TUEItZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRy1TUEJ1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMjY4IiB5PSIzOTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLVNQQ09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzMTAiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctYllZT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HLVNQQ2VmWEVkdXFIb09KYlVSWlJ3IiB4PSItNTMiIHk9Ii0zNTYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWJZWWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzMEUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctYllZLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRy1iWVl1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTEzIiB5PSIyMjAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWJZWk9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDMwRSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1iWVp1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRy1iWVplZlhFZHVxSG9PSmJVUlpSdyIgeD0iMzgiIHk9Ii0zNTYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWJZWi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzEwIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWJZYWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLWJZYXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HLWJZYU9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1iWWEtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzBFIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWJZYmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLWJZYnVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HLWJZYk9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1iWWItZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzMTAiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctYlljZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctYlljdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0ctYlljT2ZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWJZYy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzBFIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWJZZGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctYllkdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0ctYllkT2ZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HLVNPXy1mWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRy1TUEFPZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMCwgNTE2LCAwLCAtMTY2N10kWzAsIDE2NTksIDAsIC01MjRdIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HLWJZb09mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFMEZFRDYwMkFFIiBzb3VyY2U9Il9HLWJZa09mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HLWJZZC1mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1iWW8tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWJZcGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1iWXB1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0ctYllwT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HLWJZb2VmWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRy1iWW91ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMCwgLTQ1NywgMCwgMTQyMl0kWzAsIC0xNDMwLCAwLCA0NDhdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0ctYllwLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HLWJZcU9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0ctYll1ZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAyQTAiIHNvdXJjZT0iX0ctYllxZWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0ctU09nT2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWJZdk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctYll2dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWJZdi1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRy1iWXZlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0ctYll1dWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HLWJZdS1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlswLCAtNTI0LCAwLCAxMzU0XSRbMCwgLTEzNjMsIDAsIDUxNl0iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRy1iWXdPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0ctYll3ZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRy1iWTB1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDI5RiIgc291cmNlPSJfRy1iWXd1ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRy1TT2dPZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctYlkxZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1iWTEtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctYlkyT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HLWJZMXVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRy1iWTAtZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0ctYlkxT2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy04MTIsIC01MjQsIDIxMzMsIDEzNTRdJFstMjE0MiwgLTEzNjMsIDgwNCwgNTE2XSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HLWJZMmVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRy1iWTJ1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICA8L2NvbnRlbnRzPgotICAgICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR2xpLVdlZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRkQ4OTFGMDJDRCI+Ci0gICAgICAgICAgICA8Ym9keT4wMjwvYm9keT4KLSAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICA8cGFja2FnZU1lcmdlIHhtaTppZD0iX0ZvUFdFT3hNRWR1T05yTVJnbXo0OEEiIG1lcmdlZFBhY2thZ2U9Il8zQURDN0I3NDAyMkQ0MEZEODU0NjAwRDgiLz4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDA3NyIgbmFtZT0iRGVsaXZlcnlQcm9jZXNzIj4KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR2xzdlYtZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDA3NyI+Ci0gICAgICAgICAgICAgIDxib2R5PkEgRGVsaXZlcnkgUHJvY2Vzc2VzIGlzIGEgc3BlY2lhbCBQcm9jZXNzIGRlc2NyaWJpbmcgYSBjb21wbGV0ZSBhbmQgaW50ZWdyYXRlZCBhcHByb2FjaCBmb3IgcGVyZm9ybWluZyBhIHNwZWNpZmljIHByb2plY3QgdHlwZS4gIEl0IGRlc2NyaWJlcyBhIGNvbXBsZXRlIHByb2plY3QgbGlmZWN5Y2xlIGVuZC10by1lbmQgYW5kIHNoYWxsIGJlIHVzZWQgYXMgYSByZWZlcmVuY2UgZm9yIHJ1bm5pbmcgcHJvamVjdHMgd2l0aCBzaW1pbGFyIGNoYXJhY3RlcmlzdGljcyBhcyBkZWZpbmVkIGZvciB0aGUgcHJvY2Vzcy4gIEEgRGVsaXZlcnkgUHJvY2VzcyBpcyByZWxhdGVkIHRvIHNwZWNpZmljIHN1cHBvcnRpbmcgaW5mb3JtYXRpb24gc3VjaCBhcyBSb2FkbWFwcyAoaW5oZXJpdGVkIHZpYSBBY3Rpdml0eSkgYXMgd2VsbCBhcyBDb21tdW5pY2F0aW9ucyBhbmQgRWR1Y2F0aW9uIE1hdGVyaWFsLgotQSBEZWxpdmVyeSBQcm9jZXNzIGlzIGEgUHJvY2VzcyB0aGF0IGNvdmVycyBhIHdob2xlIGRldmVsb3BtZW50IGxpZmVjeWNsZSBmcm9tIGJlZ2lubmluZyB0byBlbmQuICBBIERlbGl2ZXJ5IFByb2Nlc3Mgc2hhbGwgYmUgdXNlZCBhcyBhIHRlbXBsYXRlIGZvciBwbGFubmluZyBhbmQgcnVubmluZyBhIHByb2plY3QuICBJdCBwcm92aWRlcyBhIGNvbXBsZXRlIGxpZmVjeWNsZSBtb2RlbCB3aXRoIHByZWRlZmluZWQgcGhhc2VzLCBpdGVyYXRpb25zLCBhbmQgYWN0aXZpdGllcyB0aGF0IGhhdmUgYmVlbiBkZXRhaWxlZCBieSBzZXF1ZW5jaW5nIHJlZmVyZW5jaW5nIG1ldGhvZCBjb250ZW50IGluIGJyZWFrZG93biBzdHJ1Y3R1cmVzLiAgSXQgaXMgZGVmaW5lZCBvbiB0aGUgYmFzaXMgb2YgZXhwZXJpZW5jZSB3aXRoIHBhc3QgcHJvamVjdHMgb3IgZW5nYWdlbWVudHMsIGFuZC9vciB0aGUgYmVzdCBwcmFjdGljZSB1c2Ugb2YgYSBkZXZlbG9wbWVudCBvciBkZWxpdmVyeSBhcHByb2FjaC4gIEl0IGRlZmluZXMgd2hhdCBnZXRzIHByb2R1Y2VkLCBob3cgdGhvc2UgaXRlbXMgYXJlIHByb2R1Y2VkLCBhbmQgdGhlIHJlcXVpcmVkIHN0YWZmaW5nIGluIHRoZSBmb3JtIG9mIGludGVncmF0ZWQgV29yaywgV29yayBQcm9kdWN0LCBhbmQgVGVhbSBCcmVha2Rvd24gU3RydWN0dXJlcy4gIEZvciBleGFtcGxlLCBhIHByb2Nlc3MgZW5naW5lZXIgY2FuIGRlZmluZSBhbHRlcm5hdGl2ZSBEZWxpdmVyeSBQcm9jZXNzZXMgZm9yIHNvZnR3YXJlIGRldmVsb3BtZW50IHByb2plY3RzIHRoYXQgZGlmZmVyIGluIHRoZSBzY2FsZSBvZiB0aGUgZW5nYWdlbWVudCBhbmQgc3RhZmZpbmcgbmVjZXNzYXJ5LCB0aGUgdHlwZSBvZiB0aGUgc29mdHdhcmUgYXBwbGljYXRpb24gdG8gYmUgZGV2ZWxvcGVkLCB0aGUgZGV2ZWxvcG1lbnQgbWV0aG9kcyBhbmQgdGVjaG5vbG9naWVzIHRvIGJlIHVzZWQsIGV0Yy4gIEFsdGhvdWdoLCB0aGUgRGVsaXZlcnkgUHJvY2VzcyBhaW1zIHRvIGNvdmVyIGEgd2hvbGUgcHJvamVjdCBpdCBrZWVwcyBjZXJ0YWluIGRlY2lzaW9uIHRoYXQgYXJlIHRvbyBwcm9qZWN0IHNwZWNpZmljIG9wZW4uICBGb3IgZXhhbXBsZSwgdGhlIGJyZWFrZG93biBzdHJ1Y3R1cmUgZGVmaW5lcyB3aGljaCBCcmVha2Rvd24gRWxlbWVudHMgaGF2ZSBtdWx0aXBsZSBvY2N1cnJlbmNlcyBvciBpcyByZXBlYXRhYmxlIHZpYSBpdCByZXNwZWN0aXZlIGF0dHJpYnV0ZXMsIGJ1dCBkb2VzIG5vdCBzYXkgaG93IG1hbnkgb2NjdXJyZW5jZXMgYW5kIGhvdyBtYW55IHJlcGVhdHMvaXRlcmF0aW9ucyBpdCB3aWxsIGhhdmUuICBUaGVzZSBkZWNpc2lvbnMgaGF2ZSB0byBiZSBkb25lIGJ5IGEgcHJvamVjdCBtYW5hZ2VyIHdoZW4gcGxhbm5pbmcgYSBjb25jcmV0ZSBwcm9qZWN0LCBwcm9qZWN0IHBoYXNlLCBvciBwcm9qZWN0IGl0ZXJhdGlvbnMuICBBIERlbGl2ZXJ5IFByb2Nlc3MgaXMgYWx3YXlzIGEgY29tcGxldGUgZGVzY3JpcHRpb24gb2YgYSBwcm9jZXNzIGluIHRlcm1zIG9mIGNvbXBsZXRlbmVzcyBvZiB0aGUgbGlmZWN5Y2xlLCBhcyB3ZWxsIGFzIGluIHRlcm1zIG9mIGFsbCB0aHJlZSB2aWV3cyBvbiB0aGUgcHJvY2VzcyB3aGljaCBhcmUgdGhlIFdvcmsgQnJlYWtkb3duIFN0cnVjdHVyZSwgV29yayBQcm9kdWN0IEJyZWFrZG93biBTdHJ1Y3R1cmUsIGFuZCBUZWFtIEJyZWFrZG93biBTdHJ1Y3R1cmUgaGF2ZSB0byBiZSBmdWxseSBhbmQgY29uc2lzdGVudGx5IHBvcHVsYXRlZC4gIENvbnNpc3RlbmN5IG9mIGEgRGVsaXZlcnkgUHJvY2VzcyBpcyBhY3R1YWxseSBlbnN1cmVkIGJ5IHRoZSBmYWN0IHRoYXQgYWxsIHRocmVlIGJyZWFrZG93bnMgYXJlIHJlcHJlc2VudGVkIGJ5IG9uZSBzaW5nbGUgZGF0YSBzdHJ1Y3R1cmUgYW5kIG9uZSBwYXJ0aWN1bGFyIGJyZWFrZG93biBzdWNoIGFzIFRlYW0gQnJlYWtkb3duIGlzIGp1c3QgYSB2aWV3IG9uIHRoYXQgZGF0YSBzdHJ1Y3R1cmUuCi08L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxMTAiIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwOUYiLz4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxMUQiIG5hbWU9ImVkdWNhdGlvbk1hdGVyaWFscyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMUMxIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDExQSI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0dtSmJWdWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0dtSmJWZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTMxIiBuYW1lPSJjb21tdW5pY2F0aW9uc01hdGVyaWFscyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMUMxIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDEyRSI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0dtU2xOdWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0dtU2xOZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwOUYiIG5hbWU9IlByb2Nlc3MiIGlzQWJzdHJhY3Q9InRydWUiPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HbHN2Vy1mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDlGIj4KLSAgICAgICAgICAgICAgPGJvZHk+QSBQcm9jZXNzIGlzIGEgc3BlY2lhbCBBY3Rpdml0eSB0aGF0IGRlc2NyaWJlcyBhIHN0cnVjdHVyZSBmb3IgcGFydGljdWxhciB0eXBlcyBvZiBkZXZlbG9wbWVudCBwcm9qZWN0cy4gIFRvIHBlcmZvcm0gc3VjaCBhIGRldmVsb3BtZW50IHByb2plY3QgYSBQcm9jZXNzZXMgd291bGQgYmUgJ2luc3RhbnRpYXRlZCcgYW5kIGFkYXB0ZWQgZm9yIHRoZSBzcGVjaWZpYyBzaXR1YXRpb24uICBQcm9jZXNzIGlzIGFuIGFic3RyYWN0IGNsYXNzIGFuZCB0aGlzIG1ldGEtbW9kZWwgZGVmaW5lcyBkaWZmZXJlbnQgc3BlY2lhbCB0eXBlcyBvZiBQcm9jZXNzZXMgZm9yIGRpZmZlcmVudCBwcm9jZXNzIG1hbmFnZW1lbnQgYXBwbGljYXRpb25zIGFuZCBkaWZmZXJlbnQgc2l0dWF0aW9ucyBvZiBwcm9jZXNzIHJldXNlLiAgRXZlcnkgUHJvY2VzcyBjb21wcmlzZXMgb2YgYW5kIGlzIHRoZSB0b3AtbGV2ZWwgZWxlbWVudCBvZiBhbiBuLWxldmVsIGJyZWFrZG93biBzdHJ1Y3R1cmUgdXNpbmcgdGhlIE5lc3RpbmcgYXNzb2NpYXRpb24gZGVmaW5lZCBvbiBBY3Rpdml0eS4KLUNvcmUgTWV0aG9kIENvbnRlbnQgcHJvdmlkZXMgc3RlcC1ieS1zdGVwIGV4cGxhbmF0aW9ucywgZGVzY3JpYmluZyBob3cgdmVyeSBzcGVjaWZpYyBkZXZlbG9wbWVudCBnb2FscyBhcmUgYWNoaWV2ZWQgaW5kZXBlbmRlbnQgb2YgdGhlIHBsYWNlbWVudCBvZiB0aGVzZSBzdGVwcyB3aXRoaW4gYSBkZXZlbG9wbWVudCBsaWZlY3ljbGUuICBQcm9jZXNzZXMgdGFrZSB0aGVzZSBtZXRob2QgZWxlbWVudHMgYW5kIHJlbGF0ZSB0aGVtIGludG8gc2VtaS1vcmRlcmVkIHNlcXVlbmNlcyB0aGF0IGFyZSBjdXN0b21pemVkIHRvIHNwZWNpZmljIHR5cGVzIG9mIHByb2plY3RzLiAgVGh1cywgYSBwcm9jZXNzIGlzIGEgc2V0IG9mIHBhcnRpYWxseSBvcmRlcmVkIHdvcmsgZGVzY3JpcHRpb25zIGludGVuZGVkIHRvIHJlYWNoIGEgaGlnaGVyIGRldmVsb3BtZW50IGdvYWwsIHN1Y2ggYXMgdGhlIHJlbGVhc2Ugb2YgYSBzcGVjaWZpYyBzb2Z0d2FyZSBzeXN0ZW0uICBBIHByb2Nlc3MgYW5kIHRoZSBwcm9jZXNzIG1ldGEtbW9kZWwgc3RydWN0dXJlIGRlZmluZWQgaW4gdGhpcyBzcGVjaWZpY2F0aW9uIGZvY3VzZXMgb24gdGhlIGxpZmVjeWNsZSBhbmQgdGhlIHNlcXVlbmNpbmcgb2Ygd29yayBpbiBicmVha2Rvd24gc3RydWN0dXJlcy4gIFRvIGFjaGlldmUgdGhpcyBpdCB1c2VzIHRoZSBEZXNjcmlwdG9yIGNvbmNlcHQgcmVmZXJlbmNpbmcgbWV0aG9kIGNvbnRlbnQgYW5kIGFsbG93aW5nIGRlZmluaW5nIHRpbWUtc3BlY2lmaWMgY3VzdG9taXphdGlvbnMgb2YgdGhlIHJlZmVyZW5jZWQgY29udGVudCAoZS5nLiBkZWZpbmluZyBhIGZvY3VzIG9uIGRpZmZlcmVudCBzdGVwcyBvZiB0aGUgc2FtZSBUYXNrIGFuZCBwcm92aWRpbmcgaW5wdXQgV29yayBQcm9kdWN0cyBpbiBkaWZmZXJlbnQgc3RhdGVzIHdpdGhpbiB0aGUgZGlmZmVyZW50IFBoYXNlcyBvZiBhIHByb2Nlc3MgbGlmZWN5Y2xlIGluIHdoaWNoIHRoZSBzYW1lIFRhc2sgaXMgcGVyZm9ybWVkKS4KLTwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxRTBGRUQ2MDJBRSIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQxRTBGRTkzMDA3NyIvPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxMTlBM0YzMDFFMiIgbmFtZT0iaW5jbHVkZXNQYXR0ZXJucyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMERDIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQxMTlBM0YyMDIzOCI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0dsX3FSLWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0dsX3FSdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwRTUiIG5hbWU9IlByb2Nlc3NQbGFubmluZ1RlbXBsYXRlIj4KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR2xzdlgtZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDBFNSI+Ci0gICAgICAgICAgICAgIDxib2R5PkEgUHJvY2VzcyBQbGFubmluZyBUZW1wbGF0ZSBpcyBhIHNwZWNpYWwgUHJvY2VzcyB0aGF0IGlzIHByZXBhcmVkIGZvciBpbnN0YW50aWF0aW9uIGJ5IGEgcHJvamVjdCBwbGFubmluZyB0b29sLiAgVHlwaWNhbGx5LCBpdCBpcyBjcmVhdGVkIGJhc2VkIG9uIGEgUHJvY2VzcyBzdWNoIGFzIGEgRGVsaXZlcnkgUHJvY2VzcyBhcyBhIHdob2xlIChlLmcuIGluIGNhc2Ugb2YgYSB3YXRlcmZhbGwtYmFzZWQgZGV2ZWxvcG1lbnQgYXBwcm9hY2gpIG9yIGluIHBhcnRzIChlLmcuIGluIGNhc2Ugb2YgYW4gaXRlcmF0aXZlIGRldmVsb3BtZW50IGFwcHJvYWNoKS4KLUEgUHJvY2VzcyBQbGFubmluZyBUZW1wbGF0ZSByZXByZXNlbnRzIGEgcGFydGlhbGx5IGZpbmlzaGVkIHBsYW4gZm9yIGEgY29uY3JldGUgcHJvamVjdC4gIEl0IHVzZXMgdGhlIHNhbWUgaW5mb3JtYXRpb24gc3RydWN0dXJlcyBhcyBhbGwgb3RoZXIgUHJvY2VzcyBUeXBlcyB0byByZXByZXNlbnQgdGVtcGxhdGVzIGZvciBwcm9qZWN0IHBsYW5zLiAgSG93ZXZlciwgY2VydGFpbiBwbGFubmluZyBkZWNpc2lvbnMgaGF2ZSBhbHJlYWR5IGJlZW4gYXBwbGllZCB0byB0aGUgdGVtcGxhdGUgYXMgd2VsbCBhcyBpbmZvcm1hdGlvbiBoYXMgYmVlbiByZW1vdmVkIGFuZC9vciByZWZvcm1hdHRlZCB0byBiZSByZWFkeSBmb3IgZXhwb3J0IHRvIGEgc3BlY2lmaWMgcGxhbm5pbmcgdG9vbC4gIEV4YW1wbGVzIGZvciBzdWNoIGRlY2lzaW9ucyBhcmU6IGEgdGVtcGxhdGUgaGFzIGJlZW4gY3JlYXRlZCB0byByZXByZXNlbnQgYSBwbGFuIGZvciBhIHBhcnRpY3VsYXIgSXRlcmF0aW9uIGluIGFuIGl0ZXJhdGl2ZSBkZXZlbG9wbWVudCBwcm9qZWN0LCB3aGljaCBmciBleGFtcGxlIGRpc3Rpbmd1aXNoZXMgZWFybHkgZnJvbSBsYXRlIGl0ZXJhdGlvbnMgaW4gdGhlIEVsYWJvcmF0aW9uIHBoYXNlIG9mIGEgcHJvamVjdDsgaWYgdGhlIHRhcmdldGVkIHBsYW5uaW5nIHRvb2wgY2Fubm90IHJlcHJlc2VudCBpbnB1dCBhbmQgb3V0cHV0IG9mIFRhc2ssIHRoZW4gdGhlc2UgaGF2ZSBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgc3RydWN0dXJlOyBjZXJ0YWluIHJlcGV0aXRpb25zIGhhdmUgYmVlbiBhbHJlYWR5IGFwcGxpZWQsIGUuZy4gc3RhdGluZyB0aGF0IGEgY3ljbGUgb2Ygc3BlY2lmaWMgVGFzayBncm91cGVkIGluIGFuIEFjdGl2aXR5IGhhdmUgdG8gYmUgcmVwZWF0ZWQgbi10aW1lczsgZXRjLgotPC9ib2R5PgotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjhFIiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDlGIi8+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDExOUE0MDEwMDE3IiBuYW1lPSJiYXNlZE9uUHJvY2Vzc2VzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwOUYiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDExOUE0MDAwMEU2Ij4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR2xfcVVPZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR2xfcVQtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDFDMiIgbmFtZT0iUm9hZG1hcCI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dsc3ZZLWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxQzIiPgotICAgICAgICAgICAgICA8Ym9keT5BIFJvYWRtYXAgaXMgYSBzcGVjaWFsIEd1aWRhbmNlIFR5cGUgd2hpY2ggaXMgb25seSByZWxhdGVkIHRvIEFjdGl2YXRlcyBhbmQgdGhlcmVmb3JlIGhhcyBiZWVuIGFkZGVkIGJ5IHRoaXMgcGFja2FnZSB0byB0aGUgbGlzdCBvZiBHdWlkYW5jZSBUeXBlcyByYXRoZXIgdGhhbiBsaXN0ZWQgaW4gdGhlIEd1aWRhbmNlIFR5cGVzIHBhY2thZ2UuICBBIFJvYWRtYXAgcmVwcmVzZW50cyBhIGxpbmVhciB3YWxrdGhyb3VnaCBvZiBhbiBBY3Rpdml0eSwgdHlwaWNhbGx5IGEgUHJvY2Vzcy4KLUFuIGluc3RhbmNlIG9mIGEgUm9hZG1hcCByZXByZXNlbnRzIGltcG9ydGFudCBkb2N1bWVudGF0aW9uIGZvciB0aGUgQWN0aXZpdHkgb3IgUHJvY2VzcyBpdCBpcyByZWxhdGVkIHRvLiAgT2Z0ZW4gYSBjb21wbGV4IEFjdGl2aXR5IHN1Y2ggYXMgYSBQcm9jZXNzIGNhbiBiZSBtdWNoIGVhc2llciB1bmRlcnN0b29kIGJ5IHByb3ZpZGluZyBhIHdhbGt0aHJvdWdoIHdpdGggYSBsaW5lYXIgdGhyZWFkIG9mIGEgdHlwaWNhbCBpbnN0YW50aWF0aW9uIG9mIHRoaXMgQWN0aXZpdHkuICBJbiBhZGRpdGlvbiB0byBtYWtpbmcgdGhlIHByb2Nlc3MgcHJhY3RpdGlvbmVyIHVuZGVyc3RhbmQgaG93IHdvcmsgaW4gdGhlIHByb2Nlc3MgaXMgYmVpbmcgcGVyZm9ybWVkLCBhIFJvYWRtYXAgcHJvdmlkZXMgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCBob3cgQWN0aXZpdGllcyBhbmQgVGFza3MgcmVsYXRlIHRvIGVhY2ggb3RoZXIgb3ZlciB0aW1lLiAgUm9hZG1hcHMgYXJlIGFsc28gdXNlZCB0byBzaG93IGhvdyBzcGVjaWZpYyBhc3BlY3RzIGFyZSBkaXN0cmlidXRlZCBvdmVyIGEgd2hvbGUgcHJvY2VzcyBwcm92aWRpbmcgYSBraW5kIG9mIGZpbHRlciBvbiB0aGUgcHJvY2VzcyBmb3IgdGhpcyBpbmZvcm1hdGlvbi4KLTwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxRTEwNTgyMDM3QyIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDJEQSIvPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDFFMEZFOTMwMDc3IiBuYW1lPSJBY3Rpdml0eSI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dsMTVRLWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUUwRkU5MzAwNzciPgotICAgICAgICAgICAgICA8Ym9keT5UaGlzIGRlZmluaXRpb24gb2YgQWN0aXZpdHkgZXh0ZW5kcyBBY3Rpdml0eSBpbnRyb2R1Y2VkIGluIHRoZSBwYWNrYWdlIEJyZWFrZG93biB3aXRoIG5ldyBjYXBhYmlsaXRpZXMgYW5kIGlzIHRoZSBiYXNpcyBmb3IgdGhlIGRlZmluaXRpb24gb2YgdGhlIGNsYXNzIFByb2Nlc3MuCi1FeHRlbmRzIEFjdGl2aXR5IHdpdGggYW4gYXNzb2NpYXRpb24gdG8gUm9hZG1hcC4gIFRoaXMgZGVmaW5pdGlvbiBvZiBBY3Rpdml0eSBhbHNvIHBhcnRpY2lwYXRlcyBpbiB0aGUgZXh0ZW5zaW9uIG9mIHRoZSBEaXNjaXBsaW5lIGNhdGVnb3J5LgotPC9ib2R5PgotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGRDU2MUMwMDY1IiBuYW1lPSJyb2FkbWFwcyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMUMyIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQwRkQ1NjFBMDM5NiI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0dtSmJTdWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0dtSmJTZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDI3QTlGNTIwMDQzIiBuYW1lPSJzdXBwb3J0aW5nTWF0ZXJpYWxzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxQzEiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDI3QTlGNTAwMzI1Ij4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR21jV00tZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR21jV011ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MjdBOUY4RDAwMTMiIG5hbWU9ImNoZWNrbGlzdHMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDE5QSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MjdBOUY4QzAwQzUiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HbWNXUE9mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HbWNXTy1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyN0E5RjkxMDFBOSIgbmFtZT0iY29uY2VwdHMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDE5OSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MjdBOUY5MDAyNTIiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HbWNXUmVmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HbWNXUk9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyN0E5Rjk1MDMyMiIgbmFtZT0iZXhhbXBsZXMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDFBMyIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MjdBOUY5NDAzQjciPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HbWxnSS1mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HbWxnSXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyN0E5RjlBMDJEQSIgbmFtZT0iZ3VpZGVsaW5lcyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMUE0IiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQyN0E5Rjk5MDM4MyI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0dtbGdMT2ZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0dtbGdLLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDI3QTlGOUYwMDg5IiBuYW1lPSJyZXVzYWJsZUFzc2V0cyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDIxM0M5MTMwMkM1IiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQyN0E5RjlFMDE3OCI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0dtbGdOZWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0dtbGdOT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MjEyNEJFRTAwREMiIG5hbWU9IkRpc2NpcGxpbmUiPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HbDE1Ui1mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxMjRCRUUwMERDIj4KLSAgICAgICAgICAgICAgPGJvZHk+RGlzY2lwbGluZSBpcyBhIGNhdGVnb3JpemF0aW9uIG9mIFRhc2tzIGJhc2VkIHVwb24gc2ltaWxhcml0eSBvZiBjb25jZXJucyBhbmQgY29vcGVyYXRpb24gb2Ygd29yayBlZmZvcnQuICBUaGlzIGlzIHRoZSBleHRlbnNpb25zIG9mIERpc2NpcGxpbmUgZGVmaW5lZCBpbiB0aGUgTWV0aG9kIENvcmUgcGFja2FnZSBhZGRpbmcgYW4gYWRkaXRpb25hbCBhc3NvY2lhdGlvbiB0byBBY3Rpdml0aWVzLCB3aGljaCByZXByZXNlbnQgdHlwaWNhbCBzdGFuZGFyZCBvciByZWZlcmVuY2Ugd2F5cyBvZiBtZWFuaW5nZnVsIGdyb3VwaW5ncyBvZiB0aGUgRGlzY2lwbGluZSdzIFRhc2tzIGludG8gd29ya2Zsb3dzLgotVGFza3MgcmVwcmVzZW50IGRlc2NyaXB0aW9ucyBvZiB3b3JrLCB3aGljaCBhcmUgY2F0ZWdvcml6ZWQgYnkgRGlzY2lwbGluZXMuICBUaGUgcmVhc29uIHRoYXQgc2V2ZXJhbCBUYXNrcyBhcmUgYWxsIGNhdGVnb3JpemVkIGJ5IHRoZSBzYW1lIERpc2NpcGxpbmUgaXMgdGhhdCB0aGV5IGFsbCByZXByZXNlbnQgYSBwYXJ0IGluIGFjaGlldmluZyBhIGhpZ2hlciBnb2FsIG9yIHBlcmZvcm1pbmcgd29yayB0aGF0IGlzIGFsbCByZWxhdGVkIHRvIGVhY2ggb3RoZXIuICBFdmVyeSBEaXNjaXBsaW5lIGRlZmluZXMgc3RhbmRhcmQgd2F5cyBvZiBkb2luZyB0aGUgd29yayBpdCBjYXRlZ29yaXplcy4gIFN1Y2ggc3RhbmRhcmQgd2F5cyBhcmUgZXhwcmVzcyBieSBBY3Rpdml0aWVzIG9yIENhcGFiaWxpdHkgUGF0dGVybnMgZGVmaW5pbmcgaG93IHRoZSBUYXNrcyBjYXRlZ29yaXplZCBieSB0aGUgRGlzY2lwbGluZSAnd29yayB0b2dldGhlcicgaW4gdGhlIG1vc3QgZ2VuZXJpYyB3YXkuICBUaGVzZSByZWZlcmVuY2Ugd29ya2Zsb3dzIGFyZSBvZnRlbiB1c2VkIGZvciBlZHVjYXRpbmcgYW5kIHRlYWNoaW5nIHByYWN0aXRpb25lcnMuIAotPC9ib2R5PgotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDIxMjRDM0IwMTBGIiBuYW1lPSJyZWZlcmVuY2VXb3JrZmxvd3MiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQxRTBGRTkzMDA3NyIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MjEyNEMzQTAyNEUiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HbVNsUmVmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HbVNsUk9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDI3QTlFODYwMTdFIiBuYW1lPSJQcmFjdGljZSI+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDI3QTlFRkYwMTlBIiBuYW1lPSJhY3Rpdml0eVJlZmVyZW5jZXMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQxRTBGRTkzMDA3NyIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MjdBOUVGRTAxQ0EiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HbVNsVE9mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HbVNsUy1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMERDIiBuYW1lPSJDYXBhYmlsaXR5UGF0dGVybiI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dsMTVUZWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwREMiPgotICAgICAgICAgICAgICA8Ym9keT5BIENhcGFiaWxpdHkgUGF0dGVybiBpcyBhIHNwZWNpYWwgUHJvY2VzcyB0aGF0IGRlc2NyaWJlcyBhIHJldXNhYmxlIGNsdXN0ZXIgb2YgZG9pbmcgd29yayBpbiBjb21tb24gcHJvY2VzcyBhcmVhcy4gIENhcGFiaWxpdGllcyBQYXR0ZXJucyBleHByZXNzIGFuZCBjb21tdW5pY2F0ZSBwcm9jZXNzIGtub3dsZWRnZSBmb3IgYSBrZXkgYXJlYSBvZiBpbnRlcmVzdCBzdWNoIGFzIGEgRGlzY2lwbGluZSBhbmQgY2FuIGJlIGRpcmVjdGx5IHVzZWQgYnkgcHJvY2VzcyBwcmFjdGl0aW9uZXIgdG8gZ3VpZGUgaGlzIHdvcmsuICBUaGV5IGFyZSBhbHNvIHVzZWQgYXMgYnVpbGRpbmcgYmxvY2tzIHRvIGFzc2VtYmxlIERlbGl2ZXJ5IFByb2Nlc3NlcyBvciBsYXJnZXIgQ2FwYWJpbGl0eSBQYXR0ZXJucyBlbnN1cmluZyBvcHRpbWFsIHJldXNlIGFuZCBhcHBsaWNhdGlvbiBvZiB0aGUga2V5IHByYWN0aWNlcyB0aGV5IGV4cHJlc3MuCi1BIENhcGFiaWxpdHkgUGF0dGVybiBpcyBhIHNwZWNpYWwgUHJvY2VzcyB0aGF0IGRlc2NyaWJlcyBhIHJldXNhYmxlIGNsdXN0ZXIgb2YgZG9pbmcgd29yayBpbiBhIGdlbmVyYWwgcHJvY2VzcyBhcmVhIHRoYXQgcHJvdmlkZXMgYSBjb25zaXN0ZW50IGRldmVsb3BtZW50IGFwcHJvYWNoIHRvIGNvbW1vbiBwcm9ibGVtcy4gIEV4YW1wbGVzIGZvciBDYXBhYmlsaXR5IFBhdHRlcm4gY291bGQgYmUgJ3VzZSBjYXNlLWJhc2VkIHJlcXVpcmVtZW50cyBtYW5hZ2VtZW50JywgJ3VzZSBjYXNlIGFuYWx5c2lzJywgb3IgJ3VuaXQgdGVzdGluZycuIFR5cGljYWxseSBidXQgbm90IG5lY2Vzc2FyaWx5LCBDYXBhYmlsaXR5IFBhdHRlcm5zIGhhdmUgdGhlIHNjb3BlIG9mIG9uZSBkaXNjaXBsaW5lIHByb3ZpZGluZyBhIGJyZWFrZG93biBvZiByZXVzYWJsZSBjb21wbGV4IEFjdGl2aXRpZXMsIHJlbGF0aW9uc2hpcHMgdG8gdGhlIFJvbGVzIHdoaWNoIHBlcmZvcm0gVGFza3Mgd2l0aGluIHRoZXNlIEFjdGl2aXRpZXMsIGFzIHdlbGwgYXMgdG8gdGhlIFdvcmsgUHJvZHVjdHMgdGhhdCBhcmUgdXNlZCBhbmQgcHJvZHVjZWQuICBBIGNhcGFiaWxpdHkgcGF0dGVybiBkb2VzIG5vdCByZWxhdGUgdG8gYW55IHNwZWNpZmljIHBoYXNlIG9yIGl0ZXJhdGlvbiBvZiBhIGRldmVsb3BtZW50IGxpZmVjeWNsZSwgYW5kIHNob3VsZCBub3QgaW1wbHkgYW55LiAgSW4gb3RoZXIgd29yZHMsIGEgcGF0dGVybiBzaG91bGQgYmUgZGVzaWduZWQgaW4gYSB3YXkgdGhhdCBpdCBpcyBhcHBsaWNhYmxlIGFueXdoZXJlIGluIGEgRGVsaXZlcnkgUHJvY2Vzcy4gIFRoaXMgZW5hYmxlcyBpdHMgQWN0aXZpdGllcyB0byBiZSBmbGV4aWJseSBhc3NpZ25lZCB0byB3aGF0ZXZlciBwaGFzZXMgdGhlcmUgYXJlIGluIHRoZSBEZWxpdmVyeSBQcm9jZXNzIHRvIHdoaWNoIGl0IGlzIGJlaW5nIGFwcGxpZWQuICBJdCBpcyBhIGdvb2QgcHJhY3RpY2UgdG8gZGVzaWduIGEgQ2FwYWJpbGl0eSBQYXR0ZXJuIHRvIHByb2R1Y2Ugb25lIG9yIG1vcmUgZ2VuZXJpYyBEZWxpdmVyYWJsZXMuICBUaGUgdHlwaWNhbCBjb25maWd1cmF0aW9uIGlzIHRoYXQgZWFjaCBBY3Rpdml0eSBpbiB0aGUgQ2FwYWJpbGl0eSBQYXR0ZXJuIHByb2R1Y2VzIG9uZSBEZWxpdmVyYWJsZSwgYW5kIHRoZSBsYXN0IFRhc2sgRGVzY3JpcHRvciBpbiB0aGUgQWN0aXZpdHkgZXhwbGljaXRseSBvdXRwdXRzIGp1c3QgdGhpcyBEZWxpdmVyYWJsZS4gIFRoaXMgZW5hYmxlcyB0aGUgcHJvY2VzcyBlbmdpbmVlciB0byBzZWxlY3QgUGF0dGVybnMgb3IganVzdCBBY3Rpdml0aWVzIGJ5IGRlY2lkaW5nIHdoaWNoIERlbGl2ZXJhYmxlcyBhcmUgcmVxdWlyZWQuICBJdCBhbHNvIG9mZmVycyBhIHNpbXBsZSBpbnRlZ3JhdGlvbiBhcHByb2FjaDogYW4gQWN0aXZpdHkgZnJvbSBhIGNhcGFiaWxpdHkgcGF0dGVybiBpcyBsaW5rZWQgdG8gdGhlIFBoYXNlIG9yIEl0ZXJhdGlvbiB3aGljaCBpcyByZXF1aXJlZCB0byBwcm9kdWNlIHRoZSBBY3Rpdml0eSdzIERlbGl2ZXJhYmxlLiAgS2V5IGFwcGxpY2F0aW9ucyBhcmVhcyBvZiAvIGFyZWFzIG9mIHJldXNlIGZvciBDYXBhYmlsaXR5IFBhdHRlcm5zIGFyZToKLS0gVG8gc2VydmUgYXMgYnVpbGRpbmcgYmxvY2tzIGZvciBhc3NlbWJsaW5nIERlbGl2ZXJ5IFByb2Nlc3NlcyBvciBsYXJnZXIgQ2FwYWJpbGl0eSBQYXR0ZXJucy4gIE5vcm1hbGx5IGRldmVsb3BpbmcgYSBEZWxpdmVyeSBQcm9jZXNzIGlzIG5vdCBkb25lIGZyb20gc2NyYXRjaCBidXQgYnkgc3lzdGVtYXRpY2FsbHkgYXBwbHlpbmcgYW5kIGJpbmRpbmcgcGF0dGVybnMuICBJbiBhZGRpdGlvbiB0byB0aGUgc3RhbmRhcmQgcGF0dGVybiBhcHBsaWNhdGlvbiBvZiAnY29weS1hbmQtbW9kaWZ5Jywgd2hpY2ggYWxsb3dzIHRoZSBwcm9jZXNzIGVuZ2luZWVyIHRvIGluZGl2aWR1YWxseSBjdXN0b21pemUgdGhlIHBhdHRlcm4ncyBjb250ZW50IHRvIHRoZSBwYXJ0aWN1bGFyIHNpdHVhdGlvbiBpdCBpcyBhcHBsaWVkIGZvciwgdGhlIFBsdWdpbiBtZXRhLW1vZGVsIHBhY2thZ2UgKFNlY3Rpb24gNi4xKSBpbnRyb2R1Y2VzIGV2ZW4gbW9yZSBzb3BoaXN0aWNhdGVkIGluaGVyaXRhbmNlIHJlbGF0aW9uc2hpcHMgdGhhdCBzdXBwb3J0IGR5bmFtaWMgYmluZGluZyBvZiBwYXR0ZXJucyAoaS5lLiB0aGUgcGF0dGVybiBpcyByZWZlcmVuY2VkIGFuZCBub3QgY29waWVkKS4gIFRoaXMgdW5pcXVlIG5ldyB3YXkgb2YgcmV1c2luZyBwcm9jZXNzIGtub3dsZWRnZSBhbGxvd3MgdG8gZmFjdG9yIG91dCBjb21tb25seSByZW9jY3VycmluZyBBY3Rpdml0aWVzIGludG8gcGF0dGVybnMgYW5kIHRvIGFwcGx5IHRoZW0gb3ZlciBhbmQgb3ZlciBhZ2FpbiBmb3IgYSBwcm9jZXNzLiAgV2hlbiB0aGUgcGF0dGVybiBpcyBiZWluZyByZXZpc2VkIG9yIHVwZGF0ZWQsIGFsbCBjaGFuZ2VzIHdpbGwgYmUgYXV0b21hdGljYWxseSByZWZsZWN0ZWQgaW4gYWxsIHBhdHRlcm4gYXBwbGljYXRpb24gaW4gYWxsIHByb2Nlc3NlcyBiZWNhdXNlIG9mIHRoZSBkeW5hbWljIGJpbmRpbmcuCi0tIFRvIHN1cHBvcnQgZGlyZWN0IGV4ZWN1dGlvbiBpbiBhIGRldmVsb3BtZW50IHByb2plY3QgdGhhdCBkb2VzIG5vdCB3b3JrIGZvbGxvd2luZyBhIHdlbGwtZGVmaW5lZCBwcm9jZXNzLCBidXQgd29ya3MgYmFzZWQgb24gbG9vc2VseSBjb25uZWN0ZWQgcHJvY2VzcyBmcmFnbWVudHMgb2YgYmVzdCBwcmFjdGljZXMgaW4gYSBmbGV4aWJsZSBtYW5uZXIgKGUuZy4gQWdpbGUgRGV2ZWxvcG1lbnQpLgotLSBUbyBzdXBwb3J0IHByb2Nlc3MgZWR1Y2F0aW9uIGJ5IGRlc2NyaWJpbmcga25vd2xlZGdlIGZvciBhIGtleSBhcmVhIHN1Y2ggYXMgYmVzdCBwcmFjdGljZXMgb24gaG93IHRvIHBlcmZvcm0gdGhlIHdvcmsgZm9yIGEgRGlzY2lwbGluZSAoZS5nLiBSZXF1aXJlbWVudHMgTWFuYWdlbWVudCksIGZvciBhIHNwZWNpZmljIGRldmVsb3BtZW50IHRlY2huaXF1ZSAoYXNwZWN0LW9yaWVudGVkIGRldmVsb3BtZW50KSwgb3IgYSBzcGVjaWZpYyB0ZWNobmljYWwgYXJlYSAoZS5nLiByZWxhdGlvbmFsIGRhdGFiYXNlIGRlc2lnbiksIHdoaWNoIGlzIHVzZWQgZm9yIGVkdWNhdGlvbiBhbmQgdGVhY2hpbmcuCi08L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyOEQiIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwOUYiLz4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxMTlBM0YyMDIzOCIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDExOUEzRjMwMUUyIF8zQURDN0I3NDAyMkQ0MTE5QTNGMzAxRUMiPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HbF9xUS1mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDExOUEzRjIwMjM4Ij4KLSAgICAgICAgICAgICAgPGJvZHk+VGhpcyBhc3NvY2lhdGlvbiBwcm92aWRlcyB0cmFjZWFiaWxpdHkgZm9yIGEgUHJvY2VzcyBkb2N1bWVudGluZyB3aGljaCBDYXBhYmlsaXR5IFBhdHRlcm5zIGhhdmUgYmVlbiB1c2VkIGZvciBkZWZpbmluZyB0aGUgcHJvY2Vzcy4gIEl0IGRvY3VtZW50cyBhcHBsaWNhdGlvbnMgb2YgYSBwYXR0ZXJuIHRocm91Z2ggY29weSBhcyB3ZWxsIGFzIHBhdHRlcm4gYmluZGluZy48L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTE5QTNGMzAxRUMiIG5hbWU9Il9wcm9jZXNzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwOUYiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MTE5QTNGMjAyMzgiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HbF9xU3VmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HbF9xU2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkRW5kPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDExOUE0MDAwMEU2IiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0MTE5QTQwMTAwMTcgXzNBREM3Qjc0MDIyRDQxMTlBNDAxMDAyQiI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dsX3FUT2ZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTE5QTQwMDAwRTYiPgotICAgICAgICAgICAgICA8Ym9keT5JZiB0aGUgUGxhbiBoYXMgYmVlbiBjcmVhdGVkIGJhc2VkIG9uIG9uZSBvciBtb3JlIHByb2Nlc3NlcyAoaS5lLiBvdGhlciBQbGFucywgQ2FwYWJpbGl0eSBQYXR0ZXJucywgYSBEZWxpdmVyeSBQcm9jZXNzLCBvciBhbnkgY29tYmluYXRpb24gb2YgdGhlc2UpLCB0aGVuIHRoaXMgYXNzb2NpYXRpb24gY2FwdHVyZXMgYSB0cmFjZSBiYWNrIHRvIHRoZXNlIHNvdXJjZXMuPC9ib2R5PgotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICA8b3duZWRFbmQgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDExOUE0MDEwMDJCIiBuYW1lPSJfcHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDBFNSIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQxMTlBNDAwMDBFNiI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0dsX3FVLWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0dsX3FVdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRFbmQ+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTE5QTRGODAyMEEiIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQxMTlBNEY5MDA2OSBfM0FEQzdCNzQwMjJENDExOUE0RjkwMDczIj4KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR2xfcVZlZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxMTlBNEY4MDIwQSI+Ci0gICAgICAgICAgICAgIDxib2R5PlRoZSBQbGFubmluZ0RhdGEgY2xhc3MgZmFjdG9ycyBvdXQgc3BlY2lmaWMgb3B0aW9uYWwgZGF0YSBuZWVkZWQgZm9yIHJlcHJlc2VudGluZyBwbGFubmluZyB0ZW1wbGF0ZXMuICBUaGlzIGFzc29jaWF0aW9uIGFsbG93cyB0byBhY2Nlc3MgcGxhbm5pbmcgZGF0YSBpZiBpdCBpcyBzdG9yZWQgZm9yIHRoZSBCcmVha2Rvd24gRWxlbWVudC48L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTE5QTRGOTAwNzMiIG5hbWU9Il9icmVha2Rvd25FbGVtZW50IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwRUYiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MTE5QTRGODAyMEEiLz4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRkQ1NjFBMDM5NiIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDBGRDU2MUMwMDY1IF8zQURDN0I3NDAyMkQ0MEZENTYxQzAwNzkiPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HbUpiUnVmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGRDU2MUEwMzk2Ij4KLSAgICAgICAgICAgICAgPGJvZHk+VGhpcyBhc3NvY2lhdGlvbiBsaW5rcyBhbiBBY3Rpdml0eSB0byB6ZXJvIG9yIG1vcmVzIGluc3RhbmNlcyBvZiB0aGUgUm9hZG1hcCBndWlkYW5jZSB0eXBlLjwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRkQ1NjFDMDA3OSIgbmFtZT0iYWN0aXZpdHkiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQxRTBGRTkzMDA3NyIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MEZENTYxQTAzOTYiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HbUpiVGVmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iMSIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HbUpiVE9mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iMSIvPgotICAgICAgICAgICAgPC9vd25lZEVuZD4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDExQSIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTFCIF8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxMUQiPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HbUpiVC1mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTFBIj4KLSAgICAgICAgICAgICAgPGJvZHk+VGhpcyBhc3NvY2lhdGlvbiBkZWZpbmVzIGEgY29sbGVjdGlvbiBvZiBndWlkYW5jZSBkb2N1bWVudHMgdGhhdCBwcm92aWRlIGVkdWNhdGlvbiBtYXRlcmlhbCBmb3IgdGVhY2hpbmcgc3Rha2Vob2xkZXJzIHN1Y2ggYXMgcHJvamVjdCBtYW5hZ2VycyBvbiBob3cgdG8gcGVyZm9ybSBwcm9qZWN0cyB0aGF0IGZvbGxvdyB0aGlzIERlbGl2ZXJ5IFByb2Nlc3MuPC9ib2R5PgotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICA8b3duZWRFbmQgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTFCIiBuYW1lPSJfZGVsaXZlcnlQcm9jZXNzIiB2aXNpYmlsaXR5PSJwcml2YXRlIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDc3IiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTFBIj4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR21KYlUtZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR21KYlV1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEVuZD4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDEyRSIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTJGIF8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxMzEiPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HbUpiV09mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTJFIj4KLSAgICAgICAgICAgICAgPGJvZHk+VGhpcyBhc3NvY2lhdGlvbiBkZWZpbmVzIGEgY29sbGVjdGlvbiBvZiBndWlkYW5jZSBkb2N1bWVudHMgdGhhdCBoYXZlIGJlZW4gcmVsYXRlZCB0byBhIERlbGl2ZXJ5IFByb2Nlc3MgaW5zdGFuY2UgdG8gZGVzY3JpYmUgYW5kIGNoYXJhY3Rlcml6ZSBpdHMgZmVhdHVyZXMgYW5kIGNhcGFiaWxpdGllcy4gVGhlc2UgZG9jdW1lbnRzIGNhbiBiZSB1c2VkIGZvciBzZXZlcmFsIHB1cnBvc2VzIHN1Y2ggYXMgaW50ZXJuYWwgbWFya2V0aW5nIGNvbW11bmljYXRpb25zLCBzYWxlcyB0cmFpbmluZyBhbmQgZ2VuZXJhbCBtZXRob2QgZWR1Y2F0aW9uLiAgRXhhbXBsZXMgZm9yIENvbW11bmljYXRpb25zIE1hdGVyaWFsIGFyZSBIaWdobGlnaHQgRG9jdW1lbnQsIEZhY3QgU2hlZXQsIGFuZCBEZWxpdmVyeSBQcm9jZXNzIFNwZWNpZmljYXRpb24gT3ZlcnZpZXcuPC9ib2R5PgotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICA8b3duZWRFbmQgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTJGIiBuYW1lPSJfZGVsaXZlcnlQcm9jZXNzIiB2aXNpYmlsaXR5PSJwcml2YXRlIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDc3IiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTJFIj4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR21TbE0tZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR21TbE11ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEVuZD4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxRTBGRkQzMDBFRiIgbmFtZT0iQnJlYWtkb3duTmVzdGluZyIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDFFMEZGRDMwMEYwIF8zQURDN0I3NDAyMkQ0MUUwRkZEMzAwRjEiPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HbVNsT09mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFMEZGRDMwMEVGIj4KLSAgICAgICAgICAgICAgPGJvZHk+VGhpcyBiaWRpcmVjdGlvbmFsIGFzc29jaWF0aW9uIHJlcHJlc2VudHMgYnJlYWtkb3duIHN0cnVjdHVyZSBuZXN0aW5nLiAgSXQgZGVmaW5lcyBhbiBuLWxldmVsIGhpZXJhcmNoeSBvZiBBY3Rpdml0aWVzIGdyb3VwaW5nIHRvZ2V0aGVyIG90aGVyIEJyZWFrZG93biBFbGVtZW50cyBzdWNoIGFzIG90aGVyIEFjdGl2aXRpZXMsIERlc2NyaXB0b3JzLCBNaWxlc3RvbmVzLCBldGMuCi1UaGUgc3VwZXJBY3Rpdml0aWVzIHJvbGUgYWxsb3dzIG5hdmlnYXRpb24gb2YgYSBCcmVha2Rvd24gRWxlbWVudCB0byBpcyBwYXJlbnQgQWN0aXZpdHkuIFRoZSBicmVha2Rvd25FbGVtZW50cyByb2xlIGFsbG93cyBuYXZpZ2F0aW9uIGZyb20gYW4gQWN0aXZpdHkgdG8gaXRzIG5lc3RlZCBCcmVha2Rvd24gRWxlbWVudHMuCi08L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyMTI0QzNBMDI0RSIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDIxMjRDM0IwMTBGIF8zQURDN0I3NDAyMkQ0MjEyNEMzQjAxMzciPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HbVNsUWVmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxMjRDM0EwMjRFIj4KLSAgICAgICAgICAgICAgPGJvZHk+VGhpcyBhc3NvY2lhdGlvbiBwcm92aWRlcyBvbmUgbW9yZSByZWZlcmVuY2Ugd29ya2Zsb3dzIGZvciBhIERpc2NpcGxpbmUuICBUaGUgcmVmZXJlbmNlIHdvcmtmbG93cyBkZWZpbmUgdGhlIG1vc3QgdHlwaWNhbCB3YXlzIG9mIGRvaW5nIHRoZSB3b3JrIG9mIGEgRGlzY2lwbGluZS48L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MjEyNEMzQjAxMzciIG5hbWU9Il9kaXNjaXBsaW5lIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MjEyNEJFRTAwREMiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MjEyNEMzQTAyNEUiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HbVNsU09mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HbVNsUi1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkRW5kPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDI3QTlFRkUwMUNBIiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0MjdBOUVGRjAxOUEgXzNBREM3Qjc0MDIyRDQyN0E5RUZGMDFBNCI+Ci0gICAgICAgICAgICA8b3duZWRFbmQgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDI3QTlFRkYwMUE0IiBuYW1lPSJfcHJhY3RpY2UiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQyN0E5RTg2MDE3RSIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQyN0E5RUZFMDFDQSI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0dtU2xULWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0dtU2xUdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRFbmQ+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MjdBOUY1MDAzMjUiIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQyN0E5RjUyMDA0MyBfM0FEQzdCNzQwMjJENDI3QTlGNTIwMDQ1Ij4KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR21TbFVlZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E5RjUwMDMyNSI+Ci0gICAgICAgICAgICAgIDxib2R5PlRoaXMgYXNzb2NpYXRpb24gY2FuIGJlIHVzZWQgdG8gbGluayBhbGwga2luZHMgb2YgZ2VuZXJhbCBndWlkYW5jZSB0byB0aGUgQWN0aXZpdHkgdGhhdCBpcyBiZWluZyBtYW5hZ2VkIGFzIGdlbmVyYWwgU3VwcG9ydGluZyBNYXRlcmlhbC48L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MjdBOUY1MjAwNDUiIG5hbWU9Il9hY3Rpdml0eSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDFFMEZFOTMwMDc3IiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDI3QTlGNTAwMzI1Ij4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR21jV051ZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR21jV05lZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEVuZD4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyN0E5RjhDMDBDNSIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDI3QTlGOEQwMDEzIF8zQURDN0I3NDAyMkQ0MjdBOUY4RDAwMUQiPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HbWNXT09mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTlGOEMwMEM1Ij4KLSAgICAgICAgICAgICAgPGJvZHk+VGhpcyBhc3NvY2lhdGlvbiBwcm92aWRlcyBBY3Rpdml0eS0gKG9yIFByb2Nlc3MtKSBzcGVjaWZpYyBjaGVjayBwb2ludHMuICBUaGVzZSBhcmUgdHlwaWNhbGx5IHVzZWQgaW4gcmV2aWV3cyBhbmQgaW5zcGVjdGlvbnMgb24gdGhlIHdvcmsgcGVyZm9ybWVkLjwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyN0E5RjhEMDAxRCIgbmFtZT0iX2FjdGl2aXR5IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MUUwRkU5MzAwNzciIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MjdBOUY4QzAwQzUiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HbWNXUC1mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HbWNXUHVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkRW5kPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDI3QTlGOTAwMjUyIiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0MjdBOUY5MTAxQTkgXzNBREM3Qjc0MDIyRDQyN0E5RjkxMDFCNCI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dtY1dRZWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBOUY5MDAyNTIiPgotICAgICAgICAgICAgICA8Ym9keT5UaGlzIGFzc29jaWF0aW9uIHJlbGF0ZXMgY29uY2VwdHMgb3Igd2hpdGVwYXBlcnMgdG8gdGhlIEFjdGl2aXR5IHByb3ZpZGluZyBpbXBvcnRhbnQgYmFja2dyb3VuZCBpbmZvcm1hdGlvbiBuZWNlc3NhcnkgZm9yIGRvaW5nIHRoZSB3b3JrIGRlc2NyaWJlZCBieSB0aGUgQWN0aXZpdHkuPC9ib2R5PgotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICA8b3duZWRFbmQgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDI3QTlGOTEwMUI0IiBuYW1lPSJfYWN0aXZpdHkiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQxRTBGRTkzMDA3NyIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQyN0E5RjkwMDI1MiI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0dtY1dTT2ZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0dtY1dSLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRFbmQ+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MjdBOUY5NDAzQjciIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQyN0E5Rjk1MDMyMiBfM0FEQzdCNzQwMjJENDI3QTlGOTUwMzJDIj4KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR21jV1N1ZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E5Rjk0MDNCNyI+Ci0gICAgICAgICAgICAgIDxib2R5PlRoaXMgYXNzb2NpYXRpb24gY2FuIHByb3ZpZGUgcmVmZXJlbmNlcyB0byBleGFtcGxlcyByZWxldmFudCB0byB0aGlzIHNwZWNpZmljIEFjdGl2aXR5IChvciBQcm9jZXNzKS4gIDwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyN0E5Rjk1MDMyQyIgbmFtZT0iX2FjdGl2aXR5IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MUUwRkU5MzAwNzciIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MjdBOUY5NDAzQjciPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HbWxnSnVmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HbWxnSmVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkRW5kPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDI3QTlGOTkwMzgzIiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0MjdBOUY5QTAyREEgXzNBREM3Qjc0MDIyRDQyN0E5RjlBMDJFNCI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dtbGdLT2ZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBOUY5OTAzODMiPgotICAgICAgICAgICAgICA8Ym9keT5UaGlzIGFzc29jaWF0aW9uIHByb3ZpZGVzIEFjdGl2aXR5LXNwZWNpZmljIEd1aWRlbGluZXMuPC9ib2R5PgotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICA8b3duZWRFbmQgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDI3QTlGOUEwMkU0IiBuYW1lPSJfYWN0aXZpdHkiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQxRTBGRTkzMDA3NyIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQyN0E5Rjk5MDM4MyI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0dtbGdMLWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0dtbGdMdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRFbmQ+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MjdBOUY5RTAxNzgiIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQyN0E5RjlGMDA4OSBfM0FEQzdCNzQwMjJENDI3QTlGOUYwMDhCIj4KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR21sZ01lZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E5RjlFMDE3OCI+Ci0gICAgICAgICAgICAgIDxib2R5PlRoaXMgYXNzb2NpYXRpb24gcmVmZXJzIHRvIFJldXNhYmxlIEFzc2V0cyBzcGVjaWZpYyB0byB0aGlzIEFjdGl2aXR5IChvciBQcm9jZXNzKS4gPC9ib2R5PgotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICA8b3duZWRFbmQgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDI3QTlGOUYwMDhCIiBuYW1lPSJfYWN0aXZpdHkiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQxRTBGRTkzMDA3NyIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQyN0E5RjlFMDE3OCIvPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOlBhY2thZ2UiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxRTBEMEVEMDEwNCIgbmFtZT0iUHJvY2Vzc1BhY2thZ2UiPgotICAgICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfR25WdUh1ZlhFZHVxSG9PSmJVUlpSdyIgc291cmNlPSJ1bWwyLmRpYWdyYW1zIiByZWZlcmVuY2VzPSJfM0FEQzdCNzQwMjJENDBGNTdEQzgwMTk3Ij4KLSAgICAgICAgICAgIDxjb250ZW50cyB4bWk6dHlwZT0ibm90YXRpb246RGlhZ3JhbSIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGNTdEQzgwMTk3IiB0eXBlPSJDbGFzcyIgbmFtZT0iUHJvY2Vzc1BhY2thZ2UiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1sSllPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDEzRiI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctbEpZLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0ctbEpaT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWxKWmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctbEpadWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1sSlotZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctbEphT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLWxKYWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1sSmF1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLWxKYS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1sSmJPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLWxKYmVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1sSmJ1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy1sSmItZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRy1sSlllZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMTI2MzIyNTYiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRy1sSll1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTk3MiIgeT0iMTk4MSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1sSnR1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDE2NyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctbEp1ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0ctbEp1dWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWxKdS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctbEp2T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1sSnZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctbEp2dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy1sSnYtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctbEp3T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy1sSndlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctbEp3dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy1sSnctZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctbEp4T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctbEp4ZWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0ctbEp0LWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJOb25lIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRy1sSnVPZlhFZHVxSG9PSmJVUlpSdyIgeD0iNzI2NiIgeT0iNTkyOCIgd2lkdGg9IjQwNDciIGhlaWdodD0iMTExNyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1sSnh1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyODNFOEExMDM0MSI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctbEp5ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0ctbEp5dWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIzMDMxIiBoZWlnaHQ9IjExMzQiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWxKeS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctbEp6T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1sSnplZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctbEp6dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy1sSnotZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctbEowT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy1sSjBlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctbEowdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy1sSjAtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctbEoxT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctbEoxZWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0ctbEp4LWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dQYXJlbnQ9Ik5hbWUiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRy1sSnlPZlhFZHVxSG9PSmJVUlpSdyIgeD0iMjc1MSIgeT0iOTEzNSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1sSjF1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDE1MyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctbEoyZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0ctbEoydWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWxKMi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctbEozT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1sSjNlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctbEozdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy1sSjMtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctbEo0T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy1sSjRlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctbEo0dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy1sSjQtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctbEo1T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctbEo1ZWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0ctbEoxLWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJOb25lIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRy1sSjJPZlhFZHVxSG9PSmJVUlpSdyIgeD0iMjUwNiIgeT0iNjEyOSIgd2lkdGg9IjMzMTgiIGhlaWdodD0iMTc2OSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxEaWFncmFtU3R5bGUiIHhtaTppZD0iX0duVnVJT2ZYRWR1cUhvT0piVVJaUnciIGRlc2NyaXB0aW9uPSJUaGlzIGRpYWdyYW0gc2hvd3MgdGhlIGRlZmluaXRpb24gb2YgUHJvY2VzcyBQYWNrYWdlIGFuZCB3aGF0IGVsZW1lbnRzIGl0IGNhbiBzdG9yZS4gIFRoZSBQcm9jZXNzIFBhY2thZ2UgcGFja2FnZSBleHRlbmRzIE1ldGhvZCBQYWNrYWdlIHdpdGggdGhlIG5ldyBjb25jZXB0IG9mIFByb2Nlc3MgUGFja2FnZS4gIFdoZXJlYXMgdGhlIHNwZWNpYWwgTWV0aG9kIFBhY2thZ2UgQ29udGVudCBQYWNrYWdlcyBzdG9yZXMgY29yZSBjb250ZW50IGVsZW1lbnRzLCB0aGUgUHJvY2VzcyBwYWNrYWdlIGlzIHNwZWNpYWxpemVkIGluIHN0b3JpbmcgUHJvY2VzcyBFbGVtZW50cy4gIFRoZSBzZXBhcmF0aW9uIG9mIENvbnRlbnQgdmVyc3VzIFByb2Nlc3MgUGFja2FnZXMgZW5mb3JjZXMgdGhlIHNlcGFyYXRpb24gb2YgbWV0aG9kIGNvbnRlbnQgdmVyc3VzIGl0cyBhcHBsaWNhdGlvbiBpbiBwcm9jZXNzZXMuICBNZXRob2QgY29udGVudCBpcyBpbnRlbmRlZCBiZSByZXVzZWQgaW4gbWFueSBwcm9jZXNzZXMuICBUaGVyZWZvcmUsIHN0b3JpbmcgbWV0aG9kIGNvbnRlbnQgYW5kIHByb2Nlc3MgZWxlbWVudHMgaW4gdGhlIHNhbWUgcGFja2FnZSB3b3VsZCBlYXNpbHkgdmlvbGF0ZSB0aGlzIHByaW5jaXBsZSBhbmQgcHJvY2VzcyBtb2RlbHMgd291bGQgYmUgYmVjb21lIHVubmVjZXNzYXJpbHkgY29oZXNpdmUuICBUaGVyZWZvcmUsIFVNQSBlbmZvcmNlcyB0aGUgc2VwYXJhdGlvbiBvZiBDb250ZW50IGFuZCBQcm9jZXNzIGJ5IG5vdCBhbGxvd2luZyB0byBzdG9yZSB0aGVtIGluIHRoZSBzYW1lIHR5cGUgb2YgcGFja2FnZS4gIi8+Ci0gICAgICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0ctbEpjT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MTAwMzUiIHNvdXJjZT0iX0ctbEpZT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0ctbEpZT2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWxKYy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctbEpkZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWxKZHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HLWxKZE9mWEVkdXFIb09KYlVSWlJ3IiB4PSItNjEwIiB5PSItMzEwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1sSmQtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYxMDAzOCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1sSmVlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRy1sSmVPZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTcxNyIgeT0iLTM5MSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctbEpldWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjEwMDM4Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWxKZk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRy1sSmUtZlhFZHVxSG9PSmJVUlpSdyIgeD0iNzM4IiB5PSItMzUzIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1sSmZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjEwMDM2Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWxKZi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0ctbEpmdWZYRWR1cUhvT0piVVJaUnciIHg9Ii0zMjgiIHk9Ii0yOTciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWxKZ09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYxMDAzNiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1sSmd1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRy1sSmdlZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTIzNyIgeT0iLTI1NCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctbEpnLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MTAwMzgiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctbEpoZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctbEpodWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0ctbEpoT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWxKaC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MTAwMzYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctbEppZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctbEppdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0ctbEppT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWxKaS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYxMDAzOCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1sSmplZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy1sSmp1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRy1sSmpPZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctbEpqLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MTAwMzYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctbEprZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy1sSmt1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRy1sSmtPZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0ctbEpjZWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjEyNjMyMjU2IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0ctbEpjdWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzg0NywgNTAyLCA4NDcsIDUwMl0kWzg0NywgMTgwMiwgODQ3LCAxODAyXSRbNjg4MCwgMTgwMiwgNjg4MCwgMTgwMl0kWzY4ODAsIDI5MSwgNjg4MCwgMjkxXSRbMTYxNCwgMjkxLCAxNjE0LCAyOTFdIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HLWxKay1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjEwMDQ5IiBzb3VyY2U9Il9HLWxKWU9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HLWxKWU9mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1sSmx1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWxKbU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1sSm1lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRy1sSmwtZlhFZHVxSG9PSmJVUlpSdyIgeD0iODM3IiB5PSItNTA4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1sSm11ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYxMDA0QyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1sSm5PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRy1sSm0tZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTA3MyIgeT0iLTg3MSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctbEpuZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjEwMDRDIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWxKbi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRy1sSm51ZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTY4NiIgeT0iLTI3NyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctbEpvT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYxMDA0QSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1sSm91ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HLWxKb2VmWEVkdXFIb09KYlVSWlJ3IiB4PSI3MTMiIHk9Ii0zMDgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWxKby1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjEwMDRBIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWxKcGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HLWxKcE9mWEVkdXFIb09KYlVSWlJ3IiB4PSItNzc3IiB5PSItMzMwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1sSnB1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYxMDA0QyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1sSnFPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy1sSnFlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRy1sSnAtZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctbEpxdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYxMDA0QSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1sSnJPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy1sSnJlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRy1sSnEtZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctbEpydWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjEwMDRDIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWxKc09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLWxKc2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HLWxKci1mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1sSnN1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYxMDA0QSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1sSnRPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLWxKdGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HLWxKcy1mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRy1sSmxPZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMTI2MzIyNTYiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRy1sSmxlZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMTYxNCwgNTMsIDE2MTQsIDUzXSRbNjg1MywgNTMsIDY4NTMsIDUzXSRbNjg1MywgLTE5MDUsIDY4NTMsIC0xOTA1XSRbMjM5LCAtMTkwNSwgMjM5LCAtMTkwNV0kWzIzOSwgLTUzMCwgMjM5LCAtNTMwXSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRy1sSjV1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkxMDJFNyIgc291cmNlPSJfRy1sSjF1ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRy1sSllPZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctbEo2ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1sSjYtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctbEo3T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HLWxKNnVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRy1sSjUtZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HLWxKNk9mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9Ils2NywgLTg4MCwgMTYsIDMzMzVdJFs2NywgLTM0MDMsIDE2LCA4MTJdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0ctdTZZT2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HLXU2WWVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0ctdTZZdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MTAzQjkiIHNvdXJjZT0iX0ctbEp0dWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0ctbEoxdWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLXU2WmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctdTZaLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLXU2YU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRy11Nlp1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0ctdTZZLWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRy11NlpPZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTIwMzcsIDgwLCAzMjU1LCAtNzldJFstMzYyNSwgODAsIDE2NjcsIC03OV0iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRy11NmFlZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0ctdTZhdWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRy11NmEtZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyODNFRDg5MDM2MiIgc291cmNlPSJfRy1sSjF1ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRy1sSnh1ZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctdTZidWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy11NmNPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctdTZjZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HLXU2Yi1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy11NmN1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjgzRUQ4OTAzNjQiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctdTZkT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0ctdTZjLWZYRWR1cUhvT0piVVJaUnciIHk9IjM5NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctdTZkZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyODNFRDg5MDM2NCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy11NmQtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0ctdTZkdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0zOTciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLXU2ZU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjgzRUQ4OTAzNjMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctdTZldWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRy11NmVlZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTE2OCIgeT0iLTE4NyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctdTZlLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjgzRUQ4OTAzNjMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctdTZmZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0ctdTZmT2ZYRWR1cUhvT0piVVJaUnciIHg9Ii0yMDciIHk9IjE1MzEiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLXU2ZnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI4M0VEODkwMzY0Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLXU2Z09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLXU2Z2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HLXU2Zi1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy11Nmd1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI4M0VEODkwMzYzIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLXU2aE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLXU2aGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HLXU2Zy1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy11Nmh1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjgzRUQ4OTAzNjQiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctdTZpT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctdTZpZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0ctdTZoLWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLXU2aXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI4M0VEODkwMzYzIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLXU2ak9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctdTZqZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0ctdTZpLWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HLXU2Yk9mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0ctdTZiZWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzg0LCA4ODAsIC0xNiwgLTE4MTFdJFs4NCwgMjEyNSwgLTE2LCAtNTY3XSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgPC9jb250ZW50cz4KLSAgICAgICAgICAgIDxjb250ZW50cyB4bWk6dHlwZT0ibm90YXRpb246RGlhZ3JhbSIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDEwQUI2NjAwMzlCIiB0eXBlPSJDbGFzcyIgbmFtZT0iUHJvY2Vzc0NvbXBvbmVudCI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLXU2anVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMEU2Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy11NmtlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRy11Nmt1ZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctdTZrLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy11NmxPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLXU2bGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy11Nmx1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLXU2bC1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy11Nm1PZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLXU2bWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy11Nm11ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLXU2bS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy11Nm5PZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy11Nm5lZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRy11NmotZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HLXU2a09mWEVkdXFIb09KYlVSWlJ3IiB4PSI0MDg5IiB5PSI3NDc2Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLXU2bnVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMEVGIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy11Nm9lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRy11Nm91ZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctdTZvLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy11NnBPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLXU2cGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy11NnB1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLXU2cC1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy11NnFPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLXU2cWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy11NnF1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLXU2cS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy11NnJPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy11NnJlZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRy11Nm4tZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HLXU2b09mWEVkdXFIb09KYlVSWlJ3IiB4PSIzNTEzIiB5PSI0NTgwIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLXU2dC1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMTUzIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy11NnV1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRy11NnUtZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctdTZ2T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy11NnZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLXU2dnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy11NnYtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLXU2d09mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy11NndlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLXU2d3VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy11NnctZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLXU2eE9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy11NnhlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy11Nnh1ZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRy11NnVPZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HLXU2dWVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxNTM5MiIgeT0iMjM1MyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy00RVVPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDAwOSI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctNEVVLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0ctNEVWT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLTRFVmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctNEVWdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy00RVYtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctNEVXT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy00RVdlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctNEVXdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy00RVctZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctNEVYT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy00RVhlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctNEVYdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctNEVYLWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0ctNEVVZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRy00RVV1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iNzQ2NyIgeT0iMTAzMjAiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctNEVhZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwNDUiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLTRFYk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HLTRFYmVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy00RWJ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLTRFYi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctNEVjT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLTRFY2VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctNEVjdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLTRFYy1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctNEVkT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLTRFZGVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctNEVkdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLTRFZC1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLTRFZU9mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HLTRFYXVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0ctNEVhLWZYRWR1cUhvT0piVVJaUnciIHg9IjEwMzEyIiB5PSI3NDQyIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLTRFZ3VmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMTcxIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy00RWhlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRy00RWh1ZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctNEVoLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy00RWlPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLTRFaWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy00RWl1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLTRFaS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy00RWpPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLTRFamVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy00RWp1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLTRFai1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy00RWtPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy00RWtlZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRy00RWctZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HLTRFaE9mWEVkdXFIb09KYlVSWlJ3IiB4PSIxOTU1OCIgeT0iNzM5MSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy00RTRlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxMDU4MUUzMDM0MiI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctNEU1T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0ctNEU1ZWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLTRFNXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctNEU1LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy00RTZPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctNEU2ZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy00RTZ1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctNEU2LWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy00RTdPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctNEU3ZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy00RTd1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctNEU3LWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctNEU4T2ZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0ctNEU0dWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRy00RTQtZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTE1MSIgeT0iMTAzMzciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctNEUtdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwOUYiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLTRFX2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HLTRFX3VmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMjY3NSIgaGVpZ2h0PSIxMTAwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy00RV8tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLTRGQU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctNEZBZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX0IxVU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0dfQjFVZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX0IxVXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0dfQjFVLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX0IxVk9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0dfQjFWZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX0IxVnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HX0IxVi1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HLTRFLS1mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0ctNEVfT2ZYRWR1cUhvT0piVVJaUnciIHg9IjIwNjU4IiB5PSIxNTMyIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX0IxV09mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMTY3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19CMVctZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfR19CMVhPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfQjFYZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19CMVh1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX0IxWC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19CMVlPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HX0IxWWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19CMVl1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HX0IxWS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19CMVpPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HX0IxWmVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19CMVp1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfR19CMVotZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfR19CMVdlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HX0IxV3VmWEVkdXFIb09KYlVSWlJ3IiB4PSIyMDIwOSIgeT0iNDI5MiIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxEaWFncmFtU3R5bGUiIHhtaTppZD0iX0duVnVJdWZYRWR1cUhvT0piVVJaUnciIGRlc2NyaXB0aW9uPSJUaGlzIGRpYWdyYW0gcHJvdmlkZXMgYW4gb3ZlcnZpZXcgdG8gdGhlIHNwZWNpZmljYXRpb24gb2YgUHJvY2VzcyBDb21wb25lbnRzLiIvPgotICAgICAgICAgICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HLXU2cnVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjhGIiBzb3VyY2U9Il9HLXU2anVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HLXU2bnVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy11NnNlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLXU2cy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy11NnRPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0ctdTZzdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HLXU2ci1mWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRy11NnNPZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMCwgLTU1OCwgMCwgMjMzNl0kWzAsIC0yMzQ1LCAwLCA1NTBdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0ctdTZ0ZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HLXU2dHVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0ctNEVZT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzMDMiIHNvdXJjZT0iX0ctNEVVT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0ctdTZqdWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLTRFWS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctNEVaZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLTRFWnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRy00RVpPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0ctNEVZZWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HLTRFWXVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstNzExLCAtNTU4LCAyODk1LCAyMjg2XSRbLTI5MTIsIC0yMjk0LCA2OTQsIDU1MF0iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRy00RVotZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0ctNEVhT2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRy00RWVlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDNENiIgc291cmNlPSJfRy00RWFlZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRy11Nmp1ZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctNEVmT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy00RWZ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctNEVmLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HLTRFZmVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRy00RWV1ZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HLTRFZS1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMjAzMiwgOCwgNTA4MCwgLTQyXSRbLTU5NjksIDgsIDExNDMsIC00Ml0iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRy00RWdPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0ctNEVnZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRy00RWt1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkxMDNDRCIgc291cmNlPSJfRy00RVVPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRy00RWd1ZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctNEVsZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy00RWwtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctNEVtT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HLTRFbHVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy00RW1lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkxMDNEMCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy00RW0tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRy00RW11ZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTE2ODQiIHk9Ii0yOTQiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLTRFbk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkxMDNEMCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy00RW51ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0ctNEVuZWZYRWR1cUhvT0piVVJaUnciIHg9IjEwMiIgeT0iMzEzIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy00RW4tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTEwM0NFIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLTRFb2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0ctNEVvT2ZYRWR1cUhvT0piVVJaUnciIHg9IjE0NTciIHk9IjIzNyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctNEVvdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTEwM0NFIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLTRFcE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HLTRFby1mWEVkdXFIb09KYlVSWlJ3IiB4PSI2OTUiIHk9Ii0zNDciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLTRFcGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTEwM0QwIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLTRFcC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLTRFcU9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HLTRFcHVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy00RXFlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTEwM0NFIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLTRFcS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLTRFck9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HLTRFcXVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy00RXJlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MTAzRDAiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctNEVyLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctNEVzT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0ctNEVydWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLTRFc2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTEwM0NFIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLTRFcy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctNEV0T2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0ctNEVzdWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HLTRFay1mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0ctNEVsT2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzEzNzEsIC05MywgLTExNzM0LCAyOTA0XSRbMTMwNjQsIC05MywgLTQyLCAyOTA0XSRbMTMwNjQsIC0yNTE0LCAtNDIsIDQ4Ml0iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0ctNEV0ZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTAxNkIxQTAzMUUiIHNvdXJjZT0iX0ctNEVndWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0ctNEVhZWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLTRFdU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctNEV1dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLTRFdS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRy00RXVlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctNEV2T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTAxNkIxQjAyMTkiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctNEV2dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0ctNEV2ZWZYRWR1cUhvT0piVVJaUnciIHg9Ii0yNTIiIHk9Ii0yOTciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLTRFdi1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTAxNkIxQjAyMTkiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctNEV3ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HLTRFd09mWEVkdXFIb09KYlVSWlJ3IiB5PSItMzk3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy00RXd1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDEwMTZCMUIwMUQzIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLTRFeE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0ctNEV3LWZYRWR1cUhvT0piVVJaUnciIHg9IjIzNSIgeT0iMTk0Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy00RXhlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxMDE2QjFCMDFEMyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy00RXgtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRy00RXh1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTY4MSIgeT0iLTMwNCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctNEV5T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTAxNkIxQjAyMTkiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctNEV5dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctNEV5LWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0ctNEV5ZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLTRFek9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTAxNkIxQjAxRDMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctNEV6dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctNEV6LWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0ctNEV6ZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLTRFME9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxMDE2QjFCMDIxOSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy00RTB1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy00RTAtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRy00RTBlZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctNEUxT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTAxNkIxQjAxRDMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctNEUxdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy00RTEtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRy00RTFlZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0ctNEV0dWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRy00RXQtZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTIzODcsIDUwLCA3MjEzLCAtNTBdJFstNzU2OSwgNTAsIDIwMzIsIC01MF0iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0ctNEUyT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTAxQkQ2QTAyM0IiIHNvdXJjZT0iX0ctNEVndWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0ctdTZudWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLTRFMi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctNEUzZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLTRFM3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRy00RTNPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0ctNEUyZWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRy00RTJ1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTIwOTEsIC00ODIsIDE0NjIxLCAyMjYwXSRbLTIwOTEsIC0yNDk3LCAxNDYyMSwgMjQ1XSRbLTE0OTk0LCAtMjQ5NywgMTcxOCwgMjQ1XSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HLTRFMy1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRy00RTRPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HLTRFOGVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDEwNTgyMUIwMDg3IiBzb3VyY2U9Il9HLTRFNGVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HLXU2anVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy00RTlPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLTRFOXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy00RTktZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0ctNEU5ZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HLTRFOHVmWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRy00RTgtZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMjYyLCAtNDkxLCAtMTMxMiwgMjMwMl0kWzEyNDQsIC0yMjQzLCAtMzMwLCA1NTBdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0ctNEUtT2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HLTRFLWVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0dfQjFhT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MTAzQjkiIHNvdXJjZT0iX0dfQjFXT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0ctdTZ0LWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX0IxYS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfQjFiZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX0IxYnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfR19CMWJPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0dfQjFhZWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HX0IxYXVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMTI1MywgLTQ5MSwgMzcyNSwgMTQzOV0kWy0zNjk5LCAtMTQzOSwgMTI3OCwgNDkxXSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HX0IxYi1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfR19CMWNPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HX0IxY2VmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTEwM0JBIiBzb3VyY2U9Il9HLTRFZ3VmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HX0IxV09mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19CMWRPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX0IxZHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19CMWQtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0dfQjFkZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX0IxZU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTEwM0JEIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX0IxZXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HX0IxZWVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxOTkiIHk9Ii0yOTkiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX0IxZS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkxMDNCRCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19CMWZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0dfQjFmT2ZYRWR1cUhvT0piVVJaUnciIHg9IjEzNyIgeT0iMTAyMyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfQjFmdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkxMDNCQiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19CMWdPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HX0IxZi1mWEVkdXFIb09KYlVSWlJ3IiB4PSI2MiIgeT0iLTE2MCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfQjFnZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MTAzQkIiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfQjFnLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0dfQjFndWZYRWR1cUhvT0piVVJaUnciIHg9IjcwIiB5PSIxMDE2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19CMWhPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkxMDNCRCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19CMWh1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfR19CMWgtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfR19CMWhlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfQjFpT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkxMDNCQiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19CMWl1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfR19CMWktZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfR19CMWllZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfQjFqT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTEwM0JEIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX0IxanVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HX0Ixai1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HX0IxamVmWEVkdXFIb09KYlVSWlJ3IiB4PSI3OTQiIHk9Ijk3OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfQjFrT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MTAzQkIiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfQjFrdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfR19CMWstZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfR19CMWtlZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0dfQjFjdWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HX0IxYy1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlswLCAtNDkxLCAwLCAyNjA3XSRbMCwgLTI2MTYsIDAsIDQ4Ml0iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0dfQjFsT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTA1ODlFMjAwNEQiIHNvdXJjZT0iX0ctNEU0ZWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0dfQjFXT2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX0IxbC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfQjFtZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX0IxbXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfR19CMW1PZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfQjFtLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTA1ODlFMzAxM0MiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfQjFuZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0dfQjFuT2ZYRWR1cUhvT0piVVJaUnciIHg9Ii0zODcyIiB5PSItNzc4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19CMW51ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDEwNTg5RTMwMTNDIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX0Ixb09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfR19CMW4tZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTM5NyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfQjFvZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxMDU4OUUzMDExNCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19CMW8tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HX0Ixb3VmWEVkdXFIb09KYlVSWlJ3IiB4PSIxNzMzIiB5PSItMzAwMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfQjFwT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDEwNTg5RTMwMTE0Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX0IxcHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HX0IxcGVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMzk3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19CMXAtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxMDU4OUUzMDEzQyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19CMXFlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfR19CMXF1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfR19CMXFPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfQjFxLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxMDU4OUUzMDExNCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19CMXJlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfR19CMXJ1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfR19CMXJPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfQjFyLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDEwNTg5RTMwMTNDIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX0Ixc2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HX0Ixc3VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HX0Ixc09mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19CMXMtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxMDU4OUUzMDExNCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19CMXRlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HX0IxdHVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HX0IxdE9mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfR19CMWxlZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HX0IxbHVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlszMzgsIDQ4MiwgLTE3OTQ5LCA2NTI3XSRbMzM4LCAxNjQyLCAtMTc5NDksIDc2ODddJFsyMzU1NCwgMTY0MiwgNTI2NiwgNzY4N10kWzIzNTU0LCAtNjI1NiwgNTI2NiwgLTIxMV0kWzIwMDIzLCAtNjI1NiwgMTczNSwgLTIxMV0iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0dfQjF0LWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdCRjQzOTAxQkIiIHNvdXJjZT0iX0dfQjFXT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0ctNEUtdWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX0IxdXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfQjF2T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX0IxdmVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfR19CMXUtZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfQjF2dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdCRjQzQTAzOUQiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfQjF3T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0dfQjF2LWZYRWR1cUhvT0piVVJaUnciIHg9IjQxNCIgeT0iMTkyIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19CMXdlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QkY0M0EwMzlEIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX0Ixdy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfR19CMXd1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTM5NyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfQjF4T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0JGNDNBMDMyRiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19CMXh1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HX0IxeGVmWEVkdXFIb09KYlVSWlJ3IiB4PSItMjM4IiB5PSIxODUiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX0IxeC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QkY0M0EwMzJGIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX0IxeWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HX0IxeU9mWEVkdXFIb09KYlVSWlJ3IiB4PSItMjA5IiB5PSItNzM2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19CMXl1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0JGNDNBMDM5RCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19CMXpPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfR19CMXplZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfR19CMXktZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfQjF6dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0JGNDNBMDMyRiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19CMTBPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfR19CMTBlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfR19CMXotZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfQjEwdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QkY0M0EwMzlEIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX0IxMU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HX0IxMWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HX0IxMC1mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19CMTF1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0JGNDNBMDMyRiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19CMTJPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HX0IxMmVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HX0IxMS1mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfR19CMXVPZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HX0IxdWVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9Ils1MCwgLTQ4MiwgMCwgMjIwOV0kWzUwLCAtMjE0MiwgMCwgNTUwXSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgPC9jb250ZW50cz4KLSAgICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dtNUNJLWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUUwRDBFRDAxMDQiPgotICAgICAgICAgICAgPGJvZHk+MDM8L2JvZHk+Ci0gICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VNZXJnZSB4bWk6aWQ9Il9yMFZSSU94aEVkdUhqZTNwUGFoTjRBIiBtZXJnZWRQYWNrYWdlPSJfM0FEQzdCNzQwMjJENDFERjJBMUIwMkU3Ii8+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxNjciIG5hbWU9IlByb2Nlc3NDb21wb25lbnQiPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HbTVDTGVmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMTY3Ij4KLSAgICAgICAgICAgICAgPGJvZHk+QSBQcm9jZXNzIENvbXBvbmVudCBpcyBhIHNwZWNpYWwgUHJvY2VzcyBQYWNrYWdlIHRoYXQgYXBwbGllcyB0aGUgcHJpbmNpcGxlcyBvZiBlbmNhcHN1bGF0aW9uLiAgQSBQcm9jZXNzIENvbXBvbmVudCByZWFsaXplcyBvbmUgb3IgbW9yZSBJbnRlcmZhY2VzIHdoaWNoIHNwZWNpZnkgaW5wdXRzIGFuZCBvdXRwdXRzIG9mIHRoZSBjb21wb25lbnQuIFRoZXJlIG1pZ2h0IGJlIG1hbnkgY29tcG9uZW50cyByZWFsaXppbmcgdGhlIHNhbWUgaW50ZXJmYWNlcywgYnV0IHVzaW5nIGRpZmZlcmVudCB0ZWNobmlxdWVzIHRvIGFjaGlldmUgc2ltaWxhciBvdXRwdXRzIGZvciBzaW1pbGFyIGlucHV0cy4gIFdoZXJlYXMgdGhlIENvbXBvbmVudCBJbnRlcmZhY2VzIHJlcHJlc2VudCBjb21wb25lbnQgc3BlY2lmaWNhdGlvbnMgKGJsYWNrIGJveCBkZXNjcmlwdGlvbnMgb2YgdGhlIGNvbXBvbmVudCksIGdvb2QgY2FuZGlkYXRlcyBmb3IgY29tcG9uZW50IHJlYWxpemF0aW9ucyBjYW4gYmUgZm91bmQgaW4gQ2FwYWJpbGl0eSBQYXR0ZXJucyAod2hpdGUgYm94IGRlc2NyaXB0aW9ucyBmb3IgdGhlIGNvbXBvbmVudCkuCi1VTUEgc3VwcG9ydHMgcmVwbGFjZWFibGUgYW5kIHJldXNhYmxlIFByb2Nlc3MgQ29tcG9uZW50cyByZWFsaXppbmcgdGhlIHByaW5jaXBsZXMgb2YgZW5jYXBzdWxhdGlvbi4gQ2VydGFpbiBzaXR1YXRpb25zIGluIGEgc29mdHdhcmUgZGV2ZWxvcG1lbnQgcHJvamVjdCBtaWdodCByZXF1aXJlIHRoYXQgY29uY3JldGUgcmVhbGl6YXRpb25zIG9mIHBhcnRzIG9mIHRoZSBwcm9jZXNzIHJlbWFpbiB1bmRlY2lkZWQgb3Igd2lsbCBiZSBkZWNpZGVkIGJ5IHRoZSBleGVjdXRpbmcgdGVhbSBpdHNlbGYgKGUuZy4gaW4gb3V0c291cmNpbmcgc2l0dWF0aW9ucykuICBVTUEgcHJvdmlkZXMgYSB1bmlxdWUgY29tcG9uZW50IGNvbmNlcHQgZGVmaW5pbmcgaW50ZXJmYWNlcyBmb3Igd29yayBwcm9kdWN0IGlucHV0IGFuZCBvdXRwdXQsIGFsbG93aW5nIHRyZWF0aW5nIHRoZSBhY3R1YWwgZGVmaW5pdGlvbiBvZiB0aGUgd29yayB0aGF0IHByb2R1Y2VzIHRoZSBvdXRwdXRzIGFzIGEgJnF1b3Q7YmxhY2sgYm94JnF1b3Q7LiAgQXQgYW55IHBvaW50IGR1cmluZyBhIHByb2plY3QgdGhlIGNvbXBvbmVudCAmcXVvdDtyZWFsaXphdGlvbiZxdW90OyBkZXRhaWxpbmcgdGhlIHdvcmsgY2FuIGJlIGFkZGVkIHRvIHRoZSBwcm9jZXNzLiAgVGhlIGNvbXBvbmVudCBhcHByb2FjaCBhbHNvIGFsbG93cyB0aGF0IGRpZmZlcmVudCBzdHlsZXMgb3IgdGVjaG5pcXVlcyBvZiBkb2luZyB3b3JrIGNhbiBiZSByZXBsYWNlZCB3aXRoIG9uZSBhbm90aGVyLiAgRm9yIGV4YW1wbGUsIGEgc29mdHdhcmUgY29kZSBvdXRwdXQgb2YgYSBjb21wb25lbnQgY291bGQgYmUgcHJvZHVjZWQgd2l0aCBhIG1vZGVsLWRyaXZlbiBkZXZlbG9wbWVudCBvciBhIGNvZGUtY2VudHJpYyB0ZWNobmlxdWUuICBUaGUgY29tcG9uZW50IGNvbmNlcHQgZW5jYXBzdWxhdGVzIHRoZSBhY3R1YWwgd29yayBhbmQgbGV0cyB0aGUgZGV2ZWxvcG1lbnQgdGVhbSBjaG9vc2UgdGhlIGFwcHJvcHJpYXRlIHRlY2huaXF1ZSBhbmQgZmlsbCB0aGUgY29tcG9uZW50J3MgcmVhbGl6YXRpb24gd2l0aCB0aGVpciBjaG9pY2Ugb2YgQWN0aXZpdGllcyB0aGF0IHByb2R1Y2UgdGhlIHJlcXVpcmVkIG91dHB1dHMuCi08L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MTAzQjkiIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxNTMiPgotICAgICAgICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iX29DUXBjTy1kRWR1NU9PZWp5MDYyNHciIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy91bWwyLzIuMC4wL1VNTCI+Ci0gICAgICAgICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfb0NRcGNlLWRFZHU1T09lankwNjI0dyIga2V5PSJleHRlbmQiLz4KLSAgICAgICAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICAgICAgICA8L2dlbmVyYWxpemF0aW9uPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkxMDNCRCIgbmFtZT0iaW50ZXJmYWNlcyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMTcxIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQwRjM2QzkxMDNCQSI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0duQ01JdWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0duQ01JZWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyN0JGNDNBMDMyRiIgbmFtZT0icHJvY2VzcyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDlGIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQyN0JGNDM5MDFCQiI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0duVnVFLWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0duVnVFdWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDEwNTgxRTMwMzQyIiBuYW1lPSJQcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvciI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dtNUNNZWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTA1ODFFMzAzNDIiPgotICAgICAgICAgICAgICA8Ym9keT5BIFByb2Nlc3MgQ29tcG9uZW50IERlc2NyaXB0b3IgcmVwcmVzZW50cyBhIFByb2Nlc3MgQ29tcG9uZW50IGFwcGxpY2F0aW9uIGluIGEgUHJvY2VzcywgaS5lLiB0aGUgYnJlYWtkb3duIHN0cnVjdHVyZSBkZWZpbmluZyB0aGUgUHJvY2Vzcy4gIFRoZSBQcm9jZXNzIENvbXBvbmVudCBEZXNjcmlwdG9yIGlzIHVzZWQgdG8gZW5jYXBzdWxhdGUgdGhlIGRldGFpbHMgb2YgdGhlIGNvbXBvbmVudCBpbiBhIGJyZWFrZG93biBzdHJ1Y3R1cmUgYW5kIHRvIHByb3ZpZGUgaXRzIG93biBzZXQgb2YgcmVsYXRpb25zaGlwcyBzdWNoIGFzIGl0IG93biBwcmVkZWNlc3NvcnMgYW5kIHN1Y2Nlc3NvcnMuPC9ib2R5PgotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDEwNTgyMUIwMDg3IiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMEU2Ii8+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDEwNTg5RTMwMTE0IiBuYW1lPSJfcHJvY2Vzc0NvbXBvbmVudCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMTY3IiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDEwNTg5RTIwMDREIj4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR25MOUplZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IjEiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR25MOUpPZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IjEiLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxNzEiIG5hbWU9IlByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UiPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HbkNNRS1mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMTcxIj4KLSAgICAgICAgICAgICAgPGJvZHk+QSBQcm9jZXNzIENvbXBvbmVudCBJbnRlcmZhY2UgY29tcHJpc2VzIG9mIGEgbGlzdCBvZiBpbnRlcmZhY2Ugc3BlY2lmaWNhdGlvbnMgKHNpbWlsYXIgdG8gb3BlcmF0aW9uIGRlY2xhcmF0aW9ucykgdGhhdCBleHByZXNzIGlucHV0cyBhbmQgb3V0cHV0cyBmb3IgYSBwcm9jZXNzIGNvbXBvbmVudC4gIFRoZXNlIGludGVyZmFjZSBzcGVjaWZpY2F0aW9ucyBhcmUgZXhwcmVzc2VkIHVzaW5nIFRhc2sgRGVzY3JpcHRvcnMgd2hpY2ggYXJlIG5vdCBsaW5rZWQgdG8gVGFza3MgdGhhdCBhcmUgcmVsYXRlZCB0byBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvcnMgYXMgd2VsbCBhcyBvcHRpb25hbCBhIFJvbGUgRGVzY3JpcHRvci48L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTAxQkQ2QTAyM0IiIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwRUYiLz4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MTAzRDAiIG5hbWU9ImludGVyZmFjZVNwZWNpZmljYXRpb25zIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwMDkiIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDBGMzZDOTEwM0NEIj4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR25MOUZ1ZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR25MOUZlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTAxNkIxQjAxRDMiIG5hbWU9ImludGVyZmFjZUlPIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwNDUiIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDEwMTZCMUEwMzFFIj4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR25MOUhPZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR25MOUctZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDE1MyIgbmFtZT0iUHJvY2Vzc1BhY2thZ2UiPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HbkNNRi1mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMTUzIj4KLSAgICAgICAgICAgICAgPGJvZHk+UHJvY2VzcyBQYWNrYWdlIGlzIGEgc3BlY2lhbCBNZXRob2QgUGFja2FnZSB0aGF0IGNvbnRhaW5zIFByb2Nlc3MgRWxlbWVudHMsIG9ubHkuCi1BIGtleSBzZXBhcmF0aW9uIG9mIGNvbmNlcm5zIGluIFVNQSBpcyB0aGUgZGlzdGluY3Rpb24gYmV0d2VlbiBNZXRob2QgQ29udGVudCBhbmQgUHJvY2Vzcy4gIFRoaXMgc2VwYXJhdGlvbiBpcyBlbmZvcmNlZCBieSBzcGVjaWFsIHBhY2thZ2UgdHlwZXMsIHdoaWNoIGRvIG5vdCBhbGxvdyB0aGUgbWl4aW5nIG9mIG1ldGhvZCBjb250ZW50IHdpdGggcHJvY2Vzc2VzLgotPC9ib2R5PgotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDOTEwMkU3IiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMTNGIi8+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDI4M0VEODkwMzYzIiBuYW1lPSJwcm9jZXNzRWxlbWVudHMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQyODNFOEExMDM0MSIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MjgzRUQ4OTAzNjIiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HblZ1SE9mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HblZ1Ry1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDOTEwM0JBIiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MTAzQkIgXzNBREM3Qjc0MDIyRDQwRjM2QzkxMDNCRCI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0duQ01HLWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MTAzQkEiPgotICAgICAgICAgICAgICA8Ym9keT5UaGlzIGFzc29jaWF0aW9uIGRlc2NyaWJlcyB0aGUgcmVhbGl6YXRpb24gcmVsYXRpb25zaGlwcyBiZXR3ZWVuIGEgUHJvY2VzcyBDb21wb25lbnQgYW5kIGEgUHJvY2VzcyBDb21wb25lbnQgSW50ZXJmYWNlLjwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkxMDNCQiIgbmFtZT0icmVhbGl6ZWRCeSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMTY3IiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQwRjM2QzkxMDNCQSI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0duQ01ILWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0duQ01IdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRFbmQ+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MTAzQ0QiIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkxMDNDRSBfM0FEQzdCNzQwMjJENDBGMzZDOTEwM0QwIj4KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR25DTUpPZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkxMDNDRCI+Ci0gICAgICAgICAgICAgIDxib2R5Pkluc3RhbmNlcyBvZiB0aGlzIGFzc29jaWF0aW9uIGNvbnRhaW4gdGhlIGxpc3Qgb2YgVGFzayBEZXNjcmlwdG9ycyB0aGF0IHJlcHJlc2VudCBhIFByb2Nlc3MgQ29tcG9uZW50IEludGVyZmFjZS48L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MTAzQ0UiIG5hbWU9Il9wcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlIiB2aXNpYmlsaXR5PSJwcml2YXRlIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMTcxIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDBGMzZDOTEwM0NEIj4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR25MOUUtZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IjEiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR25MOUV1ZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IjEiLz4KLSAgICAgICAgICAgIDwvb3duZWRFbmQ+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTAxNkIxQTAzMUUiIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQxMDE2QjFCMDFEMyBfM0FEQzdCNzQwMjJENDEwMTZCMUIwMjE5Ij4KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR25MOUdPZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxMDE2QjFBMDMxRSI+Ci0gICAgICAgICAgICAgIDxib2R5PlRoaXMgYXNzb2NpYXRpb24gY29udGFpbnMgdGhlIGlucHV0IGFuZCBvdXRwdXQgV29yayBQcm9kdWN0IHR5cGUgaW5zdGFuY2VzIHVzZWQgZm9yIHRoZSBpbnRlcmZhY2Ugc3BlY2lmaWNhdGlvbi48L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTAxNkIxQjAyMTkiIG5hbWU9Il9wcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxNzEiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MTAxNkIxQTAzMUUiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9Hbkw5SC1mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iMSIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9Hbkw5SHVmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iMSIvPgotICAgICAgICAgICAgPC9vd25lZEVuZD4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxMDU4OUUyMDA0RCIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDEwNTg5RTMwMTE0IF8zQURDN0I3NDAyMkQ0MTA1ODlFMzAxM0MiPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9Hbkw5SWVmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDEwNTg5RTIwMDREIj4KLSAgICAgICAgICAgICAgPGJvZHk+VGhpcyBhc3NvY2lhdGlvbiByZXByZXNlbnRzIHRoZSByZWZlcmVuY2UgZnJvbSB0aGUgZGVzY3JpcHRvciB0byB0aGUgUHJvY2VzcyBDb21wb25lbnQgaXQgcmVmZXJzIHRvLiAgQSBQcm9jZXNzIENvbXBvbmVudCBEZXNjcmlwdG9yIHJlcHJlc2VudHMgZXhhY3RseSBvbmUgUHJvY2VzcyBDb21wb25lbnQuPC9ib2R5PgotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICA8b3duZWRFbmQgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDEwNTg5RTMwMTNDIiBuYW1lPSJfcHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3IiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQxMDU4MUUzMDM0MiIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQxMDU4OUUyMDA0RCI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0duTDlLT2ZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0duTDlKLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRFbmQ+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MjdCRjQzOTAxQkIiIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQyN0JGNDNBMDMyRiBfM0FEQzdCNzQwMjJENDI3QkY0M0EwMzlEIj4KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR25MOUt1ZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0JGNDM5MDFCQiI+Ci0gICAgICAgICAgICAgIDxib2R5PkEgUHJvY2VzcyBDb21wb25lbnQgY29udGFpbnMgb25seSBleGFjdGx5IG9uZSBQcm9jZXNzLjwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyN0JGNDNBMDM5RCIgbmFtZT0iX3Byb2Nlc3NDb21wb25lbnQiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDE2NyIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQyN0JGNDM5MDFCQiI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0duVnVGdWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0duVnVGZWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgICA8L293bmVkRW5kPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDI4M0VEODkwMzYyIiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0MjgzRUQ4OTAzNjMgXzNBREM3Qjc0MDIyRDQyODNFRDg5MDM2NCI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0duVnVHT2ZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjgzRUQ4OTAzNjIiPgotICAgICAgICAgICAgICA8Ym9keT5BIFByb2Nlc3MgUGFja2FnZSBjb250YWlucyBQcm9jZXNzIEVsZW1lbnRzIHdoaWNoIGFyZSB1c2VkIHRvIGRlZmluZSBCcmVha2Rvd24gYW5kIFByb2Nlc3Nlcy4gIEEgUHJvY2VzcyBFbGVtZW50IGluc3RhbmNlIGNhbiBiZSBwYXJ0IG9mIG9ubHkgb25lIFByb2Nlc3MgUGFja2FnZSBpbnN0YW5jZS48L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MjgzRUQ4OTAzNjQiIG5hbWU9Il9wcm9jZXNzUGFja2FnZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMTUzIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDI4M0VEODkwMzYyIi8+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6UGFja2FnZSIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDFERjJBMUIwMkU3IiBuYW1lPSJQcm9jZXNzRGVzY3JpcHRpb25zIj4KLSAgICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iX0dvT2U1LWZYRWR1cUhvT0piVVJaUnciIHNvdXJjZT0idW1sMi5kaWFncmFtcyIgcmVmZXJlbmNlcz0iXzNBREM3Qjc0MDIyRDQxRUQ2ODJCMDE3MCI+Ci0gICAgICAgICAgICA8Y29udGVudHMgeG1pOnR5cGU9Im5vdGF0aW9uOkRpYWdyYW0iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxRUQ2ODJCMDE3MCIgdHlwZT0iQ2xhc3MiIG5hbWU9Ik1haW4iPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19MbWR1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRTEwNDExMDM4NyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfTG1lZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0dfTG1ldWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIzNDM3IiBoZWlnaHQ9IjE5OTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX0xtZS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfTG1mT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19MbWZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfTG1mdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HX0xtZi1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19MbWdPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HX0xtZ2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19MbWd1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HX0xtZy1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19MbWhPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfR19MbWhlZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfR19MbWQtZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HX0xtZU9mWEVkdXFIb09KYlVSWlJ3IiB4PSI1MzkzIiB5PSI4ODA1Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX0xtaHVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFMEQxQjYwMEQ4Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19MbWllZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfR19MbWl1ZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjUxNDciIGhlaWdodD0iMTE1MSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfTG1pLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19MbWpPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX0xtamVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19MbWp1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0dfTG1qLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX0xta09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0dfTG1rZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX0xta3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0dfTG1rLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX0xtbE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HX0xtbGVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HX0xtaC1mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0dfTG1pT2ZYRWR1cUhvT0piVVJaUnciIHg9IjIzNTMiIHk9IjYzODMiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfTG1sdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUUxMDQ1NTAyMDgiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX0xtbWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HX0xtbXVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iNTQzNSIgaGVpZ2h0PSIzMjY4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19MbW0tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX0xtbk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfTG1uZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX0xtbnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfR19MbW4tZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfTG1vT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfR19MbW9lZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfTG1vdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfR19MbW8tZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfTG1wT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0dfTG1wZWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0dfTG1sLWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfR19MbW1PZlhFZHVxSG9PSmJVUlpSdyIgeD0iNDU1MCIgeT0iMTQ1NDkiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfTG1wdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUUxMDQ3NDAxMUEiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX0xtcWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HX0xtcXVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMzUzOSIgaGVpZ2h0PSIxOTk4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19MbXEtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX0xtck9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfTG1yZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX0xtcnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfR19MbXItZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfTG1zT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfR19MbXNlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfTG1zdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfR19MbXMtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfTG10T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0dfTG10ZWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0dfTG1wLWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfR19MbXFPZlhFZHVxSG9PSmJVUlpSdyIgeD0iNTM0MiIgeT0iMTE5NTQiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfVXdRT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUVEN0I0OTAwODYiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX1V3US1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HX1V3Uk9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iNDQzNiIgaGVpZ2h0PSIxMTUxIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19Vd1JlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX1V3UnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfVXdSLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX1V3U09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfR19Vd1NlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfVXdTdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfR19Vd1MtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfVXdUT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfR19Vd1RlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfVXdUdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0dfVXdULWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0dfVXdRZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfR19Vd1F1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iNTc1IiB5PSI4ODIyIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX1V3VU9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERTRBOTcwMTIzIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19Vd1UtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfR19Vd1ZPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjQxODIiIGhlaWdodD0iMTU0MCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfVXdWZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19Vd1Z1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX1V3Vi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19Vd1dPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0dfVXdXZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX1V3V3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0dfVXdXLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX1V3WE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0dfVXdYZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX1V3WHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HX1V3WC1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HX1V3VWVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9Ik5vbmUiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93UGFyZW50PSJOYW1lIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0dfVXdVdWZYRWR1cUhvT0piVVJaUnciIHg9IjI3NTUiIHk9IjEzOTUiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfVXdoT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjc5N0Y3NDAzOTIiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX1V3aC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HX1V3aU9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iNDUzOCIgaGVpZ2h0PSIxNTQwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19Vd2llZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX1V3aXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfVXdpLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX1V3ak9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfR19Vd2plZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfVXdqdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfR19Vd2otZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfVXdrT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfR19Vd2tlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfVXdrdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0dfVXdrLWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0dfVXdoZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfR19Vd2h1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMjY1OCIgeT0iMzU5OCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxEaWFncmFtU3R5bGUiIHhtaTppZD0iX0dvT2U2ZWZYRWR1cUhvT0piVVJaUnciIGRlc2NyaXB0aW9uPSJUaGUgZGVmaW5pdGlvbiBvZiB0ZXh0dWFsIGRlc2NyaXB0aW9uIGF0dHJpYnV0ZXMgYXJlIGhhbmRsZWQgZGlmZmVyZW50bHkgZm9yIFByb2Nlc3NlcyB0aGFuIGZvciBNZXRob2QgQ29yZSBDb250ZW50IEVsZW1lbnRzLiAgVGhlIHJhdGlvbmFsZSBmb3IgdGhpcyBjYW4gYmUgZm91bmQgaW4gcGFja2FnZSBNZXRob2QgVW5pdHMgaW4gd2hpY2ggdGhlIGdyYW51bGFyaXR5IG9mIE1ldGhvZCBVbml0cyBmb3IgdGhlc2UgZWxlbWVudHMgaGFzIGJlZW4gZGVmaW5lZCBkaWZmZXJlbnRseS4gIFdoZXJlYXMgYSBDb250ZW50IERlc2NyaXB0aW9uIE1ldGhvZCBVbml0IGlzIGNyZWF0ZWQgZm9yIGV2ZXJ5IENvbnRlbnQgRWxlbWVudCwgUHJvY2VzcyBpcyBtYWludGFpbmVkIGFzIGEgd2hvbGUgaW4gYSBQcm9jZXNzIENvbXBvbmVudCBNZXRob2QgVW5pdC4gIFRoZXJlZm9yZSB0aGUgcGFja2FnZSBNZXRob2QgQ29yZSBEZXNjcmlwdGlvbiBjb250YWlucyBhIHRheG9ub215IG9mIHNwZWNpYWwgQ29udGVudCBEZXNjcmlwdGlvbiBzcGVjaWFsaXphdGlvbiBhbmQgdGhlIFByb2Nlc3MgRGVzY3JpcHRpb25zIHBhY2thZ2UgY29udGFpbnMgZXh0ZW5kZWQgdmVyc2lvbiBvZiBjbGFzc2VzIGRlZmluZWQgaW4gdGhlIFByb2Nlc3MgcGFja2FnZSB3aGljaCBtZXJnZSBuZXcgYXR0cmlidXRlcyBmb3IgZGVzY3JpcHRpb24gaW50byB0aGVzZSBjbGFzc2VzIHZpYSBwYWNrYWdlIG1lcmdlLiIvPgotICAgICAgICAgICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HX1V3WU9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3OThDODAwM0JBIiBzb3VyY2U9Il9HX0xtcHVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HX0xtZHVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19Vd1ktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX1V3WmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19Vd1p1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0dfVXdaT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HX1V3WWVmWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfR19Vd1l1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMCwgLTEwMDcsIDAsIDIxNDJdJFswLCAtMjE1MCwgMCwgOTk5XSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HX1V3Wi1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfR19Vd2FPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HX1V3YWVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3OThDQTQwMkQxIiBzb3VyY2U9Il9HX0xtbHVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HX0xtcHVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19Vd2JPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX1V3YnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19Vd2ItZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0dfVXdiZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HX1V3YXVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0dfVXdhLWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy01MCwgLTE2NDIsIDAsIDIxMTZdJFstNTAsIC0yNzYwLCAwLCA5OTldIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0dfVXdjT2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HX1V3Y2VmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0dfVXdjdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjc5OENFOTAyQ0EiIHNvdXJjZT0iX0dfVXdRT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0dfTG1odWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX1V3ZGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfVXdkLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX1V3ZU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfR19Vd2R1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0dfVXdjLWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfR19Vd2RPZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbODU1LCAtNTg0LCAtMTI3OCwgMTg1NF0kWzg1NSwgLTE4NjIsIC0xMjc4LCA1NzVdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0dfVXdlZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HX1V3ZXVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0dfVXdlLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjc5OEM2RjAxOTciIHNvdXJjZT0iX0dfTG1kdWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0dfTG1odWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX1V3ZnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfVXdnT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX1V3Z2VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfR19Vd2YtZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0dfVXdmT2ZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfR19Vd2ZlZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTQxNCwgLTEwMDcsIDE3NjksIDE4MzddJFstNDE0LCAtMjI3NywgMTc2OSwgNTY3XSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HX1V3Z3VmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfR19Vd2ctZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HX1V3bmVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3OThDQ0MwMzZBIiBzb3VyY2U9Il9HX0xtaHVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HX1V3aE9mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19Vd29PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX1V3b3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19Vd28tZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0dfVXdvZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HX1V3bnVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0dfVXduLWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy04LCAtNTc1LCAtOCwgMjAxNV0kWy04LCAtMTgyMCwgLTgsIDc3MF0iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfR19Vd3BPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0dfVXdwZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgPC9jb250ZW50cz4KLSAgICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0duZTREdWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURGMkExQjAyRTciPgotICAgICAgICAgICAgPGJvZHk+MDQ8L2JvZHk+Ci0gICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VNZXJnZSB4bWk6aWQ9Il9JWnRfTU94TUVkdU9Ock1SZ216NDhBIiBtZXJnZWRQYWNrYWdlPSJfM0FEQzdCNzQwMjJENDBGRDg5MUYwMkNEIi8+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MUUwRDFCNjAwRDgiIG5hbWU9IkJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbiI+Ci0gICAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDI3OThDQ0MwMzZBIiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDI3OTdGNzQwMzkyIi8+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDEzNzYyN0QwMDg0IiBuYW1lPSJ1c2FnZUd1aWRhbmNlIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiPgotICAgICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0duZTRHLWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTM3NjI3RDAwODQiPgotICAgICAgICAgICAgICAgIDxib2R5PlByb3ZpZGVzIGluZm9ybWF0aW9uIGFuZCBndWlkYW5jZSBvbiB0aGUgbWVhbmluZyBvZiB0aGUgQm9vbGVhbiBmbGFnIHZhbHVlcyBhbmQgdW5kZXIgd2hhdCBjaXJjdW1zdGFuY2VzIHRoZXkgc2hvdWxkIGJlIG92ZXJyaWRkZW4uIEZvciBleGFtcGxlLCBpdCBkZXNjcmliZXMgd2h5IHRoZSBicmVha2Rvd24gZWxlbWVudCBpcyBvcHRpb25hbCBvciBjb25zaWRlcmF0aW9ucyBmb3IgcmVwZWF0aW5nIGl0IGFuZCBkaWZmZXJlbmNlcyBpbiB0aGUgaW5kaXZpZHVhbCBvY2N1cnJlbmNlcyBvZiB0aGlzIEJyZWFrZG93biBFbGVtZW50IGFjcm9zcyB0aGUgbGlmZWN5Y2xlLjwvYm9keT4KLSAgICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0ZZYnJ3ZXlKRWR1NS12VmpsZlZzZlEiIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0ZZYnJ3T3lKRWR1NS12VmpsZlZzZlEiLz4KLSAgICAgICAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iX0ZRWWpBT3lKRWR1NS12VmpsZlZzZlEiIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiIHZhbHVlPSIiLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MUUxMDQxMTAzODciIG5hbWU9IkFjdGl2aXR5RGVzY3JpcHRpb24iPgotICAgICAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyNzk4QzZGMDE5NyIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQxRTBEMUI2MDBEOCIvPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDJFNCIgbmFtZT0icHVycG9zZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIj4KLSAgICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9Hbm9wQk9mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMkU0Ij4KLSAgICAgICAgICAgICAgICA8Ym9keT5TdW1tYXJpemVzIHRoZSBtYWluIHJlYXNvbiBmb3IgcGVyZm9ybWluZyB0aGlzIEFjdGl2aXR5LCBkZXNjcmliZXMgd2hhdCB0aGUgYWN0aXZpdHkgYXMgYSB3aG9sZSBpcyBpbnRlbmRlZCB0byBhY2hpZXZlLjwvYm9keT4KLSAgICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iXzdKRVV3ZXlJRWR1NS12VmpsZlZzZlEiIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iXzdKRVV3T3lJRWR1NS12VmpsZlZzZlEiLz4KLSAgICAgICAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iXzZfUERVT3lJRWR1NS12VmpsZlZzZlEiIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiIHZhbHVlPSIiLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMzUyIiBuYW1lPSJhbHRlcm5hdGl2ZXMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyI+Ci0gICAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR254eTh1ZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDM1MiI+Ci0gICAgICAgICAgICAgICAgPGJvZHk+Q29tcHJpc2VzIG9mIHN1bW1hcmllcyBkZXNjcmliaW5nIGltcG9ydGFudCBleGNlcHRpb25hbCBhbmQgbm9uLXN0YW5kYXJkIHdheXMgb2YgZG9pbmcgdGhlIHdvcmsgb2YgdGhpcyBBY3Rpdml0eSBub3QgY292ZXJlZCBieSB0aGUgQWN0aXZpdHkncyBUYXNrcy48L2JvZHk+Ci0gICAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9aYm5ZSWV5SEVkdTUtdlZqbGZWc2ZRIiB2YWx1ZT0iMSIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9aYm5ZSU95SEVkdTUtdlZqbGZWc2ZRIi8+Ci0gICAgICAgICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il9aUy1aZ095SEVkdTUtdlZqbGZWc2ZRIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIiB2YWx1ZT0iIi8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxMzc2MjgzMDE1QSIgbmFtZT0iaG93dG9TdGFmZiIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIj4KLSAgICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9Hbnh5OWVmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDEzNzYyODMwMTVBIj4KLSAgICAgICAgICAgICAgICA8Ym9keT5Qcm92aWRlcyBiYWNrZ3JvdW5kIG9uIHdobyBzaG91bGQgYmUgaW52b2x2ZWQgaW4gdGhpcyBhY3Rpdml0eSB3aGF0IGFyZSB0aGUgcmVxdWlyZWQgc2tpbGxzLCBleHBlcmllbmNlLCAgYW5kIHBlcmhhcHMgYXR0aXR1ZGVzLjwvYm9keT4KLSAgICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX1hUcjN3ZXlHRWR1NS12VmpsZlZzZlEiIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX1hUcjN3T3lHRWR1NS12VmpsZlZzZlEiLz4KLSAgICAgICAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iX1hLSmhRT3lHRWR1NS12VmpsZlZzZlEiIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiIHZhbHVlPSIiLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MUUxMDQ1NTAyMDgiIG5hbWU9IkRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uIj4KLSAgICAgICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0Mjc5OENBNDAyRDEiIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0MUUxMDQ3NDAxMUEiLz4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAzNzEiIG5hbWU9InNjYWxlIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiPgotICAgICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dueHktdWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAzNzEiPgotICAgICAgICAgICAgICAgIDxib2R5Pk91dGxpbmVzIGNoYXJhY3RlcmlzdGljcyBhYm91dCB0aGUgc2l6ZSBvZiBhIHR5cGljYWwgcHJvamVjdCB0aGF0IHBlcmZvcm1zIHRoaXMgcHJvamVjdCBleHByZXNzZWQgaW4gdGVhbSBzaXplLCBtYW4geWVhcnMsIGV0Yy48L2JvZHk+Ci0gICAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9jbE0wc2V5R0VkdTUtdlZqbGZWc2ZRIiB2YWx1ZT0iMSIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9jbE0wc095R0VkdTUtdlZqbGZWc2ZRIi8+Ci0gICAgICAgICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il9jYWVMWU95R0VkdTUtdlZqbGZWc2ZRIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIiB2YWx1ZT0iIi8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDM3QSIgbmFtZT0icHJvamVjdENoYXJhY3RlcmlzdGljcyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIj4KLSAgICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9Hbnh5X2VmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMzdBIj4KLSAgICAgICAgICAgICAgICA8Ym9keT5DaGFyYWN0ZXJpemVzIHRoZSBwcm9qZWN0IHRoYXQgd291bGQgdHlwaWNhbGx5IHBlcmZvcm0gdGhpcyBQcm9jZXNzPC9ib2R5PgotICAgICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfNkxPemdleUlFZHU1LXZWamxmVnNmUSIgdmFsdWU9IjEiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfNkxPemdPeUlFZHU1LXZWamxmVnNmUSIvPgotICAgICAgICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfNkRMcXdPeUlFZHU1LXZWamxmVnNmUSIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyIgdmFsdWU9IiIvPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAzODQiIG5hbWU9InJpc2tMZXZlbCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIj4KLSAgICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HbjdqOHVmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMzg0Ij4KLSAgICAgICAgICAgICAgICA8Ym9keT5PdXRsaW5lcyB0eXBpY2FsIHByb2plY3Qgcmlza3MgdGhhdCBhcmUgYWRkcmVzc2VkIHdpdGggdGhpcyBwcm9jZXNzLjwvYm9keT4KLSAgICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX2dWdlJvZXlIRWR1NS12VmpsZlZzZlEiIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX2dWdlJvT3lIRWR1NS12VmpsZlZzZlEiLz4KLSAgICAgICAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iX2c2UHM0T3lIRWR1NS12VmpsZlZzZlEiIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiIHZhbHVlPSIiLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMzg1IiBuYW1lPSJlc3RpbWF0aW5nVGVjaG5pcXVlIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiPgotICAgICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0duN2o5ZWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAzODUiPgotICAgICAgICAgICAgICAgIDxib2R5PkRlc2NyaWJlcyB0aGUgRXN0aW1hdGlvbiBUZWNobmlxdWVzIHByb3ZpZGVkIGZvciB0aGlzIFByb2Nlc3MuPC9ib2R5PgotICAgICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfWVp3U2dleUhFZHU1LXZWamxmVnNmUSIgdmFsdWU9IjEiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfWVp3U2dPeUhFZHU1LXZWamxmVnNmUSIvPgotICAgICAgICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfWVBVa0lPeUhFZHU1LXZWamxmVnNmUSIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyIgdmFsdWU9IiIvPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAzOEUiIG5hbWU9InByb2plY3RNZW1iZXJFeHBlcnRpc2UiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyI+Ci0gICAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR243ai1PZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDM4RSI+Ci0gICAgICAgICAgICAgICAgPGJvZHk+UHJvdmlkZXMgYSBwcm9maWxlIG9mIGEgdHlwaWNhbCBwcm9qZWN0IHRlYW0sIHRoZSBkaXN0cmlidXRpb24gb2Ygcm9sZXMsIHNraWxscyByZXF1aXJlZCBmb3IgYSB0ZWFtIHBlcmZvcm1zIGEgcHJvamVjdCBiYXNlZCBvbiB0aGlzIHByb2Nlc3MuPC9ib2R5PgotICAgICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfLWs3Q2dleUdFZHU1LXZWamxmVnNmUSIgdmFsdWU9IjEiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfLWs3Q2dPeUdFZHU1LXZWamxmVnNmUSIvPgotICAgICAgICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfLWFNWk1PeUdFZHU1LXZWamxmVnNmUSIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyIgdmFsdWU9IiIvPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAzOTgiIG5hbWU9InR5cGVPZkNvbnRyYWN0IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiPgotICAgICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0duN2otLWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAzOTgiPgotICAgICAgICAgICAgICAgIDxib2R5PlByb3ZpZGVzIGJhY2tncm91bmQgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGNvbnRyYWN0cyB0aGF0IG5lZWQgdG8gYmUgZXN0YWJsaXNoZWQgYmV0d2VlbiBhIHByb2plY3QgdGVhbSB0aGF0IHBlcmZvcm1zIHRoaXMgcHJvY2VzcyBhbmQgYSBjbGllbnQgKGUuZy4gZm9yIGFuIElHUyBlbmdhZ2VtZW50KS48L2JvZHk+Ci0gICAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9JTDFuZ2V5SkVkdTUtdlZqbGZWc2ZRIiB2YWx1ZT0iMSIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9JTDFuZ095SkVkdTUtdlZqbGZWc2ZRIi8+Ci0gICAgICAgICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il9JRWlzc095SkVkdTUtdlZqbGZWc2ZRIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIiB2YWx1ZT0iIi8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDFFMTA0NzQwMTFBIiBuYW1lPSJQcm9jZXNzRGVzY3JpcHRpb24iPgotICAgICAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyNzk4QzgwMDNCQSIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQxRTEwNDExMDM4NyIvPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDNBQyIgbmFtZT0ic2NvcGUiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyI+Ci0gICAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR29GVTgtZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDNBQyI+Ci0gICAgICAgICAgICAgICAgPGJvZHk+RGVmaW5lcyB0aGUgc2NvcGUgb2YgdGhlIFByb2Nlc3MsIGkuZS4gd2hpY2ggdHlwZXMgb2YgcHJvamVjdHMgZG9lcyBpdCBhZGRyZXNzIGFuZCB3aGljaCBub3QuPC9ib2R5PgotICAgICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfZUVtVmNleUhFZHU1LXZWamxmVnNmUSIgdmFsdWU9IjEiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfZUVtVmNPeUhFZHU1LXZWamxmVnNmUSIvPgotICAgICAgICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfZDdOdjhPeUhFZHU1LXZWamxmVnNmUSIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyIgdmFsdWU9IiIvPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAzQUQiIG5hbWU9InVzYWdlTm90ZXMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyI+Ci0gICAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR29GVTl1ZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDNBRCI+Ci0gICAgICAgICAgICAgICAgPGJvZHk+QW55IGFkZGl0aW9uYWwgbm90ZXMgb24gaG93IHRvIGFwcGx5IGFuZCBpbnN0YW50aWF0ZSB0aGlzIHByb2Nlc3MgZm9yIGEgcHJvamVjdC48L2JvZHk+Ci0gICAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il91MUFOQWV5R0VkdTUtdlZqbGZWc2ZRIiB2YWx1ZT0iMSIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il91MUFOQU95R0VkdTUtdlZqbGZWc2ZRIi8+Ci0gICAgICAgICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il91cmQyZ095R0VkdTUtdlZqbGZWc2ZRIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIiB2YWx1ZT0iIi8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDFFRDdCNDkwMDg2IiBuYW1lPSJEZXNjcmlwdG9yRGVzY3JpcHRpb24iPgotICAgICAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyNzk4Q0U5MDJDQSIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQxRTBEMUI2MDBEOCIvPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxRUQ3QjY1MDM5NCIgbmFtZT0icmVmaW5lZERlc2NyaXB0aW9uIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiPgotICAgICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dvRlUtLWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUVEN0I2NTAzOTQiPgotICAgICAgICAgICAgICAgIDxib2R5PkEgRGVzY3JpcHRvciBtaWdodCBhZGQgcmVmaW5lbWVudHMgdG8gdGhlIG1haW4gZGVzY3JpcHRpb24gb2YgdGhlIENvbnRlbnQgRWxlbWVudCBpdCByZWZlcnMgdG8uICBGb3IgZXhhbXBsZSwgaXQgY291bGQgcHJvdmlkZSBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGFib3V0IGEgV29yayBQcm9kdWN0IHJlbGV2YW50IGZvciB0aGUgc3BlY2lmaWMgcG9pbnQgaW4gdGltZSBpbiB0aGUgcHJvY2VzcyB0aGlzIFdvcmsgUHJvZHVjdCB0eXBlIGlzIGJlaW5nIHVzZWQuICBJdCBjb3VsZCBkZXNjcmliZSBhZGRpdGlvbmFsIHNraWxscyBuZWVkZWQgZm9yIGEgUm9sZSBhdCB0aGF0IHBhcnRpY3VsYXIgcG9pbnQgaW4gdGltZSBpbiBhIHByb2Nlc3MsIGV0Yy4gPC9ib2R5PgotICAgICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfSFNlV2tleUpFZHU1LXZWamxmVnNmUSIgdmFsdWU9IjEiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfSFNlV2tPeUpFZHU1LXZWamxmVnNmUSIvPgotICAgICAgICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfSEtiTjBPeUpFZHU1LXZWamxmVnNmUSIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyIgdmFsdWU9IiIvPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyMzc1RTA0MDM5MCIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDIzNzVFMDUwMTczIF8zQURDN0I3NDAyMkQ0MjM3NUUwNTAxNzUiPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9Hb0ZVX3VmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDIzNzVFMDQwMzkwIj4KLSAgICAgICAgICAgICAgPGJvZHk+TGlzdCB0aGUgc3RlcHMgdGhhdCBoYXZlIGJlZW4gc2VsZWN0ZWQgdG8gYmUgcGVyZm9ybWVkIGZvciB0aGUgaW5zdGFuY2Ugb2YgdGhlIFRhc2sgRGVzY3JpcHRvci48L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MjM3NUUwNTAxNzUiIG5hbWU9Il90YXNrRGVzY3JpcHRvciIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDA5IiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDIzNzVFMDQwMzkwIj4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR29PZTV1ZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR29PZTVlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEVuZD4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpQYWNrYWdlIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwRkIiIG5hbWU9Ik1ldGhvZFBsdWdpbiI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfR3BIMndPZlhFZHVxSG9PSmJVUlpSdyIgc291cmNlPSJ1bWwyLmRpYWdyYW1zIiByZWZlcmVuY2VzPSJfM0FEQzdCNzQwMjJENDBGNTdBQzgwMzVFIj4KLSAgICAgICAgICA8Y29udGVudHMgeG1pOnR5cGU9Im5vdGF0aW9uOkRpYWdyYW0iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjU3QUM4MDM1RSIgdHlwZT0iQ2xhc3MiIG5hbWU9Ik1ldGhvZFBsdWdpbiI+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEF6LUFPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDEwNCI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQXotQS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEF6LUJPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEF6LUJlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEF6LUJ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEF6LUItZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQXotQ09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hBei1DZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBei1DdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hBei1DLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBei1ET2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hBei1EZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBei1EdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQXotRC1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hBei1BZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJOb25lIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hBei1BdWZYRWR1cUhvT0piVVJaUnciIHg9IjEzNDk1IiB5PSIzODQzIi8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBei1NLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxM0YiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEF6LU51ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hBei1OLWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSI0NTA0IiBoZWlnaHQ9IjE2MjUiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBei1PT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBei1PZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBei1PdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEF6LU8tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQXotUE9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQXotUGVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQXotUHVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQXotUC1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQXotUU9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQXotUWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEF6LVF1ZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IQXotTk9mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iTm9uZSIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IQXotTmVmWEVkdXFIb09KYlVSWlJ3IiB4PSI0NTA0IiB5PSIzNzA4Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBei1pZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyODAiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEF6LWpPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hBei1qZWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIyODI3IiBoZWlnaHQ9IjEwNDkiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBei1qdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBei1qLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBei1rT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEF6LWtlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEF6LWt1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEF6LWstZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEF6LWxPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEF6LWxlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEF6LWx1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEF6LWwtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hBei1tT2ZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEF6LWl1ZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEF6LWktZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTAyMTkiIHk9Ijk5OSIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQTl2RC1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFEREZBMzYwMkMxIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBOXZFdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IQTl2RS1mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMjUwNiIgaGVpZ2h0PSIxMTM0Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQTl2Rk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQTl2RmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQTl2RnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBOXZGLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hBOXZHT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBOXZHZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hBOXZHdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBOXZHLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hBOXZIT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBOXZIZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQTl2SHVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hBOXZFT2ZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hBOXZFZWZYRWR1cUhvT0piVVJaUnciIHg9IjEwMTc2IiB5PSI2NjQ2Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MRGlhZ3JhbVN0eWxlIiB4bWk6aWQ9Il9HcEgyd3VmWEVkdXFIb09KYlVSWlJ3IiBkZXNjcmlwdGlvbj0iVGhpcyBkaWFncmFtcyBzaG93cyB0aGUgZGVmaW5pdGlvbiBvZiBNZXRob2QgUGx1Z2lucy4gTWV0aG9kIFBsdWdpbnMgZXh0ZW5kIGVhY2ggb3RoZXIgYW5kIGFyZSB0aGUgY29udGFpbmVyIG9mIGFsbCBNZXRob2QgUGFja2FnZXMuIi8+Ci0gICAgICAgICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+Ci0gICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEF6LUVPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDJFNyIgc291cmNlPSJfSEF6LUFPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEF6LUFPZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQXotRS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQXotRmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBei1GdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IQXotRk9mWEVkdXFIb09KYlVSWlJ3IiB4PSI5OTgiIHk9IjMxNyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEF6LUYtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDJFQSI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBei1HZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQXotR09mWEVkdXFIb09KYlVSWlJ3IiB4PSI0ODIiIHk9Ijc2OSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEF6LUd1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyRUEiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQXotSE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hBei1HLWZYRWR1cUhvT0piVVJaUnciIHg9Ii0zODciIHk9Ijc3OCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEF6LUhlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMkU4Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEF6LUgtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEF6LUh1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTEzODIiIHk9IjI3MSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEF6LUlPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDJFOCI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBei1JdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQXotSWVmWEVkdXFIb09KYlVSWlJ3IiB4PSItNzkyIiB5PSItMzAzIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQXotSS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMkVBIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEF6LUplZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hBei1KdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEF6LUpPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEF6LUotZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMkU4Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEF6LUtlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hBei1LdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEF6LUtPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEF6LUstZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyRUEiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQXotTGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEF6LUx1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQXotTE9mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQXotTC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMkU4Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEF6LU1lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEF6LU11ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQXotTU9mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IQXotRWVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IQXotRXVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlsyNjA3LCAtMjQ1LCAyNjA3LCAtMjQ1XSRbNDgxNywgLTI0NSwgNDgxNywgLTI0NV0kWzQ4MTcsIDE4MzcsIDQ4MTcsIDE4MzddJFs1NTAsIDE4MzcsIDU1MCwgMTgzN10kWzU1MCwgNTc1LCA1NTAsIDU3NV0iLz4KLSAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEF6LVEtZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDJENSIgc291cmNlPSJfSEF6LU0tZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEF6LUFPZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQXotUnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQXotU09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBei1TZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEF6LVItZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEF6LVN1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDJEOCI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBei1UT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQXotUy1mWEVkdXFIb09KYlVSWlJ3IiB4PSItMTIzIiB5PSIzNjQiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBei1UZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMkQ4Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEF6LVQtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQXotVHVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxMTM5IiB5PSItMjg4Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQXotVU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyRDYiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQXotVXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQXotVWVmWEVkdXFIb09KYlVSWlJ3IiB4PSI0MzYiIHk9IjQ1NyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEF6LVUtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyRDYiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQXotVmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEF6LVZPZlhFZHVxSG9PSmJVUlpSdyIgeD0iMjI1IiB5PSItMzQ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQXotVnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMkQ4Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEF6LVdPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hBei1XZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEF6LVYtZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEF6LVd1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMkQ2Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEF6LVhPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hBei1YZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEF6LVctZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEF6LVh1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyRDgiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQXotWU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEF6LVllZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQXotWC1mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQXotWXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMkQ2Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEF6LVpPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEF6LVplZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQXotWS1mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IQXotUk9mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IQXotUmVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlsyMjUyLCAtMTI3LCAtNzA5NSwgLTI1XSRbNjczOSwgLTEyNywgLTI2MDcsIC0yNV0iLz4KLSAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEF6LVp1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYxMDA0OSIgc291cmNlPSJfSEF6LU0tZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEF6LU0tZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQXotYWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQXotYS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBei1iT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEF6LWF1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEF6LWJlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYxMDA0QyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBei1iLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQXotYnVmWEVkdXFIb09KYlVSWlJ3IiB4PSI0NTIiIHk9Ii04NTUiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBei1jT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjEwMDRDIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEF6LWN1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQXotY2VmWEVkdXFIb09KYlVSWlJ3IiB4PSItMTIwMCIgeT0iLTg4NyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEF6LWMtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjEwMDRBIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEF6LWRlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEF6LWRPZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTEyNzEiIHk9Ii0yMzMiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBei1kdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MTAwNEEiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQXotZU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEF6LWQtZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTIyMSIgeT0iMzIzIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQXotZWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjEwMDRDIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEF6LWUtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hBei1mT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEF6LWV1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEF6LWZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjEwMDRBIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEF6LWYtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hBei1nT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEF6LWZ1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEF6LWdlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MTAwNEMiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQXotZy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEF6LWhPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQXotZ3VmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQXotaGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjEwMDRBIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEF6LWgtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEF6LWlPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQXotaHVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IQXotWi1mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IQXotYU9mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMjI1MiwgNTAsIC0yMjUyLCA1MF0kWy00NDg3LCA1MCwgLTQ0ODcsIDUwXSRbLTQ0ODcsIDE4NjIsIC00NDg3LCAxODYyXSRbLTEyMTksIDE4NjIsIC0xMjE5LCAxODYyXSRbLTEyMTksIDgxMiwgLTEyMTksIDgxMl0iLz4KLSAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEF6LW1lZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRkFENUY4MDM4RSIgc291cmNlPSJfSEF6LU0tZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEF6LWllZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQTl2QU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQTl2QXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBOXZBLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEE5dkFlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEF6LW11ZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IQXotbS1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlsxMzEyLCAtODIxLCAtMzU2NCwgMjE3NV0kWzQwMDQsIC0yNDcyLCAtODcyLCA1MjRdIi8+Ci0gICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IQTl2Qk9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hBOXZCZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IQTl2QnVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFGQURDMDEwMjhEIiBzb3VyY2U9Il9IQXotQU9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IQXotaWVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBOXZDZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBOXZDLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEE5dkRPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IQTl2Q3VmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IQTl2Qi1mWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hBOXZDT2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy04ODksIC01ODQsIDM1ODEsIDIzMTFdJFstMzY0OSwgLTIzNzAsIDgyMSwgNTI0XSIvPgotICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEE5dkRlZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IQTl2RHVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEE5dkgtZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRTBDQzBBMDFENyIgc291cmNlPSJfSEF6LU0tZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEE5dkQtZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQTl2SXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQTl2Sk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBOXZKZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEE5dkktZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEE5dklPZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IQTl2SWVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlsxNDEzLCA4MTIsIC0zMjU5LCAtMTg3OV0kWzM2OTEsIDIxMTYsIC05ODIsIC01NzVdIi8+Ci0gICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IQTl2SnVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hBOXZKLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IQTl2S09mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI1MThCRDcwMUUzIiBzb3VyY2U9Il9IQXotQU9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IQTl2RC1mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBOXZLLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBOXZMZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEE5dkx1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IQTl2TE9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IQTl2S2VmWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hBOXZLdWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy05OTAsIDU3NSwgMzY4MywgLTIyMThdJFstMzc0MiwgMjIxOCwgOTMxLCAtNTc1XSIvPgotICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEE5dkwtZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IQTl2TU9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgPC9jb250ZW50cz4KLSAgICAgICAgICA8Y29udGVudHMgeG1pOnR5cGU9Im5vdGF0aW9uOkRpYWdyYW0iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjlDNUYwMDJFMSIgdHlwZT0iQ2xhc3MiIG5hbWU9IlZhcmlhYmlsaXR5RWxlbWVudCI+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEE5dk1lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTm90ZSI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQTl2Tk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJEaWFncmFtTmFtZSI+Ci0gICAgICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEE5dk5lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRGVzY3JpcHRpb24iPgotICAgICAgICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246U2hhcGVTdHlsZSIgeG1pOmlkPSJfSEE5dk11ZlhFZHVxSG9PSmJVUlpSdyIgZm9udE5hbWU9IkFyaWFsIiBmb250SGVpZ2h0PSI4IiBkZXNjcmlwdGlvbj0ie3ZhcmlhYmlsaXR5U3BlY2lhbEVsZW1lbnQudHlwZSgpID09IHZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQudHlwZSgpfSA6IHt2YXJhYmlsaXR5IGNhbiBvbmx5IGJlIGRlZmluZWQgYmV0d2VlbiBDb250ZW50RWxlbWVudHMgb2YgdGhlIHNhbWUgc3VidHlwZSwgZS5nLiBSb2xlcyB3aXRoIFJvbGVzLCBidXQgbm90IFJvbGVzIGFuZCBUYXNrc30iIGxpbmVDb2xvcj0iMCIvPgotICAgICAgICAgICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hBOXZNLWZYRWR1cUhvT0piVVJaUnciIHg9IjY3MjMiIHk9Ijc3ODgiIHdpZHRoPSI5NTk2IiBoZWlnaHQ9IjE2MjUiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEE5dk51ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjZCMDAyMDJFQyI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQTl2T2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEE5dk91ZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjI5MTIiIGhlaWdodD0iNDE2NSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEE5dk8tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEE5dlBPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iS2luZCIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEE5dlBlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEE5dlB1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQTl2UC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJFbnVtZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEE5dlFPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEE5dlFlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEE5dlF1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEE5dlEtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEE5dlJPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IQTl2Ti1mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iTm9uZSIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IQTl2T09mWEVkdXFIb09KYlVSWlJ3IiB4PSIxMzE5NSIgeT0iMjIwNSIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQTl2UmVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERTQ5NTAwMUY1Ij4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBOXZTT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IQTl2U2VmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iNDk2MSIgaGVpZ2h0PSIxNTc0Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQTl2U3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQTl2Uy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQTl2VE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBOXZUZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEE5dlR1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEE5dlQtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEE5dlVPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEJIZ0FPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEJIZ0FlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEJIZ0F1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hCSGdBLWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEE5dlJ1ZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9Ik5vbmUiIHNob3dMaXN0U2lnbmF0dXJlPSJ0cnVlIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hBOXZSLWZYRWR1cUhvT0piVVJaUnciIHg9IjIzODkiIHk9IjExNTkiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEJIZ2llZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREU0OTYyMDIwRiI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQkhnak9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEJIZ2plZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjI4NzgiIGhlaWdodD0iOTA1Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQkhnanVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQkhnai1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQkhna09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hCSGdrZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hCSGdrdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hCSGdrLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hCSGdsT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hCSGdsZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hCSGdsdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hCSGdsLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQkhnbU9mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hCSGdpdWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hCSGdpLWZYRWR1cUhvT0piVVJaUnciIHg9IjEwNjMiIHk9Ijk3MzgiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEJIZ21lZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMUU4ODY4MDNFNSI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQkhnbk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEJIZ25lZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEJIZ251ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEJIZ24tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEJIZ29PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQkhnb2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hCSGdvdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hCSGdvLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hCSGdwT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hCSGdwZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hCSGdwdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hCSGdwLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQkhncU9mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hCSGdtdWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJOb25lIiBzaG93TGlzdFNpZ25hdHVyZT0idHJ1ZSIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IQkhnbS1mWEVkdXFIb09KYlVSWlJ3IiB4PSIxNzY2IiB5PSI0MTk0IiB3aWR0aD0iNjk4NSIgaGVpZ2h0PSIxNTgzIi8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hCUXFSZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBQTBBRTAzOUQiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEJRcVNPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hCUXFTZWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxNTc0IiBoZWlnaHQ9IjkwNSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEJRcVN1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEJRcVMtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEJRcVRPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQlFxVGVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQlFxVHVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQlFxVC1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQlFxVU9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQlFxVWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQlFxVXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQlFxVS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEJRcVZPZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IQlFxUnVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IQlFxUi1mWEVkdXFIb09KYlVSWlJ3IiB4PSIzMDM1IiB5PSI4Mjk1Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hCUXFaLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjc5NTU0NTAxMzQiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEJRcWF1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hCUXFhLWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxNTc0IiBoZWlnaHQ9IjkwNSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEJRcWJPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEJRcWJlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEJRcWJ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQlFxYi1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQlFxY09mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQlFxY2VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQlFxY3VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQlFxYy1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQlFxZE9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQlFxZGVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEJRcWR1ZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IQlFxYU9mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IQlFxYWVmWEVkdXFIb09KYlVSWlJ3IiB4PSI0NTE3IiB5PSI5NzE0Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MRGlhZ3JhbVN0eWxlIiB4bWk6aWQ9Il9HcEgyeE9mWEVkdXFIb09KYlVSWlJ3IiBkZXNjcmlwdGlvbj0iVGhpcyBkaWFncmFtIHNob3dzIGhvdyBjb250ZW50IGVsZW1lbnRzIGNhbiBkZWZpbmUgdmFyaWF0aW9ucyBvZiBvbmUgYW5kIGFub3RoZXIuICAiLz4KLSAgICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4KLSAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IQkhncWVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERTU4N0EwM0EwIiBzb3VyY2U9Il9IQkhnbWVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IQkhnbWVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hCSGdyT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hCSGdydWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEJIZ3ItZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hCSGdyZWZYRWR1cUhvT0piVVJaUnciIHg9Ii0xMjAzIiB5PSItMzQ5Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQlFwOE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERTU4N0EwM0EyIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEJRcDh1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hCUXA4ZWZYRWR1cUhvT0piVVJaUnciIHg9IjEyODciIHk9Ii0yNjQiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hCUXA4LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERTU4N0EwM0EyIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEJRcDllZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQlFwOU9mWEVkdXFIb09KYlVSWlJ3IiB4PSItNjA0IiB5PSIyMzYiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hCUXA5dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREU1ODdBMDNBMSI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hCUXAtT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hCUXA5LWZYRWR1cUhvT0piVVJaUnciIHg9Ii03MDYiIHk9Ii0zMjAiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hCUXAtZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURFNTg3QTAzQTEiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQlFwLS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEJRcC11ZlhFZHVxSG9PSmJVUlpSdyIgeD0iOTQyIiB5PSIyODEiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hCUXBfT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURFNTg3QTAzQTIiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQlFwX3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEJRcF8tZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQlFwX2VmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQlFxQU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURFNTg3QTAzQTEiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQlFxQXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEJRcUEtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQlFxQWVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQlFxQk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREU1ODdBMDNBMiI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hCUXFCdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQlFxQi1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hCUXFCZWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hCUXFDT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURFNTg3QTAzQTEiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQlFxQ3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQlFxQy1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hCUXFDZWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hCSGdxdWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hCSGdxLWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzg1NSwgNzg3LCA4NTUsIDc4N10kWzg1NSwgMTY1MSwgODU1LCAxNjUxXSRbNjY4MCwgMTY1MSwgNjY4MCwgMTY1MV0kWzY2ODAsIC01MCwgNjY4MCwgLTUwXSRbMzQ4OCwgLTUwLCAzNDg4LCAtNTBdIi8+Ci0gICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hCUXFET2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5vdGVBdHRhY2htZW50IiBzb3VyY2U9Il9IQTl2TWVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IQkhncWVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246Q29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hCUXFEZWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iMCIvPgotICAgICAgICAgICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hCUXFEdWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0xMjcsIC04MjEsIDE4NiwgMTQzOV0kWy0zMTMsIC0yMjYwLCAwLCAwXSIvPgotICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEJRcUQtZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IQlFxRU9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEJRcUktZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREU1OEI2MDE4QiIgc291cmNlPSJfSEJIZ2llZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEJIZ21lZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQlFxSnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQlFxS09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hCUXFLZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEJRcUotZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEJRcUpPZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEJRcUplZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbNzk1LCAtNDQ4LCAtMTc0NCwgNDc4M10kWzc5NSwgLTQ0NTMsIC0xNzQ0LCA3NzhdIi8+Ci0gICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IQlFxS3VmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hCUXFLLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IQlFxWHVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QUEwRDMwMjQ1IiBzb3VyY2U9Il9IQlFxUmVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IQkhnbWVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hCUXFZZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hCUXFZLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEJRcVpPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IQlFxWXVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IQlFxWC1mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IQlFxWU9mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlsxNTksIC0zMTcsIC0xNDU1LCAzMzA3XSRbMTU5LCAtMjgzMSwgLTE0NTUsIDc5M10iLz4KLSAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hCUXFaZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEJRcVp1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hCUXFkLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjFFOEU2NTAyMTMiIHNvdXJjZT0iX0hCUXFaLWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hCUXFaLWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEJRcWV1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEJRcWZPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQlFxZmVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hCUXFlLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hCUXFmdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjFFOEU2NzAxQkMiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQlFxZ09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEJRcWYtZlhFZHVxSG9PSmJVUlpSdyIgeD0iNDM1IiB5PSIxOTMiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hCUXFnZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMUU4RTY3MDFCQyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hCUXFnLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEJRcWd1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTMyMCIgeT0iLTM0NyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEJRcWhPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRThFNjcwMUIxIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEJRcWh1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEJRcWhlZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTM5NCIgeT0iNDA3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQlFxaC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRThFNjcwMUIxIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEJRcWllZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hCUXFpT2ZYRWR1cUhvT0piVVJaUnciIHg9IjEzMjUiIHk9IjMzOSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEJRcWl1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMUU4RTY3MDFCQyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hCUXFqT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQlFxamVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hCUXFpLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hCUXFqdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMUU4RTY3MDFCMSI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hCUXFrT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQlFxa2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hCUXFqLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hCUXFrdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRThFNjcwMUJDIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEJRcWxPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hCUXFsZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEJRcWstZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEJRcWx1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMUU4RTY3MDFCMSI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hCUXFtT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hCUXFtZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEJRcWwtZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEJRcWVPZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEJRcWVlZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbNzg3LCAyMDMsIDc4NywgMjAzXSRbMTkxMywgMjAzLCAxOTEzLCAyMDNdJFsxOTEzLCAxMzYzLCAxOTEzLCAxMzYzXSRbOCwgMTM2MywgOCwgMTM2M10kWzgsIDQ0OCwgOCwgNDQ4XSIvPgotICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IQmFhOU9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3OTU1NjAwMTcwIiBzb3VyY2U9Il9IQlFxWi1mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IQkhnbWVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hCYWE5LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hCYWEtZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEJhYS11ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IQmFhLU9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IQmFhOWVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IQmFhOXVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlswLCAtNDQ4LCA1MCwgNDczMl0kWzAsIC00Mzk0LCA1MCwgNzg3XSIvPgotICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEJhYS0tZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IQmFhX09mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSnhQZjRleFpFZHVPTnJNUmdtejQ4QSIgZWxlbWVudD0iX0p4UGY0T3haRWR1T05yTVJnbXo0OEEiIHNvdXJjZT0iX0hCSGdtZWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hBOXZSZWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSnhQZjVPeFpFZHVPTnJNUmdtejQ4QSIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSnhQZjV1eFpFZHVPTnJNUmdtejQ4QSIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9KeFBmNS14WkVkdU9Ock1SZ216NDhBIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSnhQZjVleFpFZHVPTnJNUmdtejQ4QSIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSnhQZjR1eFpFZHVPTnJNUmdtejQ4QSIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9KeFBmNC14WkVkdU9Ock1SZ216NDhBIiBwb2ludHM9IlstMjMsIC0zMCwgODgsIDEwM10kWy0xMTYsIC0xNjAsIC01LCAtMjddIi8+Ci0gICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgIDwvY29udGVudHM+Ci0gICAgICAgICAgPGNvbnRlbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpEaWFncmFtIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MUU1N0IyMDAwODciIHR5cGU9IkNsYXNzIiBuYW1lPSJNYWluIj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQmFhX2VmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMEZCIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hCYWJBT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IQmFiQWVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQmFiQXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQmFiQS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQmFiQk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hCYWJCZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJQYWNrYWdlQ29udGVudHMiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEJhYkJ1ZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIgY29sbGFwc2VkPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hCYWFfdWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iTm9uZSIgc2hvd0xpc3RWaXNpYmlsaXR5PSJOb25lIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hCYWFfLWZYRWR1cUhvT0piVVJaUnciIHg9IjMwMTMiIHk9IjUyMyIgd2lkdGg9IjMxNDgiIGhlaWdodD0iMTA4MyIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9rOU9uc094bkVkdXdPYmtJQTZ4MWdBIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFMEQwRUQwMTA0Ij4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2s5T25zLXhuRWR1d09ia0lBNngxZ0EiIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9rOU9udE94bkVkdXdPYmtJQTZ4MWdBIiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9rOU9udGV4bkVkdXdPYmtJQTZ4MWdBIiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9rOU9udHV4bkVkdXdPYmtJQTZ4MWdBIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9rOU9udC14bkVkdXdPYmtJQTZ4MWdBIiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2s5T251T3huRWR1d09ia0lBNngxZ0EiIHZpc2libGU9ImZhbHNlIiB0eXBlPSJQYWNrYWdlQ29udGVudHMiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfazlPbnVleG5FZHV3T2JrSUE2eDFnQSIgY2Fub25pY2FsPSJmYWxzZSIgY29sbGFwc2VkPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX2s5T25zZXhuRWR1d09ia0lBNngxZ0EiIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX2s5T25zdXhuRWR1d09ia0lBNngxZ0EiIHg9IjYzMiIgeT0iMzIyMyIgd2lkdGg9IjMxNDgiIGhlaWdodD0iMTA4MyIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il96ekx2VU94bkVkdXdPYmtJQTZ4MWdBIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERTQ3OEUwMDBEIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3p6THZVLXhuRWR1d09ia0lBNngxZ0EiIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il96ekx2Vk94bkVkdXdPYmtJQTZ4MWdBIiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il96ekx2VmV4bkVkdXdPYmtJQTZ4MWdBIiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il96ekx2VnV4bkVkdXdPYmtJQTZ4MWdBIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il96ekx2Vi14bkVkdXdPYmtJQTZ4MWdBIiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3p6THZXT3huRWR1d09ia0lBNngxZ0EiIHZpc2libGU9ImZhbHNlIiB0eXBlPSJQYWNrYWdlQ29udGVudHMiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfenpMdldleG5FZHV3T2JrSUE2eDFnQSIgY2Fub25pY2FsPSJmYWxzZSIgY29sbGFwc2VkPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX3p6THZVZXhuRWR1d09ia0lBNngxZ0EiIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX3p6THZVdXhuRWR1d09ia0lBNngxZ0EiIHg9IjUzOTYiIHk9IjMyMjUiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxEaWFncmFtU3R5bGUiIHhtaTppZD0iX0dwSDJ4dWZYRWR1cUhvT0piVVJaUnciIGRlc2NyaXB0aW9uPSJ8VGhlIE1ldGhvZC1QbHVnaW4gcGFja2FnZSBkZWZpbmVzIGV4dGVuc2liaWxpdHkgYW5kIHZhcmlhYmlsaXR5IG1lY2hhbmlzbXMgZm9yIG1ldGhvZCBjb250ZW50IGFuZCBwcm9jZXNzZXMuICBJdCBwcm92aWRlcyBtb3JlIGZsZXhpYmlsaXR5IGluIGRlZmluaW5nIGRpZmZlcmVudCB2YXJpYW50cyBvZiBtZXRob2QgY29udGVudCBhbmQgcHJvY2Vzc2VzIGJ5IGFsbG93aW5nIGNvbnRlbnQgYW5kIHByb2Nlc3MgZnJhZ21lbnRzIHRvIGJlIHBsdWdnZWQtaW4gb24gZGVtYW5kIGNyZWF0aW5nIHRhaWxvcmVkIG9yIHNwZWNpYWxpemVkIGNvbnRlbnQgb25seSB3aGVuIGl0IGlzIHJlcXVpcmVkIGFuZCB3aGljaCBjYW4gYmUgbWFpbnRhaW5lZCBhcyBzZXBhcmF0ZSB1bml0cyB3b3JrZWQgb24gYnkgZGlzdHJpYnV0ZWQgdGVhbXMuJiN4QTt8TWV0aG9kcyBhbmQgUHJvY2Vzc2VzIGFyZSBuZXZlciBkZXZlbG9wZWQgaW4gaXNvbGF0aW9uLiAgTWFueSBjb25jdXJyZW50IHRlYW1zIG9mIHByb2Nlc3MgZW5naW5lZXJzIG1pZ2h0IHdvcmsgb24gZGlmZmVyZW50IG9yIHRoZSBzYW1lIHBhcnRzIG9mIGEgTWV0aG9kIENvbnRlbnQgb3IgcGFydGljdWxhciBQcm9jZXNzZXMuICBUaGV5IGhhdmUgdG8gZWl0aGVyIGNvb3JkaW5hdGUgdGhlaXIgd29yayBvciBwcmVmZXJhYmx5IHRvIG1vZHVsYXJpemUgTWV0aG9kIENvbnRlbnQgYW5kIFByb2Nlc3MgZGVmaW5pdGlvbnMgdGhhdCB0aGV5IGNhbiB3b3JrIG9uIGluIGlzb2xhdGlvbiB3aXRob3V0IGFueSBzaGFyZWQgcmVzb3VyY2UgcHJvYmxlbXMuJiN4QTt8TW9yZW92ZXIsIHdvcmsgb24gYSBkZXZlbG9wbWVudCBQcm9jZXNzIGlzIG5ldmVyIGZpbmFsIGJlY2F1c2UgdGhleSBoYXZlIHRvIGJlIHRhaWxvcmVkIGZvciBldmVyeSBzcGVjaWZpYyBwcm9qZWN0IHNpdHVhdGlvbi4gIFRvIGF2b2lkIGRldmVsb3BpbmcgRGVsaXZlcnkgUHJvY2Vzc2VzIGZyb20gc2NyYXRjaCBmb3IgZXZlcnkgc3BlY2lmaWMgcHJvamVjdCBzaXR1YXRpb24gYSB0cnVseSByZXVzYWJsZSBQcm9jZXNzIGFsbG93cyBkZWZpbmluZyBtYW55IGRpZmZlcmVudCB2YXJpYXRpb25zIG9uIGl0LiAgVGhlcmVmb3JlLCB0YWlsb3JpbmcgYW5kIGV4dGVuc2lvbiBvZiBwcmUtZGVmaW5lZCBwcm9jZXNzZXMgaXMgYSBrZXkgcmVxdWlyZW1lbnQgZm9yIG9yZ2FuaXphdGlvbnMgYWRvcHRpbmcgYW5kIGltcGxlbWVudGluZyBwcm9jZXNzZXMuICAgRm9yIGV4YW1wbGUsIGltYWdlIGEgc2NlbmFyaW8gaW4gd2hpY2ggYSBkZXZlbG9wbWVudCBvcmdhbml6YXRpb24gcHVyY2hhc2VzIGEgdGhpcmQtcGFydHkgRGVsaXZlcnkgUHJvY2VzcyBmcm9tIGEgbWV0aG9kIHZlbmRvciBhbmQgaXRzIHVuZGVybHlpbmcgbWV0aG9kIGNvbnRlbnQuICBXaGlsZSBpbXBsZW1lbnRpbmcgdGhlIHByb2Nlc3MgaW4gdGhlaXIgb3JnYW5pemF0aW9uIHRoZXkgbWlnaHQgZGlzY292ZXIgdGhhdCB0aGV5IHdvdWxkIGxpa2UgdG8gdGFpbG9yIHRoZSBwcm9jZXNzIHRvIHRoZWlyIHBhcnRpY3VsYXIgbmVlZHMgYW5kIG9yZ2FuaXphdGlvbiBzcGVjaWZpYyB2YXJpYXRpb25zLiAgSWYgdGhleSB3b3VsZCBkaXJlY3RseSBtb2RpZnkgdGhlIHB1cmNoYXNlZCBwcm9jZXNzIHRoZXkgd291bGQgbWluZ2xlIHRoZWlyIGFkZGl0aW9ucyBhbmQgY2hhbmdlcyB3aXRoIHRoZSBvcmlnaW5hbCBwcm9jZXNzLiAgSWYgYSBuZXcgdmVyc2lvbiBvZiB0aGUgb3JpZ2luYWwgcHJvY2VzcyBpcyByZWxlYXNlZCBieSB0aGUgdmVuZG9yIGl0IHdvdWxkIGJlIHZlcnkgaGFyZCBmb3IgdGhlbSB0byBmaW5kIGFuZCByZXByb2R1Y2UgdGhlc2UgY2hhbmdlcyB0byB0aGUgbmV3IHByb2Nlc3MgdmVyc2lvbi4mI3hBO3xUaGUgcGFja2FnZSBNZXRob2QgUGx1Z2luIGFkZHMgdGhlIGNhcGFiaWxpdGllcyBvZiBtb2R1bGFyaXphdGlvbiBhbmQgZXh0ZW5zaWJpbGl0eSBvZiBNZXRob2QgQ29udGVudCBhbmQgUHJvY2Vzc2VzIHRvIFVNQS4gIEluIG90aGVyIHdvcmRzLCBpdCBzdXBwb3J0cyB0YWlsb3Jpbmcgb2YgTWV0aG9kIENvbnRlbnQgYW5kIFByb2Nlc3NlcyB3aXRob3V0IGRpcmVjdGx5IG1vZGlmeWluZyB0aGVtLCBidXQgYnkgZGVzY3JpYmluZyBjaGFuZ2VzIGZyb20gYSBzZXBhcmF0ZSB1bml0IGNhbGxlZCBhIE1ldGhvZCBQbHVnLWluLiAgVGhpcyBuZXcgY2FwYWJpbGl0eSBpcyBhY2hpZXZlZCBieSBhZGRpbmcgbmV3IGNvbmNlcHRzIHRvIHRoZSBtZXRhLW1vZGVsOiAmI3hBO3wtIEFsbCBNZXRob2QgRWxlbWVudHMgYXJlIG9yZ2FuaXplZCBpbiBNZXRob2QgUGx1Z2lucy4gIE1ldGhvZCBQbHVnaW5zIGFyZSBjb250YWluZXJzIGZvciBNZXRob2QgUGFja2FnZXMuICBFdmVyeSBNZXRob2QgRWxlbWVudCBpcyBwYXJ0IG9mIGV4YWN0bHkgb25lIE1ldGhvZCBQbHVnaW4sIGkuZS4gTWV0aG9kIFBsdWdpbnMgcGFydGl0aW9uIHRoZSBzcGFjZSBvZiBhbGwgTWV0aG9kIEVsZW1lbnRzLiAgJiN4QTt8LSBNZXRob2QgUGx1Z2lucyBjYW4gZGVmaW5lIGV4dGVuc2lvbnMgdG8gb3RoZXIgTWV0aG9kIFBsdWdpbnMuICBPbmUgTWV0aG9kIFBsdWdpbiBjYW4gZGVmaW5lIGV4dGVuc2lvbnMgZm9yIG1hbnkgb3RoZXIgUGx1Z2lucyBhbmQgY2FuIGJlIGV4dGVuZGVkIGJ5IG1hbnkgUGx1Z2lucy4mI3hBO3wtIFRoZSBNZXRob2QgUGx1Z2luIG1ldGEtbW9kZWwgcGFja2FnZSBhZGRzIGEgbmV3IHNldCBvZiByZWxhdGlvbnNoaXBzIGFuZCBzZW1hbnRpY3MgdG8gc3BlY2lmaWMgTWV0aG9kIEVsZW1lbnRzIHRoYXQgZGVmaW5lIGhvdyB0aGVzZSBNZXRob2QgRWxlbWVudHMgY2FuIGV4dGVuZCBlYWNoIG90aGVyIGFjcm9zcyB0aGUgYm91bmRhcnkgb2YgTWV0aG9kIFBsdWdpbnMgb3IgTWV0aG9kIFBhY2thZ2VzICh0byBhbGxvdyBtb2R1bGFyaXphdGlvbiBldmVuIHdpdGhpbiBvbmUgTWV0aG9kIFBsdWdpbikuJiN4QTt8VGhlIGZvbGxvd2luZyBzZWN0aW9ucyBkZWZpbmUgdGhlIGRldGFpbGVkIHJ1bGVzIGZvciB0aGVzZSBleHRlbnNpb25zIGZvciBzcGVjaWZpYyBNZXRob2QgRWxlbWVudHMuJiN4QTsiLz4KLSAgICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4KLSAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9SbkllRWV4WkVkdU9Ock1SZ216NDhBIiBlbGVtZW50PSJfUm5JZUVPeFpFZHVPTnJNUmdtejQ4QSIgc291cmNlPSJfSEJhYV9lZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfazlPbnNPeG5FZHV3T2JrSUE2eDFnQSI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9SbkllRk94WkVkdU9Ock1SZ216NDhBIiB0eXBlPSJLaW5kTGFiZWwiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9SbkllRnV4WkVkdU9Ock1SZ216NDhBIiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX1JuSWVHT3haRWR1T05yTVJnbXo0OEEiIHR5cGU9IktpbmQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfUm5JZUYteFpFZHVPTnJNUmdtejQ4QSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX1JuSWVGZXhaRWR1T05yTVJnbXo0OEEiIHg9Ii0yNyIgeT0iODk5Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9SbkllRXV4WkVkdU9Ock1SZ216NDhBIiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9SbkllRS14WkVkdU9Ock1SZ216NDhBIiBwb2ludHM9IlswLCA1NTYsIDIzODEsIC0yMTQzXSRbLTIzODEsIDIxNDMsIDAsIC01NTZdIi8+Ci0gICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX3czdk5zZXh1RWR1TTE0dW5XYXFQNVEiIGVsZW1lbnQ9Il93M3ZOc094dUVkdU0xNHVuV2FxUDVRIiBzb3VyY2U9Il9IQmFhX2VmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il96ekx2VU94bkVkdXdPYmtJQTZ4MWdBIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3czdk50T3h1RWR1TTE0dW5XYXFQNVEiIHR5cGU9IktpbmRMYWJlbCI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3czdk50dXh1RWR1TTE0dW5XYXFQNVEiIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfdzN2TnVPeHVFZHVNMTR1bldhcVA1USIgdHlwZT0iS2luZCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il93M3ZOdC14dUVkdU0xNHVuV2FxUDVRIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfdzN2TnRleHVFZHVNMTR1bldhcVA1USIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfdzN2TnN1eHVFZHVNMTR1bldhcVA1USIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfdzN2TnMteHVFZHVNMTR1bldhcVA1USIgcG9pbnRzPSJbOCwgMjEsIC04MywgLTgxXSRbMzUsIDEyMywgLTU2LCAyMV0iLz4KLSAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgPC9jb250ZW50cz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR29ZUDRPZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDBGQiI+Ci0gICAgICAgICAgPGJvZHk+MDM8L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8cGFja2FnZU1lcmdlIHhtaTppZD0iX1JuSWVFT3haRWR1T05yTVJnbXo0OEEiIG1lcmdlZFBhY2thZ2U9Il8zQURDN0I3NDAyMkQ0MUUwRDBFRDAxMDQiLz4KLSAgICAgICAgPHBhY2thZ2VNZXJnZSB4bWk6aWQ9Il93M3ZOc094dUVkdU0xNHVuV2FxUDVRIiBtZXJnZWRQYWNrYWdlPSJfM0FEQzdCNzQwMjJENDFERTQ3OEUwMDBEIi8+Ci0gICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMTA0IiBuYW1lPSJNZXRob2RQbHVnaW4iPgotICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR29ZUDh1ZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDEwNCI+Ci0gICAgICAgICAgICA8Ym9keT5BIE1ldGhvZCBQbHVnaW4gaXMgYSBNZXRob2QgRWxlbWVudCB0aGF0IHJlcHJlc2VudHMgYSBwaHlzaWNhbCBjb250YWluZXIgZm9yIE1ldGhvZCBQYWNrYWdlcy4gIEl0IGRlZmluZXMgYSBncmFudWxhcml0eSBsZXZlbCBmb3IgdGhlIG1vZHVsYXJpemF0aW9uIGFuZCBvcmdhbml6YXRpb24gb2YgbWV0aG9kIGNvbnRlbnQgYW5kIHByb2Nlc3Nlcy4gIEEgTWV0aG9kIFBsdWdpbiBjYW4gZXh0ZW5kIG1hbnkgb3RoZXIgTWV0aG9kIFBsdWdpbnMgYW5kIGl0IGNhbiBiZSBleHRlbmRlZCBieSBtYW55IE1ldGhvZCBQbHVnaW5zLiAgSXQgY2FuIGFsc28gYmUgdXNlZCBzdGFuZC1hbG9uZSwgaS5lLiB3aXRoIG5vIEV4dGVuc2lvbiByZWxhdGlvbnNoaXAgdG8gb3RoZXIgcGx1Zy1pbnMuCi1NZXRob2QgUGx1Z2luIGNvbmNlcHR1YWxseSByZXByZXNlbnRzIGEgdW5pdCBmb3IgY29uZmlndXJhdGlvbiwgbW9kdWxhcml6YXRpb24sIGV4dGVuc2lvbiwgcGFja2FnaW5nLCBhbmQgZGVwbG95bWVudCBvZiBtZXRob2QgY29udGVudCBhbmQgcHJvY2Vzc2VzLiAgQSBQcm9jZXNzIEVuZ2luZWVyIHNoYWxsIGRlc2lnbiBoaXMgUGx1Z2lucyBhbmQgYWxsb2NhdGUgaGlzIGNvbnRlbnQgdG8gdGhlc2UgUGx1Z2lucyB3aXRoIHJlcXVpcmVtZW50cyBmb3IgZXh0ZW5zaWJpbGl0eSwgbW9kdWxhcml0eSwgcmV1c2UsIGFuZCBtYWludGFpbmFiaWxpdHkgaW4gbWluZC4KLVNwZWNpYWwgZXh0ZW5zaWJpbGl0eSBtZWNoYW5pc21zIGRlZmluZWQgZm9yIHRoZSBtZXRhLWNsYXNzZXMgVmFyaWFiaWxpdHkgRWxlbWVudCBhbmQgUHJvY2VzcyBDb250cmlidXRpb24gYWxsb3cgUGx1Z2luIGNvbnRlbnQgdG8gZGlyZWN0bHkgY29udHJpYnV0ZSBuZXcgY29udGVudCwgcmVwbGFjZSBleGlzdGluZyBjb250ZW50LCBvciB0byBjcm9zcy1yZWZlcmVuY2UgdG8gYW55IENvbnRlbnQgRWxlbWVudCBvciBQcm9jZXNzIHdpdGhpbiBhbm90aGVyIFBsdWdpbiB0aGF0IGl0IGV4dGVuZHMuICBTaW1pbGFyIHRvIFVNTCAyLjAncyAncGFja2FnZSBtZXJnZScgbWVjaGFuaXNtIHRyYW5zZm9ybWF0aW9uIGludGVycHJldGF0aW9ucywgaW50ZXJwcmV0aW5nIHRoZXNlIE1ldGhvZCBQbHVnaW4gbWVjaGFuaXNtcyByZXN1bHRzIGludG8gbmV3IGV4dGVuZGVkIE1ldGhvZCBDb250ZW50IGFuZCBQcm9jZXNzZXMuCi08L2JvZHk+Ci0gICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxRkFEQzAxMDI4RCIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI4MCIvPgotICAgICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MjUxOEJENzAxRTMiIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0MURERkEzNjAyQzEiLz4KLSAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDFBRTcwNzMwM0I4IiBuYW1lPSJ1c2VyQ2hhbmdlYWJsZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfNUdjWUFPaWVFZHVRYnVZNlV3TVNRZyI+Ci0gICAgICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJfR29ZUDktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iXzVHY1lBT2llRWR1UWJ1WTZVd01TUWciPgotICAgICAgICAgICAgICA8Ym9keT50cnVlPC9ib2R5PgotICAgICAgICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMkQ4IiBuYW1lPSJtZXRob2RQYWNrYWdlcyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMTNGIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDJENSI+Ci0gICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9Hby1Gd2VmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR28tRndPZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IjEiLz4KLSAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyRUEiIG5hbWU9ImJhc2VzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxMDQiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMkU3Ij4KLSAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0dvLUZ5dWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9Hby1GeWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDFERTQ5NjIwMjBGIiBuYW1lPSJDb250ZW50RWxlbWVudCIgaXNBYnN0cmFjdD0idHJ1ZSI+Ci0gICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9Hb1lQLWVmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERTQ5NjIwMjBGIj4KLSAgICAgICAgICAgIDxib2R5PkNvbnRlbnQgRWxlbWVudCBpbiB0aGUgcGFja2FnZSBNZXRob2QgUGx1Z2luIGluaGVyaXRzIGZyb20gVmFyaWFiaWxpdHkgRWxlbWVudCBhbmQgbm90IGRpcmVjdGx5IGZyb20gTWV0aG9kIEVsZW1lbnQgYW55bW9yZS4gIFRoaXMgaXMgYWNoaWV2ZWQgdXNpbmcgVU1MIDIuMCBwYWNrYWdlIG1lcmdlIHNlbWFudGljcy4gIE9ubHkgaWYgYW4gYWRvcHRlciBvZiB0aGlzIG1ldGEtbW9kZWwgZGVjaWRlcyB0byByZWFsaXplIE1ldGhvZCBQbHVnaW5zLCBoZSB3b3VsZCBnZXQgdGhlIHZhcmlhYmlsaXR5IGFuZCBleHRlbnNpb24gY2FwYWJpbGl0aWVzIGZvciBhbGwgQ29udGVudCBFbGVtZW50cy4KLUNvbnRlbnQgRWxlbWVudCBpbmhlcml0cyB0aGUgc2VtYW50aWNzIG9mIFZhcmlhYmlsaXR5IEVsZW1lbnQuCi08L2JvZHk+Ci0gICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxREU1OEI2MDE4QiIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQyMUU4ODY4MDNFNSIvPgotICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MURFNDk1MDAxRjUiIG5hbWU9Ik1ldGhvZEVsZW1lbnQiIGlzQWJzdHJhY3Q9InRydWUiPgotICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR29ZUF91ZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREU0OTUwMDFGNSI+Ci0gICAgICAgICAgICA8Ym9keT5NZXRob2QgRWxlbWVudCBpbiB0aGUgcGFja2FnZSBNZXRob2QgUGx1Z2luIGFkZHMgYWRkaXRpb25hbCBwcm9wZXJ0aWVzIHZpYSBwYWNrYWdlIG1lcmdlIHRvIE1ldGhvZCBFbGVtZW50IGRlZmluZWQgaW4gTWV0aG9kIENvcmUgbmVlZGVkIGZvciB0aGUgdmFyaWFiaWxpdHkgYW5kIGV4dGVuc2liaWxpdHkgY2FwYWJpbGl0aWVzIGludHJvZHVjZXMgaW4gdGhpcyBwYWNrYWdlLjwvYm9keT4KLSAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDE4QUNBMEEwMEVCIiBuYW1lPSJzdXBwcmVzc2VkIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il81R2NZQU9pZUVkdVFidVk2VXdNU1FnIj4KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR29pQTQtZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxOEFDQTBBMDBFQiI+Ci0gICAgICAgICAgICAgIDxib2R5PklmIGEgVmFyaWFiaWxpdHkgRWxlbWVudCBpcyBkZXJpdmVkIGZyb20gYW5vdGhlciBWYXJpYWJpbGl0eSBFbGVtZW50IHVzaW5nIHRoZSBFeHRlbmRzIFZhcmlhYmlsaXR5IFNwZWNpYWxpemF0aW9uIHRoZW4gdGhpcyBhdHRyaWJ1dGUgY2FuIGJlIHVzZWQgdG8gc3VwcHJlc3MgaW5oZXJpdGVkIE1ldGhvZCBFbGVtZW50cyB0aGF0IHdlcmUgcGFydCBvZiB0aGUgYmFzZWQtb24gVmFyaWFiaWxpdHkgRWxlbWVudCwgd2hpY2ggY2FuIGJlIGFueSB0eXBlIG9mIE1ldGhvZCBFbGVtZW50LiAgSW4gb3RoZXIgd29yZHMsIGlmIHRoaXMgYXR0cmlidXRlIGlzIHNldCB0byB0cnVlIG9uIGEgTWV0aG9kIEVsZW1lbnQgdGhhdCBoYXMgdGhlIHNhbWUgbmFtZSB0aGFuIGFuIGluaGVyaXRlZCBtZXRob2QgZWxlbWVudCB0aGVuIGl0IHdpbGwgbm90IGJlIHJlZ2FyZGVkIGFzIGluaGVyaXRlZCBhdCBhbGwuPC9ib2R5PgotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJfR29pQTVlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iXzVHY1lBT2llRWR1UWJ1WTZVd01TUWciPgotICAgICAgICAgICAgICA8Ym9keT5mYWxzZTwvYm9keT4KLSAgICAgICAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyMzhFOTREMDAzRiIgbmFtZT0ib3JkZXJpbmdHdWlkZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIj4KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR29pQTUtZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMzhFOTREMDAzRiI+Ci0gICAgICAgICAgICAgIDxib2R5PlRoaXMgYXR0cmlidXRlIGlzIHVzZWQgZm9yIENBU0UgdG9vbCByZWFsaXphdGlvbnMgb2YgdGhpcyBtb2RlbCB0byBjb250YWluIGluZm9ybWF0aW9uIGFib3V0IGxheW91dCBhbmQgb3JkZXJpbmcgb2YgdGhlIG1ldGhvZCBlbGVtZW50IGFuZCBpdHMgcGFydHMuPC9ib2R5PgotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il85clFQa2V5R0VkdTUtdlZqbGZWc2ZRIiB2YWx1ZT0iMSIvPgotICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfOXJRUGtPeUdFZHU1LXZWamxmVnNmUSIvPgotICAgICAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iXzlodDVFT3lHRWR1NS12VmpsZlZzZlEiIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiIHZhbHVlPSIiLz4KLSAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkVudW1lcmF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEY2QjAwMjAyRUMiIG5hbWU9IlZhcmlhYmlsaXR5VHlwZSI+Ci0gICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9Hb2lBNnVmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGNkIwMDIwMkVDIj4KLSAgICAgICAgICAgIDxib2R5PlZhcmlhYmlsaXR5IFR5cGUgaXMgYW4gRW51bWVyYXRpb24gdXNlZCBmb3IgdmFsdWVzIGZvciBpbnN0YW5jZXMgb2YgVmFyaWFiaWxpdHkgRWxlbWVudCdzIGF0dHJpYnV0ZSB2YXJpYWJpbGl0eVR5cGUuICBJdCBkZWZpbmVzIHRoZSBuYXR1cmUgb2YgaG93IGEgVmFyaWFiaWxpdHkgRWxlbWVudCBleHRlbmRzIGFub3RoZXIgVmFyaWFiaWxpdHkgRWxlbWVudC4gU2VlIGVudW1lcmF0aW9uIGxpdGVyYWxzIGZvciBkZWZpbml0aW9ucyBmb3IgZWFjaCB0eXBlLjwvYm9keT4KLSAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICA8b3duZWRMaXRlcmFsIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjlDNkEzMDMzOCIgbmFtZT0ibmEiPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9Hb2lBN2VmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGOUM2QTMwMzM4Ij4KLSAgICAgICAgICAgICAgPGJvZHk+VGhpcyBpcyB0aGUgZGVmYXVsdCAmcXVvdDtub3QgYXNzaWduZWQmcXVvdDsgdmFsdWUgb2YgYSBWYXJpYWJpbGxpdHkgRWxlbWVudCdzIHZhcmlhYmlsaXR5VHlwZSBhdHRyaWJ1dGUgd2hpY2ggaXMgc2V0IGluIHRoZSBjYXNlIG5vIHZhcmlhYmlsaXR5IGFzc29jaWF0aW9uIGlzIHByZXNlbnQgYmV0d2VlbiB0aGUgVmFyaWFiaWxpdHkgRWxlbWVudCBhbmQgb3RoZXIgVmFyaWFiaWxpdHkgRWxlbWVudHMuCi08L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICA8L293bmVkTGl0ZXJhbD4KLSAgICAgICAgICA8b3duZWRMaXRlcmFsIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjZCMDFGMDNDMCIgbmFtZT0iY29udHJpYnV0ZXMiPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9Hb3JLMHVmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGNkIwMUYwM0MwIj4KLSAgICAgICAgICAgICAgPGJvZHk+Q29udHJpYnV0ZXMgcHJvdmlkZXMgYSB3YXkgZm9yIGluc3RhbmNlcyBvZiBWYXJpYWJpbGl0eSBFbGVtZW50cyB0byBjb250cmlidXRlIHRoZWlyIHByb3BlcnRpZXMgaW50byB0aGVpciBiYXNlIFZhcmlhYmlsaXR5IEVsZW1lbnQgd2l0aG91dCBkaXJlY3RseSBhbHRlcmluZyBhbnkgb2YgaXRzIGV4aXN0aW5nIHByb3BlcnRpZXMsIGkuZS4gaW4gYW4gYWRkaXRpdmUgZmFzaGlvbi4gIFByb3BlcnRpZXMgY29udHJpYnV0ZWQgYXJlOiBhdHRyaWJ1dGUgdmFsdWVzIGFuZCBhc3NvY2lhdGlvbiBpbnN0YW5jZXMuICBUaGUgZWZmZWN0IGFmdGVyIGludGVycHJldGF0aW9uIG9mIGNvbnRyaWJ1dGlvbiBpcyB0aGF0IHRoZSBiYXNlIFZhcmlhYmlsaXR5IEVsZW1lbnQgaXMgbG9naWNhbGx5IHJlcGxhY2VkIHdpdGggYW4gYXVnbWVudGVkIHZhcmlhbnQgb2YgdGhlIGVsZW1lbnQgdGhhdCBjb21iaW5lcyBhdHRyaWJ1dGUgdmFsdWVzIGFuZCBhc3NvY2lhdGlvbiBpbnN0YW5jZXMuICBUaGUgd2F5IHRoaXMgY29tYmluYXRpb24gaXMgcmVhbGl6ZWQgZGVwZW5kcyBvbiB0aGUgdHlwZSBvZiB0aGUgYXR0cmlidXRlIG9yIGFzc29jaWF0aW9uLiAgRm9yIGV4YW1wbGUsIFN0cmluZyBhdHRyaWJ1dGVzIGFyZSBjb25jYXRlbmF0ZWQgcmVzb2x2aW5nIGVtYmVkZGVkIGNvbW1hbmRzIGZvciBkZXBlbmRlbnQgdGV4dCBvciBtZXJnaW5nIHRleHQgZnJhZ21lbnRzIChlLmcuIGRlc2NyaXB0aW9ucyBmb3IgY29udGVudCBlbGVtZW50cykuICBBZGRpdGlvbmFsIGVsZW1lbnRzIGluIHRvLW1hbnkgYXNzb2NpYXRpb25zIGFyZSBhZGRlZCAoZS5nLiBhZGRpdGlvbmFsIEd1aWRhbmNlIGVsZW1lbnRzIG9yIFRhc2sgRGVzY3JpcHRvcnMgb2YgYW4gQWN0aXZpdHkpLiAgRGlmZmVyZW50IGVsZW1lbnRzIGluIHRvLW9uZSBhc3NvY2lhdGlvbnMgYXJlIGlnbm9yZWQgKGUuZy4gdGhlIG9uZSBQcmltYXJ5IFBlcmZvcm1lciBvZiBhIFRhc2spLiAgTXVsdGlwbGUgQ29udGVudCBFbGVtZW50cyBjYW4gY29udHJpYnV0ZSB0byB0aGUgc2FtZSBiYXNlIGVsZW1lbnQgYW5kIGFsbCBvZiB0aGVzZSBjb250cmlidXRpb25zIHByb3BlcnRpZXMgYXJlIGFkZGVkIHRvIHRoZSBiYXNlIGluIHRoZSBzYW1lIGZhc2hpb24uIFRoZSBmb2xsb3dpbmcgdGFibGUgcHJvdmlkZXMgdGhlIGRldGFpbGVkIGxpc3Qgb2YgaW50ZXJwcmV0YXRpb24gcnVsZXM6Ci1hdHRyaWJ1dGUgdmFsdWVzOglTdHJpbmcgdmFsdWVzIGZyb20gdGhlIHNwZWNpYWwgVmFyaWFiaWxpdHkgRWxlbWVudCBhcmUgY29uY2F0ZW5hdGVkIHdpdGggdmFsdWVzIGZyb20gdGhlIGJhc2VkLW9uIFZhcmlhYmlsaXR5IEVsZW1lbnQuICBPdGhlciB2YWx1ZXMgZnJvbSB0aGUgc3BlY2lhbCBWYXJpYWJpbGl0eSBFbGVtZW50IG9mIGFueSBvdGhlciB0eXBlIHN1Y2ggYXMgSW50ZWdlciwgRGF0ZSBhcmUgaWdub3JlZC4KLVRoZSBpZGVudGlmeWluZyBhdHRyaWJ1dGVzIGd1aWQgYW5kIG5hbWUgb2YgTWV0aG9kIEVsZW1lbnQgYXJlIGV4ZW1wdCBmcm9tIHRoaXMgcnVsZSBhbmQgd2lsbCBub3QgYmUgbW9kaWZpZWQuCi0wLi4xLWFzc29jaWF0aW9uIGluc3RhbmNlczoJVGhlIG9uZSBhc3NvY2lhdGlvbiBpbnN0YW5jZSBvZiB0aGUgYmFzZWQtb24gVmFyaWFiaWxpdHkgRWxlbWVudCBpcyBrZXB0IGFuZCBhbnkgYXNzb2NpYXRpb24gZnJvbSB0aGUgY29udHJpYnV0aW5nIHNwZWNpYWwgVmFyaWFiaWxpdHkgRWxlbWVudCBpcyBpZ25vcmVkLgotMC4ubi1hc3NvY2lhdGlvbiBpbnN0YW5jZXM6CUFzc29jaWF0aW9uIGluc3RhbmNlcyBvZiB0aGUgc3BlY2lhbCBWYXJpYWJpbGl0eSBFbGVtZW50IGFyZSBhZGRlZCB0byB0aGUgYWxyZWFkeSBleGlzdGluZyBhc3NvY2lhdGlvbiBpbnN0YW5jZXMgb2YgdGhlIGJhc2VkLW9uIGVsZW1lbnQuICBJZiBib3RoIFZhcmlhYmlsaXR5IEVsZW1lbnRzIHJlZmVyIHRvIHRoZSBzYW1lIG9iamVjdCB0aGVuIG9ubHkgb25lIGluc3RhbmNlIG9mIHRoZSBhc3NvY2lhdGlvbiB3aWxsIHJlbWFpbi4KLTwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgIDwvb3duZWRMaXRlcmFsPgotICAgICAgICAgIDxvd25lZExpdGVyYWwgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGNkIwMTgwMUUwIiBuYW1lPSJleHRlbmRzIj4KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR29ySzFlZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjZCMDE4MDFFMCI+Ci0gICAgICAgICAgICAgIDxib2R5PkV4dGVuc2lvbiBhbGxvd3MgTWV0aG9kIFBsdWdpbnMgdG8gZWFzaWx5IHJldXNlIGVsZW1lbnRzIGZyb20gYSBCYXNlIFBsdWdpbiBieSBwcm92aWRpbmcgYSBraW5kIG9mIGluaGVyaXRhbmNlIGZvciB0aGUgc3BlY2lhbCBWYXJpYWJpbGl0eSBFbGVtZW50LiAgQXR0cmlidXRlIHZhbHVlcyBhbmQgQXNzb2NpYXRpb24gaW5zdGFuY2VzIGFyZSBpbmhlcml0ZWQgZnJvbSB0aGUgYmFzZWQtb24gVmFyaWFiaWxpdHkgRWxlbWVudCB0byB0aGUgc3BlY2lhbCBWYXJpYWJpbGl0eSBFbGVtZW50LiAgVGhlIHJlc3VsdCBvZiBpbnRlcnByZXRhdGlvbiBpcyB0aGF0IHRoZSBzcGVjaWFsIGVsZW1lbnQgaGFzIHRoZSBzYW1lIHByb3BlcnRpZXMgYXMgdGhlIGJhc2VkLW9uIGhhcywgYnV0IG1pZ2h0IGRlZmluZSBpdHMgb3duIGFkZGl0aW9ucy4gIEhlbmNlIGV4dGVuZHMgaXMgbm90IHVzZWQgdG8gbW9kaWZ5IGNvbnRlbnQgb2YgdGhlIGJhc2UgUGx1Z2luLCBidXQgdG8gcHJvdmlkZSB0aGUgYWJpbGl0eSBmb3IgdGhlIGV4dGVuZGluZyBQbHVnaW4gdG8gZGVmaW5lIGl0cyBvd24gY29udGVudCB3aGljaCBpcyBhIHZhcmlhbnQgb2YgY29udGVudCBhbHJlYWR5IGRlZmluZWQgKGUuZy4gYSBzcGVjaWFsIHZlcnNpb24gb2YgYSBnZW5lcmljIFJldmlldyBSZWNvcmQgZm9yIGEgc3BlY2lmaWMgdHlwZSBvZiByZXZpZXcpLiAgVGhlIGVmZmVjdCBvZiB0aGlzIGlzIHRoYXQgdGhlIGJhc2UgVmFyaWFiaWxpdHkgRWxlbWVudCBhbmQgYW55IG51bWJlciBvZiBleHRlbmRpbmcgVmFyaWFiaWxpdHkgRWxlbWVudHMgY2FuIGJlIHVzZWQgc2lkZSBieSBzaWRlLCBidXQgcmVmZXIgdG8gZWFjaCBvdGhlciB2aWEgdGhlIGV4dGVuZHMgcmVsYXRpb25zaGlwLiAgRXh0ZW5kcyBhbHNvIHByb3ZpZGVzIHRoZSBrZXkgbWVjaGFuaXNtIGZvciBiaW5kaW5nIENhcGFiaWxpdHkgUGF0dGVybnMgdG8gUHJvY2Vzc2VzOiBBIHBhdHRlcm4gaXMgYXBwbGllZCBieSBkZWZpbmluZyBhbiBleHRlbmRzIHJlbGF0aW9uc2hpcHMgZnJvbSBhbiBBY3Rpdml0eSBvZiB0aGUgYXBwbHlpbmcgUHJvY2Vzc2VzIHRvIHRoZSBQYXR0ZXJuLiAgVGhlIEFjdGl2aXR5IGluaGVyaXRzIGFzc29jaWF0aW9ucyBpbnN0YW5jZXMgZnJvbSB0aGUgcGF0dGVybiBhbmQgdGhlIHBhdHRlcm4gYXBwZWFycyB0byBiZSBwYXJ0IG9mIHRoZSByZXN1bHRpbmcgUHJvY2VzcyBhZnRlciBJbnRlcnByZXRhdGlvbi4KLWF0dHJpYnV0ZSB2YWx1ZXM6CVZhbHVlcyBmcm9tIHRoZSBiYXNlZC1vbiBWYXJpYWJpbGl0eSBlbGVtZW50IGFyZSBpbmhlcml0ZWQgYW5kIHVzZWQgdG8gcG9wdWxhdGUgdGhlIHNwZWNpYWwgVmFyaWFiaWxpdHkgRWxlbWVudHMgYXR0cmlidXRlcy4gIElmIHRoZSBzcGVjaWFsIGVsZW1lbnQgYXR0cmlidXRlcyBhcmUgYWxyZWFkeSBwb3B1bGF0ZWQgdGhlIGluaGVyaXRlZCB2YWx1ZXMgYXJlIGlnbm9yZWQuICAKLVRoZSBpZGVudGlmeWluZyBhdHRyaWJ1dGVzIGd1aWQgYW5kIG5hbWUgb2YgTWV0aG9kIEVsZW1lbnQgYXJlIGV4ZW1wdCBmcm9tIHRoaXMgcnVsZSBhbmQgd2lsbCBub3QgYmUgbW9kaWZpZWQuCi0wLi4xLWFzc29jaWF0aW9uIGluc3RhbmNlczoJVGhlIG9uZSBhc3NvY2lhdGlvbiBpbnN0YW5jZSBvZiB0aGUgYmFzZWQtb24gVmFyaWFiaWxpdHkgRWxlbWVudCBpcyBpbmhlcml0ZWQgdG8gdGhlIHNwZWNpYWwgVmFyaWFiaWxpdHkgRWxlbWVudC4gIElmIHRoZSBzcGVjaWFsIFZhcmlhYmlsaXR5IEVsZW1lbnQgZGVmaW5lcyBpdHMgb3duIGFzc29jaWF0aW9uIGluc3RhbmNlIHRoZW4gdGhlIGluaGVyaXRlZCBvbmUgaXMgaWdub3JlZC4KLTAuLm4tYXNzb2NpYXRpb24gaW5zdGFuY2VzOglBc3NvY2lhdGlvbiBpbnN0YW5jZXMgZGVmaW5lZCBmb3IgdGhlIGJhc2VkLW9uIFZhcmlhYmlsaXR5IEVsZW1lbnQgYXJlIGluaGVyaXRlZCB0byB0aGUgc3BlY2lhbCBWYXJpYWJpbGl0eSBFbGVtZW50LiAgVGhlIHNwZWNpYWwgZWxlbWVudCBjYW4gYWRkIGFkZGl0aW9uYWwgYXNzb2NpYXRpb24gaW5zdGFuY2VzLgotCi08L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICA8L293bmVkTGl0ZXJhbD4KLSAgICAgICAgICA8b3duZWRMaXRlcmFsIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjZCMDFDMDI4NiIgbmFtZT0icmVwbGFjZXMiPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9Hb3JLMk9mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGNkIwMUMwMjg2Ij4KLSAgICAgICAgICAgICAgPGJvZHk+UmVwbGFjZXMgcHJvdmlkZXMgYSB3YXkgZm9yIFZhcmlhYmlsaXR5IEVsZW1lbnRzIHRvIHJlcGxhY2UgYSBiYXNlIFZhcmlhYmlsaXR5IEVsZW1lbnQgd2l0aG91dCBkaXJlY3RseSBjaGFuZ2luZyBhbnkgb2YgaXRzIGV4aXN0aW5nIHByb3BlcnRpZXMuICBUaGlzIGlzIGluIG1vc3QgY2FzZXMgdXNlZCBmb3IgTWV0aG9kIFBsdWdpbnMgdGhhdCBhaW0gdG8gcmVwbGFjZSBzcGVjaWZpYyBDb250ZW50IEVsZW1lbnRzIHN1Y2ggYXMgUm9sZXMsIFRhc2ssIG9yIEFjdGl2aXRpZXMgd2l0aCBlaXRoZXIgYSBjb21wbGV0ZSBuZXcgdmFyaWFudCBvciB0byBjaGFuZ2UgZnVuZGFtZW50YWwgcmVsYXRpb25zaGlwcyBvZiB0aGVzZSBlbGVtZW50cyAoZS5nLiBSb2xlLUFydGlmYWN0IHJlc3BvbnNpYmlsaXR5KS4gIFByb3BlcnRpZXMgcmVwbGFjZWQgYXJlIGF0dHJpYnV0ZSB2YWx1ZXMgYW5kIGFzc29jaWF0aW9uIGluc3RhbmNlcy4gIFRoZSBlZmZlY3Qgb2YgdGhpcyBpcyB0aGF0IHRoZSBiYXNlIENvbnRlbnQgRWxlbWVudCBpcyBsb2dpY2FsbHkgcmVwbGFjZWQgd2l0aCB0aGlzIG5ldyB2YXJpYW50IG9mIHRoZSBlbGVtZW50IHRvIHdoaWNoIGFsbCBpbmNvbWluZyBhc3NvY2lhdGlvbnMgc3RpbGwgcG9pbnQgYXMgYmVmb3JlLCBidXQgd2hpY2ggaGFzIHBvdGVudGlhbGx5IG5ldyBhdHRyaWJ1dGUgdmFsdWVzIGFuZCBvdXRnb2luZyBhc3NvY2lhdGlvbiBwcm9wZXJ0aWVzLiAgVGhpcyBwcm92aWRlcyBhIHZlcnkgcG93ZXJmdWwgbWVjaGFuaXNtIHRvIHJlcGxhY2UsIGZvciBleGFtcGxlLCB3aG9sZSBBY3Rpdml0aWVzIGluIGEgUHJvY2VzcyB3aXRoIGNvbXBsZXRlIG5ldyByZWFsaXphdGlvbnMgb2YgdGhlIEFjdGl2aXR5LiAgRm9yIGluc3RhbmNlLCByZXBsYWNpbmcgYW4gQWN0aXZpdHkgZG9pbmcgdXNlIGNhc2UtYmFzZWQgZGVzaWduIHdpdGggYW4gYWN0aXZpdHkgZG9pbmcgYWdpbGUgY29kZS1jZW50cmljIGRldmVsb3BtZW50IGRvaW5nIHRoZSBzYW1lIHdvcmsgdXNpbmcgYSBkaWZmZXJlbnQgZGV2ZWxvcG1lbnQgdGVjaG5pcXVlIHV0aWxpemluZyBkaWZmZXJlbnQgUm9sZXMsIFRhc2tzLCBldGMuICBBbm90aGVyIGV4YW1wbGUsIHdvdWxkIGJlIHRvIHJlcGxhY2UgYW4gQWN0aXZpdHkgdGhhdCBkZXNjcmliZXMgZGF0YWJhc2UgZGVzaWduIGZvciBhbiBSREJNUyB3aXRoIGFuIEFjdGl2aXR5IHRoYXQgZGVzY3JpYmVzIGRhdGFiYXNlIGRlc2lnbiBmb3IgYW4gT09EQk1TLiAgQSBWYXJpYWJpbGl0eSBFbGVtZW50IGNhbiBvbmx5IGJlIHJlcGxhY2VkIGJ5IG9uZSBvdGhlciBlbGVtZW50IGF0IGEgdGltZS4gIEZvciBleGFtcGxlLCBpZiB0d28gTWV0aG9kIFBsdWdpbnMgcmVwbGFjZSB0aGUgc2FtZSBlbGVtZW50IG9ubHkgb25lIE1ldGhvZCBQbHVnaW4gY2FuIGJlIHVzZWQgZm9yIGludGVycHJldGF0aW9uIChzZWUgY29uY2VwdCBvZiBNZXRob2QgQ29uZmlndXJhdGlvbiBmb3IgbW9yZSBkZXRhaWxzIG9uIGhvdyB0byByZXNvbHZlIHN1Y2ggY29uZmxpY3RzLCBTZWN0aW9uIDcuMS4yKS4gIFRoZSBmb2xsb3dpbmcgdGFibGUgcHJvdmlkZXMgdGhlIGRldGFpbGVkIGxpc3Qgb2YgaW50ZXJwcmV0YXRpb24gcnVsZXM6Ci1hdHRyaWJ1dGUgdmFsdWVzOglWYWx1ZXMgZnJvbSB0aGUgc3BlY2lhbCBWYXJpYWJpbGl0eSBFbGVtZW50IGFyZSByZXBsYWNlZCB3aXRoIHZhbHVlcyBmcm9tIHRoZSBiYXNlZC1vbiBWYXJpYWJpbGl0eSBFbGVtZW50IGluY2x1ZGluZyB1bmFzc2lnbmVkIHZhbHVlcy4KLVRoZSBpZGVudGlmeWluZyBhdHRyaWJ1dGVzIGd1aWQgYW5kIG5hbWUgb2YgTWV0aG9kIEVsZW1lbnQgYXJlIGV4ZW1wdCBmcm9tIHRoaXMgcnVsZSBhbmQgd2lsbCBub3QgYmUgbW9kaWZpZWQuCi0wLi4xLWFzc29jaWF0aW9uIGluc3RhbmNlczoJVGhlIG9uZSBhc3NvY2lhdGlvbiBpbnN0YW5jZSBvZiB0aGUgYmFzZWQtb24gVmFyaWFiaWxpdHkgRWxlbWVudCBpcyByZXBsYWNlZCB3aXRoIHRoZSBhc3NvY2lhdGlvbiBpbnN0YW5jZSBmcm9tIHRoZSByZXBsYWNpbmcgc3BlY2lhbCBWYXJpYWJpbGl0eSBFbGVtZW50LiAgSWYgdGhlIHNwZWNpYWwgVmFyaWFiaWxpdHkgRWxlbWVudCBkb2VzIG5vdCBoYXZlIGFuIGFzc29jaWF0aW9uIGluc3RhbmNlIHRoZW4gcmVzdWx0aW5nIGVsZW1lbnQgd2lsbCBhbHNvIG5vdCBoYXZlIGFuIGFzc29jaWF0aW9uLgotMC4ubi1hc3NvY2lhdGlvbiBpbnN0YW5jZXM6CUFzc29jaWF0aW9uIGluc3RhbmNlcyBvZiB0aGUgc3BlY2lhbCBWYXJpYWJpbGl0eSBFbGVtZW50IHJlcGxhY2UgYWxsIGFzc29jaWF0aW9uIGluc3RhbmNlcyBvZiB0aGUgYmFzZWQtb24gVmFyaWFiaWxpdHkgRWxlbWVudC4KLQotPC9ib2R5PgotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgPC9vd25lZExpdGVyYWw+Ci0gICAgICAgICAgPG93bmVkTGl0ZXJhbCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0NDYyOEU0QjAxMzMiIG5hbWU9ImxvY2FsQ29udHJpYnV0aW9uIi8+Ci0gICAgICAgICAgPG93bmVkTGl0ZXJhbCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0NDYyOEU1RTAxM0IiIG5hbWU9ImxvY2FsUmVwbGFjZW1lbnQiLz4KLSAgICAgICAgICA8b3duZWRMaXRlcmFsIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQ1QzhENjcwMDJBOSIgbmFtZT0iZXh0ZW5kc1JlcGxhY2VzIi8+Ci0gICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyMUU4ODY4MDNFNSIgbmFtZT0iVmFyaWFiaWxpdHlFbGVtZW50IiBpc0Fic3RyYWN0PSJ0cnVlIj4KLSAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dvckszdWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjFFODg2ODAzRTUiPgotICAgICAgICAgICAgPGJvZHk+VmFyaWFiaWxpdHkgRWxlbWVudCBpcyBhbiBhYnN0cmFjdCBjbGFzcyBkZXJpdmVkIGZyb20gTWV0aG9kIEVsZW1lbnQgdGhhdCBwcm92aWRlcyBuZXcgY2FwYWJpbGl0aWVzIGZvciBjb250ZW50IHZhcmlhdGlvbiBhbmQgZXh0ZW5zaW9uIHRvIENvbnRlbnQgRWxlbWVudHMgb3IgYW55IG90aGVyIE1ldGhvZCBFbGVtZW50IHRoYXQgZGVyaXZlcyBmcm9tIGl0LiAgSXQgaGFzIGJlZW4gcGxhY2VkIGluLWJldHdlZW4gdGhlIGNsYXNzZXMgTWV0aG9kIEVsZW1lbnQgYW5kIENvbnRlbnQgRWxlbWVudCBpbiB0aGUgb3ZlcmFsbCBVTUEgdGF4b25vbXkgb2YgY2xhc3NlcyB1c2luZyB0aGUgVU1MIDIuMCBwYWNrYWdlIG1lcmdlIG1lY2hhbmlzbS4gIFRoZSBhc3NvY2lhdGlvbiBWYXJpYWJpbGl0eSBTcGVjaWFsaXphdGlvbiBzaGFsbCBvbmx5IGJlIGluc3RhbnRpYXRlZCBiZXR3ZWVuIHR3byBzdWJjbGFzc2VzIG9mIFZhcmlhYmlsaXR5IEVsZW1lbnQgb2YgdGhlIHNhbWUgdHlwZS4gIFRoZSBlbGVtZW50IG9uIHZhcmFpYmlsaXR5U3BlY2lhbEVsZW1lbnQgc2lkZSBvZiB0aGUgcmVsYXRpb25zaGlwIGRlZmluZXMgYSB2YWx1ZSBmb3IgdGhlIGF0dHJpYnV0ZSB2YXJpYWJpbGl0eVR5cGUgZGVmaW5pbmcgdGhlIG5hdHVyZSBvZiB0aGUgcmVsYXRpb25zaGlwIHVzaW5nIGEgbGl0ZXJhbCBmcm9tIHRoZSBlbnVtZXJhdGlvbiBWYXJpYWJpbGl0eSBUeXBlLgotVmFyaWFiaWxpdHkgRWxlbWVudCBvZiB0aGUgbWV0YS1tb2RlbCBwYWNrYWdlIE1ldGhvZCBQbHVnaW5zIGFkZHMgdGhlIGNhcGFiaWxpdGllcyBvZiB2YXJpYXRpb24gYW5kIGV4dGVuc2lvbiB0byBNZXRob2QgRWxlbWVudHMgdGhhdCBkZXJpdmUgZnJvbSBpdC4gIEJ5IGRlZmF1bHQgYWxsIENvbnRlbnQgRWxlbWVudHMgc3VjaCBhcyBSb2xlLCBUYXNrLCBHdWlkYW5jZSBUeXBlcywgb3IgQWN0aXZpdGllcyBhcmUgZGVmaW5lZCB0byBiZSBWYXJpYWJpbGl0eSBFbGVtZW50cy4KLVZhcmlhYmlsaXR5IGFuZCBleHRlbnNpb24gcHJvdmlkZXMgdW5pcXVlIG1lY2hhbmlzbXMgZm9yIGN1c3RvbWl6aW5nIG1ldGhvZCBjb250ZW50IHdpdGhvdXQgYWN0dWFsbHkgZGlyZWN0bHkgbW9kaWZ5aW5nIHRoZSBvcmlnaW5hbCBjb250ZW50LCBidXQgYnkganVzdCBiZSBhYmxlIHRvIGRlc2NyaWJlIHdpdGggc2VwYXJhdGUgb2JqZWN0cyB0aGUgZGlmZmVyZW5jZXMgKGFkZGl0aW9ucywgY2hhbmdlcywgb21pc3Npb25zKSByZWxhdGl2ZSB0byB0aGUgb3JpZ2luYWwuICBUaGlzIHBsdWctaW4gY29uY2VwdCBhbGxvd3MgdXNlcnMgdG8gZmFjdG9yIHRoZWlyIG1ldGhvZCBjb250ZW50IGFuZCBwcm9jZXNzZXMgaW4gaW50ZXJyZWxhdGVkIHVuaXRzIGFuZCBldmVuIHRvIGFyY2hpdGVjdCBtZXRob2QgY29udGVudCBhbmQgcHJvY2Vzc2VzIGluIGxheWVycyB0aGF0IGV4dGVuZCBlYWNoIG90aGVyIHdpdGggbmV3IGNhcGFiaWxpdGllcy4gIFRoZSByZXN1bHRpbmcgbWV0aG9kIGFuZCBwcm9jZXNzIGRlc2lnbiBjYW4gYmUgZHluYW1pY2FsbHkgY29tYmluZWQgYW5kIGFwcGxpZWQgb24gZGVtYW5kIHVzaW5nIHRoZSBpbnRlcnByZXRhdGlvbiBydWxlcyBkZWZpbmVkIGZvciBWYXJpYWJpbGl0eSBFbGVtZW50IFNwZWNpYWxpemF0aW9ucyBhc3NlbWJsaW5nIHRvIHByb2Nlc3MgcHJhY3RpdGlvbmVycyB0aGUgbW9zdCBhY2N1cmF0ZSBtZXRob2QgYW5kIHByb2Nlc3MgZGVzY3JpcHRpb25zIHBvc3NpYmxlLiAgSXQgYWxzbyBhbGxvd3MgcHJvY2VzcyBwcmFjdGl0aW9uZXJzIHRvIGV4dGVuZHMgYW5kIHRhaWxvciBtZXRob2QgY29udGVudCBhbmQgcHJvY2Vzc2VzIHRoZXkgZG8gbm90IG93biBhbmQgdG8gZWFzaWx5IHVwZ3JhZGUgdG8gbmV3ZXIgdmVyc2lvbnMgYnkgc2ltcGx5IHJlYXBwbHkgdGhlaXIgcGVyc29uYWwgY2hhbmdlcyB0byB0aGVzZSB1cGdyYWRlcy4KLVZhcmlhYmlsaXR5IEVsZW1lbnQgZGVmaW5lcyB0d28gdHlwZXMgb2YgdmFyaWFiaWxpdHkgYW5kIG9uZSB0eXBlIG9mIGV4dGVuc2lvbiB3aGljaCBhcmUgZm9ybWFsbHkgZGVmaW5lZCBmb3IgdGhlIGVudW1lcmF0aW9uIFZhcmlhYmlsaXR5IFR5cGUuCi08L2JvZHk+Ci0gICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX0p4UGY0T3haRWR1T05yTVJnbXo0OEEiIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0MURFNDk1MDAxRjUiLz4KLSAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGNkIwRTYwM0M3IiBuYW1lPSJ2YXJpYWJpbGl0eVR5cGUiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjZCMDAyMDJFQyI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dvcks0dWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEY2QjBFNjAzQzciPgotICAgICAgICAgICAgICA8Ym9keT5JZiBpbiBpbnN0YW5jZSBvZiB0aGUgdmFyaWFiaWxpdHlTcGVjaWFsaXphdGlvbiBhc3NvY2lhdGlvbiBiZXR3ZWVuIHR3byBWYXJpYWJpbGl0eSBFbGVtZW50cyBvZiB0aGUgc2FtZSB0eXBlIGV4aXN0cywgdGhlbiB0aGUgdmFyaWFiaWxpdHlUeXBlIGF0dHJpYnV0ZSBzcGVjaWZpZXMgaG93IHRoZSBlbGVtZW50IGF0IHRoZSB2YXJpYWJpbGl0eVNwZWNpYWxFbGVtZW50IGVuZCBvZiB0aGUgYXNzb2NpYXRpb24gY2hhbmdlcyB0aGUgQ29udGVudCBFbGVtZW50IGF0IHRoZSB2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50IGVuZC4gU2VlIHRoZSBWYXJpYWJpbGl0eSBUeXBlIGVudW1lcmF0aW9uIGNsYXNzIGZvciBkZWZpbml0aW9ucyBmb3IgdGhlIGRpZmZlcmVudCB0eXBlcyBvZiB2YXJpYWJpbGl0eS48L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9Il9HbzA3MGVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgPGJvZHk+bmE8L2JvZHk+Ci0gICAgICAgICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MURFNTg3QTAzQTIiIG5hbWU9InZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQyMUU4ODY4MDNFNSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MURFNTg3QTAzQTAiPgotICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR28tRjAtZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IjEiLz4KLSAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0dvLUYwdWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDI3OTU1NDUwMTM0IiBuYW1lPSJTZWN0aW9uIj4KLSAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dvMDcwLWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjc5NTU0NTAxMzQiPgotICAgICAgICAgICAgPGJvZHk+U2VjdGlvbiBpbiB0aGUgcGFja2FnZSBNZXRob2QgUGx1Z2luIGluaGVyaXRzIGZyb20gVmFyaWFiaWxpdHkgRWxlbWVudCBhbmQgZXh0ZW5kcyBTZWN0aW9uIGRlZmluZWQgaW4gTWV0aG9kIENvcmUgOjogQmFzaWMgRWxlbWVudHMgd2l0aCBuZXcgY2FwYWJpbGl0aWVzIGZvciB2YXJpYWJpbGl0eS4gCi1Gb3IgZXhhbXBsZSwgd2hlbiBhIFRhc2sgY29udHJpYnV0ZXMgdG8gYW5vdGhlciBUYXNrIGl0cyBQcmVzZW50YXRpb24gYXNzb2NpYXRpb24gaXMgY29udHJpYnV0ZWQgaW5jbHVkaW5nIGl0cyBTZWN0aW9ucyAoaS5lLiBpdHMgU3RlcHMpLCB3aGljaCBhcmUgbW9kZWxlZCBhcyBwYXJ0cyBvZiB0aGUgQ29udGVudCBEZXNjcmlwdGlvbiBpbnN0YW5jZS4gIFNlY3Rpb25zIGNhbiBiZSBuZXN0ZWQgYW5kIHRoZXJlZm9yZSBUYXNrIERlc2NyaXB0aW9ucyBjYW4gYmUgZmxleGlibHkgb3JnYW5pemVkIGluIFN0ZXBzIHdpdGggc3ViLVN0ZXBzLiAgU2VjdGlvbnMgYXJlIFZhcmlhYmlsaXR5IEVsZW1lbnRzIHRoZW1zZWx2ZXMsIHNvIHRoZXkgY2FuIGNvbnRyaWJ1dGUgdG8gZWFjaCBvdGhlci4gIEZvciBleGFtcGxlLCBvbmUgY291bGQgbW9kZWwgYSBUYXNrIHN0ZXAgYXMgYSBTZWN0aW9uIGluc3RhbmNlIHdpdGhvdXQgcmVsYXRpbmcgaXQgdG8gYSBUYXNrIERlc2NyaXB0aW9uIHRoYXQgZGlyZWN0bHkgY29udHJpYnV0ZXMgdG8gKG9yIHJlcGxhY2VzKSBhbm90aGVyIFNlY3Rpb24gd2hpY2ggaXMgcGFydCBvZiBhIFRhc2sgRGVzY3JpcHRpb24uICBUaGlzIGNvbnRyaWJ1dGlvbiAob3IgcmVwbGFjZW1lbnQpIHdvdWxkIGFkZCBuZXcgZGVzY3JpcHRpb24gdGV4dCB0byB0aGUgb3JpZ2luYWwgc3RlcCBkZXNjcmlwdGlvbiAob3IgcmVwbGFjZSB0aGUgb3JpZ2luYWwgc3RlcCBkZXNjcmlwdGlvbikuICBBbm90aGVyIGV4YW1wbGUgd291bGQgYmUgdG8gY29udHJpYnV0ZSBuZXcgQ2hlY2sgTGlzdCBpdGVtcyBvcmdhbml6ZWQgYXMgU2VjdGlvbnMgdG8gYW4gZXhpc3RpbmcgQ2hlY2sgTGlzdCAoZGVmaW5lZCBhcyBndWlkYW5jZSkuICAKLQotPC9ib2R5PgotICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0Mjc5NTU2MDAxNzAiIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0MjFFODg2ODAzRTUiLz4KLSAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDIxRThFNjcwMUIxIiBuYW1lPSJwcmVkZWNlc3NvciIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDI3OTU1NDUwMTM0IiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQyMUU4RTY1MDIxMyI+Ci0gICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9Hby1GMmVmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iMSIvPgotICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR28tRjJPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyN0FBMEFFMDM5RCIgbmFtZT0iQWN0aXZpdHkiPgotICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR28wNzJPZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0FBMEFFMDM5RCI+Ci0gICAgICAgICAgICA8Ym9keT5BY3Rpdml0eSBpbiB0aGUgcGFja2FnZSBNZXRob2QgUGx1Z2luIGluaGVyaXRzIGZyb20gVmFyaWFiaWxpdHkgRWxlbWVudCB0byBleHRlbmQgQWN0aXZpdHkgd2l0aCBuZXcgY2FwYWJpbGl0aWVzIGZvciB2YXJpYWJpbGl0eS4mI3hEOwotQWN0aXZpdHkgaW5oZXJpdHMgdGhlIHNlbWFudGljcyBvZiBWYXJpYWJpbGl0eSBFbGVtZW50IHdoaWNoIHByb3ZpZGVzIGtleSBtZWNoYW5pc20gdG8gZW5hYmxlIGR5bmFtaWMgYmluZGluZyBvZiBDYXBhYmlsaXR5IFBhdHRlcm5zIGluIFByb2Nlc3NlcyBhcyB3ZWxsIGFzIFByb2Nlc3MgQ29udHJpYnV0aW9ucy4gIFZhcmlhYmlsaXR5IGlzIHVzZWQgaW4gdGhlIGZvbGxvd2luZyB3YXkgZm9yIEFjdGl2aXRpZXM6JiN4RDsKLS0gRXh0ZW5kOiBUbyBhcHBseSBhIENhcGFiaWxpdHkgUGF0dGVybiB0byBhIHByb2Nlc3Mgb25lIHdvdWxkIGNyZWF0ZSBhbiBBY3Rpdml0eSB3aGljaCBleHRlbmRzIHRoZSBwYXR0ZXJuJ3MgdG9wLWxldmVsIGFjdGl2aXR5LiAgVGhyb3VnaCBleHRlbnNpb24gdGhlIGV4dGVuZGluZyBBY3Rpdml0eSBpbmhlcml0cyB0aGUgcGF0dGVybnMgQnJlYWtkb3duIEVsZW1lbnRzLiYjeEQ7Ci0tIFJlcGxhY2U6IFRvIHJlcGxhY2UgYW4gQWN0aXZpdHkgb2YgYW4gYXBwbGllZCBDYXBhYmlsaXR5IFBhdHRlcm4gb3IgYW4gZXhpc3RpbmcgcHJvY2VzcyBmb3Igd2hpY2ggb25lIGRldmVsb3BzIGEgUHJvY2VzcyBDb250cmlidXRpb24gKG9yIGEgY29tYmluYXRpb24gb2YgYm90aCkgb25lIHdvdWxkIGNyZWF0ZSBhbiBBY3Rpdml0eSBhbmQgc3BlY2lmeSB0aGUgcmVwbGFjZSB2YXJpYWJpbGl0eSBzcGVjaWFsaXphdGlvbiBiZXR3ZWVuIHRoZW0uJiN4RDsKLS0gQ29udHJpYnV0ZTogVG8gY29udHJpYnV0ZSBuZXcgQnJlYWtkb3duIEVsZW1lbnRzIHRvIGFuIGV4aXN0aW5nIEFjdGl2aXR5IG9uZSB3b3VsZCBkZWZpbmUgYW4gQWN0aXZpdHkgd2l0aCBCcmVha2Rvd24gRWxlbWVudHMgdGhhdCByZWxhdGVzIHZpYSB0aGUgQ29udHJpYnV0ZXMgVmFyaWFiaWxpdHkgU3BlY2lhbGl6YXRpb24gdG8gdGhpcyBleGlzdGluZyBBY3Rpdml0eS4gIFRoZSBjb250cmlidXRpbmcgQWN0aXZpdHkncyBCcmVha2Rvd24gRWxlbWVudHMgd2lsbCBiZSBhZGRlZCB0byB0aGUgY29udHJpYnV0ZWQgQWN0aXZpdHkuJiN4RDsKLSYjeEQ7Ci08L2JvZHk+Ci0gICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyN0FBMEQzMDI0NSIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQyMUU4ODY4MDNFNSIvPgotICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyRDUiIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDJENiBfM0FEQzdCNzQwMjJENDBGMzZDNjAwMkQ4Ij4KLSAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dvMDczZWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyRDUiPgotICAgICAgICAgICAgPGJvZHk+VGhpcyBjb21wb3NpdGlvbiBhc3NvY2lhdGlvbiByZXByZXNlbnRzIHRoYXQgZXZlcnkgTWV0aG9kIFBhY2thZ2UgKGVpdGhlciBDb250ZW50IFBhY2thZ2UsIFByb2Nlc3MgUGFja2FnZSwgb3IgUHJvY2VzcyBDb21wb25lbnQpIGlzIHBhcnQgb2YgZXhhY3RseSBvbmUgTWV0aG9kIFBsdWdpbi48L2JvZHk+Ci0gICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDJENiIgbmFtZT0iX21ldGhvZFBsdWdpbiIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMTA0IiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMkQ1Ij4KLSAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0dvMDc0ZWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HbzA3NE9mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iMSIvPgotICAgICAgICAgIDwvb3duZWRFbmQ+Ci0gICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDJFNyIgbmFtZT0iRXh0ZW5zaW9uIiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyRTggXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDJFQSI+Ci0gICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9Hby1Gdy1mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMkU3Ij4KLSAgICAgICAgICAgIDxib2R5PlRoaXMgYXNzb2NpYXRpb24gZGVmaW5lcyBob3cgTWV0aG9kIFBsdWdpbnMgZXh0ZW5kIG1hbnkgb3RoZXIgTWV0aG9kIFBsdWdpbnMuICBUaGUgZXh0ZW5kaW5nIHBsdWctaW4gY29udGFpbnMgbmV3IG1ldGhvZCBlbGVtZW50cywgZXh0ZW5kcyBleGlzdGluZyBtZXRob2QgZWxlbWVudHMgYW5kIHByb2Nlc3NlcyB1c2luZyBjb250ZW50IGVsZW1lbnQgdmFyaWFiaWxpdHkgbWVjaGFuaXNtcyAoZS5nLiBjb250cmlidXRpb24sIHJlcGxhY2UsIGV0Yy4pLCBwcm92aWRlcyBhZGRpdGlvbmFsIERlbGl2ZXJ5IGFuZCBDYXBhYmlsaXR5IFByb2Nlc3NlcyBmb3IgYSBNZXRob2QgRnJhbWV3b3JrLCBldGMuPC9ib2R5PgotICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyRTgiIG5hbWU9InBsdWdpbnMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDEwNCIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyRTciPgotICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR28tRngtZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0dvLUZ4dWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICA8L293bmVkRW5kPgotICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MURFNTg3QTAzQTAiIG5hbWU9InZhcmlhYmlsaXR5U3BlY2lhbGl6YXRpb24iIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQxREU1ODdBMDNBMSBfM0FEQzdCNzQwMjJENDFERTU4N0EwM0EyIj4KLSAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dvLUZ6T2ZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURFNTg3QTAzQTAiPgotICAgICAgICAgICAgPGJvZHk+VGhpcyAxLXRvLW1hbnkgYXNzb2NpYXRpb24gZGVmaW5lcyBpbiBjb21iaW5hdGlvbiB3aXRoIHRoZSB2YXJpYWJpbGl0eVR5cGUgYXR0cmlidXRlIHRoYXQgYSBudW1iZXIgb2Ygc3BlY2lhbCBWYXJpYWJpbGl0eSBFbGVtZW50cyBvZiB0aGUgc2FtZSB0eXBlIHJlcHJlc2VudCBhIHZhcmlhdGlvbiBvZiBleGFjdGx5IG9uZSBvdGhlciBWYXJpYWJpbGl0eSBFbGVtZW50LiAgU2VlIHRoZSBWYXJpYWJpbGl0eSBUeXBlIGVudW1lcmF0aW9uIGNsYXNzIGZvciBkZWZpbml0aW9ucyBmb3IgdGhlIGRpZmZlcmVudCB0eXBlcyBvZiB2YXJpYWJpbGl0eS48L2JvZHk+Ci0gICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxREU1ODdBMDNBMSIgbmFtZT0idmFyaWFiaWxpdHlTcGVjaWFsRWxlbWVudCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDIxRTg4NjgwM0U1IiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQxREU1ODdBMDNBMCI+Ci0gICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9Hby1GME9mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR28tRnotZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgIDwvb3duZWRFbmQ+Ci0gICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyMUU4RTY1MDIxMyIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDIxRThFNjcwMUIxIF8zQURDN0I3NDAyMkQ0MjFFOEU2NzAxQkMiPgotICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR28tRjFlZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMUU4RTY1MDIxMyI+Ci0gICAgICAgICAgICA8Ym9keT5UaGlzIGFzc29jaWF0aW9uIGRlc2NyaWJlcyB0aGUgb3JkZXIgaW4gd2hpY2ggY29udHJpYnV0ZWQgU2VjdGlvbnMgc2hhbGwgYmUgaW5zZXJ0ZWQgaW50byBhbiAgZXhpc3RpbmcgbGlzdCBvZiBTZWN0aW9ucyBtYWludGFpbmVkIGZvciBhIENvbnRlbnQgRGVzY3JpcHRpb24uPC9ib2R5PgotICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MjFFOEU2NzAxQkMiIG5hbWU9Il9zZWN0aW9uIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0Mjc5NTU0NTAxMzQiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MjFFOEU2NTAyMTMiPgotICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR28tRjNPZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0dvLUYyLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICA8L293bmVkRW5kPgotICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOlBhY2thZ2UiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDE3QiIgbmFtZT0iTWV0aG9kQ29yZSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfR3ZQRjB1ZlhFZHVxSG9PSmJVUlpSdyIgc291cmNlPSJ1bWwyLmRpYWdyYW1zIiByZWZlcmVuY2VzPSJfM0FEQzdCNzQwMjJENDBGODdCNEUwMzRBIj4KLSAgICAgICAgICA8Y29udGVudHMgeG1pOnR5cGU9Im5vdGF0aW9uOkRpYWdyYW0iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjg3QjRFMDM0QSIgdHlwZT0iQ2xhc3MiIG5hbWU9Ik1haW4iPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJSGY1dWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyNjIiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElIZjZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hJSGY2dWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJSGY2LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJSGY3T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJSGY3ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElIZjd1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlBhY2thZ2VDb250ZW50cyI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISUhmNy1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIiBjb2xsYXBzZWQ9InRydWUiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSElIZjUtZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJOb25lIiBzaG93TGlzdFZpc2liaWxpdHk9Ik5vbmUiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSElIZjZPZlhFZHVxSG9PSmJVUlpSdyIgeD0iOTYyMyIgeT0iMTQ1MTgiIHdpZHRoPSI0NDAyIiBoZWlnaHQ9IjE2ODQiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElIZjhPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI5NCI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISUhmOC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSElIZjlPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElIZjllZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElIZjl1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElIZjktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISUhmLU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iUGFja2FnZUNvbnRlbnRzIj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hJSGYtZWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiIGNvbGxhcHNlZD0idHJ1ZSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9ISUhmOGVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9Ik5vbmUiIHNob3dMaXN0VmlzaWJpbGl0eT0iTm9uZSIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISUhmOHVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxMDgzOSIgeT0iMTE0MDAiIHdpZHRoPSI0NDMyIiBoZWlnaHQ9IjE2NzYiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElIZi11ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDE5MCI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISUhmX2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSElIZl91ZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElIZl8tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElIZ0FPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElIZ0FlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISUhnQXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iUGFja2FnZUNvbnRlbnRzIj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hJSGdBLWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiIGNvbGxhcHNlZD0idHJ1ZSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9ISUhmLS1mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9Ik5vbmUiIHNob3dMaXN0VmlzaWJpbGl0eT0iTm9uZSIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISUhmX09mWEVkdXFIb09KYlVSWlJ3IiB4PSI3NjA4IiB5PSI4MjQyIiB3aWR0aD0iNDUzNyIgaGVpZ2h0PSIxNjc2Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJSGdCT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyMjUiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElIZ0ItZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hJSGdDT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJSGdDZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJSGdDdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJSGdDLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElIZ0RPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlBhY2thZ2VDb250ZW50cyI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISUhnRGVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIiBjb2xsYXBzZWQ9InRydWUiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSElIZ0JlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJOb25lIiBzaG93TGlzdFZpc2liaWxpdHk9Ik5vbmUiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSElIZ0J1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iNzYwOCIgeT0iNDk0MCIgd2lkdGg9IjQ1MzciIGhlaWdodD0iMTY3NiIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISUhnSU9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERTQ3OEUwMDBEIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJSGdJLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9ISUhnSk9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISUhnSmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISUhnSnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISUhnSi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJSGdLT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJQYWNrYWdlQ29udGVudHMiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSElIZ0tlZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIgY29sbGFwc2VkPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hJSGdJZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iTm9uZSIgc2hvd0xpc3RWaXNpYmlsaXR5PSJOb25lIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hJSGdJdWZYRWR1cUhvT0piVVJaUnciIHg9Ijc2MDgiIHk9IjIyMTkiIHdpZHRoPSI0MTE0IiBoZWlnaHQ9IjE2NzYiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElIZ0t1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREU0OUVBMDFFMiI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISUhnTGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSElIZ0x1ZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElIZ0wtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElIZ01PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElIZ01lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISUhnTXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iUGFja2FnZUNvbnRlbnRzIj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hJSGdNLWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiIGNvbGxhcHNlZD0idHJ1ZSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9ISUhnSy1mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9Ik5vbmUiIHNob3dMaXN0VmlzaWJpbGl0eT0iTm9uZSIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISUhnTE9mWEVkdXFIb09KYlVSWlJ3IiB4PSIxMjY4IiB5PSI2OTc0IiB3aWR0aD0iNDcyMCIgaGVpZ2h0PSIxNjc2Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJSGdULWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MkRERTI4MDAyNUQiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElIZ1V1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hJSGdVLWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJSGdWT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJSGdWZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJSGdWdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElIZ1YtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlBhY2thZ2VDb250ZW50cyI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISUhnV09mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIiBjb2xsYXBzZWQ9InRydWUiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSElIZ1VPZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJOb25lIiBzaG93TGlzdFZpc2liaWxpdHk9Ik5vbmUiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSElIZ1VlZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTQzNzgiIHk9IjgxNzgiIHdpZHRoPSIzODQxIiBoZWlnaHQ9IjE2ODQiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfeDRHdVFPeGRFZHVIamUzcFBhaE40QSIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRERGODY5MDEyRSI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il94NEd1US14ZEVkdUhqZTNwUGFoTjRBIiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfeDRHdVJPeGRFZHVIamUzcFBhaE40QSIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfeDRHdVJleGRFZHVIamUzcFBhaE40QSIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfeDRHdVJ1eGRFZHVIamUzcFBhaE40QSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfeDRHdVIteGRFZHVIamUzcFBhaE40QSIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il94NFA0TU94ZEVkdUhqZTNwUGFoTjRBIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iUGFja2FnZUNvbnRlbnRzIj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX3g0UDRNZXhkRWR1SGplM3BQYWhONEEiIGNhbm9uaWNhbD0iZmFsc2UiIGNvbGxhcHNlZD0idHJ1ZSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il94NEd1UWV4ZEVkdUhqZTNwUGFoTjRBIiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93UGFyZW50PSJOYW1lIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il94NEd1UXV4ZEVkdUhqZTNwUGFoTjRBIiB4PSI5NjIzIiB5PSIxNzQ4NyIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9aQ1RCa094NUVkdTUtdlZqbGZWc2ZRIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDExOUE2MkIwMzZGIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX1pDVEJrLXg1RWR1NS12VmpsZlZzZlEiIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9aQ1RCbE94NUVkdTUtdlZqbGZWc2ZRIiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9aQ2N5a094NUVkdTUtdlZqbGZWc2ZRIiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9aQ2N5a2V4NUVkdTUtdlZqbGZWc2ZRIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9aQ2N5a3V4NUVkdTUtdlZqbGZWc2ZRIiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX1pDY3lrLXg1RWR1NS12VmpsZlZzZlEiIHZpc2libGU9ImZhbHNlIiB0eXBlPSJQYWNrYWdlQ29udGVudHMiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfWkNjeWxPeDVFZHU1LXZWamxmVnNmUSIgY2Fub25pY2FsPSJmYWxzZSIgY29sbGFwc2VkPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX1pDVEJrZXg1RWR1NS12VmpsZlZzZlEiIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dQYXJlbnQ9Ik5hbWUiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX1pDVEJrdXg1RWR1NS12VmpsZlZzZlEiIHg9IjE0MjY1IiB5PSIxNzQ4NyIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTERpYWdyYW1TdHlsZSIgeG1pOmlkPSJfR3ZQRjFPZlhFZHVxSG9PSmJVUlpSdyIgZGVzY3JpcHRpb249IlRoZSBNZXRob2QgQ29yZSBwYWNrYWdlIGRlZmluZXMgdGhlIGZ1bmRhbWVudGFsIGNvbmNlcHRzIGZvciBkZXNjcmliaW5nIGFuZCBvcmdhbml6aW5nIG1ldGhvZCBjb250ZW50LiAgVGhlIHBhY2thZ2UgaXRzZWxmIHByb3ZpZGVzIGxheWVycyBhcyBkZXBpY3RlZCBpbiBkaWFncmFtIHRoYXQgZ3JhZHVhbGx5IGV4dGVuZCB0aGUgY29yZSBjb25jZXB0cyB3aXRoIG1vcmUgYW5kIG1vcmUgY2FwYWJpbGl0aWVzIChpLmUuIHN1cHBvcnRpbmcgY2xhc3NlcywgYWRkaXRpb25hbCBhdHRyaWJ1dGVzLCBhbmQgcmVsYXRpb25zaGlwcykuIFRoZSBCYXNpYyBFbGVtZW50cyBwYWNrYWdlIGRlZmluZXMgdGhlIHJvb3QgZWxlbWVudCBmcm9tIHdoaWNoIGFsbCBjbGFzc2VzIGluIHRoaXMgc3BlY2lmaWNhdGlvbiBoYXZlIGJlZW4gZGVyaXZlZC4gIENvcmUgQ29udGVudCBFbGVtZW50cyBkZWZpbmVzIHRoZSBjb3JlIGVsZW1lbnRzIG9mIGV2ZXJ5IG1ldGhvZCBzdWNoIGFzIHJvbGVzLCB0YXNrcywgYW5kIHdvcmsgcHJvZHVjdHMuICBUaGUgbmV4dCBsYXllciBhZGRzIGRpZmZlcmVudCB0eXBlcyBvZiBndWlkYW5jZSB0byB0aGUgY29yZSBlbGVtZW50cyBzdWNoIGFzIHdvcmsgcHJvZHVjdCB0ZW0tcGxhdGVzLCBndWlkZWxpbmVzLCBvciBjaGVja2xpc3RzLiAgVGhlIENhdGVnb3JpZXMgcGFja2FnZSBwcm92aWRlcyBwcmUtZGVmaW5lZCBhcyB3ZWxsIGFzIHVzZXItZGVmaW5hYmxlIGNhdGVnb3JpemF0aW9ucyBvZiBjb3JlIGNvbnRlbnQgZWxlbWVudHMgYXMgd2VsbCBhcyBndWlkYW5jZSB0eXBlcy4gIFRoZSBNZXRob2QgQ29udGVudCBEZXNjcmlwdGlvbnMgYWRkcyBwcm9wZXJ0aWVzIGZvciBkZXRhaWxlZCBjb250ZW50IGRlc2NyaXB0aW9ucyB0byB0aGUgZWxlbWVudHMgZGVmaW5lZCBiZWxvdy4gIFRoZXNlIGRlc2NyaXB0aW9ucyBhcmUgb3B0aW9uYWwgYWRkaXRpb25zLCB3aGljaCBhbiBpbXBsZW1lbnRlciBvZiB0aGlzIHNwZWNpZmljYXRpb24gaXMgZnJlZSB0byBjaG9vc2UgZnJvbS4gIEZpbmFsbHksIE1ldGhvZCBQYWNrYWdlIGRlLWZpbmVzIGhvdyB0aGUgZWxlbWVudHMgZGVmaW5lZCBpbiBhbGwgZm91ciBsYXllcnMgYmVsb3cgY2FuIGJlIG9yZ2FuaXplZCBpbiBwYWNrYWdlIGhpZXJhcmNoaWVzLiIvPgotICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPgotICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX1VSOVdzT29XRWR1T0JQUUEyaEtxVVEiIGVsZW1lbnQ9Il9VUnpsc09vV0VkdU9CUFFBMmhLcVVRIiBzb3VyY2U9Il9ISUhnVC1mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9ISUhmOE9mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX1VSOVdzLW9XRWR1T0JQUUEyaEtxVVEiIHR5cGU9IktpbmRMYWJlbCI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX1VSOVd0ZW9XRWR1T0JQUUEyaEtxVVEiIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfVVI5V3Qtb1dFZHVPQlBRQTJoS3FVUSIgdHlwZT0iS2luZCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9VUjlXdHVvV0VkdU9CUFFBMmhLcVVRIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfVVI5V3RPb1dFZHVPQlBRQTJoS3FVUSIgeD0iLTc3NiIgeT0iLTEwNjUiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX1VSOVdzZW9XRWR1T0JQUUEyaEtxVVEiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfVVI5V3N1b1dFZHVPQlBRQTJoS3FVUSIgcG9pbnRzPSJbLTM0LCAzMiwgMTQ5LCAtOTBdJFstMTA5LCAxMTksIDc0LCAtM10iLz4KLSAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfTjE5bGNleE1FZHVPTnJNUmdtejQ4QSIgZWxlbWVudD0iX04xOWxjT3hNRWR1T05yTVJnbXo0OEEiIHNvdXJjZT0iX0hJSGYtdWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hJSGY4T2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfTjE5bGRPeE1FZHVPTnJNUmdtejQ4QSIgdHlwZT0iS2luZExhYmVsIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfTjE5bGR1eE1FZHVPTnJNUmdtejQ4QSIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9OMTlsZU94TUVkdU9Ock1SZ216NDhBIiB0eXBlPSJLaW5kIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX04xOWxkLXhNRWR1T05yTVJnbXo0OEEiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9OMTlsZGV4TUVkdU9Ock1SZ216NDhBIiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9OMTlsY3V4TUVkdU9Ock1SZ216NDhBIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX04xOWxjLXhNRWR1T05yTVJnbXo0OEEiIHBvaW50cz0iWzIsIDMzLCAwLCAtODVdJFsyLCAxNTAsIDAsIDMyXSIvPgotICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9Dc0VRSU94ZEVkdUhqZTNwUGFoTjRBIiBlbGVtZW50PSJfQ3I2ZklPeGRFZHVIamUzcFBhaE40QSIgc291cmNlPSJfSElIZjhPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSElIZjV1ZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9Dc0VRSS14ZEVkdUhqZTNwUGFoTjRBIiB0eXBlPSJLaW5kTGFiZWwiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9Dc0VRSmV4ZEVkdUhqZTNwUGFoTjRBIiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0NzRVFKLXhkRWR1SGplM3BQYWhONEEiIHR5cGU9IktpbmQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfQ3NFUUp1eGRFZHVIamUzcFBhaE40QSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0NzRVFKT3hkRWR1SGplM3BQYWhONEEiIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0NzRVFJZXhkRWR1SGplM3BQYWhONEEiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfQ3NFUUl1eGRFZHVIamUzcFBhaE40QSIgcG9pbnRzPSJbLTE4NSwgODczLCAtMjE0MywgLTU0MjRdJFstMTg1LCAzNjUxLCAtMjE0MywgLTI2NDZdJFsxMjQ0LCA1NDI0LCAtNzE0LCAtODczXSIvPgotICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfaFYxbEVPeDVFZHU1LXZWamxmVnNmUSIgaWQ9IigwLjQ2MTY0MjYsMC43NzU2NTYzNCkiLz4KLSAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfZGR0dHNPeGRFZHVIamUzcFBhaE40QSIgZWxlbWVudD0iX2RkajhzT3hkRWR1SGplM3BQYWhONEEiIHNvdXJjZT0iX0hJSGdCT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hJSGYtdWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfZGR0dHMteGRFZHVIamUzcFBhaE40QSIgdHlwZT0iS2luZExhYmVsIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfZGR0dHRleGRFZHVIamUzcFBhaE40QSIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9kZHR0dC14ZEVkdUhqZTNwUGFoTjRBIiB0eXBlPSJLaW5kIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2RkdHR0dXhkRWR1SGplM3BQYWhONEEiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9kZHR0dE94ZEVkdUhqZTNwUGFoTjRBIiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9kZHR0c2V4ZEVkdUhqZTNwUGFoTjRBIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX2RkdHRzdXhkRWR1SGplM3BQYWhONEEiIHBvaW50cz0iWzIsIDMyLCAyLCAtOTJdJFsxNiwgMTU3LCAxNiwgMzNdIi8+Ci0gICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX2VhVzhJZXhkRWR1SGplM3BQYWhONEEiIGVsZW1lbnQ9Il9lYVc4SU94ZEVkdUhqZTNwUGFoTjRBIiBzb3VyY2U9Il9ISUhnQk9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9ISUhmOE9mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2VhVzhKT3hkRWR1SGplM3BQYWhONEEiIHR5cGU9IktpbmRMYWJlbCI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2VhVzhKdXhkRWR1SGplM3BQYWhONEEiIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfZWFXOEtPeGRFZHVIamUzcFBhaE40QSIgdHlwZT0iS2luZCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9lYVc4Si14ZEVkdUhqZTNwUGFoTjRBIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfZWFXOEpleGRFZHVIamUzcFBhaE40QSIgeD0iLTE0ODgiIHk9Ii04MTEiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX2VhVzhJdXhkRWR1SGplM3BQYWhONEEiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfZWFXOEkteGRFZHVIamUzcFBhaE40QSIgcG9pbnRzPSJbMTUzNSwgODQ2LCAtMTY0MCwgLTU2MTBdJFszNDEzLCAxODc4LCAyMzgsIC00NTc4XSRbMzQxMywgNTkwMCwgMjM4LCAtNTU2XSIvPgotICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9WUFIzTU94ZUVkdUhqZTNwUGFoTjRBIiBlbGVtZW50PSJfVlBJR01PeGVFZHVIamUzcFBhaE40QSIgc291cmNlPSJfSElIZ0t1ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSElIZi11ZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9WUFIzTS14ZUVkdUhqZTNwUGFoTjRBIiB0eXBlPSJLaW5kTGFiZWwiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9WUFIzTmV4ZUVkdUhqZTNwUGFoTjRBIiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX1ZQUjNOLXhlRWR1SGplM3BQYWhONEEiIHR5cGU9IktpbmQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfVlBSM051eGVFZHVIamUzcFBhaE40QSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX1ZQUjNOT3hlRWR1SGplM3BQYWhONEEiIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX1ZQUjNNZXhlRWR1SGplM3BQYWhONEEiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfVlBSM011eGVFZHVIamUzcFBhaE40QSIgcG9pbnRzPSJbLTkwLCAxMSwgMjM5LCAtMV0kWy0yNDUsIDQzLCA4NCwgMzFdIi8+Ci0gICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9XdGRGWU94ZUVkdUhqZTNwUGFoTjRBIiBpZD0iKDAuNzcxNjU1MjYsMC43NDM0MzY3NSkiLz4KLSAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfUktFRFlleGdFZHVIamUzcFBhaE40QSIgZWxlbWVudD0iX1JLRURZT3hnRWR1SGplM3BQYWhONEEiIHNvdXJjZT0iX0hJSGdJT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hJSGdLdWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfUktFRFpPeGdFZHVIamUzcFBhaE40QSIgdHlwZT0iS2luZExhYmVsIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfUktFRFp1eGdFZHVIamUzcFBhaE40QSIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9SS0VEYU94Z0VkdUhqZTNwUGFoTjRBIiB0eXBlPSJLaW5kIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX1JLRURaLXhnRWR1SGplM3BQYWhONEEiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9SS0VEWmV4Z0VkdUhqZTNwUGFoTjRBIiB4PSItNDgxIiB5PSItNDg3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9SS0VEWXV4Z0VkdUhqZTNwUGFoTjRBIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX1JLRURZLXhnRWR1SGplM3BQYWhONEEiIHBvaW50cz0iWy0yMDkwLCA0NzYsIDM5NDMsIC00Mjg3XSRbLTYwNTksIDE0MDMsIC0yNiwgLTMzNjBdJFstNjA1OSwgNDIwNywgLTI2LCAtNTU2XSIvPgotICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9ScUdPVWV4Z0VkdUhqZTNwUGFoTjRBIiBlbGVtZW50PSJfUnFHT1VPeGdFZHVIamUzcFBhaE40QSIgc291cmNlPSJfSElIZ0lPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSElIZ0JPZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ScUdPVk94Z0VkdUhqZTNwUGFoTjRBIiB0eXBlPSJLaW5kTGFiZWwiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ScUdPVnV4Z0VkdUhqZTNwUGFoTjRBIiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX1JxR09XT3hnRWR1SGplM3BQYWhONEEiIHR5cGU9IktpbmQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfUnFHT1YteGdFZHVIamUzcFBhaE40QSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX1JxR09WZXhnRWR1SGplM3BQYWhONEEiIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX1JxR09VdXhnRWR1SGplM3BQYWhONEEiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfUnFHT1UteGdFZHVIamUzcFBhaE40QSIgcG9pbnRzPSJbNiwgMzMsIC0yLCAtNzBdJFs5NSwgMTEwLCA4NywgN10iLz4KLSAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfU0xWVElleGdFZHVIamUzcFBhaE40QSIgZWxlbWVudD0iX1NMVlRJT3hnRWR1SGplM3BQYWhONEEiIHNvdXJjZT0iX0hJSGdJT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hJSGdULWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfU0xWVEpPeGdFZHVIamUzcFBhaE40QSIgdHlwZT0iS2luZExhYmVsIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfU0xWVEp1eGdFZHVIamUzcFBhaE40QSIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9TTFZUS094Z0VkdUhqZTNwUGFoTjRBIiB0eXBlPSJLaW5kIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX1NMVlRKLXhnRWR1SGplM3BQYWhONEEiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9TTFZUSmV4Z0VkdUhqZTNwUGFoTjRBIiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9TTFZUSXV4Z0VkdUhqZTNwUGFoTjRBIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX1NMVlRJLXhnRWR1SGplM3BQYWhONEEiIHBvaW50cz0iWzE5MzEsIDg3MywgLTQ3MTAsIC01MTA3XSRbNjYxNCwgMjk5MCwgLTI3LCAtMjk5MF0kWzY2MTQsIDU0MjQsIC0yNywgLTU1Nl0iLz4KLSAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfbm95VE1leGdFZHVIamUzcFBhaE40QSIgZWxlbWVudD0iX25veVRNT3hnRWR1SGplM3BQYWhONEEiIHNvdXJjZT0iX0hJSGY1dWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX3g0R3VRT3hkRWR1SGplM3BQYWhONEEiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfbm95VE5PeGdFZHVIamUzcFBhaE40QSIgdHlwZT0iS2luZExhYmVsIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfbm95VE51eGdFZHVIamUzcFBhaE40QSIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ub3lUT094Z0VkdUhqZTNwUGFoTjRBIiB0eXBlPSJLaW5kIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX25veVROLXhnRWR1SGplM3BQYWhONEEiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ub3lUTmV4Z0VkdUhqZTNwUGFoTjRBIiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9ub3lUTXV4Z0VkdUhqZTNwUGFoTjRBIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX25veVRNLXhnRWR1SGplM3BQYWhONEEiIHBvaW50cz0iWy03LCAzMywgLTYsIC03MF0kWy03LCAxMzEsIC02LCAyOF0iLz4KLSAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfYzYybmdPeDVFZHU1LXZWamxmVnNmUSIgZWxlbWVudD0iX2M2dGRrT3g1RWR1NS12VmpsZlZzZlEiIHNvdXJjZT0iX0hJSGY1dWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX1pDVEJrT3g1RWR1NS12VmpsZlZzZlEiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfYzYybmcteDVFZHU1LXZWamxmVnNmUSIgdHlwZT0iS2luZExhYmVsIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfYzYybmhleDVFZHU1LXZWamxmVnNmUSIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9jNjJuaC14NUVkdTUtdlZqbGZWc2ZRIiB0eXBlPSJLaW5kIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2M2Mm5odXg1RWR1NS12VmpsZlZzZlEiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9jNjJuaE94NUVkdTUtdlZqbGZWc2ZRIiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9jNjJuZ2V4NUVkdTUtdlZqbGZWc2ZRIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX2M2Mm5ndXg1RWR1NS12VmpsZlZzZlEiIHBvaW50cz0iWzQxLCAzMywgLTEzNCwgLTc0XSRbOTEsIDEwOCwgLTg0LCAxXSIvPgotICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICA8L2NvbnRlbnRzPgotICAgICAgICAgIDxjb250ZW50cyB4bWk6dHlwZT0ibm90YXRpb246RGlhZ3JhbSIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDFFMENEMzcwMUVEIiB0eXBlPSJDbGFzcyIgbmFtZT0iVGF4b25vbXkiPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJUlE2ZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxN0YiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElSUTdPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hJUlE3ZWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSI0NTIxIiBoZWlnaHQ9IjEwODMiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJUlE3dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJUlE3LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJUlE4T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElSUThlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSElSUTh1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElSUTgtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSElSUTlPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElSUTllZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSElSUTl1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElSUTktZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hJUlEtT2ZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSElSUTZ1ZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1BhcmVudD0iTmFtZSIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSElSUTYtZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTIwNTAiIHk9IjExMDE4Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJUlEtZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxODUiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElSUV9PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hJUlFfZWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIzOTk2IiBoZWlnaHQ9IjEwODMiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJUlFfdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJUlFfLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJUlJBT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElSUkFlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSElSUkF1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElSUkEtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSElSUkJPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElSUkJlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSElSUkJ1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElSUkItZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hJUlJDT2ZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSElSUS11ZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1BhcmVudD0iTmFtZSIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSElSUS0tZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTY3NzkiIHk9IjExMDE4Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJUlJDZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyREEiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElSUkRPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hJUlJEZWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIzNzA4IiBoZWlnaHQ9IjExMzQiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJUlJEdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJUlJELWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJUlJFT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElSUkVlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSElSUkV1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElSUkUtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSElSUkZPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElSUkZlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSElSUkZ1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElSUkYtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hJUlJHT2ZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSElSUkN1ZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1BhcmVudD0iTmFtZSIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSElSUkMtZlhFZHVxSG9PSmJVUlpSdyIgeD0iNzMwOCIgeT0iODM0OCIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISVJSR2VmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMThGIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJUlJIT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9ISVJSSGVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMzcwOCIgaGVpZ2h0PSIxMDgzIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISVJSSHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISVJSSC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISVJSSU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJUlJJZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hJUlJJdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJUlJJLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hJUlJKT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJUlJKZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hJUlJKdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJUlJKLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISVJSS09mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hJUlJHdWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dQYXJlbnQ9Ik5hbWUiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hJUlJHLWZYRWR1cUhvT0piVVJaUnciIHg9IjIxNTE2IiB5PSIxMTAxOCIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISVJSS2VmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjk2Ij4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJUlJMT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9ISVJSTGVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iNDAxMyIgaGVpZ2h0PSIxMTE3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISVJSTHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISVJSTC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISVJSTU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJUlJNZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hJUlJNdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJUlJNLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hJUlJOT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJUlJOZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hJUlJOdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJUlJOLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISVJST09mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hJUlJLdWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dQYXJlbnQ9Ik5hbWUiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hJUlJLLWZYRWR1cUhvT0piVVJaUnciIHg9IjEyMDQyIiB5PSI4MzU2Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJUlJPZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyQkMiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElSUlBPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hJUlJQZWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSI0NDcwIiBoZWlnaHQ9IjExMzQiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJUlJQdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJUlJQLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJUlJRT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElSUlFlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSElSUlF1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElSUlEtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSElSUlJPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElSUlJlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSElSUlJ1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElSUlItZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hJUlJTT2ZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSElSUk91ZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1BhcmVudD0iTmFtZSIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSElSUk8tZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTY3NjYiIHk9IjgzNDgiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElhYTYtZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI5RSI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWFhN3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSElhYTctZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjQxODIiIGhlaWdodD0iMTExNyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElhYThPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElhYThlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElhYTh1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWFhOC1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISWFhOU9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWFhOWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISWFhOXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWFhOS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISWFhLU9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWFhLWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSElhYS11ZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9ISWFhN09mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93UGFyZW50PSJOYW1lIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISWFhN2VmWEVkdXFIb09KYlVSWlJ3IiB4PSIyMTUwNyIgeT0iODM1NiIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWFiUGVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMTJCIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJYWJRT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9ISWFiUWVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMzA2NCIgaGVpZ2h0PSIxMDgzIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWFiUXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWFiUS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWFiUk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJYWJSZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hJYWJSdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJYWJSLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hJYWJTT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJYWJTZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hJYWJTdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJYWJTLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISWFiVE9mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hJYWJQdWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dQYXJlbnQ9Ik5hbWUiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hJYWJQLWZYRWR1cUhvT0piVVJaUnciIHg9Ijg1MDUiIHk9IjU2NzEiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElhYlp1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E4NTdCMDMzMyI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWFiYWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSElhYmF1ZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjI3OTQiIGhlaWdodD0iMTA0OSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElhYmEtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElhYmJPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElhYmJlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWFiYnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISWFiYi1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWFiY09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISWFiY2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWFiY3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISWFiYy1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWFiZE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSElhYmRlZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9ISWFiWi1mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93UGFyZW50PSJOYW1lIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISWFiYU9mWEVkdXFIb09KYlVSWlJ3IiB4PSIxMDIwIiB5PSIzMDEwIi8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJYWJkdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyODAiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElhYmVlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hJYWJldWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIzMTE1IiBoZWlnaHQ9IjExMzQiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJYWJlLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJYWJmT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJYWJmZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElhYmZ1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSElhYmYtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElhYmdPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSElhYmdlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElhYmd1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSElhYmctZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElhYmhPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hJYWJoZWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSElhYmQtZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1BhcmVudD0iTmFtZSIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSElhYmVPZlhFZHVxSG9PSmJVUlpSdyIgeD0iOTE5MyIgeT0iMzE3Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJa0wwLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyNkMiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElrTDF1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hJa0wxLWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIyODc4IiBoZWlnaHQ9IjEwNDkiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJa0wyT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJa0wyZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJa0wydWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElrTDItZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSElrTDNPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElrTDNlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSElrTDN1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElrTDMtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSElrTDRPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElrTDRlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hJa0w0dWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSElrTDFPZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1BhcmVudD0iTmFtZSIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSElrTDFlZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTI2NjYiIHk9IjU2NjEiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElrTUVPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMUU0Q0YzMDFBRSI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWtNRS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSElrTUZPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjM0MzciIGhlaWdodD0iMTExNyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElrTUZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElrTUZ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElrTUYtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWtNR09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISWtNR2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWtNR3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISWtNRy1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWtNSE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISWtNSGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWtNSHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSElrTUgtZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9ISWtNRWVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93UGFyZW50PSJOYW1lIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISWtNRXVmWEVkdXFIb09KYlVSWlJ3IiB4PSI0NzYzIiB5PSIzMDAzIi8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJa01LZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxM0YiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElrTUxPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hJa01MZWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIzMDE0IiBoZWlnaHQ9IjEwNDkiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJa01MdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJa01MLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJa01NT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElrTU1lZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSElrTU11ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElrTU0tZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSElrTU5PZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElrTU5lZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSElrTU51ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElrTU4tZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hJa01PT2ZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSElrTUt1ZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1BhcmVudD0iTmFtZSIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSElrTUstZlhFZHVxSG9PSmJVUlpSdyIgeD0iODUwNCIgeT0iMzAxMCIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWtNUy1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI5NEVCOTAwMEZDIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJa01UdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9ISWtNVC1mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMzU4OSIgaGVpZ2h0PSI5OTAiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJa01VT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJa01VZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJa01VdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElrTVUtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSElrTVZPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElrTVZlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSElrTVZ1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElrTVYtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSElrTVdPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElrTVdlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hJa01XdWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSElrTVRPZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1BhcmVudD0iTmFtZSIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSElrTVRlZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTI0NDMiIHk9IjI5OTEiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElrTVpPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREU0QTk3MDEyMyI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWtNWi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSElrTWFPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElrTWFlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElrTWF1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElrTWEtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWtNYk9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISWtNYmVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWtNYnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISWtNYi1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWtNY09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISWtNY2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWtNY3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSElrTWMtZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9ISWtNWmVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93UGFyZW50PSJOYW1lIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISWtNWnVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxNjcxMCIgeT0iMzAwOSIgd2lkdGg9IjQ0MTciIGhlaWdodD0iOTc5Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2VITzA0T29sRWR1VkE3dnQ1cWJJSlEiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyNDQiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfZUhPMDQtb2xFZHVWQTd2dDVxYklKUSIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX2VITzA1T29sRWR1VkE3dnQ1cWJJSlEiIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2VITzA1ZW9sRWR1VkE3dnQ1cWJJSlEiIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2VITzA1dW9sRWR1VkE3dnQ1cWJJSlEiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2VITzA1LW9sRWR1VkE3dnQ1cWJJSlEiIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfZUhPMDZPb2xFZHVWQTd2dDVxYklKUSIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfZUhPMDZlb2xFZHVWQTd2dDVxYklKUSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfZUhPMDZ1b2xFZHVWQTd2dDVxYklKUSIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfZUhPMDYtb2xFZHVWQTd2dDVxYklKUSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfZUhPMDdPb2xFZHVWQTd2dDVxYklKUSIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfZUhPMDdlb2xFZHVWQTd2dDVxYklKUSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfZUhPMDd1b2xFZHVWQTd2dDVxYklKUSIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX2VITzA3LW9sRWR1VkE3dnQ1cWJJSlEiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfZUhPMDRlb2xFZHVWQTd2dDVxYklKUSIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1BhcmVudD0iTmFtZSIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfZUhPMDR1b2xFZHVWQTd2dDVxYklKUSIgeD0iMzMxOSIgeT0iODM1OCIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTERpYWdyYW1TdHlsZSIgeG1pOmlkPSJfR3ZQRjF1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPgotICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hJYWEwT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAwMEYiIHNvdXJjZT0iX0hJUlE2ZWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hJUlJPZWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElhYTAtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElhYTFlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWFhMXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hJYWExT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hJYWEwZWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlRyZWUiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSElhYTB1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTI2LCAtNTAzLCAtNDc4OSwgMjE2OV0kWzQ3NTUsIC0yMTk2LCAtOCwgNDc2XSIvPgotICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSElhYTEtZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9ISWFhMk9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSElhYTJlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDAyQyIgc291cmNlPSJfSElSUS1lZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSElSUk9lZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWFhM09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWFhM3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJYWEzLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSElhYTNlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSElhYTJ1ZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iVHJlZSIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9ISWFhMi1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMjcsIC01MDMsIC0yNywgMjE2OV0kWy04LCAtMjE5NiwgLTgsIDQ3Nl0iLz4KLSAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hJYWE0T2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSElhYTRlZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hJYWE0dWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAwNEEiIHNvdXJjZT0iX0hJUlJHZWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hJUlJPZWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElhYTVlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElhYTUtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWFhNk9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hJYWE1dWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hJYWE0LWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlRyZWUiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSElhYTVPZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTI2LCAtNTAzLCA0NzEwLCAyMTY5XSRbLTQ3NDQsIC0yMTk2LCAtOCwgNDc2XSIvPgotICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSElhYTZlZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9ISWFhNnVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSElhYmh1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E4NUFFMDJDRSIgc291cmNlPSJfSElhYlp1ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSElhYmR1ZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWFiaWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWFiaS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJa0wwT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSElhYml1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSElhYmgtZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iVHJlZSIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9ISWFiaU9mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMjcsIC01MDIsIC04MTQ5LCAyMTcwXSRbODEzNiwgLTIxOTYsIDE0LCA0NzZdIi8+Ci0gICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9ISWtMMGVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hJa0wwdWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9ISWtMNC1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTMwMTFEIiBzb3VyY2U9Il9ISVJSQ2VmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9ISWtMMC1mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJa0w1dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJa0w2T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElrTDZlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISWtMNS1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9ISWtMNU9mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJUcmVlIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hJa0w1ZWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0yNywgLTUwMywgLTcxMTgsIDIxNjldJFs3MDk3LCAtMjE5NiwgNiwgNDc2XSIvPgotICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSElrTDZ1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9ISWtMNi1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSElrTDdPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDMwNyIgc291cmNlPSJfSElSUktlZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSElrTDAtZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWtMNy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWtMOGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJa0w4dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSElrTDhPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSElrTDdlZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iVHJlZSIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9ISWtMN3VmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMjcsIC01MDMsIC0yMzgyLCAyMTY5XSRbMjM2MSwgLTIxOTYsIDYsIDQ3Nl0iLz4KLSAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hJa0w4LWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSElrTDlPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hJa0w5ZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAzRDkiIHNvdXJjZT0iX0hJUlJPZWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hJa0wwLWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElrTC1PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElrTC11ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWtMLS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hJa0wtZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hJa0w5dWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlRyZWUiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSElrTDktZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTI3LCAtNTAzLCAyMzU0LCAyMTY5XSRbLTIzNzUsIC0yMTk2LCA2LCA0NzZdIi8+Ci0gICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9ISWtMX09mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hJa0xfZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9ISWtMX3VmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMzJGIiBzb3VyY2U9Il9ISWFhNi1mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9ISWtMMC1mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJa01BZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJa01BLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElrTUJPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISWtNQXVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9ISWtMXy1mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJUcmVlIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hJa01BT2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0yNiwgLTUwMywgNzA5MSwgMjE2OV0kWy03MTExLCAtMjE5NiwgNiwgNDc2XSIvPgotICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSElrTUJlZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9ISWtNQnVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSElrTUlPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyNzk1NjI0MDE3RSIgc291cmNlPSJfSElrTUVPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSElhYmR1ZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWtNSS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWtNSmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJa01KdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSElrTUpPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSElrTUllZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iVHJlZSIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9ISWtNSXVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMjYsIC01MDIsIC00NDE4LCAyMTcwXSRbNDQwNiwgLTIxOTYsIDE0LCA0NzZdIi8+Ci0gICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9ISWtNSi1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hJa01LT2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9ISWtNT2VmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwM0FGIiBzb3VyY2U9Il9ISWFiUGVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9ISWtNS2VmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJa01QT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJa01QdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElrTVAtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISWtNUGVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9ISWtNT3VmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9ISWtNTy1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMjM4LCAtNTAzLCAtMjM4LCAyMTcwXSRbLTIzOCwgLTIxOTcsIC0yMzgsIDQ3Nl0iLz4KLSAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hJa01RT2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSElrTVFlZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hJa01RdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUZBRDVGODAzOEUiIHNvdXJjZT0iX0hJa01LZWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hJYWJkdWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElrTVJlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElrTVItZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWtNU09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hJa01SdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hJa01RLWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlRyZWUiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSElrTVJPZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTI3LCAtNTAyLCAtNTgyLCAyMTcwXSRbNTY5LCAtMjE5NiwgMTQsIDQ3Nl0iLz4KLSAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hJa01TZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSElrTVN1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hJa01XLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjk0RUM0QTAzMDYiIHNvdXJjZT0iX0hJa0wwLWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hJa01TLWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElrTVh1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElrTVlPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWtNWWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hJa01YLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hJa01YT2ZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hJa01YZWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0xMzMsIC01MDMsIC0xMzMsIDIxNzBdJFstMTMzLCAtMjE5NywgLTEzMywgNDc2XSIvPgotICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSElrTVl1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9ISWtNWS1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSElrTWRPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyOTRFQzJCMDFDQSIgc291cmNlPSJfSElrTVMtZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSElhYmR1ZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWtNZC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWtNZWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJa01ldWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSElrTWVPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSElrTWRlZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iVHJlZSIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9ISWtNZHVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMjcsIC01MDIsIDM1MTksIDIxNzBdJFstMzUzMiwgLTIxOTYsIDE0LCA0NzZdIi8+Ci0gICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9ISWtNZS1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hJa01mT2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9ISWtNZmVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIwMDU4M0IwMUU2IiBzb3VyY2U9Il9ISWtNWk9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9ISWFiZHVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJa01nT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJa01ndWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElrTWctZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISWtNZ2VmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9ISWtNZnVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJUcmVlIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hJa01mLWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0yNywgLTUwMiwgODE0OSwgMjE3MF0kWy04MTYyLCAtMjE5NiwgMTQsIDQ3Nl0iLz4KLSAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hJa01oT2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSElrTWhlZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX2VIWWw0T29sRWR1VkE3dnQ1cWJJSlEiIGVsZW1lbnQ9Il9EM2I4b09va0VkdVZBN3Z0NXFiSUpRIiBzb3VyY2U9Il9lSE8wNE9vbEVkdVZBN3Z0NXFiSUpRIiB0YXJnZXQ9Il9ISWtMMC1mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2VIWWw0LW9sRWR1VkE3dnQ1cWJJSlEiIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2VIWWw1ZW9sRWR1VkE3dnQ1cWJJSlEiIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfZUhZbDV1b2xFZHVWQTd2dDVxYklKUSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX2VIWWw1T29sRWR1VkE3dnQ1cWJJSlEiIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX2VIWWw0ZW9sRWR1VkE3dnQ1cWJJSlEiIHJvdXRpbmc9IlRyZWUiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfZUhZbDR1b2xFZHVWQTd2dDVxYklKUSIgcG9pbnRzPSJbMTc0NiwgLTE1OSwgLTg2NzksIDg0Nl0kWzg3ODQsIC04NDcsIC0xNjQxLCAxNThdIi8+Ci0gICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgIDwvY29udGVudHM+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dwSDJ5T2ZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxN0IiPgotICAgICAgICAgIDxib2R5PjAxPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOlBhY2thZ2UiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDE5MCIgbmFtZT0iR3VpZGFuY2VUeXBlcyI+Ci0gICAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il9HcVVKdGVmWEVkdXFIb09KYlVSWlJ3IiBzb3VyY2U9InVtbDIuZGlhZ3JhbXMiIHJlZmVyZW5jZXM9Il8zQURDN0I3NDAyMkQ0MEY0OUZGMzAwMEUiPgotICAgICAgICAgICAgPGNvbnRlbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpEaWFncmFtIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEY0OUZGMzAwMEUiIHR5cGU9IkNsYXNzIiBuYW1lPSJTdHJ1Y3R1cmUiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEIzRzRPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDFFMCI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDQVEwT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hDQVEwZWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0FRMHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDQVEwLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENBUTFPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDQVExZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENBUTF1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDQVExLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENBUTJPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDQVEyZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENBUTJ1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDQVEyLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDQVEzT2ZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hCM0c0ZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEIzRzR1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTgwMjUiIHk9IjE4MzgxIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0FRM2VmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMUYzIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENBUTRPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSENBUTRlZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDQVE0dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENBUTQtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0FRNU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENBUTVlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ0FRNXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENBUTUtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ0FRNk9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENBUTZlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ0FRNnVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENBUTYtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENBUTdPZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSENBUTN1ZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9Ik5vbmUiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IQ0FRMy1mWEVkdXFIb09KYlVSWlJ3IiB4PSIxMDQ2MSIgeT0iMjMxNDEiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDQVJIZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxQzEiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0FSSU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IQ0FSSWVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENBUkl1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0FSSS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDQVJKT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0FSSmVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDQVJKdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0FSSi1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDQVJLT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0FSS2VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDQVJLdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0FSSy1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ0FSTE9mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IQ0FSSHVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hDQVJILWZYRWR1cUhvT0piVVJaUnciIHg9IjE0NDUyIiB5PSIxOTc3OCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENBUkxlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDE5OSI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDQVJNT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hDQVJNZWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0FSTXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDQVJNLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENBUk5PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDQVJOZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENBUk51ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDQVJOLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENBUk9PZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDQVJPZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENBUk91ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDQVJPLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDQVJQT2ZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hDQVJMdWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSENBUkwtZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTQ5NTIiIHk9IjE3NjY5Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0FSUnVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMUE0Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENBUlNlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSENBUlN1ZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDQVJTLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENBUlRPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0FSVGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENBUlR1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ0FSVC1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENBUlVPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ0FSVWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENBUlV1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ0FSVS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENBUlZPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENBUlZlZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSENBUlItZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IQ0FSU09mWEVkdXFIb09KYlVSWlJ3IiB4PSIxNDU4OCIgeT0iMTU4NDEiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDQVJWdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxOUEiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0FSV2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IQ0FSV3VmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENBUlctZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0FSWE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDQVJYZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0FSWHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDQVJYLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0FSWU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDQVJZZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0FSWXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDQVJZLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0FSWk9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ0FSWmVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IQ0FSVi1mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hDQVJXT2ZYRWR1cUhvT0piVVJaUnciIHg9IjE0NTcxIiB5PSIxNDE2NCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENBUlp1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDFBMyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDQVJhZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hDQVJhdWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0FSYS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDQVJiT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENBUmJlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDQVJidWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENBUmItZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDQVJjT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENBUmNlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDQVJjdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENBUmMtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDQVJkT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDQVJkZWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hDQVJaLWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSENBUmFPZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTQ1MjgiIHk9IjEyNTg5Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0FSZHVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxM0M5MTMwMkM1Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENBUmVlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSENBUmV1ZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjI4MjciIGhlaWdodD0iOTM5Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENBUmUtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0FSZk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDQVJmZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0FSZnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDQVJmLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0FSZ09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDQVJnZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0FSZ3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDQVJnLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0tCME9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ0tCMGVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IQ0FSZC1mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hDQVJlT2ZYRWR1cUhvT0piVVJaUnciIHg9IjEzNjczIiB5PSIxMDYwOCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENLQjB1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRkQ0RUI0MDJCQiI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDS0IxZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hDS0IxdWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0tCMS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDS0IyT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENLQjJlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDS0IydWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENLQjItZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDS0IzT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENLQjNlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDS0IzdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENLQjMtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDS0I0T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDS0I0ZWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hDS0IwLWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJOb25lIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSENLQjFPZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTQzNzYiIHk9IjIxMjQyIiB3aWR0aD0iMzU2NCIgaGVpZ2h0PSIyMTE2Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0tDQmVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERjQxQTUwMUI2Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENLQ0NPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSENLQ0NlZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDS0NDdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENLQ0MtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0tDRE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENLQ0RlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ0tDRHVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENLQ0QtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ0tDRU9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENLQ0VlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ0tDRXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENLQ0UtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENLQ0ZPZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSENLQ0J1ZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IQ0tDQi1mWEVkdXFIb09KYlVSWlJ3IiB4PSIxNTc0IiB5PSIxMDE5MyIgd2lkdGg9IjM0NTQiIGhlaWdodD0iMTM3NTgiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDVHpYT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxQjciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ1R6WC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IQ1R6WU9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENUelllZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ1R6WXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDVHpZLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ1R6Wk9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDVHpaZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ1R6WnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDVHpaLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ1R6YU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDVHphZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ1R6YXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ1R6YS1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IQ1R6WGVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hDVHpYdWZYRWR1cUhvT0piVVJaUnciIHg9IjE1MDg3IiB5PSI0ODE3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ1R6Yk9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMUI4Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENUemItZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSENUemNPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDVHpjZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENUemN1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ1R6Yy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENUemRPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ1R6ZGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENUemR1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ1R6ZC1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENjOHdPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ2M4d2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENjOHd1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENjOHctZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSENUemJlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IQ1R6YnVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxNDIxNSIgeT0iMzQ0NSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENjOHhPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDFDQiI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDYzh4LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hDYzh5T2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ2M4eWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDYzh5dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENjOHktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDYzh6T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENjOHplZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDYzh6dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENjOHotZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDYzgwT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENjODBlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDYzgwdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDYzgwLWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hDYzh4ZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSENjOHh1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTQzNTEiIHk9IjU5ODUiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDYzgxT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURFNUVFMTAxMTEiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ2M4MS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IQ2M4Mk9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENjODJlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ2M4MnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDYzgyLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ2M4M09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDYzgzZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ2M4M3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDYzgzLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ2M4NE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDYzg0ZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ2M4NHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ2M4NC1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IQ2M4MWVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hDYzgxdWZYRWR1cUhvT0piVVJaUnciIHg9IjI0OTI1IiB5PSI1Mjc0IiB3aWR0aD0iMjk4OCIgaGVpZ2h0PSIzNjc0Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ2M5RU9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERTVENDcwMEZCIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENjOUUtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSENjOUZPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDYzlGZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENjOUZ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ2M5Ri1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENjOUdPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ2M5R2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENjOUd1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ2M5Ry1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENjOUhPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ2M5SGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENjOUh1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENjOUgtZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSENjOUVlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IQ2M5RXVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxNTY2IiB5PSIyNzk0IiB3aWR0aD0iMzU3MyIgaGVpZ2h0PSI2OTA4Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ210NE9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMUQ1Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENtdDQtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSENtdDVPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjQzMDEiIGhlaWdodD0iOTkwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENtdDVlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ210NXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDbXQ1LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ210Nk9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDbXQ2ZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ210NnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDbXQ2LWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ210N09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDbXQ3ZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ210N3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ210Ny1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IQ210NGVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hDbXQ0dWZYRWR1cUhvT0piVVJaUnciIHg9IjEyOTg3IiB5PSI3OTkyIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTERpYWdyYW1TdHlsZSIgeG1pOmlkPSJfR3FVSnQtZlhFZHVxSG9PSmJVUlpSdyIgZGVzY3JpcHRpb249IlRoaXMgZGlhZ3JhbSBzaG93cyBhbGwgZ3VpZGFuY2UgdHlwZXMgYW5kIHRoZWlyIHJlbGF0aW9uc2hpcHMgdG8gb3RoZXIgY29udGVudCBlbGVtZW50cy4gIEFzc29jaWF0aW9ucyBhbmQgbXVsdGlwbGljaXRpZXMgaGF2ZSBiZWVuIHByZWRlZmluZWQgb24gdGhhdCBsZXZlbCBvZiBkZXRhaWwgdG8gZW5zdXJlIHRoYXQgZ3VpZGFuY2UgaXMgb25seSByZWxhdGVkIHRvIGFwcHJvcHJpYXRlIGNvbnRlbnQgZWxlbWVudHMuICBGb3IgZXhhbXBsZSwgVU1BIGRlZmluZXMgdGhhdCBvbmx5IG9uIGNoZWNrbGlzdCBjYW4gYmUgYXNzb2NpYXRlZCB3aXRoIG9uZSBjb250ZW50IGVsZW1lbnQgYXQgYSB0aW1lLiAgT3RoZXIgcGFja2FnZXMgYWRkIHZhcmlhYmlsaXR5IGNhcGFiaWxpdGllcyB0byBjaGVja2xpc3RzIChhbmQgb3RoZXIgY29udGVudCBlbGVtZW50cykgdGhhdCBhbGxvd3MgdG8gZHluYW1pY2FsbHkgcHJvdmlkZSBhZGRpdGlvbmFsIGNoZWNrIHBvaW50cyBvciBldmVuIGNoZWNrIHBvaW50IGdyb3VwaW5ncyB0byBjaGVjayBsaXN0IHNvIHRoYXQgYW4gYXNzb2NpYXRlZCBjaGVjayBsaXN0IGFsd2F5cyBjb250YWlucyB0aGUgcmlnaHQgY2hlY2sgcG9pbnRzIHdpdGhpbiB0aGUgY29udGV4dCBvZiBhIHBhcnRpY3VsYXIgbWV0aG9kIGNvbmZpZ3VyYXRpb24gb3IgcHJvY2Vzcy4iLz4KLSAgICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSENBUlBlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDBCMCIgc291cmNlPSJfSEIzRzRPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSENBUkxlZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDQVJRT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENBUlF1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDQVJRLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IQ0FSUWVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSENBUlB1ZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hDQVJQLWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0xMDgzLCAtMjQ1LCAyMjE4LCA0NjVdJFstMjQ1NSwgLTUzMywgODQ2LCAxNzddIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hDQVJST2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IQ0FSUmVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hDS0I0dWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEZENThCNDAyMzYiIHNvdXJjZT0iX0hDS0IwdWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hDS0IwdWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0tCNWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDS0I1LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0tCNk9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSENLQjV1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDS0I2ZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGRDU4QjUwMzdBIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0tCNi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQ0tCNnVmWEVkdXFIb09KYlVSWlJ3IiB5PSIzOTYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0tCN09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEZENThCNTAzN0EiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDS0I3dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQ0tCN2VmWEVkdXFIb09KYlVSWlJ3IiB5PSItMzk3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENLQjctZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGRDU4QjUwMzcwIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0tCOGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hDS0I4T2ZYRWR1cUhvT0piVVJaUnciIHg9Ii0zNDIiIHk9IjQ1NyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDS0I4dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEZENThCNTAzNzAiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDS0I5T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hDS0I4LWZYRWR1cUhvT0piVVJaUnciIHg9IjI5NSIgeT0iLTQ3MCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDS0I5ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEZENThCNTAzN0EiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDS0I5LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDS0ItT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hDS0I5dWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0tCLWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEZENThCNTAzNzAiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDS0ItLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDS0JfT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hDS0ItdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0tCX2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRkQ1OEI1MDM3QSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENLQl8tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENLQ0FPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENLQl91ZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDS0NBZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEZENThCNTAzNzAiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDS0NBLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENLQ0JPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENLQ0F1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hDS0I0LWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSENLQjVPZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMTc3OCwgOCwgMTc3OCwgOF0kWzMzNzgsIDgsIDMzNzgsIDhdJFszMzc4LCAyNTkwLCAzMzc4LCAyNTkwXSRbODA0LCAyNTkwLCA4MDQsIDI1OTBdJFs4MDQsIDEwNTgsIDgwNCwgMTA1OF0iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hDS0NGZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAyNzAiIHNvdXJjZT0iX0hDQVJIZWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hDS0NCZWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0tDR09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDS0NHdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0tDRy1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSENLQ0dlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDS0NIT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAyNzMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDS0NIdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hDS0NIZWZYRWR1cUhvT0piVVJaUnciIHg9Ii04MDUiIHk9Ii0yNzkiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0tDSC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDI3MyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENLQ0llZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hDS0NJT2ZYRWR1cUhvT0piVVJaUnciIHg9IjQ4MiIgeT0iMjcyIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENLQ0l1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMjcxIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0tDSk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hDS0NJLWZYRWR1cUhvT0piVVJaUnciIHg9IjEwNDYiIHk9Ii0zNzIiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0tDSmVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDI3MSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENLQ0otZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENLQ0p1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iNDYxIiB5PSIzNDgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0tDS09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMjczIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0tDS3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ0tDSy1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQ0tDS2VmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENLQ0xPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMjcxIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0tDTHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ0tDTC1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQ0tDTGVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENLQ01PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAyNzMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDS0NNdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDS0NNLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hDS0NNZWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0tDTk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMjcxIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0tDTnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDS0NOLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hDS0NOZWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IQ0tDRnVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hDS0NGLWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0xODAzLCAtMTAxLCAxMTA0OSwgMzA5OF0kWy0xMTIzNSwgLTEwMSwgMTYxNywgMzA5OF0iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hDS0NRZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAyOEUiIHNvdXJjZT0iX0hDQVJMZWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hDS0NCZWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0tDUk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDS0NSdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0tDUi1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSENLQ1JlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDS0NTT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAyOTEiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDS0NTdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hDS0NTZWZYRWR1cUhvT0piVVJaUnciIHg9Ii0xMDQxIiB5PSItMjgwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENLQ1MtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAyOTEiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDS0NUZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQ0tDVE9mWEVkdXFIb09KYlVSWlJ3IiB4PSI2MzUiIHk9IjE2OSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDS0NUdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDI4RiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENLQ1VPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQ0tDVC1mWEVkdXFIb09KYlVSWlJ3IiB4PSI5NzUiIHk9Ii00NTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0tDVWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDI4RiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENLQ1UtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENLQ1V1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iNDkyIiB5PSIzNDciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0tDVk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMjkxIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0tDVnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ0tDVi1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQ0tDVmVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENLQ1dPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMjhGIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0tDV3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ0tDVy1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQ0tDV2VmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENLQ1hPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAyOTEiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDS0NYdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDS0NYLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hDS0NYZWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0tDWU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMjhGIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0tDWXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDS0NZLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hDS0NZZWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IQ0tDUXVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hDS0NRLWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy04NDYsIDU5LCAxMTU0OCwgMTEyNl0kWy0xMDc3OCwgNTksIDE2MTcsIDExMjZdIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IQ0tDWk9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERTVERDcwMTRDIiBzb3VyY2U9Il9IQ0FSUnVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IQ0tDQmVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENLQ1otZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0tDYWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENLQ2F1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hDS0NhT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0tDYS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERTVERDcwMTRFIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0tDYmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQ0tDYk9mWEVkdXFIb09KYlVSWlJ3IiB4PSItOTM2IiB5PSItMjU1Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENLQ2J1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURFNURENzAxNEUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDS0NjT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQ0tDYi1mWEVkdXFIb09KYlVSWlJ3IiB4PSItMTk5IiB5PSIxODUiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0tDY2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURFNURENzAxNEQiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDS0NjLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENLQ2N1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iOTM3IiB5PSItNDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENLQ2RPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURFNURENzAxNEQiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDS0NkdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hDS0NkZWZYRWR1cUhvT0piVVJaUnciIHg9Ii03OSIgeT0iMzEyIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENLQ2QtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREU1REQ3MDE0RSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENLQ2VlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENLQ2V1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENLQ2VPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDS0NlLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREU1REQ3MDE0RCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENLQ2ZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENLQ2Z1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENLQ2ZPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDS0NmLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERTVERDcwMTRFIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0tDZ2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ0tDZ3VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQ0tDZ09mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENLQ2ctZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREU1REQ3MDE0RCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENLQ2hlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ0tDaHVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQ0tDaE9mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSENLQ1plZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IQ0tDWnVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstOTU2LCAxNiwgMTExODQsIC03NDVdJFstMTA1MjQsIDE2LCAxNjE3LCAtNzQ1XSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSENUeTBPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREU1RDczMDIwRSIgc291cmNlPSJfSENBUlZ1ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSENLQ0JlZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDVHkwLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENUeTFlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDVHkxdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IQ1R5MU9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENUeTEtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREU1RDczMDIxMCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENUeTJlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENUeTJPZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTkxNCIgeT0iMTY5Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENUeTJ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURFNUQ3MzAyMTAiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDVHkzT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQ1R5Mi1mWEVkdXFIb09KYlVSWlJ3IiB4PSItMTk1IiB5PSItMjk3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENUeTNlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERTVENzMwMjBGIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ1R5My1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hDVHkzdWZYRWR1cUhvT0piVVJaUnciIHg9IjEwMzkiIHk9Ii0zNDgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ1R5NE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREU1RDczMDIwRiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENUeTR1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENUeTRlZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTEzOCIgeT0iMjQ1Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENUeTQtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREU1RDczMDIxMCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENUeTVlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENUeTV1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENUeTVPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDVHk1LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREU1RDczMDIwRiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENUeTZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENUeTZ1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENUeTZPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDVHk2LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERTVENzMwMjEwIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ1R5N2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ1R5N3VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQ1R5N09mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENUeTctZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREU1RDczMDIwRiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENUeThlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ1R5OHVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQ1R5OE9mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSENUeTBlZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IQ1R5MHVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstOTIyLCAzMywgMTExNjcsIC0yNDA0XSRbLTEwNDczLCAzMywgMTYxNywgLTI0MDRdIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IQ1R5OC1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERTVFNTUwMEM1IiBzb3VyY2U9Il9IQ0FSWnVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IQ0tDQmVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENUeTl1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ1R5LU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENUeS1lZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hDVHk5LWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ1R5LXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERTVFNTUwMEM3Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ1R5X09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQ1R5LS1mWEVkdXFIb09KYlVSWlJ3IiB4PSItOTUxIiB5PSItNDU3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENUeV9lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURFNUU1NTAwQzciPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDVHlfLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQ1R5X3VmWEVkdXFIb09KYlVSWlJ3IiB4PSItMjA2IiB5PSIyMjAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ1R6QU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURFNUU1NTAwQzYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDVHpBdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENUekFlZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTE5MiIgeT0iLTMzOCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDVHpBLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERTVFNTUwMEM2Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ1R6QmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQ1R6Qk9mWEVkdXFIb09KYlVSWlJ3IiB4PSItMjIyIiB5PSIzMDUiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ1R6QnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERTVFNTUwMEM3Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ1R6Q09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ1R6Q2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQ1R6Qi1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENUekN1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERTVFNTUwMEM2Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ1R6RE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ1R6RGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQ1R6Qy1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENUekR1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURFNUU1NTAwQzciPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDVHpFT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDVHpFZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hDVHpELWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ1R6RXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERTVFNTUwMEM2Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ1R6Rk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDVHpGZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hDVHpFLWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IQ1R5OU9mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hDVHk5ZWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy05MTQsIC00MiwgMTExMjUsIC00MDU1XSRbLTEwNDIyLCAtNDIsIDE2MTcsIC00MDU1XSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSENUekZ1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMTNDOTNEMDMyMSIgc291cmNlPSJfSENLQ0JlZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSENBUmR1ZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDVHpHZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENUekctZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDVHpIT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IQ1R6R3VmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENUekhlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMTNDOTNGMDA5OSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENUekgtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENUekh1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTEwNjIiIHk9IjM0NyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDVHpJT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMTNDOTNGMDA5OSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENUekl1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hDVHpJZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0zOTciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ1R6SS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjEzQzkzRjAwNDkiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDVHpKZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENUekpPZlhFZHVxSG9PSmJVUlpSdyIgeD0iODkzIiB5PSItMTAyIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENUekp1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMTNDOTNGMDA0OSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENUektPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENUekotZlhFZHVxSG9PSmJVUlpSdyIgeD0iNTM3IiB5PSIyMTEiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ1R6S2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxM0M5M0YwMDk5Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ1R6Sy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ1R6TE9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQ1R6S3VmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENUekxlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxM0M5M0YwMDQ5Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ1R6TC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ1R6TU9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQ1R6THVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENUek1lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjEzQzkzRjAwOTkiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDVHpNLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDVHpOT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hDVHpNdWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ1R6TmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxM0M5M0YwMDQ5Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ1R6Ti1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDVHpPT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hDVHpOdWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IQ1R6Ri1mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hDVHpHT2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzE2MTcsIC02MDM2LCAtMTAwNjYsIC00Ml0kWzEwMjcwLCAtNjAzNiwgLTE0MTMsIC00Ml0iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hDVHpPZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURGNDFDNjAzQTAiIHNvdXJjZT0iX0hDS0IwdWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hDS0NCZWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ1R6UE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDVHpQdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ1R6UC1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSENUelBlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDVHpRT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURGNDFDNjAzQTIiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDVHpRdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hDVHpRZWZYRWR1cUhvT0piVVJaUnciIHg9Ii0xMTMyIiB5PSIxMzciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ1R6US1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURGNDFDNjAzQTIiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDVHpSZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQ1R6Uk9mWEVkdXFIb09KYlVSWlJ3IiB4PSItNDM4IiB5PSItNDM5Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENUelJ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERjQxQzYwM0ExIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ1R6U09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hDVHpSLWZYRWR1cUhvT0piVVJaUnciIHg9IjY0NCIgeT0iMTk2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENUelNlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREY0MUM2MDNBMSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENUelMtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENUelN1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTc3OCIgeT0iLTI2MSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDVHpUT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURGNDFDNjAzQTIiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDVHpUdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDVHpULWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hDVHpUZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ1R6VU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURGNDFDNjAzQTEiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDVHpVdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDVHpVLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hDVHpVZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ1R6Vk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREY0MUM2MDNBMiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENUelZ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENUelYtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENUelZlZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDVHpXT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURGNDFDNjAzQTEiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDVHpXdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENUelctZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENUeldlZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hDVHpPdWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSENUek8tZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTE3NzgsIC01MCwgMTA5NzIsIDUxODFdJFstMTExMzMsIC01MCwgMTYxNywgNTE4MV0iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hDYzg3ZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURFNUZGNzAzMDQiIHNvdXJjZT0iX0hDYzh4T2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hDYzgxT2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ2M4OE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDYzg4dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ2M4OC1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSENjODhlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDYzg5T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURFNUZGNzAzMDYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDYzg5dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hDYzg5ZWZYRWR1cUhvT0piVVJaUnciIHg9Ii03MzIiIHk9Ii0yMTIiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ2M4OS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREU1RkY3MDMwNiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENjOC1lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hDYzgtT2ZYRWR1cUhvT0piVVJaUnciIHg9IjY0IiB5PSIzMDQiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ2M4LXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURFNUZGNzAzMDUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDYzhfT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENjOC0tZlhFZHVxSG9PSmJVUlpSdyIgeD0iOTc4IiB5PSItMjU0Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENjOF9lZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURFNUZGNzAzMDUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDYzhfLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hDYzhfdWZYRWR1cUhvT0piVVJaUnciIHg9IjcxNiIgeT0iLTI2MyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDYzlBT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURFNUZGNzAzMDYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDYzlBdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDYzlBLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hDYzlBZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ2M5Qk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURFNUZGNzAzMDUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDYzlCdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDYzlCLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hDYzlCZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ2M5Q09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREU1RkY3MDMwNiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENjOUN1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENjOUMtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENjOUNlZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDYzlET2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURFNUZGNzAzMDUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDYzlEdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENjOUQtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENjOURlZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hDYzg3dWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSENjODctZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMTA0MSwgLTEwMSwgLTk5ODIsIC03NjJdJFs5NTMzLCAtMTAxLCAtMTQ5MCwgLTc2Ml0iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hDYzlJT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURFNUU0NDAzRTEiIHNvdXJjZT0iX0hDVHpYT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hDYzlFT2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ2M5SS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDYzlKZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ2M5SnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSENjOUpPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDYzlKLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURFNUU0NDAzRTMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDYzlLZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hDYzlLT2ZYRWR1cUhvT0piVVJaUnciIHg9Ii0yNTUiIHk9Ii0yNzgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ2M5S3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREU1RTQ0MDNFMyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENjOUxPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hDYzlLLWZYRWR1cUhvT0piVVJaUnciIHg9IjM3MiIgeT0iNDE2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENjOUxlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERTVFNDQwM0UyIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ2M5TC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hDYzlMdWZYRWR1cUhvT0piVVJaUnciIHg9IjEyMjQiIHk9Ii0yNzgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ2M5TU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREU1RTQ0MDNFMiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENjOU11ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENjOU1lZlhFZHVxSG9PSmJVUlpSdyIgeD0iOTgiIHk9IjMzMSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDYzlNLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURFNUU0NDAzRTMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDYzlOZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDYzlOdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hDYzlOT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ2M5Ti1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURFNUU0NDAzRTIiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDYzlPZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDYzlPdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hDYzlPT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ2M5Ty1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREU1RTQ0MDNFMyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENjOVBlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENjOVB1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENjOVBPZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDYzlQLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURFNUU0NDAzRTIiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDYzlRZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENjOVF1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENjOVFPZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hDYzlJZWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSENjOUl1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTc2MiwgLTY3LCAxMDg3MSwgLTEwMzJdJFstOTk1NiwgLTY3LCAxNjc2LCAtMTAzMl0iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hDYzlRLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURFNUU2MTAyQ0MiIHNvdXJjZT0iX0hDVHpiT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hDYzlFT2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ2M5UnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDYzlTT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ2M5U2VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSENjOVItZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDYzlTdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURFNUU2MTAyQ0UiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDYzlUT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hDYzlTLWZYRWR1cUhvT0piVVJaUnciIHg9Ii05MDUiIHk9Ii0zMTMiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ2M5VGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREU1RTYxMDJDRSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENjOVQtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hDYzlUdWZYRWR1cUhvT0piVVJaUnciIHg9Ii0xMjYiIHk9IjI4OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDYzlVT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREU1RTYxMDJDRCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENjOVV1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQ2M5VWVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxMDk0IiB5PSIyODgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ2M5VS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREU1RTYxMDJDRCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENjOVZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENjOVZPZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTU0IiB5PSItMzcyIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENjOVZ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREU1RTYxMDJDRSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENjOVdPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENjOVdlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENjOVYtZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDYzlXdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREU1RTYxMDJDRCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENjOVhPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENjOVhlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENjOVctZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDYzlYdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERTVFNjEwMkNFIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ2M5WU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ2M5WWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQ2M5WC1mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENjOVl1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREU1RTYxMDJDRCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENjOVpPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ2M5WmVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQ2M5WS1mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSENjOVJPZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IQ2M5UmVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstOTIyLCAtNTksIDEwNzYxLCAtMjM5Nl0kWy0xMDAwNywgLTU5LCAxNjc2LCAtMjM5Nl0iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hDYzliLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBQkM4ODAyRDAiIHNvdXJjZT0iX0hDYzlFT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hDYzh4T2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ210d09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDbXR3dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ210dy1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSENtdHdlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDbXR4T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBQkM4OTAzN0UiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDbXR4dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hDbXR4ZWZYRWR1cUhvT0piVVJaUnciIHg9Ii05OTUiIHk9Ii0yMTIiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ210eC1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBQkM4OTAzN0UiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDbXR5ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQ210eU9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMzk3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENtdHl1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QUJDODkwMzdDIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ210ek9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hDbXR5LWZYRWR1cUhvT0piVVJaUnciIHg9IjkwMSIgeT0iLTExMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDbXR6ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBQkM4OTAzN0MiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDbXR6LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hDbXR6dWZYRWR1cUhvT0piVVJaUnciIHg9IjIwIiB5PSIzMjIiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ210ME9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QUJDODkwMzdFIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ210MHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ210MC1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQ210MGVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENtdDFPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QUJDODkwMzdDIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ210MXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ210MS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQ210MWVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENtdDJPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBQkM4OTAzN0UiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDbXQydWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDbXQyLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hDbXQyZWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ210M09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QUJDODkwMzdDIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ210M3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDbXQzLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hDbXQzZWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IQ2M5Y09mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hDYzljZWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzE2NzYsIDIwMywgLTEwMjYxLCAwXSRbMTA4OTYsIDIwMywgLTEwNDEsIDBdIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IQ210OE9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDREOEY1MTQwMjI2IiBzb3VyY2U9Il9IQ210NE9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IQ2M4MU9mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENtdDgtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ210OWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENtdDl1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hDbXQ5T2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ210OS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDREOEY1MTQwMjI4Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ210LWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQ210LU9mWEVkdXFIb09KYlVSWlJ3IiB4PSItNjk3IiB5PSItMjM4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENtdC11ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0NEQ4RjUxNDAyMjgiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDbXRfT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQ210LS1mWEVkdXFIb09KYlVSWlJ3IiB4PSIxNDM3IiB5PSIyNjIiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ210X2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0NEQ4RjUxNDAyMjciPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDbXRfLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENtdF91ZlhFZHVxSG9PSmJVUlpSdyIgeD0iODQyIiB5PSItMjA0Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENtdUFPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0NEQ4RjUxNDAyMjciPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDbXVBdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hDbXVBZWZYRWR1cUhvT0piVVJaUnciIHg9IjM4NCIgeT0iMzU1Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENtdUEtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQ0RDhGNTE0MDIyOCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENtdUJlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENtdUJ1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENtdUJPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDbXVCLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQ0RDhGNTE0MDIyNyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENtdUNlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENtdUN1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENtdUNPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDbXVDLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDREOEY1MTQwMjI4Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ211RGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ211RHVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQ211RE9mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENtdUQtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQ0RDhGNTE0MDIyNyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENtdUVlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ211RXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQ211RU9mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSENtdDhlZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IQ210OHVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlsyMTUwLCAtMTYsIC05MTI3LCAxMzU0XSRbOTc4NywgLTE2LCAtMTQ5MCwgMTM1NF0iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hDbXVFLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0NEQ4RjUxODAwRjUiIHNvdXJjZT0iX0hDbXQ0T2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hDYzlFT2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ211RnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDbXVHT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ211R2VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSENtdUYtZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDbXVHdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0NEQ4RjUxODAwRjciPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDbXVIT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hDbXVHLWZYRWR1cUhvT0piVVJaUnciIHg9Ii03ODkiIHk9Ii00NTciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ211SGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQ0RDhGNTE4MDBGNyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENtdUgtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hDbXVIdWZYRWR1cUhvT0piVVJaUnciIHg9IjEzOTUiIHk9IjM0NyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDbXVJT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQ0RDhGNTE4MDBGNiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENtdUl1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQ211SWVmWEVkdXFIb09KYlVSWlJ3IiB4PSI3ODMiIHk9Ii00NTciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ211SS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQ0RDhGNTE4MDBGNiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENtdUplZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENtdUpPZlhFZHVxSG9PSmJVUlpSdyIgeD0iMzc3IiB5PSIzNDciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ211SnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDREOEY1MTgwMEY3Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ211S09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ211S2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQ211Si1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENtdUt1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDREOEY1MTgwMEY2Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ211TE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ211TGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQ211Sy1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENtdUx1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0NEQ4RjUxODAwRjciPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDbXVNT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDbXVNZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hDbXVMLWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ211TXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDREOEY1MTgwMEY2Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ211Tk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDbXVOZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hDbXVNLWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IQ211Rk9mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hDbXVGZWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0yMTUwLCAwLCA5NTMzLCAyMjM1XSRbLTEwMDA3LCAwLCAxNjc2LCAyMjM1XSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfLWc3THNPMG9FZHV0Q0xFQ045NkJOdyIgZWxlbWVudD0iXy1kOHdNTzBvRWR1dENMRUNOOTZCTnciIHNvdXJjZT0iX0hDS0NCZWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hDQVEzZWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il8tZzdMcy0wb0VkdXRDTEVDTjk2Qk53IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iXy1nN0x0ZTBvRWR1dENMRUNOOTZCTnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il8tZzdMdHUwb0VkdXRDTEVDTjk2Qk53IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il8tZzdMdE8wb0VkdXRDTEVDTjk2Qk53IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfLWc3THQtMG9FZHV0Q0xFQ045NkJOdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXy1nQnowdTBvRWR1dENMRUNOOTZCTnciPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iXy1nN0x1ZTBvRWR1dENMRUNOOTZCTnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iXy1nN0x1TzBvRWR1dENMRUNOOTZCTnciIHg9Ii00NzciIHk9IjI2MyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iXy1nN0x1dTBvRWR1dENMRUNOOTZCTnciIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfLWdCejB1MG9FZHV0Q0xFQ045NkJOdyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfLWc3THZPMG9FZHV0Q0xFQ045NkJOdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iXy1nN0x1LTBvRWR1dENMRUNOOTZCTnciIHk9Ii0zOTciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il8tZzdMdmUwb0VkdXRDTEVDTjk2Qk53IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8tZTFoQU8wb0VkdXRDTEVDTjk2Qk53Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il8tZzdMdi0wb0VkdXRDTEVDTjk2Qk53IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iXy1nN0x2dTBvRWR1dENMRUNOOTZCTnciIHg9IjMxNyIgeT0iMjM3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfLWc3THdPMG9FZHV0Q0xFQ045NkJOdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXy1lMWhBTzBvRWR1dENMRUNOOTZCTnciPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iXy1nN0x3dTBvRWR1dENMRUNOOTZCTnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iXy1nN0x3ZTBvRWR1dENMRUNOOTZCTnciIHg9Ii02NjciIHk9Ii0yMDgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il8tZzdMdy0wb0VkdXRDTEVDTjk2Qk53IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfLWdCejB1MG9FZHV0Q0xFQ045NkJOdyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfLWc3THhlMG9FZHV0Q0xFQ045NkJOdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfLWc3THh1MG9FZHV0Q0xFQ045NkJOdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfLWc3THhPMG9FZHV0Q0xFQ045NkJOdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iXy1oRThzTzBvRWR1dENMRUNOOTZCTnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXy1lMWhBTzBvRWR1dENMRUNOOTZCTnciPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iXy1oRThzdTBvRWR1dENMRUNOOTZCTnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iXy1oRThzLTBvRWR1dENMRUNOOTZCTnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iXy1oRThzZTBvRWR1dENMRUNOOTZCTnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il8taEU4dE8wb0VkdXRDTEVDTjk2Qk53IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXy1nQnowdTBvRWR1dENMRUNOOTZCTnciPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iXy1oRTh0dTBvRWR1dENMRUNOOTZCTnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iXy1oRTh0LTBvRWR1dENMRUNOOTZCTnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iXy1oRTh0ZTBvRWR1dENMRUNOOTZCTnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il8taEU4dU8wb0VkdXRDTEVDTjk2Qk53IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfLWUxaEFPMG9FZHV0Q0xFQ045NkJOdyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfLWhFOHV1MG9FZHV0Q0xFQ045NkJOdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il8taEU4dS0wb0VkdXRDTEVDTjk2Qk53Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il8taEU4dWUwb0VkdXRDTEVDTjk2Qk53IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfLWc3THNlMG9FZHV0Q0xFQ045NkJOdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il8tZzdMc3Uwb0VkdXRDTEVDTjk2Qk53IiBwb2ludHM9Ils2NSwgNTcsIC0yNjIsIC0xODRdJFsyNzAsIDI0NSwgLTU3LCA0XSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgPC9jb250ZW50cz4KLSAgICAgICAgICAgIDxjb250ZW50cyB4bWk6dHlwZT0ibm90YXRpb246RGlhZ3JhbSIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGNDlGRTcwM0MxIiB0eXBlPSJDbGFzcyIgbmFtZT0iVGF4b25vbXkiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEM1b3NPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDE5QSI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDNW9zLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hDNW90T2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQzVvdGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDNW90dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEM1b3QtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDNW91T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEM1b3VlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDNW91dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEM1b3UtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDNW92T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEM1b3ZlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDNW92dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDNW92LWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hDNW9zZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEM1b3N1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMjY5MzciIHk9IjEwMDExIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQzVvd09mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMTk5Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEM1b3ctZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEM1b3hPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDNW94ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEM1b3h1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQzVveC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEM1b3lPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQzVveWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEM1b3l1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQzVveS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEM1b3pPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQzVvemVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEM1b3p1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEM1b3otZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEM1b3dlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IQzVvd3VmWEVkdXFIb09KYlVSWlJ3IiB4PSIyOTM1NiIgeT0iMTAwMTEiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDNW8wT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxQTMiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQzVvMC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IQzVvMU9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEM1bzFlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQzVvMXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDNW8xLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQzVvMk9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDNW8yZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQzVvMnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDNW8yLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQzVvM09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDNW8zZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQzVvM3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQzVvMy1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IQzVvMGVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hDNW8wdWZYRWR1cUhvT0piVVJaUnciIHg9IjIyMDU2IiB5PSIxMDAxMSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEM1bzRPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDFCNyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDNW80LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hDNW81T2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQzVvNWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDNW81dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEM1bzUtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDNW82T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEM1bzZlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDNW82dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEM1bzYtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDNW83T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEM1bzdlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDNW83dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDNW83LWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hDNW80ZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEM1bzR1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTk5MTciIHk9IjEwMDExIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQzVvOE9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMUMxIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEREWnNPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEREWnNlZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hERFpzdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEREWnMtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRERadE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEREWnRlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRERadHVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEREWnQtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRERadU9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEREWnVlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRERadXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEREWnUtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEREWnZPZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEM1bzhlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IQzVvOHVmWEVkdXFIb09KYlVSWlJ3IiB4PSI0OTEiIHk9IjEwMDExIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRERadmVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMUE0Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEREWndPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEREWndlZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hERFp3dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEREWnctZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRERaeE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEREWnhlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRERaeHVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEREWngtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRERaeU9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEREWnllZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRERaeXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEREWnktZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEREWnpPZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEREWnZ1ZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRERadi1mWEVkdXFIb09KYlVSWlJ3IiB4PSI5OTE3IiB5PSIxMDAwMiIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEREWnplZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDFCOCI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hERFowT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hERFowZWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRERaMHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hERFowLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEREWjFPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hERFoxZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEREWjF1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hERFoxLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEREWjJPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hERFoyZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEREWjJ1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hERFoyLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hERFozT2ZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hERFp6dWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEREWnotZlhFZHVxSG9PSmJVUlpSdyIgeD0iMjQ0MDAiIHk9IjEwMDExIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRERaM2VmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMUYzIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEREWjRPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEREWjRlZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hERFo0dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEREWjQtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRERaNU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEREWjVlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRERaNXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEREWjUtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRERaNk9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEREWjZlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRERaNnVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEREWjYtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEREWjdPZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEREWjN1ZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9Ik5vbmUiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRERaMy1mWEVkdXFIb09KYlVSWlJ3IiB4PSI2NjE4IiB5PSIxMDAxMSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEREWjdlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDFDQiI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hERFo4T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hERFo4ZWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRERaOHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hERFo4LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEREWjlPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hERFo5ZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEREWjl1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hERFo5LWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEREWi1PZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hERFotZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEREWi11ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hERFotLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hERFpfT2ZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hERFo3dWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEREWjctZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTIzNzMiIHk9IjEwMDExIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRERaX2VmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMUUwIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEREYUFPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEREYUFlZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hERGFBdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEREYUEtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRERhQk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEREYUJlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRERhQnVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEREYUItZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRERhQ09mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEREYUNlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRERhQ3VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEREYUMtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEREYURPZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEREWl91ZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRERaXy1mWEVkdXFIb09KYlVSWlJ3IiB4PSIyOTE2NCIgeT0iMTE3MjkiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hERGFGdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEZENEVCNDAyQkIiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRERhR2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IRERhR3VmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEREYUctZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRERhSE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hERGFIZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRERhSHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hERGFILWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRERhSU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hERGFJZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRERhSXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hERGFJLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRERhSk9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRERhSmVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IRERhRi1mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iTm9uZSIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hERGFHT2ZYRWR1cUhvT0piVVJaUnciIHg9IjQzMzEiIHk9IjEwMDExIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRERhSnVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjZDIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEREYUtlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEREYUt1ZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hERGFLLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEREYUxPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRERhTGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEREYUx1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRERhTC1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEREYU1PZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRERhTWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEREYU11ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRERhTS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEREYU5PZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEREYU5lZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEREYUotZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMTI2MzIyNTYiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEREYUtPZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTU4MjciIHk9IjQ4MzUiIHdpZHRoPSIzNDc5IiBoZWlnaHQ9IjExMDAiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hETWoyZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyREEiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRE1qM09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IRE1qM2VmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMzc3NiIgaGVpZ2h0PSIxMTM0Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERNajN1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRE1qMy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hETWo0T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRE1qNGVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hETWo0dWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRE1qNC1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hETWo1T2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRE1qNWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hETWo1dWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRE1qNS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRE1qNk9mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IRE1qMnVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIxMjYzMjI1NiIgc2hvd1BhcmVudD0iTmFtZSIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRE1qMi1mWEVkdXFIb09KYlVSWlJ3IiB4PSIxNTUwOCIgeT0iNzM0NSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERNai0tZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMTNDOTEzMDJDNSI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hETWpfdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hETWpfLWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIyODAyIiBoZWlnaHQ9Ijk5OSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hETWtBT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERNa0FlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRE1rQXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERNa0EtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRE1rQk9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERNa0JlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRE1rQnVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERNa0ItZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRE1rQ09mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERNa0NlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSERNa0N1ZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSERNal9PZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRE1qX2VmWEVkdXFIb09KYlVSWlJ3IiB4PSIzMTczOSIgeT0iMTAwMjEiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hETWtGT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjk0RUI5MDAwRkMiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRE1rRi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IRE1rR09mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMzUyMiIgaGVpZ2h0PSIxMDY2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERNa0dlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRE1rR3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hETWtHLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRE1rSE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hETWtIZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRE1rSHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hETWtILWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRE1rSU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hETWtJZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRE1rSXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRE1rSS1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IRE1rRmVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIxMjYzMjI1NiIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRE1rRnVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxNTg1MCIgeT0iMjg1MyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfODIxd0VPb1ZFZHVPQlBRQTJoS3FVUSIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDFENSI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iXzgyMXdFLW9WRWR1T0JQUUEyaEtxVVEiIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iXzgyMXdGT29WRWR1T0JQUUEyaEtxVVEiIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il84MjF3RmVvVkVkdU9CUFFBMmhLcVVRIiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iXzgyMXdGdW9WRWR1T0JQUUEyaEtxVVEiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfODIxd0Ytb1ZFZHVPQlBRQTJoS3FVUSIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iXzgyMXdHT29WRWR1T0JQUUEyaEtxVVEiIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfODIxd0dlb1ZFZHVPQlBRQTJoS3FVUSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iXzgyMXdHdW9WRWR1T0JQUUEyaEtxVVEiIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfODIxd0ctb1ZFZHVPQlBRQTJoS3FVUSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iXzgyMXdIT29WRWR1T0JQUUEyaEtxVVEiIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfODIxd0hlb1ZFZHVPQlBRQTJoS3FVUSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iXzgyMXdIdW9WRWR1T0JQUUEyaEtxVVEiIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iXzgyMXdILW9WRWR1T0JQUUEyaEtxVVEiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iXzgyMXdFZW9WRWR1T0JQUUEyaEtxVVEiIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfODIxd0V1b1ZFZHVPQlBRQTJoS3FVUSIgeD0iMTUxOTUiIHk9IjEwMDA5Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTERpYWdyYW1TdHlsZSIgeG1pOmlkPSJfR3FkNmtlZlhFZHVxSG9PSmJVUlpSdyIgZGVzY3JpcHRpb249IlRoZSBHdWlkYW5jZSBUeXBlcyBwYWNrYWdlIGRlZmluZXMgYSBudW1iZXIgb2YgcHJlLWRlZmluZWQgY29uY3JldGUgZ3VpZGFuY2UgdHlwZXMgdGhhdCBjYW4gYmUgcmVsYXRlZCB0byBzcGVjaWZpYyBjb250ZW50IGVsZW1lbnRzLiAgR3VpZGFuY2UgaXMgYSBjb250ZW50IGVsZW1lbnQgaXRzZWxmLCBzbyBpdCBpcyBwb3NzaWJsZSB0byBhc3NvY2lhdGUgZ3VpZGFuY2UgdG8gZ3VpZGFuY2UuIFRoaXMgZGlhZ3JhbSBzaG93cyB0aGUgdGF4b25vbXkgb2YgYWxsIGd1aWRhbmNlIHR5cGVzLiIvPgotICAgICAgICAgICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IRERhRGVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMEIwIiBzb3VyY2U9Il9IRERaX2VmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IQzVvd09mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEREYUVPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRERhRXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEREYUUtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hERGFFZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IRERhRHVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hERGFELWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzAsIC0zMTgsIDAsIDE3NzNdJFswLCAtMTc3MywgMCwgMzE4XSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRERhRk9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEREYUZlZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IRERhUnVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERjQ2NkYwMTE5IiBzb3VyY2U9Il9IQzVvOE9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IRE1qMmVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEREYVNlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRERhUy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEREYVRPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hERGFTdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IRERhUi1mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJUcmVlIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEREYVNPZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbOTUyLCAtMzE3LCAtMTIwMzksIDQwMjJdJFsxMTU2MiwgLTM4NjIsIC0xNDI5LCA0NzddIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hERGFUZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRERhVHVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iKDAuMTkzOTYyNDQsMC4zODcxMjk3MikiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hERGFULWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURGNDY3MzAwNTUiIHNvdXJjZT0iX0hERGFGdWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hETWoyZWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRERhVXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hERGFWT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRERhVmVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEREYVUtZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hERGFVT2ZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlRyZWUiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IRERhVWVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9Ils3NDAsIC0zMTcsIC05MzE0LCA0MDIyXSRbODk0MiwgLTM4NjIsIC0xMTEyLCA0NzddIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hERGFWdWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRERhVi1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iKDAuMTU2MTY4MywwLjc5MjY0NTYpIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IRERhV09mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGNEQyQUIwM0NBIiBzb3VyY2U9Il9IRERaM2VmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IRE1qMmVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEREYVctZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRERhWGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEREYVh1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hERGFYT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IRERhV2VmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJUcmVlIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEREYVd1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbNTU1LCAtMzE3LCAtNjk1OSwgNDAyMl0kWzY2OTMsIC0zODYyLCAtODIxLCA0NzddIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hERGFYLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRERhWU9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iKDAuMjgyMTQ4OCwwLjc2NjA4NzgzKSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEREYVllZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREY0NjdCMDI1RCIgc291cmNlPSJfSEREWnZlZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSERNajJlZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hERGFaT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEREYVp1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hETWpvT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRERhWmVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEREYVl1ZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iVHJlZSIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hERGFZLWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzM3MCwgLTMxNywgLTQ2MzEsIDQwMjJdJFs0NDQ1LCAtMzg2MiwgLTU1NiwgNDc3XSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRE1qb2VmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hETWpvLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAwOUIiIHNvdXJjZT0iX0hERFo3ZWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hETWoyZWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRE1qcHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hETWpxT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRE1qcWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSERNanAtZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hETWpwT2ZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlRyZWUiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IRE1qcGVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlsxODUsIC0zMTcsIC0yMzgyLCA0MDIyXSRbMjI3NiwgLTM4NjIsIC0yOTEsIDQ3N10iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSERNanF1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IRE1qck9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMDkwIiBzb3VyY2U9Il9IQzVvNE9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IRE1qMmVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERNanItZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRE1qc2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERNanN1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hETWpzT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IRE1qcmVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJUcmVlIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSERNanJ1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTI3LCAtMzE3LCAzNzAsIDQwMjJdJFstMzQ0LCAtMzg2MiwgNTMsIDQ3N10iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSERNanMtZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hETWp0T2ZYRWR1cUhvT0piVVJaUnciIGlkPSIoMC40NzcwNjIwNSwwLjc2NjA4NzgzKSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSERNanRlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDA1RiIgc291cmNlPSJfSEM1bzBPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSERNajJlZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hETWp1T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERNanV1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hETWp1LWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRE1qdWVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSERNanR1ZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iVHJlZSIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hETWp0LWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0xMDYsIC0zMTcsIDEzNDksIDQwMjJdJFstMTI5NywgLTM4NjIsIDE1OCwgNDc3XSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRE1qdk9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSERNanZlZlhFZHVxSG9PSmJVUlpSdyIgaWQ9IigwLjU5NjYyNDcsMC43OTI2NDU2KSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSERNanZ1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDA5MSIgc291cmNlPSJfSEREWnplZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSERNajJlZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hETWp3ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERNanctZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hETWp4T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRE1qd3VmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSERNanYtZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iVHJlZSIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hETWp3T2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0yNjUsIC0zMTcsIDM0MzksIDQwMjJdJFstMzMwNywgLTM4NjIsIDM5NywgNDc3XSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRE1qeGVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSERNanh1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9IigwLjY5MDc1MzUsMC43OTI2NDU2KSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSERNangtZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDA1RSIgc291cmNlPSJfSEM1b3NPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSERNajJlZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hETWp5dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERNanpPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hETWp6ZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRE1qeS1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSERNanlPZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iVHJlZSIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hETWp5ZWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy00MjMsIC0zMTcsIDU0MjQsIDQwMjJdJFstNTIxMiwgLTM4NjIsIDYzNSwgNDc3XSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRE1qenVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSERNanotZlhFZHVxSG9PSmJVUlpSdyIgaWQ9IigwLjc2NjM0MTgsMC41NzcxMTk1KSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSERNajBPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDA1NiIgc291cmNlPSJfSEM1b3dPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSERNajJlZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hETWowLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERNajFlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hETWoxdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRE1qMU9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSERNajBlZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iVHJlZSIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hETWowdWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy01ODIsIC0zMTcsIDc0ODcsIDQwMjJdJFstNzE3MCwgLTM4NjIsIDg5OSwgNDc3XSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRE1qMS1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSERNajJPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9IigwLjg2Njg4ODUsMC43OTI2NDU2KSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSERNajZlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkzMDExRCIgc291cmNlPSJfSERNajJlZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEREYUp1ZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hETWo3T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERNajd1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hETWo3LWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRE1qN2VmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSERNajZ1ZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMTI2MzIyNTYiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSERNajYtZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTgwLCAtNTAyLCAwLCAxMzUwXSRbLTgwLCAtMTI5NiwgMCwgNTU2XSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRE1qOE9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSERNajhlZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IRE1rQy1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIyRkEwQzMwMDdDIiBzb3VyY2U9Il9IRE1qLS1mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IRE1qMmVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERNa0R1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRE1rRU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERNa0VlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hETWtELWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IRE1rRE9mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJUcmVlIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSERNa0RlZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTc2OCwgLTMxOCwgOTc4OSwgMzk5NV0kWy05MzkzLCAtMzgzNiwgMTE2NCwgNDc3XSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRE1rRXVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSERNa0UtZlhFZHVxSG9PSmJVUlpSdyIgaWQ9IigwLjg4NTkwNDQzLDAuNTc3MTE5NSkiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hETWtKT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjk0RUM0QTAzMDYiIHNvdXJjZT0iX0hERGFKdWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hETWtGT2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRE1rSi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hETWtLZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRE1rS3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSERNa0tPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hETWtKZWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjEyNjMyMjU2IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hETWtKdWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0yNiwgLTU1NSwgMCwgMTU4OF0kWy0yNiwgLTE4MjUsIDAsIDMxOF0iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSERNa0stZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hETWtMT2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfODIxd0lPb1ZFZHVPQlBRQTJoS3FVUSIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjRBMUQ2MDI0NSIgc291cmNlPSJfODIxd0VPb1ZFZHVPQlBRQTJoS3FVUSIgdGFyZ2V0PSJfSERNajJlZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iXzgyMXdJLW9WRWR1T0JQUUEyaEtxVVEiIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfODIxd0plb1ZFZHVPQlBRQTJoS3FVUSIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iXzgyMXdKdW9WRWR1T0JQUUEyaEtxVVEiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iXzgyMXdKT29WRWR1T0JQUUEyaEtxVVEiIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il84MjF3SWVvVkVkdU9CUFFBMmhLcVVRIiByb3V0aW5nPSJUcmVlIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfODIxd0l1b1ZFZHVPQlBRQTJoS3FVUSIgcG9pbnRzPSJbNzksIC0zMTcsIC0xMjQ0LCA1MjEzXSRbMTIxNywgLTUwNTMsIC0xMDYsIDQ3N10iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgIDwvY29udGVudHM+Ci0gICAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HcEgyeS1mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMTkwIj4KLSAgICAgICAgICAgIDxib2R5PjAzPC9ib2R5PgotICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgIDxwYWNrYWdlTWVyZ2UgeG1pOmlkPSJfTjE5bGNPeE1FZHVPTnJNUmdtejQ4QSIgbWVyZ2VkUGFja2FnZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI5NCIvPgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMTk5IiBuYW1lPSJDb25jZXB0Ij4KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3BSbnh1ZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDE5OSI+Ci0gICAgICAgICAgICAgIDxib2R5PkEgQ29uY2VwdCBpcyBhIHNwZWNpZmljIHR5cGUgb2YgZ3VpZGFuY2UgdGhhdCBvdXRsaW5lcyBrZXkgaWRlYXMgYXNzb2NpYXRlZCB3aXRoIGJhc2ljIHByaW5jaXBsZXMgdW5kZXJseWluZyB0aGUgcmVmZXJlbmNlZCBpdGVtLiBDb25jZXB0cyBub3JtYWxseSBhZGRyZXNzIG1vcmUgZ2VuZXJhbCB0b3BpY3MgdGhhbiBHdWlkZWxpbmVzIGFuZCBzcGFuIGFjcm9zcyBzZXYtZXJhbCB3b3JrIHByb2R1Y3QgYW5kL29yIHRhc2tzL2FjdGl2aXRpZXMuPC9ib2R5PgotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMDU2IiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMkRBIi8+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxOUEiIG5hbWU9IkNoZWNrbGlzdCI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dwUm55dWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxOUEiPgotICAgICAgICAgICAgICA8Ym9keT5BIENoZWNrbGlzdCBpcyBhIHNwZWNpZmljIHR5cGUgb2YgZ3VpZGFuY2UgdGhhdCBpZGVudGlmaWVzIGEgc2VyaWVzIG9mIGl0ZW1zIHRoYXQgbmVlZCB0byBiZSBjb21wbGV0ZWQgb3IgdmVyaS1maWVkLiAgQ2hlY2tsaXN0cyBhcmUgb2Z0ZW4gdXNlZCBpbiByZXZpZXdzIHN1Y2ggYXMgd2Fsa3Rocm91Z2hzIG9yIGluc3BlY3Rpb25zLiA8L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAwNUUiIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyREEiLz4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDFBMyIgbmFtZT0iRXhhbXBsZSI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dwUm56dWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxQTMiPgotICAgICAgICAgICAgICA8Ym9keT5BbiBFeGFtcGxlIGlzIGEgc3BlY2lmaWMgdHlwZSBvZiBHdWlkYW5jZSB0aGF0IHJlcHJlc2VudHMgYSB0eXBpY2FsLCBwYXJ0aWFsbHkgY29tcGxldGVkLCBzYW1wbGUgaW5zdGFuY2Ugb2Ygb25lIG9yIG1vcmUgd29yayBwcm9kdWN0cyBvciBzY2VuYXJpbyBsaWtlIGRlc2NyaXB0aW9ucyBvZiBob3cgVGFzayBtYXkgYmUgcGVyZm9ybWVkLiBFeGFtcGxlcyBjYW4gYmUgcmVsYXRlZCB0byBXb3JrIFByb2R1Y3RzIGFzIHdlbGwgYXMgVGFza3MgdGhhdCBwcm9kdWNlIHRoZW0gYXMgd2VsbCBhcyBhbnkgb3RoZXIgQ29udGVudCBFbGVtZW50LjwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDA1RiIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDJEQSIvPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMUE0IiBuYW1lPSJHdWlkZWxpbmUiPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HcFJuMHVmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMUE0Ij4KLSAgICAgICAgICAgICAgPGJvZHk+QSBHdWlkZWxpbmUgaXMgYSBzcGVjaWZpYyB0eXBlIG9mIGd1aWRhbmNlIHRoYXQgcHJvdmlkZXMgYWRkaXRpb25hbCBkZXRhaWwgb24gaG93IHRvIHBlcmZvcm0gYSBwYXJ0aWN1bGFyIHRhc2sgb3IgZ3JvdXBpbmcgb2YgdGFza3MgKGUuZy4gZ3JvdXBlZCB0b2dldGhlciBhcyBhY3Rpdml0aWVzKSBvciB0aGF0IHByb3ZpZGVzIGFkZGl0aW9uYWwgZGV0YWlsLCBydWxlcywgYW5kIHJlY29tbWVuZGF0aW9ucyBvbiB3b3JrIHByb2R1Y3RzIGFuZCB0aGVpciBwcm9wZXJ0aWVzLiAgQW1vbmdzdCBvdGhlcnMsIGl0IGNhbiBpbmNsdWRlIGRldGFpbHMgYWJvdXQgYmVzdCBwcmFjdGljZXMgYW5kIGRpZmZlcmVudCBhcHByb2FjaGVzIGZvciBkb2luZyB3b3JrLCBob3cgdG8gdXNlIHBhcnRpY3VsYXIgdHlwZXMgb2Ygd29yayBwcm9kdWN0cywgaW5mb3JtYXRpb24gb24gZGlmZmVyZW50IHN1YnR5cGVzIGFuZCB2YXJpYW50cyBvZiB0aGUgd29yayBwcm9kdWN0IGFuZCBob3cgdGhleSBldm9sdmUgdGhyb3VnaG91dCBhIGxpZmVjeWNsZSwgZGlzY3Vzc2lvbnMgb24gc2tpbGxzIHRoZSBwZXJmb3JtaW5nIHJvbGVzIHNob3VsZCBhY3F1aXJlIG9yIGltcHJvdmUgdXBvbiwgbWVhc3VyZW1lbnRzIGZvciBwcm9ncmVzcyBhbmQgbWF0dXJpdHksIGV0Yy48L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MURGNDY3QjAyNUQiIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyREEiLz4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDFCNyIgbmFtZT0iUmVwb3J0Ij4KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3BheHMtZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDFCNyI+Ci0gICAgICAgICAgICAgIDxib2R5PkEgUmVwb3J0IGlzIGEgcHJlZGVmaW5lZCB0ZW1wbGF0ZSBvZiBhIHJlc3VsdCB0aGF0IGlzIGdlbmVyYXRlZCBvbiB0aGUgYmFzaXMgb2Ygb3RoZXIgd29yayBwcm9kdWN0cyBhcyBhbiBvdXRwdXQgZnJvbSBzb21lIGZvcm0gb2YgdG9vbCBhdXRvbWF0aW9uLiBBbiBleGFtcGxlIGZvciBhIHJlcG9ydCB3b3VsZCBiZSBhIHVzZSBjYXNlIG1vZGVsIHN1cnZleSwgd2hpY2ggaXMgZ2VuZXJhdGVkIGJ5IGV4dHJhY3RpbmcgZGlhZ3JhbSBpbmZvcm1hdGlvbiBmcm9tIGEgZ3JhcGhpY2FsIG1vZGVsIGFuZCB0ZXh0dWFsIGluZm9ybWF0aW9uIGZyb20gZG9jdW1lbnRzIGFuZCBjb21iaW5lcyB0aGVzZSB0d28gdHlwZXMgb2YgaW5mb3JtYXRpb24gaW50byBhIHJlcG9ydC48L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAwOTAiIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyREEiLz4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDFCOCIgbmFtZT0iVGVtcGxhdGUiPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HcGF4dC1mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMUI4Ij4KLSAgICAgICAgICAgICAgPGJvZHk+QSBUZW1wbGF0ZSBpcyBhIHNwZWNpZmljIHR5cGUgb2YgZ3VpZGFuY2UgdGhhdCBwcm92aWRlcyBmb3IgYSB3b3JrIHByb2R1Y3QgYSBwcmUtZGVmaW5lZCB0YWJsZSBvZiBjb250ZW50cywgc2VjdGlvbnMsIHBhY2thZ2VzLCBhbmQvb3IgaGVhZGluZ3MsIGEgc3RhbmRhcmRpemVkIGZvcm1hdCwgYXMgd2VsbCBhcyBkZXNjcmlwdGlvbnMgaG93IHRoZSBzZWN0aW9ucyBhbmQgcGFja2FnZXMgYXJlIHN1cHBvc2VkIHRvIGJlIHVzZWQgYW5kIGNvbXBsZXRlZC4gVGVtcGxhdGVzIGNhbm5vdCBvbmx5IGJlIHByb3ZpZGVkIGZvciBkb2N1bWVudHMsIGJ1dCBhbHNvIGZvciBjb25jZXB0dWFsIG1vZGVscyBvciBwaHlzaWNhbCBkYXRhIHN0b3Jlcy48L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAwOTEiIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyREEiLz4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDFDMSIgbmFtZT0iU3VwcG9ydGluZ01hdGVyaWFsIj4KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3BheHUtZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDFDMSI+Ci0gICAgICAgICAgICAgIDxib2R5PlN1cHBvcnRpbmcgTWF0ZXJpYWxzIGlzIGNhdGNoYWxsIGZvciBvdGhlciB0eXBlcyBvZiBndWlkYW5jZSBub3Qgc3BlY2lmaWNhbGx5IGRlZmluZWQgZWxzZXdoZXJlLiBJdCBjYW4gYmUgcmVsYXRlZCB0byBhbGwga2luZHMgb2YgQ29udGVudCBFbGVtZW50cywgaS5lLiBpbmNsdWRpbmcgb3RoZXIgZ3VpZGFuY2UgZWxlbWVudHMuPC9ib2R5PgotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDFERjQ2NkYwMTE5IiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMkRBIi8+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxQ0IiIG5hbWU9IlRvb2xNZW50b3IiPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HcGF4di1mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMUNCIj4KLSAgICAgICAgICAgICAgPGJvZHk+QSBUb29sIE1lbnRvciBpcyBhIHNwZWNpZmljIHR5cGUgb2YgZ3VpZGFuY2UgdGhhdCBzaG93cyBob3cgdG8gdXNlIGEgc3BlY2lmaWMgdG9vbCB0byBhY2NvbXBsaXNoIHNvbWUgcGllY2Ugb2Ygd29yayBhIFdvcmsgUHJvZHVjdCBlaXRoZXIgaW4gdGhlIGNvbnRleHQgb2Ygb3IgaW5kZXBlbmRlbnQgZnJvbSBhIFRhc2sgb3IgQWN0aXZpdHkuPC9ib2R5PgotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMDlCIiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMkRBIi8+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxRTAiIG5hbWU9IldoaXRlcGFwZXIiPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HcGF4dy1mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMUUwIj4KLSAgICAgICAgICAgICAgPGJvZHk+V2hpdGVwYXBlcnMgYXJlIGEgc3BlY2lhbCBDb25jZXB0IGd1aWRhbmNlIHRoYXQgaGF2ZSBiZWVuIGV4dGVybmFsbHkgcmV2aWV3ZWQgb3IgcHVibGlzaGVkIGFuZCBjYW4gYmUgcmVhZCBhbmQgdW5kZXJzdG9vZCBpbiBpc29sYXRpb24gb2Ygb3RoZXIgY29udGVudCBlbGVtZW50cyBhbmQgZ3VpZGFuY2UuPC9ib2R5PgotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMEIwIiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMTk5Ii8+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxRjMiIG5hbWU9IlRlcm1EZWZpbml0aW9uIj4KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3BraXMtZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDFGMyI+Ci0gICAgICAgICAgICAgIDxib2R5PlRlcm1EZWZpbml0aW9ucyBkZWZpbmUgY29uY2VwdHMgYW5kIGFyZSB1c2VkIHRvIGJ1aWxkIHVwIHRoZSBHbG9zc2FyeS4gVGhleSBhcmUgbm90IGRpcmVjdGx5IHJlbGF0ZWQgdG8gQ29udGVudEVsZW1lbnRzLCBidXQgdGhlaXIgcmVsYXRpb25zaGlwIGlzIGJlaW5nIGRlcml2ZWQgd2hlbiB0aGUgVGVybSBpcyB1c2VkIGluIHRoZSBDb250ZW50RWxlbWVudHMgZGVzY3JpcHRpb24gdGV4dC48L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEY0RDJBQjAzQ0EiIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyREEiLz4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRkQ0RUI0MDJCQiIgbmFtZT0iUHJhY3RpY2UiPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HcGtpdC1mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGRDRFQjQwMkJCIj4KLSAgICAgICAgICAgICAgPGJvZHk+QSBQcmFjdGljZSByZXByZXNlbnRzIGEgcHJvdmVuIHdheSBvciBzdHJhdGVneSBvZiBkb2luZyB3b3JrIHRvIGFjaGlldmUgYSBnb2FsIHRoYXQgaGFzIGEgcG9zaXRpdmUgaW1wYWN0IG9uIHdvcmsgcHJvZHVjdCBvciBwcm9jZXNzIHF1YWxpdHkuICBQcmFjdGljZXMgYXJlIGRlZmluZWQgb3J0aG9nb25hbCB0byBtZXRob2RzIGFuZCBwcm9jZXNzZXMuICBUaGV5IGNvdWxkIHN1bW1hcml6ZSBhc3BlY3RzIHRoYXQgaW1wYWN0IG1hbnkgZGlmZmVyZW50IHBhcnRzIG9mIGEgbWV0aG9kIG9yIHNwZWNpZmljIHByb2Nlc3Nlcy4gIEV4YW1wbGVzIGZvciBwcmFjdGljZXMgd291bGQgYmUgJnF1b3Q7TWFuYWdlIFJpc2tzJnF1b3Q7LCAmcXVvdDtDb250aW51b3VzbHkgdmVyaWZ5IHF1YWxpdHkmcXVvdDssICZxdW90O0FyY2hpdGVjdHVyZS1jZW50cmljIGFuZCBjb21wb25lbnQtYmFzZWQgZGV2ZWxvcG1lbnQmcXVvdDssIGV0Yy4KLTwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxREY0NjczMDA1NSIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDJEQSIvPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRkQ1OEI1MDM3MCIgbmFtZT0ic3ViUHJhY3RpY2VzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEZENEVCNDAyQkIiIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDBGRDU4QjQwMjM2Ij4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3FLWXBlZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3FLWXBPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MURGNDFDNjAzQTEiIG5hbWU9ImNvbnRlbnRSZWZlcmVuY2VzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MURGNDFBNTAxQjYiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDFERjQxQzYwM0EwIj4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3FVSmstZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3FVSmt1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxREU1RDQ3MDBGQiIgbmFtZT0iV29ya1Byb2R1Y3QiIGlzQWJzdHJhY3Q9InRydWUiPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HcGtpdS1mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERTVENDcwMEZCIj4KLSAgICAgICAgICAgICAgPGJvZHk+VGhpcyBpcyB0aGUgR3VpZGFuY2UgVHlwZXMgcGFja2FnZSdzIGV4dGVuc2lvbiBvZiBXb3JrIFByb2R1Y3QgKGRlZmluZWQgaW4gQ29udGVudCBFbGVtZW50cykgcHJvdmlkaW5nIGFkZGl0b25hbCBhc3NvY2lhdGlvbnMuPC9ib2R5PgotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDFERTVFNDQwM0UzIiBuYW1lPSJyZXBvcnRzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxQjciIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDFERTVFNDQwM0UxIj4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3FCT3ItZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3FCT3J1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MURFNUU2MTAyQ0UiIG5hbWU9InRlbXBsYXRlcyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMUI4IiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQxREU1RTYxMDJDQyI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0dxS1lsdWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0dxS1lsZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDI3QUJDODkwMzdDIiBuYW1lPSJ0b29sTWVudG9ycyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMUNCIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQyN0FCQzg4MDJEMCI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0dxVUpvLWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0dxVUpvdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDREOEY1MTgwMEY3IiBuYW1lPSJlc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDFENSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0NEQ4RjUxODAwRjUiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HcVVKdE9mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HcVVKcy1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDFERTVFRTEwMTExIiBuYW1lPSJUYXNrIj4KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3BraXYtZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREU1RUUxMDExMSI+Ci0gICAgICAgICAgICAgIDxib2R5PlRoaXMgaXMgdGhlIEd1aWRhbmNlIFR5cGVzIHBhY2thZ2UncyBleHRlbnNpb24gb2YgVGFzayAoZGVmaW5lZCBpbiBDb250ZW50IEVsZW1lbnRzKSBwcm92aWRpbmcgYWRkaXRpb25hbCBhc3NvY2lhdGlvbnMuPC9ib2R5PgotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDFERTVGRjcwMzA2IiBuYW1lPSJ0b29sTWVudG9ycyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMUNCIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQxREU1RkY3MDMwNCI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0dxS1luLWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0dxS1ludWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDREOEY1MTQwMjI4IiBuYW1lPSJlc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDFENSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0NEQ4RjUxNDAyMjYiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HcVVKcmVmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HcVVKck9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDFERjQxQTUwMUI2IiBuYW1lPSJDb250ZW50RWxlbWVudCIgaXNBYnN0cmFjdD0idHJ1ZSI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dwdVRzLWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURGNDFBNTAxQjYiPgotICAgICAgICAgICAgICA8Ym9keT5UaGlzIGlzIHRoZSBHdWlkYW5jZSBUeXBlcyBwYWNrYWdlJ3MgZXh0ZW5zaW9uIG9mIENvbnRlbnQgRWxlbWVudCAoZGVmaW5lZCBpbiBDb250ZW50IEVsZW1lbnRzKSBwcm92aWRpbmcgYWRkaXRvbmFsIGFzc29jaWF0aW9ucy48L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAyNzMiIG5hbWU9InN1cHBvcnRpbmdNYXRlcmlhbHMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDFDMSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAyNzAiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HcDNkcU9mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HcDNkcC1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDI5MSIgbmFtZT0iY29uY2VwdHNBbmRQYXBlcnMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDE5OSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAyOEUiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HcDNkc2VmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HcDNkc09mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxREU1RDczMDIxMCIgbmFtZT0iY2hlY2tsaXN0cyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMTlBIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQxREU1RDczMDIwRSI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0dwM2R1dWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0dwM2R1ZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDFERTVERDcwMTRFIiBuYW1lPSJndWlkZWxpbmVzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxQTQiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDFERTVERDcwMTRDIj4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3FCT3B1ZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3FCT3BlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MURFNUU1NTAwQzciIG5hbWU9ImV4YW1wbGVzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxQTMiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDFERTVFNTUwMEM1Ij4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3FCT3VPZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3FCT3QtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MjEzQzkzRjAwNDkiIG5hbWU9ImFzc2V0cyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDIxM0M5MTMwMkM1IiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQyMTNDOTNEMDMyMSI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0dxVUpuT2ZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0dxVUptLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWUxaEFPMG9FZHV0Q0xFQ045NkJOdyIgbmFtZT0idGVybURlZmluaXRpb24iIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDFGMyIgYXNzb2NpYXRpb249Il8tZDh3TU8wb0VkdXRDTEVDTjk2Qk53Ij4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfLWdCejBlMG9FZHV0Q0xFQ045NkJOdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfLWdCejBPMG9FZHV0Q0xFQ045NkJOdyIvPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyMTNDOTEzMDJDNSIgbmFtZT0iUmV1c2FibGVBc3NldCI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dwdVR1LWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjEzQzkxMzAyQzUiPgotICAgICAgICAgICAgICA8Ym9keT5BIFJldXNhYmxlIEFzc2V0IHByb3ZpZGVzIGEgc29sdXRpb24gdG8gYSBwcm9ibGVtIGZvciBhIGdpdmVuIGNvbnRleHQuIFRoZSBhc3NldCBtYXkgaGF2ZSBhIHZhcmlhYmlsaXR5IHBvaW50LCB3aGljaCBpcyBhIGxvY2F0aW9uIGluIHRoZSBhc3NldCB0aGF0IG1heSBoYXZlIGEgdmFsdWUgcHJvdmlkZWQgb3IgY3VzdG9taXplZCBieSB0aGUgYXNzZXQgY29uc3VtZXIuIFRoZSBhc3NldCBoYXMgcnVsZXMgZm9yIHVzYWdlIHdoaWNoIGFyZSB0aGUgaW5zdHJ1Y3Rpb25zIGRlc2NyaWJpbmcKLWhvdyB0aGUgYXNzZXQgc2hvdWxkIGJlIHVzZWQuCi08L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MjJGQTBDMzAwN0MiIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyREEiLz4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDFENSIgbmFtZT0iRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIj4KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3B1VHYtZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDFENSI+Ci0gICAgICAgICAgICAgIDxib2R5PkVzdGltYXRpb24gQ29uc2lkZXJhdGlvbnMgcXVhbGlmeSB0aGUgdXNhZ2UgYW5kIGFwcGxpY2F0aW9uIG9mIGVzdGltYXRpb24gbWV0cmljcyBpbiB0aGUgZGV2ZWxvcG1lbnQgb2YgYW4gYWN0dWFsIGVzdGltYXRlLjwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjRBMUQ2MDI0NSIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDJEQSIvPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMjcwIiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAyNzEgXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDI3MyI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dwM2RvZWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAyNzAiPgotICAgICAgICAgICAgICA8Ym9keT5Db250ZW50IEVsZW1lbnRzIGNhbiBiZSByZWxhdGVkIHRvIGFueSBudW1iZXIgb2YgU3VwcG9ydGluZyBNYXRlcmlhbCBndWlkYW5jZSBlbGVtZW50cy48L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAyNzEiIG5hbWU9Il9jb250ZW50RWxlbWVudCIgdmlzaWJpbGl0eT0icHJpdmF0ZSIgdHlwZT0iXzNBREM3Qjc0MDIyRDQxREY0MUE1MDFCNiIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDI3MCI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0dwM2RwZWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0dwM2RwT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRFbmQ+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAyOEUiIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDI4RiBfM0FEQzdCNzQwMjJENDBGMzZDOTIwMjkxIj4KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3AzZHF1ZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDI4RSI+Ci0gICAgICAgICAgICAgIDxib2R5PkNvbnRlbnQgRWxlbWVudHMgY2FuIHJlZmVyIHRvIGFueSBudW1iZXIgb2YgQ29uY2VwdCBndWlkYW5jZS4gPC9ib2R5PgotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICA8b3duZWRFbmQgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMjhGIiBuYW1lPSJfY29udGVudEVsZW1lbnQiIHZpc2liaWxpdHk9InByaXZhdGUiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MURGNDFBNTAxQjYiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAyOEUiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HcDNkcnVmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HcDNkcmVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkRW5kPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDFERTVENzMwMjBFIiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0MURFNUQ3MzAyMEYgXzNBREM3Qjc0MDIyRDQxREU1RDczMDIxMCI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dwM2RzLWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURFNUQ3MzAyMEUiPgotICAgICAgICAgICAgICA8Ym9keT5Qcm92aWRlcyBjaGVjayBwb2ludHMgcmVsYXRlZCB0byBhIHBhcnRpY3VsYXIgY29udGVudCBlbGVtZW50cy4gIFRoZXNlIGFyZSB0eXBpY2FsbHkgdXNlZCBpbiByZXZpZXdzIGFuZCBpbnNwZWN0aW9ucyBvbiB3b3JrIHByb2R1Y3RzLgotCi08L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MURFNUQ3MzAyMEYiIG5hbWU9Il9jb250ZW50RWxlbWVudCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDFERjQxQTUwMUI2IiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDFERTVENzMwMjBFIj4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3AzZHQtZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3AzZHR1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEVuZD4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxREU1REQ3MDE0QyIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDFERTVERDcwMTREIF8zQURDN0I3NDAyMkQ0MURFNURENzAxNEUiPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HcDNkdk9mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERTVERDcwMTRDIj4KLSAgICAgICAgICAgICAgPGJvZHk+VGhpcyBhc3NvY2lhdGlvbiBwcm92aWRlcyBhY2Nlc3MgdG8gZGV0YWlsZWQgR3VpZGVsaW5lcyByZWxhdGVkIHRvIHRoaXMgQ29udGVudCBFbGVtZW50LjwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxREU1REQ3MDE0RCIgbmFtZT0iX2NvbnRlbnRFbGVtZW50IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MURGNDFBNTAxQjYiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MURFNURENzAxNEMiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HcUJPby1mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HcUJPb3VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkRW5kPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDFERTVFNDQwM0UxIiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0MURFNUU0NDAzRTIgXzNBREM3Qjc0MDIyRDQxREU1RTQ0MDNFMyI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dxQk9xT2ZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURFNUU0NDAzRTEiPgotICAgICAgICAgICAgICA8Ym9keT5BIFJlcG9ydCBleHRyYWN0cyBpbmZvcm1hdGlvbiBhYm91dCBvbmUgb3IgbW9yZSBXb3JrIFByb2R1Y3Q7IG5vcm1hbGx5IGRpcmVjdGx5IGZyb20gYSB0b29sIHRoYXQgbWFpbnRhaW5zIHRoZSBXb3JrIFByb2R1Y3RzLiBGb3IgZXhhbXBsZSwgYSBSZXBvcnQgY2FuIHByZXNlbnQgZGV0YWlscyBvZiBhbiBBcnRpZmFjdCBvciBhIHNldCBvZiBBcnRpZmFjdHMgZm9yIHVzZSBpbiBhIHRlY2huaWNhbCByZXZpZXcuIDwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxREU1RTQ0MDNFMiIgbmFtZT0iX3dvcmtQcm9kdWN0IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MURFNUQ0NzAwRkIiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MURFNUU0NDAzRTEiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HcUJPck9mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HcUJPcS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkRW5kPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDFERTVFNTUwMEM1IiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0MURFNUU1NTAwQzYgXzNBREM3Qjc0MDIyRDQxREU1RTU1MDBDNyI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dxQk9zZWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURFNUU1NTAwQzUiPgotICAgICAgICAgICAgICA8Ym9keT5Qcm92aWRlcyBhIHNhbXBsZSBvZiB3aGF0IHRoZSB3b3JrIHByb2R1Y3QgbWF5IGxvb2sgbGlrZSwgYW4gYWN0dWFsIGluc3RhbmNlLjwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxREU1RTU1MDBDNiIgbmFtZT0iX2NvbnRlbnRFbGVtZW50IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MURGNDFBNTAxQjYiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MURFNUU1NTAwQzUiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HcUJPdGVmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HcUJPdE9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkRW5kPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDFERTVFNjEwMkNDIiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0MURFNUU2MTAyQ0QgXzNBREM3Qjc0MDIyRDQxREU1RTYxMDJDRSI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dxQk91dWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURFNUU2MTAyQ0MiPgotICAgICAgICAgICAgICA8Ym9keT5Qcm92aWRlcyBkZXRhaWxlZCBndWlkYW5jZSBvbiBob3cgdG8gcHJvZHVjZSB0aGUgd29yayBwcm9kdWN0IGluZGVwZW5kZW50IG9mIGEgc3BlY2lmaWMgc2V0IG9mIHRhc2tzIG9yIFdCUy4gIE1heSBjb250YWluIHNwZWNpZmljIGFsZ29yaXRobXMgb3IgYWx0ZXJuYXRpdmUgZGV2ZWxvcG1lbnQgYXBwcm9hY2hlcy48L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MURFNUU2MTAyQ0QiIG5hbWU9Il93b3JrUHJvZHVjdCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDFERTVENDcwMEZCIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDFERTVFNjEwMkNDIj4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3FLWWstZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3FLWWt1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEVuZD4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxREU1RkY3MDMwNCIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDFERTVGRjcwMzA1IF8zQURDN0I3NDAyMkQ0MURFNUZGNzAzMDYiPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HcUtZbU9mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERTVGRjcwMzA0Ij4KLSAgICAgICAgICAgICAgPGJvZHk+TGlua3MgVGFza3Mgd2l0aCBUb29sIE1lbnRvcnMgd2hpY2ggYXJlIGEgc3BlY2lmaWMgdHlwZSBvZiBndWlkYW5jZSB0aGF0IHNob3cgaG93IHRvIHVzZSBhIHNwZWNpZmljIHRvb2wgdG8gcGVyZm9ybSB0aGUgVGFzay48L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MURFNUZGNzAzMDUiIG5hbWU9Il90YXNrIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MURFNUVFMTAxMTEiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MURFNUZGNzAzMDQiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HcUtZbk9mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HcUtZbS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkRW5kPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGRDU4QjQwMjM2IiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0MEZENThCNTAzNzAgXzNBREM3Qjc0MDIyRDQwRkQ1OEI1MDM3QSI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dxS1lvZWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEZENThCNDAyMzYiPgotICAgICAgICAgICAgICA8Ym9keT5BIFByYWN0aWNlIGNhbiBiZSBjb21wb3NlZCBvZiBvdGhlciBQcmFjdGljZXMuPC9ib2R5PgotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICA8b3duZWRFbmQgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGRDU4QjUwMzdBIiBuYW1lPSJfcHJhY3RpY2UiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRkQ0RUI0MDJCQiIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQwRkQ1OEI0MDIzNiIvPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDFERjQxQzYwM0EwIiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0MURGNDFDNjAzQTEgXzNBREM3Qjc0MDIyRDQxREY0MUM2MDNBMiI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dxS1lxT2ZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURGNDFDNjAzQTAiPgotICAgICAgICAgICAgICA8Ym9keT5BIFByYWN0aWNlIGNhbiByZWZlcmVuY2UgYW55IENvbnRlbnQgRWxlbWVudC4gIFRoZSBhc3NvY2lhdGlvbiBleHByZXNzZXMgdGhhdCB0aGlzIENvbnRlbnQgRWxlbWVudCBpcyBwYXJ0IG9mIG9yIGJlbG9uZ3MgdG8gdGhpcyBQcmFjdGljZS48L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MURGNDFDNjAzQTIiIG5hbWU9Il9wcmFjdGljZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGRDRFQjQwMkJCIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDFERjQxQzYwM0EwIj4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3FVSmx1ZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3FVSmxlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEVuZD4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyMTNDOTNEMDMyMSIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDIxM0M5M0YwMDQ5IF8zQURDN0I3NDAyMkQ0MjEzQzkzRjAwOTkiPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HcVVKbU9mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxM0M5M0QwMzIxIj4KLSAgICAgICAgICAgICAgPGJvZHk+QSB3b3JrIHByb2R1Y3QgaXMgcmVsYXRlZCB0byBvbmUgb3IgbW9yZSBhc3NldHMgdG8gPC9ib2R5PgotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICA8b3duZWRFbmQgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDIxM0M5M0YwMDk5IiBuYW1lPSJfY29udGVudEVsZW1lbnQiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQxREY0MUE1MDFCNiIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQyMTNDOTNEMDMyMSI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0dxVUpuLWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0dxVUpudWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRFbmQ+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MjdBQkM4ODAyRDAiIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQyN0FCQzg5MDM3QyBfM0FEQzdCNzQwMjJENDI3QUJDODkwMzdFIj4KLSAgICAgICAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MjdBQkM4OTAzN0UiIG5hbWU9Il93b3JrUHJvZHVjdCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDFERTVENDcwMEZCIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDI3QUJDODgwMkQwIj4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3FVSnB1ZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3FVSnBlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEVuZD4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQ0RDhGNTE0MDIyNiIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDREOEY1MTQwMjI3IF8zQURDN0I3NDAyMkQ0NEQ4RjUxNDAyMjgiPgotICAgICAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQ0RDhGNTE0MDIyNyIgbmFtZT0iX3Rhc2siIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQxREU1RUUxMDExMSIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQ0RDhGNTE0MDIyNiI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0dxVUpxdWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0dxVUpxZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRFbmQ+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0NEQ4RjUxODAwRjUiIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQ0RDhGNTE4MDBGNiBfM0FEQzdCNzQwMjJENDREOEY1MTgwMEY3Ij4KLSAgICAgICAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0NEQ4RjUxODAwRjYiIG5hbWU9Il93b3JrUHJvZHVjdCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDFERTVENDcwMEZCIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDREOEY1MTgwMEY1Ij4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3FVSnNlZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3FVSnNPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEVuZD4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXy1kOHdNTzBvRWR1dENMRUNOOTZCTnciIG1lbWJlckVuZD0iXy1lMWhBTzBvRWR1dENMRUNOOTZCTncgXy1nQnowdTBvRWR1dENMRUNOOTZCTnciPgotICAgICAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iXy1nQnowdTBvRWR1dENMRUNOOTZCTnciIG5hbWU9IiIgdmlzaWJpbGl0eT0icHJpdmF0ZSIgdHlwZT0iXzNBREM3Qjc0MDIyRDQxREY0MUE1MDFCNiIgYXNzb2NpYXRpb249Il8tZDh3TU8wb0VkdXRDTEVDTjk2Qk53Ij4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfLWdCejFPMG9FZHV0Q0xFQ045NkJOdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfLWdCejAtMG9FZHV0Q0xFQ045NkJOdyIvPgotICAgICAgICAgICAgPC9vd25lZEVuZD4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpQYWNrYWdlIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyMjUiIG5hbWU9IkNhdGVnb3JpZXMiPgotICAgICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfR3JnY2MtZlhFZHVxSG9PSmJVUlpSdyIgc291cmNlPSJ1bWwyLmRpYWdyYW1zIiByZWZlcmVuY2VzPSJfM0FEQzdCNzQwMjJENDBGNDhGQ0UwMDYwIj4KLSAgICAgICAgICAgIDxjb250ZW50cyB4bWk6dHlwZT0ibm90YXRpb246RGlhZ3JhbSIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGNDhGQ0UwMDYwIiB0eXBlPSJDbGFzcyIgbmFtZT0iQ2F0ZWdvcml6YXRpb25zIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEV1VzT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyNTkiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRFdVcy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IRFdVdE9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERXVXRlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRFdVdHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEV1V0LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRFdVdU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hEV1V1ZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRFdVdXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hEV1V1LWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRFdVdk9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hEV1V2ZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRFdVdnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRFdVdi1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IRFdVc2VmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hEV1VzdWZYRWR1cUhvT0piVVJaUnciIHg9IjE1NjEyIiB5PSI5ODgwIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRFdVd09mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjk2Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERXVXctZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSERXVXhPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjQwMTMiIGhlaWdodD0iMTExNyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEV1V4ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERXVXh1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRFdVeC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERXVXlPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRFdVeWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERXVXl1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRFdVeS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERXVXpPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRFdVemVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERXVXp1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSERXVXotZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSERXVXdlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMTI2MzIyNTYiIHNob3dQYXJlbnQ9Ik5hbWUiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSERXVXd1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMjAyOTQiIHk9IjEzNDExIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRFdVME9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjMwIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERnRm9PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSERnRm9lZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEZ0ZvdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERnRm8tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRGdGcE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERnRnBlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRGdGcHVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERnRnAtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRGdGcU9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERnRnFlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRGdGcXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERnRnEtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSERnRnJPZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSERXVTBlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRFdVMHVmWEVkdXFIb09KYlVSWlJ3IiB4PSIyMTE5MiIgeT0iOTkzMSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERnRjgtZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDIzMSI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEZ0Y5dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hEZ0Y5LWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRGdGLU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEZ0YtZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERnRi11ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEZ0YtLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSERnRl9PZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEZ0ZfZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSERnRl91ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEZ0ZfLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSERnR0FPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEZ0dBZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hEZ0dBdWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hEZ0Y5T2ZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSERnRjllZlhFZHVxSG9PSmJVUlpSdyIgeD0iMjYyNzIiIHk9Ijk5MzEiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEZ0dKdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyQkMiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRGdHS2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IRGdHS3VmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iNDQ3MCIgaGVpZ2h0PSIxMTE3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERnR0stZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRGdHTE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEZ0dMZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRGdHTHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hEZ0dMLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRGdHTU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hEZ0dNZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRGdHTXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hEZ0dNLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRGdHTk9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRGdHTmVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IRGdHSi1mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIxMjYzMjI1NiIgc2hvd1BhcmVudD0iTmFtZSIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRGdHS09mWEVkdXFIb09KYlVSWlJ3IiB4PSIyNzEyNyIgeT0iMTM0MTEiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEcFBsdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyM0EiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHBQbWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IRHBQbXVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERwUG0tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHBQbk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEcFBuZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHBQbnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hEcFBuLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHBQb09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hEcFBvZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHBQb3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hEcFBvLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHBQcE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRHBQcGVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IRHBQbC1mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hEcFBtT2ZYRWR1cUhvT0piVVJaUnciIHg9IjI5NzUxIiB5PSI5OTMxIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHBQeWVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMUNCIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERwUHpPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSERwUHplZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEcFB6dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERwUHotZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHBQME9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERwUDBlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRHBQMHVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERwUDAtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRHBQMU9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERwUDFlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRHBQMXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERwUDEtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSERwUDJPZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSERwUHl1ZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMTI2MzIyNTYiIHNob3dQYXJlbnQ9Ik5hbWUiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSERwUHktZlhFZHVxSG9PSmJVUlpSdyIgeD0iMzQ0NTkiIHk9IjEzMjM1Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHBQMmVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjU4Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERwUDNPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSERwUDNlZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEcFAzdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERwUDMtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHBQNE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERwUDRlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRHBQNHVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERwUDQtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRHBQNU9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERwUDVlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRHBQNXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERwUDUtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSERwUDZPZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSERwUDJ1ZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRHBQMi1mWEVkdXFIb09KYlVSWlJ3IiB4PSIzNTY2MSIgeT0iOTkzMSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSER6QW11ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI0NCI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEekFuZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hEekFudWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHpBbi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEekFvT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSER6QW9lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEekFvdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSER6QW8tZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEekFwT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSER6QXBlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEekFwdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSER6QXAtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEekFxT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hEekFxZWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hEekFtLWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJOb25lIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSER6QW5PZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTYzNzQiIHk9IjM5NDUiIHdpZHRoPSI0MjMzIiBoZWlnaHQ9IjIxNzUiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEekE0T2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjk0RUI5MDAwRkMiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHpBNC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IRHpBNU9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMzU3MiIgaGVpZ2h0PSIxMTY4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSER6QTVlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHpBNXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEekE1LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHpBNk9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hEekE2ZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHpBNnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hEekE2LWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHpBN09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hEekE3ZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHpBN3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRHpBNy1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IRHpBNGVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIxMjYzMjI1NiIgc2hvd1BhcmVudD0iTmFtZSIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRHpBNHVmWEVkdXFIb09KYlVSWlJ3IiB4PSIzODg1NCIgeT0iMTMzMDEiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEekE4T2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUJERUJBMjAwOUMiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHpBOC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IRHpBOU9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMzAxNCIgaGVpZ2h0PSI4OTciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHpBOWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEekE5dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSER6QTktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEekEtT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSER6QS1lZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEekEtdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSER6QS0tZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEekFfT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSER6QV9lZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEekFfdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hEekFfLWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hEekE4ZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSER6QTh1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMzg3NzciIHk9IjEwMDE2Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRDh4bE9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjRFIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEQ4eGwtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEQ4eG1PZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEOHhtZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEQ4eG11ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRDh4bS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEQ4eG5PZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRDh4bmVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEQ4eG51ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRDh4bi1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEQ4eG9PZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRDh4b2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEQ4eG91ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEQ4eG8tZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEQ4eGxlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRDh4bHVmWEVkdXFIb09KYlVSWlJ3IiB4PSIzNDAzIiB5PSI5OTMxIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRDh4cmVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjlFIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEQ4eHNPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEQ4eHNlZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjQxODIiIGhlaWdodD0iMTExNyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEOHhzdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEQ4eHMtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRDh4dE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEQ4eHRlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRDh4dHVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEQ4eHQtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRDh4dU9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEQ4eHVlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRDh4dXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEQ4eHUtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEQ4eHZPZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEQ4eHJ1ZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMTI2MzIyNTYiIHNob3dQYXJlbnQ9Ik5hbWUiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEQ4eHItZlhFZHVxSG9PSmJVUlpSdyIgeD0iOTQ0OCIgeT0iMTI2NjciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEOHh2ZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyMjciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRDh4d09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IRDh4d2VmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEQ4eHd1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRDh4dy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEOHh4T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRDh4eGVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hEOHh4dWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRDh4eC1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hEOHh5T2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRDh4eWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hEOHh5dWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRDh4eS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRDh4ek9mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IRDh4dnVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iTm9uZSIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hEOHh2LWZYRWR1cUhvT0piVVJaUnciIHg9IjExMDA2IiB5PSI5OTE0Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il85dWItRU9vakVkdVZBN3Z0NXFiSUpRIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjZDIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfOXVsSUFPb2pFZHVWQTd2dDVxYklKUSIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfOXVsSUFlb2pFZHVWQTd2dDVxYklKUSIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iXzl1bElBdW9qRWR1VkE3dnQ1cWJJSlEiIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfOXVsSUEtb2pFZHVWQTd2dDVxYklKUSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il85dWxJQk9vakVkdVZBN3Z0NXFiSUpRIiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfOXVsSUJlb2pFZHVWQTd2dDVxYklKUSIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il85dWxJQnVvakVkdVZBN3Z0NXFiSUpRIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfOXVsSUItb2pFZHVWQTd2dDVxYklKUSIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il85dWxJQ09vakVkdVZBN3Z0NXFiSUpRIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfOXVsSUNlb2pFZHVWQTd2dDVxYklKUSIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il85dWxJQ3VvakVkdVZBN3Z0NXFiSUpRIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfOXVsSUMtb2pFZHVWQTd2dDVxYklKUSIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfOXVsSURPb2pFZHVWQTd2dDVxYklKUSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfOXViLUVlb2pFZHVWQTd2dDVxYklKUSIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1BhcmVudD0iTmFtZSIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il85dWItRXVvakVkdVZBN3Z0NXFiSUpRIiB4PSIxNjgyNyIgeT0iMjA4OSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxEaWFncmFtU3R5bGUiIHhtaTppZD0iX0dyZ2NkZWZYRWR1cUhvT0piVVJaUnciIGRlc2NyaXB0aW9uPSJ8VGhlIENhdGVnb3JpZXMgcGFja2FnZSBjb250YWlucyBjbGFzc2VzIHRoYXQgcHJvdmlkZSBkaWZmZXJlbnQgd2F5cyB0byBsb2dpY2FsbHkgY2F0ZWdvcml6ZSBjb250ZW50IGVsZW1lbnRzLiAgSW4gYWRkaXRpb24gdG8gc3RhbmRhcmQgY2F0ZWdvcmllcyB0aGF0IGhhdmUgYmVlbiBwcmVkZWZpbmVkIGZvciBtb3N0IGNvbnRlbnQgZWxlbWVudCB0eXBlcyBpbiB0aGlzIG1ldGEtbW9kZWwsIGl0IHByb3ZpZGVzIHRoZSBjYXBhYmlsaXR5IGZvciB1c2VycyB0byBkZWZpbmUgdGhlaXIgb3duIGN1c3RvbSBjYXRlZ29yaWVzIG9uIGNvbnRlbnQgZWxlbWVudHMuICBDdXN0b20gY2F0ZWdvcmllcyBjYW4gYmUgdXNlZCB0byBjYXRlZ29yaXplIGNvbnRlbnQgYmFzZWQgb24gdGhlIHVzZXIncyBjcml0ZXJpYSBhcyB3ZWxsIGFzIHRvIGRlZmluZSB3aG9sZSB0cmVlLXN0cnVjdHVyZXMgb2YgbmVzdGVkIGNhdGVnb3JpZXMgYWxsb3dpbmcgdGhlIHVzZXIgdG8gc3lzdGVtYXRpY2FsbHkgbmF2aWdhdGUgYW5kIGJyb3dzZSBtZXRob2QgY29udGVudCBhbmQgcHJvY2Vzc2VzIGJhc2VkIG9uIHRoZXNlIGNhdGVnb3JpZXMuICBGb3IgZXhhbXBsZSwgb25lIGNvdWxkIGNyZWF0ZSBhIGN1c3RvbSBjYXRlZ29yeSB0byBsb2dpY2FsbHkgb3JnYW5pemUgY29udGVudCByZWxldmFudCBmb3IgdGhlIHVzZXIncyBkZXZlbG9wbWVudCBvcmdhbml6YXRpb24gZGVwYXJ0bWVudHM7IGUuZy4gYSAmcXVvdDtUZXN0aW5nJnF1b3Q7IGNhdGVnb3J5IHRoYXQgZ3JvdXBzIHRvZ2V0aGVyIGFsbCByb2xlcywgd29yayBwcm9kdWN0cywgdGFza3MsIGFuZCBndWlkYW5jZSBlbGVtZW50IHJlbGV2YW50IHRvIHRlc3RpbmcuICBBbm90aGVyIGV4YW1wbGUgd291bGQgYmUgY2F0ZWdvcmllcyB0aGF0IGV4cHJlc3MgbGljZW5zaW5nIGxldmVscyBvZiB0aGUgY29udGVudCBncm91cGluZyBmcmVlbHkgZGlzdHJpYnV0YWJsZSBtZXRob2QgY29udGVudCB2ZXJzdXMgY29udGVudCB0aGF0IHJlcHJlc2VudCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgYW5kIHJlcXVpcmVzIGEgbGljZW5zZSB0byBiZSBwdXJjaGFzZWQgdG8gYmUgYWJsZSB0byB1c2UgaXQuIFRoaXMgZGlhZ3JhbSBzaG93cyB0aGUgdGF4b25vbXkgb2YgYWxsIHByZS1kZWZpbmVkL3N0YW5kYXJkIGNhdGVnb3J5IG1ldGEtY2xhc3NlcyBhcyB3ZWxsIGFzIHRoZSBkZWZpbml0aW9uIGZvciBDdXN0b20gQ2F0ZWdvcnkgY2xhc3Nlcywgd2hpY2ggY2FuIGJlIGRlZmluZWQgYnkgdGhlIHVzZXIgdG8gY2F0ZWdvcml6ZXMgYW55IENvbnRlbnQgRWxlbWVudCBhcyB3ZWxsIGFzIGNhbiBiZSBuZXN0ZWQgd2l0aCBvdGhlciBDYXRlZ29yaWVzIChpLmUuIG90aGVyIGNhdGVnb3JpZXMgY2FuIGJlIGRlZmluZWQgdG8gYmUgYSBzdWItY2F0ZWdvcnkgb2YgYW55IGN1c3RvbSBjYXRlZ29yeSkuJiN4QTt8JiN4QTsiLz4KLSAgICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSERnRnJlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDIxNiIgc291cmNlPSJfSERXVTBPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSERXVXNPZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEZ0ZzT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERnRnN1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEZ0ZzLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRGdGc2VmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERnRnRPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDIxOSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERnRnR1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSERnRnRlZlhFZHVxSG9PSmJVUlpSdyIgeD0iMjAiIHk9Ii0yOTYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRGdGdC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDIxOSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERnRnVlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hEZ0Z1T2ZYRWR1cUhvT0piVVJaUnciIHg9IjQwOSIgeT0iMjcyIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERnRnV1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMjE3Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRGdGdk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hEZ0Z1LWZYRWR1cUhvT0piVVJaUnciIHg9Ii04OCIgeT0iLTI3MCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEZ0Z2ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAyMTciPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEZ0Z2LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hEZ0Z2dWZYRWR1cUhvT0piVVJaUnciIHg9Ii03NDgiIHk9Ii01OTIiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRGdGd09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMjE5Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRGdGd3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRGdGdy1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRGdGd2VmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERnRnhPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMjE3Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRGdGeHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRGdGeC1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRGdGeGVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERnRnlPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAyMTkiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEZ0Z5dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hEZ0Z5LWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hEZ0Z5ZWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRGdGek9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMjE3Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRGdGenVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hEZ0Z6LWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hEZ0Z6ZWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IRGdGcnVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hEZ0ZyLWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy04NTUsIC00MiwgNDAyMSwgOF0kWy0zMzE4LCAtNDIsIDE1NTcsIDhdIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IRGdGME9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMTU5IiBzb3VyY2U9Il9IRFdVd09mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IRFdVME9mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERnRjAtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRGdGMWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERnRjF1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hEZ0YxT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRGdGMS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMTVDIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRGdGMmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRGdGMk9mWEVkdXFIb09KYlVSWlJ3IiB4PSItMjAiIHk9IjQ0OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEZ0YydWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMTVDIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRGdGM09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSERnRjItZlhFZHVxSG9PSmJVUlpSdyIgeD0iOTgiIHk9Ii02MzYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRGdGM2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxNUEiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEZ0YzLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSERnRjN1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTEyMyIgeT0iNDgyIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERnRjRPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDE1QSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERnRjR1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSERnRjRlZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTI0MSIgeT0iLTgwNSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEZ0Y0LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxNUMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEZ0Y1ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hEZ0Y1dWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hEZ0Y1T2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRGdGNS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxNUEiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEZ0Y2ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hEZ0Y2dWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hEZ0Y2T2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRGdGNi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDE1QyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERnRjdlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSERnRjd1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSERnRjdPZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEZ0Y3LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxNUEiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEZ0Y4ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSERnRjh1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSERnRjhPZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hEZ0YwZWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSERnRjB1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTI2MiwgLTU2NywgLTgsIDI5ODhdJFstMjYyLCAtMzA3MywgLTgsIDQ4Ml0iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hEZ0dBLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxOTQiIHNvdXJjZT0iX0hEZ0Y4LWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hEZ0Y4LWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRGdHQnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEZ0dDT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRGdHQ2VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSERnR0ItZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEZ0dDdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxOTciPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEZ0dET2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hEZ0dDLWZYRWR1cUhvT0piVVJaUnciIHg9Ii05OSIgeT0iLTI2MiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEZ0dEZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMTk3Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRGdHRC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSERnR0R1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTExMTkiIHk9IjMxNiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEZ0dFT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxOTUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEZ0dFdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSERnR0VlZlhFZHVxSG9PSmJVUlpSdyIgeT0iMzk2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERnR0UtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxOTUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEZ0dGZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hEZ0dGT2ZYRWR1cUhvT0piVVJaUnciIHg9Ii0xMTgiIHk9Ii0zMjEiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRGdHRnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMTk3Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRGdHR09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRGdHR2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRGdHRi1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERnR0d1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMTk1Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRGdHSE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRGdHSGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRGdHRy1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERnR0h1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxOTciPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEZ0dJT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hEZ0dJZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hEZ0dILWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRGdHSXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMTk1Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRGdHSk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hEZ0dKZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hEZ0dJLWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IRGdHQk9mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hEZ0dCZWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy04NTUsIDc2LCAtODU1LCA3Nl0kWy0zMTgzLCA3NiwgLTMxODMsIDc2XSRbLTMxODMsIDE0NjQsIC0zMTgzLCAxNDY0XSRbLTQwNiwgMTQ2NCwgLTQwNiwgMTQ2NF0kWy00MDYsIDQ4MiwgLTQwNiwgNDgyXSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSERnR051ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDE3NyIgc291cmNlPSJfSERnR0p1ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSERnRjgtZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEZ0dPZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERnR08tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEZ0dQT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRGdHT3VmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERnR1BlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDE3QSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERnR1AtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSERnR1B1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTUxIiB5PSIxNTAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRGdHUU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDE3QSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERnR1F1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hEZ0dRZWZYRWR1cUhvT0piVVJaUnciIHg9IjcwNCIgeT0iLTEwODIiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRGdHUS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxNzgiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEZ0dSZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSERnR1JPZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTIiIHk9Ii0yNDEiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRGdHUnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMTc4Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRGdHU09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRGdHUi1mWEVkdXFIb09KYlVSWlJ3IiB4PSItMzk5IiB5PSI3OTYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRGdHU2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMTdBIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRGdHUy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRGdHVE9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRGdHU3VmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERnR1RlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMTc4Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRGdHVC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRGdHVU9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRGdHVHVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERnR1VlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxN0EiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEcFBrT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hEcFBrZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hEZ0dVdWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHBQa3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMTc4Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHBQbE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hEcFBsZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hEcFBrLWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IRGdHTi1mWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSERnR09PZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTM1NSwgLTU2NywgMTg3OSwgMjk4OF0kWy0xOTMwLCAtMzA3MywgMzA0LCA0ODJdIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IRHBQcHVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMUE5IiBzb3VyY2U9Il9IRGdHSnVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IRHBQbHVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERwUHFlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHBQcS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERwUHJPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hEcFBxdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHBQcmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMUFDIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHBQci1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRHBQcnVmWEVkdXFIb09KYlVSWlJ3IiB4PSItMjEiIHk9Ii0xMzUiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHBQc09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDFBQyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERwUHN1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hEcFBzZWZYRWR1cUhvT0piVVJaUnciIHg9Ijg1MSIgeT0iMTA3MSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEcFBzLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDFBQSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERwUHRlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRHBQdE9mWEVkdXFIb09KYlVSWlJ3IiB4PSItNCIgeT0iLTMwNiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEcFB0dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxQUEiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEcFB1T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hEcFB0LWZYRWR1cUhvT0piVVJaUnciIHg9IjEwMjUiIHk9IjEzODUiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHBQdWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMUFDIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHBQdS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRHBQdk9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRHBQdXVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERwUHZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMUFBIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHBQdi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRHBQd09mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRHBQdnVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERwUHdlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxQUMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEcFB3LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hEcFB4T2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hEcFB3dWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHBQeGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMUFBIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHBQeC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hEcFB5T2ZYRWR1cUhvT0piVVJaUnciIGNvbGxhcHNlZD0idHJ1ZSIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSERwUHh1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hEcFBwLWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IRHBQcU9mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlsyOTYsIC01NjcsIC0xNjg0LCAyOTg4XSRbMTcwMSwgLTMwNzMsIC0yNzksIDQ4Ml0iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hEcFA2ZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxRjkiIHNvdXJjZT0iX0hEcFB5ZWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hEcFAyZWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHBQN09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEcFA3dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHBQNy1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSERwUDdlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEcFA4T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxRkMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEcFA4dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hEcFA4ZWZYRWR1cUhvT0piVVJaUnciIHg9Ii00MCIgeT0iLTM3MyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEcFA4LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMUZDIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHBQOWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSERwUDlPZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTU3IiB5PSIxMTU5Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERwUDl1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMUZBIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHBQLU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hEcFA5LWZYRWR1cUhvT0piVVJaUnciIHg9Ii0yMiIgeT0iLTIyMSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEcFAtZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxRkEiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEcFAtLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hEcFAtdWZYRWR1cUhvT0piVVJaUnciIHg9IjEyIiB5PSI1NzYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHBQX09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMUZDIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHBQX3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRHBQXy1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRHBQX2VmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERwUUFPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMUZBIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHpBa09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRHpBa2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRHBRQWVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSER6QWt1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxRkMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEekFsT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hEekFsZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hEekFrLWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHpBbHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMUZBIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHpBbU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hEekFtZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hEekFsLWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IRHBQNnVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hEcFA2LWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0zMDQsIC01NTAsIC01MCwgMzEwN10kWy0zMDQsIC0zMTc1LCAtNTAsIDQ4Ml0iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hEekFxdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEY3MTI5NTAxN0YiIHNvdXJjZT0iX0hEV1VzT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hEekFtdWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHpBcmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEekFyLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHpBc09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSER6QXJ1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hEekFxLWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IRHpBck9mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlsxMTAsIC00OTEsIC0xMjEwLCA0ODQyXSRbMTAzMiwgLTQyNTAsIC0yODcsIDEwODNdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hEekFzZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRHpBc3VmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hEekF2T2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxNTgiIHNvdXJjZT0iX0hEV1UwT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hEekFtdWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHpBdi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEekF3ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHpBd3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSER6QXdPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hEekF2ZWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IRHpBdnVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMzMwLCAtNDkxLCAzMjI1LCA0ODkzXSRbLTI4NTMsIC00MzAxLCA3MDIsIDEwODNdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hEekF3LWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRHpBeE9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hEekF4ZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxNzYiIHNvdXJjZT0iX0hEZ0Y4LWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hEekFtdWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHpBeU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEekF5dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHpBeS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSER6QXllZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hEekF4dWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IRHpBeC1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstNzcwLCAtNDkxLCA3ODY1LCA0ODkzXSRbLTY4OTEsIC00MzAxLCAxNzQ0LCAxMDgzXSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRHpBek9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSER6QXplZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IRHpBenVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMUE4IiBzb3VyY2U9Il9IRHBQbHVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IRHpBbXVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSER6QTBlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHpBMC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSER6QTFPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hEekEwdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IRHpBei1mWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSER6QTBPZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTExNDMsIC00OTEsIDExNzA5LCA0ODkzXSRbLTEwNzM1LCAtNDUwNCwgMjExNiwgODgwXSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRHpBMWVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSER6QTF1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IRHpBMS1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMUY4IiBzb3VyY2U9Il9IRHBQMmVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IRHpBbXVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSER6QTJ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHpBM09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSER6QTNlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hEekEyLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IRHpBMk9mWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSER6QTJlZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTc3MCwgLTM1NSwgMTYzOTksIDUwMjldJFstNTA0NiwgLTIzMDIsIDEyMTI0LCAzMDgxXSRbLTE1MDUzLCAtNDg1MSwgMjExNiwgNTMzXSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRHpBM3VmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSER6QTMtZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IRHpCQU9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFCREVCQUUwMjk4IiBzb3VyY2U9Il9IRHpBOE9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IRHpBbXVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSER6QkEtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHpCQmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSER6QkJ1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hEekJCT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IRHpCQWVmWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSER6QkF1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTkzOSwgLTQ1NywgMjA4NTMsIDQ5NzhdJFstODI4OCwgLTM5MzcsIDEzNTA0LCAxNDk4XSRbLTE5Njc2LCAtNTIwNywgMjExNiwgMjI4XSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRHpCQi1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSER6QkNPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IRHpCQ2VmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIwRDM2NTAwMzNGIiBzb3VyY2U9Il9IRHpBOE9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IRHpBbXVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSER6QkRPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHpCRHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSER6QkQtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hEekJEZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHpCRU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIwRDM2NTIwM0I3Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHpCRXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRHpCRWVmWEVkdXFIb09KYlVSWlJ3IiB4PSItMzA1OCIgeT0iMjYzIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSER6QkUtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIwRDM2NTIwM0I3Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHpCRmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSER6QkZPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTM5NyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEekJGdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMEQzNjUyMDNBRCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSER6QkdPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRHpCRi1mWEVkdXFIb09KYlVSWlJ3IiB4PSIzMTc3IiB5PSI5MyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEekJHZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjBEMzY1MjAzQUQiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEekJHLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hEekJHdWZYRWR1cUhvT0piVVJaUnciIHg9IjE1MjYiIHk9IjI0NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEekJIT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjBEMzY1MjAzQjciPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEekJIdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hEekJILWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hEekJIZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHpCSU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjBEMzY1MjAzQUQiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEekJJdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hEekJJLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hEekJJZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHpCSk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMEQzNjUyMDNCNyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSER6Qkp1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSER6QkotZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSER6QkplZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEekJLT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjBEMzY1MjAzQUQiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEekJLdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSER6QkstZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSER6QktlZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hEekJDdWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSER6QkMtZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMzMsIC00NDgsIDIxODI3LCA0OTg2XSRbMzMsIC01NzU3LCAyMTgyNywgLTMyMV0kWy0xOTY3NiwgLTU3NTcsIDIxMTYsIC0zMjFdIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IRHpCTE9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFCREVCREUwMjNEIiBzb3VyY2U9Il9IRHpBOE9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IRHpBNE9mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSER6QkwtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHpCTWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSER6Qk11ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSER6Qk1PZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTUwMCIgeT0iLTEiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHpCTS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFCREVCREYwM0NGIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHpCTmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRHpCTk9mWEVkdXFIb09KYlVSWlJ3IiB4PSIxNzIiIHk9IjM4MCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEekJOdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFCREVCREYwM0NGIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHpCT09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSER6Qk4tZlhFZHVxSG9PSmJVUlpSdyIgeD0iMyIgeT0iLTE2MDkiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHpCT2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUJERUJERjAzN0YiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEekJPLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSER6Qk91ZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTEwIiB5PSI0MDYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHpCUE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFCREVCREYwMzdGIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHpCUHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRHpCUGVmWEVkdXFIb09KYlVSWlJ3IiB4PSItNjkiIHk9Ii0xODQ2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSER6QlAtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxQkRFQkRGMDNDRiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSER6QlFlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSER6QlF1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSER6QlFPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEekJRLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxQkRFQkRGMDM3RiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSER6QlJlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSER6QlJ1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSER6QlJPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEekJSLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFCREVCREYwM0NGIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHpCU2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRHpCU3VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRHpCU09mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEQ4eGtPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxQkRFQkRGMDM3RiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEQ4eGt1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRDh4ay1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRDh4a2VmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSER6QkxlZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IRHpCTHVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9Ils1MCwgNDQwLCAtMjU0LCAtMzE2Nl0kWzUwLCAzMDE0LCAtMjU0LCAtNTkyXSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEQ4eHBPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDFFNCIgc291cmNlPSJfSEQ4eGxPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSER6QW11ZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEOHhwLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEQ4eHFlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEOHhxdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRDh4cU9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEQ4eHBlZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hEOHhwdWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzExNzYsIC00OTEsIC0xMjI4NSwgNDg5M10kWzExMzM2LCAtNDU0NiwgLTIxMjUsIDgzOF0iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEQ4eHEtZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hEOHhyT2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEQ4eHplZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDFFNSIgc291cmNlPSJfSEQ4eHZlZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEQ4eGxPZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEOHgwT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEQ4eDB1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEOHgwLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRDh4MGVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEQ4eDFPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDFFOCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEQ4eDF1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEQ4eDFlZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTg0IiB5PSItMzQ2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEQ4eDEtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxRTgiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEOHgyZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRDh4Mk9mWEVkdXFIb09KYlVSWlJ3IiB4PSI1NTkiIHk9IjMxOSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEOHgydWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDFFNiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEQ4eDNPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRDh4Mi1mWEVkdXFIb09KYlVSWlJ3IiB4PSItMTY5IiB5PSIyODkiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRDh4M2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMUU2Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRDh4My1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRDh4M3VmWEVkdXFIb09KYlVSWlJ3IiB4PSItMTAzMiIgeT0iLTM4MCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEOHg0T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxRTgiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEOHg0dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hEOHg0LWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hEOHg0ZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRDh4NU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxRTYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEOHg1dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hEOHg1LWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hEOHg1ZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRDh4Nk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDFFOCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEQ4eDZ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEQ4eDYtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEQ4eDZlZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEOHg3T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxRTYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEOHg3dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEQ4eDctZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEQ4eDdlZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hEOHh6dWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEQ4eHotZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTkzMSwgLTExOCwgNTk3NywgLTExOF0kWy01MjgzLCAtMTE4LCAxNjI1LCAtMTE4XSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEQ4eDhPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyNzk4OEIyMDBFQiIgc291cmNlPSJfSEQ4eHZlZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEQ4eHJlZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEOHg4LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEQ4eDllZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEOHg5dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRDh4OU9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEQ4eDktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyNzk4OEIyMDBFRCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEQ4eC1lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEQ4eC1PZlhFZHVxSG9PSmJVUlpSdyIgeD0iOTkiIHk9Ii0xODMiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRDh4LXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyNzk4OEIyMDBFRCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEQ4eF9PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hEOHgtLWZYRWR1cUhvT0piVVJaUnciIHg9Ijk2IiB5PSI4OTkiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRDh4X2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjc5ODhCMjAwRUMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEOHhfLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEQ4eF91ZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTI2OSIgeT0iLTE4NyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEOHlBT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjc5ODhCMjAwRUMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEOHlBdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hEOHlBZWZYRWR1cUhvT0piVVJaUnciIHg9Ii0zNTkiIHk9IjY3MCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEOHlBLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjc5ODhCMjAwRUQiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEOHlCZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hEOHlCdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hEOHlCT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRDh5Qi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjc5ODhCMjAwRUMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEOHlDZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hEOHlDdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hEOHlDT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRDh5Qy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyNzk4OEIyMDBFRCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEQ4eURlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEQ4eUR1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEQ4eURPZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEOHlELWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjc5ODhCMjAwRUMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEOHlFZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEQ4eUV1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEQ4eUVPZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hEOHg4ZWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEQ4eDh1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTY2MiwgMzE4LCAyMzgsIC0xOTMxXSRbLTY2MiwgMTkzMiwgMjM4LCAtMzE3XSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEQ4eUUtZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDEzQiIgc291cmNlPSJfSEQ4eHZlZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSER6QW11ZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEOHlGdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEQ4eUdPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEOHlHZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRDh5Ri1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEQ4eUZPZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hEOHlGZWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzYwMSwgLTUwOCwgLTU5NTIsIDQ4NzZdJFs1MjE1LCAtNDMwMSwgLTEzMzcsIDEwODNdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hEOHlHdWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRDh5Ry1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hEOHlIT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0NDVBNTkyNTAyNjYiIHNvdXJjZT0iX0hEOHh2ZWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hEOHh2ZWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRDh5SC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEOHlJZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRDh5SXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEQ4eUlPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEOHlJLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDQ1QTU5MjcwMzZGIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRDh5SmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRDh5Sk9mWEVkdXFIb09KYlVSWlJ3IiB5PSIzOTYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRDh5SnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0NDVBNTkyNzAzNkYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEOHlLT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRDh5Si1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMzk3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEQ4eUtlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDQ1QTU5MjcwMzZEIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRDh5Sy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hEOHlLdWZYRWR1cUhvT0piVVJaUnciIHg9Ii0zNDQiIHk9Ii0yMDQiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRDh5TE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDQ1QTU5MjcwMzZEIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRDh5THVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRDh5TGVmWEVkdXFIb09KYlVSWlJ3IiB4PSI1OTQiIHk9Ii05NzIiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRDh5TC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDQ1QTU5MjcwMzZGIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRDh5TWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRDh5TXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRDh5TU9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEQ4eU0tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDQ1QTU5MjcwMzZEIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRDh5TmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRDh5TnVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRDh5Tk9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEQ4eU4tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0NDVBNTkyNzAzNkYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEOHlPZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hEOHlPdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hEOHlPT2ZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRDh5Ty1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDQ1QTU5MjcwMzZEIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRDh5UGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hEOHlQdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hEOHlQT2ZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IRDh5SGVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hEOHlIdWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzQxNCwgNDk5LCA0MTQsIDQ5OV0kWzQxNCwgMTQzMCwgNDE0LCAxNDMwXSRbMjE1MCwgMTQzMCwgMjE1MCwgMTQzMF0kWzIxNTAsIC00MiwgMjE1MCwgLTQyXSRbOTMxLCAtNDIsIDkzMSwgLTQyXSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRDNsdG9Pb2tFZHVWQTd2dDVxYklKUSIgZWxlbWVudD0iX0QzYjhvT29rRWR1VkE3dnQ1cWJJSlEiIHNvdXJjZT0iX0hEekFtdWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iXzl1Yi1FT29qRWR1VkE3dnQ1cWJJSlEiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9EM2x0by1va0VkdVZBN3Z0NXFiSUpRIiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0QzbHRwZW9rRWR1VkE3dnQ1cWJJSlEiIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9EM2x0cHVva0VkdVZBN3Z0NXFiSUpRIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9EM2x0cE9va0VkdVZBN3Z0NXFiSUpRIiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRDNsdG9lb2tFZHVWQTd2dDVxYklKUSIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0QzbHRvdW9rRWR1VkE3dnQ1cWJJSlEiIHBvaW50cz0iWy01LCAtNDEsIC00LCA1OV0kWy02MywgLTEwNCwgLTYyLCAtNF0iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgIDwvY29udGVudHM+Ci0gICAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HcWQ2ay1mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjI1Ij4KLSAgICAgICAgICAgIDxib2R5PjA0PC9ib2R5PgotICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgIDxwYWNrYWdlSW1wb3J0IHhtaTppZD0iX2RkajhzT3hkRWR1SGplM3BQYWhONEEiIGltcG9ydGVkUGFja2FnZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDE5MCIvPgotICAgICAgICAgIDxwYWNrYWdlSW1wb3J0IHhtaTppZD0iX2VhVzhJT3hkRWR1SGplM3BQYWhONEEiIGltcG9ydGVkUGFja2FnZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI5NCIvPgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjI3IiBuYW1lPSJEaXNjaXBsaW5lIj4KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3FuRWgtZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDIyNyI+Ci0gICAgICAgICAgICAgIDxib2R5PkEgRGlzY2lwbGluZSBpcyBhIGNhdGVnb3JpemF0aW9uIG9mIHdvcmsgKGkuZS4gVGFza3MgZm9yIE1ldGhvZCBDb250ZW50KSwgYmFzZWQgdXBvbiBzaW1pbGFyaXR5IG9mIGNvbmNlcm5zIGFuZCBjb29wZXJhdGlvbiBvZiB3b3JrIGVmZm9ydC4KLUEgZGlzY2lwbGluZSBpcyBhIGNvbGxlY3Rpb24gb2YgVGFza3MgdGhhdCBhcmUgcmVsYXRlZCB0byBhIG1ham9yICdhcmVhIG9mIGNvbmNlcm4nIHdpdGhpbiB0aGUgb3ZlcmFsbCBwcm9qZWN0LiBUaGUgZ3JvdXBpbmcgb2YgVGFza3MgaW50byBkaXNjaXBsaW5lcyBpcyBtYWlubHkgYW4gYWlkIHRvIHVuZGVyc3RhbmRpbmcgdGhlIHByb2plY3QgZnJvbSBhICd0cmFkaXRpb25hbCcgd2F0ZXJmYWxsIHBlcnNwZWN0aXZlLiBIb3dldmVyLCB0eXBpY2FsbHksIGZvciBleGFtcGxlLCBpdCBpcyBtb3JlIGNvbW1vbiB0byBwZXJmb3JtIGNlcnRhaW4gcmVxdWlyZW1lbnRzIGFjdGl2aXRpZXMgaW4gY2xvc2UgY29vcmRpbmF0aW9uIHdpdGggYW5hbHlzaXMgYW5kIGRlc2lnbiBhY3Rpdml0aWVzLiBTZXBhcmF0aW5nIHRoZXNlIGFjdGl2aXRpZXMgaW50byBzZXBhcmF0ZSBkaXNjaXBsaW5lcyBtYWtlcyB0aGUgYWN0aXZpdGllcyBlYXNpZXIgdG8gY29tcHJlaGVuZC4KLTwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDEzQiIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI0NCIvPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyNzk4OEIyMDBFQyIgbmFtZT0idGFza3MiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI5RSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0Mjc5ODhCMjAwRUIiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HcmdjYXVmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HcmdjYWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQ0NUE1OTI3MDM2RCIgbmFtZT0ic3ViZGlzY2lwbGluZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjI3IiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQ0NUE1OTI1MDI2NiI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0dyZ2NjZWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0dyZ2NjT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyMzAiIG5hbWU9IlJvbGVTZXQiPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HcW5FaS1mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjMwIj4KLSAgICAgICAgICAgICAgPGJvZHk+QSBSb2xlIFNldCBvcmdhbml6ZXMgUm9sZXMgaW50byBjYXRlZ29yaWVzLiAgSXQgaXMgdXNlZCB0byBncm91cCByb2xlcyB0b2dldGhlciB0aGF0IGhhdmUgY2VydGFpbiBjb21tb25hbGl0aWVzLiAgRm9yIGV4YW1wbGUsIHRoZSAmcXVvdDtBbmFseXN0cyZxdW90OyBSb2xlIFNldCBjb3VsZCBncm91cCB0aGUgJnF1b3Q7QnVzaW5lc3MgUHJvY2VzcyBBbmFseXN0JnF1b3Q7LCAmcXVvdDtTeXN0ZW0gQW5hbHlzdCZxdW90OywgYXMgd2VsbCBhcyAmcXVvdDtSZXF1aXJlbWVudHMgU3BlY2lmaWVyJnF1b3Q7IHJvbGVzLiAgQWxsIG9mIHRoZXNlIHdvcmsgd2l0aCBzaW1pbGFyIHRlY2huaXF1ZXMgYW5kIGhhdmUgb3ZlcmxhcHBpbmcgc2tpbGxzLCBidXQgYXJlIHJlcXVpcmVkIGFzIGRpc3RpbmN0IHJvbGVzIGZvciBhIG1ldGhvZCAoZS5nLiB0aGUgbWV0aG9kIHRoZSBJQk0gUmF0aW9uYWwgVW5pZmllZCBQcm9jZXNzIGlzIGJhc2VkIG9uKS4KLTwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDE1OCIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI0NCIvPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDE1QyIgbmFtZT0icm9sZXMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI5NiIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxNTkiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HcTZtaXVmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HcTZtaWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjMxIiBuYW1lPSJEb21haW4iPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HcW5Fai1mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjMxIj4KLSAgICAgICAgICAgICAgPGJvZHk+RG9tYWluIGlzIGEgcmVmaW5lYWJsZSBoaWVyYXJjaHkgZ3JvdXBpbmcgcmVsYXRlZCB3b3JrIHByb2R1Y3RzLiAgSW4gb3RoZXIgd29yZHMsIERvbWFpbnMgY2FuIGJlIGZ1cnRoZXIgZGl2aWRlZCBpbnRvIHN1Yi1kb21haW5zLCB3aXRoIHdvcmsgcHJvZHVjdCBlbGVtZW50cyB0byBiZSBjYXRlZ29yaXplZCBvbmx5IGF0IHRoZSBsZWFmLWxldmVsIG9mIHRoaXMgaGllcmFyY2h5LgotRG9tYWluIGlzIGEgbG9naWNhbCBncm91cGluZyBvZiB3b3JrIHByb2R1Y3RzIHRoYXQgaGF2ZSBhbiBhZmZpbml0eSB0byBlYWNoIG90aGVyIGJhc2VkIG9uIHJlc291cmNlcywgdGltaW5nLCBvciByZWxhdGlvbnNoaXAuICBBIERvbWFpbiBtYXkgYmUgZGl2aWRlZCBpbnRvIHN1YmRvbWFpbnMuICBGb3IgZXhhbXBsZSwgR1MgTWV0aG9kIHVzZXMgc2l4IHByZWRlZmluZWQgRG9tYWlucyBmb3IgV29yayBQcm9kdWN0czogQXBwbGljYXRpb24sIEFyY2hpdGVjdHVyZSwgQnVzaW5lc3MsIEVuZ2FnZW1lbnQsIE9wZXJhdGlvbnMgYW5kIE9yZ2FuaXphdGlvbi4KLTwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDE3NiIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI0NCIvPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDE3QSIgbmFtZT0id29ya1Byb2R1Y3RzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyQkMiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMTc3Ij4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3E2bWstZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3E2bWt1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxOTciIG5hbWU9InN1YmRvbWFpbnMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDIzMSIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxOTQiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HckR3Y09mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HcTZtbWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjNBIiBuYW1lPSJXb3JrUHJvZHVjdFR5cGUiPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HcW5Fay1mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjNBIj4KLSAgICAgICAgICAgICAgPGJvZHk+V29yayBQcm9kdWN0IFR5cGUgaXMgYSBzZWNvbmQgY2F0ZWdvcnkgZm9yIHdvcmsgcHJvZHVjdHMsIHdoaWNoIGluIGNvbnRyYXN0IHRvIERvbWFpbiBpcyBtb3JlIHByZXNlbnRhdGlvbiBvcmllbnRlZC4gIEEgd29yayBwcm9kdWN0IGNhbiBoYXZlIG1hbnkgV29yayBQcm9kdWN0IFR5cGVzLiAgRXhhbXBsZXMsIGZvciBhIFdvcmsgUHJvZHVjdCBUeXBlIGlzICZxdW90O0NsYXNzIERpYWdyYW0mcXVvdDssIHdoaWNoIGNhdGVnb3JpemVzIHRoZSBBcnRpZmFjdHMgQW5hbHlzaXMgTW9kZWwsIERlc2lnbiBNb2RlbCwgVXNlciBFeHBlcmllbmNlIE1vZGVsLCBvciAmcXVvdDtTcGVjaWZpY2F0aW9uJnF1b3Q7LCB3aGljaCBjYXRlZ29yaXplcyByZXF1aXJlbWVudHMgc3BlY2lmaWNhdGlvbnMgdGhhdCBkZWZpbmUgYSBzeXN0ZW0gd2l0aCBhIHdlbGwtZGVmaW5lZCBzeXN0ZW0gYm91bmRhcnksIHN1Y2ggYXMgdXNlIGNhc2Ugb3IgZnVuY3Rpb25hbCByZXF1aXJlbWVudHMgc3BlY2lmaWNhdGlvbi4gIEEgV29yayBQcm9kdWN0IGNhbiBiZSBjYXRlZ29yaXplZCB0byBiZSBvZiBtYW55IFdvcmsgUHJvZHVjdCBUeXBlcy4gIEZvciBleGFtcGxlLCBhIHVzZSBjYXNlIG1vZGVsIGNhbiBiZSBjYXRlZ29yaXplZCBhcyBhIFNwZWNpZmljYXRpb24gYXMgd2VsbCBhcyBEaWFncmFtIFdvcmsgUHJvZHVjdCBUeXBlLgotPC9ib2R5PgotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMUE4IiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjQ0Ii8+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMUFDIiBuYW1lPSJ3b3JrUHJvZHVjdHMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDJCQyIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxQTkiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HckR3ZWVmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HckR3ZU9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjQ0IiBuYW1lPSJDb250ZW50Q2F0ZWdvcnkiIGlzQWJzdHJhY3Q9InRydWUiPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HcXcxZ09mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjQ0Ij4KLSAgICAgICAgICAgICAgPGJvZHk+Q29udGVudCBDYXRlZ29yeSBpcyBhbiBhYnN0cmFjdCBjbGFzcyBnZW5lcmFsaXppbmcgY29udGVudCBjYXRlZ29yeSB0eXBlcy48L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il9EM2I4b09va0VkdVZBN3Z0NXFiSUpRIiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjZDIi8+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyNEUiIG5hbWU9IkRpc2NpcGxpbmVHcm91cGluZyI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dxdzFoT2ZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyNEUiPgotICAgICAgICAgICAgICA8Ym9keT5EaXNjaXBsaW5lIEdyb3VwaW5ncyBhcmUgdXNlZCB0byBncm91cCBEaXNjaXBsaW5lcy4gIEZvciBleGFtcGxlLCB0aGUgRGlzY2lwbGluZSBHcm91cGluZyAmcXVvdDtTb2Z0d2FyZSBEaXNjaXBsaW5lcyZxdW90OyB3b3VsZCBiZSB0aGUgZ3JvdXAgb2YgYWxsIGRpc2NpcGxpbmVzIHJlbGF0ZWQgdG8gZGV2ZWxvcGluZyBzb2Z0d2FyZSBzdWNoIGFzICZxdW90O1JlcXVpcmVtZW50cyBNYW5hZ2VtZW50JnF1b3Q7IG9yICZxdW90O1Rlc3RpbmcmcXVvdDs7ICZxdW90O0lUIEluZnJhc3RydWN0dXJlIE1hbmFnZW1lbnQmcXVvdDsgd291bGQgYmUgYSBEaXNjaXBsaW5lcyBHcm91cGluZyBmb3IgZGlzY2lwbGluZXMgc3VjaCBhcyAmcXVvdDtJVCBPcGVyYXRpb25hbCBTZXJ2aWNlcyZxdW90OywgJnF1b3Q7SVQgQ3VzdG9tZXIgUmVsYXRpb25zaGlwcyZxdW90Oywgb3IgJnF1b3Q7SVQgRW5hYmxpbmcgU2VydmljZXMmcXVvdDsuICBEaXNjaXBsaW5lcyBjYW4gYmUgYXNzb2NpYXRlZCB0byBtb3JlIHRoYW4gb25lIERpc2NpcGxpbmUgR3JvdXBpbmcuCi08L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxRTQiIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyNDQiLz4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxRTgiIG5hbWU9ImRpc2NpcGxpbmVzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyMjciIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMUU1Ij4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3JOaGR1ZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3JOaGRlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI1OCIgbmFtZT0iVG9vbCI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dxdzFpT2ZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyNTgiPgotICAgICAgICAgICAgICA8Ym9keT5BIFRvb2wgaXMgYSBjb250YWluZXIvYWdncmVnYXRlIGZvciBUb29sTWVudG9ycy4gIEl0IGNhbiBhbHNvIHByb3ZpZGUgZ2VuZXJhbCBkZXNjcmlwdGlvbnMgb2YgdGhlIHRvb2wgYW5kIGl0cyBnZW5lcmFsIGNhcGFiaWxpdGllcy48L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxRjgiIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyNDQiLz4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxRkMiIG5hbWU9InRvb2xNZW50b3JzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxQ0IiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMUY5Ij4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3JXcllPZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3JOaGZ1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI1OSIgbmFtZT0iUm9sZVNldEdyb3VwaW5nIj4KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3F3MWpPZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI1OSI+Ci0gICAgICAgICAgICAgIDxib2R5PlJvbGUgU2V0cyBjYW4gYmUgY2F0ZWdvcml6ZWQgaW50byBSb2xlIFNldCBHcm91cGluZ3MuICBGb3IgZXhhbXBsZSwgZGlmZmVyZW50IG1ldGhvZHMgbWlnaHQgZGVmaW5lIHNpbWlsYXIgUm9sZSBTZXRzLCB3aGljaCBob3dldmVyIG5lZWQgdG8gYmUgZGlzdGluZ3Vpc2hlZCBmcm9tIGVhY2ggb3RoZXIgb24gYSBnbG9iYWwgc2NhbGUuICBUaHVzLCBSb2xlIFNldCBHcm91cGluZ3MgYWxsb3cgZGlzdGluZ3Vpc2hpbmcsIGZvciBleGFtcGxlLCBTb2Z0d2FyZSBTZXJ2aWNlcyBNYW5hZ2VyIFJvbGUgU2V0cyBmcm9tIFNvZnR3YXJlIERldmVsb3BtZW50IE9yZ2FuaXphdGlvbiBNYW5hZ2VyIFJvbGUgU2V0cy48L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEY3MTI5NTAxN0YiIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyNDQiLz4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAyMTkiIG5hbWU9InJvbGVTZXRzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyMzAiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMjE2Ij4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3JXcmFlZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3JXcmFPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxQkRFQkEyMDA5QyIgbmFtZT0iQ3VzdG9tQ2F0ZWdvcnkiPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HcXcxa09mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDFCREVCQTIwMDlDIj4KLSAgICAgICAgICAgICAgPGJvZHk+QSBDdXN0b20gQ2F0ZWdvcnkgaXMgYSBjYXRlZ29yeSBpbnRyb2R1Y2VkIGJ5IGEgbWV0aG9kIGNvbnRlbnQgYXV0aG9yIHRvIHN0cnVjdHVyZSBhbnkgbnVtYmVyIG9mIG1ldGhvZCBDb250ZW50IEVsZW1lbnRzIG9mIGFueSBzdWJ0eXBlIGJhc2VkIG9uIHVzZXItZGVmaW5lZCBjcml0ZXJpYS4gIEJlY2F1c2UgQ29udGVudCBDYXRlZ29yaWVzIChhbmQgdGhlcmVmb3JlIEN1c3RvbSBDYXRlZ29yaWVzLCB0b28pIGFyZSBDb250ZW50IEVsZW1lbnRzIHRoZW1zZWx2ZXMsIEN1c3RvbSBDYXRlZ29yaWVzIGNhbiBiZSB1c2VkIHRvIHJlY3Vyc2l2ZWx5IGNhdGVnb3JpemUgQ29udGVudCBDYXRlZ29yaWVzIGFzIHdlbGwuICBDdXN0b20gQ2F0ZWdvcmllcyBjYW4gYWxzbyBiZSBuZXN0ZWQgd2l0aCBhbnkgQ29udGVudCBDYXRlZ29yeS4gIEN1c3RvbSBjYXRlZ29yaWVzIGNhbiBiZSB1c2VkIHRvIGNhdGVnb3JpemUgY29udGVudCBiYXNlZCBvbiB0aGUgdXNlcidzIGNyaXRlcmlhIGFzIHdlbGwgYXMgdG8gZGVmaW5lIHdob2xlIHRyZWUtc3RydWN0dXJlcyBvZiBuZXN0ZWQgY2F0ZWdvcmllcyBhbGxvd2luZyB0aGUgdXNlciB0byBzeXN0ZW1hdGljYWxseSBuYXZpZ2F0ZSBhbmQgYnJvd3NlIG1ldGhvZCBjb250ZW50IGFuZCBwcm9jZXNzZXMgYmFzZWQgb24gdGhlc2UgY2F0ZWdvcmllcy4gIEZvciBleGFtcGxlLCBvbmUgY291bGQgY3JlYXRlIGEgY3VzdG9tIGNhdGVnb3J5IHRvIGxvZ2ljYWxseSBvcmdhbml6ZSBjb250ZW50IHJlbGV2YW50IGZvciB0aGUgdXNlcidzIGRldmVsb3BtZW50IG9yZ2FuaXphdGlvbiBkZXBhcnRtZW50czsgZS5nLiBhICZxdW90O1Rlc3RpbmcmcXVvdDsgY2F0ZWdvcnkgdGhhdCBncm91cHMgdG9nZXRoZXIgYWxsIHJvbGVzLCB3b3JrIHByb2R1Y3RzLCB0YXNrcywgYW5kIGd1aWRhbmNlIGVsZW1lbnQgcmVsZXZhbnQgdG8gdGVzdGluZy4gIEFub3RoZXIgZXhhbXBsZSB3b3VsZCBiZSBjYXRlZ29yaWVzIHRoYXQgZXhwcmVzcyBsaWNlbnNpbmcgbGV2ZWxzIG9mIHRoZSBjb250ZW50IGdyb3VwaW5nIGZyZWVseSBkaXN0cmlidXRhYmxlIG1ldGhvZCBjb250ZW50IHZlcnN1cyBjb250ZW50IHRoYXQgcmVwcmVzZW50IGludGVsbGVjdHVhbCBwcm9wZXJ0eSBhbmQgcmVxdWlyZXMgYSBsaWNlbnNlIHRvIGJlIHB1cmNoYXNlZCB0byBiZSBhYmxlIHRvIHVzZSBpdC4KLTwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxQkRFQkFFMDI5OCIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI0NCIvPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxQkRFQkRGMDM3RiIgbmFtZT0iY2F0ZWdvcml6ZWRFbGVtZW50cyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDI5NEVCOTAwMEZDIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQxQkRFQkRFMDIzRCI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0dyV3JiLWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0dyV3JidWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDIwRDM2NTIwM0FEIiBuYW1lPSJzdWJDYXRlZ29yaWVzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyNDQiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDIwRDM2NTAwMzNGIj4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3JnY1llZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3JnY1lPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDE1OSIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMTVBIF8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxNUMiPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HcTZtZy1mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMTU5Ij4KLSAgICAgICAgICAgICAgPGJvZHk+QSBSb2xlIFNldCBjYXRlZ29yaXplcyBtYW55IFJvbGVzIGFuZCBhIFJvbGUgY2FuIGJlIHJlcHJlc2VudGVkIGluIG1heSBSb2xlIFNldHMuPC9ib2R5PgotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICA8b3duZWRFbmQgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMTVBIiBuYW1lPSJyb2xlU2V0cyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjMwIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDE1OSI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0dxNm1oLWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0dxNm1odWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRFbmQ+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxNzciIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDE3OCBfM0FEQzdCNzQwMjJENDBGMzZDOTIwMTdBIj4KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3E2bWpPZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDE3NyI+Ci0gICAgICAgICAgICAgIDxib2R5PkEgRG9tYWluIGNhdGVnb3JpemVzIG1hbnkgV29yayBQcm9kdWN0cy4gQSBXb3JrIFByb2R1Y3QgYmVsb25ncyBhdCBtb3N0IHRvIG9uZSBEb21haW4uPC9ib2R5PgotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICA8b3duZWRFbmQgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMTc4IiBuYW1lPSJkb21haW4iIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDIzMSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxNzciPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HcTZta09mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HcTZtai1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkRW5kPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMTk0IiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxOTUgXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDE5NyI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dxNm1sZWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxOTQiPgotICAgICAgICAgICAgICA8Ym9keT5Eb21haW5zIGNhbiBiZSBmdXJ0aGVyIGRpdmlkZWQgaW50byBTdWJkb21haW5zLCB3aXRoIHdvcmsgcHJvZHVjdCBlbGVtZW50cyBvbmx5IHRvIGJlIGNhdGVnb3JpemVkIGF0IHRoZSBsZWFmLWxldmVsLjwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDE5NSIgbmFtZT0iX2RvbWFpbiIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjMxIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMTk0Ii8+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxQTkiIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDFBQSBfM0FEQzdCNzQwMjJENDBGMzZDOTIwMUFDIj4KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3JEd2N1ZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDFBOSI+Ci0gICAgICAgICAgICAgIDxib2R5PkEgV29yayBQcm9kdWN0IGNhbiBiZSBjYXRlZ29yaXplZCB0byBiZSB6ZXJvIG9mIG1hbnkgV29yayBQcm9kdWN0IFR5cGVzLjwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDFBQSIgbmFtZT0id29ya1Byb2R1Y3RUeXBlcyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjNBIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDFBOSI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0dyRHdkdWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0dyRHdkZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRFbmQ+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxRTUiIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDFFNiBfM0FEQzdCNzQwMjJENDBGMzZDOTIwMUU4Ij4KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3JEd2UtZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDFFNSI+Ci0gICAgICAgICAgICAgIDxib2R5PkRpc2NpcGxpbmUgR3JvdXBpbmdzIGdyb3VwIG1hbnkgRGlzY2lwbGluZXMuICBBIERpc2NpcGxpbmUgY2FuIGJlIGluIG1hbnkgRGlzY2lwbGluZSBHcm91cHMuPC9ib2R5PgotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICA8b3duZWRFbmQgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMUU2IiBuYW1lPSJkaXNjaXBsaW5lR3JvdXBzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyNEUiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMUU1Ij4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3JOaGMtZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3JOaGN1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEVuZD4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDFGOSIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMUZBIF8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxRkMiPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9Hck5oZU9mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMUY5Ij4KLSAgICAgICAgICAgICAgPGJvZHk+QSBUb29sIE1lbnRvciBkZXNjcmliZXMgd29yayB3aXRoIGV4YWN0bHkgb25lIFRvb2wuPC9ib2R5PgotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICA8b3duZWRFbmQgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMUZBIiBuYW1lPSJ0b29sIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyNTgiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMUY5Ij4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3JOaGZPZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IjEiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3JOaGUtZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IjEiLz4KLSAgICAgICAgICAgIDwvb3duZWRFbmQ+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAyMTYiIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDIxNyBfM0FEQzdCNzQwMjJENDBGMzZDOTIwMjE5Ij4KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3JXcll1ZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDIxNiI+Ci0gICAgICAgICAgICAgIDxib2R5PkEgUm9sZSBTZXQgR3JvdXBpbmcgY29udGFpbnMgbWFueSBSb2xlIFNldHMuIFJvbGUgU2V0cyBjYW4gYmUgaW4gbWFueSBSb2xlIFNldCBHcm91cGluZ3MuPC9ib2R5PgotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICA8b3duZWRFbmQgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMjE3IiBuYW1lPSJyb2xlU2V0R3JvdXBzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyNTkiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMjE2Ij4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3JXclp1ZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3JXclplZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEVuZD4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxQkRFQkRFMDIzRCIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDFCREVCREYwMzdGIF8zQURDN0I3NDAyMkQ0MUJERUJERjAzQ0YiPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HcldyYS1mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDFCREVCREUwMjNEIj4KLSAgICAgICAgICAgICAgPGJvZHk+QSBDdXN0b21DYXRlZ29yeSBncm91cHMgdG9nZXRoZXIgYW55IG51bWJlciBvZiBDb250ZW50RWxlbWVudHMgaW5jbHVkaW5nIG90aGVyIENvbnRlbnRDYXRlZ29yeS4gPC9ib2R5PgotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICA8b3duZWRFbmQgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDFCREVCREYwM0NGIiBuYW1lPSJjdXN0b21DYXRlZ29yaWVzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MUJERUJBMjAwOUMiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDFCREVCREUwMjNEIj4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3JXcmN1ZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3JXcmNlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEVuZD4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyMEQzNjUwMDMzRiIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDIwRDM2NTIwM0FEIF8zQURDN0I3NDAyMkQ0MjBEMzY1MjAzQjciPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HcldyZE9mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDIwRDM2NTAwMzNGIj4KLSAgICAgICAgICAgICAgPGJvZHk+QSBDdXN0b21DYXRlZ29yeSBjYW4gaGF2ZSBhbnkgbnVtYmVyIG9mIENvbnRlbnRDYXRlZ29yaWVzIGRlZmluZWQgYXMgbmVzdGVkIHN1YkNhdGVnb3JpZXMuICBUaGVyZWZvcmUsIG9uZSBjb3VsZCBuZXN0IEN1c3RvbUNhdGVnb3JpZXMgaW50byBuLWxldmVsIGhpZXJhcmNoaWVzLiA8L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MjBEMzY1MjAzQjciIG5hbWU9Il9jdXN0b21DYXRlZ29yeSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDFCREVCQTIwMDlDIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDIwRDM2NTAwMzNGIj4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3JnY1pPZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IjEiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3JnY1ktZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IjEiLz4KLSAgICAgICAgICAgIDwvb3duZWRFbmQ+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0Mjc5ODhCMjAwRUIiIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQyNzk4OEIyMDBFQyBfM0FEQzdCNzQwMjJENDI3OTg4QjIwMEVEIj4KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3JnY1p1ZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyNzk4OEIyMDBFQiI+Ci0gICAgICAgICAgICAgIDxib2R5PkV2ZXJ5IFRhc2sgc2hvdWxkIGJlIHJlbGF0ZWQgdG8gZXhhY3RseSBvbmUgRGlzY2lwbGluZS4gIEZvciBsZWdhY3kgcmVhc29ucyB0aGlzIGlzIG5vdCBlbmZvcmNlZCAoZS5nLiBHUyBNZXRob2QgZG9lcyBub3QgZGVmaW5lIERpc2NpcGxpbmVzLCB5ZXQpLjwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyNzk4OEIyMDBFRCIgbmFtZT0iZGlzY2lwbGluZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjI3IiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQyNzk4OEIyMDBFQiI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0dyZ2NiZWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0dyZ2NiT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRFbmQ+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0NDVBNTkyNTAyNjYiIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQ0NUE1OTI3MDM2RCBfM0FEQzdCNzQwMjJENDQ1QTU5MjcwMzZGIj4KLSAgICAgICAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0NDVBNTkyNzAzNkYiIG5hbWU9Il9kaXNjaXBsaW5lIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyMjciIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0NDVBNTkyNTAyNjYiLz4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpQYWNrYWdlIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyNjIiIG5hbWU9IkJhc2ljRWxlbWVudHMiPgotICAgICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfR3NaMFNlZlhFZHVxSG9PSmJVUlpSdyIgc291cmNlPSJ1bWwyLmRpYWdyYW1zIiByZWZlcmVuY2VzPSJfM0FEQzdCNzQwMjJENDBGMzZENjYwMkZCIj4KLSAgICAgICAgICAgIDxjb250ZW50cyB4bWk6dHlwZT0ibm90YXRpb246RGlhZ3JhbSIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZENjYwMkZCIiB0eXBlPSJDbGFzcyIgbmFtZT0iTWFpbiI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRUY3Z09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOb3RlIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVGN2ctZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRGlhZ3JhbU5hbWUiPgotICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFRjdoT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkRlc2NyaXB0aW9uIj4KLSAgICAgICAgICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOlNoYXBlU3R5bGUiIHhtaTppZD0iX0hFRjdnZWZYRWR1cUhvT0piVVJaUnciIGRlc2NyaXB0aW9uPSJVTUwyIEluZnJhc3RydWN0dXJlIiBsaW5lQ29sb3I9IjQxOTQzNjgiLz4KLSAgICAgICAgICAgICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEVGN2d1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iNDQxOSIgeT0iNTE2IiB3aWR0aD0iODgzOSIgaGVpZ2h0PSI3MDk1Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRUY3aGVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFEREU2NTgwMTU3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVGN2lPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEVGN2llZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjI1NzMiIGhlaWdodD0iMTA0OSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFRjdpdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVGN2ktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRUY3ak9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVGN2plZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRUY3anVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVGN2otZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRUY3a09mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVGN2tlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRUY3a3VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVGN2stZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEVGN2xPZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEVGN2h1ZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRUY3aC1mWEVkdXFIb09KYlVSWlJ3IiB4PSIxMDQ5OCIgeT0iNjMzMyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVGN2xlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRERFODMzMDFBNSI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFRjdtT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hFRjdtZWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSI0MzY4IiBoZWlnaHQ9IjEwMzIiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRUY3bXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFRjdtLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVGN25PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFRjduZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEVGN251ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFRjduLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEVGN29PZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFRjdvZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEVGN291ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFRjdvLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFRjdwT2ZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hFRjdsdWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEVGN2wtZlhFZHVxSG9PSmJVUlpSdyIgeD0iNTM4NCIgeT0iMzU5OCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVGN3BlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRERFQ0I1MDA5OCI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFRjdxT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hFRjdxZWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIyNTczIiBoZWlnaHQ9IjEwMzIiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRUY3cXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFRjdxLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVGN3JPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFRjdyZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEVGN3J1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFRjdyLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEVGN3NPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFRjdzZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEVGN3N1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFRjdzLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFRjd0T2ZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hFRjdwdWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEVGN3AtZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTA0OTgiIHk9IjQ0MTEiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFUHNqZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURERTA2MjAyRDUiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVBza09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IRVBza2VmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMjgxMCIgaGVpZ2h0PSIxNTQwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVQc2t1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVBzay1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFUHNsT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVBzbGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEVQc2x1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFUHNsLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEVQc21PZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFUHNtZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEVQc211ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFUHNtLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFUHNuT2ZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hFUHNqdWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iTm9uZSIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEVQc2otZlhFZHVxSG9PSmJVUlpSdyIgeD0iNjIxNCIgeT0iMTEwOSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVQc3ItZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI2QyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFUHNzdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hFUHNzLWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIzMzUyIiBoZWlnaHQ9IjEwODMiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVBzdE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFUHN0ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVQc3R1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFUHN0LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRVBzdU9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVQc3VlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRVBzdXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVQc3UtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRVBzdk9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVQc3ZlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEVQc3Z1ZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEVQc3NPZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRVBzc2VmWEVkdXFIb09KYlVSWlJ3IiB4PSI5Mjk2IiB5PSIxMjE1OCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVQc3YtZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMUU0Q0YzMDFBRSI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFUHN3dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hFUHN3LWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVBzeE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFUHN4ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVQc3h1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFUHN4LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRVBzeU9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVQc3llZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRVBzeXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVQc3ktZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRVBzek9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVQc3plZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEVQc3p1ZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEVQc3dPZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJOb25lIiBzaG93TGlzdFZpc2liaWxpdHk9Ik5vbmUiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRVBzd2VmWEVkdXFIb09KYlVSWlJ3IiB4PSIzOTc5IiB5PSIxNjQ0MiIgd2lkdGg9IjQ1MzgiIGhlaWdodD0iMTU1NyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVQczh1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyOTRFQjkwMDBGQyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFUHM5ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hFUHM5dWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSI0MTgyIiBoZWlnaHQ9IjExNTEiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVBzOS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFUHMtT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVQcy1lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFUHMtdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRVBzLS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVQc19PZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRVBzX2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVQc191ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRVBzXy1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVQdEFPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEVQdEFlZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEVQczgtZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJOb25lIiBzaG93TGlzdFZpc2liaWxpdHk9Ik5vbmUiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRVBzOU9mWEVkdXFIb09KYlVSWlJ3IiB4PSIxMDU1NyIgeT0iOTkzOSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVQdEMtZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREU0QTk3MDEyMyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFUHREdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hFUHRELWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVB0RU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFUHRFZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVQdEV1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFUHRFLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRVB0Rk9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVQdEZlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRVB0RnVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVQdEYtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRVB0R09mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVQdEdlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEVQdEd1ZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEVQdERPZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJOb25lIiBzaG93TGlzdFZpc2liaWxpdHk9Ik5vbmUiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRVB0RGVmWEVkdXFIb09KYlVSWlJ3IiB4PSI3NjI4IiB5PSIxMzk0NCIgd2lkdGg9IjQ1NTUiIGhlaWdodD0iMTQ4MSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVZMnItZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E4NTdCMDMzMyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFWTJzdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hFWTJzLWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIyNDg5IiBoZWlnaHQ9IjExNTEiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVkydE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFWTJ0ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVZMnR1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFWTJ0LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRVkydU9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVZMnVlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRVkydXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVZMnUtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRVkydk9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVZMnZlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEVZMnZ1ZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEVZMnNPZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJOb25lIiBzaG93TGlzdFZpc2liaWxpdHk9Ik5vbmUiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRVkyc2VmWEVkdXFIb09KYlVSWlJ3IiB4PSI0MTkxIiB5PSIxMTIwOSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVZMnYtZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQ1NUU2MjAyMDMyQSI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFWTJ3dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hFWTJ3LWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSI0MDgwIiBoZWlnaHQ9IjExNTEiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVkyeE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFWTJ4ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVZMnh1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFWTJ4LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRVkyeU9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVZMnllZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRVkyeXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVZMnktZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRVkyek9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVZMnplZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEVZMnp1ZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEVZMndPZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJOb25lIiBzaG93TGlzdFZpc2liaWxpdHk9Ik5vbmUiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRVkyd2VmWEVkdXFIb09KYlVSWlJ3IiB4PSIxMzEyIiB5PSIxMzQ0NSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVZMnotZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI4MCI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFWTIwdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hFWTIwLWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVkyMU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFWTIxZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVZMjF1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFWTIxLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRVkyMk9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVZMjJlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRVkyMnVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVZMjItZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRVkyM09mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVZMjNlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEVZMjN1ZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEVZMjBPZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJOb25lIiBzaG93TGlzdFZpc2liaWxpdHk9Ik5vbmUiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRVkyMGVmWEVkdXFIb09KYlVSWlJ3IiB4PSI1NTM3IiB5PSI3OTU4IiB3aWR0aD0iNDA2NCIgaGVpZ2h0PSIxNTU3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTERpYWdyYW1TdHlsZSIgeG1pOmlkPSJfR3NaMFMtZlhFZHVxSG9PSmJVUlpSdyIgZGVzY3JpcHRpb249IlRoZSBsb3dlc3QgbGV2ZWwgcGFja2FnZSBpbiBNZXRob2QgQ29yZSBkZWZpbmVzIHRoZSBjbGFzcyBNZXRob2QgRWxlbWVudCBmcm9tIHdoaWNoIGFsbCBvdGhlciBjbGFzc2VzIGRlZmluZWQgaW4gdGhlIHNwZWNpZmljYXRpb24gYXJlIGRlcml2ZWQgZnJvbS4gIE1ldGhvZCBFbGVtZW50IGl0c2VsZiBpcyBkZXJpdmVkIGZyb20gdGhlIFVNTCAyLjAgSW5mcmEtc3RydWN0dXJlIExpYnJhcnkgZWxlbWVudCBQYWNrYWdlYWJsZSBFbGVtZW50cy4gIFRoaXMgcGFja2FnZSBhbHNvIGRlZmluZXMga2V5IGJhc2ljIGVsZW1lbnRzIHVzZWQgdG8gZGUtZmluZSBhbmQgc3RydWN0dXJlIG1ldGhvZCBjb250ZW50IHR5cGVzLiAgRXZlcnkgY2xhc3MgZGVmaW5lZCBpbiB0aGlzIHNwZWNpZmljYXRpb24gaXMgZGVyaXZlZCBmcm9tIE1ldGhvZCBFbGVtZW50LiAgSW4gb3RoZXIgd29yZHMgTWV0aG9kIEVsZW1lbnQgaXMgdGhlIHJvb3QgZ2VuZXJhbGl6YXRpb24gZm9yIGFsbCBVTUEgY2xhc3NlcyBhbmQgZGVmaW5lcyBhIGNvbW1vbiBzZXQgb2YgYXR0cmlidXRlcyBpbmhlcml0ZWQgYnkgZXZlcnkgb3RoZXIgZWxlbWVudCB0eXBlIG9mIHRoaXMgbW9kZWwuICBNZXRob2QgRWxlbWVudCBpdHNlbGYgaXMgZGVyaXZlZCBmcm9tIFBhY2thZ2VhYmxlIEVsZW1lbnQgZnJvbSB0aGUgVU1MIDIuMCBJbmZyYXN0cnVjdHVyZS4gIE1ldGhvZCBFbGVtZW50IGluaGVyaXRzIHRoZSBOYW1lIGF0dHJpYnV0ZSBmcm9tIFBhY2thZ2VhYmxlIEVsZW1lbnQncyBzdXBlciBjbGFzcy4gQSBNb2RlbCBFbGVtZW50IGlzIHBhcnQgb2YgYSBtZXRob2QgbW9kZWwgYW5kIGV2ZXJ5IG1ldGhvZCBtb2RlbCBwYXJ0IGlzIGEgTWV0aG9kIEVsZW1lbnQuICBFdmVyeSBNZXRob2QgRWxlbWVudCBpcyBhdCBsZWFzdCBkZWZpbmVkIGJ5IGEgdW5pcXVlIGlkIGFzIHdlbGwgYXMgYnJpZWYgZGVzY3JpcHRpb24uIi8+Ci0gICAgICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hFRjd0ZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURERjhCRDAyOEYiIHNvdXJjZT0iX0hFRjdoZWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hFRjdwZWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRUY3dU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFUHNnT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVBzZ2VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEVGN3VlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hFRjd0dWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEVGN3QtZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMCwgLTUzMywgMCwgMTM5N10kWzAsIC0xNDEzLCAwLCA1MTZdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hFUHNndWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRVBzZy1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hFUHNoT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURERjcxQjAzQTgiIHNvdXJjZT0iX0hFRjdwZWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hFRjdsZWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVBzaC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFUHNpZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVBzaXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEVQc2lPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hFUHNoZWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IRVBzaHVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMTI5NSwgLTI1NCwgMjkyMSwgNTU4XSRbLTIwMzIsIC0zOTcsIDIxODQsIDQxNF0iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEVQc2ktZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hFUHNqT2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEVQc25lZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRERGOEQ0MDIxMSIgc291cmNlPSJfSEVGN2xlZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEVQc2plZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFUHNvT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVQc291ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFUHNvLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRVBzb2VmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEVQc251ZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IRVBzbi1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9Ils1MCwgLTUyNCwgMCwgMTcxMF0kWzUwLCAtMTQ2NCwgMCwgNzcwXSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRVBzcE9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEVQc3BlZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IRVBzcHVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFEREY5MTIwM0MwIiBzb3VyY2U9Il9IRUY3cGVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IRVBzamVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVQc3FlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVBzcS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVQc3JPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hFUHNxdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IRVBzcC1mWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEVQc3FPZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTcxMSwgLTUyNCwgMzQ1NCwgMjUyM10kWy0zMTE1LCAtMjI3NywgMTA0OSwgNzcwXSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRVBzcmVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEVQc3J1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IRVBzei1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRTRFM0IwMzE5IiBzb3VyY2U9Il9IRVBzdi1mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IRVBzdi1mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVQczB1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVBzMU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVQczFlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hFUHMwLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVBzMXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRTRFM0QwMzY0Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVBzMk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRVBzMS1mWEVkdXFIb09KYlVSWlJ3IiB4PSItMjIiIHk9IjYyNiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFUHMyZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMUU0RTNEMDM2NCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVQczItZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hFUHMydWZYRWR1cUhvT0piVVJaUnciIHg9IjM3IiB5PSIyODciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVBzM09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjFFNEUzRDAzNjIiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFUHMzdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEVQczNlZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTQ3OSIgeT0iNTYyIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVQczMtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMUU0RTNEMDM2MiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVQczRlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEVQczRPZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTExNTAiIHk9IjMwNiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFUHM0dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjFFNEUzRDAzNjQiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFUHM1T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFUHM1ZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hFUHM0LWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVBzNXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjFFNEUzRDAzNjIiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFUHM2T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFUHM2ZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hFUHM1LWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVBzNnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMUU0RTNEMDM2NCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVQczdPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEVQczdlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEVQczYtZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFUHM3dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjFFNEUzRDAzNjIiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFUHM4T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEVQczhlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEVQczctZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hFUHMwT2ZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEVQczBlZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTgxMiwgNzc4LCAtODEyLCA3NzhdJFstODEyLCAxNzE4LCAtODEyLCAxNzE4XSRbLTM2MTUsIDE3MTgsIC0zNjE1LCAxNzE4XSRbLTM2MTUsIDg0LCAtMzYxNSwgODRdJFstMjI2OSwgODQsIC0yMjY5LCA4NF0iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hFUHRBdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjk0RUMyNzAxMDYiIHNvdXJjZT0iX0hFUHM4dWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hFRjdoZWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVB0QmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFUHRCLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVB0Q09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEVQdEJ1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hFUHRBLWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEVQdEJPZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTEyNDMsIC01MDMsIDAsIDMyODBdJFstMTI0MywgLTM0NjYsIDAsIDMxN10iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEVQdENlZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hFUHRDdWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEVQdEctZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMUU0REFDMDFBMCIgc291cmNlPSJfSEVQdEMtZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEVQc3YtZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFUHRIdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVQdElPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFUHRJZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRVB0SC1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVQdEl1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMUU0REFEMDA1NyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVQdEpPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEVQdEktZlhFZHVxSG9PSmJVUlpSdyIgeD0iMjQyIiB5PSIzODkiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVB0SmVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjFFNERBRDAwNTciPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFUHRKLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRVB0SnVmWEVkdXFIb09KYlVSWlJ3IiB4PSItMTE0IiB5PSItMzU2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVQdEtPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRTREQUQwMDREIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVB0S3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hFUHRLZWZYRWR1cUhvT0piVVJaUnciIHg9Ii00NiIgeT0iMTQzIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVZMmNPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMUU0REFEMDA0RCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVZMmN1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEVZMmNlZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTUyMSIgeT0iLTIwNCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFWTJjLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjFFNERBRDAwNTciPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFWTJkZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFWTJkdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hFWTJkT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVkyZC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjFFNERBRDAwNEQiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFWTJlZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFWTJldWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hFWTJlT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVkyZS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMUU0REFEMDA1NyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVZMmZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEVZMmZ1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEVZMmZPZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFWTJmLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjFFNERBRDAwNEQiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFWTJnZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEVZMmd1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEVZMmdPZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hFUHRIT2ZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEVQdEhlZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbNDc2LCA3MTQsIDQxMjcsIC0xODI2XSRbNDc2LCAyNjE5LCA0MTI3LCA3OV0kWy0xNDAyLCAyNjE5LCAyMjQ5LCA3OV0iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hFWTJnLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjk0RUM2MDAyQkQiIHNvdXJjZT0iX0hFUHRDLWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hFUHM4dWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVkyaHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFWTJpT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVkyaWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEVZMmgtZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFWTJpdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjk0RUM2MDAyQkYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFWTJqT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hFWTJpLWZYRWR1cUhvT0piVVJaUnciIHg9Ii0xMzQiIHk9Ii0yNzkiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVkyamVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyOTRFQzYwMDJCRiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVZMmotZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hFWTJqdWZYRWR1cUhvT0piVVJaUnciIHg9Ijc1MiIgeT0iMTc2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVZMmtPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI5NEVDNjAwMkJFIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVkya3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hFWTJrZWZYRWR1cUhvT0piVVJaUnciIHg9IjEzOSIgeT0iLTE0NCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFWTJrLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI5NEVDNjAwMkJFIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVkybGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRVkybE9mWEVkdXFIb09KYlVSWlJ3IiB4PSIyNzQiIHk9Ii0zNDgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVkybHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI5NEVDNjAwMkJGIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVkybU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRVkybWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRVkybC1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVZMm11ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI5NEVDNjAwMkJFIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVkybk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRVkybmVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRVkybS1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVZMm51ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjk0RUM2MDAyQkYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFWTJvT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFWTJvZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hFWTJuLWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVkyb3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI5NEVDNjAwMkJFIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVkycE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFWTJwZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hFWTJvLWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IRVkyaE9mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hFWTJoZWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzIyNzcsIDU5LCAtNDY1LCA0MjI0XSRbNDMxOCwgNTksIDE1NzQsIDQyMjRdJFs0MzE4LCAtMzU4OSwgMTU3NCwgNTc1XSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEVZMnB1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyOTRFQzRBMDMwNiIgc291cmNlPSJfSEVQc3ItZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEVQczh1ZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFWTJxZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVZMnEtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFWTJyT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRVkycXVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEVZMnAtZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IRVkycU9mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9Ils0NTcsIC01NTAsIC0xMjE5LCAxNjM0XSRbNDU3LCAtMTYwOCwgLTEyMTksIDU3NV0iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEVZMnJlZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hFWTJydWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEVZMjMtZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRUMzMzRGMDE5OCIgc291cmNlPSJfSEVZMnotZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEVGN2xlZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFWTI0dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVZMjVPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFWTI1ZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRVkyNC1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEVZMjRPZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IRVkyNGVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlswLCAtNzg3LCAwLCAzODM1XSRbMCwgLTQxMDYsIDAsIDUxNl0iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEVZMjV1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hFWTI1LWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEVZMjZPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E4NUU3MDA1MiIgc291cmNlPSJfSEVZMnotZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEVZMnItZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFWTI2LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVZMjdlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFWTI3dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRVkyN09mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVZMjctZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBODVFOTAwMEEiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFWTI4ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hFWTI4T2ZYRWR1cUhvT0piVVJaUnciIHk9IjM5NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFWTI4dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E4NUU5MDAwQSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVZMjlPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hFWTI4LWZYRWR1cUhvT0piVVJaUnciIHk9Ii0zOTciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVkyOWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBODVFOTAwMDgiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFWTI5LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEVZMjl1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iNiIgeT0iLTE2OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFWTItT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBODVFOTAwMDgiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFWTItdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hFWTItZWZYRWR1cUhvT0piVVJaUnciIHg9Ii0yNyIgeT0iMTA5MyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFWTItLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBODVFOTAwMEEiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFWTJfZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFWTJfdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hFWTJfT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVkyXy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBODVFOTAwMDgiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFWTNBZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFWTNBdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hFWTNBT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVkzQS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E4NUU5MDAwQSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVZM0JlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEVZM0J1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEVZM0JPZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFWTNCLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBODVFOTAwMDgiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFWTNDZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEVZM0N1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEVZM0NPZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hFWTI2ZWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEVZMjZ1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTIwMzgsIDE1OSwgMTU4LCAtMjgwNF0kWy0yNjk5LCAxNTksIC01MDMsIC0yODA0XSRbLTI2OTksIDI0NjAsIC01MDMsIC01MDNdIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IRVkzQy1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTg1QUUwMkNFIiBzb3VyY2U9Il9IRVkyci1mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IRVkyei1mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVZM0R1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVkzRU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVZM0VlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hFWTNELWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IRVkzRE9mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hFWTNEZWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzU0MSwgLTU3NSwgLTE1OTEsIDI0NzJdJFs1NDEsIC0yMjc3LCAtMTU5MSwgNzcwXSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRVkzRXVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEVZM0UtZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IRVkzRk9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3OTU2MjQwMTdFIiBzb3VyY2U9Il9IRVBzdi1mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IRVkyei1mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVZM0YtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVkzR2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVZM0d1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hFWTNHT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IRVkzRmVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hFWTNGdWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzg5OSwgLTc5NCwgLTQyNCwgNzY5OV0kWzg5OSwgLTc3MjYsIC00MjQsIDc2N10iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEVZM0ctZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hFWTNIT2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEVZM0hlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyOTRFQzJCMDFDQSIgc291cmNlPSJfSEVQczh1ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEVZMnotZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFaW5jT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVpbmN1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFaW5jLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRWluY2VmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEVZM0h1ZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IRVkzSC1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMjA5MSwgODQsIDI5ODgsIDE4NjJdJFstMzQzNywgODQsIDE2NDIsIDE4NjJdJFstMzQzNywgLTk5OSwgMTY0MiwgNzc4XSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRWluZE9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEVpbmRlZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IRWluZHVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIwMDU4M0IwMUU2IiBzb3VyY2U9Il9IRVB0Qy1mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IRVkyei1mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVpbmVlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRWluZS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVpbmZPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hFaW5ldWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IRWluZC1mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hFaW5lT2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0xNzAxLCAtNzM2LCA2MzUsIDUyMDddJFstMTcwMSwgLTUxNzMsIDYzNSwgNzcwXSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRWluZmVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEVpbmZ1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IRWluZi1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDU1RTY1MEMwMEE2IiBzb3VyY2U9Il9IRVkyei1mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IRVkydi1mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVpbmd1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRWluaE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVpbmhlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hFaW5nLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRWluaHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQ1NUU2NTBEMDAzNyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVpbmlPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEVpbmgtZlhFZHVxSG9PSmJVUlpSdyIgeT0iMzk2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVpbmllZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDU1RTY1MEQwMDM3Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRWluaS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEVpbml1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTM5NyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFaW5qT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQ1NUU2NTBEMDAwNSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVpbmp1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRWluamVmWEVkdXFIb09KYlVSWlJ3IiB4PSI2ODIiIHk9IjE3OSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFaW5qLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0NTVFNjUwRDAwMDUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFaW5rZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hFaW5rT2ZYRWR1cUhvT0piVVJaUnciIHg9IjY4MiIgeT0iLTIwMzEiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRWlua3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDU1RTY1MEQwMDM3Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRWlubE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRWlubGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRWluay1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVpbmx1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDU1RTY1MEQwMDA1Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRWlubU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRWlubWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRWlubC1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVpbm11ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0NTVFNjUwRDAwMzciPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFaW5uT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFaW5uZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hFaW5tLWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRWlubnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDU1RTY1MEQwMDA1Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRWlub09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFaW5vZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hFaW5uLWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IRWluZ09mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hFaW5nZWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0yMDM4LCAtNDc2LCAxOTA1LCAtNTY4OF0kWy01MTA3LCAtNDc2LCAtMTE2NCwgLTU2ODhdJFstNTEwNywgNDcwOSwgLTExNjQsIC01MDNdIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IRWlub3VmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDU1RTY2N0EwMEQ5IiBzb3VyY2U9Il9IRVkydi1mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IRUY3bGVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVpbnBlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRWlucC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVpbnFPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hFaW5wdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IRWluby1mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hFaW5wT2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0yMzI4LCAtMTU5LCAtNjAzMiwgOTg2OV0kWy0yNjcxLCAtMTU5LCAtNjM3NSwgOTg2OV0kWy0yNjcxLCAtMTAxMzMsIC02Mzc1LCAtMTA1XSRbMTc0NywgLTEwMTMzLCAtMTk1NywgLTEwNV0iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEVpbnFlZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hFaW5xdWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgPC9jb250ZW50cz4KLSAgICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dycU5ZZWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyNjIiPgotICAgICAgICAgICAgPGJvZHk+MDE8L2JvZHk+Ci0gICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VNZXJnZSB4bWk6aWQ9Il9ub3lUTU94Z0VkdUhqZTNwUGFoTjRBIiBtZXJnZWRQYWNrYWdlPSJfM0FEQzdCNzQwMjJENDFEREY4NjkwMTJFIi8+Ci0gICAgICAgICAgPHBhY2thZ2VNZXJnZSB4bWk6aWQ9Il9jNnRka094NUVkdTUtdlZqbGZWc2ZRIiBtZXJnZWRQYWNrYWdlPSJfM0FEQzdCNzQwMjJENDExOUE2MkIwMzZGIi8+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyODAiIG5hbWU9Ik1ldGhvZEVsZW1lbnQiIGlzQWJzdHJhY3Q9InRydWUiPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HcnFOWi1mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjgwIj4KLSAgICAgICAgICAgICAgPGJvZHk+RXZlcnkgY2xhc3MgZGVmaW5lZCBpbiB0aGlzIHNwZWNpZmljYXRpb24gaXMgZGVyaXZlZCBmcm9tIE1ldGhvZCBFbGVtZW50LiAgSW4gb3RoZXIgd29yZHMgTWV0aG9kIEVsZW1lbnQgaXMgdGhlIHJvb3QgZ2VuZXJhbGl6YXRpb24gZm9yIGFsbCBVTUEgY2xhc3NlcyBhbmQgZGVmaW5lcyBhIGNvbW1vbiBzZXQgb2YgYXR0cmlidXRlcyBpbmhlcml0ZWQgYnkgZXZlcnkgb3RoZXIgZWxlbWVudCB0eXBlIG9mIHRoaXMgbW9kZWwuICBNZXRob2QgRWxlbWVudCBpdHNlbGYgaXMgZGVyaXZlZCBmcm9tIFBhY2thZ2VhYmxlIEVsZW1lbnQgZnJvbSB0aGUgVU1MIDIuMCBJbmZyYXN0cnVjdHVyZS4gIE1ldGhvZCBFbGVtZW50IGluaGVyaXRzIHRoZSBOYW1lIGF0dHJpYnV0ZSBmcm9tIFBhY2thZ2VhYmxlIEVsZW1lbnQncyBzdXBlciBjbGFzcy4gIEV2ZXJ5IGVsZW1lbnQgZGVmaW5lZCBhcyBhIFVNQSBpbnN0YW5jZSBpcyBkZXJpdmVkIGZyb20gTW9kZWwgRWxlbWVudC4gIEV2ZXJ5IE1ldGhvZCBFbGVtZW50IGluLXN0YW5jZSBpcyBhdCBsZWFzdCBkZWZpbmVkIGJ5IGEgdW5pcXVlIGlkLCBhIG5hbWUsIGFzIHdlbGwgYXMgYnJpZWYgZGVzY3JpcHRpb24uPC9ib2R5PgotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDFFQzMzNEYwMTk4IiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDFEREU4MzMwMUE1Ii8+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMDUwIiBuYW1lPSJndWlkIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiPgotICAgICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dycU5hLWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAwNTAiPgotICAgICAgICAgICAgICAgIDxib2R5PkV2ZXJ5IGluc3RhbmNlIG9mIE1ldGhvZCBFbGVtZW50IGhhcyBhIGdsb2JhbCB1bmlxdWUgaWQuPC9ib2R5PgotICAgICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfNjlBV0VleUZFZHU1LXZWamxmVnNmUSIgdmFsdWU9IjEiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfNjlBV0VPeUZFZHU1LXZWamxmVnNmUSIvPgotICAgICAgICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfOHpVWGNPeUZFZHU1LXZWamxmVnNmUSIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyIgdmFsdWU9IiIvPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAwNDciIG5hbWU9ImJyaWVmRGVzY3JpcHRpb24iIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyI+Ci0gICAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3JxTmJ1ZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDA0NyI+Ci0gICAgICAgICAgICAgICAgPGJvZHk+RXZlcnkgaW5zdGFuY2Ugb2YgTWV0aG9kIEVsZW1lbnQgc2hhbGwgYmUgYnJpZWZseSBkZXNjcmliZWQgd2l0aCBvbmUgb3IgdHdvIHNlbnRlbmNlcyBzdW1tYXJpemluZyB0aGUgZWxlbWVudC48L2JvZHk+Ci0gICAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9SOElac2V5RkVkdTUtdlZqbGZWc2ZRIiB2YWx1ZT0iMSIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9SOElac095RkVkdTUtdlZqbGZWc2ZRIi8+Ci0gICAgICAgICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il9UR0NvRU95RkVkdTUtdlZqbGZWc2ZRIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIiB2YWx1ZT0iIi8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyN0E4NUU5MDAwOCIgbmFtZT0ib3duZWRSdWxlcyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDI3QTg1N0IwMzMzIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQyN0E4NUU3MDA1MiI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0dzUURRdWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0dzUURRZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDU1RTY1MEQwMDA1IiBuYW1lPSJtZXRob2RFbGVtZW50UHJvcGVydHkiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQ1NUU2MjAyMDMyQSIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0NTVFNjUwQzAwQTYiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9Hc1owUi1mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9Hc1owUnVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjZDIiBuYW1lPSJDb250ZW50RWxlbWVudCIgaXNBYnN0cmFjdD0idHJ1ZSI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dyelhVdWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyNkMiPgotICAgICAgICAgICAgICA8Ym9keT5Db250ZW50IEVsZW1lbnQgaXMgYSBEZXNjcmliYWJsZSBFbGVtZW50IHRoYXQgcmVwcmVzZW50cyBhbiBhYnN0cmFjdCBnZW5lcmFsaXphdGlvbiBmb3IgYWxsIGVsZW1lbnRzIHRoYXQgYXJlIGNvbnNpZGVyZWQgdG8gYmUgYW5kIG1hbmFnZWQgYXMgTWV0aG9kIENvbnRlbnQuCi1Db250ZW50IEVsZW1lbnRzIHJlcHJlc2VudHMgcmV1c2FibGUgTWV0aG9kIENvbnRlbnQgdGhhdCBpcyBzdXBwb3NlZCB0byBiZSBtYW5hZ2VkIGluIENvbnRlbnQgUGFja2FnZXMuICBUaGUgc2VwYXJhdGlvbiBvZiBDb250ZW50IEVsZW1lbnQgZnJvbSBQcm9jZXNzIEVsZW1lbnQgYWxsb3dzIHRvIGNsZWFybHkgZGlzdGluZ3Vpc2ggYmV0d2VlbiBwdXJlIG1ldGhvZCBjb250ZW50IGZyb20gY29udGVudCB0aGF0IGlzIHJlcHJlc2VudGVkIGluIHByb2Nlc3Nlcy4KLTwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyOTRFQzRBMDMwNiIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQyOTRFQjkwMDBGQyIvPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDFERTRBOTcwMTIzIiBuYW1lPSJDb250ZW50RGVzY3JpcHRpb24iPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HcnpYVnVmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERTRBOTcwMTIzIj4KLSAgICAgICAgICAgICAgPGJvZHk+Q29udGVudCBEZXNjcmlwdGlvbiBpcyBhIE1ldGhvZCBFbGVtZW50IHRoYXQgaXMgdXNlZCB0byBzdG9yZSB0aGUgdGV4dHVhbCBkZXNjcmlwdGlvbiBmb3IgYSBDb250ZW50IEVsZW1lbnQuICBJdCBkZWZpbmVzIHN0YW5kYXJkIGF0dHJpYnV0ZXMgYXBwbGljYWJsZSBmb3IgYWxsIENvbnRlbnQgRWxlbWVudCB0eXBlcy4gIFNwZWNpZmljIENvbnRlbnQgRWxlbWVudCBzdWItdHlwZXMgY2FuIGRlZmluZSB0aGVpciBvd24gbWF0Y2hpbmcgQ29udGVudCBEZXNjcmlwdGlvbiBzdWItdHlwZXMuIDwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyMDA1ODNCMDFFNiIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI4MCIvPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxREYzMjE5MDAyOSIgbmFtZT0ibWFpbkRlc2NyaXB0aW9uIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiPgotICAgICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dyelhXdWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURGMzIxOTAwMjkiPgotICAgICAgICAgICAgICAgIDxib2R5PlRoaXMgYXR0cmlidXRlIHN0b3JlIHRoZSBtYWluIGRlc2NyaXB0aXZlIHRleHQgZm9yIHRoZSBDb250ZW50IEVsZW1lbnQuICBBbGwgdGV4dCB0aGF0IGlzIG5vdCBwYXJ0IG9mIGFueSBvZiB0aGUgbW9yZSBzcGVjaWZpYyBhdHRyaWJ1dGVzIHNoYWxsIGJlIHN0b3JlZCBoZXJlLiAgSWYgdGhlIENvbnRlbnQgRGVzY3JpcHRpb24gaXMgZGl2aWRlZCBpbnRvIHNlY3Rpb25zIHVzaW5nIHRoZSBTZWN0aW9uIGNsYXNzLCB0aGVuIG9ubHkgdGhlIHRleHQgZnJvbSB0aGUgJ3N0YXJ0JyBvZiB0aGUgY29udGVudCBkZXNjcmlwdGlvbiB0byB0aGUgZmlyc3Qgc2VjdGlvbiB3aWxsIGJlIHN0b3JlZCBoZXJlIChzaW1pbGFyIHRvIGEgbm9ybWFsIGRvY3VtZW50IHdoZXJlIHlvdSBjYW4gcGxhY2UgdGV4dCBiZXR3ZWVuIGl0cyBiZWdpbm5pbmcgdG8gaXRzIGZpcnN0IGRpY3Rpb24gaGVhZGluZykuPC9ib2R5PgotICAgICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfM1UxMU1leUlFZHU1LXZWamxmVnNmUSIgdmFsdWU9IjEiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfM1UxMU1PeUlFZHU1LXZWamxmVnNmUSIvPgotICAgICAgICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfM05zRVVPeUlFZHU1LXZWamxmVnNmUSIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyIgdmFsdWU9IiIvPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MjFFNERBRDAwNEQiIG5hbWU9InNlY3Rpb25zIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MjFFNENGMzAxQUUiIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDIxRTREQUMwMUEwIj4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3NRRFNlZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3NRRFNPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyMUU0Q0YzMDFBRSIgbmFtZT0iU2VjdGlvbiI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dyelhYZWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjFFNENGMzAxQUUiPgotICAgICAgICAgICAgICA8Ym9keT5BIFNlY3Rpb24gaXMgYSBzcGVjaWFsIE1ldGhvZCBFbGVtZW50IHRoYXQgcmVwcmVzZW50cyBzdHJ1Y3R1cmFsIHN1YnNlY3Rpb25zIG9mIGEgQ29udGVudCBEZXNjcmlwdGlvbidzIHNlY3Rpb25EZXNjcmlwdGlvbiBhdHRyaWJ1dGUuICBJdCBpcyB1c2VkIGZvciBlaXRoZXIgbGFyZ2Ugc2NhbGUgZG9jdW1lbnRhdGlvbiBvZiBDb250ZW50IEVsZW1lbnRzIG9yZ2FuaXplZCBpbnRvIHNlY3Rpb25zIGFzIHdlbGwgYXMgdG8gZmxleGlibHkgYWRkIG5ldyBTZWN0aW9ucyB0byBDb250ZW50IEVsZW1lbnRzIHVzaW5nIGNvbnRyaWJ1dGlvbiB2YXJpYWJpbGl0eSBhZGRlZCB0byB0aGUgU2VjdGlvbiBjb25jZXB0IGZvciBNZXRob2QgUGx1Zy1pbnMuPC9ib2R5PgotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDI3OTU2MjQwMTdFIiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjgwIi8+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDI3OTYyNUQwMjM0IiBuYW1lPSJzZWN0aW9uTmFtZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIj4KLSAgICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HcjlJVS1mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3OTYyNUQwMjM0Ij4KLSAgICAgICAgICAgICAgICA8Ym9keT5FdmVyeSBTZWN0aW9uIGhhcyBhIG5hbWUgdXNlZCBmb3IgZXh0ZXJuYWwgcHJlc2VudGF0aW9uIG9mIHRoZSBzZWN0aW9uLCBlLmcuIHdoZW4gcHVibGlzaGVkIG9yIHdoZW4gc2VjdGlvbiBoZWFkaW5nIGFyZSBsaXN0ZWQgaW4gYSB0YWJsZSBvZiBjb250ZW50cy4gIFRoaXMgYXR0cmlidXRlIGlzIHNpbWlsYXIgdG8gUHJlc2VudGF0aW9uIE5hbWUgZm9yIENvbnRlbnQgRWxlbWVudHMuPC9ib2R5PgotICAgICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfbzFWVUlleUhFZHU1LXZWamxmVnNmUSIgdmFsdWU9IjEiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfbzFWVUlPeUhFZHU1LXZWamxmVnNmUSIvPgotICAgICAgICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfb3RiOFlPeUhFZHU1LXZWamxmVnNmUSIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyIgdmFsdWU9IiIvPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MjFFNERGMzAwM0EiIG5hbWU9InNlY3Rpb25EZXNjcmlwdGlvbiIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIj4KLSAgICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HcjlJVnVmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRTRERjMwMDNBIj4KLSAgICAgICAgICAgICAgICA8Ym9keT5UaGlzIGF0dHJpYnV0ZXMgc3RvcmUgdGhlIGRlc2NyaXB0aW9uIHRleHQgZm9yIGEgQ29udGVudCBEZXNjcmlwdGlvbidzIFNlY3Rpb24uPC9ib2R5PgotICAgICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfNVBWTDhleUlFZHU1LXZWamxmVnNmUSIgdmFsdWU9IjEiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfNVBWTDhPeUlFZHU1LXZWamxmVnNmUSIvPgotICAgICAgICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfNUh1dklPeUlFZHU1LXZWamxmVnNmUSIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyIgdmFsdWU9IiIvPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MjFFNEUzRDAzNjIiIG5hbWU9InN1YlNlY3Rpb25zIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MjFFNENGMzAxQUUiIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDIxRTRFM0IwMzE5Ij4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3NRRFV1ZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3NRRFVlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyN0E4NTdCMDMzMyIgbmFtZT0iQ29uc3RyYWludCI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dyOUlXZWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBODU3QjAzMzMiPgotICAgICAgICAgICAgICA8Ym9keT5BIENvbnN0cmFpbnQgaXMgYSBNZXRob2QgRWxlbWVudCB0aGF0IHJlcHJlc2VudHMgYSBjb25kaXRpb24gb3IgcmVzdHJpY3Rpb24gZXhwcmVzc2VkIGluIG5hdHVyYWwgbGFuZ3VhZ2UgdGV4dCBvciBpbiBhIG1hY2hpbmUgcmVhZGFibGUgbGFuZ3VhZ2UgZm9yIHRoZSBwdXJwb3NlIG9mIGRlY2xhcmluZyBzb21lIG9mIHRoZSBzZW1hbnRpY3Mgb2YgYSBNZXRob2QgRWxlbWVudC48L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MjdBODVBRTAyQ0UiIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyODAiLz4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MjdBOEExRjAyRjMiIG5hbWU9ImJvZHkiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyI+Ci0gICAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3I5SVhlZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E4QTFGMDJGMyI+Ci0gICAgICAgICAgICAgICAgPGJvZHk+VGhpcyBhdHRyaWJ1dGUgc3RvcmVzIHRoZSBkZWZpbml0aW9uIG9mIHRoZSBjb25zdHJhaW50LjwvYm9keT4KLSAgICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iXzhwaVQ0ZXlHRWR1NS12VmpsZlZzZlEiIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iXzhwaVQ0T3lHRWR1NS12VmpsZlZzZlEiLz4KLSAgICAgICAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iXzhnY3BVT3lHRWR1NS12VmpsZlZzZlEiIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiIHZhbHVlPSIiLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0Mjk0RUI5MDAwRkMiIG5hbWU9IkRlc2NyaWJhYmxlRWxlbWVudCIgaXNBYnN0cmFjdD0idHJ1ZSI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dzRzVVdWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjk0RUI5MDAwRkMiPgotICAgICAgICAgICAgICA8Ym9keT5EZXNjcmliYWJsZSBFbGVtZW50IGlzIGFuIGFic3RyYWN0IGdlbmVyYWxpemF0aW9uIG9mIE1ldGhvZCBFbGVtZW50cyBmb3Igd2hpY2ggZXh0ZXJuYWwgcHJlc2VudGF0aW9uIG5hbWVzIGFzIHdlbGwgYXMgY29udGVudCBkZXNjcmlwdGlvbnMgaGF2ZSBiZWVuIGRlZmluZWQsIHN1Y2ggYXMgUm9sZXMgb3IgV29yayBQcm9kdWN0cy4gIFByZXNlbnRhdGlvbiBOYW1lIGFuZCBDb250ZW50IERlc2NyaXB0aW9ucyBhcmUgdHlwaWNhbGx5IGxvY2FsaXplZCB1c2luZyBhIHJlc291cmNlIGFsbG9jYXRpb24gbWVjaGFuaXNtIGZvciBpdHMgU3RyaW5nIHR5cGUgYXR0cmlidXRlcy4KLVRoaXMgYWJzdHJhY3Rpb24gcmVwcmVzZW50cyBhbGwgZWxlbWVudHMgaW4gdGhlIE1ldGhvZCBDb250ZW50IGFzIHdlbGwgYXMgUHJvY2VzcyBzcGFjZSBmb3Igd2hpY2ggY29uY3JldGUgdGV4dHVhbCBkZXNjcmlwdGlvbnMgYXJlIGRlZmluZWQgaW4gdGhlIGZvcm0gb2YgZG9jdW1lbnRpbmcgYXR0cmlidXRlcyBncm91cGVkIGluIGEgbWF0Y2hpbmcgQ29udGVudCBEZXNjcmlwdGlvbiBpbnN0YW5jZSAoc2VlIFNlY3Rpb24gNC4xLjQpLiAgRGVzY3JpYmFibGUgRWxlbWVudHMgYXJlIGludGVuZGVkIHRvIGJlIHB1Ymxpc2hlZCBpbiBtZXRob2Qgb3IgcHJvY2VzcyBwdWJsaWNhdGlvbnMgKHNpbWlsYXIgdG8gdGhlIElCTSBSYXRpb25hbCBVbmlmaWVkIFByb2Nlc3Mgd2ViKS4gIERlc2NyaWJhYmxlIEVsZW1lbnQgZGVmaW5lcyB0aGF0IHRoZSBlbGVtZW50IGl0IHJlcHJlc2VudHMgd2lsbCBoYXZlIGNvbnRlbnQgJ2F0dGFjaGVkJyB0byBpdC4gIENvbnRlbnQgRGVzY3JpcHRpb24gaXMgdGhlIGFic3RyYWN0aW9uIGZvciB0aGUgYWN0dWFsIHBsYWNlcyBpbiB3aGljaCB0aGUgY29udGVudCBpcyBiZWluZyByZXByZXNlbnRlZC4gIFRoaXMgc2VwYXJhdGlvbiBhbGxvd3MgYSBkaXN0aW5jdGlvbiBiZXR3ZWVuIGNvcmUgbWV0aG9kIG1vZGVsIGVsZW1lbnRzIGRlc2NyaWJpbmcgdGhlIHN0cnVjdHVyZSBvZiB0aGUgbW9kZWwgZnJvbSB0aGUgYWN0dWFsIGRlc2NyaXB0aW9uIGNvbnRhaW5lciBwcm92aWRpbmcsIGZvciBleGFtcGxlLCB0aGUgZG9jdW1lbnRhdGlvbiBvZiB0aGUgY29udGVudCBlbGVtZW50IGluIGRpZmZlcmVudCBhbHRlcm5hdGl2ZXMgbGFuZ3VhZ2VzLCBhdWRpZW5jZXMsIGxpY2Vuc2luZyBsZXZlbHMsIGV0Yy4KLTwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyOTRFQzI3MDEwNiIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQxRERFNjU4MDE1NyIvPgotICAgICAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyOTRFQzJCMDFDQSIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI4MCIvPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjlBQjk4MDJCOSIgbmFtZT0icHJlc2VudGF0aW9uTmFtZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIj4KLSAgICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9Hc0c1Vi1mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGOUFCOTgwMkI5Ij4KLSAgICAgICAgICAgICAgICA8Ym9keT5FdmVyeSBEZXNjcmliYWJsZSBFbGVtZW50IGhhcyBhIHByZXNlbnRhdGlvbiBuYW1lLCB3aGljaCBpcyB1c2VkIGZvciBleHRlcm5hbCBwcmVzZW50YXRpb24gb2YgdGhlIGVsZW1lbnQuICBGb3IgZXhhbXBsZSwgbmFtZSAodGhlIGludGVybmFsIHJlcHJlc2VudGF0aW9uKSBtaWdodCBiZSBzZXQgdG8gJnF1b3Q7cnVwX2FyY2hpdGVjdHVyZV9kb2N1bWVudCZxdW90OyB0byBkaWZmZXJlbnRpYXRlIGZyb20gYSAmcXVvdDtqMmVlX2FyY2hpdGN0dXJlX2RvY3VtZW50JnF1b3Q7IHdoZXJlYXMgdGhlIGV4dGVybmFsIHByZXNlbnRhdGlvbiB3b3VsZCBhbHdheXMgYmUgJnF1b3Q7QXJjaGl0ZWN0dXJlIERvY3VtZW50JnF1b3Q7LgotPC9ib2R5PgotICAgICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfNFh3TEVleUZFZHU1LXZWamxmVnNmUSIgdmFsdWU9IjEiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfNFh3TEVPeUZFZHU1LXZWamxmVnNmUSIvPgotICAgICAgICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfNXNaQ3dPeUZFZHU1LXZWamxmVnNmUSIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyIgdmFsdWU9IiIvPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0Mjk0RUM2MDAyQkYiIG5hbWU9InByZXNlbnRhdGlvbiIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDFERTRBOTcwMTIzIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQyOTRFQzYwMDJCRCI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0dzWjBRLWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0dzWjBRdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0NTVFNjIwMjAzMkEiIG5hbWU9Ik1ldGhvZEVsZW1lbnRQcm9wZXJ0eSI+Ci0gICAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDU1RTY2N0EwMEQ5IiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDFEREU4MzMwMUE1Ii8+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDU1RTY1QzgwMjE4IiBuYW1lPSJ2YWx1ZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIj4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfZHlyN2dleUdFZHU1LXZWamxmVnNmUSIgdmFsdWU9IjEiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfZHlyN2dPeUdFZHU1LXZWamxmVnNmUSIvPgotICAgICAgICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfZG56aE1PeUdFZHU1LXZWamxmVnNmUSIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyIgdmFsdWU9IiIvPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyN0E4NUU3MDA1MiIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDI3QTg1RTkwMDA4IF8zQURDN0I3NDAyMkQ0MjdBODVFOTAwMEEiPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9Hc0c1WGVmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTg1RTcwMDUyIj4KLSAgICAgICAgICAgICAgPGJvZHk+QSBNZXRob2QgRWxlbWVudCBjYW4gb3duIG1hbnkgQ29uc3RyYWludHMgZGVmaW5pbmcgcnVsZXMgZm9yIHRoaXMgZWxlbWVudC48L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MjdBODVFOTAwMEEiIG5hbWU9Il9tZXRob2RFbGVtZW50IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyODAiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MjdBODVFNzAwNTIiLz4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyMUU0REFDMDFBMCIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDIxRTREQUQwMDREIF8zQURDN0I3NDAyMkQ0MjFFNERBRDAwNTciPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9Hc1FEUmVmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRTREQUMwMUEwIj4KLSAgICAgICAgICAgICAgPGJvZHk+QSBDb250ZW50IERlc2NyaXB0aW9uIGNhbiBvcHRpb25hbGx5IGJlIHN0cnVjdHVyZSBpbnRvIFNlY3Rpb25zLiAgVGhpcyBhc3NvY2lhdGlvbiBpcyB1c2UgdG8gZGVjb21wb3NlZCBTZWN0aW9uIGludG8gYSBoaWVyYXJjaHkgb2YgU2VjdGlvbnMuPC9ib2R5PgotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICA8b3duZWRFbmQgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDIxRTREQUQwMDU3IiBuYW1lPSJfY29udGVudERlc2NyaXB0aW9uIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MURFNEE5NzAxMjMiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MjFFNERBQzAxQTAiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9Hc1FEVE9mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iMSIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9Hc1FEUy1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkRW5kPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDIxRTRFM0IwMzE5IiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0MjFFNEUzRDAzNjIgXzNBREM3Qjc0MDIyRDQyMUU0RTNEMDM2NCI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dzUURUdWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjFFNEUzQjAzMTkiPgotICAgICAgICAgICAgICA8Ym9keT5TZWN0aW9ucyBjYW4gYmUgZnVydGhlciBkZWNvbXBvc2VkIGludG8gbiBsZXZlbHMgb2Ygc3ViLXNlY3Rpb25zLjwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyMUU0RTNEMDM2NCIgbmFtZT0iX3NlY3Rpb24iIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQyMUU0Q0YzMDFBRSIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQyMUU0RTNCMDMxOSI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0dzUURWZWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0dzUURWT2ZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgICA8L293bmVkRW5kPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDI5NEVDNjAwMkJEIiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0Mjk0RUM2MDAyQkUgXzNBREM3Qjc0MDIyRDQyOTRFQzYwMDJCRiI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dzUURWLWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjk0RUM2MDAyQkQiPgotICAgICAgICAgICAgICA8Ym9keT5BIERlc2NyaWJhYmxlIEVsZW1lbnQgY2FuIGNvbnRhaW4gYSBDb250ZW50IERlc2NyaXB0aW9uIGVsZW1lbnQgdGhhdCBzdG9yZXMgdGV4dHVhbCBkZXNjcmlwdGlvbnMgZm9yIHRoaXMgQ29udGVudCBFbGVtZW50LiAgQ29udGVudCBEZXNjcmlwdGlvbiBpcyBpbnRlbmRlZCB0byBiZSByZWZpbmVkIHdpdGggc3ViLWNsYXNzZXMgYWRkaW5nIG1vcmUgZGVzY3JpcHRpb24gYXR0cmlidXRlcy4gIEFueSBvZiB0aGVzZSBzdWItdHlwZXMgY2FuIGJlIHJlbGF0ZWQgdG8gYSBDb250ZW50IEVsZW1lbnQuPC9ib2R5PgotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICA8b3duZWRFbmQgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDI5NEVDNjAwMkJFIiBuYW1lPSJfZGVzY3JpYmFibGVFbGVtZW50IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0Mjk0RUI5MDAwRkMiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0Mjk0RUM2MDAyQkQiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9Hc1owUU9mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iMSIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9Hc1FEV3VmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iMSIvPgotICAgICAgICAgICAgPC9vd25lZEVuZD4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQ1NUU2NTBDMDBBNiIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDU1RTY1MEQwMDA1IF8zQURDN0I3NDAyMkQ0NTVFNjUwRDAwMzciPgotICAgICAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQ1NUU2NTBEMDAzNyIgbmFtZT0iX21ldGhvZEVsZW1lbnQiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI4MCIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQ1NUU2NTBDMDBBNiIvPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOlBhY2thZ2UiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI5NCIgbmFtZT0iQ29yZUNvbnRlbnRFbGVtZW50cyI+Ci0gICAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il9HdFRNTS1mWEVkdXFIb09KYlVSWlJ3IiBzb3VyY2U9InVtbDIuZGlhZ3JhbXMiIHJlZmVyZW5jZXM9Il8zQURDN0I3NDAyMkQ0MEY0OEREQzAyQzciPgotICAgICAgICAgICAgPGNvbnRlbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpEaWFncmFtIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEY0OEREQzAyQzciIHR5cGU9IkNsYXNzIiBuYW1lPSJUYXhvbm9teSI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRWlucS1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMkRBIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVpbnJ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEVpbnItZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFaW5zT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVpbnNlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRWluc3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVpbnMtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRWludE9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVpbnRlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRWludHVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVzWWNPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRXNZY2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVzWWN1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEVzWWMtZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEVpbnJPZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9Ik5vbmUiIGxpbmVDb2xvcj0iMCIgc2hvd1BhcmVudD0iTmFtZSIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRWlucmVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxNzIzOSIgeT0iODU2MSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVzWWRPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI4MCI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFc1lkLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hFc1llT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIyODI3IiBoZWlnaHQ9IjEwNDkiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRXNZZWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFc1lldWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVzWWUtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFc1lmT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEVzWWZlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFc1lmdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEVzWWYtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFc1lnT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEVzWWdlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFc1lndWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFc1lnLWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hFc1lkZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dQYXJlbnQ9Ik5hbWUiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEVzWWR1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iNjA4NiIgeT0iNzg1Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRXNZaE9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMTdGIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVzWWgtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEVzWWlPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFc1lpZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVzWWl1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRXNZaS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVzWWpPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRXNZamVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVzWWp1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRXNZai1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVzWWtPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRXNZa2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVzWWt1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEVzWWstZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEVzWWhlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1BhcmVudD0iTmFtZSIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRXNZaHVmWEVkdXFIb09KYlVSWlJ3IiB4PSI1NTg4IiB5PSIxMTE1MiIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVzWWxPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDE4RiI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFc1lsLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hFc1ltT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxODI4IiBoZWlnaHQ9IjkwNSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFc1ltZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVzWW11ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRXNZbS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVzWW5PZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRXNZbmVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVzWW51ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRXNZbi1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVzWW9PZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRXNZb2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVzWW91ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEVzWW8tZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEVzWWxlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1BhcmVudD0iTmFtZSIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRXNZbHVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxMTQ0MyIgeT0iMTExNTIiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFc1lwT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyOTYiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRXNZcC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IRXNZcU9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVzWXFlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRXNZcXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFc1lxLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRXNZck9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFc1lyZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRXNZcnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFc1lyLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRXNZc09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFc1lzZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRXNZc3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRXNZcy1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IRXNZcGVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iTm9uZSIgbGluZUNvbG9yPSIwIiBzaG93UGFyZW50PSJOYW1lIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hFc1lwdWZYRWR1cUhvT0piVVJaUnciIHg9IjIzMDUwIiB5PSI4NTU5Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRXNZdE9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMTg1Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVzWXQtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEVzWXVPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjIwMzIiIGhlaWdodD0iOTA1Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVzWXVlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRXNZdXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFc1l1LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRXNZdk9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFc1l2ZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRXNZdnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFc1l2LWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRXNZd09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFc1l3ZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRXNZd3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRXNZdy1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IRXNZdGVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93UGFyZW50PSJOYW1lIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hFc1l0dWZYRWR1cUhvT0piVVJaUnciIHg9IjE3MjI2IiB5PSIxMTE1MiIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVzWXhPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDJCQyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFc1l4LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hFc1l5T2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIyNDU1IiBoZWlnaHQ9IjkwNSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFc1l5ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVzWXl1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRXNZeS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVzWXpPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRXNZemVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVzWXp1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRXNZei1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVzWTBPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRXNZMGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVzWTB1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEVzWTAtZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEVzWXhlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1BhcmVudD0iTmFtZSIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRXNZeHVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxMTQ0OCIgeT0iODU2MSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVzWTFPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI5RSI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFc1kxLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hFc1kyT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRXNZMmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFc1kydWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVzWTItZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFc1kzT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEVzWTNlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFc1kzdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEVzWTMtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFc1k0T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEVzWTRlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFc1k0dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFc1k0LWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hFc1kxZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJOb25lIiBsaW5lQ29sb3I9IjAiIHNob3dQYXJlbnQ9Ik5hbWUiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEVzWTF1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iNTU5MSIgeT0iODU1OSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVzWV8tZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI2QyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFc1pBdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hFc1pBLWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIyODc4IiBoZWlnaHQ9IjEwNDkiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRXNaQk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFc1pCZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVzWkJ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFc1pCLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEVzWkNPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFc1pDZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEVzWkN1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFc1pDLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEVzWkRPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFc1pEZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFc1pEdWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hFc1pBT2ZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dQYXJlbnQ9Ik5hbWUiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEVzWkFlZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTE4ODIiIHk9IjU5NzciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFMWlhLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjc5NEE2NjAzNjgiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRTFpYnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IRTFpYi1mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEUxaWNPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRTFpY2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFMWljdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRTFpYy1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFMWlkT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRTFpZGVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFMWlkdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRTFpZC1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFMWllT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRTFpZWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRTFpZXVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IRTFpYk9mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93UGFyZW50PSJOYW1lIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hFMWliZWZYRWR1cUhvT0piVVJaUnciIHg9IjI0MTUiIHk9IjU5NjYiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFMWllLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjFFNENGMzAxQUUiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRTFpZnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IRTFpZi1mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMjc5NCIgaGVpZ2h0PSIxMDMyIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEUxaWdPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRTFpZ2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFMWlndWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRTFpZy1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFMWloT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRTFpaGVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFMWlodWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRTFpaC1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFMWlpT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRTFpaWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRTFpaXVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IRTFpZk9mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93UGFyZW50PSJOYW1lIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hFMWlmZWZYRWR1cUhvT0piVVJaUnciIHg9Ijc4MyIgeT0iMzM2MyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEUxaWxPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E4MkQzMDE3RiI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFMWlsLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hFMWltT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIyNjU4IiBoZWlnaHQ9IjkwNSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFMWltZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEUxaW11ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRTFpbS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEUxaW5PZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRTFpbmVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEUxaW51ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRTFpbi1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEUxaW9PZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRTFpb2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEUxaW91ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEUxaW8tZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEUxaWxlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1BhcmVudD0iTmFtZSIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRTFpbHVmWEVkdXFIb09KYlVSWlJ3IiB4PSI1NTkzIiB5PSIzMzgwIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRTFpdHVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI5NEVCOTAwMEZDIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEUxaXVlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEUxaXV1ZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjM2MDYiIGhlaWdodD0iMTAzMiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFMWl1LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEUxaXZPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRTFpdmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEUxaXZ1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRTFpdi1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEUxaXdPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRTFpd2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEUxaXd1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRTFpdy1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEUxaXhPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEUxaXhlZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEUxaXQtZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1BhcmVudD0iTmFtZSIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRTFpdU9mWEVkdXFIb09KYlVSWlJ3IiB4PSIxMTQzNyIgeT0iMzM2OSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxEaWFncmFtU3R5bGUiIHhtaTppZD0iX0d0VE1OZWZYRWR1cUhvT0piVVJaUnciIGRlc2NyaXB0aW9uPSJUaGUgQ29yZSBDb250ZW50IEVsZW1lbnRzIHBhY2thZ2UgZGVmaW5lcyB0aGUgY29yZSBlbGVtZW50cyBvZiBldmVyeSBtZXRob2Qgc3VjaCBhcyByb2xlcywgdGFza3MsIGFuZCB3b3JrIHByb2R1Y3RzLiAgVGhpcyBkaWFncmFtIHNob3dzIGEgdGF4b25vbXkgb2YgdGhlIGVsZW1lbnRzIGRlZmluZWQgaW4gdGhpcyBwYWNrYWdlLiAgQWxsIENvcmUgQ29udGVudCBFbGVtZW50cywgd2l0aCB0aGUgZXhjZXB0aW9uIG9mIFN0ZXAsIGFyZSBkZXJpdmVkIGZyb20gQ29udGVudCBFbGVtZW50LiAgU3RlcCBpcyBub3QgYSBDb250ZW50IEVsZW1lbnQsIGJlY2F1c2UgaXQgaXMgZGVmaW5lZCBhcyBhIHNwZWNpYWwgU2VjdGlvbiB3aGljaCB3YXMgZGVmaW5lZCBpbiB0aGUgbGFzdCBTZWN0aW9uIGFzIGEgcGFydCBvZiBDb250ZW50IERlc2NyaXB0aW9uLiAgSW4gb3RoZXIgd29yZHMsIFN0ZXAgYWxyZWFkeSBpcyBhIGRlc2NyaXB0aW9uIGZvciBjb250ZW50IGFuZCB0aGVyZSBkb2VzIG5vdCByZXF1aXJlIGJlaW5nIGEgQ29udGVudCBFbGVtZW50IHdpdGggaXRzIG93biBDb250ZW50IERlc2NyaXB0aW9uIHBhcnQuICBTdGVwIGFuZCBUYXNrIGFyZSBkZXJpdmVkIGZyb20gYSBuZXcgYWJzdHJhY3Rpb24gaW50cm9kdWNlZCBpbiB0aGlzIHBhY2thZ2UgY2FsbCBXb3JrIERlZmluaXRpb24sIHdoaWNoIHJlcHJlc2VudHMgYmVoYXZpb3JhbCBkZXNjcmlwdGlvbnMgZm9yIHVuaXRzIG9mIHdvcmsuIi8+Ci0gICAgICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hFc1k1T2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAwMEYiIHNvdXJjZT0iX0hFc1loT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hFc1l4T2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRXNZNS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFc1k2ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRXNZNnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEVzWTZPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hFc1k1ZWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IRXNZNXVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMSwgLTUwMywgLTU4MjIsIDIwOTBdJFs1ODIwLCAtMjA5MSwgLTEsIDUwMl0iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEVzWTYtZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hFc1k3T2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEVzWTdlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDA0QSIgc291cmNlPSJfSEVzWWxPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEVzWXhPZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFc1k4T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVzWTh1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFc1k4LWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRXNZOGVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEVzWTd1ZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hFc1k3LWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0xLCAtNTAzLCAtMSwgMjA5MF0kWy0xLCAtMjA5MSwgLTEsIDUwMl0iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEVzWTlPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hFc1k5ZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEVzWTl1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDAyQyIgc291cmNlPSJfSEVzWXRPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEVzWXhPZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFc1ktZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVzWS0tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFc1lfT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRXNZLXVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEVzWTktZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hFc1ktT2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzAsIC01MDMsIDU4MjAsIDIwOTBdJFstNTgyMSwgLTIwOTEsIC0xLCA1MDJdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hFc1lfZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRXNZX3VmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hFc1pELWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MzAxMUQiIHNvdXJjZT0iX0hFaW5xLWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hFc1lfLWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRXNaRXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFc1pGT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRXNaRmVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEVzWkUtZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hFc1pFT2ZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IRXNaRWVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlswLCAtNTAzLCA1ODA3LCAyMDkwXSRbLTU4MjEsIC0yMDkwLCAtMTQsIDUwM10iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEVzWkZ1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hFc1pGLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEVzWkdPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDMwNyIgc291cmNlPSJfSEVzWXBPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEVzWV8tZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFc1pHLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVzWkhlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFc1pIdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRXNaSE9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEVzWkdlZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hFc1pHdWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzAsIC01MDMsIDExNjI4LCAyMDkwXSRbLTExNjQyLCAtMjA5MCwgLTE0LCA1MDNdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hFc1pILWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRXNaSU9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hFc1pJZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAzMkYiIHNvdXJjZT0iX0hFc1kxT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hFc1lfLWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRXNaSk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFc1pKdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRXNaSi1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEVzWkplZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hFc1pJdWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IRXNaSS1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMSwgLTUwMywgLTU4MzUsIDIwOTBdJFs1ODIwLCAtMjA5MCwgLTE0LCA1MDNdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hFMWlZT2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRTFpWWVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hFMWlZdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAzRDkiIHNvdXJjZT0iX0hFc1l4T2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hFc1lfLWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRTFpWmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFMWlaLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRTFpYU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEUxaVp1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hFMWlZLWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IRTFpWk9mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMSwgLTUwMywgLTE0LCAyMDkwXSRbLTEsIC0yMDkwLCAtMTQsIDUwM10iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEUxaWFlZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hFMWlhdWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEUxaWktZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyNzk4MzBFMDE1MCIgc291cmNlPSJfSEUxaWEtZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEUxaWUtZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFMWlqdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEUxaWtPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFMWlrZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRTFpai1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEUxaWpPZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hFMWlqZWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0xLCAtNTAzLCAyMTQzLCAyMDkwXSRbLTIxNDQsIC0yMDkwLCAwLCA1MDNdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hFMWlrdWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRTFpay1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hFMWlwT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBODMxODAwQjgiIHNvdXJjZT0iX0hFc1kxT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hFMWlsT2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRTFpcC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFMWlxZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRTFpcXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEUxaXFPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hFMWlwZWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IRTFpcHVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMSwgLTUwMywgLTEsIDQ2ODNdJFstMSwgLTQ2ODMsIC0xLCA1MDNdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hFMWlxLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRTFpck9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hFMWlyZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBODMyMzAwRkUiIHNvdXJjZT0iX0hFMWlhLWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hFMWlsT2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRTFpc09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFMWlzdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRTFpcy1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEUxaXNlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hFMWlydWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IRTFpci1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMSwgLTUwMywgLTMxNzYsIDIwOTBdJFszMTc0LCAtMjA5MCwgLTEsIDUwM10iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEUxaXRPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hFMWl0ZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEUxaXh1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyOTRFQzRBMDMwNiIgc291cmNlPSJfSEVzWV8tZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEUxaXR1ZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFMWl5ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEUxaXktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFMWl6T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRTFpeXVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEUxaXgtZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hFMWl5T2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0xNCwgLTUwMywgMjI0LCAyMDkwXSRbLTI1MiwgLTIwOTAsIC0xNCwgNTAzXSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRTFpemVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEUxaXp1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IRTFpei1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTgyRjMwMjZFIiBzb3VyY2U9Il9IRTFpbE9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IRXNZZE9mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEUxaTB1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRTFpMU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEUxaTFlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hFMWkwLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IRTFpME9mWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEUxaTBlZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTEsIC01MDMsIDAsIDIwOTBdJFstMSwgLTIwOTAsIDAsIDUwM10iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEUxaTF1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hFMWkxLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEUxaTJPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyNzk1NjI0MDE3RSIgc291cmNlPSJfSEUxaWUtZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEVzWWRPZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFMWkyLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEUxaTNlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFMWkzdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRTFpM09mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEUxaTJlZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hFMWkydWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzAsIC01MDMsIC01MzE4LCAyMDkwXSRbNTMxOCwgLTIwOTAsIDAsIDUwM10iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEUxaTMtZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hFMWk0T2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEUxaTRlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyOTRFQzJCMDFDQSIgc291cmNlPSJfSEUxaXR1ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEVzWWRPZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFMWk1T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEUxaTV1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFMWk1LWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRTFpNWVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEUxaTR1ZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IRTFpNC1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMTQsIC01MDMsIDU1ODMsIDIwOTBdJFstNTU5NywgLTIwOTAsIDAsIDUwM10iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEUxaTZPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hFMWk2ZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgPC9jb250ZW50cz4KLSAgICAgICAgICAgIDxjb250ZW50cyB4bWk6dHlwZT0ibm90YXRpb246RGlhZ3JhbSIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzcwQTMwMTUyIiB0eXBlPSJDbGFzcyIgbmFtZT0iU3RydWN0dXJlIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFX1RZT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5vdGUiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEY0OEREQzAyQzciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRV9UWS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJEaWFncmFtTmFtZSI+Ci0gICAgICAgICAgICAgICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVfVFpPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkRlc2NyaXB0aW9uIj4KLSAgICAgICAgICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOlNoYXBlU3R5bGUiIHhtaTppZD0iX0hFX1RZZWZYRWR1cUhvT0piVVJaUnciIHVuZGVybGluZT0idHJ1ZSIgZGVzY3JpcHRpb249IkNsYXNzIERpYWdyYW06IENvcmVDb250ZW50RWxlbWVudHMgLyBUYXhvbm9teSIgbGluZUNvbG9yPSIwIi8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEVfVFl1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTAxNiIgeT0iMTM2MDUiIHdpZHRoPSI0MzA4IiBoZWlnaHQ9IjExMzQiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFX1RaZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5vdGUiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTJFRDIxMzAzMkIiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRV9UYU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJEaWFncmFtTmFtZSI+Ci0gICAgICAgICAgICAgICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVfVGFlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkRlc2NyaXB0aW9uIj4KLSAgICAgICAgICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOlNoYXBlU3R5bGUiIHhtaTppZD0iX0hFX1RadWZYRWR1cUhvT0piVVJaUnciIHVuZGVybGluZT0idHJ1ZSIgZGVzY3JpcHRpb249IkNsYXNzIERpYWdyYW06IENvcmVDb250ZW50RWxlbWVudHMgLyBXb3JrUHJvZHVjdHMiIGxpbmVDb2xvcj0iMCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hFX1RaLWZYRWR1cUhvT0piVVJaUnciIHg9IjEwNDkiIHk9IjEyMDkwIiB3aWR0aD0iNDE1MyIgaGVpZ2h0PSIxMTI2Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRV9UYXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOb3RlIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVfVGJlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRGlhZ3JhbU5hbWUiPgotICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFX1RidWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkRlc2NyaXB0aW9uIj4KLSAgICAgICAgICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOlNoYXBlU3R5bGUiIHhtaTppZD0iX0hFX1RhLWZYRWR1cUhvT0piVVJaUnciIGZvbnROYW1lPSJBcmlhbCIgZGVzY3JpcHRpb249IntSb2xlLm1vZGlmaWVzID0gUm9sZS5wZXJmb3Jtcy5vdXRwdXR9JiN4QTtrZXB0IGZvciBjb21wYXRpYmlsaXR5IHdpdGggUlVQJiN4QTsiIGxpbmVDb2xvcj0iMCIvPgotICAgICAgICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRV9UYk9mWEVkdXFIb09KYlVSWlJ3IiB4PSI1MDI5IiB5PSIxMDUxNSIgd2lkdGg9IjY5MDgiIGhlaWdodD0iMTEyNiIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVfVGItZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI5NiI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFX1RjdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hFX1RjLWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRV9UZE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFX1RkZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVfVGR1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFX1RkLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEVfVGVPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFX1RlZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEVfVGV1ZlhFZHVxSG9PSmJVUlpSdyIgY29sbGFwc2VkPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVfVGUtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRV9UZk9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVfVGZlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEVfVGZ1ZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEVfVGNPZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9Ik5vbmUiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRV9UY2VmWEVkdXFIb09KYlVSWlJ3IiB4PSIyMjE4IiB5PSI5NjUiIHdpZHRoPSIzMzk1IiBoZWlnaHQ9IjI2NTAiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFX1RmLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyQkMiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRV9UZ3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IRV9UZy1mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVfVGhPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRV9UaGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFX1RodWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRV9UaC1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFX1RpT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRV9UaWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFX1RpdWZYRWR1cUhvT0piVVJaUnciIGNvbGxhcHNlZD0idHJ1ZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFX1RpLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEVfVGpPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFX1RqZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFX1RqdWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hFX1RnT2ZYRWR1cUhvT0piVVJaUnciIGl0YWxpYz0idHJ1ZSIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9Ik5vbmUiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRV9UZ2VmWEVkdXFIb09KYlVSWlJ3IiB4PSIxNzc1NCIgeT0iODA3NyIgd2lkdGg9IjM3MDgiIGhlaWdodD0iMjA0MCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZKRVlPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyNzk0QTY2MDM2OCI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGSkVZLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hGSkVaT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRkpFWmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGSkVadWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZKRVotZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGSkVhT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEZKRWFlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGSkVhdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEZKRWEtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGSkViT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEZKRWJlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGSkVidWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGSkViLWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hGSkVZZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEZKRVl1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMjQwNTMiIHk9IjEzODAiIHdpZHRoPSIyMTg0IiBoZWlnaHQ9IjE2MTciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGSkVjT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyOUUiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRkpFYy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IRkpFZE9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZKRWRlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRkpFZHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGSkVkLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRkpFZU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGSkVlZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRkpFZXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGSkVlLWZYRWR1cUhvT0piVVJaUnciIGNvbGxhcHNlZD0idHJ1ZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGSkVmT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEZKRWZlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGSkVmdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGSkVmLWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hGSkVjZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJOb25lIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEZKRWN1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTc4NDciIHk9IjEwNjYiIHdpZHRoPSIzMzE4IiBoZWlnaHQ9IjIzNDUiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MRGlhZ3JhbVN0eWxlIiB4bWk6aWQ9Il9HdGNXRWVmWEVkdXFIb09KYlVSWlJ3IiBkZXNjcmlwdGlvbj0ifE1ldGhvZCBjb250ZW50IGlzIGZ1bmRhbWVudGFsbHkgZGVzY3JpYmVkIGJ5IGRlZmluaW5nIFRhc2tzIGRlc2NyaWJlZCB3aXRoIFN0ZXBzIHRoYXQgaGF2ZSBXb3JrIFByb2R1Y3RzIGFzIGlucHV0IGFuZCBvdXRwdXQgYW5kIHdoaWNoIGFyZSBiZWluZyBwZXJmb3JtZWQgYnkgUm9sZXMuICBUaGUgZGlhZ3JhbSBkZXBpY3RzIHRoZXNlIGNvcmUgZWxlbWVudHMgd2l0aCB0aGVpciByZWxhdGlvbnNoaXBzLiAgVGhlIHJlbGF0aW9uc2hpcHMgYXJlIGxhYmVsZWQgd2l0aCBhICZxdW90O0RlZmF1bHRfJnF1b3Q7IHByZWZpeCwgYmVjYXVzZSB0aGV5IGRlc2NyaWJlIHRoZSAnc3RhbmRhcmQnIG9yICdub3JtYWwnIHdheSBvZiBwZXJmb3JtaW5nIHRoZSBtZXRob2QgZGVzY3JpYmVkOyBpLmUuIGRvaW5nIHRoZSB3b3JrIHVuZGVyICdub3JtYWwnIGNpcmN1bXN0YW5jZXMsIHdpdGggJ25vcm1hbCcgYmVpbmcgd2hhdCB0aGUgbWV0aG9kIGF1dGhvciBwZXJjZWl2ZXMgYXMgdGhlIG1vc3QgZ2VuZXJhbCBjYXNlLiAgSG93ZXZlciwgZGlmZmVyZW50IHByb2Nlc3NlcyB3b3VsZCBhcHBseSB0aGVzZSBlbGVtZW50cyBpbiBkaWZmZXJlbnQgcGFydHMgb2YgYSBsaWZlY3ljbGUgZGlmZmVyZW50bHkgYW5kIHRoZW4gbmVlZCB0byBkZWZpbmUgY2hhbmdlcyBvbiB0aGVzZSByZWxhdGlvbnNoaXBzLiAgRm9yIGV4YW1wbGUsIGlmIGEgVGFzayBpcyBwZXJmb3JtZWQgaW4gbW9yZSB0aGVuIG9uZSBpdGVyYXRpb24gb2YgYW4gaXRlcmF0aXZlIGxpZmVjeWNsZSBtb2RlbCBkaWZmZXJlbnQgUm9sZXMgY291bGQgYmUgYWRkZWQgdG8gKG9yIHJlbW92ZWQgZnJvbSkgcGVyZm9ybWluZyB0aGUgVGFzayBhcyB3ZWxsIGFzIGRpZmZlcmVudCBpbnB1dHMgbWlnaHQgYmUgY29uc2lkZXJlZCBhdCBkaWZmZXJlbnQgcG9pbnRzIGluIHRpbWUuICBTdWNoIGNoYW5nZXMgd291bGQgYmUgZGVmaW5lZCBvbiBwcm9jZXNzIHNwZWNpZmljIERlc2NyaXB0b3JzIHRoYXQgcmVmZXJlbmNlIGFuZCBoYXZlIGJlZW4gZGVmaW5lZCBiYXNlZCBvbiB0aGVzZSBjb3JlIGNvbnRlbnQgZWxlbWVudHMgKHNlZSBQcm9jZXNzIGZvciBtb3JlIGRldGFpbHMpLiYjeEE7Ii8+Ci0gICAgICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hFX1RqLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MzAwRjUiIHNvdXJjZT0iX0hFX1RmLWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hFX1RiLWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRV9Ua3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFX1RsT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRV9UbGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRV9Uay1mWEVkdXFIb09KYlVSWlJ3IiB4PSItMTUyIiB5PSIzMDQiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRV9UbHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTMwMEY4Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRV9UbU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRV9UbC1mWEVkdXFIb09KYlVSWlJ3IiB4PSItMjc2MSIgeT0iMjc5Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVfVG1lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MzAwRjgiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFX1RtLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRV9UbXVmWEVkdXFIb09KYlVSWlJ3IiB4PSItMTgzOSIgeT0iLTMxNCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFX1RuT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkzMDBGNiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVfVG51ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRV9UbmVmWEVkdXFIb09KYlVSWlJ3IiB4PSIyNTI1IiB5PSIyNzkiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRV9Ubi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTMwMEY2Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRV9Ub2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRV9Ub09mWEVkdXFIb09KYlVSWlJ3IiB4PSIyNTY4IiB5PSItMTI0NSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFX1RvdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MzAwRjgiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFX1RwT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFX1RwZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hFX1RvLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRV9UcHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MzAwRjYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFX1RxT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFX1RxZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hFX1RwLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRV9UcXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkzMDBGOCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVfVHJPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEVfVHJlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEVfVHEtZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFX1RydWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MzAwRjYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFX1RzT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEVfVHNlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEVfVHItZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hFX1RrT2ZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEVfVGtlZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTE4NTQsIDY1MSwgMTM4NDMsIDc0NTldJFstMTYyNjQsIDY1MSwgLTU2NywgNzQ1OV0kWy0xNjI2NCwgLTU0ODYsIC01NjcsIDEzMjBdIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IRV9Uc3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOb3RlQXR0YWNobWVudCIgc291cmNlPSJfSEVfVGF1ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEVfVGotZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246Q29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hFX1RzLWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iMCIvPgotICAgICAgICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IRV9UdE9mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstNDIzLCAtNTY3LCA1ODQsIDc2Ml0kWy0xMDA3LCAtMTMyOSwgMCwgMF0iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEVfVHRlZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hFX1R0dWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEVfVHQtZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkzMDEwOSIgc291cmNlPSJfSEVfVGYtZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEVfVGItZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFX1R1dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVfVHZPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFX1R2ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hFX1R1LWZYRWR1cUhvT0piVVJaUnciIHg9Ii0zMzkiIHk9IjI4MCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFX1R2dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MzAxMEMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFX1R3T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hFX1R2LWZYRWR1cUhvT0piVVJaUnciIHg9Ii0yNDM3IiB5PSIyODAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRV9Ud2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkzMDEwQyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVfVHctZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hFX1R3dWZYRWR1cUhvT0piVVJaUnciIHg9Ii02OTMiIHk9Ii0zMDQiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRV9UeE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MzAxMEEiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFX1R4dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEVfVHhlZlhFZHVxSG9PSmJVUlpSdyIgeD0iMjE1MCIgeT0iLTMyMiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFX1R4LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MzAxMEEiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFX1R5ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hFX1R5T2ZYRWR1cUhvT0piVVJaUnciIHg9IjIyMTgiIHk9IjE3OTUiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRV9UeXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTMwMTBDIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRV9Uek9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRV9UemVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRV9UeS1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVfVHp1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTMwMTBBIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRV9UME9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRV9UMGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRV9Uei1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVfVDB1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MzAxMEMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFX1QxT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFX1QxZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hFX1QwLWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRV9UMXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTMwMTBBIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRV9UMk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFX1QyZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hFX1QxLWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IRV9UdU9mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hFX1R1ZWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0xODU0LCAtMjExLCAxMzg0MywgNjU5NV0kWy0xNDc5MSwgLTIxMSwgOTA1LCA2NTk1XSRbLTE0NzkxLCAtNTQ4NiwgOTA1LCAxMzIwXSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEZKRWdPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDMwOCIgc291cmNlPSJfSEZKRWNPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEVfVGItZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGSkVnLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZKRWhlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGSkVodWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hGSkVoT2ZYRWR1cUhvT0piVVJaUnciIHg9IjY2IiB5PSIyNjIiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRkpFaC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMzBCIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRkpFaWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRkpFaU9mWEVkdXFIb09KYlVSWlJ3IiB4PSItMTQzOCIgeT0iMjc5Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZKRWl1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAzMEIiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGSkVqT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRkpFaS1mWEVkdXFIb09KYlVSWlJ3IiB4PSItNzgyIiB5PSItMjYzIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZKRWplZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMzA5Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRkpFai1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGSkVqdWZYRWR1cUhvT0piVVJaUnciIHg9IjEyMjEiIHk9IjI4OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGSkVrT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAzMDkiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGSkVrdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGSkVrZWZYRWR1cUhvT0piVVJaUnciIHg9IjMzNSIgeT0iLTMyMiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGSkVrLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAzMEIiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGSkVsZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGSkVsdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGSkVsT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRkpFbC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAzMDkiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGSkVtZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGSkVtdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGSkVtT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRkpFbS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDMwQiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZKRW5lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEZKRW51ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEZKRW5PZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGSkVuLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAzMDkiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGSkVvZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEZKRW91ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEZKRW9PZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hGSkVnZWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEZKRWd1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTE2NTksIDY2MCwgMTM5MzYsIDYwOV0kWy0xMzkwMiwgNjYwLCAxNjkzLCA2MDldIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IRkpFby1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDExN0NGNUMwMUNDIiBzb3VyY2U9Il9IRV9UYi1mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IRkpFY09mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZKRXB1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRkpFcU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZKRXFlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEZKRXAtZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTE0OCIgeT0iLTI3MiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGSkVxdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTE3Q0Y1RDAzNTciPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGSkVyT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGSkVxLWZYRWR1cUhvT0piVVJaUnciIHg9Ii0xMzEyIiB5PSItMjYzIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZKRXJlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTE3Q0Y1RDAzNTciPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGSkVyLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRkpFcnVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxNTQxIiB5PSIzMTIiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRkpFc09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTE3Q0Y1RDAyRkQiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGSkVzdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEZKRXNlZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTQ1NyIgeT0iLTE5NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGSkVzLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTE3Q0Y1RDAyRkQiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGSkV0ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGSkV0T2ZYRWR1cUhvT0piVVJaUnciIHg9IjMyMiIgeT0iMzEyIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZKRXR1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxMTdDRjVEMDM1NyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZKRXVPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEZKRXVlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEZKRXQtZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGSkV1dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxMTdDRjVEMDJGRCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZKRXZPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEZKRXZlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEZKRXUtZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGSkV2dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDExN0NGNUQwMzU3Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRkpFd09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRkpFd2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRkpFdi1mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZKRXd1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxMTdDRjVEMDJGRCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZKRXhPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRkpFeGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRkpFdy1mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEZKRXBPZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IRkpFcGVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlsxNjkzLCAtNzcwLCAtMTM5MDIsIC03MTldJFsxMzkzNiwgLTc3MCwgLTE2NTksIC03MTldIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IRkpFeHVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMzlEIiBzb3VyY2U9Il9IRV9UZi1mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IRkpFY09mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZKRXllZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRkpFeS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZKRXpPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEZKRXl1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTY3NSIgeT0iMjExMSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGSkV6ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAzQTgiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGSkV6LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGSkV6dWZYRWR1cUhvT0piVVJaUnciIHg9Ii02MzciIHk9Ii0yODMiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRkpFME9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDNBOCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZKRTB1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGSkUwZWZYRWR1cUhvT0piVVJaUnciIHg9IjEzODAiIHk9IjE1MjIiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRkpFMC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAzOUUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGSkUxZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEZKRTFPZlhFZHVxSG9PSmJVUlpSdyIgeD0iNTY5IiB5PSItMjg3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZKRTF1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDM5RSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZKRTJPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEZKRTEtZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTEwNzkiIHk9IjE2NDkiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRkpFMmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwM0E4Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRkpFMi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRkpFM09mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRkpFMnVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZKRTNlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMzlFIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRkpFMy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRkpFNE9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRkpFM3VmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZKRTRlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAzQTgiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGSkU0LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGSkU1T2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGSkU0dWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRkpFNWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMzlFIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRkpFNS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGSkU2T2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGSkU1dWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IRkpFeC1mWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEZKRXlPZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbNjI2LCAtMTAyNCwgNzI4LCA1ODMzXSRbMjI4NiwgLTM2OTksIDIzODcsIDMxNThdJFs3NzgsIC01Njg5LCA4ODAsIDExNjhdIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IRkpFNmVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwM0JCIiBzb3VyY2U9Il9IRV9UZi1mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IRkpFY09mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZKRTdPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRkpFN3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZKRTctZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEZKRTdlZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTU3MSIgeT0iLTE0NjAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRkpFOE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwM0JFIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRkpFOHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRkpFOGVmWEVkdXFIb09KYlVSWlJ3IiB4PSItNDczIiB5PSIyNzkiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRkpFOC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDNCRSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZKRTllZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGSkU5T2ZYRWR1cUhvT0piVVJaUnciIHg9IjU3NiIgeT0iLTc3MyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGSkU5dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDNCQyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZKRS1PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRkpFOS1mWEVkdXFIb09KYlVSWlJ3IiB4PSI2NzIiIHk9IjMwOSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGSkUtZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAzQkMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGSkUtLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGSkUtdWZYRWR1cUhvT0piVVJaUnciIHg9Ii03ODUiIHk9Ii0xMDYwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZKRV9PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDNCRSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZKRV91ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEZKRV8tZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEZKRV9lZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGSkZBT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDNCQyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZKRkF1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEZKRkEtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEZKRkFlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGSkZCT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwM0JFIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRkpGQnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRkpGQi1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRkpGQmVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZKRkNPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDNCQyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZKRkN1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRkpGQy1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRkpGQ2VmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEZKRTZ1ZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hGSkU2LWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy04NzIsIC0xMDI0LCAtNzcwLCA1ODMzXSRbLTMxMTUsIC0zNjk5LCAtMzAxNCwgMzE1OF0kWy0xMjM2LCAtNTY4OSwgLTExMzQsIDExNjhdIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IRlNPVU9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE3N0Y4NDkwMTMxIiBzb3VyY2U9Il9IRkpFY09mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IRV9UZi1mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZTT1UtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRlNPVmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZTT1Z1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEZTT1ZPZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTQ3IiB5PSItMTI2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZTT1YtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNzdGODRBMDI3MiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZTT1dlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEZTT1dPZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTI5NiIgeT0iLTI3OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGU09XdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE3N0Y4NEEwMjcyIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRlNPWE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEZTT1ctZlhFZHVxSG9PSmJVUlpSdyIgeD0iMjgwIiB5PSItMjUzIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZTT1hlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE3N0Y4NEEwMjVFIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRlNPWC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGU09YdWZYRWR1cUhvT0piVVJaUnciIHg9IjQ1NiIgeT0iLTM0NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGU09ZT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTc3Rjg0QTAyNUUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGU09ZdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGU09ZZWZYRWR1cUhvT0piVVJaUnciIHg9Ii01NjAiIHk9Ii0xNjgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRlNPWS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE3N0Y4NEEwMjcyIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRlNPWmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRlNPWnVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRlNPWk9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZTT1otZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE3N0Y4NEEwMjVFIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRlNPYWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRlNPYXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRlNPYU9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZTT2EtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTc3Rjg0QTAyNzIiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGU09iZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGU09idWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGU09iT2ZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRlNPYi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE3N0Y4NEEwMjVFIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRlNPY2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGU09jdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGU09jT2ZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IRlNPVWVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hGU09VdWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy04NCwgMTE2OCwgLTE4NiwgLTU2ODldJFstODQsIDU4MzMsIC0xODYsIC0xMDI0XSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEZTT2MtZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyNzk2MkQzMDAzRiIgc291cmNlPSJfSEZKRWNPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEZKRVlPZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGU09kdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZTT2VPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGU09lZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRlNPZC1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZTT2V1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjc5NjJENDAyMEUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGU09mT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGU09lLWZYRWR1cUhvT0piVVJaUnciIHk9IjM5NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGU09mZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyNzk2MkQ0MDIwRSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZTT2YtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGU09mdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0zOTciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRlNPZ09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjc5NjJENDAyMDMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGU09ndWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEZTT2dlZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTY2IiB5PSIzMjEiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRlNPZy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3OTYyRDQwMjAzIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRlNPaGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRlNPaE9mWEVkdXFIb09KYlVSWlJ3IiB4PSItMzcxIiB5PSItMzA2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZTT2h1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyNzk2MkQ0MDIwRSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZTT2lPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEZTT2llZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEZTT2gtZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGU09pdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyNzk2MkQ0MDIwMyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZTT2pPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEZTT2plZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEZTT2ktZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGU09qdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3OTYyRDQwMjBFIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRlNPa09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRlNPa2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRlNPai1mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZTT2t1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyNzk2MkQ0MDIwMyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZTT2xPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRlNPbGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRlNPay1mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEZTT2RPZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IRlNPZGVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlsxNjU5LCAtNTAsIC0zOTc5LCAwXSRbNDU0NiwgLTUwLCAtMTA5MiwgMF0iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgIDwvY29udGVudHM+Ci0gICAgICAgICAgICA8Y29udGVudHMgeG1pOnR5cGU9Im5vdGF0aW9uOkRpYWdyYW0iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxMEFFRUM2MDBDQSIgdHlwZT0iQ2xhc3MiIG5hbWU9IlN0cnVjdHVyZSAoc2ltcGxpZmllZCkiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZTT2x1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI5NiI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGU09tZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hGU09tdWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRlNPbS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGU09uT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZTT25lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGU09udWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEZTT24tZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGU09vT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEZTT29lZlhFZHVxSG9PSmJVUlpSdyIgY29sbGFwc2VkPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZTT291ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRlNPby1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZTT3BPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEZTT3BlZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEZTT2wtZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRlNPbU9mWEVkdXFIb09KYlVSWlJ3IiB4PSIxNTE1IiB5PSI5MTQiIHdpZHRoPSIzMTc1IiBoZWlnaHQ9IjI2NDEiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGYl9VT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyOUUiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmJfVS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IRmJfVk9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZiX1ZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmJfVnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGYl9WLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmJfV09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGYl9XZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmJfV3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGYl9XLWZYRWR1cUhvT0piVVJaUnciIGNvbGxhcHNlZD0idHJ1ZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGYl9YT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEZiX1hlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGYl9YdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGYl9YLWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hGYl9VZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEZiX1V1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTE0NzIiIHk9IjkxNCIgd2lkdGg9IjU5MDkiIGhlaWdodD0iMjY0MSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZiX3B1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDJCQyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGYl9xZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hGYl9xdWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmJfcS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGYl9yT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZiX3JlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGYl9ydWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEZiX3ItZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGYl9zT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEZiX3NlZlhFZHVxSG9PSmJVUlpSdyIgY29sbGFwc2VkPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZiX3N1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRmJfcy1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZiX3RPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEZiX3RlZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEZiX3AtZlhFZHVxSG9PSmJVUlpSdyIgaXRhbGljPSJ0cnVlIiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hGYl9xT2ZYRWR1cUhvT0piVVJaUnciIHg9IjExNDcyIiB5PSI1NDEwIiB3aWR0aD0iNTkwOSIgaGVpZ2h0PSIyNTkwIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTERpYWdyYW1TdHlsZSIgeG1pOmlkPSJfR3RjV0UtZlhFZHVxSG9PSmJVUlpSdyIgZGVzY3JpcHRpb249IlRoaXMgZGlhZ3JhbSBwcm92aWRlcyBhIHNpbXBsaWZpZWQgb3ZlcnZpZXcgdG8gdGhlIGNvcmUgY29udGVudCBzdHJ1Y3R1cmUgbm90IHNob3dpbmcgYXR0cmlidXRlcyBhbmQgb25seSB0aGUgbW9zdCBpbXBvcnRhbnQgYXNzb2NpYXRpb25zIGFzIHdlbGwgYXMgb21pdHRpbmcgYXNzb2NpYXRpb24gcm9sZSBuYW1lcy4iLz4KLSAgICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEZiX1lPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDMwOCIgc291cmNlPSJfSEZiX1VPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEZTT2x1ZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGYl9ZLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZiX1plZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGYl9adWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hGYl9aT2ZYRWR1cUhvT0piVVJaUnciIHg9Ii0zNyIgeT0iMjcyIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZiX1otZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDMwQiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZiX2FlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEZiX2FPZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTc4MSIgeT0iMjIxIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZiX2F1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMzBCIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmJfYk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEZiX2EtZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTM5NyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGYl9iZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDMwOSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZiX2ItZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRmJfYnVmWEVkdXFIb09KYlVSWlJ3IiB4PSI1NDciIHk9IjIyOSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGYl9jT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMzA5Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmJfY3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRmJfY2VmWEVkdXFIb09KYlVSWlJ3IiB5PSItMzk3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZiX2MtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDMwQiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZiX2RlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEZiX2R1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEZiX2RPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGYl9kLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDMwOSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZiX2VlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEZiX2V1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEZiX2VPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGYl9lLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMzBCIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmJfZmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRmJfZnVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRmJfZk9mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZiX2YtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDMwOSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZiX2dlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRmJfZ3VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRmJfZ09mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEZiX1llZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IRmJfWXVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMjk1NCwgLTY3NywgODM3MywgLTY3N10kWy05NzQ1LCAtNjc3LCAxNTgzLCAtNjc3XSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEZiX2ctZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxMTdDRjVDMDFDQyIgc291cmNlPSJfSEZTT2x1ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEZiX1VPZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGYl9odWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZiX2lPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGYl9pZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hGYl9oLWZYRWR1cUhvT0piVVJaUnciIHg9IjMyNiIgeT0iLTMxNCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGYl9pdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTE3Q0Y1RDAzNTciPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGYl9qT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGYl9pLWZYRWR1cUhvT0piVVJaUnciIHg9Ii02MDQiIHk9Ii0yMjAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmJfamVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTE3Q0Y1RDAzNTciPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGYl9qLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRmJfanVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMzk3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZiX2tPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDExN0NGNUQwMkZEIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmJfa3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGYl9rZWZYRWR1cUhvT0piVVJaUnciIHg9IjgyNSIgeT0iLTE3MCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGYl9rLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDExN0NGNUQwMkZEIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmJfbGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRmJfbE9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMzk3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZiX2x1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxMTdDRjVEMDM1NyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZiX21PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEZiX21lZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEZiX2wtZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGYl9tdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxMTdDRjVEMDJGRCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZiX25PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEZiX25lZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEZiX20tZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGYl9udWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDExN0NGNUQwMzU3Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmJfb09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRmJfb2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRmJfbi1mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZiX291ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxMTdDRjVEMDJGRCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZiX3BPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRmJfcGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRmJfby1mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEZiX2hPZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IRmJfaGVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlsxNTgzLCAzODEsIC05NzQ1LCAzODFdJFs4MzczLCAzODEsIC0yOTU0LCAzODFdIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IRmJfdHVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTMwMTA5IiBzb3VyY2U9Il9IRmJfcHVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IRlNPbHVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZiX3VlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmJfdS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZiX3ZPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEZiX3V1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTExOTciIHk9Ii0zODEiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmJfdmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTMwMTBDIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmJfdi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRmJfdnVmWEVkdXFIb09KYlVSWlJ3IiB4PSItMTU4MSIgeT0iLTI0NSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGYl93T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkzMDEwQyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZiX3d1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGYl93ZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0zOTciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmJfdy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MzAxMEEiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGYl94ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEZiX3hPZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTM0NiIgeT0iLTM5OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGYl94dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTMwMTBBIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmJfeU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRmJfeC1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMzk3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZiX3llZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkzMDEwQyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZiX3ktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEZiX3pPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEZiX3l1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGYl96ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkzMDEwQSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZiX3otZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEZiXzBPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEZiX3p1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGYl8wZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTMwMTBDIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmJfMC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRmJfMU9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRmJfMHVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZiXzFlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkzMDEwQSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZiXzEtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRmJfMk9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRmJfMXVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEZiX3QtZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IRmJfdU9mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMjk1NCwgLTgsIDgzNzMsIDQ0NjFdJFstMTIyODUsIC04LCAtOTU2LCA0NDYxXSRbLTEyMjg1LCAtMzE0OSwgLTk1NiwgMTMyMF0iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hGYl8yZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAzOUQiIHNvdXJjZT0iX0hGYl9wdWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hGYl9VT2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmJfM09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGYl8zdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmJfMy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRmJfM2VmWEVkdXFIb09KYlVSWlJ3IiB4PSItMTgzIiB5PSI4NDYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmJfNE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwM0E4Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmJfNHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRmJfNGVmWEVkdXFIb09KYlVSWlJ3IiB4PSItMTY4IiB5PSItMjM4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZiXzQtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwM0E4Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmJfNWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEZiXzVPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTM5NyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGYl81dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDM5RSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZiXzZPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRmJfNS1mWEVkdXFIb09KYlVSWlJ3IiB4PSI4MyIgeT0iLTEzNiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGYl82ZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMzlFIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmJfNi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRmJfNnVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMzk3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZiXzdPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDNBOCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZiXzd1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEZiXzctZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEZiXzdlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGYl84T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDM5RSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZiXzh1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEZiXzgtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEZiXzhlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGYl85T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwM0E4Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmJfOXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRmJfOS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRmJfOWVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZiXy1PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDM5RSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZiXy11ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRmJfLS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRmJfLWVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEZiXzJ1ZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IRmJfMi1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstNjcsIC0xMjk1LCAtNjcsIDMxNzVdJFstNjcsIC0zMTQ5LCAtNjcsIDEzMjBdIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IRmxKUU9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwM0JCIiBzb3VyY2U9Il9IRmJfcHVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IRmJfVU9mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZsSlEtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmxKUmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZsSlJ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEZsSlJPZlhFZHVxSG9PSmJVUlpSdyIgeD0iNzIiIHk9Ii0xNTY4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZsSlItZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDNCRSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZsSlNlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEZsSlNPZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTE1NCIgeT0iMTQzIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZsSlN1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwM0JFIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmxKVE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEZsSlMtZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTM5NyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGbEpUZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDNCQyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZsSlQtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRmxKVHVmWEVkdXFIb09KYlVSWlJ3IiB4PSI1MyIgeT0iMTk0Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZsSlVPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAzQkMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGbEpVdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGbEpVZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0zOTciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmxKVS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwM0JFIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmxKVmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRmxKVnVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRmxKVk9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZsSlYtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwM0JDIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmxKV2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRmxKV3VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRmxKV09mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZsSlctZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAzQkUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGbEpYZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGbEpYdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGbEpYT2ZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmxKWC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwM0JDIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmxKWWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGbEpZdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGbEpZT2ZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IRmxKUWVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hGbEpRdWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0yMTc1LCAtMTI5NSwgLTIxNzUsIDMxNzVdJFstMjE3NSwgLTMxNTgsIC0yMTc1LCAxMzEyXSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEZsSlktZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNzdGODQ5MDEzMSIgc291cmNlPSJfSEZiX1VPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEZiX3B1ZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGbEpadWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZsSmFPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGbEphZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hGbEpaLWZYRWR1cUhvT0piVVJaUnciIHg9Ii01NjQiIHk9Ii0yMjQ0Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZsSmF1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNzdGODRBMDI3MiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZsSmJPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEZsSmEtZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTQ0IiB5PSIxMzUiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmxKYmVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTc3Rjg0QTAyNzIiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGbEpiLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRmxKYnVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMzk3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZsSmNPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE3N0Y4NEEwMjVFIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmxKY3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGbEpjZWZYRWR1cUhvT0piVVJaUnciIHg9IjE0NSIgeT0iMTEwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZsSmMtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTc3Rjg0QTAyNUUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGbEpkZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGbEpkT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0zOTciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmxKZHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE3N0Y4NEEwMjcyIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmxKZU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRmxKZWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRmxKZC1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZsSmV1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE3N0Y4NEEwMjVFIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmxKZk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRmxKZmVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRmxKZS1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZsSmZ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTc3Rjg0QTAyNzIiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGbEpnT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGbEpnZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGbEpmLWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmxKZ3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE3N0Y4NEEwMjVFIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmxKaE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGbEpoZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGbEpnLWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IRmxKWk9mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hGbEpaZWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzE5NDcsIDEzMTIsIDE5NDcsIC0zMTU4XSRbMTk0NywgMzE3NSwgMTk0NywgLTEyOTVdIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICA8L2NvbnRlbnRzPgotICAgICAgICAgICAgPGNvbnRlbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpEaWFncmFtIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTJFRDIxMzAzMkIiIHR5cGU9IkNsYXNzIiBuYW1lPSJXb3JrUHJvZHVjdHMiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZsSmh1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDE4RiI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGbEppZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hGbEppdWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmxKaS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGbEpqT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZsSmplZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGbEpqdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEZsSmotZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGbEprT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEZsSmtlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGbEprdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEZsSmstZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGbEpsT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGbEpsZWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hGbEpoLWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEZsSmlPZlhFZHVxSG9PSmJVUlpSdyIgeD0iODEyOCIgeT0iMzkyMCIgd2lkdGg9IjM4NjAiIGhlaWdodD0iMjAxNSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZsSmx1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDJCQyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGbEptZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hGbEptdWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmxKbS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGbEpuT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZsSm5lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGbEpudWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEZsSm4tZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGbEpvT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEZsSm9lZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGbEpvdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEZsSm8tZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGbEpwT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGbEpwZWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hGbEpsLWZYRWR1cUhvT0piVVJaUnciIGl0YWxpYz0idHJ1ZSIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRmxKbU9mWEVkdXFIb09KYlVSWlJ3IiB4PSI4MTI4IiB5PSI4MjEiIHdpZHRoPSIzODYwIiBoZWlnaHQ9IjIwMTUiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGbEpyLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxODUiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmxKc3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IRmxKcy1mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZsSnRPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmxKdGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGdTZRT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRnU2UWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGdTZRdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRnU2US1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGdTZST2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRnU2UmVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGdTZSdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRnU2Ui1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRnU2U09mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IRmxKc09mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hGbEpzZWZYRWR1cUhvT0piVVJaUnciIHg9IjEyNTk4IiB5PSIzOTIwIiB3aWR0aD0iMzg2MCIgaGVpZ2h0PSIyMDE1Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRnU2ZGVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMTdGIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZ1NmVPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEZ1NmVlZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGdTZldWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZ1NmUtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRnU2Zk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZ1NmZlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRnU2ZnVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZ1NmYtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRnU2Z09mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZ1NmdlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRnU2Z3VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZ1NmctZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEZ1NmhPZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEZ1NmR1ZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRnU2ZC1mWEVkdXFIb09KYlVSWlJ3IiB4PSIzNzA4IiB5PSIzOTIwIiB3aWR0aD0iMzg2MCIgaGVpZ2h0PSIyMDE1Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTERpYWdyYW1TdHlsZSIgeG1pOmlkPSJfR3RjV0ZlZlhFZHVxSG9PSmJVUlpSdyIgZGVzY3JpcHRpb249IkEgc2ltcGxpZmllZCBvdmVydmlldyB0byBXb3JrIFByb2R1Y3RzLiBXb3JrIFByb2R1Y3QgaXMgYW4gYWJzdHJhY3QgY2xhc3Mgd2hpY2ggcHJvdmlkZXMgYSBnZW5lcmFsaXphdGlvbiBmb3IgQXJ0aWZhY3RzLCBPdXRjb21lcywgYW5kIERlbGl2ZXJhYmxlcy4iLz4KLSAgICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEZsSnB1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDA0QSIgc291cmNlPSJfSEZsSmh1ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEZsSmx1ZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGbEpxZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZsSnEtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGbEpyT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRmxKcXVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEZsSnAtZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hGbEpxT2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzAsIC0xMDE2LCAwLCAyMDgyXSRbMCwgLTIwOTEsIDAsIDEwMDddIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hGbEpyZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRmxKcnVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hGdTZTZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAwMkQiIHNvdXJjZT0iX0hGbEpsdWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hGbEpyLWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRnU2VE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGdTZUdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRnU2VC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRnU2VGVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxNjMzIiB5PSIxMDU2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZ1NlVPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDAzMCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZ1NlV1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEZ1NlVlZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTE5OSIgeT0iMjM4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZ1NlUtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAwMzAiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGdTZWZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRnU2Vk9mWEVkdXFIb09KYlVSWlJ3IiB4PSIyMDUzIiB5PSItMjg3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZ1NlZ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMDJFIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRnU2V09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGdTZWLWZYRWR1cUhvT0piVVJaUnciIHg9IjM3NyIgeT0iLTQ1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGdTZXZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMDJFIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRnU2Vy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRnU2V3VmWEVkdXFIb09KYlVSWlJ3IiB4PSIxMjMiIHk9IjM0NyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGdTZYT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAwMzAiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGdTZYdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGdTZYLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGdTZYZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRnU2WU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAwMkUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGdTZZdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGdTZZLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGdTZZZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRnU2Wk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDAzMCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZ1Nlp1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEZ1NlotZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEZ1NlplZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGdTZhT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAwMkUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGdTZhdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEZ1NmEtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEZ1NmFlZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hGdTZTdWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEZ1NlMtZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMTkzMCwgNDIsIC0yNTQwLCAtMzA1Nl0kWzQwODksIDQyLCAtMzgxLCAtMzA1Nl0kWzQwODksIDIwOTEsIC0zODEsIC0xMDA3XSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEZ1NmJPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDAyQyIgc291cmNlPSJfSEZsSnItZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEZsSmx1ZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGdTZiLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZ1NmNlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGdTZjdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRnU2Y09mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEZ1NmJlZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hGdTZidWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0xNDU2LCAtMTAxNiwgMzAxNCwgMjA4Ml0kWy0zMDA1LCAtMjA5MSwgMTQ2NCwgMTAwN10iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEZ1NmMtZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hGdTZkT2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEZ1NmhlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDAxMCIgc291cmNlPSJfSEZ1NmRlZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEZ1NmRlZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGdTZpT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZ1Nml1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGdTZpLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hGdTZpZWZYRWR1cUhvT0piVVJaUnciIHg9Ii02OCIgeT0iLTI3OSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGdTZqT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAwMTMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGdTZqdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGdTZqZWZYRWR1cUhvT0piVVJaUnciIHg9IjEzNTkiIHk9IjI4MiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGdTZqLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMDEzIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRnU2a2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEZ1NmtPZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTU5IiB5PSItMzExIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZ1Nmt1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMDExIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRnU2bE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGdTZrLWZYRWR1cUhvT0piVVJaUnciIHg9Ii00MDEiIHk9Ijc2OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGdTZsZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAwMTEiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGdTZsLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGdTZsdWZYRWR1cUhvT0piVVJaUnciIHg9IjE0MTMiIHk9IjczOCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGdTZtT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAwMTMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGdTZtdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGdTZtLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGdTZtZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRnU2bk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAwMTEiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGdTZudWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGdTZuLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGdTZuZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRnU2b09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDAxMyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZ1Nm91ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEZ1Nm8tZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEZ1Nm9lZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGdTZwT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAwMTEiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGdTZwdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEZ1NnAtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEZ1NnBlZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hGdTZodWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEZ1NmgtZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbNjYwLCAxMDA3LCA2NjAsIDEwMDddJFs2NjAsIDI1NTYsIDY2MCwgMjU1Nl0kWy0zODY5LCAyNTU2LCAtMzg2OSwgMjU1Nl0kWy0zODY5LCAyMjAsIC0zODY5LCAyMjBdJFstMTkzMCwgMjIwLCAtMTkzMCwgMjIwXSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEZ1NnFPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDAwRiIgc291cmNlPSJfSEZ1NmRlZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEZsSmx1ZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGdTZxLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZ1NnJlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGdTZydWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRnU2ck9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEZ1NnFlZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hGdTZxdWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzE0MjIsIC0xMDE2LCAtMjk5NywgMjA4Ml0kWzI5NjMsIC0yMDkxLCAtMTQ1NiwgMTAwN10iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEZ1NnItZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hGdTZzT2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgPC9jb250ZW50cz4KLSAgICAgICAgICAgIDxjb250ZW50cyB4bWk6dHlwZT0ibm90YXRpb246RGlhZ3JhbSIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDI3OTg2MjcwMUE2IiB0eXBlPSJDbGFzcyIgbmFtZT0iVGFza3NBbmRTdGVwcyI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRjRyUU9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjlFIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEY0clEtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEY0clJPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGNHJSZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEY0clJ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRjRyUi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEY0clNPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRjRyU2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEY0clN1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRjRyUy1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEY0clRPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRjRyVGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEY0clR1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEY0clQtZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEY0clFlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRjRyUXVmWEVkdXFIb09KYlVSWlJ3IiB4PSIyNTkwIiB5PSI1MTk4Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRjRyVU9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3OTRBNjYwMzY4Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEY0clUtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEY0clZPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGNHJWZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEY0clZ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRjRyVi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEY0cldPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRjRyV2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEY0cld1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRjRyVy1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEY0clhPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRjRyWGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEY0clh1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEY0clgtZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEY0clVlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRjRyVXVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxMzk3MCIgeT0iNTE1NiIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEY0cmctZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI2QyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGNHJodWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hGNHJoLWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIyODc4IiBoZWlnaHQ9IjEwNDkiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRjRyaU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGNHJpZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEY0cml1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGNHJpLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEY0cmpPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGNHJqZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEY0cmp1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGNHJqLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEY0cmtPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGNHJrZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGNHJrdWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hGNHJoT2ZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEY0cmhlZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTE1MSIgeT0iMjk4MCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEY0cmstZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E4MkQzMDE3RiI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGNHJsdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hGNHJsLWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIyNjU4IiBoZWlnaHQ9IjkwNSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGNHJtT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEY0cm1lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRjRybXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEY0cm0tZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRjRybk9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEY0cm5lZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRjRybnVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEY0cm4tZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRjRyb09mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEY0cm9lZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEY0cm91ZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEY0cmxPZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRjRybGVmWEVkdXFIb09KYlVSWlJ3IiB4PSI3MTU0IiB5PSI2NzY0Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRjRyby1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRTRDRjMwMUFFIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEY0cnB1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEY0cnAtZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjI3OTQiIGhlaWdodD0iMTA0OSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGNHJxT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEY0cnFlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRjRycXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEY0cnEtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRjRyck9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEY0cnJlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRjRycnVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEY0cnItZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRjRyc09mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEY0cnNlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEY0cnN1ZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEY0cnBPZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRjRycGVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxMzQ4NyIgeT0iNzQ1Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRjRyMXVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERTRBOTcwMTIzIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdCMU1PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEdCMU1lZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjM0MDMiIGhlaWdodD0iMTA0OSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHQjFNdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdCMU0tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR0IxTk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdCMU5lZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IR0IxTnVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdCMU4tZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IR0IxT09mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdCMU9lZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IR0IxT3VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdCMU8tZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEdCMVBPZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEY0cjEtZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRjRyMk9mWEVkdXFIb09KYlVSWlJ3IiB4PSI3NDQyIiB5PSI3NDUiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHQjFZT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjk0RUI5MDAwRkMiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR0IxWS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IR0IxWk9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMzU4OSIgaGVpZ2h0PSI5OTAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR0IxWmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHQjFadWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdCMVotZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHQjFhT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEdCMWFlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHQjFhdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEdCMWEtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHQjFiT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEdCMWJlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHQjFidWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hHQjFiLWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hHQjFZZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEdCMVl1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iNzQ1IiB5PSI4ODAiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MRGlhZ3JhbVN0eWxlIiB4bWk6aWQ9Il9HdGNXRi1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hGNHJZT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjc5NjJEMzAwM0YiIHNvdXJjZT0iX0hGNHJRT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hGNHJVT2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRjRyWS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGNHJaZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRjRyWnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEY0clpPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGNHJaLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3OTYyRDQwMjBFIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRjRyYWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRjRyYU9mWEVkdXFIb09KYlVSWlJ3IiB5PSIzOTYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRjRyYXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjc5NjJENDAyMEUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGNHJiT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRjRyYS1mWEVkdXFIb09KYlVSWlJ3IiB4PSI0MSIgeT0iLTM0OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGNHJiZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyNzk2MkQ0MDIwMyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEY0cmItZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRjRyYnVmWEVkdXFIb09KYlVSWlJ3IiB4PSI0NjAiIHk9IjI3OSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGNHJjT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjc5NjJENDAyMDMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGNHJjdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGNHJjZWZYRWR1cUhvT0piVVJaUnciIHg9Ii04MSIgeT0iLTI4OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGNHJjLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjc5NjJENDAyMEUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGNHJkZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGNHJkdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGNHJkT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRjRyZC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjc5NjJENDAyMDMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGNHJlZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGNHJldWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGNHJlT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRjRyZS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyNzk2MkQ0MDIwRSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEY0cmZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEY0cmZ1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEY0cmZPZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGNHJmLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjc5NjJENDAyMDMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGNHJnZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEY0cmd1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEY0cmdPZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hGNHJZZWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEY0cll1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbNzYyLCAtNjcsIC0xMDYxNywgLTE2XSRbMTA2MTcsIC02NywgLTc2MiwgLTE2XSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEY0cnMtZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMUU0RTNCMDMxOSIgc291cmNlPSJfSEY0cm8tZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEY0cm8tZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGNHJ0dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEY0cnVPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGNHJ1ZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRjRydC1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEY0cnV1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMUU0RTNEMDM2NCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEY0cnZPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEY0cnUtZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTQ2MiIgeT0iMjU0Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEY0cnZlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRTRFM0QwMzY0Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRjRydi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEY0cnZ1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTM2MCIgeT0iLTMzOSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGNHJ3T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMUU0RTNEMDM2MiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEY0cnd1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRjRyd2VmWEVkdXFIb09KYlVSWlJ3IiB4PSItMjEyIiB5PSI0NTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRjRydy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRTRFM0QwMzYyIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRjRyeGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRjRyeE9mWEVkdXFIb09KYlVSWlJ3IiB4PSI0NzYiIHk9Ii0zMzEiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRjRyeHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRTRFM0QwMzY0Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRjRyeU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRjRyeWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRjRyeC1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEY0cnl1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRTRFM0QwMzYyIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRjRyek9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRjRyemVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRjRyeS1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEY0cnp1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjFFNEUzRDAzNjQiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGNHIwT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGNHIwZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGNHJ6LWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRjRyMHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRTRFM0QwMzYyIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRjRyMU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGNHIxZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGNHIwLWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IRjRydE9mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hGNHJ0ZWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzEzOTcsIDE2OSwgMTM5NywgMTY5XSRbMjU3MywgMTY5LCAyNTczLCAxNjldJFsyNTczLCAxNDgxLCAyNTczLCAxNDgxXSRbNTQxLCAxNDgxLCA1NDEsIDE0ODFdJFs1NDEsIDUyNCwgNTQxLCA1MjRdIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IR0IxUGVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRTREQUMwMUEwIiBzb3VyY2U9Il9IRjRyMXVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IRjRyby1mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdCMVFPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR0IxUXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdCMVEtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hHQjFRZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR0IxUk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRTREQUQwMDU3Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR0IxUnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IR0IxUmVmWEVkdXFIb09KYlVSWlJ3IiB4PSI0MDAiIHk9Ii0xOTUiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR0IxUi1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjFFNERBRDAwNTciPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHQjFTZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IR0IxU09mWEVkdXFIb09KYlVSWlJ3IiB4PSItMTI1IiB5PSItMzQ4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdCMVN1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRTREQUQwMDREIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR0IxVE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hHQjFTLWZYRWR1cUhvT0piVVJaUnciIHg9Ii0yIiB5PSItMTQ0Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdCMVRlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMUU0REFEMDA0RCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdCMVQtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEdCMVR1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTYyNSIgeT0iMjIzIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdCMVVPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMUU0REFEMDA1NyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdCMVV1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEdCMVUtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEdCMVVlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHQjFWT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMUU0REFEMDA0RCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdCMVZ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEdCMVYtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEdCMVZlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHQjFXT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRTREQUQwMDU3Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR0IxV3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IR0IxVy1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IR0IxV2VmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdCMVhPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMUU0REFEMDA0RCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdCMVh1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IR0IxWC1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IR0IxWGVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEdCMVB1ZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IR0IxUC1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlsxOTA1LCAxMDYsIC0zMTQ5LCAxMDZdJFs0MTI4LCAxMDYsIC05MjYsIDEwNl0iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hHQjFjT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjk0RUM2MDAyQkQiIHNvdXJjZT0iX0hGNHIxdWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hHQjFZT2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR0IxYy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHQjFkZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR0IxZHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEdCMWRPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHQjFkLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjk0RUM2MDAyQkYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHQjFlZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hHQjFlT2ZYRWR1cUhvT0piVVJaUnciIHg9IjIwNSIgeT0iMTk0Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdCMWV1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjk0RUM2MDAyQkYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHQjFmT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IR0IxZS1mWEVkdXFIb09KYlVSWlJ3IiB4PSI3NzIiIHk9Ii0yNDYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR0IxZmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjk0RUM2MDAyQkUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHQjFmLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEdCMWZ1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTE2MSIgeT0iMTk0Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdCMWdPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjk0RUM2MDAyQkUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHQjFndWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hHQjFnZWZYRWR1cUhvT0piVVJaUnciIHg9IjE0NCIgeT0iMzQ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdCMWctZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyOTRFQzYwMDJCRiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdCMWhlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEdCMWh1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEdCMWhPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHQjFoLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyOTRFQzYwMDJCRSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdCMWllZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEdCMWl1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEdCMWlPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHQjFpLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI5NEVDNjAwMkJGIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR0IxamVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IR0IxanVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IR0Ixak9mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdCMWotZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyOTRFQzYwMDJCRSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdCMWtlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IR0Ixa3VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IR0Ixa09mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEdCMWNlZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IR0IxY3VmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMTcwMSwgNTAsIDQ5MDIsIC01MF0kWy00ODA5LCA1MCwgMTc5NCwgLTUwXSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEdCMWstZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDMyRiIgc291cmNlPSJfSEY0clFPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEY0cmctZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHQjFsdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdCMW1PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHQjFtZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IR0IxbC1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEdCMWxPZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IR0IxbGVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMjUsIC00OTEsIC0yNSwgMTY5M10kWy0yNSwgLTE2NTksIC0yNSwgNTI0XSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IR0IxbXVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEdCMW0tZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IR0Ixbk9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTgzMTgwMEI4IiBzb3VyY2U9Il9IRjRyUU9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IRjRyay1mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdCMW4tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR0Ixb2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdCMW91ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hHQjFvT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IR0IxbmVmWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEdCMW51ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbNzYyLCAxODYsIC01MTMwLCAtMTMzN10kWzQ1NTUsIDExNjgsIC0xMzM3LCAtMzU1XSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IR0Ixby1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEdCMXBPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IR0IxcGVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI5NEVDNEEwMzA2IiBzb3VyY2U9Il9IRjRyZy1mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IR0IxWU9mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdCMXFPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR0IxcXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdCMXEtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hHQjFxZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IR0IxcHVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hHQjFwLWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzI1LCAtNTI0LCA3NiwgMTYwOF0kWzI1LCAtMTY0MiwgNzYsIDQ5MV0iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEdCMXJPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hHQjFyZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEdCMXJ1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyNzk4MzBFMDE1MCIgc291cmNlPSJfSEY0clVPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEY0cm8tZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHQjFzZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdCMXMtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHQjF0T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IR0Ixc3VmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEdCMXItZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IR0Ixc09mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlsyMTEsIC00ODIsIC03MDIsIDM4ODZdJFsyMTEsIC0zODQzLCAtNzAyLCA1MjRdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hHQjF0ZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IR0IxdHVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hHQjF0LWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBODMyMzAwRkUiIHNvdXJjZT0iX0hGNHJVT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hGNHJrLWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR0IxdXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHQjF2T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR0IxdmVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEdCMXUtZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hHQjF1T2ZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IR0IxdWVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstNzcwLCAyMDMsIDQ3MTUsIC0xMzcxXSRbLTQxNTcsIDExNzYsIDEzMjksIC0zOTddIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hHQjF2dWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IR0Ixdi1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgIDwvY29udGVudHM+Ci0gICAgICAgICAgICA8Y29udGVudHMgeG1pOnR5cGU9Im5vdGF0aW9uOkRpYWdyYW0iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyN0E4NTREMDJCRiIgdHlwZT0iQ2xhc3MiIG5hbWU9IldvcmtEZWZpbml0aW9uIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHTG1NT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBODU3QjAzMzMiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR0xtTS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IR0xtTk9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdMbU5lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR0xtTnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHTG1OLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR0xtT09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEdMbU9lZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHTG1PdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEdMbU8tZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHTG1QT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEdMbVBlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHTG1QdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hHTG1QLWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hHTG1NZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iTm9uZSIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEdMbU11ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTA5NzIiIHk9Ijk0OCIgd2lkdGg9IjI4NTMiIGhlaWdodD0iMjI2OSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdMbVFPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E4MkQzMDE3RiI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHTG1RLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hHTG1ST2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR0xtUmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHTG1SdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdMbVItZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHTG1TT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IR0xtU2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdMbVN1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IR0xtUy1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdMbVRPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IR0xtVGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdMbVR1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEdMbVQtZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEdMbVFlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IR0xtUXVmWEVkdXFIb09KYlVSWlJ3IiB4PSIyODQxIiB5PSI4OTciIHdpZHRoPSIzMzY0IiBoZWlnaHQ9IjIyNjkiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHZWhZLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyOUUiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR2VoWnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IR2VoWi1mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdlaGFPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR2VoYWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHZWhhdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR2VoYS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hHZWhiT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR2VoYmVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hHZWhidWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR2VoYi1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hHZWhjT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR2VoY2VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IR2VoY3VmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IR2VoWk9mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hHZWhaZWZYRWR1cUhvT0piVVJaUnciIHg9IjE5MDIiIHk9IjQ3NTUiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHZWhmT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjc5NEE2NjAzNjgiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR2VoZi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IR2VoZ09mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdlaGdlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR29TSU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHb1NJZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR29TSXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hHb1NJLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR29TSk9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hHb1NKZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR29TSnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hHb1NKLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR29TS09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IR29TS2VmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IR2VoZmVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hHZWhmdWZYRWR1cUhvT0piVVJaUnciIHg9IjU3MDYiIHk9IjQ3NTUiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MRGlhZ3JhbVN0eWxlIiB4bWk6aWQ9Il9HdG1IRWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hHTG1VT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBODdFOTAwNjEiIHNvdXJjZT0iX0hHTG1RT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hHTG1NT2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR2VoSU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHZWhJdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR2VoSS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEdlaEllZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHZWhKT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTg3RTkwMkQ5Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR2VoSnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IR2VoSmVmWEVkdXFIb09KYlVSWlJ3IiB5PSIzOTYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR2VoSi1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBODdFOTAyRDkiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHZWhLZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IR2VoS09mWEVkdXFIb09KYlVSWlJ3IiB5PSItMzk3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdlaEt1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTg3RTkwMkNGIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR2VoTE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hHZWhLLWZYRWR1cUhvT0piVVJaUnciIHg9IjE1NyIgeT0iMjcwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdlaExlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E4N0U5MDJDRiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdlaEwtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEdlaEx1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTgyNiIgeT0iLTI1NSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHZWhNT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBODdFOTAyRDkiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHZWhNdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hHZWhNLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hHZWhNZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR2VoTk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBODdFOTAyQ0YiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHZWhOdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hHZWhOLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hHZWhOZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR2VoT09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E4N0U5MDJEOSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdlaE91ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEdlaE8tZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEdlaE9lZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHZWhQT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBODdFOTAyQ0YiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHZWhQdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEdlaFAtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEdlaFBlZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hHTG1VZWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEdMbVV1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMTQzMCwgLTU3NSwgLTYxODksIC02MjZdJFs2MTk3LCAtNTc1LCAtMTQyMiwgLTYyNl0iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hHZWhRT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBODgzNDAxMTAiIHNvdXJjZT0iX0hHTG1RT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hHTG1NT2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR2VoUS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHZWhSZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR2VoUnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEdlaFJPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHZWhSLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTg4MzQwMkU4Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR2VoU2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IR2VoU09mWEVkdXFIb09KYlVSWlJ3IiB5PSIzOTYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR2VoU3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBODgzNDAyRTgiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHZWhUT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IR2VoUy1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMzk3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdlaFRlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTg4MzQwMkRFIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR2VoVC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hHZWhUdWZYRWR1cUhvT0piVVJaUnciIHg9IjE4MiIgeT0iMzA0Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdlaFVPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E4ODM0MDJERSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdlaFV1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEdlaFVlZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTg3NiIgeT0iLTIyMSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHZWhVLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBODgzNDAyRTgiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHZWhWZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hHZWhWdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hHZWhWT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR2VoVi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBODgzNDAyREUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHZWhXZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hHZWhXdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hHZWhXT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR2VoVy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E4ODM0MDJFOCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdlaFhlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEdlaFh1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEdlaFhPZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHZWhYLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBODgzNDAyREUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHZWhZZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEdlaFl1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEdlaFlPZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hHZWhRZWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEdlaFF1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMTY2NywgNjA5LCAtNjE5MSwgNTU2XSRbNjQyOSwgNjA5LCAtMTQyOSwgNTU2XSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEdlaGMtZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E4MzE4MDBCOCIgc291cmNlPSJfSEdlaFktZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEdMbVFPZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHZWhkdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdlaGVPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHZWhlZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IR2VoZC1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEdlaGRPZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hHZWhkZWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzI2MiwgLTQ1NywgLTE5MjEsIDMyNTFdJFsxNTA3LCAtMjU3MywgLTY3NywgMTEzNF0iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEdlaGV1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hHZWhlLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEdvU0t1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyNzk2MkQzMDAzRiIgc291cmNlPSJfSEdlaFktZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEdlaGZPZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHb1NMZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdvU0wtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHb1NNT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IR29TTHVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdvU01lZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjc5NjJENDAyMEUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHb1NNLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hHb1NNdWZYRWR1cUhvT0piVVJaUnciIHk9IjM5NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHb1NOT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyNzk2MkQ0MDIwRSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdvU051ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hHb1NOZWZYRWR1cUhvT0piVVJaUnciIHg9IjQ2MyIgeT0iLTI5NCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHb1NOLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyNzk2MkQ0MDIwMyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdvU09lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IR29TT09mWEVkdXFIb09KYlVSWlJ3IiB4PSItMjEwIiB5PSIyNTYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR29TT3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3OTYyRDQwMjAzIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR29TUE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IR29TTy1mWEVkdXFIb09KYlVSWlJ3IiB4PSItNTc3IiB5PSItMjg1Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdvU1BlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyNzk2MkQ0MDIwRSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdvU1AtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEdvU1FPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEdvU1B1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHb1NRZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyNzk2MkQ0MDIwMyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdvU1EtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEdvU1JPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEdvU1F1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHb1NSZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3OTYyRDQwMjBFIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR29TUi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IR29TU09mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IR29TUnVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdvU1NlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyNzk2MkQ0MDIwMyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdvU1MtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IR29TVE9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IR29TU3VmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEdvU0stZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IR29TTE9mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9Ils2NjEsIDUzLCAtMzE3NSwgNTNdJFszMTIyLCA1MywgLTcxNCwgNTNdIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IR29TVGVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTgzMjMwMEZFIiBzb3VyY2U9Il9IR2VoZk9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IR0xtUU9mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdvU1VPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR29TVXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdvU1UtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hHb1NVZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IR29TVHVmWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEdvU1QtZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTI2MiwgLTQ1NywgMTgyMCwgMzI1MV0kWy0xNDQ3LCAtMjU3MywgNjM1LCAxMTM0XSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IR29TVk9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEdvU1ZlZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICA8L2NvbnRlbnRzPgotICAgICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3NaMFRlZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI5NCI+Ci0gICAgICAgICAgICA8Ym9keT4wMjwvYm9keT4KLSAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICA8cGFja2FnZU1lcmdlIHhtaTppZD0iX0NyNmZJT3hkRWR1SGplM3BQYWhONEEiIG1lcmdlZFBhY2thZ2U9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyNjIiLz4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI5NiIgbmFtZT0iUm9sZSI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dzWjBWT2ZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyOTYiPgotICAgICAgICAgICAgICA8Ym9keT5BIFJvbGUgaXMgYSBjb250ZW50IGVsZW1lbnQgdGhhdCBkZWZpbmVzIGEgc2V0IG9mIHJlbGF0ZWQgc2tpbGxzLCBjb21wZXRlbmNpZXMsIGFuZCByZXNwb25zaWJpbGl0aWVzLiAgUm9sZXMgYXJlIHVzZWQgYnkgVGFza3MgdG8gZGVmaW5lIHdobyBwZXJmb3JtcyB0aGVtIGFzIHdlbGwgYXMgZGVmaW5lIGEgc2V0IG9mIHdvcmsgcHJvZHVjdHMgdGhleSBhcmUgcmVzcG9uc2libGUgZm9yLiAgCi1BIFJvbGUgZGVmaW5lcyBhIHNldCBvZiByZWxhdGVkIHNraWxscywgY29tcGV0ZW5jaWVzLCBhbmQgcmVzcG9uc2liaWxpdGllcyBvZiBhbiBpbmRpdmlkdWFsIG9yIGEgc2V0IG9mIGluZGl2aWR1YWxzLiAgUm9sZXMgYXJlIG5vdCBpbmRpdmlkdWFscyBvciByZXNvdXJjZXMuICBJbmRpdmlkdWFsIG1lbWJlcnMgb2YgdGhlIGRldmVsb3BtZW50IG9yZ2FuaXphdGlvbiB3aWxsIHdlYXIgZGlmZmVyZW50IGhhdHMsIG9yIHBlcmZvcm0gZGlmZmVyZW50IHJvbGVzLiBUaGUgbWFwcGluZyBmcm9tIGluZGl2aWR1YWwgdG8gcm9sZSwgcGVyZm9ybWVkIGJ5IHRoZSBwcm9qZWN0IG1hbmFnZXIgd2hlbiBwbGFubmluZyBhbmQgc3RhZmZpbmcgZm9yIGEgcHJvamVjdCwgYWxsb3dzIGRpZmZlcmVudCBpbmRpdmlkdWFscyB0byBhY3QgYXMgc2V2ZXJhbCBkaWZmZXJlbnQgcm9sZXMsIGFuZCBmb3IgYSByb2xlIHRvIGJlIHBsYXllZCBieSBzZXZlcmFsIGluZGl2aWR1YWxzLgotPC9ib2R5PgotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMzA3IiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjZDIi8+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDOTMwMEY4IiBuYW1lPSJtb2RpZmllcyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMkJDIiBpc0Rlcml2ZWQ9InRydWUiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDBGMzZDOTMwMEY1Ij4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3NfcUtPZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3NfcUotZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MzAxMEMiIG5hbWU9InJlc3BvbnNpYmxlRm9yIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyQkMiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDBGMzZDOTMwMTA5Ij4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3NfcU1lZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3NfcU1PZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI5RSIgbmFtZT0iVGFzayI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dzaS1NLWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyOUUiPgotICAgICAgICAgICAgICA8Ym9keT5BIFRhc2sgaXMgYSBjb250ZW50IGVsZW1lbnQgdGhhdCBkZXNjcmliZXMgd29yayBiZWluZyBwZXJmb3JtZWQgYnkgUm9sZXMuICBJdCBkZWZpbmVzIG9uZSBkZWZhdWx0IHBlcmZvcm1pbmcgUm9sZSBhcyB3ZWxsIGFzIG1hbnkgYWRkaXRpb25hbCBwZXJmb3JtZXJzLiAgQSBUYXNrIGlzIGFzc29jaWF0ZWQgdG8gaW5wdXQgYW5kIG91dHB1dCB3b3JrIHByb2R1Y3RzLiAgSW5wdXRzIGFyZSBkaWZmZXJlbnRpYXRlZCBpbiBtYW5kYXRvcnkgdmVyc3VzIG9wdGlvbmFsIGlucHV0cy4gIFRoZSBhc3NvY2lhdGlvbnMgdG8gV29yayBQcm9kdWN0cyBhcmUgbm90IGluc3RhbnRpYXRhYmxlL3ZhcmlhYmxlLWxpa2UgcGFyYW1ldGVycy4gIFRoZXkgcmF0aGVyIGV4cHJlc3MgKGh5cGVyLSlsaW5rcyB0byB0aGUgZGVzY3JpcHRpb25zIG9mIHRoZSB3b3JrIHByb2R1Y3RzIHR5cGVzIHRoYXQgYXJlIHJlbGF0ZWQgdG8gdGhlIFRhc2sgYXMgaW5wdXRzIGFuZCBvdXRwdXRzLiAgSW4gb3RoZXIgd29yZHMsIHRoZXNlIGFzc29jaWF0aW9ucyBhcmUgbm90IGludGVuZGVkIHRvIGJlIHVzZWQgdG8gY2FwdHVyZSB3aGljaCBjb25jcmV0ZSBpbnN0YW5jZXMgd2lsbCBiZSBwYXNzZWQgd2hlbiBpbnN0YW50aWF0aW5nIHRoZSBtZXRob2QgaW4gYSBwcm9qZWN0LiAgQWxsIG9mIHRoZSBUYXNrJ3MgZGVmYXVsdCBhc3NvY2lhdGlvbnMgY2FuIGJlIG92ZXJyaWRkZW4gaW4gYW4gYWN0dWFsIHByb2Nlc3MgZGVmaW5pdGlvbi4KLUEgVGFzayBkZXNjcmliZXMgYW4gYXNzaWduYWJsZSB1bml0IG9mIHdvcmsuICBFdmVyeSBUYXNrIGlzIGFzc2lnbmVkIHRvIHNwZWNpZmljIFJvbGVzLiAgVGhlIGdyYW51bGFyaXR5IG9mIGEgVGFzayBpcyBnZW5lcmFsbHkgYSBmZXcgaG91cnMgdG8gYSBmZXcgZGF5cy4gIEl0IHVzdWFsbHkgYWZmZWN0cyBvbmUgb3Igb25seSBhIHNtYWxsIG51bWJlciBvZiB3b3JrIHByb2R1Y3RzLiBBIFRhc2sgaXMgdXNlZCBhcyBhbiBlbGVtZW50IG9mIGRlZmluaW5nIGEgcHJvY2Vzcy4gVGFza3MgYXJlIGZ1cnRoZXIgdXNlZCBmb3IgcGxhbm5pbmcgYW5kIHRyYWNraW5nIHByb2dyZXNzOyB0aGVyZWZvcmUsIGlmIHRoZXkgYXJlIGRlZmluZWQgdG9vIGZpbmUtZ3JhaW5lZCwgdGhleSB3aWxsIGJlIG5lZ2xlY3RlZCwgYW5kIGlmIHRoZXkgYXJlIHRvbyBsYXJnZSwgcHJvZ3Jlc3Mgd291bGQgaGF2ZSB0byBiZSBleHByZXNzZWQgaW4gdGVybXMgb2YgYSBUYXNrJ3MgcGFydHMgKGUuZy4gU3RlcHMsIHdoaWNoIGlzIG5vdCByZWNvbW1lbmRlZCkuIAotQSBUYXNrIGhhcyBhIGNsZWFyIHB1cnBvc2UgaW4gd2hpY2ggdGhlIHBlcmZvcm1pbmcgcm9sZXMgYWNoaWV2ZSBhIHdlbGwgZGVmaW5lZCBnb2FsLiAgSXQgcHJvdmlkZXMgY29tcGxldGUgc3RlcC1ieS1zdGVwIGV4cGxhbmF0aW9ucyBvZiBkb2luZyBhbGwgdGhlIHdvcmsgdGhhdCBuZWVkcyB0byBiZSBkb25lIHRvIGFjaGlldmUgdGhpcyBnb2FsLiAgVGhpcyBkZXNjcmlwdGlvbiBpcyBjb21wbGV0ZSwgaW5kZXBlbmRlbnQgb2Ygd2hlbiBpbiBhIHByb2Nlc3MgbGlmZWN5Y2xlIHRoZSB3b3JrIHdvdWxkIGFjdHVhbGx5IGJlIGRvbmUuICBJdCB0aGVyZWZvcmUgZG9lcyBub3QgZGVzY3JpYmUgd2hlbiB5b3UgZG8gd2hhdCB3b3JrIGF0IHdoYXQgcG9pbnQgb2YgdGltZSwgYnV0IGRlc2NyaWJlcyBhbGwgdGhlIHdvcmsgdGhhdCBnZXRzIGRvbmUgdGhyb3VnaG91dCB0aGUgZGV2ZWxvcG1lbnQgbGlmZWN5Y2xlIHRoYXQgY29udHJpYnV0ZXMgdG8gdGhlIGFjaGlldmVtZW50IG9mIHRoaXMgZ29hbC4gIFdoZW4gdGhlIFRhc2sgaXMgYmVpbmcgYXBwbGllZCBpbiBhIHByb2Nlc3MgdGhlbiB0aGlzIHByb2Nlc3MgYXBwbGljYXRpb24gKGRlZmluZWQgYXMgVGFzayBEZXNjcmlwdG9yKSBwcm92aWRlcyB0aGUgaW5mb3JtYXRpb24gb2Ygd2hpY2ggcGllY2VzIG9mIHRoZSBUYXNrIHdpbGwgYWN0dWFsbHkgYmUgcGVyZm9ybWVkIGF0IGFueSBwYXJ0aWN1bGFyIHBvaW50IGluIHRpbWUuIFRoaXMgYXNzdW1lcyB0aGF0IHRoZSBUYXNrIHdpbGwgYmUgcGVyZm9ybWVkIGluIHRoZSBwcm9jZXNzIG92ZXIgYW5kIG92ZXIgYWdhaW4sIGJ1dCBlYWNoIHRpbWUgd2l0aCBhIHNsaWdodGx5IGRpZmZlcmVudCBlbXBoYXNpcyBvbiBkaWZmZXJlbnQgc3RlcHMgb3IgYXNwZWN0cyBvZiB0aGUgdGFzayBkZXNjcmlwdGlvbi4gCi1Gb3IgZXhhbXBsZSwgYSBUYXNrIHN1Y2ggYXMgJnF1b3Q7RGV2ZWxvcCBVc2UgQ2FzZSBNb2RlbCZxdW90OyBkZXNjcmliZXMgYWxsIHRoZSB3b3JrIHRoYXQgbmVlZHMgdG8gYmUgZG9uZSB0byBkZXZlbG9wIGEgY29tcGxldGUgdXNlIGNhc2UgbW9kZWwuIFRoaXMgd291bGQgY29tcHJpc2Ugb2YgdGhlIGlkZW50aWZpY2F0aW9uIGFuZCBuYW1pbmcgb2YgdXNlIGNhc2VzIGFuZCBhY3RvcnMsIHRoZSB3cml0aW5nIG9mIGEgYnJpZWYgZGVzY3JpcHRpb24sIHRoZSBtb2RlbGluZyBvZiB1c2UgY2FzZXMgYW5kIHRoZWlyIHJlbGF0aW9uc2hpcHMgaW4gZGlhZ3JhbXMsIHRoZSBkZXRhaWxlZCBkZXNjcmlwdGlvbiBvZiBhIGJhc2ljIGZsb3csIHRoZSBkZXRhaWxlZCBkZXNjcmlwdGlvbiBvZiBhbHRlcm5hdGl2ZXMgZmxvd3MsIHBlcmZvcm1pbmcgb2Ygd2Fsa3Rocm91Z2hzIHdvcmtzaG9wcyBhbmQgcmV2aWV3cywgZXRjLiAgQWxsIG9mIHRoZXNlIHBhcnRzIGNvbnRyaWJ1dGUgdG8gdGhlIGRldmVsb3BtZW50IGdvYWwgb2YgZGV2ZWxvcGluZyB0aGUgdXNlIGNhc2UgbW9kZWwsIGJ1dCB0aGUgcGFydHMgd2lsbCBiZSBwZXJmb3JtZWQgYXQgZGlmZmVyZW50IHBvaW50cyBpbiB0aW1lIGluIGEgcHJvY2Vzcy4gIElkZW50aWZpY2F0aW9uLCBuYW1pbmcsIGFuZCBicmllZiBkZXNjcmlwdGlvbnMgd291bGQgYmUgcGVyZm9ybWVkIGVhcmx5IGluIGEgdHlwaWNhbCBkZXZlbG9wbWVudCBwcm9jZXNzIHZlcnN1cyB0aGUgd3JpdGluZyBvZiBkZXRhaWxlZCBhbHRlcm5hdGl2ZSBmbG93cyB3aGljaCB3b3VsZCBiZSBwZXJmb3JtZWQgbXVjaCBsYXRlci4gIEFsbCB0aGVzZSBwYXJ0cyBvciBzdGVwcyB3aXRoaW4gdGhlIHNhbWUgVGFzayBkZWZpbmUgdGhlICZxdW90O21ldGhvZCZxdW90OyBvZiBEZXZlbG9waW5nIGEgVXNlIENhc2UgTW9kZWwuICBBcHBseWluZyBzdWNoIGEgbWV0aG9kIGluIGEgbGlmZWN5Y2xlIChpLmUuIGluIGEgcHJvY2VzcykgaXMgZGVmaW5pbmcgd2hpY2ggc3RlcHMgYXJlIGRvbmUgd2hlbiBnb2luZyBmcm9tIG9uZSBpdGVyYXRpb24gdG8gdGhlIG5leHQuCi08L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAzMkYiIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyNkMiLz4KLSAgICAgICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MjdBODMxODAwQjgiIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0MjdBODJEMzAxN0YiLz4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAzMDkiIG5hbWU9InBlcmZvcm1lZEJ5IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyOTYiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMzA4Ij4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3MyZ04tZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IjEiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3MyZ051ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAzQTgiIG5hbWU9Im1hbmRhdG9yeUlucHV0IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyQkMiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMzlEIj4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3MyZ1EtZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3MyZ1F1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAzQkUiIG5hbWU9Im91dHB1dCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMkJDIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDNCQiI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0dzMmdUT2ZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0dzMmdTLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDExN0NGNUQwMzU3IiBuYW1lPSJhZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjk2IiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQxMTdDRjVDMDFDQyI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0dzX3FPdWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0dzX3FPZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDE3N0Y4NEEwMjVFIiBuYW1lPSJvcHRpb25hbElucHV0IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyQkMiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDE3N0Y4NDkwMTMxIj4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3RKYk51ZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3RKYk5lZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0Mjc5NjJENDAyMDMiIG5hbWU9InN0ZXBzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0Mjc5NEE2NjAzNjgiIGlzRGVyaXZlZD0idHJ1ZSIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0Mjc5NjJEMzAwM0YiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HdFRNSS1mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HdFRNSXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMkJDIiBuYW1lPSJXb3JrUHJvZHVjdCIgaXNBYnN0cmFjdD0idHJ1ZSI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dzaS1PT2ZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyQkMiPgotICAgICAgICAgICAgICA8Ym9keT5Xb3JrIFByb2R1Y3QgaXMgYW4gYWJzdHJhY3QgY2xhc3Mgd2hpY2ggcHJvdmlkZXMgYSBnZW5lcmFsaXphdGlvbiBmb3IgdGhlIGNvbnRlbnQgZWxlbWVudCB0eXBlcyBBcnRpZmFjdCwgT3V0Y29tZSwgYW5kIERlbGl2ZXJhYmxlLiAgVGhlIG1ldGEtbW9kZWwgY2xhc3MgV29yayBQcm9kdWN0IGFjdHVhbGx5IHJlcHJlc2VudHMgd29yayBwcm9kdWN0IHR5cGVzLCBpLmUuIGFuIGluc3RhbmNlIG9mIFdvcmsgUHJvZHVjdCBpcyBhIGRlc2NyaXB0aW9uIG9mIGEgc3BlY2lmaWMgdHlwZSBvZiB3b3JrIHByb2R1Y3QgYW5kIG5vdCBhbiBpbmRpdmlkdWFsIHdvcmsgcHJvZHVjdCBpbnN0YW5jZS4gIEhvd2V2ZXIsIGZvciBzaW1wbGljaXR5IHJlYXNvbnMgYW5kIGJlY2F1c2Ugb2YgbG93IHJpc2sgb2YgbWlzaW50ZXJwcmV0YXRpb24gd2UgZGlkIG5vdCBhcHBlbmQgdGhlIHdvcmQgJ3R5cGUnIHRvIGV2ZXJ5IG1ldGEtY2xhc3MuCi1BIHdvcmsgcHJvZHVjdCBpcyBhbiBhYnN0cmFjdGlvbiBmb3IgZGVzY3JpcHRpb25zIG9mIGNvbnRlbnQgZWxlbWVudHMgdGhhdCBhcmUgdXNlZCB0byBkZWZpbmUgYW55dGhpbmcgdXNlZCwgcHJvZHVjZWQsIG9yIG1vZGlmaWVkIGJ5IGEgdGFzay4KLTwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDNEOSIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI2QyIvPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMkRBIiBuYW1lPSJHdWlkYW5jZSIgaXNBYnN0cmFjdD0idHJ1ZSI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dzaS1QT2ZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyREEiPgotICAgICAgICAgICAgICA8Ym9keT5HdWlkYW5jZSBpcyBhbiBhYnN0cmFjdCBnZW5lcmFsaXphdGlvbiBvZiBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlbGF0ZWQgdG8gY29udGVudCBlbGVtZW50cyBzdWNoIGFzIFJvbGVzLCBUYXNrcywgYW5kIFdvcmsgUHJvZHVjdHMuICBFeGFtcGxlcyBmb3IgR3VpZGFuY2UgYXJlIEd1aWRlbGluZXMsIFRlbXBsYXRlcywgQ2hlY2tsaXN0cywgVG9vbCBNZW50b3JzLCBFc3RpbWF0ZXMsIFN1cHBvcnRpbmcgTWF0ZXJpYWxzLCBSZXBvcnRzLCBDb25jZXB0cywgZXRjLiAgVGhpcyBwYWNrYWdlIG9ubHkgY29udGFpbnMgdGhlIGRlZmluaXRpb24gb2YgdGhlIGFic3RyYWN0IEd1aWRhbmNlIGNsYXNzLiAgVGhlIHBhY2thZ2UgR3VpZGFuY2UgVHlwZXMgZGVmaW5lcyBjb25jcmV0ZSBndWlkYW5jZSB0eXBlcy48L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MzAxMUQiIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyNkMiLz4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDE3RiIgbmFtZT0iQXJ0aWZhY3QiPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9Hc2ktUU9mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMTdGIj4KLSAgICAgICAgICAgICAgPGJvZHk+QXJ0aWZhY3QgaXMgYSBXb3JrIFByb2R1Y3QgdGhhdCBwcm92aWRlcyBhIGRlc2NyaXB0aW9uIGFuZCBkZWZpbml0aW9uIGZvciB0YW5naWJsZSB3b3JrIHByb2R1Y3QgdHlwZXMuIEFydGlmYWN0cyBtYXkgYmUgY29tcG9zZWQgb2Ygb3RoZXIgYXJ0aWZhY3RzLiBGb3IgZXhhbXBsZSwgYSBtb2RlbCBhcnRpZmFjdCBjYW4gYmUgY29tcG9zZWQgb2YgbW9kZWwgZWxlbWVudHMsIHdoaWNoIGFyZSBhbHNvIGFydGlmYWN0cy4KLUFydGlmYWN0cyBhcmUgdGFuZ2libGUgd29yayBwcm9kdWN0cyBjb25zdW1lZCwgcHJvZHVjZWQsIG9yIG1vZGlmaWVkIGJ5IFRhc2tzLiAgSXQgbWF5IHNlcnZlIGFzIGEgYmFzaXMgZm9yIGRlZmluaW5nIHJldXNhYmxlIGFzc2V0cy4gIFJvbGVzIHVzZSBBcnRpZmFjdHMgdG8gcGVyZm9ybSBUYXNrcyBhbmQgcHJvZHVjZSBBcnRpZmFjdHMgaW4gdGhlIGNvdXJzZSBvZiBwZXJmb3JtaW5nIFRhc2tzLiAgQXJ0aWZhY3RzIGFyZSB0aGUgcmVzcG9uc2liaWxpdHkgb2YgYSBzaW5nbGUgUm9sZSwgbWFraW5nIHJlc3BvbnNpYmlsaXR5IGVhc3kgdG8gaWRlbnRpZnkgYW5kIHVuZGVyc3RhbmQsIGFuZCBwcm9tb3RpbmcgdGhlIGlkZWEgdGhhdCBldmVyeSBwaWVjZSBvZiBpbmZvcm1hdGlvbiBwcm9kdWNlZCBpbiB0aGUgbWV0aG9kIHJlcXVpcmVzIHRoZSBhcHByb3ByaWF0ZSBzZXQgb2Ygc2tpbGxzLiBFdmVuIHRob3VnaCBvbmUgcm9sZSBtaWdodCAmcXVvdDtvd24mcXVvdDsgYSBzcGVjaWZpYyB0eXBlIG9mIEFydGlmYWN0cywgb3RoZXIgcm9sZXMgY2FuIHN0aWxsIHVzZSB0aGUgQXJ0aWZhY3RzOyBwZXJoYXBzIGV2ZW4gdXBkYXRlIHRoZW0gaWYgdGhlIFJvbGUgaGFzIGJlZW4gZ2l2ZW4gcGVybWlzc2lvbiB0byBkbyBzby4KLTwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDAwRiIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDJCQyIvPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDAxMSIgbmFtZT0iY29udGFpbmVyQXJ0aWZhY3QiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDE3RiIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAwMTAiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HdEpiSk9mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iMSIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HdEpiSS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDAxMyIgbmFtZT0iY29udGFpbmVkQXJ0aWZhY3RzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxN0YiIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMDEwIj4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3RKYkotZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3RKYkp1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDE4NSIgbmFtZT0iRGVsaXZlcmFibGUiPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9Hc3N2TS1mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMTg1Ij4KLSAgICAgICAgICAgICAgPGJvZHk+QSBkZWxpdmVyYWJsZSBpcyBhIFdvcmsgUHJvZHVjdCB0aGF0IHByb3ZpZGVzIGEgZGVzY3JpcHRpb24gYW5kIGRlZmluaXRpb24gZm9yIHBhY2thZ2luZyBvdGhlciBXb3JrIFByb2R1Y3RzLCBhbmQgbWF5IGJlIGRlbGl2ZXJlZCB0byBhbiBpbnRlcm5hbCBvciBleHRlcm5hbCBwYXJ0eS4gIFRoZXJlZm9yZSwgYSBEZWxpdmVyYWJsZSBhZ2dyZWdhdGVzIG90aGVyIFdvcmsgUHJvZHVjdHMuIFRoZXJlZm9yZSwgYSBEZWxpdmVyYWJsZSBhZ2dyZWdhdGVzIG90aGVyIFdvcmsgUHJvZHVjdHMuICBBIERlbGl2ZXJhYmxlIGlzIHVzZWQgdG8gcHJlLWRlZmluZSB0eXBpY2FsIG9yIHJlY29tbWVuZGVkIGNvbnRlbnQgaW4gdGhlIGZvcm0gb3Igd29yayBwcm9kdWN0cyB0aGF0IHdvdWxkIGJlIHBhY2thZ2VkIGZvciBkZWxpdmVyeS4gIFRoZSBhY3R1YWwgcGFja2FnaW5nIG9mIHRoZSBEZWxpdmVyYWJsZSBpbiBhbiBhY3R1YWwgcHJvY2VzcyBvciBldmVuIHByb2plY3QgY291bGQgYmUgYSBtb2RpZmljYXRpb24gb2YgdGhpcyByZWNvbW1lbmRhdGlvbi4gIERlbGl2ZXJhYmxlcyBhcmUgdXNlZCB0byByZXByZXNlbnQgYW4gb3V0cHV0IGZyb20gYSBwcm9jZXNzIHRoYXQgaGFzIHZhbHVlLCBtYXRlcmlhbCBvciBvdGhlcndpc2UsIHRvIGEgY2xpZW50LCBjdXN0b21lciBvciBvdGhlciBzdGFrZWhvbGRlci4gPC9ib2R5PgotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMDJDIiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMkJDIi8+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMDMwIiBuYW1lPSJkZWxpdmVyZWRXb3JrUHJvZHVjdHMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDJCQyIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAwMkQiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HdEpiTU9mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HdEpiTC1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMThGIiBuYW1lPSJPdXRjb21lIj4KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3Nzdk4tZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDE4RiI+Ci0gICAgICAgICAgICAgIDxib2R5PkFuIG91dGNvbWUgZGVzY3JpYmVzIGludGFuZ2libGUgd29yayBwcm9kdWN0cyB0aGF0IGFyZSBhIHJlc3VsdCBvciBzdGF0ZS4gT3V0Y29tZXMgbWF5IGFsc28gYmUgdXNlZCB0byBkZXNjcmliZSB3b3JrIHByb2R1Y3RzIHRoYXQgYXJlIG5vdCBmb3JtYWxseSBkZWZpbmVkLiAgQSBrZXkgZGlmZmVyZW50aWF0b3IgZm9yIG91dGNvbWVzIGFnYWluc3QgYXJ0aWZhY3RzIGlzIHRoYXQgb3V0Y29tZXMgYXJlIG5vdCBjYW5kaWRhdGVzIGZvciBoYXJ2ZXN0aW5nIGFzIHJldXNhYmxlIGFzc2V0cy48L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAwNEEiIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyQkMiLz4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyNzk0QTY2MDM2OCIgbmFtZT0iU3RlcCI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dzc3ZPLWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjc5NEE2NjAzNjgiPgotICAgICAgICAgICAgICA8Ym9keT5BIFN0ZXAgaXMgYSBTZWN0aW9uIGFuZCBXb3JrIERlZmluaXRpb24gdGhhdCBpcyB1c2VkIHRvIG9yZ2FuaXplIFRhc2tzIGludG8gcGFydHMgb3Igc3VidW5pdHMgb2Ygd29yay4gIFN0ZXBzIGluaGVyaXQgdGhlIHN1YlNlY3Rpb25zIGRlY29tcG9zaXRpb24gZnJvbSBTZWN0aW9uIGFuZCBjYW4gdGhlcmVmb3JlIGRlc2NyaWJlIFN1Yi1TdGVwcyBuZXN0ZWQgaW50byBTdGVwcy4KLUEgU3RlcCBkZXNjcmliZXMgYSBtZWFuaW5nZnVsIGFuZCBjb25zaXN0IHBhcnQgb2YgdGhlIG92ZXJhbGwgd29yayBkZXNjcmliZWQgZm9yIGEgVGFzay4gIFRoZSBjb2xsZWN0aW9uIG9mIFN0ZXBzIGRlZmluZWQgZm9yIGEgVGFzayByZXByZXNlbnRzIGFsbCB0aGUgd29yayB0aGF0IHNob3VsZCBiZSBkb25lIHRvIGFjaGlldmUgdGhlIG92ZXJhbGwgZGV2ZWxvcG1lbnQgZ29hbCBvZiB0aGUgVGFzay4gIE5vdCBhbGwgc3RlcHMgYXJlIG5lY2Vzc2FyaWx5IHBlcmZvcm1lZCBlYWNoIHRpbWUgYSBUYXNrIGlzIGludm9rZWQgaW4gYSBQcm9jZXNzIChzZWUgVGFzayBEZXNjcmlwdG9yKSwgc28gdGhleSBjYW4gYWxzbyBiZSBleHByZXNzZWQgaW4gdGhlIGZvcm0gb2YgYWx0ZXJuYXRlICdmbG93cycgb2Ygd29yay4gIERpZmZlcmVudCB3YXlzIG9mIGFjaGlldmluZyB0aGUgc2FtZSBkZXZlbG9wbWVudCBnb2FsIGNhbiB0aGVuIGJlICdhc3NlbWJsZWQnIGJ5IHNlbGVjdGluZyBkaWZmZXJlbnQgY29tYmluYXRpb25zIG9mIHN0ZXBzIHdoZW4gYXBwbHlpbmcgdGhlIFRhc2sgaW4gYSBQcm9jZXNzLiAgVHlwaWNhbCBraW5kcyBvZiBzdGVwcyBhIFRhc2sgYXV0aG9yIHNob3VsZCBjb25zaWRlciBhcmU6IFRoaW5raW5nIHN0ZXBzOiB3aGVyZSB0aGUgaW5kaXZpZHVhbCByb2xlcyB1bmRlcnN0YW5kIHRoZSBuYXR1cmUgb2YgdGhlIHRhc2ssIGdhdGhlcnMgYW5kIGV4YW1pbmVzIHRoZSBpbnB1dCBhcnRpZmFjdHMsIGFuZCBmb3JtdWxhdGVzIHRoZSBvdXRjb21lLiBQZXJmb3JtaW5nIHN0ZXBzOiB3aGVyZSB0aGUgaW5kaXZpZHVhbCByb2xlcyBjcmVhdGUgb3IgdXBkYXRlIHNvbWUgYXJ0aWZhY3RzLiBSZXZpZXdpbmcgc3RlcHM6IHdoZXJlIHRoZSBpbmRpdmlkdWFsIHJvbGVzIGluc3BlY3RzIHRoZSByZXN1bHRzIGFnYWluc3Qgc29tZSBjcml0ZXJpYS4KLTwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyNzk4MzBFMDE1MCIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQyMUU0Q0YzMDFBRSIvPgotICAgICAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyN0E4MzIzMDBGRSIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQyN0E4MkQzMDE3RiIvPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDI3QTgyRDMwMTdGIiBuYW1lPSJXb3JrRGVmaW5pdGlvbiIgaXNBYnN0cmFjdD0idHJ1ZSI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dzc3ZRT2ZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBODJEMzAxN0YiPgotICAgICAgICAgICAgICA8Ym9keT5Xb3JrIERlZmluaXRpb24gaXMgYW4gYWJzdHJhY3QgTWV0aG9kIEVsZW1lbnQgdGhhdCBnZW5lcmFsaXplcyBhbGwgZGVzY3JpcHRpb25zIG9mIHdvcmsgd2l0aGluIHRoZSBVbmlmaWVkIE1ldGhvZCBBcmNoaXRlY3R1cmUuICBUaGlzIHBhY2thZ2UgaW50cm9kdWNlcyB0d28gY29uY3JldGUgdHlwZXMgb2YgV29yayBEZWZpbml0aW9uczogVGFzayBhbmQgU3RlcC4gIFdvcmsgRGVmaW5pdGlvbnMgY2FuIGNvbnRhaW4gc2V0cyBvZiBwcmUtIGFuZCBwb3N0LWNvbmRpdGlvbnMgZGVmaW5pbmcgY29uc3RyYWludHMgdGhhdCBuZWVkIHRvIGJlIHZhbGlkIGJlZm9yZSB0aGUgZGVzY3JpYmVkIHdvcmsgY2FuIGJlZ2luIG9yIGJlZm9yZSBpdCBjYW4gYmUgZGVjbGFyZWQgYXMgZmluaXNoZWQuICBOb3RlIHRoYXQgZ2VuZXJhbCBvd25lZFJ1bGVzIGNhbiBiZSB1c2VkIHRvIGRlZmluZSBhZGRpdGlvbmFsIGNvbnN0cmFpbnRzIGFuZCBydWxlcyBmb3IgV29yayBEZWZpbml0aW9ucy4KLVdvcmsgRGVmaW5pdGlvbnMgcmVwcmVzZW50IGJlaGF2aW9yYWwgZGVzY3JpcHRpb25zIGZvciBkb2luZyB3b3JrLiAgVGhlc2UgYmVoYXZpb3JhbCBkZXNjcmlwdGlvbnMgYXJlIG5vdCBib3VuZCB0byBvbmUgc3BlY2lmaWMgY2xhc3NpZmllciwgYnV0IHJlcHJlc2VudCBhbiBhcmJpdHJhcnkgZGVmaW5pdGlvbiBvZiB3b3JrLiAgRm9yIGV4YW1wbGUsIGEgV29yayBEZWZpbml0aW9uIGNvdWxkIHJlcHJlc2VudCB3b3JrIHRoYXQgaXMgYmVpbmcgcGVyZm9ybWVkIGJ5IGEgc3BlY2lmaWMgUm9sZSAoZS5nLiBhIFJvbGUgcGVyZm9ybWluZyBhIHNwZWNpZmljIFRhc2sgb3IgU3RlcHMgb2YgYSBUYXNrKSwgYnkgbWFueSBSb2xlcyB3b3JraW5nIGluIGNsb3NlIGNvbGxhYm9yYXRpb24gKG1hbnkgUm9sZXMgYWxsIHdvcmtpbmcgdG9nZXRoZXIgb24gdGhlIHNhbWUgaW50ZXJkaXNjaXBsaW5hcnkgVGFzayksIG9yIGNvbXBsZXggd29yayB0aGF0IGlzIHBlcmZvcm1lZCB0aHJvdWdob3V0IHRoZSBsaWZlY3ljbGUgKGUuZy4gYSBwcm9jZXNzIGRlZmluaW5nIGEgYnJlYWtkb3duIHN0cnVjdHVyZSBmb3Igb3JnYW5pemluZyBsYXJnZXIgY29tcG9zaXRlIHVuaXRzIG9mIHdvcmsgcGVyZm9ybWVkIGJ5IG1hbnkgUm9sZXMgd29ya2luZyBpbiBjb2xsYWJvcmF0aW9uKS4KLTwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyN0E4MkYzMDI2RSIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI4MCIvPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyN0E4N0U5MDJDRiIgbmFtZT0icHJlY29uZGl0aW9uIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MjdBODU3QjAzMzMiIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDI3QTg3RTkwMDYxIj4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3RUTUt1ZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IjEiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3RUTUtlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MjdBODgzNDAyREUiIG5hbWU9InBvc3Rjb25kaXRpb24iIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQyN0E4NTdCMDMzMyIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MjdBODgzNDAxMTAiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HdFRNTWVmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iMSIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HdFRNTU9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMzA4IiBuYW1lPSJEZWZhdWx0X1ByaW1hcnlQZXJmb3JtZXIiIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDMwOSBfM0FEQzdCNzQwMjJENDBGMzZDOTIwMzBCIj4KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3MyZ00tZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDMwOCI+Ci0gICAgICAgICAgICAgIDxib2R5PlJvbGVzIGNhbiBiZSBkZWZpbmVkIHRvIHBlcmZvcm0gbWFueSBUYXNrcywgYnV0IGV2ZXJ5IFRhc2sgbWF5IGhhdmUgb25seSBvbmUgUm9sZSB0aGF0IGlzIGJ5IGRlZmF1bHQgdGhlIHByaW1hcnkgcGVyZm9ybWVyIG9mIHRoaXMgVGFzay48L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAzMEIiIG5hbWU9InBlcmZvcm1zIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyOUUiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMzA4Ij4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3MyZ091ZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3MyZ09lZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEVuZD4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDM5RCIgbmFtZT0iRGVmYXVsdF9NYW5kYXRvcnlJbnB1dHMiIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDM5RSBfM0FEQzdCNzQwMjJENDBGMzZDOTIwM0E4Ij4KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3MyZ1BPZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDM5RCI+Ci0gICAgICAgICAgICAgIDxib2R5PlRoaXMgYXNzb2NpYXRpb24gcHJvdmlkZXMgbGlua3MgdG8gemVybyBvciBtYW55IGRlZmluaXRpb25zIG9mIFdvcmsgUHJvZHVjdHMgdGhhdCBhcmUgZGVmaW5lZCBhcyBtYW5kYXRvcnkgaW5wdXRzIGZvciBwZXJmb3JtaW5nIHRoaXMgVGFzay48L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAzOUUiIG5hbWU9Im1hbmRhdG9yeUlucHV0VG8iIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI5RSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAzOUQiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HczJnUU9mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HczJnUC1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkRW5kPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwM0JCIiBuYW1lPSJEZWZhdWx0X091dHB1dHMiIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDNCQyBfM0FEQzdCNzQwMjJENDBGMzZDOTIwM0JFIj4KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3MyZ1JlZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDNCQiI+Ci0gICAgICAgICAgICAgIDxib2R5PlRoaXMgYXNzb2NpYXRpb24gcHJvdmlkZXMgbGlua3MgdG8gemVybyBvciBtYW55IGRlZmluaXRpb25zIG9mIFdvcmsgUHJvZHVjdHMgdGhhdCBhcmUgZGVmaW5lZCBhcyBvdXRwdXRzIG9mIHRoaXMgVGFzay48L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAzQkMiIG5hbWU9Im91dHB1dEZyb20iIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI5RSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAzQkIiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HczJnU2VmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HczJnU09mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkRW5kPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDOTMwMEY1IiBuYW1lPSJEZWZhdWx0X01vZGlmaWVzIiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MzAwRjYgXzNBREM3Qjc0MDIyRDQwRjM2QzkzMDBGOCIgaXNEZXJpdmVkPSJ0cnVlIj4KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3NfcUllZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkzMDBGNSI+Ci0gICAgICAgICAgICAgIDxib2R5PlRoaXMgYXNzb2NpYXRpb24gaXMgZGVyaXZlZCBmcm9tIHRoZSBmYWN0IHRoYXQgUm9sZXMgcGVyZm9ybSBUYXNrcyB0aGF0IGhhdmUgV29yayBQcm9kdWN0cyBvZiB0aGF0IHBhcnRpY3VsYXIgdHlwZSBhcyBvdXRwdXRzLiAgL21vZGlmaWVzIHByb3ZpZGVzIGFsbCB0aGUgdHlwZXMgb2YgV29yayBQcm9kdWN0cyB0aGF0IHRoZSBSb2xlIHByb2R1Y2VzIG9yIG1vZGlmaWVzIHZpYSBvbmUgb2YgdGhlIFRhc2tzIGRlZmluZWQgdG8gYmUgcGVyZm9ybWVkIGJ5IHRoZSBSb2xlLCBlaXRoZXIgYXMgcHJpbWFyeSBvciBhZGRpdGlvbmFsIHBlcmZvcm1lci48L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MzAwRjYiIG5hbWU9Im1vZGlmaWVkQnkiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI5NiIgaXNEZXJpdmVkPSJ0cnVlIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQwRjM2QzkzMDBGNSI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0dzX3FKZWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0dzX3FKT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRFbmQ+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MzAxMDkiIG5hbWU9IkRlZmF1bHRfUmVzcG9uc2libGUiIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkzMDEwQSBfM0FEQzdCNzQwMjJENDBGMzZDOTMwMTBDIj4KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3NfcUt1ZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkzMDEwOSI+Ci0gICAgICAgICAgICAgIDxib2R5PlJlc3BvbnNpYmlsaXR5IGZvciBhIHdvcmsgcHJvZHVjdCBpbmRpY2F0ZXMgdGhlIHJvbGUncyBvd25lcnNoaXAgb2YgYWxsIGluc3RhbmNlcyBvZiB0aGlzIHdvcmsgcHJvZHVjdCB0eXBlLiAgRm9yIGV4YW1wbGUsIHRoZSByb2xlIHJlc3BvbnNpYmxlIGZvciBhIHdvcmsgcHJvZHVjdCBhbnN3ZXJzIHRvIG1hbmFnZW1lbnQgYWJvdXQgaXRzIHF1YWxpdHkgc3RhdGUuICBCZWluZyByZXNwb25zaWJsZSBmb3IgdGhlIHdvcmsgcHJvZHVjdCBkb2VzIG5vdCBtZWFuIHRoYXQgdGhlIHJvbGUgaXMgdGhlIG9ubHkgb25lIG1vZGlmeWluZyBpdCwgYnV0IG1ha2VzIHVsdGltYXRlIGRlY2lzaW9ucyBhYm91dCBhY2NlcHRpbmcgb3IgcmVqZWN0aW5nIHRoZXNlIG1vZGlmaWNhdGlvbnMgd2hlbiByZXZpZXdpbmcgdGhlc2UgbW9kaWZpY2F0aW9ucy4gIEV2ZXJ5IHdvcmsgcHJvZHVjdCBoYXMgbm9uZSBvciBvbmUgcm9sZSByZXNwb25zaWJsZSByb2xlLiA8L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MzAxMEEiIG5hbWU9InJlc3BvbnNpYmxlUm9sZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjk2IiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQwRjM2QzkzMDEwOSI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0dzX3FMdWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0dzX3FMZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRFbmQ+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTE3Q0Y1QzAxQ0MiIG5hbWU9IkRlZmF1bHRfQWRkaXRpb25hbFBlcmZvcm1lciIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDExN0NGNUQwMkZEIF8zQURDN0I3NDAyMkQ0MTE3Q0Y1RDAzNTciPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9Hc19xTS1mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDExN0NGNUMwMUNDIj4KLSAgICAgICAgICAgICAgPGJvZHk+VGhpcyBhc3NvY2lhdGlvbiBkZWZpbmVzIGFkZGl0aW9uYWwgcm9sZXMgdGhhdCBieSBkZWZhdWx0IGNhbiBiZSBhc3NpZ25lZCB0byBoZWxwIGNvbXBsZXRpbmcgYSBUYXNrLjwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxMTdDRjVEMDJGRCIgbmFtZT0iaGVscHNQZXJmb3JtaW5nIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyOUUiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDExN0NGNUMwMUNDIj4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3NfcU4tZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3NfcU51ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEVuZD4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDAxMCIgbmFtZT0iQ29tcG9zaXRpb24iIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDAxMSBfM0FEQzdCNzQwMjJENDBGMzZDOTIwMDEzIj4KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3RKYklPZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDAxMCI+Ci0gICAgICAgICAgICAgIDxib2R5PkFydGlmYWN0IHR5cGVzIGNhbiBiZSBkZWZpbmVkIHRvIGJlIHBoeXNpY2FsbHkgY29tcG9zZWQgb2Ygb3RoZXIgYXJ0aWZhY3RzLiAgRm9yIGV4YW1wbGUsIGEgdXNlIGNhc2UgbW9kZWwgaXMgY29tcG9zZWQgb2YgdXNlIGNhc2VzIGFuZCBhY3RvcnMuPC9ib2R5PgotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAwMkQiIG5hbWU9IkRlZmF1bHREZWxpdmVyZWRXUCIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMDJFIF8zQURDN0I3NDAyMkQ0MEYzNkM5MjAwMzAiPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HdEpiS2VmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMDJEIj4KLSAgICAgICAgICAgICAgPGJvZHk+VGhpcyBhc3NvY2lhdGlvbiBkZWZpbmVzIHRoZSBkZWZhdWx0IHBhcnRzIG9mIGEgZGVsaXZlcmFibGUsIGkuZS4gdGhlIHR5cGVzIG9mIHdvcmsgcHJvZHVjdHMgYSBEZWxpdmVyYWJsZSBjb21wcmlzZXMgb2YuICBUaGlzIGFnZ3JlZ2F0aW9uIGNhbiBiZSBvdmVycmlkZGVuIGluIGEgUHJvY2Vzcy48L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAwMkUiIG5hbWU9Il9kZWxpdmVyYWJsZSIgdmlzaWJpbGl0eT0icHJpdmF0ZSIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDE4NSIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDAyRCI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0d0SmJMZWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0d0SmJMT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRFbmQ+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTc3Rjg0OTAxMzEiIG5hbWU9IkRlZmF1bHRfT3B0aW9uYWxJbnB1dHMiIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQxNzdGODRBMDI1RSBfM0FEQzdCNzQwMjJENDE3N0Y4NEEwMjcyIj4KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3RKYk11ZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNzdGODQ5MDEzMSI+Ci0gICAgICAgICAgICAgIDxib2R5PlRoaXMgYXNzb2NpYXRpb24gcHJvdmlkZXMgbGlua3MgdG8gemVybyBvciBtYW55IGRlZmluaXRpb25zIG9mIFdvcmsgUHJvZHVjdHMgdGhhdCBhcmUgZGVmaW5lZCBhcyBvcHRpb25hbCBpbnB1dHMgZm9yIHBlcmZvcm1pbmcgdGhpcyBUYXNrLjwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxNzdGODRBMDI3MiIgbmFtZT0ib3B0aW9uYWxJbnB1dFRvIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyOUUiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDE3N0Y4NDkwMTMxIj4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3RKYk9lZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3RKYk9PZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEVuZD4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyNzk2MkQzMDAzRiIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDI3OTYyRDQwMjAzIF8zQURDN0I3NDAyMkQ0Mjc5NjJENDAyMEUiIGlzRGVyaXZlZD0idHJ1ZSI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0d0SmJPLWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjc5NjJEMzAwM0YiPgotICAgICAgICAgICAgICA8Ym9keT5UaGlzIGRlcml2ZWQgYXNzb2NpYXRpb24gaXMgYSBzaG9ydGN1dCBmb3IgbmF2aWdhdGlvbiBhbG9uZyB0aGUgYXNzb2NpYXRpb24gcHJvcGVydGllcyBDb250ZW50RWxlbWVudC5wcmVzZW50YXRpb24uc2VjdGlvbnMuPC9ib2R5PgotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICA8b3duZWRFbmQgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDI3OTYyRDQwMjBFIiBuYW1lPSJfdGFzayIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjlFIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDI3OTYyRDMwMDNGIi8+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MjdBODdFOTAwNjEiIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQyN0E4N0U5MDJDRiBfM0FEQzdCNzQwMjJENDI3QTg3RTkwMkQ5Ij4KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3RUTUp1ZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E4N0U5MDA2MSI+Ci0gICAgICAgICAgICAgIDxib2R5PlRoaXMgY29tcG9zaXRpb24gYXNzb2NpYXRpb24gYWRkcyBhbiBvcHRpb25hbCBwcmUtY29uZGl0aW9uIHRvIGEgV29yayBEZWZpbml0aW9uLiAgQSBwcmUtY29uZGl0aW9uIGRlZmluZXMgYW55IGtpbmQgb2YgY29uc3RyYWludCB0aGF0IG11c3QgZXZhbHVhdGUgdG8gdHJ1ZSBiZWZvcmUgdGhlIHdvcmsgZGVzY3JpYmVkIGZvciB0aGUgV29yayBEZWZpbml0aW9uIGNhbiBzdGFydC4gRm9yIGV4YW1wbGUsIGEgcHJlLWNvbmRpdGlvbiBmb3IgYSBUYXNrIGNvdWxkIGRlZmluZSB0aGF0IGFuIGlucHV0IFdvcmsgUHJvZHVjdCBuZWVkcyB0byBiZSBpbiBhIHNwZWNpZmljIHN0YXRlIG9yIHRoYXQgb3RoZXIgcmVsYXRlZCB3b3JrIG11c3QgYmUgaW4gYSBjZXJ0YWluIHN0YXRlIChlLmcuICdJbnB1dCBkb2N1bWVudCBYIGhhcyBiZWVuIHJldmlld2VkIGFuZCBzaWduZWQgYnkgY3VzdG9tZXIgQU5EIFRhc2sgJnF1b3Q7TWFuYWdlbWVudCBSZXZpZXcmcXVvdDsgaXMgY29tcGxldGUnKSBiZWZvcmUgdGhlIFRhc2sgY2FuIGJlZ2luLgotPC9ib2R5PgotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICA8b3duZWRFbmQgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDI3QTg3RTkwMkQ5IiBuYW1lPSJfd29ya0RlZmluaXRpb24iIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQyN0E4MkQzMDE3RiIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQyN0E4N0U5MDA2MSIvPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDI3QTg4MzQwMTEwIiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0MjdBODgzNDAyREUgXzNBREM3Qjc0MDIyRDQyN0E4ODM0MDJFOCI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0d0VE1MZWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBODgzNDAxMTAiPgotICAgICAgICAgICAgICA8Ym9keT5UaGlzIGNvbXBvc2l0aW9uIGFzc29jaWF0aW9uIGFkZHMgYW4gb3B0aW9uYWwgcG9zdC1jb25kaXRpb24gdG8gYSBXb3JrIERlZmluaXRpb24uICBBIHBvc3QtY29uZGl0aW9uIGRlZmluZXMgYW55IGtpbmQgb2YgY29uc3RyYWludCB0aGF0IG11c3QgZXZhbHVhdGUgdG8gdHJ1ZSBiZWZvcmUgdGhlIHdvcmsgZGVzY3JpYmVkIGZvciB0aGUgV29yayBEZWZpbml0aW9uIGNhbiBiZSBkZWNsYXJlZCBjb21wbGV0ZWQgb3IgZmluaXNoZWQgYW5kIHdoaWNoIG90aGVyIFdvcmsgRGVmaW5pdGlvbnMgbWlnaHQgZGVwZW5kIHVwb24gKGUuZy4gZm9yIHRoZWlyIHByZS1jb25kaXRpb25zKS4gIEZvciBleGFtcGxlLCBhIHBvc3QtY29uZGl0aW9uIGZvciBhIFRhc2sgY291bGQgZGVmaW5lIHRoYXQgYSB3b3JrIHByb2R1Y3QgZGVmaW5lZCB0byBiZSB0aGUgb3V0cHV0IG11c3QgYmUgaW4gYSBzcGVjaWZpYyBzdGF0ZSBiZWZvcmUgdGhlIFRhc2sgY2FuIGVuZCAoZS5nLiAnVXNlIENhc2UgbXVzdCBiZSBpbiBzdGF0ZSBmdWxseSBkZXNjcmliZWQgYW5kIHJldmlld2VkIGJ5IFN5c3RlbSBBbmFseXN0JykuPC9ib2R5PgotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICA8b3duZWRFbmQgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDI3QTg4MzQwMkU4IiBuYW1lPSJfd29ya0RlZmluaXRpb24iIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQyN0E4MkQzMDE3RiIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQyN0E4ODM0MDExMCIvPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOlBhY2thZ2UiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxREU0NzhFMDAwRCIgbmFtZT0iTWV0aG9kUGFja2FnZSI+Ci0gICAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il9HdDVDQi1mWEVkdXFIb09KYlVSWlJ3IiBzb3VyY2U9InVtbDIuZGlhZ3JhbXMiIHJlZmVyZW5jZXM9Il8zQURDN0I3NDAyMkQ0MUUwOTlCODAwMDkiPgotICAgICAgICAgICAgPGNvbnRlbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpEaWFncmFtIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MUUwOTlCODAwMDkiIHR5cGU9IkNsYXNzIiBuYW1lPSJTdHJ1Y3R1cmUiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdvU1Z1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDEzRiI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHb1NXZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hHb1NXdWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR29TVy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHb1NYT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdvU1hlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHb1NYdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IR29TWC1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdvU1lPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IR29TWWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdvU1l1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IR29TWS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdvU1pPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEdvU1plZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEdvU1YtZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IR29TV09mWEVkdXFIb09KYlVSWlJ3IiB4PSI2NDMiIHk9IjE3MTgiIHdpZHRoPSI0NzE1IiBoZWlnaHQ9IjI5NjMiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHeGNOZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxMkIiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR3hjT09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IR3hjT2VmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEd4Y091ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR3hjTy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHeGNQT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR3hjUGVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hHeGNQdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR3hjUC1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hHeGNRT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR3hjUWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hHeGNRdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR3hjUS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IR3hjUk9mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IR3hjTnVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hHeGNOLWZYRWR1cUhvT0piVVJaUnciIHg9IjkxNSIgeT0iNzQ0MiIgd2lkdGg9IjM1OTYiIGhlaWdodD0iMjQzMSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEd4Y1R1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI2QyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHeGNVZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hHeGNVdWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIzMzUyIiBoZWlnaHQ9IjEwMzIiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR3hjVS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHeGNWT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEd4Y1ZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHeGNWdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEd4Y1YtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHeGNXT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEd4Y1dlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHeGNXdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEd4Y1ctZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHeGNYT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hHeGNYZWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hHeGNULWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dQYXJlbnQ9Ik5hbWUiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEd4Y1VPZlhFZHVxSG9PSmJVUlpSdyIgeD0iNzk3NSIgeT0iNzg1MCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxEaWFncmFtU3R5bGUiIHhtaTppZD0iX0d0NUNDZWZYRWR1cUhvT0piVVJaUnciIGRlc2NyaXB0aW9uPSJNZXRob2QgUGFja2FnZSBpcyBkZWZpbmVkIGFzIGFuIGFic3RyYWN0IGNsYXNzLiAgSXRzIHNwZWNpYWxpemF0aW9uLCBDb250ZW50IFBhY2thZ2UsIGRlZmluZXMgdGhlIHJlZGVmaW5pdGlvbiBvZiB0aGUgVU1MIHBhY2thZ2UgdG8gY29udGFpbiBvbmx5IENvbnRlbnQgRWxlbWVudHMuICBNZXRob2QgUGFja2FnZXMgY2FuIGJlIGRlZmluZWQgYXMgZ2xvYmFsIChpLmUuIGFueSBlbGVtZW50IGluIGFueSBvdGhlciBwYWNrYWdlIGNhbiBhY2Nlc3MgaXRzIGNvbnRlbnRzKS4gIFRoZXkgY2FuIGJlIG5lc3RlZCBhcyB3ZWxsIGFzIGRlZmluZSBkZXBlbmRlbmNpZXMgdG8gb3RoZXIgcGFja2FnZXMgKHZpYSB0aGUgcmV1c2VkUGFja2FnZXMgYXNzb2NpYXRpb24pLiIvPgotICAgICAgICAgICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IR29TWnVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjEwMDQ5IiBzb3VyY2U9Il9IR29TVnVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IR29TVnVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdvU2FlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR29TYS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdvU2JPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hHb1NhdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR29TYmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjEwMDRDIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR29TYi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IR29TYnVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxMTU1IiB5PSItMzExIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdvU2NPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MTAwNEMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHb1NjdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IR29TY2VmWEVkdXFIb09KYlVSWlJ3IiB4PSItNjQ4IiB5PSItMzIzIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdvU2MtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjEwMDRBIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR29TZGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hHb1NkT2ZYRWR1cUhvT0piVVJaUnciIHg9Ii0xNDcyIiB5PSIyMTIiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR29TZHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjEwMDRBIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR29TZU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IR29TZC1mWEVkdXFIb09KYlVSWlJ3IiB4PSItMzE0IiB5PSItMzk4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdvU2VlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYxMDA0QyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdvU2UtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEdvU2ZPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEdvU2V1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHb1NmZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYxMDA0QSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdvU2YtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEdvU2dPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEdvU2Z1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHb1NnZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjEwMDRDIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR29TZy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IR29TaE9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IR29TZ3VmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdvU2hlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYxMDA0QSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEd4Y0VPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IR3hjRWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IR29TaHVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEdvU1otZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IR29TYU9mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlsyMzUzLCAtNTY3LCAyMzUzLCAtNTY3XSRbNjIxNCwgLTU2NywgNjIxNCwgLTU2N10kWzYyMTQsIC0yMzI4LCA2MjE0LCAtMjMyOF0kWzEzMTIsIC0yMzI4LCAxMzEyLCAtMjMyOF0kWzEzMTIsIC0xNDgxLCAxMzEyLCAtMTQ4MV0iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hHeGNFdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MTAwMzUiIHNvdXJjZT0iX0hHb1NWdWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hHb1NWdWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR3hjRmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHeGNGLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR3hjR09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IR3hjRnVmWEVkdXFIb09KYlVSWlJ3IiB4PSIyOTciIHk9IjE1MDMiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR3hjR2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjEwMDM4Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR3hjRy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IR3hjR3VmWEVkdXFIb09KYlVSWlJ3IiB4PSI2OTciIHk9IjYyNyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHeGNIT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjEwMDM4Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR3hjSHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEd4Y0hlZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTcyNSIgeT0iMzU2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEd4Y0gtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjEwMDM2Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR3hjSWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hHeGNJT2ZYRWR1cUhvT0piVVJaUnciIHg9Ii05MTciIHk9IjI4MCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHeGNJdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjEwMDM2Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR3hjSk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IR3hjSS1mWEVkdXFIb09KYlVSWlJ3IiB4PSIxNDAiIHk9IjEzODgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR3hjSmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjEwMDM4Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR3hjSi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IR3hjS09mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IR3hjSnVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEd4Y0tlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjEwMDM2Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR3hjSy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IR3hjTE9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IR3hjS3VmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEd4Y0xlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MTAwMzgiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHeGNMLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hHeGNNT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hHeGNMdWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR3hjTWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjEwMDM2Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR3hjTS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hHeGNOT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hHeGNNdWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IR3hjRS1mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hHeGNGT2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzIzNTMsIDYwOSwgMjM1MywgNjA5XSRbNjE4MCwgNjA5LCA2MTgwLCA2MDldJFs2MTgwLCAyODAyLCA2MTgwLCAyODAyXSRbMTQ3MywgMjgwMiwgMTQ3MywgMjgwMl0kWzE0NzMsIDE0ODEsIDE0NzMsIDE0ODFdIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IR3hjUmVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwM0FGIiBzb3VyY2U9Il9IR3hjTmVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IR29TVnVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEd4Y1NPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR3hjU3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEd4Y1MtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hHeGNTZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IR3hjUnVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hHeGNSLWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0xNDMsIC0xMzk3LCAtMjQ1LCA0MjQxXSRbLTE0MywgLTQxNTcsIC0yNDUsIDE0ODFdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hHeGNUT2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IR3hjVGVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hHeGNYdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUUwQzAxMTAwMEIiIHNvdXJjZT0iX0hHeGNOZWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hHeGNUdWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR3hjWWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHeGNZLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR3hjWk9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEd4Y1l1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHeGNaZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUUwQzAxMTAwMEQiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHeGNaLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hHeGNadWZYRWR1cUhvT0piVVJaUnciIHg9IjIyOCIgeT0iMzIzIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEd4Y2FPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFMEMwMTEwMDBEIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR3hjYXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEd4Y2FlZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTE2NiIgeT0iLTM0OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHeGNhLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRTBDMDExMDAwQyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEd4Y2JlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IR3hjYk9mWEVkdXFIb09KYlVSWlJ3IiB4PSItOCIgeT0iMjk3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEd4Y2J1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRTBDMDExMDAwQyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEd4Y2NPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEd4Y2ItZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTk1MSIgeT0iLTI1NSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHeGNjZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUUwQzAxMTAwMEQiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHeGNjLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hHeGNkT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hHeGNjdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR3hjZGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUUwQzAxMTAwMEMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHeGNkLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hHeGNlT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hHeGNkdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR3hjZWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRTBDMDExMDAwRCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEd4Y2UtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEd4Y2ZPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEd4Y2V1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHeGNmZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUUwQzAxMTAwMEMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHeGNmLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEd4Y2dPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEd4Y2Z1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hHeGNYLWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEd4Y1lPZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMTYwOCwgLTEzNSwgLTUxNDcsIC0zM10kWzUwODAsIC0xMzUsIC0xNjc2LCAtMzNdIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICA8L2NvbnRlbnRzPgotICAgICAgICAgICAgPGNvbnRlbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpEaWFncmFtIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MjM2MEU3MjAwMzciIHR5cGU9IkNsYXNzIiBuYW1lPSJUYXhvbm9teSI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR3hjZ2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOb3RlIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEd4Y2hPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRGlhZ3JhbU5hbWUiPgotICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHeGNoZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkRlc2NyaXB0aW9uIj4KLSAgICAgICAgICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOlNoYXBlU3R5bGUiIHhtaTppZD0iX0hHeGNndWZYRWR1cUhvT0piVVJaUnciIGRlc2NyaXB0aW9uPSJVTUwyIEluZnJhc3RydWN0dXJlIiBsaW5lQ29sb3I9IjQxOTQzNjgiLz4KLSAgICAgICAgICAgICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEd4Y2ctZlhFZHVxSG9PSmJVUlpSdyIgeD0iMjAxNSIgeT0iNjAxIiB3aWR0aD0iNzA0NCIgaGVpZ2h0PSI4MTQ0Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR3hjaHVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFEREUwNjIwMkQ1Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEd4Y2llZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEd4Y2l1ZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjI4MjciIGhlaWdodD0iMTU0MCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHN05FT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEc3TkVlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRzdORXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEc3TkUtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hHN05GT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRzdORmVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hHN05GdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRzdORi1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hHN05HT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRzdOR2VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRzdOR3VmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IR3hjaC1mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9Ik5vbmUiIHNob3dMaXN0VmlzaWJpbGl0eT0iTm9uZSIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hHeGNpT2ZYRWR1cUhvT0piVVJaUnciIHg9IjMzNjEiIHk9IjEzNjMiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHN05HLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURERkEzNjAyQzEiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRzdOSHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IRzdOSC1mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMjU3MyIgaGVpZ2h0PSIxMDQ5Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEc3TklPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRzdOSWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHN05JdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRzdOSS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hHN05KT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRzdOSmVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hHN05KdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRzdOSi1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hHN05LT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRzdOS2VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRzdOS3VmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IRzdOSE9mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9Ik5vbmUiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hHN05IZWZYRWR1cUhvT0piVVJaUnciIHg9IjU1OTQiIHk9IjYxMTgiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHN05LLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURERTgzMzAxQTUiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRzdOTHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IRzdOTC1mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iNDM2OCIgaGVpZ2h0PSIxMDMyIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEc3Tk1PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRzdOTWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHN05NdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRzdOTS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hHN05OT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRzdOTmVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hHN05OdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRzdOTi1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hHN05PT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRzdOT2VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRzdOT3VmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IRzdOTE9mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9Ik5vbmUiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hHN05MZWZYRWR1cUhvT0piVVJaUnciIHg9IjI2OTIiIHk9IjQzNjAiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHN05PLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyODAiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRzdOUHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IRzdOUC1mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMzMwMiIgaGVpZ2h0PSIxMDQ5Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEc3TlFPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRzdOUWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHN05RdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRzdOUS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hHN05ST2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRzdOUmVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hHN05SdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRzdOUi1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hHN05TT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRzdOU2VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRzdOU3VmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IRzdOUE9mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9Ik5vbmUiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hHN05QZWZYRWR1cUhvT0piVVJaUnciIHg9IjIxNTkiIHk9IjkyMjgiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHN05adWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxM0YiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRzdOYWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IRzdOYXVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMzUyMiIgaGVpZ2h0PSI5MDUiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRzdOYS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHN05iT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEc3TmJlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHN05idWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEc3TmItZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHN05jT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEc3TmNlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHN05jdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEc3TmMtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHN05kT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hHN05kZWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hHN05aLWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iTm9uZSIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEc3TmFPZlhFZHVxSG9PSmJVUlpSdyIgeD0iMzk3OSIgeT0iMTE1NDAiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHN05pT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxMkIiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRzdOaS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IRzdOak9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMzQ1NCIgaGVpZ2h0PSI5MDUiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRzdOamVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHN05qdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEc3TmotZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHN05rT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEc3TmtlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHN05rdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEc3TmstZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHN05sT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEc3TmxlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHN05sdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hHN05sLWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hHN05pZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iTm9uZSIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEc3Tml1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iNDAxMyIgeT0iMTM0NzAiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MRGlhZ3JhbVN0eWxlIiB4bWk6aWQ9Il9HdDVDQy1mWEVkdXFIb09KYlVSWlJ3IiBkZXNjcmlwdGlvbj0iVGhlIE1ldGhvZCBQYWNrYWdlIHBhY2thZ2UgZGVmaW5lcyBob3cgdGhlIG1ldGhvZCBlbGVtZW50cyBjYW4gYmUgcGh5c2ljYWxseSBvcmdhbml6ZWQgaW4gcGFja2FnZSBoaWVyYXJjaGllcy4gIEl0IHJldXNlZCB0aGUgcGFja2FnZSBjb25jZXB0IGZyb20gdGhlIFVNTCAyLjAgSW5mcmFzdHJ1Y3R1cmUgTGlicmFyeSwgYnV0IHJlZGVmaW5lcyBpdCB0byByZXN0cmljdCBDb250ZW50IFBhY2thZ2VzIHRvIG9ubHkgY29udGFpbiBDb250ZW50IEVsZW1lbnRzIGFuZCBub3QgYW55IFBhY2thZ2VhYmxlIEVsZW1lbnRzIChUQkQ6IHVwZGF0ZSBkaWFncmFtIHdpdGgge3JlZGVmaW5lc30gY29uc3RyYWludCEpLiBUaGUgZGlhZ3JhbSBzaG93cyB0aGUgb3ZlcmFsbCB0YXhvbm9teSBpcyB3aGljaCBNZXRob2QgUGFja2FnZSBpcyBkZWZpbmVkIGFzIGFuIGFic3RyYWN0IGNsYXNzLiAiLz4KLSAgICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEc3TlMtZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRERGQkNGMDJBOSIgc291cmNlPSJfSEc3TkctZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEc3TkstZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHN05UdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEc3TlVPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHN05VZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRzdOVC1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEc3TlRPZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IRzdOVGVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstOTc5LCAtNzksIDk3OSwgMTk1OF0kWy0xOTg1LCAtNzksIC0yNywgMTk1OF0kWy0xOTg1LCAtMTcxOSwgLTI3LCAzMThdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hHN05VdWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRzdOVS1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hHN05WT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURERjhENDAyMTEiIHNvdXJjZT0iX0hHN05LLWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hHeGNodWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRzdOVi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHN05XZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRzdOV3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEc3TldPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hHN05WZWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEc3TlZ1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTg0LCAtNTE2LCAxNiwgMjIyNl0kWy04NCwgLTE5NzIsIDE2LCA3NzBdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hHN05XLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRzdOWE9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hHN05YZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUVDMzM0RjAxOTgiIHNvdXJjZT0iX0hHN05PLWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hHN05LLWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRzdOWU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHN05ZdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRzdOWS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEc3TlllZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hHN05YdWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEc3TlgtZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbNTAsIC01MjQsIC0xMDE2LCA0MzUxXSRbNTAsIC00MzYwLCAtMTAxNiwgNTE2XSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRzdOWk9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEc3TlplZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IRzdOZHVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFMENDMEEwMUQ3IiBzb3VyY2U9Il9IRzdOWnVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IRzdORy1mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEc3TmVlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRzdOZS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEc3TmZPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hHN05ldWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IRzdOZC1mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hHN05lT2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzc3OCwgLTQ0OCwgLTM4OSwgNDYzMV0kWzc3OCwgLTQ1NjMsIC0zODksIDUxNl0iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEc3TmZlZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hHN05mdWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEc3TmYtZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRkFENUY4MDM4RSIgc291cmNlPSJfSEc3Tlp1ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEc3Tk8tZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHN05ndWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEc3TmhPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHN05oZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRzdOZy1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEc3TmdPZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IRzdOZ2VmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMTAwNywgLTQ0OCwgOTIyLCAxNzg2XSRbLTEwMDcsIC0xNzE4LCA5MjIsIDUxNl0iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEc3Tmh1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hHN05oLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEc3Tm1PZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDNBRiIgc291cmNlPSJfSEc3TmlPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEc3Tlp1ZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHN05tLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEc3Tm5lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHN05udWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRzdObk9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEc3Tm1lZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IRzdObXVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlswLCAtNDQ4LCAwLCAxNDgxXSRbMCwgLTE0ODEsIDAsIDQ0OF0iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEc3Tm4tZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hHN05vT2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgPC9jb250ZW50cz4KLSAgICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0d0bUhFLWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURFNDc4RTAwMEQiPgotICAgICAgICAgICAgPGJvZHk+MDU8L2JvZHk+Ci0gICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VNZXJnZSB4bWk6aWQ9Il9SS0VEWU94Z0VkdUhqZTNwUGFoTjRBIiBtZXJnZWRQYWNrYWdlPSJfM0FEQzdCNzQwMjJENDFERTQ5RUEwMUUyIi8+Ci0gICAgICAgICAgPHBhY2thZ2VNZXJnZSB4bWk6aWQ9Il9ScUdPVU94Z0VkdUhqZTNwUGFoTjRBIiBtZXJnZWRQYWNrYWdlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjI1Ii8+Ci0gICAgICAgICAgPHBhY2thZ2VNZXJnZSB4bWk6aWQ9Il9TTFZUSU94Z0VkdUhqZTNwUGFoTjRBIiBtZXJnZWRQYWNrYWdlPSJfM0FEQzdCNzQwMjJENDJEREUyODAwMjVEIi8+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxM0YiIG5hbWU9Ik1ldGhvZFBhY2thZ2UiIGlzQWJzdHJhY3Q9InRydWUiPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HdG1IRy1mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMTNGIj4KLSAgICAgICAgICAgICAgPGJvZHk+QSBNZXRob2QgUGFja2FnZSBpcyBhbiBhYnN0cmFjdCBjbGFzcyBmb3IgcGFja2FnaW5nIE1ldGhvZCBFbGVtZW50cy4gIEFsbCBNZXRob2QgRWxlbWVudHMgc2hhbGwgYmUgbG9jYXRlZCBpbiBleGFjdGx5IG9uZSBvZiBNZXRob2QgUGFja2FnZSdzIGNvbmNyZXRlIHNwZWNpYWxpemF0aW9ucyAoZS5nLiBDb250ZW50IFBhY2thZ2UpLiAgIE1ldGhvZCBQYWNrYWdlIGRlZmluZXMgY29tbW9uIHByb3BlcnRpZXMgZm9yIGFsbCBvZiBpdHMgc3BlY2lhbGl6YXRpb25zLiBFbGVtZW50cyBhcmUgb3JnYW5pemVkIGluIE1ldGhvZCBQYWNrYWdlcyB0byBzdHJ1Y3R1cmUgbGFyZ2Ugc2NhbGUgb2YgbWV0aG9kIGNvbnRlbnQgYW5kIHByb2Nlc3NlcyBhcyB3ZWxsIGFzIHRvIGRlZmluZSBhIG1lY2hhbmlzbSBmb3IgcmV1c2UuICBNZXRob2QgRWxlbWVudHMgZnJvbSBvbmUgcGFja2FnZSBjYW4gcmV1c2UgZWxlbWVudCBmcm9tIG90aGVyIHBhY2thZ2VzIGJ5IGRlZmluaW5nIGEgcmV1c2VkUGFja2FnZXMgbGluay4gIEZvciBleGFtcGxlLCBhIHdvcmsgcHJvZHVjdCBkZWZpbmVkIGluIG9uZSBwYWNrYWdlIGNhbiBiZSB1c2VkIGFzIGFuIGlucHV0IGZvciBUYXNrcyBkZWZpbmVkIGluIG90aGVyIHBhY2thZ2VzLiAgQnkgcmV1c2luZyBpdCBmcm9tIG9uZSBjb21tb24gcGxhY2UgKGkuZS4gdGhlIHBhY2thZ2UgaW4gd2hpY2ggaXQgaGFzIGJlZW4gZGVmaW5lZCkgZW5zdXJlcyB0aGF0IG5vIHJlZHVuZGFudCBkZWZpbml0aW9ucyBvZiB0aGUgc2FtZSBlbGVtZW50cyBhcmUgcmVxdWlyZWQuICBBbHNvIG1haW50ZW5hbmNlIG9mIG1ldGhvZCBjb250ZW50IGlzIGdyZWF0bHkgaW1wcm92ZWQgYXMgY2hhbmdlcyBjYW4gYmUgcGVyZm9ybWVkIGluIG9ubHkgb25lIHBsYWNlLiAgTm90ZSwgdGhhdCBvdGhlciBwYWNrYWdlcyB3aWxsIGludHJvZHVjZSBtb3JlIHNwZWNpYWxpemF0aW9ucyBvZiBNZXRob2QgUGFja2FnZSwgZS5nLiBQcm9jZXNzIFBhY2thZ2UgYW5kIFByb2Nlc3MgQ29tcG9uZW50LjwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxRTBDQzBBMDFENyIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQxRERGQTM2MDJDMSIvPgotICAgICAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxRkFENUY4MDM4RSIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI4MCIvPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxMkZBODU0MDMwRSIgbmFtZT0iZ2xvYmFsIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il81R2NZQU9pZUVkdVFidVk2VXdNU1FnIj4KLSAgICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HdG1ISU9mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDEyRkE4NTQwMzBFIj4KLSAgICAgICAgICAgICAgICA8Ym9keT5NZXRob2QgUGFja2FnZXMgY2FuIGhhdmUgYSBnbG9iYWwgc2NvcGUuICBUaGlzIG1lYW5zIHRoYXQgZXZlcnkgZWxlbWVudCBvZiBldmVyeSBvdGhlciBNZXRob2QgUGFja2FnZSBjYW4gc2VlIHRoZSBnbG9iYWwgcGFja2FnZSdzIGNvbnRlbnRzLiAgR2xvYmFsIE1ldGhvZCBQYWNrYWdlcyBhcmUgcHJpbWFyaWx5IHVzZWQgdG8gc3RvcmUgY29tbW9ubHkgdXNlZCBjYXRlZ29yeSBkZWZpbml0aW9ucyBzdWNoIGFzIGZvciBEaXNjaXBsaW5lcyBvciBEb21haW5zLCB3aGljaCBhcmUgdXNlZCBieSBtYW55IFRhc2sgYW5kIFdvcmsgUHJvZHVjdHMgcmVzcGVjdGl2ZWx5LjwvYm9keT4KLSAgICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9Il9HdG1ISXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJfNUdjWUFPaWVFZHVRYnVZNlV3TVNRZyI+Ci0gICAgICAgICAgICAgICAgPGJvZHk+ZmFsc2U8L2JvZHk+Ci0gICAgICAgICAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MTAwNEMiIG5hbWU9InJldXNlZFBhY2thZ2VzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxM0YiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDBGMzZDNjEwMDQ5Ij4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3R2UkUtZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3R2UkV1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MTAwMzgiIG5hbWU9ImNoaWxkUGFja2FnZXMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDEzRiIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MEYzNkM2MTAwMzUiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HdDVDQnVmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HdDVDQmVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMTJCIiBuYW1lPSJDb250ZW50UGFja2FnZSI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0d0bUhKT2ZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxMkIiPgotICAgICAgICAgICAgICA8Ym9keT5BIENvbnRlbnQgUGFja2FnZSBpcyBzcGVjaWFsIE1ldGhvZCBQYWNrYWdlIHRoYXQgY29udGFpbnMgQ29udGVudCBFbGVtZW50cyBhbmQgQ29udGVudCBFbGVtZW50cywgb25seS4gIEV4YW1wbGVzIGZvciBDb250ZW50IEVsZW1lbnQgYXJlIEFydGlmYWN0cywgVGFza3MsIFJvbGVzLCBldGMuICBBIGtleSBzZXBhcmF0aW9uIG9mIGNvbmNlcm5zIGluIFVNQSBpcyB0aGUgZGlzdGluY3Rpb24gYmV0d2VlbiBNZXRob2QgQ29udGVudCBhbmQgUHJvY2Vzcy4gIFRoaXMgc2VwYXJhdGlvbiBpcyBlbmZvcmNlZCBieSBzcGVjaWFsIHBhY2thZ2UgdHlwZXMsIHdoaWNoIGRvIG5vdCBhbGxvdyB0aGUgbWl4aW5nIG9mIG1ldGhvZCBjb250ZW50IHdpdGggcHJvY2Vzc2VzLjwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDNBRiIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDEzRiIvPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxRTBDMDExMDAwQyIgbmFtZT0iY29udGVudEVsZW1lbnRzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyNkMiIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDFFMEMwMTEwMDBCIj4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3R2UkItZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3R2UkJ1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxRTBDMDExMDAwQiIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDFFMEMwMTEwMDBDIF8zQURDN0I3NDAyMkQ0MUUwQzAxMTAwMEQiPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HdHZSQS1mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFMEMwMTEwMDBCIj4KLSAgICAgICAgICAgICAgPGJvZHk+QSBDb250ZW50IFBhY2thZ2UgY29udGFpbnMgQ29udGVudCBFbGVtZW50cy4gIEEgQ29udGVudCBFbGVtZW50IGluc3RhbmNlIGNhbiBiZSBwYXJ0IG9mIG9ubHkgb25lIHBhY2thZ2UgaW5zdGFuY2UuPC9ib2R5PgotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICA8b3duZWRFbmQgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDFFMEMwMTEwMDBEIiBuYW1lPSJfY29udGVudFBhY2thZ2UiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDEyQiIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQxRTBDMDExMDAwQiI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0d0dlJDdWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0d0dlJDZWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgICA8L293bmVkRW5kPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNjEwMDQ5IiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MTAwNEEgXzNBREM3Qjc0MDIyRDQwRjM2QzYxMDA0QyI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0d0dlJET2ZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MTAwNDkiPgotICAgICAgICAgICAgICA8Ym9keT5UaGlzIGFzc29jaWF0aW9uIGRlc2NyaWJlcyBhIGRlcGVuZGVuY3kgYmV0d2VlbiB0aGUgdHdvIHBhY2thZ2VzIGl0IGNvbm5lY3RzLiAgVGhlIHBhY2thZ2UgYXQgdGhlIHVzaW5nUGFja2FnZSBlbmQgZGVwZW5kcyBvbiB0aGUgcGFja2FnZSBhdCB0aGUgcmV1c2VkUGFja2FnZSBlbmQuICBGb3IgZXhhbXBsZSwgYW4gZWxlbWVudCBpbiB0aGUgZm9ybWVyIHBhY2thZ2UgaXMgdXNpbmcgYW4gZWxlbWVudCBpbiB0aGUgbGF0ZXIgaW4gYSByZWxhdGlvbnNoaXAgc3VjaCBhcyBhIFRhc2sgaXMgdXNpbmcgYSBXb3JrIFByb2R1Y3RzIGFzIGFuIGlucHV0LiAgUmVmbGV4aXZlIHJldXNlZFBhY2thZ2UgbGlua3MgKGkuZS4gYSBwYWNrYWdlIHRoYXQgZGVwZW5kcyBvbiBpdHNlbGYpIGFyZSBub3QgYWxsb3dlZC48L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MTAwNEEiIG5hbWU9InVzaW5nUGFja2FnZXMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDEzRiIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MEYzNkM2MTAwNDkiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HdHZSRU9mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HdHZSRC1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkRW5kPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNjEwMDM1IiBuYW1lPSJQYWNrYWdlTmVzdGluZyIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDBGMzZDNjEwMDM2IF8zQURDN0I3NDAyMkQ0MEYzNkM2MTAwMzgiPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HdHZSRmVmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjEwMDM1Ij4KLSAgICAgICAgICAgICAgPGJvZHk+TWV0aG9kIFBhY2thZ2VzIGNhbiBiZSBuZXN0ZWQsIGkuZS4gYSBwYWNrYWdlIGNhbiBiZSBwYXJ0IG9mIGFub3RoZXIgcGFja2FnZS4gIE5lc3RlZCBwYWNrYWdlcyBkbyBub3QgbmVlZCB0byBiZSBvZiB0aGUgc2FtZSB0eXBlLCBlLmcuIGEgQ29udGVudCBQYWNrYWdlIGNhbiBiZSBkZWZpbmVkIGluc2lkZSBhIFByb2Nlc3MgUGFja2FnZSAoZGVmaW5lIGZvciB0aGUgUHJvY2VzcyBwYXJ0IG9mIHRoaXMgbW9kZWwpLjwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYxMDAzNiIgbmFtZT0iX21ldGhvZFBhY2thZ2UiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDEzRiIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQwRjM2QzYxMDAzNSI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0d0NUNBLWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0d0NUNBdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRFbmQ+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6UGFja2FnZSIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDFERTQ5RUEwMUUyIiBuYW1lPSJNZXRob2RDb3JlRGVzY3JpcHRpb25zIj4KLSAgICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iX0d1eVo0ZWZYRWR1cUhvT0piVVJaUnciIHNvdXJjZT0idW1sMi5kaWFncmFtcyIgcmVmZXJlbmNlcz0iXzNBREM3Qjc0MDIyRDQxREU0QUI0MDA5OCI+Ci0gICAgICAgICAgICA8Y29udGVudHMgeG1pOnR5cGU9Im5vdGF0aW9uOkRpYWdyYW0iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxREU0QUI0MDA5OCIgdHlwZT0iQ2xhc3MiIG5hbWU9Ik1haW4iPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhFLUVPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREU1MjIxMDFEMiI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIRS1FLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hIRS1GT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSI0NzU4IiBoZWlnaHQ9IjI0MjEiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISEUtRmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIRS1GdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhFLUYtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIRS1HT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISEUtR2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhFLUd1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISEUtRy1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhFLUhPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISEUtSGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhFLUh1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEhFLUgtZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEhFLUVlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJOb25lIiBzaG93TGlzdFZpc2liaWxpdHk9Ik5vbmUiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISEUtRXVmWEVkdXFIb09KYlVSWlJ3IiB4PSI2NDYwIiB5PSIxNjMxNSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhFLUlPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREU1MjVDMDEzNyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIRS1JLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hIRS1KT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSI0NDAyIiBoZWlnaHQ9IjE1NzQiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISEUtSmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIRS1KdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhFLUotZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIRS1LT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISEUtS2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhFLUt1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISEUtSy1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhFLUxPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISEUtTGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhFLUx1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEhFLUwtZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEhFLUllZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJOb25lIiBzaG93TGlzdFZpc2liaWxpdHk9Ik5vbmUiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISEUtSXVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxODYyIiB5PSIxNjI4MSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhFLU1PZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREYzNjM2MDEwOSI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIRS1NLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hIRS1OT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIzOTI4IiBoZWlnaHQ9IjMyNjgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISEUtTmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIRS1OdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhFLU4tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIRS1PT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISEUtT2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhFLU91ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISEUtTy1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhFLVBPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISEUtUGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhFLVB1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEhFLVAtZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEhFLU1lZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJOb25lIiBzaG93TGlzdFZpc2liaWxpdHk9Ik5vbmUiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISEUtTXVmWEVkdXFIb09KYlVSWlJ3IiB4PSIyMjE2NSIgeT0iMTI5NDUiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIRS1RT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURFNTMxOTAzNTAiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISEUtUS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9ISEUtUk9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iNDk5NSIgaGVpZ2h0PSIxOTk4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhFLVJlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISEUtUnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIRS1SLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISEUtU09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEhFLVNlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIRS1TdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEhFLVMtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIRS1UT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEhFLVRlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIRS1UdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIRS1ULWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hIRS1RZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iTm9uZSIgc2hvd0xpc3RWaXNpYmlsaXR5PSJOb25lIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEhFLVF1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTIyODUiIHk9IjEyOTIwIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISEUtVU9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERTUzNTEwMDEzIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhFLVUtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEhFLVZPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjMxMTUiIGhlaWdodD0iMTU3NCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIRS1WZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhFLVZ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISEUtVi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhFLVdPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIRS1XZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISEUtV3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIRS1XLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISEUtWE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIRS1YZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISEUtWHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISEUtWC1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9ISEUtVWVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9Ik5vbmUiIHNob3dMaXN0VmlzaWJpbGl0eT0iTm9uZSIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hIRS1VdWZYRWR1cUhvT0piVVJaUnciIHg9Ijg3NTQiIHk9IjEyOTI4Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISEUtWU9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERjM2MjAwMDlBIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhFLVktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEhFLVpPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjM2MDYiIGhlaWdodD0iMTE1MSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIRS1aZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhFLVp1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISEUtWi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhFLWFPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIRS1hZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISEUtYXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIRS1hLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISEUtYk9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIRS1iZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISEUtYnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISEUtYi1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9ISEUtWWVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9Ik5vbmUiIHNob3dMaXN0VmlzaWJpbGl0eT0iTm9uZSIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hIRS1ZdWZYRWR1cUhvT0piVVJaUnciIHg9IjE3OTU3IiB5PSIxMjkzNyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhFLWNPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREU1MzZBMDBEOCI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIRS1jLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hIRS1kT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSI0ODc2IiBoZWlnaHQ9IjI0MjEiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISE9JQU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIT0lBZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhPSUF1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIT0lBLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISE9JQk9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhPSUJlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISE9JQnVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhPSUItZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISE9JQ09mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhPSUNlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEhPSUN1ZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEhFLWNlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJOb25lIiBzaG93TGlzdFZpc2liaWxpdHk9Ik5vbmUiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISEUtY3VmWEVkdXFIb09KYlVSWlJ3IiB4PSIzNDU0IiB5PSIxMjkxMSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhPSUMtZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI4MCI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIT0lEdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hIT0lELWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIyODI3IiBoZWlnaHQ9IjEwNDkiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISE9JRU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIT0lFZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhPSUV1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIT0lFLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEhPSUZPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIT0lGZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEhPSUZ1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIT0lGLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEhPSUdPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIT0lHZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIT0lHdWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hIT0lET2ZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iTm9uZSIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjEyNjMyMjU2IiBzaG93UGFyZW50PSJOYW1lIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hIT0lEZWZYRWR1cUhvT0piVVJaUnciIHg9IjEzMDY0IiB5PSI5OTkiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIT0lHLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjc5N0Y3NDAzOTIiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISE9JSHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9ISE9JSC1mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iNDU1NSIgaGVpZ2h0PSIxMTUxIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhPSUlPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISE9JSWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIT0lJdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISE9JSS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEhPSUpPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIT0lKZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEhPSUp1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIT0lKLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEhPSUtPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIT0lLZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIT0lLdWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hIT0lIT2ZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iTm9uZSIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEhPSUhlZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTE5NDYiIHk9Ijg1NjgiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIT0lhdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjFFNENGMzAxQUUiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISE9JYmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9ISE9JYnVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhPSWItZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISE9JY09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIT0ljZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISE9JY3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEhPSWMtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIT0lkT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEhPSWRlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIT0lkdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEhPSWQtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIT0llT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIT0llZWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hIT0lhLWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iTm9uZSIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjEyNjMyMjU2IiBzaG93UGFyZW50PSJOYW1lIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hIT0liT2ZYRWR1cUhvT0piVVJaUnciIHg9IjE5NTMyIiB5PSIzNTEzIiB3aWR0aD0iNTEzMCIgaGVpZ2h0PSIyMjE4Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISE9JcHVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERTRBOTcwMTIzIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhPSXFlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEhPSXF1ZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjQxODIiIGhlaWdodD0iMTU0MCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIT0lxLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhPSXJPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISE9JcmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhPSXJ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIT0lyLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISE9Jc09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIT0lzZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISE9Jc3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIT0lzLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISE9JdE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISE9JdGVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9ISE9JcC1mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9Ik5vbmUiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIxMjYzMjI1NiIgc2hvd1BhcmVudD0iTmFtZSIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISE9JcU9mWEVkdXFIb09KYlVSWlJ3IiB4PSIxMjQzNyIgeT0iNDAwNCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhYNU11ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyOTRFQjkwMDBGQyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIWDVOZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hIWDVOdWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSI0NDg3IiBoZWlnaHQ9IjE1NDAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISFg1Ti1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIWDVPT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhYNU9lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIWDVPdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISFg1Ty1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhYNVBPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISFg1UGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhYNVB1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISFg1UC1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhYNVFPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEhYNVFlZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEhYNU0tZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJOb25lIiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMTI2MzIyNTYiIHNob3dQYXJlbnQ9Ik5hbWUiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEhYNU5PZlhFZHVxSG9PSmJVUlpSdyIgeD0iNDcxNSIgeT0iNDAwNCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhYNWJ1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRkVERTRDMDM4NCI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIWDVjZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hIWDVjdWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIzNTg5IiBoZWlnaHQ9IjE1NzQiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISFg1Yy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIWDVkT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhYNWRlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIWDVkdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISFg1ZC1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhYNWVPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISFg1ZWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhYNWV1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISFg1ZS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhYNWZPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEhYNWZlZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEhYNWItZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJOb25lIiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISFg1Y09mWEVkdXFIb09KYlVSWlJ3IiB4PSI1MTY0IiB5PSI4MzA1Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTERpYWdyYW1TdHlsZSIgeG1pOmlkPSJfR3V5WjQtZlhFZHVxSG9PSmJVUlpSdyIgZGVzY3JpcHRpb249IlRoZSBNZXRob2QgQ29yZSBEZXNjcmlwdGlvbnMgcGFja2FnZSBkZWZpbmVzIHRoZSBleGFjdCBuYXR1cmUgb2YgdGV4dHVhbCBkZXNjcmlwdGlvbnMgdGhhdCBzaGFsbCBiZSBtYWludGFpbmVkIGZvciBDb250ZW50IEVsZW1lbnRzLiAgVGhlIGRlY2xhcmF0aW9ucyBmb3IgdGhlc2UgZGVzY3JpcHRpb25zIGhhdmUgYmVlbiBmYWN0b3JlZCBpbnRvIHRoaXMgc2VwYXJhdGUgcGFja2FnZSwgYmVjYXVzZSBldmVyeSBpbXBsZW1lbnRlciBvZiB0aGlzIG1ldGEtbW9kZWwgbWlnaHQgZGVjaWRlIHRvIGRlZmluZSBhIGRpZmZlcmVudCBzZXQgb2YgZGVzY3JpcHRpb24gYXR0cmlidXRlcyBmb3IgdGhlaXIgQ29udGVudCBFbGVtZW50cy4gIEhvd2V2ZXIsIG9ubHkgdGhlIGRlc2NyaXB0aW9uIGF0dHJpYnV0ZXMgZGVmaW5lZCBpbiB0aGlzIHBhY2thZ2UgYXJlIHRoZSBzdGFuZGFyZGl6ZWQgc2V0IGZvciBJQk0ncyBVbmlmaWVkIE1ldGhvZCBBcmNoaXRlY3R1cmUgYW5kIGFyZSBzdXBwb3J0ZWQgZm9yIG1ldGhvZCBjb250ZW50IGludGVyY2hhbmdlIChpLmUuIGltcG9ydC9leHBvcnQgc2NlbmFyaW9zIGZvciBkaWZmZXJlbnQgY29udGVudCBzb3VyY2VzKS4iLz4KLSAgICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEhPSUstZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRkFFMDg1MDM4MyIgc291cmNlPSJfSEhFLVFPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEhPSUctZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIT0lMdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhPSU1PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIT0lNZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISE9JTC1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEhPSUxPZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9ISE9JTGVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMjAzLCAtOTk5LCAzNTUsIDM3NzZdJFstMjAzLCAtNDE5OSwgMzU1LCA1NzVdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hIT0lNdWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9ISE9JTS1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hIT0lOT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUZBRTA3NTAzQzciIHNvdXJjZT0iX0hIRS1jT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hIT0lHLWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISE9JTi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIT0lPZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISE9JT3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEhPSU9PZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hIT0lOZWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9ISE9JTnVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlswLCAtMTIxOSwgLTgzMzEsIDM3NTldJFs4LCAtMjg5NSwgLTgzMjIsIDIwODJdJFs2MDQ1LCAtNDQxOSwgLTIyODYsIDU1OF0iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEhPSU8tZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hIT0lQT2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEhPSVBlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyNzk4NDlFMDAwMSIgc291cmNlPSJfSEhFLVVPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEhPSUctZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIT0lRT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhPSVF1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIT0lRLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISE9JUWVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEhPSVB1ZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hIT0lQLWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzAsIC03OTUsIC0zOTExLCAzNzc2XSRbOCwgLTE3NjksIC0zOTAzLCAyODAyXSRbMzA3MywgLTM5OTYsIC04MzgsIDU3NV0iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEhPSVJPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hIT0lSZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEhPSVJ1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRkFFMDg4MDEzRiIgc291cmNlPSJfSEhFLVlPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEhPSUctZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIT0lTZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhPSVMtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIT0lUT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISE9JU3VmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEhPSVItZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hIT0lTT2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy04LCAtNTg0LCA1NTI4LCAzNzg0XSRbLTE2LCAtMTY3NiwgNTUyMCwgMjY5Ml0kWy00MzUxLCAtMzc5MywgMTE4NSwgNTc1XSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9ISE9JVGVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEhPSVR1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9ISE9JVC1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFGQUUwN0IwMUFDIiBzb3VyY2U9Il9ISEUtSU9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9ISEUtY09mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhPSVV1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISE9JVk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhPSVZlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hIT0lVLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9ISE9JVU9mWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEhPSVVlZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbNDgyLCAtNzk1LCAtMTM0NiwgMjE1MF0kWzEwNjYsIC0xNzM1LCAtNzYyLCAxMjEwXSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9ISE9JVnVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEhPSVYtZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9ISE9JV09mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFGQUUwN0QwMzY0IiBzb3VyY2U9Il9ISEUtRU9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9ISEUtY09mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhPSVctZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISE9JWGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhPSVh1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hIT0lYT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9ISE9JV2VmWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEhPSVd1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTEwNTgsIC0xMjE5LCAxODg4LCAyMTg0XSRbLTE4OTYsIC0yMTkyLCAxMDQ5LCAxMjEwXSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9ISE9JWC1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEhPSVlPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9ISE9JWWVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFGQUUwOEIwMEFBIiBzb3VyY2U9Il9ISEUtTU9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9ISE9JRy1mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhPSVpPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISE9JWnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhPSVotZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hIT0laZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9ISE9JWXVmWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEhPSVktZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTgsIC0xNjQyLCA5ODk3LCAzNzkzXSRbLTE2LCAtMzgwMSwgOTg4OSwgMTYzNF0kWy03NjI4LCAtNTA2MywgMjI3NywgMzcyXSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9ISE9JYU9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEhPSWFlZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9ISE9JZXVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRTRFM0IwMzE5IiBzb3VyY2U9Il9ISE9JYXVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9ISE9JYXVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhPSWZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISE9JZi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhPSWdPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hIT0lmdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISE9JZ2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRTRFM0QwMzY0Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISE9JZy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISE9JZ3VmWEVkdXFIb09KYlVSWlJ3IiB4PSIyNSIgeT0iLTE2NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIT0loT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMUU0RTNEMDM2NCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhPSWh1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hIT0loZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0zOTciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISE9JaC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjFFNEUzRDAzNjIiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIT0lpZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEhPSWlPZlhFZHVxSG9PSmJVUlpSdyIgeD0iMjgyIiB5PSIzNjIiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISE9JaXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRTRFM0QwMzYyIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISE9Jak9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISE9JaS1mWEVkdXFIb09KYlVSWlJ3IiB4PSIxNjIxIiB5PSI0MDgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISE9JamVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRTRFM0QwMzY0Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISE9Jai1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISE9Ja09mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISE9JanVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhPSWtlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRTRFM0QwMzYyIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISE9Jay1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISE9JbE9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISE9Ja3VmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhPSWxlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjFFNEUzRDAzNjQiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIT0lsLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIT0ltT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hIT0lsdWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISE9JbWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRTRFM0QwMzYyIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISE9JbS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIT0luT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hIT0ltdWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9ISE9JZS1mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIxMjYzMjI1NiIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9ISE9JZk9mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlsyNTY1LCA1OTIsIDI1NjUsIDU5Ml0kWzMxNDksIDU5MiwgMzE0OSwgNTkyXSRbMzE0OSwgMTg4OCwgMzE0OSwgMTg4OF0kWzExOTMsIDE4ODgsIDExOTMsIDE4ODhdJFsxMTkzLCAxMTA5LCAxMTkzLCAxMTA5XSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEhPSW5lZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyNzk1NjI0MDE3RSIgc291cmNlPSJfSEhPSWF1ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEhPSUMtZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIT0lvT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhPSW91ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIT0lvLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISE9Jb2VmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEhPSW51ZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMTI2MzIyNTYiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEhPSW4tZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTE3NywgLTExMDksIDc0NDIsIDE5ODldJFstMTc3LCAtMzE0OSwgNzQ0MiwgLTUwXSRbLTYyMDYsIC0zMTQ5LCAxNDEzLCAtNTBdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hIT0lwT2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9ISE9JcGVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hIT0l0dWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjFFNERBQzAxQTAiIHNvdXJjZT0iX0hIT0lwdWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hIT0lhdWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISFg1QU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIWDVBdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISFg1QS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEhYNUFlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIWDVCT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjFFNERBRDAwNTciPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIWDVCdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hIWDVCZWZYRWR1cUhvT0piVVJaUnciIHg9IjI0OSIgeT0iMjcxIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhYNUItZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRTREQUQwMDU3Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISFg1Q2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEhYNUNPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTM5NyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIWDVDdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMUU0REFEMDA0RCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhYNURPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISFg1Qy1mWEVkdXFIb09KYlVSWlJ3IiB4PSItMyIgeT0iMzA1Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhYNURlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMUU0REFEMDA0RCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhYNUQtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEhYNUR1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTY4MCIgeT0iLTIyMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIWDVFT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjFFNERBRDAwNTciPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIWDVFdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIWDVFLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hIWDVFZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISFg1Rk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjFFNERBRDAwNEQiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIWDVGdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIWDVGLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hIWDVGZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISFg1R09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMUU0REFEMDA1NyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhYNUd1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEhYNUctZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEhYNUdlZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIWDVIT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjFFNERBRDAwNEQiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIWDVIdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEhYNUgtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEhYNUhlZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hIT0l0LWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjEyNjMyMjU2IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hIT0l1T2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzIwOTEsIDkzLCAtNTQ3NywgMjQ1XSRbNTAwMywgOTMsIC0yNTY1LCAyNDVdIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9ISFg1SU9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIwMDU4M0IwMUU2IiBzb3VyY2U9Il9ISE9JcHVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9ISE9JQy1mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhYNUktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISFg1SmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhYNUp1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hIWDVKT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9ISFg1SWVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIxMjYzMjI1NiIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9ISFg1SXVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstNTAsIC03NzAsIDAsIDI0ODBdJFstNTAsIC0yNzI2LCAwLCA1MjRdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hIWDVKLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9ISFg1S09mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hIWDVRdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjk0RUM2MDAyQkQiIHNvdXJjZT0iX0hIT0lwdWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hIWDVNdWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISFg1UmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIWDVSLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISFg1U09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEhYNVJ1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIWDVTZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjk0RUM2MDAyQkYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIWDVTLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hIWDVTdWZYRWR1cUhvT0piVVJaUnciIHg9IjEwOCIgeT0iMjI5Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhYNVRPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjk0RUM2MDAyQkYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIWDVUdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISFg1VGVmWEVkdXFIb09KYlVSWlJ3IiB4PSI4MjgiIHk9Ii0yNjMiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISFg1VC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjk0RUM2MDAyQkUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIWDVVZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEhYNVVPZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTkyIiB5PSIxNzgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISFg1VXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyOTRFQzYwMDJCRSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhYNVZPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEhYNVUtZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTYyIiB5PSItMzU1Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhYNVZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyOTRFQzYwMDJCRiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhYNVYtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEhYNVdPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEhYNVZ1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIWDVXZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyOTRFQzYwMDJCRSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhYNVctZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEhYNVhPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEhYNVd1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIWDVYZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI5NEVDNjAwMkJGIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISFg1WC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISFg1WU9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISFg1WHVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhYNVllZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyOTRFQzYwMDJCRSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhYNVktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISFg1Wk9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISFg1WXVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEhYNVEtZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSIxMjYzMjI1NiIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9ISFg1Uk9mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMjA5OSwgMCwgNTQ2OSwgMF0kWy01MzI1LCAwLCAyMjQzLCAwXSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEhYNVplZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyOTRFQzJCMDFDQSIgc291cmNlPSJfSEhYNU11ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEhPSUMtZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIWDVhT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhYNWF1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIWDVhLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISFg1YWVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEhYNVp1ZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMTI2MzIyNTYiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEhYNVotZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMjUsIC03NzAsIC03NDkzLCAyNDgwXSRbMjUsIC0zMjUxLCAtNzQ5MywgMF0kWzYxMDQsIC0zMjUxLCAtMTQxMywgMF0iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEhYNWJPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hIWDViZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgPC9jb250ZW50cz4KLSAgICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0d0NUNEZWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURFNDlFQTAxRTIiPgotICAgICAgICAgICAgPGJvZHk+MDY8L2JvZHk+Ci0gICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VNZXJnZSB4bWk6aWQ9Il9WUElHTU94ZUVkdUhqZTNwUGFoTjRBIiBtZXJnZWRQYWNrYWdlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMTkwIi8+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MURFNTIyMTAxRDIiIG5hbWU9IkFydGlmYWN0RGVzY3JpcHRpb24iPgotICAgICAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxRkFFMDdEMDM2NCIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQxREU1MzZBMDBEOCIvPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDAwQSIgbmFtZT0iYnJpZWZPdXRsaW5lIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiPgotICAgICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0d0NUNHT2ZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAwMEEiPgotICAgICAgICAgICAgICAgIDxib2R5PlByb3ZpZGVzIGEgYnJpZWYgZGVzY3JpcHRpb24gb2YgdGhlIGluZm9ybWF0aW9uIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoaXMgYXJ0aWZhY3QuIEZvciBleGFtcGxlLCBkaXNjdXNzZXMgdGhlIGNvbnRlbnRzIGZvciBrZXkgY2hhcHRlcnMgb2YgYSBkb2N1bWVudCBhcnRpZmFjdCBvciB0aGUga2V5IHBhY2thZ2VzIGFuZCBtb2R1bGVzIG9mIGEgbW9kZWwgYXJ0aWZhY3QuPC9ib2R5PgotICAgICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR25kVmtleUhFZHU1LXZWamxmVnNmUSIgdmFsdWU9IjEiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR25kVmtPeUhFZHU1LXZWamxmVnNmUSIvPgotICAgICAgICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfR2ZqOTBPeUhFZHU1LXZWamxmVnNmUSIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyIgdmFsdWU9IiIvPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAwMEIiIG5hbWU9InJlcHJlc2VudGF0aW9uT3B0aW9ucyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIj4KLSAgICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HdUN6QWVmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMDBCIj4KLSAgICAgICAgICAgICAgICA8Ym9keT5EaXNjdXNzZXMgZGlmZmVyZW50IHBvc3NpYmxlIGFsdGVybmF0aXZlIHJlcHJlc2VudGF0aW9ucyBmb3IgdGhlIGFydGlmYWN0LiBGb3IgZXhhbXBsZSBhIGRlc2lnbiBtb2RlbCBjYW4gYmUgcmVwcmVzZW50ZWQgYXMgYSBVTUwgbW9kZWwgb3IgYW4gaW5mb3JtYWwgYmxvY2sgZGlhZ3JhbSBvciBieSB0ZXh0dWFsIGRlc2NyaXB0aW9uIG9ubHkuPC9ib2R5PgotICAgICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfbnNuWWtleUhFZHU1LXZWamxmVnNmUSIgdmFsdWU9IjEiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfbnNuWWtPeUhFZHU1LXZWamxmVnNmUSIvPgotICAgICAgICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfbmlWYk1PeUhFZHU1LXZWamxmVnNmUSIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyIgdmFsdWU9IiIvPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0NjExREIyRjAyMEQiIG5hbWU9InJlcHJlc2VudGF0aW9uIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il8yRUV3NGV5SUVkdTUtdlZqbGZWc2ZRIiB2YWx1ZT0iMSIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il8yRUV3NE95SUVkdTUtdlZqbGZWc2ZRIi8+Ci0gICAgICAgICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il8xOExaSU95SUVkdTUtdlZqbGZWc2ZRIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIiB2YWx1ZT0iIi8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQ2MTFEQjREMDI0OCIgbmFtZT0ibm90YXRpb24iIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX1BCaWw4ZXlIRWR1NS12VmpsZlZzZlEiIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX1BCaWw4T3lIRWR1NS12VmpsZlZzZlEiLz4KLSAgICAgICAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iX080Y1VVT3lIRWR1NS12VmpsZlZzZlEiIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiIHZhbHVlPSIiLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MURFNTI1QzAxMzciIG5hbWU9IkRlbGl2ZXJhYmxlRGVzY3JpcHRpb24iPgotICAgICAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxRkFFMDdCMDFBQyIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQxREU1MzZBMDBEOCIvPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDAxNCIgbmFtZT0iZXh0ZXJuYWxEZXNjcmlwdGlvbiIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIj4KLSAgICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HdUN6Q09mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMDE0Ij4KLSAgICAgICAgICAgICAgICA8Ym9keT5UaGUgZGVzY3JpcHRpb24gb2YgdGhlIERlbGl2ZXJhYmxlIHVzZWQgZm9yIGNsaWVudCBkb2N1bWVudHMgKHByb3Bvc2FsLCBzdGF0ZW1lbnRzIG9mIHdvcmsgb3IgY29udHJhY3R1YWwgYWdyZWVtZW50cykuICBJdCBtaWdodCB1c2UgYSBkaWZmZXJlbnQgbGFuZ3VhZ2UgYW5kIGZvbGxvdyBsZWdhbCBjb25zdHJhaW50cy48L2JvZHk+Ci0gICAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il82cHI4QWV5R0VkdTUtdlZqbGZWc2ZRIiB2YWx1ZT0iMSIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il82cHI4QU95R0VkdTUtdlZqbGZWc2ZRIi8+Ci0gICAgICAgICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il82YnJWTU95R0VkdTUtdlZqbGZWc2ZRIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIiB2YWx1ZT0iIi8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDAxRSIgbmFtZT0icGFja2FnaW5nR3VpZGFuY2UiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyI+Ci0gICAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3VDekMtZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDAxRSI+Ci0gICAgICAgICAgICAgICAgPGJvZHk+UHJvdmlkZXMgZ3VpZGFuY2Ugb24gaG93IHRvIGFzc2VtYmxlIHRoZSBkZWxpdmVyYWJsZSBmcm9tIGFsbCBpdHMgcmVxdWlyZWQgaW5wdXRzLiAgVGhpcyBzZWN0aW9uIGRlc2NyaWJlcyB0aGUgbW9zdCBjb21tb24gY29udGVudCBtZWRpdW0gYW5kIGZvcm1hdC4gIERpc3RyaWJ1dGlvbiBvZiB0aGUgZGVsaXZlcmFibGUgaXMgYWRkcmVzc2VkIGluIHRoaXMgc2VjdGlvbiwgaWYgbmVjZXNzYXJ5LjwvYm9keT4KLSAgICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX2V1bGpFZXlHRWR1NS12VmpsZlZzZlEiIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX2V1bGpFT3lHRWR1NS12VmpsZlZzZlEiLz4KLSAgICAgICAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iX2Vrd1JvT3lHRWR1NS12VmpsZlZzZlEiIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiIHZhbHVlPSIiLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MURFNTMxOTAzNTAiIG5hbWU9IlJvbGVEZXNjcmlwdGlvbiI+Ci0gICAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDFGQUUwODUwMzgzIiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDI3OTdGNzQwMzkyIi8+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMDc4IiBuYW1lPSJza2lsbHMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyI+Ci0gICAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3VDekVPZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDA3OCI+Ci0gICAgICAgICAgICAgICAgPGJvZHk+TGlzdHMgb2Ygc2V0IG9mIHJlcXVpcmVkIHNraWxscyBhIHBlcnNvbiBuZWVkcyB0byBwb3NzZXNzIHRvIGZ1bGZpbGwgdGhhdCBSb2xlLjwvYm9keT4KLSAgICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iXy1PWFJ3ZXlJRWR1NS12VmpsZlZzZlEiIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iXy1PWFJ3T3lJRWR1NS12VmpsZlZzZlEiLz4KLSAgICAgICAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iXy1EZTNjT3lJRWR1NS12VmpsZlZzZlEiIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiIHZhbHVlPSIiLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMDgyIiBuYW1lPSJhc3NpZ25tZW50QXBwcm9hY2hlcyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIj4KLSAgICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HdUN6RS1mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMDgyIj4KLSAgICAgICAgICAgICAgICA8Ym9keT5Qcm92aWRlcyBndWlkYW5jZSBvbiBmb3IgYXNzaWduaW5nIGluZGl2aWR1YWxzIHRvIHRoZSBSb2xlIGluIHRlcm1zIG9mIHdoYXQgb3RoZXIgcm9sZXMgdGhlc2UgaW5kaXZpZHVhbHMgY291bGQgcGVyZm9ybSBhbmQgd2hhdCByZXNwb25zaWJpbGl0eSBkaWZmZXJlbnQgaW5kaXZpZHVhbHMgYXNzaWduZWQgdG8gdGhpcyByb2xlIG1pZ2h0IGhhdmUuICBUaGUgZ3VpZGFuY2UgY2FuIGFsc28gZGVzY3JpYmUgZGlmZmVyZW50IGFzc2lnbm1lbnQgYXBwcm9hY2hlcyBmb3IgZGlmZmVyZW50IHR5cGVzIG9mIHByb2plY3RzLCBlLmcuIGZvciBsYXJnZSB2ZXJzdXMgc21hbGwgdGVhbXMgd2hlcmUgaW5kaXZpZHVhbHMgY291bGQgYmUgYWxsb2NhdGVkIHRvIHJvbGVzIGZ1bGwgdGltZSB2ZXJzdXMgc2hhcmluZyByb2xlcyB3aXRoaW4gdGhlIHRlYW0uPC9ib2R5PgotICAgICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfcHRYSVVleUhFZHU1LXZWamxmVnNmUSIgdmFsdWU9IjEiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfcHRYSVVPeUhFZHU1LXZWamxmVnNmUSIvPgotICAgICAgICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfcGw1MWNPeUhFZHU1LXZWamxmVnNmUSIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyIgdmFsdWU9IiIvPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTRCMzc3RDAyNzIiIG5hbWU9InN5bm9ueW1zIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiPgotICAgICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0d1TDg4dWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTRCMzc3RDAyNzIiPgotICAgICAgICAgICAgICAgIDxib2R5Pkxpc3RzIHN5bm9ueW1zLCBpLmUuIG90aGVyIG5hbWVzIHRoZSBSb2xlIG1pZ2h0IGJlIHJlZmVycmVkIGJ5LiAgVG9vbCBzdXBwb3J0IGZvciB0aGUgbWV0YS1tb2RlbCBtaWdodCBzdXBwb3J0IHRoYXQgYSBSb2xlIG5hbWUgY2FuIGJlIGNvbnNpc3RlbnRseSBiZSByZXBsYWNlZCB3aXRoIG9uZSBvZiBpdHMgc3lub255bXMgdGhyb3VnaHQgYSBQcm9jZXNzLjwvYm9keT4KLSAgICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iXzdxV3UwZXlHRWR1NS12VmpsZlZzZlEiIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iXzdxV3UwT3lHRWR1NS12VmpsZlZzZlEiLz4KLSAgICAgICAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iXzdnMFlVT3lHRWR1NS12VmpsZlZzZlEiIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiIHZhbHVlPSIiLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MURFNTM1MTAwMTMiIG5hbWU9IlRhc2tEZXNjcmlwdGlvbiI+Ci0gICAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDI3OTg0OUUwMDAxIiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDI3OTdGNzQwMzkyIi8+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMDhEIiBuYW1lPSJwdXJwb3NlIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiPgotICAgICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0d1TDg5LWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAwOEQiPgotICAgICAgICAgICAgICAgIDxib2R5PlN1bW1hcml6ZXMgdGhlIG1haW4gcmVhc29uIGZvciBwZXJmb3JtaW5nIHRoaXMgVGFzayBhbmQgd2hhdCBpcyBpbnRlbmRlZCB0byBiZSBhY2hpZXZlZC48L2JvZHk+Ci0gICAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9CR196SWV5R0VkdTUtdlZqbGZWc2ZRIiB2YWx1ZT0iMSIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9CR196SU95R0VkdTUtdlZqbGZWc2ZRIi8+Ci0gICAgICAgICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il9DS2YzZ095R0VkdTUtdlZqbGZWc2ZRIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIiB2YWx1ZT0iIi8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDA5NiIgbmFtZT0iYWx0ZXJuYXRpdmVzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiPgotICAgICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0d1TDgtdWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAwOTYiPgotICAgICAgICAgICAgICAgIDxib2R5PkNvbXByaXNlcyBvZiBzdW1tYXJpZXMgZGVzY3JpYmluZyBpbXBvcnRhbnQgZXhjZXB0aW9uYWwgYW5kIG5vbi1zdGFuZGFyZCB3YXlzIG9mIGFjaGlldmluZyB0aGlzIFRhc2sncyBkZXZlbG9wbWVudCBnb2FscyB0aGF0IHdlcmUgbm90IGNvdmVyZWQgYnkgdGhlIFRhc2sncyBTdGVwcy48L2JvZHk+Ci0gICAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9BQXpmd2V5SkVkdTUtdlZqbGZWc2ZRIiB2YWx1ZT0iMSIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9BQXpmd095SkVkdTUtdlZqbGZWc2ZRIi8+Ci0gICAgICAgICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il9fNDZJQU95SUVkdTUtdlZqbGZWc2ZRIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIiB2YWx1ZT0iIi8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDFERTUzNkEwMEQ4IiBuYW1lPSJXb3JrUHJvZHVjdERlc2NyaXB0aW9uIj4KLSAgICAgICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MUZBRTA3NTAzQzciIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0Mjc5N0Y3NDAzOTIiLz4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAwQjQiIG5hbWU9InB1cnBvc2UiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyI+Ci0gICAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3VWdDh1ZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDBCNCI+Ci0gICAgICAgICAgICAgICAgPGJvZHk+RGVzY3JpYmVzIHdoeSB0aGUgd29yayBwcm9kdWN0IGlzIHByb2R1Y2VkIGFuZCB0byB3aGF0IHVzZSBpdCB3aWxsIGJlIHB1dC48L2JvZHk+Ci0gICAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9ha20xOGV5R0VkdTUtdlZqbGZWc2ZRIiB2YWx1ZT0iMSIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9ha20xOE95R0VkdTUtdlZqbGZWc2ZRIi8+Ci0gICAgICAgICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il9hY3MzSU95R0VkdTUtdlZqbGZWc2ZRIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIiB2YWx1ZT0iIi8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDBCRSIgbmFtZT0iaW1wYWN0T2ZOb3RIYXZpbmciIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyI+Ci0gICAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3VWdDllZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDBCRSI+Ci0gICAgICAgICAgICAgICAgPGJvZHk+RGVzY3JpYmVzIHRoZSBjb25zZXF1ZW5jZXMgb2Ygbm90IHByb2R1Y2luZyB0aGUgd29yayBwcm9kdWN0LiAgVGhpcyBpcyBpbnRlbmRlZCB0byBhaWQgaW4gdGhlIHRhaWxvcmluZyB0aGUgbWV0aG9kL3Byb2Nlc3MgdG8gdGhlIG5lZWRzIG9mIGEgc3BlY2lmaWMgcHJvamVjdC48L2JvZHk+Ci0gICAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9iWjhpZ2V5R0VkdTUtdlZqbGZWc2ZRIiB2YWx1ZT0iMSIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9iWjhpZ095R0VkdTUtdlZqbGZWc2ZRIi8+Ci0gICAgICAgICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il9iUm1lME95R0VkdTUtdlZqbGZWc2ZRIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIiB2YWx1ZT0iIi8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDBCRiIgbmFtZT0icmVhc29uc0Zvck5vdE5lZWRpbmciIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyI+Ci0gICAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3VWdC1PZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDBCRiI+Ci0gICAgICAgICAgICAgICAgPGJvZHk+RGVzY3JpYmVzIHRoZSBjaXJjdW1zdGFuY2VzIGluIHdoaWNoIGl0IGlzIHJlYXNvbmFibGUgbm90IHRvIHByb2R1Y2UgdGhlIHdvcmsgcHJvZHVjdC4gIFRoaXMgaXMgaW50ZW5kZWQgdG8gYWlkIGluIHRoZSB0YWlsb3Jpbmcgb2YgdGhlIG1ldGhvZC9wcm9jZXNzIHRvIHRoZSBuZWVkcyBvZiBhIHNwZWNpZmljIHByb2plY3QuPC9ib2R5PgotICAgICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfQkFJMTBleUpFZHU1LXZWamxmVnNmUSIgdmFsdWU9IjEiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfQkFJMTBPeUpFZHU1LXZWamxmVnNmUSIvPgotICAgICAgICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfQTM3OEVPeUpFZHU1LXZWamxmVnNmUSIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyIgdmFsdWU9IiIvPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxREYzNjIwMDA5QSIgbmFtZT0iR3VpZGFuY2VEZXNjcmlwdGlvbiI+Ci0gICAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDFGQUUwODgwMTNGIiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDI3OTdGNzQwMzkyIi8+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDFCRTI1MTgwMEQyIiBuYW1lPSJhdHRhY2htZW50cyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIj4KLSAgICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HdVZ0X2VmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDFCRTI1MTgwMEQyIj4KLSAgICAgICAgICAgICAgICA8Ym9keT5UaGlzIGZpZWxkIGlzIHByaW1hcmlseSB1c2VkIGZvciBhdHRhY2htZW50cyBhdWdtZW50aW5nIHRoZSBpbmZvcm1hdGlvbiBwcm92aWRlZCBmb3IgZ3VpZGFuY2UuICBJbiBwYXJ0aWN1bGFyIHRoZSBhdHRyaWJ1dGUgaXMgdXNlZCBmb3IgVGVtcGxhdGVzLCBFeGFtcGxlcywgYW5kIFJldXNhYmxlIEFzc2V0cyB0byBjb250YWluIHRoZSBhY3R1YWwgYXR0YWNobWVudCBkZXNjcmliZWQgaW4gdGhlIG1haW5EZXNjcmlwdGlvbi4gIEl0IGNhbiBhZGRpdGlvbmFsbHkgY29udGFpbiByZXByZXNlbnRhdGlvbnMgb2YgdGhlIGd1aWRhbmNlIGluIGp1c3QgYSB0aGlyZCBwYXJ0eSBmb3JtYXQsIGUuZy4gUERGLCBNUyBXb3JkLCBvciBXb3JkIFBlcmZlY3QuPC9ib2R5PgotICAgICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfNzhWa3dleUlFZHU1LXZWamxmVnNmUSIgdmFsdWU9IjEiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfNzhWa3dPeUlFZHU1LXZWamxmVnNmUSIvPgotICAgICAgICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfNzFMejRPeUlFZHU1LXZWamxmVnNmUSIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyIgdmFsdWU9IiIvPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxREYzNjM2MDEwOSIgbmFtZT0iUHJhY3RpY2VEZXNjcmlwdGlvbiI+Ci0gICAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDFGQUUwOEIwMEFBIiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDI3OTdGNzQwMzkyIi8+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGRDRGMDYwMTM4IiBuYW1lPSJhZGRpdGlvbmFsSW5mbyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIj4KLSAgICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HdVZ1QXVmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGRDRGMDYwMTM4Ij4KLSAgICAgICAgICAgICAgICA8Ym9keT5BbnkgYWRkaXRpb25hbCBJbmZvcm1hdGlvbiBub3QgY292ZXJlZCBieSB0aGUgb3RoZXIgYXR0cmlidXRlcy48L2JvZHk+Ci0gICAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HWnNVY095SkVkdTUtdlZqbGZWc2ZRIiB2YWx1ZT0iMSIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HWmpLZ095SkVkdTUtdlZqbGZWc2ZRIi8+Ci0gICAgICAgICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il9HUzJGa095SkVkdTUtdlZqbGZWc2ZRIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIiB2YWx1ZT0iIi8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRkQ0RUYwMDI3RiIgbmFtZT0icHJvYmxlbSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIj4KLSAgICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HdWZlOHVmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGRDRFRjAwMjdGIj4KLSAgICAgICAgICAgICAgICA8Ym9keT5BIGRlc2NyaXB0aW9uIG9mIHRoZSBwcm9ibGVtIHRoZSBQcmFjdGljZSBhZGRyZXNzZXMuPC9ib2R5PgotICAgICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfNFdfMXdleUlFZHU1LXZWamxmVnNmUSIgdmFsdWU9IjEiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfNFdfMXdPeUlFZHU1LXZWamxmVnNmUSIvPgotICAgICAgICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfNE9XM0lPeUlFZHU1LXZWamxmVnNmUSIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyIgdmFsdWU9IiIvPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEZENEVGODAxOTIiIG5hbWU9ImJhY2tncm91bmQiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyI+Ci0gICAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3VmZTllZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRkQ0RUY4MDE5MiI+Ci0gICAgICAgICAgICAgICAgPGJvZHk+RWxhYm9yYXRpb24gb24gdGhlIGJhY2tncm91bmQgYW5kIHRoZSBjb250ZXh0IGluIHdoaWNoIHRoZSBwcm9ibGVtIG9jY3VycyBhbmQgd2hlcmUgdGhlIHNvbHV0aW9uIGRlc2NyaWJlZCBieSB0aGlzIFByYWN0aWNlIHdpbGwgZml0IGluLjwvYm9keT4KLSAgICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0NjLUFNZXlKRWR1NS12VmpsZlZzZlEiIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0NjLUFNT3lKRWR1NS12VmpsZlZzZlEiLz4KLSAgICAgICAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iX0NTUFc0T3lKRWR1NS12VmpsZlZzZlEiIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiIHZhbHVlPSIiLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGRDVENTMwMTFEIiBuYW1lPSJnb2FscyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIj4KLSAgICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HdWZlLU9mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGRDVENTMwMTFEIj4KLSAgICAgICAgICAgICAgICA8Ym9keT5BIHN1bW1hcnkgb2YgdGhlIG92ZXJhbGwgZ29hbHMgdG8gYmUgYWRkcmVzc2VkIGJ5IHRoZSBQcmFjdGljZS48L2JvZHk+Ci0gICAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il8wVVVEY2V5SUVkdTUtdlZqbGZWc2ZRIiB2YWx1ZT0iMSIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il8wVVVEY095SUVkdTUtdlZqbGZWc2ZRIi8+Ci0gICAgICAgICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il8wTFlKNE95SUVkdTUtdlZqbGZWc2ZRIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIiB2YWx1ZT0iIi8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRkQ0RjAxMDIwNiIgbmFtZT0iYXBwbGljYXRpb24iIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyI+Ci0gICAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3VmZS0tZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRkQ0RjAxMDIwNiI+Ci0gICAgICAgICAgICAgICAgPGJvZHk+RGVzY3JpYmVzIGhvdyB0aGUgUHJhY3RpY2UgaXMgYmVpbmcgYXBwbGllZCBvciBpbnRyb2R1Y2VkIGludG8gdGhlIGNvbnRleHQgZGVzY3JpYmVkIGluIGJhY2tncm91bmQuPC9ib2R5PgotICAgICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfODBxVDRleUlFZHU1LXZWamxmVnNmUSIgdmFsdWU9IjEiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfODBxVDRPeUlFZHU1LXZWamxmVnNmUSIvPgotICAgICAgICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfOHR6ZDhPeUlFZHU1LXZWamxmVnNmUSIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyIgdmFsdWU9IiIvPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEZENUQzRTAzMjUiIG5hbWU9ImxldmVsc09mQWRvcHRpb24iIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyI+Ci0gICAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3VvbzRPZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRkQ1RDNFMDMyNSI+Ci0gICAgICAgICAgICAgICAgPGJvZHk+T3V0bGluZXMgdGhlIGRpZmZlcmVudCBmb3JtcyBvciB2YXJpYW50cyBpbiB3aGljaCB0aGUgcHJhY3RpY2UgY291bGQgYmUgcmVhbGl6ZWQuIChlLmcuIGZ1bGwgYWRvcHRpb24gdmVydXMgYSBwYXJ0aWFsIGFkb3B0aW9uIG9mIHRoZSBQcmFjdGljZSk8L2JvZHk+Ci0gICAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il90ZTRIa2V5R0VkdTUtdlZqbGZWc2ZRIiB2YWx1ZT0iMSIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il90ZTRIa095R0VkdTUtdlZqbGZWc2ZRIi8+Ci0gICAgICAgICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il91RWJFb095R0VkdTUtdlZqbGZWc2ZRIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIiB2YWx1ZT0iIi8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDFGRURFNEMwMzg0IiBuYW1lPSJEZXNjcmliYWJsZUVsZW1lbnQiIGlzQWJzdHJhY3Q9InRydWUiPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HdW9vNC1mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDFGRURFNEMwMzg0Ij4KLSAgICAgICAgICAgICAgPGJvZHk+VGhpcyBkZWZpbml0aW9uIG9mIENvbnRlbnQgRWxlbWVudCBleHRlbmRzIHRoZSBDb250ZW50IEVsZW1lbnQgZGVmaW5pdGlvbiB2aWEgcGFja2FnZSBtZXJnZSB3aXRoIHJlZmVyZW5jZXMgdG8gaWNvbnMgdGhhdCBhcmUgdXNlZCBmb3IgcHJlc2VudGluZyBDb250ZW50IEVsZW1lbnRzIGluIGEgVU1BLWJhc2VkIG1vZGVsaW5nIGVudmlyb25tZW50IGFzIHdlbGwgYXMgd2hlbiBwdWJsaXNoaW5nIENvbnRlbnQgRWxlbWVudHMgaW50byBkb2N1bWVudGF0aW9uIHByZXNlbnRhdGlvbiAoZS5nLiBkb2N1bWVudCBvciBodG1sIHBhZ2VzKS48L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MUU0OTUzNzAzNDMiIG5hbWU9InNoYXBlaWNvbiIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDExM0VBMjkwMkZFIj4KLSAgICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HdW9vNS1mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFNDk1MzcwMzQzIj4KLSAgICAgICAgICAgICAgICA8Ym9keT5BIHJlZmVyZW5jZSB0byBhbiBpY29uIHRoYXQgY2FuIGJlIHVzZWQgZm9yIG1vZGVsaW5nIHdpdGggc3BlY2lmaWMgQ29udGVudCBFbGVtZW50IGluc3RhbmNlcyAoYXMgZ3JhcGhpY2FsIHN0ZXJlb3R5cGVzLCBlLmcuIGEgdXNlIGNhc2Ugc3ltYm9sIGZvciBhIHVzZSBjYXNlIGFydGlmYWN0KSBhcyB3ZWxsIGFzIHB1YmxpY2F0aW9uIG9mIGNvbnRlbnQuPC9ib2R5PgotICAgICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfSlpIclFleVBFZHVGS0pvdkJMNjRYUSIgdmFsdWU9IjEiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfSlpIclFPeVBFZHVGS0pvdkJMNjRYUSIvPgotICAgICAgICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfSk9pTDRPeVBFZHVGS0pvdkJMNjRYUSIgdHlwZT0iXzNBREM3Qjc0MDIyRDQxMTNFQTI5MDJGRSIgdmFsdWU9IiIvPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MUU0OTUzQzAzMTkiIG5hbWU9Im5vZGVpY29uIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MTEzRUEyOTAyRkUiPgotICAgICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0d1b282dWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUU0OTUzQzAzMTkiPgotICAgICAgICAgICAgICAgIDxib2R5PkEgcmVmZXJlbmNlIHRvIGFuIGljb24gdGhhdCBjYW4gYmUgdXNlZCBpbiB0cmVlIGJyb3dzZXIgcHJlc2VudGF0aW9ucyBhbmQgYnJlYWtkb3duIHN0cnVjdHVyZXMuPC9ib2R5PgotICAgICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfRmoxYndleVBFZHVGS0pvdkJMNjRYUSIgdmFsdWU9IjEiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfRmoxYndPeVBFZHVGS0pvdkJMNjRYUSIvPgotICAgICAgICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfR1JsU2tPeVBFZHVGS0pvdkJMNjRYUSIgdHlwZT0iXzNBREM3Qjc0MDIyRDQxMTNFQTI5MDJGRSIgdmFsdWU9IiIvPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyNzk3Rjc0MDM5MiIgbmFtZT0iQ29udGVudERlc2NyaXB0aW9uIj4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAwQUEiIG5hbWU9ImV4dGVybmFsSWQiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyI+Ci0gICAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3VMOF8tZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDBBQSI+Ci0gICAgICAgICAgICAgICAgPGJvZHk+QW4gZXh0ZXJuYWwgdmlzaWJsZSBudW1iZXIgdGhhdCBpcyB1c2VkIHRvIHJlZmVyZW5jZSB0aGlzIGFydGlmYWN0LiBVc2VkIGxpa2UgYSBzeW5vbnltLjwvYm9keT4KLSAgICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX2hvNFVnZXlIRWR1NS12VmpsZlZzZlEiIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX2hvNFVnT3lIRWR1NS12VmpsZlZzZlEiLz4KLSAgICAgICAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iX2hmVi1BT3lIRWR1NS12VmpsZlZzZlEiIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiIHZhbHVlPSIiLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDE3N0U3MTYwMzdGIiBuYW1lPSJrZXlDb25zaWRlcmF0aW9ucyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIj4KLSAgICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HdW9vNy1mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDE3N0U3MTYwMzdGIj4KLSAgICAgICAgICAgICAgICA8Ym9keT5LZXkgQ29uc2lkZXJhdGlvbnMgcHJvdmlkZXMgYWR2aXNlIGFuZCBndWlkYW5jZSBvZiBhIGNyaXRpY2FsIG5hdHVyZSBmb3IgdGhlIGNvbnRlbnQgZWxlbWVudCBhcyB3ZWxsIGFzIHdhcm5pbmdzLCBjYXV0aW9ucywgcGl0ZmFsbHMsIGRhbmdlcnMuPC9ib2R5PgotICAgICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfMU1NdHNleUlFZHU1LXZWamxmVnNmUSIgdmFsdWU9IjEiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfMU1NdHNPeUlFZHU1LXZWamxmVnNmUSIvPgotICAgICAgICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfMURaLUVPeUlFZHU1LXZWamxmVnNmUSIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyIgdmFsdWU9IiIvPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpQYWNrYWdlIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MkRERTI4MDAyNUQiIG5hbWU9IldvcmtQcm9kdWN0U3RhdGVzIj4KLSAgICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iX0d2RlUtT2ZYRWR1cUhvT0piVVJaUnciIHNvdXJjZT0idW1sMi5kaWFncmFtcyIgcmVmZXJlbmNlcz0iXzNBREM3Qjc0MDIyRDQyRERFOUZFMDAzQSI+Ci0gICAgICAgICAgICA8Y29udGVudHMgeG1pOnR5cGU9Im5vdGF0aW9uOkRpYWdyYW0iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyRERFOUZFMDAzQSIgdHlwZT0iQ2xhc3MiIG5hbWU9Ik1ldGhvZExpbmsiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhocUFPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDJCQyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIaHFBLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hIaHFCT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIzNjkxIiBoZWlnaHQ9IjEwMzIiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISGhxQmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIaHFCdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhocUItZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIaHFDT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEhocUNlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIaHFDdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEhocUMtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIaHFET2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEhocURlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIaHFEdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIaHFELWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hIaHFBZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dQYXJlbnQ9Ik5hbWUiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEhocUF1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTkwMiIgeT0iNTM4OSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhocUVPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyRERFQTA1MDAwOCI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIaHFFLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hIaHFGT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISGhxRmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIaHFGdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhocUYtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIaHFHT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEhocUdlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIaHFHdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEhocUctZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIaHFIT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEhocUhlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIaHFIdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIaHFILWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hIaHFFZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEhocUV1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMzQyMCIgeT0iMzM4MiIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhocVEtZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E4MkQzMDE3RiI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIaHFSdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hIaHFSLWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIzNjkxIiBoZWlnaHQ9IjEwMzIiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISGhxU09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIaHFTZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhocVN1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIaHFTLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEhocVRPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIaHFUZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEhocVR1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIaHFULWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEhocVVPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIaHFVZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIaHFVdWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hIaHFST2ZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dQYXJlbnQ9Ik5hbWUiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEhocVJlZlhFZHVxSG9PSmJVUlpSdyIgeD0iNDE5NyIgeT0iMTE4MCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhocVUtZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyRERFQUMzMDFBNSI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIaHFWdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hIaHFWLWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxODc5IiBoZWlnaHQ9IjkwNSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIaHFXT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhocVdlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISGhxV3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhocVctZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISGhxWE9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhocVhlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISGhxWHVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhocVgtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISGhxWU9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhocVllZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEhocVl1ZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEhocVZPZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISGhxVmVmWEVkdXFIb09KYlVSWlJ3IiB4PSI1MjA3IiB5PSIzMzYxIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTERpYWdyYW1TdHlsZSIgeG1pOmlkPSJfR3ZGVS11ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9ISGhxSU9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDJEREVDMjEwMkQ1IiBzb3VyY2U9Il9ISGhxRU9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9ISGhxQU9mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhocUktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISGhxSmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhocUp1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hIaHFKT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISGhxSi1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyRERFQzIyMDE4QyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhocUtlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEhocUtPZlhFZHVxSG9PSmJVUlpSdyIgeT0iMzk2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhocUt1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDJEREVDMjIwMThDIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISGhxTE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEhocUstZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTM5NyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIaHFMZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyRERFQzIyMDE4MiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhocUwtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISGhxTHVmWEVkdXFIb09KYlVSWlJ3IiB4PSItMzE0IiB5PSItMzkxIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhocU1PZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MkRERUMyMjAxODIiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIaHFNdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hIaHFNZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0zOTciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISGhxTS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDJEREVDMjIwMThDIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISGhxTmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISGhxTnVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISGhxTk9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhocU4tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDJEREVDMjIwMTgyIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISGhxT2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISGhxT3VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISGhxT09mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhocU8tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MkRERUMyMjAxOEMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIaHFQZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIaHFQdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hIaHFQT2ZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISGhxUC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDJEREVDMjIwMTgyIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISGhxUWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIaHFRdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hIaHFRT2ZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9ISGhxSWVmWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEhocUl1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMzQ3LCA0NDgsIC0xMjc4LCAtMTYzNF0kWzEyMTAsIDE1NTcsIC00MTQsIC01MjRdIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9ISGhxWS1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDJEREVDMjUwMDNDIiBzb3VyY2U9Il9ISGhxVS1mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9ISGhxUS1mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhocVp1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISGhxYU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhocWFlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hIaHFaLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISGhxYXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyRERFQzI1MDI0NSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhocWJPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEhocWEtZlhFZHVxSG9PSmJVUlpSdyIgeT0iMzk2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhocWJlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDJEREVDMjUwMjQ1Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISGhxYi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEhocWJ1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTM5NyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIaHFjT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyRERFQzI1MDIzQiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhocWN1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISGhxY2VmWEVkdXFIb09KYlVSWlJ3IiB4PSItMzA0IiB5PSI1MTkiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISGhxYy1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyRERFQzI1MDIzQiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhocWRlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEhocWRPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTM5NyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIaHFkdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MkRERUMyNTAyNDUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIaHFlT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIaHFlZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hIaHFkLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISGhxZXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MkRERUMyNTAyM0IiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIaHFmT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIaHFmZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hIaHFlLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISGhxZnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyRERFQzI1MDI0NSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhocWdPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEhocWdlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEhocWYtZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIaHFndWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MkRERUMyNTAyM0IiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIaHFoT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEhocWhlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEhocWctZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hIaHFaT2ZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9ISGhxWmVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMzQ3LCAtNDU3LCAxMjI3LCAxNjc2XSRbLTEyMDIsIC0xNjE3LCAzNzIsIDUxNl0iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgIDwvY29udGVudHM+Ci0gICAgICAgICAgICA8Y29udGVudHMgeG1pOnR5cGU9Im5vdGF0aW9uOkRpYWdyYW0iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyRERFQzNGMDAzOSIgdHlwZT0iQ2xhc3MiIG5hbWU9IlN0YXRlTWFjaGluZSI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISHF6OE9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDJEREVDODEwMzIzIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhxejgtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEhxejlPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjIzNzAiIGhlaWdodD0iOTA1Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhxejllZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISHF6OXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIcXo5LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISHF6LU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIcXotZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISHF6LXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIcXotLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISHF6X09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIcXpfZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISHF6X3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISHF6Xy1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9ISHF6OGVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hIcXo4dWZYRWR1cUhvT0piVVJaUnciIHg9Ijk2ODUiIHk9IjEzMjY3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISHEwQU9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDJEREVEREMwMzE4Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhxMEEtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEhxMEJPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjMxNjYiIGhlaWdodD0iNDU4OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIcTBCZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhxMEJ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iS2luZCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISHEwQi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIcTBDT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISHEwQ2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJFbnVtZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISHEwQ3VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhxMEMtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIcTBET2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISHEwRGVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIcTBEdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hIcTBBZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEhxMEF1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMjEyNSIgeT0iNjc0NyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhxMEQtZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E4MkQzMDE3RiI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIcTBFdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hIcTBFLWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIzNjkxIiBoZWlnaHQ9IjEwMzIiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISHEwRk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIcTBGZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhxMEZ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIcTBGLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEhxMEdPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIcTBHZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEhxMEd1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIcTBHLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEhxMEhPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIcTBIZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIcTBIdWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hIcTBFT2ZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEhxMEVlZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTA4MzMiIHk9IjIzNjUiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIcTBILWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MkRERUFDMzAxQTUiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISHEwSXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9ISHEwSS1mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhxMEpPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISHEwSmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIcTBKdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISHEwSi1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIcTBLT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISHEwS2VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIcTBLdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISHEwSy1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIcTBMT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISHEwTGVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISHEwTHVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9ISHEwSU9mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hIcTBJZWZYRWR1cUhvT0piVVJaUnciIHg9IjE0NjIzIiB5PSIxMDY0OCIgd2lkdGg9IjIzNzMiIGhlaWdodD0iMTU3NCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhxMFV1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyRERFQzdDMDEwOSI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIcTBWZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hIcTBWdWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISHEwVi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIcTBXT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhxMFdlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIcTBXdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEhxMFctZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIMGs4T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEgwazhlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIMGs4dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEgwazgtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIMGs5T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIMGs5ZWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hIcTBVLWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEhxMFZPZlhFZHVxSG9PSmJVUlpSdyIgeD0iODgzMSIgeT0iMTA0OTAiIHdpZHRoPSIxNzY5IiBoZWlnaHQ9IjE1NzQiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIMGxSZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyQkMiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDBsU09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9ISDBsU2VmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMzY5MSIgaGVpZ2h0PSIxMDMyIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEgwbFN1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDBsUy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIMGxUT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDBsVGVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIMGxUdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDBsVC1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIMGxVT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDBsVWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIMGxVdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDBsVS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISDBsVk9mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9ISDBsUnVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hIMGxSLWZYRWR1cUhvT0piVVJaUnciIHg9IjE1MDciIHk9IjEzMTk5Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDBsVmVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDJEREVDNEUwMEIzIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEgwbFdPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEgwbFdlZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIMGxXdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEgwbFctZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDBsWE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEgwbFhlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISDBsWHVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEgwbFgtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISDBsWU9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEgwbFllZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISDBsWXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEgwbFktZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEgwbFpPZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEgwbFZ1ZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISDBsVi1mWEVkdXFIb09KYlVSWlJ3IiB4PSIxMTIyNiIgeT0iNTA0NiIgd2lkdGg9IjMwOTUiIGhlaWdodD0iMTkwNSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEgwbGJ1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyRERGMUM0MDMzMyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIMGxjZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hIMGxjdWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDBsYy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIMGxkT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEgwbGRlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIMGxkdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEgwbGQtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIMGxlT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEgwbGVlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIMGxldWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEgwbGUtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIMGxmT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIMGxmZWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hIMGxiLWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEgwbGNPZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTE2NzUiIHk9IjgzMzEiIHdpZHRoPSIxODI3IiBoZWlnaHQ9IjEyMTkiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIOXZJLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MkRERUEwNTAwMDgiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDl2SnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9ISDl2Si1mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMjAxNSIgaGVpZ2h0PSI4OTciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDl2S09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIOXZLZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEg5dkt1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIOXZLLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEg5dkxPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIOXZMZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEg5dkx1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIOXZMLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEg5dk1PZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIOXZNZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIOXZNdWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hIOXZKT2ZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEg5dkplZlhFZHVxSG9PSmJVUlpSdyIgeD0iNzEyMCIgeT0iMTMyNjciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MRGlhZ3JhbVN0eWxlIiB4bWk6aWQ9Il9HdlBGMGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hIcTBMLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MkRERUMyNTAwM0MiIHNvdXJjZT0iX0hIcTBILWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hIcTBELWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISHEwTXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIcTBOT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISHEwTmVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEhxME0tZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIcTBOdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MkRERUMyNTAyNDUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIcTBPT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hIcTBOLWZYRWR1cUhvT0piVVJaUnciIHg9Ii0zOTYiIHk9IjM0MyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIcTBPZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDJEREVDMjUwMjQ1Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISHEwTy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEhxME91ZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTk4NCIgeT0iOTc1Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhxMFBPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDJEREVDMjUwMjNCIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISHEwUHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hIcTBQZWZYRWR1cUhvT0piVVJaUnciIHg9IjI4MCIgeT0iLTMwNSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIcTBQLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MkRERUMyNTAyM0IiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIcTBRZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hIcTBRT2ZYRWR1cUhvT0piVVJaUnciIHg9Ii0xOCIgeT0iMjI3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhxMFF1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyRERFQzI1MDI0NSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhxMFJPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEhxMFJlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEhxMFEtZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIcTBSdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyRERFQzI1MDIzQiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhxMFNPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEhxMFNlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEhxMFItZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIcTBTdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDJEREVDMjUwMjQ1Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISHEwVE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISHEwVGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISHEwUy1mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhxMFR1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyRERFQzI1MDIzQiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhxMFVPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISHEwVWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISHEwVC1mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEhxME1PZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9ISHEwTWVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9Ils2NzcsIC03OTUsIDM2MjMsIDcyODFdJFs2NzcsIC04MjIxLCAzNjIzLCAtMTQzXSRbLTExMDAsIC04MjIxLCAxODQ1LCAtMTQzXSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEgwazl1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyRERFRUUxMDM4QyIgc291cmNlPSJfSEhxejhPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEhxMFV1ZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIMGstZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEgway0tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIMGtfT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISDBrLXVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEgwazktZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hIMGstT2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0yMDMsIC00NTcsIDg2MywgMTk4MV0kWy03MjgsIC0xNjUxLCAzMzgsIDc4N10iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEgwa19lZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hIMGtfdWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEgwa18tZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyRERFRjhCMDE5QiIgc291cmNlPSJfSEhxMFV1ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEhxMEgtZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIMGxBdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEgwbEJPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIMGxCZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISDBsQS1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEgwbEJ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyRERFRjhDMDE0RCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEgwbENPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEgwbEItZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTQ0NSIgeT0iLTIwNCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIMGxDZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDJEREVGOEMwMTREIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDBsQy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEgwbEN1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTgyIiB5PSIyMTEiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDBsRE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MkRERUY4QzAxNDMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIMGxEdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEgwbERlZlhFZHVxSG9PSmJVUlpSdyIgeD0iNDAzIiB5PSItMTc4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEgwbEQtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyRERFRjhDMDE0MyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEgwbEVlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEgwbEVPZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTE1NiIgeT0iMjExIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEgwbEV1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyRERFRjhDMDE0RCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEgwbEZPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEgwbEZlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEgwbEUtZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIMGxGdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyRERFRjhDMDE0MyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEgwbEdPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEgwbEdlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEgwbEYtZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIMGxHdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDJEREVGOEMwMTREIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDBsSE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISDBsSGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISDBsRy1mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEgwbEh1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyRERFRjhDMDE0MyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEgwbElPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISDBsSWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISDBsSC1mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEgwbEFPZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9ISDBsQWVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9Ils3ODcsIC01NTgsIC00OTAyLCAtNTU4XSRbNDc2NiwgLTU1OCwgLTkyMiwgLTU1OF0iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hIMGxJdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MkRERUY5NDAzQkIiIHNvdXJjZT0iX0hIcTBVdWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hIcTBILWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDBsSmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIMGxKLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDBsS09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEgwbEp1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIMGxLZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MkRERUY5NTAzNUEiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIMGxLLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hIMGxLdWZYRWR1cUhvT0piVVJaUnciIHg9Ii0zOTQiIHk9IjI0NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIMGxMT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDJEREVGOTUwMzVBIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDBsTHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEgwbExlZlhFZHVxSG9PSmJVUlpSdyIgeD0iODAiIHk9Ii0yMjgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDBsTC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MkRERUY5NTAzNTgiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIMGxNZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEgwbE1PZlhFZHVxSG9PSmJVUlpSdyIgeD0iMzY5IiB5PSIyNzEiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDBsTXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDJEREVGOTUwMzU4Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDBsTk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISDBsTS1mWEVkdXFIb09KYlVSWlJ3IiB4PSItMjE1IiB5PSItMjI4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEgwbE5lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyRERFRjk1MDM1QSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEgwbE4tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEgwbE9PZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEgwbE51ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIMGxPZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyRERFRjk1MDM1OCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEgwbE8tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEgwbFBPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEgwbE91ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIMGxQZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDJEREVGOTUwMzVBIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDBsUC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISDBsUU9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISDBsUHVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEgwbFFlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyRERFRjk1MDM1OCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEgwbFEtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISDBsUk9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISDBsUXVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEgwbEktZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9ISDBsSk9mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9Ils3OTQsIDU1NSwgLTQ4OTUsIDU1NV0kWzQ3NjMsIDU1NSwgLTkyNiwgNTU1XSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEgwbFplZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyRERFQzY4MDA5MiIgc291cmNlPSJfSEgwbFZlZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEhxMEQtZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIMGxhT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEgwbGF1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIMGxhLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISDBsYWVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEgwbFp1ZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9ISDBsWi1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlswLCAtOTQ4LCAtNTAsIDE4NDVdJFswLCAtMjI4NiwgLTUwLCA1MDhdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hIMGxiT2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9ISDBsYmVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hIMGxmdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MkRERUVGMTAwNzgiIHNvdXJjZT0iX0hIMGxidWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hIcTBILWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDBsZ2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIMGxnLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDBsaE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEgwbGd1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIMGxoZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MkRERUVGMTAyRkEiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIMGxoLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hIMGxodWZYRWR1cUhvT0piVVJaUnciIHg9IjIxOCIgeT0iMjk3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEgwbGlPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MkRERUVGMTAyRkEiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIMGxpdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISDBsaWVmWEVkdXFIb09KYlVSWlJ3IiB4PSI2NTgiIHk9Ii0yOTYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDBsaS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MkRERUVGMTAyRjgiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIMGxqZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEgwbGpPZlhFZHVxSG9PSmJVUlpSdyIgeD0iNjIiIHk9Ii0xNTMiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDBsanVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDJEREVFRjEwMkY4Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDBsa09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISDBsai1mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDA2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEgwbGtlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyRERFRUYxMDJGQSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEgwbGstZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEgwbGxPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEgwbGt1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIMGxsZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyRERFRUYxMDJGOCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEgwbGwtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEgwbG1PZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEgwbGx1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIMGxtZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDJEREVFRjEwMkZBIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDBsbS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISDBsbk9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISDBsbXVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEgwbG5lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyRERFRUYxMDJGOCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEgwbG4tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISDBsb09mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISDBsbnVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEgwbGYtZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9ISDBsZ09mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9Ils4MjEsIDU5LCAtMjE3NSwgLTIyNzddJFsyODUzLCA1OSwgLTE0MywgLTIyNzddJFsyODUzLCAxNTQ5LCAtMTQzLCAtNzg3XSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEgwbG9lZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyRERFRUVFMDE2NCIgc291cmNlPSJfSEgwbGJ1ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEhxMFV1ZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIOXU0T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEg5dTR1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIOXU0LWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISDl1NGVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEg5dTVPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyRERFRUVFMDM5NiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEg5dTV1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEg5dTVlZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTY1IiB5PSItMzA2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEg5dTUtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MkRERUVFRTAzOTYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIOXU2ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISDl1Nk9mWEVkdXFIb09KYlVSWlJ3IiB4PSI3ODUiIHk9IjIxOSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIOXU2dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyRERFRUVFMDM5NCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEg5dTdPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISDl1Ni1mWEVkdXFIb09KYlVSWlJ3IiB4PSIyMDAiIHk9IjEzNSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIOXU3ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MkRERUVFRTAzOTQiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIOXU3LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hIOXU3dWZYRWR1cUhvT0piVVJaUnciIHg9IjEzMiIgeT0iLTcxNCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIOXU4T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MkRERUVFRTAzOTYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIOXU4dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIOXU4LWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hIOXU4ZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDl1OU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MkRERUVFRTAzOTQiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIOXU5dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIOXU5LWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hIOXU5ZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDl1LU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyRERFRUVFMDM5NiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEg5dS11ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEg5dS0tZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEg5dS1lZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIOXVfT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MkRERUVFRTAzOTQiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIOXVfdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEg5dV8tZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEg5dV9lZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hIMGxvdWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEgwbG8tZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTkyNiwgMjEyLCAxODc5LCAtMjE0M10kWy0zMDY5LCAyMTIsIC0yNjQsIC0yMTQzXSRbLTMwNjksIDE1NjEsIC0yNjQsIC03OTRdIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9ISDl2QU9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDJEREYxRkQwMTAwIiBzb3VyY2U9Il9ISDBsVmVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9ISDBsYnVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEg5dkEtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDl2QmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEg5dkJ1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hIOXZCT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDl2Qi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDJEREYxRkUwMEU3Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDl2Q2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISDl2Q09mWEVkdXFIb09KYlVSWlJ3IiB4PSIzNzYiIHk9IjM4MSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIOXZDdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDJEREYxRkUwMEU3Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDl2RE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEg5dkMtZlhFZHVxSG9PSmJVUlpSdyIgeD0iMjY0IiB5PSItMTEzNyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIOXZEZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyRERGMUZFMDBFNSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEg5dkQtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISDl2RHVmWEVkdXFIb09KYlVSWlJ3IiB4PSItMTAiIHk9IjM0NyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIOXZFT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MkRERjFGRTAwRTUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIOXZFdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hIOXZFZWZYRWR1cUhvT0piVVJaUnciIHg9Ii01MyIgeT0iLTc2NyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIOXZFLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MkRERjFGRTAwRTciPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIOXZGZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIOXZGdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hIOXZGT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDl2Ri1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MkRERjFGRTAwRTUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIOXZHZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIOXZHdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hIOXZHT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDl2Ry1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyRERGMUZFMDBFNyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEg5dkhlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEg5dkh1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEg5dkhPZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIOXZILWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MkRERjFGRTAwRTUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIOXZJZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEg5dkl1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEg5dklPZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hIOXZBZWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEg5dkF1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMjEyLCA5NTMsIDEwNiwgLTE5ODRdJFsyMTIsIDIzMjgsIDEwNiwgLTYwOV0iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hIOXZNLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MkRERUVERjAxMTIiIHNvdXJjZT0iX0hIOXZJLWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hIcTBVdWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDl2TnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIOXZPT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDl2T2VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEg5dk4tZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hIOXZOT2ZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9ISDl2TmVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlszMDQsIC00NTcsIC0xMzcxLCAxOTgxXSRbMTExNywgLTE2NTEsIC01NTgsIDc4N10iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEg5dk91ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hIOXZPLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEg5dlBPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyRERFQzIxMDJENSIgc291cmNlPSJfSEg5dkktZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEgwbFJlZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIOXZQLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEg5dlFlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIOXZRdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISDl2UU9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEg5dlEtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyRERFQzIyMDE4QyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEg5dlJlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEg5dlJPZlhFZHVxSG9PSmJVUlpSdyIgeT0iMzk2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEg5dlJ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MkRERUMyMjAxOEMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIOXZTT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISDl2Ui1mWEVkdXFIb09KYlVSWlJ3IiB4PSI4MyIgeT0iLTI4NyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIOXZTZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyRERFQzIyMDE4MiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEg5dlMtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISDl2U3VmWEVkdXFIb09KYlVSWlJ3IiB4PSItMTM1IiB5PSItMjk2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEg5dlRPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyRERFQzIyMDE4MiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEg5dlR1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEg5dlRlZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTMxMSIgeT0iNTk4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEg5dlQtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyRERFQzIyMDE4QyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEg5dlVlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEg5dlV1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEg5dlVPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIOXZVLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyRERFQzIyMDE4MiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEg5dlZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEg5dlZ1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEg5dlZPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIOXZWLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDJEREVDMjIwMThDIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDl2V2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISDl2V3VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISDl2V09mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEg5dlctZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyRERFQzIyMDE4MiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEg5dlhlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISDl2WHVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISDl2WE9mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEg5dlBlZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hIOXZQdWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0xMDE2LCAwLCAzNzU5LCAwXSRbLTI5MjksIDAsIDE4NDUsIDBdIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9ISDl2WC1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDJEREYxMzkwMTg2IiBzb3VyY2U9Il9ISDl2SS1mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9ISDBsVmVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEg5dll1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDl2Wk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEg5dlplZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hIOXZZLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDl2WnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDJEREYxM0EwMzYwIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDl2YU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISDl2Wi1mWEVkdXFIb09KYlVSWlJ3IiB4PSItOTMzIiB5PSItMjgzIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEg5dmFlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MkRERjEzQTAzNjAiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIOXZhLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISDl2YXVmWEVkdXFIb09KYlVSWlJ3IiB4PSItNDIzIiB5PSItMTY0MSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIOXZiT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyRERGMTNBMDM1RSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEg5dmJ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISDl2YmVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxMTM2IiB5PSIzMzAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDl2Yi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDJEREYxM0EwMzVFIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDl2Y2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISDl2Y09mWEVkdXFIb09KYlVSWlJ3IiB4PSI0MzMiIHk9Ii0yNDYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDl2Y3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDJEREYxM0EwMzYwIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDl2ZE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISDl2ZGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISDl2Yy1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEg5dmR1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDJEREYxM0EwMzVFIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDl2ZU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISDl2ZWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISDl2ZC1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEg5dmV1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MkRERjEzQTAzNjAiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIOXZmT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIOXZmZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hIOXZlLWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDl2ZnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDJEREYxM0EwMzVFIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDl2Z09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIOXZnZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hIOXZmLWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9ISDl2WU9mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hIOXZZZWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy00NzYsIC0zMTgsIC01MzcxLCA3Mjc2XSRbLTQ3NiwgLTg0NjcsIC01MzcxLCAtODczXSRbMzMzNCwgLTg0NjcsIC0xNTYxLCAtODczXSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEg5dmd1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyRERGMEQ4MDE0MCIgc291cmNlPSJfSEg5dkktZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEgwbGJ1ZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIOXZoZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEg5dmgtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIOXZpT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISDl2aHVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEg5dmllZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyRERGMEQ5MDNENiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEg5dmktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEg5dml1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iMzk2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEg5dmpPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MkRERjBEOTAzRDYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIOXZqdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISDl2amVmWEVkdXFIb09KYlVSWlJ3IiB4PSItNDQ5IiB5PSI0NzYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDl2ai1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MkRERjBEOTAzQ0MiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIOXZrZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEg5dmtPZlhFZHVxSG9PSmJVUlpSdyIgeD0iNzg4IiB5PSIyNTMiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDl2a3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDJEREYwRDkwM0NDIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDl2bE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISDl2ay1mWEVkdXFIb09KYlVSWlJ3IiB4PSItOCIgeT0iLTI0NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIOXZsZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MkRERjBEOTAzRDYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIOXZsLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIOXZtT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hIOXZsdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDl2bWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MkRERjBEOTAzQ0MiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIOXZtLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIOXZuT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hIOXZtdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDl2bmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyRERGMEQ5MDNENiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElIZjRPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSElIZjRlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEg5dm51ZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJSGY0dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MkRERjBEOTAzQ0MiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJSGY1T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSElIZjVlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSElIZjQtZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hIOXZnLWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEg5dmhPZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTE1OSwgLTMxOCwgLTQ4NjksIDQzMzldJFstMTU5LCAtNTYwOSwgLTQ4NjksIC05NTJdJFs0MjYwLCAtNTYwOSwgLTQ1MCwgLTk1Ml0kWzQyNjAsIC01MjY2LCAtNDUwLCAtNjA5XSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgPC9jb250ZW50cz4KLSAgICAgICAgICAgIDxjb250ZW50cyB4bWk6dHlwZT0ibm90YXRpb246RGlhZ3JhbSIgeG1pOmlkPSJfQ25RNWtPeG1FZHV3T2JrSUE2eDFnQSIgdHlwZT0iQ2xhc3MiIG5hbWU9IlRheG9ub215Ij4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0U3MDlNT3htRWR1d09ia0lBNngxZ0EiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyODAiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9FNzA5TS14bUVkdXdPYmtJQTZ4MWdBIiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9FNzA5Tk94bUVkdXdPYmtJQTZ4MWdBIiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRTcwOU5leG1FZHV3T2JrSUE2eDFnQSIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9FNzA5TnV4bUVkdXdPYmtJQTZ4MWdBIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0U3MDlOLXhtRWR1d09ia0lBNngxZ0EiIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9FNzA5T094bUVkdXdPYmtJQTZ4MWdBIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0U3MDlPZXhtRWR1d09ia0lBNngxZ0EiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9FNzA5T3V4bUVkdXdPYmtJQTZ4MWdBIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0U3MDlPLXhtRWR1d09ia0lBNngxZ0EiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9FNzA5UE94bUVkdXdPYmtJQTZ4MWdBIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0U3MDlQZXhtRWR1d09ia0lBNngxZ0EiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9FNzA5UHV4bUVkdXdPYmtJQTZ4MWdBIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9FNzA5UC14bUVkdXdPYmtJQTZ4MWdBIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9FNzA5TWV4bUVkdXdPYmtJQTZ4MWdBIiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93UGFyZW50PSJOYW1lIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0U3MDlNdXhtRWR1d09ia0lBNngxZ0EiIHg9Ijg0MTIiIHk9IjcxNCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR0FGUGdPeG1FZHV3T2JrSUE2eDFnQSIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyRERFQzRFMDBCMyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dBRlBnLXhtRWR1d09ia0lBNngxZ0EiIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0dBRlBoT3htRWR1d09ia0lBNngxZ0EiIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HQUZQaGV4bUVkdXdPYmtJQTZ4MWdBIiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dBRlBodXhtRWR1d09ia0lBNngxZ0EiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR0FGUGgteG1FZHV3T2JrSUE2eDFnQSIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dBRlBpT3htRWR1d09ia0lBNngxZ0EiIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfR0FGUGlleG1FZHV3T2JrSUE2eDFnQSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dBRlBpdXhtRWR1d09ia0lBNngxZ0EiIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfR0FGUGkteG1FZHV3T2JrSUE2eDFnQSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dBRlBqT3htRWR1d09ia0lBNngxZ0EiIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfR0FGUGpleG1FZHV3T2JrSUE2eDFnQSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dBRlBqdXhtRWR1d09ia0lBNngxZ0EiIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0dBRlBqLXhtRWR1d09ia0lBNngxZ0EiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0dBRlBnZXhtRWR1d09ia0lBNngxZ0EiIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfR0FGUGd1eG1FZHV3T2JrSUE2eDFnQSIgeD0iNDU3NiIgeT0iNTc0MSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSXRodE1PeG1FZHV3T2JrSUE2eDFnQSIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E4MkQzMDE3RiI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0l0aHRNLXhtRWR1d09ia0lBNngxZ0EiIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0l0aHROT3htRWR1d09ia0lBNngxZ0EiIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9JdGh0TmV4bUVkdXdPYmtJQTZ4MWdBIiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0l0aHROdXhtRWR1d09ia0lBNngxZ0EiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSXRodE4teG1FZHV3T2JrSUE2eDFnQSIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0l0aHRPT3htRWR1d09ia0lBNngxZ0EiIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSXRodE9leG1FZHV3T2JrSUE2eDFnQSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0l0aHRPdXhtRWR1d09ia0lBNngxZ0EiIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSXRodE8teG1FZHV3T2JrSUE2eDFnQSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0l0aHRQT3htRWR1d09ia0lBNngxZ0EiIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSXRodFBleG1FZHV3T2JrSUE2eDFnQSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0l0aHRQdXhtRWR1d09ia0lBNngxZ0EiIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0l0aHRQLXhtRWR1d09ia0lBNngxZ0EiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0l0aHRNZXhtRWR1d09ia0lBNngxZ0EiIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSXRodE11eG1FZHV3T2JrSUE2eDFnQSIgeD0iNDQ2OSIgeT0iMzM4NSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfTGVRSVlPeG1FZHV3T2JrSUE2eDFnQSIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyRERGMUM0MDMzMyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0xlUUlZLXhtRWR1d09ia0lBNngxZ0EiIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0xlUUlaT3htRWR1d09ia0lBNngxZ0EiIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9MZVFJWmV4bUVkdXdPYmtJQTZ4MWdBIiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0xlUUladXhtRWR1d09ia0lBNngxZ0EiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfTGVRSVoteG1FZHV3T2JrSUE2eDFnQSIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0xlUUlhT3htRWR1d09ia0lBNngxZ0EiIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfTGVRSWFleG1FZHV3T2JrSUE2eDFnQSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0xlUUlhdXhtRWR1d09ia0lBNngxZ0EiIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfTGVRSWEteG1FZHV3T2JrSUE2eDFnQSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0xlUUliT3htRWR1d09ia0lBNngxZ0EiIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfTGVRSWJleG1FZHV3T2JrSUE2eDFnQSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0xlUUlidXhtRWR1d09ia0lBNngxZ0EiIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0xlUUliLXhtRWR1d09ia0lBNngxZ0EiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0xlUUlZZXhtRWR1d09ia0lBNngxZ0EiIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfTGVRSVl1eG1FZHV3T2JrSUE2eDFnQSIgeD0iMTA4NzIiIHk9IjMzODUiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX1JxeDhFT3htRWR1d09ia0lBNngxZ0EiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MkRERUFDMzAxQTUiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ScXg4RS14bUVkdXdPYmtJQTZ4MWdBIiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9ScXg4Rk94bUVkdXdPYmtJQTZ4MWdBIiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfUnF4OEZleG1FZHV3T2JrSUE2eDFnQSIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ScXg4RnV4bUVkdXdPYmtJQTZ4MWdBIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX1JxeDhGLXhtRWR1d09ia0lBNngxZ0EiIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ScXg4R094bUVkdXdPYmtJQTZ4MWdBIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX1JxeDhHZXhtRWR1d09ia0lBNngxZ0EiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ScXg4R3V4bUVkdXdPYmtJQTZ4MWdBIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX1JxeDhHLXhtRWR1d09ia0lBNngxZ0EiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ScXg4SE94bUVkdXdPYmtJQTZ4MWdBIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX1JxeDhIZXhtRWR1d09ia0lBNngxZ0EiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ScXg4SHV4bUVkdXdPYmtJQTZ4MWdBIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ScXg4SC14bUVkdXdPYmtJQTZ4MWdBIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9ScXg4RWV4bUVkdXdPYmtJQTZ4MWdBIiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX1JxeDhFdXhtRWR1d09ia0lBNngxZ0EiIHg9IjgwOTYiIHk9IjMzNjAiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX1RRc3hBT3htRWR1d09ia0lBNngxZ0EiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MkRERUM3QzAxMDkiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9UUXN4QS14bUVkdXdPYmtJQTZ4MWdBIiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9UUXN4Qk94bUVkdXdPYmtJQTZ4MWdBIiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfVFFzeEJleG1FZHV3T2JrSUE2eDFnQSIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9UUXN4QnV4bUVkdXdPYmtJQTZ4MWdBIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX1RRc3hCLXhtRWR1d09ia0lBNngxZ0EiIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9UUXN4Q094bUVkdXdPYmtJQTZ4MWdBIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX1RRc3hDZXhtRWR1d09ia0lBNngxZ0EiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9UUXN4Q3V4bUVkdXdPYmtJQTZ4MWdBIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX1RRc3hDLXhtRWR1d09ia0lBNngxZ0EiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9UUXN4RE94bUVkdXdPYmtJQTZ4MWdBIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX1RRc3hEZXhtRWR1d09ia0lBNngxZ0EiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9UUXN4RHV4bUVkdXdPYmtJQTZ4MWdBIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9UUXN4RC14bUVkdXdPYmtJQTZ4MWdBIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9UUXN4QWV4bUVkdXdPYmtJQTZ4MWdBIiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX1RRc3hBdXhtRWR1d09ia0lBNngxZ0EiIHg9IjEzMTQ4IiB5PSIzMzg1Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTERpYWdyYW1TdHlsZSIgeG1pOmlkPSJfQ25RNWtleG1FZHV3T2JrSUE2eDFnQSIvPgotICAgICAgICAgICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9JdGh0UU94bUVkdXdPYmtJQTZ4MWdBIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTgyRjMwMjZFIiBzb3VyY2U9Il9JdGh0TU94bUVkdXdPYmtJQTZ4MWdBIiB0YXJnZXQ9Il9FNzA5TU94bUVkdXdPYmtJQTZ4MWdBIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSXRodFEteG1FZHV3T2JrSUE2eDFnQSIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9JdHJlTU94bUVkdXdPYmtJQTZ4MWdBIiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSXRyZU1leG1FZHV3T2JrSUE2eDFnQSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSXRodFJPeG1FZHV3T2JrSUE2eDFnQSIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0l0aHRRZXhtRWR1d09ia0lBNngxZ0EiIHJvdXRpbmc9IlRyZWUiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9JdGh0UXV4bUVkdXdPYmtJQTZ4MWdBIiBwb2ludHM9IlsyOTEsIC0zMTgsIC0xNTM1LCAxNjE0XSRbMTM3NiwgLTE0NTYsIC00NTAsIDQ3Nl0iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0l0cmVNdXhtRWR1d09ia0lBNngxZ0EiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MkRERUM2ODAwOTIiIHNvdXJjZT0iX0dBRlBnT3htRWR1d09ia0lBNngxZ0EiIHRhcmdldD0iX0l0aHRNT3htRWR1d09ia0lBNngxZ0EiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9JdHJlTmV4bUVkdXdPYmtJQTZ4MWdBIiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0l0cmVOLXhtRWR1d09ia0lBNngxZ0EiIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9JdHJlT094bUVkdXdPYmtJQTZ4MWdBIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9JdHJlTnV4bUVkdXdPYmtJQTZ4MWdBIiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSXRyZU0teG1FZHV3T2JrSUE2eDFnQSIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9JdHJlTk94bUVkdXdPYmtJQTZ4MWdBIiBwb2ludHM9Ils1MywgLTM0MywgNTMsIDIwMzhdJFs1MywgLTIwNjMsIDUzLCAzMThdIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9PT1Bqd2V4bUVkdXdPYmtJQTZ4MWdBIiBlbGVtZW50PSJfT09QandPeG1FZHV3T2JrSUE2eDFnQSIgc291cmNlPSJfTGVRSVlPeG1FZHV3T2JrSUE2eDFnQSIgdGFyZ2V0PSJfRTcwOU1PeG1FZHV3T2JrSUE2eDFnQSI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX09PUGp4T3htRWR1d09ia0lBNngxZ0EiIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfT09Qanh1eG1FZHV3T2JrSUE2eDFnQSIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX09PUGp4LXhtRWR1d09ia0lBNngxZ0EiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX09PUGp4ZXhtRWR1d09ia0lBNngxZ0EiIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9PT1Bqd3V4bUVkdXdPYmtJQTZ4MWdBIiByb3V0aW5nPSJUcmVlIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfT09QancteG1FZHV3T2JrSUE2eDFnQSIgcG9pbnRzPSJbLTQyMywgLTM0NCwgMjU0MCwgMjAxMV0kWy0yMzU1LCAtMTg3OSwgNjA4LCA0NzZdIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9XRUhUMGV4bUVkdXdPYmtJQTZ4MWdBIiBlbGVtZW50PSJfV0VIVDBPeG1FZHV3T2JrSUE2eDFnQSIgc291cmNlPSJfUnF4OEVPeG1FZHV3T2JrSUE2eDFnQSIgdGFyZ2V0PSJfRTcwOU1PeG1FZHV3T2JrSUE2eDFnQSI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX1dFSFQxT3htRWR1d09ia0lBNngxZ0EiIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfV0VIVDF1eG1FZHV3T2JrSUE2eDFnQSIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX1dFSFQxLXhtRWR1d09ia0lBNngxZ0EiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX1dFSFQxZXhtRWR1d09ia0lBNngxZ0EiIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9XRUhUMHV4bUVkdXdPYmtJQTZ4MWdBIiByb3V0aW5nPSJUcmVlIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfV0VIVDAteG1FZHV3T2JrSUE2eDFnQSIgcG9pbnRzPSJbLTc5LCAtMzE3LCAxMDg1LCAzODkwXSRbLTEwMzIsIC0zNzMxLCAxMzIsIDQ3Nl0iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX1dlVnhzZXhtRWR1d09ia0lBNngxZ0EiIGVsZW1lbnQ9Il9XZVZ4c094bUVkdXdPYmtJQTZ4MWdBIiBzb3VyY2U9Il9UUXN4QU94bUVkdXdPYmtJQTZ4MWdBIiB0YXJnZXQ9Il9FNzA5TU94bUVkdXdPYmtJQTZ4MWdBIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfV2VWeHRPeG1FZHV3T2JrSUE2eDFnQSIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9XZVZ4dHV4bUVkdXdPYmtJQTZ4MWdBIiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfV2VWeHQteG1FZHV3T2JrSUE2eDFnQSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfV2VWeHRleG1FZHV3T2JrSUE2eDFnQSIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX1dlVnhzdXhtRWR1d09ia0lBNngxZ0EiIHJvdXRpbmc9IlRyZWUiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9XZVZ4cy14bUVkdXdPYmtJQTZ4MWdBIiBwb2ludHM9IlstMzQ0LCAtMzQ0LCAzOTk1LCAzOTY5XSRbLTM4NjMsIC0zODM3LCA0NzYsIDQ3Nl0iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgIDwvY29udGVudHM+Ci0gICAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICAgICAgPHBhY2thZ2VJbXBvcnQgeG1pOmlkPSJfVVJ6bHNPb1dFZHVPQlBRQTJoS3FVUSIgaW1wb3J0ZWRQYWNrYWdlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjk0Ii8+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MkRERUEwNTAwMDgiIG5hbWU9IlN0YXRlIj4KLSAgICAgICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MkRERUVERjAxMTIiIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0MkRERUM3QzAxMDkiLz4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MkRERUMyMjAxODIiIG5hbWU9IndvcmtQcm9kdWN0IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyQkMiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDJEREVDMjEwMkQ1Ij4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3V5Wl9lZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3V5Wl9PZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IjEiLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDJEREYwRDkwM0NDIiBuYW1lPSJyZWdpb24iIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQyRERGMUM0MDMzMyIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MkRERjBEODAxNDAiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HdkZVNk9mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HdkZVNS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyRERGMTNBMDM1RSIgbmFtZT0ic3VibWFjaGluZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDJEREVDNEUwMEIzIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQyRERGMTM5MDE4NiI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0d2RlU3ZWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0d2RlU3T2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MkRERUFDMzAxQTUiIG5hbWU9IlRyYW5zaXRpb24iPgotICAgICAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX1dFSFQwT3htRWR1d09ia0lBNngxZ0EiIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyODAiLz4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MkRERUMyNTAyM0IiIG5hbWU9IndvcmtEZWZpbml0aW9uIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MjdBODJEMzAxN0YiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDJEREVDMjUwMDNDIj4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3U3ajB1ZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3U3ajBlZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IjEiLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDJEREVFRjEwMkZBIiBuYW1lPSJjb250YWluZXIiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQyRERGMUM0MDMzMyIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MkRERUVGMTAwNzgiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HdkZVMXVmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iMSIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HdkZVMWVmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iMSIvPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MkRERUY4QzAxNEQiIG5hbWU9InNvdXJjZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDJEREVDN0MwMTA5IiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQyRERFRjhCMDE5QiI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0d2RlUzZWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0d2RlUzT2ZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyRERFRjk1MDM1QSIgbmFtZT0idGFyZ2V0IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MkRERUM3QzAxMDkiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDJEREVGOTQwM0JCIj4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3ZGVTVPZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IjEiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3ZGVTQtZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IjEiLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MkRERUM0RTAwQjMiIG5hbWU9IlN0YXRlTWFjaGluZSI+Ci0gICAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDJEREVDNjgwMDkyIiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDI3QTgyRDMwMTdGIi8+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDJEREYxRkUwMEU1IiBuYW1lPSJyZWdpb24iIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQyRERGMUM0MDMzMyIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MkRERjFGRDAxMDAiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HdkZVOU9mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HdkZVOC1mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iMSIvPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyRERFQzdDMDEwOSIgbmFtZT0iVmVydGV4Ij4KLSAgICAgICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il9XZVZ4c094bUVkdXdPYmtJQTZ4MWdBIiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjgwIi8+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDJEREVFRUUwMzk2IiBuYW1lPSJjb250YWluZXIiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQyRERGMUM0MDMzMyIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MkRERUVFRTAxNjQiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HdTdqMnVmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iMSIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HdTdqMmVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyRERFRjhDMDE0MyIgbmFtZT0ib3V0Z29pbmciIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQyRERFQUMzMDFBNSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MkRERUY4QjAxOUIiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HdkZVMnVmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HdkZVMmVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyRERFRjk1MDM1OCIgbmFtZT0iaW5jb21pbmciIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQyRERFQUMzMDFBNSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MkRERUY5NDAzQkIiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HdkZVNGVmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HdkZVNE9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDJEREVDODEwMzIzIiBuYW1lPSJQc2V1ZG9TdGF0ZSI+Ci0gICAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDJEREVFRTEwMzhDIiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDJEREVDN0MwMTA5Ii8+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkVudW1lcmF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MkRERUREQzAzMTgiIG5hbWU9IlBzZXVkb1N0YXRlS2luZCI+Ci0gICAgICAgICAgICA8b3duZWRMaXRlcmFsIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyRERFREY2MDJFRSIgbmFtZT0iaW5pdGlhbCIvPgotICAgICAgICAgICAgPG93bmVkTGl0ZXJhbCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MkRERUUzNDAyODkiIG5hbWU9ImpvaW4iLz4KLSAgICAgICAgICAgIDxvd25lZExpdGVyYWwgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDJEREVFMzkwMkNDIiBuYW1lPSJmb3JrIi8+Ci0gICAgICAgICAgICA8b3duZWRMaXRlcmFsIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyRERFRTNFMDExQSIgbmFtZT0ianVuY3Rpb24iLz4KLSAgICAgICAgICAgIDxvd25lZExpdGVyYWwgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDJEREVFNDQwMUVCIiBuYW1lPSJjaG9pY2UiLz4KLSAgICAgICAgICAgIDxvd25lZExpdGVyYWwgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDJEREVFNDkwMTNFIiBuYW1lPSJlbnRyeVBvaW50Ii8+Ci0gICAgICAgICAgICA8b3duZWRMaXRlcmFsIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyRERFRTUwMDI5MyIgbmFtZT0iZXhpdFBvaW50Ii8+Ci0gICAgICAgICAgICA8b3duZWRMaXRlcmFsIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyRERFRTU2MDA4OSIgbmFtZT0idGVybWluYXRlIi8+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MkRERjFDNDAzMzMiIG5hbWU9IlJlZ2lvbiI+Ci0gICAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfT09QandPeG1FZHV3T2JrSUE2eDFnQSIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI4MCIvPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyRERFRUVFMDM5NCIgbmFtZT0idmVydGV4IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MkRERUM3QzAxMDkiIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDJEREVFRUUwMTY0Ij4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3U3ajEtZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3U3ajF1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MkRERUVGMTAyRjgiIG5hbWU9InRyYW5zaXRpb24iIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQyRERFQUMzMDFBNSIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MkRERUVGMTAwNzgiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HdkZVMC1mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HdkZVMHVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyRERGMEQ5MDNENiIgbmFtZT0ic3RhdGUiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQyRERFQTA1MDAwOCIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MkRERjBEODAxNDAiLz4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MkRERjFGRTAwRTciIG5hbWU9InN0YXRlTWFjaGluZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDJEREVDNEUwMEIzIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQyRERGMUZEMDEwMCI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0d2RlU5LWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0d2RlU5dWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MkRERUMyMTAyRDUiIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQyRERFQzIyMDE4MiBfM0FEQzdCNzQwMjJENDJEREVDMjIwMThDIj4KLSAgICAgICAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MkRERUMyMjAxOEMiIG5hbWU9InN0YXRlIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MkRERUEwNTAwMDgiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDJEREVDMjEwMkQ1Ii8+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MkRERUMyNTAwM0MiIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQyRERFQzI1MDIzQiBfM0FEQzdCNzQwMjJENDJEREVDMjUwMjQ1Ij4KLSAgICAgICAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MkRERUMyNTAyNDUiIG5hbWU9InRyYW5zaXRpb24iIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQyRERFQUMzMDFBNSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MkRERUMyNTAwM0MiLz4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyRERFRUVFMDE2NCIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDJEREVFRUUwMzk0IF8zQURDN0I3NDAyMkQ0MkRERUVFRTAzOTYiLz4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyRERFRUYxMDA3OCIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDJEREVFRjEwMkY4IF8zQURDN0I3NDAyMkQ0MkRERUVGMTAyRkEiLz4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyRERFRjhCMDE5QiIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDJEREVGOEMwMTQzIF8zQURDN0I3NDAyMkQ0MkRERUY4QzAxNEQiLz4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyRERFRjk0MDNCQiIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDJEREVGOTUwMzU4IF8zQURDN0I3NDAyMkQ0MkRERUY5NTAzNUEiLz4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyRERGMEQ4MDE0MCIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDJEREYwRDkwM0NDIF8zQURDN0I3NDAyMkQ0MkRERjBEOTAzRDYiLz4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyRERGMTM5MDE4NiIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDJEREYxM0EwMzVFIF8zQURDN0I3NDAyMkQ0MkRERjEzQTAzNjAiPgotICAgICAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyRERGMTNBMDM2MCIgbmFtZT0ic3ViTWFjaGluZVN0YXRlIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MkRERUEwNTAwMDgiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDJEREYxMzkwMTg2Ij4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3ZGVThPZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3ZGVTctZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEVuZD4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyRERGMUZEMDEwMCIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDJEREYxRkUwMEU1IF8zQURDN0I3NDAyMkQ0MkRERjFGRTAwRTciLz4KLSAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpQYWNrYWdlIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1NzAwM0IiIG5hbWU9Ik1ldGhvZExpYnJhcnkiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iX0d3YllwdWZYRWR1cUhvT0piVVJaUnciIHNvdXJjZT0idW1sMi5kaWFncmFtcyIgcmVmZXJlbmNlcz0iXzNBREM3Qjc0MDIyRDQxRkZEQTI1MDBGRCI+Ci0gICAgICAgICAgPGNvbnRlbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpEaWFncmFtIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MUZGREEyNTAwRkQiIHR5cGU9IkNsYXNzIiBuYW1lPSJNYWluIj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IS0Raa09mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFGRUREQjYwMzA2Ij4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLRFprLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IS0RabE9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IS0RabGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IS0RabHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IS0RabC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLRFptT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJQYWNrYWdlQ29udGVudHMiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEtEWm1lZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIgY29sbGFwc2VkPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hLRFprZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iTm9uZSIgc2hvd0xpc3RWaXNpYmlsaXR5PSJOb25lIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hLRFprdWZYRWR1cUhvT0piVVJaUnciIHg9IjQzODEiIHk9IjQ3NDkiIHdpZHRoPSI0Mjg0IiBoZWlnaHQ9IjE2NzYiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEtEWm11ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRkVEQjM4MDExRSI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IS0RabmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEtEWm51ZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEtEWm4tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEtEWm9PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEtEWm9lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IS0Rab3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iUGFja2FnZUNvbnRlbnRzIj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hLRFpvLWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiIGNvbGxhcHNlZD0idHJ1ZSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IS0RabS1mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9Ik5vbmUiIHNob3dMaXN0VmlzaWJpbGl0eT0iTm9uZSIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IS0Rabk9mWEVkdXFIb09KYlVSWlJ3IiB4PSI0MzgxIiB5PSIxNDUxIiB3aWR0aD0iNDI4NCIgaGVpZ2h0PSIxNjc2Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iXy1fVDZjT3h3RWR1TTE0dW5XYXFQNVEiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTUxRTk5NjAwOUQiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfLV9UNmMteHdFZHVNMTR1bldhcVA1USIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iXy1fVDZkT3h3RWR1TTE0dW5XYXFQNVEiIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iXy1fVDZkZXh3RWR1TTE0dW5XYXFQNVEiIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iXy1fVDZkdXh3RWR1TTE0dW5XYXFQNVEiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iXy1fVDZkLXh3RWR1TTE0dW5XYXFQNVEiIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfLV9UNmVPeHdFZHVNMTR1bldhcVA1USIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlBhY2thZ2VDb250ZW50cyI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il8tX1Q2ZWV4d0VkdU0xNHVuV2FxUDVRIiBjYW5vbmljYWw9ImZhbHNlIiBjb2xsYXBzZWQ9InRydWUiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfLV9UNmNleHdFZHVNMTR1bldhcVA1USIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfLV9UNmN1eHdFZHVNMTR1bldhcVA1USIgeD0iMTQ1MyIgeT0iODA0MSIgd2lkdGg9IjQyODQiIGhlaWdodD0iMTY3NiIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9MQXF6Z094eEVkdU0xNHVuV2FxUDVRIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMEZCIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0xBcXpnLXh4RWR1TTE0dW5XYXFQNVEiIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9MQXF6aE94eEVkdU0xNHVuV2FxUDVRIiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9MQXF6aGV4eEVkdU0xNHVuV2FxUDVRIiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9MQXF6aHV4eEVkdU0xNHVuV2FxUDVRIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9MQXF6aC14eEVkdU0xNHVuV2FxUDVRIiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0xBcXppT3h4RWR1TTE0dW5XYXFQNVEiIHZpc2libGU9ImZhbHNlIiB0eXBlPSJQYWNrYWdlQ29udGVudHMiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfTEFxemlleHhFZHVNMTR1bldhcVA1USIgY2Fub25pY2FsPSJmYWxzZSIgY29sbGFwc2VkPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0xBcXpnZXh4RWR1TTE0dW5XYXFQNVEiIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0xBcXpndXh4RWR1TTE0dW5XYXFQNVEiIHg9IjczNTQiIHk9IjgwNDAiIHdpZHRoPSI0Mjg0IiBoZWlnaHQ9IjE2NzYiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxEaWFncmFtU3R5bGUiIHhtaTppZD0iX0d3YllxT2ZYRWR1cUhvT0piVVJaUnciIGRlc2NyaXB0aW9uPSJUaGUgTWV0aG9kIExpYnJhcnkgcGFja2FnZSBkZWZpbmVzIGNhcGFiaWxpdGllcyBhcm91bmQgbWFuYWdpbmcgd2hvbGUgbGlicmFyaWVzIG9mIE1ldGhvZCBDb250ZW50IGFuZCBQcm9jZXNzZXMuICBJdCBhZGRyZXNzZXMgcmVxdWlyZW1lbnRzIGFyb3VuZCBwaHlzaWNhbGx5IHNlcGFyYXRpbmcgZGVzY3JpcHRpb25zIG9mIENvbnRlbnQgRWxlbWVudHMgZnJvbSB0aGVpciBtb2RlbGVkIHJlbGF0aW9uc2hpcHMgZGVmaW5pbmcgc2VwYXJhdGUgdW5pdHMgb2YgY29udHJvbC4gIEl0IGFsc28gYWRkcmVzc2VzIHRoZSBjb25jZXJuIG9mIHNjYWxpbmcgdG8gbGFyZ2UgTWV0aG9kIExpYnJhcmllcyBieSBkZWZpbmluZyBNZXRob2QgQ29uZmlndXJhdGlvbnMgdGhhdCBkZWZpbmUgdmlzaWJpbGl0eSBzcGFjZXMgb3Igd29ya2luZyBzZXRzIGZvciBNZXRob2QgQ29udGVudCBhbmQgUHJvY2VzcyBhbGxvd2luZyBhIFByb2Nlc3MgRW5naW5lZXIgdG8gZm9jdXMgb24gcmVsZXZhbnQgcGFydHMgb2YgTGlicmFyeSBpbnN0ZWFkIG9mIHNlZWluZyB0aGUgd2hvbGUgbGlicmFyeSBhbGwgYXQgb25jZS4gIEJ5IGRlZmluaW5nIENvbmZpZ3VyYXRpb25zIGFzIHN1YnNldHMgb2YgUGx1Z2lucyBhbmQgTWV0aG9kIFBhY2thZ2VzIHRoYXQgc2hhbGwgYmUgY29uc2lkZXJlZCBmb3IgcHJvY2VzcyBhdXRob3Jpbmcgb25seSwgQ29uZmlndXJhdGlvbnMgYWxzbyBkZWZpbmUgdGhlIHNwYWNlIG9mIHZhcmlhYmlsaXR5IGludGVycHJldGF0aW9uIHRvIGF2b2lkIGNvbmZsaWN0cyBhbW9uZ3N0ICdjb21wZXRpbmcnIGNvbnRlbnQgKGUuZy4gY29udGVudCB0aGF0IHJlcGxhY2VzIHRoZSBzYW1lIGVsZW1lbnRzKS4iLz4KLSAgICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4KLSAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9BX19fb2V4TUVkdU9Ock1SZ216NDhBIiBlbGVtZW50PSJfQV9fX29PeE1FZHVPTnJNUmdtejQ4QSIgc291cmNlPSJfSEtEWm11ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEtEWmtPZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9BX19fcE94TUVkdU9Ock1SZ216NDhBIiB0eXBlPSJLaW5kTGFiZWwiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9BX19fcHV4TUVkdU9Ock1SZ216NDhBIiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0FfX19xT3hNRWR1T05yTVJnbXo0OEEiIHR5cGU9IktpbmQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfQV9fX3AteE1FZHVPTnJNUmdtejQ4QSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0FfX19wZXhNRWR1T05yTVJnbXo0OEEiIHk9Ii01MzAiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0FfX19vdXhNRWR1T05yTVJnbXo0OEEiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfQV9fX28teE1FZHVPTnJNUmdtejQ4QSIgcG9pbnRzPSJbLTE0LCA4NjAsIC0xNCwgLTI0MzVdJFstMTQsIDI0NDgsIC0xNCwgLTg0N10iLz4KLSAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfTEFxemtleHhFZHVNMTR1bldhcVA1USIgZWxlbWVudD0iX0dOa0I4T3hTRWR1T05yTVJnbXo0OEEiIHNvdXJjZT0iX0hLRFprT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0xBcXpnT3h4RWR1TTE0dW5XYXFQNVEiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfTEFxemxPeHhFZHVNMTR1bldhcVA1USIgdHlwZT0iS2luZExhYmVsIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfTEFxemx1eHhFZHVNMTR1bldhcVA1USIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9MQXF6bU94eEVkdU0xNHVuV2FxUDVRIiB0eXBlPSJLaW5kIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0xBcXpsLXh4RWR1TTE0dW5XYXFQNVEiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9MQXF6bGV4eEVkdU0xNHVuV2FxUDVRIiB4PSI0MjQiIHk9Ii02NDUiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0xBcXprdXh4RWR1TTE0dW5XYXFQNVEiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfTEFxemsteHhFZHVNMTR1bldhcVA1USIgcG9pbnRzPSJbLTE0LCA4NDYsIC0yOTc3LCAtMjQ0N10kWzI5NTAsIDI0MzMsIC0xMywgLTg2MF0iLz4KLSAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfUmNxZk1leDBFZHU1LXZWamxmVnNmUSIgZWxlbWVudD0iX1JjcWZNT3gwRWR1NS12VmpsZlZzZlEiIHNvdXJjZT0iX0hLRFprT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iXy1fVDZjT3h3RWR1TTE0dW5XYXFQNVEiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfUmN6cElPeDBFZHU1LXZWamxmVnNmUSIgdHlwZT0iS2luZExhYmVsIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfUmN6cEl1eDBFZHU1LXZWamxmVnNmUSIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9SY3pwSk94MEVkdTUtdlZqbGZWc2ZRIiB0eXBlPSJLaW5kIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX1JjenBJLXgwRWR1NS12VmpsZlZzZlEiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9SY3pwSWV4MEVkdTUtdlZqbGZWc2ZRIiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9SY3FmTXV4MEVkdTUtdlZqbGZWc2ZRIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX1JjcWZNLXgwRWR1NS12VmpsZlZzZlEiIHBvaW50cz0iWy0yMywgMzIsIDg4LCAtOTJdJFstODcsIDE1NywgMjQsIDMzXSIvPgotICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICA8L2NvbnRlbnRzPgotICAgICAgICAgIDxjb250ZW50cyB4bWk6dHlwZT0ibm90YXRpb246RGlhZ3JhbSIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDFGREQ1NTEwMzdDIiB0eXBlPSJDbGFzcyIgbmFtZT0iVGF4b25vbXkiPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLRFpyZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyODAiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEtEWnNPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hLRFpzZWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIzMTE1IiBoZWlnaHQ9IjExMTciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLRFpzdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLRFpzLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLRFp0T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEtEWnRlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEtEWnR1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEtEWnQtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEtEWnVPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEtEWnVlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEtEWnV1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEtEWnUtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hLRFp2T2ZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEtEWnJ1ZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEtEWnItZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTI5MjAiIHk9IjEwMTYiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEtEWnZlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRkVEODgxMDFCNSI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IS0Rad09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEtEWndlZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjI0NzIiIGhlaWdodD0iMTA0OSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEtEWnd1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEtEWnctZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEtEWnhPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IS0RaeGVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IS0RaeHVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IS0RaeC1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IS0RaeU9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IS0RaeWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IS0RaeXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IS0RaeS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEtEWnpPZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IS0RadnVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IS0Radi1mWEVkdXFIb09KYlVSWlJ3IiB4PSIzMDgxIiB5PSIzNDM3Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLRFoxdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RDAzQUIiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEtEWjJlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hLRFoydWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIzNjA2IiBoZWlnaHQ9IjEwMzIiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLRFoyLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLRFozT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLRFozZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEtEWjN1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEtEWjMtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEtEWjRPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEtEWjRlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEtEWjR1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEtEWjQtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEtEWjVPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hLRFo1ZWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEtEWjEtZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEtEWjJPZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTc3NTQiIHk9IjU3ODIiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEtEWjV1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRkVERTc1MDA0RSI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IS0RaNmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEtEWjZ1ZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjI1NzMiIGhlaWdodD0iMTAzMiIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEtEWjYtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEtEWjdPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEtEWjdlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IS0RaN3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IS0RaNy1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IS0RaOE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IS0RaOGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IS0RaOHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IS0RaOC1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IS0RaOU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEtEWjllZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IS0RaNS1mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93UGFyZW50PSJOYW1lIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IS0RaNk9mWEVkdXFIb09KYlVSWlJ3IiB4PSI3NjAzIiB5PSI3OTY3Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLTktrT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUZFREU4MDAyNTIiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEtOS2stZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hLTktsT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIzNDM3IiBoZWlnaHQ9IjEwMzIiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLTktsZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLTktsdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLTktsLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEtOS21PZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEtOS21lZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEtOS211ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEtOS20tZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEtOS25PZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEtOS25lZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEtOS251ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hLTktuLWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEtOS2tlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEtOS2t1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMjU5OSIgeT0iNTc4MiIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IS05LcWVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFEREZBMzYwMkMxIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLTktyT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IS05LcmVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMjIxOCIgaGVpZ2h0PSIxMDMyIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IS05LcnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IS05Lci1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IS05Lc09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLTktzZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hLTktzdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLTktzLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hLTkt0T2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLTkt0ZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hLTkt0dWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLTkt0LWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IS05LdU9mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hLTktxdWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hLTktxLWZYRWR1cUhvT0piVVJaUnciIHg9IjEwODI4IiB5PSIzNDQ1Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLTkt1ZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1NzAwRUYiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEtOS3ZPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hLTkt2ZWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIzNjA2IiBoZWlnaHQ9IjEwMzIiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLTkt2dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLTkt2LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLTkt3T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEtOS3dlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEtOS3d1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEtOS3ctZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEtOS3hPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEtOS3hlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEtOS3h1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEtOS3gtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hLTkt5T2ZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEtOS3V1ZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEtOS3UtZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTcwMzkiIHk9IjM0NzEiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEtOSzB1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVEMDNCNSI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IS05LMWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEtOSzF1ZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjM2MDYiIGhlaWdodD0iMTAzMiIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEtOSzEtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEtOSzJPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEtOSzJlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IS05LMnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IS05LMi1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IS05LM09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IS05LM2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IS05LM3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IS05LMy1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IS05LNE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEtOSzRlZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IS05LMC1mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IS05LMU9mWEVkdXFIb09KYlVSWlJ3IiB4PSI3NTk0IiB5PSI1NzgyIi8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLTks5T2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxMDQiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEtOSzktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hLTkstT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIyNzQzIiBoZWlnaHQ9IjEwMzIiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLTkstZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLTkstdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLTkstLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEtOS19PZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEtOS19lZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEtOS191ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEtOS18tZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEtOTEFPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEtOTEFlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEtOTEF1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hLTkxBLWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEtOSzllZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1BhcmVudD0iTmFtZSIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEtOSzl1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTMxMDYiIHk9IjU3ODIiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxEaWFncmFtU3R5bGUiIHhtaTppZD0iX0d3YllxdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4KLSAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IS0RaemVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFGRUQ4OTEwM0FEIiBzb3VyY2U9Il9IS0RadmVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IS0RacmVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLRFowT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLRFowdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEtEWjAtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IS0RaMGVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IS0RaenVmWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hLRFp6LWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzEyMzYsIC0zMDQsIC04OTIzLCAyMDgyXSRbODU5MywgLTIwMzIsIC0xNTY2LCAzNTVdIi8+Ci0gICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IS0RaMU9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hLRFoxZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IS0RaOXVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFGRUUwQzUwM0ExIiBzb3VyY2U9Il9IS0RaNXVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IS0RadmVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLRFotZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLRFotLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEtEWl9PZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IS0RaLXVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IS0RaOS1mWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hLRFotT2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy01MzMsIC01MjQsIDQwMzgsIDM5OTZdJFstNDAzOCwgLTM5OTYsIDUzMywgNTI0XSIvPgotICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEtEWl9lZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IS0RaX3VmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEtOS29PZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRkVFMEM5MDE5NCIgc291cmNlPSJfSEtOS2tPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEtEWnZlZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IS05Lby1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IS05LcGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLTktwdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEtOS3BPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEtOS29lZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IS05Lb3VmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlswLCAtNTI0LCAwLCAxODExXSRbMCwgLTE4MTEsIDAsIDUyNF0iLz4KLSAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hLTktwLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEtOS3FPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hLTkt5ZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAyNjMiIHNvdXJjZT0iX0hLRFoxdWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hLTkt1ZWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEtOS3pPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEtOS3p1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IS05Lei1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hLTkt6ZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hLTkt5dWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEtOS3ktZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMCwgLTUyNCwgMCwgMTgxMV0kWzAsIC0xODIwLCAwLCA1MTZdIi8+Ci0gICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IS05LME9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hLTkswZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IS05LNHVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFGRkRGODIwMTY2IiBzb3VyY2U9Il9IS05LMHVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IS0RadmVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLTks1ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLTks1LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEtOSzZPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IS05LNXVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IS05LNC1mWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hLTks1T2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0xMTI2LCAtNTI0LCAzOTUzLCAxODExXSRbLTM5MzcsIC0xODExLCAxMTQzLCA1MjRdIi8+Ci0gICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IS05LNmVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hLTks2dWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IS05LNi1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI1MThDOTMwMDhGIiBzb3VyY2U9Il9IS05LMHVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IS05LcWVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLTks3dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLTks4T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEtOSzhlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IS05LNy1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IS05LN09mWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hLTks3ZWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzU1OCwgLTUyNCwgLTE5ODEsIDE4MTFdJFsxOTY0LCAtMTgyMCwgLTU3NSwgNTE2XSIvPgotICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEtOSzh1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IS05LOC1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEtOTERlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRkFEQzAxMDI4RCIgc291cmNlPSJfSEtOSzlPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEtEWnJlZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IS05MRU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IS05MRXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLTkxFLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEtOTEVlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEtOTER1ZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IS05MRC1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlswLCAtNTI0LCAwLCA0MTk5XSRbMCwgLTQxNjUsIDAsIDU1OF0iLz4KLSAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hLTkxGT2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEtOTEZlZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hLTkxGdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjUxOEJENzAxRTMiIHNvdXJjZT0iX0hLTks5T2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hLTktxZWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEtOTEdlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEtOTEctZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IS05MSE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hLTkxHdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hLTkxGLWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEtOTEdPZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTU2NywgLTUyNCwgMTk3MiwgMTgxMV0kWy0xOTgxLCAtMTgyMCwgNTU4LCA1MTZdIi8+Ci0gICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IS05MSGVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hLTkxIdWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICA8L2NvbnRlbnRzPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HdlBGMnVmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNTcwMDNCIj4KLSAgICAgICAgICA8Ym9keT4wNDwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpQYWNrYWdlIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MUZFREIzODAxMUUiIG5hbWU9IkxpYnJhcnlDb25maWd1cmF0aW9ucyI+Ci0gICAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il9Hdi1zeHVmWEVkdXFIb09KYlVSWlJ3IiBzb3VyY2U9InVtbDIuZGlhZ3JhbXMiIHJlZmVyZW5jZXM9Il8zQURDN0I3NDAyMkQ0MEYzNkQ3QjAzMDUiPgotICAgICAgICAgICAgPGNvbnRlbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpEaWFncmFtIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkQ3QjAzMDUiIHR5cGU9IkNsYXNzIiBuYW1lPSJNZXRob2RMaWJyYXJ5QW5kQ29uZmlndXJhdGlvbnMiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpBM3dPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDEwNCI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKQTN3LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hKQTN4T2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISkEzeGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKQTN4dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpBM3gtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKQTN5T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEpBM3llZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKQTN5dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEpBM3ktZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKQTN6T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEpBM3plZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKQTN6dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKQTN6LWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hKQTN3ZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEpBM3d1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTA4MyIgeT0iMzgxMCIgd2lkdGg9IjM3MjUiIGhlaWdodD0iMjMzNiIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpBMzBPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDEzRiI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKQTMwLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hKQTMxT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISkEzMWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKQTMxdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpBMzEtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKQTMyT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEpBMzJlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKQTMydWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEpBMzItZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKQTMzT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEpBMzNlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKQTMzdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKQTMzLWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hKQTMwZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEpBMzB1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTQzOSIgeT0iOTEyNyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpBNEEtZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVEMDNCNSI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKQTRCdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hKQTRCLWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISkE0Q09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKQTRDZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpBNEN1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKQTRDLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEpBNERPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKQTREZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEpBNER1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKQTRELWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEpBNEVPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKQTRFZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKQTRFdWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hKQTRCT2ZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEpBNEJlZlhFZHVxSG9PSmJVUlpSdyIgeD0iNTAwNSIgeT0iOTkiIHdpZHRoPSI1MTMwIiBoZWlnaHQ9IjIyMjYiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKQTROdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUVGMDk1ODAxNTIiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISkE0T2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9ISkE0T3VmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMzU4OSIgaGVpZ2h0PSIxMDMyIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpBNE8tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISkE0UE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKQTRQZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISkE0UHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKQTRQLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISkE0UU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKQTRRZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISkE0UXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKQTRRLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISkE0Uk9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISkE0UmVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9ISkE0Ti1mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hKQTRPT2ZYRWR1cUhvT0piVVJaUnciIHg9IjE1OTg1IiB5PSI3NDU5Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISkE0UnVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjQ0Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpBNFNlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEpBNFN1ZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKQTRTLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpBNFRPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISkE0VGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpBNFR1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISkE0VC1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpBNFVPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISkE0VWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpBNFV1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISkE0VS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpBNFZPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEpBNFZlZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEpBNFItZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISkE0U09mWEVkdXFIb09KYlVSWlJ3IiB4PSI5NDc0IiB5PSIxMDkzMCIgd2lkdGg9IjQxMjMiIGhlaWdodD0iMTEwOSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpBNFZ1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzU3MDBFRiI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKQTRXZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hKQTRXdWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISkE0Vy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKQTRYT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpBNFhlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKQTRYdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEpBNFgtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKS0JzT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEpLQnNlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKS0JzdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEpLQnMtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKS0J0T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKS0J0ZWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hKQTRWLWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEpBNFdPZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTAzMzYiIHk9IjM4MTAiIHdpZHRoPSI0NDY2IiBoZWlnaHQ9IjIzMzYiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MRGlhZ3JhbVN0eWxlIiB4bWk6aWQ9Il9Hdi1zeU9mWEVkdXFIb09KYlVSWlJ3IiBkZXNjcmlwdGlvbj0iVGhlIExpYnJhcnkgQ29uZmlndXJhdGlvbnMgcGFja2FnZSBhZGRzIGFkZGl0aW9uYWwgY2FwYWJpbGl0aWVzIGZvciBwYWNrYWdpbmcgTWV0aG9kIFBsdWdpbnMgYW5kIHNjYWxpbmcgbWV0aG9kIGFuZCBwcm9jZXNzIGF1dGhvcmluZyB3b3JrLiAgSXQgZGVmaW5lcyB0aGUga2V5IGNvbmNlcHQgb2YgTGlicmFyeSB3aGljaCBjb21wcmlzZXMgb2YgTWV0aG9kIFBsdWdpbnMgYXMgd2VsbCBhcyBNZXRob2QgQ29uZmlndXJhdGlvbnMuICBBIExpYnJhcnkgcmVwcmVzZW50cyB0aGUgb3ZlcmFsbCBwaHlzaWNhbCBjb250YWluZXIgZm9yIGFsbCBNZXRob2QgRWxlbWVudHMuICBMaWJyYXJpZXMgcmVwcmVzZW50IGEgc2VwYXJhdGUgTWV0aG9kICd1bml2ZXJzZScsIGkuZS4gYSBNZXRob2QgTGlicmFyeSBjYW5ub3QgcmVmZXJlbmNlIGVsZW1lbnRzIGZyb20gYW5vdGhlciBNZXRob2QgTGlicmFyeS4gIEEgQ29uZmlndXJhdGlvbiBpcyBhIHN1YnNldCBvZiBQbHVnaW5zIGFuZCBNZXRob2QgUGFja2FnZXMsIGkuZS4gc2VsZWN0aW9ucyBvZiBNZXRob2QgUGx1Z2lucyB3aXRoIGEgc2VsZWN0ZWQgc3Vic2V0IG9mIE1ldGhvZCBQYWNrYWdlcy4gIFRoZXkgYXJlIHVzZWQgdG8gZGVmaW5lIHdvcmtpbmcgc2V0cyBmb3IgcHJvY2VzcyBhdXRob3JpbmcgcHJvdmlkaW5nIGEgcHJvY2VzcyBlbmdpbmVlciBvbmx5IHdpdGggbGlzdHMgb2YgZWxlbWVudHMgdG8gYmUgdXNlZCBmb3IgY3JlYXRpbmcgcHJvY2VzcyB3aXRoaW4gc3VjaCBhIENvbmZpZ3VyYXRpb24uICBDb25maWd1cmF0aW9ucyBhbHNvIGRlZmluZSB0aGUgc3BhY2Ugb2YgdmFyaWFiaWxpdHkgaW50ZXJwcmV0YXRpb24gdG8gYXZvaWQgY29uZmxpY3RzIGFtb25nc3QgJ2NvbXBldGluZycgY29udGVudCAoZS5nLiBjb250ZW50IHRoYXQgcmVwbGFjZXMgdGhlIHNhbWUgZWxlbWVudHMpIGFzIHdlbGwgYXMgZGVmaW5lIHNldHMgb2YgTWV0aG9kIENvbnRlbnQgYW5kIFByb2Nlc3NlcyBmb3IgZXhwb3J0IGFuZCBkaXN0cmlidXRpb24uIi8+Ci0gICAgICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hKQTM0T2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyRDUiIHNvdXJjZT0iX0hKQTMwT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hKQTN3T2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISkEzNC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKQTM1ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISkEzNXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEpBMzVPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKQTM1LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyRDgiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKQTM2ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hKQTM2T2ZYRWR1cUhvT0piVVJaUnciIHg9Ijg0IiB5PSItMzk4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpBMzZ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyRDgiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKQTM3T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISkEzNi1mWEVkdXFIb09KYlVSWlJ3IiB4PSIxNjAiIHk9IjE2MjYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISkEzN2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyRDYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKQTM3LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEpBMzd1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTI3OCIgeT0iLTI3OSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKQTM4T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMkQ2Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISkEzOHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISkEzOGVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxNDYiIHk9IjM1NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKQTM4LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyRDgiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKQTM5ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKQTM5dWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hKQTM5T2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISkEzOS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyRDYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKQTMtZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKQTMtdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hKQTMtT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISkEzLS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDJEOCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpBM19lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEpBM191ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEpBM19PZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKQTNfLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyRDYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKQTRBZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEpBNEF1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEpBNEFPZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hKQTM0ZWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEpBMzR1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbNTksIC01NzUsIDU5LCA0MTQ4XSRbNTksIC0zNTY0LCA1OSwgMTE1OV0iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hKQTRFLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAyODIiIHNvdXJjZT0iX0hKQTN3T2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hKQTRBLWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISkE0RnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKQTRHT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISkE0R2VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEpBNEYtZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKQTRHdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAyODUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKQTRIT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hKQTRHLWZYRWR1cUhvT0piVVJaUnciIHg9Ii0yMDQiIHk9Ii0xNjkiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISkE0SGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDI4NSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpBNEgtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hKQTRIdWZYRWR1cUhvT0piVVJaUnciIHg9Ii0xNzAiIHk9IjEzODAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISkE0SU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMjgzIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISkE0SXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hKQTRJZWZYRWR1cUhvT0piVVJaUnciIHk9IjM5NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKQTRJLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMjgzIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISkE0SmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISkE0Sk9mWEVkdXFIb09KYlVSWlJ3IiB4PSIxMjciIHk9Ii0zNDciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISkE0SnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMjg1Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISkE0S09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISkE0S2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISkE0Si1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpBNEt1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMjgzIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISkE0TE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISkE0TGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISkE0Sy1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpBNEx1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAyODUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKQTRNT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKQTRNZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hKQTRMLWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISkE0TXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMjgzIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISkE0Tk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKQTROZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hKQTRNLWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9ISkE0Rk9mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hKQTRGZWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzkzLCAtMTE2OCwgLTQ0NzgsIDIzMzZdJFs5MywgLTMzNzgsIC00NDc4LCAxMjddJFsyMDA2LCAtMzM3OCwgLTI1NjUsIDEyN10iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hKS0J0dWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAyMTUiIHNvdXJjZT0iX0hKQTN3T2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hKQTRWdWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISktCdWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKS0J1LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISktCdk9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEpLQnV1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKS0J2ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAyMUQiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKS0J2LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hKS0J2dWZYRWR1cUhvT0piVVJaUnciIHg9Ii0xODUiIHk9Ii0yNTQiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISktCd09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDIxRCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpLQnd1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hKS0J3ZWZYRWR1cUhvT0piVVJaUnciIHg9IjEzOTAiIHk9IjIzNyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKS0J3LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDIxNiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpLQnhlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISktCeE9mWEVkdXFIb09KYlVSWlJ3IiB4PSIyOTYiIHk9Ii0xMTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISktCeHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDIxNiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpLQnlPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEpLQngtZlhFZHVxSG9PSmJVUlpSdyIgeD0iMjk2IiB5PSIzNTYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISktCeWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMjFEIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISktCeS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISktCek9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISktCeXVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpLQnplZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMjE2Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISktCei1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISktCME9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISktCenVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpLQjBlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAyMUQiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKS0IwLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKS0IxT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hKS0IwdWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISktCMWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMjE2Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISktCMS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKS0IyT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hKS0IxdWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9ISktCdC1mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hKS0J1T2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzE4NjIsIDYwMSwgLTc4NDAsIDYwMV0kWzc4NDAsIDYwMSwgLTE4NjIsIDYwMV0iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hKS0IyZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAyNDUiIHNvdXJjZT0iX0hKQTMwT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hKQTRWdWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISktCM09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKS0IzdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISktCMy1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEpLQjNlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKS0I0T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAyNDgiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKS0I0dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hKS0I0ZWZYRWR1cUhvT0piVVJaUnciIHg9Ii04NDAiIHk9IjI3OSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKS0I0LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMjQ4Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISktCNWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEpLQjVPZlhFZHVxSG9PSmJVUlpSdyIgeD0iODUzIiB5PSItMjAzIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpLQjV1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMjQ2Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISktCNk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hKS0I1LWZYRWR1cUhvT0piVVJaUnciIHg9IjExNjEiIHk9Ii0xNjAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISktCNmVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDI0NiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpLQjYtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEpLQjZ1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iNTAxIiB5PSIzNTYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISktCN09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMjQ4Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISktCN3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISktCNy1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISktCN2VmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpLQjhPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMjQ2Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISktCOHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISktCOC1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISktCOGVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpLQjlPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAyNDgiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKS0I5dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKS0I5LWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hKS0I5ZWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISktCLU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMjQ2Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISktCLXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKS0ItLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hKS0ItZWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9ISktCMnVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hKS0IyLWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzE1MDcsIC0xNTIsIC04MTk1LCA0NTcyXSRbODA1MSwgLTE1MiwgLTE2NTEsIDQ1NzJdJFs4MDUxLCAtMzU1NiwgLTE2NTEsIDExNjhdIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9ISktCX09mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGODdCRjYwMTI2IiBzb3VyY2U9Il9ISkE0QS1mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9ISkE0VnVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpLQl8tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISktDQWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpLQ0F1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hKS0NBT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISktDQS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjg3QkY3MDA5MyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpLQ0JlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEpLQ0JPZlhFZHVxSG9PSmJVUlpSdyIgeT0iMzk2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpLQ0J1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGODdCRjcwMDkzIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISktDQ09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEpLQ0ItZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTM5NyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKS0NDZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjg3QkY3MDA5MSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpLQ0MtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISktDQ3VmWEVkdXFIb09KYlVSWlJ3IiB4PSIxNTciIHk9IjE2OSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKS0NET2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEY4N0JGNzAwOTEiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKS0NEdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hKS0NEZWZYRWR1cUhvT0piVVJaUnciIHg9IjIyNSIgeT0iLTIyMzUiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISktDRC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGODdCRjcwMDkzIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISktDRWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISktDRXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISktDRU9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpLQ0UtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGODdCRjcwMDkxIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISktDRmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISktDRnVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISktDRk9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpLQ0YtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEY4N0JGNzAwOTMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKS0NHZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKS0NHdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hKS0NHT2ZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISktDRy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGODdCRjcwMDkxIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISktDSGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKS0NIdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hKS0NIT2ZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9ISktCX2VmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hKS0JfdWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzI1NjUsIDEwMSwgLTI1NjUsIC0zNDAzXSRbNTA0NiwgMTAxLCAtODQsIC0zNDAzXSRbNTA0NiwgMjMzNiwgLTg0LCAtMTE2OF0iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hKS0NILWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUVGMDk5ODAxMTAiIHNvdXJjZT0iX0hKQTRWdWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hKQTROdWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISktDSXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKS0NKT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISktDSmVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEpLQ0ktZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKS0NKdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUVGMDk5ODAxMTIiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKS0NLT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hKS0NKLWZYRWR1cUhvT0piVVJaUnciIHg9Ii0yMDgiIHk9IjIyOCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKS0NLZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFRjA5OTgwMTEyIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISktDSy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEpLQ0t1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTIwOCIgeT0iLTEzNTUiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISktDTE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUVGMDk5ODAxMTEiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKS0NMdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEpLQ0xlZlhFZHVxSG9PSmJVUlpSdyIgeD0iNDIwIiB5PSItMTY5Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpLQ0wtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUVGMDk5ODAxMTEiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKS0NNZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hKS0NNT2ZYRWR1cUhvT0piVVJaUnciIHg9IjI2OCIgeT0iMzU2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpLQ011ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRUYwOTk4MDExMiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpLQ05PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEpLQ05lZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEpLQ00tZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKS0NOdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRUYwOTk4MDExMSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpLQ09PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEpLQ09lZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEpLQ04tZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKS0NPdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFRjA5OTgwMTEyIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISktDUE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISktDUGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISktDTy1mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpLQ1B1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRUYwOTk4MDExMSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpLQ1FPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISktDUWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISktDUC1mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEpLQ0lPZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9ISktDSWVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlsxMjQ0LCAxMTY0LCAtMzA5NSwgLTE2MTRdJFsxMjQ0LCAyNjQ2LCAtMzA5NSwgLTEzMl0kWzM0MTMsIDI2NDYsIC05MjYsIC0xMzJdIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9ISktDUXVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFRjA5OUYwMTdFIiBzb3VyY2U9Il9ISkE0VnVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9ISkE0TnVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpLQ1JlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISktDUi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpLQ1NPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hKS0NSdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISktDU2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFRjA5OUYwMTgwIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISktDUy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISktDU3VmWEVkdXFIb09KYlVSWlJ3IiB4PSItMjY1IiB5PSIyNjIiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISktDVE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRUYwOTlGMDE4MCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpLQ1R1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hKS0NUZWZYRWR1cUhvT0piVVJaUnciIHg9IjM5NSIgeT0iLTIyOSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKS0NULWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRUYwOTlGMDE3RiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpLQ1VlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISktDVU9mWEVkdXFIb09KYlVSWlJ3IiB4PSI2MjEiIHk9IjE1MiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKS0NVdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFRjA5OUYwMTdGIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISktDVk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISktDVS1mWEVkdXFIb09KYlVSWlJ3IiB4PSIyNjUiIHk9IjM0NyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKS0NWZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUVGMDk5RjAxODAiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKS0NWLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKS0NXT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hKS0NWdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISktDV2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUVGMDk5RjAxN0YiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKS0NXLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKS0NYT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hKS0NXdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISktDWGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRUYwOTlGMDE4MCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpLQ1gtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEpLQ1lPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEpLQ1h1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKS0NZZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUVGMDk5RjAxN0YiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKS0NZLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEpLQ1pPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEpLQ1l1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hKS0NRLWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEpLQ1JPZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMTg2MiwgMzY0LCAtMzI2OCwgLTI2MzNdJFs1MDcxLCAzNjQsIC01OSwgLTI2MzNdJFs1MDcxLCAyNDgwLCAtNTksIC01MTZdIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9ISktDWmVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3NkNFNTIwM0IwIiBzb3VyY2U9Il9ISkE0VnVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9ISkE0VnVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpUeXNPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISlR5c3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpUeXMtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hKVHlzZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISlR5dE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3NkNFNTYwMkE5Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISlR5dHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISlR5dGVmWEVkdXFIb09KYlVSWlJ3IiB4PSItMzIiIHk9Ii0yNjIiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISlR5dC1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjc2Q0U1NjAyQTkiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKVHl1ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISlR5dU9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMzk3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpUeXV1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3NkNFNTYwMkE3Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISlR5dk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hKVHl1LWZYRWR1cUhvT0piVVJaUnciIHg9Ii0yNzkiIHk9Ii0xODciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISlR5dmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3NkNFNTYwMkE3Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISlR5di1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISlR5dnVmWEVkdXFIb09KYlVSWlJ3IiB4PSIyMzQiIHk9Ii0xNDkxIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpUeXdPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyNzZDRTU2MDJBOSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpUeXd1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEpUeXctZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEpUeXdlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKVHl4T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyNzZDRTU2MDJBNyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpUeXh1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEpUeXgtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEpUeXhlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKVHl5T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3NkNFNTYwMkE5Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISlR5eXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISlR5eS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISlR5eWVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpUeXpPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyNzZDRTU2MDJBNyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpUeXp1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISlR5ei1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISlR5emVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEpLQ1p1ZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9ISktDWi1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMTQwNSwgLTExNjgsIC0xNDA1LCAtMTE2OF0kWy0xNDA1LCAtMTk4OSwgLTE0MDUsIC0xOTg5XSRbLTM0OTYsIC0xOTg5LCAtMzQ5NiwgLTE5ODldJFstMzQ5NiwgLTM4OSwgLTM0OTYsIC0zODldJFstMTg2MiwgLTM4OSwgLTE4NjIsIC0zODldIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9ISlR5ME9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIwRDNGMDAwMzk2IiBzb3VyY2U9Il9ISkE0UnVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9ISkE0VnVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpUeTAtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISlR5MWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpUeTF1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hKVHkxT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISlR5MS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIwRDNGMDAwMzk4Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISlR5MmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISlR5Mk9mWEVkdXFIb09KYlVSWlJ3IiB4PSIxNjMiIHk9IjE3MCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKVHkydWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIwRDNGMDAwMzk4Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISlR5M09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEpUeTItZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTI2OSIgeT0iMTI1NCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKVHkzZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMEQzRjAwMDM5NyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpUeTMtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISlR5M3VmWEVkdXFIb09KYlVSWlJ3IiB4PSIzNTciIHk9Ii0xNDMiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISlR5NE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMEQzRjAwMDM5NyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpUeTR1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEpUeTRlZlhFZHVxSG9PSmJVUlpSdyIgeD0iMjMwIiB5PSItMzQ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpUeTQtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMEQzRjAwMDM5OCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpUeTVlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEpUeTV1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEpUeTVPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKVHk1LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMEQzRjAwMDM5NyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpUeTZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEpUeTZ1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEpUeTZPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKVHk2LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIwRDNGMDAwMzk4Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISlR5N2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISlR5N3VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISlR5N09mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpUeTctZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMEQzRjAwMDM5NyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpUeThlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISlR5OHVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISlR5OE9mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEpUeTBlZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9ISlR5MHVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9Ils0MjMsIC01NTgsIC02OTQsIDU5NDNdJFs0MjMsIC01MzQyLCAtNjk0LCAxMTU5XSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEpUeTgtZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMTI5MUNEMDE4QiIgc291cmNlPSJfSEpBNFZ1ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEpBNFJ1ZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKVHk5dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpUeS1PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKVHktZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISlR5OS1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpUeS11ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMTI5MUQwMDA1OSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpUeV9PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEpUeS0tZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTM1NSIgeT0iMTQ0Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpUeV9lZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxMjkxRDAwMDU5Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISlR5Xy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEpUeV91ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTM5NyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKVHpBT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMTI5MUQwMDA0NSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpUekF1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISlR6QWVmWEVkdXFIb09KYlVSWlJ3IiB4PSItMTQ0IiB5PSIxOTUiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISlR6QS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxMjkxRDAwMDQ1Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISlR6QmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISlR6Qk9mWEVkdXFIb09KYlVSWlJ3IiB4PSIyMjAiIHk9Ijk5OSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKVHpCdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjEyOTFEMDAwNTkiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKVHpDT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKVHpDZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hKVHpCLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISlR6Q3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjEyOTFEMDAwNDUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKVHpET2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKVHpEZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hKVHpDLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISlR6RHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMTI5MUQwMDA1OSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpUekVPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEpUekVlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEpUekQtZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKVHpFdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjEyOTFEMDAwNDUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKVHpGT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEpUekZlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEpUekUtZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hKVHk5T2ZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEpUeTllZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTExNDMsIDExNTksIC0yNSwgLTUzNDJdJFstMTE0MywgNTk0MywgLTI1LCAtNTU4XSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEpUekZ1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQ1NThFRjdDMDM1MyIgc291cmNlPSJfSEpBNFZ1ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEpBNFJ1ZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKVHpHZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpUekctZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKVHpIT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISlR6R3VmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpUekhlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQ1NThFRjdFMDA1NiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpUekgtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEpUekh1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTkyNCIgeT0iLTIwMyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKVHpJT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQ1NThFRjdFMDA1NiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpUekl1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hKVHpJZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0zOTciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISlR6SS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0NTU4RUY3RTAwNDIiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKVHpKZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEpUekpPZlhFZHVxSG9PSmJVUlpSdyIgeD0iNzk2IiB5PSI5MyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKVHpKdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0NTU4RUY3RTAwNDIiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKVHpLT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hKVHpKLWZYRWR1cUhvT0piVVJaUnciIHg9IjEwOTAiIHk9Ii01ODgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISlR6S2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDU1OEVGN0UwMDU2Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISlR6Sy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISlR6TE9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISlR6S3VmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpUekxlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDU1OEVGN0UwMDQyIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISlR6TC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISlR6TU9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISlR6THVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpUek1lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0NTU4RUY3RTAwNTYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKVHpNLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKVHpOT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hKVHpNdWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISlR6TmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDU1OEVGN0UwMDQyIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISlR6Ti1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKVHpPT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hKVHpOdWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9ISlR6Ri1mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hKVHpHT2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzQyLCAxMTY4LCAxMTU5LCAtNTMzNF0kWzQyLCA1MDgwLCAxMTU5LCAtMTQyMl0kWzIyMTgsIDUwODAsIDMzMzUsIC0xNDIyXSRbMjIxOCwgNjE4MCwgMzMzNSwgLTMyMV0kWzkzOSwgNjE4MCwgMjA1NywgLTMyMV0iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hKVHpPZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0NTU5MDA2QTAzMTciIHNvdXJjZT0iX0hKQTRWdWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hKQTRSdWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISlR6UE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKVHpQdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISlR6UC1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEpUelBlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKVHpRT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDU1OTAwNkIwMjdBIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISlR6UXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISlR6UWVmWEVkdXFIb09KYlVSWlJ3IiB5PSIzOTYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISlR6US1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0NTU5MDA2QjAyN0EiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKVHpSZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISlR6Uk9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMzk3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpUelJ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDU1OTAwNkIwMjcwIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISlR6U09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hKVHpSLWZYRWR1cUhvT0piVVJaUnciIHg9IjEyNjEiIHk9IjE0NCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKVHpTZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0NTU5MDA2QjAyNzAiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKVHpTLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hKVHpTdWZYRWR1cUhvT0piVVJaUnciIHg9IjQ3NCIgeT0iMjY1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKVHpUT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0NTU5MDA2QjAyN0EiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKVHpUdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKVHpULWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hKVHpUZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISlR6VU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0NTU5MDA2QjAyNzAiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKVHpVdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKVHpVLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hKVHpVZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISlR6Vk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQ1NTkwMDZCMDI3QSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpUelZ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEpUelYtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEpUelZlZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKVHpXT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0NTU5MDA2QjAyNzAiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKVHpXdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEpUelctZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEpUeldlZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hKVHpPdWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEpUek8tZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbNzExLCAxMTY4LCAxODI4LCAtNTMzNF0kWzcxMSwgNDMzNCwgMTgyOCwgLTIxNjddJFszODUyLCA0MzM0LCA0OTY5LCAtMjE2N10kWzM4NTIsIDY3MzksIDQ5NjksIDIzN10kWzkzOSwgNjczOSwgMjA1NywgMjM3XSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgPC9jb250ZW50cz4KLSAgICAgICAgICAgIDxjb250ZW50cyB4bWk6dHlwZT0ibm90YXRpb246RGlhZ3JhbSIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDE3NkEzRUMwMDI3IiB0eXBlPSJDbGFzcyIgbmFtZT0iUHJvY2Vzc0ZhbWlseSI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISmRqc09mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNTcwMEVGIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpkanMtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEpkanRPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKZGp0ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpkanR1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISmRqdC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpkanVPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISmRqdWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpkanV1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISmRqdS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpkanZPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISmRqdmVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpkanZ1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEpkanYtZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEpkanNlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISmRqc3VmWEVkdXFIb09KYlVSWlJ3IiB4PSI2NjgiIHk9IjkxNCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpkandPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDA3NyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKZGp3LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hKZGp4T2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISmRqeGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKZGp4dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpkangtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKZGp5T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEpkanllZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKZGp5dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEpkanktZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKZGp6T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEpkanplZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKZGp6dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKZGp6LWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hKZGp3ZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEpkand1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iOTExMCIgeT0iMzc3NiIgd2lkdGg9IjMyODIiIGhlaWdodD0iMTA4MyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpkajBPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVEMDNBQiI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKZGowLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hKZGoxT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISmRqMWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKZGoxdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpkajEtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKZGoyT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEpkajJlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKZGoydWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEpkajItZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKZGozT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEpkajNlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKZGozdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKZGozLWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hKZGowZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEpkajB1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTAyNCIgeT0iMzg2MCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxEaWFncmFtU3R5bGUiIHhtaTppZD0iX0d3SDJvZWZYRWR1cUhvT0piVVJaUnciIGRlc2NyaXB0aW9uPSJUaGlzIGRpYWdyYW0gc2hvd3MgaG93IHByb2Nlc3NlcyBhcmUgcGFja2FnZWQgaW4gbWV0aG9kbGlicmFyeSBhbmQgcmVsYXRlZCB0byBjb25maWd1cmF0aW9ucy4iLz4KLSAgICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEpkajRPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDI2NCIgc291cmNlPSJfSEpkandPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEpkajBPZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKZGo0LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpkajVlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKZGo1dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hKZGo1T2ZYRWR1cUhvT0piVVJaUnciIHg9Ii02OTkiIHk9Ii0zMzEiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISmRqNS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMjY3Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISmRqNmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISmRqNk9mWEVkdXFIb09KYlVSWlJ3IiB4PSItNTUiIHk9IjIwNSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKZGo2dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMjY3Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISmRqN09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEpkajYtZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTA0OSIgeT0iLTIyOSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKZGo3ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDI2NSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpkajctZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISmRqN3VmWEVkdXFIb09KYlVSWlJ3IiB4PSIzMzkiIHk9Ii0yODgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISmRqOE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMjY1Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISmRqOHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISmRqOGVmWEVkdXFIb09KYlVSWlJ3IiB4PSItNjY5IiB5PSIyMzAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISmRqOC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMjY3Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISmRqOWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISmRqOXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISmRqOU9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpkajktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMjY1Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISmRqLWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISmRqLXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISmRqLU9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpkai0tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAyNjciPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKZGpfZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKZGpfdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hKZGpfT2ZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISmRqXy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMjY1Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISmRrQWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKZGtBdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hKZGtBT2ZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9ISmRqNGVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hKZGo0dWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0xNDU2LCAzMywgNjY3MSwgMzNdJFstNjcxNCwgMzMsIDE0MTMsIDMzXSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEpka0EtZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDI2MyIgc291cmNlPSJfSEpkajBPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEpkanNPZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKZGtCdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpka0NPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKZGtDZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISmRrQi1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEpka0JPZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9ISmRrQmVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlswLCAtNDU3LCAtNTAsIDI0ODldJFswLCAtMjQ4OSwgLTUwLCA0NTddIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hKZGtDdWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9ISmRrQy1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgIDwvY29udGVudHM+Ci0gICAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HdllQeS1mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDFGRURCMzgwMTFFIj4KLSAgICAgICAgICAgIDxib2R5PjAyPC9ib2R5PgotICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgIDxwYWNrYWdlTWVyZ2UgeG1pOmlkPSJfQV9fX29PeE1FZHVPTnJNUmdtejQ4QSIgbWVyZ2VkUGFja2FnZT0iXzNBREM3Qjc0MDIyRDQxRkVEREI2MDMwNiIvPgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNTcwMEVGIiBuYW1lPSJNZXRob2RDb25maWd1cmF0aW9uIj4KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3ZZUDNPZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzU3MDBFRiI+Ci0gICAgICAgICAgICAgIDxib2R5PkEgTWV0aG9kIENvbmZpZ3VyYXRpb24gaXMgYSBjb2xsZWN0aW9uIG9mIHNlbGVjdGVkIE1ldGhvZCBNb2RlbHMgYW5kIE1ldGhvZFBhY2thZ2VzLiBBIGNvbmZpZ3VyYXRpb24gY2FuIGJlIGV4cG9ydGVkIGludG8gaXRzIG93biBzdGFuZGFsb25lIGxpYnJhcnkgd2hlbiBpdCBpbmNsdWRlcyB0aGUgZnVsbCB0cmFuc2l0aXZlIGNsb3N1cmUgb2YgYWxsIGVsZW1lbnRzIGFsbCBvdGhlciBlbGVtZW50cyBkZXBlbmQgb24uPC9ib2R5PgotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDQ1NjVCQjEwMTVGIiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDFGRUQ4ODEwMUI1Ii8+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMjFEIiBuYW1lPSJtZXRob2RQbHVnaW5TZWxlY3Rpb24iIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDEwNCIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAyMTUiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HdmlBMU9mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HdmlBMC1mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iMSIvPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAyNDgiIG5hbWU9Im1ldGhvZFBhY2thZ2VTZWxlY3Rpb24iIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDEzRiIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAyNDUiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HdnJ4eHVmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HdnJ4eGVmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iMSIvPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MjBEM0YwMDAzOTgiIG5hbWU9InByb2Nlc3NWaWV3cyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjQ0IiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQyMEQzRjAwMDM5NiI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0d2MDd6ZWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0d2MDd6T2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDIxMjkxRDAwMDQ1IiBuYW1lPSJkZWZhdWx0VmlldyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjQ0IiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQyMTI5MUNEMDE4QiI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0d2MDcwZWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0d2MDcwT2ZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyNzZDRTU2MDJBNyIgbmFtZT0iYmFzZUNvbmZpZ3VyYXRpb25zIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1NzAwRUYiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDI3NkNFNTIwM0IwIj4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3Ytc3R1ZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3Ytc3RlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0NTU4RUY3RTAwNDIiIG5hbWU9InN1YnRyYWN0ZWRDYXRlZ29yeSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjQ0IiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQ1NThFRjdDMDM1MyI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0d2LXN2ZWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0d2LXN2T2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDU1OTAwNkIwMjcwIiBuYW1lPSJhZGRlZENhdGVnb3J5IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyNDQiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDU1OTAwNkEwMzE3Ij4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3Ytc3hPZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3Ytc3ctZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVEMDNBQiIgbmFtZT0iUHJvY2Vzc0ZhbWlseSI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0d2WVA0T2ZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RDAzQUIiPgotICAgICAgICAgICAgICA8Ym9keT5BIERlbGl2ZXJ5IE1vZGVsIEZhbWlseSBpcyBhIGNvbnZlbmllbnQgZ3JvdXBpbmcgb2YgRGVsaXZlcnkgUHJvY2Vzc2VzIGFuZCBDYXBhYmlsaXR5IFBhdHRlcm5zIG9mIGludGVyZXN0IHRvIHNvbWUgc3BlY2lmaWMgdXNlciBjb21tdW5pdHkuPC9ib2R5PgotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMjYzIiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDBGMzZDNTcwMEVGIi8+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMjY3IiBuYW1lPSJkZWxpdmVyeVByb2Nlc3NlcyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDc3IiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDI2NCI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0d2cnh6LWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0d2cnh6dWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MUVGMDk1ODAxNTIiIG5hbWU9IlByb2Nlc3MiIGlzQWJzdHJhY3Q9InRydWUiPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HdmlBdy1mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFRjA5NTgwMTUyIj4KLSAgICAgICAgICAgICAgPGJvZHk+UHJvY2VzcyBpbiB0aGUgcGFja2FnZSBMaWJyYXJ5IENvbmZpZ3VyYXRpb24gZXh0ZW5kcyB0aGUgY2xhc3MgUHJvY2VzcyB3aXRoIGFzc29jaWF0aW9uIHJlbGF0aW5nIGEgUHJvY2VzcyB0byBvbmUgZGVmYXVsdCBhbmQgbWFueSBvcHRpb25hbCB2YWxpZCBDb25maWd1cmF0aW9ucy4KLVRoZXNlIGNvbmZpZ3VyYXRpb25zIGRlc2NyaWJlIHZhbGlkIGNvbnRleHRzIGZvciB0aGUgUHJvY2VzcyB3aXRoaW4gYSBNZXRob2QgTGlicmFyeSBpbmRpY2F0aW5nIHVuZGVyIHdoaWNoIENvbmZpZ3VyYXRpb25zIGEgUHJvY2VzcyBpcyB3ZWxsIGRlZmluZWQuCi08L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MUVGMDk5ODAxMTIiIG5hbWU9ImRlZmF1bHRDb250ZXh0IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1NzAwRUYiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDFFRjA5OTgwMTEwIj4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3YwN3ZlZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IjEiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3YwN3ZPZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IjEiLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDFFRjA5OUYwMTgwIiBuYW1lPSJ2YWxpZENvbnRleHQiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzU3MDBFRiIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MUVGMDk5RjAxN0UiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HdjA3eHVmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HdjA3eGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUQwM0I1IiBuYW1lPSJNZXRob2RMaWJyYXJ5Ij4KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3ZpQXgtZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVEMDNCNSI+Ci0gICAgICAgICAgICAgIDxib2R5PkEgTWV0aG9kIExpYnJhcnkgaXMgYSBwaHlzaWNhbCBjb250YWluZXIgZm9yIE1ldGhvZCBQbHVnaW5zIGFuZCBNZXRob2QgQ29uZmlndXJhdGlvbiBkZWZpbml0aW9ucy4gIEFsbCBNZXRob2QgRWxlbWVudHMgYXJlIHN0b3JlZCBpbiBhIE1ldGhvZCBMaWJyYXJ5LjwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxRkZERjgyMDE2NiIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQxRkVEODgxMDFCNSIvPgotICAgICAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyMDA2MENFMDMzNyIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI4MCIvPgotICAgICAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyNTE4QzkzMDA4RiIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQxRERGQTM2MDJDMSIvPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDI4NSIgbmFtZT0ibWV0aG9kUGx1Z2lucyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMTA0IiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDI4MiI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0d2cngxdWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0d2cngxZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGODdCRjcwMDkxIiBuYW1lPSJwcmVkZWZpbmVkQ29uZmlndXJhdGlvbnMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzU3MDBFRiIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MEY4N0JGNjAxMjYiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HdjA3cy1mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HdjA3c3VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMjE1IiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAyMTYgXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDIxRCI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0d2aUF6ZWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAyMTUiPgotICAgICAgICAgICAgICA8Ym9keT5BIHNlbGVjdGlvbiBvZiBwYWNrYWdlcyB0byBiZSBpbmNsdWRlZCBpbiB0aGUgY29uZmlndXJhdGlvbi48L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAyMTYiIG5hbWU9Il9tZXRob2RDb25maWd1cmF0aW9uIiB2aXNpYmlsaXR5PSJwcml2YXRlIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNTcwMEVGIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMjE1Ij4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3ZpQTBlZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3ZpQTBPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEVuZD4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDI0NSIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMjQ2IF8zQURDN0I3NDAyMkQ0MEYzNkM1RjAyNDgiPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HdmlBMXVmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMjQ1Ij4KLSAgICAgICAgICAgICAgPGJvZHk+QSBzZWxlY3Rpb24gb2YgcGFja2FnZXMgdG8gYmUgaW5jbHVkZWQgaW4gdGhlIGNvbmZpZ3VyYXRpb24uPC9ib2R5PgotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICA8b3duZWRFbmQgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMjQ2IiBuYW1lPSJfbWV0aG9kQ29uZmlndXJhdGlvbiIgdmlzaWJpbGl0eT0icHJpdmF0ZSIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzU3MDBFRiIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDI0NSI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0d2cnh3LWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0d2cnh3dWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRFbmQ+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAyNjQiIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDI2NSBfM0FEQzdCNzQwMjJENDBGMzZDNUYwMjY3Ij4KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3ZyeHlPZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDI2NCI+Ci0gICAgICAgICAgICAgIDxib2R5PkRlbGl2ZXJ5IFByb2Nlc3MgY2FuIGJlIG9yZ2FuaXplZCBpbiBtYW55IFByb2Nlc3MgRmFtaWxpZXMuPC9ib2R5PgotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICA8b3duZWRFbmQgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMjY1IiBuYW1lPSJwcm9jZXNzRmFtaWxpZXMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVEMDNBQiIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAyNjQiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HdnJ4ek9mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HdnJ4eS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkRW5kPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMjgyIiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAyODMgXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDI4NSI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0d2cngwZWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAyODIiPgotICAgICAgICAgICAgICA8Ym9keT5BIE1ldGhvZCBMaWJyYXJ5IHBoeXNpY2FsbHkgY29tcHJpc2VzIG9mIE1ldGhvZCBQbHVnaW5zLjwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDI4MyIgbmFtZT0iX21ldGhvZExpYnJhcnkiIHZpc2liaWxpdHk9InByaXZhdGUiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RDAzQjUiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAyODIiLz4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjg3QkY2MDEyNiIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDBGODdCRjcwMDkxIF8zQURDN0I3NDAyMkQ0MEY4N0JGNzAwOTMiPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HdnJ4Mk9mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGODdCRjYwMTI2Ij4KLSAgICAgICAgICAgICAgPGJvZHk+QSBNZXRob2QgTGlicmFyeSBzdG9yZXMgYSBzZXQgb2YgcHJlZGVmaW5lZCBNZXRob2QgQ29uZmlndXJhdGlvbnMgdGhhdCBhcmUgcmVndWxhcmx5IHVzZWQgYnkgdGhlIGxpYnJhcnkgYXV0aG9ycyAoZS5nLiB0aGUgY29uZmlndXJhdGlvbnMgdGhhdCB0aGV5IHNoaXAgdG8gdGhlaXIgdXNlcnMpLjwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjg3QkY3MDA5MyIgbmFtZT0iX21ldGhvZExpYnJhcnkiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVEMDNCNSIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQwRjg3QkY2MDEyNiIvPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDFFRjA5OTgwMTEwIiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0MUVGMDk5ODAxMTEgXzNBREM3Qjc0MDIyRDQxRUYwOTk4MDExMiI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0d2MDd0dWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUVGMDk5ODAxMTAiPgotICAgICAgICAgICAgICA8Ym9keT5BIFByb2Nlc3MgaGFzIGV4YWN0bHkgb24gZGVmYXVsdCBjb25maWd1cmF0aW9uLiAgVGhpcyBpcyBpbiBtb3N0IGNhc2VzIHRoZSBjb25maWd1cmF0aW9uIGluIHdoaWNoIHRoZSBwcm9jZXNzIGhhcyBiZWVuIGNyZWF0ZWQuPC9ib2R5PgotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICA8b3duZWRFbmQgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDFFRjA5OTgwMTExIiBuYW1lPSJfcHJvY2VzcyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDFFRjA5NTgwMTUyIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDFFRjA5OTgwMTEwIj4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3YwN3V1ZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3YwN3VlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEVuZD4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxRUYwOTlGMDE3RSIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDFFRjA5OUYwMTdGIF8zQURDN0I3NDAyMkQ0MUVGMDk5RjAxODAiPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HdjA3di1mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFRjA5OUYwMTdFIj4KLSAgICAgICAgICAgICAgPGJvZHk+QSBQcm9jZXNzIGNhbiBoYXZlIG1hbnkgYWRkaXRpb25hbCBjb25maWd1cmF0aW9ucyB0aGF0IGhhdmUgYmVlbiB2ZXJpZmllZCB0byBhbHNvIHByb2R1Y2UgdmFsaWQgcmVzdWx0cy4gIFByb2Nlc3MgRWxlbWVudHMgKGUuZy4gRGVzY3JpcHRvcnMpIHRoYXQgcmVmZXIgdG8gY29udGVudCBwYWNrYWdlcyB0aGF0IGFyZSBkZWZpbmVkIG91dHNpZGUgdGhlIHNjb3BlIG9mIHN1Y2ggYSBjb25maWd1cmF0aW9uIHdvdWxkIG5vdCBiZSBzaG93biBpbiB0aGUgcHJvY2VzcyB3aGVuIHB1Ymxpc2hlZCBvciB1c2VkIHVuZGVyIHN1Y2ggYSBjb25maWd1cmF0aW9uLiAgVGhpcyBhbGxvd3MgdG8gZWFzaWx5IHJlbW92ZSBjb250ZW50IGZyb20gYSBwcm9jZXNzIGJ5IHJlbW92aW5nIGNvbnRlbnQgcGFja2FnZXMgdG8gZnJvbSB0aGUgcmVsYXRlZCBjb25maWd1cmF0aW9uLjwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxRUYwOTlGMDE3RiIgbmFtZT0iX3Byb2Nlc3MiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQxRUYwOTU4MDE1MiIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQxRUYwOTlGMDE3RSI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0d2MDd3LWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0d2MDd3dWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRFbmQ+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MjBEM0YwMDAzOTYiIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQyMEQzRjAwMDM5NyBfM0FEQzdCNzQwMjJENDIwRDNGMDAwMzk4Ij4KLSAgICAgICAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MjBEM0YwMDAzOTciIG5hbWU9Il9tZXRob2RDb25maWd1cmF0aW9uIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1NzAwRUYiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MjBEM0YwMDAzOTYiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HdjA3eXVmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HdjA3eWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkRW5kPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDIxMjkxQ0QwMThCIiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0MjEyOTFEMDAwNDUgXzNBREM3Qjc0MDIyRDQyMTI5MUQwMDA1OSI+Ci0gICAgICAgICAgICA8b3duZWRFbmQgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDIxMjkxRDAwMDU5IiBuYW1lPSJfbWV0aG9kQ29uZmlndXJhdGlvbiIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNTcwMEVGIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDIxMjkxQ0QwMThCIj4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3Ytc3NPZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3YwNzAtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEVuZD4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyNzZDRTUyMDNCMCIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDI3NkNFNTYwMkE3IF8zQURDN0I3NDAyMkQ0Mjc2Q0U1NjAyQTkiPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9Hdi1zc3VmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3NkNFNTIwM0IwIj4KLSAgICAgICAgICAgICAgPGJvZHk+VGhlIGRlZmluaXRpb24gb2YgYSBjb25maWd1cmF0aW9uIGNhbiBiZSBiYXNlZCBvbiB0aGUgZGVmaW5pdGlvbnMgb2Ygb3RoZXIgY29uZmlndXJhdGlvbnMuICBGb3IgZXhhbXBsZSwgYSBjb25maWd1cmF0aW9uIEEgY291bGQgYmUgZGVmaW5lZCBhcyB0aGUgc3VwZXJzZXQgb2YgY29uZmlndXJhdGlvbnMgQiwgQywgYW5kIEQgcGx1cyBhZGQgbW9yZSBzZWxlY3RlZCBQbHVnaW5zIGFuZCBQYWNrYWdlcy4gIEluIHN1Y2ggYSBjYXNlIEEgd291bGQgbGlzdCBCLCBDLCBhbmQgRCBhcyBpdHMgYmFzZUNvbmZpZ3VyYXRpb25zLiAgSWYgYW55IG9mIHRoZXNlIGJhc2UgY29uZmlndXJhdGlvbnMgY2hhbmdlcyBhbGwgdXBkYXRlcyB3b3VsZCBiZSBhdXRvbWF0aWNhbGx5IHZhbGlkIGZvciBBIGFzIHdlbGwgcmVkdWNpbmcgbWFpbnRhaW5hYmlsaXR5IG92ZXJoZWFkIGZvciBvdmVybGFwcGluZy9kZXBlbmRlbnQgY29uZmlndXJhdGlvbnMuIDwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyNzZDRTU2MDJBOSIgbmFtZT0iX21ldGhvZENvbmZpZ3VyYXRpb24iIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzU3MDBFRiIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQyNzZDRTUyMDNCMCI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0d2LXN1ZWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0d2LXN1T2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRFbmQ+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0NTU4RUY3QzAzNTMiIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQ1NThFRjdFMDA0MiBfM0FEQzdCNzQwMjJENDU1OEVGN0UwMDU2Ij4KLSAgICAgICAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0NTU4RUY3RTAwNTYiIG5hbWU9Il9tZXRob2RDb25maWd1cmF0aW9uIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1NzAwRUYiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0NTU4RUY3QzAzNTMiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9Hdi1zd09mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9Hdi1zdi1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkRW5kPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDU1OTAwNkEwMzE3IiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0NTU5MDA2QjAyNzAgXzNBREM3Qjc0MDIyRDQ1NTkwMDZCMDI3QSI+Ci0gICAgICAgICAgICA8b3duZWRFbmQgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDU1OTAwNkIwMjdBIiBuYW1lPSJfbWV0aG9kQ29uZmlndXJhdGlvbiIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNTcwMEVGIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDU1OTAwNkEwMzE3Ii8+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6UGFja2FnZSIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDFGRUREQjYwMzA2IiBuYW1lPSJNZXRob2RVbml0cyI+Ci0gICAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il9Hd2JZby1mWEVkdXFIb09KYlVSWlJ3IiBzb3VyY2U9InVtbDIuZGlhZ3JhbXMiIHJlZmVyZW5jZXM9Il8zQURDN0I3NDAyMkQ0MUZFREUwOTAzQjAiPgotICAgICAgICAgICAgPGNvbnRlbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpEaWFncmFtIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MUZFREUwOTAzQjAiIHR5cGU9IkNsYXNzIiBuYW1lPSJNYWluIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKd2VvT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUZFREU3NTAwNEUiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISndlby1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9ISndlcE9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMjU3MyIgaGVpZ2h0PSI5MDUiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISndlcGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKd2VwdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEp3ZXAtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKd2VxT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEp3ZXFlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKd2VxdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEp3ZXEtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKd2VyT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEp3ZXJlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKd2VydWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKd2VyLWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hKd2VvZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEp3ZW91ZlhFZHVxSG9PSmJVUlpSdyIgeD0iNTg4NyIgeT0iNjAwNCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEp3ZXNPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRkVERTgwMDI1MiI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKd2VzLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hKd2V0T2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIzNDU0IiBoZWlnaHQ9IjkwNSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKd2V0ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEp3ZXR1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISndldC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEp3ZXVPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISndldWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEp3ZXV1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISndldS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEp3ZXZPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISndldmVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEp3ZXZ1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEp3ZXYtZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEp3ZXNlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISndlc3VmWEVkdXFIb09KYlVSWlJ3IiB4PSI5MDIyIiB5PSI2MDA0Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISndlNmVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjgwIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEp3ZTdPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEp3ZTdlZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjI4MjciIGhlaWdodD0iMTA0OSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKd2U3dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEp3ZTctZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISndlOE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEp3ZThlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISndlOHVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEp3ZTgtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISndlOU9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEp3ZTllZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISndlOXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEp3ZTktZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEp3ZS1PZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEp3ZTZ1ZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISndlNi1mWEVkdXFIb09KYlVSWlJ3IiB4PSI3OTg0IiB5PSIxODYiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKd2UtZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjc5NDdFNTAxNzgiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISndlX09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9ISndlX2VmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMzM4NiIgaGVpZ2h0PSI5MDUiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISndlX3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKd2VfLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEp3ZkFPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKd2ZBZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEp3ZkF1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKd2ZBLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEp3ZkJPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKd2ZCZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEp3ZkJ1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKd2ZCLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKd2ZDT2ZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hKd2UtdWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEp3ZS0tZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTUxMSIgeT0iNjAwNCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEp3ZkV1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDFDMSI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKd2ZGZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hKd2ZGdWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIzMzE4IiBoZWlnaHQ9IjEwMzIiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISndmRi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKd2ZHT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEp3ZkdlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKd2ZHdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEp3ZkctZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKNlBvT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEo2UG9lZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKNlBvdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEo2UG8tZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKNlBwT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKNlBwZWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hKd2ZFLWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEp3ZkZPZlhFZHVxSG9PSmJVUlpSdyIgeD0iMjIwIiB5PSIyOTg4Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISjZQcHVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFGRUQ4ODEwMUI1Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEo2UHFlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEo2UHF1ZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjQ1MzgiIGhlaWdodD0iMjQyMSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKNlBxLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEo2UHJPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISjZQcmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEo2UHJ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKNlByLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISjZQc09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKNlBzZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISjZQc3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKNlBzLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISjZQdE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISjZQdGVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9ISjZQcC1mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hKNlBxT2ZYRWR1cUhvT0piVVJaUnciIHg9IjcxNzkiIHk9IjIzNDUiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKNlFGdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RDAzQjUiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISjZRR2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9ISjZRR3VmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMzYwNiIgaGVpZ2h0PSIxMDMyIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEo2UUctZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISjZRSE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKNlFIZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISjZRSHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKNlFILWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISjZRSU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKNlFJZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISjZRSXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKNlFJLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISjZRSk9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISjZRSmVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9ISjZRRi1mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hKNlFHT2ZYRWR1cUhvT0piVVJaUnciIHg9IjEzMDMwIiB5PSI1OTM1Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISjZRTC1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNTcwMEVGIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEo2UU11ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEo2UU0tZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjM2MDYiIGhlaWdodD0iMTAzMiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKNlFOT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEo2UU5lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISjZRTnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEo2UU4tZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISjZRT09mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEo2UU9lZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISjZRT3VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEo2UU8tZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISjZRUE9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEo2UVBlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEo2UVB1ZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEo2UU1PZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISjZRTWVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxNjg0MCIgeT0iNTkzNSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxEaWFncmFtU3R5bGUiIHhtaTppZD0iX0d3YllwZWZYRWR1cUhvT0piVVJaUnciIGRlc2NyaXB0aW9uPSJ8TWV0aG9kIGFuZCBQcm9jZXNzIEF1dGhvcmluZyBpcyBub3QgZG9uZSBpbiBpc29sYXRpb24gYnkgYSBzaW5nbGUgcHJvY2VzcyBlbmdpbmVlci4gIEVzcGVjaWFsbHksIHdoZW4gbGFyZ2Ugc2NhbGUgTWV0aG9kIExpYnJhcmllcyBzaGFsbCBiZSBtYWludGFpbmVkIGl0IGlzIGltcG9ydGFudCB0byBkZWZpbmUgdGhlIHJpZ2h0IG1vZHVsYXJpemF0aW9uIHByaW5jaXBsZXMgdGhhdCBhbGxvdyBjb25jdXJyZW50IGRldmVsb3BtZW50IG9mIGxhcmdlIHNjYWxlIHByb2Nlc3MgZW5naW5lZXJpbmcgdGVhbXMuICBNZXRob2QgUGx1Z2lucyB3ZXJlIGEgZmlyc3Qgc3RlcCBvZiBtb2R1bGFyaXphdGlvbi4gIEhvd2V2ZXIsIGV2ZW4gd29ya2luZyB3aXRoIE1ldGhvZCBQbHVnaW5zIGNhbiBvbmx5IHNjYWxlIGluIGxpbWl0ZWQgd2F5cyBzdXBwb3J0aW5nIG9ubHkgdmVyeSBzbWFsbCBhdXRob3JpbmcgdGVhbXMuICBGb3IgbGFyZ2VyIHNjYWxlIG1ldGhvZCBsaWJyYXJpZXMgY29uY3VycmVudCBhY2Nlc3MgYW5kIHdvcmtpbmcgZXZlbiB3aXRoaW4gYSBNZXRob2QgUGx1Z2luIGlzIHJlcXVpcmVkLiAgVG8gYWRkcmVzcyB0aGVzZSByZXF1aXJlbWVudHMgdGhlIE1ldGhvZCBVbml0cyBwYWNrYWdlIGV4dGVuZHMgTWV0aG9kIEVsZW1lbnRzIHZpYSBwYWNrYWdlIG1lcmdlIHdpdGggYSBuZXcgY2FwYWJpbGl0eSBkZWZpbmVkIGFzIE1ldGhvZCBVbml0LiAgQSBNZXRob2QgVW5pdCBpcyBhIHVuaXQgb2YgY29udHJvbCB0aGF0IGNhbiBiZSB3b3JrZWQgb24gYnkgb25lIHByb2Nlc3MgZW5naW5lZXIgYW5kIGNhbiBzZXJ2ZSBhcyBvbmUgdW5pdCBvZiB2ZXJzaW9uIGNvbnRyb2wuJiN4QTt8VGhlIGRpYWdyYW0gc2hvd3MgdGhhdCBmb3VyIHR5cGVzIG9mIE1ldGhvZCBVbml0cyBoYXZlIGJlZW4gZGVmaW5lZC4gIENvbnRlbnQgRGVzY3JpcHRpb24gcmVwcmVzZW50aW5nIGFsbCBtYWpvciB0ZXh0dWFsIGRlc2NyaXB0aW9uIG9mIGEgQ29udGVudCBFbGVtZW50IHN1Y2ggYXMgVGFzaywgQXJ0aWZhY3QsIEd1aWRlbGluZSwgb3IgV2hpdGVwYXBlciBzaGFsbCBiZSBtYWludGFpbmVkIGluIGEgc2VwYXJhdGUgdW5pdCBvZiBjb250cm9sLiAgV2hlcmVhcyBldmVyeSBDb250ZW50IEVsZW1lbnQncyBDb250ZW50IERlc2NyaXB0aW9uIGNhbiBiZSBzZWVuIGFzIGFuIGVsZW1lbnQgdGhhdCBjYW4gYmUgbWFpbnRhaW5lZCBpbiBpc29sYXRpb24sIFByb2Nlc3NlcyBhcmUga2VwdCBhbmQgbWFuYWdlZCBhcyBhIHdob2xlLiAgSWYgYSBicmVha2Rvd24gc3RydWN0dXJlIG5lZWRzIHRvIGJlIHNwbGl0IGFuZCBoYW5kbGVkIGFzIHNlcGFyYXRlIHVuaXRzIG9mIGNvbnRyb2wgdGhlbiBuZXcgcHJvY2Vzc2VzIHN1Y2ggYXMgQ2FwYWJpbGl0eSBQYXR0ZXJucyB3aWxsIGJlIGNyZWF0ZWQgZm9yIHN1Y2ggYSByZWZhY3RvcmluZy4gIEhlbmNlLCBleGFjdGx5IG9uZSBpbnN0YW5jZSBvZiBQcm9jZXNzIHNoYWxsIGJlIHN0b3JlZCBpbiBhbiBpbnN0YW5jZSBvZiBQcm9jZXNzIENvbXBvbmVudCwgd2hpY2ggaXMgZGVmaW5lZCB0byBiZSB0aGUgY29udGFpbmVyIGZvciBhIFByb2Nlc3MgYW5kIHRoZXJlZm9yZSBpdHMgTWV0aG9kIFVuaXQuICBGaW5hbGx5LCBNZXRob2QgUGx1Z2lucyBhbmQgTWV0aG9kIExpYnJhcmllcyBhcmUgZGVmaW5lZCBhcyBNZXRob2QgVW5pdHMuICBXaGVyZWFzLCB0aGUgZm9ybWVyIHN0b3JlcyBhbGwgJ21vZGVsZWQnIGVsZW1lbnRzIG9yZ2FuaXplZCBpbiBNZXRob2QgUGFja2FnZXMgc3VjaCBhcyBhbGwgQ29udGVudCBFbGVtZW50cyAob25seSB0aGUgZGVzY3JpcHRpb24gY2xhc3NlcyBhcmUgbWFpbnRhaW5lZCBhcyBzZXBhcmF0ZSB1bml0cyksIHRoZSBsYXRlciBkZWZpbmVzIGEgTWV0aG9kIFVuaXQgdG8gc3RvcmUgcmVmZXJlbmNlcyB0byB0aGUgTWV0aG9kIFBsdWdpbnMgdGhhdCBhcmUgcGFydCBvZiB0aGUgTGlicmFyeSBhcyB3ZWxsIGFzIE1ldGhvZCBDb25maWd1cmF0aW9ucy4mI3hBOyIvPgotICAgICAgICAgICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9ISjZQdHVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFGRUUwQzUwM0ExIiBzb3VyY2U9Il9ISndlb09mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9ISjZQcHVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEo2UHVlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISjZQdS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEo2UHZPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hKNlB1dWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9ISjZQdC1mWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEo2UHVPZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMjAzLCAtNDU3LCAtMTExNywgMjM4N10kWzc0NSwgLTE2MzQsIC01NzUsIDEyMTBdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hKNlB2ZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9ISjZQdnVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hKNlB2LWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUZFRTBDOTAxOTQiIHNvdXJjZT0iX0hKd2VzT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hKNlBwdWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISjZQd3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKNlB4T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISjZQeGVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEo2UHctZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hKNlB3T2ZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9ISjZQd2VmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMjk2LCAtNDU3LCAxNDgxLCAyMzg3XSRbLTEwMzIsIC0xNjM0LCA3NDUsIDEyMTBdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hKNlB4dWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9ISjZQeC1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hKNlB5T2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUZFRDg5MTAzQUQiIHNvdXJjZT0iX0hKNlBwdWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hKd2U2ZWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISjZQeS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKNlB6ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISjZQenVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEo2UHpPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hKNlB5ZWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9ISjZQeXVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMjUsIC0xMjE5LCAyNSwgMTYyNV0kWy01MCwgLTIzMTksIDAsIDUyNF0iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEo2UHotZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hKNlAwT2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEo2UDBlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyNzk0ODAwMDFBRSIgc291cmNlPSJfSEp3ZS1lZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEo2UHB1ZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKNlAxT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEo2UDF1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKNlAxLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISjZQMWVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEo2UDB1ZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hKNlAwLWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzcwMiwgLTQ1NywgLTM3NjcsIDIzODddJFsyNTU2LCAtMTYzNCwgLTE5MTMsIDEyMTBdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hKNlAyT2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9ISjZQMmVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hKNlAydWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MkE3RDUyRjAyNDMiIHNvdXJjZT0iX0hKNlBwdWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hKd2ZFdWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISjZQM2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKNlAzLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISjZQNE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEo2UDN1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKNlA0ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MkE3RDUzMDAyMDkiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKNlA0LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hKNlA0dWZYRWR1cUhvT0piVVJaUnciIHg9Ii0yNjQiIHk9Ii0yMTIiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISjZQNU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MkE3RDUzMDAyMDkiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKNlA1dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISjZQNWVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMzk3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEo2UDUtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDJBN0Q1MzAwMUUxIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISjZQNmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hKNlA2T2ZYRWR1cUhvT0piVVJaUnciIHg9Ii00NCIgeT0iLTI4OSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKNlA2dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MkE3RDUzMDAxRTEiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKNlA3T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hKNlA2LWZYRWR1cUhvT0piVVJaUnciIHg9Ii0xMzAwIiB5PSIyMjEiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISjZQN2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDJBN0Q1MzAwMjA5Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISjZQNy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISjZQOE9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISjZQN3VmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEo2UDhlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDJBN0Q1MzAwMUUxIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISjZQOC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISjZQOU9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISjZQOHVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEo2UDllZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MkE3RDUzMDAyMDkiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKNlA5LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKNlAtT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hKNlA5dWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISjZQLWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDJBN0Q1MzAwMUUxIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISjZQLS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKNlBfT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hKNlAtdWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9ISjZQMi1mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hKNlAzT2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0yMjY5LCAtNTAsIDUzMDAsIDBdJFstNTkwOSwgLTUwLCAxNjU5LCAwXSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEo2UUp1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRkZERjgyMDE2NiIgc291cmNlPSJfSEo2UUZ1ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEo2UHB1ZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKNlFLZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEo2UUstZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKNlFMT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISjZRS3VmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEo2UUotZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hKNlFLT2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy05NTYsIC01MjQsIDQ0MjgsIDIzNzBdJFstMzExNSwgLTE2ODQsIDIyNjksIDEyMTBdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hKNlFMZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9ISjZRTHVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hKNlFQLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0NDU2NUJCMTAxNUYiIHNvdXJjZT0iX0hKNlFMLWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hKNlBwdWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISjZRUXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKNlFST2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISjZRUmVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEo2UVEtZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hKNlFRT2ZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9ISjZRUWVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMTYxNywgLTUyNCwgNzU3NywgMjM3MF0kWy02OTI1LCAtMjE4NCwgMjI2OSwgNzExXSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9ISjZRUnVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEo2UVItZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICA8L2NvbnRlbnRzPgotICAgICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3dIMnBlZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRkVEREI2MDMwNiI+Ci0gICAgICAgICAgICA8Ym9keT4wMTwvYm9keT4KLSAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICA8cGFja2FnZU1lcmdlIHhtaTppZD0iX0dOa0I4T3hTRWR1T05yTVJnbXo0OEEiIG1lcmdlZFBhY2thZ2U9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwRkIiLz4KLSAgICAgICAgICA8cGFja2FnZU1lcmdlIHhtaTppZD0iX1JjcWZNT3gwRWR1NS12VmpsZlZzZlEiIG1lcmdlZFBhY2thZ2U9Il8zQURDN0I3NDAyMkQ0MTUxRTk5NjAwOUQiLz4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxRkVERTc1MDA0RSIgbmFtZT0iTWV0aG9kUGx1Z2luIj4KLSAgICAgICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MUZFRTBDNTAzQTEiIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0MUZFRDg4MTAxQjUiLz4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxRkVERTgwMDI1MiIgbmFtZT0iUHJvY2Vzc0NvbXBvbmVudCI+Ci0gICAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDFGRUUwQzkwMTk0IiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDFGRUQ4ODEwMUI1Ii8+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MUZFRDg4MTAxQjUiIG5hbWU9Ik1ldGhvZFVuaXQiIGlzQWJzdHJhY3Q9InRydWUiPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9Hd0gycy1mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDFGRUQ4ODEwMUI1Ij4KLSAgICAgICAgICAgICAgPGJvZHk+QSBNZXRob2QgVW5pdCBpcyBhIHNwZWNpYWwgTWV0aG9kIEVsZW1lbnQgdGhhdCBzaGFsbCBiZSBtYWludGFpbmVkIGluIGEgTWV0aG9kIExpYnJhcnkgYXMgYSBzZXBhcmF0ZSB1bml0IG9mIGNvbnRyb2wuPC9ib2R5PgotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDFGRUQ4OTEwM0FEIiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjgwIi8+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMDVCIiBuYW1lPSJhdXRob3JzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiPgotICAgICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0d3SDJ0LWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAwNUIiPgotICAgICAgICAgICAgICAgIDxib2R5PkV2ZXJ5IE1ldGhvZCBVbml0IGlzIGJlaW5nIGNyZWF0ZWQgYW5kIG93bmVkIGJ5IGFuIGF1dGhvciBvciBhdXRob3JpbmcgdGVhbS48L2JvZHk+Ci0gICAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il81ZEdORWV5R0VkdTUtdlZqbGZWc2ZRIiB2YWx1ZT0iMSIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il81ZEdORU95R0VkdTUtdlZqbGZWc2ZRIi8+Ci0gICAgICAgICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il81VVRkY095R0VkdTUtdlZqbGZWc2ZRIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIiB2YWx1ZT0iIi8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDA2NCIgbmFtZT0iY2hhbmdlRGF0ZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGNDQ5OEQwMTg1Ij4KLSAgICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9Hd1Jub3VmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMDY0Ij4KLSAgICAgICAgICAgICAgICA8Ym9keT5UaGUgZGF0ZSB0aGUgbGFzdCBjaGFuZ2UgdGhhdCByZXN1bHRlZCBpbnRvIHRoaXMgdmVyc2lvbiBoYXMgYmVlbiBtYWRlLjwvYm9keT4KLSAgICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX1VaLVE4ZXlNRWR1RktKb3ZCTDY0WFEiIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX1VaLVE4T3lNRWR1RktKb3ZCTDY0WFEiLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMDZFIiBuYW1lPSJjaGFuZ2VEZXNjcmlwdGlvbiIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIj4KLSAgICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9Hd1JucGVmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMDZFIj4KLSAgICAgICAgICAgICAgICA8Ym9keT5UaGUgZGVzY3JpcHRpb24gb2YgdGhlIGxhc3QgY2hhbmdlIHRoYXQgcmVzdWx0ZWQgaW50byB0aGlzIHZlcnNpb24uPC9ib2R5PgotICAgICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfTkdlNVlleUZFZHU1LXZWamxmVnNmUSIgdmFsdWU9IjEiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfTkdlNVlPeUZFZHU1LXZWamxmVnNmUSIvPgotICAgICAgICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfTzlaWHNPeUZFZHU1LXZWamxmVnNmUSIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyIgdmFsdWU9IiIvPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAwNkYiIG5hbWU9InZlcnNpb24iIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyI+Ci0gICAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3dSbnFPZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDA2RiI+Ci0gICAgICAgICAgICAgICAgPGJvZHk+RXZlcnkgUGFja2FnZSBoYXMgYSB2ZXJzaW9uIG51bWJlciB1c2VkIHRvIHRyYWNrIGNoYW5nZXMuPC9ib2R5PgotICAgICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfc1dUVjhleUdFZHU1LXZWamxmVnNmUSIgdmFsdWU9IjEiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfc1dUVjhPeUdFZHU1LXZWamxmVnNmUSIvPgotICAgICAgICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfc01VNmtPeUdFZHU1LXZWamxmVnNmUSIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyIgdmFsdWU9IiIvPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MkE3RDUzMDAxRTEiIG5hbWU9ImNvcHlyaWdodFN0YXRlbWVudCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMUMxIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQyQTdENTJGMDI0MyI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0d3YllvZWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0d3YllvT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0Mjc5NDdFNTAxNzgiIG5hbWU9IkNvbnRlbnREZXNjcmlwdGlvbiI+Ci0gICAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDI3OTQ4MDAwMUFFIiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDFGRUQ4ODEwMUI1Ii8+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MkE3RDUyRjAyNDMiIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQyQTdENTMwMDFFMSBfM0FEQzdCNzQwMjJENDJBN0Q1MzAwMjA5Ij4KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3dSbnJ1ZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyQTdENTJGMDI0MyI+Ci0gICAgICAgICAgICAgIDxib2R5PkEgTWV0aG9kIFVuaXQgY2FuIGhhdmUgZXhhY3RseSBvbmUgQ29weXJpZ2h0IFN0YXRlbWVudCBzZWN1cmluZyB0aGUgaW50ZWxsZWN0dWFsIGNhcGl0YWwgaXQgcmVwcmVzZW50cy4gIEl0IHdpbGwgYmUgcHVibGlzaGVkIHdpdGggdGhlIHJlc3BlY3RpdmUgY29uY3JldGUgRWxlbWVudC4gIE5vdGUsIHRoYXQgQ29weXJpZ2h0IFN0YXRlbWVudHMgZm9yIE1ldGhvZCBMaWJyYXJpZXMgYW5kIE1ldGhvZCBQbHVnaW5zIGRlZmluZSB0aGUgZGVmYXVsdCBzdGF0ZW1lbnQgZm9yIGl0cyBjb250YWluZWQgZWxlbWVudHMsIHdoaWNoIGNhbiBiZSAnb3ZlcndyaXR0ZW4nIHdpdGggcmV2aXNlZCBzdGF0ZW1lbnRzIGZvciBldmVyeSBDb250ZW50IERlc2NyaXB0aW9uIG9yIFByb2Nlc3MgQ29tcG9uZW50LjwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyQTdENTMwMDIwOSIgbmFtZT0iX21ldGhvZFVuaXQiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQxRkVEODgxMDFCNSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MkE3RDUyRjAyNDMiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9uckY4VWV5TUVkdUZLSm92Qkw2NFhRIiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9uckY4VU95TUVkdUZLSm92Qkw2NFhRIi8+Ci0gICAgICAgICAgICA8L293bmVkRW5kPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOlBhY2thZ2UiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxMTk5NEJGMDI4MiIgbmFtZT0iUHJvY2Vzc0RpYWdyYW1zIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il9Hd3VUbC1mWEVkdXFIb09KYlVSWlJ3IiBzb3VyY2U9InVtbDIuZGlhZ3JhbXMiIHJlZmVyZW5jZXM9Il8zQURDN0I3NDAyMkQ0MTUzMzYxMjAxNTEiPgotICAgICAgICAgIDxjb250ZW50cyB4bWk6dHlwZT0ibm90YXRpb246RGlhZ3JhbSIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDE1MzM2MTIwMTUxIiB0eXBlPSJDbGFzcyIgbmFtZT0iTWFpbiI+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEs4eHd1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTFGNjZCMDE1NSI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISzh4eGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEs4eHh1ZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEs4eHgtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEs4eHlPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEs4eHllZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISzh4eXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iUGFja2FnZUNvbnRlbnRzIj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hLOHh5LWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiIGNvbGxhcHNlZD0idHJ1ZSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9ISzh4dy1mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9Ik5vbmUiIHNob3dMaXN0VmlzaWJpbGl0eT0iTm9uZSIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISzh4eE9mWEVkdXFIb09KYlVSWlJ3IiB4PSIxODIwIiB5PSIzODUyIiB3aWR0aD0iNDk1NCIgaGVpZ2h0PSIxNzk0Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLOHh6T2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyNjIiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEs4eHotZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hLOHgwT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLOHgwZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLOHgwdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLOHgwLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEs4eDFPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlBhY2thZ2VDb250ZW50cyI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISzh4MWVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIiBjb2xsYXBzZWQ9InRydWUiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEs4eHplZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJOb25lIiBzaG93TGlzdFZpc2liaWxpdHk9Ik5vbmUiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEs4eHp1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMjY0MSIgeT0iNzM2NiIgd2lkdGg9IjMxNDkiIGhlaWdodD0iMTY3NiIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISzh4MXVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE1MUU5OTYwMDlEIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLOHgyZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9ISzh4MnVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISzh4Mi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISzh4M09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISzh4M2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLOHgzdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJQYWNrYWdlQ29udGVudHMiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEs4eDMtZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIgY29sbGFwc2VkPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hLOHgxLWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iTm9uZSIgc2hvd0xpc3RWaXNpYmlsaXR5PSJOb25lIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hLOHgyT2ZYRWR1cUhvT0piVVJaUnciIHg9IjI1NTYiIHk9IjY2OCIgd2lkdGg9IjM1MzAiIGhlaWdodD0iMTg2MiIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISzh4NE9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFMEQwRUQwMTA0Ij4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hMR2ljT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9ITEdpY2VmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITEdpY3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITEdpYy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITEdpZE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hMR2lkZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJQYWNrYWdlQ29udGVudHMiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSExHaWR1ZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIgY29sbGFwc2VkPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hLOHg0ZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iTm9uZSIgc2hvd0xpc3RWaXNpYmlsaXR5PSJOb25lIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hLOHg0dWZYRWR1cUhvT0piVVJaUnciIHg9Ijk0NTciIHk9IjIwMzIiIHdpZHRoPSIzMzM1IiBoZWlnaHQ9IjE2NzYiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSExHaWQtZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRERGODY5MDEyRSI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITEdpZXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSExHaWUtZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSExHaWZPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSExHaWZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSExHaWZ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITEdpZi1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iUGFja2FnZUNvbnRlbnRzIj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hMR2lnT2ZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiIGNvbGxhcHNlZD0idHJ1ZSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9ITEdpZU9mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9Ik5vbmUiIHNob3dMaXN0VmlzaWJpbGl0eT0iTm9uZSIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ITEdpZWVmWEVkdXFIb09KYlVSWlJ3IiB4PSI0MTE0IiB5PSIxMDgyMCIgd2lkdGg9IjQ4NzYiIGhlaWdodD0iMTY3NiIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTERpYWdyYW1TdHlsZSIgeG1pOmlkPSJfR3d1VG1lZlhFZHVxSG9PSmJVUlpSdyIgZGVzY3JpcHRpb249IlRoaXMgZGlhZ3JhbSBzaG93cyBob3cgdW1hIGRpYWdyYW1zIGFyZSBiYXNlZCBvbiB0aGUgdW1sMiBkaWFncmFtIGludGVyY2hhbmdlLiAgVGhlIG1ldGhvZCBtb2RlbCBwYWNrYWdlIGFjY2Vzc2VzIHRoZXNlIGRpYWdyYW1zLCBiZWNhdXNlIHRoZSBwcm9jZXNzIHBhY2thZ2VzIGRlZmluZWQgaW4gbWV0aG9kIG1vZGVscyBwYWNrYWdlL2NvbnRhaW4gdGhlIGRpYWdyYW1zLiIvPgotICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPgotICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hMR2lpdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUU1Nzc0MDAyM0QiIHNvdXJjZT0iX0hLOHh3dWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hMR2lkLWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSExHaWplZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iS2luZExhYmVsIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSExHaWotZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITEdpa2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJLaW5kIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hMR2lrT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ITEdpanVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9ITEdpaS1mWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hMR2lqT2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzk0OCwgODk3LCAtMTQzOSwgLTYwMTFdJFsyMzYyLCAyMTI1LCAtMjUsIC00NzgzXSRbMjM3MCwgNTc1NywgLTE2LCAtMTE1MV0iLz4KLSAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hMR2lrdWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSExHaWstZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX1NhdllrZW9sRWR1VkE3dnQ1cWJJSlEiIGVsZW1lbnQ9Il9TYXZZa09vbEVkdVZBN3Z0NXFiSUpRIiBzb3VyY2U9Il9ISzh4MXVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9ISzh4NE9mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX1NhdllsT29sRWR1VkE3dnQ1cWJJSlEiIHR5cGU9IktpbmRMYWJlbCI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX1NhdllsdW9sRWR1VkE3dnQ1cWJJSlEiIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfU2F2WW1Pb2xFZHVWQTd2dDVxYklKUSIgdHlwZT0iS2luZCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9TYXZZbC1vbEVkdVZBN3Z0NXFiSUpRIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfU2F2WWxlb2xFZHVWQTd2dDVxYklKUSIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfU2F2WWt1b2xFZHVWQTd2dDVxYklKUSIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9TYXZZay1vbEVkdVZBN3Z0NXFiSUpRIiBwb2ludHM9Ils2OCwgMTgsIC0xODksIC0zMF0kWzIyMiwgODEsIC0zNSwgMzNdIi8+Ci0gICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX3lsRDNzT3haRWR1T05yTVJnbXo0OEEiIGVsZW1lbnQ9Il95a3c4d094WkVkdU9Ock1SZ216NDhBIiBzb3VyY2U9Il9ISzh4d3VmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9ISzh4ek9mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3lsRDNzLXhaRWR1T05yTVJnbXo0OEEiIHR5cGU9IktpbmRMYWJlbCI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3lsRDN0ZXhaRWR1T05yTVJnbXo0OEEiIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfeWxEM3QteFpFZHVPTnJNUmdtejQ4QSIgdHlwZT0iS2luZCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il95bEQzdHV4WkVkdU9Ock1SZ216NDhBIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfeWxEM3RPeFpFZHVPTnJNUmdtejQ4QSIgeT0iMTM0OSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfeWxEM3NleFpFZHVPTnJNUmdtejQ4QSIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il95bEQzc3V4WkVkdU9Ock1SZ216NDhBIiBwb2ludHM9IlsyLCAzNSwgNSwgLTk2XSRbMTgsIDE2MywgMjEsIDMyXSIvPgotICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il8yRDFyc2V4WkVkdU9Ock1SZ216NDhBIiBlbGVtZW50PSJfMkQxcnNPeFpFZHVPTnJNUmdtejQ4QSIgc291cmNlPSJfSEs4eDF1ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEs4eHd1ZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il8yRDFydE94WkVkdU9Ock1SZ216NDhBIiB0eXBlPSJLaW5kTGFiZWwiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il8yRDFydHV4WkVkdU9Ock1SZ216NDhBIiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iXzJEMXJ1T3haRWR1T05yTVJnbXo0OEEiIHR5cGU9IktpbmQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfMkQxcnQteFpFZHVPTnJNUmdtejQ4QSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iXzJEMXJ0ZXhaRWR1T05yTVJnbXo0OEEiIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iXzJEMXJzdXhaRWR1T05yTVJnbXo0OEEiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfMkQxcnMteFpFZHVPTnJNUmdtejQ4QSIgcG9pbnRzPSJbNywgMzYsIDgsIC04M10kWzkzLCAxMTYsIDk0LCAtM10iLz4KLSAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgPC9jb250ZW50cz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3diWXJ1ZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxMTk5NEJGMDI4MiI+Ci0gICAgICAgICAgPGJvZHk+MDU8L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6UGFja2FnZSIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDE1MUU5OTYwMDlEIiBuYW1lPSJVTUFEaWFncmFtcyI+Ci0gICAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il9Hd3VUbE9mWEVkdXFIb09KYlVSWlJ3IiBzb3VyY2U9InVtbDIuZGlhZ3JhbXMiIHJlZmVyZW5jZXM9Il8zQURDN0I3NDAyMkQ0MTUxRTlFMzAxQjgiPgotICAgICAgICAgICAgPGNvbnRlbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpEaWFncmFtIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTUxRTlFMzAxQjgiIHR5cGU9IkNsYXNzIiBuYW1lPSJNYWluIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLOHhkdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTUzMEUzNDAxNTYiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISzh4ZWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9ISzh4ZXVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iNDI1MCIgaGVpZ2h0PSIxMDQ5Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEs4eGUtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISzh4Zk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLOHhmZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISzh4ZnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hLOHhmLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISzh4Z09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hLOHhnZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISzh4Z3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hLOHhnLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISzh4aE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISzh4aGVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9ISzh4ZC1mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hLOHhlT2ZYRWR1cUhvT0piVVJaUnciIHg9IjIyMTkiIHk9IjM4MDQiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLOHhodWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUUxRkFGMTAzNzYiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISzh4aWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9ISzh4aXVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMzA2NCIgaGVpZ2h0PSI5MDUiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISzh4aS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLOHhqT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEs4eGplZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLOHhqdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEs4eGotZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLOHhrT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEs4eGtlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLOHhrdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEs4eGstZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLOHhsT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hLOHhsZWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hLOHhoLWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEs4eGlPZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTU4NSIgeT0iOTUxIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTERpYWdyYW1TdHlsZSIgeG1pOmlkPSJfR3d1VGx1ZlhFZHVxSG9PSmJVUlpSdyIgZGVzY3JpcHRpb249IlVNQSBzdXBwb3J0cyB0aHJlZSB0eXBlcyBvZiBkaWFncmFtcy4gSG93ZXZlciwgdGhpcyBzcGVjaWZpY2F0aW9uIGRvZXMgbm90IGRlZmluZSB0aGUgc3ludGF4IG9mIHRoZXNlIGRpYWdyYW1zLCBidXQgcmF0aGVyIHJlbGllcyBvbiBhIHRvb2wgaW1wbGVtZW50YXRpb24gZm9yIHRoZSBleGFjdCBwcmVzZW50YXRpb24gb2YgdGhlIHRocmVlIGRpYWdyYW1zLiAgVXRpbHppbmcgdGhlIFVNTDIgRGlhZ3JhbSBJbnRlcmNoYW5nZSBzcGVjaWZpY2F0aW9uIHRoaXMgc3BlY2lmaWNhdGlvbiBwcm92aWRlcyBhbGwgc3RydWN0dXJlcyB0byByZXByZXNlbnQgYW5kIHBlcnNpc3QgdGhlc2UgZGlhZ3JhbXMuIi8+Ci0gICAgICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hLOHhsdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTUzM0RFNzAxRUEiIHNvdXJjZT0iX0hLOHhodWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hLOHhkdWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISzh4bWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLOHhtLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISzh4bk9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEs4eG11ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLOHhuZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTUzM0RFNzAzQUQiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLOHhuLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hLOHhudWZYRWR1cUhvT0piVVJaUnciIHg9IjE4NyIgeT0iLTMzOSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLOHhvT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTMzREU3MDNBRCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEs4eG91ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hLOHhvZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0zOTciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISzh4by1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTUzM0RFNzAzQTMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLOHhwZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEs4eHBPZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTIyOSIgeT0iLTI1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLOHhwdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTUzM0RFNzAzQTMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLOHhxT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hLOHhwLWZYRWR1cUhvT0piVVJaUnciIHg9Ii0yNDAiIHk9IjkwMyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLOHhxZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTUzM0RFNzAzQUQiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLOHhxLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hLOHhyT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hLOHhxdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISzh4cmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTUzM0RFNzAzQTMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLOHhyLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hLOHhzT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hLOHhydWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISzh4c2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTMzREU3MDNBRCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEs4eHMtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEs4eHRPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEs4eHN1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLOHh0ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTUzM0RFNzAzQTMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLOHh0LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEs4eHVPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEs4eHR1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hLOHhsLWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9ISzh4bU9mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlswLCA0NDgsIDAsIC0zMTA3XSRbMCwgMzAyMiwgMCwgLTUzM10iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgIDwvY29udGVudHM+Ci0gICAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9Hd2JZc3VmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDE1MUU5OTYwMDlEIj4KLSAgICAgICAgICAgIDxib2R5PjAyPC9ib2R5PgotICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgIDxwYWNrYWdlTWVyZ2UgeG1pOmlkPSJfU2F2WWtPb2xFZHVWQTd2dDVxYklKUSIgbWVyZ2VkUGFja2FnZT0iXzNBREM3Qjc0MDIyRDQxRTBEMEVEMDEwNCIvPgotICAgICAgICAgIDxwYWNrYWdlTWVyZ2UgeG1pOmlkPSJfMkQxcnNPeFpFZHVPTnJNUmdtejQ4QSIgbWVyZ2VkUGFja2FnZT0iXzNBREM3Qjc0MDIyRDQxNTFGNjZCMDE1NSIvPgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDFFMUZBRjEwMzc2IiBuYW1lPSJQcm9jZXNzUGFja2FnZSI+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDE1MzNERTcwM0EzIiBuYW1lPSJkaWFncmFtcyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDE1MzBFMzQwMTU2IiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQxNTMzREU3MDFFQSI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0d3dVRrT2ZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0d3a2luLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTUzM0RFNzAxRUEiIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQxNTMzREU3MDNBMyBfM0FEQzdCNzQwMjJENDE1MzNERTcwM0FEIj4KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3draW5PZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTMzREU3MDFFQSI+Ci0gICAgICAgICAgICAgIDxib2R5PlRoaXMgYXNzb2NpYXRpb24gaXMgdGhlIG9ubHkgbWVtYmVyIG9mIHRoZSB1bWFkaWFncmFtcyBwYWNrYWdlLiAgSXQgZGVmaW5lcyB0aGF0IERpYWdyYW1zIGNhbiBiZSBwYWNrYWdlZCBpbiBQcm9jZXNzIFBhY2thZ2VzLjwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxNTMzREU3MDNBRCIgbmFtZT0iX3Byb2Nlc3NQYWNrYWdlIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MUUxRkFGMTAzNzYiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MTUzM0RFNzAxRUEiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9Hd3VUay1mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iMSIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9Hd3VUa3VmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iMSIvPgotICAgICAgICAgICAgPC9vd25lZEVuZD4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cHJvZmlsZUFwcGxpY2F0aW9uIHhtaTppZD0iX0dkcG1rZWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il9HZHpYa09mWEVkdXFIb09KYlVSWlJ3IiBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvdW1sMi8yLjAuMC9VTUwiPgotICAgICAgICA8cmVmZXJlbmNlcyB4bWk6dHlwZT0iZWNvcmU6RVBhY2thZ2UiIGhyZWY9InBhdGhtYXA6Ly9VTUxfUFJPRklMRVMvU3RhbmRhcmQucHJvZmlsZS51bWwjX3l6VTU4WWluRWRxdHZibmZCMkxfNXciLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGFwcGxpZWRQcm9maWxlIGhyZWY9InBhdGhtYXA6Ly9VTUxfUFJPRklMRVMvU3RhbmRhcmQucHJvZmlsZS51bWwjXzAiLz4KLSAgICA8L3Byb2ZpbGVBcHBsaWNhdGlvbj4KLSAgICA8cHJvZmlsZUFwcGxpY2F0aW9uIHhtaTppZD0iX0dkelhrZWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il9HZHpYa3VmWEVkdXFIb09KYlVSWlJ3IiBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvdW1sMi8yLjAuMC9VTUwiPgotICAgICAgICA8cmVmZXJlbmNlcyB4bWk6dHlwZT0iZWNvcmU6RVBhY2thZ2UiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX01TTF9QUk9GSUxFUy9EZWZhdWx0LmVweCNfSU44azhNbUJFZHFCY04xUjZFdldVdz9EZWZhdWx0L0RlZmF1bHQ/Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxhcHBsaWVkUHJvZmlsZSBocmVmPSJwYXRobWFwOi8vVU1MMl9NU0xfUFJPRklMRVMvRGVmYXVsdC5lcHgjX2FfUzN3TldMRWRpeTRJcVA4d2hqRkE/RGVmYXVsdD8iLz4KLSAgICA8L3Byb2ZpbGVBcHBsaWNhdGlvbj4KLSAgICA8cHJvZmlsZUFwcGxpY2F0aW9uIHhtaTppZD0iX0dkelhrLWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il9HZHpYbE9mWEVkdXFIb09KYlVSWlJ3IiBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvdW1sMi8yLjAuMC9VTUwiPgotICAgICAgICA8cmVmZXJlbmNlcyB4bWk6dHlwZT0iZWNvcmU6RVBhY2thZ2UiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX01TTF9QUk9GSUxFUy9EZXBsb3ltZW50LmVweCNfSXJkQVVNbUJFZHFCY04xUjZFdldVdz9EZXBsb3ltZW50L0RlcGxveW1lbnQ/Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxhcHBsaWVkUHJvZmlsZSBocmVmPSJwYXRobWFwOi8vVU1MMl9NU0xfUFJPRklMRVMvRGVwbG95bWVudC5lcHgjX3ZqYnV3T3ZIRWRpRFg1YmppMGlWU0E/RGVwbG95bWVudD8iLz4KLSAgICA8L3Byb2ZpbGVBcHBsaWNhdGlvbj4KLSAgICA8cHJvZmlsZUFwcGxpY2F0aW9uIHhtaTppZD0iX2dxT1FvQUIyRWR1ZXEtVmlMWWlleVEiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il9ncU9Rb1FCMkVkdWVxLVZpTFlpZXlRIiBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvdW1sMi8yLjAuMC9VTUwiPgotICAgICAgICA8cmVmZXJlbmNlcyB4bWk6dHlwZT0iZWNvcmU6RVBhY2thZ2UiIGhyZWY9InBhdGhtYXA6Ly9VTUxfUFJPRklMRVMvRWNvcmUucHJvZmlsZS51bWwjX3Z5LUhVWWluRWRxdHZibmZCMkxfNXciLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGFwcGxpZWRQcm9maWxlIGhyZWY9InBhdGhtYXA6Ly9VTUxfUFJPRklMRVMvRWNvcmUucHJvZmlsZS51bWwjXzAiLz4KLSAgICA8L3Byb2ZpbGVBcHBsaWNhdGlvbj4KLSAgPC91bWw6TW9kZWw+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR2hPZkFPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR2hFdUF1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0doWVFBT2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0doT2ZBdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HaHJLOE9mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HaGhaOU9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR2gwVTRPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR2hySy11ZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0doMFU1ZWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0doMFU1T2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HaC1GNE9mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HaDBVNk9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR2gtRjVPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR2gtRjQtZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dpSDI0T2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0doLUY1LWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HaUgyNU9mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HaUgyNC1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR2lIMjUtZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR2lIMjV1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dpUkEwdWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dpUkEwZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HaVJBMWVmWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HaVJBMU9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR2lheDBPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR2lSQTEtZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dpYXgwLWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dpYXgwdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HaWF4MS1mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HaWF4MXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR2lraTBPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR2lheDJ1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dpa2kxT2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dpa2kwLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HaWtpMS1mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HaWtpMXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR2l0c3dPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR2lraTJlZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dpdHN3LWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dpdHN3dWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HaTNkd09mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HaXRzeC1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR2kzZHctZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR2kzZHd1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dpM2R5T2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dpM2R4LWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HaTNkek9mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HaTNkeS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR2pBbnN1ZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR2pBbnNlZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dqQW51T2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dqQW50LWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HakFudk9mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HakFudS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR2pLWXNPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR2pBbndPZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dqS1l0T2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dqS1lzLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HaktZdC1mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HaktZdHVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR2pVSnNPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR2pLWXVlZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dqZFRvT2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dqVUpzLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HamRUcE9mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HamRUby1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR2pkVHFPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR2pkVHAtZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dqZFRyT2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dqZFRxLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9Ham5Fb09mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HamRUci1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR2puRXBPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR2puRW8tZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0drRHdrT2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dqNV9sT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9Ha0R3bWVmWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9Ha0R3bU9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR2tEd291ZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR2tEd29lZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0drTTZnT2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0drRHdxdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9Ha002aWVmWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9Ha002aU9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR2tNNmt1ZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR2tNNmtlZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0drV3JnT2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0drTTZtdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9Ha1dyaWVmWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9Ha1dyaU9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR2tXcmt1ZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR2tXcmtlZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0drZ2NnT2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0drV3JtdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9Ha2djaWVmWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9Ha2djaU9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR2tnY2t1ZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR2tnY2tlZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0drcG1jT2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0drZ2NtdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9Ha3BtZWVmWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9Ha3BtZU9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR2twbWd1ZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR2twbWdlZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0drelhjT2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0drcG1pdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9Ha3pYZ09mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9Ha3pYZi1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR2s5SWNPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR2t6WGlPZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0drOUllZWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0drOUllT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HbHN2VU9mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HbGktV2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR2xzdldPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR2xzdlYtZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dsc3ZYT2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dsc3ZXLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HbHN2WU9mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HbHN2WC1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR2wxNVFPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR2xzdlktZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dsMTVST2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dsMTVRLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HbDE1U09mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HbDE1Ui1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR2xfcVFPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR2wxNVRlZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dsX3FST2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dsX3FRLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HbF9xVGVmWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HbF9xVE9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR21KYlFPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR2xfcVZlZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dtSmJSLWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dtSmJSdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HbUpiVU9mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HbUpiVC1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR21TbE1PZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR21KYldPZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dtU2xPZWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dtU2xPT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HbVNsUXVmWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HbVNsUWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR21jV01PZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR21TbFVlZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dtY1dPZWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dtY1dPT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HbWNXUXVmWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HbWNXUWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR21sZ0lPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR21jV1N1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dtbGdLZWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dtbGdLT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HbWxnTXVmWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HbWxnTWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR201Q0pPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR201Q0ktZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dtNUNMdWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dtNUNMZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HbkNNRU9mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HbTVDTWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR25DTUZPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR25DTUUtZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0duQ01HT2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0duQ01GLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HbkNNSE9mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HbkNNRy1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR25MOUVPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR25DTUpPZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0duTDlHZWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0duTDlHT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9Hbkw5SXVmWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9Hbkw5SWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR25WdUVPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR25MOUt1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0duVnVHZWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0duVnVHT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HbmU0RC1mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HbmU0RHVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR25vcEFPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR25lNEctZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dueHk4T2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dub3BCT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9Hbnh5OC1mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9Hbnh5OHVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR254eTl1ZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR254eTllZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dueHktLWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dueHktdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HbjdqOE9mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9Hbnh5X2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR243ajgtZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR243ajh1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0duN2o5dWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0duN2o5ZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HbjdqLWVmWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HbjdqLU9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR243al9PZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR243ai0tZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dvRlU5T2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dvRlU4LWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9Hb0ZVOS1mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9Hb0ZVOXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR29GVV9PZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR29GVS0tZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dvT2U0T2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dvRlVfdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9Hb1lQNGVmWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9Hb1lQNE9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR29ZUDgtZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR29ZUDh1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dvWVAtdWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dvWVAtZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9Hb2lBNE9mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9Hb1lQX3VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR29pQTVPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR29pQTQtZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dvaUE2T2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dvaUE1LWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9Hb2lBNi1mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9Hb2lBNnVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR29ySzBPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR29pQTdlZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dvckswLWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dvckswdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9Hb3JLMXVmWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9Hb3JLMWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR29ySzJlZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR29ySzJPZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dvckszLWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dvckszdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HbzA3ME9mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9Hb3JLNHVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR28wNzFPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR28wNzAtZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dvMDcyZWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dvMDcyT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HbzA3M3VmWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HbzA3M2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR28tRnhPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR28tRnctZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dvLUZ6ZWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dvLUZ6T2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9Hby1GMXVmWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9Hby1GMWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3BIMnllZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3BIMnlPZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dwUm53T2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dwSDJ5LWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HcFJueC1mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HcFJueHVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3BSbnktZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3BSbnl1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dwUm56LWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dwUm56dWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HcGF4c09mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HcFJuMHVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3BheHRPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3BheHMtZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dwYXh1T2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dwYXh0LWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HcGF4dk9mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HcGF4dS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3BheHdPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3BheHYtZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dwa2lzT2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dwYXh3LWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HcGtpdE9mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HcGtpcy1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3BraXVPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3BraXQtZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dwa2l2T2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dwa2l1LWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HcHVUc09mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HcGtpdi1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3B1VHRPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3B1VHMtZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dwdVR2T2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dwdVR1LWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HcHVUd09mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HcHVUdi1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3AzZG91ZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3AzZG9lZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dwM2RxLWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dwM2RxdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HcDNkdE9mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HcDNkcy1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3FCT29PZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3AzZHZPZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dxQk9xZWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dxQk9xT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HcUJPc3VmWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HcUJPc2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3FLWWtPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3FCT3V1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dxS1ltZWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dxS1ltT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HcUtZb3VmWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HcUtZb2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3FVSmtPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3FLWXFPZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dxVUptZWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dxVUptT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HcW5FZ09mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HcWQ2ay1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3FuRWlPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3FuRWgtZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dxbkVqT2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dxbkVpLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HcW5Fa09mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HcW5Fai1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3FuRWxPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3FuRWstZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dxdzFnZWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dxdzFnT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HcXcxaGVmWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HcXcxaE9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3F3MWllZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3F3MWlPZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dxdzFqZWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dxdzFqT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HcTZtZ09mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HcXcxa09mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3E2bWhPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3E2bWctZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dxNm1qZWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dxNm1qT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HcTZtbHVmWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HcTZtbGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3JEd2MtZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3JEd2N1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dyTmhjT2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dyRHdlLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9Hck5oZWVmWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9Hck5oZU9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3JXclktZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3JXcll1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dyV3JiT2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dyV3JhLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HcldyZGVmWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HcldyZE9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3JnY1otZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3JnY1p1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dycU5ZdWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dycU5ZZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HcnFOYU9mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HcnFOWi1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3JxTmJPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3JxTmEtZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dyelhVT2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dycU5idWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HcnpYVS1mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HcnpYVXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3J6WFYtZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3J6WFZ1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dyelhXLWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dyelhXdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HcjlJVU9mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HcnpYWGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3I5SVZPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3I5SVUtZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dyOUlWLWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dyOUlWdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HcjlJV3VmWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HcjlJV2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3NHNVVPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3I5SVhlZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dzRzVVLWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dzRzVVdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9Hc0c1V09mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9Hc0c1Vi1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3NHNVh1ZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3NHNVhlZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dzUURSdWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dzUURSZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9Hc1FEVC1mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9Hc1FEVHVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3NRRFdPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3NRRFYtZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dzWjBUdWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dzWjBUZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9Hc2ktTU9mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9Hc1owVk9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3NpLU5PZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3NpLU0tZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dzaS1PZWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dzaS1PT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9Hc2ktUGVmWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9Hc2ktUE9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3Nzdk1PZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3NpLVFPZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dzc3ZOT2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dzc3ZNLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9Hc3N2T09mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9Hc3N2Ti1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3NzdlBPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3Nzdk8tZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dzMmdNT2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dzc3ZRT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HczJnTk9mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HczJnTS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3MyZ1BlZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3MyZ1BPZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dzMmdSdWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dzMmdSZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9Hc19xSXVmWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9Hc19xSWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3NfcUstZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3NfcUt1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dzX3FOT2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dzX3FNLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HdEpiSWVmWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HdEpiSU9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3RKYkt1ZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3RKYktlZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0d0SmJNLWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0d0SmJNdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HdFRNSU9mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HdEpiTy1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3RUTUotZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3RUTUp1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0d0VE1MdWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0d0VE1MZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HdG1IRk9mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HdG1IRS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3RtSEhPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3RtSEctZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0d0bUhJZWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0d0bUhJT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HdHZSQU9mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HdG1ISk9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3R2UkJPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3R2UkEtZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0d0dlJEZWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0d0dlJET2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HdDVDQU9mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HdHZSRmVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3Q1Q0R1ZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3Q1Q0RlZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0d0NUNHZWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0d0NUNHT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HdUN6QXVmWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HdUN6QWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3VDekNlZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3VDekNPZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0d1Q3pET2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0d1Q3pDLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HdUN6RWVmWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HdUN6RU9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3VMODhPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3VDekUtZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0d1TDg4LWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0d1TDg4dWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HdUw4LU9mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HdUw4OS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3VMOC0tZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3VMOC11ZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0d1VnQ4T2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0d1TDhfLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HdVZ0OC1mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HdVZ0OHVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3VWdDl1ZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3VWdDllZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0d1VnQtZWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0d1VnQtT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HdVZ0X3VmWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HdVZ0X2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3VmZThPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3VWdUF1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0d1ZmU4LWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0d1ZmU4dWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HdWZlOXVmWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HdWZlOWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3VmZS1lZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3VmZS1PZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0d1ZmVfT2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0d1ZmUtLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HdW9vNGVmWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HdW9vNE9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3VvbzVPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3VvbzQtZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0d1b282T2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0d1b281LWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HdW9vNi1mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HdW9vNnVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3V5WjRPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3VvbzctZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0d2WVB3T2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0d2UEYydWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HdllQek9mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HdllQeS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3ZZUDNlZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3ZZUDNPZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0d2aUF3T2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0d2WVA0T2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HdmlBeE9mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HdmlBdy1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3ZpQXlPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3ZpQXgtZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0d2aUF6dWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0d2aUF6ZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HdnJ4d09mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HdmlBMXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3ZyeHllZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3ZyeHlPZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0d2cngwdWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0d2cngwZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HdjA3c09mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HdnJ4Mk9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3YwN3QtZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3YwN3R1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0d2MDd3T2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0d2MDd2LWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9Hdi1zcy1mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9Hdi1zc3VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3dIMnB1ZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3dIMnBlZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0d3SDJ0T2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0d3SDJzLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9Hd1Jub09mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9Hd0gydC1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3dSbm8tZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3dSbm91ZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0d3Um5wdWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0d3Um5wZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9Hd1JucWVmWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9Hd1JucU9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3dSbnItZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3dSbnJ1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0d3YllyLWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0d3YllydWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9Hd2tpa09mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9Hd2JZc3VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3draW5lZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3draW5PZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0d3NEVrT2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0d3dVRvT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HdzRFay1mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HdzRFa3VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3c0RWx1ZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3c0RWxlZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0d4Qk9ndWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0d4Qk9nZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HeG5yY09mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HeGQ2ZHVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3hucmRPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3hucmMtZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0d4bnJkLWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0d4bnJkdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HeG5yZk9mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HeG5yZS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3hucmdPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3hucmYtZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0d4dzFZT2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0d4bnJoT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HeHcxWmVmWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HeHcxWk9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3g2bVllZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3g2bVlPZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RWNvcmU6RURhdGFUeXBlIHhtaTppZD0iXzVHY1lDZWllRWR1UWJ1WTZVd01TUWciIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLmxhbmcuQm9vbGVhbiIgYmFzZV9QcmltaXRpdmVUeXBlPSJfNUdjWUFPaWVFZHVRYnVZNlV3TVNRZyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iXzVHY1lEZWllRWR1UWJ1WTZVd01TUWciIGJhc2VfQ29tbWVudD0iXzVHY1lBZWllRWR1UWJ1WTZVd01TUWciLz4KLSAgPEVjb3JlOkVEYXRhVHlwZSB4bWk6aWQ9Il9CYXN0TU9pZkVkdVFidVk2VXdNU1FnIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5sYW5nLlN0cmluZyIgYmFzZV9QcmltaXRpdmVUeXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfaTdGVG9laWZFZHVRYnVZNlV3TVNRZyIgYmFzZV9Db21tZW50PSJfaTdGVG9PaWZFZHVRYnVZNlV3TVNRZyIvPgotICA8RWNvcmU6RURhdGFUeXBlIHhtaTppZD0iX1dlLVFrT29GRWR1T0JQUUEyaEtxVVEiIGluc3RhbmNlQ2xhc3NOYW1lPSJpbnQiIGJhc2VfUHJpbWl0aXZlVHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEE0MDA3QiIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX2RVYzZvZW9GRWR1T0JQUUEyaEtxVVEiIGJhc2VfQ29tbWVudD0iX2RVYzZvT29GRWR1T0JQUUEyaEtxVVEiLz4KLSAgPEVjb3JlOkVEYXRhVHlwZSB4bWk6aWQ9Il92MW5Jc09vRkVkdU9CUFFBMmhLcVVRIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS51dGlsLkRhdGUiIGJhc2VfUHJpbWl0aXZlVHlwZT0iXzNBREM3Qjc0MDIyRDQwRjQ0OThEMDE4NSIvPgotICA8RWNvcmU6RURhdGFUeXBlIHhtaTppZD0iXzdnSEE4T29GRWR1T0JQUUEyaEtxVVEiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLnV0aWwuTGlzdCIgYmFzZV9QcmltaXRpdmVUeXBlPSJfM0FEQzdCNzQwMjJEM0YwOTg5OUMwMEVBIi8+Ci0gIDxFY29yZTpFRGF0YVR5cGUgeG1pOmlkPSJfQUdfRmNPb0dFZHVPQlBRQTJoS3FVUSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEudXRpbC5TZXQiIGJhc2VfUHJpbWl0aXZlVHlwZT0iXzNBREM3Qjc0MDIyRDNGMDk4OUI5MDI5MCIvPgotICA8RWNvcmU6RURhdGFUeXBlIHhtaTppZD0iX0VJZFcwT29HRWR1T0JQUUEyaEtxVVEiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLm5ldC5VUkkiIGJhc2VfUHJpbWl0aXZlVHlwZT0iXzNBREM3Qjc0MDIyRDQxMTNFQTI5MDJGRSIvPgotICA8RWNvcmU6RUF0dHJpYnV0ZSB4bWk6aWQ9Il9vZ2lHb09vSEVkdU9CUFFBMmhLcVVRIiBpc1Vuc2V0dGFibGU9InRydWUiIGJhc2VfUHJvcGVydHk9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAwNTAiIGlzSUQ9InRydWUiLz4KLSAgPEVjb3JlOkVBdHRyaWJ1dGUgeG1pOmlkPSJfNTJUZm9Pb0hFZHVPQlBRQTJoS3FVUSIgaXNVbnNldHRhYmxlPSJ0cnVlIiBiYXNlX1Byb3BlcnR5PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMDQ3Ii8+Ci0gIDxFY29yZTpFQXR0cmlidXRlIHhtaTppZD0iX0pBSUJvT29NRWR1T0JQUUEyaEtxVVEiIGlzVW5zZXR0YWJsZT0idHJ1ZSIgYmFzZV9Qcm9wZXJ0eT0iXzNBREM3Qjc0MDIyRDQyN0E4QTFGMDJGMyIvPgotICA8RWNvcmU6RUF0dHJpYnV0ZSB4bWk6aWQ9Il9MUmFId09vTUVkdU9CUFFBMmhLcVVRIiBpc1Vuc2V0dGFibGU9InRydWUiIGJhc2VfUHJvcGVydHk9Il8zQURDN0I3NDAyMkQ0MEY5QUI5ODAyQjkiLz4KLSAgPEVjb3JlOkVBdHRyaWJ1dGUgeG1pOmlkPSJfTmNiTjBPb01FZHVPQlBRQTJoS3FVUSIgaXNVbnNldHRhYmxlPSJ0cnVlIiBiYXNlX1Byb3BlcnR5PSJfM0FEQzdCNzQwMjJENDU1RTY1QzgwMjE4Ii8+Ci0gIDxFY29yZTpFQXR0cmlidXRlIHhtaTppZD0iX1BGblpNT29NRWR1T0JQUUEyaEtxVVEiIGlzVW5zZXR0YWJsZT0idHJ1ZSIgYmFzZV9Qcm9wZXJ0eT0iXzNBREM3Qjc0MDIyRDQxREYzMjE5MDAyOSIvPgotICA8RWNvcmU6RUF0dHJpYnV0ZSB4bWk6aWQ9Il9SV1RDWU9vTUVkdU9CUFFBMmhLcVVRIiBpc1Vuc2V0dGFibGU9InRydWUiIGJhc2VfUHJvcGVydHk9Il8zQURDN0I3NDAyMkQ0Mjc5NjI1RDAyMzQiLz4KLSAgPEVjb3JlOkVBdHRyaWJ1dGUgeG1pOmlkPSJfVURTMElPb01FZHVPQlBRQTJoS3FVUSIgaXNVbnNldHRhYmxlPSJ0cnVlIiBiYXNlX1Byb3BlcnR5PSJfM0FEQzdCNzQwMjJENDIxRTRERjMwMDNBIi8+Ci0gIDxFY29yZTpFQXR0cmlidXRlIHhtaTppZD0iX3B3dllBT29NRWR1T0JQUUEyaEtxVVEiIGlzVW5zZXR0YWJsZT0idHJ1ZSIgYmFzZV9Qcm9wZXJ0eT0iXzNBREM3Qjc0MDIyRDQxRERGQzhFMDBCNiIvPgotICA8RWNvcmU6RVJlZmVyZW5jZSB4bWk6aWQ9Il9wNngyRU9vU0VkdU9CUFFBMmhLcVVRIiBpc1RyYW5zaWVudD0idHJ1ZSIgYmFzZV9Qcm9wZXJ0eT0iXzNBREM3Qjc0MDIyRDQyNzk2MkQ0MDIwMyIvPgotICA8RWNvcmU6RVJlZmVyZW5jZSB4bWk6aWQ9Il8xcVhwc09vU0VkdU9CUFFBMmhLcVVRIiBpc1RyYW5zaWVudD0idHJ1ZSIgYmFzZV9Qcm9wZXJ0eT0iXzNBREM3Qjc0MDIyRDQwRjM2QzkzMDBGNiIvPgotICA8RWNvcmU6RVJlZmVyZW5jZSB4bWk6aWQ9Il80Wi1EZ09vU0VkdU9CUFFBMmhLcVVRIiBpc1RyYW5zaWVudD0idHJ1ZSIgYmFzZV9Qcm9wZXJ0eT0iXzNBREM3Qjc0MDIyRDQwRjM2QzkzMDBGOCIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX1A0b3NZZW9lRWR1VkE3dnQ1cWJJSlEiIGJhc2VfQ29tbWVudD0iX1A0b3NZT29lRWR1VkE3dnQ1cWJJSlEiLz4KLSAgPEVjb3JlOkVEYXRhVHlwZSB4bWk6aWQ9Il9DRUlIa094M0VkdTUtdlZqbGZWc2ZRIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5sYW5nLkRvdWJsZSIgYmFzZV9QcmltaXRpdmVUeXBlPSJfQVVxOElPeDNFZHU1LXZWamxmVnNmUSIvPgotPC94bWk6WE1JPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9tb2RlbC8xLjAuNC91bWEuZWNvcmUgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL21vZGVsLzEuMC40L3VtYS5lY29yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTRiODM2OC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL21vZGVsLzEuMC40L3VtYS5lY29yZQorKysgL2Rldi9udWxsCkBAIC0xLDEyMzkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxlY29yZTpFUGFja2FnZSB4bWk6dmVyc2lvbj0iMi4wIgotICAgIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgICB4bWxuczplY29yZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSIgbmFtZT0idW1hIgotICAgIG5zVVJJPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiBuc1ByZWZpeD0ib3JnLmVjbGlwc2UuZXBmLnVtYSI+Ci0gIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSIwMyIvPgotICA8L2VBbm5vdGF0aW9ucz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJEYXRlIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS51dGlsLkRhdGUiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkRhdGEgdHlwZSB1c2VkIGZvciBhdHRyaWJ1dGVzIG9mIG1ldGEtbW9kZWwgY2xhc3NlcyBvZiB0aGUgdHlwZSBEYXRlLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJVcmkiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLm5ldC5VUkkiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkRhdGEgdHlwZSB1c2VkIGZvciBhdHRyaWJ1dGVzIG9mIG1ldGEtbW9kZWwgY2xhc3NlcyB0aGF0IHBvaW50IHRvIHJlc291cmNlcyBzdWNoIGFzIGZpbGVzLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJVbmxpbWl0ZWROYXR1cmFsIiBpbnN0YW5jZUNsYXNzTmFtZT0iaW50Ii8+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iU3RyaW5nIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5sYW5nLlN0cmluZyIvPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IlNldCIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEudXRpbC5TZXQiLz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJTZXF1ZW5jZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEudXRpbC5MaXN0Ii8+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iSW50ZWdlciIgaW5zdGFuY2VDbGFzc05hbWU9ImludCIvPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IkZsb2F0IiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5sYW5nLkZsb2F0Ii8+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQ2xhc3NpZmllciIgYWJzdHJhY3Q9InRydWUiIGVTdXBlclR5cGVzPSIjLy9UeXBlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJVTUwgMi4wIG1ldGEtY2xhc3MgQ2xhc3NpZmllci4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iVHlwZSIgYWJzdHJhY3Q9InRydWUiIGVTdXBlclR5cGVzPSIjLy9QYWNrYWdlYWJsZUVsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlVNTCAyLjAgbWV0YS1jbGFzcyBUeXBlLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJFbGVtZW50IiBhYnN0cmFjdD0idHJ1ZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVU1MIDIuMCBtZXRhLWNsYXNzIEVsZW1lbnQuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ik5hbWVkRWxlbWVudCIgYWJzdHJhY3Q9InRydWUiIGVTdXBlclR5cGVzPSIjLy9FbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJVTUwgMi4wIG1ldGEtY2xhc3MgTmFtZWQgRWxlbWVudC4gIERlZmluZWQgdGhhdCBldmVyeSBlbGVtZW50IGhhcyBhIG5hbWUuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im5hbWUiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQYWNrYWdlYWJsZUVsZW1lbnQiIGFic3RyYWN0PSJ0cnVlIgotICAgICAgZVN1cGVyVHlwZXM9IiMvL05hbWVkRWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVU1MIDIuMCBtZXRhLWNsYXNzIFBhY2thZ2FibGUgRWxlbWVudC4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUGFja2FnZSIgZVN1cGVyVHlwZXM9IiMvL05hbWVzcGFjZSAjLy9QYWNrYWdlYWJsZUVsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlVNTCAyLjAgbWV0YS1jbGFzcyBQYWNrYWdlLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJOYW1lc3BhY2UiIGFic3RyYWN0PSJ0cnVlIiBlU3VwZXJUeXBlcz0iIy8vTmFtZWRFbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJVTUwgMi4wIG1ldGEtY2xhc3MgTmFtZXNwYWNlLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJNZXRob2RFbGVtZW50IiBhYnN0cmFjdD0idHJ1ZSIgZVN1cGVyVHlwZXM9IiMvL1BhY2thZ2VhYmxlRWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRXZlcnkgY2xhc3MgZGVmaW5lZCBpbiB0aGlzIHNwZWNpZmljYXRpb24gaXMgZGVyaXZlZCBmcm9tIE1ldGhvZCBFbGVtZW50LiAgSW4gb3RoZXIgd29yZHMgTWV0aG9kIEVsZW1lbnQgaXMgdGhlIHJvb3QgZ2VuZXJhbGl6YXRpb24gZm9yIGFsbCBVTUEgY2xhc3NlcyBhbmQgZGVmaW5lcyBhIGNvbW1vbiBzZXQgb2YgYXR0cmlidXRlcyBpbmhlcml0ZWQgYnkgZXZlcnkgb3RoZXIgZWxlbWVudCB0eXBlIG9mIHRoaXMgbW9kZWwuICBNZXRob2QgRWxlbWVudCBpdHNlbGYgaXMgZGVyaXZlZCBmcm9tIFBhY2thZ2VhYmxlIEVsZW1lbnQgZnJvbSB0aGUgVU1MIDIuMCBJbmZyYXN0cnVjdHVyZS4gIE1ldGhvZCBFbGVtZW50IGluaGVyaXRzIHRoZSBOYW1lIGF0dHJpYnV0ZSBmcm9tIFBhY2thZ2VhYmxlIEVsZW1lbnQncyBzdXBlciBjbGFzcy4gIEV2ZXJ5IGVsZW1lbnQgZGVmaW5lZCBhcyBhIFVNQSBpbnN0YW5jZSBpcyBkZXJpdmVkIGZyb20gTW9kZWwgRWxlbWVudC4gIEV2ZXJ5IE1ldGhvZCBFbGVtZW50IGluLXN0YW5jZSBpcyBhdCBsZWFzdCBkZWZpbmVkIGJ5IGEgdW5pcXVlIGlkLCBhIG5hbWUsIGFzIHdlbGwgYXMgYnJpZWYgZGVzY3JpcHRpb24uIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Imd1aWQiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkV2ZXJ5IGluc3RhbmNlIG9mIE1ldGhvZCBFbGVtZW50IGhhcyBhIGdsb2JhbCB1bmlxdWUgaWQuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImJyaWVmRGVzY3JpcHRpb24iIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkV2ZXJ5IGluc3RhbmNlIG9mIE1ldGhvZCBFbGVtZW50IHNoYWxsIGJlIGJyaWVmbHkgZGVzY3JpYmVkIHdpdGggb25lIG9yIHR3byBzZW50ZW5jZXMgc3VtbWFyaXppbmcgdGhlIGVsZW1lbnQuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im93bmVkUnVsZXMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0NvbnN0cmFpbnQiIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im1ldGhvZEVsZW1lbnRQcm9wZXJ0eSIKLSAgICAgICAgb3JkZXJlZD0iZmFsc2UiIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vTWV0aG9kRWxlbWVudFByb3BlcnR5IiBjb250YWlubWVudD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzdXBwcmVzc2VkIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbk9iamVjdCIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJJZiBhIFZhcmlhYmlsaXR5IEVsZW1lbnQgaXMgZGVyaXZlZCBmcm9tIGFub3RoZXIgVmFyaWFiaWxpdHkgRWxlbWVudCB1c2luZyB0aGUgRXh0ZW5kcyBWYXJpYWJpbGl0eSBTcGVjaWFsaXphdGlvbiB0aGVuIHRoaXMgYXR0cmlidXRlIGNhbiBiZSB1c2VkIHRvIHN1cHByZXNzIGluaGVyaXRlZCBNZXRob2QgRWxlbWVudHMgdGhhdCB3ZXJlIHBhcnQgb2YgdGhlIGJhc2VkLW9uIFZhcmlhYmlsaXR5IEVsZW1lbnQsIHdoaWNoIGNhbiBiZSBhbnkgdHlwZSBvZiBNZXRob2QgRWxlbWVudC4gIEluIG90aGVyIHdvcmRzLCBpZiB0aGlzIGF0dHJpYnV0ZSBpcyBzZXQgdG8gdHJ1ZSBvbiBhIE1ldGhvZCBFbGVtZW50IHRoYXQgaGFzIHRoZSBzYW1lIG5hbWUgdGhhbiBhbiBpbmhlcml0ZWQgbWV0aG9kIGVsZW1lbnQgdGhlbiBpdCB3aWxsIG5vdCBiZSByZWdhcmRlZCBhcyBpbmhlcml0ZWQgYXQgYWxsLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJvcmRlcmluZ0d1aWRlIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGlzIGF0dHJpYnV0ZSBpcyB1c2VkIGZvciBDQVNFIHRvb2wgcmVhbGl6YXRpb25zIG9mIHRoaXMgbW9kZWwgdG8gY29udGFpbiBpbmZvcm1hdGlvbiBhYm91dCBsYXlvdXQgYW5kIG9yZGVyaW5nIG9mIHRoZSBtZXRob2QgZWxlbWVudCBhbmQgaXRzIHBhcnRzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJDb25zdHJhaW50IiBlU3VwZXJUeXBlcz0iIy8vTWV0aG9kRWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBDb25zdHJhaW50IGlzIGEgTWV0aG9kIEVsZW1lbnQgdGhhdCByZXByZXNlbnRzIGEgY29uZGl0aW9uIG9yIHJlc3RyaWN0aW9uIGV4cHJlc3NlZCBpbiBuYXR1cmFsIGxhbmd1YWdlIHRleHQgb3IgaW4gYSBtYWNoaW5lIHJlYWRhYmxlIGxhbmd1YWdlIGZvciB0aGUgcHVycG9zZSBvZiBkZWNsYXJpbmcgc29tZSBvZiB0aGUgc2VtYW50aWNzIG9mIGEgTWV0aG9kIEVsZW1lbnQuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImJvZHkiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoaXMgYXR0cmlidXRlIHN0b3JlcyB0aGUgZGVmaW5pdGlvbiBvZiB0aGUgY29uc3RyYWludC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iTWV0aG9kRWxlbWVudFByb3BlcnR5IiBlU3VwZXJUeXBlcz0iIy8vUGFja2FnZWFibGVFbGVtZW50Ij4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idmFsdWUiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJDb250ZW50RWxlbWVudCIgYWJzdHJhY3Q9InRydWUiIGVTdXBlclR5cGVzPSIjLy9EZXNjcmliYWJsZUVsZW1lbnQgIy8vVmFyaWFiaWxpdHlFbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJDb250ZW50IEVsZW1lbnQgaXMgYSBEZXNjcmliYWJsZSBFbGVtZW50IHRoYXQgcmVwcmVzZW50cyBhbiBhYnN0cmFjdCBnZW5lcmFsaXphdGlvbiBmb3IgYWxsIGVsZW1lbnRzIHRoYXQgYXJlIGNvbnNpZGVyZWQgdG8gYmUgYW5kIG1hbmFnZWQgYXMgTWV0aG9kIENvbnRlbnQuJiN4RDsmI3hBO0NvbnRlbnQgRWxlbWVudHMgcmVwcmVzZW50cyByZXVzYWJsZSBNZXRob2QgQ29udGVudCB0aGF0IGlzIHN1cHBvc2VkIHRvIGJlIG1hbmFnZWQgaW4gQ29udGVudCBQYWNrYWdlcy4gIFRoZSBzZXBhcmF0aW9uIG9mIENvbnRlbnQgRWxlbWVudCBmcm9tIFByb2Nlc3MgRWxlbWVudCBhbGxvd3MgdG8gY2xlYXJseSBkaXN0aW5ndWlzaCBiZXR3ZWVuIHB1cmUgbWV0aG9kIGNvbnRlbnQgZnJvbSBjb250ZW50IHRoYXQgaXMgcmVwcmVzZW50ZWQgaW4gcHJvY2Vzc2VzLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJzdXBwb3J0aW5nTWF0ZXJpYWxzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9TdXBwb3J0aW5nTWF0ZXJpYWwiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iY29uY2VwdHNBbmRQYXBlcnMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0NvbmNlcHQiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iY2hlY2tsaXN0cyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vQ2hlY2tsaXN0Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Imd1aWRlbGluZXMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0d1aWRlbGluZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJleGFtcGxlcyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vRXhhbXBsZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJhc3NldHMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1JldXNhYmxlQXNzZXQiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0idGVybURlZmluaXRpb24iIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1Rlcm1EZWZpbml0aW9uIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkRlc2NyaWJhYmxlRWxlbWVudCIgYWJzdHJhY3Q9InRydWUiCi0gICAgICBlU3VwZXJUeXBlcz0iIy8vTWV0aG9kRWxlbWVudCAjLy9DbGFzc2lmaWVyIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJEZXNjcmliYWJsZSBFbGVtZW50IGlzIGFuIGFic3RyYWN0IGdlbmVyYWxpemF0aW9uIG9mIE1ldGhvZCBFbGVtZW50cyBmb3Igd2hpY2ggZXh0ZXJuYWwgcHJlc2VudGF0aW9uIG5hbWVzIGFzIHdlbGwgYXMgY29udGVudCBkZXNjcmlwdGlvbnMgaGF2ZSBiZWVuIGRlZmluZWQsIHN1Y2ggYXMgUm9sZXMgb3IgV29yayBQcm9kdWN0cy4gIFByZXNlbnRhdGlvbiBOYW1lIGFuZCBDb250ZW50IERlc2NyaXB0aW9ucyBhcmUgdHlwaWNhbGx5IGxvY2FsaXplZCB1c2luZyBhIHJlc291cmNlIGFsbG9jYXRpb24gbWVjaGFuaXNtIGZvciBpdHMgU3RyaW5nIHR5cGUgYXR0cmlidXRlcy4mI3hEOyYjeEE7VGhpcyBhYnN0cmFjdGlvbiByZXByZXNlbnRzIGFsbCBlbGVtZW50cyBpbiB0aGUgTWV0aG9kIENvbnRlbnQgYXMgd2VsbCBhcyBQcm9jZXNzIHNwYWNlIGZvciB3aGljaCBjb25jcmV0ZSB0ZXh0dWFsIGRlc2NyaXB0aW9ucyBhcmUgZGVmaW5lZCBpbiB0aGUgZm9ybSBvZiBkb2N1bWVudGluZyBhdHRyaWJ1dGVzIGdyb3VwZWQgaW4gYSBtYXRjaGluZyBDb250ZW50IERlc2NyaXB0aW9uIGluc3RhbmNlIChzZWUgU2VjdGlvbiA0LjEuNCkuICBEZXNjcmliYWJsZSBFbGVtZW50cyBhcmUgaW50ZW5kZWQgdG8gYmUgcHVibGlzaGVkIGluIG1ldGhvZCBvciBwcm9jZXNzIHB1YmxpY2F0aW9ucyAoc2ltaWxhciB0byB0aGUgSUJNIFJhdGlvbmFsIFVuaWZpZWQgUHJvY2VzcyB3ZWIpLiAgRGVzY3JpYmFibGUgRWxlbWVudCBkZWZpbmVzIHRoYXQgdGhlIGVsZW1lbnQgaXQgcmVwcmVzZW50cyB3aWxsIGhhdmUgY29udGVudCAnYXR0YWNoZWQnIHRvIGl0LiAgQ29udGVudCBEZXNjcmlwdGlvbiBpcyB0aGUgYWJzdHJhY3Rpb24gZm9yIHRoZSBhY3R1YWwgcGxhY2VzIGluIHdoaWNoIHRoZSBjb250ZW50IGlzIGJlaW5nIHJlcHJlc2VudGVkLiAgVGhpcyBzZXBhcmF0aW9uIGFsbG93cyBhIGRpc3RpbmN0aW9uIGJldHdlZW4gY29yZSBtZXRob2QgbW9kZWwgZWxlbWVudHMgZGVzY3JpYmluZyB0aGUgc3RydWN0dXJlIG9mIHRoZSBtb2RlbCBmcm9tIHRoZSBhY3R1YWwgZGVzY3JpcHRpb24gY29udGFpbmVyIHByb3ZpZGluZywgZm9yIGV4YW1wbGUsIHRoZSBkb2N1bWVudGF0aW9uIG9mIHRoZSBjb250ZW50IGVsZW1lbnQgaW4gZGlmZmVyZW50IGFsdGVybmF0aXZlcyBsYW5ndWFnZXMsIGF1ZGllbmNlcywgbGljZW5zaW5nIGxldmVscywgZXRjLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwcmVzZW50YXRpb25OYW1lIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJFdmVyeSBEZXNjcmliYWJsZSBFbGVtZW50IGhhcyBhIHByZXNlbnRhdGlvbiBuYW1lLCB3aGljaCBpcyB1c2VkIGZvciBleHRlcm5hbCBwcmVzZW50YXRpb24gb2YgdGhlIGVsZW1lbnQuICBGb3IgZXhhbXBsZSwgbmFtZSAodGhlIGludGVybmFsIHJlcHJlc2VudGF0aW9uKSBtaWdodCBiZSBzZXQgdG8gJnF1b3Q7cnVwX2FyY2hpdGVjdHVyZV9kb2N1bWVudCZxdW90OyB0byBkaWZmZXJlbnRpYXRlIGZyb20gYSAmcXVvdDtqMmVlX2FyY2hpdGN0dXJlX2RvY3VtZW50JnF1b3Q7IHdoZXJlYXMgdGhlIGV4dGVybmFsIHByZXNlbnRhdGlvbiB3b3VsZCBhbHdheXMgYmUgJnF1b3Q7QXJjaGl0ZWN0dXJlIERvY3VtZW50JnF1b3Q7LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJwcmVzZW50YXRpb24iIGVUeXBlPSIjLy9Db250ZW50RGVzY3JpcHRpb24iCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InNoYXBlaWNvbiIgZVR5cGU9IiMvL1VyaSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgcmVmZXJlbmNlIHRvIGFuIGljb24gdGhhdCBjYW4gYmUgdXNlZCBmb3IgbW9kZWxpbmcgd2l0aCBzcGVjaWZpYyBDb250ZW50IEVsZW1lbnQgaW5zdGFuY2VzIChhcyBncmFwaGljYWwgc3RlcmVvdHlwZXMsIGUuZy4gYSB1c2UgY2FzZSBzeW1ib2wgZm9yIGEgdXNlIGNhc2UgYXJ0aWZhY3QpIGFzIHdlbGwgYXMgcHVibGljYXRpb24gb2YgY29udGVudC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibm9kZWljb24iIGVUeXBlPSIjLy9VcmkiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIHJlZmVyZW5jZSB0byBhbiBpY29uIHRoYXQgY2FuIGJlIHVzZWQgaW4gdHJlZSBicm93c2VyIHByZXNlbnRhdGlvbnMgYW5kIGJyZWFrZG93biBzdHJ1Y3R1cmVzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJDb250ZW50RGVzY3JpcHRpb24iIGVTdXBlclR5cGVzPSIjLy9NZXRob2RVbml0Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJDb250ZW50IERlc2NyaXB0aW9uIGlzIGEgTWV0aG9kIEVsZW1lbnQgdGhhdCBpcyB1c2VkIHRvIHN0b3JlIHRoZSB0ZXh0dWFsIGRlc2NyaXB0aW9uIGZvciBhIENvbnRlbnQgRWxlbWVudC4gIEl0IGRlZmluZXMgc3RhbmRhcmQgYXR0cmlidXRlcyBhcHBsaWNhYmxlIGZvciBhbGwgQ29udGVudCBFbGVtZW50IHR5cGVzLiAgU3BlY2lmaWMgQ29udGVudCBFbGVtZW50IHN1Yi10eXBlcyBjYW4gZGVmaW5lIHRoZWlyIG93biBtYXRjaGluZyBDb250ZW50IERlc2NyaXB0aW9uIHN1Yi10eXBlcy4gIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im1haW5EZXNjcmlwdGlvbiIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhpcyBhdHRyaWJ1dGUgc3RvcmUgdGhlIG1haW4gZGVzY3JpcHRpdmUgdGV4dCBmb3IgdGhlIENvbnRlbnQgRWxlbWVudC4gIEFsbCB0ZXh0IHRoYXQgaXMgbm90IHBhcnQgb2YgYW55IG9mIHRoZSBtb3JlIHNwZWNpZmljIGF0dHJpYnV0ZXMgc2hhbGwgYmUgc3RvcmVkIGhlcmUuICBJZiB0aGUgQ29udGVudCBEZXNjcmlwdGlvbiBpcyBkaXZpZGVkIGludG8gc2VjdGlvbnMgdXNpbmcgdGhlIFNlY3Rpb24gY2xhc3MsIHRoZW4gb25seSB0aGUgdGV4dCBmcm9tIHRoZSAnc3RhcnQnIG9mIHRoZSBjb250ZW50IGRlc2NyaXB0aW9uIHRvIHRoZSBmaXJzdCBzZWN0aW9uIHdpbGwgYmUgc3RvcmVkIGhlcmUgKHNpbWlsYXIgdG8gYSBub3JtYWwgZG9jdW1lbnQgd2hlcmUgeW91IGNhbiBwbGFjZSB0ZXh0IGJldHdlZW4gaXRzIGJlZ2lubmluZyB0byBpdHMgZmlyc3QgZGljdGlvbiBoZWFkaW5nKS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ic2VjdGlvbnMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1NlY3Rpb24iIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImV4dGVybmFsSWQiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkFuIGV4dGVybmFsIHZpc2libGUgbnVtYmVyIHRoYXQgaXMgdXNlZCB0byByZWZlcmVuY2UgdGhpcyBhcnRpZmFjdC4gVXNlZCBsaWtlIGEgc3lub255bS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ia2V5Q29uc2lkZXJhdGlvbnMiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IktleSBDb25zaWRlcmF0aW9ucyBwcm92aWRlcyBhZHZpc2UgYW5kIGd1aWRhbmNlIG9mIGEgY3JpdGljYWwgbmF0dXJlIGZvciB0aGUgY29udGVudCBlbGVtZW50IGFzIHdlbGwgYXMgd2FybmluZ3MsIGNhdXRpb25zLCBwaXRmYWxscywgZGFuZ2Vycy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iU2VjdGlvbiIgZVN1cGVyVHlwZXM9IiMvL1ZhcmlhYmlsaXR5RWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBTZWN0aW9uIGlzIGEgc3BlY2lhbCBNZXRob2QgRWxlbWVudCB0aGF0IHJlcHJlc2VudHMgc3RydWN0dXJhbCBzdWJzZWN0aW9ucyBvZiBhIENvbnRlbnQgRGVzY3JpcHRpb24ncyBzZWN0aW9uRGVzY3JpcHRpb24gYXR0cmlidXRlLiAgSXQgaXMgdXNlZCBmb3IgZWl0aGVyIGxhcmdlIHNjYWxlIGRvY3VtZW50YXRpb24gb2YgQ29udGVudCBFbGVtZW50cyBvcmdhbml6ZWQgaW50byBzZWN0aW9ucyBhcyB3ZWxsIGFzIHRvIGZsZXhpYmx5IGFkZCBuZXcgU2VjdGlvbnMgdG8gQ29udGVudCBFbGVtZW50cyB1c2luZyBjb250cmlidXRpb24gdmFyaWFiaWxpdHkgYWRkZWQgdG8gdGhlIFNlY3Rpb24gY29uY2VwdCBmb3IgTWV0aG9kIFBsdWctaW5zLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzZWN0aW9uTmFtZSIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRXZlcnkgU2VjdGlvbiBoYXMgYSBuYW1lIHVzZWQgZm9yIGV4dGVybmFsIHByZXNlbnRhdGlvbiBvZiB0aGUgc2VjdGlvbiwgZS5nLiB3aGVuIHB1Ymxpc2hlZCBvciB3aGVuIHNlY3Rpb24gaGVhZGluZyBhcmUgbGlzdGVkIGluIGEgdGFibGUgb2YgY29udGVudHMuICBUaGlzIGF0dHJpYnV0ZSBpcyBzaW1pbGFyIHRvIFByZXNlbnRhdGlvbiBOYW1lIGZvciBDb250ZW50IEVsZW1lbnRzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzZWN0aW9uRGVzY3JpcHRpb24iIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoaXMgYXR0cmlidXRlcyBzdG9yZSB0aGUgZGVzY3JpcHRpb24gdGV4dCBmb3IgYSBDb250ZW50IERlc2NyaXB0aW9uJ3MgU2VjdGlvbi4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ic3ViU2VjdGlvbnMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1NlY3Rpb24iIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InByZWRlY2Vzc29yIiBlVHlwZT0iIy8vU2VjdGlvbiIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJSb2xlIiBlU3VwZXJUeXBlcz0iIy8vQ29udGVudEVsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgUm9sZSBpcyBhIGNvbnRlbnQgZWxlbWVudCB0aGF0IGRlZmluZXMgYSBzZXQgb2YgcmVsYXRlZCBza2lsbHMsIGNvbXBldGVuY2llcywgYW5kIHJlc3BvbnNpYmlsaXRpZXMuICBSb2xlcyBhcmUgdXNlZCBieSBUYXNrcyB0byBkZWZpbmUgd2hvIHBlcmZvcm1zIHRoZW0gYXMgd2VsbCBhcyBkZWZpbmUgYSBzZXQgb2Ygd29yayBwcm9kdWN0cyB0aGV5IGFyZSByZXNwb25zaWJsZSBmb3IuICAmI3hEOyYjeEE7QSBSb2xlIGRlZmluZXMgYSBzZXQgb2YgcmVsYXRlZCBza2lsbHMsIGNvbXBldGVuY2llcywgYW5kIHJlc3BvbnNpYmlsaXRpZXMgb2YgYW4gaW5kaXZpZHVhbCBvciBhIHNldCBvZiBpbmRpdmlkdWFscy4gIFJvbGVzIGFyZSBub3QgaW5kaXZpZHVhbHMgb3IgcmVzb3VyY2VzLiAgSW5kaXZpZHVhbCBtZW1iZXJzIG9mIHRoZSBkZXZlbG9wbWVudCBvcmdhbml6YXRpb24gd2lsbCB3ZWFyIGRpZmZlcmVudCBoYXRzLCBvciBwZXJmb3JtIGRpZmZlcmVudCByb2xlcy4gVGhlIG1hcHBpbmcgZnJvbSBpbmRpdmlkdWFsIHRvIHJvbGUsIHBlcmZvcm1lZCBieSB0aGUgcHJvamVjdCBtYW5hZ2VyIHdoZW4gcGxhbm5pbmcgYW5kIHN0YWZmaW5nIGZvciBhIHByb2plY3QsIGFsbG93cyBkaWZmZXJlbnQgaW5kaXZpZHVhbHMgdG8gYWN0IGFzIHNldmVyYWwgZGlmZmVyZW50IHJvbGVzLCBhbmQgZm9yIGEgcm9sZSB0byBiZSBwbGF5ZWQgYnkgc2V2ZXJhbCBpbmRpdmlkdWFscy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ibW9kaWZpZXMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1dvcmtQcm9kdWN0IiBjaGFuZ2VhYmxlPSJmYWxzZSIgdm9sYXRpbGU9InRydWUiCi0gICAgICAgIHRyYW5zaWVudD0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJyZXNwb25zaWJsZUZvciIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vV29ya1Byb2R1Y3QiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iV29ya1Byb2R1Y3QiIGFic3RyYWN0PSJ0cnVlIiBlU3VwZXJUeXBlcz0iIy8vQ29udGVudEVsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldvcmsgUHJvZHVjdCBpcyBhbiBhYnN0cmFjdCBjbGFzcyB3aGljaCBwcm92aWRlcyBhIGdlbmVyYWxpemF0aW9uIGZvciB0aGUgY29udGVudCBlbGVtZW50IHR5cGVzIEFydGlmYWN0LCBPdXRjb21lLCBhbmQgRGVsaXZlcmFibGUuICBUaGUgbWV0YS1tb2RlbCBjbGFzcyBXb3JrIFByb2R1Y3QgYWN0dWFsbHkgcmVwcmVzZW50cyB3b3JrIHByb2R1Y3QgdHlwZXMsIGkuZS4gYW4gaW5zdGFuY2Ugb2YgV29yayBQcm9kdWN0IGlzIGEgZGVzY3JpcHRpb24gb2YgYSBzcGVjaWZpYyB0eXBlIG9mIHdvcmsgcHJvZHVjdCBhbmQgbm90IGFuIGluZGl2aWR1YWwgd29yayBwcm9kdWN0IGluc3RhbmNlLiAgSG93ZXZlciwgZm9yIHNpbXBsaWNpdHkgcmVhc29ucyBhbmQgYmVjYXVzZSBvZiBsb3cgcmlzayBvZiBtaXNpbnRlcnByZXRhdGlvbiB3ZSBkaWQgbm90IGFwcGVuZCB0aGUgd29yZCAndHlwZScgdG8gZXZlcnkgbWV0YS1jbGFzcy4mI3hEOyYjeEE7QSB3b3JrIHByb2R1Y3QgaXMgYW4gYWJzdHJhY3Rpb24gZm9yIGRlc2NyaXB0aW9ucyBvZiBjb250ZW50IGVsZW1lbnRzIHRoYXQgYXJlIHVzZWQgdG8gZGVmaW5lIGFueXRoaW5nIHVzZWQsIHByb2R1Y2VkLCBvciBtb2RpZmllZCBieSBhIHRhc2suIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InJlcG9ydHMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1JlcG9ydCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ0ZW1wbGF0ZXMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1RlbXBsYXRlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InRvb2xNZW50b3JzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Ub29sTWVudG9yIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImVzdGltYXRpb25Db25zaWRlcmF0aW9ucyIKLSAgICAgICAgb3JkZXJlZD0iZmFsc2UiIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlRhc2siIGVTdXBlclR5cGVzPSIjLy9Db250ZW50RWxlbWVudCAjLy9Xb3JrRGVmaW5pdGlvbiI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBUYXNrIGlzIGEgY29udGVudCBlbGVtZW50IHRoYXQgZGVzY3JpYmVzIHdvcmsgYmVpbmcgcGVyZm9ybWVkIGJ5IFJvbGVzLiAgSXQgZGVmaW5lcyBvbmUgZGVmYXVsdCBwZXJmb3JtaW5nIFJvbGUgYXMgd2VsbCBhcyBtYW55IGFkZGl0aW9uYWwgcGVyZm9ybWVycy4gIEEgVGFzayBpcyBhc3NvY2lhdGVkIHRvIGlucHV0IGFuZCBvdXRwdXQgd29yayBwcm9kdWN0cy4gIElucHV0cyBhcmUgZGlmZmVyZW50aWF0ZWQgaW4gbWFuZGF0b3J5IHZlcnN1cyBvcHRpb25hbCBpbnB1dHMuICBUaGUgYXNzb2NpYXRpb25zIHRvIFdvcmsgUHJvZHVjdHMgYXJlIG5vdCBpbnN0YW50aWF0YWJsZS92YXJpYWJsZS1saWtlIHBhcmFtZXRlcnMuICBUaGV5IHJhdGhlciBleHByZXNzIChoeXBlci0pbGlua3MgdG8gdGhlIGRlc2NyaXB0aW9ucyBvZiB0aGUgd29yayBwcm9kdWN0cyB0eXBlcyB0aGF0IGFyZSByZWxhdGVkIHRvIHRoZSBUYXNrIGFzIGlucHV0cyBhbmQgb3V0cHV0cy4gIEluIG90aGVyIHdvcmRzLCB0aGVzZSBhc3NvY2lhdGlvbnMgYXJlIG5vdCBpbnRlbmRlZCB0byBiZSB1c2VkIHRvIGNhcHR1cmUgd2hpY2ggY29uY3JldGUgaW5zdGFuY2VzIHdpbGwgYmUgcGFzc2VkIHdoZW4gaW5zdGFudGlhdGluZyB0aGUgbWV0aG9kIGluIGEgcHJvamVjdC4gIEFsbCBvZiB0aGUgVGFzaydzIGRlZmF1bHQgYXNzb2NpYXRpb25zIGNhbiBiZSBvdmVycmlkZGVuIGluIGFuIGFjdHVhbCBwcm9jZXNzIGRlZmluaXRpb24uJiN4RDsmI3hBO0EgVGFzayBkZXNjcmliZXMgYW4gYXNzaWduYWJsZSB1bml0IG9mIHdvcmsuICBFdmVyeSBUYXNrIGlzIGFzc2lnbmVkIHRvIHNwZWNpZmljIFJvbGVzLiAgVGhlIGdyYW51bGFyaXR5IG9mIGEgVGFzayBpcyBnZW5lcmFsbHkgYSBmZXcgaG91cnMgdG8gYSBmZXcgZGF5cy4gIEl0IHVzdWFsbHkgYWZmZWN0cyBvbmUgb3Igb25seSBhIHNtYWxsIG51bWJlciBvZiB3b3JrIHByb2R1Y3RzLiBBIFRhc2sgaXMgdXNlZCBhcyBhbiBlbGVtZW50IG9mIGRlZmluaW5nIGEgcHJvY2Vzcy4gVGFza3MgYXJlIGZ1cnRoZXIgdXNlZCBmb3IgcGxhbm5pbmcgYW5kIHRyYWNraW5nIHByb2dyZXNzOyB0aGVyZWZvcmUsIGlmIHRoZXkgYXJlIGRlZmluZWQgdG9vIGZpbmUtZ3JhaW5lZCwgdGhleSB3aWxsIGJlIG5lZ2xlY3RlZCwgYW5kIGlmIHRoZXkgYXJlIHRvbyBsYXJnZSwgcHJvZ3Jlc3Mgd291bGQgaGF2ZSB0byBiZSBleHByZXNzZWQgaW4gdGVybXMgb2YgYSBUYXNrJ3MgcGFydHMgKGUuZy4gU3RlcHMsIHdoaWNoIGlzIG5vdCByZWNvbW1lbmRlZCkuICYjeEQ7JiN4QTtBIFRhc2sgaGFzIGEgY2xlYXIgcHVycG9zZSBpbiB3aGljaCB0aGUgcGVyZm9ybWluZyByb2xlcyBhY2hpZXZlIGEgd2VsbCBkZWZpbmVkIGdvYWwuICBJdCBwcm92aWRlcyBjb21wbGV0ZSBzdGVwLWJ5LXN0ZXAgZXhwbGFuYXRpb25zIG9mIGRvaW5nIGFsbCB0aGUgd29yayB0aGF0IG5lZWRzIHRvIGJlIGRvbmUgdG8gYWNoaWV2ZSB0aGlzIGdvYWwuICBUaGlzIGRlc2NyaXB0aW9uIGlzIGNvbXBsZXRlLCBpbmRlcGVuZGVudCBvZiB3aGVuIGluIGEgcHJvY2VzcyBsaWZlY3ljbGUgdGhlIHdvcmsgd291bGQgYWN0dWFsbHkgYmUgZG9uZS4gIEl0IHRoZXJlZm9yZSBkb2VzIG5vdCBkZXNjcmliZSB3aGVuIHlvdSBkbyB3aGF0IHdvcmsgYXQgd2hhdCBwb2ludCBvZiB0aW1lLCBidXQgZGVzY3JpYmVzIGFsbCB0aGUgd29yayB0aGF0IGdldHMgZG9uZSB0aHJvdWdob3V0IHRoZSBkZXZlbG9wbWVudCBsaWZlY3ljbGUgdGhhdCBjb250cmlidXRlcyB0byB0aGUgYWNoaWV2ZW1lbnQgb2YgdGhpcyBnb2FsLiAgV2hlbiB0aGUgVGFzayBpcyBiZWluZyBhcHBsaWVkIGluIGEgcHJvY2VzcyB0aGVuIHRoaXMgcHJvY2VzcyBhcHBsaWNhdGlvbiAoZGVmaW5lZCBhcyBUYXNrIERlc2NyaXB0b3IpIHByb3ZpZGVzIHRoZSBpbmZvcm1hdGlvbiBvZiB3aGljaCBwaWVjZXMgb2YgdGhlIFRhc2sgd2lsbCBhY3R1YWxseSBiZSBwZXJmb3JtZWQgYXQgYW55IHBhcnRpY3VsYXIgcG9pbnQgaW4gdGltZS4gVGhpcyBhc3N1bWVzIHRoYXQgdGhlIFRhc2sgd2lsbCBiZSBwZXJmb3JtZWQgaW4gdGhlIHByb2Nlc3Mgb3ZlciBhbmQgb3ZlciBhZ2FpbiwgYnV0IGVhY2ggdGltZSB3aXRoIGEgc2xpZ2h0bHkgZGlmZmVyZW50IGVtcGhhc2lzIG9uIGRpZmZlcmVudCBzdGVwcyBvciBhc3BlY3RzIG9mIHRoZSB0YXNrIGRlc2NyaXB0aW9uLiAmI3hEOyYjeEE7Rm9yIGV4YW1wbGUsIGEgVGFzayBzdWNoIGFzICZxdW90O0RldmVsb3AgVXNlIENhc2UgTW9kZWwmcXVvdDsgZGVzY3JpYmVzIGFsbCB0aGUgd29yayB0aGF0IG5lZWRzIHRvIGJlIGRvbmUgdG8gZGV2ZWxvcCBhIGNvbXBsZXRlIHVzZSBjYXNlIG1vZGVsLiBUaGlzIHdvdWxkIGNvbXByaXNlIG9mIHRoZSBpZGVudGlmaWNhdGlvbiBhbmQgbmFtaW5nIG9mIHVzZSBjYXNlcyBhbmQgYWN0b3JzLCB0aGUgd3JpdGluZyBvZiBhIGJyaWVmIGRlc2NyaXB0aW9uLCB0aGUgbW9kZWxpbmcgb2YgdXNlIGNhc2VzIGFuZCB0aGVpciByZWxhdGlvbnNoaXBzIGluIGRpYWdyYW1zLCB0aGUgZGV0YWlsZWQgZGVzY3JpcHRpb24gb2YgYSBiYXNpYyBmbG93LCB0aGUgZGV0YWlsZWQgZGVzY3JpcHRpb24gb2YgYWx0ZXJuYXRpdmVzIGZsb3dzLCBwZXJmb3JtaW5nIG9mIHdhbGt0aHJvdWdocyB3b3Jrc2hvcHMgYW5kIHJldmlld3MsIGV0Yy4gIEFsbCBvZiB0aGVzZSBwYXJ0cyBjb250cmlidXRlIHRvIHRoZSBkZXZlbG9wbWVudCBnb2FsIG9mIGRldmVsb3BpbmcgdGhlIHVzZSBjYXNlIG1vZGVsLCBidXQgdGhlIHBhcnRzIHdpbGwgYmUgcGVyZm9ybWVkIGF0IGRpZmZlcmVudCBwb2ludHMgaW4gdGltZSBpbiBhIHByb2Nlc3MuICBJZGVudGlmaWNhdGlvbiwgbmFtaW5nLCBhbmQgYnJpZWYgZGVzY3JpcHRpb25zIHdvdWxkIGJlIHBlcmZvcm1lZCBlYXJseSBpbiBhIHR5cGljYWwgZGV2ZWxvcG1lbnQgcHJvY2VzcyB2ZXJzdXMgdGhlIHdyaXRpbmcgb2YgZGV0YWlsZWQgYWx0ZXJuYXRpdmUgZmxvd3Mgd2hpY2ggd291bGQgYmUgcGVyZm9ybWVkIG11Y2ggbGF0ZXIuICBBbGwgdGhlc2UgcGFydHMgb3Igc3RlcHMgd2l0aGluIHRoZSBzYW1lIFRhc2sgZGVmaW5lIHRoZSAmcXVvdDttZXRob2QmcXVvdDsgb2YgRGV2ZWxvcGluZyBhIFVzZSBDYXNlIE1vZGVsLiAgQXBwbHlpbmcgc3VjaCBhIG1ldGhvZCBpbiBhIGxpZmVjeWNsZSAoaS5lLiBpbiBhIHByb2Nlc3MpIGlzIGRlZmluaW5nIHdoaWNoIHN0ZXBzIGFyZSBkb25lIHdoZW4gZ29pbmcgZnJvbSBvbmUgaXRlcmF0aW9uIHRvIHRoZSBuZXh0LiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJwZXJmb3JtZWRCeSIgZVR5cGU9IiMvL1JvbGUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ibWFuZGF0b3J5SW5wdXQiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1dvcmtQcm9kdWN0Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im91dHB1dCIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vV29ya1Byb2R1Y3QiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iYWRkaXRpb25hbGx5UGVyZm9ybWVkQnkiCi0gICAgICAgIG9yZGVyZWQ9ImZhbHNlIiB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1JvbGUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ib3B0aW9uYWxJbnB1dCIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vV29ya1Byb2R1Y3QiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ic3RlcHMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1N0ZXAiIGNoYW5nZWFibGU9ImZhbHNlIiB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIgotICAgICAgICBkZXJpdmVkPSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InRvb2xNZW50b3JzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Ub29sTWVudG9yIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImVzdGltYXRpb25Db25zaWRlcmF0aW9ucyIKLSAgICAgICAgb3JkZXJlZD0iZmFsc2UiIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IldvcmtEZWZpbml0aW9uIiBhYnN0cmFjdD0idHJ1ZSIgZVN1cGVyVHlwZXM9IiMvL01ldGhvZEVsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldvcmsgRGVmaW5pdGlvbiBpcyBhbiBhYnN0cmFjdCBNZXRob2QgRWxlbWVudCB0aGF0IGdlbmVyYWxpemVzIGFsbCBkZXNjcmlwdGlvbnMgb2Ygd29yayB3aXRoaW4gdGhlIFVuaWZpZWQgTWV0aG9kIEFyY2hpdGVjdHVyZS4gIFRoaXMgcGFja2FnZSBpbnRyb2R1Y2VzIHR3byBjb25jcmV0ZSB0eXBlcyBvZiBXb3JrIERlZmluaXRpb25zOiBUYXNrIGFuZCBTdGVwLiAgV29yayBEZWZpbml0aW9ucyBjYW4gY29udGFpbiBzZXRzIG9mIHByZS0gYW5kIHBvc3QtY29uZGl0aW9ucyBkZWZpbmluZyBjb25zdHJhaW50cyB0aGF0IG5lZWQgdG8gYmUgdmFsaWQgYmVmb3JlIHRoZSBkZXNjcmliZWQgd29yayBjYW4gYmVnaW4gb3IgYmVmb3JlIGl0IGNhbiBiZSBkZWNsYXJlZCBhcyBmaW5pc2hlZC4gIE5vdGUgdGhhdCBnZW5lcmFsIG93bmVkUnVsZXMgY2FuIGJlIHVzZWQgdG8gZGVmaW5lIGFkZGl0aW9uYWwgY29uc3RyYWludHMgYW5kIHJ1bGVzIGZvciBXb3JrIERlZmluaXRpb25zLiYjeEQ7JiN4QTtXb3JrIERlZmluaXRpb25zIHJlcHJlc2VudCBiZWhhdmlvcmFsIGRlc2NyaXB0aW9ucyBmb3IgZG9pbmcgd29yay4gIFRoZXNlIGJlaGF2aW9yYWwgZGVzY3JpcHRpb25zIGFyZSBub3QgYm91bmQgdG8gb25lIHNwZWNpZmljIGNsYXNzaWZpZXIsIGJ1dCByZXByZXNlbnQgYW4gYXJiaXRyYXJ5IGRlZmluaXRpb24gb2Ygd29yay4gIEZvciBleGFtcGxlLCBhIFdvcmsgRGVmaW5pdGlvbiBjb3VsZCByZXByZXNlbnQgd29yayB0aGF0IGlzIGJlaW5nIHBlcmZvcm1lZCBieSBhIHNwZWNpZmljIFJvbGUgKGUuZy4gYSBSb2xlIHBlcmZvcm1pbmcgYSBzcGVjaWZpYyBUYXNrIG9yIFN0ZXBzIG9mIGEgVGFzayksIGJ5IG1hbnkgUm9sZXMgd29ya2luZyBpbiBjbG9zZSBjb2xsYWJvcmF0aW9uIChtYW55IFJvbGVzIGFsbCB3b3JraW5nIHRvZ2V0aGVyIG9uIHRoZSBzYW1lIGludGVyZGlzY2lwbGluYXJ5IFRhc2spLCBvciBjb21wbGV4IHdvcmsgdGhhdCBpcyBwZXJmb3JtZWQgdGhyb3VnaG91dCB0aGUgbGlmZWN5Y2xlIChlLmcuIGEgcHJvY2VzcyBkZWZpbmluZyBhIGJyZWFrZG93biBzdHJ1Y3R1cmUgZm9yIG9yZ2FuaXppbmcgbGFyZ2VyIGNvbXBvc2l0ZSB1bml0cyBvZiB3b3JrIHBlcmZvcm1lZCBieSBtYW55IFJvbGVzIHdvcmtpbmcgaW4gY29sbGFib3JhdGlvbikuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InByZWNvbmRpdGlvbiIgZVR5cGU9IiMvL0NvbnN0cmFpbnQiCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InBvc3Rjb25kaXRpb24iIGVUeXBlPSIjLy9Db25zdHJhaW50IgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJTdGVwIiBlU3VwZXJUeXBlcz0iIy8vU2VjdGlvbiAjLy9Xb3JrRGVmaW5pdGlvbiI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBTdGVwIGlzIGEgU2VjdGlvbiBhbmQgV29yayBEZWZpbml0aW9uIHRoYXQgaXMgdXNlZCB0byBvcmdhbml6ZSBUYXNrcyBpbnRvIHBhcnRzIG9yIHN1YnVuaXRzIG9mIHdvcmsuICBTdGVwcyBpbmhlcml0IHRoZSBzdWJTZWN0aW9ucyBkZWNvbXBvc2l0aW9uIGZyb20gU2VjdGlvbiBhbmQgY2FuIHRoZXJlZm9yZSBkZXNjcmliZSBTdWItU3RlcHMgbmVzdGVkIGludG8gU3RlcHMuJiN4RDsmI3hBO0EgU3RlcCBkZXNjcmliZXMgYSBtZWFuaW5nZnVsIGFuZCBjb25zaXN0IHBhcnQgb2YgdGhlIG92ZXJhbGwgd29yayBkZXNjcmliZWQgZm9yIGEgVGFzay4gIFRoZSBjb2xsZWN0aW9uIG9mIFN0ZXBzIGRlZmluZWQgZm9yIGEgVGFzayByZXByZXNlbnRzIGFsbCB0aGUgd29yayB0aGF0IHNob3VsZCBiZSBkb25lIHRvIGFjaGlldmUgdGhlIG92ZXJhbGwgZGV2ZWxvcG1lbnQgZ29hbCBvZiB0aGUgVGFzay4gIE5vdCBhbGwgc3RlcHMgYXJlIG5lY2Vzc2FyaWx5IHBlcmZvcm1lZCBlYWNoIHRpbWUgYSBUYXNrIGlzIGludm9rZWQgaW4gYSBQcm9jZXNzIChzZWUgVGFzayBEZXNjcmlwdG9yKSwgc28gdGhleSBjYW4gYWxzbyBiZSBleHByZXNzZWQgaW4gdGhlIGZvcm0gb2YgYWx0ZXJuYXRlICdmbG93cycgb2Ygd29yay4gIERpZmZlcmVudCB3YXlzIG9mIGFjaGlldmluZyB0aGUgc2FtZSBkZXZlbG9wbWVudCBnb2FsIGNhbiB0aGVuIGJlICdhc3NlbWJsZWQnIGJ5IHNlbGVjdGluZyBkaWZmZXJlbnQgY29tYmluYXRpb25zIG9mIHN0ZXBzIHdoZW4gYXBwbHlpbmcgdGhlIFRhc2sgaW4gYSBQcm9jZXNzLiAgVHlwaWNhbCBraW5kcyBvZiBzdGVwcyBhIFRhc2sgYXV0aG9yIHNob3VsZCBjb25zaWRlciBhcmU6IFRoaW5raW5nIHN0ZXBzOiB3aGVyZSB0aGUgaW5kaXZpZHVhbCByb2xlcyB1bmRlcnN0YW5kIHRoZSBuYXR1cmUgb2YgdGhlIHRhc2ssIGdhdGhlcnMgYW5kIGV4YW1pbmVzIHRoZSBpbnB1dCBhcnRpZmFjdHMsIGFuZCBmb3JtdWxhdGVzIHRoZSBvdXRjb21lLiBQZXJmb3JtaW5nIHN0ZXBzOiB3aGVyZSB0aGUgaW5kaXZpZHVhbCByb2xlcyBjcmVhdGUgb3IgdXBkYXRlIHNvbWUgYXJ0aWZhY3RzLiBSZXZpZXdpbmcgc3RlcHM6IHdoZXJlIHRoZSBpbmRpdmlkdWFsIHJvbGVzIGluc3BlY3RzIHRoZSByZXN1bHRzIGFnYWluc3Qgc29tZSBjcml0ZXJpYS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iR3VpZGFuY2UiIGFic3RyYWN0PSJ0cnVlIiBlU3VwZXJUeXBlcz0iIy8vQ29udGVudEVsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9Ikd1aWRhbmNlIGlzIGFuIGFic3RyYWN0IGdlbmVyYWxpemF0aW9uIG9mIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVsYXRlZCB0byBjb250ZW50IGVsZW1lbnRzIHN1Y2ggYXMgUm9sZXMsIFRhc2tzLCBhbmQgV29yayBQcm9kdWN0cy4gIEV4YW1wbGVzIGZvciBHdWlkYW5jZSBhcmUgR3VpZGVsaW5lcywgVGVtcGxhdGVzLCBDaGVja2xpc3RzLCBUb29sIE1lbnRvcnMsIEVzdGltYXRlcywgU3VwcG9ydGluZyBNYXRlcmlhbHMsIFJlcG9ydHMsIENvbmNlcHRzLCBldGMuICBUaGlzIHBhY2thZ2Ugb25seSBjb250YWlucyB0aGUgZGVmaW5pdGlvbiBvZiB0aGUgYWJzdHJhY3QgR3VpZGFuY2UgY2xhc3MuICBUaGUgcGFja2FnZSBHdWlkYW5jZSBUeXBlcyBkZWZpbmVzIGNvbmNyZXRlIGd1aWRhbmNlIHR5cGVzLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJBcnRpZmFjdCIgZVN1cGVyVHlwZXM9IiMvL1dvcmtQcm9kdWN0Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBcnRpZmFjdCBpcyBhIFdvcmsgUHJvZHVjdCB0aGF0IHByb3ZpZGVzIGEgZGVzY3JpcHRpb24gYW5kIGRlZmluaXRpb24gZm9yIHRhbmdpYmxlIHdvcmsgcHJvZHVjdCB0eXBlcy4gQXJ0aWZhY3RzIG1heSBiZSBjb21wb3NlZCBvZiBvdGhlciBhcnRpZmFjdHMuIEZvciBleGFtcGxlLCBhIG1vZGVsIGFydGlmYWN0IGNhbiBiZSBjb21wb3NlZCBvZiBtb2RlbCBlbGVtZW50cywgd2hpY2ggYXJlIGFsc28gYXJ0aWZhY3RzLiYjeEQ7JiN4QTtBcnRpZmFjdHMgYXJlIHRhbmdpYmxlIHdvcmsgcHJvZHVjdHMgY29uc3VtZWQsIHByb2R1Y2VkLCBvciBtb2RpZmllZCBieSBUYXNrcy4gIEl0IG1heSBzZXJ2ZSBhcyBhIGJhc2lzIGZvciBkZWZpbmluZyByZXVzYWJsZSBhc3NldHMuICBSb2xlcyB1c2UgQXJ0aWZhY3RzIHRvIHBlcmZvcm0gVGFza3MgYW5kIHByb2R1Y2UgQXJ0aWZhY3RzIGluIHRoZSBjb3Vyc2Ugb2YgcGVyZm9ybWluZyBUYXNrcy4gIEFydGlmYWN0cyBhcmUgdGhlIHJlc3BvbnNpYmlsaXR5IG9mIGEgc2luZ2xlIFJvbGUsIG1ha2luZyByZXNwb25zaWJpbGl0eSBlYXN5IHRvIGlkZW50aWZ5IGFuZCB1bmRlcnN0YW5kLCBhbmQgcHJvbW90aW5nIHRoZSBpZGVhIHRoYXQgZXZlcnkgcGllY2Ugb2YgaW5mb3JtYXRpb24gcHJvZHVjZWQgaW4gdGhlIG1ldGhvZCByZXF1aXJlcyB0aGUgYXBwcm9wcmlhdGUgc2V0IG9mIHNraWxscy4gRXZlbiB0aG91Z2ggb25lIHJvbGUgbWlnaHQgJnF1b3Q7b3duJnF1b3Q7IGEgc3BlY2lmaWMgdHlwZSBvZiBBcnRpZmFjdHMsIG90aGVyIHJvbGVzIGNhbiBzdGlsbCB1c2UgdGhlIEFydGlmYWN0czsgcGVyaGFwcyBldmVuIHVwZGF0ZSB0aGVtIGlmIHRoZSBSb2xlIGhhcyBiZWVuIGdpdmVuIHBlcm1pc3Npb24gdG8gZG8gc28uIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImNvbnRhaW5lckFydGlmYWN0IiBlVHlwZT0iIy8vQXJ0aWZhY3QiCi0gICAgICAgIHRyYW5zaWVudD0idHJ1ZSIgZU9wcG9zaXRlPSIjLy9BcnRpZmFjdC9jb250YWluZWRBcnRpZmFjdHMiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iY29udGFpbmVkQXJ0aWZhY3RzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9BcnRpZmFjdCIgY29udGFpbm1lbnQ9InRydWUiIGVPcHBvc2l0ZT0iIy8vQXJ0aWZhY3QvY29udGFpbmVyQXJ0aWZhY3QiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRGVsaXZlcmFibGUiIGVTdXBlclR5cGVzPSIjLy9Xb3JrUHJvZHVjdCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBkZWxpdmVyYWJsZSBpcyBhIFdvcmsgUHJvZHVjdCB0aGF0IHByb3ZpZGVzIGEgZGVzY3JpcHRpb24gYW5kIGRlZmluaXRpb24gZm9yIHBhY2thZ2luZyBvdGhlciBXb3JrIFByb2R1Y3RzLCBhbmQgbWF5IGJlIGRlbGl2ZXJlZCB0byBhbiBpbnRlcm5hbCBvciBleHRlcm5hbCBwYXJ0eS4gIFRoZXJlZm9yZSwgYSBEZWxpdmVyYWJsZSBhZ2dyZWdhdGVzIG90aGVyIFdvcmsgUHJvZHVjdHMuIFRoZXJlZm9yZSwgYSBEZWxpdmVyYWJsZSBhZ2dyZWdhdGVzIG90aGVyIFdvcmsgUHJvZHVjdHMuICBBIERlbGl2ZXJhYmxlIGlzIHVzZWQgdG8gcHJlLWRlZmluZSB0eXBpY2FsIG9yIHJlY29tbWVuZGVkIGNvbnRlbnQgaW4gdGhlIGZvcm0gb3Igd29yayBwcm9kdWN0cyB0aGF0IHdvdWxkIGJlIHBhY2thZ2VkIGZvciBkZWxpdmVyeS4gIFRoZSBhY3R1YWwgcGFja2FnaW5nIG9mIHRoZSBEZWxpdmVyYWJsZSBpbiBhbiBhY3R1YWwgcHJvY2VzcyBvciBldmVuIHByb2plY3QgY291bGQgYmUgYSBtb2RpZmljYXRpb24gb2YgdGhpcyByZWNvbW1lbmRhdGlvbi4gIERlbGl2ZXJhYmxlcyBhcmUgdXNlZCB0byByZXByZXNlbnQgYW4gb3V0cHV0IGZyb20gYSBwcm9jZXNzIHRoYXQgaGFzIHZhbHVlLCBtYXRlcmlhbCBvciBvdGhlcndpc2UsIHRvIGEgY2xpZW50LCBjdXN0b21lciBvciBvdGhlciBzdGFrZWhvbGRlci4gIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImRlbGl2ZXJlZFdvcmtQcm9kdWN0cyIKLSAgICAgICAgb3JkZXJlZD0iZmFsc2UiIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vV29ya1Byb2R1Y3QiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iT3V0Y29tZSIgZVN1cGVyVHlwZXM9IiMvL1dvcmtQcm9kdWN0Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBbiBvdXRjb21lIGRlc2NyaWJlcyBpbnRhbmdpYmxlIHdvcmsgcHJvZHVjdHMgdGhhdCBhcmUgYSByZXN1bHQgb3Igc3RhdGUuIE91dGNvbWVzIG1heSBhbHNvIGJlIHVzZWQgdG8gZGVzY3JpYmUgd29yayBwcm9kdWN0cyB0aGF0IGFyZSBub3QgZm9ybWFsbHkgZGVmaW5lZC4gIEEga2V5IGRpZmZlcmVudGlhdG9yIGZvciBvdXRjb21lcyBhZ2FpbnN0IGFydGlmYWN0cyBpcyB0aGF0IG91dGNvbWVzIGFyZSBub3QgY2FuZGlkYXRlcyBmb3IgaGFydmVzdGluZyBhcyByZXVzYWJsZSBhc3NldHMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ik1ldGhvZFBhY2thZ2UiIGFic3RyYWN0PSJ0cnVlIiBlU3VwZXJUeXBlcz0iIy8vTWV0aG9kRWxlbWVudCAjLy9QYWNrYWdlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIE1ldGhvZCBQYWNrYWdlIGlzIGFuIGFic3RyYWN0IGNsYXNzIGZvciBwYWNrYWdpbmcgTWV0aG9kIEVsZW1lbnRzLiAgQWxsIE1ldGhvZCBFbGVtZW50cyBzaGFsbCBiZSBsb2NhdGVkIGluIGV4YWN0bHkgb25lIG9mIE1ldGhvZCBQYWNrYWdlJ3MgY29uY3JldGUgc3BlY2lhbGl6YXRpb25zIChlLmcuIENvbnRlbnQgUGFja2FnZSkuICAgTWV0aG9kIFBhY2thZ2UgZGVmaW5lcyBjb21tb24gcHJvcGVydGllcyBmb3IgYWxsIG9mIGl0cyBzcGVjaWFsaXphdGlvbnMuIEVsZW1lbnRzIGFyZSBvcmdhbml6ZWQgaW4gTWV0aG9kIFBhY2thZ2VzIHRvIHN0cnVjdHVyZSBsYXJnZSBzY2FsZSBvZiBtZXRob2QgY29udGVudCBhbmQgcHJvY2Vzc2VzIGFzIHdlbGwgYXMgdG8gZGVmaW5lIGEgbWVjaGFuaXNtIGZvciByZXVzZS4gIE1ldGhvZCBFbGVtZW50cyBmcm9tIG9uZSBwYWNrYWdlIGNhbiByZXVzZSBlbGVtZW50IGZyb20gb3RoZXIgcGFja2FnZXMgYnkgZGVmaW5pbmcgYSByZXVzZWRQYWNrYWdlcyBsaW5rLiAgRm9yIGV4YW1wbGUsIGEgd29yayBwcm9kdWN0IGRlZmluZWQgaW4gb25lIHBhY2thZ2UgY2FuIGJlIHVzZWQgYXMgYW4gaW5wdXQgZm9yIFRhc2tzIGRlZmluZWQgaW4gb3RoZXIgcGFja2FnZXMuICBCeSByZXVzaW5nIGl0IGZyb20gb25lIGNvbW1vbiBwbGFjZSAoaS5lLiB0aGUgcGFja2FnZSBpbiB3aGljaCBpdCBoYXMgYmVlbiBkZWZpbmVkKSBlbnN1cmVzIHRoYXQgbm8gcmVkdW5kYW50IGRlZmluaXRpb25zIG9mIHRoZSBzYW1lIGVsZW1lbnRzIGFyZSByZXF1aXJlZC4gIEFsc28gbWFpbnRlbmFuY2Ugb2YgbWV0aG9kIGNvbnRlbnQgaXMgZ3JlYXRseSBpbXByb3ZlZCBhcyBjaGFuZ2VzIGNhbiBiZSBwZXJmb3JtZWQgaW4gb25seSBvbmUgcGxhY2UuICBOb3RlLCB0aGF0IG90aGVyIHBhY2thZ2VzIHdpbGwgaW50cm9kdWNlIG1vcmUgc3BlY2lhbGl6YXRpb25zIG9mIE1ldGhvZCBQYWNrYWdlLCBlLmcuIFByb2Nlc3MgUGFja2FnZSBhbmQgUHJvY2VzcyBDb21wb25lbnQuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Imdsb2JhbCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW5PYmplY3QiCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iTWV0aG9kIFBhY2thZ2VzIGNhbiBoYXZlIGEgZ2xvYmFsIHNjb3BlLiAgVGhpcyBtZWFucyB0aGF0IGV2ZXJ5IGVsZW1lbnQgb2YgZXZlcnkgb3RoZXIgTWV0aG9kIFBhY2thZ2UgY2FuIHNlZSB0aGUgZ2xvYmFsIHBhY2thZ2UncyBjb250ZW50cy4gIEdsb2JhbCBNZXRob2QgUGFja2FnZXMgYXJlIHByaW1hcmlseSB1c2VkIHRvIHN0b3JlIGNvbW1vbmx5IHVzZWQgY2F0ZWdvcnkgZGVmaW5pdGlvbnMgc3VjaCBhcyBmb3IgRGlzY2lwbGluZXMgb3IgRG9tYWlucywgd2hpY2ggYXJlIHVzZWQgYnkgbWFueSBUYXNrIGFuZCBXb3JrIFByb2R1Y3RzIHJlc3BlY3RpdmVseS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icmV1c2VkUGFja2FnZXMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL01ldGhvZFBhY2thZ2UiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iY2hpbGRQYWNrYWdlcyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vTWV0aG9kUGFja2FnZSIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQ29udGVudFBhY2thZ2UiIGVTdXBlclR5cGVzPSIjLy9NZXRob2RQYWNrYWdlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIENvbnRlbnQgUGFja2FnZSBpcyBzcGVjaWFsIE1ldGhvZCBQYWNrYWdlIHRoYXQgY29udGFpbnMgQ29udGVudCBFbGVtZW50cyBhbmQgQ29udGVudCBFbGVtZW50cywgb25seS4gIEV4YW1wbGVzIGZvciBDb250ZW50IEVsZW1lbnQgYXJlIEFydGlmYWN0cywgVGFza3MsIFJvbGVzLCBldGMuICBBIGtleSBzZXBhcmF0aW9uIG9mIGNvbmNlcm5zIGluIFVNQSBpcyB0aGUgZGlzdGluY3Rpb24gYmV0d2VlbiBNZXRob2QgQ29udGVudCBhbmQgUHJvY2Vzcy4gIFRoaXMgc2VwYXJhdGlvbiBpcyBlbmZvcmNlZCBieSBzcGVjaWFsIHBhY2thZ2UgdHlwZXMsIHdoaWNoIGRvIG5vdCBhbGxvdyB0aGUgbWl4aW5nIG9mIG1ldGhvZCBjb250ZW50IHdpdGggcHJvY2Vzc2VzLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJjb250ZW50RWxlbWVudHMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0NvbnRlbnRFbGVtZW50IiBjb250YWlubWVudD0idHJ1ZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJBcnRpZmFjdERlc2NyaXB0aW9uIiBlU3VwZXJUeXBlcz0iIy8vV29ya1Byb2R1Y3REZXNjcmlwdGlvbiI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImJyaWVmT3V0bGluZSIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iUHJvdmlkZXMgYSBicmllZiBkZXNjcmlwdGlvbiBvZiB0aGUgaW5mb3JtYXRpb24gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhpcyBhcnRpZmFjdC4gRm9yIGV4YW1wbGUsIGRpc2N1c3NlcyB0aGUgY29udGVudHMgZm9yIGtleSBjaGFwdGVycyBvZiBhIGRvY3VtZW50IGFydGlmYWN0IG9yIHRoZSBrZXkgcGFja2FnZXMgYW5kIG1vZHVsZXMgb2YgYSBtb2RlbCBhcnRpZmFjdC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmVwcmVzZW50YXRpb25PcHRpb25zIgotICAgICAgICBlVHlwZT0iIy8vU3RyaW5nIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJEaXNjdXNzZXMgZGlmZmVyZW50IHBvc3NpYmxlIGFsdGVybmF0aXZlIHJlcHJlc2VudGF0aW9ucyBmb3IgdGhlIGFydGlmYWN0LiBGb3IgZXhhbXBsZSBhIGRlc2lnbiBtb2RlbCBjYW4gYmUgcmVwcmVzZW50ZWQgYXMgYSBVTUwgbW9kZWwgb3IgYW4gaW5mb3JtYWwgYmxvY2sgZGlhZ3JhbSBvciBieSB0ZXh0dWFsIGRlc2NyaXB0aW9uIG9ubHkuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJlcHJlc2VudGF0aW9uIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibm90YXRpb24iIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJXb3JrUHJvZHVjdERlc2NyaXB0aW9uIiBlU3VwZXJUeXBlcz0iIy8vQ29udGVudERlc2NyaXB0aW9uIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icHVycG9zZSIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRGVzY3JpYmVzIHdoeSB0aGUgd29yayBwcm9kdWN0IGlzIHByb2R1Y2VkIGFuZCB0byB3aGF0IHVzZSBpdCB3aWxsIGJlIHB1dC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaW1wYWN0T2ZOb3RIYXZpbmciIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkRlc2NyaWJlcyB0aGUgY29uc2VxdWVuY2VzIG9mIG5vdCBwcm9kdWNpbmcgdGhlIHdvcmsgcHJvZHVjdC4gIFRoaXMgaXMgaW50ZW5kZWQgdG8gYWlkIGluIHRoZSB0YWlsb3JpbmcgdGhlIG1ldGhvZC9wcm9jZXNzIHRvIHRoZSBuZWVkcyBvZiBhIHNwZWNpZmljIHByb2plY3QuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJlYXNvbnNGb3JOb3ROZWVkaW5nIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJEZXNjcmliZXMgdGhlIGNpcmN1bXN0YW5jZXMgaW4gd2hpY2ggaXQgaXMgcmVhc29uYWJsZSBub3QgdG8gcHJvZHVjZSB0aGUgd29yayBwcm9kdWN0LiAgVGhpcyBpcyBpbnRlbmRlZCB0byBhaWQgaW4gdGhlIHRhaWxvcmluZyBvZiB0aGUgbWV0aG9kL3Byb2Nlc3MgdG8gdGhlIG5lZWRzIG9mIGEgc3BlY2lmaWMgcHJvamVjdC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRGVsaXZlcmFibGVEZXNjcmlwdGlvbiIgZVN1cGVyVHlwZXM9IiMvL1dvcmtQcm9kdWN0RGVzY3JpcHRpb24iPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJleHRlcm5hbERlc2NyaXB0aW9uIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZGVzY3JpcHRpb24gb2YgdGhlIERlbGl2ZXJhYmxlIHVzZWQgZm9yIGNsaWVudCBkb2N1bWVudHMgKHByb3Bvc2FsLCBzdGF0ZW1lbnRzIG9mIHdvcmsgb3IgY29udHJhY3R1YWwgYWdyZWVtZW50cykuICBJdCBtaWdodCB1c2UgYSBkaWZmZXJlbnQgbGFuZ3VhZ2UgYW5kIGZvbGxvdyBsZWdhbCBjb25zdHJhaW50cy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icGFja2FnaW5nR3VpZGFuY2UiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlByb3ZpZGVzIGd1aWRhbmNlIG9uIGhvdyB0byBhc3NlbWJsZSB0aGUgZGVsaXZlcmFibGUgZnJvbSBhbGwgaXRzIHJlcXVpcmVkIGlucHV0cy4gIFRoaXMgc2VjdGlvbiBkZXNjcmliZXMgdGhlIG1vc3QgY29tbW9uIGNvbnRlbnQgbWVkaXVtIGFuZCBmb3JtYXQuICBEaXN0cmlidXRpb24gb2YgdGhlIGRlbGl2ZXJhYmxlIGlzIGFkZHJlc3NlZCBpbiB0aGlzIHNlY3Rpb24sIGlmIG5lY2Vzc2FyeS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUm9sZURlc2NyaXB0aW9uIiBlU3VwZXJUeXBlcz0iIy8vQ29udGVudERlc2NyaXB0aW9uIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic2tpbGxzIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJMaXN0cyBvZiBzZXQgb2YgcmVxdWlyZWQgc2tpbGxzIGEgcGVyc29uIG5lZWRzIHRvIHBvc3Nlc3MgdG8gZnVsZmlsbCB0aGF0IFJvbGUuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFzc2lnbm1lbnRBcHByb2FjaGVzIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJQcm92aWRlcyBndWlkYW5jZSBvbiBmb3IgYXNzaWduaW5nIGluZGl2aWR1YWxzIHRvIHRoZSBSb2xlIGluIHRlcm1zIG9mIHdoYXQgb3RoZXIgcm9sZXMgdGhlc2UgaW5kaXZpZHVhbHMgY291bGQgcGVyZm9ybSBhbmQgd2hhdCByZXNwb25zaWJpbGl0eSBkaWZmZXJlbnQgaW5kaXZpZHVhbHMgYXNzaWduZWQgdG8gdGhpcyByb2xlIG1pZ2h0IGhhdmUuICBUaGUgZ3VpZGFuY2UgY2FuIGFsc28gZGVzY3JpYmUgZGlmZmVyZW50IGFzc2lnbm1lbnQgYXBwcm9hY2hlcyBmb3IgZGlmZmVyZW50IHR5cGVzIG9mIHByb2plY3RzLCBlLmcuIGZvciBsYXJnZSB2ZXJzdXMgc21hbGwgdGVhbXMgd2hlcmUgaW5kaXZpZHVhbHMgY291bGQgYmUgYWxsb2NhdGVkIHRvIHJvbGVzIGZ1bGwgdGltZSB2ZXJzdXMgc2hhcmluZyByb2xlcyB3aXRoaW4gdGhlIHRlYW0uIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InN5bm9ueW1zIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJMaXN0cyBzeW5vbnltcywgaS5lLiBvdGhlciBuYW1lcyB0aGUgUm9sZSBtaWdodCBiZSByZWZlcnJlZCBieS4gIFRvb2wgc3VwcG9ydCBmb3IgdGhlIG1ldGEtbW9kZWwgbWlnaHQgc3VwcG9ydCB0aGF0IGEgUm9sZSBuYW1lIGNhbiBiZSBjb25zaXN0ZW50bHkgYmUgcmVwbGFjZWQgd2l0aCBvbmUgb2YgaXRzIHN5bm9ueW1zIHRocm91Z2h0IGEgUHJvY2Vzcy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iVGFza0Rlc2NyaXB0aW9uIiBlU3VwZXJUeXBlcz0iIy8vQ29udGVudERlc2NyaXB0aW9uIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icHVycG9zZSIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iU3VtbWFyaXplcyB0aGUgbWFpbiByZWFzb24gZm9yIHBlcmZvcm1pbmcgdGhpcyBUYXNrIGFuZCB3aGF0IGlzIGludGVuZGVkIHRvIGJlIGFjaGlldmVkLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhbHRlcm5hdGl2ZXMiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkNvbXByaXNlcyBvZiBzdW1tYXJpZXMgZGVzY3JpYmluZyBpbXBvcnRhbnQgZXhjZXB0aW9uYWwgYW5kIG5vbi1zdGFuZGFyZCB3YXlzIG9mIGFjaGlldmluZyB0aGlzIFRhc2sncyBkZXZlbG9wbWVudCBnb2FscyB0aGF0IHdlcmUgbm90IGNvdmVyZWQgYnkgdGhlIFRhc2sncyBTdGVwcy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iR3VpZGFuY2VEZXNjcmlwdGlvbiIgZVN1cGVyVHlwZXM9IiMvL0NvbnRlbnREZXNjcmlwdGlvbiI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImF0dGFjaG1lbnRzIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGlzIGZpZWxkIGlzIHByaW1hcmlseSB1c2VkIGZvciBhdHRhY2htZW50cyBhdWdtZW50aW5nIHRoZSBpbmZvcm1hdGlvbiBwcm92aWRlZCBmb3IgZ3VpZGFuY2UuICBJbiBwYXJ0aWN1bGFyIHRoZSBhdHRyaWJ1dGUgaXMgdXNlZCBmb3IgVGVtcGxhdGVzLCBFeGFtcGxlcywgYW5kIFJldXNhYmxlIEFzc2V0cyB0byBjb250YWluIHRoZSBhY3R1YWwgYXR0YWNobWVudCBkZXNjcmliZWQgaW4gdGhlIG1haW5EZXNjcmlwdGlvbi4gIEl0IGNhbiBhZGRpdGlvbmFsbHkgY29udGFpbiByZXByZXNlbnRhdGlvbnMgb2YgdGhlIGd1aWRhbmNlIGluIGp1c3QgYSB0aGlyZCBwYXJ0eSBmb3JtYXQsIGUuZy4gUERGLCBNUyBXb3JkLCBvciBXb3JkIFBlcmZlY3QuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlByYWN0aWNlRGVzY3JpcHRpb24iIGVTdXBlclR5cGVzPSIjLy9Db250ZW50RGVzY3JpcHRpb24iPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhZGRpdGlvbmFsSW5mbyIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQW55IGFkZGl0aW9uYWwgSW5mb3JtYXRpb24gbm90IGNvdmVyZWQgYnkgdGhlIG90aGVyIGF0dHJpYnV0ZXMuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InByb2JsZW0iIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgZGVzY3JpcHRpb24gb2YgdGhlIHByb2JsZW0gdGhlIFByYWN0aWNlIGFkZHJlc3Nlcy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYmFja2dyb3VuZCIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRWxhYm9yYXRpb24gb24gdGhlIGJhY2tncm91bmQgYW5kIHRoZSBjb250ZXh0IGluIHdoaWNoIHRoZSBwcm9ibGVtIG9jY3VycyBhbmQgd2hlcmUgdGhlIHNvbHV0aW9uIGRlc2NyaWJlZCBieSB0aGlzIFByYWN0aWNlIHdpbGwgZml0IGluLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJnb2FscyIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBzdW1tYXJ5IG9mIHRoZSBvdmVyYWxsIGdvYWxzIHRvIGJlIGFkZHJlc3NlZCBieSB0aGUgUHJhY3RpY2UuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFwcGxpY2F0aW9uIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJEZXNjcmliZXMgaG93IHRoZSBQcmFjdGljZSBpcyBiZWluZyBhcHBsaWVkIG9yIGludHJvZHVjZWQgaW50byB0aGUgY29udGV4dCBkZXNjcmliZWQgaW4gYmFja2dyb3VuZC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibGV2ZWxzT2ZBZG9wdGlvbiIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iT3V0bGluZXMgdGhlIGRpZmZlcmVudCBmb3JtcyBvciB2YXJpYW50cyBpbiB3aGljaCB0aGUgcHJhY3RpY2UgY291bGQgYmUgcmVhbGl6ZWQuIChlLmcuIGZ1bGwgYWRvcHRpb24gdmVydXMgYSBwYXJ0aWFsIGFkb3B0aW9uIG9mIHRoZSBQcmFjdGljZSkiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUG9pbnQiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ4IiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FRG91YmxlT2JqZWN0Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InkiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VEb3VibGVPYmplY3QiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iR3JhcGhFbGVtZW50IiBhYnN0cmFjdD0idHJ1ZSIgZVN1cGVyVHlwZXM9IiMvL0RpYWdyYW1FbGVtZW50Ij4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icG9zaXRpb24iIGVUeXBlPSIjLy9Qb2ludCIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iY29udGFpbmVkIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9EaWFncmFtRWxlbWVudCIgY29udGFpbm1lbnQ9InRydWUiIGVPcHBvc2l0ZT0iIy8vRGlhZ3JhbUVsZW1lbnQvY29udGFpbmVyIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImxpbmsiIG9yZGVyZWQ9ImZhbHNlIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL0RpYWdyYW1MaW5rIiBjb250YWlubWVudD0idHJ1ZSIgZU9wcG9zaXRlPSIjLy9EaWFncmFtTGluay9ncmFwaEVsZW1lbnQiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iYW5jaG9yYWdlIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9HcmFwaENvbm5lY3RvciIgY29udGFpbm1lbnQ9InRydWUiIGVPcHBvc2l0ZT0iIy8vR3JhcGhDb25uZWN0b3IvZ3JhcGhFbGVtZW50Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InNlbWFudGljTW9kZWwiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSIjLy9TZW1hbnRpY01vZGVsQnJpZGdlIiBjb250YWlubWVudD0idHJ1ZSIgZU9wcG9zaXRlPSIjLy9TZW1hbnRpY01vZGVsQnJpZGdlL2dyYXBoRWxlbWVudCIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJEaWFncmFtRWxlbWVudCIgYWJzdHJhY3Q9InRydWUiIGVTdXBlclR5cGVzPSIjLy9NZXRob2RFbGVtZW50Ij4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaXNWaXNpYmxlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbk9iamVjdCIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJjb250YWluZXIiIGVUeXBlPSIjLy9HcmFwaEVsZW1lbnQiCi0gICAgICAgIHRyYW5zaWVudD0idHJ1ZSIgZU9wcG9zaXRlPSIjLy9HcmFwaEVsZW1lbnQvY29udGFpbmVkIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InJlZmVyZW5jZSIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vUmVmZXJlbmNlIiBlT3Bwb3NpdGU9IiMvL1JlZmVyZW5jZS9yZWZlcmVuY2VkIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InByb3BlcnR5IiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Qcm9wZXJ0eSIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRGlhZ3JhbUxpbmsiIGVTdXBlclR5cGVzPSIjLy9EaWFncmFtRWxlbWVudCI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Inpvb20iIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VEb3VibGVPYmplY3QiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0idmlld3BvcnQiIGVUeXBlPSIjLy9Qb2ludCIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZ3JhcGhFbGVtZW50IiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iIy8vR3JhcGhFbGVtZW50IiB0cmFuc2llbnQ9InRydWUiIGVPcHBvc2l0ZT0iIy8vR3JhcGhFbGVtZW50L2xpbmsiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZGlhZ3JhbSIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9IiMvL0RpYWdyYW0iIGVPcHBvc2l0ZT0iIy8vRGlhZ3JhbS9kaWFncmFtTGluayIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJHcmFwaENvbm5lY3RvciIgZVN1cGVyVHlwZXM9IiMvL0dyYXBoRWxlbWVudCI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImdyYXBoRWxlbWVudCIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9IiMvL0dyYXBoRWxlbWVudCIgdHJhbnNpZW50PSJ0cnVlIiBlT3Bwb3NpdGU9IiMvL0dyYXBoRWxlbWVudC9hbmNob3JhZ2UiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZ3JhcGhFZGdlIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9HcmFwaEVkZ2UiIGVPcHBvc2l0ZT0iIy8vR3JhcGhFZGdlL2FuY2hvciIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJTZW1hbnRpY01vZGVsQnJpZGdlIiBhYnN0cmFjdD0idHJ1ZSIKLSAgICAgIGVTdXBlclR5cGVzPSIjLy9EaWFncmFtRWxlbWVudCI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InByZXNlbnRhdGlvbiIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImdyYXBoRWxlbWVudCIgZVR5cGU9IiMvL0dyYXBoRWxlbWVudCIKLSAgICAgICAgdHJhbnNpZW50PSJ0cnVlIiBlT3Bwb3NpdGU9IiMvL0dyYXBoRWxlbWVudC9zZW1hbnRpY01vZGVsIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImRpYWdyYW0iIGVUeXBlPSIjLy9EaWFncmFtIgotICAgICAgICB0cmFuc2llbnQ9InRydWUiIGVPcHBvc2l0ZT0iIy8vRGlhZ3JhbS9uYW1lc3BhY2UiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRGltZW5zaW9uIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0id2lkdGgiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VEb3VibGVPYmplY3QiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaGVpZ2h0IiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FRG91YmxlT2JqZWN0Ii8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlJlZmVyZW5jZSIgZVN1cGVyVHlwZXM9IiMvL0RpYWdyYW1FbGVtZW50Ij4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaXNJbmRpdmlkdWFsUmVwcmVzZW50YXRpb24iCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuT2JqZWN0Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InJlZmVyZW5jZWQiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSIjLy9EaWFncmFtRWxlbWVudCIgZU9wcG9zaXRlPSIjLy9EaWFncmFtRWxlbWVudC9yZWZlcmVuY2UiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUHJvcGVydHkiIGVTdXBlclR5cGVzPSIjLy9EaWFncmFtRWxlbWVudCI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImtleSIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InZhbHVlIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iR3JhcGhFZGdlIiBlU3VwZXJUeXBlcz0iIy8vR3JhcGhFbGVtZW50Ij4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iYW5jaG9yIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgbG93ZXJCb3VuZD0iMiIgdXBwZXJCb3VuZD0iMiIgZVR5cGU9IiMvL0dyYXBoQ29ubmVjdG9yIiBlT3Bwb3NpdGU9IiMvL0dyYXBoQ29ubmVjdG9yL2dyYXBoRWRnZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ3YXlwb2ludHMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICBsb3dlckJvdW5kPSIyIiB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1BvaW50IiBjb250YWlubWVudD0idHJ1ZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJEaWFncmFtIiBlU3VwZXJUeXBlcz0iIy8vR3JhcGhOb2RlIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iem9vbSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRURvdWJsZU9iamVjdCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ2aWV3cG9pbnQiIGVUeXBlPSIjLy9Qb2ludCIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZGlhZ3JhbUxpbmsiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0RpYWdyYW1MaW5rIiBlT3Bwb3NpdGU9IiMvL0RpYWdyYW1MaW5rL2RpYWdyYW0iLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ibmFtZXNwYWNlIiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iIy8vU2VtYW50aWNNb2RlbEJyaWRnZSIgY29udGFpbm1lbnQ9InRydWUiIGVPcHBvc2l0ZT0iIy8vU2VtYW50aWNNb2RlbEJyaWRnZS9kaWFncmFtIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkdyYXBoTm9kZSIgZVN1cGVyVHlwZXM9IiMvL0dyYXBoRWxlbWVudCI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InNpemUiIGVUeXBlPSIjLy9EaW1lbnNpb24iCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlNpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50IiBlU3VwZXJUeXBlcz0iIy8vU2VtYW50aWNNb2RlbEJyaWRnZSI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InR5cGVJbmZvIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iVU1BU2VtYW50aWNNb2RlbEJyaWRnZSIgZVN1cGVyVHlwZXM9IiMvL1NlbWFudGljTW9kZWxCcmlkZ2UiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJlbGVtZW50IiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iIy8vTWV0aG9kRWxlbWVudCIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJDb3JlU2VtYW50aWNNb2RlbEJyaWRnZSIgZVN1cGVyVHlwZXM9IiMvL1NlbWFudGljTW9kZWxCcmlkZ2UiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJlbGVtZW50IiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iIy8vRWxlbWVudCIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJMZWFmRWxlbWVudCIgYWJzdHJhY3Q9InRydWUiIGVTdXBlclR5cGVzPSIjLy9EaWFncmFtRWxlbWVudCIvPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlRleHRFbGVtZW50IiBlU3VwZXJUeXBlcz0iIy8vTGVhZkVsZW1lbnQiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ0ZXh0IiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iSW1hZ2UiIGVTdXBlclR5cGVzPSIjLy9MZWFmRWxlbWVudCI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InVyaSIgZVR5cGU9IiMvL1VyaSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJtaW1lVHlwZSIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkdyYXBoaWNQcmltaXRpdmUiIGFic3RyYWN0PSJ0cnVlIiBlU3VwZXJUeXBlcz0iIy8vTGVhZkVsZW1lbnQiLz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQb2x5bGluZSIgZVN1cGVyVHlwZXM9IiMvL0dyYXBoaWNQcmltaXRpdmUiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjbG9zZWQiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuT2JqZWN0IgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9IndheXBvaW50cyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIGxvd2VyQm91bmQ9IjIiIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vUG9pbnQiIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkVsbGlwc2UiIGVTdXBlclR5cGVzPSIjLy9HcmFwaGljUHJpbWl0aXZlIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmFkaXVzWCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRURvdWJsZU9iamVjdCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyYWRpdXNZIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FRG91YmxlT2JqZWN0Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJvdGF0aW9uIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FRG91YmxlT2JqZWN0Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InN0YXJ0QW5nbGUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VEb3VibGVPYmplY3QiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZW5kQW5nbGUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VEb3VibGVPYmplY3QiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iY2VudGVyIiBlVHlwZT0iIy8vUG9pbnQiCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkFjdGl2aXR5IiBlU3VwZXJUeXBlcz0iIy8vV29ya0JyZWFrZG93bkVsZW1lbnQgIy8vVmFyaWFiaWxpdHlFbGVtZW50ICMvL1dvcmtEZWZpbml0aW9uIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBbiBBY3Rpdml0eSBpcyBhIFdvcmsgQnJlYWtkb3duIEVsZW1lbnQgYW5kIFdvcmsgRGVmaW5pdGlvbiB3aGljaCBzdXBwb3J0cyB0aGUgbmVzdGluZyBhbmQgbG9naWNhbCBncm91cGluZyBvZiByZWxhdGVkIEJyZWFrZG93biBFbGVtZW50cyBmb3JtaW5nIGJyZWFrZG93biBzdHJ1Y3R1cmVzLiAgQWx0aG91Z2ggQWN0aXZpdHkgaXMgYSBjb25jcmV0ZSBtZXRhLWNsYXNzLCBvdGhlciBjbGFzc2VzIHdoaWNoIHJlcHJlc2VudCBicmVha2Rvd24gc3RydWN0dXJlcyBkZXJpdmUgZnJvbSBpdDsgc3VjaCBhcyBQaGFzZSwgSXRlcmF0aW9uLCBEZWxpdmVyeSBQcm9jZXNzLCBvciBDYXBhYmlsaXR5IFBhdHRlcm4uJiN4RDsmI3hBO0FjdGl2aXR5IHJlcHJlc2VudHMgYSBncm91cGluZyBlbGVtZW50IGZvciBvdGhlciBCcmVha2Rvd24gRWxlbWVudHMgc3VjaCBhcyBBY3Rpdml0aWVzLCBEZXNjcmlwdG9ycywgTWlsZXN0b25lcywgZXRjLiAgSXQgaXMgbm90IHBlci1zZSBhICdoaWdoLWxldmVsJyBncm91cGluZyBvZiBvbmx5IHdvcmsgYXMgaW4gb3RoZXIgbWV0YS1tb2RlbHMsIGJ1dCBncm91cHMgYW55IGtpbmQgb2YgQnJlYWtkb3duIEVsZW1lbnRzLiAgRm9yIGV4YW1wbGUsIG9uZSBjYW4gZGVmaW5lIHZhbGlkIEFjdGl2aXRpZXMgdGhhdCBncm91cCBvbmx5IFdvcmsgUHJvZHVjdHMgRGVzY3JpcHRvcnMgd2l0aG91dCBhbnkgbWF0Y2hpbmcgVGFzayBEZXNjcmlwdG9ycy4gIEFjdGl2aXRpZXMgYWxzbyBpbmhlcml0IGFsbCBwcm9wZXJ0aWVzIGZyb20gV29yayBCcmVha2Rvd24gRWxlbWVudCBhbmQgaW5kaXJlY3RseSBmcm9tIFByb2Nlc3MgRWxlbWVudDsgaS5lLiBBY3Rpdml0eSBpcyByZWFkeSB0byBoYXZlIGEgZnVsbCBjb250ZW50IGRlc2NyaXB0aW9uIGF0dGFjaGVkIHRvIGl0LiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJicmVha2Rvd25FbGVtZW50cyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vQnJlYWtkb3duRWxlbWVudCIgZU9wcG9zaXRlPSIjLy9CcmVha2Rvd25FbGVtZW50L3N1cGVyQWN0aXZpdGllcyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJyb2FkbWFwcyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vUm9hZG1hcCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJzdXBwb3J0aW5nTWF0ZXJpYWxzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9TdXBwb3J0aW5nTWF0ZXJpYWwiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iY2hlY2tsaXN0cyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vQ2hlY2tsaXN0Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImNvbmNlcHRzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Db25jZXB0Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImV4YW1wbGVzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9FeGFtcGxlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Imd1aWRlbGluZXMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0d1aWRlbGluZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJyZXVzYWJsZUFzc2V0cyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vUmV1c2FibGVBc3NldCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpc0VuYWN0YWJsZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW5PYmplY3QiCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IldvcmtCcmVha2Rvd25FbGVtZW50IiBhYnN0cmFjdD0idHJ1ZSIKLSAgICAgIGVTdXBlclR5cGVzPSIjLy9CcmVha2Rvd25FbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIFdvcmsgQnJlYWtkb3duIEVsZW1lbnQgaXMgYSBzcGVjaWFsIEJyZWFrZG93biBFbGVtZW50IHRoYXQgcHJvdmlkZXMgc3BlY2lmaWMgcHJvcGVydGllcyBmb3IgQnJlYWtkb3duIEVsZW1lbnRzIHRoYXQgcmVwcmVzZW50IG9yIHJlZmVyIHRvIFdvcmsgRGVmaW5pdGlvbnMuICBGb3IgZXhhbXBsZSBpdHMgc3ViY2xhc3MgQWN0aXZpdHkgZGVmaW5lcyB3b3JrIGFzIGl0IGlzIGFsc28gYSBzdWJjbGFzcyBvZiBXb3JrIERlZmluaXRpb24uICBJdHMgc3ViY2xhc3MgVGFzayBEZXNjcmlwdG9yIGRvZXMgbm90IGRlZmluZSB3b3JrIGJ5IGl0c2VsZiwgYnV0IHJlZmVycyB0byBhIFdvcmsgRGVmaW5pdGlvbiBhbmQgdGhlcmVmb3JlIGNhbiBoYXZlIHRoZSBzYW1lIGNvbW1vbiBwcm9wZXJ0aWVzIGFuZCBXb3JrIEJyZWFrZG93biBFbGVtZW50IGhhcy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaXNSZXBlYXRhYmxlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbk9iamVjdCIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGlzIGF0dHJpYnV0ZSBpcyB1c2VkIHRvIGRlZmluZSByZXBldGl0aW9uIG9mIHdvcmssIGUuZy4gaXRlcmF0aW9ucy4gIEEgUHJvY2VzcyBXb3JrIERlZmluaXRpb24gd2l0aCB0aGlzIGF0dHJpYnV0ZSBzZXQgdG8gVHJ1ZSBzaGFsbCBiZSByZXBlYXRlZCBtb3JlIHRoYW4gb25jZSBvbiB0aGUgc2FtZSBzZXQgb2YgYXJ0aWZhY3RzLiAgRm9yIGV4YW1wbGUsIGZvciBhbiBpbnN0YW5jZSBvZiBJdGVyYXRpb24gKGRlZmluZWQgYXMgYSBzcGVjaWFsIFByb2Nlc3MgV29yayBEZWZpbml0aW9uIGJlbG93KSB0aGlzIGF0dHJpYnV0ZSBpcyBzZXQgdG8gVHJ1ZSBieSBkZWZhdWx0IGluZGljYXRpbmcgdGhhdCBldmVyeSBzdWItQWN0aXZpdHkgd2lsbCBiZSByZXBlYXRlZCBtb3JlIHRoYW4gb25jZS4gIEhvd2V2ZXIsIGFueSBQcm9jZXNzIFdvcmsgRGVmaW5pdGlvbiBjYW4gc2V0IHRoaXMgYXR0cmlidXRlIHRvIFRydWUgdG8gZGVmaW5lIGl0ZXJhdGlvbnMgKGUuZy4gdG8gaXRlcmF0ZSBvbmUgQWN0aXZpdHkgY29uc2lzdGluZyBvZiBtYW55IHN1Yi1hY3Rpdml0aWVzIG9yIGV2ZW4gUGhhc2VzLCBidXQgdG8gaXRlcmF0ZSBqdXN0IG9uZSBUYXNrKS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaXNPbmdvaW5nIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbk9iamVjdCIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJJZiB0aGUgaXNPbmdvaW5nIGF0dHJpYnV0ZSBpcyBzZXQgdG8gVHJ1ZSBmb3IgYSBQcm9jZXNzIFdvcmsgRGVmaW5pdGlvbiBpbnN0YW5jZSwgdGhlbiB0aGUgZWxlbWVudCBkZXNjcmliZXMgYW4gb25nb2luZyBwaWVjZSBvZiB3b3JrIHdpdGhvdXQgYSBmaXhlZCBkdXJhdGlvbiBvciBlbmQgc3RhdGUuICBGb3IgZXhhbXBsZSwgdGhlIFByb2Nlc3MgV29yayBEZWZpbml0aW9uIGNvdWxkIHJlcHJlc2VudCB3b3JrIG9mIGFuIGFkbWluaXN0cmF0b3IgY29udGludW91c2x5IChlLmcuIDNoIGEgZGF5KSB3b3JraW5nIHRvIGVuc3VyZSB0aGF0IHN5c3RlbXMgYXJlIGtlcHQgaW4gYSBjZXJ0YWluIHN0YXRlLiAgQW5vdGhlciBleGFtcGxlIHdvdWxkIGJlIHByb2dyYW0gbWFuYWdlbWVudCB3b3JrIG92ZXJzZWVpbmcgbWFueSBkaWZmZXJlbnQgcHJvamVjdHMgYmVpbmcgc2NoZWR1bGVkIGZvciBvbmUgcGFydGljdWxhciBwcm9qZWN0IGF0IHNwZWNpZmljIHJlb2NjdXJyaW5nIGludGVydmFscyBkdXJpbmcgdGhlIHdob2xlIGxpZmVjeWNsZSBvZiB0aGUgcHJvamVjdC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaXNFdmVudERyaXZlbiIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW5PYmplY3QiCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGlzRXZlbnREcml2ZW4gYXR0cmlidXRlIGluZGljYXRlcyB0aGF0IHRoZSBQcm9jZXNzIFdvcmsgRGVmaW5pdGlvbiBkZXNjcmliZXMgYW4gaW5zdGFuY2Ugb2Ygd29yayB3aGljaCBpcyBub3Qgc3RhcnRlZCBiZWNhdXNlIGl0IGhhcyBiZWVuIHNjaGVkdWxlZCB0byBzdGFydCBhdCBhIGNlcnRhaW4gcG9pbnQgb2YgdGltZSwgYmVjYXVzZSBwcmVjZWRpbmcgd29yayBpcyBiZWluZyBjb21wbGV0ZWQsIG9yIGlucHV0IHdvcmsgcHJvZHVjdHMgYXJlIGF2YWlsYWJsZSwgYnV0IGJlY2F1c2UgYW5vdGhlciBzcGVjaWZpYyBldmVudCBoYXMgb2NjdXJyZWQuICBFeGFtcGxlcyBmb3Igc3VjaCBldmVudHMgYXJlIGV4Y2VwdGlvbnMgb3IgcHJvYmxlbSBzaXR1YXRpb25zIHdoaWNoIHJlcXVpcmUgc3BlY2lmaWMgd29yayB0byBiZSBwZXJmb3JtZWQgYXMgYSByZXN1bHQuICBBbHNvIGNoYW5nZSBtYW5hZ2VtZW50IHdvcmsgY2FuIGJlIG1vZGVsZWQgYXMgZXZlbnQgZHJpdmVuIHdvcmsgYW5hbHl6aW5nIGEgY2hhbmdlIHJlcXVlc3Qgb3IgZGVmZWN0IGFuZCBhbGxvY2F0aW5nIHdvcmsgZHluYW1pY2FsbHkgdG8gcmVzb3VyY2VzIHRvIGRlYWwgd2l0aCBpdCBmb2xsb3dpbmcgdGhlIHdvcmsgZGVzY3JpYmVkIHdpdGggc3VjaCBQcm9jZXNzIFdvcmsgRGVmaW5pdGlvbi4gIFRoZSBldmVudHMgdGhlbXNlbHZlcyBhcmUgbm90IG1vZGVsZWQgaW4gdGhpcyB2ZXJzaW9uIG9mIHRoZSBzcGVjaWZpY2F0aW9uLiAgVGhleSBzaGFsbCBiZSBkZXNjcmliZWQgYXMgcGFydCBvZiB0aGUgbm9ybWFsIGRlc2NyaXB0aW9ucyBmaWVsZHMgYXZhaWxhYmxlLiYjeEQ7JiN4QTsmI3hEOyYjeEE7Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImxpbmtUb1ByZWRlY2Vzc29yIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Xb3JrT3JkZXIiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQnJlYWtkb3duRWxlbWVudCIgYWJzdHJhY3Q9InRydWUiIGVTdXBlclR5cGVzPSIjLy9Qcm9jZXNzRWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQnJlYWtkb3duIEVsZW1lbnQgaXMgYW4gYWJzdHJhY3QgZ2VuZXJhbGl6YXRpb24gZm9yIGFueSB0eXBlIG9mIE1ldGhvZCBFbGVtZW50IHRoYXQgaXMgcGFydCBvZiBhIGJyZWFrZG93biBzdHJ1Y3R1cmUuICBJdCBkZWZpbmVzIGEgc2V0IG9mIHByb3BlcnRpZXMgYXZhaWxhYmxlIHRvIGFsbCBvZiBpdHMgc3BlY2lhbGl6YXRpb25zLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwcmVmaXgiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlByZWZpeCByZXByZXNlbnRzIGFuIGFkZGl0aW9uYWwgbGFiZWwgdGhhdCB3aWxsIGJlIHByZXNlbnRlZCBhcyBhIHByZWZpeCB0byBhbnkgQnJlYWtkb3duIEVsZW1lbnQgdG8gaW5kaWNhdGUgYSB1c2VyLWRlZmluZWQgc3ViLXR5cGUgZm9yIHRoZSBlbGVtZW50LiAgRm9yIGV4YW1wbGUsIGlmIHRoZSBwcm9jZXNzIGVuZ2luZWVyIHdvdWxkIGxpa2UgdG8gZGlzdGluZ3Vpc2ggaGlzIEFjdGl2aXRpZXMgYnkgJ01vZHVsZScgKGFzIGRvbmUgaW4gdGhlIElCTSBSYXRpb25hbCBTdW1taXQgQXNjZW5kYW50IE1ldGhvZCksIGhlIGNhbiBkZWZpbmUgYSBkaWZmZXJlbnQgcHJlZml4IGZvciBldmVyeSBtb2RlbCB0byBiZSB1c2VkIGluIGFkZGl0aW9uIHRvIG5hbWluZyBBY3Rpdml0aWVzLCBlLmcuICZxdW90O1NSQS5Fc3RhYmxpc2ggUmVxdWlyZW1lbnRzJnF1b3Q7IHdpdGggU1JBIGluZGljYXRpbmcgdGhhdCB0aGlzIEFjdGl2aXR5IGJlbG9uZ3MgdG8gdGhlICZxdW90O1NvZnR3YXJlIFJlcXVpcmVtZW50cyBBbmFseXNpcyZxdW90OyBtb2R1bGUuICBBbm90aGVyIGNvbW1vbiBhcHBsaWNhdGlvbiBmb3IgcHJlZml4IGlzIHRvIHF1YWxpZnkgcm9sZXMgaW4gUm9sZSBEZXNjcmlwdG9ycy4gIEZvciBleGFtcGxlLCAmcXVvdDtDdXN0b21lci5BcmNoaXRlY3QmcXVvdDsgd291bGQgZGVmaW5lIGEgJnF1b3Q7Q3VzdG9tZXImcXVvdDsgcHJlZml4IGZvciB0aGUgUm9sZSBEZXNjcmlwdG9yICZxdW90O0FyY2hpdGVjdCZxdW90OyBleHByZXNzaW5nIHRoYXQgdGhpcyBpcyBhbiBhcmNoaXRlY3Qgb24gdGhlIGN1c3RvbWVyIHNpZGUgYW5kIG5vdCB0aGUgZGV2ZWxvcG1lbnQgdGVhbSBzaWRlLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpc1BsYW5uZWQiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuT2JqZWN0IgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBrZXkgYXBwbGljYXRpb24gZm9yIERldmVsb3BtZW50IFByb2Nlc3NlcyBleHByZXNzZWQgd2l0aCBCcmVha2Rvd24gc3RydWN0dXJlcyBpcyB0byBnZW5lcmF0ZSBhIHByb2plY3QgcGxhbiBmcm9tIGl0LiAgQSBwcm9jZXNzIGFzIGRlZmluZWQgaW4gVU1BIChjZi4gd2l0aCBTZWN0aW9ucyBYWCBhbmQgNS4yKSBpcyBhIG11bHRpLWRpbWVuc2lvbmFsIHN0cnVjdHVyZSBkZWZpbmluZyB3aGF0IHdvcmsgaXMgYmVpbmcgcGVyZm9ybWVkIGF0IHdoYXQgdGltZSBieSB3aGljaCByb2xlcyB1c2luZyB3aGljaCBpbnB1dCBhbmQgcHJvZHVjaW5nIHdoYXQgb3V0cHV0cy4gIEEgcHJvamVjdCBwbGFuIGFzIGl0IGlzIHJlcHJlc2VudGVkIGluIHByb2plY3QgcGxhbm5pbmcgdG9vbHMgc3VjaCBhcyBJQk0gUmF0aW9uYWwgUG9ydGZvbGlvIE1hbmFnZXIgb3IgTWljcm9zb2Z0IFByb2plY3Qgbm9ybWFsbHkgZG9lcyBub3QgbmVlZCBhbGwgdGhpcyBpbmZvcm1hdGlvbiBhbmQgaXMgbm9ybWFsbHkgbGltaXRlZCB0byBqdXN0IHJlcHJlc2VudGluZyBhIHN1YnNldC4gIEZvciBleGFtcGxlLCBhIHR5cGljYWwgTVMgUHJvamVjdCBwbGFuIG9ubHkgcmVwcmVzZW50cyB0aGUgd29yayBicmVha2Rvd24gY29uc2lzdGluZyBvZiBUYXNrcyBhbmQgQWN0aXZpdGllcyAoc29tZXRpbWVzIHJlZmVycmVkIHRvIGFzIHN1bW1hcnkgdGFza3MpLiAgSXQgZG9lcyBub3Qgc2hvdyB0aGUgaW5wdXQgYW5kIG91dHB1dCBXb3JrIFByb2R1Y3RzIGZvciBhIFRhc2ssIGJ1dCBpdCBjYW4gc2hvdyB3aGljaCByb2xlcyBzaGFsbCBiZSBzdGFmZmVkIGZvciBwZXJmb3JtaW5nIHRoZSBUYXNrLiAgSG93ZXZlciwgc3VjaCByb2xlIGFsbG9jYXRpb24gbmVlZCB0byBiZSByZXBsYWNlZCB3aXRoIGNvbmNyZXRlIHJlc291cmNlcyB3aGVuIGluc3RhbnRpYXRpbmcgdGhlIHBsYW4gZm9yIGEgY29uY3JldGUgcHJvamVjdC4gIFNvbWV0aW1lcyBwcm9qZWN0IHBsYW5zIGNhbiB0aGVuIGFnYWluIGJlIG9yZ2FuaXplZCBkaWZmZXJlbnRseSBieSBvcmdhbml6aW5nIHdvcmsgYnkgZGVsaXZlcmFibGVzIGluIHdoaWNoIFdvcmsgUHJvZHVjdHMgYXJlIG1hcHBlZCB0byB0aGUgcGxhbidzIHN1bW1hcnkgdGFza3MgYW5kIFRhc2sgdGhhdCBoYXZlIHRoZXNlIHdvcmsgcHJvZHVjdHMgYXMgb3V0cHV0IG1hcHBlZCBiZWxvdyBzdWNoIGFzIHN1bW1hcnkgdGFzay4gIFRoZXJlZm9yZSwgYSBwcm9jZXNzIGNhbiBtYWtlIHJlY29tbWVuZGF0aW9ucyBhYm91dCB3aGljaCBlbGVtZW50cyB0byBpbmNsdWRlIGFuZCB3aGljaCB0byBleGNsdWRlIHdoZW4gZ2VuZXJhdGluZyBhIHBsYW4uICBXaGVuIHRoZSBpc1BsYW5uZWQgYXR0cmlidXRlIGlzIHNldCB0byBGYWxzZSBmb3IgYW4gaW5zdGFuY2Ugb2YgYSBCcmVha2Rvd24gRWxlbWVudCwgdGhlbiB0aGlzIGVsZW1lbnQgc2hhbGwgbm90IGJlIG5vdCBpbmNsdWRlZCB3aGVuIGEgY29uY3JldGUgcHJvamVjdCBwbGFuIGlzIGJlaW5nIGdlbmVyYXRlZCBmcm9tIHRoZSBicmVha2Rvd24gc3RydWN0dXJlIHRoYXQgY29udGFpbnMgdGhpcyBlbGVtZW50LiYjeEQ7JiN4QTsmI3hEOyYjeEE7Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Imhhc011bHRpcGxlT2NjdXJyZW5jZXMiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuT2JqZWN0IgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9Ikp1c3QgYXMgdGhlIGlzUGxhbm5lZCBhdHRyaWJ1dGUgdGhlIGhhc011bHRpcGxlT2NjdXJyZW5jZXMgYXR0cmlidXRlIGhhcyBhbiBpbXBhY3Qgb24gZ2VuZXJhdGluZyBwbGFucyBmcm9tIGEgUHJvY2Vzcy4gIFdoZW4gdGhpcyBhdHRyaWJ1dGUgaXMgc2V0IHRvIFRydWUgZm9yIGEgQnJlYWtkb3duIEVsZW1lbnQgdGhlbiBpdCB3aWxsIHR5cGljYWxseSBvY2N1ciBtdWx0aXBsZSB0aW1lcyB3aXRoaW4gdGhlIHNhbWUgQWN0aXZpdHkuICBGb3IgZXhhbXBsZSwgYSBUYXNrIHN1Y2ggYXMgJnF1b3Q7RGV0YWlsIFVzZSBDYXNlJnF1b3Q7IHdvdWxkIGJlIHBlcmZvcm1lZCBmb3IgZXZlcnkgdXNlIGNhc2UgaWRlbnRpZmllZCBmb3IgYSBwYXJ0aWN1bGFyIEl0ZXJhdGlvbiBvciBBY3Rpdml0eS4gIEdlbmVyYXRpbmcgYSBwbGFuIHdvdWxkIGxpc3Qgb25lIFRhc2sgaW5zdGFuY2UgcGVyIHVzZSBjYXNlLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpc09wdGlvbmFsIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbk9iamVjdCIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgaXNPcHRpb25hbCBhdHRyaWJ1dGUgaW5kaWNhdGVzIHRoYXQgdGhlIEJyZWFrZG93biBFbGVtZW50IGRlc2NyaWJlcyB3b3JrLCBhIHdvcmsgcmVzdWx0LCBvciBldmVuIHdvcmsgcmVzb3VyY2VzLCB3aGljaCBpbmNsdXNpb24gaXMgbm90IG1hbmRhdG9yeSB3aGVuIHBlcmZvcm1pbmcgYSBwcm9qZWN0IHRoYXQgaXMgcGxhbm5lZCBiYXNlZCBvbiBhIHByb2Nlc3MgY29udGFpbmluZyB0aGlzIGVsZW1lbnQuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InByZXNlbnRlZEFmdGVyIiBlVHlwZT0iIy8vQnJlYWtkb3duRWxlbWVudCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJwcmVzZW50ZWRCZWZvcmUiIGVUeXBlPSIjLy9CcmVha2Rvd25FbGVtZW50Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InBsYW5uaW5nRGF0YSIgZVR5cGU9IiMvL1BsYW5uaW5nRGF0YSIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ic3VwZXJBY3Rpdml0aWVzIiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iIy8vQWN0aXZpdHkiIGVPcHBvc2l0ZT0iIy8vQWN0aXZpdHkvYnJlYWtkb3duRWxlbWVudHMiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iTWlsZXN0b25lIiBlU3VwZXJUeXBlcz0iIy8vV29ya0JyZWFrZG93bkVsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgTWlsZXN0b25lIGRlc2NyaWJlcyBhIHNpZ25pZmljYW50IGV2ZW50IGluIGEgZGV2ZWxvcG1lbnQgcHJvamVjdCwgc3VjaCBhcyBhIG1ham9yIGRlY2lzaW9uLCBjb21wbGV0aW9uIG9mIGEgZGVsaXZlcmFibGUsIG9yIG1lZXRpbmcgb2YgYSBtYWpvciBkZXBlbmRlbmN5IChsaWtlIGNvbXBsZXRpb24gb2YgYSBwcm9qZWN0IHBoYXNlKS4gIEJlY2F1c2UsIE1pbGVzdG9uZSBpcyBjb21tb25seSB1c2VkIHRvIHJlZmVyIHRvIGJvdGggdGhlIGV2ZW50IGl0c2VsZiBhbmQgdGhlIHBvaW50IGluIHRpbWUgYXQgd2hpY2ggdGhlIGV2ZW50IGlzIHNjaGVkdWxlZCB0byBoYXBwZW4sIGl0IGlzIG1vZGVsZWQgYXMgYSBCcmVha2Rvd24gRWxlbWVudCAoaS5lLiBpdCBhcHBlYXJzIGFzIHBhcnQgb2YgYSBicmVha2Rvd24gc3RydWN0dXJlKS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iSXRlcmF0aW9uIiBlU3VwZXJUeXBlcz0iIy8vQWN0aXZpdHkiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9Ikl0ZXJhdGlvbiBpcyBhIHNwZWNpYWwgQWN0aXZpdHksIHdoaWNoIHByZXNjcmliZXMgcHJlLWRlZmluZWQgdmFsdWVzIGZvciBpdHMgaW5zdGFuY2VzIGZvciB0aGUgYXR0cmlidXRlcyBwcmVmaXggKCdJdGVyYXRpb24nKSBhbmQgaXNSZXBlYXRhYmxlICgnVHJ1ZScpLiAgSXQgaGFzIGJlZW4gaW5jbHVkZWQgaW50byB0aGUgbWV0YS1tb2RlbCBmb3IgY29udmVuaWVuY2UgYW5kIHRvIHByb3ZpZGUgYSBzcGVjaWFsIHN0ZXJlb3R5cGUsIGJlY2F1c2UgaXQgcmVwcmVzZW50cyBhIHZlcnkgY29tbW9ubHkgdXNlZCBBY3Rpdml0eSB0eXBlLiYjeEQ7JiN4QTtJdGVyYXRpb24gZ3JvdXBzIGEgc2V0IG9mIG5lc3RlZCBBY3Rpdml0aWVzIHRoYXQgYXJlIHJlcGVhdGVkIG1vcmUgdGhhbiBvbmNlLiAgSXQgcmVwcmVzZW50cyBhbiBpbXBvcnRhbnQgc3RydWN0dXJpbmcgZWxlbWVudCB0byBvcmdhbml6ZSB3b3JrIGluIHJlcGV0aXRpdmUgY3ljbGVzLiAgVGhlIGNvbmNlcHQgb2YgSXRlcmF0aW9uIGNhbiBiZSBhc3NvY2lhdGVkIHdpdGggZGlmZmVyZW50IHJ1bGVzIGluIGRpZmZlcmVudCBtZXRob2RzLiAgRm9yIGV4YW1wbGUsIHRoZSBJQk0gUmF0aW9uYWwgVW5pZmllZCBQcm9jZXNzIG1ldGhvZCBmcmFtZXdvcmsgKFJVUCkgZGVmaW5lcyBhIHJ1bGUgdGhhdCBJdGVyYXRpb25zIGFyZSBub3QgYWxsb3dlZCB0byBzcGFuIGFjcm9zcyBQaGFzZXMuICBJbiBjb250cmFzdCBJQk0gR2xvYmFsIFNlcnZpY2VzIE1ldGhvZCAoR1NNZXRob2QpIGJhc2VkIG1ldGhvZCBmcmFtZXdvcmtzIHRoaXMgcnVsZSBkb2VzIG5vdCBhcHBseSBhbmQgSXRlcmF0aW9uIGNhbiBiZSBkZWZpbmVkIHdoaWNoIG5lc3QgUGhhc2VzLiAgUnVsZXMgbGlrZSB0aGVzZSwgd2hpY2ggcGxheSBhbiBpbXBvcnRhbnQgcm9sZSBmb3IgZWFjaCBpbmRpdmlkdWFsIG1ldGhvZCBhbmQgYXJlIHRoZXJlZm9yZSBub3QgZW5mb3JjZWQgYnkgdGhpcyBtZXRhLW1vZGVsLiAgSW5zdGVhZCwgcHJvY2VzcyBhdXRob3JzIGFyZSBleHBlY3RlZCB0byBmb2xsb3cgYW5kIGNoZWNrIHRoZXNlIHJ1bGVzIG1hbnVhbGx5LiAgKE5vdGU6IEFueSBCcmVha2Rvd24gRWxlbWVudCBjYW4gYmUgcmVwZWF0ZWQ7IGhvd2V2ZXIsIEl0ZXJhdGlvbnMgaGFzIGJlZW4gaW50cm9kdWNlZCBhcyBhIHNwZWNpYWwgbWV0YS1tb2RlbCBjb25jZXB0LCBiZWNhdXNlIG9mIGl0cyBpbXBvcnRhbnQgcm9sZSBmb3IgbWFueSBtZXRob2RzLikiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUGhhc2UiIGVTdXBlclR5cGVzPSIjLy9BY3Rpdml0eSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iUGhhc2UgaXMgYSBzcGVjaWFsIEFjdGl2aXR5LCB3aGljaCBwcmVzY3JpYmVzIHByZS1kZWZpbmVkIHZhbHVlcyBmb3IgaXRzIGluc3RhbmNlcyBmb3IgdGhlIGF0dHJpYnV0ZXMgcHJlZml4ICgnUGhhc2UnKSBhbmQgaXNSZXBlYXRhYmxlICgnRmFsc2UnKS4gIEl0IGhhcyBiZWVuIGluY2x1ZGVkIGludG8gdGhlIG1ldGEtbW9kZWwgZm9yIGNvbnZlbmllbmNlIGFuZCB0byBwcm92aWRlIGEgc3BlY2lhbCBzdGVyZW90eXBlLCBiZWNhdXNlIGl0IHJlcHJlc2VudHMgYSB2ZXJ5IGNvbW1vbmx5IHVzZWQgQWN0aXZpdHkgdHlwZS4mI3hEOyYjeEE7UGhhc2UgcmVwcmVzZW50IGEgc2lnbmlmaWNhbnQgcGVyaW9kIGluIGEgcHJvamVjdCwgZW5kaW5nIHdpdGggbWFqb3IgbWFuYWdlbWVudCBjaGVja3BvaW50LCBtaWxlc3RvbmUgb3Igc2V0IG9mIERlbGl2ZXJhYmxlcy4gIEl0IGlzIGluY2x1ZGVkIGluIHRoZSBtb2RlbCBhcyBhIHByZWRlZmluZWQgc3BlY2lhbCBBY3Rpdml0eSwgYmVjYXVzZSBvZiBpdHMgc2lnbmlmaWNhbmNlIGluIGRlZmluaW5nIGJyZWFrZG93bnMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlRlYW1Qcm9maWxlIiBlU3VwZXJUeXBlcz0iIy8vQnJlYWtkb3duRWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBUZWFtIFByb2ZpbGUgaXMgYSBCcmVha2Rvd24gRWxlbWVudCB0aGF0IGdyb3VwcyBSb2xlIERlc2NyaXB0b3JzIG9yIFJlc291cmNlIERlZmluaXRpb25zIGRlZmluaW5nIGEgbmVzdGVkIGhpZXJhcmNoeSBvZiB0ZWFtcyBhbmQgdGVhbSBtZW1iZXJzLiYjeEQ7JiN4QTtXb3JrIGFzc2lnbm1lbnRzIGFuZCBXb3JrIFByb2R1Y3QgcmVzcG9uc2liaWxpdGllcyBjYW4gYmUgZGlmZmVyZW50IGZyb20gQWN0aXZpdHkgdG8gQWN0aXZpdHkgaW4gYSBkZXZlbG9wbWVudCBwcm9qZWN0LiBEaWZmZXJlbnQgcGhhc2VzIHJlcXVpcmUgZGlmZmVyZW50IHN0YWZmaW5nIHByb2ZpbGVzLCBpLmUuIGRpZmZlcmVudCBza2lsbHMgYW5kIHJlc291cmNlcyBkb2luZyBkaWZmZXJlbnQgdHlwZXMgb2Ygd29yay4gIFRoZXJlZm9yZSwgYSBwcm9jZXNzIG5lZWRzIHRvIGRlZmluZSBzdWNoIGRpZmZlcmVudCBwcm9maWxlcyBpbiBhIGZsZXhpYmxlIG1hbm5lci4gIFdoZXJlYXMgQ29yZSBNZXRob2QgQ29udGVudCBkZWZpbmVzIHN0YW5kYXJkIHJlc3BvbnNpYmlsaXRpZXMgYW5kIGFzc2lnbm1lbnRzLCBhIHByb2Nlc3MgZXhwcmVzcyBieSBhIGJyZWFrZG93biBzdHJ1Y3R1cmVzIG5lZWRzIHRvIGJlIGFibGUgcmVmaW5lIGFuZCByZWRlZmluZSB0aGVzZSB0aHJvdWdob3V0IGl0cyBkZWZpbml0aW9uLiAgUm9sZSBEZXNjcmlwdG9ycywgUmVzb3VyY2UgRGVmaW5pdGlvbnMsIGFzIHdlbGwgYXMgVGVhbSBQcm9maWxlcyBwcm92aWRlIHRoZSBkYXRhIHN0cnVjdHVyZSBuZWNlc3NhcnkgdG8gYWNoaWV2ZSB0aGlzIGZsZXhpYmlsaXR5IGFuZCB0byBwcm92aWRlIGEgcHJvY2VzcyB1c2VyIHdpdGggdGhlIGNhcGFiaWxpdHkgdG8gZGVmaW5lIGRpZmZlcmVudCB0ZWFtcyBhbmQgcm9sZSByZWxhdGlvbnNoaXBzIGZvciBldmVyeSBBY3Rpdml0eSAoaW5jbHVkaW5nIEFjdGl2aXRpZXMgb24gYW55IG5lc3RpbmctbGV2ZWwgYXMgd2VsbCBhcyBJdGVyYXRpb25zIG9yIFBoYXNlcykuJiN4RDsmI3hBO0hlbmNlLCBpbiBhZGRpdGlvbiB0byB0aGUgd29yayBicmVha2Rvd24gYW5kIHdvcmsgcHJvZHVjdCBicmVha2Rvd24gc3RydWN0dXJlcyBkZWZpbmVkIHNvIGZhciwgVGVhbSBQcm9maWxlcyBhcmUgdXNlZCB0byBkZWZpbmUgYSB0aGlyZCB0eXBlIG9mIGJyZWFrZG93biBzdHJ1Y3R1cmU6IHRlYW0gYnJlYWtkb3duIHN0cnVjdHVyZXMuICBUaGVzZSBhcmUgY3JlYXRlZCBhcyBhbiBBY3Rpdml0eSBzcGVjaWZpYyBoaWVyYXJjaHkgb2YgVGVhbSBQcm9maWxlcyBjb21wcmlzaW5nIG9mIFJvbGUgRGVzY3JpcHRvcnMgYW5kIFJlc291cmNlIERlZmluaXRpb25zLiAgVGhlc2Ugc3RydWN0dXJlcyBjYW4gYmUgcHJlc2VudGVkIGFzIHdlbGwta25vd24gT3JnLUNoYXJ0cy4gIEp1c3QgYXMgd2l0aCBhbnkgb3RoZXIgQnJlYWtkb3duIEVsZW1lbnQgYW5kIERlc2NyaXB0b3JzLCBUZWFtIFByb2ZpbGVzIGNhbiBiZSBkZWZpbmVkIHdpdGhpbiB0aGUgc2NvcGUgb2YgYW55IEFjdGl2aXR5IGluIGEgYnJlYWtkb3duIHN0cnVjdHVyZS4gIEluIG90aGVyIHdvcmRzIGV2ZXJ5IEFjdGl2aXR5IGNhbiBkZWZpbmUgaXRzIG93biBUZWFtIFByb2ZpbGVzIGNvbnNpc3Rpbmcgb2YgQWN0aXZpdHkgc3BlY2lmaWMgUm9sZSBEZXNjcmlwdG9ycyBhbmQgUmVzb3VyY2UgRGVmaW5pdGlvbnMuICBUeXBpY2FsbHksIFRlYW0gUHJvZmlsZXMgYXJlIGRlZmluZWQgb24gdGhlIGxldmVsIG9mIEl0ZXJhdGlvbnMgb3IgUGhhc2VzIG9yIG90aGVyIGhpZ2hlci1sZXZlbCBBY3Rpdml0eS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0idGVhbVJvbGVzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Sb2xlRGVzY3JpcHRvciIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJzdXBlclRlYW0iIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSIjLy9UZWFtUHJvZmlsZSIgZU9wcG9zaXRlPSIjLy9UZWFtUHJvZmlsZS9zdWJUZWFtIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InN1YlRlYW0iIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1RlYW1Qcm9maWxlIiBlT3Bwb3NpdGU9IiMvL1RlYW1Qcm9maWxlL3N1cGVyVGVhbSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJSb2xlRGVzY3JpcHRvciIgZVN1cGVyVHlwZXM9IiMvL0Rlc2NyaXB0b3IiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgUm9sZSBEZXNjcmlwdG9yIHJlcHJlc2VudHMgYSBSb2xlIGluIHRoZSBjb250ZXh0IG9mIG9uZSBzcGVjaWZpYyBBY3Rpdml0eS4gIEV2ZXJ5IGJyZWFrZG93biBzdHJ1Y3R1cmUgY2FuIGRlZmluZSBkaWZmZXJlbnQgcmVsYXRpb25zaGlwcyBvZiBSb2xlIERlc2NyaXB0b3JzIHRvIFRhc2sgRGVzY3JpcHRvcnMgYW5kIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9ycy4gIFRoZXJlZm9yZSBvbmUgUm9sZSBjYW4gYmUgcmVwcmVzZW50ZWQgYnkgbWFueSBSb2xlIERlc2NyaXB0b3JzIGVhY2ggd2l0aGluIHRoZSBjb250ZXh0IG9mIGFuIEFjdGl2aXR5IHdpdGggaXRzIG93biBzZXQgb2YgcmVsYXRpb25zaGlwcy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iUm9sZSIgZVR5cGU9IiMvL1JvbGUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ibW9kaWZpZXMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1dvcmtQcm9kdWN0RGVzY3JpcHRvciIgY2hhbmdlYWJsZT0iZmFsc2UiIHZvbGF0aWxlPSJ0cnVlIgotICAgICAgICB0cmFuc2llbnQ9InRydWUiIGRlcml2ZWQ9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icmVzcG9uc2libGVGb3IiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1dvcmtQcm9kdWN0RGVzY3JpcHRvciIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUVudW0iIG5hbWU9IldvcmtPcmRlclR5cGUiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldvcmsgT3JkZXIgcmVwcmVzZW50cyBhIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHR3byBCcmVha2Rvd24gRWxlbWVudCBpbiB3aGljaCBvbmUgQnJlYWtkb3duIEVsZW1lbnQgKHJlZmVycmVkIHRvIGFzIChCKSBiZWxvdykgZGVwZW5kcyBvbiB0aGUgc3RhcnQgb3IgZmluaXNoIG9mIGFub3RoZXIgQnJlYWtkb3duIEVsZW1lbnQgKHJlZmVycmVkIHRvIGFzIChBKSBiZWxvdykgaW4gb3JkZXIgdG8gYmVnaW4gb3IgZW5kLiBUaGlzIGVudW1lcmF0aW9uIGRlZmluZXMgdGhlIGRpZmZlcmVudCB0eXBlcyBvZiBXb3JrIE9yZGVyIHJlbGF0aW9uc2hpcHMgYXZhaWxhYmxlIGluIFVNQSBhbmQgaXMgdXNlZCB0byBwcm92aWRlIHZhbHVlcyBmb3IgV29yayBPcmRlcidzIGxpbmtUeXBlIGF0dHJpYnV0ZS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9ImZpbmlzaFRvU3RhcnQiLz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9ImZpbmlzaFRvRmluaXNoIiB2YWx1ZT0iMSIvPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0ic3RhcnRUb1N0YXJ0IiB2YWx1ZT0iMiIvPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0ic3RhcnRUb0ZpbmlzaCIgdmFsdWU9IjMiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iV29ya09yZGVyIiBlU3VwZXJUeXBlcz0iIy8vUHJvY2Vzc0VsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldvcmsgT3JkZXIgaXMgYSBNZXRob2QgRWxlbWVudCB0aGF0IHJlcHJlc2VudHMgYSByZWxhdGlvbnNoaXAgYmV0d2VlbiB0d28gQnJlYWtkb3duIEVsZW1lbnRzIGluIHdoaWNoIG9uZSBCcmVha2Rvd24gRWxlbWVudHMgZGVwZW5kcyBvbiB0aGUgc3RhcnQgb3IgZmluaXNoIG9mIGFub3RoZXIgQnJlYWtkb3duIEVsZW1lbnRzIGluIG9yZGVyIHRvIGJlZ2luIG9yIGVuZC4gICYjeEQ7JiN4QTsoTm90ZSwgV29yayBPcmRlciBpcyBub3QgbW9kZWxlZCBhcyBhbiBBc3NvY2lhdGlvbiBDbGFzcyB0byBwcm92aWRlIGEgc3RyYWlnaHRmb3J3YXJkIG1hcHBpbmcgIHRvIFhNSSBhbmQgRU1GLikmI3hEOyYjeEE7VGhlIFdvcmsgT3JkZXIgY2xhc3MgZGVmaW5lcyBwcmVkZWNlc3NvciBhbmQgc3VjY2Vzc29yIHJlbGF0aW9ucyBhbW9uZ3N0IEJyZWFrZG93biBFbGVtZW50cy4gIFRoaXMgaW5mb3JtYXRpb24gaXMgaW4gcGFydGljdWxhciBjcml0aWNhbCBmb3IgcGxhbm5pbmcgYXBwbGljYXRpb25zLiAgU2VlIG1vcmUgZGV0YWlscyBvbiBkaWZmZXJlbnQgdHlwZXMgb2YgV29yayBPcmRlciByZWxhdGlvbnNoaXBzIGF0IFdvcmsgT3JkZXIgVHlwZS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibGlua1R5cGUiIGVUeXBlPSIjLy9Xb3JrT3JkZXJUeXBlIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmaW5pc2hUb1N0YXJ0Ij4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhpcyBhdHRyaWJ1dGUgZXhwcmVzc2VzIHRoZSB0eXBlIG9mIHRoZSBXb3JrIE9yZGVyIHJlbGF0aW9uc2hpcCBieSBhc3NpZ25pbmcgYSB2YWx1ZSBmcm9tIHRoZSBXb3JrIE9yZGVyIFR5cGUgZW51bWVyYXRpb24uIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InByZWQiIGxvd2VyQm91bmQ9IjEiIGVUeXBlPSIjLy9Xb3JrQnJlYWtkb3duRWxlbWVudCIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQcm9jZXNzRWxlbWVudCIgYWJzdHJhY3Q9InRydWUiIGVTdXBlclR5cGVzPSIjLy9EZXNjcmliYWJsZUVsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlByb2Nlc3MgRWxlbWVudCBpcyBhIERlc2NyaWJhYmxlIEVsZW1lbnQgdGhhdCByZXByZXNlbnRzIGFuIGFic3RyYWN0IGdlbmVyYWxpemF0aW9uIGZvciBhbGwgZWxlbWVudHMgZGVmaW5lZCBpbiB0aGUgUHJvY2VzcyBwYWNrYWdlLiYjeEQ7JiN4QTtQcm9jZXNzIEVsZW1lbnRzIHJlcHJlc2VudHMgUHJvY2VzcyBzcGVjaWZpYyBlbGVtZW50cyB0aGF0IGFyZSBzdXBwb3NlZCB0byBiZSBtYW5hZ2VkIGluIFByb2Nlc3MgUGFja2FnZXMuICBUaGUgc2VwYXJhdGlvbiBvZiBQcm9jZXNzIEVsZW1lbnQgZnJvbSBDb250ZW50IEVsZW1lbnQgYWxsb3dzIHRvIGNsZWFybHkgZGlzdGluZ3Vpc2ggYmV0d2VlbiBwdXJlIG1ldGhvZCBjb250ZW50IGZyb20gY29udGVudCB0aGF0IGlzIHJlcHJlc2VudGVkIGluIHByb2Nlc3Nlcy4gIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlBsYW5uaW5nRGF0YSIgZVN1cGVyVHlwZXM9IiMvL1Byb2Nlc3NFbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJQbGFubmluZyBEYXRhIGlzIGEgTWV0aG9kIEVsZW1lbnQgdGhhdCBhZGRzIHBsYW5uaW5nIGRhdGEgdG8gQnJlYWtkb3duIEVsZW1lbnRzIHdoZW4gaXQgaXMgdXNlZCBmb3IgYSBQcm9jZXNzIFBsYW5uaW5nIFRlbXBsYXRlLiAgRm9yIERlbGl2ZXJ5IFByb2Nlc3NlcyBhbmQgQ2FwYWJpbGl0eSBQYXR0ZXJucyB0aGlzIGNsYXNzIGNhbiBlaXRoZXIgbm90IGJlIGluc3RhbnRpYXRlZCBvciBwb3B1bGF0ZWQgd2l0aCBkZWZhdWx0IGRhdGEuJiN4RDsmI3hBO1BsYW5uaW5nIERhdGEgZmFjdG9ycyBvdXQgc3BlY2lmaWMgb3B0aW9uYWwgZGF0YSBuZWVkZWQgZm9yIHJlcHJlc2VudGluZyBwbGFubmluZyB0ZW1wbGF0ZXMuICBUaGlzIGFzc29jaWF0aW9uIGFsbG93cyB0byBhY2Nlc3MgcGxhbm5pbmcgZGF0YSBpZiBpdCBpcyBzdG9yZWQgZm9yIHRoZSBCcmVha2Rvd24gRWxlbWVudC4mI3hEOyYjeEE7KE5PVEUsIFRIRSBBVFRSSUJVVEVTIEZPUiBUSElTIENMQVNTIEFSRSBOT1QgQ09NUExFVEUsIFlFVCkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic3RhcnREYXRlIiBlVHlwZT0iIy8vRGF0ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBkZWZhdWx0IHN0YXJ0IGRhdGUgZm9yIGEgcGxhbmVkIFRhc2suIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImZpbmlzaERhdGUiIGVUeXBlPSIjLy9EYXRlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGRlZmF1bHQgZmluaXNoIGRhdGUgZm9yIGEgcGxhbmVkIFRhc2suIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJhbmsiIGVUeXBlPSIjLy9JbnRlZ2VyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGRlZmF1bHQgcmFuayBmb3IgYSBwbGFuZWQgVGFzay4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRGVzY3JpcHRvciIgYWJzdHJhY3Q9InRydWUiIGVTdXBlclR5cGVzPSIjLy9CcmVha2Rvd25FbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIERlc2NyaXB0b3IgaXMgYW4gYWJzdHJhY3QgZ2VuZXJhbGl6YXRpb24gZm9yIHNwZWNpYWwgQnJlYWtkb3duIEVsZW1lbnRzIHRoYXQgcmVmZXJlbmNlcyBvbmUgY29uY3JldGUgQ29udGVudCBFbGVtZW50LiAgQSBkZXNjcmlwdG9yIHByb3ZpZGVzIGEgcmVwcmVzZW50YXRpb24gb2YgYSBDb250ZW50IEVsZW1lbnQgd2l0aGluIGJyZWFrZG93biBzdHJ1Y3R1cmVzLiAgSW4gYWRkaXRpb24gdG8ganVzdCByZWZlcmVuY2luZyBDb250ZW50IEVsZW1lbnRzIGl0IGFsbG93cyBvdmVycmlkaW5nIHRoZSBDb250ZW50IEVsZW1lbnRzIHN0cnVjdHVyYWwgcmVsYXRpb25zaGlwcyBieSBkZWZpbmluZyBpdHMgb3duIHNldHMgb2YgYXNzb2NpYXRpb25zLiYjeEQ7JiN4QTtEZXNjcmlwdG9ycyBhcmUgdGhlIGtleSBjb25jZXB0IGZvciByZWFsaXppbmcgdGhlIHNlcGFyYXRpb24gb2YgcHJvY2Vzc2VzIGZyb20gbWV0aG9kIGNvbnRlbnQuICBBIERlc2NyaXB0b3IgY2FuIGJlIGNoYXJhY3Rlcml6ZWQgYXMgYSByZWZlcmVuY2Ugb2JqZWN0IGZvciBvbmUgcGFydGljdWxhciBDb250ZW50IEVsZW1lbnQsIHdoaWNoIGhhcyBpdHMgb3duIHJlbGF0aW9uc2hpcHMgYW5kIHByb3BlcnRpZXMuICBXaGVuIGEgRGVzY3JpcHRvciBpcyBjcmVhdGVkIGl0IHNoYWxsIGJlIHByb3ZpZGVkIHdpdGggY29uZ3J1ZW50IGNvcGllcyBvZiB0aGUgcmVsYXRpb25zaGlwcyBkZWZpbmVkIGZvciB0aGUgcmVmZXJlbmNlZCBjb250ZW50IGVsZW1lbnQuICBIb3dldmVyLCBhIHVzZXIgY2FuIG1vZGlmeSB0aGVzZSByZWxhdGlvbnNoaXBzIGZvciB0aGUgcGFydGljdWxhciBwcm9jZXNzIHNpdHVhdGlvbiBmb3Igd2hpY2ggdGhlIGRlc2NyaXB0b3IgaGFzIGJlZW4gY3JlYXRlZC4gIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImlzU3luY2hyb25pemVkV2l0aFNvdXJjZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW5PYmplY3QiCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9InRydWUiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iV29ya1Byb2R1Y3REZXNjcmlwdG9yIiBlU3VwZXJUeXBlcz0iIy8vRGVzY3JpcHRvciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvciByZXByZXNlbnRzIGEgV29yayBQcm9kdWN0IGluIHRoZSBjb250ZXh0IG9mIG9uZSBzcGVjaWZpYyBBY3Rpdml0eS4gIEV2ZXJ5IGJyZWFrZG93biBzdHJ1Y3R1cmUgY2FuIGRlZmluZSBkaWZmZXJlbnQgcmVsYXRpb25zaGlwcyBvZiBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvcnMgdG8gVGFzayBEZXNjcmlwdG9ycyBhbmQgUm9sZSBEZXNjcmlwdG9ycy4gIFRoZXJlZm9yZSBvbmUgV29yayBQcm9kdWN0IGNhbiBiZSByZXByZXNlbnRlZCBieSBtYW55IFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9ycyBlYWNoIHdpdGhpbiB0aGUgY29udGV4dCBvZiBhbiBBY3Rpdml0eSB3aXRoIGl0cyBvd24gc2V0IG9mIHJlbGF0aW9uc2hpcHMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFjdGl2aXR5RW50cnlTdGF0ZSIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iR2l2ZW4gdGhhdCBhbiBpbnN0YW5jZSBvZiBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvciBoYXMgYmVlbiBjcmVhdGVkIGZvciBhIHNwZWNpZmljIEFjdGl2aXR5LCB0aGVuIHRoZSBBY3Rpdml0eSBFbnRyeSBTdGF0ZSBhdHRyaWJ1dGUgc3BlY2lmaWVzIHRoZSBkZXNpcmVkIHN0YXRlIG9mIGluc3RhbmNlcyBvZiB0aGUgcmVmZXJlbmNlZCBXb3JrIFByb2R1Y3Qgd2hlbiB3b3JrIG9uIHRoZSBBY3Rpdml0eSBpcyBpbml0aWF0ZWQgKGkuZS4gd29yayBvbiB0aGUgQWN0aXZpdHkncyBUYXNrIERlc2NyaXB0b3JzIGlzIGJlaW5nIGluaXRpYXRlZCB0aGF0IHVzZSB0aGlzIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9yIGFzIGlucHV0KS4gICYjeEQ7JiN4QTtGb3Igc29tZSBXb3JrIFByb2R1Y3RzIHN0YXRlIGlzIGV4cHJlc3NlZCBpbiBwZXJjZW50YWdlIG9mIGNvbXBsZXRpb24sIGNvbXBsaWFuY2UgdG8gd29yayBwcm9kdWN0IGNoZWNrbGlzdCwgaW5mb3JtYWwgc3RhdGUgZGVzY3JpcHRpb25zLCBldGMuICBPdGhlcnMgaGF2ZSB2ZXJ5IHNwZWNpZmljIHN0YXRlcyBleHByZXNzZWQgYXMgZW51bWVyYXRpb25zIHN1Y2ggYXMgW2lkZW50aWZpZWQsIGJyaWVmbHkgZGVzY3JpYmVkLCBvdXRsaW5lZCwgZGV0YWlsZWRdIGZvciB1c2UgY2FzZXMuICBPdGhlciBXb3JrIFByb2R1Y3Qgc3RhdGVzIHJlbGF0ZSB0byBzb21lIHF1YWxpdHkgbWVhc3VyZXMgb3IgbGlmZWN5Y2xlIHN0YXRlcyBzdWNoIGFzIFtyZXZpZXdlZCwgaW1wbGVtZW50ZWQsIHRlc3RlZF0uIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFjdGl2aXR5RXhpdFN0YXRlIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJHaXZlbiB0aGF0IGFuIGluc3RhbmNlIG9mIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9yIGhhcyBiZWVuIGNyZWF0ZWQgZm9yIGEgc3BlY2lmaWMgQWN0aXZpdHksIHRoZW4gdGhlIEFjdGl2aXR5IEV4aXN0IFN0YXRlIGF0dHJpYnV0ZSBzcGVjaWZpZXMgdGhlIGRlc2lyZWQgc3RhdGUgb2YgaW5zdGFuY2VzIG9mIHRoZSByZWZlcmVuY2VkIFdvcmsgUHJvZHVjdCB3aGVuIHdvcmsgb24gdGhlIEFjdGl2aXR5IGlzIGZpbmlzaGVkIChpLmUuIHdvcmsgb24gdGhlIEFjdGl2aXR5J3MgVGFzayBEZXNjcmlwdG9ycyBoYXMgZmluaXNoZWQgdGhhdCBoYXZlIHRoaXMgV29yayBQcm9kdWN0IERlc2NyaXB0b3IgYXMgb3V0cHV0KS4mI3hEOyYjeEE7Rm9yIHNvbWUgV29yayBQcm9kdWN0cyBzdGF0ZSBpcyBleHByZXNzZWQgaW4gcGVyY2VudGFnZSBvZiBjb21wbGV0aW9uLCBjb21wbGlhbmNlIHRvIHdvcmsgcHJvZHVjdCBjaGVja2xpc3QsIGluZm9ybWFsIHN0YXRlIGRlc2NyaXB0aW9ucywgZXRjLiAgT3RoZXJzIGhhdmUgdmVyeSBzcGVjaWZpYyBzdGF0ZXMgZXhwcmVzc2VkIGFzIGVudW1lcmF0aW9ucyBzdWNoIGFzIFtpZGVudGlmaWVkLCBicmllZmx5IGRlc2NyaWJlZCwgb3V0bGluZWQsIGRldGFpbGVkXSBmb3IgdXNlIGNhc2VzLiAgT3RoZXIgV29yayBQcm9kdWN0IHN0YXRlcyByZWxhdGUgdG8gc29tZSBxdWFsaXR5IG1lYXN1cmVzIG9yIGxpZmVjeWNsZSBzdGF0ZXMgc3VjaCBhcyBbcmV2aWV3ZWQsIGltcGxlbWVudGVkLCB0ZXN0ZWRdLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJXb3JrUHJvZHVjdCIgZVR5cGU9IiMvL1dvcmtQcm9kdWN0Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImltcGFjdGVkQnkiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1dvcmtQcm9kdWN0RGVzY3JpcHRvciIgZU9wcG9zaXRlPSIjLy9Xb3JrUHJvZHVjdERlc2NyaXB0b3IvaW1wYWN0cyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJpbXBhY3RzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Xb3JrUHJvZHVjdERlc2NyaXB0b3IiIGVPcHBvc2l0ZT0iIy8vV29ya1Byb2R1Y3REZXNjcmlwdG9yL2ltcGFjdGVkQnkiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZGVsaXZlcmFibGVQYXJ0cyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vV29ya1Byb2R1Y3REZXNjcmlwdG9yIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlRhc2tEZXNjcmlwdG9yIiBlU3VwZXJUeXBlcz0iIy8vV29ya0JyZWFrZG93bkVsZW1lbnQgIy8vRGVzY3JpcHRvciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBUYXNrIERlc2NyaXB0b3IgaXMgYSBEZXNjcmlwdG9yIGFuZCBXb3JrIEJyZWFrZG93biBFbGVtZW50IHRoYXQgcmVwcmVzZW50cyBhIHByb3h5IGZvciBhIFRhc2sgaW4gdGhlIGNvbnRleHQgb2Ygb25lIHNwZWNpZmljIEFjdGl2aXR5LiAgRXZlcnkgYnJlYWtkb3duIHN0cnVjdHVyZSBjYW4gZGVmaW5lIGRpZmZlcmVudCByZWxhdGlvbnNoaXBzIG9mIFRhc2sgRGVzY3JpcHRvcnMgdG8gV29yayBQcm9kdWN0IERlc2NyaXB0b3JzIGFuZCBSb2xlIERlc2NyaXB0b3JzLiBUaGVyZWZvcmUgb25lIFRhc2sgY2FuIGJlIHJlcHJlc2VudGVkIGJ5IG1hbnkgVGFzayBEZXNjcmlwdG9ycyBlYWNoIHdpdGhpbiB0aGUgY29udGV4dCBvZiBhbiBBY3Rpdml0eSB3aXRoIGl0cyBvd24gc2V0IG9mIHJlbGF0aW9uc2hpcHMuJiN4RDsmI3hBO0Ega2V5IGRpZmZlcmVuY2UgYmV0d2VlbiBNZXRob2QgQ29udGVudCBhbmQgUHJvY2VzcyBpcyB0aGF0IGEgQ29udGVudCBFbGVtZW50IHN1Y2ggYXMgVGFzayBkZXNjcmliZXMgYWxsIGFzcGVjdHMgb2YgZG9pbmcgd29yayBkZWZpbmVkIGFyb3VuZCB0aGlzIFRhc2suICBUaGlzIGRlc2NyaXB0aW9uIGlzIG1hbmFnZWQgaW4gc3RlcHMsIHdoaWNoIGFyZSBtb2RlbGVkIGFzIFNlY3Rpb25zIG9mIHRoZSBUYXNrcycgQ29udGVudCBEZXNjcmlwdGlvbnMuICBXaGVuIGFwcGx5aW5nIGEgVGFzayBpbiBhIFByb2Nlc3MnIEFjdGl2aXR5IHdpdGggYSBUYXNrIERlc2NyaXB0b3IgYSBQcm9jZXNzIEVuZ2luZWVyIG5lZWRzIHRvIGluZGljYXRlIHRoYXQgYXQgdGhhdCBwYXJ0aWN1bGFyIHBvaW50IGluIHRpbWUgaW4gdGhlIFByb2Nlc3MgZGVmaW5pdGlvbiBmb3Igd2hpY2ggdGhlIFRhc2sgRGVzY3JpcHRvciBoYXMgYmVlbiBjcmVhdGVkLCBvbmx5IGEgc3Vic2V0IG9mIHN0ZXBzIHNoYWxsIGJlIHBlcmZvcm1lZC4gIEhlIGRlZmluZXMgdGhpcyBzZWxlY3Rpb24gdXNpbmcgdGhlIHNlbGVjdGVkU3RlcHMgYXNzb2NpYXRpb24uICBJZiBoZSB3YW50cyB0byBhZGQgc3RlcHMgdG8gYSBUYXNrIERlc2NyaXB0b3IsIGhlIGNhbiBkZXNjcmliZSB0aGVzZSBlaXRoZXIgcHJhZ21hdGljYWxseSBpbiB0aGUgcmVmaW5lZERlc2NyaXB0aW9uIGF0dHJpYnV0ZSBvciAncHJvcGVybHknIGNyZWF0ZSBhIGNvbnRyaWJ1dGluZyBUYXNrIHRvIHRoZSBUYXNrIHRoZSBUYXNrIERlc2NyaXB0b3IgcmVmZXJzIHRvLiYjeEQ7JiN4QTsiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iVGFzayIgZVR5cGU9IiMvL1Rhc2siLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iYWRkaXRpb25hbGx5UGVyZm9ybWVkQnkiCi0gICAgICAgIG9yZGVyZWQ9ImZhbHNlIiB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1JvbGVEZXNjcmlwdG9yIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImFzc2lzdGVkQnkiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1JvbGVEZXNjcmlwdG9yIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImV4dGVybmFsSW5wdXQiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1dvcmtQcm9kdWN0RGVzY3JpcHRvciIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJtYW5kYXRvcnlJbnB1dCIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vV29ya1Byb2R1Y3REZXNjcmlwdG9yIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im9wdGlvbmFsSW5wdXQiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1dvcmtQcm9kdWN0RGVzY3JpcHRvciIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJvdXRwdXQiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1dvcmtQcm9kdWN0RGVzY3JpcHRvciIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJwZXJmb3JtZWRQcmltYXJpbHlCeSIgZVR5cGU9IiMvL1JvbGVEZXNjcmlwdG9yIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InNlbGVjdGVkU3RlcHMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1NlY3Rpb24iLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQ29tcG9zaXRlUm9sZSIgZVN1cGVyVHlwZXM9IiMvL1JvbGVEZXNjcmlwdG9yIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIENvbXBvc2l0ZSBSb2xlIGlzIGEgc3BlY2lhbCBSb2xlIERlc2NyaXB0b3IgdGhhdCByZWxhdGVzIHRvIG1vcmUgdGhlbiBvbmUgUm9sZS4gIEl0IHJlcHJlc2VudHMgYSBncm91cGluZyBvZiBSb2xlcyB3aXRoIHRoZSBtYWluIHB1cnBvc2Ugb2Ygc2ltcGxpZmljYXRpb24sIGkuZS4gcmVkdWNpbmcgdGhlIG51bWJlciBvZiByb2xlcyBmb3IgYSBwcm9jZXNzLiYjeEQ7JiN4QTtBIENvbXBvc2l0ZSBSb2xlIGlzIGEgZ3JvdXBpbmcgb2YgUm9sZXMgdGhhdCBjYW4gYmUgdXNlZCBpbiBhbiBBY3Rpdml0eSBvciBQcm9jZXNzIHRvIHJlZHVjZSB0aGUgbnVtYmVyIG9mIFJvbGVzLiAgQSB0eXBpY2FsIGFwcGxpY2F0aW9uIHdvdWxkIGJlIGEgcHJvY2VzcyBmb3IgYSBzbWFsbCB0ZWFtIGluIHdoaWNoIGEgc3RhbmRhcmQgc2V0IG9mIHJvbGVzIGZyb20gdGhlIG1ldGhvZCBjb250ZW50IHdvdWxkIGJlIGFsbCBwZXJmb3JtZWQgYnkgb25lIG9yIG1vcmUgcmVzb3VyY2UuICBCeSB1c2luZyBDb21wb3NpdGUgUm9sZSB0aGUgcHJvY2VzcyB3b3VsZCBzdWdnZXN0IGEgdHlwaWNhbCBjbHVzdGVyaW5nIG9mIFJvbGVzIHRvIFJlc291cmNlcy4gIEEgQ29tcG9zaXRlIFJvbGUgY291bGQgcGVyZm9ybSBhbGwgVGFza3MgZGVmaW5lZCBmb3IgdGhlIFJvbGVzIGl0IHJlZmVycyB0by4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iYWdncmVnYXRlZFJvbGVzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Sb2xlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbiIgZVN1cGVyVHlwZXM9IiMvL0NvbnRlbnREZXNjcmlwdGlvbiI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InVzYWdlR3VpZGFuY2UiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlByb3ZpZGVzIGluZm9ybWF0aW9uIGFuZCBndWlkYW5jZSBvbiB0aGUgbWVhbmluZyBvZiB0aGUgQm9vbGVhbiBmbGFnIHZhbHVlcyBhbmQgdW5kZXIgd2hhdCBjaXJjdW1zdGFuY2VzIHRoZXkgc2hvdWxkIGJlIG92ZXJyaWRkZW4uIEZvciBleGFtcGxlLCBpdCBkZXNjcmliZXMgd2h5IHRoZSBicmVha2Rvd24gZWxlbWVudCBpcyBvcHRpb25hbCBvciBjb25zaWRlcmF0aW9ucyBmb3IgcmVwZWF0aW5nIGl0IGFuZCBkaWZmZXJlbmNlcyBpbiB0aGUgaW5kaXZpZHVhbCBvY2N1cnJlbmNlcyBvZiB0aGlzIEJyZWFrZG93biBFbGVtZW50IGFjcm9zcyB0aGUgbGlmZWN5Y2xlLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJBY3Rpdml0eURlc2NyaXB0aW9uIiBlU3VwZXJUeXBlcz0iIy8vQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icHVycG9zZSIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iU3VtbWFyaXplcyB0aGUgbWFpbiByZWFzb24gZm9yIHBlcmZvcm1pbmcgdGhpcyBBY3Rpdml0eSwgZGVzY3JpYmVzIHdoYXQgdGhlIGFjdGl2aXR5IGFzIGEgd2hvbGUgaXMgaW50ZW5kZWQgdG8gYWNoaWV2ZS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYWx0ZXJuYXRpdmVzIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJDb21wcmlzZXMgb2Ygc3VtbWFyaWVzIGRlc2NyaWJpbmcgaW1wb3J0YW50IGV4Y2VwdGlvbmFsIGFuZCBub24tc3RhbmRhcmQgd2F5cyBvZiBkb2luZyB0aGUgd29yayBvZiB0aGlzIEFjdGl2aXR5IG5vdCBjb3ZlcmVkIGJ5IHRoZSBBY3Rpdml0eSdzIFRhc2tzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJob3d0b1N0YWZmIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJQcm92aWRlcyBiYWNrZ3JvdW5kIG9uIHdobyBzaG91bGQgYmUgaW52b2x2ZWQgaW4gdGhpcyBhY3Rpdml0eSB3aGF0IGFyZSB0aGUgcmVxdWlyZWQgc2tpbGxzLCBleHBlcmllbmNlLCAgYW5kIHBlcmhhcHMgYXR0aXR1ZGVzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJEZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbiIgZVN1cGVyVHlwZXM9IiMvL1Byb2Nlc3NEZXNjcmlwdGlvbiI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InNjYWxlIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJPdXRsaW5lcyBjaGFyYWN0ZXJpc3RpY3MgYWJvdXQgdGhlIHNpemUgb2YgYSB0eXBpY2FsIHByb2plY3QgdGhhdCBwZXJmb3JtcyB0aGlzIHByb2plY3QgZXhwcmVzc2VkIGluIHRlYW0gc2l6ZSwgbWFuIHllYXJzLCBldGMuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InByb2plY3RDaGFyYWN0ZXJpc3RpY3MiCi0gICAgICAgIGVUeXBlPSIjLy9TdHJpbmciIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkNoYXJhY3Rlcml6ZXMgdGhlIHByb2plY3QgdGhhdCB3b3VsZCB0eXBpY2FsbHkgcGVyZm9ybSB0aGlzIFByb2Nlc3MiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmlza0xldmVsIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJPdXRsaW5lcyB0eXBpY2FsIHByb2plY3Qgcmlza3MgdGhhdCBhcmUgYWRkcmVzc2VkIHdpdGggdGhpcyBwcm9jZXNzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJlc3RpbWF0aW5nVGVjaG5pcXVlIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJEZXNjcmliZXMgdGhlIEVzdGltYXRpb24gVGVjaG5pcXVlcyBwcm92aWRlZCBmb3IgdGhpcyBQcm9jZXNzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwcm9qZWN0TWVtYmVyRXhwZXJ0aXNlIgotICAgICAgICBlVHlwZT0iIy8vU3RyaW5nIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJQcm92aWRlcyBhIHByb2ZpbGUgb2YgYSB0eXBpY2FsIHByb2plY3QgdGVhbSwgdGhlIGRpc3RyaWJ1dGlvbiBvZiByb2xlcywgc2tpbGxzIHJlcXVpcmVkIGZvciBhIHRlYW0gcGVyZm9ybXMgYSBwcm9qZWN0IGJhc2VkIG9uIHRoaXMgcHJvY2Vzcy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idHlwZU9mQ29udHJhY3QiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlByb3ZpZGVzIGJhY2tncm91bmQgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGNvbnRyYWN0cyB0aGF0IG5lZWQgdG8gYmUgZXN0YWJsaXNoZWQgYmV0d2VlbiBhIHByb2plY3QgdGVhbSB0aGF0IHBlcmZvcm1zIHRoaXMgcHJvY2VzcyBhbmQgYSBjbGllbnQgKGUuZy4gZm9yIGFuIElHUyBlbmdhZ2VtZW50KS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUHJvY2Vzc0Rlc2NyaXB0aW9uIiBlU3VwZXJUeXBlcz0iIy8vQWN0aXZpdHlEZXNjcmlwdGlvbiI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InNjb3BlIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJEZWZpbmVzIHRoZSBzY29wZSBvZiB0aGUgUHJvY2VzcywgaS5lLiB3aGljaCB0eXBlcyBvZiBwcm9qZWN0cyBkb2VzIGl0IGFkZHJlc3MgYW5kIHdoaWNoIG5vdC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idXNhZ2VOb3RlcyIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQW55IGFkZGl0aW9uYWwgbm90ZXMgb24gaG93IHRvIGFwcGx5IGFuZCBpbnN0YW50aWF0ZSB0aGlzIHByb2Nlc3MgZm9yIGEgcHJvamVjdC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRGVzY3JpcHRvckRlc2NyaXB0aW9uIiBlU3VwZXJUeXBlcz0iIy8vQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmVmaW5lZERlc2NyaXB0aW9uIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIERlc2NyaXB0b3IgbWlnaHQgYWRkIHJlZmluZW1lbnRzIHRvIHRoZSBtYWluIGRlc2NyaXB0aW9uIG9mIHRoZSBDb250ZW50IEVsZW1lbnQgaXQgcmVmZXJzIHRvLiAgRm9yIGV4YW1wbGUsIGl0IGNvdWxkIHByb3ZpZGUgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCBhIFdvcmsgUHJvZHVjdCByZWxldmFudCBmb3IgdGhlIHNwZWNpZmljIHBvaW50IGluIHRpbWUgaW4gdGhlIHByb2Nlc3MgdGhpcyBXb3JrIFByb2R1Y3QgdHlwZSBpcyBiZWluZyB1c2VkLiAgSXQgY291bGQgZGVzY3JpYmUgYWRkaXRpb25hbCBza2lsbHMgbmVlZGVkIGZvciBhIFJvbGUgYXQgdGhhdCBwYXJ0aWN1bGFyIHBvaW50IGluIHRpbWUgaW4gYSBwcm9jZXNzLCBldGMuICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJDb25jZXB0IiBlU3VwZXJUeXBlcz0iIy8vR3VpZGFuY2UiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgQ29uY2VwdCBpcyBhIHNwZWNpZmljIHR5cGUgb2YgZ3VpZGFuY2UgdGhhdCBvdXRsaW5lcyBrZXkgaWRlYXMgYXNzb2NpYXRlZCB3aXRoIGJhc2ljIHByaW5jaXBsZXMgdW5kZXJseWluZyB0aGUgcmVmZXJlbmNlZCBpdGVtLiBDb25jZXB0cyBub3JtYWxseSBhZGRyZXNzIG1vcmUgZ2VuZXJhbCB0b3BpY3MgdGhhbiBHdWlkZWxpbmVzIGFuZCBzcGFuIGFjcm9zcyBzZXYtZXJhbCB3b3JrIHByb2R1Y3QgYW5kL29yIHRhc2tzL2FjdGl2aXRpZXMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkNoZWNrbGlzdCIgZVN1cGVyVHlwZXM9IiMvL0d1aWRhbmNlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIENoZWNrbGlzdCBpcyBhIHNwZWNpZmljIHR5cGUgb2YgZ3VpZGFuY2UgdGhhdCBpZGVudGlmaWVzIGEgc2VyaWVzIG9mIGl0ZW1zIHRoYXQgbmVlZCB0byBiZSBjb21wbGV0ZWQgb3IgdmVyaS1maWVkLiAgQ2hlY2tsaXN0cyBhcmUgb2Z0ZW4gdXNlZCBpbiByZXZpZXdzIHN1Y2ggYXMgd2Fsa3Rocm91Z2hzIG9yIGluc3BlY3Rpb25zLiAiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRXhhbXBsZSIgZVN1cGVyVHlwZXM9IiMvL0d1aWRhbmNlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBbiBFeGFtcGxlIGlzIGEgc3BlY2lmaWMgdHlwZSBvZiBHdWlkYW5jZSB0aGF0IHJlcHJlc2VudHMgYSB0eXBpY2FsLCBwYXJ0aWFsbHkgY29tcGxldGVkLCBzYW1wbGUgaW5zdGFuY2Ugb2Ygb25lIG9yIG1vcmUgd29yayBwcm9kdWN0cyBvciBzY2VuYXJpbyBsaWtlIGRlc2NyaXB0aW9ucyBvZiBob3cgVGFzayBtYXkgYmUgcGVyZm9ybWVkLiBFeGFtcGxlcyBjYW4gYmUgcmVsYXRlZCB0byBXb3JrIFByb2R1Y3RzIGFzIHdlbGwgYXMgVGFza3MgdGhhdCBwcm9kdWNlIHRoZW0gYXMgd2VsbCBhcyBhbnkgb3RoZXIgQ29udGVudCBFbGVtZW50LiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJHdWlkZWxpbmUiIGVTdXBlclR5cGVzPSIjLy9HdWlkYW5jZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBHdWlkZWxpbmUgaXMgYSBzcGVjaWZpYyB0eXBlIG9mIGd1aWRhbmNlIHRoYXQgcHJvdmlkZXMgYWRkaXRpb25hbCBkZXRhaWwgb24gaG93IHRvIHBlcmZvcm0gYSBwYXJ0aWN1bGFyIHRhc2sgb3IgZ3JvdXBpbmcgb2YgdGFza3MgKGUuZy4gZ3JvdXBlZCB0b2dldGhlciBhcyBhY3Rpdml0aWVzKSBvciB0aGF0IHByb3ZpZGVzIGFkZGl0aW9uYWwgZGV0YWlsLCBydWxlcywgYW5kIHJlY29tbWVuZGF0aW9ucyBvbiB3b3JrIHByb2R1Y3RzIGFuZCB0aGVpciBwcm9wZXJ0aWVzLiAgQW1vbmdzdCBvdGhlcnMsIGl0IGNhbiBpbmNsdWRlIGRldGFpbHMgYWJvdXQgYmVzdCBwcmFjdGljZXMgYW5kIGRpZmZlcmVudCBhcHByb2FjaGVzIGZvciBkb2luZyB3b3JrLCBob3cgdG8gdXNlIHBhcnRpY3VsYXIgdHlwZXMgb2Ygd29yayBwcm9kdWN0cywgaW5mb3JtYXRpb24gb24gZGlmZmVyZW50IHN1YnR5cGVzIGFuZCB2YXJpYW50cyBvZiB0aGUgd29yayBwcm9kdWN0IGFuZCBob3cgdGhleSBldm9sdmUgdGhyb3VnaG91dCBhIGxpZmVjeWNsZSwgZGlzY3Vzc2lvbnMgb24gc2tpbGxzIHRoZSBwZXJmb3JtaW5nIHJvbGVzIHNob3VsZCBhY3F1aXJlIG9yIGltcHJvdmUgdXBvbiwgbWVhc3VyZW1lbnRzIGZvciBwcm9ncmVzcyBhbmQgbWF0dXJpdHksIGV0Yy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUmVwb3J0IiBlU3VwZXJUeXBlcz0iIy8vR3VpZGFuY2UiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgUmVwb3J0IGlzIGEgcHJlZGVmaW5lZCB0ZW1wbGF0ZSBvZiBhIHJlc3VsdCB0aGF0IGlzIGdlbmVyYXRlZCBvbiB0aGUgYmFzaXMgb2Ygb3RoZXIgd29yayBwcm9kdWN0cyBhcyBhbiBvdXRwdXQgZnJvbSBzb21lIGZvcm0gb2YgdG9vbCBhdXRvbWF0aW9uLiBBbiBleGFtcGxlIGZvciBhIHJlcG9ydCB3b3VsZCBiZSBhIHVzZSBjYXNlIG1vZGVsIHN1cnZleSwgd2hpY2ggaXMgZ2VuZXJhdGVkIGJ5IGV4dHJhY3RpbmcgZGlhZ3JhbSBpbmZvcm1hdGlvbiBmcm9tIGEgZ3JhcGhpY2FsIG1vZGVsIGFuZCB0ZXh0dWFsIGluZm9ybWF0aW9uIGZyb20gZG9jdW1lbnRzIGFuZCBjb21iaW5lcyB0aGVzZSB0d28gdHlwZXMgb2YgaW5mb3JtYXRpb24gaW50byBhIHJlcG9ydC4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iVGVtcGxhdGUiIGVTdXBlclR5cGVzPSIjLy9HdWlkYW5jZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBUZW1wbGF0ZSBpcyBhIHNwZWNpZmljIHR5cGUgb2YgZ3VpZGFuY2UgdGhhdCBwcm92aWRlcyBmb3IgYSB3b3JrIHByb2R1Y3QgYSBwcmUtZGVmaW5lZCB0YWJsZSBvZiBjb250ZW50cywgc2VjdGlvbnMsIHBhY2thZ2VzLCBhbmQvb3IgaGVhZGluZ3MsIGEgc3RhbmRhcmRpemVkIGZvcm1hdCwgYXMgd2VsbCBhcyBkZXNjcmlwdGlvbnMgaG93IHRoZSBzZWN0aW9ucyBhbmQgcGFja2FnZXMgYXJlIHN1cHBvc2VkIHRvIGJlIHVzZWQgYW5kIGNvbXBsZXRlZC4gVGVtcGxhdGVzIGNhbm5vdCBvbmx5IGJlIHByb3ZpZGVkIGZvciBkb2N1bWVudHMsIGJ1dCBhbHNvIGZvciBjb25jZXB0dWFsIG1vZGVscyBvciBwaHlzaWNhbCBkYXRhIHN0b3Jlcy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iU3VwcG9ydGluZ01hdGVyaWFsIiBlU3VwZXJUeXBlcz0iIy8vR3VpZGFuY2UiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlN1cHBvcnRpbmcgTWF0ZXJpYWxzIGlzIGNhdGNoYWxsIGZvciBvdGhlciB0eXBlcyBvZiBndWlkYW5jZSBub3Qgc3BlY2lmaWNhbGx5IGRlZmluZWQgZWxzZXdoZXJlLiBJdCBjYW4gYmUgcmVsYXRlZCB0byBhbGwga2luZHMgb2YgQ29udGVudCBFbGVtZW50cywgaS5lLiBpbmNsdWRpbmcgb3RoZXIgZ3VpZGFuY2UgZWxlbWVudHMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlRvb2xNZW50b3IiIGVTdXBlclR5cGVzPSIjLy9HdWlkYW5jZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBUb29sIE1lbnRvciBpcyBhIHNwZWNpZmljIHR5cGUgb2YgZ3VpZGFuY2UgdGhhdCBzaG93cyBob3cgdG8gdXNlIGEgc3BlY2lmaWMgdG9vbCB0byBhY2NvbXBsaXNoIHNvbWUgcGllY2Ugb2Ygd29yayBhIFdvcmsgUHJvZHVjdCBlaXRoZXIgaW4gdGhlIGNvbnRleHQgb2Ygb3IgaW5kZXBlbmRlbnQgZnJvbSBhIFRhc2sgb3IgQWN0aXZpdHkuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IldoaXRlcGFwZXIiIGVTdXBlclR5cGVzPSIjLy9Db25jZXB0Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXaGl0ZXBhcGVycyBhcmUgYSBzcGVjaWFsIENvbmNlcHQgZ3VpZGFuY2UgdGhhdCBoYXZlIGJlZW4gZXh0ZXJuYWxseSByZXZpZXdlZCBvciBwdWJsaXNoZWQgYW5kIGNhbiBiZSByZWFkIGFuZCB1bmRlcnN0b29kIGluIGlzb2xhdGlvbiBvZiBvdGhlciBjb250ZW50IGVsZW1lbnRzIGFuZCBndWlkYW5jZS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iVGVybURlZmluaXRpb24iIGVTdXBlclR5cGVzPSIjLy9HdWlkYW5jZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGVybURlZmluaXRpb25zIGRlZmluZSBjb25jZXB0cyBhbmQgYXJlIHVzZWQgdG8gYnVpbGQgdXAgdGhlIEdsb3NzYXJ5LiBUaGV5IGFyZSBub3QgZGlyZWN0bHkgcmVsYXRlZCB0byBDb250ZW50RWxlbWVudHMsIGJ1dCB0aGVpciByZWxhdGlvbnNoaXAgaXMgYmVpbmcgZGVyaXZlZCB3aGVuIHRoZSBUZXJtIGlzIHVzZWQgaW4gdGhlIENvbnRlbnRFbGVtZW50cyBkZXNjcmlwdGlvbiB0ZXh0LiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQcmFjdGljZSIgZVN1cGVyVHlwZXM9IiMvL0d1aWRhbmNlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIFByYWN0aWNlIHJlcHJlc2VudHMgYSBwcm92ZW4gd2F5IG9yIHN0cmF0ZWd5IG9mIGRvaW5nIHdvcmsgdG8gYWNoaWV2ZSBhIGdvYWwgdGhhdCBoYXMgYSBwb3NpdGl2ZSBpbXBhY3Qgb24gd29yayBwcm9kdWN0IG9yIHByb2Nlc3MgcXVhbGl0eS4gIFByYWN0aWNlcyBhcmUgZGVmaW5lZCBvcnRob2dvbmFsIHRvIG1ldGhvZHMgYW5kIHByb2Nlc3Nlcy4gIFRoZXkgY291bGQgc3VtbWFyaXplIGFzcGVjdHMgdGhhdCBpbXBhY3QgbWFueSBkaWZmZXJlbnQgcGFydHMgb2YgYSBtZXRob2Qgb3Igc3BlY2lmaWMgcHJvY2Vzc2VzLiAgRXhhbXBsZXMgZm9yIHByYWN0aWNlcyB3b3VsZCBiZSAmcXVvdDtNYW5hZ2UgUmlza3MmcXVvdDssICZxdW90O0NvbnRpbnVvdXNseSB2ZXJpZnkgcXVhbGl0eSZxdW90OywgJnF1b3Q7QXJjaGl0ZWN0dXJlLWNlbnRyaWMgYW5kIGNvbXBvbmVudC1iYXNlZCBkZXZlbG9wbWVudCZxdW90OywgZXRjLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJzdWJQcmFjdGljZXMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1ByYWN0aWNlIiBjb250YWlubWVudD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJjb250ZW50UmVmZXJlbmNlcyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vQ29udGVudEVsZW1lbnQiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iYWN0aXZpdHlSZWZlcmVuY2VzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9BY3Rpdml0eSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMiIGVTdXBlclR5cGVzPSIjLy9HdWlkYW5jZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRXN0aW1hdGlvbiBDb25zaWRlcmF0aW9ucyBxdWFsaWZ5IHRoZSB1c2FnZSBhbmQgYXBwbGljYXRpb24gb2YgZXN0aW1hdGlvbiBtZXRyaWNzIGluIHRoZSBkZXZlbG9wbWVudCBvZiBhbiBhY3R1YWwgZXN0aW1hdGUuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlJldXNhYmxlQXNzZXQiIGVTdXBlclR5cGVzPSIjLy9HdWlkYW5jZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBSZXVzYWJsZSBBc3NldCBwcm92aWRlcyBhIHNvbHV0aW9uIHRvIGEgcHJvYmxlbSBmb3IgYSBnaXZlbiBjb250ZXh0LiBUaGUgYXNzZXQgbWF5IGhhdmUgYSB2YXJpYWJpbGl0eSBwb2ludCwgd2hpY2ggaXMgYSBsb2NhdGlvbiBpbiB0aGUgYXNzZXQgdGhhdCBtYXkgaGF2ZSBhIHZhbHVlIHByb3ZpZGVkIG9yIGN1c3RvbWl6ZWQgYnkgdGhlIGFzc2V0IGNvbnN1bWVyLiBUaGUgYXNzZXQgaGFzIHJ1bGVzIGZvciB1c2FnZSB3aGljaCBhcmUgdGhlIGluc3RydWN0aW9ucyBkZXNjcmliaW5nJiN4RDsmI3hBO2hvdyB0aGUgYXNzZXQgc2hvdWxkIGJlIHVzZWQuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlN0YXRlIiBlU3VwZXJUeXBlcz0iIy8vVmVydGV4Ij4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iV29ya1Byb2R1Y3QiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICBsb3dlckJvdW5kPSIxIiB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1dvcmtQcm9kdWN0Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9IlJlZ2lvbiIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vUmVnaW9uIiBjb250YWlubWVudD0idHJ1ZSIgZU9wcG9zaXRlPSIjLy9SZWdpb24vU3RhdGUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ic3VibWFjaGluZSIgZVR5cGU9IiMvL1N0YXRlTWFjaGluZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJWZXJ0ZXgiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJjb250YWluZXIiIGVUeXBlPSIjLy9SZWdpb24iCi0gICAgICAgIHRyYW5zaWVudD0idHJ1ZSIgZU9wcG9zaXRlPSIjLy9SZWdpb24vVmVydGV4Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im91dGdvaW5nIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9UcmFuc2l0aW9uIiBlT3Bwb3NpdGU9IiMvL1RyYW5zaXRpb24vc291cmNlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImluY29taW5nIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9UcmFuc2l0aW9uIiBlT3Bwb3NpdGU9IiMvL1RyYW5zaXRpb24vdGFyZ2V0Ii8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlJlZ2lvbiI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9IlZlcnRleCIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vVmVydGV4IiBjb250YWlubWVudD0idHJ1ZSIgZU9wcG9zaXRlPSIjLy9WZXJ0ZXgvY29udGFpbmVyIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9IlRyYW5zaXRpb24iIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1RyYW5zaXRpb24iIGNvbnRhaW5tZW50PSJ0cnVlIiBlT3Bwb3NpdGU9IiMvL1RyYW5zaXRpb24vY29udGFpbmVyIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9IlN0YXRlIiBlVHlwZT0iIy8vU3RhdGUiCi0gICAgICAgIHRyYW5zaWVudD0idHJ1ZSIgZU9wcG9zaXRlPSIjLy9TdGF0ZS9SZWdpb24iLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iU3RhdGVNYWNoaW5lIiBlVHlwZT0iIy8vU3RhdGVNYWNoaW5lIgotICAgICAgICB0cmFuc2llbnQ9InRydWUiIGVPcHBvc2l0ZT0iIy8vU3RhdGVNYWNoaW5lL1JlZ2lvbiIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJTdGF0ZU1hY2hpbmUiIGVTdXBlclR5cGVzPSIjLy9Xb3JrRGVmaW5pdGlvbiI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9IlJlZ2lvbiIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIGxvd2VyQm91bmQ9IjEiIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vUmVnaW9uIiBjb250YWlubWVudD0idHJ1ZSIgZU9wcG9zaXRlPSIjLy9SZWdpb24vU3RhdGVNYWNoaW5lIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlRyYW5zaXRpb24iPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJXb3JrRGVmaW5pdGlvbiIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIGxvd2VyQm91bmQ9IjEiIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vV29ya0RlZmluaXRpb24iLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iY29udGFpbmVyIiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iIy8vUmVnaW9uIiB0cmFuc2llbnQ9InRydWUiIGVPcHBvc2l0ZT0iIy8vUmVnaW9uL1RyYW5zaXRpb24iLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ic291cmNlIiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iIy8vVmVydGV4IiBlT3Bwb3NpdGU9IiMvL1ZlcnRleC9vdXRnb2luZyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ0YXJnZXQiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSIjLy9WZXJ0ZXgiIGVPcHBvc2l0ZT0iIy8vVmVydGV4L2luY29taW5nIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlBzZXVkb1N0YXRlIiBlU3VwZXJUeXBlcz0iIy8vVmVydGV4Ii8+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVFbnVtIiBuYW1lPSJQc2V1ZG9TdGF0ZUtpbmQiPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iaW5pdGlhbCIvPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iam9pbiIgdmFsdWU9IjEiLz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9ImZvcmsiIHZhbHVlPSIyIi8+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJqdW5jdGlvbiIgdmFsdWU9IjMiLz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9ImNob2ljZSIgdmFsdWU9IjQiLz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9ImVudHJ5UG9pbnQiIHZhbHVlPSI1Ii8+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJleGl0UG9pbnQiIHZhbHVlPSI2Ii8+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJ0ZXJtaW5hdGUiIHZhbHVlPSI3Ii8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkRpc2NpcGxpbmUiIGVTdXBlclR5cGVzPSIjLy9Db250ZW50Q2F0ZWdvcnkiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgRGlzY2lwbGluZSBpcyBhIGNhdGVnb3JpemF0aW9uIG9mIHdvcmsgKGkuZS4gVGFza3MgZm9yIE1ldGhvZCBDb250ZW50KSwgYmFzZWQgdXBvbiBzaW1pbGFyaXR5IG9mIGNvbmNlcm5zIGFuZCBjb29wZXJhdGlvbiBvZiB3b3JrIGVmZm9ydC4mI3hEOyYjeEE7QSBkaXNjaXBsaW5lIGlzIGEgY29sbGVjdGlvbiBvZiBUYXNrcyB0aGF0IGFyZSByZWxhdGVkIHRvIGEgbWFqb3IgJ2FyZWEgb2YgY29uY2Vybicgd2l0aGluIHRoZSBvdmVyYWxsIHByb2plY3QuIFRoZSBncm91cGluZyBvZiBUYXNrcyBpbnRvIGRpc2NpcGxpbmVzIGlzIG1haW5seSBhbiBhaWQgdG8gdW5kZXJzdGFuZGluZyB0aGUgcHJvamVjdCBmcm9tIGEgJ3RyYWRpdGlvbmFsJyB3YXRlcmZhbGwgcGVyc3BlY3RpdmUuIEhvd2V2ZXIsIHR5cGljYWxseSwgZm9yIGV4YW1wbGUsIGl0IGlzIG1vcmUgY29tbW9uIHRvIHBlcmZvcm0gY2VydGFpbiByZXF1aXJlbWVudHMgYWN0aXZpdGllcyBpbiBjbG9zZSBjb29yZGluYXRpb24gd2l0aCBhbmFseXNpcyBhbmQgZGVzaWduIGFjdGl2aXRpZXMuIFNlcGFyYXRpbmcgdGhlc2UgYWN0aXZpdGllcyBpbnRvIHNlcGFyYXRlIGRpc2NpcGxpbmVzIG1ha2VzIHRoZSBhY3Rpdml0aWVzIGVhc2llciB0byBjb21wcmVoZW5kLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ0YXNrcyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vVGFzayIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJzdWJkaXNjaXBsaW5lIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9EaXNjaXBsaW5lIiBjb250YWlubWVudD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJyZWZlcmVuY2VXb3JrZmxvd3MiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0FjdGl2aXR5Ii8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkNvbnRlbnRDYXRlZ29yeSIgYWJzdHJhY3Q9InRydWUiIGVTdXBlclR5cGVzPSIjLy9Db250ZW50RWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQ29udGVudCBDYXRlZ29yeSBpcyBhbiBhYnN0cmFjdCBjbGFzcyBnZW5lcmFsaXppbmcgY29udGVudCBjYXRlZ29yeSB0eXBlcy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUm9sZVNldCIgZVN1cGVyVHlwZXM9IiMvL0NvbnRlbnRDYXRlZ29yeSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBSb2xlIFNldCBvcmdhbml6ZXMgUm9sZXMgaW50byBjYXRlZ29yaWVzLiAgSXQgaXMgdXNlZCB0byBncm91cCByb2xlcyB0b2dldGhlciB0aGF0IGhhdmUgY2VydGFpbiBjb21tb25hbGl0aWVzLiAgRm9yIGV4YW1wbGUsIHRoZSAmcXVvdDtBbmFseXN0cyZxdW90OyBSb2xlIFNldCBjb3VsZCBncm91cCB0aGUgJnF1b3Q7QnVzaW5lc3MgUHJvY2VzcyBBbmFseXN0JnF1b3Q7LCAmcXVvdDtTeXN0ZW0gQW5hbHlzdCZxdW90OywgYXMgd2VsbCBhcyAmcXVvdDtSZXF1aXJlbWVudHMgU3BlY2lmaWVyJnF1b3Q7IHJvbGVzLiAgQWxsIG9mIHRoZXNlIHdvcmsgd2l0aCBzaW1pbGFyIHRlY2huaXF1ZXMgYW5kIGhhdmUgb3ZlcmxhcHBpbmcgc2tpbGxzLCBidXQgYXJlIHJlcXVpcmVkIGFzIGRpc3RpbmN0IHJvbGVzIGZvciBhIG1ldGhvZCAoZS5nLiB0aGUgbWV0aG9kIHRoZSBJQk0gUmF0aW9uYWwgVW5pZmllZCBQcm9jZXNzIGlzIGJhc2VkIG9uKS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icm9sZXMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1JvbGUiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRG9tYWluIiBlU3VwZXJUeXBlcz0iIy8vQ29udGVudENhdGVnb3J5Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJEb21haW4gaXMgYSByZWZpbmVhYmxlIGhpZXJhcmNoeSBncm91cGluZyByZWxhdGVkIHdvcmsgcHJvZHVjdHMuICBJbiBvdGhlciB3b3JkcywgRG9tYWlucyBjYW4gYmUgZnVydGhlciBkaXZpZGVkIGludG8gc3ViLWRvbWFpbnMsIHdpdGggd29yayBwcm9kdWN0IGVsZW1lbnRzIHRvIGJlIGNhdGVnb3JpemVkIG9ubHkgYXQgdGhlIGxlYWYtbGV2ZWwgb2YgdGhpcyBoaWVyYXJjaHkuJiN4RDsmI3hBO0RvbWFpbiBpcyBhIGxvZ2ljYWwgZ3JvdXBpbmcgb2Ygd29yayBwcm9kdWN0cyB0aGF0IGhhdmUgYW4gYWZmaW5pdHkgdG8gZWFjaCBvdGhlciBiYXNlZCBvbiByZXNvdXJjZXMsIHRpbWluZywgb3IgcmVsYXRpb25zaGlwLiAgQSBEb21haW4gbWF5IGJlIGRpdmlkZWQgaW50byBzdWJkb21haW5zLiAgRm9yIGV4YW1wbGUsIEdTIE1ldGhvZCB1c2VzIHNpeCBwcmVkZWZpbmVkIERvbWFpbnMgZm9yIFdvcmsgUHJvZHVjdHM6IEFwcGxpY2F0aW9uLCBBcmNoaXRlY3R1cmUsIEJ1c2luZXNzLCBFbmdhZ2VtZW50LCBPcGVyYXRpb25zIGFuZCBPcmdhbml6YXRpb24uIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9IndvcmtQcm9kdWN0cyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vV29ya1Byb2R1Y3QiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ic3ViZG9tYWlucyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vRG9tYWluIiBjb250YWlubWVudD0idHJ1ZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJXb3JrUHJvZHVjdFR5cGUiIGVTdXBlclR5cGVzPSIjLy9Db250ZW50Q2F0ZWdvcnkiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldvcmsgUHJvZHVjdCBUeXBlIGlzIGEgc2Vjb25kIGNhdGVnb3J5IGZvciB3b3JrIHByb2R1Y3RzLCB3aGljaCBpbiBjb250cmFzdCB0byBEb21haW4gaXMgbW9yZSBwcmVzZW50YXRpb24gb3JpZW50ZWQuICBBIHdvcmsgcHJvZHVjdCBjYW4gaGF2ZSBtYW55IFdvcmsgUHJvZHVjdCBUeXBlcy4gIEV4YW1wbGVzLCBmb3IgYSBXb3JrIFByb2R1Y3QgVHlwZSBpcyAmcXVvdDtDbGFzcyBEaWFncmFtJnF1b3Q7LCB3aGljaCBjYXRlZ29yaXplcyB0aGUgQXJ0aWZhY3RzIEFuYWx5c2lzIE1vZGVsLCBEZXNpZ24gTW9kZWwsIFVzZXIgRXhwZXJpZW5jZSBNb2RlbCwgb3IgJnF1b3Q7U3BlY2lmaWNhdGlvbiZxdW90Oywgd2hpY2ggY2F0ZWdvcml6ZXMgcmVxdWlyZW1lbnRzIHNwZWNpZmljYXRpb25zIHRoYXQgZGVmaW5lIGEgc3lzdGVtIHdpdGggYSB3ZWxsLWRlZmluZWQgc3lzdGVtIGJvdW5kYXJ5LCBzdWNoIGFzIHVzZSBjYXNlIG9yIGZ1bmN0aW9uYWwgcmVxdWlyZW1lbnRzIHNwZWNpZmljYXRpb24uICBBIFdvcmsgUHJvZHVjdCBjYW4gYmUgY2F0ZWdvcml6ZWQgdG8gYmUgb2YgbWFueSBXb3JrIFByb2R1Y3QgVHlwZXMuICBGb3IgZXhhbXBsZSwgYSB1c2UgY2FzZSBtb2RlbCBjYW4gYmUgY2F0ZWdvcml6ZWQgYXMgYSBTcGVjaWZpY2F0aW9uIGFzIHdlbGwgYXMgRGlhZ3JhbSBXb3JrIFByb2R1Y3QgVHlwZS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0id29ya1Byb2R1Y3RzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Xb3JrUHJvZHVjdCIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJEaXNjaXBsaW5lR3JvdXBpbmciIGVTdXBlclR5cGVzPSIjLy9Db250ZW50Q2F0ZWdvcnkiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkRpc2NpcGxpbmUgR3JvdXBpbmdzIGFyZSB1c2VkIHRvIGdyb3VwIERpc2NpcGxpbmVzLiAgRm9yIGV4YW1wbGUsIHRoZSBEaXNjaXBsaW5lIEdyb3VwaW5nICZxdW90O1NvZnR3YXJlIERpc2NpcGxpbmVzJnF1b3Q7IHdvdWxkIGJlIHRoZSBncm91cCBvZiBhbGwgZGlzY2lwbGluZXMgcmVsYXRlZCB0byBkZXZlbG9waW5nIHNvZnR3YXJlIHN1Y2ggYXMgJnF1b3Q7UmVxdWlyZW1lbnRzIE1hbmFnZW1lbnQmcXVvdDsgb3IgJnF1b3Q7VGVzdGluZyZxdW90OzsgJnF1b3Q7SVQgSW5mcmFzdHJ1Y3R1cmUgTWFuYWdlbWVudCZxdW90OyB3b3VsZCBiZSBhIERpc2NpcGxpbmVzIEdyb3VwaW5nIGZvciBkaXNjaXBsaW5lcyBzdWNoIGFzICZxdW90O0lUIE9wZXJhdGlvbmFsIFNlcnZpY2VzJnF1b3Q7LCAmcXVvdDtJVCBDdXN0b21lciBSZWxhdGlvbnNoaXBzJnF1b3Q7LCBvciAmcXVvdDtJVCBFbmFibGluZyBTZXJ2aWNlcyZxdW90Oy4gIERpc2NpcGxpbmVzIGNhbiBiZSBhc3NvY2lhdGVkIHRvIG1vcmUgdGhhbiBvbmUgRGlzY2lwbGluZSBHcm91cGluZy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZGlzY2lwbGluZXMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0Rpc2NpcGxpbmUiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iVG9vbCIgZVN1cGVyVHlwZXM9IiMvL0NvbnRlbnRDYXRlZ29yeSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBUb29sIGlzIGEgY29udGFpbmVyL2FnZ3JlZ2F0ZSBmb3IgVG9vbE1lbnRvcnMuICBJdCBjYW4gYWxzbyBwcm92aWRlIGdlbmVyYWwgZGVzY3JpcHRpb25zIG9mIHRoZSB0b29sIGFuZCBpdHMgZ2VuZXJhbCBjYXBhYmlsaXRpZXMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InRvb2xNZW50b3JzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Ub29sTWVudG9yIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlJvbGVTZXRHcm91cGluZyIgZVN1cGVyVHlwZXM9IiMvL0NvbnRlbnRDYXRlZ29yeSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iUm9sZSBTZXRzIGNhbiBiZSBjYXRlZ29yaXplZCBpbnRvIFJvbGUgU2V0IEdyb3VwaW5ncy4gIEZvciBleGFtcGxlLCBkaWZmZXJlbnQgbWV0aG9kcyBtaWdodCBkZWZpbmUgc2ltaWxhciBSb2xlIFNldHMsIHdoaWNoIGhvd2V2ZXIgbmVlZCB0byBiZSBkaXN0aW5ndWlzaGVkIGZyb20gZWFjaCBvdGhlciBvbiBhIGdsb2JhbCBzY2FsZS4gIFRodXMsIFJvbGUgU2V0IEdyb3VwaW5ncyBhbGxvdyBkaXN0aW5ndWlzaGluZywgZm9yIGV4YW1wbGUsIFNvZnR3YXJlIFNlcnZpY2VzIE1hbmFnZXIgUm9sZSBTZXRzIGZyb20gU29mdHdhcmUgRGV2ZWxvcG1lbnQgT3JnYW5pemF0aW9uIE1hbmFnZXIgUm9sZSBTZXRzLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJyb2xlU2V0cyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vUm9sZVNldCIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJDdXN0b21DYXRlZ29yeSIgZVN1cGVyVHlwZXM9IiMvL0NvbnRlbnRDYXRlZ29yeSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBDdXN0b20gQ2F0ZWdvcnkgaXMgYSBjYXRlZ29yeSBpbnRyb2R1Y2VkIGJ5IGEgbWV0aG9kIGNvbnRlbnQgYXV0aG9yIHRvIHN0cnVjdHVyZSBhbnkgbnVtYmVyIG9mIG1ldGhvZCBDb250ZW50IEVsZW1lbnRzIG9mIGFueSBzdWJ0eXBlIGJhc2VkIG9uIHVzZXItZGVmaW5lZCBjcml0ZXJpYS4gIEJlY2F1c2UgQ29udGVudCBDYXRlZ29yaWVzIChhbmQgdGhlcmVmb3JlIEN1c3RvbSBDYXRlZ29yaWVzLCB0b28pIGFyZSBDb250ZW50IEVsZW1lbnRzIHRoZW1zZWx2ZXMsIEN1c3RvbSBDYXRlZ29yaWVzIGNhbiBiZSB1c2VkIHRvIHJlY3Vyc2l2ZWx5IGNhdGVnb3JpemUgQ29udGVudCBDYXRlZ29yaWVzIGFzIHdlbGwuICBDdXN0b20gQ2F0ZWdvcmllcyBjYW4gYWxzbyBiZSBuZXN0ZWQgd2l0aCBhbnkgQ29udGVudCBDYXRlZ29yeS4gIEN1c3RvbSBjYXRlZ29yaWVzIGNhbiBiZSB1c2VkIHRvIGNhdGVnb3JpemUgY29udGVudCBiYXNlZCBvbiB0aGUgdXNlcidzIGNyaXRlcmlhIGFzIHdlbGwgYXMgdG8gZGVmaW5lIHdob2xlIHRyZWUtc3RydWN0dXJlcyBvZiBuZXN0ZWQgY2F0ZWdvcmllcyBhbGxvd2luZyB0aGUgdXNlciB0byBzeXN0ZW1hdGljYWxseSBuYXZpZ2F0ZSBhbmQgYnJvd3NlIG1ldGhvZCBjb250ZW50IGFuZCBwcm9jZXNzZXMgYmFzZWQgb24gdGhlc2UgY2F0ZWdvcmllcy4gIEZvciBleGFtcGxlLCBvbmUgY291bGQgY3JlYXRlIGEgY3VzdG9tIGNhdGVnb3J5IHRvIGxvZ2ljYWxseSBvcmdhbml6ZSBjb250ZW50IHJlbGV2YW50IGZvciB0aGUgdXNlcidzIGRldmVsb3BtZW50IG9yZ2FuaXphdGlvbiBkZXBhcnRtZW50czsgZS5nLiBhICZxdW90O1Rlc3RpbmcmcXVvdDsgY2F0ZWdvcnkgdGhhdCBncm91cHMgdG9nZXRoZXIgYWxsIHJvbGVzLCB3b3JrIHByb2R1Y3RzLCB0YXNrcywgYW5kIGd1aWRhbmNlIGVsZW1lbnQgcmVsZXZhbnQgdG8gdGVzdGluZy4gIEFub3RoZXIgZXhhbXBsZSB3b3VsZCBiZSBjYXRlZ29yaWVzIHRoYXQgZXhwcmVzcyBsaWNlbnNpbmcgbGV2ZWxzIG9mIHRoZSBjb250ZW50IGdyb3VwaW5nIGZyZWVseSBkaXN0cmlidXRhYmxlIG1ldGhvZCBjb250ZW50IHZlcnN1cyBjb250ZW50IHRoYXQgcmVwcmVzZW50IGludGVsbGVjdHVhbCBwcm9wZXJ0eSBhbmQgcmVxdWlyZXMgYSBsaWNlbnNlIHRvIGJlIHB1cmNoYXNlZCB0byBiZSBhYmxlIHRvIHVzZSBpdC4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iY2F0ZWdvcml6ZWRFbGVtZW50cyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vRGVzY3JpYmFibGVFbGVtZW50Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InN1YkNhdGVnb3JpZXMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0NvbnRlbnRDYXRlZ29yeSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJEZWxpdmVyeVByb2Nlc3MiIGVTdXBlclR5cGVzPSIjLy9Qcm9jZXNzIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIERlbGl2ZXJ5IFByb2Nlc3NlcyBpcyBhIHNwZWNpYWwgUHJvY2VzcyBkZXNjcmliaW5nIGEgY29tcGxldGUgYW5kIGludGVncmF0ZWQgYXBwcm9hY2ggZm9yIHBlcmZvcm1pbmcgYSBzcGVjaWZpYyBwcm9qZWN0IHR5cGUuICBJdCBkZXNjcmliZXMgYSBjb21wbGV0ZSBwcm9qZWN0IGxpZmVjeWNsZSBlbmQtdG8tZW5kIGFuZCBzaGFsbCBiZSB1c2VkIGFzIGEgcmVmZXJlbmNlIGZvciBydW5uaW5nIHByb2plY3RzIHdpdGggc2ltaWxhciBjaGFyYWN0ZXJpc3RpY3MgYXMgZGVmaW5lZCBmb3IgdGhlIHByb2Nlc3MuICBBIERlbGl2ZXJ5IFByb2Nlc3MgaXMgcmVsYXRlZCB0byBzcGVjaWZpYyBzdXBwb3J0aW5nIGluZm9ybWF0aW9uIHN1Y2ggYXMgUm9hZG1hcHMgKGluaGVyaXRlZCB2aWEgQWN0aXZpdHkpIGFzIHdlbGwgYXMgQ29tbXVuaWNhdGlvbnMgYW5kIEVkdWNhdGlvbiBNYXRlcmlhbC4mI3hEOyYjeEE7QSBEZWxpdmVyeSBQcm9jZXNzIGlzIGEgUHJvY2VzcyB0aGF0IGNvdmVycyBhIHdob2xlIGRldmVsb3BtZW50IGxpZmVjeWNsZSBmcm9tIGJlZ2lubmluZyB0byBlbmQuICBBIERlbGl2ZXJ5IFByb2Nlc3Mgc2hhbGwgYmUgdXNlZCBhcyBhIHRlbXBsYXRlIGZvciBwbGFubmluZyBhbmQgcnVubmluZyBhIHByb2plY3QuICBJdCBwcm92aWRlcyBhIGNvbXBsZXRlIGxpZmVjeWNsZSBtb2RlbCB3aXRoIHByZWRlZmluZWQgcGhhc2VzLCBpdGVyYXRpb25zLCBhbmQgYWN0aXZpdGllcyB0aGF0IGhhdmUgYmVlbiBkZXRhaWxlZCBieSBzZXF1ZW5jaW5nIHJlZmVyZW5jaW5nIG1ldGhvZCBjb250ZW50IGluIGJyZWFrZG93biBzdHJ1Y3R1cmVzLiAgSXQgaXMgZGVmaW5lZCBvbiB0aGUgYmFzaXMgb2YgZXhwZXJpZW5jZSB3aXRoIHBhc3QgcHJvamVjdHMgb3IgZW5nYWdlbWVudHMsIGFuZC9vciB0aGUgYmVzdCBwcmFjdGljZSB1c2Ugb2YgYSBkZXZlbG9wbWVudCBvciBkZWxpdmVyeSBhcHByb2FjaC4gIEl0IGRlZmluZXMgd2hhdCBnZXRzIHByb2R1Y2VkLCBob3cgdGhvc2UgaXRlbXMgYXJlIHByb2R1Y2VkLCBhbmQgdGhlIHJlcXVpcmVkIHN0YWZmaW5nIGluIHRoZSBmb3JtIG9mIGludGVncmF0ZWQgV29yaywgV29yayBQcm9kdWN0LCBhbmQgVGVhbSBCcmVha2Rvd24gU3RydWN0dXJlcy4gIEZvciBleGFtcGxlLCBhIHByb2Nlc3MgZW5naW5lZXIgY2FuIGRlZmluZSBhbHRlcm5hdGl2ZSBEZWxpdmVyeSBQcm9jZXNzZXMgZm9yIHNvZnR3YXJlIGRldmVsb3BtZW50IHByb2plY3RzIHRoYXQgZGlmZmVyIGluIHRoZSBzY2FsZSBvZiB0aGUgZW5nYWdlbWVudCBhbmQgc3RhZmZpbmcgbmVjZXNzYXJ5LCB0aGUgdHlwZSBvZiB0aGUgc29mdHdhcmUgYXBwbGljYXRpb24gdG8gYmUgZGV2ZWxvcGVkLCB0aGUgZGV2ZWxvcG1lbnQgbWV0aG9kcyBhbmQgdGVjaG5vbG9naWVzIHRvIGJlIHVzZWQsIGV0Yy4gIEFsdGhvdWdoLCB0aGUgRGVsaXZlcnkgUHJvY2VzcyBhaW1zIHRvIGNvdmVyIGEgd2hvbGUgcHJvamVjdCBpdCBrZWVwcyBjZXJ0YWluIGRlY2lzaW9uIHRoYXQgYXJlIHRvbyBwcm9qZWN0IHNwZWNpZmljIG9wZW4uICBGb3IgZXhhbXBsZSwgdGhlIGJyZWFrZG93biBzdHJ1Y3R1cmUgZGVmaW5lcyB3aGljaCBCcmVha2Rvd24gRWxlbWVudHMgaGF2ZSBtdWx0aXBsZSBvY2N1cnJlbmNlcyBvciBpcyByZXBlYXRhYmxlIHZpYSBpdCByZXNwZWN0aXZlIGF0dHJpYnV0ZXMsIGJ1dCBkb2VzIG5vdCBzYXkgaG93IG1hbnkgb2NjdXJyZW5jZXMgYW5kIGhvdyBtYW55IHJlcGVhdHMvaXRlcmF0aW9ucyBpdCB3aWxsIGhhdmUuICBUaGVzZSBkZWNpc2lvbnMgaGF2ZSB0byBiZSBkb25lIGJ5IGEgcHJvamVjdCBtYW5hZ2VyIHdoZW4gcGxhbm5pbmcgYSBjb25jcmV0ZSBwcm9qZWN0LCBwcm9qZWN0IHBoYXNlLCBvciBwcm9qZWN0IGl0ZXJhdGlvbnMuICBBIERlbGl2ZXJ5IFByb2Nlc3MgaXMgYWx3YXlzIGEgY29tcGxldGUgZGVzY3JpcHRpb24gb2YgYSBwcm9jZXNzIGluIHRlcm1zIG9mIGNvbXBsZXRlbmVzcyBvZiB0aGUgbGlmZWN5Y2xlLCBhcyB3ZWxsIGFzIGluIHRlcm1zIG9mIGFsbCB0aHJlZSB2aWV3cyBvbiB0aGUgcHJvY2VzcyB3aGljaCBhcmUgdGhlIFdvcmsgQnJlYWtkb3duIFN0cnVjdHVyZSwgV29yayBQcm9kdWN0IEJyZWFrZG93biBTdHJ1Y3R1cmUsIGFuZCBUZWFtIEJyZWFrZG93biBTdHJ1Y3R1cmUgaGF2ZSB0byBiZSBmdWxseSBhbmQgY29uc2lzdGVudGx5IHBvcHVsYXRlZC4gIENvbnNpc3RlbmN5IG9mIGEgRGVsaXZlcnkgUHJvY2VzcyBpcyBhY3R1YWxseSBlbnN1cmVkIGJ5IHRoZSBmYWN0IHRoYXQgYWxsIHRocmVlIGJyZWFrZG93bnMgYXJlIHJlcHJlc2VudGVkIGJ5IG9uZSBzaW5nbGUgZGF0YSBzdHJ1Y3R1cmUgYW5kIG9uZSBwYXJ0aWN1bGFyIGJyZWFrZG93biBzdWNoIGFzIFRlYW0gQnJlYWtkb3duIGlzIGp1c3QgYSB2aWV3IG9uIHRoYXQgZGF0YSBzdHJ1Y3R1cmUuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImVkdWNhdGlvbk1hdGVyaWFscyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vU3VwcG9ydGluZ01hdGVyaWFsIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImNvbW11bmljYXRpb25zTWF0ZXJpYWxzIgotICAgICAgICBvcmRlcmVkPSJmYWxzZSIgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9TdXBwb3J0aW5nTWF0ZXJpYWwiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUHJvY2VzcyIgYWJzdHJhY3Q9InRydWUiIGVTdXBlclR5cGVzPSIjLy9BY3Rpdml0eSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBQcm9jZXNzIGlzIGEgc3BlY2lhbCBBY3Rpdml0eSB0aGF0IGRlc2NyaWJlcyBhIHN0cnVjdHVyZSBmb3IgcGFydGljdWxhciB0eXBlcyBvZiBkZXZlbG9wbWVudCBwcm9qZWN0cy4gIFRvIHBlcmZvcm0gc3VjaCBhIGRldmVsb3BtZW50IHByb2plY3QgYSBQcm9jZXNzZXMgd291bGQgYmUgJ2luc3RhbnRpYXRlZCcgYW5kIGFkYXB0ZWQgZm9yIHRoZSBzcGVjaWZpYyBzaXR1YXRpb24uICBQcm9jZXNzIGlzIGFuIGFic3RyYWN0IGNsYXNzIGFuZCB0aGlzIG1ldGEtbW9kZWwgZGVmaW5lcyBkaWZmZXJlbnQgc3BlY2lhbCB0eXBlcyBvZiBQcm9jZXNzZXMgZm9yIGRpZmZlcmVudCBwcm9jZXNzIG1hbmFnZW1lbnQgYXBwbGljYXRpb25zIGFuZCBkaWZmZXJlbnQgc2l0dWF0aW9ucyBvZiBwcm9jZXNzIHJldXNlLiAgRXZlcnkgUHJvY2VzcyBjb21wcmlzZXMgb2YgYW5kIGlzIHRoZSB0b3AtbGV2ZWwgZWxlbWVudCBvZiBhbiBuLWxldmVsIGJyZWFrZG93biBzdHJ1Y3R1cmUgdXNpbmcgdGhlIE5lc3RpbmcgYXNzb2NpYXRpb24gZGVmaW5lZCBvbiBBY3Rpdml0eS4mI3hEOyYjeEE7Q29yZSBNZXRob2QgQ29udGVudCBwcm92aWRlcyBzdGVwLWJ5LXN0ZXAgZXhwbGFuYXRpb25zLCBkZXNjcmliaW5nIGhvdyB2ZXJ5IHNwZWNpZmljIGRldmVsb3BtZW50IGdvYWxzIGFyZSBhY2hpZXZlZCBpbmRlcGVuZGVudCBvZiB0aGUgcGxhY2VtZW50IG9mIHRoZXNlIHN0ZXBzIHdpdGhpbiBhIGRldmVsb3BtZW50IGxpZmVjeWNsZS4gIFByb2Nlc3NlcyB0YWtlIHRoZXNlIG1ldGhvZCBlbGVtZW50cyBhbmQgcmVsYXRlIHRoZW0gaW50byBzZW1pLW9yZGVyZWQgc2VxdWVuY2VzIHRoYXQgYXJlIGN1c3RvbWl6ZWQgdG8gc3BlY2lmaWMgdHlwZXMgb2YgcHJvamVjdHMuICBUaHVzLCBhIHByb2Nlc3MgaXMgYSBzZXQgb2YgcGFydGlhbGx5IG9yZGVyZWQgd29yayBkZXNjcmlwdGlvbnMgaW50ZW5kZWQgdG8gcmVhY2ggYSBoaWdoZXIgZGV2ZWxvcG1lbnQgZ29hbCwgc3VjaCBhcyB0aGUgcmVsZWFzZSBvZiBhIHNwZWNpZmljIHNvZnR3YXJlIHN5c3RlbS4gIEEgcHJvY2VzcyBhbmQgdGhlIHByb2Nlc3MgbWV0YS1tb2RlbCBzdHJ1Y3R1cmUgZGVmaW5lZCBpbiB0aGlzIHNwZWNpZmljYXRpb24gZm9jdXNlcyBvbiB0aGUgbGlmZWN5Y2xlIGFuZCB0aGUgc2VxdWVuY2luZyBvZiB3b3JrIGluIGJyZWFrZG93biBzdHJ1Y3R1cmVzLiAgVG8gYWNoaWV2ZSB0aGlzIGl0IHVzZXMgdGhlIERlc2NyaXB0b3IgY29uY2VwdCByZWZlcmVuY2luZyBtZXRob2QgY29udGVudCBhbmQgYWxsb3dpbmcgZGVmaW5pbmcgdGltZS1zcGVjaWZpYyBjdXN0b21pemF0aW9ucyBvZiB0aGUgcmVmZXJlbmNlZCBjb250ZW50IChlLmcuIGRlZmluaW5nIGEgZm9jdXMgb24gZGlmZmVyZW50IHN0ZXBzIG9mIHRoZSBzYW1lIFRhc2sgYW5kIHByb3ZpZGluZyBpbnB1dCBXb3JrIFByb2R1Y3RzIGluIGRpZmZlcmVudCBzdGF0ZXMgd2l0aGluIHRoZSBkaWZmZXJlbnQgUGhhc2VzIG9mIGEgcHJvY2VzcyBsaWZlY3ljbGUgaW4gd2hpY2ggdGhlIHNhbWUgVGFzayBpcyBwZXJmb3JtZWQpLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJpbmNsdWRlc1BhdHRlcm5zIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9DYXBhYmlsaXR5UGF0dGVybiIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJkZWZhdWx0Q29udGV4dCIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9IiMvL01ldGhvZENvbmZpZ3VyYXRpb24iLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0idmFsaWRDb250ZXh0IiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9NZXRob2RDb25maWd1cmF0aW9uIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkNhcGFiaWxpdHlQYXR0ZXJuIiBlU3VwZXJUeXBlcz0iIy8vUHJvY2VzcyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBDYXBhYmlsaXR5IFBhdHRlcm4gaXMgYSBzcGVjaWFsIFByb2Nlc3MgdGhhdCBkZXNjcmliZXMgYSByZXVzYWJsZSBjbHVzdGVyIG9mIGRvaW5nIHdvcmsgaW4gY29tbW9uIHByb2Nlc3MgYXJlYXMuICBDYXBhYmlsaXRpZXMgUGF0dGVybnMgZXhwcmVzcyBhbmQgY29tbXVuaWNhdGUgcHJvY2VzcyBrbm93bGVkZ2UgZm9yIGEga2V5IGFyZWEgb2YgaW50ZXJlc3Qgc3VjaCBhcyBhIERpc2NpcGxpbmUgYW5kIGNhbiBiZSBkaXJlY3RseSB1c2VkIGJ5IHByb2Nlc3MgcHJhY3RpdGlvbmVyIHRvIGd1aWRlIGhpcyB3b3JrLiAgVGhleSBhcmUgYWxzbyB1c2VkIGFzIGJ1aWxkaW5nIGJsb2NrcyB0byBhc3NlbWJsZSBEZWxpdmVyeSBQcm9jZXNzZXMgb3IgbGFyZ2VyIENhcGFiaWxpdHkgUGF0dGVybnMgZW5zdXJpbmcgb3B0aW1hbCByZXVzZSBhbmQgYXBwbGljYXRpb24gb2YgdGhlIGtleSBwcmFjdGljZXMgdGhleSBleHByZXNzLiYjeEQ7JiN4QTtBIENhcGFiaWxpdHkgUGF0dGVybiBpcyBhIHNwZWNpYWwgUHJvY2VzcyB0aGF0IGRlc2NyaWJlcyBhIHJldXNhYmxlIGNsdXN0ZXIgb2YgZG9pbmcgd29yayBpbiBhIGdlbmVyYWwgcHJvY2VzcyBhcmVhIHRoYXQgcHJvdmlkZXMgYSBjb25zaXN0ZW50IGRldmVsb3BtZW50IGFwcHJvYWNoIHRvIGNvbW1vbiBwcm9ibGVtcy4gIEV4YW1wbGVzIGZvciBDYXBhYmlsaXR5IFBhdHRlcm4gY291bGQgYmUgJ3VzZSBjYXNlLWJhc2VkIHJlcXVpcmVtZW50cyBtYW5hZ2VtZW50JywgJ3VzZSBjYXNlIGFuYWx5c2lzJywgb3IgJ3VuaXQgdGVzdGluZycuIFR5cGljYWxseSBidXQgbm90IG5lY2Vzc2FyaWx5LCBDYXBhYmlsaXR5IFBhdHRlcm5zIGhhdmUgdGhlIHNjb3BlIG9mIG9uZSBkaXNjaXBsaW5lIHByb3ZpZGluZyBhIGJyZWFrZG93biBvZiByZXVzYWJsZSBjb21wbGV4IEFjdGl2aXRpZXMsIHJlbGF0aW9uc2hpcHMgdG8gdGhlIFJvbGVzIHdoaWNoIHBlcmZvcm0gVGFza3Mgd2l0aGluIHRoZXNlIEFjdGl2aXRpZXMsIGFzIHdlbGwgYXMgdG8gdGhlIFdvcmsgUHJvZHVjdHMgdGhhdCBhcmUgdXNlZCBhbmQgcHJvZHVjZWQuICBBIGNhcGFiaWxpdHkgcGF0dGVybiBkb2VzIG5vdCByZWxhdGUgdG8gYW55IHNwZWNpZmljIHBoYXNlIG9yIGl0ZXJhdGlvbiBvZiBhIGRldmVsb3BtZW50IGxpZmVjeWNsZSwgYW5kIHNob3VsZCBub3QgaW1wbHkgYW55LiAgSW4gb3RoZXIgd29yZHMsIGEgcGF0dGVybiBzaG91bGQgYmUgZGVzaWduZWQgaW4gYSB3YXkgdGhhdCBpdCBpcyBhcHBsaWNhYmxlIGFueXdoZXJlIGluIGEgRGVsaXZlcnkgUHJvY2Vzcy4gIFRoaXMgZW5hYmxlcyBpdHMgQWN0aXZpdGllcyB0byBiZSBmbGV4aWJseSBhc3NpZ25lZCB0byB3aGF0ZXZlciBwaGFzZXMgdGhlcmUgYXJlIGluIHRoZSBEZWxpdmVyeSBQcm9jZXNzIHRvIHdoaWNoIGl0IGlzIGJlaW5nIGFwcGxpZWQuICBJdCBpcyBhIGdvb2QgcHJhY3RpY2UgdG8gZGVzaWduIGEgQ2FwYWJpbGl0eSBQYXR0ZXJuIHRvIHByb2R1Y2Ugb25lIG9yIG1vcmUgZ2VuZXJpYyBEZWxpdmVyYWJsZXMuICBUaGUgdHlwaWNhbCBjb25maWd1cmF0aW9uIGlzIHRoYXQgZWFjaCBBY3Rpdml0eSBpbiB0aGUgQ2FwYWJpbGl0eSBQYXR0ZXJuIHByb2R1Y2VzIG9uZSBEZWxpdmVyYWJsZSwgYW5kIHRoZSBsYXN0IFRhc2sgRGVzY3JpcHRvciBpbiB0aGUgQWN0aXZpdHkgZXhwbGljaXRseSBvdXRwdXRzIGp1c3QgdGhpcyBEZWxpdmVyYWJsZS4gIFRoaXMgZW5hYmxlcyB0aGUgcHJvY2VzcyBlbmdpbmVlciB0byBzZWxlY3QgUGF0dGVybnMgb3IganVzdCBBY3Rpdml0aWVzIGJ5IGRlY2lkaW5nIHdoaWNoIERlbGl2ZXJhYmxlcyBhcmUgcmVxdWlyZWQuICBJdCBhbHNvIG9mZmVycyBhIHNpbXBsZSBpbnRlZ3JhdGlvbiBhcHByb2FjaDogYW4gQWN0aXZpdHkgZnJvbSBhIGNhcGFiaWxpdHkgcGF0dGVybiBpcyBsaW5rZWQgdG8gdGhlIFBoYXNlIG9yIEl0ZXJhdGlvbiB3aGljaCBpcyByZXF1aXJlZCB0byBwcm9kdWNlIHRoZSBBY3Rpdml0eSdzIERlbGl2ZXJhYmxlLiAgS2V5IGFwcGxpY2F0aW9ucyBhcmVhcyBvZiAvIGFyZWFzIG9mIHJldXNlIGZvciBDYXBhYmlsaXR5IFBhdHRlcm5zIGFyZTomI3hEOyYjeEE7LSBUbyBzZXJ2ZSBhcyBidWlsZGluZyBibG9ja3MgZm9yIGFzc2VtYmxpbmcgRGVsaXZlcnkgUHJvY2Vzc2VzIG9yIGxhcmdlciBDYXBhYmlsaXR5IFBhdHRlcm5zLiAgTm9ybWFsbHkgZGV2ZWxvcGluZyBhIERlbGl2ZXJ5IFByb2Nlc3MgaXMgbm90IGRvbmUgZnJvbSBzY3JhdGNoIGJ1dCBieSBzeXN0ZW1hdGljYWxseSBhcHBseWluZyBhbmQgYmluZGluZyBwYXR0ZXJucy4gIEluIGFkZGl0aW9uIHRvIHRoZSBzdGFuZGFyZCBwYXR0ZXJuIGFwcGxpY2F0aW9uIG9mICdjb3B5LWFuZC1tb2RpZnknLCB3aGljaCBhbGxvd3MgdGhlIHByb2Nlc3MgZW5naW5lZXIgdG8gaW5kaXZpZHVhbGx5IGN1c3RvbWl6ZSB0aGUgcGF0dGVybidzIGNvbnRlbnQgdG8gdGhlIHBhcnRpY3VsYXIgc2l0dWF0aW9uIGl0IGlzIGFwcGxpZWQgZm9yLCB0aGUgUGx1Z2luIG1ldGEtbW9kZWwgcGFja2FnZSAoU2VjdGlvbiA2LjEpIGludHJvZHVjZXMgZXZlbiBtb3JlIHNvcGhpc3RpY2F0ZWQgaW5oZXJpdGFuY2UgcmVsYXRpb25zaGlwcyB0aGF0IHN1cHBvcnQgZHluYW1pYyBiaW5kaW5nIG9mIHBhdHRlcm5zIChpLmUuIHRoZSBwYXR0ZXJuIGlzIHJlZmVyZW5jZWQgYW5kIG5vdCBjb3BpZWQpLiAgVGhpcyB1bmlxdWUgbmV3IHdheSBvZiByZXVzaW5nIHByb2Nlc3Mga25vd2xlZGdlIGFsbG93cyB0byBmYWN0b3Igb3V0IGNvbW1vbmx5IHJlb2NjdXJyaW5nIEFjdGl2aXRpZXMgaW50byBwYXR0ZXJucyBhbmQgdG8gYXBwbHkgdGhlbSBvdmVyIGFuZCBvdmVyIGFnYWluIGZvciBhIHByb2Nlc3MuICBXaGVuIHRoZSBwYXR0ZXJuIGlzIGJlaW5nIHJldmlzZWQgb3IgdXBkYXRlZCwgYWxsIGNoYW5nZXMgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IHJlZmxlY3RlZCBpbiBhbGwgcGF0dGVybiBhcHBsaWNhdGlvbiBpbiBhbGwgcHJvY2Vzc2VzIGJlY2F1c2Ugb2YgdGhlIGR5bmFtaWMgYmluZGluZy4mI3hEOyYjeEE7LSBUbyBzdXBwb3J0IGRpcmVjdCBleGVjdXRpb24gaW4gYSBkZXZlbG9wbWVudCBwcm9qZWN0IHRoYXQgZG9lcyBub3Qgd29yayBmb2xsb3dpbmcgYSB3ZWxsLWRlZmluZWQgcHJvY2VzcywgYnV0IHdvcmtzIGJhc2VkIG9uIGxvb3NlbHkgY29ubmVjdGVkIHByb2Nlc3MgZnJhZ21lbnRzIG9mIGJlc3QgcHJhY3RpY2VzIGluIGEgZmxleGlibGUgbWFubmVyIChlLmcuIEFnaWxlIERldmVsb3BtZW50KS4mI3hEOyYjeEE7LSBUbyBzdXBwb3J0IHByb2Nlc3MgZWR1Y2F0aW9uIGJ5IGRlc2NyaWJpbmcga25vd2xlZGdlIGZvciBhIGtleSBhcmVhIHN1Y2ggYXMgYmVzdCBwcmFjdGljZXMgb24gaG93IHRvIHBlcmZvcm0gdGhlIHdvcmsgZm9yIGEgRGlzY2lwbGluZSAoZS5nLiBSZXF1aXJlbWVudHMgTWFuYWdlbWVudCksIGZvciBhIHNwZWNpZmljIGRldmVsb3BtZW50IHRlY2huaXF1ZSAoYXNwZWN0LW9yaWVudGVkIGRldmVsb3BtZW50KSwgb3IgYSBzcGVjaWZpYyB0ZWNobmljYWwgYXJlYSAoZS5nLiByZWxhdGlvbmFsIGRhdGFiYXNlIGRlc2lnbiksIHdoaWNoIGlzIHVzZWQgZm9yIGVkdWNhdGlvbiBhbmQgdGVhY2hpbmcuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlByb2Nlc3NQbGFubmluZ1RlbXBsYXRlIiBlU3VwZXJUeXBlcz0iIy8vUHJvY2VzcyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBQcm9jZXNzIFBsYW5uaW5nIFRlbXBsYXRlIGlzIGEgc3BlY2lhbCBQcm9jZXNzIHRoYXQgaXMgcHJlcGFyZWQgZm9yIGluc3RhbnRpYXRpb24gYnkgYSBwcm9qZWN0IHBsYW5uaW5nIHRvb2wuICBUeXBpY2FsbHksIGl0IGlzIGNyZWF0ZWQgYmFzZWQgb24gYSBQcm9jZXNzIHN1Y2ggYXMgYSBEZWxpdmVyeSBQcm9jZXNzIGFzIGEgd2hvbGUgKGUuZy4gaW4gY2FzZSBvZiBhIHdhdGVyZmFsbC1iYXNlZCBkZXZlbG9wbWVudCBhcHByb2FjaCkgb3IgaW4gcGFydHMgKGUuZy4gaW4gY2FzZSBvZiBhbiBpdGVyYXRpdmUgZGV2ZWxvcG1lbnQgYXBwcm9hY2gpLiYjeEQ7JiN4QTtBIFByb2Nlc3MgUGxhbm5pbmcgVGVtcGxhdGUgcmVwcmVzZW50cyBhIHBhcnRpYWxseSBmaW5pc2hlZCBwbGFuIGZvciBhIGNvbmNyZXRlIHByb2plY3QuICBJdCB1c2VzIHRoZSBzYW1lIGluZm9ybWF0aW9uIHN0cnVjdHVyZXMgYXMgYWxsIG90aGVyIFByb2Nlc3MgVHlwZXMgdG8gcmVwcmVzZW50IHRlbXBsYXRlcyBmb3IgcHJvamVjdCBwbGFucy4gIEhvd2V2ZXIsIGNlcnRhaW4gcGxhbm5pbmcgZGVjaXNpb25zIGhhdmUgYWxyZWFkeSBiZWVuIGFwcGxpZWQgdG8gdGhlIHRlbXBsYXRlIGFzIHdlbGwgYXMgaW5mb3JtYXRpb24gaGFzIGJlZW4gcmVtb3ZlZCBhbmQvb3IgcmVmb3JtYXR0ZWQgdG8gYmUgcmVhZHkgZm9yIGV4cG9ydCB0byBhIHNwZWNpZmljIHBsYW5uaW5nIHRvb2wuICBFeGFtcGxlcyBmb3Igc3VjaCBkZWNpc2lvbnMgYXJlOiBhIHRlbXBsYXRlIGhhcyBiZWVuIGNyZWF0ZWQgdG8gcmVwcmVzZW50IGEgcGxhbiBmb3IgYSBwYXJ0aWN1bGFyIEl0ZXJhdGlvbiBpbiBhbiBpdGVyYXRpdmUgZGV2ZWxvcG1lbnQgcHJvamVjdCwgd2hpY2ggZnIgZXhhbXBsZSBkaXN0aW5ndWlzaGVzIGVhcmx5IGZyb20gbGF0ZSBpdGVyYXRpb25zIGluIHRoZSBFbGFib3JhdGlvbiBwaGFzZSBvZiBhIHByb2plY3Q7IGlmIHRoZSB0YXJnZXRlZCBwbGFubmluZyB0b29sIGNhbm5vdCByZXByZXNlbnQgaW5wdXQgYW5kIG91dHB1dCBvZiBUYXNrLCB0aGVuIHRoZXNlIGhhdmUgYmVlbiByZW1vdmVkIGZyb20gdGhlIHN0cnVjdHVyZTsgY2VydGFpbiByZXBldGl0aW9ucyBoYXZlIGJlZW4gYWxyZWFkeSBhcHBsaWVkLCBlLmcuIHN0YXRpbmcgdGhhdCBhIGN5Y2xlIG9mIHNwZWNpZmljIFRhc2sgZ3JvdXBlZCBpbiBhbiBBY3Rpdml0eSBoYXZlIHRvIGJlIHJlcGVhdGVkIG4tdGltZXM7IGV0Yy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iYmFzZWRPblByb2Nlc3NlcyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vUHJvY2VzcyIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJSb2FkbWFwIiBlU3VwZXJUeXBlcz0iIy8vR3VpZGFuY2UiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgUm9hZG1hcCBpcyBhIHNwZWNpYWwgR3VpZGFuY2UgVHlwZSB3aGljaCBpcyBvbmx5IHJlbGF0ZWQgdG8gQWN0aXZhdGVzIGFuZCB0aGVyZWZvcmUgaGFzIGJlZW4gYWRkZWQgYnkgdGhpcyBwYWNrYWdlIHRvIHRoZSBsaXN0IG9mIEd1aWRhbmNlIFR5cGVzIHJhdGhlciB0aGFuIGxpc3RlZCBpbiB0aGUgR3VpZGFuY2UgVHlwZXMgcGFja2FnZS4gIEEgUm9hZG1hcCByZXByZXNlbnRzIGEgbGluZWFyIHdhbGt0aHJvdWdoIG9mIGFuIEFjdGl2aXR5LCB0eXBpY2FsbHkgYSBQcm9jZXNzLiYjeEQ7JiN4QTtBbiBpbnN0YW5jZSBvZiBhIFJvYWRtYXAgcmVwcmVzZW50cyBpbXBvcnRhbnQgZG9jdW1lbnRhdGlvbiBmb3IgdGhlIEFjdGl2aXR5IG9yIFByb2Nlc3MgaXQgaXMgcmVsYXRlZCB0by4gIE9mdGVuIGEgY29tcGxleCBBY3Rpdml0eSBzdWNoIGFzIGEgUHJvY2VzcyBjYW4gYmUgbXVjaCBlYXNpZXIgdW5kZXJzdG9vZCBieSBwcm92aWRpbmcgYSB3YWxrdGhyb3VnaCB3aXRoIGEgbGluZWFyIHRocmVhZCBvZiBhIHR5cGljYWwgaW5zdGFudGlhdGlvbiBvZiB0aGlzIEFjdGl2aXR5LiAgSW4gYWRkaXRpb24gdG8gbWFraW5nIHRoZSBwcm9jZXNzIHByYWN0aXRpb25lciB1bmRlcnN0YW5kIGhvdyB3b3JrIGluIHRoZSBwcm9jZXNzIGlzIGJlaW5nIHBlcmZvcm1lZCwgYSBSb2FkbWFwIHByb3ZpZGVzIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gYWJvdXQgaG93IEFjdGl2aXRpZXMgYW5kIFRhc2tzIHJlbGF0ZSB0byBlYWNoIG90aGVyIG92ZXIgdGltZS4gIFJvYWRtYXBzIGFyZSBhbHNvIHVzZWQgdG8gc2hvdyBob3cgc3BlY2lmaWMgYXNwZWN0cyBhcmUgZGlzdHJpYnV0ZWQgb3ZlciBhIHdob2xlIHByb2Nlc3MgcHJvdmlkaW5nIGEga2luZCBvZiBmaWx0ZXIgb24gdGhlIHByb2Nlc3MgZm9yIHRoaXMgaW5mb3JtYXRpb24uIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlByb2Nlc3NDb21wb25lbnQiIGVTdXBlclR5cGVzPSIjLy9Qcm9jZXNzUGFja2FnZSAjLy9NZXRob2RVbml0Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIFByb2Nlc3MgQ29tcG9uZW50IGlzIGEgc3BlY2lhbCBQcm9jZXNzIFBhY2thZ2UgdGhhdCBhcHBsaWVzIHRoZSBwcmluY2lwbGVzIG9mIGVuY2Fwc3VsYXRpb24uICBBIFByb2Nlc3MgQ29tcG9uZW50IHJlYWxpemVzIG9uZSBvciBtb3JlIEludGVyZmFjZXMgd2hpY2ggc3BlY2lmeSBpbnB1dHMgYW5kIG91dHB1dHMgb2YgdGhlIGNvbXBvbmVudC4gVGhlcmUgbWlnaHQgYmUgbWFueSBjb21wb25lbnRzIHJlYWxpemluZyB0aGUgc2FtZSBpbnRlcmZhY2VzLCBidXQgdXNpbmcgZGlmZmVyZW50IHRlY2huaXF1ZXMgdG8gYWNoaWV2ZSBzaW1pbGFyIG91dHB1dHMgZm9yIHNpbWlsYXIgaW5wdXRzLiAgV2hlcmVhcyB0aGUgQ29tcG9uZW50IEludGVyZmFjZXMgcmVwcmVzZW50IGNvbXBvbmVudCBzcGVjaWZpY2F0aW9ucyAoYmxhY2sgYm94IGRlc2NyaXB0aW9ucyBvZiB0aGUgY29tcG9uZW50KSwgZ29vZCBjYW5kaWRhdGVzIGZvciBjb21wb25lbnQgcmVhbGl6YXRpb25zIGNhbiBiZSBmb3VuZCBpbiBDYXBhYmlsaXR5IFBhdHRlcm5zICh3aGl0ZSBib3ggZGVzY3JpcHRpb25zIGZvciB0aGUgY29tcG9uZW50KS4mI3hEOyYjeEE7VU1BIHN1cHBvcnRzIHJlcGxhY2VhYmxlIGFuZCByZXVzYWJsZSBQcm9jZXNzIENvbXBvbmVudHMgcmVhbGl6aW5nIHRoZSBwcmluY2lwbGVzIG9mIGVuY2Fwc3VsYXRpb24uIENlcnRhaW4gc2l0dWF0aW9ucyBpbiBhIHNvZnR3YXJlIGRldmVsb3BtZW50IHByb2plY3QgbWlnaHQgcmVxdWlyZSB0aGF0IGNvbmNyZXRlIHJlYWxpemF0aW9ucyBvZiBwYXJ0cyBvZiB0aGUgcHJvY2VzcyByZW1haW4gdW5kZWNpZGVkIG9yIHdpbGwgYmUgZGVjaWRlZCBieSB0aGUgZXhlY3V0aW5nIHRlYW0gaXRzZWxmIChlLmcuIGluIG91dHNvdXJjaW5nIHNpdHVhdGlvbnMpLiAgVU1BIHByb3ZpZGVzIGEgdW5pcXVlIGNvbXBvbmVudCBjb25jZXB0IGRlZmluaW5nIGludGVyZmFjZXMgZm9yIHdvcmsgcHJvZHVjdCBpbnB1dCBhbmQgb3V0cHV0LCBhbGxvd2luZyB0cmVhdGluZyB0aGUgYWN0dWFsIGRlZmluaXRpb24gb2YgdGhlIHdvcmsgdGhhdCBwcm9kdWNlcyB0aGUgb3V0cHV0cyBhcyBhICZxdW90O2JsYWNrIGJveCZxdW90Oy4gIEF0IGFueSBwb2ludCBkdXJpbmcgYSBwcm9qZWN0IHRoZSBjb21wb25lbnQgJnF1b3Q7cmVhbGl6YXRpb24mcXVvdDsgZGV0YWlsaW5nIHRoZSB3b3JrIGNhbiBiZSBhZGRlZCB0byB0aGUgcHJvY2Vzcy4gIFRoZSBjb21wb25lbnQgYXBwcm9hY2ggYWxzbyBhbGxvd3MgdGhhdCBkaWZmZXJlbnQgc3R5bGVzIG9yIHRlY2huaXF1ZXMgb2YgZG9pbmcgd29yayBjYW4gYmUgcmVwbGFjZWQgd2l0aCBvbmUgYW5vdGhlci4gIEZvciBleGFtcGxlLCBhIHNvZnR3YXJlIGNvZGUgb3V0cHV0IG9mIGEgY29tcG9uZW50IGNvdWxkIGJlIHByb2R1Y2VkIHdpdGggYSBtb2RlbC1kcml2ZW4gZGV2ZWxvcG1lbnQgb3IgYSBjb2RlLWNlbnRyaWMgdGVjaG5pcXVlLiAgVGhlIGNvbXBvbmVudCBjb25jZXB0IGVuY2Fwc3VsYXRlcyB0aGUgYWN0dWFsIHdvcmsgYW5kIGxldHMgdGhlIGRldmVsb3BtZW50IHRlYW0gY2hvb3NlIHRoZSBhcHByb3ByaWF0ZSB0ZWNobmlxdWUgYW5kIGZpbGwgdGhlIGNvbXBvbmVudCdzIHJlYWxpemF0aW9uIHdpdGggdGhlaXIgY2hvaWNlIG9mIEFjdGl2aXRpZXMgdGhhdCBwcm9kdWNlIHRoZSByZXF1aXJlZCBvdXRwdXRzLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJpbnRlcmZhY2VzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgbG93ZXJCb3VuZD0iMSIgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InByb2Nlc3MiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSIjLy9Qcm9jZXNzIiBjb250YWlubWVudD0idHJ1ZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQcm9jZXNzUGFja2FnZSIgZVN1cGVyVHlwZXM9IiMvL01ldGhvZFBhY2thZ2UiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlByb2Nlc3MgUGFja2FnZSBpcyBhIHNwZWNpYWwgTWV0aG9kIFBhY2thZ2UgdGhhdCBjb250YWlucyBQcm9jZXNzIEVsZW1lbnRzLCBvbmx5LiYjeEQ7JiN4QTtBIGtleSBzZXBhcmF0aW9uIG9mIGNvbmNlcm5zIGluIFVNQSBpcyB0aGUgZGlzdGluY3Rpb24gYmV0d2VlbiBNZXRob2QgQ29udGVudCBhbmQgUHJvY2Vzcy4gIFRoaXMgc2VwYXJhdGlvbiBpcyBlbmZvcmNlZCBieSBzcGVjaWFsIHBhY2thZ2UgdHlwZXMsIHdoaWNoIGRvIG5vdCBhbGxvdyB0aGUgbWl4aW5nIG9mIG1ldGhvZCBjb250ZW50IHdpdGggcHJvY2Vzc2VzLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJwcm9jZXNzRWxlbWVudHMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1Byb2Nlc3NFbGVtZW50IiBjb250YWlubWVudD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJkaWFncmFtcyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vRGlhZ3JhbSIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSIgZVN1cGVyVHlwZXM9IiMvL0JyZWFrZG93bkVsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgUHJvY2VzcyBDb21wb25lbnQgSW50ZXJmYWNlIGNvbXByaXNlcyBvZiBhIGxpc3Qgb2YgaW50ZXJmYWNlIHNwZWNpZmljYXRpb25zIChzaW1pbGFyIHRvIG9wZXJhdGlvbiBkZWNsYXJhdGlvbnMpIHRoYXQgZXhwcmVzcyBpbnB1dHMgYW5kIG91dHB1dHMgZm9yIGEgcHJvY2VzcyBjb21wb25lbnQuICBUaGVzZSBpbnRlcmZhY2Ugc3BlY2lmaWNhdGlvbnMgYXJlIGV4cHJlc3NlZCB1c2luZyBUYXNrIERlc2NyaXB0b3JzIHdoaWNoIGFyZSBub3QgbGlua2VkIHRvIFRhc2tzIHRoYXQgYXJlIHJlbGF0ZWQgdG8gV29yayBQcm9kdWN0IERlc2NyaXB0b3JzIGFzIHdlbGwgYXMgb3B0aW9uYWwgYSBSb2xlIERlc2NyaXB0b3IuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImludGVyZmFjZVNwZWNpZmljYXRpb25zIgotICAgICAgICBvcmRlcmVkPSJmYWxzZSIgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9UYXNrRGVzY3JpcHRvciIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iaW50ZXJmYWNlSU8iIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1dvcmtQcm9kdWN0RGVzY3JpcHRvciIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3IiIGVTdXBlclR5cGVzPSIjLy9EZXNjcmlwdG9yIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIFByb2Nlc3MgQ29tcG9uZW50IERlc2NyaXB0b3IgcmVwcmVzZW50cyBhIFByb2Nlc3MgQ29tcG9uZW50IGFwcGxpY2F0aW9uIGluIGEgUHJvY2VzcywgaS5lLiB0aGUgYnJlYWtkb3duIHN0cnVjdHVyZSBkZWZpbmluZyB0aGUgUHJvY2Vzcy4gIFRoZSBQcm9jZXNzIENvbXBvbmVudCBEZXNjcmlwdG9yIGlzIHVzZWQgdG8gZW5jYXBzdWxhdGUgdGhlIGRldGFpbHMgb2YgdGhlIGNvbXBvbmVudCBpbiBhIGJyZWFrZG93biBzdHJ1Y3R1cmUgYW5kIHRvIHByb3ZpZGUgaXRzIG93biBzZXQgb2YgcmVsYXRpb25zaGlwcyBzdWNoIGFzIGl0IG93biBwcmVkZWNlc3NvcnMgYW5kIHN1Y2Nlc3NvcnMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9IlByb2Nlc3NDb21wb25lbnQiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSIjLy9Qcm9jZXNzQ29tcG9uZW50Ii8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ik1ldGhvZFBsdWdpbiIgZVN1cGVyVHlwZXM9IiMvL01ldGhvZFVuaXQgIy8vUGFja2FnZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBNZXRob2QgUGx1Z2luIGlzIGEgTWV0aG9kIEVsZW1lbnQgdGhhdCByZXByZXNlbnRzIGEgcGh5c2ljYWwgY29udGFpbmVyIGZvciBNZXRob2QgUGFja2FnZXMuICBJdCBkZWZpbmVzIGEgZ3JhbnVsYXJpdHkgbGV2ZWwgZm9yIHRoZSBtb2R1bGFyaXphdGlvbiBhbmQgb3JnYW5pemF0aW9uIG9mIG1ldGhvZCBjb250ZW50IGFuZCBwcm9jZXNzZXMuICBBIE1ldGhvZCBQbHVnaW4gY2FuIGV4dGVuZCBtYW55IG90aGVyIE1ldGhvZCBQbHVnaW5zIGFuZCBpdCBjYW4gYmUgZXh0ZW5kZWQgYnkgbWFueSBNZXRob2QgUGx1Z2lucy4gIEl0IGNhbiBhbHNvIGJlIHVzZWQgc3RhbmQtYWxvbmUsIGkuZS4gd2l0aCBubyBFeHRlbnNpb24gcmVsYXRpb25zaGlwIHRvIG90aGVyIHBsdWctaW5zLiYjeEQ7JiN4QTtNZXRob2QgUGx1Z2luIGNvbmNlcHR1YWxseSByZXByZXNlbnRzIGEgdW5pdCBmb3IgY29uZmlndXJhdGlvbiwgbW9kdWxhcml6YXRpb24sIGV4dGVuc2lvbiwgcGFja2FnaW5nLCBhbmQgZGVwbG95bWVudCBvZiBtZXRob2QgY29udGVudCBhbmQgcHJvY2Vzc2VzLiAgQSBQcm9jZXNzIEVuZ2luZWVyIHNoYWxsIGRlc2lnbiBoaXMgUGx1Z2lucyBhbmQgYWxsb2NhdGUgaGlzIGNvbnRlbnQgdG8gdGhlc2UgUGx1Z2lucyB3aXRoIHJlcXVpcmVtZW50cyBmb3IgZXh0ZW5zaWJpbGl0eSwgbW9kdWxhcml0eSwgcmV1c2UsIGFuZCBtYWludGFpbmFiaWxpdHkgaW4gbWluZC4mI3hEOyYjeEE7U3BlY2lhbCBleHRlbnNpYmlsaXR5IG1lY2hhbmlzbXMgZGVmaW5lZCBmb3IgdGhlIG1ldGEtY2xhc3NlcyBWYXJpYWJpbGl0eSBFbGVtZW50IGFuZCBQcm9jZXNzIENvbnRyaWJ1dGlvbiBhbGxvdyBQbHVnaW4gY29udGVudCB0byBkaXJlY3RseSBjb250cmlidXRlIG5ldyBjb250ZW50LCByZXBsYWNlIGV4aXN0aW5nIGNvbnRlbnQsIG9yIHRvIGNyb3NzLXJlZmVyZW5jZSB0byBhbnkgQ29udGVudCBFbGVtZW50IG9yIFByb2Nlc3Mgd2l0aGluIGFub3RoZXIgUGx1Z2luIHRoYXQgaXQgZXh0ZW5kcy4gIFNpbWlsYXIgdG8gVU1MIDIuMCdzICdwYWNrYWdlIG1lcmdlJyBtZWNoYW5pc20gdHJhbnNmb3JtYXRpb24gaW50ZXJwcmV0YXRpb25zLCBpbnRlcnByZXRpbmcgdGhlc2UgTWV0aG9kIFBsdWdpbiBtZWNoYW5pc21zIHJlc3VsdHMgaW50byBuZXcgZXh0ZW5kZWQgTWV0aG9kIENvbnRlbnQgYW5kIFByb2Nlc3Nlcy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idXNlckNoYW5nZWFibGUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuT2JqZWN0IgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im1ldGhvZFBhY2thZ2VzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgbG93ZXJCb3VuZD0iMSIgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9NZXRob2RQYWNrYWdlIiBjb250YWlubWVudD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJiYXNlcyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vTWV0aG9kUGx1Z2luIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlZhcmlhYmlsaXR5RWxlbWVudCIgYWJzdHJhY3Q9InRydWUiCi0gICAgICBlU3VwZXJUeXBlcz0iIy8vTWV0aG9kRWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVmFyaWFiaWxpdHkgRWxlbWVudCBpcyBhbiBhYnN0cmFjdCBjbGFzcyBkZXJpdmVkIGZyb20gTWV0aG9kIEVsZW1lbnQgdGhhdCBwcm92aWRlcyBuZXcgY2FwYWJpbGl0aWVzIGZvciBjb250ZW50IHZhcmlhdGlvbiBhbmQgZXh0ZW5zaW9uIHRvIENvbnRlbnQgRWxlbWVudHMgb3IgYW55IG90aGVyIE1ldGhvZCBFbGVtZW50IHRoYXQgZGVyaXZlcyBmcm9tIGl0LiAgSXQgaGFzIGJlZW4gcGxhY2VkIGluLWJldHdlZW4gdGhlIGNsYXNzZXMgTWV0aG9kIEVsZW1lbnQgYW5kIENvbnRlbnQgRWxlbWVudCBpbiB0aGUgb3ZlcmFsbCBVTUEgdGF4b25vbXkgb2YgY2xhc3NlcyB1c2luZyB0aGUgVU1MIDIuMCBwYWNrYWdlIG1lcmdlIG1lY2hhbmlzbS4gIFRoZSBhc3NvY2lhdGlvbiBWYXJpYWJpbGl0eSBTcGVjaWFsaXphdGlvbiBzaGFsbCBvbmx5IGJlIGluc3RhbnRpYXRlZCBiZXR3ZWVuIHR3byBzdWJjbGFzc2VzIG9mIFZhcmlhYmlsaXR5IEVsZW1lbnQgb2YgdGhlIHNhbWUgdHlwZS4gIFRoZSBlbGVtZW50IG9uIHZhcmFpYmlsaXR5U3BlY2lhbEVsZW1lbnQgc2lkZSBvZiB0aGUgcmVsYXRpb25zaGlwIGRlZmluZXMgYSB2YWx1ZSBmb3IgdGhlIGF0dHJpYnV0ZSB2YXJpYWJpbGl0eVR5cGUgZGVmaW5pbmcgdGhlIG5hdHVyZSBvZiB0aGUgcmVsYXRpb25zaGlwIHVzaW5nIGEgbGl0ZXJhbCBmcm9tIHRoZSBlbnVtZXJhdGlvbiBWYXJpYWJpbGl0eSBUeXBlLiYjeEQ7JiN4QTtWYXJpYWJpbGl0eSBFbGVtZW50IG9mIHRoZSBtZXRhLW1vZGVsIHBhY2thZ2UgTWV0aG9kIFBsdWdpbnMgYWRkcyB0aGUgY2FwYWJpbGl0aWVzIG9mIHZhcmlhdGlvbiBhbmQgZXh0ZW5zaW9uIHRvIE1ldGhvZCBFbGVtZW50cyB0aGF0IGRlcml2ZSBmcm9tIGl0LiAgQnkgZGVmYXVsdCBhbGwgQ29udGVudCBFbGVtZW50cyBzdWNoIGFzIFJvbGUsIFRhc2ssIEd1aWRhbmNlIFR5cGVzLCBvciBBY3Rpdml0aWVzIGFyZSBkZWZpbmVkIHRvIGJlIFZhcmlhYmlsaXR5IEVsZW1lbnRzLiYjeEQ7JiN4QTtWYXJpYWJpbGl0eSBhbmQgZXh0ZW5zaW9uIHByb3ZpZGVzIHVuaXF1ZSBtZWNoYW5pc21zIGZvciBjdXN0b21pemluZyBtZXRob2QgY29udGVudCB3aXRob3V0IGFjdHVhbGx5IGRpcmVjdGx5IG1vZGlmeWluZyB0aGUgb3JpZ2luYWwgY29udGVudCwgYnV0IGJ5IGp1c3QgYmUgYWJsZSB0byBkZXNjcmliZSB3aXRoIHNlcGFyYXRlIG9iamVjdHMgdGhlIGRpZmZlcmVuY2VzIChhZGRpdGlvbnMsIGNoYW5nZXMsIG9taXNzaW9ucykgcmVsYXRpdmUgdG8gdGhlIG9yaWdpbmFsLiAgVGhpcyBwbHVnLWluIGNvbmNlcHQgYWxsb3dzIHVzZXJzIHRvIGZhY3RvciB0aGVpciBtZXRob2QgY29udGVudCBhbmQgcHJvY2Vzc2VzIGluIGludGVycmVsYXRlZCB1bml0cyBhbmQgZXZlbiB0byBhcmNoaXRlY3QgbWV0aG9kIGNvbnRlbnQgYW5kIHByb2Nlc3NlcyBpbiBsYXllcnMgdGhhdCBleHRlbmQgZWFjaCBvdGhlciB3aXRoIG5ldyBjYXBhYmlsaXRpZXMuICBUaGUgcmVzdWx0aW5nIG1ldGhvZCBhbmQgcHJvY2VzcyBkZXNpZ24gY2FuIGJlIGR5bmFtaWNhbGx5IGNvbWJpbmVkIGFuZCBhcHBsaWVkIG9uIGRlbWFuZCB1c2luZyB0aGUgaW50ZXJwcmV0YXRpb24gcnVsZXMgZGVmaW5lZCBmb3IgVmFyaWFiaWxpdHkgRWxlbWVudCBTcGVjaWFsaXphdGlvbnMgYXNzZW1ibGluZyB0byBwcm9jZXNzIHByYWN0aXRpb25lcnMgdGhlIG1vc3QgYWNjdXJhdGUgbWV0aG9kIGFuZCBwcm9jZXNzIGRlc2NyaXB0aW9ucyBwb3NzaWJsZS4gIEl0IGFsc28gYWxsb3dzIHByb2Nlc3MgcHJhY3RpdGlvbmVycyB0byBleHRlbmRzIGFuZCB0YWlsb3IgbWV0aG9kIGNvbnRlbnQgYW5kIHByb2Nlc3NlcyB0aGV5IGRvIG5vdCBvd24gYW5kIHRvIGVhc2lseSB1cGdyYWRlIHRvIG5ld2VyIHZlcnNpb25zIGJ5IHNpbXBseSByZWFwcGx5IHRoZWlyIHBlcnNvbmFsIGNoYW5nZXMgdG8gdGhlc2UgdXBncmFkZXMuJiN4RDsmI3hBO1ZhcmlhYmlsaXR5IEVsZW1lbnQgZGVmaW5lcyB0d28gdHlwZXMgb2YgdmFyaWFiaWxpdHkgYW5kIG9uZSB0eXBlIG9mIGV4dGVuc2lvbiB3aGljaCBhcmUgZm9ybWFsbHkgZGVmaW5lZCBmb3IgdGhlIGVudW1lcmF0aW9uIFZhcmlhYmlsaXR5IFR5cGUuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InZhcmlhYmlsaXR5VHlwZSIgZVR5cGU9IiMvL1ZhcmlhYmlsaXR5VHlwZSIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0ibmEiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJJZiBpbiBpbnN0YW5jZSBvZiB0aGUgdmFyaWFiaWxpdHlTcGVjaWFsaXphdGlvbiBhc3NvY2lhdGlvbiBiZXR3ZWVuIHR3byBWYXJpYWJpbGl0eSBFbGVtZW50cyBvZiB0aGUgc2FtZSB0eXBlIGV4aXN0cywgdGhlbiB0aGUgdmFyaWFiaWxpdHlUeXBlIGF0dHJpYnV0ZSBzcGVjaWZpZXMgaG93IHRoZSBlbGVtZW50IGF0IHRoZSB2YXJpYWJpbGl0eVNwZWNpYWxFbGVtZW50IGVuZCBvZiB0aGUgYXNzb2NpYXRpb24gY2hhbmdlcyB0aGUgQ29udGVudCBFbGVtZW50IGF0IHRoZSB2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50IGVuZC4gU2VlIHRoZSBWYXJpYWJpbGl0eSBUeXBlIGVudW1lcmF0aW9uIGNsYXNzIGZvciBkZWZpbml0aW9ucyBmb3IgdGhlIGRpZmZlcmVudCB0eXBlcyBvZiB2YXJpYWJpbGl0eS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0idmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCIKLSAgICAgICAgbG93ZXJCb3VuZD0iMSIgZVR5cGU9IiMvL1ZhcmlhYmlsaXR5RWxlbWVudCIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUVudW0iIG5hbWU9IlZhcmlhYmlsaXR5VHlwZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVmFyaWFiaWxpdHkgVHlwZSBpcyBhbiBFbnVtZXJhdGlvbiB1c2VkIGZvciB2YWx1ZXMgZm9yIGluc3RhbmNlcyBvZiBWYXJpYWJpbGl0eSBFbGVtZW50J3MgYXR0cmlidXRlIHZhcmlhYmlsaXR5VHlwZS4gIEl0IGRlZmluZXMgdGhlIG5hdHVyZSBvZiBob3cgYSBWYXJpYWJpbGl0eSBFbGVtZW50IGV4dGVuZHMgYW5vdGhlciBWYXJpYWJpbGl0eSBFbGVtZW50LiBTZWUgZW51bWVyYXRpb24gbGl0ZXJhbHMgZm9yIGRlZmluaXRpb25zIGZvciBlYWNoIHR5cGUuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJuYSIvPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iY29udHJpYnV0ZXMiIHZhbHVlPSIxIi8+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJleHRlbmRzIiB2YWx1ZT0iMiIvPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0icmVwbGFjZXMiIHZhbHVlPSIzIi8+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJsb2NhbENvbnRyaWJ1dGlvbiIgdmFsdWU9IjQiLz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9ImxvY2FsUmVwbGFjZW1lbnQiIHZhbHVlPSI1Ii8+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJleHRlbmRzUmVwbGFjZXMiIHZhbHVlPSI2Ii8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ik1ldGhvZFVuaXQiIGFic3RyYWN0PSJ0cnVlIiBlU3VwZXJUeXBlcz0iIy8vTWV0aG9kRWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBNZXRob2QgVW5pdCBpcyBhIHNwZWNpYWwgTWV0aG9kIEVsZW1lbnQgdGhhdCBzaGFsbCBiZSBtYWludGFpbmVkIGluIGEgTWV0aG9kIExpYnJhcnkgYXMgYSBzZXBhcmF0ZSB1bml0IG9mIGNvbnRyb2wuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImF1dGhvcnMiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkV2ZXJ5IE1ldGhvZCBVbml0IGlzIGJlaW5nIGNyZWF0ZWQgYW5kIG93bmVkIGJ5IGFuIGF1dGhvciBvciBhdXRob3JpbmcgdGVhbS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY2hhbmdlRGF0ZSIgZVR5cGU9IiMvL0RhdGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZGF0ZSB0aGUgbGFzdCBjaGFuZ2UgdGhhdCByZXN1bHRlZCBpbnRvIHRoaXMgdmVyc2lvbiBoYXMgYmVlbiBtYWRlLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjaGFuZ2VEZXNjcmlwdGlvbiIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBsYXN0IGNoYW5nZSB0aGF0IHJlc3VsdGVkIGludG8gdGhpcyB2ZXJzaW9uLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ2ZXJzaW9uIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJFdmVyeSBQYWNrYWdlIGhhcyBhIHZlcnNpb24gbnVtYmVyIHVzZWQgdG8gdHJhY2sgY2hhbmdlcy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iY29weXJpZ2h0U3RhdGVtZW50IiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iIy8vU3VwcG9ydGluZ01hdGVyaWFsIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ik1ldGhvZENvbmZpZ3VyYXRpb24iIGVTdXBlclR5cGVzPSIjLy9NZXRob2RVbml0Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIE1ldGhvZCBDb25maWd1cmF0aW9uIGlzIGEgY29sbGVjdGlvbiBvZiBzZWxlY3RlZCBNZXRob2QgTW9kZWxzIGFuZCBNZXRob2RQYWNrYWdlcy4gQSBjb25maWd1cmF0aW9uIGNhbiBiZSBleHBvcnRlZCBpbnRvIGl0cyBvd24gc3RhbmRhbG9uZSBsaWJyYXJ5IHdoZW4gaXQgaW5jbHVkZXMgdGhlIGZ1bGwgdHJhbnNpdGl2ZSBjbG9zdXJlIG9mIGFsbCBlbGVtZW50cyBhbGwgb3RoZXIgZWxlbWVudHMgZGVwZW5kIG9uLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJtZXRob2RQbHVnaW5TZWxlY3Rpb24iCi0gICAgICAgIG9yZGVyZWQ9ImZhbHNlIiBsb3dlckJvdW5kPSIxIiB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL01ldGhvZFBsdWdpbiIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJtZXRob2RQYWNrYWdlU2VsZWN0aW9uIgotICAgICAgICBvcmRlcmVkPSJmYWxzZSIgbG93ZXJCb3VuZD0iMSIgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9NZXRob2RQYWNrYWdlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InByb2Nlc3NWaWV3cyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vQ29udGVudENhdGVnb3J5Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImRlZmF1bHRWaWV3IiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iIy8vQ29udGVudENhdGVnb3J5Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImJhc2VDb25maWd1cmF0aW9ucyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vTWV0aG9kQ29uZmlndXJhdGlvbiIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJzdWJ0cmFjdGVkQ2F0ZWdvcnkiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0NvbnRlbnRDYXRlZ29yeSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJhZGRlZENhdGVnb3J5IiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Db250ZW50Q2F0ZWdvcnkiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUHJvY2Vzc0ZhbWlseSIgZVN1cGVyVHlwZXM9IiMvL01ldGhvZENvbmZpZ3VyYXRpb24iPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgRGVsaXZlcnkgTW9kZWwgRmFtaWx5IGlzIGEgY29udmVuaWVudCBncm91cGluZyBvZiBEZWxpdmVyeSBQcm9jZXNzZXMgYW5kIENhcGFiaWxpdHkgUGF0dGVybnMgb2YgaW50ZXJlc3QgdG8gc29tZSBzcGVjaWZpYyB1c2VyIGNvbW11bml0eS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZGVsaXZlcnlQcm9jZXNzZXMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0RlbGl2ZXJ5UHJvY2VzcyIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJNZXRob2RMaWJyYXJ5IiBlU3VwZXJUeXBlcz0iIy8vTWV0aG9kVW5pdCAjLy9QYWNrYWdlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIE1ldGhvZCBMaWJyYXJ5IGlzIGEgcGh5c2ljYWwgY29udGFpbmVyIGZvciBNZXRob2QgUGx1Z2lucyBhbmQgTWV0aG9kIENvbmZpZ3VyYXRpb24gZGVmaW5pdGlvbnMuICBBbGwgTWV0aG9kIEVsZW1lbnRzIGFyZSBzdG9yZWQgaW4gYSBNZXRob2QgTGlicmFyeS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ibWV0aG9kUGx1Z2lucyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vTWV0aG9kUGx1Z2luIiBjb250YWlubWVudD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJwcmVkZWZpbmVkQ29uZmlndXJhdGlvbnMiCi0gICAgICAgIG9yZGVyZWQ9ImZhbHNlIiB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL01ldGhvZENvbmZpZ3VyYXRpb24iIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotPC9lY29yZTpFUGFja2FnZT4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvbW9kZWwvMS4wLjQvdW1hLmVteCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvbW9kZWwvMS4wLjQvdW1hLmVteApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGY3NjkzMy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL21vZGVsLzEuMC40L3VtYS5lbXgKKysrIC9kZXYvbnVsbApAQCAtMSwzMzIxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0teHRvb2xzMl91bml2ZXJzYWxfdHlwZV9tYW5hZ2VyLS0+Ci08P2NvbS5pYm0ueHRvb2xzLmVtZi5jb3JlLnNpZ25hdHVyZSA8c2lnbmF0dXJlIGlkPSJjb20uaWJtLnh0b29scy51bWwubXNsLm1vZGVsIiB2ZXJzaW9uPSI3LjAuMCI+PGZlYXR1cmUgZGVzY3JpcHRpb249IiIgbmFtZT0iY29tLmlibS54dG9vbHMucnVtbC5mZWF0dXJlIiB1cmw9IiIgdmVyc2lvbj0iNy4wLjAiLz48L3NpZ25hdHVyZT4/PgotPD9jb20uaWJtLnh0b29scy5lbWYuY29yZS5zaWduYXR1cmUgPHNpZ25hdHVyZSBpZD0iY29tLmlibS54dG9vbHMubW1pLnVpLnNpZ25hdHVyZXMuZGlhZ3JhbSIgdmVyc2lvbj0iNy4wLjAiPjxmZWF0dXJlIGRlc2NyaXB0aW9uPSIiIG5hbWU9IlJhdGlvbmFsIE1vZGVsaW5nIFBsYXRmb3JtIChjb20uaWJtLnh0b29scy5ybXApIiB1cmw9IiIgdmVyc2lvbj0iNy4wLjAiLz48L3NpZ25hdHVyZT4/PgotPHhtaTpYTUkgeG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4bWxuczpEZWZhdWx0PSJodHRwOi8vL3NjaGVtYXMvRGVmYXVsdC8xIiB4bWxuczpFY29yZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy91bWwyL3NjaGVtYXMvRWNvcmUvMyIgeG1sbnM6ZWNvcmU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUiIHhtbG5zOnVtbD0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy91bWwyLzIuMC4wL1VNTCIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vL3NjaGVtYXMvRGVmYXVsdC8xIHBhdGhtYXA6Ly9VTUwyX01TTF9QUk9GSUxFUy9EZWZhdWx0LmVweCNfSU44azhNbUJFZHFCY04xUjZFdldVdz9EZWZhdWx0L0RlZmF1bHQ/IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvdW1sMi9zY2hlbWFzL0Vjb3JlLzMgcGF0aG1hcDovL1VNTF9QUk9GSUxFUy9FY29yZS5wcm9maWxlLnVtbCNfdnktSFVZaW5FZHF0dmJuZkIyTF81dyI+Ci0gIDx1bWw6TW9kZWwgeG1pOmlkPSJfSjd0RzBPeUNFZHU1LXZWamxmVnNmUSIgbmFtZT0idW1hIj4KLSAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iX0o3dEcwZXlDRWR1NS12VmpsZlZzZlEiIHNvdXJjZT0idW1sMi5kaWFncmFtcyIvPgotICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfelRsMThPLXNFZHVINTlLU0hWOHZnQSIgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3VtbDIvMi4wLjAvVU1MIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfelRsMThlLXNFZHVINTlLU0hWOHZnQSIgc291cmNlPSJVbmlmaWVkTWV0aG9kQXJjaGl0ZWN0dXJlOjpVTUwySW5mcmFzdHJ1Y3R1cmVNaW5pOjpDb25zdHJ1Y3RzIiByZWZlcmVuY2VzPSJfeXhLZkN1LXNFZHVINTlLU0hWOHZnQSBfeXhLZkRlLXNFZHVINTlLU0hWOHZnQSBfeXhLZkV1LXNFZHVINTlLU0hWOHZnQSBfeXhLZkQtLXNFZHVINTlLU0hWOHZnQSBfeXhLZkZ1LXNFZHVINTlLU0hWOHZnQSBfeXhVUFVPLXNFZHVINTlLU0hWOHZnQSBfeXhVUFZPLXNFZHVINTlLU0hWOHZnQSBfeXhVUFdPLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il96VGwxOHUtc0VkdUg1OUtTSFY4dmdBIiBzb3VyY2U9IlVuaWZpZWRNZXRob2RBcmNoaXRlY3R1cmU6OlVNTDJJbmZyYXN0cnVjdHVyZU1pbmk6OlByaW1pdGl2ZVR5cGVzIiByZWZlcmVuY2VzPSJfeXhVUFpPLXNFZHVINTlLU0hWOHZnQSBfeXhVUFp1LXNFZHVINTlLU0hWOHZnQSBfeXhVUGFPLXNFZHVINTlLU0hWOHZnQSBfeXhVUGF1LXNFZHVINTlLU0hWOHZnQSBfeXhVUGEtLXNFZHVINTlLU0hWOHZnQSBfeXhVUGJPLXNFZHVINTlLU0hWOHZnQSBfeXhVUGJ1LXNFZHVINTlLU0hWOHZnQSBfeXhVUGNPLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il96VGwxOC0tc0VkdUg1OUtTSFY4dmdBIiBzb3VyY2U9IlVuaWZpZWRNZXRob2RBcmNoaXRlY3R1cmU6OlVuaWZpZWRNZXRob2RBcmNoaXRlY3R1cmU6Ok1ldGhvZENvcmU6OkJhc2ljRWxlbWVudHMiIHJlZmVyZW5jZXM9Il95eHc3Uk8tc0VkdUg1OUtTSFY4dmdBIF95eHc3U2Utc0VkdUg1OUtTSFY4dmdBIF95eHc3VHUtc0VkdUg1OUtTSFY4dmdBIF95eHc3VWUtc0VkdUg1OUtTSFY4dmdBIF95eHc3UWUtc0VkdUg1OUtTSFY4dmdBIF95eHc3Vk8tc0VkdUg1OUtTSFY4dmdBIF95eHc3V3Utc0VkdUg1OUtTSFY4dmdBIF95eHc3WC0tc0VkdUg1OUtTSFY4dmdBIF95eHc3Vi0tc0VkdUg1OUtTSFY4dmdBIF95eHc3WmUtc0VkdUg1OUtTSFY4dmdBIF95eHc3YXUtc0VkdUg1OUtTSFY4dmdBIF95eHc3Yi0tc0VkdUg1OUtTSFY4dmdBIF95eHc3WXUtc0VkdUg1OUtTSFY4dmdBIF95eHc3ZGUtc0VkdUg1OUtTSFY4dmdBIF95eHc3Y3Utc0VkdUg1OUtTSFY4dmdBIF95eHc3ZnUtc0VkdUg1OUtTSFY4dmdBIF95eHc3Zy0tc0VkdUg1OUtTSFY4dmdBIF95eHc3ZXUtc0VkdUg1OUtTSFY4dmdBIF95eHc3aU8tc0VkdUg1OUtTSFY4dmdBIF95eHc3aHUtc0VkdUg1OUtTSFY4dmdBIF95eHc3anUtc0VkdUg1OUtTSFY4dmdBIF95eHc3ak8tc0VkdUg1OUtTSFY4dmdBIF95eHc3a2Utc0VkdUg1OUtTSFY4dmdBIF95eHc3ai0tc0VkdUg1OUtTSFY4dmdBIF95eHc3bHUtc0VkdUg1OUtTSFY4dmdBIF95eHc3bE8tc0VkdUg1OUtTSFY4dmdBIF95eHc3bS0tc0VkdUg1OUtTSFY4dmdBIF95eHc3bWUtc0VkdUg1OUtTSFY4dmdBIF95eDZGTWUtc0VkdUg1OUtTSFY4dmdBIF95eDZGTU8tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iX3pUbDE5Ty1zRWR1SDU5S1NIVjh2Z0EiIHNvdXJjZT0iVW5pZmllZE1ldGhvZEFyY2hpdGVjdHVyZTo6VW5pZmllZE1ldGhvZEFyY2hpdGVjdHVyZTo6TWV0aG9kUGx1Z2luIiByZWZlcmVuY2VzPSJfeXh3N1FlLXNFZHVINTlLU0hWOHZnQSBfeXh3N1ZPLXNFZHVINTlLU0hWOHZnQSBfeXh3N1l1LXNFZHVINTlLU0hWOHZnQSBfeTdtTXNPLXNFZHVINTlLU0hWOHZnQSBfekdMRkJPLXNFZHVINTlLU0hWOHZnQSBfekdMRkJ1LXNFZHVINTlLU0hWOHZnQSBfekdMRkNlLXNFZHVINTlLU0hWOHZnQSBfekdMRkFPLXNFZHVINTlLU0hWOHZnQSBfekdMRkQtLXNFZHVINTlLU0hWOHZnQSBfekdMRkV1LXNFZHVINTlLU0hWOHZnQSBfekdMRkYtLXNFZHVINTlLU0hWOHZnQSBfekdMRkotLXNFZHVINTlLU0hWOHZnQSBfekdMRkt1LXNFZHVINTlLU0hWOHZnQSBfekdMRkpPLXNFZHVINTlLU0hWOHZnQSBfekdMRkwtLXNFZHVINTlLU0hWOHZnQSBfekdVMkF1LXNFZHVINTlLU0hWOHZnQSBfekdVMkFPLXNFZHVINTlLU0hWOHZnQSBfekdVMkItLXNFZHVINTlLU0hWOHZnQSBfekdVMkJlLXNFZHVINTlLU0hWOHZnQSBfekdVMkRPLXNFZHVINTlLU0hWOHZnQSBfekdVMkN1LXNFZHVINTlLU0hWOHZnQSBfekdVMkVlLXNFZHVINTlLU0hWOHZnQSBfekdVMkQtLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il96VGwxOWUtc0VkdUg1OUtTSFY4dmdBIiBzb3VyY2U9IlVuaWZpZWRNZXRob2RBcmNoaXRlY3R1cmU6OlVuaWZpZWRNZXRob2RBcmNoaXRlY3R1cmU6Ok1ldGhvZENvcmU6Okd1aWRhbmNlVHlwZXMiIHJlZmVyZW5jZXM9Il95eHc3Vk8tc0VkdUg1OUtTSFY4dmdBIF95eXpkR3Utc0VkdUg1OUtTSFY4dmdBIF95eXpkTU8tc0VkdUg1OUtTSFY4dmdBIF95ejEtNGUtc0VkdUg1OUtTSFY4dmdBIF95ejEtNU8tc0VkdUg1OUtTSFY4dmdBIF95ejEtNS0tc0VkdUg1OUtTSFY4dmdBIF95ejEtNnUtc0VkdUg1OUtTSFY4dmdBIF95ejEtN2Utc0VkdUg1OUtTSFY4dmdBIF95ejEtOE8tc0VkdUg1OUtTSFY4dmdBIF95ejEtOC0tc0VkdUg1OUtTSFY4dmdBIF95ejEtOXUtc0VkdUg1OUtTSFY4dmdBIF95ejEtLWUtc0VkdUg1OUtTSFY4dmdBIF95ejEtX08tc0VkdUg1OUtTSFY4dmdBIF95ejFfQXUtc0VkdUg1OUtTSFY4dmdBIF95ejFfQmUtc0VkdUg1OUtTSFY4dmdBIF95ejEtXy0tc0VkdUg1OUtTSFY4dmdBIF95ejFfQ2Utc0VkdUg1OUtTSFY4dmdBIF95ejFfRE8tc0VkdUg1OUtTSFY4dmdBIF95ejFfRC0tc0VkdUg1OUtTSFY4dmdBIF95ejFfRXUtc0VkdUg1OUtTSFY4dmdBIF95el92NE8tc0VkdUg1OUtTSFY4dmdBIF95el92NC0tc0VkdUg1OUtTSFY4dmdBIF95el92NS0tc0VkdUg1OUtTSFY4dmdBIF95el92NnUtc0VkdUg1OUtTSFY4dmdBIF95el92N2Utc0VkdUg1OUtTSFY4dmdBIF95el92OE8tc0VkdUg1OUtTSFY4dmdBIF95el92OC0tc0VkdUg1OUtTSFY4dmdBIF95el92OXUtc0VkdUg1OUtTSFY4dmdBIF95el92LWUtc0VkdUg1OUtTSFY4dmdBIF95el92X08tc0VkdUg1OUtTSFY4dmdBIF95el92Xy0tc0VkdUg1OUtTSFY4dmdBIF95el93Qk8tc0VkdUg1OUtTSFY4dmdBIF95el93QXUtc0VkdUg1OUtTSFY4dmdBIF95el93Q2Utc0VkdUg1OUtTSFY4dmdBIF95el93Qi0tc0VkdUg1OUtTSFY4dmdBIF95el93RHUtc0VkdUg1OUtTSFY4dmdBIF95el93RE8tc0VkdUg1OUtTSFY4dmdBIF95el93RS0tc0VkdUg1OUtTSFY4dmdBIF95el93RWUtc0VkdUg1OUtTSFY4dmdBIF95el93R08tc0VkdUg1OUtTSFY4dmdBIF95el93RnUtc0VkdUg1OUtTSFY4dmdBIF95el93SGUtc0VkdUg1OUtTSFY4dmdBIF95el93Ry0tc0VkdUg1OUtTSFY4dmdBIF95el93SXUtc0VkdUg1OUtTSFY4dmdBIF95el93SU8tc0VkdUg1OUtTSFY4dmdBIF95el93Si0tc0VkdUg1OUtTSFY4dmdBIF95el93SmUtc0VkdUg1OUtTSFY4dmdBIF95el93TE8tc0VkdUg1OUtTSFY4dmdBIF95el93S3Utc0VkdUg1OUtTSFY4dmdBIF95MEpnNHUtc0VkdUg1OUtTSFY4dmdBIF95MEpnNE8tc0VkdUg1OUtTSFY4dmdBIF95MEpnNS0tc0VkdUg1OUtTSFY4dmdBIF95MEpnNWUtc0VkdUg1OUtTSFY4dmdBIF95MEpnNi0tc0VkdUg1OUtTSFY4dmdBIF95MEpnNnUtc0VkdUg1OUtTSFY4dmdBIF95MEpnNy0tc0VkdUg1OUtTSFY4dmdBIF95MEpnN3Utc0VkdUg1OUtTSFY4dmdBIF95MEpnOC0tc0VkdUg1OUtTSFY4dmdBIF95MEpnOHUtc0VkdUg1OUtTSFY4dmdBIF95MEpnOS0tc0VkdUg1OUtTSFY4dmdBIF95MEpnOXUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iX3pUbDE5dS1zRWR1SDU5S1NIVjh2Z0EiIHNvdXJjZT0iVW5pZmllZE1ldGhvZEFyY2hpdGVjdHVyZTo6VW5pZmllZE1ldGhvZEFyY2hpdGVjdHVyZTo6TWV0aG9kQ29yZTo6TWV0aG9kQ29yZURlc2NyaXB0aW9ucyIgcmVmZXJlbmNlcz0iX3l4dzdWLS1zRWR1SDU5S1NIVjh2Z0EgX3l4dzdldS1zRWR1SDU5S1NIVjh2Z0EgX3kxTUNzdS1zRWR1SDU5S1NIVjh2Z0EgX3kxTUN0LS1zRWR1SDU5S1NIVjh2Z0EgX3kxTUN2Ty1zRWR1SDU5S1NIVjh2Z0EgX3kxTUN3Ty1zRWR1SDU5S1NIVjh2Z0EgX3kxTUNzTy1zRWR1SDU5S1NIVjh2Z0EgX3kxTUN4dS1zRWR1SDU5S1NIVjh2Z0EgX3kxTUN5LS1zRWR1SDU5S1NIVjh2Z0EgX3kxTUN4Ty1zRWR1SDU5S1NIVjh2Z0EgX3kxTUMwdS1zRWR1SDU5S1NIVjh2Z0EgX3kxTUMxLS1zRWR1SDU5S1NIVjh2Z0EgX3kxTUMzTy1zRWR1SDU5S1NIVjh2Z0EgX3kxTUMwTy1zRWR1SDU5S1NIVjh2Z0EgX3kxTUM0LS1zRWR1SDU5S1NIVjh2Z0EgX3kxTUM2Ty1zRWR1SDU5S1NIVjh2Z0EgX3kxTUM0ZS1zRWR1SDU5S1NIVjh2Z0EgX3kxTUM3LS1zRWR1SDU5S1NIVjh2Z0EgX3kxTUM5Ty1zRWR1SDU5S1NIVjh2Z0EgX3kxTUMtZS1zRWR1SDU5S1NIVjh2Z0EgX3kxTUM3ZS1zRWR1SDU5S1NIVjh2Z0EgX3kxTURBTy1zRWR1SDU5S1NIVjh2Z0EgX3kxTUNfdS1zRWR1SDU5S1NIVjh2Z0EgX3kxTURCLS1zRWR1SDU5S1NIVjh2Z0EgX3kxTURETy1zRWR1SDU5S1NIVjh2Z0EgX3kxTURFZS1zRWR1SDU5S1NIVjh2Z0EgX3kxTURGdS1zRWR1SDU5S1NIVjh2Z0EgX3kxTURHLS1zRWR1SDU5S1NIVjh2Z0EgX3kxTURJTy1zRWR1SDU5S1NIVjh2Z0EgX3kxTURCZS1zRWR1SDU5S1NIVjh2Z0EgX3kxTURKdS1zRWR1SDU5S1NIVjh2Z0EgX3kxTURLLS1zRWR1SDU5S1NIVjh2Z0EgX3kxTURNTy1zRWR1SDU5S1NIVjh2Z0EgX3kxTUROZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfelRsMTktLXNFZHVINTlLU0hWOHZnQSIgc291cmNlPSJVbmlmaWVkTWV0aG9kQXJjaGl0ZWN0dXJlOjpVbmlmaWVkTWV0aG9kQXJjaGl0ZWN0dXJlOjpNZXRob2RMaWJyYXJ5OjpNZXRob2RVbml0cyIgcmVmZXJlbmNlcz0iX3l4dzdWLS1zRWR1SDU5S1NIVjh2Z0EgX3pEcFZjTy1zRWR1SDU5S1NIVjh2Z0EgX3pHTEZBTy1zRWR1SDU5S1NIVjh2Z0EgX3pON1MxZS1zRWR1SDU5S1NIVjh2Z0EgX3pON1MydS1zRWR1SDU5S1NIVjh2Z0EgX3pON1MzdS1zRWR1SDU5S1NIVjh2Z0EgX3pON1M0LS1zRWR1SDU5S1NIVjh2Z0EgX3pON1M2Ty1zRWR1SDU5S1NIVjh2Z0EgX3pON1MwdS1zRWR1SDU5S1NIVjh2Z0EgX3pPRWN3LS1zRWR1SDU5S1NIVjh2Z0EgX3pPRWN3ZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfelRsMS1PLXNFZHVINTlLU0hWOHZnQSIgc291cmNlPSJVbmlmaWVkTWV0aG9kQXJjaGl0ZWN0dXJlOjpVbmlmaWVkTWV0aG9kQXJjaGl0ZWN0dXJlOjpNZXRob2RDb3JlOjpDb3JlQ29udGVudEVsZW1lbnRzIiByZWZlcmVuY2VzPSJfeXl6ZEZPLXNFZHVINTlLU0hWOHZnQSBfeXl6ZEYtLXNFZHVINTlLU0hWOHZnQSBfeXl6ZEVlLXNFZHVINTlLU0hWOHZnQSBfeXl6ZEh1LXNFZHVINTlLU0hWOHZnQSBfeXl6ZEllLXNFZHVINTlLU0hWOHZnQSBfeXl6ZEpPLXNFZHVINTlLU0hWOHZnQSBfeXl6ZEotLXNFZHVINTlLU0hWOHZnQSBfeXl6ZEt1LXNFZHVINTlLU0hWOHZnQSBfeXl6ZExlLXNFZHVINTlLU0hWOHZnQSBfeXl6ZEd1LXNFZHVINTlLU0hWOHZnQSBfeXl6ZE1PLXNFZHVINTlLU0hWOHZnQSBfeXl6ZE0tLXNFZHVINTlLU0hWOHZnQSBfeXl6ZE9lLXNFZHVINTlLU0hWOHZnQSBfeXl6ZFBPLXNFZHVINTlLU0hWOHZnQSBfeXl6ZE51LXNFZHVINTlLU0hWOHZnQSBfeXl6ZFF1LXNFZHVINTlLU0hWOHZnQSBfeXl6ZFAtLXNFZHVINTlLU0hWOHZnQSBfeXl6ZFJlLXNFZHVINTlLU0hWOHZnQSBfeXl6ZFNPLXNFZHVINTlLU0hWOHZnQSBfeXl6ZFQtLXNFZHVINTlLU0hWOHZnQSBfeXl6ZFV1LXNFZHVINTlLU0hWOHZnQSBfeXl6ZFRPLXNFZHVINTlLU0hWOHZnQSBfeXl6ZFYtLXNFZHVINTlLU0hWOHZnQSBfeXl6ZFZlLXNFZHVINTlLU0hWOHZnQSBfeXl6ZFhPLXNFZHVINTlLU0hWOHZnQSBfeXl6ZFd1LXNFZHVINTlLU0hWOHZnQSBfeXl6ZFllLXNFZHVINTlLU0hWOHZnQSBfeXl6ZFgtLXNFZHVINTlLU0hWOHZnQSBfeXl6ZFp1LXNFZHVINTlLU0hWOHZnQSBfeXl6ZFpPLXNFZHVINTlLU0hWOHZnQSBfeXl6ZGEtLXNFZHVINTlLU0hWOHZnQSBfeXl6ZGFlLXNFZHVINTlLU0hWOHZnQSBfeXk5T0V1LXNFZHVINTlLU0hWOHZnQSBfeXk5T0VPLXNFZHVINTlLU0hWOHZnQSBfeXk5T0ZlLXNFZHVINTlLU0hWOHZnQSBfeXk5T0dlLXNFZHVINTlLU0hWOHZnQSBfeXk5T0YtLXNFZHVINTlLU0hWOHZnQSBfeXk5T0h1LXNFZHVINTlLU0hWOHZnQSBfeXk5T0hPLXNFZHVINTlLU0hWOHZnQSBfeXk5T0ktLXNFZHVINTlLU0hWOHZnQSBfeXk5T0llLXNFZHVINTlLU0hWOHZnQSBfeXk5T0p1LXNFZHVINTlLU0hWOHZnQSBfeXk5T0pPLXNFZHVINTlLU0hWOHZnQSBfeXk5T0tlLXNFZHVINTlLU0hWOHZnQSBfeXk5T0otLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il96VGwxLWUtc0VkdUg1OUtTSFY4dmdBIiBzb3VyY2U9IlVuaWZpZWRNZXRob2RBcmNoaXRlY3R1cmU6OlVuaWZpZWRNZXRob2RBcmNoaXRlY3R1cmU6OlByb2Nlc3M6OlByb2Nlc3NUeXBlcyIgcmVmZXJlbmNlcz0iX3l6MS1fLS1zRWR1SDU5S1NIVjh2Z0EgX3kyT2tnTy1zRWR1SDU5S1NIVjh2Z0EgX3k3bU1zTy1zRWR1SDU5S1NIVjh2Z0EgX3ktNEtNLS1zRWR1SDU5S1NIVjh2Z0EgX3ktNEtOdS1zRWR1SDU5S1NIVjh2Z0EgX3ktNEtNTy1zRWR1SDU5S1NIVjh2Z0EgX3ktNEtQTy1zRWR1SDU5S1NIVjh2Z0EgX3ktNEtPZS1zRWR1SDU5S1NIVjh2Z0EgX3ktNEtRdS1zRWR1SDU5S1NIVjh2Z0EgX3ktNEtQLS1zRWR1SDU5S1NIVjh2Z0EgX3ktNEtSZS1zRWR1SDU5S1NIVjh2Z0EgX3ktNEtTZS1zRWR1SDU5S1NIVjh2Z0EgX3ktNEtUTy1zRWR1SDU5S1NIVjh2Z0EgX3ktNEtULS1zRWR1SDU5S1NIVjh2Z0EgX3ktNEtVdS1zRWR1SDU5S1NIVjh2Z0EgX3ktNEtWZS1zRWR1SDU5S1NIVjh2Z0EgX3ktNEtXTy1zRWR1SDU5S1NIVjh2Z0EgX3ktNEtXLS1zRWR1SDU5S1NIVjh2Z0EgX3lfQlVJZS1zRWR1SDU5S1NIVjh2Z0EgX3lfQlVKTy1zRWR1SDU5S1NIVjh2Z0EgX3lfQlVKLS1zRWR1SDU5S1NIVjh2Z0EgX3lfQlVMTy1zRWR1SDU5S1NIVjh2Z0EgX3lfQlVLdS1zRWR1SDU5S1NIVjh2Z0EgX3lfQlVNZS1zRWR1SDU5S1NIVjh2Z0EgX3lfQlVMLS1zRWR1SDU5S1NIVjh2Z0EgX3lfQlVOdS1zRWR1SDU5S1NIVjh2Z0EgX3lfQlVOTy1zRWR1SDU5S1NIVjh2Z0EgX3lfQlVPZS1zRWR1SDU5S1NIVjh2Z0EgX3lfQlVOLS1zRWR1SDU5S1NIVjh2Z0EgX3lfQlVQdS1zRWR1SDU5S1NIVjh2Z0EgX3lfQlVQTy1zRWR1SDU5S1NIVjh2Z0EgX3lfQlVRLS1zRWR1SDU5S1NIVjh2Z0EgX3lfQlVRZS1zRWR1SDU5S1NIVjh2Z0EgX3lfQlVSdS1zRWR1SDU5S1NIVjh2Z0EgX3lfQlVTdS1zRWR1SDU5S1NIVjh2Z0EgX3lfQlVTTy1zRWR1SDU5S1NIVjh2Z0EgX3lfQlVUdS1zRWR1SDU5S1NIVjh2Z0EgX3lfQlVUZS1zRWR1SDU5S1NIVjh2Z0EgX3lfQlVVLS1zRWR1SDU5S1NIVjh2Z0EgX3lfQlVVZS1zRWR1SDU5S1NIVjh2Z0EgX3lfQlVXTy1zRWR1SDU5S1NIVjh2Z0EgX3lfQlVWdS1zRWR1SDU5S1NIVjh2Z0EgX3lfQlVYZS1zRWR1SDU5S1NIVjh2Z0EgX3lfQlVXLS1zRWR1SDU5S1NIVjh2Z0EgX3lfQlVZdS1zRWR1SDU5S1NIVjh2Z0EgX3lfQlVZTy1zRWR1SDU5S1NIVjh2Z0EgX3lfQlVaLS1zRWR1SDU5S1NIVjh2Z0EgX3lfQlVaZS1zRWR1SDU5S1NIVjh2Z0EgX3lfQlViTy1zRWR1SDU5S1NIVjh2Z0EgX3lfQlVhdS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfelRsMS11LXNFZHVINTlLU0hWOHZnQSIgc291cmNlPSJVbmlmaWVkTWV0aG9kQXJjaGl0ZWN0dXJlOjpVbmlmaWVkTWV0aG9kQXJjaGl0ZWN0dXJlOjpNZXRob2RDb3JlOjpDYXRlZ29yaWVzIiByZWZlcmVuY2VzPSJfeTJPa2ctLXNFZHVINTlLU0hWOHZnQSBfeTJPa2h1LXNFZHVINTlLU0hWOHZnQSBfeTJPa2dPLXNFZHVINTlLU0hWOHZnQSBfeTJPa2pPLXNFZHVINTlLU0hWOHZnQSBfeTJPa2llLXNFZHVINTlLU0hWOHZnQSBfeTJPa2t1LXNFZHVINTlLU0hWOHZnQSBfeTJPa2xlLXNFZHVINTlLU0hWOHZnQSBfeTJPa2otLXNFZHVINTlLU0hWOHZnQSBfeTJPa20tLXNFZHVINTlLU0hWOHZnQSBfeTJPa21PLXNFZHVINTlLU0hWOHZnQSBfeTJPa251LXNFZHVINTlLU0hWOHZnQSBfeTJPa3BPLXNFZHVINTlLU0hWOHZnQSBfeTJPa29lLXNFZHVINTlLU0hWOHZnQSBfeTJPa3F1LXNFZHVINTlLU0hWOHZnQSBfeTJPa3AtLXNFZHVINTlLU0hWOHZnQSBfeTJPa3NPLXNFZHVINTlLU0hWOHZnQSBfeTJPa3JlLXNFZHVINTlLU0hWOHZnQSBfeTJPa3R1LXNFZHVINTlLU0hWOHZnQSBfeTJPa3VlLXNFZHVINTlLU0hWOHZnQSBfeTJPa3MtLXNFZHVINTlLU0hWOHZnQSBfeTJPa3Z1LXNFZHVINTlLU0hWOHZnQSBfeTJPa3ZPLXNFZHVINTlLU0hWOHZnQSBfeTJPa3ctLXNFZHVINTlLU0hWOHZnQSBfeTJPa3dlLXNFZHVINTlLU0hWOHZnQSBfeTJPa3lPLXNFZHVINTlLU0hWOHZnQSBfeTJPa3h1LXNFZHVINTlLU0hWOHZnQSBfeTJPa3ktLXNFZHVINTlLU0hWOHZnQSBfeTJPa3llLXNFZHVINTlLU0hWOHZnQSBfeTJPazBPLXNFZHVINTlLU0hWOHZnQSBfeTJPa3p1LXNFZHVINTlLU0hWOHZnQSBfeTJPazFlLXNFZHVINTlLU0hWOHZnQSBfeTJPazAtLXNFZHVINTlLU0hWOHZnQSBfeTJPazJ1LXNFZHVINTlLU0hWOHZnQSBfeTJPazJPLXNFZHVINTlLU0hWOHZnQSBfeTJPazMtLXNFZHVINTlLU0hWOHZnQSBfeTJPazNlLXNFZHVINTlLU0hWOHZnQSBfeTJPazVPLXNFZHVINTlLU0hWOHZnQSBfeTJPazR1LXNFZHVINTlLU0hWOHZnQSBfeTJPazZlLXNFZHVINTlLU0hWOHZnQSBfeTJPazUtLXNFZHVINTlLU0hWOHZnQSBfeTJPazdlLXNFZHVINTlLU0hWOHZnQSBfeTJPazdPLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il96VHVfNE8tc0VkdUg1OUtTSFY4dmdBIiBzb3VyY2U9IlVuaWZpZWRNZXRob2RBcmNoaXRlY3R1cmU6OlVuaWZpZWRNZXRob2RBcmNoaXRlY3R1cmU6Ok1ldGhvZENvcmU6OldvcmtQcm9kdWN0U3RhdGVzIiByZWZlcmVuY2VzPSJfeTNSdFl1LXNFZHVINTlLU0hWOHZnQSBfeTNSdFplLXNFZHVINTlLU0hWOHZnQSBfeTNSdGFPLXNFZHVINTlLU0hWOHZnQSBfeTNSdFlPLXNFZHVINTlLU0hWOHZnQSBfeTNhM1V1LXNFZHVINTlLU0hWOHZnQSBfeTNhM1ZlLXNFZHVINTlLU0hWOHZnQSBfeTNhM1dPLXNFZHVINTlLU0hWOHZnQSBfeTNhM1ctLXNFZHVINTlLU0hWOHZnQSBfeTNhM1VPLXNFZHVINTlLU0hWOHZnQSBfeTNhM1lPLXNFZHVINTlLU0hWOHZnQSBfeTNhM1h1LXNFZHVINTlLU0hWOHZnQSBfeTNhM1plLXNFZHVINTlLU0hWOHZnQSBfeTNhM2FPLXNFZHVINTlLU0hWOHZnQSBfeTNhM2EtLXNFZHVINTlLU0hWOHZnQSBfeTNhM1ktLXNFZHVINTlLU0hWOHZnQSBfeTNhM2J1LXNFZHVINTlLU0hWOHZnQSBfeTNhM2NPLXNFZHVINTlLU0hWOHZnQSBfeTNhM2UtLXNFZHVINTlLU0hWOHZnQSBfeTNhM2Z1LXNFZHVINTlLU0hWOHZnQSBfeTNhM2dlLXNFZHVINTlLU0hWOHZnQSBfeTNhM2d1LXNFZHVINTlLU0hWOHZnQSBfeTNhM2VlLXNFZHVINTlLU0hWOHZnQSBfeTNhM2h1LXNFZHVINTlLU0hWOHZnQSBfeTNhM2hlLXNFZHVINTlLU0hWOHZnQSBfeTNhM2lPLXNFZHVINTlLU0hWOHZnQSBfeTNhM2gtLXNFZHVINTlLU0hWOHZnQSBfeTNhM2llLXNFZHVINTlLU0hWOHZnQSBfeTNhM2l1LXNFZHVINTlLU0hWOHZnQSBfeTNhM2ktLXNFZHVINTlLU0hWOHZnQSBfeTNhM2pPLXNFZHVINTlLU0hWOHZnQSBfeTNhM2plLXNFZHVINTlLU0hWOHZnQSBfeTNhM2otLXNFZHVINTlLU0hWOHZnQSBfeTNhM2p1LXNFZHVINTlLU0hWOHZnQSBfeTNhM2t1LXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il96VHVfNGUtc0VkdUg1OUtTSFY4dmdBIiBzb3VyY2U9IlVuaWZpZWRNZXRob2RBcmNoaXRlY3R1cmU6OlVuaWZpZWRNZXRob2RBcmNoaXRlY3R1cmU6Ok1ldGhvZENvcmU6Ok1ldGhvZFBhY2thZ2UiIHJlZmVyZW5jZXM9Il95NGVBTmUtc0VkdUg1OUtTSFY4dmdBIF95NGVBT08tc0VkdUg1OUtTSFY4dmdBIF95NGVBTy0tc0VkdUg1OUtTSFY4dmdBIF95NGVBTWUtc0VkdUg1OUtTSFY4dmdBIF95NGVBUWUtc0VkdUg1OUtTSFY4dmdBIF95NGVBUHUtc0VkdUg1OUtTSFY4dmdBIF95NGVBUnUtc0VkdUg1OUtTSFY4dmdBIF95NGVBUk8tc0VkdUg1OUtTSFY4dmdBIF95NGVBUy0tc0VkdUg1OUtTSFY4dmdBIF95NGVBU2Utc0VkdUg1OUtTSFY4dmdBIF95NGVBVU8tc0VkdUg1OUtTSFY4dmdBIF95NGVBVHUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iX3pUdV80dS1zRWR1SDU5S1NIVjh2Z0EiIHNvdXJjZT0iVW5pZmllZE1ldGhvZEFyY2hpdGVjdHVyZTo6VW5pZmllZE1ldGhvZEFyY2hpdGVjdHVyZTo6UHJvY2Vzczo6QnJlYWtkb3duIiByZWZlcmVuY2VzPSJfeTdtTXRPLXNFZHVINTlLU0hWOHZnQSBfeTdtTXNPLXNFZHVINTlLU0hWOHZnQSBfeTdtTXQtLXNFZHVINTlLU0hWOHZnQSBfeTdtTXV1LXNFZHVINTlLU0hWOHZnQSBfeTdtTXZlLXNFZHVINTlLU0hWOHZnQSBfeTdtTXctLXNFZHVINTlLU0hWOHZnQSBfeTdtTXh1LXNFZHVINTlLU0hWOHZnQSBfeTdtTXllLXNFZHVINTlLU0hWOHZnQSBfeTdtTXdPLXNFZHVINTlLU0hWOHZnQSBfeTd2V29PLXNFZHVINTlLU0hWOHZnQSBfeTd2V3JlLXNFZHVINTlLU0hWOHZnQSBfeTd2V3NPLXNFZHVINTlLU0hWOHZnQSBfeTd2V3F1LXNFZHVINTlLU0hWOHZnQSBfeTd2V3R1LXNFZHVINTlLU0hWOHZnQSBfeTd2V3VPLXNFZHVINTlLU0hWOHZnQSBfeTd2V3V1LXNFZHVINTlLU0hWOHZnQSBfeTd2V3MtLXNFZHVINTlLU0hWOHZnQSBfeTd2V3dPLXNFZHVINTlLU0hWOHZnQSBfeTd2V3hlLXNFZHVINTlLU0hWOHZnQSBfeTd2V3lPLXNFZHVINTlLU0hWOHZnQSBfeTd2V3ktLXNFZHVINTlLU0hWOHZnQSBfeTd2V3p1LXNFZHVINTlLU0hWOHZnQSBfeTd2VzBlLXNFZHVINTlLU0hWOHZnQSBfeTd2VzFPLXNFZHVINTlLU0hWOHZnQSBfeTd2VzEtLXNFZHVINTlLU0hWOHZnQSBfeTd2V3ZPLXNFZHVINTlLU0hWOHZnQSBfeTd2VzNlLXNFZHVINTlLU0hWOHZnQSBfeTd2VzJ1LXNFZHVINTlLU0hWOHZnQSBfeTd2VzR1LXNFZHVINTlLU0hWOHZnQSBfeTd2VzVlLXNFZHVINTlLU0hWOHZnQSBfeTd2VzZPLXNFZHVINTlLU0hWOHZnQSBfeTd2VzMtLXNFZHVINTlLU0hWOHZnQSBfeTd2VzctLXNFZHVINTlLU0hWOHZnQSBfeTd2Vzh1LXNFZHVINTlLU0hWOHZnQSBfeTd2VzllLXNFZHVINTlLU0hWOHZnQSBfeTd2Vy1PLXNFZHVINTlLU0hWOHZnQSBfeTd2Vy0tLXNFZHVINTlLU0hWOHZnQSBfeTd2V191LXNFZHVINTlLU0hWOHZnQSBfeTd2WEFlLXNFZHVINTlLU0hWOHZnQSBfeTd2WEJPLXNFZHVINTlLU0hWOHZnQSBfeTd2WEItLXNFZHVINTlLU0hWOHZnQSBfeTd2VzYtLXNFZHVINTlLU0hWOHZnQSBfeTd2WERlLXNFZHVINTlLU0hWOHZnQSBfeTd2WEV1LXNFZHVINTlLU0hWOHZnQSBfeTd2WEYtLXNFZHVINTlLU0hWOHZnQSBfeTd2WEd1LXNFZHVINTlLU0hWOHZnQSBfeTd2WEhlLXNFZHVINTlLU0hWOHZnQSBfeTd2WElPLXNFZHVINTlLU0hWOHZnQSBfeTd2WEN1LXNFZHVINTlLU0hWOHZnQSBfeTd2WEp1LXNFZHVINTlLU0hWOHZnQSBfeTd2WEktLXNFZHVINTlLU0hWOHZnQSBfeTd2WExPLXNFZHVINTlLU0hWOHZnQSBfeTd2WEwtLXNFZHVINTlLU0hWOHZnQSBfeTd2WE11LXNFZHVINTlLU0hWOHZnQSBfeTd2WE5lLXNFZHVINTlLU0hWOHZnQSBfeTd2WEtlLXNFZHVINTlLU0hWOHZnQSBfeTd2WE9PLXNFZHVINTlLU0hWOHZnQSBfeTd2WFBlLXNFZHVINTlLU0hWOHZnQSBfeTd2WE8tLXNFZHVINTlLU0hWOHZnQSBfeTc1SG9PLXNFZHVINTlLU0hWOHZnQSBfeTc1SHBPLXNFZHVINTlLU0hWOHZnQSBfeTc1SG91LXNFZHVINTlLU0hWOHZnQSBfeTc1SHFlLXNFZHVINTlLU0hWOHZnQSBfeTc1SHAtLXNFZHVINTlLU0hWOHZnQSBfeTc1SHJ1LXNFZHVINTlLU0hWOHZnQSBfeTc1SHJPLXNFZHVINTlLU0hWOHZnQSBfeTc1SHMtLXNFZHVINTlLU0hWOHZnQSBfeTc1SHNlLXNFZHVINTlLU0hWOHZnQSBfeTc1SHVPLXNFZHVINTlLU0hWOHZnQSBfeTc1SHR1LXNFZHVINTlLU0hWOHZnQSBfeTc1SHZlLXNFZHVINTlLU0hWOHZnQSBfeTc1SHUtLXNFZHVINTlLU0hWOHZnQSBfeTc1SHd1LXNFZHVINTlLU0hWOHZnQSBfeTc1SHdPLXNFZHVINTlLU0hWOHZnQSBfeTc1SHhlLXNFZHVINTlLU0hWOHZnQSBfeTc1SHllLXNFZHVINTlLU0hWOHZnQSBfeTc1SHgtLXNFZHVINTlLU0hWOHZnQSBfeTc1SHp1LXNFZHVINTlLU0hWOHZnQSBfeTc1SHpPLXNFZHVINTlLU0hWOHZnQSBfeTc1SDAtLXNFZHVINTlLU0hWOHZnQSBfeTc1SDBlLXNFZHVINTlLU0hWOHZnQSBfeTc1SDJPLXNFZHVINTlLU0hWOHZnQSBfeTc1SDF1LXNFZHVINTlLU0hWOHZnQSBfeTc1SDNlLXNFZHVINTlLU0hWOHZnQSBfeTc1SDItLXNFZHVINTlLU0hWOHZnQSBfeTc1SDR1LXNFZHVINTlLU0hWOHZnQSBfeTc1SDRPLXNFZHVINTlLU0hWOHZnQSBfeTc1SDUtLXNFZHVINTlLU0hWOHZnQSBfeTc1SDVlLXNFZHVINTlLU0hWOHZnQSBfeTc1SDYtLXNFZHVINTlLU0hWOHZnQSBfeTc1SDZ1LXNFZHVINTlLU0hWOHZnQSBfeTc1SDhPLXNFZHVINTlLU0hWOHZnQSBfeTc1SDd1LXNFZHVINTlLU0hWOHZnQSBfeTc1SDllLXNFZHVINTlLU0hWOHZnQSBfeTc1SDgtLXNFZHVINTlLU0hWOHZnQSBfeTc1SC11LXNFZHVINTlLU0hWOHZnQSBfeTc1SC1PLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il96VHVfNC0tc0VkdUg1OUtTSFY4dmdBIiBzb3VyY2U9IlVuaWZpZWRNZXRob2RBcmNoaXRlY3R1cmU6OlVuaWZpZWRNZXRob2RBcmNoaXRlY3R1cmU6Ok1ldGhvZExpYnJhcnk6OkxpYnJhcnlDb25maWd1cmF0aW9ucyIgcmVmZXJlbmNlcz0iX3ktNEtPZS1zRWR1SDU5S1NIVjh2Z0EgX3pRZENZLS1zRWR1SDU5S1NIVjh2Z0EgX3pRZENadS1zRWR1SDU5S1NIVjh2Z0EgX3pRZENhZS1zRWR1SDU5S1NIVjh2Z0EgX3pRZENiTy1zRWR1SDU5S1NIVjh2Z0EgX3pRZENiLS1zRWR1SDU5S1NIVjh2Z0EgX3pRZENjdS1zRWR1SDU5S1NIVjh2Z0EgX3pRZENkZS1zRWR1SDU5S1NIVjh2Z0EgX3pRZENZTy1zRWR1SDU5S1NIVjh2Z0EgX3pRZENlLS1zRWR1SDU5S1NIVjh2Z0EgX3pRZENlTy1zRWR1SDU5S1NIVjh2Z0EgX3pRZENmLS1zRWR1SDU5S1NIVjh2Z0EgX3pRbXpZTy1zRWR1SDU5S1NIVjh2Z0EgX3pRbXphTy1zRWR1SDU5S1NIVjh2Z0EgX3pRbXphLS1zRWR1SDU5S1NIVjh2Z0EgX3pRbXpZLS1zRWR1SDU5S1NIVjh2Z0EgX3pRbXpjTy1zRWR1SDU5S1NIVjh2Z0EgX3pRbXpidS1zRWR1SDU5S1NIVjh2Z0EgX3pRbXpkZS1zRWR1SDU5S1NIVjh2Z0EgX3pRbXpjLS1zRWR1SDU5S1NIVjh2Z0EgX3pRbXpldS1zRWR1SDU5S1NIVjh2Z0EgX3pRbXplTy1zRWR1SDU5S1NIVjh2Z0EgX3pRbXpmLS1zRWR1SDU5S1NIVjh2Z0EgX3pRbXpmZS1zRWR1SDU5S1NIVjh2Z0EgX3pRbXpndS1zRWR1SDU5S1NIVjh2Z0EgX3pRbXpnTy1zRWR1SDU5S1NIVjh2Z0EgX3pRbXpoZS1zRWR1SDU5S1NIVjh2Z0EgX3pRbXpnLS1zRWR1SDU5S1NIVjh2Z0EgX3pRbXppdS1zRWR1SDU5S1NIVjh2Z0EgX3pRbXppTy1zRWR1SDU5S1NIVjh2Z0EgX3pRbXpqdS1zRWR1SDU5S1NIVjh2Z0EgX3pRbXpqZS1zRWR1SDU5S1NIVjh2Z0EgX3pRbXprdS1zRWR1SDU5S1NIVjh2Z0EgX3pRbXprZS1zRWR1SDU5S1NIVjh2Z0EgX3pRbXpsLS1zRWR1SDU5S1NIVjh2Z0EgX3pRbXpsZS1zRWR1SDU5S1NIVjh2Z0EgX3pRbXptLS1zRWR1SDU5S1NIVjh2Z0EgX3pRbXptdS1zRWR1SDU5S1NIVjh2Z0EgX3pRbXpuLS1zRWR1SDU5S1NIVjh2Z0EgX3pRbXpudS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfelR1XzVPLXNFZHVINTlLU0hWOHZnQSIgc291cmNlPSJVbmlmaWVkTWV0aG9kQXJjaGl0ZWN0dXJlOjpVbmlmaWVkTWV0aG9kQXJjaGl0ZWN0dXJlOjpQcm9jZXNzOjpQcm9jZXNzRGVzY3JpcHRpb25zIiByZWZlcmVuY2VzPSJfekJaNXd1LXNFZHVINTlLU0hWOHZnQSBfekJaNXdPLXNFZHVINTlLU0hWOHZnQSBfekJaNXllLXNFZHVINTlLU0hWOHZnQSBfekJaNXp1LXNFZHVINTlLU0hWOHZnQSBfekJaNTAtLXNFZHVINTlLU0hWOHZnQSBfekJaNXgtLXNFZHVINTlLU0hWOHZnQSBfekJaNTJ1LXNFZHVINTlLU0hWOHZnQSBfekJaNTMtLXNFZHVINTlLU0hWOHZnQSBfekJaNTVPLXNFZHVINTlLU0hWOHZnQSBfekJaNTZlLXNFZHVINTlLU0hWOHZnQSBfekJaNTd1LXNFZHVINTlLU0hWOHZnQSBfekJaNTgtLXNFZHVINTlLU0hWOHZnQSBfekJaNTJPLXNFZHVINTlLU0hWOHZnQSBfekJaNS11LXNFZHVINTlLU0hWOHZnQSBfekJaNV8tLXNFZHVINTlLU0hWOHZnQSBfekJaNS1PLXNFZHVINTlLU0hWOHZnQSBfekJaNkJ1LXNFZHVINTlLU0hWOHZnQSBfekJaNkJPLXNFZHVINTlLU0hWOHZnQSBfekJaNkRlLXNFZHVINTlLU0hWOHZnQSBfekJaNkMtLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il96VHVfNWUtc0VkdUg1OUtTSFY4dmdBIiBzb3VyY2U9IlVuaWZpZWRNZXRob2RBcmNoaXRlY3R1cmU6OlVuaWZpZWRNZXRob2RBcmNoaXRlY3R1cmU6OlByb2Nlc3M6OlByb2Nlc3NQYWNrYWdlIiByZWZlcmVuY2VzPSJfekRwVmRlLXNFZHVINTlLU0hWOHZnQSBfekRwVmVPLXNFZHVINTlLU0hWOHZnQSBfekRwVmNPLXNFZHVINTlLU0hWOHZnQSBfekRwVmZ1LXNFZHVINTlLU0hWOHZnQSBfekRwVmUtLXNFZHVINTlLU0hWOHZnQSBfekRwVmhPLXNFZHVINTlLU0hWOHZnQSBfekRwVmgtLXNFZHVINTlLU0hWOHZnQSBfekRwVmdlLXNFZHVINTlLU0hWOHZnQSBfekRwVmplLXNFZHVINTlLU0hWOHZnQSBfekRwVml1LXNFZHVINTlLU0hWOHZnQSBfekRwVmt1LXNFZHVINTlLU0hWOHZnQSBfekRwVmtPLXNFZHVINTlLU0hWOHZnQSBfekRwVmwtLXNFZHVINTlLU0hWOHZnQSBfekRwVmxlLXNFZHVINTlLU0hWOHZnQSBfekRwVm5PLXNFZHVINTlLU0hWOHZnQSBfekRwVm11LXNFZHVINTlLU0hWOHZnQSBfekRwVm9lLXNFZHVINTlLU0hWOHZnQSBfekRwVm4tLXNFZHVINTlLU0hWOHZnQSBfekRwVnB1LXNFZHVINTlLU0hWOHZnQSBfekRwVnBPLXNFZHVINTlLU0hWOHZnQSBfekRwVnEtLXNFZHVINTlLU0hWOHZnQSBfekRwVnFlLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il96VHVfNXUtc0VkdUg1OUtTSFY4dmdBIiBzb3VyY2U9IlVuaWZpZWRNZXRob2RBcmNoaXRlY3R1cmU6OlVuaWZpZWRNZXRob2RBcmNoaXRlY3R1cmU6OlByb2Nlc3NEaWFncmFtczo6VU1BRGlhZ3JhbXMiIHJlZmVyZW5jZXM9Il96RHBWaXUtc0VkdUg1OUtTSFY4dmdBIF96TGl0TU8tc0VkdUg1OUtTSFY4dmdBIF96TGl0TmUtc0VkdUg1OUtTSFY4dmdBIF96TGl0TS0tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iX3pUNHc0Ty1zRWR1SDU5S1NIVjh2Z0EiIHNvdXJjZT0iVW5pZmllZE1ldGhvZEFyY2hpdGVjdHVyZTo6VU1MMkRpYWdyYW1JbnRlcmNoYW5nZSIgcmVmZXJlbmNlcz0iX3pKQVdrZS1zRWR1SDU5S1NIVjh2Z0EgX3pKQVdrdS1zRWR1SDU5S1NIVjh2Z0EgX3pKQVdrTy1zRWR1SDU5S1NIVjh2Z0EgX3pKQVdsZS1zRWR1SDU5S1NIVjh2Z0EgX3pKQVdsdS1zRWR1SDU5S1NIVjh2Z0EgX3pKQVdtZS1zRWR1SDU5S1NIVjh2Z0EgX3pKQVduTy1zRWR1SDU5S1NIVjh2Z0EgX3pKQVduLS1zRWR1SDU5S1NIVjh2Z0EgX3pKQVdrLS1zRWR1SDU5S1NIVjh2Z0EgX3pKQVdvLS1zRWR1SDU5S1NIVjh2Z0EgX3pKQVdwTy1zRWR1SDU5S1NIVjh2Z0EgX3pKQVdvdS1zRWR1SDU5S1NIVjh2Z0EgX3pKQVdwLS1zRWR1SDU5S1NIVjh2Z0EgX3pKQVdxZS1zRWR1SDU5S1NIVjh2Z0EgX3pKQVdyTy1zRWR1SDU5S1NIVjh2Z0EgX3pKQVdyLS1zRWR1SDU5S1NIVjh2Z0EgX3pKQVdwZS1zRWR1SDU5S1NIVjh2Z0EgX3pKQVd0Ty1zRWR1SDU5S1NIVjh2Z0EgX3pKQVd0dS1zRWR1SDU5S1NIVjh2Z0EgX3pKQVdzdS1zRWR1SDU5S1NIVjh2Z0EgX3pKQVd1LS1zRWR1SDU5S1NIVjh2Z0EgX3pKQVd2LS1zRWR1SDU5S1NIVjh2Z0EgX3pKQVd1ZS1zRWR1SDU5S1NIVjh2Z0EgX3pKQVd4ZS1zRWR1SDU5S1NIVjh2Z0EgX3pKQVd5Ty1zRWR1SDU5S1NIVjh2Z0EgX3pKQVd3LS1zRWR1SDU5S1NIVjh2Z0EgX3pKQVd6ZS1zRWR1SDU5S1NIVjh2Z0EgX3pKQVcwTy1zRWR1SDU5S1NIVjh2Z0EgX3pKQVd5LS1zRWR1SDU5S1NIVjh2Z0EgX3pKS0hrdS1zRWR1SDU5S1NIVjh2Z0EgX3pKS0hrLS1zRWR1SDU5S1NIVjh2Z0EgX3pKS0hsTy1zRWR1SDU5S1NIVjh2Z0EgX3pKS0hsLS1zRWR1SDU5S1NIVjh2Z0EgX3pKS0hrTy1zRWR1SDU5S1NIVjh2Z0EgX3pKS0huTy1zRWR1SDU5S1NIVjh2Z0EgX3pKS0htdS1zRWR1SDU5S1NIVjh2Z0EgX3pKS0huLS1zRWR1SDU5S1NIVjh2Z0EgX3pKS0hvdS1zRWR1SDU5S1NIVjh2Z0EgX3pKS0hvLS1zRWR1SDU5S1NIVjh2Z0EgX3pKS0hwdS1zRWR1SDU5S1NIVjh2Z0EgX3pKS0huZS1zRWR1SDU5S1NIVjh2Z0EgX3pKS0hxLS1zRWR1SDU5S1NIVjh2Z0EgX3pKS0hyLS1zRWR1SDU5S1NIVjh2Z0EgX3pKS0hzdS1zRWR1SDU5S1NIVjh2Z0EgX3pKS0hxZS1zRWR1SDU5S1NIVjh2Z0EgX3pKS0h0LS1zRWR1SDU5S1NIVjh2Z0EgX3pKS0h0ZS1zRWR1SDU5S1NIVjh2Z0EgX3pKS0h2ZS1zRWR1SDU5S1NIVjh2Z0EgX3pKS0h1LS1zRWR1SDU5S1NIVjh2Z0EgX3pKS0h3dS1zRWR1SDU5S1NIVjh2Z0EgX3pKS0h3Ty1zRWR1SDU5S1NIVjh2Z0EgX3pKS0h4ZS1zRWR1SDU5S1NIVjh2Z0EgX3pKS0h5ZS1zRWR1SDU5S1NIVjh2Z0EgX3pKS0h4LS1zRWR1SDU5S1NIVjh2Z0EgX3pKS0h6LS1zRWR1SDU5S1NIVjh2Z0EgX3pKS0gwLS1zRWR1SDU5S1NIVjh2Z0EgX3pKS0h6ZS1zRWR1SDU5S1NIVjh2Z0EgX3pKS0gxLS1zRWR1SDU5S1NIVjh2Z0EgX3pKS0gyLS1zRWR1SDU5S1NIVjh2Z0EgX3pKS0gzZS1zRWR1SDU5S1NIVjh2Z0EgX3pKS0gyZS1zRWR1SDU5S1NIVjh2Z0EgX3pKS0g0dS1zRWR1SDU5S1NIVjh2Z0EgX3pKS0g0LS1zRWR1SDU5S1NIVjh2Z0EgX3pKS0g1Ty1zRWR1SDU5S1NIVjh2Z0EgX3pKS0g1ZS1zRWR1SDU5S1NIVjh2Z0EgX3pKS0g1dS1zRWR1SDU5S1NIVjh2Z0EgX3pKS0g1LS1zRWR1SDU5S1NIVjh2Z0EgX3pKS0g0Ty1zRWR1SDU5S1NIVjh2Z0EgX3pKS0g2Ty1zRWR1SDU5S1NIVjh2Z0EgX3pKS0g2ZS1zRWR1SDU5S1NIVjh2Z0EgX3pKS0g2LS1zRWR1SDU5S1NIVjh2Z0EgX3pKS0g2dS1zRWR1SDU5S1NIVjh2Z0EgX3pKS0g3dS1zRWR1SDU5S1NIVjh2Z0EgX3pKS0g3LS1zRWR1SDU5S1NIVjh2Z0EgX3pKS0g4Ty1zRWR1SDU5S1NIVjh2Z0EgX3pKS0g4dS1zRWR1SDU5S1NIVjh2Z0EgX3pKS0g4ZS1zRWR1SDU5S1NIVjh2Z0EgX3pKS0g5ZS1zRWR1SDU5S1NIVjh2Z0EgX3pKS0g5dS1zRWR1SDU5S1NIVjh2Z0EgX3pKVFJnTy1zRWR1SDU5S1NIVjh2Z0EgX3pKVFJndS1zRWR1SDU5S1NIVjh2Z0EgX3pKVFJnZS1zRWR1SDU5S1NIVjh2Z0EgX3pKVFJodS1zRWR1SDU5S1NIVjh2Z0EgX3pKVFJoZS1zRWR1SDU5S1NIVjh2Z0EgX3pKVFJpdS1zRWR1SDU5S1NIVjh2Z0EgX3pKVFJpZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3l4VVBZLS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il9KN3RHME95Q0VkdTUtdlZqbGZWc2ZRIj4KLSAgICAgIDxib2R5PjAwPC9ib2R5PgotICAgIDwvb3duZWRDb21tZW50PgotICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeTFDUnNPLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX0o3dEcwT3lDRWR1NS12VmpsZlZzZlEiPgotICAgICAgPGJvZHk+MDY8L2JvZHk+Ci0gICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95NGVBTU8tc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfSjd0RzBPeUNFZHU1LXZWamxmVnNmUSI+Ci0gICAgICA8Ym9keT4wNTwvYm9keT4KLSAgICA8L293bmVkQ29tbWVudD4KLSAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3kyRmFrTy1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il9KN3RHME95Q0VkdTUtdlZqbGZWc2ZRIj4KLSAgICAgIDxib2R5PjA0PC9ib2R5PgotICAgIDwvb3duZWRDb21tZW50PgotICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeXoxLTRPLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX0o3dEcwT3lDRWR1NS12VmpsZlZzZlEiPgotICAgICAgPGJvZHk+MDM8L2JvZHk+Ci0gICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95eHc3UU8tc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfSjd0RzBPeUNFZHU1LXZWamxmVnNmUSI+Ci0gICAgICA8Ym9keT4wMTwvYm9keT4KLSAgICA8L293bmVkQ29tbWVudD4KLSAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3l5emRFTy1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il9KN3RHME95Q0VkdTUtdlZqbGZWc2ZRIj4KLSAgICAgIDxib2R5PjAyPC9ib2R5PgotICAgIDwvb3duZWRDb21tZW50PgotICAgIDxwYWNrYWdlSW1wb3J0IHhtaTppZD0iX0o3dEcxT3lDRWR1NS12VmpsZlZzZlEiPgotICAgICAgPGltcG9ydGVkUGFja2FnZSB4bWk6dHlwZT0idW1sOk1vZGVsIiBocmVmPSJwYXRobWFwOi8vVU1MX0xJQlJBUklFUy9VTUxQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbCNfMCIvPgotICAgIDwvcGFja2FnZUltcG9ydD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3l4S2ZDdS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9IkNsYXNzaWZpZXIiIGlzQWJzdHJhY3Q9InRydWUiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95eEtmQy0tc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeXhLZkN1LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PlVNTCAyLjAgbWV0YS1jbGFzcyBDbGFzc2lmaWVyLjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3l4S2ZETy1zRWR1SDU5S1NIVjh2Z0EiIGdlbmVyYWw9Il95eFVQVU8tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il95eEtmRGUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJFbGVtZW50IiBpc0Fic3RyYWN0PSJ0cnVlIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeXhLZkR1LXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3l4S2ZEZS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5VTUwgMi4wIG1ldGEtY2xhc3MgRWxlbWVudC48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3l4S2ZELS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9Ik5hbWVkRWxlbWVudCIgaXNBYnN0cmFjdD0idHJ1ZSI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3l4S2ZFTy1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95eEtmRC0tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+VU1MIDIuMCBtZXRhLWNsYXNzIE5hbWVkIEVsZW1lbnQuICBEZWZpbmVkIHRoYXQgZXZlcnkgZWxlbWVudCBoYXMgYSBuYW1lLjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3l4S2ZFZS1zRWR1SDU5S1NIVjh2Z0EiIGdlbmVyYWw9Il95eEtmRGUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfeXhLZkV1LXNFZHVINTlLU0hWOHZnQSIgbmFtZT0ibmFtZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXhVUGFPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3l4S2ZFLS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIxIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3l4S2ZGTy1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iX3l4S2ZGZS1zRWR1SDU5S1NIVjh2Z0EiIHR5cGU9Il95eFVQYU8tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfeXhLZkZ1LXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iUGFja2FnZWFibGVFbGVtZW50IiBpc0Fic3RyYWN0PSJ0cnVlIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeXhLZkYtLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3l4S2ZGdS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5VTUwgMi4wIG1ldGEtY2xhc3MgUGFja2FnYWJsZSBFbGVtZW50LjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3l4S2ZHTy1zRWR1SDU5S1NIVjh2Z0EiIGdlbmVyYWw9Il95eEtmRC0tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il95eFVQVU8tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJUeXBlIiBpc0Fic3RyYWN0PSJ0cnVlIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeXhVUFVlLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3l4VVBVTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5VTUwgMi4wIG1ldGEtY2xhc3MgVHlwZS48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il95eFVQVXUtc0VkdUg1OUtTSFY4dmdBIiBnZW5lcmFsPSJfeXhLZkZ1LXNFZHVINTlLU0hWOHZnQSIvPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfeXhVUFZPLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iUGFja2FnZSI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3l4VVBWZS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95eFVQVk8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+VU1MIDIuMCBtZXRhLWNsYXNzIFBhY2thZ2UuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfeXhVUFZ1LXNFZHVINTlLU0hWOHZnQSIgZ2VuZXJhbD0iX3l4VVBXTy1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il95eFVQVi0tc0VkdUg1OUtTSFY4dmdBIiBnZW5lcmFsPSJfeXhLZkZ1LXNFZHVINTlLU0hWOHZnQSIvPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfeXhVUFdPLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iTmFtZXNwYWNlIiBpc0Fic3RyYWN0PSJ0cnVlIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeXhVUFdlLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3l4VVBXTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5VTUwgMi4wIG1ldGEtY2xhc3MgTmFtZXNwYWNlLjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3l4VVBXdS1zRWR1SDU5S1NIVjh2Z0EiIGdlbmVyYWw9Il95eEtmRC0tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIHhtaTppZD0iX3l4VVBaTy1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9IkRhdGUiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95eFVQWmUtc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeXhVUFpPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PkRhdGEgdHlwZSB1c2VkIGZvciBhdHRyaWJ1dGVzIG9mIG1ldGEtbW9kZWwgY2xhc3NlcyBvZiB0aGUgdHlwZSBEYXRlLjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiB4bWk6aWQ9Il95eFVQWnUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJVcmkiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95eFVQWi0tc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeXhVUFp1LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PkRhdGEgdHlwZSB1c2VkIGZvciBhdHRyaWJ1dGVzIG9mIG1ldGEtbW9kZWwgY2xhc3NlcyB0aGF0IHBvaW50IHRvIHJlc291cmNlcyBzdWNoIGFzIGZpbGVzLjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiB4bWk6aWQ9Il95eFVQYU8tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJTdHJpbmciPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95eFVQYWUtc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeXhVUGFPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PkEgc3RyaW5nIGlzIGEgc2VxdWVuY2Ugb2YgY2hhcmFjdGVycyBpbiBzb21lIHN1aXRhYmxlIGNoYXJhY3RlciBzZXQgdXNlZCB0byBkaXNwbGF5IGluZm9ybWF0aW9uIGFib3V0IHRoZSBtb2RlbC4gQ2hhcmFjdGVyIHNldHMgbWF5IGluY2x1ZGUgbm9uLVJvbWFuIGFscGhhYmV0cyBhbmQgY2hhcmFjdGVycy48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgeG1pOmlkPSJfeXhVUGF1LXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iU2V0Ii8+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIHhtaTppZD0iX3l4VVBhLS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9IlNlcXVlbmNlIi8+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIHhtaTppZD0iX3l4VVBiTy1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9IkludGVnZXIiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95eFVQYmUtc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeXhVUGJPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PkFuIGludGVnZXIgaXMgYSBwcmltaXRpdmUgdHlwZSByZXByZXNlbnRpbmcgaW50ZWdlciB2YWx1ZXMuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIHhtaTppZD0iX3l4VVBidS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9IkJvb2xlYW4iPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95eFVQYi0tc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeXhVUGJ1LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PkEgQm9vbGVhbiB0eXBlIGlzIHVzZWQgZm9yIGxvZ2ljYWwgZXhwcmVzc2lvbiwgY29uc2lzdGluZyBvZiB0aGUgcHJlZGVmaW5lZCB2YWx1ZXMgdHJ1ZSBhbmQgZmFsc2UuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIHhtaTppZD0iX3l4VVBjTy1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9IkRvdWJsZSIvPgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfeXh3N2N1LXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iQ29uc3RyYWludCI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3l4dzdjLS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95eHc3Y3Utc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+QSBDb25zdHJhaW50IGlzIGEgTWV0aG9kIEVsZW1lbnQgdGhhdCByZXByZXNlbnRzIGEgY29uZGl0aW9uIG9yIHJlc3RyaWN0aW9uIGV4cHJlc3NlZCBpbiBuYXR1cmFsIGxhbmd1YWdlIHRleHQgb3IgaW4gYSBtYWNoaW5lIHJlYWRhYmxlIGxhbmd1YWdlIGZvciB0aGUgcHVycG9zZSBvZiBkZWNsYXJpbmcgc29tZSBvZiB0aGUgc2VtYW50aWNzIG9mIGEgTWV0aG9kIEVsZW1lbnQuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfeXh3N2RPLXNFZHVINTlLU0hWOHZnQSIgZ2VuZXJhbD0iX3l4dzdRZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il95eHc3ZGUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJib2R5IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95eFVQYU8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95eHc3ZHUtc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeXh3N2RlLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgICAgPGJvZHk+VGhpcyBhdHRyaWJ1dGUgc3RvcmVzIHRoZSBkZWZpbml0aW9uIG9mIHRoZSBjb25zdHJhaW50LjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3l4dzdkLS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIxIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3l4dzdlTy1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iX3l4dzdlZS1zRWR1SDU5S1NIVjh2Z0EiIHR5cGU9Il95eFVQYU8tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfeXh3N2h1LXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iTWV0aG9kRWxlbWVudFByb3BlcnR5Ij4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il95eHc3aC0tc0VkdUg1OUtTSFY4dmdBIiBnZW5lcmFsPSJfeXhLZkZ1LXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3l4dzdpTy1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9InZhbHVlIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95eFVQYU8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeXh3N2llLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjEiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeXh3N2l1LXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfeXh3N2ktLXNFZHVINTlLU0hWOHZnQSIgdHlwZT0iX3l4VVBhTy1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il95eHc3ak8tc0VkdUg1OUtTSFY4dmdBIiBtZW1iZXJFbmQ9Il95eHc3VHUtc0VkdUg1OUtTSFY4dmdBIF95eHc3anUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeXh3N2plLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3l4dzdqTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5BIE1ldGhvZCBFbGVtZW50IGNhbiBvd24gbWFueSBDb25zdHJhaW50cyBkZWZpbmluZyBydWxlcyBmb3IgdGhpcyBlbGVtZW50LjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iX3l4dzdqdS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9Il9tZXRob2RFbGVtZW50IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95eHc3UWUtc0VkdUg1OUtTSFY4dmdBIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfeXh3N2pPLXNFZHVINTlLU0hWOHZnQSIvPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfeXh3N2otLXNFZHVINTlLU0hWOHZnQSIgbWVtYmVyRW5kPSJfeXh3N1gtLXNFZHVINTlLU0hWOHZnQSBfeXh3N2tlLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3l4dzdrTy1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95eHc3ai0tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+QSBDb250ZW50IERlc2NyaXB0aW9uIGNhbiBvcHRpb25hbGx5IGJlIHN0cnVjdHVyZSBpbnRvIFNlY3Rpb25zLiAgVGhpcyBhc3NvY2lhdGlvbiBpcyB1c2UgdG8gZGVjb21wb3NlZCBTZWN0aW9uIGludG8gYSBoaWVyYXJjaHkgb2YgU2VjdGlvbnMuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfeXh3N2tlLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iX2NvbnRlbnREZXNjcmlwdGlvbiIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXh3N1YtLXNFZHVINTlLU0hWOHZnQSIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iX3l4dzdqLS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95eHc3a3Utc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iMSIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95eHc3ay0tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkRW5kPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfeXh3N2xPLXNFZHVINTlLU0hWOHZnQSIgbWVtYmVyRW5kPSJfeXh3N2ItLXNFZHVINTlLU0hWOHZnQSBfeXh3N2x1LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3l4dzdsZS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95eHc3bE8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+U2VjdGlvbnMgY2FuIGJlIGZ1cnRoZXIgZGVjb21wb3NlZCBpbnRvIG4gbGV2ZWxzIG9mIHN1Yi1zZWN0aW9ucy48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il95eHc3bHUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJfc2VjdGlvbiIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXh3N1l1LXNFZHVINTlLU0hWOHZnQSIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iX3l4dzdsTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95eHc3bC0tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iMSIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95eHc3bU8tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iMSIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3l4dzdtZS1zRWR1SDU5S1NIVjh2Z0EiIG1lbWJlckVuZD0iX3l4dzdtLS1zRWR1SDU5S1NIVjh2Z0EgX3l4dzdnLS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95eHc3bXUtc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeXh3N21lLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PkEgRGVzY3JpYmFibGUgRWxlbWVudCBjYW4gY29udGFpbiBhIENvbnRlbnQgRGVzY3JpcHRpb24gZWxlbWVudCB0aGF0IHN0b3JlcyB0ZXh0dWFsIGRlc2NyaXB0aW9ucyBmb3IgdGhpcyBDb250ZW50IEVsZW1lbnQuICBDb250ZW50IERlc2NyaXB0aW9uIGlzIGludGVuZGVkIHRvIGJlIHJlZmluZWQgd2l0aCBzdWItY2xhc3NlcyBhZGRpbmcgbW9yZSBkZXNjcmlwdGlvbiBhdHRyaWJ1dGVzLiAgQW55IG9mIHRoZXNlIHN1Yi10eXBlcyBjYW4gYmUgcmVsYXRlZCB0byBhIENvbnRlbnQgRWxlbWVudC48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il95eHc3bS0tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJfZGVzY3JpYmFibGVFbGVtZW50IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95eHc3ZXUtc0VkdUg1OUtTSFY4dmdBIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfeXh3N21lLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3l4dzduTy1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIxIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3l4dzduZS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIxIi8+Ci0gICAgICA8L293bmVkRW5kPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfeXg2Rk1PLXNFZHVINTlLU0hWOHZnQSIgbWVtYmVyRW5kPSJfeXh3N1VlLXNFZHVINTlLU0hWOHZnQSBfeXg2Rk1lLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfeXg2Rk1lLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iX21ldGhvZEVsZW1lbnQiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l4dzdRZS1zRWR1SDU5S1NIVjh2Z0EiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il95eDZGTU8tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il95eXpkRWUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJSb2xlIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeXl6ZEV1LXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3l5emRFZS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5BIFJvbGUgaXMgYSBjb250ZW50IGVsZW1lbnQgdGhhdCBkZWZpbmVzIGEgc2V0IG9mIHJlbGF0ZWQgc2tpbGxzLCBjb21wZXRlbmNpZXMsIGFuZCByZXNwb25zaWJpbGl0aWVzLiAgUm9sZXMgYXJlIHVzZWQgYnkgVGFza3MgdG8gZGVmaW5lIHdobyBwZXJmb3JtcyB0aGVtIGFzIHdlbGwgYXMgZGVmaW5lIGEgc2V0IG9mIHdvcmsgcHJvZHVjdHMgdGhleSBhcmUgcmVzcG9uc2libGUgZm9yLiAgCi1BIFJvbGUgZGVmaW5lcyBhIHNldCBvZiByZWxhdGVkIHNraWxscywgY29tcGV0ZW5jaWVzLCBhbmQgcmVzcG9uc2liaWxpdGllcyBvZiBhbiBpbmRpdmlkdWFsIG9yIGEgc2V0IG9mIGluZGl2aWR1YWxzLiAgUm9sZXMgYXJlIG5vdCBpbmRpdmlkdWFscyBvciByZXNvdXJjZXMuICBJbmRpdmlkdWFsIG1lbWJlcnMgb2YgdGhlIGRldmVsb3BtZW50IG9yZ2FuaXphdGlvbiB3aWxsIHdlYXIgZGlmZmVyZW50IGhhdHMsIG9yIHBlcmZvcm0gZGlmZmVyZW50IHJvbGVzLiBUaGUgbWFwcGluZyBmcm9tIGluZGl2aWR1YWwgdG8gcm9sZSwgcGVyZm9ybWVkIGJ5IHRoZSBwcm9qZWN0IG1hbmFnZXIgd2hlbiBwbGFubmluZyBhbmQgc3RhZmZpbmcgZm9yIGEgcHJvamVjdCwgYWxsb3dzIGRpZmZlcmVudCBpbmRpdmlkdWFscyB0byBhY3QgYXMgc2V2ZXJhbCBkaWZmZXJlbnQgcm9sZXMsIGFuZCBmb3IgYSByb2xlIHRvIGJlIHBsYXllZCBieSBzZXZlcmFsIGluZGl2aWR1YWxzLgotPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfeXl6ZEUtLXNFZHVINTlLU0hWOHZnQSIgZ2VuZXJhbD0iX3l4dzdWTy1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il95eXpkRk8tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJtb2RpZmllcyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXl6ZE1PLXNFZHVINTlLU0hWOHZnQSIgaXNEZXJpdmVkPSJ0cnVlIiBhc3NvY2lhdGlvbj0iX3l5emRaTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95eXpkRmUtc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95eXpkRnUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3l5emRGLS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9InJlc3BvbnNpYmxlRm9yIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95eXpkTU8tc0VkdUg1OUtTSFY4dmdBIiBhc3NvY2lhdGlvbj0iX3l5emRhZS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95eXpkR08tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95eXpkR2Utc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfeXl6ZE0tLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iR3VpZGFuY2UiIGlzQWJzdHJhY3Q9InRydWUiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95eXpkTk8tc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeXl6ZE0tLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5Pkd1aWRhbmNlIGlzIGFuIGFic3RyYWN0IGdlbmVyYWxpemF0aW9uIG9mIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVsYXRlZCB0byBjb250ZW50IGVsZW1lbnRzIHN1Y2ggYXMgUm9sZXMsIFRhc2tzLCBhbmQgV29yayBQcm9kdWN0cy4gIEV4YW1wbGVzIGZvciBHdWlkYW5jZSBhcmUgR3VpZGVsaW5lcywgVGVtcGxhdGVzLCBDaGVja2xpc3RzLCBUb29sIE1lbnRvcnMsIEVzdGltYXRlcywgU3VwcG9ydGluZyBNYXRlcmlhbHMsIFJlcG9ydHMsIENvbmNlcHRzLCBldGMuICBUaGlzIHBhY2thZ2Ugb25seSBjb250YWlucyB0aGUgZGVmaW5pdGlvbiBvZiB0aGUgYWJzdHJhY3QgR3VpZGFuY2UgY2xhc3MuICBUaGUgcGFja2FnZSBHdWlkYW5jZSBUeXBlcyBkZWZpbmVzIGNvbmNyZXRlIGd1aWRhbmNlIHR5cGVzLjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3l5emROZS1zRWR1SDU5S1NIVjh2Z0EiIGdlbmVyYWw9Il95eHc3Vk8tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il95eXpkTnUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJBcnRpZmFjdCI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3l5emROLS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95eXpkTnUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+QXJ0aWZhY3QgaXMgYSBXb3JrIFByb2R1Y3QgdGhhdCBwcm92aWRlcyBhIGRlc2NyaXB0aW9uIGFuZCBkZWZpbml0aW9uIGZvciB0YW5naWJsZSB3b3JrIHByb2R1Y3QgdHlwZXMuIEFydGlmYWN0cyBtYXkgYmUgY29tcG9zZWQgb2Ygb3RoZXIgYXJ0aWZhY3RzLiBGb3IgZXhhbXBsZSwgYSBtb2RlbCBhcnRpZmFjdCBjYW4gYmUgY29tcG9zZWQgb2YgbW9kZWwgZWxlbWVudHMsIHdoaWNoIGFyZSBhbHNvIGFydGlmYWN0cy4KLUFydGlmYWN0cyBhcmUgdGFuZ2libGUgd29yayBwcm9kdWN0cyBjb25zdW1lZCwgcHJvZHVjZWQsIG9yIG1vZGlmaWVkIGJ5IFRhc2tzLiAgSXQgbWF5IHNlcnZlIGFzIGEgYmFzaXMgZm9yIGRlZmluaW5nIHJldXNhYmxlIGFzc2V0cy4gIFJvbGVzIHVzZSBBcnRpZmFjdHMgdG8gcGVyZm9ybSBUYXNrcyBhbmQgcHJvZHVjZSBBcnRpZmFjdHMgaW4gdGhlIGNvdXJzZSBvZiBwZXJmb3JtaW5nIFRhc2tzLiAgQXJ0aWZhY3RzIGFyZSB0aGUgcmVzcG9uc2liaWxpdHkgb2YgYSBzaW5nbGUgUm9sZSwgbWFraW5nIHJlc3BvbnNpYmlsaXR5IGVhc3kgdG8gaWRlbnRpZnkgYW5kIHVuZGVyc3RhbmQsIGFuZCBwcm9tb3RpbmcgdGhlIGlkZWEgdGhhdCBldmVyeSBwaWVjZSBvZiBpbmZvcm1hdGlvbiBwcm9kdWNlZCBpbiB0aGUgbWV0aG9kIHJlcXVpcmVzIHRoZSBhcHByb3ByaWF0ZSBzZXQgb2Ygc2tpbGxzLiBFdmVuIHRob3VnaCBvbmUgcm9sZSBtaWdodCAmcXVvdDtvd24mcXVvdDsgYSBzcGVjaWZpYyB0eXBlIG9mIEFydGlmYWN0cywgb3RoZXIgcm9sZXMgY2FuIHN0aWxsIHVzZSB0aGUgQXJ0aWZhY3RzOyBwZXJoYXBzIGV2ZW4gdXBkYXRlIHRoZW0gaWYgdGhlIFJvbGUgaGFzIGJlZW4gZ2l2ZW4gcGVybWlzc2lvbiB0byBkbyBzby4KLTwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3l5emRPTy1zRWR1SDU5S1NIVjh2Z0EiIGdlbmVyYWw9Il95eXpkTU8tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfeXl6ZE9lLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iY29udGFpbmVyQXJ0aWZhY3QiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l5emROdS1zRWR1SDU5S1NIVjh2Z0EiIGFzc29jaWF0aW9uPSJfeXk5T0ZlLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3l5emRPdS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIxIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3l5emRPLS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfeXl6ZFBPLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iY29udGFpbmVkQXJ0aWZhY3RzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95eXpkTnUtc0VkdUg1OUtTSFY4dmdBIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBhc3NvY2lhdGlvbj0iX3l5OU9GZS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95eXpkUGUtc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95eXpkUHUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfeXl6ZFAtLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iRGVsaXZlcmFibGUiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95eXpkUU8tc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeXl6ZFAtLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PkEgZGVsaXZlcmFibGUgaXMgYSBXb3JrIFByb2R1Y3QgdGhhdCBwcm92aWRlcyBhIGRlc2NyaXB0aW9uIGFuZCBkZWZpbml0aW9uIGZvciBwYWNrYWdpbmcgb3RoZXIgV29yayBQcm9kdWN0cywgYW5kIG1heSBiZSBkZWxpdmVyZWQgdG8gYW4gaW50ZXJuYWwgb3IgZXh0ZXJuYWwgcGFydHkuICBUaGVyZWZvcmUsIGEgRGVsaXZlcmFibGUgYWdncmVnYXRlcyBvdGhlciBXb3JrIFByb2R1Y3RzLiBUaGVyZWZvcmUsIGEgRGVsaXZlcmFibGUgYWdncmVnYXRlcyBvdGhlciBXb3JrIFByb2R1Y3RzLiAgQSBEZWxpdmVyYWJsZSBpcyB1c2VkIHRvIHByZS1kZWZpbmUgdHlwaWNhbCBvciByZWNvbW1lbmRlZCBjb250ZW50IGluIHRoZSBmb3JtIG9yIHdvcmsgcHJvZHVjdHMgdGhhdCB3b3VsZCBiZSBwYWNrYWdlZCBmb3IgZGVsaXZlcnkuICBUaGUgYWN0dWFsIHBhY2thZ2luZyBvZiB0aGUgRGVsaXZlcmFibGUgaW4gYW4gYWN0dWFsIHByb2Nlc3Mgb3IgZXZlbiBwcm9qZWN0IGNvdWxkIGJlIGEgbW9kaWZpY2F0aW9uIG9mIHRoaXMgcmVjb21tZW5kYXRpb24uICBEZWxpdmVyYWJsZXMgYXJlIHVzZWQgdG8gcmVwcmVzZW50IGFuIG91dHB1dCBmcm9tIGEgcHJvY2VzcyB0aGF0IGhhcyB2YWx1ZSwgbWF0ZXJpYWwgb3Igb3RoZXJ3aXNlLCB0byBhIGNsaWVudCwgY3VzdG9tZXIgb3Igb3RoZXIgc3Rha2Vob2xkZXIuIDwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3l5emRRZS1zRWR1SDU5S1NIVjh2Z0EiIGdlbmVyYWw9Il95eXpkTU8tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfeXl6ZFF1LXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iZGVsaXZlcmVkV29ya1Byb2R1Y3RzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95eXpkTU8tc0VkdUg1OUtTSFY4dmdBIiBhc3NvY2lhdGlvbj0iX3l5OU9GLS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95eXpkUS0tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95eXpkUk8tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfeXl6ZFJlLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iT3V0Y29tZSI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3l5emRSdS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95eXpkUmUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+QW4gb3V0Y29tZSBkZXNjcmliZXMgaW50YW5naWJsZSB3b3JrIHByb2R1Y3RzIHRoYXQgYXJlIGEgcmVzdWx0IG9yIHN0YXRlLiBPdXRjb21lcyBtYXkgYWxzbyBiZSB1c2VkIHRvIGRlc2NyaWJlIHdvcmsgcHJvZHVjdHMgdGhhdCBhcmUgbm90IGZvcm1hbGx5IGRlZmluZWQuICBBIGtleSBkaWZmZXJlbnRpYXRvciBmb3Igb3V0Y29tZXMgYWdhaW5zdCBhcnRpZmFjdHMgaXMgdGhhdCBvdXRjb21lcyBhcmUgbm90IGNhbmRpZGF0ZXMgZm9yIGhhcnZlc3RpbmcgYXMgcmV1c2FibGUgYXNzZXRzLjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3l5emRSLS1zRWR1SDU5S1NIVjh2Z0EiIGdlbmVyYWw9Il95eXpkTU8tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il95eXpkU08tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJTdGVwIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeXl6ZFNlLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3l5emRTTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5BIFN0ZXAgaXMgYSBTZWN0aW9uIGFuZCBXb3JrIERlZmluaXRpb24gdGhhdCBpcyB1c2VkIHRvIG9yZ2FuaXplIFRhc2tzIGludG8gcGFydHMgb3Igc3VidW5pdHMgb2Ygd29yay4gIFN0ZXBzIGluaGVyaXQgdGhlIHN1YlNlY3Rpb25zIGRlY29tcG9zaXRpb24gZnJvbSBTZWN0aW9uIGFuZCBjYW4gdGhlcmVmb3JlIGRlc2NyaWJlIFN1Yi1TdGVwcyBuZXN0ZWQgaW50byBTdGVwcy4KLUEgU3RlcCBkZXNjcmliZXMgYSBtZWFuaW5nZnVsIGFuZCBjb25zaXN0IHBhcnQgb2YgdGhlIG92ZXJhbGwgd29yayBkZXNjcmliZWQgZm9yIGEgVGFzay4gIFRoZSBjb2xsZWN0aW9uIG9mIFN0ZXBzIGRlZmluZWQgZm9yIGEgVGFzayByZXByZXNlbnRzIGFsbCB0aGUgd29yayB0aGF0IHNob3VsZCBiZSBkb25lIHRvIGFjaGlldmUgdGhlIG92ZXJhbGwgZGV2ZWxvcG1lbnQgZ29hbCBvZiB0aGUgVGFzay4gIE5vdCBhbGwgc3RlcHMgYXJlIG5lY2Vzc2FyaWx5IHBlcmZvcm1lZCBlYWNoIHRpbWUgYSBUYXNrIGlzIGludm9rZWQgaW4gYSBQcm9jZXNzIChzZWUgVGFzayBEZXNjcmlwdG9yKSwgc28gdGhleSBjYW4gYWxzbyBiZSBleHByZXNzZWQgaW4gdGhlIGZvcm0gb2YgYWx0ZXJuYXRlICdmbG93cycgb2Ygd29yay4gIERpZmZlcmVudCB3YXlzIG9mIGFjaGlldmluZyB0aGUgc2FtZSBkZXZlbG9wbWVudCBnb2FsIGNhbiB0aGVuIGJlICdhc3NlbWJsZWQnIGJ5IHNlbGVjdGluZyBkaWZmZXJlbnQgY29tYmluYXRpb25zIG9mIHN0ZXBzIHdoZW4gYXBwbHlpbmcgdGhlIFRhc2sgaW4gYSBQcm9jZXNzLiAgVHlwaWNhbCBraW5kcyBvZiBzdGVwcyBhIFRhc2sgYXV0aG9yIHNob3VsZCBjb25zaWRlciBhcmU6IFRoaW5raW5nIHN0ZXBzOiB3aGVyZSB0aGUgaW5kaXZpZHVhbCByb2xlcyB1bmRlcnN0YW5kIHRoZSBuYXR1cmUgb2YgdGhlIHRhc2ssIGdhdGhlcnMgYW5kIGV4YW1pbmVzIHRoZSBpbnB1dCBhcnRpZmFjdHMsIGFuZCBmb3JtdWxhdGVzIHRoZSBvdXRjb21lLiBQZXJmb3JtaW5nIHN0ZXBzOiB3aGVyZSB0aGUgaW5kaXZpZHVhbCByb2xlcyBjcmVhdGUgb3IgdXBkYXRlIHNvbWUgYXJ0aWZhY3RzLiBSZXZpZXdpbmcgc3RlcHM6IHdoZXJlIHRoZSBpbmRpdmlkdWFsIHJvbGVzIGluc3BlY3RzIHRoZSByZXN1bHRzIGFnYWluc3Qgc29tZSBjcml0ZXJpYS4KLTwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3l5emRTdS1zRWR1SDU5S1NIVjh2Z0EiIGdlbmVyYWw9Il95eHc3WXUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfeXl6ZFMtLXNFZHVINTlLU0hWOHZnQSIgZ2VuZXJhbD0iX3l5emRUTy1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3l5emRUTy1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9IldvcmtEZWZpbml0aW9uIiBpc0Fic3RyYWN0PSJ0cnVlIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeXl6ZFRlLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3l5emRUTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5Xb3JrIERlZmluaXRpb24gaXMgYW4gYWJzdHJhY3QgTWV0aG9kIEVsZW1lbnQgdGhhdCBnZW5lcmFsaXplcyBhbGwgZGVzY3JpcHRpb25zIG9mIHdvcmsgd2l0aGluIHRoZSBVbmlmaWVkIE1ldGhvZCBBcmNoaXRlY3R1cmUuICBUaGlzIHBhY2thZ2UgaW50cm9kdWNlcyB0d28gY29uY3JldGUgdHlwZXMgb2YgV29yayBEZWZpbml0aW9uczogVGFzayBhbmQgU3RlcC4gIFdvcmsgRGVmaW5pdGlvbnMgY2FuIGNvbnRhaW4gc2V0cyBvZiBwcmUtIGFuZCBwb3N0LWNvbmRpdGlvbnMgZGVmaW5pbmcgY29uc3RyYWludHMgdGhhdCBuZWVkIHRvIGJlIHZhbGlkIGJlZm9yZSB0aGUgZGVzY3JpYmVkIHdvcmsgY2FuIGJlZ2luIG9yIGJlZm9yZSBpdCBjYW4gYmUgZGVjbGFyZWQgYXMgZmluaXNoZWQuICBOb3RlIHRoYXQgZ2VuZXJhbCBvd25lZFJ1bGVzIGNhbiBiZSB1c2VkIHRvIGRlZmluZSBhZGRpdGlvbmFsIGNvbnN0cmFpbnRzIGFuZCBydWxlcyBmb3IgV29yayBEZWZpbml0aW9ucy4KLVdvcmsgRGVmaW5pdGlvbnMgcmVwcmVzZW50IGJlaGF2aW9yYWwgZGVzY3JpcHRpb25zIGZvciBkb2luZyB3b3JrLiAgVGhlc2UgYmVoYXZpb3JhbCBkZXNjcmlwdGlvbnMgYXJlIG5vdCBib3VuZCB0byBvbmUgc3BlY2lmaWMgY2xhc3NpZmllciwgYnV0IHJlcHJlc2VudCBhbiBhcmJpdHJhcnkgZGVmaW5pdGlvbiBvZiB3b3JrLiAgRm9yIGV4YW1wbGUsIGEgV29yayBEZWZpbml0aW9uIGNvdWxkIHJlcHJlc2VudCB3b3JrIHRoYXQgaXMgYmVpbmcgcGVyZm9ybWVkIGJ5IGEgc3BlY2lmaWMgUm9sZSAoZS5nLiBhIFJvbGUgcGVyZm9ybWluZyBhIHNwZWNpZmljIFRhc2sgb3IgU3RlcHMgb2YgYSBUYXNrKSwgYnkgbWFueSBSb2xlcyB3b3JraW5nIGluIGNsb3NlIGNvbGxhYm9yYXRpb24gKG1hbnkgUm9sZXMgYWxsIHdvcmtpbmcgdG9nZXRoZXIgb24gdGhlIHNhbWUgaW50ZXJkaXNjaXBsaW5hcnkgVGFzayksIG9yIGNvbXBsZXggd29yayB0aGF0IGlzIHBlcmZvcm1lZCB0aHJvdWdob3V0IHRoZSBsaWZlY3ljbGUgKGUuZy4gYSBwcm9jZXNzIGRlZmluaW5nIGEgYnJlYWtkb3duIHN0cnVjdHVyZSBmb3Igb3JnYW5pemluZyBsYXJnZXIgY29tcG9zaXRlIHVuaXRzIG9mIHdvcmsgcGVyZm9ybWVkIGJ5IG1hbnkgUm9sZXMgd29ya2luZyBpbiBjb2xsYWJvcmF0aW9uKS4KLTwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3l5emRUdS1zRWR1SDU5S1NIVjh2Z0EiIGdlbmVyYWw9Il95eHc3UWUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfeXl6ZFQtLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0icHJlY29uZGl0aW9uIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95eHc3Y3Utc0VkdUg1OUtTSFY4dmdBIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBhc3NvY2lhdGlvbj0iX3l5OU9KTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95eXpkVU8tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iMSIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95eXpkVWUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3l5emRVdS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9InBvc3Rjb25kaXRpb24iIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l4dzdjdS1zRWR1SDU5S1NIVjh2Z0EiIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiIGFzc29jaWF0aW9uPSJfeXk5T0otLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3l5emRVLS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIxIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3l5emRWTy1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il95eXpkVmUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJEZWZhdWx0X1ByaW1hcnlQZXJmb3JtZXIiIG1lbWJlckVuZD0iX3l5emRIdS1zRWR1SDU5S1NIVjh2Z0EgX3l5emRWLS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95eXpkVnUtc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeXl6ZFZlLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PlJvbGVzIGNhbiBiZSBkZWZpbmVkIHRvIHBlcmZvcm0gbWFueSBUYXNrcywgYnV0IGV2ZXJ5IFRhc2sgbWF5IGhhdmUgb25seSBvbmUgUm9sZSB0aGF0IGlzIGJ5IGRlZmF1bHQgdGhlIHByaW1hcnkgcGVyZm9ybWVyIG9mIHRoaXMgVGFzay48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il95eXpkVi0tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJwZXJmb3JtcyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXl6ZEd1LXNFZHVINTlLU0hWOHZnQSIgYXNzb2NpYXRpb249Il95eXpkVmUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeXl6ZFdPLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeXl6ZFdlLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3l5emRXdS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9IkRlZmF1bHRfTWFuZGF0b3J5SW5wdXRzIiBtZW1iZXJFbmQ9Il95eXpkWE8tc0VkdUg1OUtTSFY4dmdBIF95eXpkSWUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeXl6ZFctLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3l5emRXdS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5UaGlzIGFzc29jaWF0aW9uIHByb3ZpZGVzIGxpbmtzIHRvIHplcm8gb3IgbWFueSBkZWZpbml0aW9ucyBvZiBXb3JrIFByb2R1Y3RzIHRoYXQgYXJlIGRlZmluZWQgYXMgbWFuZGF0b3J5IGlucHV0cyBmb3IgcGVyZm9ybWluZyB0aGlzIFRhc2suPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfeXl6ZFhPLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0ibWFuZGF0b3J5SW5wdXRUbyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXl6ZEd1LXNFZHVINTlLU0hWOHZnQSIgYXNzb2NpYXRpb249Il95eXpkV3Utc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeXl6ZFhlLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeXl6ZFh1LXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3l5emRYLS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9IkRlZmF1bHRfT3V0cHV0cyIgbWVtYmVyRW5kPSJfeXl6ZFllLXNFZHVINTlLU0hWOHZnQSBfeXl6ZEpPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3l5emRZTy1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95eXpkWC0tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+VGhpcyBhc3NvY2lhdGlvbiBwcm92aWRlcyBsaW5rcyB0byB6ZXJvIG9yIG1hbnkgZGVmaW5pdGlvbnMgb2YgV29yayBQcm9kdWN0cyB0aGF0IGFyZSBkZWZpbmVkIGFzIG91dHB1dHMgb2YgdGhpcyBUYXNrLjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iX3l5emRZZS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9Im91dHB1dEZyb20iIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l5emRHdS1zRWR1SDU5S1NIVjh2Z0EiIGFzc29jaWF0aW9uPSJfeXl6ZFgtLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3l5emRZdS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3l5emRZLS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il95eXpkWk8tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJEZWZhdWx0X01vZGlmaWVzIiBtZW1iZXJFbmQ9Il95eXpkWnUtc0VkdUg1OUtTSFY4dmdBIF95eXpkRk8tc0VkdUg1OUtTSFY4dmdBIiBpc0Rlcml2ZWQ9InRydWUiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95eXpkWmUtc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeXl6ZFpPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PlRoaXMgYXNzb2NpYXRpb24gaXMgZGVyaXZlZCBmcm9tIHRoZSBmYWN0IHRoYXQgUm9sZXMgcGVyZm9ybSBUYXNrcyB0aGF0IGhhdmUgV29yayBQcm9kdWN0cyBvZiB0aGF0IHBhcnRpY3VsYXIgdHlwZSBhcyBvdXRwdXRzLiAgL21vZGlmaWVzIHByb3ZpZGVzIGFsbCB0aGUgdHlwZXMgb2YgV29yayBQcm9kdWN0cyB0aGF0IHRoZSBSb2xlIHByb2R1Y2VzIG9yIG1vZGlmaWVzIHZpYSBvbmUgb2YgdGhlIFRhc2tzIGRlZmluZWQgdG8gYmUgcGVyZm9ybWVkIGJ5IHRoZSBSb2xlLCBlaXRoZXIgYXMgcHJpbWFyeSBvciBhZGRpdGlvbmFsIHBlcmZvcm1lci48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il95eXpkWnUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJtb2RpZmllZEJ5IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95eXpkRWUtc0VkdUg1OUtTSFY4dmdBIiBpc0Rlcml2ZWQ9InRydWUiIGFzc29jaWF0aW9uPSJfeXl6ZFpPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3l5emRaLS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3l5emRhTy1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il95eXpkYWUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJEZWZhdWx0X1Jlc3BvbnNpYmxlIiBtZW1iZXJFbmQ9Il95eXpkYS0tc0VkdUg1OUtTSFY4dmdBIF95eXpkRi0tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeXl6ZGF1LXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3l5emRhZS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5SZXNwb25zaWJpbGl0eSBmb3IgYSB3b3JrIHByb2R1Y3QgaW5kaWNhdGVzIHRoZSByb2xlJ3Mgb3duZXJzaGlwIG9mIGFsbCBpbnN0YW5jZXMgb2YgdGhpcyB3b3JrIHByb2R1Y3QgdHlwZS4gIEZvciBleGFtcGxlLCB0aGUgcm9sZSByZXNwb25zaWJsZSBmb3IgYSB3b3JrIHByb2R1Y3QgYW5zd2VycyB0byBtYW5hZ2VtZW50IGFib3V0IGl0cyBxdWFsaXR5IHN0YXRlLiAgQmVpbmcgcmVzcG9uc2libGUgZm9yIHRoZSB3b3JrIHByb2R1Y3QgZG9lcyBub3QgbWVhbiB0aGF0IHRoZSByb2xlIGlzIHRoZSBvbmx5IG9uZSBtb2RpZnlpbmcgaXQsIGJ1dCBtYWtlcyB1bHRpbWF0ZSBkZWNpc2lvbnMgYWJvdXQgYWNjZXB0aW5nIG9yIHJlamVjdGluZyB0aGVzZSBtb2RpZmljYXRpb25zIHdoZW4gcmV2aWV3aW5nIHRoZXNlIG1vZGlmaWNhdGlvbnMuICBFdmVyeSB3b3JrIHByb2R1Y3QgaGFzIG5vbmUgb3Igb25lIHJvbGUgcmVzcG9uc2libGUgcm9sZS4gPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfeXl6ZGEtLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0icmVzcG9uc2libGVSb2xlIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95eXpkRWUtc0VkdUg1OUtTSFY4dmdBIiBhc3NvY2lhdGlvbj0iX3l5emRhZS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95eXpkYk8tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95eXpkYmUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkRW5kPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfeXk5T0VPLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iRGVmYXVsdF9BZGRpdGlvbmFsUGVyZm9ybWVyIiBtZW1iZXJFbmQ9Il95eTlPRXUtc0VkdUg1OUtTSFY4dmdBIF95eXpkSi0tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeXk5T0VlLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3l5OU9FTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5UaGlzIGFzc29jaWF0aW9uIGRlZmluZXMgYWRkaXRpb25hbCByb2xlcyB0aGF0IGJ5IGRlZmF1bHQgY2FuIGJlIGFzc2lnbmVkIHRvIGhlbHAgY29tcGxldGluZyBhIFRhc2suPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfeXk5T0V1LXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iaGVscHNQZXJmb3JtaW5nIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95eXpkR3Utc0VkdUg1OUtTSFY4dmdBIiBhc3NvY2lhdGlvbj0iX3l5OU9FTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95eTlPRS0tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95eTlPRk8tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkRW5kPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfeXk5T0ZlLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iQ29tcG9zaXRpb24iIG1lbWJlckVuZD0iX3l5emRPZS1zRWR1SDU5S1NIVjh2Z0EgX3l5emRQTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95eTlPRnUtc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeXk5T0ZlLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PkFydGlmYWN0IHR5cGVzIGNhbiBiZSBkZWZpbmVkIHRvIGJlIHBoeXNpY2FsbHkgY29tcG9zZWQgb2Ygb3RoZXIgYXJ0aWZhY3RzLiAgRm9yIGV4YW1wbGUsIGEgdXNlIGNhc2UgbW9kZWwgaXMgY29tcG9zZWQgb2YgdXNlIGNhc2VzIGFuZCBhY3RvcnMuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il95eTlPRi0tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJEZWZhdWx0RGVsaXZlcmVkV1AiIG1lbWJlckVuZD0iX3l5OU9HZS1zRWR1SDU5S1NIVjh2Z0EgX3l5emRRdS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95eTlPR08tc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeXk5T0YtLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PlRoaXMgYXNzb2NpYXRpb24gZGVmaW5lcyB0aGUgZGVmYXVsdCBwYXJ0cyBvZiBhIGRlbGl2ZXJhYmxlLCBpLmUuIHRoZSB0eXBlcyBvZiB3b3JrIHByb2R1Y3RzIGEgRGVsaXZlcmFibGUgY29tcHJpc2VzIG9mLiAgVGhpcyBhZ2dyZWdhdGlvbiBjYW4gYmUgb3ZlcnJpZGRlbiBpbiBhIFByb2Nlc3MuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfeXk5T0dlLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iX2RlbGl2ZXJhYmxlIiB2aXNpYmlsaXR5PSJwcml2YXRlIiB0eXBlPSJfeXl6ZFAtLXNFZHVINTlLU0hWOHZnQSIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iX3l5OU9GLS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95eTlPR3Utc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95eTlPRy0tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkRW5kPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfeXk5T0hPLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iRGVmYXVsdF9PcHRpb25hbElucHV0cyIgbWVtYmVyRW5kPSJfeXl6ZEt1LXNFZHVINTlLU0hWOHZnQSBfeXk5T0h1LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3l5OU9IZS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95eTlPSE8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+VGhpcyBhc3NvY2lhdGlvbiBwcm92aWRlcyBsaW5rcyB0byB6ZXJvIG9yIG1hbnkgZGVmaW5pdGlvbnMgb2YgV29yayBQcm9kdWN0cyB0aGF0IGFyZSBkZWZpbmVkIGFzIG9wdGlvbmFsIGlucHV0cyBmb3IgcGVyZm9ybWluZyB0aGlzIFRhc2suPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfeXk5T0h1LXNFZHVINTlLU0hWOHZnQSIgbmFtZT0ib3B0aW9uYWxJbnB1dFRvIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95eXpkR3Utc0VkdUg1OUtTSFY4dmdBIiBhc3NvY2lhdGlvbj0iX3l5OU9ITy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95eTlPSC0tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95eTlPSU8tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkRW5kPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfeXk5T0llLXNFZHVINTlLU0hWOHZnQSIgbWVtYmVyRW5kPSJfeXl6ZExlLXNFZHVINTlLU0hWOHZnQSBfeXk5T0ktLXNFZHVINTlLU0hWOHZnQSIgaXNEZXJpdmVkPSJ0cnVlIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeXk5T0l1LXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3l5OU9JZS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5UaGlzIGRlcml2ZWQgYXNzb2NpYXRpb24gaXMgYSBzaG9ydGN1dCBmb3IgbmF2aWdhdGlvbiBhbG9uZyB0aGUgYXNzb2NpYXRpb24gcHJvcGVydGllcyBDb250ZW50RWxlbWVudC5wcmVzZW50YXRpb24uc2VjdGlvbnMuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfeXk5T0ktLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iX3Rhc2siIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l5emRHdS1zRWR1SDU5S1NIVjh2Z0EiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il95eTlPSWUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il95eTlPSk8tc0VkdUg1OUtTSFY4dmdBIiBtZW1iZXJFbmQ9Il95eXpkVC0tc0VkdUg1OUtTSFY4dmdBIF95eTlPSnUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeXk5T0plLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3l5OU9KTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5UaGlzIGNvbXBvc2l0aW9uIGFzc29jaWF0aW9uIGFkZHMgYW4gb3B0aW9uYWwgcHJlLWNvbmRpdGlvbiB0byBhIFdvcmsgRGVmaW5pdGlvbi4gIEEgcHJlLWNvbmRpdGlvbiBkZWZpbmVzIGFueSBraW5kIG9mIGNvbnN0cmFpbnQgdGhhdCBtdXN0IGV2YWx1YXRlIHRvIHRydWUgYmVmb3JlIHRoZSB3b3JrIGRlc2NyaWJlZCBmb3IgdGhlIFdvcmsgRGVmaW5pdGlvbiBjYW4gc3RhcnQuIEZvciBleGFtcGxlLCBhIHByZS1jb25kaXRpb24gZm9yIGEgVGFzayBjb3VsZCBkZWZpbmUgdGhhdCBhbiBpbnB1dCBXb3JrIFByb2R1Y3QgbmVlZHMgdG8gYmUgaW4gYSBzcGVjaWZpYyBzdGF0ZSBvciB0aGF0IG90aGVyIHJlbGF0ZWQgd29yayBtdXN0IGJlIGluIGEgY2VydGFpbiBzdGF0ZSAoZS5nLiAnSW5wdXQgZG9jdW1lbnQgWCBoYXMgYmVlbiByZXZpZXdlZCBhbmQgc2lnbmVkIGJ5IGN1c3RvbWVyIEFORCBUYXNrICZxdW90O01hbmFnZW1lbnQgUmV2aWV3JnF1b3Q7IGlzIGNvbXBsZXRlJykgYmVmb3JlIHRoZSBUYXNrIGNhbiBiZWdpbi4KLTwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iX3l5OU9KdS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9Il93b3JrRGVmaW5pdGlvbiIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXl6ZFRPLXNFZHVINTlLU0hWOHZnQSIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iX3l5OU9KTy1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3l5OU9KLS1zRWR1SDU5S1NIVjh2Z0EiIG1lbWJlckVuZD0iX3l5emRVdS1zRWR1SDU5S1NIVjh2Z0EgX3l5OU9LZS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95eTlPS08tc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeXk5T0otLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PlRoaXMgY29tcG9zaXRpb24gYXNzb2NpYXRpb24gYWRkcyBhbiBvcHRpb25hbCBwb3N0LWNvbmRpdGlvbiB0byBhIFdvcmsgRGVmaW5pdGlvbi4gIEEgcG9zdC1jb25kaXRpb24gZGVmaW5lcyBhbnkga2luZCBvZiBjb25zdHJhaW50IHRoYXQgbXVzdCBldmFsdWF0ZSB0byB0cnVlIGJlZm9yZSB0aGUgd29yayBkZXNjcmliZWQgZm9yIHRoZSBXb3JrIERlZmluaXRpb24gY2FuIGJlIGRlY2xhcmVkIGNvbXBsZXRlZCBvciBmaW5pc2hlZCBhbmQgd2hpY2ggb3RoZXIgV29yayBEZWZpbml0aW9ucyBtaWdodCBkZXBlbmQgdXBvbiAoZS5nLiBmb3IgdGhlaXIgcHJlLWNvbmRpdGlvbnMpLiAgRm9yIGV4YW1wbGUsIGEgcG9zdC1jb25kaXRpb24gZm9yIGEgVGFzayBjb3VsZCBkZWZpbmUgdGhhdCBhIHdvcmsgcHJvZHVjdCBkZWZpbmVkIHRvIGJlIHRoZSBvdXRwdXQgbXVzdCBiZSBpbiBhIHNwZWNpZmljIHN0YXRlIGJlZm9yZSB0aGUgVGFzayBjYW4gZW5kIChlLmcuICdVc2UgQ2FzZSBtdXN0IGJlIGluIHN0YXRlIGZ1bGx5IGRlc2NyaWJlZCBhbmQgcmV2aWV3ZWQgYnkgU3lzdGVtIEFuYWx5c3QnKS48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il95eTlPS2Utc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJfd29ya0RlZmluaXRpb24iIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l5emRUTy1zRWR1SDU5S1NIVjh2Z0EiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il95eTlPSi0tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il95ejEtNGUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJDb25jZXB0Ij4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeXoxLTR1LXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3l6MS00ZS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5BIENvbmNlcHQgaXMgYSBzcGVjaWZpYyB0eXBlIG9mIGd1aWRhbmNlIHRoYXQgb3V0bGluZXMga2V5IGlkZWFzIGFzc29jaWF0ZWQgd2l0aCBiYXNpYyBwcmluY2lwbGVzIHVuZGVybHlpbmcgdGhlIHJlZmVyZW5jZWQgaXRlbS4gQ29uY2VwdHMgbm9ybWFsbHkgYWRkcmVzcyBtb3JlIGdlbmVyYWwgdG9waWNzIHRoYW4gR3VpZGVsaW5lcyBhbmQgc3BhbiBhY3Jvc3Mgc2V2LWVyYWwgd29yayBwcm9kdWN0IGFuZC9vciB0YXNrcy9hY3Rpdml0aWVzLjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3l6MS00LS1zRWR1SDU5S1NIVjh2Z0EiIGdlbmVyYWw9Il95eXpkTS0tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il95ejEtNU8tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJDaGVja2xpc3QiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95ejEtNWUtc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeXoxLTVPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PkEgQ2hlY2tsaXN0IGlzIGEgc3BlY2lmaWMgdHlwZSBvZiBndWlkYW5jZSB0aGF0IGlkZW50aWZpZXMgYSBzZXJpZXMgb2YgaXRlbXMgdGhhdCBuZWVkIHRvIGJlIGNvbXBsZXRlZCBvciB2ZXJpLWZpZWQuICBDaGVja2xpc3RzIGFyZSBvZnRlbiB1c2VkIGluIHJldmlld3Mgc3VjaCBhcyB3YWxrdGhyb3VnaHMgb3IgaW5zcGVjdGlvbnMuIDwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3l6MS01dS1zRWR1SDU5S1NIVjh2Z0EiIGdlbmVyYWw9Il95eXpkTS0tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il95ejEtNS0tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJFeGFtcGxlIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeXoxLTZPLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3l6MS01LS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5BbiBFeGFtcGxlIGlzIGEgc3BlY2lmaWMgdHlwZSBvZiBHdWlkYW5jZSB0aGF0IHJlcHJlc2VudHMgYSB0eXBpY2FsLCBwYXJ0aWFsbHkgY29tcGxldGVkLCBzYW1wbGUgaW5zdGFuY2Ugb2Ygb25lIG9yIG1vcmUgd29yayBwcm9kdWN0cyBvciBzY2VuYXJpbyBsaWtlIGRlc2NyaXB0aW9ucyBvZiBob3cgVGFzayBtYXkgYmUgcGVyZm9ybWVkLiBFeGFtcGxlcyBjYW4gYmUgcmVsYXRlZCB0byBXb3JrIFByb2R1Y3RzIGFzIHdlbGwgYXMgVGFza3MgdGhhdCBwcm9kdWNlIHRoZW0gYXMgd2VsbCBhcyBhbnkgb3RoZXIgQ29udGVudCBFbGVtZW50LjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3l6MS02ZS1zRWR1SDU5S1NIVjh2Z0EiIGdlbmVyYWw9Il95eXpkTS0tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il95ejEtNnUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJHdWlkZWxpbmUiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95ejEtNi0tc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeXoxLTZ1LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PkEgR3VpZGVsaW5lIGlzIGEgc3BlY2lmaWMgdHlwZSBvZiBndWlkYW5jZSB0aGF0IHByb3ZpZGVzIGFkZGl0aW9uYWwgZGV0YWlsIG9uIGhvdyB0byBwZXJmb3JtIGEgcGFydGljdWxhciB0YXNrIG9yIGdyb3VwaW5nIG9mIHRhc2tzIChlLmcuIGdyb3VwZWQgdG9nZXRoZXIgYXMgYWN0aXZpdGllcykgb3IgdGhhdCBwcm92aWRlcyBhZGRpdGlvbmFsIGRldGFpbCwgcnVsZXMsIGFuZCByZWNvbW1lbmRhdGlvbnMgb24gd29yayBwcm9kdWN0cyBhbmQgdGhlaXIgcHJvcGVydGllcy4gIEFtb25nc3Qgb3RoZXJzLCBpdCBjYW4gaW5jbHVkZSBkZXRhaWxzIGFib3V0IGJlc3QgcHJhY3RpY2VzIGFuZCBkaWZmZXJlbnQgYXBwcm9hY2hlcyBmb3IgZG9pbmcgd29yaywgaG93IHRvIHVzZSBwYXJ0aWN1bGFyIHR5cGVzIG9mIHdvcmsgcHJvZHVjdHMsIGluZm9ybWF0aW9uIG9uIGRpZmZlcmVudCBzdWJ0eXBlcyBhbmQgdmFyaWFudHMgb2YgdGhlIHdvcmsgcHJvZHVjdCBhbmQgaG93IHRoZXkgZXZvbHZlIHRocm91Z2hvdXQgYSBsaWZlY3ljbGUsIGRpc2N1c3Npb25zIG9uIHNraWxscyB0aGUgcGVyZm9ybWluZyByb2xlcyBzaG91bGQgYWNxdWlyZSBvciBpbXByb3ZlIHVwb24sIG1lYXN1cmVtZW50cyBmb3IgcHJvZ3Jlc3MgYW5kIG1hdHVyaXR5LCBldGMuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfeXoxLTdPLXNFZHVINTlLU0hWOHZnQSIgZ2VuZXJhbD0iX3l5emRNLS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3l6MS03ZS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9IlJlcG9ydCI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3l6MS03dS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95ejEtN2Utc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+QSBSZXBvcnQgaXMgYSBwcmVkZWZpbmVkIHRlbXBsYXRlIG9mIGEgcmVzdWx0IHRoYXQgaXMgZ2VuZXJhdGVkIG9uIHRoZSBiYXNpcyBvZiBvdGhlciB3b3JrIHByb2R1Y3RzIGFzIGFuIG91dHB1dCBmcm9tIHNvbWUgZm9ybSBvZiB0b29sIGF1dG9tYXRpb24uIEFuIGV4YW1wbGUgZm9yIGEgcmVwb3J0IHdvdWxkIGJlIGEgdXNlIGNhc2UgbW9kZWwgc3VydmV5LCB3aGljaCBpcyBnZW5lcmF0ZWQgYnkgZXh0cmFjdGluZyBkaWFncmFtIGluZm9ybWF0aW9uIGZyb20gYSBncmFwaGljYWwgbW9kZWwgYW5kIHRleHR1YWwgaW5mb3JtYXRpb24gZnJvbSBkb2N1bWVudHMgYW5kIGNvbWJpbmVzIHRoZXNlIHR3byB0eXBlcyBvZiBpbmZvcm1hdGlvbiBpbnRvIGEgcmVwb3J0LjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3l6MS03LS1zRWR1SDU5S1NIVjh2Z0EiIGdlbmVyYWw9Il95eXpkTS0tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il95ejEtOE8tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJUZW1wbGF0ZSI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3l6MS04ZS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95ejEtOE8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+QSBUZW1wbGF0ZSBpcyBhIHNwZWNpZmljIHR5cGUgb2YgZ3VpZGFuY2UgdGhhdCBwcm92aWRlcyBmb3IgYSB3b3JrIHByb2R1Y3QgYSBwcmUtZGVmaW5lZCB0YWJsZSBvZiBjb250ZW50cywgc2VjdGlvbnMsIHBhY2thZ2VzLCBhbmQvb3IgaGVhZGluZ3MsIGEgc3RhbmRhcmRpemVkIGZvcm1hdCwgYXMgd2VsbCBhcyBkZXNjcmlwdGlvbnMgaG93IHRoZSBzZWN0aW9ucyBhbmQgcGFja2FnZXMgYXJlIHN1cHBvc2VkIHRvIGJlIHVzZWQgYW5kIGNvbXBsZXRlZC4gVGVtcGxhdGVzIGNhbm5vdCBvbmx5IGJlIHByb3ZpZGVkIGZvciBkb2N1bWVudHMsIGJ1dCBhbHNvIGZvciBjb25jZXB0dWFsIG1vZGVscyBvciBwaHlzaWNhbCBkYXRhIHN0b3Jlcy48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il95ejEtOHUtc0VkdUg1OUtTSFY4dmdBIiBnZW5lcmFsPSJfeXl6ZE0tLXNFZHVINTlLU0hWOHZnQSIvPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfeXoxLTgtLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iU3VwcG9ydGluZ01hdGVyaWFsIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeXoxLTlPLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3l6MS04LS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5TdXBwb3J0aW5nIE1hdGVyaWFscyBpcyBjYXRjaGFsbCBmb3Igb3RoZXIgdHlwZXMgb2YgZ3VpZGFuY2Ugbm90IHNwZWNpZmljYWxseSBkZWZpbmVkIGVsc2V3aGVyZS4gSXQgY2FuIGJlIHJlbGF0ZWQgdG8gYWxsIGtpbmRzIG9mIENvbnRlbnQgRWxlbWVudHMsIGkuZS4gaW5jbHVkaW5nIG90aGVyIGd1aWRhbmNlIGVsZW1lbnRzLjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3l6MS05ZS1zRWR1SDU5S1NIVjh2Z0EiIGdlbmVyYWw9Il95eXpkTS0tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il95ejEtOXUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJUb29sTWVudG9yIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeXoxLTktLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3l6MS05dS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5BIFRvb2wgTWVudG9yIGlzIGEgc3BlY2lmaWMgdHlwZSBvZiBndWlkYW5jZSB0aGF0IHNob3dzIGhvdyB0byB1c2UgYSBzcGVjaWZpYyB0b29sIHRvIGFjY29tcGxpc2ggc29tZSBwaWVjZSBvZiB3b3JrIGEgV29yayBQcm9kdWN0IGVpdGhlciBpbiB0aGUgY29udGV4dCBvZiBvciBpbmRlcGVuZGVudCBmcm9tIGEgVGFzayBvciBBY3Rpdml0eS48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il95ejEtLU8tc0VkdUg1OUtTSFY4dmdBIiBnZW5lcmFsPSJfeXl6ZE0tLXNFZHVINTlLU0hWOHZnQSIvPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfeXoxLS1lLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iV2hpdGVwYXBlciI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3l6MS0tdS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95ejEtLWUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+V2hpdGVwYXBlcnMgYXJlIGEgc3BlY2lhbCBDb25jZXB0IGd1aWRhbmNlIHRoYXQgaGF2ZSBiZWVuIGV4dGVybmFsbHkgcmV2aWV3ZWQgb3IgcHVibGlzaGVkIGFuZCBjYW4gYmUgcmVhZCBhbmQgdW5kZXJzdG9vZCBpbiBpc29sYXRpb24gb2Ygb3RoZXIgY29udGVudCBlbGVtZW50cyBhbmQgZ3VpZGFuY2UuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfeXoxLS0tLXNFZHVINTlLU0hWOHZnQSIgZ2VuZXJhbD0iX3l6MS00ZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3l6MS1fTy1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9IlRlcm1EZWZpbml0aW9uIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeXoxLV9lLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3l6MS1fTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5UZXJtRGVmaW5pdGlvbnMgZGVmaW5lIGNvbmNlcHRzIGFuZCBhcmUgdXNlZCB0byBidWlsZCB1cCB0aGUgR2xvc3NhcnkuIFRoZXkgYXJlIG5vdCBkaXJlY3RseSByZWxhdGVkIHRvIENvbnRlbnRFbGVtZW50cywgYnV0IHRoZWlyIHJlbGF0aW9uc2hpcCBpcyBiZWluZyBkZXJpdmVkIHdoZW4gdGhlIFRlcm0gaXMgdXNlZCBpbiB0aGUgQ29udGVudEVsZW1lbnRzIGRlc2NyaXB0aW9uIHRleHQuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfeXoxLV91LXNFZHVINTlLU0hWOHZnQSIgZ2VuZXJhbD0iX3l5emRNLS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3l5emRNTy1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9IldvcmtQcm9kdWN0IiBpc0Fic3RyYWN0PSJ0cnVlIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeXl6ZE1lLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3l5emRNTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5Xb3JrIFByb2R1Y3QgaXMgYW4gYWJzdHJhY3QgY2xhc3Mgd2hpY2ggcHJvdmlkZXMgYSBnZW5lcmFsaXphdGlvbiBmb3IgdGhlIGNvbnRlbnQgZWxlbWVudCB0eXBlcyBBcnRpZmFjdCwgT3V0Y29tZSwgYW5kIERlbGl2ZXJhYmxlLiAgVGhlIG1ldGEtbW9kZWwgY2xhc3MgV29yayBQcm9kdWN0IGFjdHVhbGx5IHJlcHJlc2VudHMgd29yayBwcm9kdWN0IHR5cGVzLCBpLmUuIGFuIGluc3RhbmNlIG9mIFdvcmsgUHJvZHVjdCBpcyBhIGRlc2NyaXB0aW9uIG9mIGEgc3BlY2lmaWMgdHlwZSBvZiB3b3JrIHByb2R1Y3QgYW5kIG5vdCBhbiBpbmRpdmlkdWFsIHdvcmsgcHJvZHVjdCBpbnN0YW5jZS4gIEhvd2V2ZXIsIGZvciBzaW1wbGljaXR5IHJlYXNvbnMgYW5kIGJlY2F1c2Ugb2YgbG93IHJpc2sgb2YgbWlzaW50ZXJwcmV0YXRpb24gd2UgZGlkIG5vdCBhcHBlbmQgdGhlIHdvcmQgJ3R5cGUnIHRvIGV2ZXJ5IG1ldGEtY2xhc3MuCi1BIHdvcmsgcHJvZHVjdCBpcyBhbiBhYnN0cmFjdGlvbiBmb3IgZGVzY3JpcHRpb25zIG9mIGNvbnRlbnQgZWxlbWVudHMgdGhhdCBhcmUgdXNlZCB0byBkZWZpbmUgYW55dGhpbmcgdXNlZCwgcHJvZHVjZWQsIG9yIG1vZGlmaWVkIGJ5IGEgdGFzay4KLTwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95ejFfQ08tc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeXl6ZE1PLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PlRoaXMgaXMgdGhlIEd1aWRhbmNlIFR5cGVzIHBhY2thZ2UncyBleHRlbnNpb24gb2YgV29yayBQcm9kdWN0IChkZWZpbmVkIGluIENvbnRlbnQgRWxlbWVudHMpIHByb3ZpZGluZyBhZGRpdG9uYWwgYXNzb2NpYXRpb25zLjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3l5emRNdS1zRWR1SDU5S1NIVjh2Z0EiIGdlbmVyYWw9Il95eHc3Vk8tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfeXoxX0NlLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0icmVwb3J0cyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXoxLTdlLXNFZHVINTlLU0hWOHZnQSIgYXNzb2NpYXRpb249Il95el93RnUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeXoxX0N1LXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeXoxX0MtLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il95ejFfRE8tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJ0ZW1wbGF0ZXMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l6MS04Ty1zRWR1SDU5S1NIVjh2Z0EiIGFzc29jaWF0aW9uPSJfeXpfd0lPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3l6MV9EZS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3l6MV9EdS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfeXoxX0QtLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0idG9vbE1lbnRvcnMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l6MS05dS1zRWR1SDU5S1NIVjh2Z0EiIGFzc29jaWF0aW9uPSJfeTBKZzZ1LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3l6MV9FTy1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3l6MV9FZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfeXoxX0V1LXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95el92Xy0tc0VkdUg1OUtTSFY4dmdBIiBhc3NvY2lhdGlvbj0iX3kwSmc4dS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95ejFfRS0tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95ejFfRk8tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfeXl6ZEd1LXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iVGFzayI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3l5emRHLS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95eXpkR3Utc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+QSBUYXNrIGlzIGEgY29udGVudCBlbGVtZW50IHRoYXQgZGVzY3JpYmVzIHdvcmsgYmVpbmcgcGVyZm9ybWVkIGJ5IFJvbGVzLiAgSXQgZGVmaW5lcyBvbmUgZGVmYXVsdCBwZXJmb3JtaW5nIFJvbGUgYXMgd2VsbCBhcyBtYW55IGFkZGl0aW9uYWwgcGVyZm9ybWVycy4gIEEgVGFzayBpcyBhc3NvY2lhdGVkIHRvIGlucHV0IGFuZCBvdXRwdXQgd29yayBwcm9kdWN0cy4gIElucHV0cyBhcmUgZGlmZmVyZW50aWF0ZWQgaW4gbWFuZGF0b3J5IHZlcnN1cyBvcHRpb25hbCBpbnB1dHMuICBUaGUgYXNzb2NpYXRpb25zIHRvIFdvcmsgUHJvZHVjdHMgYXJlIG5vdCBpbnN0YW50aWF0YWJsZS92YXJpYWJsZS1saWtlIHBhcmFtZXRlcnMuICBUaGV5IHJhdGhlciBleHByZXNzIChoeXBlci0pbGlua3MgdG8gdGhlIGRlc2NyaXB0aW9ucyBvZiB0aGUgd29yayBwcm9kdWN0cyB0eXBlcyB0aGF0IGFyZSByZWxhdGVkIHRvIHRoZSBUYXNrIGFzIGlucHV0cyBhbmQgb3V0cHV0cy4gIEluIG90aGVyIHdvcmRzLCB0aGVzZSBhc3NvY2lhdGlvbnMgYXJlIG5vdCBpbnRlbmRlZCB0byBiZSB1c2VkIHRvIGNhcHR1cmUgd2hpY2ggY29uY3JldGUgaW5zdGFuY2VzIHdpbGwgYmUgcGFzc2VkIHdoZW4gaW5zdGFudGlhdGluZyB0aGUgbWV0aG9kIGluIGEgcHJvamVjdC4gIEFsbCBvZiB0aGUgVGFzaydzIGRlZmF1bHQgYXNzb2NpYXRpb25zIGNhbiBiZSBvdmVycmlkZGVuIGluIGFuIGFjdHVhbCBwcm9jZXNzIGRlZmluaXRpb24uCi1BIFRhc2sgZGVzY3JpYmVzIGFuIGFzc2lnbmFibGUgdW5pdCBvZiB3b3JrLiAgRXZlcnkgVGFzayBpcyBhc3NpZ25lZCB0byBzcGVjaWZpYyBSb2xlcy4gIFRoZSBncmFudWxhcml0eSBvZiBhIFRhc2sgaXMgZ2VuZXJhbGx5IGEgZmV3IGhvdXJzIHRvIGEgZmV3IGRheXMuICBJdCB1c3VhbGx5IGFmZmVjdHMgb25lIG9yIG9ubHkgYSBzbWFsbCBudW1iZXIgb2Ygd29yayBwcm9kdWN0cy4gQSBUYXNrIGlzIHVzZWQgYXMgYW4gZWxlbWVudCBvZiBkZWZpbmluZyBhIHByb2Nlc3MuIFRhc2tzIGFyZSBmdXJ0aGVyIHVzZWQgZm9yIHBsYW5uaW5nIGFuZCB0cmFja2luZyBwcm9ncmVzczsgdGhlcmVmb3JlLCBpZiB0aGV5IGFyZSBkZWZpbmVkIHRvbyBmaW5lLWdyYWluZWQsIHRoZXkgd2lsbCBiZSBuZWdsZWN0ZWQsIGFuZCBpZiB0aGV5IGFyZSB0b28gbGFyZ2UsIHByb2dyZXNzIHdvdWxkIGhhdmUgdG8gYmUgZXhwcmVzc2VkIGluIHRlcm1zIG9mIGEgVGFzaydzIHBhcnRzIChlLmcuIFN0ZXBzLCB3aGljaCBpcyBub3QgcmVjb21tZW5kZWQpLiAKLUEgVGFzayBoYXMgYSBjbGVhciBwdXJwb3NlIGluIHdoaWNoIHRoZSBwZXJmb3JtaW5nIHJvbGVzIGFjaGlldmUgYSB3ZWxsIGRlZmluZWQgZ29hbC4gIEl0IHByb3ZpZGVzIGNvbXBsZXRlIHN0ZXAtYnktc3RlcCBleHBsYW5hdGlvbnMgb2YgZG9pbmcgYWxsIHRoZSB3b3JrIHRoYXQgbmVlZHMgdG8gYmUgZG9uZSB0byBhY2hpZXZlIHRoaXMgZ29hbC4gIFRoaXMgZGVzY3JpcHRpb24gaXMgY29tcGxldGUsIGluZGVwZW5kZW50IG9mIHdoZW4gaW4gYSBwcm9jZXNzIGxpZmVjeWNsZSB0aGUgd29yayB3b3VsZCBhY3R1YWxseSBiZSBkb25lLiAgSXQgdGhlcmVmb3JlIGRvZXMgbm90IGRlc2NyaWJlIHdoZW4geW91IGRvIHdoYXQgd29yayBhdCB3aGF0IHBvaW50IG9mIHRpbWUsIGJ1dCBkZXNjcmliZXMgYWxsIHRoZSB3b3JrIHRoYXQgZ2V0cyBkb25lIHRocm91Z2hvdXQgdGhlIGRldmVsb3BtZW50IGxpZmVjeWNsZSB0aGF0IGNvbnRyaWJ1dGVzIHRvIHRoZSBhY2hpZXZlbWVudCBvZiB0aGlzIGdvYWwuICBXaGVuIHRoZSBUYXNrIGlzIGJlaW5nIGFwcGxpZWQgaW4gYSBwcm9jZXNzIHRoZW4gdGhpcyBwcm9jZXNzIGFwcGxpY2F0aW9uIChkZWZpbmVkIGFzIFRhc2sgRGVzY3JpcHRvcikgcHJvdmlkZXMgdGhlIGluZm9ybWF0aW9uIG9mIHdoaWNoIHBpZWNlcyBvZiB0aGUgVGFzayB3aWxsIGFjdHVhbGx5IGJlIHBlcmZvcm1lZCBhdCBhbnkgcGFydGljdWxhciBwb2ludCBpbiB0aW1lLiBUaGlzIGFzc3VtZXMgdGhhdCB0aGUgVGFzayB3aWxsIGJlIHBlcmZvcm1lZCBpbiB0aGUgcHJvY2VzcyBvdmVyIGFuZCBvdmVyIGFnYWluLCBidXQgZWFjaCB0aW1lIHdpdGggYSBzbGlnaHRseSBkaWZmZXJlbnQgZW1waGFzaXMgb24gZGlmZmVyZW50IHN0ZXBzIG9yIGFzcGVjdHMgb2YgdGhlIHRhc2sgZGVzY3JpcHRpb24uIAotRm9yIGV4YW1wbGUsIGEgVGFzayBzdWNoIGFzICZxdW90O0RldmVsb3AgVXNlIENhc2UgTW9kZWwmcXVvdDsgZGVzY3JpYmVzIGFsbCB0aGUgd29yayB0aGF0IG5lZWRzIHRvIGJlIGRvbmUgdG8gZGV2ZWxvcCBhIGNvbXBsZXRlIHVzZSBjYXNlIG1vZGVsLiBUaGlzIHdvdWxkIGNvbXByaXNlIG9mIHRoZSBpZGVudGlmaWNhdGlvbiBhbmQgbmFtaW5nIG9mIHVzZSBjYXNlcyBhbmQgYWN0b3JzLCB0aGUgd3JpdGluZyBvZiBhIGJyaWVmIGRlc2NyaXB0aW9uLCB0aGUgbW9kZWxpbmcgb2YgdXNlIGNhc2VzIGFuZCB0aGVpciByZWxhdGlvbnNoaXBzIGluIGRpYWdyYW1zLCB0aGUgZGV0YWlsZWQgZGVzY3JpcHRpb24gb2YgYSBiYXNpYyBmbG93LCB0aGUgZGV0YWlsZWQgZGVzY3JpcHRpb24gb2YgYWx0ZXJuYXRpdmVzIGZsb3dzLCBwZXJmb3JtaW5nIG9mIHdhbGt0aHJvdWdocyB3b3Jrc2hvcHMgYW5kIHJldmlld3MsIGV0Yy4gIEFsbCBvZiB0aGVzZSBwYXJ0cyBjb250cmlidXRlIHRvIHRoZSBkZXZlbG9wbWVudCBnb2FsIG9mIGRldmVsb3BpbmcgdGhlIHVzZSBjYXNlIG1vZGVsLCBidXQgdGhlIHBhcnRzIHdpbGwgYmUgcGVyZm9ybWVkIGF0IGRpZmZlcmVudCBwb2ludHMgaW4gdGltZSBpbiBhIHByb2Nlc3MuICBJZGVudGlmaWNhdGlvbiwgbmFtaW5nLCBhbmQgYnJpZWYgZGVzY3JpcHRpb25zIHdvdWxkIGJlIHBlcmZvcm1lZCBlYXJseSBpbiBhIHR5cGljYWwgZGV2ZWxvcG1lbnQgcHJvY2VzcyB2ZXJzdXMgdGhlIHdyaXRpbmcgb2YgZGV0YWlsZWQgYWx0ZXJuYXRpdmUgZmxvd3Mgd2hpY2ggd291bGQgYmUgcGVyZm9ybWVkIG11Y2ggbGF0ZXIuICBBbGwgdGhlc2UgcGFydHMgb3Igc3RlcHMgd2l0aGluIHRoZSBzYW1lIFRhc2sgZGVmaW5lIHRoZSAmcXVvdDttZXRob2QmcXVvdDsgb2YgRGV2ZWxvcGluZyBhIFVzZSBDYXNlIE1vZGVsLiAgQXBwbHlpbmcgc3VjaCBhIG1ldGhvZCBpbiBhIGxpZmVjeWNsZSAoaS5lLiBpbiBhIHByb2Nlc3MpIGlzIGRlZmluaW5nIHdoaWNoIHN0ZXBzIGFyZSBkb25lIHdoZW4gZ29pbmcgZnJvbSBvbmUgaXRlcmF0aW9uIHRvIHRoZSBuZXh0LgotPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3l6MV9GZS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95eXpkR3Utc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+VGhpcyBpcyB0aGUgR3VpZGFuY2UgVHlwZXMgcGFja2FnZSdzIGV4dGVuc2lvbiBvZiBUYXNrIChkZWZpbmVkIGluIENvbnRlbnQgRWxlbWVudHMpIHByb3ZpZGluZyBhZGRpdGlvbmFsIGFzc29jaWF0aW9ucy48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il95eXpkSE8tc0VkdUg1OUtTSFY4dmdBIiBnZW5lcmFsPSJfeXh3N1ZPLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3l5emRIZS1zRWR1SDU5S1NIVjh2Z0EiIGdlbmVyYWw9Il95eXpkVE8tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfeXl6ZEh1LXNFZHVINTlLU0hWOHZnQSIgbmFtZT0icGVyZm9ybWVkQnkiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l5emRFZS1zRWR1SDU5S1NIVjh2Z0EiIGFzc29jaWF0aW9uPSJfeXl6ZFZlLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3l5emRILS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIxIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3l5emRJTy1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfeXl6ZEllLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0ibWFuZGF0b3J5SW5wdXQiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l5emRNTy1zRWR1SDU5S1NIVjh2Z0EiIGFzc29jaWF0aW9uPSJfeXl6ZFd1LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3l5emRJdS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3l5emRJLS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfeXl6ZEpPLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0ib3V0cHV0IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95eXpkTU8tc0VkdUg1OUtTSFY4dmdBIiBhc3NvY2lhdGlvbj0iX3l5emRYLS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95eXpkSmUtc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95eXpkSnUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3l5emRKLS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9ImFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95eXpkRWUtc0VkdUg1OUtTSFY4dmdBIiBhc3NvY2lhdGlvbj0iX3l5OU9FTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95eXpkS08tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95eXpkS2Utc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3l5emRLdS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9Im9wdGlvbmFsSW5wdXQiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l5emRNTy1zRWR1SDU5S1NIVjh2Z0EiIGFzc29jaWF0aW9uPSJfeXk5T0hPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3l5emRLLS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3l5emRMTy1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfeXl6ZExlLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0ic3RlcHMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l5emRTTy1zRWR1SDU5S1NIVjh2Z0EiIGlzRGVyaXZlZD0idHJ1ZSIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgYXNzb2NpYXRpb249Il95eTlPSWUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeXl6ZEx1LXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeXl6ZEwtLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il95el92NE8tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJ0b29sTWVudG9ycyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXoxLTl1LXNFZHVINTlLU0hWOHZnQSIgYXNzb2NpYXRpb249Il95el93SmUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeXpfdjRlLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeXpfdjR1LXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il95el92NC0tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJlc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l6X3ZfLS1zRWR1SDU5S1NIVjh2Z0EiIGFzc29jaWF0aW9uPSJfeTBKZzd1LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3l6X3Y1Ty1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3l6X3Y1ZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il95el92X08tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJSZXVzYWJsZUFzc2V0Ij4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeXpfdl9lLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3l6X3ZfTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5BIFJldXNhYmxlIEFzc2V0IHByb3ZpZGVzIGEgc29sdXRpb24gdG8gYSBwcm9ibGVtIGZvciBhIGdpdmVuIGNvbnRleHQuIFRoZSBhc3NldCBtYXkgaGF2ZSBhIHZhcmlhYmlsaXR5IHBvaW50LCB3aGljaCBpcyBhIGxvY2F0aW9uIGluIHRoZSBhc3NldCB0aGF0IG1heSBoYXZlIGEgdmFsdWUgcHJvdmlkZWQgb3IgY3VzdG9taXplZCBieSB0aGUgYXNzZXQgY29uc3VtZXIuIFRoZSBhc3NldCBoYXMgcnVsZXMgZm9yIHVzYWdlIHdoaWNoIGFyZSB0aGUgaW5zdHJ1Y3Rpb25zIGRlc2NyaWJpbmcKLWhvdyB0aGUgYXNzZXQgc2hvdWxkIGJlIHVzZWQuCi08L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il95el92X3Utc0VkdUg1OUtTSFY4dmdBIiBnZW5lcmFsPSJfeXl6ZE0tLXNFZHVINTlLU0hWOHZnQSIvPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfeXpfdl8tLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeXpfd0FPLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3l6X3ZfLS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5Fc3RpbWF0aW9uIENvbnNpZGVyYXRpb25zIHF1YWxpZnkgdGhlIHVzYWdlIGFuZCBhcHBsaWNhdGlvbiBvZiBlc3RpbWF0aW9uIG1ldHJpY3MgaW4gdGhlIGRldmVsb3BtZW50IG9mIGFuIGFjdHVhbCBlc3RpbWF0ZS48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il95el93QWUtc0VkdUg1OUtTSFY4dmdBIiBnZW5lcmFsPSJfeXl6ZE0tLXNFZHVINTlLU0hWOHZnQSIvPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfeXpfd0F1LXNFZHVINTlLU0hWOHZnQSIgbWVtYmVyRW5kPSJfeXpfd0JPLXNFZHVINTlLU0hWOHZnQSBfeXpfdjUtLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3l6X3dBLS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95el93QXUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+Q29udGVudCBFbGVtZW50cyBjYW4gYmUgcmVsYXRlZCB0byBhbnkgbnVtYmVyIG9mIFN1cHBvcnRpbmcgTWF0ZXJpYWwgZ3VpZGFuY2UgZWxlbWVudHMuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfeXpfd0JPLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iX2NvbnRlbnRFbGVtZW50IiB2aXNpYmlsaXR5PSJwcml2YXRlIiB0eXBlPSJfeXh3N1ZPLXNFZHVINTlLU0hWOHZnQSIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iX3l6X3dBdS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95el93QmUtc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95el93QnUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkRW5kPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfeXpfd0ItLXNFZHVINTlLU0hWOHZnQSIgbWVtYmVyRW5kPSJfeXpfd0NlLXNFZHVINTlLU0hWOHZnQSBfeXpfdjZ1LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3l6X3dDTy1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95el93Qi0tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+Q29udGVudCBFbGVtZW50cyBjYW4gcmVmZXIgdG8gYW55IG51bWJlciBvZiBDb25jZXB0IGd1aWRhbmNlLiA8L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il95el93Q2Utc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJfY29udGVudEVsZW1lbnQiIHZpc2liaWxpdHk9InByaXZhdGUiIHR5cGU9Il95eHc3Vk8tc0VkdUg1OUtTSFY4dmdBIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfeXpfd0ItLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3l6X3dDdS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3l6X3dDLS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il95el93RE8tc0VkdUg1OUtTSFY4dmdBIiBtZW1iZXJFbmQ9Il95el93RHUtc0VkdUg1OUtTSFY4dmdBIF95el92N2Utc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeXpfd0RlLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3l6X3dETy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5Qcm92aWRlcyBjaGVjayBwb2ludHMgcmVsYXRlZCB0byBhIHBhcnRpY3VsYXIgY29udGVudCBlbGVtZW50cy4gIFRoZXNlIGFyZSB0eXBpY2FsbHkgdXNlZCBpbiByZXZpZXdzIGFuZCBpbnNwZWN0aW9ucyBvbiB3b3JrIHByb2R1Y3RzLgotCi08L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il95el93RHUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJfY29udGVudEVsZW1lbnQiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l4dzdWTy1zRWR1SDU5S1NIVjh2Z0EiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il95el93RE8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeXpfd0QtLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeXpfd0VPLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3l6X3dFZS1zRWR1SDU5S1NIVjh2Z0EiIG1lbWJlckVuZD0iX3l6X3dFLS1zRWR1SDU5S1NIVjh2Z0EgX3l6X3Y4Ty1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95el93RXUtc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeXpfd0VlLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PlRoaXMgYXNzb2NpYXRpb24gcHJvdmlkZXMgYWNjZXNzIHRvIGRldGFpbGVkIEd1aWRlbGluZXMgcmVsYXRlZCB0byB0aGlzIENvbnRlbnQgRWxlbWVudC48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il95el93RS0tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJfY29udGVudEVsZW1lbnQiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l4dzdWTy1zRWR1SDU5S1NIVjh2Z0EiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il95el93RWUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeXpfd0ZPLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeXpfd0ZlLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3l6X3dGdS1zRWR1SDU5S1NIVjh2Z0EiIG1lbWJlckVuZD0iX3l6X3dHTy1zRWR1SDU5S1NIVjh2Z0EgX3l6MV9DZS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95el93Ri0tc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeXpfd0Z1LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PkEgUmVwb3J0IGV4dHJhY3RzIGluZm9ybWF0aW9uIGFib3V0IG9uZSBvciBtb3JlIFdvcmsgUHJvZHVjdDsgbm9ybWFsbHkgZGlyZWN0bHkgZnJvbSBhIHRvb2wgdGhhdCBtYWludGFpbnMgdGhlIFdvcmsgUHJvZHVjdHMuIEZvciBleGFtcGxlLCBhIFJlcG9ydCBjYW4gcHJlc2VudCBkZXRhaWxzIG9mIGFuIEFydGlmYWN0IG9yIGEgc2V0IG9mIEFydGlmYWN0cyBmb3IgdXNlIGluIGEgdGVjaG5pY2FsIHJldmlldy4gPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfeXpfd0dPLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iX3dvcmtQcm9kdWN0IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95eXpkTU8tc0VkdUg1OUtTSFY4dmdBIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfeXpfd0Z1LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3l6X3dHZS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3l6X3dHdS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il95el93Ry0tc0VkdUg1OUtTSFY4dmdBIiBtZW1iZXJFbmQ9Il95el93SGUtc0VkdUg1OUtTSFY4dmdBIF95el92OC0tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeXpfd0hPLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3l6X3dHLS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5Qcm92aWRlcyBhIHNhbXBsZSBvZiB3aGF0IHRoZSB3b3JrIHByb2R1Y3QgbWF5IGxvb2sgbGlrZSwgYW4gYWN0dWFsIGluc3RhbmNlLjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iX3l6X3dIZS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9Il9jb250ZW50RWxlbWVudCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXh3N1ZPLXNFZHVINTlLU0hWOHZnQSIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iX3l6X3dHLS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95el93SHUtc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95el93SC0tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkRW5kPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfeXpfd0lPLXNFZHVINTlLU0hWOHZnQSIgbWVtYmVyRW5kPSJfeXpfd0l1LXNFZHVINTlLU0hWOHZnQSBfeXoxX0RPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3l6X3dJZS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95el93SU8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+UHJvdmlkZXMgZGV0YWlsZWQgZ3VpZGFuY2Ugb24gaG93IHRvIHByb2R1Y2UgdGhlIHdvcmsgcHJvZHVjdCBpbmRlcGVuZGVudCBvZiBhIHNwZWNpZmljIHNldCBvZiB0YXNrcyBvciBXQlMuICBNYXkgY29udGFpbiBzcGVjaWZpYyBhbGdvcml0aG1zIG9yIGFsdGVybmF0aXZlIGRldmVsb3BtZW50IGFwcHJvYWNoZXMuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfeXpfd0l1LXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iX3dvcmtQcm9kdWN0IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95eXpkTU8tc0VkdUg1OUtTSFY4dmdBIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfeXpfd0lPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3l6X3dJLS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3l6X3dKTy1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il95el93SmUtc0VkdUg1OUtTSFY4dmdBIiBtZW1iZXJFbmQ9Il95el93Si0tc0VkdUg1OUtTSFY4dmdBIF95el92NE8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeXpfd0p1LXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3l6X3dKZS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5MaW5rcyBUYXNrcyB3aXRoIFRvb2wgTWVudG9ycyB3aGljaCBhcmUgYSBzcGVjaWZpYyB0eXBlIG9mIGd1aWRhbmNlIHRoYXQgc2hvdyBob3cgdG8gdXNlIGEgc3BlY2lmaWMgdG9vbCB0byBwZXJmb3JtIHRoZSBUYXNrLjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iX3l6X3dKLS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9Il90YXNrIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95eXpkR3Utc0VkdUg1OUtTSFY4dmdBIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfeXpfd0plLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3l6X3dLTy1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3l6X3dLZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il95el93S3Utc0VkdUg1OUtTSFY4dmdBIiBtZW1iZXJFbmQ9Il95ejFfQXUtc0VkdUg1OUtTSFY4dmdBIF95el93TE8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeXpfd0stLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3l6X3dLdS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5BIFByYWN0aWNlIGNhbiBiZSBjb21wb3NlZCBvZiBvdGhlciBQcmFjdGljZXMuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfeXpfd0xPLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iX3ByYWN0aWNlIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95ejEtXy0tc0VkdUg1OUtTSFY4dmdBIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfeXpfd0t1LXNFZHVINTlLU0hWOHZnQSIvPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfeTBKZzRPLXNFZHVINTlLU0hWOHZnQSIgbWVtYmVyRW5kPSJfeXoxX0JlLXNFZHVINTlLU0hWOHZnQSBfeTBKZzR1LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3kwSmc0ZS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95MEpnNE8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+QSBQcmFjdGljZSBjYW4gcmVmZXJlbmNlIGFueSBDb250ZW50IEVsZW1lbnQuICBUaGUgYXNzb2NpYXRpb24gZXhwcmVzc2VzIHRoYXQgdGhpcyBDb250ZW50IEVsZW1lbnQgaXMgcGFydCBvZiBvciBiZWxvbmdzIHRvIHRoaXMgUHJhY3RpY2UuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfeTBKZzR1LXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iX3ByYWN0aWNlIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95ejEtXy0tc0VkdUg1OUtTSFY4dmdBIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfeTBKZzRPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3kwSmc0LS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3kwSmc1Ty1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il95MEpnNWUtc0VkdUg1OUtTSFY4dmdBIiBtZW1iZXJFbmQ9Il95el92OXUtc0VkdUg1OUtTSFY4dmdBIF95MEpnNS0tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeTBKZzV1LXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3kwSmc1ZS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5BIHdvcmsgcHJvZHVjdCBpcyByZWxhdGVkIHRvIG9uZSBvciBtb3JlIGFzc2V0cyB0byA8L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il95MEpnNS0tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJfY29udGVudEVsZW1lbnQiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l4dzdWTy1zRWR1SDU5S1NIVjh2Z0EiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il95MEpnNWUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeTBKZzZPLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeTBKZzZlLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3kwSmc2dS1zRWR1SDU5S1NIVjh2Z0EiIG1lbWJlckVuZD0iX3l6MV9ELS1zRWR1SDU5S1NIVjh2Z0EgX3kwSmc2LS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iX3kwSmc2LS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9Il93b3JrUHJvZHVjdCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXl6ZE1PLXNFZHVINTlLU0hWOHZnQSIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iX3kwSmc2dS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95MEpnN08tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95MEpnN2Utc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkRW5kPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfeTBKZzd1LXNFZHVINTlLU0hWOHZnQSIgbWVtYmVyRW5kPSJfeTBKZzctLXNFZHVINTlLU0hWOHZnQSBfeXpfdjQtLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfeTBKZzctLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iX3Rhc2siIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l5emRHdS1zRWR1SDU5S1NIVjh2Z0EiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il95MEpnN3Utc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeTBKZzhPLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeTBKZzhlLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3kwSmc4dS1zRWR1SDU5S1NIVjh2Z0EiIG1lbWJlckVuZD0iX3kwSmc4LS1zRWR1SDU5S1NIVjh2Z0EgX3l6MV9FdS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iX3kwSmc4LS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9Il93b3JrUHJvZHVjdCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXl6ZE1PLXNFZHVINTlLU0hWOHZnQSIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iX3kwSmc4dS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95MEpnOU8tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95MEpnOWUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkRW5kPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfeTBKZzl1LXNFZHVINTlLU0hWOHZnQSIgbWVtYmVyRW5kPSJfeXpfdi1lLXNFZHVINTlLU0hWOHZnQSBfeTBKZzktLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfeTBKZzktLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iIiB2aXNpYmlsaXR5PSJwcml2YXRlIiB0eXBlPSJfeXh3N1ZPLXNFZHVINTlLU0hWOHZnQSIgYXNzb2NpYXRpb249Il95MEpnOXUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeTBKZy1PLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeTBKZy1lLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3kxTUNzTy1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9IkFydGlmYWN0RGVzY3JpcHRpb24iPgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3kxTUNzZS1zRWR1SDU5S1NIVjh2Z0EiIGdlbmVyYWw9Il95MU1DN2Utc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfeTFNQ3N1LXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iYnJpZWZPdXRsaW5lIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95eFVQYU8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95MU1Dcy0tc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeTFNQ3N1LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgICAgPGJvZHk+UHJvdmlkZXMgYSBicmllZiBkZXNjcmlwdGlvbiBvZiB0aGUgaW5mb3JtYXRpb24gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhpcyBhcnRpZmFjdC4gRm9yIGV4YW1wbGUsIGRpc2N1c3NlcyB0aGUgY29udGVudHMgZm9yIGtleSBjaGFwdGVycyBvZiBhIGRvY3VtZW50IGFydGlmYWN0IG9yIHRoZSBrZXkgcGFja2FnZXMgYW5kIG1vZHVsZXMgb2YgYSBtb2RlbCBhcnRpZmFjdC48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95MU1DdE8tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iMSIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95MU1DdGUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il95MU1DdHUtc0VkdUg1OUtTSFY4dmdBIiB0eXBlPSJfeXhVUGFPLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IiIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il95MU1DdC0tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJyZXByZXNlbnRhdGlvbk9wdGlvbnMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l4VVBhTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3kxTUN1Ty1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95MU1DdC0tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgICA8Ym9keT5EaXNjdXNzZXMgZGlmZmVyZW50IHBvc3NpYmxlIGFsdGVybmF0aXZlIHJlcHJlc2VudGF0aW9ucyBmb3IgdGhlIGFydGlmYWN0LiBGb3IgZXhhbXBsZSBhIGRlc2lnbiBtb2RlbCBjYW4gYmUgcmVwcmVzZW50ZWQgYXMgYSBVTUwgbW9kZWwgb3IgYW4gaW5mb3JtYWwgYmxvY2sgZGlhZ3JhbSBvciBieSB0ZXh0dWFsIGRlc2NyaXB0aW9uIG9ubHkuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeTFNQ3VlLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjEiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeTFNQ3V1LXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfeTFNQ3UtLXNFZHVINTlLU0hWOHZnQSIgdHlwZT0iX3l4VVBhTy1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfeTFNQ3ZPLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0icmVwcmVzZW50YXRpb24iIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l4VVBhTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95MU1DdmUtc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iMSIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95MU1DdnUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il95MU1Ddi0tc0VkdUg1OUtTSFY4dmdBIiB0eXBlPSJfeXhVUGFPLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IiIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il95MU1Dd08tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJub3RhdGlvbiIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXhVUGFPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3kxTUN3ZS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIxIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3kxTUN3dS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iX3kxTUN3LS1zRWR1SDU5S1NIVjh2Z0EiIHR5cGU9Il95eFVQYU8tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfeTFNQ3hPLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iRGVsaXZlcmFibGVEZXNjcmlwdGlvbiI+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfeTFNQ3hlLXNFZHVINTlLU0hWOHZnQSIgZ2VuZXJhbD0iX3kxTUM3ZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il95MU1DeHUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJleHRlcm5hbERlc2NyaXB0aW9uIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95eFVQYU8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95MU1DeC0tc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeTFNQ3h1LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgICAgPGJvZHk+VGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBEZWxpdmVyYWJsZSB1c2VkIGZvciBjbGllbnQgZG9jdW1lbnRzIChwcm9wb3NhbCwgc3RhdGVtZW50cyBvZiB3b3JrIG9yIGNvbnRyYWN0dWFsIGFncmVlbWVudHMpLiAgSXQgbWlnaHQgdXNlIGEgZGlmZmVyZW50IGxhbmd1YWdlIGFuZCBmb2xsb3cgbGVnYWwgY29uc3RyYWludHMuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeTFNQ3lPLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjEiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeTFNQ3llLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfeTFNQ3l1LXNFZHVINTlLU0hWOHZnQSIgdHlwZT0iX3l4VVBhTy1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfeTFNQ3ktLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0icGFja2FnaW5nR3VpZGFuY2UiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l4VVBhTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3kxTUN6Ty1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95MU1DeS0tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgICA8Ym9keT5Qcm92aWRlcyBndWlkYW5jZSBvbiBob3cgdG8gYXNzZW1ibGUgdGhlIGRlbGl2ZXJhYmxlIGZyb20gYWxsIGl0cyByZXF1aXJlZCBpbnB1dHMuICBUaGlzIHNlY3Rpb24gZGVzY3JpYmVzIHRoZSBtb3N0IGNvbW1vbiBjb250ZW50IG1lZGl1bSBhbmQgZm9ybWF0LiAgRGlzdHJpYnV0aW9uIG9mIHRoZSBkZWxpdmVyYWJsZSBpcyBhZGRyZXNzZWQgaW4gdGhpcyBzZWN0aW9uLCBpZiBuZWNlc3NhcnkuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeTFNQ3plLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjEiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeTFNQ3p1LXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfeTFNQ3otLXNFZHVINTlLU0hWOHZnQSIgdHlwZT0iX3l4VVBhTy1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il95MU1DME8tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJSb2xlRGVzY3JpcHRpb24iPgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3kxTUMwZS1zRWR1SDU5S1NIVjh2Z0EiIGdlbmVyYWw9Il95eHc3Vi0tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfeTFNQzB1LXNFZHVINTlLU0hWOHZnQSIgbmFtZT0ic2tpbGxzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95eFVQYU8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95MU1DMC0tc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeTFNQzB1LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgICAgPGJvZHk+TGlzdHMgb2Ygc2V0IG9mIHJlcXVpcmVkIHNraWxscyBhIHBlcnNvbiBuZWVkcyB0byBwb3NzZXNzIHRvIGZ1bGZpbGwgdGhhdCBSb2xlLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3kxTUMxTy1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIxIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3kxTUMxZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iX3kxTUMxdS1zRWR1SDU5S1NIVjh2Z0EiIHR5cGU9Il95eFVQYU8tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3kxTUMxLS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9ImFzc2lnbm1lbnRBcHByb2FjaGVzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95eFVQYU8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95MU1DMk8tc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeTFNQzEtLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgICAgPGJvZHk+UHJvdmlkZXMgZ3VpZGFuY2Ugb24gZm9yIGFzc2lnbmluZyBpbmRpdmlkdWFscyB0byB0aGUgUm9sZSBpbiB0ZXJtcyBvZiB3aGF0IG90aGVyIHJvbGVzIHRoZXNlIGluZGl2aWR1YWxzIGNvdWxkIHBlcmZvcm0gYW5kIHdoYXQgcmVzcG9uc2liaWxpdHkgZGlmZmVyZW50IGluZGl2aWR1YWxzIGFzc2lnbmVkIHRvIHRoaXMgcm9sZSBtaWdodCBoYXZlLiAgVGhlIGd1aWRhbmNlIGNhbiBhbHNvIGRlc2NyaWJlIGRpZmZlcmVudCBhc3NpZ25tZW50IGFwcHJvYWNoZXMgZm9yIGRpZmZlcmVudCB0eXBlcyBvZiBwcm9qZWN0cywgZS5nLiBmb3IgbGFyZ2UgdmVyc3VzIHNtYWxsIHRlYW1zIHdoZXJlIGluZGl2aWR1YWxzIGNvdWxkIGJlIGFsbG9jYXRlZCB0byByb2xlcyBmdWxsIHRpbWUgdmVyc3VzIHNoYXJpbmcgcm9sZXMgd2l0aGluIHRoZSB0ZWFtLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3kxTUMyZS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIxIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3kxTUMydS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iX3kxTUMyLS1zRWR1SDU5S1NIVjh2Z0EiIHR5cGU9Il95eFVQYU8tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3kxTUMzTy1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9InN5bm9ueW1zIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95eFVQYU8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95MU1DM2Utc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeTFNQzNPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgICAgPGJvZHk+TGlzdHMgc3lub255bXMsIGkuZS4gb3RoZXIgbmFtZXMgdGhlIFJvbGUgbWlnaHQgYmUgcmVmZXJyZWQgYnkuICBUb29sIHN1cHBvcnQgZm9yIHRoZSBtZXRhLW1vZGVsIG1pZ2h0IHN1cHBvcnQgdGhhdCBhIFJvbGUgbmFtZSBjYW4gYmUgY29uc2lzdGVudGx5IGJlIHJlcGxhY2VkIHdpdGggb25lIG9mIGl0cyBzeW5vbnltcyB0aHJvdWdodCBhIFByb2Nlc3MuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeTFNQzN1LXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjEiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeTFNQzMtLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfeTFNQzRPLXNFZHVINTlLU0hWOHZnQSIgdHlwZT0iX3l4VVBhTy1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il95MU1DNGUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJUYXNrRGVzY3JpcHRpb24iPgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3kxTUM0dS1zRWR1SDU5S1NIVjh2Z0EiIGdlbmVyYWw9Il95eHc3Vi0tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfeTFNQzQtLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0icHVycG9zZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXhVUGFPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeTFNQzVPLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3kxTUM0LS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICAgIDxib2R5PlN1bW1hcml6ZXMgdGhlIG1haW4gcmVhc29uIGZvciBwZXJmb3JtaW5nIHRoaXMgVGFzayBhbmQgd2hhdCBpcyBpbnRlbmRlZCB0byBiZSBhY2hpZXZlZC48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95MU1DNWUtc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iMSIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95MU1DNXUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il95MU1DNS0tc0VkdUg1OUtTSFY4dmdBIiB0eXBlPSJfeXhVUGFPLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IiIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il95MU1DNk8tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJhbHRlcm5hdGl2ZXMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l4VVBhTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3kxTUM2ZS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95MU1DNk8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgICA8Ym9keT5Db21wcmlzZXMgb2Ygc3VtbWFyaWVzIGRlc2NyaWJpbmcgaW1wb3J0YW50IGV4Y2VwdGlvbmFsIGFuZCBub24tc3RhbmRhcmQgd2F5cyBvZiBhY2hpZXZpbmcgdGhpcyBUYXNrJ3MgZGV2ZWxvcG1lbnQgZ29hbHMgdGhhdCB3ZXJlIG5vdCBjb3ZlcmVkIGJ5IHRoZSBUYXNrJ3MgU3RlcHMuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeTFNQzZ1LXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjEiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeTFNQzYtLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfeTFNQzdPLXNFZHVINTlLU0hWOHZnQSIgdHlwZT0iX3l4VVBhTy1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il95MU1DN2Utc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJXb3JrUHJvZHVjdERlc2NyaXB0aW9uIj4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il95MU1DN3Utc0VkdUg1OUtTSFY4dmdBIiBnZW5lcmFsPSJfeXh3N1YtLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3kxTUM3LS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9InB1cnBvc2UiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l4VVBhTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3kxTUM4Ty1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95MU1DNy0tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgICA8Ym9keT5EZXNjcmliZXMgd2h5IHRoZSB3b3JrIHByb2R1Y3QgaXMgcHJvZHVjZWQgYW5kIHRvIHdoYXQgdXNlIGl0IHdpbGwgYmUgcHV0LjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3kxTUM4ZS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIxIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3kxTUM4dS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iX3kxTUM4LS1zRWR1SDU5S1NIVjh2Z0EiIHR5cGU9Il95eFVQYU8tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3kxTUM5Ty1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9ImltcGFjdE9mTm90SGF2aW5nIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95eFVQYU8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95MU1DOWUtc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeTFNQzlPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgICAgPGJvZHk+RGVzY3JpYmVzIHRoZSBjb25zZXF1ZW5jZXMgb2Ygbm90IHByb2R1Y2luZyB0aGUgd29yayBwcm9kdWN0LiAgVGhpcyBpcyBpbnRlbmRlZCB0byBhaWQgaW4gdGhlIHRhaWxvcmluZyB0aGUgbWV0aG9kL3Byb2Nlc3MgdG8gdGhlIG5lZWRzIG9mIGEgc3BlY2lmaWMgcHJvamVjdC48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95MU1DOXUtc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iMSIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95MU1DOS0tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il95MU1DLU8tc0VkdUg1OUtTSFY4dmdBIiB0eXBlPSJfeXhVUGFPLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IiIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il95MU1DLWUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJyZWFzb25zRm9yTm90TmVlZGluZyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXhVUGFPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeTFNQy11LXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3kxTUMtZS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICAgIDxib2R5PkRlc2NyaWJlcyB0aGUgY2lyY3Vtc3RhbmNlcyBpbiB3aGljaCBpdCBpcyByZWFzb25hYmxlIG5vdCB0byBwcm9kdWNlIHRoZSB3b3JrIHByb2R1Y3QuICBUaGlzIGlzIGludGVuZGVkIHRvIGFpZCBpbiB0aGUgdGFpbG9yaW5nIG9mIHRoZSBtZXRob2QvcHJvY2VzcyB0byB0aGUgbmVlZHMgb2YgYSBzcGVjaWZpYyBwcm9qZWN0LjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3kxTUMtLS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIxIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3kxTUNfTy1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iX3kxTUNfZS1zRWR1SDU5S1NIVjh2Z0EiIHR5cGU9Il95eFVQYU8tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfeTFNQ191LXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iR3VpZGFuY2VEZXNjcmlwdGlvbiI+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfeTFNQ18tLXNFZHVINTlLU0hWOHZnQSIgZ2VuZXJhbD0iX3l4dzdWLS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il95MU1EQU8tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJhdHRhY2htZW50cyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXhVUGFPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeTFNREFlLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3kxTURBTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICAgIDxib2R5PlRoaXMgZmllbGQgaXMgcHJpbWFyaWx5IHVzZWQgZm9yIGF0dGFjaG1lbnRzIGF1Z21lbnRpbmcgdGhlIGluZm9ybWF0aW9uIHByb3ZpZGVkIGZvciBndWlkYW5jZS4gIEluIHBhcnRpY3VsYXIgdGhlIGF0dHJpYnV0ZSBpcyB1c2VkIGZvciBUZW1wbGF0ZXMsIEV4YW1wbGVzLCBhbmQgUmV1c2FibGUgQXNzZXRzIHRvIGNvbnRhaW4gdGhlIGFjdHVhbCBhdHRhY2htZW50IGRlc2NyaWJlZCBpbiB0aGUgbWFpbkRlc2NyaXB0aW9uLiAgSXQgY2FuIGFkZGl0aW9uYWxseSBjb250YWluIHJlcHJlc2VudGF0aW9ucyBvZiB0aGUgZ3VpZGFuY2UgaW4ganVzdCBhIHRoaXJkIHBhcnR5IGZvcm1hdCwgZS5nLiBQREYsIE1TIFdvcmQsIG9yIFdvcmQgUGVyZmVjdC48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95MU1EQXUtc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iMSIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95MU1EQS0tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il95MU1EQk8tc0VkdUg1OUtTSFY4dmdBIiB0eXBlPSJfeXhVUGFPLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IiIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3kxTURCZS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9IlByYWN0aWNlRGVzY3JpcHRpb24iPgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3kxTURCdS1zRWR1SDU5S1NIVjh2Z0EiIGdlbmVyYWw9Il95eHc3Vi0tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfeTFNREItLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iYWRkaXRpb25hbEluZm8iIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l4VVBhTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3kxTURDTy1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95MU1EQi0tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgICA8Ym9keT5BbnkgYWRkaXRpb25hbCBJbmZvcm1hdGlvbiBub3QgY292ZXJlZCBieSB0aGUgb3RoZXIgYXR0cmlidXRlcy48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95MU1EQ2Utc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iMSIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95MU1EQ3Utc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il95MU1EQy0tc0VkdUg1OUtTSFY4dmdBIiB0eXBlPSJfeXhVUGFPLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IiIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il95MU1ERE8tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJwcm9ibGVtIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95eFVQYU8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95MU1ERGUtc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeTFNRERPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgICAgPGJvZHk+QSBkZXNjcmlwdGlvbiBvZiB0aGUgcHJvYmxlbSB0aGUgUHJhY3RpY2UgYWRkcmVzc2VzLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3kxTUREdS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIxIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3kxTURELS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iX3kxTURFTy1zRWR1SDU5S1NIVjh2Z0EiIHR5cGU9Il95eFVQYU8tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3kxTURFZS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9ImJhY2tncm91bmQiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l4VVBhTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3kxTURFdS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95MU1ERWUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgICA8Ym9keT5FbGFib3JhdGlvbiBvbiB0aGUgYmFja2dyb3VuZCBhbmQgdGhlIGNvbnRleHQgaW4gd2hpY2ggdGhlIHByb2JsZW0gb2NjdXJzIGFuZCB3aGVyZSB0aGUgc29sdXRpb24gZGVzY3JpYmVkIGJ5IHRoaXMgUHJhY3RpY2Ugd2lsbCBmaXQgaW4uPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeTFNREUtLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjEiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeTFNREZPLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfeTFNREZlLXNFZHVINTlLU0hWOHZnQSIgdHlwZT0iX3l4VVBhTy1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfeTFNREZ1LXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iZ29hbHMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l4VVBhTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3kxTURGLS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95MU1ERnUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgICA8Ym9keT5BIHN1bW1hcnkgb2YgdGhlIG92ZXJhbGwgZ29hbHMgdG8gYmUgYWRkcmVzc2VkIGJ5IHRoZSBQcmFjdGljZS48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95MU1ER08tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iMSIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95MU1ER2Utc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il95MU1ER3Utc0VkdUg1OUtTSFY4dmdBIiB0eXBlPSJfeXhVUGFPLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IiIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il95MU1ERy0tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJhcHBsaWNhdGlvbiIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXhVUGFPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeTFNREhPLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3kxTURHLS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICAgIDxib2R5PkRlc2NyaWJlcyBob3cgdGhlIFByYWN0aWNlIGlzIGJlaW5nIGFwcGxpZWQgb3IgaW50cm9kdWNlZCBpbnRvIHRoZSBjb250ZXh0IGRlc2NyaWJlZCBpbiBiYWNrZ3JvdW5kLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3kxTURIZS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIxIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3kxTURIdS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iX3kxTURILS1zRWR1SDU5S1NIVjh2Z0EiIHR5cGU9Il95eFVQYU8tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3kxTURJTy1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9ImxldmVsc09mQWRvcHRpb24iIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l4VVBhTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3kxTURJZS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95MU1ESU8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgICA8Ym9keT5PdXRsaW5lcyB0aGUgZGlmZmVyZW50IGZvcm1zIG9yIHZhcmlhbnRzIGluIHdoaWNoIHRoZSBwcmFjdGljZSBjb3VsZCBiZSByZWFsaXplZC4gKGUuZy4gZnVsbCBhZG9wdGlvbiB2ZXJ1cyBhIHBhcnRpYWwgYWRvcHRpb24gb2YgdGhlIFByYWN0aWNlKTwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3kxTURJdS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIxIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3kxTURJLS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iX3kxTURKTy1zRWR1SDU5S1NIVjh2Z0EiIHR5cGU9Il95eFVQYU8tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfeXh3N2V1LXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iRGVzY3JpYmFibGVFbGVtZW50IiBpc0Fic3RyYWN0PSJ0cnVlIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeXh3N2UtLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3l4dzdldS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5EZXNjcmliYWJsZSBFbGVtZW50IGlzIGFuIGFic3RyYWN0IGdlbmVyYWxpemF0aW9uIG9mIE1ldGhvZCBFbGVtZW50cyBmb3Igd2hpY2ggZXh0ZXJuYWwgcHJlc2VudGF0aW9uIG5hbWVzIGFzIHdlbGwgYXMgY29udGVudCBkZXNjcmlwdGlvbnMgaGF2ZSBiZWVuIGRlZmluZWQsIHN1Y2ggYXMgUm9sZXMgb3IgV29yayBQcm9kdWN0cy4gIFByZXNlbnRhdGlvbiBOYW1lIGFuZCBDb250ZW50IERlc2NyaXB0aW9ucyBhcmUgdHlwaWNhbGx5IGxvY2FsaXplZCB1c2luZyBhIHJlc291cmNlIGFsbG9jYXRpb24gbWVjaGFuaXNtIGZvciBpdHMgU3RyaW5nIHR5cGUgYXR0cmlidXRlcy4KLVRoaXMgYWJzdHJhY3Rpb24gcmVwcmVzZW50cyBhbGwgZWxlbWVudHMgaW4gdGhlIE1ldGhvZCBDb250ZW50IGFzIHdlbGwgYXMgUHJvY2VzcyBzcGFjZSBmb3Igd2hpY2ggY29uY3JldGUgdGV4dHVhbCBkZXNjcmlwdGlvbnMgYXJlIGRlZmluZWQgaW4gdGhlIGZvcm0gb2YgZG9jdW1lbnRpbmcgYXR0cmlidXRlcyBncm91cGVkIGluIGEgbWF0Y2hpbmcgQ29udGVudCBEZXNjcmlwdGlvbiBpbnN0YW5jZSAoc2VlIFNlY3Rpb24gNC4xLjQpLiAgRGVzY3JpYmFibGUgRWxlbWVudHMgYXJlIGludGVuZGVkIHRvIGJlIHB1Ymxpc2hlZCBpbiBtZXRob2Qgb3IgcHJvY2VzcyBwdWJsaWNhdGlvbnMgKHNpbWlsYXIgdG8gdGhlIElCTSBSYXRpb25hbCBVbmlmaWVkIFByb2Nlc3Mgd2ViKS4gIERlc2NyaWJhYmxlIEVsZW1lbnQgZGVmaW5lcyB0aGF0IHRoZSBlbGVtZW50IGl0IHJlcHJlc2VudHMgd2lsbCBoYXZlIGNvbnRlbnQgJ2F0dGFjaGVkJyB0byBpdC4gIENvbnRlbnQgRGVzY3JpcHRpb24gaXMgdGhlIGFic3RyYWN0aW9uIGZvciB0aGUgYWN0dWFsIHBsYWNlcyBpbiB3aGljaCB0aGUgY29udGVudCBpcyBiZWluZyByZXByZXNlbnRlZC4gIFRoaXMgc2VwYXJhdGlvbiBhbGxvd3MgYSBkaXN0aW5jdGlvbiBiZXR3ZWVuIGNvcmUgbWV0aG9kIG1vZGVsIGVsZW1lbnRzIGRlc2NyaWJpbmcgdGhlIHN0cnVjdHVyZSBvZiB0aGUgbW9kZWwgZnJvbSB0aGUgYWN0dWFsIGRlc2NyaXB0aW9uIGNvbnRhaW5lciBwcm92aWRpbmcsIGZvciBleGFtcGxlLCB0aGUgZG9jdW1lbnRhdGlvbiBvZiB0aGUgY29udGVudCBlbGVtZW50IGluIGRpZmZlcmVudCBhbHRlcm5hdGl2ZXMgbGFuZ3VhZ2VzLCBhdWRpZW5jZXMsIGxpY2Vuc2luZyBsZXZlbHMsIGV0Yy4KLTwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95MU1ESmUtc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeXh3N2V1LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PlRoaXMgZGVmaW5pdGlvbiBvZiBDb250ZW50IEVsZW1lbnQgZXh0ZW5kcyB0aGUgQ29udGVudCBFbGVtZW50IGRlZmluaXRpb24gdmlhIHBhY2thZ2UgbWVyZ2Ugd2l0aCByZWZlcmVuY2VzIHRvIGljb25zIHRoYXQgYXJlIHVzZWQgZm9yIHByZXNlbnRpbmcgQ29udGVudCBFbGVtZW50cyBpbiBhIFVNQS1iYXNlZCBtb2RlbGluZyBlbnZpcm9ubWVudCBhcyB3ZWxsIGFzIHdoZW4gcHVibGlzaGluZyBDb250ZW50IEVsZW1lbnRzIGludG8gZG9jdW1lbnRhdGlvbiBwcmVzZW50YXRpb24gKGUuZy4gZG9jdW1lbnQgb3IgaHRtbCBwYWdlcykuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfeXh3N2ZPLXNFZHVINTlLU0hWOHZnQSIgZ2VuZXJhbD0iX3l4S2ZDdS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il95eHc3ZmUtc0VkdUg1OUtTSFY4dmdBIiBnZW5lcmFsPSJfeXh3N1FlLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3l4dzdmdS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9InByZXNlbnRhdGlvbk5hbWUiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l4VVBhTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3l4dzdmLS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95eHc3ZnUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgICA8Ym9keT5FdmVyeSBEZXNjcmliYWJsZSBFbGVtZW50IGhhcyBhIHByZXNlbnRhdGlvbiBuYW1lLCB3aGljaCBpcyB1c2VkIGZvciBleHRlcm5hbCBwcmVzZW50YXRpb24gb2YgdGhlIGVsZW1lbnQuICBGb3IgZXhhbXBsZSwgbmFtZSAodGhlIGludGVybmFsIHJlcHJlc2VudGF0aW9uKSBtaWdodCBiZSBzZXQgdG8gJnF1b3Q7cnVwX2FyY2hpdGVjdHVyZV9kb2N1bWVudCZxdW90OyB0byBkaWZmZXJlbnRpYXRlIGZyb20gYSAmcXVvdDtqMmVlX2FyY2hpdGN0dXJlX2RvY3VtZW50JnF1b3Q7IHdoZXJlYXMgdGhlIGV4dGVybmFsIHByZXNlbnRhdGlvbiB3b3VsZCBhbHdheXMgYmUgJnF1b3Q7QXJjaGl0ZWN0dXJlIERvY3VtZW50JnF1b3Q7LgotPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeXh3N2dPLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjEiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeXh3N2dlLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfeXh3N2d1LXNFZHVINTlLU0hWOHZnQSIgdHlwZT0iX3l4VVBhTy1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfeXh3N2ctLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0icHJlc2VudGF0aW9uIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95eHc3Vi0tc0VkdUg1OUtTSFY4dmdBIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBhc3NvY2lhdGlvbj0iX3l4dzdtZS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95eHc3aE8tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iMSIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95eHc3aGUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3kxTURKdS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9InNoYXBlaWNvbiIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXhVUFp1LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeTFNREotLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3kxTURKdS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICAgIDxib2R5PkEgcmVmZXJlbmNlIHRvIGFuIGljb24gdGhhdCBjYW4gYmUgdXNlZCBmb3IgbW9kZWxpbmcgd2l0aCBzcGVjaWZpYyBDb250ZW50IEVsZW1lbnQgaW5zdGFuY2VzIChhcyBncmFwaGljYWwgc3RlcmVvdHlwZXMsIGUuZy4gYSB1c2UgY2FzZSBzeW1ib2wgZm9yIGEgdXNlIGNhc2UgYXJ0aWZhY3QpIGFzIHdlbGwgYXMgcHVibGljYXRpb24gb2YgY29udGVudC48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95MU1ES08tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iMSIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95MU1ES2Utc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il95MU1ES3Utc0VkdUg1OUtTSFY4dmdBIiB0eXBlPSJfeXhVUFp1LXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IiIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il95MU1ESy0tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJub2RlaWNvbiIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXhVUFp1LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeTFNRExPLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3kxTURLLS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICAgIDxib2R5PkEgcmVmZXJlbmNlIHRvIGFuIGljb24gdGhhdCBjYW4gYmUgdXNlZCBpbiB0cmVlIGJyb3dzZXIgcHJlc2VudGF0aW9ucyBhbmQgYnJlYWtkb3duIHN0cnVjdHVyZXMuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeTFNRExlLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjEiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeTFNREx1LXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfeTFNREwtLXNFZHVINTlLU0hWOHZnQSIgdHlwZT0iX3l4VVBadS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il95Mk9raWUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJSb2xlU2V0Ij4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeTJPa2l1LXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3kyT2tpZS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5BIFJvbGUgU2V0IG9yZ2FuaXplcyBSb2xlcyBpbnRvIGNhdGVnb3JpZXMuICBJdCBpcyB1c2VkIHRvIGdyb3VwIHJvbGVzIHRvZ2V0aGVyIHRoYXQgaGF2ZSBjZXJ0YWluIGNvbW1vbmFsaXRpZXMuICBGb3IgZXhhbXBsZSwgdGhlICZxdW90O0FuYWx5c3RzJnF1b3Q7IFJvbGUgU2V0IGNvdWxkIGdyb3VwIHRoZSAmcXVvdDtCdXNpbmVzcyBQcm9jZXNzIEFuYWx5c3QmcXVvdDssICZxdW90O1N5c3RlbSBBbmFseXN0JnF1b3Q7LCBhcyB3ZWxsIGFzICZxdW90O1JlcXVpcmVtZW50cyBTcGVjaWZpZXImcXVvdDsgcm9sZXMuICBBbGwgb2YgdGhlc2Ugd29yayB3aXRoIHNpbWlsYXIgdGVjaG5pcXVlcyBhbmQgaGF2ZSBvdmVybGFwcGluZyBza2lsbHMsIGJ1dCBhcmUgcmVxdWlyZWQgYXMgZGlzdGluY3Qgcm9sZXMgZm9yIGEgbWV0aG9kIChlLmcuIHRoZSBtZXRob2QgdGhlIElCTSBSYXRpb25hbCBVbmlmaWVkIFByb2Nlc3MgaXMgYmFzZWQgb24pLgotPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfeTJPa2ktLXNFZHVINTlLU0hWOHZnQSIgZ2VuZXJhbD0iX3kyT2tudS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il95Mk9rak8tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJyb2xlcyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXl6ZEVlLXNFZHVINTlLU0hWOHZnQSIgYXNzb2NpYXRpb249Il95Mk9rdk8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeTJPa2plLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeTJPa2p1LXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3kyT2tqLS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9IkRvbWFpbiI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3kyT2trTy1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95Mk9rai0tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+RG9tYWluIGlzIGEgcmVmaW5lYWJsZSBoaWVyYXJjaHkgZ3JvdXBpbmcgcmVsYXRlZCB3b3JrIHByb2R1Y3RzLiAgSW4gb3RoZXIgd29yZHMsIERvbWFpbnMgY2FuIGJlIGZ1cnRoZXIgZGl2aWRlZCBpbnRvIHN1Yi1kb21haW5zLCB3aXRoIHdvcmsgcHJvZHVjdCBlbGVtZW50cyB0byBiZSBjYXRlZ29yaXplZCBvbmx5IGF0IHRoZSBsZWFmLWxldmVsIG9mIHRoaXMgaGllcmFyY2h5LgotRG9tYWluIGlzIGEgbG9naWNhbCBncm91cGluZyBvZiB3b3JrIHByb2R1Y3RzIHRoYXQgaGF2ZSBhbiBhZmZpbml0eSB0byBlYWNoIG90aGVyIGJhc2VkIG9uIHJlc291cmNlcywgdGltaW5nLCBvciByZWxhdGlvbnNoaXAuICBBIERvbWFpbiBtYXkgYmUgZGl2aWRlZCBpbnRvIHN1YmRvbWFpbnMuICBGb3IgZXhhbXBsZSwgR1MgTWV0aG9kIHVzZXMgc2l4IHByZWRlZmluZWQgRG9tYWlucyBmb3IgV29yayBQcm9kdWN0czogQXBwbGljYXRpb24sIEFyY2hpdGVjdHVyZSwgQnVzaW5lc3MsIEVuZ2FnZW1lbnQsIE9wZXJhdGlvbnMgYW5kIE9yZ2FuaXphdGlvbi4KLTwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3kyT2trZS1zRWR1SDU5S1NIVjh2Z0EiIGdlbmVyYWw9Il95Mk9rbnUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfeTJPa2t1LXNFZHVINTlLU0hWOHZnQSIgbmFtZT0id29ya1Byb2R1Y3RzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95eXpkTU8tc0VkdUg1OUtTSFY4dmdBIiBhc3NvY2lhdGlvbj0iX3kyT2t3ZS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95Mk9ray0tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95Mk9rbE8tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3kyT2tsZS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9InN1YmRvbWFpbnMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3kyT2tqLS1zRWR1SDU5S1NIVjh2Z0EiIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiIGFzc29jaWF0aW9uPSJfeTJPa3h1LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3kyT2tsdS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3kyT2tsLS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il95Mk9rbU8tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJXb3JrUHJvZHVjdFR5cGUiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95Mk9rbWUtc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeTJPa21PLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PldvcmsgUHJvZHVjdCBUeXBlIGlzIGEgc2Vjb25kIGNhdGVnb3J5IGZvciB3b3JrIHByb2R1Y3RzLCB3aGljaCBpbiBjb250cmFzdCB0byBEb21haW4gaXMgbW9yZSBwcmVzZW50YXRpb24gb3JpZW50ZWQuICBBIHdvcmsgcHJvZHVjdCBjYW4gaGF2ZSBtYW55IFdvcmsgUHJvZHVjdCBUeXBlcy4gIEV4YW1wbGVzLCBmb3IgYSBXb3JrIFByb2R1Y3QgVHlwZSBpcyAmcXVvdDtDbGFzcyBEaWFncmFtJnF1b3Q7LCB3aGljaCBjYXRlZ29yaXplcyB0aGUgQXJ0aWZhY3RzIEFuYWx5c2lzIE1vZGVsLCBEZXNpZ24gTW9kZWwsIFVzZXIgRXhwZXJpZW5jZSBNb2RlbCwgb3IgJnF1b3Q7U3BlY2lmaWNhdGlvbiZxdW90Oywgd2hpY2ggY2F0ZWdvcml6ZXMgcmVxdWlyZW1lbnRzIHNwZWNpZmljYXRpb25zIHRoYXQgZGVmaW5lIGEgc3lzdGVtIHdpdGggYSB3ZWxsLWRlZmluZWQgc3lzdGVtIGJvdW5kYXJ5LCBzdWNoIGFzIHVzZSBjYXNlIG9yIGZ1bmN0aW9uYWwgcmVxdWlyZW1lbnRzIHNwZWNpZmljYXRpb24uICBBIFdvcmsgUHJvZHVjdCBjYW4gYmUgY2F0ZWdvcml6ZWQgdG8gYmUgb2YgbWFueSBXb3JrIFByb2R1Y3QgVHlwZXMuICBGb3IgZXhhbXBsZSwgYSB1c2UgY2FzZSBtb2RlbCBjYW4gYmUgY2F0ZWdvcml6ZWQgYXMgYSBTcGVjaWZpY2F0aW9uIGFzIHdlbGwgYXMgRGlhZ3JhbSBXb3JrIFByb2R1Y3QgVHlwZS4KLTwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3kyT2ttdS1zRWR1SDU5S1NIVjh2Z0EiIGdlbmVyYWw9Il95Mk9rbnUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfeTJPa20tLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0id29ya1Byb2R1Y3RzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95eXpkTU8tc0VkdUg1OUtTSFY4dmdBIiBhc3NvY2lhdGlvbj0iX3kyT2t5ZS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95Mk9rbk8tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95Mk9rbmUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfeTJPa251LXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iQ29udGVudENhdGVnb3J5IiBpc0Fic3RyYWN0PSJ0cnVlIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeTJPa24tLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3kyT2tudS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5Db250ZW50IENhdGVnb3J5IGlzIGFuIGFic3RyYWN0IGNsYXNzIGdlbmVyYWxpemluZyBjb250ZW50IGNhdGVnb3J5IHR5cGVzLjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3kyT2tvTy1zRWR1SDU5S1NIVjh2Z0EiIGdlbmVyYWw9Il95eHc3Vk8tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il95Mk9rb2Utc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJEaXNjaXBsaW5lR3JvdXBpbmciPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95Mk9rb3Utc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeTJPa29lLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PkRpc2NpcGxpbmUgR3JvdXBpbmdzIGFyZSB1c2VkIHRvIGdyb3VwIERpc2NpcGxpbmVzLiAgRm9yIGV4YW1wbGUsIHRoZSBEaXNjaXBsaW5lIEdyb3VwaW5nICZxdW90O1NvZnR3YXJlIERpc2NpcGxpbmVzJnF1b3Q7IHdvdWxkIGJlIHRoZSBncm91cCBvZiBhbGwgZGlzY2lwbGluZXMgcmVsYXRlZCB0byBkZXZlbG9waW5nIHNvZnR3YXJlIHN1Y2ggYXMgJnF1b3Q7UmVxdWlyZW1lbnRzIE1hbmFnZW1lbnQmcXVvdDsgb3IgJnF1b3Q7VGVzdGluZyZxdW90OzsgJnF1b3Q7SVQgSW5mcmFzdHJ1Y3R1cmUgTWFuYWdlbWVudCZxdW90OyB3b3VsZCBiZSBhIERpc2NpcGxpbmVzIEdyb3VwaW5nIGZvciBkaXNjaXBsaW5lcyBzdWNoIGFzICZxdW90O0lUIE9wZXJhdGlvbmFsIFNlcnZpY2VzJnF1b3Q7LCAmcXVvdDtJVCBDdXN0b21lciBSZWxhdGlvbnNoaXBzJnF1b3Q7LCBvciAmcXVvdDtJVCBFbmFibGluZyBTZXJ2aWNlcyZxdW90Oy4gIERpc2NpcGxpbmVzIGNhbiBiZSBhc3NvY2lhdGVkIHRvIG1vcmUgdGhhbiBvbmUgRGlzY2lwbGluZSBHcm91cGluZy4KLTwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3kyT2tvLS1zRWR1SDU5S1NIVjh2Z0EiIGdlbmVyYWw9Il95Mk9rbnUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfeTJPa3BPLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iZGlzY2lwbGluZXMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3kyT2tnTy1zRWR1SDU5S1NIVjh2Z0EiIGFzc29jaWF0aW9uPSJfeTJPa3p1LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3kyT2twZS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3kyT2twdS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il95Mk9rcC0tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJUb29sIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeTJPa3FPLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3kyT2twLS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5BIFRvb2wgaXMgYSBjb250YWluZXIvYWdncmVnYXRlIGZvciBUb29sTWVudG9ycy4gIEl0IGNhbiBhbHNvIHByb3ZpZGUgZ2VuZXJhbCBkZXNjcmlwdGlvbnMgb2YgdGhlIHRvb2wgYW5kIGl0cyBnZW5lcmFsIGNhcGFiaWxpdGllcy48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il95Mk9rcWUtc0VkdUg1OUtTSFY4dmdBIiBnZW5lcmFsPSJfeTJPa251LXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3kyT2txdS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9InRvb2xNZW50b3JzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95ejEtOXUtc0VkdUg1OUtTSFY4dmdBIiBhc3NvY2lhdGlvbj0iX3kyT2swLS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95Mk9rcS0tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95Mk9rck8tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfeTJPa3JlLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iUm9sZVNldEdyb3VwaW5nIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeTJPa3J1LXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3kyT2tyZS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5Sb2xlIFNldHMgY2FuIGJlIGNhdGVnb3JpemVkIGludG8gUm9sZSBTZXQgR3JvdXBpbmdzLiAgRm9yIGV4YW1wbGUsIGRpZmZlcmVudCBtZXRob2RzIG1pZ2h0IGRlZmluZSBzaW1pbGFyIFJvbGUgU2V0cywgd2hpY2ggaG93ZXZlciBuZWVkIHRvIGJlIGRpc3Rpbmd1aXNoZWQgZnJvbSBlYWNoIG90aGVyIG9uIGEgZ2xvYmFsIHNjYWxlLiAgVGh1cywgUm9sZSBTZXQgR3JvdXBpbmdzIGFsbG93IGRpc3Rpbmd1aXNoaW5nLCBmb3IgZXhhbXBsZSwgU29mdHdhcmUgU2VydmljZXMgTWFuYWdlciBSb2xlIFNldHMgZnJvbSBTb2Z0d2FyZSBEZXZlbG9wbWVudCBPcmdhbml6YXRpb24gTWFuYWdlciBSb2xlIFNldHMuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfeTJPa3ItLXNFZHVINTlLU0hWOHZnQSIgZ2VuZXJhbD0iX3kyT2tudS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il95Mk9rc08tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJyb2xlU2V0cyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeTJPa2llLXNFZHVINTlLU0hWOHZnQSIgYXNzb2NpYXRpb249Il95Mk9rMk8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeTJPa3NlLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeTJPa3N1LXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3kyT2tzLS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9IkN1c3RvbUNhdGVnb3J5Ij4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeTJPa3RPLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3kyT2tzLS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5BIEN1c3RvbSBDYXRlZ29yeSBpcyBhIGNhdGVnb3J5IGludHJvZHVjZWQgYnkgYSBtZXRob2QgY29udGVudCBhdXRob3IgdG8gc3RydWN0dXJlIGFueSBudW1iZXIgb2YgbWV0aG9kIENvbnRlbnQgRWxlbWVudHMgb2YgYW55IHN1YnR5cGUgYmFzZWQgb24gdXNlci1kZWZpbmVkIGNyaXRlcmlhLiAgQmVjYXVzZSBDb250ZW50IENhdGVnb3JpZXMgKGFuZCB0aGVyZWZvcmUgQ3VzdG9tIENhdGVnb3JpZXMsIHRvbykgYXJlIENvbnRlbnQgRWxlbWVudHMgdGhlbXNlbHZlcywgQ3VzdG9tIENhdGVnb3JpZXMgY2FuIGJlIHVzZWQgdG8gcmVjdXJzaXZlbHkgY2F0ZWdvcml6ZSBDb250ZW50IENhdGVnb3JpZXMgYXMgd2VsbC4gIEN1c3RvbSBDYXRlZ29yaWVzIGNhbiBhbHNvIGJlIG5lc3RlZCB3aXRoIGFueSBDb250ZW50IENhdGVnb3J5LiAgQ3VzdG9tIGNhdGVnb3JpZXMgY2FuIGJlIHVzZWQgdG8gY2F0ZWdvcml6ZSBjb250ZW50IGJhc2VkIG9uIHRoZSB1c2VyJ3MgY3JpdGVyaWEgYXMgd2VsbCBhcyB0byBkZWZpbmUgd2hvbGUgdHJlZS1zdHJ1Y3R1cmVzIG9mIG5lc3RlZCBjYXRlZ29yaWVzIGFsbG93aW5nIHRoZSB1c2VyIHRvIHN5c3RlbWF0aWNhbGx5IG5hdmlnYXRlIGFuZCBicm93c2UgbWV0aG9kIGNvbnRlbnQgYW5kIHByb2Nlc3NlcyBiYXNlZCBvbiB0aGVzZSBjYXRlZ29yaWVzLiAgRm9yIGV4YW1wbGUsIG9uZSBjb3VsZCBjcmVhdGUgYSBjdXN0b20gY2F0ZWdvcnkgdG8gbG9naWNhbGx5IG9yZ2FuaXplIGNvbnRlbnQgcmVsZXZhbnQgZm9yIHRoZSB1c2VyJ3MgZGV2ZWxvcG1lbnQgb3JnYW5pemF0aW9uIGRlcGFydG1lbnRzOyBlLmcuIGEgJnF1b3Q7VGVzdGluZyZxdW90OyBjYXRlZ29yeSB0aGF0IGdyb3VwcyB0b2dldGhlciBhbGwgcm9sZXMsIHdvcmsgcHJvZHVjdHMsIHRhc2tzLCBhbmQgZ3VpZGFuY2UgZWxlbWVudCByZWxldmFudCB0byB0ZXN0aW5nLiAgQW5vdGhlciBleGFtcGxlIHdvdWxkIGJlIGNhdGVnb3JpZXMgdGhhdCBleHByZXNzIGxpY2Vuc2luZyBsZXZlbHMgb2YgdGhlIGNvbnRlbnQgZ3JvdXBpbmcgZnJlZWx5IGRpc3RyaWJ1dGFibGUgbWV0aG9kIGNvbnRlbnQgdmVyc3VzIGNvbnRlbnQgdGhhdCByZXByZXNlbnQgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGFuZCByZXF1aXJlcyBhIGxpY2Vuc2UgdG8gYmUgcHVyY2hhc2VkIHRvIGJlIGFibGUgdG8gdXNlIGl0LgotPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfeTJPa3RlLXNFZHVINTlLU0hWOHZnQSIgZ2VuZXJhbD0iX3kyT2tudS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il95Mk9rdHUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJjYXRlZ29yaXplZEVsZW1lbnRzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95eHc3ZXUtc0VkdUg1OUtTSFY4dmdBIiBhc3NvY2lhdGlvbj0iX3kyT2szZS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95Mk9rdC0tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95Mk9rdU8tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3kyT2t1ZS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9InN1YkNhdGVnb3JpZXMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3kyT2tudS1zRWR1SDU5S1NIVjh2Z0EiIGFzc29jaWF0aW9uPSJfeTJPazR1LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3kyT2t1dS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3kyT2t1LS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il95Mk9rdk8tc0VkdUg1OUtTSFY4dmdBIiBtZW1iZXJFbmQ9Il95Mk9rdnUtc0VkdUg1OUtTSFY4dmdBIF95Mk9rak8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeTJPa3ZlLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3kyT2t2Ty1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5BIFJvbGUgU2V0IGNhdGVnb3JpemVzIG1hbnkgUm9sZXMgYW5kIGEgUm9sZSBjYW4gYmUgcmVwcmVzZW50ZWQgaW4gbWF5IFJvbGUgU2V0cy48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il95Mk9rdnUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJyb2xlU2V0cyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeTJPa2llLXNFZHVINTlLU0hWOHZnQSIgYXNzb2NpYXRpb249Il95Mk9rdk8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeTJPa3YtLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeTJPa3dPLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3kyT2t3ZS1zRWR1SDU5S1NIVjh2Z0EiIG1lbWJlckVuZD0iX3kyT2t3LS1zRWR1SDU5S1NIVjh2Z0EgX3kyT2trdS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95Mk9rd3Utc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeTJPa3dlLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PkEgRG9tYWluIGNhdGVnb3JpemVzIG1hbnkgV29yayBQcm9kdWN0cy4gQSBXb3JrIFByb2R1Y3QgYmVsb25ncyBhdCBtb3N0IHRvIG9uZSBEb21haW4uPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfeTJPa3ctLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iZG9tYWluIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95Mk9rai0tc0VkdUg1OUtTSFY4dmdBIiBhc3NvY2lhdGlvbj0iX3kyT2t3ZS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95Mk9reE8tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95Mk9reGUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkRW5kPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfeTJPa3h1LXNFZHVINTlLU0hWOHZnQSIgbWVtYmVyRW5kPSJfeTJPa3lPLXNFZHVINTlLU0hWOHZnQSBfeTJPa2xlLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3kyT2t4LS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95Mk9reHUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+RG9tYWlucyBjYW4gYmUgZnVydGhlciBkaXZpZGVkIGludG8gU3ViZG9tYWlucywgd2l0aCB3b3JrIHByb2R1Y3QgZWxlbWVudHMgb25seSB0byBiZSBjYXRlZ29yaXplZCBhdCB0aGUgbGVhZi1sZXZlbC48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il95Mk9reU8tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJfZG9tYWluIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95Mk9rai0tc0VkdUg1OUtTSFY4dmdBIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfeTJPa3h1LXNFZHVINTlLU0hWOHZnQSIvPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfeTJPa3llLXNFZHVINTlLU0hWOHZnQSIgbWVtYmVyRW5kPSJfeTJPa3ktLXNFZHVINTlLU0hWOHZnQSBfeTJPa20tLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3kyT2t5dS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95Mk9reWUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+QSBXb3JrIFByb2R1Y3QgY2FuIGJlIGNhdGVnb3JpemVkIHRvIGJlIHplcm8gb2YgbWFueSBXb3JrIFByb2R1Y3QgVHlwZXMuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfeTJPa3ktLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0id29ya1Byb2R1Y3RUeXBlcyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeTJPa21PLXNFZHVINTlLU0hWOHZnQSIgYXNzb2NpYXRpb249Il95Mk9reWUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeTJPa3pPLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeTJPa3plLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3kyT2t6dS1zRWR1SDU5S1NIVjh2Z0EiIG1lbWJlckVuZD0iX3kyT2swTy1zRWR1SDU5S1NIVjh2Z0EgX3kyT2twTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95Mk9rei0tc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeTJPa3p1LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PkRpc2NpcGxpbmUgR3JvdXBpbmdzIGdyb3VwIG1hbnkgRGlzY2lwbGluZXMuICBBIERpc2NpcGxpbmUgY2FuIGJlIGluIG1hbnkgRGlzY2lwbGluZSBHcm91cHMuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfeTJPazBPLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iZGlzY2lwbGluZUdyb3VwcyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeTJPa29lLXNFZHVINTlLU0hWOHZnQSIgYXNzb2NpYXRpb249Il95Mk9renUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeTJPazBlLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeTJPazB1LXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3kyT2swLS1zRWR1SDU5S1NIVjh2Z0EiIG1lbWJlckVuZD0iX3kyT2sxZS1zRWR1SDU5S1NIVjh2Z0EgX3kyT2txdS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95Mk9rMU8tc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeTJPazAtLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PkEgVG9vbCBNZW50b3IgZGVzY3JpYmVzIHdvcmsgd2l0aCBleGFjdGx5IG9uZSBUb29sLjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iX3kyT2sxZS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9InRvb2wiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3kyT2twLS1zRWR1SDU5S1NIVjh2Z0EiIGFzc29jaWF0aW9uPSJfeTJPazAtLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3kyT2sxdS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIxIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3kyT2sxLS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIxIi8+Ci0gICAgICA8L293bmVkRW5kPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfeTJPazJPLXNFZHVINTlLU0hWOHZnQSIgbWVtYmVyRW5kPSJfeTJPazJ1LXNFZHVINTlLU0hWOHZnQSBfeTJPa3NPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3kyT2syZS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95Mk9rMk8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+QSBSb2xlIFNldCBHcm91cGluZyBjb250YWlucyBtYW55IFJvbGUgU2V0cy4gUm9sZSBTZXRzIGNhbiBiZSBpbiBtYW55IFJvbGUgU2V0IEdyb3VwaW5ncy48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il95Mk9rMnUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJyb2xlU2V0R3JvdXBzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95Mk9rcmUtc0VkdUg1OUtTSFY4dmdBIiBhc3NvY2lhdGlvbj0iX3kyT2syTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95Mk9rMi0tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95Mk9rM08tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkRW5kPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfeTJPazNlLXNFZHVINTlLU0hWOHZnQSIgbWVtYmVyRW5kPSJfeTJPa3R1LXNFZHVINTlLU0hWOHZnQSBfeTJPazMtLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3kyT2szdS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95Mk9rM2Utc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+QSBDdXN0b21DYXRlZ29yeSBncm91cHMgdG9nZXRoZXIgYW55IG51bWJlciBvZiBDb250ZW50RWxlbWVudHMgaW5jbHVkaW5nIG90aGVyIENvbnRlbnRDYXRlZ29yeS4gPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfeTJPazMtLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iY3VzdG9tQ2F0ZWdvcmllcyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeTJPa3MtLXNFZHVINTlLU0hWOHZnQSIgYXNzb2NpYXRpb249Il95Mk9rM2Utc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeTJPazRPLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeTJPazRlLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3kyT2s0dS1zRWR1SDU5S1NIVjh2Z0EiIG1lbWJlckVuZD0iX3kyT2t1ZS1zRWR1SDU5S1NIVjh2Z0EgX3kyT2s1Ty1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95Mk9rNC0tc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeTJPazR1LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PkEgQ3VzdG9tQ2F0ZWdvcnkgY2FuIGhhdmUgYW55IG51bWJlciBvZiBDb250ZW50Q2F0ZWdvcmllcyBkZWZpbmVkIGFzIG5lc3RlZCBzdWJDYXRlZ29yaWVzLiAgVGhlcmVmb3JlLCBvbmUgY291bGQgbmVzdCBDdXN0b21DYXRlZ29yaWVzIGludG8gbi1sZXZlbCBoaWVyYXJjaGllcy4gPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfeTJPazVPLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iX2N1c3RvbUNhdGVnb3J5IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95Mk9rcy0tc0VkdUg1OUtTSFY4dmdBIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfeTJPazR1LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3kyT2s1ZS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIxIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3kyT2s1dS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIxIi8+Ci0gICAgICA8L293bmVkRW5kPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfeTJPazUtLXNFZHVINTlLU0hWOHZnQSIgbWVtYmVyRW5kPSJfeTJPa2ctLXNFZHVINTlLU0hWOHZnQSBfeTJPazZlLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3kyT2s2Ty1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95Mk9rNS0tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+RXZlcnkgVGFzayBzaG91bGQgYmUgcmVsYXRlZCB0byBleGFjdGx5IG9uZSBEaXNjaXBsaW5lLiAgRm9yIGxlZ2FjeSByZWFzb25zIHRoaXMgaXMgbm90IGVuZm9yY2VkIChlLmcuIEdTIE1ldGhvZCBkb2VzIG5vdCBkZWZpbmUgRGlzY2lwbGluZXMsIHlldCkuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfeTJPazZlLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iZGlzY2lwbGluZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeTJPa2dPLXNFZHVINTlLU0hWOHZnQSIgYXNzb2NpYXRpb249Il95Mk9rNS0tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeTJPazZ1LXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeTJPazYtLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3kyT2s3Ty1zRWR1SDU5S1NIVjh2Z0EiIG1lbWJlckVuZD0iX3kyT2todS1zRWR1SDU5S1NIVjh2Z0EgX3kyT2s3ZS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iX3kyT2s3ZS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9Il9kaXNjaXBsaW5lIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95Mk9rZ08tc0VkdUg1OUtTSFY4dmdBIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfeTJPazdPLXNFZHVINTlLU0hWOHZnQSIvPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfeTNSdFlPLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iU3RhdGUiPgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3kzUnRZZS1zRWR1SDU5S1NIVjh2Z0EiIGdlbmVyYWw9Il95M2EzWS0tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfeTNSdFl1LXNFZHVINTlLU0hWOHZnQSIgbmFtZT0id29ya1Byb2R1Y3QiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l5emRNTy1zRWR1SDU5S1NIVjh2Z0EiIGFzc29jaWF0aW9uPSJfeTNhM2hlLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3kzUnRZLS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3kzUnRaTy1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIxIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3kzUnRaZS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9InJlZ2lvbiIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeTNhM2VlLXNFZHVINTlLU0hWOHZnQSIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgYXNzb2NpYXRpb249Il95M2EzamUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeTNSdFp1LXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeTNSdFotLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il95M1J0YU8tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJzdWJtYWNoaW5lIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95M2EzWHUtc0VkdUg1OUtTSFY4dmdBIiBhc3NvY2lhdGlvbj0iX3kzYTNqdS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95M1J0YWUtc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iMSIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95M1J0YXUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfeTNhM1VPLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iVHJhbnNpdGlvbiI+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfeTNhM1VlLXNFZHVINTlLU0hWOHZnQSIgZ2VuZXJhbD0iX3l4dzdRZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il95M2EzVXUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJ3b3JrRGVmaW5pdGlvbiIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXl6ZFRPLXNFZHVINTlLU0hWOHZnQSIgYXNzb2NpYXRpb249Il95M2EzaC0tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeTNhM1UtLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeTNhM1ZPLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjEiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfeTNhM1ZlLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iY29udGFpbmVyIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95M2EzZWUtc0VkdUg1OUtTSFY4dmdBIiBhc3NvY2lhdGlvbj0iX3kzYTNpdS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95M2EzVnUtc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iMSIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95M2EzVi0tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iMSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il95M2EzV08tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJzb3VyY2UiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3kzYTNZLS1zRWR1SDU5S1NIVjh2Z0EiIGFzc29jaWF0aW9uPSJfeTNhM2ktLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3kzYTNXZS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIxIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3kzYTNXdS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIxIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3kzYTNXLS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9InRhcmdldCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeTNhM1ktLXNFZHVINTlLU0hWOHZnQSIgYXNzb2NpYXRpb249Il95M2Ezak8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeTNhM1hPLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjEiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeTNhM1hlLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjEiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il95M2EzWHUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJTdGF0ZU1hY2hpbmUiPgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3kzYTNYLS1zRWR1SDU5S1NIVjh2Z0EiIGdlbmVyYWw9Il95eXpkVE8tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfeTNhM1lPLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0icmVnaW9uIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95M2EzZWUtc0VkdUg1OUtTSFY4dmdBIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBhc3NvY2lhdGlvbj0iX3kzYTNrdS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95M2EzWWUtc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95M2EzWXUtc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iMSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3kzYTNZLS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9IlZlcnRleCI+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfeTNhM1pPLXNFZHVINTlLU0hWOHZnQSIgZ2VuZXJhbD0iX3l4dzdRZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il95M2EzWmUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJjb250YWluZXIiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3kzYTNlZS1zRWR1SDU5S1NIVjh2Z0EiIGFzc29jaWF0aW9uPSJfeTNhM2llLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3kzYTNadS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIxIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3kzYTNaLS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfeTNhM2FPLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0ib3V0Z29pbmciIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3kzYTNVTy1zRWR1SDU5S1NIVjh2Z0EiIGFzc29jaWF0aW9uPSJfeTNhM2ktLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3kzYTNhZS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3kzYTNhdS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfeTNhM2EtLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iaW5jb21pbmciIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3kzYTNVTy1zRWR1SDU5S1NIVjh2Z0EiIGFzc29jaWF0aW9uPSJfeTNhM2pPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3kzYTNiTy1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3kzYTNiZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il95M2EzYnUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJQc2V1ZG9TdGF0ZSI+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfeTNhM2ItLXNFZHVINTlLU0hWOHZnQSIgZ2VuZXJhbD0iX3kzYTNZLS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6RW51bWVyYXRpb24iIHhtaTppZD0iX3kzYTNjTy1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9IlBzZXVkb1N0YXRlS2luZCI+Ci0gICAgICA8b3duZWRMaXRlcmFsIHhtaTppZD0iX3kzYTNjZS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9ImluaXRpYWwiLz4KLSAgICAgIDxvd25lZExpdGVyYWwgeG1pOmlkPSJfeTNhM2N1LXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iam9pbiIvPgotICAgICAgPG93bmVkTGl0ZXJhbCB4bWk6aWQ9Il95M2EzYy0tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJmb3JrIi8+Ci0gICAgICA8b3duZWRMaXRlcmFsIHhtaTppZD0iX3kzYTNkTy1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9Imp1bmN0aW9uIi8+Ci0gICAgICA8b3duZWRMaXRlcmFsIHhtaTppZD0iX3kzYTNkZS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9ImNob2ljZSIvPgotICAgICAgPG93bmVkTGl0ZXJhbCB4bWk6aWQ9Il95M2EzZHUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJlbnRyeVBvaW50Ii8+Ci0gICAgICA8b3duZWRMaXRlcmFsIHhtaTppZD0iX3kzYTNkLS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9ImV4aXRQb2ludCIvPgotICAgICAgPG93bmVkTGl0ZXJhbCB4bWk6aWQ9Il95M2EzZU8tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJ0ZXJtaW5hdGUiLz4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3kzYTNlZS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9IlJlZ2lvbiI+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfeTNhM2V1LXNFZHVINTlLU0hWOHZnQSIgZ2VuZXJhbD0iX3l4dzdRZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il95M2EzZS0tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJ2ZXJ0ZXgiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3kzYTNZLS1zRWR1SDU5S1NIVjh2Z0EiIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiIGFzc29jaWF0aW9uPSJfeTNhM2llLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3kzYTNmTy1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3kzYTNmZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfeTNhM2Z1LXNFZHVINTlLU0hWOHZnQSIgbmFtZT0idHJhbnNpdGlvbiIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeTNhM1VPLXNFZHVINTlLU0hWOHZnQSIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgYXNzb2NpYXRpb249Il95M2EzaXUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeTNhM2YtLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeTNhM2dPLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il95M2EzZ2Utc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJzdGF0ZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeTNSdFlPLXNFZHVINTlLU0hWOHZnQSIgYXNzb2NpYXRpb249Il95M2EzamUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfeTNhM2d1LXNFZHVINTlLU0hWOHZnQSIgbmFtZT0ic3RhdGVNYWNoaW5lIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95M2EzWHUtc0VkdUg1OUtTSFY4dmdBIiBhc3NvY2lhdGlvbj0iX3kzYTNrdS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95M2EzZy0tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iMSIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95M2EzaE8tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfeTNhM2hlLXNFZHVINTlLU0hWOHZnQSIgbWVtYmVyRW5kPSJfeTNSdFl1LXNFZHVINTlLU0hWOHZnQSBfeTNhM2h1LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfeTNhM2h1LXNFZHVINTlLU0hWOHZnQSIgbmFtZT0ic3RhdGUiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3kzUnRZTy1zRWR1SDU5S1NIVjh2Z0EiIGFzc29jaWF0aW9uPSJfeTNhM2hlLXNFZHVINTlLU0hWOHZnQSIvPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfeTNhM2gtLXNFZHVINTlLU0hWOHZnQSIgbWVtYmVyRW5kPSJfeTNhM1V1LXNFZHVINTlLU0hWOHZnQSBfeTNhM2lPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfeTNhM2lPLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0idHJhbnNpdGlvbiIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeTNhM1VPLXNFZHVINTlLU0hWOHZnQSIgYXNzb2NpYXRpb249Il95M2EzaC0tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il95M2EzaWUtc0VkdUg1OUtTSFY4dmdBIiBtZW1iZXJFbmQ9Il95M2EzZS0tc0VkdUg1OUtTSFY4dmdBIF95M2EzWmUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il95M2EzaXUtc0VkdUg1OUtTSFY4dmdBIiBtZW1iZXJFbmQ9Il95M2EzZnUtc0VkdUg1OUtTSFY4dmdBIF95M2EzVmUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il95M2EzaS0tc0VkdUg1OUtTSFY4dmdBIiBtZW1iZXJFbmQ9Il95M2EzYU8tc0VkdUg1OUtTSFY4dmdBIF95M2EzV08tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il95M2Ezak8tc0VkdUg1OUtTSFY4dmdBIiBtZW1iZXJFbmQ9Il95M2EzYS0tc0VkdUg1OUtTSFY4dmdBIF95M2EzVy0tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il95M2EzamUtc0VkdUg1OUtTSFY4dmdBIiBtZW1iZXJFbmQ9Il95M1J0WmUtc0VkdUg1OUtTSFY4dmdBIF95M2EzZ2Utc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il95M2EzanUtc0VkdUg1OUtTSFY4dmdBIiBtZW1iZXJFbmQ9Il95M1J0YU8tc0VkdUg1OUtTSFY4dmdBIF95M2Ezai0tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il95M2Ezai0tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJzdWJNYWNoaW5lU3RhdGUiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3kzUnRZTy1zRWR1SDU5S1NIVjh2Z0EiIGFzc29jaWF0aW9uPSJfeTNhM2p1LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3kzYTNrTy1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3kzYTNrZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il95M2Eza3Utc0VkdUg1OUtTSFY4dmdBIiBtZW1iZXJFbmQ9Il95M2EzWU8tc0VkdUg1OUtTSFY4dmdBIF95M2EzZ3Utc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il95NGVBTWUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJNZXRob2RQYWNrYWdlIiBpc0Fic3RyYWN0PSJ0cnVlIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeTRlQU11LXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3k0ZUFNZS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5BIE1ldGhvZCBQYWNrYWdlIGlzIGFuIGFic3RyYWN0IGNsYXNzIGZvciBwYWNrYWdpbmcgTWV0aG9kIEVsZW1lbnRzLiAgQWxsIE1ldGhvZCBFbGVtZW50cyBzaGFsbCBiZSBsb2NhdGVkIGluIGV4YWN0bHkgb25lIG9mIE1ldGhvZCBQYWNrYWdlJ3MgY29uY3JldGUgc3BlY2lhbGl6YXRpb25zIChlLmcuIENvbnRlbnQgUGFja2FnZSkuICAgTWV0aG9kIFBhY2thZ2UgZGVmaW5lcyBjb21tb24gcHJvcGVydGllcyBmb3IgYWxsIG9mIGl0cyBzcGVjaWFsaXphdGlvbnMuIEVsZW1lbnRzIGFyZSBvcmdhbml6ZWQgaW4gTWV0aG9kIFBhY2thZ2VzIHRvIHN0cnVjdHVyZSBsYXJnZSBzY2FsZSBvZiBtZXRob2QgY29udGVudCBhbmQgcHJvY2Vzc2VzIGFzIHdlbGwgYXMgdG8gZGVmaW5lIGEgbWVjaGFuaXNtIGZvciByZXVzZS4gIE1ldGhvZCBFbGVtZW50cyBmcm9tIG9uZSBwYWNrYWdlIGNhbiByZXVzZSBlbGVtZW50IGZyb20gb3RoZXIgcGFja2FnZXMgYnkgZGVmaW5pbmcgYSByZXVzZWRQYWNrYWdlcyBsaW5rLiAgRm9yIGV4YW1wbGUsIGEgd29yayBwcm9kdWN0IGRlZmluZWQgaW4gb25lIHBhY2thZ2UgY2FuIGJlIHVzZWQgYXMgYW4gaW5wdXQgZm9yIFRhc2tzIGRlZmluZWQgaW4gb3RoZXIgcGFja2FnZXMuICBCeSByZXVzaW5nIGl0IGZyb20gb25lIGNvbW1vbiBwbGFjZSAoaS5lLiB0aGUgcGFja2FnZSBpbiB3aGljaCBpdCBoYXMgYmVlbiBkZWZpbmVkKSBlbnN1cmVzIHRoYXQgbm8gcmVkdW5kYW50IGRlZmluaXRpb25zIG9mIHRoZSBzYW1lIGVsZW1lbnRzIGFyZSByZXF1aXJlZC4gIEFsc28gbWFpbnRlbmFuY2Ugb2YgbWV0aG9kIGNvbnRlbnQgaXMgZ3JlYXRseSBpbXByb3ZlZCBhcyBjaGFuZ2VzIGNhbiBiZSBwZXJmb3JtZWQgaW4gb25seSBvbmUgcGxhY2UuICBOb3RlLCB0aGF0IG90aGVyIHBhY2thZ2VzIHdpbGwgaW50cm9kdWNlIG1vcmUgc3BlY2lhbGl6YXRpb25zIG9mIE1ldGhvZCBQYWNrYWdlLCBlLmcuIFByb2Nlc3MgUGFja2FnZSBhbmQgUHJvY2VzcyBDb21wb25lbnQuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfeTRlQU0tLXNFZHVINTlLU0hWOHZnQSIgZ2VuZXJhbD0iX3l4VVBWTy1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il95NGVBTk8tc0VkdUg1OUtTSFY4dmdBIiBnZW5lcmFsPSJfeXh3N1FlLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3k0ZUFOZS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9Imdsb2JhbCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXhVUGJ1LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeTRlQU51LXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3k0ZUFOZS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICAgIDxib2R5Pk1ldGhvZCBQYWNrYWdlcyBjYW4gaGF2ZSBhIGdsb2JhbCBzY29wZS4gIFRoaXMgbWVhbnMgdGhhdCBldmVyeSBlbGVtZW50IG9mIGV2ZXJ5IG90aGVyIE1ldGhvZCBQYWNrYWdlIGNhbiBzZWUgdGhlIGdsb2JhbCBwYWNrYWdlJ3MgY29udGVudHMuICBHbG9iYWwgTWV0aG9kIFBhY2thZ2VzIGFyZSBwcmltYXJpbHkgdXNlZCB0byBzdG9yZSBjb21tb25seSB1c2VkIGNhdGVnb3J5IGRlZmluaXRpb25zIHN1Y2ggYXMgZm9yIERpc2NpcGxpbmVzIG9yIERvbWFpbnMsIHdoaWNoIGFyZSB1c2VkIGJ5IG1hbnkgVGFzayBhbmQgV29yayBQcm9kdWN0cyByZXNwZWN0aXZlbHkuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iX3k0ZUFOLS1zRWR1SDU5S1NIVjh2Z0EiIHR5cGU9Il95eFVQYnUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgICA8Ym9keT5mYWxzZTwvYm9keT4KLSAgICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3k0ZUFPTy1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9InJldXNlZFBhY2thZ2VzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95NGVBTWUtc0VkdUg1OUtTSFY4dmdBIiBhc3NvY2lhdGlvbj0iX3k0ZUFTZS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95NGVBT2Utc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95NGVBT3Utc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3k0ZUFPLS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9ImNoaWxkUGFja2FnZXMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3k0ZUFNZS1zRWR1SDU5S1NIVjh2Z0EiIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiIGFzc29jaWF0aW9uPSJfeTRlQVR1LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3k0ZUFQTy1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3k0ZUFQZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il95NGVBUHUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJDb250ZW50UGFja2FnZSI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3k0ZUFQLS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95NGVBUHUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+QSBDb250ZW50IFBhY2thZ2UgaXMgc3BlY2lhbCBNZXRob2QgUGFja2FnZSB0aGF0IGNvbnRhaW5zIENvbnRlbnQgRWxlbWVudHMgYW5kIENvbnRlbnQgRWxlbWVudHMsIG9ubHkuICBFeGFtcGxlcyBmb3IgQ29udGVudCBFbGVtZW50IGFyZSBBcnRpZmFjdHMsIFRhc2tzLCBSb2xlcywgZXRjLiAgQSBrZXkgc2VwYXJhdGlvbiBvZiBjb25jZXJucyBpbiBVTUEgaXMgdGhlIGRpc3RpbmN0aW9uIGJldHdlZW4gTWV0aG9kIENvbnRlbnQgYW5kIFByb2Nlc3MuICBUaGlzIHNlcGFyYXRpb24gaXMgZW5mb3JjZWQgYnkgc3BlY2lhbCBwYWNrYWdlIHR5cGVzLCB3aGljaCBkbyBub3QgYWxsb3cgdGhlIG1peGluZyBvZiBtZXRob2QgY29udGVudCB3aXRoIHByb2Nlc3Nlcy48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il95NGVBUU8tc0VkdUg1OUtTSFY4dmdBIiBnZW5lcmFsPSJfeTRlQU1lLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3k0ZUFRZS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9ImNvbnRlbnRFbGVtZW50cyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXh3N1ZPLXNFZHVINTlLU0hWOHZnQSIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgYXNzb2NpYXRpb249Il95NGVBUk8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeTRlQVF1LXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeTRlQVEtLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3k0ZUFSTy1zRWR1SDU5S1NIVjh2Z0EiIG1lbWJlckVuZD0iX3k0ZUFRZS1zRWR1SDU5S1NIVjh2Z0EgX3k0ZUFSdS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95NGVBUmUtc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeTRlQVJPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PkEgQ29udGVudCBQYWNrYWdlIGNvbnRhaW5zIENvbnRlbnQgRWxlbWVudHMuICBBIENvbnRlbnQgRWxlbWVudCBpbnN0YW5jZSBjYW4gYmUgcGFydCBvZiBvbmx5IG9uZSBwYWNrYWdlIGluc3RhbmNlLjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iX3k0ZUFSdS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9Il9jb250ZW50UGFja2FnZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeTRlQVB1LXNFZHVINTlLU0hWOHZnQSIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iX3k0ZUFSTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95NGVBUi0tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iMSIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95NGVBU08tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iMSIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3k0ZUFTZS1zRWR1SDU5S1NIVjh2Z0EiIG1lbWJlckVuZD0iX3k0ZUFTLS1zRWR1SDU5S1NIVjh2Z0EgX3k0ZUFPTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95NGVBU3Utc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeTRlQVNlLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PlRoaXMgYXNzb2NpYXRpb24gZGVzY3JpYmVzIGEgZGVwZW5kZW5jeSBiZXR3ZWVuIHRoZSB0d28gcGFja2FnZXMgaXQgY29ubmVjdHMuICBUaGUgcGFja2FnZSBhdCB0aGUgdXNpbmdQYWNrYWdlIGVuZCBkZXBlbmRzIG9uIHRoZSBwYWNrYWdlIGF0IHRoZSByZXVzZWRQYWNrYWdlIGVuZC4gIEZvciBleGFtcGxlLCBhbiBlbGVtZW50IGluIHRoZSBmb3JtZXIgcGFja2FnZSBpcyB1c2luZyBhbiBlbGVtZW50IGluIHRoZSBsYXRlciBpbiBhIHJlbGF0aW9uc2hpcCBzdWNoIGFzIGEgVGFzayBpcyB1c2luZyBhIFdvcmsgUHJvZHVjdHMgYXMgYW4gaW5wdXQuICBSZWZsZXhpdmUgcmV1c2VkUGFja2FnZSBsaW5rcyAoaS5lLiBhIHBhY2thZ2UgdGhhdCBkZXBlbmRzIG9uIGl0c2VsZikgYXJlIG5vdCBhbGxvd2VkLjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iX3k0ZUFTLS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9InVzaW5nUGFja2FnZXMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3k0ZUFNZS1zRWR1SDU5S1NIVjh2Z0EiIGFzc29jaWF0aW9uPSJfeTRlQVNlLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3k0ZUFUTy1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3k0ZUFUZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il95NGVBVHUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJQYWNrYWdlTmVzdGluZyIgbWVtYmVyRW5kPSJfeTRlQVVPLXNFZHVINTlLU0hWOHZnQSBfeTRlQU8tLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3k0ZUFULS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95NGVBVHUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+TWV0aG9kIFBhY2thZ2VzIGNhbiBiZSBuZXN0ZWQsIGkuZS4gYSBwYWNrYWdlIGNhbiBiZSBwYXJ0IG9mIGFub3RoZXIgcGFja2FnZS4gIE5lc3RlZCBwYWNrYWdlcyBkbyBub3QgbmVlZCB0byBiZSBvZiB0aGUgc2FtZSB0eXBlLCBlLmcuIGEgQ29udGVudCBQYWNrYWdlIGNhbiBiZSBkZWZpbmVkIGluc2lkZSBhIFByb2Nlc3MgUGFja2FnZSAoZGVmaW5lIGZvciB0aGUgUHJvY2VzcyBwYXJ0IG9mIHRoaXMgbW9kZWwpLjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iX3k0ZUFVTy1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9Il9tZXRob2RQYWNrYWdlIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95NGVBTWUtc0VkdUg1OUtTSFY4dmdBIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfeTRlQVR1LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3k0ZUFVZS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIxIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3k0ZUFVdS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il95N21NdC0tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJNaWxlc3RvbmUiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95N21NdU8tc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeTdtTXQtLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PkEgTWlsZXN0b25lIGRlc2NyaWJlcyBhIHNpZ25pZmljYW50IGV2ZW50IGluIGEgZGV2ZWxvcG1lbnQgcHJvamVjdCwgc3VjaCBhcyBhIG1ham9yIGRlY2lzaW9uLCBjb21wbGV0aW9uIG9mIGEgZGVsaXZlcmFibGUsIG9yIG1lZXRpbmcgb2YgYSBtYWpvciBkZXBlbmRlbmN5IChsaWtlIGNvbXBsZXRpb24gb2YgYSBwcm9qZWN0IHBoYXNlKS4gIEJlY2F1c2UsIE1pbGVzdG9uZSBpcyBjb21tb25seSB1c2VkIHRvIHJlZmVyIHRvIGJvdGggdGhlIGV2ZW50IGl0c2VsZiBhbmQgdGhlIHBvaW50IGluIHRpbWUgYXQgd2hpY2ggdGhlIGV2ZW50IGlzIHNjaGVkdWxlZCB0byBoYXBwZW4sIGl0IGlzIG1vZGVsZWQgYXMgYSBCcmVha2Rvd24gRWxlbWVudCAoaS5lLiBpdCBhcHBlYXJzIGFzIHBhcnQgb2YgYSBicmVha2Rvd24gc3RydWN0dXJlKS48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il95N21NdWUtc0VkdUg1OUtTSFY4dmdBIiBnZW5lcmFsPSJfeTd2WEtlLXNFZHVINTlLU0hWOHZnQSIvPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfeTdtTXV1LXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iSXRlcmF0aW9uIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeTdtTXUtLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3k3bU11dS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5JdGVyYXRpb24gaXMgYSBzcGVjaWFsIEFjdGl2aXR5LCB3aGljaCBwcmVzY3JpYmVzIHByZS1kZWZpbmVkIHZhbHVlcyBmb3IgaXRzIGluc3RhbmNlcyBmb3IgdGhlIGF0dHJpYnV0ZXMgcHJlZml4ICgnSXRlcmF0aW9uJykgYW5kIGlzUmVwZWF0YWJsZSAoJ1RydWUnKS4gIEl0IGhhcyBiZWVuIGluY2x1ZGVkIGludG8gdGhlIG1ldGEtbW9kZWwgZm9yIGNvbnZlbmllbmNlIGFuZCB0byBwcm92aWRlIGEgc3BlY2lhbCBzdGVyZW90eXBlLCBiZWNhdXNlIGl0IHJlcHJlc2VudHMgYSB2ZXJ5IGNvbW1vbmx5IHVzZWQgQWN0aXZpdHkgdHlwZS4KLUl0ZXJhdGlvbiBncm91cHMgYSBzZXQgb2YgbmVzdGVkIEFjdGl2aXRpZXMgdGhhdCBhcmUgcmVwZWF0ZWQgbW9yZSB0aGFuIG9uY2UuICBJdCByZXByZXNlbnRzIGFuIGltcG9ydGFudCBzdHJ1Y3R1cmluZyBlbGVtZW50IHRvIG9yZ2FuaXplIHdvcmsgaW4gcmVwZXRpdGl2ZSBjeWNsZXMuICBUaGUgY29uY2VwdCBvZiBJdGVyYXRpb24gY2FuIGJlIGFzc29jaWF0ZWQgd2l0aCBkaWZmZXJlbnQgcnVsZXMgaW4gZGlmZmVyZW50IG1ldGhvZHMuICBGb3IgZXhhbXBsZSwgdGhlIElCTSBSYXRpb25hbCBVbmlmaWVkIFByb2Nlc3MgbWV0aG9kIGZyYW1ld29yayAoUlVQKSBkZWZpbmVzIGEgcnVsZSB0aGF0IEl0ZXJhdGlvbnMgYXJlIG5vdCBhbGxvd2VkIHRvIHNwYW4gYWNyb3NzIFBoYXNlcy4gIEluIGNvbnRyYXN0IElCTSBHbG9iYWwgU2VydmljZXMgTWV0aG9kIChHU01ldGhvZCkgYmFzZWQgbWV0aG9kIGZyYW1ld29ya3MgdGhpcyBydWxlIGRvZXMgbm90IGFwcGx5IGFuZCBJdGVyYXRpb24gY2FuIGJlIGRlZmluZWQgd2hpY2ggbmVzdCBQaGFzZXMuICBSdWxlcyBsaWtlIHRoZXNlLCB3aGljaCBwbGF5IGFuIGltcG9ydGFudCByb2xlIGZvciBlYWNoIGluZGl2aWR1YWwgbWV0aG9kIGFuZCBhcmUgdGhlcmVmb3JlIG5vdCBlbmZvcmNlZCBieSB0aGlzIG1ldGEtbW9kZWwuICBJbnN0ZWFkLCBwcm9jZXNzIGF1dGhvcnMgYXJlIGV4cGVjdGVkIHRvIGZvbGxvdyBhbmQgY2hlY2sgdGhlc2UgcnVsZXMgbWFudWFsbHkuICAoTm90ZTogQW55IEJyZWFrZG93biBFbGVtZW50IGNhbiBiZSByZXBlYXRlZDsgaG93ZXZlciwgSXRlcmF0aW9ucyBoYXMgYmVlbiBpbnRyb2R1Y2VkIGFzIGEgc3BlY2lhbCBtZXRhLW1vZGVsIGNvbmNlcHQsIGJlY2F1c2Ugb2YgaXRzIGltcG9ydGFudCByb2xlIGZvciBtYW55IG1ldGhvZHMuKQotPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfeTdtTXZPLXNFZHVINTlLU0hWOHZnQSIgZ2VuZXJhbD0iX3k3bU1zTy1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3k3bU12ZS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9IlBoYXNlIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeTdtTXZ1LXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3k3bU12ZS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5QaGFzZSBpcyBhIHNwZWNpYWwgQWN0aXZpdHksIHdoaWNoIHByZXNjcmliZXMgcHJlLWRlZmluZWQgdmFsdWVzIGZvciBpdHMgaW5zdGFuY2VzIGZvciB0aGUgYXR0cmlidXRlcyBwcmVmaXggKCdQaGFzZScpIGFuZCBpc1JlcGVhdGFibGUgKCdGYWxzZScpLiAgSXQgaGFzIGJlZW4gaW5jbHVkZWQgaW50byB0aGUgbWV0YS1tb2RlbCBmb3IgY29udmVuaWVuY2UgYW5kIHRvIHByb3ZpZGUgYSBzcGVjaWFsIHN0ZXJlb3R5cGUsIGJlY2F1c2UgaXQgcmVwcmVzZW50cyBhIHZlcnkgY29tbW9ubHkgdXNlZCBBY3Rpdml0eSB0eXBlLgotUGhhc2UgcmVwcmVzZW50IGEgc2lnbmlmaWNhbnQgcGVyaW9kIGluIGEgcHJvamVjdCwgZW5kaW5nIHdpdGggbWFqb3IgbWFuYWdlbWVudCBjaGVja3BvaW50LCBtaWxlc3RvbmUgb3Igc2V0IG9mIERlbGl2ZXJhYmxlcy4gIEl0IGlzIGluY2x1ZGVkIGluIHRoZSBtb2RlbCBhcyBhIHByZWRlZmluZWQgc3BlY2lhbCBBY3Rpdml0eSwgYmVjYXVzZSBvZiBpdHMgc2lnbmlmaWNhbmNlIGluIGRlZmluaW5nIGJyZWFrZG93bnMuCi08L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il95N21Ndi0tc0VkdUg1OUtTSFY4dmdBIiBnZW5lcmFsPSJfeTdtTXNPLXNFZHVINTlLU0hWOHZnQSIvPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfeTdtTXdPLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iVGVhbVByb2ZpbGUiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95N21Nd2Utc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeTdtTXdPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PkEgVGVhbSBQcm9maWxlIGlzIGEgQnJlYWtkb3duIEVsZW1lbnQgdGhhdCBncm91cHMgUm9sZSBEZXNjcmlwdG9ycyBvciBSZXNvdXJjZSBEZWZpbml0aW9ucyBkZWZpbmluZyBhIG5lc3RlZCBoaWVyYXJjaHkgb2YgdGVhbXMgYW5kIHRlYW0gbWVtYmVycy4KLVdvcmsgYXNzaWdubWVudHMgYW5kIFdvcmsgUHJvZHVjdCByZXNwb25zaWJpbGl0aWVzIGNhbiBiZSBkaWZmZXJlbnQgZnJvbSBBY3Rpdml0eSB0byBBY3Rpdml0eSBpbiBhIGRldmVsb3BtZW50IHByb2plY3QuIERpZmZlcmVudCBwaGFzZXMgcmVxdWlyZSBkaWZmZXJlbnQgc3RhZmZpbmcgcHJvZmlsZXMsIGkuZS4gZGlmZmVyZW50IHNraWxscyBhbmQgcmVzb3VyY2VzIGRvaW5nIGRpZmZlcmVudCB0eXBlcyBvZiB3b3JrLiAgVGhlcmVmb3JlLCBhIHByb2Nlc3MgbmVlZHMgdG8gZGVmaW5lIHN1Y2ggZGlmZmVyZW50IHByb2ZpbGVzIGluIGEgZmxleGlibGUgbWFubmVyLiAgV2hlcmVhcyBDb3JlIE1ldGhvZCBDb250ZW50IGRlZmluZXMgc3RhbmRhcmQgcmVzcG9uc2liaWxpdGllcyBhbmQgYXNzaWdubWVudHMsIGEgcHJvY2VzcyBleHByZXNzIGJ5IGEgYnJlYWtkb3duIHN0cnVjdHVyZXMgbmVlZHMgdG8gYmUgYWJsZSByZWZpbmUgYW5kIHJlZGVmaW5lIHRoZXNlIHRocm91Z2hvdXQgaXRzIGRlZmluaXRpb24uICBSb2xlIERlc2NyaXB0b3JzLCBSZXNvdXJjZSBEZWZpbml0aW9ucywgYXMgd2VsbCBhcyBUZWFtIFByb2ZpbGVzIHByb3ZpZGUgdGhlIGRhdGEgc3RydWN0dXJlIG5lY2Vzc2FyeSB0byBhY2hpZXZlIHRoaXMgZmxleGliaWxpdHkgYW5kIHRvIHByb3ZpZGUgYSBwcm9jZXNzIHVzZXIgd2l0aCB0aGUgY2FwYWJpbGl0eSB0byBkZWZpbmUgZGlmZmVyZW50IHRlYW1zIGFuZCByb2xlIHJlbGF0aW9uc2hpcHMgZm9yIGV2ZXJ5IEFjdGl2aXR5IChpbmNsdWRpbmcgQWN0aXZpdGllcyBvbiBhbnkgbmVzdGluZy1sZXZlbCBhcyB3ZWxsIGFzIEl0ZXJhdGlvbnMgb3IgUGhhc2VzKS4KLUhlbmNlLCBpbiBhZGRpdGlvbiB0byB0aGUgd29yayBicmVha2Rvd24gYW5kIHdvcmsgcHJvZHVjdCBicmVha2Rvd24gc3RydWN0dXJlcyBkZWZpbmVkIHNvIGZhciwgVGVhbSBQcm9maWxlcyBhcmUgdXNlZCB0byBkZWZpbmUgYSB0aGlyZCB0eXBlIG9mIGJyZWFrZG93biBzdHJ1Y3R1cmU6IHRlYW0gYnJlYWtkb3duIHN0cnVjdHVyZXMuICBUaGVzZSBhcmUgY3JlYXRlZCBhcyBhbiBBY3Rpdml0eSBzcGVjaWZpYyBoaWVyYXJjaHkgb2YgVGVhbSBQcm9maWxlcyBjb21wcmlzaW5nIG9mIFJvbGUgRGVzY3JpcHRvcnMgYW5kIFJlc291cmNlIERlZmluaXRpb25zLiAgVGhlc2Ugc3RydWN0dXJlcyBjYW4gYmUgcHJlc2VudGVkIGFzIHdlbGwta25vd24gT3JnLUNoYXJ0cy4gIEp1c3QgYXMgd2l0aCBhbnkgb3RoZXIgQnJlYWtkb3duIEVsZW1lbnQgYW5kIERlc2NyaXB0b3JzLCBUZWFtIFByb2ZpbGVzIGNhbiBiZSBkZWZpbmVkIHdpdGhpbiB0aGUgc2NvcGUgb2YgYW55IEFjdGl2aXR5IGluIGEgYnJlYWtkb3duIHN0cnVjdHVyZS4gIEluIG90aGVyIHdvcmRzIGV2ZXJ5IEFjdGl2aXR5IGNhbiBkZWZpbmUgaXRzIG93biBUZWFtIFByb2ZpbGVzIGNvbnNpc3Rpbmcgb2YgQWN0aXZpdHkgc3BlY2lmaWMgUm9sZSBEZXNjcmlwdG9ycyBhbmQgUmVzb3VyY2UgRGVmaW5pdGlvbnMuICBUeXBpY2FsbHksIFRlYW0gUHJvZmlsZXMgYXJlIGRlZmluZWQgb24gdGhlIGxldmVsIG9mIEl0ZXJhdGlvbnMgb3IgUGhhc2VzIG9yIG90aGVyIGhpZ2hlci1sZXZlbCBBY3Rpdml0eS4KLTwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3k3bU13dS1zRWR1SDU5S1NIVjh2Z0EiIGdlbmVyYWw9Il95N3ZXdk8tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfeTdtTXctLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0idGVhbVJvbGVzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95N3ZXMy0tc0VkdUg1OUtTSFY4dmdBIiBhc3NvY2lhdGlvbj0iX3k3dlhPLS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95N21NeE8tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95N21NeGUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3k3bU14dS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9InN1cGVyVGVhbSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeTdtTXdPLXNFZHVINTlLU0hWOHZnQSIgYXNzb2NpYXRpb249Il95NzVIb08tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeTdtTXgtLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjEiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeTdtTXlPLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjEiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfeTdtTXllLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0ic3ViVGVhbSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeTdtTXdPLXNFZHVINTlLU0hWOHZnQSIgYXNzb2NpYXRpb249Il95NzVIb08tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeTdtTXl1LXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeTdtTXktLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6RW51bWVyYXRpb24iIHhtaTppZD0iX3k3dldvTy1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9IldvcmtPcmRlclR5cGUiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95N3ZXb2Utc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeTd2V29PLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PldvcmsgT3JkZXIgcmVwcmVzZW50cyBhIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHR3byBCcmVha2Rvd24gRWxlbWVudCBpbiB3aGljaCBvbmUgQnJlYWtkb3duIEVsZW1lbnQgKHJlZmVycmVkIHRvIGFzIChCKSBiZWxvdykgZGVwZW5kcyBvbiB0aGUgc3RhcnQgb3IgZmluaXNoIG9mIGFub3RoZXIgQnJlYWtkb3duIEVsZW1lbnQgKHJlZmVycmVkIHRvIGFzIChBKSBiZWxvdykgaW4gb3JkZXIgdG8gYmVnaW4gb3IgZW5kLiBUaGlzIGVudW1lcmF0aW9uIGRlZmluZXMgdGhlIGRpZmZlcmVudCB0eXBlcyBvZiBXb3JrIE9yZGVyIHJlbGF0aW9uc2hpcHMgYXZhaWxhYmxlIGluIFVNQSBhbmQgaXMgdXNlZCB0byBwcm92aWRlIHZhbHVlcyBmb3IgV29yayBPcmRlcidzIGxpbmtUeXBlIGF0dHJpYnV0ZS48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxvd25lZExpdGVyYWwgeG1pOmlkPSJfeTd2V291LXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iZmluaXNoVG9TdGFydCI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeTd2V28tLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3k3dldvdS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICAgIDxib2R5PkJyZWFrZG93biBFbGVtZW50IChCKSBjYW5ub3Qgc3RhcnQgdW50aWwgQnJlYWtkb3duIEVsZW1lbnQgKEEpIGZpbmlzaGVzLiBGb3IgZXhhbXBsZSwgaWYgeW91IGhhdmUgdHdvIEJyZWFrZG93biBFbGVtZW50cywgJnF1b3Q7Q29uc3RydWN0IGZlbmNlJnF1b3Q7IGFuZCAmcXVvdDtQYWludCBmZW5jZSwmcXVvdDsgJnF1b3Q7UGFpbnQgZmVuY2UmcXVvdDsgY2FuJ3Qgc3RhcnQgdW50aWwgJnF1b3Q7Q29uc3RydWN0IGZlbmNlJnF1b3Q7IGZpbmlzaGVzLiBUaGlzIGlzIHRoZSBtb3N0IGNvbW1vbiB0eXBlIG9mIGRlcGVuZGVuY3kgYW5kIHRoZSBkZWZhdWx0IGZvciBhIG5ldyBXb3JrIE9yZGVyIGluc3RhbmNlLgotPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDwvb3duZWRMaXRlcmFsPgotICAgICAgPG93bmVkTGl0ZXJhbCB4bWk6aWQ9Il95N3ZXcE8tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJmaW5pc2hUb0ZpbmlzaCI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeTd2V3BlLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3k3dldwTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICAgIDxib2R5PkJyZWFrZG93biBFbGVtZW50IChCKSBjYW5ub3QgZmluaXNoIHVudGlsIEJyZWFrZG93biBFbGVtZW50IChBKSBmaW5pc2hlcy4gRm9yIGV4YW1wbGUsIGlmIHlvdSBoYXZlIHR3byBCcmVha2Rvd24gRWxlbWVudHMsICZxdW90O0FkZCB3aXJpbmcmcXVvdDsgYW5kICZxdW90O0luc3BlY3QgZWxlY3RyaWNhbCwmcXVvdDsgJnF1b3Q7SW5zcGVjdCBlbGVjdHJpY2FsJnF1b3Q7IGNhbid0IGZpbmlzaCB1bnRpbCAmcXVvdDtBZGQgd2lyaW5nJnF1b3Q7IGZpbmlzaGVzLgotPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDwvb3duZWRMaXRlcmFsPgotICAgICAgPG93bmVkTGl0ZXJhbCB4bWk6aWQ9Il95N3ZXcHUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJzdGFydFRvU3RhcnQiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3k3dldwLS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95N3ZXcHUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgICA8Ym9keT5CcmVha2Rvd24gRWxlbWVudCAoQikgY2Fubm90IHN0YXJ0IHVudGlsIEJyZWFrZG93biBFbGVtZW50IChBKSBzdGFydHMuIEZvciBleGFtcGxlLCBpZiB5b3UgaGF2ZSB0d28gQnJlYWtkb3duIEVsZW1lbnRzLCAmcXVvdDtQb3VyIGZvdW5kYXRpb24mcXVvdDsgYW5kICZxdW90O0xldmVsIGNvbmNyZXRlLCZxdW90OyAmcXVvdDtMZXZlbCBjb25jcmV0ZSZxdW90OyBjYW4ndCBiZWdpbiB1bnRpbCAmcXVvdDtQb3VyIGZvdW5kYXRpb24mcXVvdDsgYmVnaW5zLgotPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDwvb3duZWRMaXRlcmFsPgotICAgICAgPG93bmVkTGl0ZXJhbCB4bWk6aWQ9Il95N3ZXcU8tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJzdGFydFRvRmluaXNoIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95N3ZXcWUtc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeTd2V3FPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgICAgPGJvZHk+QnJlYWtkb3duIEVsZW1lbnQgKEIpIGNhbm5vdCBmaW5pc2ggdW50aWwgQnJlYWtkb3duIEVsZW1lbnQgKEEpIHN0YXJ0cy4gVGhpcyBkZXBlbmRlbmN5IHR5cGUgY2FuIGJlIHVzZWQgZm9yIGp1c3QtaW4tdGltZSBzY2hlZHVsaW5nIHVwIHRvIGEgbWlsZXN0b25lIG9yIHRoZSBwcm9qZWN0IGZpbmlzaCBkYXRlIHRvIG1pbmltaXplIHRoZSByaXNrIG9mIGEgQnJlYWtkb3duIEVsZW1lbnQgZmluaXNoaW5nIGxhdGUgaWYgaXRzIGRlcGVuZGVudCBCcmVha2Rvd24gRWxlbWVudHMgc2xpcC4gSWYgYSByZWxhdGVkIEJyZWFrZG93biBFbGVtZW50IG5lZWRzIHRvIGZpbmlzaCBiZWZvcmUgdGhlIG1pbGVzdG9uZSBvciBwcm9qZWN0IGZpbmlzaCBkYXRlLCBidXQgaXQgZG9lc24ndCBtYXR0ZXIgZXhhY3RseSB3aGVuIGFuZCB5b3UgZG9uJ3Qgd2FudCBhIGxhdGUgZmluaXNoIHRvIGFmZmVjdCB0aGUganVzdC1pbi10aW1lIEJyZWFrZG93biBFbGVtZW50LCB5b3UgY2FuIGNyZWF0ZSBhbiBTRiBkZXBlbmRlbmN5IGJldHdlZW4gdGhlIEJyZWFrZG93biBFbGVtZW50IHlvdSB3YW50IHNjaGVkdWxlZCBqdXN0IGluIHRpbWUgKHRoZSBwcmVkZWNlc3NvcikgYW5kIGl0cyByZWxhdGVkIEJyZWFrZG93biBFbGVtZW50ICh0aGUgc3VjY2Vzc29yKS4gVGhlbiBpZiB5b3UgdXBkYXRlIHByb2dyZXNzIG9uIHRoZSBzdWNjZXNzb3IgQnJlYWtkb3duIEVsZW1lbnQsIGl0IHdvbid0IGFmZmVjdCB0aGUgc2NoZWR1bGVkIGRhdGVzIG9mIHRoZSBwcmVkZWNlc3NvciBCcmVha2Rvd24gRWxlbWVudC48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPC9vd25lZExpdGVyYWw+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il95N3ZXcXUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJXb3JrT3JkZXIiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95N3ZXcS0tc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeTd2V3F1LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PldvcmsgT3JkZXIgaXMgYSBNZXRob2QgRWxlbWVudCB0aGF0IHJlcHJlc2VudHMgYSByZWxhdGlvbnNoaXAgYmV0d2VlbiB0d28gQnJlYWtkb3duIEVsZW1lbnRzIGluIHdoaWNoIG9uZSBCcmVha2Rvd24gRWxlbWVudHMgZGVwZW5kcyBvbiB0aGUgc3RhcnQgb3IgZmluaXNoIG9mIGFub3RoZXIgQnJlYWtkb3duIEVsZW1lbnRzIGluIG9yZGVyIHRvIGJlZ2luIG9yIGVuZC4gIAotKE5vdGUsIFdvcmsgT3JkZXIgaXMgbm90IG1vZGVsZWQgYXMgYW4gQXNzb2NpYXRpb24gQ2xhc3MgdG8gcHJvdmlkZSBhIHN0cmFpZ2h0Zm9yd2FyZCBtYXBwaW5nICB0byBYTUkgYW5kIEVNRi4pCi1UaGUgV29yayBPcmRlciBjbGFzcyBkZWZpbmVzIHByZWRlY2Vzc29yIGFuZCBzdWNjZXNzb3IgcmVsYXRpb25zIGFtb25nc3QgQnJlYWtkb3duIEVsZW1lbnRzLiAgVGhpcyBpbmZvcm1hdGlvbiBpcyBpbiBwYXJ0aWN1bGFyIGNyaXRpY2FsIGZvciBwbGFubmluZyBhcHBsaWNhdGlvbnMuICBTZWUgbW9yZSBkZXRhaWxzIG9uIGRpZmZlcmVudCB0eXBlcyBvZiBXb3JrIE9yZGVyIHJlbGF0aW9uc2hpcHMgYXQgV29yayBPcmRlciBUeXBlLgotPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfeTd2V3JPLXNFZHVINTlLU0hWOHZnQSIgZ2VuZXJhbD0iX3k3dlhPTy1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il95N3ZXcmUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJsaW5rVHlwZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeTd2V29PLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeTd2V3J1LXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3k3dldyZS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICAgIDxib2R5PlRoaXMgYXR0cmlidXRlIGV4cHJlc3NlcyB0aGUgdHlwZSBvZiB0aGUgV29yayBPcmRlciByZWxhdGlvbnNoaXAgYnkgYXNzaWduaW5nIGEgdmFsdWUgZnJvbSB0aGUgV29yayBPcmRlciBUeXBlIGVudW1lcmF0aW9uLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9Il95N3ZXci0tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgICA8Ym9keT5maW5pc2hUb1N0YXJ0PC9ib2R5PgotICAgICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfeTd2V3NPLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0icHJlZCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeTd2WEtlLXNFZHVINTlLU0hWOHZnQSIgYXNzb2NpYXRpb249Il95NzVIOC0tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeTd2V3NlLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjEiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeTd2V3N1LXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjEiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il95N3ZXcy0tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJQbGFubmluZ0RhdGEiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95N3ZXdE8tc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeTd2V3MtLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PlBsYW5uaW5nIERhdGEgaXMgYSBNZXRob2QgRWxlbWVudCB0aGF0IGFkZHMgcGxhbm5pbmcgZGF0YSB0byBCcmVha2Rvd24gRWxlbWVudHMgd2hlbiBpdCBpcyB1c2VkIGZvciBhIFByb2Nlc3MgUGxhbm5pbmcgVGVtcGxhdGUuICBGb3IgRGVsaXZlcnkgUHJvY2Vzc2VzIGFuZCBDYXBhYmlsaXR5IFBhdHRlcm5zIHRoaXMgY2xhc3MgY2FuIGVpdGhlciBub3QgYmUgaW5zdGFudGlhdGVkIG9yIHBvcHVsYXRlZCB3aXRoIGRlZmF1bHQgZGF0YS4KLVBsYW5uaW5nIERhdGEgZmFjdG9ycyBvdXQgc3BlY2lmaWMgb3B0aW9uYWwgZGF0YSBuZWVkZWQgZm9yIHJlcHJlc2VudGluZyBwbGFubmluZyB0ZW1wbGF0ZXMuICBUaGlzIGFzc29jaWF0aW9uIGFsbG93cyB0byBhY2Nlc3MgcGxhbm5pbmcgZGF0YSBpZiBpdCBpcyBzdG9yZWQgZm9yIHRoZSBCcmVha2Rvd24gRWxlbWVudC4KLShOT1RFLCBUSEUgQVRUUklCVVRFUyBGT1IgVEhJUyBDTEFTUyBBUkUgTk9UIENPTVBMRVRFLCBZRVQpCi08L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il95N3ZXdGUtc0VkdUg1OUtTSFY4dmdBIiBnZW5lcmFsPSJfeTd2WE9PLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3k3dld0dS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9InN0YXJ0RGF0ZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXhVUFpPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeTd2V3QtLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3k3dld0dS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICAgIDxib2R5PlRoZSBkZWZhdWx0IHN0YXJ0IGRhdGUgZm9yIGEgcGxhbmVkIFRhc2suPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfeTd2V3VPLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iZmluaXNoRGF0ZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXhVUFpPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeTd2V3VlLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3k3dld1Ty1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICAgIDxib2R5PlRoZSBkZWZhdWx0IGZpbmlzaCBkYXRlIGZvciBhIHBsYW5lZCBUYXNrLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3k3dld1dS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9InJhbmsiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l4VVBiTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3k3dld1LS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95N3ZXdXUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgICA8Ym9keT5UaGUgZGVmYXVsdCByYW5rIGZvciBhIHBsYW5lZCBUYXNrLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfeTd2V3ZPLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iQnJlYWtkb3duRWxlbWVudCIgaXNBYnN0cmFjdD0idHJ1ZSI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3k3dld2ZS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95N3ZXdk8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+QnJlYWtkb3duIEVsZW1lbnQgaXMgYW4gYWJzdHJhY3QgZ2VuZXJhbGl6YXRpb24gZm9yIGFueSB0eXBlIG9mIE1ldGhvZCBFbGVtZW50IHRoYXQgaXMgcGFydCBvZiBhIGJyZWFrZG93biBzdHJ1Y3R1cmUuICBJdCBkZWZpbmVzIGEgc2V0IG9mIHByb3BlcnRpZXMgYXZhaWxhYmxlIHRvIGFsbCBvZiBpdHMgc3BlY2lhbGl6YXRpb25zLjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3k3dld2LS1zRWR1SDU5S1NIVjh2Z0EiIGdlbmVyYWw9Il95N3ZYT08tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfeTd2V3dPLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0icHJlZml4IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95eFVQYU8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95N3ZXd2Utc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeTd2V3dPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgICAgPGJvZHk+UHJlZml4IHJlcHJlc2VudHMgYW4gYWRkaXRpb25hbCBsYWJlbCB0aGF0IHdpbGwgYmUgcHJlc2VudGVkIGFzIGEgcHJlZml4IHRvIGFueSBCcmVha2Rvd24gRWxlbWVudCB0byBpbmRpY2F0ZSBhIHVzZXItZGVmaW5lZCBzdWItdHlwZSBmb3IgdGhlIGVsZW1lbnQuICBGb3IgZXhhbXBsZSwgaWYgdGhlIHByb2Nlc3MgZW5naW5lZXIgd291bGQgbGlrZSB0byBkaXN0aW5ndWlzaCBoaXMgQWN0aXZpdGllcyBieSAnTW9kdWxlJyAoYXMgZG9uZSBpbiB0aGUgSUJNIFJhdGlvbmFsIFN1bW1pdCBBc2NlbmRhbnQgTWV0aG9kKSwgaGUgY2FuIGRlZmluZSBhIGRpZmZlcmVudCBwcmVmaXggZm9yIGV2ZXJ5IG1vZGVsIHRvIGJlIHVzZWQgaW4gYWRkaXRpb24gdG8gbmFtaW5nIEFjdGl2aXRpZXMsIGUuZy4gJnF1b3Q7U1JBLkVzdGFibGlzaCBSZXF1aXJlbWVudHMmcXVvdDsgd2l0aCBTUkEgaW5kaWNhdGluZyB0aGF0IHRoaXMgQWN0aXZpdHkgYmVsb25ncyB0byB0aGUgJnF1b3Q7U29mdHdhcmUgUmVxdWlyZW1lbnRzIEFuYWx5c2lzJnF1b3Q7IG1vZHVsZS4gIEFub3RoZXIgY29tbW9uIGFwcGxpY2F0aW9uIGZvciBwcmVmaXggaXMgdG8gcXVhbGlmeSByb2xlcyBpbiBSb2xlIERlc2NyaXB0b3JzLiAgRm9yIGV4YW1wbGUsICZxdW90O0N1c3RvbWVyLkFyY2hpdGVjdCZxdW90OyB3b3VsZCBkZWZpbmUgYSAmcXVvdDtDdXN0b21lciZxdW90OyBwcmVmaXggZm9yIHRoZSBSb2xlIERlc2NyaXB0b3IgJnF1b3Q7QXJjaGl0ZWN0JnF1b3Q7IGV4cHJlc3NpbmcgdGhhdCB0aGlzIGlzIGFuIGFyY2hpdGVjdCBvbiB0aGUgY3VzdG9tZXIgc2lkZSBhbmQgbm90IHRoZSBkZXZlbG9wbWVudCB0ZWFtIHNpZGUuCi08L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95N3ZXd3Utc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iMSIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95N3ZXdy0tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il95N3ZXeE8tc0VkdUg1OUtTSFY4dmdBIiB0eXBlPSJfeXhVUGFPLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IiIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il95N3ZXeGUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJpc1BsYW5uZWQiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l4VVBidS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3k3dld4dS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95N3ZXeGUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgICA8Ym9keT5BIGtleSBhcHBsaWNhdGlvbiBmb3IgRGV2ZWxvcG1lbnQgUHJvY2Vzc2VzIGV4cHJlc3NlZCB3aXRoIEJyZWFrZG93biBzdHJ1Y3R1cmVzIGlzIHRvIGdlbmVyYXRlIGEgcHJvamVjdCBwbGFuIGZyb20gaXQuICBBIHByb2Nlc3MgYXMgZGVmaW5lZCBpbiBVTUEgKGNmLiB3aXRoIFNlY3Rpb25zIFhYIGFuZCA1LjIpIGlzIGEgbXVsdGktZGltZW5zaW9uYWwgc3RydWN0dXJlIGRlZmluaW5nIHdoYXQgd29yayBpcyBiZWluZyBwZXJmb3JtZWQgYXQgd2hhdCB0aW1lIGJ5IHdoaWNoIHJvbGVzIHVzaW5nIHdoaWNoIGlucHV0IGFuZCBwcm9kdWNpbmcgd2hhdCBvdXRwdXRzLiAgQSBwcm9qZWN0IHBsYW4gYXMgaXQgaXMgcmVwcmVzZW50ZWQgaW4gcHJvamVjdCBwbGFubmluZyB0b29scyBzdWNoIGFzIElCTSBSYXRpb25hbCBQb3J0Zm9saW8gTWFuYWdlciBvciBNaWNyb3NvZnQgUHJvamVjdCBub3JtYWxseSBkb2VzIG5vdCBuZWVkIGFsbCB0aGlzIGluZm9ybWF0aW9uIGFuZCBpcyBub3JtYWxseSBsaW1pdGVkIHRvIGp1c3QgcmVwcmVzZW50aW5nIGEgc3Vic2V0LiAgRm9yIGV4YW1wbGUsIGEgdHlwaWNhbCBNUyBQcm9qZWN0IHBsYW4gb25seSByZXByZXNlbnRzIHRoZSB3b3JrIGJyZWFrZG93biBjb25zaXN0aW5nIG9mIFRhc2tzIGFuZCBBY3Rpdml0aWVzIChzb21ldGltZXMgcmVmZXJyZWQgdG8gYXMgc3VtbWFyeSB0YXNrcykuICBJdCBkb2VzIG5vdCBzaG93IHRoZSBpbnB1dCBhbmQgb3V0cHV0IFdvcmsgUHJvZHVjdHMgZm9yIGEgVGFzaywgYnV0IGl0IGNhbiBzaG93IHdoaWNoIHJvbGVzIHNoYWxsIGJlIHN0YWZmZWQgZm9yIHBlcmZvcm1pbmcgdGhlIFRhc2suICBIb3dldmVyLCBzdWNoIHJvbGUgYWxsb2NhdGlvbiBuZWVkIHRvIGJlIHJlcGxhY2VkIHdpdGggY29uY3JldGUgcmVzb3VyY2VzIHdoZW4gaW5zdGFudGlhdGluZyB0aGUgcGxhbiBmb3IgYSBjb25jcmV0ZSBwcm9qZWN0LiAgU29tZXRpbWVzIHByb2plY3QgcGxhbnMgY2FuIHRoZW4gYWdhaW4gYmUgb3JnYW5pemVkIGRpZmZlcmVudGx5IGJ5IG9yZ2FuaXppbmcgd29yayBieSBkZWxpdmVyYWJsZXMgaW4gd2hpY2ggV29yayBQcm9kdWN0cyBhcmUgbWFwcGVkIHRvIHRoZSBwbGFuJ3Mgc3VtbWFyeSB0YXNrcyBhbmQgVGFzayB0aGF0IGhhdmUgdGhlc2Ugd29yayBwcm9kdWN0cyBhcyBvdXRwdXQgbWFwcGVkIGJlbG93IHN1Y2ggYXMgc3VtbWFyeSB0YXNrLiAgVGhlcmVmb3JlLCBhIHByb2Nlc3MgY2FuIG1ha2UgcmVjb21tZW5kYXRpb25zIGFib3V0IHdoaWNoIGVsZW1lbnRzIHRvIGluY2x1ZGUgYW5kIHdoaWNoIHRvIGV4Y2x1ZGUgd2hlbiBnZW5lcmF0aW5nIGEgcGxhbi4gIFdoZW4gdGhlIGlzUGxhbm5lZCBhdHRyaWJ1dGUgaXMgc2V0IHRvIEZhbHNlIGZvciBhbiBpbnN0YW5jZSBvZiBhIEJyZWFrZG93biBFbGVtZW50LCB0aGVuIHRoaXMgZWxlbWVudCBzaGFsbCBub3QgYmUgbm90IGluY2x1ZGVkIHdoZW4gYSBjb25jcmV0ZSBwcm9qZWN0IHBsYW4gaXMgYmVpbmcgZ2VuZXJhdGVkIGZyb20gdGhlIGJyZWFrZG93biBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucyB0aGlzIGVsZW1lbnQuCi0KLQotPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iX3k3dld4LS1zRWR1SDU5S1NIVjh2Z0EiIHR5cGU9Il95eFVQYnUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgICA8Ym9keT50cnVlPC9ib2R5PgotICAgICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfeTd2V3lPLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iaGFzTXVsdGlwbGVPY2N1cnJlbmNlcyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXhVUGJ1LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeTd2V3llLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3k3dld5Ty1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICAgIDxib2R5Pkp1c3QgYXMgdGhlIGlzUGxhbm5lZCBhdHRyaWJ1dGUgdGhlIGhhc011bHRpcGxlT2NjdXJyZW5jZXMgYXR0cmlidXRlIGhhcyBhbiBpbXBhY3Qgb24gZ2VuZXJhdGluZyBwbGFucyBmcm9tIGEgUHJvY2Vzcy4gIFdoZW4gdGhpcyBhdHRyaWJ1dGUgaXMgc2V0IHRvIFRydWUgZm9yIGEgQnJlYWtkb3duIEVsZW1lbnQgdGhlbiBpdCB3aWxsIHR5cGljYWxseSBvY2N1ciBtdWx0aXBsZSB0aW1lcyB3aXRoaW4gdGhlIHNhbWUgQWN0aXZpdHkuICBGb3IgZXhhbXBsZSwgYSBUYXNrIHN1Y2ggYXMgJnF1b3Q7RGV0YWlsIFVzZSBDYXNlJnF1b3Q7IHdvdWxkIGJlIHBlcmZvcm1lZCBmb3IgZXZlcnkgdXNlIGNhc2UgaWRlbnRpZmllZCBmb3IgYSBwYXJ0aWN1bGFyIEl0ZXJhdGlvbiBvciBBY3Rpdml0eS4gIEdlbmVyYXRpbmcgYSBwbGFuIHdvdWxkIGxpc3Qgb25lIFRhc2sgaW5zdGFuY2UgcGVyIHVzZSBjYXNlLgotPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iX3k3dld5dS1zRWR1SDU5S1NIVjh2Z0EiIHR5cGU9Il95eFVQYnUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgICA8Ym9keT5mYWxzZTwvYm9keT4KLSAgICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3k3dld5LS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9ImlzT3B0aW9uYWwiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l4VVBidS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3k3dld6Ty1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95N3ZXeS0tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgICA8Ym9keT5UaGUgaXNPcHRpb25hbCBhdHRyaWJ1dGUgaW5kaWNhdGVzIHRoYXQgdGhlIEJyZWFrZG93biBFbGVtZW50IGRlc2NyaWJlcyB3b3JrLCBhIHdvcmsgcmVzdWx0LCBvciBldmVuIHdvcmsgcmVzb3VyY2VzLCB3aGljaCBpbmNsdXNpb24gaXMgbm90IG1hbmRhdG9yeSB3aGVuIHBlcmZvcm1pbmcgYSBwcm9qZWN0IHRoYXQgaXMgcGxhbm5lZCBiYXNlZCBvbiBhIHByb2Nlc3MgY29udGFpbmluZyB0aGlzIGVsZW1lbnQuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iX3k3dld6ZS1zRWR1SDU5S1NIVjh2Z0EiIHR5cGU9Il95eFVQYnUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgICA8Ym9keT5mYWxzZTwvYm9keT4KLSAgICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3k3dld6dS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9InByZXNlbnRlZEFmdGVyIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95N3ZXdk8tc0VkdUg1OUtTSFY4dmdBIiBhc3NvY2lhdGlvbj0iX3k3NUhvdS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95N3ZXei0tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iMSIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95N3ZXME8tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3k3dlcwZS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9InByZXNlbnRlZEJlZm9yZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeTd2V3ZPLXNFZHVINTlLU0hWOHZnQSIgYXNzb2NpYXRpb249Il95NzVIN3Utc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeTd2VzB1LXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjEiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeTd2VzAtLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il95N3ZXMU8tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJwbGFubmluZ0RhdGEiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3k3dldzLS1zRWR1SDU5S1NIVjh2Z0EiIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiIGFzc29jaWF0aW9uPSJfeV9CVU5PLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3k3dlcxZS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIxIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3k3dlcxdS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfeTd2VzEtLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0ic3VwZXJBY3Rpdml0aWVzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95N21Nc08tc0VkdUg1OUtTSFY4dmdBIiBhc3NvY2lhdGlvbj0iX3lfQlVSdS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95N3ZXMk8tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iMSIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95N3ZXMmUtc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iMSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3k3dlcydS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9IkRlc2NyaXB0b3IiIGlzQWJzdHJhY3Q9InRydWUiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95N3ZXMi0tc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeTd2VzJ1LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PkEgRGVzY3JpcHRvciBpcyBhbiBhYnN0cmFjdCBnZW5lcmFsaXphdGlvbiBmb3Igc3BlY2lhbCBCcmVha2Rvd24gRWxlbWVudHMgdGhhdCByZWZlcmVuY2VzIG9uZSBjb25jcmV0ZSBDb250ZW50IEVsZW1lbnQuICBBIGRlc2NyaXB0b3IgcHJvdmlkZXMgYSByZXByZXNlbnRhdGlvbiBvZiBhIENvbnRlbnQgRWxlbWVudCB3aXRoaW4gYnJlYWtkb3duIHN0cnVjdHVyZXMuICBJbiBhZGRpdGlvbiB0byBqdXN0IHJlZmVyZW5jaW5nIENvbnRlbnQgRWxlbWVudHMgaXQgYWxsb3dzIG92ZXJyaWRpbmcgdGhlIENvbnRlbnQgRWxlbWVudHMgc3RydWN0dXJhbCByZWxhdGlvbnNoaXBzIGJ5IGRlZmluaW5nIGl0cyBvd24gc2V0cyBvZiBhc3NvY2lhdGlvbnMuCi1EZXNjcmlwdG9ycyBhcmUgdGhlIGtleSBjb25jZXB0IGZvciByZWFsaXppbmcgdGhlIHNlcGFyYXRpb24gb2YgcHJvY2Vzc2VzIGZyb20gbWV0aG9kIGNvbnRlbnQuICBBIERlc2NyaXB0b3IgY2FuIGJlIGNoYXJhY3Rlcml6ZWQgYXMgYSByZWZlcmVuY2Ugb2JqZWN0IGZvciBvbmUgcGFydGljdWxhciBDb250ZW50IEVsZW1lbnQsIHdoaWNoIGhhcyBpdHMgb3duIHJlbGF0aW9uc2hpcHMgYW5kIHByb3BlcnRpZXMuICBXaGVuIGEgRGVzY3JpcHRvciBpcyBjcmVhdGVkIGl0IHNoYWxsIGJlIHByb3ZpZGVkIHdpdGggY29uZ3J1ZW50IGNvcGllcyBvZiB0aGUgcmVsYXRpb25zaGlwcyBkZWZpbmVkIGZvciB0aGUgcmVmZXJlbmNlZCBjb250ZW50IGVsZW1lbnQuICBIb3dldmVyLCBhIHVzZXIgY2FuIG1vZGlmeSB0aGVzZSByZWxhdGlvbnNoaXBzIGZvciB0aGUgcGFydGljdWxhciBwcm9jZXNzIHNpdHVhdGlvbiBmb3Igd2hpY2ggdGhlIGRlc2NyaXB0b3IgaGFzIGJlZW4gY3JlYXRlZC4gCi08L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il95N3ZXM08tc0VkdUg1OUtTSFY4dmdBIiBnZW5lcmFsPSJfeTd2V3ZPLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3k3dlczZS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9ImlzU3luY2hyb25pemVkV2l0aFNvdXJjZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXhVUGJ1LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9Il95N3ZXM3Utc0VkdUg1OUtTSFY4dmdBIiB0eXBlPSJfeXhVUGJ1LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgICAgPGJvZHk+dHJ1ZTwvYm9keT4KLSAgICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfeTd2VzMtLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iUm9sZURlc2NyaXB0b3IiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95N3ZXNE8tc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeTd2VzMtLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PkEgUm9sZSBEZXNjcmlwdG9yIHJlcHJlc2VudHMgYSBSb2xlIGluIHRoZSBjb250ZXh0IG9mIG9uZSBzcGVjaWZpYyBBY3Rpdml0eS4gIEV2ZXJ5IGJyZWFrZG93biBzdHJ1Y3R1cmUgY2FuIGRlZmluZSBkaWZmZXJlbnQgcmVsYXRpb25zaGlwcyBvZiBSb2xlIERlc2NyaXB0b3JzIHRvIFRhc2sgRGVzY3JpcHRvcnMgYW5kIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9ycy4gIFRoZXJlZm9yZSBvbmUgUm9sZSBjYW4gYmUgcmVwcmVzZW50ZWQgYnkgbWFueSBSb2xlIERlc2NyaXB0b3JzIGVhY2ggd2l0aGluIHRoZSBjb250ZXh0IG9mIGFuIEFjdGl2aXR5IHdpdGggaXRzIG93biBzZXQgb2YgcmVsYXRpb25zaGlwcy48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il95N3ZXNGUtc0VkdUg1OUtTSFY4dmdBIiBnZW5lcmFsPSJfeTd2VzJ1LXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3k3dlc0dS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9InJvbGUiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l5emRFZS1zRWR1SDU5S1NIVjh2Z0EiIGFzc29jaWF0aW9uPSJfeTc1SHNlLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3k3dlc0LS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIxIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3k3dlc1Ty1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfeTd2VzVlLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0ibW9kaWZpZXMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3k3dlhDdS1zRWR1SDU5S1NIVjh2Z0EiIGlzRGVyaXZlZD0idHJ1ZSIgYXNzb2NpYXRpb249Il95NzVIek8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeTd2VzV1LXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeTd2VzUtLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il95N3ZXNk8tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJyZXNwb25zaWJsZUZvciIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeTd2WEN1LXNFZHVINTlLU0hWOHZnQSIgYXNzb2NpYXRpb249Il95NzVINWUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeTd2VzZlLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeTd2VzZ1LXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3k3dlc2LS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9IlRhc2tEZXNjcmlwdG9yIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeTd2VzdPLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3k3dlc2LS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5BIFRhc2sgRGVzY3JpcHRvciBpcyBhIERlc2NyaXB0b3IgYW5kIFdvcmsgQnJlYWtkb3duIEVsZW1lbnQgdGhhdCByZXByZXNlbnRzIGEgcHJveHkgZm9yIGEgVGFzayBpbiB0aGUgY29udGV4dCBvZiBvbmUgc3BlY2lmaWMgQWN0aXZpdHkuICBFdmVyeSBicmVha2Rvd24gc3RydWN0dXJlIGNhbiBkZWZpbmUgZGlmZmVyZW50IHJlbGF0aW9uc2hpcHMgb2YgVGFzayBEZXNjcmlwdG9ycyB0byBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvcnMgYW5kIFJvbGUgRGVzY3JpcHRvcnMuIFRoZXJlZm9yZSBvbmUgVGFzayBjYW4gYmUgcmVwcmVzZW50ZWQgYnkgbWFueSBUYXNrIERlc2NyaXB0b3JzIGVhY2ggd2l0aGluIHRoZSBjb250ZXh0IG9mIGFuIEFjdGl2aXR5IHdpdGggaXRzIG93biBzZXQgb2YgcmVsYXRpb25zaGlwcy4KLUEga2V5IGRpZmZlcmVuY2UgYmV0d2VlbiBNZXRob2QgQ29udGVudCBhbmQgUHJvY2VzcyBpcyB0aGF0IGEgQ29udGVudCBFbGVtZW50IHN1Y2ggYXMgVGFzayBkZXNjcmliZXMgYWxsIGFzcGVjdHMgb2YgZG9pbmcgd29yayBkZWZpbmVkIGFyb3VuZCB0aGlzIFRhc2suICBUaGlzIGRlc2NyaXB0aW9uIGlzIG1hbmFnZWQgaW4gc3RlcHMsIHdoaWNoIGFyZSBtb2RlbGVkIGFzIFNlY3Rpb25zIG9mIHRoZSBUYXNrcycgQ29udGVudCBEZXNjcmlwdGlvbnMuICBXaGVuIGFwcGx5aW5nIGEgVGFzayBpbiBhIFByb2Nlc3MnIEFjdGl2aXR5IHdpdGggYSBUYXNrIERlc2NyaXB0b3IgYSBQcm9jZXNzIEVuZ2luZWVyIG5lZWRzIHRvIGluZGljYXRlIHRoYXQgYXQgdGhhdCBwYXJ0aWN1bGFyIHBvaW50IGluIHRpbWUgaW4gdGhlIFByb2Nlc3MgZGVmaW5pdGlvbiBmb3Igd2hpY2ggdGhlIFRhc2sgRGVzY3JpcHRvciBoYXMgYmVlbiBjcmVhdGVkLCBvbmx5IGEgc3Vic2V0IG9mIHN0ZXBzIHNoYWxsIGJlIHBlcmZvcm1lZC4gIEhlIGRlZmluZXMgdGhpcyBzZWxlY3Rpb24gdXNpbmcgdGhlIHNlbGVjdGVkU3RlcHMgYXNzb2NpYXRpb24uICBJZiBoZSB3YW50cyB0byBhZGQgc3RlcHMgdG8gYSBUYXNrIERlc2NyaXB0b3IsIGhlIGNhbiBkZXNjcmliZSB0aGVzZSBlaXRoZXIgcHJhZ21hdGljYWxseSBpbiB0aGUgcmVmaW5lZERlc2NyaXB0aW9uIGF0dHJpYnV0ZSBvciAncHJvcGVybHknIGNyZWF0ZSBhIGNvbnRyaWJ1dGluZyBUYXNrIHRvIHRoZSBUYXNrIHRoZSBUYXNrIERlc2NyaXB0b3IgcmVmZXJzIHRvLgotCi08L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il95N3ZXN2Utc0VkdUg1OUtTSFY4dmdBIiBnZW5lcmFsPSJfeTd2VzJ1LXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3k3dlc3dS1zRWR1SDU5S1NIVjh2Z0EiIGdlbmVyYWw9Il95N3ZYS2Utc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfeTd2VzctLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0idGFzayIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXl6ZEd1LXNFZHVINTlLU0hWOHZnQSIgYXNzb2NpYXRpb249Il95NzVIcC0tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeTd2VzhPLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjEiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeTd2VzhlLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il95N3ZXOHUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJhZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeTd2VzMtLXNFZHVINTlLU0hWOHZnQSIgYXNzb2NpYXRpb249Il95NzVIdHUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeTd2VzgtLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeTd2VzlPLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il95N3ZXOWUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJhc3Npc3RlZEJ5IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95N3ZXMy0tc0VkdUg1OUtTSFY4dmdBIiBhc3NvY2lhdGlvbj0iX3k3NUh1LS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95N3ZXOXUtc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95N3ZXOS0tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3k3dlctTy1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9ImV4dGVybmFsSW5wdXQiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3k3dlhDdS1zRWR1SDU5S1NIVjh2Z0EiIGFzc29jaWF0aW9uPSJfeTc1SHdPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3k3dlctZS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3k3dlctdS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfeTd2Vy0tLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0ibWFuZGF0b3J5SW5wdXQiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3k3dlhDdS1zRWR1SDU5S1NIVjh2Z0EiIGFzc29jaWF0aW9uPSJfeTc1SHgtLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3k3dldfTy1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3k3dldfZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfeTd2V191LXNFZHVINTlLU0hWOHZnQSIgbmFtZT0ib3B0aW9uYWxJbnB1dCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeTd2WEN1LXNFZHVINTlLU0hWOHZnQSIgYXNzb2NpYXRpb249Il95NzVIMGUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeTd2V18tLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeTd2WEFPLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il95N3ZYQWUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJvdXRwdXQiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3k3dlhDdS1zRWR1SDU5S1NIVjh2Z0EiIGFzc29jaWF0aW9uPSJfeTc1SDF1LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3k3dlhBdS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3k3dlhBLS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfeTd2WEJPLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0icGVyZm9ybWVkUHJpbWFyaWx5QnkiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3k3dlczLS1zRWR1SDU5S1NIVjh2Z0EiIGFzc29jaWF0aW9uPSJfeTc1SDRPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3k3dlhCZS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIxIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3k3dlhCdS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfeTd2WEItLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0ic2VsZWN0ZWRTdGVwcyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXh3N1l1LXNFZHVINTlLU0hWOHZnQSIgYXNzb2NpYXRpb249Il96Qlo2Qy0tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeTd2WENPLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeTd2WENlLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3k3dlhDdS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9IldvcmtQcm9kdWN0RGVzY3JpcHRvciI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3k3dlhDLS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95N3ZYQ3Utc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+QSBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvciByZXByZXNlbnRzIGEgV29yayBQcm9kdWN0IGluIHRoZSBjb250ZXh0IG9mIG9uZSBzcGVjaWZpYyBBY3Rpdml0eS4gIEV2ZXJ5IGJyZWFrZG93biBzdHJ1Y3R1cmUgY2FuIGRlZmluZSBkaWZmZXJlbnQgcmVsYXRpb25zaGlwcyBvZiBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvcnMgdG8gVGFzayBEZXNjcmlwdG9ycyBhbmQgUm9sZSBEZXNjcmlwdG9ycy4gIFRoZXJlZm9yZSBvbmUgV29yayBQcm9kdWN0IGNhbiBiZSByZXByZXNlbnRlZCBieSBtYW55IFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9ycyBlYWNoIHdpdGhpbiB0aGUgY29udGV4dCBvZiBhbiBBY3Rpdml0eSB3aXRoIGl0cyBvd24gc2V0IG9mIHJlbGF0aW9uc2hpcHMuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfeTd2WERPLXNFZHVINTlLU0hWOHZnQSIgZ2VuZXJhbD0iX3k3dlcydS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il95N3ZYRGUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJhY3Rpdml0eUVudHJ5U3RhdGUiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l4VVBhTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3k3dlhEdS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95N3ZYRGUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgICA8Ym9keT5HaXZlbiB0aGF0IGFuIGluc3RhbmNlIG9mIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9yIGhhcyBiZWVuIGNyZWF0ZWQgZm9yIGEgc3BlY2lmaWMgQWN0aXZpdHksIHRoZW4gdGhlIEFjdGl2aXR5IEVudHJ5IFN0YXRlIGF0dHJpYnV0ZSBzcGVjaWZpZXMgdGhlIGRlc2lyZWQgc3RhdGUgb2YgaW5zdGFuY2VzIG9mIHRoZSByZWZlcmVuY2VkIFdvcmsgUHJvZHVjdCB3aGVuIHdvcmsgb24gdGhlIEFjdGl2aXR5IGlzIGluaXRpYXRlZCAoaS5lLiB3b3JrIG9uIHRoZSBBY3Rpdml0eSdzIFRhc2sgRGVzY3JpcHRvcnMgaXMgYmVpbmcgaW5pdGlhdGVkIHRoYXQgdXNlIHRoaXMgV29yayBQcm9kdWN0IERlc2NyaXB0b3IgYXMgaW5wdXQpLiAgCi1Gb3Igc29tZSBXb3JrIFByb2R1Y3RzIHN0YXRlIGlzIGV4cHJlc3NlZCBpbiBwZXJjZW50YWdlIG9mIGNvbXBsZXRpb24sIGNvbXBsaWFuY2UgdG8gd29yayBwcm9kdWN0IGNoZWNrbGlzdCwgaW5mb3JtYWwgc3RhdGUgZGVzY3JpcHRpb25zLCBldGMuICBPdGhlcnMgaGF2ZSB2ZXJ5IHNwZWNpZmljIHN0YXRlcyBleHByZXNzZWQgYXMgZW51bWVyYXRpb25zIHN1Y2ggYXMgW2lkZW50aWZpZWQsIGJyaWVmbHkgZGVzY3JpYmVkLCBvdXRsaW5lZCwgZGV0YWlsZWRdIGZvciB1c2UgY2FzZXMuICBPdGhlciBXb3JrIFByb2R1Y3Qgc3RhdGVzIHJlbGF0ZSB0byBzb21lIHF1YWxpdHkgbWVhc3VyZXMgb3IgbGlmZWN5Y2xlIHN0YXRlcyBzdWNoIGFzIFtyZXZpZXdlZCwgaW1wbGVtZW50ZWQsIHRlc3RlZF0uCi08L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95N3ZYRC0tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iMSIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95N3ZYRU8tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il95N3ZYRWUtc0VkdUg1OUtTSFY4dmdBIiB0eXBlPSJfeXhVUGFPLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IiIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il95N3ZYRXUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJhY3Rpdml0eUV4aXRTdGF0ZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXhVUGFPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeTd2WEUtLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3k3dlhFdS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICAgIDxib2R5PkdpdmVuIHRoYXQgYW4gaW5zdGFuY2Ugb2YgV29yayBQcm9kdWN0IERlc2NyaXB0b3IgaGFzIGJlZW4gY3JlYXRlZCBmb3IgYSBzcGVjaWZpYyBBY3Rpdml0eSwgdGhlbiB0aGUgQWN0aXZpdHkgRXhpc3QgU3RhdGUgYXR0cmlidXRlIHNwZWNpZmllcyB0aGUgZGVzaXJlZCBzdGF0ZSBvZiBpbnN0YW5jZXMgb2YgdGhlIHJlZmVyZW5jZWQgV29yayBQcm9kdWN0IHdoZW4gd29yayBvbiB0aGUgQWN0aXZpdHkgaXMgZmluaXNoZWQgKGkuZS4gd29yayBvbiB0aGUgQWN0aXZpdHkncyBUYXNrIERlc2NyaXB0b3JzIGhhcyBmaW5pc2hlZCB0aGF0IGhhdmUgdGhpcyBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvciBhcyBvdXRwdXQpLgotRm9yIHNvbWUgV29yayBQcm9kdWN0cyBzdGF0ZSBpcyBleHByZXNzZWQgaW4gcGVyY2VudGFnZSBvZiBjb21wbGV0aW9uLCBjb21wbGlhbmNlIHRvIHdvcmsgcHJvZHVjdCBjaGVja2xpc3QsIGluZm9ybWFsIHN0YXRlIGRlc2NyaXB0aW9ucywgZXRjLiAgT3RoZXJzIGhhdmUgdmVyeSBzcGVjaWZpYyBzdGF0ZXMgZXhwcmVzc2VkIGFzIGVudW1lcmF0aW9ucyBzdWNoIGFzIFtpZGVudGlmaWVkLCBicmllZmx5IGRlc2NyaWJlZCwgb3V0bGluZWQsIGRldGFpbGVkXSBmb3IgdXNlIGNhc2VzLiAgT3RoZXIgV29yayBQcm9kdWN0IHN0YXRlcyByZWxhdGUgdG8gc29tZSBxdWFsaXR5IG1lYXN1cmVzIG9yIGxpZmVjeWNsZSBzdGF0ZXMgc3VjaCBhcyBbcmV2aWV3ZWQsIGltcGxlbWVudGVkLCB0ZXN0ZWRdLgotPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeTd2WEZPLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjEiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeTd2WEZlLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfeTd2WEZ1LXNFZHVINTlLU0hWOHZnQSIgdHlwZT0iX3l4VVBhTy1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfeTd2WEYtLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0id29ya1Byb2R1Y3QiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l5emRNTy1zRWR1SDU5S1NIVjh2Z0EiIGFzc29jaWF0aW9uPSJfeTc1SHJPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3k3dlhHTy1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIxIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3k3dlhHZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfeTd2WEd1LXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iaW1wYWN0ZWRCeSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeTd2WEN1LXNFZHVINTlLU0hWOHZnQSIgYXNzb2NpYXRpb249Il95NzVIeGUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeTd2WEctLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeTd2WEhPLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il95N3ZYSGUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJpbXBhY3RzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95N3ZYQ3Utc0VkdUg1OUtTSFY4dmdBIiBhc3NvY2lhdGlvbj0iX3k3NUh4ZS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95N3ZYSHUtc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95N3ZYSC0tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3k3dlhJTy1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9ImRlbGl2ZXJhYmxlUGFydHMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3k3dlhDdS1zRWR1SDU5S1NIVjh2Z0EiIGFzc29jaWF0aW9uPSJfeTc1SDItLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3k3dlhJZS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3k3dlhJdS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il95N3ZYSS0tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJDb21wb3NpdGVSb2xlIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeTd2WEpPLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3k3dlhJLS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5BIENvbXBvc2l0ZSBSb2xlIGlzIGEgc3BlY2lhbCBSb2xlIERlc2NyaXB0b3IgdGhhdCByZWxhdGVzIHRvIG1vcmUgdGhlbiBvbmUgUm9sZS4gIEl0IHJlcHJlc2VudHMgYSBncm91cGluZyBvZiBSb2xlcyB3aXRoIHRoZSBtYWluIHB1cnBvc2Ugb2Ygc2ltcGxpZmljYXRpb24sIGkuZS4gcmVkdWNpbmcgdGhlIG51bWJlciBvZiByb2xlcyBmb3IgYSBwcm9jZXNzLgotQSBDb21wb3NpdGUgUm9sZSBpcyBhIGdyb3VwaW5nIG9mIFJvbGVzIHRoYXQgY2FuIGJlIHVzZWQgaW4gYW4gQWN0aXZpdHkgb3IgUHJvY2VzcyB0byByZWR1Y2UgdGhlIG51bWJlciBvZiBSb2xlcy4gIEEgdHlwaWNhbCBhcHBsaWNhdGlvbiB3b3VsZCBiZSBhIHByb2Nlc3MgZm9yIGEgc21hbGwgdGVhbSBpbiB3aGljaCBhIHN0YW5kYXJkIHNldCBvZiByb2xlcyBmcm9tIHRoZSBtZXRob2QgY29udGVudCB3b3VsZCBiZSBhbGwgcGVyZm9ybWVkIGJ5IG9uZSBvciBtb3JlIHJlc291cmNlLiAgQnkgdXNpbmcgQ29tcG9zaXRlIFJvbGUgdGhlIHByb2Nlc3Mgd291bGQgc3VnZ2VzdCBhIHR5cGljYWwgY2x1c3RlcmluZyBvZiBSb2xlcyB0byBSZXNvdXJjZXMuICBBIENvbXBvc2l0ZSBSb2xlIGNvdWxkIHBlcmZvcm0gYWxsIFRhc2tzIGRlZmluZWQgZm9yIHRoZSBSb2xlcyBpdCByZWZlcnMgdG8uCi08L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il95N3ZYSmUtc0VkdUg1OUtTSFY4dmdBIiBnZW5lcmFsPSJfeTd2VzMtLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3k3dlhKdS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9ImFnZ3JlZ2F0ZWRSb2xlcyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXl6ZEVlLXNFZHVINTlLU0hWOHZnQSIgYXNzb2NpYXRpb249Il95NzVINnUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeTd2WEotLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeTd2WEtPLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3k3dlhLZS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9IldvcmtCcmVha2Rvd25FbGVtZW50IiBpc0Fic3RyYWN0PSJ0cnVlIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeTd2WEt1LXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3k3dlhLZS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5BIFdvcmsgQnJlYWtkb3duIEVsZW1lbnQgaXMgYSBzcGVjaWFsIEJyZWFrZG93biBFbGVtZW50IHRoYXQgcHJvdmlkZXMgc3BlY2lmaWMgcHJvcGVydGllcyBmb3IgQnJlYWtkb3duIEVsZW1lbnRzIHRoYXQgcmVwcmVzZW50IG9yIHJlZmVyIHRvIFdvcmsgRGVmaW5pdGlvbnMuICBGb3IgZXhhbXBsZSBpdHMgc3ViY2xhc3MgQWN0aXZpdHkgZGVmaW5lcyB3b3JrIGFzIGl0IGlzIGFsc28gYSBzdWJjbGFzcyBvZiBXb3JrIERlZmluaXRpb24uICBJdHMgc3ViY2xhc3MgVGFzayBEZXNjcmlwdG9yIGRvZXMgbm90IGRlZmluZSB3b3JrIGJ5IGl0c2VsZiwgYnV0IHJlZmVycyB0byBhIFdvcmsgRGVmaW5pdGlvbiBhbmQgdGhlcmVmb3JlIGNhbiBoYXZlIHRoZSBzYW1lIGNvbW1vbiBwcm9wZXJ0aWVzIGFuZCBXb3JrIEJyZWFrZG93biBFbGVtZW50IGhhcy48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il95N3ZYSy0tc0VkdUg1OUtTSFY4dmdBIiBnZW5lcmFsPSJfeTd2V3ZPLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3k3dlhMTy1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9ImlzUmVwZWF0YWJsZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXhVUGJ1LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeTd2WExlLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3k3dlhMTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICAgIDxib2R5PlRoaXMgYXR0cmlidXRlIGlzIHVzZWQgdG8gZGVmaW5lIHJlcGV0aXRpb24gb2Ygd29yaywgZS5nLiBpdGVyYXRpb25zLiAgQSBQcm9jZXNzIFdvcmsgRGVmaW5pdGlvbiB3aXRoIHRoaXMgYXR0cmlidXRlIHNldCB0byBUcnVlIHNoYWxsIGJlIHJlcGVhdGVkIG1vcmUgdGhhbiBvbmNlIG9uIHRoZSBzYW1lIHNldCBvZiBhcnRpZmFjdHMuICBGb3IgZXhhbXBsZSwgZm9yIGFuIGluc3RhbmNlIG9mIEl0ZXJhdGlvbiAoZGVmaW5lZCBhcyBhIHNwZWNpYWwgUHJvY2VzcyBXb3JrIERlZmluaXRpb24gYmVsb3cpIHRoaXMgYXR0cmlidXRlIGlzIHNldCB0byBUcnVlIGJ5IGRlZmF1bHQgaW5kaWNhdGluZyB0aGF0IGV2ZXJ5IHN1Yi1BY3Rpdml0eSB3aWxsIGJlIHJlcGVhdGVkIG1vcmUgdGhhbiBvbmNlLiAgSG93ZXZlciwgYW55IFByb2Nlc3MgV29yayBEZWZpbml0aW9uIGNhbiBzZXQgdGhpcyBhdHRyaWJ1dGUgdG8gVHJ1ZSB0byBkZWZpbmUgaXRlcmF0aW9ucyAoZS5nLiB0byBpdGVyYXRlIG9uZSBBY3Rpdml0eSBjb25zaXN0aW5nIG9mIG1hbnkgc3ViLWFjdGl2aXRpZXMgb3IgZXZlbiBQaGFzZXMsIGJ1dCB0byBpdGVyYXRlIGp1c3Qgb25lIFRhc2spLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9Il95N3ZYTHUtc0VkdUg1OUtTSFY4dmdBIiB0eXBlPSJfeXhVUGJ1LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgICAgPGJvZHk+ZmFsc2U8L2JvZHk+Ci0gICAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il95N3ZYTC0tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJpc09uZ29pbmciIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l4VVBidS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3k3dlhNTy1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95N3ZYTC0tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgICA8Ym9keT5JZiB0aGUgaXNPbmdvaW5nIGF0dHJpYnV0ZSBpcyBzZXQgdG8gVHJ1ZSBmb3IgYSBQcm9jZXNzIFdvcmsgRGVmaW5pdGlvbiBpbnN0YW5jZSwgdGhlbiB0aGUgZWxlbWVudCBkZXNjcmliZXMgYW4gb25nb2luZyBwaWVjZSBvZiB3b3JrIHdpdGhvdXQgYSBmaXhlZCBkdXJhdGlvbiBvciBlbmQgc3RhdGUuICBGb3IgZXhhbXBsZSwgdGhlIFByb2Nlc3MgV29yayBEZWZpbml0aW9uIGNvdWxkIHJlcHJlc2VudCB3b3JrIG9mIGFuIGFkbWluaXN0cmF0b3IgY29udGludW91c2x5IChlLmcuIDNoIGEgZGF5KSB3b3JraW5nIHRvIGVuc3VyZSB0aGF0IHN5c3RlbXMgYXJlIGtlcHQgaW4gYSBjZXJ0YWluIHN0YXRlLiAgQW5vdGhlciBleGFtcGxlIHdvdWxkIGJlIHByb2dyYW0gbWFuYWdlbWVudCB3b3JrIG92ZXJzZWVpbmcgbWFueSBkaWZmZXJlbnQgcHJvamVjdHMgYmVpbmcgc2NoZWR1bGVkIGZvciBvbmUgcGFydGljdWxhciBwcm9qZWN0IGF0IHNwZWNpZmljIHJlb2NjdXJyaW5nIGludGVydmFscyBkdXJpbmcgdGhlIHdob2xlIGxpZmVjeWNsZSBvZiB0aGUgcHJvamVjdC48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJfeTd2WE1lLXNFZHVINTlLU0hWOHZnQSIgdHlwZT0iX3l4VVBidS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICAgIDxib2R5PmZhbHNlPC9ib2R5PgotICAgICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfeTd2WE11LXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iaXNFdmVudERyaXZlbiIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXhVUGJ1LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeTd2WE0tLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3k3dlhNdS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICAgIDxib2R5PlRoZSBpc0V2ZW50RHJpdmVuIGF0dHJpYnV0ZSBpbmRpY2F0ZXMgdGhhdCB0aGUgUHJvY2VzcyBXb3JrIERlZmluaXRpb24gZGVzY3JpYmVzIGFuIGluc3RhbmNlIG9mIHdvcmsgd2hpY2ggaXMgbm90IHN0YXJ0ZWQgYmVjYXVzZSBpdCBoYXMgYmVlbiBzY2hlZHVsZWQgdG8gc3RhcnQgYXQgYSBjZXJ0YWluIHBvaW50IG9mIHRpbWUsIGJlY2F1c2UgcHJlY2VkaW5nIHdvcmsgaXMgYmVpbmcgY29tcGxldGVkLCBvciBpbnB1dCB3b3JrIHByb2R1Y3RzIGFyZSBhdmFpbGFibGUsIGJ1dCBiZWNhdXNlIGFub3RoZXIgc3BlY2lmaWMgZXZlbnQgaGFzIG9jY3VycmVkLiAgRXhhbXBsZXMgZm9yIHN1Y2ggZXZlbnRzIGFyZSBleGNlcHRpb25zIG9yIHByb2JsZW0gc2l0dWF0aW9ucyB3aGljaCByZXF1aXJlIHNwZWNpZmljIHdvcmsgdG8gYmUgcGVyZm9ybWVkIGFzIGEgcmVzdWx0LiAgQWxzbyBjaGFuZ2UgbWFuYWdlbWVudCB3b3JrIGNhbiBiZSBtb2RlbGVkIGFzIGV2ZW50IGRyaXZlbiB3b3JrIGFuYWx5emluZyBhIGNoYW5nZSByZXF1ZXN0IG9yIGRlZmVjdCBhbmQgYWxsb2NhdGluZyB3b3JrIGR5bmFtaWNhbGx5IHRvIHJlc291cmNlcyB0byBkZWFsIHdpdGggaXQgZm9sbG93aW5nIHRoZSB3b3JrIGRlc2NyaWJlZCB3aXRoIHN1Y2ggUHJvY2VzcyBXb3JrIERlZmluaXRpb24uICBUaGUgZXZlbnRzIHRoZW1zZWx2ZXMgYXJlIG5vdCBtb2RlbGVkIGluIHRoaXMgdmVyc2lvbiBvZiB0aGUgc3BlY2lmaWNhdGlvbi4gIFRoZXkgc2hhbGwgYmUgZGVzY3JpYmVkIGFzIHBhcnQgb2YgdGhlIG5vcm1hbCBkZXNjcmlwdGlvbnMgZmllbGRzIGF2YWlsYWJsZS4KLQotCi08L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJfeTd2WE5PLXNFZHVINTlLU0hWOHZnQSIgdHlwZT0iX3l4VVBidS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICAgIDxib2R5PmZhbHNlPC9ib2R5PgotICAgICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfeTd2WE5lLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0ibGlua1RvUHJlZGVjZXNzb3IiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3k3dldxdS1zRWR1SDU5S1NIVjh2Z0EiIGFzc29jaWF0aW9uPSJfeTc1SC1PLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3k3dlhOdS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3k3dlhOLS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il95N3ZYT08tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJQcm9jZXNzRWxlbWVudCIgaXNBYnN0cmFjdD0idHJ1ZSI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3k3dlhPZS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95N3ZYT08tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+UHJvY2VzcyBFbGVtZW50IGlzIGEgRGVzY3JpYmFibGUgRWxlbWVudCB0aGF0IHJlcHJlc2VudHMgYW4gYWJzdHJhY3QgZ2VuZXJhbGl6YXRpb24gZm9yIGFsbCBlbGVtZW50cyBkZWZpbmVkIGluIHRoZSBQcm9jZXNzIHBhY2thZ2UuCi1Qcm9jZXNzIEVsZW1lbnRzIHJlcHJlc2VudHMgUHJvY2VzcyBzcGVjaWZpYyBlbGVtZW50cyB0aGF0IGFyZSBzdXBwb3NlZCB0byBiZSBtYW5hZ2VkIGluIFByb2Nlc3MgUGFja2FnZXMuICBUaGUgc2VwYXJhdGlvbiBvZiBQcm9jZXNzIEVsZW1lbnQgZnJvbSBDb250ZW50IEVsZW1lbnQgYWxsb3dzIHRvIGNsZWFybHkgZGlzdGluZ3Vpc2ggYmV0d2VlbiBwdXJlIG1ldGhvZCBjb250ZW50IGZyb20gY29udGVudCB0aGF0IGlzIHJlcHJlc2VudGVkIGluIHByb2Nlc3Nlcy4gCi08L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il95N3ZYT3Utc0VkdUg1OUtTSFY4dmdBIiBnZW5lcmFsPSJfeXh3N2V1LXNFZHVINTlLU0hWOHZnQSIvPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfeTd2WE8tLXNFZHVINTlLU0hWOHZnQSIgbWVtYmVyRW5kPSJfeTd2WFBlLXNFZHVINTlLU0hWOHZnQSBfeTdtTXctLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3k3dlhQTy1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95N3ZYTy0tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+VGhpcyBhZ2dyZWdhdGlvbiBhc3NvY2lhdGlvbiBzcGVjaWZpZXMgdGhlIHJvbGVzIG9mIHRlYW0gbWVtYmVycyB3aXRoIFJvbGUgRGVzY3JpcHRvcnMuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfeTd2WFBlLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iX3RlYW1Qcm9maWxlIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95N21Nd08tc0VkdUg1OUtTSFY4dmdBIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfeTd2WE8tLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3k3dlhQdS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3k3dlhQLS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il95NzVIb08tc0VkdUg1OUtTSFY4dmdBIiBtZW1iZXJFbmQ9Il95N21NeHUtc0VkdUg1OUtTSFY4dmdBIF95N21NeWUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeTc1SG9lLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3k3NUhvTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5UaGlzIGFzc29jaWF0aW9uIHJlbGF0ZXMgYSBTdWItVGVhbSB0byBpdHMgU3VwZXItVGVhbSwgaS5lLiB0aGUgVGVhbSB0aGF0IGl0IGlzIHBhcnQgb2YuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il95NzVIb3Utc0VkdUg1OUtTSFY4dmdBIiBtZW1iZXJFbmQ9Il95N3ZXenUtc0VkdUg1OUtTSFY4dmdBIF95NzVIcE8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeTc1SG8tLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3k3NUhvdS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5CcmVha2Rvd24gc3RydWN0dXJlcyBhcmUgbmVzdGVkIHN0cnVjdHVyZXMgKHNlZSBzdXBlckFjdGl2aXRpZXMgYXNzb2NpYXRpb24pIHByZXNlbnRlZCBub3JtYWxseSBhcyBpbmRlbnRlZCBsaXN0cy4gIFdpdGhpbiB0aGlzIG5lc3RpbmcgY2hpbGRyZW4gb24gdGhlIHNhbWUgbGV2ZWwgYXJlIG5vdCBzcGVjaWZpY2FsbHkgb3JkZXJlZC4gIEhvd2V2ZXIsIGEgdXNlciBvZiB0aGVzZSBkYXRhIHN0cnVjdHVyZXMgd291bGQgZXhwZWN0IHRvIG9yZGVyIGVsZW1lbnRzIHdpdGhpbiBhIGxpc3QuICBUaGlzIGFzc29jaWF0aW9uIGlzIHVzZWQgdG8gc3RvcmUgdGhlIHByZXNlbnRhdGlvbiBzZXF1ZW5jZSBhbW9uZ3N0IEJyZWFrZG93biBFbGVtZW50cy4gIFRoZSBhc3NvY2lhdGlvbiBwcmVzZW50ZWRBZnRlciBpcyByZWR1bmRhbnQgdG8gdGhlIGFzc29jaWF0aW9uIHByZXNlbnRlZEJlZm9yZS4gIFRoaXMgcmVkdW5kYW5jeSBpcyByZXF1aXJlZCB0byBzdXBwb3J0IFByb2Nlc3MgQ29udHJpYnV0aW9ucyAoc2VlIHBsdWdpbnMpLjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iX3k3NUhwTy1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9Il9icmVha2Rvd25FbGVtZW50IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95N3ZXdk8tc0VkdUg1OUtTSFY4dmdBIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfeTc1SG91LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3k3NUhwZS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIxIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3k3NUhwdS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il95NzVIcC0tc0VkdUg1OUtTSFY4dmdBIiBtZW1iZXJFbmQ9Il95NzVIcWUtc0VkdUg1OUtTSFY4dmdBIF95N3ZXNy0tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeTc1SHFPLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3k3NUhwLS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5UaGlzIGFzc29jaWF0aW9uIHJlcHJlc2VudHMgdGhlIHJlZmVyZW5jZSBmcm9tIHRoZSBkZXNjcmlwdG9yIHRvIHRoZSBjb3JlIGNvbnRlbnQgZWxlbWVudCBpdCByZWZlcnMgdG8uICBFdmVyeSBUYXNrIERlc2NyaXB0b3IgY2FuIHJlZmVyZW5jZSBvbmx5IG9uIFRhc2suICBIb3dldmVyLCBhIFRhc2sgY2FuIGJlIHJlcHJlc2VudGVkIGJ5IG1hbnkgVGFzayBEZXNjcmlwdG9ycy4gIEluIHRoZSBVTUEgUHJvZmlsZSB0aGlzIGFzc29jaWF0aW9uIGlzIGluc3RhbnRpYXRlZCBieSBhIGRlcGVuZGVuY3kgcmVsYXRpb25zaGlwIHdpdGggYSB0cmFjZSBzdGVyZW90eXBlLjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iX3k3NUhxZS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9InRhc2tEZXNjcmlwdG9yIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95N3ZXNi0tc0VkdUg1OUtTSFY4dmdBIiBhc3NvY2lhdGlvbj0iX3k3NUhwLS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95NzVIcXUtc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95NzVIcS0tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkRW5kPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfeTc1SHJPLXNFZHVINTlLU0hWOHZnQSIgbWVtYmVyRW5kPSJfeTc1SHJ1LXNFZHVINTlLU0hWOHZnQSBfeTd2WEYtLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3k3NUhyZS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95NzVIck8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+VGhpcyBhc3NvY2lhdGlvbiByZXByZXNlbnRzIHRoZSByZWZlcmVuY2UgZnJvbSB0aGUgZGVzY3JpcHRvciB0byB0aGUgY29yZSBjb250ZW50IGVsZW1lbnQgaXQgcmVmZXJzIHRvLiAgRXZlcnkgV29yayBQcm9kdWN0IERlc2NyaXB0b3IgY2FuIHJlZmVyZW5jZSBvbmx5IG9uZSBXb3JrIFByb2R1Y3QuICBIb3dldmVyLCBhIFdvcmsgUHJvZHVjdCBjYW4gYmUgcmVwcmVzZW50ZWQgYnkgbWFueSBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvcnMuICBJbiB0aGUgVU1BIFByb2ZpbGUgdGhpcyBhc3NvY2lhdGlvbiBpcyBpbnN0YW50aWF0ZWQgYnkgYSBkZXBlbmRlbmN5IHJlbGF0aW9uc2hpcCB3aXRoIGEgdHJhY2Ugc3RlcmVvdHlwZS48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il95NzVIcnUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJ3b3JrUHJvZHVjdERlc2NyaXB0b3IiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3k3dlhDdS1zRWR1SDU5S1NIVjh2Z0EiIGFzc29jaWF0aW9uPSJfeTc1SHJPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3k3NUhyLS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3k3NUhzTy1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il95NzVIc2Utc0VkdUg1OUtTSFY4dmdBIiBtZW1iZXJFbmQ9Il95NzVIcy0tc0VkdUg1OUtTSFY4dmdBIF95N3ZXNHUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeTc1SHN1LXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3k3NUhzZS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5UaGlzIGFzc29jaWF0aW9uIHJlcHJlc2VudHMgdGhlIHJlZmVyZW5jZSBmcm9tIHRoZSBkZXNjcmlwdG9yIHRvIHRoZSBjb3JlIGNvbnRlbnQgZWxlbWVudCBpdCByZWZlcnMgdG8uICBFdmVyeSBSb2xlIERlc2NyaXB0b3IgY2FuIHJlZmVyZW5jZSBvbmx5IG9uZSBSb2xlLiAgSG93ZXZlciwgYSBSb2xlIGNhbiBiZSByZXByZXNlbnRlZCBieSBtYW55IFJvbGUgRGVzY3JpcHRvcnMuICBJbiB0aGUgVU1BIFByb2ZpbGUgdGhpcyBhc3NvY2lhdGlvbiBpcyBpbnN0YW50aWF0ZWQgYnkgYSBkZXBlbmRlbmN5IHJlbGF0aW9uc2hpcCB3aXRoIGEgdHJhY2Ugc3RlcmVvdHlwZS48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il95NzVIcy0tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJyb2xlRGVzY3JpcHRvciIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeTd2VzMtLXNFZHVINTlLU0hWOHZnQSIgYXNzb2NpYXRpb249Il95NzVIc2Utc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeTc1SHRPLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeTc1SHRlLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3k3NUh0dS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9IkFkZGl0aW9uYWxseVBlcmZvcm1zIiBtZW1iZXJFbmQ9Il95N3ZXOHUtc0VkdUg1OUtTSFY4dmdBIF95NzVIdU8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeTc1SHQtLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3k3NUh0dS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5UaGlzIGFzc29jaWF0aW9uIG1hcHMgdG8gdGhlIHJlc3BlY3RpdmUgYXNzb2NpYXRpb24gaW4gQ29yZSBDb250ZW50IEVsZW1lbnRzLiAgSXQgc3BlY2lmaWVzIGRlc2NyaXB0b3JzIGZvciBhZGRpdGlvbmFsIHJvbGVzIG5lY2Vzc2FyeSB0byBjb21wbGV0ZSB0aGUgcmVmZXJyZWQgVGFzay4gIEluc3RhbmNlcyBvZiB0aGVzZSByb2xlcyB3b3VsZCBzaG93IHVwIGFzIHNjaGVkdWxlZCByZXNvdXJjZXMgb24gYSBjb3JyZXNwb25kaW5nIHByb2plY3QgcGxhbiBnZW5lcmF0ZWQgZnJvbSB0aGlzIHN0cnVjdHVyZS48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il95NzVIdU8tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJwZXJmb3Jtc0FkZGl0aW9uYWxseSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeTd2VzYtLXNFZHVINTlLU0hWOHZnQSIgYXNzb2NpYXRpb249Il95NzVIdHUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeTc1SHVlLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeTc1SHV1LXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3k3NUh1LS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9IkFzc2lzdHMiIG1lbWJlckVuZD0iX3k3dlc5ZS1zRWR1SDU5S1NIVjh2Z0EgX3k3NUh2ZS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95NzVIdk8tc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeTc1SHUtLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PlRoaXMgYXNzb2NpYXRpb24gaXMgc3BlY2lmaWMgdG8gYSBwcm9jZXNzLCBpLmUuIG5vIGRlZmF1bHRzIGhhdmUgYmVlbiBkZWZpbmVkIGluIENvcmUgQ29udGVudCBFbGVtZW50cy4gIEl0IHNwZWNpZmllcyBkZXNjcmlwdG9ycyBmb3IgYWRkaXRpb25hbCByb2xlcyB0aGF0IG1heSBwcm92aWRlIGluZm9ybWF0aW9uIG9yIGFzc2lzdGFuY2UgaGVscGZ1bCwgYnV0IG5vdCBtYW5kYXRvcnkgdG8gdGhlIGNvbXBsZXRpb24gb2YgdGhlIFRhc2suICBJbnN0YW5jZXMgb2YgdGhlc2Ugcm9sZXMgd291bGQgbm90IHNob3cgdXAgYXMgc2NoZWR1bGVkIHJlc291cmNlcyBvbiB0aGUgY29ycmVzcG9uZGluZyBwcm9qZWN0IHBsYW4gZ2VuZXJhdGVkIGZyb20gdGhpcyBzdHJ1Y3R1cmUuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfeTc1SHZlLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iYXNzaXN0c0luIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95N3ZXNi0tc0VkdUg1OUtTSFY4dmdBIiBhc3NvY2lhdGlvbj0iX3k3NUh1LS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95NzVIdnUtc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95NzVIdi0tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkRW5kPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfeTc1SHdPLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iRXh0ZXJuYWxJbnB1dCIgbWVtYmVyRW5kPSJfeTd2Vy1PLXNFZHVINTlLU0hWOHZnQSBfeTc1SHd1LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3k3NUh3ZS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95NzVId08tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+VGhpcyBhc3NvY2lhdGlvbiBpcyBzcGVjaWZpYyB0byBhIHByb2Nlc3MsIGkuZS4gbm8gZGVmYXVsdHMgd2lsbCBiZSBkZWZpbmVkIGluIENvcmUgQ29udGVudCBFbGVtZW50cy4gIEl0IHNwZWNpZmllcyBkZXNjcmlwdG9ycyBmb3IgV29yayBQcm9kdWN0cyB1c2VkIGFzIGlucHV0cyB0aGF0IGFyZSBub3QgcHJvZHVjZWQgYnkgVGFza3Mgd2l0aGluIHRoZSBzYW1lIFByb2Nlc3MsIGJ1dCBieSBhbm90aGVyIGV4dGVybmFsIHByb2Nlc3Mgb3IgYW4gdW5rbm93biBzb3VyY2UuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfeTc1SHd1LXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iZXh0ZXJuYWxJbnB1dFRvIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95N3ZXNi0tc0VkdUg1OUtTSFY4dmdBIiBhc3NvY2lhdGlvbj0iX3k3NUh3Ty1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95NzVIdy0tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95NzVIeE8tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkRW5kPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfeTc1SHhlLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iSW1wYWN0c0RlcGVuZGVuY3kiIG1lbWJlckVuZD0iX3k3dlhHdS1zRWR1SDU5S1NIVjh2Z0EgX3k3dlhIZS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95NzVIeHUtc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeTc1SHhlLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PlRoaXMgYXNzb2NpYXRpb24gaXMgdXNlZCB0byBzZW1pLWZvcm1hbGx5IHNwZWNpZnkgdHJhY2VhYmlsaXR5IHJlbGF0aW9uc2hpcHMgYmV0d2VlbiBXb3JrIFByb2R1Y3RzIHdpdGhpbiB0aGUgc2NvcGUgb2YgYW4gQWN0aXZpdHkuICBBIGxpbmsgZnJvbSBvbmUgV29yayBQcm9kdWN0IERlc2NyaXB0b3IgdG8gYW5vdGhlciBpbmRpY2F0ZXMgdGhhdCBvbmUgV29yayBQcm9kdWN0IGlzIHJlcXVpcmVkIGFzIGlucHV0IHRvIGEgVGFzayB0aGF0IHByb2R1Y2VzIHRoZSByZWxhdGVkIFdvcmsgUHJvZHVjdCAoJ2ltcGFjdHMnIHJvbGUgZW5kKS4gIEl0IHdvdWxkIGFsc28gbWVhbiB0aGF0IGEgY2hhbmdlIG9uIG9uZSBXb3JrIFByb2R1Y3QgaW5zdGFuY2UgbWF5IGFmZmVjdCBhIGNoYW5nZSBvbiB0aGUgcmVsYXRlZCBwcm9kdWN0LjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfeTc1SHgtLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iTWFuZGF0b3J5SW5wdXQiIG1lbWJlckVuZD0iX3k3dlctLS1zRWR1SDU5S1NIVjh2Z0EgX3k3NUh5ZS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95NzVIeU8tc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeTc1SHgtLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PlRoaXMgYXNzb2NpYXRpb24gbWFwcyB0byB0aGUgcmVzcGVjdGl2ZSBhc3NvY2lhdGlvbiBpbiBDb3JlIENvbnRlbnQgRWxlbWVudHMuICBJdCBwb2ludHMgdG8gZGVzY3JpcHRvcnMgZm9yIFdvcmsgUHJvZHVjdHMgdGhhdCBhcmUgbWFuZGF0b3J5IGZvciB0aGUgVGFzayB0byBiZSBwZXJmb3JtZWQuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfeTc1SHllLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0ibWFuZGF0b3J5SW5wdXRUbyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeTd2VzYtLXNFZHVINTlLU0hWOHZnQSIgYXNzb2NpYXRpb249Il95NzVIeC0tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeTc1SHl1LXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeTc1SHktLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3k3NUh6Ty1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9Ik1vZGlmaWVzIiBtZW1iZXJFbmQ9Il95N3ZXNWUtc0VkdUg1OUtTSFY4dmdBIF95NzVIenUtc0VkdUg1OUtTSFY4dmdBIiBpc0Rlcml2ZWQ9InRydWUiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95NzVIemUtc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeTc1SHpPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PlRoaXMgZGVyaXZlZCBhc3NvY2lhdGlvbiBtYXBzIHRvIHRoZSBNb2RpZmllcyBhc3NvY2lhdGlvbiBkZWZpbmVkIGJldHdlZW4gV29yayBQcm9kdWN0cyBhbmQgVGFza3MgaW4gQ29yZSBNZXRob2QgQ29udGVudC4gIFRoZSBzYW1lIGRlcml2YXRpb24gcnVsZSBhcyBmb3IgdGhlIGNvcmUgY29udGVudCBlbGVtZW50cyBhcHBsaWVzLjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iX3k3NUh6dS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9Il9yb2xlRGVzY3JpcHRvciIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeTd2VzMtLXNFZHVINTlLU0hWOHZnQSIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iX3k3NUh6Ty1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95NzVIei0tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95NzVIME8tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkRW5kPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfeTc1SDBlLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iT3B0aW9uYWxJbnB1dCIgbWVtYmVyRW5kPSJfeTc1SDAtLXNFZHVINTlLU0hWOHZnQSBfeTd2V191LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3k3NUgwdS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95NzVIMGUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+VGhpcyBhc3NvY2lhdGlvbiBtYXBzIHRvIHRoZSByZXNwZWN0aXZlIGFzc29jaWF0aW9uIGluIENvcmUgQ29udGVudCBFbGVtZW50cy4gIEl0IHBvaW50cyB0byBkZXNjcmlwdG9ycyBmb3IgV29yayBQcm9kdWN0cyB0aGF0IGFyZSBvcHRpb25hbCBmb3IgdGhlIFRhc2sgdG8gYmUgcGVyZm9ybWVkLjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iX3k3NUgwLS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9Ik9wdGlvbmFsSW5wdXRUbyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeTd2VzYtLXNFZHVINTlLU0hWOHZnQSIgYXNzb2NpYXRpb249Il95NzVIMGUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeTc1SDFPLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeTc1SDFlLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3k3NUgxdS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9Ik91dHB1dCIgbWVtYmVyRW5kPSJfeTc1SDJPLXNFZHVINTlLU0hWOHZnQSBfeTd2WEFlLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3k3NUgxLS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95NzVIMXUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+VGhpcyBhc3NvY2lhdGlvbiBtYXBzIHRvIHRoZSByZXNwZWN0aXZlIGFzc29jaWF0aW9uIGluIENvcmUgQ29udGVudCBFbGVtZW50cy4gIEl0IHBvaW50cyB0byBkZXNjcmlwdG9ycyBmb3IgV29yayBQcm9kdWN0cyB0aGF0IGFyZSBvdXRwdXRzIGZvciBwZXJmb3JtaW5nIHRoZSByZWZlcnJlZCBUYXNrLjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iX3k3NUgyTy1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9Im91dHB1dEZyb20iIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3k3dlc2LS1zRWR1SDU5S1NIVjh2Z0EiIGFzc29jaWF0aW9uPSJfeTc1SDF1LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3k3NUgyZS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3k3NUgydS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il95NzVIMi0tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJQYWNrYWdlZFdQIiBtZW1iZXJFbmQ9Il95NzVIM2Utc0VkdUg1OUtTSFY4dmdBIF95N3ZYSU8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeTc1SDNPLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3k3NUgyLS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5JZiBhIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9yIHJlZmVycyBhdCB0aGUgJ2RlbGl2ZXJhYmxlJyByb2xlIGVuZCB0byBhIERlbGl2ZXJhYmxlIFdvcmsgUHJvZHVjdCB0aGVuIHRoaXMgYXNzb2NpYXRpb24gaXMgdXNlZCB0byBzcGVjaWZ5IHRoZSBEZWxpdmVyYWJsZSdzIFdvcmsgUHJvZHVjdCBwYXJ0cy4gIEFzIGluZGljYXRlZCBmb3IgRGVsaXZlcmFibGUgaW4gdGhlIENvcmUgTWV0aG9kIENvbnRlbnQgcGFja2FnZSwgdGhpcyBhc3NvY2lhdGlvbiBvdmVycmlkZXMgdGhlICdkZWxpdmVyZWRXb3JrUHJvZHVjdHMnIGFzc29jaWF0aW9uIG9mIHRoZSBXb3JrIFByb2R1Y3QsIHdoaWNoIHN0b3JlcyB0aGUgcmVjb21tZW5kZWQgZGVsaXZlcmFibGUgcGFydHMsIGJ1dCBjYW4gYmUgY3VzdG9taXplZCBmb3IgZXZlcnkgV29yayBQcm9kdWN0IERlc2NyaXB0b3IuIDwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iX3k3NUgzZS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9ImRlbGl2ZXJhYmxlIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95N3ZYQ3Utc0VkdUg1OUtTSFY4dmdBIiBhc3NvY2lhdGlvbj0iX3k3NUgyLS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95NzVIM3Utc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95NzVIMy0tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkRW5kPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfeTc1SDRPLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iUHJpbWFyeVBlcmZvcm1zIiBtZW1iZXJFbmQ9Il95N3ZYQk8tc0VkdUg1OUtTSFY4dmdBIF95NzVINHUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeTc1SDRlLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3k3NUg0Ty1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5UaGlzIGFzc29jaWF0aW9uIG1hcHMgdG8gdGhlIHJlc3BlY3RpdmUgYXNzb2NpYXRpb24gaW4gQ29yZSBDb250ZW50IEVsZW1lbnRzLiAgSXQgcG9pbnRzIHRvIGEgZGVzY3JpcHRvciBmb3IgdGhlIG9uZSByb2xlIHJlc3BvbnNpYmxlIGZvciB0aGUgY29tcGxldGlvbiBvZiB0aGUgdGFzay4gIEFuIGluc3RhbmNlIG9mIHRoaXMgcm9sZSB3b3VsZCBzaG93IHVwIGFzIGEgc2NoZWR1bGVkIHJlc291cmNlIG9uIGEgY29ycmVzcG9uZGluZyBwcm9qZWN0IHBsYW4gZ2VuZXJhdGVkIGZyb20gdGhpcyBzdHJ1Y3R1cmUuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfeTc1SDR1LXNFZHVINTlLU0hWOHZnQSIgbmFtZT0icGVyZm9ybXNBc093bmVyIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95N3ZXNi0tc0VkdUg1OUtTSFY4dmdBIiBhc3NvY2lhdGlvbj0iX3k3NUg0Ty1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95NzVINC0tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95NzVINU8tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkRW5kPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfeTc1SDVlLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iUmVzcG9uc2libGUiIG1lbWJlckVuZD0iX3k3dlc2Ty1zRWR1SDU5S1NIVjh2Z0EgX3k3NUg1LS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95NzVINXUtc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeTc1SDVlLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PlRoaXMgYXNzb2NpYXRpb24gcmVwcmVzZW50cyByZXNwb25zaWJpbGl0eSBmb3IgV29yayBQcm9kdWN0IGluc3RhbmNlcy4gIEl0IGluZGljYXRlcyBvd25lcnNoaXAgYW5kIGZvciBleGFtcGxlIHdvdWxkIGRlZmluZSB0aGUgUm9sZSB0aGF0IGFuc3dlcnMgdG8gbWFuYWdlbWVudCBxdWVzdGlvbnMgYWJvdXQgdGhlIHF1YWxpdHkgd29yayBwcm9kdWN0LjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iX3k3NUg1LS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9InJlc3BvbnNpYmxlUm9sZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeTd2VzMtLXNFZHVINTlLU0hWOHZnQSIgYXNzb2NpYXRpb249Il95NzVINWUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeTc1SDZPLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeTc1SDZlLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3k3NUg2dS1zRWR1SDU5S1NIVjh2Z0EiIG1lbWJlckVuZD0iX3k3dlhKdS1zRWR1SDU5S1NIVjh2Z0EgX3k3NUg2LS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iX3k3NUg2LS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9Il9jb21wb3NpdGVSb2xlIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95N3ZYSS0tc0VkdUg1OUtTSFY4dmdBIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfeTc1SDZ1LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3k3NUg3Ty1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3k3NUg3ZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il95NzVIN3Utc0VkdUg1OUtTSFY4dmdBIiBtZW1iZXJFbmQ9Il95N3ZXMGUtc0VkdUg1OUtTSFY4dmdBIF95NzVIOE8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeTc1SDctLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3k3NUg3dS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5CcmVha2Rvd24gc3RydWN0dXJlcyBhcmUgbmVzdGVkIHN0cnVjdHVyZXMgKHNlZSBzdXBlckFjdGl2aXRpZXMgYXNzb2NpYXRpb24pIHByZXNlbnRlZCBub3JtYWxseSBhcyBpbmRlbnRlZCBsaXN0cy4gIFdpdGhpbiB0aGlzIG5lc3RpbmcgY2hpbGRyZW4gb24gdGhlIHNhbWUgbGV2ZWwgYXJlIG5vdCBzcGVjaWZpY2FsbHkgb3JkZXJlZC4gIEhvd2V2ZXIsIGEgdXNlciBvZiB0aGVzZSBkYXRhIHN0cnVjdHVyZXMgd291bGQgZXhwZWN0IHRvIG9yZGVyIGVsZW1lbnRzIHdpdGhpbiBhIGxpc3QuICBUaGlzIGFzc29jaWF0aW9uIGlzIHVzZWQgdG8gc3RvcmUgdGhlIHByZXNlbnRhdGlvbiBzZXF1ZW5jZSBhbW9uZ3N0IEJyZWFrZG93biBFbGVtZW50cy4gIFRoZSBhc3NvY2lhdGlvbiBwcmVzZW50ZWRCZWZvcmUgaXMgcmVkdW5kYW50IHRvIHRoZSBhc3NvY2lhdGlvbiBwcmVzZW50ZWRBZnRlci4gIFRoaXMgcmVkdW5kYW5jeSBpcyByZXF1aXJlZCB0byBzdXBwb3J0IFByb2Nlc3MgQ29udHJpYnV0aW9ucyAoc2VlIHBsdWdpbnMpLjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iX3k3NUg4Ty1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9Il9icmVha2Rvd25FbGVtZW50IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95N3ZXdk8tc0VkdUg1OUtTSFY4dmdBIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfeTc1SDd1LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3k3NUg4ZS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIxIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3k3NUg4dS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il95NzVIOC0tc0VkdUg1OUtTSFY4dmdBIiBtZW1iZXJFbmQ9Il95N3ZXc08tc0VkdUg1OUtTSFY4dmdBIF95NzVIOWUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeTc1SDlPLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3k3NUg4LS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5UaGUgV29yayBPcmRlciBjbGFzcyBkZWZpbmVzIHByZWRlY2Vzc29yIGFuZCBzdWNjZXNzb3IgcmVsYXRpb25zIGFtb25nc3QgQnJlYWtkb3duIEVsZW1lbnRzLiAgVGhpcyBhc3NvY2lhdGlvbiBsaW5rcyBhIFdvcmsgQnJlYWtkb3duIEVsZW1lbnQgdG8gaXRzIHN1Y2Nlc3NvciBXb3JrIEJyZWFrZG93biBFbGVtZW50LjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iX3k3NUg5ZS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9ImxpbmtUb1N1Y2Nlc3NvciIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeTd2V3F1LXNFZHVINTlLU0hWOHZnQSIgYXNzb2NpYXRpb249Il95NzVIOC0tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeTc1SDl1LXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeTc1SDktLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3k3NUgtTy1zRWR1SDU5S1NIVjh2Z0EiIG1lbWJlckVuZD0iX3k3NUgtdS1zRWR1SDU5S1NIVjh2Z0EgX3k3dlhOZS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95NzVILWUtc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeTc1SC1PLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PlRoaXMgYXNzb2NpYXRpb24gbGlua3MgYSBXb3JrIEJyZWFrZG93biBFbGVtZW50IHRvIGl0cyBwcmVkZWNlc3Nvci4gIEV2ZXJ5IFdvcmsgQnJlYWtkb3duIEVsZW1lbnQgY2FuIGhhdmUgcHJlZGVjZXNzb3IgaW5mb3JtYXRpb24gYXNzb2NpYXRlZCB0byBpdC4gIFNwZWNpZmljIHByZWRlY2Vzc29yIGluZm9ybWF0aW9uIGlzIHN0b3JlZCBpbiBpbnN0YW5jZXMgb2YgdGhlIGNsYXNzIFdvcmsgT3JkZXIsIHdoaWNoIGRlZmluZXMgdGhlIGtpbmQgb2YgcHJlZGVjZXNzb3IgYW5vdGhlciBXb3JrIEJyZWFrZG93biBFbGVtZW50IHJlcHJlc2VudHMgZm9yIGFub3RoZXIuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfeTc1SC11LXNFZHVINTlLU0hWOHZnQSIgbmFtZT0ic3VjYyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeTd2WEtlLXNFZHVINTlLU0hWOHZnQSIgYXNzb2NpYXRpb249Il95NzVILU8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeTc1SC0tLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjEiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeTc1SF9PLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjEiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il95LTRLTU8tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJEZWxpdmVyeVByb2Nlc3MiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95LTRLTWUtc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeS00S01PLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PkEgRGVsaXZlcnkgUHJvY2Vzc2VzIGlzIGEgc3BlY2lhbCBQcm9jZXNzIGRlc2NyaWJpbmcgYSBjb21wbGV0ZSBhbmQgaW50ZWdyYXRlZCBhcHByb2FjaCBmb3IgcGVyZm9ybWluZyBhIHNwZWNpZmljIHByb2plY3QgdHlwZS4gIEl0IGRlc2NyaWJlcyBhIGNvbXBsZXRlIHByb2plY3QgbGlmZWN5Y2xlIGVuZC10by1lbmQgYW5kIHNoYWxsIGJlIHVzZWQgYXMgYSByZWZlcmVuY2UgZm9yIHJ1bm5pbmcgcHJvamVjdHMgd2l0aCBzaW1pbGFyIGNoYXJhY3RlcmlzdGljcyBhcyBkZWZpbmVkIGZvciB0aGUgcHJvY2Vzcy4gIEEgRGVsaXZlcnkgUHJvY2VzcyBpcyByZWxhdGVkIHRvIHNwZWNpZmljIHN1cHBvcnRpbmcgaW5mb3JtYXRpb24gc3VjaCBhcyBSb2FkbWFwcyAoaW5oZXJpdGVkIHZpYSBBY3Rpdml0eSkgYXMgd2VsbCBhcyBDb21tdW5pY2F0aW9ucyBhbmQgRWR1Y2F0aW9uIE1hdGVyaWFsLgotQSBEZWxpdmVyeSBQcm9jZXNzIGlzIGEgUHJvY2VzcyB0aGF0IGNvdmVycyBhIHdob2xlIGRldmVsb3BtZW50IGxpZmVjeWNsZSBmcm9tIGJlZ2lubmluZyB0byBlbmQuICBBIERlbGl2ZXJ5IFByb2Nlc3Mgc2hhbGwgYmUgdXNlZCBhcyBhIHRlbXBsYXRlIGZvciBwbGFubmluZyBhbmQgcnVubmluZyBhIHByb2plY3QuICBJdCBwcm92aWRlcyBhIGNvbXBsZXRlIGxpZmVjeWNsZSBtb2RlbCB3aXRoIHByZWRlZmluZWQgcGhhc2VzLCBpdGVyYXRpb25zLCBhbmQgYWN0aXZpdGllcyB0aGF0IGhhdmUgYmVlbiBkZXRhaWxlZCBieSBzZXF1ZW5jaW5nIHJlZmVyZW5jaW5nIG1ldGhvZCBjb250ZW50IGluIGJyZWFrZG93biBzdHJ1Y3R1cmVzLiAgSXQgaXMgZGVmaW5lZCBvbiB0aGUgYmFzaXMgb2YgZXhwZXJpZW5jZSB3aXRoIHBhc3QgcHJvamVjdHMgb3IgZW5nYWdlbWVudHMsIGFuZC9vciB0aGUgYmVzdCBwcmFjdGljZSB1c2Ugb2YgYSBkZXZlbG9wbWVudCBvciBkZWxpdmVyeSBhcHByb2FjaC4gIEl0IGRlZmluZXMgd2hhdCBnZXRzIHByb2R1Y2VkLCBob3cgdGhvc2UgaXRlbXMgYXJlIHByb2R1Y2VkLCBhbmQgdGhlIHJlcXVpcmVkIHN0YWZmaW5nIGluIHRoZSBmb3JtIG9mIGludGVncmF0ZWQgV29yaywgV29yayBQcm9kdWN0LCBhbmQgVGVhbSBCcmVha2Rvd24gU3RydWN0dXJlcy4gIEZvciBleGFtcGxlLCBhIHByb2Nlc3MgZW5naW5lZXIgY2FuIGRlZmluZSBhbHRlcm5hdGl2ZSBEZWxpdmVyeSBQcm9jZXNzZXMgZm9yIHNvZnR3YXJlIGRldmVsb3BtZW50IHByb2plY3RzIHRoYXQgZGlmZmVyIGluIHRoZSBzY2FsZSBvZiB0aGUgZW5nYWdlbWVudCBhbmQgc3RhZmZpbmcgbmVjZXNzYXJ5LCB0aGUgdHlwZSBvZiB0aGUgc29mdHdhcmUgYXBwbGljYXRpb24gdG8gYmUgZGV2ZWxvcGVkLCB0aGUgZGV2ZWxvcG1lbnQgbWV0aG9kcyBhbmQgdGVjaG5vbG9naWVzIHRvIGJlIHVzZWQsIGV0Yy4gIEFsdGhvdWdoLCB0aGUgRGVsaXZlcnkgUHJvY2VzcyBhaW1zIHRvIGNvdmVyIGEgd2hvbGUgcHJvamVjdCBpdCBrZWVwcyBjZXJ0YWluIGRlY2lzaW9uIHRoYXQgYXJlIHRvbyBwcm9qZWN0IHNwZWNpZmljIG9wZW4uICBGb3IgZXhhbXBsZSwgdGhlIGJyZWFrZG93biBzdHJ1Y3R1cmUgZGVmaW5lcyB3aGljaCBCcmVha2Rvd24gRWxlbWVudHMgaGF2ZSBtdWx0aXBsZSBvY2N1cnJlbmNlcyBvciBpcyByZXBlYXRhYmxlIHZpYSBpdCByZXNwZWN0aXZlIGF0dHJpYnV0ZXMsIGJ1dCBkb2VzIG5vdCBzYXkgaG93IG1hbnkgb2NjdXJyZW5jZXMgYW5kIGhvdyBtYW55IHJlcGVhdHMvaXRlcmF0aW9ucyBpdCB3aWxsIGhhdmUuICBUaGVzZSBkZWNpc2lvbnMgaGF2ZSB0byBiZSBkb25lIGJ5IGEgcHJvamVjdCBtYW5hZ2VyIHdoZW4gcGxhbm5pbmcgYSBjb25jcmV0ZSBwcm9qZWN0LCBwcm9qZWN0IHBoYXNlLCBvciBwcm9qZWN0IGl0ZXJhdGlvbnMuICBBIERlbGl2ZXJ5IFByb2Nlc3MgaXMgYWx3YXlzIGEgY29tcGxldGUgZGVzY3JpcHRpb24gb2YgYSBwcm9jZXNzIGluIHRlcm1zIG9mIGNvbXBsZXRlbmVzcyBvZiB0aGUgbGlmZWN5Y2xlLCBhcyB3ZWxsIGFzIGluIHRlcm1zIG9mIGFsbCB0aHJlZSB2aWV3cyBvbiB0aGUgcHJvY2VzcyB3aGljaCBhcmUgdGhlIFdvcmsgQnJlYWtkb3duIFN0cnVjdHVyZSwgV29yayBQcm9kdWN0IEJyZWFrZG93biBTdHJ1Y3R1cmUsIGFuZCBUZWFtIEJyZWFrZG93biBTdHJ1Y3R1cmUgaGF2ZSB0byBiZSBmdWxseSBhbmQgY29uc2lzdGVudGx5IHBvcHVsYXRlZC4gIENvbnNpc3RlbmN5IG9mIGEgRGVsaXZlcnkgUHJvY2VzcyBpcyBhY3R1YWxseSBlbnN1cmVkIGJ5IHRoZSBmYWN0IHRoYXQgYWxsIHRocmVlIGJyZWFrZG93bnMgYXJlIHJlcHJlc2VudGVkIGJ5IG9uZSBzaW5nbGUgZGF0YSBzdHJ1Y3R1cmUgYW5kIG9uZSBwYXJ0aWN1bGFyIGJyZWFrZG93biBzdWNoIGFzIFRlYW0gQnJlYWtkb3duIGlzIGp1c3QgYSB2aWV3IG9uIHRoYXQgZGF0YSBzdHJ1Y3R1cmUuCi08L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il95LTRLTXUtc0VkdUg1OUtTSFY4dmdBIiBnZW5lcmFsPSJfeS00S09lLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3ktNEtNLS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9ImVkdWNhdGlvbk1hdGVyaWFscyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXoxLTgtLXNFZHVINTlLU0hWOHZnQSIgYXNzb2NpYXRpb249Il95X0JVUE8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeS00S05PLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeS00S05lLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il95LTRLTnUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJjb21tdW5pY2F0aW9uc01hdGVyaWFscyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXoxLTgtLXNFZHVINTlLU0hWOHZnQSIgYXNzb2NpYXRpb249Il95X0JVUWUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeS00S04tLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeS00S09PLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3ktNEtQLS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9IlByb2Nlc3NQbGFubmluZ1RlbXBsYXRlIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeS00S1FPLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3ktNEtQLS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5BIFByb2Nlc3MgUGxhbm5pbmcgVGVtcGxhdGUgaXMgYSBzcGVjaWFsIFByb2Nlc3MgdGhhdCBpcyBwcmVwYXJlZCBmb3IgaW5zdGFudGlhdGlvbiBieSBhIHByb2plY3QgcGxhbm5pbmcgdG9vbC4gIFR5cGljYWxseSwgaXQgaXMgY3JlYXRlZCBiYXNlZCBvbiBhIFByb2Nlc3Mgc3VjaCBhcyBhIERlbGl2ZXJ5IFByb2Nlc3MgYXMgYSB3aG9sZSAoZS5nLiBpbiBjYXNlIG9mIGEgd2F0ZXJmYWxsLWJhc2VkIGRldmVsb3BtZW50IGFwcHJvYWNoKSBvciBpbiBwYXJ0cyAoZS5nLiBpbiBjYXNlIG9mIGFuIGl0ZXJhdGl2ZSBkZXZlbG9wbWVudCBhcHByb2FjaCkuCi1BIFByb2Nlc3MgUGxhbm5pbmcgVGVtcGxhdGUgcmVwcmVzZW50cyBhIHBhcnRpYWxseSBmaW5pc2hlZCBwbGFuIGZvciBhIGNvbmNyZXRlIHByb2plY3QuICBJdCB1c2VzIHRoZSBzYW1lIGluZm9ybWF0aW9uIHN0cnVjdHVyZXMgYXMgYWxsIG90aGVyIFByb2Nlc3MgVHlwZXMgdG8gcmVwcmVzZW50IHRlbXBsYXRlcyBmb3IgcHJvamVjdCBwbGFucy4gIEhvd2V2ZXIsIGNlcnRhaW4gcGxhbm5pbmcgZGVjaXNpb25zIGhhdmUgYWxyZWFkeSBiZWVuIGFwcGxpZWQgdG8gdGhlIHRlbXBsYXRlIGFzIHdlbGwgYXMgaW5mb3JtYXRpb24gaGFzIGJlZW4gcmVtb3ZlZCBhbmQvb3IgcmVmb3JtYXR0ZWQgdG8gYmUgcmVhZHkgZm9yIGV4cG9ydCB0byBhIHNwZWNpZmljIHBsYW5uaW5nIHRvb2wuICBFeGFtcGxlcyBmb3Igc3VjaCBkZWNpc2lvbnMgYXJlOiBhIHRlbXBsYXRlIGhhcyBiZWVuIGNyZWF0ZWQgdG8gcmVwcmVzZW50IGEgcGxhbiBmb3IgYSBwYXJ0aWN1bGFyIEl0ZXJhdGlvbiBpbiBhbiBpdGVyYXRpdmUgZGV2ZWxvcG1lbnQgcHJvamVjdCwgd2hpY2ggZnIgZXhhbXBsZSBkaXN0aW5ndWlzaGVzIGVhcmx5IGZyb20gbGF0ZSBpdGVyYXRpb25zIGluIHRoZSBFbGFib3JhdGlvbiBwaGFzZSBvZiBhIHByb2plY3Q7IGlmIHRoZSB0YXJnZXRlZCBwbGFubmluZyB0b29sIGNhbm5vdCByZXByZXNlbnQgaW5wdXQgYW5kIG91dHB1dCBvZiBUYXNrLCB0aGVuIHRoZXNlIGhhdmUgYmVlbiByZW1vdmVkIGZyb20gdGhlIHN0cnVjdHVyZTsgY2VydGFpbiByZXBldGl0aW9ucyBoYXZlIGJlZW4gYWxyZWFkeSBhcHBsaWVkLCBlLmcuIHN0YXRpbmcgdGhhdCBhIGN5Y2xlIG9mIHNwZWNpZmljIFRhc2sgZ3JvdXBlZCBpbiBhbiBBY3Rpdml0eSBoYXZlIHRvIGJlIHJlcGVhdGVkIG4tdGltZXM7IGV0Yy4KLTwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3ktNEtRZS1zRWR1SDU5S1NIVjh2Z0EiIGdlbmVyYWw9Il95LTRLT2Utc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfeS00S1F1LXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iYmFzZWRPblByb2Nlc3NlcyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeS00S09lLXNFZHVINTlLU0hWOHZnQSIgYXNzb2NpYXRpb249Il95X0JVTC0tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeS00S1EtLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeS00S1JPLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3ktNEtSZS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9IlJvYWRtYXAiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95LTRLUnUtc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeS00S1JlLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PkEgUm9hZG1hcCBpcyBhIHNwZWNpYWwgR3VpZGFuY2UgVHlwZSB3aGljaCBpcyBvbmx5IHJlbGF0ZWQgdG8gQWN0aXZhdGVzIGFuZCB0aGVyZWZvcmUgaGFzIGJlZW4gYWRkZWQgYnkgdGhpcyBwYWNrYWdlIHRvIHRoZSBsaXN0IG9mIEd1aWRhbmNlIFR5cGVzIHJhdGhlciB0aGFuIGxpc3RlZCBpbiB0aGUgR3VpZGFuY2UgVHlwZXMgcGFja2FnZS4gIEEgUm9hZG1hcCByZXByZXNlbnRzIGEgbGluZWFyIHdhbGt0aHJvdWdoIG9mIGFuIEFjdGl2aXR5LCB0eXBpY2FsbHkgYSBQcm9jZXNzLgotQW4gaW5zdGFuY2Ugb2YgYSBSb2FkbWFwIHJlcHJlc2VudHMgaW1wb3J0YW50IGRvY3VtZW50YXRpb24gZm9yIHRoZSBBY3Rpdml0eSBvciBQcm9jZXNzIGl0IGlzIHJlbGF0ZWQgdG8uICBPZnRlbiBhIGNvbXBsZXggQWN0aXZpdHkgc3VjaCBhcyBhIFByb2Nlc3MgY2FuIGJlIG11Y2ggZWFzaWVyIHVuZGVyc3Rvb2QgYnkgcHJvdmlkaW5nIGEgd2Fsa3Rocm91Z2ggd2l0aCBhIGxpbmVhciB0aHJlYWQgb2YgYSB0eXBpY2FsIGluc3RhbnRpYXRpb24gb2YgdGhpcyBBY3Rpdml0eS4gIEluIGFkZGl0aW9uIHRvIG1ha2luZyB0aGUgcHJvY2VzcyBwcmFjdGl0aW9uZXIgdW5kZXJzdGFuZCBob3cgd29yayBpbiB0aGUgcHJvY2VzcyBpcyBiZWluZyBwZXJmb3JtZWQsIGEgUm9hZG1hcCBwcm92aWRlcyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGFib3V0IGhvdyBBY3Rpdml0aWVzIGFuZCBUYXNrcyByZWxhdGUgdG8gZWFjaCBvdGhlciBvdmVyIHRpbWUuICBSb2FkbWFwcyBhcmUgYWxzbyB1c2VkIHRvIHNob3cgaG93IHNwZWNpZmljIGFzcGVjdHMgYXJlIGRpc3RyaWJ1dGVkIG92ZXIgYSB3aG9sZSBwcm9jZXNzIHByb3ZpZGluZyBhIGtpbmQgb2YgZmlsdGVyIG9uIHRoZSBwcm9jZXNzIGZvciB0aGlzIGluZm9ybWF0aW9uLgotPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfeS00S1ItLXNFZHVINTlLU0hWOHZnQSIgZ2VuZXJhbD0iX3l5emRNLS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3kyT2tnTy1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9IkRpc2NpcGxpbmUiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95Mk9rZ2Utc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeTJPa2dPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PkEgRGlzY2lwbGluZSBpcyBhIGNhdGVnb3JpemF0aW9uIG9mIHdvcmsgKGkuZS4gVGFza3MgZm9yIE1ldGhvZCBDb250ZW50KSwgYmFzZWQgdXBvbiBzaW1pbGFyaXR5IG9mIGNvbmNlcm5zIGFuZCBjb29wZXJhdGlvbiBvZiB3b3JrIGVmZm9ydC4KLUEgZGlzY2lwbGluZSBpcyBhIGNvbGxlY3Rpb24gb2YgVGFza3MgdGhhdCBhcmUgcmVsYXRlZCB0byBhIG1ham9yICdhcmVhIG9mIGNvbmNlcm4nIHdpdGhpbiB0aGUgb3ZlcmFsbCBwcm9qZWN0LiBUaGUgZ3JvdXBpbmcgb2YgVGFza3MgaW50byBkaXNjaXBsaW5lcyBpcyBtYWlubHkgYW4gYWlkIHRvIHVuZGVyc3RhbmRpbmcgdGhlIHByb2plY3QgZnJvbSBhICd0cmFkaXRpb25hbCcgd2F0ZXJmYWxsIHBlcnNwZWN0aXZlLiBIb3dldmVyLCB0eXBpY2FsbHksIGZvciBleGFtcGxlLCBpdCBpcyBtb3JlIGNvbW1vbiB0byBwZXJmb3JtIGNlcnRhaW4gcmVxdWlyZW1lbnRzIGFjdGl2aXRpZXMgaW4gY2xvc2UgY29vcmRpbmF0aW9uIHdpdGggYW5hbHlzaXMgYW5kIGRlc2lnbiBhY3Rpdml0aWVzLiBTZXBhcmF0aW5nIHRoZXNlIGFjdGl2aXRpZXMgaW50byBzZXBhcmF0ZSBkaXNjaXBsaW5lcyBtYWtlcyB0aGUgYWN0aXZpdGllcyBlYXNpZXIgdG8gY29tcHJlaGVuZC4KLTwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95X0JVSU8tc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeTJPa2dPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PkRpc2NpcGxpbmUgaXMgYSBjYXRlZ29yaXphdGlvbiBvZiBUYXNrcyBiYXNlZCB1cG9uIHNpbWlsYXJpdHkgb2YgY29uY2VybnMgYW5kIGNvb3BlcmF0aW9uIG9mIHdvcmsgZWZmb3J0LiAgVGhpcyBpcyB0aGUgZXh0ZW5zaW9ucyBvZiBEaXNjaXBsaW5lIGRlZmluZWQgaW4gdGhlIE1ldGhvZCBDb3JlIHBhY2thZ2UgYWRkaW5nIGFuIGFkZGl0aW9uYWwgYXNzb2NpYXRpb24gdG8gQWN0aXZpdGllcywgd2hpY2ggcmVwcmVzZW50IHR5cGljYWwgc3RhbmRhcmQgb3IgcmVmZXJlbmNlIHdheXMgb2YgbWVhbmluZ2Z1bCBncm91cGluZ3Mgb2YgdGhlIERpc2NpcGxpbmUncyBUYXNrcyBpbnRvIHdvcmtmbG93cy4KLVRhc2tzIHJlcHJlc2VudCBkZXNjcmlwdGlvbnMgb2Ygd29yaywgd2hpY2ggYXJlIGNhdGVnb3JpemVkIGJ5IERpc2NpcGxpbmVzLiAgVGhlIHJlYXNvbiB0aGF0IHNldmVyYWwgVGFza3MgYXJlIGFsbCBjYXRlZ29yaXplZCBieSB0aGUgc2FtZSBEaXNjaXBsaW5lIGlzIHRoYXQgdGhleSBhbGwgcmVwcmVzZW50IGEgcGFydCBpbiBhY2hpZXZpbmcgYSBoaWdoZXIgZ29hbCBvciBwZXJmb3JtaW5nIHdvcmsgdGhhdCBpcyBhbGwgcmVsYXRlZCB0byBlYWNoIG90aGVyLiAgRXZlcnkgRGlzY2lwbGluZSBkZWZpbmVzIHN0YW5kYXJkIHdheXMgb2YgZG9pbmcgdGhlIHdvcmsgaXQgY2F0ZWdvcml6ZXMuICBTdWNoIHN0YW5kYXJkIHdheXMgYXJlIGV4cHJlc3MgYnkgQWN0aXZpdGllcyBvciBDYXBhYmlsaXR5IFBhdHRlcm5zIGRlZmluaW5nIGhvdyB0aGUgVGFza3MgY2F0ZWdvcml6ZWQgYnkgdGhlIERpc2NpcGxpbmUgJ3dvcmsgdG9nZXRoZXInIGluIHRoZSBtb3N0IGdlbmVyaWMgd2F5LiAgVGhlc2UgcmVmZXJlbmNlIHdvcmtmbG93cyBhcmUgb2Z0ZW4gdXNlZCBmb3IgZWR1Y2F0aW5nIGFuZCB0ZWFjaGluZyBwcmFjdGl0aW9uZXJzLiAKLTwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3kyT2tndS1zRWR1SDU5S1NIVjh2Z0EiIGdlbmVyYWw9Il95Mk9rbnUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfeTJPa2ctLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0idGFza3MiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l5emRHdS1zRWR1SDU5S1NIVjh2Z0EiIGFzc29jaWF0aW9uPSJfeTJPazUtLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3kyT2toTy1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3kyT2toZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfeTJPa2h1LXNFZHVINTlLU0hWOHZnQSIgbmFtZT0ic3ViZGlzY2lwbGluZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeTJPa2dPLXNFZHVINTlLU0hWOHZnQSIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgYXNzb2NpYXRpb249Il95Mk9rN08tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeTJPa2gtLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeTJPa2lPLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il95X0JVSWUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJyZWZlcmVuY2VXb3JrZmxvd3MiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3k3bU1zTy1zRWR1SDU5S1NIVjh2Z0EiIGFzc29jaWF0aW9uPSJfeV9CVVNPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3lfQlVJdS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3lfQlVJLS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il95ejEtXy0tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJQcmFjdGljZSI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3l6MV9BTy1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95ejEtXy0tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+QSBQcmFjdGljZSByZXByZXNlbnRzIGEgcHJvdmVuIHdheSBvciBzdHJhdGVneSBvZiBkb2luZyB3b3JrIHRvIGFjaGlldmUgYSBnb2FsIHRoYXQgaGFzIGEgcG9zaXRpdmUgaW1wYWN0IG9uIHdvcmsgcHJvZHVjdCBvciBwcm9jZXNzIHF1YWxpdHkuICBQcmFjdGljZXMgYXJlIGRlZmluZWQgb3J0aG9nb25hbCB0byBtZXRob2RzIGFuZCBwcm9jZXNzZXMuICBUaGV5IGNvdWxkIHN1bW1hcml6ZSBhc3BlY3RzIHRoYXQgaW1wYWN0IG1hbnkgZGlmZmVyZW50IHBhcnRzIG9mIGEgbWV0aG9kIG9yIHNwZWNpZmljIHByb2Nlc3Nlcy4gIEV4YW1wbGVzIGZvciBwcmFjdGljZXMgd291bGQgYmUgJnF1b3Q7TWFuYWdlIFJpc2tzJnF1b3Q7LCAmcXVvdDtDb250aW51b3VzbHkgdmVyaWZ5IHF1YWxpdHkmcXVvdDssICZxdW90O0FyY2hpdGVjdHVyZS1jZW50cmljIGFuZCBjb21wb25lbnQtYmFzZWQgZGV2ZWxvcG1lbnQmcXVvdDssIGV0Yy4KLTwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3l6MV9BZS1zRWR1SDU5S1NIVjh2Z0EiIGdlbmVyYWw9Il95eXpkTS0tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfeXoxX0F1LXNFZHVINTlLU0hWOHZnQSIgbmFtZT0ic3ViUHJhY3RpY2VzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95ejEtXy0tc0VkdUg1OUtTSFY4dmdBIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBhc3NvY2lhdGlvbj0iX3l6X3dLdS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95ejFfQS0tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95ejFfQk8tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3l6MV9CZS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9ImNvbnRlbnRSZWZlcmVuY2VzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95eHc3Vk8tc0VkdUg1OUtTSFY4dmdBIiBhc3NvY2lhdGlvbj0iX3kwSmc0Ty1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95ejFfQnUtc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95ejFfQi0tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3lfQlVKTy1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9ImFjdGl2aXR5UmVmZXJlbmNlcyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeTdtTXNPLXNFZHVINTlLU0hWOHZnQSIgYXNzb2NpYXRpb249Il95X0JVVGUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeV9CVUplLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeV9CVUp1LXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3lfQlVKLS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9IkNhcGFiaWxpdHlQYXR0ZXJuIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeV9CVUtPLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3lfQlVKLS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5BIENhcGFiaWxpdHkgUGF0dGVybiBpcyBhIHNwZWNpYWwgUHJvY2VzcyB0aGF0IGRlc2NyaWJlcyBhIHJldXNhYmxlIGNsdXN0ZXIgb2YgZG9pbmcgd29yayBpbiBjb21tb24gcHJvY2VzcyBhcmVhcy4gIENhcGFiaWxpdGllcyBQYXR0ZXJucyBleHByZXNzIGFuZCBjb21tdW5pY2F0ZSBwcm9jZXNzIGtub3dsZWRnZSBmb3IgYSBrZXkgYXJlYSBvZiBpbnRlcmVzdCBzdWNoIGFzIGEgRGlzY2lwbGluZSBhbmQgY2FuIGJlIGRpcmVjdGx5IHVzZWQgYnkgcHJvY2VzcyBwcmFjdGl0aW9uZXIgdG8gZ3VpZGUgaGlzIHdvcmsuICBUaGV5IGFyZSBhbHNvIHVzZWQgYXMgYnVpbGRpbmcgYmxvY2tzIHRvIGFzc2VtYmxlIERlbGl2ZXJ5IFByb2Nlc3NlcyBvciBsYXJnZXIgQ2FwYWJpbGl0eSBQYXR0ZXJucyBlbnN1cmluZyBvcHRpbWFsIHJldXNlIGFuZCBhcHBsaWNhdGlvbiBvZiB0aGUga2V5IHByYWN0aWNlcyB0aGV5IGV4cHJlc3MuCi1BIENhcGFiaWxpdHkgUGF0dGVybiBpcyBhIHNwZWNpYWwgUHJvY2VzcyB0aGF0IGRlc2NyaWJlcyBhIHJldXNhYmxlIGNsdXN0ZXIgb2YgZG9pbmcgd29yayBpbiBhIGdlbmVyYWwgcHJvY2VzcyBhcmVhIHRoYXQgcHJvdmlkZXMgYSBjb25zaXN0ZW50IGRldmVsb3BtZW50IGFwcHJvYWNoIHRvIGNvbW1vbiBwcm9ibGVtcy4gIEV4YW1wbGVzIGZvciBDYXBhYmlsaXR5IFBhdHRlcm4gY291bGQgYmUgJ3VzZSBjYXNlLWJhc2VkIHJlcXVpcmVtZW50cyBtYW5hZ2VtZW50JywgJ3VzZSBjYXNlIGFuYWx5c2lzJywgb3IgJ3VuaXQgdGVzdGluZycuIFR5cGljYWxseSBidXQgbm90IG5lY2Vzc2FyaWx5LCBDYXBhYmlsaXR5IFBhdHRlcm5zIGhhdmUgdGhlIHNjb3BlIG9mIG9uZSBkaXNjaXBsaW5lIHByb3ZpZGluZyBhIGJyZWFrZG93biBvZiByZXVzYWJsZSBjb21wbGV4IEFjdGl2aXRpZXMsIHJlbGF0aW9uc2hpcHMgdG8gdGhlIFJvbGVzIHdoaWNoIHBlcmZvcm0gVGFza3Mgd2l0aGluIHRoZXNlIEFjdGl2aXRpZXMsIGFzIHdlbGwgYXMgdG8gdGhlIFdvcmsgUHJvZHVjdHMgdGhhdCBhcmUgdXNlZCBhbmQgcHJvZHVjZWQuICBBIGNhcGFiaWxpdHkgcGF0dGVybiBkb2VzIG5vdCByZWxhdGUgdG8gYW55IHNwZWNpZmljIHBoYXNlIG9yIGl0ZXJhdGlvbiBvZiBhIGRldmVsb3BtZW50IGxpZmVjeWNsZSwgYW5kIHNob3VsZCBub3QgaW1wbHkgYW55LiAgSW4gb3RoZXIgd29yZHMsIGEgcGF0dGVybiBzaG91bGQgYmUgZGVzaWduZWQgaW4gYSB3YXkgdGhhdCBpdCBpcyBhcHBsaWNhYmxlIGFueXdoZXJlIGluIGEgRGVsaXZlcnkgUHJvY2Vzcy4gIFRoaXMgZW5hYmxlcyBpdHMgQWN0aXZpdGllcyB0byBiZSBmbGV4aWJseSBhc3NpZ25lZCB0byB3aGF0ZXZlciBwaGFzZXMgdGhlcmUgYXJlIGluIHRoZSBEZWxpdmVyeSBQcm9jZXNzIHRvIHdoaWNoIGl0IGlzIGJlaW5nIGFwcGxpZWQuICBJdCBpcyBhIGdvb2QgcHJhY3RpY2UgdG8gZGVzaWduIGEgQ2FwYWJpbGl0eSBQYXR0ZXJuIHRvIHByb2R1Y2Ugb25lIG9yIG1vcmUgZ2VuZXJpYyBEZWxpdmVyYWJsZXMuICBUaGUgdHlwaWNhbCBjb25maWd1cmF0aW9uIGlzIHRoYXQgZWFjaCBBY3Rpdml0eSBpbiB0aGUgQ2FwYWJpbGl0eSBQYXR0ZXJuIHByb2R1Y2VzIG9uZSBEZWxpdmVyYWJsZSwgYW5kIHRoZSBsYXN0IFRhc2sgRGVzY3JpcHRvciBpbiB0aGUgQWN0aXZpdHkgZXhwbGljaXRseSBvdXRwdXRzIGp1c3QgdGhpcyBEZWxpdmVyYWJsZS4gIFRoaXMgZW5hYmxlcyB0aGUgcHJvY2VzcyBlbmdpbmVlciB0byBzZWxlY3QgUGF0dGVybnMgb3IganVzdCBBY3Rpdml0aWVzIGJ5IGRlY2lkaW5nIHdoaWNoIERlbGl2ZXJhYmxlcyBhcmUgcmVxdWlyZWQuICBJdCBhbHNvIG9mZmVycyBhIHNpbXBsZSBpbnRlZ3JhdGlvbiBhcHByb2FjaDogYW4gQWN0aXZpdHkgZnJvbSBhIGNhcGFiaWxpdHkgcGF0dGVybiBpcyBsaW5rZWQgdG8gdGhlIFBoYXNlIG9yIEl0ZXJhdGlvbiB3aGljaCBpcyByZXF1aXJlZCB0byBwcm9kdWNlIHRoZSBBY3Rpdml0eSdzIERlbGl2ZXJhYmxlLiAgS2V5IGFwcGxpY2F0aW9ucyBhcmVhcyBvZiAvIGFyZWFzIG9mIHJldXNlIGZvciBDYXBhYmlsaXR5IFBhdHRlcm5zIGFyZToKLS0gVG8gc2VydmUgYXMgYnVpbGRpbmcgYmxvY2tzIGZvciBhc3NlbWJsaW5nIERlbGl2ZXJ5IFByb2Nlc3NlcyBvciBsYXJnZXIgQ2FwYWJpbGl0eSBQYXR0ZXJucy4gIE5vcm1hbGx5IGRldmVsb3BpbmcgYSBEZWxpdmVyeSBQcm9jZXNzIGlzIG5vdCBkb25lIGZyb20gc2NyYXRjaCBidXQgYnkgc3lzdGVtYXRpY2FsbHkgYXBwbHlpbmcgYW5kIGJpbmRpbmcgcGF0dGVybnMuICBJbiBhZGRpdGlvbiB0byB0aGUgc3RhbmRhcmQgcGF0dGVybiBhcHBsaWNhdGlvbiBvZiAnY29weS1hbmQtbW9kaWZ5Jywgd2hpY2ggYWxsb3dzIHRoZSBwcm9jZXNzIGVuZ2luZWVyIHRvIGluZGl2aWR1YWxseSBjdXN0b21pemUgdGhlIHBhdHRlcm4ncyBjb250ZW50IHRvIHRoZSBwYXJ0aWN1bGFyIHNpdHVhdGlvbiBpdCBpcyBhcHBsaWVkIGZvciwgdGhlIFBsdWdpbiBtZXRhLW1vZGVsIHBhY2thZ2UgKFNlY3Rpb24gNi4xKSBpbnRyb2R1Y2VzIGV2ZW4gbW9yZSBzb3BoaXN0aWNhdGVkIGluaGVyaXRhbmNlIHJlbGF0aW9uc2hpcHMgdGhhdCBzdXBwb3J0IGR5bmFtaWMgYmluZGluZyBvZiBwYXR0ZXJucyAoaS5lLiB0aGUgcGF0dGVybiBpcyByZWZlcmVuY2VkIGFuZCBub3QgY29waWVkKS4gIFRoaXMgdW5pcXVlIG5ldyB3YXkgb2YgcmV1c2luZyBwcm9jZXNzIGtub3dsZWRnZSBhbGxvd3MgdG8gZmFjdG9yIG91dCBjb21tb25seSByZW9jY3VycmluZyBBY3Rpdml0aWVzIGludG8gcGF0dGVybnMgYW5kIHRvIGFwcGx5IHRoZW0gb3ZlciBhbmQgb3ZlciBhZ2FpbiBmb3IgYSBwcm9jZXNzLiAgV2hlbiB0aGUgcGF0dGVybiBpcyBiZWluZyByZXZpc2VkIG9yIHVwZGF0ZWQsIGFsbCBjaGFuZ2VzIHdpbGwgYmUgYXV0b21hdGljYWxseSByZWZsZWN0ZWQgaW4gYWxsIHBhdHRlcm4gYXBwbGljYXRpb24gaW4gYWxsIHByb2Nlc3NlcyBiZWNhdXNlIG9mIHRoZSBkeW5hbWljIGJpbmRpbmcuCi0tIFRvIHN1cHBvcnQgZGlyZWN0IGV4ZWN1dGlvbiBpbiBhIGRldmVsb3BtZW50IHByb2plY3QgdGhhdCBkb2VzIG5vdCB3b3JrIGZvbGxvd2luZyBhIHdlbGwtZGVmaW5lZCBwcm9jZXNzLCBidXQgd29ya3MgYmFzZWQgb24gbG9vc2VseSBjb25uZWN0ZWQgcHJvY2VzcyBmcmFnbWVudHMgb2YgYmVzdCBwcmFjdGljZXMgaW4gYSBmbGV4aWJsZSBtYW5uZXIgKGUuZy4gQWdpbGUgRGV2ZWxvcG1lbnQpLgotLSBUbyBzdXBwb3J0IHByb2Nlc3MgZWR1Y2F0aW9uIGJ5IGRlc2NyaWJpbmcga25vd2xlZGdlIGZvciBhIGtleSBhcmVhIHN1Y2ggYXMgYmVzdCBwcmFjdGljZXMgb24gaG93IHRvIHBlcmZvcm0gdGhlIHdvcmsgZm9yIGEgRGlzY2lwbGluZSAoZS5nLiBSZXF1aXJlbWVudHMgTWFuYWdlbWVudCksIGZvciBhIHNwZWNpZmljIGRldmVsb3BtZW50IHRlY2huaXF1ZSAoYXNwZWN0LW9yaWVudGVkIGRldmVsb3BtZW50KSwgb3IgYSBzcGVjaWZpYyB0ZWNobmljYWwgYXJlYSAoZS5nLiByZWxhdGlvbmFsIGRhdGFiYXNlIGRlc2lnbiksIHdoaWNoIGlzIHVzZWQgZm9yIGVkdWNhdGlvbiBhbmQgdGVhY2hpbmcuCi08L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il95X0JVS2Utc0VkdUg1OUtTSFY4dmdBIiBnZW5lcmFsPSJfeS00S09lLXNFZHVINTlLU0hWOHZnQSIvPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfeV9CVUt1LXNFZHVINTlLU0hWOHZnQSIgbWVtYmVyRW5kPSJfeS00S1BPLXNFZHVINTlLU0hWOHZnQSBfeV9CVUxPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3lfQlVLLS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95X0JVS3Utc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+VGhpcyBhc3NvY2lhdGlvbiBwcm92aWRlcyB0cmFjZWFiaWxpdHkgZm9yIGEgUHJvY2VzcyBkb2N1bWVudGluZyB3aGljaCBDYXBhYmlsaXR5IFBhdHRlcm5zIGhhdmUgYmVlbiB1c2VkIGZvciBkZWZpbmluZyB0aGUgcHJvY2Vzcy4gIEl0IGRvY3VtZW50cyBhcHBsaWNhdGlvbnMgb2YgYSBwYXR0ZXJuIHRocm91Z2ggY29weSBhcyB3ZWxsIGFzIHBhdHRlcm4gYmluZGluZy48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il95X0JVTE8tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJfcHJvY2VzcyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeS00S09lLXNFZHVINTlLU0hWOHZnQSIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iX3lfQlVLdS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95X0JVTGUtc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95X0JVTHUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkRW5kPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfeV9CVUwtLXNFZHVINTlLU0hWOHZnQSIgbWVtYmVyRW5kPSJfeS00S1F1LXNFZHVINTlLU0hWOHZnQSBfeV9CVU1lLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3lfQlVNTy1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95X0JVTC0tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+SWYgdGhlIFBsYW4gaGFzIGJlZW4gY3JlYXRlZCBiYXNlZCBvbiBvbmUgb3IgbW9yZSBwcm9jZXNzZXMgKGkuZS4gb3RoZXIgUGxhbnMsIENhcGFiaWxpdHkgUGF0dGVybnMsIGEgRGVsaXZlcnkgUHJvY2Vzcywgb3IgYW55IGNvbWJpbmF0aW9uIG9mIHRoZXNlKSwgdGhlbiB0aGlzIGFzc29jaWF0aW9uIGNhcHR1cmVzIGEgdHJhY2UgYmFjayB0byB0aGVzZSBzb3VyY2VzLjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iX3lfQlVNZS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9Il9wcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeS00S1AtLXNFZHVINTlLU0hWOHZnQSIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iX3lfQlVMLS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95X0JVTXUtc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95X0JVTS0tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkRW5kPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfeV9CVU5PLXNFZHVINTlLU0hWOHZnQSIgbWVtYmVyRW5kPSJfeTd2VzFPLXNFZHVINTlLU0hWOHZnQSBfeV9CVU51LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3lfQlVOZS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95X0JVTk8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+VGhlIFBsYW5uaW5nRGF0YSBjbGFzcyBmYWN0b3JzIG91dCBzcGVjaWZpYyBvcHRpb25hbCBkYXRhIG5lZWRlZCBmb3IgcmVwcmVzZW50aW5nIHBsYW5uaW5nIHRlbXBsYXRlcy4gIFRoaXMgYXNzb2NpYXRpb24gYWxsb3dzIHRvIGFjY2VzcyBwbGFubmluZyBkYXRhIGlmIGl0IGlzIHN0b3JlZCBmb3IgdGhlIEJyZWFrZG93biBFbGVtZW50LjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iX3lfQlVOdS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9Il9icmVha2Rvd25FbGVtZW50IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95N3ZXdk8tc0VkdUg1OUtTSFY4dmdBIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfeV9CVU5PLXNFZHVINTlLU0hWOHZnQSIvPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfeV9CVU4tLXNFZHVINTlLU0hWOHZnQSIgbWVtYmVyRW5kPSJfeS00S1NlLXNFZHVINTlLU0hWOHZnQSBfeV9CVU9lLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3lfQlVPTy1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95X0JVTi0tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+VGhpcyBhc3NvY2lhdGlvbiBsaW5rcyBhbiBBY3Rpdml0eSB0byB6ZXJvIG9yIG1vcmVzIGluc3RhbmNlcyBvZiB0aGUgUm9hZG1hcCBndWlkYW5jZSB0eXBlLjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iX3lfQlVPZS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9ImFjdGl2aXR5IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95N21Nc08tc0VkdUg1OUtTSFY4dmdBIiBhc3NvY2lhdGlvbj0iX3lfQlVOLS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95X0JVT3Utc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iMSIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95X0JVTy0tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iMSIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3lfQlVQTy1zRWR1SDU5S1NIVjh2Z0EiIG1lbWJlckVuZD0iX3lfQlVQdS1zRWR1SDU5S1NIVjh2Z0EgX3ktNEtNLS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95X0JVUGUtc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeV9CVVBPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PlRoaXMgYXNzb2NpYXRpb24gZGVmaW5lcyBhIGNvbGxlY3Rpb24gb2YgZ3VpZGFuY2UgZG9jdW1lbnRzIHRoYXQgcHJvdmlkZSBlZHVjYXRpb24gbWF0ZXJpYWwgZm9yIHRlYWNoaW5nIHN0YWtlaG9sZGVycyBzdWNoIGFzIHByb2plY3QgbWFuYWdlcnMgb24gaG93IHRvIHBlcmZvcm0gcHJvamVjdHMgdGhhdCBmb2xsb3cgdGhpcyBEZWxpdmVyeSBQcm9jZXNzLjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iX3lfQlVQdS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9Il9kZWxpdmVyeVByb2Nlc3MiIHZpc2liaWxpdHk9InByaXZhdGUiIHR5cGU9Il95LTRLTU8tc0VkdUg1OUtTSFY4dmdBIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfeV9CVVBPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3lfQlVQLS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3lfQlVRTy1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il95X0JVUWUtc0VkdUg1OUtTSFY4dmdBIiBtZW1iZXJFbmQ9Il95X0JVUS0tc0VkdUg1OUtTSFY4dmdBIF95LTRLTnUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeV9CVVF1LXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3lfQlVRZS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5UaGlzIGFzc29jaWF0aW9uIGRlZmluZXMgYSBjb2xsZWN0aW9uIG9mIGd1aWRhbmNlIGRvY3VtZW50cyB0aGF0IGhhdmUgYmVlbiByZWxhdGVkIHRvIGEgRGVsaXZlcnkgUHJvY2VzcyBpbnN0YW5jZSB0byBkZXNjcmliZSBhbmQgY2hhcmFjdGVyaXplIGl0cyBmZWF0dXJlcyBhbmQgY2FwYWJpbGl0aWVzLiBUaGVzZSBkb2N1bWVudHMgY2FuIGJlIHVzZWQgZm9yIHNldmVyYWwgcHVycG9zZXMgc3VjaCBhcyBpbnRlcm5hbCBtYXJrZXRpbmcgY29tbXVuaWNhdGlvbnMsIHNhbGVzIHRyYWluaW5nIGFuZCBnZW5lcmFsIG1ldGhvZCBlZHVjYXRpb24uICBFeGFtcGxlcyBmb3IgQ29tbXVuaWNhdGlvbnMgTWF0ZXJpYWwgYXJlIEhpZ2hsaWdodCBEb2N1bWVudCwgRmFjdCBTaGVldCwgYW5kIERlbGl2ZXJ5IFByb2Nlc3MgU3BlY2lmaWNhdGlvbiBPdmVydmlldy48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il95X0JVUS0tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJfZGVsaXZlcnlQcm9jZXNzIiB2aXNpYmlsaXR5PSJwcml2YXRlIiB0eXBlPSJfeS00S01PLXNFZHVINTlLU0hWOHZnQSIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iX3lfQlVRZS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95X0JVUk8tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95X0JVUmUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkRW5kPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfeV9CVVJ1LXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iQnJlYWtkb3duTmVzdGluZyIgbWVtYmVyRW5kPSJfeTd2VzEtLXNFZHVINTlLU0hWOHZnQSBfeTdtTXRPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3lfQlVSLS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95X0JVUnUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+VGhpcyBiaWRpcmVjdGlvbmFsIGFzc29jaWF0aW9uIHJlcHJlc2VudHMgYnJlYWtkb3duIHN0cnVjdHVyZSBuZXN0aW5nLiAgSXQgZGVmaW5lcyBhbiBuLWxldmVsIGhpZXJhcmNoeSBvZiBBY3Rpdml0aWVzIGdyb3VwaW5nIHRvZ2V0aGVyIG90aGVyIEJyZWFrZG93biBFbGVtZW50cyBzdWNoIGFzIG90aGVyIEFjdGl2aXRpZXMsIERlc2NyaXB0b3JzLCBNaWxlc3RvbmVzLCBldGMuCi1UaGUgc3VwZXJBY3Rpdml0aWVzIHJvbGUgYWxsb3dzIG5hdmlnYXRpb24gb2YgYSBCcmVha2Rvd24gRWxlbWVudCB0byBpcyBwYXJlbnQgQWN0aXZpdHkuIFRoZSBicmVha2Rvd25FbGVtZW50cyByb2xlIGFsbG93cyBuYXZpZ2F0aW9uIGZyb20gYW4gQWN0aXZpdHkgdG8gaXRzIG5lc3RlZCBCcmVha2Rvd24gRWxlbWVudHMuCi08L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3lfQlVTTy1zRWR1SDU5S1NIVjh2Z0EiIG1lbWJlckVuZD0iX3lfQlVJZS1zRWR1SDU5S1NIVjh2Z0EgX3lfQlVTdS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95X0JVU2Utc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeV9CVVNPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PlRoaXMgYXNzb2NpYXRpb24gcHJvdmlkZXMgb25lIG1vcmUgcmVmZXJlbmNlIHdvcmtmbG93cyBmb3IgYSBEaXNjaXBsaW5lLiAgVGhlIHJlZmVyZW5jZSB3b3JrZmxvd3MgZGVmaW5lIHRoZSBtb3N0IHR5cGljYWwgd2F5cyBvZiBkb2luZyB0aGUgd29yayBvZiBhIERpc2NpcGxpbmUuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfeV9CVVN1LXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iX2Rpc2NpcGxpbmUiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3kyT2tnTy1zRWR1SDU5S1NIVjh2Z0EiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il95X0JVU08tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeV9CVVMtLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeV9CVVRPLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3lfQlVUZS1zRWR1SDU5S1NIVjh2Z0EiIG1lbWJlckVuZD0iX3lfQlVKTy1zRWR1SDU5S1NIVjh2Z0EgX3lfQlVUdS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iX3lfQlVUdS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9Il9wcmFjdGljZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXoxLV8tLXNFZHVINTlLU0hWOHZnQSIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iX3lfQlVUZS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95X0JVVC0tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95X0JVVU8tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkRW5kPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfeV9CVVVlLXNFZHVINTlLU0hWOHZnQSIgbWVtYmVyRW5kPSJfeS00S1RPLXNFZHVINTlLU0hWOHZnQSBfeV9CVVUtLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3lfQlVVdS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95X0JVVWUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+VGhpcyBhc3NvY2lhdGlvbiBjYW4gYmUgdXNlZCB0byBsaW5rIGFsbCBraW5kcyBvZiBnZW5lcmFsIGd1aWRhbmNlIHRvIHRoZSBBY3Rpdml0eSB0aGF0IGlzIGJlaW5nIG1hbmFnZWQgYXMgZ2VuZXJhbCBTdXBwb3J0aW5nIE1hdGVyaWFsLjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iX3lfQlVVLS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9Il9hY3Rpdml0eSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeTdtTXNPLXNFZHVINTlLU0hWOHZnQSIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iX3lfQlVVZS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95X0JVVk8tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95X0JVVmUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkRW5kPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfeV9CVVZ1LXNFZHVINTlLU0hWOHZnQSIgbWVtYmVyRW5kPSJfeS00S1QtLXNFZHVINTlLU0hWOHZnQSBfeV9CVVdPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3lfQlVWLS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95X0JVVnUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+VGhpcyBhc3NvY2lhdGlvbiBwcm92aWRlcyBBY3Rpdml0eS0gKG9yIFByb2Nlc3MtKSBzcGVjaWZpYyBjaGVjayBwb2ludHMuICBUaGVzZSBhcmUgdHlwaWNhbGx5IHVzZWQgaW4gcmV2aWV3cyBhbmQgaW5zcGVjdGlvbnMgb24gdGhlIHdvcmsgcGVyZm9ybWVkLjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iX3lfQlVXTy1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9Il9hY3Rpdml0eSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeTdtTXNPLXNFZHVINTlLU0hWOHZnQSIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iX3lfQlVWdS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95X0JVV2Utc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95X0JVV3Utc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkRW5kPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfeV9CVVctLXNFZHVINTlLU0hWOHZnQSIgbWVtYmVyRW5kPSJfeS00S1V1LXNFZHVINTlLU0hWOHZnQSBfeV9CVVhlLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3lfQlVYTy1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95X0JVVy0tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+VGhpcyBhc3NvY2lhdGlvbiByZWxhdGVzIGNvbmNlcHRzIG9yIHdoaXRlcGFwZXJzIHRvIHRoZSBBY3Rpdml0eSBwcm92aWRpbmcgaW1wb3J0YW50IGJhY2tncm91bmQgaW5mb3JtYXRpb24gbmVjZXNzYXJ5IGZvciBkb2luZyB0aGUgd29yayBkZXNjcmliZWQgYnkgdGhlIEFjdGl2aXR5LjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iX3lfQlVYZS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9Il9hY3Rpdml0eSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeTdtTXNPLXNFZHVINTlLU0hWOHZnQSIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iX3lfQlVXLS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95X0JVWHUtc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95X0JVWC0tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkRW5kPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfeV9CVVlPLXNFZHVINTlLU0hWOHZnQSIgbWVtYmVyRW5kPSJfeS00S1ZlLXNFZHVINTlLU0hWOHZnQSBfeV9CVVl1LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3lfQlVZZS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95X0JVWU8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+VGhpcyBhc3NvY2lhdGlvbiBjYW4gcHJvdmlkZSByZWZlcmVuY2VzIHRvIGV4YW1wbGVzIHJlbGV2YW50IHRvIHRoaXMgc3BlY2lmaWMgQWN0aXZpdHkgKG9yIFByb2Nlc3MpLiAgPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfeV9CVVl1LXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iX2FjdGl2aXR5IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95N21Nc08tc0VkdUg1OUtTSFY4dmdBIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfeV9CVVlPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3lfQlVZLS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3lfQlVaTy1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il95X0JVWmUtc0VkdUg1OUtTSFY4dmdBIiBtZW1iZXJFbmQ9Il95LTRLV08tc0VkdUg1OUtTSFY4dmdBIF95X0JVWi0tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeV9CVVp1LXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3lfQlVaZS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5UaGlzIGFzc29jaWF0aW9uIHByb3ZpZGVzIEFjdGl2aXR5LXNwZWNpZmljIEd1aWRlbGluZXMuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfeV9CVVotLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iX2FjdGl2aXR5IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95N21Nc08tc0VkdUg1OUtTSFY4dmdBIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfeV9CVVplLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3lfQlVhTy1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3lfQlVhZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il95X0JVYXUtc0VkdUg1OUtTSFY4dmdBIiBtZW1iZXJFbmQ9Il95LTRLVy0tc0VkdUg1OUtTSFY4dmdBIF95X0JVYk8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeV9CVWEtLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3lfQlVhdS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5UaGlzIGFzc29jaWF0aW9uIHJlZmVycyB0byBSZXVzYWJsZSBBc3NldHMgc3BlY2lmaWMgdG8gdGhpcyBBY3Rpdml0eSAob3IgUHJvY2VzcykuIDwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iX3lfQlViTy1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9Il9hY3Rpdml0eSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeTdtTXNPLXNFZHVINTlLU0hWOHZnQSIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iX3lfQlVhdS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3pCWjV3Ty1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9IkJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbiI+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfekJaNXdlLXNFZHVINTlLU0hWOHZnQSIgZ2VuZXJhbD0iX3l4dzdWLS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il96Qlo1d3Utc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJ1c2FnZUd1aWRhbmNlIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95eFVQYU8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il96Qlo1dy0tc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfekJaNXd1LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgICAgPGJvZHk+UHJvdmlkZXMgaW5mb3JtYXRpb24gYW5kIGd1aWRhbmNlIG9uIHRoZSBtZWFuaW5nIG9mIHRoZSBCb29sZWFuIGZsYWcgdmFsdWVzIGFuZCB1bmRlciB3aGF0IGNpcmN1bXN0YW5jZXMgdGhleSBzaG91bGQgYmUgb3ZlcnJpZGRlbi4gRm9yIGV4YW1wbGUsIGl0IGRlc2NyaWJlcyB3aHkgdGhlIGJyZWFrZG93biBlbGVtZW50IGlzIG9wdGlvbmFsIG9yIGNvbnNpZGVyYXRpb25zIGZvciByZXBlYXRpbmcgaXQgYW5kIGRpZmZlcmVuY2VzIGluIHRoZSBpbmRpdmlkdWFsIG9jY3VycmVuY2VzIG9mIHRoaXMgQnJlYWtkb3duIEVsZW1lbnQgYWNyb3NzIHRoZSBsaWZlY3ljbGUuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfekJaNXhPLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjEiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfekJaNXhlLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfekJaNXh1LXNFZHVINTlLU0hWOHZnQSIgdHlwZT0iX3l4VVBhTy1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il96Qlo1eC0tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJBY3Rpdml0eURlc2NyaXB0aW9uIj4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il96Qlo1eU8tc0VkdUg1OUtTSFY4dmdBIiBnZW5lcmFsPSJfekJaNXdPLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3pCWjV5ZS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9InB1cnBvc2UiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l4VVBhTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3pCWjV5dS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il96Qlo1eWUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgICA8Ym9keT5TdW1tYXJpemVzIHRoZSBtYWluIHJlYXNvbiBmb3IgcGVyZm9ybWluZyB0aGlzIEFjdGl2aXR5LCBkZXNjcmliZXMgd2hhdCB0aGUgYWN0aXZpdHkgYXMgYSB3aG9sZSBpcyBpbnRlbmRlZCB0byBhY2hpZXZlLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3pCWjV5LS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIxIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3pCWjV6Ty1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iX3pCWjV6ZS1zRWR1SDU5S1NIVjh2Z0EiIHR5cGU9Il95eFVQYU8tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3pCWjV6dS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9ImFsdGVybmF0aXZlcyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXhVUGFPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfekJaNXotLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3pCWjV6dS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICAgIDxib2R5PkNvbXByaXNlcyBvZiBzdW1tYXJpZXMgZGVzY3JpYmluZyBpbXBvcnRhbnQgZXhjZXB0aW9uYWwgYW5kIG5vbi1zdGFuZGFyZCB3YXlzIG9mIGRvaW5nIHRoZSB3b3JrIG9mIHRoaXMgQWN0aXZpdHkgbm90IGNvdmVyZWQgYnkgdGhlIEFjdGl2aXR5J3MgVGFza3MuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfekJaNTBPLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjEiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfekJaNTBlLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfekJaNTB1LXNFZHVINTlLU0hWOHZnQSIgdHlwZT0iX3l4VVBhTy1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfekJaNTAtLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iaG93dG9TdGFmZiIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXhVUGFPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfekJaNTFPLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3pCWjUwLS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICAgIDxib2R5PlByb3ZpZGVzIGJhY2tncm91bmQgb24gd2hvIHNob3VsZCBiZSBpbnZvbHZlZCBpbiB0aGlzIGFjdGl2aXR5IHdoYXQgYXJlIHRoZSByZXF1aXJlZCBza2lsbHMsIGV4cGVyaWVuY2UsICBhbmQgcGVyaGFwcyBhdHRpdHVkZXMuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfekJaNTFlLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjEiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfekJaNTF1LXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfekJaNTEtLXNFZHVINTlLU0hWOHZnQSIgdHlwZT0iX3l4VVBhTy1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il96Qlo1Mk8tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJEZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbiI+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfekJaNTJlLXNFZHVINTlLU0hWOHZnQSIgZ2VuZXJhbD0iX3pCWjUtTy1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il96Qlo1MnUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJzY2FsZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXhVUGFPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfekJaNTItLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3pCWjUydS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICAgIDxib2R5Pk91dGxpbmVzIGNoYXJhY3RlcmlzdGljcyBhYm91dCB0aGUgc2l6ZSBvZiBhIHR5cGljYWwgcHJvamVjdCB0aGF0IHBlcmZvcm1zIHRoaXMgcHJvamVjdCBleHByZXNzZWQgaW4gdGVhbSBzaXplLCBtYW4geWVhcnMsIGV0Yy48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il96Qlo1M08tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iMSIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il96Qlo1M2Utc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il96Qlo1M3Utc0VkdUg1OUtTSFY4dmdBIiB0eXBlPSJfeXhVUGFPLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IiIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il96Qlo1My0tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJwcm9qZWN0Q2hhcmFjdGVyaXN0aWNzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95eFVQYU8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il96Qlo1NE8tc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfekJaNTMtLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgICAgPGJvZHk+Q2hhcmFjdGVyaXplcyB0aGUgcHJvamVjdCB0aGF0IHdvdWxkIHR5cGljYWxseSBwZXJmb3JtIHRoaXMgUHJvY2VzczwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3pCWjU0ZS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIxIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3pCWjU0dS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iX3pCWjU0LS1zRWR1SDU5S1NIVjh2Z0EiIHR5cGU9Il95eFVQYU8tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3pCWjU1Ty1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9InJpc2tMZXZlbCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXhVUGFPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfekJaNTVlLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3pCWjU1Ty1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICAgIDxib2R5Pk91dGxpbmVzIHR5cGljYWwgcHJvamVjdCByaXNrcyB0aGF0IGFyZSBhZGRyZXNzZWQgd2l0aCB0aGlzIHByb2Nlc3MuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfekJaNTV1LXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjEiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfekJaNTUtLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfekJaNTZPLXNFZHVINTlLU0hWOHZnQSIgdHlwZT0iX3l4VVBhTy1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfekJaNTZlLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iZXN0aW1hdGluZ1RlY2huaXF1ZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXhVUGFPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfekJaNTZ1LXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3pCWjU2ZS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICAgIDxib2R5PkRlc2NyaWJlcyB0aGUgRXN0aW1hdGlvbiBUZWNobmlxdWVzIHByb3ZpZGVkIGZvciB0aGlzIFByb2Nlc3MuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfekJaNTYtLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjEiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfekJaNTdPLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfekJaNTdlLXNFZHVINTlLU0hWOHZnQSIgdHlwZT0iX3l4VVBhTy1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfekJaNTd1LXNFZHVINTlLU0hWOHZnQSIgbmFtZT0icHJvamVjdE1lbWJlckV4cGVydGlzZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXhVUGFPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfekJaNTctLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3pCWjU3dS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICAgIDxib2R5PlByb3ZpZGVzIGEgcHJvZmlsZSBvZiBhIHR5cGljYWwgcHJvamVjdCB0ZWFtLCB0aGUgZGlzdHJpYnV0aW9uIG9mIHJvbGVzLCBza2lsbHMgcmVxdWlyZWQgZm9yIGEgdGVhbSBwZXJmb3JtcyBhIHByb2plY3QgYmFzZWQgb24gdGhpcyBwcm9jZXNzLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3pCWjU4Ty1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIxIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3pCWjU4ZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iX3pCWjU4dS1zRWR1SDU5S1NIVjh2Z0EiIHR5cGU9Il95eFVQYU8tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3pCWjU4LS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9InR5cGVPZkNvbnRyYWN0IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95eFVQYU8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il96Qlo1OU8tc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfekJaNTgtLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgICAgPGJvZHk+UHJvdmlkZXMgYmFja2dyb3VuZCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY29udHJhY3RzIHRoYXQgbmVlZCB0byBiZSBlc3RhYmxpc2hlZCBiZXR3ZWVuIGEgcHJvamVjdCB0ZWFtIHRoYXQgcGVyZm9ybXMgdGhpcyBwcm9jZXNzIGFuZCBhIGNsaWVudCAoZS5nLiBmb3IgYW4gSUdTIGVuZ2FnZW1lbnQpLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3pCWjU5ZS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIxIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3pCWjU5dS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iX3pCWjU5LS1zRWR1SDU5S1NIVjh2Z0EiIHR5cGU9Il95eFVQYU8tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfekJaNS1PLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iUHJvY2Vzc0Rlc2NyaXB0aW9uIj4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il96Qlo1LWUtc0VkdUg1OUtTSFY4dmdBIiBnZW5lcmFsPSJfekJaNXgtLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3pCWjUtdS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9InNjb3BlIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95eFVQYU8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il96Qlo1LS0tc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfekJaNS11LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgICAgPGJvZHk+RGVmaW5lcyB0aGUgc2NvcGUgb2YgdGhlIFByb2Nlc3MsIGkuZS4gd2hpY2ggdHlwZXMgb2YgcHJvamVjdHMgZG9lcyBpdCBhZGRyZXNzIGFuZCB3aGljaCBub3QuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfekJaNV9PLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjEiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfekJaNV9lLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfekJaNV91LXNFZHVINTlLU0hWOHZnQSIgdHlwZT0iX3l4VVBhTy1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfekJaNV8tLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0idXNhZ2VOb3RlcyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXhVUGFPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfekJaNkFPLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3pCWjVfLS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICAgIDxib2R5PkFueSBhZGRpdGlvbmFsIG5vdGVzIG9uIGhvdyB0byBhcHBseSBhbmQgaW5zdGFudGlhdGUgdGhpcyBwcm9jZXNzIGZvciBhIHByb2plY3QuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfekJaNkFlLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjEiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfekJaNkF1LXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfekJaNkEtLXNFZHVINTlLU0hWOHZnQSIgdHlwZT0iX3l4VVBhTy1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il96Qlo2Qk8tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJEZXNjcmlwdG9yRGVzY3JpcHRpb24iPgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3pCWjZCZS1zRWR1SDU5S1NIVjh2Z0EiIGdlbmVyYWw9Il96Qlo1d08tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfekJaNkJ1LXNFZHVINTlLU0hWOHZnQSIgbmFtZT0icmVmaW5lZERlc2NyaXB0aW9uIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95eFVQYU8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il96Qlo2Qi0tc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfekJaNkJ1LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgICAgPGJvZHk+QSBEZXNjcmlwdG9yIG1pZ2h0IGFkZCByZWZpbmVtZW50cyB0byB0aGUgbWFpbiBkZXNjcmlwdGlvbiBvZiB0aGUgQ29udGVudCBFbGVtZW50IGl0IHJlZmVycyB0by4gIEZvciBleGFtcGxlLCBpdCBjb3VsZCBwcm92aWRlIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gYWJvdXQgYSBXb3JrIFByb2R1Y3QgcmVsZXZhbnQgZm9yIHRoZSBzcGVjaWZpYyBwb2ludCBpbiB0aW1lIGluIHRoZSBwcm9jZXNzIHRoaXMgV29yayBQcm9kdWN0IHR5cGUgaXMgYmVpbmcgdXNlZC4gIEl0IGNvdWxkIGRlc2NyaWJlIGFkZGl0aW9uYWwgc2tpbGxzIG5lZWRlZCBmb3IgYSBSb2xlIGF0IHRoYXQgcGFydGljdWxhciBwb2ludCBpbiB0aW1lIGluIGEgcHJvY2VzcywgZXRjLiA8L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il96Qlo2Q08tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iMSIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il96Qlo2Q2Utc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il96Qlo2Q3Utc0VkdUg1OUtTSFY4dmdBIiB0eXBlPSJfeXhVUGFPLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IiIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3pCWjZDLS1zRWR1SDU5S1NIVjh2Z0EiIG1lbWJlckVuZD0iX3k3dlhCLS1zRWR1SDU5S1NIVjh2Z0EgX3pCWjZEZS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il96Qlo2RE8tc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfekJaNkMtLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5Pkxpc3QgdGhlIHN0ZXBzIHRoYXQgaGF2ZSBiZWVuIHNlbGVjdGVkIHRvIGJlIHBlcmZvcm1lZCBmb3IgdGhlIGluc3RhbmNlIG9mIHRoZSBUYXNrIERlc2NyaXB0b3IuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfekJaNkRlLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iX3Rhc2tEZXNjcmlwdG9yIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95N3ZXNi0tc0VkdUg1OUtTSFY4dmdBIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfekJaNkMtLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3pCWjZEdS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3pCWjZELS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il96RHBWZS0tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJQcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvciI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3pEcFZmTy1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il96RHBWZS0tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+QSBQcm9jZXNzIENvbXBvbmVudCBEZXNjcmlwdG9yIHJlcHJlc2VudHMgYSBQcm9jZXNzIENvbXBvbmVudCBhcHBsaWNhdGlvbiBpbiBhIFByb2Nlc3MsIGkuZS4gdGhlIGJyZWFrZG93biBzdHJ1Y3R1cmUgZGVmaW5pbmcgdGhlIFByb2Nlc3MuICBUaGUgUHJvY2VzcyBDb21wb25lbnQgRGVzY3JpcHRvciBpcyB1c2VkIHRvIGVuY2Fwc3VsYXRlIHRoZSBkZXRhaWxzIG9mIHRoZSBjb21wb25lbnQgaW4gYSBicmVha2Rvd24gc3RydWN0dXJlIGFuZCB0byBwcm92aWRlIGl0cyBvd24gc2V0IG9mIHJlbGF0aW9uc2hpcHMgc3VjaCBhcyBpdCBvd24gcHJlZGVjZXNzb3JzIGFuZCBzdWNjZXNzb3JzLjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3pEcFZmZS1zRWR1SDU5S1NIVjh2Z0EiIGdlbmVyYWw9Il95N3ZXMnUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfekRwVmZ1LXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iX3Byb2Nlc3NDb21wb25lbnQiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3pEcFZjTy1zRWR1SDU5S1NIVjh2Z0EiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il96RHBWbi0tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfekRwVmYtLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjEiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfekRwVmdPLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjEiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il96RHBWZ2Utc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfekRwVmd1LXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3pEcFZnZS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5BIFByb2Nlc3MgQ29tcG9uZW50IEludGVyZmFjZSBjb21wcmlzZXMgb2YgYSBsaXN0IG9mIGludGVyZmFjZSBzcGVjaWZpY2F0aW9ucyAoc2ltaWxhciB0byBvcGVyYXRpb24gZGVjbGFyYXRpb25zKSB0aGF0IGV4cHJlc3MgaW5wdXRzIGFuZCBvdXRwdXRzIGZvciBhIHByb2Nlc3MgY29tcG9uZW50LiAgVGhlc2UgaW50ZXJmYWNlIHNwZWNpZmljYXRpb25zIGFyZSBleHByZXNzZWQgdXNpbmcgVGFzayBEZXNjcmlwdG9ycyB3aGljaCBhcmUgbm90IGxpbmtlZCB0byBUYXNrcyB0aGF0IGFyZSByZWxhdGVkIHRvIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9ycyBhcyB3ZWxsIGFzIG9wdGlvbmFsIGEgUm9sZSBEZXNjcmlwdG9yLjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3pEcFZnLS1zRWR1SDU5S1NIVjh2Z0EiIGdlbmVyYWw9Il95N3ZXdk8tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfekRwVmhPLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iaW50ZXJmYWNlU3BlY2lmaWNhdGlvbnMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3k3dlc2LS1zRWR1SDU5S1NIVjh2Z0EiIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiIGFzc29jaWF0aW9uPSJfekRwVmxlLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3pEcFZoZS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3pEcFZodS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfekRwVmgtLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iaW50ZXJmYWNlSU8iIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3k3dlhDdS1zRWR1SDU5S1NIVjh2Z0EiIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiIGFzc29jaWF0aW9uPSJfekRwVm11LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3pEcFZpTy1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3pEcFZpZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il96RHBWa08tc0VkdUg1OUtTSFY4dmdBIiBtZW1iZXJFbmQ9Il96RHBWa3Utc0VkdUg1OUtTSFY4dmdBIF96RHBWZGUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfekRwVmtlLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3pEcFZrTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5UaGlzIGFzc29jaWF0aW9uIGRlc2NyaWJlcyB0aGUgcmVhbGl6YXRpb24gcmVsYXRpb25zaGlwcyBiZXR3ZWVuIGEgUHJvY2VzcyBDb21wb25lbnQgYW5kIGEgUHJvY2VzcyBDb21wb25lbnQgSW50ZXJmYWNlLjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iX3pEcFZrdS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9InJlYWxpemVkQnkiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3pEcFZjTy1zRWR1SDU5S1NIVjh2Z0EiIGFzc29jaWF0aW9uPSJfekRwVmtPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3pEcFZrLS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3pEcFZsTy1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il96RHBWbGUtc0VkdUg1OUtTSFY4dmdBIiBtZW1iZXJFbmQ9Il96RHBWbC0tc0VkdUg1OUtTSFY4dmdBIF96RHBWaE8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfekRwVmx1LXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3pEcFZsZS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5JbnN0YW5jZXMgb2YgdGhpcyBhc3NvY2lhdGlvbiBjb250YWluIHRoZSBsaXN0IG9mIFRhc2sgRGVzY3JpcHRvcnMgdGhhdCByZXByZXNlbnQgYSBQcm9jZXNzIENvbXBvbmVudCBJbnRlcmZhY2UuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfekRwVmwtLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iX3Byb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UiIHZpc2liaWxpdHk9InByaXZhdGUiIHR5cGU9Il96RHBWZ2Utc0VkdUg1OUtTSFY4dmdBIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfekRwVmxlLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3pEcFZtTy1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIxIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3pEcFZtZS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIxIi8+Ci0gICAgICA8L293bmVkRW5kPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfekRwVm11LXNFZHVINTlLU0hWOHZnQSIgbWVtYmVyRW5kPSJfekRwVmgtLXNFZHVINTlLU0hWOHZnQSBfekRwVm5PLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3pEcFZtLS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il96RHBWbXUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+VGhpcyBhc3NvY2lhdGlvbiBjb250YWlucyB0aGUgaW5wdXQgYW5kIG91dHB1dCBXb3JrIFByb2R1Y3QgdHlwZSBpbnN0YW5jZXMgdXNlZCBmb3IgdGhlIGludGVyZmFjZSBzcGVjaWZpY2F0aW9uLjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iX3pEcFZuTy1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9Il9wcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il96RHBWZ2Utc0VkdUg1OUtTSFY4dmdBIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfekRwVm11LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3pEcFZuZS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIxIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3pEcFZudS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIxIi8+Ci0gICAgICA8L293bmVkRW5kPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfekRwVm4tLXNFZHVINTlLU0hWOHZnQSIgbWVtYmVyRW5kPSJfekRwVmZ1LXNFZHVINTlLU0hWOHZnQSBfekRwVm9lLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3pEcFZvTy1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il96RHBWbi0tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+VGhpcyBhc3NvY2lhdGlvbiByZXByZXNlbnRzIHRoZSByZWZlcmVuY2UgZnJvbSB0aGUgZGVzY3JpcHRvciB0byB0aGUgUHJvY2VzcyBDb21wb25lbnQgaXQgcmVmZXJzIHRvLiAgQSBQcm9jZXNzIENvbXBvbmVudCBEZXNjcmlwdG9yIHJlcHJlc2VudHMgZXhhY3RseSBvbmUgUHJvY2VzcyBDb21wb25lbnQuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfekRwVm9lLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iX3Byb2Nlc3NDb21wb25lbnREZXNjcmlwdG9yIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il96RHBWZS0tc0VkdUg1OUtTSFY4dmdBIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfekRwVm4tLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3pEcFZvdS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3pEcFZvLS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il96RHBWcE8tc0VkdUg1OUtTSFY4dmdBIiBtZW1iZXJFbmQ9Il96RHBWZU8tc0VkdUg1OUtTSFY4dmdBIF96RHBWcHUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfekRwVnBlLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3pEcFZwTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5BIFByb2Nlc3MgQ29tcG9uZW50IGNvbnRhaW5zIG9ubHkgZXhhY3RseSBvbmUgUHJvY2Vzcy48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il96RHBWcHUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJfcHJvY2Vzc0NvbXBvbmVudCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfekRwVmNPLXNFZHVINTlLU0hWOHZnQSIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iX3pEcFZwTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il96RHBWcC0tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iMSIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il96RHBWcU8tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iMSIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3pEcFZxZS1zRWR1SDU5S1NIVjh2Z0EiIG1lbWJlckVuZD0iX3pEcFZqZS1zRWR1SDU5S1NIVjh2Z0EgX3pEcFZxLS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il96RHBWcXUtc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfekRwVnFlLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PkEgUHJvY2VzcyBQYWNrYWdlIGNvbnRhaW5zIFByb2Nlc3MgRWxlbWVudHMgd2hpY2ggYXJlIHVzZWQgdG8gZGVmaW5lIEJyZWFrZG93biBhbmQgUHJvY2Vzc2VzLiAgQSBQcm9jZXNzIEVsZW1lbnQgaW5zdGFuY2UgY2FuIGJlIHBhcnQgb2Ygb25seSBvbmUgUHJvY2VzcyBQYWNrYWdlIGluc3RhbmNlLjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iX3pEcFZxLS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9Il9wcm9jZXNzUGFja2FnZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfekRwVml1LXNFZHVINTlLU0hWOHZnQSIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iX3pEcFZxZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3l4dzdWTy1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9IkNvbnRlbnRFbGVtZW50IiBpc0Fic3RyYWN0PSJ0cnVlIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeXh3N1ZlLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3l4dzdWTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5Db250ZW50IEVsZW1lbnQgaXMgYSBEZXNjcmliYWJsZSBFbGVtZW50IHRoYXQgcmVwcmVzZW50cyBhbiBhYnN0cmFjdCBnZW5lcmFsaXphdGlvbiBmb3IgYWxsIGVsZW1lbnRzIHRoYXQgYXJlIGNvbnNpZGVyZWQgdG8gYmUgYW5kIG1hbmFnZWQgYXMgTWV0aG9kIENvbnRlbnQuCi1Db250ZW50IEVsZW1lbnRzIHJlcHJlc2VudHMgcmV1c2FibGUgTWV0aG9kIENvbnRlbnQgdGhhdCBpcyBzdXBwb3NlZCB0byBiZSBtYW5hZ2VkIGluIENvbnRlbnQgUGFja2FnZXMuICBUaGUgc2VwYXJhdGlvbiBvZiBDb250ZW50IEVsZW1lbnQgZnJvbSBQcm9jZXNzIEVsZW1lbnQgYWxsb3dzIHRvIGNsZWFybHkgZGlzdGluZ3Vpc2ggYmV0d2VlbiBwdXJlIG1ldGhvZCBjb250ZW50IGZyb20gY29udGVudCB0aGF0IGlzIHJlcHJlc2VudGVkIGluIHByb2Nlc3Nlcy4KLTwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95el92NXUtc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeXh3N1ZPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PlRoaXMgaXMgdGhlIEd1aWRhbmNlIFR5cGVzIHBhY2thZ2UncyBleHRlbnNpb24gb2YgQ29udGVudCBFbGVtZW50IChkZWZpbmVkIGluIENvbnRlbnQgRWxlbWVudHMpIHByb3ZpZGluZyBhZGRpdG9uYWwgYXNzb2NpYXRpb25zLjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il96R0xGRE8tc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeXh3N1ZPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PkNvbnRlbnQgRWxlbWVudCBpbiB0aGUgcGFja2FnZSBNZXRob2QgUGx1Z2luIGluaGVyaXRzIGZyb20gVmFyaWFiaWxpdHkgRWxlbWVudCBhbmQgbm90IGRpcmVjdGx5IGZyb20gTWV0aG9kIEVsZW1lbnQgYW55bW9yZS4gIFRoaXMgaXMgYWNoaWV2ZWQgdXNpbmcgVU1MIDIuMCBwYWNrYWdlIG1lcmdlIHNlbWFudGljcy4gIE9ubHkgaWYgYW4gYWRvcHRlciBvZiB0aGlzIG1ldGEtbW9kZWwgZGVjaWRlcyB0byByZWFsaXplIE1ldGhvZCBQbHVnaW5zLCBoZSB3b3VsZCBnZXQgdGhlIHZhcmlhYmlsaXR5IGFuZCBleHRlbnNpb24gY2FwYWJpbGl0aWVzIGZvciBhbGwgQ29udGVudCBFbGVtZW50cy4KLUNvbnRlbnQgRWxlbWVudCBpbmhlcml0cyB0aGUgc2VtYW50aWNzIG9mIFZhcmlhYmlsaXR5IEVsZW1lbnQuCi08L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il95eHc3VnUtc0VkdUg1OUtTSFY4dmdBIiBnZW5lcmFsPSJfeXh3N2V1LXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3pHTEZEZS1zRWR1SDU5S1NIVjh2Z0EiIGdlbmVyYWw9Il96R0xGSk8tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfeXpfdjUtLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0ic3VwcG9ydGluZ01hdGVyaWFscyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXoxLTgtLXNFZHVINTlLU0hWOHZnQSIgYXNzb2NpYXRpb249Il95el93QXUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeXpfdjZPLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeXpfdjZlLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il95el92NnUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJjb25jZXB0c0FuZFBhcGVycyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXoxLTRlLXNFZHVINTlLU0hWOHZnQSIgYXNzb2NpYXRpb249Il95el93Qi0tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeXpfdjYtLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeXpfdjdPLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il95el92N2Utc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJjaGVja2xpc3RzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95ejEtNU8tc0VkdUg1OUtTSFY4dmdBIiBhc3NvY2lhdGlvbj0iX3l6X3dETy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95el92N3Utc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95el92Ny0tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3l6X3Y4Ty1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9Imd1aWRlbGluZXMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l6MS02dS1zRWR1SDU5S1NIVjh2Z0EiIGFzc29jaWF0aW9uPSJfeXpfd0VlLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3l6X3Y4ZS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3l6X3Y4dS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfeXpfdjgtLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iZXhhbXBsZXMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l6MS01LS1zRWR1SDU5S1NIVjh2Z0EiIGFzc29jaWF0aW9uPSJfeXpfd0ctLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3l6X3Y5Ty1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3l6X3Y5ZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfeXpfdjl1LXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iYXNzZXRzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95el92X08tc0VkdUg1OUtTSFY4dmdBIiBhc3NvY2lhdGlvbj0iX3kwSmc1ZS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95el92OS0tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95el92LU8tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3l6X3YtZS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9InRlcm1EZWZpbml0aW9uIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95ejEtX08tc0VkdUg1OUtTSFY4dmdBIiBhc3NvY2lhdGlvbj0iX3kwSmc5dS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95el92LXUtc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95el92LS0tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfeXh3N1FlLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iTWV0aG9kRWxlbWVudCIgaXNBYnN0cmFjdD0idHJ1ZSI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3l4dzdRdS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95eHc3UWUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+RXZlcnkgY2xhc3MgZGVmaW5lZCBpbiB0aGlzIHNwZWNpZmljYXRpb24gaXMgZGVyaXZlZCBmcm9tIE1ldGhvZCBFbGVtZW50LiAgSW4gb3RoZXIgd29yZHMgTWV0aG9kIEVsZW1lbnQgaXMgdGhlIHJvb3QgZ2VuZXJhbGl6YXRpb24gZm9yIGFsbCBVTUEgY2xhc3NlcyBhbmQgZGVmaW5lcyBhIGNvbW1vbiBzZXQgb2YgYXR0cmlidXRlcyBpbmhlcml0ZWQgYnkgZXZlcnkgb3RoZXIgZWxlbWVudCB0eXBlIG9mIHRoaXMgbW9kZWwuICBNZXRob2QgRWxlbWVudCBpdHNlbGYgaXMgZGVyaXZlZCBmcm9tIFBhY2thZ2VhYmxlIEVsZW1lbnQgZnJvbSB0aGUgVU1MIDIuMCBJbmZyYXN0cnVjdHVyZS4gIE1ldGhvZCBFbGVtZW50IGluaGVyaXRzIHRoZSBOYW1lIGF0dHJpYnV0ZSBmcm9tIFBhY2thZ2VhYmxlIEVsZW1lbnQncyBzdXBlciBjbGFzcy4gIEV2ZXJ5IGVsZW1lbnQgZGVmaW5lZCBhcyBhIFVNQSBpbnN0YW5jZSBpcyBkZXJpdmVkIGZyb20gTW9kZWwgRWxlbWVudC4gIEV2ZXJ5IE1ldGhvZCBFbGVtZW50IGluLXN0YW5jZSBpcyBhdCBsZWFzdCBkZWZpbmVkIGJ5IGEgdW5pcXVlIGlkLCBhIG5hbWUsIGFzIHdlbGwgYXMgYnJpZWYgZGVzY3JpcHRpb24uPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3pHTEZEdS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95eHc3UWUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+TWV0aG9kIEVsZW1lbnQgaW4gdGhlIHBhY2thZ2UgTWV0aG9kIFBsdWdpbiBhZGRzIGFkZGl0aW9uYWwgcHJvcGVydGllcyB2aWEgcGFja2FnZSBtZXJnZSB0byBNZXRob2QgRWxlbWVudCBkZWZpbmVkIGluIE1ldGhvZCBDb3JlIG5lZWRlZCBmb3IgdGhlIHZhcmlhYmlsaXR5IGFuZCBleHRlbnNpYmlsaXR5IGNhcGFiaWxpdGllcyBpbnRyb2R1Y2VzIGluIHRoaXMgcGFja2FnZS48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il95eHc3US0tc0VkdUg1OUtTSFY4dmdBIiBnZW5lcmFsPSJfeXhLZkZ1LXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3l4dzdSTy1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9Imd1aWQiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l4VVBhTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3l4dzdSZS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95eHc3Uk8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgICA8Ym9keT5FdmVyeSBpbnN0YW5jZSBvZiBNZXRob2QgRWxlbWVudCBoYXMgYSBnbG9iYWwgdW5pcXVlIGlkLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3l4dzdSdS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIxIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3l4dzdSLS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iX3l4dzdTTy1zRWR1SDU5S1NIVjh2Z0EiIHR5cGU9Il95eFVQYU8tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3l4dzdTZS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9ImJyaWVmRGVzY3JpcHRpb24iIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l4VVBhTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3l4dzdTdS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95eHc3U2Utc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgICA8Ym9keT5FdmVyeSBpbnN0YW5jZSBvZiBNZXRob2QgRWxlbWVudCBzaGFsbCBiZSBicmllZmx5IGRlc2NyaWJlZCB3aXRoIG9uZSBvciB0d28gc2VudGVuY2VzIHN1bW1hcml6aW5nIHRoZSBlbGVtZW50LjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3l4dzdTLS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIxIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3l4dzdUTy1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iX3l4dzdUZS1zRWR1SDU5S1NIVjh2Z0EiIHR5cGU9Il95eFVQYU8tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3l4dzdUdS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9Im93bmVkUnVsZXMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l4dzdjdS1zRWR1SDU5S1NIVjh2Z0EiIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiIGFzc29jaWF0aW9uPSJfeXh3N2pPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3l4dzdULS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3l4dzdVTy1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfeXh3N1VlLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0ibWV0aG9kRWxlbWVudFByb3BlcnR5IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95eHc3aHUtc0VkdUg1OUtTSFY4dmdBIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBhc3NvY2lhdGlvbj0iX3l4NkZNTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95eHc3VXUtc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95eHc3VS0tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3pHTEZELS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9InN1cHByZXNzZWQiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l4VVBidS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3pHTEZFTy1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il96R0xGRC0tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgICA8Ym9keT5JZiBhIFZhcmlhYmlsaXR5IEVsZW1lbnQgaXMgZGVyaXZlZCBmcm9tIGFub3RoZXIgVmFyaWFiaWxpdHkgRWxlbWVudCB1c2luZyB0aGUgRXh0ZW5kcyBWYXJpYWJpbGl0eSBTcGVjaWFsaXphdGlvbiB0aGVuIHRoaXMgYXR0cmlidXRlIGNhbiBiZSB1c2VkIHRvIHN1cHByZXNzIGluaGVyaXRlZCBNZXRob2QgRWxlbWVudHMgdGhhdCB3ZXJlIHBhcnQgb2YgdGhlIGJhc2VkLW9uIFZhcmlhYmlsaXR5IEVsZW1lbnQsIHdoaWNoIGNhbiBiZSBhbnkgdHlwZSBvZiBNZXRob2QgRWxlbWVudC4gIEluIG90aGVyIHdvcmRzLCBpZiB0aGlzIGF0dHJpYnV0ZSBpcyBzZXQgdG8gdHJ1ZSBvbiBhIE1ldGhvZCBFbGVtZW50IHRoYXQgaGFzIHRoZSBzYW1lIG5hbWUgdGhhbiBhbiBpbmhlcml0ZWQgbWV0aG9kIGVsZW1lbnQgdGhlbiBpdCB3aWxsIG5vdCBiZSByZWdhcmRlZCBhcyBpbmhlcml0ZWQgYXQgYWxsLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9Il96R0xGRWUtc0VkdUg1OUtTSFY4dmdBIiB0eXBlPSJfeXhVUGJ1LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgICAgPGJvZHk+ZmFsc2U8L2JvZHk+Ci0gICAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il96R0xGRXUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJvcmRlcmluZ0d1aWRlIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95eFVQYU8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il96R0xGRS0tc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfekdMRkV1LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgICAgPGJvZHk+VGhpcyBhdHRyaWJ1dGUgaXMgdXNlZCBmb3IgQ0FTRSB0b29sIHJlYWxpemF0aW9ucyBvZiB0aGlzIG1vZGVsIHRvIGNvbnRhaW4gaW5mb3JtYXRpb24gYWJvdXQgbGF5b3V0IGFuZCBvcmRlcmluZyBvZiB0aGUgbWV0aG9kIGVsZW1lbnQgYW5kIGl0cyBwYXJ0cy48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il96R0xGRk8tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iMSIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il96R0xGRmUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il96R0xGRnUtc0VkdUg1OUtTSFY4dmdBIiB0eXBlPSJfeXhVUGFPLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IiIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6RW51bWVyYXRpb24iIHhtaTppZD0iX3pHTEZGLS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9IlZhcmlhYmlsaXR5VHlwZSI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3pHTEZHTy1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il96R0xGRi0tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+VmFyaWFiaWxpdHkgVHlwZSBpcyBhbiBFbnVtZXJhdGlvbiB1c2VkIGZvciB2YWx1ZXMgZm9yIGluc3RhbmNlcyBvZiBWYXJpYWJpbGl0eSBFbGVtZW50J3MgYXR0cmlidXRlIHZhcmlhYmlsaXR5VHlwZS4gIEl0IGRlZmluZXMgdGhlIG5hdHVyZSBvZiBob3cgYSBWYXJpYWJpbGl0eSBFbGVtZW50IGV4dGVuZHMgYW5vdGhlciBWYXJpYWJpbGl0eSBFbGVtZW50LiBTZWUgZW51bWVyYXRpb24gbGl0ZXJhbHMgZm9yIGRlZmluaXRpb25zIGZvciBlYWNoIHR5cGUuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8b3duZWRMaXRlcmFsIHhtaTppZD0iX3pHTEZHZS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9Im5hIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il96R0xGR3Utc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfekdMRkdlLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgICAgPGJvZHk+VGhpcyBpcyB0aGUgZGVmYXVsdCAmcXVvdDtub3QgYXNzaWduZWQmcXVvdDsgdmFsdWUgb2YgYSBWYXJpYWJpbGxpdHkgRWxlbWVudCdzIHZhcmlhYmlsaXR5VHlwZSBhdHRyaWJ1dGUgd2hpY2ggaXMgc2V0IGluIHRoZSBjYXNlIG5vIHZhcmlhYmlsaXR5IGFzc29jaWF0aW9uIGlzIHByZXNlbnQgYmV0d2VlbiB0aGUgVmFyaWFiaWxpdHkgRWxlbWVudCBhbmQgb3RoZXIgVmFyaWFiaWxpdHkgRWxlbWVudHMuCi08L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPC9vd25lZExpdGVyYWw+Ci0gICAgICA8b3duZWRMaXRlcmFsIHhtaTppZD0iX3pHTEZHLS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9ImNvbnRyaWJ1dGVzIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il96R0xGSE8tc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfekdMRkctLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgICAgPGJvZHk+Q29udHJpYnV0ZXMgcHJvdmlkZXMgYSB3YXkgZm9yIGluc3RhbmNlcyBvZiBWYXJpYWJpbGl0eSBFbGVtZW50cyB0byBjb250cmlidXRlIHRoZWlyIHByb3BlcnRpZXMgaW50byB0aGVpciBiYXNlIFZhcmlhYmlsaXR5IEVsZW1lbnQgd2l0aG91dCBkaXJlY3RseSBhbHRlcmluZyBhbnkgb2YgaXRzIGV4aXN0aW5nIHByb3BlcnRpZXMsIGkuZS4gaW4gYW4gYWRkaXRpdmUgZmFzaGlvbi4gIFByb3BlcnRpZXMgY29udHJpYnV0ZWQgYXJlOiBhdHRyaWJ1dGUgdmFsdWVzIGFuZCBhc3NvY2lhdGlvbiBpbnN0YW5jZXMuICBUaGUgZWZmZWN0IGFmdGVyIGludGVycHJldGF0aW9uIG9mIGNvbnRyaWJ1dGlvbiBpcyB0aGF0IHRoZSBiYXNlIFZhcmlhYmlsaXR5IEVsZW1lbnQgaXMgbG9naWNhbGx5IHJlcGxhY2VkIHdpdGggYW4gYXVnbWVudGVkIHZhcmlhbnQgb2YgdGhlIGVsZW1lbnQgdGhhdCBjb21iaW5lcyBhdHRyaWJ1dGUgdmFsdWVzIGFuZCBhc3NvY2lhdGlvbiBpbnN0YW5jZXMuICBUaGUgd2F5IHRoaXMgY29tYmluYXRpb24gaXMgcmVhbGl6ZWQgZGVwZW5kcyBvbiB0aGUgdHlwZSBvZiB0aGUgYXR0cmlidXRlIG9yIGFzc29jaWF0aW9uLiAgRm9yIGV4YW1wbGUsIFN0cmluZyBhdHRyaWJ1dGVzIGFyZSBjb25jYXRlbmF0ZWQgcmVzb2x2aW5nIGVtYmVkZGVkIGNvbW1hbmRzIGZvciBkZXBlbmRlbnQgdGV4dCBvciBtZXJnaW5nIHRleHQgZnJhZ21lbnRzIChlLmcuIGRlc2NyaXB0aW9ucyBmb3IgY29udGVudCBlbGVtZW50cykuICBBZGRpdGlvbmFsIGVsZW1lbnRzIGluIHRvLW1hbnkgYXNzb2NpYXRpb25zIGFyZSBhZGRlZCAoZS5nLiBhZGRpdGlvbmFsIEd1aWRhbmNlIGVsZW1lbnRzIG9yIFRhc2sgRGVzY3JpcHRvcnMgb2YgYW4gQWN0aXZpdHkpLiAgRGlmZmVyZW50IGVsZW1lbnRzIGluIHRvLW9uZSBhc3NvY2lhdGlvbnMgYXJlIGlnbm9yZWQgKGUuZy4gdGhlIG9uZSBQcmltYXJ5IFBlcmZvcm1lciBvZiBhIFRhc2spLiAgTXVsdGlwbGUgQ29udGVudCBFbGVtZW50cyBjYW4gY29udHJpYnV0ZSB0byB0aGUgc2FtZSBiYXNlIGVsZW1lbnQgYW5kIGFsbCBvZiB0aGVzZSBjb250cmlidXRpb25zIHByb3BlcnRpZXMgYXJlIGFkZGVkIHRvIHRoZSBiYXNlIGluIHRoZSBzYW1lIGZhc2hpb24uIFRoZSBmb2xsb3dpbmcgdGFibGUgcHJvdmlkZXMgdGhlIGRldGFpbGVkIGxpc3Qgb2YgaW50ZXJwcmV0YXRpb24gcnVsZXM6Ci1hdHRyaWJ1dGUgdmFsdWVzOglTdHJpbmcgdmFsdWVzIGZyb20gdGhlIHNwZWNpYWwgVmFyaWFiaWxpdHkgRWxlbWVudCBhcmUgY29uY2F0ZW5hdGVkIHdpdGggdmFsdWVzIGZyb20gdGhlIGJhc2VkLW9uIFZhcmlhYmlsaXR5IEVsZW1lbnQuICBPdGhlciB2YWx1ZXMgZnJvbSB0aGUgc3BlY2lhbCBWYXJpYWJpbGl0eSBFbGVtZW50IG9mIGFueSBvdGhlciB0eXBlIHN1Y2ggYXMgSW50ZWdlciwgRGF0ZSBhcmUgaWdub3JlZC4KLVRoZSBpZGVudGlmeWluZyBhdHRyaWJ1dGVzIGd1aWQgYW5kIG5hbWUgb2YgTWV0aG9kIEVsZW1lbnQgYXJlIGV4ZW1wdCBmcm9tIHRoaXMgcnVsZSBhbmQgd2lsbCBub3QgYmUgbW9kaWZpZWQuCi0wLi4xLWFzc29jaWF0aW9uIGluc3RhbmNlczoJVGhlIG9uZSBhc3NvY2lhdGlvbiBpbnN0YW5jZSBvZiB0aGUgYmFzZWQtb24gVmFyaWFiaWxpdHkgRWxlbWVudCBpcyBrZXB0IGFuZCBhbnkgYXNzb2NpYXRpb24gZnJvbSB0aGUgY29udHJpYnV0aW5nIHNwZWNpYWwgVmFyaWFiaWxpdHkgRWxlbWVudCBpcyBpZ25vcmVkLgotMC4ubi1hc3NvY2lhdGlvbiBpbnN0YW5jZXM6CUFzc29jaWF0aW9uIGluc3RhbmNlcyBvZiB0aGUgc3BlY2lhbCBWYXJpYWJpbGl0eSBFbGVtZW50IGFyZSBhZGRlZCB0byB0aGUgYWxyZWFkeSBleGlzdGluZyBhc3NvY2lhdGlvbiBpbnN0YW5jZXMgb2YgdGhlIGJhc2VkLW9uIGVsZW1lbnQuICBJZiBib3RoIFZhcmlhYmlsaXR5IEVsZW1lbnRzIHJlZmVyIHRvIHRoZSBzYW1lIG9iamVjdCB0aGVuIG9ubHkgb25lIGluc3RhbmNlIG9mIHRoZSBhc3NvY2lhdGlvbiB3aWxsIHJlbWFpbi4KLTwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8L293bmVkTGl0ZXJhbD4KLSAgICAgIDxvd25lZExpdGVyYWwgeG1pOmlkPSJfekdMRkhlLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iZXh0ZW5kcyI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfekdMRkh1LXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3pHTEZIZS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICAgIDxib2R5PkV4dGVuc2lvbiBhbGxvd3MgTWV0aG9kIFBsdWdpbnMgdG8gZWFzaWx5IHJldXNlIGVsZW1lbnRzIGZyb20gYSBCYXNlIFBsdWdpbiBieSBwcm92aWRpbmcgYSBraW5kIG9mIGluaGVyaXRhbmNlIGZvciB0aGUgc3BlY2lhbCBWYXJpYWJpbGl0eSBFbGVtZW50LiAgQXR0cmlidXRlIHZhbHVlcyBhbmQgQXNzb2NpYXRpb24gaW5zdGFuY2VzIGFyZSBpbmhlcml0ZWQgZnJvbSB0aGUgYmFzZWQtb24gVmFyaWFiaWxpdHkgRWxlbWVudCB0byB0aGUgc3BlY2lhbCBWYXJpYWJpbGl0eSBFbGVtZW50LiAgVGhlIHJlc3VsdCBvZiBpbnRlcnByZXRhdGlvbiBpcyB0aGF0IHRoZSBzcGVjaWFsIGVsZW1lbnQgaGFzIHRoZSBzYW1lIHByb3BlcnRpZXMgYXMgdGhlIGJhc2VkLW9uIGhhcywgYnV0IG1pZ2h0IGRlZmluZSBpdHMgb3duIGFkZGl0aW9ucy4gIEhlbmNlIGV4dGVuZHMgaXMgbm90IHVzZWQgdG8gbW9kaWZ5IGNvbnRlbnQgb2YgdGhlIGJhc2UgUGx1Z2luLCBidXQgdG8gcHJvdmlkZSB0aGUgYWJpbGl0eSBmb3IgdGhlIGV4dGVuZGluZyBQbHVnaW4gdG8gZGVmaW5lIGl0cyBvd24gY29udGVudCB3aGljaCBpcyBhIHZhcmlhbnQgb2YgY29udGVudCBhbHJlYWR5IGRlZmluZWQgKGUuZy4gYSBzcGVjaWFsIHZlcnNpb24gb2YgYSBnZW5lcmljIFJldmlldyBSZWNvcmQgZm9yIGEgc3BlY2lmaWMgdHlwZSBvZiByZXZpZXcpLiAgVGhlIGVmZmVjdCBvZiB0aGlzIGlzIHRoYXQgdGhlIGJhc2UgVmFyaWFiaWxpdHkgRWxlbWVudCBhbmQgYW55IG51bWJlciBvZiBleHRlbmRpbmcgVmFyaWFiaWxpdHkgRWxlbWVudHMgY2FuIGJlIHVzZWQgc2lkZSBieSBzaWRlLCBidXQgcmVmZXIgdG8gZWFjaCBvdGhlciB2aWEgdGhlIGV4dGVuZHMgcmVsYXRpb25zaGlwLiAgRXh0ZW5kcyBhbHNvIHByb3ZpZGVzIHRoZSBrZXkgbWVjaGFuaXNtIGZvciBiaW5kaW5nIENhcGFiaWxpdHkgUGF0dGVybnMgdG8gUHJvY2Vzc2VzOiBBIHBhdHRlcm4gaXMgYXBwbGllZCBieSBkZWZpbmluZyBhbiBleHRlbmRzIHJlbGF0aW9uc2hpcHMgZnJvbSBhbiBBY3Rpdml0eSBvZiB0aGUgYXBwbHlpbmcgUHJvY2Vzc2VzIHRvIHRoZSBQYXR0ZXJuLiAgVGhlIEFjdGl2aXR5IGluaGVyaXRzIGFzc29jaWF0aW9ucyBpbnN0YW5jZXMgZnJvbSB0aGUgcGF0dGVybiBhbmQgdGhlIHBhdHRlcm4gYXBwZWFycyB0byBiZSBwYXJ0IG9mIHRoZSByZXN1bHRpbmcgUHJvY2VzcyBhZnRlciBJbnRlcnByZXRhdGlvbi4KLWF0dHJpYnV0ZSB2YWx1ZXM6CVZhbHVlcyBmcm9tIHRoZSBiYXNlZC1vbiBWYXJpYWJpbGl0eSBlbGVtZW50IGFyZSBpbmhlcml0ZWQgYW5kIHVzZWQgdG8gcG9wdWxhdGUgdGhlIHNwZWNpYWwgVmFyaWFiaWxpdHkgRWxlbWVudHMgYXR0cmlidXRlcy4gIElmIHRoZSBzcGVjaWFsIGVsZW1lbnQgYXR0cmlidXRlcyBhcmUgYWxyZWFkeSBwb3B1bGF0ZWQgdGhlIGluaGVyaXRlZCB2YWx1ZXMgYXJlIGlnbm9yZWQuICAKLVRoZSBpZGVudGlmeWluZyBhdHRyaWJ1dGVzIGd1aWQgYW5kIG5hbWUgb2YgTWV0aG9kIEVsZW1lbnQgYXJlIGV4ZW1wdCBmcm9tIHRoaXMgcnVsZSBhbmQgd2lsbCBub3QgYmUgbW9kaWZpZWQuCi0wLi4xLWFzc29jaWF0aW9uIGluc3RhbmNlczoJVGhlIG9uZSBhc3NvY2lhdGlvbiBpbnN0YW5jZSBvZiB0aGUgYmFzZWQtb24gVmFyaWFiaWxpdHkgRWxlbWVudCBpcyBpbmhlcml0ZWQgdG8gdGhlIHNwZWNpYWwgVmFyaWFiaWxpdHkgRWxlbWVudC4gIElmIHRoZSBzcGVjaWFsIFZhcmlhYmlsaXR5IEVsZW1lbnQgZGVmaW5lcyBpdHMgb3duIGFzc29jaWF0aW9uIGluc3RhbmNlIHRoZW4gdGhlIGluaGVyaXRlZCBvbmUgaXMgaWdub3JlZC4KLTAuLm4tYXNzb2NpYXRpb24gaW5zdGFuY2VzOglBc3NvY2lhdGlvbiBpbnN0YW5jZXMgZGVmaW5lZCBmb3IgdGhlIGJhc2VkLW9uIFZhcmlhYmlsaXR5IEVsZW1lbnQgYXJlIGluaGVyaXRlZCB0byB0aGUgc3BlY2lhbCBWYXJpYWJpbGl0eSBFbGVtZW50LiAgVGhlIHNwZWNpYWwgZWxlbWVudCBjYW4gYWRkIGFkZGl0aW9uYWwgYXNzb2NpYXRpb24gaW5zdGFuY2VzLgotCi08L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPC9vd25lZExpdGVyYWw+Ci0gICAgICA8b3duZWRMaXRlcmFsIHhtaTppZD0iX3pHTEZILS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9InJlcGxhY2VzIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il96R0xGSU8tc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfekdMRkgtLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgICAgPGJvZHk+UmVwbGFjZXMgcHJvdmlkZXMgYSB3YXkgZm9yIFZhcmlhYmlsaXR5IEVsZW1lbnRzIHRvIHJlcGxhY2UgYSBiYXNlIFZhcmlhYmlsaXR5IEVsZW1lbnQgd2l0aG91dCBkaXJlY3RseSBjaGFuZ2luZyBhbnkgb2YgaXRzIGV4aXN0aW5nIHByb3BlcnRpZXMuICBUaGlzIGlzIGluIG1vc3QgY2FzZXMgdXNlZCBmb3IgTWV0aG9kIFBsdWdpbnMgdGhhdCBhaW0gdG8gcmVwbGFjZSBzcGVjaWZpYyBDb250ZW50IEVsZW1lbnRzIHN1Y2ggYXMgUm9sZXMsIFRhc2ssIG9yIEFjdGl2aXRpZXMgd2l0aCBlaXRoZXIgYSBjb21wbGV0ZSBuZXcgdmFyaWFudCBvciB0byBjaGFuZ2UgZnVuZGFtZW50YWwgcmVsYXRpb25zaGlwcyBvZiB0aGVzZSBlbGVtZW50cyAoZS5nLiBSb2xlLUFydGlmYWN0IHJlc3BvbnNpYmlsaXR5KS4gIFByb3BlcnRpZXMgcmVwbGFjZWQgYXJlIGF0dHJpYnV0ZSB2YWx1ZXMgYW5kIGFzc29jaWF0aW9uIGluc3RhbmNlcy4gIFRoZSBlZmZlY3Qgb2YgdGhpcyBpcyB0aGF0IHRoZSBiYXNlIENvbnRlbnQgRWxlbWVudCBpcyBsb2dpY2FsbHkgcmVwbGFjZWQgd2l0aCB0aGlzIG5ldyB2YXJpYW50IG9mIHRoZSBlbGVtZW50IHRvIHdoaWNoIGFsbCBpbmNvbWluZyBhc3NvY2lhdGlvbnMgc3RpbGwgcG9pbnQgYXMgYmVmb3JlLCBidXQgd2hpY2ggaGFzIHBvdGVudGlhbGx5IG5ldyBhdHRyaWJ1dGUgdmFsdWVzIGFuZCBvdXRnb2luZyBhc3NvY2lhdGlvbiBwcm9wZXJ0aWVzLiAgVGhpcyBwcm92aWRlcyBhIHZlcnkgcG93ZXJmdWwgbWVjaGFuaXNtIHRvIHJlcGxhY2UsIGZvciBleGFtcGxlLCB3aG9sZSBBY3Rpdml0aWVzIGluIGEgUHJvY2VzcyB3aXRoIGNvbXBsZXRlIG5ldyByZWFsaXphdGlvbnMgb2YgdGhlIEFjdGl2aXR5LiAgRm9yIGluc3RhbmNlLCByZXBsYWNpbmcgYW4gQWN0aXZpdHkgZG9pbmcgdXNlIGNhc2UtYmFzZWQgZGVzaWduIHdpdGggYW4gYWN0aXZpdHkgZG9pbmcgYWdpbGUgY29kZS1jZW50cmljIGRldmVsb3BtZW50IGRvaW5nIHRoZSBzYW1lIHdvcmsgdXNpbmcgYSBkaWZmZXJlbnQgZGV2ZWxvcG1lbnQgdGVjaG5pcXVlIHV0aWxpemluZyBkaWZmZXJlbnQgUm9sZXMsIFRhc2tzLCBldGMuICBBbm90aGVyIGV4YW1wbGUsIHdvdWxkIGJlIHRvIHJlcGxhY2UgYW4gQWN0aXZpdHkgdGhhdCBkZXNjcmliZXMgZGF0YWJhc2UgZGVzaWduIGZvciBhbiBSREJNUyB3aXRoIGFuIEFjdGl2aXR5IHRoYXQgZGVzY3JpYmVzIGRhdGFiYXNlIGRlc2lnbiBmb3IgYW4gT09EQk1TLiAgQSBWYXJpYWJpbGl0eSBFbGVtZW50IGNhbiBvbmx5IGJlIHJlcGxhY2VkIGJ5IG9uZSBvdGhlciBlbGVtZW50IGF0IGEgdGltZS4gIEZvciBleGFtcGxlLCBpZiB0d28gTWV0aG9kIFBsdWdpbnMgcmVwbGFjZSB0aGUgc2FtZSBlbGVtZW50IG9ubHkgb25lIE1ldGhvZCBQbHVnaW4gY2FuIGJlIHVzZWQgZm9yIGludGVycHJldGF0aW9uIChzZWUgY29uY2VwdCBvZiBNZXRob2QgQ29uZmlndXJhdGlvbiBmb3IgbW9yZSBkZXRhaWxzIG9uIGhvdyB0byByZXNvbHZlIHN1Y2ggY29uZmxpY3RzLCBTZWN0aW9uIDcuMS4yKS4gIFRoZSBmb2xsb3dpbmcgdGFibGUgcHJvdmlkZXMgdGhlIGRldGFpbGVkIGxpc3Qgb2YgaW50ZXJwcmV0YXRpb24gcnVsZXM6Ci1hdHRyaWJ1dGUgdmFsdWVzOglWYWx1ZXMgZnJvbSB0aGUgc3BlY2lhbCBWYXJpYWJpbGl0eSBFbGVtZW50IGFyZSByZXBsYWNlZCB3aXRoIHZhbHVlcyBmcm9tIHRoZSBiYXNlZC1vbiBWYXJpYWJpbGl0eSBFbGVtZW50IGluY2x1ZGluZyB1bmFzc2lnbmVkIHZhbHVlcy4KLVRoZSBpZGVudGlmeWluZyBhdHRyaWJ1dGVzIGd1aWQgYW5kIG5hbWUgb2YgTWV0aG9kIEVsZW1lbnQgYXJlIGV4ZW1wdCBmcm9tIHRoaXMgcnVsZSBhbmQgd2lsbCBub3QgYmUgbW9kaWZpZWQuCi0wLi4xLWFzc29jaWF0aW9uIGluc3RhbmNlczoJVGhlIG9uZSBhc3NvY2lhdGlvbiBpbnN0YW5jZSBvZiB0aGUgYmFzZWQtb24gVmFyaWFiaWxpdHkgRWxlbWVudCBpcyByZXBsYWNlZCB3aXRoIHRoZSBhc3NvY2lhdGlvbiBpbnN0YW5jZSBmcm9tIHRoZSByZXBsYWNpbmcgc3BlY2lhbCBWYXJpYWJpbGl0eSBFbGVtZW50LiAgSWYgdGhlIHNwZWNpYWwgVmFyaWFiaWxpdHkgRWxlbWVudCBkb2VzIG5vdCBoYXZlIGFuIGFzc29jaWF0aW9uIGluc3RhbmNlIHRoZW4gcmVzdWx0aW5nIGVsZW1lbnQgd2lsbCBhbHNvIG5vdCBoYXZlIGFuIGFzc29jaWF0aW9uLgotMC4ubi1hc3NvY2lhdGlvbiBpbnN0YW5jZXM6CUFzc29jaWF0aW9uIGluc3RhbmNlcyBvZiB0aGUgc3BlY2lhbCBWYXJpYWJpbGl0eSBFbGVtZW50IHJlcGxhY2UgYWxsIGFzc29jaWF0aW9uIGluc3RhbmNlcyBvZiB0aGUgYmFzZWQtb24gVmFyaWFiaWxpdHkgRWxlbWVudC4KLQotPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDwvb3duZWRMaXRlcmFsPgotICAgICAgPG93bmVkTGl0ZXJhbCB4bWk6aWQ9Il96R0xGSWUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJsb2NhbENvbnRyaWJ1dGlvbiIvPgotICAgICAgPG93bmVkTGl0ZXJhbCB4bWk6aWQ9Il96R0xGSXUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJsb2NhbFJlcGxhY2VtZW50Ii8+Ci0gICAgICA8b3duZWRMaXRlcmFsIHhtaTppZD0iX3pHTEZJLS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9ImV4dGVuZHNSZXBsYWNlcyIvPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfekdMRkpPLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iVmFyaWFiaWxpdHlFbGVtZW50IiBpc0Fic3RyYWN0PSJ0cnVlIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfekdMRkplLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3pHTEZKTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5WYXJpYWJpbGl0eSBFbGVtZW50IGlzIGFuIGFic3RyYWN0IGNsYXNzIGRlcml2ZWQgZnJvbSBNZXRob2QgRWxlbWVudCB0aGF0IHByb3ZpZGVzIG5ldyBjYXBhYmlsaXRpZXMgZm9yIGNvbnRlbnQgdmFyaWF0aW9uIGFuZCBleHRlbnNpb24gdG8gQ29udGVudCBFbGVtZW50cyBvciBhbnkgb3RoZXIgTWV0aG9kIEVsZW1lbnQgdGhhdCBkZXJpdmVzIGZyb20gaXQuICBJdCBoYXMgYmVlbiBwbGFjZWQgaW4tYmV0d2VlbiB0aGUgY2xhc3NlcyBNZXRob2QgRWxlbWVudCBhbmQgQ29udGVudCBFbGVtZW50IGluIHRoZSBvdmVyYWxsIFVNQSB0YXhvbm9teSBvZiBjbGFzc2VzIHVzaW5nIHRoZSBVTUwgMi4wIHBhY2thZ2UgbWVyZ2UgbWVjaGFuaXNtLiAgVGhlIGFzc29jaWF0aW9uIFZhcmlhYmlsaXR5IFNwZWNpYWxpemF0aW9uIHNoYWxsIG9ubHkgYmUgaW5zdGFudGlhdGVkIGJldHdlZW4gdHdvIHN1YmNsYXNzZXMgb2YgVmFyaWFiaWxpdHkgRWxlbWVudCBvZiB0aGUgc2FtZSB0eXBlLiAgVGhlIGVsZW1lbnQgb24gdmFyYWliaWxpdHlTcGVjaWFsRWxlbWVudCBzaWRlIG9mIHRoZSByZWxhdGlvbnNoaXAgZGVmaW5lcyBhIHZhbHVlIGZvciB0aGUgYXR0cmlidXRlIHZhcmlhYmlsaXR5VHlwZSBkZWZpbmluZyB0aGUgbmF0dXJlIG9mIHRoZSByZWxhdGlvbnNoaXAgdXNpbmcgYSBsaXRlcmFsIGZyb20gdGhlIGVudW1lcmF0aW9uIFZhcmlhYmlsaXR5IFR5cGUuCi1WYXJpYWJpbGl0eSBFbGVtZW50IG9mIHRoZSBtZXRhLW1vZGVsIHBhY2thZ2UgTWV0aG9kIFBsdWdpbnMgYWRkcyB0aGUgY2FwYWJpbGl0aWVzIG9mIHZhcmlhdGlvbiBhbmQgZXh0ZW5zaW9uIHRvIE1ldGhvZCBFbGVtZW50cyB0aGF0IGRlcml2ZSBmcm9tIGl0LiAgQnkgZGVmYXVsdCBhbGwgQ29udGVudCBFbGVtZW50cyBzdWNoIGFzIFJvbGUsIFRhc2ssIEd1aWRhbmNlIFR5cGVzLCBvciBBY3Rpdml0aWVzIGFyZSBkZWZpbmVkIHRvIGJlIFZhcmlhYmlsaXR5IEVsZW1lbnRzLgotVmFyaWFiaWxpdHkgYW5kIGV4dGVuc2lvbiBwcm92aWRlcyB1bmlxdWUgbWVjaGFuaXNtcyBmb3IgY3VzdG9taXppbmcgbWV0aG9kIGNvbnRlbnQgd2l0aG91dCBhY3R1YWxseSBkaXJlY3RseSBtb2RpZnlpbmcgdGhlIG9yaWdpbmFsIGNvbnRlbnQsIGJ1dCBieSBqdXN0IGJlIGFibGUgdG8gZGVzY3JpYmUgd2l0aCBzZXBhcmF0ZSBvYmplY3RzIHRoZSBkaWZmZXJlbmNlcyAoYWRkaXRpb25zLCBjaGFuZ2VzLCBvbWlzc2lvbnMpIHJlbGF0aXZlIHRvIHRoZSBvcmlnaW5hbC4gIFRoaXMgcGx1Zy1pbiBjb25jZXB0IGFsbG93cyB1c2VycyB0byBmYWN0b3IgdGhlaXIgbWV0aG9kIGNvbnRlbnQgYW5kIHByb2Nlc3NlcyBpbiBpbnRlcnJlbGF0ZWQgdW5pdHMgYW5kIGV2ZW4gdG8gYXJjaGl0ZWN0IG1ldGhvZCBjb250ZW50IGFuZCBwcm9jZXNzZXMgaW4gbGF5ZXJzIHRoYXQgZXh0ZW5kIGVhY2ggb3RoZXIgd2l0aCBuZXcgY2FwYWJpbGl0aWVzLiAgVGhlIHJlc3VsdGluZyBtZXRob2QgYW5kIHByb2Nlc3MgZGVzaWduIGNhbiBiZSBkeW5hbWljYWxseSBjb21iaW5lZCBhbmQgYXBwbGllZCBvbiBkZW1hbmQgdXNpbmcgdGhlIGludGVycHJldGF0aW9uIHJ1bGVzIGRlZmluZWQgZm9yIFZhcmlhYmlsaXR5IEVsZW1lbnQgU3BlY2lhbGl6YXRpb25zIGFzc2VtYmxpbmcgdG8gcHJvY2VzcyBwcmFjdGl0aW9uZXJzIHRoZSBtb3N0IGFjY3VyYXRlIG1ldGhvZCBhbmQgcHJvY2VzcyBkZXNjcmlwdGlvbnMgcG9zc2libGUuICBJdCBhbHNvIGFsbG93cyBwcm9jZXNzIHByYWN0aXRpb25lcnMgdG8gZXh0ZW5kcyBhbmQgdGFpbG9yIG1ldGhvZCBjb250ZW50IGFuZCBwcm9jZXNzZXMgdGhleSBkbyBub3Qgb3duIGFuZCB0byBlYXNpbHkgdXBncmFkZSB0byBuZXdlciB2ZXJzaW9ucyBieSBzaW1wbHkgcmVhcHBseSB0aGVpciBwZXJzb25hbCBjaGFuZ2VzIHRvIHRoZXNlIHVwZ3JhZGVzLgotVmFyaWFiaWxpdHkgRWxlbWVudCBkZWZpbmVzIHR3byB0eXBlcyBvZiB2YXJpYWJpbGl0eSBhbmQgb25lIHR5cGUgb2YgZXh0ZW5zaW9uIHdoaWNoIGFyZSBmb3JtYWxseSBkZWZpbmVkIGZvciB0aGUgZW51bWVyYXRpb24gVmFyaWFiaWxpdHkgVHlwZS4KLTwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3pHTEZKdS1zRWR1SDU5S1NIVjh2Z0EiIGdlbmVyYWw9Il95eHc3UWUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfekdMRkotLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0idmFyaWFiaWxpdHlUeXBlIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il96R0xGRi0tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il96R0xGS08tc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfekdMRkotLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgICAgPGJvZHk+SWYgaW4gaW5zdGFuY2Ugb2YgdGhlIHZhcmlhYmlsaXR5U3BlY2lhbGl6YXRpb24gYXNzb2NpYXRpb24gYmV0d2VlbiB0d28gVmFyaWFiaWxpdHkgRWxlbWVudHMgb2YgdGhlIHNhbWUgdHlwZSBleGlzdHMsIHRoZW4gdGhlIHZhcmlhYmlsaXR5VHlwZSBhdHRyaWJ1dGUgc3BlY2lmaWVzIGhvdyB0aGUgZWxlbWVudCBhdCB0aGUgdmFyaWFiaWxpdHlTcGVjaWFsRWxlbWVudCBlbmQgb2YgdGhlIGFzc29jaWF0aW9uIGNoYW5nZXMgdGhlIENvbnRlbnQgRWxlbWVudCBhdCB0aGUgdmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCBlbmQuIFNlZSB0aGUgVmFyaWFiaWxpdHkgVHlwZSBlbnVtZXJhdGlvbiBjbGFzcyBmb3IgZGVmaW5pdGlvbnMgZm9yIHRoZSBkaWZmZXJlbnQgdHlwZXMgb2YgdmFyaWFiaWxpdHkuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iX3pHTEZLZS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICAgIDxib2R5Pm5hPC9ib2R5PgotICAgICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfekdMRkt1LXNFZHVINTlLU0hWOHZnQSIgbmFtZT0idmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfekdMRkpPLXNFZHVINTlLU0hWOHZnQSIgYXNzb2NpYXRpb249Il96R1UyQ3Utc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfekdMRkstLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjEiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfekdMRkxPLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjEiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il95eHc3WXUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJTZWN0aW9uIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeXh3N1ktLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3l4dzdZdS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5BIFNlY3Rpb24gaXMgYSBzcGVjaWFsIE1ldGhvZCBFbGVtZW50IHRoYXQgcmVwcmVzZW50cyBzdHJ1Y3R1cmFsIHN1YnNlY3Rpb25zIG9mIGEgQ29udGVudCBEZXNjcmlwdGlvbidzIHNlY3Rpb25EZXNjcmlwdGlvbiBhdHRyaWJ1dGUuICBJdCBpcyB1c2VkIGZvciBlaXRoZXIgbGFyZ2Ugc2NhbGUgZG9jdW1lbnRhdGlvbiBvZiBDb250ZW50IEVsZW1lbnRzIG9yZ2FuaXplZCBpbnRvIHNlY3Rpb25zIGFzIHdlbGwgYXMgdG8gZmxleGlibHkgYWRkIG5ldyBTZWN0aW9ucyB0byBDb250ZW50IEVsZW1lbnRzIHVzaW5nIGNvbnRyaWJ1dGlvbiB2YXJpYWJpbGl0eSBhZGRlZCB0byB0aGUgU2VjdGlvbiBjb25jZXB0IGZvciBNZXRob2QgUGx1Zy1pbnMuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3pHTEZMZS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95eHc3WXUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+U2VjdGlvbiBpbiB0aGUgcGFja2FnZSBNZXRob2QgUGx1Z2luIGluaGVyaXRzIGZyb20gVmFyaWFiaWxpdHkgRWxlbWVudCBhbmQgZXh0ZW5kcyBTZWN0aW9uIGRlZmluZWQgaW4gTWV0aG9kIENvcmUgOjogQmFzaWMgRWxlbWVudHMgd2l0aCBuZXcgY2FwYWJpbGl0aWVzIGZvciB2YXJpYWJpbGl0eS4gCi1Gb3IgZXhhbXBsZSwgd2hlbiBhIFRhc2sgY29udHJpYnV0ZXMgdG8gYW5vdGhlciBUYXNrIGl0cyBQcmVzZW50YXRpb24gYXNzb2NpYXRpb24gaXMgY29udHJpYnV0ZWQgaW5jbHVkaW5nIGl0cyBTZWN0aW9ucyAoaS5lLiBpdHMgU3RlcHMpLCB3aGljaCBhcmUgbW9kZWxlZCBhcyBwYXJ0cyBvZiB0aGUgQ29udGVudCBEZXNjcmlwdGlvbiBpbnN0YW5jZS4gIFNlY3Rpb25zIGNhbiBiZSBuZXN0ZWQgYW5kIHRoZXJlZm9yZSBUYXNrIERlc2NyaXB0aW9ucyBjYW4gYmUgZmxleGlibHkgb3JnYW5pemVkIGluIFN0ZXBzIHdpdGggc3ViLVN0ZXBzLiAgU2VjdGlvbnMgYXJlIFZhcmlhYmlsaXR5IEVsZW1lbnRzIHRoZW1zZWx2ZXMsIHNvIHRoZXkgY2FuIGNvbnRyaWJ1dGUgdG8gZWFjaCBvdGhlci4gIEZvciBleGFtcGxlLCBvbmUgY291bGQgbW9kZWwgYSBUYXNrIHN0ZXAgYXMgYSBTZWN0aW9uIGluc3RhbmNlIHdpdGhvdXQgcmVsYXRpbmcgaXQgdG8gYSBUYXNrIERlc2NyaXB0aW9uIHRoYXQgZGlyZWN0bHkgY29udHJpYnV0ZXMgdG8gKG9yIHJlcGxhY2VzKSBhbm90aGVyIFNlY3Rpb24gd2hpY2ggaXMgcGFydCBvZiBhIFRhc2sgRGVzY3JpcHRpb24uICBUaGlzIGNvbnRyaWJ1dGlvbiAob3IgcmVwbGFjZW1lbnQpIHdvdWxkIGFkZCBuZXcgZGVzY3JpcHRpb24gdGV4dCB0byB0aGUgb3JpZ2luYWwgc3RlcCBkZXNjcmlwdGlvbiAob3IgcmVwbGFjZSB0aGUgb3JpZ2luYWwgc3RlcCBkZXNjcmlwdGlvbikuICBBbm90aGVyIGV4YW1wbGUgd291bGQgYmUgdG8gY29udHJpYnV0ZSBuZXcgQ2hlY2sgTGlzdCBpdGVtcyBvcmdhbml6ZWQgYXMgU2VjdGlvbnMgdG8gYW4gZXhpc3RpbmcgQ2hlY2sgTGlzdCAoZGVmaW5lZCBhcyBndWlkYW5jZSkuICAKLQotPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfekdMRkx1LXNFZHVINTlLU0hWOHZnQSIgZ2VuZXJhbD0iX3pHTEZKTy1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il95eHc3WmUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJzZWN0aW9uTmFtZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXhVUGFPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeXh3N1p1LXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3l4dzdaZS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICAgIDxib2R5PkV2ZXJ5IFNlY3Rpb24gaGFzIGEgbmFtZSB1c2VkIGZvciBleHRlcm5hbCBwcmVzZW50YXRpb24gb2YgdGhlIHNlY3Rpb24sIGUuZy4gd2hlbiBwdWJsaXNoZWQgb3Igd2hlbiBzZWN0aW9uIGhlYWRpbmcgYXJlIGxpc3RlZCBpbiBhIHRhYmxlIG9mIGNvbnRlbnRzLiAgVGhpcyBhdHRyaWJ1dGUgaXMgc2ltaWxhciB0byBQcmVzZW50YXRpb24gTmFtZSBmb3IgQ29udGVudCBFbGVtZW50cy48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95eHc3Wi0tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iMSIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95eHc3YU8tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il95eHc3YWUtc0VkdUg1OUtTSFY4dmdBIiB0eXBlPSJfeXhVUGFPLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IiIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il95eHc3YXUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJzZWN0aW9uRGVzY3JpcHRpb24iIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l4VVBhTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3l4dzdhLS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95eHc3YXUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgICA8Ym9keT5UaGlzIGF0dHJpYnV0ZXMgc3RvcmUgdGhlIGRlc2NyaXB0aW9uIHRleHQgZm9yIGEgQ29udGVudCBEZXNjcmlwdGlvbidzIFNlY3Rpb24uPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeXh3N2JPLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjEiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeXh3N2JlLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfeXh3N2J1LXNFZHVINTlLU0hWOHZnQSIgdHlwZT0iX3l4VVBhTy1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfeXh3N2ItLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0ic3ViU2VjdGlvbnMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l4dzdZdS1zRWR1SDU5S1NIVjh2Z0EiIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiIGFzc29jaWF0aW9uPSJfeXh3N2xPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3l4dzdjTy1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3l4dzdjZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfekdMRkwtLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0icHJlZGVjZXNzb3IiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l4dzdZdS1zRWR1SDU5S1NIVjh2Z0EiIGFzc29jaWF0aW9uPSJfekdVMkQtLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3pHTEZNTy1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIxIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3pHTEZNZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il95N21Nc08tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJBY3Rpdml0eSI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3k3bU1zZS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95N21Nc08tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+QW4gQWN0aXZpdHkgaXMgYSBXb3JrIEJyZWFrZG93biBFbGVtZW50IGFuZCBXb3JrIERlZmluaXRpb24gd2hpY2ggc3VwcG9ydHMgdGhlIG5lc3RpbmcgYW5kIGxvZ2ljYWwgZ3JvdXBpbmcgb2YgcmVsYXRlZCBCcmVha2Rvd24gRWxlbWVudHMgZm9ybWluZyBicmVha2Rvd24gc3RydWN0dXJlcy4gIEFsdGhvdWdoIEFjdGl2aXR5IGlzIGEgY29uY3JldGUgbWV0YS1jbGFzcywgb3RoZXIgY2xhc3NlcyB3aGljaCByZXByZXNlbnQgYnJlYWtkb3duIHN0cnVjdHVyZXMgZGVyaXZlIGZyb20gaXQ7IHN1Y2ggYXMgUGhhc2UsIEl0ZXJhdGlvbiwgRGVsaXZlcnkgUHJvY2Vzcywgb3IgQ2FwYWJpbGl0eSBQYXR0ZXJuLgotQWN0aXZpdHkgcmVwcmVzZW50cyBhIGdyb3VwaW5nIGVsZW1lbnQgZm9yIG90aGVyIEJyZWFrZG93biBFbGVtZW50cyBzdWNoIGFzIEFjdGl2aXRpZXMsIERlc2NyaXB0b3JzLCBNaWxlc3RvbmVzLCBldGMuICBJdCBpcyBub3QgcGVyLXNlIGEgJ2hpZ2gtbGV2ZWwnIGdyb3VwaW5nIG9mIG9ubHkgd29yayBhcyBpbiBvdGhlciBtZXRhLW1vZGVscywgYnV0IGdyb3VwcyBhbnkga2luZCBvZiBCcmVha2Rvd24gRWxlbWVudHMuICBGb3IgZXhhbXBsZSwgb25lIGNhbiBkZWZpbmUgdmFsaWQgQWN0aXZpdGllcyB0aGF0IGdyb3VwIG9ubHkgV29yayBQcm9kdWN0cyBEZXNjcmlwdG9ycyB3aXRob3V0IGFueSBtYXRjaGluZyBUYXNrIERlc2NyaXB0b3JzLiAgQWN0aXZpdGllcyBhbHNvIGluaGVyaXQgYWxsIHByb3BlcnRpZXMgZnJvbSBXb3JrIEJyZWFrZG93biBFbGVtZW50IGFuZCBpbmRpcmVjdGx5IGZyb20gUHJvY2VzcyBFbGVtZW50OyBpLmUuIEFjdGl2aXR5IGlzIHJlYWR5IHRvIGhhdmUgYSBmdWxsIGNvbnRlbnQgZGVzY3JpcHRpb24gYXR0YWNoZWQgdG8gaXQuCi08L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeS00S1NPLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3k3bU1zTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5UaGlzIGRlZmluaXRpb24gb2YgQWN0aXZpdHkgZXh0ZW5kcyBBY3Rpdml0eSBpbnRyb2R1Y2VkIGluIHRoZSBwYWNrYWdlIEJyZWFrZG93biB3aXRoIG5ldyBjYXBhYmlsaXRpZXMgYW5kIGlzIHRoZSBiYXNpcyBmb3IgdGhlIGRlZmluaXRpb24gb2YgdGhlIGNsYXNzIFByb2Nlc3MuCi1FeHRlbmRzIEFjdGl2aXR5IHdpdGggYW4gYXNzb2NpYXRpb24gdG8gUm9hZG1hcC4gIFRoaXMgZGVmaW5pdGlvbiBvZiBBY3Rpdml0eSBhbHNvIHBhcnRpY2lwYXRlcyBpbiB0aGUgZXh0ZW5zaW9uIG9mIHRoZSBEaXNjaXBsaW5lIGNhdGVnb3J5LgotPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3pHTEZNdS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95N21Nc08tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+QWN0aXZpdHkgaW4gdGhlIHBhY2thZ2UgTWV0aG9kIFBsdWdpbiBpbmhlcml0cyBmcm9tIFZhcmlhYmlsaXR5IEVsZW1lbnQgdG8gZXh0ZW5kIEFjdGl2aXR5IHdpdGggbmV3IGNhcGFiaWxpdGllcyBmb3IgdmFyaWFiaWxpdHkuJiN4RDsKLUFjdGl2aXR5IGluaGVyaXRzIHRoZSBzZW1hbnRpY3Mgb2YgVmFyaWFiaWxpdHkgRWxlbWVudCB3aGljaCBwcm92aWRlcyBrZXkgbWVjaGFuaXNtIHRvIGVuYWJsZSBkeW5hbWljIGJpbmRpbmcgb2YgQ2FwYWJpbGl0eSBQYXR0ZXJucyBpbiBQcm9jZXNzZXMgYXMgd2VsbCBhcyBQcm9jZXNzIENvbnRyaWJ1dGlvbnMuICBWYXJpYWJpbGl0eSBpcyB1c2VkIGluIHRoZSBmb2xsb3dpbmcgd2F5IGZvciBBY3Rpdml0aWVzOiYjeEQ7Ci0tIEV4dGVuZDogVG8gYXBwbHkgYSBDYXBhYmlsaXR5IFBhdHRlcm4gdG8gYSBwcm9jZXNzIG9uZSB3b3VsZCBjcmVhdGUgYW4gQWN0aXZpdHkgd2hpY2ggZXh0ZW5kcyB0aGUgcGF0dGVybidzIHRvcC1sZXZlbCBhY3Rpdml0eS4gIFRocm91Z2ggZXh0ZW5zaW9uIHRoZSBleHRlbmRpbmcgQWN0aXZpdHkgaW5oZXJpdHMgdGhlIHBhdHRlcm5zIEJyZWFrZG93biBFbGVtZW50cy4mI3hEOwotLSBSZXBsYWNlOiBUbyByZXBsYWNlIGFuIEFjdGl2aXR5IG9mIGFuIGFwcGxpZWQgQ2FwYWJpbGl0eSBQYXR0ZXJuIG9yIGFuIGV4aXN0aW5nIHByb2Nlc3MgZm9yIHdoaWNoIG9uZSBkZXZlbG9wcyBhIFByb2Nlc3MgQ29udHJpYnV0aW9uIChvciBhIGNvbWJpbmF0aW9uIG9mIGJvdGgpIG9uZSB3b3VsZCBjcmVhdGUgYW4gQWN0aXZpdHkgYW5kIHNwZWNpZnkgdGhlIHJlcGxhY2UgdmFyaWFiaWxpdHkgc3BlY2lhbGl6YXRpb24gYmV0d2VlbiB0aGVtLiYjeEQ7Ci0tIENvbnRyaWJ1dGU6IFRvIGNvbnRyaWJ1dGUgbmV3IEJyZWFrZG93biBFbGVtZW50cyB0byBhbiBleGlzdGluZyBBY3Rpdml0eSBvbmUgd291bGQgZGVmaW5lIGFuIEFjdGl2aXR5IHdpdGggQnJlYWtkb3duIEVsZW1lbnRzIHRoYXQgcmVsYXRlcyB2aWEgdGhlIENvbnRyaWJ1dGVzIFZhcmlhYmlsaXR5IFNwZWNpYWxpemF0aW9uIHRvIHRoaXMgZXhpc3RpbmcgQWN0aXZpdHkuICBUaGUgY29udHJpYnV0aW5nIEFjdGl2aXR5J3MgQnJlYWtkb3duIEVsZW1lbnRzIHdpbGwgYmUgYWRkZWQgdG8gdGhlIGNvbnRyaWJ1dGVkIEFjdGl2aXR5LiYjeEQ7Ci0mI3hEOwotPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfeTdtTXN1LXNFZHVINTlLU0hWOHZnQSIgZ2VuZXJhbD0iX3k3dlhLZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il95N21Ncy0tc0VkdUg1OUtTSFY4dmdBIiBnZW5lcmFsPSJfeXl6ZFRPLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3pHTEZNLS1zRWR1SDU5S1NIVjh2Z0EiIGdlbmVyYWw9Il96R0xGSk8tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfeTdtTXRPLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iYnJlYWtkb3duRWxlbWVudHMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3k3dld2Ty1zRWR1SDU5S1NIVjh2Z0EiIGFzc29jaWF0aW9uPSJfeV9CVVJ1LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3k3bU10ZS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3k3bU10dS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfeS00S1NlLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0icm9hZG1hcHMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3ktNEtSZS1zRWR1SDU5S1NIVjh2Z0EiIGFzc29jaWF0aW9uPSJfeV9CVU4tLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3ktNEtTdS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3ktNEtTLS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfeS00S1RPLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0ic3VwcG9ydGluZ01hdGVyaWFscyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXoxLTgtLXNFZHVINTlLU0hWOHZnQSIgYXNzb2NpYXRpb249Il95X0JVVWUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeS00S1RlLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeS00S1R1LXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il95LTRLVC0tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJjaGVja2xpc3RzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95ejEtNU8tc0VkdUg1OUtTSFY4dmdBIiBhc3NvY2lhdGlvbj0iX3lfQlVWdS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95LTRLVU8tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95LTRLVWUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3ktNEtVdS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9ImNvbmNlcHRzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95ejEtNGUtc0VkdUg1OUtTSFY4dmdBIiBhc3NvY2lhdGlvbj0iX3lfQlVXLS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95LTRLVS0tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95LTRLVk8tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3ktNEtWZS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9ImV4YW1wbGVzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95ejEtNS0tc0VkdUg1OUtTSFY4dmdBIiBhc3NvY2lhdGlvbj0iX3lfQlVZTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95LTRLVnUtc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95LTRLVi0tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3ktNEtXTy1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9Imd1aWRlbGluZXMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l6MS02dS1zRWR1SDU5S1NIVjh2Z0EiIGFzc29jaWF0aW9uPSJfeV9CVVplLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3ktNEtXZS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3ktNEtXdS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfeS00S1ctLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0icmV1c2FibGVBc3NldHMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l6X3ZfTy1zRWR1SDU5S1NIVjh2Z0EiIGFzc29jaWF0aW9uPSJfeV9CVWF1LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3ktNEtYTy1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3ktNEtYZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il96R1UyQU8tc0VkdUg1OUtTSFY4dmdBIiBtZW1iZXJFbmQ9Il96R1UyQXUtc0VkdUg1OUtTSFY4dmdBIF96R0xGQnUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfekdVMkFlLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3pHVTJBTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5UaGlzIGNvbXBvc2l0aW9uIGFzc29jaWF0aW9uIHJlcHJlc2VudHMgdGhhdCBldmVyeSBNZXRob2QgUGFja2FnZSAoZWl0aGVyIENvbnRlbnQgUGFja2FnZSwgUHJvY2VzcyBQYWNrYWdlLCBvciBQcm9jZXNzIENvbXBvbmVudCkgaXMgcGFydCBvZiBleGFjdGx5IG9uZSBNZXRob2QgUGx1Z2luLjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iX3pHVTJBdS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9Il9tZXRob2RQbHVnaW4iIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3pHTEZBTy1zRWR1SDU5S1NIVjh2Z0EiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il96R1UyQU8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfekdVMkEtLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjEiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfekdVMkJPLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjEiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il96R1UyQmUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJFeHRlbnNpb24iIG1lbWJlckVuZD0iX3pHVTJCLS1zRWR1SDU5S1NIVjh2Z0EgX3pHTEZDZS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il96R1UyQnUtc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfekdVMkJlLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PlRoaXMgYXNzb2NpYXRpb24gZGVmaW5lcyBob3cgTWV0aG9kIFBsdWdpbnMgZXh0ZW5kIG1hbnkgb3RoZXIgTWV0aG9kIFBsdWdpbnMuICBUaGUgZXh0ZW5kaW5nIHBsdWctaW4gY29udGFpbnMgbmV3IG1ldGhvZCBlbGVtZW50cywgZXh0ZW5kcyBleGlzdGluZyBtZXRob2QgZWxlbWVudHMgYW5kIHByb2Nlc3NlcyB1c2luZyBjb250ZW50IGVsZW1lbnQgdmFyaWFiaWxpdHkgbWVjaGFuaXNtcyAoZS5nLiBjb250cmlidXRpb24sIHJlcGxhY2UsIGV0Yy4pLCBwcm92aWRlcyBhZGRpdGlvbmFsIERlbGl2ZXJ5IGFuZCBDYXBhYmlsaXR5IFByb2Nlc3NlcyBmb3IgYSBNZXRob2QgRnJhbWV3b3JrLCBldGMuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfekdVMkItLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0icGx1Z2lucyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfekdMRkFPLXNFZHVINTlLU0hWOHZnQSIgYXNzb2NpYXRpb249Il96R1UyQmUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfekdVMkNPLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfekdVMkNlLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3pHVTJDdS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9InZhcmlhYmlsaXR5U3BlY2lhbGl6YXRpb24iIG1lbWJlckVuZD0iX3pHVTJETy1zRWR1SDU5S1NIVjh2Z0EgX3pHTEZLdS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il96R1UyQy0tc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfekdVMkN1LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PlRoaXMgMS10by1tYW55IGFzc29jaWF0aW9uIGRlZmluZXMgaW4gY29tYmluYXRpb24gd2l0aCB0aGUgdmFyaWFiaWxpdHlUeXBlIGF0dHJpYnV0ZSB0aGF0IGEgbnVtYmVyIG9mIHNwZWNpYWwgVmFyaWFiaWxpdHkgRWxlbWVudHMgb2YgdGhlIHNhbWUgdHlwZSByZXByZXNlbnQgYSB2YXJpYXRpb24gb2YgZXhhY3RseSBvbmUgb3RoZXIgVmFyaWFiaWxpdHkgRWxlbWVudC4gIFNlZSB0aGUgVmFyaWFiaWxpdHkgVHlwZSBlbnVtZXJhdGlvbiBjbGFzcyBmb3IgZGVmaW5pdGlvbnMgZm9yIHRoZSBkaWZmZXJlbnQgdHlwZXMgb2YgdmFyaWFiaWxpdHkuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfekdVMkRPLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0idmFyaWFiaWxpdHlTcGVjaWFsRWxlbWVudCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfekdMRkpPLXNFZHVINTlLU0hWOHZnQSIgYXNzb2NpYXRpb249Il96R1UyQ3Utc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfekdVMkRlLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfekdVMkR1LXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3pHVTJELS1zRWR1SDU5S1NIVjh2Z0EiIG1lbWJlckVuZD0iX3pHTEZMLS1zRWR1SDU5S1NIVjh2Z0EgX3pHVTJFZS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il96R1UyRU8tc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfekdVMkQtLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PlRoaXMgYXNzb2NpYXRpb24gZGVzY3JpYmVzIHRoZSBvcmRlciBpbiB3aGljaCBjb250cmlidXRlZCBTZWN0aW9ucyBzaGFsbCBiZSBpbnNlcnRlZCBpbnRvIGFuICBleGlzdGluZyBsaXN0IG9mIFNlY3Rpb25zIG1haW50YWluZWQgZm9yIGEgQ29udGVudCBEZXNjcmlwdGlvbi48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il96R1UyRWUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJfc2VjdGlvbiIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXh3N1l1LXNFZHVINTlLU0hWOHZnQSIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iX3pHVTJELS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il96R1UyRXUtc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il96R1UyRS0tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkRW5kPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfekpBV2tPLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iUG9pbnQiPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3pKQVdrZS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9IngiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l4VVBjTy1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il96SkFXa3Utc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJ5IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95eFVQY08tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il96SkFXay0tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJHcmFwaEVsZW1lbnQiIGlzQWJzdHJhY3Q9InRydWUiPgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3pKQVdsTy1zRWR1SDU5S1NIVjh2Z0EiIGdlbmVyYWw9Il96SkFXcGUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfekpBV2xlLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0icG9zaXRpb24iIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3pKQVdrTy1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il96SkFXbHUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJjb250YWluZWQiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3pKQVdwZS1zRWR1SDU5S1NIVjh2Z0EiIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiIGFzc29jaWF0aW9uPSJfekpLSDZPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3pKQVdsLS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3pKQVdtTy1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfekpBV21lLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0ibGluayIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfekpLSGtPLXNFZHVINTlLU0hWOHZnQSIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgYXNzb2NpYXRpb249Il96SktIN3Utc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfekpBV211LXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfekpBV20tLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il96SkFXbk8tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJhbmNob3JhZ2UiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3pKQVd3LS1zRWR1SDU5S1NIVjh2Z0EiIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiIGFzc29jaWF0aW9uPSJfekpLSDctLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3pKQVduZS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3pKQVdudS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfekpBV24tLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0ic2VtYW50aWNNb2RlbCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfekpLSHFlLXNFZHVINTlLU0hWOHZnQSIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgYXNzb2NpYXRpb249Il96SktIOXUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfekpBV29PLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjEiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfekpBV29lLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjEiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il96SkFXb3Utc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJEaW1lbnNpb24iPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3pKQVdvLS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9IndpZHRoIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95eFVQY08tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfekpBV3BPLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iaGVpZ2h0IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95eFVQY08tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il96SkFXcGUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJEaWFncmFtRWxlbWVudCIgaXNBYnN0cmFjdD0idHJ1ZSI+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfekpBV3B1LXNFZHVINTlLU0hWOHZnQSIgZ2VuZXJhbD0iX3l4dzdRZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il96SkFXcC0tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJpc1Zpc2libGUiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l4VVBidS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJfekpBV3FPLXNFZHVINTlLU0hWOHZnQSIgdHlwZT0iX3l4VVBidS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICAgIDxib2R5PnRydWU8L2JvZHk+Ci0gICAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il96SkFXcWUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJjb250YWluZXIiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3pKQVdrLS1zRWR1SDU5S1NIVjh2Z0EiIGFzc29jaWF0aW9uPSJfekpLSDZPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3pKQVdxdS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIxIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3pKQVdxLS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfekpBV3JPLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0icmVmZXJlbmNlIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il96SkFXc3Utc0VkdUg1OUtTSFY4dmdBIiBhc3NvY2lhdGlvbj0iX3pKS0g2ZS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il96SkFXcmUtc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il96SkFXcnUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3pKQVdyLS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9InByb3BlcnR5IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il96SkFXdWUtc0VkdUg1OUtTSFY4dmdBIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBhc3NvY2lhdGlvbj0iX3pKS0g2dS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il96SkFXc08tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il96SkFXc2Utc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfekpBV3N1LXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iUmVmZXJlbmNlIj4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il96SkFXcy0tc0VkdUg1OUtTSFY4dmdBIiBnZW5lcmFsPSJfekpBV3BlLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3pKQVd0Ty1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9ImlzSW5kaXZpZHVhbFJlcHJlc2VudGF0aW9uIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95eFVQYnUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxCb29sZWFuIiB4bWk6aWQ9Il96SkFXdGUtc0VkdUg1OUtTSFY4dmdBIiB0eXBlPSJfeXhVUGJ1LXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il96SkFXdHUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJyZWZlcmVuY2VkIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il96SkFXcGUtc0VkdUg1OUtTSFY4dmdBIiBhc3NvY2lhdGlvbj0iX3pKS0g2ZS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il96SkFXdC0tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iMSIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il96SkFXdU8tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iMSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3pKQVd1ZS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9IlByb3BlcnR5Ij4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il96SkFXdXUtc0VkdUg1OUtTSFY4dmdBIiBnZW5lcmFsPSJfekpBV3BlLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3pKQVd1LS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9ImtleSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXhVUGFPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3pKQVd2Ty1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIxIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3pKQVd2ZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iX3pKQVd2dS1zRWR1SDU5S1NIVjh2Z0EiIHR5cGU9Il95eFVQYU8tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3pKQVd2LS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9InZhbHVlIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95eFVQYU8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfekpBV3dPLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjEiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfekpBV3dlLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfekpBV3d1LXNFZHVINTlLU0hWOHZnQSIgdHlwZT0iX3l4VVBhTy1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il96SkFXdy0tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJHcmFwaENvbm5lY3RvciI+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfekpBV3hPLXNFZHVINTlLU0hWOHZnQSIgZ2VuZXJhbD0iX3pKQVdrLS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il96SkFXeGUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJncmFwaEVsZW1lbnQiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3pKQVdrLS1zRWR1SDU5S1NIVjh2Z0EiIGFzc29jaWF0aW9uPSJfekpLSDctLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3pKQVd4dS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIxIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3pKQVd4LS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIxIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3pKQVd5Ty1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9ImdyYXBoRWRnZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfekpBV3ktLXNFZHVINTlLU0hWOHZnQSIgYXNzb2NpYXRpb249Il96SktIOE8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfekpBV3llLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfekpBV3l1LXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3pKQVd5LS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9IkdyYXBoRWRnZSI+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfekpBV3pPLXNFZHVINTlLU0hWOHZnQSIgZ2VuZXJhbD0iX3pKQVdrLS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il96SkFXemUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJhbmNob3IiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3pKQVd3LS1zRWR1SDU5S1NIVjh2Z0EiIGFzc29jaWF0aW9uPSJfekpLSDhPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3pKQVd6dS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIyIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3pKQVd6LS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIyIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3pKQVcwTy1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9IndheXBvaW50cyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfekpBV2tPLXNFZHVINTlLU0hWOHZnQSIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgYXNzb2NpYXRpb249Il96SktIOGUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfekpBVzBlLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfekpBVzB1LXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjIiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il96SktIa08tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJEaWFncmFtTGluayI+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfekpLSGtlLXNFZHVINTlLU0hWOHZnQSIgZ2VuZXJhbD0iX3pKQVdwZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il96SktIa3Utc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJ6b29tIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95eFVQY08tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfekpLSGstLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0idmlld3BvcnQiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3pKQVdrTy1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il96SktIbE8tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJncmFwaEVsZW1lbnQiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3pKQVdrLS1zRWR1SDU5S1NIVjh2Z0EiIGFzc29jaWF0aW9uPSJfekpLSDd1LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3pKS0hsZS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIxIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3pKS0hsdS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIxIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3pKS0hsLS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9ImRpYWdyYW0iIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3pKS0huZS1zRWR1SDU5S1NIVjh2Z0EiIGFzc29jaWF0aW9uPSJfekpLSDllLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3pKS0htTy1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIxIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3pKS0htZS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIxIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfekpLSG11LXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iR3JhcGhOb2RlIj4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il96SktIbS0tc0VkdUg1OUtTSFY4dmdBIiBnZW5lcmFsPSJfekpBV2stLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3pKS0huTy1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9InNpemUiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3pKQVdvdS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3pKS0huZS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9IkRpYWdyYW0iPgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3pKS0hudS1zRWR1SDU5S1NIVjh2Z0EiIGdlbmVyYWw9Il96SktIbXUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfekpLSG4tLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iem9vbSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXhVUGNPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3pKS0hvTy1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIxIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3pKS0hvZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfekpLSG91LXNFZHVINTlLU0hWOHZnQSIgbmFtZT0idmlld3BvaW50IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il96SkFXa08tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfekpLSG8tLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iZGlhZ3JhbUxpbmsiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3pKS0hrTy1zRWR1SDU5S1NIVjh2Z0EiIGFzc29jaWF0aW9uPSJfekpLSDllLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3pKS0hwTy1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3pKS0hwZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfekpLSHB1LXNFZHVINTlLU0hWOHZnQSIgbmFtZT0ibmFtZXNwYWNlIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il96SktIcWUtc0VkdUg1OUtTSFY4dmdBIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBhc3NvY2lhdGlvbj0iX3pKVFJnTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il96SktIcC0tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iMSIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il96SktIcU8tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iMSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3pKS0hxZS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9IlNlbWFudGljTW9kZWxCcmlkZ2UiIGlzQWJzdHJhY3Q9InRydWUiPgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3pKS0hxdS1zRWR1SDU5S1NIVjh2Z0EiIGdlbmVyYWw9Il96SkFXcGUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfekpLSHEtLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0icHJlc2VudGF0aW9uIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95eFVQYU8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfekpLSHJPLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjEiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfekpLSHJlLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfekpLSHJ1LXNFZHVINTlLU0hWOHZnQSIgdHlwZT0iX3l4VVBhTy1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfekpLSHItLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iZ3JhcGhFbGVtZW50IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il96SkFXay0tc0VkdUg1OUtTSFY4dmdBIiBhc3NvY2lhdGlvbj0iX3pKS0g5dS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il96SktIc08tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iMSIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il96SktIc2Utc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3pKS0hzdS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9ImRpYWdyYW0iIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3pKS0huZS1zRWR1SDU5S1NIVjh2Z0EiIGFzc29jaWF0aW9uPSJfekpUUmdPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3pKS0hzLS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIxIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3pKS0h0Ty1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il96SktIdGUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJTaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudCI+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfekpLSHR1LXNFZHVINTlLU0hWOHZnQSIgZ2VuZXJhbD0iX3pKS0hxZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il96SktIdC0tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJ0eXBlSW5mbyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXhVUGFPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3pKS0h1Ty1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIxIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3pKS0h1ZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iX3pKS0h1dS1zRWR1SDU5S1NIVjh2Z0EiIHR5cGU9Il95eFVQYU8tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfekpLSHUtLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iVU1BU2VtYW50aWNNb2RlbEJyaWRnZSI+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfekpLSHZPLXNFZHVINTlLU0hWOHZnQSIgZ2VuZXJhbD0iX3pKS0hxZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il96SktIdmUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJlbGVtZW50IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95eHc3UWUtc0VkdUg1OUtTSFY4dmdBIiBhc3NvY2lhdGlvbj0iX3pKVFJoZS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il96SktIdnUtc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iMSIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il96SktIdi0tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iMSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3pKS0h3Ty1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9IkNvcmVTZW1hbnRpY01vZGVsQnJpZGdlIj4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il96SktId2Utc0VkdUg1OUtTSFY4dmdBIiBnZW5lcmFsPSJfekpLSHFlLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3pKS0h3dS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9ImVsZW1lbnQiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l4S2ZEZS1zRWR1SDU5S1NIVjh2Z0EiIGFzc29jaWF0aW9uPSJfekpUUmdlLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3pKS0h3LS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIxIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3pKS0h4Ty1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIxIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfekpLSHhlLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iTGVhZkVsZW1lbnQiIGlzQWJzdHJhY3Q9InRydWUiPgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3pKS0h4dS1zRWR1SDU5S1NIVjh2Z0EiIGdlbmVyYWw9Il96SkFXcGUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il96SktIeC0tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJUZXh0RWxlbWVudCI+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfekpLSHlPLXNFZHVINTlLU0hWOHZnQSIgZ2VuZXJhbD0iX3pKS0h4ZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il96SktIeWUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJ0ZXh0IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95eFVQYU8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfekpLSHl1LXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjEiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfekpLSHktLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfekpLSHpPLXNFZHVINTlLU0hWOHZnQSIgdHlwZT0iX3l4VVBhTy1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il96SktIemUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJJbWFnZSI+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfekpLSHp1LXNFZHVINTlLU0hWOHZnQSIgZ2VuZXJhbD0iX3pKS0h4ZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il96SktIei0tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJ1cmkiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l4VVBadS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il96SktIME8tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iMSIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il96SktIMGUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il96SktIMHUtc0VkdUg1OUtTSFY4dmdBIiB0eXBlPSJfeXhVUFp1LXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IiIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il96SktIMC0tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJtaW1lVHlwZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXhVUGFPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3pKS0gxTy1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIxIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3pKS0gxZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iX3pKS0gxdS1zRWR1SDU5S1NIVjh2Z0EiIHR5cGU9Il95eFVQYU8tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfekpLSDEtLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iR3JhcGhpY1ByaW1pdGl2ZSIgaXNBYnN0cmFjdD0idHJ1ZSI+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfekpLSDJPLXNFZHVINTlLU0hWOHZnQSIgZ2VuZXJhbD0iX3pKS0h4ZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3pKS0gyZS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9IlBvbHlsaW5lIj4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il96SktIMnUtc0VkdUg1OUtTSFY4dmdBIiBnZW5lcmFsPSJfekpLSDEtLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3pKS0gyLS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9ImNsb3NlZCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXhVUGJ1LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9Il96SktIM08tc0VkdUg1OUtTSFY4dmdBIiB0eXBlPSJfeXhVUGJ1LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgICAgPGJvZHk+dHJ1ZTwvYm9keT4KLSAgICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3pKS0gzZS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9IndheXBvaW50cyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfekpBV2tPLXNFZHVINTlLU0hWOHZnQSIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgYXNzb2NpYXRpb249Il96SlRSaWUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfekpLSDN1LXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfekpLSDMtLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjIiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il96SktINE8tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJFbGxpcHNlIj4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il96SktINGUtc0VkdUg1OUtTSFY4dmdBIiBnZW5lcmFsPSJfekpLSDEtLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3pKS0g0dS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9ImNlbnRlciIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfekpBV2tPLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3pKS0g0LS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9InJhZGl1c1giIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l4VVBjTy1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il96SktINU8tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJyYWRpdXNZIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95eFVQY08tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfekpLSDVlLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0icm90YXRpb24iIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l4VVBjTy1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il96SktINXUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJzdGFydEFuZ2xlIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95eFVQY08tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfekpLSDUtLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iZW5kQW5nbGUiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l4VVBjTy1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3pKS0g2Ty1zRWR1SDU5S1NIVjh2Z0EiIG1lbWJlckVuZD0iX3pKQVdsdS1zRWR1SDU5S1NIVjh2Z0EgX3pKQVdxZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3pKS0g2ZS1zRWR1SDU5S1NIVjh2Z0EiIG1lbWJlckVuZD0iX3pKQVd0dS1zRWR1SDU5S1NIVjh2Z0EgX3pKQVdyTy1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3pKS0g2dS1zRWR1SDU5S1NIVjh2Z0EiIG1lbWJlckVuZD0iX3pKQVdyLS1zRWR1SDU5S1NIVjh2Z0EgX3pKS0g2LS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iX3pKS0g2LS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9Il9kaWFncmFtRWxlbWVudCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfekpBV3BlLXNFZHVINTlLU0hWOHZnQSIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iX3pKS0g2dS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il96SktIN08tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iMSIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il96SktIN2Utc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iMSIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3pKS0g3dS1zRWR1SDU5S1NIVjh2Z0EiIG1lbWJlckVuZD0iX3pKQVdtZS1zRWR1SDU5S1NIVjh2Z0EgX3pKS0hsTy1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3pKS0g3LS1zRWR1SDU5S1NIVjh2Z0EiIG1lbWJlckVuZD0iX3pKQVduTy1zRWR1SDU5S1NIVjh2Z0EgX3pKQVd4ZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3pKS0g4Ty1zRWR1SDU5S1NIVjh2Z0EiIG1lbWJlckVuZD0iX3pKQVd5Ty1zRWR1SDU5S1NIVjh2Z0EgX3pKQVd6ZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3pKS0g4ZS1zRWR1SDU5S1NIVjh2Z0EiIG1lbWJlckVuZD0iX3pKQVcwTy1zRWR1SDU5S1NIVjh2Z0EgX3pKS0g4dS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iX3pKS0g4dS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9Il9ncmFwaEVkZ2UiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3pKQVd5LS1zRWR1SDU5S1NIVjh2Z0EiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il96SktIOGUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfekpLSDgtLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjEiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfekpLSDlPLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjEiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il96SktIOWUtc0VkdUg1OUtTSFY4dmdBIiBtZW1iZXJFbmQ9Il96SktIby0tc0VkdUg1OUtTSFY4dmdBIF96SktIbC0tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il96SktIOXUtc0VkdUg1OUtTSFY4dmdBIiBtZW1iZXJFbmQ9Il96SkFXbi0tc0VkdUg1OUtTSFY4dmdBIF96SktIci0tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il96SlRSZ08tc0VkdUg1OUtTSFY4dmdBIiBtZW1iZXJFbmQ9Il96SktIcHUtc0VkdUg1OUtTSFY4dmdBIF96SktIc3Utc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il96SlRSZ2Utc0VkdUg1OUtTSFY4dmdBIiBtZW1iZXJFbmQ9Il96SktId3Utc0VkdUg1OUtTSFY4dmdBIF96SlRSZ3Utc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il96SlRSZ3Utc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJfY29yZVNlbWFudGljTW9kZWxCcmlkZ2UiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3pKS0h3Ty1zRWR1SDU5S1NIVjh2Z0EiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il96SlRSZ2Utc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfekpUUmctLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfekpUUmhPLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3pKVFJoZS1zRWR1SDU5S1NIVjh2Z0EiIG1lbWJlckVuZD0iX3pKS0h2ZS1zRWR1SDU5S1NIVjh2Z0EgX3pKVFJodS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iX3pKVFJodS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9Il91TUFTZW1hbnRpY01vZGVsQnJpZGdlIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il96SktIdS0tc0VkdUg1OUtTSFY4dmdBIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfekpUUmhlLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3pKVFJoLS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3pKVFJpTy1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il96SlRSaWUtc0VkdUg1OUtTSFY4dmdBIiBtZW1iZXJFbmQ9Il96SktIM2Utc0VkdUg1OUtTSFY4dmdBIF96SlRSaXUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il96SlRSaXUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJfcG9seWxpbmUiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3pKS0gyZS1zRWR1SDU5S1NIVjh2Z0EiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il96SlRSaWUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfekpUUmktLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjEiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfekpUUmpPLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjEiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il96RHBWaXUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJQcm9jZXNzUGFja2FnZSI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3pEcFZpLS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il96RHBWaXUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+UHJvY2VzcyBQYWNrYWdlIGlzIGEgc3BlY2lhbCBNZXRob2QgUGFja2FnZSB0aGF0IGNvbnRhaW5zIFByb2Nlc3MgRWxlbWVudHMsIG9ubHkuCi1BIGtleSBzZXBhcmF0aW9uIG9mIGNvbmNlcm5zIGluIFVNQSBpcyB0aGUgZGlzdGluY3Rpb24gYmV0d2VlbiBNZXRob2QgQ29udGVudCBhbmQgUHJvY2Vzcy4gIFRoaXMgc2VwYXJhdGlvbiBpcyBlbmZvcmNlZCBieSBzcGVjaWFsIHBhY2thZ2UgdHlwZXMsIHdoaWNoIGRvIG5vdCBhbGxvdyB0aGUgbWl4aW5nIG9mIG1ldGhvZCBjb250ZW50IHdpdGggcHJvY2Vzc2VzLgotPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfekRwVmpPLXNFZHVINTlLU0hWOHZnQSIgZ2VuZXJhbD0iX3k0ZUFNZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il96RHBWamUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJwcm9jZXNzRWxlbWVudHMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3k3dlhPTy1zRWR1SDU5S1NIVjh2Z0EiIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiIGFzc29jaWF0aW9uPSJfekRwVnFlLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3pEcFZqdS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3pEcFZqLS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfekxpdE1PLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iZGlhZ3JhbXMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3pKS0huZS1zRWR1SDU5S1NIVjh2Z0EiIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiIGFzc29jaWF0aW9uPSJfekxpdE0tLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3pMaXRNZS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3pMaXRNdS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il96TGl0TS0tc0VkdUg1OUtTSFY4dmdBIiBtZW1iZXJFbmQ9Il96TGl0TU8tc0VkdUg1OUtTSFY4dmdBIF96TGl0TmUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfekxpdE5PLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3pMaXRNLS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5UaGlzIGFzc29jaWF0aW9uIGlzIHRoZSBvbmx5IG1lbWJlciBvZiB0aGUgdW1hZGlhZ3JhbXMgcGFja2FnZS4gIEl0IGRlZmluZXMgdGhhdCBEaWFncmFtcyBjYW4gYmUgcGFja2FnZWQgaW4gUHJvY2VzcyBQYWNrYWdlcy48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il96TGl0TmUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJfcHJvY2Vzc1BhY2thZ2UiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3pEcFZpdS1zRWR1SDU5S1NIVjh2Z0EiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il96TGl0TS0tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfekxpdE51LXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjEiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfekxpdE4tLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjEiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il96R0xGQU8tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJNZXRob2RQbHVnaW4iPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il96R0xGQWUtc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfekdMRkFPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PkEgTWV0aG9kIFBsdWdpbiBpcyBhIE1ldGhvZCBFbGVtZW50IHRoYXQgcmVwcmVzZW50cyBhIHBoeXNpY2FsIGNvbnRhaW5lciBmb3IgTWV0aG9kIFBhY2thZ2VzLiAgSXQgZGVmaW5lcyBhIGdyYW51bGFyaXR5IGxldmVsIGZvciB0aGUgbW9kdWxhcml6YXRpb24gYW5kIG9yZ2FuaXphdGlvbiBvZiBtZXRob2QgY29udGVudCBhbmQgcHJvY2Vzc2VzLiAgQSBNZXRob2QgUGx1Z2luIGNhbiBleHRlbmQgbWFueSBvdGhlciBNZXRob2QgUGx1Z2lucyBhbmQgaXQgY2FuIGJlIGV4dGVuZGVkIGJ5IG1hbnkgTWV0aG9kIFBsdWdpbnMuICBJdCBjYW4gYWxzbyBiZSB1c2VkIHN0YW5kLWFsb25lLCBpLmUuIHdpdGggbm8gRXh0ZW5zaW9uIHJlbGF0aW9uc2hpcCB0byBvdGhlciBwbHVnLWlucy4KLU1ldGhvZCBQbHVnaW4gY29uY2VwdHVhbGx5IHJlcHJlc2VudHMgYSB1bml0IGZvciBjb25maWd1cmF0aW9uLCBtb2R1bGFyaXphdGlvbiwgZXh0ZW5zaW9uLCBwYWNrYWdpbmcsIGFuZCBkZXBsb3ltZW50IG9mIG1ldGhvZCBjb250ZW50IGFuZCBwcm9jZXNzZXMuICBBIFByb2Nlc3MgRW5naW5lZXIgc2hhbGwgZGVzaWduIGhpcyBQbHVnaW5zIGFuZCBhbGxvY2F0ZSBoaXMgY29udGVudCB0byB0aGVzZSBQbHVnaW5zIHdpdGggcmVxdWlyZW1lbnRzIGZvciBleHRlbnNpYmlsaXR5LCBtb2R1bGFyaXR5LCByZXVzZSwgYW5kIG1haW50YWluYWJpbGl0eSBpbiBtaW5kLgotU3BlY2lhbCBleHRlbnNpYmlsaXR5IG1lY2hhbmlzbXMgZGVmaW5lZCBmb3IgdGhlIG1ldGEtY2xhc3NlcyBWYXJpYWJpbGl0eSBFbGVtZW50IGFuZCBQcm9jZXNzIENvbnRyaWJ1dGlvbiBhbGxvdyBQbHVnaW4gY29udGVudCB0byBkaXJlY3RseSBjb250cmlidXRlIG5ldyBjb250ZW50LCByZXBsYWNlIGV4aXN0aW5nIGNvbnRlbnQsIG9yIHRvIGNyb3NzLXJlZmVyZW5jZSB0byBhbnkgQ29udGVudCBFbGVtZW50IG9yIFByb2Nlc3Mgd2l0aGluIGFub3RoZXIgUGx1Z2luIHRoYXQgaXQgZXh0ZW5kcy4gIFNpbWlsYXIgdG8gVU1MIDIuMCdzICdwYWNrYWdlIG1lcmdlJyBtZWNoYW5pc20gdHJhbnNmb3JtYXRpb24gaW50ZXJwcmV0YXRpb25zLCBpbnRlcnByZXRpbmcgdGhlc2UgTWV0aG9kIFBsdWdpbiBtZWNoYW5pc21zIHJlc3VsdHMgaW50byBuZXcgZXh0ZW5kZWQgTWV0aG9kIENvbnRlbnQgYW5kIFByb2Nlc3Nlcy4KLTwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3pHTEZBLS1zRWR1SDU5S1NIVjh2Z0EiIGdlbmVyYWw9Il95eFVQVk8tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfek43UzBPLXNFZHVINTlLU0hWOHZnQSIgZ2VuZXJhbD0iX3pON1MwdS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il96R0xGQk8tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJ1c2VyQ2hhbmdlYWJsZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXhVUGJ1LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9Il96R0xGQmUtc0VkdUg1OUtTSFY4dmdBIiB0eXBlPSJfeXhVUGJ1LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgICAgPGJvZHk+dHJ1ZTwvYm9keT4KLSAgICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3pHTEZCdS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9Im1ldGhvZFBhY2thZ2VzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95NGVBTWUtc0VkdUg1OUtTSFY4dmdBIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBhc3NvY2lhdGlvbj0iX3pHVTJBTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il96R0xGQi0tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il96R0xGQ08tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iMSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il96R0xGQ2Utc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJiYXNlcyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfekdMRkFPLXNFZHVINTlLU0hWOHZnQSIgYXNzb2NpYXRpb249Il96R1UyQmUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfekdMRkN1LXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfekdMRkMtLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3pEcFZjTy1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9IlByb2Nlc3NDb21wb25lbnQiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il96RHBWY2Utc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfekRwVmNPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PkEgUHJvY2VzcyBDb21wb25lbnQgaXMgYSBzcGVjaWFsIFByb2Nlc3MgUGFja2FnZSB0aGF0IGFwcGxpZXMgdGhlIHByaW5jaXBsZXMgb2YgZW5jYXBzdWxhdGlvbi4gIEEgUHJvY2VzcyBDb21wb25lbnQgcmVhbGl6ZXMgb25lIG9yIG1vcmUgSW50ZXJmYWNlcyB3aGljaCBzcGVjaWZ5IGlucHV0cyBhbmQgb3V0cHV0cyBvZiB0aGUgY29tcG9uZW50LiBUaGVyZSBtaWdodCBiZSBtYW55IGNvbXBvbmVudHMgcmVhbGl6aW5nIHRoZSBzYW1lIGludGVyZmFjZXMsIGJ1dCB1c2luZyBkaWZmZXJlbnQgdGVjaG5pcXVlcyB0byBhY2hpZXZlIHNpbWlsYXIgb3V0cHV0cyBmb3Igc2ltaWxhciBpbnB1dHMuICBXaGVyZWFzIHRoZSBDb21wb25lbnQgSW50ZXJmYWNlcyByZXByZXNlbnQgY29tcG9uZW50IHNwZWNpZmljYXRpb25zIChibGFjayBib3ggZGVzY3JpcHRpb25zIG9mIHRoZSBjb21wb25lbnQpLCBnb29kIGNhbmRpZGF0ZXMgZm9yIGNvbXBvbmVudCByZWFsaXphdGlvbnMgY2FuIGJlIGZvdW5kIGluIENhcGFiaWxpdHkgUGF0dGVybnMgKHdoaXRlIGJveCBkZXNjcmlwdGlvbnMgZm9yIHRoZSBjb21wb25lbnQpLgotVU1BIHN1cHBvcnRzIHJlcGxhY2VhYmxlIGFuZCByZXVzYWJsZSBQcm9jZXNzIENvbXBvbmVudHMgcmVhbGl6aW5nIHRoZSBwcmluY2lwbGVzIG9mIGVuY2Fwc3VsYXRpb24uIENlcnRhaW4gc2l0dWF0aW9ucyBpbiBhIHNvZnR3YXJlIGRldmVsb3BtZW50IHByb2plY3QgbWlnaHQgcmVxdWlyZSB0aGF0IGNvbmNyZXRlIHJlYWxpemF0aW9ucyBvZiBwYXJ0cyBvZiB0aGUgcHJvY2VzcyByZW1haW4gdW5kZWNpZGVkIG9yIHdpbGwgYmUgZGVjaWRlZCBieSB0aGUgZXhlY3V0aW5nIHRlYW0gaXRzZWxmIChlLmcuIGluIG91dHNvdXJjaW5nIHNpdHVhdGlvbnMpLiAgVU1BIHByb3ZpZGVzIGEgdW5pcXVlIGNvbXBvbmVudCBjb25jZXB0IGRlZmluaW5nIGludGVyZmFjZXMgZm9yIHdvcmsgcHJvZHVjdCBpbnB1dCBhbmQgb3V0cHV0LCBhbGxvd2luZyB0cmVhdGluZyB0aGUgYWN0dWFsIGRlZmluaXRpb24gb2YgdGhlIHdvcmsgdGhhdCBwcm9kdWNlcyB0aGUgb3V0cHV0cyBhcyBhICZxdW90O2JsYWNrIGJveCZxdW90Oy4gIEF0IGFueSBwb2ludCBkdXJpbmcgYSBwcm9qZWN0IHRoZSBjb21wb25lbnQgJnF1b3Q7cmVhbGl6YXRpb24mcXVvdDsgZGV0YWlsaW5nIHRoZSB3b3JrIGNhbiBiZSBhZGRlZCB0byB0aGUgcHJvY2Vzcy4gIFRoZSBjb21wb25lbnQgYXBwcm9hY2ggYWxzbyBhbGxvd3MgdGhhdCBkaWZmZXJlbnQgc3R5bGVzIG9yIHRlY2huaXF1ZXMgb2YgZG9pbmcgd29yayBjYW4gYmUgcmVwbGFjZWQgd2l0aCBvbmUgYW5vdGhlci4gIEZvciBleGFtcGxlLCBhIHNvZnR3YXJlIGNvZGUgb3V0cHV0IG9mIGEgY29tcG9uZW50IGNvdWxkIGJlIHByb2R1Y2VkIHdpdGggYSBtb2RlbC1kcml2ZW4gZGV2ZWxvcG1lbnQgb3IgYSBjb2RlLWNlbnRyaWMgdGVjaG5pcXVlLiAgVGhlIGNvbXBvbmVudCBjb25jZXB0IGVuY2Fwc3VsYXRlcyB0aGUgYWN0dWFsIHdvcmsgYW5kIGxldHMgdGhlIGRldmVsb3BtZW50IHRlYW0gY2hvb3NlIHRoZSBhcHByb3ByaWF0ZSB0ZWNobmlxdWUgYW5kIGZpbGwgdGhlIGNvbXBvbmVudCdzIHJlYWxpemF0aW9uIHdpdGggdGhlaXIgY2hvaWNlIG9mIEFjdGl2aXRpZXMgdGhhdCBwcm9kdWNlIHRoZSByZXF1aXJlZCBvdXRwdXRzLgotPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfekRwVmN1LXNFZHVINTlLU0hWOHZnQSIgZ2VuZXJhbD0iX3pEcFZpdS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iX3pEcFZjLS1zRWR1SDU5S1NIVjh2Z0EiIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy91bWwyLzIuMC4wL1VNTCI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfekRwVmRPLXNFZHVINTlLU0hWOHZnQSIga2V5PSJleHRlbmQiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2dlbmVyYWxpemF0aW9uPgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3pON1MwZS1zRWR1SDU5S1NIVjh2Z0EiIGdlbmVyYWw9Il96TjdTMHUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfekRwVmRlLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iaW50ZXJmYWNlcyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfekRwVmdlLXNFZHVINTlLU0hWOHZnQSIgYXNzb2NpYXRpb249Il96RHBWa08tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfekRwVmR1LXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfekRwVmQtLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjEiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfekRwVmVPLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0icHJvY2VzcyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeS00S09lLXNFZHVINTlLU0hWOHZnQSIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgYXNzb2NpYXRpb249Il96RHBWcE8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfekRwVmVlLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjEiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfekRwVmV1LXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjEiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il96TjdTMHUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJNZXRob2RVbml0IiBpc0Fic3RyYWN0PSJ0cnVlIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfek43UzAtLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3pON1MwdS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5BIE1ldGhvZCBVbml0IGlzIGEgc3BlY2lhbCBNZXRob2QgRWxlbWVudCB0aGF0IHNoYWxsIGJlIG1haW50YWluZWQgaW4gYSBNZXRob2QgTGlicmFyeSBhcyBhIHNlcGFyYXRlIHVuaXQgb2YgY29udHJvbC48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il96TjdTMU8tc0VkdUg1OUtTSFY4dmdBIiBnZW5lcmFsPSJfeXh3N1FlLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3pON1MxZS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9ImF1dGhvcnMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l4VVBhTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3pON1MxdS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il96TjdTMWUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgICA8Ym9keT5FdmVyeSBNZXRob2QgVW5pdCBpcyBiZWluZyBjcmVhdGVkIGFuZCBvd25lZCBieSBhbiBhdXRob3Igb3IgYXV0aG9yaW5nIHRlYW0uPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfek43UzEtLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjEiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfek43UzJPLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfek43UzJlLXNFZHVINTlLU0hWOHZnQSIgdHlwZT0iX3l4VVBhTy1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfek43UzJ1LXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iY2hhbmdlRGF0ZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXhVUFpPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfek43UzItLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3pON1MydS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICAgIDxib2R5PlRoZSBkYXRlIHRoZSBsYXN0IGNoYW5nZSB0aGF0IHJlc3VsdGVkIGludG8gdGhpcyB2ZXJzaW9uIGhhcyBiZWVuIG1hZGUuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfek43UzNPLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjEiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfek43UzNlLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il96TjdTM3Utc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJjaGFuZ2VEZXNjcmlwdGlvbiIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXhVUGFPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfek43UzMtLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3pON1MzdS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICAgIDxib2R5PlRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgbGFzdCBjaGFuZ2UgdGhhdCByZXN1bHRlZCBpbnRvIHRoaXMgdmVyc2lvbi48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il96TjdTNE8tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iMSIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il96TjdTNGUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il96TjdTNHUtc0VkdUg1OUtTSFY4dmdBIiB0eXBlPSJfeXhVUGFPLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IiIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il96TjdTNC0tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJ2ZXJzaW9uIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95eFVQYU8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il96TjdTNU8tc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfek43UzQtLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgICAgPGJvZHk+RXZlcnkgUGFja2FnZSBoYXMgYSB2ZXJzaW9uIG51bWJlciB1c2VkIHRvIHRyYWNrIGNoYW5nZXMuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfek43UzVlLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjEiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfek43UzV1LXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfek43UzUtLXNFZHVINTlLU0hWOHZnQSIgdHlwZT0iX3l4VVBhTy1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfek43UzZPLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iY29weXJpZ2h0U3RhdGVtZW50IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95ejEtOC0tc0VkdUg1OUtTSFY4dmdBIiBhc3NvY2lhdGlvbj0iX3pPRWN3ZS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il96TjdTNmUtc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iMSIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il96TjdTNnUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfeXh3N1YtLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iQ29udGVudERlc2NyaXB0aW9uIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeXh3N1dPLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3l4dzdWLS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5Db250ZW50IERlc2NyaXB0aW9uIGlzIGEgTWV0aG9kIEVsZW1lbnQgdGhhdCBpcyB1c2VkIHRvIHN0b3JlIHRoZSB0ZXh0dWFsIGRlc2NyaXB0aW9uIGZvciBhIENvbnRlbnQgRWxlbWVudC4gIEl0IGRlZmluZXMgc3RhbmRhcmQgYXR0cmlidXRlcyBhcHBsaWNhYmxlIGZvciBhbGwgQ29udGVudCBFbGVtZW50IHR5cGVzLiAgU3BlY2lmaWMgQ29udGVudCBFbGVtZW50IHN1Yi10eXBlcyBjYW4gZGVmaW5lIHRoZWlyIG93biBtYXRjaGluZyBDb250ZW50IERlc2NyaXB0aW9uIHN1Yi10eXBlcy4gPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfek9FY3dPLXNFZHVINTlLU0hWOHZnQSIgZ2VuZXJhbD0iX3pON1MwdS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il95eHc3V3Utc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJtYWluRGVzY3JpcHRpb24iIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l4VVBhTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3l4dzdXLS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95eHc3V3Utc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgICA8Ym9keT5UaGlzIGF0dHJpYnV0ZSBzdG9yZSB0aGUgbWFpbiBkZXNjcmlwdGl2ZSB0ZXh0IGZvciB0aGUgQ29udGVudCBFbGVtZW50LiAgQWxsIHRleHQgdGhhdCBpcyBub3QgcGFydCBvZiBhbnkgb2YgdGhlIG1vcmUgc3BlY2lmaWMgYXR0cmlidXRlcyBzaGFsbCBiZSBzdG9yZWQgaGVyZS4gIElmIHRoZSBDb250ZW50IERlc2NyaXB0aW9uIGlzIGRpdmlkZWQgaW50byBzZWN0aW9ucyB1c2luZyB0aGUgU2VjdGlvbiBjbGFzcywgdGhlbiBvbmx5IHRoZSB0ZXh0IGZyb20gdGhlICdzdGFydCcgb2YgdGhlIGNvbnRlbnQgZGVzY3JpcHRpb24gdG8gdGhlIGZpcnN0IHNlY3Rpb24gd2lsbCBiZSBzdG9yZWQgaGVyZSAoc2ltaWxhciB0byBhIG5vcm1hbCBkb2N1bWVudCB3aGVyZSB5b3UgY2FuIHBsYWNlIHRleHQgYmV0d2VlbiBpdHMgYmVnaW5uaW5nIHRvIGl0cyBmaXJzdCBkaWN0aW9uIGhlYWRpbmcpLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3l4dzdYTy1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIxIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3l4dzdYZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iX3l4dzdYdS1zRWR1SDU5S1NIVjh2Z0EiIHR5cGU9Il95eFVQYU8tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3l4dzdYLS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9InNlY3Rpb25zIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95eHc3WXUtc0VkdUg1OUtTSFY4dmdBIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBhc3NvY2lhdGlvbj0iX3l4dzdqLS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95eHc3WU8tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95eHc3WWUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3kxTURNTy1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9ImV4dGVybmFsSWQiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l4VVBhTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3kxTURNZS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95MU1ETU8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgICA8Ym9keT5BbiBleHRlcm5hbCB2aXNpYmxlIG51bWJlciB0aGF0IGlzIHVzZWQgdG8gcmVmZXJlbmNlIHRoaXMgYXJ0aWZhY3QuIFVzZWQgbGlrZSBhIHN5bm9ueW0uPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeTFNRE11LXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjEiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeTFNRE0tLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfeTFNRE5PLXNFZHVINTlLU0hWOHZnQSIgdHlwZT0iX3l4VVBhTy1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfeTFNRE5lLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0ia2V5Q29uc2lkZXJhdGlvbnMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l4VVBhTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3kxTUROdS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95MU1ETmUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgICA8Ym9keT5LZXkgQ29uc2lkZXJhdGlvbnMgcHJvdmlkZXMgYWR2aXNlIGFuZCBndWlkYW5jZSBvZiBhIGNyaXRpY2FsIG5hdHVyZSBmb3IgdGhlIGNvbnRlbnQgZWxlbWVudCBhcyB3ZWxsIGFzIHdhcm5pbmdzLCBjYXV0aW9ucywgcGl0ZmFsbHMsIGRhbmdlcnMuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeTFNRE4tLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjEiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeTFNRE9PLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfeTFNRE9lLXNFZHVINTlLU0hWOHZnQSIgdHlwZT0iX3l4VVBhTy1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il96T0Vjd2Utc0VkdUg1OUtTSFY4dmdBIiBtZW1iZXJFbmQ9Il96TjdTNk8tc0VkdUg1OUtTSFY4dmdBIF96T0Vjdy0tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfek9FY3d1LXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3pPRWN3ZS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5BIE1ldGhvZCBVbml0IGNhbiBoYXZlIGV4YWN0bHkgb25lIENvcHlyaWdodCBTdGF0ZW1lbnQgc2VjdXJpbmcgdGhlIGludGVsbGVjdHVhbCBjYXBpdGFsIGl0IHJlcHJlc2VudHMuICBJdCB3aWxsIGJlIHB1Ymxpc2hlZCB3aXRoIHRoZSByZXNwZWN0aXZlIGNvbmNyZXRlIEVsZW1lbnQuICBOb3RlLCB0aGF0IENvcHlyaWdodCBTdGF0ZW1lbnRzIGZvciBNZXRob2QgTGlicmFyaWVzIGFuZCBNZXRob2QgUGx1Z2lucyBkZWZpbmUgdGhlIGRlZmF1bHQgc3RhdGVtZW50IGZvciBpdHMgY29udGFpbmVkIGVsZW1lbnRzLCB3aGljaCBjYW4gYmUgJ292ZXJ3cml0dGVuJyB3aXRoIHJldmlzZWQgc3RhdGVtZW50cyBmb3IgZXZlcnkgQ29udGVudCBEZXNjcmlwdGlvbiBvciBQcm9jZXNzIENvbXBvbmVudC48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il96T0Vjdy0tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJfbWV0aG9kVW5pdCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfek43UzB1LXNFZHVINTlLU0hWOHZnQSIgYXNzb2NpYXRpb249Il96T0Vjd2Utc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfek9FY3hPLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfek9FY3hlLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3pRZENZTy1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9Ik1ldGhvZENvbmZpZ3VyYXRpb24iPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il96UWRDWWUtc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfelFkQ1lPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PkEgTWV0aG9kIENvbmZpZ3VyYXRpb24gaXMgYSBjb2xsZWN0aW9uIG9mIHNlbGVjdGVkIE1ldGhvZCBNb2RlbHMgYW5kIE1ldGhvZFBhY2thZ2VzLiBBIGNvbmZpZ3VyYXRpb24gY2FuIGJlIGV4cG9ydGVkIGludG8gaXRzIG93biBzdGFuZGFsb25lIGxpYnJhcnkgd2hlbiBpdCBpbmNsdWRlcyB0aGUgZnVsbCB0cmFuc2l0aXZlIGNsb3N1cmUgb2YgYWxsIGVsZW1lbnRzIGFsbCBvdGhlciBlbGVtZW50cyBkZXBlbmQgb24uPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfelFkQ1l1LXNFZHVINTlLU0hWOHZnQSIgZ2VuZXJhbD0iX3pON1MwdS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il96UWRDWS0tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJtZXRob2RQbHVnaW5TZWxlY3Rpb24iIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3pHTEZBTy1zRWR1SDU5S1NIVjh2Z0EiIGFzc29jaWF0aW9uPSJfelFtemJ1LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3pRZENaTy1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3pRZENaZS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIxIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3pRZENadS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9Im1ldGhvZFBhY2thZ2VTZWxlY3Rpb24iIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3k0ZUFNZS1zRWR1SDU5S1NIVjh2Z0EiIGFzc29jaWF0aW9uPSJfelFtemMtLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3pRZENaLS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3pRZENhTy1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIxIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3pRZENhZS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9InByb2Nlc3NWaWV3cyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeTJPa251LXNFZHVINTlLU0hWOHZnQSIgYXNzb2NpYXRpb249Il96UW16amUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfelFkQ2F1LXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfelFkQ2EtLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il96UWRDYk8tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJkZWZhdWx0VmlldyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeTJPa251LXNFZHVINTlLU0hWOHZnQSIgYXNzb2NpYXRpb249Il96UW16a2Utc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfelFkQ2JlLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjEiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfelFkQ2J1LXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjEiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfelFkQ2ItLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iYmFzZUNvbmZpZ3VyYXRpb25zIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il96UWRDWU8tc0VkdUg1OUtTSFY4dmdBIiBhc3NvY2lhdGlvbj0iX3pRbXpsZS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il96UWRDY08tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il96UWRDY2Utc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3pRZENjdS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9InN1YnRyYWN0ZWRDYXRlZ29yeSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeTJPa251LXNFZHVINTlLU0hWOHZnQSIgYXNzb2NpYXRpb249Il96UW16bXUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfelFkQ2MtLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfelFkQ2RPLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il96UWRDZGUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJhZGRlZENhdGVnb3J5IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95Mk9rbnUtc0VkdUg1OUtTSFY4dmdBIiBhc3NvY2lhdGlvbj0iX3pRbXpudS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il96UWRDZHUtc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il96UWRDZC0tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfelFkQ2VPLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iUHJvY2Vzc0ZhbWlseSI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3pRZENlZS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il96UWRDZU8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+QSBEZWxpdmVyeSBNb2RlbCBGYW1pbHkgaXMgYSBjb252ZW5pZW50IGdyb3VwaW5nIG9mIERlbGl2ZXJ5IFByb2Nlc3NlcyBhbmQgQ2FwYWJpbGl0eSBQYXR0ZXJucyBvZiBpbnRlcmVzdCB0byBzb21lIHNwZWNpZmljIHVzZXIgY29tbXVuaXR5LjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3pRZENldS1zRWR1SDU5S1NIVjh2Z0EiIGdlbmVyYWw9Il96UWRDWU8tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfelFkQ2UtLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iZGVsaXZlcnlQcm9jZXNzZXMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3ktNEtNTy1zRWR1SDU5S1NIVjh2Z0EiIGFzc29jaWF0aW9uPSJfelFtemVPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3pRZENmTy1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3pRZENmZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il95LTRLT2Utc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJQcm9jZXNzIiBpc0Fic3RyYWN0PSJ0cnVlIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeS00S091LXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3ktNEtPZS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5BIFByb2Nlc3MgaXMgYSBzcGVjaWFsIEFjdGl2aXR5IHRoYXQgZGVzY3JpYmVzIGEgc3RydWN0dXJlIGZvciBwYXJ0aWN1bGFyIHR5cGVzIG9mIGRldmVsb3BtZW50IHByb2plY3RzLiAgVG8gcGVyZm9ybSBzdWNoIGEgZGV2ZWxvcG1lbnQgcHJvamVjdCBhIFByb2Nlc3NlcyB3b3VsZCBiZSAnaW5zdGFudGlhdGVkJyBhbmQgYWRhcHRlZCBmb3IgdGhlIHNwZWNpZmljIHNpdHVhdGlvbi4gIFByb2Nlc3MgaXMgYW4gYWJzdHJhY3QgY2xhc3MgYW5kIHRoaXMgbWV0YS1tb2RlbCBkZWZpbmVzIGRpZmZlcmVudCBzcGVjaWFsIHR5cGVzIG9mIFByb2Nlc3NlcyBmb3IgZGlmZmVyZW50IHByb2Nlc3MgbWFuYWdlbWVudCBhcHBsaWNhdGlvbnMgYW5kIGRpZmZlcmVudCBzaXR1YXRpb25zIG9mIHByb2Nlc3MgcmV1c2UuICBFdmVyeSBQcm9jZXNzIGNvbXByaXNlcyBvZiBhbmQgaXMgdGhlIHRvcC1sZXZlbCBlbGVtZW50IG9mIGFuIG4tbGV2ZWwgYnJlYWtkb3duIHN0cnVjdHVyZSB1c2luZyB0aGUgTmVzdGluZyBhc3NvY2lhdGlvbiBkZWZpbmVkIG9uIEFjdGl2aXR5LgotQ29yZSBNZXRob2QgQ29udGVudCBwcm92aWRlcyBzdGVwLWJ5LXN0ZXAgZXhwbGFuYXRpb25zLCBkZXNjcmliaW5nIGhvdyB2ZXJ5IHNwZWNpZmljIGRldmVsb3BtZW50IGdvYWxzIGFyZSBhY2hpZXZlZCBpbmRlcGVuZGVudCBvZiB0aGUgcGxhY2VtZW50IG9mIHRoZXNlIHN0ZXBzIHdpdGhpbiBhIGRldmVsb3BtZW50IGxpZmVjeWNsZS4gIFByb2Nlc3NlcyB0YWtlIHRoZXNlIG1ldGhvZCBlbGVtZW50cyBhbmQgcmVsYXRlIHRoZW0gaW50byBzZW1pLW9yZGVyZWQgc2VxdWVuY2VzIHRoYXQgYXJlIGN1c3RvbWl6ZWQgdG8gc3BlY2lmaWMgdHlwZXMgb2YgcHJvamVjdHMuICBUaHVzLCBhIHByb2Nlc3MgaXMgYSBzZXQgb2YgcGFydGlhbGx5IG9yZGVyZWQgd29yayBkZXNjcmlwdGlvbnMgaW50ZW5kZWQgdG8gcmVhY2ggYSBoaWdoZXIgZGV2ZWxvcG1lbnQgZ29hbCwgc3VjaCBhcyB0aGUgcmVsZWFzZSBvZiBhIHNwZWNpZmljIHNvZnR3YXJlIHN5c3RlbS4gIEEgcHJvY2VzcyBhbmQgdGhlIHByb2Nlc3MgbWV0YS1tb2RlbCBzdHJ1Y3R1cmUgZGVmaW5lZCBpbiB0aGlzIHNwZWNpZmljYXRpb24gZm9jdXNlcyBvbiB0aGUgbGlmZWN5Y2xlIGFuZCB0aGUgc2VxdWVuY2luZyBvZiB3b3JrIGluIGJyZWFrZG93biBzdHJ1Y3R1cmVzLiAgVG8gYWNoaWV2ZSB0aGlzIGl0IHVzZXMgdGhlIERlc2NyaXB0b3IgY29uY2VwdCByZWZlcmVuY2luZyBtZXRob2QgY29udGVudCBhbmQgYWxsb3dpbmcgZGVmaW5pbmcgdGltZS1zcGVjaWZpYyBjdXN0b21pemF0aW9ucyBvZiB0aGUgcmVmZXJlbmNlZCBjb250ZW50IChlLmcuIGRlZmluaW5nIGEgZm9jdXMgb24gZGlmZmVyZW50IHN0ZXBzIG9mIHRoZSBzYW1lIFRhc2sgYW5kIHByb3ZpZGluZyBpbnB1dCBXb3JrIFByb2R1Y3RzIGluIGRpZmZlcmVudCBzdGF0ZXMgd2l0aGluIHRoZSBkaWZmZXJlbnQgUGhhc2VzIG9mIGEgcHJvY2VzcyBsaWZlY3ljbGUgaW4gd2hpY2ggdGhlIHNhbWUgVGFzayBpcyBwZXJmb3JtZWQpLgotPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3pRZENmdS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95LTRLT2Utc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+UHJvY2VzcyBpbiB0aGUgcGFja2FnZSBMaWJyYXJ5IENvbmZpZ3VyYXRpb24gZXh0ZW5kcyB0aGUgY2xhc3MgUHJvY2VzcyB3aXRoIGFzc29jaWF0aW9uIHJlbGF0aW5nIGEgUHJvY2VzcyB0byBvbmUgZGVmYXVsdCBhbmQgbWFueSBvcHRpb25hbCB2YWxpZCBDb25maWd1cmF0aW9ucy4KLVRoZXNlIGNvbmZpZ3VyYXRpb25zIGRlc2NyaWJlIHZhbGlkIGNvbnRleHRzIGZvciB0aGUgUHJvY2VzcyB3aXRoaW4gYSBNZXRob2QgTGlicmFyeSBpbmRpY2F0aW5nIHVuZGVyIHdoaWNoIENvbmZpZ3VyYXRpb25zIGEgUHJvY2VzcyBpcyB3ZWxsIGRlZmluZWQuCi08L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il95LTRLTy0tc0VkdUg1OUtTSFY4dmdBIiBnZW5lcmFsPSJfeTdtTXNPLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3ktNEtQTy1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9ImluY2x1ZGVzUGF0dGVybnMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3lfQlVKLS1zRWR1SDU5S1NIVjh2Z0EiIGFzc29jaWF0aW9uPSJfeV9CVUt1LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3ktNEtQZS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3ktNEtQdS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfelFkQ2YtLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iZGVmYXVsdENvbnRleHQiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3pRZENZTy1zRWR1SDU5S1NIVjh2Z0EiIGFzc29jaWF0aW9uPSJfelFtemctLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3pRZENnTy1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIxIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3pRZENnZS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIxIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3pRbXpZTy1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9InZhbGlkQ29udGV4dCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfelFkQ1lPLXNFZHVINTlLU0hWOHZnQSIgYXNzb2NpYXRpb249Il96UW16aU8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfelFtelllLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfelFtell1LXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3pRbXpZLS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9Ik1ldGhvZExpYnJhcnkiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il96UW16Wk8tc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfelFtelktLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PkEgTWV0aG9kIExpYnJhcnkgaXMgYSBwaHlzaWNhbCBjb250YWluZXIgZm9yIE1ldGhvZCBQbHVnaW5zIGFuZCBNZXRob2QgQ29uZmlndXJhdGlvbiBkZWZpbml0aW9ucy4gIEFsbCBNZXRob2QgRWxlbWVudHMgYXJlIHN0b3JlZCBpbiBhIE1ldGhvZCBMaWJyYXJ5LjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3pRbXpaZS1zRWR1SDU5S1NIVjh2Z0EiIGdlbmVyYWw9Il96TjdTMHUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfelFtelotLXNFZHVINTlLU0hWOHZnQSIgZ2VuZXJhbD0iX3l4VVBWTy1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il96UW16YU8tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJtZXRob2RQbHVnaW5zIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il96R0xGQU8tc0VkdUg1OUtTSFY4dmdBIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBhc3NvY2lhdGlvbj0iX3pRbXpmZS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il96UW16YWUtc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il96UW16YXUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3pRbXphLS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9InByZWRlZmluZWRDb25maWd1cmF0aW9ucyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfelFkQ1lPLXNFZHVINTlLU0hWOHZnQSIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgYXNzb2NpYXRpb249Il96UW16Z08tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfelFtemJPLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfelFtemJlLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3pRbXpidS1zRWR1SDU5S1NIVjh2Z0EiIG1lbWJlckVuZD0iX3pRbXpjTy1zRWR1SDU5S1NIVjh2Z0EgX3pRZENZLS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il96UW16Yi0tc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfelFtemJ1LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PkEgc2VsZWN0aW9uIG9mIHBhY2thZ2VzIHRvIGJlIGluY2x1ZGVkIGluIHRoZSBjb25maWd1cmF0aW9uLjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iX3pRbXpjTy1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9Il9tZXRob2RDb25maWd1cmF0aW9uIiB2aXNpYmlsaXR5PSJwcml2YXRlIiB0eXBlPSJfelFkQ1lPLXNFZHVINTlLU0hWOHZnQSIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iX3pRbXpidS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il96UW16Y2Utc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il96UW16Y3Utc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkRW5kPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfelFtemMtLXNFZHVINTlLU0hWOHZnQSIgbWVtYmVyRW5kPSJfelFtemRlLXNFZHVINTlLU0hWOHZnQSBfelFkQ1p1LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3pRbXpkTy1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il96UW16Yy0tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+QSBzZWxlY3Rpb24gb2YgcGFja2FnZXMgdG8gYmUgaW5jbHVkZWQgaW4gdGhlIGNvbmZpZ3VyYXRpb24uPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfelFtemRlLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iX21ldGhvZENvbmZpZ3VyYXRpb24iIHZpc2liaWxpdHk9InByaXZhdGUiIHR5cGU9Il96UWRDWU8tc0VkdUg1OUtTSFY4dmdBIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfelFtemMtLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3pRbXpkdS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3pRbXpkLS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il96UW16ZU8tc0VkdUg1OUtTSFY4dmdBIiBtZW1iZXJFbmQ9Il96UW16ZXUtc0VkdUg1OUtTSFY4dmdBIF96UWRDZS0tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfelFtemVlLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3pRbXplTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5EZWxpdmVyeSBQcm9jZXNzIGNhbiBiZSBvcmdhbml6ZWQgaW4gbWFueSBQcm9jZXNzIEZhbWlsaWVzLjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iX3pRbXpldS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9InByb2Nlc3NGYW1pbGllcyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfelFkQ2VPLXNFZHVINTlLU0hWOHZnQSIgYXNzb2NpYXRpb249Il96UW16ZU8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfelFtemUtLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfelFtemZPLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3pRbXpmZS1zRWR1SDU5S1NIVjh2Z0EiIG1lbWJlckVuZD0iX3pRbXpmLS1zRWR1SDU5S1NIVjh2Z0EgX3pRbXphTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il96UW16ZnUtc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfelFtemZlLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PkEgTWV0aG9kIExpYnJhcnkgcGh5c2ljYWxseSBjb21wcmlzZXMgb2YgTWV0aG9kIFBsdWdpbnMuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfelFtemYtLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iX21ldGhvZExpYnJhcnkiIHZpc2liaWxpdHk9InByaXZhdGUiIHR5cGU9Il96UW16WS0tc0VkdUg1OUtTSFY4dmdBIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfelFtemZlLXNFZHVINTlLU0hWOHZnQSIvPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfelFtemdPLXNFZHVINTlLU0hWOHZnQSIgbWVtYmVyRW5kPSJfelFtemEtLXNFZHVINTlLU0hWOHZnQSBfelFtemd1LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3pRbXpnZS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il96UW16Z08tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+QSBNZXRob2QgTGlicmFyeSBzdG9yZXMgYSBzZXQgb2YgcHJlZGVmaW5lZCBNZXRob2QgQ29uZmlndXJhdGlvbnMgdGhhdCBhcmUgcmVndWxhcmx5IHVzZWQgYnkgdGhlIGxpYnJhcnkgYXV0aG9ycyAoZS5nLiB0aGUgY29uZmlndXJhdGlvbnMgdGhhdCB0aGV5IHNoaXAgdG8gdGhlaXIgdXNlcnMpLjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iX3pRbXpndS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9Il9tZXRob2RMaWJyYXJ5IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il96UW16WS0tc0VkdUg1OUtTSFY4dmdBIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfelFtemdPLXNFZHVINTlLU0hWOHZnQSIvPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfelFtemctLXNFZHVINTlLU0hWOHZnQSIgbWVtYmVyRW5kPSJfelFtemhlLXNFZHVINTlLU0hWOHZnQSBfelFkQ2YtLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3pRbXpoTy1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il96UW16Zy0tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+QSBQcm9jZXNzIGhhcyBleGFjdGx5IG9uIGRlZmF1bHQgY29uZmlndXJhdGlvbi4gIFRoaXMgaXMgaW4gbW9zdCBjYXNlcyB0aGUgY29uZmlndXJhdGlvbiBpbiB3aGljaCB0aGUgcHJvY2VzcyBoYXMgYmVlbiBjcmVhdGVkLjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iX3pRbXpoZS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9Il9wcm9jZXNzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95LTRLT2Utc0VkdUg1OUtTSFY4dmdBIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfelFtemctLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3pRbXpodS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3pRbXpoLS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il96UW16aU8tc0VkdUg1OUtTSFY4dmdBIiBtZW1iZXJFbmQ9Il96UW16aXUtc0VkdUg1OUtTSFY4dmdBIF96UW16WU8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfelFtemllLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3pRbXppTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5BIFByb2Nlc3MgY2FuIGhhdmUgbWFueSBhZGRpdGlvbmFsIGNvbmZpZ3VyYXRpb25zIHRoYXQgaGF2ZSBiZWVuIHZlcmlmaWVkIHRvIGFsc28gcHJvZHVjZSB2YWxpZCByZXN1bHRzLiAgUHJvY2VzcyBFbGVtZW50cyAoZS5nLiBEZXNjcmlwdG9ycykgdGhhdCByZWZlciB0byBjb250ZW50IHBhY2thZ2VzIHRoYXQgYXJlIGRlZmluZWQgb3V0c2lkZSB0aGUgc2NvcGUgb2Ygc3VjaCBhIGNvbmZpZ3VyYXRpb24gd291bGQgbm90IGJlIHNob3duIGluIHRoZSBwcm9jZXNzIHdoZW4gcHVibGlzaGVkIG9yIHVzZWQgdW5kZXIgc3VjaCBhIGNvbmZpZ3VyYXRpb24uICBUaGlzIGFsbG93cyB0byBlYXNpbHkgcmVtb3ZlIGNvbnRlbnQgZnJvbSBhIHByb2Nlc3MgYnkgcmVtb3ZpbmcgY29udGVudCBwYWNrYWdlcyB0byBmcm9tIHRoZSByZWxhdGVkIGNvbmZpZ3VyYXRpb24uPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfelFteml1LXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iX3Byb2Nlc3MiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3ktNEtPZS1zRWR1SDU5S1NIVjh2Z0EiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il96UW16aU8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfelFtemktLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfelFtempPLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3pRbXpqZS1zRWR1SDU5S1NIVjh2Z0EiIG1lbWJlckVuZD0iX3pRbXpqdS1zRWR1SDU5S1NIVjh2Z0EgX3pRZENhZS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iX3pRbXpqdS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9Il9tZXRob2RDb25maWd1cmF0aW9uIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il96UWRDWU8tc0VkdUg1OUtTSFY4dmdBIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfelFtemplLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3pRbXpqLS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3pRbXprTy1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il96UW16a2Utc0VkdUg1OUtTSFY4dmdBIiBtZW1iZXJFbmQ9Il96UWRDYk8tc0VkdUg1OUtTSFY4dmdBIF96UW16a3Utc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il96UW16a3Utc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJfbWV0aG9kQ29uZmlndXJhdGlvbiIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfelFkQ1lPLXNFZHVINTlLU0hWOHZnQSIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iX3pRbXprZS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il96UW16ay0tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il96UW16bE8tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkRW5kPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfelFtemxlLXNFZHVINTlLU0hWOHZnQSIgbWVtYmVyRW5kPSJfelFkQ2ItLXNFZHVINTlLU0hWOHZnQSBfelFtemwtLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3pRbXpsdS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il96UW16bGUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+VGhlIGRlZmluaXRpb24gb2YgYSBjb25maWd1cmF0aW9uIGNhbiBiZSBiYXNlZCBvbiB0aGUgZGVmaW5pdGlvbnMgb2Ygb3RoZXIgY29uZmlndXJhdGlvbnMuICBGb3IgZXhhbXBsZSwgYSBjb25maWd1cmF0aW9uIEEgY291bGQgYmUgZGVmaW5lZCBhcyB0aGUgc3VwZXJzZXQgb2YgY29uZmlndXJhdGlvbnMgQiwgQywgYW5kIEQgcGx1cyBhZGQgbW9yZSBzZWxlY3RlZCBQbHVnaW5zIGFuZCBQYWNrYWdlcy4gIEluIHN1Y2ggYSBjYXNlIEEgd291bGQgbGlzdCBCLCBDLCBhbmQgRCBhcyBpdHMgYmFzZUNvbmZpZ3VyYXRpb25zLiAgSWYgYW55IG9mIHRoZXNlIGJhc2UgY29uZmlndXJhdGlvbnMgY2hhbmdlcyBhbGwgdXBkYXRlcyB3b3VsZCBiZSBhdXRvbWF0aWNhbGx5IHZhbGlkIGZvciBBIGFzIHdlbGwgcmVkdWNpbmcgbWFpbnRhaW5hYmlsaXR5IG92ZXJoZWFkIGZvciBvdmVybGFwcGluZy9kZXBlbmRlbnQgY29uZmlndXJhdGlvbnMuIDwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iX3pRbXpsLS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9Il9tZXRob2RDb25maWd1cmF0aW9uIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il96UWRDWU8tc0VkdUg1OUtTSFY4dmdBIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfelFtemxlLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3pRbXptTy1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3pRbXptZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il96UW16bXUtc0VkdUg1OUtTSFY4dmdBIiBtZW1iZXJFbmQ9Il96UWRDY3Utc0VkdUg1OUtTSFY4dmdBIF96UW16bS0tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il96UW16bS0tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJfbWV0aG9kQ29uZmlndXJhdGlvbiIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfelFkQ1lPLXNFZHVINTlLU0hWOHZnQSIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iX3pRbXptdS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il96UW16bk8tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il96UW16bmUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkRW5kPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfelFtem51LXNFZHVINTlLU0hWOHZnQSIgbWVtYmVyRW5kPSJfelFkQ2RlLXNFZHVINTlLU0hWOHZnQSBfelFtem4tLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfelFtem4tLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iX21ldGhvZENvbmZpZ3VyYXRpb24iIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3pRZENZTy1zRWR1SDU5S1NIVjh2Z0EiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il96UW16bnUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHByb2ZpbGVBcHBsaWNhdGlvbiB4bWk6aWQ9Il9KN3RHMWV5Q0VkdTUtdlZqbGZWc2ZRIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfSjd0RzF1eUNFZHU1LXZWamxmVnNmUSIgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3VtbDIvMi4wLjAvVU1MIj4KLSAgICAgICAgPHJlZmVyZW5jZXMgeG1pOnR5cGU9ImVjb3JlOkVQYWNrYWdlIiBocmVmPSJwYXRobWFwOi8vVU1MX1BST0ZJTEVTL1N0YW5kYXJkLnByb2ZpbGUudW1sI195elU1OFlpbkVkcXR2Ym5mQjJMXzV3Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxhcHBsaWVkUHJvZmlsZSBocmVmPSJwYXRobWFwOi8vVU1MX1BST0ZJTEVTL1N0YW5kYXJkLnByb2ZpbGUudW1sI18wIi8+Ci0gICAgPC9wcm9maWxlQXBwbGljYXRpb24+Ci0gICAgPHByb2ZpbGVBcHBsaWNhdGlvbiB4bWk6aWQ9Il9KN3RHMS15Q0VkdTUtdlZqbGZWc2ZRIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfSjd0RzJPeUNFZHU1LXZWamxmVnNmUSIgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3VtbDIvMi4wLjAvVU1MIj4KLSAgICAgICAgPHJlZmVyZW5jZXMgeG1pOnR5cGU9ImVjb3JlOkVQYWNrYWdlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9NU0xfUFJPRklMRVMvRGVmYXVsdC5lcHgjX0lOOGs4TW1CRWRxQmNOMVI2RXZXVXc/RGVmYXVsdC9EZWZhdWx0PyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8YXBwbGllZFByb2ZpbGUgaHJlZj0icGF0aG1hcDovL1VNTDJfTVNMX1BST0ZJTEVTL0RlZmF1bHQuZXB4I19hX1Mzd05XTEVkaXk0SXFQOHdoakZBP0RlZmF1bHQ/Ii8+Ci0gICAgPC9wcm9maWxlQXBwbGljYXRpb24+Ci0gICAgPHByb2ZpbGVBcHBsaWNhdGlvbiB4bWk6aWQ9Il9KN3RHMmV5Q0VkdTUtdlZqbGZWc2ZRIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfSjd0RzJ1eUNFZHU1LXZWamxmVnNmUSIgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3VtbDIvMi4wLjAvVU1MIj4KLSAgICAgICAgPHJlZmVyZW5jZXMgeG1pOnR5cGU9ImVjb3JlOkVQYWNrYWdlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9NU0xfUFJPRklMRVMvRGVwbG95bWVudC5lcHgjX0lyZEFVTW1CRWRxQmNOMVI2RXZXVXc/RGVwbG95bWVudC9EZXBsb3ltZW50PyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8YXBwbGllZFByb2ZpbGUgaHJlZj0icGF0aG1hcDovL1VNTDJfTVNMX1BST0ZJTEVTL0RlcGxveW1lbnQuZXB4I192amJ1d092SEVkaURYNWJqaTBpVlNBP0RlcGxveW1lbnQ/Ii8+Ci0gICAgPC9wcm9maWxlQXBwbGljYXRpb24+Ci0gICAgPHByb2ZpbGVBcHBsaWNhdGlvbiB4bWk6aWQ9Il9UX2Njb095Q0VkdTUtdlZqbGZWc2ZRIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfVF9jY29leUNFZHU1LXZWamxmVnNmUSIgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3VtbDIvMi4wLjAvVU1MIj4KLSAgICAgICAgPHJlZmVyZW5jZXMgeG1pOnR5cGU9ImVjb3JlOkVQYWNrYWdlIiBocmVmPSJwYXRobWFwOi8vVU1MX1BST0ZJTEVTL0Vjb3JlLnByb2ZpbGUudW1sI192eS1IVVlpbkVkcXR2Ym5mQjJMXzV3Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxhcHBsaWVkUHJvZmlsZSBocmVmPSJwYXRobWFwOi8vVU1MX1BST0ZJTEVTL0Vjb3JlLnByb2ZpbGUudW1sI18wIi8+Ci0gICAgPC9wcm9maWxlQXBwbGljYXRpb24+Ci0gIDwvdW1sOk1vZGVsPgotICA8RWNvcmU6RVBhY2thZ2UgeG1pOmlkPSJfVTlJejhPeUNFZHU1LXZWamxmVnNmUSIgYmFzZV9QYWNrYWdlPSJfSjd0RzBPeUNFZHU1LXZWamxmVnNmUSIgcGFja2FnZU5hbWU9InVtYSIgbnNQcmVmaXg9Im9yZy5lY2xpcHNlLmVwZi51bWEiIG5zVVJJPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiBiYXNlUGFja2FnZT0ib3JnLmVjbGlwc2UuZXBmIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeXhVUFctLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeXhLZkMtLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3l4VVBYTy1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3l4S2ZEdS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95eFVQWGUtc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95eEtmRU8tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxFY29yZTpFQXR0cmlidXRlIHhtaTppZD0iX3l4VVBYdS1zRWR1SDU5S1NIVjh2Z0EiIGlzVW5zZXR0YWJsZT0idHJ1ZSIgYmFzZV9Qcm9wZXJ0eT0iX3l4S2ZFdS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95eFVQWC0tc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95eEtmRi0tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeXhVUFlPLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeXhVUFVlLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3l4VVBZZS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3l4VVBWZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95eFVQWXUtc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95eFVQV2Utc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeXhVUGNlLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeXhVUFktLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RWNvcmU6RURhdGFUeXBlIHhtaTppZD0iX3l4VVBjdS1zRWR1SDU5S1NIVjh2Z0EiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLnV0aWwuRGF0ZSIgYmFzZV9QcmltaXRpdmVUeXBlPSJfeXhVUFpPLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3l4VVBjLS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3l4VVBaZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPEVjb3JlOkVEYXRhVHlwZSB4bWk6aWQ9Il95eFVQZE8tc0VkdUg1OUtTSFY4dmdBIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5uZXQuVVJJIiBiYXNlX1ByaW1pdGl2ZVR5cGU9Il95eFVQWnUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeXhVUGRlLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeXhVUFotLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RWNvcmU6RURhdGFUeXBlIHhtaTppZD0iX3l4VVBkdS1zRWR1SDU5S1NIVjh2Z0EiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLmxhbmcuU3RyaW5nIiBiYXNlX1ByaW1pdGl2ZVR5cGU9Il95eFVQYU8tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeXhVUGQtLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeXhVUGFlLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RWNvcmU6RURhdGFUeXBlIHhtaTppZD0iX3l4VVBlTy1zRWR1SDU5S1NIVjh2Z0EiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLnV0aWwuU2V0IiBiYXNlX1ByaW1pdGl2ZVR5cGU9Il95eFVQYXUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxFY29yZTpFRGF0YVR5cGUgeG1pOmlkPSJfeXhVUGVlLXNFZHVINTlLU0hWOHZnQSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEudXRpbC5MaXN0IiBiYXNlX1ByaW1pdGl2ZVR5cGU9Il95eFVQYS0tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxFY29yZTpFRGF0YVR5cGUgeG1pOmlkPSJfeXhkWlFPLXNFZHVINTlLU0hWOHZnQSIgaW5zdGFuY2VDbGFzc05hbWU9ImludCIgYmFzZV9QcmltaXRpdmVUeXBlPSJfeXhVUGJPLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3l4ZFpRZS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3l4VVBiZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPEVjb3JlOkVEYXRhVHlwZSB4bWk6aWQ9Il95eGRaUXUtc0VkdUg1OUtTSFY4dmdBIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5sYW5nLkJvb2xlYW4iIGJhc2VfUHJpbWl0aXZlVHlwZT0iX3l4VVBidS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95eGRaUS0tc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95eFVQYi0tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxFY29yZTpFRGF0YVR5cGUgeG1pOmlkPSJfeXhkWlJPLXNFZHVINTlLU0hWOHZnQSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubGFuZy5Eb3VibGUiIGJhc2VfUHJpbWl0aXZlVHlwZT0iX3l4VVBjTy1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95eDZGTXUtc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95eHc3UU8tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeXg2Rk0tLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeXh3N1F1LXNFZHVINTlLU0hWOHZnQSIvPgotICA8RWNvcmU6RUF0dHJpYnV0ZSB4bWk6aWQ9Il95eDZGTk8tc0VkdUg1OUtTSFY4dmdBIiBpc1Vuc2V0dGFibGU9InRydWUiIGJhc2VfUHJvcGVydHk9Il95eHc3Uk8tc0VkdUg1OUtTSFY4dmdBIiBpc0lEPSJ0cnVlIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeXg2Rk5lLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeXh3N1JlLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RWNvcmU6RUF0dHJpYnV0ZSB4bWk6aWQ9Il95eDZGTnUtc0VkdUg1OUtTSFY4dmdBIiBpc1Vuc2V0dGFibGU9InRydWUiIGJhc2VfUHJvcGVydHk9Il95eHc3U2Utc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeXg2Rk4tLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeXh3N1N1LXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3l4NkZPTy1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3l4dzdWZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95eDZGT2Utc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95eHc3V08tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxFY29yZTpFQXR0cmlidXRlIHhtaTppZD0iX3l4NkZPdS1zRWR1SDU5S1NIVjh2Z0EiIGlzVW5zZXR0YWJsZT0idHJ1ZSIgYmFzZV9Qcm9wZXJ0eT0iX3l4dzdXdS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95eDZGTy0tc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95eHc3Vy0tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeXg2RlBPLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeXh3N1ktLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RWNvcmU6RUF0dHJpYnV0ZSB4bWk6aWQ9Il95eDZGUGUtc0VkdUg1OUtTSFY4dmdBIiBpc1Vuc2V0dGFibGU9InRydWUiIGJhc2VfUHJvcGVydHk9Il95eHc3WmUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeXg2RlB1LXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeXh3N1p1LXNFZHVINTlLU0hWOHZnQSIvPgotICA8RWNvcmU6RUF0dHJpYnV0ZSB4bWk6aWQ9Il95eDZGUC0tc0VkdUg1OUtTSFY4dmdBIiBpc1Vuc2V0dGFibGU9InRydWUiIGJhc2VfUHJvcGVydHk9Il95eHc3YXUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeXg2RlFPLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeXh3N2EtLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3l4NkZRZS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3l4dzdjLS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPEVjb3JlOkVBdHRyaWJ1dGUgeG1pOmlkPSJfeXg2RlF1LXNFZHVINTlLU0hWOHZnQSIgaXNVbnNldHRhYmxlPSJ0cnVlIiBiYXNlX1Byb3BlcnR5PSJfeXh3N2RlLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3l4NkZRLS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3l4dzdkdS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95eDZGUk8tc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95eHc3ZS0tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxFY29yZTpFQXR0cmlidXRlIHhtaTppZD0iX3l4NkZSZS1zRWR1SDU5S1NIVjh2Z0EiIGlzVW5zZXR0YWJsZT0idHJ1ZSIgYmFzZV9Qcm9wZXJ0eT0iX3l4dzdmdS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95eDZGUnUtc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95eHc3Zi0tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxFY29yZTpFQXR0cmlidXRlIHhtaTppZD0iX3l4NkZSLS1zRWR1SDU5S1NIVjh2Z0EiIGlzVW5zZXR0YWJsZT0idHJ1ZSIgYmFzZV9Qcm9wZXJ0eT0iX3l4dzdpTy1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95eDZGU08tc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95eHc3amUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeXg2RlNlLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeXh3N2tPLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3l4NkZTdS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3l4dzdsZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95eDZGUy0tc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95eHc3bXUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeXk5T0t1LXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeXl6ZEVPLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3l5OU9LLS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3l5emRFdS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPEVjb3JlOkVSZWZlcmVuY2UgeG1pOmlkPSJfeXk5T0xPLXNFZHVINTlLU0hWOHZnQSIgaXNUcmFuc2llbnQ9InRydWUiIGJhc2VfUHJvcGVydHk9Il95eXpkRk8tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeXk5T0xlLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeXl6ZEctLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RWNvcmU6RVJlZmVyZW5jZSB4bWk6aWQ9Il95eTlPTHUtc0VkdUg1OUtTSFY4dmdBIiBpc1RyYW5zaWVudD0idHJ1ZSIgYmFzZV9Qcm9wZXJ0eT0iX3l5emRMZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95eTlPTC0tc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95eXpkTWUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeXk5T01PLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeXl6ZE5PLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3l5OU9NZS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3l5emROLS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95eTlPTXUtc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95eXpkUU8tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeXk5T00tLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeXl6ZFJ1LXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3l5OU9OTy1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3l5emRTZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95eTlPTmUtc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95eXpkVGUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeXk5T051LXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeXl6ZFZ1LXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3l5OU9OLS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3l5emRXLS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95eTlPT08tc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95eXpkWU8tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeXk5T09lLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeXl6ZFplLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RWNvcmU6RVJlZmVyZW5jZSB4bWk6aWQ9Il95eTlPT3Utc0VkdUg1OUtTSFY4dmdBIiBpc1RyYW5zaWVudD0idHJ1ZSIgYmFzZV9Qcm9wZXJ0eT0iX3l5emRadS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95eTlPTy0tc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95eXpkYXUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeXk5T1BPLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeXk5T0VlLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3l5OU9QZS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3l5OU9GdS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95eTlPUHUtc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95eTlPR08tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeXk5T1AtLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeXk5T0hlLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3l5OU9RTy1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3l5OU9JdS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95eTlPUWUtc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95eTlPSmUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeXk5T1F1LXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeXk5T0tPLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3kwSmctdS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3l6MS00Ty1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95MEpnLS0tc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95ejEtNHUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeTBKZ19PLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeXoxLTVlLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3kwSmdfZS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3l6MS02Ty1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95MEpnX3Utc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95ejEtNi0tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeTBKZ18tLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeXoxLTd1LXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3kwSmhBTy1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3l6MS04ZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95MEpoQWUtc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95ejEtOU8tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeTBKaEF1LXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeXoxLTktLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3kwSmhBLS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3l6MS0tdS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95MEpoQk8tc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95ejEtX2Utc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeTBKaEJlLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeXoxX0FPLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3kwSmhCdS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3l6MV9DTy1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95MEpoQi0tc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95ejFfRmUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeTBKaENPLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeXpfdjV1LXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3kwSmhDZS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3l6X3ZfZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95MEpoQ3Utc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95el93QU8tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeTBKaEMtLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeXpfd0EtLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3kwSmhETy1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3l6X3dDTy1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95MEpoRGUtc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95el93RGUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeTBKaER1LXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeXpfd0V1LXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3kwSmhELS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3l6X3dGLS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95MEpoRU8tc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95el93SE8tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeTBKaEVlLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeXpfd0llLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3kwSmhFdS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3l6X3dKdS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95MEpoRS0tc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95el93Sy0tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeTBKaEZPLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeTBKZzRlLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3kwSmhGZS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3kwSmc1dS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95MVZ6c08tc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95MUNSc08tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeTFWenNlLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeTFNQ3MtLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3kxVnpzdS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3kxTUN1Ty1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95MVZ6cy0tc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95MU1DeC0tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeTFWenRPLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeTFNQ3pPLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3kxVnp0ZS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3kxTUMwLS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95MVZ6dHUtc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95MU1DMk8tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeTFWenQtLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeTFNQzNlLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3kxVnp1Ty1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3kxTUM1Ty1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95MVZ6dWUtc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95MU1DNmUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeTFWenV1LXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeTFNQzhPLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3kxVnp1LS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3kxTUM5ZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95MVZ6dk8tc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95MU1DLXUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeTFWenZlLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeTFNREFlLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3kxVnp2dS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3kxTURDTy1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95MVZ6di0tc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95MU1ERGUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeTFWendPLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeTFNREV1LXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3kxVnp3ZS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3kxTURGLS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95MVZ6d3Utc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95MU1ESE8tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeTFWenctLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeTFNREllLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3kxVnp4Ty1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3kxTURKZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95MVZ6eGUtc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95MU1ESi0tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeTFWenh1LXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeTFNRExPLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3kxVnp4LS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3kxTURNZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95MVZ6eU8tc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95MU1ETnUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeTJZVmdPLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeTJGYWtPLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3kyWVZnZS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3kyT2tnZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95MllWZ3Utc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95Mk9raXUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeTJZVmctLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeTJPa2tPLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3kyWVZoTy1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3kyT2ttZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95MllWaGUtc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95Mk9rbi0tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeTJZVmh1LXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeTJPa291LXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3kyWVZoLS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3kyT2txTy1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95MllWaU8tc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95Mk9rcnUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeTJZVmllLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeTJPa3RPLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3kyWVZpdS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3kyT2t2ZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95MllWaS0tc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95Mk9rd3Utc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeTJZVmpPLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeTJPa3gtLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3kyWVZqZS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3kyT2t5dS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95MllWanUtc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95Mk9rei0tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeTJZVmotLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeTJPazFPLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3kyWVZrTy1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3kyT2syZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95MllWa2Utc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95Mk9rM3Utc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeTJZVmt1LXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeTJPazQtLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3kyWVZrLS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3kyT2s2Ty1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95NGVBVS0tc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95NGVBTU8tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeTRlQVZPLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeTRlQU11LXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3k0ZUFWZS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3k0ZUFOdS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95NGVBVnUtc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95NGVBUC0tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeTRlQVYtLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeTRlQVJlLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3k0ZUFXTy1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3k0ZUFTdS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95NGVBV2Utc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95NGVBVC0tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeThDNG9PLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeTdtTXNlLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3k4QzRvZS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3k3bU11Ty1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95OEM0b3Utc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95N21NdS0tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeThDNG8tLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeTdtTXZ1LXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3k4QzRwTy1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3k3bU13ZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95OEM0cGUtc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95N3ZXb2Utc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeThDNHB1LXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeTd2V28tLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3k4QzRwLS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3k3dldwZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95OEM0cU8tc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95N3ZXcC0tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeThDNHFlLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeTd2V3FlLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3k4QzRxdS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3k3dldxLS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95OEM0cS0tc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95N3ZXcnUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeThDNHJPLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeTd2V3RPLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3k4QzRyZS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3k3dld0LS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95OEM0cnUtc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95N3ZXdWUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeThDNHItLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeTd2V3UtLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3k4QzRzTy1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3k3dld2ZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95OEM0c2Utc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95N3ZXd2Utc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeThDNHN1LXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeTd2V3h1LXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3k4QzRzLS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3k3dld5ZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95OEM0dE8tc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95N3ZXek8tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeThDNHRlLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeTd2VzItLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3k4QzR0dS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3k3dlc0Ty1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95OEM0dC0tc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95N3ZXN08tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeThDNHVPLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeTd2WEMtLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3k4QzR1ZS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3k3dlhEdS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95OEM0dXUtc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95N3ZYRS0tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeThDNHUtLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeTd2WEpPLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3k4QzR2Ty1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3k3dlhLdS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95OEM0dmUtc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95N3ZYTGUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeThDNHZ1LXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeTd2WE1PLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3k4QzR2LS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3k3dlhNLS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95OEM0d08tc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95N3ZYT2Utc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeThDNHdlLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeTd2WFBPLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3k4QzR3dS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3k3NUhvZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95OEM0dy0tc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95NzVIby0tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeThDNHhPLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeTc1SHFPLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3k4QzR4ZS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3k3NUhyZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95OEM0eHUtc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95NzVIc3Utc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeThDNHgtLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeTc1SHQtLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3k4QzR5Ty1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3k3NUh2Ty1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95OEM0eWUtc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95NzVId2Utc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeThDNHl1LXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeTc1SHh1LXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3k4QzR5LS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3k3NUh5Ty1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95OEM0ek8tc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95NzVIemUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeThDNHplLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeTc1SDB1LXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3k4QzR6dS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3k3NUgxLS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95OEM0ei0tc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95NzVIM08tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeThDNDBPLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeTc1SDRlLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3k4QzQwZS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3k3NUg1dS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95OEM0MHUtc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95NzVINy0tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeThDNDAtLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeTc1SDlPLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3k4QzQxTy1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3k3NUgtZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95X0xGSU8tc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95LTRLTWUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeV9MRkllLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeS00S091LXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3lfTEZJdS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3ktNEtRTy1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95X0xGSS0tc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95LTRLUnUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeV9MRkpPLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeS00S1NPLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3lfTEZKZS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3lfQlVJTy1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95X0xGSnUtc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95X0JVS08tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeV9MRkotLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeV9CVUstLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3lfTEZLTy1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3lfQlVNTy1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95X0xGS2Utc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95X0JVTmUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeV9MRkt1LXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeV9CVU9PLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3lfTEZLLS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3lfQlVQZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95X0xGTE8tc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95X0JVUXUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeV9MRkxlLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeV9CVVItLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3lfTEZMdS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3lfQlVTZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95X0xGTC0tc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95X0JVVXUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeV9MRk1PLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeV9CVVYtLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3lfTEZNZS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3lfQlVYTy1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95X0xGTXUtc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95X0JVWWUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeV9MRk0tLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeV9CVVp1LXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3lfTEZOTy1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3lfQlVhLS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il96Qlo2RU8tc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il96Qlo1dy0tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfekJaNkVlLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfekJaNXl1LXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3pCWjZFdS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3pCWjV6LS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il96Qlo2RS0tc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il96Qlo1MU8tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfekJaNkZPLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfekJaNTItLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3pCWjZGZS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3pCWjU0Ty1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il96Qlo2RnUtc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il96Qlo1NWUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfekJaNkYtLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfekJaNTZ1LXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3pCWjZHTy1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3pCWjU3LS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il96Qlo2R2Utc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il96Qlo1OU8tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfekJaNkd1LXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfekJaNS0tLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3pCWjZHLS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3pCWjZBTy1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il96Qlo2SE8tc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il96Qlo2Qi0tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfekJaNkhlLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfekJaNkRPLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3pEcFZyTy1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3pEcFZjZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il96RHBWcmUtc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il96RHBWZk8tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfekRwVnJ1LXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfekRwVmd1LXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3pEcFZyLS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3pEcFZpLS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il96RHBWc08tc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il96RHBWa2Utc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfekRwVnNlLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfekRwVmx1LXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3pEcFZzdS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3pEcFZtLS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il96RHBWcy0tc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il96RHBWb08tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfekRwVnRPLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfekRwVnBlLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3pEcFZ0ZS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3pEcFZxdS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il96R1UyRk8tc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il96R0xGQWUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfekdVMkZlLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfekdMRkRPLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3pHVTJGdS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3pHTEZEdS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il96R1UyRi0tc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il96R0xGRU8tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfekdVMkdPLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfekdMRkUtLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3pHVTJHZS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3pHTEZHTy1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il96R1UyR3Utc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il96R0xGR3Utc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfekdVMkctLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfekdMRkhPLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3pHVTJITy1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3pHTEZIdS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il96R1UySGUtc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il96R0xGSU8tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfekdVMkh1LXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfekdMRkplLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3pHVTJILS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3pHTEZLTy1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il96R1UySU8tc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il96R0xGTGUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfekdVMkllLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfekdMRk11LXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3pHVTJJdS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3pHVTJBZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il96R1UySS0tc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il96R1UyQnUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfekdVMkpPLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfekdVMkMtLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3pHVTJKZS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3pHVTJFTy1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il96TGl0T08tc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il96TGl0Tk8tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfek9FY3h1LXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfek43UzAtLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3pPRWN4LS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3pON1MxdS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il96T0VjeU8tc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il96TjdTMi0tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfek9FY3llLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfek43UzMtLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3pPRWN5dS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3pON1M1Ty1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il96T0VjeS0tc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il96T0Vjd3Utc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfelFtem9PLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfelFkQ1llLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3pRbXpvZS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3pRZENlZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il96UW16b3Utc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il96UWRDZnUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfelFtem8tLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfelFtelpPLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3pRbXpwTy1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3pRbXpiLS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il96UW16cGUtc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il96UW16ZE8tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfelFtenB1LXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfelFtemVlLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3pRbXpwLS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3pRbXpmdS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il96UW16cU8tc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il96UW16Z2Utc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfelFtenFlLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfelFtemhPLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3pRbXpxdS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3pRbXppZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il96UW16cS0tc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il96UW16bHUtc0VkdUg1OUtTSFY4dmdBIi8+Ci08L3htaTpYTUk+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL21vZGVsLzEuMC40L3VtYS5nZW5tb2RlbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvbW9kZWwvMS4wLjQvdW1hLmdlbm1vZGVsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZGNkOTYyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvbW9kZWwvMS4wLjQvdW1hLmdlbm1vZGVsCisrKyAvZGV2L251bGwKQEAgLTEsNDk5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Z2VubW9kZWw6R2VuTW9kZWwgeG1pOnZlcnNpb249IjIuMCIKLSAgICB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOmVjb3JlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIgotICAgIHhtbG5zOmdlbm1vZGVsPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIiBtb2RlbERpcmVjdG9yeT0iL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjIgotICAgIGVkaXREaXJlY3Rvcnk9Ii9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjIiBlZGl0b3JEaXJlY3Rvcnk9Ii9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXRvci9zcmMiCi0gICAgbW9kZWxQbHVnaW5JRD0ib3JnLmVjbGlwc2UuZXBmLnVtYSIgdGVtcGxhdGVEaXJlY3Rvcnk9Ii9vcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlL3RlbXBsYXRlcyIKLSAgICBydW50aW1lSmFyPSJ0cnVlIiBkeW5hbWljVGVtcGxhdGVzPSJ0cnVlIiBtb2RlbE5hbWU9IlVtYSIgZWRpdFBsdWdpbkNsYXNzPSJvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLlVtYUVkaXRQbHVnaW4iCi0gICAgZWRpdG9yUGx1Z2luQ2xhc3M9Im9yZy5lY2xpcHNlLmVwZi51bWEucHJlc2VudGF0aW9uLlVtYUVkaXRvclBsdWdpbiIgbm9uTkxTTWFya2Vycz0idHJ1ZSIKLSAgICByb290RXh0ZW5kc0ludGVyZmFjZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS5JTW9kZWxPYmplY3QiIHJvb3RFeHRlbmRzQ2xhc3M9Im9yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUuaW1wbC5NdWx0aVJlc291cmNlRU9iamVjdCIKLSAgICByb290SW1wbGVtZW50c0ludGVyZmFjZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnNkby5JbnRlcm5hbEVEYXRhT2JqZWN0IiBzdXBwcmVzc0VNRlR5cGVzPSJ0cnVlIgotICAgIGZlYXR1cmVNYXBXcmFwcGVySW50ZXJmYWNlPSJjb21tb25qLnNkby5TZXF1ZW5jZSIgZmVhdHVyZU1hcFdyYXBwZXJJbnRlcm5hbEludGVyZmFjZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnNkby51dGlsLkVTZXF1ZW5jZSIKLSAgICBmZWF0dXJlTWFwV3JhcHBlckNsYXNzPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuc2RvLnV0aWwuQmFzaWNFU2VxdWVuY2UiIGNvZGVGb3JtYXR0aW5nPSJ0cnVlIgotICAgIGNvbnRhaW5tZW50UHJveGllcz0idHJ1ZSI+Ci0gIDxmb3JlaWduTW9kZWw+QzpcSG9tZVxwaFROR1xUTkdfZG9jc1xPT0FEXENvbnRlbnRBcmNoaXRlY3R1cmVcTW9kZWxzXFVNQTA0XFVuaWZpZWRNZXRob2RBcmNoaXRlY3R1cmUubWRsPC9mb3JlaWduTW9kZWw+Ci0gIDxzdGF0aWNQYWNrYWdlcz5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1NETzwvc3RhdGljUGFja2FnZXM+Ci0gIDxtb2RlbFBsdWdpblZhcmlhYmxlcz5FTUZfQ09NTU9OSl9TRE89b3JnLmVjbGlwc2UuZW1mLmNvbW1vbmouc2RvPC9tb2RlbFBsdWdpblZhcmlhYmxlcz4KLSAgPG1vZGVsUGx1Z2luVmFyaWFibGVzPkVNRl9FQ09SRV9TRE89b3JnLmVjbGlwc2UuZW1mLmVjb3JlLnNkbzwvbW9kZWxQbHVnaW5WYXJpYWJsZXM+Ci0gIDxnZW5QYWNrYWdlcyBwcmVmaXg9IlVtYSIgYmFzZVBhY2thZ2U9Im9yZy5lY2xpcHNlLmVwZiIgZGlzcG9zYWJsZVByb3ZpZGVyRmFjdG9yeT0idHJ1ZSIKLSAgICAgIGVjb3JlUGFja2FnZT0idW1hLmVjb3JlIy8iPgotICAgIDxnZW5FbnVtcyBlY29yZUVudW09InVtYS5lY29yZSMvL1dvcmtPcmRlclR5cGUiPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJ1bWEuZWNvcmUjLy9Xb3JrT3JkZXJUeXBlL2ZpbmlzaFRvU3RhcnQiLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0idW1hLmVjb3JlIy8vV29ya09yZGVyVHlwZS9maW5pc2hUb0ZpbmlzaCIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJ1bWEuZWNvcmUjLy9Xb3JrT3JkZXJUeXBlL3N0YXJ0VG9TdGFydCIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJ1bWEuZWNvcmUjLy9Xb3JrT3JkZXJUeXBlL3N0YXJ0VG9GaW5pc2giLz4KLSAgICA8L2dlbkVudW1zPgotICAgIDxnZW5FbnVtcyBlY29yZUVudW09InVtYS5lY29yZSMvL1BzZXVkb1N0YXRlS2luZCI+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9InVtYS5lY29yZSMvL1BzZXVkb1N0YXRlS2luZC9pbml0aWFsIi8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9InVtYS5lY29yZSMvL1BzZXVkb1N0YXRlS2luZC9qb2luIi8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9InVtYS5lY29yZSMvL1BzZXVkb1N0YXRlS2luZC9mb3JrIi8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9InVtYS5lY29yZSMvL1BzZXVkb1N0YXRlS2luZC9qdW5jdGlvbiIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJ1bWEuZWNvcmUjLy9Qc2V1ZG9TdGF0ZUtpbmQvY2hvaWNlIi8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9InVtYS5lY29yZSMvL1BzZXVkb1N0YXRlS2luZC9lbnRyeVBvaW50Ii8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9InVtYS5lY29yZSMvL1BzZXVkb1N0YXRlS2luZC9leGl0UG9pbnQiLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0idW1hLmVjb3JlIy8vUHNldWRvU3RhdGVLaW5kL3Rlcm1pbmF0ZSIvPgotICAgIDwvZ2VuRW51bXM+Ci0gICAgPGdlbkVudW1zIGVjb3JlRW51bT0idW1hLmVjb3JlIy8vVmFyaWFiaWxpdHlUeXBlIj4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0idW1hLmVjb3JlIy8vVmFyaWFiaWxpdHlUeXBlL25hIi8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9InVtYS5lY29yZSMvL1ZhcmlhYmlsaXR5VHlwZS9jb250cmlidXRlcyIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJ1bWEuZWNvcmUjLy9WYXJpYWJpbGl0eVR5cGUvZXh0ZW5kcyIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJ1bWEuZWNvcmUjLy9WYXJpYWJpbGl0eVR5cGUvcmVwbGFjZXMiLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0idW1hLmVjb3JlIy8vVmFyaWFiaWxpdHlUeXBlL2xvY2FsQ29udHJpYnV0aW9uIi8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9InVtYS5lY29yZSMvL1ZhcmlhYmlsaXR5VHlwZS9sb2NhbFJlcGxhY2VtZW50Ii8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9InVtYS5lY29yZSMvL1ZhcmlhYmlsaXR5VHlwZS9leHRlbmRzUmVwbGFjZXMiLz4KLSAgICA8L2dlbkVudW1zPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0idW1hLmVjb3JlIy8vRGF0ZSIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0idW1hLmVjb3JlIy8vVXJpIi8+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJ1bWEuZWNvcmUjLy9VbmxpbWl0ZWROYXR1cmFsIi8+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJ1bWEuZWNvcmUjLy9TdHJpbmciLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9InVtYS5lY29yZSMvL1NldCIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0idW1hLmVjb3JlIy8vU2VxdWVuY2UiLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9InVtYS5lY29yZSMvL0ludGVnZXIiLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9InVtYS5lY29yZSMvL0Zsb2F0Ii8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vQ2xhc3NpZmllciIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1R5cGUiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9FbGVtZW50Ii8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vTmFtZWRFbGVtZW50Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9OYW1lZEVsZW1lbnQvbmFtZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9QYWNrYWdlYWJsZUVsZW1lbnQiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9QYWNrYWdlIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vTmFtZXNwYWNlIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vTWV0aG9kRWxlbWVudCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vTWV0aG9kRWxlbWVudC9ndWlkIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vTWV0aG9kRWxlbWVudC9icmllZkRlc2NyaXB0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL01ldGhvZEVsZW1lbnQvb3duZWRSdWxlcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9NZXRob2RFbGVtZW50L21ldGhvZEVsZW1lbnRQcm9wZXJ0eSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL01ldGhvZEVsZW1lbnQvc3VwcHJlc3NlZCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL01ldGhvZEVsZW1lbnQvb3JkZXJpbmdHdWlkZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Db25zdHJhaW50Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9Db25zdHJhaW50L2JvZHkiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vTWV0aG9kRWxlbWVudFByb3BlcnR5Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9NZXRob2RFbGVtZW50UHJvcGVydHkvdmFsdWUiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vQ29udGVudEVsZW1lbnQiPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0NvbnRlbnRFbGVtZW50L3N1cHBvcnRpbmdNYXRlcmlhbHMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Db250ZW50RWxlbWVudC9jb25jZXB0c0FuZFBhcGVycyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0NvbnRlbnRFbGVtZW50L2NoZWNrbGlzdHMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Db250ZW50RWxlbWVudC9ndWlkZWxpbmVzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vQ29udGVudEVsZW1lbnQvZXhhbXBsZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Db250ZW50RWxlbWVudC9hc3NldHMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Db250ZW50RWxlbWVudC90ZXJtRGVmaW5pdGlvbiIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9EZXNjcmliYWJsZUVsZW1lbnQiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0Rlc2NyaWJhYmxlRWxlbWVudC9wcmVzZW50YXRpb25OYW1lIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0Rlc2NyaWJhYmxlRWxlbWVudC9wcmVzZW50YXRpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9EZXNjcmliYWJsZUVsZW1lbnQvc2hhcGVpY29uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vRGVzY3JpYmFibGVFbGVtZW50L25vZGVpY29uIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0NvbnRlbnREZXNjcmlwdGlvbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vQ29udGVudERlc2NyaXB0aW9uL21haW5EZXNjcmlwdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Db250ZW50RGVzY3JpcHRpb24vc2VjdGlvbnMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9Db250ZW50RGVzY3JpcHRpb24vZXh0ZXJuYWxJZCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0NvbnRlbnREZXNjcmlwdGlvbi9rZXlDb25zaWRlcmF0aW9ucyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9TZWN0aW9uIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9TZWN0aW9uL3NlY3Rpb25OYW1lIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vU2VjdGlvbi9zZWN0aW9uRGVzY3JpcHRpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vU2VjdGlvbi9zdWJTZWN0aW9ucyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1NlY3Rpb24vcHJlZGVjZXNzb3IiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vUm9sZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9IlJlYWRvbmx5IiBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Sb2xlL21vZGlmaWVzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vUm9sZS9yZXNwb25zaWJsZUZvciIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Xb3JrUHJvZHVjdCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vV29ya1Byb2R1Y3QvcmVwb3J0cyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1dvcmtQcm9kdWN0L3RlbXBsYXRlcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1dvcmtQcm9kdWN0L3Rvb2xNZW50b3JzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vV29ya1Byb2R1Y3QvZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1Rhc2siPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1Rhc2svcGVyZm9ybWVkQnkiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9UYXNrL21hbmRhdG9yeUlucHV0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vVGFzay9vdXRwdXQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9UYXNrL2FkZGl0aW9uYWxseVBlcmZvcm1lZEJ5Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vVGFzay9vcHRpb25hbElucHV0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9IlJlYWRvbmx5IiBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9UYXNrL3N0ZXBzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vVGFzay90b29sTWVudG9ycyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1Rhc2svZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1dvcmtEZWZpbml0aW9uIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vV29ya0RlZmluaXRpb24vcHJlY29uZGl0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1dvcmtEZWZpbml0aW9uL3Bvc3Rjb25kaXRpb24iLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vU3RlcCIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0d1aWRhbmNlIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vQXJ0aWZhY3QiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9BcnRpZmFjdC9jb250YWluZXJBcnRpZmFjdCIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9BcnRpZmFjdC9jb250YWluZWRBcnRpZmFjdHMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vRGVsaXZlcmFibGUiPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0RlbGl2ZXJhYmxlL2RlbGl2ZXJlZFdvcmtQcm9kdWN0cyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9PdXRjb21lIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vTWV0aG9kUGFja2FnZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vTWV0aG9kUGFja2FnZS9nbG9iYWwiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9NZXRob2RQYWNrYWdlL3JldXNlZFBhY2thZ2VzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL01ldGhvZFBhY2thZ2UvY2hpbGRQYWNrYWdlcyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Db250ZW50UGFja2FnZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0NvbnRlbnRQYWNrYWdlL2NvbnRlbnRFbGVtZW50cyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9BcnRpZmFjdERlc2NyaXB0aW9uIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9BcnRpZmFjdERlc2NyaXB0aW9uL2JyaWVmT3V0bGluZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0FydGlmYWN0RGVzY3JpcHRpb24vcmVwcmVzZW50YXRpb25PcHRpb25zIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vQXJ0aWZhY3REZXNjcmlwdGlvbi9yZXByZXNlbnRhdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0FydGlmYWN0RGVzY3JpcHRpb24vbm90YXRpb24iLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vV29ya1Byb2R1Y3REZXNjcmlwdGlvbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vV29ya1Byb2R1Y3REZXNjcmlwdGlvbi9wdXJwb3NlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vV29ya1Byb2R1Y3REZXNjcmlwdGlvbi9pbXBhY3RPZk5vdEhhdmluZyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1dvcmtQcm9kdWN0RGVzY3JpcHRpb24vcmVhc29uc0Zvck5vdE5lZWRpbmciLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vRGVsaXZlcmFibGVEZXNjcmlwdGlvbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vRGVsaXZlcmFibGVEZXNjcmlwdGlvbi9leHRlcm5hbERlc2NyaXB0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vRGVsaXZlcmFibGVEZXNjcmlwdGlvbi9wYWNrYWdpbmdHdWlkYW5jZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Sb2xlRGVzY3JpcHRpb24iPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1JvbGVEZXNjcmlwdGlvbi9za2lsbHMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9Sb2xlRGVzY3JpcHRpb24vYXNzaWdubWVudEFwcHJvYWNoZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9Sb2xlRGVzY3JpcHRpb24vc3lub255bXMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vVGFza0Rlc2NyaXB0aW9uIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9UYXNrRGVzY3JpcHRpb24vcHVycG9zZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1Rhc2tEZXNjcmlwdGlvbi9hbHRlcm5hdGl2ZXMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vR3VpZGFuY2VEZXNjcmlwdGlvbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vR3VpZGFuY2VEZXNjcmlwdGlvbi9hdHRhY2htZW50cyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9QcmFjdGljZURlc2NyaXB0aW9uIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9QcmFjdGljZURlc2NyaXB0aW9uL2FkZGl0aW9uYWxJbmZvIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vUHJhY3RpY2VEZXNjcmlwdGlvbi9wcm9ibGVtIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vUHJhY3RpY2VEZXNjcmlwdGlvbi9iYWNrZ3JvdW5kIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vUHJhY3RpY2VEZXNjcmlwdGlvbi9nb2FscyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1ByYWN0aWNlRGVzY3JpcHRpb24vYXBwbGljYXRpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9QcmFjdGljZURlc2NyaXB0aW9uL2xldmVsc09mQWRvcHRpb24iLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vUG9pbnQiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1BvaW50L3giLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9Qb2ludC95Ii8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0dyYXBoRWxlbWVudCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0dyYXBoRWxlbWVudC9wb3NpdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9HcmFwaEVsZW1lbnQvY29udGFpbmVkIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0dyYXBoRWxlbWVudC9saW5rIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0dyYXBoRWxlbWVudC9hbmNob3JhZ2UiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vR3JhcGhFbGVtZW50L3NlbWFudGljTW9kZWwiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vRGlhZ3JhbUVsZW1lbnQiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0RpYWdyYW1FbGVtZW50L2lzVmlzaWJsZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9EaWFncmFtRWxlbWVudC9jb250YWluZXIiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9EaWFncmFtRWxlbWVudC9yZWZlcmVuY2UiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vRGlhZ3JhbUVsZW1lbnQvcHJvcGVydHkiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vRGlhZ3JhbUxpbmsiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0RpYWdyYW1MaW5rL3pvb20iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vRGlhZ3JhbUxpbmsvdmlld3BvcnQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vRGlhZ3JhbUxpbmsvZ3JhcGhFbGVtZW50Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vRGlhZ3JhbUxpbmsvZGlhZ3JhbSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9HcmFwaENvbm5lY3RvciI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0dyYXBoQ29ubmVjdG9yL2dyYXBoRWxlbWVudCIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0dyYXBoQ29ubmVjdG9yL2dyYXBoRWRnZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9TZW1hbnRpY01vZGVsQnJpZGdlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9TZW1hbnRpY01vZGVsQnJpZGdlL3ByZXNlbnRhdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9TZW1hbnRpY01vZGVsQnJpZGdlL2dyYXBoRWxlbWVudCIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9TZW1hbnRpY01vZGVsQnJpZGdlL2RpYWdyYW0iLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vRGltZW5zaW9uIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9EaW1lbnNpb24vd2lkdGgiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9EaW1lbnNpb24vaGVpZ2h0Ii8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1JlZmVyZW5jZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vUmVmZXJlbmNlL2lzSW5kaXZpZHVhbFJlcHJlc2VudGF0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vUmVmZXJlbmNlL3JlZmVyZW5jZWQiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vUHJvcGVydHkiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1Byb3BlcnR5L2tleSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1Byb3BlcnR5L3ZhbHVlIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0dyYXBoRWRnZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vR3JhcGhFZGdlL2FuY2hvciIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9HcmFwaEVkZ2Uvd2F5cG9pbnRzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0RpYWdyYW0iPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0RpYWdyYW0vem9vbSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9EaWFncmFtL3ZpZXdwb2ludCIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0RpYWdyYW0vZGlhZ3JhbUxpbmsiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vRGlhZ3JhbS9uYW1lc3BhY2UiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vR3JhcGhOb2RlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vR3JhcGhOb2RlL3NpemUiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnQiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1NpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50L3R5cGVJbmZvIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1VNQVNlbWFudGljTW9kZWxCcmlkZ2UiPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1VNQVNlbWFudGljTW9kZWxCcmlkZ2UvZWxlbWVudCIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Db3JlU2VtYW50aWNNb2RlbEJyaWRnZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vQ29yZVNlbWFudGljTW9kZWxCcmlkZ2UvZWxlbWVudCIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9MZWFmRWxlbWVudCIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1RleHRFbGVtZW50Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9UZXh0RWxlbWVudC90ZXh0Ii8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0ltYWdlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9JbWFnZS91cmkiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9JbWFnZS9taW1lVHlwZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9HcmFwaGljUHJpbWl0aXZlIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vUG9seWxpbmUiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1BvbHlsaW5lL2Nsb3NlZCIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Qb2x5bGluZS93YXlwb2ludHMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vRWxsaXBzZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vRWxsaXBzZS9yYWRpdXNYIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vRWxsaXBzZS9yYWRpdXNZIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vRWxsaXBzZS9yb3RhdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0VsbGlwc2Uvc3RhcnRBbmdsZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0VsbGlwc2UvZW5kQW5nbGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vRWxsaXBzZS9jZW50ZXIiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vQWN0aXZpdHkiPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0FjdGl2aXR5L2JyZWFrZG93bkVsZW1lbnRzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vQWN0aXZpdHkvcm9hZG1hcHMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9BY3Rpdml0eS9zdXBwb3J0aW5nTWF0ZXJpYWxzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vQWN0aXZpdHkvY2hlY2tsaXN0cyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0FjdGl2aXR5L2NvbmNlcHRzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vQWN0aXZpdHkvZXhhbXBsZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9BY3Rpdml0eS9ndWlkZWxpbmVzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vQWN0aXZpdHkvcmV1c2FibGVBc3NldHMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9BY3Rpdml0eS9pc0VuYWN0YWJsZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Xb3JrQnJlYWtkb3duRWxlbWVudCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vV29ya0JyZWFrZG93bkVsZW1lbnQvaXNSZXBlYXRhYmxlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vV29ya0JyZWFrZG93bkVsZW1lbnQvaXNPbmdvaW5nIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vV29ya0JyZWFrZG93bkVsZW1lbnQvaXNFdmVudERyaXZlbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1dvcmtCcmVha2Rvd25FbGVtZW50L2xpbmtUb1ByZWRlY2Vzc29yIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0JyZWFrZG93bkVsZW1lbnQiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0JyZWFrZG93bkVsZW1lbnQvcHJlZml4Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vQnJlYWtkb3duRWxlbWVudC9pc1BsYW5uZWQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9CcmVha2Rvd25FbGVtZW50L2hhc011bHRpcGxlT2NjdXJyZW5jZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9CcmVha2Rvd25FbGVtZW50L2lzT3B0aW9uYWwiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9CcmVha2Rvd25FbGVtZW50L3ByZXNlbnRlZEFmdGVyIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vQnJlYWtkb3duRWxlbWVudC9wcmVzZW50ZWRCZWZvcmUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vQnJlYWtkb3duRWxlbWVudC9wbGFubmluZ0RhdGEiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9CcmVha2Rvd25FbGVtZW50L3N1cGVyQWN0aXZpdGllcyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9NaWxlc3RvbmUiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9JdGVyYXRpb24iLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9QaGFzZSIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1RlYW1Qcm9maWxlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9UZWFtUHJvZmlsZS90ZWFtUm9sZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9UZWFtUHJvZmlsZS9zdXBlclRlYW0iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9UZWFtUHJvZmlsZS9zdWJUZWFtIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1JvbGVEZXNjcmlwdG9yIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Sb2xlRGVzY3JpcHRvci9Sb2xlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9IlJlYWRvbmx5IiBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Sb2xlRGVzY3JpcHRvci9tb2RpZmllcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1JvbGVEZXNjcmlwdG9yL3Jlc3BvbnNpYmxlRm9yIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1dvcmtPcmRlciI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vV29ya09yZGVyL2xpbmtUeXBlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vV29ya09yZGVyL3ByZWQiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vUHJvY2Vzc0VsZW1lbnQiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9QbGFubmluZ0RhdGEiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1BsYW5uaW5nRGF0YS9zdGFydERhdGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9QbGFubmluZ0RhdGEvZmluaXNoRGF0ZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1BsYW5uaW5nRGF0YS9yYW5rIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0Rlc2NyaXB0b3IiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0Rlc2NyaXB0b3IvaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1dvcmtQcm9kdWN0RGVzY3JpcHRvciI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vV29ya1Byb2R1Y3REZXNjcmlwdG9yL2FjdGl2aXR5RW50cnlTdGF0ZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1dvcmtQcm9kdWN0RGVzY3JpcHRvci9hY3Rpdml0eUV4aXRTdGF0ZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1dvcmtQcm9kdWN0RGVzY3JpcHRvci9Xb3JrUHJvZHVjdCIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1dvcmtQcm9kdWN0RGVzY3JpcHRvci9pbXBhY3RlZEJ5Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vV29ya1Byb2R1Y3REZXNjcmlwdG9yL2ltcGFjdHMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Xb3JrUHJvZHVjdERlc2NyaXB0b3IvZGVsaXZlcmFibGVQYXJ0cyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9UYXNrRGVzY3JpcHRvciI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vVGFza0Rlc2NyaXB0b3IvVGFzayIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1Rhc2tEZXNjcmlwdG9yL2FkZGl0aW9uYWxseVBlcmZvcm1lZEJ5Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vVGFza0Rlc2NyaXB0b3IvYXNzaXN0ZWRCeSIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1Rhc2tEZXNjcmlwdG9yL2V4dGVybmFsSW5wdXQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9UYXNrRGVzY3JpcHRvci9tYW5kYXRvcnlJbnB1dCIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1Rhc2tEZXNjcmlwdG9yL29wdGlvbmFsSW5wdXQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9UYXNrRGVzY3JpcHRvci9vdXRwdXQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9UYXNrRGVzY3JpcHRvci9wZXJmb3JtZWRQcmltYXJpbHlCeSIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1Rhc2tEZXNjcmlwdG9yL3NlbGVjdGVkU3RlcHMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vQ29tcG9zaXRlUm9sZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vQ29tcG9zaXRlUm9sZS9hZ2dyZWdhdGVkUm9sZXMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9CcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24vdXNhZ2VHdWlkYW5jZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9BY3Rpdml0eURlc2NyaXB0aW9uIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9BY3Rpdml0eURlc2NyaXB0aW9uL3B1cnBvc2UiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9BY3Rpdml0eURlc2NyaXB0aW9uL2FsdGVybmF0aXZlcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0FjdGl2aXR5RGVzY3JpcHRpb24vaG93dG9TdGFmZiIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24vc2NhbGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbi9wcm9qZWN0Q2hhcmFjdGVyaXN0aWNzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24vcmlza0xldmVsIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24vZXN0aW1hdGluZ1RlY2huaXF1ZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uL3Byb2plY3RNZW1iZXJFeHBlcnRpc2UiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbi90eXBlT2ZDb250cmFjdCIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Qcm9jZXNzRGVzY3JpcHRpb24iPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1Byb2Nlc3NEZXNjcmlwdGlvbi9zY29wZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1Byb2Nlc3NEZXNjcmlwdGlvbi91c2FnZU5vdGVzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0Rlc2NyaXB0b3JEZXNjcmlwdGlvbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vRGVzY3JpcHRvckRlc2NyaXB0aW9uL3JlZmluZWREZXNjcmlwdGlvbiIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Db25jZXB0Ii8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vQ2hlY2tsaXN0Ii8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vRXhhbXBsZSIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0d1aWRlbGluZSIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1JlcG9ydCIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1RlbXBsYXRlIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vU3VwcG9ydGluZ01hdGVyaWFsIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vVG9vbE1lbnRvciIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1doaXRlcGFwZXIiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9UZXJtRGVmaW5pdGlvbiIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1ByYWN0aWNlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vUHJhY3RpY2Uvc3ViUHJhY3RpY2VzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vUHJhY3RpY2UvY29udGVudFJlZmVyZW5jZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9QcmFjdGljZS9hY3Rpdml0eVJlZmVyZW5jZXMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vUmV1c2FibGVBc3NldCIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1N0YXRlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9TdGF0ZS9Xb3JrUHJvZHVjdCIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9TdGF0ZS9SZWdpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9TdGF0ZS9zdWJtYWNoaW5lIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1ZlcnRleCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1ZlcnRleC9jb250YWluZXIiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9WZXJ0ZXgvb3V0Z29pbmciLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9WZXJ0ZXgvaW5jb21pbmciLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vUmVnaW9uIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vUmVnaW9uL1ZlcnRleCIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9SZWdpb24vVHJhbnNpdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9SZWdpb24vU3RhdGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vUmVnaW9uL1N0YXRlTWFjaGluZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9TdGF0ZU1hY2hpbmUiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9TdGF0ZU1hY2hpbmUvUmVnaW9uIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1RyYW5zaXRpb24iPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1RyYW5zaXRpb24vV29ya0RlZmluaXRpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vVHJhbnNpdGlvbi9jb250YWluZXIiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9UcmFuc2l0aW9uL3NvdXJjZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1RyYW5zaXRpb24vdGFyZ2V0Ii8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1BzZXVkb1N0YXRlIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vRGlzY2lwbGluZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vRGlzY2lwbGluZS90YXNrcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9EaXNjaXBsaW5lL3N1YmRpc2NpcGxpbmUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9EaXNjaXBsaW5lL3JlZmVyZW5jZVdvcmtmbG93cyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Db250ZW50Q2F0ZWdvcnkiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Sb2xlU2V0Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Sb2xlU2V0L3JvbGVzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0RvbWFpbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vRG9tYWluL3dvcmtQcm9kdWN0cyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Eb21haW4vc3ViZG9tYWlucyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Xb3JrUHJvZHVjdFR5cGUiPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1dvcmtQcm9kdWN0VHlwZS93b3JrUHJvZHVjdHMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vRGlzY2lwbGluZUdyb3VwaW5nIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9EaXNjaXBsaW5lR3JvdXBpbmcvZGlzY2lwbGluZXMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vVG9vbCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vVG9vbC90b29sTWVudG9ycyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Sb2xlU2V0R3JvdXBpbmciPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1JvbGVTZXRHcm91cGluZy9yb2xlU2V0cyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9DdXN0b21DYXRlZ29yeSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vQ3VzdG9tQ2F0ZWdvcnkvY2F0ZWdvcml6ZWRFbGVtZW50cyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0N1c3RvbUNhdGVnb3J5L3N1YkNhdGVnb3JpZXMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vRGVsaXZlcnlQcm9jZXNzIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9EZWxpdmVyeVByb2Nlc3MvZWR1Y2F0aW9uTWF0ZXJpYWxzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vRGVsaXZlcnlQcm9jZXNzL2NvbW11bmljYXRpb25zTWF0ZXJpYWxzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1Byb2Nlc3MiPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1Byb2Nlc3MvaW5jbHVkZXNQYXR0ZXJucyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1Byb2Nlc3MvZGVmYXVsdENvbnRleHQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Qcm9jZXNzL3ZhbGlkQ29udGV4dCIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9DYXBhYmlsaXR5UGF0dGVybiIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1Byb2Nlc3NQbGFubmluZ1RlbXBsYXRlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Qcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZS9iYXNlZE9uUHJvY2Vzc2VzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1JvYWRtYXAiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Qcm9jZXNzQ29tcG9uZW50Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Qcm9jZXNzQ29tcG9uZW50L2ludGVyZmFjZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vUHJvY2Vzc0NvbXBvbmVudC9wcm9jZXNzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1Byb2Nlc3NQYWNrYWdlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vUHJvY2Vzc1BhY2thZ2UvcHJvY2Vzc0VsZW1lbnRzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1Byb2Nlc3NQYWNrYWdlL2RpYWdyYW1zIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1Byb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlL2ludGVyZmFjZVNwZWNpZmljYXRpb25zIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1Byb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UvaW50ZXJmYWNlSU8iLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vUHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3IiPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1Byb2Nlc3NDb21wb25lbnREZXNjcmlwdG9yL1Byb2Nlc3NDb21wb25lbnQiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vTWV0aG9kUGx1Z2luIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9NZXRob2RQbHVnaW4vdXNlckNoYW5nZWFibGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vTWV0aG9kUGx1Z2luL21ldGhvZFBhY2thZ2VzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vTWV0aG9kUGx1Z2luL2Jhc2VzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1ZhcmlhYmlsaXR5RWxlbWVudCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vVmFyaWFiaWxpdHlFbGVtZW50L3ZhcmlhYmlsaXR5VHlwZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1ZhcmlhYmlsaXR5RWxlbWVudC92YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50Ii8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL01ldGhvZFVuaXQiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL01ldGhvZFVuaXQvYXV0aG9ycyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL01ldGhvZFVuaXQvY2hhbmdlRGF0ZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL01ldGhvZFVuaXQvY2hhbmdlRGVzY3JpcHRpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9NZXRob2RVbml0L3ZlcnNpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9NZXRob2RVbml0L2NvcHlyaWdodFN0YXRlbWVudCIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9NZXRob2RDb25maWd1cmF0aW9uIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9NZXRob2RDb25maWd1cmF0aW9uL21ldGhvZFBsdWdpblNlbGVjdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL01ldGhvZENvbmZpZ3VyYXRpb24vbWV0aG9kUGFja2FnZVNlbGVjdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL01ldGhvZENvbmZpZ3VyYXRpb24vcHJvY2Vzc1ZpZXdzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vTWV0aG9kQ29uZmlndXJhdGlvbi9kZWZhdWx0VmlldyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL01ldGhvZENvbmZpZ3VyYXRpb24vYmFzZUNvbmZpZ3VyYXRpb25zIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vTWV0aG9kQ29uZmlndXJhdGlvbi9zdWJ0cmFjdGVkQ2F0ZWdvcnkiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9NZXRob2RDb25maWd1cmF0aW9uL2FkZGVkQ2F0ZWdvcnkiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vUHJvY2Vzc0ZhbWlseSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vUHJvY2Vzc0ZhbWlseS9kZWxpdmVyeVByb2Nlc3NlcyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9NZXRob2RMaWJyYXJ5Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vTWV0aG9kTGlicmFyeS9tZXRob2RQbHVnaW5zIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL01ldGhvZExpYnJhcnkvcHJlZGVmaW5lZENvbmZpZ3VyYXRpb25zIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICA8L2dlblBhY2thZ2VzPgotPC9nZW5tb2RlbDpHZW5Nb2RlbD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvbW9kZWwvMS4wLjUvVW5pZmllZE1ldGhvZEFyY2hpdGVjdHVyZS5lbXggYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL21vZGVsLzEuMC41L1VuaWZpZWRNZXRob2RBcmNoaXRlY3R1cmUuZW14CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OWVhNDE5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvbW9kZWwvMS4wLjUvVW5pZmllZE1ldGhvZEFyY2hpdGVjdHVyZS5lbXgKKysrIC9kZXYvbnVsbApAQCAtMSwyNjkwNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTwhLS14dG9vbHMyX3VuaXZlcnNhbF90eXBlX21hbmFnZXItLT4NCi08P2NvbS5pYm0ueHRvb2xzLmVtZi5jb3JlLnNpZ25hdHVyZSA8c2lnbmF0dXJlIGlkPSJjb20uaWJtLnh0b29scy5tbWkudWkuc2lnbmF0dXJlcy5kaWFncmFtIiB2ZXJzaW9uPSI3LjAuMCI+PGZlYXR1cmUgZGVzY3JpcHRpb249IiIgbmFtZT0iUmF0aW9uYWwgTW9kZWxpbmcgUGxhdGZvcm0gKGNvbS5pYm0ueHRvb2xzLnJtcCkiIHVybD0iIiB2ZXJzaW9uPSI3LjAuMCIvPjwvc2lnbmF0dXJlPj8+DQotPD9jb20uaWJtLnh0b29scy5lbWYuY29yZS5zaWduYXR1cmUgPHNpZ25hdHVyZSBpZD0iY29tLmlibS54dG9vbHMudW1sLm1zbC5tb2RlbCIgdmVyc2lvbj0iNy4wLjAiPjxmZWF0dXJlIGRlc2NyaXB0aW9uPSIiIG5hbWU9ImNvbS5pYm0ueHRvb2xzLnJ1bWwuZmVhdHVyZSIgdXJsPSIiIHZlcnNpb249IjcuMC4wIi8+PC9zaWduYXR1cmU+Pz4NCi08eG1pOlhNSSB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhtbG5zOkRlZmF1bHQ9Imh0dHA6Ly8vc2NoZW1hcy9EZWZhdWx0LzEiIHhtbG5zOkVjb3JlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3VtbDIvc2NoZW1hcy9FY29yZS8zIiB4bWxuczplY29yZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSIgeG1sbnM6bm90YXRpb249Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZ21mL3J1bnRpbWUvMS4wLjAvbm90YXRpb24iIHhtbG5zOnVtbD0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy91bWwyLzIuMC4wL1VNTCIgeG1sbnM6dW1sbm90YXRpb249Imh0dHA6Ly93d3cuaWJtLmNvbS94dG9vbHMvMS41LjIvVW1sbm90YXRpb24iIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovLy9zY2hlbWFzL0RlZmF1bHQvMSBwYXRobWFwOi8vVU1MMl9NU0xfUFJPRklMRVMvRGVmYXVsdC5lcHgjX0lOOGs4TW1CRWRxQmNOMVI2RXZXVXc/RGVmYXVsdC9EZWZhdWx0PyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3VtbDIvc2NoZW1hcy9FY29yZS8zIHBhdGhtYXA6Ly9VTUxfUFJPRklMRVMvRWNvcmUucHJvZmlsZS51bWwjX3Z5LUhVWWluRWRxdHZibmZCMkxfNXciPg0KLSAgPHVtbDpNb2RlbCB4bWk6aWQ9IjNBREM3Qjc0MDIyRCIgbmFtZT0iVW5pZmllZE1ldGhvZEFyY2hpdGVjdHVyZSI+DQotICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfQlROcUFPeGhFZHVIamUzcFBhaE40QSIgc291cmNlPSJ1bWwyLmRpYWdyYW1zIi8+DQotICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfUDRvc1lPb2VFZHVWQTd2dDVxYklKUSIgYW5ub3RhdGVkRWxlbWVudD0iM0FEQzdCNzQwMjJEIj4NCi0gICAgICA8Ym9keT5HZW5lcmFsIG9wZW4gaXNzdWUgYW5kIHRvLWRvczomI3hEOw0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tJiN4RDsNCi0tIElzc3VlOiBVTUwgMi4wIG5hbWluZyBjb252ZW50aW9ucyBkb2VzIG5vdCBhbGxvdyBwbHVyYWwgcm9sZSBuYW1lcyYjeEQ7DQotLSBzeW5jIHVwIG5hbWVzIHRvIFVJIG5hbWVzOyBlLmcuIFBhY2thZ2luZyBJbnN0cnVjdGlvbnMmI3hEOw0KLS0gbWFrZSBBY3Rpdml0eSB0byBCcmVha2Rvd24gRWxlbWVudCBhZ2dyZWdhdGlvbiBhIGNvbXBvc2l0aW9uJiN4RDsNCi0mI3hEOw0KLVZlcnNpb24gMS4wLjUgY2hhbmdlczomI3hEOw0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tJiN4RDsNCi0tIGFkZGVkIGlzU3VwcG9ydGluZyBib29sZWFuIGF0dHJpYnV0ZSB0byBtZXRob2QgcGx1Z2luJiN4RDsNCi0tIG1hcmtlZCBVTUwgRGlhZ3JhbSBJbnRlcmNoYW5nZSBhbmQgUHJvY2VzcyBEaWFncmFtcyBwYWNrYWdlIGFzIGRlcHJlY2F0ZWQmI3hEOw0KLSAgZGlhZ3JhbXMgYXJlIG1hbmFnZWQgYnkgc2VwZXJhdGUgbW9kZWxzIGJhc2VkIG9uIFVNTCAyIHNpbmNlIDEuMC40JiN4RDsNCi0tIG1vdmVkIFByaW1pdGl2ZSBUeXBlcyBwYWNrYWdlcyB0aGF0IGNvbXByaXNlcyBvZiBhbGwgcHJpbWl0aXZlIHR5cGVzIHVzZWQgYnkgdGhlIG1vZGVsJiN4RDsNCi0gIGZyb20gSW5kcmFzdHJ1Y3R1cmUgTWluaSB0byB0aGUgVU1BIHRvcC1sZXZlbCBwYWNrYWdlJiN4RDsNCi0tIHJlbW92ZWQgV29yayBQcm9kdWN0IFN0YXRlcyBwYWNrYWdlJiN4RDsNCi0tIGNoYW5nZWQgbXVsdGlwbGljaXR5IGZyb20gVGFzayBhbmQgUm9sZSB0byBtYW55LXRvLW1hbnkmI3hEOw0KLS0gY2hhbmdlZCBtdWx0aXBsaWNpdHkgZnJvbSBUYXNrIERlc2NyaXB0b3IgdG8gUm9sZSBEZXNjcmlwdG9yIHRvIG1hbnktdG8tbWFueSYjeEQ7DQotLSBjaGFuZ2VkIG11bHRpcGxpY2l0eSBiZXR3ZWVuIFRvb2wgYW5kIFRvb2wgTWVudG9yIHRvIG1hbnQtdG8tbWFueSYjeEQ7DQotLSBtb3ZlZCBQcmVzZW50YXRpb24gTmFtZSBhdHRyaWJ1dGUgZnJvbSBEZXNjcmliYWJsZSBFbGVtZW50IHRvIE1ldGhvZCBFbGVtZW50JiN4RDsNCi0gIHRvIGFsbG93IGFsbCBlbGVtZW50cyAoZS5nLiBtZXRob2QgcGx1Z2luIG9yIGNvbmZpZ3VyYXRpb24pIHRvIGJlIHRyYW5zbGF0YWJsZSAmI3hEOw0KLS0gYWRkZWQgbG9uZ1ByZXNlbnRhdGlvbk5hbWUgYXR0cmlidXRlIGZvciBhbGwgRGVzY3JpYmFibGVFbGVtZW50cyYjeEQ7DQotLSBhZGRlZCAnaXNBYnN0cmFjdCcgQm9vbGVhbiBhdHRyaWJ1dGUgKGRlZmF1bHQgaXMgZmFsc2UpIHRvIENsYXNzaWZpZXIgaW4gVU1MMkluZnJhc3RydWN0dXJlTWluaSYjeEQ7DQotICB3aGljaCB3aWxsIGJlIHVzZWQgdG8gcmVwcmVzZW50IHNsb3RzOyB1c2VkIG9ubHkgYnkgV29yayBQcm9kdWN0cyBpbml0aWFsbHkmI3hEOw0KLS0gTW92ZWQgYXNzb2NpYXRpb25zIGZyb20gQWN0aXZpdHkgdG8gYWxsIG9mIGl0cyBhbGxvd2VkIGd1aWRhbmNlIHR5cGUgdXAgdG8gQnJlYWtkb3duIEVsZW1lbnQmI3hEOw0KLSAgdG8gYWxsb3cgYXR0YWNoaW5nIGd1aWRhbmNlIHRvIGRlc2NyaXB0b3JzIGFuZCBtaWxlc3RvbmVzJiN4RDsNCi0gIChDaGVja2xpc3QsIENvbmNlcHQsIEV4YW1wbGUsIEd1aWRlbGluZSwgUmV1c2FibGUgQXNzZXQsIFN1cHBvcnRpbmcgTWF0ZXJpYWwpJiN4RDsNCi0tIGFkZGVkIG90aGVyIGd1aWRhbmNlIHR5cGVzIHRvIGJlIGxpbmthYmxlIGZyb20gQnJlYWtkb3duIEVsZW1lbnQgYXMgd2VsbCAmI3hEOw0KLSAgKFRvb2xNZW50b3IsIEVzdGltYXRpb25Db25zaWRlcmF0aW9uLCBSZXBvcnQsIFRlbXBsYXRlKSYjeEQ7DQotLSBmaXhlZCBtdWx0aXBsaWNpdHkgb2YgQnJlYWtkb3duIEVsZW1lbnQgKGZvcm1lciBBY3Rpdml0eSkgdG8gUmV1c2FibGUgQXNzZXQgdG8gbWFueS10by1tYW55JiN4RDsNCi0tIGFkZGVkIGFzc29jaWF0aW9uIGZyb20gTWlsZXN0b25lIHRvIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9yIHdpdGggcm9sZSByZXF1aXJlZFJlc3VsdHMmI3hEOw0KLS0gYWRkZWQgdGhlIG5ldyBjb25jZXB0IG9mIEZ1bGZpbGxhYmxlIEVsZW1lbnQgdG8gdGhlIG1ldGhvZCBwbHVnaW4gcGFja2FnZSB0aGF0IGFsbG93cyBtb2RlbGluZyBzbG90cyYjeEQ7DQotLSBhZGRlZCBjbGFzcyBLaW5kIGFzIG5ldyBDb250ZW50IEVsZW1lbnQgdG8gQmFzaWMgRWxlbWVudHMgdGhhdCBhbGxvd3MgZGVmaW5pbmcgbGlnaHQtd2VpZ2h0IHN0ZXJlb3R5cGVzJiN4RDsNCi0gIGZvciBNZXRob2QgRWxlbWVudHM7IGEgS2luZCBjYW4gYmUgYXNzaWduZWQgdG8gaW5zdGFuY2VzIG9mIG11bHRpcGxlIG1ldGEgY2xhc3NlcyAoYXBwbGljYWJsZU1ldGFDbGFzc0luZm8pJiN4RDsNCi0gIHRoZSBBcHBsaWNhYmxlTWV0YUNsYXNzSW5mbyBzdG9yZWQgdGhlIG5hbWUgb2YgdGhlIGFsbG93ZWQgbWV0YWNsYXNzZXMgYXMgd2VsbCBxdWFsaWZpZXMgb25lIGFzIHRoZSYjeEQ7DQotICBwcmltYXJ5IHNlbGVjdGlvbiB0byBiZSBhYmxlIHRvIHVzZSBpdHMga2luZCBpY29ucyBpbiBncmFwaGljYWwgcHJlc2VudGF0aW9ucyYjeEQ7DQotLSBhZGRlZCBDb25maWd1cmF0aW9uIENhdGVnb3J5IGNvbmNlcHRzIHdoaWNoIGlzIHVzZWQgdG8gbW9kZWwgc2VsZWN0aW9uIHdpemFyZHMmI3hEOw0KLS0gbWFkZSBNZXRob2QgQ29uZmlndXJhdGlvbiBhIENvbnRlbnQgRWxlbWVudCB0byBzdG9yZSBpdCBpbiBwbHVnaW4gcGFja2FnZXMgYXMgd2VsbCYjeEQ7DQotJiN4RDsNCi1WZXJzaW9uIDEuMC40IGNoYW5nZXM6JiN4RDsNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tJiN4RDsNCi0tIEFkZGVkIGFzc29jaWF0aW9uIGJldHdlZW4gY29udGVudCBlbGVtZW50IGFuZCB0ZXJtIGRlZmluaXRpb24gdG8gYWxsb3cgYXNzaWduaW5nJiN4RDsNCi0gIGdsb3NzYXkgdGVybXMgYXMgZ3VpZGFuY2UmI3hEOw0KLS0gbW92ZWQgZXh0ZXJuYWxJRCBhdHRyaWJ1dGUgdXAgZnJvbSB3b3JrIHByb2R1Y3QgYW5kIHByb2Nlc3MgdG8gZ2VuZXJhbCBjb250ZW50IGRlc2NyaXB0aW9uJiN4RDsNCi0tIEFkZGVkIHR3byBuZXcgYXR0cmlidXRlcyBmb3IgQXJ0aWZhY3QgRGVzY3JpcHRpb246ICYjeEQ7DQotICByZXByZXNlbnRhdGlvbiBhbmQgbm90YXRpb24mI3hEOw0KLS0gQWRkZWQgYWRkaXRpb25hbCByZWxhdGlvbnNoaXBzIGJldHdlZW4gQ29uZmlndXJhdGlvbiBhbmQgQ2F0ZWdvcmllcyB0byAmI3hEOw0KLSAgbW9kZWwgY29uZmlndXJhdGlvbiBzcGVjaWZpY2F0aW9ucyB3aXRoIGNhdGVnb3JpZXMgYW5kIG5lZ2F0aXZlIHNldHMmI3hEOw0KLS0gTWFkZSBEb21haW4gdG8gV29yayBQcm9kdWN0IGFzc29jaWF0aW9uIG1hbnktdG8tbWFueSYjeEQ7DQotLSBNYWRlIE1ldGhvZCBQYWNrYWdlIG5lc3RpbmcgYXNzb2NpYXRpb24gdW5pZGlyZWN0aW9uYWwmI3hEOw0KLS0gQWRkZWQgTWV0aG9kRWxlbWVudFByb3BlcnR5IGZvciBkZWZpbmluZyBhcHBsaWNhdGlvbiBzcGVjaWZpYyBhdHRyaWJ1dGVzICYjeEQ7DQotICBzdWNoIGFzIHB1YmxpY2F0aW9uIGZsYWdzIGFuZCBmbGFnZ2luZyB1c2VyIHBsdWctaW5zJiN4RDsNCi0tIENoYW5nZWQgMS4uKiBtdWx0aXBsaWNpdGllcyBmb3Igc3RhbmRhcmQgY2F0ZWdvcmllcyB0byAqJiN4RDsNCi0mI3hEOw0KLVZlcnNpb24gMS4wLjMgY2hhbmdlczomI3hEOw0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0mI3hEOw0KLTA3LzI2LzA2JiN4RDsNCi0tIENvcnJlY3RlZCBkZWZhdWx0IHZhbHVlIG9mIE1ldGhvZFBsdWdpbjo6VXNlckNoYW5nZWFibGUgdG8gdHJ1ZSYjeEQ7DQotMDcvMDYvMDYmI3hEOw0KLS0gUmVtb3ZlZCBFc3RpbWF0ZSAgIGFuZCBFc3RpbWF0aW9uIE1ldHJpYyBHdWlkYW5jZSBlbGVtZW50czsgJiN4RDsNCi0gIG9ubHkga2VwdCBFc3RpbWF0aW9uIENvbnNpZGVyYXRpb24mI3hEOw0KLTA2LzIwLzA2JiN4RDsNCi0tIENoYW5nZWQgbXVsdGlwbGljaXR5IGZyb20gZGlzY2lwbGluZSB0byBhY3Rpdml0eSB0byBtYW55IHRvIG1hbnkmI3hEOw0KLTA2LzE1LzA2JiN4RDsNCi0tIENoYW5nZWQgbXVsdGlwbGljaXR5IG9mIHJvbGUgZGVzY3JpcHRvciB0byB3b3JrIHByb2R1Y3RzIGRlc2NyaXB0b3IgdG8gJiN4RDsNCi0gIG1hbnkgdG8gbWFueSYjeEQ7DQotMDYvMTMvMDYmI3hEOw0KLS0gQWRkZWQgZGlyZWN0aW9ucyB0byBkZXNjcmlwdG9yIGFzc29jaWF0aW9ucyB0byBhdm9pZCB0aGF0IGRlc2NyaXB0b3JzJiN4RDsNCi0gIGFkZGVkIHRvIGFuIGFjdGl2aXR5IHZpYSBsb2NhbCBjb250cmlidXRpb24gbW9kaWZ5IGluaGVyaXRlZCBkZXNjcmlwdG9ycyYjeEQ7DQotMDUvMDEvMjAwNiYjeEQ7DQotLSBNb3ZlZCBVTUwyIERpYWdyYW0gSW50ZXJjaGFuZ2UgdG8gdG9wLWxldmVsIHBhY2thZ2UmI3hEOw0KLS0gQ2hhbmdlZCBtdWx0aXBsaWNpdHkgb2YgYnJlYWtkb3duIGVsZW1lbnRzIHRvIGFjdGl2aXRpZXMgdG8gMSYjeEQ7DQotLSBNYWRlIE1ldGhvZCBDb25maWd1cmF0aW9uIGEgTWV0aG9kIFVuaXQmI3hEOw0KLS0gQ2hhbmdlZCBtdWx0aXBsaWNpdHkgZm9yIFRhc2sgdG8gRGlzY2lwbGluZTogYSBUYXNrIGNhbiBub3cgYmUgY2F0ZWdvcml6ZWQmI3hEOw0KLSAgYnkgbW9yZSB0aGFuIG9uZSBEaXNjaXBsaW5lIHRvIGFsbG93IG1vZGVsaW5nIHJlcGxhY2luZyBkaXNjaXBsaW5lcyYjeEQ7DQotLSBDaGFuZ2VkIG11bHRpcGxpY2l0eSBmb3IgUm9sZSB0byBXUDogYSBXUCBjYW4gaGF2ZSBtb3JlIHRoYW4gb25lICYjeEQ7DQotICByZXNwb25zaWJsZSBSb2xlIHRvIGFsbG93IG1vZGVsaW5nIHJlcGxhY2luZyByb2xlcyYjeEQ7DQotLSBOZXN0aW5nIG9mIGRpc2NpcGxpbmVzJiN4RDsNCi0tIFJlbW92ZWQgJnF1b3Q7d29ya2VkT25CeSZxdW90OyBkZXJyaXZlZCBwcm9wZXJ0eSBmb3IgUm9sZURlc2NyaXB0b3IgdG8gV1A7JiN4RDsNCi0gIG1vZGlmaWVzIHByb3BlcnR5IGlzIHN1ZmZpY2llbnQmI3hEOw0KLS0gYWRkZWQgdHdvIG1vcmUgdmFyaWFiaWxpdHkgdHlwZXMgdXNlZCBieSBhY3Rpdml0aWVzOiBsb2NhbENvbnRyaWJ1dGlvbiYjeEQ7DQotICBhbmQgbG9jYWxSZXBsYWNlbWVudDsgdGhpcyBjaGFuZ2UgaXMgb25seSB0ZW1wb3JhcmlseSB0byBtaW5pbWl6ZSBtaWdyYXRpb25zJiN4RDsNCi0gIGlzc3VlczogaW4gdGhlIGZ1dHVyZSB0aGVzZSBuZWVkIHRvIGJlIG1vZGVsZWQgYXMgaW4gU1BFTTIgYXMgYSBzZXBlcmF0ZSAmI3hEOw0KLSAgQWN0aXZpdHlVc2UgY2xhc3MgYW5kIEFjdGl2aXR5VXNlVHlwZSBlbnVtZXJhdGlvbiYjeEQ7DQotLSBDcmVhdGVkIEFjdGl2aXR5IHNwZWNpYWxpemF0aW9uIHRoYXQgYWRkcyBpc0VuYWN0YWJsZT1mYWxzZSBhdHRyaWJ1dGUgaW4mI3hEOw0KLSAgdGhlIHBhY2thZ2UgUHJvY2VzcyAtLT4gV29ya2Zsb3cgcGFja2FnZSYjeEQ7DQotLSBBZGRlZCBkaXJlY3QgYXNzb2NpYXRpb25zIGZyb20gV1AgYW5kIFRhc2sgdG8gRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zJiN4RDsNCi0gIHVudGlsIEVzdGltYXRlIGlzIHVzZWQ7IGFsbG93cyBsaW5raW5nIG9mIGNvbnNpZGVyYXRvbnMgdG8gdGhlc2UgZWxlbWVudHMmI3hEOw0KLS0gUmVtb3ZlZCBQcm9jZXNzIENvbnRyaWJ1dGlvbiBhcyBpdCBpcyByZWR1bmRhbnQgd2l0aCBjcmVhdGluZyBleHRlbmRzICYjeEQ7DQotICBiZXR3ZWVuIFByb2Nlc3NlcyBkaXJlY3RseTwvYm9keT4NCi0gICAgPC9vd25lZENvbW1lbnQ+DQotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpQYWNrYWdlIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MURERTYyMDAxQ0YiIG5hbWU9IlVNTDJJbmZyYXN0cnVjdHVyZU1pbmkiPg0KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfR3h3MWF1ZlhFZHVxSG9PSmJVUlpSdyIgc291cmNlPSJ1bWwyLmRpYWdyYW1zIiByZWZlcmVuY2VzPSJfM0FEQzdCNzQwMjJENDFERjJDNDMwMTUxIj4NCi0gICAgICAgIDxjb250ZW50cyB4bWk6dHlwZT0ibm90YXRpb246RGlhZ3JhbSIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDFERjJDNDMwMTUxIiB0eXBlPSJDbGFzcyIgbmFtZT0iTWFpbiI+DQotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITkNjcy1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFEREY4NjkwMTJFIj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5DY3R1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSE5DY3QtZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOTG1FT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5MbUVlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITkxtRXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5MbUUtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlBhY2thZ2VDb250ZW50cyI+DQotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hOTG1GT2ZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiIGNvbGxhcHNlZD0idHJ1ZSIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSE5DY3RPZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJOb25lIiBzaG93TGlzdFZpc2liaWxpdHk9Ik5vbmUiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ITkNjdGVmWEVkdXFIb09KYlVSWlJ3IiB4PSIzNTUiIHk9Ijg2MyIgd2lkdGg9IjI1NDAiIGhlaWdodD0iMTY3NiIvPg0KLSAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxEaWFncmFtU3R5bGUiIHhtaTppZD0iX0d4dzFiT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPg0KLSAgICAgICAgPC9jb250ZW50cz4NCi0gICAgICA8L2VBbm5vdGF0aW9ucz4NCi0gICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6UGFja2FnZSIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDFEREY4NjkwMTJFIiBuYW1lPSJDb25zdHJ1Y3RzIj4NCi0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfR3h3MVotZlhFZHVxSG9PSmJVUlpSdyIgc291cmNlPSJ1bWwyLmRpYWdyYW1zIiByZWZlcmVuY2VzPSJfM0FEQzdCNzQwMjJENDFEREU2MzYwMDA0Ij4NCi0gICAgICAgICAgPGNvbnRlbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpEaWFncmFtIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MURERTYzNjAwMDQiIHR5cGU9IkNsYXNzIiBuYW1lPSJNYWluIj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE00cmN1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRERFNjY4MDBDRSI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE00cmRlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9ITTRyZHVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTY5MyIgaGVpZ2h0PSIxMDgzIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hNNHJkLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITTRyZU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE00cmVlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE00cmV1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hNNHJlLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE00cmZPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hNNHJmZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE00cmZ1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hNNHJmLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE00cmdPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITTRyZ2VmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSE00cmMtZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hNNHJkT2ZYRWR1cUhvT0piVVJaUnciIHg9IjU5MzciIHk9Ijk5NiIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hNNHJndWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURERUNCNTAwOTgiPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hNNHJoZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSE00cmh1ZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITTRyaC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE00cmlPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hNNHJpZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hNNHJpdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITTRyaS1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hNNHJqT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITTRyamVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hNNHJqdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITTRyai1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hNNHJrT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE00cmtlZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hNNHJnLWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ITTRyaE9mWEVkdXFIb09KYlVSWlJ3IiB4PSI5NjUiIHk9IjY4MjQiIHdpZHRoPSIxNTI0IiBoZWlnaHQ9Ijc2NSIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hNNHJrdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURERTY1ODAxNTciPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hNNHJsZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSE00cmx1ZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITkNjSU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5DY0llZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOQ2NJdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOQ2NJLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hOQ2NKT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5DY0plZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hOQ2NKdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5DY0otZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hOQ2NLT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5DY0tlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITkNjS3VmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSE00cmstZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJOb25lIiBzaG93TGlzdFZpc2liaWxpdHk9Ik5vbmUiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hNNHJsT2ZYRWR1cUhvT0piVVJaUnciIHg9IjMxNyIgeT0iOTE5MyIgd2lkdGg9IjMzMTYiIGhlaWdodD0iMTIxOSIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOQ2NOT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURERkE0NDAzQTgiPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOQ2NOLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSE5DY09PZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITkNjT2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5DY091ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOQ2NPLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOQ2NQT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITkNjUGVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOQ2NQdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITkNjUC1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOQ2NRT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITkNjUWVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOQ2NRdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE5DY1EtZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hOQ2NOZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ITkNjTnVmWEVkdXFIb09KYlVSWlJ3IiB4PSI5MjIwIiB5PSI1MzAwIiB3aWR0aD0iMzEzMiIgaGVpZ2h0PSI3MTIiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITkNjUk9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFEREUwNjIwMkQ1Ij4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITkNjUi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hOQ2NTT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5DY1NlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOQ2NTdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITkNjUy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITkNjVE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITkNjVGVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOQ2NUdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITkNjVC1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOQ2NVT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITkNjVWVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOQ2NVdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE5DY1UtZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hOQ2NSZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iTm9uZSIgc2hvd0xpc3RWaXNpYmlsaXR5PSJOb25lIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ITkNjUnVmWEVkdXFIb09KYlVSWlJ3IiB4PSI1MjQ5IiB5PSIyNjY3IiB3aWR0aD0iMzI4NiIgaGVpZ2h0PSIxMTI0Ii8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5DY2ItZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRERFODMzMDFBNSI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5DY2N1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9ITkNjYy1mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOQ2NkT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITkNjZGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5DY2R1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5DY2QtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hOQ2NlT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5DY2VlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hOQ2NldWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5DY2UtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hOQ2NmT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5DY2ZlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITkNjZnVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSE5DY2NPZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hOQ2NjZWZYRWR1cUhvT0piVVJaUnciIHg9IjQ3MTUiIHk9IjUzNTAiIHdpZHRoPSI0MTQxIiBoZWlnaHQ9IjY1OSIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOQ2NrZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURERkEzNjAyQzEiPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOQ2NsT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSE5DY2xlZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITkNjbHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5DY2wtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOQ2NtT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOQ2NtZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITkNjbXVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOQ2NtLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITkNjbk9mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOQ2NuZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITkNjbnVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOQ2NuLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE5DY29PZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hOQ2NrdWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ITkNjay1mWEVkdXFIb09KYlVSWlJ3IiB4PSI5NDkxIiB5PSI4NjYxIiB3aWR0aD0iMjIyMCIgaGVpZ2h0PSI4MjciLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTERpYWdyYW1TdHlsZSIgeG1pOmlkPSJfR3h3MWFlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4NCi0gICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSE5DY0stZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRERGOEJEMDI4RiIgc291cmNlPSJfSE00cmt1ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSE00cmd1ZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5DY0x1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOQ2NNT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOQ2NNZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hOQ2NMLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSE5DY0xPZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSE5DY0xlZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMCwgLTU0MSwgMCwgMTg0NV0kWzAsIC0xODQ1LCAwLCA1NDFdIi8+DQotICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSE5DY011ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSE5DY00tZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSE5DY1ZPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRERFQ0FGMDIwMiIgc291cmNlPSJfSE5DY1JPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSE00cmN1ZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5DY1YtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOQ2NXZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOQ2NXdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hOQ2NXT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSE5DY1ZlZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSE5DY1Z1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbOCwgLTc5NSwgLTQyLCAxNDkwXSRbMzMsIC0xNzQ0LCAtMTYsIDU0MV0iLz4NCi0gICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9ITkNjVy1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9ITkNjWE9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9ITkNjWGVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFEREY5MTIwM0MwIiBzb3VyY2U9Il9ITTRyZ3VmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9ITkNjUk9mWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITkNjWU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5DY1l1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5DY1ktZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSE5DY1llZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9ITkNjWHVmWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9ITkNjWC1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9Ils2NjgsIC01NTAsIC00MjU4LCAzMzYxXSRbMzkyMCwgLTMxMjQsIC0xMDA3LCA3ODddIi8+DQotICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSE5DY1pPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSE5DY1plZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSE5DY1p1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRERGQjQ1MDNENSIgc291cmNlPSJfSE5DY05PZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSE5DY1JPZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5DY2FlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOQ2NhLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOQ2NiT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hOQ2NhdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSE5DY1otZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSE5DY2FPZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTg0NiwgLTU1MCwgMjg2MSwgMTgzN10kWy0yNDcyLCAtMTYwMCwgMTIzNiwgNzg3XSIvPg0KLSAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hOQ2NiZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hOQ2NidWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hOQ2NmLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURERjhENDAyMTEiIHNvdXJjZT0iX0hOQ2NiLWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hOQ2NST2ZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOQ2NndWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITkNjaE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITkNjaGVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ITkNjZy1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hOQ2NnT2ZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hOQ2NnZWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzAsIC01NTAsIDAsIDE4ODhdJFswLCAtMTY1MSwgMCwgNzg3XSIvPg0KLSAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hOQ2NodWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hOQ2NoLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hOQ2NpT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURERjcxQjAzQTgiIHNvdXJjZT0iX0hNNHJndWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hOQ2NiLWZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOQ2NpLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITkNjamVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITkNjanVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ITkNjak9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hOQ2NpZWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hOQ2NpdWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzc2MiwgLTIzNywgLTQxNjUsIDEyMzZdJFszMDkwLCAtOTMxLCAtMTgzNywgNTQxXSIvPg0KLSAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hOQ2NqLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hOQ2NrT2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hOQ2NvZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURERkJDQTAwRTkiIHNvdXJjZT0iX0hOQ2NrZWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hOQ2NOT2ZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOQ2NwT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITkNjcHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITkNjcC1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ITkNjcGVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hOQ2NvdWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hOQ2NvLWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzAsIC01NDEsIDAsIDI4MTBdJFswLCAtMjgxMCwgMCwgNTQxXSIvPg0KLSAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hOQ2NxT2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hOQ2NxZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hOQ2NxdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURERkJDRjAyQTkiIHNvdXJjZT0iX0hOQ2NrZWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hOQ2NiLWZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOQ2NyZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITkNjci1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITkNjc09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ITkNjcnVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hOQ2NxLWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hOQ2NyT2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy02MDEsIC01NDEsIDMxMDcsIDI3NjBdJFstMzA5OCwgLTI3NjAsIDYwOSwgNTQxXSIvPg0KLSAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hOQ2NzZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hOQ2NzdWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgIDwvY29udGVudHM+DQotICAgICAgICA8L2VBbm5vdGF0aW9ucz4NCi0gICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDFEREU2NTgwMTU3IiBuYW1lPSJDbGFzc2lmaWVyIiBpc0Fic3RyYWN0PSJ0cnVlIj4NCi0gICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HeGQ2ZHVmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDFEREU2NTgwMTU3Ij4NCi0gICAgICAgICAgICA8Ym9keT5VTUwgMi4wIG1ldGEtY2xhc3MgQ2xhc3NpZmllci48L2JvZHk+DQotICAgICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDFEREY4QkQwMjhGIiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDFEREVDQjUwMDk4Ii8+DQotICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il9sV1F3QWNVeUVkeTJtdVEyUFF2SF9BIiBuYW1lPSJpc0Fic3RyYWN0IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il81R2NZQU9pZUVkdVFidVk2VXdNU1FnIj4NCi0gICAgICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEJvb2xlYW4iIHhtaTppZD0iX2xUZGVNTVV6RWR5Mm11UTJQUXZIX0EiIHR5cGU9Il81R2NZQU9pZUVkdVFidVk2VXdNU1FnIi8+DQotICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDFEREU2NjgwMENFIiBuYW1lPSJFbGVtZW50IiBpc0Fic3RyYWN0PSJ0cnVlIj4NCi0gICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HeG5yYy1mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDFEREU2NjgwMENFIj4NCi0gICAgICAgICAgICA8Ym9keT5VTUwgMi4wIG1ldGEtY2xhc3MgRWxlbWVudC48L2JvZHk+DQotICAgICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxRERFMDYyMDJENSIgbmFtZT0iTmFtZWRFbGVtZW50IiBpc0Fic3RyYWN0PSJ0cnVlIj4NCi0gICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HeG5yZHVmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDFEREUwNjIwMkQ1Ij4NCi0gICAgICAgICAgICA8Ym9keT5VTUwgMi4wIG1ldGEtY2xhc3MgTmFtZWQgRWxlbWVudC4gIERlZmluZWQgdGhhdCBldmVyeSBlbGVtZW50IGhhcyBhIG5hbWUuPC9ib2R5Pg0KLSAgICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxRERFQ0FGMDIwMiIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQxRERFNjY4MDBDRSIvPg0KLSAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDFEREZDOEUwMEI2IiBuYW1lPSJuYW1lIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiPg0KLSAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0Vnc3lnZXlKRWR1NS12VmpsZlZzZlEiIHZhbHVlPSIxIi8+DQotICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfRWdzeWdPeUpFZHU1LXZWamxmVnNmUSIvPg0KLSAgICAgICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il9FWXBwd095SkVkdTUtdlZqbGZWc2ZRIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIiB2YWx1ZT0iIi8+DQotICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDFEREU4MzMwMUE1IiBuYW1lPSJQYWNrYWdlYWJsZUVsZW1lbnQiIGlzQWJzdHJhY3Q9InRydWUiPg0KLSAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0d4bnJlLWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURERTgzMzAxQTUiPg0KLSAgICAgICAgICAgIDxib2R5PlVNTCAyLjAgbWV0YS1jbGFzcyBQYWNrYWdhYmxlIEVsZW1lbnQuPC9ib2R5Pg0KLSAgICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxRERGOEQ0MDIxMSIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQxRERFMDYyMDJENSIvPg0KLSAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxRERFQ0I1MDA5OCIgbmFtZT0iVHlwZSIgaXNBYnN0cmFjdD0idHJ1ZSI+DQotICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3hucmYtZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRERFQ0I1MDA5OCI+DQotICAgICAgICAgICAgPGJvZHk+VU1MIDIuMCBtZXRhLWNsYXNzIFR5cGUuPC9ib2R5Pg0KLSAgICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxRERGNzFCMDNBOCIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQxRERFODMzMDFBNSIvPg0KLSAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDFEREY5MTIwM0MwIiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDFEREUwNjIwMkQ1Ii8+DQotICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDFEREZBMzYwMkMxIiBuYW1lPSJQYWNrYWdlIj4NCi0gICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HeG5yaE9mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDFEREZBMzYwMkMxIj4NCi0gICAgICAgICAgICA8Ym9keT5VTUwgMi4wIG1ldGEtY2xhc3MgUGFja2FnZS48L2JvZHk+DQotICAgICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDFEREZCQ0EwMEU5IiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDFEREZBNDQwM0E4Ii8+DQotICAgICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MURERkJDRjAyQTkiIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0MURERTgzMzAxQTUiLz4NCi0gICAgICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MURERkE0NDAzQTgiIG5hbWU9Ik5hbWVzcGFjZSIgaXNBYnN0cmFjdD0idHJ1ZSI+DQotICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3h3MVpPZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRERGQTQ0MDNBOCI+DQotICAgICAgICAgICAgPGJvZHk+VU1MIDIuMCBtZXRhLWNsYXNzIE5hbWVzcGFjZS48L2JvZHk+DQotICAgICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDFEREZCNDUwM0Q1IiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDFEREUwNjIwMkQ1Ii8+DQotICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpQYWNrYWdlIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkQwNDAwRjEiIG5hbWU9IlVuaWZpZWRNZXRob2RBcmNoaXRlY3R1cmUiPg0KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfR3d1VG11ZlhFZHVxSG9PSmJVUlpSdyIgc291cmNlPSJ1bWwyLmRpYWdyYW1zIiByZWZlcmVuY2VzPSJfM0FEQzdCNzQwMjJENDBGNTY0RkEwMDk1Ij4NCi0gICAgICAgIDxjb250ZW50cyB4bWk6dHlwZT0ibm90YXRpb246RGlhZ3JhbSIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGNTY0RkEwMDk1IiB0eXBlPSJDbGFzcyIgbmFtZT0iTWFpbiI+DQotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITEdpdS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOb3RlIj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSExHaXZ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRGlhZ3JhbU5hbWUiPg0KLSAgICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hMR2l2LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkRlc2NyaXB0aW9uIj4NCi0gICAgICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOlNoYXBlU3R5bGUiIHhtaTppZD0iX0hMR2l2T2ZYRWR1cUhvT0piVVJaUnciIGZvbnROYW1lPSJBcmlhbCIgZGVzY3JpcHRpb249IkRlZmluZXMgaG93IGNvcmUgY29udGVudCBlbGVtZW50cyBjYW4gYmUgb3JnYW5pemVkIGZvciBpbnN0YW50aWF0aW9uIGluIHByb2Nlc3Nlcy4gIFByb2Nlc3NlcyBoYXZlIGxvY2FsIHNjaGVtZXMgZmFjaWxpdGF0aW5nIHJlZGVmaW5pdGlvbiBvZiByZWxhdGlvbnNoaXBzIGJldHdlZW4gUm9sZXMsIFRhc2tzLCBhbmQgV29ya1Byb2R1Y3RzLiBUaGVyZSBhcmUgdHdvIG1haW4gdmFyaWF0aW9ucyBvZiBwcm9jZXNzIGRlZmluZWQ6IERlbGl2ZXJ5IFByb2Nlc3Nlcywgd2hpY2ggZGVzY3JpYmVzIGVuZC10by1lbmQgd2F5cyBvZiBkb2luZyBhICZxdW90O3Byb2plY3QmcXVvdDsgYXMgd2VsbCBhcyBDYXBhYmlsaXR5IFBhdHRlcm5zLCB3aGljaCBwcm92aWRlIHJldXN1YWJsZSBwYXJ0cyB0aGF0IGNhbiBiZSB1c2VkIHRvIGNvbXBvc2UgRGVsaXZlcnkgUHJvY2Vzc2VzLiYjeEE7IiBsaW5lQ29sb3I9IjAiLz4NCi0gICAgICAgICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+DQotICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSExHaXZlZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTY0ODQiIHk9IjQ3NTUiIHdpZHRoPSI3MDM1IiBoZWlnaHQ9IjQ1NDYiLz4NCi0gICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hMR2l3T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5vdGUiPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITEdpdy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJEaWFncmFtTmFtZSI+DQotICAgICAgICAgICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSExHaXhPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRGVzY3JpcHRpb24iPg0KLSAgICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246U2hhcGVTdHlsZSIgeG1pOmlkPSJfSExHaXdlZlhFZHVxSG9PSmJVUlpSdyIgZm9udE5hbWU9IkFyaWFsIiBkZXNjcmlwdGlvbj0iRGVmaW5lcyBhIHBsdWdpbiBtZWNoYW5pc20gd2hpY2ggcmVsaWVzIG9uIHBhY2thZ2luZyBhcyB3ZWxsIGFzIG5ldyByZWxhdGlvbnNoaXAgdHlwZXMgZm9yIGNvbnRlbnQgYW5kIHByb2Nlc3MgZWxlbWVudHMgdGhhdCBhbGxvdyBkZWNsYXJpbmcgY2hhbmdlIGRlbHRhcyB3aXRob3V0IGRpcmVjdGx5IG1vZGlmeWluZyB0aGUgc291cmNlLiIgbGluZUNvbG9yPSIwIi8+DQotICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPg0KLSAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hMR2l3dWZYRWR1cUhvT0piVVJaUnciIHg9IjM5MyIgeT0iMzU0NiIgd2lkdGg9IjY1NDQiIGhlaWdodD0iMjMxMSIvPg0KLSAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSExHaXhlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTm90ZSI+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hMR2l5T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkRpYWdyYW1OYW1lIj4NCi0gICAgICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITEdpeWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJEZXNjcmlwdGlvbiI+DQotICAgICAgICAgICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpTaGFwZVN0eWxlIiB4bWk6aWQ9Il9ITEdpeHVmWEVkdXFIb09KYlVSWlJ3IiBmb250TmFtZT0iQXJpYWwiIGRlc2NyaXB0aW9uPSJEZWZpbmVzIGtleSBjb250ZW50IGVsZW1lbnRzIHN1Y2ggYXMgUm9sZXMsIFdvcmtQcm9kdWN0cywgVGFza3MsIHRoZWlyIGF0dHJpYnV0ZXMsIGFuZCB0aGVpciBkZWZhdWx0IHJlbGF0aW9uc2hpcHMuIEFsc28gZGVmaW5lcyBhIGJhc2ljIG1lY2hhbmlzbXMgdG8gb3JnYW5pemUgY29yZSBjb250ZW50IGluIHBhY2thZ2VzLiIgbGluZUNvbG9yPSIwIi8+DQotICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPg0KLSAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hMR2l4LWZYRWR1cUhvT0piVVJaUnciIHg9IjE0MDgiIHk9Ijc3MjMiIHdpZHRoPSI2MjgyIiBoZWlnaHQ9IjI4MDIiLz4NCi0gICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hMR2l5dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5vdGUiPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITEdpemVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJEaWFncmFtTmFtZSI+DQotICAgICAgICAgICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSExQc1lPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRGVzY3JpcHRpb24iPg0KLSAgICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246U2hhcGVTdHlsZSIgeG1pOmlkPSJfSExHaXktZlhFZHVxSG9PSmJVUlpSdyIgZm9udE5hbWU9IkFyaWFsIiBkZXNjcmlwdGlvbj0iRGVmaW5lcyBob3cgcGx1Z2lucyBhcmUgZnVydGhlciBwYWNrYWdlZCBpbiBsaWJyYXJpZXMgYXMgd2VsbCBhcyBkZWZpbmVzIHRoZSBjb25jZXB0IG9mIGNvbmZpZ3VyYXRpb25zIGV4dGVuZGluZyB0aGUgcGx1Z2luIG1lY2hhbWlzbS4iIGxpbmVDb2xvcj0iMCIvPg0KLSAgICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4NCi0gICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ITEdpek9mWEVkdXFIb09KYlVSWlJ3IiB4PSIxNTk4NCIgeT0iMTM0NSIgd2lkdGg9IjYyOTkiIGhlaWdodD0iMTY5MyIvPg0KLSAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSExQc1llZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVEMDNCRiI+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hMUHNaT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hMUHNaZWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITFBzWnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hMUHNaLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSExQc2FPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hMUHNhZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJQYWNrYWdlQ29udGVudHMiPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITFBzYXVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIiBjb2xsYXBzZWQ9InRydWUiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hMUHNZdWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iTm9uZSIgc2hvd0xpc3RWaXNpYmlsaXR5PSJOb25lIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSExQc1ktZlhFZHVxSG9PSmJVUlpSdyIgeD0iODg3NiIgeT0iNTgwNSIgd2lkdGg9IjM2MTUiIGhlaWdodD0iMTcxMCIvPg0KLSAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSExQc2EtZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDBGQiI+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hMUHNidWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hMUHNiLWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITFBzY09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hMUHNjZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSExQc2N1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hMUHNjLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJQYWNrYWdlQ29udGVudHMiPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITFBzZE9mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIiBjb2xsYXBzZWQ9InRydWUiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hMUHNiT2ZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iTm9uZSIgc2hvd0xpc3RWaXNpYmlsaXR5PSJOb25lIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSExQc2JlZlhFZHVxSG9PSmJVUlpSdyIgeD0iODg3NiIgeT0iMzQ4NyIgd2lkdGg9IjM2MTUiIGhlaWdodD0iMTcxMCIvPg0KLSAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSExQc2RlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVGV4dCI+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hMUHNlT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkRpYWdyYW1OYW1lIj4NCi0gICAgICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITFBzZWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJEZXNjcmlwdGlvbiI+DQotICAgICAgICAgICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpTaGFwZVN0eWxlIiB4bWk6aWQ9Il9ITFBzZHVmWEVkdXFIb09KYlVSWlJ3IiBmb250TmFtZT0iQXJpYWwiIGZvbnRIZWlnaHQ9IjEyIiBib2xkPSJ0cnVlIiBkZXNjcmlwdGlvbj0iSUJNIFVuaWZpZWQgTWV0aG9kcyBBcmNoaXRlY3R1cmUgdjEuMC41OiBDb25jZXB0dWFsIE1ldGEtTW9kZWwiIGxpbmVDb2xvcj0iMCIvPg0KLSAgICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4NCi0gICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ITFBzZC1mWEVkdXFIb09KYlVSWlJ3IiB4PSIzNTUiIHk9IjQ1NyIgd2lkdGg9IjEzOTE5IiBoZWlnaHQ9IjUyNCIvPg0KLSAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSExQc2stZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDE3QiI+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hMUHNsdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hMUHNsLWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITFBzbU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hMUHNtZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSExQc211ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hMUHNtLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJQYWNrYWdlQ29udGVudHMiPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITFBzbk9mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIiBjb2xsYXBzZWQ9InRydWUiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hMUHNsT2ZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iTm9uZSIgc2hvd0xpc3RWaXNpYmlsaXR5PSJOb25lIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSExQc2xlZlhFZHVxSG9PSmJVUlpSdyIgeD0iODg3NiIgeT0iODI0MiIgd2lkdGg9IjM2MTUiIGhlaWdodD0iMTcxMCIvPg0KLSAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSExQc3EtZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzU3MDAzQiI+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hMUHNydWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hMUHNyLWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITFBzc09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hMUHNzZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSExQc3N1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hMUHNzLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJQYWNrYWdlQ29udGVudHMiPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITFBzdE9mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIiBjb2xsYXBzZWQ9InRydWUiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hMUHNyT2ZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iTm9uZSIgc2hvd0xpc3RWaXNpYmlsaXR5PSJOb25lIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSExQc3JlZlhFZHVxSG9PSmJVUlpSdyIgeD0iODg3NiIgeT0iMTI2OCIgd2lkdGg9IjM2MTUiIGhlaWdodD0iMTcxMCIvPg0KLSAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfczVHaGtNUE5FZHl6SHFLZjMxQklfdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxMTlBNjJCMDM2RiI+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3M1R2hrOFBORWR5ekhxS2YzMUJJX3ciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX3M1R2hsTVBORWR5ekhxS2YzMUJJX3ciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9zNUdobGNQTkVkeXpIcUtmMzFCSV93IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3M1R2hsc1BORWR5ekhxS2YzMUJJX3ciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfczVHaGw4UE5FZHl6SHFLZjMxQklfdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3M1R2htTVBORWR5ekhxS2YzMUJJX3ciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJQYWNrYWdlQ29udGVudHMiPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9zNUdobWNQTkVkeXpIcUtmMzFCSV93IiBjYW5vbmljYWw9ImZhbHNlIiBjb2xsYXBzZWQ9InRydWUiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX3M1R2hrY1BORWR5ekhxS2YzMUJJX3ciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfczVHaGtzUE5FZHl6SHFLZjMxQklfdyIgeD0iODg3NiIgeT0iMTEwOTUiIHdpZHRoPSI0Nzg3IiBoZWlnaHQ9IjE0MjYiLz4NCi0gICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3Q2MGRRTVBORWR5ekhxS2YzMUJJX3ciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURERTYyMDAxQ0YiPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il90NjBkUThQTkVkeXpIcUtmMzFCSV93IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il90NjBkUk1QTkVkeXpIcUtmMzFCSV93IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfdDYwZFJjUE5FZHl6SHFLZjMxQklfdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il90NjBkUnNQTkVkeXpIcUtmMzFCSV93IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3Q2MGRSOFBORWR5ekhxS2YzMUJJX3ciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il90NjBkU01QTkVkeXpIcUtmMzFCSV93IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iUGFja2FnZUNvbnRlbnRzIj4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfdDYwZFNjUE5FZHl6SHFLZjMxQklfdyIgY2Fub25pY2FsPSJmYWxzZSIgY29sbGFwc2VkPSJ0cnVlIi8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il90NjBkUWNQTkVkeXpIcUtmMzFCSV93IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93UGFyZW50PSJOYW1lIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX3Q2MGRRc1BORWR5ekhxS2YzMUJJX3ciIHg9Ijg4NzYiIHk9IjEyOTkwIiB3aWR0aD0iNDc4NyIgaGVpZ2h0PSIxNDI2Ii8+DQotICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9rZUJna01pTUVkeXhPNEVzdVFPZ1RnIiBlbGVtZW50PSJfaGFPWVlNaU1FZHl4TzRFc3VRT2dUZyI+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2tlQmdrOGlNRWR5eE80RXN1UU9nVGciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX2tlQmdsTWlNRWR5eE80RXN1UU9nVGciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9rZUJnbGNpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2tlQmdsc2lNRWR5eE80RXN1UU9nVGciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfa2VCZ2w4aU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2tlQmdtTWlNRWR5eE80RXN1UU9nVGciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJQYWNrYWdlQ29udGVudHMiPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9rZUJnbWNpTUVkeXhPNEVzdVFPZ1RnIiBjYW5vbmljYWw9ImZhbHNlIiBjb2xsYXBzZWQ9InRydWUiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX2tlQmdrY2lNRWR5eE80RXN1UU9nVGciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfa2VCZ2tzaU1FZHl4TzRFc3VRT2dUZyIgeD0iODg3NiIgeT0iMTQ4OTkiLz4NCi0gICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3U4eElvTWlTRWR5eE80RXN1UU9nVGciIGVsZW1lbnQ9Il9oYVlKNGNpTUVkeXhPNEVzdVFPZ1RnIj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfdTh4SW84aVNFZHl4TzRFc3VRT2dUZyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfdTh4SXBNaVNFZHl4TzRFc3VRT2dUZyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3U4eElwY2lTRWR5eE80RXN1UU9nVGciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfdTh4SXBzaVNFZHl4TzRFc3VRT2dUZyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il91OHhJcDhpU0VkeXhPNEVzdVFPZ1RnIiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfdTh4SXFNaVNFZHl4TzRFc3VRT2dUZyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlBhY2thZ2VDb250ZW50cyI+DQotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX3U4eElxY2lTRWR5eE80RXN1UU9nVGciIGNhbm9uaWNhbD0iZmFsc2UiIGNvbGxhcHNlZD0idHJ1ZSIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfdTh4SW9jaVNFZHl4TzRFc3VRT2dUZyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il91OHhJb3NpU0VkeXhPNEVzdVFPZ1RnIiB4PSIxNDU4MiIgeT0iMTQ4OTkiLz4NCi0gICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MRGlhZ3JhbVN0eWxlIiB4bWk6aWQ9Il9Hd3VUbk9mWEVkdXFIb09KYlVSWlJ3IiBkZXNjcmlwdGlvbj0iVGhlIFVNQSBNZXRhLU1vZGVsIGlzIHN0cnVjdHVyZWQgYXMgZGVwaWN0ZWQgaW4gdGhlIGRpYWdyYW0uICBUaGUgc3RydWN0dXJlIGRpdmlkZXMgdGhlIG1vZGVsIGluIGxvZ2ljYWwgdW5pdHMuICBFYWNoIHVuaXQgZXh0ZW5kcyB0aGUgdW5pdHMgaXQgZGVwZW5kcyB1cG9uIHByb3ZpZGluZyBhZGRpdGlvbmFsIHN0cnVjdHVyZXMgYW5kIGNhcGFiaWxpdGllcy4gIE92ZXJhbGwgdGhlIFVNTCAyLjAgcGFja2FnZSBtZXJnZSBtZWNoYW5pc20gYXBwbGllZCB0byB0aGUgcGFja2FnZXMgcmVhbGl6ZXMgYSBncmFkdWFsIGV4dGVuc2lvbiBvZiB0aGUgY2FwYWJpbGl0aWVzIG1vZGVsZWQgdW5pdCBieSB1bml0LiAgQXMgYSByZXN1bHQsIHVuaXRzIGRlZmluZWQgb24gYSBsb3dlciBsYXllciBjYW4gYmUgcmVhbGl6ZWQgYnkgYSBVTUEgc3Vic2V0LWltcGxlbWVudGF0aW9uIHdpdGhvdXQgdGhlIGhpZ2hlciBsZXZlbCB1bml0cy4gIEZvciBleGFtcGxlLCBhbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgY291bGQgYmUgYmFzZWQganVzdCBvbiB0aGUgTWV0aG9kIENvcmUgYW5kIE1ldGhvZCBQbHVnaW4gcGFja2FnZXMgd2l0aG91dCB1c2luZyB0aGUgZWxlbWVudHMgZGVmaW5lZCBpbiB0aGUgUHJvY2VzcyBwYWNrYWdlLiAgSG93ZXZlciwgaWYgdGhlIFByb2Nlc3MgcGFja2FnZSB3b3VsZCBiZSBpbmNsdWRlZCBhcyB3ZWxsIGZvciB0aGUgaW1wbGVtZW50YXRpb24gdGhlbiBhZGRpdGlvbmFsIGNhcGFiaWxpdGllcyBmcm9tIHRoZSBQcm9jZXNzIHBhY2thZ2Ugd291bGQgYmUgbWVyZ2VkIGludG8gdGhlIE1ldGhvZCBQbHVnaW4gcGFja2FnZS4iLz4NCi0gICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPg0KLSAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSExQc2V1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTm90ZUF0dGFjaG1lbnQiIHNvdXJjZT0iX0hMR2l1LWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hMUHNZZWZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkNvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9ITFBzZS1mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIi8+DQotICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPg0KLSAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hMUHNmT2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0zNTIyLCAtMzIxLCA1ODc1LCA1OV0kWy03NDY3LCAtMzIxLCAxOTMwLCA1OV0iLz4NCi0gICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSExQc2ZlZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hMUHNmdWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSExQc2p1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTm90ZUF0dGFjaG1lbnQiIHNvdXJjZT0iX0hMR2l3T2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hMUHNhLWZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkNvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9ITFBzai1mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIi8+DQotICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPg0KLSAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hMUHNrT2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzMyNjgsIC02MzUsIC0zNDM3LCAtNDU3XSRbNDc2NiwgLTYzNSwgLTE5MzgsIC00NTddIi8+DQotICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hMUHNrZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9ITFBza3VmWEVkdXFIb09KYlVSWlJ3IiBpZD0iKDAuMDg0NzE1MDIsMC44MTA4NTkyKSIvPg0KLSAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSExQc3B1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTm90ZUF0dGFjaG1lbnQiIHNvdXJjZT0iX0hMR2l4ZWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hMUHNrLWZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkNvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9ITFBzcC1mWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjQxOTQzNjgiLz4NCi0gICAgICAgICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+DQotICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSExQc3FPZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbNDM4NSwgNjM1LCAtMTgxMSwgLTIwM10kWzMxNDEsIDQ1NywgLTMwNTYsIC0zODFdIi8+DQotICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hMUHNxZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9ITFBzcXVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hMUHN4LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5vdGVBdHRhY2htZW50IiBzb3VyY2U9Il9ITEdpeXVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9ITFBzcS1mWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSExQc3lPZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIvPg0KLSAgICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4NCi0gICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9ITFBzeWVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstNzEwMywgLTkzLCAxNzM1LCAtMTZdJFstMzE1OCwgLTkzLCA1NjgxLCAtMTZdIi8+DQotICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hMUHN5dWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9ITFBzeS1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgIDwvY29udGVudHM+DQotICAgICAgPC9lQW5ub3RhdGlvbnM+DQotICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOlBhY2thZ2UiIHhtaTppZD0iX2hhT1lZTWlNRWR5eE80RXN1UU9nVGciIG5hbWU9IlByb2Nlc3NEaWFncmFtc19kZXByZWNhdGVkIj4NCi0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfaGFPWVljaU1FZHl4TzRFc3VRT2dUZyIgc291cmNlPSJ1bWwyLmRpYWdyYW1zIiByZWZlcmVuY2VzPSJfaGFPWVlzaU1FZHl4TzRFc3VRT2dUZyI+DQotICAgICAgICAgIDxjb250ZW50cyB4bWk6dHlwZT0ibm90YXRpb246RGlhZ3JhbSIgeG1pOmlkPSJfaGFPWVlzaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iQ2xhc3MiIG5hbWU9Ik1haW4iPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYU9ZWThpTUVkeXhPNEVzdVFPZ1RnIiBlbGVtZW50PSJfaGFZSjRjaU1FZHl4TzRFc3VRT2dUZyI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFPWVpNaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9oYU9ZWmNpTUVkeXhPNEVzdVFPZ1RnIiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhT1lac2lNRWR5eE80RXN1UU9nVGciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYU9ZWjhpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFPWWFNaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFPWWFjaU1FZHl4TzRFc3VRT2dUZyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlBhY2thZ2VDb250ZW50cyI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfaGFPWWFzaU1FZHl4TzRFc3VRT2dUZyIgY2Fub25pY2FsPSJmYWxzZSIgY29sbGFwc2VkPSJ0cnVlIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfaGFPWWE4aU1FZHl4TzRFc3VRT2dUZyIgc2hvd0xpc3RTdGVyZW90eXBlPSJOb25lIiBzaG93TGlzdFZpc2liaWxpdHk9Ik5vbmUiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX2hhT1liTWlNRWR5eE80RXN1UU9nVGciIHg9IjE4MjAiIHk9IjM4NTIiIHdpZHRoPSI0OTU0IiBoZWlnaHQ9IjE3OTQiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYU9ZZDhpTUVkeXhPNEVzdVFPZ1RnIiBlbGVtZW50PSJfaGFZSmpzaU1FZHl4TzRFc3VRT2dUZyI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFPWWVNaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9oYU9ZZWNpTUVkeXhPNEVzdVFPZ1RnIiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhT1llc2lNRWR5eE80RXN1UU9nVGciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYU9ZZThpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFPWWZNaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFPWWZjaU1FZHl4TzRFc3VRT2dUZyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlBhY2thZ2VDb250ZW50cyI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfaGFPWWZzaU1FZHl4TzRFc3VRT2dUZyIgY2Fub25pY2FsPSJmYWxzZSIgY29sbGFwc2VkPSJ0cnVlIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfaGFPWWY4aU1FZHl4TzRFc3VRT2dUZyIgc2hvd0xpc3RTdGVyZW90eXBlPSJOb25lIiBzaG93TGlzdFZpc2liaWxpdHk9Ik5vbmUiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX2hhT1lnTWlNRWR5eE80RXN1UU9nVGciIHg9IjI1NTYiIHk9IjY2OCIgd2lkdGg9IjM1MzAiIGhlaWdodD0iMTg2MiIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3poMWVBTWlNRWR5eE80RXN1UU9nVGciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyNjIiPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3poMWVBOGlNRWR5eE80RXN1UU9nVGciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfemgxZUJNaU1FZHl4TzRFc3VRT2dUZyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il96aDFlQmNpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfemgxZUJzaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3poMWVCOGlNRWR5eE80RXN1UU9nVGciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3poMWVDTWlNRWR5eE80RXN1UU9nVGciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJQYWNrYWdlQ29udGVudHMiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX3poMWVDY2lNRWR5eE80RXN1UU9nVGciIGNhbm9uaWNhbD0iZmFsc2UiIGNvbGxhcHNlZD0idHJ1ZSIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX3poMWVBY2lNRWR5eE80RXN1UU9nVGciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dQYXJlbnQ9Ik5hbWUiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il96aDFlQXNpTUVkeXhPNEVzdVFPZ1RnIiB4PSIyMjQ3IiB5PSI3NjE5Ii8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfM3k5OEFNaU1FZHl4TzRFc3VRT2dUZyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRERGODY5MDEyRSI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfM3k5OEE4aU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il8zeTk4Qk1pTUVkeXhPNEVzdVFPZ1RnIiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iXzN5OThCY2lNRWR5eE80RXN1UU9nVGciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il8zeTk4QnNpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfM3k5OEI4aU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfM3k5OENNaU1FZHl4TzRFc3VRT2dUZyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlBhY2thZ2VDb250ZW50cyI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfM3k5OENjaU1FZHl4TzRFc3VRT2dUZyIgY2Fub25pY2FsPSJmYWxzZSIgY29sbGFwc2VkPSJ0cnVlIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfM3k5OEFjaU1FZHl4TzRFc3VRT2dUZyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1BhcmVudD0iTmFtZSIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iXzN5OThBc2lNRWR5eE80RXN1UU9nVGciIHg9IjQ0MTciIHk9IjEwOTI2Ii8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfLVMzWG9NaU1FZHl4TzRFc3VRT2dUZyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRTBEMEVEMDEwNCI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfLVMzWG84aU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il8tUzNYcE1pTUVkeXhPNEVzdVFPZ1RnIiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iXy1TM1hwY2lNRWR5eE80RXN1UU9nVGciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il8tUzNYcHNpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfLVMzWHA4aU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfLVMzWHFNaU1FZHl4TzRFc3VRT2dUZyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlBhY2thZ2VDb250ZW50cyI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfLVMzWHFjaU1FZHl4TzRFc3VRT2dUZyIgY2Fub25pY2FsPSJmYWxzZSIgY29sbGFwc2VkPSJ0cnVlIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfLVMzWG9jaU1FZHl4TzRFc3VRT2dUZyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1BhcmVudD0iTmFtZSIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iXy1TM1hvc2lNRWR5eE80RXN1UU9nVGciIHg9Ijg5OTMiIHk9IjI1MTIiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9menBVd01pUEVkeXhPNEVzdVFPZ1RnIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDExOUE2MkIwMzZGIj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9menBVdzhpUEVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX2Z6cFV4TWlQRWR5eE80RXN1UU9nVGciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfZnpwVXhjaVBFZHl4TzRFc3VRT2dUZyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2Z6cFV4c2lQRWR5eE80RXN1UU9nVGciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9menBVeDhpUEVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9menBVeU1pUEVkeXhPNEVzdVFPZ1RnIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iUGFja2FnZUNvbnRlbnRzIj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9menBVeWNpUEVkeXhPNEVzdVFPZ1RnIiBjYW5vbmljYWw9ImZhbHNlIiBjb2xsYXBzZWQ9InRydWUiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9menBVd2NpUEVkeXhPNEVzdVFPZ1RnIiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93UGFyZW50PSJOYW1lIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfZnpwVXdzaVBFZHl4TzRFc3VRT2dUZyIgeD0iLTY2MyIgeT0iMTA4NzQiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTERpYWdyYW1TdHlsZSIgeG1pOmlkPSJfaGFZSmFzaU1FZHl4TzRFc3VRT2dUZyIgZGVzY3JpcHRpb249IlRoaXMgZGlhZ3JhbSBzaG93cyBob3cgdW1hIGRpYWdyYW1zIGFyZSBiYXNlZCBvbiB0aGUgdW1sMiBkaWFncmFtIGludGVyY2hhbmdlLiAgVGhlIG1ldGhvZCBtb2RlbCBwYWNrYWdlIGFjY2Vzc2VzIHRoZXNlIGRpYWdyYW1zLCBiZWNhdXNlIHRoZSBwcm9jZXNzIHBhY2thZ2VzIGRlZmluZWQgaW4gbWV0aG9kIG1vZGVscyBwYWNrYWdlL2NvbnRhaW4gdGhlIGRpYWdyYW1zLiIvPg0KLSAgICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4NCi0gICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfaGFZSmE4aU1FZHl4TzRFc3VRT2dUZyIgZWxlbWVudD0iX2hhWU4tc2lNRWR5eE80RXN1UU9nVGciIHNvdXJjZT0iX2hhT1lZOGlNRWR5eE80RXN1UU9nVGciIHRhcmdldD0iXzN5OThBTWlNRWR5eE80RXN1UU9nVGciPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWUpiTWlNRWR5eE80RXN1UU9nVGciIHR5cGU9IktpbmRMYWJlbCI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlKYmNpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlKYnNpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJLaW5kIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlKYjhpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX2hhWUpjTWlNRWR5eE80RXN1UU9nVGciIHg9IjQ3NSIgeT0iLTEzNDkiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfaGFZSmNjaU1FZHl4TzRFc3VRT2dUZyIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfaGFZSmNzaU1FZHl4TzRFc3VRT2dUZyIgcG9pbnRzPSJbOTQ4LCA4OTcsIC0xNDM5LCAtNjAxMV0kWzIzNjIsIDIxMjUsIC0yNSwgLTQ3ODNdJFsyMzcwLCA1NzU3LCAtMTYsIC0xMTUxXSIvPg0KLSAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX2hhWUpjOGlNRWR5eE80RXN1UU9nVGciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX2hhWUpkY2lNRWR5eE80RXN1UU9nVGciIGVsZW1lbnQ9Il9oYVlKMXNpTUVkeXhPNEVzdVFPZ1RnIiBzb3VyY2U9Il9oYU9ZZDhpTUVkeXhPNEVzdVFPZ1RnIiB0YXJnZXQ9Il8tUzNYb01pTUVkeXhPNEVzdVFPZ1RnIj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlKZHNpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJLaW5kTGFiZWwiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZSmQ4aU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZSmVNaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iS2luZCIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZSmVjaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9oYVlKZXNpTUVkeXhPNEVzdVFPZ1RnIiB4PSItMjAiIHk9Ii00MjUiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfaGFZSmU4aU1FZHl4TzRFc3VRT2dUZyIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfaGFZSmZNaU1FZHl4TzRFc3VRT2dUZyIgcG9pbnRzPSJbNjgsIDE4LCAtMTg5LCAtMzBdJFsyMjIsIDgxLCAtMzUsIDMzXSIvPg0KLSAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX19YMnB3TWlNRWR5eE80RXN1UU9nVGciIGlkPSIoMC4yMTg1NTE0NiwwLjgxNjI2OTMpIi8+DQotICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfaGFZSmZjaU1FZHl4TzRFc3VRT2dUZyIgZWxlbWVudD0iX2hhWU5fTWlNRWR5eE80RXN1UU9nVGciIHNvdXJjZT0iX2hhT1lZOGlNRWR5eE80RXN1UU9nVGciIHRhcmdldD0iX3poMWVBTWlNRWR5eE80RXN1UU9nVGciPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWUpmc2lNRWR5eE80RXN1UU9nVGciIHR5cGU9IktpbmRMYWJlbCI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlKZjhpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlKZ01pTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJLaW5kIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlKZ2NpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX2hhWUpnc2lNRWR5eE80RXN1UU9nVGciIHk9IjEzNDkiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfaGFZSmc4aU1FZHl4TzRFc3VRT2dUZyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX2hhWUpoTWlNRWR5eE80RXN1UU9nVGciIHBvaW50cz0iWzIsIDM1LCA1LCAtOTZdJFsxOCwgMTYzLCAyMSwgMzJdIi8+DQotICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfMUoxOW9NaU1FZHl4TzRFc3VRT2dUZyIgaWQ9IigwLjUyNzAwODgsMC43OTgwMzY0NikiLz4NCi0gICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9oYVlKaGNpTUVkeXhPNEVzdVFPZ1RnIiBlbGVtZW50PSJfaGFZSjE4aU1FZHl4TzRFc3VRT2dUZyIgc291cmNlPSJfaGFPWWQ4aU1FZHl4TzRFc3VRT2dUZyIgdGFyZ2V0PSJfaGFPWVk4aU1FZHl4TzRFc3VRT2dUZyI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZSmhzaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iS2luZExhYmVsIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWUpoOGlNRWR5eE80RXN1UU9nVGciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWUppTWlNRWR5eE80RXN1UU9nVGciIHR5cGU9IktpbmQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWUppY2lNRWR5eE80RXN1UU9nVGciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfaGFZSmlzaU1FZHl4TzRFc3VRT2dUZyIgeD0iLTI3IiB5PSItNzQxIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX2hhWUppOGlNRWR5eE80RXN1UU9nVGciIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX2hhWUpqTWlNRWR5eE80RXN1UU9nVGciIHBvaW50cz0iWzcsIDM2LCA4LCAtODNdJFs5MywgMTE2LCA5NCwgLTNdIi8+DQotICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfM3pIdEFNaU1FZHl4TzRFc3VRT2dUZyIgZWxlbWVudD0iX25veVRNT3hnRWR1SGplM3BQYWhONEEiIHNvdXJjZT0iX3poMWVBTWlNRWR5eE80RXN1UU9nVGciIHRhcmdldD0iXzN5OThBTWlNRWR5eE80RXN1UU9nVGciPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iXzN6SHRBOGlNRWR5eE80RXN1UU9nVGciIHR5cGU9IktpbmRMYWJlbCI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il8zekh0QmNpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il8zekh0QjhpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJLaW5kIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il8zekh0QnNpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iXzN6SHRCTWlNRWR5eE80RXN1UU9nVGciIHg9Ii0zMiIgeT0iLTYzMyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il8zekh0QWNpTUVkeXhPNEVzdVFPZ1RnIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il8zekh0QXNpTUVkeXhPNEVzdVFPZ1RnIiBwb2ludHM9IlswLCAwLCAwLCAwXSRbMCwgMCwgMCwgMF0iLz4NCi0gICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9menBVeXNpUEVkeXhPNEVzdVFPZ1RnIiBlbGVtZW50PSJfYzZ0ZGtPeDVFZHU1LXZWamxmVnNmUSIgc291cmNlPSJfemgxZUFNaU1FZHl4TzRFc3VRT2dUZyIgdGFyZ2V0PSJfZnpwVXdNaVBFZHl4TzRFc3VRT2dUZyI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfZnpwVXpjaVBFZHl4TzRFc3VRT2dUZyIgdHlwZT0iS2luZExhYmVsIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2Z6cFV6OGlQRWR5eE80RXN1UU9nVGciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2Z6cFUwY2lQRWR5eE80RXN1UU9nVGciIHR5cGU9IktpbmQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2Z6cFUwTWlQRWR5eE80RXN1UU9nVGciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfZnpwVXpzaVBFZHl4TzRFc3VRT2dUZyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9menBVeThpUEVkeXhPNEVzdVFPZ1RnIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9menBVek1pUEVkeXhPNEVzdVFPZ1RnIiBwb2ludHM9IlswLCAwLCAwLCAwXSRbMCwgMCwgMCwgMF0iLz4NCi0gICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICA8L2NvbnRlbnRzPg0KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+DQotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX2hhWUpqY2lNRWR5eE80RXN1UU9nVGciIGFubm90YXRlZEVsZW1lbnQ9Il9oYU9ZWU1pTUVkeXhPNEVzdVFPZ1RnIj4NCi0gICAgICAgICAgPGJvZHk+MDU8L2JvZHk+DQotICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpQYWNrYWdlIiB4bWk6aWQ9Il9oYVlKanNpTUVkeXhPNEVzdVFPZ1RnIiBuYW1lPSJVTUFEaWFncmFtcyI+DQotICAgICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfaGFZSmo4aU1FZHl4TzRFc3VRT2dUZyIgc291cmNlPSJ1bWwyLmRpYWdyYW1zIiByZWZlcmVuY2VzPSJfaGFZSmtNaU1FZHl4TzRFc3VRT2dUZyI+DQotICAgICAgICAgICAgPGNvbnRlbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpEaWFncmFtIiB4bWk6aWQ9Il9oYVlKa01pTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJDbGFzcyIgbmFtZT0iTWFpbiI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZSmtjaU1FZHl4TzRFc3VRT2dUZyIgZWxlbWVudD0iX2hhWU9UY2lNRWR5eE80RXN1UU9nVGciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZSmtzaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX2hhWUprOGlNRWR5eE80RXN1UU9nVGciIHdpZHRoPSI0MjUwIiBoZWlnaHQ9IjEwNDkiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWUpsTWlNRWR5eE80RXN1UU9nVGciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWUpsY2lNRWR5eE80RXN1UU9nVGciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWUpsc2lNRWR5eE80RXN1UU9nVGciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZSmw4aU1FZHl4TzRFc3VRT2dUZyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfaGFZSm1NaU1FZHl4TzRFc3VRT2dUZyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZSm1jaU1FZHl4TzRFc3VRT2dUZyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfaGFZSm1zaU1FZHl4TzRFc3VRT2dUZyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZSm04aU1FZHl4TzRFc3VRT2dUZyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfaGFZSm5NaU1FZHl4TzRFc3VRT2dUZyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZSm5jaU1FZHl4TzRFc3VRT2dUZyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX2hhWUpuc2lNRWR5eE80RXN1UU9nVGciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfaGFZSm44aU1FZHl4TzRFc3VRT2dUZyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfaGFZSm9NaU1FZHl4TzRFc3VRT2dUZyIgeD0iMjIxOSIgeT0iMzgwNCIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlKb2NpTUVkeXhPNEVzdVFPZ1RnIiBlbGVtZW50PSJfaGFZSjJNaU1FZHl4TzRFc3VRT2dUZyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlKb3NpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfaGFZSm84aU1FZHl4TzRFc3VRT2dUZyIgd2lkdGg9IjMwNjQiIGhlaWdodD0iOTA1Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlKcE1pTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlKcGNpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlKcHNpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWUpwOGlNRWR5eE80RXN1UU9nVGciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX2hhWUpxTWlNRWR5eE80RXN1UU9nVGciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWUpxY2lNRWR5eE80RXN1UU9nVGciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX2hhWUpxc2lNRWR5eE80RXN1UU9nVGciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWUpxOGlNRWR5eE80RXN1UU9nVGciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX2hhWUpyTWlNRWR5eE80RXN1UU9nVGciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWUpyY2lNRWR5eE80RXN1UU9nVGciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9oYVlKcnNpTUVkeXhPNEVzdVFPZ1RnIiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX2hhWUpyOGlNRWR5eE80RXN1UU9nVGciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX2hhWUpzTWlNRWR5eE80RXN1UU9nVGciIHg9IjE1ODUiIHk9Ijk1MSIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTERpYWdyYW1TdHlsZSIgeG1pOmlkPSJfaGFZSnNjaU1FZHl4TzRFc3VRT2dUZyIgZGVzY3JpcHRpb249IlVNQSBzdXBwb3J0cyB0aHJlZSB0eXBlcyBvZiBkaWFncmFtcy4gSG93ZXZlciwgdGhpcyBzcGVjaWZpY2F0aW9uIGRvZXMgbm90IGRlZmluZSB0aGUgc3ludGF4IG9mIHRoZXNlIGRpYWdyYW1zLCBidXQgcmF0aGVyIHJlbGllcyBvbiBhIHRvb2wgaW1wbGVtZW50YXRpb24gZm9yIHRoZSBleGFjdCBwcmVzZW50YXRpb24gb2YgdGhlIHRocmVlIGRpYWdyYW1zLiAgVXRpbHppbmcgdGhlIFVNTDIgRGlhZ3JhbSBJbnRlcmNoYW5nZSBzcGVjaWZpY2F0aW9uIHRoaXMgc3BlY2lmaWNhdGlvbiBwcm92aWRlcyBhbGwgc3RydWN0dXJlcyB0byByZXByZXNlbnQgYW5kIHBlcnNpc3QgdGhlc2UgZGlhZ3JhbXMuIi8+DQotICAgICAgICAgICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfaGFZSnNzaU1FZHl4TzRFc3VRT2dUZyIgZWxlbWVudD0iX2hhWUozTWlNRWR5eE80RXN1UU9nVGciIHNvdXJjZT0iX2hhWUpvY2lNRWR5eE80RXN1UU9nVGciIHRhcmdldD0iX2hhWUprY2lNRWR5eE80RXN1UU9nVGciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZSnM4aU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZSnRNaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlKdGNpTUVkeXhPNEVzdVFPZ1RnIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX2hhWUp0c2lNRWR5eE80RXN1UU9nVGciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWUp0OGlNRWR5eE80RXN1UU9nVGciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il9oYVlKM3NpTUVkeXhPNEVzdVFPZ1RnIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZSnVNaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX2hhWUp1Y2lNRWR5eE80RXN1UU9nVGciIHg9IjE4NyIgeT0iLTMzOSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZSnVzaU1FZHl4TzRFc3VRT2dUZyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfaGFZSjNzaU1FZHl4TzRFc3VRT2dUZyI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWUp1OGlNRWR5eE80RXN1UU9nVGciIHR5cGU9IlRvUm9sZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfaGFZSnZNaU1FZHl4TzRFc3VRT2dUZyIgeT0iLTM5NyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZSnZjaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfaGFZSjJjaU1FZHl4TzRFc3VRT2dUZyI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWUp2c2lNRWR5eE80RXN1UU9nVGciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX2hhWUp2OGlNRWR5eE80RXN1UU9nVGciIHg9Ii0yMjkiIHk9Ii0yNTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWUp3TWlNRWR5eE80RXN1UU9nVGciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il9oYVlKMmNpTUVkeXhPNEVzdVFPZ1RnIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZSndjaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iRnJvbVJvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX2hhWUp3c2lNRWR5eE80RXN1UU9nVGciIHg9Ii0yNDAiIHk9IjkwMyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZSnc4aU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iX2hhWUozc2lNRWR5eE80RXN1UU9nVGciPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlKeE1pTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfaGFZSnhjaU1FZHl4TzRFc3VRT2dUZyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9oYVlKeHNpTUVkeXhPNEVzdVFPZ1RnIiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlKeDhpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il9oYVlKMmNpTUVkeXhPNEVzdVFPZ1RnIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZSnlNaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX2hhWUp5Y2lNRWR5eE80RXN1UU9nVGciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfaGFZSnlzaU1FZHl4TzRFc3VRT2dUZyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZSnk4aU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il9oYVlKM3NpTUVkeXhPNEVzdVFPZ1RnIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZSnpNaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX2hhWUp6Y2lNRWR5eE80RXN1UU9nVGciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfaGFZSnpzaU1FZHl4TzRFc3VRT2dUZyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZSno4aU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iX2hhWUoyY2lNRWR5eE80RXN1UU9nVGciPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlKME1pTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9oYVlKMGNpTUVkeXhPNEVzdVFPZ1RnIi8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX2hhWUowc2lNRWR5eE80RXN1UU9nVGciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX2hhWUowOGlNRWR5eE80RXN1UU9nVGciIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfaGFZSjFNaU1FZHl4TzRFc3VRT2dUZyIgcG9pbnRzPSJbMCwgNDQ4LCAwLCAtMzEwN10kWzAsIDMwMjIsIDAsIC01MzNdIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgIDwvY29udGVudHM+DQotICAgICAgICAgIDwvZUFubm90YXRpb25zPg0KLSAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX2hhWUoxY2lNRWR5eE80RXN1UU9nVGciIGFubm90YXRlZEVsZW1lbnQ9Il9oYVlKanNpTUVkeXhPNEVzdVFPZ1RnIj4NCi0gICAgICAgICAgICA8Ym9keT4wMjwvYm9keT4NCi0gICAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgICAgIDxwYWNrYWdlTWVyZ2UgeG1pOmlkPSJfaGFZSjFzaU1FZHl4TzRFc3VRT2dUZyIgbWVyZ2VkUGFja2FnZT0iXzNBREM3Qjc0MDIyRDQxRTBEMEVEMDEwNCIvPg0KLSAgICAgICAgICA8cGFja2FnZU1lcmdlIHhtaTppZD0iX2hhWUoxOGlNRWR5eE80RXN1UU9nVGciIG1lcmdlZFBhY2thZ2U9Il9oYVlKNGNpTUVkeXhPNEVzdVFPZ1RnIi8+DQotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfaGFZSjJNaU1FZHl4TzRFc3VRT2dUZyIgbmFtZT0iUHJvY2Vzc1BhY2thZ2UiPg0KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il9oYVlKMmNpTUVkeXhPNEVzdVFPZ1RnIiBuYW1lPSJkaWFncmFtcyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfaGFZT1RjaU1FZHl4TzRFc3VRT2dUZyIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgYXNzb2NpYXRpb249Il9oYVlKM01pTUVkeXhPNEVzdVFPZ1RnIj4NCi0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX2hhWUoyc2lNRWR5eE80RXN1UU9nVGciIHZhbHVlPSIqIi8+DQotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9oYVlKMjhpTUVkeXhPNEVzdVFPZ1RnIi8+DQotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfaGFZSjNNaU1FZHl4TzRFc3VRT2dUZyIgbWVtYmVyRW5kPSJfaGFZSjJjaU1FZHl4TzRFc3VRT2dUZyBfaGFZSjNzaU1FZHl4TzRFc3VRT2dUZyI+DQotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9oYVlKM2NpTUVkeXhPNEVzdVFPZ1RnIiBhbm5vdGF0ZWRFbGVtZW50PSJfaGFZSjNNaU1FZHl4TzRFc3VRT2dUZyI+DQotICAgICAgICAgICAgICA8Ym9keT5UaGlzIGFzc29jaWF0aW9uIGlzIHRoZSBvbmx5IG1lbWJlciBvZiB0aGUgdW1hZGlhZ3JhbXMgcGFja2FnZS4gIEl0IGRlZmluZXMgdGhhdCBEaWFncmFtcyBjYW4gYmUgcGFja2FnZWQgaW4gUHJvY2VzcyBQYWNrYWdlcy48L2JvZHk+DQotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iX2hhWUozc2lNRWR5eE80RXN1UU9nVGciIG5hbWU9Il9wcm9jZXNzUGFja2FnZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfaGFZSjJNaU1FZHl4TzRFc3VRT2dUZyIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iX2hhWUozTWlNRWR5eE80RXN1UU9nVGciPg0KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfaGFZSjM4aU1FZHl4TzRFc3VRT2dUZyIgdmFsdWU9IjEiLz4NCi0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX2hhWUo0TWlNRWR5eE80RXN1UU9nVGciIHZhbHVlPSIxIi8+DQotICAgICAgICAgICAgPC9vd25lZEVuZD4NCi0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6UGFja2FnZSIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDExOUE2MkIwMzZGIiBuYW1lPSJQcmltaXRpdmVUeXBlcyI+DQotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iX0d4ZDZjT2ZYRWR1cUhvT0piVVJaUnciIHNvdXJjZT0idW1sMi5kaWFncmFtcyIvPg0KLSAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjQ0OThEMDE4NSIgbmFtZT0iRGF0ZSI+DQotICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3c0RWxlZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjQ0OThEMDE4NSI+DQotICAgICAgICAgICAgPGJvZHk+RGF0YSB0eXBlIHVzZWQgZm9yIGF0dHJpYnV0ZXMgb2YgbWV0YS1tb2RlbCBjbGFzc2VzIG9mIHRoZSB0eXBlIERhdGUuPC9ib2R5Pg0KLSAgICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxMTNFQTI5MDJGRSIgbmFtZT0iVXJpIj4NCi0gICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HeEJPZ2VmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDExM0VBMjkwMkZFIj4NCi0gICAgICAgICAgICA8Ym9keT5EYXRhIHR5cGUgdXNlZCBmb3IgYXR0cmlidXRlcyBvZiBtZXRhLW1vZGVsIGNsYXNzZXMgdGhhdCBwb2ludCB0byByZXNvdXJjZXMgc3VjaCBhcyBmaWxlcy48L2JvZHk+DQotICAgICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgeG1pOmlkPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIiBuYW1lPSJTdHJpbmciPg0KLSAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX2k3RlRvT2lmRWR1UWJ1WTZVd01TUWciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiPg0KLSAgICAgICAgICAgIDxib2R5PkEgc3RyaW5nIGlzIGEgc2VxdWVuY2Ugb2YgY2hhcmFjdGVycyBpbiBzb21lIHN1aXRhYmxlIGNoYXJhY3RlciBzZXQgdXNlZCB0byBkaXNwbGF5IGluZm9ybWF0aW9uIGFib3V0IHRoZSBtb2RlbC4gQ2hhcmFjdGVyIHNldHMgbWF5IGluY2x1ZGUgbm9uLVJvbWFuIGFscGhhYmV0cyBhbmQgY2hhcmFjdGVycy48L2JvZHk+DQotICAgICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgeG1pOmlkPSJfM0FEQzdCNzQwMjJEM0YwOTg5QjkwMjkwIiBuYW1lPSJTZXQiLz4NCi0gICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQzRjA5ODk5QzAwRUEiIG5hbWU9IlNlcXVlbmNlIi8+DQotICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgeG1pOmlkPSJfM0FEQzdCNzQwMjJEM0NBMDEwQTQwMDdCIiBuYW1lPSJJbnRlZ2VyIj4NCi0gICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9kVWM2b09vRkVkdU9CUFFBMmhLcVVRIiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJEM0NBMDEwQTQwMDdCIj4NCi0gICAgICAgICAgICA8Ym9keT5BbiBpbnRlZ2VyIGlzIGEgcHJpbWl0aXZlIHR5cGUgcmVwcmVzZW50aW5nIGludGVnZXIgdmFsdWVzLjwvYm9keT4NCi0gICAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiB4bWk6aWQ9Il81R2NZQU9pZUVkdVFidVk2VXdNU1FnIiBuYW1lPSJCb29sZWFuIj4NCi0gICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il81R2NZQWVpZUVkdVFidVk2VXdNU1FnIiBhbm5vdGF0ZWRFbGVtZW50PSJfNUdjWUFPaWVFZHVRYnVZNlV3TVNRZyI+DQotICAgICAgICAgICAgPGJvZHk+QSBCb29sZWFuIHR5cGUgaXMgdXNlZCBmb3IgbG9naWNhbCBleHByZXNzaW9uLCBjb25zaXN0aW5nIG9mIHRoZSBwcmVkZWZpbmVkIHZhbHVlcyB0cnVlIGFuZCBmYWxzZS48L2JvZHk+DQotICAgICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgeG1pOmlkPSJfQVVxOElPeDNFZHU1LXZWamxmVnNmUSIgbmFtZT0iRG91YmxlIi8+DQotICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOlBhY2thZ2UiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVEMDNCRiIgbmFtZT0iUHJvY2VzcyI+DQotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iX0dvT2U2dWZYRWR1cUhvT0piVVJaUnciIHNvdXJjZT0idW1sMi5kaWFncmFtcyIgcmVmZXJlbmNlcz0iXzNBREM3Qjc0MDIyRDQwRkQ4NTZCMDI3NiI+DQotICAgICAgICAgIDxjb250ZW50cyB4bWk6dHlwZT0ibm90YXRpb246RGlhZ3JhbSIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGRDg1NkIwMjc2IiB0eXBlPSJDbGFzcyIgbmFtZT0iTWFpbiI+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfVXdwdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURFNDc4RTAwMEQiPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfVXdxZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfR19Vd3F1ZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX1V3cS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19Vd3JPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfVXdyZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfVXdydWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJQYWNrYWdlQ29udGVudHMiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0dfVXdyLWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiIGNvbGxhcHNlZD0idHJ1ZSIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0dfVXdwLWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iTm9uZSIgc2hvd0xpc3RWaXNpYmlsaXR5PSJOb25lIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HX1V3cU9mWEVkdXFIb09KYlVSWlJ3IiB4PSIzMzYwIiB5PSIxMTQ1NiIgd2lkdGg9IjMzOTgiIGhlaWdodD0iMTY3NiIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfVXdzT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEZEODU0NjAwRDgiPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfZWhRT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfR19laFFlZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX2VoUXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19laFEtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfZWhST2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfZWhSZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJQYWNrYWdlQ29udGVudHMiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0dfZWhSdWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiIGNvbGxhcHNlZD0idHJ1ZSIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0dfVXdzZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iTm9uZSIgc2hvd0xpc3RWaXNpYmlsaXR5PSJOb25lIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HX1V3c3VmWEVkdXFIb09KYlVSWlJ3IiB4PSIzNzg5IiB5PSI4MzM0IiB3aWR0aD0iMjU0MCIgaGVpZ2h0PSIxNjc2Ii8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19laFItZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRkQ4OTFGMDJDRCI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19laFN1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HX2VoUy1mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfZWhUT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX2VoVGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19laFR1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19laFQtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlBhY2thZ2VDb250ZW50cyI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfR19laFVPZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIgY29sbGFwc2VkPSJ0cnVlIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfR19laFNPZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJOb25lIiBzaG93TGlzdFZpc2liaWxpdHk9Ik5vbmUiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0dfZWhTZWZYRWR1cUhvT0piVVJaUnciIHg9IjM1MTEiIHk9IjU1MDUiIHdpZHRoPSIzMDk2IiBoZWlnaHQ9IjE2NzYiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX25yUXVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFMEQwRUQwMTA0Ij4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX3hjTU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0dfeGNNZWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR194Y011ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfeGNNLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX3hjTk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX3hjTmVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iUGFja2FnZUNvbnRlbnRzIj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HX3hjTnVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIiBjb2xsYXBzZWQ9InRydWUiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HX25yUS1mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9Ik5vbmUiIHNob3dMaXN0VmlzaWJpbGl0eT0iTm9uZSIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfR19uclJPZlhFZHVxSG9PSmJVUlpSdyIgeD0iMzI5OSIgeT0iLTMxMSIgd2lkdGg9IjM1MjAiIGhlaWdodD0iMTY4NCIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfeGNTZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURGMkExQjAyRTciPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfeGNUT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfR194Y1RlZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX3hjVHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR194Y1QtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfeGNVT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfeGNVZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJQYWNrYWdlQ29udGVudHMiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0dfeGNVdWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiIGNvbGxhcHNlZD0idHJ1ZSIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0dfeGNTdWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iTm9uZSIgc2hvd0xpc3RWaXNpYmlsaXR5PSJOb25lIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HX3hjUy1mWEVkdXFIb09KYlVSWlJ3IiB4PSIyOTU0IiB5PSIyNDcwIiB3aWR0aD0iNDIwOSIgaGVpZ2h0PSIxNjg0Ii8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxEaWFncmFtU3R5bGUiIHhtaTppZD0iX0dvT2U3T2ZYRWR1cUhvT0piVVJaUnciIGRlc2NyaXB0aW9uPSJ8VU1BIHNlcGFyYXRlcyByZXVzYWJsZSBjb3JlIG1ldGhvZCBjb250ZW50IGZyb20gaXRzIGFwcGxpY2F0aW9uIGluIHByb2Nlc3Nlcy4gIEEgRGV2ZWxvcG1lbnQgUHJvY2VzcyBkZWZpbmVzIHRoZSBzdHJ1Y3R1cmVkIHdvcmsgZGVmaW5pdGlvbnMgdGhhdCBuZWVkIHRvIGJlIHBlcmZvcm1lZCB0byBkZXZlbG9wIGEgc3lzdGVtLCBlLmcuIGJ5IHBlcmZvcm1pbmcgYSBwcm9qZWN0IHRoYXQgZm9sbG93cyB0aGUgcHJvY2Vzcy4gIFN1Y2ggc3RydWN0dXJlZCB3b3JrIGRlZmluaXRpb25zIGRlbGluZWF0ZSB0aGUgd29yayB0byBiZSBwZXJmb3JtZWQgYWxvbmcgYSB0aW1lbGluZSBvciBsaWZlY3ljbGUgYW5kIG9yZ2FuaXplIGl0IGluIHNvIGNhbGxlZCBicmVha2Rvd24gc3RydWN0dXJlcy4gIFRhc2tzIChhcyB0aGV5IGhhdmUgYmVlbiBpbnRyb2R1Y2VkIGFzIHBhcnQgb2YgdGhlIGNvcmUgbWV0aG9kIGNvbnRlbnQpIHByb3ZpZGUgY29tcGxldGUgc3RlcC1ieS1zdGVwIGV4cGxhbmF0aW9ucyBmb3Igd29yayB0aGF0IG5lZWRzIHRvIGJlIHBlcmZvcm1lZCB0byBhY2hpZXZlIGEgcGFydGljdWxhciBkZXZlbG9wbWVudCBnb2FsLiAgQSBUYXNrIGRvZXMgbm90IGxvb2sgYXQgdGhlICdiaWcgcGljdHVyZScgb2YgaG93IHRoZSB3b3JrIGRlc2NyaWJlZCByZWxhdGVzIHRvIG90aGVyIFRhc2sncyB3b3JrLiAgVGhleSBoYXZlIGJlZW4gZGVmaW5lZCBhcyByZXVzYWJsZSBjb3JlIG1ldGhvZCBjb250ZW50IGluZGVwZW5kZW50IG9mIHRoZWlyIHBsYWNlbWVudCB3aXRoaW4gYSBkZXZlbG9wbWVudCBsaWZlY3ljbGUuICBBbGwgdGhhdCBpcyBkZWZpbmVkIGZvciBhIFRhc2sgYXJlIHRoZSB0eXBlcyBvZiB0aGUgaW5wdXQgYW5kIG91dHB1dCB3b3JrIHByb2R1Y3RzLCB0aGUgY29uY3JldGUgc3RlcHMgdG8gcGVyZm9ybSwgYXMgd2VsbCBhcyB3aGF0IHNraWxscyBhcmUgcmVxdWlyZWQgdG8gcGVyZm9ybSB0aGUgd29yayAocm9sZXMpLiAgV2hpY2ggVGFza3MgaGF2ZSB0byBwcmVjZWRlIGFuZCBzdWNjZWVkIGEgVGFzayBhcyB3ZWxsIGFzIHdoYXQgc3RlcHMgdG8gZm9jdXMgb24gYXQgd2hhdCBwb2ludCBvZiB0aW1lIGluIHRoZSBsaWZlY3ljbGUgYXJlIGludGVudGlvbmFsbHkgbm90IGRlZmluZWQgZm9yIGNvcmUgbWV0aG9kIGNvbnRlbnQuICBUaGUgZ29hbCBpcyBwcm92aWRlIFRhc2tzIHRoYXQgY2FuIGJlIHJldXNlZCBmb3IgbWFueSBkaWZmZXJlbnQgZGV2ZWxvcG1lbnQgc2l0dWF0aW9ucy4mI3hBO3xUaGUgc2NvcGUgb2YgYSBwcm9jZXNzIGlzIHRvIHByb3ZpZGUgZXh0ZW5kZWQgYXMgd2VsbCBhcyBjb25jcmV0ZSB3b3JrIHN0cnVjdHVyZXMgZm9yIGEgc3BlY2lmaWMgZGV2ZWxvcG1lbnQgc2l0dWF0aW9uLiAgVGhlcmVmb3JlLCBhIHByb2Nlc3MgdGFrZXMgcmV1c2FibGUgY29yZSBtZXRob2QgZWxlbWVudHMgc3VjaCBhcyBUYXNrcyBhbmQgV29yayBQcm9kdWN0cyBhbmQgcmVsYXRlcyB0aGVtIGludG8gc2VtaS1vcmRlcmVkIHNlcXVlbmNlcyB0aGF0IGFyZSBjdXN0b21pemVkIHRvIHNwZWNpZmljIHR5cGVzIG9mIHByb2plY3RzLiAgVG8gZG8gc28sIFVNQSdzIFByb2Nlc3MgUGFja2FnZSBwcm92aWRlcyBkYXRhIHN0cnVjdHVyZXMgdGhhdCByZWZsZWN0IHRoZSBpbmR1c3RyaWVzIGJlc3QgcHJhY3RpY2VzLiAgVGhpcyBzZWN0aW9uIGRlZmluZXMgQnJlYWtkb3duIHN0cnVjdHVyZSBtZXRhLW1vZGVscyB0aGF0IGNvbXByaXNlIG9mIGRpZmZlcmVudCB0eXBlcyBvZiBicmVha2Rvd24gZWxlbWVudHMgc3VjaCBhcyBBY3Rpdml0aWVzLCB3aGljaCBhcmUgaGlnaGVyIGxldmVsIGdyb3VwaW5ncyBvZiB3b3JrIGNvbXByaXNpbmcgb2YgVGFza3Mgb3Igb3RoZXIgQWN0aXZpdGllcyBkZWZpbmluZyBzZXF1ZW5jZXMgYW5kIGNvbmRpdGlvbnMgb24gVGFza3MuICBJbiBmYWN0LCBhIHByb2Nlc3MgaXMgZGVmaW5lZCBhcyBhIHNwZWNpYWwga2luZCBvZiBBY3Rpdml0eSBpdHNlbGYuICBUaGlzIGJyZWFrZG93biBzdHJ1Y3R1cmVzIG1ldGEtbW9kZWwgaGFzIGJlZW4gZGVmaW5lZCBpbmRlcGVuZGVudCBvZiB0aGUgY29uY3JldGUgbGlmZWN5Y2xlIG1vZGVscyB0aGUgcHJvY2VzcyBlbmdpbmVlciB3YW50cyB0byBleHByZXNzIHdpdGggdGhlbS4gIEluIG90aGVyIHdvcmRzIHRoZSBtZXRhLW1vZGVsIGlzIGFibGUgdG8gcmVwcmVzZW50ICdkaWZmZXJlbnQgdHlwZXMgb2YnIHdhdGVyZmFsbCBwcm9jZXNzZXMgYXMgd2VsbCBhcyBpdGVyYXRpdmUgb3IgaW5jcmVtZW50YWwgcHJvY2VzcyBtb2RlbHMuICBGaW5hbGx5LCBVTUEgZW5hYmxlcyBkaWZmZXJlbnQgdHlwZSBvZiBwcmVzZW50YXRpb25zIGZvciBicmVha2Rvd24gc3RydWN0dXJlcywgYXMgaWxsdXN0cmF0ZWQgd2l0aCBleGFtcGxlIGluIHRoZSBzZWN0aW9ucyBiZWxvdywgc3VjaCBhcyBwcm9qZWN0IHBsYW4tbGlrZSBzdHJ1Y3R1cmVkIGxpc3QsIHdvcmtmbG93IG9yIGFjdGl2aXR5IGRpYWdyYW1zLCBhbmQgc3RhdGljIHN0cnVjdHVyZSBkaWFncmFtcyBzaG93IGlucHV0cy9vdXRwdXRzIHRvIHdvcmsgYXMgd2VsbCBhcyBwZXJmb3JtaW5nIHJvbGVzLiAgVU1BJ3MgUHJvY2VzcyBwYWNrYWdlIGV4dGVuZHMgdGhlIGNvbmNlcHRzIGRlZmluZWQgaW4gTWV0aG9kIENvcmUgdGhyb3VnaCBwYWNrYWdlIG1lcmdlIGFzIGRlcGljdGVkIGluIHRoZSBkaWFncmFtLiAgQnJlYWtkb3duIG1lcmdlcyB0aGUgd2hvbGUgb2YgTWV0aG9kIENvcmUgYnkgbWVyZ2luZyB0aGUgTWV0aG9kIFBhY2thZ2UgcGFja2FnZS4gIFByb2Nlc3MgaXMgc3BlY2lmaWVkIGluIFVNQSB3aXRoIHRoZSBmb2xsb3dpbmcgZml2ZSBwYWNrYWdlcy4gIFRoZSBCcmVha2Rvd24gcGFja2FnZSBjb250YWlucyB0aGUgZGVmaW5pdGlvbiBvZiBicmVha2Rvd24gZWxlbWVudHMgdGhhdCBmb3JtIGJyZWFrZG93biBzdHJ1Y3R1cmVzLiAgUHJvY2VzcyBUeXBlcyBkZWZpbmUgUHJvY2Vzc2VzIGFzIHNwZWNpYWwgQWN0aXZpdGllcyAoZGVmaW5lZCBpbiBicmVha2Rvd24gZWxlbWVudHMpIGFuZCBpbnRyb2R1Y2UgZGlmZmVyZW50IHR5cGVzIG9mIFByb2Nlc3NlcyBzdWNoIGFzIERlbGl2ZXJ5IFByb2Nlc3Mgb3IgQ2FwYWJpbGl0eSBQYXR0ZXJucy4gIFByb2Nlc3MgUGFja2FnZSByZWZpbmVzIHRoZSBNZXRob2QgUGFja2FnZSBjb25jZXB0cyBkZWZpbmVkIGluIE1ldGhvZCBDb3JlIHdpdGggbmV3IHBhY2thZ2VzIHRoYXQgb3JnYW5pemUgcHJvY2Vzc2VzIGFuZCBicmVha2Rvd24gc3RydWN0dXJlcy4gIFByb2Nlc3MgRGVzY3JpcHRpb25zIHByb3ZpZGVzIHByb2Nlc3Mgc3BlY2lmaWMgY29udGVudCBkZXNjcmlwdGlvbnMgZXh0ZW5kaW5nIHRoZSB0YXhvbm9teSBiYXNlZCBvbiB0aGUgQ29udGVudCBEZXNjcmlwdGlvbiBjbGFzcyBkZWZpbmVkIGluIE1ldGhvZCBDb3JlLiAgRmluYWxseSwgV29ya2Zsb3cgZGVmaW5lcyBob3cgcHJvY2VzcyBjYW4gYmUgZW5hY3RlZCBieSBwcm92aWRpbmcgZXh0ZW5kZWQgZGF0YSBzdHJ1Y3R1cmVzIHRoYXQgYWxsb3cgY3JlYXRpbmcgbW9kZWxzIGZpdCBmb3IgaW5zdGFudGlhdGlvbiBvbiB0aGUgTTAgbGV2ZWwuICBJbiBvdGhlciB3b3JkcywgaXQgcHJvdmlkZXMgYSBtZXRhLXNjaGVtYSBmb3Igd29ya2Zsb3cgbW9kZWxzIHRoYXQgY2FuIHJ1biBpbiBhIHdvcmtmbG93IHNpbXVsYXRvciBzdWNoIGFzIElCTSBXZWJzcGhlcmUgQnVzaW5lc3MgSW50ZWdyYXRpb24gTW9kZWxlci4mI3hBOyIvPg0KLSAgICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4NCi0gICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRHhueXNPeE1FZHVPTnJNUmdtejQ4QSIgZWxlbWVudD0iX0R4TEd3T3hNRWR1T05yTVJnbXo0OEEiIHNvdXJjZT0iX0dfVXdzT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0dfVXdwdWZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0R4bnlzLXhNRWR1T05yTVJnbXo0OEEiIHR5cGU9IktpbmRMYWJlbCI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9EeG55dGV4TUVkdU9Ock1SZ216NDhBIiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9EeG55dC14TUVkdU9Ock1SZ216NDhBIiB0eXBlPSJLaW5kIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9EeG55dHV4TUVkdU9Ock1SZ216NDhBIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0R4bnl0T3hNRWR1T05yTVJnbXo0OEEiIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRHhueXNleE1FZHVPTnJNUmdtejQ4QSIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRHhueXN1eE1FZHVPTnJNUmdtejQ4QSIgcG9pbnRzPSJbMywgMzIsIC02LCAtODVdJFsxMSwgMTUwLCAyLCAzM10iLz4NCi0gICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9Gb1BXRWV4TUVkdU9Ock1SZ216NDhBIiBlbGVtZW50PSJfRm9QV0VPeE1FZHVPTnJNUmdtejQ4QSIgc291cmNlPSJfR19laFItZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfR19Vd3NPZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRm9QV0ZPeE1FZHVPTnJNUmdtejQ4QSIgdHlwZT0iS2luZExhYmVsIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ZvUFdGdXhNRWR1T05yTVJnbXo0OEEiIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ZvUFdHT3hNRWR1T05yTVJnbXo0OEEiIHR5cGU9IktpbmQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ZvUFdGLXhNRWR1T05yTVJnbXo0OEEiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRm9QV0ZleE1FZHVPTnJNUmdtejQ4QSIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9Gb1BXRXV4TUVkdU9Ock1SZ216NDhBIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9Gb1BXRS14TUVkdU9Ock1SZ216NDhBIiBwb2ludHM9IlsyLCAzMiwgLTgsIC05MV0kWzExLCAxNTUsIDEsIDMyXSIvPg0KLSAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0ladF9NZXhNRWR1T05yTVJnbXo0OEEiIGVsZW1lbnQ9Il9JWnRfTU94TUVkdU9Ock1SZ216NDhBIiBzb3VyY2U9Il9HX3hjU2VmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HX2VoUi1mWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9JWnRfTk94TUVkdU9Ock1SZ216NDhBIiB0eXBlPSJLaW5kTGFiZWwiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSVp0X051eE1FZHVPTnJNUmdtejQ4QSIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSVp0X09PeE1FZHVPTnJNUmdtejQ4QSIgdHlwZT0iS2luZCIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSVp0X04teE1FZHVPTnJNUmdtejQ4QSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9JWnRfTmV4TUVkdU9Ock1SZ216NDhBIiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0ladF9NdXhNRWR1T05yTVJnbXo0OEEiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0ladF9NLXhNRWR1T05yTVJnbXo0OEEiIHBvaW50cz0iWzgxLCAxNywgLTEyNywgLTE0XSRbMTU3LCA2MywgLTUxLCAzMl0iLz4NCi0gICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9yMFZSSWV4aEVkdUhqZTNwUGFoTjRBIiBlbGVtZW50PSJfcjBWUklPeGhFZHVIamUzcFBhaE40QSIgc291cmNlPSJfR19uclF1ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfR194Y1NlZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfcjBWUkpPeGhFZHVIamUzcFBhaE40QSIgdHlwZT0iS2luZExhYmVsIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3IwVlJKdXhoRWR1SGplM3BQYWhONEEiIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3IwVlJLT3hoRWR1SGplM3BQYWhONEEiIHR5cGU9IktpbmQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3IwVlJKLXhoRWR1SGplM3BQYWhONEEiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfcjBWUkpleGhFZHVIamUzcFBhaE40QSIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9yMFZSSXV4aEVkdUhqZTNwUGFoTjRBIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9yMFZSSS14aEVkdUhqZTNwUGFoTjRBIiBwb2ludHM9IlstNjgsIDMsIDM0MCwgLTIwXSRbLTMyOCwgMTgsIDgwLCAtNV0iLz4NCi0gICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICA8L2NvbnRlbnRzPg0KLSAgICAgICAgICA8Y29udGVudHMgeG1pOnR5cGU9Im5vdGF0aW9uOkRpYWdyYW0iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjVGNTA5MDIwNiIgdHlwZT0iQ2xhc3MiIG5hbWU9IlRheG9ub215Ij4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR194Y1plZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI4MCI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR194Y2FPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HX3hjYWVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfeGNhdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX3hjYS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR194Y2JPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR194Y2JlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0dfeGNidWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR194Y2ItZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0dfeGNjT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR194Y2NlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0dfeGNjdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR194Y2MtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HX3hjZE9mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfR194Y1p1ZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0dfeGNaLWZYRWR1cUhvT0piVVJaUnciIHg9IjE1MjE2IiB5PSIzMTciLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HXzdOTU9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDc3Ij4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HXzdOTS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0dfN05OT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR183Tk5lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfN05OdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HXzdOTi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HXzdOT09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfR183Tk9lZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HXzdOT3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfR183Tk8tZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HXzdOUE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfR183TlBlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HXzdOUHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0dfN05QLWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HXzdOTWVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfR183Tk11ZlhFZHVxSG9PSmJVUlpSdyIgeD0iODg3NiIgeT0iMTgwOTUiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HXzdOUU9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMERDIj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HXzdOUS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0dfN05ST2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR183TlJlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfN05SdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HXzdOUi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HXzdOU09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfR183TlNlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HXzdOU3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfR183TlMtZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HXzdOVE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfR183TlRlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HXzdOVHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0dfN05ULWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HXzdOUWVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfR183TlF1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTIxMDciIHk9IjE4MDI1Ii8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR183TlVPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDBFNSI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR183TlUtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HXzdOVk9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfN05WZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HXzdOVnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR183TlYtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR183TldPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0dfN05XZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR183Tld1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0dfN05XLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR183TlhPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0dfN05YZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR183Tlh1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HXzdOWC1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfR183TlVlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0dfN05VdWZYRWR1cUhvT0piVVJaUnciIHg9IjE1ODUwIiB5PSIxODA2OSIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfN05ZT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwRTYiPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfN05ZLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfR183TlpPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HXzdOWmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR183Tlp1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfN05aLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfN05hT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HXzdOYWVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfN05hdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HXzdOYS1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfN05iT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HXzdOYmVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfN05idWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfR183TmItZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0dfN05ZZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HXzdOWXVmWEVkdXFIb09KYlVSWlJ3IiB4PSIzMzYxIiB5PSI4NzcxIi8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR183TmNPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDA2MyI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR183TmMtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HXzdOZE9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfN05kZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HXzdOZHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR183TmQtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR183TmVPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0dfN05lZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR183TmV1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0dfN05lLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR183TmZPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0dfN05mZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR183TmZ1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HXzdOZi1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfR183TmNlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0dfN05jdWZYRWR1cUhvT0piVVJaUnciIHg9IjU5MDEiIHk9Ijg3NzkiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HXzdOZ09mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDhCIj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HXzdOZy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0dfN05oT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR183TmhlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfN05odWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HXzdOaC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HXzdOaU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfR183TmllZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HXzdOaXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfR183TmktZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HXzdOak9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfR183TmplZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HXzdOanVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0dfN05qLWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HXzdOZ2VmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfR183Tmd1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTgyMyIgeT0iMTEwMzgiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HXzdObWVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDQ1Ij4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HXzdObk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0dfN05uZWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR183Tm51ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfN05uLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HXzdOb09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HXzdOb2VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfR183Tm91ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HXzdOby1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfR183TnBPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HXzdOcGVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfR183TnB1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HXzdOcC1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0dfN05xT2ZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HXzdObXVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfR183Tm0tZlhFZHVxSG9PSmJVUlpSdyIgeD0iMjMzNyIgeT0iMTEwMzgiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HXzdOc3VmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUQwM0NCIj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HXzdOdGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0dfN050dWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR183TnQtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfN051T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HXzdOdWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HXzdOdXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfR183TnUtZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HXzdOdk9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfR183TnZlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HXzdOdnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfR183TnYtZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HXzdOd09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0dfN053ZWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HXzdOcy1mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfR183TnRPZlhFZHVxSG9PSmJVUlpSdyIgeD0iOTMwNCIgeT0iMTM0MDIiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HXzdOd3VmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDMxIj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HXzdOeGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0dfN054dWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR183TngtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfN055T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HXzdOeWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HXzdOeXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfR183TnktZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HXzdOek9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfR183TnplZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HXzdOenVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfR183TnotZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HXzdOME9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0dfN04wZWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HXzdOdy1mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfR183TnhPZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTAzMjAiIHk9IjExMDY1Ii8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFFWElPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVEMDNDQSI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFFWEktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IQUVYSk9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBRVhKZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQUVYSnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFFWEotZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFFWEtPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hBRVhLZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFFWEt1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hBRVhLLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFFWExPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hBRVhMZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFFWEx1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQUVYTC1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEFFWEllZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hBRVhJdWZYRWR1cUhvT0piVVJaUnciIHg9IjExODQ0IiB5PSIxMzQwMiIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBRVhNT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwMDkiPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBRVhNLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEFFWE5PZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQUVYTmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFFWE51ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBRVhOLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBRVhPT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQUVYT2VmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBRVhPdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQUVYTy1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBRVhQT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQUVYUGVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBRVhQdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEFFWFAtZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hBRVhNZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IQUVYTXVmWEVkdXFIb09KYlVSWlJ3IiB4PSI2ODkxIiB5PSIxMTAzOCIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBRVhRT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwOUYiPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBRVhRLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEFFWFJPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQUVYUmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFFWFJ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBRVhSLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBRVhTT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQUVYU2VmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBRVhTdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQUVYUy1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBRVhUT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQUVYVGVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBRVhUdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEFFWFQtZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hBRVhRZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IQUVYUXVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxNDM3NiIgeT0iMTU2ODAiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQUVYYS1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUQwM0QzIj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQUVYYnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hBRVhiLWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFFWGNPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBRVhjZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQUVYY3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQUVYYy1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEFFWGRPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQUVYZGVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEFFWGR1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQUVYZC1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEFFWGVPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQUVYZWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hBRVhldWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IQUVYYk9mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93UGFyZW50PSJOYW1lIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEFFWGJlZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTMwMTMiIHk9IjExMDY1Ii8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFFWGplZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRTBGRTkzMDA3NyI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFFWGtPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IQUVYa2VmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMjY0MSIgaGVpZ2h0PSIxMDMyIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBRVhrdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQUVYay1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFFWGxPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFFWGxlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hBRVhsdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFFWGwtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hBRVhtT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFFWG1lZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hBRVhtdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFFWG0tZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQUVYbk9mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEFFWGp1ZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1BhcmVudD0iTmFtZSIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hBRVhqLWZYRWR1cUhvT0piVVJaUnciIHg9IjE0Mzc2IiB5PSIxMzQwMiIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBRVhyLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTE5QTRFNjAyQzEiPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBRVhzdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEFFWHMtZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjI0NTUiIGhlaWdodD0iMTA0OSIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQUVYdE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFFWHRlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBRVh0dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBRVh0LWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQUVYdU9mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBRVh1ZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQUVYdXVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBRVh1LWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQUVYdk9mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBRVh2ZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEFFWHZ1ZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hBRVhzT2ZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IQUVYc2VmWEVkdXFIb09KYlVSWlJ3IiB4PSIxMjgyNyIgeT0iNjQzNCIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBRVh2LWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwRUYiPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBRVh3dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEFFWHctZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQUVYeE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFFWHhlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBRVh4dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBRVh4LWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQUVYeU9mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBT0lJT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQU9JSWVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBT0lJdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQU9JSS1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBT0lKT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEFPSUplZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hBRVh3T2ZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IQUVYd2VmWEVkdXFIb09KYlVSWlJ3IiB4PSI4OTIzIiB5PSI2NDM0Ii8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFPSU9PZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyODNFOEExMDM0MSI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFPSU8tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IQU9JUE9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMjk0NiIgaGVpZ2h0PSIxMDMyIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBT0lQZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQU9JUHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFPSVAtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFPSVFPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hBT0lRZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFPSVF1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hBT0lRLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFPSVJPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hBT0lSZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFPSVJ1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQU9JUi1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEFPSU9lZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hBT0lPdWZYRWR1cUhvT0piVVJaUnciIHg9IjEyMzQ0IiB5PSI0MTU3Ii8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFPSVktZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E4MkQzMDE3RiI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFPSVp1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IQU9JWi1mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMzY5MSIgaGVpZ2h0PSIxMDMyIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBT0lhT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQU9JYWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFPSWF1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFPSWEtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hBT0liT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFPSWJlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hBT0lidWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFPSWItZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hBT0ljT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFPSWNlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQU9JY3VmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEFPSVpPZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hBT0laZWZYRWR1cUhvT0piVVJaUnciIHg9IjE2MDM1IiB5PSI4Nzc5Ii8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFPSWZPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E5MjU0MDIyNyI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFPSWYtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IQU9JZ09mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iNDI2NyIgaGVpZ2h0PSIxMDMyIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBT0lnZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQU9JZ3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFPSWctZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFPSWhPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hBT0loZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFPSWh1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hBT0loLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFPSWlPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hBT0lpZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFPSWl1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQU9JaS1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEFPSWZlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hBT0lmdWZYRWR1cUhvT0piVVJaUnciIHg9Ijg0ODMiIHk9Ijg3NzkiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQU9Jak9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDEwODE4NzkwMjg4Ij4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQU9Jai1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hBT0lrT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIyMzE5IiBoZWlnaHQ9IjEwNDkiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFPSWtlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBT0lrdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQU9Jay1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQU9JbE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEFPSWxlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQU9JbHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEFPSWwtZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQU9JbU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEFPSW1lZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQU9JbXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hBT0ltLWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IQU9JamVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEFPSWp1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTU3NDMiIHk9IjY0MzQiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQU9JeWVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI5NEVCOTAwMEZDIj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQU9Jek9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hBT0l6ZWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIzNTg5IiBoZWlnaHQ9IjEwMzIiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFPSXp1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBT0l6LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQU9JME9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQU9JMGVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEFPSTB1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQU9JMC1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEFPSTFPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQU9JMWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEFPSTF1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQU9JMS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hBT0kyT2ZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IQU9JeXVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEFPSXktZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTIwMjIiIHk9IjIxNzUiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTERpYWdyYW1TdHlsZSIgeG1pOmlkPSJfR29PZTd1ZlhFZHVxSG9PSmJVUlpSdyIgZGVzY3JpcHRpb249IlRoaXMgZGlhZ3JhbSBwcm92aWRlcyB0aGUgdGF4b25vbXkgb2YgYWxsIHRoZSBtYWluIGNsYXNzZXMgb2YgdGhlIFByb2Nlc3MgcGFja2FnZS4iLz4NCi0gICAgICAgICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+DQotICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0dfN05rT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxNjAiIHNvdXJjZT0iX0dfN05nT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0dfN05ZT2ZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfN05rLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HXzdObGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HXzdObHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HXzdObE9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0dfN05rZWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0dfN05rdWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzY2MCwgLTUyNCwgLTIyODYsIDE3NjFdJFsyMjUyLCAtMTc2MSwgLTY5NCwgNTI0XSIvPg0KLSAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0dfN05sLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0dfN05tT2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0dfN05xZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzRDYiIHNvdXJjZT0iX0dfN05tZWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0dfN05ZT2ZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfN05yT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HXzdOcnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HXzdOci1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HXzdOcmVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0dfN05xdWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0dfN05xLWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0xNDMsIC01MzMsIDQ2NSwgMTc1Ml0kWy00NzQsIC0xNzYxLCAxMzUsIDUyNF0iLz4NCi0gICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HXzdOc09mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HXzdOc2VmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IQUVYVU9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTEwIiBzb3VyY2U9Il9HXzdOTU9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IQUVYUU9mWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQUVYVS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFFWFZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFFWFZ1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEFFWFZPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IQUVYVWVmWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IQUVYVXVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlsxMTQzLCAtNTI0LCAtNDA4OSwgMTgxMV0kWzQwMzgsIC0xODExLCAtMTE5MywgNTI0XSIvPg0KLSAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hBRVhWLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hBRVhXT2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hBRVhXZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyOEQiIHNvdXJjZT0iX0dfN05RT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hBRVhRT2ZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBRVhYT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQUVYWHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQUVYWC1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IQUVYWGVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hBRVhXdWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hBRVhXLWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzQ0OCwgLTUyNCwgLTE1ODMsIDE4MTFdJFsxNTY2LCAtMTgxMSwgLTQ2NSwgNTI0XSIvPg0KLSAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hBRVhZT2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hBRVhZZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hBRVhZdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyOEUiIHNvdXJjZT0iX0dfN05VT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hBRVhRT2ZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBRVhaZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQUVYWi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQUVYYU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IQUVYWnVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hBRVhZLWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hBRVhaT2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy00NTcsIC01MjQsIDE1NzQsIDE4MTFdJFstMTU3NCwgLTE4MTEsIDQ1NywgNTI0XSIvPg0KLSAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hBRVhhZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hBRVhhdWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hBRVhlLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAyQTAiIHNvdXJjZT0iX0dfN05zdWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hBRVhhLWZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBRVhmdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQUVYZ09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQUVYZ2VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IQUVYZi1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hBRVhmT2ZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hBRVhmZWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzgxMiwgLTUyNCwgLTI4OTUsIDE4MTFdJFsyODcwLCAtMTgyMCwgLTgzOCwgNTE2XSIvPg0KLSAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hBRVhndWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hBRVhnLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hBRVhoT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAyOUYiIHNvdXJjZT0iX0hBRVhJT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hBRVhhLWZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBRVhoLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQUVYaWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQUVYaXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IQUVYaU9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hBRVhoZWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hBRVhodWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzI0NSwgLTUyNCwgLTkyMiwgMTgxMV0kWzg5NywgLTE4MjAsIC0yNzAsIDUxNl0iLz4NCi0gICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IQUVYaS1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IQUVYak9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IQUVYbmVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFMEZFRDYwMkFFIiBzb3VyY2U9Il9IQUVYUU9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IQUVYamVmWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQUVYb09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFFWG91ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFFWG8tZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEFFWG9lZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IQUVYbnVmWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IQUVYbi1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlswLCAtNTMzLCAwLCAxNzUyXSRbMCwgLTE3NjksIDAsIDUxNl0iLz4NCi0gICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IQUVYcE9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IQUVYcGVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IQU9JSnVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjhGIiBzb3VyY2U9Il9HXzdOWU9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IQUVYdi1mWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQU9JS2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFPSUstZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFPSUxPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEFPSUt1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IQU9JSi1mWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IQU9JS09mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlsxMTU5LCAtNDU3LCAtNDkzNiwgMTg3OV0kWzQ3MDcsIC0xODExLCAtMTM4OCwgNTI0XSIvPg0KLSAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hBT0lMZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hBT0lMdWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hBT0lMLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwM0UiIHNvdXJjZT0iX0dfN05jT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hBRVh2LWZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBT0lNdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQU9JTk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQU9JTmVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IQU9JTS1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hBT0lNT2ZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hBT0lNZWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzc3OCwgLTUyNCwgLTI3NzcsIDE4MTFdJFsyNzQzLCAtMTgxMSwgLTgxMiwgNTI0XSIvPg0KLSAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hBT0lOdWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hBT0lOLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hBT0lTT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjgzRTkxRjAwNjEiIHNvdXJjZT0iX0hBRVh2LWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hBT0lPT2ZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBT0lTLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQU9JVGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQU9JVHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IQU9JVE9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hBT0lTZWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hBT0lTdWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzcyOCwgLTUzMywgLTI0NzIsIDE3NTJdJFsyNDQ2LCAtMTc2OSwgLTc1MywgNTE2XSIvPg0KLSAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hBT0lULWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hBT0lVT2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hBT0lVZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjgzRUVGOTAwRTIiIHNvdXJjZT0iX0hBRVhyLWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hBT0lPT2ZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBT0lWT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQU9JVnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQU9JVi1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IQU9JVmVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hBT0lVdWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hBT0lVLWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzAsIC01MzMsIDAsIDE3NTJdJFswLCAtMTc2OSwgMCwgNTE2XSIvPg0KLSAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hBT0lXT2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hBT0lXZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hBT0lXdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzMDMiIHNvdXJjZT0iX0hBRVhNT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0dfN05ZT2ZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBT0lYZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQU9JWC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQU9JWU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IQU9JWHVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hBT0lXLWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hBT0lYT2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy05MzksIC01MjQsIDMyMjUsIDE3NjFdJFstMzE5MSwgLTE3NjEsIDk3MywgNTI0XSIvPg0KLSAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hBT0lZZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hBT0lZdWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hBT0ljLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjhDRDMyOTAxRkQiIHNvdXJjZT0iX0hBRVhhLWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hBT0lZLWZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBT0lkdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQU9JZU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQU9JZWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IQU9JZC1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hBT0lkT2ZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hBT0lkZWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzgyMSwgLTUyNCwgLTI4ODcsIDE3NjFdJFsyODM2LCAtMTc2OSwgLTg3MiwgNTE2XSIvPg0KLSAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hBT0lldWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hBT0llLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hBT0luT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjgzRUQ2RDAwODgiIHNvdXJjZT0iX0hBT0lqT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hBT0lPT2ZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBT0luLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQU9Jb2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQU9Jb3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IQU9Jb09mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hBT0luZWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hBT0ludWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy02MzUsIC01MzMsIDIxMDgsIDE3NTJdJFstMjEyNSwgLTE3NjksIDYxOCwgNTE2XSIvPg0KLSAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hBT0lvLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hBT0lwT2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hBT0lwZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBOTI4MjAzOTIiIHNvdXJjZT0iX0hBRVhhLWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hBT0lmT2ZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBT0lxT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQU9JcXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQU9JcS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IQU9JcWVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hBT0lwdWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hBT0lwLWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy04MDQsIC01MjQsIDI3NTEsIDE3NjFdJFstMjc0MywgLTE3NjksIDgxMiwgNTE2XSIvPg0KLSAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hBT0lyT2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hBT0lyZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hBT0lydWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBOTIzQjAwMDIiIHNvdXJjZT0iX0hBRVhNT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hBT0lmT2ZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBT0lzZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQU9Jcy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQU9JdE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IQU9Jc3VmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hBT0lyLWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hBT0lzT2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzQzMSwgLTUyNCwgLTE0OTgsIDE3NjFdJFsxNDgxLCAtMTc2OSwgLTQ0OCwgNTE2XSIvPg0KLSAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hBT0l0ZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hBT0l0dWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hBT0l0LWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjhDRDMyMzAxOUEiIHNvdXJjZT0iX0hBT0lmT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hBRVh2LWZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBT0l1dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQU9Jdk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQU9JdmVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IQU9JdS1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hBT0l1T2ZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hBT0l1ZWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzAsIC01MjQsIDAsIDE4MTFdJFswLCAtMTgxMSwgMCwgNTI0XSIvPg0KLSAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hBT0l2dWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hBT0l2LWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hBT0l3T2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBODJGMzAyNkUiIHNvdXJjZT0iX0hBT0lZLWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0dfeGNaZWZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBT0l3LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQU9JeGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQU9JeHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IQU9JeE9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hBT0l3ZWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hBT0l3dWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzIxMiwgLTMxOCwgMTg1MywgODE3NV0kWzIxMiwgLTM4MzcsIDE4NTMsIDQ2NTZdJFstMTUwOCwgLTgxNzYsIDEzMywgMzE3XSIvPg0KLSAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hBT0l4LWZYRWR1cUhvT0piVVJaUnciIGlkPSIoMC44NzAwMzI1NSwwLjQ2NTQwODgpIi8+DQotICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEFPSXlPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEFYNUlPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyOTRFQ0MxMDMxRSIgc291cmNlPSJfSEFPSU9PZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEFPSXllZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFYNUktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBWDVKZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBWDVKdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hBWDVKT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEFYNUllZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEFYNUl1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMCwgLTUyNCwgMCwgMTQ1Nl0kWzAsIC0xNDY0LCAwLCA1MTZdIi8+DQotICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEFYNUotZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEFYNUtPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEFYNUtlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyOTRFQzJCMDFDQSIgc291cmNlPSJfSEFPSXllZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfR194Y1plZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFYNUxPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBWDVMdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBWDVMLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hBWDVMZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEFYNUt1ZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEFYNUstZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbNTI0LCAtNTI0LCAtMTQwNSwgMTM1NF0kWzEzODAsIC0xMzU0LCAtNTUwLCA1MjRdIi8+DQotICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEFYNU1PZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEFYNU1lZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEFYNU11ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyQjFFQzFCMDM0OSIgc291cmNlPSJfR183Tnd1ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEFPSWZPZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFYNU5lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBWDVOLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBWDVPT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hBWDVOdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEFYNU0tZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEFYNU5PZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTIwMywgLTUyNCwgNjYwLCAxNzYxXSRbLTY3NywgLTE3NjksIDE4NiwgNTE2XSIvPg0KLSAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hBWDVPZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hBWDVPdWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgIDwvY29udGVudHM+DQotICAgICAgICA8L2VBbm5vdGF0aW9ucz4NCi0gICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpQYWNrYWdlIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEZEODU0NjAwRDgiIG5hbWU9IkJyZWFrZG93biI+DQotICAgICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfR2s5SWdPZlhFZHVxSG9PSmJVUlpSdyIgc291cmNlPSJ1bWwyLmRpYWdyYW1zIiByZWZlcmVuY2VzPSJfM0FEQzdCNzQwMjJENDFGMDVFQ0QwMzkwIj4NCi0gICAgICAgICAgICA8Y29udGVudHMgeG1pOnR5cGU9Im5vdGF0aW9uOkRpYWdyYW0iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxRjA1RUNEMDM5MCIgdHlwZT0iQ2xhc3MiIG5hbWU9IkJyZWFrZG93bkVsZW1lbnQiPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cxTWo0T2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwRTYiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzFNajQtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0cxTWo1T2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIyMDgyIiBoZWlnaHQ9IjkwNSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzFNajVlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzFNajV1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzFNajUtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMU1qNk9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMU1qNmVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMU1qNnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMU1qNi1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMU1qN09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMU1qN2VmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMU1qN3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzFNajctZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HMU1qNGVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HMU1qNHVmWEVkdXFIb09KYlVSWlJ3IiB4PSI4OTAyIiB5PSI2MzAxIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cxTWo4T2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyQkMiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzFNajgtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0cxTWo5T2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSI0NDcwIiBoZWlnaHQ9IjExMTciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cxVnQwT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cxVnQwZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cxVnQwdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzFWdDAtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzFWdDFPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzFWdDFlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzFWdDF1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzFWdDEtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzFWdDJPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzFWdDJlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cxVnQydWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzFNajhlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMTI2MzIyNTYiIHNob3dQYXJlbnQ9Ik5hbWUiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0cxTWo4dWZYRWR1cUhvT0piVVJaUnciIHg9Ijc1MDUiIHk9IjExMjIwIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cxVnQyLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwNDUiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzFWdDN1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0cxVnQzLWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSI0MDEzIiBoZWlnaHQ9IjkwNSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzFWdDRPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzFWdDRlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzFWdDR1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMVZ0NC1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMVZ0NU9mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMVZ0NWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMVZ0NXVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMVZ0NS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMVZ0Nk9mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMVZ0NmVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzFWdDZ1ZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HMVZ0M09mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HMVZ0M2VmWEVkdXFIb09KYlVSWlJ3IiB4PSI2OTczIiB5PSI4NzM2Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cxOEswZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyOUUiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzE4SzFPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0cxOEsxZWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSI0MTgyIiBoZWlnaHQ9IjExMTciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cxOEsxdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cxOEsxLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cxOEsyT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzE4SzJlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzE4SzJ1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzE4SzItZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzE4SzNPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzE4SzNlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzE4SzN1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzE4SzMtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cxOEs0T2ZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzE4SzB1ZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMTI2MzIyNTYiIHNob3dQYXJlbnQ9Ik5hbWUiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0cxOEswLWZYRWR1cUhvT0piVVJaUnciIHg9IjMyMjkiIHk9IjExMjIwIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cxOEs0ZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwMDkiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzE4SzVPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0cxOEs1ZWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIyNzI2IiBoZWlnaHQ9IjkwNSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzE4SzV1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzE4SzUtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzE4SzZPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMThLNmVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMThLNnVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMThLNi1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMThLN09mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMThLN2VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMThLN3VmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMThLNy1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzE4SzhPZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HMThLNHVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HMThLNC1mWEVkdXFIb09KYlVSWlJ3IiB4PSIzNDg2IiB5PSI4NzM2Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyRlVzT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwNjMiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJGVXMtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0cyRlV0T2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIyMjY5IiBoZWlnaHQ9IjkwNSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJGVXRlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJGVXR1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJGVXQtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMkZVdU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMkZVdWVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMkZVdXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMkZVdS1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMkZVdk9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMkZVdmVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMkZVdnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzJGVXYtZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HMkZVc2VmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HMkZVc3VmWEVkdXFIb09KYlVSWlJ3IiB4PSIxMzM4MSIgeT0iNjMwMSIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMkZVd09mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDhCIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyRlV3LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HMkZVeE9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMjY3NSIgaGVpZ2h0PSI5MDUiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyRlV4ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyRlV4dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyRlV4LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJGVXlPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzJGVXllZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJGVXl1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzJGVXktZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJGVXpPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzJGVXplZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJGVXp1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cyRlV6LWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzJGVXdlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzJGVXd1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTIzNjIiIHk9Ijg3MzYiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJGVV9PZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI5NiI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMkZVXy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzJGVkFPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjQwMTMiIGhlaWdodD0iMTExNyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJGVkFlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJGVkF1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJGVkEtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMkZWQk9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMkZWQmVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMkZWQnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMkZWQi1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMkZWQ09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMkZWQ2VmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMkZWQ3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzJGVkMtZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HMkZVX2VmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIxMjYzMjI1NiIgc2hvd1BhcmVudD0iTmFtZSIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzJGVV91ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTIxMDIiIHk9IjExMjIwIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyUEY4T2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RDAzRDMiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJQRjgtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0cyUEY5T2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxNTc0IiBoZWlnaHQ9IjkwNSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJQRjllZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJQRjl1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJQRjktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMlBGLU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMlBGLWVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMlBGLXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMlBGLS1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMlBGX09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMlBGX2VmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMlBGX3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzJQRl8tZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HMlBGOGVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HMlBGOHVmWEVkdXFIb09KYlVSWlJ3IiB4PSI1NzM3IiB5PSI2NDA2Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyUEdBT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwRUYiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJQR0EtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0cyUEdCT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyUEdCZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyUEdCdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyUEdCLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJQR0NPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzJQR0NlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJQR0N1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzJQR0MtZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJQR0RPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzJQR0RlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJQR0R1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cyUEdELWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzJQR0FlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzJQR0F1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iOTQ0NCIgeT0iMjYzNSIgd2lkdGg9IjM4NTkiIGhlaWdodD0iMTIxOSIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMlkzRWVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI4M0U4QTEwMzQxIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyWTNGT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HMlkzRmVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMjk0NiIgaGVpZ2h0PSI5MDUiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyWTNGdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyWTNGLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyWTNHT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJpQW9PZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzJpQW9lZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJpQW91ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzJpQW8tZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJpQXBPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzJpQXBlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJpQXB1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cyaUFwLWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzJZM0V1ZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzJZM0UtZlhFZHVxSG9PSmJVUlpSdyIgeD0iOTY4OSIgeT0iOTY3Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyaUF5dWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBOTI1NDAyMjciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJpQXplZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0cyaUF6dWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSI0MjY3IiBoZWlnaHQ9IjkwNSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJpQXotZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJpQTBPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJpQTBlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMmlBMHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMmlBMC1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMmlBMU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMmlBMWVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMmlBMXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMmlBMS1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMmlBMk9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzJpQTJlZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HMmlBeS1mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HMmlBek9mWEVkdXFIb09KYlVSWlJ3IiB4PSIxNjYzIiB5PSIzNzEwIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cycnlIT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwMzEiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJyeUgtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0cycnlJT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxODYyIiBoZWlnaHQ9IjkwNSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJyeUllZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJyeUl1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJyeUktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMnJ5Sk9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMnJ5SmVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMnJ5SnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMnJ5Si1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMnJ5S09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMnJ5S2VmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMnJ5S3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzJyeUstZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HMnJ5SGVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HMnJ5SHVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxOTAwIiB5PSI1NjQxIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MRGlhZ3JhbVN0eWxlIiB4bWk6aWQ9Il9HazlJZ3VmWEVkdXFIb09KYlVSWlJ3IiBkZXNjcmlwdGlvbj0iVGhlIEJyZWFrZG93biBwYWNrYWdlIGNvbnRhaW5zIHRoZSBkZWZpbml0aW9uIG9mIGJyZWFrZG93biBlbGVtZW50cyB0aGF0IGZvcm0gYnJlYWtkb3duIHN0cnVjdHVyZXMuICBUaGUgZGlhZ3JhbSBzaG93cyB0aGUgdGF4b25vbXkgb2YgdGhlIG1haW4gY2xhc3Nlcy4gIEl0IHByZXNlbnQgdGhlIGRpZmZlcmVudCB0eXBlcyBvZiBCcmVha2Rvd24gRWxlbWVudHMgc3VjaCBhcyBBY3Rpdml0eSBhbmQgRGVzY3JpcHRvciBhcyB3ZWxsIGFzIHRoZWlyIGtleSByZWxhdGlvbnNoaXBzIGRlZmluZWQgaW4gdGhlIGZvbGxvd2luZyBzZWN0aW9ucy4iLz4NCi0gICAgICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HMVZ0Ni1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwM0Q2IiBzb3VyY2U9Il9HMVZ0Mi1mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HMU1qNE9mWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cxVnQ3dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cxVnQ4T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzFWdDhlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HMVZ0Ny1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HMVZ0N09mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HMVZ0N2VmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlsxNTIsIC00NTcsIDAsIDIwODJdJFsxNTIsIC0yMDkxLCAwLCA0NDhdIi8+DQotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HMVZ0OHVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0cxVnQ4LWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HMXlad09mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwM0Q3IiBzb3VyY2U9Il9HMU1qOE9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HMVZ0Mi1mWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cxeVp3LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cxeVp4ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzF5Wnh1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HMXlaeE9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMXlaeC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwM0RBIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzF5WnllZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0cxeVp5T2ZYRWR1cUhvT0piVVJaUnciIHg9IjE1MCIgeT0iNDU3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMXlaeXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzREEiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMXlaek9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0cxeVp5LWZYRWR1cUhvT0piVVJaUnciIHg9Ii03MCIgeT0iLTM0NyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzF5WnplZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwM0Q4Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzF5WnotZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzF5Wnp1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTQ2IiB5PSIyMTIiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cxeVowT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwM0Q4Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzE4S3dPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0cxeVowZWZYRWR1cUhvT0piVVJaUnciIHg9IjY0IiB5PSItMzQ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMThLd2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwM0RBIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzE4S3ctZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cxOEt4T2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzE4S3d1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzE4S3hlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwM0Q4Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzE4S3gtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cxOEt5T2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzE4S3h1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzE4S3llZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzREEiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMThLeS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzE4S3pPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HMThLeXVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMThLemVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwM0Q4Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzE4S3otZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzE4SzBPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HMThLenVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HMXlad2VmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HMXlad3VmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlswLCAtNTU4LCAtNTAsIDE5MzBdJFswLCAtMjA0MCwgLTUwLCA0NDhdIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0cxOEs4ZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzMEQiIHNvdXJjZT0iX0cxOEswZWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0cxOEs0ZWZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzE4SzlPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzE4Szl1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMThLOS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0cxOEs5ZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cxOEstT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzMTAiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMThLLXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzE4Sy1lZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTQ4IiB5PSI0NTAiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cxOEstLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDMxMCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cxOEtfZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzE4S19PZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTcyIiB5PSItMzQ2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMThLX3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzMEUiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMThMQU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HMThLXy1mWEVkdXFIb09KYlVSWlJ3IiB4PSItNzYiIHk9IjIwNCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzE4TEFlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzMEUiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMThMQS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzE4TEF1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iNTkiIHk9Ii0zNDYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cxOExCT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzMTAiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMThMQnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzE4TEItZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HMThMQmVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMThMQ09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzMEUiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMThMQ3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzE4TEMtZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HMThMQ2VmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMThMRE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDMxMCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cxOExEdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMThMRC1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0cxOExEZWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cxOExFT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzMEUiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMThMRXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMThMRS1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0cxOExFZWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0cxOEs4dWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0cxOEs4LWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzM3MiwgLTU1OCwgLTY0MywgMTkzMF0kWzM3MiwgLTIwNDgsIC02NDMsIDQ0MF0iLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzJGVTBPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDE2MCIgc291cmNlPSJfRzJGVXdPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzFNajRPZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMkZVMC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMkZVMWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyRlUxdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzJGVTFPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzJGVTBlZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HMkZVMHVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstNTg0LCAtNDU3LCAyNzE3LCAyMDgyXSRbLTI3MTcsIC0yMDkxLCA1ODQsIDQ0OF0iLz4NCi0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0cyRlUxLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzJGVTJPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0cyRlUyZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwM0YiIHNvdXJjZT0iX0cyRlV3T2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0cyRlVzT2ZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJGVTNPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJGVTN1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMkZVMy1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0cyRlUzZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyRlU0T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwNDIiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMkZVNHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzJGVTRlZlhFZHVxSG9PSmJVUlpSdyIgeD0iODQiIHk9Ii0xMzUiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyRlU0LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDQyIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJGVTVlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HMkZVNU9mWEVkdXFIb09KYlVSWlJ3IiB4PSIxODMiIHk9IjExMDYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyRlU1dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDA0MCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyRlU2T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0cyRlU1LWZYRWR1cUhvT0piVVJaUnciIHg9Ii0zNjgiIHk9Ii0xMzUiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyRlU2ZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDQwIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJGVTYtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0cyRlU2dWZYRWR1cUhvT0piVVJaUnciIHg9IjcyIiB5PSItMzQ2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMkZVN09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDQyIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJGVTd1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cyRlU3LWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzJGVTdlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJGVThPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDQwIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJGVTh1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cyRlU4LWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzJGVThlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJGVTlPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwNDIiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMkZVOXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzJGVTktZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HMkZVOWVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMkZVLU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDQwIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJGVS11ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzJGVS0tZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HMkZVLWVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HMkZVMnVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HMkZVMi1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9Ils3MzYsIC00NDgsIC01MzMsIDIwOTFdJFs3MzYsIC0yMDkxLCAtNTMzLCA0NDhdIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0cyRlZET2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxNkEiIHNvdXJjZT0iX0cyRlVfT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0cyRlV3T2ZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJGVkQtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJGVkVlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMkZWRXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0cyRlZFT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyRlZFLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxNkQiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMkZWRmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzJGVkZPZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTY0IiB5PSI0MDYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyRlZGdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDE2RCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyRlZHT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzJGVkYtZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTY0IiB5PSItMzQ4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMkZWR2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxNkIiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMkZWRy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HMkZWR3VmWEVkdXFIb09KYlVSWlJ3IiB4PSItMTciIHk9IjE5NCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJGVkhPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxNkIiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMkZWSHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzJGVkhlZlhFZHVxSG9PSmJVUlpSdyIgeD0iNTkiIHk9Ii0zNDgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyRlZILWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxNkQiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMkZWSWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzJGVkl1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HMkZWSU9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMkZWSS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxNkIiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMkZWSmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzJGVkp1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HMkZWSk9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMkZWSi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDE2RCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyRlZLZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMkZWS3VmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0cyRlZLT2ZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyUEZzT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxNkIiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMlBGc3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMlBGcy1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0cyUEZzZWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0cyRlZEZWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0cyRlZEdWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0yNDUsIC01NjcsIDYxOCwgMTkyMV0kWy0yNDUsIC0yMDQ4LCA2MTgsIDQ0MF0iLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzJQR0VPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRTBGRkQzMDBFRiIgc291cmNlPSJfRzJQR0FPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzJQRjhPZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMlBHRS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJQR0ZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMlBHRnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzJQR0ZPZlhFZHVxSG9PSmJVUlpSdyIgeD0iMzM4IiB5PSItNzcwIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMlBHRi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFMEZGRDMwMEYxIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJQR0dlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0cyUEdHT2ZYRWR1cUhvT0piVVJaUnciIHg9Ii01MzgiIHk9Ii0yNDUiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyUEdHdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFMEZGRDMwMEYxIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJQR0hPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HMlBHRy1mWEVkdXFIb09KYlVSWlJ3IiB4PSI5NDMiIHk9IjIzNyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJQR0hlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFMEZGRDMwMEYwIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJQR0gtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzJQR0h1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iNTM5IiB5PSItNDU3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMlkyc09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFMEZGRDMwMEYwIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJZMnN1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0cyWTJzZWZYRWR1cUhvT0piVVJaUnciIHg9IjY1IiB5PSItMTI1MyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJZMnMtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRTBGRkQzMDBGMSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyWTJ0ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMlkydHVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0cyWTJ0T2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyWTJ0LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRTBGRkQzMDBGMCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyWTJ1ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMlkydXVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0cyWTJ1T2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyWTJ1LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFMEZGRDMwMEYxIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJZMnZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cyWTJ2dWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzJZMnZPZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJZMnYtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRTBGRkQzMDBGMCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyWTJ3ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cyWTJ3dWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzJZMndPZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzJQR0VlZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzJQR0V1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTE3MTgsIDM4MSwgMTkzOCwgLTMxMjRdJFstNDEwNiwgMzgxLCAtNDQ4LCAtMzEyNF0kWy00MTA2LCAzMDU2LCAtNDQ4LCAtNDQ4XSIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HMlkydy1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjhGIiBzb3VyY2U9Il9HMU1qNE9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HMlBHQU9mWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyWTJ4dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyWTJ5T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJZMnllZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HMlkyeC1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HMlkyeE9mWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0cyWTJ4ZWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzE1MiwgLTQ1NywgLTEwNjYsIDMwNDhdJFs5OTksIC0yODk1LCAtMjIwLCA2MDldIi8+DQotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HMlkyeXVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0cyWTJ5LWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HMlkyek9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDNFIiBzb3VyY2U9Il9HMkZVc09mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HMlBHQU9mWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyWTJ6LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyWTIwZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJZMjB1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HMlkyME9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HMlkyemVmWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0cyWTJ6dWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy00NDAsIC00NTcsIDI5MTIsIDMwNDhdJFstMjc2OCwgLTI4OTUsIDU4NCwgNjA5XSIvPg0KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzJZMjAtZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HMlkyMU9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzJZM0NPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDMwMyIgc291cmNlPSJfRzE4SzRlZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzFNajRPZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMlkzQy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMlkzRGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyWTNEdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzJZM0RPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzJZM0NlZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HMlkzQ3VmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9Ils2MTgsIC00NTcsIC0yOTg4LCAyMDgyXSRbMjk0NiwgLTIwOTEsIC02NjAsIDQ0OF0iLz4NCi0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0cyWTNELWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzJZM0VPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0cyaUFxT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjgzRTkxRjAwNjEiIHNvdXJjZT0iX0cyUEdBT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0cyWTNFZWZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJpQXEtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJpQXJlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMmlBcnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0cyaUFyT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0cyaUFxZWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzJpQXF1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMCwgLTYxOCwgMCwgMTIxMF0kWzAsIC0xMzgwLCAwLCA0NDhdIi8+DQotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HMmlBci1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0cyaUFzT2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HMnJ4dE9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTkyM0IwMDAyIiBzb3VyY2U9Il9HMThLNGVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HMmlBeXVmWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cycnh0LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cycnh1ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJyeHV1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HMnJ4dU9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HMnJ4dGVmWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0cycnh0dWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0yMzcsIC00NTcsIDIzMDIsIDQ2NzNdJFstMjMyOCwgLTQ2ODIsIDIxMSwgNDQ4XSIvPg0KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzJyeHUtZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HMnJ4dk9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzJyeHZlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyOENEMzIzMDE5QSIgc291cmNlPSJfRzJpQXl1ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzJQR0FPZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMnJ4d09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMnJ4d3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cycnh3LWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzJyeHdlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzJyeHZ1ZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzJyeHYtZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbOTE0LCAtNDQ4LCAtNjQ1MSwgNDY1XSRbOTE0LCAtMTI3OCwgLTY0NTEsIC0zNjRdJFs1NjQ3LCAtMTI3OCwgLTE3MTgsIC0zNjRdIi8+DQotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HMnJ4eE9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0cycnh4ZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HMnJ4My1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTkyODIwMzkyIiBzb3VyY2U9Il9HMlBGOE9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HMmlBeXVmWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cycng0dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cycng1T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJyeDVlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HMnJ4NC1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HMnJ4NE9mWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0cycng0ZWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy02NDMsIC00NTcsIDMwNjQsIDIxMzNdJFstMzA3MywgLTIxNDIsIDYzNSwgNDQ4XSIvPg0KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzJyeDV1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HMnJ4NS1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzJyeUxPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyQjFFQzFCMDM0OSIgc291cmNlPSJfRzJyeUhPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzJpQXl1ZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMjFpb09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMjFpb3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyMWlvLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzIxaW9lZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzJyeUxlZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HMnJ5THVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlsyMjAsIC00NTcsIC03NDUsIDE0NzNdJFs3MjgsIC0xNDgxLCAtMjM3LCA0NDhdIi8+DQotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HMjFpcE9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0cyMWlwZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9RS1VLSU1WSEVkeTJtdVEyUFF2SF9BIiBlbGVtZW50PSJfUUYyZzRNVkhFZHkybXVRMlBRdkhfQSIgc291cmNlPSJfRzJyeUhPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzFWdDItZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9RS1VLSThWSEVkeTJtdVEyUFF2SF9BIiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9RS1VLSmNWSEVkeTJtdVEyUFF2SF9BIiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX1FLVUtKc1ZIRWR5Mm11UTJQUXZIX0EiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9RS1VLSk1WSEVkeTJtdVEyUFF2SF9BIiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9RS1VLSjhWSEVkeTJtdVEyUFF2SF9BIiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfUUdTbHdzVkhFZHkybXVRMlBRdkhfQSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX1FLVUtLY1ZIRWR5Mm11UTJQUXZIX0EiIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9RS1VLS01WSEVkeTJtdVEyUFF2SF9BIiB4PSItMjY1IiB5PSItMjY1Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9RS1VLS3NWSEVkeTJtdVEyUFF2SF9BIiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iX1FHU2x3c1ZIRWR5Mm11UTJQUXZIX0EiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9RS1VLTE1WSEVkeTJtdVEyUFF2SF9BIiB0eXBlPSJUb1JvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX1FLVUtLOFZIRWR5Mm11UTJQUXZIX0EiIHk9Ii0zOTciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX1FLVUtMY1ZIRWR5Mm11UTJQUXZIX0EiIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iX1FGMmc0Y1ZIRWR5Mm11UTJQUXZIX0EiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9RS1VLTDhWSEVkeTJtdVEyUFF2SF9BIiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9RS1VLTHNWSEVkeTJtdVEyUFF2SF9BIiB4PSIzMTciIHk9IjM0MyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfUUtVS01NVkhFZHkybXVRMlBRdkhfQSIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iX1FGMmc0Y1ZIRWR5Mm11UTJQUXZIX0EiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9RS1VLTXNWSEVkeTJtdVEyUFF2SF9BIiB0eXBlPSJGcm9tUm9sZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfUUtVS01jVkhFZHkybXVRMlBRdkhfQSIgeD0iLTkwMCIgeT0iNTI4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9RS2Q3SU1WSEVkeTJtdVEyUFF2SF9BIiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfUUdTbHdzVkhFZHkybXVRMlBRdkhfQSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX1FLZDdJc1ZIRWR5Mm11UTJQUXZIX0EiIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9RS2Q3SThWSEVkeTJtdVEyUFF2SF9BIi8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX1FLZDdJY1ZIRWR5Mm11UTJQUXZIX0EiIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX1FLZDdKTVZIRWR5Mm11UTJQUXZIX0EiIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iX1FGMmc0Y1ZIRWR5Mm11UTJQUXZIX0EiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9RS2Q3SnNWSEVkeTJtdVEyUFF2SF9BIiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfUUtkN0o4VkhFZHkybXVRMlBRdkhfQSIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9RS2Q3SmNWSEVkeTJtdVEyUFF2SF9BIiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9RS2Q3S01WSEVkeTJtdVEyUFF2SF9BIiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iX1FHU2x3c1ZIRWR5Mm11UTJQUXZIX0EiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9RS2Q3S3NWSEVkeTJtdVEyUFF2SF9BIiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfUUtkN0s4VkhFZHkybXVRMlBRdkhfQSIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9RS2Q3S2NWSEVkeTJtdVEyUFF2SF9BIiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9RS2Q3TE1WSEVkeTJtdVEyUFF2SF9BIiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfUUYyZzRjVkhFZHkybXVRMlBRdkhfQSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX1FLZDdMc1ZIRWR5Mm11UTJQUXZIX0EiIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX1FLZDdMOFZIRWR5Mm11UTJQUXZIX0EiLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfUUtkN0xjVkhFZHkybXVRMlBRdkhfQSIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfUUtVS0ljVkhFZHkybXVRMlBRdkhfQSIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGp1bXBMaW5rU3RhdHVzPSJBbGwiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfUUtVS0lzVkhFZHkybXVRMlBRdkhfQSIgcG9pbnRzPSJbLTEzMiwgMzE3LCAtNTYwOSwgLTMwOTZdJFstMTMyLCAxOTg0LCAtNTYwOSwgLTE0MjldJFs2MTY1LCAxOTg0LCA2ODgsIC0xNDI5XSRbNjE2NSwgMjc3OCwgNjg4LCAtNjM1XSIvPg0KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfWFE4MW9NVkhFZHkybXVRMlBRdkhfQSIgaWQ9IigwLjMzNTgwNzQ3LDAuOTQ4MTEzMikiLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgPC9jb250ZW50cz4NCi0gICAgICAgICAgICA8Y29udGVudHMgeG1pOnR5cGU9Im5vdGF0aW9uOkRpYWdyYW0iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjVDNTEzMDIwMyIgdHlwZT0iQ2xhc3MiIG5hbWU9IldvcmtCcmVha2Rvd25TdHJ1Y3R1cmUiPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyMWlwdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5vdGUiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzIxaXFlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRGlhZ3JhbU5hbWUiPg0KLSAgICAgICAgICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyMWlxdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkRlc2NyaXB0aW9uIj4NCi0gICAgICAgICAgICAgICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOlNoYXBlU3R5bGUiIHhtaTppZD0iX0cyMWlwLWZYRWR1cUhvT0piVVJaUnciIGRlc2NyaXB0aW9uPSJ7SXRlcmF0aW9uLnByZWZpeCA9ICZxdW90O0l0ZXJhdGlvbiZxdW90O30mI3hBOyIgbGluZUNvbG9yPSIwIi8+DQotICAgICAgICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzIxaXFPZlhFZHVxSG9PSmJVUlpSdyIgeD0iMjA5MjEiIHk9IjEzODU5IiB3aWR0aD0iMzE3NSIgaGVpZ2h0PSIxMjQ0Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyMWlxLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5vdGUiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzIxaXJ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRGlhZ3JhbU5hbWUiPg0KLSAgICAgICAgICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyMWlyLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkRlc2NyaXB0aW9uIj4NCi0gICAgICAgICAgICAgICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOlNoYXBlU3R5bGUiIHhtaTppZD0iX0cyMWlyT2ZYRWR1cUhvT0piVVJaUnciIGRlc2NyaXB0aW9uPSJ7UGhhc2UucHJlZml4ID0gJnF1b3Q7UGhhc2UmcXVvdDt9JiN4QTsiIGxpbmVDb2xvcj0iMCIvPg0KLSAgICAgICAgICAgICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0cyMWlyZWZYRWR1cUhvT0piVVJaUnciIHg9IjE3NzU0IiB5PSIxMzg1OSIgd2lkdGg9IjI4MDIiIGhlaWdodD0iMTI0NCIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMjFpc09mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUQwM0NCIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyMWlzLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HMjFpdE9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMjFpdGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMjFpdHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMjFpdC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyMWl1T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cyMWl1ZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyMWl1dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cyMWl1LWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyMWl2T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cyMWl2ZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyMWl2dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMjFpdi1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0cyMWlzZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJOb25lIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0cyMWlzdWZYRWR1cUhvT0piVVJaUnciIHg9IjIxNTgxIiB5PSIxMjA1NiIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMjFpd09mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUQwM0NBIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyMWl3LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HMjFpeE9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMjFpeGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMi1za09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMi1za2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyLXNrdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cyLXNrLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyLXNsT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cyLXNsZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyLXNsdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cyLXNsLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyLXNtT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMi1zbWVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0cyMWl3ZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJOb25lIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0cyMWl3dWZYRWR1cUhvT0piVVJaUnciIHg9IjE5MTUxIiB5PSIxMjEwNyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMi1zbXVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMEU2Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyLXNuZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HMi1zbnVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMi1zbi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMi1zb09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMi1zb2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyLXNvdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cyLXNvLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyLXNwT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cyLXNwZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyLXNwdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cyLXNwLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyLXNxT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMi1zcWVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0cyLXNtLWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJOb25lIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0cyLXNuT2ZYRWR1cUhvT0piVVJaUnciIHg9IjEzNzc1IiB5PSI4MTQ0Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyLXNxdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyOUUiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzItc3JlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0cyLXNydWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyLXNyLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyLXNzT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyLXNzZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzItc3N1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzItc3MtZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzItc3RPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzItc3RlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzItc3R1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzItc3QtZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzItc3VPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cyLXN1ZWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzItc3EtZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzItc3JPZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTQxOTAiIHk9IjEzOTM0Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyLXN1dWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwMDkiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzItc3ZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0cyLXN2dWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyLXN2LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyLXN3T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyLXN3ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzItc3d1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzItc3ctZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzItc3hPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzItc3hlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzItc3h1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzItc3gtZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzItc3lPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cyLXN5ZWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzItc3UtZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9Ik5vbmUiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzItc3ZPZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTMzNTEiIHk9IjExNzAwIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyLXM3ZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwMzEiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzItczhPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0cyLXM4ZWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyLXM4dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyLXM4LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyLXM5T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzItczllZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzItczl1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzItczktZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzItcy1PZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzItcy1lZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzItcy11ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzItcy0tZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cyLXNfT2ZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzItczd1ZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9Ik5vbmUiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzItczctZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTE2NTgiIHk9IjcwMjciLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzItc19lZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxMDgwMDU3MDI3NiI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM0lka09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzNJZGtlZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNJZGt1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNJZGstZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iS2luZCIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNJZGxPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNJZGxlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM0lkbHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJFbnVtZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzNJZGwtZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNJZG1PZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzNJZG1lZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNJZG11ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzNJZG0tZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HMi1zX3VmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iTm9uZSIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HMi1zXy1mWEVkdXFIb09KYlVSWlJ3IiB4PSI1NDU5IiB5PSIxMjM0NyIgd2lkdGg9IjMyMzQiIGhlaWdodD0iMjcxNiIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM1JuaC1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUQwM0QzIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czUm5pdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HM1JuaS1mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM1Juak9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM1JuamVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM1JuanVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czUm5qLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0czUm5rT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czUm5rZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0czUm5rdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czUm5rLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0czUm5sT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czUm5sZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HM1JubHVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0czUm5pT2ZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJOb25lIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0czUm5pZWZYRWR1cUhvT0piVVJaUnciIHg9IjE5MTI2IiB5PSI4MTM2IiB3aWR0aD0iMjc5NCIgaGVpZ2h0PSIyMTE2Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czUm5xZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwRUYiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNSbnJPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0czUm5yZWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czUm5ydWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czUm5yLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czUm5zT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNSbnNlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HM1Juc3VmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM1Jucy1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HM1JudE9mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM1JudGVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HM1JudHVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM1JudC1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzNSbnVPZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HM1JucXVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iTm9uZSIgc2hvd0xpc3RTaWduYXR1cmU9InRydWUiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzNSbnEtZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTY4MTQiIHk9IjE4ODgiIHdpZHRoPSI3NTI2IiBoZWlnaHQ9IjI4MjciLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNiWXZlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxMDgxODc5MDI4OCI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM2JZd09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzNiWXdlZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNiWXd1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNiWXctZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNiWXhPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM2JZeGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0czYll4dWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czYll4LWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0czYll5T2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czYll5ZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0czYll5dWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czYll5LWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HM2JZek9mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0czYll2dWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJOb25lIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0czYll2LWZYRWR1cUhvT0piVVJaUnciIHg9IjQzNjAiIHk9IjEwMzYzIiB3aWR0aD0iNzIzMCIgaGVpZ2h0PSIxNTI0Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czYll6ZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBOTI1NDAyMjciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNiWTBPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0czYlkwZWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czYlkwdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czYlkwLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czYlkxT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNiWTFlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HM2JZMXVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM2JZMS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HM2JZMk9mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM2JZMmVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HM2JZMnVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM2JZMi1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzNiWTNPZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HM2JZenVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgc2hvd0xpc3RTaWduYXR1cmU9InRydWUiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzNiWXotZlhFZHVxSG9PSmJVUlpSdyIgeD0iNTY2NCIgeT0iMzc1MCIgd2lkdGg9IjU5NDMiIGhlaWdodD0iMjM1MyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTERpYWdyYW1TdHlsZSIgeG1pOmlkPSJfR2xHU1llZlhFZHVxSG9PSmJVUlpSdyIgZGVzY3JpcHRpb249IlRoaXMgZGlhZ3JhbSBzaG93cyB0aGUgdmlldyBvbiBCcmVha2Rvd24gRWxlbWVudHMgZnJvbSBhIHdvcmsgYnJlYWtkb3duIHBlcnNwZWN0aXZlIGNhbGxlZCBXQlMgKFdvcmsgQnJlYWtkb3duIFN0cnVjdHVyZSkgdGhhdCBpbmNsdWRlcyBUYXNrcyBhbmQgQWN0aXZpdGllcyAoYnV0IGFsc28gdGhlIG5vdGlvbiBvZiBNaWxlc3RvbmVzIHRoYXQgZG8gbm90IHJlcHJlc2VudCB3b3JrKS4gIFVNQSBhbHNvIGRlZmluZXMgdHdvIG1vcmUgdmlld3MgdGhhdCBoYXZlIGJlZW4gZGVmaW5lZCBhcyBXb3JrIFByb2R1Y3QgQnJlYWtkb3duIFN0cnVjdHVyZSBhbmQgVGVhbSBQcm9maWxlIEJyZWFrZG93biBTdHJ1Y3R1cmUuIi8+DQotICAgICAgICAgICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzItc3l1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDMwRCIgc291cmNlPSJfRzItc3F1ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzItc3V1ZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMi1zemVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMi1zei1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyLXMwT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzItc3p1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzItczBlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDMxMCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyLXMwLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HMi1zMHVmWEVkdXFIb09KYlVSWlJ3IiB4PSIyNDQiIHk9IjQwNiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzItczFPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzEwIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzItczF1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HMi1zMWVmWEVkdXFIb09KYlVSWlJ3IiB4PSItMTAzIiB5PSItMzQ4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMi1zMS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzMEUiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMi1zMmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HMi1zMk9mWEVkdXFIb09KYlVSWlJ3IiB4PSI1IiB5PSIyMTEiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyLXMydWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzBFIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzItczNPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0cyLXMyLWZYRWR1cUhvT0piVVJaUnciIHg9Ijk4IiB5PSItMzQ4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMi1zM2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzEwIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzItczMtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cyLXM0T2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzItczN1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzItczRlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzBFIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzItczQtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cyLXM1T2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzItczR1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzItczVlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzMTAiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMi1zNS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzItczZPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HMi1zNXVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMi1zNmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzBFIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzItczYtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzItczdPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HMi1zNnVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HMi1zeS1mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HMi1zek9mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMzMsIC01NTgsIDE2LCAyNTkwXSRbLTMzLCAtMjY1OCwgMTYsIDQ5MV0iLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzNJZG5PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTm90ZUF0dGFjaG1lbnQiIHNvdXJjZT0iX0cyMWlxLWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0cyMWl3T2ZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzNJZG5lZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSIwIi8+DQotICAgICAgICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzNJZG51ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMCwgLTYyNiwgMCwgMTI1M10kWzAsIC0xMzg4LCAwLCA0OTFdIi8+DQotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HM1JuZ09mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0czUm5nZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HM1JuZ3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOb3RlQXR0YWNobWVudCIgc291cmNlPSJfRzIxaXB1ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzIxaXNPZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkNvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HM1JuZy1mWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjAiLz4NCi0gICAgICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HM1JuaE9mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMjUsIC02MjYsIDI1LCAxMzAzXSRbLTQyLCAtMTQzOSwgOCwgNDkxXSIvPg0KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzNSbmhlZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HM1JuaHVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzNSbmwtZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDJBMCIgc291cmNlPSJfRzIxaXNPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzNSbmgtZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM1JubXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM1Jubk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czUm5uZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzNSbm0tZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzNSbm1PZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HM1JubWVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMjg3LCAtNDk5LCAxNjQyLCAyODUzXSRbLTEzMjksIC0yMjk0LCA2MDEsIDEwNThdIi8+DQotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HM1JubnVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0czUm5uLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HM1Jub09mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMjlGIiBzb3VyY2U9Il9HMjFpd09mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HM1JuaC1mWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czUm5vLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czUm5wZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNSbnB1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HM1JucE9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HM1Jub2VmWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0czUm5vdWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzE4NiwgLTQ5OSwgLTExODUsIDI5MDRdJFs5MzksIC0yMzQ1LCAtNDMxLCAxMDU4XSIvPg0KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzNSbnAtZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HM1JucU9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzNSbnVlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDJCNSIgc291cmNlPSJfRzNSbnFlZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzNSbnFlZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM1Judk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM1JudnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czUm52LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HM1JudmVmWEVkdXFIb09KYlVSWlJ3IiB4PSI5NDgiIHk9Ii0yNzg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM1Jud09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMkI4Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNSbnd1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0czUm53ZWZYRWR1cUhvT0piVVJaUnciIHg9IjIyNCIgeT0iLTU3OSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNSbnctZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMkI4Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNSbnhlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HM1JueE9mWEVkdXFIb09KYlVSWlJ3IiB4PSIxNDQ5IiB5PSItNTA0Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM1JueHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyQjYiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM1JueU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HM1JueC1mWEVkdXFIb09KYlVSWlJ3IiB4PSItNTU2IiB5PSItMjQxIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM1JueWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMkI2Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNSbnktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0czUm55dWZYRWR1cUhvT0piVVJaUnciIHg9Ii0xNDUiIHk9IjMzNCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNSbnpPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDJCOCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czUm56dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HM1Juei1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0czUm56ZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czUm4wT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDJCNiI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czUm4wdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HM1JuMC1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0czUm4wZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czUm4xT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMkI4Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNSbjF1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0czUm4xLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzNSbjFlZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNSbjJPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDJCNiI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czUm4ydWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0czUm4yLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzNSbjJlZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzNSbnV1ZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzNSbnUtZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMzc1NywgLTY2MiwgMzc1NywgLTY2Ml0kWzYxMzgsIC02NjIsIDYxMzgsIC02NjJdJFs2MTM4LCAtMjMyOSwgNjEzOCwgLTIzMjldJFs1MDIsIC0yMzI5LCA1MDIsIC0yMzI5XSRbNTAyLCAtMTQyOSwgNTAyLCAtMTQyOV0iLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzNSbjNPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDI4RiIgc291cmNlPSJfRzItc211ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzNSbnFlZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM1JuMy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM1JuNGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czUm40dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzNSbjRPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzNSbjNlZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HM1JuM3VmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9Ils1MTYsIC00OTksIC01Mjc0LCA0ODM0XSRbNDIzMywgLTM5MjAsIC0xNTU3LCAxNDEzXSIvPg0KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzNSbjQtZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HM1JuNU9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzNSbjVlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRTBGRkQzMDBFRiIgc291cmNlPSJfRzNSbnFlZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzNSbmgtZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM1JuNk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM1JuNnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czUm42LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HM1JuNmVmWEVkdXFIb09KYlVSWlJ3IiB4PSItNzYzIiB5PSI5MjMiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czUm43T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUUwRkZEMzAwRjEiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM2JZZ09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzNSbjdlZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTE2ODQiIHk9IjMzNSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNiWWdlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUUwRkZEMzAwRjEiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM2JZZy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0czYllndWZYRWR1cUhvT0piVVJaUnciIHg9Ii0yMjkiIHk9Ii0yNzAiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czYlloT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRTBGRkQzMDBGMCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czYllodWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0czYlloZWZYRWR1cUhvT0piVVJaUnciIHg9IjE0MTAiIHk9Ii0yNTQiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czYlloLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUUwRkZEMzAwRjAiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM2JZaWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzNiWWlPZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTIzIiB5PSIyNjIiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czYllpdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUUwRkZEMzAwRjEiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM2JZak9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzNiWWplZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HM2JZaS1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM2JZanVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUUwRkZEMzAwRjAiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM2JZa09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzNiWWtlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HM2JZai1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM2JZa3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRTBGRkQzMDBGMSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czYllsT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HM2JZbGVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0czYllrLWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czYllsdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUUwRkZEMzAwRjAiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM2JZbU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HM2JZbWVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0czYllsLWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0czUm41dWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0czUm41LWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzM3NTcsIDgyMCwgMzgxMCwgLTUwNTRdJFs2ODI2LCA4MjAsIDY4NzksIC01MDU0XSRbNjgyNiwgNTc5NCwgNjg3OSwgLTgwXSRbMTM0OSwgNTc5NCwgMTQwMiwgLTgwXSIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HM2JZbXVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRThGMEMwMjgxIiBzb3VyY2U9Il9HM1JucWVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HM1JucWVmWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czYlluZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czYlluLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNiWW9PZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HM2JZbnVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM2JZb2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRThGMEUwMjY2Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNiWW8tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0czYllvdWZYRWR1cUhvT0piVVJaUnciIHg9Ii0xNDkiIHk9IjU0OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNiWXBPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRThGMEUwMjY2Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNiWXB1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HM2JZcGVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMzk3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM2JZcC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjFFOEYwRTAyMzQiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM2JZcWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HM2JZcU9mWEVkdXFIb09KYlVSWlJ3IiB4PSIxMTUzIiB5PSI1MzIiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czYllxdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjFFOEYwRTAyMzQiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM2JZck9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzNiWXEtZlhFZHVxSG9PSmJVUlpSdyIgeD0iNDI4IiB5PSItMzI2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM2JZcmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRThGMEUwMjY2Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNiWXItZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0czYllzT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzNiWXJ1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNiWXNlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRThGMEUwMjM0Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNiWXMtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0czYll0T2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzNiWXN1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNiWXRlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjFFOEYwRTAyNjYiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM2JZdC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzNiWXVPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HM2JZdHVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM2JZdWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRThGMEUwMjM0Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNiWXUtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzNiWXZPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HM2JZdXVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HM2JZbS1mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HM2JZbk9mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMzc1NywgLTc2NywgLTM3NTcsIC03NjddJFstNTEwNywgLTc2NywgLTUxMDcsIC03NjddJFstNTEwNywgLTIzMjksIC01MTA3LCAtMjMyOV0kWy04NDcsIC0yMzI5LCAtODQ3LCAtMjMyOV0kWy04NDcsIC0xNDI5LCAtODQ3LCAtMTQyOV0iLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzNiWTNlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyODBFRDM4MDBBMCIgc291cmNlPSJfRzNiWXZlZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzNiWXplZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM2JZNE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM2JZNHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czYlk0LWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzNiWTRlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNiWTVPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyODBFRDM4MDBBMiI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czYlk1dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HM2JZNWVmWEVkdXFIb09KYlVSWlJ3IiB4PSItMjY2IiB5PSIxNDQiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czYlk1LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI4MEVEMzgwMEEyIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNiWTZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HM2JZNk9mWEVkdXFIb09KYlVSWlJ3IiB4PSItMjU4IiB5PSItMTYyNiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNiWTZ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI4MEVEMzgwMEExIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNiWTdPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzNiWTYtZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTcwIiB5PSIyNDUiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czYlk3ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjgwRUQzODAwQTEiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM2JZNy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzNiWTd1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTUzIiB5PSItNTA4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM2JZOE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI4MEVEMzgwMEEyIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNiWTh1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0czYlk4LWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzNiWThlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNiWTlPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI4MEVEMzgwMEExIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNiWTl1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0czYlk5LWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzNiWTllZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNiWS1PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjgwRUQzODAwQTIiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM2JZLXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzNiWS0tZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HM2JZLWVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM2JZX09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI4MEVEMzgwMEExIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNiWV91ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzNiWV8tZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HM2JZX2VmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HM2JZM3VmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HM2JZMy1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMTE4NSwgLTc2MiwgLTE4NDUsIDU0MzVdJFstMTE4NSwgLTUwMjAsIC0xODQ1LCAxMTc2XSIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HM2xKZ09mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI4MEVENDAwMENEIiBzb3VyY2U9Il9HM2JZdmVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HM2JZemVmWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czbEpnLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czbEpoZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNsSmh1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0czbEpoT2ZYRWR1cUhvT0piVVJaUnciIHg9Ijc1MCIgeT0iMTAyNiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNsSmgtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyODBFRDQwMDBDRiI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czbEppZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HM2xKaU9mWEVkdXFIb09KYlVSWlJ3IiB4PSItMjY4IiB5PSItMTc3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM2xKaXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyODBFRDQwMDBDRiI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czbEpqT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzNsSmktZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTIzNCIgeT0iMTc3MSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNsSmplZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI4MEVENDAwMENFIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNsSmotZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzNsSmp1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTk0IiB5PSItMTU3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM2xKa09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI4MEVENDAwMENFIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNsSmt1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0czbEprZWZYRWR1cUhvT0piVVJaUnciIHg9IjE2OSIgeT0iNjMxIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM2xKay1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI4MEVENDAwMENGIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNsSmxlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0czbEpsdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzNsSmxPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNsSmwtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI4MEVENDAwMENFIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNsSm1lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0czbEptdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzNsSm1PZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNsSm0tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjgwRUQ0MDAwQ0YiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM2xKbmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzNsSm51ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HM2xKbk9mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM2xKbi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI4MEVENDAwMENFIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNsSm9lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzNsSm91ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HM2xKb09mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HM2xKZ2VmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HM2xKZ3VmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlszOTcsIC03NjIsIC0yNjIsIDU0MzVdJFszOTcsIC01MDI5LCAtMjYyLCAxMTY4XSIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HM2xKby1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzAzIiBzb3VyY2U9Il9HMi1zdXVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HMi1zbXVmWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czbEpwdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czbEpxT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNsSnFlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HM2xKcC1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HM2xKcE9mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HM2xKcGVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlsyNSwgLTQ5OSwgLTI1LCAzMDU2XSRbMjUsIC0zMDczLCAtMjUsIDQ4Ml0iLz4NCi0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0czbEpxdWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzNsSnEtZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0czbEpyT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBOTIzQjAwMDIiIHNvdXJjZT0iX0cyLXN1dWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0czYll6ZWZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNsSnItZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNsSnNlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM2xKc3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0czbEpzT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0czbEpyZWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzNsSnJ1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTQxNCwgLTQ5OSwgNTY4MSwgNjc2NF0kWy01MTA1LCAtNjA4NywgOTkwLCAxMTc2XSIvPg0KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzNsSnMtZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HM2xKdE9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzNsSnRlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E5MjgyMDM5MiIgc291cmNlPSJfRzNSbmgtZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzNiWXplZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM2xKdU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM2xKdXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czbEp1LWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzNsSnVlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzNsSnR1ZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HM2xKdC1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMTQwNSwgLTUxNiwgMTA0ODEsIDM3NTBdJFstODkxNSwgLTMyMDAsIDI5NzEsIDEwNjZdIi8+DQotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HM2xKdk9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0czbEp2ZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HM2xKdnVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI4Q0QzMjMwMTlBIiBzb3VyY2U9Il9HM2JZemVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HM1JucWVmWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czbEp3ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czbEp3LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNsSnhPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HM2xKd3VmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HM2xKdi1mWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0czbEp3T2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzI5NzEsIC00MDYsIC04OTY2LCAxMjE5XSRbODE3MCwgLTExMTcsIC0zNzY3LCA1MDhdIi8+DQotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HM2xKeGVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0czbEp4dWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HM2xKeC1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDJCMUVDMUIwMzQ5IiBzb3VyY2U9Il9HMi1zN2VmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HM2JZemVmWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czbEp5dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czbEp6T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNsSnplZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HM2xKeS1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HM2xKeU9mWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0czbEp5ZWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy03NTMsIC00OTksIDMyMDgsIDIwOTFdJFstMjE1OSwgLTE0MTMsIDE4MDMsIDExNzZdIi8+DQotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HM2xKenVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0czbEp6LWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICA8L2NvbnRlbnRzPg0KLSAgICAgICAgICAgIDxjb250ZW50cyB4bWk6dHlwZT0ibm90YXRpb246RGlhZ3JhbSIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGNUYxRTgwMjgzIiB0eXBlPSJDbGFzcyIgbmFtZT0iVGVhbUJyZWFrZG93blN0cnVjdHVyZSI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzN1VGNPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTm90ZSI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM3VUYy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJEaWFncmFtTmFtZSI+DQotICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzN1VGRPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRGVzY3JpcHRpb24iPg0KLSAgICAgICAgICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246U2hhcGVTdHlsZSIgeG1pOmlkPSJfRzN1VGNlZlhFZHVxSG9PSmJVUlpSdyIgZGVzY3JpcHRpb249IntSb2xlRGVzY3JpcHRvci5tb2RpZmllcyA9IFJvbGUucGVyZm9ybXNBc093bmVyLm91dHB1dCB1bmlvbiBSb2xlLnBlcmZvcm1zQWRkaXRpb25hbGx5Lm91dHB1dCB1bmlvbiBSb2xlLmFzc2lzdHNJbi5vdXRwdXR9IiBsaW5lQ29sb3I9IjAiLz4NCi0gICAgICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HM3VUY3VmWEVkdXFIb09KYlVSWlJ3IiB4PSIxMDcyNiIgeT0iMTczNzAiIHdpZHRoPSI2MTQ3IiBoZWlnaHQ9IjE4NTIiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzN1VGRlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDBFNiI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM3VUZU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzN1VGVlZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzN1VGV1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzN1VGUtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzN1VGZPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM3VUZmVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HM3VUZnVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM3VUZi1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HM3VUZ09mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM3VUZ2VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HM3VUZ3VmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM3VUZy1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzN1VGhPZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HM3VUZHVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iTm9uZSIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HM3VUZC1mWEVkdXFIb09KYlVSWlJ3IiB4PSIxNDk3NyIgeT0iODg5MCIgd2lkdGg9IjI4NjEiIGhlaWdodD0iMTczNSIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM3VUaGVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMEVGIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czdVRpT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HM3VUaWVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iNzU4NiIgaGVpZ2h0PSIyNjQxIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM3VUaXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM3VUaS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM3VUak9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czdVRqZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzN1VGp1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzN1VGotZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzN1VGtPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzN1VGtlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzN1VGt1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzN1VGstZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0czdVRsT2ZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzN1VGh1ZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzN1VGgtZlhFZHVxSG9PSmJVUlpSdyIgeD0iNzk5MiIgeT0iNDA2NCIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMzRFaWVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDQ1Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czNEVqT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HMzRFamVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMzRFanVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMzRFai1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMzRFa09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czNEVrZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzM0RWt1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzM0RWstZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzM0RWxPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzM0RWxlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzM0RWx1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzM0RWwtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0czNEVtT2ZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzM0RWl1ZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9Ik5vbmUiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzM0RWktZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTU3MDUiIHk9IjEyOTU0Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czNEVvdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwNjMiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzM0RXBlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0czNEVwdWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czNEVwLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czNEVxT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czNEVxZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzM0RXF1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzM0RXEtZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzM0RXJPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzM0RXJlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzM0RXJ1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzM0RXItZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzM0RXNPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0czNEVzZWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzM0RW8tZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9Ik5vbmUiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzM0RXBPZlhFZHVxSG9PSmJVUlpSdyIgeD0iNjY5NyIgeT0iODU1OSIgd2lkdGg9IjI3MzIiIGhlaWdodD0iMjE4NCIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEIxZWVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDhCIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0QjFmT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HNEIxZmVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEIxZnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEIxZi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEIxZ09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0QjFnZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0QjFndWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0QjFnLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0QjFoT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0QjFoZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0QjFodWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0QjFoLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNEIxaU9mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c0QjFldWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJOb25lIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c0QjFlLWZYRWR1cUhvT0piVVJaUnciIHg9IjU3MjYiIHk9IjEzMjE2IiB3aWR0aD0iMzE0NiIgaGVpZ2h0PSIyNDI5Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0QjJBT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUYwNkI2NTAwRTYiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRCMkEtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c0QjJCT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0QjJCZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0QjJCdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0QjJCLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRCMkNPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzRCMkNlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRCMkN1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzRCMkMtZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRLX1lPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzRLX1llZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRLX1l1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0S19ZLWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzRCMkFlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzRCMkF1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTEwMCIgeT0iMTU2MjkiIHdpZHRoPSIzNzkzIiBoZWlnaHQ9IjEwNTgiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRLX1pPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI5NiI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEtfWi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzRLX2FPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRLX2FlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRLX2F1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRLX2EtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEtfYk9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNEtfYmVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEtfYnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNEtfYi1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEtfY09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNEtfY2VmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEtfY3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzRLX2MtZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HNEtfWmVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNEtfWnVmWEVkdXFIb09KYlVSWlJ3IiB4PSI0MTMxIiB5PSIxNzMzMSIgd2lkdGg9IjQyMzMiIGhlaWdodD0iMTMwMyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTERpYWdyYW1TdHlsZSIgeG1pOmlkPSJfR2xHU1ktZlhFZHVxSG9PSmJVUlpSdyIgZGVzY3JpcHRpb249IlRoaXMgZGlhZ3JhbSBzaG93cyB0aGUgdmlldyBvbiBhIHByb2Nlc3MgZnJvbSBhIFRlYW0gYW5kIFJvbGUgcGVyc3BlY3RpdmUgY2FsbGVkIFRCUyAoVGVhbSBCcmVha2Rvd24gU3RydWN0dXJlKS4iLz4NCi0gICAgICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HM3VUbGVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMkI1IiBzb3VyY2U9Il9HM3VUaGVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HM3VUaGVmWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czdVRtT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czdVRtdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzN1VG0tZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HM3VUbWVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM3VUbk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMkI4Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzN1VG51ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0czdVRuZWZYRWR1cUhvT0piVVJaUnciIHg9IjEzNzgiIHk9IjM4MCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzN1VG4tZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMkI4Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzN1VG9lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HM3VUb09mWEVkdXFIb09KYlVSWlJ3IiB4PSIxNDk1IiB5PSIzOTkiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czdVRvdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDJCNiI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czdVRwT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0czdVRvLWZYRWR1cUhvT0piVVJaUnciIHg9Ii0xMDUzIiB5PSIxOTIiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czdVRwZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyQjYiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM3VUcC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzN1VHB1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTI3NSIgeT0iLTI3NCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzN1VHFPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDJCOCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czdVRxdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HM3VUcS1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0czdVRxZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czdVRyT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDJCNiI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czdVRydWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HM3VUci1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0czdVRyZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czdVRzT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMkI4Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzN1VHN1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0czdVRzLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzN1VHNlZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzN1VHRPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDJCNiI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czdVR0dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0czdVR0LWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzN1VHRlZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzN1VGx1ZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzN1VGwtZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTI3MjUsIC0yNiwgLTI3MjUsIC0yNl0kWy01Njg4LCAtMjYsIC01Njg4LCAtMjZdJFstNTY4OCwgLTI5MzcsIC01Njg4LCAtMjkzN10kWy0xNTg3LCAtMjkzNywgLTE1ODcsIC0yOTM3XSRbLTE1ODcsIC0xMDU4LCAtMTU4NywgLTEwNThdIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0czdVR1T2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyOEYiIHNvdXJjZT0iX0czdVRkZWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0czdVRoZWZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzN1VHUtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzN1VHZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM3VUdnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0czdVR2T2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0czdVR1ZWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzN1VHV1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTkzMSwgLTg3MiwgMzY5MSwgMzQ5Nl0kWy0zMjM0LCAtMzA0OCwgMTM4OCwgMTMyMF0iLz4NCi0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0czdVR2LWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzN1VHdPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0czdVR3ZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjFFOEYwQzAyODEiIHNvdXJjZT0iX0czdVRoZWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0czdVRoZWZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzN1VHhPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzN1VHh1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM3VUeC1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0czdVR4ZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czdVR5T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjFFOEYwRTAyNjYiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM3VUeXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzN1VHllZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTQ0NSIgeT0iLTQyNyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzM0RWNPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRThGMEUwMjY2Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzM0RWN1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HMzRFY2VmWEVkdXFIb09KYlVSWlJ3IiB4PSIxMTkwIiB5PSIyODciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czNEVjLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMUU4RjBFMDIzNCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czNEVkZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0czNEVkT2ZYRWR1cUhvT0piVVJaUnciIHg9Ii0xMDU5IiB5PSItMjA3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMzRFZHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRThGMEUwMjM0Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzM0RWVPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0czNEVkLWZYRWR1cUhvT0piVVJaUnciIHg9Ii03NSIgeT0iMjIxIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMzRFZWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRThGMEUwMjY2Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzM0RWUtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0czNEVmT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzM0RWV1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzM0RWZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRThGMEUwMjM0Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzM0RWYtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0czNEVnT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzM0RWZ1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzM0RWdlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjFFOEYwRTAyNjYiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMzRFZy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzM0RWhPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HMzRFZ3VmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMzRFaGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRThGMEUwMjM0Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzM0RWgtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzM0RWlPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HMzRFaHVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HM3VUd3VmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HM3VUdy1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlsyNjk5LCAtMjYsIDI2OTksIC0yNl0kWzU4NzQsIC0yNiwgNTg3NCwgLTI2XSRbNTg3NCwgLTI5NjMsIDU4NzQsIC0yOTYzXSRbMTQwMiwgLTI5NjMsIDE0MDIsIC0yOTYzXSRbMTQwMiwgLTEwNTgsIDE0MDIsIC0xMDU4XSIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HMzRFbWVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwM0Q2IiBzb3VyY2U9Il9HMzRFaWVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HM3VUZGVmWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czNEVuT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czNEVudWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzM0RW4tZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HMzRFbmVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HMzRFbXVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HMzRFbS1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMzEzLCAtODcyLCAxMTA5LCAzMTkxXSRbLTExMzQsIC0zMjAwLCAyODcsIDg2M10iLz4NCi0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0czNEVvT2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzM0RW9lZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0czNEVzdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwNTIiIHNvdXJjZT0iX0czNEVvdWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0czNEVvdWZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzM0RXRlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzM0RXQtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMzRFdU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0czNEV0dWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czNEV1ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwNTUiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMzRFdS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzM0RXV1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iNDM2IiB5PSIyMzgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czNEV2T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDU1Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzM0RXZ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HMzRFdmVmWEVkdXFIb09KYlVSWlJ3IiB4PSItNzE0IiB5PSItMzMzIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMzRFdi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwNTMiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMzRFd2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HMzRFd09mWEVkdXFIb09KYlVSWlJ3IiB4PSItMzYwIiB5PSIyNDIiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czNEV3dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwNTMiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMzRFeE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzM0RXctZlhFZHVxSG9PSmJVUlpSdyIgeD0iNzIiIHk9Ii0yODgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czNEV4ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwNTUiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMzRFeC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzM0RXlPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HMzRFeHVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMzRFeWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwNTMiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMzRFeS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzM0RXpPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HMzRFeXVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMzRFemVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDA1NSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czNEV6LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMzRFME9mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0czNEV6dWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czNEUwZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwNTMiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMzRFMC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMzRFMU9mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0czNEUwdWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0czNEVzLWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0czNEV0T2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0xMTc2LCA0MiwgLTExNzYsIDQyXSRbLTI1NzMsIDQyLCAtMjU3MywgNDJdJFstMjU3MywgLTE3NjEsIC0yNTczLCAtMTc2MV0kWy01MCwgLTE3NjEsIC01MCwgLTE3NjFdJFstNTAsIC0xMDkyLCAtNTAsIC0xMDkyXSIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HNEIxY09mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDNFIiBzb3VyY2U9Il9HMzRFb3VmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HM3VUaGVmWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0QjFjLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0QjFkZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRCMWR1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNEIxZE9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HNEIxY2VmWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c0QjFjdWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzk5OSwgLTExMDAsIC0yOTEyLCAzMTY2XSRbMjY4MywgLTI5NDYsIC0xMjI3LCAxMzIwXSIvPg0KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzRCMWQtZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HNEIxZU9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzRCMWllZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDE3RSIgc291cmNlPSJfRzRCMWVlZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzM0RWllZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEIxak9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEIxanVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0QjFqLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNEIxamVmWEVkdXFIb09KYlVSWlJ3IiB4PSI5NyIgeT0iLTMyMyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRCMWtPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDE4OCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0QjFrdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNEIxa2VmWEVkdXFIb09KYlVSWlJ3IiB4PSItNjcyIiB5PSItMTk2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEIxay1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDE4OCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0QjFsZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzRCMWxPZlhFZHVxSG9PSmJVUlpSdyIgeD0iNDc3IiB5PSIyOTMiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0QjFsdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDE3RiI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0QjFtT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0QjFsLWZYRWR1cUhvT0piVVJaUnciIHg9IjgyNCIgeT0iLTE4NyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRCMW1lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDE3RiI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0QjFtLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNEIxbXVmWEVkdXFIb09KYlVSWlJ3IiB4PSItNDQ2IiB5PSIzMzgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0QjFuT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxODgiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEIxbnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzRCMW4tZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNEIxbmVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEIxb09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxN0YiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEIxb3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzRCMW8tZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNEIxb2VmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEIxcE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDE4OCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0QjFwdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNEIxcC1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0QjFwZWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0QjFxT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxN0YiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEIxcXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNEIxcS1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0QjFxZWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c0QjFpdWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c0QjFpLWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzEzOTcsIC05NTYsIC04OTY2LCAtMzQ3XSRbODIzOCwgLTk1NiwgLTIxMjUsIC0zNDddIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c0QjFyT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxOUMiIHNvdXJjZT0iX0c0QjFlZWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0czNEVpZWZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRCMXItZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRCMXNlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEIxc3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzRCMXNPZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTUzNyIgeT0iLTE5NSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRCMXMtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDE5RiI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0QjF0ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNEIxdE9mWEVkdXFIb09KYlVSWlJ3IiB4PSItODY4IiB5PSItMzc2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEIxdHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxOUYiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEIxdU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0QjF0LWZYRWR1cUhvT0piVVJaUnciIHg9IjQ1MCIgeT0iLTM4MSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRCMXVlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTlEIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRCMXUtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzRCMXV1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTIzOCIgeT0iMTU5Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEIxdk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTlEIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRCMXZ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0QjF2ZWZYRWR1cUhvT0piVVJaUnciIHg9IjEzMzciIHk9Ii05NzMiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0QjF2LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxOUYiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEIxd2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzRCMXd1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNEIxd09mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEIxdy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxOUQiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEIxeGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzRCMXh1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNEIxeE9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEIxeC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDE5RiI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0QjF5ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNEIxeXVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0QjF5T2ZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0QjF5LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxOUQiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEIxemVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNEIxenVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0QjF6T2ZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c0QjFyZWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c0QjFydWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzkzLCAxMjEwLCAtMTAyNzAsIDE4MjBdJFs5MywgMjA1NywgLTEwMjcwLCAyNjY3XSRbOTI3OSwgMjA1NywgLTEwODMsIDI2NjddJFs5Mjc5LCAyNTQsIC0xMDgzLCA4NjNdIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c0QjF6LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5vdGVBdHRhY2htZW50IiBzb3VyY2U9Il9HM3VUY09mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HNEIxck9mWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246Q29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c0QjEwT2ZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iMCIvPg0KLSAgICAgICAgICAgICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c0QjEwZWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy04NzIsIC0xMTU5LCAxMDI0LCAxMzU0XSRbLTE4OTYsIC0yNTE0LCAwLCAwXSIvPg0KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzRCMTB1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HNEIxMC1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzRCMTFPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDE2MCIgc291cmNlPSJfRzRCMWVlZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzN1VGRlZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEIxMS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEIxMmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0QjEydWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzRCMTJPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzRCMTFlZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HNEIxMXVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlsxMDMyLCAtMTIxOSwgLTc5MDcsIDM0NTRdJFs0MDIxLCAtNDY1NiwgLTQ5MTksIDE2XSRbNzUwMSwgLTQ2NzMsIC0xNDM5LCAwXSIvPg0KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzRCMTItZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HNEIxM09mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzRCMTNlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDAzRiIgc291cmNlPSJfRzRCMWVlZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzM0RW91ZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEIxNE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEIxNHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0QjE0LWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzRCMTRlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRCMTVPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDA0MiI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0QjE1dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNEIxNWVmWEVkdXFIb09KYlVSWlJ3IiB4PSIyNjYiIHk9IjI3MSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRCMTUtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwNDIiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEIxNmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0QjE2T2ZYRWR1cUhvT0piVVJaUnciIHg9IjI4MyIgeT0iLTExMDkiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0QjE2dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDA0MCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0QjE3T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0QjE2LWZYRWR1cUhvT0piVVJaUnciIHg9Ii0yOTAiIHk9IjI3MSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRCMTdlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwNDAiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEIxNy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzRCMTd1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTE2IiB5PSItMzQ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEIxOE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDQyIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRCMTh1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0QjE4LWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzRCMThlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRCMTlPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDQwIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRCMTl1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0QjE5LWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzRCMTllZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRCMS1PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwNDIiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEIxLXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzRCMS0tZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNEIxLWVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEIxX09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDQwIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRCMV91ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzRCMV8tZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNEIxX2VmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HNEIxM3VmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HNEIxMy1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9Ils5MywgLTEyMTAsIC0zMTMsIDM1NjRdJFs5MywgLTM2ODMsIC0zMTMsIDEwOTJdIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c0S19kT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxNkEiIHNvdXJjZT0iX0c0S19aT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c0QjFlZWZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRLX2QtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRLX2VlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEtfZXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c0S19lT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0S19lLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxNkQiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEtfZmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzRLX2ZPZlhFZHVxSG9PSmJVUlpSdyIgeD0iMjEwIiB5PSItMzc0Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEtfZnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxNkQiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEtfZ09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0S19mLWZYRWR1cUhvT0piVVJaUnciIHg9Ii04MCIgeT0iLTM0NSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRLX2dlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTZCIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRLX2ctZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzRLX2d1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTE1MyIgeT0iLTM2MSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRLX2hPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxNkIiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEtfaHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzRLX2hlZlhFZHVxSG9PSmJVUlpSdyIgeD0iODQiIHk9Ii0zMzkiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0S19oLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxNkQiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEtfaWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzRLX2l1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNEtfaU9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEtfaS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxNkIiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEtfamVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzRLX2p1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNEtfak9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEtfai1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDE2RCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0S19rZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNEtfa3VmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0S19rT2ZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0S19rLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxNkIiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEtfbGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNEtfbHVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0S19sT2ZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c0S19kZWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c0S19kdWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzIyMCwgLTY2MCwgLTk5OSwgMjg5NV0kWzc4NywgLTIzNDUsIC00MzEsIDEyMTBdIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c0S19sLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUYwNkJCQzAzMEQiIHNvdXJjZT0iX0c0QjJBT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c0S19aT2ZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRLX211ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRLX25PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEtfbmVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c0S19tLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0S19udWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUYwNkJCRTAwRTkiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEtfb09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzRLX24tZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTEyNCIgeT0iLTI3OSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRLX29lZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFGMDZCQkUwMEU5Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRLX28tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNEtfb3VmWEVkdXFIb09KYlVSWlJ3IiB4PSItNjUiIHk9IjM0NyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRLX3BPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFGMDZCQkUwMERGIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRLX3B1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzRLX3BlZlhFZHVxSG9PSmJVUlpSdyIgeD0iMjM2IiB5PSItMjg3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEtfcC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFGMDZCQkUwMERGIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRLX3FlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0S19xT2ZYRWR1cUhvT0piVVJaUnciIHg9Ii0xMDkzIiB5PSIzODEiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0S19xdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUYwNkJCRTAwRTkiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEtfck9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzRLX3JlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNEtfcS1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEtfcnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUYwNkJCRTAwREYiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEtfc09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzRLX3NlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNEtfci1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEtfc3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRjA2QkJFMDBFOSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0S190T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNEtfdGVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0S19zLWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0S190dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUYwNkJCRTAwREYiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEtfdU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNEtfdWVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0S190LWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c0S19tT2ZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c0S19tZWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy01MDgsIDUyNCwgLTM3NTksIC0xMzAzXSRbLTUwOCwgMTkxMywgLTM3NTksIDg0XSRbMTEzNCwgMTkxMywgLTIxMTYsIDg0XSIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HNEtfdXVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFGOTRBQjkwMDE1IiBzb3VyY2U9Il9HNEIyQU9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HNEIxZWVmWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0S192ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0S192LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRLX3dPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNEtfdnVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HNEtfdS1mWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c0S192T2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzEzNDYsIC01MzMsIC0zMTI0LCAxMTkzXSRbMzA2NCwgLTExOTMsIC0xNDA1LCA1MzNdIi8+DQotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HNEtfd2VmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c0S193dWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICA8L2NvbnRlbnRzPg0KLSAgICAgICAgICAgIDxjb250ZW50cyB4bWk6dHlwZT0ibm90YXRpb246RGlhZ3JhbSIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGNUMzMEYwMDI2IiB0eXBlPSJDbGFzcyIgbmFtZT0iV29ya1Byb2R1Y3RCcmVha2Rvd25TdHJ1Y3R1cmUiPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0VXdZT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwRTYiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRVd1ktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c0VXdaT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0VXdaZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0VXdadWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0VXdaLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRVd2FPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzRVd2FlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRVd2F1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzRVd2EtZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRVd2JPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzRVd2JlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRVd2J1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0VXdiLWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzRVd1llZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9Ik5vbmUiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzRVd1l1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iNjM2NiIgeT0iNTkyMyIgaGVpZ2h0PSI5NTQiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRVd2NPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDJCQyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNFV3Yy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzRVd2RPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRVd2RlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRVd2R1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRVd2QtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNFV3ZU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNFV3ZWVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNFV3ZXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNFV3ZS1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNFV3Zk9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNFV3ZmVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNFV3ZnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzRVd2YtZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HNFV3Y2VmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNFV3Y3VmWEVkdXFIb09KYlVSWlJ3IiB4PSI2MTg5IiB5PSIxMzY5OCIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNFV3Z09mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDQ1Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0VXdnLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HNFV3aE9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNFV3aGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNFV3aHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNFV3aC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0VXdpT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzRVd2llZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRVd2l1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzRVd2ktZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRVd2pPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzRVd2plZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRVd2p1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0VXdqLWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzRVd2dlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9Ik5vbmUiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzRVd2d1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iNTE0MyIgeT0iMTAzMjkiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRkNmVlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDAwOSI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNGQ2Zk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzRkNmZlZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRkNmZ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRkNmYtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRkNmdPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNGQ2Z2VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNGQ2Z3VmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNGQ2Zy1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNGQ2aE9mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNGQ2aGVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNGQ2aHVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNGQ2aC1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzRkNmlPZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HNGQ2ZXVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iTm9uZSIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNGQ2ZS1mWEVkdXFIb09KYlVSWlJ3IiB4PSIxNTA4NyIgeT0iMTMxODIiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRkNnRlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDBFRiI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNGQ2dU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzRkNnVlZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjczNjYiIGhlaWdodD0iMjQzOCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRkNnV1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRkNnUtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRkNnZPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNGQ2dmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0ZDZ2dWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0ZDZ2LWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0ZDZ3T2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0ZDZ3ZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0ZDZ3dWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0ZDZ3LWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNGQ2eE9mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c0ZDZ0dWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c0ZDZ0LWZYRWR1cUhvT0piVVJaUnciIHg9IjM3MzMiIHk9IjIzODciLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfbkFJRVFNVkhFZHkybXVRMlBRdkhfQSIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDAzMSI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9uQUlFUThWSEVkeTJtdVEyUFF2SF9BIiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfbkFJRVJNVkhFZHkybXVRMlBRdkhfQSIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfbkFJRVJjVkhFZHkybXVRMlBRdkhfQSIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfbkFJRVJzVkhFZHkybXVRMlBRdkhfQSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfbkFJRVI4VkhFZHkybXVRMlBRdkhfQSIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9uQUlFU01WSEVkeTJtdVEyUFF2SF9BIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9uQUlFU2NWSEVkeTJtdVEyUFF2SF9BIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9uQUlFU3NWSEVkeTJtdVEyUFF2SF9BIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9uQUlFUzhWSEVkeTJtdVEyUFF2SF9BIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9uQUlFVE1WSEVkeTJtdVEyUFF2SF9BIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9uQUlFVGNWSEVkeTJtdVEyUFF2SF9BIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9uQUlFVHNWSEVkeTJtdVEyUFF2SF9BIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfbkFJRVQ4VkhFZHkybXVRMlBRdkhfQSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9uQUlFUWNWSEVkeTJtdVEyUFF2SF9BIiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9uQUlFUXNWSEVkeTJtdVEyUFF2SF9BIiB4PSIxMjQzIiB5PSIxMzM2MCIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTERpYWdyYW1TdHlsZSIgeG1pOmlkPSJfR2xRRFllZlhFZHVxSG9PSmJVUlpSdyIgZGVzY3JpcHRpb249IlRoaXMgZGlhZ3JhbSBzaG93cyB0aGUgdmlldyBvbiBhIHByb2Nlc3MgZnJvbSBhIFdvcmsgUHJvZHVjdCBwZXJzcGVjdGl2ZSBjYWxsZWQgV1BCUyAoV29yayBQcm9kdWN0IEJyZWFrZG93biBTdHJ1Y3R1cmUpLiIvPg0KLSAgICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c0VXdrT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwMEMiIHNvdXJjZT0iX0c0VXdnT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c0VXdnT2ZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRVd2stZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRVd2xlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNFV3bHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzRVd2xPZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTEwODIiIHk9IjI0MiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRVd2wtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDAwRiI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0VXdtZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNFV3bU9mWEVkdXFIb09KYlVSWlJ3IiB4PSIxMTk4IiB5PSItMjk0Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNFV3bXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDAwRiI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0VXduT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzRVd20tZlhFZHVxSG9PSmJVUlpSdyIgeD0iMzEiIHk9IjI4MSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRVd25lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDBEIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRVd24tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzRVd251ZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTU2MSIgeT0iLTk5OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRVd29PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDAwRCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0VXdvdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNFV3b2VmWEVkdXFIb09KYlVSWlJ3IiB4PSI1OTciIHk9Ii03NjEiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0VXdvLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwMEYiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNFV3cGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzRVd3B1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNFV3cE9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNFV3cC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwMEQiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNFV3cWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzRVd3F1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNFV3cU9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNFV3cS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDAwRiI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0VXdyZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNFV3cnVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0VXdyT2ZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0VXdyLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwMEQiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNFV3c2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNFV3c3VmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0VXdzT2ZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c0VXdrZWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c0VXdrdWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0xODIwLCAtODQ2LCAtMTgyMCwgLTg0Nl0kWy0xODIwLCAtMTk3MiwgLTE4MjAsIC0xOTcyXSRbLTYxODksIC0xOTcyLCAtNjE4OSwgLTE5NzJdJFstNjE4OSwgMCwgLTYxODksIDBdJFstMjE5MiwgMCwgLTIxOTIsIDBdIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c0VXdzLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwMjAiIHNvdXJjZT0iX0c0VXdnT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c0VXdnT2ZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRVd3R1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRVd3VPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNFV3dWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzRVd3QtZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTI5OCIgeT0iMzAyIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNFV3dXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDIzIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRVd3ZPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0VXd1LWZYRWR1cUhvT0piVVJaUnciIHg9Ii0yOTEiIHk9Ii0zMDYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0VXd2ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDIzIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRVd3YtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNFV3dnVmWEVkdXFIb09KYlVSWlJ3IiB4PSItNTA1IiB5PSIyOTUiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0VXd3T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDAyMSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0VXd3dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0VXd3ZWZYRWR1cUhvT0piVVJaUnciIHg9Ii0xNTI4IiB5PSIyOTEiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0VXd3LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwMjEiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNFV3eGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzRVd3hPZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTc2MCIgeT0iLTI1MiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRVd3h1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDAyMyI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0VXd5T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNFV3eWVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0VXd4LWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0VXd5dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDAyMSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0VXd6T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNFV3emVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0VXd5LWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0VXd6dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDIzIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRVdzBPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0VXcwZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzRVd3otZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRVdzB1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDAyMSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0VXcxT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0VXcxZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzRVdzAtZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzRVd3RPZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzRVd3RlZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMjIyMiwgLTIxMSwgMjIyMiwgLTIxMV0kWzU5ODAsIC0yMTEsIDU5ODAsIC0yMTFdJFs1OTgwLCAtMjA4NywgNTk4MCwgLTIwODddJFs5NTIsIC0yMDg3LCA5NTIsIC0yMDg3XSRbOTUyLCAtNjg4LCA5NTIsIC02ODhdIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c0VXcxdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzRDYiIHNvdXJjZT0iX0c0VXdnT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c0VXdZT2ZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRkNlVPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRkNlV1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNGQ2VS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c0ZDZVZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c0VXcxLWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c0VXcyT2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy02MDksIC02ODgsIC03NjgsIDM5NDJdJFstNjA5LCAtNDE1NCwgLTc2OCwgNDc2XSIvPg0KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzRkNlZPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HNGQ2VmVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzRkNlZ1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDNENyIgc291cmNlPSJfRzRVd2NPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzRVd2dPZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNGQ2V2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNGQ2Vy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0ZDZYT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzRkNld1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRkNlhlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDNEQSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0ZDZYLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNGQ2WHVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxNjkiIHk9Ii00ODIiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0ZDZZT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDNEQSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0ZDZZdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzRkNlllZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTE1MyIgeT0iLTM0NyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRkNlktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwM0Q4Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRkNlplZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzRkNlpPZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTI0IiB5PSIxNjYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0ZDZadWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwM0Q4Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRkNmFPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0ZDZaLWZYRWR1cUhvT0piVVJaUnciIHg9IjE2MSIgeT0iLTM0NyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRkNmFlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDNEQSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0ZDZhLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNGQ2Yk9mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0ZDZhdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0ZDZiZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDNEOCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0ZDZiLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNGQ2Y09mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0ZDZidWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0ZDZjZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwM0RBIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRkNmMtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0ZDZkT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzRkNmN1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRkNmRlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDNEOCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0ZDZkLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0ZDZlT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzRkNmR1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzRkNlYtZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HNGQ2V09mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlswLCAtNTc1LCAwLCAzOTk2XSRbMCwgLTM3MjUsIDAsIDg0Nl0iLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzRkNmllZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDIzRCIgc291cmNlPSJfRzRVd2dPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzRkNmVlZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNGQ2ak9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNGQ2anVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0ZDZqLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNGQ2amVmWEVkdXFIb09KYlVSWlJ3IiB4PSItNzQ4IiB5PSItNDQ2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNGQ2a09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjQ4Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRkNmt1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0ZDZrZWZYRWR1cUhvT0piVVJaUnciIHg9Ii00MyIgeT0iLTI3MyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRkNmstZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyNDgiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNGQ2bGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0ZDZsT2ZYRWR1cUhvT0piVVJaUnciIHg9Ii01OTYiIHk9IjYxOCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRkNmx1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjQ2Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRkNm1PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzRkNmwtZlhFZHVxSG9PSmJVUlpSdyIgeD0iNTU1IiB5PSIyOTciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0ZDZtZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyNDYiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNGQ2bS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzRkNm11ZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTQyNyIgeT0iLTI5NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRkNm5PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDI0OCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0ZDZudWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNGQ2bi1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0ZDZuZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0ZDZvT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDI0NiI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0ZDZvdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNGQ2by1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0ZDZvZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0ZDZwT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjQ4Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRkNnB1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0ZDZwLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzRkNnBlZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRkNnFPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDI0NiI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0ZDZxdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0ZDZxLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzRkNnFlZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzRkNml1ZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HNGQ2aS1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlsxNzk0LCA4NDYsIC03MjQ3LCAtMTY0Ml0kWzUyODMsIDI0ODAsIC0zNzU5LCAtOF0kWzc2NjIsIDI0ODAsIC0xMzgwLCAtOF0iLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzRkNnJPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDMwMyIgc291cmNlPSJfRzRkNmVlZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzRVd1lPZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNGQ2ci1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNGQ2c2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0ZDZzdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzRkNnNPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzRkNnJlZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzRkNnJ1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTc5LCAtMzE3LCA4OTk2LCA2NDMwXSRbLTc5LCAtNjc3MywgODk5NiwgLTI2XSRbLTc5MzgsIC02NzczLCAxMTM3LCAtMjZdIi8+DQotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HNGQ2cy1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c0ZDZ0T2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HNGQ2eGVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMkI1IiBzb3VyY2U9Il9HNGQ2dGVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HNGQ2dGVmWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0ZDZ5T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0ZDZ5dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRkNnktZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNGQ2eWVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNGQ2ek9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMkI4Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRkNnp1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0ZDZ6ZWZYRWR1cUhvT0piVVJaUnciIHg9Ii0yODEiIHk9Ijc2MSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRkNnotZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMkI4Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRkNjBlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNGQ2ME9mWEVkdXFIb09KYlVSWlJ3IiB4PSIxMjUwIiB5PSI1MDQiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0ZDYwdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDJCNiI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0ZDYxT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0ZDYwLWZYRWR1cUhvT0piVVJaUnciIHg9Ii00NTgiIHk9IjI4NyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRkNjFlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDJCNiI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0ZDYxLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNGQ2MXVmWEVkdXFIb09KYlVSWlJ3IiB4PSIyODQiIHk9Ii0zMzEiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0ZDYyT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyQjgiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNGQ2MnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzRkNjItZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNGQ2MmVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNGQ2M09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyQjYiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNGQ2M3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzRkNjMtZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNGQ2M2VmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNGQ2NE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDJCOCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0ZDY0dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNGQ2NC1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0ZDY0ZWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0ZDY1T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyQjYiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNGQ2NXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNGQ2NS1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0ZDY1ZWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c0ZDZ4dWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c0ZDZ4LWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0zNjgzLCAtNDc0LCAtMzY4MywgLTQ3NF0kWy01MTEzLCAtNDc0LCAtNTExMywgLTQ3NF0kWy01MTEzLCAtMjE0MiwgLTUxMTMsIC0yMTQyXSRbLTE3NjEsIC0yMTQyLCAtMTc2MSwgLTIxNDJdJFstMTc2MSwgLTEyMTksIC0xNzYxLCAtMTIxOV0iLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzRuclVPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDI4RiIgc291cmNlPSJfRzRVd1lPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzRkNnRlZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNG5yVS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNG5yVmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0bnJWdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzRuclZPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzRuclVlZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzRuclV1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMCwgLTQ5OSwgLTUwLCAzMDA1XSRbMCwgLTIyODYsIC01MCwgMTIxOV0iLz4NCi0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c0bnJWLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzRucldPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c0bnJXZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjFFOEYwQzAyODEiIHNvdXJjZT0iX0c0ZDZ0ZWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c0ZDZ0ZWZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRuclhPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRuclh1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNG5yWC1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c0bnJYZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0bnJZT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjFFOEYwRTAyNjYiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNG5yWXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzRuclllZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTk5IiB5PSItNzM1Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNG5yWS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjFFOEYwRTAyNjYiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNG5yWmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0bnJaT2ZYRWR1cUhvT0piVVJaUnciIHg9IjE5MTkiIHk9IjczIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNG5yWnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjFFOEYwRTAyMzQiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNG5yYU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNG5yWi1mWEVkdXFIb09KYlVSWlJ3IiB4PSItNTM1IiB5PSItMjM0Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNG5yYWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRThGMEUwMjM0Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRucmEtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0bnJhdWZYRWR1cUhvT0piVVJaUnciIHg9IjM0MCIgeT0iMjg5Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNG5yYk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRThGMEUwMjY2Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRucmJ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0bnJiLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzRucmJlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRucmNPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRThGMEUwMjM0Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRucmN1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0bnJjLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzRucmNlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRucmRPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjFFOEYwRTAyNjYiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNG5yZHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzRucmQtZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNG5yZGVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNG5yZU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRThGMEUwMjM0Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRucmV1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzRucmUtZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNG5yZWVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HNG5yV3VmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HNG5yVy1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlszNjgzLCAtMzA0LCAzNjgzLCAtMzA0XSRbNDczMiwgLTMwNCwgNDczMiwgLTMwNF0kWzQ3MzIsIC0yMTA4LCA0NzMyLCAtMjEwOF0kWzEyNzAsIC0yMTA4LCAxMjcwLCAtMjEwOF0kWzEyNzAsIC0xMjE5LCAxMjcwLCAtMTIxOV0iLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfbkF0NklNVkhFZHkybXVRMlBRdkhfQSIgZWxlbWVudD0iX1FGMmc0TVZIRWR5Mm11UTJQUXZIX0EiIHNvdXJjZT0iX25BSUVRTVZIRWR5Mm11UTJQUXZIX0EiIHRhcmdldD0iX0c0VXdnT2ZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfbkF0Nkk4VkhFZHkybXVRMlBRdkhfQSIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfbkF0NkpjVkhFZHkybXVRMlBRdkhfQSIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9uQXQ2SnNWSEVkeTJtdVEyUFF2SF9BIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfbkF0NkpNVkhFZHkybXVRMlBRdkhfQSIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfbkF0Nko4VkhFZHkybXVRMlBRdkhfQSIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iX1FHU2x3c1ZIRWR5Mm11UTJQUXZIX0EiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9uQXQ2S2NWSEVkeTJtdVEyUFF2SF9BIiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfbkF0NktNVkhFZHkybXVRMlBRdkhfQSIgeD0iLTM0NCIgeT0iMjEwIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9uQXQ2S3NWSEVkeTJtdVEyUFF2SF9BIiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iX1FHU2x3c1ZIRWR5Mm11UTJQUXZIX0EiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9uQXQ2TE1WSEVkeTJtdVEyUFF2SF9BIiB0eXBlPSJUb1JvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX25BdDZLOFZIRWR5Mm11UTJQUXZIX0EiIHk9Ii0zOTciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX25BdDZMY1ZIRWR5Mm11UTJQUXZIX0EiIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iX1FGMmc0Y1ZIRWR5Mm11UTJQUXZIX0EiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9uQXQ2TDhWSEVkeTJtdVEyUFF2SF9BIiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9uQXQ2THNWSEVkeTJtdVEyUFF2SF9BIiB4PSI0NyIgeT0iMjQ4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9uQXQ2TU1WSEVkeTJtdVEyUFF2SF9BIiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfUUYyZzRjVkhFZHkybXVRMlBRdkhfQSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX25BdDZNc1ZIRWR5Mm11UTJQUXZIX0EiIHR5cGU9IkZyb21Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9uQXQ2TWNWSEVkeTJtdVEyUFF2SF9BIiB4PSItOTIxIiB5PSItMTAzNiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfbkF0Nk04VkhFZHkybXVRMlBRdkhfQSIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iX1FHU2x3c1ZIRWR5Mm11UTJQUXZIX0EiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9uQXQ2TmNWSEVkeTJtdVEyUFF2SF9BIiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfbkF0Nk5zVkhFZHkybXVRMlBRdkhfQSIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9uQXQ2Tk1WSEVkeTJtdVEyUFF2SF9BIiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9uQXQ2TjhWSEVkeTJtdVEyUFF2SF9BIiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il9RRjJnNGNWSEVkeTJtdVEyUFF2SF9BIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfbkF0Nk9jVkhFZHkybXVRMlBRdkhfQSIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX25CblNBTVZIRWR5Mm11UTJQUXZIX0EiLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfbkF0Nk9NVkhFZHkybXVRMlBRdkhfQSIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfbkJuU0FjVkhFZHkybXVRMlBRdkhfQSIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il9RR1Nsd3NWSEVkeTJtdVEyUFF2SF9BIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfbkJuU0E4VkhFZHkybXVRMlBRdkhfQSIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX25CblNCTVZIRWR5Mm11UTJQUXZIX0EiLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfbkJuU0FzVkhFZHkybXVRMlBRdkhfQSIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfbkJuU0JjVkhFZHkybXVRMlBRdkhfQSIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iX1FGMmc0Y1ZIRWR5Mm11UTJQUXZIX0EiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9uQm5TQjhWSEVkeTJtdVEyUFF2SF9BIiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9uQm5TQ01WSEVkeTJtdVEyUFF2SF9BIi8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX25CblNCc1ZIRWR5Mm11UTJQUXZIX0EiIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX25BdDZJY1ZIRWR5Mm11UTJQUXZIX0EiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfbkF0NklzVkhFZHkybXVRMlBRdkhfQSIgcG9pbnRzPSJbMTExMSwgLTI2LCAtMzkxNiwgMjYyMF0kWzI3NTIsIC0yNiwgLTIyNzUsIDI2MjBdJFs0NDE4LCAtMTk1OCwgLTYwOSwgNjg4XSIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICA8L2NvbnRlbnRzPg0KLSAgICAgICAgICAgIDxjb250ZW50cyB4bWk6dHlwZT0ibm90YXRpb246RGlhZ3JhbSIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDExQzFDRTMwM0QzIiB0eXBlPSJDbGFzcyIgbmFtZT0iVGVhbUJyZWFrZG93blN0cnVjdHVyZSAoc2ltcGxpZmllZCkiPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0bnJmT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwRUYiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRucmYtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c0bnJnT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0bnJnZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0bnJndWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0bnJnLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRucmhPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzRucmhlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRucmh1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzRucmgtZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRucmlPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzRucmllZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRucml1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0bnJpLWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzRucmZlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzRucmZ1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTE3MDkiIHk9IjY3NyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNG5yak9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMEU2Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0bnJqLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HNG5ya09mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMjA4MiIgaGVpZ2h0PSI5MDUiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0bnJrZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0bnJrdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0bnJrLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRucmxPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzRucmxlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRucmx1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzRucmwtZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRucm1PZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzRucm1lZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRucm11ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0bnJtLWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzRucmplZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzRucmp1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iNjE3MiIgeT0iMTc4NiIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNG5ycGVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDYzIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0bnJxT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HNG5ycWVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNG5ycXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNG5ycS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNHhjVU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0eGNVZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0eGNVdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0eGNVLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0eGNWT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0eGNWZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0eGNWdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0eGNWLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNHhjV09mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c0bnJwdWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c0bnJwLWZYRWR1cUhvT0piVVJaUnciIHg9IjEyMjY4IiB5PSIzNjY2Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0eGNoZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwOEIiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzR4Y2lPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c0eGNpZWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0eGNpdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0eGNpLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0eGNqT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzR4Y2plZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzR4Y2p1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzR4Y2otZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzR4Y2tPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzR4Y2tlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzR4Y2t1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzR4Y2stZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0eGNsT2ZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzR4Y2h1ZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzR4Y2gtZlhFZHVxSG9PSmJVUlpSdyIgeD0iNTkyNiIgeT0iMzY2NiIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNHhjd2VmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFGMDZCNjUwMEU2Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0eGN4T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HNHhjeGVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMjc0MyIgaGVpZ2h0PSI5OTAiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0eGN4dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0eGN4LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0eGN5T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzR4Y3llZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzR4Y3l1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzR4Y3ktZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzR4Y3pPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzR4Y3plZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzR4Y3p1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzR4Y3otZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0eGMwT2ZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzR4Y3d1ZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzR4Y3ctZlhFZHVxSG9PSmJVUlpSdyIgeD0iNTk0MyIgeT0iNjcyMiIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNHhjMnVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjk2Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0eGMzZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HNHhjM3VmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iNDAxMyIgaGVpZ2h0PSIxMTE3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNHhjMy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNHhjNE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNHhjNGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0eGM0dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0eGM0LWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0eGM1T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0eGM1ZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0eGM1dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0eGM1LWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0eGM2T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNHhjNmVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c0eGMyLWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c0eGMzT2ZYRWR1cUhvT0piVVJaUnciIHg9IjEwOTIiIHk9IjUxMzAiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxEaWFncmFtU3R5bGUiIHhtaTppZD0iX0dsUURZLWZYRWR1cUhvT0piVVJaUnciIGRlc2NyaXB0aW9uPSJUaGlzIGRpYWdyYW0gcHJvdmlkZXMgYSBzaW1wbGlmaWVkIHZpZXcgb24gdGhlIFRlYW0gQnJlYWtkb3duIFN0cnVjdHVyZSBvbmx5IHRoZSBrZXkgY2xhc3NlcyBhbmQgcmVsYXRpb25zaGlwcy4iLz4NCi0gICAgICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HNG5ybk9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjhGIiBzb3VyY2U9Il9HNG5yak9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HNG5yZk9mWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0bnJuLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0bnJvZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRucm91ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNG5yb09mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HNG5ybmVmWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c0bnJudWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzEwNDEsIC0xODYsIC01MTU2LCA4ODBdJFs0NDg3LCAtNzc4LCAtMTcxMCwgMjg3XSIvPg0KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzRucm8tZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HNG5ycE9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzR4Y1dlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDA1MiIgc291cmNlPSJfRzRucnBlZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzRucnBlZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNHhjWE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNHhjWHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0eGNYLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzR4Y1hlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzR4Y1lPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDA1NSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0eGNZdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNHhjWWVmWEVkdXFIb09KYlVSWlJ3IiB4PSI4MDYiIHk9IjI4MyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzR4Y1ktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwNTUiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNHhjWmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0eGNaT2ZYRWR1cUhvT0piVVJaUnciIHg9IjcxNCIgeT0iLTkzMCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzR4Y1p1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDUzIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzR4Y2FPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzR4Y1otZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTc4NCIgeT0iMzExIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNHhjYWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDUzIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzR4Y2EtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0eGNhdWZYRWR1cUhvT0piVVJaUnciIHg9Ii01NSIgeT0iLTMwOSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzR4Y2JPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDA1NSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0eGNidWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNHhjYi1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0eGNiZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0eGNjT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDA1MyI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0eGNjdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNHhjYy1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0eGNjZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0eGNkT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDU1Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzR4Y2R1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0eGNkLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzR4Y2RlZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzR4Y2VPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDA1MyI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0eGNldWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0eGNlLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzR4Y2VlZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzR4Y1d1ZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzR4Y1ctZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMTE0MywgMCwgMTE0MywgMF0kWzI2NDEsIDAsIDI2NDEsIDBdJFsyNjQxLCAxOTEzLCAyNjQxLCAxOTEzXSRbMCwgMTkxMywgMCwgMTkxM10kWzAsIDQ0OCwgMCwgNDQ4XSIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HNHhjZk9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDNFIiBzb3VyY2U9Il9HNG5ycGVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HNG5yZk9mWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0eGNmLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0eGNnZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzR4Y2d1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNHhjZ09mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HNHhjZmVmWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c0eGNmdWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzAsIC00NTcsIDAsIDI0ODldJFswLCAtMjQ1NSwgMCwgNDkxXSIvPg0KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzR4Y2ctZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HNHhjaE9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzR4Y2xlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDE2MCIgc291cmNlPSJfRzR4Y2hlZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzRucmpPZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNHhjbU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNHhjbXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0eGNtLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzR4Y21lZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzR4Y2x1ZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzR4Y2wtZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTUwLCAtNDQ4LCAwLCAxNDMwXSRbLTUwLCAtMTQzMCwgMCwgNDQ4XSIvPg0KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzR4Y25PZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HNHhjbmVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzR4Y251ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDAzRiIgc291cmNlPSJfRzR4Y2hlZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzRucnBlZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNHhjb2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNHhjby1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0eGNwT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzR4Y291ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzR4Y3BlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDA0MiI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0eGNwLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNHhjcHVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxMjkiIHk9IjIzNSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzR4Y3FPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwNDIiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNHhjcXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0eGNxZWZYRWR1cUhvT0piVVJaUnciIHg9IjgyMiIgeT0iLTI5NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzR4Y3EtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDQwIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzR4Y3JlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzR4Y3JPZlhFZHVxSG9PSmJVUlpSdyIgeD0iMjA0IiB5PSItMTg5Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNHhjcnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDA0MCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0eGNzT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNHhjci1mWEVkdXFIb09KYlVSWlJ3IiB4PSIxNjkiIHk9Ii0zNDciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0eGNzZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwNDIiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNHhjcy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzR4Y3RPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNHhjc3VmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNHhjdGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwNDAiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNHhjdC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzR4Y3VPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNHhjdHVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNHhjdWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDA0MiI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0eGN1LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNHhjdk9mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0eGN1dWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0eGN2ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwNDAiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNHhjdi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNHhjd09mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0eGN2dWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c0eGNuLWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzR4Y29PZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMTMzNywgMCwgLTQ4MDksIDBdJFs0OTk1LCAwLCAtMTE1MSwgMF0iLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzR4YzBlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRjk0QUI5MDAxNSIgc291cmNlPSJfRzR4Y3dlZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzR4Y2hlZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNHhjMU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNHhjMXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0eGMxLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzR4YzFlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzR4YzB1ZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzR4YzAtZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTUwLCAtNDk5LCAwLCAyNTk5XSRbLTUwLCAtMjY1MCwgMCwgNDQ4XSIvPg0KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzR4YzJPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HNHhjMmVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzR4YzZ1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDE2QSIgc291cmNlPSJfRzR4YzJ1ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzR4Y2hlZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNDZtUU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNDZtUXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0Nm1RLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzQ2bVFlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzQ2bVJPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDE2RCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0Nm1SdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNDZtUmVmWEVkdXFIb09KYlVSWlJ3IiB4PSItMTM1IiB5PSI0MDYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0Nm1SLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDE2RCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0Nm1TZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzQ2bVNPZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTIwMiIgeT0iLTM0NyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzQ2bVN1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTZCIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzQ2bVRPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzQ2bVMtZlhFZHVxSG9PSmJVUlpSdyIgeD0iMzkxIiB5PSIyOTYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0Nm1UZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTZCIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzQ2bVQtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0Nm1UdWZYRWR1cUhvT0piVVJaUnciIHg9IjIwNCIgeT0iLTM0OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzQ2bVVPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDE2RCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0Nm1VdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNDZtVS1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0Nm1VZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0Nm1WT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDE2QiI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0Nm1WdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNDZtVi1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0Nm1WZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0Nm1XT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTZEIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzQ2bVd1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0Nm1XLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzQ2bVdlZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzQ2bVhPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDE2QiI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0Nm1YdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0Nm1YLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzQ2bVhlZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzR4YzYtZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzR4YzdPZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMTMzLCAtMzE3LCAtNTUyOSwgMTEzOF0kWzEzMywgLTE2MTMsIC01NTI5LCAtMTU4XSRbNDEyOCwgLTE2MTMsIC0xNTM0LCAtMTU4XSIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HNDZtWU9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFGMDZCQkMwMzBEIiBzb3VyY2U9Il9HNHhjd2VmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HNHhjMnVmWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0Nm1ZLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0Nm1aZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzQ2bVp1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNDZtWk9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNDZtWi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFGMDZCQkUwMEU5Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzQ2bWFlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0Nm1hT2ZYRWR1cUhvT0piVVJaUnciIHg9Ii00NjgiIHk9Ii0yNDUiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0Nm1hdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRjA2QkJFMDBFOSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0Nm1iT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzQ2bWEtZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTIwNiIgeT0iMzQ4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNDZtYmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUYwNkJCRTAwREYiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNDZtYi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNDZtYnVmWEVkdXFIb09KYlVSWlJ3IiB4PSIzIiB5PSItMTUzIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNDZtY09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFGMDZCQkUwMERGIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzQ2bWN1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0Nm1jZWZYRWR1cUhvT0piVVJaUnciIHg9IjgwIiB5PSIxNDcyIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNDZtYy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFGMDZCQkUwMEU5Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzQ2bWRlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0Nm1kdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzQ2bWRPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzQ2bWQtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFGMDZCQkUwMERGIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzQ2bWVlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0Nm1ldWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzQ2bWVPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzQ2bWUtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUYwNkJCRTAwRTkiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNDZtZmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzQ2bWZ1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNDZtZk9mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNDZtZi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFGMDZCQkUwMERGIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzQ2bWdlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzQ2bWd1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNDZtZ09mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HNDZtWWVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HNDZtWXVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMTUzNSwgMCwgNDE1NCwgMTYxNF0kWy01NTU2LCAwLCAxMzMsIDE2MTRdJFstNTU1NiwgLTEyOTYsIDEzMywgMzE4XSIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICA8L2NvbnRlbnRzPg0KLSAgICAgICAgICAgIDxjb250ZW50cyB4bWk6dHlwZT0ibm90YXRpb246RGlhZ3JhbSIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDExQzQ2MUMwMkY3IiB0eXBlPSJDbGFzcyIgbmFtZT0iV29ya1Byb2R1Y3RCcmVha2Rvd25TdHJ1Y3R1cmUgKHNpbXBsaWZpZWQpIj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNDZtZy1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMEVGIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0Nm1odWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HNDZtaC1mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNDZtaU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNDZtaWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNDZtaXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0Nm1pLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0Nm1qT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0Nm1qZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0Nm1qdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0Nm1qLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0Nm1rT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0Nm1rZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNDZta3VmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c0Nm1oT2ZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c0Nm1oZWZYRWR1cUhvT0piVVJaUnciIHg9IjQ3MDciIHk9Ijk3MyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNDZtay1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMEU2Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0Nm1sdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HNDZtbC1mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNDZtbU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNUVYUU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNUVYUWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1RVhRdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1RVhRLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1RVhST2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1RVhSZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1RVhSdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1RVhSLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1RVhTT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNUVYU2VmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c0Nm1sT2ZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c0Nm1sZWZYRWR1cUhvT0piVVJaUnciIHg9IjU1OTYiIHk9IjMxMTUiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVFWFUtZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDA0NSI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNUVYVnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzVFWFYtZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVFWFdPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVFWFdlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVFWFd1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNUVYVy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1RVhYT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1RVhYZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1RVhYdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1RVhYLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1RVhZT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1RVhZZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNUVYWXVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c1RVhWT2ZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c1RVhWZWZYRWR1cUhvT0piVVJaUnciIHg9IjQwOTciIHk9IjU0NjkiIHdpZHRoPSI0OTE5IiBoZWlnaHQ9IjIxNzUiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVFWHFlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDAwOSI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNUVYck9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzVFWHJlZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVFWHJ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVFWHItZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVFWHNPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNUVYc2VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNUVYc3VmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNUVYcy1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNUVYdE9mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNUVYdGVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNUVYdHVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNUVYdC1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzVFWHVPZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HNUVYcXVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNUVYcS1mWEVkdXFIb09KYlVSWlJ3IiB4PSI1MDcxIiB5PSIxMTE0MiIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTERpYWdyYW1TdHlsZSIgeG1pOmlkPSJfR2xRRFplZlhFZHVxSG9PSmJVUlpSdyIgZGVzY3JpcHRpb249IlRoaXMgZGlhZ3JhbSBwcm92aWRlcyBhIHNpbXBsaWZpZWQgdmlldyBvbiB0aGUgV29yayBQcm9kdWN0IEJyZWFrZG93biBTdHJ1Y3R1cmUgb25seSB0aGUga2V5IGNsYXNzZXMgYW5kIHJlbGF0aW9uc2hpcHMuIi8+DQotICAgICAgICAgICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzVFWFN1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDI4RiIgc291cmNlPSJfRzQ2bWstZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzQ2bWctZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNUVYVGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNUVYVC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1RVhVT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzVFWFR1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzVFWFMtZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HNUVYVE9mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlswLCAtNDk5LCAwLCAxNjM0XSRbMCwgLTE2MzQsIDAsIDQ5OV0iLz4NCi0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c1RVhVZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzVFWFV1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c1RVhZLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwMEMiIHNvdXJjZT0iX0c1RVhVLWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c1RVhVLWZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVFWFp1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVFWGFPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNUVYYWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzVFWFotZlhFZHVxSG9PSmJVUlpSdyIgeD0iNDE3IiB5PSIxMDYzIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNUVYYXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDBGIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVFWGJPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1RVhhLWZYRWR1cUhvT0piVVJaUnciIHg9IjMwNyIgeT0iNjgzIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNUVYYmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDAwRiI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1RVhiLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzVFWGJ1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTEyNjEiIHk9Ijc5OSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVFWGNPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDBEIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVFWGN1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzVFWGNlZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTkyNyIgeT0iMjkyIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNUVYYy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDBEIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVFWGRlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1RVhkT2ZYRWR1cUhvT0piVVJaUnciIHg9Ii0xMzgiIHk9Ii0yODIiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1RVhkdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwMEYiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNUVYZU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzVFWGVlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNUVYZC1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNUVYZXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwMEQiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNUVYZk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzVFWGZlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNUVYZS1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNUVYZnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDAwRiI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1RVhnT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNUVYZ2VmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1RVhmLWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1RVhndWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwMEQiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNUVYaE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNUVYaGVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1RVhnLWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c1RVhaT2ZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c1RVhaZWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzI0NjAsIC04MCwgMjQ2MCwgLTgwXSRbNDk3NCwgLTgwLCA0OTc0LCAtODBdJFs0OTc0LCAyNDA3LCA0OTc0LCAyNDA3XSRbMTU4NywgMjQwNywgMTU4NywgMjQwN10kWzE1ODcsIDEwODUsIDE1ODcsIDEwODVdIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c1RVhodWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwMjAiIHNvdXJjZT0iX0c1RVhVLWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c1RVhVLWZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVFWGllZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVFWGktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNUVYak9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzVFWGl1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTEzMzgiIHk9Ii0zMTMiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1RVhqZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwMjMiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNUVYai1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzVFWGp1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iNzY5IiB5PSIyNTkiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1RVhrT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDIzIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVFWGt1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNUVYa2VmWEVkdXFIb09KYlVSWlJ3IiB4PSIyMjkiIHk9Ii0zMTIiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1RVhrLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDAyMSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1RVhsZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1RVhsT2ZYRWR1cUhvT0piVVJaUnciIHg9Ii04MTMiIHk9IjE2NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVFWGx1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDAyMSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1RVhtT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNUVYbC1mWEVkdXFIb09KYlVSWlJ3IiB4PSIzNDMiIHk9IjczNyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVFWG1lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDAyMyI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1RVhtLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNUVYbk9mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1RVhtdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1RVhuZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDAyMSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1RVhuLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNUVYb09mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1RVhudWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1RVhvZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDIzIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVFWG8tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1RVhwT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzVFWG91ZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVFWHBlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDAyMSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1RVhwLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1RVhxT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzVFWHB1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzVFWGgtZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzVFWGlPZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTE4MzcsIDEwODMsIC0xODM3LCAxMDgzXSRbLTE4MzcsIDIzNjIsIC0xODM3LCAyMzYyXSRbLTQwMjEsIDIzNjIsIC00MDIxLCAyMzYyXSRbLTQwMjEsIC0yMzcsIC00MDIxLCAtMjM3XSRbLTI0NTUsIC0yMzcsIC0yNDU1LCAtMjM3XSIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HNUVYdWVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjNEIiBzb3VyY2U9Il9HNUVYVS1mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HNUVYcWVmWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1RVh2T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1RVh2dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVFWHYtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c1RVh2ZWZYRWR1cUhvT0piVVJaUnciIHg9IjIxIiB5PSItNjQzIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNUVYd09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjQ4Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVFWHd1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1RVh3ZWZYRWR1cUhvT0piVVJaUnciIHg9IjcyIiB5PSIxOTkiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1RVh3LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjQ4Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVFWHhlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNUVYeE9mWEVkdXFIb09KYlVSWlJ3IiB4PSItMzMiIHk9Ii03NDUiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1RVh4dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDI0NiI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1RVh5T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1RVh4LWZYRWR1cUhvT0piVVJaUnciIHg9IjIwNyIgeT0iLTIwMiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVFWHllZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDI0NiI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1RVh5LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNUVYeXVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxOTgiIHk9IjEyMDMiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1RVh6T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyNDgiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNUVYenVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzVFWHotZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNUVYemVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNUVYME9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyNDYiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNUVYMHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzVFWDAtZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNUVYMGVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNUVYMU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDI0OCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1T0lRT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNU9JUWVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1RVgxZWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1T0lRdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyNDYiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNU9JUk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNU9JUmVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1T0lRLWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c1RVh1dWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c1RVh1LWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0yNjIsIDEwNzUsIC0xNjAsIC00MDA0XSRbLTI2MiwgNDU4OCwgLTE2MCwgLTQ5MV0iLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzVPSVJ1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDNENiIgc291cmNlPSJfRzVFWFUtZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzQ2bWstZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNU9JU2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNU9JUy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1T0lUT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzVPSVN1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzVPSVItZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzVPSVNPZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTQyLCAtMTA5MiwgLTkzLCAxODU0XSRbLTQyLCAtMjQ1NSwgLTkzLCA0OTFdIi8+DQotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HNU9JVGVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c1T0lUdWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HNU9JVC1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzAzIiBzb3VyY2U9Il9HNUVYcWVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HNDZtay1mWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1T0lVdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1T0lWT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVPSVZlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNU9JVS1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HNU9JVU9mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HNU9JVWVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlsxMzgwLCAtMTYsIDEyMjcsIDgwMDldJFs3MTI4LCAtMTYsIDY5NzYsIDgwMDldJFs3MTI4LCAtODA4NSwgNjk3NiwgLTU5XSRbMTE1OSwgLTgwODUsIDEwMDcsIC01OV0iLz4NCi0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c1T0lWdWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzVPSVYtZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgIDwvY29udGVudHM+DQotICAgICAgICAgICAgPGNvbnRlbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpEaWFncmFtIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTFDNDk0NjAzMUUiIHR5cGU9IkNsYXNzIiBuYW1lPSJXb3JrQnJlYWtkb3duU3RydWN0dXJlIChzaW1wbGlmaWVkKSI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVPSVdPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDAwOSI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNU9JVy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzVPSVhPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVPSVhlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVPSVh1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVPSVgtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNU9JWU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNU9JWWVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNU9JWXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNU9JWS1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNU9JWk9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNU9JWmVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNU9JWnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzVPSVotZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HNU9JV2VmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNU9JV3VmWEVkdXFIb09KYlVSWlJ3IiB4PSI1OTk0IiB5PSI2NTYxIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1T0lhT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwRTYiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVPSWEtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c1T0liT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1T0liZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1T0lidWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1T0liLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVPSWNPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzVPSWNlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVPSWN1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzVPSWMtZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVPSWRPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzVPSWRlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVPSWR1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1T0lkLWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzVPSWFlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzVPSWF1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iNTU2MiIgeT0iNDMyNiIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNU9JZU9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUQwM0NBIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1T0llLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HNU9JZk9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNU9JZmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNU9JZnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNU9JZi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1T0lnT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1T0lnZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1T0lndWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1T0lnLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1T0loT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1T0loZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1T0lodWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNU9JaC1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c1T0llZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c1T0lldWZYRWR1cUhvT0piVVJaUnciIHg9IjE0MzAiIHk9IjY2MzgiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVPSWlPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVEMDNDQiI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNU9JaS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzVPSWpPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjE2NTkiIGhlaWdodD0iOTA1Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNU9JamVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNU9JanVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNU9Jai1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1T0lrT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1T0lrZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1T0lrdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1T0lrLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1T0lsT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1T0lsZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1T0lsdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNU9JbC1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c1T0lpZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c1T0lpdWZYRWR1cUhvT0piVVJaUnciIHg9IjMyMDAiIHk9IjY2OTEiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVPSW1PZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDBFRiI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNU9JbS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzVPSW5PZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVPSW5lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVPSW51ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVPSW4tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNU9Jb09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNU9Jb2VmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNU9Jb3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNU9Jby1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNU9JcE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNU9JcGVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNU9JcHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzVPSXAtZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HNU9JbWVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNU9JbXVmWEVkdXFIb09KYlVSWlJ3IiB4PSIzMzg2IiB5PSIxNTMyIiB3aWR0aD0iNTkyNiIgaGVpZ2h0PSIxMDA3Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1WFNPZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RDAzRDMiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVYU1BPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c1WFNQZWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIyMjE4IiBoZWlnaHQ9Ijg0NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVYU1B1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVYU1AtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVYU1FPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNVhTUWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNVhTUXVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNVhTUS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNVhTUk9mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNVhTUmVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNVhTUnVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNVhTUi1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzVYU1NPZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HNVhTT3VmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNVhTTy1mWEVkdXFIb09KYlVSWlJ3IiB4PSIyNDk3IiB5PSI0MzUxIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1WFNiT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBOTI1NDAyMjciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVYU2ItZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c1WFNjT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSI0MjY3IiBoZWlnaHQ9Ijk5MCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVYU2NlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVYU2N1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVYU2MtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNVhTZE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNVhTZGVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNVhTZHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNVhTZC1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNVhTZU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNVhTZWVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNVhTZXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzVYU2UtZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HNVhTYmVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNVhTYnVmWEVkdXFIb09KYlVSWlJ3IiB4PSI1MjgzIiB5PSI4NjUyIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1WFNqdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwMzEiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVYU2tlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c1WFNrdWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxODYyIiBoZWlnaHQ9IjkwNSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVYU2stZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVYU2xPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVYU2xlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNVhTbHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNVhTbC1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNVhTbU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNVhTbWVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNVhTbXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNVhTbS1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNVhTbk9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzVYU25lZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HNVhTai1mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNVhTa09mWEVkdXFIb09KYlVSWlJ3IiB4PSI5MTY1IiB5PSI2NTYxIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MRGlhZ3JhbVN0eWxlIiB4bWk6aWQ9Il9HbFFEWi1mWEVkdXFIb09KYlVSWlJ3IiBkZXNjcmlwdGlvbj0iVGhpcyBpcyBhIHNpbXBsaWZpZWQgcmVwcmVzZW50YXRpb24gb2YgYSBXQlMgb25seSBzaG93aW5nIGtleSBlbGVtZW50cyBhbmQgdGhlaXIgcmVsYXRpb25zaGlwcy4iLz4NCi0gICAgICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HNVhTTU9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjhGIiBzb3VyY2U9Il9HNU9JYU9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HNU9JbU9mWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1WFNNLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1WFNOZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVYU051ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNVhTTk9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HNVhTTWVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HNVhTTXVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlswLCAtNDQ4LCAyNTQsIDIyOTRdJFswLCAtMjI0MywgMjU0LCA0OTldIi8+DQotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HNVhTTi1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c1WFNPT2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HNVhTU2VmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFMEZGRDMwMEVGIiBzb3VyY2U9Il9HNU9JbU9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HNVhTT2VmWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1WFNUT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1WFNUdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVYU1QtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c1WFNUZWZYRWR1cUhvT0piVVJaUnciIHg9IjIzMCIgeT0iNzk2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNVhTVU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFMEZGRDMwMEYxIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVYU1V1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1WFNVZWZYRWR1cUhvT0piVVJaUnciIHg9Ii0yODciIHk9Ii0yNjEiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1WFNVLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRTBGRkQzMDBGMSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1WFNWZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzVYU1ZPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTM5NyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVYU1Z1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFMEZGRDMwMEYwIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVYU1dPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzVYU1YtZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTc1IiB5PSItMTk0Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNVhTV2VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRTBGRkQzMDBGMCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1WFNXLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNVhTV3VmWEVkdXFIb09KYlVSWlJ3IiB5PSItMzk3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNVhTWE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFMEZGRDMwMEYxIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVYU1h1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1WFNYLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzVYU1hlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVYU1lPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFMEZGRDMwMEYwIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVYU1l1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1WFNZLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzVYU1llZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVYU1pPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUUwRkZEMzAwRjEiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNVhTWnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzVYU1otZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNVhTWmVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNVhTYU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFMEZGRDMwMEYwIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVYU2F1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzVYU2EtZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNVhTYWVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HNVhTU3VmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HNVhTUy1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMjk2MywgLTEwMSwgLTIyMCwgLTI4NDRdJFstMzU5OCwgLTEwMSwgLTg1NSwgLTI4NDRdJFstMzU5OCwgMjMxOSwgLTg1NSwgLTQyM10iLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzVYU2ZPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDJBMCIgc291cmNlPSJfRzVPSWlPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzVYU09lZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNVhTZi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNVhTZ2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1WFNndWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzVYU2dPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzVYU2ZlZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzVYU2Z1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTM4MSwgLTQ0OCwgMjI4LCAxODM3XSRbLTM4MSwgLTE4NjIsIDIyOCwgNDIzXSIvPg0KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzVYU2ctZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HNVhTaE9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzVYU2hlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDI5RiIgc291cmNlPSJfRzVPSWVPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzVYU09lZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNVhTaU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNVhTaXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1WFNpLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzVYU2llZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzVYU2h1ZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzVYU2gtZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbNTU2LCAtMzE4LCAtNjYxLCAxOTU4XSRbNTU2LCAtMTk1OCwgLTY2MSwgMzE4XSIvPg0KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzVYU2pPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HNVhTamVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzVYU251ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyQjFFQzFCMDM0OSIgc291cmNlPSJfRzVYU2p1ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzVYU2JPZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNVhTb2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNVhTby1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1WFNwT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzVYU291ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzVYU24tZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzVYU29PZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTM2NCwgNDQ4LCAxOTcyLCAtMTY4NF0kWy0zNjQsIDE2MzQsIDE5NzIsIC00OTldIi8+DQotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HNVhTcGVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c1WFNwdWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HNVhTcC1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI4Q0QzMjMwMTlBIiBzb3VyY2U9Il9HNVhTYk9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HNU9JbU9mWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1WFNxdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1WFNyT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVYU3JlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNVhTcS1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HNVhTcU9mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HNVhTcWVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlsxNTM0LCAtMzE4LCAyNzc4LCA2NjQxXSRbMTUzNCwgLTY0ODIsIDI3NzgsIDQ3N10iLz4NCi0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c1WFNydWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzVYU3ItZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c1WFNzT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBOTI4MjAzOTIiIHNvdXJjZT0iX0c1WFNPZWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c1WFNiT2ZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVYU3MtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVYU3RlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNVhTdHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c1WFN0T2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c1WFNzZWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c1WFNzdWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzkyNiwgMzE4LCAtMzIwMiwgLTM5OTVdJFs5MjYsIDEzMjMsIC0zMjAyLCAtMjk5MF0kWzIzMjgsIDEzMjMsIC0xODAwLCAtMjk5MF0kWzIzMjgsIDM5OTUsIC0xODAwLCAtMzE4XSIvPg0KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzVYU3QtZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HNVhTdU9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzVYU3VlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDMwMyIgc291cmNlPSJfRzVPSVdPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzVPSWFPZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNVhTdk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNVhTdnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1WFN2LWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzVYU3ZlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzVYU3V1ZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzVYU3UtZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTQwNiwgLTQ1NywgMzU1LCAxNzc4XSRbLTQwNiwgLTE3ODYsIDM1NSwgNDQ4XSIvPg0KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzVYU3dPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HNVhTd2VmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzVYU3d1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E5MjNCMDAwMiIgc291cmNlPSJfRzVPSVdPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzVYU2JPZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNVhTeGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNVhTeC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1WFN5T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzVYU3h1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzVYU3ctZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzVYU3hPZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTMxNywgMzE3LCAtMzk3LCAtMTc3M10kWy0zMTcsIDE3NzIsIC0zOTcsIC0zMThdIi8+DQotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HNVhTeWVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c1WFN5dWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICA8L2NvbnRlbnRzPg0KLSAgICAgICAgICAgIDxjb250ZW50cyB4bWk6dHlwZT0ibm90YXRpb246RGlhZ3JhbSIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDEwMTU4MEYwMEM0IiB0eXBlPSJDbGFzcyIgbmFtZT0iRGVzY3JpcHRvclJlbGF0aW9uc2hpcHMiPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1aERNT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5vdGUiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVoRE0tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRGlhZ3JhbU5hbWUiPg0KLSAgICAgICAgICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1aEROT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkRlc2NyaXB0aW9uIj4NCi0gICAgICAgICAgICAgICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOlNoYXBlU3R5bGUiIHhtaTppZD0iX0c1aERNZWZYRWR1cUhvT0piVVJaUnciIGZvbnROYW1lPSJBcmlhbCIgZm9udEhlaWdodD0iOCIgZGVzY3JpcHRpb249IntSb2xlRGVzY3JpcHRvci5tb2RpZmllcyA9IFJvbGUucGVyZm9ybXNBc093bmVyLm91dHB1dCB1bmlvbiBSb2xlLnBlcmZvcm1zQWRkaXRpb25hbGx5Lm91dHB1dCB1bmlvbiBSb2xlLmFzc2lzdHNJbi5vdXRwdXR9IiBsaW5lQ29sb3I9IjAiLz4NCi0gICAgICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNWhETXVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxNzc3MSIgeT0iMjM3OSIgd2lkdGg9IjU1MDMiIGhlaWdodD0iMTc1MiIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNWhETmVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjk2Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1aERPT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HNWhET2VmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNWhET3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNWhETy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNWhEUE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1aERQZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1aERQdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1aERQLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1aERRT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1aERRZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1aERRdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1aERRLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNWhEUk9mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c1aEROdWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dQYXJlbnQ9Ik5hbWUiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c1aEROLWZYRWR1cUhvT0piVVJaUnciIHg9IjMzMzI0IiB5PSI1NzQwIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1aERSZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyOUUiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVoRFNPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c1aERTZWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1aERTdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1aERTLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1aERUT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVoRFRlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzVoRFR1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVoRFQtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzVoRFVPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVoRFVlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzVoRFV1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVxTklPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1cU5JZWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzVoRFJ1ZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1BhcmVudD0iTmFtZSIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzVoRFItZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTcxNzAiIHk9IjE1MTM4Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1cU5JdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwOEIiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVxTkplZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c1cU5KdWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1cU5KLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1cU5LT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1cU5LZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVxTkt1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzVxTkstZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVxTkxPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzVxTkxlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVxTkx1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzVxTkwtZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVxTk1PZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1cU5NZWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzVxTkktZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzVxTkpPZlhFZHVxSG9PSmJVUlpSdyIgeD0iMjY5OTEiIHk9IjQ2MjIiIHdpZHRoPSI0NDQ1IiBoZWlnaHQ9IjM4NjAiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVxTlZlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDAwOSI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXFOV09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzVxTldlZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVxTld1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVxTlctZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVxTlhPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXFOWGVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNXFOWHVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXFOWC1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNXFOWU9mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXFOWWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNXFOWXVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXFOWS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzVxTlpPZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HNXFOVnVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNXFOVi1mWEVkdXFIb09KYlVSWlJ3IiB4PSIxNjg4MiIgeT0iODcyMCIgd2lkdGg9IjQ0NDUiIGhlaWdodD0iNDgxNyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXotVk9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMkJDIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1ei1WLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HNXotV09mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMzc1OSIgaGVpZ2h0PSIxMTE3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXotV2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXotV3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXotVy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1ei1YT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1ei1YZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1ei1YdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1ei1YLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1ei1ZT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1ei1ZZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1ei1ZdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNXotWS1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c1ei1WZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dQYXJlbnQ9Ik5hbWUiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c1ei1WdWZYRWR1cUhvT0piVVJaUnciIHg9IjI2OTIiIHk9IjEwMjYxIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1ei1aT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwNDUiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzV6LVotZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c1ei1hT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1ei1hZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1ei1hdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1ei1hLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzV6LWJPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNXotYmVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXotYnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNXotYi1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXotY09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNXotY2VmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXotY3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzV6LWMtZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HNXotWmVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iTm9uZSIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNXotWnVmWEVkdXFIb09KYlVSWlJ3IiB4PSI4MTc4IiB5PSI0MjkyIiB3aWR0aD0iNjUxMCIgaGVpZ2h0PSIzOTIwIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MRGlhZ3JhbVN0eWxlIiB4bWk6aWQ9Il9HbFFEYWVmWEVkdXFIb09KYlVSWlJ3IiBkZXNjcmlwdGlvbj0iVGhpcyBkaWFncmFtIHByb3ZpZGVzIGFuIG92ZXJ2aWV3IHRvIGFsbCBEZXNjcmlwdG9yIHR5cGVzIGRlZmluZWQgaW4gdGhlIFByb2Nlc3MgcGFja2FnZSwgdGhlaXIgYXR0cmlidXRlcyBhbmQgYXNzb2NpYXRpb25zLiAgV2Ugc2VlIHRoYXQgZWFjaCBEZXNjcmlwdG9yIHRyYWNlcyBiYWNrIHRvIHRoZSBjb3JlIGNvbnRlbnQgZWxlbWVudCB0aGV5IHJlZmVyIHRvLiAgRGVzY3JpcHRvcnMgYWxzbyBkZWZpbmUgYWRkaXRpb25hbCBhc3NvY2lhdGlvbnMgdGhhbiB0aGUgYXNzb2NpYXRpb25zIGRlZmluZWQgYW1vbmdzdCB0aGUgY29yZSBjb250ZW50IGVsZW1lbnRzLiAgRm9yIGV4YW1wbGUsIEV4dGVybmFsIElucHV0cyBiZXR3ZWVuIFRhc2tzIERlc2NyaXB0b3JzIGFuZCBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvcnMgYXJlIG5vdCBkZWZpbmVkIGluIENvcmUgTWV0aG9kIENvbnRlbnQsIGJlY2F1c2UgaXQgZXhwcmVzc2VzIGluZm9ybWF0aW9uIHRoYXQgaXMgc3BlY2lmaWMgdG8gYSBwcm9jZXNzIGFuZCBub3QgYXZhaWxhYmxlL2tub3duIGZvciBtZXRob2QgY29udGVudC4iLz4NCi0gICAgICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HNXFOTXVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTZBIiBzb3VyY2U9Il9HNWhETmVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HNXFOSXVmWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1cU5OZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1cU5OLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVxTk9PZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNXFOTnVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXFOT2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTZEIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVxTk8tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1cU5PdWZYRWR1cUhvT0piVVJaUnciIHg9IjQiIHk9IjI4MCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVxTlBPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxNkQiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXFOUHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1cU5QZWZYRWR1cUhvT0piVVJaUnciIHg9IjQ2NiIgeT0iLTI4NyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVxTlAtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTZCIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVxTlFlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzVxTlFPZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTAwIiB5PSIxMjgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1cU5RdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTZCIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVxTlJPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1cU5RLWZYRWR1cUhvT0piVVJaUnciIHg9IjgzIiB5PSIzNDgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1cU5SZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxNkQiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXFOUi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzVxTlNPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNXFOUnVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXFOU2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxNkIiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXFOUy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzVxTlRPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNXFOU3VmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXFOVGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDE2RCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1cU5ULWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNXFOVU9mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1cU5UdWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1cU5VZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxNkIiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXFOVS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNXFOVk9mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1cU5VdWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c1cU5NLWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c1cU5OT2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0xODc5LCAtMjUsIDQxMTQsIC0yNzldJFstMzc3NiwgLTI1LCAyMjE4LCAtMjc5XSIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HNXFOWmVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzIxIiBzb3VyY2U9Il9HNXFOVmVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HNXFOSXVmWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1cU5hT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1cU5hdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVxTmEtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c1cU5hZWZYRWR1cUhvT0piVVJaUnciIHg9Ii0xNTciIHk9Ii0yNjMiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1cU5iT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzMkIiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXFOYnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzVxTmJlZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTg5NSIgeT0iLTE4NyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVxTmItZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzMkIiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXFOY2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1cU5jT2ZYRWR1cUhvT0piVVJaUnciIHg9IjcyMiIgeT0iMjg3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXFOY3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzMjIiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXFOZE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNXFOYy1mWEVkdXFIb09KYlVSWlJ3IiB4PSI2MjQiIHk9IjE5NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVxTmRlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDMyMiI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1cU5kLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNXFOZHVmWEVkdXFIb09KYlVSWlJ3IiB4PSI4MzUiIHk9Ii0yMzEwIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXFOZU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzJCIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVxTmV1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1cU5lLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzVxTmVlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVxTmZPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzIyIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVxTmZ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1cU5mLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzVxTmZlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVxTmdPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzMkIiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXFOZ3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzVxTmctZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNXFOZ2VmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXFOaE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzIyIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVxTmh1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzVxTmgtZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNXFOaGVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HNXFOWnVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HNXFOWi1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlsyMjE4LCAtMTQyMiwgLTc4OTAsIDMxNDldJFs4NjUyLCAtMTQyMiwgLTE0NTYsIDMxNDldJFs4NjUyLCAtMjY0MSwgLTE0NTYsIDE5MzBdIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c1cU5pT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzM0YiIHNvdXJjZT0iX0c1cU5WZWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c1cU5JdWZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVxTmktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVxTmplZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXFOanVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzVxTmpPZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTEyMTUiIHk9Ii0zMjEiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1cU5qLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzNDIiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXFOa2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzVxTmtPZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTE5MjAiIHk9Ii0yNTQiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1cU5rdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzQyIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVxTmxPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNXFOay1mWEVkdXFIb09KYlVSWlJ3IiB4PSItMTE1OCIgeT0iMjM3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXFObGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzNDAiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXFObC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNXFObHVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxNjUxIiB5PSItMjY3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXFObU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzQwIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVxTm11ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1cU5tZWZYRWR1cUhvT0piVVJaUnciIHg9IjE4MTciIHk9IjEyMDMiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1cU5tLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzNDIiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXFObmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzVxTm51ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNXFObk9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXFObi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzNDAiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXFOb2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzVxTm91ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNXFOb09mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXFOby1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDM0MiI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1cU5wZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNXFOcHVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1cU5wT2ZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1cU5wLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzNDAiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXFOcWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNXFOcXVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1cU5xT2ZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c1cU5pZWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c1cU5pdWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzIyMTgsIDE4OTYsIC03ODkwLCA2NDY4XSRbMTE3MTcsIDE4OTYsIDE2MDgsIDY0NjhdJFsxMTcxNywgLTI2NDEsIDE2MDgsIDE5MzBdIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c1cU5xLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzNTMiIHNvdXJjZT0iX0c1cU5WZWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c1cU5JdWZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVxTnJ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVxTnNPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXFOc2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzVxTnItZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTI2MiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVxTnN1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDM1NiI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1cU50T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNXFOcy1mWEVkdXFIb09KYlVSWlJ3IiB4PSItMTM2MyIgeT0iLTI4OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVxTnRlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzNTYiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXFOdC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1cU50dWZYRWR1cUhvT0piVVJaUnciIHg9IjIxMiIgeT0iMjQ2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXFOdU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzNTQiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXFOdXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNXFOdWVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxMTA0IiB5PSIxNjgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1cU51LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzNTQiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXotSU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzVxTnZPZlhFZHVxSG9PSmJVUlpSdyIgeD0iNjI2IiB5PSIxMTEwIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXotSWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzU2Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzV6LUktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1ei1KT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzV6LUl1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzV6LUplZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzU0Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzV6LUotZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1ei1LT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzV6LUp1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzV6LUtlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzNTYiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXotSy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzV6LUxPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNXotS3VmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXotTGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzU0Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzV6LUwtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzV6LU1PZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNXotTHVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HNXFOck9mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HNXFOcmVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlsyMjE4LCA1OSwgLTc4OTAsIDQ2MzFdJFs5Nzg3LCA1OSwgLTMyMSwgNDYzMV0kWzk3ODcsIC0yNjQxLCAtMzIxLCAxOTMwXSIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HNXotTWVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzBEIiBzb3VyY2U9Il9HNWhEUmVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HNXFOVmVmWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1ei1OT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1ei1OdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzV6LU4tZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNXotTmVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXotT09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzEwIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzV6LU91ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1ei1PZWZYRWR1cUhvT0piVVJaUnciIHg9IjgyIiB5PSItNDA2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXotTy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDMxMCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1ei1QZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzV6LVBPZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTYwIiB5PSI1NzkiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1ei1QdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDMwRSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1ei1RT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1ei1QLWZYRWR1cUhvT0piVVJaUnciIHg9Ii0xMjciIHk9Ii0yMzkiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1ei1RZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzBFIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzV6LVEtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1ei1RdWZYRWR1cUhvT0piVVJaUnciIHg9Ijc2IiB5PSItMzQ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXotUk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzEwIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzV6LVJ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1ei1SLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzV6LVJlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzV6LVNPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzBFIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzV6LVN1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1ei1TLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzV6LVNlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzV6LVRPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzMTAiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXotVHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzV6LVQtZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNXotVGVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXotVU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzBFIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzV6LVV1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzV6LVUtZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNXotVWVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HNXotTXVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HNXotTS1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlsxMzUsIC01NTgsIDg0LCA0MDEzXSRbMTM1LCAtMjE2NywgODQsIDI0MDRdIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c1ei1kT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwMjAiIHNvdXJjZT0iX0c1ei1aT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c1ei1aT2ZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzV6LWQtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzV6LWVlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXotZXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzV6LWVPZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTIwNzMiIHk9IjI1NCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzV6LWUtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDAyMyI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1ei1mZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNXotZk9mWEVkdXFIb09KYlVSWlJ3IiB4PSIyMTUiIHk9IjI3NSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzV6LWZ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwMjMiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXotZ09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1ei1mLWZYRWR1cUhvT0piVVJaUnciIHg9IjE1MCIgeT0iLTg2NSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzV6LWdlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDIxIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzV6LWctZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzV6LWd1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTU5NCIgeT0iMjIzIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXotaE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDIxIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzV6LWh1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1ei1oZWZYRWR1cUhvT0piVVJaUnciIHg9Ii02NzEiIHk9Ii0xMTU3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXotaC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDIzIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzV6LWllZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1ei1pdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzV6LWlPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzV6LWktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDIxIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzV6LWplZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1ei1qdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzV6LWpPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzV6LWotZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwMjMiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXota2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzV6LWt1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNXota09mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXotay1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDIxIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzV6LWxlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzV6LWx1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNXotbE9mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HNXotZGVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HNXotZHVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlsyNTE0LCAtMTk1NSwgMjUxNCwgLTE5NTVdJFsyNTE0LCAtMzUyMiwgMjUxNCwgLTM1MjJdJFstOTIyLCAtMzUyMiwgLTkyMiwgLTM1MjJdJFstOTIyLCAtMTk1NSwgLTkyMiwgLTE5NTVdIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c1ei1sLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwMEMiIHNvdXJjZT0iX0c1ei1aT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c1ei1aT2ZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzV6LW11ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzV6LW5PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXotbmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzV6LW0tZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTc0OSIgeT0iLTgzMSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzV6LW51ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDAwRiI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1ei1vT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNXotbi1mWEVkdXFIb09KYlVSWlJ3IiB4PSItODE5IiB5PSItNDQ4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXotb2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDAwRiI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1ei1vLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzV6LW91ZlhFZHVxSG9PSmJVUlpSdyIgeD0iODMiIHk9IjMwNiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzV6LXBPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDBEIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzV6LXB1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzV6LXBlZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTk5IiB5PSItMjM3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXotcC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDBEIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzV6LXFlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1ei1xT2ZYRWR1cUhvT0piVVJaUnciIHg9IjE5MSIgeT0iMzQ0Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXotcXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDBGIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzV6LXJPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1ei1yZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzV6LXEtZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzV6LXJ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDBEIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzV6LXNPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1ei1zZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzV6LXItZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzV6LXN1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwMEYiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXotdE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzV6LXRlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNXotcy1mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNTl2SU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDBEIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzU5dkl1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzU5dkktZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNTl2SWVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HNXotbU9mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HNXotbWVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMjcwMCwgLTE5NTUsIC0yNzAwLCAtMTk1NV0kWy0yNzAwLCAtMjY3NSwgLTI3MDAsIC0yNjc1XSRbLTczODIsIC0yNjc1LCAtNzM4MiwgLTI2NzVdJFstNzM4MiwgLTg1NSwgLTczODIsIC04NTVdJFstMzI1MSwgLTg1NSwgLTMyNTEsIC04NTVdIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c1OXZKT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxN0UiIHNvdXJjZT0iX0c1cU5JdWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c1ei1aT2ZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzU5dkotZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzU5dktlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNTl2S3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzU5dktPZlhFZHVxSG9PSmJVUlpSdyIgeD0iMzYyIiB5PSItMjg4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNTl2Sy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTg4Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzU5dkxlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1OXZMT2ZYRWR1cUhvT0piVVJaUnciIHg9Ii0xNDgyIiB5PSItMzU2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNTl2THVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDE4OCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1OXZNT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzU5dkwtZlhFZHVxSG9PSmJVUlpSdyIgeD0iNDQwIiB5PSIyNDYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1OXZNZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDE3RiI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1OXZNLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1OXZNdWZYRWR1cUhvT0piVVJaUnciIHg9IjEzMjMiIHk9Ii0yNDEiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1OXZOT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxN0YiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNTl2TnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzU5dk5lZlhFZHVxSG9PSmJVUlpSdyIgeD0iNDU1IiB5PSIyMzciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1OXZOLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxODgiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNTl2T2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzU5dk91ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNTl2T09mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNTl2Ty1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxN0YiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNTl2UGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzU5dlB1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNTl2UE9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNTl2UC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDE4OCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1OXZRZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNTl2UXVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1OXZRT2ZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1OXZRLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxN0YiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNTl2UmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNTl2UnVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1OXZST2ZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c1OXZKZWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c1OXZKdWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0yMjE4LCA0NTcsIDE1NTYxLCA3NjJdJFstMTQ1MjgsIDQ1NywgMzI1MSwgNzYyXSIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HNTl2Ui1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTlDIiBzb3VyY2U9Il9HNXFOSXVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HNXotWk9mWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1OXZTdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1OXZUT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzU5dlRlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c1OXZTLWZYRWR1cUhvT0piVVJaUnciIHg9Ijg3MCIgeT0iLTI3OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzU5dlR1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDE5RiI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1OXZVT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNTl2VC1mWEVkdXFIb09KYlVSWlJ3IiB4PSItMTQ4MiIgeT0iLTMyOSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzU5dlVlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTlGIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzU5dlUtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNTl2VXVmWEVkdXFIb09KYlVSWlJ3IiB4PSItMzgyIiB5PSIyNjMiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1OXZWT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDE5RCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1OXZWdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1OXZWZWZYRWR1cUhvT0piVVJaUnciIHg9IjEyODkiIHk9Ii0yNDUiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1OXZWLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxOUQiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNTl2V2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzU5dldPZlhFZHVxSG9PSmJVUlpSdyIgeD0iNzc2IiB5PSIyODAiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1OXZXdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxOUYiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNTl2WE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzU5dlhlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNTl2Vy1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNTl2WHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxOUQiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNTl2WU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzU5dlllZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNTl2WC1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNTl2WXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDE5RiI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1OXZaT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNTl2WmVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1OXZZLWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1OXZadWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxOUQiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNTl2YU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNTl2YWVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1OXZaLWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c1OXZTT2ZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c1OXZTZWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0yMjE4LCAtMTEwMCwgMTU1NjEsIC03OTVdJFstMTQ1MjgsIC0xMTAwLCAzMjUxLCAtNzk1XSIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HNTl2YXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOb3RlQXR0YWNobWVudCIgc291cmNlPSJfRzVoRE1PZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzU5dlItZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkNvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HNTl2YS1mWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjAiLz4NCi0gICAgICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HNTl2Yk9mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlsxMTAsIDg3MiwgLTIwMywgLTEzMjldJFszMTMsIDIyMDEsIDAsIDBdIi8+DQotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HNTl2YmVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c1OXZidWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HNTl2Yi1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjI5IiBzb3VyY2U9Il9HNXotWk9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HNXFOVmVmWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1OXZjdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1OXZkT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzU5dmRlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c1OXZjLWZYRWR1cUhvT0piVVJaUnciIHg9IjUyOSIgeT0iLTMwNCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzU5dmR1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDIyQyI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1OXZlT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNTl2ZC1mWEVkdXFIb09KYlVSWlJ3IiB4PSItMzE4IiB5PSIyMjIiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1OXZlZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjJDIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzU5dmUtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNTl2ZXVmWEVkdXFIb09KYlVSWlJ3IiB4PSItNDU5IiB5PSItMTE5NCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzU5dmZPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjJBIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzU5dmZ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzU5dmZlZlhFZHVxSG9PSmJVUlpSdyIgeD0iNDE4IiB5PSItMjk1Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNTl2Zi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjJBIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzU5dmdlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1OXZnT2ZYRWR1cUhvT0piVVJaUnciIHg9Ii02MDciIHk9IjI2MyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzU5dmd1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDIyQyI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1OXZoT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNTl2aGVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1OXZnLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1OXZodWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDIyQSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1OXZpT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNTl2aWVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1OXZoLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1OXZpdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjJDIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzU5dmpPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1OXZqZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzU5dmktZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzU5dmp1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDIyQSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1OXZrT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1OXZrZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzU5dmotZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzU5dmNPZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzU5dmNlZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMjIxOCwgMTk1NSwgLTU0NTIsIC0yOTIxXSRbMjIxOCwgMzY5OSwgLTU0NTIsIC0xMTc2XSRbNTQ1MiwgMzY5OSwgLTIyMTgsIC0xMTc2XSIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HNTl2a3VmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjNEIiBzb3VyY2U9Il9HNXotWk9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HNXFOVmVmWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1OXZsZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1OXZsLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzU5dm1PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c1OXZsdWZYRWR1cUhvT0piVVJaUnciIHg9IjYyNyIgeT0iLTI3MSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzU5dm1lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDI0OCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1OXZtLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNTl2bXVmWEVkdXFIb09KYlVSWlJ3IiB4PSItMTI5OSIgeT0iLTI0NSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzU5dm5PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyNDgiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNTl2bnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1OXZuZWZYRWR1cUhvT0piVVJaUnciIHg9Ii0xMDE5IiB5PSIxIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNTl2bi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyNDYiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNTl2b2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNTl2b09mWEVkdXFIb09KYlVSWlJ3IiB4PSIxNjMxIiB5PSIyODEiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1OXZvdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyNDYiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNTl2cE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzU5dm8tZlhFZHVxSG9PSmJVUlpSdyIgeD0iNTA0IiB5PSIyNzEiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1OXZwZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyNDgiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNTl2cC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzU5dnFPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNTl2cHVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNTl2cWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyNDYiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNTl2cS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzU5dnJPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNTl2cXVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNTl2cmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDI0OCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1OXZyLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNTl2c09mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1OXZydWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1OXZzZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyNDYiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNTl2cy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNTl2dE9mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1OXZzdWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c1OXZrLWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c1OXZsT2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0yNjQ2LCAxOTU4LCAtMTAzMTgsIC0yOTEwXSRbLTI2NDYsIDU4MjEsIC0xMDMxOCwgOTUzXSRbNTQ1MCwgNTgyMSwgLTIyMjIsIDk1M10iLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzZHNUVPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDI1QiIgc291cmNlPSJfRzVxTlZlZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzV6LVpPZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNkc1RS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNkc1RmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2RzVGdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNkc1Rk9mWEVkdXFIb09KYlVSWlJ3IiB4PSItOTEwIiB5PSIyNTQiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2RzVGLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyNUUiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNkc1R2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzZHNUdPZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTEzOTkiIHk9IjE3NCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZHNUd1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyNUUiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNkc1SE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c2RzVHLWZYRWR1cUhvT0piVVJaUnciIHg9Ii02IiB5PSItMzE0Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNkc1SGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyNUMiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNkc1SC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNkc1SHVmWEVkdXFIb09KYlVSWlJ3IiB4PSI5NzYiIHk9IjE1MCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZHNUlPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDI1QyI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2RzVJdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNkc1SWVmWEVkdXFIb09KYlVSWlJ3IiB4PSI5MyIgeT0iOTc0Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNkc1SS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjVFIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZHNUplZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2RzVKdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzZHNUpPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZHNUotZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjVDIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZHNUtlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2RzVLdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzZHNUtPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZHNUstZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyNUUiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNkc1TGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzZHNUx1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNkc1TE9mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNkc1TC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjVDIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZHNU1lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzZHNU11ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNkc1TU9mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HNkc1RWVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HNkc1RXVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMjIyMiwgMzE4LCA1NDUwLCA1MTg2XSRbLTkwNDgsIDMxOCwgLTEzNzYsIDUxODZdJFstOTA0OCwgLTI5MTAsIC0xMzc2LCAxOTU4XSIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HNkc1TS1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE2RDc1QUEwMDRCIiBzb3VyY2U9Il9HNXFOVmVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HNXotWk9mWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2RzVOdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2RzVPT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZHNU9lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c2RzVOLWZYRWR1cUhvT0piVVJaUnciIHg9Ii0zNDMiIHk9IjI3MSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZHNU91ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNkQ3NUFCMDI5NSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2RzVQT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNkc1Ty1mWEVkdXFIb09KYlVSWlJ3IiB4PSItMTA2MiIgeT0iMjQ1Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNkc1UGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNkQ3NUFCMDI5NSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2RzVQLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzZHNVB1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMzI3IiB5PSItMjIwIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNkc1UU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTZENzVBQjAyODEiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNkc1UXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNkc1UWVmWEVkdXFIb09KYlVSWlJ3IiB4PSI4NDUiIHk9Ii0xMDYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2RzVRLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTZENzVBQjAyODEiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNkc1UmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzZHNVJPZlhFZHVxSG9PSmJVUlpSdyIgeD0iNjU2IiB5PSIxMDI0Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNkc1UnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE2RDc1QUIwMjk1Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZHNVNPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2RzVTZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzZHNVItZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZHNVN1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE2RDc1QUIwMjgxIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZHNVRPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2RzVUZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzZHNVMtZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZHNVR1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTZENzVBQjAyOTUiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNkc1VU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzZHNVVlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNkc1VC1mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNkc1VXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE2RDc1QUIwMjgxIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZHNVZPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzZHNVZlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNkc1VS1mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HNkc1Tk9mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HNkc1TmVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMjIxOCwgOCwgNTQ1MiwgNDg4NV0kWy03OTkyLCA4LCAtMzIxLCA0ODg1XSRbLTc5OTIsIC0yOTIxLCAtMzIxLCAxOTU1XSIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HNkc1VnVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwM0Q3IiBzb3VyY2U9Il9HNXotVk9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HNXotWk9mWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2RzVXZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2RzVXLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZHNVhPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNkc1V3VmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNkc1WGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwM0RBIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZHNVgtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c2RzVYdWZYRWR1cUhvT0piVVJaUnciIHg9Ii0yMTciIHk9IjQyOSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZHNVlPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzREEiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNkc1WXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c2RzVZZWZYRWR1cUhvT0piVVJaUnciIHg9Ii0yNjYiIHk9Ii0xMTcwIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNkc1WS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzRDgiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNkc1WmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNkc1Wk9mWEVkdXFIb09KYlVSWlJ3IiB4PSI1MzYiIHk9IjQ1NyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZHNVp1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzRDgiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNkc1YU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzZHNVotZlhFZHVxSG9PSmJVUlpSdyIgeD0iMjY0IiB5PSItMzQ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNkc1YWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwM0RBIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZHNWEtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2RzViT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzZHNWF1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZHNWJlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwM0Q4Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZHNWItZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2RzVjT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzZHNWJ1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZHNWNlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzREEiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNkc1Yy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzZHNWRPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNkc1Y3VmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNkc1ZGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwM0Q4Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZHNWQtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzZHNWVPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNkc1ZHVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HNkc1Vi1mWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c2RzVXT2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzAsIC01NjcsIC02ODU4LCA0MDA0XSRbMzMsIC0yMjk0LCAtNjgyNCwgMjI3N10kWzM1OTgsIC0zNDk2LCAtMzI1OSwgMTA3NV0iLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgPC9jb250ZW50cz4NCi0gICAgICAgICAgICA8Y29udGVudHMgeG1pOnR5cGU9Im5vdGF0aW9uOkRpYWdyYW0iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxMUM0Q0M1MDI2MCIgdHlwZT0iQ2xhc3MiIG5hbWU9IkRlc2NyaXB0b3JSZWxhdGlvbnNoaXBzIChzaW1wbGlmaWVkKSI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZRcUVPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDA4QiI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNlFxRS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzZRcUZPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZRcUZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZRcUZ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZRcUYtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNlFxR09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNlFxR2VmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNlFxR3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNlFxRy1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNlFxSE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNlFxSGVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNlFxSHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzZRcUgtZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HNlFxRWVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNlFxRXVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxNTcwNSIgeT0iMjQ5NyIgd2lkdGg9IjMyMzQiIGhlaWdodD0iMTIwMiIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNlFxSU9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDQ1Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2UXFJLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HNlFxSk9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNlFxSmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNlFxSnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNlFxSi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2UXFLT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2UXFLZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2UXFLdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2UXFLLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2UXFMT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2UXFMZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2UXFMdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNlFxTC1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c2UXFJZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c2UXFJdWZYRWR1cUhvT0piVVJaUnciIHg9IjYwMSIgeT0iMjM3MCIgd2lkdGg9IjQ3OTIiIGhlaWdodD0iMTc2MSIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNlFxZHVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDA5Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2UXFlZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HNlFxZXVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNlFxZS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNlFxZk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNlFxZmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2UXFmdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2UXFmLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2YWJFT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2YWJFZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2YWJFdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2YWJFLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2YWJGT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNmFiRmVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c2UXFkLWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c2UXFlT2ZYRWR1cUhvT0piVVJaUnciIHg9Ijg3NzkiIHk9IjYzMjQiIHdpZHRoPSIzMzY5IiBoZWlnaHQ9IjE3NzgiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxEaWFncmFtU3R5bGUiIHhtaTppZD0iX0dsWk5VZWZYRWR1cUhvT0piVVJaUnciIGRlc2NyaXB0aW9uPSJUaGlzIGRpYWdyYW0gcHJvdmlkZXMgYSBzaW1wbGlmaWVkIG92ZXJ2aWV3IG9mIHRoZSBkaWZmZXJlbnQgRGVzY3JpcHRvciB0eXBlcyBkZWZpbmVkIGluIHRoaXMgUHJvY2VzcyBwYWNrYWdlIGFuZCB0aGVpciByZWxhdGlvbnNoaXBzIG5vdCBzaG93aW5nIGNsYXNzIGF0dHJpYnV0ZXMgb3IgYXNzb2NpYXRpb24gcm9sZXMuIi8+DQotICAgICAgICAgICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzZRcU1PZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDE3RSIgc291cmNlPSJfRzZRcUVPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzZRcUlPZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNlFxTS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNlFxTmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2UXFOdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNlFxTk9mWEVkdXFIb09KYlVSWlJ3IiB4PSIxMjciIHk9IjI1NCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZRcU4tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDE4OCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2UXFPZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNlFxT09mWEVkdXFIb09KYlVSWlJ3IiB4PSItMTEyNCIgeT0iLTI4OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZRcU91ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTg4Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZRcVBPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNlFxTy1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMzk3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNlFxUGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxN0YiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNlFxUC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNlFxUHVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxMjA5IiB5PSItNDQ5Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNlFxUU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDE3RiI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2UXFRdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNlFxUWVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMzk3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNlFxUS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTg4Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZRcVJlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2UXFSdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzZRcVJPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZRcVItZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTdGIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZRcVNlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2UXFTdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzZRcVNPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZRcVMtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxODgiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNlFxVGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzZRcVR1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNlFxVE9mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNlFxVC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTdGIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZRcVVlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzZRcVV1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNlFxVU9mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HNlFxTWVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HNlFxTXVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMTYxNywgOTMsIDEyNzA4LCAtNTldJFstMTE5MjksIDkzLCAyMzk2LCAtNTldIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c2UXFVLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxOUMiIHNvdXJjZT0iX0c2UXFFT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c2UXFJT2ZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZRcVZ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZRcVdPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNlFxV2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzZRcVYtZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTgyIiB5PSIyNzkiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2UXFXdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxOUYiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNlFxWE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzZRcVctZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTYyNiIgeT0iLTUyNSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZRcVhlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTlGIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZRcVgtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNlFxWHVmWEVkdXFIb09KYlVSWlJ3IiB4PSItNzk1IiB5PSIzNDciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2UXFZT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDE5RCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2UXFZdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c2UXFZZWZYRWR1cUhvT0piVVJaUnciIHg9IjEwNTAiIHk9Ii0xMDA3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNlFxWS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDE5RCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2UXFaZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNlFxWk9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMzk3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNlFxWnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTlGIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZRcWFPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2UXFhZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzZRcVotZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZRcWF1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTlEIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZRcWJPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2UXFiZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzZRcWEtZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZRcWJ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxOUYiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNlFxY09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzZRcWNlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNlFxYi1mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNlFxY3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTlEIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZRcWRPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzZRcWRlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNlFxYy1mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HNlFxVk9mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HNlFxVmVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstNDY1LCAtNjAxLCAxMzg1OSwgLTc1M10kWy00NjUsIC0xOTMwLCAxMzg1OSwgLTIwODJdJFstMTM5NjEsIC0xOTMwLCAzNjQsIC0yMDgyXSRbLTEzOTYxLCAtNzI4LCAzNjQsIC04ODBdIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c2YWJGdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzMjEiIHNvdXJjZT0iX0c2UXFkdWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c2UXFFT2ZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZhYkdlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZhYkctZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmFiSE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzZhYkd1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTExMjIiIHk9IjI2MiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZhYkhlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDMyQiI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2YWJILWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNmFiSHVmWEVkdXFIb09KYlVSWlJ3IiB4PSItODI3IiB5PSI5MDYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2YWJJT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDMyQiI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2YWJJdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzZhYkllZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTM5NyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZhYkktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzIyIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZhYkplZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzZhYkpPZlhFZHVxSG9PSmJVUlpSdyIgeD0iNzA5IiB5PSIyMTIiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2YWJKdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzIyIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZhYktPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c2YWJKLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0zOTciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2YWJLZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzMkIiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmFiSy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzZhYkxPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNmFiS3VmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmFiTGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzMjIiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmFiTC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzZhYk1PZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNmFiTHVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmFiTWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDMyQiI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2YWJNLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNmFiTk9mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c2YWJNdWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2YWJOZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzMjIiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmFiTi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNmFiT09mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c2YWJOdWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c2YWJGLWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c2YWJHT2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzE2ODQsIC04MjEsIC01MTczLCAzMjkzXSRbNTQ2OSwgLTgyMSwgLTEzODgsIDMyOTNdJFs1NDY5LCAtMzUxMywgLTEzODgsIDYwMV0iLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzZhYk9lZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDMzRiIgc291cmNlPSJfRzZRcWR1ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzZRcUVPZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmFiUE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmFiUHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2YWJQLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNmFiUGVmWEVkdXFIb09KYlVSWlJ3IiB4PSI0MDAiIHk9IjI5NSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZhYlFPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDM0MiI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2YWJRdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNmFiUWVmWEVkdXFIb09KYlVSWlJ3IiB4PSItMTQyNCIgeT0iMzU2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmFiUS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzNDIiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmFiUmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c2YWJST2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0zOTciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2YWJSdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDM0MCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2YWJTT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c2YWJSLWZYRWR1cUhvT0piVVJaUnciIHg9IjEzMTQiIHk9Ii0xNjgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2YWJTZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzQwIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZhYlMtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c2YWJTdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0zOTciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2YWJUT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzNDIiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmFiVHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzZhYlQtZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNmFiVGVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmFiVU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzNDAiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmFiVXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzZhYlUtZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNmFiVWVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmFiVk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDM0MiI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2YWJWdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNmFiVi1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c2YWJWZWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2YWJXT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzNDAiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmFiV3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNmFiVy1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c2YWJXZWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c2YWJPdWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c2YWJPLWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzE2ODQsIDY2MCwgLTUxNzMsIDQ3NzVdJFs4MDg1LCA2NjAsIDEyMjcsIDQ3NzVdJFs4MDg1LCAtMzUxMywgMTIyNywgNjAxXSIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HNmFiWE9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzUzIiBzb3VyY2U9Il9HNlFxZHVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HNlFxRU9mWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2YWJYLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2YWJZZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZhYll1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c2YWJZT2ZYRWR1cUhvT0piVVJaUnciIHg9Ii04OTUiIHk9IjM4NyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZhYlktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDM1NiI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2YWJaZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNmFiWk9mWEVkdXFIb09KYlVSWlJ3IiB4PSItMTEzNyIgeT0iLTk0MCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZhYlp1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzU2Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZhYmFPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNmFiWi1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMzk3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmFiYWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzNTQiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmFiYS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNmFiYXVmWEVkdXFIb09KYlVSWlJ3IiB4PSI5ODUiIHk9IjM5MSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZhYmJPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzNTQiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmFiYnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzZhYmJlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTM5NyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZhYmItZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDM1NiI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2YWJjZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNmFiY3VmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c2YWJjT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2YWJjLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDM1NCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2YWJkZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNmFiZHVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c2YWJkT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2YWJkLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzU2Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZhYmVlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2YWJldWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzZhYmVPZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZhYmUtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDM1NCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2YWJmZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2YWJmdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzZhYmZPZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzZhYlhlZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzZhYlh1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMTY4NCwgLTExOCwgLTUxNzMsIDM5OTZdJFs1ODMzLCAtMTE4LCAtMTAyNCwgMzk5Nl0kWzY1NDQsIC01OSwgLTMxMywgNDA1NV0kWzY1NDQsIC0zNTEzLCAtMzEzLCA2MDFdIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c2YWJmLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyMjkiIHNvdXJjZT0iX0c2UXFJT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c2UXFkdWZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZhYmd1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZhYmhPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmFiaGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzZhYmctZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTM5OCIgeT0iLTI0NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZhYmh1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDIyQyI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2YWJpT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNmFiaC1mWEVkdXFIb09KYlVSWlJ3IiB4PSItMjk2IiB5PSItNjc3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmFiaWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyMkMiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmFiaS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c2YWJpdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0zOTciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2YWJqT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDIyQSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2YWJqdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c2YWJqZWZYRWR1cUhvT0piVVJaUnciIHg9IjgxMyIgeT0iLTIxMiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZhYmotZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyMkEiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmFia2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzZhYmtPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTM5NyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZhYmt1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDIyQyI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2YWJsT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNmFibGVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c2YWJrLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2YWJsdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDIyQSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2YWJtT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNmFibWVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c2YWJsLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2YWJtdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjJDIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZhYm5PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2YWJuZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzZhYm0tZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZhYm51ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDIyQSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2YWJvT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2YWJvZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzZhYm4tZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzZhYmdPZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzZhYmdlZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMTYzNCwgODgwLCAtNTgzMywgLTMwODFdJFsxNjM0LCAxODcxLCAtNTgzMywgLTIwOTFdJFs2NzIyLCAxODcxLCAtNzQ1LCAtMjA5MV0kWzY3MjIsIDMwNzMsIC03NDUsIC04ODldIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c2YWJvdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyM0QiIHNvdXJjZT0iX0c2UXFJT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c2UXFkdWZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZhYnBlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZhYnAtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmFicU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzZhYnB1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTExNiIgeT0iLTI2MiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZhYnFlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDI0OCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2amxBT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNmFicXVmWEVkdXFIb09KYlVSWlJ3IiB4PSItMTMxNiIgeT0iLTEzNSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZqbEFlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjQ4Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZqbEEtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNmpsQXVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMzk3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmpsQk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyNDYiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmpsQnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNmpsQmVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxNTE5IiB5PSItMzEzIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmpsQi1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDI0NiI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2amxDZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNmpsQ09mWEVkdXFIb09KYlVSWlJ3IiB5PSItMzk3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmpsQ3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjQ4Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZqbERPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2amxEZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzZqbEMtZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZqbER1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjQ2Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZqbEVPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2amxFZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzZqbEQtZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZqbEV1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyNDgiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmpsRk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzZqbEZlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNmpsRS1mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmpsRnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjQ2Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZqbEdPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzZqbEdlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNmpsRi1mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HNmFiby1mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HNmFicE9mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMTk0NywgODgwLCAtOTQxNCwgLTMwODFdJFstMTk0NywgNDQ2MSwgLTk0MTQsIDQ5OV0kWzEzNSwgNDQzNiwgLTczMzIsIDQ3NF0kWzU3ODIsIDQ0MzYsIC0xNjg0LCA0NzRdIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c2amxHdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyNUIiIHNvdXJjZT0iX0c2UXFkdWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c2UXFJT2ZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZqbEhlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZqbEgtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmpsSU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzZqbEh1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTY3MyIgeT0iMzA1Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmpsSWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjVFIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZqbEktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c2amxJdWZYRWR1cUhvT0piVVJaUnciIHg9Ii0xMjAzIiB5PSIyNzEiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2amxKT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDI1RSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2amxKdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzZqbEplZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTM5NyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZqbEotZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjVDIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZqbEtlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzZqbEtPZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTE1MyIgeT0iMTg3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmpsS3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDI1QyI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2amxMT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNmpsSy1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMzk3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmpsTGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjVFIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZqbEwtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2amxNT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzZqbEx1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZqbE1lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjVDIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZqbE0tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2amxOT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzZqbE11ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZqbE5lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyNUUiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmpsTi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzZqbE9PZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNmpsTnVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmpsT2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjVDIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZqbE8tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzZqbFBPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNmpsT3VmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HNmpsRy1mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HNmpsSE9mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMTY4NCwgLTMzOCwgNTc4MiwgMzYyM10kWy04MzgyLCAtMzM4LCAtOTE0LCAzNjIzXSRbLTgzODIsIC0zMDgxLCAtOTE0LCA4ODBdIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c2amxQZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTZENzVBQTAwNEIiIHNvdXJjZT0iX0c2UXFkdWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c2UXFJT2ZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZqbFFPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZqbFF1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmpsUS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzZqbFFlZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTQwMyIgeT0iMzA1Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmpsUk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE2RDc1QUIwMjk1Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZqbFJ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c2amxSZWZYRWR1cUhvT0piVVJaUnciIHg9Ii05NzUiIHk9Ii0yMTEiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2amxSLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNkQ3NUFCMDI5NSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2amxTZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzZqbFNPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTM5NyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZqbFN1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE2RDc1QUIwMjgxIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZqbFRPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzZqbFMtZlhFZHVxSG9PSmJVUlpSdyIgeD0iODMwIiB5PSIyMTEiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2amxUZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE2RDc1QUIwMjgxIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZqbFQtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c2amxUdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0zOTciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2amxVT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTZENzVBQjAyOTUiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmpsVXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzZqbFUtZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNmpsVWVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmpsVk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTZENzVBQjAyODEiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmpsVnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzZqbFYtZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNmpsVmVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmpsV09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNkQ3NUFCMDI5NSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2amxXdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNmpsVy1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c2amxXZWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2amxYT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTZENzVBQjAyODEiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmpsWHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNmpsWC1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c2amxYZWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c2amxQdWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c2amxQLWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0xNDczLCAtODg5LCA1OTk0LCAzMDczXSRbLTE0NzMsIC0xMjYxLCA1OTk0LCAyNzAwXSRbLTY5NTksIC0xMjYxLCA1MDgsIDI3MDBdJFstNjk1OSwgLTMwODEsIDUwOCwgODgwXSIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICA8L2NvbnRlbnRzPg0KLSAgICAgICAgICAgIDxjb250ZW50cyB4bWk6dHlwZT0ibm90YXRpb246RGlhZ3JhbSIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDFFNzkwNTQwMjI1IiB0eXBlPSJDbGFzcyIgbmFtZT0iQWN0aXZpdHkiPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2amxZT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwRUYiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZqbFktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c2amxaT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSI2ODkxIiBoZWlnaHQ9IjI0MjEiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2amxaZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2amxadWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2amxaLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZqbGFPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNmpsYWVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmpsYXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNmpsYS1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmpsYk9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNmpsYmVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNnRXQU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzZ0V0FlZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HNmpsWWVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9Ik5vbmUiIHNob3dMaXN0VmlzaWJpbGl0eT0iTm9uZSIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNmpsWXVmWEVkdXFIb09KYlVSWlJ3IiB4PSI2NzE0IiB5PSIxNTgzIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2dFdBdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RDAzRDMiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZ0V0JlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c2dFdCdWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxNTc0IiBoZWlnaHQ9IjkwNSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZ0V0ItZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZ0V0NPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZ0V0NlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNnRXQ3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNnRXQy1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNnRXRE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNnRXRGVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNnRXRHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNnRXRC1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNnRXRU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzZ0V0VlZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HNnRXQS1mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNnRXQk9mWEVkdXFIb09KYlVSWlJ3IiB4PSI2NjI5IiB5PSI3MjcyIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2dFdOZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RDAzQ0IiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZ0V09PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c2dFdPZWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxNjU5IiBoZWlnaHQ9IjkwNSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZ0V091ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZ0V08tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZ0V1BPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNnRXUGVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNnRXUHVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNnRXUC1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNnRXUU9mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNnRXUWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNnRXUXVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNnRXUS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzZ0V1JPZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HNnRXTnVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNnRXTi1mWEVkdXFIb09KYlVSWlJ3IiB4PSI3ODA2IiB5PSI5MTAxIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2dFdUdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RDAzQ0EiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZ0V1VlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c2dFdVdWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2dFdVLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2dFdWT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2dFdWZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZ0V1Z1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzZ0V1YtZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZ0V1dPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzZ0V1dlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZ0V1d1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzZ0V1ctZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZ0V1hPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2dFdYZWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzZ0V1QtZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzZ0V1VPZlhFZHVxSG9PSmJVUlpSdyIgeD0iNjE0NiIgeT0iOTEwMSIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNnRXWi1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTkyNTQwMjI3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2dFdhdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HNnRXYS1mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iNDI1MCIgaGVpZ2h0PSI5MDUiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2dFdiT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2dFdiZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2dFdidWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZ0V2ItZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzZ0V2NPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZ0V2NlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzZ0V2N1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZ0V2MtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzZ0V2RPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZ0V2RlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2dFdkdWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzZ0V2FPZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzZ0V2FlZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTgxOSIgeT0iNTAzNSIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNnRXaWVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTgyRDMwMTdGIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2dFdqT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HNnRXamVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMzY5MSIgaGVpZ2h0PSIxMDMyIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNnRXanVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNnRXai1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNnRXa09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2dFdrZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2dFdrdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2dFdrLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2dFdsT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2dFdsZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2dFdsdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2dFdsLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNnRXbU9mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c2dFdpdWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c2dFdpLWZYRWR1cUhvT0piVVJaUnciIHg9IjY2ODgiIHk9IjUwNzIiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxEaWFncmFtU3R5bGUiIHhtaTppZD0iX0dsWk5VLWZYRWR1cUhvT0piVVJaUnciIGRlc2NyaXB0aW9uPSJUaGlzIGRpYWdyYW0gc2hvd3Mga2V5IGF0dHJpYnV0ZXMgYW5kIHJlbGF0aW9uc2hpcHMgZGVmaW5lZCBmb3IgQWN0aXZpdHkgaW4gdGhlIFByb2Nlc3MgQnJlYWtkb3duIHBhY2thZ2UuICBPbmUgY2FuIHNlZSB0aGF0IHRoZSBjb25jZXB0cyBvZiBQaGFzZSBhbmQgSXRlcmF0aW9uIGhhdmUgYmVlbiBkZWZpbmVkIGFzIHNwZWNpYWwgQWN0aXZpdGllcy4gIi8+DQotICAgICAgICAgICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzZ0V0V1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRTBGRkQzMDBFRiIgc291cmNlPSJfRzZqbFlPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzZ0V0F1ZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNnRXRmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNnRXRi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2dFdHT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNnRXRnVmWEVkdXFIb09KYlVSWlJ3IiB4PSItNzQ5IiB5PSIxNTkyIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNnRXR2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFMEZGRDMwMEYxIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZ0V0ctZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c2dFdHdWZYRWR1cUhvT0piVVJaUnciIHg9Ii00NzkiIHk9Ii0yNDgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2dFdIT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFMEZGRDMwMEYxIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZ0V0h1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNnRXSGVmWEVkdXFIb09KYlVSWlJ3IiB4PSItNTM5IiB5PSIxNjkyIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNnRXSC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUUwRkZEMzAwRjAiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNnRXSWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNnRXSU9mWEVkdXFIb09KYlVSWlJ3IiB4PSI1MzYiIHk9IjE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZ0V0l1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRTBGRkQzMDBGMCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2dFdKT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNnRXSS1mWEVkdXFIb09KYlVSWlJ3IiB4PSItNDE0IiB5PSItMzQwIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNnRXSmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFMEZGRDMwMEYxIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZ0V0otZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2dFdLT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzZ0V0p1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZ0V0tlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFMEZGRDMwMEYwIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZ0V0stZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2dFdMT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzZ0V0t1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZ0V0xlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUUwRkZEMzAwRjEiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNnRXTC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzZ0V01PZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNnRXTHVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNnRXTWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFMEZGRDMwMEYwIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZ0V00tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzZ0V05PZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNnRXTXVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HNnRXRS1mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HNnRXRk9mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlsxODUyLCAxMDU4LCAzNzA0LCAtMzg5MF0kWzE4NTIsIDUwMDEsIDM3MDQsIDUzXSRbLTkyNiwgNTAwMSwgOTI2LCA1M10iLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzZ0V1JlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDJBMCIgc291cmNlPSJfRzZ0V05lZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzZ0V0F1ZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNnRXU09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNnRXU3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2dFdTLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzZ0V1NlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzZ0V1J1ZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HNnRXUi1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMzA0LCAtNDU3LCA5MTQsIDEzNzFdJFstOTIyLCAtMTM4MCwgMjk2LCA0NDhdIi8+DQotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HNnRXVE9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c2dFdUZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HNnRXWHVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMjlGIiBzb3VyY2U9Il9HNnRXVHVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HNnRXQXVmWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2dFdZZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2dFdZLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZ0V1pPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNnRXWXVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HNnRXWC1mWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c2dFdZT2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzMwNCwgLTQ1NywgLTk2NSwgMTM3MV0kWzk0OCwgLTEzODAsIC0zMjEsIDQ0OF0iLz4NCi0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c2dFdaZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzZ0V1p1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c2dFdkLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBOTI4MjAzOTIiIHNvdXJjZT0iX0c2dFdBdWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c2dFdaLWZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZ0V2V1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZ0V2ZPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNnRXZmVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c2dFdlLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c2dFdlT2ZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c2dFdlZWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy05NTMsIDUzLCAyNTEzLCAyMjc2XSRbLTQ0NDUsIDUzLCAtOTc5LCAyMjc2XSRbLTQ0NDUsIC0xOTA1LCAtOTc5LCAzMThdIi8+DQotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HNnRXZnVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c2dFdmLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HNnRXZ09mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI4Q0QzMjMwMTlBIiBzb3VyY2U9Il9HNnRXWi1mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HNmpsWU9mWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2dFdnLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2dFdoZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZ0V2h1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNnRXaE9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HNnRXZ2VmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HNnRXZ3VmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlsxMjcsIC00NDgsIC01NjY0LCAyMjk0XSRbMTI3LCAtMjYyNCwgLTU2NjQsIDExOF0kWzIzNDUsIC0yNjI0LCAtMzQ0NSwgMTE4XSIvPg0KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzZ0V2gtZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HNnRXaU9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzZ0V21lZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyOENEMzI5MDFGRCIgc291cmNlPSJfRzZ0V0F1ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzZ0V2llZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNnRXbk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNnRXbnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2dFduLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzZ0V25lZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzZ0V211ZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzZ0V20tZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMjUsIC00NTcsIC0xMDkyLCAxNzI3XSRbMjUsIC0xNjY3LCAtMTA5MiwgNTE2XSIvPg0KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzYyZjhPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HNjJmOGVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgPC9jb250ZW50cz4NCi0gICAgICAgICAgICA8Y29udGVudHMgeG1pOnR5cGU9Im5vdGF0aW9uOkRpYWdyYW0iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyN0E5MkQ0MDA3RSIgdHlwZT0iQ2xhc3MiIG5hbWU9IldvcmtEZWZpbml0aW9uQW5kQnJlYWtkb3duIj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNjJmOHVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTkyNTQwMjI3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2MmY5ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HNjJmOXVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iNTE2NCIgaGVpZ2h0PSIyMDY1Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNjJmOS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNjJmLU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNjJmLWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2MmYtdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzYyZi0tZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzYyZl9PZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzYyZl9lZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzYyZl91ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzYyZl8tZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzYyZ0FPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2MmdBZWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzYyZjgtZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9Ik5vbmUiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzYyZjlPZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTU4MDciIHk9IjExODcwIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2MmdBdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwRTYiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzYyZ0JlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c2MmdCdWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSI3MzgyIiBoZWlnaHQ9IjExODUiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2MmdCLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2MmdDT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2MmdDZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzYyZ0N1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNjJnQy1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNjJnRE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNjJnRGVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNjJnRHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNjJnRC1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNjJnRU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzYyZ0VlZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HNjJnQS1mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNjJnQk9mWEVkdXFIb09KYlVSWlJ3IiB4PSI1MTk4IiB5PSIxMTg1MyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNjJnRXVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDA5Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2MmdGZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HNjJnRnVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMjcyNiIgaGVpZ2h0PSIxMTAwIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNjJnRi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNjJnR09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNjJnR2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2MmdHdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzYyZ0ctZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzYyZ0hPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzYyZ0hlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzYyZ0h1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzYyZ0gtZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzYyZ0lPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2MmdJZWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzYyZ0UtZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzYyZ0ZPZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTI2MzAiIHk9IjE1MzI0Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2MmdJdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwNDUiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzYyZ0plZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c2MmdKdWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSI0MzE4IiBoZWlnaHQ9IjE2MjUiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2MmdKLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2MmdLT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2MmdLZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzYyZ0t1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNjJnSy1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNjJnTE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNjJnTGVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNjJnTHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNjJnTC1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNjJnTU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzYyZ01lZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HNjJnSS1mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNjJnSk9mWEVkdXFIb09KYlVSWlJ3IiB4PSI0Njk5IiB5PSIxNTI5MCIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNjJnTXVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDhCIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2MmdOZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HNjJnTnVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMjY3NSIgaGVpZ2h0PSIxMTAwIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNjJnTi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNjJnT09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNjJnT2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2MmdPdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzYyZ08tZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzYyZ1BPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzYyZ1BlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzYyZ1B1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzYyZ1AtZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzYyZ1FPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2MmdRZWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzYyZ00tZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzYyZ05PZlhFZHVxSG9PSmJVUlpSdyIgeD0iOTM2MiIgeT0iMTUyOTkiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzYyZ1F1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDA2MyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNjJnUmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzYyZ1J1ZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjIyMzUiIGhlaWdodD0iMTEwMCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzYyZ1ItZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzYyZ1NPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzYyZ1NlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNjJnU3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2MmdTLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2MmdUT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2MmdUZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2MmdUdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2MmdULWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2MmdVT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNjJnVWVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c2MmdRLWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c2MmdST2ZYRWR1cUhvT0piVVJaUnciIHg9IjE5NjgiIHk9IjE1Mjk5Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3QVE4T2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBODJEMzAxN0YiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdBUTgtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c3QVE5T2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIzNTIyIiBoZWlnaHQ9IjE1MjQiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3QVE5ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3QVE5dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3QVE5LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdBUS1PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN0FRLWVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0FRLXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN0FRLS1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0FRX09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN0FRX2VmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0FRX3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzdBUV8tZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HN0FROGVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIxMjYzMjI1NiIgc2hvd1BhcmVudD0iTmFtZSIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzdBUTh1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTczMzkiIHk9IjUwODAiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdBUkFPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI4MCI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0FSQS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzdBUkJPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjI4NDQiIGhlaWdodD0iMTA2NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdBUkJlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdBUkJ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdBUkItZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0FSQ09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN0FSQ2VmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0FSQ3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN0FSQy1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0FSRE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN0FSRGVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0FSRHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzdBUkQtZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HN0FSQWVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIxMjYzMjI1NiIgc2hvd1BhcmVudD0iTmFtZSIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzdBUkF1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTMzNjAiIHk9IjkzOSIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0FSR2VmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI4M0U4QTEwMzQxIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3QVJIT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HN0FSSGVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMjk5NyIgaGVpZ2h0PSIxMTE3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0FSSHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0FSSC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0FSSU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3QVJJZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzdBUkl1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdBUkktZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzdBUkpPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdBUkplZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzdBUkp1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdBUkotZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3QVJLT2ZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzdBUkd1ZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzdBUkctZlhFZHVxSG9PSmJVUlpSdyIgeD0iNzc0NyIgeT0iNTM4NCIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0FSS2VmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMEVGIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3QVJMT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HN0FSTGVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iNjg3NCIgaGVpZ2h0PSIyNTA2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0FSTHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0FSTC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0FSTU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3QVJNZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzdBUk11ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdBUk0tZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzdBUk5PZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdBUk5lZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzdBUk51ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdBUk4tZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3QVJPT2ZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzdBUkt1ZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9Ik5vbmUiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzdBUkstZlhFZHVxSG9PSmJVUlpSdyIgeD0iNTc1NyIgeT0iNzg0MCIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0FST2VmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUQwM0QzIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3QVJQT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HN0FSUGVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTU1NyIgaGVpZ2h0PSIxMTE3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0FSUHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0FSUC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0FSUU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3QVJRZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzdBUlF1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdBUlEtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzdBUlJPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdBUlJlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzdBUlJ1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdBUlItZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3QVJTT2ZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzdBUk91ZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzdBUk8tZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTg5MzEiIHk9Ijg1MzQiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdLQjh1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyOTRFQjkwMDBGQyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0tCOWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzdLQjl1ZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjQ3MDciIGhlaWdodD0iMTU1NyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdLQjktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdLQi1PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdLQi1lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0tCLXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3S0ItLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3S0JfT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3S0JfZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3S0JfdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3S0JfLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3S0NBT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN0tDQWVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c3S0I4LWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iTm9uZSIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjEyNjMyMjU2IiBzaG93UGFyZW50PSJOYW1lIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HN0tCOU9mWEVkdXFIb09KYlVSWlJ3IiB4PSI5Njg1IiB5PSIyOTI5Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3S0NGT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwMzEiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdLQ0YtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c3S0NHT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxOTMwIiBoZWlnaHQ9IjExMTciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3S0NHZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3S0NHdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3S0NHLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdLQ0hPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN0tDSGVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0tDSHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN0tDSC1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0tDSU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN0tDSWVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0tDSXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzdLQ0ktZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HN0tDRmVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HN0tDRnVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxNzAyNyIgeT0iMTUzNDIiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxEaWFncmFtU3R5bGUiIHhtaTppZD0iX0dsaS1VZWZYRWR1cUhvT0piVVJaUnciIGRlc2NyaXB0aW9uPSJUaGlzIGRpYWdyYW0gcHJvdmlkZSBhIGdlbmVyYWwgb3ZlcnZpZXcgdG8gdGhlIHRheG9ub215IGRlZmluZWQgaW4gUHJvY2VzcyBCcmVha2Rvd24gcHJlc2VudGluZyB0aGUgdHdvIGtleSBhYnN0cmFjdGlvbnMgUHJvY2VzcyBXb3JrIERlZmluaXRpb24gYW5kIEJyZWFrZG93biBFbGVtZW50IHdpdGggdGhlaXIgbW9zdCBpbXBvcnRhbnQgc3ViLWNsYXNzZXMuIi8+DQotICAgICAgICAgICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzdBUkVPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E4MkYzMDI2RSIgc291cmNlPSJfRzdBUThPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzdBUkFPZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0FSRS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0FSRmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3QVJGdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzdBUkZPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzdBUkVlZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSIxMjYzMjI1NiIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzdBUkV1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTc2MiwgLTc3MCwgMzU1NiwgMzU5OF0kWy0zNzkzLCAtMzgzNSwgNTI0LCA1MzNdIi8+DQotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HN0FSRi1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c3QVJHT2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HN0FSU2VmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFMEZGRDMwMEVGIiBzb3VyY2U9Il9HN0FSS2VmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HN0FST2VmWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3QVJUT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3QVJUdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdBUlQtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c3QVJUZWZYRWR1cUhvT0piVVJaUnciIHg9Ii02NSIgeT0iMzQ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0FSVU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFMEZGRDMwMEYxIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdBUlV1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c3QVJVZWZYRWR1cUhvT0piVVJaUnciIHg9Ii03NTgiIHk9IjMwNSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdBUlUtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUUwRkZEMzAwRjEiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0FSVmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c3QVJWT2ZYRWR1cUhvT0piVVJaUnciIHg9Ijg3NiIgeT0iLTI0NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdBUlZ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFMEZGRDMwMEYwIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdBUldPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzdBUlYtZlhFZHVxSG9PSmJVUlpSdyIgeD0iODI5IiB5PSItMjYwIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0FSV2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFMEZGRDMwMEYwIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdBUlctZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c3QVJXdWZYRWR1cUhvT0piVVJaUnciIHg9Ii04OCIgeT0iMzU3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0FSWE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFMEZGRDMwMEYxIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdBUlh1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3QVJYLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzdBUlhlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdBUllPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFMEZGRDMwMEYwIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdBUll1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3QVJZLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzdBUlllZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdBUlpPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUUwRkZEMzAwRjEiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0FSWnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzdBUlotZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HN0FSWmVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0FSYU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFMEZGRDMwMEYwIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdBUmF1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzdBUmEtZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HN0FSYWVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HN0FSU3VmWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c3QVJTLWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzM0MzcsIDAsIC03MDc4LCAwXSRbOTcyOCwgMCwgLTc4NywgMF0iLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzdBUmJPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E5MjgyMDM5MiIgc291cmNlPSJfRzdBUk9lZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzYyZjh1ZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0FSYi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0FSY2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3QVJjdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzdBUmNPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzdBUmJlZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzdBUmJ1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTExOCwgNTUwLCAxMjAyLCAtMzI1OV0kWy0xMTgsIDI3NjgsIDEyMDIsIC0xMDQxXSIvPg0KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzdBUmMtZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HN0FSZE9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzdBUmRlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyOENEMzI5MDFGRCIgc291cmNlPSJfRzdBUk9lZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzdBUThPZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0FSZU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0FSZXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3QVJlLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzdBUmVlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzdBUmR1ZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzdBUmQtZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbOCwgLTU1OCwgNjE4LCAyNjkyXSRbOCwgLTI0ODksIDYxOCwgNzYyXSIvPg0KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzdBUmZPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HN0FSZmVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzdBUmZ1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyODNFOTFGMDA2MSIgc291cmNlPSJfRzdBUktlZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzdBUkdlZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0FSZ2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0FSZy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3QVJoT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzdBUmd1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzdBUmYtZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzdBUmdPZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbNTAsIC0xMjUzLCAwLCAxODk2XSRbNTAsIC0yNTkwLCAwLCA1NThdIi8+DQotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HN0FSaGVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c3QVJodWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HN0FSaC1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTkyM0IwMDAyIiBzb3VyY2U9Il9HNjJnRXVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HNjJmOHVmWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3QVJpdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3QVJqT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdBUmplZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HN0FSaS1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HN0FSaU9mWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c3QVJpZWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzkxNCwgLTU1OCwgLTQwNjQsIDIzODddJFszMjAwLCAtMTkxMywgLTE3NzgsIDEwMzJdIi8+DQotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HN0FSanVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c3QVJqLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HN0FSa09mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzAzIiBzb3VyY2U9Il9HNjJnRXVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HNjJnQXVmWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3QVJrLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3QVJsZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdBUmx1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HN0FSbE9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HN0FSa2VmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HN0FSa3VmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMTEwMCwgLTU1MCwgMzQyMCwgMjg1M10kWy0xMTAwLCAtMjgxOSwgMzQyMCwgNTg0XSIvPg0KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzdLQjhPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HN0tCOGVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzdLQ0F1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyOTRFQ0MxMDMxRSIgc291cmNlPSJfRzdBUkdlZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzdLQjh1ZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0tDQmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0tDQi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3S0NDT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzdLQ0J1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzdLQ0EtZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HN0tDQk9mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9Ils2OTQsIC01NjcsIC0yMDk5LCAxNjY3XSRbMTgwMywgLTE0NTYsIC05OTAsIDc3OF0iLz4NCi0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c3S0NDZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzdLQ0N1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c3S0NDLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjk0RUMyQjAxQ0EiIHNvdXJjZT0iX0c3S0I4dWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c3QVJBT2ZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdLQ0R1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdLQ0VPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0tDRWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c3S0NELWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c3S0NET2ZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iMTI2MzIyNTYiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c3S0NEZWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzk1NiwgLTc4NywgLTE3ODYsIDE0NDddJFsyMDc0LCAtMTcwMSwgLTY2OCwgNTMzXSIvPg0KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzdLQ0V1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HN0tDRS1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzdLQ0pPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyQjFFQzFCMDM0OSIgc291cmNlPSJfRzdLQ0ZPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzYyZjh1ZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0tDSi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0tDS2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3S0NLdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzdLQ0tPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzdLQ0plZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HN0tDSnVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlswLCAtNTY3LCAwLCAyMzc5XSRbMCwgLTE5MTMsIDAsIDEwMzJdIi8+DQotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HN0tDSy1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c3S0NMT2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HN0tDTGVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI4Q0QzMjMwMTlBIiBzb3VyY2U9Il9HNjJmOHVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HN0FSS2VmWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3S0NNT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3S0NNdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdLQ00tZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HN0tDTWVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HN0tDTHVmWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c3S0NMLWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0yNDk3LCAtMTA0MSwgNjY5NywgMjc2OF0kWy02MTQ2LCAtMjU1NiwgMzA0OCwgMTI1M10iLz4NCi0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c3S0NOT2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzdLQ05lZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c3S0NOdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyOEYiIHNvdXJjZT0iX0c2MmdBdWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c3QVJLZWZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdLQ09lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdLQ08tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0tDUE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c3S0NPdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c3S0NOLWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c3S0NPT2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0xMjcsIC01OTIsIC00MzEsIDI3NjBdJFstMTI3LCAtMjA5OSwgLTQzMSwgMTI1M10iLz4NCi0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c3S0NQZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzdLQ1B1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c3S0NQLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzRDYiIHNvdXJjZT0iX0c2MmdJdWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c2MmdBdWZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdLQ1F1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdLQ1JPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0tDUmVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c3S0NRLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c3S0NRT2ZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c3S0NRZWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzEzNSwgLTgxMiwgLTE4OTYsIDI4NDRdJFsxMzUsIC0zMDY0LCAtMTg5NiwgNTkyXSIvPg0KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzdLQ1J1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HN0tDUi1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzdLQ1NPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDAzRSIgc291cmNlPSJfRzYyZ1F1ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzdBUktlZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0tDUy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0tDVGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3S0NUdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzdLQ1RPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzdLQ1NlZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HN0tDU3VmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMjYsIC00NzcsIC01MTA2LCA2NDAyXSRbLTI2LCAtMzM2MSwgLTUxMDYsIDM1MThdJFszNTQ2LCAtNTgyMSwgLTE1MzQsIDEwNThdIi8+DQotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HN0tDVC1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c3S0NVT2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HN0tDVWVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTYwIiBzb3VyY2U9Il9HNjJnTXVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HNjJnQXVmWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3S0NWT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3S0NWdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdLQ1YtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HN0tDVmVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HN0tDVXVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HN0tDVS1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9Ils2NywgLTU1MCwgMTY5MywgMjg1M10kWzY3LCAtMjgxOSwgMTY5MywgNTg0XSIvPg0KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzdLQ1dPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HN0tDV2VmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgPC9jb250ZW50cz4NCi0gICAgICAgICAgICA8Y29udGVudHMgeG1pOnR5cGU9Im5vdGF0aW9uOkRpYWdyYW0iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyODNFOEM4MDA1NiIgdHlwZT0iQ2xhc3MiIG5hbWU9IlByb2Nlc3NFbGVtZW50Ij4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0tDV3VmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMEVGIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3S0NYZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HN0tDWHVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMzQwMyIgaGVpZ2h0PSI5MDUiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3S0NYLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3S0NZT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3S0NZZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdLQ1l1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzdLQ1ktZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdLQ1pPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzdLQ1plZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdLQ1p1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzdLQ1otZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdUTDRPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3VEw0ZWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzdLQ1ctZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzdLQ1hPZlhFZHVxSG9PSmJVUlpSdyIgeD0iODY2MSIgeT0iNzE3MSIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN1RMNHVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjgwIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3VEw1ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HN1RMNXVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMjgyNyIgaGVpZ2h0PSIxMDMyIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN1RMNS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN1RMNk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN1RMNmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3VEw2dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3VEw2LWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3VEw3T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3VEw3ZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3VEw3dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3VEw3LWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3VEw4T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN1RMOGVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c3VEw0LWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjEyNjMyMjU2IiBzaG93UGFyZW50PSJOYW1lIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HN1RMNU9mWEVkdXFIb09KYlVSWlJ3IiB4PSI4ODk4IiB5PSI0NDgiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdUTDh1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyODNFOEExMDM0MSI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN1RMOWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzdUTDl1ZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjMwMTQiIGhlaWdodD0iOTA1Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN1RMOS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN1RMLU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN1RMLWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3VEwtdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3VEwtLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3VExfT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3VExfZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3VExfdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3VExfLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3VE1BT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN1RNQWVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c3VEw4LWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c3VEw5T2ZYRWR1cUhvT0piVVJaUnciIHg9Ijg4MDUiIHk9IjUyNDAiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdUTUMtZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREU0QTk3MDEyMyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN1RNRHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzdUTUQtZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjMzODYiIGhlaWdodD0iMTAzMiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdUTUVPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdUTUVlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdUTUV1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN1RNRS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN1RNRk9mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN1RNRmVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN1RNRnVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN1RNRi1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN1RNR09mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN1RNR2VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzdUTUd1ZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HN1RNRE9mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIxMjYzMjI1NiIgc2hvd1BhcmVudD0iTmFtZSIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzdUTURlZlhFZHVxSG9PSmJVUlpSdyIgeD0iNzk1IiB5PSIyOTg4Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3VE1KT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjk0RUI5MDAwRkMiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdUTUotZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c3VE1LT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIzNTg5IiBoZWlnaHQ9Ijk5MCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdUTUtlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdUTUt1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdUTUstZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN1RNTE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN1RNTGVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN1RNTHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN1RNTC1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN1RNTU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN1RNTWVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN1RNTXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzdUTU0tZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HN1RNSmVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIxMjYzMjI1NiIgc2hvd1BhcmVudD0iTmFtZSIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzdUTUp1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iODU2OCIgeT0iMjk2MyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTERpYWdyYW1TdHlsZSIgeG1pOmlkPSJfR2xpLVUtZlhFZHVxSG9PSmJVUlpSdyIgZGVzY3JpcHRpb249IlRoaXMgZGlhZ3JhbSBzaG93cyB0aGUgZ2VuZXJhbCBkZWZpbml0aW9uIG9mIFByb2Nlc3MgRWxlbWVudC4gIFByb2Nlc3MgRWxlbWVudCBpcyBkZXJyaXZlZCBmcm9tIE1ldGhvZCBFbGVtZW50IGRlZmluZSBpbiBDb3JlIE1ldGhvZCBDb250ZW50LiAgSnVzdCBsaWtlIHRoZSBDb250ZW50IERlc2NyaXB0aW9uIGZvciBtZXRob2QgY29udGVudCBQcm9jZXNzIEVsZW1lbnQgY29udGFpbnMgYSBDb250ZW50IERlc2NyaXB0aW9uIHRoYXQgY2FuIGNvbXByb3NlIG9mIGEgbnVtYmVyIG9mIGF0dHJpYnV0ZXMgY29udGFpbmluZyB0ZXh0dWFsIGRlc2NycHRpb25zIGZvciB0aGUgUHJvY2VzcyBFbGVtZW50LiIvPg0KLSAgICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c3VE1BdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjgzRTkxRjAwNjEiIHNvdXJjZT0iX0c3S0NXdWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c3VEw4dWZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdUTUJlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdUTUItZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN1RNQ09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c3VE1CdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c3VE1BLWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c3VE1CT2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy01MCwgLTQ1NywgMCwgMTQ3M10kWy01MCwgLTE0ODEsIDAsIDQ0OF0iLz4NCi0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c3VE1DZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzdUTUN1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c3VE1HLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjAwNTgzQjAxRTYiIHNvdXJjZT0iX0c3VE1DLWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c3VEw0dWZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdUTUh1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdUTUlPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN1RNSWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c3VE1ILWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c3VE1IT2ZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iMTI2MzIyNTYiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c3VE1IZWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzAsIC01MjQsIC03ODIzLCAyMDE1XSRbMCwgLTE0MzksIC03ODIzLCAxMTAwXSRbNjQwMCwgLTIzNDUsIC0xNDIyLCAxOTRdIi8+DQotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HN1RNSXVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c3VE1JLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HN1RNTk9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI5NEVDNjAwMkJEIiBzb3VyY2U9Il9HN1RNQy1mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HN1RNSk9mWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3VE1OLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3VE1PZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdUTU91ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HN1RNT09mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN1RNTy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI5NEVDNjAwMkJGIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdUTVBlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c3VE1QT2ZYRWR1cUhvT0piVVJaUnciIHg9Ii0xMyIgeT0iMjYyIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN1RNUHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyOTRFQzYwMDJCRiI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3VE1RT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzdUTVAtZlhFZHVxSG9PSmJVUlpSdyIgeD0iNzA2IiB5PSItMjg5Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN1RNUWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjk0RUM2MDAyQkUiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN1RNUS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HN1RNUXVmWEVkdXFIb09KYlVSWlJ3IiB4PSI0MCIgeT0iMjg3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN1RNUk9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyOTRFQzYwMDJCRSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3VE1SdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HN1RNUmVmWEVkdXFIb09KYlVSWlJ3IiB4PSIyMDkiIHk9Ii0zNDgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3VE1SLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjk0RUM2MDAyQkYiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN1RNU2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzdUTVN1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HN1RNU09mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN1RNUy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjk0RUM2MDAyQkUiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN1RNVGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzdUTVR1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HN1RNVE9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN1RNVC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyOTRFQzYwMDJCRiI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3VE1VZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN1RNVXVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c3VE1VT2ZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3VE1VLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjk0RUM2MDAyQkUiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN1RNVmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN1RNVnVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c3VE1WT2ZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c3VE1OZWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjEyNjMyMjU2IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HN1RNTnVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlsxNjkzLCAtMjUsIC02MTgwLCAyNV0kWzYwNzksIC0yNSwgLTE3OTQsIDI1XSIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HN1RNVi1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI5NEVDMkIwMUNBIiBzb3VyY2U9Il9HN1RNSk9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HN1RMNHVmWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3VE1XdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3VE1YT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdUTVhlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HN1RNVy1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HN1RNV09mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIxMjYzMjI1NiIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzdUTVdlZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTUwLCAtNDkxLCAwLCAxOTk4XSRbLTUwLCAtMTk3MiwgMCwgNTE2XSIvPg0KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzdUTVh1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HN1RNWC1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzdUTVlPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyOTRFQ0MxMDMxRSIgc291cmNlPSJfRzdUTDh1ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzdUTUpPZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN1RNWS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN1RNWmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3VE1adWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzdUTVpPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzdUTVllZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzdUTVl1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbOCwgLTQ0OCwgLTQyLCAxNzg2XSRbOCwgLTE3NTIsIC00MiwgNDgyXSIvPg0KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzdUTVotZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HN1RNYU9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgPC9jb250ZW50cz4NCi0gICAgICAgICAgICA8Y29udGVudHMgeG1pOnR5cGU9Im5vdGF0aW9uOkRpYWdyYW0iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyMzc1RUExMDI4NSIgdHlwZT0iQ2xhc3MiIG5hbWU9IlNlbGVjdGVkVGFza1N0ZXBzIj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN2M4NE9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERTUzNTEwMDEzIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3Yzg0LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HN2M4NU9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMzk3OSIgaGVpZ2h0PSIxMDQ5Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN2M4NWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN2M4NXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN2M4NS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3Yzg2T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3Yzg2ZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3Yzg2dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3Yzg2LWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3Yzg3T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3Yzg3ZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3Yzg3dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN2M4Ny1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c3Yzg0ZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c3Yzg0dWZYRWR1cUhvT0piVVJaUnciIHg9Ijc2MDgiIHk9IjUzODkiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdjODhPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyNzk3Rjc0MDM5MiI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN2M4OC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzdjODlPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjM5NzkiIGhlaWdodD0iMTAzMiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdjODllZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdjODl1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdjODktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN2M4LU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN2M4LWVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN2M4LXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN2M4LS1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN2M4X09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN2M4X2VmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN2M4X3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzdjOF8tZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HN2M4OGVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HN2M4OHVmWEVkdXFIb09KYlVSWlJ3IiB4PSI3NTA5IiB5PSIzNjQ5Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3YzlDZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyOUUiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdjOURPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c3YzlEZWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIzNjkxIiBoZWlnaHQ9IjEwMzIiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3YzlEdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3YzlELWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3YzlFT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdjOUVlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzdjOUV1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdjOUUtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzdjOUZPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdjOUZlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzdjOUZ1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdjOUYtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3YzlHT2ZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzdjOUN1ZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzdjOUMtZlhFZHVxSG9PSmJVUlpSdyIgeD0iMjUzNiIgeT0iNzYwOCIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN2M5R2VmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3OTRBNjYwMzY4Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3YzlIT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HN2M5SGVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMzY5MSIgaGVpZ2h0PSIxMDMyIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN2M5SHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN2M5SC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN2M5SU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3YzlJZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3YzlJdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3YzlJLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3YzlKT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3YzlKZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3YzlKdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3YzlKLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN2M5S09mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c3YzlHdWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c3YzlHLWZYRWR1cUhvT0piVVJaUnciIHg9IjEzNTQ2IiB5PSI3NTYwIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3bXQtdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyNkMiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdtdF9lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c3bXRfdWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIyODc4IiBoZWlnaHQ9IjEwMzIiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3bXRfLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3bXVBT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3bXVBZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdtdUF1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzdtdUEtZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdtdUJPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzdtdUJlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdtdUJ1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzdtdUItZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdtdUNPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3bXVDZWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzdtdC0tZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzdtdF9PZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTQwNSIgeT0iMzk1MyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN211RS1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDA5Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3bXVGdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HN211Ri1mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMjcyNiIgaGVpZ2h0PSIxMDMyIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN211R09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN211R2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN211R3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3bXVHLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3bXVIT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3bXVIZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3bXVIdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3bXVILWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3bXVJT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3bXVJZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN211SXVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c3bXVGT2ZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c3bXVGZWZYRWR1cUhvT0piVVJaUnciIHg9IjIwMjg4IiB5PSIxMjY4Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3bXVJLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjFFNENGMzAxQUUiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdtdUp1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c3bXVKLWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIyNzk0IiBoZWlnaHQ9IjEwNDkiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3bXVLT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3bXVLZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3bXVLdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdtdUstZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzdtdUxPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdtdUxlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzdtdUx1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdtdUwtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzdtdU1PZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdtdU1lZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3bXVNdWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzdtdUpPZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzdtdUplZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTM5NDQiIHk9IjEzNTQiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdtdVgtZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREU0QTk3MDEyMyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN211WXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzdtdVktZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjM0MDMiIGhlaWdodD0iMTA0OSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdtdVpPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdtdVplZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdtdVp1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN211Wi1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN211YU9mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN211YWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN211YXVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN211YS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN211Yk9mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN211YmVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzdtdWJ1ZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HN211WU9mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HN211WWVmWEVkdXFIb09KYlVSWlJ3IiB4PSI3Nzk3IiB5PSIxMzU0Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3djMyT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjk0RUI5MDAwRkMiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzd2MzItZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c3djMzT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIzNTg5IiBoZWlnaHQ9Ijk5MCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzd2MzNlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzd2MzN1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzd2MzMtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN3YzNE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN3YzNGVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN3YzNHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN3YzNC1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN3YzNU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN3YzNWVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN3YzNXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzd2MzUtZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HN3YzMmVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HN3YzMnVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxMTAwIiB5PSIxMzg4Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MRGlhZ3JhbVN0eWxlIiB4bWk6aWQ9Il9HbGktVmVmWEVkdXFIb09KYlVSWlJ3IiBkZXNjcmlwdGlvbj0iQSBrZXkgZGlmZmVyZW5jZSBiZXR3ZWVuIE1ldGhvZCBDb250ZW50IGFuZCBQcm9jZXNzIGlzIHRoYXQgYSBDb250ZW50IEVsZW1lbnQgc3VjaCBhcyBUYXNrIGRlc2NyaWJlcyBhbGwgYXNwZWN0cyBvZiBkb2luZyB3b3JrIGRlZmluZWQgYXJvdW5kIHRoaXMgVGFzay4gIFRoaXMgZGVzY3JpcHRpb24gaXMgbWFuYWdlZCBpbiBzdGVwcywgd2hpY2ggYXJlIG1vZGVsZWQgYXMgU2VjdGlvbnMgb2YgdGhlIFRhc2tzJyBDb250ZW50IERlc2NyaXB0aW9ucy4gIFdoZW4gYXBwbHlpbmcgYSBUYXNrIGluIGEgUHJvY2VzcycgQWN0aXZpdHkgd2l0aCBhIFRhc2sgRGVzY3JpcHRvciBhIFByb2Nlc3MgRW5naW5lZXIgbmVlZHMgdG8gaW5kaWNhdGUgdGhhdCBhdCB0aGF0IHBhcnRpY3VsYXIgcG9pbnQgaW4gdGltZSBpbiB0aGUgUHJvY2VzcyBkZWZpbml0aW9uIGZvciB3aGljaCB0aGUgVGFzayBEZXNjcmlwdG9yIGhhcyBiZWVuIGNyZWF0ZWQsIG9ubHkgYSBzdWJzZXQgb2Ygc3RlcHMgc2hhbGwgYmUgcGVyZm9ybWVkLiAgSGUgZGVmaW5lcyB0aGlzIHNlbGVjdGlvbiB1c2luZyB0aGUgc2VsZWN0ZWRTdGVwcyBhc3NvY2lhdGlvbiBkZXBpY3RlZCBpbiB0aGUgZGlhZ3JhbS4gIElmIGhlIHdhbnRzIHRvIGFkZCBzdGVwcyB0byBhIFRhc2sgRGVzY3JpcHRvciwgaGUgY2FuIGRlc2NyaWJlIHRoZXNlIGVpdGhlciBwcmFnbWF0aWNhbGx5IGluIHRoZSByZWZpbmVkRGVzY3JpcHRpb24gYXR0cmlidXRlIG9yICdwcm9wZXJseScgY3JlYXRlIGEgY29udHJpYnV0aW5nIFRhc2sgdG8gdGhlIFRhc2sgdGhlIFRhc2sgRGVzY3JpcHRvciByZWZlcnMgdG8gKHNlZSBDb250cmlidXRpb24gaW4gcGFja2FnZSBQbHVnaW4gZm9yIGRldGFpbHMpLiIvPg0KLSAgICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c3YzlBT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjc5ODQ5RTAwMDEiIHNvdXJjZT0iX0c3Yzg0T2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c3Yzg4T2ZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdjOUEtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdjOUJlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN2M5QnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c3YzlCT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c3YzlBZWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzdjOUF1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMCwgLTUzMywgMCwgMTcwMV0kWzAsIC0xNzE4LCAwLCA1MTZdIi8+DQotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HN2M5Qi1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c3YzlDT2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HN2M5S2VmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3OTYyRDMwMDNGIiBzb3VyY2U9Il9HN2M5Q2VmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HN2M5R2VmWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3YzlMT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3YzlMdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdjOUwtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HN2M5TGVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN2M5TU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyNzk2MkQ0MDIwRSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3bXQ0T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HN2M5TWVmWEVkdXFIb09KYlVSWlJ3IiB5PSIzOTYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3bXQ0ZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyNzk2MkQ0MDIwRSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3bXQ0LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzdtdDR1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTQ0NiIgeT0iLTM0NyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdtdDVPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3OTYyRDQwMjAzIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdtdDV1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzdtdDVlZlhFZHVxSG9PSmJVUlpSdyIgeD0iODEzIiB5PSIyOTYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3bXQ1LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjc5NjJENDAyMDMiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN210NmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzdtdDZPZlhFZHVxSG9PSmJVUlpSdyIgeD0iNDIzIiB5PSItMzQ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN210NnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3OTYyRDQwMjBFIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdtdDdPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3bXQ3ZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzdtdDYtZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdtdDd1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3OTYyRDQwMjAzIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdtdDhPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3bXQ4ZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzdtdDctZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdtdDh1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjc5NjJENDAyMEUiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN210OU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzdtdDllZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HN210OC1mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN210OXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3OTYyRDQwMjAzIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdtdC1PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzdtdC1lZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HN210OS1mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HN2M5S3VmWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c3YzlLLWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzE4NDUsIDAsIC0xMDcwMSwgMF0kWzEwNjkzLCAwLCAtMTg1NCwgMF0iLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzdtdUN1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDMyRiIgc291cmNlPSJfRzdjOUNlZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzdtdC11ZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN211RGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN211RC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3bXVFT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzdtdUR1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzdtdUMtZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HN211RE9mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlswLCAtNTI0LCAwLCAzMDgxXSRbMCwgLTMwOTAsIDAsIDUxNl0iLz4NCi0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c3bXVFZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzdtdUV1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c3bXVNLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjc5ODMwRTAxNTAiIHNvdXJjZT0iX0c3YzlHZWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c3bXVJLWZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdtdU51ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdtdU9PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN211T2VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c3bXVOLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c3bXVOT2ZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c3bXVOZWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy01MCwgLTUxNiwgMCwgNTY4MV0kWy01MCwgLTU2NzIsIDAsIDUyNF0iLz4NCi0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c3bXVPdWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzdtdU8tZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c3bXVQT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjM3NUUwNDAzOTAiIHNvdXJjZT0iX0c3bXVFLWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c3bXVJLWZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdtdVAtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdtdVFlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN211UXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c3bXVRT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3bXVRLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjM3NUUwNTAxNzUiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN211UmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzdtdVJPZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTYzIiB5PSI5NCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdtdVJ1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIzNzVFMDUwMTc1Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdtdVNPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HN211Ui1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMzk3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN211U2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjM3NUUwNTAxNzMiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN211Uy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HN211U3VmWEVkdXFIb09KYlVSWlJ3IiB4PSItMiIgeT0iMTM2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN211VE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIzNzVFMDUwMTczIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdtdVR1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c3bXVUZWZYRWR1cUhvT0piVVJaUnciIHg9Ii03MzIiIHk9Ii0zMDIiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3bXVULWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjM3NUUwNTAxNzUiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN211VWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzdtdVV1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HN211VU9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN211VS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjM3NUUwNTAxNzMiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN211VmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzdtdVZ1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HN211Vk9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN211Vi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMzc1RTA1MDE3NSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3bXVXZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN211V3VmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c3bXVXT2ZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3bXVXLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjM3NUUwNTAxNzMiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN211WGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN211WHVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c3bXVYT2ZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c3bXVQZWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c3bXVQdWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0xMzYzLCAtNzYsIDQ4ODUsIDI1XSRbLTQ4NTEsIC03NiwgMTM5NywgMjVdIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c3bXVlT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjFFNERBQzAxQTAiIHNvdXJjZT0iX0c3bXVYLWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c3bXVJLWZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdtdWUtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdtdWZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN211ZnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c3bXVmT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3bXVmLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjFFNERBRDAwNTciPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN211Z2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzdtdWdPZlhFZHVxSG9PSmJVUlpSdyIgeD0iNDc5IiB5PSItMTc3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN211Z3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjFFNERBRDAwNTciPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN211aE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c3bXVnLWZYRWR1cUhvT0piVVJaUnciIHg9Ii0xMzEiIHk9IjM1NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdtdWhlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRTREQUQwMDREIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdtdWgtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzdtdWh1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTc5IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN211aU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRTREQUQwMDREIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdtdWl1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c3bXVpZWZYRWR1cUhvT0piVVJaUnciIHg9Ii02MjEiIHk9IjI0NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdtdWktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMUU0REFEMDA1NyI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3bXVqZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN211anVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c3bXVqT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3bXVqLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMUU0REFEMDA0RCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3bXVrZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN211a3VmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c3bXVrT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3djMwT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRTREQUQwMDU3Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzd2MzB1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3djMwLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzd2MzBlZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzd2MzFPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMUU0REFEMDA0RCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3djMxdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3djMxLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzd2MzFlZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzdtdWVlZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzdtdWV1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMTcwMSwgMjUsIC00MTQwLCAyNV0kWzQ0NDUsIDI1LCAtMTM5NywgMjVdIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c3djM2T2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjk0RUM0QTAzMDYiIHNvdXJjZT0iX0c3bXQtdWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c3djMyT2ZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzd2MzYtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzd2MzdlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN3YzN3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c3djM3T2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c3djM2ZWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c3djM2dWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzAsIC01MTYsIC01MCwgMjA3NF0kWzAsIC0yMTA4LCAtNTAsIDQ4Ml0iLz4NCi0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c3djM3LWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzd2MzhPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c3djM4ZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjk0RUM2MDAyQkQiIHNvdXJjZT0iX0c3bXVYLWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c3djMyT2ZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzd2MzlPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzd2Mzl1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN3YzOS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c3djM5ZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3djMtT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjk0RUM2MDAyQkYiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN3YzLXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzd2My1lZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTUyIiB5PSIxNTIiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3djMtLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI5NEVDNjAwMkJGIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzd2M19lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HN3YzX09mWEVkdXFIb09KYlVSWlJ3IiB4PSI3ODciIHk9Ii0yMTIiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3djNfdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyOTRFQzYwMDJCRSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3djRBT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c3djNfLWZYRWR1cUhvT0piVVJaUnciIHg9Ii0xOTkiIHk9IjI0MCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzd2NEFlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjk0RUM2MDAyQkUiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN3Y0QS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzd2NEF1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTQzIiB5PSIzNDciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3djRCT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjk0RUM2MDAyQkYiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN3Y0QnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzd2NEItZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HN3Y0QmVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN3Y0Q09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjk0RUM2MDAyQkUiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN3Y0Q3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzd2NEMtZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HN3Y0Q2VmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN3Y0RE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyOTRFQzYwMDJCRiI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3djREdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN3Y0RC1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c3djREZWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3djRFT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjk0RUM2MDAyQkUiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN3Y0RXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN3Y0RS1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c3djRFZWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c3djM4dWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzd2MzgtZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTE3MTAsIDAsIDQ4OTMsIDBdJFstNDgwOSwgMCwgMTc5NCwgMF0iLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgPC9jb250ZW50cz4NCi0gICAgICAgICAgICA8Y29udGVudHMgeG1pOnR5cGU9Im5vdGF0aW9uOkRpYWdyYW0iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyRDMxMkYyMDM1OCIgdHlwZT0iQ2xhc3MiIG5hbWU9IkRlc2NyaXB0b3IiPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3djRGT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwRTYiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzd2NEYtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c3djRHT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIyMDY1IiBoZWlnaHQ9IjkwNSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzd2NEdlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzd2NEd1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzd2NEctZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN3Y0SE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN3Y0SGVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN3Y0SHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN3Y0SC1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN3Y0SU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN3Y0SWVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN3Y0SXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzd2NEktZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HN3Y0RmVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HN3Y0RnVmWEVkdXFIb09KYlVSWlJ3IiB4PSI5MDI1IiB5PSI0ODg1Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3djRKT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwMDkiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzd2NEotZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c3djRLT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIyNzI2IiBoZWlnaHQ9IjkwNSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzd2NEtlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzd2NEt1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzd2NEstZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN3Y0TE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN3Y0TGVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN3Y0THVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN3Y0TC1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN3Y0TU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN3Y0TWVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN3Y0TXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzd2NE0tZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HN3Y0SmVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HN3Y0SnVmWEVkdXFIb09KYlVSWlJ3IiB4PSI1Mzk3IiB5PSI3Mzk5Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3djRQZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwNDUiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzd2NFFPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c3djRRZWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSI0MDEzIiBoZWlnaHQ9IjkwNSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzd2NFF1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzd2NFEtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzd2NFJPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN3Y0UmVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN3Y0UnVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNzVvME9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNzVvMGVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNzVvMHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNzVvMC1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNzVvMU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzc1bzFlZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HN3Y0UHVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HN3Y0UC1mWEVkdXFIb09KYlVSWlJ3IiB4PSIxMjAzNSIgeT0iNzM0NyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNzVvMXVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDhCIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3NW8yZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HNzVvMnVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMjY3NSIgaGVpZ2h0PSI5MDUiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3NW8yLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3NW8zT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3NW8zZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzc1bzN1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzc1bzMtZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzc1bzRPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzc1bzRlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzc1bzR1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzc1bzQtZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzc1bzVPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3NW81ZWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzc1bzEtZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzc1bzJPZlhFZHVxSG9PSmJVUlpSdyIgeD0iODcyMCIgeT0iNzM3NCIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOEN5eWVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMEVGIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4Q3l6T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HOEN5emVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMzQwMyIgaGVpZ2h0PSI5MDUiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4Q3l6dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4Q3l6LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4Q3kwT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhDeTBlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzhDeTB1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhDeTAtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzhDeTFPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhDeTFlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzhDeTF1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhDeTEtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4Q3kyT2ZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzhDeXl1ZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzhDeXktZlhFZHVxSG9PSmJVUlpSdyIgeD0iODM1NiIgeT0iMTQ4MSIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOEN5NHVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUQwM0QzIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4Q3k1ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HOEN5NXVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTU3NCIgaGVpZ2h0PSI5MDUiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4Q3k1LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4Q3k2T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4Q3k2ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhDeTZ1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzhDeTYtZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhDeTdPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzhDeTdlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhDeTd1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzhDeTctZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhDeThPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4Q3k4ZWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzhDeTQtZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzhDeTVPZlhFZHVxSG9PSmJVUlpSdyIgeD0iNjEyMSIgeT0iNDU4MCIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOE1qME9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTkyNTQwMjI3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4TWowLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HOE1qMU9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iNDI2NyIgaGVpZ2h0PSI5MDUiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4TWoxZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4TWoxdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4TWoxLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhNajJPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzhNajJlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhNajJ1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzhNajItZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhNajNPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzhNajNlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhNajN1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4TWozLWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzhNajBlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzhNajB1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTQ3MyIgeT0iMjQ0NiIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTERpYWdyYW1TdHlsZSIgeG1pOmlkPSJfR2xpLVYtZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c3djROT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzMDMiIHNvdXJjZT0iX0c3djRKT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c3djRGT2ZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzd2NE4tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzd2NE9lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN3Y0T3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c3djRPT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c3djROZWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzd2NE51ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbNDkxLCAtNDU3LCAtMjMwMiwgMjAzMl0kWzIyNjAsIC0yMDQwLCAtNTMzLCA0NDhdIi8+DQotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HN3Y0Ty1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c3djRQT2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HNzVvNXVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTYwIiBzb3VyY2U9Il9HNzVvMXVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HN3Y0Rk9mWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3NW82ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3NW82LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzc1bzdPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNzVvNnVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HNzVvNS1mWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c3NW82T2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzAsIC00NTcsIDAsIDIwMzJdJFswLCAtMjA0MCwgMCwgNDQ4XSIvPg0KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzc1bzdlZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HNzVvN3VmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzhDeXdPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDNENiIgc291cmNlPSJfRzd2NFBlZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzd2NEZPZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOEN5dy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOEN5eGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4Q3l4dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzhDeXhPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzhDeXdlZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HOEN5d3VmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstNjI2LCAtNDU3LCAyODI3LCAyMDMyXSRbLTI4MTksIC0yMDQwLCA2MzUsIDQ0OF0iLz4NCi0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c4Q3l4LWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzhDeXlPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c4Q3kyZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyOEYiIHNvdXJjZT0iX0c3djRGT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c4Q3l5ZWZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhDeTNPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhDeTN1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOEN5My1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c4Q3kzZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c4Q3kydWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzhDeTItZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMCwgLTQ1NywgMCwgMjk0Nl0kWzAsIC0yOTU0LCAwLCA0NDhdIi8+DQotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HOEN5NE9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c4Q3k0ZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HOEN5OHVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFMEZGRDMwMEVGIiBzb3VyY2U9Il9HOEN5eWVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HOEN5NHVmWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4Q3k5ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4Q3k5LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhDeS1PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c4Q3k5dWZYRWR1cUhvT0piVVJaUnciIHg9Ii02NzciIHk9IjcwMyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhDeS1lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRTBGRkQzMDBGMSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4Q3ktLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOEN5LXVmWEVkdXFIb09KYlVSWlJ3IiB4PSItMjUzIiB5PSItMTY5Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOEN5X09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUUwRkZEMzAwRjEiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOEN5X3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c4Q3lfZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0zOTciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4Q3lfLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRTBGRkQzMDBGMCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4Q3pBZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c4Q3pBT2ZYRWR1cUhvT0piVVJaUnciIHg9IjMxNiIgeT0iMzA2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOEN6QXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRTBGRkQzMDBGMCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4Q3pCT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOEN6QS1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMzk3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOE1qd09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFMEZGRDMwMEYxIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhNand1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4TWp3LWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzhNandlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhNanhPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFMEZGRDMwMEYwIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhNanh1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4TWp4LWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzhNanhlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhNanlPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUUwRkZEMzAwRjEiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOE1qeXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzhNanktZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOE1qeWVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOE1qek9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFMEZGRDMwMEYwIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhNanp1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzhNanotZlhFZHVxSG9PSmJVUlpSdyIgY29sbGFwc2VkPSJ0cnVlIi8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c4TWp6ZWZYRWR1cUhvT0piVVJaUnciIHg9IjQ3NyIgeT0iLTEyNDMiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c4Q3k4LWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c4Q3k5T2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0xMTY0LCAzMTcsIDE5ODQsIC0yNzc4XSRbLTExNjQsIDMxNzUsIDE5ODQsIDgwXSRbLTIyMjIsIDMxNzUsIDkyNiwgODBdIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c4TWo0T2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBOTI4MjAzOTIiIHNvdXJjZT0iX0c4Q3k0dWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c4TWowT2ZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhNajQtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhNajVlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOE1qNXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c4TWo1T2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c4TWo0ZWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzhNajR1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTcwMiwgLTQ1NywgMjU5OSwgMTY3Nl0kWy0yNjE2LCAtMTY4NCwgNjg1LCA0NDhdIi8+DQotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HOE1qNS1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c4TWo2T2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HOE1qNmVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTkyM0IwMDAyIiBzb3VyY2U9Il9HN3Y0Sk9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HOE1qME9mWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4TWo3T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4TWo3dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhNajctZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HOE1qN2VmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HOE1qNnVmWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c4TWo2LWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0zNDcsIC00NTcsIDMzMTAsIDQ0NzBdJFstMzMyNywgLTQ0NzgsIDMzMCwgNDQ4XSIvPg0KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzhNajhPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HOE1qOGVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzhNajh1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyOENEMzIzMDE5QSIgc291cmNlPSJfRzhNajBPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzhDeXllZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOE1qOWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOE1qOS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4TWotT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzhNajl1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzhNajgtZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HOE1qOU9mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlsyMTMzLCAtMzMwLCAtNDMxOCwgNjM1XSRbNDc0MSwgLTcyOCwgLTE3MTAsIDIzN10iLz4NCi0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c4TWotZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzhNai11ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgIDwvY29udGVudHM+DQotICAgICAgICAgIDwvZUFubm90YXRpb25zPg0KLSAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0doaFo5T2ZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEZEODU0NjAwRDgiPg0KLSAgICAgICAgICAgIDxib2R5PjAxPC9ib2R5Pg0KLSAgICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgICAgPHBhY2thZ2VNZXJnZSB4bWk6aWQ9Il9EeExHd094TUVkdU9Ock1SZ216NDhBIiBtZXJnZWRQYWNrYWdlPSJfM0FEQzdCNzQwMjJENDFERTQ3OEUwMDBEIi8+DQotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUQwM0QzIiBuYW1lPSJBY3Rpdml0eSI+DQotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HaHJLLXVmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUQwM0QzIj4NCi0gICAgICAgICAgICAgIDxib2R5PkFuIEFjdGl2aXR5IGlzIGEgV29yayBCcmVha2Rvd24gRWxlbWVudCBhbmQgV29yayBEZWZpbml0aW9uIHdoaWNoIHN1cHBvcnRzIHRoZSBuZXN0aW5nIGFuZCBsb2dpY2FsIGdyb3VwaW5nIG9mIHJlbGF0ZWQgQnJlYWtkb3duIEVsZW1lbnRzIGZvcm1pbmcgYnJlYWtkb3duIHN0cnVjdHVyZXMuICBBbHRob3VnaCBBY3Rpdml0eSBpcyBhIGNvbmNyZXRlIG1ldGEtY2xhc3MsIG90aGVyIGNsYXNzZXMgd2hpY2ggcmVwcmVzZW50IGJyZWFrZG93biBzdHJ1Y3R1cmVzIGRlcml2ZSBmcm9tIGl0OyBzdWNoIGFzIFBoYXNlLCBJdGVyYXRpb24sIERlbGl2ZXJ5IFByb2Nlc3MsIG9yIENhcGFiaWxpdHkgUGF0dGVybi4NCi1BY3Rpdml0eSByZXByZXNlbnRzIGEgZ3JvdXBpbmcgZWxlbWVudCBmb3Igb3RoZXIgQnJlYWtkb3duIEVsZW1lbnRzIHN1Y2ggYXMgQWN0aXZpdGllcywgRGVzY3JpcHRvcnMsIE1pbGVzdG9uZXMsIGV0Yy4gIEl0IGlzIG5vdCBwZXItc2UgYSAnaGlnaC1sZXZlbCcgZ3JvdXBpbmcgb2Ygb25seSB3b3JrIGFzIGluIG90aGVyIG1ldGEtbW9kZWxzLCBidXQgZ3JvdXBzIGFueSBraW5kIG9mIEJyZWFrZG93biBFbGVtZW50cy4gIEZvciBleGFtcGxlLCBvbmUgY2FuIGRlZmluZSB2YWxpZCBBY3Rpdml0aWVzIHRoYXQgZ3JvdXAgb25seSBXb3JrIFByb2R1Y3RzIERlc2NyaXB0b3JzIHdpdGhvdXQgYW55IG1hdGNoaW5nIFRhc2sgRGVzY3JpcHRvcnMuICBBY3Rpdml0aWVzIGFsc28gaW5oZXJpdCBhbGwgcHJvcGVydGllcyBmcm9tIFdvcmsgQnJlYWtkb3duIEVsZW1lbnQgYW5kIGluZGlyZWN0bHkgZnJvbSBQcm9jZXNzIEVsZW1lbnQ7IGkuZS4gQWN0aXZpdHkgaXMgcmVhZHkgdG8gaGF2ZSBhIGZ1bGwgY29udGVudCBkZXNjcmlwdGlvbiBhdHRhY2hlZCB0byBpdC4NCi08L2JvZHk+DQotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyN0E5MjgyMDM5MiIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQyN0E5MjU0MDIyNyIvPg0KLSAgICAgICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MjhDRDMyOTAxRkQiIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0MjdBODJEMzAxN0YiLz4NCi0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDFFMEZGRDMwMEYxIiBuYW1lPSJicmVha2Rvd25FbGVtZW50cyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMEVGIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQxRTBGRkQzMDBFRiI+DQotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HbVNsUC1mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR21TbFB1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDAzMSIgbmFtZT0iTWlsZXN0b25lIj4NCi0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0doMFU1T2ZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwMzEiPg0KLSAgICAgICAgICAgICAgPGJvZHk+QSBNaWxlc3RvbmUgZGVzY3JpYmVzIGEgc2lnbmlmaWNhbnQgZXZlbnQgaW4gYSBkZXZlbG9wbWVudCBwcm9qZWN0LCBzdWNoIGFzIGEgbWFqb3IgZGVjaXNpb24sIGNvbXBsZXRpb24gb2YgYSBkZWxpdmVyYWJsZSwgb3IgbWVldGluZyBvZiBhIG1ham9yIGRlcGVuZGVuY3kgKGxpa2UgY29tcGxldGlvbiBvZiBhIHByb2plY3QgcGhhc2UpLiAgQmVjYXVzZSwgTWlsZXN0b25lIGlzIGNvbW1vbmx5IHVzZWQgdG8gcmVmZXIgdG8gYm90aCB0aGUgZXZlbnQgaXRzZWxmIGFuZCB0aGUgcG9pbnQgaW4gdGltZSBhdCB3aGljaCB0aGUgZXZlbnQgaXMgc2NoZWR1bGVkIHRvIGhhcHBlbiwgaXQgaXMgbW9kZWxlZCBhcyBhIEJyZWFrZG93biBFbGVtZW50IChpLmUuIGl0IGFwcGVhcnMgYXMgcGFydCBvZiBhIGJyZWFrZG93biBzdHJ1Y3R1cmUpLjwvYm9keT4NCi0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDJCMUVDMUIwMzQ5IiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDI3QTkyNTQwMjI3Ii8+DQotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX1FGMmc0Y1ZIRWR5Mm11UTJQUXZIX0EiIG5hbWU9InJlcXVpcmVkUmVzdWx0cyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDQ1IiBhc3NvY2lhdGlvbj0iX1FGMmc0TVZIRWR5Mm11UTJQUXZIX0EiPg0KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfUUdTbHdjVkhFZHkybXVRMlBRdkhfQSIgdmFsdWU9IioiLz4NCi0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX1FHU2x3TVZIRWR5Mm11UTJQUXZIX0EiLz4NCi0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RDAzQ0IiIG5hbWU9Ikl0ZXJhdGlvbiI+DQotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HaDBVNk9mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUQwM0NCIj4NCi0gICAgICAgICAgICAgIDxib2R5Pkl0ZXJhdGlvbiBpcyBhIHNwZWNpYWwgQWN0aXZpdHksIHdoaWNoIHByZXNjcmliZXMgcHJlLWRlZmluZWQgdmFsdWVzIGZvciBpdHMgaW5zdGFuY2VzIGZvciB0aGUgYXR0cmlidXRlcyBwcmVmaXggKCdJdGVyYXRpb24nKSBhbmQgaXNSZXBlYXRhYmxlICgnVHJ1ZScpLiAgSXQgaGFzIGJlZW4gaW5jbHVkZWQgaW50byB0aGUgbWV0YS1tb2RlbCBmb3IgY29udmVuaWVuY2UgYW5kIHRvIHByb3ZpZGUgYSBzcGVjaWFsIHN0ZXJlb3R5cGUsIGJlY2F1c2UgaXQgcmVwcmVzZW50cyBhIHZlcnkgY29tbW9ubHkgdXNlZCBBY3Rpdml0eSB0eXBlLg0KLUl0ZXJhdGlvbiBncm91cHMgYSBzZXQgb2YgbmVzdGVkIEFjdGl2aXRpZXMgdGhhdCBhcmUgcmVwZWF0ZWQgbW9yZSB0aGFuIG9uY2UuICBJdCByZXByZXNlbnRzIGFuIGltcG9ydGFudCBzdHJ1Y3R1cmluZyBlbGVtZW50IHRvIG9yZ2FuaXplIHdvcmsgaW4gcmVwZXRpdGl2ZSBjeWNsZXMuICBUaGUgY29uY2VwdCBvZiBJdGVyYXRpb24gY2FuIGJlIGFzc29jaWF0ZWQgd2l0aCBkaWZmZXJlbnQgcnVsZXMgaW4gZGlmZmVyZW50IG1ldGhvZHMuICBGb3IgZXhhbXBsZSwgdGhlIElCTSBSYXRpb25hbCBVbmlmaWVkIFByb2Nlc3MgbWV0aG9kIGZyYW1ld29yayAoUlVQKSBkZWZpbmVzIGEgcnVsZSB0aGF0IEl0ZXJhdGlvbnMgYXJlIG5vdCBhbGxvd2VkIHRvIHNwYW4gYWNyb3NzIFBoYXNlcy4gIEluIGNvbnRyYXN0IElCTSBHbG9iYWwgU2VydmljZXMgTWV0aG9kIChHU01ldGhvZCkgYmFzZWQgbWV0aG9kIGZyYW1ld29ya3MgdGhpcyBydWxlIGRvZXMgbm90IGFwcGx5IGFuZCBJdGVyYXRpb24gY2FuIGJlIGRlZmluZWQgd2hpY2ggbmVzdCBQaGFzZXMuICBSdWxlcyBsaWtlIHRoZXNlLCB3aGljaCBwbGF5IGFuIGltcG9ydGFudCByb2xlIGZvciBlYWNoIGluZGl2aWR1YWwgbWV0aG9kIGFuZCBhcmUgdGhlcmVmb3JlIG5vdCBlbmZvcmNlZCBieSB0aGlzIG1ldGEtbW9kZWwuICBJbnN0ZWFkLCBwcm9jZXNzIGF1dGhvcnMgYXJlIGV4cGVjdGVkIHRvIGZvbGxvdyBhbmQgY2hlY2sgdGhlc2UgcnVsZXMgbWFudWFsbHkuICAoTm90ZTogQW55IEJyZWFrZG93biBFbGVtZW50IGNhbiBiZSByZXBlYXRlZDsgaG93ZXZlciwgSXRlcmF0aW9ucyBoYXMgYmVlbiBpbnRyb2R1Y2VkIGFzIGEgc3BlY2lhbCBtZXRhLW1vZGVsIGNvbmNlcHQsIGJlY2F1c2Ugb2YgaXRzIGltcG9ydGFudCByb2xlIGZvciBtYW55IG1ldGhvZHMuKQ0KLTwvYm9keT4NCi0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMkEwIiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDBGMzZDNUQwM0QzIi8+DQotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVEMDNDQSIgbmFtZT0iUGhhc2UiPg0KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR2gtRjQtZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVEMDNDQSI+DQotICAgICAgICAgICAgICA8Ym9keT5QaGFzZSBpcyBhIHNwZWNpYWwgQWN0aXZpdHksIHdoaWNoIHByZXNjcmliZXMgcHJlLWRlZmluZWQgdmFsdWVzIGZvciBpdHMgaW5zdGFuY2VzIGZvciB0aGUgYXR0cmlidXRlcyBwcmVmaXggKCdQaGFzZScpIGFuZCBpc1JlcGVhdGFibGUgKCdGYWxzZScpLiAgSXQgaGFzIGJlZW4gaW5jbHVkZWQgaW50byB0aGUgbWV0YS1tb2RlbCBmb3IgY29udmVuaWVuY2UgYW5kIHRvIHByb3ZpZGUgYSBzcGVjaWFsIHN0ZXJlb3R5cGUsIGJlY2F1c2UgaXQgcmVwcmVzZW50cyBhIHZlcnkgY29tbW9ubHkgdXNlZCBBY3Rpdml0eSB0eXBlLg0KLVBoYXNlIHJlcHJlc2VudCBhIHNpZ25pZmljYW50IHBlcmlvZCBpbiBhIHByb2plY3QsIGVuZGluZyB3aXRoIG1ham9yIG1hbmFnZW1lbnQgY2hlY2twb2ludCwgbWlsZXN0b25lIG9yIHNldCBvZiBEZWxpdmVyYWJsZXMuICBJdCBpcyBpbmNsdWRlZCBpbiB0aGUgbW9kZWwgYXMgYSBwcmVkZWZpbmVkIHNwZWNpYWwgQWN0aXZpdHksIGJlY2F1c2Ugb2YgaXRzIHNpZ25pZmljYW5jZSBpbiBkZWZpbmluZyBicmVha2Rvd25zLg0KLTwvYm9keT4NCi0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMjlGIiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDBGMzZDNUQwM0QzIi8+DQotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDA2MyIgbmFtZT0iVGVhbVByb2ZpbGUiPg0KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR2gtRjUtZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDA2MyI+DQotICAgICAgICAgICAgICA8Ym9keT5BIFRlYW0gUHJvZmlsZSBpcyBhIEJyZWFrZG93biBFbGVtZW50IHRoYXQgZ3JvdXBzIFJvbGUgRGVzY3JpcHRvcnMgb3IgUmVzb3VyY2UgRGVmaW5pdGlvbnMgZGVmaW5pbmcgYSBuZXN0ZWQgaGllcmFyY2h5IG9mIHRlYW1zIGFuZCB0ZWFtIG1lbWJlcnMuDQotV29yayBhc3NpZ25tZW50cyBhbmQgV29yayBQcm9kdWN0IHJlc3BvbnNpYmlsaXRpZXMgY2FuIGJlIGRpZmZlcmVudCBmcm9tIEFjdGl2aXR5IHRvIEFjdGl2aXR5IGluIGEgZGV2ZWxvcG1lbnQgcHJvamVjdC4gRGlmZmVyZW50IHBoYXNlcyByZXF1aXJlIGRpZmZlcmVudCBzdGFmZmluZyBwcm9maWxlcywgaS5lLiBkaWZmZXJlbnQgc2tpbGxzIGFuZCByZXNvdXJjZXMgZG9pbmcgZGlmZmVyZW50IHR5cGVzIG9mIHdvcmsuICBUaGVyZWZvcmUsIGEgcHJvY2VzcyBuZWVkcyB0byBkZWZpbmUgc3VjaCBkaWZmZXJlbnQgcHJvZmlsZXMgaW4gYSBmbGV4aWJsZSBtYW5uZXIuICBXaGVyZWFzIENvcmUgTWV0aG9kIENvbnRlbnQgZGVmaW5lcyBzdGFuZGFyZCByZXNwb25zaWJpbGl0aWVzIGFuZCBhc3NpZ25tZW50cywgYSBwcm9jZXNzIGV4cHJlc3MgYnkgYSBicmVha2Rvd24gc3RydWN0dXJlcyBuZWVkcyB0byBiZSBhYmxlIHJlZmluZSBhbmQgcmVkZWZpbmUgdGhlc2UgdGhyb3VnaG91dCBpdHMgZGVmaW5pdGlvbi4gIFJvbGUgRGVzY3JpcHRvcnMsIFJlc291cmNlIERlZmluaXRpb25zLCBhcyB3ZWxsIGFzIFRlYW0gUHJvZmlsZXMgcHJvdmlkZSB0aGUgZGF0YSBzdHJ1Y3R1cmUgbmVjZXNzYXJ5IHRvIGFjaGlldmUgdGhpcyBmbGV4aWJpbGl0eSBhbmQgdG8gcHJvdmlkZSBhIHByb2Nlc3MgdXNlciB3aXRoIHRoZSBjYXBhYmlsaXR5IHRvIGRlZmluZSBkaWZmZXJlbnQgdGVhbXMgYW5kIHJvbGUgcmVsYXRpb25zaGlwcyBmb3IgZXZlcnkgQWN0aXZpdHkgKGluY2x1ZGluZyBBY3Rpdml0aWVzIG9uIGFueSBuZXN0aW5nLWxldmVsIGFzIHdlbGwgYXMgSXRlcmF0aW9ucyBvciBQaGFzZXMpLg0KLUhlbmNlLCBpbiBhZGRpdGlvbiB0byB0aGUgd29yayBicmVha2Rvd24gYW5kIHdvcmsgcHJvZHVjdCBicmVha2Rvd24gc3RydWN0dXJlcyBkZWZpbmVkIHNvIGZhciwgVGVhbSBQcm9maWxlcyBhcmUgdXNlZCB0byBkZWZpbmUgYSB0aGlyZCB0eXBlIG9mIGJyZWFrZG93biBzdHJ1Y3R1cmU6IHRlYW0gYnJlYWtkb3duIHN0cnVjdHVyZXMuICBUaGVzZSBhcmUgY3JlYXRlZCBhcyBhbiBBY3Rpdml0eSBzcGVjaWZpYyBoaWVyYXJjaHkgb2YgVGVhbSBQcm9maWxlcyBjb21wcmlzaW5nIG9mIFJvbGUgRGVzY3JpcHRvcnMgYW5kIFJlc291cmNlIERlZmluaXRpb25zLiAgVGhlc2Ugc3RydWN0dXJlcyBjYW4gYmUgcHJlc2VudGVkIGFzIHdlbGwta25vd24gT3JnLUNoYXJ0cy4gIEp1c3QgYXMgd2l0aCBhbnkgb3RoZXIgQnJlYWtkb3duIEVsZW1lbnQgYW5kIERlc2NyaXB0b3JzLCBUZWFtIFByb2ZpbGVzIGNhbiBiZSBkZWZpbmVkIHdpdGhpbiB0aGUgc2NvcGUgb2YgYW55IEFjdGl2aXR5IGluIGEgYnJlYWtkb3duIHN0cnVjdHVyZS4gIEluIG90aGVyIHdvcmRzIGV2ZXJ5IEFjdGl2aXR5IGNhbiBkZWZpbmUgaXRzIG93biBUZWFtIFByb2ZpbGVzIGNvbnNpc3Rpbmcgb2YgQWN0aXZpdHkgc3BlY2lmaWMgUm9sZSBEZXNjcmlwdG9ycyBhbmQgUmVzb3VyY2UgRGVmaW5pdGlvbnMuICBUeXBpY2FsbHksIFRlYW0gUHJvZmlsZXMgYXJlIGRlZmluZWQgb24gdGhlIGxldmVsIG9mIEl0ZXJhdGlvbnMgb3IgUGhhc2VzIG9yIG90aGVyIGhpZ2hlci1sZXZlbCBBY3Rpdml0eS4NCi08L2JvZHk+DQotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDAzRSIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDBFRiIvPg0KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwNDIiIG5hbWU9InRlYW1Sb2xlcyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDhCIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDAzRiI+DQotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HajVfa3VmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR2o1X2tlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDA1MyIgbmFtZT0ic3VwZXJUZWFtIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwNjMiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDUyIj4NCi0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0drRHdrLWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIxIi8+DQotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9Ha0R3a3VmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iMSIvPg0KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDA1NSIgbmFtZT0ic3ViVGVhbSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDYzIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDA1MiI+DQotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9Ha0R3bHVmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR2tEd2xlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6RW51bWVyYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxMDgwMDU3MDI3NiIgbmFtZT0iV29ya09yZGVyVHlwZSI+DQotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HaUgyNC1mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDEwODAwNTcwMjc2Ij4NCi0gICAgICAgICAgICAgIDxib2R5PldvcmsgT3JkZXIgcmVwcmVzZW50cyBhIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHR3byBCcmVha2Rvd24gRWxlbWVudCBpbiB3aGljaCBvbmUgQnJlYWtkb3duIEVsZW1lbnQgKHJlZmVycmVkIHRvIGFzIChCKSBiZWxvdykgZGVwZW5kcyBvbiB0aGUgc3RhcnQgb3IgZmluaXNoIG9mIGFub3RoZXIgQnJlYWtkb3duIEVsZW1lbnQgKHJlZmVycmVkIHRvIGFzIChBKSBiZWxvdykgaW4gb3JkZXIgdG8gYmVnaW4gb3IgZW5kLiBUaGlzIGVudW1lcmF0aW9uIGRlZmluZXMgdGhlIGRpZmZlcmVudCB0eXBlcyBvZiBXb3JrIE9yZGVyIHJlbGF0aW9uc2hpcHMgYXZhaWxhYmxlIGluIFVNQSBhbmQgaXMgdXNlZCB0byBwcm92aWRlIHZhbHVlcyBmb3IgV29yayBPcmRlcidzIGxpbmtUeXBlIGF0dHJpYnV0ZS48L2JvZHk+DQotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgICAgICAgPG93bmVkTGl0ZXJhbCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTA4MTlFRDAxRUQiIG5hbWU9ImZpbmlzaFRvU3RhcnQiPg0KLSAgICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HaUgyNXVmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDEwODE5RUQwMUVEIj4NCi0gICAgICAgICAgICAgICAgPGJvZHk+QnJlYWtkb3duIEVsZW1lbnQgKEIpIGNhbm5vdCBzdGFydCB1bnRpbCBCcmVha2Rvd24gRWxlbWVudCAoQSkgZmluaXNoZXMuIEZvciBleGFtcGxlLCBpZiB5b3UgaGF2ZSB0d28gQnJlYWtkb3duIEVsZW1lbnRzLCAmcXVvdDtDb25zdHJ1Y3QgZmVuY2UmcXVvdDsgYW5kICZxdW90O1BhaW50IGZlbmNlLCZxdW90OyAmcXVvdDtQYWludCBmZW5jZSZxdW90OyBjYW4ndCBzdGFydCB1bnRpbCAmcXVvdDtDb25zdHJ1Y3QgZmVuY2UmcXVvdDsgZmluaXNoZXMuIFRoaXMgaXMgdGhlIG1vc3QgY29tbW9uIHR5cGUgb2YgZGVwZW5kZW5jeSBhbmQgdGhlIGRlZmF1bHQgZm9yIGEgbmV3IFdvcmsgT3JkZXIgaW5zdGFuY2UuDQotPC9ib2R5Pg0KLSAgICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgICAgICAgPC9vd25lZExpdGVyYWw+DQotICAgICAgICAgICAgPG93bmVkTGl0ZXJhbCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTA4MUM3MjAzQzciIG5hbWU9ImZpbmlzaFRvRmluaXNoIj4NCi0gICAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR2lSQTBlZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxMDgxQzcyMDNDNyI+DQotICAgICAgICAgICAgICAgIDxib2R5PkJyZWFrZG93biBFbGVtZW50IChCKSBjYW5ub3QgZmluaXNoIHVudGlsIEJyZWFrZG93biBFbGVtZW50IChBKSBmaW5pc2hlcy4gRm9yIGV4YW1wbGUsIGlmIHlvdSBoYXZlIHR3byBCcmVha2Rvd24gRWxlbWVudHMsICZxdW90O0FkZCB3aXJpbmcmcXVvdDsgYW5kICZxdW90O0luc3BlY3QgZWxlY3RyaWNhbCwmcXVvdDsgJnF1b3Q7SW5zcGVjdCBlbGVjdHJpY2FsJnF1b3Q7IGNhbid0IGZpbmlzaCB1bnRpbCAmcXVvdDtBZGQgd2lyaW5nJnF1b3Q7IGZpbmlzaGVzLg0KLTwvYm9keT4NCi0gICAgICAgICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgICAgIDwvb3duZWRMaXRlcmFsPg0KLSAgICAgICAgICAgIDxvd25lZExpdGVyYWwgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDEwODFCRTgwMjk2IiBuYW1lPSJzdGFydFRvU3RhcnQiPg0KLSAgICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HaVJBMU9mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDEwODFCRTgwMjk2Ij4NCi0gICAgICAgICAgICAgICAgPGJvZHk+QnJlYWtkb3duIEVsZW1lbnQgKEIpIGNhbm5vdCBzdGFydCB1bnRpbCBCcmVha2Rvd24gRWxlbWVudCAoQSkgc3RhcnRzLiBGb3IgZXhhbXBsZSwgaWYgeW91IGhhdmUgdHdvIEJyZWFrZG93biBFbGVtZW50cywgJnF1b3Q7UG91ciBmb3VuZGF0aW9uJnF1b3Q7IGFuZCAmcXVvdDtMZXZlbCBjb25jcmV0ZSwmcXVvdDsgJnF1b3Q7TGV2ZWwgY29uY3JldGUmcXVvdDsgY2FuJ3QgYmVnaW4gdW50aWwgJnF1b3Q7UG91ciBmb3VuZGF0aW9uJnF1b3Q7IGJlZ2lucy4NCi08L2JvZHk+DQotICAgICAgICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgICAgICA8L293bmVkTGl0ZXJhbD4NCi0gICAgICAgICAgICA8b3duZWRMaXRlcmFsIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxMDgxQzUxMDEzQyIgbmFtZT0ic3RhcnRUb0ZpbmlzaCI+DQotICAgICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dpUkExLWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTA4MUM1MTAxM0MiPg0KLSAgICAgICAgICAgICAgICA8Ym9keT5CcmVha2Rvd24gRWxlbWVudCAoQikgY2Fubm90IGZpbmlzaCB1bnRpbCBCcmVha2Rvd24gRWxlbWVudCAoQSkgc3RhcnRzLiBUaGlzIGRlcGVuZGVuY3kgdHlwZSBjYW4gYmUgdXNlZCBmb3IganVzdC1pbi10aW1lIHNjaGVkdWxpbmcgdXAgdG8gYSBtaWxlc3RvbmUgb3IgdGhlIHByb2plY3QgZmluaXNoIGRhdGUgdG8gbWluaW1pemUgdGhlIHJpc2sgb2YgYSBCcmVha2Rvd24gRWxlbWVudCBmaW5pc2hpbmcgbGF0ZSBpZiBpdHMgZGVwZW5kZW50IEJyZWFrZG93biBFbGVtZW50cyBzbGlwLiBJZiBhIHJlbGF0ZWQgQnJlYWtkb3duIEVsZW1lbnQgbmVlZHMgdG8gZmluaXNoIGJlZm9yZSB0aGUgbWlsZXN0b25lIG9yIHByb2plY3QgZmluaXNoIGRhdGUsIGJ1dCBpdCBkb2Vzbid0IG1hdHRlciBleGFjdGx5IHdoZW4gYW5kIHlvdSBkb24ndCB3YW50IGEgbGF0ZSBmaW5pc2ggdG8gYWZmZWN0IHRoZSBqdXN0LWluLXRpbWUgQnJlYWtkb3duIEVsZW1lbnQsIHlvdSBjYW4gY3JlYXRlIGFuIFNGIGRlcGVuZGVuY3kgYmV0d2VlbiB0aGUgQnJlYWtkb3duIEVsZW1lbnQgeW91IHdhbnQgc2NoZWR1bGVkIGp1c3QgaW4gdGltZSAodGhlIHByZWRlY2Vzc29yKSBhbmQgaXRzIHJlbGF0ZWQgQnJlYWtkb3duIEVsZW1lbnQgKHRoZSBzdWNjZXNzb3IpLiBUaGVuIGlmIHlvdSB1cGRhdGUgcHJvZ3Jlc3Mgb24gdGhlIHN1Y2Nlc3NvciBCcmVha2Rvd24gRWxlbWVudCwgaXQgd29uJ3QgYWZmZWN0IHRoZSBzY2hlZHVsZWQgZGF0ZXMgb2YgdGhlIHByZWRlY2Vzc29yIEJyZWFrZG93biBFbGVtZW50LjwvYm9keT4NCi0gICAgICAgICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgICAgIDwvb3duZWRMaXRlcmFsPg0KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTA4MTg3OTAyODgiIG5hbWU9IldvcmtPcmRlciI+DQotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HaWF4MHVmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDEwODE4NzkwMjg4Ij4NCi0gICAgICAgICAgICAgIDxib2R5PldvcmsgT3JkZXIgaXMgYSBNZXRob2QgRWxlbWVudCB0aGF0IHJlcHJlc2VudHMgYSByZWxhdGlvbnNoaXAgYmV0d2VlbiB0d28gQnJlYWtkb3duIEVsZW1lbnRzIGluIHdoaWNoIG9uZSBCcmVha2Rvd24gRWxlbWVudHMgZGVwZW5kcyBvbiB0aGUgc3RhcnQgb3IgZmluaXNoIG9mIGFub3RoZXIgQnJlYWtkb3duIEVsZW1lbnRzIGluIG9yZGVyIHRvIGJlZ2luIG9yIGVuZC4gIA0KLShOb3RlLCBXb3JrIE9yZGVyIGlzIG5vdCBtb2RlbGVkIGFzIGFuIEFzc29jaWF0aW9uIENsYXNzIHRvIHByb3ZpZGUgYSBzdHJhaWdodGZvcndhcmQgbWFwcGluZyAgdG8gWE1JIGFuZCBFTUYuKQ0KLVRoZSBXb3JrIE9yZGVyIGNsYXNzIGRlZmluZXMgcHJlZGVjZXNzb3IgYW5kIHN1Y2Nlc3NvciByZWxhdGlvbnMgYW1vbmdzdCBCcmVha2Rvd24gRWxlbWVudHMuICBUaGlzIGluZm9ybWF0aW9uIGlzIGluIHBhcnRpY3VsYXIgY3JpdGljYWwgZm9yIHBsYW5uaW5nIGFwcGxpY2F0aW9ucy4gIFNlZSBtb3JlIGRldGFpbHMgb24gZGlmZmVyZW50IHR5cGVzIG9mIFdvcmsgT3JkZXIgcmVsYXRpb25zaGlwcyBhdCBXb3JrIE9yZGVyIFR5cGUuDQotPC9ib2R5Pg0KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MjgzRUQ2RDAwODgiIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0MjgzRThBMTAzNDEiLz4NCi0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDEwODE4RUUwMDlGIiBuYW1lPSJsaW5rVHlwZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDEwODAwNTcwMjc2Ij4NCi0gICAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR2lheDF1ZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxMDgxOEVFMDA5RiI+DQotICAgICAgICAgICAgICAgIDxib2R5PlRoaXMgYXR0cmlidXRlIGV4cHJlc3NlcyB0aGUgdHlwZSBvZiB0aGUgV29yayBPcmRlciByZWxhdGlvbnNoaXAgYnkgYXNzaWduaW5nIGEgdmFsdWUgZnJvbSB0aGUgV29yayBPcmRlciBUeXBlIGVudW1lcmF0aW9uLjwvYm9keT4NCi0gICAgICAgICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iX0dpYXgyT2ZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Ym9keT5maW5pc2hUb1N0YXJ0PC9ib2R5Pg0KLSAgICAgICAgICAgICAgPC9kZWZhdWx0VmFsdWU+DQotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDI4MEVEMzgwMEExIiBuYW1lPSJwcmVkIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MjdBOTI1NDAyMjciIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDI4MEVEMzgwMEEwIj4NCi0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0drOUljLWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIxIi8+DQotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HazlJY3VmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iMSIvPg0KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxMTlBNEU2MDJDMSIgbmFtZT0iUGxhbm5pbmdEYXRhIj4NCi0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dpYXgydWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTE5QTRFNjAyQzEiPg0KLSAgICAgICAgICAgICAgPGJvZHk+UGxhbm5pbmcgRGF0YSBpcyBhIE1ldGhvZCBFbGVtZW50IHRoYXQgYWRkcyBwbGFubmluZyBkYXRhIHRvIEJyZWFrZG93biBFbGVtZW50cyB3aGVuIGl0IGlzIHVzZWQgZm9yIGEgUHJvY2VzcyBQbGFubmluZyBUZW1wbGF0ZS4gIEZvciBEZWxpdmVyeSBQcm9jZXNzZXMgYW5kIENhcGFiaWxpdHkgUGF0dGVybnMgdGhpcyBjbGFzcyBjYW4gZWl0aGVyIG5vdCBiZSBpbnN0YW50aWF0ZWQgb3IgcG9wdWxhdGVkIHdpdGggZGVmYXVsdCBkYXRhLg0KLVBsYW5uaW5nIERhdGEgZmFjdG9ycyBvdXQgc3BlY2lmaWMgb3B0aW9uYWwgZGF0YSBuZWVkZWQgZm9yIHJlcHJlc2VudGluZyBwbGFubmluZyB0ZW1wbGF0ZXMuICBUaGlzIGFzc29jaWF0aW9uIGFsbG93cyB0byBhY2Nlc3MgcGxhbm5pbmcgZGF0YSBpZiBpdCBpcyBzdG9yZWQgZm9yIHRoZSBCcmVha2Rvd24gRWxlbWVudC4NCi0oTk9URSwgVEhFIEFUVFJJQlVURVMgRk9SIFRISVMgQ0xBU1MgQVJFIE5PVCBDT01QTEVURSwgWUVUKQ0KLTwvYm9keT4NCi0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDI4M0VFRjkwMEUyIiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDI4M0U4QTEwMzQxIi8+DQotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxMTlBNThEMDBEOSIgbmFtZT0ic3RhcnREYXRlIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEY0NDk4RDAxODUiPg0KLSAgICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HaWtpMC1mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDExOUE1OEQwMEQ5Ij4NCi0gICAgICAgICAgICAgICAgPGJvZHk+VGhlIGRlZmF1bHQgc3RhcnQgZGF0ZSBmb3IgYSBwbGFuZWQgVGFzay48L2JvZHk+DQotICAgICAgICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTE5QTU5QTAxMjkiIG5hbWU9ImZpbmlzaERhdGUiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjQ0OThEMDE4NSI+DQotICAgICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dpa2kxdWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTE5QTU5QTAxMjkiPg0KLSAgICAgICAgICAgICAgICA8Ym9keT5UaGUgZGVmYXVsdCBmaW5pc2ggZGF0ZSBmb3IgYSBwbGFuZWQgVGFzay48L2JvZHk+DQotICAgICAgICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTE5QTc1QzAzREIiIG5hbWU9InJhbmsiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEE0MDA3QiI+DQotICAgICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dpa2kyZWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTE5QTc1QzAzREIiPg0KLSAgICAgICAgICAgICAgICA8Ym9keT5UaGUgZGVmYXVsdCByYW5rIGZvciBhIHBsYW5lZCBUYXNrLjwvYm9keT4NCi0gICAgICAgICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDBFRiIgbmFtZT0iQnJlYWtkb3duRWxlbWVudCIgaXNBYnN0cmFjdD0idHJ1ZSI+DQotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HaXRzd3VmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMEVGIj4NCi0gICAgICAgICAgICAgIDxib2R5PkJyZWFrZG93biBFbGVtZW50IGlzIGFuIGFic3RyYWN0IGdlbmVyYWxpemF0aW9uIGZvciBhbnkgdHlwZSBvZiBNZXRob2QgRWxlbWVudCB0aGF0IGlzIHBhcnQgb2YgYSBicmVha2Rvd24gc3RydWN0dXJlLiAgSXQgZGVmaW5lcyBhIHNldCBvZiBwcm9wZXJ0aWVzIGF2YWlsYWJsZSB0byBhbGwgb2YgaXRzIHNwZWNpYWxpemF0aW9ucy48L2JvZHk+DQotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxRUMzOTgwMDMyNCIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQxRERFNjU4MDE1NyIvPg0KLSAgICAgICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MjgzRTkxRjAwNjEiIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0MjgzRThBMTAzNDEiLz4NCi0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwM0I2IiBuYW1lPSJwcmVmaXgiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyI+DQotICAgICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dpdHN4LWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAzQjYiPg0KLSAgICAgICAgICAgICAgICA8Ym9keT5QcmVmaXggcmVwcmVzZW50cyBhbiBhZGRpdGlvbmFsIGxhYmVsIHRoYXQgd2lsbCBiZSBwcmVzZW50ZWQgYXMgYSBwcmVmaXggdG8gYW55IEJyZWFrZG93biBFbGVtZW50IHRvIGluZGljYXRlIGEgdXNlci1kZWZpbmVkIHN1Yi10eXBlIGZvciB0aGUgZWxlbWVudC4gIEZvciBleGFtcGxlLCBpZiB0aGUgcHJvY2VzcyBlbmdpbmVlciB3b3VsZCBsaWtlIHRvIGRpc3Rpbmd1aXNoIGhpcyBBY3Rpdml0aWVzIGJ5ICdNb2R1bGUnIChhcyBkb25lIGluIHRoZSBJQk0gUmF0aW9uYWwgU3VtbWl0IEFzY2VuZGFudCBNZXRob2QpLCBoZSBjYW4gZGVmaW5lIGEgZGlmZmVyZW50IHByZWZpeCBmb3IgZXZlcnkgbW9kZWwgdG8gYmUgdXNlZCBpbiBhZGRpdGlvbiB0byBuYW1pbmcgQWN0aXZpdGllcywgZS5nLiAmcXVvdDtTUkEuRXN0YWJsaXNoIFJlcXVpcmVtZW50cyZxdW90OyB3aXRoIFNSQSBpbmRpY2F0aW5nIHRoYXQgdGhpcyBBY3Rpdml0eSBiZWxvbmdzIHRvIHRoZSAmcXVvdDtTb2Z0d2FyZSBSZXF1aXJlbWVudHMgQW5hbHlzaXMmcXVvdDsgbW9kdWxlLiAgQW5vdGhlciBjb21tb24gYXBwbGljYXRpb24gZm9yIHByZWZpeCBpcyB0byBxdWFsaWZ5IHJvbGVzIGluIFJvbGUgRGVzY3JpcHRvcnMuICBGb3IgZXhhbXBsZSwgJnF1b3Q7Q3VzdG9tZXIuQXJjaGl0ZWN0JnF1b3Q7IHdvdWxkIGRlZmluZSBhICZxdW90O0N1c3RvbWVyJnF1b3Q7IHByZWZpeCBmb3IgdGhlIFJvbGUgRGVzY3JpcHRvciAmcXVvdDtBcmNoaXRlY3QmcXVvdDsgZXhwcmVzc2luZyB0aGF0IHRoaXMgaXMgYW4gYXJjaGl0ZWN0IG9uIHRoZSBjdXN0b21lciBzaWRlIGFuZCBub3QgdGhlIGRldmVsb3BtZW50IHRlYW0gc2lkZS4NCi08L2JvZHk+DQotICAgICAgICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3FXZTkwZXlIRWR1NS12VmpsZlZzZlEiIHZhbHVlPSIxIi8+DQotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9xV2U5ME95SEVkdTUtdlZqbGZWc2ZRIi8+DQotICAgICAgICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfckhFR01PeUhFZHU1LXZWamxmVnNmUSIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyIgdmFsdWU9IiIvPg0KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDNDQSIgbmFtZT0iaXNQbGFubmVkIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il81R2NZQU9pZUVkdVFidVk2VXdNU1FnIj4NCi0gICAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR2kzZHd1ZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDNDQSI+DQotICAgICAgICAgICAgICAgIDxib2R5PkEga2V5IGFwcGxpY2F0aW9uIGZvciBEZXZlbG9wbWVudCBQcm9jZXNzZXMgZXhwcmVzc2VkIHdpdGggQnJlYWtkb3duIHN0cnVjdHVyZXMgaXMgdG8gZ2VuZXJhdGUgYSBwcm9qZWN0IHBsYW4gZnJvbSBpdC4gIEEgcHJvY2VzcyBhcyBkZWZpbmVkIGluIFVNQSAoY2YuIHdpdGggU2VjdGlvbnMgWFggYW5kIDUuMikgaXMgYSBtdWx0aS1kaW1lbnNpb25hbCBzdHJ1Y3R1cmUgZGVmaW5pbmcgd2hhdCB3b3JrIGlzIGJlaW5nIHBlcmZvcm1lZCBhdCB3aGF0IHRpbWUgYnkgd2hpY2ggcm9sZXMgdXNpbmcgd2hpY2ggaW5wdXQgYW5kIHByb2R1Y2luZyB3aGF0IG91dHB1dHMuICBBIHByb2plY3QgcGxhbiBhcyBpdCBpcyByZXByZXNlbnRlZCBpbiBwcm9qZWN0IHBsYW5uaW5nIHRvb2xzIHN1Y2ggYXMgSUJNIFJhdGlvbmFsIFBvcnRmb2xpbyBNYW5hZ2VyIG9yIE1pY3Jvc29mdCBQcm9qZWN0IG5vcm1hbGx5IGRvZXMgbm90IG5lZWQgYWxsIHRoaXMgaW5mb3JtYXRpb24gYW5kIGlzIG5vcm1hbGx5IGxpbWl0ZWQgdG8ganVzdCByZXByZXNlbnRpbmcgYSBzdWJzZXQuICBGb3IgZXhhbXBsZSwgYSB0eXBpY2FsIE1TIFByb2plY3QgcGxhbiBvbmx5IHJlcHJlc2VudHMgdGhlIHdvcmsgYnJlYWtkb3duIGNvbnNpc3Rpbmcgb2YgVGFza3MgYW5kIEFjdGl2aXRpZXMgKHNvbWV0aW1lcyByZWZlcnJlZCB0byBhcyBzdW1tYXJ5IHRhc2tzKS4gIEl0IGRvZXMgbm90IHNob3cgdGhlIGlucHV0IGFuZCBvdXRwdXQgV29yayBQcm9kdWN0cyBmb3IgYSBUYXNrLCBidXQgaXQgY2FuIHNob3cgd2hpY2ggcm9sZXMgc2hhbGwgYmUgc3RhZmZlZCBmb3IgcGVyZm9ybWluZyB0aGUgVGFzay4gIEhvd2V2ZXIsIHN1Y2ggcm9sZSBhbGxvY2F0aW9uIG5lZWQgdG8gYmUgcmVwbGFjZWQgd2l0aCBjb25jcmV0ZSByZXNvdXJjZXMgd2hlbiBpbnN0YW50aWF0aW5nIHRoZSBwbGFuIGZvciBhIGNvbmNyZXRlIHByb2plY3QuICBTb21ldGltZXMgcHJvamVjdCBwbGFucyBjYW4gdGhlbiBhZ2FpbiBiZSBvcmdhbml6ZWQgZGlmZmVyZW50bHkgYnkgb3JnYW5pemluZyB3b3JrIGJ5IGRlbGl2ZXJhYmxlcyBpbiB3aGljaCBXb3JrIFByb2R1Y3RzIGFyZSBtYXBwZWQgdG8gdGhlIHBsYW4ncyBzdW1tYXJ5IHRhc2tzIGFuZCBUYXNrIHRoYXQgaGF2ZSB0aGVzZSB3b3JrIHByb2R1Y3RzIGFzIG91dHB1dCBtYXBwZWQgYmVsb3cgc3VjaCBhcyBzdW1tYXJ5IHRhc2suICBUaGVyZWZvcmUsIGEgcHJvY2VzcyBjYW4gbWFrZSByZWNvbW1lbmRhdGlvbnMgYWJvdXQgd2hpY2ggZWxlbWVudHMgdG8gaW5jbHVkZSBhbmQgd2hpY2ggdG8gZXhjbHVkZSB3aGVuIGdlbmVyYXRpbmcgYSBwbGFuLiAgV2hlbiB0aGUgaXNQbGFubmVkIGF0dHJpYnV0ZSBpcyBzZXQgdG8gRmFsc2UgZm9yIGFuIGluc3RhbmNlIG9mIGEgQnJlYWtkb3duIEVsZW1lbnQsIHRoZW4gdGhpcyBlbGVtZW50IHNoYWxsIG5vdCBiZSBub3QgaW5jbHVkZWQgd2hlbiBhIGNvbmNyZXRlIHByb2plY3QgcGxhbiBpcyBiZWluZyBnZW5lcmF0ZWQgZnJvbSB0aGUgYnJlYWtkb3duIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zIHRoaXMgZWxlbWVudC4NCi0NCi0NCi08L2JvZHk+DQotICAgICAgICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9Il9HaTNkeE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJfNUdjWUFPaWVFZHVRYnVZNlV3TVNRZyI+DQotICAgICAgICAgICAgICAgIDxib2R5PnRydWU8L2JvZHk+DQotICAgICAgICAgICAgICA8L2RlZmF1bHRWYWx1ZT4NCi0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAzRDQiIG5hbWU9Imhhc011bHRpcGxlT2NjdXJyZW5jZXMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzVHY1lBT2llRWR1UWJ1WTZVd01TUWciPg0KLSAgICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HaTNkeC1mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwM0Q0Ij4NCi0gICAgICAgICAgICAgICAgPGJvZHk+SnVzdCBhcyB0aGUgaXNQbGFubmVkIGF0dHJpYnV0ZSB0aGUgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcyBhdHRyaWJ1dGUgaGFzIGFuIGltcGFjdCBvbiBnZW5lcmF0aW5nIHBsYW5zIGZyb20gYSBQcm9jZXNzLiAgV2hlbiB0aGlzIGF0dHJpYnV0ZSBpcyBzZXQgdG8gVHJ1ZSBmb3IgYSBCcmVha2Rvd24gRWxlbWVudCB0aGVuIGl0IHdpbGwgdHlwaWNhbGx5IG9jY3VyIG11bHRpcGxlIHRpbWVzIHdpdGhpbiB0aGUgc2FtZSBBY3Rpdml0eS4gIEZvciBleGFtcGxlLCBhIFRhc2sgc3VjaCBhcyAmcXVvdDtEZXRhaWwgVXNlIENhc2UmcXVvdDsgd291bGQgYmUgcGVyZm9ybWVkIGZvciBldmVyeSB1c2UgY2FzZSBpZGVudGlmaWVkIGZvciBhIHBhcnRpY3VsYXIgSXRlcmF0aW9uIG9yIEFjdGl2aXR5LiAgR2VuZXJhdGluZyBhIHBsYW4gd291bGQgbGlzdCBvbmUgVGFzayBpbnN0YW5jZSBwZXIgdXNlIGNhc2UuDQotPC9ib2R5Pg0KLSAgICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJfR2kzZHllZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iXzVHY1lBT2llRWR1UWJ1WTZVd01TUWciPg0KLSAgICAgICAgICAgICAgICA8Ym9keT5mYWxzZTwvYm9keT4NCi0gICAgICAgICAgICAgIDwvZGVmYXVsdFZhbHVlPg0KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxMDA2QTZCMDFGQiIgbmFtZT0iaXNPcHRpb25hbCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfNUdjWUFPaWVFZHVRYnVZNlV3TVNRZyI+DQotICAgICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dpM2R5LWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTAwNkE2QjAxRkIiPg0KLSAgICAgICAgICAgICAgICA8Ym9keT5UaGUgaXNPcHRpb25hbCBhdHRyaWJ1dGUgaW5kaWNhdGVzIHRoYXQgdGhlIEJyZWFrZG93biBFbGVtZW50IGRlc2NyaWJlcyB3b3JrLCBhIHdvcmsgcmVzdWx0LCBvciBldmVuIHdvcmsgcmVzb3VyY2VzLCB3aGljaCBpbmNsdXNpb24gaXMgbm90IG1hbmRhdG9yeSB3aGVuIHBlcmZvcm1pbmcgYSBwcm9qZWN0IHRoYXQgaXMgcGxhbm5lZCBiYXNlZCBvbiBhIHByb2Nlc3MgY29udGFpbmluZyB0aGlzIGVsZW1lbnQuPC9ib2R5Pg0KLSAgICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJfR2kzZHplZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iXzVHY1lBT2llRWR1UWJ1WTZVd01TUWciPg0KLSAgICAgICAgICAgICAgICA8Ym9keT5mYWxzZTwvYm9keT4NCi0gICAgICAgICAgICAgIDwvZGVmYXVsdFZhbHVlPg0KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDJCNiIgbmFtZT0icHJlc2VudGVkQWZ0ZXIiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDBFRiIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyQjUiPg0KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR2tEd25PZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IjEiLz4NCi0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0drRHdtLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MjFFOEYwRTAyMzQiIG5hbWU9InByZXNlbnRlZEJlZm9yZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMEVGIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQyMUU4RjBDMDI4MSI+DQotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9Ha3pYZy1mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iMSIvPg0KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR2t6WGd1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxMTlBNEY5MDA2OSIgbmFtZT0icGxhbm5pbmdEYXRhIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MTE5QTRFNjAyQzEiIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDExOUE0RjgwMjBBIj4NCi0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0dtSmJRLWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIxIi8+DQotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HbUpiUXVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDFFMEZGRDMwMEYwIiBuYW1lPSJzdXBlckFjdGl2aXRpZXMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVEMDNEMyIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MUUwRkZEMzAwRUYiPg0KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR21TbFBPZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IjEiLz4NCi0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0dtU2xPLWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIxIi8+DQotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMEU2IiBuYW1lPSJEZXNjcmlwdG9yIiBpc0Fic3RyYWN0PSJ0cnVlIj4NCi0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dqQW5zZWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwRTYiPg0KLSAgICAgICAgICAgICAgPGJvZHk+QSBEZXNjcmlwdG9yIGlzIGFuIGFic3RyYWN0IGdlbmVyYWxpemF0aW9uIGZvciBzcGVjaWFsIEJyZWFrZG93biBFbGVtZW50cyB0aGF0IHJlZmVyZW5jZXMgb25lIGNvbmNyZXRlIENvbnRlbnQgRWxlbWVudC4gIEEgZGVzY3JpcHRvciBwcm92aWRlcyBhIHJlcHJlc2VudGF0aW9uIG9mIGEgQ29udGVudCBFbGVtZW50IHdpdGhpbiBicmVha2Rvd24gc3RydWN0dXJlcy4gIEluIGFkZGl0aW9uIHRvIGp1c3QgcmVmZXJlbmNpbmcgQ29udGVudCBFbGVtZW50cyBpdCBhbGxvd3Mgb3ZlcnJpZGluZyB0aGUgQ29udGVudCBFbGVtZW50cyBzdHJ1Y3R1cmFsIHJlbGF0aW9uc2hpcHMgYnkgZGVmaW5pbmcgaXRzIG93biBzZXRzIG9mIGFzc29jaWF0aW9ucy4NCi1EZXNjcmlwdG9ycyBhcmUgdGhlIGtleSBjb25jZXB0IGZvciByZWFsaXppbmcgdGhlIHNlcGFyYXRpb24gb2YgcHJvY2Vzc2VzIGZyb20gbWV0aG9kIGNvbnRlbnQuICBBIERlc2NyaXB0b3IgY2FuIGJlIGNoYXJhY3Rlcml6ZWQgYXMgYSByZWZlcmVuY2Ugb2JqZWN0IGZvciBvbmUgcGFydGljdWxhciBDb250ZW50IEVsZW1lbnQsIHdoaWNoIGhhcyBpdHMgb3duIHJlbGF0aW9uc2hpcHMgYW5kIHByb3BlcnRpZXMuICBXaGVuIGEgRGVzY3JpcHRvciBpcyBjcmVhdGVkIGl0IHNoYWxsIGJlIHByb3ZpZGVkIHdpdGggY29uZ3J1ZW50IGNvcGllcyBvZiB0aGUgcmVsYXRpb25zaGlwcyBkZWZpbmVkIGZvciB0aGUgcmVmZXJlbmNlZCBjb250ZW50IGVsZW1lbnQuICBIb3dldmVyLCBhIHVzZXIgY2FuIG1vZGlmeSB0aGVzZSByZWxhdGlvbnNoaXBzIGZvciB0aGUgcGFydGljdWxhciBwcm9jZXNzIHNpdHVhdGlvbiBmb3Igd2hpY2ggdGhlIGRlc2NyaXB0b3IgaGFzIGJlZW4gY3JlYXRlZC4gDQotPC9ib2R5Pg0KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyOEYiIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwRUYiLz4NCi0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDI4MTQyQkIwM0I1IiBuYW1lPSJpc1N5bmNocm9uaXplZFdpdGhTb3VyY2UiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzVHY1lBT2llRWR1UWJ1WTZVd01TUWciPg0KLSAgICAgICAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iX0dqQW50ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Il81R2NZQU9pZUVkdVFidVk2VXdNU1FnIj4NCi0gICAgICAgICAgICAgICAgPGJvZHk+dHJ1ZTwvYm9keT4NCi0gICAgICAgICAgICAgIDwvZGVmYXVsdFZhbHVlPg0KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDA4QiIgbmFtZT0iUm9sZURlc2NyaXB0b3IiPg0KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR2pBbnQtZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDA4QiI+DQotICAgICAgICAgICAgICA8Ym9keT5BIFJvbGUgRGVzY3JpcHRvciByZXByZXNlbnRzIGEgUm9sZSBpbiB0aGUgY29udGV4dCBvZiBvbmUgc3BlY2lmaWMgQWN0aXZpdHkuICBFdmVyeSBicmVha2Rvd24gc3RydWN0dXJlIGNhbiBkZWZpbmUgZGlmZmVyZW50IHJlbGF0aW9uc2hpcHMgb2YgUm9sZSBEZXNjcmlwdG9ycyB0byBUYXNrIERlc2NyaXB0b3JzIGFuZCBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvcnMuICBUaGVyZWZvcmUgb25lIFJvbGUgY2FuIGJlIHJlcHJlc2VudGVkIGJ5IG1hbnkgUm9sZSBEZXNjcmlwdG9ycyBlYWNoIHdpdGhpbiB0aGUgY29udGV4dCBvZiBhbiBBY3Rpdml0eSB3aXRoIGl0cyBvd24gc2V0IG9mIHJlbGF0aW9uc2hpcHMuPC9ib2R5Pg0KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxNjAiIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwRTYiLz4NCi0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTZEIiBuYW1lPSJSb2xlIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyOTYiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTZBIj4NCi0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0drTTZqLWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIxIi8+DQotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9Ha002anVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTlEIiBuYW1lPSJtb2RpZmllcyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDQ1IiBpc0Rlcml2ZWQ9InRydWUiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTlDIj4NCi0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0drZ2NqT2ZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+DQotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9Ha2djaS1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTdGIiBuYW1lPSJyZXNwb25zaWJsZUZvciIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDQ1IiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDE3RSI+DQotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9Ha3pYYy1mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR2t6WGN1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDAwOSIgbmFtZT0iVGFza0Rlc2NyaXB0b3IiPg0KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR2pBbnUtZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDAwOSI+DQotICAgICAgICAgICAgICA8Ym9keT5BIFRhc2sgRGVzY3JpcHRvciBpcyBhIERlc2NyaXB0b3IgYW5kIFdvcmsgQnJlYWtkb3duIEVsZW1lbnQgdGhhdCByZXByZXNlbnRzIGEgcHJveHkgZm9yIGEgVGFzayBpbiB0aGUgY29udGV4dCBvZiBvbmUgc3BlY2lmaWMgQWN0aXZpdHkuICBFdmVyeSBicmVha2Rvd24gc3RydWN0dXJlIGNhbiBkZWZpbmUgZGlmZmVyZW50IHJlbGF0aW9uc2hpcHMgb2YgVGFzayBEZXNjcmlwdG9ycyB0byBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvcnMgYW5kIFJvbGUgRGVzY3JpcHRvcnMuIFRoZXJlZm9yZSBvbmUgVGFzayBjYW4gYmUgcmVwcmVzZW50ZWQgYnkgbWFueSBUYXNrIERlc2NyaXB0b3JzIGVhY2ggd2l0aGluIHRoZSBjb250ZXh0IG9mIGFuIEFjdGl2aXR5IHdpdGggaXRzIG93biBzZXQgb2YgcmVsYXRpb25zaGlwcy4NCi1BIGtleSBkaWZmZXJlbmNlIGJldHdlZW4gTWV0aG9kIENvbnRlbnQgYW5kIFByb2Nlc3MgaXMgdGhhdCBhIENvbnRlbnQgRWxlbWVudCBzdWNoIGFzIFRhc2sgZGVzY3JpYmVzIGFsbCBhc3BlY3RzIG9mIGRvaW5nIHdvcmsgZGVmaW5lZCBhcm91bmQgdGhpcyBUYXNrLiAgVGhpcyBkZXNjcmlwdGlvbiBpcyBtYW5hZ2VkIGluIHN0ZXBzLCB3aGljaCBhcmUgbW9kZWxlZCBhcyBTZWN0aW9ucyBvZiB0aGUgVGFza3MnIENvbnRlbnQgRGVzY3JpcHRpb25zLiAgV2hlbiBhcHBseWluZyBhIFRhc2sgaW4gYSBQcm9jZXNzJyBBY3Rpdml0eSB3aXRoIGEgVGFzayBEZXNjcmlwdG9yIGEgUHJvY2VzcyBFbmdpbmVlciBuZWVkcyB0byBpbmRpY2F0ZSB0aGF0IGF0IHRoYXQgcGFydGljdWxhciBwb2ludCBpbiB0aW1lIGluIHRoZSBQcm9jZXNzIGRlZmluaXRpb24gZm9yIHdoaWNoIHRoZSBUYXNrIERlc2NyaXB0b3IgaGFzIGJlZW4gY3JlYXRlZCwgb25seSBhIHN1YnNldCBvZiBzdGVwcyBzaGFsbCBiZSBwZXJmb3JtZWQuICBIZSBkZWZpbmVzIHRoaXMgc2VsZWN0aW9uIHVzaW5nIHRoZSBzZWxlY3RlZFN0ZXBzIGFzc29jaWF0aW9uLiAgSWYgaGUgd2FudHMgdG8gYWRkIHN0ZXBzIHRvIGEgVGFzayBEZXNjcmlwdG9yLCBoZSBjYW4gZGVzY3JpYmUgdGhlc2UgZWl0aGVyIHByYWdtYXRpY2FsbHkgaW4gdGhlIHJlZmluZWREZXNjcmlwdGlvbiBhdHRyaWJ1dGUgb3IgJ3Byb3Blcmx5JyBjcmVhdGUgYSBjb250cmlidXRpbmcgVGFzayB0byB0aGUgVGFzayB0aGUgVGFzayBEZXNjcmlwdG9yIHJlZmVycyB0by4NCi0NCi08L2JvZHk+DQotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDMwMyIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDBFNiIvPg0KLSAgICAgICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MjdBOTIzQjAwMDIiIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0MjdBOTI1NDAyMjciLz4NCi0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzEwIiBuYW1lPSJUYXNrIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyOUUiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzBEIj4NCi0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0drRHdxT2ZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIxIi8+DQotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9Ha0R3cC1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzIyIiBuYW1lPSJhZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDhCIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDMyMSI+DQotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9Ha002bGVmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR2tNNmxPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDM0MCIgbmFtZT0iYXNzaXN0ZWRCeSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDhCIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDMzRiI+DQotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9Ha1dyZy1mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR2tXcmd1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDI1QyIgbmFtZT0iZXh0ZXJuYWxJbnB1dCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDQ1IiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDI1QiI+DQotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9Ha1dyak9mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR2tXcmktZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxNkQ3NUFCMDI4MSIgbmFtZT0ibWFuZGF0b3J5SW5wdXQiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDA0NSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MTZENzVBQTAwNEIiPg0KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR2tnY2ctZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4NCi0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0drZ2NndWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyMkMiIG5hbWU9Im9wdGlvbmFsSW5wdXQiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDA0NSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyMjkiPg0KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR2tnY21PZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4NCi0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0drZ2NsLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyNDgiIG5hbWU9Im91dHB1dCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDQ1IiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDIzRCI+DQotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9Ha3BtZHVmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR2twbWRlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDM1NCIgbmFtZT0icGVyZm9ybWVkUHJpbWFyaWx5QnkiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDA4QiIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzNTMiPg0KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR2twbWhlZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4NCi0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0drcG1oT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MjM3NUUwNTAxNzMiIG5hbWU9InNlbGVjdGVkU3RlcHMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQyMUU0Q0YzMDFBRSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MjM3NUUwNDAzOTAiPg0KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR29PZTQtZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4NCi0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0dvT2U0dWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwNDUiIG5hbWU9IldvcmtQcm9kdWN0RGVzY3JpcHRvciI+DQotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HakFud09mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDQ1Ij4NCi0gICAgICAgICAgICAgIDxib2R5PkEgV29yayBQcm9kdWN0IERlc2NyaXB0b3IgcmVwcmVzZW50cyBhIFdvcmsgUHJvZHVjdCBpbiB0aGUgY29udGV4dCBvZiBvbmUgc3BlY2lmaWMgQWN0aXZpdHkuICBFdmVyeSBicmVha2Rvd24gc3RydWN0dXJlIGNhbiBkZWZpbmUgZGlmZmVyZW50IHJlbGF0aW9uc2hpcHMgb2YgV29yayBQcm9kdWN0IERlc2NyaXB0b3JzIHRvIFRhc2sgRGVzY3JpcHRvcnMgYW5kIFJvbGUgRGVzY3JpcHRvcnMuICBUaGVyZWZvcmUgb25lIFdvcmsgUHJvZHVjdCBjYW4gYmUgcmVwcmVzZW50ZWQgYnkgbWFueSBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvcnMgZWFjaCB3aXRoaW4gdGhlIGNvbnRleHQgb2YgYW4gQWN0aXZpdHkgd2l0aCBpdHMgb3duIHNldCBvZiByZWxhdGlvbnNoaXBzLjwvYm9keT4NCi0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwM0Q2IiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMEU2Ii8+DQotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxMkE1Rjg2MDJGNiIgbmFtZT0iYWN0aXZpdHlFbnRyeVN0YXRlIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiPg0KLSAgICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HaktZcy1mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDEyQTVGODYwMkY2Ij4NCi0gICAgICAgICAgICAgICAgPGJvZHk+R2l2ZW4gdGhhdCBhbiBpbnN0YW5jZSBvZiBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvciBoYXMgYmVlbiBjcmVhdGVkIGZvciBhIHNwZWNpZmljIEFjdGl2aXR5LCB0aGVuIHRoZSBBY3Rpdml0eSBFbnRyeSBTdGF0ZSBhdHRyaWJ1dGUgc3BlY2lmaWVzIHRoZSBkZXNpcmVkIHN0YXRlIG9mIGluc3RhbmNlcyBvZiB0aGUgcmVmZXJlbmNlZCBXb3JrIFByb2R1Y3Qgd2hlbiB3b3JrIG9uIHRoZSBBY3Rpdml0eSBpcyBpbml0aWF0ZWQgKGkuZS4gd29yayBvbiB0aGUgQWN0aXZpdHkncyBUYXNrIERlc2NyaXB0b3JzIGlzIGJlaW5nIGluaXRpYXRlZCB0aGF0IHVzZSB0aGlzIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9yIGFzIGlucHV0KS4gIA0KLUZvciBzb21lIFdvcmsgUHJvZHVjdHMgc3RhdGUgaXMgZXhwcmVzc2VkIGluIHBlcmNlbnRhZ2Ugb2YgY29tcGxldGlvbiwgY29tcGxpYW5jZSB0byB3b3JrIHByb2R1Y3QgY2hlY2tsaXN0LCBpbmZvcm1hbCBzdGF0ZSBkZXNjcmlwdGlvbnMsIGV0Yy4gIE90aGVycyBoYXZlIHZlcnkgc3BlY2lmaWMgc3RhdGVzIGV4cHJlc3NlZCBhcyBlbnVtZXJhdGlvbnMgc3VjaCBhcyBbaWRlbnRpZmllZCwgYnJpZWZseSBkZXNjcmliZWQsIG91dGxpbmVkLCBkZXRhaWxlZF0gZm9yIHVzZSBjYXNlcy4gIE90aGVyIFdvcmsgUHJvZHVjdCBzdGF0ZXMgcmVsYXRlIHRvIHNvbWUgcXVhbGl0eSBtZWFzdXJlcyBvciBsaWZlY3ljbGUgc3RhdGVzIHN1Y2ggYXMgW3Jldmlld2VkLCBpbXBsZW1lbnRlZCwgdGVzdGVkXS4NCi08L2JvZHk+DQotICAgICAgICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0tjMVp3T3lKRWR1NS12VmpsZlZzZlEiIHZhbHVlPSIxIi8+DQotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9LY3Jvd095SkVkdTUtdlZqbGZWc2ZRIi8+DQotICAgICAgICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfS1ZZRzRPeUpFZHU1LXZWamxmVnNmUSIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyIgdmFsdWU9IiIvPg0KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxM0VDMDE4MDM0MCIgbmFtZT0iYWN0aXZpdHlFeGl0U3RhdGUiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyI+DQotICAgICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dqS1l0dWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTNFQzAxODAzNDAiPg0KLSAgICAgICAgICAgICAgICA8Ym9keT5HaXZlbiB0aGF0IGFuIGluc3RhbmNlIG9mIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9yIGhhcyBiZWVuIGNyZWF0ZWQgZm9yIGEgc3BlY2lmaWMgQWN0aXZpdHksIHRoZW4gdGhlIEFjdGl2aXR5IEV4aXN0IFN0YXRlIGF0dHJpYnV0ZSBzcGVjaWZpZXMgdGhlIGRlc2lyZWQgc3RhdGUgb2YgaW5zdGFuY2VzIG9mIHRoZSByZWZlcmVuY2VkIFdvcmsgUHJvZHVjdCB3aGVuIHdvcmsgb24gdGhlIEFjdGl2aXR5IGlzIGZpbmlzaGVkIChpLmUuIHdvcmsgb24gdGhlIEFjdGl2aXR5J3MgVGFzayBEZXNjcmlwdG9ycyBoYXMgZmluaXNoZWQgdGhhdCBoYXZlIHRoaXMgV29yayBQcm9kdWN0IERlc2NyaXB0b3IgYXMgb3V0cHV0KS4NCi1Gb3Igc29tZSBXb3JrIFByb2R1Y3RzIHN0YXRlIGlzIGV4cHJlc3NlZCBpbiBwZXJjZW50YWdlIG9mIGNvbXBsZXRpb24sIGNvbXBsaWFuY2UgdG8gd29yayBwcm9kdWN0IGNoZWNrbGlzdCwgaW5mb3JtYWwgc3RhdGUgZGVzY3JpcHRpb25zLCBldGMuICBPdGhlcnMgaGF2ZSB2ZXJ5IHNwZWNpZmljIHN0YXRlcyBleHByZXNzZWQgYXMgZW51bWVyYXRpb25zIHN1Y2ggYXMgW2lkZW50aWZpZWQsIGJyaWVmbHkgZGVzY3JpYmVkLCBvdXRsaW5lZCwgZGV0YWlsZWRdIGZvciB1c2UgY2FzZXMuICBPdGhlciBXb3JrIFByb2R1Y3Qgc3RhdGVzIHJlbGF0ZSB0byBzb21lIHF1YWxpdHkgbWVhc3VyZXMgb3IgbGlmZWN5Y2xlIHN0YXRlcyBzdWNoIGFzIFtyZXZpZXdlZCwgaW1wbGVtZW50ZWQsIHRlc3RlZF0uDQotPC9ib2R5Pg0KLSAgICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9ZdHNYb2V5R0VkdTUtdlZqbGZWc2ZRIiB2YWx1ZT0iMSIvPg0KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfWXRzWG9PeUdFZHU1LXZWamxmVnNmUSIvPg0KLSAgICAgICAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iX1loQjBvT3lHRWR1NS12VmpsZlZzZlEiIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiIHZhbHVlPSIiLz4NCi0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzREEiIG5hbWU9IldvcmtQcm9kdWN0IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyQkMiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwM0Q3Ij4NCi0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0drTTZodWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIxIi8+DQotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9Ha002aGVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDIxIiBuYW1lPSJpbXBhY3RlZEJ5IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwNDUiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDIwIj4NCi0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0drV3JsZWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+DQotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9Ha1dybE9mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDIzIiBuYW1lPSJpbXBhY3RzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwNDUiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDIwIj4NCi0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0drV3JtT2ZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+DQotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9Ha1dybC1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDBGIiBuYW1lPSJkZWxpdmVyYWJsZVBhcnRzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwNDUiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDBDIj4NCi0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0drcG1mLWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+DQotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9Ha3BtZnVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDFGMDZCNjUwMEU2IiBuYW1lPSJDb21wb3NpdGVSb2xlIj4NCi0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dqS1l1ZWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUYwNkI2NTAwRTYiPg0KLSAgICAgICAgICAgICAgPGJvZHk+QSBDb21wb3NpdGUgUm9sZSBpcyBhIHNwZWNpYWwgUm9sZSBEZXNjcmlwdG9yIHRoYXQgcmVsYXRlcyB0byBtb3JlIHRoZW4gb25lIFJvbGUuICBJdCByZXByZXNlbnRzIGEgZ3JvdXBpbmcgb2YgUm9sZXMgd2l0aCB0aGUgbWFpbiBwdXJwb3NlIG9mIHNpbXBsaWZpY2F0aW9uLCBpLmUuIHJlZHVjaW5nIHRoZSBudW1iZXIgb2Ygcm9sZXMgZm9yIGEgcHJvY2Vzcy4NCi1BIENvbXBvc2l0ZSBSb2xlIGlzIGEgZ3JvdXBpbmcgb2YgUm9sZXMgdGhhdCBjYW4gYmUgdXNlZCBpbiBhbiBBY3Rpdml0eSBvciBQcm9jZXNzIHRvIHJlZHVjZSB0aGUgbnVtYmVyIG9mIFJvbGVzLiAgQSB0eXBpY2FsIGFwcGxpY2F0aW9uIHdvdWxkIGJlIGEgcHJvY2VzcyBmb3IgYSBzbWFsbCB0ZWFtIGluIHdoaWNoIGEgc3RhbmRhcmQgc2V0IG9mIHJvbGVzIGZyb20gdGhlIG1ldGhvZCBjb250ZW50IHdvdWxkIGJlIGFsbCBwZXJmb3JtZWQgYnkgb25lIG9yIG1vcmUgcmVzb3VyY2UuICBCeSB1c2luZyBDb21wb3NpdGUgUm9sZSB0aGUgcHJvY2VzcyB3b3VsZCBzdWdnZXN0IGEgdHlwaWNhbCBjbHVzdGVyaW5nIG9mIFJvbGVzIHRvIFJlc291cmNlcy4gIEEgQ29tcG9zaXRlIFJvbGUgY291bGQgcGVyZm9ybSBhbGwgVGFza3MgZGVmaW5lZCBmb3IgdGhlIFJvbGVzIGl0IHJlZmVycyB0by4NCi08L2JvZHk+DQotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxRjk0QUI5MDAxNSIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDA4QiIvPg0KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MUYwNkJCRTAwREYiIG5hbWU9ImFnZ3JlZ2F0ZWRSb2xlcyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjk2IiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQxRjA2QkJDMDMwRCI+DQotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9Ha3pYZXVmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR2t6WGVlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyN0E5MjU0MDIyNyIgbmFtZT0iV29ya0JyZWFrZG93bkVsZW1lbnQiIGlzQWJzdHJhY3Q9InRydWUiPg0KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR2pVSnMtZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E5MjU0MDIyNyI+DQotICAgICAgICAgICAgICA8Ym9keT5BIFdvcmsgQnJlYWtkb3duIEVsZW1lbnQgaXMgYSBzcGVjaWFsIEJyZWFrZG93biBFbGVtZW50IHRoYXQgcHJvdmlkZXMgc3BlY2lmaWMgcHJvcGVydGllcyBmb3IgQnJlYWtkb3duIEVsZW1lbnRzIHRoYXQgcmVwcmVzZW50IG9yIHJlZmVyIHRvIFdvcmsgRGVmaW5pdGlvbnMuICBGb3IgZXhhbXBsZSBpdHMgc3ViY2xhc3MgQWN0aXZpdHkgZGVmaW5lcyB3b3JrIGFzIGl0IGlzIGFsc28gYSBzdWJjbGFzcyBvZiBXb3JrIERlZmluaXRpb24uICBJdHMgc3ViY2xhc3MgVGFzayBEZXNjcmlwdG9yIGRvZXMgbm90IGRlZmluZSB3b3JrIGJ5IGl0c2VsZiwgYnV0IHJlZmVycyB0byBhIFdvcmsgRGVmaW5pdGlvbiBhbmQgdGhlcmVmb3JlIGNhbiBoYXZlIHRoZSBzYW1lIGNvbW1vbiBwcm9wZXJ0aWVzIGFuZCBXb3JrIEJyZWFrZG93biBFbGVtZW50IGhhcy48L2JvZHk+DQotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyOENEMzIzMDE5QSIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDBFRiIvPg0KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAzQzAiIG5hbWU9ImlzUmVwZWF0YWJsZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfNUdjWUFPaWVFZHVRYnVZNlV3TVNRZyI+DQotICAgICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dqZFRvLWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAzQzAiPg0KLSAgICAgICAgICAgICAgICA8Ym9keT5UaGlzIGF0dHJpYnV0ZSBpcyB1c2VkIHRvIGRlZmluZSByZXBldGl0aW9uIG9mIHdvcmssIGUuZy4gaXRlcmF0aW9ucy4gIEEgUHJvY2VzcyBXb3JrIERlZmluaXRpb24gd2l0aCB0aGlzIGF0dHJpYnV0ZSBzZXQgdG8gVHJ1ZSBzaGFsbCBiZSByZXBlYXRlZCBtb3JlIHRoYW4gb25jZSBvbiB0aGUgc2FtZSBzZXQgb2YgYXJ0aWZhY3RzLiAgRm9yIGV4YW1wbGUsIGZvciBhbiBpbnN0YW5jZSBvZiBJdGVyYXRpb24gKGRlZmluZWQgYXMgYSBzcGVjaWFsIFByb2Nlc3MgV29yayBEZWZpbml0aW9uIGJlbG93KSB0aGlzIGF0dHJpYnV0ZSBpcyBzZXQgdG8gVHJ1ZSBieSBkZWZhdWx0IGluZGljYXRpbmcgdGhhdCBldmVyeSBzdWItQWN0aXZpdHkgd2lsbCBiZSByZXBlYXRlZCBtb3JlIHRoYW4gb25jZS4gIEhvd2V2ZXIsIGFueSBQcm9jZXNzIFdvcmsgRGVmaW5pdGlvbiBjYW4gc2V0IHRoaXMgYXR0cmlidXRlIHRvIFRydWUgdG8gZGVmaW5lIGl0ZXJhdGlvbnMgKGUuZy4gdG8gaXRlcmF0ZSBvbmUgQWN0aXZpdHkgY29uc2lzdGluZyBvZiBtYW55IHN1Yi1hY3Rpdml0aWVzIG9yIGV2ZW4gUGhhc2VzLCBidXQgdG8gaXRlcmF0ZSBqdXN0IG9uZSBUYXNrKS48L2JvZHk+DQotICAgICAgICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9Il9HamRUcGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJfNUdjWUFPaWVFZHVRYnVZNlV3TVNRZyI+DQotICAgICAgICAgICAgICAgIDxib2R5PmZhbHNlPC9ib2R5Pg0KLSAgICAgICAgICAgICAgPC9kZWZhdWx0VmFsdWU+DQotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwM0Q1IiBuYW1lPSJpc09uZ29pbmciIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzVHY1lBT2llRWR1UWJ1WTZVd01TUWciPg0KLSAgICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HamRUcC1mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwM0Q1Ij4NCi0gICAgICAgICAgICAgICAgPGJvZHk+SWYgdGhlIGlzT25nb2luZyBhdHRyaWJ1dGUgaXMgc2V0IHRvIFRydWUgZm9yIGEgUHJvY2VzcyBXb3JrIERlZmluaXRpb24gaW5zdGFuY2UsIHRoZW4gdGhlIGVsZW1lbnQgZGVzY3JpYmVzIGFuIG9uZ29pbmcgcGllY2Ugb2Ygd29yayB3aXRob3V0IGEgZml4ZWQgZHVyYXRpb24gb3IgZW5kIHN0YXRlLiAgRm9yIGV4YW1wbGUsIHRoZSBQcm9jZXNzIFdvcmsgRGVmaW5pdGlvbiBjb3VsZCByZXByZXNlbnQgd29yayBvZiBhbiBhZG1pbmlzdHJhdG9yIGNvbnRpbnVvdXNseSAoZS5nLiAzaCBhIGRheSkgd29ya2luZyB0byBlbnN1cmUgdGhhdCBzeXN0ZW1zIGFyZSBrZXB0IGluIGEgY2VydGFpbiBzdGF0ZS4gIEFub3RoZXIgZXhhbXBsZSB3b3VsZCBiZSBwcm9ncmFtIG1hbmFnZW1lbnQgd29yayBvdmVyc2VlaW5nIG1hbnkgZGlmZmVyZW50IHByb2plY3RzIGJlaW5nIHNjaGVkdWxlZCBmb3Igb25lIHBhcnRpY3VsYXIgcHJvamVjdCBhdCBzcGVjaWZpYyByZW9jY3VycmluZyBpbnRlcnZhbHMgZHVyaW5nIHRoZSB3aG9sZSBsaWZlY3ljbGUgb2YgdGhlIHByb2plY3QuPC9ib2R5Pg0KLSAgICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJfR2pkVHFlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iXzVHY1lBT2llRWR1UWJ1WTZVd01TUWciPg0KLSAgICAgICAgICAgICAgICA8Ym9keT5mYWxzZTwvYm9keT4NCi0gICAgICAgICAgICAgIDwvZGVmYXVsdFZhbHVlPg0KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDNERSIgbmFtZT0iaXNFdmVudERyaXZlbiIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfNUdjWUFPaWVFZHVRYnVZNlV3TVNRZyI+DQotICAgICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dqZFRxLWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAzREUiPg0KLSAgICAgICAgICAgICAgICA8Ym9keT5UaGUgaXNFdmVudERyaXZlbiBhdHRyaWJ1dGUgaW5kaWNhdGVzIHRoYXQgdGhlIFByb2Nlc3MgV29yayBEZWZpbml0aW9uIGRlc2NyaWJlcyBhbiBpbnN0YW5jZSBvZiB3b3JrIHdoaWNoIGlzIG5vdCBzdGFydGVkIGJlY2F1c2UgaXQgaGFzIGJlZW4gc2NoZWR1bGVkIHRvIHN0YXJ0IGF0IGEgY2VydGFpbiBwb2ludCBvZiB0aW1lLCBiZWNhdXNlIHByZWNlZGluZyB3b3JrIGlzIGJlaW5nIGNvbXBsZXRlZCwgb3IgaW5wdXQgd29yayBwcm9kdWN0cyBhcmUgYXZhaWxhYmxlLCBidXQgYmVjYXVzZSBhbm90aGVyIHNwZWNpZmljIGV2ZW50IGhhcyBvY2N1cnJlZC4gIEV4YW1wbGVzIGZvciBzdWNoIGV2ZW50cyBhcmUgZXhjZXB0aW9ucyBvciBwcm9ibGVtIHNpdHVhdGlvbnMgd2hpY2ggcmVxdWlyZSBzcGVjaWZpYyB3b3JrIHRvIGJlIHBlcmZvcm1lZCBhcyBhIHJlc3VsdC4gIEFsc28gY2hhbmdlIG1hbmFnZW1lbnQgd29yayBjYW4gYmUgbW9kZWxlZCBhcyBldmVudCBkcml2ZW4gd29yayBhbmFseXppbmcgYSBjaGFuZ2UgcmVxdWVzdCBvciBkZWZlY3QgYW5kIGFsbG9jYXRpbmcgd29yayBkeW5hbWljYWxseSB0byByZXNvdXJjZXMgdG8gZGVhbCB3aXRoIGl0IGZvbGxvd2luZyB0aGUgd29yayBkZXNjcmliZWQgd2l0aCBzdWNoIFByb2Nlc3MgV29yayBEZWZpbml0aW9uLiAgVGhlIGV2ZW50cyB0aGVtc2VsdmVzIGFyZSBub3QgbW9kZWxlZCBpbiB0aGlzIHZlcnNpb24gb2YgdGhlIHNwZWNpZmljYXRpb24uICBUaGV5IHNoYWxsIGJlIGRlc2NyaWJlZCBhcyBwYXJ0IG9mIHRoZSBub3JtYWwgZGVzY3JpcHRpb25zIGZpZWxkcyBhdmFpbGFibGUuDQotDQotDQotPC9ib2R5Pg0KLSAgICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJfR2pkVHJlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iXzVHY1lBT2llRWR1UWJ1WTZVd01TUWciPg0KLSAgICAgICAgICAgICAgICA8Ym9keT5mYWxzZTwvYm9keT4NCi0gICAgICAgICAgICAgIDwvZGVmYXVsdFZhbHVlPg0KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyODBFRDQwMDBDRiIgbmFtZT0ibGlua1RvUHJlZGVjZXNzb3IiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQxMDgxODc5MDI4OCIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MjgwRUQ0MDAwQ0QiPg0KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR2s5SWYtZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4NCi0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0drOUlmdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MjgzRThBMTAzNDEiIG5hbWU9IlByb2Nlc3NFbGVtZW50IiBpc0Fic3RyYWN0PSJ0cnVlIj4NCi0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dqZFRyLWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjgzRThBMTAzNDEiPg0KLSAgICAgICAgICAgICAgPGJvZHk+UHJvY2VzcyBFbGVtZW50IGlzIGEgRGVzY3JpYmFibGUgRWxlbWVudCB0aGF0IHJlcHJlc2VudHMgYW4gYWJzdHJhY3QgZ2VuZXJhbGl6YXRpb24gZm9yIGFsbCBlbGVtZW50cyBkZWZpbmVkIGluIHRoZSBQcm9jZXNzIHBhY2thZ2UuDQotUHJvY2VzcyBFbGVtZW50cyByZXByZXNlbnRzIFByb2Nlc3Mgc3BlY2lmaWMgZWxlbWVudHMgdGhhdCBhcmUgc3VwcG9zZWQgdG8gYmUgbWFuYWdlZCBpbiBQcm9jZXNzIFBhY2thZ2VzLiAgVGhlIHNlcGFyYXRpb24gb2YgUHJvY2VzcyBFbGVtZW50IGZyb20gQ29udGVudCBFbGVtZW50IGFsbG93cyB0byBjbGVhcmx5IGRpc3Rpbmd1aXNoIGJldHdlZW4gcHVyZSBtZXRob2QgY29udGVudCBmcm9tIGNvbnRlbnQgdGhhdCBpcyByZXByZXNlbnRlZCBpbiBwcm9jZXNzZXMuIA0KLTwvYm9keT4NCi0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDI5NEVDQzEwMzFFIiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDI5NEVCOTAwMEZDIi8+DQotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDAzRiIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDQwIF8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwNDIiPg0KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR2puRW8tZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDAzRiI+DQotICAgICAgICAgICAgICA8Ym9keT5UaGlzIGFnZ3JlZ2F0aW9uIGFzc29jaWF0aW9uIHNwZWNpZmllcyB0aGUgcm9sZXMgb2YgdGVhbSBtZW1iZXJzIHdpdGggUm9sZSBEZXNjcmlwdG9ycy48L2JvZHk+DQotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDA0MCIgbmFtZT0iX3RlYW1Qcm9maWxlIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwNjMiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwM0YiPg0KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR2puRXAtZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4NCi0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0dqbkVwdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICA8L293bmVkRW5kPg0KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwNTIiIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDA1MyBfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDU1Ij4NCi0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dqNV9sT2ZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwNTIiPg0KLSAgICAgICAgICAgICAgPGJvZHk+VGhpcyBhc3NvY2lhdGlvbiByZWxhdGVzIGEgU3ViLVRlYW0gdG8gaXRzIFN1cGVyLVRlYW0sIGkuZS4gdGhlIFRlYW0gdGhhdCBpdCBpcyBwYXJ0IG9mLjwvYm9keT4NCi0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMkI1IiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyQjYgXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDJCOCI+DQotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9Ha0R3bU9mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMkI1Ij4NCi0gICAgICAgICAgICAgIDxib2R5PkJyZWFrZG93biBzdHJ1Y3R1cmVzIGFyZSBuZXN0ZWQgc3RydWN0dXJlcyAoc2VlIHN1cGVyQWN0aXZpdGllcyBhc3NvY2lhdGlvbikgcHJlc2VudGVkIG5vcm1hbGx5IGFzIGluZGVudGVkIGxpc3RzLiAgV2l0aGluIHRoaXMgbmVzdGluZyBjaGlsZHJlbiBvbiB0aGUgc2FtZSBsZXZlbCBhcmUgbm90IHNwZWNpZmljYWxseSBvcmRlcmVkLiAgSG93ZXZlciwgYSB1c2VyIG9mIHRoZXNlIGRhdGEgc3RydWN0dXJlcyB3b3VsZCBleHBlY3QgdG8gb3JkZXIgZWxlbWVudHMgd2l0aGluIGEgbGlzdC4gIFRoaXMgYXNzb2NpYXRpb24gaXMgdXNlZCB0byBzdG9yZSB0aGUgcHJlc2VudGF0aW9uIHNlcXVlbmNlIGFtb25nc3QgQnJlYWtkb3duIEVsZW1lbnRzLiAgVGhlIGFzc29jaWF0aW9uIHByZXNlbnRlZEFmdGVyIGlzIHJlZHVuZGFudCB0byB0aGUgYXNzb2NpYXRpb24gcHJlc2VudGVkQmVmb3JlLiAgVGhpcyByZWR1bmRhbmN5IGlzIHJlcXVpcmVkIHRvIHN1cHBvcnQgUHJvY2VzcyBDb250cmlidXRpb25zIChzZWUgcGx1Z2lucykuPC9ib2R5Pg0KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyQjgiIG5hbWU9Il9icmVha2Rvd25FbGVtZW50IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwRUYiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyQjUiPg0KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR2tEd24tZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IjEiLz4NCi0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0drRHdudWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICA8L293bmVkRW5kPg0KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzMEQiIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDMwRSBfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzEwIj4NCi0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0drRHdvZWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzMEQiPg0KLSAgICAgICAgICAgICAgPGJvZHk+VGhpcyBhc3NvY2lhdGlvbiByZXByZXNlbnRzIHRoZSByZWZlcmVuY2UgZnJvbSB0aGUgZGVzY3JpcHRvciB0byB0aGUgY29yZSBjb250ZW50IGVsZW1lbnQgaXQgcmVmZXJzIHRvLiAgRXZlcnkgVGFzayBEZXNjcmlwdG9yIGNhbiByZWZlcmVuY2Ugb25seSBvbiBUYXNrLiAgSG93ZXZlciwgYSBUYXNrIGNhbiBiZSByZXByZXNlbnRlZCBieSBtYW55IFRhc2sgRGVzY3JpcHRvcnMuICBJbiB0aGUgVU1BIFByb2ZpbGUgdGhpcyBhc3NvY2lhdGlvbiBpcyBpbnN0YW50aWF0ZWQgYnkgYSBkZXBlbmRlbmN5IHJlbGF0aW9uc2hpcCB3aXRoIGEgdHJhY2Ugc3RlcmVvdHlwZS48L2JvZHk+DQotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDMwRSIgbmFtZT0idGFza0Rlc2NyaXB0b3IiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDAwOSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzMEQiPg0KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR2tEd3BlZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4NCi0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0drRHdwT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICA8L293bmVkRW5kPg0KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzRDciIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDNEOCBfM0FEQzdCNzQwMjJENDBGMzZDNUYwM0RBIj4NCi0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0drRHdxdWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzRDciPg0KLSAgICAgICAgICAgICAgPGJvZHk+VGhpcyBhc3NvY2lhdGlvbiByZXByZXNlbnRzIHRoZSByZWZlcmVuY2UgZnJvbSB0aGUgZGVzY3JpcHRvciB0byB0aGUgY29yZSBjb250ZW50IGVsZW1lbnQgaXQgcmVmZXJzIHRvLiAgRXZlcnkgV29yayBQcm9kdWN0IERlc2NyaXB0b3IgY2FuIHJlZmVyZW5jZSBvbmx5IG9uZSBXb3JrIFByb2R1Y3QuICBIb3dldmVyLCBhIFdvcmsgUHJvZHVjdCBjYW4gYmUgcmVwcmVzZW50ZWQgYnkgbWFueSBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvcnMuICBJbiB0aGUgVU1BIFByb2ZpbGUgdGhpcyBhc3NvY2lhdGlvbiBpcyBpbnN0YW50aWF0ZWQgYnkgYSBkZXBlbmRlbmN5IHJlbGF0aW9uc2hpcCB3aXRoIGEgdHJhY2Ugc3RlcmVvdHlwZS48L2JvZHk+DQotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDNEOCIgbmFtZT0id29ya1Byb2R1Y3REZXNjcmlwdG9yIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwNDUiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwM0Q3Ij4NCi0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0drTTZnLWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+DQotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9Ha002Z3VmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgPC9vd25lZEVuZD4NCi0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTZBIiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxNkIgXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDE2RCI+DQotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9Ha002aU9mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTZBIj4NCi0gICAgICAgICAgICAgIDxib2R5PlRoaXMgYXNzb2NpYXRpb24gcmVwcmVzZW50cyB0aGUgcmVmZXJlbmNlIGZyb20gdGhlIGRlc2NyaXB0b3IgdG8gdGhlIGNvcmUgY29udGVudCBlbGVtZW50IGl0IHJlZmVycyB0by4gIEV2ZXJ5IFJvbGUgRGVzY3JpcHRvciBjYW4gcmVmZXJlbmNlIG9ubHkgb25lIFJvbGUuICBIb3dldmVyLCBhIFJvbGUgY2FuIGJlIHJlcHJlc2VudGVkIGJ5IG1hbnkgUm9sZSBEZXNjcmlwdG9ycy4gIEluIHRoZSBVTUEgUHJvZmlsZSB0aGlzIGFzc29jaWF0aW9uIGlzIGluc3RhbnRpYXRlZCBieSBhIGRlcGVuZGVuY3kgcmVsYXRpb25zaGlwIHdpdGggYSB0cmFjZSBzdGVyZW90eXBlLjwvYm9keT4NCi0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgICAgICA8b3duZWRFbmQgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTZCIiBuYW1lPSJyb2xlRGVzY3JpcHRvciIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDhCIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDE2QSI+DQotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9Ha002ak9mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR2tNNmktZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgIDwvb3duZWRFbmQ+DQotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDMyMSIgbmFtZT0iQWRkaXRpb25hbGx5UGVyZm9ybXMiIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDMyMiBfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzJCIj4NCi0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0drTTZrZWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzMjEiPg0KLSAgICAgICAgICAgICAgPGJvZHk+VGhpcyBhc3NvY2lhdGlvbiBtYXBzIHRvIHRoZSByZXNwZWN0aXZlIGFzc29jaWF0aW9uIGluIENvcmUgQ29udGVudCBFbGVtZW50cy4gIEl0IHNwZWNpZmllcyBkZXNjcmlwdG9ycyBmb3IgYWRkaXRpb25hbCByb2xlcyBuZWNlc3NhcnkgdG8gY29tcGxldGUgdGhlIHJlZmVycmVkIFRhc2suICBJbnN0YW5jZXMgb2YgdGhlc2Ugcm9sZXMgd291bGQgc2hvdyB1cCBhcyBzY2hlZHVsZWQgcmVzb3VyY2VzIG9uIGEgY29ycmVzcG9uZGluZyBwcm9qZWN0IHBsYW4gZ2VuZXJhdGVkIGZyb20gdGhpcyBzdHJ1Y3R1cmUuPC9ib2R5Pg0KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzMkIiIG5hbWU9InBlcmZvcm1zQWRkaXRpb25hbGx5IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwMDkiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzIxIj4NCi0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0drTTZtT2ZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+DQotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9Ha002bC1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgPC9vd25lZEVuZD4NCi0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzNGIiBuYW1lPSJBc3Npc3RzIiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzNDAgXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDM0MiI+DQotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9Ha002bXVmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzNGIj4NCi0gICAgICAgICAgICAgIDxib2R5PlRoaXMgYXNzb2NpYXRpb24gaXMgc3BlY2lmaWMgdG8gYSBwcm9jZXNzLCBpLmUuIG5vIGRlZmF1bHRzIGhhdmUgYmVlbiBkZWZpbmVkIGluIENvcmUgQ29udGVudCBFbGVtZW50cy4gIEl0IHNwZWNpZmllcyBkZXNjcmlwdG9ycyBmb3IgYWRkaXRpb25hbCByb2xlcyB0aGF0IG1heSBwcm92aWRlIGluZm9ybWF0aW9uIG9yIGFzc2lzdGFuY2UgaGVscGZ1bCwgYnV0IG5vdCBtYW5kYXRvcnkgdG8gdGhlIGNvbXBsZXRpb24gb2YgdGhlIFRhc2suICBJbnN0YW5jZXMgb2YgdGhlc2Ugcm9sZXMgd291bGQgbm90IHNob3cgdXAgYXMgc2NoZWR1bGVkIHJlc291cmNlcyBvbiB0aGUgY29ycmVzcG9uZGluZyBwcm9qZWN0IHBsYW4gZ2VuZXJhdGVkIGZyb20gdGhpcyBzdHJ1Y3R1cmUuPC9ib2R5Pg0KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzNDIiIG5hbWU9ImFzc2lzdHNJbiIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDA5IiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDMzRiI+DQotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9Ha1dyaHVmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR2tXcmhlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgIDwvb3duZWRFbmQ+DQotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDI1QiIgbmFtZT0iRXh0ZXJuYWxJbnB1dCIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjVDIF8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyNUUiPg0KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR2tXcmlPZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDI1QiI+DQotICAgICAgICAgICAgICA8Ym9keT5UaGlzIGFzc29jaWF0aW9uIGlzIHNwZWNpZmljIHRvIGEgcHJvY2VzcywgaS5lLiBubyBkZWZhdWx0cyB3aWxsIGJlIGRlZmluZWQgaW4gQ29yZSBDb250ZW50IEVsZW1lbnRzLiAgSXQgc3BlY2lmaWVzIGRlc2NyaXB0b3JzIGZvciBXb3JrIFByb2R1Y3RzIHVzZWQgYXMgaW5wdXRzIHRoYXQgYXJlIG5vdCBwcm9kdWNlZCBieSBUYXNrcyB3aXRoaW4gdGhlIHNhbWUgUHJvY2VzcywgYnV0IGJ5IGFub3RoZXIgZXh0ZXJuYWwgcHJvY2VzcyBvciBhbiB1bmtub3duIHNvdXJjZS48L2JvZHk+DQotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDI1RSIgbmFtZT0iZXh0ZXJuYWxJbnB1dFRvIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwMDkiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjVCIj4NCi0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0drV3JqLWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+DQotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9Ha1dyanVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgPC9vd25lZEVuZD4NCi0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDIwIiBuYW1lPSJJbXBhY3RzRGVwZW5kZW5jeSIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDIxIF8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwMjMiPg0KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR2tXcmtlZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDAyMCI+DQotICAgICAgICAgICAgICA8Ym9keT5UaGlzIGFzc29jaWF0aW9uIGlzIHVzZWQgdG8gc2VtaS1mb3JtYWxseSBzcGVjaWZ5IHRyYWNlYWJpbGl0eSByZWxhdGlvbnNoaXBzIGJldHdlZW4gV29yayBQcm9kdWN0cyB3aXRoaW4gdGhlIHNjb3BlIG9mIGFuIEFjdGl2aXR5LiAgQSBsaW5rIGZyb20gb25lIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9yIHRvIGFub3RoZXIgaW5kaWNhdGVzIHRoYXQgb25lIFdvcmsgUHJvZHVjdCBpcyByZXF1aXJlZCBhcyBpbnB1dCB0byBhIFRhc2sgdGhhdCBwcm9kdWNlcyB0aGUgcmVsYXRlZCBXb3JrIFByb2R1Y3QgKCdpbXBhY3RzJyByb2xlIGVuZCkuICBJdCB3b3VsZCBhbHNvIG1lYW4gdGhhdCBhIGNoYW5nZSBvbiBvbmUgV29yayBQcm9kdWN0IGluc3RhbmNlIG1heSBhZmZlY3QgYSBjaGFuZ2Ugb24gdGhlIHJlbGF0ZWQgcHJvZHVjdC48L2JvZHk+DQotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxNkQ3NUFBMDA0QiIgbmFtZT0iTWFuZGF0b3J5SW5wdXQiIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQxNkQ3NUFCMDI4MSBfM0FEQzdCNzQwMjJENDE2RDc1QUIwMjk1Ij4NCi0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0drV3JtdWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTZENzVBQTAwNEIiPg0KLSAgICAgICAgICAgICAgPGJvZHk+VGhpcyBhc3NvY2lhdGlvbiBtYXBzIHRvIHRoZSByZXNwZWN0aXZlIGFzc29jaWF0aW9uIGluIENvcmUgQ29udGVudCBFbGVtZW50cy4gIEl0IHBvaW50cyB0byBkZXNjcmlwdG9ycyBmb3IgV29yayBQcm9kdWN0cyB0aGF0IGFyZSBtYW5kYXRvcnkgZm9yIHRoZSBUYXNrIHRvIGJlIHBlcmZvcm1lZC48L2JvZHk+DQotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxNkQ3NUFCMDI5NSIgbmFtZT0ibWFuZGF0b3J5SW5wdXRUbyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDA5IiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQxNkQ3NUFBMDA0QiI+DQotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9Ha2djaHVmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR2tnY2hlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgIDwvb3duZWRFbmQ+DQotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDE5QyIgbmFtZT0iTW9kaWZpZXMiIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDE5RCBfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTlGIiBpc0Rlcml2ZWQ9InRydWUiPg0KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR2tnY2lPZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDE5QyI+DQotICAgICAgICAgICAgICA8Ym9keT5UaGlzIGRlcml2ZWQgYXNzb2NpYXRpb24gbWFwcyB0byB0aGUgTW9kaWZpZXMgYXNzb2NpYXRpb24gZGVmaW5lZCBiZXR3ZWVuIFdvcmsgUHJvZHVjdHMgYW5kIFRhc2tzIGluIENvcmUgTWV0aG9kIENvbnRlbnQuICBUaGUgc2FtZSBkZXJpdmF0aW9uIHJ1bGUgYXMgZm9yIHRoZSBjb3JlIGNvbnRlbnQgZWxlbWVudHMgYXBwbGllcy48L2JvZHk+DQotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDE5RiIgbmFtZT0iX3JvbGVEZXNjcmlwdG9yIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwOEIiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxOUMiPg0KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR2tnY2otZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4NCi0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0drZ2NqdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICA8L293bmVkRW5kPg0KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyMjkiIG5hbWU9Ik9wdGlvbmFsSW5wdXQiIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDIyQSBfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjJDIj4NCi0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0drZ2NrZWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyMjkiPg0KLSAgICAgICAgICAgICAgPGJvZHk+VGhpcyBhc3NvY2lhdGlvbiBtYXBzIHRvIHRoZSByZXNwZWN0aXZlIGFzc29jaWF0aW9uIGluIENvcmUgQ29udGVudCBFbGVtZW50cy4gIEl0IHBvaW50cyB0byBkZXNjcmlwdG9ycyBmb3IgV29yayBQcm9kdWN0cyB0aGF0IGFyZSBvcHRpb25hbCBmb3IgdGhlIFRhc2sgdG8gYmUgcGVyZm9ybWVkLjwvYm9keT4NCi0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgICAgICA8b3duZWRFbmQgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjJBIiBuYW1lPSJPcHRpb25hbElucHV0VG8iIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDAwOSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyMjkiPg0KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR2tnY2xlZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4NCi0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0drZ2NsT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICA8L293bmVkRW5kPg0KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyM0QiIG5hbWU9Ik91dHB1dCIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjQ2IF8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyNDgiPg0KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR2tnY211ZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDIzRCI+DQotICAgICAgICAgICAgICA8Ym9keT5UaGlzIGFzc29jaWF0aW9uIG1hcHMgdG8gdGhlIHJlc3BlY3RpdmUgYXNzb2NpYXRpb24gaW4gQ29yZSBDb250ZW50IEVsZW1lbnRzLiAgSXQgcG9pbnRzIHRvIGRlc2NyaXB0b3JzIGZvciBXb3JrIFByb2R1Y3RzIHRoYXQgYXJlIG91dHB1dHMgZm9yIHBlcmZvcm1pbmcgdGhlIHJlZmVycmVkIFRhc2suPC9ib2R5Pg0KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyNDYiIG5hbWU9Im91dHB1dEZyb20iIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDAwOSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyM0QiPg0KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR2twbWMtZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4NCi0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0drcG1jdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICA8L293bmVkRW5kPg0KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwMEMiIG5hbWU9IlBhY2thZ2VkV1AiIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDAwRCBfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDBGIj4NCi0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0drcG1lT2ZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwMEMiPg0KLSAgICAgICAgICAgICAgPGJvZHk+SWYgYSBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvciByZWZlcnMgYXQgdGhlICdkZWxpdmVyYWJsZScgcm9sZSBlbmQgdG8gYSBEZWxpdmVyYWJsZSBXb3JrIFByb2R1Y3QgdGhlbiB0aGlzIGFzc29jaWF0aW9uIGlzIHVzZWQgdG8gc3BlY2lmeSB0aGUgRGVsaXZlcmFibGUncyBXb3JrIFByb2R1Y3QgcGFydHMuICBBcyBpbmRpY2F0ZWQgZm9yIERlbGl2ZXJhYmxlIGluIHRoZSBDb3JlIE1ldGhvZCBDb250ZW50IHBhY2thZ2UsIHRoaXMgYXNzb2NpYXRpb24gb3ZlcnJpZGVzIHRoZSAnZGVsaXZlcmVkV29ya1Byb2R1Y3RzJyBhc3NvY2lhdGlvbiBvZiB0aGUgV29yayBQcm9kdWN0LCB3aGljaCBzdG9yZXMgdGhlIHJlY29tbWVuZGVkIGRlbGl2ZXJhYmxlIHBhcnRzLCBidXQgY2FuIGJlIGN1c3RvbWl6ZWQgZm9yIGV2ZXJ5IFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9yLiA8L2JvZHk+DQotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDAwRCIgbmFtZT0iZGVsaXZlcmFibGUiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDA0NSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwMEMiPg0KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR2twbWZPZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4NCi0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0drcG1lLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICA8L293bmVkRW5kPg0KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzNTMiIG5hbWU9IlByaW1hcnlQZXJmb3JtcyIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzU0IF8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzNTYiPg0KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR2twbWdlZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDM1MyI+DQotICAgICAgICAgICAgICA8Ym9keT5UaGlzIGFzc29jaWF0aW9uIG1hcHMgdG8gdGhlIHJlc3BlY3RpdmUgYXNzb2NpYXRpb24gaW4gQ29yZSBDb250ZW50IEVsZW1lbnRzLiAgSXQgcG9pbnRzIHRvIGEgZGVzY3JpcHRvciBmb3IgdGhlIG9uZSByb2xlIHJlc3BvbnNpYmxlIGZvciB0aGUgY29tcGxldGlvbiBvZiB0aGUgdGFzay4gIEFuIGluc3RhbmNlIG9mIHRoaXMgcm9sZSB3b3VsZCBzaG93IHVwIGFzIGEgc2NoZWR1bGVkIHJlc291cmNlIG9uIGEgY29ycmVzcG9uZGluZyBwcm9qZWN0IHBsYW4gZ2VuZXJhdGVkIGZyb20gdGhpcyBzdHJ1Y3R1cmUuPC9ib2R5Pg0KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzNTYiIG5hbWU9InBlcmZvcm1zQXNPd25lciIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDA5IiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDM1MyI+DQotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9Ha3BtaU9mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR2twbWgtZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgIDwvb3duZWRFbmQ+DQotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDE3RSIgbmFtZT0iUmVzcG9uc2libGUiIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDE3RiBfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTg4Ij4NCi0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0drcG1pdWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxN0UiPg0KLSAgICAgICAgICAgICAgPGJvZHk+VGhpcyBhc3NvY2lhdGlvbiByZXByZXNlbnRzIHJlc3BvbnNpYmlsaXR5IGZvciBXb3JrIFByb2R1Y3QgaW5zdGFuY2VzLiAgSXQgaW5kaWNhdGVzIG93bmVyc2hpcCBhbmQgZm9yIGV4YW1wbGUgd291bGQgZGVmaW5lIHRoZSBSb2xlIHRoYXQgYW5zd2VycyB0byBtYW5hZ2VtZW50IHF1ZXN0aW9ucyBhYm91dCB0aGUgcXVhbGl0eSB3b3JrIHByb2R1Y3QuPC9ib2R5Pg0KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxODgiIG5hbWU9InJlc3BvbnNpYmxlUm9sZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDhCIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDE3RSI+DQotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9Ha3pYZHVmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR2t6WGRlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgIDwvb3duZWRFbmQ+DQotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxRjA2QkJDMDMwRCIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDFGMDZCQkUwMERGIF8zQURDN0I3NDAyMkQ0MUYwNkJCRTAwRTkiPg0KLSAgICAgICAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MUYwNkJCRTAwRTkiIG5hbWU9Il9jb21wb3NpdGVSb2xlIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MUYwNkI2NTAwRTYiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MUYwNkJCQzAzMEQiPg0KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR2t6WGZlZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4NCi0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0drelhmT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICA8L293bmVkRW5kPg0KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MjFFOEYwQzAyODEiIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQyMUU4RjBFMDIzNCBfM0FEQzdCNzQwMjJENDIxRThGMEUwMjY2Ij4NCi0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0drelhmLWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjFFOEYwQzAyODEiPg0KLSAgICAgICAgICAgICAgPGJvZHk+QnJlYWtkb3duIHN0cnVjdHVyZXMgYXJlIG5lc3RlZCBzdHJ1Y3R1cmVzIChzZWUgc3VwZXJBY3Rpdml0aWVzIGFzc29jaWF0aW9uKSBwcmVzZW50ZWQgbm9ybWFsbHkgYXMgaW5kZW50ZWQgbGlzdHMuICBXaXRoaW4gdGhpcyBuZXN0aW5nIGNoaWxkcmVuIG9uIHRoZSBzYW1lIGxldmVsIGFyZSBub3Qgc3BlY2lmaWNhbGx5IG9yZGVyZWQuICBIb3dldmVyLCBhIHVzZXIgb2YgdGhlc2UgZGF0YSBzdHJ1Y3R1cmVzIHdvdWxkIGV4cGVjdCB0byBvcmRlciBlbGVtZW50cyB3aXRoaW4gYSBsaXN0LiAgVGhpcyBhc3NvY2lhdGlvbiBpcyB1c2VkIHRvIHN0b3JlIHRoZSBwcmVzZW50YXRpb24gc2VxdWVuY2UgYW1vbmdzdCBCcmVha2Rvd24gRWxlbWVudHMuICBUaGUgYXNzb2NpYXRpb24gcHJlc2VudGVkQmVmb3JlIGlzIHJlZHVuZGFudCB0byB0aGUgYXNzb2NpYXRpb24gcHJlc2VudGVkQWZ0ZXIuICBUaGlzIHJlZHVuZGFuY3kgaXMgcmVxdWlyZWQgdG8gc3VwcG9ydCBQcm9jZXNzIENvbnRyaWJ1dGlvbnMgKHNlZSBwbHVnaW5zKS48L2JvZHk+DQotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyMUU4RjBFMDI2NiIgbmFtZT0iX2JyZWFrZG93bkVsZW1lbnQiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDBFRiIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQyMUU4RjBDMDI4MSI+DQotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9Ha3pYaHVmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iMSIvPg0KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR2t6WGhlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgIDwvb3duZWRFbmQ+DQotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyODBFRDM4MDBBMCIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDI4MEVEMzgwMEExIF8zQURDN0I3NDAyMkQ0MjgwRUQzODAwQTIiPg0KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR2t6WGlPZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyODBFRDM4MDBBMCI+DQotICAgICAgICAgICAgICA8Ym9keT5UaGUgV29yayBPcmRlciBjbGFzcyBkZWZpbmVzIHByZWRlY2Vzc29yIGFuZCBzdWNjZXNzb3IgcmVsYXRpb25zIGFtb25nc3QgQnJlYWtkb3duIEVsZW1lbnRzLiAgVGhpcyBhc3NvY2lhdGlvbiBsaW5rcyBhIFdvcmsgQnJlYWtkb3duIEVsZW1lbnQgdG8gaXRzIHN1Y2Nlc3NvciBXb3JrIEJyZWFrZG93biBFbGVtZW50LjwvYm9keT4NCi0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgICAgICA8b3duZWRFbmQgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDI4MEVEMzgwMEEyIiBuYW1lPSJsaW5rVG9TdWNjZXNzb3IiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQxMDgxODc5MDI4OCIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MjgwRUQzODAwQTAiPg0KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR2s5SWR1ZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4NCi0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0drOUlkZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICA8L293bmVkRW5kPg0KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MjgwRUQ0MDAwQ0QiIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQyODBFRDQwMDBDRSBfM0FEQzdCNzQwMjJENDI4MEVENDAwMENGIj4NCi0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0drOUllT2ZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjgwRUQ0MDAwQ0QiPg0KLSAgICAgICAgICAgICAgPGJvZHk+VGhpcyBhc3NvY2lhdGlvbiBsaW5rcyBhIFdvcmsgQnJlYWtkb3duIEVsZW1lbnQgdG8gaXRzIHByZWRlY2Vzc29yLiAgRXZlcnkgV29yayBCcmVha2Rvd24gRWxlbWVudCBjYW4gaGF2ZSBwcmVkZWNlc3NvciBpbmZvcm1hdGlvbiBhc3NvY2lhdGVkIHRvIGl0LiAgU3BlY2lmaWMgcHJlZGVjZXNzb3IgaW5mb3JtYXRpb24gaXMgc3RvcmVkIGluIGluc3RhbmNlcyBvZiB0aGUgY2xhc3MgV29yayBPcmRlciwgd2hpY2ggZGVmaW5lcyB0aGUga2luZCBvZiBwcmVkZWNlc3NvciBhbm90aGVyIFdvcmsgQnJlYWtkb3duIEVsZW1lbnQgcmVwcmVzZW50cyBmb3IgYW5vdGhlci48L2JvZHk+DQotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyODBFRDQwMDBDRSIgbmFtZT0ic3VjYyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDI3QTkyNTQwMjI3IiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQyODBFRDQwMDBDRCI+DQotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HazlJZk9mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iMSIvPg0KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR2s5SWUtZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IjEiLz4NCi0gICAgICAgICAgICA8L293bmVkRW5kPg0KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il9RRjJnNE1WSEVkeTJtdVEyUFF2SF9BIiBtZW1iZXJFbmQ9Il9RRjJnNGNWSEVkeTJtdVEyUFF2SF9BIF9RR1Nsd3NWSEVkeTJtdVEyUFF2SF9BIj4NCi0gICAgICAgICAgICA8b3duZWRFbmQgeG1pOmlkPSJfUUdTbHdzVkhFZHkybXVRMlBRdkhfQSIgbmFtZT0iIiB2aXNpYmlsaXR5PSJwcml2YXRlIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDMxIiBhc3NvY2lhdGlvbj0iX1FGMmc0TVZIRWR5Mm11UTJQUXZIX0EiPg0KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfUUdTbHhNVkhFZHkybXVRMlBRdkhfQSIgdmFsdWU9IioiLz4NCi0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX1FHU2x3OFZIRWR5Mm11UTJQUXZIX0EiLz4NCi0gICAgICAgICAgICA8L293bmVkRW5kPg0KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOlBhY2thZ2UiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRkQ4OTFGMDJDRCIgbmFtZT0iUHJvY2Vzc1R5cGVzIj4NCi0gICAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il9HbWxnTi1mWEVkdXFIb09KYlVSWlJ3IiBzb3VyY2U9InVtbDIuZGlhZ3JhbXMiIHJlZmVyZW5jZXM9Il8zQURDN0I3NDAyMkQ0MUUxMDA3QzAzMUYiPg0KLSAgICAgICAgICAgIDxjb250ZW50cyB4bWk6dHlwZT0ibm90YXRpb246RGlhZ3JhbSIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDFFMTAwN0MwMzFGIiB0eXBlPSJDbGFzcyIgbmFtZT0iUHJvY2VzcyI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhNai0tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTm90ZSIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxOTI5RTk5MDI5QyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOE1qX3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJEaWFncmFtTmFtZSI+DQotICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhNal8tZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkRlc2NyaXB0aW9uIj4NCi0gICAgICAgICAgICAgICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOlNoYXBlU3R5bGUiIHhtaTppZD0iX0c4TWpfT2ZYRWR1cUhvT0piVVJaUnciIGZvbnROYW1lPSJBcmlhbCIgZm9udEhlaWdodD0iOCIgdW5kZXJsaW5lPSJ0cnVlIiBkZXNjcmlwdGlvbj0iQ2xhc3MgRGlhZ3JhbTogUHJvY2Vzc1R5cGVzIC8gUHJvY2Vzc0JyZWFrZG93biIgbGluZUNvbG9yPSI0MTk0MzY4Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c4TWpfZWZYRWR1cUhvT0piVVJaUnciIHg9IjExNzkiIHk9Ijk2MjYiIHdpZHRoPSI0NDQ1IiBoZWlnaHQ9IjExMDkiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhXVXdPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRTBGRTkzMDA3NyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOFdVdy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzhXVXhPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjE1NzQiIGhlaWdodD0iOTA1Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOFdVeGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOFdVeHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOFdVeC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4V1V5T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4V1V5ZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4V1V5dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4V1V5LWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4V1V6T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4V1V6ZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4V1V6dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOFdVei1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c4V1V3ZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c4V1V3dWZYRWR1cUhvT0piVVJaUnciIHg9IjY2OTAiIHk9IjEwMjciLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhXVTBPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDA3NyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOFdVMC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzhXVTFPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjI5OTciIGhlaWdodD0iOTA1Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOFdVMWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOFdVMXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOFdVMS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4V1UyT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4V1UyZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4V1UydWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4V1UyLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4V1UzT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4V1UzZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4V1UzdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOFdVMy1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c4V1UwZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c4V1UwdWZYRWR1cUhvT0piVVJaUnciIHg9IjY0MjAiIHk9Ijc3NDciLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhXVS1lZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDBFNSI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOFdVX09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzhXVV9lZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjQ1MjEiIGhlaWdodD0iOTA1Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOFdVX3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOFdVXy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOFdWQU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4V1ZBZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4V1ZBdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4V1ZBLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4V1ZCT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4V1ZCZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4V1ZCdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4V1ZCLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOFdWQ09mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c4V1UtdWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c4V1UtLWZYRWR1cUhvT0piVVJaUnciIHg9IjEyODkiIHk9Ijc3NDciLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhXVkNlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDA5RiI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOFdWRE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzhXVkRlZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhXVkR1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhXVkQtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhXVkVPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOFdWRWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOFdWRXVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOFdWRS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOFdWRk9mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOFdWRmVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOFdWRnVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOFdWRi1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzhXVkdPZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HOFdWQ3VmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HOFdWQy1mWEVkdXFIb09KYlVSWlJ3IiB4PSI2NjU3IiB5PSIyODUzIiB3aWR0aD0iMjExNiIgaGVpZ2h0PSIzMjc2Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4V1ZWLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwREMiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhXVld1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c4V1ZXLWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIzMTE1IiBoZWlnaHQ9IjkwNSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhXVlhPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhXVlhlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhXVlh1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOFdWWC1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOFdWWU9mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOFdWWWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOFdWWXVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOFdWWS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOFdWWk9mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOFdWWmVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzhXVlp1ZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HOFdWV09mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HOFdWV2VmWEVkdXFIb09KYlVSWlJ3IiB4PSIxMjkxNCIgeT0iNzc5NyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTERpYWdyYW1TdHlsZSIgeG1pOmlkPSJfR21sZ09lZlhFZHVxSG9PSmJVUlpSdyIgZGVzY3JpcHRpb249IlRoZSBQcm9jZXNzIFR5cGVzIHBhY2thZ2UgY29udGFpbnMgdGhlIGRlZmluaXRpb24gb2YgUHJvY2Vzcy4gIEFzIGRlcGljdGVkIGluIHRoaXMgZGlhZ3JhbSwgaXQgZGlzdGluZ3Vpc2hlcyBkaWZmZXJlbnQgdHlwZXMgb2YgcHJvY2Vzc2VzIG5lZWRlZCB0byByZXByZXNlbnQgYnVpbGRpbmcgYmxvY2tzIGZvciBvdGhlciBwcm9jZXNzZXMgKENhcGFiaWxpdHkgUGF0dGVybiksIGNvbXBsZXRlIGVuZC10by1lbmQgcHJvY2Vzc2VzIChEZWxpdmVyeSBQcm9jZXNzKSwgb3IgcHJvY2Vzc2VzIHRoYXQgaGF2ZSBiZWVuIHJlZHVjZWQgdG8gdGhlIGVzc2VudGlhbCBpbmZvcm1hdGlvbiBuZWNlc3NhcnkgZm9yIGV4cG9ydGluZyBhbmQgcGxhbm5pbmcgYSBwcm9qZWN0IHdpdGggYSB0aGlyZC1wYXJ0eSBwbGFubmluZyB0b29sIChQcm9jZXNzIFBsYW5uaW5nIFRlbXBsYXRlKS4gIChOb3RlLCB0aGUgcGFja2FnZSBNZXRob2QgUGx1Zy1pbiB3aWxsIHByb3ZpZGUgYW5vdGhlciB0eXBlIG9mIFByb2Nlc3MgY2FsbGVkIFByb2Nlc3MgQ29udHJpYnV0aW9uLikgIFRoZSBQcm9jZXNzIFR5cGVzIHBhY2thZ2UgYWxzbyBkZWZpbmVzIHByb2Nlc3Mtc3BlY2lmaWMgZXh0ZW5zaW9uIHRvIEd1aWRhbmNlIFR5cGVzIGFzIHdlbGwgQ2F0ZWdvcmllcy4gIFdoZXJlYXMgdGhlIEJyZWFrZG93biBwYWNrYWdlIGRlZmluZWQgdGhlIGJhc2ljIHBpZWNlcyBmb3IgZGVzY3JpYmluZyBicmVha2Rvd24gc3RydWN0dXJlcywgdGhpcyBwYWNrYWdlIHRha2VzIHRoZXNlIHBpZWNlcyBhbmQgcGxhY2VzIHRoZW0gaW50byBoaWdoZXIgb3JnYW5pemF0aW9uIHN0cnVjdHVyZXMgZm9yIGJyZWFrZG93bjogUHJvY2Vzc2VzLiAgQSBwcm9jZXNzIGlzIGRlZmluZWQgYXMgYSBzcGVjaWFsIEFjdGl2aXR5IGFuZCB0aGVyZWZvcmUgY29uc3RpdHV0ZXMgdGhlIHRvcC1sZXZlbCBlbGVtZW50IG9mIGEgYnJlYWtkb3duLiAgSG93ZXZlciwgUHJvY2VzcyBjb250YWlucyBzcGVjaWFsIHByb3BlcnRpZXMgYW5kIGV4dGVuZGVkIHNlbWFudGljcyB0aGFuIEFjdGl2aXR5LiIvPg0KLSAgICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c4V1ZHZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTE5QTQwMDAwRTYiIHNvdXJjZT0iX0c4V1UtZWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c4V1ZDZWZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhXVkhPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhXVkh1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOFdWSC1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c4V1ZIZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4V1ZJT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTE5QTQwMTAwMkIiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOFdWSXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzhXVkllZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTYyMyIgeT0iMjI4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOFdWSS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTE5QTQwMTAwMkIiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOFdWSmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c4V1ZKT2ZYRWR1cUhvT0piVVJaUnciIHg9Ii00ODciIHk9Ii0zNDciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4V1ZKdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxMTlBNDAxMDAxNyI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4V1ZLT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c4V1ZKLWZYRWR1cUhvT0piVVJaUnciIHg9IjgxMSIgeT0iMjcxIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOFdWS2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDExOUE0MDEwMDE3Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhXVkstZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c4V1ZLdWZYRWR1cUhvT0piVVJaUnciIHg9Ii0xNzEyIiB5PSItMjU0Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOFdWTE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDExOUE0MDEwMDJCIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhXVkx1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4V1ZMLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzhXVkxlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhXVk1PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDExOUE0MDEwMDE3Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhXVk11ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4V1ZNLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzhXVk1lZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhXVk5PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTE5QTQwMTAwMkIiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOFdWTnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzhXVk4tZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOFdWTmVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOFdWT09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDExOUE0MDEwMDE3Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhXVk91ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzhXVk8tZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOFdWT2VmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HOFdWR3VmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HOFdWRy1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstODcyLCAtNDU3LCAtNTAzNywgMzI1MV0kWy04NzIsIC00NTIxLCAtNTAzNywgLTgxMl0kWzMxMDcsIC00NTIxLCAtMTA1OCwgLTgxMl0iLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzhXVlBPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDI4RSIgc291cmNlPSJfRzhXVS1lZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzhXVkNlZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOFdWUC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOFdWUWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4V1ZRdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzhXVlFPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzhXVlBlZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzhXVlB1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbOTMxLCAtNDQ4LCAtMzIzNCwgMzI1OV0kWzkzMSwgLTI2NTAsIC0zMjM0LCAxMDU4XSRbMzEwNywgLTI2NTAsIC0xMDU4LCAxMDU4XSIvPg0KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzhXVlEtZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HOFdWUk9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzhXVlJlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDExMCIgc291cmNlPSJfRzhXVTBPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzhXVkNlZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOFdWU09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOFdWU3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4V1ZTLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzhXVlNlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzhXVlJ1ZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzhXVlItZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTE5NCwgLTQ1NywgOCwgMzI1MV0kWy0xOTQsIC0yMDc0LCA4LCAxNjM0XSIvPg0KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzhXVlRPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HOFdWVGVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzhXVlR1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRTBGRUQ2MDJBRSIgc291cmNlPSJfRzhXVkNlZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzhXVXdPZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOFdWVWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOFdWVS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4V1ZWT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzhXVlV1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzhXVlQtZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzhXVlVPZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMTE4LCAtMTY0MiwgLTMzLCAyNDIxXSRbMTE4LCAtMzYxNSwgLTMzLCA0NDhdIi8+DQotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HOFdWVmVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c4V1ZWdWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HOFdWWi1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDExOUEzRjIwMjM4IiBzb3VyY2U9Il9HOFdWQ2VmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HOFdWVi1mWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4V1ZhdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4V1ZiT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhXVmJlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HOFdWYS1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOGZlc09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDExOUEzRjMwMUVDIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhmZXN1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c4ZmVzZWZYRWR1cUhvT0piVVJaUnciIHg9Ii0zOTkiIHk9IjMyMiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhmZXMtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDExOUEzRjMwMUVDIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhmZXRlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOGZldE9mWEVkdXFIb09KYlVSWlJ3IiB4PSItMzMxIiB5PSIzNjQiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4ZmV0dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxMTlBM0YzMDFFMiI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4ZmV1T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c4ZmV0LWZYRWR1cUhvT0piVVJaUnciIHg9IjQ5MyIgeT0iLTE3NyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhmZXVlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxMTlBM0YzMDFFMiI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4ZmV1LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOGZldXVmWEVkdXFIb09KYlVSWlJ3IiB4PSItNjI1IiB5PSIzMTQiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4ZmV2T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTE5QTNGMzAxRUMiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOGZldnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzhmZXYtZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOGZldmVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOGZld09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTE5QTNGMzAxRTIiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOGZld3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzhmZXctZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOGZld2VmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOGZleE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxMTlBM0YzMDFFQyI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4ZmV4dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOGZleC1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c4ZmV4ZWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4ZmV5T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTE5QTNGMzAxRTIiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOGZleXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOGZleS1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c4ZmV5ZWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c4V1ZhT2ZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c4V1ZhZWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzEwNTgsIDExODUsIC01Njk4LCAtMjU3M10kWzI3NjgsIDExODUsIC0zOTg3LCAtMjU3M10kWzI3NjgsIDM3MTYsIC0zOTg3LCAtNDJdJFs1MTk4LCAzNzE2LCAtMTU1NywgLTQyXSIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HOGZlek9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjhEIiBzb3VyY2U9Il9HOFdWVi1mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HOFdWQ2VmWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4ZmV6LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4ZmUwZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhmZTB1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HOGZlME9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HOGZlemVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HOGZlenVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMjAzLCAtNDQ4LCA2NTUzLCAzMzEwXSRbLTIwMywgLTMyNDIsIDY1NTMsIDUxNl0kWy01Njk4LCAtMzI0MiwgMTA1OCwgNTE2XSIvPg0KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzhmZTAtZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HOGZlMU9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgPC9jb250ZW50cz4NCi0gICAgICAgICAgICA8Y29udGVudHMgeG1pOnR5cGU9Im5vdGF0aW9uOkRpYWdyYW0iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxOTI5RTk5MDI5QyIgdHlwZT0iQ2xhc3MiIG5hbWU9IlByb2Nlc3NCcmVha2Rvd24iPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4cFBzT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwRTYiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhwUHMtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c4cFB0T2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4cFB0ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4cFB0dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4cFB0LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhwUHVPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzhwUHVlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhwUHV1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzhwUHUtZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhwUHZPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzhwUHZlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhwUHZ1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4cFB2LWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzhwUHNlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzhwUHN1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iOTIyMCIgeT0iMTE5NjMiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhwUHdPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDAzMSI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHBQdy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzhwUHhPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhwUHhlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhwUHh1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhwUHgtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHBQeU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOHBQeWVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHBQeXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOHBQeS1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHBQek9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOHBQemVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHBQenVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzhwUHotZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HOHBQd2VmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HOHBQd3VmWEVkdXFIb09KYlVSWlJ3IiB4PSIxNjQ1OSIgeT0iNDk2OSIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHBQME9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDlGIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4cFAwLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HOHBQMU9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTY3NiIgaGVpZ2h0PSI5MzEiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4cFAxZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4cFAxdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4cFAxLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhwUDJPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzhwUDJlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhwUDJ1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzhwUDItZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhwUDNPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzhwUDNlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhwUDN1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4cFAzLWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzhwUDBlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzhwUDB1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTMxMzEiIHk9IjYwMSIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHBQNE9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMEVGIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4cFA0LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HOHBQNU9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHBQNWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHBQNXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHBQNS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4cFA2T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4cFA2ZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4cFA2dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4cFA2LWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4cFA3T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4cFA3ZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4cFA3dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOHBQNy1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c4cFA0ZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c4cFA0dWZYRWR1cUhvT0piVVJaUnciIHg9IjEyMzQ0IiB5PSI4ODIyIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4cFAtZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RDAzRDMiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhwUF9PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c4cFBfZWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4cFBfdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4cFBfLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4cFFBT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhwUUFlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzhwUUF1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhwUUEtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzhwUUJPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhwUUJlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzhwUUJ1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhwUUItZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4cFFDT2ZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzhwUC11ZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzhwUC0tZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTI5MDMiIHk9IjUwNzEiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzh6QXRPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRTBGRTkzMDA3NyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHpBdC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzh6QXVPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjE2MjUiIGhlaWdodD0iODk3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHpBdWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHpBdXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHpBdS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4ekF2T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4ekF2ZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4ekF2dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4ekF2LWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4ekF3T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4ekF3ZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4ekF3dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOHpBdy1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c4ekF0ZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dQYXJlbnQ9Ik5hbWUiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c4ekF0dWZYRWR1cUhvT0piVVJaUnciIHg9IjEyMzg5IiB5PSIyMTM2Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4ekExdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwMDkiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzh6QTJlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c4ekEydWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4ekEyLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4ekEzT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4ekEzZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzh6QTN1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzh6QTMtZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzh6QTRPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzh6QTRlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzh6QTR1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzh6QTQtZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzh6QTVPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4ekE1ZWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzh6QTEtZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzh6QTJPZlhFZHVxSG9PSmJVUlpSdyIgeD0iODY1MiIgeT0iMTUyMzEiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzh6QTctZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDA0NSI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHpBOHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzh6QTgtZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzh6QTlPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzh6QTllZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzh6QTl1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHpBOS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOHpBLU9mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHpBLWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOHpBLXVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHpBLS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOHpBX09mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHpBX2VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzh6QV91ZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HOHpBOE9mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HOHpBOGVmWEVkdXFIb09KYlVSWlJ3IiB4PSIzNTY0IiB5PSIxNTIxNCIgd2lkdGg9IjQ2MzEiIGhlaWdodD0iMTE3NiIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHpCSXVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDhCIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4ekJKZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HOHpCSnVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHpCSi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHpCS09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHpCS2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4ekJLdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4ekJLLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4ekJMT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4ekJMZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4ekJMdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4ekJMLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4ekJNT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOHpCTWVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c4ekJJLWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c4ekJKT2ZYRWR1cUhvT0piVVJaUnciIHg9IjEyNDg4IiB5PSIxNTEyOSIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHpCTXVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDYzIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4ekJOZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HOHpCTnVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHpCTi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHpCT09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHpCT2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4ekJPdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4ekJPLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4ekJQT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4ekJQZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4ekJQdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4ekJQLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4ekJRT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOHpCUWVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c4ekJNLWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c4ekJOT2ZYRWR1cUhvT0piVVJaUnciIHg9IjE2MzU0IiB5PSIxMTk5NiIgd2lkdGg9IjI3MDkiIGhlaWdodD0iMjIzNSIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HODhLNnVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTkyNTQwMjI3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4OEs3ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HODhLN3VmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iNDI1MCIgaGVpZ2h0PSIxMDQ5Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HODhLNy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HODhLOE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HODhLOGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4OEs4dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4OEs4LWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4OEs5T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4OEs5ZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4OEs5dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4OEs5LWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4OEstT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HODhLLWVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c4OEs2LWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c4OEs3T2ZYRWR1cUhvT0piVVJaUnciIHg9IjExOTQ2IiB5PSI2ODQxIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4OExET2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RDAzQ0IiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzg4TEQtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c4OExFT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIyMzUzIiBoZWlnaHQ9IjEwNDkiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4OExFZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4OExFdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4OExFLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzg4TEZPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzg4TEZlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzg4TEZ1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzg4TEYtZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzg4TEdPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzg4TEdlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzg4TEd1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4OExHLWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzg4TERlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzg4TER1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iOTc5NSIgeT0iMjkyOSIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HODhMSmVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUQwM0NBIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4OExLT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HODhMS2VmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMjM1MyIgaGVpZ2h0PSIxMDQ5Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HODhMS3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HODhMSy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HODhMTE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4OExMZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4OExMdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4OExMLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4OExNT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4OExNZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4OExNdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4OExNLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HODhMTk9mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c4OExKdWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c4OExKLWZYRWR1cUhvT0piVVJaUnciIHg9IjE1ODkxIiB5PSIyODI3Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MRGlhZ3JhbVN0eWxlIiB4bWk6aWQ9Il9HbXZSSWVmWEVkdXFIb09KYlVSWlJ3IiBkZXNjcmlwdGlvbj0iVGhpcyBkaWFncmFtIHNob3dzIHRoZSBtYWluIHN0cnVjdHVyZSB1c2VkIHRvIHJlcHJlc2VudCBhIHByb2Nlc3MuICBBIHByb2Nlc3MgaXMgcmVwcmVzZW50ZWQgYnkgYSBicmVha2Rvd24gb2YgQWN0aXZpdGllcywgd2hpY2ggaGFzICIvPg0KLSAgICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c4cFA4T2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyOEYiIHNvdXJjZT0iX0c4cFBzT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c4cFA0T2ZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhwUDgtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhwUDllZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHBQOXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c4cFA5T2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c4cFA4ZWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzhwUDh1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbNjA5LCAtNTQxLCAtMzA0OCwgMjYwN10kWzMwMjIsIC0yNjI0LCAtNjM1LCA1MjRdIi8+DQotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HOHBQOS1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c4cFAtT2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HOHBRQ2VmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFMEZGRDMwMEVGIiBzb3VyY2U9Il9HOHBQNE9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HOHBQLWVmWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4cFFET2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4cFFEdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhwUUQtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c4cFFEZWZYRWR1cUhvT0piVVJaUnciIHg9IjY0IiB5PSI2NjgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4cFFFT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUUwRkZEMzAwRjEiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHBRRXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzhwUUVlZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTk4MSIgeT0iMjYyIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHBRRS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRTBGRkQzMDBGMSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4cFFGZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzhwUUZPZlhFZHVxSG9PSmJVUlpSdyIgeD0iMzYyIiB5PSItMzE5Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHBRRnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUUwRkZEMzAwRjAiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHBRR09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOHBRRi1mWEVkdXFIb09KYlVSWlJ3IiB4PSIxMTg1IiB5PSIyMjkiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4cFFHZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUUwRkZEMzAwRjAiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHBRRy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzhwUUd1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTQ2NCIgeT0iLTI2MyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhwUUhPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRTBGRkQzMDBGMSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4cFFIdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOHBRSC1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c4cFFIZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4cFFJT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRTBGRkQzMDBGMCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4cFFJdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOHBRSS1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c4cFFJZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4cFFKT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFMEZGRDMwMEYxIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhwUUp1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4cFFKLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzhwUUplZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzh6QXNPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRTBGRkQzMDBGMCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4ekFzdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4ekFzLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzh6QXNlZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzhwUUN1ZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzhwUUMtZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTE4NzksIC0yMzgsIC0xNTA4LCAzNTE5XSRbLTQ0NDUsIC0yMzgsIC00MDc0LCAzNTE5XSRbLTQ0NDUsIC0zNjUyLCAtNDA3NCwgMTA1XSRbLTEzMjMsIC0zNjUyLCAtOTUyLCAxMDVdIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c4ekF4T2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUUwRkVENjAyQUUiIHNvdXJjZT0iX0c4cFAwT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c4ekF0T2ZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzh6QXgtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzh6QXllZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHpBeXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c4ekF5T2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c4ekF4ZWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzh6QXh1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMCwgNDY1LCAwLCAtMTgyMF0kWzAsIDE4MjgsIDAsIC00NTddIi8+DQotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HOHpBeS1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c4ekF6T2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HOHpBNXVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzAzIiBzb3VyY2U9Il9HOHpBMXVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HOHBQc09mWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4ekE2ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4ekE2LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzh6QTdPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HOHpBNnVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HOHpBNS1mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HOHpBNk9mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlsyOTYsIC01MjQsIC04LCAyNzI2XSRbMjk2LCAtMjcxNywgLTgsIDUzM10iLz4NCi0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c4ekE3ZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzh6QTd1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c4ekFfLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwMEMiIHNvdXJjZT0iX0c4ekE3LWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c4ekE3LWZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzh6QkF1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzh6QkJPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHpCQmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzh6QkEtZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTg3NiIgeT0iMzkzIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHpCQnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDBGIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzh6QkNPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c4ekJCLWZYRWR1cUhvT0piVVJaUnciIHg9Ii0xMjIiIHk9IjYzNiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzh6QkNlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwMEYiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHpCQy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c4ekJDdWZYRWR1cUhvT0piVVJaUnciIHg9IjQ2MiIgeT0iLTM3MSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzh6QkRPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDBEIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzh6QkR1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzh6QkRlZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTg2NyIgeT0iMTcxIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHpCRC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDBEIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzh6QkVlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c4ekJFT2ZYRWR1cUhvT0piVVJaUnciIHg9Ii04MDIiIHk9Ii0xMTExIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHpCRXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDBGIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzh6QkZPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4ekJGZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzh6QkUtZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzh6QkZ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDBEIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzh6QkdPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4ekJHZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzh6QkYtZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzh6Qkd1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwMEYiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHpCSE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzh6QkhlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOHpCRy1mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHpCSHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDBEIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzh6QklPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzh6QkllZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOHpCSC1mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HOHpCQU9mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HOHpCQWVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlsxNzcsIDU4NCwgMTc3LCA1ODRdJFsxNzcsIDI0NDYsIDE3NywgMjQ0Nl0kWy0zNDYyLCAyNDQ2LCAtMzQ2MiwgMjQ0Nl0kWy0zNDYyLCAzOTcsIC0zNDYyLCAzOTddJFstMTk5OCwgMzk3LCAtMTk5OCwgMzk3XSIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HOHpCUXVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDUyIiBzb3VyY2U9Il9HOHpCTXVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HOHpCTXVmWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4ekJSZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4ekJSLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzh6QlNPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HOHpCUnVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHpCU2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDU1Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzh6QlMtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c4ekJTdWZYRWR1cUhvT0piVVJaUnciIHg9IjYyNyIgeT0iMiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzh6QlRPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwNTUiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHpCVHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c4ekJUZWZYRWR1cUhvT0piVVJaUnciIHg9Ii01NDciIHk9IjI2MCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzh6QlQtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDUzIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzh6QlVlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzh6QlVPZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTgwNyIgeT0iLTI5MCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzh6QlV1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDA1MyI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4ekJWT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOHpCVS1mWEVkdXFIb09KYlVSWlJ3IiB4PSItMTUxIiB5PSIyNDciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4ekJWZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwNTUiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHpCVi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzh6QldPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOHpCVnVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HODhLb09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwNTMiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HODhLb3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzg4S28tZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HODhLb2VmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HODhLcE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDA1NSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4OEtwdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HODhLcC1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c4OEtwZWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4OEtxT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwNTMiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HODhLcXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HODhLcS1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c4OEtxZWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c4ekJRLWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c4ekJST2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzEzNTQsIDAsIDEzNTQsIDBdJFszMzk1LCAwLCAzMzk1LCAwXSRbMzM5NSwgLTE5MjEsIDMzOTUsIC0xOTIxXSRbMTg2LCAtMTkyMSwgMTg2LCAtMTkyMV0kWzE4NiwgLTExMTcsIDE4NiwgLTExMTddIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c4OEtyT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwM0UiIHNvdXJjZT0iX0c4ekJNdWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c4cFA0T2ZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzg4S3ItZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzg4S3NlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HODhLc3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c4OEtzT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c4OEtyZWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzg4S3J1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTExMjYsIC0xMTI2LCAyNDI5LCAyNDI5XSRbLTMwMzEsIC0zMDMxLCA1MjQsIDUyNF0iLz4NCi0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c4OEtzLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzg4S3RPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c4OEt0ZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwM0YiIHNvdXJjZT0iX0c4ekJJdWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c4ekJNdWZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzg4S3VPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzg4S3V1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HODhLdS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzg4S3VlZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTE3MyIgeT0iLTQ5OSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzg4S3ZPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDA0MiI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4OEt2dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HODhLdmVmWEVkdXFIb09KYlVSWlJ3IiB4PSItMTMzIiB5PSItMjQ1Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HODhLdi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDA0MiI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4OEt3ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzg4S3dPZlhFZHVxSG9PSmJVUlpSdyIgeD0iNTI3IiB5PSIzMzkiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4OEt3dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDA0MCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4OEt4T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c4OEt3LWZYRWR1cUhvT0piVVJaUnciIHg9Ii0yIiB5PSIyMTMiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4OEt4ZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDQwIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzg4S3gtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c4OEt4dWZYRWR1cUhvT0piVVJaUnciIHg9IjE2NyIgeT0iLTM0NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzg4S3lPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDA0MiI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4OEt5dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HODhLeS1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c4OEt5ZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4OEt6T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDA0MCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4OEt6dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HODhLei1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c4OEt6ZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4OEswT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDQyIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzg4SzB1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4OEswLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzg4SzBlZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzg4SzFPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDA0MCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4OEsxdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4OEsxLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzg4SzFlZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzg4S3R1ZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzg4S3QtZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMTUwOCwgLTI3LCAtMjE5NiwgMjMwMl0kWzM1NDUsIC0yNywgLTE1OSwgMjMwMl0kWzM1NDUsIC0xMjE3LCAtMTU5LCAxMTEyXSIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HODhLMk9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTYwIiBzb3VyY2U9Il9HOHpCSXVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HOHBQc09mWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4OEsyLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4OEszZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzg4SzN1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HODhLM09mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HODhLMmVmWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c4OEsydWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy01NjcsIC01MjQsIDI4ODcsIDI2MjRdJFstMjg3MCwgLTI2MTYsIDU4NCwgNTMzXSIvPg0KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzg4SzMtZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HODhLNE9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzg4SzRlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDNENiIgc291cmNlPSJfRzh6QTctZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzhwUHNPZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HODhLNU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HODhLNXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4OEs1LWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzg4SzVlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzg4SzR1ZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HODhLNC1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9Ils3MjgsIC01OTIsIC0zNDM3LCAyNzA5XSRbMzQ3MSwgLTI3NjgsIC02OTQsIDUzM10iLz4NCi0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c4OEs2T2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzg4SzZlZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c4OEstdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBOTI4MjAzOTIiIHNvdXJjZT0iX0c4cFAtZWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c4OEs2dWZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzg4S19lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzg4S18tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HODhMQU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c4OEtfdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c4OEstLWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c4OEtfT2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzAsIDUxNiwgLTEwMSwgLTEyNjFdJFswLCAxMjUzLCAtMTAxLCAtNTI0XSIvPg0KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzg4TEFlZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HODhMQXVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzg4TEEtZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyOENEMzIzMDE5QSIgc291cmNlPSJfRzg4SzZ1ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzhwUDRPZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HODhMQnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HODhMQ09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4OExDZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzg4TEItZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzg4TEJPZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzg4TEJlZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTIzOCwgMzE4LCAtMjEyLCAtMTY2N10kWy0yMzgsIDE2NjcsIC0yMTIsIC0zMThdIi8+DQotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HODhMQ3VmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c4OExDLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HODhMSE9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMkEwIiBzb3VyY2U9Il9HODhMRE9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HOHBQLWVmWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4OExILWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4OExJZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzg4TEl1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HODhMSU9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HODhMSGVmWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c4OExIdWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzcyOCwgNTI0LCAtMjI2OSwgLTE2MDhdJFsyMjYwLCAxNjA4LCAtNzM2LCAtNTI0XSIvPg0KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzg4TEktZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HODhMSk9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzg4TE5lZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDI5RiIgc291cmNlPSJfRzg4TEplZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzhwUC1lZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HODhMT09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HODhMT3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4OExPLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzg4TE9lZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzg4TE51ZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HODhMTi1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstNzUzLCA1MjQsIDIzNDUsIC0xNzEwXSRbLTIzODcsIDE3MTAsIDcxMSwgLTUyNF0iLz4NCi0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c4OExQT2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzg4TFBlZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c4OExQdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MkIxRUMxQjAzNDkiIHNvdXJjZT0iX0c4cFB3T2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c4OEs2dWZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzg4TFFlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzg4TFEtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HODhMUk9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c4OExRdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c4OExQLWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzg4TFFPZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTk2NSwgNTE2LCAyNDg5LCAtMTM2M10kWy0yNTA2LCAxMzQ2LCA5NDgsIC01MzNdIi8+DQotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HODhMUmVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c4OExSdWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICA8L2NvbnRlbnRzPg0KLSAgICAgICAgICAgIDxjb250ZW50cyB4bWk6dHlwZT0ibm90YXRpb246RGlhZ3JhbSIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGNUY2NzgwMDQ1IiB0eXBlPSJDbGFzcyIgbmFtZT0iUHJvY2Vzc0d1aWRhbmNlIj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOUY3b09mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDlGIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5RjdvLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HOUY3cE9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTY3NiIgaGVpZ2h0PSI5MTQiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5RjdwZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5RjdwdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5RjdwLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlGN3FPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlGN3FlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlGN3F1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlGN3EtZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlGN3JPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlGN3JlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlGN3J1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5RjdyLWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzlGN29lZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzlGN291ZlhFZHVxSG9PSmJVUlpSdyIgeD0iNjY1NyIgeT0iMTA3NzgiIHdpZHRoPSIzMTIzIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5RjcwT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwNzciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlGNzAtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c5RjcxT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5RjcxZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5RjcxdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5RjcxLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlGNzJPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlGNzJlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlGNzJ1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlGNzItZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlGNzNPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlGNzNlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlGNzN1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5RjczLWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzlGNzBlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzlGNzB1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iNjY1NyIgeT0iMTIzNjMiIHdpZHRoPSIzMTIzIiBoZWlnaHQ9IjE2NjciLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlGNzRPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDFDMiI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVBGa3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzlQRmstZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlQRmxPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlQRmxlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlQRmx1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVBGbC1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOVBGbU9mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVBGbWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOVBGbXVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVBGbS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOVBGbk9mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVBGbmVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlQRm51ZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HOVBGa09mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HOVBGa2VmWEVkdXFIb09KYlVSWlJ3IiB4PSIxMzMxNCIgeT0iMTY1ODciIHdpZHRoPSI0MzM2Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5UEZuLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBOUU4NjAxN0UiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlQRm91ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c5UEZvLWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxNjU5IiBoZWlnaHQ9IjkwNSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlQRnBPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlQRnBlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlQRnB1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVBGcC1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOVBGcU9mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVBGcWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOVBGcXVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVBGcS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOVBGck9mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVBGcmVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlQRnJ1ZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HOVBGb09mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HOVBGb2VmWEVkdXFIb09KYlVSWlJ3IiB4PSIxMzMxNCIgeT0iMTQ4MTMiIHdpZHRoPSI0MzM2Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5UEZ1T2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxQzEiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlQRnUtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c5UEZ2T2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5UEZ2ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5UEZ2dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5UEZ2LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlQRndPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlQRndlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlQRnd1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlQRnctZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlQRnhPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlQRnhlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlQRnh1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5UEZ4LWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzlQRnVlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMTI2MzIyNTYiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c5UEZ1dWZYRWR1cUhvT0piVVJaUnciIHg9IjEzMzE0IiB5PSI4NTU5IiB3aWR0aD0iNDMzNiIgaGVpZ2h0PSI1MzkzIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5UEdEdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxOUEiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlQR0VlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c5UEdFdWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIyOTI5IiBoZWlnaHQ9IjEwMzIiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5UEdFLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5UEdGT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5UEdGZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlQR0Z1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlQR0YtZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlQR0dPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlQR0dlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlQR0d1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlQR0ctZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlQR0hPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5UEdIZWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzlQR0QtZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMTI2MzIyNTYiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c5UEdFT2ZYRWR1cUhvT0piVVJaUnciIHg9IjEzMzE0IiB5PSIyNTMxIiB3aWR0aD0iNDMzNiIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVBHSHVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMTk5Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5UEdJZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HOVBHSXVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMjkyOSIgaGVpZ2h0PSIxMDMyIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVBHSS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVBHSk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVBHSmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5UEdKdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5UEdKLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5UEdLT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5UEdLZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5UEdLdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5UEdLLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5UEdMT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOVBHTGVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c5UEdILWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjEyNjMyMjU2IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HOVBHSU9mWEVkdXFIb09KYlVSWlJ3IiB4PSIxMzMxNCIgeT0iMzc1MCIgd2lkdGg9IjQzMzYiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlQR0x1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDFBMyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVBHTWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzlQR011ZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjI5MjkiIGhlaWdodD0iMTAzMiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlQR00tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlQR05PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlQR05lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVBHTnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOVBHTi1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVBHT09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOVBHT2VmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVkya09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOVkya2VmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVkya3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlZMmstZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HOVBHTC1mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIxMjYzMjI1NiIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzlQR01PZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTMzMTQiIHk9IjQ5NjkiIHdpZHRoPSI0MzM2Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5WTJsT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxQTQiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlZMmwtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c5WTJtT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIyOTI5IiBoZWlnaHQ9IjEwMzIiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5WTJtZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5WTJtdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5WTJtLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlZMm5PZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlZMm5lZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlZMm51ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlZMm4tZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlZMm9PZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlZMm9lZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlZMm91ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5WTJvLWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzlZMmxlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMTI2MzIyNTYiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c5WTJsdWZYRWR1cUhvT0piVVJaUnciIHg9IjEzMzE0IiB5PSI2MTg5IiB3aWR0aD0iNDMzNiIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVkycE9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxM0M5MTMwMkM1Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5WTJwLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HOVkycU9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMjkyOSIgaGVpZ2h0PSIxMDMyIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVkycWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVkycXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVkycS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5WTJyT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5WTJyZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5WTJydWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5WTJyLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5WTJzT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5WTJzZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5WTJzdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOVkycy1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c5WTJwZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjEyNjMyMjU2IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HOVkycHVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxMzMxNCIgeT0iNzQwOCIgd2lkdGg9IjQzMzYiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlZMnRPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRTBGRTkzMDA3NyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVkydC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzlZMnVPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlZMnVlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlZMnV1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlZMnUtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVkydk9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOVkydmVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVkydnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOVkydi1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVkyd09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOVkyd2VmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVkyd3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlZMnctZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HOVkydGVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HOVkydHVmWEVkdXFIb09KYlVSWlJ3IiB4PSI5NTEiIHk9IjEwNzc4IiB3aWR0aD0iNDMzNiIgaGVpZ2h0PSI2OTUzIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1dnBrTVU2RWR5Mm11UTJQUXZIX0EiIGVsZW1lbnQ9Il9HNDJSc01VNkVkeTJtdVEyUFF2SF9BIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1NHpnTVU2RWR5Mm11UTJQUXZIX0EiIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HNTR6Z2NVNkVkeTJtdVEyUFF2SF9BIiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNTR6Z3NVNkVkeTJtdVEyUFF2SF9BIiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNTR6ZzhVNkVkeTJtdVEyUFF2SF9BIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNTR6aE1VNkVkeTJtdVEyUFF2SF9BIiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2Q2tnTVU2RWR5Mm11UTJQUXZIX0EiIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2Q2tnY1U2RWR5Mm11UTJQUXZIX0EiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2Q2tnc1U2RWR5Mm11UTJQUXZIX0EiIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2Q2tnOFU2RWR5Mm11UTJQUXZIX0EiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2Q2toTVU2RWR5Mm11UTJQUXZIX0EiIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2Q2toY1U2RWR5Mm11UTJQUXZIX0EiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2Q2toc1U2RWR5Mm11UTJQUXZIX0EiIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNkNraDhVNkVkeTJtdVEyUFF2SF9BIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c1dnBrY1U2RWR5Mm11UTJQUXZIX0EiIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c1dnBrc1U2RWR5Mm11UTJQUXZIX0EiIHg9Ijk1MSIgeT0iLTE4ODQiIHdpZHRoPSI0MzM2IiBoZWlnaHQ9IjExMzc5Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX195ZG1VTWlGRWR5eE80RXN1UU9nVGciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxQjgiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfX3ltd1FNaUZFZHl4TzRFc3VRT2dUZyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX195bXdRY2lGRWR5eE80RXN1UU9nVGciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX195bXdRc2lGRWR5eE80RXN1UU9nVGciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX195bXdROGlGRWR5eE80RXN1UU9nVGciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX195bXdSTWlGRWR5eE80RXN1UU9nVGciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfX3ltd1JjaUZFZHl4TzRFc3VRT2dUZyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfX3ltd1JzaUZFZHl4TzRFc3VRT2dUZyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfX3ltd1I4aUZFZHl4TzRFc3VRT2dUZyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfX3ltd1NNaUZFZHl4TzRFc3VRT2dUZyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfX3ltd1NjaUZFZHl4TzRFc3VRT2dUZyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfX3ltd1NzaUZFZHl4TzRFc3VRT2dUZyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfX3ltd1M4aUZFZHl4TzRFc3VRT2dUZyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX195bXdUTWlGRWR5eE80RXN1UU9nVGciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfX3lkbVVjaUZFZHl4TzRFc3VRT2dUZyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMTI2MzIyNTYiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX195ZG1Vc2lGRWR5eE80RXN1UU9nVGciIHg9IjEzMzE0IiB5PSIxNDgwIiB3aWR0aD0iNDMzNiIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITUtYd01pR0VkeXhPNEVzdVFPZ1RnIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMUI3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hNS1h3OGlHRWR5eE80RXN1UU9nVGciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9ITUtYeE1pR0VkeXhPNEVzdVFPZ1RnIiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITUtYeGNpR0VkeXhPNEVzdVFPZ1RnIiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITUtYeHNpR0VkeXhPNEVzdVFPZ1RnIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITUtYeDhpR0VkeXhPNEVzdVFPZ1RnIiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hNS1h5TWlHRWR5eE80RXN1UU9nVGciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hNS1h5Y2lHRWR5eE80RXN1UU9nVGciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hNS1h5c2lHRWR5eE80RXN1UU9nVGciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hNS1h5OGlHRWR5eE80RXN1UU9nVGciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hNS1h6TWlHRWR5eE80RXN1UU9nVGciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hNS1h6Y2lHRWR5eE80RXN1UU9nVGciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hNS1h6c2lHRWR5eE80RXN1UU9nVGciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITUtYejhpR0VkeXhPNEVzdVFPZ1RnIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hNS1h3Y2lHRWR5eE80RXN1UU9nVGciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjEyNjMyMjU2IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ITUtYd3NpR0VkeXhPNEVzdVFPZ1RnIiB4PSIxMzMxNCIgeT0iNDc1IiB3aWR0aD0iNDMzNiIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9Tcm1rb01pSUVkeXhPNEVzdVFPZ1RnIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMUQ1Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX1NybWtvOGlJRWR5eE80RXN1UU9nVGciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9Tcm1rcE1pSUVkeXhPNEVzdVFPZ1RnIiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9Tcm1rcGNpSUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9Tcm1rcHNpSUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9Tcm1rcDhpSUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX1NybWtxTWlJRWR5eE80RXN1UU9nVGciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX1NybWtxY2lJRWR5eE80RXN1UU9nVGciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX1NybWtxc2lJRWR5eE80RXN1UU9nVGciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX1NybWtxOGlJRWR5eE80RXN1UU9nVGciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX1NybWtyTWlJRWR5eE80RXN1UU9nVGciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX1NybWtyY2lJRWR5eE80RXN1UU9nVGciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX1NybWtyc2lJRWR5eE80RXN1UU9nVGciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9Tcm1rcjhpSUVkeXhPNEVzdVFPZ1RnIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX1NybWtvY2lJRWR5eE80RXN1UU9nVGciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjEyNjMyMjU2IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9Tcm1rb3NpSUVkeXhPNEVzdVFPZ1RnIiB4PSIxMzMxNCIgeT0iLTU1OCIgd2lkdGg9IjQ5NDQiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfVWlxTTRNaUlFZHl4TzRFc3VRT2dUZyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDFDQiI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9VaXFNNDhpSUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfVWlxTTVNaUlFZHl4TzRFc3VRT2dUZyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfVWlxTTVjaUlFZHl4TzRFc3VRT2dUZyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfVWlxTTVzaUlFZHl4TzRFc3VRT2dUZyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfVWlxTTU4aUlFZHl4TzRFc3VRT2dUZyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9VaXFNNk1pSUVkeXhPNEVzdVFPZ1RnIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9VaXFNNmNpSUVkeXhPNEVzdVFPZ1RnIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9VaXFNNnNpSUVkeXhPNEVzdVFPZ1RnIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9VaXFNNjhpSUVkeXhPNEVzdVFPZ1RnIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9VaXFNN01pSUVkeXhPNEVzdVFPZ1RnIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9VaXFNN2NpSUVkeXhPNEVzdVFPZ1RnIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9VaXFNN3NpSUVkeXhPNEVzdVFPZ1RnIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfVWlxTTc4aUlFZHl4TzRFc3VRT2dUZyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9VaXFNNGNpSUVkeXhPNEVzdVFPZ1RnIiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIxMjYzMjI1NiIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfVWlxTTRzaUlFZHl4TzRFc3VRT2dUZyIgeD0iMTMzMTQiIHk9Ii0xNTEwIiB3aWR0aD0iNDMzNiIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTERpYWdyYW1TdHlsZSIgeG1pOmlkPSJfR212UkktZlhFZHVxSG9PSmJVUlpSdyIgZGVzY3JpcHRpb249IlRoaXMgZGlhZ3JhbSBwcm92aWRlcyBhbiBvdmVydmlldyB0byB0aGUgZGlmZmVyZW50IFByb2Nlc3Mtc3BlY2lmaWMgR3VpZGFuY2UgVHlwZXMgYWRkZWQgdG8gdGhlIEd1aWRhbmNlIFR5cGVzIGFscmVhZHkgZGVmaW5lZCBpbiBDb3JlIE1ldGhvZCBDb250ZW50IGZvciBQcm9jZXNzZXMuIi8+DQotICAgICAgICAgICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzlQRnlPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDExQSIgc291cmNlPSJfRzlQRnVPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzlGNzBPZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVBGeS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVBGemVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5UEZ6dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzlQRnpPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlQRnotZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDExRCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5UEYwZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOVBGME9mWEVkdXFIb09KYlVSWlJ3IiB4PSI0IiB5PSIxMjciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5UEYwdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTFEIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlQRjFPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOVBGMC1mWEVkdXFIb09KYlVSWlJ3IiB4PSIxMTExIiB5PSItMjMwIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVBGMWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxMUIiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVBGMS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOVBGMXVmWEVkdXFIb09KYlVSWlJ3IiB4PSIyNjciIHk9IjIwNSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlQRjJPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxMUIiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVBGMnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzlQRjJlZlhFZHVxSG9PSmJVUlpSdyIgeD0iMzYxIiB5PSIzNDciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5UEYyLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxMUQiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVBGM2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlQRjN1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOVBGM09mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVBGMy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxMUIiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVBGNGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlQRjR1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOVBGNE9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVBGNC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDExRCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5UEY1ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOVBGNXVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c5UEY1T2ZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5UEY1LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxMUIiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVBGNmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOVBGNnVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c5UEY2T2ZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c5UEZ5ZWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c5UEZ5dWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0xNTA3LCAyNDEzLCA4OTA2LCA1ODRdJFstODk0MCwgMjQxMywgMTQ3MywgNTg0XSIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HOVBGNi1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTJFIiBzb3VyY2U9Il9HOVBGdU9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HOUY3ME9mWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5UEY3dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5UEY4T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlQRjhlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HOVBGNy1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVBGOHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTMxIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlQRjlPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c5UEY4LWZYRWR1cUhvT0piVVJaUnciIHg9IjQiIHk9Ii0xOTIiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5UEY5ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTMxIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlQRjktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOVBGOXVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxNTIwIiB5PSI1ODciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5UEYtT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDEyRiI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5UEYtdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c5UEYtZWZYRWR1cUhvT0piVVJaUnciIHg9IjI0MCIgeT0iLTI3MSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlQRi0tZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxMkYiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVBGX2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzlQRl9PZlhFZHVxSG9PSmJVUlpSdyIgeD0iMzYxIiB5PSIzNDciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5UEZfdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxMzEiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVBHQU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlQR0FlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOVBGXy1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVBHQXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxMkYiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVBHQk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlQR0JlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOVBHQS1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVBHQnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDEzMSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5UEdDT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOVBHQ2VmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c5UEdCLWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5UEdDdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxMkYiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVBHRE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOVBHRGVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c5UEdDLWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c5UEY3T2ZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c5UEY3ZWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0yMTcwLCAxNDI5LCA1MTA2LCAtNTI5XSRbLTU3MTUsIDE0MjksIDE1NjEsIC01MjldIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c5WTJ4T2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEZENTYxQTAzOTYiIHNvdXJjZT0iX0c5WTJ0T2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c5Rjc0T2ZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlZMngtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlZMnllZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVkyeXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c5WTJ5T2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5WTJ5LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEZENTYxQzAwNzkiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVkyemVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzlZMnpPZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTkxOSIgeT0iMzA1Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVkyenVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRkQ1NjFDMDA3OSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5WTIwT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzlZMnotZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTQwMyIgeT0iLTE5NCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlZMjBlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGRDU2MUMwMDY1Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlZMjAtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzlZMjB1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iNjY0IiB5PSIyODAiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5WTIxT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEZENTYxQzAwNjUiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVkyMXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzlZMjFlZlhFZHVxSG9PSmJVUlpSdyIgeD0iNTUiIHk9Ii0yMjAiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5WTIxLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEZENTYxQzAwNzkiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVkyMmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlZMjJ1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOVkyMk9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVkyMi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEZENTYxQzAwNjUiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVkyM2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlZMjN1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOVkyM09mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVkyMy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRkQ1NjFDMDA3OSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5WTI0ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOVkyNHVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c5WTI0T2ZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5WTI0LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEZENTYxQzAwNjUiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVkyNWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOVkyNXVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c5WTI1T2ZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c5WTJ4ZWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c5WTJ4dWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzExODUsIDMzMzUsIC04NjE5LCA4NF0kWzg4MjIsIDMzMzUsIC05ODIsIDg0XSIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HOVkyNS1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTlFRkUwMUNBIiBzb3VyY2U9Il9HOVBGbi1mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HOVkydE9mWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5WTI2dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5WTI3T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlZMjdlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HOVkyNi1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVkyN3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTlFRkYwMUE0Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlZMjhPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c5WTI3LWZYRWR1cUhvT0piVVJaUnciIHg9Ii05NDIiIHk9Ii0yNDUiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5WTI4ZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E5RUZGMDFBNCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5WTI4LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzlZMjh1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTM5NyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlZMjlPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTlFRkYwMTlBIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlZMjl1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzlZMjllZlhFZHVxSG9PSmJVUlpSdyIgeD0iNjg5IiB5PSItMjQ1Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVkyOS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTlFRkYwMTlBIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlZMi1lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c5WTItT2ZYRWR1cUhvT0piVVJaUnciIHg9Ii02ODMiIHk9IjE5NSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlZMi11ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E5RUZGMDFBNCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5WTJfT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOVkyX2VmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c5WTItLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5WTJfdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E5RUZGMDE5QSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5WTNBT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOVkzQWVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c5WTJfLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5WTNBdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTlFRkYwMUE0Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlZM0JPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5WTNCZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzlZM0EtZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlZM0J1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E5RUZGMDE5QSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5WTNDT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5WTNDZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzlZM0ItZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzlZMjZPZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzlZMjZlZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTk1MywgLTI2NCwgMTIyMjQsIDI1NjddJFstMTE5ODYsIC0yNjQsIDExOTEsIDI1NjddIi8+DQotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9keHp4QU1VN0VkeTJtdVEyUFF2SF9BIiBpZD0iKDAuODEwMDA0MiwwLjkwMDkwNjEpIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c5WTNDdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBOUY1MDAzMjUiIHNvdXJjZT0iX0c1dnBrTVU2RWR5Mm11UTJQUXZIX0EiIHRhcmdldD0iX0c5UEZ1T2ZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlZM0RlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlZM0QtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVkzRU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c5WTNEdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5WTNFZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBOUY1MjAwNDUiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVkzRS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzlZM0V1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTY2OSIgeT0iMjc4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVkzRk9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBOUY1MjAwNDUiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVkzRnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c5WTNGZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0zOTciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5WTNGLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E5RjUyMDA0MyI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5WTNHZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c5WTNHT2ZYRWR1cUhvT0piVVJaUnciIHg9IjcxOSIgeT0iMzA1Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVkzR3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTlGNTIwMDQzIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlZM0hPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c5WTNHLWZYRWR1cUhvT0piVVJaUnciIHg9Ii02NTIiIHk9Ii0yNDYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5WTNIZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBOUY1MjAwNDUiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVkzSC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlZM0lPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOVkzSHVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVkzSWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBOUY1MjAwNDMiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVkzSS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlZM0pPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOVkzSXVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVkzSmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E5RjUyMDA0NSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5WTNKLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOVkzS09mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c5WTNKdWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5WTNLZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBOUY1MjAwNDMiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVkzSy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOVkzTE9mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c5WTNLdWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c5WTNDLWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c5WTNET2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzExODUsIDQ2MzEsIC05MjI4LCAtMjIyNl0kWzg5MDYsIDQ2MzEsIC0xNTA3LCAtMjIyNl0iLz4NCi0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX05SblZJTVU3RWR5Mm11UTJQUXZIX0EiIGlkPSIoMC43MDk2ODYsMC45NjU3NzM2NCkiLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzlZM0xlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E5RjhDMDBDNSIgc291cmNlPSJfRzV2cGtNVTZFZHkybXVRMlBRdkhfQSIgdGFyZ2V0PSJfRzlQR0R1ZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVkzTU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVkzTXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5WTNNLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzlZM01lZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlZM05PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E5RjhEMDAxRCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5WTNOdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOVkzTmVmWEVkdXFIb09KYlVSWlJ3IiB4PSItNjY5IiB5PSIyMDciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5WTNOLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E5RjhEMDAxRCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5WTNPZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzlZM09PZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTM5NyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlZM091ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTlGOEQwMDEzIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlZM1BPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzlZM08tZlhFZHVxSG9PSmJVUlpSdyIgeD0iNzUyIiB5PSIyOTUiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5WTNQZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBOUY4RDAwMTMiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVkzUC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzlZM1B1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTc4IiB5PSItMTg3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVkzUU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTlGOEQwMDFEIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlpbmtPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5aW5rZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzlZM1FlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlpbmt1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTlGOEQwMDEzIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlpbmxPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5aW5sZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzlpbmstZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlpbmx1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBOUY4RDAwMUQiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOWlubU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlpbm1lZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOWlubC1mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOWlubXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTlGOEQwMDEzIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlpbm5PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlpbm5lZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOWlubS1mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HOVkzTHVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HOVkzTC1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlsxMTg1LCAtNDI3NSwgLTkxNzcsIC04XSRbODg5OCwgLTQyNzUsIC0xNDY0LCAtOF0iLz4NCi0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX1ZINXhZTVU2RWR5Mm11UTJQUXZIX0EiIGlkPSIoMC44NTc2MzcwNSwwLjAzMTQ5Mjc1NSkiLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzlpbm51ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E5RjkwMDI1MiIgc291cmNlPSJfRzV2cGtNVTZFZHkybXVRMlBRdkhfQSIgdGFyZ2V0PSJfRzlQR0h1ZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOWlub2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOWluby1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5aW5wT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzlpbm91ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlpbnBlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E5RjkxMDFCNCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5aW5wLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOWlucHVmWEVkdXFIb09KYlVSWlJ3IiB4PSItNjY5IiB5PSIyNTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5aW5xT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E5RjkxMDFCNCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5aW5xdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzlpbnFlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTM5NyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlpbnEtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTlGOTEwMUE5Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlpbnJlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzlpbnJPZlhFZHVxSG9PSmJVUlpSdyIgeD0iNzYwIiB5PSIyOTYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5aW5ydWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBOUY5MTAxQTkiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOWluc09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzlpbnItZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTEwIiB5PSItMjQ2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOWluc2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTlGOTEwMUI0Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlpbnMtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5aW50T2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzlpbnN1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlpbnRlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTlGOTEwMUE5Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlpbnQtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5aW51T2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzlpbnR1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlpbnVlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBOUY5MTAxQjQiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOWludS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlpbnZPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOWludXVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOWludmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTlGOTEwMUE5Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlpbnYtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlpbndPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOWludnVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HOWlubi1mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HOWlub09mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlsxMTg1LCAtMzA0OCwgLTkxNzcsIDBdJFs4ODk4LCAtMzA0OCwgLTE0NjQsIDBdIi8+DQotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9WNFZJd01VNkVkeTJtdVEyUFF2SF9BIiBpZD0iKDAuNzg3MTIwOCwwLjE2MTk3Nzc0KSIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HOWlud2VmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTlGOTQwM0I3IiBzb3VyY2U9Il9HNXZwa01VNkVkeTJtdVEyUFF2SF9BIiB0YXJnZXQ9Il9HOVBHTHVmWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5aW54T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5aW54dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlpbngtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HOWlueGVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOWlueU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTlGOTUwMzJDIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlpbnl1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c5aW55ZWZYRWR1cUhvT0piVVJaUnciIHg9Ii02NjkiIHk9IjI4MyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlpbnktZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTlGOTUwMzJDIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlpbnplZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOWluek9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMzk3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOWluenVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBOUY5NTAzMjIiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOWluME9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOWluei1mWEVkdXFIb09KYlVSWlJ3IiB4PSI3MDEiIHk9IjI4NyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlpbjBlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E5Rjk1MDMyMiI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5aW4wLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOWluMHVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxMDgiIHk9Ii0yODAiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5aW4xT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBOUY5NTAzMkMiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOWluMXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlpbjEtZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOWluMWVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOWluMk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBOUY5NTAzMjIiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOWluMnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlpbjItZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOWluMmVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOWluM09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E5Rjk1MDMyQyI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5aW4zdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOWluMy1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c5aW4zZWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5aW40T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBOUY5NTAzMjIiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOWluNHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOWluNC1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c5aW40ZWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c5aW53dWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c5aW53LWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzExODUsIC0xODI4LCAtOTE3NywgMF0kWzg4OTgsIC0xODI4LCAtMTQ2NCwgMF0iLz4NCi0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX1dna05jTVU2RWR5Mm11UTJQUXZIX0EiIGlkPSIoMC44MjI1MTIsMC4yODQxNjk2NCkiLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzlpbjVPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E5Rjk5MDM4MyIgc291cmNlPSJfRzV2cGtNVTZFZHkybXVRMlBRdkhfQSIgdGFyZ2V0PSJfRzlZMmxPZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOWluNS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOWluNmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5aW42dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzlpbjZPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlpbjYtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E5RjlBMDJFNCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5aW43ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOWluN09mWEVkdXFIb09KYlVSWlJ3IiB4PSItNjY5IiB5PSIyODEiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5aW43dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E5RjlBMDJFNCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5aW44T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzlpbjctZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTM5NyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlpbjhlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTlGOUEwMkRBIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlpbjgtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzlpbjh1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iNjc1IiB5PSIyNjIiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5aW45T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBOUY5QTAyREEiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOWluOXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzlpbjllZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTI1IiB5PSItMzQwIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOWluOS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTlGOUEwMkU0Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlpbi1lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5aW4tdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzlpbi1PZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlpbi0tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTlGOUEwMkRBIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlpbl9lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5aW5fdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzlpbl9PZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlpbl8tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBOUY5QTAyRTQiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOWlvQWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlpb0F1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOWlvQU9mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOWlvQS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTlGOUEwMkRBIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlpb0JlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlpb0J1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOWlvQk9mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HOWluNWVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HOWluNXVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlszNzEsIDM3ODMsIC04MDk2LCAtNzldJFs4NDE0LCAzNzgzLCAtNTMsIC03OV0iLz4NCi0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX1hFbjh3TVU2RWR5Mm11UTJQUXZIX0EiIGlkPSIoMC45MDY4NjUzNiwwLjQxNDc1OTYpIi8+DQotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9lM0NROFFhb0VkMlczYzhRV0NJN1pnIiBpZD0iKDAuMDEwODM5NDg0LDAuNzkyNDUyOCkiLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzlpb0ItZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E5RjlFMDE3OCIgc291cmNlPSJfRzV2cGtNVTZFZHkybXVRMlBRdkhfQSIgdGFyZ2V0PSJfRzlZMnBPZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOWlvQ3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOWlvRE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5aW9EZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzlpb0MtZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlpb0R1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E5RjlGMDA4QiI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5aW9FT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOWlvRC1mWEVkdXFIb09KYlVSWlJ3IiB4PSItNjY5IiB5PSIyMjciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5aW9FZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E5RjlGMDA4QiI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5aW9FLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzlpb0V1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTM5NyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlpb0ZPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTlGOUYwMDg5Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlpb0Z1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzlpb0ZlZlhFZHVxSG9PSmJVUlpSdyIgeD0iNzYwIiB5PSIyNjMiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5aW9GLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBOUY5RjAwODkiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOWlvR2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzlpb0dPZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTI5MCIgeT0iLTI4OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlpb0d1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E5RjlGMDA4QiI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5aW9IT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOWlvSGVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c5aW9HLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5aW9IdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E5RjlGMDA4OSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5aW9JT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOWlvSWVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c5aW9ILWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5aW9JdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTlGOUYwMDhCIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlpb0pPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5aW9KZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzlpb0ktZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlpb0p1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E5RjlGMDA4OSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5aW9LT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5aW9LZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzlpb0otZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzlpb0NPZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzlpb0NlZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMTE4NSwgNjA5LCAtOTE3NywgMF0kWzg4OTgsIDYwOSwgLTE0NjQsIDBdIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c5aW9LdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUUwRkVENjAyQUUiIHNvdXJjZT0iX0c5RjdvT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c5WTJ0T2ZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlpb0xlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlpb0wtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOWlvTU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c5aW9MdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c5aW9LLWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c5aW9MT2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzg0LCAtNDY1LCA4NCwgNTgzM10kWzg0LCAtMTQ5OCwgODQsIDQ4MDBdIi8+DQotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HOWlvTWVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c5aW9NdWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HOWlvTS1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTEwIiBzb3VyY2U9Il9HOUY3ME9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HOUY3b09mWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5aW9OdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5aW9PT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlpb09lZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HOWlvTi1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HOWlvTk9mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HOWlvTmVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlsyNywgLTg0NywgMjcsIDE2NDBdJFsyNywgLTIxNzAsIDI3LCAzMTddIi8+DQotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HOWlvT3VmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c5aW9PLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9jUlI4OE1VOEVkeTJtdVEyUFF2SF9BIiBlbGVtZW50PSJfY1FzSEVNVThFZHkybXVRMlBRdkhfQSIgc291cmNlPSJfRzlZMnRPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzV2cGtNVTZFZHkybXVRMlBRdkhfQSI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9jUlI4ODhVOEVkeTJtdVEyUFF2SF9BIiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9jUlI4OWNVOEVkeTJtdVEyUFF2SF9BIiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2NSUjg5c1U4RWR5Mm11UTJQUXZIX0EiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9jUlI4OU1VOEVkeTJtdVEyUFF2SF9BIiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9jUlI4OGNVOEVkeTJtdVEyUFF2SF9BIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX2NSUjg4c1U4RWR5Mm11UTJQUXZIX0EiIHBvaW50cz0iWy0yLCAtMTMyLCAtMywgMTkyXSRbLTIsIC0xOTMsIC0zLCAxMzFdIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX25COVp3TWlJRWR5eE80RXN1UU9nVGciIGVsZW1lbnQ9Il9uQW45QU1pSUVkeXhPNEVzdVFPZ1RnIiBzb3VyY2U9Il9HNXZwa01VNkVkeTJtdVEyUFF2SF9BIiB0YXJnZXQ9Il9feWRtVU1pRkVkeXhPNEVzdVFPZ1RnIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX25COVp3OGlJRWR5eE80RXN1UU9nVGciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX25COVp4Y2lJRWR5eE80RXN1UU9nVGciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfbkI5WnhzaUlFZHl4TzRFc3VRT2dUZyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX25COVp4TWlJRWR5eE80RXN1UU9nVGciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX25COVp4OGlJRWR5eE80RXN1UU9nVGciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il9uQXhHODhpSUVkeXhPNEVzdVFPZ1RnIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfbkI5WnljaUlFZHl4TzRFc3VRT2dUZyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX25COVp5TWlJRWR5eE80RXN1UU9nVGciIHg9Ii03NDEiIHk9IjI2MyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfbkI5WnlzaUlFZHl4TzRFc3VRT2dUZyIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il9uQXhHODhpSUVkeXhPNEVzdVFPZ1RnIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfbkNIS3dNaUlFZHl4TzRFc3VRT2dUZyIgdHlwZT0iVG9Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9uQjlaeThpSUVkeXhPNEVzdVFPZ1RnIiB5PSItMzk3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9uQ0hLd2NpSUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il9uQXhHOE1pSUVkeXhPNEVzdVFPZ1RnIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfbkNIS3c4aUlFZHl4TzRFc3VRT2dUZyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfbkNIS3dzaUlFZHl4TzRFc3VRT2dUZyIgeD0iNzEzIiB5PSIyNjMiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX25DSEt4TWlJRWR5eE80RXN1UU9nVGciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il9uQXhHOE1pSUVkeXhPNEVzdVFPZ1RnIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfbkNIS3hzaUlFZHl4TzRFc3VRT2dUZyIgdHlwZT0iRnJvbVJvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX25DSEt4Y2lJRWR5eE80RXN1UU9nVGciIHg9IjE4NSIgeT0iLTIzOSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfbkNIS3g4aUlFZHl4TzRFc3VRT2dUZyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iX25BeEc4OGlJRWR5eE80RXN1UU9nVGciPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9uQ0hLeWNpSUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfbkNIS3lzaUlFZHl4TzRFc3VRT2dUZyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9uQ0hLeU1pSUVkeXhPNEVzdVFPZ1RnIiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9uQ0hLeThpSUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il9uQXhHOE1pSUVkeXhPNEVzdVFPZ1RnIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfbkNIS3pjaUlFZHl4TzRFc3VRT2dUZyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX25DSEt6c2lJRWR5eE80RXN1UU9nVGciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfbkNIS3pNaUlFZHl4TzRFc3VRT2dUZyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfbkNIS3o4aUlFZHl4TzRFc3VRT2dUZyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il9uQXhHODhpSUVkeXhPNEVzdVFPZ1RnIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfbkNISzBjaUlFZHl4TzRFc3VRT2dUZyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX25DSEswc2lJRWR5eE80RXN1UU9nVGciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfbkNISzBNaUlFZHl4TzRFc3VRT2dUZyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfbkNISzA4aUlFZHl4TzRFc3VRT2dUZyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iX25BeEc4TWlJRWR5eE80RXN1UU9nVGciPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9uQ0hLMWNpSUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9uQ0hLMXNpSUVkeXhPNEVzdVFPZ1RnIi8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX25DSEsxTWlJRWR5eE80RXN1UU9nVGciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX25COVp3Y2lJRWR5eE80RXN1UU9nVGciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX25COVp3c2lJRWR5eE80RXN1UU9nVGciIHBvaW50cz0iWzgyLCAtMTcsIC0zODYsIDU5XSRbMzg2LCAtNzksIC04MiwgLTNdIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX3B3QVVZTWlJRWR5eE80RXN1UU9nVGciIGVsZW1lbnQ9Il9wdjNLY01pSUVkeXhPNEVzdVFPZ1RnIiBzb3VyY2U9Il9HNXZwa01VNkVkeTJtdVEyUFF2SF9BIiB0YXJnZXQ9Il9ITUtYd01pR0VkeXhPNEVzdVFPZ1RnIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3B3QVVZOGlJRWR5eE80RXN1UU9nVGciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3B3QVVaY2lJRWR5eE80RXN1UU9nVGciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfcHdBVVpzaUlFZHl4TzRFc3VRT2dUZyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX3B3QVVaTWlJRWR5eE80RXN1UU9nVGciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3B3QVVaOGlJRWR5eE80RXN1UU9nVGciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il9wdjNLZE1pSUVkeXhPNEVzdVFPZ1RnIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfcHdBVWFjaUlFZHl4TzRFc3VRT2dUZyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX3B3QVVhTWlJRWR5eE80RXN1UU9nVGciIHg9Ii03NDIiIHk9IjI2MyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfcHdBVWFzaUlFZHl4TzRFc3VRT2dUZyIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il9wdjNLZE1pSUVkeXhPNEVzdVFPZ1RnIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfcHdBVWJNaUlFZHl4TzRFc3VRT2dUZyIgdHlwZT0iVG9Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9wd0FVYThpSUVkeXhPNEVzdVFPZ1RnIiB5PSItMzk3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9wd0FVYmNpSUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il9wdjNLY2NpSUVkeXhPNEVzdVFPZ1RnIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfcHdBVWI4aUlFZHl4TzRFc3VRT2dUZyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfcHdBVWJzaUlFZHl4TzRFc3VRT2dUZyIgeD0iNjg3IiB5PSIyNjMiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3B3QVVjTWlJRWR5eE80RXN1UU9nVGciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il9wdjNLY2NpSUVkeXhPNEVzdVFPZ1RnIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfcHdBVWNzaUlFZHl4TzRFc3VRT2dUZyIgdHlwZT0iRnJvbVJvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX3B3QVVjY2lJRWR5eE80RXN1UU9nVGciIHg9IjI5MCIgeT0iLTIxMiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfcHdBVWM4aUlFZHl4TzRFc3VRT2dUZyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iX3B2M0tkTWlJRWR5eE80RXN1UU9nVGciPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9wd0FVZGNpSUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfcHdBVWRzaUlFZHl4TzRFc3VRT2dUZyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9wd0FVZE1pSUVkeXhPNEVzdVFPZ1RnIiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9wd0FVZDhpSUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il9wdjNLY2NpSUVkeXhPNEVzdVFPZ1RnIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfcHdBVWVjaUlFZHl4TzRFc3VRT2dUZyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX3B3QVVlc2lJRWR5eE80RXN1UU9nVGciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfcHdBVWVNaUlFZHl4TzRFc3VRT2dUZyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfcHdBVWU4aUlFZHl4TzRFc3VRT2dUZyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il9wdjNLZE1pSUVkeXhPNEVzdVFPZ1RnIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfcHdBVWZjaUlFZHl4TzRFc3VRT2dUZyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX3B3QVVmc2lJRWR5eE80RXN1UU9nVGciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfcHdBVWZNaUlFZHl4TzRFc3VRT2dUZyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfcHdBVWY4aUlFZHl4TzRFc3VRT2dUZyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iX3B2M0tjY2lJRWR5eE80RXN1UU9nVGciPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9wd0FVZ2NpSUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9wd0FVZ3NpSUVkeXhPNEVzdVFPZ1RnIi8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX3B3QVVnTWlJRWR5eE80RXN1UU9nVGciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX3B3QVVZY2lJRWR5eE80RXN1UU9nVGciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX3B3QVVZc2lJRWR5eE80RXN1UU9nVGciIHBvaW50cz0iWzgyLCAtMjMsIC0zODYsIDkxXSRbMzg2LCAtMTEzLCAtODIsIDFdIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX3FhZU5zTWlJRWR5eE80RXN1UU9nVGciIGVsZW1lbnQ9Il9xYVZEd01pSUVkeXhPNEVzdVFPZ1RnIiBzb3VyY2U9Il9HNXZwa01VNkVkeTJtdVEyUFF2SF9BIiB0YXJnZXQ9Il9Tcm1rb01pSUVkeXhPNEVzdVFPZ1RnIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3FhZU5zOGlJRWR5eE80RXN1UU9nVGciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3FhZU50Y2lJRWR5eE80RXN1UU9nVGciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfcWFlTnRzaUlFZHl4TzRFc3VRT2dUZyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX3FhZU50TWlJRWR5eE80RXN1UU9nVGciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3FhZU50OGlJRWR5eE80RXN1UU9nVGciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il9xYVZEeE1pSUVkeXhPNEVzdVFPZ1RnIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfcWFlTnVjaUlFZHl4TzRFc3VRT2dUZyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX3FhZU51TWlJRWR5eE80RXN1UU9nVGciIHg9Ii03NDIiIHk9IjIzNiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfcWFlTnVzaUlFZHl4TzRFc3VRT2dUZyIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il9xYVZEeE1pSUVkeXhPNEVzdVFPZ1RnIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfcWFlTnZNaUlFZHl4TzRFc3VRT2dUZyIgdHlwZT0iVG9Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9xYWVOdThpSUVkeXhPNEVzdVFPZ1RnIiB5PSItMzk3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9xYWVOdmNpSUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il9xYVZEd2NpSUVkeXhPNEVzdVFPZ1RnIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfcWFlTnY4aUlFZHl4TzRFc3VRT2dUZyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfcWFlTnZzaUlFZHl4TzRFc3VRT2dUZyIgeD0iNTAyIiB5PSIyNjMiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3FhZU53TWlJRWR5eE80RXN1UU9nVGciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il9xYVZEd2NpSUVkeXhPNEVzdVFPZ1RnIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfcWFlTndzaUlFZHl4TzRFc3VRT2dUZyIgdHlwZT0iRnJvbVJvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX3FhZU53Y2lJRWR5eE80RXN1UU9nVGciIHg9Ii04NzQiIHk9Ii0yOTIiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3FhZU53OGlJRWR5eE80RXN1UU9nVGciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il9xYVZEeE1pSUVkeXhPNEVzdVFPZ1RnIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfcWFlTnhjaUlFZHl4TzRFc3VRT2dUZyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX3FhZU54c2lJRWR5eE80RXN1UU9nVGciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfcWFlTnhNaUlFZHl4TzRFc3VRT2dUZyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfcWFlTng4aUlFZHl4TzRFc3VRT2dUZyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfcWFWRHdjaUlFZHl4TzRFc3VRT2dUZyI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3FhZU55Y2lJRWR5eE80RXN1UU9nVGciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9xYWVOeXNpSUVkeXhPNEVzdVFPZ1RnIi8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX3FhZU55TWlJRWR5eE80RXN1UU9nVGciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3FhZU55OGlJRWR5eE80RXN1UU9nVGciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfcWFWRHhNaUlFZHl4TzRFc3VRT2dUZyI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3FhZU56Y2lJRWR5eE80RXN1UU9nVGciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9xYWVOenNpSUVkeXhPNEVzdVFPZ1RnIi8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX3FhZU56TWlJRWR5eE80RXN1UU9nVGciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3FhZU56OGlJRWR5eE80RXN1UU9nVGciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il9xYVZEd2NpSUVkeXhPNEVzdVFPZ1RnIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfcWFlTjBjaUlFZHl4TzRFc3VRT2dUZyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfcWFlTjBzaUlFZHl4TzRFc3VRT2dUZyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9xYWVOME1pSUVkeXhPNEVzdVFPZ1RnIiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9xYWVOc2NpSUVkeXhPNEVzdVFPZ1RnIiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9xYWVOc3NpSUVkeXhPNEVzdVFPZ1RnIiBwb2ludHM9Ils4MiwgLTMxLCAtMzk4LCAxMjJdJFszODYsIC0xNTQsIC05NCwgLTFdIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX3JRSGNRTWlJRWR5eE80RXN1UU9nVGciIGVsZW1lbnQ9Il9yUC1TVU1pSUVkeXhPNEVzdVFPZ1RnIiBzb3VyY2U9Il9HNXZwa01VNkVkeTJtdVEyUFF2SF9BIiB0YXJnZXQ9Il9VaXFNNE1pSUVkeXhPNEVzdVFPZ1RnIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3JRSGNROGlJRWR5eE80RXN1UU9nVGciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3JRSGNSY2lJRWR5eE80RXN1UU9nVGciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfclFIY1JzaUlFZHl4TzRFc3VRT2dUZyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX3JRSGNSTWlJRWR5eE80RXN1UU9nVGciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3JRSGNSOGlJRWR5eE80RXN1UU9nVGciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il9yUC1TVk1pSUVkeXhPNEVzdVFPZ1RnIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfclFIY1NjaUlFZHl4TzRFc3VRT2dUZyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX3JRSGNTTWlJRWR5eE80RXN1UU9nVGciIHg9Ii03NDEiIHk9IjI5MCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfclFIY1NzaUlFZHl4TzRFc3VRT2dUZyIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il9yUC1TVk1pSUVkeXhPNEVzdVFPZ1RnIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfclFIY1RNaUlFZHl4TzRFc3VRT2dUZyIgdHlwZT0iVG9Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9yUUhjUzhpSUVkeXhPNEVzdVFPZ1RnIiB5PSItMzk3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9yUUhjVGNpSUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il9yUC1TVWNpSUVkeXhPNEVzdVFPZ1RnIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfclFIY1Q4aUlFZHl4TzRFc3VRT2dUZyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfclFIY1RzaUlFZHl4TzRFc3VRT2dUZyIgeD0iNjYxIiB5PSIyOTAiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3JRSGNVTWlJRWR5eE80RXN1UU9nVGciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il9yUC1TVWNpSUVkeXhPNEVzdVFPZ1RnIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfclFIY1VzaUlFZHl4TzRFc3VRT2dUZyIgdHlwZT0iRnJvbVJvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX3JRSGNVY2lJRWR5eE80RXN1UU9nVGciIHg9Ii0yNyIgeT0iLTIzOSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfclFIY1U4aUlFZHl4TzRFc3VRT2dUZyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iX3JQLVNWTWlJRWR5eE80RXN1UU9nVGciPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9yUUhjVmNpSUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfclFIY1ZzaUlFZHl4TzRFc3VRT2dUZyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9yUUhjVk1pSUVkeXhPNEVzdVFPZ1RnIiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9yUUhjVjhpSUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il9yUC1TVWNpSUVkeXhPNEVzdVFPZ1RnIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfclFIY1djaUlFZHl4TzRFc3VRT2dUZyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX3JRSGNXc2lJRWR5eE80RXN1UU9nVGciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfclFIY1dNaUlFZHl4TzRFc3VRT2dUZyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfclFIY1c4aUlFZHl4TzRFc3VRT2dUZyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il9yUC1TVk1pSUVkeXhPNEVzdVFPZ1RnIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfclFIY1hjaUlFZHl4TzRFc3VRT2dUZyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX3JRSGNYc2lJRWR5eE80RXN1UU9nVGciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfclFIY1hNaUlFZHl4TzRFc3VRT2dUZyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfclFIY1g4aUlFZHl4TzRFc3VRT2dUZyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iX3JQLVNVY2lJRWR5eE80RXN1UU9nVGciPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9yUUhjWWNpSUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9yUUhjWXNpSUVkeXhPNEVzdVFPZ1RnIi8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX3JRSGNZTWlJRWR5eE80RXN1UU9nVGciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX3JRSGNRY2lJRWR5eE80RXN1UU9nVGciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX3JRSGNRc2lJRWR5eE80RXN1UU9nVGciIHBvaW50cz0iWzgyLCAtMzksIC0zODYsIDE1MF0kWzM4NiwgLTE5NiwgLTgyLCAtN10iLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgPC9jb250ZW50cz4NCi0gICAgICAgICAgICA8Y29udGVudHMgeG1pOnR5cGU9Im5vdGF0aW9uOkRpYWdyYW0iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyMTI0QkNEMDMxQSIgdHlwZT0iQ2xhc3MiIG5hbWU9IlJlZmVyZW5jZVdvcmtmbG93cyI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlyeGtPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDA5RiI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOXJ4ay1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzlyeGxPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjE3MjciIGhlaWdodD0iOTA1Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOXJ4bGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOXJ4bHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOXJ4bC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5cnhtT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5cnhtZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5cnhtdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5cnhtLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5cnhuT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5cnhuZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5cnhudWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOXJ4bi1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c5cnhrZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c5cnhrdWZYRWR1cUhvT0piVVJaUnciIHg9Ijc2MDgiIHk9IjM0ODciLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlyeG9PZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRTBGRTkzMDA3NyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOXJ4by1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzlyeHBPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjE1NzQiIGhlaWdodD0iOTA1Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOXJ4cGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOXJ4cHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOXJ4cC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5cnhxT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5cnhxZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5cnhxdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5cnhxLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5cnhyT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5cnhyZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5cnhydWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOXJ4ci1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c5cnhvZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c5cnhvdWZYRWR1cUhvT0piVVJaUnciIHg9Ijc2ODQiIHk9IjE2NTgiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlyeHVlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMTI0QkVFMDBEQyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOXJ4dk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzlyeHZlZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjE4NjIiIGhlaWdodD0iOTA1Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOXJ4dnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOXJ4di1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOXJ4d09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5cnh3ZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5cnh3dWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5cnh3LWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5cnh4T2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5cnh4ZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5cnh4dWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5cnh4LWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOXJ4eU9mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c5cnh1dWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c5cnh1LWZYRWR1cUhvT0piVVJaUnciIHg9IjkzNiIgeT0iMTc2MCIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOXJ4OWVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMERDIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5cngtT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HOXJ4LWVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMzExNSIgaGVpZ2h0PSI5MDUiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5cngtdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5cngtLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5cnhfT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlyeF9lZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlyeF91ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzkxaWdPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzkxaWdlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzkxaWd1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzkxaWctZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzkxaWhPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5MWloZWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzlyeDl1ZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzlyeDktZlhFZHVxSG9PSmJVUlpSdyIgeD0iNjkxMyIgeT0iNTYyMSIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTERpYWdyYW1TdHlsZSIgeG1pOmlkPSJfR212UkplZlhFZHVxSG9PSmJVUlpSdyIgZGVzY3JpcHRpb249IlRoaXMgZGlhZ3JhbSBzaG93cyBob3cgdGhlIGNhdGVnb3J5IGRpc2NpcGxpbmUgaGFzIGJlZW4gZXh0ZW5kZWQgaW4gdGhpcyBwYWNrYWdlIHdpdGggYW4gYWRkaXRvbmFsIGFzc29jYXRpb24gdG8gQWN0aXZpdHkgcHJvdmlkaW5nIHN0YW5kYXJkIG9yIHJlZmVyZW5jZSB3YXlzIG9mIGRvaW5nIHRoZSB3b3JrIGRlc2NyaWJlZCBieSB0aGUgRGlzY2lwbGluZS4iLz4NCi0gICAgICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HOXJ4c09mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFMEZFRDYwMkFFIiBzb3VyY2U9Il9HOXJ4a09mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HOXJ4b09mWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5cnhzLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5cnh0ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlyeHR1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HOXJ4dE9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HOXJ4c2VmWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c5cnhzdWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzAsIC00NTcsIDAsIDEzNzFdJFswLCAtMTM4MCwgMCwgNDQ4XSIvPg0KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzlyeHQtZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HOXJ4dU9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzlyeDB1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMTI0QzNBMDI0RSIgc291cmNlPSJfRzlyeHVlZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzlyeG9PZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOXJ4MWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOXJ4MS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5cngyT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzlyeDF1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlyeDJlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMTI0QzNCMDEzNyI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5cngyLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOXJ4MnVmWEVkdXFIb09KYlVSWlJ3IiB4PSI0NiIgeT0iMzA0Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOXJ4M09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjEyNEMzQjAxMzciPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOXJ4M3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c5cngzZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0zOTciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5cngzLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMTI0QzNCMDEwRiI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5cng0ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c5cng0T2ZYRWR1cUhvT0piVVJaUnciIHg9IjEzIiB5PSIyOTYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5cng0dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjEyNEMzQjAxMEYiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOXJ4NU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzlyeDQtZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTExNTUiIHk9Ii0yMjEiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5cng1ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjEyNEMzQjAxMzciPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOXJ4NS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlyeDZPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOXJ4NXVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOXJ4NmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjEyNEMzQjAxMEYiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOXJ4Ni1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlyeDdPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOXJ4NnVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOXJ4N2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMTI0QzNCMDEzNyI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5cng3LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOXJ4OE9mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c5cng3dWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5cng4ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjEyNEMzQjAxMEYiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOXJ4OC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOXJ4OU9mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c5cng4dWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c5cngwLWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c5cngxT2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzkzMSwgLTI1LCAtNTY3MiwgNzZdJFs1ODE2LCAtMjUsIC03ODcsIDc2XSIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HOTFpaHVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjhEIiBzb3VyY2U9Il9HOXJ4OWVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HOXJ4a09mWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5MWlpZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5MWlpLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzkxaWpPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HOTFpaXVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HOTFpaC1mWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c5MWlpT2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzAsIC00NTcsIDAsIDE2NzZdJFswLCAtMTY4NCwgMCwgNDQ4XSIvPg0KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzkxaWplZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HOTFpanVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgPC9jb250ZW50cz4NCi0gICAgICAgICAgICA8Y29udGVudHMgeG1pOnR5cGU9Im5vdGF0aW9uOkRpYWdyYW0iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyODNDRTlGMDI5MSIgdHlwZT0iQ2xhc3MiIG5hbWU9IlByb2Nlc3NXb3JrRGVmaW5pdGlvbiI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzkxaXFPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E5MjU0MDIyNyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOTFpcS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzkxaXJPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjQyNjciIGhlaWdodD0iMTAzMiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzkxaXJlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzkxaXJ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzkxaXItZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOTFpc09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOTFpc2VmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOTFpc3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOTFpcy1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOTFpdE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOTFpdGVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOTFpdHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzkxaXQtZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HOTFpcWVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HOTFpcXVmWEVkdXFIb09KYlVSWlJ3IiB4PSI1MTMwIiB5PSIzMzQ0Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5MWl1T2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RDAzQ0EiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzkxaXUtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c5MWl2T2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIyMzE5IiBoZWlnaHQ9IjEwMzIiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5MWl2ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5MWl2dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5MWl2LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzkxaXdPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzkxaXdlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzkxaXd1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzkxaXctZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzkxaXhPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzkxaXhlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzkxaXh1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5MWl4LWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzkxaXVlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzkxaXV1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMjg1MyIgeT0iNzYwOCIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOTFpeU9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUQwM0NCIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5MWl5LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HOTFpek9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMjMxOSIgaGVpZ2h0PSIxMDMyIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOTFpemVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOTFpenVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOTFpei1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5MWkwT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5MWkwZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5MWkwdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5MWkwLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5MWkxT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5MWkxZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5MWkxdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOTFpMS1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c5MWl5ZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c5MWl5dWZYRWR1cUhvT0piVVJaUnciIHg9IjMxNyIgeT0iNzYwOCIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOTFpMk9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDA5Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5MWkyLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HOTFpM09mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMjcyNiIgaGVpZ2h0PSIxMDMyIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOTFpM2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOTFpM3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOTFpMy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5MWk0T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5MWk0ZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5MWk0dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5MWk0LWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5MWk1T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5MWk1ZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5MWk1dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOTFpNS1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c5MWkyZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c5MWkydWZYRWR1cUhvT0piVVJaUnciIHg9IjU5MDEiIHk9IjU2MzAiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlfVGllZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E4MkQzMDE3RiI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOV9Uak9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzlfVGplZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjM2OTEiIGhlaWdodD0iMTAzMiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlfVGp1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlfVGotZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlfVGtPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOV9Ua2VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOV9Ua3VmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOV9Uay1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOV9UbE9mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOV9UbGVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOV9UbHVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOV9UbC1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlfVG1PZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HOV9UaXVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIxMjYzMjI1NiIgc2hvd1BhcmVudD0iTmFtZSIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzlfVGktZlhFZHVxSG9PSmJVUlpSdyIgeD0iMjg1MyIgeT0iMTI2OCIgaGVpZ2h0PSIxMzc1Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5X1RtZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBODU3QjAzMzMiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlfVG5PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c5X1RuZWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIyNzk0IiBoZWlnaHQ9IjEwMzIiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5X1RudWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5X1RuLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5X1RvT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlfVG9lZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlfVG91ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlfVG8tZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlfVHBPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlfVHBlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlfVHB1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlfVHAtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5X1RxT2ZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzlfVG11ZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMTI2MzIyNTYiIHNob3dQYXJlbnQ9Ik5hbWUiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c5X1RtLWZYRWR1cUhvT0piVVJaUnciIHg9IjEwNzc4IiB5PSIxMjY4IiBoZWlnaHQ9IjEzMjIiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlfVDctZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRTBGRTkzMDA3NyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOV9UOHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzlfVDgtZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjE1OTEiIGhlaWdodD0iOTA1Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOV9UOU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOV9UOWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOV9UOXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5X1Q5LWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5X1QtT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5X1QtZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5X1QtdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5X1QtLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5X1RfT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5X1RfZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOV9UX3VmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c5X1Q4T2ZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dQYXJlbnQ9Ik5hbWUiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c5X1Q4ZWZYRWR1cUhvT0piVVJaUnciIHg9IjUzODkiIHk9IjY5NzQiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlfVF8tZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDBEQyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOV9VQXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzlfVUEtZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjMxMTUiIGhlaWdodD0iOTA1Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOV9VQk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOV9VQmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOV9VQnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5X1VCLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5X1VDT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5X1VDZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5X1VDdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5X1VDLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5X1VET2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5X1VEZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOV9VRHVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c5X1VBT2ZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c5X1VBZWZYRWR1cUhvT0piVVJaUnciIHg9Ijc5MjUiIHk9IjEwMTQ0Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5X1VELWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwOUYiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlfVUV1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c5X1VFLWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxNzI3IiBoZWlnaHQ9IjkwNSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlfVUZPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlfVUZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlfVUZ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOV9VRi1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOV9VR09mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOV9VR2VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOV9VR3VmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOV9VRy1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOV9VSE9mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOV9VSGVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlfVUh1ZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HOV9VRU9mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HOV9VRWVmWEVkdXFIb09KYlVSWlJ3IiB4PSI2NjU3IiB5PSI4NTU5Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5X1VLT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwNzciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1JZGNPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0ctSWRjZWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIyODQ0IiBoZWlnaHQ9IjkwNSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1JZGN1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1JZGMtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1JZGRPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLUlkZGVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLUlkZHVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLUlkZC1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLUlkZU9mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLUlkZWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLUlkZXVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLUlkZS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy1JZGZPZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HOV9VS2VmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HOV9VS3VmWEVkdXFIb09KYlVSWlJ3IiB4PSI0MDY0IiB5PSIxMDIxOSIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLUlkai1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUQwM0QzIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctSWRrdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HLUlkay1mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMjMxOSIgaGVpZ2h0PSIxMDMyIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLUlkbE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLUlkbGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLUlkbHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctSWRsLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctSWRtT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctSWRtZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctSWRtdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctSWRtLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctSWRuT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctSWRuZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLUlkbnVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0ctSWRrT2ZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dQYXJlbnQ9Ik5hbWUiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0ctSWRrZWZYRWR1cUhvT0piVVJaUnciIHg9IjI1MzYiIHk9IjQ0MzgiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1JZHFPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDBFRiI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLUlkcS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRy1JZHJPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjMzODYiIGhlaWdodD0iMTAzMiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1JZHJlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1JZHJ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1JZHItZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLUlkc09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLUlkc2VmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLUlkc3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLUlkcy1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLUlkdE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLUlkdGVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLUlkdHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy1JZHQtZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HLUlkcWVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HLUlkcXVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxMDY1MSIgeT0iMzM0NCIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLUlkM09mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDMxIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctSWQzLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HLUlkNE9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMjMxOSIgaGVpZ2h0PSIxMDMyIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLUlkNGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLUlkNHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLUlkNC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctSWQ1T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctSWQ1ZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctSWQ1dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctSWQ1LWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctSWQ2T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctSWQ2ZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctSWQ2dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLUlkNi1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0ctSWQzZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0ctSWQzdWZYRWR1cUhvT0piVVJaUnciIHg9IjkxOTMiIHk9IjU2MzAiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxEaWFncmFtU3R5bGUiIHhtaTppZD0iX0dtdlJKLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HOV9UZ09mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTkyM0IwMDAyIiBzb3VyY2U9Il9HOTFpMk9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HOTFpcU9mWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5X1RnLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5X1RoZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlfVGh1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HOV9UaE9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HOV9UZ2VmWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c5X1RndWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzAsIC01MjQsIDAsIDE3NjFdJFswLCAtMTc2OSwgMCwgNTE2XSIvPg0KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzlfVGgtZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HOV9UaU9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzlfVHFlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E4N0U5MDA2MSIgc291cmNlPSJfRzlfVGllZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzlfVG1lZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOV9Uck9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOV9UcnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5X1RyLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzlfVHJlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlfVHNPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBODdFOTAyRDkiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOV9Uc3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzlfVHNlZlhFZHVxSG9PSmJVUlpSdyIgeT0iMzk2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOV9Ucy1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBODdFOTAyRDkiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOV9UdGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c5X1R0T2ZYRWR1cUhvT0piVVJaUnciIHg9Ii0yMDIiIHk9Ii0zNDciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5X1R0dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E4N0U5MDJDRiI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5X1R1T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c5X1R0LWZYRWR1cUhvT0piVVJaUnciIHg9Ii0zOCIgeT0iMjU5Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOV9UdWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTg3RTkwMkNGIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlfVHUtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c5X1R1dWZYRWR1cUhvT0piVVJaUnciIHg9Ii01NzgiIHk9Ii0xNzUiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5X1R2T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBODdFOTAyRDkiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOV9UdnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlfVHYtZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOV9UdmVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOV9Ud09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBODdFOTAyQ0YiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOV9Ud3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlfVHctZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOV9Ud2VmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOV9UeE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E4N0U5MDJEOSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5X1R4dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOV9UeC1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c5X1R4ZWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5X1R5T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBODdFOTAyQ0YiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOV9UeXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOV9UeS1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c5X1R5ZWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c5X1RxdWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjEyNjMyMjU2IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HOV9UcS1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlsyMDkwLCA2MDksIC01MzQ1LCA2MzVdJFs1ODIxLCA2MDksIC0xNjE0LCA2MzVdIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c5X1R6T2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBODgzNDAxMTAiIHNvdXJjZT0iX0c5X1RpZWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c5X1RtZWZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlfVHotZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlfVDBlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOV9UMHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c5X1QwT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5X1QwLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTg4MzQwMkU4Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlfVDFlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c5X1QxT2ZYRWR1cUhvT0piVVJaUnciIHk9IjM5NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlfVDF1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTg4MzQwMkU4Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlfVDJPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOV9UMS1mWEVkdXFIb09KYlVSWlJ3IiB4PSItMjAyIiB5PSItMzQ4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOV9UMmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBODgzNDAyREUiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOV9UMi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOV9UMnVmWEVkdXFIb09KYlVSWlJ3IiB4PSItOTAiIHk9IjE1NyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlfVDNPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E4ODM0MDJERSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5X1QzdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOV9UM2VmWEVkdXFIb09KYlVSWlJ3IiB4PSItNzg4IiB5PSItMTcwIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOV9UMy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTg4MzQwMkU4Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlfVDRlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5X1Q0dWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzlfVDRPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlfVDQtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTg4MzQwMkRFIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlfVDVlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5X1Q1dWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzlfVDVPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlfVDUtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBODgzNDAyRTgiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOV9UNmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlfVDZ1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOV9UNk9mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOV9UNi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTg4MzQwMkRFIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlfVDdlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlfVDd1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOV9UN09mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HOV9UemVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIxMjYzMjI1NiIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzlfVHp1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMTg0NSwgLTM4OSwgLTU2MjEsIC0zODldJFs2MDcwLCAtMzg5LCAtMTM5NywgLTM4OV0iLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzlfVUgtZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRTBGRUQ2MDJBRSIgc291cmNlPSJfRzlfVUQtZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzlfVDctZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOV9VSXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOV9VSk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5X1VKZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzlfVUktZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzlfVUlPZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HOV9VSWVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstNTUwLCAtNDU3LCAyMTQyLCAxNzc4XSRbLTIxNTAsIC0xNzg2LCA1NDEsIDQ0OF0iLz4NCi0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c5X1VKdWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzlfVUotZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0ctSWRmZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxMTAiIHNvdXJjZT0iX0c5X1VLT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c5X1VELWZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1JZGdPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1JZGd1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLUlkZy1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0ctSWRnZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0ctSWRmdWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRy1JZGYtZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMzMwLCAtNDU3LCAtMTM5NywgMTgyOF0kWzEzNzEsIC0xODM3LCAtMzU1LCA0NDhdIi8+DQotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HLUlkaE9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0ctSWRoZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HLUlkaHVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjhEIiBzb3VyY2U9Il9HOV9UXy1mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HOV9VRC1mWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctSWRpZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctSWRpLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1JZGpPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HLUlkaXVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HLUlkaC1mWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0ctSWRpT2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0yODcsIC00NTcsIDExMzQsIDE4MjhdJFstMTE1MSwgLTE4MzcsIDI3MCwgNDQ4XSIvPg0KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRy1JZGplZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HLUlkanVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRy1JZG4tZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDJBMCIgc291cmNlPSJfRzkxaXlPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRy1JZGotZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLUlkb3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLUlkcE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctSWRwZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRy1JZG8tZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRy1JZG9PZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HLUlkb2VmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9Ils1OTIsIC01MjQsIC0yMDk5LCAxODExXSRbMjA4MiwgLTE4MjAsIC02MDksIDUxNl0iLz4NCi0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0ctSWRwdWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRy1JZHAtZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0ctSWR1T2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjhDRDMyMzAxOUEiIHNvdXJjZT0iX0c5MWlxT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0ctSWRxT2ZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1JZHUtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1JZHZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLUlkdnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0ctSWR2T2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0ctSWR1ZWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRy1JZHV1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMjEzMywgMCwgLTI5NDYsIDBdJFszMzc4LCAwLCAtMTcwMSwgMF0iLz4NCi0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0ctSWR2LWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRy1JZHdPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0ctSWR3ZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAyOUYiIHNvdXJjZT0iX0c5MWl1T2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0ctSWRqLWZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1JZHhPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1JZHh1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLUlkeC1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0ctSWR4ZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0ctSWR3dWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0ctSWR3LWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0xMzUsIC01MTYsIC04NCwgMTgyMF0kWy0xMzUsIC0xODIwLCAtODQsIDUxNl0iLz4NCi0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0ctSWR5T2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRy1JZHllZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0ctSWR5dWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBOTI4MjAzOTIiIHNvdXJjZT0iX0ctSWRqLWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c5MWlxT2ZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1JZHplZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1JZHotZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLUlkME9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0ctSWR6dWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0ctSWR5LWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRy1JZHpPZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbNjYwLCAtNTI0LCAtMjIzNSwgMTcxMF0kWzIyMDksIC0xNzE4LCAtNjg1LCA1MTZdIi8+DQotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HLUlkMGVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0ctSWQwdWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HLUlkMC1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI4Q0QzMjkwMUZEIiBzb3VyY2U9Il9HLUlkai1mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HOV9UaWVmWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctSWQxdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctSWQyT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1JZDJlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HLUlkMS1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HLUlkMU9mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HLUlkMWVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMzIxLCAtNTE2LCAtNzI4LCAzNTQ3XSRbLTMyMSwgLTM1NDcsIC03MjgsIDUxNl0iLz4NCi0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0ctSWQydWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRy1JZDItZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0ctSWQ3T2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MkIxRUMxQjAzNDkiIHNvdXJjZT0iX0ctSWQzT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c5MWlxT2ZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1JZDctZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1JZDhlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLUlkOHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0ctSWQ4T2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0ctSWQ3ZWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRy1JZDd1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTY0MywgLTUyNCwgMjE1MCwgMTc2MV0kWy0yMTY3LCAtMTc2OSwgNjI2LCA1MTZdIi8+DQotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HLUlkOC1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0ctSWQ5T2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICA8L2NvbnRlbnRzPg0KLSAgICAgICAgICAgIDxjb250ZW50cyB4bWk6dHlwZT0ibm90YXRpb246RGlhZ3JhbSIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDJEREU4RjIwMTI1IiB0eXBlPSJDbGFzcyIgbmFtZT0iV29ya0RlZmluaXRpb25UYXhvbm9teSI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1TT2NPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E4MkQzMDE3RiI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLVNPYy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRy1TT2RPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjM2OTEiIGhlaWdodD0iMTAzMiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1TT2RlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1TT2R1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1TT2QtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLVNPZU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLVNPZWVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLVNPZXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLVNPZS1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLVNPZk9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLVNPZmVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLVNPZnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy1TT2YtZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HLVNPY2VmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93UGFyZW50PSJOYW1lIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HLVNPY3VmWEVkdXFIb09KYlVSWlJ3IiB4PSI4ODIyIiB5PSIxMDA3Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctU09nT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RDAzRDMiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1TT2ctZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0ctU09oT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIyMzE5IiBoZWlnaHQ9IjEwMzIiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctU09oZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctU09odWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctU09oLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1TT2lPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy1TT2llZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1TT2l1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy1TT2ktZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1TT2pPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy1TT2plZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1TT2p1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctU09qLWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRy1TT2dlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1BhcmVudD0iTmFtZSIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRy1TT2d1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMjc1MSIgeT0iMjg4NyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLVNPbWVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3OTRBNjYwMzY4Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctU09uT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HLVNPbmVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMzY5MSIgaGVpZ2h0PSIxMDMyIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLVNPbnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLVNPbi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLVNPb09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctU09vZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctU09vdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctU09vLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctU09wT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctU09wZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctU09wdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctU09wLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLVNPcU9mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0ctU09tdWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dQYXJlbnQ9Ik5hbWUiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0ctU09tLWZYRWR1cUhvT0piVVJaUnciIHg9IjkwMDYiIHk9IjQ3NTUiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1TT3N1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI5RSI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLVNPdGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRy1TT3R1ZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjM2OTEiIGhlaWdodD0iMTAzMiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1TT3QtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1TT3VPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1TT3VlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLVNPdXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLVNPdS1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLVNPdk9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLVNPdmVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLVNPdnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLVNPdi1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLVNPd09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy1TT3dlZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HLVNPcy1mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93UGFyZW50PSJOYW1lIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HLVNPdE9mWEVkdXFIb09KYlVSWlJ3IiB4PSIxNTQyOSIgeT0iNDc1NSIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLVNPN3VmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDA5Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctU084ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HLVNPOHVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMjcyNiIgaGVpZ2h0PSIxMDMyIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLVNPOC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLVNPOU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLVNPOWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctU085dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctU085LWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctU08tT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctU08tZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctU08tdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctU08tLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctU09fT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLVNPX2VmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0ctU083LWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dQYXJlbnQ9Ik5hbWUiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0ctU084T2ZYRWR1cUhvT0piVVJaUnciIHg9IjE2MzAyIiB5PSI3MDc5Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctYllkLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUUwRkU5MzAwNzciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1iWWV1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0ctYlllLWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxNTc0IiBoZWlnaHQ9IjkwNSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1iWWZPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1iWWZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1iWWZ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWJZZi1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLWJZZ09mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWJZZ2VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLWJZZ3VmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWJZZy1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLWJZaE9mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWJZaGVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy1iWWh1ZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HLWJZZU9mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93UGFyZW50PSJOYW1lIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HLWJZZWVmWEVkdXFIb09KYlVSWlJ3IiB4PSItNjM0IiB5PSI0NzU1Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctYllrT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwOUYiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1iWWstZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0ctYllsT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxNzI3IiBoZWlnaHQ9IjkwNSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1iWWxlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1iWWx1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1iWWwtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWJZbU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLWJZbWVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWJZbXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLWJZbS1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWJZbk9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLWJZbmVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWJZbnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy1iWW4tZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HLWJZa2VmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93UGFyZW50PSJOYW1lIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HLWJZa3VmWEVkdXFIb09KYlVSWlJ3IiB4PSItNTU2IiB5PSI2NjU3Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctYllxZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RDAzQ0IiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1iWXJPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0ctYllyZWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIyMzE5IiBoZWlnaHQ9IjEwMzIiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctYllydWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctYllyLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctYllzT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1iWXNlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy1iWXN1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1iWXMtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy1iWXRPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1iWXRlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy1iWXR1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1iWXQtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctYll1T2ZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRy1iWXF1ZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1BhcmVudD0iTmFtZSIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRy1iWXEtZlhFZHVxSG9PSmJVUlpSdyIgeD0iMjc1MSIgeT0iNDc1NSIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWJZd3VmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUQwM0NBIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctYll4ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HLWJZeHVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMjMxOSIgaGVpZ2h0PSIxMDMyIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWJZeC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWJZeU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWJZeWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctYll5dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctYll5LWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctYll6T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctYll6ZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctYll6dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctYll6LWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctYlkwT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLWJZMGVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0ctYll3LWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dQYXJlbnQ9Ik5hbWUiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0ctYll4T2ZYRWR1cUhvT0piVVJaUnciIHg9IjU2OTgiIHk9IjQ3NTUiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxEaWFncmFtU3R5bGUiIHhtaTppZD0iX0dtNUNJZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HLVNPa09mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI4Q0QzMjkwMUZEIiBzb3VyY2U9Il9HLVNPZ09mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HLVNPY09mWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctU09rLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctU09sZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1TT2x1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HLVNPbE9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HLVNPa2VmWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0ctU09rdWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzExNTksIC0zMzgsIC01NTk2LCAxNTQwXSRbNDkwMiwgLTEzNzEsIC0xODU0LCA1MDhdIi8+DQotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HLVNPbC1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0ctU09tT2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HLVNPcWVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTgzMjMwMEZFIiBzb3VyY2U9Il9HLVNPbWVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HLVNPY09mWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctU09yT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctU09ydWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1TT3ItZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HLVNPcmVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HLVNPcXVmWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0ctU09xLWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzAsIC01MjQsIDAsIDMyMzRdJFswLCAtMzI0MiwgMCwgNTE2XSIvPg0KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRy1TT3NPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HLVNPc2VmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRy1TT3d1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E4MzE4MDBCOCIgc291cmNlPSJfRy1TT3N1ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRy1TT2NPZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLVNPeGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLVNPeC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctU095T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRy1TT3h1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRy1TT3ctZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HLVNPeE9mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstNzQ1LCAtNTI0LCA0NzQxLCAzMjg1XSRbLTQ3NDEsIC0zMjkzLCA3NDUsIDUxNl0iLz4NCi0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0ctU095ZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRy1TT3l1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0ctU095LWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjc5NjJEMzAwM0YiIHNvdXJjZT0iX0ctU09zdWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0ctU09tZWZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1TT3p1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1TTzBPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLVNPMGVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0ctU096LWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctU08wdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3OTYyRDQwMjBFIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1TTzFPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0ctU08wLWZYRWR1cUhvT0piVVJaUnciIHk9IjM5NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1TTzFlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3OTYyRDQwMjBFIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1TTzEtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HLVNPMXVmWEVkdXFIb09KYlVSWlJ3IiB4PSItODAiIHk9IjM0NSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1TTzJPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3OTYyRDQwMjAzIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1TTzJ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRy1TTzJlZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTI3NiIgeT0iLTI5OSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1TTzItZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyNzk2MkQ0MDIwMyI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctU08zZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HLVNPM09mWEVkdXFIb09KYlVSWlJ3IiB4PSItNTE3IiB5PSIyMzUiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctU08zdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjc5NjJENDAyMEUiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLVNPNE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy1TTzRlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HLVNPMy1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLVNPNHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjc5NjJENDAyMDMiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLVNPNU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy1TTzVlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HLVNPNC1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLVNPNXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyNzk2MkQ0MDIwRSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctU082T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLVNPNmVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0ctU081LWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctU082dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjc5NjJENDAyMDMiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLVNPN09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLVNPN2VmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0ctU082LWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0ctU096T2ZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRy1TT3plZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTE4NTQsIC0yNSwgMzYzMiwgMjVdJFstMzY0MCwgLTQyLCAxODQ1LCA4XSIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HLVNPX3VmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzBEIiBzb3VyY2U9Il9HLVNPc3VmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HLVNPN3VmWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctU1BBZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctU1BBLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1TUEJPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HLVNQQXVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLVNQQmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzEwIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1TUEItZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0ctU1BCdWZYRWR1cUhvT0piVVJaUnciIHg9IjI2OCIgeT0iMzk4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLVNQQ09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzMTAiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWJZWU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0ctU1BDZWZYRWR1cUhvT0piVVJaUnciIHg9Ii01MyIgeT0iLTM1NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1iWVllZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzBFIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1iWVktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRy1iWVl1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTEzIiB5PSIyMjAiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctYllaT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzBFIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1iWVp1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0ctYllaZWZYRWR1cUhvT0piVVJaUnciIHg9IjM4IiB5PSItMzU2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWJZWi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzEwIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1iWWFlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctYllhdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRy1iWWFPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1iWWEtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzBFIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1iWWJlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctYllidWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRy1iWWJPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1iWWItZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzMTAiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWJZY2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy1iWWN1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HLWJZY09mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWJZYy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzBFIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1iWWRlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy1iWWR1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HLWJZZE9mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HLVNPXy1mWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0ctU1BBT2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzAsIDUxNiwgMCwgLTE2NjddJFswLCAxNjU5LCAwLCAtNTI0XSIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HLWJZb09mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFMEZFRDYwMkFFIiBzb3VyY2U9Il9HLWJZa09mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HLWJZZC1mWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctYllvLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctYllwZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1iWXB1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HLWJZcE9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HLWJZb2VmWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0ctYllvdWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzAsIC00NTcsIDAsIDE0MjJdJFswLCAtMTQzMCwgMCwgNDQ4XSIvPg0KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRy1iWXAtZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HLWJZcU9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRy1iWXVlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDJBMCIgc291cmNlPSJfRy1iWXFlZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRy1TT2dPZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWJZdk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWJZdnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctYll2LWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRy1iWXZlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRy1iWXV1ZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HLWJZdS1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlswLCAtNTI0LCAwLCAxMzU0XSRbMCwgLTEzNjMsIDAsIDUxNl0iLz4NCi0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0ctYll3T2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRy1iWXdlZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0ctYlkwdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAyOUYiIHNvdXJjZT0iX0ctYll3dWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0ctU09nT2ZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1iWTFlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1iWTEtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWJZMk9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0ctYlkxdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0ctYlkwLWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRy1iWTFPZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTgxMiwgLTUyNCwgMjEzMywgMTM1NF0kWy0yMTQyLCAtMTM2MywgODA0LCA1MTZdIi8+DQotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HLWJZMmVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0ctYlkydWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICA8L2NvbnRlbnRzPg0KLSAgICAgICAgICA8L2VBbm5vdGF0aW9ucz4NCi0gICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HbGktV2VmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGRDg5MUYwMkNEIj4NCi0gICAgICAgICAgICA8Ym9keT4wMjwvYm9keT4NCi0gICAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgICAgIDxwYWNrYWdlTWVyZ2UgeG1pOmlkPSJfRm9QV0VPeE1FZHVPTnJNUmdtejQ4QSIgbWVyZ2VkUGFja2FnZT0iXzNBREM3Qjc0MDIyRDQwRkQ4NTQ2MDBEOCIvPg0KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDA3NyIgbmFtZT0iRGVsaXZlcnlQcm9jZXNzIj4NCi0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dsc3ZWLWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwNzciPg0KLSAgICAgICAgICAgICAgPGJvZHk+QSBEZWxpdmVyeSBQcm9jZXNzZXMgaXMgYSBzcGVjaWFsIFByb2Nlc3MgZGVzY3JpYmluZyBhIGNvbXBsZXRlIGFuZCBpbnRlZ3JhdGVkIGFwcHJvYWNoIGZvciBwZXJmb3JtaW5nIGEgc3BlY2lmaWMgcHJvamVjdCB0eXBlLiAgSXQgZGVzY3JpYmVzIGEgY29tcGxldGUgcHJvamVjdCBsaWZlY3ljbGUgZW5kLXRvLWVuZCBhbmQgc2hhbGwgYmUgdXNlZCBhcyBhIHJlZmVyZW5jZSBmb3IgcnVubmluZyBwcm9qZWN0cyB3aXRoIHNpbWlsYXIgY2hhcmFjdGVyaXN0aWNzIGFzIGRlZmluZWQgZm9yIHRoZSBwcm9jZXNzLiAgQSBEZWxpdmVyeSBQcm9jZXNzIGlzIHJlbGF0ZWQgdG8gc3BlY2lmaWMgc3VwcG9ydGluZyBpbmZvcm1hdGlvbiBzdWNoIGFzIFJvYWRtYXBzIChpbmhlcml0ZWQgdmlhIEFjdGl2aXR5KSBhcyB3ZWxsIGFzIENvbW11bmljYXRpb25zIGFuZCBFZHVjYXRpb24gTWF0ZXJpYWwuDQotQSBEZWxpdmVyeSBQcm9jZXNzIGlzIGEgUHJvY2VzcyB0aGF0IGNvdmVycyBhIHdob2xlIGRldmVsb3BtZW50IGxpZmVjeWNsZSBmcm9tIGJlZ2lubmluZyB0byBlbmQuICBBIERlbGl2ZXJ5IFByb2Nlc3Mgc2hhbGwgYmUgdXNlZCBhcyBhIHRlbXBsYXRlIGZvciBwbGFubmluZyBhbmQgcnVubmluZyBhIHByb2plY3QuICBJdCBwcm92aWRlcyBhIGNvbXBsZXRlIGxpZmVjeWNsZSBtb2RlbCB3aXRoIHByZWRlZmluZWQgcGhhc2VzLCBpdGVyYXRpb25zLCBhbmQgYWN0aXZpdGllcyB0aGF0IGhhdmUgYmVlbiBkZXRhaWxlZCBieSBzZXF1ZW5jaW5nIHJlZmVyZW5jaW5nIG1ldGhvZCBjb250ZW50IGluIGJyZWFrZG93biBzdHJ1Y3R1cmVzLiAgSXQgaXMgZGVmaW5lZCBvbiB0aGUgYmFzaXMgb2YgZXhwZXJpZW5jZSB3aXRoIHBhc3QgcHJvamVjdHMgb3IgZW5nYWdlbWVudHMsIGFuZC9vciB0aGUgYmVzdCBwcmFjdGljZSB1c2Ugb2YgYSBkZXZlbG9wbWVudCBvciBkZWxpdmVyeSBhcHByb2FjaC4gIEl0IGRlZmluZXMgd2hhdCBnZXRzIHByb2R1Y2VkLCBob3cgdGhvc2UgaXRlbXMgYXJlIHByb2R1Y2VkLCBhbmQgdGhlIHJlcXVpcmVkIHN0YWZmaW5nIGluIHRoZSBmb3JtIG9mIGludGVncmF0ZWQgV29yaywgV29yayBQcm9kdWN0LCBhbmQgVGVhbSBCcmVha2Rvd24gU3RydWN0dXJlcy4gIEZvciBleGFtcGxlLCBhIHByb2Nlc3MgZW5naW5lZXIgY2FuIGRlZmluZSBhbHRlcm5hdGl2ZSBEZWxpdmVyeSBQcm9jZXNzZXMgZm9yIHNvZnR3YXJlIGRldmVsb3BtZW50IHByb2plY3RzIHRoYXQgZGlmZmVyIGluIHRoZSBzY2FsZSBvZiB0aGUgZW5nYWdlbWVudCBhbmQgc3RhZmZpbmcgbmVjZXNzYXJ5LCB0aGUgdHlwZSBvZiB0aGUgc29mdHdhcmUgYXBwbGljYXRpb24gdG8gYmUgZGV2ZWxvcGVkLCB0aGUgZGV2ZWxvcG1lbnQgbWV0aG9kcyBhbmQgdGVjaG5vbG9naWVzIHRvIGJlIHVzZWQsIGV0Yy4gIEFsdGhvdWdoLCB0aGUgRGVsaXZlcnkgUHJvY2VzcyBhaW1zIHRvIGNvdmVyIGEgd2hvbGUgcHJvamVjdCBpdCBrZWVwcyBjZXJ0YWluIGRlY2lzaW9uIHRoYXQgYXJlIHRvbyBwcm9qZWN0IHNwZWNpZmljIG9wZW4uICBGb3IgZXhhbXBsZSwgdGhlIGJyZWFrZG93biBzdHJ1Y3R1cmUgZGVmaW5lcyB3aGljaCBCcmVha2Rvd24gRWxlbWVudHMgaGF2ZSBtdWx0aXBsZSBvY2N1cnJlbmNlcyBvciBpcyByZXBlYXRhYmxlIHZpYSBpdCByZXNwZWN0aXZlIGF0dHJpYnV0ZXMsIGJ1dCBkb2VzIG5vdCBzYXkgaG93IG1hbnkgb2NjdXJyZW5jZXMgYW5kIGhvdyBtYW55IHJlcGVhdHMvaXRlcmF0aW9ucyBpdCB3aWxsIGhhdmUuICBUaGVzZSBkZWNpc2lvbnMgaGF2ZSB0byBiZSBkb25lIGJ5IGEgcHJvamVjdCBtYW5hZ2VyIHdoZW4gcGxhbm5pbmcgYSBjb25jcmV0ZSBwcm9qZWN0LCBwcm9qZWN0IHBoYXNlLCBvciBwcm9qZWN0IGl0ZXJhdGlvbnMuICBBIERlbGl2ZXJ5IFByb2Nlc3MgaXMgYWx3YXlzIGEgY29tcGxldGUgZGVzY3JpcHRpb24gb2YgYSBwcm9jZXNzIGluIHRlcm1zIG9mIGNvbXBsZXRlbmVzcyBvZiB0aGUgbGlmZWN5Y2xlLCBhcyB3ZWxsIGFzIGluIHRlcm1zIG9mIGFsbCB0aHJlZSB2aWV3cyBvbiB0aGUgcHJvY2VzcyB3aGljaCBhcmUgdGhlIFdvcmsgQnJlYWtkb3duIFN0cnVjdHVyZSwgV29yayBQcm9kdWN0IEJyZWFrZG93biBTdHJ1Y3R1cmUsIGFuZCBUZWFtIEJyZWFrZG93biBTdHJ1Y3R1cmUgaGF2ZSB0byBiZSBmdWxseSBhbmQgY29uc2lzdGVudGx5IHBvcHVsYXRlZC4gIENvbnNpc3RlbmN5IG9mIGEgRGVsaXZlcnkgUHJvY2VzcyBpcyBhY3R1YWxseSBlbnN1cmVkIGJ5IHRoZSBmYWN0IHRoYXQgYWxsIHRocmVlIGJyZWFrZG93bnMgYXJlIHJlcHJlc2VudGVkIGJ5IG9uZSBzaW5nbGUgZGF0YSBzdHJ1Y3R1cmUgYW5kIG9uZSBwYXJ0aWN1bGFyIGJyZWFrZG93biBzdWNoIGFzIFRlYW0gQnJlYWtkb3duIGlzIGp1c3QgYSB2aWV3IG9uIHRoYXQgZGF0YSBzdHJ1Y3R1cmUuDQotPC9ib2R5Pg0KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxMTAiIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwOUYiLz4NCi0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTFEIiBuYW1lPSJlZHVjYXRpb25NYXRlcmlhbHMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDFDMSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxMUEiPg0KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR21KYlZ1ZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4NCi0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0dtSmJWZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxMzEiIG5hbWU9ImNvbW11bmljYXRpb25zTWF0ZXJpYWxzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxQzEiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTJFIj4NCi0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0dtU2xOdWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+DQotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HbVNsTmVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDlGIiBuYW1lPSJQcm9jZXNzIiBpc0Fic3RyYWN0PSJ0cnVlIj4NCi0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dsc3ZXLWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwOUYiPg0KLSAgICAgICAgICAgICAgPGJvZHk+QSBQcm9jZXNzIGlzIGEgc3BlY2lhbCBBY3Rpdml0eSB0aGF0IGRlc2NyaWJlcyBhIHN0cnVjdHVyZSBmb3IgcGFydGljdWxhciB0eXBlcyBvZiBkZXZlbG9wbWVudCBwcm9qZWN0cy4gIFRvIHBlcmZvcm0gc3VjaCBhIGRldmVsb3BtZW50IHByb2plY3QgYSBQcm9jZXNzZXMgd291bGQgYmUgJ2luc3RhbnRpYXRlZCcgYW5kIGFkYXB0ZWQgZm9yIHRoZSBzcGVjaWZpYyBzaXR1YXRpb24uICBQcm9jZXNzIGlzIGFuIGFic3RyYWN0IGNsYXNzIGFuZCB0aGlzIG1ldGEtbW9kZWwgZGVmaW5lcyBkaWZmZXJlbnQgc3BlY2lhbCB0eXBlcyBvZiBQcm9jZXNzZXMgZm9yIGRpZmZlcmVudCBwcm9jZXNzIG1hbmFnZW1lbnQgYXBwbGljYXRpb25zIGFuZCBkaWZmZXJlbnQgc2l0dWF0aW9ucyBvZiBwcm9jZXNzIHJldXNlLiAgRXZlcnkgUHJvY2VzcyBjb21wcmlzZXMgb2YgYW5kIGlzIHRoZSB0b3AtbGV2ZWwgZWxlbWVudCBvZiBhbiBuLWxldmVsIGJyZWFrZG93biBzdHJ1Y3R1cmUgdXNpbmcgdGhlIE5lc3RpbmcgYXNzb2NpYXRpb24gZGVmaW5lZCBvbiBBY3Rpdml0eS4NCi1Db3JlIE1ldGhvZCBDb250ZW50IHByb3ZpZGVzIHN0ZXAtYnktc3RlcCBleHBsYW5hdGlvbnMsIGRlc2NyaWJpbmcgaG93IHZlcnkgc3BlY2lmaWMgZGV2ZWxvcG1lbnQgZ29hbHMgYXJlIGFjaGlldmVkIGluZGVwZW5kZW50IG9mIHRoZSBwbGFjZW1lbnQgb2YgdGhlc2Ugc3RlcHMgd2l0aGluIGEgZGV2ZWxvcG1lbnQgbGlmZWN5Y2xlLiAgUHJvY2Vzc2VzIHRha2UgdGhlc2UgbWV0aG9kIGVsZW1lbnRzIGFuZCByZWxhdGUgdGhlbSBpbnRvIHNlbWktb3JkZXJlZCBzZXF1ZW5jZXMgdGhhdCBhcmUgY3VzdG9taXplZCB0byBzcGVjaWZpYyB0eXBlcyBvZiBwcm9qZWN0cy4gIFRodXMsIGEgcHJvY2VzcyBpcyBhIHNldCBvZiBwYXJ0aWFsbHkgb3JkZXJlZCB3b3JrIGRlc2NyaXB0aW9ucyBpbnRlbmRlZCB0byByZWFjaCBhIGhpZ2hlciBkZXZlbG9wbWVudCBnb2FsLCBzdWNoIGFzIHRoZSByZWxlYXNlIG9mIGEgc3BlY2lmaWMgc29mdHdhcmUgc3lzdGVtLiAgQSBwcm9jZXNzIGFuZCB0aGUgcHJvY2VzcyBtZXRhLW1vZGVsIHN0cnVjdHVyZSBkZWZpbmVkIGluIHRoaXMgc3BlY2lmaWNhdGlvbiBmb2N1c2VzIG9uIHRoZSBsaWZlY3ljbGUgYW5kIHRoZSBzZXF1ZW5jaW5nIG9mIHdvcmsgaW4gYnJlYWtkb3duIHN0cnVjdHVyZXMuICBUbyBhY2hpZXZlIHRoaXMgaXQgdXNlcyB0aGUgRGVzY3JpcHRvciBjb25jZXB0IHJlZmVyZW5jaW5nIG1ldGhvZCBjb250ZW50IGFuZCBhbGxvd2luZyBkZWZpbmluZyB0aW1lLXNwZWNpZmljIGN1c3RvbWl6YXRpb25zIG9mIHRoZSByZWZlcmVuY2VkIGNvbnRlbnQgKGUuZy4gZGVmaW5pbmcgYSBmb2N1cyBvbiBkaWZmZXJlbnQgc3RlcHMgb2YgdGhlIHNhbWUgVGFzayBhbmQgcHJvdmlkaW5nIGlucHV0IFdvcmsgUHJvZHVjdHMgaW4gZGlmZmVyZW50IHN0YXRlcyB3aXRoaW4gdGhlIGRpZmZlcmVudCBQaGFzZXMgb2YgYSBwcm9jZXNzIGxpZmVjeWNsZSBpbiB3aGljaCB0aGUgc2FtZSBUYXNrIGlzIHBlcmZvcm1lZCkuDQotPC9ib2R5Pg0KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MUUwRkVENjAyQUUiIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0MUUwRkU5MzAwNzciLz4NCi0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDExOUEzRjMwMUUyIiBuYW1lPSJpbmNsdWRlc1BhdHRlcm5zIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwREMiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDExOUEzRjIwMjM4Ij4NCi0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0dsX3FSLWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+DQotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HbF9xUnVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMEU1IiBuYW1lPSJQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSI+DQotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HbHN2WC1mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMEU1Ij4NCi0gICAgICAgICAgICAgIDxib2R5PkEgUHJvY2VzcyBQbGFubmluZyBUZW1wbGF0ZSBpcyBhIHNwZWNpYWwgUHJvY2VzcyB0aGF0IGlzIHByZXBhcmVkIGZvciBpbnN0YW50aWF0aW9uIGJ5IGEgcHJvamVjdCBwbGFubmluZyB0b29sLiAgVHlwaWNhbGx5LCBpdCBpcyBjcmVhdGVkIGJhc2VkIG9uIGEgUHJvY2VzcyBzdWNoIGFzIGEgRGVsaXZlcnkgUHJvY2VzcyBhcyBhIHdob2xlIChlLmcuIGluIGNhc2Ugb2YgYSB3YXRlcmZhbGwtYmFzZWQgZGV2ZWxvcG1lbnQgYXBwcm9hY2gpIG9yIGluIHBhcnRzIChlLmcuIGluIGNhc2Ugb2YgYW4gaXRlcmF0aXZlIGRldmVsb3BtZW50IGFwcHJvYWNoKS4NCi1BIFByb2Nlc3MgUGxhbm5pbmcgVGVtcGxhdGUgcmVwcmVzZW50cyBhIHBhcnRpYWxseSBmaW5pc2hlZCBwbGFuIGZvciBhIGNvbmNyZXRlIHByb2plY3QuICBJdCB1c2VzIHRoZSBzYW1lIGluZm9ybWF0aW9uIHN0cnVjdHVyZXMgYXMgYWxsIG90aGVyIFByb2Nlc3MgVHlwZXMgdG8gcmVwcmVzZW50IHRlbXBsYXRlcyBmb3IgcHJvamVjdCBwbGFucy4gIEhvd2V2ZXIsIGNlcnRhaW4gcGxhbm5pbmcgZGVjaXNpb25zIGhhdmUgYWxyZWFkeSBiZWVuIGFwcGxpZWQgdG8gdGhlIHRlbXBsYXRlIGFzIHdlbGwgYXMgaW5mb3JtYXRpb24gaGFzIGJlZW4gcmVtb3ZlZCBhbmQvb3IgcmVmb3JtYXR0ZWQgdG8gYmUgcmVhZHkgZm9yIGV4cG9ydCB0byBhIHNwZWNpZmljIHBsYW5uaW5nIHRvb2wuICBFeGFtcGxlcyBmb3Igc3VjaCBkZWNpc2lvbnMgYXJlOiBhIHRlbXBsYXRlIGhhcyBiZWVuIGNyZWF0ZWQgdG8gcmVwcmVzZW50IGEgcGxhbiBmb3IgYSBwYXJ0aWN1bGFyIEl0ZXJhdGlvbiBpbiBhbiBpdGVyYXRpdmUgZGV2ZWxvcG1lbnQgcHJvamVjdCwgd2hpY2ggZnIgZXhhbXBsZSBkaXN0aW5ndWlzaGVzIGVhcmx5IGZyb20gbGF0ZSBpdGVyYXRpb25zIGluIHRoZSBFbGFib3JhdGlvbiBwaGFzZSBvZiBhIHByb2plY3Q7IGlmIHRoZSB0YXJnZXRlZCBwbGFubmluZyB0b29sIGNhbm5vdCByZXByZXNlbnQgaW5wdXQgYW5kIG91dHB1dCBvZiBUYXNrLCB0aGVuIHRoZXNlIGhhdmUgYmVlbiByZW1vdmVkIGZyb20gdGhlIHN0cnVjdHVyZTsgY2VydGFpbiByZXBldGl0aW9ucyBoYXZlIGJlZW4gYWxyZWFkeSBhcHBsaWVkLCBlLmcuIHN0YXRpbmcgdGhhdCBhIGN5Y2xlIG9mIHNwZWNpZmljIFRhc2sgZ3JvdXBlZCBpbiBhbiBBY3Rpdml0eSBoYXZlIHRvIGJlIHJlcGVhdGVkIG4tdGltZXM7IGV0Yy4NCi08L2JvZHk+DQotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDI4RSIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDA5RiIvPg0KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTE5QTQwMTAwMTciIG5hbWU9ImJhc2VkT25Qcm9jZXNzZXMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDA5RiIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MTE5QTQwMDAwRTYiPg0KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR2xfcVVPZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4NCi0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0dsX3FULWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxQzIiIG5hbWU9IlJvYWRtYXAiPg0KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR2xzdlktZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDFDMiI+DQotICAgICAgICAgICAgICA8Ym9keT5BIFJvYWRtYXAgaXMgYSBzcGVjaWFsIEd1aWRhbmNlIFR5cGUgd2hpY2ggaXMgb25seSByZWxhdGVkIHRvIEFjdGl2YXRlcyBhbmQgdGhlcmVmb3JlIGhhcyBiZWVuIGFkZGVkIGJ5IHRoaXMgcGFja2FnZSB0byB0aGUgbGlzdCBvZiBHdWlkYW5jZSBUeXBlcyByYXRoZXIgdGhhbiBsaXN0ZWQgaW4gdGhlIEd1aWRhbmNlIFR5cGVzIHBhY2thZ2UuICBBIFJvYWRtYXAgcmVwcmVzZW50cyBhIGxpbmVhciB3YWxrdGhyb3VnaCBvZiBhbiBBY3Rpdml0eSwgdHlwaWNhbGx5IGEgUHJvY2Vzcy4NCi1BbiBpbnN0YW5jZSBvZiBhIFJvYWRtYXAgcmVwcmVzZW50cyBpbXBvcnRhbnQgZG9jdW1lbnRhdGlvbiBmb3IgdGhlIEFjdGl2aXR5IG9yIFByb2Nlc3MgaXQgaXMgcmVsYXRlZCB0by4gIE9mdGVuIGEgY29tcGxleCBBY3Rpdml0eSBzdWNoIGFzIGEgUHJvY2VzcyBjYW4gYmUgbXVjaCBlYXNpZXIgdW5kZXJzdG9vZCBieSBwcm92aWRpbmcgYSB3YWxrdGhyb3VnaCB3aXRoIGEgbGluZWFyIHRocmVhZCBvZiBhIHR5cGljYWwgaW5zdGFudGlhdGlvbiBvZiB0aGlzIEFjdGl2aXR5LiAgSW4gYWRkaXRpb24gdG8gbWFraW5nIHRoZSBwcm9jZXNzIHByYWN0aXRpb25lciB1bmRlcnN0YW5kIGhvdyB3b3JrIGluIHRoZSBwcm9jZXNzIGlzIGJlaW5nIHBlcmZvcm1lZCwgYSBSb2FkbWFwIHByb3ZpZGVzIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gYWJvdXQgaG93IEFjdGl2aXRpZXMgYW5kIFRhc2tzIHJlbGF0ZSB0byBlYWNoIG90aGVyIG92ZXIgdGltZS4gIFJvYWRtYXBzIGFyZSBhbHNvIHVzZWQgdG8gc2hvdyBob3cgc3BlY2lmaWMgYXNwZWN0cyBhcmUgZGlzdHJpYnV0ZWQgb3ZlciBhIHdob2xlIHByb2Nlc3MgcHJvdmlkaW5nIGEga2luZCBvZiBmaWx0ZXIgb24gdGhlIHByb2Nlc3MgZm9yIHRoaXMgaW5mb3JtYXRpb24uDQotPC9ib2R5Pg0KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MUUxMDU4MjAzN0MiIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyREEiLz4NCi0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDFFMEZFOTMwMDc3IiBuYW1lPSJBY3Rpdml0eSI+DQotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HbDE1US1mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFMEZFOTMwMDc3Ij4NCi0gICAgICAgICAgICAgIDxib2R5PlRoaXMgZGVmaW5pdGlvbiBvZiBBY3Rpdml0eSBleHRlbmRzIEFjdGl2aXR5IGludHJvZHVjZWQgaW4gdGhlIHBhY2thZ2UgQnJlYWtkb3duIHdpdGggbmV3IGNhcGFiaWxpdGllcyBhbmQgaXMgdGhlIGJhc2lzIGZvciB0aGUgZGVmaW5pdGlvbiBvZiB0aGUgY2xhc3MgUHJvY2Vzcy4NCi1FeHRlbmRzIEFjdGl2aXR5IHdpdGggYW4gYXNzb2NpYXRpb24gdG8gUm9hZG1hcC4gIFRoaXMgZGVmaW5pdGlvbiBvZiBBY3Rpdml0eSBhbHNvIHBhcnRpY2lwYXRlcyBpbiB0aGUgZXh0ZW5zaW9uIG9mIHRoZSBEaXNjaXBsaW5lIGNhdGVnb3J5Lg0KLTwvYm9keT4NCi0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfY1FzSEVNVThFZHkybXVRMlBRdkhfQSIgZ2VuZXJhbD0iX0c0MlJzTVU2RWR5Mm11UTJQUXZIX0EiLz4NCi0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGRDU2MUMwMDY1IiBuYW1lPSJyb2FkbWFwcyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMUMyIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQwRkQ1NjFBMDM5NiI+DQotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HbUpiU3VmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR21KYlNlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyMTI0QkVFMDBEQyIgbmFtZT0iRGlzY2lwbGluZSI+DQotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HbDE1Ui1mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxMjRCRUUwMERDIj4NCi0gICAgICAgICAgICAgIDxib2R5PkRpc2NpcGxpbmUgaXMgYSBjYXRlZ29yaXphdGlvbiBvZiBUYXNrcyBiYXNlZCB1cG9uIHNpbWlsYXJpdHkgb2YgY29uY2VybnMgYW5kIGNvb3BlcmF0aW9uIG9mIHdvcmsgZWZmb3J0LiAgVGhpcyBpcyB0aGUgZXh0ZW5zaW9ucyBvZiBEaXNjaXBsaW5lIGRlZmluZWQgaW4gdGhlIE1ldGhvZCBDb3JlIHBhY2thZ2UgYWRkaW5nIGFuIGFkZGl0aW9uYWwgYXNzb2NpYXRpb24gdG8gQWN0aXZpdGllcywgd2hpY2ggcmVwcmVzZW50IHR5cGljYWwgc3RhbmRhcmQgb3IgcmVmZXJlbmNlIHdheXMgb2YgbWVhbmluZ2Z1bCBncm91cGluZ3Mgb2YgdGhlIERpc2NpcGxpbmUncyBUYXNrcyBpbnRvIHdvcmtmbG93cy4NCi1UYXNrcyByZXByZXNlbnQgZGVzY3JpcHRpb25zIG9mIHdvcmssIHdoaWNoIGFyZSBjYXRlZ29yaXplZCBieSBEaXNjaXBsaW5lcy4gIFRoZSByZWFzb24gdGhhdCBzZXZlcmFsIFRhc2tzIGFyZSBhbGwgY2F0ZWdvcml6ZWQgYnkgdGhlIHNhbWUgRGlzY2lwbGluZSBpcyB0aGF0IHRoZXkgYWxsIHJlcHJlc2VudCBhIHBhcnQgaW4gYWNoaWV2aW5nIGEgaGlnaGVyIGdvYWwgb3IgcGVyZm9ybWluZyB3b3JrIHRoYXQgaXMgYWxsIHJlbGF0ZWQgdG8gZWFjaCBvdGhlci4gIEV2ZXJ5IERpc2NpcGxpbmUgZGVmaW5lcyBzdGFuZGFyZCB3YXlzIG9mIGRvaW5nIHRoZSB3b3JrIGl0IGNhdGVnb3JpemVzLiAgU3VjaCBzdGFuZGFyZCB3YXlzIGFyZSBleHByZXNzIGJ5IEFjdGl2aXRpZXMgb3IgQ2FwYWJpbGl0eSBQYXR0ZXJucyBkZWZpbmluZyBob3cgdGhlIFRhc2tzIGNhdGVnb3JpemVkIGJ5IHRoZSBEaXNjaXBsaW5lICd3b3JrIHRvZ2V0aGVyJyBpbiB0aGUgbW9zdCBnZW5lcmljIHdheS4gIFRoZXNlIHJlZmVyZW5jZSB3b3JrZmxvd3MgYXJlIG9mdGVuIHVzZWQgZm9yIGVkdWNhdGluZyBhbmQgdGVhY2hpbmcgcHJhY3RpdGlvbmVycy4gDQotPC9ib2R5Pg0KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MjEyNEMzQjAxMEYiIG5hbWU9InJlZmVyZW5jZVdvcmtmbG93cyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDFFMEZFOTMwMDc3IiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQyMTI0QzNBMDI0RSI+DQotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HbVNsUmVmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR21TbFJPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyN0E5RTg2MDE3RSIgbmFtZT0iUHJhY3RpY2UiPg0KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MjdBOUVGRjAxOUEiIG5hbWU9ImFjdGl2aXR5UmVmZXJlbmNlcyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDFFMEZFOTMwMDc3IiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQyN0E5RUZFMDFDQSI+DQotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HbVNsVE9mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR21TbFMtZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDBEQyIgbmFtZT0iQ2FwYWJpbGl0eVBhdHRlcm4iPg0KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR2wxNVRlZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDBEQyI+DQotICAgICAgICAgICAgICA8Ym9keT5BIENhcGFiaWxpdHkgUGF0dGVybiBpcyBhIHNwZWNpYWwgUHJvY2VzcyB0aGF0IGRlc2NyaWJlcyBhIHJldXNhYmxlIGNsdXN0ZXIgb2YgZG9pbmcgd29yayBpbiBjb21tb24gcHJvY2VzcyBhcmVhcy4gIENhcGFiaWxpdGllcyBQYXR0ZXJucyBleHByZXNzIGFuZCBjb21tdW5pY2F0ZSBwcm9jZXNzIGtub3dsZWRnZSBmb3IgYSBrZXkgYXJlYSBvZiBpbnRlcmVzdCBzdWNoIGFzIGEgRGlzY2lwbGluZSBhbmQgY2FuIGJlIGRpcmVjdGx5IHVzZWQgYnkgcHJvY2VzcyBwcmFjdGl0aW9uZXIgdG8gZ3VpZGUgaGlzIHdvcmsuICBUaGV5IGFyZSBhbHNvIHVzZWQgYXMgYnVpbGRpbmcgYmxvY2tzIHRvIGFzc2VtYmxlIERlbGl2ZXJ5IFByb2Nlc3NlcyBvciBsYXJnZXIgQ2FwYWJpbGl0eSBQYXR0ZXJucyBlbnN1cmluZyBvcHRpbWFsIHJldXNlIGFuZCBhcHBsaWNhdGlvbiBvZiB0aGUga2V5IHByYWN0aWNlcyB0aGV5IGV4cHJlc3MuDQotQSBDYXBhYmlsaXR5IFBhdHRlcm4gaXMgYSBzcGVjaWFsIFByb2Nlc3MgdGhhdCBkZXNjcmliZXMgYSByZXVzYWJsZSBjbHVzdGVyIG9mIGRvaW5nIHdvcmsgaW4gYSBnZW5lcmFsIHByb2Nlc3MgYXJlYSB0aGF0IHByb3ZpZGVzIGEgY29uc2lzdGVudCBkZXZlbG9wbWVudCBhcHByb2FjaCB0byBjb21tb24gcHJvYmxlbXMuICBFeGFtcGxlcyBmb3IgQ2FwYWJpbGl0eSBQYXR0ZXJuIGNvdWxkIGJlICd1c2UgY2FzZS1iYXNlZCByZXF1aXJlbWVudHMgbWFuYWdlbWVudCcsICd1c2UgY2FzZSBhbmFseXNpcycsIG9yICd1bml0IHRlc3RpbmcnLiBUeXBpY2FsbHkgYnV0IG5vdCBuZWNlc3NhcmlseSwgQ2FwYWJpbGl0eSBQYXR0ZXJucyBoYXZlIHRoZSBzY29wZSBvZiBvbmUgZGlzY2lwbGluZSBwcm92aWRpbmcgYSBicmVha2Rvd24gb2YgcmV1c2FibGUgY29tcGxleCBBY3Rpdml0aWVzLCByZWxhdGlvbnNoaXBzIHRvIHRoZSBSb2xlcyB3aGljaCBwZXJmb3JtIFRhc2tzIHdpdGhpbiB0aGVzZSBBY3Rpdml0aWVzLCBhcyB3ZWxsIGFzIHRvIHRoZSBXb3JrIFByb2R1Y3RzIHRoYXQgYXJlIHVzZWQgYW5kIHByb2R1Y2VkLiAgQSBjYXBhYmlsaXR5IHBhdHRlcm4gZG9lcyBub3QgcmVsYXRlIHRvIGFueSBzcGVjaWZpYyBwaGFzZSBvciBpdGVyYXRpb24gb2YgYSBkZXZlbG9wbWVudCBsaWZlY3ljbGUsIGFuZCBzaG91bGQgbm90IGltcGx5IGFueS4gIEluIG90aGVyIHdvcmRzLCBhIHBhdHRlcm4gc2hvdWxkIGJlIGRlc2lnbmVkIGluIGEgd2F5IHRoYXQgaXQgaXMgYXBwbGljYWJsZSBhbnl3aGVyZSBpbiBhIERlbGl2ZXJ5IFByb2Nlc3MuICBUaGlzIGVuYWJsZXMgaXRzIEFjdGl2aXRpZXMgdG8gYmUgZmxleGlibHkgYXNzaWduZWQgdG8gd2hhdGV2ZXIgcGhhc2VzIHRoZXJlIGFyZSBpbiB0aGUgRGVsaXZlcnkgUHJvY2VzcyB0byB3aGljaCBpdCBpcyBiZWluZyBhcHBsaWVkLiAgSXQgaXMgYSBnb29kIHByYWN0aWNlIHRvIGRlc2lnbiBhIENhcGFiaWxpdHkgUGF0dGVybiB0byBwcm9kdWNlIG9uZSBvciBtb3JlIGdlbmVyaWMgRGVsaXZlcmFibGVzLiAgVGhlIHR5cGljYWwgY29uZmlndXJhdGlvbiBpcyB0aGF0IGVhY2ggQWN0aXZpdHkgaW4gdGhlIENhcGFiaWxpdHkgUGF0dGVybiBwcm9kdWNlcyBvbmUgRGVsaXZlcmFibGUsIGFuZCB0aGUgbGFzdCBUYXNrIERlc2NyaXB0b3IgaW4gdGhlIEFjdGl2aXR5IGV4cGxpY2l0bHkgb3V0cHV0cyBqdXN0IHRoaXMgRGVsaXZlcmFibGUuICBUaGlzIGVuYWJsZXMgdGhlIHByb2Nlc3MgZW5naW5lZXIgdG8gc2VsZWN0IFBhdHRlcm5zIG9yIGp1c3QgQWN0aXZpdGllcyBieSBkZWNpZGluZyB3aGljaCBEZWxpdmVyYWJsZXMgYXJlIHJlcXVpcmVkLiAgSXQgYWxzbyBvZmZlcnMgYSBzaW1wbGUgaW50ZWdyYXRpb24gYXBwcm9hY2g6IGFuIEFjdGl2aXR5IGZyb20gYSBjYXBhYmlsaXR5IHBhdHRlcm4gaXMgbGlua2VkIHRvIHRoZSBQaGFzZSBvciBJdGVyYXRpb24gd2hpY2ggaXMgcmVxdWlyZWQgdG8gcHJvZHVjZSB0aGUgQWN0aXZpdHkncyBEZWxpdmVyYWJsZS4gIEtleSBhcHBsaWNhdGlvbnMgYXJlYXMgb2YgLyBhcmVhcyBvZiByZXVzZSBmb3IgQ2FwYWJpbGl0eSBQYXR0ZXJucyBhcmU6DQotLSBUbyBzZXJ2ZSBhcyBidWlsZGluZyBibG9ja3MgZm9yIGFzc2VtYmxpbmcgRGVsaXZlcnkgUHJvY2Vzc2VzIG9yIGxhcmdlciBDYXBhYmlsaXR5IFBhdHRlcm5zLiAgTm9ybWFsbHkgZGV2ZWxvcGluZyBhIERlbGl2ZXJ5IFByb2Nlc3MgaXMgbm90IGRvbmUgZnJvbSBzY3JhdGNoIGJ1dCBieSBzeXN0ZW1hdGljYWxseSBhcHBseWluZyBhbmQgYmluZGluZyBwYXR0ZXJucy4gIEluIGFkZGl0aW9uIHRvIHRoZSBzdGFuZGFyZCBwYXR0ZXJuIGFwcGxpY2F0aW9uIG9mICdjb3B5LWFuZC1tb2RpZnknLCB3aGljaCBhbGxvd3MgdGhlIHByb2Nlc3MgZW5naW5lZXIgdG8gaW5kaXZpZHVhbGx5IGN1c3RvbWl6ZSB0aGUgcGF0dGVybidzIGNvbnRlbnQgdG8gdGhlIHBhcnRpY3VsYXIgc2l0dWF0aW9uIGl0IGlzIGFwcGxpZWQgZm9yLCB0aGUgUGx1Z2luIG1ldGEtbW9kZWwgcGFja2FnZSAoU2VjdGlvbiA2LjEpIGludHJvZHVjZXMgZXZlbiBtb3JlIHNvcGhpc3RpY2F0ZWQgaW5oZXJpdGFuY2UgcmVsYXRpb25zaGlwcyB0aGF0IHN1cHBvcnQgZHluYW1pYyBiaW5kaW5nIG9mIHBhdHRlcm5zIChpLmUuIHRoZSBwYXR0ZXJuIGlzIHJlZmVyZW5jZWQgYW5kIG5vdCBjb3BpZWQpLiAgVGhpcyB1bmlxdWUgbmV3IHdheSBvZiByZXVzaW5nIHByb2Nlc3Mga25vd2xlZGdlIGFsbG93cyB0byBmYWN0b3Igb3V0IGNvbW1vbmx5IHJlb2NjdXJyaW5nIEFjdGl2aXRpZXMgaW50byBwYXR0ZXJucyBhbmQgdG8gYXBwbHkgdGhlbSBvdmVyIGFuZCBvdmVyIGFnYWluIGZvciBhIHByb2Nlc3MuICBXaGVuIHRoZSBwYXR0ZXJuIGlzIGJlaW5nIHJldmlzZWQgb3IgdXBkYXRlZCwgYWxsIGNoYW5nZXMgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IHJlZmxlY3RlZCBpbiBhbGwgcGF0dGVybiBhcHBsaWNhdGlvbiBpbiBhbGwgcHJvY2Vzc2VzIGJlY2F1c2Ugb2YgdGhlIGR5bmFtaWMgYmluZGluZy4NCi0tIFRvIHN1cHBvcnQgZGlyZWN0IGV4ZWN1dGlvbiBpbiBhIGRldmVsb3BtZW50IHByb2plY3QgdGhhdCBkb2VzIG5vdCB3b3JrIGZvbGxvd2luZyBhIHdlbGwtZGVmaW5lZCBwcm9jZXNzLCBidXQgd29ya3MgYmFzZWQgb24gbG9vc2VseSBjb25uZWN0ZWQgcHJvY2VzcyBmcmFnbWVudHMgb2YgYmVzdCBwcmFjdGljZXMgaW4gYSBmbGV4aWJsZSBtYW5uZXIgKGUuZy4gQWdpbGUgRGV2ZWxvcG1lbnQpLg0KLS0gVG8gc3VwcG9ydCBwcm9jZXNzIGVkdWNhdGlvbiBieSBkZXNjcmliaW5nIGtub3dsZWRnZSBmb3IgYSBrZXkgYXJlYSBzdWNoIGFzIGJlc3QgcHJhY3RpY2VzIG9uIGhvdyB0byBwZXJmb3JtIHRoZSB3b3JrIGZvciBhIERpc2NpcGxpbmUgKGUuZy4gUmVxdWlyZW1lbnRzIE1hbmFnZW1lbnQpLCBmb3IgYSBzcGVjaWZpYyBkZXZlbG9wbWVudCB0ZWNobmlxdWUgKGFzcGVjdC1vcmllbnRlZCBkZXZlbG9wbWVudCksIG9yIGEgc3BlY2lmaWMgdGVjaG5pY2FsIGFyZWEgKGUuZy4gcmVsYXRpb25hbCBkYXRhYmFzZSBkZXNpZ24pLCB3aGljaCBpcyB1c2VkIGZvciBlZHVjYXRpb24gYW5kIHRlYWNoaW5nLg0KLTwvYm9keT4NCi0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjhEIiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDlGIi8+DQotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxMTlBM0YyMDIzOCIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDExOUEzRjMwMUUyIF8zQURDN0I3NDAyMkQ0MTE5QTNGMzAxRUMiPg0KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR2xfcVEtZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxMTlBM0YyMDIzOCI+DQotICAgICAgICAgICAgICA8Ym9keT5UaGlzIGFzc29jaWF0aW9uIHByb3ZpZGVzIHRyYWNlYWJpbGl0eSBmb3IgYSBQcm9jZXNzIGRvY3VtZW50aW5nIHdoaWNoIENhcGFiaWxpdHkgUGF0dGVybnMgaGF2ZSBiZWVuIHVzZWQgZm9yIGRlZmluaW5nIHRoZSBwcm9jZXNzLiAgSXQgZG9jdW1lbnRzIGFwcGxpY2F0aW9ucyBvZiBhIHBhdHRlcm4gdGhyb3VnaCBjb3B5IGFzIHdlbGwgYXMgcGF0dGVybiBiaW5kaW5nLjwvYm9keT4NCi0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgICAgICA8b3duZWRFbmQgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDExOUEzRjMwMUVDIiBuYW1lPSJfcHJvY2VzcyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDlGIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDExOUEzRjIwMjM4Ij4NCi0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0dsX3FTdWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+DQotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HbF9xU2VmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgPC9vd25lZEVuZD4NCi0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDExOUE0MDAwMEU2IiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0MTE5QTQwMTAwMTcgXzNBREM3Qjc0MDIyRDQxMTlBNDAxMDAyQiI+DQotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HbF9xVE9mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDExOUE0MDAwMEU2Ij4NCi0gICAgICAgICAgICAgIDxib2R5PklmIHRoZSBQbGFuIGhhcyBiZWVuIGNyZWF0ZWQgYmFzZWQgb24gb25lIG9yIG1vcmUgcHJvY2Vzc2VzIChpLmUuIG90aGVyIFBsYW5zLCBDYXBhYmlsaXR5IFBhdHRlcm5zLCBhIERlbGl2ZXJ5IFByb2Nlc3MsIG9yIGFueSBjb21iaW5hdGlvbiBvZiB0aGVzZSksIHRoZW4gdGhpcyBhc3NvY2lhdGlvbiBjYXB0dXJlcyBhIHRyYWNlIGJhY2sgdG8gdGhlc2Ugc291cmNlcy48L2JvZHk+DQotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxMTlBNDAxMDAyQiIgbmFtZT0iX3Byb2Nlc3NQbGFubmluZ1RlbXBsYXRlIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwRTUiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MTE5QTQwMDAwRTYiPg0KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR2xfcVUtZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4NCi0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0dsX3FVdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICA8L293bmVkRW5kPg0KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTE5QTRGODAyMEEiIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQxMTlBNEY5MDA2OSBfM0FEQzdCNzQwMjJENDExOUE0RjkwMDczIj4NCi0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dsX3FWZWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTE5QTRGODAyMEEiPg0KLSAgICAgICAgICAgICAgPGJvZHk+VGhlIFBsYW5uaW5nRGF0YSBjbGFzcyBmYWN0b3JzIG91dCBzcGVjaWZpYyBvcHRpb25hbCBkYXRhIG5lZWRlZCBmb3IgcmVwcmVzZW50aW5nIHBsYW5uaW5nIHRlbXBsYXRlcy4gIFRoaXMgYXNzb2NpYXRpb24gYWxsb3dzIHRvIGFjY2VzcyBwbGFubmluZyBkYXRhIGlmIGl0IGlzIHN0b3JlZCBmb3IgdGhlIEJyZWFrZG93biBFbGVtZW50LjwvYm9keT4NCi0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgICAgICA8b3duZWRFbmQgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDExOUE0RjkwMDczIiBuYW1lPSJfYnJlYWtkb3duRWxlbWVudCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMEVGIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDExOUE0RjgwMjBBIi8+DQotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRkQ1NjFBMDM5NiIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDBGRDU2MUMwMDY1IF8zQURDN0I3NDAyMkQ0MEZENTYxQzAwNzkiPg0KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR21KYlJ1ZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRkQ1NjFBMDM5NiI+DQotICAgICAgICAgICAgICA8Ym9keT5UaGlzIGFzc29jaWF0aW9uIGxpbmtzIGFuIEFjdGl2aXR5IHRvIHplcm8gb3IgbW9yZXMgaW5zdGFuY2VzIG9mIHRoZSBSb2FkbWFwIGd1aWRhbmNlIHR5cGUuPC9ib2R5Pg0KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEZENTYxQzAwNzkiIG5hbWU9ImFjdGl2aXR5IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MUUwRkU5MzAwNzciIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDBGRDU2MUEwMzk2Ij4NCi0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0dtSmJUZWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIxIi8+DQotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HbUpiVE9mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iMSIvPg0KLSAgICAgICAgICAgIDwvb3duZWRFbmQ+DQotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDExQSIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTFCIF8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxMUQiPg0KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR21KYlQtZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDExQSI+DQotICAgICAgICAgICAgICA8Ym9keT5UaGlzIGFzc29jaWF0aW9uIGRlZmluZXMgYSBjb2xsZWN0aW9uIG9mIGd1aWRhbmNlIGRvY3VtZW50cyB0aGF0IHByb3ZpZGUgZWR1Y2F0aW9uIG1hdGVyaWFsIGZvciB0ZWFjaGluZyBzdGFrZWhvbGRlcnMgc3VjaCBhcyBwcm9qZWN0IG1hbmFnZXJzIG9uIGhvdyB0byBwZXJmb3JtIHByb2plY3RzIHRoYXQgZm9sbG93IHRoaXMgRGVsaXZlcnkgUHJvY2Vzcy48L2JvZHk+DQotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDExQiIgbmFtZT0iX2RlbGl2ZXJ5UHJvY2VzcyIgdmlzaWJpbGl0eT0icHJpdmF0ZSIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDA3NyIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDExQSI+DQotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HbUpiVS1mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR21KYlV1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgIDwvb3duZWRFbmQ+DQotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDEyRSIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTJGIF8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxMzEiPg0KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR21KYldPZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDEyRSI+DQotICAgICAgICAgICAgICA8Ym9keT5UaGlzIGFzc29jaWF0aW9uIGRlZmluZXMgYSBjb2xsZWN0aW9uIG9mIGd1aWRhbmNlIGRvY3VtZW50cyB0aGF0IGhhdmUgYmVlbiByZWxhdGVkIHRvIGEgRGVsaXZlcnkgUHJvY2VzcyBpbnN0YW5jZSB0byBkZXNjcmliZSBhbmQgY2hhcmFjdGVyaXplIGl0cyBmZWF0dXJlcyBhbmQgY2FwYWJpbGl0aWVzLiBUaGVzZSBkb2N1bWVudHMgY2FuIGJlIHVzZWQgZm9yIHNldmVyYWwgcHVycG9zZXMgc3VjaCBhcyBpbnRlcm5hbCBtYXJrZXRpbmcgY29tbXVuaWNhdGlvbnMsIHNhbGVzIHRyYWluaW5nIGFuZCBnZW5lcmFsIG1ldGhvZCBlZHVjYXRpb24uICBFeGFtcGxlcyBmb3IgQ29tbXVuaWNhdGlvbnMgTWF0ZXJpYWwgYXJlIEhpZ2hsaWdodCBEb2N1bWVudCwgRmFjdCBTaGVldCwgYW5kIERlbGl2ZXJ5IFByb2Nlc3MgU3BlY2lmaWNhdGlvbiBPdmVydmlldy48L2JvZHk+DQotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDEyRiIgbmFtZT0iX2RlbGl2ZXJ5UHJvY2VzcyIgdmlzaWJpbGl0eT0icHJpdmF0ZSIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDA3NyIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDEyRSI+DQotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HbVNsTS1mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR21TbE11ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgIDwvb3duZWRFbmQ+DQotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxRTBGRkQzMDBFRiIgbmFtZT0iQnJlYWtkb3duTmVzdGluZyIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDFFMEZGRDMwMEYwIF8zQURDN0I3NDAyMkQ0MUUwRkZEMzAwRjEiPg0KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR21TbE9PZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRTBGRkQzMDBFRiI+DQotICAgICAgICAgICAgICA8Ym9keT5UaGlzIGJpZGlyZWN0aW9uYWwgYXNzb2NpYXRpb24gcmVwcmVzZW50cyBicmVha2Rvd24gc3RydWN0dXJlIG5lc3RpbmcuICBJdCBkZWZpbmVzIGFuIG4tbGV2ZWwgaGllcmFyY2h5IG9mIEFjdGl2aXRpZXMgZ3JvdXBpbmcgdG9nZXRoZXIgb3RoZXIgQnJlYWtkb3duIEVsZW1lbnRzIHN1Y2ggYXMgb3RoZXIgQWN0aXZpdGllcywgRGVzY3JpcHRvcnMsIE1pbGVzdG9uZXMsIGV0Yy4NCi1UaGUgc3VwZXJBY3Rpdml0aWVzIHJvbGUgYWxsb3dzIG5hdmlnYXRpb24gb2YgYSBCcmVha2Rvd24gRWxlbWVudCB0byBpcyBwYXJlbnQgQWN0aXZpdHkuIFRoZSBicmVha2Rvd25FbGVtZW50cyByb2xlIGFsbG93cyBuYXZpZ2F0aW9uIGZyb20gYW4gQWN0aXZpdHkgdG8gaXRzIG5lc3RlZCBCcmVha2Rvd24gRWxlbWVudHMuDQotPC9ib2R5Pg0KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MjEyNEMzQTAyNEUiIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQyMTI0QzNCMDEwRiBfM0FEQzdCNzQwMjJENDIxMjRDM0IwMTM3Ij4NCi0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dtU2xRZWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjEyNEMzQTAyNEUiPg0KLSAgICAgICAgICAgICAgPGJvZHk+VGhpcyBhc3NvY2lhdGlvbiBwcm92aWRlcyBvbmUgbW9yZSByZWZlcmVuY2Ugd29ya2Zsb3dzIGZvciBhIERpc2NpcGxpbmUuICBUaGUgcmVmZXJlbmNlIHdvcmtmbG93cyBkZWZpbmUgdGhlIG1vc3QgdHlwaWNhbCB3YXlzIG9mIGRvaW5nIHRoZSB3b3JrIG9mIGEgRGlzY2lwbGluZS48L2JvZHk+DQotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyMTI0QzNCMDEzNyIgbmFtZT0iX2Rpc2NpcGxpbmUiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQyMTI0QkVFMDBEQyIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQyMTI0QzNBMDI0RSI+DQotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HbVNsU09mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR21TbFItZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgIDwvb3duZWRFbmQ+DQotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyN0E5RUZFMDFDQSIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDI3QTlFRkYwMTlBIF8zQURDN0I3NDAyMkQ0MjdBOUVGRjAxQTQiPg0KLSAgICAgICAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MjdBOUVGRjAxQTQiIG5hbWU9Il9wcmFjdGljZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDI3QTlFODYwMTdFIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDI3QTlFRkUwMUNBIj4NCi0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0dtU2xULWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+DQotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HbVNsVHVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgPC9vd25lZEVuZD4NCi0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDI3QTlGNTAwMzI1IiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0MjdBOUY1MjAwNDMgXzNBREM3Qjc0MDIyRDQyN0E5RjUyMDA0NSI+DQotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HbVNsVWVmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTlGNTAwMzI1Ij4NCi0gICAgICAgICAgICAgIDxib2R5PlRoaXMgYXNzb2NpYXRpb24gY2FuIGJlIHVzZWQgdG8gbGluayBhbGwga2luZHMgb2YgZ2VuZXJhbCBndWlkYW5jZSB0byB0aGUgQWN0aXZpdHkgdGhhdCBpcyBiZWluZyBtYW5hZ2VkIGFzIGdlbmVyYWwgU3VwcG9ydGluZyBNYXRlcmlhbC48L2JvZHk+DQotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyN0E5RjUyMDA0NSIgbmFtZT0iX2FjdGl2aXR5IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il9HNDJSc01VNkVkeTJtdVEyUFF2SF9BIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDI3QTlGNTAwMzI1Ij4NCi0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0dtY1dOdWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+DQotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HbWNXTmVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgPC9vd25lZEVuZD4NCi0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDI3QTlGOEMwMEM1IiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0MjdBOUY4RDAwMTMgXzNBREM3Qjc0MDIyRDQyN0E5RjhEMDAxRCI+DQotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HbWNXT09mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTlGOEMwMEM1Ij4NCi0gICAgICAgICAgICAgIDxib2R5PlRoaXMgYXNzb2NpYXRpb24gcHJvdmlkZXMgQWN0aXZpdHktIChvciBQcm9jZXNzLSkgc3BlY2lmaWMgY2hlY2sgcG9pbnRzLiAgVGhlc2UgYXJlIHR5cGljYWxseSB1c2VkIGluIHJldmlld3MgYW5kIGluc3BlY3Rpb25zIG9uIHRoZSB3b3JrIHBlcmZvcm1lZC48L2JvZHk+DQotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyN0E5RjhEMDAxRCIgbmFtZT0iX2FjdGl2aXR5IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il9HNDJSc01VNkVkeTJtdVEyUFF2SF9BIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDI3QTlGOEMwMEM1Ij4NCi0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0dtY1dQLWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+DQotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HbWNXUHVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgPC9vd25lZEVuZD4NCi0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDI3QTlGOTAwMjUyIiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0MjdBOUY5MTAxQTkgXzNBREM3Qjc0MDIyRDQyN0E5RjkxMDFCNCI+DQotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HbWNXUWVmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTlGOTAwMjUyIj4NCi0gICAgICAgICAgICAgIDxib2R5PlRoaXMgYXNzb2NpYXRpb24gcmVsYXRlcyBjb25jZXB0cyBvciB3aGl0ZXBhcGVycyB0byB0aGUgQWN0aXZpdHkgcHJvdmlkaW5nIGltcG9ydGFudCBiYWNrZ3JvdW5kIGluZm9ybWF0aW9uIG5lY2Vzc2FyeSBmb3IgZG9pbmcgdGhlIHdvcmsgZGVzY3JpYmVkIGJ5IHRoZSBBY3Rpdml0eS48L2JvZHk+DQotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyN0E5RjkxMDFCNCIgbmFtZT0iX2FjdGl2aXR5IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il9HNDJSc01VNkVkeTJtdVEyUFF2SF9BIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDI3QTlGOTAwMjUyIj4NCi0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0dtY1dTT2ZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+DQotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HbWNXUi1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgPC9vd25lZEVuZD4NCi0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDI3QTlGOTQwM0I3IiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0MjdBOUY5NTAzMjIgXzNBREM3Qjc0MDIyRDQyN0E5Rjk1MDMyQyI+DQotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HbWNXU3VmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTlGOTQwM0I3Ij4NCi0gICAgICAgICAgICAgIDxib2R5PlRoaXMgYXNzb2NpYXRpb24gY2FuIHByb3ZpZGUgcmVmZXJlbmNlcyB0byBleGFtcGxlcyByZWxldmFudCB0byB0aGlzIHNwZWNpZmljIEFjdGl2aXR5IChvciBQcm9jZXNzKS4gIDwvYm9keT4NCi0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgICAgICA8b3duZWRFbmQgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDI3QTlGOTUwMzJDIiBuYW1lPSJfYWN0aXZpdHkiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX0c0MlJzTVU2RWR5Mm11UTJQUXZIX0EiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MjdBOUY5NDAzQjciPg0KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR21sZ0p1ZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4NCi0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0dtbGdKZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICA8L293bmVkRW5kPg0KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MjdBOUY5OTAzODMiIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQyN0E5RjlBMDJEQSBfM0FEQzdCNzQwMjJENDI3QTlGOUEwMkU0Ij4NCi0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dtbGdLT2ZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBOUY5OTAzODMiPg0KLSAgICAgICAgICAgICAgPGJvZHk+VGhpcyBhc3NvY2lhdGlvbiBwcm92aWRlcyBBY3Rpdml0eS1zcGVjaWZpYyBHdWlkZWxpbmVzLjwvYm9keT4NCi0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgICAgICA8b3duZWRFbmQgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDI3QTlGOUEwMkU0IiBuYW1lPSJfYWN0aXZpdHkiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX0c0MlJzTVU2RWR5Mm11UTJQUXZIX0EiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MjdBOUY5OTAzODMiPg0KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR21sZ0wtZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4NCi0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0dtbGdMdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICA8L293bmVkRW5kPg0KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MjdBOUY5RTAxNzgiIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQyN0E5RjlGMDA4OSBfM0FEQzdCNzQwMjJENDI3QTlGOUYwMDhCIj4NCi0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dtbGdNZWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBOUY5RTAxNzgiPg0KLSAgICAgICAgICAgICAgPGJvZHk+VGhpcyBhc3NvY2lhdGlvbiByZWZlcnMgdG8gUmV1c2FibGUgQXNzZXRzIHNwZWNpZmljIHRvIHRoaXMgQWN0aXZpdHkgKG9yIFByb2Nlc3MpLiA8L2JvZHk+DQotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyN0E5RjlGMDA4QiIgbmFtZT0iX2FjdGl2aXR5IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il9HNDJSc01VNkVkeTJtdVEyUFF2SF9BIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDI3QTlGOUUwMTc4Ij4NCi0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0FnZUljY1U4RWR5Mm11UTJQUXZIX0EiIHZhbHVlPSIqIi8+DQotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9BZ2VJY01VOEVkeTJtdVEyUFF2SF9BIi8+DQotICAgICAgICAgICAgPC9vd25lZEVuZD4NCi0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfRzQyUnNNVTZFZHkybXVRMlBRdkhfQSIgbmFtZT0iQnJlYWtkb3duRWxlbWVudCIgaXNBYnN0cmFjdD0idHJ1ZSI+DQotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyN0E5RjhEMDAxMyIgbmFtZT0iY2hlY2tsaXN0cyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMTlBIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQyN0E5RjhDMDBDNSI+DQotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HbWNXUE9mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR21jV08tZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyN0E5RjkxMDFBOSIgbmFtZT0iY29uY2VwdHMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDE5OSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MjdBOUY5MDAyNTIiPg0KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR21jV1JlZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4NCi0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0dtY1dST2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MjdBOUY5NTAzMjIiIG5hbWU9ImV4YW1wbGVzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxQTMiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDI3QTlGOTQwM0I3Ij4NCi0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0dtbGdJLWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+DQotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HbWxnSXVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDI3QTlGOUEwMkRBIiBuYW1lPSJndWlkZWxpbmVzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxQTQiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDI3QTlGOTkwMzgzIj4NCi0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0dtbGdMT2ZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+DQotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HbWxnSy1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDI3QTlGOUYwMDg5IiBuYW1lPSJyZXVzYWJsZUFzc2V0cyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDIxM0M5MTMwMkM1IiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQyN0E5RjlFMDE3OCI+DQotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HbWxnTmVmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR21sZ05PZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyN0E5RjUyMDA0MyIgbmFtZT0ic3VwcG9ydGluZ01hdGVyaWFscyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMUMxIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQyN0E5RjUwMDMyNSI+DQotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HbWNXTS1mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR21jV011ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX25BeEc4TWlJRWR5eE80RXN1UU9nVGciIG5hbWU9InRlbXBsYXRlcyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMUI4IiBhc3NvY2lhdGlvbj0iX25BbjlBTWlJRWR5eE80RXN1UU9nVGciPg0KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfbkF4RzhzaUlFZHl4TzRFc3VRT2dUZyIgdmFsdWU9IioiLz4NCi0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX25BeEc4Y2lJRWR5eE80RXN1UU9nVGciLz4NCi0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il9wdjNLY2NpSUVkeXhPNEVzdVFPZ1RnIiBuYW1lPSJyZXBvcnRzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxQjciIGFzc29jaWF0aW9uPSJfcHYzS2NNaUlFZHl4TzRFc3VRT2dUZyI+DQotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9wdjNLYzhpSUVkeXhPNEVzdVFPZ1RnIiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfcHYzS2NzaUlFZHl4TzRFc3VRT2dUZyIvPg0KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3FhVkR3Y2lJRWR5eE80RXN1UU9nVGciIG5hbWU9ImVzdGltYXRpb25jb25zaWRlcmF0aW9ucyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMUQ1IiBhc3NvY2lhdGlvbj0iX3FhVkR3TWlJRWR5eE80RXN1UU9nVGciPg0KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfcWFWRHc4aUlFZHl4TzRFc3VRT2dUZyIgdmFsdWU9IioiLz4NCi0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3FhVkR3c2lJRWR5eE80RXN1UU9nVGciLz4NCi0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il9yUC1TVWNpSUVkeXhPNEVzdVFPZ1RnIiBuYW1lPSJ0b29sbWVudG9yIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxQ0IiIGFzc29jaWF0aW9uPSJfclAtU1VNaUlFZHl4TzRFc3VRT2dUZyI+DQotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9yUC1TVThpSUVkeXhPNEVzdVFPZ1RnIiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfclAtU1VzaUlFZHl4TzRFc3VRT2dUZyIvPg0KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX25BbjlBTWlJRWR5eE80RXN1UU9nVGciIG1lbWJlckVuZD0iX25BeEc4TWlJRWR5eE80RXN1UU9nVGcgX25BeEc4OGlJRWR5eE80RXN1UU9nVGciPg0KLSAgICAgICAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il9uQXhHODhpSUVkeXhPNEVzdVFPZ1RnIiBuYW1lPSIiIHZpc2liaWxpdHk9InByaXZhdGUiIHR5cGU9Il9HNDJSc01VNkVkeTJtdVEyUFF2SF9BIiBhc3NvY2lhdGlvbj0iX25BbjlBTWlJRWR5eE80RXN1UU9nVGciPg0KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfbkF4RzljaUlFZHl4TzRFc3VRT2dUZyIgdmFsdWU9IioiLz4NCi0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX25BeEc5TWlJRWR5eE80RXN1UU9nVGciLz4NCi0gICAgICAgICAgICA8L293bmVkRW5kPg0KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il9wdjNLY01pSUVkeXhPNEVzdVFPZ1RnIiBtZW1iZXJFbmQ9Il9wdjNLY2NpSUVkeXhPNEVzdVFPZ1RnIF9wdjNLZE1pSUVkeXhPNEVzdVFPZ1RnIj4NCi0gICAgICAgICAgICA8b3duZWRFbmQgeG1pOmlkPSJfcHYzS2RNaUlFZHl4TzRFc3VRT2dUZyIgbmFtZT0iIiB2aXNpYmlsaXR5PSJwcml2YXRlIiB0eXBlPSJfRzQyUnNNVTZFZHkybXVRMlBRdkhfQSIgYXNzb2NpYXRpb249Il9wdjNLY01pSUVkeXhPNEVzdVFPZ1RnIj4NCi0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3B2M0tkc2lJRWR5eE80RXN1UU9nVGciIHZhbHVlPSIqIi8+DQotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9wdjNLZGNpSUVkeXhPNEVzdVFPZ1RnIi8+DQotICAgICAgICAgICAgPC9vd25lZEVuZD4NCi0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfcWFWRHdNaUlFZHl4TzRFc3VRT2dUZyIgbWVtYmVyRW5kPSJfcWFWRHdjaUlFZHl4TzRFc3VRT2dUZyBfcWFWRHhNaUlFZHl4TzRFc3VRT2dUZyI+DQotICAgICAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iX3FhVkR4TWlJRWR5eE80RXN1UU9nVGciIG5hbWU9IiIgdmlzaWJpbGl0eT0icHJpdmF0ZSIgdHlwZT0iX0c0MlJzTVU2RWR5Mm11UTJQUXZIX0EiIGFzc29jaWF0aW9uPSJfcWFWRHdNaUlFZHl4TzRFc3VRT2dUZyI+DQotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9xYVZEeHNpSUVkeXhPNEVzdVFPZ1RnIiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfcWFWRHhjaUlFZHl4TzRFc3VRT2dUZyIvPg0KLSAgICAgICAgICAgIDwvb3duZWRFbmQ+DQotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3JQLVNVTWlJRWR5eE80RXN1UU9nVGciIG1lbWJlckVuZD0iX3JQLVNVY2lJRWR5eE80RXN1UU9nVGcgX3JQLVNWTWlJRWR5eE80RXN1UU9nVGciPg0KLSAgICAgICAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il9yUC1TVk1pSUVkeXhPNEVzdVFPZ1RnIiBuYW1lPSIiIHZpc2liaWxpdHk9InByaXZhdGUiIHR5cGU9Il9HNDJSc01VNkVkeTJtdVEyUFF2SF9BIiBhc3NvY2lhdGlvbj0iX3JQLVNVTWlJRWR5eE80RXN1UU9nVGciPg0KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfclAtU1ZzaUlFZHl4TzRFc3VRT2dUZyIgdmFsdWU9IioiLz4NCi0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3JQLVNWY2lJRWR5eE80RXN1UU9nVGciLz4NCi0gICAgICAgICAgICA8L293bmVkRW5kPg0KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOlBhY2thZ2UiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxRTBEMEVEMDEwNCIgbmFtZT0iUHJvY2Vzc1BhY2thZ2UiPg0KLSAgICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iX0duVnVIdWZYRWR1cUhvT0piVVJaUnciIHNvdXJjZT0idW1sMi5kaWFncmFtcyIgcmVmZXJlbmNlcz0iXzNBREM3Qjc0MDIyRDQwRjU3REM4MDE5NyI+DQotICAgICAgICAgICAgPGNvbnRlbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpEaWFncmFtIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEY1N0RDODAxOTciIHR5cGU9IkNsYXNzIiBuYW1lPSJQcm9jZXNzUGFja2FnZSI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1sSllPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDEzRiI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWxKWS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRy1sSlpPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1sSlplZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1sSlp1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1sSlotZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWxKYU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctbEphZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctbEphdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctbEphLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctbEpiT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctbEpiZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctbEpidWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLWxKYi1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0ctbEpZZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjEyNjMyMjU2IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HLWxKWXVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxOTcyIiB5PSIxOTgxIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctbEp0dWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxNjciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1sSnVlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0ctbEp1dWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctbEp1LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctbEp2T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctbEp2ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1sSnZ1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy1sSnYtZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1sSndPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy1sSndlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1sSnd1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy1sSnctZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1sSnhPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctbEp4ZWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRy1sSnQtZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9Ik5vbmUiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRy1sSnVPZlhFZHVxSG9PSmJVUlpSdyIgeD0iNzI2NiIgeT0iNTkyOCIgd2lkdGg9IjQwNDciIGhlaWdodD0iMTExNyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWxKeHVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI4M0U4QTEwMzQxIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctbEp5ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HLWxKeXVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMzAzMSIgaGVpZ2h0PSIxMTM0Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWxKeS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWxKek9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWxKemVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctbEp6dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctbEp6LWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctbEowT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctbEowZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctbEowdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctbEowLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctbEoxT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLWxKMWVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0ctbEp4LWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dQYXJlbnQ9Ik5hbWUiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0ctbEp5T2ZYRWR1cUhvT0piVVJaUnciIHg9IjI3NTEiIHk9IjkxMzUiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1sSjF1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDE1MyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWxKMmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRy1sSjJ1ZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1sSjItZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1sSjNPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1sSjNlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWxKM3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLWxKMy1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWxKNE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLWxKNGVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWxKNHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLWxKNC1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWxKNU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy1sSjVlZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HLWxKMS1mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iTm9uZSIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HLWxKMk9mWEVkdXFIb09KYlVSWlJ3IiB4PSIyNTA2IiB5PSI2MTI5IiB3aWR0aD0iMzMxOCIgaGVpZ2h0PSIxNzY5Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MRGlhZ3JhbVN0eWxlIiB4bWk6aWQ9Il9HblZ1SU9mWEVkdXFIb09KYlVSWlJ3IiBkZXNjcmlwdGlvbj0iVGhpcyBkaWFncmFtIHNob3dzIHRoZSBkZWZpbml0aW9uIG9mIFByb2Nlc3MgUGFja2FnZSBhbmQgd2hhdCBlbGVtZW50cyBpdCBjYW4gc3RvcmUuICBUaGUgUHJvY2VzcyBQYWNrYWdlIHBhY2thZ2UgZXh0ZW5kcyBNZXRob2QgUGFja2FnZSB3aXRoIHRoZSBuZXcgY29uY2VwdCBvZiBQcm9jZXNzIFBhY2thZ2UuICBXaGVyZWFzIHRoZSBzcGVjaWFsIE1ldGhvZCBQYWNrYWdlIENvbnRlbnQgUGFja2FnZXMgc3RvcmVzIGNvcmUgY29udGVudCBlbGVtZW50cywgdGhlIFByb2Nlc3MgcGFja2FnZSBpcyBzcGVjaWFsaXplZCBpbiBzdG9yaW5nIFByb2Nlc3MgRWxlbWVudHMuICBUaGUgc2VwYXJhdGlvbiBvZiBDb250ZW50IHZlcnN1cyBQcm9jZXNzIFBhY2thZ2VzIGVuZm9yY2VzIHRoZSBzZXBhcmF0aW9uIG9mIG1ldGhvZCBjb250ZW50IHZlcnN1cyBpdHMgYXBwbGljYXRpb24gaW4gcHJvY2Vzc2VzLiAgTWV0aG9kIGNvbnRlbnQgaXMgaW50ZW5kZWQgYmUgcmV1c2VkIGluIG1hbnkgcHJvY2Vzc2VzLiAgVGhlcmVmb3JlLCBzdG9yaW5nIG1ldGhvZCBjb250ZW50IGFuZCBwcm9jZXNzIGVsZW1lbnRzIGluIHRoZSBzYW1lIHBhY2thZ2Ugd291bGQgZWFzaWx5IHZpb2xhdGUgdGhpcyBwcmluY2lwbGUgYW5kIHByb2Nlc3MgbW9kZWxzIHdvdWxkIGJlIGJlY29tZSB1bm5lY2Vzc2FyaWx5IGNvaGVzaXZlLiAgVGhlcmVmb3JlLCBVTUEgZW5mb3JjZXMgdGhlIHNlcGFyYXRpb24gb2YgQ29udGVudCBhbmQgUHJvY2VzcyBieSBub3QgYWxsb3dpbmcgdG8gc3RvcmUgdGhlbSBpbiB0aGUgc2FtZSB0eXBlIG9mIHBhY2thZ2UuICIvPg0KLSAgICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0ctbEpjT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MTAwMzUiIHNvdXJjZT0iX0ctbEpZT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0ctbEpZT2ZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1sSmMtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1sSmRlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWxKZHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRy1sSmRPZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTYxMCIgeT0iLTMxMCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1sSmQtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYxMDAzOCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctbEplZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HLWxKZU9mWEVkdXFIb09KYlVSWlJ3IiB4PSItNzE3IiB5PSItMzkxIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWxKZXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYxMDAzOCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctbEpmT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRy1sSmUtZlhFZHVxSG9PSmJVUlpSdyIgeD0iNzM4IiB5PSItMzUzIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWxKZmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MTAwMzYiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWxKZi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HLWxKZnVmWEVkdXFIb09KYlVSWlJ3IiB4PSItMzI4IiB5PSItMjk3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWxKZ09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYxMDAzNiI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctbEpndWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HLWxKZ2VmWEVkdXFIb09KYlVSWlJ3IiB4PSItMjM3IiB5PSItMjU0Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWxKZy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjEwMDM4Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1sSmhlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctbEpodWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRy1sSmhPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1sSmgtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjEwMDM2Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1sSmllZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctbEppdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRy1sSmlPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1sSmktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MTAwMzgiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWxKamVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy1sSmp1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HLWxKak9mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWxKai1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjEwMDM2Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1sSmtlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy1sSmt1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HLWxKa09mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HLWxKY2VmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIxMjYzMjI1NiIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRy1sSmN1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbODQ3LCA1MDIsIDg0NywgNTAyXSRbODQ3LCAxODAyLCA4NDcsIDE4MDJdJFs2ODgwLCAxODAyLCA2ODgwLCAxODAyXSRbNjg4MCwgMjkxLCA2ODgwLCAyOTFdJFsxNjE0LCAyOTEsIDE2MTQsIDI5MV0iLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRy1sSmstZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYxMDA0OSIgc291cmNlPSJfRy1sSllPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRy1sSllPZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWxKbHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWxKbU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctbEptZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HLWxKbC1mWEVkdXFIb09KYlVSWlJ3IiB4PSI4MzciIHk9Ii01MDgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctbEptdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MTAwNEMiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWxKbk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRy1sSm0tZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTA3MyIgeT0iLTg3MSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1sSm5lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MTAwNEMiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWxKbi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0ctbEpudWZYRWR1cUhvT0piVVJaUnciIHg9Ii02ODYiIHk9Ii0yNzciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctbEpvT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYxMDA0QSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctbEpvdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0ctbEpvZWZYRWR1cUhvT0piVVJaUnciIHg9IjcxMyIgeT0iLTMwOCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1sSm8tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYxMDA0QSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctbEpwZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HLWxKcE9mWEVkdXFIb09KYlVSWlJ3IiB4PSItNzc3IiB5PSItMzMwIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWxKcHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjEwMDRDIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1sSnFPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctbEpxZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRy1sSnAtZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1sSnF1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjEwMDRBIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1sSnJPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctbEpyZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRy1sSnEtZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1sSnJ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MTAwNEMiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWxKc09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy1sSnNlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HLWxKci1mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWxKc3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjEwMDRBIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1sSnRPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy1sSnRlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HLWxKcy1mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HLWxKbE9mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIxMjYzMjI1NiIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRy1sSmxlZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMTYxNCwgNTMsIDE2MTQsIDUzXSRbNjg1MywgNTMsIDY4NTMsIDUzXSRbNjg1MywgLTE5MDUsIDY4NTMsIC0xOTA1XSRbMjM5LCAtMTkwNSwgMjM5LCAtMTkwNV0kWzIzOSwgLTUzMCwgMjM5LCAtNTMwXSIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HLWxKNXVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTEwMkU3IiBzb3VyY2U9Il9HLWxKMXVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HLWxKWU9mWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctbEo2ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctbEo2LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1sSjdPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HLWxKNnVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HLWxKNS1mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HLWxKNk9mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9Ils2NywgLTg4MCwgMTYsIDMzMzVdJFs2NywgLTM0MDMsIDE2LCA4MTJdIi8+DQotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HLXU2WU9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0ctdTZZZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HLXU2WXVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTEwM0I5IiBzb3VyY2U9Il9HLWxKdHVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HLWxKMXVmWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctdTZaZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctdTZaLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy11NmFPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HLXU2WnVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HLXU2WS1mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HLXU2Wk9mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMjAzNywgODAsIDMyNTUsIC03OV0kWy0zNjI1LCA4MCwgMTY2NywgLTc5XSIvPg0KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRy11NmFlZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HLXU2YXVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRy11NmEtZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyODNFRDg5MDM2MiIgc291cmNlPSJfRy1sSjF1ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRy1sSnh1ZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLXU2YnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLXU2Y09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctdTZjZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRy11NmItZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy11NmN1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjgzRUQ4OTAzNjQiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLXU2ZE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRy11NmMtZlhFZHVxSG9PSmJVUlpSdyIgeT0iMzk2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLXU2ZGVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjgzRUQ4OTAzNjQiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLXU2ZC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0ctdTZkdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0zOTciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctdTZlT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyODNFRDg5MDM2MyI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctdTZldWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0ctdTZlZWZYRWR1cUhvT0piVVJaUnciIHg9Ii0xNjgiIHk9Ii0xODciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctdTZlLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjgzRUQ4OTAzNjMiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLXU2ZmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRy11NmZPZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTIwNyIgeT0iMTUzMSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy11NmZ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyODNFRDg5MDM2NCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctdTZnT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLXU2Z2VmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0ctdTZmLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctdTZndWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyODNFRDg5MDM2MyI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctdTZoT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLXU2aGVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0ctdTZnLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctdTZodWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI4M0VEODkwMzY0Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy11NmlPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctdTZpZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRy11NmgtZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy11Nml1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyODNFRDg5MDM2MyI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctdTZqT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctdTZqZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRy11NmktZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRy11NmJPZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRy11NmJlZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbODQsIDg4MCwgLTE2LCAtMTgxMV0kWzg0LCAyMTI1LCAtMTYsIC01NjddIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgIDwvY29udGVudHM+DQotICAgICAgICAgICAgPGNvbnRlbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpEaWFncmFtIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTBBQjY2MDAzOUIiIHR5cGU9IkNsYXNzIiBuYW1lPSJQcm9jZXNzQ29tcG9uZW50Ij4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLXU2anVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMEU2Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctdTZrZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HLXU2a3VmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLXU2ay1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLXU2bE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLXU2bGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctdTZsdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctdTZsLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctdTZtT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctdTZtZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctdTZtdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctdTZtLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctdTZuT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLXU2bmVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0ctdTZqLWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0ctdTZrT2ZYRWR1cUhvT0piVVJaUnciIHg9IjQwODkiIHk9Ijc0NzYiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy11Nm51ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDBFRiI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLXU2b2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRy11Nm91ZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy11Nm8tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy11NnBPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy11NnBlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLXU2cHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLXU2cC1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLXU2cU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLXU2cWVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLXU2cXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLXU2cS1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLXU2ck9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy11NnJlZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HLXU2bi1mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HLXU2b09mWEVkdXFIb09KYlVSWlJ3IiB4PSIzNTEzIiB5PSI0NTgwIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctdTZ0LWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxNTMiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy11NnV1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0ctdTZ1LWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctdTZ2T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctdTZ2ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctdTZ2dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy11NnYtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy11NndPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy11NndlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy11Nnd1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy11NnctZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy11NnhPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy11NnhlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctdTZ4dWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRy11NnVPZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRy11NnVlZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTUzOTIiIHk9IjIzNTMiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy00RVVPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDAwOSI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLTRFVS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRy00RVZPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy00RVZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy00RVZ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy00RVYtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLTRFV09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLTRFV2VmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLTRFV3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLTRFVy1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLTRFWE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLTRFWGVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLTRFWHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy00RVgtZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HLTRFVWVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HLTRFVXVmWEVkdXFIb09KYlVSWlJ3IiB4PSI3NDY3IiB5PSIxMDMyMCIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLTRFYWVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDQ1Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctNEViT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HLTRFYmVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLTRFYnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLTRFYi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLTRFY09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctNEVjZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctNEVjdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctNEVjLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctNEVkT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctNEVkZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctNEVkdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctNEVkLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLTRFZU9mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0ctNEVhdWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0ctNEVhLWZYRWR1cUhvT0piVVJaUnciIHg9IjEwMzEyIiB5PSI3NDQyIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctNEVndWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxNzEiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy00RWhlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0ctNEVodWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctNEVoLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctNEVpT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctNEVpZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy00RWl1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy00RWktZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy00RWpPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy00RWplZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy00RWp1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy00RWotZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy00RWtPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctNEVrZWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRy00RWctZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRy00RWhPZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTk1NTgiIHk9IjczOTEiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy00RTRlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxMDU4MUUzMDM0MiI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLTRFNU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRy00RTVlZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy00RTV1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy00RTUtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy00RTZPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLTRFNmVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLTRFNnVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLTRFNi1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLTRFN09mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLTRFN2VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLTRFN3VmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLTRFNy1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy00RThPZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HLTRFNHVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HLTRFNC1mWEVkdXFIb09KYlVSWlJ3IiB4PSIxMTUxIiB5PSIxMDMzNyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLTRFLXVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDlGIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctNEVfZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HLTRFX3VmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMjY3NSIgaGVpZ2h0PSIxMTAwIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLTRFXy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLTRGQU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLTRGQWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfQjFVT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0dfQjFVZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfQjFVdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0dfQjFVLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfQjFWT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0dfQjFWZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfQjFWdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HX0IxVi1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0ctNEUtLWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0ctNEVfT2ZYRWR1cUhvT0piVVJaUnciIHg9IjIwNjU4IiB5PSIxNTMyIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfQjFXT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxNjciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19CMVctZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0dfQjFYT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfQjFYZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfQjFYdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfQjFYLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19CMVlPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfR19CMVllZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19CMVl1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfR19CMVktZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19CMVpPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfR19CMVplZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19CMVp1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0dfQjFaLWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfR19CMVdlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfR19CMVd1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMjAyMDkiIHk9IjQyOTIiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxEaWFncmFtU3R5bGUiIHhtaTppZD0iX0duVnVJdWZYRWR1cUhvT0piVVJaUnciIGRlc2NyaXB0aW9uPSJUaGlzIGRpYWdyYW0gcHJvdmlkZXMgYW4gb3ZlcnZpZXcgdG8gdGhlIHNwZWNpZmljYXRpb24gb2YgUHJvY2VzcyBDb21wb25lbnRzLiIvPg0KLSAgICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0ctdTZydWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyOEYiIHNvdXJjZT0iX0ctdTZqdWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0ctdTZudWZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy11NnNlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy11NnMtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLXU2dE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0ctdTZzdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0ctdTZyLWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRy11NnNPZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMCwgLTU1OCwgMCwgMjMzNl0kWzAsIC0yMzQ1LCAwLCA1NTBdIi8+DQotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HLXU2dGVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0ctdTZ0dWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HLTRFWU9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzAzIiBzb3VyY2U9Il9HLTRFVU9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HLXU2anVmWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctNEVZLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctNEVaZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy00RVp1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HLTRFWk9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HLTRFWWVmWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0ctNEVZdWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy03MTEsIC01NTgsIDI4OTUsIDIyODZdJFstMjkxMiwgLTIyOTQsIDY5NCwgNTUwXSIvPg0KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRy00RVotZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HLTRFYU9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRy00RWVlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDNENiIgc291cmNlPSJfRy00RWFlZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRy11Nmp1ZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLTRFZk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLTRFZnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctNEVmLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRy00RWZlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRy00RWV1ZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRy00RWUtZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTIwMzIsIDgsIDUwODAsIC00Ml0kWy01OTY5LCA4LCAxMTQzLCAtNDJdIi8+DQotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HLTRFZ09mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0ctNEVnZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HLTRFa3VmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTEwM0NEIiBzb3VyY2U9Il9HLTRFVU9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HLTRFZ3VmWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctNEVsZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctNEVsLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy00RW1PZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HLTRFbHVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLTRFbWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTEwM0QwIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy00RW0tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0ctNEVtdWZYRWR1cUhvT0piVVJaUnciIHg9Ii0xNjg0IiB5PSItMjk0Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLTRFbk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkxMDNEMCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctNEVudWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRy00RW5lZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTAyIiB5PSIzMTMiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctNEVuLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkxMDNDRSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctNEVvZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0ctNEVvT2ZYRWR1cUhvT0piVVJaUnciIHg9IjE0NTciIHk9IjIzNyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy00RW91ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MTAzQ0UiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLTRFcE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRy00RW8tZlhFZHVxSG9PSmJVUlpSdyIgeD0iNjk1IiB5PSItMzQ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLTRFcGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTEwM0QwIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy00RXAtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctNEVxT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRy00RXB1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy00RXFlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTEwM0NFIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy00RXEtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctNEVyT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRy00RXF1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy00RXJlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MTAzRDAiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLTRFci1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy00RXNPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HLTRFcnVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLTRFc2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTEwM0NFIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy00RXMtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy00RXRPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HLTRFc3VmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HLTRFay1mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HLTRFbE9mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlsxMzcxLCAtOTMsIC0xMTczNCwgMjkwNF0kWzEzMDY0LCAtOTMsIC00MiwgMjkwNF0kWzEzMDY0LCAtMjUxNCwgLTQyLCA0ODJdIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0ctNEV0ZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTAxNkIxQTAzMUUiIHNvdXJjZT0iX0ctNEVndWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0ctNEVhZWZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy00RXVPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy00RXV1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLTRFdS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0ctNEV1ZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctNEV2T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTAxNkIxQjAyMTkiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLTRFdnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRy00RXZlZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTI1MiIgeT0iLTI5NyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy00RXYtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDEwMTZCMUIwMjE5Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy00RXdlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HLTRFd09mWEVkdXFIb09KYlVSWlJ3IiB5PSItMzk3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLTRFd3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTAxNkIxQjAxRDMiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLTRFeE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HLTRFdy1mWEVkdXFIb09KYlVSWlJ3IiB4PSIyMzUiIHk9IjE5NCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy00RXhlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxMDE2QjFCMDFEMyI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctNEV4LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HLTRFeHVmWEVkdXFIb09KYlVSWlJ3IiB4PSItNjgxIiB5PSItMzA0Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLTRFeU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDEwMTZCMUIwMjE5Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy00RXl1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctNEV5LWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRy00RXllZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy00RXpPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDEwMTZCMUIwMUQzIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy00RXp1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctNEV6LWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRy00RXplZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy00RTBPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTAxNkIxQjAyMTkiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLTRFMHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy00RTAtZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HLTRFMGVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLTRFMU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDEwMTZCMUIwMUQzIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy00RTF1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy00RTEtZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HLTRFMWVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HLTRFdHVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HLTRFdC1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMjM4NywgNTAsIDcyMTMsIC01MF0kWy03NTY5LCA1MCwgMjAzMiwgLTUwXSIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HLTRFMk9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDEwMUJENkEwMjNCIiBzb3VyY2U9Il9HLTRFZ3VmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HLXU2bnVmWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctNEUyLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctNEUzZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy00RTN1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HLTRFM09mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HLTRFMmVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HLTRFMnVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMjA5MSwgLTQ4MiwgMTQ2MjEsIDIyNjBdJFstMjA5MSwgLTI0OTcsIDE0NjIxLCAyNDVdJFstMTQ5OTQsIC0yNDk3LCAxNzE4LCAyNDVdIi8+DQotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HLTRFMy1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0ctNEU0T2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HLTRFOGVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDEwNTgyMUIwMDg3IiBzb3VyY2U9Il9HLTRFNGVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HLXU2anVmWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctNEU5T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctNEU5dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy00RTktZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HLTRFOWVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HLTRFOHVmWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0ctNEU4LWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzI2MiwgLTQ5MSwgLTEzMTIsIDIzMDJdJFsxMjQ0LCAtMjI0MywgLTMzMCwgNTUwXSIvPg0KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRy00RS1PZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HLTRFLWVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfR19CMWFPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkxMDNCOSIgc291cmNlPSJfR19CMVdPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRy11NnQtZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX0IxYS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX0IxYmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfQjFidWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfR19CMWJPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfR19CMWFlZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HX0IxYXVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMTI1MywgLTQ5MSwgMzcyNSwgMTQzOV0kWy0zNjk5LCAtMTQzOSwgMTI3OCwgNDkxXSIvPg0KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfR19CMWItZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HX0IxY09mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfR19CMWNlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkxMDNCQSIgc291cmNlPSJfRy00RWd1ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfR19CMVdPZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX0IxZE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX0IxZHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfQjFkLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfR19CMWRlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19CMWVPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkxMDNCRCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfQjFldWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HX0IxZWVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxOTkiIHk9Ii0yOTkiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfQjFlLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTEwM0JEIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19CMWZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HX0IxZk9mWEVkdXFIb09KYlVSWlJ3IiB4PSIxMzciIHk9IjEwMjMiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfQjFmdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkxMDNCQiI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfQjFnT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0dfQjFmLWZYRWR1cUhvT0piVVJaUnciIHg9IjYyIiB5PSItMTYwIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX0IxZ2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTEwM0JCIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19CMWctZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0dfQjFndWZYRWR1cUhvT0piVVJaUnciIHg9IjcwIiB5PSIxMDE2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX0IxaE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTEwM0JEIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19CMWh1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0dfQjFoLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfR19CMWhlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19CMWlPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTEwM0JCIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19CMWl1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0dfQjFpLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfR19CMWllZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19CMWpPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MTAzQkQiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX0IxanVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfR19CMWotZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HX0IxamVmWEVkdXFIb09KYlVSWlJ3IiB4PSI3OTQiIHk9Ijk3OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19CMWtPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkxMDNCQiI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfQjFrdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0dfQjFrLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfR19CMWtlZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfR19CMWN1ZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HX0IxYy1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlswLCAtNDkxLCAwLCAyNjA3XSRbMCwgLTI2MTYsIDAsIDQ4Ml0iLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfR19CMWxPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxMDU4OUUyMDA0RCIgc291cmNlPSJfRy00RTRlZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfR19CMVdPZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX0IxbC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX0IxbWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfQjFtdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfR19CMW1PZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19CMW0tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxMDU4OUUzMDEzQyI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfQjFuZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HX0Ixbk9mWEVkdXFIb09KYlVSWlJ3IiB4PSItMzg3MiIgeT0iLTc3OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19CMW51ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDEwNTg5RTMwMTNDIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19CMW9PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HX0Ixbi1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMzk3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX0Ixb2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTA1ODlFMzAxMTQiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX0Ixby1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HX0Ixb3VmWEVkdXFIb09KYlVSWlJ3IiB4PSIxNzMzIiB5PSItMzAwMCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19CMXBPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTA1ODlFMzAxMTQiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX0IxcHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfR19CMXBlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTM5NyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19CMXAtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxMDU4OUUzMDEzQyI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfQjFxZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HX0IxcXVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0dfQjFxT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfQjFxLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxMDU4OUUzMDExNCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfQjFyZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HX0IxcnVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0dfQjFyT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfQjFyLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDEwNTg5RTMwMTNDIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19CMXNlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0dfQjFzdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfR19CMXNPZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19CMXMtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxMDU4OUUzMDExNCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfQjF0ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0dfQjF0dWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfR19CMXRPZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfR19CMWxlZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfR19CMWx1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMzM4LCA0ODIsIC0xNzk0OSwgNjUyN10kWzMzOCwgMTY0MiwgLTE3OTQ5LCA3Njg3XSRbMjM1NTQsIDE2NDIsIDUyNjYsIDc2ODddJFsyMzU1NCwgLTYyNTYsIDUyNjYsIC0yMTFdJFsyMDAyMywgLTYyNTYsIDE3MzUsIC0yMTFdIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0dfQjF0LWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdCRjQzOTAxQkIiIHNvdXJjZT0iX0dfQjFXT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0ctNEUtdWZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19CMXV1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19CMXZPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX0IxdmVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0dfQjF1LWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfQjF2dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdCRjQzQTAzOUQiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX0Ixd09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfR19CMXYtZlhFZHVxSG9PSmJVUlpSdyIgeD0iNDE0IiB5PSIxOTIiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfQjF3ZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0JGNDNBMDM5RCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfQjF3LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfR19CMXd1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTM5NyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19CMXhPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QkY0M0EwMzJGIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19CMXh1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfR19CMXhlZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTIzOCIgeT0iMTg1Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX0IxeC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QkY0M0EwMzJGIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19CMXllZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0dfQjF5T2ZYRWR1cUhvT0piVVJaUnciIHg9Ii0yMDkiIHk9Ii03MzYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfQjF5dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdCRjQzQTAzOUQiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX0Ixek9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfR19CMXplZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HX0IxeS1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX0IxenVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdCRjQzQTAzMkYiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX0IxME9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfR19CMTBlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HX0Ixei1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX0IxMHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0JGNDNBMDM5RCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfQjExT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HX0IxMWVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0dfQjEwLWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfQjExdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdCRjQzQTAzMkYiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX0IxMk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HX0IxMmVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0dfQjExLWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0dfQjF1T2ZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0dfQjF1ZWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzUwLCAtNDgyLCAwLCAyMjA5XSRbNTAsIC0yMTQyLCAwLCA1NTBdIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgIDwvY29udGVudHM+DQotICAgICAgICAgIDwvZUFubm90YXRpb25zPg0KLSAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dtNUNJLWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUUwRDBFRDAxMDQiPg0KLSAgICAgICAgICAgIDxib2R5PjAzPC9ib2R5Pg0KLSAgICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgICAgPHBhY2thZ2VNZXJnZSB4bWk6aWQ9Il9yMFZSSU94aEVkdUhqZTNwUGFoTjRBIiBtZXJnZWRQYWNrYWdlPSJfM0FEQzdCNzQwMjJENDFERjJBMUIwMkU3Ii8+DQotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMTY3IiBuYW1lPSJQcm9jZXNzQ29tcG9uZW50Ij4NCi0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dtNUNMZWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxNjciPg0KLSAgICAgICAgICAgICAgPGJvZHk+QSBQcm9jZXNzIENvbXBvbmVudCBpcyBhIHNwZWNpYWwgUHJvY2VzcyBQYWNrYWdlIHRoYXQgYXBwbGllcyB0aGUgcHJpbmNpcGxlcyBvZiBlbmNhcHN1bGF0aW9uLiAgQSBQcm9jZXNzIENvbXBvbmVudCByZWFsaXplcyBvbmUgb3IgbW9yZSBJbnRlcmZhY2VzIHdoaWNoIHNwZWNpZnkgaW5wdXRzIGFuZCBvdXRwdXRzIG9mIHRoZSBjb21wb25lbnQuIFRoZXJlIG1pZ2h0IGJlIG1hbnkgY29tcG9uZW50cyByZWFsaXppbmcgdGhlIHNhbWUgaW50ZXJmYWNlcywgYnV0IHVzaW5nIGRpZmZlcmVudCB0ZWNobmlxdWVzIHRvIGFjaGlldmUgc2ltaWxhciBvdXRwdXRzIGZvciBzaW1pbGFyIGlucHV0cy4gIFdoZXJlYXMgdGhlIENvbXBvbmVudCBJbnRlcmZhY2VzIHJlcHJlc2VudCBjb21wb25lbnQgc3BlY2lmaWNhdGlvbnMgKGJsYWNrIGJveCBkZXNjcmlwdGlvbnMgb2YgdGhlIGNvbXBvbmVudCksIGdvb2QgY2FuZGlkYXRlcyBmb3IgY29tcG9uZW50IHJlYWxpemF0aW9ucyBjYW4gYmUgZm91bmQgaW4gQ2FwYWJpbGl0eSBQYXR0ZXJucyAod2hpdGUgYm94IGRlc2NyaXB0aW9ucyBmb3IgdGhlIGNvbXBvbmVudCkuDQotVU1BIHN1cHBvcnRzIHJlcGxhY2VhYmxlIGFuZCByZXVzYWJsZSBQcm9jZXNzIENvbXBvbmVudHMgcmVhbGl6aW5nIHRoZSBwcmluY2lwbGVzIG9mIGVuY2Fwc3VsYXRpb24uIENlcnRhaW4gc2l0dWF0aW9ucyBpbiBhIHNvZnR3YXJlIGRldmVsb3BtZW50IHByb2plY3QgbWlnaHQgcmVxdWlyZSB0aGF0IGNvbmNyZXRlIHJlYWxpemF0aW9ucyBvZiBwYXJ0cyBvZiB0aGUgcHJvY2VzcyByZW1haW4gdW5kZWNpZGVkIG9yIHdpbGwgYmUgZGVjaWRlZCBieSB0aGUgZXhlY3V0aW5nIHRlYW0gaXRzZWxmIChlLmcuIGluIG91dHNvdXJjaW5nIHNpdHVhdGlvbnMpLiAgVU1BIHByb3ZpZGVzIGEgdW5pcXVlIGNvbXBvbmVudCBjb25jZXB0IGRlZmluaW5nIGludGVyZmFjZXMgZm9yIHdvcmsgcHJvZHVjdCBpbnB1dCBhbmQgb3V0cHV0LCBhbGxvd2luZyB0cmVhdGluZyB0aGUgYWN0dWFsIGRlZmluaXRpb24gb2YgdGhlIHdvcmsgdGhhdCBwcm9kdWNlcyB0aGUgb3V0cHV0cyBhcyBhICZxdW90O2JsYWNrIGJveCZxdW90Oy4gIEF0IGFueSBwb2ludCBkdXJpbmcgYSBwcm9qZWN0IHRoZSBjb21wb25lbnQgJnF1b3Q7cmVhbGl6YXRpb24mcXVvdDsgZGV0YWlsaW5nIHRoZSB3b3JrIGNhbiBiZSBhZGRlZCB0byB0aGUgcHJvY2Vzcy4gIFRoZSBjb21wb25lbnQgYXBwcm9hY2ggYWxzbyBhbGxvd3MgdGhhdCBkaWZmZXJlbnQgc3R5bGVzIG9yIHRlY2huaXF1ZXMgb2YgZG9pbmcgd29yayBjYW4gYmUgcmVwbGFjZWQgd2l0aCBvbmUgYW5vdGhlci4gIEZvciBleGFtcGxlLCBhIHNvZnR3YXJlIGNvZGUgb3V0cHV0IG9mIGEgY29tcG9uZW50IGNvdWxkIGJlIHByb2R1Y2VkIHdpdGggYSBtb2RlbC1kcml2ZW4gZGV2ZWxvcG1lbnQgb3IgYSBjb2RlLWNlbnRyaWMgdGVjaG5pcXVlLiAgVGhlIGNvbXBvbmVudCBjb25jZXB0IGVuY2Fwc3VsYXRlcyB0aGUgYWN0dWFsIHdvcmsgYW5kIGxldHMgdGhlIGRldmVsb3BtZW50IHRlYW0gY2hvb3NlIHRoZSBhcHByb3ByaWF0ZSB0ZWNobmlxdWUgYW5kIGZpbGwgdGhlIGNvbXBvbmVudCdzIHJlYWxpemF0aW9uIHdpdGggdGhlaXIgY2hvaWNlIG9mIEFjdGl2aXRpZXMgdGhhdCBwcm9kdWNlIHRoZSByZXF1aXJlZCBvdXRwdXRzLg0KLTwvYm9keT4NCi0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDOTEwM0I5IiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMTUzIj4NCi0gICAgICAgICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfb0NRcGNPLWRFZHU1T09lankwNjI0dyIgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3VtbDIvMi4wLjAvVU1MIj4NCi0gICAgICAgICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfb0NRcGNlLWRFZHU1T09lankwNjI0dyIga2V5PSJleHRlbmQiLz4NCi0gICAgICAgICAgICAgIDwvZUFubm90YXRpb25zPg0KLSAgICAgICAgICAgIDwvZ2VuZXJhbGl6YXRpb24+DQotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkxMDNCRCIgbmFtZT0iaW50ZXJmYWNlcyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMTcxIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQwRjM2QzkxMDNCQSI+DQotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HbkNNSXVmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR25DTUllZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IjEiLz4NCi0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MjdCRjQzQTAzMkYiIG5hbWU9InByb2Nlc3MiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDA5RiIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MjdCRjQzOTAxQkIiPg0KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR25WdUUtZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IjEiLz4NCi0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0duVnVFdWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIxIi8+DQotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDEwNTgxRTMwMzQyIiBuYW1lPSJQcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvciI+DQotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HbTVDTWVmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDEwNTgxRTMwMzQyIj4NCi0gICAgICAgICAgICAgIDxib2R5PkEgUHJvY2VzcyBDb21wb25lbnQgRGVzY3JpcHRvciByZXByZXNlbnRzIGEgUHJvY2VzcyBDb21wb25lbnQgYXBwbGljYXRpb24gaW4gYSBQcm9jZXNzLCBpLmUuIHRoZSBicmVha2Rvd24gc3RydWN0dXJlIGRlZmluaW5nIHRoZSBQcm9jZXNzLiAgVGhlIFByb2Nlc3MgQ29tcG9uZW50IERlc2NyaXB0b3IgaXMgdXNlZCB0byBlbmNhcHN1bGF0ZSB0aGUgZGV0YWlscyBvZiB0aGUgY29tcG9uZW50IGluIGEgYnJlYWtkb3duIHN0cnVjdHVyZSBhbmQgdG8gcHJvdmlkZSBpdHMgb3duIHNldCBvZiByZWxhdGlvbnNoaXBzIHN1Y2ggYXMgaXQgb3duIHByZWRlY2Vzc29ycyBhbmQgc3VjY2Vzc29ycy48L2JvZHk+DQotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxMDU4MjFCMDA4NyIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDBFNiIvPg0KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTA1ODlFMzAxMTQiIG5hbWU9Il9wcm9jZXNzQ29tcG9uZW50IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxNjciIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MTA1ODlFMjAwNEQiPg0KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR25MOUplZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IjEiLz4NCi0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0duTDlKT2ZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIxIi8+DQotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMTcxIiBuYW1lPSJQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlIj4NCi0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0duQ01FLWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxNzEiPg0KLSAgICAgICAgICAgICAgPGJvZHk+QSBQcm9jZXNzIENvbXBvbmVudCBJbnRlcmZhY2UgY29tcHJpc2VzIG9mIGEgbGlzdCBvZiBpbnRlcmZhY2Ugc3BlY2lmaWNhdGlvbnMgKHNpbWlsYXIgdG8gb3BlcmF0aW9uIGRlY2xhcmF0aW9ucykgdGhhdCBleHByZXNzIGlucHV0cyBhbmQgb3V0cHV0cyBmb3IgYSBwcm9jZXNzIGNvbXBvbmVudC4gIFRoZXNlIGludGVyZmFjZSBzcGVjaWZpY2F0aW9ucyBhcmUgZXhwcmVzc2VkIHVzaW5nIFRhc2sgRGVzY3JpcHRvcnMgd2hpY2ggYXJlIG5vdCBsaW5rZWQgdG8gVGFza3MgdGhhdCBhcmUgcmVsYXRlZCB0byBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvcnMgYXMgd2VsbCBhcyBvcHRpb25hbCBhIFJvbGUgRGVzY3JpcHRvci48L2JvZHk+DQotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxMDFCRDZBMDIzQiIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDBFRiIvPg0KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MTAzRDAiIG5hbWU9ImludGVyZmFjZVNwZWNpZmljYXRpb25zIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwMDkiIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDBGMzZDOTEwM0NEIj4NCi0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0duTDlGdWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+DQotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9Hbkw5RmVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDEwMTZCMUIwMUQzIiBuYW1lPSJpbnRlcmZhY2VJTyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDQ1IiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQxMDE2QjFBMDMxRSI+DQotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9Hbkw5SE9mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR25MOUctZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDE1MyIgbmFtZT0iUHJvY2Vzc1BhY2thZ2UiPg0KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR25DTUYtZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDE1MyI+DQotICAgICAgICAgICAgICA8Ym9keT5Qcm9jZXNzIFBhY2thZ2UgaXMgYSBzcGVjaWFsIE1ldGhvZCBQYWNrYWdlIHRoYXQgY29udGFpbnMgUHJvY2VzcyBFbGVtZW50cywgb25seS4NCi1BIGtleSBzZXBhcmF0aW9uIG9mIGNvbmNlcm5zIGluIFVNQSBpcyB0aGUgZGlzdGluY3Rpb24gYmV0d2VlbiBNZXRob2QgQ29udGVudCBhbmQgUHJvY2Vzcy4gIFRoaXMgc2VwYXJhdGlvbiBpcyBlbmZvcmNlZCBieSBzcGVjaWFsIHBhY2thZ2UgdHlwZXMsIHdoaWNoIGRvIG5vdCBhbGxvdyB0aGUgbWl4aW5nIG9mIG1ldGhvZCBjb250ZW50IHdpdGggcHJvY2Vzc2VzLg0KLTwvYm9keT4NCi0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDOTEwMkU3IiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMTNGIi8+DQotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyODNFRDg5MDM2MyIgbmFtZT0icHJvY2Vzc0VsZW1lbnRzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MjgzRThBMTAzNDEiIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDI4M0VEODkwMzYyIj4NCi0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0duVnVIT2ZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+DQotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HblZ1Ry1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDOTEwM0JBIiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MTAzQkIgXzNBREM3Qjc0MDIyRDQwRjM2QzkxMDNCRCI+DQotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HbkNNRy1mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTEwM0JBIj4NCi0gICAgICAgICAgICAgIDxib2R5PlRoaXMgYXNzb2NpYXRpb24gZGVzY3JpYmVzIHRoZSByZWFsaXphdGlvbiByZWxhdGlvbnNoaXBzIGJldHdlZW4gYSBQcm9jZXNzIENvbXBvbmVudCBhbmQgYSBQcm9jZXNzIENvbXBvbmVudCBJbnRlcmZhY2UuPC9ib2R5Pg0KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MTAzQkIiIG5hbWU9InJlYWxpemVkQnkiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDE2NyIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MEYzNkM5MTAzQkEiPg0KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR25DTUgtZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4NCi0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0duQ01IdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICA8L293bmVkRW5kPg0KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MTAzQ0QiIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkxMDNDRSBfM0FEQzdCNzQwMjJENDBGMzZDOTEwM0QwIj4NCi0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0duQ01KT2ZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MTAzQ0QiPg0KLSAgICAgICAgICAgICAgPGJvZHk+SW5zdGFuY2VzIG9mIHRoaXMgYXNzb2NpYXRpb24gY29udGFpbiB0aGUgbGlzdCBvZiBUYXNrIERlc2NyaXB0b3JzIHRoYXQgcmVwcmVzZW50IGEgUHJvY2VzcyBDb21wb25lbnQgSW50ZXJmYWNlLjwvYm9keT4NCi0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgICAgICA8b3duZWRFbmQgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDOTEwM0NFIiBuYW1lPSJfcHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSIgdmlzaWJpbGl0eT0icHJpdmF0ZSIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDE3MSIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQwRjM2QzkxMDNDRCI+DQotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9Hbkw5RS1mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iMSIvPg0KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR25MOUV1ZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IjEiLz4NCi0gICAgICAgICAgICA8L293bmVkRW5kPg0KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTAxNkIxQTAzMUUiIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQxMDE2QjFCMDFEMyBfM0FEQzdCNzQwMjJENDEwMTZCMUIwMjE5Ij4NCi0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0duTDlHT2ZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTAxNkIxQTAzMUUiPg0KLSAgICAgICAgICAgICAgPGJvZHk+VGhpcyBhc3NvY2lhdGlvbiBjb250YWlucyB0aGUgaW5wdXQgYW5kIG91dHB1dCBXb3JrIFByb2R1Y3QgdHlwZSBpbnN0YW5jZXMgdXNlZCBmb3IgdGhlIGludGVyZmFjZSBzcGVjaWZpY2F0aW9uLjwvYm9keT4NCi0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgICAgICA8b3duZWRFbmQgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDEwMTZCMUIwMjE5IiBuYW1lPSJfcHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMTcxIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDEwMTZCMUEwMzFFIj4NCi0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0duTDlILWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIxIi8+DQotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9Hbkw5SHVmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iMSIvPg0KLSAgICAgICAgICAgIDwvb3duZWRFbmQ+DQotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxMDU4OUUyMDA0RCIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDEwNTg5RTMwMTE0IF8zQURDN0I3NDAyMkQ0MTA1ODlFMzAxM0MiPg0KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR25MOUllZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxMDU4OUUyMDA0RCI+DQotICAgICAgICAgICAgICA8Ym9keT5UaGlzIGFzc29jaWF0aW9uIHJlcHJlc2VudHMgdGhlIHJlZmVyZW5jZSBmcm9tIHRoZSBkZXNjcmlwdG9yIHRvIHRoZSBQcm9jZXNzIENvbXBvbmVudCBpdCByZWZlcnMgdG8uICBBIFByb2Nlc3MgQ29tcG9uZW50IERlc2NyaXB0b3IgcmVwcmVzZW50cyBleGFjdGx5IG9uZSBQcm9jZXNzIENvbXBvbmVudC48L2JvZHk+DQotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxMDU4OUUzMDEzQyIgbmFtZT0iX3Byb2Nlc3NDb21wb25lbnREZXNjcmlwdG9yIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MTA1ODFFMzAzNDIiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MTA1ODlFMjAwNEQiPg0KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR25MOUtPZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4NCi0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0duTDlKLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICA8L293bmVkRW5kPg0KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MjdCRjQzOTAxQkIiIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQyN0JGNDNBMDMyRiBfM0FEQzdCNzQwMjJENDI3QkY0M0EwMzlEIj4NCi0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0duTDlLdWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdCRjQzOTAxQkIiPg0KLSAgICAgICAgICAgICAgPGJvZHk+QSBQcm9jZXNzIENvbXBvbmVudCBjb250YWlucyBvbmx5IGV4YWN0bHkgb25lIFByb2Nlc3MuPC9ib2R5Pg0KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MjdCRjQzQTAzOUQiIG5hbWU9Il9wcm9jZXNzQ29tcG9uZW50IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxNjciIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MjdCRjQzOTAxQkIiPg0KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR25WdUZ1ZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IjEiLz4NCi0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0duVnVGZWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIxIi8+DQotICAgICAgICAgICAgPC9vd25lZEVuZD4NCi0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDI4M0VEODkwMzYyIiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0MjgzRUQ4OTAzNjMgXzNBREM3Qjc0MDIyRDQyODNFRDg5MDM2NCI+DQotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HblZ1R09mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDI4M0VEODkwMzYyIj4NCi0gICAgICAgICAgICAgIDxib2R5PkEgUHJvY2VzcyBQYWNrYWdlIGNvbnRhaW5zIFByb2Nlc3MgRWxlbWVudHMgd2hpY2ggYXJlIHVzZWQgdG8gZGVmaW5lIEJyZWFrZG93biBhbmQgUHJvY2Vzc2VzLiAgQSBQcm9jZXNzIEVsZW1lbnQgaW5zdGFuY2UgY2FuIGJlIHBhcnQgb2Ygb25seSBvbmUgUHJvY2VzcyBQYWNrYWdlIGluc3RhbmNlLjwvYm9keT4NCi0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgICAgICA8b3duZWRFbmQgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDI4M0VEODkwMzY0IiBuYW1lPSJfcHJvY2Vzc1BhY2thZ2UiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDE1MyIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQyODNFRDg5MDM2MiIvPg0KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOlBhY2thZ2UiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxREYyQTFCMDJFNyIgbmFtZT0iUHJvY2Vzc0Rlc2NyaXB0aW9ucyI+DQotICAgICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfR29PZTUtZlhFZHVxSG9PSmJVUlpSdyIgc291cmNlPSJ1bWwyLmRpYWdyYW1zIiByZWZlcmVuY2VzPSJfM0FEQzdCNzQwMjJENDFFRDY4MkIwMTcwIj4NCi0gICAgICAgICAgICA8Y29udGVudHMgeG1pOnR5cGU9Im5vdGF0aW9uOkRpYWdyYW0iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxRUQ2ODJCMDE3MCIgdHlwZT0iQ2xhc3MiIG5hbWU9Ik1haW4iPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfTG1kdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUUxMDQxMTAzODciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19MbWVlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0dfTG1ldWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIzNDM3IiBoZWlnaHQ9IjE5OTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfTG1lLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfTG1mT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfTG1mZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19MbWZ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HX0xtZi1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX0xtZ09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HX0xtZ2VmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX0xtZ3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HX0xtZy1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX0xtaE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfR19MbWhlZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HX0xtZC1mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9Ik5vbmUiIHNob3dMaXN0VmlzaWJpbGl0eT0iTm9uZSIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HX0xtZU9mWEVkdXFIb09KYlVSWlJ3IiB4PSI1MzkzIiB5PSI4ODA1Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfTG1odWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUUwRDFCNjAwRDgiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19MbWllZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0dfTG1pdWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSI1MTQ3IiBoZWlnaHQ9IjExNTEiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfTG1pLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfTG1qT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfTG1qZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19MbWp1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HX0xtai1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX0xta09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HX0xta2VmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX0xta3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HX0xtay1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX0xtbE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfR19MbWxlZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HX0xtaC1mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9Ik5vbmUiIHNob3dMaXN0VmlzaWJpbGl0eT0iTm9uZSIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HX0xtaU9mWEVkdXFIb09KYlVSWlJ3IiB4PSIyMzUzIiB5PSI2MzgzIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfTG1sdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUUxMDQ1NTAyMDgiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19MbW1lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0dfTG1tdWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSI1NDM1IiBoZWlnaHQ9IjMyNjgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfTG1tLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfTG1uT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfTG1uZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19MbW51ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HX0xtbi1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX0xtb09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HX0xtb2VmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX0xtb3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HX0xtby1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX0xtcE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfR19MbXBlZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HX0xtbC1mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9Ik5vbmUiIHNob3dMaXN0VmlzaWJpbGl0eT0iTm9uZSIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HX0xtbU9mWEVkdXFIb09KYlVSWlJ3IiB4PSI0Nzg4IiB5PSIxNDM2NCIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX0xtcHVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFMTA0NzQwMTFBIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfTG1xZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HX0xtcXVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMzUzOSIgaGVpZ2h0PSIxOTk4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX0xtcS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX0xtck9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX0xtcmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfTG1ydWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfR19MbXItZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19MbXNPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfR19MbXNlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19MbXN1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfR19MbXMtZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19MbXRPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0dfTG10ZWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfR19MbXAtZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJOb25lIiBzaG93TGlzdFZpc2liaWxpdHk9Ik5vbmUiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfR19MbXFPZlhFZHVxSG9PSmJVUlpSdyIgeD0iNTM0MiIgeT0iMTE5NTQiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19Vd1FPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRUQ3QjQ5MDA4NiI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX1V3US1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfR19Vd1JPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjQ0MzYiIGhlaWdodD0iMTE1MSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19Vd1JlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19Vd1J1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19Vd1ItZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX1V3U09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0dfVXdTZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfVXdTdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0dfVXdTLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfVXdUT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0dfVXdUZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfVXdUdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HX1V3VC1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0dfVXdRZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iTm9uZSIgc2hvd0xpc3RWaXNpYmlsaXR5PSJOb25lIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0dfVXdRdWZYRWR1cUhvT0piVVJaUnciIHg9IjU3NSIgeT0iODgyMiIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX1V3VU9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERTRBOTcwMTIzIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfVXdVLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HX1V3Vk9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iNDE4MiIgaGVpZ2h0PSIxNTQwIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX1V3VmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX1V3VnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX1V3Vi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfVXdXT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfR19Vd1dlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19Vd1d1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfR19Vd1ctZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19Vd1hPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfR19Vd1hlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19Vd1h1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0dfVXdYLWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfR19Vd1VlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJOb25lIiBzaG93TGlzdFZpc2liaWxpdHk9Ik5vbmUiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1BhcmVudD0iTmFtZSIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfR19Vd1V1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMjc1NSIgeT0iMTM5NSIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX1V3aE9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3OTdGNzQwMzkyIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfVXdoLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HX1V3aU9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iNDUzOCIgaGVpZ2h0PSIxNTQwIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX1V3aWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX1V3aXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX1V3aS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfVXdqT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfR19Vd2plZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19Vd2p1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfR19Vd2otZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19Vd2tPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfR19Vd2tlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19Vd2t1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0dfVXdrLWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfR19Vd2hlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJOb25lIiBzaG93TGlzdFZpc2liaWxpdHk9Ik5vbmUiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfR19Vd2h1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMjY1OCIgeT0iMzU5OCIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTERpYWdyYW1TdHlsZSIgeG1pOmlkPSJfR29PZTZlZlhFZHVxSG9PSmJVUlpSdyIgZGVzY3JpcHRpb249IlRoZSBkZWZpbml0aW9uIG9mIHRleHR1YWwgZGVzY3JpcHRpb24gYXR0cmlidXRlcyBhcmUgaGFuZGxlZCBkaWZmZXJlbnRseSBmb3IgUHJvY2Vzc2VzIHRoYW4gZm9yIE1ldGhvZCBDb3JlIENvbnRlbnQgRWxlbWVudHMuICBUaGUgcmF0aW9uYWxlIGZvciB0aGlzIGNhbiBiZSBmb3VuZCBpbiBwYWNrYWdlIE1ldGhvZCBVbml0cyBpbiB3aGljaCB0aGUgZ3JhbnVsYXJpdHkgb2YgTWV0aG9kIFVuaXRzIGZvciB0aGVzZSBlbGVtZW50cyBoYXMgYmVlbiBkZWZpbmVkIGRpZmZlcmVudGx5LiAgV2hlcmVhcyBhIENvbnRlbnQgRGVzY3JpcHRpb24gTWV0aG9kIFVuaXQgaXMgY3JlYXRlZCBmb3IgZXZlcnkgQ29udGVudCBFbGVtZW50LCBQcm9jZXNzIGlzIG1haW50YWluZWQgYXMgYSB3aG9sZSBpbiBhIFByb2Nlc3MgQ29tcG9uZW50IE1ldGhvZCBVbml0LiAgVGhlcmVmb3JlIHRoZSBwYWNrYWdlIE1ldGhvZCBDb3JlIERlc2NyaXB0aW9uIGNvbnRhaW5zIGEgdGF4b25vbXkgb2Ygc3BlY2lhbCBDb250ZW50IERlc2NyaXB0aW9uIHNwZWNpYWxpemF0aW9uIGFuZCB0aGUgUHJvY2VzcyBEZXNjcmlwdGlvbnMgcGFja2FnZSBjb250YWlucyBleHRlbmRlZCB2ZXJzaW9uIG9mIGNsYXNzZXMgZGVmaW5lZCBpbiB0aGUgUHJvY2VzcyBwYWNrYWdlIHdoaWNoIG1lcmdlIG5ldyBhdHRyaWJ1dGVzIGZvciBkZXNjcmlwdGlvbiBpbnRvIHRoZXNlIGNsYXNzZXMgdmlhIHBhY2thZ2UgbWVyZ2UuIi8+DQotICAgICAgICAgICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfR19Vd1lPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyNzk4QzgwMDNCQSIgc291cmNlPSJfR19MbXB1ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfR19MbWR1ZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX1V3WS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX1V3WmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfVXdadWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfR19Vd1pPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfR19Vd1llZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HX1V3WXVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlswLCAtMTAwNywgMCwgMjE0Ml0kWzAsIC0yMTUwLCAwLCA5OTldIi8+DQotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HX1V3Wi1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0dfVXdhT2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HX1V3YWVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3OThDQTQwMkQxIiBzb3VyY2U9Il9HX0xtbHVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HX0xtcHVmWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfVXdiT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfVXdidWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19Vd2ItZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HX1V3YmVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HX1V3YXVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HX1V3YS1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstNTAsIC0xNjQyLCAwLCAyMTE2XSRbLTUwLCAtMjc2MCwgMCwgOTk5XSIvPg0KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfR19Vd2NPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HX1V3Y2VmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfR19Vd2N1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyNzk4Q0U5MDJDQSIgc291cmNlPSJfR19Vd1FPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfR19MbWh1ZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX1V3ZGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX1V3ZC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfVXdlT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfR19Vd2R1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfR19Vd2MtZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfR19Vd2RPZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbODU1LCAtNTg0LCAtMTI3OCwgMTg1NF0kWzg1NSwgLTE4NjIsIC0xMjc4LCA1NzVdIi8+DQotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HX1V3ZWVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0dfVXdldWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HX1V3ZS1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3OThDNkYwMTk3IiBzb3VyY2U9Il9HX0xtZHVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HX0xtaHVmWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfVXdmdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfVXdnT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19Vd2dlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HX1V3Zi1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HX1V3Zk9mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HX1V3ZmVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstNDE0LCAtMTAwNywgMTc2OSwgMTgzN10kWy00MTQsIC0yMjc3LCAxNzY5LCA1NjddIi8+DQotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HX1V3Z3VmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0dfVXdnLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HX1V3bmVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3OThDQ0MwMzZBIiBzb3VyY2U9Il9HX0xtaHVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HX1V3aE9mWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfVXdvT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfVXdvdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19Vd28tZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HX1V3b2VmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HX1V3bnVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HX1V3bi1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstOCwgLTU3NSwgLTgsIDIwMTVdJFstOCwgLTE4MjAsIC04LCA3NzBdIi8+DQotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HX1V3cE9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0dfVXdwZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICA8L2NvbnRlbnRzPg0KLSAgICAgICAgICA8L2VBbm5vdGF0aW9ucz4NCi0gICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HbmU0RHVmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERjJBMUIwMkU3Ij4NCi0gICAgICAgICAgICA8Ym9keT4wNDwvYm9keT4NCi0gICAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgICAgIDxwYWNrYWdlTWVyZ2UgeG1pOmlkPSJfSVp0X01PeE1FZHVPTnJNUmdtejQ4QSIgbWVyZ2VkUGFja2FnZT0iXzNBREM3Qjc0MDIyRDQwRkQ4OTFGMDJDRCIvPg0KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxRTBEMUI2MDBEOCIgbmFtZT0iQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uIj4NCi0gICAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDI3OThDQ0MwMzZBIiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDI3OTdGNzQwMzkyIi8+DQotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxMzc2MjdEMDA4NCIgbmFtZT0idXNhZ2VHdWlkYW5jZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIj4NCi0gICAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR25lNEctZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxMzc2MjdEMDA4NCI+DQotICAgICAgICAgICAgICAgIDxib2R5PlByb3ZpZGVzIGluZm9ybWF0aW9uIGFuZCBndWlkYW5jZSBvbiB0aGUgbWVhbmluZyBvZiB0aGUgQm9vbGVhbiBmbGFnIHZhbHVlcyBhbmQgdW5kZXIgd2hhdCBjaXJjdW1zdGFuY2VzIHRoZXkgc2hvdWxkIGJlIG92ZXJyaWRkZW4uIEZvciBleGFtcGxlLCBpdCBkZXNjcmliZXMgd2h5IHRoZSBicmVha2Rvd24gZWxlbWVudCBpcyBvcHRpb25hbCBvciBjb25zaWRlcmF0aW9ucyBmb3IgcmVwZWF0aW5nIGl0IGFuZCBkaWZmZXJlbmNlcyBpbiB0aGUgaW5kaXZpZHVhbCBvY2N1cnJlbmNlcyBvZiB0aGlzIEJyZWFrZG93biBFbGVtZW50IGFjcm9zcyB0aGUgbGlmZWN5Y2xlLjwvYm9keT4NCi0gICAgICAgICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfRllicndleUpFZHU1LXZWamxmVnNmUSIgdmFsdWU9IjEiLz4NCi0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0ZZYnJ3T3lKRWR1NS12VmpsZlZzZlEiLz4NCi0gICAgICAgICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il9GUVlqQU95SkVkdTUtdlZqbGZWc2ZRIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIiB2YWx1ZT0iIi8+DQotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDFFMTA0MTEwMzg3IiBuYW1lPSJBY3Rpdml0eURlc2NyaXB0aW9uIj4NCi0gICAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDI3OThDNkYwMTk3IiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDFFMEQxQjYwMEQ4Ii8+DQotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDJFNCIgbmFtZT0icHVycG9zZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIj4NCi0gICAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR25vcEJPZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDJFNCI+DQotICAgICAgICAgICAgICAgIDxib2R5PlN1bW1hcml6ZXMgdGhlIG1haW4gcmVhc29uIGZvciBwZXJmb3JtaW5nIHRoaXMgQWN0aXZpdHksIGRlc2NyaWJlcyB3aGF0IHRoZSBhY3Rpdml0eSBhcyBhIHdob2xlIGlzIGludGVuZGVkIHRvIGFjaGlldmUuPC9ib2R5Pg0KLSAgICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il83SkVVd2V5SUVkdTUtdlZqbGZWc2ZRIiB2YWx1ZT0iMSIvPg0KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfN0pFVXdPeUlFZHU1LXZWamxmVnNmUSIvPg0KLSAgICAgICAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iXzZfUERVT3lJRWR1NS12VmpsZlZzZlEiIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiIHZhbHVlPSIiLz4NCi0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAzNTIiIG5hbWU9ImFsdGVybmF0aXZlcyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIj4NCi0gICAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR254eTh1ZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDM1MiI+DQotICAgICAgICAgICAgICAgIDxib2R5PkNvbXByaXNlcyBvZiBzdW1tYXJpZXMgZGVzY3JpYmluZyBpbXBvcnRhbnQgZXhjZXB0aW9uYWwgYW5kIG5vbi1zdGFuZGFyZCB3YXlzIG9mIGRvaW5nIHRoZSB3b3JrIG9mIHRoaXMgQWN0aXZpdHkgbm90IGNvdmVyZWQgYnkgdGhlIEFjdGl2aXR5J3MgVGFza3MuPC9ib2R5Pg0KLSAgICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9aYm5ZSWV5SEVkdTUtdlZqbGZWc2ZRIiB2YWx1ZT0iMSIvPg0KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfWmJuWUlPeUhFZHU1LXZWamxmVnNmUSIvPg0KLSAgICAgICAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iX1pTLVpnT3lIRWR1NS12VmpsZlZzZlEiIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiIHZhbHVlPSIiLz4NCi0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTM3NjI4MzAxNUEiIG5hbWU9Imhvd3RvU3RhZmYiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyI+DQotICAgICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dueHk5ZWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTM3NjI4MzAxNUEiPg0KLSAgICAgICAgICAgICAgICA8Ym9keT5Qcm92aWRlcyBiYWNrZ3JvdW5kIG9uIHdobyBzaG91bGQgYmUgaW52b2x2ZWQgaW4gdGhpcyBhY3Rpdml0eSB3aGF0IGFyZSB0aGUgcmVxdWlyZWQgc2tpbGxzLCBleHBlcmllbmNlLCAgYW5kIHBlcmhhcHMgYXR0aXR1ZGVzLjwvYm9keT4NCi0gICAgICAgICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfWFRyM3dleUdFZHU1LXZWamxmVnNmUSIgdmFsdWU9IjEiLz4NCi0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX1hUcjN3T3lHRWR1NS12VmpsZlZzZlEiLz4NCi0gICAgICAgICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il9YS0poUU95R0VkdTUtdlZqbGZWc2ZRIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIiB2YWx1ZT0iIi8+DQotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDFFMTA0NTUwMjA4IiBuYW1lPSJEZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbiI+DQotICAgICAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyNzk4Q0E0MDJEMSIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQxRTEwNDc0MDExQSIvPg0KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAzNzEiIG5hbWU9InNjYWxlIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiPg0KLSAgICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9Hbnh5LXVmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMzcxIj4NCi0gICAgICAgICAgICAgICAgPGJvZHk+T3V0bGluZXMgY2hhcmFjdGVyaXN0aWNzIGFib3V0IHRoZSBzaXplIG9mIGEgdHlwaWNhbCBwcm9qZWN0IHRoYXQgcGVyZm9ybXMgdGhpcyBwcm9qZWN0IGV4cHJlc3NlZCBpbiB0ZWFtIHNpemUsIG1hbiB5ZWFycywgZXRjLjwvYm9keT4NCi0gICAgICAgICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfY2xNMHNleUdFZHU1LXZWamxmVnNmUSIgdmFsdWU9IjEiLz4NCi0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX2NsTTBzT3lHRWR1NS12VmpsZlZzZlEiLz4NCi0gICAgICAgICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il9jYWVMWU95R0VkdTUtdlZqbGZWc2ZRIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIiB2YWx1ZT0iIi8+DQotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMzdBIiBuYW1lPSJwcm9qZWN0Q2hhcmFjdGVyaXN0aWNzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiPg0KLSAgICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9Hbnh5X2VmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMzdBIj4NCi0gICAgICAgICAgICAgICAgPGJvZHk+Q2hhcmFjdGVyaXplcyB0aGUgcHJvamVjdCB0aGF0IHdvdWxkIHR5cGljYWxseSBwZXJmb3JtIHRoaXMgUHJvY2VzczwvYm9keT4NCi0gICAgICAgICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfNkxPemdleUlFZHU1LXZWamxmVnNmUSIgdmFsdWU9IjEiLz4NCi0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iXzZMT3pnT3lJRWR1NS12VmpsZlZzZlEiLz4NCi0gICAgICAgICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il82RExxd095SUVkdTUtdlZqbGZWc2ZRIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIiB2YWx1ZT0iIi8+DQotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMzg0IiBuYW1lPSJyaXNrTGV2ZWwiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyI+DQotICAgICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0duN2o4dWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAzODQiPg0KLSAgICAgICAgICAgICAgICA8Ym9keT5PdXRsaW5lcyB0eXBpY2FsIHByb2plY3Qgcmlza3MgdGhhdCBhcmUgYWRkcmVzc2VkIHdpdGggdGhpcyBwcm9jZXNzLjwvYm9keT4NCi0gICAgICAgICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfZ1Z2Um9leUhFZHU1LXZWamxmVnNmUSIgdmFsdWU9IjEiLz4NCi0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX2dWdlJvT3lIRWR1NS12VmpsZlZzZlEiLz4NCi0gICAgICAgICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il9nNlBzNE95SEVkdTUtdlZqbGZWc2ZRIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIiB2YWx1ZT0iIi8+DQotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMzg1IiBuYW1lPSJlc3RpbWF0aW5nVGVjaG5pcXVlIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiPg0KLSAgICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HbjdqOWVmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMzg1Ij4NCi0gICAgICAgICAgICAgICAgPGJvZHk+RGVzY3JpYmVzIHRoZSBFc3RpbWF0aW9uIFRlY2huaXF1ZXMgcHJvdmlkZWQgZm9yIHRoaXMgUHJvY2Vzcy48L2JvZHk+DQotICAgICAgICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX1lad1NnZXlIRWR1NS12VmpsZlZzZlEiIHZhbHVlPSIxIi8+DQotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9ZWndTZ095SEVkdTUtdlZqbGZWc2ZRIi8+DQotICAgICAgICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfWVBVa0lPeUhFZHU1LXZWamxmVnNmUSIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyIgdmFsdWU9IiIvPg0KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDM4RSIgbmFtZT0icHJvamVjdE1lbWJlckV4cGVydGlzZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIj4NCi0gICAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR243ai1PZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDM4RSI+DQotICAgICAgICAgICAgICAgIDxib2R5PlByb3ZpZGVzIGEgcHJvZmlsZSBvZiBhIHR5cGljYWwgcHJvamVjdCB0ZWFtLCB0aGUgZGlzdHJpYnV0aW9uIG9mIHJvbGVzLCBza2lsbHMgcmVxdWlyZWQgZm9yIGEgdGVhbSBwZXJmb3JtcyBhIHByb2plY3QgYmFzZWQgb24gdGhpcyBwcm9jZXNzLjwvYm9keT4NCi0gICAgICAgICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfLWs3Q2dleUdFZHU1LXZWamxmVnNmUSIgdmFsdWU9IjEiLz4NCi0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iXy1rN0NnT3lHRWR1NS12VmpsZlZzZlEiLz4NCi0gICAgICAgICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il8tYU1aTU95R0VkdTUtdlZqbGZWc2ZRIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIiB2YWx1ZT0iIi8+DQotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMzk4IiBuYW1lPSJ0eXBlT2ZDb250cmFjdCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIj4NCi0gICAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR243ai0tZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDM5OCI+DQotICAgICAgICAgICAgICAgIDxib2R5PlByb3ZpZGVzIGJhY2tncm91bmQgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGNvbnRyYWN0cyB0aGF0IG5lZWQgdG8gYmUgZXN0YWJsaXNoZWQgYmV0d2VlbiBhIHByb2plY3QgdGVhbSB0aGF0IHBlcmZvcm1zIHRoaXMgcHJvY2VzcyBhbmQgYSBjbGllbnQgKGUuZy4gZm9yIGFuIElHUyBlbmdhZ2VtZW50KS48L2JvZHk+DQotICAgICAgICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0lMMW5nZXlKRWR1NS12VmpsZlZzZlEiIHZhbHVlPSIxIi8+DQotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9JTDFuZ095SkVkdTUtdlZqbGZWc2ZRIi8+DQotICAgICAgICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfSUVpc3NPeUpFZHU1LXZWamxmVnNmUSIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyIgdmFsdWU9IiIvPg0KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxRTEwNDc0MDExQSIgbmFtZT0iUHJvY2Vzc0Rlc2NyaXB0aW9uIj4NCi0gICAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDI3OThDODAwM0JBIiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDFFMTA0MTEwMzg3Ii8+DQotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDNBQyIgbmFtZT0ic2NvcGUiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyI+DQotICAgICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dvRlU4LWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAzQUMiPg0KLSAgICAgICAgICAgICAgICA8Ym9keT5EZWZpbmVzIHRoZSBzY29wZSBvZiB0aGUgUHJvY2VzcywgaS5lLiB3aGljaCB0eXBlcyBvZiBwcm9qZWN0cyBkb2VzIGl0IGFkZHJlc3MgYW5kIHdoaWNoIG5vdC48L2JvZHk+DQotICAgICAgICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX2VFbVZjZXlIRWR1NS12VmpsZlZzZlEiIHZhbHVlPSIxIi8+DQotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9lRW1WY095SEVkdTUtdlZqbGZWc2ZRIi8+DQotICAgICAgICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfZDdOdjhPeUhFZHU1LXZWamxmVnNmUSIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyIgdmFsdWU9IiIvPg0KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDNBRCIgbmFtZT0idXNhZ2VOb3RlcyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIj4NCi0gICAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR29GVTl1ZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDNBRCI+DQotICAgICAgICAgICAgICAgIDxib2R5PkFueSBhZGRpdGlvbmFsIG5vdGVzIG9uIGhvdyB0byBhcHBseSBhbmQgaW5zdGFudGlhdGUgdGhpcyBwcm9jZXNzIGZvciBhIHByb2plY3QuPC9ib2R5Pg0KLSAgICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il91MUFOQWV5R0VkdTUtdlZqbGZWc2ZRIiB2YWx1ZT0iMSIvPg0KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfdTFBTkFPeUdFZHU1LXZWamxmVnNmUSIvPg0KLSAgICAgICAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iX3VyZDJnT3lHRWR1NS12VmpsZlZzZlEiIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiIHZhbHVlPSIiLz4NCi0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MUVEN0I0OTAwODYiIG5hbWU9IkRlc2NyaXB0b3JEZXNjcmlwdGlvbiI+DQotICAgICAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyNzk4Q0U5MDJDQSIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQxRTBEMUI2MDBEOCIvPg0KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MUVEN0I2NTAzOTQiIG5hbWU9InJlZmluZWREZXNjcmlwdGlvbiIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIj4NCi0gICAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR29GVS0tZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRUQ3QjY1MDM5NCI+DQotICAgICAgICAgICAgICAgIDxib2R5PkEgRGVzY3JpcHRvciBtaWdodCBhZGQgcmVmaW5lbWVudHMgdG8gdGhlIG1haW4gZGVzY3JpcHRpb24gb2YgdGhlIENvbnRlbnQgRWxlbWVudCBpdCByZWZlcnMgdG8uICBGb3IgZXhhbXBsZSwgaXQgY291bGQgcHJvdmlkZSBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGFib3V0IGEgV29yayBQcm9kdWN0IHJlbGV2YW50IGZvciB0aGUgc3BlY2lmaWMgcG9pbnQgaW4gdGltZSBpbiB0aGUgcHJvY2VzcyB0aGlzIFdvcmsgUHJvZHVjdCB0eXBlIGlzIGJlaW5nIHVzZWQuICBJdCBjb3VsZCBkZXNjcmliZSBhZGRpdGlvbmFsIHNraWxscyBuZWVkZWQgZm9yIGEgUm9sZSBhdCB0aGF0IHBhcnRpY3VsYXIgcG9pbnQgaW4gdGltZSBpbiBhIHByb2Nlc3MsIGV0Yy4gPC9ib2R5Pg0KLSAgICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9IU2VXa2V5SkVkdTUtdlZqbGZWc2ZRIiB2YWx1ZT0iMSIvPg0KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfSFNlV2tPeUpFZHU1LXZWamxmVnNmUSIvPg0KLSAgICAgICAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iX0hLYk4wT3lKRWR1NS12VmpsZlZzZlEiIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiIHZhbHVlPSIiLz4NCi0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MjM3NUUwNDAzOTAiIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQyMzc1RTA1MDE3MyBfM0FEQzdCNzQwMjJENDIzNzVFMDUwMTc1Ij4NCi0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dvRlVfdWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjM3NUUwNDAzOTAiPg0KLSAgICAgICAgICAgICAgPGJvZHk+TGlzdCB0aGUgc3RlcHMgdGhhdCBoYXZlIGJlZW4gc2VsZWN0ZWQgdG8gYmUgcGVyZm9ybWVkIGZvciB0aGUgaW5zdGFuY2Ugb2YgdGhlIFRhc2sgRGVzY3JpcHRvci48L2JvZHk+DQotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyMzc1RTA1MDE3NSIgbmFtZT0iX3Rhc2tEZXNjcmlwdG9yIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwMDkiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MjM3NUUwNDAzOTAiPg0KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR29PZTV1ZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4NCi0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0dvT2U1ZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICA8L293bmVkRW5kPg0KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpQYWNrYWdlIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwRkIiIG5hbWU9Ik1ldGhvZFBsdWdpbiI+DQotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iX0dwSDJ3T2ZYRWR1cUhvT0piVVJaUnciIHNvdXJjZT0idW1sMi5kaWFncmFtcyIgcmVmZXJlbmNlcz0iXzNBREM3Qjc0MDIyRDQwRjU3QUM4MDM1RSI+DQotICAgICAgICAgIDxjb250ZW50cyB4bWk6dHlwZT0ibm90YXRpb246RGlhZ3JhbSIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGNTdBQzgwMzVFIiB0eXBlPSJDbGFzcyIgbmFtZT0iTWV0aG9kUGx1Z2luIj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEF6LUFPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDEwNCI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEF6LUEtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IQXotQk9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBei1CZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQXotQnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEF6LUItZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEF6LUNPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEF6LUNlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQXotQ3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEF6LUMtZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQXotRE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEF6LURlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQXotRHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hBei1ELWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IQXotQWVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9Ik5vbmUiIHNob3dMaXN0VmlzaWJpbGl0eT0iTm9uZSIgc2hvd0xpc3RTaWduYXR1cmU9InRydWUiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hBei1BdWZYRWR1cUhvT0piVVJaUnciIHg9IjEzNDk1IiB5PSIzODQzIi8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEF6LU0tZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDEzRiI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEF6LU51ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IQXotTi1mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iNDUwNCIgaGVpZ2h0PSIxNjI1Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBei1PT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQXotT2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEF6LU91ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEF6LU8tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEF6LVBPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQXotUGVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEF6LVB1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQXotUC1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEF6LVFPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQXotUWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hBei1RdWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IQXotTk9mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iTm9uZSIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEF6LU5lZlhFZHVxSG9PSmJVUlpSdyIgeD0iNDUwNCIgeT0iMzcwOCIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBei1pZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyODAiPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBei1qT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEF6LWplZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjI4MjciIGhlaWdodD0iMTA0OSIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQXotanVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEF6LWotZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBei1rT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBei1rZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQXota3VmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBei1rLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQXotbE9mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBei1sZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQXotbHVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBei1sLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEF6LW1PZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hBei1pdWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IQXotaS1mWEVkdXFIb09KYlVSWlJ3IiB4PSI5NjYzIiB5PSIxMDUxIi8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEE5dkQtZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRERGQTM2MDJDMSI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEE5dkV1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IQTl2RS1mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMjUwNiIgaGVpZ2h0PSIxMTM0Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBOXZGT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQTl2RmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEE5dkZ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEE5dkYtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hBOXZHT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEE5dkdlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hBOXZHdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEE5dkctZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hBOXZIT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEE5dkhlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQTl2SHVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEE5dkVPZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hBOXZFZWZYRWR1cUhvT0piVVJaUnciIHg9IjEwMTc2IiB5PSI2NjQ2Ii8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxEaWFncmFtU3R5bGUiIHhtaTppZD0iX0dwSDJ3dWZYRWR1cUhvT0piVVJaUnciIGRlc2NyaXB0aW9uPSJUaGlzIGRpYWdyYW1zIHNob3dzIHRoZSBkZWZpbml0aW9uIG9mIE1ldGhvZCBQbHVnaW5zLiBNZXRob2QgUGx1Z2lucyBleHRlbmQgZWFjaCBvdGhlciBhbmQgYXJlIHRoZSBjb250YWluZXIgb2YgYWxsIE1ldGhvZCBQYWNrYWdlcy4iLz4NCi0gICAgICAgICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+DQotICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hBei1FT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyRTciIHNvdXJjZT0iX0hBei1BT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hBei1BT2ZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBei1FLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQXotRmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQXotRnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hBei1GT2ZYRWR1cUhvT0piVVJaUnciIHg9Ijk5OCIgeT0iMzE3Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBei1GLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyRUEiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEF6LUdlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQXotR09mWEVkdXFIb09KYlVSWlJ3IiB4PSI1MzUiIHk9IjU4NCIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQXotR3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDJFQSI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQXotSE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQXotRy1mWEVkdXFIb09KYlVSWlJ3IiB4PSItMzg3IiB5PSI3NzgiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEF6LUhlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMkU4Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBei1ILWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQXotSHVmWEVkdXFIb09KYlVSWlJ3IiB4PSItMTIyNCIgeT0iMjcxIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBei1JT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyRTgiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEF6LUl1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQXotSWVmWEVkdXFIb09KYlVSWlJ3IiB4PSItNzkyIiB5PSItMzAzIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBei1JLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyRUEiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEF6LUplZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQXotSnVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEF6LUpPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQXotSi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyRTgiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEF6LUtlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQXotS3VmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEF6LUtPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQXotSy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDJFQSI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQXotTGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hBei1MdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQXotTE9mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBei1MLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyRTgiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEF6LU1lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hBei1NdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQXotTU9mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hBei1FZWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IQXotRXVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlsyNjA3LCAtMjQ1LCAyNjA3LCAtMjQ1XSRbNDgxNywgLTI0NSwgNDgxNywgLTI0NV0kWzQ4MTcsIDE4MzcsIDQ4MTcsIDE4MzddJFs1NTAsIDE4MzcsIDU1MCwgMTgzN10kWzU1MCwgNTc1LCA1NTAsIDU3NV0iLz4NCi0gICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IQXotUS1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMkQ1IiBzb3VyY2U9Il9IQXotTS1mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IQXotQU9mWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQXotUnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEF6LVNPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEF6LVNlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEF6LVItZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQXotU3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMkQ4Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBei1UT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEF6LVMtZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTEyMyIgeT0iMzY0Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBei1UZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMkQ4Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBei1ULWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hBei1UdWZYRWR1cUhvT0piVVJaUnciIHg9IjExMzkiIHk9Ii0yODgiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEF6LVVPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMkQ2Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBei1VdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQXotVWVmWEVkdXFIb09KYlVSWlJ3IiB4PSI0MzYiIHk9IjQ1NyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQXotVS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDJENiI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQXotVmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hBei1WT2ZYRWR1cUhvT0piVVJaUnciIHg9IjIyNSIgeT0iLTM0NyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQXotVnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMkQ4Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBei1XT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEF6LVdlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hBei1WLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEF6LVd1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMkQ2Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBei1YT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEF6LVhlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hBei1XLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEF6LVh1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyRDgiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEF6LVlPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQXotWWVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEF6LVgtZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQXotWXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMkQ2Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBei1aT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQXotWmVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEF6LVktZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IQXotUk9mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEF6LVJlZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMjI1MiwgLTEyNywgLTcwOTUsIC0yNV0kWzY3MzksIC0xMjcsIC0yNjA3LCAtMjVdIi8+DQotICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEF6LVp1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYxMDA0OSIgc291cmNlPSJfSEF6LU0tZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEF6LU0tZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEF6LWFlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBei1hLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBei1iT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hBei1hdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEF6LWJlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYxMDA0QyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQXotYi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hBei1idWZYRWR1cUhvT0piVVJaUnciIHg9IjQ1MiIgeT0iLTg1NSIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQXotY09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYxMDA0QyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQXotY3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQXotY2VmWEVkdXFIb09KYlVSWlJ3IiB4PSItMTIwMCIgeT0iLTg4NyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQXotYy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MTAwNEEiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEF6LWRlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hBei1kT2ZYRWR1cUhvT0piVVJaUnciIHg9Ii0xMjcxIiB5PSItMjMzIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBei1kdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MTAwNEEiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEF6LWVPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQXotZC1mWEVkdXFIb09KYlVSWlJ3IiB4PSItMjIxIiB5PSIzMjMiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEF6LWVlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYxMDA0QyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQXotZS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hBei1mT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQXotZXVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBei1mZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYxMDA0QSI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQXotZi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hBei1nT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQXotZnVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBei1nZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjEwMDRDIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBei1nLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEF6LWhPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hBei1ndWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEF6LWhlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYxMDA0QSI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQXotaC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEF6LWlPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hBei1odWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEF6LVotZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hBei1hT2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0yMjUyLCA1MCwgLTIyNTIsIDUwXSRbLTQ0ODcsIDUwLCAtNDQ4NywgNTBdJFstNDQ4NywgMTg2MiwgLTQ0ODcsIDE4NjJdJFstMTIxOSwgMTg2MiwgLTEyMTksIDE4NjJdJFstMTIxOSwgODEyLCAtMTIxOSwgODEyXSIvPg0KLSAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hBei1tZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUZBRDVGODAzOEUiIHNvdXJjZT0iX0hBei1NLWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hBei1pZWZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBOXZBT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQTl2QXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQTl2QS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IQTl2QWVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hBei1tdWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hBei1tLWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzEzMTIsIC04MjEsIC0zNTY0LCAyMTc1XSRbNDAwNCwgLTI0NzIsIC04NzIsIDUyNF0iLz4NCi0gICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IQTl2Qk9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IQTl2QmVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IQTl2QnVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFGQURDMDEwMjhEIiBzb3VyY2U9Il9IQXotQU9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IQXotaWVmWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQTl2Q2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEE5dkMtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEE5dkRPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEE5dkN1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IQTl2Qi1mWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IQTl2Q09mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstODg5LCAtNTg0LCAzNTgxLCAyMzExXSRbLTM2NDksIC0yMzcwLCA4MjEsIDUyNF0iLz4NCi0gICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IQTl2RGVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IQTl2RHVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IQTl2SC1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFMENDMEEwMUQ3IiBzb3VyY2U9Il9IQXotTS1mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IQTl2RC1mWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQTl2SXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEE5dkpPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEE5dkplZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEE5dkktZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IQTl2SU9mWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IQTl2SWVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlsxNDEzLCA4MTIsIC0zMjU5LCAtMTg3OV0kWzM2OTEsIDIxMTYsIC05ODIsIC01NzVdIi8+DQotICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEE5dkp1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEE5dkotZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEE5dktPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyNTE4QkQ3MDFFMyIgc291cmNlPSJfSEF6LUFPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEE5dkQtZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEE5dkstZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBOXZMZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBOXZMdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hBOXZMT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEE5dktlZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEE5dkt1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTk5MCwgNTc1LCAzNjgzLCAtMjIxOF0kWy0zNzQyLCAyMjE4LCA5MzEsIC01NzVdIi8+DQotICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEE5dkwtZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEE5dk1PZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgPC9jb250ZW50cz4NCi0gICAgICAgICAgPGNvbnRlbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpEaWFncmFtIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEY5QzVGMDAyRTEiIHR5cGU9IkNsYXNzIiBuYW1lPSJWYXJpYWJpbGl0eUVsZW1lbnQiPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQTl2TWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOb3RlIj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQTl2Tk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJEaWFncmFtTmFtZSI+DQotICAgICAgICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEE5dk5lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRGVzY3JpcHRpb24iPg0KLSAgICAgICAgICAgICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246U2hhcGVTdHlsZSIgeG1pOmlkPSJfSEE5dk11ZlhFZHVxSG9PSmJVUlpSdyIgZm9udE5hbWU9IkFyaWFsIiBmb250SGVpZ2h0PSI4IiBkZXNjcmlwdGlvbj0ie3ZhcmlhYmlsaXR5U3BlY2lhbEVsZW1lbnQudHlwZSgpID09IHZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQudHlwZSgpfSA6IHt2YXJhYmlsaXR5IGNhbiBvbmx5IGJlIGRlZmluZWQgYmV0d2VlbiBDb250ZW50RWxlbWVudHMgb2YgdGhlIHNhbWUgc3VidHlwZSwgZS5nLiBSb2xlcyB3aXRoIFJvbGVzLCBidXQgbm90IFJvbGVzIGFuZCBUYXNrc30iIGxpbmVDb2xvcj0iMCIvPg0KLSAgICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPg0KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEE5dk0tZlhFZHVxSG9PSmJVUlpSdyIgeD0iNjcyMyIgeT0iNzc4OCIgd2lkdGg9Ijk1OTYiIGhlaWdodD0iMTYyNSIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBOXZOdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEY2QjAwMjAyRUMiPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBOXZPZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEE5dk91ZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjI5MTIiIGhlaWdodD0iNDE2NSIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQTl2Ty1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEE5dlBPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iS2luZCIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBOXZQZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQTl2UHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQTl2UC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJFbnVtZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hBOXZRT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEE5dlFlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hBOXZRdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEE5dlEtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hBOXZST2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IQTl2Ti1mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iTm9uZSIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEE5dk9PZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTMxOTUiIHk9IjIyMDUiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQTl2UmVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERTQ5NTAwMUY1Ij4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQTl2U09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hBOXZTZWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSI0OTYxIiBoZWlnaHQ9IjE1NzQiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEE5dlN1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBOXZTLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQTl2VE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQTl2VGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQTl2VHVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBOXZULWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQTl2VU9mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hCSGdBT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQkhnQWVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hCSGdBdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEJIZ0EtZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hBOXZSdWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iTm9uZSIgc2hvd0xpc3RWaXNpYmlsaXR5PSJOb25lIiBzaG93TGlzdFNpZ25hdHVyZT0idHJ1ZSIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEE5dlItZlhFZHVxSG9PSmJVUlpSdyIgeD0iMjM4OSIgeT0iMTE1OSIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hCSGdpZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURFNDk2MjAyMEYiPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hCSGdqT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEJIZ2plZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjI4NzgiIGhlaWdodD0iOTA1Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hCSGdqdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQkhnai1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEJIZ2tPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEJIZ2tlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hCSGdrdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEJIZ2stZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hCSGdsT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEJIZ2xlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hCSGdsdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEJIZ2wtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQkhnbU9mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEJIZ2l1ZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hCSGdpLWZYRWR1cUhvT0piVVJaUnciIHg9IjEwNjMiIHk9Ijk3MzgiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQkhnbWVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRTg4NjgwM0U1Ij4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQkhnbk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hCSGduZWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEJIZ251ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hCSGduLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQkhnb09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQkhnb2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQkhnb3VmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hCSGdvLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQkhncE9mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hCSGdwZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQkhncHVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hCSGdwLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEJIZ3FPZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hCSGdtdWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iTm9uZSIgc2hvd0xpc3RWaXNpYmlsaXR5PSJOb25lIiBzaG93TGlzdFNpZ25hdHVyZT0idHJ1ZSIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEJIZ20tZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTc2NiIgeT0iNDE5NCIgd2lkdGg9IjY5ODUiIGhlaWdodD0iMTU4MyIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hCUXFSZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBQTBBRTAzOUQiPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hCUXFTT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEJRcVNlZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjE1NzQiIGhlaWdodD0iOTA1Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hCUXFTdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQlFxUy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEJRcVRPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEJRcVRlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hCUXFUdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEJRcVQtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hCUXFVT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEJRcVVlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hCUXFVdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEJRcVUtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQlFxVk9mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEJRcVJ1ZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hCUXFSLWZYRWR1cUhvT0piVVJaUnciIHg9IjMwMzUiIHk9IjgyOTUiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQlFxWi1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3OTU1NDUwMTM0Ij4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQlFxYXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hCUXFhLWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxNTc0IiBoZWlnaHQ9IjkwNSIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQlFxYk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEJRcWJlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hCUXFidWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hCUXFiLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQlFxY09mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hCUXFjZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQlFxY3VmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hCUXFjLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQlFxZE9mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hCUXFkZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEJRcWR1ZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hCUXFhT2ZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IQlFxYWVmWEVkdXFIb09KYlVSWlJ3IiB4PSI0NTE3IiB5PSI5NzE0Ii8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxEaWFncmFtU3R5bGUiIHhtaTppZD0iX0dwSDJ4T2ZYRWR1cUhvT0piVVJaUnciIGRlc2NyaXB0aW9uPSJUaGlzIGRpYWdyYW0gc2hvd3MgaG93IGNvbnRlbnQgZWxlbWVudHMgY2FuIGRlZmluZSB2YXJpYXRpb25zIG9mIG9uZSBhbmQgYW5vdGhlci4gICIvPg0KLSAgICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4NCi0gICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEJIZ3FlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREU1ODdBMDNBMCIgc291cmNlPSJfSEJIZ21lZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEJIZ21lZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEJIZ3JPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hCSGdydWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hCSGdyLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEJIZ3JlZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTEyMDMiIHk9Ii0zNDkiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEJRcDhPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREU1ODdBMDNBMiI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQlFwOHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hCUXA4ZWZYRWR1cUhvT0piVVJaUnciIHg9IjEyODciIHk9Ii0yNjQiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEJRcDgtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURFNTg3QTAzQTIiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEJRcDllZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEJRcDlPZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTYwNCIgeT0iMjM2Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hCUXA5dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREU1ODdBMDNBMSI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQlFwLU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEJRcDktZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTcwNiIgeT0iLTMyMCIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQlFwLWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERTU4N0EwM0ExIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hCUXAtLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEJRcC11ZlhFZHVxSG9PSmJVUlpSdyIgeD0iOTQyIiB5PSIyODEiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEJRcF9PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREU1ODdBMDNBMiI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQlFwX3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hCUXBfLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQlFwX2VmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hCUXFBT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREU1ODdBMDNBMSI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQlFxQXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hCUXFBLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQlFxQWVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hCUXFCT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERTU4N0EwM0EyIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hCUXFCdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEJRcUItZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hCUXFCZWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEJRcUNPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREU1ODdBMDNBMSI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQlFxQ3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEJRcUMtZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hCUXFDZWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEJIZ3F1ZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hCSGdxLWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzg1NSwgNzg3LCA4NTUsIDc4N10kWzg1NSwgMTY1MSwgODU1LCAxNjUxXSRbNjY4MCwgMTY1MSwgNjY4MCwgMTY1MV0kWzY2ODAsIC01MCwgNjY4MCwgLTUwXSRbMzQ4OCwgLTUwLCAzNDg4LCAtNTBdIi8+DQotICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEJRcURPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTm90ZUF0dGFjaG1lbnQiIHNvdXJjZT0iX0hBOXZNZWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hCSGdxZWZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246Q29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hCUXFEZWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iMCIvPg0KLSAgICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPg0KLSAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEJRcUR1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTEyNywgLTgyMSwgMTg2LCAxNDM5XSRbLTMxMywgLTIyNjAsIDAsIDBdIi8+DQotICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEJRcUQtZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEJRcUVPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEJRcUktZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREU1OEI2MDE4QiIgc291cmNlPSJfSEJIZ2llZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEJIZ21lZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEJRcUp1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hCUXFLT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hCUXFLZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hCUXFKLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEJRcUpPZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hCUXFKZWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzc5NSwgLTQ0OCwgLTE3NDQsIDQ3ODNdJFs3OTUsIC00NDUzLCAtMTc0NCwgNzc4XSIvPg0KLSAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hCUXFLdWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hCUXFLLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hCUXFYdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBQTBEMzAyNDUiIHNvdXJjZT0iX0hCUXFSZWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hCSGdtZWZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hCUXFZZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQlFxWS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQlFxWk9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IQlFxWXVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hCUXFYLWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IQlFxWU9mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlsxNTksIC0zMTcsIC0xNDU1LCAzMzA3XSRbMTU5LCAtMjgzMSwgLTE0NTUsIDc5M10iLz4NCi0gICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IQlFxWmVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IQlFxWnVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IQlFxZC1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRThFNjUwMjEzIiBzb3VyY2U9Il9IQlFxWi1mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IQlFxWi1mWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQlFxZXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEJRcWZPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEJRcWZlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEJRcWUtZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQlFxZnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRThFNjcwMUJDIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hCUXFnT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEJRcWYtZlhFZHVxSG9PSmJVUlpSdyIgeD0iNDM1IiB5PSIxOTMiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEJRcWdlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRThFNjcwMUJDIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hCUXFnLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hCUXFndWZYRWR1cUhvT0piVVJaUnciIHg9Ii0zMjAiIHk9Ii0zNDciLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEJRcWhPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRThFNjcwMUIxIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hCUXFodWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQlFxaGVmWEVkdXFIb09KYlVSWlJ3IiB4PSItMzk0IiB5PSI0MDciLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEJRcWgtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMUU4RTY3MDFCMSI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQlFxaWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hCUXFpT2ZYRWR1cUhvT0piVVJaUnciIHg9IjEzMjUiIHk9IjMzOSIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQlFxaXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRThFNjcwMUJDIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hCUXFqT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEJRcWplZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hCUXFpLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEJRcWp1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRThFNjcwMUIxIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hCUXFrT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEJRcWtlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hCUXFqLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEJRcWt1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjFFOEU2NzAxQkMiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEJRcWxPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQlFxbGVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEJRcWstZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQlFxbHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRThFNjcwMUIxIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hCUXFtT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQlFxbWVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEJRcWwtZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IQlFxZU9mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEJRcWVlZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbNzg3LCAyMDMsIDc4NywgMjAzXSRbMTkxMywgMjAzLCAxOTEzLCAyMDNdJFsxOTEzLCAxMzYzLCAxOTEzLCAxMzYzXSRbOCwgMTM2MywgOCwgMTM2M10kWzgsIDQ0OCwgOCwgNDQ4XSIvPg0KLSAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hCYWE5T2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjc5NTU2MDAxNzAiIHNvdXJjZT0iX0hCUXFaLWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hCSGdtZWZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hCYWE5LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQmFhLWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQmFhLXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IQmFhLU9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hCYWE5ZWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IQmFhOXVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlswLCAtNDQ4LCA1MCwgNDczMl0kWzAsIC00Mzk0LCA1MCwgNzg3XSIvPg0KLSAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hCYWEtLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hCYWFfT2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0p4UGY0ZXhaRWR1T05yTVJnbXo0OEEiIGVsZW1lbnQ9Il9KeFBmNE94WkVkdU9Ock1SZ216NDhBIiBzb3VyY2U9Il9IQkhnbWVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IQTl2UmVmWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9KeFBmNU94WkVkdU9Ock1SZ216NDhBIiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSnhQZjV1eFpFZHVPTnJNUmdtejQ4QSIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSnhQZjUteFpFZHVPTnJNUmdtejQ4QSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9KeFBmNWV4WkVkdU9Ock1SZ216NDhBIiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0p4UGY0dXhaRWR1T05yTVJnbXo0OEEiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0p4UGY0LXhaRWR1T05yTVJnbXo0OEEiIHBvaW50cz0iWy0yMywgLTMwLCA4OCwgMTAzXSRbLTExNiwgLTE2MCwgLTUsIC0yN10iLz4NCi0gICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICA8L2NvbnRlbnRzPg0KLSAgICAgICAgICA8Y29udGVudHMgeG1pOnR5cGU9Im5vdGF0aW9uOkRpYWdyYW0iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxRTU3QjIwMDA4NyIgdHlwZT0iQ2xhc3MiIG5hbWU9Ik1haW4iPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQmFhX2VmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMEZCIj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQmFiQU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hCYWJBZWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEJhYkF1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hCYWJBLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQmFiQk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQmFiQmVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iUGFja2FnZUNvbnRlbnRzIj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQmFiQnVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIiBjb2xsYXBzZWQ9InRydWUiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IQmFhX3VmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9Ik5vbmUiIHNob3dMaXN0VmlzaWJpbGl0eT0iTm9uZSIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEJhYV8tZlhFZHVxSG9PSmJVUlpSdyIgeD0iMzAxMyIgeT0iNTIzIiB3aWR0aD0iMzE0OCIgaGVpZ2h0PSIxMDgzIi8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfazlPbnNPeG5FZHV3T2JrSUE2eDFnQSIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRTBEMEVEMDEwNCI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfazlPbnMteG5FZHV3T2JrSUE2eDFnQSIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9rOU9udE94bkVkdXdPYmtJQTZ4MWdBIiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2s5T250ZXhuRWR1d09ia0lBNngxZ0EiIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9rOU9udHV4bkVkdXdPYmtJQTZ4MWdBIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfazlPbnQteG5FZHV3T2JrSUE2eDFnQSIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfazlPbnVPeG5FZHV3T2JrSUE2eDFnQSIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlBhY2thZ2VDb250ZW50cyI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfazlPbnVleG5FZHV3T2JrSUE2eDFnQSIgY2Fub25pY2FsPSJmYWxzZSIgY29sbGFwc2VkPSJ0cnVlIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfazlPbnNleG5FZHV3T2JrSUE2eDFnQSIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX2s5T25zdXhuRWR1d09ia0lBNngxZ0EiIHg9IjYzMiIgeT0iMzIyMyIgd2lkdGg9IjMxNDgiIGhlaWdodD0iMTA4MyIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3p6THZVT3huRWR1d09ia0lBNngxZ0EiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURFNDc4RTAwMEQiPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3p6THZVLXhuRWR1d09ia0lBNngxZ0EiIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfenpMdlZPeG5FZHV3T2JrSUE2eDFnQSIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il96ekx2VmV4bkVkdXdPYmtJQTZ4MWdBIiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfenpMdlZ1eG5FZHV3T2JrSUE2eDFnQSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3p6THZWLXhuRWR1d09ia0lBNngxZ0EiIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3p6THZXT3huRWR1d09ia0lBNngxZ0EiIHZpc2libGU9ImZhbHNlIiB0eXBlPSJQYWNrYWdlQ29udGVudHMiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX3p6THZXZXhuRWR1d09ia0lBNngxZ0EiIGNhbm9uaWNhbD0iZmFsc2UiIGNvbGxhcHNlZD0idHJ1ZSIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX3p6THZVZXhuRWR1d09ia0lBNngxZ0EiIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il96ekx2VXV4bkVkdXdPYmtJQTZ4MWdBIiB4PSI1Mzk2IiB5PSIzMjI1Ii8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxEaWFncmFtU3R5bGUiIHhtaTppZD0iX0dwSDJ4dWZYRWR1cUhvT0piVVJaUnciIGRlc2NyaXB0aW9uPSJ8VGhlIE1ldGhvZC1QbHVnaW4gcGFja2FnZSBkZWZpbmVzIGV4dGVuc2liaWxpdHkgYW5kIHZhcmlhYmlsaXR5IG1lY2hhbmlzbXMgZm9yIG1ldGhvZCBjb250ZW50IGFuZCBwcm9jZXNzZXMuICBJdCBwcm92aWRlcyBtb3JlIGZsZXhpYmlsaXR5IGluIGRlZmluaW5nIGRpZmZlcmVudCB2YXJpYW50cyBvZiBtZXRob2QgY29udGVudCBhbmQgcHJvY2Vzc2VzIGJ5IGFsbG93aW5nIGNvbnRlbnQgYW5kIHByb2Nlc3MgZnJhZ21lbnRzIHRvIGJlIHBsdWdnZWQtaW4gb24gZGVtYW5kIGNyZWF0aW5nIHRhaWxvcmVkIG9yIHNwZWNpYWxpemVkIGNvbnRlbnQgb25seSB3aGVuIGl0IGlzIHJlcXVpcmVkIGFuZCB3aGljaCBjYW4gYmUgbWFpbnRhaW5lZCBhcyBzZXBhcmF0ZSB1bml0cyB3b3JrZWQgb24gYnkgZGlzdHJpYnV0ZWQgdGVhbXMuJiN4QTt8TWV0aG9kcyBhbmQgUHJvY2Vzc2VzIGFyZSBuZXZlciBkZXZlbG9wZWQgaW4gaXNvbGF0aW9uLiAgTWFueSBjb25jdXJyZW50IHRlYW1zIG9mIHByb2Nlc3MgZW5naW5lZXJzIG1pZ2h0IHdvcmsgb24gZGlmZmVyZW50IG9yIHRoZSBzYW1lIHBhcnRzIG9mIGEgTWV0aG9kIENvbnRlbnQgb3IgcGFydGljdWxhciBQcm9jZXNzZXMuICBUaGV5IGhhdmUgdG8gZWl0aGVyIGNvb3JkaW5hdGUgdGhlaXIgd29yayBvciBwcmVmZXJhYmx5IHRvIG1vZHVsYXJpemUgTWV0aG9kIENvbnRlbnQgYW5kIFByb2Nlc3MgZGVmaW5pdGlvbnMgdGhhdCB0aGV5IGNhbiB3b3JrIG9uIGluIGlzb2xhdGlvbiB3aXRob3V0IGFueSBzaGFyZWQgcmVzb3VyY2UgcHJvYmxlbXMuJiN4QTt8TW9yZW92ZXIsIHdvcmsgb24gYSBkZXZlbG9wbWVudCBQcm9jZXNzIGlzIG5ldmVyIGZpbmFsIGJlY2F1c2UgdGhleSBoYXZlIHRvIGJlIHRhaWxvcmVkIGZvciBldmVyeSBzcGVjaWZpYyBwcm9qZWN0IHNpdHVhdGlvbi4gIFRvIGF2b2lkIGRldmVsb3BpbmcgRGVsaXZlcnkgUHJvY2Vzc2VzIGZyb20gc2NyYXRjaCBmb3IgZXZlcnkgc3BlY2lmaWMgcHJvamVjdCBzaXR1YXRpb24gYSB0cnVseSByZXVzYWJsZSBQcm9jZXNzIGFsbG93cyBkZWZpbmluZyBtYW55IGRpZmZlcmVudCB2YXJpYXRpb25zIG9uIGl0LiAgVGhlcmVmb3JlLCB0YWlsb3JpbmcgYW5kIGV4dGVuc2lvbiBvZiBwcmUtZGVmaW5lZCBwcm9jZXNzZXMgaXMgYSBrZXkgcmVxdWlyZW1lbnQgZm9yIG9yZ2FuaXphdGlvbnMgYWRvcHRpbmcgYW5kIGltcGxlbWVudGluZyBwcm9jZXNzZXMuICAgRm9yIGV4YW1wbGUsIGltYWdlIGEgc2NlbmFyaW8gaW4gd2hpY2ggYSBkZXZlbG9wbWVudCBvcmdhbml6YXRpb24gcHVyY2hhc2VzIGEgdGhpcmQtcGFydHkgRGVsaXZlcnkgUHJvY2VzcyBmcm9tIGEgbWV0aG9kIHZlbmRvciBhbmQgaXRzIHVuZGVybHlpbmcgbWV0aG9kIGNvbnRlbnQuICBXaGlsZSBpbXBsZW1lbnRpbmcgdGhlIHByb2Nlc3MgaW4gdGhlaXIgb3JnYW5pemF0aW9uIHRoZXkgbWlnaHQgZGlzY292ZXIgdGhhdCB0aGV5IHdvdWxkIGxpa2UgdG8gdGFpbG9yIHRoZSBwcm9jZXNzIHRvIHRoZWlyIHBhcnRpY3VsYXIgbmVlZHMgYW5kIG9yZ2FuaXphdGlvbiBzcGVjaWZpYyB2YXJpYXRpb25zLiAgSWYgdGhleSB3b3VsZCBkaXJlY3RseSBtb2RpZnkgdGhlIHB1cmNoYXNlZCBwcm9jZXNzIHRoZXkgd291bGQgbWluZ2xlIHRoZWlyIGFkZGl0aW9ucyBhbmQgY2hhbmdlcyB3aXRoIHRoZSBvcmlnaW5hbCBwcm9jZXNzLiAgSWYgYSBuZXcgdmVyc2lvbiBvZiB0aGUgb3JpZ2luYWwgcHJvY2VzcyBpcyByZWxlYXNlZCBieSB0aGUgdmVuZG9yIGl0IHdvdWxkIGJlIHZlcnkgaGFyZCBmb3IgdGhlbSB0byBmaW5kIGFuZCByZXByb2R1Y2UgdGhlc2UgY2hhbmdlcyB0byB0aGUgbmV3IHByb2Nlc3MgdmVyc2lvbi4mI3hBO3xUaGUgcGFja2FnZSBNZXRob2QgUGx1Z2luIGFkZHMgdGhlIGNhcGFiaWxpdGllcyBvZiBtb2R1bGFyaXphdGlvbiBhbmQgZXh0ZW5zaWJpbGl0eSBvZiBNZXRob2QgQ29udGVudCBhbmQgUHJvY2Vzc2VzIHRvIFVNQS4gIEluIG90aGVyIHdvcmRzLCBpdCBzdXBwb3J0cyB0YWlsb3Jpbmcgb2YgTWV0aG9kIENvbnRlbnQgYW5kIFByb2Nlc3NlcyB3aXRob3V0IGRpcmVjdGx5IG1vZGlmeWluZyB0aGVtLCBidXQgYnkgZGVzY3JpYmluZyBjaGFuZ2VzIGZyb20gYSBzZXBhcmF0ZSB1bml0IGNhbGxlZCBhIE1ldGhvZCBQbHVnLWluLiAgVGhpcyBuZXcgY2FwYWJpbGl0eSBpcyBhY2hpZXZlZCBieSBhZGRpbmcgbmV3IGNvbmNlcHRzIHRvIHRoZSBtZXRhLW1vZGVsOiAmI3hBO3wtIEFsbCBNZXRob2QgRWxlbWVudHMgYXJlIG9yZ2FuaXplZCBpbiBNZXRob2QgUGx1Z2lucy4gIE1ldGhvZCBQbHVnaW5zIGFyZSBjb250YWluZXJzIGZvciBNZXRob2QgUGFja2FnZXMuICBFdmVyeSBNZXRob2QgRWxlbWVudCBpcyBwYXJ0IG9mIGV4YWN0bHkgb25lIE1ldGhvZCBQbHVnaW4sIGkuZS4gTWV0aG9kIFBsdWdpbnMgcGFydGl0aW9uIHRoZSBzcGFjZSBvZiBhbGwgTWV0aG9kIEVsZW1lbnRzLiAgJiN4QTt8LSBNZXRob2QgUGx1Z2lucyBjYW4gZGVmaW5lIGV4dGVuc2lvbnMgdG8gb3RoZXIgTWV0aG9kIFBsdWdpbnMuICBPbmUgTWV0aG9kIFBsdWdpbiBjYW4gZGVmaW5lIGV4dGVuc2lvbnMgZm9yIG1hbnkgb3RoZXIgUGx1Z2lucyBhbmQgY2FuIGJlIGV4dGVuZGVkIGJ5IG1hbnkgUGx1Z2lucy4mI3hBO3wtIFRoZSBNZXRob2QgUGx1Z2luIG1ldGEtbW9kZWwgcGFja2FnZSBhZGRzIGEgbmV3IHNldCBvZiByZWxhdGlvbnNoaXBzIGFuZCBzZW1hbnRpY3MgdG8gc3BlY2lmaWMgTWV0aG9kIEVsZW1lbnRzIHRoYXQgZGVmaW5lIGhvdyB0aGVzZSBNZXRob2QgRWxlbWVudHMgY2FuIGV4dGVuZCBlYWNoIG90aGVyIGFjcm9zcyB0aGUgYm91bmRhcnkgb2YgTWV0aG9kIFBsdWdpbnMgb3IgTWV0aG9kIFBhY2thZ2VzICh0byBhbGxvdyBtb2R1bGFyaXphdGlvbiBldmVuIHdpdGhpbiBvbmUgTWV0aG9kIFBsdWdpbikuJiN4QTt8VGhlIGZvbGxvd2luZyBzZWN0aW9ucyBkZWZpbmUgdGhlIGRldGFpbGVkIHJ1bGVzIGZvciB0aGVzZSBleHRlbnNpb25zIGZvciBzcGVjaWZpYyBNZXRob2QgRWxlbWVudHMuJiN4QTsiLz4NCi0gICAgICAgICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+DQotICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX1JuSWVFZXhaRWR1T05yTVJnbXo0OEEiIGVsZW1lbnQ9Il9SbkllRU94WkVkdU9Ock1SZ216NDhBIiBzb3VyY2U9Il9IQmFhX2VmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9rOU9uc094bkVkdXdPYmtJQTZ4MWdBIj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9SbkllRk94WkVkdU9Ock1SZ216NDhBIiB0eXBlPSJLaW5kTGFiZWwiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfUm5JZUZ1eFpFZHVPTnJNUmdtejQ4QSIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfUm5JZUdPeFpFZHVPTnJNUmdtejQ4QSIgdHlwZT0iS2luZCIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfUm5JZUYteFpFZHVPTnJNUmdtejQ4QSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9SbkllRmV4WkVkdU9Ock1SZ216NDhBIiB4PSItMjciIHk9Ijg5OSIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9SbkllRXV4WkVkdU9Ock1SZ216NDhBIiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfUm5JZUUteFpFZHVPTnJNUmdtejQ4QSIgcG9pbnRzPSJbMCwgNTU2LCAyMzgxLCAtMjE0M10kWy0yMzgxLCAyMTQzLCAwLCAtNTU2XSIvPg0KLSAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX3czdk5zZXh1RWR1TTE0dW5XYXFQNVEiIGVsZW1lbnQ9Il93M3ZOc094dUVkdU0xNHVuV2FxUDVRIiBzb3VyY2U9Il9IQmFhX2VmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il96ekx2VU94bkVkdXdPYmtJQTZ4MWdBIj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il93M3ZOdE94dUVkdU0xNHVuV2FxUDVRIiB0eXBlPSJLaW5kTGFiZWwiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfdzN2TnR1eHVFZHVNMTR1bldhcVA1USIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfdzN2TnVPeHVFZHVNMTR1bldhcVA1USIgdHlwZT0iS2luZCIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfdzN2TnQteHVFZHVNMTR1bldhcVA1USIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il93M3ZOdGV4dUVkdU0xNHVuV2FxUDVRIiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX3czdk5zdXh1RWR1TTE0dW5XYXFQNVEiIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il93M3ZOcy14dUVkdU0xNHVuV2FxUDVRIiBwb2ludHM9Ils4LCAyMSwgLTgzLCAtODFdJFszNSwgMTIzLCAtNTYsIDIxXSIvPg0KLSAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgIDwvY29udGVudHM+DQotICAgICAgICAgIDxjb250ZW50cyB4bWk6dHlwZT0ibm90YXRpb246RGlhZ3JhbSIgeG1pOmlkPSJfcmdwTW9NVklFZHkybXVRMlBRdkhfQSIgdHlwZT0iQ2xhc3MiIG5hbWU9IlNsb3RGdWxmaWxsbWVudCI+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3VWX0NFY1ZJRWR5Mm11UTJQUXZIX0EiIGVsZW1lbnQ9Il91Vl9DRU1WSUVkeTJtdVEyUFF2SF9BIj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il91Vl9DRk1WSUVkeTJtdVEyUFF2SF9BIiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX3VWX0NGY1ZJRWR5Mm11UTJQUXZIX0EiIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfdVZfQ0ZzVklFZHkybXVRMlBRdkhfQSIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3VWX0NGOFZJRWR5Mm11UTJQUXZIX0EiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il91Vl9DR01WSUVkeTJtdVEyUFF2SF9BIiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il91Vl9DR2NWSUVkeTJtdVEyUFF2SF9BIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfdVZfQ0dzVklFZHkybXVRMlBRdkhfQSIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il91Vl9DRzhWSUVkeTJtdVEyUFF2SF9BIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfdVZfQ0hNVklFZHkybXVRMlBRdkhfQSIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il91Vl9DSGNWSUVkeTJtdVEyUFF2SF9BIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfdVZfQ0hzVklFZHkybXVRMlBRdkhfQSIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il91Vl9DSDhWSUVkeTJtdVEyUFF2SF9BIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX3VWX0NJTVZJRWR5Mm11UTJQUXZIX0EiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il91Vl9DRXNWSUVkeTJtdVEyUFF2SF9BIiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfdVZfQ0U4VklFZHkybXVRMlBRdkhfQSIgeD0iMjgyOCIgeT0iNTUyNiIgaGVpZ2h0PSIxNTg4Ii8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfWnZ6cmNNVk1FZHkybXVRMlBRdkhfQSIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRERFNjU4MDE1NyI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfWnZ6cmM4Vk1FZHkybXVRMlBRdkhfQSIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9adnpyZE1WTUVkeTJtdVEyUFF2SF9BIiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX1p2enJkY1ZNRWR5Mm11UTJQUXZIX0EiIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9adnpyZHNWTUVkeTJtdVEyUFF2SF9BIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfWnZ6cmQ4Vk1FZHkybXVRMlBRdkhfQSIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfWnZ6cmVNVk1FZHkybXVRMlBRdkhfQSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfWnZ6cmVjVk1FZHkybXVRMlBRdkhfQSIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9adnpyZXNWTUVkeTJtdVEyUFF2SF9BIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfWnZ6cmU4Vk1FZHkybXVRMlBRdkhfQSIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9adnpyZk1WTUVkeTJtdVEyUFF2SF9BIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfWnZ6cmZjVk1FZHkybXVRMlBRdkhfQSIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9adnpyZnNWTUVkeTJtdVEyUFF2SF9BIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX1p2enJmOFZNRWR5Mm11UTJQUXZIX0EiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9adnpyY2NWTUVkeTJtdVEyUFF2SF9BIiBzaG93TGlzdFN0ZXJlb3R5cGU9Ik5vbmUiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIxMjYzMjI1NiIgc2hvd1BhcmVudD0iTmFtZSIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX1p2enJjc1ZNRWR5Mm11UTJQUXZIX0EiIHg9IjI1OTEiIHk9IjYzNCIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3FwZS1VTVZNRWR5Mm11UTJQUXZIX0EiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjk0RUI5MDAwRkMiPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3FwZS1VOFZNRWR5Mm11UTJQUXZIX0EiIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfcXBlLVZNVk1FZHkybXVRMlBRdkhfQSIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9xcGUtVmNWTUVkeTJtdVEyUFF2SF9BIiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfcXBlLVZzVk1FZHkybXVRMlBRdkhfQSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3FwZS1WOFZNRWR5Mm11UTJQUXZIX0EiIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3FwZS1XTVZNRWR5Mm11UTJQUXZIX0EiIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9xcGUtV2NWTUVkeTJtdVEyUFF2SF9BIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3FwZS1Xc1ZNRWR5Mm11UTJQUXZIX0EiIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9xcGUtVzhWTUVkeTJtdVEyUFF2SF9BIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3FwZS1YTVZNRWR5Mm11UTJQUXZIX0EiIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9xcGUtWGNWTUVkeTJtdVEyUFF2SF9BIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3FwZS1Yc1ZNRWR5Mm11UTJQUXZIX0EiIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfcXBlLVg4Vk1FZHkybXVRMlBRdkhfQSIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX3FwZS1VY1ZNRWR5Mm11UTJQUXZIX0EiIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjEyNjMyMjU2IiBzaG93UGFyZW50PSJOYW1lIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfcXBlLVVzVk1FZHkybXVRMlBRdkhfQSIgeD0iMjY3MSIgeT0iMjc3NyIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0FUTE9JY1ZPRWR5Mm11UTJQUXZIX0EiIGVsZW1lbnQ9Il9BVExPSU1WT0VkeTJtdVEyUFF2SF9BIj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9BVExPSk1WT0VkeTJtdVEyUFF2SF9BIiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0FUTE9KY1ZPRWR5Mm11UTJQUXZIX0EiIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfQVRMT0pzVk9FZHkybXVRMlBRdkhfQSIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0FUVVlFTVZPRWR5Mm11UTJQUXZIX0EiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9BVFVZRWNWT0VkeTJtdVEyUFF2SF9BIiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9BVFVZRXNWT0VkeTJtdVEyUFF2SF9BIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfQVRVWUU4Vk9FZHkybXVRMlBRdkhfQSIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9BVFVZRk1WT0VkeTJtdVEyUFF2SF9BIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfQVRVWUZjVk9FZHkybXVRMlBRdkhfQSIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9BVFVZRnNWT0VkeTJtdVEyUFF2SF9BIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfQVRVWUY4Vk9FZHkybXVRMlBRdkhfQSIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9BVFVZR01WT0VkeTJtdVEyUFF2SF9BIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0FUVVlHY1ZPRWR5Mm11UTJQUXZIX0EiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9BVExPSXNWT0VkeTJtdVEyUFF2SF9BIiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfQVRMT0k4Vk9FZHkybXVRMlBRdkhfQSIgeD0iMTQ4MCIgeT0iNzk4OCIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0NHcDk4TVZPRWR5Mm11UTJQUXZIX0EiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBQTBBRTAzOUQiPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0NHcDk4OFZPRWR5Mm11UTJQUXZIX0EiIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfQ0dwOTlNVk9FZHkybXVRMlBRdkhfQSIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9DR3A5OWNWT0VkeTJtdVEyUFF2SF9BIiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfQ0dwOTlzVk9FZHkybXVRMlBRdkhfQSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0NHcDk5OFZPRWR5Mm11UTJQUXZIX0EiIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0NHcDktTVZPRWR5Mm11UTJQUXZIX0EiIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9DR3A5LWNWT0VkeTJtdVEyUFF2SF9BIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0NHcDktc1ZPRWR5Mm11UTJQUXZIX0EiIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9DR3A5LThWT0VkeTJtdVEyUFF2SF9BIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0NHcDlfTVZPRWR5Mm11UTJQUXZIX0EiIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9DR3A5X2NWT0VkeTJtdVEyUFF2SF9BIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0NHcDlfc1ZPRWR5Mm11UTJQUXZIX0EiIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfQ0dwOV84Vk9FZHkybXVRMlBRdkhfQSIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0NHcDk4Y1ZPRWR5Mm11UTJQUXZIX0EiIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9DR3A5OHNWT0VkeTJtdVEyUFF2SF9BIiB4PSI2MDgzIiB5PSI3OTg3Ii8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfZHlqZFFNVk9FZHkybXVRMlBRdkhfQSIgZWxlbWVudD0iX2R5WnNRTVZPRWR5Mm11UTJQUXZIX0EiPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2R5amRROFZPRWR5Mm11UTJQUXZIX0EiIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfZHlqZFJNVk9FZHkybXVRMlBRdkhfQSIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9keWpkUmNWT0VkeTJtdVEyUFF2SF9BIiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfZHlqZFJzVk9FZHkybXVRMlBRdkhfQSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2R5amRSOFZPRWR5Mm11UTJQUXZIX0EiIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2R5amRTTVZPRWR5Mm11UTJQUXZIX0EiIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9keWpkU2NWT0VkeTJtdVEyUFF2SF9BIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2R5amRTc1ZPRWR5Mm11UTJQUXZIX0EiIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9keWpkUzhWT0VkeTJtdVEyUFF2SF9BIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2R5amRUTVZPRWR5Mm11UTJQUXZIX0EiIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9keWpkVGNWT0VkeTJtdVEyUFF2SF9BIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2R5amRUc1ZPRWR5Mm11UTJQUXZIX0EiIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfZHlqZFQ4Vk9FZHkybXVRMlBRdkhfQSIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX2R5amRRY1ZPRWR5Mm11UTJQUXZIX0EiIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9keWpkUXNWT0VkeTJtdVEyUFF2SF9BIiB4PSI0NDcwIiB5PSI3OTg5Ii8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxEaWFncmFtU3R5bGUiIHhtaTppZD0iX3JncE1vY1ZJRWR5Mm11UTJQUXZIX0EiLz4NCi0gICAgICAgICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+DQotICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX2xHUFlNY1ZNRWR5Mm11UTJQUXZIX0EiIGVsZW1lbnQ9Il9sR1BZTU1WTUVkeTJtdVEyUFF2SF9BIiBzb3VyY2U9Il91Vl9DRWNWSUVkeTJtdVEyUFF2SF9BIiB0YXJnZXQ9Il9xcGUtVU1WTUVkeTJtdVEyUFF2SF9BIj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9sR1BZTk1WTUVkeTJtdVEyUFF2SF9BIiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfbEdZaUlNVk1FZHkybXVRMlBRdkhfQSIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfbEdZaUljVk1FZHkybXVRMlBRdkhfQSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9sR1BZTmNWTUVkeTJtdVEyUFF2SF9BIiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX2xHUFlNc1ZNRWR5Mm11UTJQUXZIX0EiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX2xHUFlNOFZNRWR5Mm11UTJQUXZIX0EiIHBvaW50cz0iWy0yLCAtMTIsIDE0LCA5OV0kWy0xNiwgLTg1LCAwLCAyNl0iLz4NCi0gICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9xcGUtWU1WTUVkeTJtdVEyUFF2SF9BIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI5NEVDMjcwMTA2IiBzb3VyY2U9Il9xcGUtVU1WTUVkeTJtdVEyUFF2SF9BIiB0YXJnZXQ9Il9adnpyY01WTUVkeTJtdVEyUFF2SF9BIj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9xcG9JUU1WTUVkeTJtdVEyUFF2SF9BIiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfcXBvSVFzVk1FZHkybXVRMlBRdkhfQSIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfcXBvSVE4Vk1FZHkybXVRMlBRdkhfQSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9xcG9JUWNWTUVkeTJtdVEyUFF2SF9BIiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX3FwZS1ZY1ZNRWR5Mm11UTJQUXZIX0EiIGxpbmVDb2xvcj0iMTI2MzIyNTYiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9xcGUtWXNWTUVkeTJtdVEyUFF2SF9BIiBwb2ludHM9IlswLCAwLCAwLCAwXSRbMCwgMCwgMCwgMF0iLz4NCi0gICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9hNDJoc01WTkVkeTJtdVEyUFF2SF9BIiBlbGVtZW50PSJfYTRqbXdNVk5FZHkybXVRMlBRdkhfQSIgc291cmNlPSJfdVZfQ0VjVklFZHkybXVRMlBRdkhfQSIgdGFyZ2V0PSJfdVZfQ0VjVklFZHkybXVRMlBRdkhfQSI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfYTQyaHM4Vk5FZHkybXVRMlBRdkhfQSIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2E0Mmh0Y1ZORWR5Mm11UTJQUXZIX0EiIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2E0Mmh0c1ZORWR5Mm11UTJQUXZIX0EiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfYTQyaHRNVk5FZHkybXVRMlBRdkhfQSIgeD0iNTMwIiB5PSIzNDQiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfYTQyaHQ4Vk5FZHkybXVRMlBRdkhfQSIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iX2E0am14TVZORWR5Mm11UTJQUXZIX0EiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfYTQyaHVjVk5FZHkybXVRMlBRdkhfQSIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9hNDJodU1WTkVkeTJtdVEyUFF2SF9BIiB4PSIyNyIgeT0iLTUwNCIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9hNDJodXNWTkVkeTJtdVEyUFF2SF9BIiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iX2E0am14TVZORWR5Mm11UTJQUXZIX0EiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfYTQyaHZNVk5FZHkybXVRMlBRdkhfQSIgdHlwZT0iVG9Sb2xlIi8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfYTQyaHU4Vk5FZHkybXVRMlBRdkhfQSIgeT0iLTM5NyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9hNDJodmNWTkVkeTJtdVEyUFF2SF9BIiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il9hNGptd2NWTkVkeTJtdVEyUFF2SF9BIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2E0Mmh2OFZORWR5Mm11UTJQUXZIX0EiIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9hNDJodnNWTkVkeTJtdVEyUFF2SF9BIiB4PSItNTU3IiB5PSItMTg3Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2E0Mmh3TVZORWR5Mm11UTJQUXZIX0EiIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il9hNGptd2NWTkVkeTJtdVEyUFF2SF9BIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2E0Mmh3c1ZORWR5Mm11UTJQUXZIX0EiIHR5cGU9IkZyb21Sb2xlIi8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfYTQyaHdjVk5FZHkybXVRMlBRdkhfQSIgeD0iLTE4NiIgeT0iMzE2Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2E0Mmh3OFZORWR5Mm11UTJQUXZIX0EiIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il9hNGpteE1WTkVkeTJtdVEyUFF2SF9BIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2E0Mmh4Y1ZORWR5Mm11UTJQUXZIX0EiIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfYTQyaHhzVk5FZHkybXVRMlBRdkhfQSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX2E0Mmh4TVZORWR5Mm11UTJQUXZIX0EiIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfYTQyaHg4Vk5FZHkybXVRMlBRdkhfQSIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfYTRqbXdjVk5FZHkybXVRMlBRdkhfQSI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9hNDJoeWNWTkVkeTJtdVEyUFF2SF9BIiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX2E0Mmh5c1ZORWR5Mm11UTJQUXZIX0EiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9hNDJoeU1WTkVkeTJtdVEyUFF2SF9BIiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2E0Mmh5OFZORWR5Mm11UTJQUXZIX0EiIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfYTRqbXhNVk5FZHkybXVRMlBRdkhfQSI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9hNDJoemNWTkVkeTJtdVEyUFF2SF9BIiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX2E0Mmh6c1ZORWR5Mm11UTJQUXZIX0EiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9hNDJoek1WTkVkeTJtdVEyUFF2SF9BIiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2E0Mmh6OFZORWR5Mm11UTJQUXZIX0EiIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il9hNGptd2NWTkVkeTJtdVEyUFF2SF9BIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2E0MmgwY1ZORWR5Mm11UTJQUXZIX0EiIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9hNDJoMHNWTkVkeTJtdVEyUFF2SF9BIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfYTQyaDBNVk5FZHkybXVRMlBRdkhfQSIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9hNDJoc2NWTkVkeTJtdVEyUFF2SF9BIiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfYTQyaHNzVk5FZHkybXVRMlBRdkhfQSIgcG9pbnRzPSJbMTY5MywgNTMsIDE2OTMsIDUzXSRbMzMzNCwgNTMsIDMzMzQsIDUzXSRbMzMzNCwgLTE1NjEsIDMzMzQsIC0xNTYxXSRbMTM0OSwgLTE1NjEsIDEzNDksIC0xNTYxXSRbMTM0OSwgLTc5NCwgMTM0OSwgLTc5NF0iLz4NCi0gICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9nNTdkNGNWT0VkeTJtdVEyUFF2SF9BIiBlbGVtZW50PSJfZzU3ZDRNVk9FZHkybXVRMlBRdkhfQSIgc291cmNlPSJfQVRMT0ljVk9FZHkybXVRMlBRdkhfQSIgdGFyZ2V0PSJfdVZfQ0VjVklFZHkybXVRMlBRdkhfQSI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfZzZGTzRNVk9FZHkybXVRMlBRdkhfQSIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2c2Rk80c1ZPRWR5Mm11UTJQUXZIX0EiIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2c2Rk80OFZPRWR5Mm11UTJQUXZIX0EiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfZzZGTzRjVk9FZHkybXVRMlBRdkhfQSIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9nNTdkNHNWT0VkeTJtdVEyUFF2SF9BIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9nNTdkNDhWT0VkeTJtdVEyUFF2SF9BIiBwb2ludHM9Ils4LCAtMTIsIC01NSwgNjNdJFstMiwgLTc2LCAtNjUsIC0xXSIvPg0KLSAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX2hZTGdJTVZPRWR5Mm11UTJQUXZIX0EiIGVsZW1lbnQ9Il9oWUJ2SU1WT0VkeTJtdVEyUFF2SF9BIiBzb3VyY2U9Il9keWpkUU1WT0VkeTJtdVEyUFF2SF9BIiB0YXJnZXQ9Il91Vl9DRWNWSUVkeTJtdVEyUFF2SF9BIj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oWUxnSThWT0VkeTJtdVEyUFF2SF9BIiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaFlMZ0pjVk9FZHkybXVRMlBRdkhfQSIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaFlMZ0pzVk9FZHkybXVRMlBRdkhfQSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9oWUxnSk1WT0VkeTJtdVEyUFF2SF9BIiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX2hZTGdJY1ZPRWR5Mm11UTJQUXZIX0EiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX2hZTGdJc1ZPRWR5Mm11UTJQUXZIX0EiIHBvaW50cz0iWy00LCAtMTIsIDE5LCA2M10kWy0yNCwgLTEwNSwgLTEsIC0zMF0iLz4NCi0gICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9oeTJwOGNWT0VkeTJtdVEyUFF2SF9BIiBlbGVtZW50PSJfaHkycDhNVk9FZHkybXVRMlBRdkhfQSIgc291cmNlPSJfQ0dwOThNVk9FZHkybXVRMlBRdkhfQSIgdGFyZ2V0PSJfdVZfQ0VjVklFZHkybXVRMlBRdkhfQSI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaHkycDlNVk9FZHkybXVRMlBRdkhfQSIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2h5MnA5c1ZPRWR5Mm11UTJQUXZIX0EiIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2h5MnA5OFZPRWR5Mm11UTJQUXZIX0EiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfaHkycDljVk9FZHkybXVRMlBRdkhfQSIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9oeTJwOHNWT0VkeTJtdVEyUFF2SF9BIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9oeTJwODhWT0VkeTJtdVEyUFF2SF9BIiBwb2ludHM9IlstMTcsIC0xMiwgNzcsIDYzXSRbLTkxLCAtNDUsIDMsIDMwXSIvPg0KLSAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgIDwvY29udGVudHM+DQotICAgICAgICA8L2VBbm5vdGF0aW9ucz4NCi0gICAgICAgIDxwYWNrYWdlTWVyZ2UgeG1pOmlkPSJfUm5JZUVPeFpFZHVPTnJNUmdtejQ4QSIgbWVyZ2VkUGFja2FnZT0iXzNBREM3Qjc0MDIyRDQxRTBEMEVEMDEwNCIvPg0KLSAgICAgICAgPHBhY2thZ2VNZXJnZSB4bWk6aWQ9Il93M3ZOc094dUVkdU0xNHVuV2FxUDVRIiBtZXJnZWRQYWNrYWdlPSJfM0FEQzdCNzQwMjJENDFERTQ3OEUwMDBEIi8+DQotICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDEwNCIgbmFtZT0iTWV0aG9kUGx1Z2luIj4NCi0gICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9Hb1lQOHVmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMTA0Ij4NCi0gICAgICAgICAgICA8Ym9keT5BIE1ldGhvZCBQbHVnaW4gaXMgYSBNZXRob2QgRWxlbWVudCB0aGF0IHJlcHJlc2VudHMgYSBwaHlzaWNhbCBjb250YWluZXIgZm9yIE1ldGhvZCBQYWNrYWdlcy4gIEl0IGRlZmluZXMgYSBncmFudWxhcml0eSBsZXZlbCBmb3IgdGhlIG1vZHVsYXJpemF0aW9uIGFuZCBvcmdhbml6YXRpb24gb2YgbWV0aG9kIGNvbnRlbnQgYW5kIHByb2Nlc3Nlcy4gIEEgTWV0aG9kIFBsdWdpbiBjYW4gZXh0ZW5kIG1hbnkgb3RoZXIgTWV0aG9kIFBsdWdpbnMgYW5kIGl0IGNhbiBiZSBleHRlbmRlZCBieSBtYW55IE1ldGhvZCBQbHVnaW5zLiAgSXQgY2FuIGFsc28gYmUgdXNlZCBzdGFuZC1hbG9uZSwgaS5lLiB3aXRoIG5vIEV4dGVuc2lvbiByZWxhdGlvbnNoaXAgdG8gb3RoZXIgcGx1Zy1pbnMuDQotTWV0aG9kIFBsdWdpbiBjb25jZXB0dWFsbHkgcmVwcmVzZW50cyBhIHVuaXQgZm9yIGNvbmZpZ3VyYXRpb24sIG1vZHVsYXJpemF0aW9uLCBleHRlbnNpb24sIHBhY2thZ2luZywgYW5kIGRlcGxveW1lbnQgb2YgbWV0aG9kIGNvbnRlbnQgYW5kIHByb2Nlc3Nlcy4gIEEgUHJvY2VzcyBFbmdpbmVlciBzaGFsbCBkZXNpZ24gaGlzIFBsdWdpbnMgYW5kIGFsbG9jYXRlIGhpcyBjb250ZW50IHRvIHRoZXNlIFBsdWdpbnMgd2l0aCByZXF1aXJlbWVudHMgZm9yIGV4dGVuc2liaWxpdHksIG1vZHVsYXJpdHksIHJldXNlLCBhbmQgbWFpbnRhaW5hYmlsaXR5IGluIG1pbmQuDQotU3BlY2lhbCBleHRlbnNpYmlsaXR5IG1lY2hhbmlzbXMgZGVmaW5lZCBmb3IgdGhlIG1ldGEtY2xhc3NlcyBWYXJpYWJpbGl0eSBFbGVtZW50IGFuZCBQcm9jZXNzIENvbnRyaWJ1dGlvbiBhbGxvdyBQbHVnaW4gY29udGVudCB0byBkaXJlY3RseSBjb250cmlidXRlIG5ldyBjb250ZW50LCByZXBsYWNlIGV4aXN0aW5nIGNvbnRlbnQsIG9yIHRvIGNyb3NzLXJlZmVyZW5jZSB0byBhbnkgQ29udGVudCBFbGVtZW50IG9yIFByb2Nlc3Mgd2l0aGluIGFub3RoZXIgUGx1Z2luIHRoYXQgaXQgZXh0ZW5kcy4gIFNpbWlsYXIgdG8gVU1MIDIuMCdzICdwYWNrYWdlIG1lcmdlJyBtZWNoYW5pc20gdHJhbnNmb3JtYXRpb24gaW50ZXJwcmV0YXRpb25zLCBpbnRlcnByZXRpbmcgdGhlc2UgTWV0aG9kIFBsdWdpbiBtZWNoYW5pc21zIHJlc3VsdHMgaW50byBuZXcgZXh0ZW5kZWQgTWV0aG9kIENvbnRlbnQgYW5kIFByb2Nlc3Nlcy4NCi08L2JvZHk+DQotICAgICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDFGQURDMDEwMjhEIiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjgwIi8+DQotICAgICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MjUxOEJENzAxRTMiIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0MURERkEzNjAyQzEiLz4NCi0gICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxQUU3MDczMDNCOCIgbmFtZT0idXNlckNoYW5nZWFibGUiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzVHY1lBT2llRWR1UWJ1WTZVd01TUWciPg0KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfS0FmX0FDWDVFZDJLbkoyeWpOWGhXUSIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxQUU3MDczMDNCOCI+DQotICAgICAgICAgICAgICA8Ym9keT5EZWZpbmVzIGlmIGEgbWV0aG9kIHBsdWctaW4gaXMgbG9ja2VkIGZvciBjaGFuZ2VzIG9yIG5vdC48L2JvZHk+DQotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iX0dvWVA5LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Il81R2NZQU9pZUVkdVFidVk2VXdNU1FnIj4NCi0gICAgICAgICAgICAgIDxib2R5PnRydWU8L2JvZHk+DQotICAgICAgICAgICAgPC9kZWZhdWx0VmFsdWU+DQotICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il9wc0xfa0NYM0VkMktuSjJ5ak5YaFdRIiBuYW1lPSJpc1N1cHBvcnRpbmciIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzVHY1lBT2llRWR1UWJ1WTZVd01TUWciPg0KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfVGxENjhDWDRFZDJLbkoyeWpOWGhXUSIgYW5ub3RhdGVkRWxlbWVudD0iX3BzTF9rQ1gzRWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgICAgICAgPGJvZHk+QSBzdXBwb3J0aW5nIG1ldGhvZCBwbHVnLWluIGlzIGEgcGx1Zy1pbiB0aGF0IGNvbnRhaW5zIHN1cHBvcnRpbmcgYW5kIG9wdGlvbmFsIG1ldGhvZCBlbGVtZW50cy4gT25seSB0aGUgZWxlbWVudHMgdGhhdCBhcmUgcmVmZXJlbmNlZCBmcm9tIG5vbi1zdXBwb3J0aW5nIHBsdWctaW4gYXJlIHRvIGJlIGNvbnNpZGVyZWQgZm9yIGluY2x1c2lvbiBpbnRvIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24uIEluIG90aGVyIHdvcmRzLCBpZiBhIHN1cHBvcnRpbmcgbWV0aG9kIHBsdWctaW4gaXMgc2VsZWN0ZWQgZm9yIGEgY29uZmlndXJhdGlvbiBvbmx5IGl0cyBlbGVtZW50cyByZWZlcmVuY2VkIGZyb20gb3V0c2lkZSBvZiB0aGlzIHBsdWctaW4gd2lsbCBiZSBjb25zaWRlcmVkIGZvciB0aGUgY29uZmlndXJhdGlvbi4gIEFsbCBvdGhlciB1bnJlZmVyZW5jZWQgZWxlbWVudHMgd2lsbCBub3QgYmUuIDwvYm9keT4NCi0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJfSHM5RWdDWDRFZDJLbkoyeWpOWGhXUSIgdHlwZT0iXzVHY1lBT2llRWR1UWJ1WTZVd01TUWciPg0KLSAgICAgICAgICAgICAgPGJvZHk+ZmFsc2U8L2JvZHk+DQotICAgICAgICAgICAgPC9kZWZhdWx0VmFsdWU+DQotICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyRDgiIG5hbWU9Im1ldGhvZFBhY2thZ2VzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxM0YiIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMkQ1Ij4NCi0gICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9Hby1Gd2VmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0dvLUZ3T2ZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIxIi8+DQotICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyRUEiIG5hbWU9ImJhc2VzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxMDQiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMkU3Ij4NCi0gICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9Hby1GeXVmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0dvLUZ5ZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MURFNDk2MjAyMEYiIG5hbWU9IkNvbnRlbnRFbGVtZW50IiBpc0Fic3RyYWN0PSJ0cnVlIj4NCi0gICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9Hb1lQLWVmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERTQ5NjIwMjBGIj4NCi0gICAgICAgICAgICA8Ym9keT5Db250ZW50IEVsZW1lbnQgaW4gdGhlIHBhY2thZ2UgTWV0aG9kIFBsdWdpbiBpbmhlcml0cyBmcm9tIFZhcmlhYmlsaXR5IEVsZW1lbnQgYW5kIG5vdCBkaXJlY3RseSBmcm9tIE1ldGhvZCBFbGVtZW50IGFueW1vcmUuICBUaGlzIGlzIGFjaGlldmVkIHVzaW5nIFVNTCAyLjAgcGFja2FnZSBtZXJnZSBzZW1hbnRpY3MuICBPbmx5IGlmIGFuIGFkb3B0ZXIgb2YgdGhpcyBtZXRhLW1vZGVsIGRlY2lkZXMgdG8gcmVhbGl6ZSBNZXRob2QgUGx1Z2lucywgaGUgd291bGQgZ2V0IHRoZSB2YXJpYWJpbGl0eSBhbmQgZXh0ZW5zaW9uIGNhcGFiaWxpdGllcyBmb3IgYWxsIENvbnRlbnQgRWxlbWVudHMuDQotQ29udGVudCBFbGVtZW50IGluaGVyaXRzIHRoZSBzZW1hbnRpY3Mgb2YgVmFyaWFiaWxpdHkgRWxlbWVudC4NCi08L2JvZHk+DQotICAgICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDFERTU4QjYwMThCIiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDIxRTg4NjgwM0U1Ii8+DQotICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDFERTQ5NTAwMUY1IiBuYW1lPSJNZXRob2RFbGVtZW50IiBpc0Fic3RyYWN0PSJ0cnVlIj4NCi0gICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9Hb1lQX3VmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERTQ5NTAwMUY1Ij4NCi0gICAgICAgICAgICA8Ym9keT5NZXRob2QgRWxlbWVudCBpbiB0aGUgcGFja2FnZSBNZXRob2QgUGx1Z2luIGFkZHMgYWRkaXRpb25hbCBwcm9wZXJ0aWVzIHZpYSBwYWNrYWdlIG1lcmdlIHRvIE1ldGhvZCBFbGVtZW50IGRlZmluZWQgaW4gTWV0aG9kIENvcmUgbmVlZGVkIGZvciB0aGUgdmFyaWFiaWxpdHkgYW5kIGV4dGVuc2liaWxpdHkgY2FwYWJpbGl0aWVzIGludHJvZHVjZXMgaW4gdGhpcyBwYWNrYWdlLjwvYm9keT4NCi0gICAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MThBQ0EwQTAwRUIiIG5hbWU9InN1cHByZXNzZWQiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzVHY1lBT2llRWR1UWJ1WTZVd01TUWciPg0KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR29pQTQtZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxOEFDQTBBMDBFQiI+DQotICAgICAgICAgICAgICA8Ym9keT5JZiBhIFZhcmlhYmlsaXR5IEVsZW1lbnQgaXMgZGVyaXZlZCBmcm9tIGFub3RoZXIgVmFyaWFiaWxpdHkgRWxlbWVudCB1c2luZyB0aGUgRXh0ZW5kcyBWYXJpYWJpbGl0eSBTcGVjaWFsaXphdGlvbiB0aGVuIHRoaXMgYXR0cmlidXRlIGNhbiBiZSB1c2VkIHRvIHN1cHByZXNzIGluaGVyaXRlZCBNZXRob2QgRWxlbWVudHMgdGhhdCB3ZXJlIHBhcnQgb2YgdGhlIGJhc2VkLW9uIFZhcmlhYmlsaXR5IEVsZW1lbnQsIHdoaWNoIGNhbiBiZSBhbnkgdHlwZSBvZiBNZXRob2QgRWxlbWVudC4gIEluIG90aGVyIHdvcmRzLCBpZiB0aGlzIGF0dHJpYnV0ZSBpcyBzZXQgdG8gdHJ1ZSBvbiBhIE1ldGhvZCBFbGVtZW50IHRoYXQgaGFzIHRoZSBzYW1lIG5hbWUgdGhhbiBhbiBpbmhlcml0ZWQgbWV0aG9kIGVsZW1lbnQgdGhlbiBpdCB3aWxsIG5vdCBiZSByZWdhcmRlZCBhcyBpbmhlcml0ZWQgYXQgYWxsLjwvYm9keT4NCi0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJfR29pQTVlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iXzVHY1lBT2llRWR1UWJ1WTZVd01TUWciPg0KLSAgICAgICAgICAgICAgPGJvZHk+ZmFsc2U8L2JvZHk+DQotICAgICAgICAgICAgPC9kZWZhdWx0VmFsdWU+DQotICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MjM4RTk0RDAwM0YiIG5hbWU9Im9yZGVyaW5nR3VpZGUiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyI+DQotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9Hb2lBNS1mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDIzOEU5NEQwMDNGIj4NCi0gICAgICAgICAgICAgIDxib2R5PlRoaXMgYXR0cmlidXRlIGlzIHVzZWQgZm9yIENBU0UgdG9vbCByZWFsaXphdGlvbnMgb2YgdGhpcyBtb2RlbCB0byBjb250YWluIGluZm9ybWF0aW9uIGFib3V0IGxheW91dCBhbmQgb3JkZXJpbmcgb2YgdGhlIG1ldGhvZCBlbGVtZW50IGFuZCBpdHMgcGFydHMuPC9ib2R5Pg0KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iXzlyUVBrZXlHRWR1NS12VmpsZlZzZlEiIHZhbHVlPSIxIi8+DQotICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfOXJRUGtPeUdFZHU1LXZWamxmVnNmUSIvPg0KLSAgICAgICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il85aHQ1RU95R0VkdTUtdlZqbGZWc2ZRIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIiB2YWx1ZT0iIi8+DQotICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpFbnVtZXJhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGNkIwMDIwMkVDIiBuYW1lPSJWYXJpYWJpbGl0eVR5cGUiPg0KLSAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dvaUE2dWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEY2QjAwMjAyRUMiPg0KLSAgICAgICAgICAgIDxib2R5PlZhcmlhYmlsaXR5IFR5cGUgaXMgYW4gRW51bWVyYXRpb24gdXNlZCBmb3IgdmFsdWVzIGZvciBpbnN0YW5jZXMgb2YgVmFyaWFiaWxpdHkgRWxlbWVudCdzIGF0dHJpYnV0ZSB2YXJpYWJpbGl0eVR5cGUuICBJdCBkZWZpbmVzIHRoZSBuYXR1cmUgb2YgaG93IGEgVmFyaWFiaWxpdHkgRWxlbWVudCBleHRlbmRzIGFub3RoZXIgVmFyaWFiaWxpdHkgRWxlbWVudC4gU2VlIGVudW1lcmF0aW9uIGxpdGVyYWxzIGZvciBkZWZpbml0aW9ucyBmb3IgZWFjaCB0eXBlLjwvYm9keT4NCi0gICAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgICAgIDxvd25lZExpdGVyYWwgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGOUM2QTMwMzM4IiBuYW1lPSJuYSI+DQotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9Hb2lBN2VmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGOUM2QTMwMzM4Ij4NCi0gICAgICAgICAgICAgIDxib2R5PlRoaXMgaXMgdGhlIGRlZmF1bHQgJnF1b3Q7bm90IGFzc2lnbmVkJnF1b3Q7IHZhbHVlIG9mIGEgVmFyaWFiaWxsaXR5IEVsZW1lbnQncyB2YXJpYWJpbGl0eVR5cGUgYXR0cmlidXRlIHdoaWNoIGlzIHNldCBpbiB0aGUgY2FzZSBubyB2YXJpYWJpbGl0eSBhc3NvY2lhdGlvbiBpcyBwcmVzZW50IGJldHdlZW4gdGhlIFZhcmlhYmlsaXR5IEVsZW1lbnQgYW5kIG90aGVyIFZhcmlhYmlsaXR5IEVsZW1lbnRzLg0KLTwvYm9keT4NCi0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgICAgPC9vd25lZExpdGVyYWw+DQotICAgICAgICAgIDxvd25lZExpdGVyYWwgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGNkIwMUYwM0MwIiBuYW1lPSJjb250cmlidXRlcyI+DQotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9Hb3JLMHVmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGNkIwMUYwM0MwIj4NCi0gICAgICAgICAgICAgIDxib2R5PkNvbnRyaWJ1dGVzIHByb3ZpZGVzIGEgd2F5IGZvciBpbnN0YW5jZXMgb2YgVmFyaWFiaWxpdHkgRWxlbWVudHMgdG8gY29udHJpYnV0ZSB0aGVpciBwcm9wZXJ0aWVzIGludG8gdGhlaXIgYmFzZSBWYXJpYWJpbGl0eSBFbGVtZW50IHdpdGhvdXQgZGlyZWN0bHkgYWx0ZXJpbmcgYW55IG9mIGl0cyBleGlzdGluZyBwcm9wZXJ0aWVzLCBpLmUuIGluIGFuIGFkZGl0aXZlIGZhc2hpb24uICBQcm9wZXJ0aWVzIGNvbnRyaWJ1dGVkIGFyZTogYXR0cmlidXRlIHZhbHVlcyBhbmQgYXNzb2NpYXRpb24gaW5zdGFuY2VzLiAgVGhlIGVmZmVjdCBhZnRlciBpbnRlcnByZXRhdGlvbiBvZiBjb250cmlidXRpb24gaXMgdGhhdCB0aGUgYmFzZSBWYXJpYWJpbGl0eSBFbGVtZW50IGlzIGxvZ2ljYWxseSByZXBsYWNlZCB3aXRoIGFuIGF1Z21lbnRlZCB2YXJpYW50IG9mIHRoZSBlbGVtZW50IHRoYXQgY29tYmluZXMgYXR0cmlidXRlIHZhbHVlcyBhbmQgYXNzb2NpYXRpb24gaW5zdGFuY2VzLiAgVGhlIHdheSB0aGlzIGNvbWJpbmF0aW9uIGlzIHJlYWxpemVkIGRlcGVuZHMgb24gdGhlIHR5cGUgb2YgdGhlIGF0dHJpYnV0ZSBvciBhc3NvY2lhdGlvbi4gIEZvciBleGFtcGxlLCBTdHJpbmcgYXR0cmlidXRlcyBhcmUgY29uY2F0ZW5hdGVkIHJlc29sdmluZyBlbWJlZGRlZCBjb21tYW5kcyBmb3IgZGVwZW5kZW50IHRleHQgb3IgbWVyZ2luZyB0ZXh0IGZyYWdtZW50cyAoZS5nLiBkZXNjcmlwdGlvbnMgZm9yIGNvbnRlbnQgZWxlbWVudHMpLiAgQWRkaXRpb25hbCBlbGVtZW50cyBpbiB0by1tYW55IGFzc29jaWF0aW9ucyBhcmUgYWRkZWQgKGUuZy4gYWRkaXRpb25hbCBHdWlkYW5jZSBlbGVtZW50cyBvciBUYXNrIERlc2NyaXB0b3JzIG9mIGFuIEFjdGl2aXR5KS4gIERpZmZlcmVudCBlbGVtZW50cyBpbiB0by1vbmUgYXNzb2NpYXRpb25zIGFyZSBpZ25vcmVkIChlLmcuIHRoZSBvbmUgUHJpbWFyeSBQZXJmb3JtZXIgb2YgYSBUYXNrKS4gIE11bHRpcGxlIENvbnRlbnQgRWxlbWVudHMgY2FuIGNvbnRyaWJ1dGUgdG8gdGhlIHNhbWUgYmFzZSBlbGVtZW50IGFuZCBhbGwgb2YgdGhlc2UgY29udHJpYnV0aW9ucyBwcm9wZXJ0aWVzIGFyZSBhZGRlZCB0byB0aGUgYmFzZSBpbiB0aGUgc2FtZSBmYXNoaW9uLiBUaGUgZm9sbG93aW5nIHRhYmxlIHByb3ZpZGVzIHRoZSBkZXRhaWxlZCBsaXN0IG9mIGludGVycHJldGF0aW9uIHJ1bGVzOg0KLWF0dHJpYnV0ZSB2YWx1ZXM6CVN0cmluZyB2YWx1ZXMgZnJvbSB0aGUgc3BlY2lhbCBWYXJpYWJpbGl0eSBFbGVtZW50IGFyZSBjb25jYXRlbmF0ZWQgd2l0aCB2YWx1ZXMgZnJvbSB0aGUgYmFzZWQtb24gVmFyaWFiaWxpdHkgRWxlbWVudC4gIE90aGVyIHZhbHVlcyBmcm9tIHRoZSBzcGVjaWFsIFZhcmlhYmlsaXR5IEVsZW1lbnQgb2YgYW55IG90aGVyIHR5cGUgc3VjaCBhcyBJbnRlZ2VyLCBEYXRlIGFyZSBpZ25vcmVkLg0KLVRoZSBpZGVudGlmeWluZyBhdHRyaWJ1dGVzIGd1aWQgYW5kIG5hbWUgb2YgTWV0aG9kIEVsZW1lbnQgYXJlIGV4ZW1wdCBmcm9tIHRoaXMgcnVsZSBhbmQgd2lsbCBub3QgYmUgbW9kaWZpZWQuDQotMC4uMS1hc3NvY2lhdGlvbiBpbnN0YW5jZXM6CVRoZSBvbmUgYXNzb2NpYXRpb24gaW5zdGFuY2Ugb2YgdGhlIGJhc2VkLW9uIFZhcmlhYmlsaXR5IEVsZW1lbnQgaXMga2VwdCBhbmQgYW55IGFzc29jaWF0aW9uIGZyb20gdGhlIGNvbnRyaWJ1dGluZyBzcGVjaWFsIFZhcmlhYmlsaXR5IEVsZW1lbnQgaXMgaWdub3JlZC4NCi0wLi5uLWFzc29jaWF0aW9uIGluc3RhbmNlczoJQXNzb2NpYXRpb24gaW5zdGFuY2VzIG9mIHRoZSBzcGVjaWFsIFZhcmlhYmlsaXR5IEVsZW1lbnQgYXJlIGFkZGVkIHRvIHRoZSBhbHJlYWR5IGV4aXN0aW5nIGFzc29jaWF0aW9uIGluc3RhbmNlcyBvZiB0aGUgYmFzZWQtb24gZWxlbWVudC4gIElmIGJvdGggVmFyaWFiaWxpdHkgRWxlbWVudHMgcmVmZXIgdG8gdGhlIHNhbWUgb2JqZWN0IHRoZW4gb25seSBvbmUgaW5zdGFuY2Ugb2YgdGhlIGFzc29jaWF0aW9uIHdpbGwgcmVtYWluLg0KLTwvYm9keT4NCi0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgICAgPC9vd25lZExpdGVyYWw+DQotICAgICAgICAgIDxvd25lZExpdGVyYWwgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGNkIwMTgwMUUwIiBuYW1lPSJleHRlbmRzIj4NCi0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dvcksxZWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEY2QjAxODAxRTAiPg0KLSAgICAgICAgICAgICAgPGJvZHk+RXh0ZW5zaW9uIGFsbG93cyBNZXRob2QgUGx1Z2lucyB0byBlYXNpbHkgcmV1c2UgZWxlbWVudHMgZnJvbSBhIEJhc2UgUGx1Z2luIGJ5IHByb3ZpZGluZyBhIGtpbmQgb2YgaW5oZXJpdGFuY2UgZm9yIHRoZSBzcGVjaWFsIFZhcmlhYmlsaXR5IEVsZW1lbnQuICBBdHRyaWJ1dGUgdmFsdWVzIGFuZCBBc3NvY2lhdGlvbiBpbnN0YW5jZXMgYXJlIGluaGVyaXRlZCBmcm9tIHRoZSBiYXNlZC1vbiBWYXJpYWJpbGl0eSBFbGVtZW50IHRvIHRoZSBzcGVjaWFsIFZhcmlhYmlsaXR5IEVsZW1lbnQuICBUaGUgcmVzdWx0IG9mIGludGVycHJldGF0aW9uIGlzIHRoYXQgdGhlIHNwZWNpYWwgZWxlbWVudCBoYXMgdGhlIHNhbWUgcHJvcGVydGllcyBhcyB0aGUgYmFzZWQtb24gaGFzLCBidXQgbWlnaHQgZGVmaW5lIGl0cyBvd24gYWRkaXRpb25zLiAgSGVuY2UgZXh0ZW5kcyBpcyBub3QgdXNlZCB0byBtb2RpZnkgY29udGVudCBvZiB0aGUgYmFzZSBQbHVnaW4sIGJ1dCB0byBwcm92aWRlIHRoZSBhYmlsaXR5IGZvciB0aGUgZXh0ZW5kaW5nIFBsdWdpbiB0byBkZWZpbmUgaXRzIG93biBjb250ZW50IHdoaWNoIGlzIGEgdmFyaWFudCBvZiBjb250ZW50IGFscmVhZHkgZGVmaW5lZCAoZS5nLiBhIHNwZWNpYWwgdmVyc2lvbiBvZiBhIGdlbmVyaWMgUmV2aWV3IFJlY29yZCBmb3IgYSBzcGVjaWZpYyB0eXBlIG9mIHJldmlldykuICBUaGUgZWZmZWN0IG9mIHRoaXMgaXMgdGhhdCB0aGUgYmFzZSBWYXJpYWJpbGl0eSBFbGVtZW50IGFuZCBhbnkgbnVtYmVyIG9mIGV4dGVuZGluZyBWYXJpYWJpbGl0eSBFbGVtZW50cyBjYW4gYmUgdXNlZCBzaWRlIGJ5IHNpZGUsIGJ1dCByZWZlciB0byBlYWNoIG90aGVyIHZpYSB0aGUgZXh0ZW5kcyByZWxhdGlvbnNoaXAuICBFeHRlbmRzIGFsc28gcHJvdmlkZXMgdGhlIGtleSBtZWNoYW5pc20gZm9yIGJpbmRpbmcgQ2FwYWJpbGl0eSBQYXR0ZXJucyB0byBQcm9jZXNzZXM6IEEgcGF0dGVybiBpcyBhcHBsaWVkIGJ5IGRlZmluaW5nIGFuIGV4dGVuZHMgcmVsYXRpb25zaGlwcyBmcm9tIGFuIEFjdGl2aXR5IG9mIHRoZSBhcHBseWluZyBQcm9jZXNzZXMgdG8gdGhlIFBhdHRlcm4uICBUaGUgQWN0aXZpdHkgaW5oZXJpdHMgYXNzb2NpYXRpb25zIGluc3RhbmNlcyBmcm9tIHRoZSBwYXR0ZXJuIGFuZCB0aGUgcGF0dGVybiBhcHBlYXJzIHRvIGJlIHBhcnQgb2YgdGhlIHJlc3VsdGluZyBQcm9jZXNzIGFmdGVyIEludGVycHJldGF0aW9uLg0KLWF0dHJpYnV0ZSB2YWx1ZXM6CVZhbHVlcyBmcm9tIHRoZSBiYXNlZC1vbiBWYXJpYWJpbGl0eSBlbGVtZW50IGFyZSBpbmhlcml0ZWQgYW5kIHVzZWQgdG8gcG9wdWxhdGUgdGhlIHNwZWNpYWwgVmFyaWFiaWxpdHkgRWxlbWVudHMgYXR0cmlidXRlcy4gIElmIHRoZSBzcGVjaWFsIGVsZW1lbnQgYXR0cmlidXRlcyBhcmUgYWxyZWFkeSBwb3B1bGF0ZWQgdGhlIGluaGVyaXRlZCB2YWx1ZXMgYXJlIGlnbm9yZWQuICANCi1UaGUgaWRlbnRpZnlpbmcgYXR0cmlidXRlcyBndWlkIGFuZCBuYW1lIG9mIE1ldGhvZCBFbGVtZW50IGFyZSBleGVtcHQgZnJvbSB0aGlzIHJ1bGUgYW5kIHdpbGwgbm90IGJlIG1vZGlmaWVkLg0KLTAuLjEtYXNzb2NpYXRpb24gaW5zdGFuY2VzOglUaGUgb25lIGFzc29jaWF0aW9uIGluc3RhbmNlIG9mIHRoZSBiYXNlZC1vbiBWYXJpYWJpbGl0eSBFbGVtZW50IGlzIGluaGVyaXRlZCB0byB0aGUgc3BlY2lhbCBWYXJpYWJpbGl0eSBFbGVtZW50LiAgSWYgdGhlIHNwZWNpYWwgVmFyaWFiaWxpdHkgRWxlbWVudCBkZWZpbmVzIGl0cyBvd24gYXNzb2NpYXRpb24gaW5zdGFuY2UgdGhlbiB0aGUgaW5oZXJpdGVkIG9uZSBpcyBpZ25vcmVkLg0KLTAuLm4tYXNzb2NpYXRpb24gaW5zdGFuY2VzOglBc3NvY2lhdGlvbiBpbnN0YW5jZXMgZGVmaW5lZCBmb3IgdGhlIGJhc2VkLW9uIFZhcmlhYmlsaXR5IEVsZW1lbnQgYXJlIGluaGVyaXRlZCB0byB0aGUgc3BlY2lhbCBWYXJpYWJpbGl0eSBFbGVtZW50LiAgVGhlIHNwZWNpYWwgZWxlbWVudCBjYW4gYWRkIGFkZGl0aW9uYWwgYXNzb2NpYXRpb24gaW5zdGFuY2VzLg0KLQ0KLTwvYm9keT4NCi0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgICAgPC9vd25lZExpdGVyYWw+DQotICAgICAgICAgIDxvd25lZExpdGVyYWwgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGNkIwMUMwMjg2IiBuYW1lPSJyZXBsYWNlcyI+DQotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9Hb3JLMk9mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGNkIwMUMwMjg2Ij4NCi0gICAgICAgICAgICAgIDxib2R5PlJlcGxhY2VzIHByb3ZpZGVzIGEgd2F5IGZvciBWYXJpYWJpbGl0eSBFbGVtZW50cyB0byByZXBsYWNlIGEgYmFzZSBWYXJpYWJpbGl0eSBFbGVtZW50IHdpdGhvdXQgZGlyZWN0bHkgY2hhbmdpbmcgYW55IG9mIGl0cyBleGlzdGluZyBwcm9wZXJ0aWVzLiAgVGhpcyBpcyBpbiBtb3N0IGNhc2VzIHVzZWQgZm9yIE1ldGhvZCBQbHVnaW5zIHRoYXQgYWltIHRvIHJlcGxhY2Ugc3BlY2lmaWMgQ29udGVudCBFbGVtZW50cyBzdWNoIGFzIFJvbGVzLCBUYXNrLCBvciBBY3Rpdml0aWVzIHdpdGggZWl0aGVyIGEgY29tcGxldGUgbmV3IHZhcmlhbnQgb3IgdG8gY2hhbmdlIGZ1bmRhbWVudGFsIHJlbGF0aW9uc2hpcHMgb2YgdGhlc2UgZWxlbWVudHMgKGUuZy4gUm9sZS1BcnRpZmFjdCByZXNwb25zaWJpbGl0eSkuICBQcm9wZXJ0aWVzIHJlcGxhY2VkIGFyZSBhdHRyaWJ1dGUgdmFsdWVzIGFuZCBhc3NvY2lhdGlvbiBpbnN0YW5jZXMuICBUaGUgZWZmZWN0IG9mIHRoaXMgaXMgdGhhdCB0aGUgYmFzZSBDb250ZW50IEVsZW1lbnQgaXMgbG9naWNhbGx5IHJlcGxhY2VkIHdpdGggdGhpcyBuZXcgdmFyaWFudCBvZiB0aGUgZWxlbWVudCB0byB3aGljaCBhbGwgaW5jb21pbmcgYXNzb2NpYXRpb25zIHN0aWxsIHBvaW50IGFzIGJlZm9yZSwgYnV0IHdoaWNoIGhhcyBwb3RlbnRpYWxseSBuZXcgYXR0cmlidXRlIHZhbHVlcyBhbmQgb3V0Z29pbmcgYXNzb2NpYXRpb24gcHJvcGVydGllcy4gIFRoaXMgcHJvdmlkZXMgYSB2ZXJ5IHBvd2VyZnVsIG1lY2hhbmlzbSB0byByZXBsYWNlLCBmb3IgZXhhbXBsZSwgd2hvbGUgQWN0aXZpdGllcyBpbiBhIFByb2Nlc3Mgd2l0aCBjb21wbGV0ZSBuZXcgcmVhbGl6YXRpb25zIG9mIHRoZSBBY3Rpdml0eS4gIEZvciBpbnN0YW5jZSwgcmVwbGFjaW5nIGFuIEFjdGl2aXR5IGRvaW5nIHVzZSBjYXNlLWJhc2VkIGRlc2lnbiB3aXRoIGFuIGFjdGl2aXR5IGRvaW5nIGFnaWxlIGNvZGUtY2VudHJpYyBkZXZlbG9wbWVudCBkb2luZyB0aGUgc2FtZSB3b3JrIHVzaW5nIGEgZGlmZmVyZW50IGRldmVsb3BtZW50IHRlY2huaXF1ZSB1dGlsaXppbmcgZGlmZmVyZW50IFJvbGVzLCBUYXNrcywgZXRjLiAgQW5vdGhlciBleGFtcGxlLCB3b3VsZCBiZSB0byByZXBsYWNlIGFuIEFjdGl2aXR5IHRoYXQgZGVzY3JpYmVzIGRhdGFiYXNlIGRlc2lnbiBmb3IgYW4gUkRCTVMgd2l0aCBhbiBBY3Rpdml0eSB0aGF0IGRlc2NyaWJlcyBkYXRhYmFzZSBkZXNpZ24gZm9yIGFuIE9PREJNUy4gIEEgVmFyaWFiaWxpdHkgRWxlbWVudCBjYW4gb25seSBiZSByZXBsYWNlZCBieSBvbmUgb3RoZXIgZWxlbWVudCBhdCBhIHRpbWUuICBGb3IgZXhhbXBsZSwgaWYgdHdvIE1ldGhvZCBQbHVnaW5zIHJlcGxhY2UgdGhlIHNhbWUgZWxlbWVudCBvbmx5IG9uZSBNZXRob2QgUGx1Z2luIGNhbiBiZSB1c2VkIGZvciBpbnRlcnByZXRhdGlvbiAoc2VlIGNvbmNlcHQgb2YgTWV0aG9kIENvbmZpZ3VyYXRpb24gZm9yIG1vcmUgZGV0YWlscyBvbiBob3cgdG8gcmVzb2x2ZSBzdWNoIGNvbmZsaWN0cywgU2VjdGlvbiA3LjEuMikuICBUaGUgZm9sbG93aW5nIHRhYmxlIHByb3ZpZGVzIHRoZSBkZXRhaWxlZCBsaXN0IG9mIGludGVycHJldGF0aW9uIHJ1bGVzOg0KLWF0dHJpYnV0ZSB2YWx1ZXM6CVZhbHVlcyBmcm9tIHRoZSBzcGVjaWFsIFZhcmlhYmlsaXR5IEVsZW1lbnQgYXJlIHJlcGxhY2VkIHdpdGggdmFsdWVzIGZyb20gdGhlIGJhc2VkLW9uIFZhcmlhYmlsaXR5IEVsZW1lbnQgaW5jbHVkaW5nIHVuYXNzaWduZWQgdmFsdWVzLg0KLVRoZSBpZGVudGlmeWluZyBhdHRyaWJ1dGVzIGd1aWQgYW5kIG5hbWUgb2YgTWV0aG9kIEVsZW1lbnQgYXJlIGV4ZW1wdCBmcm9tIHRoaXMgcnVsZSBhbmQgd2lsbCBub3QgYmUgbW9kaWZpZWQuDQotMC4uMS1hc3NvY2lhdGlvbiBpbnN0YW5jZXM6CVRoZSBvbmUgYXNzb2NpYXRpb24gaW5zdGFuY2Ugb2YgdGhlIGJhc2VkLW9uIFZhcmlhYmlsaXR5IEVsZW1lbnQgaXMgcmVwbGFjZWQgd2l0aCB0aGUgYXNzb2NpYXRpb24gaW5zdGFuY2UgZnJvbSB0aGUgcmVwbGFjaW5nIHNwZWNpYWwgVmFyaWFiaWxpdHkgRWxlbWVudC4gIElmIHRoZSBzcGVjaWFsIFZhcmlhYmlsaXR5IEVsZW1lbnQgZG9lcyBub3QgaGF2ZSBhbiBhc3NvY2lhdGlvbiBpbnN0YW5jZSB0aGVuIHJlc3VsdGluZyBlbGVtZW50IHdpbGwgYWxzbyBub3QgaGF2ZSBhbiBhc3NvY2lhdGlvbi4NCi0wLi5uLWFzc29jaWF0aW9uIGluc3RhbmNlczoJQXNzb2NpYXRpb24gaW5zdGFuY2VzIG9mIHRoZSBzcGVjaWFsIFZhcmlhYmlsaXR5IEVsZW1lbnQgcmVwbGFjZSBhbGwgYXNzb2NpYXRpb24gaW5zdGFuY2VzIG9mIHRoZSBiYXNlZC1vbiBWYXJpYWJpbGl0eSBFbGVtZW50Lg0KLQ0KLTwvYm9keT4NCi0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgICAgPC9vd25lZExpdGVyYWw+DQotICAgICAgICAgIDxvd25lZExpdGVyYWwgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDQ2MjhFNEIwMTMzIiBuYW1lPSJsb2NhbENvbnRyaWJ1dGlvbiIvPg0KLSAgICAgICAgICA8b3duZWRMaXRlcmFsIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQ0NjI4RTVFMDEzQiIgbmFtZT0ibG9jYWxSZXBsYWNlbWVudCIvPg0KLSAgICAgICAgICA8b3duZWRMaXRlcmFsIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQ1QzhENjcwMDJBOSIgbmFtZT0iZXh0ZW5kc1JlcGxhY2VzIi8+DQotICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDIxRTg4NjgwM0U1IiBuYW1lPSJWYXJpYWJpbGl0eUVsZW1lbnQiIGlzQWJzdHJhY3Q9InRydWUiPg0KLSAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dvckszdWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjFFODg2ODAzRTUiPg0KLSAgICAgICAgICAgIDxib2R5PlZhcmlhYmlsaXR5IEVsZW1lbnQgaXMgYW4gYWJzdHJhY3QgY2xhc3MgZGVyaXZlZCBmcm9tIE1ldGhvZCBFbGVtZW50IHRoYXQgcHJvdmlkZXMgbmV3IGNhcGFiaWxpdGllcyBmb3IgY29udGVudCB2YXJpYXRpb24gYW5kIGV4dGVuc2lvbiB0byBDb250ZW50IEVsZW1lbnRzIG9yIGFueSBvdGhlciBNZXRob2QgRWxlbWVudCB0aGF0IGRlcml2ZXMgZnJvbSBpdC4gIEl0IGhhcyBiZWVuIHBsYWNlZCBpbi1iZXR3ZWVuIHRoZSBjbGFzc2VzIE1ldGhvZCBFbGVtZW50IGFuZCBDb250ZW50IEVsZW1lbnQgaW4gdGhlIG92ZXJhbGwgVU1BIHRheG9ub215IG9mIGNsYXNzZXMgdXNpbmcgdGhlIFVNTCAyLjAgcGFja2FnZSBtZXJnZSBtZWNoYW5pc20uICBUaGUgYXNzb2NpYXRpb24gVmFyaWFiaWxpdHkgU3BlY2lhbGl6YXRpb24gc2hhbGwgb25seSBiZSBpbnN0YW50aWF0ZWQgYmV0d2VlbiB0d28gc3ViY2xhc3NlcyBvZiBWYXJpYWJpbGl0eSBFbGVtZW50IG9mIHRoZSBzYW1lIHR5cGUuICBUaGUgZWxlbWVudCBvbiB2YXJhaWJpbGl0eVNwZWNpYWxFbGVtZW50IHNpZGUgb2YgdGhlIHJlbGF0aW9uc2hpcCBkZWZpbmVzIGEgdmFsdWUgZm9yIHRoZSBhdHRyaWJ1dGUgdmFyaWFiaWxpdHlUeXBlIGRlZmluaW5nIHRoZSBuYXR1cmUgb2YgdGhlIHJlbGF0aW9uc2hpcCB1c2luZyBhIGxpdGVyYWwgZnJvbSB0aGUgZW51bWVyYXRpb24gVmFyaWFiaWxpdHkgVHlwZS4NCi1WYXJpYWJpbGl0eSBFbGVtZW50IG9mIHRoZSBtZXRhLW1vZGVsIHBhY2thZ2UgTWV0aG9kIFBsdWdpbnMgYWRkcyB0aGUgY2FwYWJpbGl0aWVzIG9mIHZhcmlhdGlvbiBhbmQgZXh0ZW5zaW9uIHRvIE1ldGhvZCBFbGVtZW50cyB0aGF0IGRlcml2ZSBmcm9tIGl0LiAgQnkgZGVmYXVsdCBhbGwgQ29udGVudCBFbGVtZW50cyBzdWNoIGFzIFJvbGUsIFRhc2ssIEd1aWRhbmNlIFR5cGVzLCBvciBBY3Rpdml0aWVzIGFyZSBkZWZpbmVkIHRvIGJlIFZhcmlhYmlsaXR5IEVsZW1lbnRzLg0KLVZhcmlhYmlsaXR5IGFuZCBleHRlbnNpb24gcHJvdmlkZXMgdW5pcXVlIG1lY2hhbmlzbXMgZm9yIGN1c3RvbWl6aW5nIG1ldGhvZCBjb250ZW50IHdpdGhvdXQgYWN0dWFsbHkgZGlyZWN0bHkgbW9kaWZ5aW5nIHRoZSBvcmlnaW5hbCBjb250ZW50LCBidXQgYnkganVzdCBiZSBhYmxlIHRvIGRlc2NyaWJlIHdpdGggc2VwYXJhdGUgb2JqZWN0cyB0aGUgZGlmZmVyZW5jZXMgKGFkZGl0aW9ucywgY2hhbmdlcywgb21pc3Npb25zKSByZWxhdGl2ZSB0byB0aGUgb3JpZ2luYWwuICBUaGlzIHBsdWctaW4gY29uY2VwdCBhbGxvd3MgdXNlcnMgdG8gZmFjdG9yIHRoZWlyIG1ldGhvZCBjb250ZW50IGFuZCBwcm9jZXNzZXMgaW4gaW50ZXJyZWxhdGVkIHVuaXRzIGFuZCBldmVuIHRvIGFyY2hpdGVjdCBtZXRob2QgY29udGVudCBhbmQgcHJvY2Vzc2VzIGluIGxheWVycyB0aGF0IGV4dGVuZCBlYWNoIG90aGVyIHdpdGggbmV3IGNhcGFiaWxpdGllcy4gIFRoZSByZXN1bHRpbmcgbWV0aG9kIGFuZCBwcm9jZXNzIGRlc2lnbiBjYW4gYmUgZHluYW1pY2FsbHkgY29tYmluZWQgYW5kIGFwcGxpZWQgb24gZGVtYW5kIHVzaW5nIHRoZSBpbnRlcnByZXRhdGlvbiBydWxlcyBkZWZpbmVkIGZvciBWYXJpYWJpbGl0eSBFbGVtZW50IFNwZWNpYWxpemF0aW9ucyBhc3NlbWJsaW5nIHRvIHByb2Nlc3MgcHJhY3RpdGlvbmVycyB0aGUgbW9zdCBhY2N1cmF0ZSBtZXRob2QgYW5kIHByb2Nlc3MgZGVzY3JpcHRpb25zIHBvc3NpYmxlLiAgSXQgYWxzbyBhbGxvd3MgcHJvY2VzcyBwcmFjdGl0aW9uZXJzIHRvIGV4dGVuZHMgYW5kIHRhaWxvciBtZXRob2QgY29udGVudCBhbmQgcHJvY2Vzc2VzIHRoZXkgZG8gbm90IG93biBhbmQgdG8gZWFzaWx5IHVwZ3JhZGUgdG8gbmV3ZXIgdmVyc2lvbnMgYnkgc2ltcGx5IHJlYXBwbHkgdGhlaXIgcGVyc29uYWwgY2hhbmdlcyB0byB0aGVzZSB1cGdyYWRlcy4NCi1WYXJpYWJpbGl0eSBFbGVtZW50IGRlZmluZXMgdHdvIHR5cGVzIG9mIHZhcmlhYmlsaXR5IGFuZCBvbmUgdHlwZSBvZiBleHRlbnNpb24gd2hpY2ggYXJlIGZvcm1hbGx5IGRlZmluZWQgZm9yIHRoZSBlbnVtZXJhdGlvbiBWYXJpYWJpbGl0eSBUeXBlLg0KLTwvYm9keT4NCi0gICAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il9KeFBmNE94WkVkdU9Ock1SZ216NDhBIiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDFERTQ5NTAwMUY1Ii8+DQotICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEY2QjBFNjAzQzciIG5hbWU9InZhcmlhYmlsaXR5VHlwZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGNkIwMDIwMkVDIj4NCi0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dvcks0dWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEY2QjBFNjAzQzciPg0KLSAgICAgICAgICAgICAgPGJvZHk+SWYgaW4gaW5zdGFuY2Ugb2YgdGhlIHZhcmlhYmlsaXR5U3BlY2lhbGl6YXRpb24gYXNzb2NpYXRpb24gYmV0d2VlbiB0d28gVmFyaWFiaWxpdHkgRWxlbWVudHMgb2YgdGhlIHNhbWUgdHlwZSBleGlzdHMsIHRoZW4gdGhlIHZhcmlhYmlsaXR5VHlwZSBhdHRyaWJ1dGUgc3BlY2lmaWVzIGhvdyB0aGUgZWxlbWVudCBhdCB0aGUgdmFyaWFiaWxpdHlTcGVjaWFsRWxlbWVudCBlbmQgb2YgdGhlIGFzc29jaWF0aW9uIGNoYW5nZXMgdGhlIENvbnRlbnQgRWxlbWVudCBhdCB0aGUgdmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCBlbmQuIFNlZSB0aGUgVmFyaWFiaWxpdHkgVHlwZSBlbnVtZXJhdGlvbiBjbGFzcyBmb3IgZGVmaW5pdGlvbnMgZm9yIHRoZSBkaWZmZXJlbnQgdHlwZXMgb2YgdmFyaWFiaWxpdHkuPC9ib2R5Pg0KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9Il9HbzA3MGVmWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgIDxib2R5Pm5hPC9ib2R5Pg0KLSAgICAgICAgICAgIDwvZGVmYXVsdFZhbHVlPg0KLSAgICAgICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDFERTU4N0EwM0EyIiBuYW1lPSJ2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MjFFODg2ODAzRTUiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDFERTU4N0EwM0EwIj4NCi0gICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9Hby1GMC1mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iMSIvPg0KLSAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0dvLUYwdWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIxIi8+DQotICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDI3OTU1NDUwMTM0IiBuYW1lPSJTZWN0aW9uIj4NCi0gICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HbzA3MC1mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3OTU1NDUwMTM0Ij4NCi0gICAgICAgICAgICA8Ym9keT5TZWN0aW9uIGluIHRoZSBwYWNrYWdlIE1ldGhvZCBQbHVnaW4gaW5oZXJpdHMgZnJvbSBWYXJpYWJpbGl0eSBFbGVtZW50IGFuZCBleHRlbmRzIFNlY3Rpb24gZGVmaW5lZCBpbiBNZXRob2QgQ29yZSA6OiBCYXNpYyBFbGVtZW50cyB3aXRoIG5ldyBjYXBhYmlsaXRpZXMgZm9yIHZhcmlhYmlsaXR5LiANCi1Gb3IgZXhhbXBsZSwgd2hlbiBhIFRhc2sgY29udHJpYnV0ZXMgdG8gYW5vdGhlciBUYXNrIGl0cyBQcmVzZW50YXRpb24gYXNzb2NpYXRpb24gaXMgY29udHJpYnV0ZWQgaW5jbHVkaW5nIGl0cyBTZWN0aW9ucyAoaS5lLiBpdHMgU3RlcHMpLCB3aGljaCBhcmUgbW9kZWxlZCBhcyBwYXJ0cyBvZiB0aGUgQ29udGVudCBEZXNjcmlwdGlvbiBpbnN0YW5jZS4gIFNlY3Rpb25zIGNhbiBiZSBuZXN0ZWQgYW5kIHRoZXJlZm9yZSBUYXNrIERlc2NyaXB0aW9ucyBjYW4gYmUgZmxleGlibHkgb3JnYW5pemVkIGluIFN0ZXBzIHdpdGggc3ViLVN0ZXBzLiAgU2VjdGlvbnMgYXJlIFZhcmlhYmlsaXR5IEVsZW1lbnRzIHRoZW1zZWx2ZXMsIHNvIHRoZXkgY2FuIGNvbnRyaWJ1dGUgdG8gZWFjaCBvdGhlci4gIEZvciBleGFtcGxlLCBvbmUgY291bGQgbW9kZWwgYSBUYXNrIHN0ZXAgYXMgYSBTZWN0aW9uIGluc3RhbmNlIHdpdGhvdXQgcmVsYXRpbmcgaXQgdG8gYSBUYXNrIERlc2NyaXB0aW9uIHRoYXQgZGlyZWN0bHkgY29udHJpYnV0ZXMgdG8gKG9yIHJlcGxhY2VzKSBhbm90aGVyIFNlY3Rpb24gd2hpY2ggaXMgcGFydCBvZiBhIFRhc2sgRGVzY3JpcHRpb24uICBUaGlzIGNvbnRyaWJ1dGlvbiAob3IgcmVwbGFjZW1lbnQpIHdvdWxkIGFkZCBuZXcgZGVzY3JpcHRpb24gdGV4dCB0byB0aGUgb3JpZ2luYWwgc3RlcCBkZXNjcmlwdGlvbiAob3IgcmVwbGFjZSB0aGUgb3JpZ2luYWwgc3RlcCBkZXNjcmlwdGlvbikuICBBbm90aGVyIGV4YW1wbGUgd291bGQgYmUgdG8gY29udHJpYnV0ZSBuZXcgQ2hlY2sgTGlzdCBpdGVtcyBvcmdhbml6ZWQgYXMgU2VjdGlvbnMgdG8gYW4gZXhpc3RpbmcgQ2hlY2sgTGlzdCAoZGVmaW5lZCBhcyBndWlkYW5jZSkuICANCi0NCi08L2JvZHk+DQotICAgICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDI3OTU1NjAwMTcwIiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDIxRTg4NjgwM0U1Ii8+DQotICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MjFFOEU2NzAxQjEiIG5hbWU9InByZWRlY2Vzc29yIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0Mjc5NTU0NTAxMzQiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDIxRThFNjUwMjEzIj4NCi0gICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9Hby1GMmVmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iMSIvPg0KLSAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0dvLUYyT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MjdBQTBBRTAzOUQiIG5hbWU9IkFjdGl2aXR5Ij4NCi0gICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HbzA3Mk9mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QUEwQUUwMzlEIj4NCi0gICAgICAgICAgICA8Ym9keT5BY3Rpdml0eSBpbiB0aGUgcGFja2FnZSBNZXRob2QgUGx1Z2luIGluaGVyaXRzIGZyb20gVmFyaWFiaWxpdHkgRWxlbWVudCB0byBleHRlbmQgQWN0aXZpdHkgd2l0aCBuZXcgY2FwYWJpbGl0aWVzIGZvciB2YXJpYWJpbGl0eS4mI3hEOw0KLUFjdGl2aXR5IGluaGVyaXRzIHRoZSBzZW1hbnRpY3Mgb2YgVmFyaWFiaWxpdHkgRWxlbWVudCB3aGljaCBwcm92aWRlcyBrZXkgbWVjaGFuaXNtIHRvIGVuYWJsZSBkeW5hbWljIGJpbmRpbmcgb2YgQ2FwYWJpbGl0eSBQYXR0ZXJucyBpbiBQcm9jZXNzZXMgYXMgd2VsbCBhcyBQcm9jZXNzIENvbnRyaWJ1dGlvbnMuICBWYXJpYWJpbGl0eSBpcyB1c2VkIGluIHRoZSBmb2xsb3dpbmcgd2F5IGZvciBBY3Rpdml0aWVzOiYjeEQ7DQotLSBFeHRlbmQ6IFRvIGFwcGx5IGEgQ2FwYWJpbGl0eSBQYXR0ZXJuIHRvIGEgcHJvY2VzcyBvbmUgd291bGQgY3JlYXRlIGFuIEFjdGl2aXR5IHdoaWNoIGV4dGVuZHMgdGhlIHBhdHRlcm4ncyB0b3AtbGV2ZWwgYWN0aXZpdHkuICBUaHJvdWdoIGV4dGVuc2lvbiB0aGUgZXh0ZW5kaW5nIEFjdGl2aXR5IGluaGVyaXRzIHRoZSBwYXR0ZXJucyBCcmVha2Rvd24gRWxlbWVudHMuJiN4RDsNCi0tIFJlcGxhY2U6IFRvIHJlcGxhY2UgYW4gQWN0aXZpdHkgb2YgYW4gYXBwbGllZCBDYXBhYmlsaXR5IFBhdHRlcm4gb3IgYW4gZXhpc3RpbmcgcHJvY2VzcyBmb3Igd2hpY2ggb25lIGRldmVsb3BzIGEgUHJvY2VzcyBDb250cmlidXRpb24gKG9yIGEgY29tYmluYXRpb24gb2YgYm90aCkgb25lIHdvdWxkIGNyZWF0ZSBhbiBBY3Rpdml0eSBhbmQgc3BlY2lmeSB0aGUgcmVwbGFjZSB2YXJpYWJpbGl0eSBzcGVjaWFsaXphdGlvbiBiZXR3ZWVuIHRoZW0uJiN4RDsNCi0tIENvbnRyaWJ1dGU6IFRvIGNvbnRyaWJ1dGUgbmV3IEJyZWFrZG93biBFbGVtZW50cyB0byBhbiBleGlzdGluZyBBY3Rpdml0eSBvbmUgd291bGQgZGVmaW5lIGFuIEFjdGl2aXR5IHdpdGggQnJlYWtkb3duIEVsZW1lbnRzIHRoYXQgcmVsYXRlcyB2aWEgdGhlIENvbnRyaWJ1dGVzIFZhcmlhYmlsaXR5IFNwZWNpYWxpemF0aW9uIHRvIHRoaXMgZXhpc3RpbmcgQWN0aXZpdHkuICBUaGUgY29udHJpYnV0aW5nIEFjdGl2aXR5J3MgQnJlYWtkb3duIEVsZW1lbnRzIHdpbGwgYmUgYWRkZWQgdG8gdGhlIGNvbnRyaWJ1dGVkIEFjdGl2aXR5LiYjeEQ7DQotJiN4RDsNCi08L2JvZHk+DQotICAgICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDI3QUEwRDMwMjQ1IiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDIxRTg4NjgwM0U1Ii8+DQotICAgICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il9oeTJwOE1WT0VkeTJtdVEyUFF2SF9BIiBnZW5lcmFsPSJfdVZfQ0VNVklFZHkybXVRMlBRdkhfQSIvPg0KLSAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDJENSIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMkQ2IF8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyRDgiPg0KLSAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dvMDczZWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyRDUiPg0KLSAgICAgICAgICAgIDxib2R5PlRoaXMgY29tcG9zaXRpb24gYXNzb2NpYXRpb24gcmVwcmVzZW50cyB0aGF0IGV2ZXJ5IE1ldGhvZCBQYWNrYWdlIChlaXRoZXIgQ29udGVudCBQYWNrYWdlLCBQcm9jZXNzIFBhY2thZ2UsIG9yIFByb2Nlc3MgQ29tcG9uZW50KSBpcyBwYXJ0IG9mIGV4YWN0bHkgb25lIE1ldGhvZCBQbHVnaW4uPC9ib2R5Pg0KLSAgICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDJENiIgbmFtZT0iX21ldGhvZFBsdWdpbiIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMTA0IiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMkQ1Ij4NCi0gICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HbzA3NGVmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iMSIvPg0KLSAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0dvMDc0T2ZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIxIi8+DQotICAgICAgICAgIDwvb3duZWRFbmQ+DQotICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMkU3IiBuYW1lPSJFeHRlbnNpb24iIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDJFOCBfM0FEQzdCNzQwMjJENDBGMzZDNjAwMkVBIj4NCi0gICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9Hby1Gdy1mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMkU3Ij4NCi0gICAgICAgICAgICA8Ym9keT5UaGlzIGFzc29jaWF0aW9uIGRlZmluZXMgaG93IE1ldGhvZCBQbHVnaW5zIGV4dGVuZCBtYW55IG90aGVyIE1ldGhvZCBQbHVnaW5zLiAgVGhlIGV4dGVuZGluZyBwbHVnLWluIGNvbnRhaW5zIG5ldyBtZXRob2QgZWxlbWVudHMsIGV4dGVuZHMgZXhpc3RpbmcgbWV0aG9kIGVsZW1lbnRzIGFuZCBwcm9jZXNzZXMgdXNpbmcgY29udGVudCBlbGVtZW50IHZhcmlhYmlsaXR5IG1lY2hhbmlzbXMgKGUuZy4gY29udHJpYnV0aW9uLCByZXBsYWNlLCBldGMuKSwgcHJvdmlkZXMgYWRkaXRpb25hbCBEZWxpdmVyeSBhbmQgQ2FwYWJpbGl0eSBQcm9jZXNzZXMgZm9yIGEgTWV0aG9kIEZyYW1ld29yaywgZXRjLjwvYm9keT4NCi0gICAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyRTgiIG5hbWU9InBsdWdpbnMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDEwNCIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyRTciPg0KLSAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0dvLUZ4LWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+DQotICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR28tRnh1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICA8L293bmVkRW5kPg0KLSAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxREU1ODdBMDNBMCIgbmFtZT0idmFyaWFiaWxpdHlTcGVjaWFsaXphdGlvbiIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDFERTU4N0EwM0ExIF8zQURDN0I3NDAyMkQ0MURFNTg3QTAzQTIiPg0KLSAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dvLUZ6T2ZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURFNTg3QTAzQTAiPg0KLSAgICAgICAgICAgIDxib2R5PlRoaXMgMS10by1tYW55IGFzc29jaWF0aW9uIGRlZmluZXMgaW4gY29tYmluYXRpb24gd2l0aCB0aGUgdmFyaWFiaWxpdHlUeXBlIGF0dHJpYnV0ZSB0aGF0IGEgbnVtYmVyIG9mIHNwZWNpYWwgVmFyaWFiaWxpdHkgRWxlbWVudHMgb2YgdGhlIHNhbWUgdHlwZSByZXByZXNlbnQgYSB2YXJpYXRpb24gb2YgZXhhY3RseSBvbmUgb3RoZXIgVmFyaWFiaWxpdHkgRWxlbWVudC4gIFNlZSB0aGUgVmFyaWFiaWxpdHkgVHlwZSBlbnVtZXJhdGlvbiBjbGFzcyBmb3IgZGVmaW5pdGlvbnMgZm9yIHRoZSBkaWZmZXJlbnQgdHlwZXMgb2YgdmFyaWFiaWxpdHkuPC9ib2R5Pg0KLSAgICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxREU1ODdBMDNBMSIgbmFtZT0idmFyaWFiaWxpdHlTcGVjaWFsRWxlbWVudCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDIxRTg4NjgwM0U1IiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQxREU1ODdBMDNBMCI+DQotICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR28tRjBPZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4NCi0gICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9Hby1Gei1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgIDwvb3duZWRFbmQ+DQotICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDIxRThFNjUwMjEzIiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0MjFFOEU2NzAxQjEgXzNBREM3Qjc0MDIyRDQyMUU4RTY3MDFCQyI+DQotICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR28tRjFlZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMUU4RTY1MDIxMyI+DQotICAgICAgICAgICAgPGJvZHk+VGhpcyBhc3NvY2lhdGlvbiBkZXNjcmliZXMgdGhlIG9yZGVyIGluIHdoaWNoIGNvbnRyaWJ1dGVkIFNlY3Rpb25zIHNoYWxsIGJlIGluc2VydGVkIGludG8gYW4gIGV4aXN0aW5nIGxpc3Qgb2YgU2VjdGlvbnMgbWFpbnRhaW5lZCBmb3IgYSBDb250ZW50IERlc2NyaXB0aW9uLjwvYm9keT4NCi0gICAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MjFFOEU2NzAxQkMiIG5hbWU9Il9zZWN0aW9uIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0Mjc5NTU0NTAxMzQiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MjFFOEU2NTAyMTMiPg0KLSAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0dvLUYzT2ZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+DQotICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR28tRjItZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICA8L293bmVkRW5kPg0KLSAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3VWX0NFTVZJRWR5Mm11UTJQUXZIX0EiIG5hbWU9IkZ1bGZpbGxhYmxlRWxlbWVudCI+DQotICAgICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il9sR1BZTU1WTUVkeTJtdVEyUFF2SF9BIiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDI5NEVCOTAwMEZDIi8+DQotICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il9hNGptd2NWTkVkeTJtdVEyUFF2SF9BIiBuYW1lPSJmdWxmaWxscyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdVZfQ0VNVklFZHkybXVRMlBRdkhfQSIgYXNzb2NpYXRpb249Il9hNGptd01WTkVkeTJtdVEyUFF2SF9BIj4NCi0gICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9hNGptdzhWTkVkeTJtdVEyUFF2SF9BIiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX2E0am13c1ZORWR5Mm11UTJQUXZIX0EiLz4NCi0gICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il9hNGptd01WTkVkeTJtdVEyUFF2SF9BIiBuYW1lPSJGdWxmaWxsbWVudCIgbWVtYmVyRW5kPSJfYTRqbXdjVk5FZHkybXVRMlBRdkhfQSBfYTRqbXhNVk5FZHkybXVRMlBRdkhfQSI+DQotICAgICAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il9hNGpteE1WTkVkeTJtdVEyUFF2SF9BIiBuYW1lPSIiIHZpc2liaWxpdHk9InByaXZhdGUiIHR5cGU9Il91Vl9DRU1WSUVkeTJtdVEyUFF2SF9BIiBhc3NvY2lhdGlvbj0iX2E0am13TVZORWR5Mm11UTJQUXZIX0EiPg0KLSAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX2E0c3dzY1ZORWR5Mm11UTJQUXZIX0EiIHZhbHVlPSIqIi8+DQotICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfYTRzd3NNVk5FZHkybXVRMlBRdkhfQSIvPg0KLSAgICAgICAgICA8L293bmVkRW5kPg0KLSAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX0FUTE9JTVZPRWR5Mm11UTJQUXZIX0EiIG5hbWU9IldvcmtQcm9kdWN0Ij4NCi0gICAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX2c1N2Q0TVZPRWR5Mm11UTJQUXZIX0EiIGdlbmVyYWw9Il91Vl9DRU1WSUVkeTJtdVEyUFF2SF9BIi8+DQotICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfZHlac1FNVk9FZHkybXVRMlBRdkhfQSIgbmFtZT0iUm9sZSI+DQotICAgICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il9oWUJ2SU1WT0VkeTJtdVEyUFF2SF9BIiBnZW5lcmFsPSJfdVZfQ0VNVklFZHkybXVRMlBRdkhfQSIvPg0KLSAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOlBhY2thZ2UiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDE3QiIgbmFtZT0iTWV0aG9kQ29yZSI+DQotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iX0d2UEYwdWZYRWR1cUhvT0piVVJaUnciIHNvdXJjZT0idW1sMi5kaWFncmFtcyIgcmVmZXJlbmNlcz0iXzNBREM3Qjc0MDIyRDQwRjg3QjRFMDM0QSI+DQotICAgICAgICAgIDxjb250ZW50cyB4bWk6dHlwZT0ibm90YXRpb246RGlhZ3JhbSIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGODdCNEUwMzRBIiB0eXBlPSJDbGFzcyIgbmFtZT0iTWFpbiI+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJSGY1dWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyNjIiPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJSGY2ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSElIZjZ1ZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISUhmNi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElIZjdPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJSGY3ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJSGY3dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJQYWNrYWdlQ29udGVudHMiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hJSGY3LWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiIGNvbGxhcHNlZD0idHJ1ZSIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hJSGY1LWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iTm9uZSIgc2hvd0xpc3RWaXNpYmlsaXR5PSJOb25lIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISUhmNk9mWEVkdXFIb09KYlVSWlJ3IiB4PSI5NjIzIiB5PSIxNDUxOCIgd2lkdGg9IjQ0MDIiIGhlaWdodD0iMTY4NCIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJSGY4T2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyOTQiPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJSGY4LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSElIZjlPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISUhmOWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElIZjl1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJSGY5LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJSGYtT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJQYWNrYWdlQ29udGVudHMiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hJSGYtZWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiIGNvbGxhcHNlZD0idHJ1ZSIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hJSGY4ZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iTm9uZSIgc2hvd0xpc3RWaXNpYmlsaXR5PSJOb25lIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISUhmOHVmWEVkdXFIb09KYlVSWlJ3IiB4PSI5NTEwIiB5PSIxMTQxMiIgd2lkdGg9IjQ0MzIiIGhlaWdodD0iMTY3NiIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJSGYtdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxOTAiPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJSGZfZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSElIZl91ZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISUhmXy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElIZ0FPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJSGdBZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJSGdBdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJQYWNrYWdlQ29udGVudHMiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hJSGdBLWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiIGNvbGxhcHNlZD0idHJ1ZSIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hJSGYtLWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iTm9uZSIgc2hvd0xpc3RWaXNpYmlsaXR5PSJOb25lIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISUhmX09mWEVkdXFIb09KYlVSWlJ3IiB4PSI3NjA4IiB5PSI4MjQyIiB3aWR0aD0iNDUzNyIgaGVpZ2h0PSIxNjc2Ii8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElIZ0JPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDIyNSI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElIZ0ItZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9ISUhnQ09mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJSGdDZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISUhnQ3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElIZ0MtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElIZ0RPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlBhY2thZ2VDb250ZW50cyI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSElIZ0RlZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIgY29sbGFwc2VkPSJ0cnVlIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSElIZ0JlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJOb25lIiBzaG93TGlzdFZpc2liaWxpdHk9Ik5vbmUiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hJSGdCdWZYRWR1cUhvT0piVVJaUnciIHg9Ijc2MDgiIHk9IjQ5NDAiIHdpZHRoPSI0NTM3IiBoZWlnaHQ9IjE2NzYiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISUhnSU9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERTQ3OEUwMDBEIj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISUhnSS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hJSGdKT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElIZ0plZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJSGdKdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISUhnSi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISUhnS09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iUGFja2FnZUNvbnRlbnRzIj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISUhnS2VmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIiBjb2xsYXBzZWQ9InRydWUiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9ISUhnSWVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9Ik5vbmUiIHNob3dMaXN0VmlzaWJpbGl0eT0iTm9uZSIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSElIZ0l1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iNzYwOCIgeT0iMjIxOSIgd2lkdGg9IjQxMTQiIGhlaWdodD0iMTY3NiIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJSGdLdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURFNDlFQTAxRTIiPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJSGdMZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSElIZ0x1ZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISUhnTC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElIZ01PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJSGdNZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJSGdNdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJQYWNrYWdlQ29udGVudHMiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hJSGdNLWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiIGNvbGxhcHNlZD0idHJ1ZSIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hJSGdLLWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iTm9uZSIgc2hvd0xpc3RWaXNpYmlsaXR5PSJOb25lIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISUhnTE9mWEVkdXFIb09KYlVSWlJ3IiB4PSIxMjY4IiB5PSI2OTc0IiB3aWR0aD0iNDcyMCIgaGVpZ2h0PSIxNjc2Ii8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfeDRHdVFPeGRFZHVIamUzcFBhaE40QSIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRERGODY5MDEyRSI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfeDRHdVEteGRFZHVIamUzcFBhaE40QSIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il94NEd1Uk94ZEVkdUhqZTNwUGFoTjRBIiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3g0R3VSZXhkRWR1SGplM3BQYWhONEEiIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il94NEd1UnV4ZEVkdUhqZTNwUGFoTjRBIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfeDRHdVIteGRFZHVIamUzcFBhaE40QSIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfeDRQNE1PeGRFZHVIamUzcFBhaE40QSIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlBhY2thZ2VDb250ZW50cyI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfeDRQNE1leGRFZHVIamUzcFBhaE40QSIgY2Fub25pY2FsPSJmYWxzZSIgY29sbGFwc2VkPSJ0cnVlIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfeDRHdVFleGRFZHVIamUzcFBhaE40QSIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1BhcmVudD0iTmFtZSIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX3g0R3VRdXhkRWR1SGplM3BQYWhONEEiIHg9Ijk2MjMiIHk9IjE3NDg3Ii8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfWkNUQmtPeDVFZHU1LXZWamxmVnNmUSIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxMTlBNjJCMDM2RiI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfWkNUQmsteDVFZHU1LXZWamxmVnNmUSIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9aQ1RCbE94NUVkdTUtdlZqbGZWc2ZRIiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX1pDY3lrT3g1RWR1NS12VmpsZlZzZlEiIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9aQ2N5a2V4NUVkdTUtdlZqbGZWc2ZRIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfWkNjeWt1eDVFZHU1LXZWamxmVnNmUSIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfWkNjeWsteDVFZHU1LXZWamxmVnNmUSIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlBhY2thZ2VDb250ZW50cyI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfWkNjeWxPeDVFZHU1LXZWamxmVnNmUSIgY2Fub25pY2FsPSJmYWxzZSIgY29sbGFwc2VkPSJ0cnVlIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfWkNUQmtleDVFZHU1LXZWamxmVnNmUSIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1BhcmVudD0iTmFtZSIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX1pDVEJrdXg1RWR1NS12VmpsZlZzZlEiIHg9IjE0MjY1IiB5PSIxNzQ4NyIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MRGlhZ3JhbVN0eWxlIiB4bWk6aWQ9Il9HdlBGMU9mWEVkdXFIb09KYlVSWlJ3IiBkZXNjcmlwdGlvbj0iVGhlIE1ldGhvZCBDb3JlIHBhY2thZ2UgZGVmaW5lcyB0aGUgZnVuZGFtZW50YWwgY29uY2VwdHMgZm9yIGRlc2NyaWJpbmcgYW5kIG9yZ2FuaXppbmcgbWV0aG9kIGNvbnRlbnQuICBUaGUgcGFja2FnZSBpdHNlbGYgcHJvdmlkZXMgbGF5ZXJzIGFzIGRlcGljdGVkIGluIGRpYWdyYW0gdGhhdCBncmFkdWFsbHkgZXh0ZW5kIHRoZSBjb3JlIGNvbmNlcHRzIHdpdGggbW9yZSBhbmQgbW9yZSBjYXBhYmlsaXRpZXMgKGkuZS4gc3VwcG9ydGluZyBjbGFzc2VzLCBhZGRpdGlvbmFsIGF0dHJpYnV0ZXMsIGFuZCByZWxhdGlvbnNoaXBzKS4gVGhlIEJhc2ljIEVsZW1lbnRzIHBhY2thZ2UgZGVmaW5lcyB0aGUgcm9vdCBlbGVtZW50IGZyb20gd2hpY2ggYWxsIGNsYXNzZXMgaW4gdGhpcyBzcGVjaWZpY2F0aW9uIGhhdmUgYmVlbiBkZXJpdmVkLiAgQ29yZSBDb250ZW50IEVsZW1lbnRzIGRlZmluZXMgdGhlIGNvcmUgZWxlbWVudHMgb2YgZXZlcnkgbWV0aG9kIHN1Y2ggYXMgcm9sZXMsIHRhc2tzLCBhbmQgd29yayBwcm9kdWN0cy4gIFRoZSBuZXh0IGxheWVyIGFkZHMgZGlmZmVyZW50IHR5cGVzIG9mIGd1aWRhbmNlIHRvIHRoZSBjb3JlIGVsZW1lbnRzIHN1Y2ggYXMgd29yayBwcm9kdWN0IHRlbS1wbGF0ZXMsIGd1aWRlbGluZXMsIG9yIGNoZWNrbGlzdHMuICBUaGUgQ2F0ZWdvcmllcyBwYWNrYWdlIHByb3ZpZGVzIHByZS1kZWZpbmVkIGFzIHdlbGwgYXMgdXNlci1kZWZpbmFibGUgY2F0ZWdvcml6YXRpb25zIG9mIGNvcmUgY29udGVudCBlbGVtZW50cyBhcyB3ZWxsIGFzIGd1aWRhbmNlIHR5cGVzLiAgVGhlIE1ldGhvZCBDb250ZW50IERlc2NyaXB0aW9ucyBhZGRzIHByb3BlcnRpZXMgZm9yIGRldGFpbGVkIGNvbnRlbnQgZGVzY3JpcHRpb25zIHRvIHRoZSBlbGVtZW50cyBkZWZpbmVkIGJlbG93LiAgVGhlc2UgZGVzY3JpcHRpb25zIGFyZSBvcHRpb25hbCBhZGRpdGlvbnMsIHdoaWNoIGFuIGltcGxlbWVudGVyIG9mIHRoaXMgc3BlY2lmaWNhdGlvbiBpcyBmcmVlIHRvIGNob29zZSBmcm9tLiAgRmluYWxseSwgTWV0aG9kIFBhY2thZ2UgZGUtZmluZXMgaG93IHRoZSBlbGVtZW50cyBkZWZpbmVkIGluIGFsbCBmb3VyIGxheWVycyBiZWxvdyBjYW4gYmUgb3JnYW5pemVkIGluIHBhY2thZ2UgaGllcmFyY2hpZXMuIi8+DQotICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPg0KLSAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9OMTlsY2V4TUVkdU9Ock1SZ216NDhBIiBlbGVtZW50PSJfTjE5bGNPeE1FZHVPTnJNUmdtejQ4QSIgc291cmNlPSJfSElIZi11ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSElIZjhPZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfTjE5bGRPeE1FZHVPTnJNUmdtejQ4QSIgdHlwZT0iS2luZExhYmVsIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX04xOWxkdXhNRWR1T05yTVJnbXo0OEEiIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX04xOWxlT3hNRWR1T05yTVJnbXo0OEEiIHR5cGU9IktpbmQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX04xOWxkLXhNRWR1T05yTVJnbXo0OEEiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfTjE5bGRleE1FZHVPTnJNUmdtejQ4QSIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9OMTlsY3V4TUVkdU9Ock1SZ216NDhBIiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfTjE5bGMteE1FZHVPTnJNUmdtejQ4QSIgcG9pbnRzPSJbMiwgMzMsIDAsIC04NV0kWzIsIDE1MCwgMCwgMzJdIi8+DQotICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfQ3NFUUlPeGRFZHVIamUzcFBhaE40QSIgZWxlbWVudD0iX0NyNmZJT3hkRWR1SGplM3BQYWhONEEiIHNvdXJjZT0iX0hJSGY4T2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hJSGY1dWZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0NzRVFJLXhkRWR1SGplM3BQYWhONEEiIHR5cGU9IktpbmRMYWJlbCI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9Dc0VRSmV4ZEVkdUhqZTNwUGFoTjRBIiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9Dc0VRSi14ZEVkdUhqZTNwUGFoTjRBIiB0eXBlPSJLaW5kIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9Dc0VRSnV4ZEVkdUhqZTNwUGFoTjRBIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0NzRVFKT3hkRWR1SGplM3BQYWhONEEiIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfQ3NFUUlleGRFZHVIamUzcFBhaE40QSIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfQ3NFUUl1eGRFZHVIamUzcFBhaE40QSIgcG9pbnRzPSJbLTE4NSwgODczLCAtMjE0MywgLTU0MjRdJFstMTg1LCAzNjUxLCAtMjE0MywgLTI2NDZdJFsxMjQ0LCA1NDI0LCAtNzE0LCAtODczXSIvPg0KLSAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX2hWMWxFT3g1RWR1NS12VmpsZlZzZlEiIGlkPSIoMC40NjE2NDI2LDAuNzc1NjU2MzQpIi8+DQotICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfZGR0dHNPeGRFZHVIamUzcFBhaE40QSIgZWxlbWVudD0iX2RkajhzT3hkRWR1SGplM3BQYWhONEEiIHNvdXJjZT0iX0hJSGdCT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hJSGYtdWZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2RkdHRzLXhkRWR1SGplM3BQYWhONEEiIHR5cGU9IktpbmRMYWJlbCI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9kZHR0dGV4ZEVkdUhqZTNwUGFoTjRBIiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9kZHR0dC14ZEVkdUhqZTNwUGFoTjRBIiB0eXBlPSJLaW5kIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9kZHR0dHV4ZEVkdUhqZTNwUGFoTjRBIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX2RkdHR0T3hkRWR1SGplM3BQYWhONEEiIHg9Ii0zODEiIHk9IjEzMzQiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfZGR0dHNleGRFZHVIamUzcFBhaE40QSIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfZGR0dHN1eGRFZHVIamUzcFBhaE40QSIgcG9pbnRzPSJbMiwgMzIsIDIsIC05Ml0kWzE2LCAxNTcsIDE2LCAzM10iLz4NCi0gICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9lYVc4SWV4ZEVkdUhqZTNwUGFoTjRBIiBlbGVtZW50PSJfZWFXOElPeGRFZHVIamUzcFBhaE40QSIgc291cmNlPSJfSElIZ0JPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSElIZjhPZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfZWFXOEpPeGRFZHVIamUzcFBhaE40QSIgdHlwZT0iS2luZExhYmVsIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2VhVzhKdXhkRWR1SGplM3BQYWhONEEiIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2VhVzhLT3hkRWR1SGplM3BQYWhONEEiIHR5cGU9IktpbmQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2VhVzhKLXhkRWR1SGplM3BQYWhONEEiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfZWFXOEpleGRFZHVIamUzcFBhaE40QSIgeD0iNzAwIiB5PSItMTMwMiIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9lYVc4SXV4ZEVkdUhqZTNwUGFoTjRBIiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfZWFXOEkteGRFZHVIamUzcFBhaE40QSIgcG9pbnRzPSJbOTUzLCA4NzQsIC05MDAsIC01NjA5XSRbOTUzLCAyMDM4LCAtOTAwLCAtNDQ0NV0kWzMwOTYsIDIwMzgsIDEyNDMsIC00NDQ1XSRbMzA5NiwgNTkyNywgMTI0MywgLTU1Nl0iLz4NCi0gICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9WUFIzTU94ZUVkdUhqZTNwUGFoTjRBIiBlbGVtZW50PSJfVlBJR01PeGVFZHVIamUzcFBhaE40QSIgc291cmNlPSJfSElIZ0t1ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSElIZi11ZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfVlBSM00teGVFZHVIamUzcFBhaE40QSIgdHlwZT0iS2luZExhYmVsIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX1ZQUjNOZXhlRWR1SGplM3BQYWhONEEiIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX1ZQUjNOLXhlRWR1SGplM3BQYWhONEEiIHR5cGU9IktpbmQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX1ZQUjNOdXhlRWR1SGplM3BQYWhONEEiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfVlBSM05PeGVFZHVIamUzcFBhaE40QSIgeD0iLTEzMyIgeT0iNDQwIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX1ZQUjNNZXhlRWR1SGplM3BQYWhONEEiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX1ZQUjNNdXhlRWR1SGplM3BQYWhONEEiIHBvaW50cz0iWy05MCwgMTEsIDIzOSwgLTFdJFstMjQ1LCA0MywgODQsIDMxXSIvPg0KLSAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX1d0ZEZZT3hlRWR1SGplM3BQYWhONEEiIGlkPSIoMC43NzE2NTUyNiwwLjc0MzQzNjc1KSIvPg0KLSAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX1JLRURZZXhnRWR1SGplM3BQYWhONEEiIGVsZW1lbnQ9Il9SS0VEWU94Z0VkdUhqZTNwUGFoTjRBIiBzb3VyY2U9Il9ISUhnSU9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9ISUhnS3VmWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9SS0VEWk94Z0VkdUhqZTNwUGFoTjRBIiB0eXBlPSJLaW5kTGFiZWwiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfUktFRFp1eGdFZHVIamUzcFBhaE40QSIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfUktFRGFPeGdFZHVIamUzcFBhaE40QSIgdHlwZT0iS2luZCIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfUktFRFoteGdFZHVIamUzcFBhaE40QSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9SS0VEWmV4Z0VkdUhqZTNwUGFoTjRBIiB4PSItNDgxIiB5PSItNDg3Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX1JLRURZdXhnRWR1SGplM3BQYWhONEEiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX1JLRURZLXhnRWR1SGplM3BQYWhONEEiIHBvaW50cz0iWy0yMDkwLCA0NzYsIDM5NDMsIC00Mjg3XSRbLTYwNTksIDE0MDMsIC0yNiwgLTMzNjBdJFstNjA1OSwgNDIwNywgLTI2LCAtNTU2XSIvPg0KLSAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX1JxR09VZXhnRWR1SGplM3BQYWhONEEiIGVsZW1lbnQ9Il9ScUdPVU94Z0VkdUhqZTNwUGFoTjRBIiBzb3VyY2U9Il9ISUhnSU9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9ISUhnQk9mWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ScUdPVk94Z0VkdUhqZTNwUGFoTjRBIiB0eXBlPSJLaW5kTGFiZWwiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfUnFHT1Z1eGdFZHVIamUzcFBhaE40QSIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfUnFHT1dPeGdFZHVIamUzcFBhaE40QSIgdHlwZT0iS2luZCIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfUnFHT1YteGdFZHVIamUzcFBhaE40QSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ScUdPVmV4Z0VkdUhqZTNwUGFoTjRBIiB4PSIyNiIgeT0iLTcxNSIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9ScUdPVXV4Z0VkdUhqZTNwUGFoTjRBIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9ScUdPVS14Z0VkdUhqZTNwUGFoTjRBIiBwb2ludHM9Ils2LCAzMywgLTIsIC03MF0kWzk1LCAxMTAsIDg3LCA3XSIvPg0KLSAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX25veVRNZXhnRWR1SGplM3BQYWhONEEiIGVsZW1lbnQ9Il9ub3lUTU94Z0VkdUhqZTNwUGFoTjRBIiBzb3VyY2U9Il9ISUhmNXVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il94NEd1UU94ZEVkdUhqZTNwUGFoTjRBIj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ub3lUTk94Z0VkdUhqZTNwUGFoTjRBIiB0eXBlPSJLaW5kTGFiZWwiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfbm95VE51eGdFZHVIamUzcFBhaE40QSIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfbm95VE9PeGdFZHVIamUzcFBhaE40QSIgdHlwZT0iS2luZCIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfbm95VE4teGdFZHVIamUzcFBhaE40QSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ub3lUTmV4Z0VkdUhqZTNwUGFoTjRBIiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX25veVRNdXhnRWR1SGplM3BQYWhONEEiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX25veVRNLXhnRWR1SGplM3BQYWhONEEiIHBvaW50cz0iWy03LCAzMywgLTYsIC03MF0kWy03LCAxMzEsIC02LCAyOF0iLz4NCi0gICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9jNjJuZ094NUVkdTUtdlZqbGZWc2ZRIiBlbGVtZW50PSJfYzZ0ZGtPeDVFZHU1LXZWamxmVnNmUSIgc291cmNlPSJfSElIZjV1ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfWkNUQmtPeDVFZHU1LXZWamxmVnNmUSI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfYzYybmcteDVFZHU1LXZWamxmVnNmUSIgdHlwZT0iS2luZExhYmVsIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2M2Mm5oZXg1RWR1NS12VmpsZlZzZlEiIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2M2Mm5oLXg1RWR1NS12VmpsZlZzZlEiIHR5cGU9IktpbmQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2M2Mm5odXg1RWR1NS12VmpsZlZzZlEiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfYzYybmhPeDVFZHU1LXZWamxmVnNmUSIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9jNjJuZ2V4NUVkdTUtdlZqbGZWc2ZRIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9jNjJuZ3V4NUVkdTUtdlZqbGZWc2ZRIiBwb2ludHM9Ils0MSwgMzMsIC0xMzQsIC03NF0kWzkxLCAxMDgsIC04NCwgMV0iLz4NCi0gICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICA8L2NvbnRlbnRzPg0KLSAgICAgICAgICA8Y29udGVudHMgeG1pOnR5cGU9Im5vdGF0aW9uOkRpYWdyYW0iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxRTBDRDM3MDFFRCIgdHlwZT0iQ2xhc3MiIG5hbWU9IlRheG9ub215Ij4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElSUTZlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDE3RiI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElSUTdPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9ISVJRN2VmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iNDUyMSIgaGVpZ2h0PSIxMDgzIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJUlE3dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISVJRNy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElSUThPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElSUThlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hJUlE4dWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElSUTgtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hJUlE5T2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElSUTllZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hJUlE5dWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElSUTktZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISVJRLU9mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSElSUTZ1ZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1BhcmVudD0iTmFtZSIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hJUlE2LWZYRWR1cUhvT0piVVJaUnciIHg9IjEyMDUwIiB5PSIxMTAxOCIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJUlEtZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxODUiPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJUlFfT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSElSUV9lZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjM5OTYiIGhlaWdodD0iMTA4MyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISVJRX3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElSUV8tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJUlJBT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJUlJBZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISVJSQXVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJUlJBLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISVJSQk9mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJUlJCZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISVJSQnVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJUlJCLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSElSUkNPZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hJUlEtdWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dQYXJlbnQ9Ik5hbWUiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISVJRLS1mWEVkdXFIb09KYlVSWlJ3IiB4PSIxNjc3OSIgeT0iMTEwMTgiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISVJSQ2VmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMkRBIj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISVJSRE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hJUlJEZWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIzNzA4IiBoZWlnaHQ9IjExMzQiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElSUkR1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJUlJELWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISVJSRU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISVJSRWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSElSUkV1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISVJSRS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSElSUkZPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISVJSRmVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSElSUkZ1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISVJSRi1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hJUlJHT2ZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9ISVJSQ3VmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93UGFyZW50PSJOYW1lIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSElSUkMtZlhFZHVxSG9PSmJVUlpSdyIgeD0iNzMwOCIgeT0iODM0OCIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJUlJHZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxOEYiPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJUlJIT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSElSUkhlZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjM3MDgiIGhlaWdodD0iMTA4MyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISVJSSHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElSUkgtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJUlJJT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJUlJJZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISVJSSXVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJUlJJLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISVJSSk9mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJUlJKZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISVJSSnVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJUlJKLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSElSUktPZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hJUlJHdWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dQYXJlbnQ9Ik5hbWUiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISVJSRy1mWEVkdXFIb09KYlVSWlJ3IiB4PSIyMTUxNiIgeT0iMTEwMTgiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISVJSS2VmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjk2Ij4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISVJSTE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hJUlJMZWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSI0MDEzIiBoZWlnaHQ9IjExMTciLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElSUkx1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJUlJMLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISVJSTU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISVJSTWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSElSUk11ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISVJSTS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSElSUk5PZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISVJSTmVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSElSUk51ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISVJSTi1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hJUlJPT2ZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9ISVJSS3VmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93UGFyZW50PSJOYW1lIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSElSUkstZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTIwNDIiIHk9IjgzNTYiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISVJST2VmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMkJDIj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISVJSUE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hJUlJQZWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSI0NDcwIiBoZWlnaHQ9IjExMzQiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElSUlB1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJUlJQLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISVJSUU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISVJSUWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSElSUlF1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISVJSUS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSElSUlJPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISVJSUmVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSElSUlJ1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISVJSUi1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hJUlJTT2ZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9ISVJST3VmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93UGFyZW50PSJOYW1lIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSElSUk8tZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTY3NjYiIHk9IjgzNDgiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWFhNi1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjlFIj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWFhN3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hJYWE3LWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSI0MTgyIiBoZWlnaHQ9IjExMTciLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElhYThPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJYWE4ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWFhOHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWFhOC1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSElhYTlPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWFhOWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSElhYTl1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWFhOS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSElhYS1PZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWFhLWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hJYWEtdWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9ISWFhN09mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93UGFyZW50PSJOYW1lIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSElhYTdlZlhFZHVxSG9PSmJVUlpSdyIgeD0iMjE1MDciIHk9IjgzNTYiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWFiUGVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMTJCIj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWFiUU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hJYWJRZWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIzMDY0IiBoZWlnaHQ9IjEwODMiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElhYlF1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJYWJRLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWFiUk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWFiUmVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSElhYlJ1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWFiUi1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSElhYlNPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWFiU2VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSElhYlN1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWFiUy1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hJYWJUT2ZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9ISWFiUHVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93UGFyZW50PSJOYW1lIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSElhYlAtZlhFZHVxSG9PSmJVUlpSdyIgeD0iODUwNSIgeT0iNTY3MSIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJYWJadWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBODU3QjAzMzMiPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJYWJhZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSElhYmF1ZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjI3OTQiIGhlaWdodD0iMTA0OSIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWFiYS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElhYmJPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJYWJiZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJYWJidWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISWFiYi1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJYWJjT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISWFiY2VmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJYWJjdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISWFiYy1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJYWJkT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSElhYmRlZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hJYWJaLWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dQYXJlbnQ9Ik5hbWUiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISWFiYU9mWEVkdXFIb09KYlVSWlJ3IiB4PSIxMDIwIiB5PSIzMDEwIi8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElhYmR1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI4MCI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElhYmVlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9ISWFiZXVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMzExNSIgaGVpZ2h0PSIxMTM0Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJYWJlLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWFiZk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElhYmZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElhYmZ1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hJYWJmLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElhYmdPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hJYWJnZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElhYmd1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hJYWJnLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElhYmhPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISWFiaGVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSElhYmQtZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1BhcmVudD0iTmFtZSIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hJYWJlT2ZYRWR1cUhvT0piVVJaUnciIHg9IjkxOTMiIHk9IjMxNyIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJa0wwLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyNkMiPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJa0wxdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSElrTDEtZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjI4NzgiIGhlaWdodD0iMTA0OSIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWtMMk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElrTDJlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJa0wydWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJa0wyLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISWtMM09mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJa0wzZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISWtMM3VmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJa0wzLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISWtMNE9mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJa0w0ZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSElrTDR1ZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hJa0wxT2ZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dQYXJlbnQ9Ik5hbWUiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISWtMMWVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxMjY2NiIgeT0iNTY2MSIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJa01FT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjFFNENGMzAxQUUiPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJa01FLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSElrTUZPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjM0MzciIGhlaWdodD0iMTExNyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWtNRmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElrTUZ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJa01GLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJa01HT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISWtNR2VmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJa01HdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISWtNRy1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJa01IT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISWtNSGVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJa01IdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSElrTUgtZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hJa01FZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dQYXJlbnQ9Ik5hbWUiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISWtNRXVmWEVkdXFIb09KYlVSWlJ3IiB4PSI0NzYzIiB5PSIzMDAzIi8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElrTUtlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDEzRiI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElrTUxPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9ISWtNTGVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMzAxNCIgaGVpZ2h0PSIxMDQ5Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJa01MdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWtNTC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElrTU1PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElrTU1lZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hJa01NdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElrTU0tZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hJa01OT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElrTU5lZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hJa01OdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElrTU4tZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISWtNT09mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSElrTUt1ZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1BhcmVudD0iTmFtZSIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hJa01LLWZYRWR1cUhvT0piVVJaUnciIHg9Ijg1MDQiIHk9IjMwMTAiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWtNUy1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI5NEVCOTAwMEZDIj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWtNVHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hJa01ULWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIzNTg5IiBoZWlnaHQ9Ijk5MCIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWtNVU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElrTVVlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJa01VdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJa01VLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISWtNVk9mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJa01WZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISWtNVnVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJa01WLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISWtNV09mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJa01XZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSElrTVd1ZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hJa01UT2ZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dQYXJlbnQ9Ik5hbWUiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISWtNVGVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxMjQ0MyIgeT0iMjk5MSIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJa01aT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURFNEE5NzAxMjMiPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJa01aLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSElrTWFPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWtNYWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElrTWF1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJa01hLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJa01iT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISWtNYmVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJa01idWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISWtNYi1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJa01jT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISWtNY2VmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJa01jdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSElrTWMtZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hJa01aZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dQYXJlbnQ9Ik5hbWUiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISWtNWnVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxNjcxMCIgeT0iMzAwOSIgd2lkdGg9IjQ0MTciIGhlaWdodD0iOTc5Ii8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfZUhPMDRPb2xFZHVWQTd2dDVxYklKUSIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI0NCI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfZUhPMDQtb2xFZHVWQTd2dDVxYklKUSIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9lSE8wNU9vbEVkdVZBN3Z0NXFiSUpRIiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2VITzA1ZW9sRWR1VkE3dnQ1cWJJSlEiIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9lSE8wNXVvbEVkdVZBN3Z0NXFiSUpRIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfZUhPMDUtb2xFZHVWQTd2dDVxYklKUSIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfZUhPMDZPb2xFZHVWQTd2dDVxYklKUSIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX2VITzA2ZW9sRWR1VkE3dnQ1cWJJSlEiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfZUhPMDZ1b2xFZHVWQTd2dDVxYklKUSIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX2VITzA2LW9sRWR1VkE3dnQ1cWJJSlEiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfZUhPMDdPb2xFZHVWQTd2dDVxYklKUSIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX2VITzA3ZW9sRWR1VkE3dnQ1cWJJSlEiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfZUhPMDd1b2xFZHVWQTd2dDVxYklKUSIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9lSE8wNy1vbEVkdVZBN3Z0NXFiSUpRIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfZUhPMDRlb2xFZHVWQTd2dDVxYklKUSIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1BhcmVudD0iTmFtZSIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX2VITzA0dW9sRWR1VkE3dnQ1cWJJSlEiIHg9IjMzMTkiIHk9IjgzNTgiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTERpYWdyYW1TdHlsZSIgeG1pOmlkPSJfR3ZQRjF1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4NCi0gICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSElhYTBPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDAwRiIgc291cmNlPSJfSElSUTZlZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSElSUk9lZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElhYTAtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJYWExZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJYWExdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hJYWExT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSElhYTBlZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iVHJlZSIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSElhYTB1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTI2LCAtNTAzLCAtNDc4OSwgMjE2OV0kWzQ3NTUsIC0yMTk2LCAtOCwgNDc2XSIvPg0KLSAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hJYWExLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hJYWEyT2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hJYWEyZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAwMkMiIHNvdXJjZT0iX0hJUlEtZWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hJUlJPZWZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJYWEzT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWFhM3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWFhMy1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISWFhM2VmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hJYWEydWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlRyZWUiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hJYWEyLWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0yNywgLTUwMywgLTI3LCAyMTY5XSRbLTgsIC0yMTk2LCAtOCwgNDc2XSIvPg0KLSAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hJYWE0T2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hJYWE0ZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hJYWE0dWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAwNEEiIHNvdXJjZT0iX0hJUlJHZWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hJUlJPZWZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJYWE1ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWFhNS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWFhNk9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISWFhNXVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hJYWE0LWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlRyZWUiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hJYWE1T2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0yNiwgLTUwMywgNDcxMCwgMjE2OV0kWy00NzQ0LCAtMjE5NiwgLTgsIDQ3Nl0iLz4NCi0gICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9ISWFhNmVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9ISWFhNnVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9ISWFiaHVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTg1QUUwMkNFIiBzb3VyY2U9Il9ISWFiWnVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9ISWFiZHVmWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWFiaWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElhYmktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElrTDBPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSElhYml1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9ISWFiaC1mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJUcmVlIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9ISWFiaU9mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMjcsIC01MDIsIC04MTQ5LCAyMTcwXSRbODEzNiwgLTIxOTYsIDE0LCA0NzZdIi8+DQotICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSElrTDBlZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSElrTDB1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSElrTDQtZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkzMDExRCIgc291cmNlPSJfSElSUkNlZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSElrTDAtZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElrTDV1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJa0w2T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJa0w2ZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hJa0w1LWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSElrTDVPZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iVHJlZSIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSElrTDVlZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTI3LCAtNTAzLCAtNzExOCwgMjE2OV0kWzcwOTcsIC0yMTk2LCA2LCA0NzZdIi8+DQotICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSElrTDZ1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSElrTDYtZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSElrTDdPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDMwNyIgc291cmNlPSJfSElSUktlZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSElrTDAtZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElrTDctZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJa0w4ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJa0w4dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hJa0w4T2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSElrTDdlZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iVHJlZSIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSElrTDd1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTI3LCAtNTAzLCAtMjM4MiwgMjE2OV0kWzIzNjEsIC0yMTk2LCA2LCA0NzZdIi8+DQotICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSElrTDgtZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSElrTDlPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSElrTDllZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDNEOSIgc291cmNlPSJfSElSUk9lZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSElrTDAtZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElrTC1PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJa0wtdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJa0wtLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hJa0wtZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSElrTDl1ZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iVHJlZSIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSElrTDktZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTI3LCAtNTAzLCAyMzU0LCAyMTY5XSRbLTIzNzUsIC0yMTk2LCA2LCA0NzZdIi8+DQotICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSElrTF9PZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSElrTF9lZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSElrTF91ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDMyRiIgc291cmNlPSJfSElhYTYtZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSElrTDAtZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElrTUFlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJa01BLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJa01CT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hJa01BdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSElrTF8tZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iVHJlZSIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSElrTUFPZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTI2LCAtNTAzLCA3MDkxLCAyMTY5XSRbLTcxMTEsIC0yMTk2LCA2LCA0NzZdIi8+DQotICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSElrTUJlZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSElrTUJ1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSElrTUlPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyNzk1NjI0MDE3RSIgc291cmNlPSJfSElrTUVPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSElhYmR1ZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElrTUktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJa01KZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJa01KdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hJa01KT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSElrTUllZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iVHJlZSIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSElrTUl1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTI2LCAtNTAyLCAtNDQxOCwgMjE3MF0kWzQ0MDYsIC0yMTk2LCAxNCwgNDc2XSIvPg0KLSAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hJa01KLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hJa01LT2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hJa01PZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAzQUYiIHNvdXJjZT0iX0hJYWJQZWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hJa01LZWZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJa01QT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWtNUHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWtNUC1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISWtNUGVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hJa01PdWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9ISWtNTy1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMjM4LCAtNTAzLCAtMjM4LCAyMTcwXSRbLTIzOCwgLTIxOTcsIC0yMzgsIDQ3Nl0iLz4NCi0gICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9ISWtNUU9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9ISWtNUWVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9ISWtNUXVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFGQUQ1RjgwMzhFIiBzb3VyY2U9Il9ISWtNS2VmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9ISWFiZHVmWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWtNUmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElrTVItZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElrTVNPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSElrTVJ1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9ISWtNUS1mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJUcmVlIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9ISWtNUk9mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMjcsIC01MDIsIC01ODIsIDIxNzBdJFs1NjksIC0yMTk2LCAxNCwgNDc2XSIvPg0KLSAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hJa01TZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hJa01TdWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hJa01XLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjk0RUM0QTAzMDYiIHNvdXJjZT0iX0hJa0wwLWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hJa01TLWZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJa01YdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWtNWU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWtNWWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISWtNWC1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hJa01YT2ZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9ISWtNWGVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMTMzLCAtNTAzLCAtMTMzLCAyMTcwXSRbLTEzMywgLTIxOTcsIC0xMzMsIDQ3Nl0iLz4NCi0gICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9ISWtNWXVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9ISWtNWS1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9ISWtNZE9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI5NEVDMkIwMUNBIiBzb3VyY2U9Il9ISWtNUy1mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9ISWFiZHVmWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWtNZC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElrTWVlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElrTWV1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSElrTWVPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9ISWtNZGVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJUcmVlIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9ISWtNZHVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMjcsIC01MDIsIDM1MTksIDIxNzBdJFstMzUzMiwgLTIxOTYsIDE0LCA0NzZdIi8+DQotICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSElrTWUtZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSElrTWZPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSElrTWZlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMDA1ODNCMDFFNiIgc291cmNlPSJfSElrTVpPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSElhYmR1ZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElrTWdPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJa01ndWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJa01nLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hJa01nZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSElrTWZ1ZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iVHJlZSIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSElrTWYtZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTI3LCAtNTAyLCA4MTQ5LCAyMTcwXSRbLTgxNjIsIC0yMTk2LCAxNCwgNDc2XSIvPg0KLSAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hJa01oT2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hJa01oZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX2VIWWw0T29sRWR1VkE3dnQ1cWJJSlEiIGVsZW1lbnQ9Il9EM2I4b09va0VkdVZBN3Z0NXFiSUpRIiBzb3VyY2U9Il9lSE8wNE9vbEVkdVZBN3Z0NXFiSUpRIiB0YXJnZXQ9Il9ISWtMMC1mWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9lSFlsNC1vbEVkdVZBN3Z0NXFiSUpRIiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfZUhZbDVlb2xFZHVWQTd2dDVxYklKUSIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfZUhZbDV1b2xFZHVWQTd2dDVxYklKUSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9lSFlsNU9vbEVkdVZBN3Z0NXFiSUpRIiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX2VIWWw0ZW9sRWR1VkE3dnQ1cWJJSlEiIHJvdXRpbmc9IlRyZWUiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX2VIWWw0dW9sRWR1VkE3dnQ1cWJJSlEiIHBvaW50cz0iWzE3NDYsIC0xNTksIC04Njc5LCA4NDZdJFs4Nzg0LCAtODQ3LCAtMTY0MSwgMTU4XSIvPg0KLSAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgIDwvY29udGVudHM+DQotICAgICAgICA8L2VBbm5vdGF0aW9ucz4NCi0gICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpQYWNrYWdlIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxOTAiIG5hbWU9Ikd1aWRhbmNlVHlwZXMiPg0KLSAgICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iX0dxVUp0ZWZYRWR1cUhvT0piVVJaUnciIHNvdXJjZT0idW1sMi5kaWFncmFtcyIgcmVmZXJlbmNlcz0iXzNBREM3Qjc0MDIyRDQwRjQ5RkYzMDAwRSI+DQotICAgICAgICAgICAgPGNvbnRlbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpEaWFncmFtIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEY0OUZGMzAwMEUiIHR5cGU9IkNsYXNzIiBuYW1lPSJTdHJ1Y3R1cmUiPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hCM0c0T2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxRTAiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENBUTBPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hDQVEwZWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDQVEwdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDQVEwLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDQVExT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENBUTFlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENBUTF1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENBUTEtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENBUTJPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENBUTJlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENBUTJ1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENBUTItZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDQVEzT2ZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEIzRzRlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEIzRzR1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTI5OTciIHk9IjE4NTkxIiB3aWR0aD0iNDc2MyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0FRM2VmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMUYzIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDQVE0T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IQ0FRNGVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0FRNHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0FRNC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0FRNU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDQVE1ZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDQVE1dWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDQVE1LWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDQVE2T2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDQVE2ZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDQVE2dWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDQVE2LWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ0FRN09mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hDQVEzdWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJOb25lIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hDQVEzLWZYRWR1cUhvT0piVVJaUnciIHg9IjEyOTg3IiB5PSIyMTIwOSIgd2lkdGg9IjQ3NjMiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENBUkhlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDFDMSI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0FSSU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSENBUkllZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENBUkl1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENBUkktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENBUkpPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0FSSmVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ0FSSnVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0FSSi1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ0FSS09mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0FSS2VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ0FSS3VmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0FSSy1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENBUkxPZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IQ0FSSHVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IQ0FSSC1mWEVkdXFIb09KYlVSWlJ3IiB4PSIxMjk4NyIgeT0iMTk3NzgiIHdpZHRoPSI0NzYzIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDQVJMZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxOTkiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENBUk1PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hDQVJNZWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDQVJNdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDQVJNLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDQVJOT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENBUk5lZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENBUk51ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENBUk4tZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENBUk9PZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENBUk9lZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENBUk91ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENBUk8tZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDQVJQT2ZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSENBUkx1ZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSENBUkwtZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTI5ODciIHk9IjE3MzUxIiB3aWR0aD0iNDc2MyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0FSUnVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMUE0Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDQVJTZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IQ0FSU3VmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0FSUy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0FSVE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0FSVGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDQVJUdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDQVJULWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDQVJVT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDQVJVZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDQVJVdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDQVJVLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDQVJWT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ0FSVmVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hDQVJSLWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hDQVJTT2ZYRWR1cUhvT0piVVJaUnciIHg9IjEyOTg3IiB5PSIxNTg0MSIgd2lkdGg9IjQ3NjMiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENBUlZ1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDE5QSI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0FSV2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSENBUld1ZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENBUlctZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENBUlhPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENBUlhlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0FSWHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ0FSWC1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0FSWU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ0FSWWVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0FSWXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ0FSWS1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0FSWk9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENBUlplZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IQ0FSVi1mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IQ0FSV09mWEVkdXFIb09KYlVSWlJ3IiB4PSIxMjk4NyIgeT0iMTQxNjQiIHdpZHRoPSI0NzYzIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDQVJadWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxQTMiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENBUmFlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hDQVJhdWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDQVJhLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDQVJiT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDQVJiZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENBUmJ1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENBUmItZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENBUmNPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENBUmNlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENBUmN1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENBUmMtZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENBUmRPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDQVJkZWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSENBUlotZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSENBUmFPZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTI5ODciIHk9IjEyNTg5IiB3aWR0aD0iNDc2MyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0FSZHVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxM0M5MTMwMkM1Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDQVJlZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IQ0FSZXVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMjgyNyIgaGVpZ2h0PSI5MzkiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDQVJlLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDQVJmT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDQVJmZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENBUmZ1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENBUmYtZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENBUmdPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENBUmdlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENBUmd1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENBUmctZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENLQjBPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDS0IwZWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSENBUmQtZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSENBUmVPZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTI5ODciIHk9IjEwNjA4IiB3aWR0aD0iNDc2MyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0tCMHVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGRDRFQjQwMkJCIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDS0IxZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IQ0tCMXVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0tCMS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0tCMk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0tCMmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDS0IydWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDS0IyLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDS0IzT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDS0IzZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDS0IzdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDS0IzLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDS0I0T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ0tCNGVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hDS0IwLWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJOb25lIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hDS0IxT2ZYRWR1cUhvT0piVVJaUnciIHg9IjEyOTg3IiB5PSIyMjQzMiIgd2lkdGg9IjQ3NjMiIGhlaWdodD0iMjExNiIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0tDQmVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERjQxQTUwMUI2Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDS0NDT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IQ0tDQ2VmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0tDQ3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0tDQy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0tDRE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDS0NEZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDS0NEdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDS0NELWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDS0NFT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDS0NFZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDS0NFdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDS0NFLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ0tDRk9mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hDS0NCdWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hDS0NCLWZYRWR1cUhvT0piVVJaUnciIHg9IjE1NzQiIHk9IjEwMTkzIiB3aWR0aD0iMzQ1NCIgaGVpZ2h0PSIxMzc1OCIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ1R6WE9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMUI3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDVHpYLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IQ1R6WU9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ1R6WWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ1R6WXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ1R6WS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDVHpaT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDVHpaZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDVHpadWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDVHpaLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDVHphT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDVHphZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDVHphdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ1R6YS1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hDVHpYZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hDVHpYdWZYRWR1cUhvT0piVVJaUnciIHg9IjEyOTg3IiB5PSI0ODE3IiB3aWR0aD0iNDc2MyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ1R6Yk9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMUI4Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDVHpiLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IQ1R6Y09mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ1R6Y2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ1R6Y3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ1R6Yy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDVHpkT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDVHpkZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDVHpkdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDVHpkLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDYzh3T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDYzh3ZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDYzh3dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ2M4dy1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hDVHpiZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hDVHpidWZYRWR1cUhvT0piVVJaUnciIHg9IjEyOTg3IiB5PSIzNDQ1IiB3aWR0aD0iNDc2MyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ2M4eE9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMUNCIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDYzh4LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IQ2M4eU9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ2M4eWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ2M4eXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ2M4eS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDYzh6T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDYzh6ZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDYzh6dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDYzh6LWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDYzgwT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDYzgwZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDYzgwdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ2M4MC1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hDYzh4ZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hDYzh4dWZYRWR1cUhvT0piVVJaUnciIHg9IjEyOTg3IiB5PSI1OTg1IiB3aWR0aD0iNDc2MyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ2M4MU9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERTVFRTEwMTExIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDYzgxLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IQ2M4Mk9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ2M4MmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ2M4MnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ2M4Mi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDYzgzT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDYzgzZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDYzgzdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDYzgzLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDYzg0T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDYzg0ZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDYzg0dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ2M4NC1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hDYzgxZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hDYzgxdWZYRWR1cUhvT0piVVJaUnciIHg9IjIyODM0IiB5PSI1MjQ3IiB3aWR0aD0iMjk4OCIgaGVpZ2h0PSIzNjc0Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDYzlFT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURFNUQ0NzAwRkIiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENjOUUtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hDYzlGT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDYzlGZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDYzlGdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDYzlGLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENjOUdPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENjOUdlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENjOUd1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENjOUctZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENjOUhPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENjOUhlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENjOUh1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDYzlILWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSENjOUVlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSENjOUV1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTU2NiIgeT0iMjc5NCIgd2lkdGg9IjM1NzMiIGhlaWdodD0iNjkwOCIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ210NE9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMUQ1Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDbXQ0LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IQ210NU9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iNDMwMSIgaGVpZ2h0PSI5OTAiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDbXQ1ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDbXQ1dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDbXQ1LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENtdDZPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENtdDZlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENtdDZ1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENtdDYtZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENtdDdPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENtdDdlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENtdDd1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDbXQ3LWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSENtdDRlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSENtdDR1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTI5ODciIHk9Ijc5OTIiIHdpZHRoPSI0NzYzIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MRGlhZ3JhbVN0eWxlIiB4bWk6aWQ9Il9HcVVKdC1mWEVkdXFIb09KYlVSWlJ3IiBkZXNjcmlwdGlvbj0iVGhpcyBkaWFncmFtIHNob3dzIGFsbCBndWlkYW5jZSB0eXBlcyBhbmQgdGhlaXIgcmVsYXRpb25zaGlwcyB0byBvdGhlciBjb250ZW50IGVsZW1lbnRzLiAgQXNzb2NpYXRpb25zIGFuZCBtdWx0aXBsaWNpdGllcyBoYXZlIGJlZW4gcHJlZGVmaW5lZCBvbiB0aGF0IGxldmVsIG9mIGRldGFpbCB0byBlbnN1cmUgdGhhdCBndWlkYW5jZSBpcyBvbmx5IHJlbGF0ZWQgdG8gYXBwcm9wcmlhdGUgY29udGVudCBlbGVtZW50cy4gIEZvciBleGFtcGxlLCBVTUEgZGVmaW5lcyB0aGF0IG9ubHkgb24gY2hlY2tsaXN0IGNhbiBiZSBhc3NvY2lhdGVkIHdpdGggb25lIGNvbnRlbnQgZWxlbWVudCBhdCBhIHRpbWUuICBPdGhlciBwYWNrYWdlcyBhZGQgdmFyaWFiaWxpdHkgY2FwYWJpbGl0aWVzIHRvIGNoZWNrbGlzdHMgKGFuZCBvdGhlciBjb250ZW50IGVsZW1lbnRzKSB0aGF0IGFsbG93cyB0byBkeW5hbWljYWxseSBwcm92aWRlIGFkZGl0aW9uYWwgY2hlY2sgcG9pbnRzIG9yIGV2ZW4gY2hlY2sgcG9pbnQgZ3JvdXBpbmdzIHRvIGNoZWNrIGxpc3Qgc28gdGhhdCBhbiBhc3NvY2lhdGVkIGNoZWNrIGxpc3QgYWx3YXlzIGNvbnRhaW5zIHRoZSByaWdodCBjaGVjayBwb2ludHMgd2l0aGluIHRoZSBjb250ZXh0IG9mIGEgcGFydGljdWxhciBtZXRob2QgY29uZmlndXJhdGlvbiBvciBwcm9jZXNzLiIvPg0KLSAgICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hDQVJQZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAwQjAiIHNvdXJjZT0iX0hCM0c0T2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hDQVJMZWZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENBUlFPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENBUlF1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0FSUS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hDQVJRZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hDQVJQdWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSENBUlAtZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTEwODMsIC0yNDUsIDIyMTgsIDQ2NV0kWy0yNDU1LCAtNTMzLCA4NDYsIDE3N10iLz4NCi0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hDQVJST2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSENBUlJlZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hDS0I0dWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEZENThCNDAyMzYiIHNvdXJjZT0iX0hDS0IwdWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hDS0IwdWZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENLQjVlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENLQjUtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0tCNk9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hDS0I1dWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDS0I2ZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGRDU4QjUwMzdBIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENLQjYtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hDS0I2dWZYRWR1cUhvT0piVVJaUnciIHk9IjM5NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENLQjdPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGRDU4QjUwMzdBIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENLQjd1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQ0tCN2VmWEVkdXFIb09KYlVSWlJ3IiB5PSItMzk3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0tCNy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEZENThCNTAzNzAiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0tCOGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQ0tCOE9mWEVkdXFIb09KYlVSWlJ3IiB4PSI4MSIgeT0iNTM3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0tCOHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGRDU4QjUwMzcwIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENLQjlPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hDS0I4LWZYRWR1cUhvT0piVVJaUnciIHg9Ii00MjAiIHk9Ii00NzAiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDS0I5ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEZENThCNTAzN0EiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0tCOS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENLQi1PZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQ0tCOXVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0tCLWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEZENThCNTAzNzAiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0tCLS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENLQl9PZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQ0tCLXVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0tCX2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRkQ1OEI1MDM3QSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDS0JfLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ0tDQU9mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hDS0JfdWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDS0NBZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEZENThCNTAzNzAiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0tDQS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ0tDQk9mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hDS0NBdWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hDS0I0LWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hDS0I1T2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzE3NzgsIDgsIDE3NzgsIDhdJFszMzc4LCA4LCAzMzc4LCA4XSRbMzM3OCwgMjU5MCwgMzM3OCwgMjU5MF0kWzgwNCwgMjU5MCwgODA0LCAyNTkwXSRbODA0LCAxMDU4LCA4MDQsIDEwNThdIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hDS0NGZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAyNzAiIHNvdXJjZT0iX0hDQVJIZWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hDS0NCZWZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENLQ0dPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENLQ0d1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0tDRy1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hDS0NHZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDS0NIT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAyNzMiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0tDSHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENLQ0hlZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTgwNSIgeT0iLTI3OSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENLQ0gtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAyNzMiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0tDSWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hDS0NJT2ZYRWR1cUhvT0piVVJaUnciIHg9IjQ4MiIgeT0iMjcyIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0tDSXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAyNzEiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0tDSk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQ0tDSS1mWEVkdXFIb09KYlVSWlJ3IiB4PSI4ODgiIHk9Ii0yNjYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDS0NKZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMjcxIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENLQ0otZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hDS0NKdWZYRWR1cUhvT0piVVJaUnciIHg9IjQ2MSIgeT0iMzQ4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0tDS09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMjczIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENLQ0t1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDS0NLLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENLQ0tlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENLQ0xPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMjcxIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENLQ0x1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDS0NMLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENLQ0xlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENLQ01PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAyNzMiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0tDTXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENLQ00tZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQ0tDTWVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0tDTk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMjcxIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENLQ051ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENLQ04tZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQ0tDTmVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IQ0tDRnVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IQ0tDRi1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMTgwMywgLTEwMSwgMTEwNDksIDMwOThdJFstMTEyMzUsIC0xMDEsIDE2MTcsIDMwOThdIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hDS0NRZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAyOEUiIHNvdXJjZT0iX0hDQVJMZWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hDS0NCZWZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENLQ1JPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENLQ1J1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0tDUi1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hDS0NSZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDS0NTT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAyOTEiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0tDU3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENLQ1NlZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTcyMyIgeT0iLTI4MCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENLQ1MtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAyOTEiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0tDVGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hDS0NUT2ZYRWR1cUhvT0piVVJaUnciIHg9IjYzNSIgeT0iMTY5Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0tDVHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAyOEYiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0tDVU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQ0tDVC1mWEVkdXFIb09KYlVSWlJ3IiB4PSI4OTYiIHk9Ii0zNTIiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDS0NVZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMjhGIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENLQ1UtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hDS0NVdWZYRWR1cUhvT0piVVJaUnciIHg9IjQ5MiIgeT0iMzQ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0tDVk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMjkxIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENLQ1Z1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDS0NWLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENLQ1ZlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENLQ1dPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMjhGIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENLQ1d1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDS0NXLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENLQ1dlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENLQ1hPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAyOTEiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0tDWHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENLQ1gtZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQ0tDWGVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0tDWU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMjhGIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENLQ1l1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENLQ1ktZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQ0tDWWVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IQ0tDUXVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IQ0tDUS1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstODQ2LCA1OSwgMTE1NDgsIDExMjZdJFstMTA3NzgsIDU5LCAxNjE3LCAxMTI2XSIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IQ0tDWk9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERTVERDcwMTRDIiBzb3VyY2U9Il9IQ0FSUnVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IQ0tDQmVmWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDS0NaLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDS0NhZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENLQ2F1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IQ0tDYU9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0tDYS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERTVERDcwMTRFIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENLQ2JlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hDS0NiT2ZYRWR1cUhvT0piVVJaUnciIHg9Ii01OTIiIHk9Ii0yNTUiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDS0NidWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERTVERDcwMTRFIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENLQ2NPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQ0tDYi1mWEVkdXFIb09KYlVSWlJ3IiB4PSI2NiIgeT0iMjY1Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0tDY2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURFNURENzAxNEQiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0tDYy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQ0tDY3VmWEVkdXFIb09KYlVSWlJ3IiB4PSI5MzciIHk9Ii00NTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDS0NkT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERTVERDcwMTREIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENLQ2R1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hDS0NkZWZYRWR1cUhvT0piVVJaUnciIHg9Ii03OSIgeT0iMzEyIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0tDZC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERTVERDcwMTRFIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENLQ2VlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDS0NldWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENLQ2VPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENLQ2UtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERTVERDcwMTREIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENLQ2ZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDS0NmdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENLQ2ZPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENLQ2YtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURFNURENzAxNEUiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0tDZ2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENLQ2d1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQ0tDZ09mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0tDZy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERTVERDcwMTREIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENLQ2hlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENLQ2h1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQ0tDaE9mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IQ0tDWmVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IQ0tDWnVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstOTU2LCAxNiwgMTExODQsIC03NDVdJFstMTA1MjQsIDE2LCAxNjE3LCAtNzQ1XSIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IQ1R5ME9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERTVENzMwMjBFIiBzb3VyY2U9Il9IQ0FSVnVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IQ0tDQmVmWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDVHkwLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDVHkxZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENUeTF1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IQ1R5MU9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ1R5MS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERTVENzMwMjEwIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENUeTJlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hDVHkyT2ZYRWR1cUhvT0piVVJaUnciIHg9Ii02NDkiIHk9IjE5NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENUeTJ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURFNUQ3MzAyMTAiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ1R5M09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hDVHkyLWZYRWR1cUhvT0piVVJaUnciIHg9Ii0xOTUiIHk9Ii0yOTciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDVHkzZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREU1RDczMDIwRiI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDVHkzLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hDVHkzdWZYRWR1cUhvT0piVVJaUnciIHg9IjkzNCIgeT0iLTM0OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENUeTRPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURFNUQ3MzAyMEYiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ1R5NHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENUeTRlZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTEzOCIgeT0iMjQ1Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ1R5NC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERTVENzMwMjEwIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENUeTVlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDVHk1dWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENUeTVPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENUeTUtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERTVENzMwMjBGIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENUeTZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDVHk2dWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENUeTZPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENUeTYtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURFNUQ3MzAyMTAiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ1R5N2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENUeTd1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQ1R5N09mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ1R5Ny1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERTVENzMwMjBGIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENUeThlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENUeTh1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQ1R5OE9mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IQ1R5MGVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IQ1R5MHVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstOTIyLCAzMywgMTExNjcsIC0yNDA0XSRbLTEwNDczLCAzMywgMTYxNywgLTI0MDRdIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hDVHk4LWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURFNUU1NTAwQzUiIHNvdXJjZT0iX0hDQVJadWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hDS0NCZWZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENUeTl1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENUeS1PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ1R5LWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hDVHk5LWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDVHktdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURFNUU1NTAwQzciPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ1R5X09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENUeS0tZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTc2NSIgeT0iLTIxOCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENUeV9lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURFNUU1NTAwQzciPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ1R5Xy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hDVHlfdWZYRWR1cUhvT0piVVJaUnciIHg9Ii0yMDYiIHk9IjIyMCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENUekFPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERTVFNTUwMEM2Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENUekF1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENUekFlZlhFZHVxSG9PSmJVUlpSdyIgeD0iOTI4IiB5PSItMjU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ1R6QS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREU1RTU1MDBDNiI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDVHpCZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQ1R6Qk9mWEVkdXFIb09KYlVSWlJ3IiB4PSItMjIyIiB5PSIzMDUiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDVHpCdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURFNUU1NTAwQzciPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ1R6Q09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENUekNlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQ1R6Qi1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ1R6Q3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURFNUU1NTAwQzYiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ1R6RE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENUekRlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQ1R6Qy1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ1R6RHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREU1RTU1MDBDNyI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDVHpFT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ1R6RWVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hDVHpELWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDVHpFdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURFNUU1NTAwQzYiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ1R6Rk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ1R6RmVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hDVHpFLWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hDVHk5T2ZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hDVHk5ZWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy05MTQsIC00MiwgMTExMjUsIC00MDU1XSRbLTEwNDIyLCAtNDIsIDE2MTcsIC00MDU1XSIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IQ1R6RnVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxM0M5M0QwMzIxIiBzb3VyY2U9Il9IQ0tDQmVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IQ0FSZHVmWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDVHpHZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDVHpHLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENUekhPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IQ1R6R3VmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ1R6SGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxM0M5M0YwMDk5Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENUekgtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hDVHpIdWZYRWR1cUhvT0piVVJaUnciIHg9Ii05MDQiIHk9IjI2NyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENUeklPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxM0M5M0YwMDk5Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENUekl1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQ1R6SWVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMzk3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ1R6SS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjEzQzkzRjAwNDkiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ1R6SmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQ1R6Sk9mWEVkdXFIb09KYlVSWlJ3IiB4PSI2ODEiIHk9Ii0yNjEiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDVHpKdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjEzQzkzRjAwNDkiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ1R6S09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENUekotZlhFZHVxSG9PSmJVUlpSdyIgeD0iNTM3IiB5PSIyMTEiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDVHpLZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjEzQzkzRjAwOTkiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ1R6Sy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENUekxPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQ1R6S3VmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ1R6TGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjEzQzkzRjAwNDkiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ1R6TC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENUek1PZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQ1R6THVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ1R6TWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMTNDOTNGMDA5OSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDVHpNLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ1R6Tk9mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hDVHpNdWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDVHpOZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjEzQzkzRjAwNDkiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ1R6Ti1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ1R6T09mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hDVHpOdWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hDVHpGLWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hDVHpHT2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzE2MTcsIC02MDM2LCAtMTAwNjYsIC00Ml0kWzEwMjcwLCAtNjAzNiwgLTE0MTMsIC00Ml0iLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSENUek9lZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREY0MUM2MDNBMCIgc291cmNlPSJfSENLQjB1ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSENLQ0JlZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ1R6UE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ1R6UHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDVHpQLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSENUelBlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENUelFPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREY0MUM2MDNBMiI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDVHpRdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQ1R6UWVmWEVkdXFIb09KYlVSWlJ3IiB4PSItNzA3IiB5PSIyMTciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDVHpRLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREY0MUM2MDNBMiI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDVHpSZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENUelJPZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTQzOCIgeT0iLTQzOSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENUelJ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERjQxQzYwM0ExIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENUelNPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENUelItZlhFZHVxSG9PSmJVUlpSdyIgeD0iNjQ0IiB5PSIxOTYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDVHpTZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURGNDFDNjAzQTEiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ1R6Uy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENUelN1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTc3OCIgeT0iLTI2MSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENUelRPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREY0MUM2MDNBMiI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDVHpUdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ1R6VC1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hDVHpUZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDVHpVT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREY0MUM2MDNBMSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDVHpVdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ1R6VS1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hDVHpVZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDVHpWT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERjQxQzYwM0EyIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENUelZ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDVHpWLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENUelZlZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENUeldPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREY0MUM2MDNBMSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDVHpXdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDVHpXLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENUeldlZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSENUek91ZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSENUek8tZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTE3NzgsIC01MCwgMTA5NzIsIDUxODFdJFstMTExMzMsIC01MCwgMTYxNywgNTE4MV0iLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSENjODdlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREU1RkY3MDMwNCIgc291cmNlPSJfSENjOHhPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSENjODFPZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ2M4OE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ2M4OHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDYzg4LWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSENjODhlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENjODlPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREU1RkY3MDMwNiI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDYzg5dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQ2M4OWVmWEVkdXFIb09KYlVSWlJ3IiB4PSItMjg0IiB5PSItMTYwIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ2M4OS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREU1RkY3MDMwNiI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDYzgtZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENjOC1PZlhFZHVxSG9PSmJVUlpSdyIgeD0iNTY2IiB5PSIyNzciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDYzgtdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREU1RkY3MDMwNSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDYzhfT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hDYzgtLWZYRWR1cUhvT0piVVJaUnciIHg9IjU1NCIgeT0iLTI4MSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENjOF9lZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURFNUZGNzAzMDUiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ2M4Xy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENjOF91ZlhFZHVxSG9PSmJVUlpSdyIgeD0iNzE2IiB5PSItMjYzIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ2M5QU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERTVGRjcwMzA2Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENjOUF1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDYzlBLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENjOUFlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENjOUJPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERTVGRjcwMzA1Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENjOUJ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDYzlCLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENjOUJlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENjOUNPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURFNUZGNzAzMDYiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ2M5Q3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENjOUMtZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQ2M5Q2VmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ2M5RE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERTVGRjcwMzA1Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENjOUR1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENjOUQtZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQ2M5RGVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IQ2M4N3VmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IQ2M4Ny1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlsxMDQxLCAtMTAxLCAtOTk4MiwgLTc2Ml0kWzk1MzMsIC0xMDEsIC0xNDkwLCAtNzYyXSIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IQ2M5SU9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERTVFNDQwM0UxIiBzb3VyY2U9Il9IQ1R6WE9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IQ2M5RU9mWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDYzlJLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDYzlKZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENjOUp1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IQ2M5Sk9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ2M5Si1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERTVFNDQwM0UzIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENjOUtlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hDYzlLT2ZYRWR1cUhvT0piVVJaUnciIHg9Ii01NzIiIHk9Ii0yNzgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDYzlLdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERTVFNDQwM0UzIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENjOUxPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQ2M5Sy1mWEVkdXFIb09KYlVSWlJ3IiB4PSItMTA0IiB5PSIyNTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDYzlMZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREU1RTQ0MDNFMiI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDYzlMLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hDYzlMdWZYRWR1cUhvT0piVVJaUnciIHg9Ijg4MSIgeT0iMjI1Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ2M5TU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREU1RTQ0MDNFMiI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDYzlNdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQ2M5TWVmWEVkdXFIb09KYlVSWlJ3IiB4PSI5OCIgeT0iMzMxIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ2M5TS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERTVFNDQwM0UzIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENjOU5lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDYzlOdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENjOU5PZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENjOU4tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERTVFNDQwM0UyIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENjOU9lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDYzlPdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENjOU9PZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENjOU8tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURFNUU0NDAzRTMiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ2M5UGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENjOVB1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQ2M5UE9mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ2M5UC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERTVFNDQwM0UyIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENjOVFlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENjOVF1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQ2M5UU9mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IQ2M5SWVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IQ2M5SXVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstNzYyLCAtNjcsIDEwODcxLCAtMTAzMl0kWy05OTU2LCAtNjcsIDE2NzYsIC0xMDMyXSIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IQ2M5US1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERTVFNjEwMkNDIiBzb3VyY2U9Il9IQ1R6Yk9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IQ2M5RU9mWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDYzlSdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDYzlTT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENjOVNlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IQ2M5Ui1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ2M5U3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERTVFNjEwMkNFIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENjOVRPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hDYzlTLWZYRWR1cUhvT0piVVJaUnciIHg9Ii02NDAiIHk9Ii0zMTMiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDYzlUZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERTVFNjEwMkNFIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENjOVQtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQ2M5VHVmWEVkdXFIb09KYlVSWlJ3IiB4PSItMTI2IiB5PSIyODgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDYzlVT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREU1RTYxMDJDRCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDYzlVdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hDYzlVZWZYRWR1cUhvT0piVVJaUnciIHg9IjkwOSIgeT0iMjg4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ2M5VS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREU1RTYxMDJDRCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDYzlWZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQ2M5Vk9mWEVkdXFIb09KYlVSWlJ3IiB4PSIxNTQiIHk9Ii0zNzIiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDYzlWdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURFNUU2MTAyQ0UiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ2M5V09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENjOVdlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQ2M5Vi1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ2M5V3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURFNUU2MTAyQ0QiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ2M5WE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENjOVhlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQ2M5Vy1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ2M5WHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREU1RTYxMDJDRSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDYzlZT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ2M5WWVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hDYzlYLWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDYzlZdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURFNUU2MTAyQ0QiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ2M5Wk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ2M5WmVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hDYzlZLWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hDYzlST2ZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hDYzlSZWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy05MjIsIC01OSwgMTA3NjEsIC0yMzk2XSRbLTEwMDA3LCAtNTksIDE2NzYsIC0yMzk2XSIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IQ2M5Yi1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QUJDODgwMkQwIiBzb3VyY2U9Il9IQ2M5RU9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IQ2M4eE9mWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDbXR3T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDbXR3dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENtdHctZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IQ210d2VmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ210eE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QUJDODkwMzdFIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENtdHh1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hDbXR4ZWZYRWR1cUhvT0piVVJaUnciIHg9Ii04OTAiIHk9Ii0yMTIiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDbXR4LWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0FCQzg5MDM3RSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDbXR5ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENtdHlPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTM5NyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENtdHl1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QUJDODkwMzdDIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENtdHpPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENtdHktZlhFZHVxSG9PSmJVUlpSdyIgeD0iNjM2IiB5PSItMTEwIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ210emVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QUJDODkwMzdDIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENtdHotZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hDbXR6dWZYRWR1cUhvT0piVVJaUnciIHg9Ii0yMTkiIHk9IjI5NSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENtdDBPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0FCQzg5MDM3RSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDbXQwdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ210MC1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hDbXQwZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDbXQxT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0FCQzg5MDM3QyI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDbXQxdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ210MS1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hDbXQxZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDbXQyT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QUJDODkwMzdFIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENtdDJ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDbXQyLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENtdDJlZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENtdDNPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0FCQzg5MDM3QyI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDbXQzdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDbXQzLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENtdDNlZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSENjOWNPZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSENjOWNlZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMTY3NiwgMjAzLCAtMTAyNjEsIDBdJFsxMDg5NiwgMjAzLCAtMTA0MSwgMF0iLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSENtdDhPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQ0RDhGNTE0MDIyNiIgc291cmNlPSJfSENtdDRPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSENjODFPZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ210OC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ210OWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDbXQ5dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSENtdDlPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENtdDktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQ0RDhGNTE0MDIyOCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDbXQtZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQ210LU9mWEVkdXFIb09KYlVSWlJ3IiB4PSItNDA2IiB5PSItMjY1Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ210LXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQ0RDhGNTE0MDIyOCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDbXRfT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENtdC0tZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTQzNyIgeT0iMjYyIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ210X2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0NEQ4RjUxNDAyMjciPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ210Xy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQ210X3VmWEVkdXFIb09KYlVSWlJ3IiB4PSI0OTgiIHk9Ii0yMDQiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDbXVBT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDREOEY1MTQwMjI3Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENtdUF1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hDbXVBZWZYRWR1cUhvT0piVVJaUnciIHg9IjM4NCIgeT0iMzU1Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ211QS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDREOEY1MTQwMjI4Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENtdUJlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDbXVCdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENtdUJPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENtdUItZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDREOEY1MTQwMjI3Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENtdUNlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDbXVDdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENtdUNPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENtdUMtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0NEQ4RjUxNDAyMjgiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ211RGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENtdUR1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQ211RE9mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ211RC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDREOEY1MTQwMjI3Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENtdUVlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENtdUV1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQ211RU9mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IQ210OGVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IQ210OHVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlsyMTUwLCAtMTYsIC05MTI3LCAxMzU0XSRbOTc4NywgLTE2LCAtMTQ5MCwgMTM1NF0iLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSENtdUUtZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQ0RDhGNTE4MDBGNSIgc291cmNlPSJfSENtdDRPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSENjOUVPZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ211RnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ211R09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDbXVHZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSENtdUYtZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENtdUd1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQ0RDhGNTE4MDBGNyI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDbXVIT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQ211Ry1mWEVkdXFIb09KYlVSWlJ3IiB4PSItNjAzIiB5PSItMzI0Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ211SGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQ0RDhGNTE4MDBGNyI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDbXVILWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENtdUh1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTM5NSIgeT0iMzQ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ211SU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0NEQ4RjUxODAwRjYiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ211SXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQ211SWVmWEVkdXFIb09KYlVSWlJ3IiB4PSI4NjMiIHk9Ii0yNDUiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDbXVJLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDREOEY1MTgwMEY2Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENtdUplZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hDbXVKT2ZYRWR1cUhvT0piVVJaUnciIHg9IjM3NyIgeT0iMzQ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ211SnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDREOEY1MTgwMEY3Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENtdUtPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDbXVLZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENtdUotZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENtdUt1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDREOEY1MTgwMEY2Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENtdUxPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDbXVMZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENtdUstZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENtdUx1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0NEQ4RjUxODAwRjciPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ211TU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENtdU1lZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQ211TC1mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ211TXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDREOEY1MTgwMEY2Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENtdU5PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENtdU5lZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQ211TS1mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IQ211Rk9mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IQ211RmVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMjE1MCwgMCwgOTUzMywgMjIzNV0kWy0xMDAwNywgMCwgMTY3NiwgMjIzNV0iLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfLWc3THNPMG9FZHV0Q0xFQ045NkJOdyIgZWxlbWVudD0iXy1kOHdNTzBvRWR1dENMRUNOOTZCTnciIHNvdXJjZT0iX0hDS0NCZWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hDQVEzZWZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfLWc3THMtMG9FZHV0Q0xFQ045NkJOdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfLWc3THRlMG9FZHV0Q0xFQ045NkJOdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il8tZzdMdHUwb0VkdXRDTEVDTjk2Qk53IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfLWc3THRPMG9FZHV0Q0xFQ045NkJOdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfLWc3THQtMG9FZHV0Q0xFQ045NkJOdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXy1nQnowdTBvRWR1dENMRUNOOTZCTnciPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il8tZzdMdWUwb0VkdXRDTEVDTjk2Qk53IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfLWc3THVPMG9FZHV0Q0xFQ045NkJOdyIgeD0iLTk1NCIgeT0iMzQyIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il8tZzdMdXUwb0VkdXRDTEVDTjk2Qk53IiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXy1nQnowdTBvRWR1dENMRUNOOTZCTnciPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il8tZzdMdk8wb0VkdXRDTEVDTjk2Qk53IiB0eXBlPSJUb1JvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iXy1nN0x1LTBvRWR1dENMRUNOOTZCTnciIHk9Ii0zOTciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iXy1nN0x2ZTBvRWR1dENMRUNOOTZCTnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXy1lMWhBTzBvRWR1dENMRUNOOTZCTnciPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il8tZzdMdi0wb0VkdXRDTEVDTjk2Qk53IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il8tZzdMdnUwb0VkdXRDTEVDTjk2Qk53IiB4PSI2ODciIHk9IjI2MyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfLWc3THdPMG9FZHV0Q0xFQ045NkJOdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXy1lMWhBTzBvRWR1dENMRUNOOTZCTnciPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il8tZzdMd3Uwb0VkdXRDTEVDTjk2Qk53IiB0eXBlPSJGcm9tUm9sZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfLWc3THdlMG9FZHV0Q0xFQ045NkJOdyIgeD0iLTM1MCIgeT0iLTIwOCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfLWc3THctMG9FZHV0Q0xFQ045NkJOdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXy1nQnowdTBvRWR1dENMRUNOOTZCTnciPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il8tZzdMeGUwb0VkdXRDTEVDTjk2Qk53IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfLWc3THh1MG9FZHV0Q0xFQ045NkJOdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il8tZzdMeE8wb0VkdXRDTEVDTjk2Qk53IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il8taEU4c08wb0VkdXRDTEVDTjk2Qk53IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8tZTFoQU8wb0VkdXRDTEVDTjk2Qk53Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfLWhFOHN1MG9FZHV0Q0xFQ045NkJOdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iXy1oRThzLTBvRWR1dENMRUNOOTZCTnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfLWhFOHNlMG9FZHV0Q0xFQ045NkJOdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfLWhFOHRPMG9FZHV0Q0xFQ045NkJOdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8tZ0J6MHUwb0VkdXRDTEVDTjk2Qk53Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfLWhFOHR1MG9FZHV0Q0xFQ045NkJOdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iXy1oRTh0LTBvRWR1dENMRUNOOTZCTnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfLWhFOHRlMG9FZHV0Q0xFQ045NkJOdyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfLWhFOHVPMG9FZHV0Q0xFQ045NkJOdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXy1lMWhBTzBvRWR1dENMRUNOOTZCTnciPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il8taEU4dXUwb0VkdXRDTEVDTjk2Qk53IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il8taEU4dS0wb0VkdXRDTEVDTjk2Qk53Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iXy1oRTh1ZTBvRWR1dENMRUNOOTZCTnciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iXy1nN0xzZTBvRWR1dENMRUNOOTZCTnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iXy1nN0xzdTBvRWR1dENMRUNOOTZCTnciIHBvaW50cz0iWzY1LCA1NywgLTI2MiwgLTE4NF0kWzI3MCwgMjQ1LCAtNTcsIDRdIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgIDwvY29udGVudHM+DQotICAgICAgICAgICAgPGNvbnRlbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpEaWFncmFtIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEY0OUZFNzAzQzEiIHR5cGU9IkNsYXNzIiBuYW1lPSJUYXhvbm9teSI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEM1b3NPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDE5QSI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQzVvcy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEM1b3RPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEM1b3RlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEM1b3R1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEM1b3QtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQzVvdU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQzVvdWVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQzVvdXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQzVvdS1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQzVvdk9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQzVvdmVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQzVvdnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEM1b3YtZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IQzVvc2VmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IQzVvc3VmWEVkdXFIb09KYlVSWlJ3IiB4PSIyNjkzNyIgeT0iMTAwMTEiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEM1b3dPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDE5OSI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQzVvdy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEM1b3hPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEM1b3hlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEM1b3h1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEM1b3gtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQzVveU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQzVveWVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQzVveXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQzVveS1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQzVvek9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQzVvemVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQzVvenVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEM1b3otZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IQzVvd2VmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IQzVvd3VmWEVkdXFIb09KYlVSWlJ3IiB4PSIyOTM1NiIgeT0iMTAwMTEiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEM1bzBPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDFBMyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQzVvMC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEM1bzFPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEM1bzFlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEM1bzF1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEM1bzEtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQzVvMk9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQzVvMmVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQzVvMnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQzVvMi1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQzVvM09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQzVvM2VmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQzVvM3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEM1bzMtZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IQzVvMGVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IQzVvMHVmWEVkdXFIb09KYlVSWlJ3IiB4PSIyMjA1NiIgeT0iMTAwMTEiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEM1bzRPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDFCNyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQzVvNC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEM1bzVPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEM1bzVlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEM1bzV1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEM1bzUtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQzVvNk9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQzVvNmVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQzVvNnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQzVvNi1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQzVvN09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQzVvN2VmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQzVvN3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEM1bzctZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IQzVvNGVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IQzVvNHVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxOTkxNyIgeT0iMTAwMTEiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEM1bzhPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDFDMSI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRERac09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEREWnNlZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEREWnN1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEREWnMtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEREWnRPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRERadGVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRERadHVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRERadC1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRERadU9mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRERadWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRERadXVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRERadS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEREWnZPZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IQzVvOGVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IQzVvOHVmWEVkdXFIb09KYlVSWlJ3IiB4PSI0OTEiIHk9IjEwMDExIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hERFp2ZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxQTQiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEREWndPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hERFp3ZWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hERFp3dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hERFp3LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hERFp4T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEREWnhlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEREWnh1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEREWngtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEREWnlPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEREWnllZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEREWnl1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEREWnktZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hERFp6T2ZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEREWnZ1ZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEREWnYtZlhFZHVxSG9PSmJVUlpSdyIgeD0iOTkxNyIgeT0iMTAwMDIiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEREWnplZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDFCOCI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRERaME9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEREWjBlZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEREWjB1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEREWjAtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEREWjFPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRERaMWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRERaMXVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRERaMS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRERaMk9mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRERaMmVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRERaMnVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRERaMi1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEREWjNPZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IRERaenVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRERaei1mWEVkdXFIb09KYlVSWlJ3IiB4PSIyNDQwMCIgeT0iMTAwMTEiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEREWjNlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDFGMyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRERaNE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEREWjRlZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEREWjR1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEREWjQtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEREWjVPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRERaNWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRERaNXVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRERaNS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRERaNk9mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRERaNmVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRERaNnVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRERaNi1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEREWjdPZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IRERaM3VmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iTm9uZSIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRERaMy1mWEVkdXFIb09KYlVSWlJ3IiB4PSI2NjE4IiB5PSIxMDAxMSIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRERaN2VmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMUNCIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hERFo4T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IRERaOGVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRERaOHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRERaOC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRERaOU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hERFo5ZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hERFo5dWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hERFo5LWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hERFotT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hERFotZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hERFotdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hERFotLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRERaX09mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hERFo3dWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hERFo3LWZYRWR1cUhvT0piVVJaUnciIHg9IjEyMzczIiB5PSIxMDAxMSIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRERaX2VmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMUUwIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hERGFBT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IRERhQWVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRERhQXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRERhQS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRERhQk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hERGFCZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hERGFCdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hERGFCLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hERGFDT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hERGFDZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hERGFDdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hERGFDLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRERhRE9mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hERFpfdWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hERFpfLWZYRWR1cUhvT0piVVJaUnciIHg9IjI5MTY0IiB5PSIxMTcyOSIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRERhRnVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGRDRFQjQwMkJCIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hERGFHZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IRERhR3VmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRERhRy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRERhSE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRERhSGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hERGFIdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hERGFILWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hERGFJT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hERGFJZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hERGFJdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hERGFJLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hERGFKT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRERhSmVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hERGFGLWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJOb25lIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hERGFHT2ZYRWR1cUhvT0piVVJaUnciIHg9IjQzMzEiIHk9IjEwMDExIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hERGFKdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyNkMiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEREYUtlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hERGFLdWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hERGFLLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hERGFMT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hERGFMZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEREYUx1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEREYUwtZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEREYU1PZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEREYU1lZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEREYU11ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEREYU0tZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEREYU5PZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hERGFOZWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEREYUotZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMTI2MzIyNTYiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hERGFLT2ZYRWR1cUhvT0piVVJaUnciIHg9IjE1ODI3IiB5PSI0ODM1IiB3aWR0aD0iMzQ3OSIgaGVpZ2h0PSIxMTAwIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hETWoyZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyREEiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERNajNPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hETWozZWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIzNzc2IiBoZWlnaHQ9IjExMzQiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hETWozdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hETWozLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hETWo0T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERNajRlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSERNajR1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERNajQtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSERNajVPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERNajVlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSERNajV1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERNajUtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hETWo2T2ZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSERNajJ1ZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMTI2MzIyNTYiIHNob3dQYXJlbnQ9Ik5hbWUiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hETWoyLWZYRWR1cUhvT0piVVJaUnciIHg9IjE1NTA4IiB5PSI3MzQ1Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hETWotLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjEzQzkxMzAyQzUiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERNal91ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hETWpfLWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIyODAyIiBoZWlnaHQ9Ijk5OSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERNa0FPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERNa0FlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERNa0F1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRE1rQS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRE1rQk9mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRE1rQmVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRE1rQnVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRE1rQi1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRE1rQ09mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRE1rQ2VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSERNa0N1ZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IRE1qX09mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRE1qX2VmWEVkdXFIb09KYlVSWlJ3IiB4PSIzMTczOSIgeT0iMTAwMjEiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERNa0ZPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyOTRFQjkwMDBGQyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRE1rRi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSERNa0dPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjM1MjIiIGhlaWdodD0iMTA2NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERNa0dlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERNa0d1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERNa0ctZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRE1rSE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRE1rSGVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRE1rSHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRE1rSC1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRE1rSU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRE1rSWVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRE1rSXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSERNa0ktZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IRE1rRmVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIxMjYzMjI1NiIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSERNa0Z1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTU4NTAiIHk9IjI4NTMiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfODIxd0VPb1ZFZHVPQlBRQTJoS3FVUSIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDFENSI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il84MjF3RS1vVkVkdU9CUFFBMmhLcVVRIiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfODIxd0ZPb1ZFZHVPQlBRQTJoS3FVUSIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfODIxd0Zlb1ZFZHVPQlBRQTJoS3FVUSIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfODIxd0Z1b1ZFZHVPQlBRQTJoS3FVUSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfODIxd0Ytb1ZFZHVPQlBRQTJoS3FVUSIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il84MjF3R09vVkVkdU9CUFFBMmhLcVVRIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il84MjF3R2VvVkVkdU9CUFFBMmhLcVVRIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il84MjF3R3VvVkVkdU9CUFFBMmhLcVVRIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il84MjF3Ry1vVkVkdU9CUFFBMmhLcVVRIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il84MjF3SE9vVkVkdU9CUFFBMmhLcVVRIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il84MjF3SGVvVkVkdU9CUFFBMmhLcVVRIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il84MjF3SHVvVkVkdU9CUFFBMmhLcVVRIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfODIxd0gtb1ZFZHVPQlBRQTJoS3FVUSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il84MjF3RWVvVkVkdU9CUFFBMmhLcVVRIiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il84MjF3RXVvVkVkdU9CUFFBMmhLcVVRIiB4PSIxNTE5NSIgeT0iMTAwMDkiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxEaWFncmFtU3R5bGUiIHhtaTppZD0iX0dxZDZrZWZYRWR1cUhvT0piVVJaUnciIGRlc2NyaXB0aW9uPSJUaGUgR3VpZGFuY2UgVHlwZXMgcGFja2FnZSBkZWZpbmVzIGEgbnVtYmVyIG9mIHByZS1kZWZpbmVkIGNvbmNyZXRlIGd1aWRhbmNlIHR5cGVzIHRoYXQgY2FuIGJlIHJlbGF0ZWQgdG8gc3BlY2lmaWMgY29udGVudCBlbGVtZW50cy4gIEd1aWRhbmNlIGlzIGEgY29udGVudCBlbGVtZW50IGl0c2VsZiwgc28gaXQgaXMgcG9zc2libGUgdG8gYXNzb2NpYXRlIGd1aWRhbmNlIHRvIGd1aWRhbmNlLiBUaGlzIGRpYWdyYW0gc2hvd3MgdGhlIHRheG9ub215IG9mIGFsbCBndWlkYW5jZSB0eXBlcy4iLz4NCi0gICAgICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IRERhRGVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMEIwIiBzb3VyY2U9Il9IRERaX2VmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IQzVvd09mWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hERGFFT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hERGFFdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEREYUUtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRERhRWVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IRERhRHVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IRERhRC1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlswLCAtMzE4LCAwLCAxNzczXSRbMCwgLTE3NzMsIDAsIDMxOF0iLz4NCi0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hERGFGT2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEREYUZlZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hERGFSdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURGNDY2RjAxMTkiIHNvdXJjZT0iX0hDNW84T2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hETWoyZWZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEREYVNlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEREYVMtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRERhVE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hERGFTdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hERGFSLWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlRyZWUiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEREYVNPZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbOTUyLCAtMzE3LCAtMTIwMzksIDQwMjJdJFsxMTU2MiwgLTM4NjIsIC0xNDI5LCA0NzddIi8+DQotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRERhVGVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hERGFUdWZYRWR1cUhvT0piVVJaUnciIGlkPSIoMC4xOTM5NjI0NCwwLjM4NzEyOTcyKSIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IRERhVC1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERjQ2NzMwMDU1IiBzb3VyY2U9Il9IRERhRnVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IRE1qMmVmWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hERGFVdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hERGFWT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEREYVZlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRERhVS1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IRERhVU9mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJUcmVlIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hERGFVZWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzc0MCwgLTMxNywgLTkzMTQsIDQwMjJdJFs4OTQyLCAtMzg2MiwgLTExMTIsIDQ3N10iLz4NCi0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hERGFWdWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEREYVYtZlhFZHVxSG9PSmJVUlpSdyIgaWQ9IigwLjE1NjE2ODMsMC43OTI2NDU2KSIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IRERhV09mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGNEQyQUIwM0NBIiBzb3VyY2U9Il9IRERaM2VmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IRE1qMmVmWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hERGFXLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hERGFYZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEREYVh1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRERhWE9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IRERhV2VmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJUcmVlIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hERGFXdWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzU1NSwgLTMxNywgLTY5NTksIDQwMjJdJFs2NjkzLCAtMzg2MiwgLTgyMSwgNDc3XSIvPg0KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEREYVgtZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRERhWU9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iKDAuMjgyMTQ4OCwwLjc2NjA4NzgzKSIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IRERhWWVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERjQ2N0IwMjVEIiBzb3VyY2U9Il9IRERadmVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IRE1qMmVmWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hERGFaT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hERGFadWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERNam9PZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRERhWmVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IRERhWXVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJUcmVlIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hERGFZLWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzM3MCwgLTMxNywgLTQ2MzEsIDQwMjJdJFs0NDQ1LCAtMzg2MiwgLTU1NiwgNDc3XSIvPg0KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSERNam9lZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hETWpvLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAwOUIiIHNvdXJjZT0iX0hERFo3ZWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hETWoyZWZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERNanB1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERNanFPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRE1qcWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hETWpwLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hETWpwT2ZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlRyZWUiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSERNanBlZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMTg1LCAtMzE3LCAtMjM4MiwgNDAyMl0kWzIyNzYsIC0zODYyLCAtMjkxLCA0NzddIi8+DQotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRE1qcXVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSERNanJPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDA5MCIgc291cmNlPSJfSEM1bzRPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSERNajJlZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRE1qci1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRE1qc2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hETWpzdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSERNanNPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSERNanJlZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iVHJlZSIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IRE1qcnVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMjcsIC0zMTcsIDM3MCwgNDAyMl0kWy0zNDQsIC0zODYyLCA1MywgNDc3XSIvPg0KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSERNanMtZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRE1qdE9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iKDAuNDc3MDYyMDUsMC43NjYwODc4MykiLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSERNanRlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDA1RiIgc291cmNlPSJfSEM1bzBPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSERNajJlZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRE1qdU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRE1qdXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hETWp1LWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSERNanVlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSERNanR1ZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iVHJlZSIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IRE1qdC1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMTA2LCAtMzE3LCAxMzQ5LCA0MDIyXSRbLTEyOTcsIC0zODYyLCAxNTgsIDQ3N10iLz4NCi0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hETWp2T2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSERNanZlZlhFZHVxSG9PSmJVUlpSdyIgaWQ9IigwLjU5NjYyNDcsMC43OTI2NDU2KSIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IRE1qdnVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMDkxIiBzb3VyY2U9Il9IRERaemVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IRE1qMmVmWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hETWp3ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hETWp3LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERNanhPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRE1qd3VmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IRE1qdi1mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJUcmVlIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hETWp3T2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0yNjUsIC0zMTcsIDM0MzksIDQwMjJdJFstMzMwNywgLTM4NjIsIDM5NywgNDc3XSIvPg0KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSERNanhlZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRE1qeHVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iKDAuNjkwNzUzNSwwLjc5MjY0NTYpIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hETWp4LWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAwNUUiIHNvdXJjZT0iX0hDNW9zT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hETWoyZWZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERNanl1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERNanpPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRE1qemVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hETWp5LWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hETWp5T2ZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlRyZWUiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSERNanllZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTQyMywgLTMxNywgNTQyNCwgNDAyMl0kWy01MjEyLCAtMzg2MiwgNjM1LCA0NzddIi8+DQotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRE1qenVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hETWp6LWZYRWR1cUhvT0piVVJaUnciIGlkPSIoMC43NjYzNDE4LDAuNTc3MTE5NSkiLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSERNajBPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDA1NiIgc291cmNlPSJfSEM1b3dPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSERNajJlZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRE1qMC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRE1qMWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hETWoxdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSERNajFPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSERNajBlZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iVHJlZSIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IRE1qMHVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstNTgyLCAtMzE3LCA3NDg3LCA0MDIyXSRbLTcxNzAsIC0zODYyLCA4OTksIDQ3N10iLz4NCi0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hETWoxLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSERNajJPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9IigwLjg2Njg4ODUsMC43OTI2NDU2KSIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IRE1qNmVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTMwMTFEIiBzb3VyY2U9Il9IRE1qMmVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IRERhSnVmWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hETWo3T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hETWo3dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERNajctZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRE1qN2VmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IRE1qNnVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIxMjYzMjI1NiIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSERNajYtZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTgwLCAtNTAyLCAwLCAxMzUwXSRbLTgwLCAtMTI5NiwgMCwgNTU2XSIvPg0KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSERNajhPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRE1qOGVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSERNa0MtZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMkZBMEMzMDA3QyIgc291cmNlPSJfSERNai0tZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSERNajJlZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRE1rRHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRE1rRU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hETWtFZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSERNa0QtZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSERNa0RPZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iVHJlZSIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IRE1rRGVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstNzY4LCAtMzE4LCA5Nzg5LCAzOTk1XSRbLTkzOTMsIC0zODM2LCAxMTY0LCA0NzddIi8+DQotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRE1rRXVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hETWtFLWZYRWR1cUhvT0piVVJaUnciIGlkPSIoMC44ODU5MDQ0MywwLjU3NzExOTUpIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hETWtKT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjk0RUM0QTAzMDYiIHNvdXJjZT0iX0hERGFKdWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hETWtGT2ZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERNa0otZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERNa0tlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRE1rS3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hETWtLT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hETWtKZWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjEyNjMyMjU2IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IRE1rSnVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMjYsIC01NTUsIDAsIDE1ODhdJFstMjYsIC0xODI1LCAwLCAzMThdIi8+DQotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRE1rSy1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hETWtMT2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il84MjF3SU9vVkVkdU9CUFFBMmhLcVVRIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGNEExRDYwMjQ1IiBzb3VyY2U9Il84MjF3RU9vVkVkdU9CUFFBMmhLcVVRIiB0YXJnZXQ9Il9IRE1qMmVmWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iXzgyMXdJLW9WRWR1T0JQUUEyaEtxVVEiIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iXzgyMXdKZW9WRWR1T0JQUUEyaEtxVVEiIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfODIxd0p1b1ZFZHVPQlBRQTJoS3FVUSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iXzgyMXdKT29WRWR1T0JQUUEyaEtxVVEiIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iXzgyMXdJZW9WRWR1T0JQUUEyaEtxVVEiIHJvdXRpbmc9IlRyZWUiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfODIxd0l1b1ZFZHVPQlBRQTJoS3FVUSIgcG9pbnRzPSJbNzksIC0zMTcsIC0xMjQ0LCA1MjEzXSRbMTIxNywgLTUwNTMsIC0xMDYsIDQ3N10iLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgPC9jb250ZW50cz4NCi0gICAgICAgICAgPC9lQW5ub3RhdGlvbnM+DQotICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3BIMnktZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDE5MCI+DQotICAgICAgICAgICAgPGJvZHk+MDM8L2JvZHk+DQotICAgICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgICA8cGFja2FnZU1lcmdlIHhtaTppZD0iX04xOWxjT3hNRWR1T05yTVJnbXo0OEEiIG1lcmdlZFBhY2thZ2U9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyOTQiLz4NCi0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxOTkiIG5hbWU9IkNvbmNlcHQiPg0KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3BSbnh1ZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDE5OSI+DQotICAgICAgICAgICAgICA8Ym9keT5BIENvbmNlcHQgaXMgYSBzcGVjaWZpYyB0eXBlIG9mIGd1aWRhbmNlIHRoYXQgb3V0bGluZXMga2V5IGlkZWFzIGFzc29jaWF0ZWQgd2l0aCBiYXNpYyBwcmluY2lwbGVzIHVuZGVybHlpbmcgdGhlIHJlZmVyZW5jZWQgaXRlbS4gQ29uY2VwdHMgbm9ybWFsbHkgYWRkcmVzcyBtb3JlIGdlbmVyYWwgdG9waWNzIHRoYW4gR3VpZGVsaW5lcyBhbmQgc3BhbiBhY3Jvc3Mgc2V2LWVyYWwgd29yayBwcm9kdWN0IGFuZC9vciB0YXNrcy9hY3Rpdml0aWVzLjwvYm9keT4NCi0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMDU2IiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMkRBIi8+DQotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDE5QSIgbmFtZT0iQ2hlY2tsaXN0Ij4NCi0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dwUm55dWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxOUEiPg0KLSAgICAgICAgICAgICAgPGJvZHk+QSBDaGVja2xpc3QgaXMgYSBzcGVjaWZpYyB0eXBlIG9mIGd1aWRhbmNlIHRoYXQgaWRlbnRpZmllcyBhIHNlcmllcyBvZiBpdGVtcyB0aGF0IG5lZWQgdG8gYmUgY29tcGxldGVkIG9yIHZlcmktZmllZC4gIENoZWNrbGlzdHMgYXJlIG9mdGVuIHVzZWQgaW4gcmV2aWV3cyBzdWNoIGFzIHdhbGt0aHJvdWdocyBvciBpbnNwZWN0aW9ucy4gPC9ib2R5Pg0KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAwNUUiIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyREEiLz4NCi0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMUEzIiBuYW1lPSJFeGFtcGxlIj4NCi0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dwUm56dWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxQTMiPg0KLSAgICAgICAgICAgICAgPGJvZHk+QW4gRXhhbXBsZSBpcyBhIHNwZWNpZmljIHR5cGUgb2YgR3VpZGFuY2UgdGhhdCByZXByZXNlbnRzIGEgdHlwaWNhbCwgcGFydGlhbGx5IGNvbXBsZXRlZCwgc2FtcGxlIGluc3RhbmNlIG9mIG9uZSBvciBtb3JlIHdvcmsgcHJvZHVjdHMgb3Igc2NlbmFyaW8gbGlrZSBkZXNjcmlwdGlvbnMgb2YgaG93IFRhc2sgbWF5IGJlIHBlcmZvcm1lZC4gRXhhbXBsZXMgY2FuIGJlIHJlbGF0ZWQgdG8gV29yayBQcm9kdWN0cyBhcyB3ZWxsIGFzIFRhc2tzIHRoYXQgcHJvZHVjZSB0aGVtIGFzIHdlbGwgYXMgYW55IG90aGVyIENvbnRlbnQgRWxlbWVudC48L2JvZHk+DQotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDA1RiIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDJEQSIvPg0KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxQTQiIG5hbWU9Ikd1aWRlbGluZSI+DQotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HcFJuMHVmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMUE0Ij4NCi0gICAgICAgICAgICAgIDxib2R5PkEgR3VpZGVsaW5lIGlzIGEgc3BlY2lmaWMgdHlwZSBvZiBndWlkYW5jZSB0aGF0IHByb3ZpZGVzIGFkZGl0aW9uYWwgZGV0YWlsIG9uIGhvdyB0byBwZXJmb3JtIGEgcGFydGljdWxhciB0YXNrIG9yIGdyb3VwaW5nIG9mIHRhc2tzIChlLmcuIGdyb3VwZWQgdG9nZXRoZXIgYXMgYWN0aXZpdGllcykgb3IgdGhhdCBwcm92aWRlcyBhZGRpdGlvbmFsIGRldGFpbCwgcnVsZXMsIGFuZCByZWNvbW1lbmRhdGlvbnMgb24gd29yayBwcm9kdWN0cyBhbmQgdGhlaXIgcHJvcGVydGllcy4gIEFtb25nc3Qgb3RoZXJzLCBpdCBjYW4gaW5jbHVkZSBkZXRhaWxzIGFib3V0IGJlc3QgcHJhY3RpY2VzIGFuZCBkaWZmZXJlbnQgYXBwcm9hY2hlcyBmb3IgZG9pbmcgd29yaywgaG93IHRvIHVzZSBwYXJ0aWN1bGFyIHR5cGVzIG9mIHdvcmsgcHJvZHVjdHMsIGluZm9ybWF0aW9uIG9uIGRpZmZlcmVudCBzdWJ0eXBlcyBhbmQgdmFyaWFudHMgb2YgdGhlIHdvcmsgcHJvZHVjdCBhbmQgaG93IHRoZXkgZXZvbHZlIHRocm91Z2hvdXQgYSBsaWZlY3ljbGUsIGRpc2N1c3Npb25zIG9uIHNraWxscyB0aGUgcGVyZm9ybWluZyByb2xlcyBzaG91bGQgYWNxdWlyZSBvciBpbXByb3ZlIHVwb24sIG1lYXN1cmVtZW50cyBmb3IgcHJvZ3Jlc3MgYW5kIG1hdHVyaXR5LCBldGMuPC9ib2R5Pg0KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MURGNDY3QjAyNUQiIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyREEiLz4NCi0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMUI3IiBuYW1lPSJSZXBvcnQiPg0KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3BheHMtZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDFCNyI+DQotICAgICAgICAgICAgICA8Ym9keT5BIFJlcG9ydCBpcyBhIHByZWRlZmluZWQgdGVtcGxhdGUgb2YgYSByZXN1bHQgdGhhdCBpcyBnZW5lcmF0ZWQgb24gdGhlIGJhc2lzIG9mIG90aGVyIHdvcmsgcHJvZHVjdHMgYXMgYW4gb3V0cHV0IGZyb20gc29tZSBmb3JtIG9mIHRvb2wgYXV0b21hdGlvbi4gQW4gZXhhbXBsZSBmb3IgYSByZXBvcnQgd291bGQgYmUgYSB1c2UgY2FzZSBtb2RlbCBzdXJ2ZXksIHdoaWNoIGlzIGdlbmVyYXRlZCBieSBleHRyYWN0aW5nIGRpYWdyYW0gaW5mb3JtYXRpb24gZnJvbSBhIGdyYXBoaWNhbCBtb2RlbCBhbmQgdGV4dHVhbCBpbmZvcm1hdGlvbiBmcm9tIGRvY3VtZW50cyBhbmQgY29tYmluZXMgdGhlc2UgdHdvIHR5cGVzIG9mIGluZm9ybWF0aW9uIGludG8gYSByZXBvcnQuPC9ib2R5Pg0KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAwOTAiIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyREEiLz4NCi0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMUI4IiBuYW1lPSJUZW1wbGF0ZSI+DQotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HcGF4dC1mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMUI4Ij4NCi0gICAgICAgICAgICAgIDxib2R5PkEgVGVtcGxhdGUgaXMgYSBzcGVjaWZpYyB0eXBlIG9mIGd1aWRhbmNlIHRoYXQgcHJvdmlkZXMgZm9yIGEgd29yayBwcm9kdWN0IGEgcHJlLWRlZmluZWQgdGFibGUgb2YgY29udGVudHMsIHNlY3Rpb25zLCBwYWNrYWdlcywgYW5kL29yIGhlYWRpbmdzLCBhIHN0YW5kYXJkaXplZCBmb3JtYXQsIGFzIHdlbGwgYXMgZGVzY3JpcHRpb25zIGhvdyB0aGUgc2VjdGlvbnMgYW5kIHBhY2thZ2VzIGFyZSBzdXBwb3NlZCB0byBiZSB1c2VkIGFuZCBjb21wbGV0ZWQuIFRlbXBsYXRlcyBjYW5ub3Qgb25seSBiZSBwcm92aWRlZCBmb3IgZG9jdW1lbnRzLCBidXQgYWxzbyBmb3IgY29uY2VwdHVhbCBtb2RlbHMgb3IgcGh5c2ljYWwgZGF0YSBzdG9yZXMuPC9ib2R5Pg0KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAwOTEiIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyREEiLz4NCi0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMUMxIiBuYW1lPSJTdXBwb3J0aW5nTWF0ZXJpYWwiPg0KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3BheHUtZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDFDMSI+DQotICAgICAgICAgICAgICA8Ym9keT5TdXBwb3J0aW5nIE1hdGVyaWFscyBpcyBjYXRjaGFsbCBmb3Igb3RoZXIgdHlwZXMgb2YgZ3VpZGFuY2Ugbm90IHNwZWNpZmljYWxseSBkZWZpbmVkIGVsc2V3aGVyZS4gSXQgY2FuIGJlIHJlbGF0ZWQgdG8gYWxsIGtpbmRzIG9mIENvbnRlbnQgRWxlbWVudHMsIGkuZS4gaW5jbHVkaW5nIG90aGVyIGd1aWRhbmNlIGVsZW1lbnRzLjwvYm9keT4NCi0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDFERjQ2NkYwMTE5IiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMkRBIi8+DQotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDFDQiIgbmFtZT0iVG9vbE1lbnRvciI+DQotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HcGF4di1mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMUNCIj4NCi0gICAgICAgICAgICAgIDxib2R5PkEgVG9vbCBNZW50b3IgaXMgYSBzcGVjaWZpYyB0eXBlIG9mIGd1aWRhbmNlIHRoYXQgc2hvd3MgaG93IHRvIHVzZSBhIHNwZWNpZmljIHRvb2wgdG8gYWNjb21wbGlzaCBzb21lIHBpZWNlIG9mIHdvcmsgYSBXb3JrIFByb2R1Y3QgZWl0aGVyIGluIHRoZSBjb250ZXh0IG9mIG9yIGluZGVwZW5kZW50IGZyb20gYSBUYXNrIG9yIEFjdGl2aXR5LjwvYm9keT4NCi0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMDlCIiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMkRBIi8+DQotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDFFMCIgbmFtZT0iV2hpdGVwYXBlciI+DQotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HcGF4dy1mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMUUwIj4NCi0gICAgICAgICAgICAgIDxib2R5PldoaXRlcGFwZXJzIGFyZSBhIHNwZWNpYWwgQ29uY2VwdCBndWlkYW5jZSB0aGF0IGhhdmUgYmVlbiBleHRlcm5hbGx5IHJldmlld2VkIG9yIHB1Ymxpc2hlZCBhbmQgY2FuIGJlIHJlYWQgYW5kIHVuZGVyc3Rvb2QgaW4gaXNvbGF0aW9uIG9mIG90aGVyIGNvbnRlbnQgZWxlbWVudHMgYW5kIGd1aWRhbmNlLjwvYm9keT4NCi0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMEIwIiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMTk5Ii8+DQotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDFGMyIgbmFtZT0iVGVybURlZmluaXRpb24iPg0KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3BraXMtZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDFGMyI+DQotICAgICAgICAgICAgICA8Ym9keT5UZXJtRGVmaW5pdGlvbnMgZGVmaW5lIGNvbmNlcHRzIGFuZCBhcmUgdXNlZCB0byBidWlsZCB1cCB0aGUgR2xvc3NhcnkuIFRoZXkgYXJlIG5vdCBkaXJlY3RseSByZWxhdGVkIHRvIENvbnRlbnRFbGVtZW50cywgYnV0IHRoZWlyIHJlbGF0aW9uc2hpcCBpcyBiZWluZyBkZXJpdmVkIHdoZW4gdGhlIFRlcm0gaXMgdXNlZCBpbiB0aGUgQ29udGVudEVsZW1lbnRzIGRlc2NyaXB0aW9uIHRleHQuPC9ib2R5Pg0KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEY0RDJBQjAzQ0EiIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyREEiLz4NCi0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGRDRFQjQwMkJCIiBuYW1lPSJQcmFjdGljZSI+DQotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HcGtpdC1mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGRDRFQjQwMkJCIj4NCi0gICAgICAgICAgICAgIDxib2R5PkEgUHJhY3RpY2UgcmVwcmVzZW50cyBhIHByb3ZlbiB3YXkgb3Igc3RyYXRlZ3kgb2YgZG9pbmcgd29yayB0byBhY2hpZXZlIGEgZ29hbCB0aGF0IGhhcyBhIHBvc2l0aXZlIGltcGFjdCBvbiB3b3JrIHByb2R1Y3Qgb3IgcHJvY2VzcyBxdWFsaXR5LiAgUHJhY3RpY2VzIGFyZSBkZWZpbmVkIG9ydGhvZ29uYWwgdG8gbWV0aG9kcyBhbmQgcHJvY2Vzc2VzLiAgVGhleSBjb3VsZCBzdW1tYXJpemUgYXNwZWN0cyB0aGF0IGltcGFjdCBtYW55IGRpZmZlcmVudCBwYXJ0cyBvZiBhIG1ldGhvZCBvciBzcGVjaWZpYyBwcm9jZXNzZXMuICBFeGFtcGxlcyBmb3IgcHJhY3RpY2VzIHdvdWxkIGJlICZxdW90O01hbmFnZSBSaXNrcyZxdW90OywgJnF1b3Q7Q29udGludW91c2x5IHZlcmlmeSBxdWFsaXR5JnF1b3Q7LCAmcXVvdDtBcmNoaXRlY3R1cmUtY2VudHJpYyBhbmQgY29tcG9uZW50LWJhc2VkIGRldmVsb3BtZW50JnF1b3Q7LCBldGMuDQotPC9ib2R5Pg0KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MURGNDY3MzAwNTUiIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyREEiLz4NCi0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGRDU4QjUwMzcwIiBuYW1lPSJzdWJQcmFjdGljZXMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRkQ0RUI0MDJCQiIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MEZENThCNDAyMzYiPg0KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3FLWXBlZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4NCi0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0dxS1lwT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MURGNDFDNjAzQTEiIG5hbWU9ImNvbnRlbnRSZWZlcmVuY2VzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MURGNDFBNTAxQjYiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDFERjQxQzYwM0EwIj4NCi0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0dxVUprLWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+DQotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HcVVKa3VmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDFERTVENDcwMEZCIiBuYW1lPSJXb3JrUHJvZHVjdCIgaXNBYnN0cmFjdD0idHJ1ZSI+DQotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HcGtpdS1mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERTVENDcwMEZCIj4NCi0gICAgICAgICAgICAgIDxib2R5PlRoaXMgaXMgdGhlIEd1aWRhbmNlIFR5cGVzIHBhY2thZ2UncyBleHRlbnNpb24gb2YgV29yayBQcm9kdWN0IChkZWZpbmVkIGluIENvbnRlbnQgRWxlbWVudHMpIHByb3ZpZGluZyBhZGRpdG9uYWwgYXNzb2NpYXRpb25zLjwvYm9keT4NCi0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDFERTVFNDQwM0UzIiBuYW1lPSJyZXBvcnRzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxQjciIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDFERTVFNDQwM0UxIj4NCi0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0dxQk9yLWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+DQotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HcUJPcnVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDFERTVFNjEwMkNFIiBuYW1lPSJ0ZW1wbGF0ZXMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDFCOCIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MURFNUU2MTAyQ0MiPg0KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3FLWWx1ZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4NCi0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0dxS1lsZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MjdBQkM4OTAzN0MiIG5hbWU9InRvb2xNZW50b3JzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxQ0IiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDI3QUJDODgwMkQwIj4NCi0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0dxVUpvLWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+DQotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HcVVKb3VmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDREOEY1MTgwMEY3IiBuYW1lPSJlc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDFENSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0NEQ4RjUxODAwRjUiPg0KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3FVSnRPZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4NCi0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0dxVUpzLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MURFNUVFMTAxMTEiIG5hbWU9IlRhc2siPg0KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3BraXYtZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREU1RUUxMDExMSI+DQotICAgICAgICAgICAgICA8Ym9keT5UaGlzIGlzIHRoZSBHdWlkYW5jZSBUeXBlcyBwYWNrYWdlJ3MgZXh0ZW5zaW9uIG9mIFRhc2sgKGRlZmluZWQgaW4gQ29udGVudCBFbGVtZW50cykgcHJvdmlkaW5nIGFkZGl0aW9uYWwgYXNzb2NpYXRpb25zLjwvYm9keT4NCi0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDFERTVGRjcwMzA2IiBuYW1lPSJ0b29sTWVudG9ycyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMUNCIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQxREU1RkY3MDMwNCI+DQotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HcUtZbi1mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3FLWW51ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQ0RDhGNTE0MDIyOCIgbmFtZT0iZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxRDUiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDREOEY1MTQwMjI2Ij4NCi0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0dxVUpyZWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+DQotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HcVVKck9mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDFERjQxQTUwMUI2IiBuYW1lPSJDb250ZW50RWxlbWVudCIgaXNBYnN0cmFjdD0idHJ1ZSI+DQotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HcHVUcy1mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERjQxQTUwMUI2Ij4NCi0gICAgICAgICAgICAgIDxib2R5PlRoaXMgaXMgdGhlIEd1aWRhbmNlIFR5cGVzIHBhY2thZ2UncyBleHRlbnNpb24gb2YgQ29udGVudCBFbGVtZW50IChkZWZpbmVkIGluIENvbnRlbnQgRWxlbWVudHMpIHByb3ZpZGluZyBhZGRpdG9uYWwgYXNzb2NpYXRpb25zLjwvYm9keT4NCi0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMjczIiBuYW1lPSJzdXBwb3J0aW5nTWF0ZXJpYWxzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxQzEiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMjcwIj4NCi0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0dwM2RxT2ZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+DQotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HcDNkcC1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMjkxIiBuYW1lPSJjb25jZXB0c0FuZFBhcGVycyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMTk5IiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDI4RSI+DQotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HcDNkc2VmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3AzZHNPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxREU1RDczMDIxMCIgbmFtZT0iY2hlY2tsaXN0cyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMTlBIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQxREU1RDczMDIwRSI+DQotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HcDNkdXVmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3AzZHVlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxREU1REQ3MDE0RSIgbmFtZT0iZ3VpZGVsaW5lcyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMUE0IiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQxREU1REQ3MDE0QyI+DQotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HcUJPcHVmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3FCT3BlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxREU1RTU1MDBDNyIgbmFtZT0iZXhhbXBsZXMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDFBMyIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MURFNUU1NTAwQzUiPg0KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3FCT3VPZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4NCi0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0dxQk90LWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MjEzQzkzRjAwNDkiIG5hbWU9ImFzc2V0cyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDIxM0M5MTMwMkM1IiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQyMTNDOTNEMDMyMSI+DQotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HcVVKbk9mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3FVSm0tZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1lMWhBTzBvRWR1dENMRUNOOTZCTnciIG5hbWU9InRlcm1kZWZpbml0aW9uIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxRjMiIGFzc29jaWF0aW9uPSJfLWQ4d01PMG9FZHV0Q0xFQ045NkJOdyI+DQotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il8tZ0J6MGUwb0VkdXRDTEVDTjk2Qk53IiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfLWdCejBPMG9FZHV0Q0xFQ045NkJOdyIvPg0KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyMTNDOTEzMDJDNSIgbmFtZT0iUmV1c2FibGVBc3NldCI+DQotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HcHVUdS1mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxM0M5MTMwMkM1Ij4NCi0gICAgICAgICAgICAgIDxib2R5PkEgUmV1c2FibGUgQXNzZXQgcHJvdmlkZXMgYSBzb2x1dGlvbiB0byBhIHByb2JsZW0gZm9yIGEgZ2l2ZW4gY29udGV4dC4gVGhlIGFzc2V0IG1heSBoYXZlIGEgdmFyaWFiaWxpdHkgcG9pbnQsIHdoaWNoIGlzIGEgbG9jYXRpb24gaW4gdGhlIGFzc2V0IHRoYXQgbWF5IGhhdmUgYSB2YWx1ZSBwcm92aWRlZCBvciBjdXN0b21pemVkIGJ5IHRoZSBhc3NldCBjb25zdW1lci4gVGhlIGFzc2V0IGhhcyBydWxlcyBmb3IgdXNhZ2Ugd2hpY2ggYXJlIHRoZSBpbnN0cnVjdGlvbnMgZGVzY3JpYmluZw0KLWhvdyB0aGUgYXNzZXQgc2hvdWxkIGJlIHVzZWQuDQotPC9ib2R5Pg0KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MjJGQTBDMzAwN0MiIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyREEiLz4NCi0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMUQ1IiBuYW1lPSJFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMiPg0KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3B1VHYtZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDFENSI+DQotICAgICAgICAgICAgICA8Ym9keT5Fc3RpbWF0aW9uIENvbnNpZGVyYXRpb25zIHF1YWxpZnkgdGhlIHVzYWdlIGFuZCBhcHBsaWNhdGlvbiBvZiBlc3RpbWF0aW9uIG1ldHJpY3MgaW4gdGhlIGRldmVsb3BtZW50IG9mIGFuIGFjdHVhbCBlc3RpbWF0ZS48L2JvZHk+DQotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjRBMUQ2MDI0NSIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDJEQSIvPg0KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAyNzAiIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDI3MSBfM0FEQzdCNzQwMjJENDBGMzZDOTIwMjczIj4NCi0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dwM2RvZWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAyNzAiPg0KLSAgICAgICAgICAgICAgPGJvZHk+Q29udGVudCBFbGVtZW50cyBjYW4gYmUgcmVsYXRlZCB0byBhbnkgbnVtYmVyIG9mIFN1cHBvcnRpbmcgTWF0ZXJpYWwgZ3VpZGFuY2UgZWxlbWVudHMuPC9ib2R5Pg0KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAyNzEiIG5hbWU9Il9jb250ZW50RWxlbWVudCIgdmlzaWJpbGl0eT0icHJpdmF0ZSIgdHlwZT0iXzNBREM3Qjc0MDIyRDQxREY0MUE1MDFCNiIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDI3MCI+DQotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HcDNkcGVmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3AzZHBPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgIDwvb3duZWRFbmQ+DQotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDI4RSIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMjhGIF8zQURDN0I3NDAyMkQ0MEYzNkM5MjAyOTEiPg0KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3AzZHF1ZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDI4RSI+DQotICAgICAgICAgICAgICA8Ym9keT5Db250ZW50IEVsZW1lbnRzIGNhbiByZWZlciB0byBhbnkgbnVtYmVyIG9mIENvbmNlcHQgZ3VpZGFuY2UuIDwvYm9keT4NCi0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgICAgICA8b3duZWRFbmQgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMjhGIiBuYW1lPSJfY29udGVudEVsZW1lbnQiIHZpc2liaWxpdHk9InByaXZhdGUiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MURGNDFBNTAxQjYiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAyOEUiPg0KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3AzZHJ1ZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4NCi0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0dwM2RyZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICA8L293bmVkRW5kPg0KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MURFNUQ3MzAyMEUiIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQxREU1RDczMDIwRiBfM0FEQzdCNzQwMjJENDFERTVENzMwMjEwIj4NCi0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dwM2RzLWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURFNUQ3MzAyMEUiPg0KLSAgICAgICAgICAgICAgPGJvZHk+UHJvdmlkZXMgY2hlY2sgcG9pbnRzIHJlbGF0ZWQgdG8gYSBwYXJ0aWN1bGFyIGNvbnRlbnQgZWxlbWVudHMuICBUaGVzZSBhcmUgdHlwaWNhbGx5IHVzZWQgaW4gcmV2aWV3cyBhbmQgaW5zcGVjdGlvbnMgb24gd29yayBwcm9kdWN0cy4NCi0NCi08L2JvZHk+DQotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxREU1RDczMDIwRiIgbmFtZT0iX2NvbnRlbnRFbGVtZW50IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MURGNDFBNTAxQjYiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MURFNUQ3MzAyMEUiPg0KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3AzZHQtZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4NCi0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0dwM2R0dWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICA8L293bmVkRW5kPg0KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MURFNURENzAxNEMiIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQxREU1REQ3MDE0RCBfM0FEQzdCNzQwMjJENDFERTVERDcwMTRFIj4NCi0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dwM2R2T2ZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURFNURENzAxNEMiPg0KLSAgICAgICAgICAgICAgPGJvZHk+VGhpcyBhc3NvY2lhdGlvbiBwcm92aWRlcyBhY2Nlc3MgdG8gZGV0YWlsZWQgR3VpZGVsaW5lcyByZWxhdGVkIHRvIHRoaXMgQ29udGVudCBFbGVtZW50LjwvYm9keT4NCi0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgICAgICA8b3duZWRFbmQgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDFERTVERDcwMTREIiBuYW1lPSJfY29udGVudEVsZW1lbnQiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQxREY0MUE1MDFCNiIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQxREU1REQ3MDE0QyI+DQotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HcUJPby1mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3FCT291ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgIDwvb3duZWRFbmQ+DQotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxREU1RTQ0MDNFMSIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDFERTVFNDQwM0UyIF8zQURDN0I3NDAyMkQ0MURFNUU0NDAzRTMiPg0KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3FCT3FPZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREU1RTQ0MDNFMSI+DQotICAgICAgICAgICAgICA8Ym9keT5BIFJlcG9ydCBleHRyYWN0cyBpbmZvcm1hdGlvbiBhYm91dCBvbmUgb3IgbW9yZSBXb3JrIFByb2R1Y3Q7IG5vcm1hbGx5IGRpcmVjdGx5IGZyb20gYSB0b29sIHRoYXQgbWFpbnRhaW5zIHRoZSBXb3JrIFByb2R1Y3RzLiBGb3IgZXhhbXBsZSwgYSBSZXBvcnQgY2FuIHByZXNlbnQgZGV0YWlscyBvZiBhbiBBcnRpZmFjdCBvciBhIHNldCBvZiBBcnRpZmFjdHMgZm9yIHVzZSBpbiBhIHRlY2huaWNhbCByZXZpZXcuIDwvYm9keT4NCi0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgICAgICA8b3duZWRFbmQgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDFERTVFNDQwM0UyIiBuYW1lPSJfd29ya1Byb2R1Y3QiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQxREU1RDQ3MDBGQiIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQxREU1RTQ0MDNFMSI+DQotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HcUJPck9mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3FCT3EtZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgIDwvb3duZWRFbmQ+DQotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxREU1RTU1MDBDNSIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDFERTVFNTUwMEM2IF8zQURDN0I3NDAyMkQ0MURFNUU1NTAwQzciPg0KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3FCT3NlZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREU1RTU1MDBDNSI+DQotICAgICAgICAgICAgICA8Ym9keT5Qcm92aWRlcyBhIHNhbXBsZSBvZiB3aGF0IHRoZSB3b3JrIHByb2R1Y3QgbWF5IGxvb2sgbGlrZSwgYW4gYWN0dWFsIGluc3RhbmNlLjwvYm9keT4NCi0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgICAgICA8b3duZWRFbmQgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDFERTVFNTUwMEM2IiBuYW1lPSJfY29udGVudEVsZW1lbnQiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQxREY0MUE1MDFCNiIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQxREU1RTU1MDBDNSI+DQotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HcUJPdGVmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3FCT3RPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgIDwvb3duZWRFbmQ+DQotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxREU1RTYxMDJDQyIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDFERTVFNjEwMkNEIF8zQURDN0I3NDAyMkQ0MURFNUU2MTAyQ0UiPg0KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3FCT3V1ZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREU1RTYxMDJDQyI+DQotICAgICAgICAgICAgICA8Ym9keT5Qcm92aWRlcyBkZXRhaWxlZCBndWlkYW5jZSBvbiBob3cgdG8gcHJvZHVjZSB0aGUgd29yayBwcm9kdWN0IGluZGVwZW5kZW50IG9mIGEgc3BlY2lmaWMgc2V0IG9mIHRhc2tzIG9yIFdCUy4gIE1heSBjb250YWluIHNwZWNpZmljIGFsZ29yaXRobXMgb3IgYWx0ZXJuYXRpdmUgZGV2ZWxvcG1lbnQgYXBwcm9hY2hlcy48L2JvZHk+DQotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxREU1RTYxMDJDRCIgbmFtZT0iX3dvcmtQcm9kdWN0IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MURFNUQ0NzAwRkIiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MURFNUU2MTAyQ0MiPg0KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3FLWWstZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4NCi0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0dxS1lrdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICA8L293bmVkRW5kPg0KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MURFNUZGNzAzMDQiIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQxREU1RkY3MDMwNSBfM0FEQzdCNzQwMjJENDFERTVGRjcwMzA2Ij4NCi0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dxS1ltT2ZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURFNUZGNzAzMDQiPg0KLSAgICAgICAgICAgICAgPGJvZHk+TGlua3MgVGFza3Mgd2l0aCBUb29sIE1lbnRvcnMgd2hpY2ggYXJlIGEgc3BlY2lmaWMgdHlwZSBvZiBndWlkYW5jZSB0aGF0IHNob3cgaG93IHRvIHVzZSBhIHNwZWNpZmljIHRvb2wgdG8gcGVyZm9ybSB0aGUgVGFzay48L2JvZHk+DQotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxREU1RkY3MDMwNSIgbmFtZT0iX3Rhc2siIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQxREU1RUUxMDExMSIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQxREU1RkY3MDMwNCI+DQotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HcUtZbk9mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3FLWW0tZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgIDwvb3duZWRFbmQ+DQotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRkQ1OEI0MDIzNiIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDBGRDU4QjUwMzcwIF8zQURDN0I3NDAyMkQ0MEZENThCNTAzN0EiPg0KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3FLWW9lZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRkQ1OEI0MDIzNiI+DQotICAgICAgICAgICAgICA8Ym9keT5BIFByYWN0aWNlIGNhbiBiZSBjb21wb3NlZCBvZiBvdGhlciBQcmFjdGljZXMuPC9ib2R5Pg0KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEZENThCNTAzN0EiIG5hbWU9Il9wcmFjdGljZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGRDRFQjQwMkJCIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDBGRDU4QjQwMjM2Ii8+DQotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxREY0MUM2MDNBMCIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDFERjQxQzYwM0ExIF8zQURDN0I3NDAyMkQ0MURGNDFDNjAzQTIiPg0KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3FLWXFPZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREY0MUM2MDNBMCI+DQotICAgICAgICAgICAgICA8Ym9keT5BIFByYWN0aWNlIGNhbiByZWZlcmVuY2UgYW55IENvbnRlbnQgRWxlbWVudC4gIFRoZSBhc3NvY2lhdGlvbiBleHByZXNzZXMgdGhhdCB0aGlzIENvbnRlbnQgRWxlbWVudCBpcyBwYXJ0IG9mIG9yIGJlbG9uZ3MgdG8gdGhpcyBQcmFjdGljZS48L2JvZHk+DQotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxREY0MUM2MDNBMiIgbmFtZT0iX3ByYWN0aWNlIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEZENEVCNDAyQkIiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MURGNDFDNjAzQTAiPg0KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3FVSmx1ZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4NCi0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0dxVUpsZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICA8L293bmVkRW5kPg0KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MjEzQzkzRDAzMjEiIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQyMTNDOTNGMDA0OSBfM0FEQzdCNzQwMjJENDIxM0M5M0YwMDk5Ij4NCi0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dxVUptT2ZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjEzQzkzRDAzMjEiPg0KLSAgICAgICAgICAgICAgPGJvZHk+QSB3b3JrIHByb2R1Y3QgaXMgcmVsYXRlZCB0byBvbmUgb3IgbW9yZSBhc3NldHMgdG8gPC9ib2R5Pg0KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MjEzQzkzRjAwOTkiIG5hbWU9Il9jb250ZW50RWxlbWVudCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDFERjQxQTUwMUI2IiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDIxM0M5M0QwMzIxIj4NCi0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0dxVUpuLWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+DQotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HcVVKbnVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgPC9vd25lZEVuZD4NCi0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDI3QUJDODgwMkQwIiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0MjdBQkM4OTAzN0MgXzNBREM3Qjc0MDIyRDQyN0FCQzg5MDM3RSI+DQotICAgICAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyN0FCQzg5MDM3RSIgbmFtZT0iX3dvcmtQcm9kdWN0IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MURFNUQ0NzAwRkIiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MjdBQkM4ODAyRDAiPg0KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3FVSnB1ZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4NCi0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0dxVUpwZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICA8L293bmVkRW5kPg0KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0NEQ4RjUxNDAyMjYiIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQ0RDhGNTE0MDIyNyBfM0FEQzdCNzQwMjJENDREOEY1MTQwMjI4Ij4NCi0gICAgICAgICAgICA8b3duZWRFbmQgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDREOEY1MTQwMjI3IiBuYW1lPSJfdGFzayIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDFERTVFRTEwMTExIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDREOEY1MTQwMjI2Ij4NCi0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0dxVUpxdWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+DQotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HcVVKcWVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgPC9vd25lZEVuZD4NCi0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDREOEY1MTgwMEY1IiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0NEQ4RjUxODAwRjYgXzNBREM3Qjc0MDIyRDQ0RDhGNTE4MDBGNyI+DQotICAgICAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQ0RDhGNTE4MDBGNiIgbmFtZT0iX3dvcmtQcm9kdWN0IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MURFNUQ0NzAwRkIiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0NEQ4RjUxODAwRjUiPg0KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3FVSnNlZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4NCi0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0dxVUpzT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICA8L293bmVkRW5kPg0KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8tZDh3TU8wb0VkdXRDTEVDTjk2Qk53IiBtZW1iZXJFbmQ9Il8tZTFoQU8wb0VkdXRDTEVDTjk2Qk53IF8tZ0J6MHUwb0VkdXRDTEVDTjk2Qk53Ij4NCi0gICAgICAgICAgICA8b3duZWRFbmQgeG1pOmlkPSJfLWdCejB1MG9FZHV0Q0xFQ045NkJOdyIgbmFtZT0iIiB2aXNpYmlsaXR5PSJwcml2YXRlIiB0eXBlPSJfM0FEQzdCNzQwMjJENDFERjQxQTUwMUI2IiBhc3NvY2lhdGlvbj0iXy1kOHdNTzBvRWR1dENMRUNOOTZCTnciPg0KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfLWdCejFPMG9FZHV0Q0xFQ045NkJOdyIgdmFsdWU9IioiLz4NCi0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iXy1nQnowLTBvRWR1dENMRUNOOTZCTnciLz4NCi0gICAgICAgICAgICA8L293bmVkRW5kPg0KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOlBhY2thZ2UiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDIyNSIgbmFtZT0iQ2F0ZWdvcmllcyI+DQotICAgICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfR3JnY2MtZlhFZHVxSG9PSmJVUlpSdyIgc291cmNlPSJ1bWwyLmRpYWdyYW1zIiByZWZlcmVuY2VzPSJfM0FEQzdCNzQwMjJENDBGNDhGQ0UwMDYwIj4NCi0gICAgICAgICAgICA8Y29udGVudHMgeG1pOnR5cGU9Im5vdGF0aW9uOkRpYWdyYW0iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjQ4RkNFMDA2MCIgdHlwZT0iQ2xhc3MiIG5hbWU9IkNhdGVnb3JpemF0aW9ucyI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERXVXNPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI1OSI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRFdVcy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSERXVXRPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERXVXRlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERXVXR1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERXVXQtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRFdVdU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRFdVdWVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRFdVdXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRFdVdS1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRFdVdk9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRFdVdmVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRFdVdnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSERXVXYtZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IRFdVc2VmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRFdVc3VmWEVkdXFIb09KYlVSWlJ3IiB4PSIxNTYxMiIgeT0iOTg4MCIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRFdVd09mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjk2Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEV1V3LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IRFdVeE9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iNDAxMyIgaGVpZ2h0PSIxMTE3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRFdVeGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRFdVeHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRFdVeC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEV1V5T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hEV1V5ZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEV1V5dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hEV1V5LWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEV1V6T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hEV1V6ZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEV1V6dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRFdVei1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hEV1V3ZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjEyNjMyMjU2IiBzaG93UGFyZW50PSJOYW1lIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRFdVd3VmWEVkdXFIb09KYlVSWlJ3IiB4PSIyMDI5NCIgeT0iMTM0MTEiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERXVTBPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDIzMCI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRGdGb09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSERnRm9lZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERnRm91ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERnRm8tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERnRnBPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRGdGcGVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRGdGcHVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRGdGcC1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRGdGcU9mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRGdGcWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRGdGcXVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRGdGcS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSERnRnJPZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IRFdVMGVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRFdVMHVmWEVkdXFIb09KYlVSWlJ3IiB4PSIyMTE5MiIgeT0iOTkzMSIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRGdGOC1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjMxIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEZ0Y5dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IRGdGOS1mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRGdGLU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRGdGLWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRGdGLXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEZ0YtLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hEZ0ZfT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEZ0ZfZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hEZ0ZfdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEZ0ZfLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hEZ0dBT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEZ0dBZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRGdHQXVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hEZ0Y5T2ZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hEZ0Y5ZWZYRWR1cUhvT0piVVJaUnciIHg9IjI2MjcyIiB5PSI5OTMxIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEZ0dKdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyQkMiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERnR0tlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hEZ0dLdWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSI0NDcwIiBoZWlnaHQ9IjExMTciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEZ0dLLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEZ0dMT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEZ0dMZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERnR0x1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSERnR0wtZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERnR01PZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSERnR01lZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERnR011ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSERnR00tZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERnR05PZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hEZ0dOZWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSERnR0otZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMTI2MzIyNTYiIHNob3dQYXJlbnQ9Ik5hbWUiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hEZ0dLT2ZYRWR1cUhvT0piVVJaUnciIHg9IjI3MTI3IiB5PSIxMzQxMSIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHBQbHVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjNBIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEcFBtZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IRHBQbXVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHBQbS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHBQbk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHBQbmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEcFBudWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hEcFBuLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEcFBvT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hEcFBvZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEcFBvdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hEcFBvLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEcFBwT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRHBQcGVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hEcFBsLWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hEcFBtT2ZYRWR1cUhvT0piVVJaUnciIHg9IjI5NzUxIiB5PSI5OTMxIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEcFB5ZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxQ0IiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERwUHpPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hEcFB6ZWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEcFB6dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEcFB6LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEcFAwT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERwUDBlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSERwUDB1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERwUDAtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSERwUDFPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERwUDFlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSERwUDF1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERwUDEtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hEcFAyT2ZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSERwUHl1ZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMTI2MzIyNTYiIHNob3dQYXJlbnQ9Ik5hbWUiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hEcFB5LWZYRWR1cUhvT0piVVJaUnciIHg9IjM0NDU5IiB5PSIxMzIzNSIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHBQMmVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjU4Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEcFAzT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IRHBQM2VmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHBQM3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHBQMy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHBQNE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEcFA0ZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hEcFA0dWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEcFA0LWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hEcFA1T2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEcFA1ZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hEcFA1dWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEcFA1LWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRHBQNk9mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hEcFAydWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hEcFAyLWZYRWR1cUhvT0piVVJaUnciIHg9IjM1NjYxIiB5PSI5OTMxIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEekFtdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyNDQiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSER6QW5lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hEekFudWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEekFuLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEekFvT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEekFvZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSER6QW91ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSER6QW8tZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSER6QXBPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSER6QXBlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSER6QXB1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSER6QXAtZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSER6QXFPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hEekFxZWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSER6QW0tZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9Ik5vbmUiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSER6QW5PZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTYzNzQiIHk9IjM5NDUiIHdpZHRoPSI0MjMzIiBoZWlnaHQ9IjIxNzUiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSER6QTRPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyOTRFQjkwMDBGQyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHpBNC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSER6QTVPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjM1NzIiIGhlaWdodD0iMTE2OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSER6QTVlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSER6QTV1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSER6QTUtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHpBNk9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRHpBNmVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHpBNnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRHpBNi1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHpBN09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRHpBN2VmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHpBN3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSER6QTctZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IRHpBNGVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIxMjYzMjI1NiIgc2hvd1BhcmVudD0iTmFtZSIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSER6QTR1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMzg4NTQiIHk9IjEzMzAxIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEekE4T2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUJERUJBMjAwOUMiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSER6QTgtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hEekE5T2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIzMDE0IiBoZWlnaHQ9Ijg5NyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSER6QTllZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSER6QTl1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSER6QTktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHpBLU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRHpBLWVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHpBLXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRHpBLS1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHpBX09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRHpBX2VmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHpBX3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSER6QV8tZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IRHpBOGVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRHpBOHVmWEVkdXFIb09KYlVSWlJ3IiB4PSIzODc3NyIgeT0iMTAwMTYiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEQ4eGxPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI0RSI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRDh4bC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEQ4eG1PZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEQ4eG1lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEQ4eG11ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEQ4eG0tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRDh4bk9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRDh4bmVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRDh4bnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRDh4bi1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRDh4b09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRDh4b2VmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRDh4b3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEQ4eG8tZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IRDh4bGVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRDh4bHVmWEVkdXFIb09KYlVSWlJ3IiB4PSIzNDAzIiB5PSI5OTMxIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEOHhyZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyOUUiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEQ4eHNPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hEOHhzZWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSI0MTgyIiBoZWlnaHQ9IjExMTciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEOHhzdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEOHhzLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEOHh0T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEQ4eHRlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEQ4eHR1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEQ4eHQtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEQ4eHVPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEQ4eHVlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEQ4eHV1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEQ4eHUtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hEOHh2T2ZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEQ4eHJ1ZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMTI2MzIyNTYiIHNob3dQYXJlbnQ9Ik5hbWUiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hEOHhyLWZYRWR1cUhvT0piVVJaUnciIHg9Ijk0NDgiIHk9IjEyNjY3Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEOHh2ZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyMjciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEQ4eHdPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hEOHh3ZWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEOHh3dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEOHh3LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEOHh4T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEQ4eHhlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEQ4eHh1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEQ4eHgtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEQ4eHlPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEQ4eHllZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEQ4eHl1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEQ4eHktZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hEOHh6T2ZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEQ4eHZ1ZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9Ik5vbmUiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEQ4eHYtZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTEwMDYiIHk9Ijk5MTQiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfOXViLUVPb2pFZHVWQTd2dDVxYklKUSIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI2QyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il85dWxJQU9vakVkdVZBN3Z0NXFiSUpRIiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfOXVsSUFlb2pFZHVWQTd2dDVxYklKUSIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfOXVsSUF1b2pFZHVWQTd2dDVxYklKUSIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfOXVsSUEtb2pFZHVWQTd2dDVxYklKUSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfOXVsSUJPb2pFZHVWQTd2dDVxYklKUSIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il85dWxJQmVvakVkdVZBN3Z0NXFiSUpRIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il85dWxJQnVvakVkdVZBN3Z0NXFiSUpRIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il85dWxJQi1vakVkdVZBN3Z0NXFiSUpRIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il85dWxJQ09vakVkdVZBN3Z0NXFiSUpRIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il85dWxJQ2VvakVkdVZBN3Z0NXFiSUpRIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il85dWxJQ3VvakVkdVZBN3Z0NXFiSUpRIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il85dWxJQy1vakVkdVZBN3Z0NXFiSUpRIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfOXVsSURPb2pFZHVWQTd2dDVxYklKUSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il85dWItRWVvakVkdVZBN3Z0NXFiSUpRIiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93UGFyZW50PSJOYW1lIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il85dWItRXVvakVkdVZBN3Z0NXFiSUpRIiB4PSIxNjgyNyIgeT0iMjA4OSIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTERpYWdyYW1TdHlsZSIgeG1pOmlkPSJfR3JnY2RlZlhFZHVxSG9PSmJVUlpSdyIgZGVzY3JpcHRpb249InxUaGUgQ2F0ZWdvcmllcyBwYWNrYWdlIGNvbnRhaW5zIGNsYXNzZXMgdGhhdCBwcm92aWRlIGRpZmZlcmVudCB3YXlzIHRvIGxvZ2ljYWxseSBjYXRlZ29yaXplIGNvbnRlbnQgZWxlbWVudHMuICBJbiBhZGRpdGlvbiB0byBzdGFuZGFyZCBjYXRlZ29yaWVzIHRoYXQgaGF2ZSBiZWVuIHByZWRlZmluZWQgZm9yIG1vc3QgY29udGVudCBlbGVtZW50IHR5cGVzIGluIHRoaXMgbWV0YS1tb2RlbCwgaXQgcHJvdmlkZXMgdGhlIGNhcGFiaWxpdHkgZm9yIHVzZXJzIHRvIGRlZmluZSB0aGVpciBvd24gY3VzdG9tIGNhdGVnb3JpZXMgb24gY29udGVudCBlbGVtZW50cy4gIEN1c3RvbSBjYXRlZ29yaWVzIGNhbiBiZSB1c2VkIHRvIGNhdGVnb3JpemUgY29udGVudCBiYXNlZCBvbiB0aGUgdXNlcidzIGNyaXRlcmlhIGFzIHdlbGwgYXMgdG8gZGVmaW5lIHdob2xlIHRyZWUtc3RydWN0dXJlcyBvZiBuZXN0ZWQgY2F0ZWdvcmllcyBhbGxvd2luZyB0aGUgdXNlciB0byBzeXN0ZW1hdGljYWxseSBuYXZpZ2F0ZSBhbmQgYnJvd3NlIG1ldGhvZCBjb250ZW50IGFuZCBwcm9jZXNzZXMgYmFzZWQgb24gdGhlc2UgY2F0ZWdvcmllcy4gIEZvciBleGFtcGxlLCBvbmUgY291bGQgY3JlYXRlIGEgY3VzdG9tIGNhdGVnb3J5IHRvIGxvZ2ljYWxseSBvcmdhbml6ZSBjb250ZW50IHJlbGV2YW50IGZvciB0aGUgdXNlcidzIGRldmVsb3BtZW50IG9yZ2FuaXphdGlvbiBkZXBhcnRtZW50czsgZS5nLiBhICZxdW90O1Rlc3RpbmcmcXVvdDsgY2F0ZWdvcnkgdGhhdCBncm91cHMgdG9nZXRoZXIgYWxsIHJvbGVzLCB3b3JrIHByb2R1Y3RzLCB0YXNrcywgYW5kIGd1aWRhbmNlIGVsZW1lbnQgcmVsZXZhbnQgdG8gdGVzdGluZy4gIEFub3RoZXIgZXhhbXBsZSB3b3VsZCBiZSBjYXRlZ29yaWVzIHRoYXQgZXhwcmVzcyBsaWNlbnNpbmcgbGV2ZWxzIG9mIHRoZSBjb250ZW50IGdyb3VwaW5nIGZyZWVseSBkaXN0cmlidXRhYmxlIG1ldGhvZCBjb250ZW50IHZlcnN1cyBjb250ZW50IHRoYXQgcmVwcmVzZW50IGludGVsbGVjdHVhbCBwcm9wZXJ0eSBhbmQgcmVxdWlyZXMgYSBsaWNlbnNlIHRvIGJlIHB1cmNoYXNlZCB0byBiZSBhYmxlIHRvIHVzZSBpdC4gVGhpcyBkaWFncmFtIHNob3dzIHRoZSB0YXhvbm9teSBvZiBhbGwgcHJlLWRlZmluZWQvc3RhbmRhcmQgY2F0ZWdvcnkgbWV0YS1jbGFzc2VzIGFzIHdlbGwgYXMgdGhlIGRlZmluaXRpb24gZm9yIEN1c3RvbSBDYXRlZ29yeSBjbGFzc2VzLCB3aGljaCBjYW4gYmUgZGVmaW5lZCBieSB0aGUgdXNlciB0byBjYXRlZ29yaXplcyBhbnkgQ29udGVudCBFbGVtZW50IGFzIHdlbGwgYXMgY2FuIGJlIG5lc3RlZCB3aXRoIG90aGVyIENhdGVnb3JpZXMgKGkuZS4gb3RoZXIgY2F0ZWdvcmllcyBjYW4gYmUgZGVmaW5lZCB0byBiZSBhIHN1Yi1jYXRlZ29yeSBvZiBhbnkgY3VzdG9tIGNhdGVnb3J5KS4mI3hBO3wmI3hBOyIvPg0KLSAgICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hEZ0ZyZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAyMTYiIHNvdXJjZT0iX0hEV1UwT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hEV1VzT2ZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERnRnNPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERnRnN1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRGdGcy1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hEZ0ZzZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEZ0Z0T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAyMTkiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRGdGdHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSERnRnRlZlhFZHVxSG9PSmJVUlpSdyIgeD0iMjAiIHk9Ii0yOTYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEZ0Z0LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMjE5Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERnRnVlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRGdGdU9mWEVkdXFIb09KYlVSWlJ3IiB4PSI0MDkiIHk9IjI3MiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERnRnV1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMjE3Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERnRnZPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSERnRnUtZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTg4IiB5PSItMjcwIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRGdGdmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMjE3Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERnRnYtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hEZ0Z2dWZYRWR1cUhvT0piVVJaUnciIHg9Ii03NDgiIHk9Ii01OTIiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEZ0Z3T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAyMTkiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRGdGd3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSERnRnctZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRGdGd2VmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRGdGeE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAyMTciPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRGdGeHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSERnRngtZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRGdGeGVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRGdGeU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDIxOSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEZ0Z5dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRGdGeS1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hEZ0Z5ZWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEZ0Z6T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAyMTciPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRGdGenVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRGdGei1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hEZ0Z6ZWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hEZ0ZydWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hEZ0ZyLWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy04NTUsIC00MiwgNDAyMSwgOF0kWy0zMzE4LCAtNDIsIDE1NTcsIDhdIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hEZ0YwT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxNTkiIHNvdXJjZT0iX0hEV1V3T2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hEV1UwT2ZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERnRjAtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERnRjFlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRGdGMXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hEZ0YxT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEZ0YxLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxNUMiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRGdGMmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSERnRjJPZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTEzIiB5PSIyMDkiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEZ0YydWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMTVDIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERnRjNPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRGdGMi1mWEVkdXFIb09KYlVSWlJ3IiB4PSI5OCIgeT0iLTYzNiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERnRjNlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMTVBIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERnRjMtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSERnRjN1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTIyOCIgeT0iMjE3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRGdGNE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMTVBIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERnRjR1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hEZ0Y0ZWZYRWR1cUhvT0piVVJaUnciIHg9Ii0yNDEiIHk9Ii04MDUiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEZ0Y0LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxNUMiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRGdGNWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSERnRjV1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRGdGNU9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRGdGNS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxNUEiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRGdGNmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSERnRjZ1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRGdGNk9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRGdGNi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDE1QyI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEZ0Y3ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRGdGN3VmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hEZ0Y3T2ZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEZ0Y3LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxNUEiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRGdGOGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRGdGOHVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hEZ0Y4T2ZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hEZ0YwZWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hEZ0YwdWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0yNjIsIC01NjcsIC04LCAyOTg4XSRbLTI2MiwgLTMwNzMsIC04LCA0ODJdIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hEZ0dBLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxOTQiIHNvdXJjZT0iX0hEZ0Y4LWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hEZ0Y4LWZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERnR0J1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERnR0NPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRGdHQ2VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hEZ0dCLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEZ0dDdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxOTciPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRGdHRE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSERnR0MtZlhFZHVxSG9PSmJVUlpSdyIgeD0iMjQ0IiB5PSItNTgwIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRGdHRGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDE5NyI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEZ0dELWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSERnR0R1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTEwMDAiIHk9Ii01ODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEZ0dFT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxOTUiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRGdHRXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRGdHRWVmWEVkdXFIb09KYlVSWlJ3IiB5PSIzOTYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEZ0dFLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMTk1Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERnR0ZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hEZ0dGT2ZYRWR1cUhvT0piVVJaUnciIHg9Ii0xMTgiIHk9Ii0zMjEiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEZ0dGdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxOTciPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRGdHR09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSERnR0dlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRGdHRi1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRGdHR3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxOTUiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRGdHSE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSERnR0hlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRGdHRy1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRGdHSHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDE5NyI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEZ0dJT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRGdHSWVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hEZ0dILWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEZ0dJdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxOTUiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRGdHSk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRGdHSmVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hEZ0dJLWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hEZ0dCT2ZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hEZ0dCZWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy05MjYsIC0yNywgLTkyNiwgLTI3XSRbLTMyMDEsIC0yNywgLTMyMDEsIC0yN10kWy0zMjAxLCAxNDAyLCAtMzIwMSwgMTQwMl0kWy0xMDYsIDE0MDIsIC0xMDYsIDE0MDJdJFstMTA2LCAyOTEsIC0xMDYsIDI5MV0iLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSERnR051ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDE3NyIgc291cmNlPSJfSERnR0p1ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSERnRjgtZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRGdHT2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRGdHTy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEZ0dQT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSERnR091ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERnR1BlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDE3QSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEZ0dQLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRGdHUHVmWEVkdXFIb09KYlVSWlJ3IiB4PSItNTEiIHk9IjE1MCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERnR1FPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxN0EiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRGdHUXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hEZ0dRZWZYRWR1cUhvT0piVVJaUnciIHg9IjcwNCIgeT0iLTEwODIiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEZ0dRLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDE3OCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEZ0dSZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hEZ0dST2ZYRWR1cUhvT0piVVJaUnciIHg9Ii03MCIgeT0iLTIxOCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERnR1J1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDE3OCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEZ0dTT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRGdHUi1mWEVkdXFIb09KYlVSWlJ3IiB4PSItMzg2IiB5PSI3NjkiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEZ0dTZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxN0EiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRGdHUy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSERnR1RPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRGdHU3VmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRGdHVGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxNzgiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRGdHVC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSERnR1VPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRGdHVHVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRGdHVWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDE3QSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEcFBrT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRHBQa2VmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hEZ0dVdWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEcFBrdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxNzgiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHBQbE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRHBQbGVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hEcFBrLWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hEZ0dOLWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSERnR09PZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTM1NSwgLTU2NywgMTg3OSwgMjk4OF0kWy0xOTMwLCAtMzA3MywgMzA0LCA0ODJdIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hEcFBwdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxQTkiIHNvdXJjZT0iX0hEZ0dKdWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hEcFBsdWZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERwUHFlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERwUHEtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHBQck9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hEcFBxdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEcFByZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxQUMiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHBQci1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSERwUHJ1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTIxIiB5PSItMTM1Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHBQc09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDFBQyI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEcFBzdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSERwUHNlZlhFZHVxSG9PSmJVUlpSdyIgeD0iODUxIiB5PSIxMDcxIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHBQcy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxQUEiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHBQdGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRHBQdE9mWEVkdXFIb09KYlVSWlJ3IiB4PSItNCIgeT0iLTMwNiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERwUHR1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDFBQSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEcFB1T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRHBQdC1mWEVkdXFIb09KYlVSWlJ3IiB4PSIxMDI1IiB5PSIxMzg1Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHBQdWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMUFDIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERwUHUtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hEcFB2T2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSERwUHV1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERwUHZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMUFBIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERwUHYtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hEcFB3T2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSERwUHZ1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERwUHdlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxQUMiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHBQdy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSERwUHhPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRHBQd3VmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHBQeGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMUFBIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERwUHgtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSERwUHlPZlhFZHVxSG9PSmJVUlpSdyIgY29sbGFwc2VkPSJ0cnVlIi8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hEcFB4dWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hEcFBwLWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSERwUHFPZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMjk2LCAtNTY3LCAtMTY4NCwgMjk4OF0kWzE3MDEsIC0zMDczLCAtMjc5LCA0ODJdIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hEcFA2ZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxRjkiIHNvdXJjZT0iX0hEcFB5ZWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hEcFAyZWZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERwUDdPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERwUDd1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHBQNy1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hEcFA3ZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEcFA4T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxRkMiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHBQOHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSERwUDhlZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTQwIiB5PSItMzczIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHBQOC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDFGQyI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEcFA5ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSERwUDlPZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTU3IiB5PSIxMTU5Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHBQOXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxRkEiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHBQLU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRHBQOS1mWEVkdXFIb09KYlVSWlJ3IiB4PSItMjIiIHk9Ii0yMjEiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEcFAtZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxRkEiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHBQLS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSERwUC11ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTIiIHk9IjU3NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERwUF9PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDFGQyI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEcFBfdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRHBQXy1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hEcFBfZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEcFFBT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDFGQSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEekFrT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRHpBa2VmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hEcFFBZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEekFrdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMUZDIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSER6QWxPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hEekFsZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSER6QWstZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSER6QWx1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDFGQSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEekFtT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hEekFtZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSER6QWwtZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSERwUDZ1ZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSERwUDYtZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTMwNCwgLTU1MCwgLTUwLCAzMTA3XSRbLTMwNCwgLTMxNzUsIC01MCwgNDgyXSIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IRHpBcXVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGNzEyOTUwMTdGIiBzb3VyY2U9Il9IRFdVc09mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IRHpBbXVmWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEekFyZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEekFyLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSER6QXNPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRHpBcnVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IRHpBcS1mWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hEekFyT2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzExMCwgLTQ5MSwgLTEyMTAsIDQ4NDJdJFsxMDMyLCAtNDI1MCwgLTI4NywgMTA4M10iLz4NCi0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hEekFzZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSER6QXN1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hEekF2T2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxNTgiIHNvdXJjZT0iX0hEV1UwT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hEekFtdWZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSER6QXYtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSER6QXdlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHpBd3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hEekF3T2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hEekF2ZWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSER6QXZ1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTMzMCwgLTQ5MSwgMzIyNSwgNDg5M10kWy0yODUzLCAtNDMwMSwgNzAyLCAxMDgzXSIvPg0KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSER6QXctZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRHpBeE9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSER6QXhlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDE3NiIgc291cmNlPSJfSERnRjgtZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSER6QW11ZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHpBeU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHpBeXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEekF5LWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSER6QXllZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSER6QXh1ZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IRHpBeC1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstNzcwLCAtNDkxLCA3ODY1LCA0ODkzXSRbLTY4OTEsIC00MzAxLCAxNzQ0LCAxMDgzXSIvPg0KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSER6QXpPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRHpBemVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSER6QXp1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDFBOCIgc291cmNlPSJfSERwUGx1ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSER6QW11ZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHpBMGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHpBMC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEekExT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSER6QTB1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSER6QXotZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IRHpBME9mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMTE0MywgLTQ5MSwgMTE3MDksIDQ4OTNdJFstMTA3MzUsIC00NTA0LCAyMTE2LCA4ODBdIi8+DQotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRHpBMWVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hEekExdWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IRHpBMS1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMUY4IiBzb3VyY2U9Il9IRHBQMmVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IRHpBbXVmWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEekEydWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEekEzT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSER6QTNlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRHpBMi1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IRHpBMk9mWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hEekEyZWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy03NzAsIC0zNTUsIDE2Mzk5LCA1MDI5XSRbLTUwNDYsIC0yMzAyLCAxMjEyNCwgMzA4MV0kWy0xNTA1MywgLTQ4NTEsIDIxMTYsIDUzM10iLz4NCi0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hEekEzdWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSER6QTMtZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hEekJBT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUJERUJBRTAyOTgiIHNvdXJjZT0iX0hEekE4T2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hEekFtdWZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSER6QkEtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSER6QkJlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHpCQnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hEekJCT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hEekJBZWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSER6QkF1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTkzOSwgLTQ1NywgMjA4NTMsIDQ5NzhdJFstODI4OCwgLTM5MzcsIDEzNTA0LCAxNDk4XSRbLTE5Njc2LCAtNTIwNywgMjExNiwgMjI4XSIvPg0KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSER6QkItZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRHpCQ09mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSER6QkNlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMEQzNjUwMDMzRiIgc291cmNlPSJfSER6QThPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSER6QW11ZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHpCRE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHpCRHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEekJELWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSER6QkRlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSER6QkVPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMEQzNjUyMDNCNyI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEekJFdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRHpCRWVmWEVkdXFIb09KYlVSWlJ3IiB4PSItMzA1OCIgeT0iMjYzIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHpCRS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjBEMzY1MjAzQjciPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHpCRmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hEekJGT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0zOTciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEekJGdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMEQzNjUyMDNBRCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEekJHT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hEekJGLWZYRWR1cUhvT0piVVJaUnciIHg9IjMxNzciIHk9IjkzIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHpCR2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIwRDM2NTIwM0FEIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSER6QkctZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hEekJHdWZYRWR1cUhvT0piVVJaUnciIHg9IjE1MjYiIHk9IjI0NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSER6QkhPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMEQzNjUyMDNCNyI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEekJIdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRHpCSC1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hEekJIZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEekJJT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMEQzNjUyMDNBRCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEekJJdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRHpCSS1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hEekJJZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEekJKT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIwRDM2NTIwM0I3Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSER6Qkp1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hEekJKLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSER6QkplZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSER6QktPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMEQzNjUyMDNBRCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEekJLdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hEekJLLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSER6QktlZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSER6QkN1ZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSER6QkMtZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMzMsIC00NDgsIDIxODI3LCA0OTg2XSRbMzMsIC01NzU3LCAyMTgyNywgLTMyMV0kWy0xOTY3NiwgLTU3NTcsIDIxMTYsIC0zMjFdIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hEekJMT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUJERUJERTAyM0QiIHNvdXJjZT0iX0hEekE4T2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hEekE0T2ZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSER6QkwtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSER6Qk1lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHpCTXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSER6Qk1PZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTUwMCIgeT0iLTEiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEekJNLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUJERUJERjAzQ0YiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHpCTmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSER6Qk5PZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTcyIiB5PSIzODAiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEekJOdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFCREVCREYwM0NGIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSER6Qk9PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRHpCTi1mWEVkdXFIb09KYlVSWlJ3IiB4PSIzIiB5PSItMTYwOSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSER6Qk9lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFCREVCREYwMzdGIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSER6Qk8tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSER6Qk91ZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTEwIiB5PSI0MDYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEekJQT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUJERUJERjAzN0YiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHpCUHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSER6QlBlZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTY5IiB5PSItMTg0NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSER6QlAtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxQkRFQkRGMDNDRiI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEekJRZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRHpCUXVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hEekJRT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEekJRLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxQkRFQkRGMDM3RiI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEekJSZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRHpCUnVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hEekJST2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEekJSLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFCREVCREYwM0NGIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSER6QlNlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hEekJTdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSER6QlNPZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEQ4eGtPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxQkRFQkRGMDM3RiI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEOHhrdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hEOHhrLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEQ4eGtlZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSER6QkxlZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSER6Qkx1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbNTAsIDQ0MCwgLTI1NCwgLTMxNjZdJFs1MCwgMzAxNCwgLTI1NCwgLTU5Ml0iLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEQ4eHBPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDFFNCIgc291cmNlPSJfSEQ4eGxPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSER6QW11ZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRDh4cC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRDh4cWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEOHhxdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEQ4eHFPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEQ4eHBlZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IRDh4cHVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlsxMTc2LCAtNDkxLCAtMTIyODUsIDQ4OTNdJFsxMTMzNiwgLTQ1NDYsIC0yMTI1LCA4MzhdIi8+DQotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRDh4cS1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hEOHhyT2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IRDh4emVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMUU1IiBzb3VyY2U9Il9IRDh4dmVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IRDh4bE9mWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEOHgwT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEOHgwdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEQ4eDAtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRDh4MGVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRDh4MU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMUU4Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEQ4eDF1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hEOHgxZWZYRWR1cUhvT0piVVJaUnciIHg9Ii04NCIgeT0iLTM0NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEQ4eDEtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxRTgiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRDh4MmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hEOHgyT2ZYRWR1cUhvT0piVVJaUnciIHg9IjU1OSIgeT0iMzE5Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRDh4MnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxRTYiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRDh4M09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRDh4Mi1mWEVkdXFIb09KYlVSWlJ3IiB4PSItMTY5IiB5PSIyODkiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEOHgzZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxRTYiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRDh4My1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEQ4eDN1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTEwMzIiIHk9Ii0zODAiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEOHg0T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxRTgiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRDh4NHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEQ4eDQtZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRDh4NGVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRDh4NU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxRTYiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRDh4NXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEQ4eDUtZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRDh4NWVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRDh4Nk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDFFOCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEOHg2dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRDh4Ni1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hEOHg2ZWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEOHg3T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxRTYiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRDh4N3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRDh4Ny1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hEOHg3ZWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hEOHh6dWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hEOHh6LWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy05MzEsIC0xMTgsIDU5NzcsIC0xMThdJFstNTI4MywgLTExOCwgMTYyNSwgLTExOF0iLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEQ4eDhPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyNzk4OEIyMDBFQiIgc291cmNlPSJfSEQ4eHZlZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEQ4eHJlZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRDh4OC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRDh4OWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEOHg5dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEQ4eDlPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEQ4eDktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyNzk4OEIyMDBFRCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEOHgtZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRDh4LU9mWEVkdXFIb09KYlVSWlJ3IiB4PSI5OSIgeT0iLTE4MyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEQ4eC11ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjc5ODhCMjAwRUQiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRDh4X09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hEOHgtLWZYRWR1cUhvT0piVVJaUnciIHg9Ijk2IiB5PSI4OTkiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEOHhfZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyNzk4OEIyMDBFQyI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEOHhfLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hEOHhfdWZYRWR1cUhvT0piVVJaUnciIHg9Ii0yNjkiIHk9Ii0xODciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEOHlBT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjc5ODhCMjAwRUMiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRDh5QXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEQ4eUFlZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTM1OSIgeT0iNjcwIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRDh5QS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3OTg4QjIwMEVEIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEQ4eUJlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hEOHlCdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEQ4eUJPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEQ4eUItZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3OTg4QjIwMEVDIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEQ4eUNlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hEOHlDdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEQ4eUNPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEQ4eUMtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjc5ODhCMjAwRUQiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRDh5RGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEQ4eUR1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRDh5RE9mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRDh5RC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3OTg4QjIwMEVDIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEQ4eUVlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEQ4eUV1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRDh5RU9mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IRDh4OGVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IRDh4OHVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstNjYyLCAzMTgsIDIzOCwgLTE5MzFdJFstNjYyLCAxOTMyLCAyMzgsIC0zMTddIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hEOHlFLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxM0IiIHNvdXJjZT0iX0hEOHh2ZWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hEekFtdWZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEQ4eUZ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEQ4eUdPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRDh5R2VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hEOHlGLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hEOHlGT2ZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEQ4eUZlZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbNjAxLCAtNTA4LCAtNTk1MiwgNDg3Nl0kWzUyMTUsIC00MzAxLCAtMTMzNywgMTA4M10iLz4NCi0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hEOHlHdWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEQ4eUctZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hEOHlIT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0NDVBNTkyNTAyNjYiIHNvdXJjZT0iX0hEOHh2ZWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hEOHh2ZWZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEQ4eUgtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEQ4eUllZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRDh5SXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hEOHlJT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEOHlJLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDQ1QTU5MjcwMzZGIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEQ4eUplZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hEOHlKT2ZYRWR1cUhvT0piVVJaUnciIHk9IjM5NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEQ4eUp1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDQ1QTU5MjcwMzZGIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEQ4eUtPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRDh5Si1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMzk3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRDh5S2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0NDVBNTkyNzAzNkQiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRDh5Sy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRDh5S3VmWEVkdXFIb09KYlVSWlJ3IiB4PSItMzQ0IiB5PSItMjA0Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRDh5TE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDQ1QTU5MjcwMzZEIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEQ4eUx1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hEOHlMZWZYRWR1cUhvT0piVVJaUnciIHg9IjU5NCIgeT0iLTk3MiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEQ4eUwtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQ0NUE1OTI3MDM2RiI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEOHlNZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRDh5TXVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hEOHlNT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEOHlNLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQ0NUE1OTI3MDM2RCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEOHlOZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRDh5TnVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hEOHlOT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEOHlOLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDQ1QTU5MjcwMzZGIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEQ4eU9lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hEOHlPdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEQ4eU9PZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEQ4eU8tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQ0NUE1OTI3MDM2RCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEOHlQZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hEOHlQdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEQ4eVBPZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEQ4eUhlZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEQ4eUh1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbNDE0LCA0OTksIDQxNCwgNDk5XSRbNDE0LCAxNDMwLCA0MTQsIDE0MzBdJFsyMTUwLCAxNDMwLCAyMTUwLCAxNDMwXSRbMjE1MCwgLTQyLCAyMTUwLCAtNDJdJFs5MzEsIC00MiwgOTMxLCAtNDJdIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0QzbHRvT29rRWR1VkE3dnQ1cWJJSlEiIGVsZW1lbnQ9Il9EM2I4b09va0VkdVZBN3Z0NXFiSUpRIiBzb3VyY2U9Il9IRHpBbXVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il85dWItRU9vakVkdVZBN3Z0NXFiSUpRIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0QzbHRvLW9rRWR1VkE3dnQ1cWJJSlEiIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0QzbHRwZW9rRWR1VkE3dnQ1cWJJSlEiIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRDNsdHB1b2tFZHVWQTd2dDVxYklKUSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0QzbHRwT29rRWR1VkE3dnQ1cWJJSlEiIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0QzbHRvZW9rRWR1VkE3dnQ1cWJJSlEiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRDNsdG91b2tFZHVWQTd2dDVxYklKUSIgcG9pbnRzPSJbLTUsIC00MSwgLTQsIDU5XSRbLTYzLCAtMTA0LCAtNjIsIC00XSIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICA8L2NvbnRlbnRzPg0KLSAgICAgICAgICA8L2VBbm5vdGF0aW9ucz4NCi0gICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HcWQ2ay1mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjI1Ij4NCi0gICAgICAgICAgICA8Ym9keT4wNDwvYm9keT4NCi0gICAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgICAgIDxwYWNrYWdlSW1wb3J0IHhtaTppZD0iX2RkajhzT3hkRWR1SGplM3BQYWhONEEiIGltcG9ydGVkUGFja2FnZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDE5MCIvPg0KLSAgICAgICAgICA8cGFja2FnZUltcG9ydCB4bWk6aWQ9Il9lYVc4SU94ZEVkdUhqZTNwUGFoTjRBIiBpbXBvcnRlZFBhY2thZ2U9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyOTQiLz4NCi0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyMjciIG5hbWU9IkRpc2NpcGxpbmUiPg0KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3FuRWgtZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDIyNyI+DQotICAgICAgICAgICAgICA8Ym9keT5BIERpc2NpcGxpbmUgaXMgYSBjYXRlZ29yaXphdGlvbiBvZiB3b3JrIChpLmUuIFRhc2tzIGZvciBNZXRob2QgQ29udGVudCksIGJhc2VkIHVwb24gc2ltaWxhcml0eSBvZiBjb25jZXJucyBhbmQgY29vcGVyYXRpb24gb2Ygd29yayBlZmZvcnQuDQotQSBkaXNjaXBsaW5lIGlzIGEgY29sbGVjdGlvbiBvZiBUYXNrcyB0aGF0IGFyZSByZWxhdGVkIHRvIGEgbWFqb3IgJ2FyZWEgb2YgY29uY2Vybicgd2l0aGluIHRoZSBvdmVyYWxsIHByb2plY3QuIFRoZSBncm91cGluZyBvZiBUYXNrcyBpbnRvIGRpc2NpcGxpbmVzIGlzIG1haW5seSBhbiBhaWQgdG8gdW5kZXJzdGFuZGluZyB0aGUgcHJvamVjdCBmcm9tIGEgJ3RyYWRpdGlvbmFsJyB3YXRlcmZhbGwgcGVyc3BlY3RpdmUuIEhvd2V2ZXIsIHR5cGljYWxseSwgZm9yIGV4YW1wbGUsIGl0IGlzIG1vcmUgY29tbW9uIHRvIHBlcmZvcm0gY2VydGFpbiByZXF1aXJlbWVudHMgYWN0aXZpdGllcyBpbiBjbG9zZSBjb29yZGluYXRpb24gd2l0aCBhbmFseXNpcyBhbmQgZGVzaWduIGFjdGl2aXRpZXMuIFNlcGFyYXRpbmcgdGhlc2UgYWN0aXZpdGllcyBpbnRvIHNlcGFyYXRlIGRpc2NpcGxpbmVzIG1ha2VzIHRoZSBhY3Rpdml0aWVzIGVhc2llciB0byBjb21wcmVoZW5kLg0KLTwvYm9keT4NCi0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMTNCIiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjQ0Ii8+DQotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyNzk4OEIyMDBFQyIgbmFtZT0idGFza3MiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI5RSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0Mjc5ODhCMjAwRUIiPg0KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3JnY2F1ZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4NCi0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0dyZ2NhZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0NDVBNTkyNzAzNkQiIG5hbWU9InN1YmRpc2NpcGxpbmUiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDIyNyIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0NDVBNTkyNTAyNjYiPg0KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3JnY2NlZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4NCi0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0dyZ2NjT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyMzAiIG5hbWU9IlJvbGVTZXQiPg0KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3FuRWktZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDIzMCI+DQotICAgICAgICAgICAgICA8Ym9keT5BIFJvbGUgU2V0IG9yZ2FuaXplcyBSb2xlcyBpbnRvIGNhdGVnb3JpZXMuICBJdCBpcyB1c2VkIHRvIGdyb3VwIHJvbGVzIHRvZ2V0aGVyIHRoYXQgaGF2ZSBjZXJ0YWluIGNvbW1vbmFsaXRpZXMuICBGb3IgZXhhbXBsZSwgdGhlICZxdW90O0FuYWx5c3RzJnF1b3Q7IFJvbGUgU2V0IGNvdWxkIGdyb3VwIHRoZSAmcXVvdDtCdXNpbmVzcyBQcm9jZXNzIEFuYWx5c3QmcXVvdDssICZxdW90O1N5c3RlbSBBbmFseXN0JnF1b3Q7LCBhcyB3ZWxsIGFzICZxdW90O1JlcXVpcmVtZW50cyBTcGVjaWZpZXImcXVvdDsgcm9sZXMuICBBbGwgb2YgdGhlc2Ugd29yayB3aXRoIHNpbWlsYXIgdGVjaG5pcXVlcyBhbmQgaGF2ZSBvdmVybGFwcGluZyBza2lsbHMsIGJ1dCBhcmUgcmVxdWlyZWQgYXMgZGlzdGluY3Qgcm9sZXMgZm9yIGEgbWV0aG9kIChlLmcuIHRoZSBtZXRob2QgdGhlIElCTSBSYXRpb25hbCBVbmlmaWVkIFByb2Nlc3MgaXMgYmFzZWQgb24pLg0KLTwvYm9keT4NCi0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMTU4IiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjQ0Ii8+DQotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDE1QyIgbmFtZT0icm9sZXMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI5NiIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxNTkiPg0KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3E2bWl1ZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4NCi0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0dxNm1pZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyMzEiIG5hbWU9IkRvbWFpbiI+DQotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HcW5Fai1mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjMxIj4NCi0gICAgICAgICAgICAgIDxib2R5PkRvbWFpbiBpcyBhIHJlZmluZWFibGUgaGllcmFyY2h5IGdyb3VwaW5nIHJlbGF0ZWQgd29yayBwcm9kdWN0cy4gIEluIG90aGVyIHdvcmRzLCBEb21haW5zIGNhbiBiZSBmdXJ0aGVyIGRpdmlkZWQgaW50byBzdWItZG9tYWlucywgd2l0aCB3b3JrIHByb2R1Y3QgZWxlbWVudHMgdG8gYmUgY2F0ZWdvcml6ZWQgb25seSBhdCB0aGUgbGVhZi1sZXZlbCBvZiB0aGlzIGhpZXJhcmNoeS4NCi1Eb21haW4gaXMgYSBsb2dpY2FsIGdyb3VwaW5nIG9mIHdvcmsgcHJvZHVjdHMgdGhhdCBoYXZlIGFuIGFmZmluaXR5IHRvIGVhY2ggb3RoZXIgYmFzZWQgb24gcmVzb3VyY2VzLCB0aW1pbmcsIG9yIHJlbGF0aW9uc2hpcC4gIEEgRG9tYWluIG1heSBiZSBkaXZpZGVkIGludG8gc3ViZG9tYWlucy4gIEZvciBleGFtcGxlLCBHUyBNZXRob2QgdXNlcyBzaXggcHJlZGVmaW5lZCBEb21haW5zIGZvciBXb3JrIFByb2R1Y3RzOiBBcHBsaWNhdGlvbiwgQXJjaGl0ZWN0dXJlLCBCdXNpbmVzcywgRW5nYWdlbWVudCwgT3BlcmF0aW9ucyBhbmQgT3JnYW5pemF0aW9uLg0KLTwvYm9keT4NCi0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMTc2IiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjQ0Ii8+DQotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDE3QSIgbmFtZT0id29ya1Byb2R1Y3RzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyQkMiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMTc3Ij4NCi0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0dxNm1rLWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+DQotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HcTZta3VmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMTk3IiBuYW1lPSJzdWJkb21haW5zIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyMzEiIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMTk0Ij4NCi0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0dyRHdjT2ZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+DQotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HcTZtbWVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjNBIiBuYW1lPSJXb3JrUHJvZHVjdFR5cGUiPg0KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3FuRWstZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDIzQSI+DQotICAgICAgICAgICAgICA8Ym9keT5Xb3JrIFByb2R1Y3QgVHlwZSBpcyBhIHNlY29uZCBjYXRlZ29yeSBmb3Igd29yayBwcm9kdWN0cywgd2hpY2ggaW4gY29udHJhc3QgdG8gRG9tYWluIGlzIG1vcmUgcHJlc2VudGF0aW9uIG9yaWVudGVkLiAgQSB3b3JrIHByb2R1Y3QgY2FuIGhhdmUgbWFueSBXb3JrIFByb2R1Y3QgVHlwZXMuICBFeGFtcGxlcywgZm9yIGEgV29yayBQcm9kdWN0IFR5cGUgaXMgJnF1b3Q7Q2xhc3MgRGlhZ3JhbSZxdW90Oywgd2hpY2ggY2F0ZWdvcml6ZXMgdGhlIEFydGlmYWN0cyBBbmFseXNpcyBNb2RlbCwgRGVzaWduIE1vZGVsLCBVc2VyIEV4cGVyaWVuY2UgTW9kZWwsIG9yICZxdW90O1NwZWNpZmljYXRpb24mcXVvdDssIHdoaWNoIGNhdGVnb3JpemVzIHJlcXVpcmVtZW50cyBzcGVjaWZpY2F0aW9ucyB0aGF0IGRlZmluZSBhIHN5c3RlbSB3aXRoIGEgd2VsbC1kZWZpbmVkIHN5c3RlbSBib3VuZGFyeSwgc3VjaCBhcyB1c2UgY2FzZSBvciBmdW5jdGlvbmFsIHJlcXVpcmVtZW50cyBzcGVjaWZpY2F0aW9uLiAgQSBXb3JrIFByb2R1Y3QgY2FuIGJlIGNhdGVnb3JpemVkIHRvIGJlIG9mIG1hbnkgV29yayBQcm9kdWN0IFR5cGVzLiAgRm9yIGV4YW1wbGUsIGEgdXNlIGNhc2UgbW9kZWwgY2FuIGJlIGNhdGVnb3JpemVkIGFzIGEgU3BlY2lmaWNhdGlvbiBhcyB3ZWxsIGFzIERpYWdyYW0gV29yayBQcm9kdWN0IFR5cGUuDQotPC9ib2R5Pg0KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxQTgiIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyNDQiLz4NCi0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMUFDIiBuYW1lPSJ3b3JrUHJvZHVjdHMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDJCQyIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxQTkiPg0KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3JEd2VlZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4NCi0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0dyRHdlT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyNDQiIG5hbWU9IkNvbnRlbnRDYXRlZ29yeSIgaXNBYnN0cmFjdD0idHJ1ZSI+DQotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HcXcxZ09mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjQ0Ij4NCi0gICAgICAgICAgICAgIDxib2R5PkNvbnRlbnQgQ2F0ZWdvcnkgaXMgYW4gYWJzdHJhY3QgY2xhc3MgZ2VuZXJhbGl6aW5nIGNvbnRlbnQgY2F0ZWdvcnkgdHlwZXMuPC9ib2R5Pg0KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il9EM2I4b09va0VkdVZBN3Z0NXFiSUpRIiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjZDIi8+DQotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI0RSIgbmFtZT0iRGlzY2lwbGluZUdyb3VwaW5nIj4NCi0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dxdzFoT2ZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyNEUiPg0KLSAgICAgICAgICAgICAgPGJvZHk+RGlzY2lwbGluZSBHcm91cGluZ3MgYXJlIHVzZWQgdG8gZ3JvdXAgRGlzY2lwbGluZXMuICBGb3IgZXhhbXBsZSwgdGhlIERpc2NpcGxpbmUgR3JvdXBpbmcgJnF1b3Q7U29mdHdhcmUgRGlzY2lwbGluZXMmcXVvdDsgd291bGQgYmUgdGhlIGdyb3VwIG9mIGFsbCBkaXNjaXBsaW5lcyByZWxhdGVkIHRvIGRldmVsb3Bpbmcgc29mdHdhcmUgc3VjaCBhcyAmcXVvdDtSZXF1aXJlbWVudHMgTWFuYWdlbWVudCZxdW90OyBvciAmcXVvdDtUZXN0aW5nJnF1b3Q7OyAmcXVvdDtJVCBJbmZyYXN0cnVjdHVyZSBNYW5hZ2VtZW50JnF1b3Q7IHdvdWxkIGJlIGEgRGlzY2lwbGluZXMgR3JvdXBpbmcgZm9yIGRpc2NpcGxpbmVzIHN1Y2ggYXMgJnF1b3Q7SVQgT3BlcmF0aW9uYWwgU2VydmljZXMmcXVvdDssICZxdW90O0lUIEN1c3RvbWVyIFJlbGF0aW9uc2hpcHMmcXVvdDssIG9yICZxdW90O0lUIEVuYWJsaW5nIFNlcnZpY2VzJnF1b3Q7LiAgRGlzY2lwbGluZXMgY2FuIGJlIGFzc29jaWF0ZWQgdG8gbW9yZSB0aGFuIG9uZSBEaXNjaXBsaW5lIEdyb3VwaW5nLg0KLTwvYm9keT4NCi0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMUU0IiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjQ0Ii8+DQotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDFFOCIgbmFtZT0iZGlzY2lwbGluZXMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDIyNyIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxRTUiPg0KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3JOaGR1ZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4NCi0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0dyTmhkZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyNTgiIG5hbWU9IlRvb2wiPg0KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3F3MWlPZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI1OCI+DQotICAgICAgICAgICAgICA8Ym9keT5BIFRvb2wgaXMgYSBjb250YWluZXIvYWdncmVnYXRlIGZvciBUb29sTWVudG9ycy4gIEl0IGNhbiBhbHNvIHByb3ZpZGUgZ2VuZXJhbCBkZXNjcmlwdGlvbnMgb2YgdGhlIHRvb2wgYW5kIGl0cyBnZW5lcmFsIGNhcGFiaWxpdGllcy48L2JvZHk+DQotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDFGOCIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI0NCIvPg0KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxRkMiIG5hbWU9InRvb2xNZW50b3JzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxQ0IiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMUY5Ij4NCi0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0dyV3JZT2ZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+DQotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9Hck5oZnVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjU5IiBuYW1lPSJSb2xlU2V0R3JvdXBpbmciPg0KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3F3MWpPZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI1OSI+DQotICAgICAgICAgICAgICA8Ym9keT5Sb2xlIFNldHMgY2FuIGJlIGNhdGVnb3JpemVkIGludG8gUm9sZSBTZXQgR3JvdXBpbmdzLiAgRm9yIGV4YW1wbGUsIGRpZmZlcmVudCBtZXRob2RzIG1pZ2h0IGRlZmluZSBzaW1pbGFyIFJvbGUgU2V0cywgd2hpY2ggaG93ZXZlciBuZWVkIHRvIGJlIGRpc3Rpbmd1aXNoZWQgZnJvbSBlYWNoIG90aGVyIG9uIGEgZ2xvYmFsIHNjYWxlLiAgVGh1cywgUm9sZSBTZXQgR3JvdXBpbmdzIGFsbG93IGRpc3Rpbmd1aXNoaW5nLCBmb3IgZXhhbXBsZSwgU29mdHdhcmUgU2VydmljZXMgTWFuYWdlciBSb2xlIFNldHMgZnJvbSBTb2Z0d2FyZSBEZXZlbG9wbWVudCBPcmdhbml6YXRpb24gTWFuYWdlciBSb2xlIFNldHMuPC9ib2R5Pg0KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEY3MTI5NTAxN0YiIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyNDQiLz4NCi0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMjE5IiBuYW1lPSJyb2xlU2V0cyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjMwIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDIxNiI+DQotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HcldyYWVmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3JXcmFPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxQkRFQkEyMDA5QyIgbmFtZT0iQ3VzdG9tQ2F0ZWdvcnkiPg0KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3F3MWtPZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxQkRFQkEyMDA5QyI+DQotICAgICAgICAgICAgICA8Ym9keT5BIEN1c3RvbSBDYXRlZ29yeSBpcyBhIGNhdGVnb3J5IGludHJvZHVjZWQgYnkgYSBtZXRob2QgY29udGVudCBhdXRob3IgdG8gc3RydWN0dXJlIGFueSBudW1iZXIgb2YgbWV0aG9kIENvbnRlbnQgRWxlbWVudHMgb2YgYW55IHN1YnR5cGUgYmFzZWQgb24gdXNlci1kZWZpbmVkIGNyaXRlcmlhLiAgQmVjYXVzZSBDb250ZW50IENhdGVnb3JpZXMgKGFuZCB0aGVyZWZvcmUgQ3VzdG9tIENhdGVnb3JpZXMsIHRvbykgYXJlIENvbnRlbnQgRWxlbWVudHMgdGhlbXNlbHZlcywgQ3VzdG9tIENhdGVnb3JpZXMgY2FuIGJlIHVzZWQgdG8gcmVjdXJzaXZlbHkgY2F0ZWdvcml6ZSBDb250ZW50IENhdGVnb3JpZXMgYXMgd2VsbC4gIEN1c3RvbSBDYXRlZ29yaWVzIGNhbiBhbHNvIGJlIG5lc3RlZCB3aXRoIGFueSBDb250ZW50IENhdGVnb3J5LiAgQ3VzdG9tIGNhdGVnb3JpZXMgY2FuIGJlIHVzZWQgdG8gY2F0ZWdvcml6ZSBjb250ZW50IGJhc2VkIG9uIHRoZSB1c2VyJ3MgY3JpdGVyaWEgYXMgd2VsbCBhcyB0byBkZWZpbmUgd2hvbGUgdHJlZS1zdHJ1Y3R1cmVzIG9mIG5lc3RlZCBjYXRlZ29yaWVzIGFsbG93aW5nIHRoZSB1c2VyIHRvIHN5c3RlbWF0aWNhbGx5IG5hdmlnYXRlIGFuZCBicm93c2UgbWV0aG9kIGNvbnRlbnQgYW5kIHByb2Nlc3NlcyBiYXNlZCBvbiB0aGVzZSBjYXRlZ29yaWVzLiAgRm9yIGV4YW1wbGUsIG9uZSBjb3VsZCBjcmVhdGUgYSBjdXN0b20gY2F0ZWdvcnkgdG8gbG9naWNhbGx5IG9yZ2FuaXplIGNvbnRlbnQgcmVsZXZhbnQgZm9yIHRoZSB1c2VyJ3MgZGV2ZWxvcG1lbnQgb3JnYW5pemF0aW9uIGRlcGFydG1lbnRzOyBlLmcuIGEgJnF1b3Q7VGVzdGluZyZxdW90OyBjYXRlZ29yeSB0aGF0IGdyb3VwcyB0b2dldGhlciBhbGwgcm9sZXMsIHdvcmsgcHJvZHVjdHMsIHRhc2tzLCBhbmQgZ3VpZGFuY2UgZWxlbWVudCByZWxldmFudCB0byB0ZXN0aW5nLiAgQW5vdGhlciBleGFtcGxlIHdvdWxkIGJlIGNhdGVnb3JpZXMgdGhhdCBleHByZXNzIGxpY2Vuc2luZyBsZXZlbHMgb2YgdGhlIGNvbnRlbnQgZ3JvdXBpbmcgZnJlZWx5IGRpc3RyaWJ1dGFibGUgbWV0aG9kIGNvbnRlbnQgdmVyc3VzIGNvbnRlbnQgdGhhdCByZXByZXNlbnQgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGFuZCByZXF1aXJlcyBhIGxpY2Vuc2UgdG8gYmUgcHVyY2hhc2VkIHRvIGJlIGFibGUgdG8gdXNlIGl0Lg0KLTwvYm9keT4NCi0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDFCREVCQUUwMjk4IiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjQ0Ii8+DQotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxQkRFQkRGMDM3RiIgbmFtZT0iY2F0ZWdvcml6ZWRFbGVtZW50cyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDI5NEVCOTAwMEZDIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQxQkRFQkRFMDIzRCI+DQotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HcldyYi1mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3JXcmJ1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyMEQzNjUyMDNBRCIgbmFtZT0ic3ViQ2F0ZWdvcmllcyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjQ0IiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQyMEQzNjUwMDMzRiI+DQotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HcmdjWWVmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3JnY1lPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDE1OSIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMTVBIF8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxNUMiPg0KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3E2bWctZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDE1OSI+DQotICAgICAgICAgICAgICA8Ym9keT5BIFJvbGUgU2V0IGNhdGVnb3JpemVzIG1hbnkgUm9sZXMgYW5kIGEgUm9sZSBjYW4gYmUgcmVwcmVzZW50ZWQgaW4gbWF5IFJvbGUgU2V0cy48L2JvZHk+DQotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDE1QSIgbmFtZT0icm9sZVNldHMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDIzMCIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxNTkiPg0KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3E2bWgtZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4NCi0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0dxNm1odWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICA8L293bmVkRW5kPg0KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxNzciIG5hbWU9IiIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMTc4IF8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxN0EiPg0KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3E2bWpPZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDE3NyI+DQotICAgICAgICAgICAgICA8Ym9keT5BIERvbWFpbiBjYXRlZ29yaXplcyBtYW55IFdvcmsgUHJvZHVjdHMuIEEgV29yayBQcm9kdWN0IGJlbG9uZ3MgYXQgbW9zdCB0byBvbmUgRG9tYWluLjwvYm9keT4NCi0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgICAgICA8b3duZWRFbmQgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMTc4IiBuYW1lPSJkb21haW4iIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDIzMSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxNzciPg0KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3E2bWtPZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4NCi0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0dxNm1qLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICA8L293bmVkRW5kPg0KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxOTQiIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDE5NSBfM0FEQzdCNzQwMjJENDBGMzZDOTIwMTk3Ij4NCi0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dxNm1sZWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxOTQiPg0KLSAgICAgICAgICAgICAgPGJvZHk+RG9tYWlucyBjYW4gYmUgZnVydGhlciBkaXZpZGVkIGludG8gU3ViZG9tYWlucywgd2l0aCB3b3JrIHByb2R1Y3QgZWxlbWVudHMgb25seSB0byBiZSBjYXRlZ29yaXplZCBhdCB0aGUgbGVhZi1sZXZlbC48L2JvZHk+DQotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDE5NSIgbmFtZT0iX2RvbWFpbiIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjMxIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMTk0Ii8+DQotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDFBOSIgbmFtZT0iIiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxQUEgXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDFBQyI+DQotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HckR3Y3VmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMUE5Ij4NCi0gICAgICAgICAgICAgIDxib2R5PkEgV29yayBQcm9kdWN0IGNhbiBiZSBjYXRlZ29yaXplZCB0byBiZSB6ZXJvIG9mIG1hbnkgV29yayBQcm9kdWN0IFR5cGVzLjwvYm9keT4NCi0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgICAgICA8b3duZWRFbmQgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMUFBIiBuYW1lPSJ3b3JrUHJvZHVjdFR5cGVzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyM0EiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMUE5Ij4NCi0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0dyRHdkdWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+DQotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HckR3ZGVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgPC9vd25lZEVuZD4NCi0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMUU1IiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxRTYgXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDFFOCI+DQotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HckR3ZS1mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMUU1Ij4NCi0gICAgICAgICAgICAgIDxib2R5PkRpc2NpcGxpbmUgR3JvdXBpbmdzIGdyb3VwIG1hbnkgRGlzY2lwbGluZXMuICBBIERpc2NpcGxpbmUgY2FuIGJlIGluIG1hbnkgRGlzY2lwbGluZSBHcm91cHMuPC9ib2R5Pg0KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxRTYiIG5hbWU9ImRpc2NpcGxpbmVHcm91cHMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI0RSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxRTUiPg0KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3JOaGMtZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4NCi0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0dyTmhjdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICA8L293bmVkRW5kPg0KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxRjkiIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDFGQSBfM0FEQzdCNzQwMjJENDBGMzZDOTIwMUZDIj4NCi0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dyTmhlT2ZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxRjkiPg0KLSAgICAgICAgICAgICAgPGJvZHk+QSBUb29sIE1lbnRvciBkZXNjcmliZXMgd29yayB3aXRoIGV4YWN0bHkgb25lIFRvb2wuPC9ib2R5Pg0KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxRkEiIG5hbWU9InRvb2wiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI1OCIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxRjkiPg0KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3JOaGZPZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4NCi0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0dyTmhlLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICA8L293bmVkRW5kPg0KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAyMTYiIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDIxNyBfM0FEQzdCNzQwMjJENDBGMzZDOTIwMjE5Ij4NCi0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dyV3JZdWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAyMTYiPg0KLSAgICAgICAgICAgICAgPGJvZHk+QSBSb2xlIFNldCBHcm91cGluZyBjb250YWlucyBtYW55IFJvbGUgU2V0cy4gUm9sZSBTZXRzIGNhbiBiZSBpbiBtYW55IFJvbGUgU2V0IEdyb3VwaW5ncy48L2JvZHk+DQotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDIxNyIgbmFtZT0icm9sZVNldEdyb3VwcyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjU5IiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDIxNiI+DQotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HcldyWnVmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3JXclplZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgIDwvb3duZWRFbmQ+DQotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxQkRFQkRFMDIzRCIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDFCREVCREYwMzdGIF8zQURDN0I3NDAyMkQ0MUJERUJERjAzQ0YiPg0KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3JXcmEtZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxQkRFQkRFMDIzRCI+DQotICAgICAgICAgICAgICA8Ym9keT5BIEN1c3RvbUNhdGVnb3J5IGdyb3VwcyB0b2dldGhlciBhbnkgbnVtYmVyIG9mIENvbnRlbnRFbGVtZW50cyBpbmNsdWRpbmcgb3RoZXIgQ29udGVudENhdGVnb3J5LiA8L2JvZHk+DQotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxQkRFQkRGMDNDRiIgbmFtZT0iY3VzdG9tQ2F0ZWdvcmllcyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDFCREVCQTIwMDlDIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQxQkRFQkRFMDIzRCI+DQotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HcldyY3VmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3JXcmNlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgIDwvb3duZWRFbmQ+DQotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyMEQzNjUwMDMzRiIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDIwRDM2NTIwM0FEIF8zQURDN0I3NDAyMkQ0MjBEMzY1MjAzQjciPg0KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3JXcmRPZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMEQzNjUwMDMzRiI+DQotICAgICAgICAgICAgICA8Ym9keT5BIEN1c3RvbUNhdGVnb3J5IGNhbiBoYXZlIGFueSBudW1iZXIgb2YgQ29udGVudENhdGVnb3JpZXMgZGVmaW5lZCBhcyBuZXN0ZWQgc3ViQ2F0ZWdvcmllcy4gIFRoZXJlZm9yZSwgb25lIGNvdWxkIG5lc3QgQ3VzdG9tQ2F0ZWdvcmllcyBpbnRvIG4tbGV2ZWwgaGllcmFyY2hpZXMuIDwvYm9keT4NCi0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgICAgICA8b3duZWRFbmQgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDIwRDM2NTIwM0I3IiBuYW1lPSJfY3VzdG9tQ2F0ZWdvcnkiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQxQkRFQkEyMDA5QyIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQyMEQzNjUwMDMzRiI+DQotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HcmdjWk9mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iMSIvPg0KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3JnY1ktZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IjEiLz4NCi0gICAgICAgICAgICA8L293bmVkRW5kPg0KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0Mjc5ODhCMjAwRUIiIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQyNzk4OEIyMDBFQyBfM0FEQzdCNzQwMjJENDI3OTg4QjIwMEVEIj4NCi0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dyZ2NadWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjc5ODhCMjAwRUIiPg0KLSAgICAgICAgICAgICAgPGJvZHk+RXZlcnkgVGFzayBzaG91bGQgYmUgcmVsYXRlZCB0byBleGFjdGx5IG9uZSBEaXNjaXBsaW5lLiAgRm9yIGxlZ2FjeSByZWFzb25zIHRoaXMgaXMgbm90IGVuZm9yY2VkIChlLmcuIEdTIE1ldGhvZCBkb2VzIG5vdCBkZWZpbmUgRGlzY2lwbGluZXMsIHlldCkuPC9ib2R5Pg0KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0Mjc5ODhCMjAwRUQiIG5hbWU9ImRpc2NpcGxpbmUiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDIyNyIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0Mjc5ODhCMjAwRUIiPg0KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3JnY2JlZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4NCi0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0dyZ2NiT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICA8L293bmVkRW5kPg0KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0NDVBNTkyNTAyNjYiIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQ0NUE1OTI3MDM2RCBfM0FEQzdCNzQwMjJENDQ1QTU5MjcwMzZGIj4NCi0gICAgICAgICAgICA8b3duZWRFbmQgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDQ1QTU5MjcwMzZGIiBuYW1lPSJfZGlzY2lwbGluZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjI3IiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDQ1QTU5MjUwMjY2Ii8+DQotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6UGFja2FnZSIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjYyIiBuYW1lPSJCYXNpY0VsZW1lbnRzIj4NCi0gICAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il9Hc1owU2VmWEVkdXFIb09KYlVSWlJ3IiBzb3VyY2U9InVtbDIuZGlhZ3JhbXMiIHJlZmVyZW5jZXM9Il8zQURDN0I3NDAyMkQ0MEYzNkQ2NjAyRkIiPg0KLSAgICAgICAgICAgIDxjb250ZW50cyB4bWk6dHlwZT0ibm90YXRpb246RGlhZ3JhbSIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZENjYwMkZCIiB0eXBlPSJDbGFzcyIgbmFtZT0iTWFpbiI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVGN2dPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTm90ZSI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRUY3Zy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJEaWFncmFtTmFtZSI+DQotICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVGN2hPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRGVzY3JpcHRpb24iPg0KLSAgICAgICAgICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246U2hhcGVTdHlsZSIgeG1pOmlkPSJfSEVGN2dlZlhFZHVxSG9PSmJVUlpSdyIgZGVzY3JpcHRpb249IlVNTDIgSW5mcmFzdHJ1Y3R1cmUiIGxpbmVDb2xvcj0iNDE5NDM2OCIvPg0KLSAgICAgICAgICAgICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hFRjdndWZYRWR1cUhvT0piVVJaUnciIHg9IjQ0MTkiIHk9IjUxNiIgd2lkdGg9IjEyNTQzIiBoZWlnaHQ9IjcwOTUiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVGN2hlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRERFNjU4MDE1NyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRUY3aU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEVGN2llZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjI1NzMiIGhlaWdodD0iMTA0OSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVGN2l1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVGN2ktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVGN2pPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRUY3amVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFRjdqdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFRjdqLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFRjdrT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFRjdrZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFRjdrdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFRjdrLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRUY3bE9mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hFRjdodWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iTm9uZSIgc2hvd0xpc3RWaXNpYmlsaXR5PSJOb25lIiBzaG93TGlzdFNpZ25hdHVyZT0idHJ1ZSIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRUY3aC1mWEVkdXFIb09KYlVSWlJ3IiB4PSIxMDIzMSIgeT0iNTk4NyIgd2lkdGg9IjU4NDUiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVGN2xlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRERFODMzMDFBNSI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRUY3bU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEVGN21lZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjQzNjgiIGhlaWdodD0iMTAzMiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVGN211ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVGN20tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVGN25PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRUY3bmVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRUY3bnVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRUY3bi1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRUY3b09mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRUY3b2VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRUY3b3VmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRUY3by1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEVGN3BPZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IRUY3bHVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRUY3bC1mWEVkdXFIb09KYlVSWlJ3IiB4PSI1Mzg0IiB5PSIzNTk4Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFRjdwZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURERUNCNTAwOTgiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVGN3FPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hFRjdxZWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIyNTczIiBoZWlnaHQ9IjEwMzIiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFRjdxdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFRjdxLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFRjdyT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVGN3JlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEVGN3J1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVGN3ItZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEVGN3NPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVGN3NlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEVGN3N1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVGN3MtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFRjd0T2ZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEVGN3B1ZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEVGN3AtZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTA0OTgiIHk9IjQ0MTEiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVQc2plZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRERFMDYyMDJENSI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVBza09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEVQc2tlZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjI4MTAiIGhlaWdodD0iMTU0MCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVQc2t1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVQc2stZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVQc2xPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVBzbGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFUHNsdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFUHNsLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFUHNtT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFUHNtZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFUHNtdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFUHNtLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRVBzbk9mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hFUHNqdWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iTm9uZSIgc2hvd0xpc3RWaXNpYmlsaXR5PSJOb25lIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hFUHNqLWZYRWR1cUhvT0piVVJaUnciIHg9IjYyMTQiIHk9IjExMDkiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVQc3ItZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI2QyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVBzc3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEVQc3MtZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjMzNTIiIGhlaWdodD0iMTA4MyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVQc3RPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVQc3RlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVQc3R1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVBzdC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFUHN1T2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFUHN1ZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFUHN1dWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFUHN1LWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFUHN2T2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFUHN2ZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRVBzdnVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hFUHNzT2ZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hFUHNzZWZYRWR1cUhvT0piVVJaUnciIHg9IjEwNTEyIiB5PSIxNDMyNyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVBzdi1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRTRDRjMwMUFFIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFUHN3dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IRVBzdy1mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVBzeE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVBzeGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVBzeHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFUHN4LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEVQc3lPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVQc3llZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEVQc3l1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVQc3ktZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEVQc3pPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVQc3plZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFUHN6dWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEVQc3dPZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJOb25lIiBzaG93TGlzdFZpc2liaWxpdHk9Ik5vbmUiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEVQc3dlZlhFZHVxSG9PSmJVUlpSdyIgeD0iMzg5OSIgeT0iMTgzNDciIHdpZHRoPSI0NTM4IiBoZWlnaHQ9IjE1NTciLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVQczh1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyOTRFQjkwMDBGQyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVBzOWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEVQczl1ZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjQxODIiIGhlaWdodD0iMTE1MSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVQczktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVQcy1PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVQcy1lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVBzLXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFUHMtLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFUHNfT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFUHNfZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFUHNfdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFUHNfLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFUHRBT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRVB0QWVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hFUHM4LWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iTm9uZSIgc2hvd0xpc3RWaXNpYmlsaXR5PSJOb25lIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hFUHM5T2ZYRWR1cUhvT0piVVJaUnciIHg9IjEyMjc1IiB5PSIxMTIwOCIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVB0Qy1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERTRBOTcwMTIzIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFUHREdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IRVB0RC1mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVB0RU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVB0RWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVB0RXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFUHRFLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEVQdEZPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVQdEZlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEVQdEZ1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVQdEYtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEVQdEdPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVQdEdlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFUHRHdWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEVQdERPZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJOb25lIiBzaG93TGlzdFZpc2liaWxpdHk9Ik5vbmUiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEVQdERlZlhFZHVxSG9PSmJVUlpSdyIgeD0iNzU0OCIgeT0iMTU4NDkiIHdpZHRoPSI0NTU1IiBoZWlnaHQ9IjE0ODEiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVZMnItZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E4NTdCMDMzMyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVkyc3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEVZMnMtZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjI0ODkiIGhlaWdodD0iMTE1MSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVZMnRPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVZMnRlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVZMnR1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVkydC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFWTJ1T2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFWTJ1ZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFWTJ1dWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFWTJ1LWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFWTJ2T2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFWTJ2ZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRVkydnVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hFWTJzT2ZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iTm9uZSIgc2hvd0xpc3RWaXNpYmlsaXR5PSJOb25lIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hFWTJzZWZYRWR1cUhvT0piVVJaUnciIHg9IjQxMTEiIHk9IjEzMTE0Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFWTJ2LWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0NTVFNjIwMjAzMkEiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVZMnd1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hFWTJ3LWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSI0MDgwIiBoZWlnaHQ9IjExNTEiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFWTJ4T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFWTJ4ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFWTJ4dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVZMngtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRVkyeU9mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVkyeWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRVkyeXVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVkyeS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRVkyek9mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVkyemVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEVZMnp1ZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IRVkyd09mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9Ik5vbmUiIHNob3dMaXN0VmlzaWJpbGl0eT0iTm9uZSIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRVkyd2VmWEVkdXFIb09KYlVSWlJ3IiB4PSIxMjMyIiB5PSIxNTM1MCIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVkyei1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjgwIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFWTIwdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IRVkyMC1mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVkyMU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVkyMWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVkyMXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFWTIxLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEVZMjJPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVZMjJlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEVZMjJ1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVZMjItZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEVZMjNPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVZMjNlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFWTIzdWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEVZMjBPZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJOb25lIiBzaG93TGlzdFZpc2liaWxpdHk9Ik5vbmUiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEVZMjBlZlhFZHVxSG9PSmJVUlpSdyIgeD0iNTQ1NyIgeT0iODE0MiIgd2lkdGg9IjQzMjgiIGhlaWdodD0iMjE5MSIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il8yaDI5c2NWUUVkeTJtdVEyUFF2SF9BIiBlbGVtZW50PSJfMmgyOXNNVlFFZHkybXVRMlBRdkhfQSI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il8yaDI5dE1WUUVkeTJtdVEyUFF2SF9BIiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfMmgyOXRjVlFFZHkybXVRMlBRdkhfQSIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfMmgyOXRzVlFFZHkybXVRMlBRdkhfQSIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfMmgyOXQ4VlFFZHkybXVRMlBRdkhfQSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfMmgyOXVNVlFFZHkybXVRMlBRdkhfQSIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il8yaDI5dWNWUUVkeTJtdVEyUFF2SF9BIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iXzJoMjl1c1ZRRWR5Mm11UTJQUXZIX0EiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iXzJoMjl1OFZRRWR5Mm11UTJQUXZIX0EiIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iXzJoMjl2TVZRRWR5Mm11UTJQUXZIX0EiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iXzJoMjl2Y1ZRRWR5Mm11UTJQUXZIX0EiIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iXzJpQXVzTVZRRWR5Mm11UTJQUXZIX0EiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iXzJpQXVzY1ZRRWR5Mm11UTJQUXZIX0EiIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il8yaUF1c3NWUUVkeTJtdVEyUFF2SF9BIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iXzJoMjlzc1ZRRWR5Mm11UTJQUXZIX0EiIHNob3dMaXN0U3RlcmVvdHlwZT0iTm9uZSIgc2hvd0xpc3RWaXNpYmlsaXR5PSJOb25lIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iXzJoMjlzOFZRRWR5Mm11UTJQUXZIX0EiIHg9Ijg1NDQiIHk9IjEyNDA1Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iXzl2d1pVTW5tRWR5TjBjb2RFWGFSNmciIGVsZW1lbnQ9Il85dmRlWU1ubUVkeU4wY29kRVhhUjZnIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iXzl2d1pVOG5tRWR5TjBjb2RFWGFSNmciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il85dndaVk1ubUVkeU4wY29kRVhhUjZnIiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il85dndaVmNubUVkeU4wY29kRVhhUjZnIiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il85dndaVnNubUVkeU4wY29kRVhhUjZnIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il85djZLVU1ubUVkeU4wY29kRVhhUjZnIiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iXzl2NktVY25tRWR5TjBjb2RFWGFSNmciIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfOXY2S1Vzbm1FZHlOMGNvZEVYYVI2ZyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfOXY2S1U4bm1FZHlOMGNvZEVYYVI2ZyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfOXY2S1ZNbm1FZHlOMGNvZEVYYVI2ZyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfOXY2S1Zjbm1FZHlOMGNvZEVYYVI2ZyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfOXY2S1Zzbm1FZHlOMGNvZEVYYVI2ZyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfOXY2S1Y4bm1FZHlOMGNvZEVYYVI2ZyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iXzl2NktXTW5tRWR5TjBjb2RFWGFSNmciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfOXZ3WlVjbm1FZHlOMGNvZEVYYVI2ZyIgc2hvd0xpc3RTdGVyZW90eXBlPSJOb25lIiBzaG93TGlzdFZpc2liaWxpdHk9Ik5vbmUiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfOXZ3WlVzbm1FZHlOMGNvZEVYYVI2ZyIgeD0iMTAwNTMiIHk9IjkwMjAiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxEaWFncmFtU3R5bGUiIHhtaTppZD0iX0dzWjBTLWZYRWR1cUhvT0piVVJaUnciIGRlc2NyaXB0aW9uPSJUaGUgbG93ZXN0IGxldmVsIHBhY2thZ2UgaW4gTWV0aG9kIENvcmUgZGVmaW5lcyB0aGUgY2xhc3MgTWV0aG9kIEVsZW1lbnQgZnJvbSB3aGljaCBhbGwgb3RoZXIgY2xhc3NlcyBkZWZpbmVkIGluIHRoZSBzcGVjaWZpY2F0aW9uIGFyZSBkZXJpdmVkIGZyb20uICBNZXRob2QgRWxlbWVudCBpdHNlbGYgaXMgZGVyaXZlZCBmcm9tIHRoZSBVTUwgMi4wIEluZnJhLXN0cnVjdHVyZSBMaWJyYXJ5IGVsZW1lbnQgUGFja2FnZWFibGUgRWxlbWVudHMuICBUaGlzIHBhY2thZ2UgYWxzbyBkZWZpbmVzIGtleSBiYXNpYyBlbGVtZW50cyB1c2VkIHRvIGRlLWZpbmUgYW5kIHN0cnVjdHVyZSBtZXRob2QgY29udGVudCB0eXBlcy4gIEV2ZXJ5IGNsYXNzIGRlZmluZWQgaW4gdGhpcyBzcGVjaWZpY2F0aW9uIGlzIGRlcml2ZWQgZnJvbSBNZXRob2QgRWxlbWVudC4gIEluIG90aGVyIHdvcmRzIE1ldGhvZCBFbGVtZW50IGlzIHRoZSByb290IGdlbmVyYWxpemF0aW9uIGZvciBhbGwgVU1BIGNsYXNzZXMgYW5kIGRlZmluZXMgYSBjb21tb24gc2V0IG9mIGF0dHJpYnV0ZXMgaW5oZXJpdGVkIGJ5IGV2ZXJ5IG90aGVyIGVsZW1lbnQgdHlwZSBvZiB0aGlzIG1vZGVsLiAgTWV0aG9kIEVsZW1lbnQgaXRzZWxmIGlzIGRlcml2ZWQgZnJvbSBQYWNrYWdlYWJsZSBFbGVtZW50IGZyb20gdGhlIFVNTCAyLjAgSW5mcmFzdHJ1Y3R1cmUuICBNZXRob2QgRWxlbWVudCBpbmhlcml0cyB0aGUgTmFtZSBhdHRyaWJ1dGUgZnJvbSBQYWNrYWdlYWJsZSBFbGVtZW50J3Mgc3VwZXIgY2xhc3MuIEEgTW9kZWwgRWxlbWVudCBpcyBwYXJ0IG9mIGEgbWV0aG9kIG1vZGVsIGFuZCBldmVyeSBtZXRob2QgbW9kZWwgcGFydCBpcyBhIE1ldGhvZCBFbGVtZW50LiAgRXZlcnkgTWV0aG9kIEVsZW1lbnQgaXMgYXQgbGVhc3QgZGVmaW5lZCBieSBhIHVuaXF1ZSBpZCBhcyB3ZWxsIGFzIGJyaWVmIGRlc2NyaXB0aW9uLiIvPg0KLSAgICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hFRjd0ZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURERjhCRDAyOEYiIHNvdXJjZT0iX0hFRjdoZWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hFRjdwZWZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVGN3VPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVQc2dPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVBzZ2VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hFRjd1ZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hFRjd0dWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hFRjd0LWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzAsIC01MzMsIDAsIDEzOTddJFswLCAtMTQxMywgMCwgNTE2XSIvPg0KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEVQc2d1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRVBzZy1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEVQc2hPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRERGNzFCMDNBOCIgc291cmNlPSJfSEVGN3BlZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEVGN2xlZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVBzaC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVBzaWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFUHNpdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEVQc2lPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEVQc2hlZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IRVBzaHVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMTI5NSwgLTI1NCwgMjkyMSwgNTU4XSRbLTIwMzIsIC0zOTcsIDIxODQsIDQxNF0iLz4NCi0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hFUHNpLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEVQc2pPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hFUHNuZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURERjhENDAyMTEiIHNvdXJjZT0iX0hFRjdsZWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hFUHNqZWZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVQc29PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVQc291ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVBzby1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hFUHNvZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hFUHNudWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hFUHNuLWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzUwLCAtNTI0LCAwLCAxNzEwXSRbNTAsIC0xNDY0LCAwLCA3NzBdIi8+DQotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRVBzcE9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hFUHNwZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IRVBzcHVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFEREY5MTIwM0MwIiBzb3VyY2U9Il9IRUY3cGVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IRVBzamVmWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFUHNxZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFUHNxLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVQc3JPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRVBzcXVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IRVBzcC1mWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hFUHNxT2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy03MTEsIC01MjQsIDM0NTQsIDI1MjNdJFstMzExNSwgLTIyNzcsIDEwNDksIDc3MF0iLz4NCi0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hFUHNyZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEVQc3J1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hFUHN6LWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjFFNEUzQjAzMTkiIHNvdXJjZT0iX0hFUHN2LWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hFUHN2LWZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVQczB1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVQczFPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVBzMWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hFUHMwLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFUHMxdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjFFNEUzRDAzNjQiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVBzMk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEVQczEtZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTIyIiB5PSI2MjYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFUHMyZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMUU0RTNEMDM2NCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFUHMyLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEVQczJ1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMzciIHk9IjI4NyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVQczNPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRTRFM0QwMzYyIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVQczN1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEVQczNlZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTQ3OSIgeT0iNTYyIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVBzMy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRTRFM0QwMzYyIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVQczRlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hFUHM0T2ZYRWR1cUhvT0piVVJaUnciIHg9Ii0xMTUwIiB5PSIzMDYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFUHM0dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjFFNEUzRDAzNjQiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVBzNU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEVQczVlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRVBzNC1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVBzNXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjFFNEUzRDAzNjIiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVBzNk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEVQczZlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRVBzNS1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVBzNnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMUU0RTNEMDM2NCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFUHM3T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRVBzN2VmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hFUHM2LWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFUHM3dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjFFNEUzRDAzNjIiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVBzOE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRVBzOGVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hFUHM3LWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hFUHMwT2ZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hFUHMwZWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy04MTIsIDc3OCwgLTgxMiwgNzc4XSRbLTgxMiwgMTcxOCwgLTgxMiwgMTcxOF0kWy0zNjE1LCAxNzE4LCAtMzYxNSwgMTcxOF0kWy0zNjE1LCA4NCwgLTM2MTUsIDg0XSRbLTIyNjksIDg0LCAtMjI2OSwgODRdIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hFUHRBdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjk0RUMyNzAxMDYiIHNvdXJjZT0iX0hFUHM4dWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hFRjdoZWZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVQdEJlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVQdEItZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVB0Q09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hFUHRCdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hFUHRBLWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hFUHRCT2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzgyMCwgLTQ3NywgMjk2MywgNDYzMF0kWzgyMCwgLTQ2MDQsIDI5NjMsIDUwM10iLz4NCi0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hFUHRDZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEVQdEN1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hFUHRHLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjFFNERBQzAxQTAiIHNvdXJjZT0iX0hFUHRDLWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hFUHN2LWZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVQdEh1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVQdElPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVB0SWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hFUHRILWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFUHRJdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjFFNERBRDAwNTciPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVB0Sk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEVQdEktZlhFZHVxSG9PSmJVUlpSdyIgeD0iMjQyIiB5PSIzODkiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFUHRKZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMUU0REFEMDA1NyI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFUHRKLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEVQdEp1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTExNCIgeT0iLTM1NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVQdEtPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRTREQUQwMDREIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVQdEt1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEVQdEtlZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTQ2IiB5PSIxNDMiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFWTJjT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjFFNERBRDAwNEQiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVkyY3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEVZMmNlZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTUyMSIgeT0iLTIwNCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVZMmMtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMUU0REFEMDA1NyI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFWTJkZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRVkyZHVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hFWTJkT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFWTJkLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMUU0REFEMDA0RCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFWTJlZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRVkyZXVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hFWTJlT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFWTJlLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRTREQUQwMDU3Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVZMmZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFWTJmdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEVZMmZPZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVZMmYtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMUU0REFEMDA0RCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFWTJnZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFWTJndWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEVZMmdPZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEVQdEhPZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEVQdEhlZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbNDc2LCA3MTQsIDQxMjcsIC0xODI2XSRbNDc2LCAyNjE5LCA0MTI3LCA3OV0kWy0xNDAyLCAyNjE5LCAyMjQ5LCA3OV0iLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEVZMmctZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyOTRFQzYwMDJCRCIgc291cmNlPSJfSEVQdEMtZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEVQczh1ZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVkyaHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVkyaU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFWTJpZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEVZMmgtZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVZMml1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyOTRFQzYwMDJCRiI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFWTJqT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRVkyaS1mWEVkdXFIb09KYlVSWlJ3IiB4PSItMTM0IiB5PSItMjc5Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVkyamVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyOTRFQzYwMDJCRiI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFWTJqLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEVZMmp1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iNTkzIiB5PSIyMjgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFWTJrT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyOTRFQzYwMDJCRSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFWTJrdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hFWTJrZWZYRWR1cUhvT0piVVJaUnciIHg9IjEzOSIgeT0iLTE0NCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVZMmstZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjk0RUM2MDAyQkUiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVkybGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEVZMmxPZlhFZHVxSG9PSmJVUlpSdyIgeD0iMjc0IiB5PSItMzQ4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVkybHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI5NEVDNjAwMkJGIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVZMm1PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFWTJtZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEVZMmwtZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVZMm11ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI5NEVDNjAwMkJFIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVZMm5PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFWTJuZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEVZMm0tZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVZMm51ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjk0RUM2MDAyQkYiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVkyb09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEVZMm9lZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRVkybi1mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVkyb3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI5NEVDNjAwMkJFIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVZMnBPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEVZMnBlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRVkyby1mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IRVkyaE9mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IRVkyaGVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlsyMjc1LCAtNzksIC0yNjUsIDQyMDddJFszNzU3LCAtNzksIDEyMTcsIDQyMDddJFszNzU3LCAtMzgzNywgMTIxNywgNDQ5XSIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IRVkycHVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI5NEVDNEEwMzA2IiBzb3VyY2U9Il9IRVBzci1mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IRVBzOHVmWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFWTJxZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFWTJxLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVZMnJPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRVkycXVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IRVkycC1mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IRVkycU9mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlsxMDMyLCAtNDc3LCAtOTUyLCAyNjQ1XSRbMTAzMiwgLTI2NzMsIC05NTIsIDQ0OV0iLz4NCi0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hFWTJyZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEVZMnJ1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hFWTIzLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUVDMzM0RjAxOTgiIHNvdXJjZT0iX0hFWTJ6LWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hFRjdsZWZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVZMjR1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVZMjVPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVkyNWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hFWTI0LWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hFWTI0T2ZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hFWTI0ZWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzAsIC03ODcsIDAsIDM4MzVdJFswLCAtNDEwNiwgMCwgNTE2XSIvPg0KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEVZMjV1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRVkyNS1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEVZMjZPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E4NUU3MDA1MiIgc291cmNlPSJfSEVZMnotZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEVZMnItZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVkyNi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVkyN2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFWTI3dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEVZMjdPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVZMjctZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBODVFOTAwMEEiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVkyOGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEVZMjhPZlhFZHVxSG9PSmJVUlpSdyIgeT0iMzk2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVkyOHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBODVFOTAwMEEiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVkyOU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hFWTI4LWZYRWR1cUhvT0piVVJaUnciIHk9Ii0zOTciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFWTI5ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E4NUU5MDAwOCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFWTI5LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hFWTI5dWZYRWR1cUhvT0piVVJaUnciIHg9IjYiIHk9Ii0xNjgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFWTItT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBODVFOTAwMDgiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVkyLXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEVZMi1lZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTI3IiB5PSIxMDkzIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVkyLS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTg1RTkwMDBBIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVZMl9lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFWTJfdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEVZMl9PZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVZMl8tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTg1RTkwMDA4Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVZM0FlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFWTNBdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEVZM0FPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVZM0EtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBODVFOTAwMEEiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVkzQmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEVZM0J1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRVkzQk9mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVkzQi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTg1RTkwMDA4Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVZM0NlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEVZM0N1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRVkzQ09mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IRVkyNmVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IRVkyNnVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMjAzOCwgMTU5LCAxNTgsIC0yODA0XSRbLTI2OTksIDE1OSwgLTUwMywgLTI4MDRdJFstMjY5OSwgMjQ2MCwgLTUwMywgLTUwM10iLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEVZM0MtZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E4NUFFMDJDRSIgc291cmNlPSJfSEVZMnItZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEVZMnotZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVkzRHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVkzRU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFWTNFZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEVZM0QtZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEVZM0RPZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEVZM0RlZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbNTQxLCAtNTc1LCAtMTU5MSwgMjQ3Ml0kWzU0MSwgLTIyNzcsIC0xNTkxLCA3NzBdIi8+DQotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRVkzRXVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hFWTNFLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IRVkzRk9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3OTU2MjQwMTdFIiBzb3VyY2U9Il9IRVBzdi1mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IRVkyei1mWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFWTNGLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFWTNHZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVZM0d1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRVkzR09mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IRVkzRmVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IRVkzRnVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9Ils4OTksIC03OTQsIC00MjQsIDc2OTldJFs4OTksIC03NzI2LCAtNDI0LCA3NjddIi8+DQotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRVkzRy1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hFWTNIT2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IRVkzSGVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI5NEVDMkIwMUNBIiBzb3VyY2U9Il9IRVBzOHVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IRVkyei1mWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFaW5jT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFaW5jdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVpbmMtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRWluY2VmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IRVkzSHVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IRVkzSC1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9Ils3NDEsIC00NzcsIDcyNDksIDE5NThdJFs3NDEsIC0zNDEzLCA3MjQ5LCAtOTc4XSRbLTQzNjUsIC0zNDEzLCAyMTQzLCAtOTc4XSIvPg0KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEVpbmRPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRWluZGVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEVpbmR1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMDA1ODNCMDFFNiIgc291cmNlPSJfSEVQdEMtZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEVZMnotZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRWluZWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRWluZS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFaW5mT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEVpbmV1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEVpbmQtZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEVpbmVPZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTE3MDEsIC03MzYsIDYzNSwgNTIwN10kWy0xNzAxLCAtNTE3MywgNjM1LCA3NzBdIi8+DQotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRWluZmVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hFaW5mdWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IRWluZi1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDU1RTY1MEMwMEE2IiBzb3VyY2U9Il9IRVkyei1mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IRVkydi1mWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFaW5ndWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFaW5oT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVpbmhlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRWluZy1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRWluaHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQ1NUU2NTBEMDAzNyI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFaW5pT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRWluaC1mWEVkdXFIb09KYlVSWlJ3IiB5PSIzOTYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFaW5pZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQ1NUU2NTBEMDAzNyI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFaW5pLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEVpbml1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTM5NyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVpbmpPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDU1RTY1MEQwMDA1Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVpbmp1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEVpbmplZlhFZHVxSG9PSmJVUlpSdyIgeD0iNjgyIiB5PSIxNzkiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFaW5qLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0NTVFNjUwRDAwMDUiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRWlua2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEVpbmtPZlhFZHVxSG9PSmJVUlpSdyIgeD0iNjgyIiB5PSItMjAzMSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVpbmt1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQ1NUU2NTBEMDAzNyI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFaW5sT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRWlubGVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hFaW5rLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFaW5sdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQ1NUU2NTBEMDAwNSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFaW5tT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRWlubWVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hFaW5sLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFaW5tdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDU1RTY1MEQwMDM3Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVpbm5PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFaW5uZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEVpbm0tZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVpbm51ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQ1NUU2NTBEMDAwNSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFaW5vT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFaW5vZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEVpbm4tZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEVpbmdPZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEVpbmdlZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTIxNzAsIC05NzgsIDE5MDUsIC03NTkzXSRbLTU1NTcsIC05NzgsIC0xNDgyLCAtNzU5M10kWy01NTU3LCA2MTEyLCAtMTQ4MiwgLTUwM10iLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEVpbm91ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQ1NUU2NjdBMDBEOSIgc291cmNlPSJfSEVZMnYtZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEVGN2xlZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRWlucGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRWlucC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFaW5xT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEVpbnB1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEVpbm8tZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEVpbnBPZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTIzMjgsIC0xNTksIC02MDMyLCA5ODY5XSRbLTI2NzEsIC0xNTksIC02Mzc1LCA5ODY5XSRbLTI2NzEsIC0xMDEzMywgLTYzNzUsIC0xMDVdJFsxNzQ3LCAtMTAxMzMsIC0xOTU3LCAtMTA1XSIvPg0KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEVpbnFlZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRWlucXVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSG16bEVNVlVFZHkybXVRMlBRdkhfQSIgZWxlbWVudD0iX0htcWJJTVZVRWR5Mm11UTJQUXZIX0EiIHNvdXJjZT0iXzJoMjlzY1ZRRWR5Mm11UTJQUXZIX0EiIHRhcmdldD0iX0hFUHNyLWZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSG16bEU4VlVFZHkybXVRMlBRdkhfQSIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSG16bEZjVlVFZHkybXVRMlBRdkhfQSIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IbXpsRnNWVUVkeTJtdVEyUFF2SF9BIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSG16bEZNVlVFZHkybXVRMlBRdkhfQSIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSG16bEVjVlVFZHkybXVRMlBRdkhfQSIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSG16bEVzVlVFZHkybXVRMlBRdkhfQSIgcG9pbnRzPSJbMjUsIDgsIC0xMzIsIC02M10kWzc1LCAyMSwgLTgyLCAtNTBdIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX000Rm1rTVZXRWR5Mm11UTJQUXZIX0EiIGVsZW1lbnQ9Il9NM3lFa01WV0VkeTJtdVEyUFF2SF9BIiBzb3VyY2U9Il9IRVkyei1mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il8yaDI5c2NWUUVkeTJtdVEyUFF2SF9BIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX000Rm1rOFZXRWR5Mm11UTJQUXZIX0EiIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX000Rm1sY1ZXRWR5Mm11UTJQUXZIX0EiIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfTTRGbWxzVldFZHkybXVRMlBRdkhfQSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX000Rm1sTVZXRWR5Mm11UTJQUXZIX0EiIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX000Rm1sOFZXRWR5Mm11UTJQUXZIX0EiIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il9NMzcxa01WV0VkeTJtdVEyUFF2SF9BIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfTTRGbW1jVldFZHkybXVRMlBRdkhfQSIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX000Rm1tTVZXRWR5Mm11UTJQUXZIX0EiIHg9Ii0yNyIgeT0iMTg1Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9NNEZtbXNWV0VkeTJtdVEyUFF2SF9BIiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iX00zNzFrTVZXRWR5Mm11UTJQUXZIX0EiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9NNEZtbk1WV0VkeTJtdVEyUFF2SF9BIiB0eXBlPSJUb1JvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX000Rm1tOFZXRWR5Mm11UTJQUXZIX0EiIHk9Ii0zOTciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX000Rm1uY1ZXRWR5Mm11UTJQUXZIX0EiIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iX00zeUVrY1ZXRWR5Mm11UTJQUXZIX0EiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9NNEZtbjhWV0VkeTJtdVEyUFF2SF9BIiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9NNEZtbnNWV0VkeTJtdVEyUFF2SF9BIiB4PSItMTMzIiB5PSIxODUiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX000Rm1vTVZXRWR5Mm11UTJQUXZIX0EiIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il9NM3lFa2NWV0VkeTJtdVEyUFF2SF9BIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfTTRGbW9zVldFZHkybXVRMlBRdkhfQSIgdHlwZT0iRnJvbVJvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX000Rm1vY1ZXRWR5Mm11UTJQUXZIX0EiIHg9Ii0yMTIiIHk9Ii01MjkiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX000Rm1vOFZXRWR5Mm11UTJQUXZIX0EiIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il9NMzcxa01WV0VkeTJtdVEyUFF2SF9BIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfTTRGbXBjVldFZHkybXVRMlBRdkhfQSIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX000Rm1wc1ZXRWR5Mm11UTJQUXZIX0EiLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfTTRGbXBNVldFZHkybXVRMlBRdkhfQSIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfTTRGbXA4VldFZHkybXVRMlBRdkhfQSIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfTTN5RWtjVldFZHkybXVRMlBRdkhfQSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX000Rm1xY1ZXRWR5Mm11UTJQUXZIX0EiIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9NNEZtcXNWV0VkeTJtdVEyUFF2SF9BIi8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX000Rm1xTVZXRWR5Mm11UTJQUXZIX0EiIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX000Rm1xOFZXRWR5Mm11UTJQUXZIX0EiIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfTTM3MWtNVldFZHkybXVRMlBRdkhfQSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX000Rm1yY1ZXRWR5Mm11UTJQUXZIX0EiIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9NNEZtcnNWV0VkeTJtdVEyUFF2SF9BIi8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX000Rm1yTVZXRWR5Mm11UTJQUXZIX0EiIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX000Rm1yOFZXRWR5Mm11UTJQUXZIX0EiIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il9NM3lFa2NWV0VkeTJtdVEyUFF2SF9BIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfTTRGbXNjVldFZHkybXVRMlBRdkhfQSIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfTTRGbXNzVldFZHkybXVRMlBRdkhfQSIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9NNEZtc01WV0VkeTJtdVEyUFF2SF9BIiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9NNEZta2NWV0VkeTJtdVEyUFF2SF9BIiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9NNEZta3NWV0VkeTJtdVEyUFF2SF9BIiBwb2ludHM9IlsxMjk2LCAxMDg1LCAtMTcyMCwgLTI4MzFdJFsxMjk2LCAzMzg3LCAtMTcyMCwgLTUyOV0iLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRWlBVHdNbm9FZHlOMGNvZEVYYVI2ZyIgZWxlbWVudD0iX0VnMEE4TW5vRWR5TjBjb2RFWGFSNmciIHNvdXJjZT0iXzJoMjlzY1ZRRWR5Mm11UTJQUXZIX0EiIHRhcmdldD0iXzl2d1pVTW5tRWR5TjBjb2RFWGFSNmciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRWlBVHc4bm9FZHlOMGNvZEVYYVI2ZyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRWlBVHhjbm9FZHlOMGNvZEVYYVI2ZyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9FaUFUeHNub0VkeU4wY29kRVhhUjZnIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRWlBVHhNbm9FZHlOMGNvZEVYYVI2ZyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRWlLRXdNbm9FZHlOMGNvZEVYYVI2ZyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iX0VnOXg4Y25vRWR5TjBjb2RFWGFSNmciPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9FaUtFd3Nub0VkeU4wY29kRVhhUjZnIiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRWlLRXdjbm9FZHlOMGNvZEVYYVI2ZyIgeD0iLTI3IiB5PSIyODkiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0VpS0V3OG5vRWR5TjBjb2RFWGFSNmciIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfRWc5eDhjbm9FZHlOMGNvZEVYYVI2ZyI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0VpS0V4Y25vRWR5TjBjb2RFWGFSNmciIHR5cGU9IlRvUm9sZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRWlLRXhNbm9FZHlOMGNvZEVYYVI2ZyIgeT0iLTM5NyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRWlLRXhzbm9FZHlOMGNvZEVYYVI2ZyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfRWcwQThjbm9FZHlOMGNvZEVYYVI2ZyI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0VpS0V5TW5vRWR5TjBjb2RFWGFSNmciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0VpS0V4OG5vRWR5TjBjb2RFWGFSNmciIHg9Ii0yNiIgeT0iLTIxMyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRWlLRXljbm9FZHlOMGNvZEVYYVI2ZyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iX0VnMEE4Y25vRWR5TjBjb2RFWGFSNmciPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9FaUtFeThub0VkeU4wY29kRVhhUjZnIiB0eXBlPSJGcm9tUm9sZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRWlLRXlzbm9FZHlOMGNvZEVYYVI2ZyIgeD0iNTQiIHk9IjE5ODIiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0VpS0V6TW5vRWR5TjBjb2RFWGFSNmciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il9FZzl4OGNub0VkeU4wY29kRVhhUjZnIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRWlLRXpzbm9FZHlOMGNvZEVYYVI2ZyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0VpS0V6OG5vRWR5TjBjb2RFWGFSNmciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRWlLRXpjbm9FZHlOMGNvZEVYYVI2ZyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRWlLRTBNbm9FZHlOMGNvZEVYYVI2ZyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfRWcwQThjbm9FZHlOMGNvZEVYYVI2ZyI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0VpS0Uwc25vRWR5TjBjb2RFWGFSNmciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9FaUtFMDhub0VkeU4wY29kRVhhUjZnIi8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0VpS0UwY25vRWR5TjBjb2RFWGFSNmciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0VpS0UxTW5vRWR5TjBjb2RFWGFSNmciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfRWc5eDhjbm9FZHlOMGNvZEVYYVI2ZyI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0VpS0Uxc25vRWR5TjBjb2RFWGFSNmciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9FaUtFMThub0VkeU4wY29kRVhhUjZnIi8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0VpS0UxY25vRWR5TjBjb2RFWGFSNmciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0VpS0UyTW5vRWR5TjBjb2RFWGFSNmciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il9FZzBBOGNub0VkeU4wY29kRVhhUjZnIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRWlLRTJzbm9FZHlOMGNvZEVYYVI2ZyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRWlLRTI4bm9FZHlOMGNvZEVYYVI2ZyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9FaUtFMmNub0VkeU4wY29kRVhhUjZnIiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9FaUFUd2Nub0VkeU4wY29kRVhhUjZnIiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9FaUFUd3Nub0VkeU4wY29kRVhhUjZnIiBwb2ludHM9Ils2NjEsIC0xNTgsIC0yNDYxLCAzMTc1XSRbMTQ1NSwgLTE1OCwgLTE2NjcsIDMxNzVdJFsxNDU1LCAtMjgzMSwgLTE2NjcsIDUwMl0iLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfTG5BQWdjbm9FZHlOMGNvZEVYYVI2ZyIgZWxlbWVudD0iX0xuQUFnTW5vRWR5TjBjb2RFWGFSNmciIHNvdXJjZT0iXzl2d1pVTW5tRWR5TjBjb2RFWGFSNmciIHRhcmdldD0iX0hFRjdoZWZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfTG5KeGdNbm9FZHlOMGNvZEVYYVI2ZyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfTG5KeGdzbm9FZHlOMGNvZEVYYVI2ZyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9Mbkp4Zzhub0VkeU4wY29kRVhhUjZnIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfTG5KeGdjbm9FZHlOMGNvZEVYYVI2ZyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfTG5BQWdzbm9FZHlOMGNvZEVYYVI2ZyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGp1bXBMaW5rU3RhdHVzPSJBbGwiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfTG5BQWc4bm9FZHlOMGNvZEVYYVI2ZyIgcG9pbnRzPSJbMiwgLTIwLCAtMzksIDk1XSRbLTc3LCAtMTExLCAtMTE4LCA0XSIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICA8L2NvbnRlbnRzPg0KLSAgICAgICAgICA8L2VBbm5vdGF0aW9ucz4NCi0gICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HcnFOWWVmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjYyIj4NCi0gICAgICAgICAgICA8Ym9keT4wMTwvYm9keT4NCi0gICAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgICAgIDxwYWNrYWdlTWVyZ2UgeG1pOmlkPSJfbm95VE1PeGdFZHVIamUzcFBhaE40QSIgbWVyZ2VkUGFja2FnZT0iXzNBREM3Qjc0MDIyRDQxRERGODY5MDEyRSIvPg0KLSAgICAgICAgICA8cGFja2FnZU1lcmdlIHhtaTppZD0iX2M2dGRrT3g1RWR1NS12VmpsZlZzZlEiIG1lcmdlZFBhY2thZ2U9Il8zQURDN0I3NDAyMkQ0MTE5QTYyQjAzNkYiLz4NCi0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyODAiIG5hbWU9Ik1ldGhvZEVsZW1lbnQiIGlzQWJzdHJhY3Q9InRydWUiPg0KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3JxTlotZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI4MCI+DQotICAgICAgICAgICAgICA8Ym9keT5FdmVyeSBjbGFzcyBkZWZpbmVkIGluIHRoaXMgc3BlY2lmaWNhdGlvbiBpcyBkZXJpdmVkIGZyb20gTWV0aG9kIEVsZW1lbnQuICBJbiBvdGhlciB3b3JkcyBNZXRob2QgRWxlbWVudCBpcyB0aGUgcm9vdCBnZW5lcmFsaXphdGlvbiBmb3IgYWxsIFVNQSBjbGFzc2VzIGFuZCBkZWZpbmVzIGEgY29tbW9uIHNldCBvZiBhdHRyaWJ1dGVzIGluaGVyaXRlZCBieSBldmVyeSBvdGhlciBlbGVtZW50IHR5cGUgb2YgdGhpcyBtb2RlbC4gIE1ldGhvZCBFbGVtZW50IGl0c2VsZiBpcyBkZXJpdmVkIGZyb20gUGFja2FnZWFibGUgRWxlbWVudCBmcm9tIHRoZSBVTUwgMi4wIEluZnJhc3RydWN0dXJlLiAgTWV0aG9kIEVsZW1lbnQgaW5oZXJpdHMgdGhlIE5hbWUgYXR0cmlidXRlIGZyb20gUGFja2FnZWFibGUgRWxlbWVudCdzIHN1cGVyIGNsYXNzLiAgRXZlcnkgZWxlbWVudCBkZWZpbmVkIGFzIGEgVU1BIGluc3RhbmNlIGlzIGRlcml2ZWQgZnJvbSBNb2RlbCBFbGVtZW50LiAgRXZlcnkgTWV0aG9kIEVsZW1lbnQgaW4tc3RhbmNlIGlzIGF0IGxlYXN0IGRlZmluZWQgYnkgYSB1bmlxdWUgaWQsIGEgbmFtZSwgYXMgd2VsbCBhcyBicmllZiBkZXNjcmlwdGlvbi48L2JvZHk+DQotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxRUMzMzRGMDE5OCIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQxRERFODMzMDFBNSIvPg0KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAwNTAiIG5hbWU9Imd1aWQiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyI+DQotICAgICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dycU5hLWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAwNTAiPg0KLSAgICAgICAgICAgICAgICA8Ym9keT5FdmVyeSBpbnN0YW5jZSBvZiBNZXRob2QgRWxlbWVudCBoYXMgYSBnbG9iYWwgdW5pcXVlIGlkLjwvYm9keT4NCi0gICAgICAgICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfNjlBV0VleUZFZHU1LXZWamxmVnNmUSIgdmFsdWU9IjEiLz4NCi0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iXzY5QVdFT3lGRWR1NS12VmpsZlZzZlEiLz4NCi0gICAgICAgICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il84elVYY095RkVkdTUtdlZqbGZWc2ZRIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIiB2YWx1ZT0iIi8+DQotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGOUFCOTgwMkI5IiBuYW1lPSJwcmVzZW50YXRpb25OYW1lIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiPg0KLSAgICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9Hc0c1Vi1mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGOUFCOTgwMkI5Ij4NCi0gICAgICAgICAgICAgICAgPGJvZHk+RXZlcnkgRGVzY3JpYmFibGUgRWxlbWVudCBoYXMgYSBwcmVzZW50YXRpb24gbmFtZSwgd2hpY2ggaXMgdXNlZCBmb3IgZXh0ZXJuYWwgcHJlc2VudGF0aW9uIG9mIHRoZSBlbGVtZW50LiAgRm9yIGV4YW1wbGUsIG5hbWUgKHRoZSBpbnRlcm5hbCByZXByZXNlbnRhdGlvbikgbWlnaHQgYmUgc2V0IHRvICZxdW90O3J1cF9hcmNoaXRlY3R1cmVfZG9jdW1lbnQmcXVvdDsgdG8gZGlmZmVyZW50aWF0ZSBmcm9tIGEgJnF1b3Q7ajJlZV9hcmNoaXRjdHVyZV9kb2N1bWVudCZxdW90OyB3aGVyZWFzIHRoZSBleHRlcm5hbCBwcmVzZW50YXRpb24gd291bGQgYWx3YXlzIGJlICZxdW90O0FyY2hpdGVjdHVyZSBEb2N1bWVudCZxdW90Oy4NCi08L2JvZHk+DQotICAgICAgICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iXzRYd0xFZXlGRWR1NS12VmpsZlZzZlEiIHZhbHVlPSIxIi8+DQotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il80WHdMRU95RkVkdTUtdlZqbGZWc2ZRIi8+DQotICAgICAgICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfNXNaQ3dPeUZFZHU1LXZWamxmVnNmUSIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyIgdmFsdWU9IiIvPg0KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDA0NyIgbmFtZT0iYnJpZWZEZXNjcmlwdGlvbiIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIj4NCi0gICAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3JxTmJ1ZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDA0NyI+DQotICAgICAgICAgICAgICAgIDxib2R5PkV2ZXJ5IGluc3RhbmNlIG9mIE1ldGhvZCBFbGVtZW50IHNoYWxsIGJlIGJyaWVmbHkgZGVzY3JpYmVkIHdpdGggb25lIG9yIHR3byBzZW50ZW5jZXMgc3VtbWFyaXppbmcgdGhlIGVsZW1lbnQuPC9ib2R5Pg0KLSAgICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9SOElac2V5RkVkdTUtdlZqbGZWc2ZRIiB2YWx1ZT0iMSIvPg0KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfUjhJWnNPeUZFZHU1LXZWamxmVnNmUSIvPg0KLSAgICAgICAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iX1RHQ29FT3lGRWR1NS12VmpsZlZzZlEiIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiIHZhbHVlPSIiLz4NCi0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MjdBODVFOTAwMDgiIG5hbWU9Im93bmVkUnVsZXMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQyN0E4NTdCMDMzMyIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MjdBODVFNzAwNTIiPg0KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3NRRFF1ZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4NCi0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0dzUURRZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0NTVFNjUwRDAwMDUiIG5hbWU9Im1ldGhvZEVsZW1lbnRQcm9wZXJ0eSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDU1RTYyMDIwMzJBIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQ1NUU2NTBDMDBBNiI+DQotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9Hc1owUi1mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3NaMFJ1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX00zeUVrY1ZXRWR5Mm11UTJQUXZIX0EiIG5hbWU9ImtpbmQiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzJoMjlzTVZRRWR5Mm11UTJQUXZIX0EiIGFzc29jaWF0aW9uPSJfTTN5RWtNVldFZHkybXVRMlBRdkhfQSI+DQotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9NM3lFazhWV0VkeTJtdVEyUFF2SF9BIiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfTTN5RWtzVldFZHkybXVRMlBRdkhfQSIvPg0KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI2QyIgbmFtZT0iQ29udGVudEVsZW1lbnQiIGlzQWJzdHJhY3Q9InRydWUiPg0KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3J6WFV1ZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI2QyI+DQotICAgICAgICAgICAgICA8Ym9keT5Db250ZW50IEVsZW1lbnQgaXMgYSBEZXNjcmliYWJsZSBFbGVtZW50IHRoYXQgcmVwcmVzZW50cyBhbiBhYnN0cmFjdCBnZW5lcmFsaXphdGlvbiBmb3IgYWxsIGVsZW1lbnRzIHRoYXQgYXJlIGNvbnNpZGVyZWQgdG8gYmUgYW5kIG1hbmFnZWQgYXMgTWV0aG9kIENvbnRlbnQuDQotQ29udGVudCBFbGVtZW50cyByZXByZXNlbnRzIHJldXNhYmxlIE1ldGhvZCBDb250ZW50IHRoYXQgaXMgc3VwcG9zZWQgdG8gYmUgbWFuYWdlZCBpbiBDb250ZW50IFBhY2thZ2VzLiAgVGhlIHNlcGFyYXRpb24gb2YgQ29udGVudCBFbGVtZW50IGZyb20gUHJvY2VzcyBFbGVtZW50IGFsbG93cyB0byBjbGVhcmx5IGRpc3Rpbmd1aXNoIGJldHdlZW4gcHVyZSBtZXRob2QgY29udGVudCBmcm9tIGNvbnRlbnQgdGhhdCBpcyByZXByZXNlbnRlZCBpbiBwcm9jZXNzZXMuDQotPC9ib2R5Pg0KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0Mjk0RUM0QTAzMDYiIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0Mjk0RUI5MDAwRkMiLz4NCi0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDFERTRBOTcwMTIzIiBuYW1lPSJDb250ZW50RGVzY3JpcHRpb24iPg0KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3J6WFZ1ZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREU0QTk3MDEyMyI+DQotICAgICAgICAgICAgICA8Ym9keT5Db250ZW50IERlc2NyaXB0aW9uIGlzIGEgTWV0aG9kIEVsZW1lbnQgdGhhdCBpcyB1c2VkIHRvIHN0b3JlIHRoZSB0ZXh0dWFsIGRlc2NyaXB0aW9uIGZvciBhIENvbnRlbnQgRWxlbWVudC4gIEl0IGRlZmluZXMgc3RhbmRhcmQgYXR0cmlidXRlcyBhcHBsaWNhYmxlIGZvciBhbGwgQ29udGVudCBFbGVtZW50IHR5cGVzLiAgU3BlY2lmaWMgQ29udGVudCBFbGVtZW50IHN1Yi10eXBlcyBjYW4gZGVmaW5lIHRoZWlyIG93biBtYXRjaGluZyBDb250ZW50IERlc2NyaXB0aW9uIHN1Yi10eXBlcy4gPC9ib2R5Pg0KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MjAwNTgzQjAxRTYiIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyODAiLz4NCi0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDFERjMyMTkwMDI5IiBuYW1lPSJtYWluRGVzY3JpcHRpb24iIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyI+DQotICAgICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dyelhXdWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURGMzIxOTAwMjkiPg0KLSAgICAgICAgICAgICAgICA8Ym9keT5UaGlzIGF0dHJpYnV0ZSBzdG9yZSB0aGUgbWFpbiBkZXNjcmlwdGl2ZSB0ZXh0IGZvciB0aGUgQ29udGVudCBFbGVtZW50LiAgQWxsIHRleHQgdGhhdCBpcyBub3QgcGFydCBvZiBhbnkgb2YgdGhlIG1vcmUgc3BlY2lmaWMgYXR0cmlidXRlcyBzaGFsbCBiZSBzdG9yZWQgaGVyZS4gIElmIHRoZSBDb250ZW50IERlc2NyaXB0aW9uIGlzIGRpdmlkZWQgaW50byBzZWN0aW9ucyB1c2luZyB0aGUgU2VjdGlvbiBjbGFzcywgdGhlbiBvbmx5IHRoZSB0ZXh0IGZyb20gdGhlICdzdGFydCcgb2YgdGhlIGNvbnRlbnQgZGVzY3JpcHRpb24gdG8gdGhlIGZpcnN0IHNlY3Rpb24gd2lsbCBiZSBzdG9yZWQgaGVyZSAoc2ltaWxhciB0byBhIG5vcm1hbCBkb2N1bWVudCB3aGVyZSB5b3UgY2FuIHBsYWNlIHRleHQgYmV0d2VlbiBpdHMgYmVnaW5uaW5nIHRvIGl0cyBmaXJzdCBkaWN0aW9uIGhlYWRpbmcpLjwvYm9keT4NCi0gICAgICAgICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfM1UxMU1leUlFZHU1LXZWamxmVnNmUSIgdmFsdWU9IjEiLz4NCi0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iXzNVMTFNT3lJRWR1NS12VmpsZlZzZlEiLz4NCi0gICAgICAgICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il8zTnNFVU95SUVkdTUtdlZqbGZWc2ZRIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIiB2YWx1ZT0iIi8+DQotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDIxRTREQUQwMDREIiBuYW1lPSJzZWN0aW9ucyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDIxRTRDRjMwMUFFIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQyMUU0REFDMDFBMCI+DQotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9Hc1FEU2VmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3NRRFNPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyMUU0Q0YzMDFBRSIgbmFtZT0iU2VjdGlvbiI+DQotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HcnpYWGVmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRTRDRjMwMUFFIj4NCi0gICAgICAgICAgICAgIDxib2R5PkEgU2VjdGlvbiBpcyBhIHNwZWNpYWwgTWV0aG9kIEVsZW1lbnQgdGhhdCByZXByZXNlbnRzIHN0cnVjdHVyYWwgc3Vic2VjdGlvbnMgb2YgYSBDb250ZW50IERlc2NyaXB0aW9uJ3Mgc2VjdGlvbkRlc2NyaXB0aW9uIGF0dHJpYnV0ZS4gIEl0IGlzIHVzZWQgZm9yIGVpdGhlciBsYXJnZSBzY2FsZSBkb2N1bWVudGF0aW9uIG9mIENvbnRlbnQgRWxlbWVudHMgb3JnYW5pemVkIGludG8gc2VjdGlvbnMgYXMgd2VsbCBhcyB0byBmbGV4aWJseSBhZGQgbmV3IFNlY3Rpb25zIHRvIENvbnRlbnQgRWxlbWVudHMgdXNpbmcgY29udHJpYnV0aW9uIHZhcmlhYmlsaXR5IGFkZGVkIHRvIHRoZSBTZWN0aW9uIGNvbmNlcHQgZm9yIE1ldGhvZCBQbHVnLWlucy48L2JvZHk+DQotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyNzk1NjI0MDE3RSIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI4MCIvPg0KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0Mjc5NjI1RDAyMzQiIG5hbWU9InNlY3Rpb25OYW1lIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiPg0KLSAgICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HcjlJVS1mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3OTYyNUQwMjM0Ij4NCi0gICAgICAgICAgICAgICAgPGJvZHk+RXZlcnkgU2VjdGlvbiBoYXMgYSBuYW1lIHVzZWQgZm9yIGV4dGVybmFsIHByZXNlbnRhdGlvbiBvZiB0aGUgc2VjdGlvbiwgZS5nLiB3aGVuIHB1Ymxpc2hlZCBvciB3aGVuIHNlY3Rpb24gaGVhZGluZyBhcmUgbGlzdGVkIGluIGEgdGFibGUgb2YgY29udGVudHMuICBUaGlzIGF0dHJpYnV0ZSBpcyBzaW1pbGFyIHRvIFByZXNlbnRhdGlvbiBOYW1lIGZvciBDb250ZW50IEVsZW1lbnRzLjwvYm9keT4NCi0gICAgICAgICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfbzFWVUlleUhFZHU1LXZWamxmVnNmUSIgdmFsdWU9IjEiLz4NCi0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX28xVlVJT3lIRWR1NS12VmpsZlZzZlEiLz4NCi0gICAgICAgICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il9vdGI4WU95SEVkdTUtdlZqbGZWc2ZRIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIiB2YWx1ZT0iIi8+DQotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDIxRTRERjMwMDNBIiBuYW1lPSJzZWN0aW9uRGVzY3JpcHRpb24iIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyI+DQotICAgICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dyOUlWdWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjFFNERGMzAwM0EiPg0KLSAgICAgICAgICAgICAgICA8Ym9keT5UaGlzIGF0dHJpYnV0ZXMgc3RvcmUgdGhlIGRlc2NyaXB0aW9uIHRleHQgZm9yIGEgQ29udGVudCBEZXNjcmlwdGlvbidzIFNlY3Rpb24uPC9ib2R5Pg0KLSAgICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il81UFZMOGV5SUVkdTUtdlZqbGZWc2ZRIiB2YWx1ZT0iMSIvPg0KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfNVBWTDhPeUlFZHU1LXZWamxmVnNmUSIvPg0KLSAgICAgICAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iXzVIdXZJT3lJRWR1NS12VmpsZlZzZlEiIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiIHZhbHVlPSIiLz4NCi0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MjFFNEUzRDAzNjIiIG5hbWU9InN1YlNlY3Rpb25zIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MjFFNENGMzAxQUUiIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDIxRTRFM0IwMzE5Ij4NCi0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0dzUURVdWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+DQotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9Hc1FEVWVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDI3QTg1N0IwMzMzIiBuYW1lPSJDb25zdHJhaW50Ij4NCi0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dyOUlXZWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBODU3QjAzMzMiPg0KLSAgICAgICAgICAgICAgPGJvZHk+QSBDb25zdHJhaW50IGlzIGEgTWV0aG9kIEVsZW1lbnQgdGhhdCByZXByZXNlbnRzIGEgY29uZGl0aW9uIG9yIHJlc3RyaWN0aW9uIGV4cHJlc3NlZCBpbiBuYXR1cmFsIGxhbmd1YWdlIHRleHQgb3IgaW4gYSBtYWNoaW5lIHJlYWRhYmxlIGxhbmd1YWdlIGZvciB0aGUgcHVycG9zZSBvZiBkZWNsYXJpbmcgc29tZSBvZiB0aGUgc2VtYW50aWNzIG9mIGEgTWV0aG9kIEVsZW1lbnQuPC9ib2R5Pg0KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MjdBODVBRTAyQ0UiIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyODAiLz4NCi0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDI3QThBMUYwMkYzIiBuYW1lPSJib2R5IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiPg0KLSAgICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HcjlJWGVmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QThBMUYwMkYzIj4NCi0gICAgICAgICAgICAgICAgPGJvZHk+VGhpcyBhdHRyaWJ1dGUgc3RvcmVzIHRoZSBkZWZpbml0aW9uIG9mIHRoZSBjb25zdHJhaW50LjwvYm9keT4NCi0gICAgICAgICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfOHBpVDRleUdFZHU1LXZWamxmVnNmUSIgdmFsdWU9IjEiLz4NCi0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iXzhwaVQ0T3lHRWR1NS12VmpsZlZzZlEiLz4NCi0gICAgICAgICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il84Z2NwVU95R0VkdTUtdlZqbGZWc2ZRIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIiB2YWx1ZT0iIi8+DQotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDI5NEVCOTAwMEZDIiBuYW1lPSJEZXNjcmliYWJsZUVsZW1lbnQiIGlzQWJzdHJhY3Q9InRydWUiPg0KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3NHNVV1ZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyOTRFQjkwMDBGQyI+DQotICAgICAgICAgICAgICA8Ym9keT5EZXNjcmliYWJsZSBFbGVtZW50IGlzIGFuIGFic3RyYWN0IGdlbmVyYWxpemF0aW9uIG9mIE1ldGhvZCBFbGVtZW50cyBmb3Igd2hpY2ggZXh0ZXJuYWwgcHJlc2VudGF0aW9uIG5hbWVzIGFzIHdlbGwgYXMgY29udGVudCBkZXNjcmlwdGlvbnMgaGF2ZSBiZWVuIGRlZmluZWQsIHN1Y2ggYXMgUm9sZXMgb3IgV29yayBQcm9kdWN0cy4gIFByZXNlbnRhdGlvbiBOYW1lIGFuZCBDb250ZW50IERlc2NyaXB0aW9ucyBhcmUgdHlwaWNhbGx5IGxvY2FsaXplZCB1c2luZyBhIHJlc291cmNlIGFsbG9jYXRpb24gbWVjaGFuaXNtIGZvciBpdHMgU3RyaW5nIHR5cGUgYXR0cmlidXRlcy4NCi1UaGlzIGFic3RyYWN0aW9uIHJlcHJlc2VudHMgYWxsIGVsZW1lbnRzIGluIHRoZSBNZXRob2QgQ29udGVudCBhcyB3ZWxsIGFzIFByb2Nlc3Mgc3BhY2UgZm9yIHdoaWNoIGNvbmNyZXRlIHRleHR1YWwgZGVzY3JpcHRpb25zIGFyZSBkZWZpbmVkIGluIHRoZSBmb3JtIG9mIGRvY3VtZW50aW5nIGF0dHJpYnV0ZXMgZ3JvdXBlZCBpbiBhIG1hdGNoaW5nIENvbnRlbnQgRGVzY3JpcHRpb24gaW5zdGFuY2UgKHNlZSBTZWN0aW9uIDQuMS40KS4gIERlc2NyaWJhYmxlIEVsZW1lbnRzIGFyZSBpbnRlbmRlZCB0byBiZSBwdWJsaXNoZWQgaW4gbWV0aG9kIG9yIHByb2Nlc3MgcHVibGljYXRpb25zIChzaW1pbGFyIHRvIHRoZSBJQk0gUmF0aW9uYWwgVW5pZmllZCBQcm9jZXNzIHdlYikuICBEZXNjcmliYWJsZSBFbGVtZW50IGRlZmluZXMgdGhhdCB0aGUgZWxlbWVudCBpdCByZXByZXNlbnRzIHdpbGwgaGF2ZSBjb250ZW50ICdhdHRhY2hlZCcgdG8gaXQuICBDb250ZW50IERlc2NyaXB0aW9uIGlzIHRoZSBhYnN0cmFjdGlvbiBmb3IgdGhlIGFjdHVhbCBwbGFjZXMgaW4gd2hpY2ggdGhlIGNvbnRlbnQgaXMgYmVpbmcgcmVwcmVzZW50ZWQuICBUaGlzIHNlcGFyYXRpb24gYWxsb3dzIGEgZGlzdGluY3Rpb24gYmV0d2VlbiBjb3JlIG1ldGhvZCBtb2RlbCBlbGVtZW50cyBkZXNjcmliaW5nIHRoZSBzdHJ1Y3R1cmUgb2YgdGhlIG1vZGVsIGZyb20gdGhlIGFjdHVhbCBkZXNjcmlwdGlvbiBjb250YWluZXIgcHJvdmlkaW5nLCBmb3IgZXhhbXBsZSwgdGhlIGRvY3VtZW50YXRpb24gb2YgdGhlIGNvbnRlbnQgZWxlbWVudCBpbiBkaWZmZXJlbnQgYWx0ZXJuYXRpdmVzIGxhbmd1YWdlcywgYXVkaWVuY2VzLCBsaWNlbnNpbmcgbGV2ZWxzLCBldGMuDQotPC9ib2R5Pg0KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0Mjk0RUMyNzAxMDYiIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0MURERTY1ODAxNTciLz4NCi0gICAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDI5NEVDMkIwMUNBIiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjgwIi8+DQotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyOTRFQzYwMDJCRiIgbmFtZT0icHJlc2VudGF0aW9uIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MURFNEE5NzAxMjMiIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDI5NEVDNjAwMkJEIj4NCi0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0dzWjBRLWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIxIi8+DQotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9Hc1owUXVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDU1RTYyMDIwMzJBIiBuYW1lPSJNZXRob2RFbGVtZW50UHJvcGVydHkiPg0KLSAgICAgICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0NTVFNjY3QTAwRDkiIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0MURERTgzMzAxQTUiLz4NCi0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDU1RTY1QzgwMjE4IiBuYW1lPSJ2YWx1ZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIj4NCi0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX2R5cjdnZXlHRWR1NS12VmpsZlZzZlEiIHZhbHVlPSIxIi8+DQotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9keXI3Z095R0VkdTUtdlZqbGZWc2ZRIi8+DQotICAgICAgICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfZG56aE1PeUdFZHU1LXZWamxmVnNmUSIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyIgdmFsdWU9IiIvPg0KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyN0E4NUU3MDA1MiIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDI3QTg1RTkwMDA4IF8zQURDN0I3NDAyMkQ0MjdBODVFOTAwMEEiPg0KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3NHNVhlZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E4NUU3MDA1MiI+DQotICAgICAgICAgICAgICA8Ym9keT5BIE1ldGhvZCBFbGVtZW50IGNhbiBvd24gbWFueSBDb25zdHJhaW50cyBkZWZpbmluZyBydWxlcyBmb3IgdGhpcyBlbGVtZW50LjwvYm9keT4NCi0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgICAgICA8b3duZWRFbmQgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDI3QTg1RTkwMDBBIiBuYW1lPSJfbWV0aG9kRWxlbWVudCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjgwIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDI3QTg1RTcwMDUyIi8+DQotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyMUU0REFDMDFBMCIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDIxRTREQUQwMDREIF8zQURDN0I3NDAyMkQ0MjFFNERBRDAwNTciPg0KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3NRRFJlZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMUU0REFDMDFBMCI+DQotICAgICAgICAgICAgICA8Ym9keT5BIENvbnRlbnQgRGVzY3JpcHRpb24gY2FuIG9wdGlvbmFsbHkgYmUgc3RydWN0dXJlIGludG8gU2VjdGlvbnMuICBUaGlzIGFzc29jaWF0aW9uIGlzIHVzZSB0byBkZWNvbXBvc2VkIFNlY3Rpb24gaW50byBhIGhpZXJhcmNoeSBvZiBTZWN0aW9ucy48L2JvZHk+DQotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyMUU0REFEMDA1NyIgbmFtZT0iX2NvbnRlbnREZXNjcmlwdGlvbiIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDFERTRBOTcwMTIzIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDIxRTREQUMwMUEwIj4NCi0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0dzUURUT2ZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIxIi8+DQotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9Hc1FEUy1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgPC9vd25lZEVuZD4NCi0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDIxRTRFM0IwMzE5IiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0MjFFNEUzRDAzNjIgXzNBREM3Qjc0MDIyRDQyMUU0RTNEMDM2NCI+DQotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9Hc1FEVHVmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRTRFM0IwMzE5Ij4NCi0gICAgICAgICAgICAgIDxib2R5PlNlY3Rpb25zIGNhbiBiZSBmdXJ0aGVyIGRlY29tcG9zZWQgaW50byBuIGxldmVscyBvZiBzdWItc2VjdGlvbnMuPC9ib2R5Pg0KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MjFFNEUzRDAzNjQiIG5hbWU9Il9zZWN0aW9uIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MjFFNENGMzAxQUUiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MjFFNEUzQjAzMTkiPg0KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3NRRFZlZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IjEiLz4NCi0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0dzUURWT2ZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIxIi8+DQotICAgICAgICAgICAgPC9vd25lZEVuZD4NCi0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDI5NEVDNjAwMkJEIiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0Mjk0RUM2MDAyQkUgXzNBREM3Qjc0MDIyRDQyOTRFQzYwMDJCRiI+DQotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9Hc1FEVi1mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDI5NEVDNjAwMkJEIj4NCi0gICAgICAgICAgICAgIDxib2R5PkEgRGVzY3JpYmFibGUgRWxlbWVudCBjYW4gY29udGFpbiBhIENvbnRlbnQgRGVzY3JpcHRpb24gZWxlbWVudCB0aGF0IHN0b3JlcyB0ZXh0dWFsIGRlc2NyaXB0aW9ucyBmb3IgdGhpcyBDb250ZW50IEVsZW1lbnQuICBDb250ZW50IERlc2NyaXB0aW9uIGlzIGludGVuZGVkIHRvIGJlIHJlZmluZWQgd2l0aCBzdWItY2xhc3NlcyBhZGRpbmcgbW9yZSBkZXNjcmlwdGlvbiBhdHRyaWJ1dGVzLiAgQW55IG9mIHRoZXNlIHN1Yi10eXBlcyBjYW4gYmUgcmVsYXRlZCB0byBhIENvbnRlbnQgRWxlbWVudC48L2JvZHk+DQotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyOTRFQzYwMDJCRSIgbmFtZT0iX2Rlc2NyaWJhYmxlRWxlbWVudCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDI5NEVCOTAwMEZDIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDI5NEVDNjAwMkJEIj4NCi0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0dzWjBRT2ZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIxIi8+DQotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9Hc1FEV3VmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iMSIvPg0KLSAgICAgICAgICAgIDwvb3duZWRFbmQ+DQotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQ1NUU2NTBDMDBBNiIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDU1RTY1MEQwMDA1IF8zQURDN0I3NDAyMkQ0NTVFNjUwRDAwMzciPg0KLSAgICAgICAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0NTVFNjUwRDAwMzciIG5hbWU9Il9tZXRob2RFbGVtZW50IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyODAiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0NTVFNjUwQzAwQTYiLz4NCi0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfMmgyOXNNVlFFZHkybXVRMlBRdkhfQSIgbmFtZT0iS2luZCI+DQotICAgICAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX0htcWJJTVZVRWR5Mm11UTJQUXZIX0EiIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyNkMiLz4NCi0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfRWcwQThjbm9FZHlOMGNvZEVYYVI2ZyIgbmFtZT0iYXBwbGljYWJsZU1ldGFDbGFzc0luZm8iIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzl2ZGVZTW5tRWR5TjBjb2RFWGFSNmciIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiIGFzc29jaWF0aW9uPSJfRWcwQThNbm9FZHlOMGNvZEVYYVI2ZyI+DQotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9FZzl4OE1ub0VkeU4wY29kRVhhUjZnIiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfRWcwQThzbm9FZHlOMGNvZEVYYVI2ZyIvPg0KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX00zeUVrTVZXRWR5Mm11UTJQUXZIX0EiIG1lbWJlckVuZD0iX00zeUVrY1ZXRWR5Mm11UTJQUXZIX0EgX00zNzFrTVZXRWR5Mm11UTJQUXZIX0EiPg0KLSAgICAgICAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il9NMzcxa01WV0VkeTJtdVEyUFF2SF9BIiBuYW1lPSIiIHZpc2liaWxpdHk9InByaXZhdGUiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyODAiIGFzc29jaWF0aW9uPSJfTTN5RWtNVldFZHkybXVRMlBRdkhfQSI+DQotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9NMzcxa3NWV0VkeTJtdVEyUFF2SF9BIiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfTTM3MWtjVldFZHkybXVRMlBRdkhfQSIvPg0KLSAgICAgICAgICAgIDwvb3duZWRFbmQ+DQotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzl2ZGVZTW5tRWR5TjBjb2RFWGFSNmciIG5hbWU9IkFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvIj4NCi0gICAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfTG5BQWdNbm9FZHlOMGNvZEVYYVI2ZyIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQxRERFNjU4MDE1NyIvPg0KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il9oY1FTQU1ubkVkeU4wY29kRVhhUjZnIiBuYW1lPSJpc1ByaW1hcnlFeHRlbnNpb24iIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzVHY1lBT2llRWR1UWJ1WTZVd01TUWciLz4NCi0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfRWcwQThNbm9FZHlOMGNvZEVYYVI2ZyIgbWVtYmVyRW5kPSJfRWcwQThjbm9FZHlOMGNvZEVYYVI2ZyBfRWc5eDhjbm9FZHlOMGNvZEVYYVI2ZyI+DQotICAgICAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iX0VnOXg4Y25vRWR5TjBjb2RFWGFSNmciIG5hbWU9IiIgdmlzaWJpbGl0eT0icHJpdmF0ZSIgdHlwZT0iXzJoMjlzTVZRRWR5Mm11UTJQUXZIX0EiIGFzc29jaWF0aW9uPSJfRWcwQThNbm9FZHlOMGNvZEVYYVI2ZyI+DQotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9FZzl4ODhub0VkeU4wY29kRVhhUjZnIiB2YWx1ZT0iMSIvPg0KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfRWc5eDhzbm9FZHlOMGNvZEVYYVI2ZyIgdmFsdWU9IjEiLz4NCi0gICAgICAgICAgICA8L293bmVkRW5kPg0KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOlBhY2thZ2UiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI5NCIgbmFtZT0iQ29yZUNvbnRlbnRFbGVtZW50cyI+DQotICAgICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfR3RUTU0tZlhFZHVxSG9PSmJVUlpSdyIgc291cmNlPSJ1bWwyLmRpYWdyYW1zIiByZWZlcmVuY2VzPSJfM0FEQzdCNzQwMjJENDBGNDhEREMwMkM3Ij4NCi0gICAgICAgICAgICA8Y29udGVudHMgeG1pOnR5cGU9Im5vdGF0aW9uOkRpYWdyYW0iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjQ4RERDMDJDNyIgdHlwZT0iQ2xhc3MiIG5hbWU9IlRheG9ub215Ij4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRWlucS1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMkRBIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFaW5ydWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IRWluci1mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRWluc09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRWluc2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRWluc3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFaW5zLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFaW50T2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFaW50ZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFaW50dWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFc1ljT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFc1ljZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFc1ljdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRXNZYy1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hFaW5yT2ZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJOb25lIiBsaW5lQ29sb3I9IjAiIHNob3dQYXJlbnQ9Ik5hbWUiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hFaW5yZWZYRWR1cUhvT0piVVJaUnciIHg9IjE3MjM5IiB5PSI4NTYxIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFc1lkT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyODAiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVzWWQtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hFc1llT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIyODI3IiBoZWlnaHQ9IjEwNDkiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFc1llZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFc1lldWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFc1llLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVzWWZPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEVzWWZlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVzWWZ1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEVzWWYtZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVzWWdPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEVzWWdlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVzWWd1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFc1lnLWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEVzWWRlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1BhcmVudD0iTmFtZSIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEVzWWR1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iNjA4NiIgeT0iNzg1Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFc1loT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxN0YiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVzWWgtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hFc1lpT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFc1lpZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFc1lpdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFc1lpLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVzWWpPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEVzWWplZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVzWWp1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEVzWWotZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVzWWtPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEVzWWtlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVzWWt1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFc1lrLWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEVzWWhlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1BhcmVudD0iTmFtZSIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEVzWWh1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iNTU4OCIgeT0iMTExNTIiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVzWWxPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDE4RiI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRXNZbC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEVzWW1PZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjE4MjgiIGhlaWdodD0iOTA1Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRXNZbWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRXNZbXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRXNZbS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFc1luT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFc1luZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFc1ludWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFc1luLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFc1lvT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFc1lvZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFc1lvdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRXNZby1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hFc1lsZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dQYXJlbnQ9Ik5hbWUiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hFc1lsdWZYRWR1cUhvT0piVVJaUnciIHg9IjExNDQzIiB5PSIxMTE1MiIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRXNZcE9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjk2Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFc1lwLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IRXNZcU9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRXNZcWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRXNZcXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRXNZcS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFc1lyT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFc1lyZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFc1lydWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFc1lyLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFc1lzT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFc1lzZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFc1lzdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRXNZcy1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hFc1lwZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJOb25lIiBsaW5lQ29sb3I9IjAiIHNob3dQYXJlbnQ9Ik5hbWUiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hFc1lwdWZYRWR1cUhvT0piVVJaUnciIHg9IjIzMDUwIiB5PSI4NTU5Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFc1l0T2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxODUiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVzWXQtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hFc1l1T2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIyMDMyIiBoZWlnaHQ9IjkwNSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVzWXVlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVzWXV1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVzWXUtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRXNZdk9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRXNZdmVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRXNZdnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRXNZdi1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRXNZd09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRXNZd2VmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRXNZd3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEVzWXctZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IRXNZdGVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93UGFyZW50PSJOYW1lIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRXNZdHVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxNzIyNiIgeT0iMTExNTIiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVzWXhPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDJCQyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRXNZeC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEVzWXlPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjI0NTUiIGhlaWdodD0iOTA1Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRXNZeWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRXNZeXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRXNZeS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFc1l6T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFc1l6ZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFc1l6dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFc1l6LWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFc1kwT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFc1kwZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFc1kwdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRXNZMC1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hFc1l4ZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dQYXJlbnQ9Ik5hbWUiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hFc1l4dWZYRWR1cUhvT0piVVJaUnciIHg9IjExNDQ4IiB5PSI4NTYxIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFc1kxT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyOUUiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVzWTEtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hFc1kyT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFc1kyZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFc1kydWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFc1kyLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVzWTNPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEVzWTNlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVzWTN1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEVzWTMtZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVzWTRPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEVzWTRlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVzWTR1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFc1k0LWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEVzWTFlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9Ik5vbmUiIGxpbmVDb2xvcj0iMCIgc2hvd1BhcmVudD0iTmFtZSIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEVzWTF1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iNTU5MSIgeT0iODU1OSIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRXNZXy1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjZDIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFc1pBdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IRXNaQS1mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMjg3OCIgaGVpZ2h0PSIxMDQ5Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRXNaQk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRXNaQmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRXNaQnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFc1pCLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFc1pDT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFc1pDZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFc1pDdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFc1pDLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFc1pET2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFc1pEZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRXNaRHVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hFc1pBT2ZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dQYXJlbnQ9Ik5hbWUiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hFc1pBZWZYRWR1cUhvT0piVVJaUnciIHg9IjExODgyIiB5PSI1OTc3Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFMWlhLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjc5NEE2NjAzNjgiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEUxaWJ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hFMWliLWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFMWljT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFMWljZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFMWljdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEUxaWMtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEUxaWRPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEUxaWRlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEUxaWR1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEUxaWQtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEUxaWVPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEUxaWVlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFMWlldWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEUxaWJPZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1BhcmVudD0iTmFtZSIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEUxaWJlZlhFZHVxSG9PSmJVUlpSdyIgeD0iMjQxNSIgeT0iNTk2NiIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRTFpZS1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRTRDRjMwMUFFIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFMWlmdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IRTFpZi1mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMjc5NCIgaGVpZ2h0PSIxMDMyIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRTFpZ09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRTFpZ2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRTFpZ3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFMWlnLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFMWloT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFMWloZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFMWlodWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFMWloLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFMWlpT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFMWlpZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRTFpaXVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hFMWlmT2ZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dQYXJlbnQ9Ik5hbWUiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hFMWlmZWZYRWR1cUhvT0piVVJaUnciIHg9Ijc4MyIgeT0iMzM2MyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRTFpbE9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTgyRDMwMTdGIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFMWlsLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IRTFpbU9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMjY1OCIgaGVpZ2h0PSI5MDUiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFMWltZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFMWltdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFMWltLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEUxaW5PZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEUxaW5lZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEUxaW51ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEUxaW4tZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEUxaW9PZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEUxaW9lZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEUxaW91ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFMWlvLWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEUxaWxlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1BhcmVudD0iTmFtZSIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEUxaWx1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iNTU5MyIgeT0iMzM4MCIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRTFpdHVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI5NEVCOTAwMEZDIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFMWl1ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IRTFpdXVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMzYwNiIgaGVpZ2h0PSIxMDMyIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRTFpdS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRTFpdk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRTFpdmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFMWl2dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFMWl2LWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFMWl3T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFMWl3ZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFMWl3dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFMWl3LWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFMWl4T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRTFpeGVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hFMWl0LWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dQYXJlbnQ9Ik5hbWUiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hFMWl1T2ZYRWR1cUhvT0piVVJaUnciIHg9IjExNDM3IiB5PSIzMzY5Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MRGlhZ3JhbVN0eWxlIiB4bWk6aWQ9Il9HdFRNTmVmWEVkdXFIb09KYlVSWlJ3IiBkZXNjcmlwdGlvbj0iVGhlIENvcmUgQ29udGVudCBFbGVtZW50cyBwYWNrYWdlIGRlZmluZXMgdGhlIGNvcmUgZWxlbWVudHMgb2YgZXZlcnkgbWV0aG9kIHN1Y2ggYXMgcm9sZXMsIHRhc2tzLCBhbmQgd29yayBwcm9kdWN0cy4gIFRoaXMgZGlhZ3JhbSBzaG93cyBhIHRheG9ub215IG9mIHRoZSBlbGVtZW50cyBkZWZpbmVkIGluIHRoaXMgcGFja2FnZS4gIEFsbCBDb3JlIENvbnRlbnQgRWxlbWVudHMsIHdpdGggdGhlIGV4Y2VwdGlvbiBvZiBTdGVwLCBhcmUgZGVyaXZlZCBmcm9tIENvbnRlbnQgRWxlbWVudC4gIFN0ZXAgaXMgbm90IGEgQ29udGVudCBFbGVtZW50LCBiZWNhdXNlIGl0IGlzIGRlZmluZWQgYXMgYSBzcGVjaWFsIFNlY3Rpb24gd2hpY2ggd2FzIGRlZmluZWQgaW4gdGhlIGxhc3QgU2VjdGlvbiBhcyBhIHBhcnQgb2YgQ29udGVudCBEZXNjcmlwdGlvbi4gIEluIG90aGVyIHdvcmRzLCBTdGVwIGFscmVhZHkgaXMgYSBkZXNjcmlwdGlvbiBmb3IgY29udGVudCBhbmQgdGhlcmUgZG9lcyBub3QgcmVxdWlyZSBiZWluZyBhIENvbnRlbnQgRWxlbWVudCB3aXRoIGl0cyBvd24gQ29udGVudCBEZXNjcmlwdGlvbiBwYXJ0LiAgU3RlcCBhbmQgVGFzayBhcmUgZGVyaXZlZCBmcm9tIGEgbmV3IGFic3RyYWN0aW9uIGludHJvZHVjZWQgaW4gdGhpcyBwYWNrYWdlIGNhbGwgV29yayBEZWZpbml0aW9uLCB3aGljaCByZXByZXNlbnRzIGJlaGF2aW9yYWwgZGVzY3JpcHRpb25zIGZvciB1bml0cyBvZiB3b3JrLiIvPg0KLSAgICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hFc1k1T2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAwMEYiIHNvdXJjZT0iX0hFc1loT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hFc1l4T2ZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVzWTUtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVzWTZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRXNZNnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hFc1k2T2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hFc1k1ZWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEVzWTV1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTEsIC01MDMsIC01ODIyLCAyMDkwXSRbNTgyMCwgLTIwOTEsIC0xLCA1MDJdIi8+DQotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRXNZNi1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hFc1k3T2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IRXNZN2VmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMDRBIiBzb3VyY2U9Il9IRXNZbE9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IRXNZeE9mWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFc1k4T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFc1k4dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVzWTgtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRXNZOGVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IRXNZN3VmWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hFc1k3LWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0xLCAtNTAzLCAtMSwgMjA5MF0kWy0xLCAtMjA5MSwgLTEsIDUwMl0iLz4NCi0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hFc1k5T2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEVzWTllZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hFc1k5dWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAwMkMiIHNvdXJjZT0iX0hFc1l0T2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hFc1l4T2ZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVzWS1lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVzWS0tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRXNZX09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hFc1ktdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hFc1k5LWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEVzWS1PZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMCwgLTUwMywgNTgyMCwgMjA5MF0kWy01ODIxLCAtMjA5MSwgLTEsIDUwMl0iLz4NCi0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hFc1lfZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEVzWV91ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hFc1pELWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MzAxMUQiIHNvdXJjZT0iX0hFaW5xLWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hFc1lfLWZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVzWkV1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVzWkZPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRXNaRmVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hFc1pFLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hFc1pFT2ZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEVzWkVlZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMCwgLTUwMywgNTgwNywgMjA5MF0kWy01ODIxLCAtMjA5MCwgLTE0LCA1MDNdIi8+DQotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRXNaRnVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hFc1pGLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IRXNaR09mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMzA3IiBzb3VyY2U9Il9IRXNZcE9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IRXNZXy1mWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFc1pHLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFc1pIZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVzWkh1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRXNaSE9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IRXNaR2VmWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hFc1pHdWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzAsIC01MDMsIDExNjI4LCAyMDkwXSRbLTExNjQyLCAtMjA5MCwgLTE0LCA1MDNdIi8+DQotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRXNaSC1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hFc1pJT2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IRXNaSWVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMzJGIiBzb3VyY2U9Il9IRXNZMU9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IRXNZXy1mWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFc1pKT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFc1pKdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVzWkotZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRXNaSmVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IRXNaSXVmWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hFc1pJLWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0xLCAtNTAzLCAtNTgzNSwgMjA5MF0kWzU4MjAsIC0yMDkwLCAtMTQsIDUwM10iLz4NCi0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hFMWlZT2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEUxaVllZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hFMWlZdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAzRDkiIHNvdXJjZT0iX0hFc1l4T2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hFc1lfLWZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEUxaVplZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEUxaVotZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRTFpYU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hFMWladWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hFMWlZLWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEUxaVpPZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTEsIC01MDMsIC0xNCwgMjA5MF0kWy0xLCAtMjA5MCwgLTE0LCA1MDNdIi8+DQotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRTFpYWVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hFMWlhdWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IRTFpaS1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3OTgzMEUwMTUwIiBzb3VyY2U9Il9IRTFpYS1mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IRTFpZS1mWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFMWlqdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFMWlrT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEUxaWtlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRTFpai1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IRTFpak9mWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hFMWlqZWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0xLCAtNTAzLCAyMTQzLCAyMDkwXSRbLTIxNDQsIC0yMDkwLCAwLCA1MDNdIi8+DQotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRTFpa3VmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hFMWlrLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IRTFpcE9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTgzMTgwMEI4IiBzb3VyY2U9Il9IRXNZMU9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IRTFpbE9mWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFMWlwLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFMWlxZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEUxaXF1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRTFpcU9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IRTFpcGVmWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hFMWlwdWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0xLCAtNTAzLCAtMSwgNDY4M10kWy0xLCAtNDY4MywgLTEsIDUwM10iLz4NCi0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hFMWlxLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEUxaXJPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hFMWlyZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBODMyMzAwRkUiIHNvdXJjZT0iX0hFMWlhLWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hFMWlsT2ZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEUxaXNPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEUxaXN1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRTFpcy1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hFMWlzZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hFMWlydWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEUxaXItZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTEsIC01MDMsIC0zMTc2LCAyMDkwXSRbMzE3NCwgLTIwOTAsIC0xLCA1MDNdIi8+DQotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRTFpdE9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hFMWl0ZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IRTFpeHVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI5NEVDNEEwMzA2IiBzb3VyY2U9Il9IRXNZXy1mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IRTFpdHVmWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFMWl5ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFMWl5LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEUxaXpPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRTFpeXVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IRTFpeC1mWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hFMWl5T2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0xNCwgLTUwMywgMjI0LCAyMDkwXSRbLTI1MiwgLTIwOTAsIC0xNCwgNTAzXSIvPg0KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEUxaXplZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRTFpenVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEUxaXotZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E4MkYzMDI2RSIgc291cmNlPSJfSEUxaWxPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEVzWWRPZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRTFpMHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRTFpMU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFMWkxZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEUxaTAtZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEUxaTBPZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IRTFpMGVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMSwgLTUwMywgMCwgMjA5MF0kWy0xLCAtMjA5MCwgMCwgNTAzXSIvPg0KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEUxaTF1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRTFpMS1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEUxaTJPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyNzk1NjI0MDE3RSIgc291cmNlPSJfSEUxaWUtZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEVzWWRPZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRTFpMi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRTFpM2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFMWkzdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEUxaTNPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEUxaTJlZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IRTFpMnVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlswLCAtNTAzLCAtNTMxOCwgMjA5MF0kWzUzMTgsIC0yMDkwLCAwLCA1MDNdIi8+DQotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRTFpMy1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hFMWk0T2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IRTFpNGVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI5NEVDMkIwMUNBIiBzb3VyY2U9Il9IRTFpdHVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IRXNZZE9mWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFMWk1T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFMWk1dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEUxaTUtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRTFpNWVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IRTFpNHVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IRTFpNC1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMTQsIC01MDMsIDU1ODMsIDIwOTBdJFstNTU5NywgLTIwOTAsIDAsIDUwM10iLz4NCi0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hFMWk2T2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEUxaTZlZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgIDwvY29udGVudHM+DQotICAgICAgICAgICAgPGNvbnRlbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpEaWFncmFtIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNzBBMzAxNTIiIHR5cGU9IkNsYXNzIiBuYW1lPSJTdHJ1Y3R1cmUiPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFX1RZT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5vdGUiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEY0OEREQzAyQzciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVfVFktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRGlhZ3JhbU5hbWUiPg0KLSAgICAgICAgICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFX1RaT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJEZXNjcmlwdGlvbiI+DQotICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IRV9UWWVmWEVkdXFIb09KYlVSWlJ3IiB1bmRlcmxpbmU9InRydWUiIGRlc2NyaXB0aW9uPSJDbGFzcyBEaWFncmFtOiBDb3JlQ29udGVudEVsZW1lbnRzIC8gVGF4b25vbXkiIGxpbmVDb2xvcj0iMCIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRV9UWXVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxMDE2IiB5PSIxMzYwNSIgd2lkdGg9IjQzMDgiIGhlaWdodD0iMTEzNCIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRV9UWmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOb3RlIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDEyRUQyMTMwMzJCIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFX1RhT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkRpYWdyYW1OYW1lIj4NCi0gICAgICAgICAgICAgICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRV9UYWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iRGVzY3JpcHRpb24iPg0KLSAgICAgICAgICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246U2hhcGVTdHlsZSIgeG1pOmlkPSJfSEVfVFp1ZlhFZHVxSG9PSmJVUlpSdyIgdW5kZXJsaW5lPSJ0cnVlIiBkZXNjcmlwdGlvbj0iQ2xhc3MgRGlhZ3JhbTogQ29yZUNvbnRlbnRFbGVtZW50cyAvIFdvcmtQcm9kdWN0cyIgbGluZUNvbG9yPSIwIi8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hFX1RaLWZYRWR1cUhvT0piVVJaUnciIHg9IjEwNDkiIHk9IjEyMDkwIiB3aWR0aD0iNDE1MyIgaGVpZ2h0PSIxMTI2Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFX1RhdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5vdGUiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVfVGJlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRGlhZ3JhbU5hbWUiPg0KLSAgICAgICAgICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFX1RidWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkRlc2NyaXB0aW9uIj4NCi0gICAgICAgICAgICAgICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOlNoYXBlU3R5bGUiIHhtaTppZD0iX0hFX1RhLWZYRWR1cUhvT0piVVJaUnciIGZvbnROYW1lPSJBcmlhbCIgZGVzY3JpcHRpb249IntSb2xlLm1vZGlmaWVzID0gUm9sZS5wZXJmb3Jtcy5vdXRwdXR9JiN4QTtrZXB0IGZvciBjb21wYXRpYmlsaXR5IHdpdGggUlVQJiN4QTsiIGxpbmVDb2xvcj0iMCIvPg0KLSAgICAgICAgICAgICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hFX1RiT2ZYRWR1cUhvT0piVVJaUnciIHg9IjUwMjkiIHk9IjEwNTE1IiB3aWR0aD0iNjkwOCIgaGVpZ2h0PSIxMTI2Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFX1RiLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyOTYiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVfVGN1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hFX1RjLWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFX1RkT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFX1RkZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFX1RkdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVfVGQtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEVfVGVPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVfVGVlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEVfVGV1ZlhFZHVxSG9PSmJVUlpSdyIgY29sbGFwc2VkPSJ0cnVlIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRV9UZS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRV9UZk9mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRV9UZmVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEVfVGZ1ZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IRV9UY09mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iTm9uZSIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRV9UY2VmWEVkdXFIb09KYlVSWlJ3IiB4PSIyMjE4IiB5PSI5NjUiIHdpZHRoPSIzMzk1IiBoZWlnaHQ9IjI2NTAiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVfVGYtZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDJCQyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRV9UZ3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEVfVGctZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVfVGhPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVfVGhlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVfVGh1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRV9UaC1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRV9UaU9mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRV9UaWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRV9UaXVmWEVkdXFIb09KYlVSWlJ3IiBjb2xsYXBzZWQ9InRydWUiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFX1RpLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFX1RqT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFX1RqZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRV9UanVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hFX1RnT2ZYRWR1cUhvT0piVVJaUnciIGl0YWxpYz0idHJ1ZSIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9Ik5vbmUiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEVfVGdlZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTc3NTQiIHk9IjgwNzciIHdpZHRoPSIzNzA4IiBoZWlnaHQ9IjIwNDAiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZKRVlPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyNzk0QTY2MDM2OCI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRkpFWS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEZKRVpPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZKRVplZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZKRVp1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZKRVotZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRkpFYU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRkpFYWVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRkpFYXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRkpFYS1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRkpFYk9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRkpFYmVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRkpFYnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEZKRWItZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IRkpFWWVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRkpFWXVmWEVkdXFIb09KYlVSWlJ3IiB4PSIyNDA1MyIgeT0iMTM4MCIgd2lkdGg9IjIxODQiIGhlaWdodD0iMTYxNyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRkpFY09mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjlFIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGSkVjLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IRkpFZE9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRkpFZGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRkpFZHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRkpFZC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGSkVlT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGSkVlZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGSkVldWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGSkVlLWZYRWR1cUhvT0piVVJaUnciIGNvbGxhcHNlZD0idHJ1ZSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZKRWZPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEZKRWZlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZKRWZ1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGSkVmLWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEZKRWNlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9Ik5vbmUiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEZKRWN1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTc4NDciIHk9IjEwNjYiIHdpZHRoPSIzMzE4IiBoZWlnaHQ9IjIzNDUiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxEaWFncmFtU3R5bGUiIHhtaTppZD0iX0d0Y1dFZWZYRWR1cUhvT0piVVJaUnciIGRlc2NyaXB0aW9uPSJ8TWV0aG9kIGNvbnRlbnQgaXMgZnVuZGFtZW50YWxseSBkZXNjcmliZWQgYnkgZGVmaW5pbmcgVGFza3MgZGVzY3JpYmVkIHdpdGggU3RlcHMgdGhhdCBoYXZlIFdvcmsgUHJvZHVjdHMgYXMgaW5wdXQgYW5kIG91dHB1dCBhbmQgd2hpY2ggYXJlIGJlaW5nIHBlcmZvcm1lZCBieSBSb2xlcy4gIFRoZSBkaWFncmFtIGRlcGljdHMgdGhlc2UgY29yZSBlbGVtZW50cyB3aXRoIHRoZWlyIHJlbGF0aW9uc2hpcHMuICBUaGUgcmVsYXRpb25zaGlwcyBhcmUgbGFiZWxlZCB3aXRoIGEgJnF1b3Q7RGVmYXVsdF8mcXVvdDsgcHJlZml4LCBiZWNhdXNlIHRoZXkgZGVzY3JpYmUgdGhlICdzdGFuZGFyZCcgb3IgJ25vcm1hbCcgd2F5IG9mIHBlcmZvcm1pbmcgdGhlIG1ldGhvZCBkZXNjcmliZWQ7IGkuZS4gZG9pbmcgdGhlIHdvcmsgdW5kZXIgJ25vcm1hbCcgY2lyY3Vtc3RhbmNlcywgd2l0aCAnbm9ybWFsJyBiZWluZyB3aGF0IHRoZSBtZXRob2QgYXV0aG9yIHBlcmNlaXZlcyBhcyB0aGUgbW9zdCBnZW5lcmFsIGNhc2UuICBIb3dldmVyLCBkaWZmZXJlbnQgcHJvY2Vzc2VzIHdvdWxkIGFwcGx5IHRoZXNlIGVsZW1lbnRzIGluIGRpZmZlcmVudCBwYXJ0cyBvZiBhIGxpZmVjeWNsZSBkaWZmZXJlbnRseSBhbmQgdGhlbiBuZWVkIHRvIGRlZmluZSBjaGFuZ2VzIG9uIHRoZXNlIHJlbGF0aW9uc2hpcHMuICBGb3IgZXhhbXBsZSwgaWYgYSBUYXNrIGlzIHBlcmZvcm1lZCBpbiBtb3JlIHRoZW4gb25lIGl0ZXJhdGlvbiBvZiBhbiBpdGVyYXRpdmUgbGlmZWN5Y2xlIG1vZGVsIGRpZmZlcmVudCBSb2xlcyBjb3VsZCBiZSBhZGRlZCB0byAob3IgcmVtb3ZlZCBmcm9tKSBwZXJmb3JtaW5nIHRoZSBUYXNrIGFzIHdlbGwgYXMgZGlmZmVyZW50IGlucHV0cyBtaWdodCBiZSBjb25zaWRlcmVkIGF0IGRpZmZlcmVudCBwb2ludHMgaW4gdGltZS4gIFN1Y2ggY2hhbmdlcyB3b3VsZCBiZSBkZWZpbmVkIG9uIHByb2Nlc3Mgc3BlY2lmaWMgRGVzY3JpcHRvcnMgdGhhdCByZWZlcmVuY2UgYW5kIGhhdmUgYmVlbiBkZWZpbmVkIGJhc2VkIG9uIHRoZXNlIGNvcmUgY29udGVudCBlbGVtZW50cyAoc2VlIFByb2Nlc3MgZm9yIG1vcmUgZGV0YWlscykuJiN4QTsiLz4NCi0gICAgICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IRV9Uai1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTMwMEY1IiBzb3VyY2U9Il9IRV9UZi1mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IRV9UYi1mWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFX1RrdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFX1RsT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVfVGxlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hFX1RrLWZYRWR1cUhvT0piVVJaUnciIHg9Ii0xNTIiIHk9IjMwNCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVfVGx1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkzMDBGOCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFX1RtT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRV9UbC1mWEVkdXFIb09KYlVSWlJ3IiB4PSItMjc2MSIgeT0iMjc5Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRV9UbWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkzMDBGOCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFX1RtLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEVfVG11ZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTE4MzkiIHk9Ii0zMTQiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFX1RuT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkzMDBGNiI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFX1RudWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hFX1RuZWZYRWR1cUhvT0piVVJaUnciIHg9IjI1MjUiIHk9IjI3OSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVfVG4tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkzMDBGNiI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFX1RvZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRV9Ub09mWEVkdXFIb09KYlVSWlJ3IiB4PSIyNTY4IiB5PSItMTI0NSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVfVG91ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkzMDBGOCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFX1RwT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRV9UcGVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hFX1RvLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFX1RwdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkzMDBGNiI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFX1RxT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRV9UcWVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hFX1RwLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFX1RxdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTMwMEY4Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVfVHJPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFX1RyZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEVfVHEtZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVfVHJ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkzMDBGNiI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFX1RzT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFX1RzZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEVfVHItZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEVfVGtPZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEVfVGtlZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTE4NTQsIDY1MSwgMTM4NDMsIDc0NTldJFstMTYyNjQsIDY1MSwgLTU2NywgNzQ1OV0kWy0xNjI2NCwgLTU0ODYsIC01NjcsIDEzMjBdIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hFX1RzdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5vdGVBdHRhY2htZW50IiBzb3VyY2U9Il9IRV9UYXVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IRV9Uai1mWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246Q29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hFX1RzLWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iMCIvPg0KLSAgICAgICAgICAgICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hFX1R0T2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy00MjMsIC01NjcsIDU4NCwgNzYyXSRbLTEwMDcsIC0xMzI5LCAwLCAwXSIvPg0KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEVfVHRlZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRV9UdHVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEVfVHQtZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkzMDEwOSIgc291cmNlPSJfSEVfVGYtZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEVfVGItZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRV9UdXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRV9Udk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFX1R2ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRV9UdS1mWEVkdXFIb09KYlVSWlJ3IiB4PSItMzM5IiB5PSIyODAiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFX1R2dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MzAxMEMiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRV9Ud09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEVfVHYtZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTI0MzciIHk9IjI4MCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVfVHdlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MzAxMEMiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRV9Udy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hFX1R3dWZYRWR1cUhvT0piVVJaUnciIHg9Ii02OTMiIHk9Ii0zMDQiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFX1R4T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkzMDEwQSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFX1R4dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hFX1R4ZWZYRWR1cUhvT0piVVJaUnciIHg9IjIxNTAiIHk9Ii0zMjIiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFX1R4LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MzAxMEEiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRV9UeWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEVfVHlPZlhFZHVxSG9PSmJVUlpSdyIgeD0iMjIxOCIgeT0iMTc5NSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVfVHl1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkzMDEwQyI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFX1R6T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRV9UemVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hFX1R5LWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFX1R6dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkzMDEwQSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFX1QwT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRV9UMGVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hFX1R6LWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFX1QwdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTMwMTBDIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVfVDFPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFX1QxZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEVfVDAtZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVfVDF1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkzMDEwQSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFX1QyT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFX1QyZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEVfVDEtZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEVfVHVPZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEVfVHVlZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTE4NTQsIC0yMTEsIDEzODQzLCA2NTk1XSRbLTE0NzkxLCAtMjExLCA5MDUsIDY1OTVdJFstMTQ3OTEsIC01NDg2LCA5MDUsIDEzMjBdIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hGSkVnT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAzMDgiIHNvdXJjZT0iX0hGSkVjT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hFX1RiLWZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZKRWctZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZKRWhlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRkpFaHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEZKRWhPZlhFZHVxSG9PSmJVUlpSdyIgeD0iNjYiIHk9IjI2MiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZKRWgtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDMwQiI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGSkVpZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRkpFaU9mWEVkdXFIb09KYlVSWlJ3IiB4PSItMTQzOCIgeT0iMjc5Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRkpFaXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDMwQiI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGSkVqT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEZKRWktZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTc4MiIgeT0iLTI2MyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZKRWplZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMzA5Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZKRWotZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEZKRWp1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTIyMSIgeT0iMjg4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRkpFa09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMzA5Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZKRWt1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGSkVrZWZYRWR1cUhvT0piVVJaUnciIHg9IjMzNSIgeT0iLTMyMiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZKRWstZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDMwQiI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGSkVsZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRkpFbHVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGSkVsT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGSkVsLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDMwOSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGSkVtZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRkpFbXVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGSkVtT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGSkVtLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMzBCIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZKRW5lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGSkVudWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEZKRW5PZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZKRW4tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDMwOSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGSkVvZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGSkVvdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEZKRW9PZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEZKRWdlZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEZKRWd1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTE2NTksIDY2MCwgMTM5MzYsIDYwOV0kWy0xMzkwMiwgNjYwLCAxNjkzLCA2MDldIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hGSkVvLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTE3Q0Y1QzAxQ0MiIHNvdXJjZT0iX0hFX1RiLWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hGSkVjT2ZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZKRXB1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZKRXFPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRkpFcWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEZKRXAtZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTE0OCIgeT0iLTI3MiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZKRXF1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxMTdDRjVEMDM1NyI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGSkVyT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRkpFcS1mWEVkdXFIb09KYlVSWlJ3IiB4PSItMTMxMiIgeT0iLTI2MyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZKRXJlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTE3Q0Y1RDAzNTciPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRkpFci1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGSkVydWZYRWR1cUhvT0piVVJaUnciIHg9IjE1NDEiIHk9IjMxMiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZKRXNPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDExN0NGNUQwMkZEIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZKRXN1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEZKRXNlZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTQ1NyIgeT0iLTE5NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZKRXMtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxMTdDRjVEMDJGRCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGSkV0ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRkpFdE9mWEVkdXFIb09KYlVSWlJ3IiB4PSIzMjIiIHk9IjMxMiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZKRXR1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxMTdDRjVEMDM1NyI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGSkV1T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRkpFdWVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGSkV0LWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGSkV1dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxMTdDRjVEMDJGRCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGSkV2T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRkpFdmVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGSkV1LWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGSkV2dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDExN0NGNUQwMzU3Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZKRXdPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGSkV3ZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEZKRXYtZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZKRXd1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxMTdDRjVEMDJGRCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGSkV4T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGSkV4ZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEZKRXctZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEZKRXBPZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEZKRXBlZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMTY5MywgLTc3MCwgLTEzOTAyLCAtNzE5XSRbMTM5MzYsIC03NzAsIC0xNjU5LCAtNzE5XSIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IRkpFeHVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMzlEIiBzb3VyY2U9Il9IRV9UZi1mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IRkpFY09mWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGSkV5ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGSkV5LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZKRXpPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hGSkV5dWZYRWR1cUhvT0piVVJaUnciIHg9IjE2NzUiIHk9IjIxMTEiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGSkV6ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAzQTgiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRkpFei1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEZKRXp1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTYzNyIgeT0iLTI4MyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZKRTBPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAzQTgiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRkpFMHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGSkUwZWZYRWR1cUhvT0piVVJaUnciIHg9IjEzODAiIHk9IjE1MjIiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGSkUwLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDM5RSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGSkUxZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGSkUxT2ZYRWR1cUhvT0piVVJaUnciIHg9IjU2OSIgeT0iLTI4NyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZKRTF1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDM5RSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGSkUyT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRkpFMS1mWEVkdXFIb09KYlVSWlJ3IiB4PSItMTA3OSIgeT0iMTY0OSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZKRTJlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDNBOCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGSkUyLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRkpFM09mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGSkUydWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGSkUzZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDM5RSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGSkUzLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRkpFNE9mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGSkUzdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGSkU0ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwM0E4Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZKRTQtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGSkU1T2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEZKRTR1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZKRTVlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDM5RSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGSkU1LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGSkU2T2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEZKRTV1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEZKRXgtZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IRkpFeU9mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9Ils2MjYsIC0xMDI0LCA3MjgsIDU4MzNdJFsyMjg2LCAtMzY5OSwgMjM4NywgMzE1OF0kWzc3OCwgLTU2ODksIDg4MCwgMTE2OF0iLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEZKRTZlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDNCQiIgc291cmNlPSJfSEVfVGYtZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEZKRWNPZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRkpFN09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRkpFN3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGSkU3LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRkpFN2VmWEVkdXFIb09KYlVSWlJ3IiB4PSIxNTcxIiB5PSItMTQ2MCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZKRThPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDNCRSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGSkU4dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRkpFOGVmWEVkdXFIb09KYlVSWlJ3IiB4PSItNDczIiB5PSIyNzkiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGSkU4LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwM0JFIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZKRTllZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRkpFOU9mWEVkdXFIb09KYlVSWlJ3IiB4PSI1NzYiIHk9Ii03NzMiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGSkU5dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDNCQyI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGSkUtT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGSkU5LWZYRWR1cUhvT0piVVJaUnciIHg9IjY3MiIgeT0iMzA5Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRkpFLWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwM0JDIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZKRS0tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGSkUtdWZYRWR1cUhvT0piVVJaUnciIHg9Ii03ODUiIHk9Ii0xMDYwIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRkpFX09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwM0JFIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZKRV91ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGSkVfLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEZKRV9lZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZKRkFPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwM0JDIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZKRkF1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGSkZBLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEZKRkFlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZKRkJPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAzQkUiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRkpGQnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEZKRkItZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRkpGQmVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRkpGQ09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwM0JDIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZKRkN1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEZKRkMtZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRkpGQ2VmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IRkpFNnVmWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hGSkU2LWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy04NzIsIC0xMDI0LCAtNzcwLCA1ODMzXSRbLTMxMTUsIC0zNjk5LCAtMzAxNCwgMzE1OF0kWy0xMjM2LCAtNTY4OSwgLTExMzQsIDExNjhdIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hGU09VT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTc3Rjg0OTAxMzEiIHNvdXJjZT0iX0hGSkVjT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hFX1RmLWZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZTT1UtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZTT1ZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRlNPVnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEZTT1ZPZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTQ3IiB5PSItMTI2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRlNPVi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE3N0Y4NEEwMjcyIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZTT1dlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGU09XT2ZYRWR1cUhvT0piVVJaUnciIHg9Ii0yOTYiIHk9Ii0yNzgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGU09XdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE3N0Y4NEEwMjcyIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZTT1hPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRlNPVy1mWEVkdXFIb09KYlVSWlJ3IiB4PSIyODAiIHk9Ii0yNTMiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGU09YZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNzdGODRBMDI1RSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGU09YLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGU09YdWZYRWR1cUhvT0piVVJaUnciIHg9IjQ1NiIgeT0iLTM0NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZTT1lPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNzdGODRBMDI1RSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGU09ZdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRlNPWWVmWEVkdXFIb09KYlVSWlJ3IiB4PSItNTYwIiB5PSItMTY4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRlNPWS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE3N0Y4NEEwMjcyIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZTT1plZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGU09adWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEZTT1pPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZTT1otZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE3N0Y4NEEwMjVFIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZTT2FlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGU09hdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEZTT2FPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZTT2EtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTc3Rjg0QTAyNzIiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRlNPYmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEZTT2J1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRlNPYk9mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRlNPYi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE3N0Y4NEEwMjVFIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZTT2NlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEZTT2N1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRlNPY09mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IRlNPVWVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IRlNPVXVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstODQsIDExNjgsIC0xODYsIC01Njg5XSRbLTg0LCA1ODMzLCAtMTg2LCAtMTAyNF0iLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEZTT2MtZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyNzk2MkQzMDAzRiIgc291cmNlPSJfSEZKRWNPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEZKRVlPZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRlNPZHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRlNPZU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGU09lZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEZTT2QtZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZTT2V1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjc5NjJENDAyMEUiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRlNPZk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEZTT2UtZlhFZHVxSG9PSmJVUlpSdyIgeT0iMzk2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRlNPZmVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjc5NjJENDAyMEUiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRlNPZi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGU09mdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0zOTciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGU09nT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyNzk2MkQ0MDIwMyI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGU09ndWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGU09nZWZYRWR1cUhvT0piVVJaUnciIHg9Ii02NiIgeT0iMzIxIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRlNPZy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3OTYyRDQwMjAzIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZTT2hlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGU09oT2ZYRWR1cUhvT0piVVJaUnciIHg9Ii0zNzEiIHk9Ii0zMDYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGU09odWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjc5NjJENDAyMEUiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRlNPaU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEZTT2llZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRlNPaC1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRlNPaXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjc5NjJENDAyMDMiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRlNPak9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEZTT2plZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRlNPaS1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRlNPanVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyNzk2MkQ0MDIwRSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGU09rT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRlNPa2VmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGU09qLWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGU09rdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjc5NjJENDAyMDMiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRlNPbE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRlNPbGVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGU09rLWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hGU09kT2ZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hGU09kZWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzE2NTksIC01MCwgLTM5NzksIDBdJFs0NTQ2LCAtNTAsIC0xMDkyLCAwXSIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICA8L2NvbnRlbnRzPg0KLSAgICAgICAgICAgIDxjb250ZW50cyB4bWk6dHlwZT0ibm90YXRpb246RGlhZ3JhbSIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDEwQUVFQzYwMENBIiB0eXBlPSJDbGFzcyIgbmFtZT0iU3RydWN0dXJlIChzaW1wbGlmaWVkKSI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZTT2x1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI5NiI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRlNPbWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEZTT211ZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZTT20tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZTT25PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZTT25lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRlNPbnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRlNPbi1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRlNPb09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRlNPb2VmWEVkdXFIb09KYlVSWlJ3IiBjb2xsYXBzZWQ9InRydWUiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGU09vdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGU09vLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGU09wT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRlNPcGVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hGU09sLWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hGU09tT2ZYRWR1cUhvT0piVVJaUnciIHg9IjE1MTUiIHk9IjkxNCIgd2lkdGg9IjMxNzUiIGhlaWdodD0iMjY0MSIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmJfVU9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjlFIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGYl9VLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IRmJfVk9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmJfVmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmJfVnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmJfVi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGYl9XT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGYl9XZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGYl9XdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGYl9XLWZYRWR1cUhvT0piVVJaUnciIGNvbGxhcHNlZD0idHJ1ZSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZiX1hPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEZiX1hlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZiX1h1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGYl9YLWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEZiX1VlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEZiX1V1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTE0NzIiIHk9IjkxNCIgd2lkdGg9IjU5MDkiIGhlaWdodD0iMjY0MSIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmJfcHVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMkJDIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGYl9xZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IRmJfcXVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmJfcS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmJfck9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmJfcmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGYl9ydWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGYl9yLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGYl9zT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGYl9zZWZYRWR1cUhvT0piVVJaUnciIGNvbGxhcHNlZD0idHJ1ZSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZiX3N1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEZiX3MtZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZiX3RPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGYl90ZWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEZiX3AtZlhFZHVxSG9PSmJVUlpSdyIgaXRhbGljPSJ0cnVlIiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRmJfcU9mWEVkdXFIb09KYlVSWlJ3IiB4PSIxMTQ3MiIgeT0iNTQxMCIgd2lkdGg9IjU5MDkiIGhlaWdodD0iMjU5MCIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTERpYWdyYW1TdHlsZSIgeG1pOmlkPSJfR3RjV0UtZlhFZHVxSG9PSmJVUlpSdyIgZGVzY3JpcHRpb249IlRoaXMgZGlhZ3JhbSBwcm92aWRlcyBhIHNpbXBsaWZpZWQgb3ZlcnZpZXcgdG8gdGhlIGNvcmUgY29udGVudCBzdHJ1Y3R1cmUgbm90IHNob3dpbmcgYXR0cmlidXRlcyBhbmQgb25seSB0aGUgbW9zdCBpbXBvcnRhbnQgYXNzb2NpYXRpb25zIGFzIHdlbGwgYXMgb21pdHRpbmcgYXNzb2NpYXRpb24gcm9sZSBuYW1lcy4iLz4NCi0gICAgICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IRmJfWU9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMzA4IiBzb3VyY2U9Il9IRmJfVU9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IRlNPbHVmWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGYl9ZLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGYl9aZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZiX1p1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hGYl9aT2ZYRWR1cUhvT0piVVJaUnciIHg9Ii0zNyIgeT0iMjcyIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmJfWi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMzBCIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZiX2FlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGYl9hT2ZYRWR1cUhvT0piVVJaUnciIHg9Ii03ODEiIHk9IjIyMSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZiX2F1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMzBCIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZiX2JPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRmJfYS1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMzk3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmJfYmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAzMDkiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmJfYi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRmJfYnVmWEVkdXFIb09KYlVSWlJ3IiB4PSI1NDciIHk9IjIyOSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZiX2NPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAzMDkiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmJfY3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEZiX2NlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTM5NyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZiX2MtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDMwQiI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGYl9kZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRmJfZHVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGYl9kT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGYl9kLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDMwOSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGYl9lZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRmJfZXVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGYl9lT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGYl9lLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMzBCIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZiX2ZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGYl9mdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEZiX2ZPZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZiX2YtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDMwOSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGYl9nZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGYl9ndWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEZiX2dPZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEZiX1llZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEZiX1l1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTI5NTQsIC02NzcsIDgzNzMsIC02NzddJFstOTc0NSwgLTY3NywgMTU4MywgLTY3N10iLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEZiX2ctZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxMTdDRjVDMDFDQyIgc291cmNlPSJfSEZTT2x1ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEZiX1VPZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmJfaHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmJfaU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGYl9pZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRmJfaC1mWEVkdXFIb09KYlVSWlJ3IiB4PSIzMjYiIHk9Ii0zMTQiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGYl9pdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTE3Q0Y1RDAzNTciPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmJfak9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEZiX2ktZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTYwNCIgeT0iLTIyMCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZiX2plZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDExN0NGNUQwMzU3Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZiX2otZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRmJfanVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMzk3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmJfa09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTE3Q0Y1RDAyRkQiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmJfa3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRmJfa2VmWEVkdXFIb09KYlVSWlJ3IiB4PSI4MjUiIHk9Ii0xNzAiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGYl9rLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDExN0NGNUQwMkZEIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZiX2xlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGYl9sT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0zOTciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGYl9sdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTE3Q0Y1RDAzNTciPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmJfbU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEZiX21lZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRmJfbC1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmJfbXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTE3Q0Y1RDAyRkQiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmJfbk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEZiX25lZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRmJfbS1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmJfbnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxMTdDRjVEMDM1NyI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGYl9vT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRmJfb2VmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGYl9uLWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGYl9vdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTE3Q0Y1RDAyRkQiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmJfcE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRmJfcGVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGYl9vLWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hGYl9oT2ZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hGYl9oZWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzE1ODMsIDM4MSwgLTk3NDUsIDM4MV0kWzgzNzMsIDM4MSwgLTI5NTQsIDM4MV0iLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEZiX3R1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkzMDEwOSIgc291cmNlPSJfSEZiX3B1ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEZTT2x1ZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmJfdWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmJfdS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGYl92T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRmJfdXVmWEVkdXFIb09KYlVSWlJ3IiB4PSItMTE5NyIgeT0iLTM4MSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZiX3ZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkzMDEwQyI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGYl92LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRmJfdnVmWEVkdXFIb09KYlVSWlJ3IiB4PSItMTU4MSIgeT0iLTI0NSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZiX3dPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTMwMTBDIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZiX3d1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRmJfd2VmWEVkdXFIb09KYlVSWlJ3IiB5PSItMzk3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmJfdy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MzAxMEEiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmJfeGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRmJfeE9mWEVkdXFIb09KYlVSWlJ3IiB4PSIxMzQ2IiB5PSItMzk4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmJfeHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkzMDEwQSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGYl95T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRmJfeC1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMzk3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmJfeWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTMwMTBDIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZiX3ktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGYl96T2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEZiX3l1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZiX3plZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTMwMTBBIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZiX3otZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGYl8wT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEZiX3p1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZiXzBlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MzAxMEMiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmJfMC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEZiXzFPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRmJfMHVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmJfMWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTMwMTBBIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZiXzEtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEZiXzJPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRmJfMXVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IRmJfdC1mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IRmJfdU9mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMjk1NCwgLTgsIDgzNzMsIDQ0NjFdJFstMTIyODUsIC04LCAtOTU2LCA0NDYxXSRbLTEyMjg1LCAtMzE0OSwgLTk1NiwgMTMyMF0iLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEZiXzJlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDM5RCIgc291cmNlPSJfSEZiX3B1ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEZiX1VPZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmJfM09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmJfM3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGYl8zLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRmJfM2VmWEVkdXFIb09KYlVSWlJ3IiB4PSItMTgzIiB5PSI4NDYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGYl80T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAzQTgiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmJfNHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEZiXzRlZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTE2OCIgeT0iLTIzOCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZiXzQtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwM0E4Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZiXzVlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRmJfNU9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMzk3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmJfNXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAzOUUiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmJfNk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRmJfNS1mWEVkdXFIb09KYlVSWlJ3IiB4PSI4MyIgeT0iLTEzNiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZiXzZlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAzOUUiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmJfNi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEZiXzZ1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTM5NyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZiXzdPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDNBOCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGYl83dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRmJfNy1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGYl83ZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGYl84T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDM5RSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGYl84dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRmJfOC1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGYl84ZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGYl85T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwM0E4Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZiXzl1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGYl85LWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEZiXzllZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZiXy1PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDM5RSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGYl8tdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGYl8tLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEZiXy1lZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEZiXzJ1ZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEZiXzItZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTY3LCAtMTI5NSwgLTY3LCAzMTc1XSRbLTY3LCAtMzE0OSwgLTY3LCAxMzIwXSIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IRmxKUU9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwM0JCIiBzb3VyY2U9Il9IRmJfcHVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IRmJfVU9mWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGbEpRLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGbEpSZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZsSlJ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hGbEpST2ZYRWR1cUhvT0piVVJaUnciIHg9IjcyIiB5PSItMTU2OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZsSlItZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDNCRSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGbEpTZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRmxKU09mWEVkdXFIb09KYlVSWlJ3IiB4PSItMTU0IiB5PSIxNDMiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGbEpTdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDNCRSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGbEpUT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEZsSlMtZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTM5NyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZsSlRlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwM0JDIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZsSlQtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEZsSlR1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iNTMiIHk9IjE5NCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZsSlVPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAzQkMiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmxKVXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEZsSlVlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTM5NyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZsSlUtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDNCRSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGbEpWZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRmxKVnVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGbEpWT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGbEpWLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDNCQyI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGbEpXZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRmxKV3VmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGbEpXT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGbEpXLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwM0JFIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZsSlhlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGbEpYdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEZsSlhPZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZsSlgtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDNCQyI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGbEpZZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGbEpZdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEZsSllPZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEZsSlFlZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEZsSlF1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTIxNzUsIC0xMjk1LCAtMjE3NSwgMzE3NV0kWy0yMTc1LCAtMzE1OCwgLTIxNzUsIDEzMTJdIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hGbEpZLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTc3Rjg0OTAxMzEiIHNvdXJjZT0iX0hGYl9VT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hGYl9wdWZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZsSlp1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZsSmFPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmxKYWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEZsSlotZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTU2NCIgeT0iLTIyNDQiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGbEphdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTc3Rjg0QTAyNzIiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmxKYk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEZsSmEtZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTQ0IiB5PSIxMzUiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGbEpiZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNzdGODRBMDI3MiI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGbEpiLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEZsSmJ1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTM5NyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZsSmNPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE3N0Y4NEEwMjVFIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZsSmN1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEZsSmNlZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTQ1IiB5PSIxMTAiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGbEpjLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE3N0Y4NEEwMjVFIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZsSmRlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGbEpkT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0zOTciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGbEpkdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTc3Rjg0QTAyNzIiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmxKZU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEZsSmVlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRmxKZC1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmxKZXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTc3Rjg0QTAyNUUiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmxKZk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEZsSmZlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRmxKZS1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmxKZnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNzdGODRBMDI3MiI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGbEpnT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRmxKZ2VmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGbEpmLWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGbEpndWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTc3Rjg0QTAyNUUiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmxKaE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRmxKaGVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGbEpnLWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hGbEpaT2ZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hGbEpaZWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzE5NDcsIDEzMTIsIDE5NDcsIC0zMTU4XSRbMTk0NywgMzE3NSwgMTk0NywgLTEyOTVdIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgIDwvY29udGVudHM+DQotICAgICAgICAgICAgPGNvbnRlbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpEaWFncmFtIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTJFRDIxMzAzMkIiIHR5cGU9IkNsYXNzIiBuYW1lPSJXb3JrUHJvZHVjdHMiPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGbEpodWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxOEYiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZsSmllZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hGbEppdWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGbEppLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGbEpqT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGbEpqZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZsSmp1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEZsSmotZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZsSmtPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEZsSmtlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZsSmt1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEZsSmstZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZsSmxPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGbEpsZWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEZsSmgtZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEZsSmlPZlhFZHVxSG9PSmJVUlpSdyIgeD0iODEyOCIgeT0iMzkyMCIgd2lkdGg9IjM4NjAiIGhlaWdodD0iMjAxNSIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmxKbHVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMkJDIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGbEptZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IRmxKbXVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmxKbS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmxKbk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmxKbmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGbEpudWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGbEpuLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGbEpvT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGbEpvZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGbEpvdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGbEpvLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGbEpwT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRmxKcGVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hGbEpsLWZYRWR1cUhvT0piVVJaUnciIGl0YWxpYz0idHJ1ZSIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEZsSm1PZlhFZHVxSG9PSmJVUlpSdyIgeD0iODEyOCIgeT0iODIxIiB3aWR0aD0iMzg2MCIgaGVpZ2h0PSIyMDE1Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGbEpyLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxODUiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZsSnN1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hGbEpzLWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGbEp0T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGbEp0ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGdTZRT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZ1NlFlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEZ1NlF1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZ1NlEtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEZ1NlJPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZ1NlJlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEZ1NlJ1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZ1NlItZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGdTZTT2ZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEZsSnNPZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEZsSnNlZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTI1OTgiIHk9IjM5MjAiIHdpZHRoPSIzODYwIiBoZWlnaHQ9IjIwMTUiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZ1NmRlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDE3RiI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRnU2ZU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEZ1NmVlZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZ1NmV1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZ1NmUtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZ1NmZPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRnU2ZmVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRnU2ZnVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRnU2Zi1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRnU2Z09mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRnU2Z2VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRnU2Z3VmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRnU2Zy1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEZ1NmhPZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IRnU2ZHVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRnU2ZC1mWEVkdXFIb09KYlVSWlJ3IiB4PSIzNzA4IiB5PSIzOTIwIiB3aWR0aD0iMzg2MCIgaGVpZ2h0PSIyMDE1Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MRGlhZ3JhbVN0eWxlIiB4bWk6aWQ9Il9HdGNXRmVmWEVkdXFIb09KYlVSWlJ3IiBkZXNjcmlwdGlvbj0iQSBzaW1wbGlmaWVkIG92ZXJ2aWV3IHRvIFdvcmsgUHJvZHVjdHMuIFdvcmsgUHJvZHVjdCBpcyBhbiBhYnN0cmFjdCBjbGFzcyB3aGljaCBwcm92aWRlcyBhIGdlbmVyYWxpemF0aW9uIGZvciBBcnRpZmFjdHMsIE91dGNvbWVzLCBhbmQgRGVsaXZlcmFibGVzLiIvPg0KLSAgICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hGbEpwdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAwNEEiIHNvdXJjZT0iX0hGbEpodWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hGbEpsdWZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZsSnFlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZsSnEtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmxKck9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hGbEpxdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hGbEpwLWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEZsSnFPZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMCwgLTEwMTYsIDAsIDIwODJdJFswLCAtMjA5MSwgMCwgMTAwN10iLz4NCi0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hGbEpyZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEZsSnJ1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hGdTZTZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAwMkQiIHNvdXJjZT0iX0hGbEpsdWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hGbEpyLWZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZ1NlRPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZ1NlR1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRnU2VC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEZ1NlRlZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTYzMyIgeT0iMTA1NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZ1NlVPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDAzMCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGdTZVdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRnU2VWVmWEVkdXFIb09KYlVSWlJ3IiB4PSItMTk5IiB5PSIyMzgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGdTZVLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMDMwIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZ1NlZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRnU2Vk9mWEVkdXFIb09KYlVSWlJ3IiB4PSIyMDUzIiB5PSItMjg3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRnU2VnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAwMkUiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRnU2V09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRnU2Vi1mWEVkdXFIb09KYlVSWlJ3IiB4PSIzNzciIHk9Ii00NTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGdTZXZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMDJFIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZ1NlctZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGdTZXdWZYRWR1cUhvT0piVVJaUnciIHg9IjEyMyIgeT0iMzQ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRnU2WE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMDMwIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZ1Nlh1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGdTZYLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEZ1NlhlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZ1NllPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMDJFIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZ1Nll1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGdTZZLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEZ1NlllZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZ1NlpPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAwMzAiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRnU2WnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEZ1NlotZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRnU2WmVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRnU2YU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMDJFIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZ1NmF1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEZ1NmEtZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRnU2YWVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IRnU2U3VmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IRnU2Uy1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlsxOTMwLCA0MiwgLTI1NDAsIC0zMDU2XSRbNDA4OSwgNDIsIC0zODEsIC0zMDU2XSRbNDA4OSwgMjA5MSwgLTM4MSwgLTEwMDddIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hGdTZiT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAwMkMiIHNvdXJjZT0iX0hGbEpyLWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hGbEpsdWZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZ1NmItZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZ1NmNlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRnU2Y3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hGdTZjT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hGdTZiZWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEZ1NmJ1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTE0NTYsIC0xMDE2LCAzMDE0LCAyMDgyXSRbLTMwMDUsIC0yMDkxLCAxNDY0LCAxMDA3XSIvPg0KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEZ1NmMtZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRnU2ZE9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEZ1NmhlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDAxMCIgc291cmNlPSJfSEZ1NmRlZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEZ1NmRlZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRnU2aU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRnU2aXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGdTZpLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRnU2aWVmWEVkdXFIb09KYlVSWlJ3IiB4PSItNjgiIHk9Ii0yNzkiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGdTZqT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAwMTMiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRnU2anVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEZ1NmplZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTM1OSIgeT0iMjgyIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRnU2ai1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDAxMyI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGdTZrZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEZ1NmtPZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTU5IiB5PSItMzExIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRnU2a3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAwMTEiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRnU2bE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRnU2ay1mWEVkdXFIb09KYlVSWlJ3IiB4PSItNDAxIiB5PSI3NjgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGdTZsZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAwMTEiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRnU2bC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEZ1Nmx1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTQxMyIgeT0iNzM4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRnU2bU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMDEzIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZ1Nm11ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGdTZtLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEZ1Nm1lZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZ1Nm5PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMDExIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZ1Nm51ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGdTZuLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEZ1Nm5lZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZ1Nm9PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAwMTMiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRnU2b3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEZ1Nm8tZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRnU2b2VmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRnU2cE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMDExIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZ1NnB1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEZ1NnAtZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRnU2cGVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IRnU2aHVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IRnU2aC1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9Ils2NjAsIDEwMDcsIDY2MCwgMTAwN10kWzY2MCwgMjU1NiwgNjYwLCAyNTU2XSRbLTM4NjksIDI1NTYsIC0zODY5LCAyNTU2XSRbLTM4NjksIDIyMCwgLTM4NjksIDIyMF0kWy0xOTMwLCAyMjAsIC0xOTMwLCAyMjBdIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hGdTZxT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAwMEYiIHNvdXJjZT0iX0hGdTZkZWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hGbEpsdWZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZ1NnEtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZ1NnJlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRnU2cnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hGdTZyT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hGdTZxZWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEZ1NnF1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMTQyMiwgLTEwMTYsIC0yOTk3LCAyMDgyXSRbMjk2MywgLTIwOTEsIC0xNDU2LCAxMDA3XSIvPg0KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEZ1NnItZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRnU2c09mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgPC9jb250ZW50cz4NCi0gICAgICAgICAgICA8Y29udGVudHMgeG1pOnR5cGU9Im5vdGF0aW9uOkRpYWdyYW0iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyNzk4NjI3MDFBNiIgdHlwZT0iQ2xhc3MiIG5hbWU9IlRhc2tzQW5kU3RlcHMiPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGNHJRT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyOUUiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEY0clEtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hGNHJST2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGNHJSZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGNHJSdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGNHJSLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEY0clNPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEY0clNlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEY0clN1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEY0clMtZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEY0clRPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEY0clRlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEY0clR1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGNHJULWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEY0clFlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEY0clF1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMjU5MCIgeT0iNTE5OCIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRjRyVU9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3OTRBNjYwMzY4Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGNHJVLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IRjRyVk9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRjRyVmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRjRyVnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRjRyVi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGNHJXT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGNHJXZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGNHJXdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGNHJXLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGNHJYT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGNHJYZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGNHJYdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRjRyWC1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hGNHJVZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hGNHJVdWZYRWR1cUhvT0piVVJaUnciIHg9IjEzOTcwIiB5PSI1MTU2Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGNHJnLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyNkMiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEY0cmh1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hGNHJoLWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIyODc4IiBoZWlnaHQ9IjEwNDkiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGNHJpT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGNHJpZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGNHJpdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEY0cmktZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEY0cmpPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEY0cmplZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEY0cmp1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEY0cmotZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEY0cmtPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEY0cmtlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGNHJrdWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEY0cmhPZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEY0cmhlZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTE1MSIgeT0iMjk4MCIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRjRyay1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTgyRDMwMTdGIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGNHJsdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IRjRybC1mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMjY1OCIgaGVpZ2h0PSI5MDUiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGNHJtT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGNHJtZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGNHJtdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEY0cm0tZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEY0cm5PZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEY0cm5lZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEY0cm51ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEY0cm4tZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEY0cm9PZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEY0cm9lZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGNHJvdWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEY0cmxPZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEY0cmxlZlhFZHVxSG9PSmJVUlpSdyIgeD0iNzE1NCIgeT0iNjc2NCIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRjRyby1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRTRDRjMwMUFFIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGNHJwdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IRjRycC1mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMjc5NCIgaGVpZ2h0PSIxMDQ5Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRjRycU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRjRycWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRjRycXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGNHJxLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGNHJyT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGNHJyZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGNHJydWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGNHJyLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGNHJzT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGNHJzZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRjRyc3VmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hGNHJwT2ZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hGNHJwZWZYRWR1cUhvT0piVVJaUnciIHg9IjEzNDg3IiB5PSI3NDUiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEY0cjF1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREU0QTk3MDEyMyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR0IxTU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEdCMU1lZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjM0MDMiIGhlaWdodD0iMTA0OSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdCMU11ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdCMU0tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdCMU5PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR0IxTmVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IR0IxTnVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR0IxTi1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IR0IxT09mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR0IxT2VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IR0IxT3VmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR0IxTy1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEdCMVBPZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IRjRyMS1mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRjRyMk9mWEVkdXFIb09KYlVSWlJ3IiB4PSI3NDQyIiB5PSI3NDUiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdCMVlPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyOTRFQjkwMDBGQyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR0IxWS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEdCMVpPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjM1ODkiIGhlaWdodD0iOTkwIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR0IxWmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR0IxWnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR0IxWi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHQjFhT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hHQjFhZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHQjFhdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hHQjFhLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHQjFiT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hHQjFiZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHQjFidWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IR0IxYi1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hHQjFZZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hHQjFZdWZYRWR1cUhvT0piVVJaUnciIHg9Ijc0NSIgeT0iODgwIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MRGlhZ3JhbVN0eWxlIiB4bWk6aWQ9Il9HdGNXRi1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEY0cllPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyNzk2MkQzMDAzRiIgc291cmNlPSJfSEY0clFPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEY0clVPZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRjRyWS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRjRyWmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGNHJadWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEY0clpPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEY0clotZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjc5NjJENDAyMEUiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRjRyYWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEY0cmFPZlhFZHVxSG9PSmJVUlpSdyIgeT0iMzk2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRjRyYXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjc5NjJENDAyMEUiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRjRyYk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGNHJhLWZYRWR1cUhvT0piVVJaUnciIHg9IjQxIiB5PSItMzQ4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRjRyYmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjc5NjJENDAyMDMiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRjRyYi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRjRyYnVmWEVkdXFIb09KYlVSWlJ3IiB4PSI0NjAiIHk9IjI3OSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEY0cmNPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyNzk2MkQ0MDIwMyI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGNHJjdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRjRyY2VmWEVkdXFIb09KYlVSWlJ3IiB4PSItODEiIHk9Ii0yODgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGNHJjLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjc5NjJENDAyMEUiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRjRyZGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEY0cmR1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRjRyZE9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRjRyZC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjc5NjJENDAyMDMiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRjRyZWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEY0cmV1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRjRyZU9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRjRyZS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyNzk2MkQ0MDIwRSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGNHJmZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRjRyZnVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGNHJmT2ZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGNHJmLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjc5NjJENDAyMDMiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRjRyZ2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRjRyZ3VmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGNHJnT2ZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hGNHJZZWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hGNHJZdWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzc2MiwgLTY3LCAtMTA2MTcsIC0xNl0kWzEwNjE3LCAtNjcsIC03NjIsIC0xNl0iLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEY0cnMtZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMUU0RTNCMDMxOSIgc291cmNlPSJfSEY0cm8tZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEY0cm8tZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRjRydHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRjRydU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGNHJ1ZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEY0cnQtZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEY0cnV1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMUU0RTNEMDM2NCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGNHJ2T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRjRydS1mWEVkdXFIb09KYlVSWlJ3IiB4PSItNDYyIiB5PSIyNTQiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGNHJ2ZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMUU0RTNEMDM2NCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGNHJ2LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEY0cnZ1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTM2MCIgeT0iLTMzOSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEY0cndPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRTRFM0QwMzYyIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEY0cnd1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEY0cndlZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTIxMiIgeT0iNDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRjRydy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRTRFM0QwMzYyIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEY0cnhlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGNHJ4T2ZYRWR1cUhvT0piVVJaUnciIHg9IjQ3NiIgeT0iLTMzMSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEY0cnh1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMUU0RTNEMDM2NCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGNHJ5T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRjRyeWVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGNHJ4LWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGNHJ5dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMUU0RTNEMDM2MiI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGNHJ6T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRjRyemVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGNHJ5LWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGNHJ6dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRTRFM0QwMzY0Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEY0cjBPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGNHIwZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEY0cnotZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEY0cjB1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMUU0RTNEMDM2MiI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGNHIxT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGNHIxZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEY0cjAtZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEY0cnRPZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEY0cnRlZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMTM5NywgMTY5LCAxMzk3LCAxNjldJFsyNTczLCAxNjksIDI1NzMsIDE2OV0kWzI1NzMsIDE0ODEsIDI1NzMsIDE0ODFdJFs1NDEsIDE0ODEsIDU0MSwgMTQ4MV0kWzU0MSwgNTI0LCA1NDEsIDUyNF0iLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEdCMVBlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMUU0REFDMDFBMCIgc291cmNlPSJfSEY0cjF1ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEY0cm8tZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR0IxUU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR0IxUXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHQjFRLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEdCMVFlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdCMVJPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMUU0REFEMDA1NyI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHQjFSdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IR0IxUmVmWEVkdXFIb09KYlVSWlJ3IiB4PSI0MDAiIHk9Ii0xOTUiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHQjFSLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMUU0REFEMDA1NyI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHQjFTZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEdCMVNPZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTEyNSIgeT0iLTM0OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdCMVN1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRTREQUQwMDREIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdCMVRPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEdCMVMtZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTIiIHk9Ii0xNDQiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHQjFUZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjFFNERBRDAwNEQiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR0IxVC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEdCMVR1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTYyNSIgeT0iMjIzIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR0IxVU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRTREQUQwMDU3Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdCMVV1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hHQjFVLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEdCMVVlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdCMVZPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRTREQUQwMDREIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdCMVZ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hHQjFWLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEdCMVZlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdCMVdPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjFFNERBRDAwNTciPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR0IxV3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEdCMVctZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IR0IxV2VmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR0IxWE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRTREQUQwMDREIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdCMVh1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEdCMVgtZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IR0IxWGVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IR0IxUHVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IR0IxUC1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlsxOTA1LCAxMDYsIC0zMTQ5LCAxMDZdJFs0MTI4LCAxMDYsIC05MjYsIDEwNl0iLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEdCMWNPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyOTRFQzYwMDJCRCIgc291cmNlPSJfSEY0cjF1ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEdCMVlPZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR0IxYy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR0IxZGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHQjFkdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEdCMWRPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdCMWQtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyOTRFQzYwMDJCRiI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHQjFlZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IR0IxZU9mWEVkdXFIb09KYlVSWlJ3IiB4PSIyMDUiIHk9IjE5NCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdCMWV1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjk0RUM2MDAyQkYiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR0IxZk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hHQjFlLWZYRWR1cUhvT0piVVJaUnciIHg9Ijc3MiIgeT0iLTI0NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdCMWZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI5NEVDNjAwMkJFIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdCMWYtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEdCMWZ1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTE2MSIgeT0iMTk0Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR0IxZ09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyOTRFQzYwMDJCRSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHQjFndWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IR0IxZ2VmWEVkdXFIb09KYlVSWlJ3IiB4PSIxNDQiIHk9IjM0NyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdCMWctZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyOTRFQzYwMDJCRiI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHQjFoZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IR0IxaHVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hHQjFoT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHQjFoLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyOTRFQzYwMDJCRSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHQjFpZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IR0IxaXVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hHQjFpT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHQjFpLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI5NEVDNjAwMkJGIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdCMWplZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hHQjFqdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEdCMWpPZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdCMWotZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyOTRFQzYwMDJCRSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHQjFrZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hHQjFrdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEdCMWtPZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEdCMWNlZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEdCMWN1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTE3MDEsIDUwLCA0OTAyLCAtNTBdJFstNDgwOSwgNTAsIDE3OTQsIC01MF0iLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEdCMWstZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDMyRiIgc291cmNlPSJfSEY0clFPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEY0cmctZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR0IxbHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR0IxbU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHQjFtZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEdCMWwtZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEdCMWxPZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEdCMWxlZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTI1LCAtNDkxLCAtMjUsIDE2OTNdJFstMjUsIC0xNjU5LCAtMjUsIDUyNF0iLz4NCi0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hHQjFtdWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEdCMW0tZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hHQjFuT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBODMxODAwQjgiIHNvdXJjZT0iX0hGNHJRT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hGNHJrLWZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdCMW4tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdCMW9lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR0Ixb3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hHQjFvT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hHQjFuZWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEdCMW51ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbNzYyLCAxODYsIC01MTMwLCAtMTMzN10kWzQ1NTUsIDExNjgsIC0xMzM3LCAtMzU1XSIvPg0KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEdCMW8tZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IR0IxcE9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEdCMXBlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyOTRFQzRBMDMwNiIgc291cmNlPSJfSEY0cmctZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEdCMVlPZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR0IxcU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR0IxcXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHQjFxLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEdCMXFlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEdCMXB1ZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEdCMXAtZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMjUsIC01MjQsIDc2LCAxNjA4XSRbMjUsIC0xNjQyLCA3NiwgNDkxXSIvPg0KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEdCMXJPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IR0IxcmVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEdCMXJ1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyNzk4MzBFMDE1MCIgc291cmNlPSJfSEY0clVPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEY0cm8tZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR0Ixc2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR0Ixcy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHQjF0T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEdCMXN1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEdCMXItZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEdCMXNPZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMjExLCAtNDgyLCAtNzAyLCAzODg2XSRbMjExLCAtMzg0MywgLTcwMiwgNTI0XSIvPg0KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEdCMXRlZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IR0IxdHVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEdCMXQtZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E4MzIzMDBGRSIgc291cmNlPSJfSEY0clVPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEY0cmstZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR0IxdXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR0Ixdk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHQjF2ZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEdCMXUtZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEdCMXVPZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IR0IxdWVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstNzcwLCAyMDMsIDQ3MTUsIC0xMzcxXSRbLTQxNTcsIDExNzYsIDEzMjksIC0zOTddIi8+DQotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IR0IxdnVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hHQjF2LWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICA8L2NvbnRlbnRzPg0KLSAgICAgICAgICAgIDxjb250ZW50cyB4bWk6dHlwZT0ibm90YXRpb246RGlhZ3JhbSIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDI3QTg1NEQwMkJGIiB0eXBlPSJDbGFzcyIgbmFtZT0iV29ya0RlZmluaXRpb24iPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHTG1NT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBODU3QjAzMzMiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdMbU0tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hHTG1OT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHTG1OZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHTG1OdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHTG1OLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdMbU9PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IR0xtT2VmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR0xtT3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IR0xtTy1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR0xtUE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IR0xtUGVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR0xtUHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEdMbVAtZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IR0xtTWVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9Ik5vbmUiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IR0xtTXVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxMDk3MiIgeT0iOTQ4IiB3aWR0aD0iMjg1MyIgaGVpZ2h0PSIyMjY5Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHTG1RT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBODJEMzAxN0YiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdMbVEtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hHTG1ST2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHTG1SZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHTG1SdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHTG1SLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdMbVNPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IR0xtU2VmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR0xtU3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IR0xtUy1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR0xtVE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IR0xtVGVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR0xtVHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEdMbVQtZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IR0xtUWVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IR0xtUXVmWEVkdXFIb09KYlVSWlJ3IiB4PSIyODQxIiB5PSI4OTciIHdpZHRoPSIzMzY0IiBoZWlnaHQ9IjIyNjkiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdlaFktZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI5RSI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR2VoWnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEdlaFotZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdlaGFPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdlaGFlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdlaGF1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR2VoYS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IR2VoYk9mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR2VoYmVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IR2VoYnVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR2VoYi1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IR2VoY09mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR2VoY2VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEdlaGN1ZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IR2VoWk9mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IR2VoWmVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxOTAyIiB5PSI0NzU1Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHZWhmT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjc5NEE2NjAzNjgiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdlaGYtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hHZWhnT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHZWhnZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHb1NJT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHb1NJZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdvU0l1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEdvU0ktZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdvU0pPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEdvU0plZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdvU0p1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEdvU0otZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdvU0tPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hHb1NLZWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEdlaGZlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEdlaGZ1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iNTcwNiIgeT0iNDc1NSIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTERpYWdyYW1TdHlsZSIgeG1pOmlkPSJfR3RtSEVlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hHTG1VT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBODdFOTAwNjEiIHNvdXJjZT0iX0hHTG1RT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hHTG1NT2ZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdlaElPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdlaEl1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR2VoSS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hHZWhJZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHZWhKT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTg3RTkwMkQ5Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdlaEp1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hHZWhKZWZYRWR1cUhvT0piVVJaUnciIHk9IjM5NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdlaEotZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTg3RTkwMkQ5Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdlaEtlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IR2VoS09mWEVkdXFIb09KYlVSWlJ3IiB5PSItMzk3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR2VoS3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBODdFOTAyQ0YiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR2VoTE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IR2VoSy1mWEVkdXFIb09KYlVSWlJ3IiB4PSIxNTciIHk9IjI3MCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdlaExlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E4N0U5MDJDRiI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHZWhMLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IR2VoTHVmWEVkdXFIb09KYlVSWlJ3IiB4PSItODI2IiB5PSItMjU1Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR2VoTU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTg3RTkwMkQ5Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdlaE11ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hHZWhNLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEdlaE1lZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdlaE5PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTg3RTkwMkNGIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdlaE51ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hHZWhOLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEdlaE5lZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdlaE9PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBODdFOTAyRDkiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR2VoT3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEdlaE8tZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IR2VoT2VmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR2VoUE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTg3RTkwMkNGIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdlaFB1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEdlaFAtZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IR2VoUGVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IR0xtVWVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IR0xtVXVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlsxNDMwLCAtNTc1LCAtNjE4OSwgLTYyNl0kWzYxOTcsIC01NzUsIC0xNDIyLCAtNjI2XSIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IR2VoUU9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTg4MzQwMTEwIiBzb3VyY2U9Il9IR0xtUU9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IR0xtTU9mWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHZWhRLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHZWhSZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdlaFJ1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IR2VoUk9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR2VoUi1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E4ODM0MDJFOCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHZWhTZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IR2VoU09mWEVkdXFIb09KYlVSWlJ3IiB5PSIzOTYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHZWhTdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E4ODM0MDJFOCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHZWhUT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEdlaFMtZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTM5NyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdlaFRlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTg4MzQwMkRFIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdlaFQtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEdlaFR1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTgyIiB5PSIzMDQiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHZWhVT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBODgzNDAyREUiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR2VoVXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEdlaFVlZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTg3NiIgeT0iLTIyMSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdlaFUtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E4ODM0MDJFOCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHZWhWZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IR2VoVnVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hHZWhWT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHZWhWLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E4ODM0MDJERSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHZWhXZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IR2VoV3VmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hHZWhXT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHZWhXLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTg4MzQwMkU4Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdlaFhlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hHZWhYdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEdlaFhPZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdlaFgtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E4ODM0MDJERSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHZWhZZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hHZWhZdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEdlaFlPZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEdlaFFlZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEdlaFF1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMTY2NywgNjA5LCAtNjE5MSwgNTU2XSRbNjQyOSwgNjA5LCAtMTQyOSwgNTU2XSIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IR2VoYy1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTgzMTgwMEI4IiBzb3VyY2U9Il9IR2VoWS1mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IR0xtUU9mWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHZWhkdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHZWhlT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdlaGVlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IR2VoZC1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IR2VoZE9mWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hHZWhkZWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzI2MiwgLTQ1NywgLTE5MjEsIDMyNTFdJFsxNTA3LCAtMjU3MywgLTY3NywgMTEzNF0iLz4NCi0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hHZWhldWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEdlaGUtZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hHb1NLdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjc5NjJEMzAwM0YiIHNvdXJjZT0iX0hHZWhZLWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hHZWhmT2ZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdvU0xlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdvU0wtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR29TTU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hHb1NMdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHb1NNZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3OTYyRDQwMjBFIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdvU00tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hHb1NNdWZYRWR1cUhvT0piVVJaUnciIHk9IjM5NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdvU05PZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3OTYyRDQwMjBFIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdvU051ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IR29TTmVmWEVkdXFIb09KYlVSWlJ3IiB4PSI0NjMiIHk9Ii0yOTQiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHb1NOLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyNzk2MkQ0MDIwMyI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHb1NPZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hHb1NPT2ZYRWR1cUhvT0piVVJaUnciIHg9Ii0yMTAiIHk9IjI1NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdvU091ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyNzk2MkQ0MDIwMyI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHb1NQT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IR29TTy1mWEVkdXFIb09KYlVSWlJ3IiB4PSItNTc3IiB5PSItMjg1Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR29TUGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3OTYyRDQwMjBFIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdvU1AtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hHb1NRT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEdvU1B1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdvU1FlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3OTYyRDQwMjAzIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdvU1EtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hHb1NST2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEdvU1F1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdvU1JlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjc5NjJENDAyMEUiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR29TUi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEdvU1NPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IR29TUnVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR29TU2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3OTYyRDQwMjAzIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdvU1MtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEdvU1RPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IR29TU3VmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IR29TSy1mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IR29TTE9mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9Ils2NjEsIDUzLCAtMzE3NSwgNTNdJFszMTIyLCA1MywgLTcxNCwgNTNdIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hHb1NUZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBODMyMzAwRkUiIHNvdXJjZT0iX0hHZWhmT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hHTG1RT2ZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdvU1VPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdvU1V1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR29TVS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hHb1NVZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hHb1NUdWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEdvU1QtZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTI2MiwgLTQ1NywgMTgyMCwgMzI1MV0kWy0xNDQ3LCAtMjU3MywgNjM1LCAxMTM0XSIvPg0KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEdvU1ZPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IR29TVmVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgPC9jb250ZW50cz4NCi0gICAgICAgICAgPC9lQW5ub3RhdGlvbnM+DQotICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3NaMFRlZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI5NCI+DQotICAgICAgICAgICAgPGJvZHk+MDI8L2JvZHk+DQotICAgICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgICA8cGFja2FnZU1lcmdlIHhtaTppZD0iX0NyNmZJT3hkRWR1SGplM3BQYWhONEEiIG1lcmdlZFBhY2thZ2U9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyNjIiLz4NCi0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyOTYiIG5hbWU9IlJvbGUiPg0KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3NaMFZPZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI5NiI+DQotICAgICAgICAgICAgICA8Ym9keT5BIFJvbGUgaXMgYSBjb250ZW50IGVsZW1lbnQgdGhhdCBkZWZpbmVzIGEgc2V0IG9mIHJlbGF0ZWQgc2tpbGxzLCBjb21wZXRlbmNpZXMsIGFuZCByZXNwb25zaWJpbGl0aWVzLiAgUm9sZXMgYXJlIHVzZWQgYnkgVGFza3MgdG8gZGVmaW5lIHdobyBwZXJmb3JtcyB0aGVtIGFzIHdlbGwgYXMgZGVmaW5lIGEgc2V0IG9mIHdvcmsgcHJvZHVjdHMgdGhleSBhcmUgcmVzcG9uc2libGUgZm9yLiAgDQotQSBSb2xlIGRlZmluZXMgYSBzZXQgb2YgcmVsYXRlZCBza2lsbHMsIGNvbXBldGVuY2llcywgYW5kIHJlc3BvbnNpYmlsaXRpZXMgb2YgYW4gaW5kaXZpZHVhbCBvciBhIHNldCBvZiBpbmRpdmlkdWFscy4gIFJvbGVzIGFyZSBub3QgaW5kaXZpZHVhbHMgb3IgcmVzb3VyY2VzLiAgSW5kaXZpZHVhbCBtZW1iZXJzIG9mIHRoZSBkZXZlbG9wbWVudCBvcmdhbml6YXRpb24gd2lsbCB3ZWFyIGRpZmZlcmVudCBoYXRzLCBvciBwZXJmb3JtIGRpZmZlcmVudCByb2xlcy4gVGhlIG1hcHBpbmcgZnJvbSBpbmRpdmlkdWFsIHRvIHJvbGUsIHBlcmZvcm1lZCBieSB0aGUgcHJvamVjdCBtYW5hZ2VyIHdoZW4gcGxhbm5pbmcgYW5kIHN0YWZmaW5nIGZvciBhIHByb2plY3QsIGFsbG93cyBkaWZmZXJlbnQgaW5kaXZpZHVhbHMgdG8gYWN0IGFzIHNldmVyYWwgZGlmZmVyZW50IHJvbGVzLCBhbmQgZm9yIGEgcm9sZSB0byBiZSBwbGF5ZWQgYnkgc2V2ZXJhbCBpbmRpdmlkdWFscy4NCi08L2JvZHk+DQotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDMwNyIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI2QyIvPg0KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MzAwRjgiIG5hbWU9Im1vZGlmaWVzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyQkMiIGlzRGVyaXZlZD0idHJ1ZSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MEYzNkM5MzAwRjUiPg0KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3NfcUtPZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4NCi0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0dzX3FKLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MzAxMEMiIG5hbWU9InJlc3BvbnNpYmxlRm9yIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyQkMiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDBGMzZDOTMwMTA5Ij4NCi0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0dzX3FNZWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+DQotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9Hc19xTU9mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjlFIiBuYW1lPSJUYXNrIj4NCi0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dzaS1NLWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyOUUiPg0KLSAgICAgICAgICAgICAgPGJvZHk+QSBUYXNrIGlzIGEgY29udGVudCBlbGVtZW50IHRoYXQgZGVzY3JpYmVzIHdvcmsgYmVpbmcgcGVyZm9ybWVkIGJ5IFJvbGVzLiAgSXQgZGVmaW5lcyBvbmUgZGVmYXVsdCBwZXJmb3JtaW5nIFJvbGUgYXMgd2VsbCBhcyBtYW55IGFkZGl0aW9uYWwgcGVyZm9ybWVycy4gIEEgVGFzayBpcyBhc3NvY2lhdGVkIHRvIGlucHV0IGFuZCBvdXRwdXQgd29yayBwcm9kdWN0cy4gIElucHV0cyBhcmUgZGlmZmVyZW50aWF0ZWQgaW4gbWFuZGF0b3J5IHZlcnN1cyBvcHRpb25hbCBpbnB1dHMuICBUaGUgYXNzb2NpYXRpb25zIHRvIFdvcmsgUHJvZHVjdHMgYXJlIG5vdCBpbnN0YW50aWF0YWJsZS92YXJpYWJsZS1saWtlIHBhcmFtZXRlcnMuICBUaGV5IHJhdGhlciBleHByZXNzIChoeXBlci0pbGlua3MgdG8gdGhlIGRlc2NyaXB0aW9ucyBvZiB0aGUgd29yayBwcm9kdWN0cyB0eXBlcyB0aGF0IGFyZSByZWxhdGVkIHRvIHRoZSBUYXNrIGFzIGlucHV0cyBhbmQgb3V0cHV0cy4gIEluIG90aGVyIHdvcmRzLCB0aGVzZSBhc3NvY2lhdGlvbnMgYXJlIG5vdCBpbnRlbmRlZCB0byBiZSB1c2VkIHRvIGNhcHR1cmUgd2hpY2ggY29uY3JldGUgaW5zdGFuY2VzIHdpbGwgYmUgcGFzc2VkIHdoZW4gaW5zdGFudGlhdGluZyB0aGUgbWV0aG9kIGluIGEgcHJvamVjdC4gIEFsbCBvZiB0aGUgVGFzaydzIGRlZmF1bHQgYXNzb2NpYXRpb25zIGNhbiBiZSBvdmVycmlkZGVuIGluIGFuIGFjdHVhbCBwcm9jZXNzIGRlZmluaXRpb24uDQotQSBUYXNrIGRlc2NyaWJlcyBhbiBhc3NpZ25hYmxlIHVuaXQgb2Ygd29yay4gIEV2ZXJ5IFRhc2sgaXMgYXNzaWduZWQgdG8gc3BlY2lmaWMgUm9sZXMuICBUaGUgZ3JhbnVsYXJpdHkgb2YgYSBUYXNrIGlzIGdlbmVyYWxseSBhIGZldyBob3VycyB0byBhIGZldyBkYXlzLiAgSXQgdXN1YWxseSBhZmZlY3RzIG9uZSBvciBvbmx5IGEgc21hbGwgbnVtYmVyIG9mIHdvcmsgcHJvZHVjdHMuIEEgVGFzayBpcyB1c2VkIGFzIGFuIGVsZW1lbnQgb2YgZGVmaW5pbmcgYSBwcm9jZXNzLiBUYXNrcyBhcmUgZnVydGhlciB1c2VkIGZvciBwbGFubmluZyBhbmQgdHJhY2tpbmcgcHJvZ3Jlc3M7IHRoZXJlZm9yZSwgaWYgdGhleSBhcmUgZGVmaW5lZCB0b28gZmluZS1ncmFpbmVkLCB0aGV5IHdpbGwgYmUgbmVnbGVjdGVkLCBhbmQgaWYgdGhleSBhcmUgdG9vIGxhcmdlLCBwcm9ncmVzcyB3b3VsZCBoYXZlIHRvIGJlIGV4cHJlc3NlZCBpbiB0ZXJtcyBvZiBhIFRhc2sncyBwYXJ0cyAoZS5nLiBTdGVwcywgd2hpY2ggaXMgbm90IHJlY29tbWVuZGVkKS4gDQotQSBUYXNrIGhhcyBhIGNsZWFyIHB1cnBvc2UgaW4gd2hpY2ggdGhlIHBlcmZvcm1pbmcgcm9sZXMgYWNoaWV2ZSBhIHdlbGwgZGVmaW5lZCBnb2FsLiAgSXQgcHJvdmlkZXMgY29tcGxldGUgc3RlcC1ieS1zdGVwIGV4cGxhbmF0aW9ucyBvZiBkb2luZyBhbGwgdGhlIHdvcmsgdGhhdCBuZWVkcyB0byBiZSBkb25lIHRvIGFjaGlldmUgdGhpcyBnb2FsLiAgVGhpcyBkZXNjcmlwdGlvbiBpcyBjb21wbGV0ZSwgaW5kZXBlbmRlbnQgb2Ygd2hlbiBpbiBhIHByb2Nlc3MgbGlmZWN5Y2xlIHRoZSB3b3JrIHdvdWxkIGFjdHVhbGx5IGJlIGRvbmUuICBJdCB0aGVyZWZvcmUgZG9lcyBub3QgZGVzY3JpYmUgd2hlbiB5b3UgZG8gd2hhdCB3b3JrIGF0IHdoYXQgcG9pbnQgb2YgdGltZSwgYnV0IGRlc2NyaWJlcyBhbGwgdGhlIHdvcmsgdGhhdCBnZXRzIGRvbmUgdGhyb3VnaG91dCB0aGUgZGV2ZWxvcG1lbnQgbGlmZWN5Y2xlIHRoYXQgY29udHJpYnV0ZXMgdG8gdGhlIGFjaGlldmVtZW50IG9mIHRoaXMgZ29hbC4gIFdoZW4gdGhlIFRhc2sgaXMgYmVpbmcgYXBwbGllZCBpbiBhIHByb2Nlc3MgdGhlbiB0aGlzIHByb2Nlc3MgYXBwbGljYXRpb24gKGRlZmluZWQgYXMgVGFzayBEZXNjcmlwdG9yKSBwcm92aWRlcyB0aGUgaW5mb3JtYXRpb24gb2Ygd2hpY2ggcGllY2VzIG9mIHRoZSBUYXNrIHdpbGwgYWN0dWFsbHkgYmUgcGVyZm9ybWVkIGF0IGFueSBwYXJ0aWN1bGFyIHBvaW50IGluIHRpbWUuIFRoaXMgYXNzdW1lcyB0aGF0IHRoZSBUYXNrIHdpbGwgYmUgcGVyZm9ybWVkIGluIHRoZSBwcm9jZXNzIG92ZXIgYW5kIG92ZXIgYWdhaW4sIGJ1dCBlYWNoIHRpbWUgd2l0aCBhIHNsaWdodGx5IGRpZmZlcmVudCBlbXBoYXNpcyBvbiBkaWZmZXJlbnQgc3RlcHMgb3IgYXNwZWN0cyBvZiB0aGUgdGFzayBkZXNjcmlwdGlvbi4gDQotRm9yIGV4YW1wbGUsIGEgVGFzayBzdWNoIGFzICZxdW90O0RldmVsb3AgVXNlIENhc2UgTW9kZWwmcXVvdDsgZGVzY3JpYmVzIGFsbCB0aGUgd29yayB0aGF0IG5lZWRzIHRvIGJlIGRvbmUgdG8gZGV2ZWxvcCBhIGNvbXBsZXRlIHVzZSBjYXNlIG1vZGVsLiBUaGlzIHdvdWxkIGNvbXByaXNlIG9mIHRoZSBpZGVudGlmaWNhdGlvbiBhbmQgbmFtaW5nIG9mIHVzZSBjYXNlcyBhbmQgYWN0b3JzLCB0aGUgd3JpdGluZyBvZiBhIGJyaWVmIGRlc2NyaXB0aW9uLCB0aGUgbW9kZWxpbmcgb2YgdXNlIGNhc2VzIGFuZCB0aGVpciByZWxhdGlvbnNoaXBzIGluIGRpYWdyYW1zLCB0aGUgZGV0YWlsZWQgZGVzY3JpcHRpb24gb2YgYSBiYXNpYyBmbG93LCB0aGUgZGV0YWlsZWQgZGVzY3JpcHRpb24gb2YgYWx0ZXJuYXRpdmVzIGZsb3dzLCBwZXJmb3JtaW5nIG9mIHdhbGt0aHJvdWdocyB3b3Jrc2hvcHMgYW5kIHJldmlld3MsIGV0Yy4gIEFsbCBvZiB0aGVzZSBwYXJ0cyBjb250cmlidXRlIHRvIHRoZSBkZXZlbG9wbWVudCBnb2FsIG9mIGRldmVsb3BpbmcgdGhlIHVzZSBjYXNlIG1vZGVsLCBidXQgdGhlIHBhcnRzIHdpbGwgYmUgcGVyZm9ybWVkIGF0IGRpZmZlcmVudCBwb2ludHMgaW4gdGltZSBpbiBhIHByb2Nlc3MuICBJZGVudGlmaWNhdGlvbiwgbmFtaW5nLCBhbmQgYnJpZWYgZGVzY3JpcHRpb25zIHdvdWxkIGJlIHBlcmZvcm1lZCBlYXJseSBpbiBhIHR5cGljYWwgZGV2ZWxvcG1lbnQgcHJvY2VzcyB2ZXJzdXMgdGhlIHdyaXRpbmcgb2YgZGV0YWlsZWQgYWx0ZXJuYXRpdmUgZmxvd3Mgd2hpY2ggd291bGQgYmUgcGVyZm9ybWVkIG11Y2ggbGF0ZXIuICBBbGwgdGhlc2UgcGFydHMgb3Igc3RlcHMgd2l0aGluIHRoZSBzYW1lIFRhc2sgZGVmaW5lIHRoZSAmcXVvdDttZXRob2QmcXVvdDsgb2YgRGV2ZWxvcGluZyBhIFVzZSBDYXNlIE1vZGVsLiAgQXBwbHlpbmcgc3VjaCBhIG1ldGhvZCBpbiBhIGxpZmVjeWNsZSAoaS5lLiBpbiBhIHByb2Nlc3MpIGlzIGRlZmluaW5nIHdoaWNoIHN0ZXBzIGFyZSBkb25lIHdoZW4gZ29pbmcgZnJvbSBvbmUgaXRlcmF0aW9uIHRvIHRoZSBuZXh0Lg0KLTwvYm9keT4NCi0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMzJGIiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjZDIi8+DQotICAgICAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyN0E4MzE4MDBCOCIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQyN0E4MkQzMDE3RiIvPg0KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAzMDkiIG5hbWU9InBlcmZvcm1lZEJ5IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyOTYiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMzA4Ij4NCi0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0dzMmdOLWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+DQotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HczJnTnVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwM0E4IiBuYW1lPSJtYW5kYXRvcnlJbnB1dCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMkJDIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDM5RCI+DQotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HczJnUS1mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3MyZ1F1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDNCRSIgbmFtZT0ib3V0cHV0IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyQkMiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwM0JCIj4NCi0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0dzMmdUT2ZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+DQotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HczJnUy1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDExN0NGNUQwMzU3IiBuYW1lPSJhZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjk2IiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQxMTdDRjVDMDFDQyI+DQotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9Hc19xT3VmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3NfcU9lZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxNzdGODRBMDI1RSIgbmFtZT0ib3B0aW9uYWxJbnB1dCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMkJDIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQxNzdGODQ5MDEzMSI+DQotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HdEpiTnVmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3RKYk5lZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyNzk2MkQ0MDIwMyIgbmFtZT0ic3RlcHMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQyNzk0QTY2MDM2OCIgaXNEZXJpdmVkPSJ0cnVlIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQyNzk2MkQzMDAzRiI+DQotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HdFRNSS1mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3RUTUl1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDJCQyIgbmFtZT0iV29ya1Byb2R1Y3QiIGlzQWJzdHJhY3Q9InRydWUiPg0KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3NpLU9PZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDJCQyI+DQotICAgICAgICAgICAgICA8Ym9keT5Xb3JrIFByb2R1Y3QgaXMgYW4gYWJzdHJhY3QgY2xhc3Mgd2hpY2ggcHJvdmlkZXMgYSBnZW5lcmFsaXphdGlvbiBmb3IgdGhlIGNvbnRlbnQgZWxlbWVudCB0eXBlcyBBcnRpZmFjdCwgT3V0Y29tZSwgYW5kIERlbGl2ZXJhYmxlLiAgVGhlIG1ldGEtbW9kZWwgY2xhc3MgV29yayBQcm9kdWN0IGFjdHVhbGx5IHJlcHJlc2VudHMgd29yayBwcm9kdWN0IHR5cGVzLCBpLmUuIGFuIGluc3RhbmNlIG9mIFdvcmsgUHJvZHVjdCBpcyBhIGRlc2NyaXB0aW9uIG9mIGEgc3BlY2lmaWMgdHlwZSBvZiB3b3JrIHByb2R1Y3QgYW5kIG5vdCBhbiBpbmRpdmlkdWFsIHdvcmsgcHJvZHVjdCBpbnN0YW5jZS4gIEhvd2V2ZXIsIGZvciBzaW1wbGljaXR5IHJlYXNvbnMgYW5kIGJlY2F1c2Ugb2YgbG93IHJpc2sgb2YgbWlzaW50ZXJwcmV0YXRpb24gd2UgZGlkIG5vdCBhcHBlbmQgdGhlIHdvcmQgJ3R5cGUnIHRvIGV2ZXJ5IG1ldGEtY2xhc3MuDQotQSB3b3JrIHByb2R1Y3QgaXMgYW4gYWJzdHJhY3Rpb24gZm9yIGRlc2NyaXB0aW9ucyBvZiBjb250ZW50IGVsZW1lbnRzIHRoYXQgYXJlIHVzZWQgdG8gZGVmaW5lIGFueXRoaW5nIHVzZWQsIHByb2R1Y2VkLCBvciBtb2RpZmllZCBieSBhIHRhc2suDQotPC9ib2R5Pg0KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAzRDkiIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyNkMiLz4NCi0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMkRBIiBuYW1lPSJHdWlkYW5jZSIgaXNBYnN0cmFjdD0idHJ1ZSI+DQotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9Hc2ktUE9mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMkRBIj4NCi0gICAgICAgICAgICAgIDxib2R5Pkd1aWRhbmNlIGlzIGFuIGFic3RyYWN0IGdlbmVyYWxpemF0aW9uIG9mIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVsYXRlZCB0byBjb250ZW50IGVsZW1lbnRzIHN1Y2ggYXMgUm9sZXMsIFRhc2tzLCBhbmQgV29yayBQcm9kdWN0cy4gIEV4YW1wbGVzIGZvciBHdWlkYW5jZSBhcmUgR3VpZGVsaW5lcywgVGVtcGxhdGVzLCBDaGVja2xpc3RzLCBUb29sIE1lbnRvcnMsIEVzdGltYXRlcywgU3VwcG9ydGluZyBNYXRlcmlhbHMsIFJlcG9ydHMsIENvbmNlcHRzLCBldGMuICBUaGlzIHBhY2thZ2Ugb25seSBjb250YWlucyB0aGUgZGVmaW5pdGlvbiBvZiB0aGUgYWJzdHJhY3QgR3VpZGFuY2UgY2xhc3MuICBUaGUgcGFja2FnZSBHdWlkYW5jZSBUeXBlcyBkZWZpbmVzIGNvbmNyZXRlIGd1aWRhbmNlIHR5cGVzLjwvYm9keT4NCi0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDOTMwMTFEIiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjZDIi8+DQotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDE3RiIgbmFtZT0iQXJ0aWZhY3QiPg0KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3NpLVFPZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDE3RiI+DQotICAgICAgICAgICAgICA8Ym9keT5BcnRpZmFjdCBpcyBhIFdvcmsgUHJvZHVjdCB0aGF0IHByb3ZpZGVzIGEgZGVzY3JpcHRpb24gYW5kIGRlZmluaXRpb24gZm9yIHRhbmdpYmxlIHdvcmsgcHJvZHVjdCB0eXBlcy4gQXJ0aWZhY3RzIG1heSBiZSBjb21wb3NlZCBvZiBvdGhlciBhcnRpZmFjdHMuIEZvciBleGFtcGxlLCBhIG1vZGVsIGFydGlmYWN0IGNhbiBiZSBjb21wb3NlZCBvZiBtb2RlbCBlbGVtZW50cywgd2hpY2ggYXJlIGFsc28gYXJ0aWZhY3RzLg0KLUFydGlmYWN0cyBhcmUgdGFuZ2libGUgd29yayBwcm9kdWN0cyBjb25zdW1lZCwgcHJvZHVjZWQsIG9yIG1vZGlmaWVkIGJ5IFRhc2tzLiAgSXQgbWF5IHNlcnZlIGFzIGEgYmFzaXMgZm9yIGRlZmluaW5nIHJldXNhYmxlIGFzc2V0cy4gIFJvbGVzIHVzZSBBcnRpZmFjdHMgdG8gcGVyZm9ybSBUYXNrcyBhbmQgcHJvZHVjZSBBcnRpZmFjdHMgaW4gdGhlIGNvdXJzZSBvZiBwZXJmb3JtaW5nIFRhc2tzLiAgQXJ0aWZhY3RzIGFyZSB0aGUgcmVzcG9uc2liaWxpdHkgb2YgYSBzaW5nbGUgUm9sZSwgbWFraW5nIHJlc3BvbnNpYmlsaXR5IGVhc3kgdG8gaWRlbnRpZnkgYW5kIHVuZGVyc3RhbmQsIGFuZCBwcm9tb3RpbmcgdGhlIGlkZWEgdGhhdCBldmVyeSBwaWVjZSBvZiBpbmZvcm1hdGlvbiBwcm9kdWNlZCBpbiB0aGUgbWV0aG9kIHJlcXVpcmVzIHRoZSBhcHByb3ByaWF0ZSBzZXQgb2Ygc2tpbGxzLiBFdmVuIHRob3VnaCBvbmUgcm9sZSBtaWdodCAmcXVvdDtvd24mcXVvdDsgYSBzcGVjaWZpYyB0eXBlIG9mIEFydGlmYWN0cywgb3RoZXIgcm9sZXMgY2FuIHN0aWxsIHVzZSB0aGUgQXJ0aWZhY3RzOyBwZXJoYXBzIGV2ZW4gdXBkYXRlIHRoZW0gaWYgdGhlIFJvbGUgaGFzIGJlZW4gZ2l2ZW4gcGVybWlzc2lvbiB0byBkbyBzby4NCi08L2JvZHk+DQotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDAwRiIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDJCQyIvPg0KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAwMTEiIG5hbWU9ImNvbnRhaW5lckFydGlmYWN0IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxN0YiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMDEwIj4NCi0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0d0SmJKT2ZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIxIi8+DQotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HdEpiSS1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMDEzIiBuYW1lPSJjb250YWluZWRBcnRpZmFjdHMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDE3RiIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAwMTAiPg0KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3RKYkotZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4NCi0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0d0SmJKdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxODUiIG5hbWU9IkRlbGl2ZXJhYmxlIj4NCi0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dzc3ZNLWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxODUiPg0KLSAgICAgICAgICAgICAgPGJvZHk+QSBkZWxpdmVyYWJsZSBpcyBhIFdvcmsgUHJvZHVjdCB0aGF0IHByb3ZpZGVzIGEgZGVzY3JpcHRpb24gYW5kIGRlZmluaXRpb24gZm9yIHBhY2thZ2luZyBvdGhlciBXb3JrIFByb2R1Y3RzLCBhbmQgbWF5IGJlIGRlbGl2ZXJlZCB0byBhbiBpbnRlcm5hbCBvciBleHRlcm5hbCBwYXJ0eS4gIFRoZXJlZm9yZSwgYSBEZWxpdmVyYWJsZSBhZ2dyZWdhdGVzIG90aGVyIFdvcmsgUHJvZHVjdHMuIFRoZXJlZm9yZSwgYSBEZWxpdmVyYWJsZSBhZ2dyZWdhdGVzIG90aGVyIFdvcmsgUHJvZHVjdHMuICBBIERlbGl2ZXJhYmxlIGlzIHVzZWQgdG8gcHJlLWRlZmluZSB0eXBpY2FsIG9yIHJlY29tbWVuZGVkIGNvbnRlbnQgaW4gdGhlIGZvcm0gb3Igd29yayBwcm9kdWN0cyB0aGF0IHdvdWxkIGJlIHBhY2thZ2VkIGZvciBkZWxpdmVyeS4gIFRoZSBhY3R1YWwgcGFja2FnaW5nIG9mIHRoZSBEZWxpdmVyYWJsZSBpbiBhbiBhY3R1YWwgcHJvY2VzcyBvciBldmVuIHByb2plY3QgY291bGQgYmUgYSBtb2RpZmljYXRpb24gb2YgdGhpcyByZWNvbW1lbmRhdGlvbi4gIERlbGl2ZXJhYmxlcyBhcmUgdXNlZCB0byByZXByZXNlbnQgYW4gb3V0cHV0IGZyb20gYSBwcm9jZXNzIHRoYXQgaGFzIHZhbHVlLCBtYXRlcmlhbCBvciBvdGhlcndpc2UsIHRvIGEgY2xpZW50LCBjdXN0b21lciBvciBvdGhlciBzdGFrZWhvbGRlci4gPC9ib2R5Pg0KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAwMkMiIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyQkMiLz4NCi0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMDMwIiBuYW1lPSJkZWxpdmVyZWRXb3JrUHJvZHVjdHMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDJCQyIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAwMkQiPg0KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3RKYk1PZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4NCi0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0d0SmJMLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxOEYiIG5hbWU9Ik91dGNvbWUiPg0KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3Nzdk4tZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDE4RiI+DQotICAgICAgICAgICAgICA8Ym9keT5BbiBvdXRjb21lIGRlc2NyaWJlcyBpbnRhbmdpYmxlIHdvcmsgcHJvZHVjdHMgdGhhdCBhcmUgYSByZXN1bHQgb3Igc3RhdGUuIE91dGNvbWVzIG1heSBhbHNvIGJlIHVzZWQgdG8gZGVzY3JpYmUgd29yayBwcm9kdWN0cyB0aGF0IGFyZSBub3QgZm9ybWFsbHkgZGVmaW5lZC4gIEEga2V5IGRpZmZlcmVudGlhdG9yIGZvciBvdXRjb21lcyBhZ2FpbnN0IGFydGlmYWN0cyBpcyB0aGF0IG91dGNvbWVzIGFyZSBub3QgY2FuZGlkYXRlcyBmb3IgaGFydmVzdGluZyBhcyByZXVzYWJsZSBhc3NldHMuPC9ib2R5Pg0KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAwNEEiIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyQkMiLz4NCi0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDI3OTRBNjYwMzY4IiBuYW1lPSJTdGVwIj4NCi0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dzc3ZPLWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjc5NEE2NjAzNjgiPg0KLSAgICAgICAgICAgICAgPGJvZHk+QSBTdGVwIGlzIGEgU2VjdGlvbiBhbmQgV29yayBEZWZpbml0aW9uIHRoYXQgaXMgdXNlZCB0byBvcmdhbml6ZSBUYXNrcyBpbnRvIHBhcnRzIG9yIHN1YnVuaXRzIG9mIHdvcmsuICBTdGVwcyBpbmhlcml0IHRoZSBzdWJTZWN0aW9ucyBkZWNvbXBvc2l0aW9uIGZyb20gU2VjdGlvbiBhbmQgY2FuIHRoZXJlZm9yZSBkZXNjcmliZSBTdWItU3RlcHMgbmVzdGVkIGludG8gU3RlcHMuDQotQSBTdGVwIGRlc2NyaWJlcyBhIG1lYW5pbmdmdWwgYW5kIGNvbnNpc3QgcGFydCBvZiB0aGUgb3ZlcmFsbCB3b3JrIGRlc2NyaWJlZCBmb3IgYSBUYXNrLiAgVGhlIGNvbGxlY3Rpb24gb2YgU3RlcHMgZGVmaW5lZCBmb3IgYSBUYXNrIHJlcHJlc2VudHMgYWxsIHRoZSB3b3JrIHRoYXQgc2hvdWxkIGJlIGRvbmUgdG8gYWNoaWV2ZSB0aGUgb3ZlcmFsbCBkZXZlbG9wbWVudCBnb2FsIG9mIHRoZSBUYXNrLiAgTm90IGFsbCBzdGVwcyBhcmUgbmVjZXNzYXJpbHkgcGVyZm9ybWVkIGVhY2ggdGltZSBhIFRhc2sgaXMgaW52b2tlZCBpbiBhIFByb2Nlc3MgKHNlZSBUYXNrIERlc2NyaXB0b3IpLCBzbyB0aGV5IGNhbiBhbHNvIGJlIGV4cHJlc3NlZCBpbiB0aGUgZm9ybSBvZiBhbHRlcm5hdGUgJ2Zsb3dzJyBvZiB3b3JrLiAgRGlmZmVyZW50IHdheXMgb2YgYWNoaWV2aW5nIHRoZSBzYW1lIGRldmVsb3BtZW50IGdvYWwgY2FuIHRoZW4gYmUgJ2Fzc2VtYmxlZCcgYnkgc2VsZWN0aW5nIGRpZmZlcmVudCBjb21iaW5hdGlvbnMgb2Ygc3RlcHMgd2hlbiBhcHBseWluZyB0aGUgVGFzayBpbiBhIFByb2Nlc3MuICBUeXBpY2FsIGtpbmRzIG9mIHN0ZXBzIGEgVGFzayBhdXRob3Igc2hvdWxkIGNvbnNpZGVyIGFyZTogVGhpbmtpbmcgc3RlcHM6IHdoZXJlIHRoZSBpbmRpdmlkdWFsIHJvbGVzIHVuZGVyc3RhbmQgdGhlIG5hdHVyZSBvZiB0aGUgdGFzaywgZ2F0aGVycyBhbmQgZXhhbWluZXMgdGhlIGlucHV0IGFydGlmYWN0cywgYW5kIGZvcm11bGF0ZXMgdGhlIG91dGNvbWUuIFBlcmZvcm1pbmcgc3RlcHM6IHdoZXJlIHRoZSBpbmRpdmlkdWFsIHJvbGVzIGNyZWF0ZSBvciB1cGRhdGUgc29tZSBhcnRpZmFjdHMuIFJldmlld2luZyBzdGVwczogd2hlcmUgdGhlIGluZGl2aWR1YWwgcm9sZXMgaW5zcGVjdHMgdGhlIHJlc3VsdHMgYWdhaW5zdCBzb21lIGNyaXRlcmlhLg0KLTwvYm9keT4NCi0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDI3OTgzMEUwMTUwIiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDIxRTRDRjMwMUFFIi8+DQotICAgICAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyN0E4MzIzMDBGRSIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQyN0E4MkQzMDE3RiIvPg0KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MjdBODJEMzAxN0YiIG5hbWU9IldvcmtEZWZpbml0aW9uIiBpc0Fic3RyYWN0PSJ0cnVlIj4NCi0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dzc3ZRT2ZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBODJEMzAxN0YiPg0KLSAgICAgICAgICAgICAgPGJvZHk+V29yayBEZWZpbml0aW9uIGlzIGFuIGFic3RyYWN0IE1ldGhvZCBFbGVtZW50IHRoYXQgZ2VuZXJhbGl6ZXMgYWxsIGRlc2NyaXB0aW9ucyBvZiB3b3JrIHdpdGhpbiB0aGUgVW5pZmllZCBNZXRob2QgQXJjaGl0ZWN0dXJlLiAgVGhpcyBwYWNrYWdlIGludHJvZHVjZXMgdHdvIGNvbmNyZXRlIHR5cGVzIG9mIFdvcmsgRGVmaW5pdGlvbnM6IFRhc2sgYW5kIFN0ZXAuICBXb3JrIERlZmluaXRpb25zIGNhbiBjb250YWluIHNldHMgb2YgcHJlLSBhbmQgcG9zdC1jb25kaXRpb25zIGRlZmluaW5nIGNvbnN0cmFpbnRzIHRoYXQgbmVlZCB0byBiZSB2YWxpZCBiZWZvcmUgdGhlIGRlc2NyaWJlZCB3b3JrIGNhbiBiZWdpbiBvciBiZWZvcmUgaXQgY2FuIGJlIGRlY2xhcmVkIGFzIGZpbmlzaGVkLiAgTm90ZSB0aGF0IGdlbmVyYWwgb3duZWRSdWxlcyBjYW4gYmUgdXNlZCB0byBkZWZpbmUgYWRkaXRpb25hbCBjb25zdHJhaW50cyBhbmQgcnVsZXMgZm9yIFdvcmsgRGVmaW5pdGlvbnMuDQotV29yayBEZWZpbml0aW9ucyByZXByZXNlbnQgYmVoYXZpb3JhbCBkZXNjcmlwdGlvbnMgZm9yIGRvaW5nIHdvcmsuICBUaGVzZSBiZWhhdmlvcmFsIGRlc2NyaXB0aW9ucyBhcmUgbm90IGJvdW5kIHRvIG9uZSBzcGVjaWZpYyBjbGFzc2lmaWVyLCBidXQgcmVwcmVzZW50IGFuIGFyYml0cmFyeSBkZWZpbml0aW9uIG9mIHdvcmsuICBGb3IgZXhhbXBsZSwgYSBXb3JrIERlZmluaXRpb24gY291bGQgcmVwcmVzZW50IHdvcmsgdGhhdCBpcyBiZWluZyBwZXJmb3JtZWQgYnkgYSBzcGVjaWZpYyBSb2xlIChlLmcuIGEgUm9sZSBwZXJmb3JtaW5nIGEgc3BlY2lmaWMgVGFzayBvciBTdGVwcyBvZiBhIFRhc2spLCBieSBtYW55IFJvbGVzIHdvcmtpbmcgaW4gY2xvc2UgY29sbGFib3JhdGlvbiAobWFueSBSb2xlcyBhbGwgd29ya2luZyB0b2dldGhlciBvbiB0aGUgc2FtZSBpbnRlcmRpc2NpcGxpbmFyeSBUYXNrKSwgb3IgY29tcGxleCB3b3JrIHRoYXQgaXMgcGVyZm9ybWVkIHRocm91Z2hvdXQgdGhlIGxpZmVjeWNsZSAoZS5nLiBhIHByb2Nlc3MgZGVmaW5pbmcgYSBicmVha2Rvd24gc3RydWN0dXJlIGZvciBvcmdhbml6aW5nIGxhcmdlciBjb21wb3NpdGUgdW5pdHMgb2Ygd29yayBwZXJmb3JtZWQgYnkgbWFueSBSb2xlcyB3b3JraW5nIGluIGNvbGxhYm9yYXRpb24pLg0KLTwvYm9keT4NCi0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDI3QTgyRjMwMjZFIiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjgwIi8+DQotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyN0E4N0U5MDJDRiIgbmFtZT0icHJlY29uZGl0aW9uIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MjdBODU3QjAzMzMiIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDI3QTg3RTkwMDYxIj4NCi0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0d0VE1LdWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIxIi8+DQotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HdFRNS2VmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDI3QTg4MzQwMkRFIiBuYW1lPSJwb3N0Y29uZGl0aW9uIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MjdBODU3QjAzMzMiIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDI3QTg4MzQwMTEwIj4NCi0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0d0VE1NZWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIxIi8+DQotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HdFRNTU9mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMzA4IiBuYW1lPSJEZWZhdWx0X1ByaW1hcnlQZXJmb3JtZXIiIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDMwOSBfM0FEQzdCNzQwMjJENDBGMzZDOTIwMzBCIj4NCi0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dzMmdNLWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAzMDgiPg0KLSAgICAgICAgICAgICAgPGJvZHk+Um9sZXMgY2FuIGJlIGRlZmluZWQgdG8gcGVyZm9ybSBtYW55IFRhc2tzLCBidXQgZXZlcnkgVGFzayBtYXkgaGF2ZSBvbmx5IG9uZSBSb2xlIHRoYXQgaXMgYnkgZGVmYXVsdCB0aGUgcHJpbWFyeSBwZXJmb3JtZXIgb2YgdGhpcyBUYXNrLjwvYm9keT4NCi0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgICAgICA8b3duZWRFbmQgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMzBCIiBuYW1lPSIiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI5RSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAzMDgiPg0KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3MyZ091ZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4NCi0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0dzMmdPZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICA8L293bmVkRW5kPg0KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAzOUQiIG5hbWU9IkRlZmF1bHRfTWFuZGF0b3J5SW5wdXRzIiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAzOUUgXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDNBOCI+DQotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HczJnUE9mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMzlEIj4NCi0gICAgICAgICAgICAgIDxib2R5PlRoaXMgYXNzb2NpYXRpb24gcHJvdmlkZXMgbGlua3MgdG8gemVybyBvciBtYW55IGRlZmluaXRpb25zIG9mIFdvcmsgUHJvZHVjdHMgdGhhdCBhcmUgZGVmaW5lZCBhcyBtYW5kYXRvcnkgaW5wdXRzIGZvciBwZXJmb3JtaW5nIHRoaXMgVGFzay48L2JvZHk+DQotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDM5RSIgbmFtZT0iIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyOUUiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMzlEIj4NCi0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0dzMmdRT2ZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+DQotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HczJnUC1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgPC9vd25lZEVuZD4NCi0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwM0JCIiBuYW1lPSJEZWZhdWx0X091dHB1dHMiIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDNCQyBfM0FEQzdCNzQwMjJENDBGMzZDOTIwM0JFIj4NCi0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dzMmdSZWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAzQkIiPg0KLSAgICAgICAgICAgICAgPGJvZHk+VGhpcyBhc3NvY2lhdGlvbiBwcm92aWRlcyBsaW5rcyB0byB6ZXJvIG9yIG1hbnkgZGVmaW5pdGlvbnMgb2YgV29yayBQcm9kdWN0cyB0aGF0IGFyZSBkZWZpbmVkIGFzIG91dHB1dHMgb2YgdGhpcyBUYXNrLjwvYm9keT4NCi0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgICAgICA8b3duZWRFbmQgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwM0JDIiBuYW1lPSIiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI5RSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAzQkIiPg0KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3MyZ1NlZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4NCi0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0dzMmdTT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICA8L293bmVkRW5kPg0KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MzAwRjUiIG5hbWU9IkRlZmF1bHRfTW9kaWZpZXMiIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkzMDBGNiBfM0FEQzdCNzQwMjJENDBGMzZDOTMwMEY4IiBpc0Rlcml2ZWQ9InRydWUiPg0KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3NfcUllZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkzMDBGNSI+DQotICAgICAgICAgICAgICA8Ym9keT5UaGlzIGFzc29jaWF0aW9uIGlzIGRlcml2ZWQgZnJvbSB0aGUgZmFjdCB0aGF0IFJvbGVzIHBlcmZvcm0gVGFza3MgdGhhdCBoYXZlIFdvcmsgUHJvZHVjdHMgb2YgdGhhdCBwYXJ0aWN1bGFyIHR5cGUgYXMgb3V0cHV0cy4gIC9tb2RpZmllcyBwcm92aWRlcyBhbGwgdGhlIHR5cGVzIG9mIFdvcmsgUHJvZHVjdHMgdGhhdCB0aGUgUm9sZSBwcm9kdWNlcyBvciBtb2RpZmllcyB2aWEgb25lIG9mIHRoZSBUYXNrcyBkZWZpbmVkIHRvIGJlIHBlcmZvcm1lZCBieSB0aGUgUm9sZSwgZWl0aGVyIGFzIHByaW1hcnkgb3IgYWRkaXRpb25hbCBwZXJmb3JtZXIuPC9ib2R5Pg0KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MzAwRjYiIG5hbWU9Im1vZGlmaWVkQnkiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI5NiIgaXNEZXJpdmVkPSJ0cnVlIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQwRjM2QzkzMDBGNSI+DQotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9Hc19xSmVmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3NfcUpPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgIDwvb3duZWRFbmQ+DQotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkzMDEwOSIgbmFtZT0iRGVmYXVsdF9SZXNwb25zaWJsZSIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDBGMzZDOTMwMTBBIF8zQURDN0I3NDAyMkQ0MEYzNkM5MzAxMEMiPg0KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3NfcUt1ZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkzMDEwOSI+DQotICAgICAgICAgICAgICA8Ym9keT5SZXNwb25zaWJpbGl0eSBmb3IgYSB3b3JrIHByb2R1Y3QgaW5kaWNhdGVzIHRoZSByb2xlJ3Mgb3duZXJzaGlwIG9mIGFsbCBpbnN0YW5jZXMgb2YgdGhpcyB3b3JrIHByb2R1Y3QgdHlwZS4gIEZvciBleGFtcGxlLCB0aGUgcm9sZSByZXNwb25zaWJsZSBmb3IgYSB3b3JrIHByb2R1Y3QgYW5zd2VycyB0byBtYW5hZ2VtZW50IGFib3V0IGl0cyBxdWFsaXR5IHN0YXRlLiAgQmVpbmcgcmVzcG9uc2libGUgZm9yIHRoZSB3b3JrIHByb2R1Y3QgZG9lcyBub3QgbWVhbiB0aGF0IHRoZSByb2xlIGlzIHRoZSBvbmx5IG9uZSBtb2RpZnlpbmcgaXQsIGJ1dCBtYWtlcyB1bHRpbWF0ZSBkZWNpc2lvbnMgYWJvdXQgYWNjZXB0aW5nIG9yIHJlamVjdGluZyB0aGVzZSBtb2RpZmljYXRpb25zIHdoZW4gcmV2aWV3aW5nIHRoZXNlIG1vZGlmaWNhdGlvbnMuICBFdmVyeSB3b3JrIHByb2R1Y3QgaGFzIG5vbmUgb3Igb25lIHJvbGUgcmVzcG9uc2libGUgcm9sZS4gPC9ib2R5Pg0KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MzAxMEEiIG5hbWU9IiIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjk2IiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQwRjM2QzkzMDEwOSI+DQotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9Hc19xTHVmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3NfcUxlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgIDwvb3duZWRFbmQ+DQotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxMTdDRjVDMDFDQyIgbmFtZT0iRGVmYXVsdF9BZGRpdGlvbmFsUGVyZm9ybWVyIiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0MTE3Q0Y1RDAyRkQgXzNBREM3Qjc0MDIyRDQxMTdDRjVEMDM1NyI+DQotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9Hc19xTS1mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDExN0NGNUMwMUNDIj4NCi0gICAgICAgICAgICAgIDxib2R5PlRoaXMgYXNzb2NpYXRpb24gZGVmaW5lcyBhZGRpdGlvbmFsIHJvbGVzIHRoYXQgYnkgZGVmYXVsdCBjYW4gYmUgYXNzaWduZWQgdG8gaGVscCBjb21wbGV0aW5nIGEgVGFzay48L2JvZHk+DQotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxMTdDRjVEMDJGRCIgbmFtZT0iaGVscHNQZXJmb3JtaW5nIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyOUUiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDExN0NGNUMwMUNDIj4NCi0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0dzX3FOLWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+DQotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9Hc19xTnVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgPC9vd25lZEVuZD4NCi0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMDEwIiBuYW1lPSJDb21wb3NpdGlvbiIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMDExIF8zQURDN0I3NDAyMkQ0MEYzNkM5MjAwMTMiPg0KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3RKYklPZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDAxMCI+DQotICAgICAgICAgICAgICA8Ym9keT5BcnRpZmFjdCB0eXBlcyBjYW4gYmUgZGVmaW5lZCB0byBiZSBwaHlzaWNhbGx5IGNvbXBvc2VkIG9mIG90aGVyIGFydGlmYWN0cy4gIEZvciBleGFtcGxlLCBhIHVzZSBjYXNlIG1vZGVsIGlzIGNvbXBvc2VkIG9mIHVzZSBjYXNlcyBhbmQgYWN0b3JzLjwvYm9keT4NCi0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMDJEIiBuYW1lPSJEZWZhdWx0RGVsaXZlcmVkV1AiIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDAyRSBfM0FEQzdCNzQwMjJENDBGMzZDOTIwMDMwIj4NCi0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0d0SmJLZWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAwMkQiPg0KLSAgICAgICAgICAgICAgPGJvZHk+VGhpcyBhc3NvY2lhdGlvbiBkZWZpbmVzIHRoZSBkZWZhdWx0IHBhcnRzIG9mIGEgZGVsaXZlcmFibGUsIGkuZS4gdGhlIHR5cGVzIG9mIHdvcmsgcHJvZHVjdHMgYSBEZWxpdmVyYWJsZSBjb21wcmlzZXMgb2YuICBUaGlzIGFnZ3JlZ2F0aW9uIGNhbiBiZSBvdmVycmlkZGVuIGluIGEgUHJvY2Vzcy48L2JvZHk+DQotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDAyRSIgbmFtZT0iX2RlbGl2ZXJhYmxlIiB2aXNpYmlsaXR5PSJwcml2YXRlIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMTg1IiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMDJEIj4NCi0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0d0SmJMZWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+DQotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HdEpiTE9mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgPC9vd25lZEVuZD4NCi0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDE3N0Y4NDkwMTMxIiBuYW1lPSJEZWZhdWx0X09wdGlvbmFsSW5wdXRzIiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0MTc3Rjg0QTAyNUUgXzNBREM3Qjc0MDIyRDQxNzdGODRBMDI3MiI+DQotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HdEpiTXVmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDE3N0Y4NDkwMTMxIj4NCi0gICAgICAgICAgICAgIDxib2R5PlRoaXMgYXNzb2NpYXRpb24gcHJvdmlkZXMgbGlua3MgdG8gemVybyBvciBtYW55IGRlZmluaXRpb25zIG9mIFdvcmsgUHJvZHVjdHMgdGhhdCBhcmUgZGVmaW5lZCBhcyBvcHRpb25hbCBpbnB1dHMgZm9yIHBlcmZvcm1pbmcgdGhpcyBUYXNrLjwvYm9keT4NCi0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgICAgICA8b3duZWRFbmQgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDE3N0Y4NEEwMjcyIiBuYW1lPSJvcHRpb25hbElucHV0VG8iIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI5RSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MTc3Rjg0OTAxMzEiPg0KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3RKYk9lZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4NCi0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0d0SmJPT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICA8L293bmVkRW5kPg0KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0Mjc5NjJEMzAwM0YiIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQyNzk2MkQ0MDIwMyBfM0FEQzdCNzQwMjJENDI3OTYyRDQwMjBFIiBpc0Rlcml2ZWQ9InRydWUiPg0KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3RKYk8tZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyNzk2MkQzMDAzRiI+DQotICAgICAgICAgICAgICA8Ym9keT5UaGlzIGRlcml2ZWQgYXNzb2NpYXRpb24gaXMgYSBzaG9ydGN1dCBmb3IgbmF2aWdhdGlvbiBhbG9uZyB0aGUgYXNzb2NpYXRpb24gcHJvcGVydGllcyBDb250ZW50RWxlbWVudC5wcmVzZW50YXRpb24uc2VjdGlvbnMuPC9ib2R5Pg0KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0Mjc5NjJENDAyMEUiIG5hbWU9Il90YXNrIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyOUUiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0Mjc5NjJEMzAwM0YiLz4NCi0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDI3QTg3RTkwMDYxIiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0MjdBODdFOTAyQ0YgXzNBREM3Qjc0MDIyRDQyN0E4N0U5MDJEOSI+DQotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HdFRNSnVmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTg3RTkwMDYxIj4NCi0gICAgICAgICAgICAgIDxib2R5PlRoaXMgY29tcG9zaXRpb24gYXNzb2NpYXRpb24gYWRkcyBhbiBvcHRpb25hbCBwcmUtY29uZGl0aW9uIHRvIGEgV29yayBEZWZpbml0aW9uLiAgQSBwcmUtY29uZGl0aW9uIGRlZmluZXMgYW55IGtpbmQgb2YgY29uc3RyYWludCB0aGF0IG11c3QgZXZhbHVhdGUgdG8gdHJ1ZSBiZWZvcmUgdGhlIHdvcmsgZGVzY3JpYmVkIGZvciB0aGUgV29yayBEZWZpbml0aW9uIGNhbiBzdGFydC4gRm9yIGV4YW1wbGUsIGEgcHJlLWNvbmRpdGlvbiBmb3IgYSBUYXNrIGNvdWxkIGRlZmluZSB0aGF0IGFuIGlucHV0IFdvcmsgUHJvZHVjdCBuZWVkcyB0byBiZSBpbiBhIHNwZWNpZmljIHN0YXRlIG9yIHRoYXQgb3RoZXIgcmVsYXRlZCB3b3JrIG11c3QgYmUgaW4gYSBjZXJ0YWluIHN0YXRlIChlLmcuICdJbnB1dCBkb2N1bWVudCBYIGhhcyBiZWVuIHJldmlld2VkIGFuZCBzaWduZWQgYnkgY3VzdG9tZXIgQU5EIFRhc2sgJnF1b3Q7TWFuYWdlbWVudCBSZXZpZXcmcXVvdDsgaXMgY29tcGxldGUnKSBiZWZvcmUgdGhlIFRhc2sgY2FuIGJlZ2luLg0KLTwvYm9keT4NCi0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgICAgICA8b3duZWRFbmQgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDI3QTg3RTkwMkQ5IiBuYW1lPSJfd29ya0RlZmluaXRpb24iIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQyN0E4MkQzMDE3RiIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQyN0E4N0U5MDA2MSIvPg0KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MjdBODgzNDAxMTAiIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQyN0E4ODM0MDJERSBfM0FEQzdCNzQwMjJENDI3QTg4MzQwMkU4Ij4NCi0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0d0VE1MZWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBODgzNDAxMTAiPg0KLSAgICAgICAgICAgICAgPGJvZHk+VGhpcyBjb21wb3NpdGlvbiBhc3NvY2lhdGlvbiBhZGRzIGFuIG9wdGlvbmFsIHBvc3QtY29uZGl0aW9uIHRvIGEgV29yayBEZWZpbml0aW9uLiAgQSBwb3N0LWNvbmRpdGlvbiBkZWZpbmVzIGFueSBraW5kIG9mIGNvbnN0cmFpbnQgdGhhdCBtdXN0IGV2YWx1YXRlIHRvIHRydWUgYmVmb3JlIHRoZSB3b3JrIGRlc2NyaWJlZCBmb3IgdGhlIFdvcmsgRGVmaW5pdGlvbiBjYW4gYmUgZGVjbGFyZWQgY29tcGxldGVkIG9yIGZpbmlzaGVkIGFuZCB3aGljaCBvdGhlciBXb3JrIERlZmluaXRpb25zIG1pZ2h0IGRlcGVuZCB1cG9uIChlLmcuIGZvciB0aGVpciBwcmUtY29uZGl0aW9ucykuICBGb3IgZXhhbXBsZSwgYSBwb3N0LWNvbmRpdGlvbiBmb3IgYSBUYXNrIGNvdWxkIGRlZmluZSB0aGF0IGEgd29yayBwcm9kdWN0IGRlZmluZWQgdG8gYmUgdGhlIG91dHB1dCBtdXN0IGJlIGluIGEgc3BlY2lmaWMgc3RhdGUgYmVmb3JlIHRoZSBUYXNrIGNhbiBlbmQgKGUuZy4gJ1VzZSBDYXNlIG11c3QgYmUgaW4gc3RhdGUgZnVsbHkgZGVzY3JpYmVkIGFuZCByZXZpZXdlZCBieSBTeXN0ZW0gQW5hbHlzdCcpLjwvYm9keT4NCi0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgICAgICA8b3duZWRFbmQgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDI3QTg4MzQwMkU4IiBuYW1lPSJfd29ya0RlZmluaXRpb24iIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQyN0E4MkQzMDE3RiIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQyN0E4ODM0MDExMCIvPg0KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOlBhY2thZ2UiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxREU0NzhFMDAwRCIgbmFtZT0iTWV0aG9kUGFja2FnZSI+DQotICAgICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfR3Q1Q0ItZlhFZHVxSG9PSmJVUlpSdyIgc291cmNlPSJ1bWwyLmRpYWdyYW1zIiByZWZlcmVuY2VzPSJfM0FEQzdCNzQwMjJENDFFMDk5QjgwMDA5Ij4NCi0gICAgICAgICAgICA8Y29udGVudHMgeG1pOnR5cGU9Im5vdGF0aW9uOkRpYWdyYW0iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxRTA5OUI4MDAwOSIgdHlwZT0iQ2xhc3MiIG5hbWU9IlN0cnVjdHVyZSI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdvU1Z1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDEzRiI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR29TV2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEdvU1d1ZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdvU1ctZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdvU1hPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdvU1hlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR29TWHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hHb1NYLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHb1NZT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hHb1NZZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHb1NZdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hHb1NZLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHb1NaT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IR29TWmVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hHb1NWLWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJOb25lIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hHb1NXT2ZYRWR1cUhvT0piVVJaUnciIHg9IjY0MyIgeT0iMTcxOCIgd2lkdGg9IjQ3MTUiIGhlaWdodD0iMjk2MyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR3hjTmVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMTJCIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHeGNPT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IR3hjT2VmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR3hjT3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR3hjTy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR3hjUE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHeGNQZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hHeGNQdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHeGNQLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hHeGNRT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHeGNRZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hHeGNRdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHeGNRLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IR3hjUk9mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hHeGNOdWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hHeGNOLWZYRWR1cUhvT0piVVJaUnciIHg9IjkxNSIgeT0iNzQ0MiIgd2lkdGg9IjM1OTYiIGhlaWdodD0iMjQzMSIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR3hjVHVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjZDIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHeGNVZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IR3hjVXVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMzM1MiIgaGVpZ2h0PSIxMDMyIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR3hjVS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR3hjVk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR3hjVmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHeGNWdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hHeGNWLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHeGNXT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hHeGNXZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHeGNXdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hHeGNXLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHeGNYT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IR3hjWGVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hHeGNULWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dQYXJlbnQ9Ik5hbWUiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hHeGNVT2ZYRWR1cUhvT0piVVJaUnciIHg9Ijc5NzUiIHk9Ijc4NTAiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxEaWFncmFtU3R5bGUiIHhtaTppZD0iX0d0NUNDZWZYRWR1cUhvT0piVVJaUnciIGRlc2NyaXB0aW9uPSJNZXRob2QgUGFja2FnZSBpcyBkZWZpbmVkIGFzIGFuIGFic3RyYWN0IGNsYXNzLiAgSXRzIHNwZWNpYWxpemF0aW9uLCBDb250ZW50IFBhY2thZ2UsIGRlZmluZXMgdGhlIHJlZGVmaW5pdGlvbiBvZiB0aGUgVU1MIHBhY2thZ2UgdG8gY29udGFpbiBvbmx5IENvbnRlbnQgRWxlbWVudHMuICBNZXRob2QgUGFja2FnZXMgY2FuIGJlIGRlZmluZWQgYXMgZ2xvYmFsIChpLmUuIGFueSBlbGVtZW50IGluIGFueSBvdGhlciBwYWNrYWdlIGNhbiBhY2Nlc3MgaXRzIGNvbnRlbnRzKS4gIFRoZXkgY2FuIGJlIG5lc3RlZCBhcyB3ZWxsIGFzIGRlZmluZSBkZXBlbmRlbmNpZXMgdG8gb3RoZXIgcGFja2FnZXMgKHZpYSB0aGUgcmV1c2VkUGFja2FnZXMgYXNzb2NpYXRpb24pLiIvPg0KLSAgICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hHb1NadWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MTAwNDkiIHNvdXJjZT0iX0hHb1NWdWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hHb1NWdWZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdvU2FlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdvU2EtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR29TYk9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hHb1NhdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHb1NiZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MTAwNEMiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR29TYi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEdvU2J1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTE1NSIgeT0iLTMxMSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdvU2NPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MTAwNEMiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR29TY3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hHb1NjZWZYRWR1cUhvT0piVVJaUnciIHg9Ii02NDgiIHk9Ii0zMjMiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHb1NjLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYxMDA0QSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHb1NkZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hHb1NkT2ZYRWR1cUhvT0piVVJaUnciIHg9Ii0xNDcyIiB5PSIyMTIiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHb1NkdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MTAwNEEiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR29TZU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEdvU2QtZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTMxNCIgeT0iLTM5OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdvU2VlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYxMDA0QyI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHb1NlLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IR29TZk9mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hHb1NldWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHb1NmZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYxMDA0QSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHb1NmLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IR29TZ09mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hHb1NmdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHb1NnZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjEwMDRDIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdvU2ctZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hHb1NoT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEdvU2d1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdvU2hlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYxMDA0QSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHeGNFT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hHeGNFZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEdvU2h1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEdvU1otZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEdvU2FPZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMjM1MywgLTU2NywgMjM1MywgLTU2N10kWzYyMTQsIC01NjcsIDYyMTQsIC01NjddJFs2MjE0LCAtMjMyOCwgNjIxNCwgLTIzMjhdJFsxMzEyLCAtMjMyOCwgMTMxMiwgLTIzMjhdJFsxMzEyLCAtMTQ4MSwgMTMxMiwgLTE0ODFdIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hHeGNFdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MTAwMzUiIHNvdXJjZT0iX0hHb1NWdWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hHb1NWdWZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEd4Y0ZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEd4Y0YtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR3hjR09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEd4Y0Z1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMjk3IiB5PSIxNTAzIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR3hjR2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjEwMDM4Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEd4Y0ctZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hHeGNHdWZYRWR1cUhvT0piVVJaUnciIHg9IjY5NyIgeT0iNjI3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR3hjSE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYxMDAzOCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHeGNIdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEd4Y0hlZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTcyNSIgeT0iMzU2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR3hjSC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MTAwMzYiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR3hjSWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IR3hjSU9mWEVkdXFIb09KYlVSWlJ3IiB4PSItOTE3IiB5PSIyODAiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHeGNJdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjEwMDM2Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEd4Y0pPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hHeGNJLWZYRWR1cUhvT0piVVJaUnciIHg9IjE0MCIgeT0iMTM4OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEd4Y0plZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYxMDAzOCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHeGNKLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IR3hjS09mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hHeGNKdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHeGNLZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYxMDAzNiI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHeGNLLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IR3hjTE9mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hHeGNLdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHeGNMZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjEwMDM4Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEd4Y0wtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hHeGNNT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEd4Y0x1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEd4Y01lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYxMDAzNiI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHeGNNLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hHeGNOT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEd4Y011ZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEd4Y0UtZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEd4Y0ZPZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMjM1MywgNjA5LCAyMzUzLCA2MDldJFs2MTgwLCA2MDksIDYxODAsIDYwOV0kWzYxODAsIDI4MDIsIDYxODAsIDI4MDJdJFsxNDczLCAyODAyLCAxNDczLCAyODAyXSRbMTQ3MywgMTQ4MSwgMTQ3MywgMTQ4MV0iLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEd4Y1JlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDNBRiIgc291cmNlPSJfSEd4Y05lZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEdvU1Z1ZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR3hjU09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR3hjU3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHeGNTLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEd4Y1NlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEd4Y1J1ZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEd4Y1ItZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTE0MywgLTEzOTcsIC0yNDUsIDQyNDFdJFstMTQzLCAtNDE1NywgLTI0NSwgMTQ4MV0iLz4NCi0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hHeGNUT2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEd4Y1RlZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hHeGNYdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUUwQzAxMTAwMEIiIHNvdXJjZT0iX0hHeGNOZWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hHeGNUdWZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEd4Y1llZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEd4Y1ktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR3hjWk9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hHeGNZdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHeGNaZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUUwQzAxMTAwMEQiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR3hjWi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEd4Y1p1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMjI4IiB5PSIzMjMiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHeGNhT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRTBDMDExMDAwRCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHeGNhdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEd4Y2FlZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTE2NiIgeT0iLTM0OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEd4Y2EtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFMEMwMTEwMDBDIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEd4Y2JlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEd4Y2JPZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTgiIHk9IjI5NyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEd4Y2J1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRTBDMDExMDAwQyI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHeGNjT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IR3hjYi1mWEVkdXFIb09KYlVSWlJ3IiB4PSItOTUxIiB5PSItMjU1Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR3hjY2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFMEMwMTEwMDBEIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEd4Y2MtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hHeGNkT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEd4Y2N1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEd4Y2RlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFMEMwMTEwMDBDIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEd4Y2QtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hHeGNlT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEd4Y2R1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEd4Y2VlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUUwQzAxMTAwMEQiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR3hjZS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEd4Y2ZPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IR3hjZXVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR3hjZmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFMEMwMTEwMDBDIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEd4Y2YtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEd4Y2dPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IR3hjZnVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IR3hjWC1mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IR3hjWU9mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlsxNjA4LCAtMTM1LCAtNTE0NywgLTMzXSRbNTA4MCwgLTEzNSwgLTE2NzYsIC0zM10iLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgPC9jb250ZW50cz4NCi0gICAgICAgICAgICA8Y29udGVudHMgeG1pOnR5cGU9Im5vdGF0aW9uOkRpYWdyYW0iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyMzYwRTcyMDAzNyIgdHlwZT0iQ2xhc3MiIG5hbWU9IlRheG9ub215Ij4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR3hjZ2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOb3RlIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHeGNoT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkRpYWdyYW1OYW1lIj4NCi0gICAgICAgICAgICAgICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR3hjaGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJEZXNjcmlwdGlvbiI+DQotICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IR3hjZ3VmWEVkdXFIb09KYlVSWlJ3IiBkZXNjcmlwdGlvbj0iVU1MMiBJbmZyYXN0cnVjdHVyZSIgbGluZUNvbG9yPSI0MTk0MzY4Ii8+DQotICAgICAgICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEd4Y2ctZlhFZHVxSG9PSmJVUlpSdyIgeD0iMjAxNSIgeT0iNjAxIiB3aWR0aD0iNzA0NCIgaGVpZ2h0PSI4MTQ0Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHeGNodWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURERTA2MjAyRDUiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEd4Y2llZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hHeGNpdWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIyODI3IiBoZWlnaHQ9IjE1NDAiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHN05FT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHN05FZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHN05FdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEc3TkUtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRzdORk9mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRzdORmVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRzdORnVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRzdORi1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRzdOR09mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRzdOR2VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEc3Tkd1ZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IR3hjaC1mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9Ik5vbmUiIHNob3dMaXN0VmlzaWJpbGl0eT0iTm9uZSIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IR3hjaU9mWEVkdXFIb09KYlVSWlJ3IiB4PSIzMzYxIiB5PSIxMzYzIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHN05HLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURERkEzNjAyQzEiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEc3Tkh1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hHN05ILWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIyNTczIiBoZWlnaHQ9IjEwNDkiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHN05JT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHN05JZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHN05JdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEc3TkktZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEc3TkpPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEc3TkplZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEc3Tkp1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEc3TkotZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEc3TktPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEc3TktlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hHN05LdWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEc3TkhPZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJOb25lIiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEc3TkhlZlhFZHVxSG9PSmJVUlpSdyIgeD0iNTU5NCIgeT0iNjExOCIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRzdOSy1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFEREU4MzMwMUE1Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHN05MdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IRzdOTC1mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iNDM2OCIgaGVpZ2h0PSIxMDMyIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRzdOTU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRzdOTWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRzdOTXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHN05NLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hHN05OT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHN05OZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hHN05OdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHN05OLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hHN05PT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHN05PZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRzdOT3VmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hHN05MT2ZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iTm9uZSIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hHN05MZWZYRWR1cUhvT0piVVJaUnciIHg9IjI2OTIiIHk9IjQzNjAiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEc3Tk8tZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI4MCI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRzdOUHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEc3TlAtZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjMzMDIiIGhlaWdodD0iMTA0OSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEc3TlFPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEc3TlFlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEc3TlF1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRzdOUS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRzdOUk9mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRzdOUmVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRzdOUnVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRzdOUi1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRzdOU09mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRzdOU2VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEc3TlN1ZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IRzdOUE9mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9Ik5vbmUiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRzdOUGVmWEVkdXFIb09KYlVSWlJ3IiB4PSIyMTU5IiB5PSI5MjI4Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHN05adWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxM0YiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEc3TmFlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hHN05hdWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIzNTIyIiBoZWlnaHQ9IjkwNSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEc3TmEtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEc3TmJPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEc3TmJlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRzdOYnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRzdOYi1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRzdOY09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRzdOY2VmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRzdOY3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRzdOYy1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRzdOZE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEc3TmRlZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IRzdOWi1mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9Ik5vbmUiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRzdOYU9mWEVkdXFIb09KYlVSWlJ3IiB4PSIzOTc5IiB5PSIxMTU0MCIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRzdOaU9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMTJCIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHN05pLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IRzdOak9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMzQ1NCIgaGVpZ2h0PSI5MDUiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHN05qZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHN05qdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHN05qLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEc3TmtPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEc3TmtlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEc3Tmt1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEc3TmstZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEc3TmxPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEc3TmxlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEc3Tmx1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hHN05sLWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEc3TmllZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJOb25lIiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEc3Tml1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iNDAxMyIgeT0iMTM0NzAiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxEaWFncmFtU3R5bGUiIHhtaTppZD0iX0d0NUNDLWZYRWR1cUhvT0piVVJaUnciIGRlc2NyaXB0aW9uPSJUaGUgTWV0aG9kIFBhY2thZ2UgcGFja2FnZSBkZWZpbmVzIGhvdyB0aGUgbWV0aG9kIGVsZW1lbnRzIGNhbiBiZSBwaHlzaWNhbGx5IG9yZ2FuaXplZCBpbiBwYWNrYWdlIGhpZXJhcmNoaWVzLiAgSXQgcmV1c2VkIHRoZSBwYWNrYWdlIGNvbmNlcHQgZnJvbSB0aGUgVU1MIDIuMCBJbmZyYXN0cnVjdHVyZSBMaWJyYXJ5LCBidXQgcmVkZWZpbmVzIGl0IHRvIHJlc3RyaWN0IENvbnRlbnQgUGFja2FnZXMgdG8gb25seSBjb250YWluIENvbnRlbnQgRWxlbWVudHMgYW5kIG5vdCBhbnkgUGFja2FnZWFibGUgRWxlbWVudHMgKFRCRDogdXBkYXRlIGRpYWdyYW0gd2l0aCB7cmVkZWZpbmVzfSBjb25zdHJhaW50ISkuIFRoZSBkaWFncmFtIHNob3dzIHRoZSBvdmVyYWxsIHRheG9ub215IGlzIHdoaWNoIE1ldGhvZCBQYWNrYWdlIGlzIGRlZmluZWQgYXMgYW4gYWJzdHJhY3QgY2xhc3MuICIvPg0KLSAgICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hHN05TLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURERkJDRjAyQTkiIHNvdXJjZT0iX0hHN05HLWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hHN05LLWZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEc3TlR1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEc3TlVPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRzdOVWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hHN05ULWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hHN05UT2ZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hHN05UZWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy05NzksIC03OSwgOTc5LCAxOTU4XSRbLTE5ODUsIC03OSwgLTI3LCAxOTU4XSRbLTE5ODUsIC0xNzE5LCAtMjcsIDMxOF0iLz4NCi0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hHN05VdWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEc3TlUtZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hHN05WT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURERjhENDAyMTEiIHNvdXJjZT0iX0hHN05LLWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hHeGNodWZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEc3TlYtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEc3TldlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRzdOV3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hHN05XT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hHN05WZWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hHN05WdWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy04NCwgLTUxNiwgMTYsIDIyMjZdJFstODQsIC0xOTcyLCAxNiwgNzcwXSIvPg0KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEc3TlctZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRzdOWE9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEc3TlhlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRUMzMzRGMDE5OCIgc291cmNlPSJfSEc3Tk8tZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEc3TkstZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRzdOWU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRzdOWXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHN05ZLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEc3TlllZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEc3Tlh1ZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEc3TlgtZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbNTAsIC01MjQsIC0xMDE2LCA0MzUxXSRbNTAsIC00MzYwLCAtMTAxNiwgNTE2XSIvPg0KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEc3TlpPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRzdOWmVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEc3TmR1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRTBDQzBBMDFENyIgc291cmNlPSJfSEc3Tlp1ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEc3TkctZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRzdOZWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRzdOZS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHN05mT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEc3TmV1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEc3TmQtZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEc3TmVPZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbNzc4LCAtNDQ4LCAtMzg5LCA0NjMxXSRbNzc4LCAtNDU2MywgLTM4OSwgNTE2XSIvPg0KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEc3TmZlZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRzdOZnVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEc3TmYtZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRkFENUY4MDM4RSIgc291cmNlPSJfSEc3Tlp1ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEc3Tk8tZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRzdOZ3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRzdOaE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHN05oZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEc3TmctZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEc3TmdPZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEc3TmdlZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTEwMDcsIC00NDgsIDkyMiwgMTc4Nl0kWy0xMDA3LCAtMTcxOCwgOTIyLCA1MTZdIi8+DQotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRzdOaHVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hHN05oLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IRzdObU9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwM0FGIiBzb3VyY2U9Il9IRzdOaU9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IRzdOWnVmWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHN05tLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHN05uZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEc3Tm51ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRzdObk9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IRzdObWVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IRzdObXVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlswLCAtNDQ4LCAwLCAxNDgxXSRbMCwgLTE0ODEsIDAsIDQ0OF0iLz4NCi0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hHN05uLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEc3Tm9PZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgIDwvY29udGVudHM+DQotICAgICAgICAgIDwvZUFubm90YXRpb25zPg0KLSAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0d0bUhFLWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURFNDc4RTAwMEQiPg0KLSAgICAgICAgICAgIDxib2R5PjA1PC9ib2R5Pg0KLSAgICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgICAgPHBhY2thZ2VNZXJnZSB4bWk6aWQ9Il9SS0VEWU94Z0VkdUhqZTNwUGFoTjRBIiBtZXJnZWRQYWNrYWdlPSJfM0FEQzdCNzQwMjJENDFERTQ5RUEwMUUyIi8+DQotICAgICAgICAgIDxwYWNrYWdlTWVyZ2UgeG1pOmlkPSJfUnFHT1VPeGdFZHVIamUzcFBhaE40QSIgbWVyZ2VkUGFja2FnZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDIyNSIvPg0KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDEzRiIgbmFtZT0iTWV0aG9kUGFja2FnZSIgaXNBYnN0cmFjdD0idHJ1ZSI+DQotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HdG1IRy1mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMTNGIj4NCi0gICAgICAgICAgICAgIDxib2R5PkEgTWV0aG9kIFBhY2thZ2UgaXMgYW4gYWJzdHJhY3QgY2xhc3MgZm9yIHBhY2thZ2luZyBNZXRob2QgRWxlbWVudHMuICBBbGwgTWV0aG9kIEVsZW1lbnRzIHNoYWxsIGJlIGxvY2F0ZWQgaW4gZXhhY3RseSBvbmUgb2YgTWV0aG9kIFBhY2thZ2UncyBjb25jcmV0ZSBzcGVjaWFsaXphdGlvbnMgKGUuZy4gQ29udGVudCBQYWNrYWdlKS4gICBNZXRob2QgUGFja2FnZSBkZWZpbmVzIGNvbW1vbiBwcm9wZXJ0aWVzIGZvciBhbGwgb2YgaXRzIHNwZWNpYWxpemF0aW9ucy4gRWxlbWVudHMgYXJlIG9yZ2FuaXplZCBpbiBNZXRob2QgUGFja2FnZXMgdG8gc3RydWN0dXJlIGxhcmdlIHNjYWxlIG9mIG1ldGhvZCBjb250ZW50IGFuZCBwcm9jZXNzZXMgYXMgd2VsbCBhcyB0byBkZWZpbmUgYSBtZWNoYW5pc20gZm9yIHJldXNlLiAgTWV0aG9kIEVsZW1lbnRzIGZyb20gb25lIHBhY2thZ2UgY2FuIHJldXNlIGVsZW1lbnQgZnJvbSBvdGhlciBwYWNrYWdlcyBieSBkZWZpbmluZyBhIHJldXNlZFBhY2thZ2VzIGxpbmsuICBGb3IgZXhhbXBsZSwgYSB3b3JrIHByb2R1Y3QgZGVmaW5lZCBpbiBvbmUgcGFja2FnZSBjYW4gYmUgdXNlZCBhcyBhbiBpbnB1dCBmb3IgVGFza3MgZGVmaW5lZCBpbiBvdGhlciBwYWNrYWdlcy4gIEJ5IHJldXNpbmcgaXQgZnJvbSBvbmUgY29tbW9uIHBsYWNlIChpLmUuIHRoZSBwYWNrYWdlIGluIHdoaWNoIGl0IGhhcyBiZWVuIGRlZmluZWQpIGVuc3VyZXMgdGhhdCBubyByZWR1bmRhbnQgZGVmaW5pdGlvbnMgb2YgdGhlIHNhbWUgZWxlbWVudHMgYXJlIHJlcXVpcmVkLiAgQWxzbyBtYWludGVuYW5jZSBvZiBtZXRob2QgY29udGVudCBpcyBncmVhdGx5IGltcHJvdmVkIGFzIGNoYW5nZXMgY2FuIGJlIHBlcmZvcm1lZCBpbiBvbmx5IG9uZSBwbGFjZS4gIE5vdGUsIHRoYXQgb3RoZXIgcGFja2FnZXMgd2lsbCBpbnRyb2R1Y2UgbW9yZSBzcGVjaWFsaXphdGlvbnMgb2YgTWV0aG9kIFBhY2thZ2UsIGUuZy4gUHJvY2VzcyBQYWNrYWdlIGFuZCBQcm9jZXNzIENvbXBvbmVudC48L2JvZHk+DQotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxRTBDQzBBMDFENyIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQxRERGQTM2MDJDMSIvPg0KLSAgICAgICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MUZBRDVGODAzOEUiIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyODAiLz4NCi0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDEyRkE4NTQwMzBFIiBuYW1lPSJnbG9iYWwiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzVHY1lBT2llRWR1UWJ1WTZVd01TUWciPg0KLSAgICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HdG1ISU9mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDEyRkE4NTQwMzBFIj4NCi0gICAgICAgICAgICAgICAgPGJvZHk+TWV0aG9kIFBhY2thZ2VzIGNhbiBoYXZlIGEgZ2xvYmFsIHNjb3BlLiAgVGhpcyBtZWFucyB0aGF0IGV2ZXJ5IGVsZW1lbnQgb2YgZXZlcnkgb3RoZXIgTWV0aG9kIFBhY2thZ2UgY2FuIHNlZSB0aGUgZ2xvYmFsIHBhY2thZ2UncyBjb250ZW50cy4gIEdsb2JhbCBNZXRob2QgUGFja2FnZXMgYXJlIHByaW1hcmlseSB1c2VkIHRvIHN0b3JlIGNvbW1vbmx5IHVzZWQgY2F0ZWdvcnkgZGVmaW5pdGlvbnMgc3VjaCBhcyBmb3IgRGlzY2lwbGluZXMgb3IgRG9tYWlucywgd2hpY2ggYXJlIHVzZWQgYnkgbWFueSBUYXNrIGFuZCBXb3JrIFByb2R1Y3RzIHJlc3BlY3RpdmVseS48L2JvZHk+DQotICAgICAgICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9Il9HdG1ISXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJfNUdjWUFPaWVFZHVRYnVZNlV3TVNRZyI+DQotICAgICAgICAgICAgICAgIDxib2R5PmZhbHNlPC9ib2R5Pg0KLSAgICAgICAgICAgICAgPC9kZWZhdWx0VmFsdWU+DQotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNjEwMDRDIiBuYW1lPSJyZXVzZWRQYWNrYWdlcyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMTNGIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQwRjM2QzYxMDA0OSI+DQotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HdHZSRS1mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3R2UkV1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYxMDAzOCIgbmFtZT0iY2hpbGRQYWNrYWdlcyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMTNGIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQwRjM2QzYxMDAzNSI+DQotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HdDVDQnVmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3Q1Q0JlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDEyQiIgbmFtZT0iQ29udGVudFBhY2thZ2UiPg0KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3RtSEpPZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDEyQiI+DQotICAgICAgICAgICAgICA8Ym9keT5BIENvbnRlbnQgUGFja2FnZSBpcyBzcGVjaWFsIE1ldGhvZCBQYWNrYWdlIHRoYXQgY29udGFpbnMgQ29udGVudCBFbGVtZW50cyBhbmQgQ29udGVudCBFbGVtZW50cywgb25seS4gIEV4YW1wbGVzIGZvciBDb250ZW50IEVsZW1lbnQgYXJlIEFydGlmYWN0cywgVGFza3MsIFJvbGVzLCBldGMuICBBIGtleSBzZXBhcmF0aW9uIG9mIGNvbmNlcm5zIGluIFVNQSBpcyB0aGUgZGlzdGluY3Rpb24gYmV0d2VlbiBNZXRob2QgQ29udGVudCBhbmQgUHJvY2Vzcy4gIFRoaXMgc2VwYXJhdGlvbiBpcyBlbmZvcmNlZCBieSBzcGVjaWFsIHBhY2thZ2UgdHlwZXMsIHdoaWNoIGRvIG5vdCBhbGxvdyB0aGUgbWl4aW5nIG9mIG1ldGhvZCBjb250ZW50IHdpdGggcHJvY2Vzc2VzLjwvYm9keT4NCi0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwM0FGIiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMTNGIi8+DQotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxRTBDMDExMDAwQyIgbmFtZT0iY29udGVudEVsZW1lbnRzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyNkMiIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDFFMEMwMTEwMDBCIj4NCi0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0d0dlJCLWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+DQotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HdHZSQnVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDFFMEMwMTEwMDBCIiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0MUUwQzAxMTAwMEMgXzNBREM3Qjc0MDIyRDQxRTBDMDExMDAwRCI+DQotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HdHZSQS1mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFMEMwMTEwMDBCIj4NCi0gICAgICAgICAgICAgIDxib2R5PkEgQ29udGVudCBQYWNrYWdlIGNvbnRhaW5zIENvbnRlbnQgRWxlbWVudHMuICBBIENvbnRlbnQgRWxlbWVudCBpbnN0YW5jZSBjYW4gYmUgcGFydCBvZiBvbmx5IG9uZSBwYWNrYWdlIGluc3RhbmNlLjwvYm9keT4NCi0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgICAgICA8b3duZWRFbmQgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDFFMEMwMTEwMDBEIiBuYW1lPSJfY29udGVudFBhY2thZ2UiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDEyQiIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQxRTBDMDExMDAwQiI+DQotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HdHZSQ3VmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iMSIvPg0KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3R2UkNlZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IjEiLz4NCi0gICAgICAgICAgICA8L293bmVkRW5kPg0KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MTAwNDkiIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYxMDA0QSBfM0FEQzdCNzQwMjJENDBGMzZDNjEwMDRDIj4NCi0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0d0dlJET2ZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MTAwNDkiPg0KLSAgICAgICAgICAgICAgPGJvZHk+VGhpcyBhc3NvY2lhdGlvbiBkZXNjcmliZXMgYSBkZXBlbmRlbmN5IGJldHdlZW4gdGhlIHR3byBwYWNrYWdlcyBpdCBjb25uZWN0cy4gIFRoZSBwYWNrYWdlIGF0IHRoZSB1c2luZ1BhY2thZ2UgZW5kIGRlcGVuZHMgb24gdGhlIHBhY2thZ2UgYXQgdGhlIHJldXNlZFBhY2thZ2UgZW5kLiAgRm9yIGV4YW1wbGUsIGFuIGVsZW1lbnQgaW4gdGhlIGZvcm1lciBwYWNrYWdlIGlzIHVzaW5nIGFuIGVsZW1lbnQgaW4gdGhlIGxhdGVyIGluIGEgcmVsYXRpb25zaGlwIHN1Y2ggYXMgYSBUYXNrIGlzIHVzaW5nIGEgV29yayBQcm9kdWN0cyBhcyBhbiBpbnB1dC4gIFJlZmxleGl2ZSByZXVzZWRQYWNrYWdlIGxpbmtzIChpLmUuIGEgcGFja2FnZSB0aGF0IGRlcGVuZHMgb24gaXRzZWxmKSBhcmUgbm90IGFsbG93ZWQuPC9ib2R5Pg0KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MTAwNEEiIG5hbWU9InVzaW5nUGFja2FnZXMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDEzRiIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MEYzNkM2MTAwNDkiPg0KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3R2UkVPZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4NCi0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0d0dlJELWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICA8L293bmVkRW5kPg0KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MTAwMzUiIG5hbWU9IlBhY2thZ2VOZXN0aW5nIiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MTAwMzYgXzNBREM3Qjc0MDIyRDQwRjM2QzYxMDAzOCI+DQotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HdHZSRmVmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjEwMDM1Ij4NCi0gICAgICAgICAgICAgIDxib2R5Pk1ldGhvZCBQYWNrYWdlcyBjYW4gYmUgbmVzdGVkLCBpLmUuIGEgcGFja2FnZSBjYW4gYmUgcGFydCBvZiBhbm90aGVyIHBhY2thZ2UuICBOZXN0ZWQgcGFja2FnZXMgZG8gbm90IG5lZWQgdG8gYmUgb2YgdGhlIHNhbWUgdHlwZSwgZS5nLiBhIENvbnRlbnQgUGFja2FnZSBjYW4gYmUgZGVmaW5lZCBpbnNpZGUgYSBQcm9jZXNzIFBhY2thZ2UgKGRlZmluZSBmb3IgdGhlIFByb2Nlc3MgcGFydCBvZiB0aGlzIG1vZGVsKS48L2JvZHk+DQotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYxMDAzNiIgbmFtZT0iX21ldGhvZFBhY2thZ2UiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDEzRiIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQwRjM2QzYxMDAzNSI+DQotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HdDVDQS1mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iMSIvPg0KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3Q1Q0F1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgIDwvb3duZWRFbmQ+DQotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6UGFja2FnZSIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDFERTQ5RUEwMUUyIiBuYW1lPSJNZXRob2RDb3JlRGVzY3JpcHRpb25zIj4NCi0gICAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il9HdXlaNGVmWEVkdXFIb09KYlVSWlJ3IiBzb3VyY2U9InVtbDIuZGlhZ3JhbXMiIHJlZmVyZW5jZXM9Il8zQURDN0I3NDAyMkQ0MURFNEFCNDAwOTgiPg0KLSAgICAgICAgICAgIDxjb250ZW50cyB4bWk6dHlwZT0ibm90YXRpb246RGlhZ3JhbSIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDFERTRBQjQwMDk4IiB0eXBlPSJDbGFzcyIgbmFtZT0iTWFpbiI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhFLUVPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREU1MjIxMDFEMiI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISEUtRS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEhFLUZPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjQ3NTgiIGhlaWdodD0iMjQyMSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhFLUZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhFLUZ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhFLUYtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISEUtR09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIRS1HZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIRS1HdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIRS1HLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIRS1IT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIRS1IZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIRS1IdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISEUtSC1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hIRS1FZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iTm9uZSIgc2hvd0xpc3RWaXNpYmlsaXR5PSJOb25lIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hIRS1FdWZYRWR1cUhvT0piVVJaUnciIHg9IjY0NjAiIHk9IjE2MzE1Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIRS1JT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURFNTI1QzAxMzciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhFLUktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hIRS1KT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSI0NDAyIiBoZWlnaHQ9IjE1NzQiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIRS1KZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIRS1KdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIRS1KLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhFLUtPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISEUtS2VmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISEUtS3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISEUtSy1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISEUtTE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISEUtTGVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISEUtTHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEhFLUwtZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9ISEUtSWVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9Ik5vbmUiIHNob3dMaXN0VmlzaWJpbGl0eT0iTm9uZSIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISEUtSXVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxODYyIiB5PSIxNjI4MSIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISEUtTU9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERjM2MzYwMTA5Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIRS1NLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9ISEUtTk9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMzkyOCIgaGVpZ2h0PSIzMjY4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISEUtTmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISEUtTnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISEUtTi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIRS1PT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEhFLU9lZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhFLU91ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEhFLU8tZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhFLVBPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEhFLVBlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhFLVB1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIRS1QLWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEhFLU1lZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJOb25lIiBzaG93TGlzdFZpc2liaWxpdHk9Ik5vbmUiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEhFLU11ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMjIxNjUiIHk9IjEyOTQ1Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIRS1RT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURFNTMxOTAzNTAiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhFLVEtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hIRS1ST2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSI0OTk1IiBoZWlnaHQ9IjE5OTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIRS1SZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIRS1SdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIRS1SLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhFLVNPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISEUtU2VmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISEUtU3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISEUtUy1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISEUtVE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISEUtVGVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISEUtVHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEhFLVQtZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9ISEUtUWVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9Ik5vbmUiIHNob3dMaXN0VmlzaWJpbGl0eT0iTm9uZSIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISEUtUXVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxMjI4NSIgeT0iMTI5MjAiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhFLVVPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREU1MzUxMDAxMyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISEUtVS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEhFLVZPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjMxMTUiIGhlaWdodD0iMTU3NCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhFLVZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhFLVZ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhFLVYtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISEUtV09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIRS1XZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIRS1XdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIRS1XLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIRS1YT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIRS1YZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIRS1YdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISEUtWC1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hIRS1VZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iTm9uZSIgc2hvd0xpc3RWaXNpYmlsaXR5PSJOb25lIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hIRS1VdWZYRWR1cUhvT0piVVJaUnciIHg9Ijg3NTQiIHk9IjEyOTI4Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIRS1ZT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURGMzYyMDAwOUEiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhFLVktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hIRS1aT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIzNjA2IiBoZWlnaHQ9IjExNTEiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIRS1aZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIRS1adWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIRS1aLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhFLWFPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISEUtYWVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISEUtYXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISEUtYS1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISEUtYk9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISEUtYmVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISEUtYnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEhFLWItZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9ISEUtWWVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9Ik5vbmUiIHNob3dMaXN0VmlzaWJpbGl0eT0iTm9uZSIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISEUtWXVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxNzk1NyIgeT0iMTI5MzciLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhFLWNPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREU1MzZBMDBEOCI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISEUtYy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEhFLWRPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjQ4NzYiIGhlaWdodD0iMjQyMSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhPSUFPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhPSUFlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhPSUF1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISE9JQS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIT0lCT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIT0lCZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIT0lCdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIT0lCLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIT0lDT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIT0lDZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISE9JQ3VmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hIRS1jZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iTm9uZSIgc2hvd0xpc3RWaXNpYmlsaXR5PSJOb25lIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hIRS1jdWZYRWR1cUhvT0piVVJaUnciIHg9IjM0NTQiIHk9IjEyOTExIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIT0lDLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyODAiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhPSUR1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hIT0lELWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIyODI3IiBoZWlnaHQ9IjEwNDkiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIT0lFT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIT0lFZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIT0lFdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhPSUUtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISE9JRk9mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISE9JRmVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISE9JRnVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISE9JRi1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISE9JR09mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISE9JR2VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEhPSUd1ZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9ISE9JRE9mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9Ik5vbmUiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIxMjYzMjI1NiIgc2hvd1BhcmVudD0iTmFtZSIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEhPSURlZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTIxMTAiIHk9Ijc2MCIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISE9JRy1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3OTdGNzQwMzkyIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIT0lIdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9ISE9JSC1mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iNDU1NSIgaGVpZ2h0PSIxMTUxIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISE9JSU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISE9JSWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISE9JSXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIT0lJLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEhPSUpPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhPSUplZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEhPSUp1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhPSUotZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEhPSUtPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhPSUtlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIT0lLdWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEhPSUhPZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJOb25lIiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEhPSUhlZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTE5NDYiIHk9Ijg1NjgiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhPSWF1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMUU0Q0YzMDFBRSI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISE9JYmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEhPSWJ1ZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhPSWItZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhPSWNPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhPSWNlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISE9JY3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIT0ljLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIT0lkT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIT0lkZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIT0lkdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIT0lkLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIT0llT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISE9JZWVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hIT0lhLWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iTm9uZSIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjEyNjMyMjU2IiBzaG93UGFyZW50PSJOYW1lIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISE9JYk9mWEVkdXFIb09KYlVSWlJ3IiB4PSIxOTUzMiIgeT0iMzUxMyIgd2lkdGg9IjUxMzAiIGhlaWdodD0iMjIxOCIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISE9JcHVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERTRBOTcwMTIzIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIT0lxZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9ISE9JcXVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iNDE4MiIgaGVpZ2h0PSIxNTQwIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISE9JcS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISE9Jck9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISE9JcmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIT0lydWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEhPSXItZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhPSXNPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEhPSXNlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhPSXN1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEhPSXMtZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhPSXRPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIT0l0ZWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEhPSXAtZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJOb25lIiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMTI2MzIyNTYiIHNob3dQYXJlbnQ9Ik5hbWUiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hIT0lxT2ZYRWR1cUhvT0piVVJaUnciIHg9IjEyNDM3IiB5PSI0MDA0Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIWDVNdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjk0RUI5MDAwRkMiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhYNU5lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hIWDVOdWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSI0NDg3IiBoZWlnaHQ9IjE1NDAiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIWDVOLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIWDVPT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIWDVPZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhYNU91ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISFg1Ty1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISFg1UE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISFg1UGVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISFg1UHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISFg1UC1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISFg1UU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEhYNVFlZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9ISFg1TS1mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9Ik5vbmUiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIxMjYzMjI1NiIgc2hvd1BhcmVudD0iTmFtZSIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEhYNU5PZlhFZHVxSG9PSmJVUlpSdyIgeD0iNDcxNSIgeT0iNDAwNCIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISFg1YnVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFGRURFNEMwMzg0Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIWDVjZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9ISFg1Y3VmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMzU4OSIgaGVpZ2h0PSIxNTc0Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISFg1Yy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISFg1ZE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISFg1ZGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIWDVkdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEhYNWQtZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhYNWVPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEhYNWVlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhYNWV1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEhYNWUtZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhYNWZPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIWDVmZWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEhYNWItZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJOb25lIiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEhYNWNPZlhFZHVxSG9PSmJVUlpSdyIgeD0iNTE2NCIgeT0iODMwNSIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTERpYWdyYW1TdHlsZSIgeG1pOmlkPSJfR3V5WjQtZlhFZHVxSG9PSmJVUlpSdyIgZGVzY3JpcHRpb249IlRoZSBNZXRob2QgQ29yZSBEZXNjcmlwdGlvbnMgcGFja2FnZSBkZWZpbmVzIHRoZSBleGFjdCBuYXR1cmUgb2YgdGV4dHVhbCBkZXNjcmlwdGlvbnMgdGhhdCBzaGFsbCBiZSBtYWludGFpbmVkIGZvciBDb250ZW50IEVsZW1lbnRzLiAgVGhlIGRlY2xhcmF0aW9ucyBmb3IgdGhlc2UgZGVzY3JpcHRpb25zIGhhdmUgYmVlbiBmYWN0b3JlZCBpbnRvIHRoaXMgc2VwYXJhdGUgcGFja2FnZSwgYmVjYXVzZSBldmVyeSBpbXBsZW1lbnRlciBvZiB0aGlzIG1ldGEtbW9kZWwgbWlnaHQgZGVjaWRlIHRvIGRlZmluZSBhIGRpZmZlcmVudCBzZXQgb2YgZGVzY3JpcHRpb24gYXR0cmlidXRlcyBmb3IgdGhlaXIgQ29udGVudCBFbGVtZW50cy4gIEhvd2V2ZXIsIG9ubHkgdGhlIGRlc2NyaXB0aW9uIGF0dHJpYnV0ZXMgZGVmaW5lZCBpbiB0aGlzIHBhY2thZ2UgYXJlIHRoZSBzdGFuZGFyZGl6ZWQgc2V0IGZvciBJQk0ncyBVbmlmaWVkIE1ldGhvZCBBcmNoaXRlY3R1cmUgYW5kIGFyZSBzdXBwb3J0ZWQgZm9yIG1ldGhvZCBjb250ZW50IGludGVyY2hhbmdlIChpLmUuIGltcG9ydC9leHBvcnQgc2NlbmFyaW9zIGZvciBkaWZmZXJlbnQgY29udGVudCBzb3VyY2VzKS4iLz4NCi0gICAgICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9ISE9JSy1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFGQUUwODUwMzgzIiBzb3VyY2U9Il9ISEUtUU9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9ISE9JRy1mWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIT0lMdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIT0lNT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhPSU1lZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISE9JTC1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9ISE9JTE9mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9ISE9JTGVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMjAzLCAtOTk5LCAzNTUsIDM3NzZdJFstMjAzLCAtNDE5OSwgMzU1LCA1NzVdIi8+DQotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9ISE9JTXVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hIT0lNLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9ISE9JTk9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFGQUUwNzUwM0M3IiBzb3VyY2U9Il9ISEUtY09mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9ISE9JRy1mWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIT0lOLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIT0lPZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhPSU91ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISE9JT09mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9ISE9JTmVmWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hIT0lOdWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzAsIC0xMjE5LCAtODMzMSwgMzc1OV0kWzgsIC0yODk1LCAtODMyMiwgMjA4Ml0kWzYwNDUsIC00NDE5LCAtMjI4NiwgNTU4XSIvPg0KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEhPSU8tZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9ISE9JUE9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEhPSVBlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyNzk4NDlFMDAwMSIgc291cmNlPSJfSEhFLVVPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEhPSUctZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISE9JUU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISE9JUXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIT0lRLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEhPSVFlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEhPSVB1ZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9ISE9JUC1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlswLCAtNzk1LCAtMzkxMSwgMzc3Nl0kWzgsIC0xNzY5LCAtMzkwMywgMjgwMl0kWzMwNzMsIC0zOTk2LCAtODM4LCA1NzVdIi8+DQotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9ISE9JUk9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hIT0lSZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9ISE9JUnVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFGQUUwODgwMTNGIiBzb3VyY2U9Il9ISEUtWU9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9ISE9JRy1mWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIT0lTZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIT0lTLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhPSVRPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISE9JU3VmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9ISE9JUi1mWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hIT0lTT2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy04LCAtNTg0LCA1NTI4LCAzNzg0XSRbLTE2LCAtMTY3NiwgNTUyMCwgMjY5Ml0kWy00MzUxLCAtMzc5MywgMTE4NSwgNTc1XSIvPg0KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEhPSVRlZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9ISE9JVHVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEhPSVQtZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRkFFMDdCMDFBQyIgc291cmNlPSJfSEhFLUlPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEhFLWNPZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISE9JVXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISE9JVk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIT0lWZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEhPSVUtZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEhPSVVPZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9ISE9JVWVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9Ils0ODIsIC03OTUsIC0xMzQ2LCAyMTUwXSRbMTA2NiwgLTE3MzUsIC03NjIsIDEyMTBdIi8+DQotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9ISE9JVnVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hIT0lWLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9ISE9JV09mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFGQUUwN0QwMzY0IiBzb3VyY2U9Il9ISEUtRU9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9ISEUtY09mWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIT0lXLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIT0lYZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhPSVh1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISE9JWE9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9ISE9JV2VmWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hIT0lXdWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0xMDU4LCAtMTIxOSwgMTg4OCwgMjE4NF0kWy0xODk2LCAtMjE5MiwgMTA0OSwgMTIxMF0iLz4NCi0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hIT0lYLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEhPSVlPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hIT0lZZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUZBRTA4QjAwQUEiIHNvdXJjZT0iX0hIRS1NT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hIT0lHLWZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhPSVpPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhPSVp1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISE9JWi1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hIT0laZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hIT0lZdWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEhPSVktZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTgsIC0xNjQyLCA5ODk3LCAzNzkzXSRbLTE2LCAtMzgwMSwgOTg4OSwgMTYzNF0kWy03NjI4LCAtNTA2MywgMjI3NywgMzcyXSIvPg0KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEhPSWFPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9ISE9JYWVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEhPSWV1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMUU0RTNCMDMxOSIgc291cmNlPSJfSEhPSWF1ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEhPSWF1ZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISE9JZmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISE9JZi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIT0lnT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEhPSWZ1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhPSWdlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMUU0RTNEMDM2NCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIT0lnLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISE9JZ3VmWEVkdXFIb09KYlVSWlJ3IiB4PSIyNSIgeT0iLTE2NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhPSWhPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRTRFM0QwMzY0Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhPSWh1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISE9JaGVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMzk3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISE9JaC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjFFNEUzRDAzNjIiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISE9JaWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISE9JaU9mWEVkdXFIb09KYlVSWlJ3IiB4PSIyODIiIHk9IjM2MiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhPSWl1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMUU0RTNEMDM2MiI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIT0lqT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISE9JaS1mWEVkdXFIb09KYlVSWlJ3IiB4PSIxNjIxIiB5PSI0MDgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIT0lqZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjFFNEUzRDAzNjQiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISE9Jai1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEhPSWtPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISE9JanVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISE9Ja2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjFFNEUzRDAzNjIiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISE9Jay1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEhPSWxPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISE9Ja3VmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISE9JbGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMUU0RTNEMDM2NCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIT0lsLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISE9JbU9mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hIT0lsdWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIT0ltZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjFFNEUzRDAzNjIiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISE9JbS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISE9Jbk9mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hIT0ltdWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hIT0llLWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjEyNjMyMjU2IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9ISE9JZk9mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlsyNTY1LCA1OTIsIDI1NjUsIDU5Ml0kWzMxNDksIDU5MiwgMzE0OSwgNTkyXSRbMzE0OSwgMTg4OCwgMzE0OSwgMTg4OF0kWzExOTMsIDE4ODgsIDExOTMsIDE4ODhdJFsxMTkzLCAxMTA5LCAxMTkzLCAxMTA5XSIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9ISE9JbmVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3OTU2MjQwMTdFIiBzb3VyY2U9Il9ISE9JYXVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9ISE9JQy1mWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIT0lvT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIT0lvdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhPSW8tZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISE9Jb2VmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9ISE9JbnVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIxMjYzMjI1NiIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEhPSW4tZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTE3NywgLTExMDksIDc0NDIsIDE5ODldJFstMTc3LCAtMzE0OSwgNzQ0MiwgLTUwXSRbLTYyMDYsIC0zMTQ5LCAxNDEzLCAtNTBdIi8+DQotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9ISE9JcE9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hIT0lwZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9ISE9JdHVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRTREQUMwMUEwIiBzb3VyY2U9Il9ISE9JcHVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9ISE9JYXVmWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIWDVBT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIWDVBdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhYNUEtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISFg1QWVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISFg1Qk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRTREQUQwMDU3Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhYNUJ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hIWDVCZWZYRWR1cUhvT0piVVJaUnciIHg9IjI0OSIgeT0iMjcxIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISFg1Qi1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjFFNERBRDAwNTciPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISFg1Q2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hIWDVDT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0zOTciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIWDVDdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMUU0REFEMDA0RCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIWDVET2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hIWDVDLWZYRWR1cUhvT0piVVJaUnciIHg9Ii0zIiB5PSIzMDUiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIWDVEZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjFFNERBRDAwNEQiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISFg1RC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEhYNUR1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTY4MCIgeT0iLTIyMCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhYNUVPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMUU0REFEMDA1NyI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIWDVFdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISFg1RS1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hIWDVFZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIWDVGT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMUU0REFEMDA0RCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIWDVGdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISFg1Ri1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hIWDVGZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIWDVHT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRTREQUQwMDU3Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhYNUd1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIWDVHLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEhYNUdlZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhYNUhPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMUU0REFEMDA0RCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIWDVIdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIWDVILWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEhYNUhlZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEhPSXQtZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMTI2MzIyNTYiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hIT0l1T2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzIwOTEsIDkzLCAtNTQ3NywgMjQ1XSRbNTAwMywgOTMsIC0yNTY1LCAyNDVdIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hIWDVJT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjAwNTgzQjAxRTYiIHNvdXJjZT0iX0hIT0lwdWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hIT0lDLWZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhYNUktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhYNUplZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISFg1SnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hIWDVKT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hIWDVJZWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjEyNjMyMjU2IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9ISFg1SXVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstNTAsIC03NzAsIDAsIDI0ODBdJFstNTAsIC0yNzI2LCAwLCA1MjRdIi8+DQotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9ISFg1Si1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hIWDVLT2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9ISFg1UXVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI5NEVDNjAwMkJEIiBzb3VyY2U9Il9ISE9JcHVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9ISFg1TXVmWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIWDVSZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIWDVSLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhYNVNPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISFg1UnVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISFg1U2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI5NEVDNjAwMkJGIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhYNVMtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hIWDVTdWZYRWR1cUhvT0piVVJaUnciIHg9IjEwOCIgeT0iMjI5Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISFg1VE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyOTRFQzYwMDJCRiI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIWDVUdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEhYNVRlZlhFZHVxSG9PSmJVUlpSdyIgeD0iODI4IiB5PSItMjYzIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISFg1VC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjk0RUM2MDAyQkUiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISFg1VWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISFg1VU9mWEVkdXFIb09KYlVSWlJ3IiB4PSItOTIiIHk9IjE3OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhYNVV1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjk0RUM2MDAyQkUiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISFg1Vk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEhYNVUtZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTYyIiB5PSItMzU1Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISFg1VmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI5NEVDNjAwMkJGIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhYNVYtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIWDVXT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEhYNVZ1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhYNVdlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI5NEVDNjAwMkJFIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhYNVctZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIWDVYT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEhYNVd1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhYNVhlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjk0RUM2MDAyQkYiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISFg1WC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEhYNVlPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISFg1WHVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISFg1WWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI5NEVDNjAwMkJFIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhYNVktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEhYNVpPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISFg1WXVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9ISFg1US1mWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjEyNjMyMjU2IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9ISFg1Uk9mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMjA5OSwgMCwgNTQ2OSwgMF0kWy01MzI1LCAwLCAyMjQzLCAwXSIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9ISFg1WmVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI5NEVDMkIwMUNBIiBzb3VyY2U9Il9ISFg1TXVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9ISE9JQy1mWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIWDVhT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIWDVhdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhYNWEtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISFg1YWVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9ISFg1WnVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIxMjYzMjI1NiIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEhYNVotZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMjUsIC03NzAsIC03NDkzLCAyNDgwXSRbMjUsIC0zMjUxLCAtNzQ5MywgMF0kWzYxMDQsIC0zMjUxLCAtMTQxMywgMF0iLz4NCi0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hIWDViT2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEhYNWJlZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgIDwvY29udGVudHM+DQotICAgICAgICAgIDwvZUFubm90YXRpb25zPg0KLSAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0d0NUNEZWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURFNDlFQTAxRTIiPg0KLSAgICAgICAgICAgIDxib2R5PjA2PC9ib2R5Pg0KLSAgICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgICAgPHBhY2thZ2VNZXJnZSB4bWk6aWQ9Il9WUElHTU94ZUVkdUhqZTNwUGFoTjRBIiBtZXJnZWRQYWNrYWdlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMTkwIi8+DQotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDFERTUyMjEwMUQyIiBuYW1lPSJBcnRpZmFjdERlc2NyaXB0aW9uIj4NCi0gICAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDFGQUUwN0QwMzY0IiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDFERTUzNkEwMEQ4Ii8+DQotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDAwQSIgbmFtZT0iYnJpZWZPdXRsaW5lIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiPg0KLSAgICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HdDVDR09mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMDBBIj4NCi0gICAgICAgICAgICAgICAgPGJvZHk+UHJvdmlkZXMgYSBicmllZiBkZXNjcmlwdGlvbiBvZiB0aGUgaW5mb3JtYXRpb24gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhpcyBhcnRpZmFjdC4gRm9yIGV4YW1wbGUsIGRpc2N1c3NlcyB0aGUgY29udGVudHMgZm9yIGtleSBjaGFwdGVycyBvZiBhIGRvY3VtZW50IGFydGlmYWN0IG9yIHRoZSBrZXkgcGFja2FnZXMgYW5kIG1vZHVsZXMgb2YgYSBtb2RlbCBhcnRpZmFjdC48L2JvZHk+DQotICAgICAgICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0duZFZrZXlIRWR1NS12VmpsZlZzZlEiIHZhbHVlPSIxIi8+DQotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HbmRWa095SEVkdTUtdlZqbGZWc2ZRIi8+DQotICAgICAgICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfR2ZqOTBPeUhFZHU1LXZWamxmVnNmUSIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyIgdmFsdWU9IiIvPg0KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDAwQiIgbmFtZT0icmVwcmVzZW50YXRpb25PcHRpb25zIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiPg0KLSAgICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HdUN6QWVmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMDBCIj4NCi0gICAgICAgICAgICAgICAgPGJvZHk+RGlzY3Vzc2VzIGRpZmZlcmVudCBwb3NzaWJsZSBhbHRlcm5hdGl2ZSByZXByZXNlbnRhdGlvbnMgZm9yIHRoZSBhcnRpZmFjdC4gRm9yIGV4YW1wbGUgYSBkZXNpZ24gbW9kZWwgY2FuIGJlIHJlcHJlc2VudGVkIGFzIGEgVU1MIG1vZGVsIG9yIGFuIGluZm9ybWFsIGJsb2NrIGRpYWdyYW0gb3IgYnkgdGV4dHVhbCBkZXNjcmlwdGlvbiBvbmx5LjwvYm9keT4NCi0gICAgICAgICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfbnNuWWtleUhFZHU1LXZWamxmVnNmUSIgdmFsdWU9IjEiLz4NCi0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX25zbllrT3lIRWR1NS12VmpsZlZzZlEiLz4NCi0gICAgICAgICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il9uaVZiTU95SEVkdTUtdlZqbGZWc2ZRIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIiB2YWx1ZT0iIi8+DQotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDYxMURCMkYwMjBEIiBuYW1lPSJyZXByZXNlbnRhdGlvbiIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIj4NCi0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iXzJFRXc0ZXlJRWR1NS12VmpsZlZzZlEiIHZhbHVlPSIxIi8+DQotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il8yRUV3NE95SUVkdTUtdlZqbGZWc2ZRIi8+DQotICAgICAgICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfMThMWklPeUlFZHU1LXZWamxmVnNmUSIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyIgdmFsdWU9IiIvPg0KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQ2MTFEQjREMDI0OCIgbmFtZT0ibm90YXRpb24iIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyI+DQotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9QQmlsOGV5SEVkdTUtdlZqbGZWc2ZRIiB2YWx1ZT0iMSIvPg0KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfUEJpbDhPeUhFZHU1LXZWamxmVnNmUSIvPg0KLSAgICAgICAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iX080Y1VVT3lIRWR1NS12VmpsZlZzZlEiIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiIHZhbHVlPSIiLz4NCi0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MURFNTI1QzAxMzciIG5hbWU9IkRlbGl2ZXJhYmxlRGVzY3JpcHRpb24iPg0KLSAgICAgICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MUZBRTA3QjAxQUMiIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0MURFNTM2QTAwRDgiLz4NCi0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMDE0IiBuYW1lPSJleHRlcm5hbERlc2NyaXB0aW9uIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiPg0KLSAgICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HdUN6Q09mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMDE0Ij4NCi0gICAgICAgICAgICAgICAgPGJvZHk+VGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBEZWxpdmVyYWJsZSB1c2VkIGZvciBjbGllbnQgZG9jdW1lbnRzIChwcm9wb3NhbCwgc3RhdGVtZW50cyBvZiB3b3JrIG9yIGNvbnRyYWN0dWFsIGFncmVlbWVudHMpLiAgSXQgbWlnaHQgdXNlIGEgZGlmZmVyZW50IGxhbmd1YWdlIGFuZCBmb2xsb3cgbGVnYWwgY29uc3RyYWludHMuPC9ib2R5Pg0KLSAgICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il82cHI4QWV5R0VkdTUtdlZqbGZWc2ZRIiB2YWx1ZT0iMSIvPg0KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfNnByOEFPeUdFZHU1LXZWamxmVnNmUSIvPg0KLSAgICAgICAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iXzZiclZNT3lHRWR1NS12VmpsZlZzZlEiIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiIHZhbHVlPSIiLz4NCi0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAwMUUiIG5hbWU9InBhY2thZ2luZ0d1aWRhbmNlIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiPg0KLSAgICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HdUN6Qy1mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMDFFIj4NCi0gICAgICAgICAgICAgICAgPGJvZHk+UHJvdmlkZXMgZ3VpZGFuY2Ugb24gaG93IHRvIGFzc2VtYmxlIHRoZSBkZWxpdmVyYWJsZSBmcm9tIGFsbCBpdHMgcmVxdWlyZWQgaW5wdXRzLiAgVGhpcyBzZWN0aW9uIGRlc2NyaWJlcyB0aGUgbW9zdCBjb21tb24gY29udGVudCBtZWRpdW0gYW5kIGZvcm1hdC4gIERpc3RyaWJ1dGlvbiBvZiB0aGUgZGVsaXZlcmFibGUgaXMgYWRkcmVzc2VkIGluIHRoaXMgc2VjdGlvbiwgaWYgbmVjZXNzYXJ5LjwvYm9keT4NCi0gICAgICAgICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfZXVsakVleUdFZHU1LXZWamxmVnNmUSIgdmFsdWU9IjEiLz4NCi0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX2V1bGpFT3lHRWR1NS12VmpsZlZzZlEiLz4NCi0gICAgICAgICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il9la3dSb095R0VkdTUtdlZqbGZWc2ZRIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIiB2YWx1ZT0iIi8+DQotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDFERTUzMTkwMzUwIiBuYW1lPSJSb2xlRGVzY3JpcHRpb24iPg0KLSAgICAgICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MUZBRTA4NTAzODMiIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0Mjc5N0Y3NDAzOTIiLz4NCi0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMDc4IiBuYW1lPSJza2lsbHMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyI+DQotICAgICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0d1Q3pFT2ZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAwNzgiPg0KLSAgICAgICAgICAgICAgICA8Ym9keT5MaXN0cyBvZiBzZXQgb2YgcmVxdWlyZWQgc2tpbGxzIGEgcGVyc29uIG5lZWRzIHRvIHBvc3Nlc3MgdG8gZnVsZmlsbCB0aGF0IFJvbGUuPC9ib2R5Pg0KLSAgICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il8tT1hSd2V5SUVkdTUtdlZqbGZWc2ZRIiB2YWx1ZT0iMSIvPg0KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfLU9YUndPeUlFZHU1LXZWamxmVnNmUSIvPg0KLSAgICAgICAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iXy1EZTNjT3lJRWR1NS12VmpsZlZzZlEiIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiIHZhbHVlPSIiLz4NCi0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAwODIiIG5hbWU9ImFzc2lnbm1lbnRBcHByb2FjaGVzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiPg0KLSAgICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HdUN6RS1mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMDgyIj4NCi0gICAgICAgICAgICAgICAgPGJvZHk+UHJvdmlkZXMgZ3VpZGFuY2Ugb24gZm9yIGFzc2lnbmluZyBpbmRpdmlkdWFscyB0byB0aGUgUm9sZSBpbiB0ZXJtcyBvZiB3aGF0IG90aGVyIHJvbGVzIHRoZXNlIGluZGl2aWR1YWxzIGNvdWxkIHBlcmZvcm0gYW5kIHdoYXQgcmVzcG9uc2liaWxpdHkgZGlmZmVyZW50IGluZGl2aWR1YWxzIGFzc2lnbmVkIHRvIHRoaXMgcm9sZSBtaWdodCBoYXZlLiAgVGhlIGd1aWRhbmNlIGNhbiBhbHNvIGRlc2NyaWJlIGRpZmZlcmVudCBhc3NpZ25tZW50IGFwcHJvYWNoZXMgZm9yIGRpZmZlcmVudCB0eXBlcyBvZiBwcm9qZWN0cywgZS5nLiBmb3IgbGFyZ2UgdmVyc3VzIHNtYWxsIHRlYW1zIHdoZXJlIGluZGl2aWR1YWxzIGNvdWxkIGJlIGFsbG9jYXRlZCB0byByb2xlcyBmdWxsIHRpbWUgdmVyc3VzIHNoYXJpbmcgcm9sZXMgd2l0aGluIHRoZSB0ZWFtLjwvYm9keT4NCi0gICAgICAgICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfcHRYSVVleUhFZHU1LXZWamxmVnNmUSIgdmFsdWU9IjEiLz4NCi0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3B0WElVT3lIRWR1NS12VmpsZlZzZlEiLz4NCi0gICAgICAgICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il9wbDUxY095SEVkdTUtdlZqbGZWc2ZRIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIiB2YWx1ZT0iIi8+DQotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDE0QjM3N0QwMjcyIiBuYW1lPSJzeW5vbnltcyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIj4NCi0gICAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3VMODh1ZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNEIzNzdEMDI3MiI+DQotICAgICAgICAgICAgICAgIDxib2R5Pkxpc3RzIHN5bm9ueW1zLCBpLmUuIG90aGVyIG5hbWVzIHRoZSBSb2xlIG1pZ2h0IGJlIHJlZmVycmVkIGJ5LiAgVG9vbCBzdXBwb3J0IGZvciB0aGUgbWV0YS1tb2RlbCBtaWdodCBzdXBwb3J0IHRoYXQgYSBSb2xlIG5hbWUgY2FuIGJlIGNvbnNpc3RlbnRseSBiZSByZXBsYWNlZCB3aXRoIG9uZSBvZiBpdHMgc3lub255bXMgdGhyb3VnaHQgYSBQcm9jZXNzLjwvYm9keT4NCi0gICAgICAgICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfN3FXdTBleUdFZHU1LXZWamxmVnNmUSIgdmFsdWU9IjEiLz4NCi0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iXzdxV3UwT3lHRWR1NS12VmpsZlZzZlEiLz4NCi0gICAgICAgICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il83ZzBZVU95R0VkdTUtdlZqbGZWc2ZRIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIiB2YWx1ZT0iIi8+DQotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDFERTUzNTEwMDEzIiBuYW1lPSJUYXNrRGVzY3JpcHRpb24iPg0KLSAgICAgICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0Mjc5ODQ5RTAwMDEiIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0Mjc5N0Y3NDAzOTIiLz4NCi0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMDhEIiBuYW1lPSJwdXJwb3NlIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiPg0KLSAgICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HdUw4OS1mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMDhEIj4NCi0gICAgICAgICAgICAgICAgPGJvZHk+U3VtbWFyaXplcyB0aGUgbWFpbiByZWFzb24gZm9yIHBlcmZvcm1pbmcgdGhpcyBUYXNrIGFuZCB3aGF0IGlzIGludGVuZGVkIHRvIGJlIGFjaGlldmVkLjwvYm9keT4NCi0gICAgICAgICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfQkdfeklleUdFZHU1LXZWamxmVnNmUSIgdmFsdWU9IjEiLz4NCi0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0JHX3pJT3lHRWR1NS12VmpsZlZzZlEiLz4NCi0gICAgICAgICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il9DS2YzZ095R0VkdTUtdlZqbGZWc2ZRIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIiB2YWx1ZT0iIi8+DQotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMDk2IiBuYW1lPSJhbHRlcm5hdGl2ZXMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyI+DQotICAgICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0d1TDgtdWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAwOTYiPg0KLSAgICAgICAgICAgICAgICA8Ym9keT5Db21wcmlzZXMgb2Ygc3VtbWFyaWVzIGRlc2NyaWJpbmcgaW1wb3J0YW50IGV4Y2VwdGlvbmFsIGFuZCBub24tc3RhbmRhcmQgd2F5cyBvZiBhY2hpZXZpbmcgdGhpcyBUYXNrJ3MgZGV2ZWxvcG1lbnQgZ29hbHMgdGhhdCB3ZXJlIG5vdCBjb3ZlcmVkIGJ5IHRoZSBUYXNrJ3MgU3RlcHMuPC9ib2R5Pg0KLSAgICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9BQXpmd2V5SkVkdTUtdlZqbGZWc2ZRIiB2YWx1ZT0iMSIvPg0KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfQUF6ZndPeUpFZHU1LXZWamxmVnNmUSIvPg0KLSAgICAgICAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iX180NklBT3lJRWR1NS12VmpsZlZzZlEiIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiIHZhbHVlPSIiLz4NCi0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MURFNTM2QTAwRDgiIG5hbWU9IldvcmtQcm9kdWN0RGVzY3JpcHRpb24iPg0KLSAgICAgICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MUZBRTA3NTAzQzciIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0Mjc5N0Y3NDAzOTIiLz4NCi0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMEI0IiBuYW1lPSJwdXJwb3NlIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiPg0KLSAgICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HdVZ0OHVmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMEI0Ij4NCi0gICAgICAgICAgICAgICAgPGJvZHk+RGVzY3JpYmVzIHdoeSB0aGUgd29yayBwcm9kdWN0IGlzIHByb2R1Y2VkIGFuZCB0byB3aGF0IHVzZSBpdCB3aWxsIGJlIHB1dC48L2JvZHk+DQotICAgICAgICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX2FrbTE4ZXlHRWR1NS12VmpsZlZzZlEiIHZhbHVlPSIxIi8+DQotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9ha20xOE95R0VkdTUtdlZqbGZWc2ZRIi8+DQotICAgICAgICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfYWNzM0lPeUdFZHU1LXZWamxmVnNmUSIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyIgdmFsdWU9IiIvPg0KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDBCRSIgbmFtZT0iaW1wYWN0T2ZOb3RIYXZpbmciIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyI+DQotICAgICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0d1VnQ5ZWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAwQkUiPg0KLSAgICAgICAgICAgICAgICA8Ym9keT5EZXNjcmliZXMgdGhlIGNvbnNlcXVlbmNlcyBvZiBub3QgcHJvZHVjaW5nIHRoZSB3b3JrIHByb2R1Y3QuICBUaGlzIGlzIGludGVuZGVkIHRvIGFpZCBpbiB0aGUgdGFpbG9yaW5nIHRoZSBtZXRob2QvcHJvY2VzcyB0byB0aGUgbmVlZHMgb2YgYSBzcGVjaWZpYyBwcm9qZWN0LjwvYm9keT4NCi0gICAgICAgICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfYlo4aWdleUdFZHU1LXZWamxmVnNmUSIgdmFsdWU9IjEiLz4NCi0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX2JaOGlnT3lHRWR1NS12VmpsZlZzZlEiLz4NCi0gICAgICAgICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il9iUm1lME95R0VkdTUtdlZqbGZWc2ZRIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIiB2YWx1ZT0iIi8+DQotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMEJGIiBuYW1lPSJyZWFzb25zRm9yTm90TmVlZGluZyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIj4NCi0gICAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3VWdC1PZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDBCRiI+DQotICAgICAgICAgICAgICAgIDxib2R5PkRlc2NyaWJlcyB0aGUgY2lyY3Vtc3RhbmNlcyBpbiB3aGljaCBpdCBpcyByZWFzb25hYmxlIG5vdCB0byBwcm9kdWNlIHRoZSB3b3JrIHByb2R1Y3QuICBUaGlzIGlzIGludGVuZGVkIHRvIGFpZCBpbiB0aGUgdGFpbG9yaW5nIG9mIHRoZSBtZXRob2QvcHJvY2VzcyB0byB0aGUgbmVlZHMgb2YgYSBzcGVjaWZpYyBwcm9qZWN0LjwvYm9keT4NCi0gICAgICAgICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfQkFJMTBleUpFZHU1LXZWamxmVnNmUSIgdmFsdWU9IjEiLz4NCi0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0JBSTEwT3lKRWR1NS12VmpsZlZzZlEiLz4NCi0gICAgICAgICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il9BMzc4RU95SkVkdTUtdlZqbGZWc2ZRIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIiB2YWx1ZT0iIi8+DQotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDFERjM2MjAwMDlBIiBuYW1lPSJHdWlkYW5jZURlc2NyaXB0aW9uIj4NCi0gICAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDFGQUUwODgwMTNGIiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDI3OTdGNzQwMzkyIi8+DQotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxQkUyNTE4MDBEMiIgbmFtZT0iYXR0YWNobWVudHMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyI+DQotICAgICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0d1VnRfZWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUJFMjUxODAwRDIiPg0KLSAgICAgICAgICAgICAgICA8Ym9keT5UaGlzIGZpZWxkIGlzIHByaW1hcmlseSB1c2VkIGZvciBhdHRhY2htZW50cyBhdWdtZW50aW5nIHRoZSBpbmZvcm1hdGlvbiBwcm92aWRlZCBmb3IgZ3VpZGFuY2UuICBJbiBwYXJ0aWN1bGFyIHRoZSBhdHRyaWJ1dGUgaXMgdXNlZCBmb3IgVGVtcGxhdGVzLCBFeGFtcGxlcywgYW5kIFJldXNhYmxlIEFzc2V0cyB0byBjb250YWluIHRoZSBhY3R1YWwgYXR0YWNobWVudCBkZXNjcmliZWQgaW4gdGhlIG1haW5EZXNjcmlwdGlvbi4gIEl0IGNhbiBhZGRpdGlvbmFsbHkgY29udGFpbiByZXByZXNlbnRhdGlvbnMgb2YgdGhlIGd1aWRhbmNlIGluIGp1c3QgYSB0aGlyZCBwYXJ0eSBmb3JtYXQsIGUuZy4gUERGLCBNUyBXb3JkLCBvciBXb3JkIFBlcmZlY3QuPC9ib2R5Pg0KLSAgICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il83OFZrd2V5SUVkdTUtdlZqbGZWc2ZRIiB2YWx1ZT0iMSIvPg0KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfNzhWa3dPeUlFZHU1LXZWamxmVnNmUSIvPg0KLSAgICAgICAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iXzcxTHo0T3lJRWR1NS12VmpsZlZzZlEiIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiIHZhbHVlPSIiLz4NCi0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MURGMzYzNjAxMDkiIG5hbWU9IlByYWN0aWNlRGVzY3JpcHRpb24iPg0KLSAgICAgICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MUZBRTA4QjAwQUEiIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0Mjc5N0Y3NDAzOTIiLz4NCi0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGRDRGMDYwMTM4IiBuYW1lPSJhZGRpdGlvbmFsSW5mbyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIj4NCi0gICAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3VWdUF1ZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRkQ0RjA2MDEzOCI+DQotICAgICAgICAgICAgICAgIDxib2R5PkFueSBhZGRpdGlvbmFsIEluZm9ybWF0aW9uIG5vdCBjb3ZlcmVkIGJ5IHRoZSBvdGhlciBhdHRyaWJ1dGVzLjwvYm9keT4NCi0gICAgICAgICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR1pzVWNPeUpFZHU1LXZWamxmVnNmUSIgdmFsdWU9IjEiLz4NCi0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0daaktnT3lKRWR1NS12VmpsZlZzZlEiLz4NCi0gICAgICAgICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il9HUzJGa095SkVkdTUtdlZqbGZWc2ZRIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIiB2YWx1ZT0iIi8+DQotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGRDRFRjAwMjdGIiBuYW1lPSJwcm9ibGVtIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiPg0KLSAgICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HdWZlOHVmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGRDRFRjAwMjdGIj4NCi0gICAgICAgICAgICAgICAgPGJvZHk+QSBkZXNjcmlwdGlvbiBvZiB0aGUgcHJvYmxlbSB0aGUgUHJhY3RpY2UgYWRkcmVzc2VzLjwvYm9keT4NCi0gICAgICAgICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfNFdfMXdleUlFZHU1LXZWamxmVnNmUSIgdmFsdWU9IjEiLz4NCi0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iXzRXXzF3T3lJRWR1NS12VmpsZlZzZlEiLz4NCi0gICAgICAgICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il80T1czSU95SUVkdTUtdlZqbGZWc2ZRIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIiB2YWx1ZT0iIi8+DQotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGRDRFRjgwMTkyIiBuYW1lPSJiYWNrZ3JvdW5kIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiPg0KLSAgICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HdWZlOWVmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGRDRFRjgwMTkyIj4NCi0gICAgICAgICAgICAgICAgPGJvZHk+RWxhYm9yYXRpb24gb24gdGhlIGJhY2tncm91bmQgYW5kIHRoZSBjb250ZXh0IGluIHdoaWNoIHRoZSBwcm9ibGVtIG9jY3VycyBhbmQgd2hlcmUgdGhlIHNvbHV0aW9uIGRlc2NyaWJlZCBieSB0aGlzIFByYWN0aWNlIHdpbGwgZml0IGluLjwvYm9keT4NCi0gICAgICAgICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfQ2MtQU1leUpFZHU1LXZWamxmVnNmUSIgdmFsdWU9IjEiLz4NCi0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0NjLUFNT3lKRWR1NS12VmpsZlZzZlEiLz4NCi0gICAgICAgICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il9DU1BXNE95SkVkdTUtdlZqbGZWc2ZRIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIiB2YWx1ZT0iIi8+DQotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGRDVENTMwMTFEIiBuYW1lPSJnb2FscyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIj4NCi0gICAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3VmZS1PZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRkQ1RDUzMDExRCI+DQotICAgICAgICAgICAgICAgIDxib2R5PkEgc3VtbWFyeSBvZiB0aGUgb3ZlcmFsbCBnb2FscyB0byBiZSBhZGRyZXNzZWQgYnkgdGhlIFByYWN0aWNlLjwvYm9keT4NCi0gICAgICAgICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfMFVVRGNleUlFZHU1LXZWamxmVnNmUSIgdmFsdWU9IjEiLz4NCi0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iXzBVVURjT3lJRWR1NS12VmpsZlZzZlEiLz4NCi0gICAgICAgICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il8wTFlKNE95SUVkdTUtdlZqbGZWc2ZRIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIiB2YWx1ZT0iIi8+DQotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGRDRGMDEwMjA2IiBuYW1lPSJhcHBsaWNhdGlvbiIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIj4NCi0gICAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3VmZS0tZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRkQ0RjAxMDIwNiI+DQotICAgICAgICAgICAgICAgIDxib2R5PkRlc2NyaWJlcyBob3cgdGhlIFByYWN0aWNlIGlzIGJlaW5nIGFwcGxpZWQgb3IgaW50cm9kdWNlZCBpbnRvIHRoZSBjb250ZXh0IGRlc2NyaWJlZCBpbiBiYWNrZ3JvdW5kLjwvYm9keT4NCi0gICAgICAgICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfODBxVDRleUlFZHU1LXZWamxmVnNmUSIgdmFsdWU9IjEiLz4NCi0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iXzgwcVQ0T3lJRWR1NS12VmpsZlZzZlEiLz4NCi0gICAgICAgICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il84dHpkOE95SUVkdTUtdlZqbGZWc2ZRIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIiB2YWx1ZT0iIi8+DQotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGRDVEM0UwMzI1IiBuYW1lPSJsZXZlbHNPZkFkb3B0aW9uIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiPg0KLSAgICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HdW9vNE9mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGRDVEM0UwMzI1Ij4NCi0gICAgICAgICAgICAgICAgPGJvZHk+T3V0bGluZXMgdGhlIGRpZmZlcmVudCBmb3JtcyBvciB2YXJpYW50cyBpbiB3aGljaCB0aGUgcHJhY3RpY2UgY291bGQgYmUgcmVhbGl6ZWQuIChlLmcuIGZ1bGwgYWRvcHRpb24gdmVydXMgYSBwYXJ0aWFsIGFkb3B0aW9uIG9mIHRoZSBQcmFjdGljZSk8L2JvZHk+DQotICAgICAgICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3RlNEhrZXlHRWR1NS12VmpsZlZzZlEiIHZhbHVlPSIxIi8+DQotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il90ZTRIa095R0VkdTUtdlZqbGZWc2ZRIi8+DQotICAgICAgICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfdUViRW9PeUdFZHU1LXZWamxmVnNmUSIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyIgdmFsdWU9IiIvPg0KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxRkVERTRDMDM4NCIgbmFtZT0iRGVzY3JpYmFibGVFbGVtZW50IiBpc0Fic3RyYWN0PSJ0cnVlIj4NCi0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0d1b280LWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUZFREU0QzAzODQiPg0KLSAgICAgICAgICAgICAgPGJvZHk+VGhpcyBkZWZpbml0aW9uIG9mIENvbnRlbnQgRWxlbWVudCBleHRlbmRzIHRoZSBDb250ZW50IEVsZW1lbnQgZGVmaW5pdGlvbiB2aWEgcGFja2FnZSBtZXJnZSB3aXRoIHJlZmVyZW5jZXMgdG8gaWNvbnMgdGhhdCBhcmUgdXNlZCBmb3IgcHJlc2VudGluZyBDb250ZW50IEVsZW1lbnRzIGluIGEgVU1BLWJhc2VkIG1vZGVsaW5nIGVudmlyb25tZW50IGFzIHdlbGwgYXMgd2hlbiBwdWJsaXNoaW5nIENvbnRlbnQgRWxlbWVudHMgaW50byBkb2N1bWVudGF0aW9uIHByZXNlbnRhdGlvbiAoZS5nLiBkb2N1bWVudCBvciBodG1sIHBhZ2VzKS48L2JvZHk+DQotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxRTQ5NTM3MDM0MyIgbmFtZT0ic2hhcGVpY29uIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MTEzRUEyOTAyRkUiPg0KLSAgICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HdW9vNS1mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFNDk1MzcwMzQzIj4NCi0gICAgICAgICAgICAgICAgPGJvZHk+QSByZWZlcmVuY2UgdG8gYW4gaWNvbiB0aGF0IGNhbiBiZSB1c2VkIGZvciBtb2RlbGluZyB3aXRoIHNwZWNpZmljIENvbnRlbnQgRWxlbWVudCBpbnN0YW5jZXMgKGFzIGdyYXBoaWNhbCBzdGVyZW90eXBlcywgZS5nLiBhIHVzZSBjYXNlIHN5bWJvbCBmb3IgYSB1c2UgY2FzZSBhcnRpZmFjdCkgYXMgd2VsbCBhcyBwdWJsaWNhdGlvbiBvZiBjb250ZW50LjwvYm9keT4NCi0gICAgICAgICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfSlpIclFleVBFZHVGS0pvdkJMNjRYUSIgdmFsdWU9IjEiLz4NCi0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0paSHJRT3lQRWR1RktKb3ZCTDY0WFEiLz4NCi0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MUU0OTUzQzAzMTkiIG5hbWU9Im5vZGVpY29uIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MTEzRUEyOTAyRkUiPg0KLSAgICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HdW9vNnVmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFNDk1M0MwMzE5Ij4NCi0gICAgICAgICAgICAgICAgPGJvZHk+QSByZWZlcmVuY2UgdG8gYW4gaWNvbiB0aGF0IGNhbiBiZSB1c2VkIGluIHRyZWUgYnJvd3NlciBwcmVzZW50YXRpb25zIGFuZCBicmVha2Rvd24gc3RydWN0dXJlcy48L2JvZHk+DQotICAgICAgICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0ZqMWJ3ZXlQRWR1RktKb3ZCTDY0WFEiIHZhbHVlPSIxIi8+DQotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9GajFid095UEVkdUZLSm92Qkw2NFhRIi8+DQotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDI3OTdGNzQwMzkyIiBuYW1lPSJDb250ZW50RGVzY3JpcHRpb24iPg0KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAwQUEiIG5hbWU9ImV4dGVybmFsSWQiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyI+DQotICAgICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0d1TDhfLWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAwQUEiPg0KLSAgICAgICAgICAgICAgICA8Ym9keT5BbiBleHRlcm5hbCB2aXNpYmxlIG51bWJlciBvciBsYWJlbCB0aGF0IGlzIHVzZWQgdG8gcmVmZXJlbmNlIHRoaXMgZWxlbWVudC4gVXNlZCBsaWtlIGEgc3lub255bSB0byB0aGUgbmFtZS48L2JvZHk+DQotICAgICAgICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX2hvNFVnZXlIRWR1NS12VmpsZlZzZlEiIHZhbHVlPSIxIi8+DQotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9obzRVZ095SEVkdTUtdlZqbGZWc2ZRIi8+DQotICAgICAgICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfaGZWLUFPeUhFZHU1LXZWamxmVnNmUSIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyIgdmFsdWU9IiIvPg0KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxNzdFNzE2MDM3RiIgbmFtZT0ia2V5Q29uc2lkZXJhdGlvbnMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyI+DQotICAgICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0d1b283LWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTc3RTcxNjAzN0YiPg0KLSAgICAgICAgICAgICAgICA8Ym9keT5LZXkgQ29uc2lkZXJhdGlvbnMgcHJvdmlkZXMgYWR2aXNlIGFuZCBndWlkYW5jZSBvZiBhIGNyaXRpY2FsIG5hdHVyZSBmb3IgdGhlIGNvbnRlbnQgZWxlbWVudCBhcyB3ZWxsIGFzIHdhcm5pbmdzLCBjYXV0aW9ucywgcGl0ZmFsbHMsIGRhbmdlcnMuPC9ib2R5Pg0KLSAgICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il8xTU10c2V5SUVkdTUtdlZqbGZWc2ZRIiB2YWx1ZT0iMSIvPg0KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfMU1NdHNPeUlFZHU1LXZWamxmVnNmUSIvPg0KLSAgICAgICAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iXzFEWi1FT3lJRWR1NS12VmpsZlZzZlEiIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiIHZhbHVlPSIiLz4NCi0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il9PRnlwRU1ubUVkeU4wY29kRVhhUjZnIiBuYW1lPSJsb25nUHJlc2VudGF0aW9uTmFtZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIi8+DQotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOlBhY2thZ2UiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzU3MDAzQiIgbmFtZT0iTWV0aG9kTGlicmFyeSI+DQotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iX0d3YllwdWZYRWR1cUhvT0piVVJaUnciIHNvdXJjZT0idW1sMi5kaWFncmFtcyIgcmVmZXJlbmNlcz0iXzNBREM3Qjc0MDIyRDQxRkZEQTI1MDBGRCI+DQotICAgICAgICAgIDxjb250ZW50cyB4bWk6dHlwZT0ibm90YXRpb246RGlhZ3JhbSIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDFGRkRBMjUwMEZEIiB0eXBlPSJDbGFzcyIgbmFtZT0iTWFpbiI+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLRFprT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUZFRERCNjAzMDYiPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLRFprLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEtEWmxPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IS0RabGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEtEWmx1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLRFpsLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLRFptT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJQYWNrYWdlQ29udGVudHMiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hLRFptZWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiIGNvbGxhcHNlZD0idHJ1ZSIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hLRFprZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iTm9uZSIgc2hvd0xpc3RWaXNpYmlsaXR5PSJOb25lIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IS0Raa3VmWEVkdXFIb09KYlVSWlJ3IiB4PSI0MzgxIiB5PSI0NzQ5IiB3aWR0aD0iNDI4NCIgaGVpZ2h0PSIxNjc2Ii8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEtEWm11ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRkVEQjM4MDExRSI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEtEWm5lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IS0RabnVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLRFpuLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IS0Rab09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEtEWm9lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEtEWm91ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlBhY2thZ2VDb250ZW50cyI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEtEWm8tZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIgY29sbGFwc2VkPSJ0cnVlIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEtEWm0tZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJOb25lIiBzaG93TGlzdFZpc2liaWxpdHk9Ik5vbmUiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hLRFpuT2ZYRWR1cUhvT0piVVJaUnciIHg9IjQzODEiIHk9IjE0NTEiIHdpZHRoPSI0Mjg0IiBoZWlnaHQ9IjE2NzYiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9MQXF6Z094eEVkdU0xNHVuV2FxUDVRIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMEZCIj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9MQXF6Zy14eEVkdU0xNHVuV2FxUDVRIiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0xBcXpoT3h4RWR1TTE0dW5XYXFQNVEiIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfTEFxemhleHhFZHVNMTR1bldhcVA1USIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0xBcXpodXh4RWR1TTE0dW5XYXFQNVEiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9MQXF6aC14eEVkdU0xNHVuV2FxUDVRIiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9MQXF6aU94eEVkdU0xNHVuV2FxUDVRIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iUGFja2FnZUNvbnRlbnRzIj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9MQXF6aWV4eEVkdU0xNHVuV2FxUDVRIiBjYW5vbmljYWw9ImZhbHNlIiBjb2xsYXBzZWQ9InRydWUiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9MQXF6Z2V4eEVkdU0xNHVuV2FxUDVRIiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfTEFxemd1eHhFZHVNMTR1bldhcVA1USIgeD0iNzM1NCIgeT0iODA0MCIgd2lkdGg9IjQyODQiIGhlaWdodD0iMTY3NiIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3NuN2l3TWlURWR5eE80RXN1UU9nVGciIGVsZW1lbnQ9Il9oYVlKanNpTUVkeXhPNEVzdVFPZ1RnIj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9zbjdpdzhpVEVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX3NuN2l4TWlURWR5eE80RXN1UU9nVGciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfc243aXhjaVRFZHl4TzRFc3VRT2dUZyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3NuN2l4c2lURWR5eE80RXN1UU9nVGciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9zbjdpeDhpVEVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9zbjdpeU1pVEVkeXhPNEVzdVFPZ1RnIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iUGFja2FnZUNvbnRlbnRzIj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9zbjdpeWNpVEVkeXhPNEVzdVFPZ1RnIiBjYW5vbmljYWw9ImZhbHNlIiBjb2xsYXBzZWQ9InRydWUiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9zbjdpd2NpVEVkeXhPNEVzdVFPZ1RnIiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfc243aXdzaVRFZHl4TzRFc3VRT2dUZyIgeD0iMjQ4NSIgeT0iODAzOSIgd2lkdGg9IjM1NDMiIGhlaWdodD0iMTY2NSIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MRGlhZ3JhbVN0eWxlIiB4bWk6aWQ9Il9Hd2JZcU9mWEVkdXFIb09KYlVSWlJ3IiBkZXNjcmlwdGlvbj0iVGhlIE1ldGhvZCBMaWJyYXJ5IHBhY2thZ2UgZGVmaW5lcyBjYXBhYmlsaXRpZXMgYXJvdW5kIG1hbmFnaW5nIHdob2xlIGxpYnJhcmllcyBvZiBNZXRob2QgQ29udGVudCBhbmQgUHJvY2Vzc2VzLiAgSXQgYWRkcmVzc2VzIHJlcXVpcmVtZW50cyBhcm91bmQgcGh5c2ljYWxseSBzZXBhcmF0aW5nIGRlc2NyaXB0aW9ucyBvZiBDb250ZW50IEVsZW1lbnRzIGZyb20gdGhlaXIgbW9kZWxlZCByZWxhdGlvbnNoaXBzIGRlZmluaW5nIHNlcGFyYXRlIHVuaXRzIG9mIGNvbnRyb2wuICBJdCBhbHNvIGFkZHJlc3NlcyB0aGUgY29uY2VybiBvZiBzY2FsaW5nIHRvIGxhcmdlIE1ldGhvZCBMaWJyYXJpZXMgYnkgZGVmaW5pbmcgTWV0aG9kIENvbmZpZ3VyYXRpb25zIHRoYXQgZGVmaW5lIHZpc2liaWxpdHkgc3BhY2VzIG9yIHdvcmtpbmcgc2V0cyBmb3IgTWV0aG9kIENvbnRlbnQgYW5kIFByb2Nlc3MgYWxsb3dpbmcgYSBQcm9jZXNzIEVuZ2luZWVyIHRvIGZvY3VzIG9uIHJlbGV2YW50IHBhcnRzIG9mIExpYnJhcnkgaW5zdGVhZCBvZiBzZWVpbmcgdGhlIHdob2xlIGxpYnJhcnkgYWxsIGF0IG9uY2UuICBCeSBkZWZpbmluZyBDb25maWd1cmF0aW9ucyBhcyBzdWJzZXRzIG9mIFBsdWdpbnMgYW5kIE1ldGhvZCBQYWNrYWdlcyB0aGF0IHNoYWxsIGJlIGNvbnNpZGVyZWQgZm9yIHByb2Nlc3MgYXV0aG9yaW5nIG9ubHksIENvbmZpZ3VyYXRpb25zIGFsc28gZGVmaW5lIHRoZSBzcGFjZSBvZiB2YXJpYWJpbGl0eSBpbnRlcnByZXRhdGlvbiB0byBhdm9pZCBjb25mbGljdHMgYW1vbmdzdCAnY29tcGV0aW5nJyBjb250ZW50IChlLmcuIGNvbnRlbnQgdGhhdCByZXBsYWNlcyB0aGUgc2FtZSBlbGVtZW50cykuIi8+DQotICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPg0KLSAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9BX19fb2V4TUVkdU9Ock1SZ216NDhBIiBlbGVtZW50PSJfQV9fX29PeE1FZHVPTnJNUmdtejQ4QSIgc291cmNlPSJfSEtEWm11ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEtEWmtPZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfQV9fX3BPeE1FZHVPTnJNUmdtejQ4QSIgdHlwZT0iS2luZExhYmVsIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0FfX19wdXhNRWR1T05yTVJnbXo0OEEiIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0FfX19xT3hNRWR1T05yTVJnbXo0OEEiIHR5cGU9IktpbmQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0FfX19wLXhNRWR1T05yTVJnbXo0OEEiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfQV9fX3BleE1FZHVPTnJNUmdtejQ4QSIgeT0iLTcxNSIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9BX19fb3V4TUVkdU9Ock1SZ216NDhBIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9BX19fby14TUVkdU9Ock1SZ216NDhBIiBwb2ludHM9IlstMTQsIDg2MCwgLTE0LCAtMjQzNV0kWy0xNCwgMjQ0OCwgLTE0LCAtODQ3XSIvPg0KLSAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0xBcXprZXh4RWR1TTE0dW5XYXFQNVEiIGVsZW1lbnQ9Il9HTmtCOE94U0VkdU9Ock1SZ216NDhBIiBzb3VyY2U9Il9IS0Raa09mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9MQXF6Z094eEVkdU0xNHVuV2FxUDVRIj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9MQXF6bE94eEVkdU0xNHVuV2FxUDVRIiB0eXBlPSJLaW5kTGFiZWwiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfTEFxemx1eHhFZHVNMTR1bldhcVA1USIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfTEFxem1PeHhFZHVNMTR1bldhcVA1USIgdHlwZT0iS2luZCIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfTEFxemwteHhFZHVNMTR1bldhcVA1USIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9MQXF6bGV4eEVkdU0xNHVuV2FxUDVRIiB4PSI0MjQiIHk9Ii02NDUiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfTEFxemt1eHhFZHVNMTR1bldhcVA1USIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfTEFxemsteHhFZHVNMTR1bldhcVA1USIgcG9pbnRzPSJbLTE0LCA4NDYsIC0yOTc3LCAtMjQ0N10kWzI5NTAsIDI0MzMsIC0xMywgLTg2MF0iLz4NCi0gICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il95RUJZQU1pVEVkeXhPNEVzdVFPZ1RnIiBlbGVtZW50PSJfeUF3QmtNaVRFZHl4TzRFc3VRT2dUZyIgc291cmNlPSJfSEtEWmtPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfc243aXdNaVRFZHl4TzRFc3VRT2dUZyI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfeUVCWUE4aVRFZHl4TzRFc3VRT2dUZyIgdHlwZT0iS2luZExhYmVsIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3lFQllCY2lURWR5eE80RXN1UU9nVGciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3lFQllCOGlURWR5eE80RXN1UU9nVGciIHR5cGU9IktpbmQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3lFQllCc2lURWR5eE80RXN1UU9nVGciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfeUVCWUJNaVRFZHl4TzRFc3VRT2dUZyIgeD0iMzI5IiB5PSI3MTIiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfeUVCWUFjaVRFZHl4TzRFc3VRT2dUZyIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfeUVCWUFzaVRFZHl4TzRFc3VRT2dUZyIgcG9pbnRzPSJbLTE5LCAzMiwgNjQsIC05M10kWy0xNSwgMTMwLCA2OCwgNV0iLz4NCi0gICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICA8L2NvbnRlbnRzPg0KLSAgICAgICAgICA8Y29udGVudHMgeG1pOnR5cGU9Im5vdGF0aW9uOkRpYWdyYW0iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxRkRENTUxMDM3QyIgdHlwZT0iQ2xhc3MiIG5hbWU9IlRheG9ub215Ij4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEtEWnZlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRkVEODgxMDFCNSI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEtEWndPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IS0Rad2VmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMjQ3MiIgaGVpZ2h0PSIxMDQ5Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLRFp3dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IS0Rady1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEtEWnhPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEtEWnhlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hLRFp4dWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEtEWngtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hLRFp5T2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEtEWnllZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hLRFp5dWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEtEWnktZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IS0Raek9mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEtEWnZ1ZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hLRFp2LWZYRWR1cUhvT0piVVJaUnciIHg9Ijg3NjkiIHk9IjQwNDQiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IS0RaNXVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFGRURFNzUwMDRFIj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IS0RaNmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hLRFo2dWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIyNTczIiBoZWlnaHQ9IjEwMzIiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEtEWjYtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLRFo3T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IS0RaN2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IS0RaN3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEtEWjctZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IS0RaOE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEtEWjhlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IS0RaOHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEtEWjgtZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IS0RaOU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hLRFo5ZWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IS0RaNS1mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93UGFyZW50PSJOYW1lIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEtEWjZPZlhFZHVxSG9PSmJVUlpSdyIgeD0iODk3NSIgeT0iODYyMyIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLTktrT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUZFREU4MDAyNTIiPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLTktrLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEtOS2xPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjM0MzciIGhlaWdodD0iMTAzMiIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IS05LbGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEtOS2x1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLTktsLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLTkttT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IS05LbWVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLTkttdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IS05LbS1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLTktuT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IS05LbmVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLTktudWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEtOS24tZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hLTktrZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dQYXJlbnQ9Ik5hbWUiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IS05La3VmWEVkdXFIb09KYlVSWlJ3IiB4PSI0ODQ2IiB5PSI4NjA5Ii8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEtOS3FlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRERGQTM2MDJDMSI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEtOS3JPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IS05LcmVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMjIxOCIgaGVpZ2h0PSIxMDMyIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLTktydWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IS05Lci1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEtOS3NPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEtOS3NlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hLTktzdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEtOS3MtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hLTkt0T2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEtOS3RlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hLTkt0dWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEtOS3QtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IS05LdU9mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEtOS3F1ZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hLTktxLWZYRWR1cUhvT0piVVJaUnciIHg9IjI0MzgiIHk9IjgyNCIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLTkswdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RDAzQjUiPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLTksxZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEtOSzF1ZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjM2MDYiIGhlaWdodD0iMTAzMiIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IS05LMS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEtOSzJPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLTksyZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLTksydWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IS05LMi1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLTkszT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IS05LM2VmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLTkszdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IS05LMy1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLTks0T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEtOSzRlZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hLTkswLWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IS05LMU9mWEVkdXFIb09KYlVSWlJ3IiB4PSI0NjgiIHk9IjYwOTEiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IS05LOU9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMTA0Ij4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IS05LOS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hLTkstT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIyNzQzIiBoZWlnaHQ9IjEwMzIiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEtOSy1lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLTkstdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IS05LLS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IS05LX09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEtOS19lZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IS05LX3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEtOS18tZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IS05MQU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEtOTEFlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IS05MQXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hLTkxBLWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IS05LOWVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93UGFyZW50PSJOYW1lIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEtOSzl1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iNDAyOSIgeT0iNDAzNCIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3doUUg4TTdaRWR5cFQ4RUxiV0phN3ciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyNkMiPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3doUUg4ODdaRWR5cFQ4RUxiV0phN3ciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfd2hRSDlNN1pFZHlwVDhFTGJXSmE3dyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il93aFFIOWM3WkVkeXBUOEVMYldKYTd3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfd2hRSDlzN1pFZHlwVDhFTGJXSmE3dyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3doUUg5ODdaRWR5cFQ4RUxiV0phN3ciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3doUUgtTTdaRWR5cFQ4RUxiV0phN3ciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il93aFFILWM3WkVkeXBUOEVMYldKYTd3Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3doUUgtczdaRWR5cFQ4RUxiV0phN3ciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il93aFFILTg3WkVkeXBUOEVMYldKYTd3Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3doUUhfTTdaRWR5cFQ4RUxiV0phN3ciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il93aFFIX2M3WkVkeXBUOEVMYldKYTd3Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3doUUhfczdaRWR5cFQ4RUxiV0phN3ciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfd2hRSF84N1pFZHlwVDhFTGJXSmE3dyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX3doUUg4YzdaRWR5cFQ4RUxiV0phN3ciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dQYXJlbnQ9Ik5hbWUiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il93aFFIOHM3WkVkeXBUOEVMYldKYTd3IiB4PSIxNzQzMyIgeT0iNjQ1MiIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iXzBqZk9VTTdaRWR5cFQ4RUxiV0phN3ciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1NzAwRUYiPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iXzBqZk9VODdaRWR5cFQ4RUxiV0phN3ciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfMGpmT1ZNN1pFZHlwVDhFTGJXSmE3dyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il8wamZPVmM3WkVkeXBUOEVMYldKYTd3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfMGpmT1ZzN1pFZHlwVDhFTGJXSmE3dyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iXzBqZk9WODdaRWR5cFQ4RUxiV0phN3ciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iXzBqZk9XTTdaRWR5cFQ4RUxiV0phN3ciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il8wamZPV2M3WkVkeXBUOEVMYldKYTd3Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iXzBqZk9XczdaRWR5cFQ4RUxiV0phN3ciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il8wamZPVzg3WkVkeXBUOEVMYldKYTd3Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iXzBqZk9YTTdaRWR5cFQ4RUxiV0phN3ciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il8wamZPWGM3WkVkeXBUOEVMYldKYTd3Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iXzBqZk9YczdaRWR5cFQ4RUxiV0phN3ciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfMGpmT1g4N1pFZHlwVDhFTGJXSmE3dyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iXzBqZk9VYzdaRWR5cFQ4RUxiV0phN3ciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dQYXJlbnQ9Ik5hbWUiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il8wamZPVXM3WkVkeXBUOEVMYldKYTd3IiB4PSIxMzM1OCIgeT0iODYyMyIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX1p5ZTBnTTdhRWR5cFQ4RUxiV0phN3ciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyODAiPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX1p5ZTBnODdhRWR5cFQ4RUxiV0phN3ciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfWnllMGhNN2FFZHlwVDhFTGJXSmE3dyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9aeWUwaGM3YUVkeXBUOEVMYldKYTd3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfWnllMGhzN2FFZHlwVDhFTGJXSmE3dyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX1p5ZTBoODdhRWR5cFQ4RUxiV0phN3ciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX1p5ZTBpTTdhRWR5cFQ4RUxiV0phN3ciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9aeWUwaWM3YUVkeXBUOEVMYldKYTd3Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX1p5ZTBpczdhRWR5cFQ4RUxiV0phN3ciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9aeWUwaTg3YUVkeXBUOEVMYldKYTd3Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX1p5ZTBqTTdhRWR5cFQ4RUxiV0phN3ciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9aeWUwamM3YUVkeXBUOEVMYldKYTd3Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX1p5ZTBqczdhRWR5cFQ4RUxiV0phN3ciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfWnllMGo4N2FFZHlwVDhFTGJXSmE3dyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX1p5ZTBnYzdhRWR5cFQ4RUxiV0phN3ciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dQYXJlbnQ9Ik5hbWUiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9aeWUwZ3M3YUVkeXBUOEVMYldKYTd3IiB4PSIxMDQyMyIgeT0iMTMyMSIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2NGMmxVTTdhRWR5cFQ4RUxiV0phN3ciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjk0RUI5MDAwRkMiPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2NGMmxVODdhRWR5cFQ4RUxiV0phN3ciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfY0YybFZNN2FFZHlwVDhFTGJXSmE3dyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9jRjJsVmM3YUVkeXBUOEVMYldKYTd3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfY0YybFZzN2FFZHlwVDhFTGJXSmE3dyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2NGMmxWODdhRWR5cFQ4RUxiV0phN3ciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2NGMmxXTTdhRWR5cFQ4RUxiV0phN3ciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9jRjJsV2M3YUVkeXBUOEVMYldKYTd3Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2NGMmxXczdhRWR5cFQ4RUxiV0phN3ciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9jRjJsVzg3YUVkeXBUOEVMYldKYTd3Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2NGMmxYTTdhRWR5cFQ4RUxiV0phN3ciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9jRjJsWGM3YUVkeXBUOEVMYldKYTd3Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2NGMmxYczdhRWR5cFQ4RUxiV0phN3ciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfY0YybFg4N2FFZHlwVDhFTGJXSmE3dyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX2NGMmxVYzdhRWR5cFQ4RUxiV0phN3ciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dQYXJlbnQ9Ik5hbWUiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9jRjJsVXM3YUVkeXBUOEVMYldKYTd3IiB4PSIxNjg0NyIgeT0iMzgwNSIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MRGlhZ3JhbVN0eWxlIiB4bWk6aWQ9Il9Hd2JZcXVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPg0KLSAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IS0RaOXVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFGRUUwQzUwM0ExIiBzb3VyY2U9Il9IS0RaNXVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IS0RadmVmWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IS0RaLWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEtEWi0tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEtEWl9PZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEtEWi11ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IS0RaOS1mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJUcmVlIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IS0RaLU9mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMTg1LCAtNTAzLCAyMzgsIDQyNTldJFstMTg1LCAtMzU5OCwgMjM4LCAxMTY0XSRbLTIxMiwgLTM1OTgsIDIxMSwgMTE2NF0kWy0yMTIsIC00NDQ1LCAyMTEsIDMxN10iLz4NCi0gICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IS0RaX2VmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IS0RaX3VmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IS05Lb09mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFGRUUwQzkwMTk0IiBzb3VyY2U9Il9IS05La09mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IS0RadmVmWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IS05Lby1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEtOS3BlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEtOS3B1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEtOS3BPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IS05Lb2VmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJUcmVlIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IS05Lb3VmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlsxMTExLCAtNTAzLCAtMjIyMywgNDI1OV0kWzExMTEsIC0zNjI1LCAtMjIyMywgMTEzN10kWzI4ODQsIC0zNjI1LCAtNDUwLCAxMTM3XSRbMjg4NCwgLTQ0NDUsIC00NTAsIDMxN10iLz4NCi0gICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IS05LcC1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IS05LcU9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IS05LNHVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFGRkRGODIwMTY2IiBzb3VyY2U9Il9IS05LMHVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IS0RadmVmWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IS05LNWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEtOSzUtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEtOSzZPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEtOSzV1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IS05LNC1mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJUcmVlIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IS05LNU9mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlsyMzksIC0zMTcsIC03ODU4LCAxNzQ2XSRbMjM5LCAtOTUyLCAtNzg1OCwgMTExMV0kWzc1OTQsIC05NTIsIC01MDMsIDExMTFdJFs3NTk0LCAtMTc0NiwgLTUwMywgMzE3XSIvPg0KLSAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hLTks2ZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hLTks2dWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hLTks2LWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjUxOEM5MzAwOEYiIHNvdXJjZT0iX0hLTkswdWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hLTktxZWZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLTks3dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IS05LOE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IS05LOGVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IS05LNy1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hLTks3T2ZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlRyZWUiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hLTks3ZWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy03OSwgLTMxNywgLTE0ODIsIDI5MTFdJFstNzksIC0yMjIyLCAtMTQ4MiwgMTAwNl0kWzE0MDcsIC0yMjIyLCA0LCAxMDA2XSRbMTQwNywgLTI5MTAsIDQsIDMxOF0iLz4NCi0gICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IS05LOHVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IS05LOC1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IS05MRnVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI1MThCRDcwMUUzIiBzb3VyY2U9Il9IS05LOU9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IS05LcWVmWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IS05MR2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEtOTEctZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEtOTEhPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEtOTEd1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IS05MRi1mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJUcmVlIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IS05MR09mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstNzY3LCAtNTAzLCAxNTA4LCAzMzA3XSRbLTc2NywgLTI2NTEsIDE1MDgsIDExNTldJFstMjI3NSwgLTI2NTEsIDAsIDExNTldJFstMjI3NSwgLTM0OTMsIDAsIDMxN10iLz4NCi0gICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IS05MSGVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IS05MSHVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il8wamZPaXM3WkVkeXBUOEVMYldKYTd3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDQ1NjVCQjEwMTVGIiBzb3VyY2U9Il8wamZPVU03WkVkeXBUOEVMYldKYTd3IiB0YXJnZXQ9Il9IS0RadmVmWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il8wamZPamM3WkVkeXBUOEVMYldKYTd3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfMGpmT2o4N1pFZHlwVDhFTGJXSmE3dyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfMGpmT2tNN1pFZHlwVDhFTGJXSmE3dyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il8wamZPanM3WkVkeXBUOEVMYldKYTd3IiB5PSItNTMwIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iXzBqZk9pODdaRWR5cFQ4RUxiV0phN3ciIHJvdXRpbmc9IlRyZWUiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iXzBqZk9qTTdaRWR5cFQ4RUxiV0phN3ciIHBvaW50cz0iWy04MCwgLTUwMywgNTI5MSwgMzgzNl0kWy04MCwgLTI2NzIsIDUyOTEsIDE2NjddJFstNDIzNCwgLTI2NzIsIDExMzcsIDE2NjddJFstNDIzNCwgLTQwMjIsIDExMzcsIDMxN10iLz4NCi0gICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il8wamZPa2M3WkVkeXBUOEVMYldKYTd3IiBlbGVtZW50PSJfcW1ka2dNN1pFZHlwVDhFTGJXSmE3dyIgc291cmNlPSJfMGpmT1VNN1pFZHlwVDhFTGJXSmE3dyIgdGFyZ2V0PSJfd2hRSDhNN1pFZHlwVDhFTGJXSmE3dyI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfMGpmT2xNN1pFZHlwVDhFTGJXSmE3dyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iXzBqZk9sczdaRWR5cFQ4RUxiV0phN3ciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iXzBqb19VTTdaRWR5cFQ4RUxiV0phN3ciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfMGpmT2xjN1pFZHlwVDhFTGJXSmE3dyIgeT0iLTUzMCIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il8wamZPa3M3WkVkeXBUOEVMYldKYTd3IiByb3V0aW5nPSJUcmVlIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il8wamZPazg3WkVkeXBUOEVMYldKYTd3IiBwb2ludHM9Ils4NDYsIC01MDMsIC0yNzc5LCAxNjY2XSRbODQ2LCAtNzk3LCAtMjc3OSwgMTM3Ml0kWzM2NDgsIC03OTcsIDIzLCAxMzcyXSRbMzY0OCwgLTE2OTMsIDIzLCA0NzZdIi8+DQotICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfWnlvbGdNN2FFZHlwVDhFTGJXSmE3dyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRkFEQzAxMDI4RCIgc291cmNlPSJfSEtOSzlPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfWnllMGdNN2FFZHlwVDhFTGJXSmE3dyI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfWnlvbGc4N2FFZHlwVDhFTGJXSmE3dyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX1p5b2xoYzdhRWR5cFQ4RUxiV0phN3ciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX1p5b2xoczdhRWR5cFQ4RUxiV0phN3ciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfWnlvbGhNN2FFZHlwVDhFTGJXSmE3dyIgeT0iLTUzMCIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9aeW9sZ2M3YUVkeXBUOEVMYldKYTd3IiByb3V0aW5nPSJUcmVlIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9aeW9sZ3M3YUVkeXBUOEVMYldKYTd3IiBwb2ludHM9IlsyNjUsIC01MDMsIC02MTY1LCAyMjIyXSRbMjY1LCAtMTI5NywgLTYxNjUsIDE0MjhdJFs2MTkxLCAtMTI5NywgLTIzOSwgMTQyOF0kWzYxOTEsIC0yMjQ5LCAtMjM5LCA0NzZdIi8+DQotICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfWnlvbGg4N2FFZHlwVDhFTGJXSmE3dyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRkVEODkxMDNBRCIgc291cmNlPSJfSEtEWnZlZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfWnllMGdNN2FFZHlwVDhFTGJXSmE3dyI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfWnlvbGlzN2FFZHlwVDhFTGJXSmE3dyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX1p5b2xqTTdhRWR5cFQ4RUxiV0phN3ciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX1p5b2xqYzdhRWR5cFQ4RUxiV0phN3ciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfWnlvbGk4N2FFZHlwVDhFTGJXSmE3dyIgeT0iLTUzMCIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9aeW9saU03YUVkeXBUOEVMYldKYTd3IiByb3V0aW5nPSJUcmVlIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9aeW9saWM3YUVkeXBUOEVMYldKYTd3IiBwb2ludHM9IlstMjEyLCAtMzE4LCAtMjE3MCwgMjIyMl0kWy0yMTIsIC0xMTEyLCAtMjE3MCwgMTQyOF0kWzE3MTksIC0xMTEyLCAtMjM5LCAxNDI4XSRbMTcxOSwgLTIwNjQsIC0yMzksIDQ3Nl0iLz4NCi0gICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9jRjJsWU03YUVkeXBUOEVMYldKYTd3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI5NEVDNEEwMzA2IiBzb3VyY2U9Il93aFFIOE03WkVkeXBUOEVMYldKYTd3IiB0YXJnZXQ9Il9jRjJsVU03YUVkeXBUOEVMYldKYTd3Ij4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9jRjJsWTg3YUVkeXBUOEVMYldKYTd3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfY0YybFpjN2FFZHlwVDhFTGJXSmE3dyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfY0YybFpzN2FFZHlwVDhFTGJXSmE3dyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9jRjJsWk03YUVkeXBUOEVMYldKYTd3IiB5PSItNTMwIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX2NGMmxZYzdhRWR5cFQ4RUxiV0phN3ciIHJvdXRpbmc9IlRyZWUiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX2NGMmxZczdhRWR5cFQ4RUxiV0phN3ciIHBvaW50cz0iWzAsIC01MDMsIDM0NCwgMjE0M10kWzAsIC0xMzAyLCAzNDQsIDEzNDRdJFsyNiwgLTEzMDIsIDM3MCwgMTM0NF0kWzI2LCAtMjE3MCwgMzcwLCA0NzZdIi8+DQotICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfY0dBV1VNN2FFZHlwVDhFTGJXSmE3dyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyOTRFQzJCMDFDQSIgc291cmNlPSJfY0YybFVNN2FFZHlwVDhFTGJXSmE3dyIgdGFyZ2V0PSJfWnllMGdNN2FFZHlwVDhFTGJXSmE3dyI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfY0dBV1U4N2FFZHlwVDhFTGJXSmE3dyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2NHQVdWYzdhRWR5cFQ4RUxiV0phN3ciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2NHQVdWczdhRWR5cFQ4RUxiV0phN3ciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfY0dBV1ZNN2FFZHlwVDhFTGJXSmE3dyIgeT0iLTUzMCIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9jR0FXVWM3YUVkeXBUOEVMYldKYTd3IiByb3V0aW5nPSJUcmVlIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9jR0FXVXM3YUVkeXBUOEVMYldKYTd3IiBwb2ludHM9IlstMjM5LCAtNTAzLCA2NDU1LCAxOTg0XSRbLTIzOSwgLTEwNTksIDY0NTUsIDE0MjhdJFstNjkzMywgLTEwNTksIC0yMzksIDE0MjhdJFstNjkzMywgLTIwMTEsIC0yMzksIDQ3Nl0iLz4NCi0gICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICA8L2NvbnRlbnRzPg0KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+DQotICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6UGFja2FnZSIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDFGRURCMzgwMTFFIiBuYW1lPSJMaWJyYXJ5Q29uZmlndXJhdGlvbnMiPg0KLSAgICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iX0d2LXN4dWZYRWR1cUhvT0piVVJaUnciIHNvdXJjZT0idW1sMi5kaWFncmFtcyIgcmVmZXJlbmNlcz0iXzNBREM3Qjc0MDIyRDQwRjM2RDdCMDMwNSI+DQotICAgICAgICAgICAgPGNvbnRlbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpEaWFncmFtIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkQ3QjAzMDUiIHR5cGU9IkNsYXNzIiBuYW1lPSJNZXRob2RMaWJyYXJ5QW5kQ29uZmlndXJhdGlvbnMiPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKQTN3T2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxMDQiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpBM3ctZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hKQTN4T2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKQTN4ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKQTN4dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKQTN4LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpBM3lPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEpBM3llZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpBM3l1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEpBM3ktZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpBM3pPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEpBM3plZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpBM3p1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKQTN6LWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEpBM3dlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEpBM3d1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTA4MyIgeT0iMzgxMCIgd2lkdGg9IjM3MjUiIGhlaWdodD0iMjMzNiIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISkEzME9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMTNGIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKQTMwLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9ISkEzMU9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISkEzMWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISkEzMXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISkEzMS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKQTMyT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKQTMyZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKQTMydWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKQTMyLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKQTMzT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKQTMzZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKQTMzdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISkEzMy1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hKQTMwZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hKQTMwdWZYRWR1cUhvT0piVVJaUnciIHg9IjE0MzkiIHk9IjkxMjciLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpBNEEtZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVEMDNCNSI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISkE0QnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEpBNEItZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpBNENPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpBNENlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpBNEN1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISkE0Qy1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISkE0RE9mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISkE0RGVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISkE0RHVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISkE0RC1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISkE0RU9mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISkE0RWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEpBNEV1ZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9ISkE0Qk9mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISkE0QmVmWEVkdXFIb09KYlVSWlJ3IiB4PSI1MDA1IiB5PSI5OSIgd2lkdGg9IjUxMzAiIGhlaWdodD0iMjIyNiIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISkE0TnVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFRjA5NTgwMTUyIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKQTRPZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9ISkE0T3VmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMzU4OSIgaGVpZ2h0PSIxMDMyIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISkE0Ty1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISkE0UE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISkE0UGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKQTRQdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKQTRQLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKQTRRT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKQTRRZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKQTRRdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKQTRRLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKQTRST2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISkE0UmVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hKQTROLWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hKQTRPT2ZYRWR1cUhvT0piVVJaUnciIHg9IjE1ODI1IiB5PSI3NDU5Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKQTRSdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyNDQiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpBNFNlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hKQTRTdWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKQTRTLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKQTRUT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKQTRUZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpBNFR1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEpBNFQtZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpBNFVPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEpBNFVlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpBNFV1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEpBNFUtZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpBNFZPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKQTRWZWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEpBNFItZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEpBNFNPZlhFZHVxSG9PSmJVUlpSdyIgeD0iOTQ3NCIgeT0iMTA5MzAiIHdpZHRoPSI0MTIzIiBoZWlnaHQ9IjExMDkiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpBNFZ1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzU3MDBFRiI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISkE0V2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEpBNFd1ZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpBNFctZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpBNFhPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpBNFhlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISkE0WHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISkE0WC1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISktCc09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISktCc2VmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISktCc3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISktCcy1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISktCdE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEpLQnRlZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9ISkE0Vi1mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISkE0V09mWEVkdXFIb09KYlVSWlJ3IiB4PSIxMDMzNiIgeT0iMzgxMCIgd2lkdGg9IjQ0NjYiIGhlaWdodD0iMjMzNiIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9tSjBqY003QUVkeXBUOEVMYldKYTd3IiBlbGVtZW50PSJfbUdZMDhNN0FFZHlwVDhFTGJXSmE3dyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9tSjl0WU03QUVkeXBUOEVMYldKYTd3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfbUo5dFljN0FFZHlwVDhFTGJXSmE3dyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfbUo5dFlzN0FFZHlwVDhFTGJXSmE3dyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfbUo5dFk4N0FFZHlwVDhFTGJXSmE3dyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfbUo5dFpNN0FFZHlwVDhFTGJXSmE3dyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9tSjl0WmM3QUVkeXBUOEVMYldKYTd3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9tSjl0WnM3QUVkeXBUOEVMYldKYTd3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9tSjl0Wjg3QUVkeXBUOEVMYldKYTd3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9tSjl0YU03QUVkeXBUOEVMYldKYTd3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9tSjl0YWM3QUVkeXBUOEVMYldKYTd3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9tSjl0YXM3QUVkeXBUOEVMYldKYTd3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9tSjl0YTg3QUVkeXBUOEVMYldKYTd3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfbUo5dGJNN0FFZHlwVDhFTGJXSmE3dyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9tSjBqY2M3QUVkeXBUOEVMYldKYTd3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9tSjBqY3M3QUVkeXBUOEVMYldKYTd3IiB4PSI5MzkxIiB5PSIxMjkxMCIgaGVpZ2h0PSI5NzkiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfazVpZDhNN1pFZHlwVDhFTGJXSmE3dyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI2QyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9rNWlkODg3WkVkeXBUOEVMYldKYTd3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfazVpZDlNN1pFZHlwVDhFTGJXSmE3dyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfazVpZDljN1pFZHlwVDhFTGJXSmE3dyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfazVpZDlzN1pFZHlwVDhFTGJXSmE3dyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfazVpZDk4N1pFZHlwVDhFTGJXSmE3dyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9rNWlkLU03WkVkeXBUOEVMYldKYTd3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9rNWlkLWM3WkVkeXBUOEVMYldKYTd3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9rNWlkLXM3WkVkeXBUOEVMYldKYTd3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9rNWlkLTg3WkVkeXBUOEVMYldKYTd3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9rNWlkX003WkVkeXBUOEVMYldKYTd3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9rNWlkX2M3WkVkeXBUOEVMYldKYTd3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9rNWlkX3M3WkVkeXBUOEVMYldKYTd3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfazVpZF84N1pFZHlwVDhFTGJXSmE3dyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9rNWlkOGM3WkVkeXBUOEVMYldKYTd3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93UGFyZW50PSJOYW1lIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9rNWlkOHM3WkVkeXBUOEVMYldKYTd3IiB4PSI2Mzc2IiB5PSIzMDk1Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MRGlhZ3JhbVN0eWxlIiB4bWk6aWQ9Il9Hdi1zeU9mWEVkdXFIb09KYlVSWlJ3IiBkZXNjcmlwdGlvbj0iVGhlIExpYnJhcnkgQ29uZmlndXJhdGlvbnMgcGFja2FnZSBhZGRzIGFkZGl0aW9uYWwgY2FwYWJpbGl0aWVzIGZvciBwYWNrYWdpbmcgTWV0aG9kIFBsdWdpbnMgYW5kIHNjYWxpbmcgbWV0aG9kIGFuZCBwcm9jZXNzIGF1dGhvcmluZyB3b3JrLiAgSXQgZGVmaW5lcyB0aGUga2V5IGNvbmNlcHQgb2YgTGlicmFyeSB3aGljaCBjb21wcmlzZXMgb2YgTWV0aG9kIFBsdWdpbnMgYXMgd2VsbCBhcyBNZXRob2QgQ29uZmlndXJhdGlvbnMuICBBIExpYnJhcnkgcmVwcmVzZW50cyB0aGUgb3ZlcmFsbCBwaHlzaWNhbCBjb250YWluZXIgZm9yIGFsbCBNZXRob2QgRWxlbWVudHMuICBMaWJyYXJpZXMgcmVwcmVzZW50IGEgc2VwYXJhdGUgTWV0aG9kICd1bml2ZXJzZScsIGkuZS4gYSBNZXRob2QgTGlicmFyeSBjYW5ub3QgcmVmZXJlbmNlIGVsZW1lbnRzIGZyb20gYW5vdGhlciBNZXRob2QgTGlicmFyeS4gIEEgQ29uZmlndXJhdGlvbiBpcyBhIHN1YnNldCBvZiBQbHVnaW5zIGFuZCBNZXRob2QgUGFja2FnZXMsIGkuZS4gc2VsZWN0aW9ucyBvZiBNZXRob2QgUGx1Z2lucyB3aXRoIGEgc2VsZWN0ZWQgc3Vic2V0IG9mIE1ldGhvZCBQYWNrYWdlcy4gIFRoZXkgYXJlIHVzZWQgdG8gZGVmaW5lIHdvcmtpbmcgc2V0cyBmb3IgcHJvY2VzcyBhdXRob3JpbmcgcHJvdmlkaW5nIGEgcHJvY2VzcyBlbmdpbmVlciBvbmx5IHdpdGggbGlzdHMgb2YgZWxlbWVudHMgdG8gYmUgdXNlZCBmb3IgY3JlYXRpbmcgcHJvY2VzcyB3aXRoaW4gc3VjaCBhIENvbmZpZ3VyYXRpb24uICBDb25maWd1cmF0aW9ucyBhbHNvIGRlZmluZSB0aGUgc3BhY2Ugb2YgdmFyaWFiaWxpdHkgaW50ZXJwcmV0YXRpb24gdG8gYXZvaWQgY29uZmxpY3RzIGFtb25nc3QgJ2NvbXBldGluZycgY29udGVudCAoZS5nLiBjb250ZW50IHRoYXQgcmVwbGFjZXMgdGhlIHNhbWUgZWxlbWVudHMpIGFzIHdlbGwgYXMgZGVmaW5lIHNldHMgb2YgTWV0aG9kIENvbnRlbnQgYW5kIFByb2Nlc3NlcyBmb3IgZXhwb3J0IGFuZCBkaXN0cmlidXRpb24uIi8+DQotICAgICAgICAgICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEpBMzRPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDJENSIgc291cmNlPSJfSEpBMzBPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEpBM3dPZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISkEzNC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISkEzNWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKQTM1dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEpBMzVPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpBMzUtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDJEOCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKQTM2ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISkEzNk9mWEVkdXFIb09KYlVSWlJ3IiB4PSI4NCIgeT0iLTM5OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpBMzZ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyRDgiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISkEzN09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hKQTM2LWZYRWR1cUhvT0piVVJaUnciIHg9IjE2MCIgeT0iMTYyNiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpBMzdlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMkQ2Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpBMzctZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEpBMzd1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTI3OCIgeT0iLTI3OSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpBMzhPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyRDYiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISkEzOHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEpBMzhlZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTQ2IiB5PSIzNTYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKQTM4LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyRDgiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISkEzOWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEpBMzl1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISkEzOU9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISkEzOS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyRDYiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISkEzLWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEpBMy11ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISkEzLU9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISkEzLS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDJEOCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKQTNfZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISkEzX3VmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hKQTNfT2ZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKQTNfLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyRDYiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISkE0QWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISkE0QXVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hKQTRBT2ZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hKQTM0ZWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hKQTM0dWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzU5LCAtNTc1LCA1OSwgNDE0OF0kWzU5LCAtMzU2NCwgNTksIDExNTldIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hKQTRFLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAyODIiIHNvdXJjZT0iX0hKQTN3T2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hKQTRBLWZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpBNEZ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpBNEdPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISkE0R2VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hKQTRGLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKQTRHdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAyODUiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISkE0SE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEpBNEctZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTIwNCIgeT0iLTE2OSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpBNEhlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAyODUiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISkE0SC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hKQTRIdWZYRWR1cUhvT0piVVJaUnciIHg9Ii0xNzAiIHk9IjEzODAiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKQTRJT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAyODMiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISkE0SXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISkE0SWVmWEVkdXFIb09KYlVSWlJ3IiB5PSIzOTYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKQTRJLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMjgzIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpBNEplZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hKQTRKT2ZYRWR1cUhvT0piVVJaUnciIHg9IjEyNyIgeT0iLTM0NyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpBNEp1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDI4NSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKQTRLT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISkE0S2VmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hKQTRKLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKQTRLdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDI4MyI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKQTRMT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISkE0TGVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hKQTRLLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKQTRMdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMjg1Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpBNE1PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKQTRNZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEpBNEwtZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpBNE11ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDI4MyI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKQTROT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKQTROZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEpBNE0tZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEpBNEZPZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEpBNEZlZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbOTMsIC0xMTY4LCAtNDQ3OCwgMjMzNl0kWzkzLCAtMzM3OCwgLTQ0NzgsIDEyN10kWzIwMDYsIC0zMzc4LCAtMjU2NSwgMTI3XSIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9ISktCdHVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMjE1IiBzb3VyY2U9Il9ISkEzd09mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9ISkE0VnVmWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKS0J1ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKS0J1LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpLQnZPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISktCdXVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISktCdmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMjFEIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpLQnYtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hKS0J2dWZYRWR1cUhvT0piVVJaUnciIHg9Ii0xODUiIHk9Ii0yNTQiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKS0J3T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMjFEIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpLQnd1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISktCd2VmWEVkdXFIb09KYlVSWlJ3IiB4PSIxMzkwIiB5PSIyMzciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKS0J3LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDIxNiI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKS0J4ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hKS0J4T2ZYRWR1cUhvT0piVVJaUnciIHg9IjI5NiIgeT0iLTExOCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpLQnh1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAyMTYiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISktCeU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEpLQngtZlhFZHVxSG9PSmJVUlpSdyIgeD0iMjk2IiB5PSIzNTYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKS0J5ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAyMUQiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISktCeS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEpLQnpPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISktCeXVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISktCemVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAyMTYiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISktCei1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEpLQjBPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISktCenVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISktCMGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDIxRCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKS0IwLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISktCMU9mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hKS0IwdWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKS0IxZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAyMTYiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISktCMS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISktCMk9mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hKS0IxdWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hKS0J0LWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hKS0J1T2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzE4NjIsIDYwMSwgLTc4NDAsIDYwMV0kWzc4NDAsIDYwMSwgLTE4NjIsIDYwMV0iLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEpLQjJlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDI0NSIgc291cmNlPSJfSEpBMzBPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEpBNFZ1ZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISktCM09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISktCM3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKS0IzLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEpLQjNlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpLQjRPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDI0OCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKS0I0dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISktCNGVmWEVkdXFIb09KYlVSWlJ3IiB4PSItODQwIiB5PSIyNzkiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKS0I0LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMjQ4Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpLQjVlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISktCNU9mWEVkdXFIb09KYlVSWlJ3IiB4PSI4NTMiIHk9Ii0yMDMiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKS0I1dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDI0NiI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKS0I2T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hKS0I1LWZYRWR1cUhvT0piVVJaUnciIHg9IjExNjEiIHk9Ii0xNjAiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKS0I2ZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMjQ2Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpLQjYtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hKS0I2dWZYRWR1cUhvT0piVVJaUnciIHg9IjUwMSIgeT0iMzU2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISktCN09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMjQ4Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpLQjd1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKS0I3LWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEpLQjdlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpLQjhPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMjQ2Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpLQjh1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKS0I4LWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEpLQjhlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpLQjlPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAyNDgiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISktCOXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEpLQjktZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISktCOWVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISktCLU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMjQ2Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpLQi11ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEpLQi0tZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISktCLWVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9ISktCMnVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9ISktCMi1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlsxNTA3LCAtMTUyLCAtODE5NSwgNDU3Ml0kWzgwNTEsIC0xNTIsIC0xNjUxLCA0NTcyXSRbODA1MSwgLTM1NTYsIC0xNjUxLCAxMTY4XSIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9ISktCX09mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGODdCRjYwMTI2IiBzb3VyY2U9Il9ISkE0QS1mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9ISkE0VnVmWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKS0JfLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKS0NBZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpLQ0F1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISktDQU9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISktDQS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjg3QkY3MDA5MyI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKS0NCZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISktDQk9mWEVkdXFIb09KYlVSWlJ3IiB5PSIzOTYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKS0NCdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjg3QkY3MDA5MyI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKS0NDT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEpLQ0ItZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTM5NyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpLQ0NlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGODdCRjcwMDkxIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpLQ0MtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEpLQ0N1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTU3IiB5PSIxNjkiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKS0NET2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEY4N0JGNzAwOTEiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISktDRHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEpLQ0RlZlhFZHVxSG9PSmJVUlpSdyIgeD0iOTIiIHk9Ii0yMDc2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISktDRC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGODdCRjcwMDkzIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpLQ0VlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKS0NFdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEpLQ0VPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpLQ0UtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGODdCRjcwMDkxIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpLQ0ZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKS0NGdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEpLQ0ZPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpLQ0YtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEY4N0JGNzAwOTMiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISktDR2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEpLQ0d1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISktDR09mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISktDRy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGODdCRjcwMDkxIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpLQ0hlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEpLQ0h1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISktDSE9mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9ISktCX2VmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9ISktCX3VmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlsyNTY1LCAxMDEsIC0yNTY1LCAtMzQwM10kWzUwNDYsIDEwMSwgLTg0LCAtMzQwM10kWzUwNDYsIDIzMzYsIC04NCwgLTExNjhdIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hKS0NILWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUVGMDk5ODAxMTAiIHNvdXJjZT0iX0hKQTRWdWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hKQTROdWZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpLQ0l1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpLQ0pPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISktDSmVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hKS0NJLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKS0NKdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUVGMDk5ODAxMTIiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISktDS09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEpLQ0otZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTIwOCIgeT0iMjI4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISktDS2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRUYwOTk4MDExMiI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKS0NLLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEpLQ0t1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTIwOCIgeT0iLTEzNTUiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKS0NMT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRUYwOTk4MDExMSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKS0NMdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hKS0NMZWZYRWR1cUhvT0piVVJaUnciIHg9IjQyMCIgeT0iMjgwIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISktDTC1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRUYwOTk4MDExMSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKS0NNZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISktDTU9mWEVkdXFIb09KYlVSWlJ3IiB4PSIyNjgiIHk9IjM1NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpLQ011ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRUYwOTk4MDExMiI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKS0NOT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISktDTmVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hKS0NNLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKS0NOdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRUYwOTk4MDExMSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKS0NPT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISktDT2VmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hKS0NOLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKS0NPdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFRjA5OTgwMTEyIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpLQ1BPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKS0NQZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEpLQ08tZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpLQ1B1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRUYwOTk4MDExMSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKS0NRT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKS0NRZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEpLQ1AtZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEpLQ0lPZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEpLQ0llZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMTI0NCwgMTE2NCwgLTMwOTUsIC0xNjE0XSRbMTI0NCwgMjY0NiwgLTMwOTUsIC0xMzJdJFszNDEzLCAyNjQ2LCAtOTI2LCAtMTMyXSIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9ISktDUXVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFRjA5OUYwMTdFIiBzb3VyY2U9Il9ISkE0VnVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9ISkE0TnVmWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKS0NSZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKS0NSLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpLQ1NPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISktDUnVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISktDU2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFRjA5OUYwMTgwIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpLQ1MtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hKS0NTdWZYRWR1cUhvT0piVVJaUnciIHg9Ii0yNjUiIHk9IjI2MiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpLQ1RPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUVGMDk5RjAxODAiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISktDVHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hKS0NUZWZYRWR1cUhvT0piVVJaUnciIHg9IjM5NSIgeT0iLTIyOSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpLQ1QtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFRjA5OUYwMTdGIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpLQ1VlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEpLQ1VPZlhFZHVxSG9PSmJVUlpSdyIgeD0iNjIxIiB5PSIxNTIiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKS0NVdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFRjA5OUYwMTdGIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpLQ1ZPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hKS0NVLWZYRWR1cUhvT0piVVJaUnciIHg9IjI2NSIgeT0iMzQ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISktDVmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFRjA5OUYwMTgwIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpLQ1YtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKS0NXT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEpLQ1Z1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpLQ1dlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFRjA5OUYwMTdGIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpLQ1ctZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKS0NYT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEpLQ1d1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpLQ1hlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUVGMDk5RjAxODAiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISktDWC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEpLQ1lPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISktDWHVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISktDWWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFRjA5OUYwMTdGIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpLQ1ktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEpLQ1pPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISktDWXVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9ISktDUS1mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9ISktDUk9mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlsxODYyLCAzNjQsIC0zMjY4LCAtMjYzM10kWzUwNzEsIDM2NCwgLTU5LCAtMjYzM10kWzUwNzEsIDI0ODAsIC01OSwgLTUxNl0iLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEpUeTBPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMEQzRjAwMDM5NiIgc291cmNlPSJfSEpBNFJ1ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEpBNFZ1ZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISlR5MC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISlR5MWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKVHkxdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEpUeTFPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpUeTEtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMEQzRjAwMDM5OCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKVHkyZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISlR5Mk9mWEVkdXFIb09KYlVSWlJ3IiB4PSIxNjMiIHk9IjE3MCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpUeTJ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjBEM0YwMDAzOTgiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISlR5M09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hKVHkyLWZYRWR1cUhvT0piVVJaUnciIHg9Ii0yNjkiIHk9IjEyNTQiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKVHkzZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMEQzRjAwMDM5NyI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKVHkzLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hKVHkzdWZYRWR1cUhvT0piVVJaUnciIHg9IjM1NyIgeT0iLTE0MyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpUeTRPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjBEM0YwMDAzOTciPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISlR5NHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEpUeTRlZlhFZHVxSG9PSmJVUlpSdyIgeD0iMjMwIiB5PSItMzQ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISlR5NC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIwRDNGMDAwMzk4Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpUeTVlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKVHk1dWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEpUeTVPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpUeTUtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIwRDNGMDAwMzk3Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpUeTZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKVHk2dWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEpUeTZPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpUeTYtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjBEM0YwMDAzOTgiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISlR5N2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEpUeTd1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISlR5N09mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISlR5Ny1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIwRDNGMDAwMzk3Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpUeThlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEpUeTh1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISlR5OE9mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9ISlR5MGVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9ISlR5MHVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9Ils0MjMsIC01NTgsIC02OTQsIDU5NDNdJFs0MjMsIC01MzQyLCAtNjk0LCAxMTU5XSIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9ISlR5OC1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxMjkxQ0QwMThCIiBzb3VyY2U9Il9ISkE0VnVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9ISkE0UnVmWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKVHk5dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKVHktT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpUeS1lZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISlR5OS1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISlR5LXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxMjkxRDAwMDU5Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpUeV9PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hKVHktLWZYRWR1cUhvT0piVVJaUnciIHg9Ii0zNTUiIHk9IjE0NCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpUeV9lZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxMjkxRDAwMDU5Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpUeV8tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISlR5X3VmWEVkdXFIb09KYlVSWlJ3IiB5PSItMzk3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISlR6QU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjEyOTFEMDAwNDUiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISlR6QXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISlR6QWVmWEVkdXFIb09KYlVSWlJ3IiB4PSItMTQ0IiB5PSIxOTUiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKVHpBLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjEyOTFEMDAwNDUiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISlR6QmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEpUekJPZlhFZHVxSG9PSmJVUlpSdyIgeD0iMjIwIiB5PSI5OTkiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKVHpCdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjEyOTFEMDAwNTkiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISlR6Q09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEpUekNlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISlR6Qi1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISlR6Q3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjEyOTFEMDAwNDUiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISlR6RE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEpUekRlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISlR6Qy1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISlR6RHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMTI5MUQwMDA1OSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKVHpFT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISlR6RWVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hKVHpELWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKVHpFdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjEyOTFEMDAwNDUiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISlR6Rk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISlR6RmVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hKVHpFLWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hKVHk5T2ZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hKVHk5ZWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0xMTQzLCAxMTU5LCAtMjUsIC01MzQyXSRbLTExNDMsIDU5NDMsIC0yNSwgLTU1OF0iLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEpUekZ1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQ1NThFRjdDMDM1MyIgc291cmNlPSJfSEpBNFZ1ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEpBNFJ1ZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISlR6R2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISlR6Ry1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKVHpIT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEpUekd1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpUekhlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQ1NThFRjdFMDA1NiI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKVHpILWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISlR6SHVmWEVkdXFIb09KYlVSWlJ3IiB4PSItOTI0IiB5PSItMjAzIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISlR6SU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0NTU4RUY3RTAwNTYiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISlR6SXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hKVHpJZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0zOTciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKVHpJLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQ1NThFRjdFMDA0MiI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKVHpKZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hKVHpKT2ZYRWR1cUhvT0piVVJaUnciIHg9Ijc5NiIgeT0iOTMiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKVHpKdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0NTU4RUY3RTAwNDIiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISlR6S09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEpUekotZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTA5MCIgeT0iLTU4OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpUektlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQ1NThFRjdFMDA1NiI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKVHpLLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISlR6TE9mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hKVHpLdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKVHpMZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQ1NThFRjdFMDA0MiI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKVHpMLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISlR6TU9mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hKVHpMdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKVHpNZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDU1OEVGN0UwMDU2Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpUek0tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKVHpOT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEpUek11ZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpUek5lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQ1NThFRjdFMDA0MiI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKVHpOLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKVHpPT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEpUek51ZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEpUekYtZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEpUekdPZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbNDIsIDExNjgsIDExNTksIC01MzM0XSRbNDIsIDUwODAsIDExNTksIC0xNDIyXSRbMjIxOCwgNTA4MCwgMzMzNSwgLTE0MjJdJFsyMjE4LCA2MTgwLCAzMzM1LCAtMzIxXSRbOTM5LCA2MTgwLCAyMDU3LCAtMzIxXSIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9ISlR6T2VmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDU1OTAwNkEwMzE3IiBzb3VyY2U9Il9ISkE0VnVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9ISkE0UnVmWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKVHpQT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKVHpQdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpUelAtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISlR6UGVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISlR6UU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQ1NTkwMDZCMDI3QSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKVHpRdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISlR6UWVmWEVkdXFIb09KYlVSWlJ3IiB5PSIzOTYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKVHpRLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQ1NTkwMDZCMDI3QSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKVHpSZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEpUelJPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTM5NyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpUelJ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDU1OTAwNkIwMjcwIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpUelNPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEpUelItZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTI2MSIgeT0iMTQ0Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISlR6U2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDU1OTAwNkIwMjcwIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpUelMtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hKVHpTdWZYRWR1cUhvT0piVVJaUnciIHg9IjQ3NCIgeT0iMjY1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpUelRPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQ1NTkwMDZCMDI3QSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKVHpUdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISlR6VC1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hKVHpUZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKVHpVT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQ1NTkwMDZCMDI3MCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKVHpVdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISlR6VS1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hKVHpVZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKVHpWT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDU1OTAwNkIwMjdBIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpUelZ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKVHpWLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEpUelZlZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpUeldPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQ1NTkwMDZCMDI3MCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKVHpXdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKVHpXLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEpUeldlZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEpUek91ZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEpUek8tZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbNzExLCAxMTY4LCAxODI4LCAtNTMzNF0kWzcxMSwgNDMzNCwgMTgyOCwgLTIxNjddJFszODUyLCA0MzM0LCA0OTY5LCAtMjE2N10kWzM4NTIsIDY3MzksIDQ5NjksIDIzN10kWzkzOSwgNjczOSwgMjA1NywgMjM3XSIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9veXl3ME03QUVkeXBUOEVMYldKYTd3IiBlbGVtZW50PSJfb3lESjhNN0FFZHlwVDhFTGJXSmE3dyIgc291cmNlPSJfbUowamNNN0FFZHlwVDhFTGJXSmE3dyIgdGFyZ2V0PSJfSEpBNFJ1ZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9veXl3MDg3QUVkeXBUOEVMYldKYTd3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9veXl3MWM3QUVkeXBUOEVMYldKYTd3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX295eXcxczdBRWR5cFQ4RUxiV0phN3ciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9veXl3MU03QUVkeXBUOEVMYldKYTd3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9veXl3MGM3QUVkeXBUOEVMYldKYTd3IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX295eXcwczdBRWR5cFQ4RUxiV0phN3ciIHBvaW50cz0iWzUsIC0xMywgLTM1LCA3NF0kWy0zOCwgLTgxLCAtNzgsIDZdIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX3V5ekxjTTdBRWR5cFQ4RUxiV0phN3ciIGVsZW1lbnQ9Il91eG00b003QUVkeXBUOEVMYldKYTd3IiBzb3VyY2U9Il9tSjBqY003QUVkeXBUOEVMYldKYTd3IiB0YXJnZXQ9Il9ISkE0VnVmWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3V5ekxjODdBRWR5cFQ4RUxiV0phN3ciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3V5ekxkYzdBRWR5cFQ4RUxiV0phN3ciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfdXl6TGRzN0FFZHlwVDhFTGJXSmE3dyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX3V5ekxkTTdBRWR5cFQ4RUxiV0phN3ciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3V5ekxkODdBRWR5cFQ4RUxiV0phN3ciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il91eHdwbzg3QUVkeXBUOEVMYldKYTd3Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfdXl6TGVjN0FFZHlwVDhFTGJXSmE3dyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX3V5ekxlTTdBRWR5cFQ4RUxiV0phN3ciIHg9Ii0yMTE3IiB5PSIzMTYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3V5ODhjTTdBRWR5cFQ4RUxiV0phN3ciIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfdXh3cG84N0FFZHlwVDhFTGJXSmE3dyI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3V5ODhjczdBRWR5cFQ4RUxiV0phN3ciIHR5cGU9IlRvUm9sZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfdXk4OGNjN0FFZHlwVDhFTGJXSmE3dyIgeT0iLTM5NyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfdXk4OGM4N0FFZHlwVDhFTGJXSmE3dyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfdXh3cG9NN0FFZHlwVDhFTGJXSmE3dyI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3V5ODhkYzdBRWR5cFQ4RUxiV0phN3ciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX3V5ODhkTTdBRWR5cFQ4RUxiV0phN3ciIHg9IjIwMTMiIHk9Ii0xODciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3V5ODhkczdBRWR5cFQ4RUxiV0phN3ciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il91eHdwb003QUVkeXBUOEVMYldKYTd3Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfdXk4OGVNN0FFZHlwVDhFTGJXSmE3dyIgdHlwZT0iRnJvbVJvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX3V5ODhkODdBRWR5cFQ4RUxiV0phN3ciIHg9IjEwMDkiIHk9IjI2MyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfdXk4OGVjN0FFZHlwVDhFTGJXSmE3dyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iX3V4d3BvODdBRWR5cFQ4RUxiV0phN3ciPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il91eTg4ZTg3QUVkeXBUOEVMYldKYTd3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfdXk4OGZNN0FFZHlwVDhFTGJXSmE3dyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il91eTg4ZXM3QUVkeXBUOEVMYldKYTd3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il91eTg4ZmM3QUVkeXBUOEVMYldKYTd3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il91eHdwb003QUVkeXBUOEVMYldKYTd3Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfdXk4OGY4N0FFZHlwVDhFTGJXSmE3dyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX3V5ODhnTTdBRWR5cFQ4RUxiV0phN3ciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfdXk4OGZzN0FFZHlwVDhFTGJXSmE3dyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfdXk4OGdjN0FFZHlwVDhFTGJXSmE3dyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il91eHdwbzg3QUVkeXBUOEVMYldKYTd3Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfdXk4OGc4N0FFZHlwVDhFTGJXSmE3dyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX3V5ODhoTTdBRWR5cFQ4RUxiV0phN3ciLz4NCi0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfdXk4OGdzN0FFZHlwVDhFTGJXSmE3dyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfdXk4OGhjN0FFZHlwVDhFTGJXSmE3dyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iX3V4d3BvTTdBRWR5cFQ4RUxiV0phN3ciPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il91eTg4aDg3QUVkeXBUOEVMYldKYTd3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il91eTg4aU03QUVkeXBUOEVMYldKYTd3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX3V5ODhoczdBRWR5cFQ4RUxiV0phN3ciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX3V5ekxjYzdBRWR5cFQ4RUxiV0phN3ciIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfdXl6TGNzN0FFZHlwVDhFTGJXSmE3dyIgcG9pbnRzPSJbMjE2OSwgLTI2LCAtOTI2LCA5MTI4XSRbNzE3MCwgLTI2LCA0MDc1LCA5MTI4XSRbNzE3MCwgLTkyMzQsIDQwNzUsIC04MF0kWzMyMjgsIC05MjM0LCAxMzMsIC04MF0iLz4NCi0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX2pibElvTTdORWR5cFQ4RUxiV0phN3ciIGlkPSIoMC45Njc1MzI0NiwwLjE4MTA3ODc2KSIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9xbWRrZ2M3WkVkeXBUOEVMYldKYTd3IiBlbGVtZW50PSJfcW1ka2dNN1pFZHlwVDhFTGJXSmE3dyIgc291cmNlPSJfSEpBNFZ1ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfazVpZDhNN1pFZHlwVDhFTGJXSmE3dyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9xbWRraE03WkVkeXBUOEVMYldKYTd3IiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9xbWRraHM3WkVkeXBUOEVMYldKYTd3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3FtblZnTTdaRWR5cFQ4RUxiV0phN3ciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9xbWRraGM3WkVkeXBUOEVMYldKYTd3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9xbWRrZ3M3WkVkeXBUOEVMYldKYTd3IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX3FtZGtnODdaRWR5cFQ4RUxiV0phN3ciIHBvaW50cz0iWy04NSwgLTMwLCA4OCwgMjNdJFstMTExLCAtNTgsIDYyLCAtNV0iLz4NCi0gICAgICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgICAgPC9jb250ZW50cz4NCi0gICAgICAgICAgICA8Y29udGVudHMgeG1pOnR5cGU9Im5vdGF0aW9uOkRpYWdyYW0iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxNzZBM0VDMDAyNyIgdHlwZT0iQ2xhc3MiIG5hbWU9IlByb2Nlc3NGYW1pbHkiPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKZGpzT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1NzAwRUYiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpkanMtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hKZGp0T2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKZGp0ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKZGp0dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKZGp0LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpkanVPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEpkanVlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpkanV1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEpkanUtZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpkanZPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEpkanZlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpkanZ1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKZGp2LWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEpkanNlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEpkanN1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iNjY4IiB5PSI5MTQiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpkandPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDA3NyI+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISmRqdy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEpkanhPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpkanhlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpkanh1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpkangtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISmRqeU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISmRqeWVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISmRqeXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISmRqeS1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISmRqek9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISmRqemVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISmRqenVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEpkanotZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9ISmRqd2VmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISmRqd3VmWEVkdXFIb09KYlVSWlJ3IiB4PSI5MTEwIiB5PSIzNzc2IiB3aWR0aD0iMzI4MiIgaGVpZ2h0PSIxMDgzIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKZGowT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RDAzQUIiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpkajAtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hKZGoxT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKZGoxZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKZGoxdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKZGoxLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpkajJPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEpkajJlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpkajJ1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEpkajItZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpkajNPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEpkajNlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpkajN1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKZGozLWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEpkajBlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEpkajB1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTAyNCIgeT0iMzg2MCIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTERpYWdyYW1TdHlsZSIgeG1pOmlkPSJfR3dIMm9lZlhFZHVxSG9PSmJVUlpSdyIgZGVzY3JpcHRpb249IlRoaXMgZGlhZ3JhbSBzaG93cyBob3cgcHJvY2Vzc2VzIGFyZSBwYWNrYWdlZCBpbiBtZXRob2RsaWJyYXJ5IGFuZCByZWxhdGVkIHRvIGNvbmZpZ3VyYXRpb25zLiIvPg0KLSAgICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hKZGo0T2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAyNjQiIHNvdXJjZT0iX0hKZGp3T2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hKZGowT2ZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpkajQtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpkajVlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISmRqNXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEpkajVPZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTY5OSIgeT0iLTMzMSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpkajUtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDI2NyI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKZGo2ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISmRqNk9mWEVkdXFIb09KYlVSWlJ3IiB4PSItNTUiIHk9IjIwNSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpkajZ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAyNjciPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISmRqN09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hKZGo2LWZYRWR1cUhvT0piVVJaUnciIHg9IjEwNDkiIHk9Ii0yMjkiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKZGo3ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDI2NSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKZGo3LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hKZGo3dWZYRWR1cUhvT0piVVJaUnciIHg9IjMzOSIgeT0iLTI4OCIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpkajhPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDI2NSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKZGo4dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISmRqOGVmWEVkdXFIb09KYlVSWlJ3IiB4PSItNjY5IiB5PSIyMzAiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKZGo4LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAyNjciPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISmRqOWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEpkajl1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISmRqOU9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISmRqOS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAyNjUiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISmRqLWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEpkai11ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISmRqLU9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISmRqLS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDI2NyI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKZGpfZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISmRqX3VmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hKZGpfT2ZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKZGpfLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAyNjUiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISmRrQWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISmRrQXVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hKZGtBT2ZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hKZGo0ZWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hKZGo0dWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0xNDU2LCAzMywgNjY3MSwgMzNdJFstNjcxNCwgMzMsIDE0MTMsIDMzXSIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9ISmRrQS1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMjYzIiBzb3VyY2U9Il9ISmRqME9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9ISmRqc09mWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKZGtCdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKZGtDT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpka0NlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISmRrQi1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9ISmRrQk9mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9ISmRrQmVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlswLCAtNDU3LCAtNTAsIDI0ODldJFswLCAtMjQ4OSwgLTUwLCA0NTddIi8+DQotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9ISmRrQ3VmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hKZGtDLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICA8L2NvbnRlbnRzPg0KLSAgICAgICAgICA8L2VBbm5vdGF0aW9ucz4NCi0gICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HdllQeS1mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDFGRURCMzgwMTFFIj4NCi0gICAgICAgICAgICA8Ym9keT4wMjwvYm9keT4NCi0gICAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgICAgIDxwYWNrYWdlTWVyZ2UgeG1pOmlkPSJfQV9fX29PeE1FZHVPTnJNUmdtejQ4QSIgbWVyZ2VkUGFja2FnZT0iXzNBREM3Qjc0MDIyRDQxRkVEREI2MDMwNiIvPg0KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzU3MDBFRiIgbmFtZT0iTWV0aG9kQ29uZmlndXJhdGlvbiI+DQotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HdllQM09mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNTcwMEVGIj4NCi0gICAgICAgICAgICAgIDxib2R5PkEgTWV0aG9kIENvbmZpZ3VyYXRpb24gaXMgYSBjb2xsZWN0aW9uIG9mIHNlbGVjdGVkIE1ldGhvZCBNb2RlbHMgYW5kIE1ldGhvZFBhY2thZ2VzLiBBIGNvbmZpZ3VyYXRpb24gY2FuIGJlIGV4cG9ydGVkIGludG8gaXRzIG93biBzdGFuZGFsb25lIGxpYnJhcnkgd2hlbiBpdCBpbmNsdWRlcyB0aGUgZnVsbCB0cmFuc2l0aXZlIGNsb3N1cmUgb2YgYWxsIGVsZW1lbnRzIGFsbCBvdGhlciBlbGVtZW50cyBkZXBlbmQgb24uPC9ib2R5Pg0KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0NDU2NUJCMTAxNUYiIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0MUZFRDg4MTAxQjUiLz4NCi0gICAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfcW1ka2dNN1pFZHlwVDhFTGJXSmE3dyIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI2QyIvPg0KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAyMUQiIG5hbWU9Im1ldGhvZFBsdWdpblNlbGVjdGlvbiIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMTA0IiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDIxNSI+DQotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HdmlBMU9mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3ZpQTAtZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IjEiLz4NCi0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAyNDgiIG5hbWU9Im1ldGhvZFBhY2thZ2VTZWxlY3Rpb24iIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDEzRiIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAyNDUiPg0KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3ZyeHh1ZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4NCi0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0d2cnh4ZWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIxIi8+DQotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDIwRDNGMDAwMzk4IiBuYW1lPSJwcm9jZXNzVmlld3MiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI0NCIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MjBEM0YwMDAzOTYiPg0KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3YwN3plZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4NCi0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0d2MDd6T2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MjEyOTFEMDAwNDUiIG5hbWU9ImRlZmF1bHRWaWV3IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyNDQiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDIxMjkxQ0QwMThCIj4NCi0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0d2MDcwZWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIxIi8+DQotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HdjA3ME9mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iMSIvPg0KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyNzZDRTU2MDJBNyIgbmFtZT0iYmFzZUNvbmZpZ3VyYXRpb25zIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1NzAwRUYiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDI3NkNFNTIwM0IwIj4NCi0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0d2LXN0dWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+DQotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9Hdi1zdGVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDU1OEVGN0UwMDQyIiBuYW1lPSJzdWJ0cmFjdGVkQ2F0ZWdvcnkiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI0NCIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0NTU4RUY3QzAzNTMiPg0KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3Ytc3ZlZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4NCi0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0d2LXN2T2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0NTU5MDA2QjAyNzAiIG5hbWU9ImFkZGVkQ2F0ZWdvcnkiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI0NCIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0NTU5MDA2QTAzMTciPg0KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3Ytc3hPZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4NCi0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0d2LXN3LWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RDAzQUIiIG5hbWU9IlByb2Nlc3NGYW1pbHkiPg0KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3ZZUDRPZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVEMDNBQiI+DQotICAgICAgICAgICAgICA8Ym9keT5BIERlbGl2ZXJ5IE1vZGVsIEZhbWlseSBpcyBhIGNvbnZlbmllbnQgZ3JvdXBpbmcgb2YgRGVsaXZlcnkgUHJvY2Vzc2VzIGFuZCBDYXBhYmlsaXR5IFBhdHRlcm5zIG9mIGludGVyZXN0IHRvIHNvbWUgc3BlY2lmaWMgdXNlciBjb21tdW5pdHkuPC9ib2R5Pg0KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAyNjMiIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0MEYzNkM1NzAwRUYiLz4NCi0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMjY3IiBuYW1lPSJkZWxpdmVyeVByb2Nlc3NlcyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDc3IiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDI2NCI+DQotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HdnJ4ei1mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3ZyeHp1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxRUYwOTU4MDE1MiIgbmFtZT0iUHJvY2VzcyIgaXNBYnN0cmFjdD0idHJ1ZSI+DQotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HdmlBdy1mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFRjA5NTgwMTUyIj4NCi0gICAgICAgICAgICAgIDxib2R5PlByb2Nlc3MgaW4gdGhlIHBhY2thZ2UgTGlicmFyeSBDb25maWd1cmF0aW9uIGV4dGVuZHMgdGhlIGNsYXNzIFByb2Nlc3Mgd2l0aCBhc3NvY2lhdGlvbiByZWxhdGluZyBhIFByb2Nlc3MgdG8gb25lIGRlZmF1bHQgYW5kIG1hbnkgb3B0aW9uYWwgdmFsaWQgQ29uZmlndXJhdGlvbnMuDQotVGhlc2UgY29uZmlndXJhdGlvbnMgZGVzY3JpYmUgdmFsaWQgY29udGV4dHMgZm9yIHRoZSBQcm9jZXNzIHdpdGhpbiBhIE1ldGhvZCBMaWJyYXJ5IGluZGljYXRpbmcgdW5kZXIgd2hpY2ggQ29uZmlndXJhdGlvbnMgYSBQcm9jZXNzIGlzIHdlbGwgZGVmaW5lZC4NCi08L2JvZHk+DQotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxRUYwOTk4MDExMiIgbmFtZT0iZGVmYXVsdENvbnRleHQiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzU3MDBFRiIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MUVGMDk5ODAxMTAiPg0KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3YwN3ZlZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IjEiLz4NCi0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0d2MDd2T2ZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIxIi8+DQotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDFFRjA5OUYwMTgwIiBuYW1lPSJ2YWxpZENvbnRleHQiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzU3MDBFRiIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MUVGMDk5RjAxN0UiPg0KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3YwN3h1ZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4NCi0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0d2MDd4ZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RDAzQjUiIG5hbWU9Ik1ldGhvZExpYnJhcnkiPg0KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3ZpQXgtZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVEMDNCNSI+DQotICAgICAgICAgICAgICA8Ym9keT5BIE1ldGhvZCBMaWJyYXJ5IGlzIGEgcGh5c2ljYWwgY29udGFpbmVyIGZvciBNZXRob2QgUGx1Z2lucyBhbmQgTWV0aG9kIENvbmZpZ3VyYXRpb24gZGVmaW5pdGlvbnMuICBBbGwgTWV0aG9kIEVsZW1lbnRzIGFyZSBzdG9yZWQgaW4gYSBNZXRob2QgTGlicmFyeS48L2JvZHk+DQotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxRkZERjgyMDE2NiIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQxRkVEODgxMDFCNSIvPg0KLSAgICAgICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MjUxOEM5MzAwOEYiIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0MURERkEzNjAyQzEiLz4NCi0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMjg1IiBuYW1lPSJtZXRob2RQbHVnaW5zIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxMDQiIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMjgyIj4NCi0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0d2cngxdWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+DQotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HdnJ4MWVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGODdCRjcwMDkxIiBuYW1lPSJwcmVkZWZpbmVkQ29uZmlndXJhdGlvbnMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzU3MDBFRiIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MEY4N0JGNjAxMjYiPg0KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3YwN3MtZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4NCi0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0d2MDdzdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAyMTUiIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDIxNiBfM0FEQzdCNzQwMjJENDBGMzZDNUYwMjFEIj4NCi0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0d2aUF6ZWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAyMTUiPg0KLSAgICAgICAgICAgICAgPGJvZHk+QSBzZWxlY3Rpb24gb2YgcGFja2FnZXMgdG8gYmUgaW5jbHVkZWQgaW4gdGhlIGNvbmZpZ3VyYXRpb24uPC9ib2R5Pg0KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAyMTYiIG5hbWU9Il9tZXRob2RDb25maWd1cmF0aW9uIiB2aXNpYmlsaXR5PSJwcml2YXRlIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNTcwMEVGIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMjE1Ij4NCi0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0d2aUEwZWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+DQotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HdmlBME9mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgPC9vd25lZEVuZD4NCi0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMjQ1IiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAyNDYgXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDI0OCI+DQotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HdmlBMXVmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMjQ1Ij4NCi0gICAgICAgICAgICAgIDxib2R5PkEgc2VsZWN0aW9uIG9mIHBhY2thZ2VzIHRvIGJlIGluY2x1ZGVkIGluIHRoZSBjb25maWd1cmF0aW9uLjwvYm9keT4NCi0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgICAgICA8b3duZWRFbmQgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMjQ2IiBuYW1lPSJfbWV0aG9kQ29uZmlndXJhdGlvbiIgdmlzaWJpbGl0eT0icHJpdmF0ZSIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzU3MDBFRiIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDI0NSI+DQotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HdnJ4dy1mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3ZyeHd1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgIDwvb3duZWRFbmQ+DQotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDI2NCIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMjY1IF8zQURDN0I3NDAyMkQ0MEYzNkM1RjAyNjciPg0KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3ZyeHlPZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDI2NCI+DQotICAgICAgICAgICAgICA8Ym9keT5EZWxpdmVyeSBQcm9jZXNzIGNhbiBiZSBvcmdhbml6ZWQgaW4gbWFueSBQcm9jZXNzIEZhbWlsaWVzLjwvYm9keT4NCi0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgICAgICA8b3duZWRFbmQgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMjY1IiBuYW1lPSJwcm9jZXNzRmFtaWxpZXMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVEMDNBQiIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAyNjQiPg0KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3ZyeHpPZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4NCi0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0d2cnh5LWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICA8L293bmVkRW5kPg0KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAyODIiIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDI4MyBfM0FEQzdCNzQwMjJENDBGMzZDNUYwMjg1Ij4NCi0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0d2cngwZWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAyODIiPg0KLSAgICAgICAgICAgICAgPGJvZHk+QSBNZXRob2QgTGlicmFyeSBwaHlzaWNhbGx5IGNvbXByaXNlcyBvZiBNZXRob2QgUGx1Z2lucy48L2JvZHk+DQotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDI4MyIgbmFtZT0iX21ldGhvZExpYnJhcnkiIHZpc2liaWxpdHk9InByaXZhdGUiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RDAzQjUiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAyODIiLz4NCi0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGODdCRjYwMTI2IiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0MEY4N0JGNzAwOTEgXzNBREM3Qjc0MDIyRDQwRjg3QkY3MDA5MyI+DQotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HdnJ4Mk9mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGODdCRjYwMTI2Ij4NCi0gICAgICAgICAgICAgIDxib2R5PkEgTWV0aG9kIExpYnJhcnkgc3RvcmVzIGEgc2V0IG9mIHByZWRlZmluZWQgTWV0aG9kIENvbmZpZ3VyYXRpb25zIHRoYXQgYXJlIHJlZ3VsYXJseSB1c2VkIGJ5IHRoZSBsaWJyYXJ5IGF1dGhvcnMgKGUuZy4gdGhlIGNvbmZpZ3VyYXRpb25zIHRoYXQgdGhleSBzaGlwIHRvIHRoZWlyIHVzZXJzKS48L2JvZHk+DQotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjg3QkY3MDA5MyIgbmFtZT0iX21ldGhvZExpYnJhcnkiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVEMDNCNSIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQwRjg3QkY2MDEyNiIvPg0KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MUVGMDk5ODAxMTAiIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQxRUYwOTk4MDExMSBfM0FEQzdCNzQwMjJENDFFRjA5OTgwMTEyIj4NCi0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0d2MDd0dWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUVGMDk5ODAxMTAiPg0KLSAgICAgICAgICAgICAgPGJvZHk+QSBQcm9jZXNzIGhhcyBleGFjdGx5IG9uIGRlZmF1bHQgY29uZmlndXJhdGlvbi4gIFRoaXMgaXMgaW4gbW9zdCBjYXNlcyB0aGUgY29uZmlndXJhdGlvbiBpbiB3aGljaCB0aGUgcHJvY2VzcyBoYXMgYmVlbiBjcmVhdGVkLjwvYm9keT4NCi0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgICAgICA8b3duZWRFbmQgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDFFRjA5OTgwMTExIiBuYW1lPSJfcHJvY2VzcyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDFFRjA5NTgwMTUyIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDFFRjA5OTgwMTEwIj4NCi0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0d2MDd1dWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+DQotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HdjA3dWVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgPC9vd25lZEVuZD4NCi0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDFFRjA5OUYwMTdFIiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0MUVGMDk5RjAxN0YgXzNBREM3Qjc0MDIyRDQxRUYwOTlGMDE4MCI+DQotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HdjA3di1mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFRjA5OUYwMTdFIj4NCi0gICAgICAgICAgICAgIDxib2R5PkEgUHJvY2VzcyBjYW4gaGF2ZSBtYW55IGFkZGl0aW9uYWwgY29uZmlndXJhdGlvbnMgdGhhdCBoYXZlIGJlZW4gdmVyaWZpZWQgdG8gYWxzbyBwcm9kdWNlIHZhbGlkIHJlc3VsdHMuICBQcm9jZXNzIEVsZW1lbnRzIChlLmcuIERlc2NyaXB0b3JzKSB0aGF0IHJlZmVyIHRvIGNvbnRlbnQgcGFja2FnZXMgdGhhdCBhcmUgZGVmaW5lZCBvdXRzaWRlIHRoZSBzY29wZSBvZiBzdWNoIGEgY29uZmlndXJhdGlvbiB3b3VsZCBub3QgYmUgc2hvd24gaW4gdGhlIHByb2Nlc3Mgd2hlbiBwdWJsaXNoZWQgb3IgdXNlZCB1bmRlciBzdWNoIGEgY29uZmlndXJhdGlvbi4gIFRoaXMgYWxsb3dzIHRvIGVhc2lseSByZW1vdmUgY29udGVudCBmcm9tIGEgcHJvY2VzcyBieSByZW1vdmluZyBjb250ZW50IHBhY2thZ2VzIHRvIGZyb20gdGhlIHJlbGF0ZWQgY29uZmlndXJhdGlvbi48L2JvZHk+DQotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxRUYwOTlGMDE3RiIgbmFtZT0iX3Byb2Nlc3MiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQxRUYwOTU4MDE1MiIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQxRUYwOTlGMDE3RSI+DQotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HdjA3dy1mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3YwN3d1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgIDwvb3duZWRFbmQ+DQotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyMEQzRjAwMDM5NiIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDIwRDNGMDAwMzk3IF8zQURDN0I3NDAyMkQ0MjBEM0YwMDAzOTgiPg0KLSAgICAgICAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MjBEM0YwMDAzOTciIG5hbWU9Il9tZXRob2RDb25maWd1cmF0aW9uIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1NzAwRUYiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MjBEM0YwMDAzOTYiPg0KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3YwN3l1ZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4NCi0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0d2MDd5ZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICA8L293bmVkRW5kPg0KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MjEyOTFDRDAxOEIiIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQyMTI5MUQwMDA0NSBfM0FEQzdCNzQwMjJENDIxMjkxRDAwMDU5Ij4NCi0gICAgICAgICAgICA8b3duZWRFbmQgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDIxMjkxRDAwMDU5IiBuYW1lPSJfbWV0aG9kQ29uZmlndXJhdGlvbiIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNTcwMEVGIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDIxMjkxQ0QwMThCIj4NCi0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0d2LXNzT2ZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+DQotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HdjA3MC1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgPC9vd25lZEVuZD4NCi0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDI3NkNFNTIwM0IwIiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0Mjc2Q0U1NjAyQTcgXzNBREM3Qjc0MDIyRDQyNzZDRTU2MDJBOSI+DQotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9Hdi1zc3VmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3NkNFNTIwM0IwIj4NCi0gICAgICAgICAgICAgIDxib2R5PlRoZSBkZWZpbml0aW9uIG9mIGEgY29uZmlndXJhdGlvbiBjYW4gYmUgYmFzZWQgb24gdGhlIGRlZmluaXRpb25zIG9mIG90aGVyIGNvbmZpZ3VyYXRpb25zLiAgRm9yIGV4YW1wbGUsIGEgY29uZmlndXJhdGlvbiBBIGNvdWxkIGJlIGRlZmluZWQgYXMgdGhlIHN1cGVyc2V0IG9mIGNvbmZpZ3VyYXRpb25zIEIsIEMsIGFuZCBEIHBsdXMgYWRkIG1vcmUgc2VsZWN0ZWQgUGx1Z2lucyBhbmQgUGFja2FnZXMuICBJbiBzdWNoIGEgY2FzZSBBIHdvdWxkIGxpc3QgQiwgQywgYW5kIEQgYXMgaXRzIGJhc2VDb25maWd1cmF0aW9ucy4gIElmIGFueSBvZiB0aGVzZSBiYXNlIGNvbmZpZ3VyYXRpb25zIGNoYW5nZXMgYWxsIHVwZGF0ZXMgd291bGQgYmUgYXV0b21hdGljYWxseSB2YWxpZCBmb3IgQSBhcyB3ZWxsIHJlZHVjaW5nIG1haW50YWluYWJpbGl0eSBvdmVyaGVhZCBmb3Igb3ZlcmxhcHBpbmcvZGVwZW5kZW50IGNvbmZpZ3VyYXRpb25zLiA8L2JvZHk+DQotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyNzZDRTU2MDJBOSIgbmFtZT0iIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1NzAwRUYiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0Mjc2Q0U1MjAzQjAiPg0KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3Ytc3VlZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4NCi0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0d2LXN1T2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICA8L293bmVkRW5kPg0KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0NTU4RUY3QzAzNTMiIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQ1NThFRjdFMDA0MiBfM0FEQzdCNzQwMjJENDU1OEVGN0UwMDU2Ij4NCi0gICAgICAgICAgICA8b3duZWRFbmQgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDU1OEVGN0UwMDU2IiBuYW1lPSJfbWV0aG9kQ29uZmlndXJhdGlvbiIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNTcwMEVGIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDU1OEVGN0MwMzUzIj4NCi0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0d2LXN3T2ZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+DQotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9Hdi1zdi1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgPC9vd25lZEVuZD4NCi0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDU1OTAwNkEwMzE3IiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0NTU5MDA2QjAyNzAgXzNBREM3Qjc0MDIyRDQ1NTkwMDZCMDI3QSI+DQotICAgICAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQ1NTkwMDZCMDI3QSIgbmFtZT0iX21ldGhvZENvbmZpZ3VyYXRpb24iIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzU3MDBFRiIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQ1NTkwMDZBMDMxNyIvPg0KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il9tR1kwOE03QUVkeXBUOEVMYldKYTd3IiBuYW1lPSJDb25maWd1cmF0aW9uQ2F0ZWdvcnkiPg0KLSAgICAgICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il9veURKOE03QUVkeXBUOEVMYldKYTd3IiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjQ0Ii8+DQotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3V4d3BvTTdBRWR5cFQ4RUxiV0phN3ciIG5hbWU9ImNvbmZpZ3VyYXRpb24iIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzU3MDBFRiIgYXNzb2NpYXRpb249Il91eG00b003QUVkeXBUOEVMYldKYTd3Ij4NCi0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3V4d3BvczdBRWR5cFQ4RUxiV0phN3ciIHZhbHVlPSIxIi8+DQotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il91eHdwb2M3QUVkeXBUOEVMYldKYTd3IiB2YWx1ZT0iMSIvPg0KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3V4bTRvTTdBRWR5cFQ4RUxiV0phN3ciIG1lbWJlckVuZD0iX3V4d3BvTTdBRWR5cFQ4RUxiV0phN3cgX3V4d3BvODdBRWR5cFQ4RUxiV0phN3ciPg0KLSAgICAgICAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il91eHdwbzg3QUVkeXBUOEVMYldKYTd3IiBuYW1lPSIiIHZpc2liaWxpdHk9InByaXZhdGUiIHR5cGU9Il9tR1kwOE03QUVkeXBUOEVMYldKYTd3IiBhc3NvY2lhdGlvbj0iX3V4bTRvTTdBRWR5cFQ4RUxiV0phN3ciPg0KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfdXh3cHBjN0FFZHlwVDhFTGJXSmE3dyIgdmFsdWU9IioiLz4NCi0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3V4d3BwTTdBRWR5cFQ4RUxiV0phN3ciLz4NCi0gICAgICAgICAgICA8L293bmVkRW5kPg0KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOlBhY2thZ2UiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxRkVEREI2MDMwNiIgbmFtZT0iTWV0aG9kVW5pdHMiPg0KLSAgICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iX0d3YllvLWZYRWR1cUhvT0piVVJaUnciIHNvdXJjZT0idW1sMi5kaWFncmFtcyIgcmVmZXJlbmNlcz0iXzNBREM3Qjc0MDIyRDQxRkVERTA5MDNCMCI+DQotICAgICAgICAgICAgPGNvbnRlbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpEaWFncmFtIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MUZFREUwOTAzQjAiIHR5cGU9IkNsYXNzIiBuYW1lPSJNYWluIj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISndlb09mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFGRURFNzUwMDRFIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKd2VvLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9ISndlcE9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMjU3MyIgaGVpZ2h0PSI5MDUiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKd2VwZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKd2VwdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKd2VwLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEp3ZXFPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEp3ZXFlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEp3ZXF1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEp3ZXEtZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEp3ZXJPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEp3ZXJlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEp3ZXJ1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKd2VyLWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEp3ZW9lZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEp3ZW91ZlhFZHVxSG9PSmJVUlpSdyIgeD0iNTg4NyIgeT0iNjAwNCIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISndlc09mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFGRURFODAwMjUyIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKd2VzLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9ISndldE9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMzQ1NCIgaGVpZ2h0PSI5MDUiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKd2V0ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKd2V0dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKd2V0LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEp3ZXVPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEp3ZXVlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEp3ZXV1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEp3ZXUtZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEp3ZXZPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEp3ZXZlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEp3ZXZ1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKd2V2LWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEp3ZXNlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEp3ZXN1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iOTAyMiIgeT0iNjAwNCIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISndlNmVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjgwIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKd2U3T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9ISndlN2VmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMjgyNyIgaGVpZ2h0PSIxMDQ5Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISndlN3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISndlNy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISndlOE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKd2U4ZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKd2U4dWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKd2U4LWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKd2U5T2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKd2U5ZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKd2U5dWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKd2U5LWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISndlLU9mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hKd2U2dWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hKd2U2LWZYRWR1cUhvT0piVVJaUnciIHg9IjgxOTUiIHk9IjI2NSIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISndlLWVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3OTQ3RTUwMTc4Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKd2VfT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9ISndlX2VmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMzM4NiIgaGVpZ2h0PSI5MDUiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKd2VfdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKd2VfLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKd2ZBT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEp3ZkFlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEp3ZkF1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEp3ZkEtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEp3ZkJPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEp3ZkJlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEp3ZkJ1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEp3ZkItZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKd2ZDT2ZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEp3ZS11ZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEp3ZS0tZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTg1NCIgeT0iNjAwNCIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISndmRXVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMUMxIj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKd2ZGZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9ISndmRnVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMzMxOCIgaGVpZ2h0PSIxMDMyIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISndmRi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISndmR09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISndmR2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKd2ZHdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKd2ZHLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKNlBvT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKNlBvZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKNlBvdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKNlBvLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKNlBwT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISjZQcGVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hKd2ZFLWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hKd2ZGT2ZYRWR1cUhvT0piVVJaUnciIHg9IjIyMCIgeT0iMjk4OCIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISjZQcHVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFGRUQ4ODEwMUI1Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKNlBxZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9ISjZQcXVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iNDUzOCIgaGVpZ2h0PSIyNDIxIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISjZQcS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISjZQck9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISjZQcmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKNlBydWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEo2UHItZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEo2UHNPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEo2UHNlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEo2UHN1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEo2UHMtZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEo2UHRPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKNlB0ZWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEo2UHAtZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJOb25lIiBzaG93TGlzdFZpc2liaWxpdHk9Ik5vbmUiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEo2UHFPZlhFZHVxSG9PSmJVUlpSdyIgeD0iNzYyOCIgeT0iMjM0NSIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISjZRRnVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUQwM0I1Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKNlFHZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9ISjZRR3VmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMzYwNiIgaGVpZ2h0PSIxMDMyIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISjZRRy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISjZRSE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISjZRSGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKNlFIdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKNlFILWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKNlFJT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKNlFJZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKNlFJdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKNlFJLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKNlFKT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISjZRSmVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hKNlFGLWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hKNlFHT2ZYRWR1cUhvT0piVVJaUnciIHg9IjEzMDMwIiB5PSI2MDA0Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKNlFMLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1NzAwRUYiPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEo2UU11ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hKNlFNLWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIzNjA2IiBoZWlnaHQ9IjEwMzIiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKNlFOT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKNlFOZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKNlFOdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEo2UU4tZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEo2UU9PZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEo2UU9lZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEo2UU91ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEo2UU8tZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEo2UVBPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEo2UVBlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKNlFQdWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEo2UU1PZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEo2UU1lZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTYzMTAiIHk9IjYwMDQiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxEaWFncmFtU3R5bGUiIHhtaTppZD0iX0d3YllwZWZYRWR1cUhvT0piVVJaUnciIGRlc2NyaXB0aW9uPSJ8TWV0aG9kIGFuZCBQcm9jZXNzIEF1dGhvcmluZyBpcyBub3QgZG9uZSBpbiBpc29sYXRpb24gYnkgYSBzaW5nbGUgcHJvY2VzcyBlbmdpbmVlci4gIEVzcGVjaWFsbHksIHdoZW4gbGFyZ2Ugc2NhbGUgTWV0aG9kIExpYnJhcmllcyBzaGFsbCBiZSBtYWludGFpbmVkIGl0IGlzIGltcG9ydGFudCB0byBkZWZpbmUgdGhlIHJpZ2h0IG1vZHVsYXJpemF0aW9uIHByaW5jaXBsZXMgdGhhdCBhbGxvdyBjb25jdXJyZW50IGRldmVsb3BtZW50IG9mIGxhcmdlIHNjYWxlIHByb2Nlc3MgZW5naW5lZXJpbmcgdGVhbXMuICBNZXRob2QgUGx1Z2lucyB3ZXJlIGEgZmlyc3Qgc3RlcCBvZiBtb2R1bGFyaXphdGlvbi4gIEhvd2V2ZXIsIGV2ZW4gd29ya2luZyB3aXRoIE1ldGhvZCBQbHVnaW5zIGNhbiBvbmx5IHNjYWxlIGluIGxpbWl0ZWQgd2F5cyBzdXBwb3J0aW5nIG9ubHkgdmVyeSBzbWFsbCBhdXRob3JpbmcgdGVhbXMuICBGb3IgbGFyZ2VyIHNjYWxlIG1ldGhvZCBsaWJyYXJpZXMgY29uY3VycmVudCBhY2Nlc3MgYW5kIHdvcmtpbmcgZXZlbiB3aXRoaW4gYSBNZXRob2QgUGx1Z2luIGlzIHJlcXVpcmVkLiAgVG8gYWRkcmVzcyB0aGVzZSByZXF1aXJlbWVudHMgdGhlIE1ldGhvZCBVbml0cyBwYWNrYWdlIGV4dGVuZHMgTWV0aG9kIEVsZW1lbnRzIHZpYSBwYWNrYWdlIG1lcmdlIHdpdGggYSBuZXcgY2FwYWJpbGl0eSBkZWZpbmVkIGFzIE1ldGhvZCBVbml0LiAgQSBNZXRob2QgVW5pdCBpcyBhIHVuaXQgb2YgY29udHJvbCB0aGF0IGNhbiBiZSB3b3JrZWQgb24gYnkgb25lIHByb2Nlc3MgZW5naW5lZXIgYW5kIGNhbiBzZXJ2ZSBhcyBvbmUgdW5pdCBvZiB2ZXJzaW9uIGNvbnRyb2wuJiN4QTt8VGhlIGRpYWdyYW0gc2hvd3MgdGhhdCBmb3VyIHR5cGVzIG9mIE1ldGhvZCBVbml0cyBoYXZlIGJlZW4gZGVmaW5lZC4gIENvbnRlbnQgRGVzY3JpcHRpb24gcmVwcmVzZW50aW5nIGFsbCBtYWpvciB0ZXh0dWFsIGRlc2NyaXB0aW9uIG9mIGEgQ29udGVudCBFbGVtZW50IHN1Y2ggYXMgVGFzaywgQXJ0aWZhY3QsIEd1aWRlbGluZSwgb3IgV2hpdGVwYXBlciBzaGFsbCBiZSBtYWludGFpbmVkIGluIGEgc2VwYXJhdGUgdW5pdCBvZiBjb250cm9sLiAgV2hlcmVhcyBldmVyeSBDb250ZW50IEVsZW1lbnQncyBDb250ZW50IERlc2NyaXB0aW9uIGNhbiBiZSBzZWVuIGFzIGFuIGVsZW1lbnQgdGhhdCBjYW4gYmUgbWFpbnRhaW5lZCBpbiBpc29sYXRpb24sIFByb2Nlc3NlcyBhcmUga2VwdCBhbmQgbWFuYWdlZCBhcyBhIHdob2xlLiAgSWYgYSBicmVha2Rvd24gc3RydWN0dXJlIG5lZWRzIHRvIGJlIHNwbGl0IGFuZCBoYW5kbGVkIGFzIHNlcGFyYXRlIHVuaXRzIG9mIGNvbnRyb2wgdGhlbiBuZXcgcHJvY2Vzc2VzIHN1Y2ggYXMgQ2FwYWJpbGl0eSBQYXR0ZXJucyB3aWxsIGJlIGNyZWF0ZWQgZm9yIHN1Y2ggYSByZWZhY3RvcmluZy4gIEhlbmNlLCBleGFjdGx5IG9uZSBpbnN0YW5jZSBvZiBQcm9jZXNzIHNoYWxsIGJlIHN0b3JlZCBpbiBhbiBpbnN0YW5jZSBvZiBQcm9jZXNzIENvbXBvbmVudCwgd2hpY2ggaXMgZGVmaW5lZCB0byBiZSB0aGUgY29udGFpbmVyIGZvciBhIFByb2Nlc3MgYW5kIHRoZXJlZm9yZSBpdHMgTWV0aG9kIFVuaXQuICBGaW5hbGx5LCBNZXRob2QgUGx1Z2lucyBhbmQgTWV0aG9kIExpYnJhcmllcyBhcmUgZGVmaW5lZCBhcyBNZXRob2QgVW5pdHMuICBXaGVyZWFzLCB0aGUgZm9ybWVyIHN0b3JlcyBhbGwgJ21vZGVsZWQnIGVsZW1lbnRzIG9yZ2FuaXplZCBpbiBNZXRob2QgUGFja2FnZXMgc3VjaCBhcyBhbGwgQ29udGVudCBFbGVtZW50cyAob25seSB0aGUgZGVzY3JpcHRpb24gY2xhc3NlcyBhcmUgbWFpbnRhaW5lZCBhcyBzZXBhcmF0ZSB1bml0cyksIHRoZSBsYXRlciBkZWZpbmVzIGEgTWV0aG9kIFVuaXQgdG8gc3RvcmUgcmVmZXJlbmNlcyB0byB0aGUgTWV0aG9kIFBsdWdpbnMgdGhhdCBhcmUgcGFydCBvZiB0aGUgTGlicmFyeSBhcyB3ZWxsIGFzIE1ldGhvZCBDb25maWd1cmF0aW9ucy4mI3hBOyIvPg0KLSAgICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hKNlB0dWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUZFRTBDNTAzQTEiIHNvdXJjZT0iX0hKd2VvT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hKNlBwdWZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEo2UHVlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEo2UHUtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISjZQdk9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hKNlB1dWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hKNlB0LWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEo2UHVPZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMjAzLCAtNDU3LCAtMTExNywgMjM4N10kWzc0NSwgLTE2MzQsIC01NzUsIDEyMTBdIi8+DQotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9ISjZQdmVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hKNlB2dWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9ISjZQdi1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFGRUUwQzkwMTk0IiBzb3VyY2U9Il9ISndlc09mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9ISjZQcHVmWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKNlB3dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKNlB4T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEo2UHhlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISjZQdy1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9ISjZQd09mWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hKNlB3ZWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0yOTYsIC00NTcsIDE0ODEsIDIzODddJFstMTAzMiwgLTE2MzQsIDc0NSwgMTIxMF0iLz4NCi0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hKNlB4dWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEo2UHgtZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hKNlB5T2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUZFRDg5MTAzQUQiIHNvdXJjZT0iX0hKNlBwdWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hKd2U2ZWZYRWR1cUhvT0piVVJaUnciPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEo2UHktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEo2UHplZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISjZQenVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hKNlB6T2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hKNlB5ZWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEo2UHl1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTI1LCAtMTIxOSwgMjUsIDE2MjVdJFstNTAsIC0yMzE5LCAwLCA1MjRdIi8+DQotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9ISjZQei1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hKNlAwT2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9ISjZQMGVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3OTQ4MDAwMUFFIiBzb3VyY2U9Il9ISndlLWVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9ISjZQcHVmWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKNlAxT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKNlAxdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEo2UDEtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISjZQMWVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9ISjZQMHVmWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hKNlAwLWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzcwMiwgLTQ1NywgLTM3NjcsIDIzODddJFsyNTU2LCAtMTYzNCwgLTE5MTMsIDEyMTBdIi8+DQotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9ISjZQMk9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hKNlAyZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9ISjZQMnVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDJBN0Q1MkYwMjQzIiBzb3VyY2U9Il9ISjZQcHVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9ISndmRXVmWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKNlAzZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKNlAzLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEo2UDRPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISjZQM3VmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISjZQNGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDJBN0Q1MzAwMjA5Ij4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEo2UDQtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hKNlA0dWZYRWR1cUhvT0piVVJaUnciIHg9Ii0yNjQiIHk9Ii0yMTIiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKNlA1T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyQTdENTMwMDIwOSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKNlA1dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEo2UDVlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTM5NyIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEo2UDUtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDJBN0Q1MzAwMUUxIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEo2UDZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEo2UDZPZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTQ0IiB5PSItMjg5Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISjZQNnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDJBN0Q1MzAwMUUxIj4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEo2UDdPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hKNlA2LWZYRWR1cUhvT0piVVJaUnciIHg9Ii0xMzAwIiB5PSIyMjEiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKNlA3ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MkE3RDUzMDAyMDkiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISjZQNy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEo2UDhPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISjZQN3VmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISjZQOGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MkE3RDUzMDAxRTEiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISjZQOC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEo2UDlPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISjZQOHVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISjZQOWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyQTdENTMwMDIwOSI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKNlA5LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISjZQLU9mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hKNlA5dWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKNlAtZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MkE3RDUzMDAxRTEiPg0KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISjZQLS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISjZQX09mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hKNlAtdWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hKNlAyLWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hKNlAzT2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0yMjY5LCAtNTAsIDUzMDAsIDBdJFstNTkwOSwgLTUwLCAxNjU5LCAwXSIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9ISjZRSnVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFGRkRGODIwMTY2IiBzb3VyY2U9Il9ISjZRRnVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9ISjZQcHVmWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKNlFLZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKNlFLLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEo2UUxPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISjZRS3VmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9ISjZRSi1mWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hKNlFLT2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy05NTYsIC01MjQsIDQ0MjgsIDIzNzBdJFstMzExNSwgLTE2ODQsIDIyNjksIDEyMTBdIi8+DQotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9ISjZRTGVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hKNlFMdWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9ISjZRUC1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDQ1NjVCQjEwMTVGIiBzb3VyY2U9Il9ISjZRTC1mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9ISjZQcHVmWEVkdXFIb09KYlVSWlJ3Ij4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKNlFRdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKNlFST2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEo2UVJlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISjZRUS1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9ISjZRUU9mWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hKNlFRZWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0xNjE3LCAtNTI0LCA3NTc3LCAyMzcwXSRbLTY5MjUsIC0yMTg0LCAyMjY5LCA3MTFdIi8+DQotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9ISjZRUnVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hKNlFSLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgICA8L2NvbnRlbnRzPg0KLSAgICAgICAgICA8L2VBbm5vdGF0aW9ucz4NCi0gICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9Hd0gycGVmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDFGRUREQjYwMzA2Ij4NCi0gICAgICAgICAgICA8Ym9keT4wMTwvYm9keT4NCi0gICAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgICAgIDxwYWNrYWdlTWVyZ2UgeG1pOmlkPSJfR05rQjhPeFNFZHVPTnJNUmdtejQ4QSIgbWVyZ2VkUGFja2FnZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDBGQiIvPg0KLSAgICAgICAgICA8cGFja2FnZU1lcmdlIHhtaTppZD0iX3lBd0JrTWlURWR5eE80RXN1UU9nVGciIG1lcmdlZFBhY2thZ2U9Il9oYVlKanNpTUVkeXhPNEVzdVFPZ1RnIi8+DQotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDFGRURFNzUwMDRFIiBuYW1lPSJNZXRob2RQbHVnaW4iPg0KLSAgICAgICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MUZFRTBDNTAzQTEiIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0MUZFRDg4MTAxQjUiLz4NCi0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDFGRURFODAwMjUyIiBuYW1lPSJQcm9jZXNzQ29tcG9uZW50Ij4NCi0gICAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDFGRUUwQzkwMTk0IiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDFGRUQ4ODEwMUI1Ii8+DQotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxRkVEODgxMDFCNSIgbmFtZT0iTWV0aG9kVW5pdCIgaXNBYnN0cmFjdD0idHJ1ZSI+DQotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9Hd0gycy1mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDFGRUQ4ODEwMUI1Ij4NCi0gICAgICAgICAgICAgIDxib2R5PkEgTWV0aG9kIFVuaXQgaXMgYSBzcGVjaWFsIE1ldGhvZCBFbGVtZW50IHRoYXQgc2hhbGwgYmUgbWFpbnRhaW5lZCBpbiBhIE1ldGhvZCBMaWJyYXJ5IGFzIGEgc2VwYXJhdGUgdW5pdCBvZiBjb250cm9sLjwvYm9keT4NCi0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDFGRUQ4OTEwM0FEIiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjgwIi8+DQotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDA1QiIgbmFtZT0iYXV0aG9ycyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIj4NCi0gICAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3dIMnQtZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDA1QiI+DQotICAgICAgICAgICAgICAgIDxib2R5PkV2ZXJ5IE1ldGhvZCBVbml0IGlzIGJlaW5nIGNyZWF0ZWQgYW5kIG93bmVkIGJ5IGFuIGF1dGhvciBvciBhdXRob3JpbmcgdGVhbS48L2JvZHk+DQotICAgICAgICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iXzVkR05FZXlHRWR1NS12VmpsZlZzZlEiIHZhbHVlPSIxIi8+DQotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il81ZEdORU95R0VkdTUtdlZqbGZWc2ZRIi8+DQotICAgICAgICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfNVVUZGNPeUdFZHU1LXZWamxmVnNmUSIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyIgdmFsdWU9IiIvPg0KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDA2NCIgbmFtZT0iY2hhbmdlRGF0ZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGNDQ5OEQwMTg1Ij4NCi0gICAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3dSbm91ZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDA2NCI+DQotICAgICAgICAgICAgICAgIDxib2R5PlRoZSBkYXRlIHRoZSBsYXN0IGNoYW5nZSB0aGF0IHJlc3VsdGVkIGludG8gdGhpcyB2ZXJzaW9uIGhhcyBiZWVuIG1hZGUuPC9ib2R5Pg0KLSAgICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9VWi1ROGV5TUVkdUZLSm92Qkw2NFhRIiB2YWx1ZT0iMSIvPg0KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfVVotUThPeU1FZHVGS0pvdkJMNjRYUSIvPg0KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDA2RSIgbmFtZT0iY2hhbmdlRGVzY3JpcHRpb24iIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyI+DQotICAgICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0d3Um5wZWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAwNkUiPg0KLSAgICAgICAgICAgICAgICA8Ym9keT5UaGUgZGVzY3JpcHRpb24gb2YgdGhlIGxhc3QgY2hhbmdlIHRoYXQgcmVzdWx0ZWQgaW50byB0aGlzIHZlcnNpb24uPC9ib2R5Pg0KLSAgICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9OR2U1WWV5RkVkdTUtdlZqbGZWc2ZRIiB2YWx1ZT0iMSIvPg0KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfTkdlNVlPeUZFZHU1LXZWamxmVnNmUSIvPg0KLSAgICAgICAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iX085WlhzT3lGRWR1NS12VmpsZlZzZlEiIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiIHZhbHVlPSIiLz4NCi0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAwNkYiIG5hbWU9InZlcnNpb24iIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyI+DQotICAgICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0d3Um5xT2ZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAwNkYiPg0KLSAgICAgICAgICAgICAgICA8Ym9keT5FdmVyeSBQYWNrYWdlIGhhcyBhIHZlcnNpb24gbnVtYmVyIHVzZWQgdG8gdHJhY2sgY2hhbmdlcy48L2JvZHk+DQotICAgICAgICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3NXVFY4ZXlHRWR1NS12VmpsZlZzZlEiIHZhbHVlPSIxIi8+DQotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9zV1RWOE95R0VkdTUtdlZqbGZWc2ZRIi8+DQotICAgICAgICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfc01VNmtPeUdFZHU1LXZWamxmVnNmUSIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyIgdmFsdWU9IiIvPg0KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyQTdENTMwMDFFMSIgbmFtZT0iY29weXJpZ2h0U3RhdGVtZW50IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxQzEiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDJBN0Q1MkYwMjQzIj4NCi0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0d3YllvZWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIxIi8+DQotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9Hd2JZb09mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDI3OTQ3RTUwMTc4IiBuYW1lPSJDb250ZW50RGVzY3JpcHRpb24iPg0KLSAgICAgICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0Mjc5NDgwMDAxQUUiIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0MUZFRDg4MTAxQjUiLz4NCi0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDJBN0Q1MkYwMjQzIiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0MkE3RDUzMDAxRTEgXzNBREM3Qjc0MDIyRDQyQTdENTMwMDIwOSI+DQotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9Hd1JucnVmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDJBN0Q1MkYwMjQzIj4NCi0gICAgICAgICAgICAgIDxib2R5PkEgTWV0aG9kIFVuaXQgY2FuIGhhdmUgZXhhY3RseSBvbmUgQ29weXJpZ2h0IFN0YXRlbWVudCBzZWN1cmluZyB0aGUgaW50ZWxsZWN0dWFsIGNhcGl0YWwgaXQgcmVwcmVzZW50cy4gIEl0IHdpbGwgYmUgcHVibGlzaGVkIHdpdGggdGhlIHJlc3BlY3RpdmUgY29uY3JldGUgRWxlbWVudC4gIE5vdGUsIHRoYXQgQ29weXJpZ2h0IFN0YXRlbWVudHMgZm9yIE1ldGhvZCBMaWJyYXJpZXMgYW5kIE1ldGhvZCBQbHVnaW5zIGRlZmluZSB0aGUgZGVmYXVsdCBzdGF0ZW1lbnQgZm9yIGl0cyBjb250YWluZWQgZWxlbWVudHMsIHdoaWNoIGNhbiBiZSAnb3ZlcndyaXR0ZW4nIHdpdGggcmV2aXNlZCBzdGF0ZW1lbnRzIGZvciBldmVyeSBDb250ZW50IERlc2NyaXB0aW9uIG9yIFByb2Nlc3MgQ29tcG9uZW50LjwvYm9keT4NCi0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgICAgICA8b3duZWRFbmQgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDJBN0Q1MzAwMjA5IiBuYW1lPSJfbWV0aG9kVW5pdCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDFGRUQ4ODEwMUI1IiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQyQTdENTJGMDI0MyI+DQotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9uckY4VWV5TUVkdUZLSm92Qkw2NFhRIiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfbnJGOFVPeU1FZHVGS0pvdkJMNjRYUSIvPg0KLSAgICAgICAgICAgIDwvb3duZWRFbmQ+DQotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6UGFja2FnZSIgeG1pOmlkPSJfaGFZSjRjaU1FZHl4TzRFc3VRT2dUZyIgbmFtZT0iVU1MMkRpYWdyYW1JbnRlcmNoYW5nZV9kZXByZWNhdGVkIj4NCi0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iX2hhWUo0c2lNRWR5eE80RXN1UU9nVGciIHNvdXJjZT0idW1sMi5kaWFncmFtcyIgcmVmZXJlbmNlcz0iX2hhWUo0OGlNRWR5eE80RXN1UU9nVGciPg0KLSAgICAgICAgPGNvbnRlbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpEaWFncmFtIiB4bWk6aWQ9Il9oYVlKNDhpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJDbGFzcyIgbmFtZT0iRGlhZ3JhbXMiPg0KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZSjVNaU1FZHl4TzRFc3VRT2dUZyIgZWxlbWVudD0iX2hhWU9Tc2lNRWR5eE80RXN1UU9nVGciPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlKNWNpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9oYVlKNXNpTUVkeXhPNEVzdVFPZ1RnIiB3aWR0aD0iMzAxNCIgaGVpZ2h0PSIxMTUxIi8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZSjU4aU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlKNk1pTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWUo2Y2lNRWR5eE80RXN1UU9nVGciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlKNnNpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfaGFZSjY4aU1FZHl4TzRFc3VRT2dUZyIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWUo3TWlNRWR5eE80RXN1UU9nVGciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfaGFZSjdjaU1FZHl4TzRFc3VRT2dUZyIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWUo3c2lNRWR5eE80RXN1UU9nVGciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfaGFZSjc4aU1FZHl4TzRFc3VRT2dUZyIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWUo4TWlNRWR5eE80RXN1UU9nVGciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX2hhWUo4Y2lNRWR5eE80RXN1UU9nVGciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX2hhWUo4c2lNRWR5eE80RXN1UU9nVGciIHNob3dMaXN0U3RlcmVvdHlwZT0iTm9uZSIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfaGFZSjg4aU1FZHl4TzRFc3VRT2dUZyIgeD0iMTc3OTYiIHk9Ijk4MzgiLz4NCi0gICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWUo5TWlNRWR5eE80RXN1UU9nVGciIGVsZW1lbnQ9Il9oYVlOX2NpTUVkeXhPNEVzdVFPZ1RnIj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZSjljaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfaGFZSjlzaU1FZHl4TzRFc3VRT2dUZyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWUo5OGlNRWR5eE80RXN1UU9nVGciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZSi1NaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlKLWNpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZSi1zaU1FZHl4TzRFc3VRT2dUZyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9oYVlKLThpTUVkeXhPNEVzdVFPZ1RnIi8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZSl9NaU1FZHl4TzRFc3VRT2dUZyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9oYVlKX2NpTUVkeXhPNEVzdVFPZ1RnIi8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZSl9zaU1FZHl4TzRFc3VRT2dUZyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9oYVlKXzhpTUVkeXhPNEVzdVFPZ1RnIi8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZS0FNaU1FZHl4TzRFc3VRT2dUZyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfaGFZS0FjaU1FZHl4TzRFc3VRT2dUZyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfaGFZS0FzaU1FZHl4TzRFc3VRT2dUZyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9oYVlLQThpTUVkeXhPNEVzdVFPZ1RnIiB4PSIxMzA4MiIgeT0iMTI3ODkiLz4NCi0gICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWUtCTWlNRWR5eE80RXN1UU9nVGciIGVsZW1lbnQ9Il9oYVlPSDhpTUVkeXhPNEVzdVFPZ1RnIj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZS0JjaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfaGFZS0JzaU1FZHl4TzRFc3VRT2dUZyIgd2lkdGg9IjYyMzEiIGhlaWdodD0iMTE1MSIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWUtCOGlNRWR5eE80RXN1UU9nVGciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZS0NNaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlLQ2NpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZS0NzaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX2hhWUtDOGlNRWR5eE80RXN1UU9nVGciLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlLRE1pTUVkeXhPNEVzdVFPZ1RnIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX2hhWUtEY2lNRWR5eE80RXN1UU9nVGciLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlLRHNpTUVkeXhPNEVzdVFPZ1RnIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX2hhWUtEOGlNRWR5eE80RXN1UU9nVGciLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlLRU1pTUVkeXhPNEVzdVFPZ1RnIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9oYVlLRWNpTUVkeXhPNEVzdVFPZ1RnIiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9oYVlLRXNpTUVkeXhPNEVzdVFPZ1RnIiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iTm9uZSIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX2hhWUtFOGlNRWR5eE80RXN1UU9nVGciIHg9IjIyMzM1IiB5PSIzMTMyIi8+DQotICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlLRk1pTUVkeXhPNEVzdVFPZ1RnIiBlbGVtZW50PSJfaGFZT0pzaU1FZHl4TzRFc3VRT2dUZyI+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWUtGY2lNRWR5eE80RXN1UU9nVGciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX2hhWUtGc2lNRWR5eE80RXN1UU9nVGciIHdpZHRoPSIyNTU2IiBoZWlnaHQ9IjE1NzQiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlLRjhpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWUtHTWlNRWR5eE80RXN1UU9nVGciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZS0djaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWUtHc2lNRWR5eE80RXN1UU9nVGciIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9oYVlLRzhpTUVkeXhPNEVzdVFPZ1RnIi8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZS0hNaU1FZHl4TzRFc3VRT2dUZyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9oYVlLSGNpTUVkeXhPNEVzdVFPZ1RnIi8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZS0hzaU1FZHl4TzRFc3VRT2dUZyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9oYVlLSDhpTUVkeXhPNEVzdVFPZ1RnIi8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZS0lNaU1FZHl4TzRFc3VRT2dUZyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfaGFZS0ljaU1FZHl4TzRFc3VRT2dUZyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfaGFZS0lzaU1FZHl4TzRFc3VRT2dUZyIgc2hvd0xpc3RTdGVyZW90eXBlPSJOb25lIiBzaG93TGlzdFZpc2liaWxpdHk9Ik5vbmUiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9oYVlLSThpTUVkeXhPNEVzdVFPZ1RnIiB4PSI2NzQ3IiB5PSI0NjQ4Ii8+DQotICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlLSk1pTUVkeXhPNEVzdVFPZ1RnIiBlbGVtZW50PSJfaGFZT09NaU1FZHl4TzRFc3VRT2dUZyI+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWUtKY2lNRWR5eE80RXN1UU9nVGciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX2hhWUtKc2lNRWR5eE80RXN1UU9nVGciIHdpZHRoPSIyMjAxIiBoZWlnaHQ9IjEwNjYiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlLSjhpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWUtLTWlNRWR5eE80RXN1UU9nVGciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZS0tjaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWUtLc2lNRWR5eE80RXN1UU9nVGciIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9oYVlLSzhpTUVkeXhPNEVzdVFPZ1RnIi8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZS0xNaU1FZHl4TzRFc3VRT2dUZyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9oYVlLTGNpTUVkeXhPNEVzdVFPZ1RnIi8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZS0xzaU1FZHl4TzRFc3VRT2dUZyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9oYVlLTDhpTUVkeXhPNEVzdVFPZ1RnIi8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZS01NaU1FZHl4TzRFc3VRT2dUZyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfaGFZS01jaU1FZHl4TzRFc3VRT2dUZyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfaGFZS01zaU1FZHl4TzRFc3VRT2dUZyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9oYVlLTThpTUVkeXhPNEVzdVFPZ1RnIiB4PSIxMjY2NiIgeT0iMTAyODciLz4NCi0gICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWUtOTWlNRWR5eE80RXN1UU9nVGciIGVsZW1lbnQ9Il9oYVlPRXNpTUVkeXhPNEVzdVFPZ1RnIj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZS05jaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfaGFZS05zaU1FZHl4TzRFc3VRT2dUZyIgd2lkdGg9IjQzNjgiIGhlaWdodD0iMTE2OCIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWUtOOGlNRWR5eE80RXN1UU9nVGciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZS09NaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlLT2NpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZS09zaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX2hhWUtPOGlNRWR5eE80RXN1UU9nVGciLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlLUE1pTUVkeXhPNEVzdVFPZ1RnIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX2hhWUtQY2lNRWR5eE80RXN1UU9nVGciLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlLUHNpTUVkeXhPNEVzdVFPZ1RnIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX2hhWUtQOGlNRWR5eE80RXN1UU9nVGciLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlLUU1pTUVkeXhPNEVzdVFPZ1RnIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9oYVlLUWNpTUVkeXhPNEVzdVFPZ1RnIiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9oYVlLUXNpTUVkeXhPNEVzdVFPZ1RnIiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iTm9uZSIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX2hhWUtROGlNRWR5eE80RXN1UU9nVGciIHg9IjEyMTQxIiB5PSIyOTcxIi8+DQotICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlLUk1pTUVkeXhPNEVzdVFPZ1RnIiBlbGVtZW50PSJfaGFZT01NaU1FZHl4TzRFc3VRT2dUZyI+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWUtSY2lNRWR5eE80RXN1UU9nVGciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX2hhWUtSc2lNRWR5eE80RXN1UU9nVGciIHdpZHRoPSIyOTEyIiBoZWlnaHQ9IjEwNjYiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlLUjhpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWUtTTWlNRWR5eE80RXN1UU9nVGciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZS1NjaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWUtTc2lNRWR5eE80RXN1UU9nVGciIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9oYVlLUzhpTUVkeXhPNEVzdVFPZ1RnIi8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZS1RNaU1FZHl4TzRFc3VRT2dUZyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9oYVlLVGNpTUVkeXhPNEVzdVFPZ1RnIi8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZS1RzaU1FZHl4TzRFc3VRT2dUZyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9oYVlLVDhpTUVkeXhPNEVzdVFPZ1RnIi8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZS1VNaU1FZHl4TzRFc3VRT2dUZyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfaGFZS1VjaU1FZHl4TzRFc3VRT2dUZyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfaGFZS1VzaU1FZHl4TzRFc3VRT2dUZyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9oYVlLVThpTUVkeXhPNEVzdVFPZ1RnIiB4PSI0Mzg1IiB5PSIxMDIzNiIvPg0KLSAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZS1ZNaU1FZHl4TzRFc3VRT2dUZyIgZWxlbWVudD0iX2hhWU9BTWlNRWR5eE80RXN1UU9nVGciPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlLVmNpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9oYVlLVnNpTUVkeXhPNEVzdVFPZ1RnIiB3aWR0aD0iMjc2MCIgaGVpZ2h0PSIxMTUxIi8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZS1Y4aU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlLV01pTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWUtXY2lNRWR5eE80RXN1UU9nVGciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlLV3NpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfaGFZS1c4aU1FZHl4TzRFc3VRT2dUZyIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWUtYTWlNRWR5eE80RXN1UU9nVGciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfaGFZS1hjaU1FZHl4TzRFc3VRT2dUZyIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWUtYc2lNRWR5eE80RXN1UU9nVGciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfaGFZS1g4aU1FZHl4TzRFc3VRT2dUZyIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWUtZTWlNRWR5eE80RXN1UU9nVGciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX2hhWUtZY2lNRWR5eE80RXN1UU9nVGciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX2hhWUtZc2lNRWR5eE80RXN1UU9nVGciIHNob3dMaXN0U3RlcmVvdHlwZT0iTm9uZSIgc2hvd0xpc3RWaXNpYmlsaXR5PSJOb25lIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfaGFZS1k4aU1FZHl4TzRFc3VRT2dUZyIgeD0iMTMxNDgiIHk9IjY5NDIiLz4NCi0gICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWUtaTWlNRWR5eE80RXN1UU9nVGciIGVsZW1lbnQ9Il9oYVlPUU1pTUVkeXhPNEVzdVFPZ1RnIj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZS1pjaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfaGFZS1pzaU1FZHl4TzRFc3VRT2dUZyIgd2lkdGg9IjI4NzgiIGhlaWdodD0iMTU3NCIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWUtaOGlNRWR5eE80RXN1UU9nVGciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZS2FNaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlLYWNpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZS2FzaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX2hhWUthOGlNRWR5eE80RXN1UU9nVGciLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlLYk1pTUVkeXhPNEVzdVFPZ1RnIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX2hhWUtiY2lNRWR5eE80RXN1UU9nVGciLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlLYnNpTUVkeXhPNEVzdVFPZ1RnIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX2hhWUtiOGlNRWR5eE80RXN1UU9nVGciLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlLY01pTUVkeXhPNEVzdVFPZ1RnIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9oYVlLY2NpTUVkeXhPNEVzdVFPZ1RnIiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9oYVlLY3NpTUVkeXhPNEVzdVFPZ1RnIiBzaG93TGlzdFN0ZXJlb3R5cGU9Ik5vbmUiIHNob3dMaXN0VmlzaWJpbGl0eT0iTm9uZSIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX2hhWUtjOGlNRWR5eE80RXN1UU9nVGciIHg9IjIyMjMzIiB5PSI2NjgwIi8+DQotICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlLZE1pTUVkeXhPNEVzdVFPZ1RnIiBlbGVtZW50PSJfaGFZT1djaU1FZHl4TzRFc3VRT2dUZyI+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWUtkY2lNRWR5eE80RXN1UU9nVGciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX2hhWUtkc2lNRWR5eE80RXN1UU9nVGciIHdpZHRoPSIzODQzIiBoZWlnaHQ9IjExNTEiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlLZDhpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWUtlTWlNRWR5eE80RXN1UU9nVGciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZS2VjaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWUtlc2lNRWR5eE80RXN1UU9nVGciIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9oYVlLZThpTUVkeXhPNEVzdVFPZ1RnIi8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZS2ZNaU1FZHl4TzRFc3VRT2dUZyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9oYVlLZmNpTUVkeXhPNEVzdVFPZ1RnIi8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZS2ZzaU1FZHl4TzRFc3VRT2dUZyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9oYVlLZjhpTUVkeXhPNEVzdVFPZ1RnIi8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZS2dNaU1FZHl4TzRFc3VRT2dUZyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfaGFZS2djaU1FZHl4TzRFc3VRT2dUZyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfaGFZS2dzaU1FZHl4TzRFc3VRT2dUZyIgc2hvd0xpc3RTdGVyZW90eXBlPSJOb25lIiBzaG93TGlzdFZpc2liaWxpdHk9Ik5vbmUiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9oYVlLZzhpTUVkeXhPNEVzdVFPZ1RnIiB4PSIxMTEzMyIgeT0iMTU0MjYiLz4NCi0gICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWUtoTWlNRWR5eE80RXN1UU9nVGciIGVsZW1lbnQ9Il9oYVlPVGNpTUVkeXhPNEVzdVFPZ1RnIj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZS2hjaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfaGFZS2hzaU1FZHl4TzRFc3VRT2dUZyIgd2lkdGg9IjMwODEiIGhlaWdodD0iMTU3NCIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWUtoOGlNRWR5eE80RXN1UU9nVGciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZS2lNaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlLaWNpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZS2lzaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX2hhWUtpOGlNRWR5eE80RXN1UU9nVGciLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlLak1pTUVkeXhPNEVzdVFPZ1RnIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX2hhWUtqY2lNRWR5eE80RXN1UU9nVGciLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlLanNpTUVkeXhPNEVzdVFPZ1RnIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX2hhWUtqOGlNRWR5eE80RXN1UU9nVGciLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlLa01pTUVkeXhPNEVzdVFPZ1RnIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9oYVlLa2NpTUVkeXhPNEVzdVFPZ1RnIiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9oYVlLa3NpTUVkeXhPNEVzdVFPZ1RnIiBzaG93TGlzdFN0ZXJlb3R5cGU9Ik5vbmUiIHNob3dMaXN0VmlzaWJpbGl0eT0iTm9uZSIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX2hhWUtrOGlNRWR5eE80RXN1UU9nVGciIHg9IjE3NzYzIiB5PSIxMjQyMCIvPg0KLSAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZS2xNaU1FZHl4TzRFc3VRT2dUZyIgZWxlbWVudD0iX2hhWU9aY2lNRWR5eE80RXN1UU9nVGciPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlLbGNpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9oYVlLbHNpTUVkeXhPNEVzdVFPZ1RnIiB3aWR0aD0iNTIxNSIgaGVpZ2h0PSIxMTUxIi8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZS2w4aU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlLbU1pTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWUttY2lNRWR5eE80RXN1UU9nVGciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlLbXNpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfaGFZS204aU1FZHl4TzRFc3VRT2dUZyIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWUtuTWlNRWR5eE80RXN1UU9nVGciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfaGFZS25jaU1FZHl4TzRFc3VRT2dUZyIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWUtuc2lNRWR5eE80RXN1UU9nVGciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfaGFZS244aU1FZHl4TzRFc3VRT2dUZyIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWUtvTWlNRWR5eE80RXN1UU9nVGciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX2hhWUtvY2lNRWR5eE80RXN1UU9nVGciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX2hhWUtvc2lNRWR5eE80RXN1UU9nVGciIHNob3dMaXN0U3RlcmVvdHlwZT0iTm9uZSIgc2hvd0xpc3RWaXNpYmlsaXR5PSJOb25lIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfaGFZS284aU1FZHl4TzRFc3VRT2dUZyIgeD0iMzUzOSIgeT0iMTc4NjQiLz4NCi0gICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWUt0TWlNRWR5eE80RXN1UU9nVGciIGVsZW1lbnQ9Il9oYVlPYThpTUVkeXhPNEVzdVFPZ1RnIj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZS3RjaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfaGFZS3RzaU1FZHl4TzRFc3VRT2dUZyIgd2lkdGg9IjQ1MjEiIGhlaWdodD0iMTA2NiIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWUt0OGlNRWR5eE80RXN1UU9nVGciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZS3VNaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlLdWNpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZS3VzaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX2hhWUt1OGlNRWR5eE80RXN1UU9nVGciLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlLdk1pTUVkeXhPNEVzdVFPZ1RnIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX2hhWUt2Y2lNRWR5eE80RXN1UU9nVGciLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlLdnNpTUVkeXhPNEVzdVFPZ1RnIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX2hhWUt2OGlNRWR5eE80RXN1UU9nVGciLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlLd01pTUVkeXhPNEVzdVFPZ1RnIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9oYVlLd2NpTUVkeXhPNEVzdVFPZ1RnIiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9oYVlLd3NpTUVkeXhPNEVzdVFPZ1RnIiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX2hhWUt3OGlNRWR5eE80RXN1UU9nVGciIHg9IjE2Nzg5IiB5PSIxODExMCIvPg0KLSAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZS3hNaU1FZHl4TzRFc3VRT2dUZyIgZWxlbWVudD0iX2hhWU9kY2lNRWR5eE80RXN1UU9nVGciPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlLeGNpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9oYVlLeHNpTUVkeXhPNEVzdVFPZ1RnIiB3aWR0aD0iMjM4NyIgaGVpZ2h0PSIxMTUxIi8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZS3g4aU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlLeU1pTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWUt5Y2lNRWR5eE80RXN1UU9nVGciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlLeXNpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfaGFZS3k4aU1FZHl4TzRFc3VRT2dUZyIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWUt6TWlNRWR5eE80RXN1UU9nVGciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfaGFZS3pjaU1FZHl4TzRFc3VRT2dUZyIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWUt6c2lNRWR5eE80RXN1UU9nVGciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfaGFZS3o4aU1FZHl4TzRFc3VRT2dUZyIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWUswTWlNRWR5eE80RXN1UU9nVGciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX2hhWUswY2lNRWR5eE80RXN1UU9nVGciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX2hhWUswc2lNRWR5eE80RXN1UU9nVGciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfaGFZSzA4aU1FZHl4TzRFc3VRT2dUZyIgeD0iMjY0NDEiIHk9IjEwNzAxIi8+DQotICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlLMU1pTUVkeXhPNEVzdVFPZ1RnIiBlbGVtZW50PSJfaGFZT2Q4aU1FZHl4TzRFc3VRT2dUZyI+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWUsxY2lNRWR5eE80RXN1UU9nVGciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX2hhWUsxc2lNRWR5eE80RXN1UU9nVGciIHdpZHRoPSIyMzM2IiBoZWlnaHQ9IjExNTEiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlLMThpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWUsyTWlNRWR5eE80RXN1UU9nVGciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZSzJjaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWUsyc2lNRWR5eE80RXN1UU9nVGciIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9oYVlLMjhpTUVkeXhPNEVzdVFPZ1RnIi8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZSzNNaU1FZHl4TzRFc3VRT2dUZyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9oYVlLM2NpTUVkeXhPNEVzdVFPZ1RnIi8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZSzNzaU1FZHl4TzRFc3VRT2dUZyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9oYVlLMzhpTUVkeXhPNEVzdVFPZ1RnIi8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZSzRNaU1FZHl4TzRFc3VRT2dUZyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfaGFZSzRjaU1FZHl4TzRFc3VRT2dUZyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfaGFZSzRzaU1FZHl4TzRFc3VRT2dUZyIgc2hvd0xpc3RTdGVyZW90eXBlPSJOb25lIiBzaG93TGlzdFZpc2liaWxpdHk9Ik5vbmUiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9oYVlLNDhpTUVkeXhPNEVzdVFPZ1RnIiB4PSIyMjUwNyIgeT0iMTM5NDgiLz4NCi0gICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWUs1TWlNRWR5eE80RXN1UU9nVGciIGVsZW1lbnQ9Il9oYVlPZmNpTUVkeXhPNEVzdVFPZ1RnIj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZSzVjaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfaGFZSzVzaU1FZHl4TzRFc3VRT2dUZyIgd2lkdGg9IjMzODYiIGhlaWdodD0iMTU3NCIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWUs1OGlNRWR5eE80RXN1UU9nVGciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZSzZNaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlLNmNpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZSzZzaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX2hhWUs2OGlNRWR5eE80RXN1UU9nVGciLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlLN01pTUVkeXhPNEVzdVFPZ1RnIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX2hhWUs3Y2lNRWR5eE80RXN1UU9nVGciLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlLN3NpTUVkeXhPNEVzdVFPZ1RnIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX2hhWUs3OGlNRWR5eE80RXN1UU9nVGciLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlLOE1pTUVkeXhPNEVzdVFPZ1RnIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9oYVlLOGNpTUVkeXhPNEVzdVFPZ1RnIiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9oYVlLOHNpTUVkeXhPNEVzdVFPZ1RnIiBzaG93TGlzdFN0ZXJlb3R5cGU9Ik5vbmUiIHNob3dMaXN0VmlzaWJpbGl0eT0iTm9uZSIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX2hhWUs4OGlNRWR5eE80RXN1UU9nVGciIHg9IjI1MzgzIiB5PSIxMzg0MyIvPg0KLSAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZSzlNaU1FZHl4TzRFc3VRT2dUZyIgZWxlbWVudD0iX2hhWU9oOGlNRWR5eE80RXN1UU9nVGciPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlLOWNpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9oYVlLOXNpTUVkeXhPNEVzdVFPZ1RnIiB3aWR0aD0iMjk5NyIgaGVpZ2h0PSIxMTUxIi8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZSzk4aU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlLLU1pTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWUstY2lNRWR5eE80RXN1UU9nVGciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlLLXNpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfaGFZSy04aU1FZHl4TzRFc3VRT2dUZyIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWUtfTWlNRWR5eE80RXN1UU9nVGciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfaGFZS19jaU1FZHl4TzRFc3VRT2dUZyIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWUtfc2lNRWR5eE80RXN1UU9nVGciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfaGFZS184aU1FZHl4TzRFc3VRT2dUZyIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWUxBTWlNRWR5eE80RXN1UU9nVGciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX2hhWUxBY2lNRWR5eE80RXN1UU9nVGciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX2hhWUxBc2lNRWR5eE80RXN1UU9nVGciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfaGFZTEE4aU1FZHl4TzRFc3VRT2dUZyIgeD0iMjg4NzkiIHk9IjEzODUxIi8+DQotICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlMQk1pTUVkeXhPNEVzdVFPZ1RnIiBlbGVtZW50PSJfaGFZT2tNaU1FZHl4TzRFc3VRT2dUZyI+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWUxCY2lNRWR5eE80RXN1UU9nVGciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX2hhWUxCc2lNRWR5eE80RXN1UU9nVGciIHdpZHRoPSIzNDU0IiBoZWlnaHQ9IjMzMDIiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlMQjhpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWUxDTWlNRWR5eE80RXN1UU9nVGciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTENjaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWUxDc2lNRWR5eE80RXN1UU9nVGciIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9oYVlMQzhpTUVkeXhPNEVzdVFPZ1RnIi8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTERNaU1FZHl4TzRFc3VRT2dUZyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9oYVlMRGNpTUVkeXhPNEVzdVFPZ1RnIi8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTERzaU1FZHl4TzRFc3VRT2dUZyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9oYVlMRDhpTUVkeXhPNEVzdVFPZ1RnIi8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTEVNaU1FZHl4TzRFc3VRT2dUZyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfaGFZTEVjaU1FZHl4TzRFc3VRT2dUZyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfaGFZTEVzaU1FZHl4TzRFc3VRT2dUZyIgc2hvd0xpc3RTdGVyZW90eXBlPSJOb25lIiBzaG93TGlzdFZpc2liaWxpdHk9Ik5vbmUiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9oYVlMRThpTUVkeXhPNEVzdVFPZ1RnIiB4PSIzMTM5NCIgeT0iMTc0NDkiLz4NCi0gICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWUxGTWlNRWR5eE80RXN1UU9nVGciIGVsZW1lbnQ9Il9oYVlOX2NpTUVkeXhPNEVzdVFPZ1RnIj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTEZjaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfaGFZTEZzaU1FZHl4TzRFc3VRT2dUZyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWUxGOGlNRWR5eE80RXN1UU9nVGciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTEdNaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlMR2NpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTEdzaU1FZHl4TzRFc3VRT2dUZyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9oYVlMRzhpTUVkeXhPNEVzdVFPZ1RnIi8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTEhNaU1FZHl4TzRFc3VRT2dUZyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9oYVlMSGNpTUVkeXhPNEVzdVFPZ1RnIi8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTEhzaU1FZHl4TzRFc3VRT2dUZyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9oYVlMSDhpTUVkeXhPNEVzdVFPZ1RnIi8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTElNaU1FZHl4TzRFc3VRT2dUZyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfaGFZTEljaU1FZHl4TzRFc3VRT2dUZyIgY2Fub25pY2FsPSJmYWxzZSIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfaGFZTElzaU1FZHl4TzRFc3VRT2dUZyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4NCi0gICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9oYVlMSThpTUVkeXhPNEVzdVFPZ1RnIiB4PSIyNzUyMCIgeT0iMjAxMTgiLz4NCi0gICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWUxKTWlNRWR5eE80RXN1UU9nVGciIGVsZW1lbnQ9Il9oYVlPaWNpTUVkeXhPNEVzdVFPZ1RnIj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTEpjaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfaGFZTEpzaU1FZHl4TzRFc3VRT2dUZyIgd2lkdGg9IjQwODAiIGhlaWdodD0iMTE1MSIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWUxKOGlNRWR5eE80RXN1UU9nVGciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTEtNaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlMS2NpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTEtzaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX2hhWUxLOGlNRWR5eE80RXN1UU9nVGciLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlMTE1pTUVkeXhPNEVzdVFPZ1RnIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX2hhWUxMY2lNRWR5eE80RXN1UU9nVGciLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlMTHNpTUVkeXhPNEVzdVFPZ1RnIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX2hhWUxMOGlNRWR5eE80RXN1UU9nVGciLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlMTU1pTUVkeXhPNEVzdVFPZ1RnIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9oYVlMTWNpTUVkeXhPNEVzdVFPZ1RnIiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9oYVlMTXNpTUVkeXhPNEVzdVFPZ1RnIiBzaG93TGlzdFN0ZXJlb3R5cGU9Ik5vbmUiIHNob3dMaXN0VmlzaWJpbGl0eT0iTm9uZSIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX2hhWUxNOGlNRWR5eE80RXN1UU9nVGciIHg9IjI3MDY3IiB5PSIxNzQ1OCIvPg0KLSAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTFZNaU1FZHl4TzRFc3VRT2dUZyIgZWxlbWVudD0iX2hhWU9jTWlNRWR5eE80RXN1UU9nVGciPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlMVmNpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9oYVlMVnNpTUVkeXhPNEVzdVFPZ1RnIiB3aWR0aD0iNDUyMSIgaGVpZ2h0PSIxMDY2Ii8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTFY4aU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlMV01pTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWUxXY2lNRWR5eE80RXN1UU9nVGciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlMV3NpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfaGFZTFc4aU1FZHl4TzRFc3VRT2dUZyIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWUxYTWlNRWR5eE80RXN1UU9nVGciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfaGFZTFhjaU1FZHl4TzRFc3VRT2dUZyIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWUxYc2lNRWR5eE80RXN1UU9nVGciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfaGFZTFg4aU1FZHl4TzRFc3VRT2dUZyIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWUxZTWlNRWR5eE80RXN1UU9nVGciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX2hhWUxZY2lNRWR5eE80RXN1UU9nVGciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX2hhWUxZc2lNRWR5eE80RXN1UU9nVGciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfaGFZTFk4aU1FZHl4TzRFc3VRT2dUZyIgeD0iMTA2NDIiIHk9IjE4MjExIi8+DQotICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9nMnllc01pTkVkeXhPNEVzdVFPZ1RnIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjgwIj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfZzJ5ZXM4aU5FZHl4TzRFc3VRT2dUZyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfZzJ5ZXRNaU5FZHl4TzRFc3VRT2dUZyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2cyeWV0Y2lORWR5eE80RXN1UU9nVGciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfZzJ5ZXRzaU5FZHl4TzRFc3VRT2dUZyIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9nMnlldDhpTkVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJQYXJlbnQiLz4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfZzJ5ZXVNaU5FZHl4TzRFc3VRT2dUZyIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX2cyeWV1Y2lORWR5eE80RXN1UU9nVGciLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9nMnlldXNpTkVkeXhPNEVzdVFPZ1RnIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX2cyeWV1OGlORWR5eE80RXN1UU9nVGciLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9nMnlldk1pTkVkeXhPNEVzdVFPZ1RnIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX2cyeWV2Y2lORWR5eE80RXN1UU9nVGciLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9nMnlldnNpTkVkeXhPNEVzdVFPZ1RnIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9nMnlldjhpTkVkeXhPNEVzdVFPZ1RnIi8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9nMnllc2NpTkVkeXhPNEVzdVFPZ1RnIiBzaG93TGlzdFN0ZXJlb3R5cGU9Ik5vbmUiIHNob3dMaXN0VmlzaWJpbGl0eT0iTm9uZSIgbGluZUNvbG9yPSIwIiBzaG93UGFyZW50PSJOYW1lIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX2cyeWVzc2lORWR5eE80RXN1UU9nVGciIHg9IjExNzQ1IiB5PSIxMzAiLz4NCi0gICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3FJQUxZTWlORWR5eE80RXN1UU9nVGciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyODAiPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9xSUFMWThpTkVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9xSUFMWk1pTkVkeXhPNEVzdVFPZ1RnIiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfcUlBTFpjaU5FZHl4TzRFc3VRT2dUZyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9xSUFMWnNpTkVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3FJQUxaOGlORWR5eE80RXN1UU9nVGciIHR5cGU9IlBhcmVudCIvPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9xSUFMYU1pTkVkeXhPNEVzdVFPZ1RnIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX3FJQUxhY2lORWR5eE80RXN1UU9nVGciLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9xSUFMYXNpTkVkeXhPNEVzdVFPZ1RnIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX3FJQUxhOGlORWR5eE80RXN1UU9nVGciLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9xSUFMYk1pTkVkeXhPNEVzdVFPZ1RnIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX3FJQUxiY2lORWR5eE80RXN1UU9nVGciLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9xSUFMYnNpTkVkeXhPNEVzdVFPZ1RnIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9xSUFMYjhpTkVkeXhPNEVzdVFPZ1RnIi8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9xSUFMWWNpTkVkeXhPNEVzdVFPZ1RnIiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93UGFyZW50PSJOYW1lIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX3FJQUxZc2lORWR5eE80RXN1UU9nVGciIHg9IjE3MzI3IiB5PSIyMDM0NCIvPg0KLSAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfdEE3Z1VNaU5FZHl4TzRFc3VRT2dUZyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRERFNjY4MDBDRSI+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3RBN2dVOGlORWR5eE80RXN1UU9nVGciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX3RBN2dWTWlORWR5eE80RXN1UU9nVGciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il90QTdnVmNpTkVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3RBN2dWc2lORWR5eE80RXN1UU9nVGciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfdEE3Z1Y4aU5FZHl4TzRFc3VRT2dUZyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3RBN2dXTWlORWR5eE80RXN1UU9nVGciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfdEE3Z1djaU5FZHl4TzRFc3VRT2dUZyIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3RBN2dXc2lORWR5eE80RXN1UU9nVGciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfdEE3Z1c4aU5FZHl4TzRFc3VRT2dUZyIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3RBN2dYTWlORWR5eE80RXN1UU9nVGciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfdEE3Z1hjaU5FZHl4TzRFc3VRT2dUZyIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3RBN2dYc2lORWR5eE80RXN1UU9nVGciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX3RBN2dYOGlORWR5eE80RXN1UU9nVGciLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX3RBN2dVY2lORWR5eE80RXN1UU9nVGciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dQYXJlbnQ9Ik5hbWUiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+DQotICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfdEE3Z1VzaU5FZHl4TzRFc3VRT2dUZyIgeD0iMTE1MzQiIHk9IjIwMjQwIi8+DQotICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTERpYWdyYW1TdHlsZSIgeG1pOmlkPSJfaGFZTFpNaU1FZHl4TzRFc3VRT2dUZyIgZGVzY3JpcHRpb249IlRoaXMgZGlhZ3JhbSBzaG93cyB0aGUgYWxtb3N0IGV4YWN0IGltcGxlbWVudGF0aW9uIG9mIHRoZSBVTUwgMi4wIERpYWdyYW0gSW50ZXJjaGFuZ2UgTWV0YS1Nb2RlbC4gIFNvbWUgZXh0ZW5zaW9ucyBoYWQgYmVlbiBhZGRlZCwgZS5nLiBkZXJyaXZpbmcgYWxsIG5vbi12YWx1ZSBjbGFzc2VzIGZyb20gTWV0aG9kRWxlbWVudC4gQW5vdGhlciBtaW5vciBkaWZmZXJlbmNlIHRvIHRoZSBzdGFuZGFyZCBpcyB0aGF0IFJvc2UvRU1GIGRvIG5vdCBzdXBwb3J0IGF0dHJpYnV0ZSBhcnJheXMsIHdoaWNoIGhhcyBiZWVuIG1vZGVsZWQgaGVyZSB3aXRoIGFzc29jaWF0aW9ucy4gIEZvciBkb2N1bWVudGF0aW9uIG9mIHRoZSBpbmRpdmlkdWFsIGNsYXNzZXMgc2VlIHRoZSBzdGFuZGFyZCBkb2N1bWVudCBhdCB3d3cudW1sLm9yZy4iLz4NCi0gICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPg0KLSAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfaGFZTFpjaU1FZHl4TzRFc3VRT2dUZyIgZWxlbWVudD0iX2hhWU9vY2lNRWR5eE80RXN1UU9nVGciIHNvdXJjZT0iX2hhWUtKTWlNRWR5eE80RXN1UU9nVGciIHRhcmdldD0iX2hhWUo5TWlNRWR5eE80RXN1UU9nVGciPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlMWnNpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWUxaOGlNRWR5eE80RXN1UU9nVGciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlMYU1pTUVkeXhPNEVzdVFPZ1RnIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfaGFZTGFjaU1FZHl4TzRFc3VRT2dUZyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWUxhc2lNRWR5eE80RXN1UU9nVGciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il9oYVlPb3NpTUVkeXhPNEVzdVFPZ1RnIj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlMYThpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9oYVlMYk1pTUVkeXhPNEVzdVFPZ1RnIiB4PSIyNyIgeT0iLTIyOSIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWUxiY2lNRWR5eE80RXN1UU9nVGciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iX2hhWU9vc2lNRWR5eE80RXN1UU9nVGciPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWUxic2lNRWR5eE80RXN1UU9nVGciIHR5cGU9IlRvUm9sZSIvPg0KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9oYVlMYjhpTUVkeXhPNEVzdVFPZ1RnIiB5PSItMzk3Ii8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTGNNaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfaGFZT1BjaU1FZHl4TzRFc3VRT2dUZyI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTGNjaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9oYVlMY3NpTUVkeXhPNEVzdVFPZ1RnIiB4PSItMTUwIiB5PSItNDQ5Ii8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTGM4aU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iX2hhWU9QY2lNRWR5eE80RXN1UU9nVGciPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWUxkTWlNRWR5eE80RXN1UU9nVGciIHR5cGU9IkZyb21Sb2xlIi8+DQotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX2hhWUxkY2lNRWR5eE80RXN1UU9nVGciIHg9Ii0zNzgiIHk9IjEzMzciLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlMZHNpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfaGFZT29zaU1FZHl4TzRFc3VRT2dUZyI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTGQ4aU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfaGFZTGVNaU1FZHl4TzRFc3VRT2dUZyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfaGFZTGVjaU1FZHl4TzRFc3VRT2dUZyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWUxlc2lNRWR5eE80RXN1UU9nVGciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iX2hhWU9QY2lNRWR5eE80RXN1UU9nVGciPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWUxlOGlNRWR5eE80RXN1UU9nVGciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX2hhWUxmTWlNRWR5eE80RXN1UU9nVGciLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX2hhWUxmY2lNRWR5eE80RXN1UU9nVGciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlMZnNpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iX2hhWU9vc2lNRWR5eE80RXN1UU9nVGciPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWUxmOGlNRWR5eE80RXN1UU9nVGciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX2hhWUxnTWlNRWR5eE80RXN1UU9nVGciLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX2hhWUxnY2lNRWR5eE80RXN1UU9nVGciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlMZ3NpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfaGFZT1BjaU1FZHl4TzRFc3VRT2dUZyI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTGc4aU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9oYVlMaE1pTUVkeXhPNEVzdVFPZ1RnIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9oYVlMaGNpTUVkeXhPNEVzdVFPZ1RnIiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfaGFZTGhzaU1FZHl4TzRFc3VRT2dUZyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9oYVlMaDhpTUVkeXhPNEVzdVFPZ1RnIiBwb2ludHM9IlstMTEwLCA1MjQsIC04LCAtMTk2NF0kWy0xMTAsIDIwNDgsIC04LCAtNDQwXSIvPg0KLSAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfaGFZTGlNaU1FZHl4TzRFc3VRT2dUZyIgZWxlbWVudD0iX2hhWU9tY2lNRWR5eE80RXN1UU9nVGciIHNvdXJjZT0iX2hhWUtCTWlNRWR5eE80RXN1UU9nVGciIHRhcmdldD0iX2hhWUtOTWlNRWR5eE80RXN1UU9nVGciPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlMaWNpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWUxpc2lNRWR5eE80RXN1UU9nVGciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlMaThpTUVkeXhPNEVzdVFPZ1RnIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfaGFZTGpNaU1FZHl4TzRFc3VRT2dUZyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWUxqY2lNRWR5eE80RXN1UU9nVGciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il9oYVlPR2NpTUVkeXhPNEVzdVFPZ1RnIj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlManNpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9oYVlMajhpTUVkeXhPNEVzdVFPZ1RnIiB4PSItMzQ5IiB5PSIxODYiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlMa01pTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iX2hhWU9HY2lNRWR5eE80RXN1UU9nVGciPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWUxrY2lNRWR5eE80RXN1UU9nVGciIHR5cGU9IlRvUm9sZSIvPg0KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9oYVlMa3NpTUVkeXhPNEVzdVFPZ1RnIiB4PSIyNzgiIHk9Ii0yODAiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlMazhpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il9oYVlPSThpTUVkeXhPNEVzdVFPZ1RnIj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlMbE1pTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX2hhWUxsY2lNRWR5eE80RXN1UU9nVGciIHg9IjQ1MCIgeT0iMTg2Ii8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTGxzaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iX2hhWU9JOGlNRWR5eE80RXN1UU9nVGciPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWUxsOGlNRWR5eE80RXN1UU9nVGciIHR5cGU9IkZyb21Sb2xlIi8+DQotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX2hhWUxtTWlNRWR5eE80RXN1UU9nVGciIHg9Ii00NzMiIHk9Ii0yNDYiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlMbWNpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfaGFZT0djaU1FZHl4TzRFc3VRT2dUZyI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTG1zaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfaGFZTG04aU1FZHl4TzRFc3VRT2dUZyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfaGFZTG5NaU1FZHl4TzRFc3VRT2dUZyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWUxuY2lNRWR5eE80RXN1UU9nVGciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iX2hhWU9JOGlNRWR5eE80RXN1UU9nVGciPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWUxuc2lNRWR5eE80RXN1UU9nVGciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX2hhWUxuOGlNRWR5eE80RXN1UU9nVGciLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX2hhWUxvTWlNRWR5eE80RXN1UU9nVGciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlMb2NpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iX2hhWU9HY2lNRWR5eE80RXN1UU9nVGciPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWUxvc2lNRWR5eE80RXN1UU9nVGciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX2hhWUxvOGlNRWR5eE80RXN1UU9nVGciLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX2hhWUxwTWlNRWR5eE80RXN1UU9nVGciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlMcGNpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfaGFZT0k4aU1FZHl4TzRFc3VRT2dUZyI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTHBzaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9oYVlMcDhpTUVkeXhPNEVzdVFPZ1RnIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9oYVlMcU1pTUVkeXhPNEVzdVFPZ1RnIiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfaGFZTHFjaU1FZHl4TzRFc3VRT2dUZyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9oYVlMcXNpTUVkeXhPNEVzdVFPZ1RnIiBwb2ludHM9IlstMzExNSwgMjYyLCA4MDA5LCA0MTRdJFstODk0MCwgMjYyLCAyMTg0LCA0MTRdIi8+DQotICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9oYVlMcThpTUVkeXhPNEVzdVFPZ1RnIiBlbGVtZW50PSJfaGFZT21zaU1FZHl4TzRFc3VRT2dUZyIgc291cmNlPSJfaGFZS05NaU1FZHl4TzRFc3VRT2dUZyIgdGFyZ2V0PSJfaGFZS0ZNaU1FZHl4TzRFc3VRT2dUZyI+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWUxyTWlNRWR5eE80RXN1UU9nVGciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTHJjaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWUxyc2lNRWR5eE80RXN1UU9nVGciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9oYVlMcjhpTUVkeXhPNEVzdVFPZ1RnIiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTHNNaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iX2hhWU9tOGlNRWR5eE80RXN1UU9nVGciPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWUxzY2lNRWR5eE80RXN1UU9nVGciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX2hhWUxzc2lNRWR5eE80RXN1UU9nVGciIHg9Ii04MiIgeT0iLTI4OCIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWUxzOGlNRWR5eE80RXN1UU9nVGciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iX2hhWU9tOGlNRWR5eE80RXN1UU9nVGciPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWUx0TWlNRWR5eE80RXN1UU9nVGciIHR5cGU9IlRvUm9sZSIvPg0KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9oYVlMdGNpTUVkeXhPNEVzdVFPZ1RnIiB5PSItMzk3Ii8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTHRzaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfaGFZT0hNaU1FZHl4TzRFc3VRT2dUZyI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTHQ4aU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9oYVlMdU1pTUVkeXhPNEVzdVFPZ1RnIiB4PSItNDcwIiB5PSIyMjEiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlMdWNpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfaGFZT0hNaU1FZHl4TzRFc3VRT2dUZyI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTHVzaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iRnJvbVJvbGUiLz4NCi0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfaGFZTHU4aU1FZHl4TzRFc3VRT2dUZyIgeD0iLTM3NyIgeT0iLTIwMyIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWUx2TWlNRWR5eE80RXN1UU9nVGciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il9oYVlPbThpTUVkeXhPNEVzdVFPZ1RnIj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlMdmNpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9oYVlMdnNpTUVkeXhPNEVzdVFPZ1RnIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9oYVlMdjhpTUVkeXhPNEVzdVFPZ1RnIiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTHdNaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfaGFZT0hNaU1FZHl4TzRFc3VRT2dUZyI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTHdjaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfaGFZTHdzaU1FZHl4TzRFc3VRT2dUZyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfaGFZTHc4aU1FZHl4TzRFc3VRT2dUZyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWUx4TWlNRWR5eE80RXN1UU9nVGciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfaGFZT204aU1FZHl4TzRFc3VRT2dUZyI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTHhjaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfaGFZTHhzaU1FZHl4TzRFc3VRT2dUZyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfaGFZTHg4aU1FZHl4TzRFc3VRT2dUZyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWUx5TWlNRWR5eE80RXN1UU9nVGciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il9oYVlPSE1pTUVkeXhPNEVzdVFPZ1RnIj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlMeWNpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX2hhWUx5c2lNRWR5eE80RXN1UU9nVGciLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX2hhWUx5OGlNRWR5eE80RXN1UU9nVGciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9oYVlMek1pTUVkeXhPNEVzdVFPZ1RnIiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX2hhWUx6Y2lNRWR5eE80RXN1UU9nVGciIHBvaW50cz0iWy0yMTg0LCA0MzEsIDQxMTQsIC0xNDQ3XSRbLTMxMTUsIDQzMSwgMzE4MywgLTE0NDddJFstMzExNSwgMjAzMiwgMzE4MywgMTUyXSRbLTUwMjAsIDIwMzIsIDEyNzgsIDE1Ml0iLz4NCi0gICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX2hhWUx6c2lNRWR5eE80RXN1UU9nVGciIGVsZW1lbnQ9Il9oYVlPb01pTUVkeXhPNEVzdVFPZ1RnIiBzb3VyY2U9Il9oYVlLUk1pTUVkeXhPNEVzdVFPZ1RnIiB0YXJnZXQ9Il9oYVlLSk1pTUVkeXhPNEVzdVFPZ1RnIj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTHo4aU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlMME1pTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTDBjaU1FZHl4TzRFc3VRT2dUZyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX2hhWUwwc2lNRWR5eE80RXN1UU9nVGciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlMMDhpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfaGFZT09zaU1FZHl4TzRFc3VRT2dUZyI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTDFNaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfaGFZTDFjaU1FZHl4TzRFc3VRT2dUZyIgeD0iLTQyMyIgeT0iLTIxOSIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWUwxc2lNRWR5eE80RXN1UU9nVGciIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfaGFZT09zaU1FZHl4TzRFc3VRT2dUZyI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTDE4aU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iVG9Sb2xlIi8+DQotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX2hhWUwyTWlNRWR5eE80RXN1UU9nVGciIHg9IjExMCIgeT0iMzMxIi8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTDJjaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfaGFZT05jaU1FZHl4TzRFc3VRT2dUZyI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTDJzaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9oYVlMMjhpTUVkeXhPNEVzdVFPZ1RnIiB4PSI1MSIgeT0iLTIzNiIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWUwzTWlNRWR5eE80RXN1UU9nVGciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il9oYVlPTmNpTUVkeXhPNEVzdVFPZ1RnIj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlMM2NpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJGcm9tUm9sZSIvPg0KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9oYVlMM3NpTUVkeXhPNEVzdVFPZ1RnIiB4PSItNDk5IiB5PSIyOTciLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlMMzhpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfaGFZT09zaU1FZHl4TzRFc3VRT2dUZyI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTDRNaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfaGFZTDRjaU1FZHl4TzRFc3VRT2dUZyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfaGFZTDRzaU1FZHl4TzRFc3VRT2dUZyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWUw0OGlNRWR5eE80RXN1UU9nVGciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iX2hhWU9OY2lNRWR5eE80RXN1UU9nVGciPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWUw1TWlNRWR5eE80RXN1UU9nVGciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX2hhWUw1Y2lNRWR5eE80RXN1UU9nVGciLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX2hhWUw1c2lNRWR5eE80RXN1UU9nVGciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlMNThpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iX2hhWU9Pc2lNRWR5eE80RXN1UU9nVGciPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWUw2TWlNRWR5eE80RXN1UU9nVGciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX2hhWUw2Y2lNRWR5eE80RXN1UU9nVGciLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX2hhWUw2c2lNRWR5eE80RXN1UU9nVGciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlMNjhpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfaGFZT05jaU1FZHl4TzRFc3VRT2dUZyI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTDdNaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9oYVlMN2NpTUVkeXhPNEVzdVFPZ1RnIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9oYVlMN3NpTUVkeXhPNEVzdVFPZ1RnIiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfaGFZTDc4aU1FZHl4TzRFc3VRT2dUZyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9oYVlMOE1pTUVkeXhPNEVzdVFPZ1RnIiBwb2ludHM9IlsxNDU2LCAzMywgLTY0NjgsIC0xNl0kWzY4MjQsIDMzLCAtMTEwMCwgLTE2XSIvPg0KLSAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfaGFZTDhjaU1FZHl4TzRFc3VRT2dUZyIgZWxlbWVudD0iX2hhWU9tTWlNRWR5eE80RXN1UU9nVGciIHNvdXJjZT0iX2hhWUtWTWlNRWR5eE80RXN1UU9nVGciIHRhcmdldD0iX2hhWUtOTWlNRWR5eE80RXN1UU9nVGciPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlMOHNpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWUw4OGlNRWR5eE80RXN1UU9nVGciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlMOU1pTUVkeXhPNEVzdVFPZ1RnIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfaGFZTDljaU1FZHl4TzRFc3VRT2dUZyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWUw5c2lNRWR5eE80RXN1UU9nVGciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il9oYVlPRnNpTUVkeXhPNEVzdVFPZ1RnIj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlMOThpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9oYVlMLU1pTUVkeXhPNEVzdVFPZ1RnIiB4PSIyOTIiIHk9IjM5MCIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWUwtY2lNRWR5eE80RXN1UU9nVGciIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfaGFZT0ZzaU1FZHl4TzRFc3VRT2dUZyI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTC1zaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iVG9Sb2xlIi8+DQotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX2hhWUwtOGlNRWR5eE80RXN1UU9nVGciIHg9IjM0MyIgeT0iLTk1NyIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWUxfTWlNRWR5eE80RXN1UU9nVGciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iX2hhWU9BOGlNRWR5eE80RXN1UU9nVGciPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWUxfY2lNRWR5eE80RXN1UU9nVGciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfaGFZTF9zaU1FZHl4TzRFc3VRT2dUZyIgeD0iOTAiIHk9Ii0zODkiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlMXzhpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfaGFZT0E4aU1FZHl4TzRFc3VRT2dUZyI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTUFNaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iRnJvbVJvbGUiLz4NCi0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfaGFZTUFjaU1FZHl4TzRFc3VRT2dUZyIgeD0iLTMwMyIgeT0iLTExNjUiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlNQXNpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfaGFZT0ZzaU1FZHl4TzRFc3VRT2dUZyI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTUE4aU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfaGFZTUJNaU1FZHl4TzRFc3VRT2dUZyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfaGFZTUJjaU1FZHl4TzRFc3VRT2dUZyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWU1Cc2lNRWR5eE80RXN1UU9nVGciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iX2hhWU9BOGlNRWR5eE80RXN1UU9nVGciPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWU1COGlNRWR5eE80RXN1UU9nVGciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX2hhWU1DTWlNRWR5eE80RXN1UU9nVGciLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX2hhWU1DY2lNRWR5eE80RXN1UU9nVGciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlNQ3NpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iX2hhWU9Gc2lNRWR5eE80RXN1UU9nVGciPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWU1DOGlNRWR5eE80RXN1UU9nVGciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX2hhWU1ETWlNRWR5eE80RXN1UU9nVGciLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX2hhWU1EY2lNRWR5eE80RXN1UU9nVGciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlNRHNpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfaGFZT0E4aU1FZHl4TzRFc3VRT2dUZyI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTUQ4aU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9oYVlNRU1pTUVkeXhPNEVzdVFPZ1RnIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9oYVlNRWNpTUVkeXhPNEVzdVFPZ1RnIiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfaGFZTUVzaU1FZHl4TzRFc3VRT2dUZyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9oYVlNRThpTUVkeXhPNEVzdVFPZ1RnIiBwb2ludHM9IlstNDc0LCAtNTg0LCAtMjcwLCAzMzc4XSRbLTQ3NCwgLTMzNzgsIC0yNzAsIDU4NF0iLz4NCi0gICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX2hhWU1GTWlNRWR5eE80RXN1UU9nVGciIGVsZW1lbnQ9Il9oYVlPT2NpTUVkeXhPNEVzdVFPZ1RnIiBzb3VyY2U9Il9oYVlLSk1pTUVkeXhPNEVzdVFPZ1RnIiB0YXJnZXQ9Il9oYVlLVk1pTUVkeXhPNEVzdVFPZ1RnIj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTUZjaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlNRnNpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTUY4aU1FZHl4TzRFc3VRT2dUZyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX2hhWU1HTWlNRWR5eE80RXN1UU9nVGciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9oYVlNR2NpTUVkeXhPNEVzdVFPZ1RnIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfaGFZTUdzaU1FZHl4TzRFc3VRT2dUZyIgcG9pbnRzPSJbMTEwLCAtNTQxLCAtNjUxLCAyNzYwXSRbNjA5LCAtMjcyNiwgLTE1MiwgNTc1XSIvPg0KLSAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9oYVlNRzhpTUVkeXhPNEVzdVFPZ1RnIiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfaGFZTUhNaU1FZHl4TzRFc3VRT2dUZyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9oYVlNSGNpTUVkeXhPNEVzdVFPZ1RnIiBlbGVtZW50PSJfaGFZT1M4aU1FZHl4TzRFc3VRT2dUZyIgc291cmNlPSJfaGFZSjVNaU1FZHl4TzRFc3VRT2dUZyIgdGFyZ2V0PSJfaGFZS1ZNaU1FZHl4TzRFc3VRT2dUZyI+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWU1Ic2lNRWR5eE80RXN1UU9nVGciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTUg4aU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWU1JTWlNRWR5eE80RXN1UU9nVGciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9oYVlNSWNpTUVkeXhPNEVzdVFPZ1RnIiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfaGFZTUlzaU1FZHl4TzRFc3VRT2dUZyIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX2hhWU1JOGlNRWR5eE80RXN1UU9nVGciIHBvaW50cz0iWy05NDgsIC01ODQsIDM4MjYsIDIzMTFdJFstMzgxMCwgLTIzMTksIDk2NSwgNTc1XSIvPg0KLSAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9oYVlNSk1pTUVkeXhPNEVzdVFPZ1RnIiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfaGFZTUpjaU1FZHl4TzRFc3VRT2dUZyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9oYVlNSnNpTUVkeXhPNEVzdVFPZ1RnIiBlbGVtZW50PSJfaGFZT244aU1FZHl4TzRFc3VRT2dUZyIgc291cmNlPSJfaGFZS1ZNaU1FZHl4TzRFc3VRT2dUZyIgdGFyZ2V0PSJfaGFZS1JNaU1FZHl4TzRFc3VRT2dUZyI+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWU1KOGlNRWR5eE80RXN1UU9nVGciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTUtNaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWU1LY2lNRWR5eE80RXN1UU9nVGciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9oYVlNS3NpTUVkeXhPNEVzdVFPZ1RnIiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTUs4aU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iX2hhWU9Nc2lNRWR5eE80RXN1UU9nVGciPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWU1MTWlNRWR5eE80RXN1UU9nVGciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX2hhWU1MY2lNRWR5eE80RXN1UU9nVGciIHg9Ii03NzkiIHk9Ii0yNzEiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlNTHNpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iX2hhWU9Nc2lNRWR5eE80RXN1UU9nVGciPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWU1MOGlNRWR5eE80RXN1UU9nVGciIHR5cGU9IlRvUm9sZSIvPg0KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9oYVlNTU1pTUVkeXhPNEVzdVFPZ1RnIiB4PSI5NDkiIHk9Ii0zMzkiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlNTWNpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il9oYVlPQ2NpTUVkeXhPNEVzdVFPZ1RnIj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlNTXNpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX2hhWU1NOGlNRWR5eE80RXN1UU9nVGciIHg9IjkxNCIgeT0iLTQ1NyIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWU1OTWlNRWR5eE80RXN1UU9nVGciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il9oYVlPQ2NpTUVkeXhPNEVzdVFPZ1RnIj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlNTmNpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJGcm9tUm9sZSIvPg0KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9oYVlNTnNpTUVkeXhPNEVzdVFPZ1RnIiB4PSI4ODgiIHk9IjExOTQiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlNTjhpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfaGFZT01zaU1FZHl4TzRFc3VRT2dUZyI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTU9NaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfaGFZTU9jaU1FZHl4TzRFc3VRT2dUZyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfaGFZTU9zaU1FZHl4TzRFc3VRT2dUZyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWU1POGlNRWR5eE80RXN1UU9nVGciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iX2hhWU9DY2lNRWR5eE80RXN1UU9nVGciPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWU1QTWlNRWR5eE80RXN1UU9nVGciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX2hhWU1QY2lNRWR5eE80RXN1UU9nVGciLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX2hhWU1Qc2lNRWR5eE80RXN1UU9nVGciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlNUDhpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iX2hhWU9Nc2lNRWR5eE80RXN1UU9nVGciPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWU1RTWlNRWR5eE80RXN1UU9nVGciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX2hhWU1RY2lNRWR5eE80RXN1UU9nVGciLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX2hhWU1Rc2lNRWR5eE80RXN1UU9nVGciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlNUThpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfaGFZT0NjaU1FZHl4TzRFc3VRT2dUZyI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTVJNaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9oYVlNUmNpTUVkeXhPNEVzdVFPZ1RnIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9oYVlNUnNpTUVkeXhPNEVzdVFPZ1RnIiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfaGFZTVI4aU1FZHl4TzRFc3VRT2dUZyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9oYVlNU01pTUVkeXhPNEVzdVFPZ1RnIiBwb2ludHM9IlstMTM4MCwgMzEzLCA3MzA2LCAtMjkzN10kWy04MjI5LCAzMTMsIDQ1NywgLTI5MzddJFstODIyOSwgMjcxNywgNDU3LCAtNTMzXSIvPg0KLSAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfaGFZTVNjaU1FZHl4TzRFc3VRT2dUZyIgZWxlbWVudD0iX2hhWU9uc2lNRWR5eE80RXN1UU9nVGciIHNvdXJjZT0iX2hhWUtWTWlNRWR5eE80RXN1UU9nVGciIHRhcmdldD0iX2hhWUtaTWlNRWR5eE80RXN1UU9nVGciPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlNU3NpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWU1TOGlNRWR5eE80RXN1UU9nVGciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlNVE1pTUVkeXhPNEVzdVFPZ1RnIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfaGFZTVRjaU1FZHl4TzRFc3VRT2dUZyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWU1Uc2lNRWR5eE80RXN1UU9nVGciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il9oYVlPUk1pTUVkeXhPNEVzdVFPZ1RnIj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlNVDhpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9oYVlNVU1pTUVkeXhPNEVzdVFPZ1RnIiB4PSItMzIyIiB5PSIyMjAiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlNVWNpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iX2hhWU9STWlNRWR5eE80RXN1UU9nVGciPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWU1Vc2lNRWR5eE80RXN1UU9nVGciIHR5cGU9IlRvUm9sZSIvPg0KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9oYVlNVThpTUVkeXhPNEVzdVFPZ1RnIiB4PSI5OTkiIHk9Ii0yNTQiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlNVk1pTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il9oYVlPQnNpTUVkeXhPNEVzdVFPZ1RnIj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlNVmNpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX2hhWU1Wc2lNRWR5eE80RXN1UU9nVGciIHg9IjQ3NSIgeT0iMzEzIi8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTVY4aU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iX2hhWU9Cc2lNRWR5eE80RXN1UU9nVGciPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWU1XTWlNRWR5eE80RXN1UU9nVGciIHR5cGU9IkZyb21Sb2xlIi8+DQotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX2hhWU1XY2lNRWR5eE80RXN1UU9nVGciIHg9IjI5NyIgeT0iLTMzOSIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWU1Xc2lNRWR5eE80RXN1UU9nVGciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il9oYVlPUk1pTUVkeXhPNEVzdVFPZ1RnIj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlNVzhpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9oYVlNWE1pTUVkeXhPNEVzdVFPZ1RnIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9oYVlNWGNpTUVkeXhPNEVzdVFPZ1RnIiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTVhzaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfaGFZT0JzaU1FZHl4TzRFc3VRT2dUZyI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTVg4aU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfaGFZTVlNaU1FZHl4TzRFc3VRT2dUZyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfaGFZTVljaU1FZHl4TzRFc3VRT2dUZyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWU1Zc2lNRWR5eE80RXN1UU9nVGciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfaGFZT1JNaU1FZHl4TzRFc3VRT2dUZyI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTVk4aU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfaGFZTVpNaU1FZHl4TzRFc3VRT2dUZyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfaGFZTVpjaU1FZHl4TzRFc3VRT2dUZyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWU1ac2lNRWR5eE80RXN1UU9nVGciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il9oYVlPQnNpTUVkeXhPNEVzdVFPZ1RnIj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlNWjhpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX2hhWU1hTWlNRWR5eE80RXN1UU9nVGciLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX2hhWU1hY2lNRWR5eE80RXN1UU9nVGciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9oYVlNYXNpTUVkeXhPNEVzdVFPZ1RnIiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX2hhWU1hOGlNRWR5eE80RXN1UU9nVGciIHBvaW50cz0iWzEzODAsIC0xMTAsIC03NzYzLCAtNTldJFs3NzA0LCAtMTEwLCAtMTQzOSwgLTU5XSIvPg0KLSAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfaGFZTWJNaU1FZHl4TzRFc3VRT2dUZyIgZWxlbWVudD0iX2hhWU9wc2lNRWR5eE80RXN1UU9nVGciIHNvdXJjZT0iX2hhWUtWTWlNRWR5eE80RXN1UU9nVGciIHRhcmdldD0iX2hhWUtkTWlNRWR5eE80RXN1UU9nVGciPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlNYmNpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWU1ic2lNRWR5eE80RXN1UU9nVGciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlNYjhpTUVkeXhPNEVzdVFPZ1RnIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfaGFZTWNNaU1FZHl4TzRFc3VRT2dUZyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWU1jY2lNRWR5eE80RXN1UU9nVGciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il9oYVlPWDhpTUVkeXhPNEVzdVFPZ1RnIj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlNY3NpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9oYVlNYzhpTUVkeXhPNEVzdVFPZ1RnIiB4PSItMzEwMyIgeT0iLTI2MiIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWU1kTWlNRWR5eE80RXN1UU9nVGciIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfaGFZT1g4aU1FZHl4TzRFc3VRT2dUZyI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTWRjaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iVG9Sb2xlIi8+DQotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX2hhWU1kc2lNRWR5eE80RXN1UU9nVGciIHg9Ii0yMTgwIiB5PSIyMzgiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlNZDhpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il9oYVlPRE1pTUVkeXhPNEVzdVFPZ1RnIj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlNZU1pTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX2hhWU1lY2lNRWR5eE80RXN1UU9nVGciIHg9IjM1MTgiIHk9IjI0NiIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWU1lc2lNRWR5eE80RXN1UU9nVGciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il9oYVlPRE1pTUVkeXhPNEVzdVFPZ1RnIj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlNZThpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJGcm9tUm9sZSIvPg0KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9oYVlNZk1pTUVkeXhPNEVzdVFPZ1RnIiB4PSIyMDYyIiB5PSItMzU1Ii8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTWZjaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iX2hhWU9YOGlNRWR5eE80RXN1UU9nVGciPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWU1mc2lNRWR5eE80RXN1UU9nVGciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX2hhWU1mOGlNRWR5eE80RXN1UU9nVGciLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX2hhWU1nTWlNRWR5eE80RXN1UU9nVGciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlNZ2NpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il9oYVlPRE1pTUVkeXhPNEVzdVFPZ1RnIj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlNZ3NpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9oYVlNZzhpTUVkeXhPNEVzdVFPZ1RnIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9oYVlNaE1pTUVkeXhPNEVzdVFPZ1RnIiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTWhjaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il9oYVlPWDhpTUVkeXhPNEVzdVFPZ1RnIj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlNaHNpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9oYVlNaDhpTUVkeXhPNEVzdVFPZ1RnIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9oYVlNaU1pTUVkeXhPNEVzdVFPZ1RnIiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTWljaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iX2hhWU9ETWlNRWR5eE80RXN1UU9nVGciPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWU1pc2lNRWR5eE80RXN1UU9nVGciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfaGFZTWk4aU1FZHl4TzRFc3VRT2dUZyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfaGFZTWpNaU1FZHl4TzRFc3VRT2dUZyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX2hhWU1qY2lNRWR5eE80RXN1UU9nVGciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBzaG93TGlzdFZpc2liaWxpdHk9Ik5vbmUiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9oYVlNanNpTUVkeXhPNEVzdVFPZ1RnIiBwb2ludHM9IlstMTM4MCwgLTQwNiwgOTMsIC04ODkwXSRbLTEwODU0LCAtNDA2LCAtOTM4MSwgLTg4OTBdJFstMTA4NTQsIDgwODUsIC05MzgxLCAtMzk3XSRbLTMzOTUsIDgwODUsIC0xOTIxLCAtMzk3XSIvPg0KLSAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfaGFZTWo4aU1FZHl4TzRFc3VRT2dUZyIgZWxlbWVudD0iX2hhWU9Uc2lNRWR5eE80RXN1UU9nVGciIHNvdXJjZT0iX2hhWUtoTWlNRWR5eE80RXN1UU9nVGciIHRhcmdldD0iX2hhWUo1TWlNRWR5eE80RXN1UU9nVGciPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlNa01pTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWU1rY2lNRWR5eE80RXN1UU9nVGciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlNa3NpTUVkeXhPNEVzdVFPZ1RnIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfaGFZTWs4aU1FZHl4TzRFc3VRT2dUZyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX2hhWU1sTWlNRWR5eE80RXN1UU9nVGciIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9oYVlNbGNpTUVkeXhPNEVzdVFPZ1RnIiBwb2ludHM9IlswLCAtNzk1LCAwLCAxOTk4XSRbMCwgLTIyMTgsIDAsIDU3NV0iLz4NCi0gICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfaGFZTWxzaU1FZHl4TzRFc3VRT2dUZyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX2hhWU1sOGlNRWR5eE80RXN1UU9nVGciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfaGFZTW1NaU1FZHl4TzRFc3VRT2dUZyIgZWxlbWVudD0iX2hhWU9wY2lNRWR5eE80RXN1UU9nVGciIHNvdXJjZT0iX2hhWUtoTWlNRWR5eE80RXN1UU9nVGciIHRhcmdldD0iX2hhWUtaTWlNRWR5eE80RXN1UU9nVGciPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlNbWNpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWU1tc2lNRWR5eE80RXN1UU9nVGciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlNbThpTUVkeXhPNEVzdVFPZ1RnIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfaGFZTW5NaU1FZHl4TzRFc3VRT2dUZyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWU1uY2lNRWR5eE80RXN1UU9nVGciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il9oYVlPUjhpTUVkeXhPNEVzdVFPZ1RnIj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlNbnNpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9oYVlNbjhpTUVkeXhPNEVzdVFPZ1RnIiB4PSItODMzIiB5PSIzMzgiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlNb01pTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iX2hhWU9SOGlNRWR5eE80RXN1UU9nVGciPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWU1vY2lNRWR5eE80RXN1UU9nVGciIHR5cGU9IlRvUm9sZSIvPg0KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9oYVlNb3NpTUVkeXhPNEVzdVFPZ1RnIiB4PSItMjkxIiB5PSItMjk3Ii8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTW84aU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfaGFZT1U4aU1FZHl4TzRFc3VRT2dUZyI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTXBNaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9oYVlNcGNpTUVkeXhPNEVzdVFPZ1RnIiB4PSI3NjUiIHk9IjQ1NyIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWU1wc2lNRWR5eE80RXN1UU9nVGciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il9oYVlPVThpTUVkeXhPNEVzdVFPZ1RnIj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlNcDhpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJGcm9tUm9sZSIvPg0KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9oYVlNcU1pTUVkeXhPNEVzdVFPZ1RnIiB4PSI3NjUiIHk9Ii0xMzEzIi8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTXFjaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iX2hhWU9SOGlNRWR5eE80RXN1UU9nVGciPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWU1xc2lNRWR5eE80RXN1UU9nVGciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX2hhWU1xOGlNRWR5eE80RXN1UU9nVGciLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX2hhWU1yTWlNRWR5eE80RXN1UU9nVGciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlNcmNpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il9oYVlPVThpTUVkeXhPNEVzdVFPZ1RnIj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlNcnNpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9oYVlNcjhpTUVkeXhPNEVzdVFPZ1RnIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9oYVlNc01pTUVkeXhPNEVzdVFPZ1RnIiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTXNjaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il9oYVlPUjhpTUVkeXhPNEVzdVFPZ1RnIj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlNc3NpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9oYVlNczhpTUVkeXhPNEVzdVFPZ1RnIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9oYVlNdE1pTUVkeXhPNEVzdVFPZ1RnIiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTXRjaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iX2hhWU9VOGlNRWR5eE80RXN1UU9nVGciPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWU10c2lNRWR5eE80RXN1UU9nVGciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfaGFZTXQ4aU1FZHl4TzRFc3VRT2dUZyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfaGFZTXVNaU1FZHl4TzRFc3VRT2dUZyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX2hhWU11Y2lNRWR5eE80RXN1UU9nVGciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfaGFZTXVzaU1FZHl4TzRFc3VRT2dUZyIgcG9pbnRzPSJbMTU0MCwgMCwgLTI4MjcsIDU3NDBdJFs0Mjg0LCAwLCAtODQsIDU3NDBdJFs0Mjg0LCAtNDk1MywgLTg0LCA3ODddIi8+DQotICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9oYVlNdThpTUVkeXhPNEVzdVFPZ1RnIiBlbGVtZW50PSJfaGFZT3A4aU1FZHl4TzRFc3VRT2dUZyIgc291cmNlPSJfaGFZS2hNaU1FZHl4TzRFc3VRT2dUZyIgdGFyZ2V0PSJfaGFZS2RNaU1FZHl4TzRFc3VRT2dUZyI+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWU12TWlNRWR5eE80RXN1UU9nVGciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTXZjaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWU12c2lNRWR5eE80RXN1UU9nVGciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9oYVlNdjhpTUVkeXhPNEVzdVFPZ1RnIiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTXdNaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iX2hhWU9Zc2lNRWR5eE80RXN1UU9nVGciPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWU13Y2lNRWR5eE80RXN1UU9nVGciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX2hhWU13c2lNRWR5eE80RXN1UU9nVGciIHg9Ii0xMjkiIHk9Ii00NDgiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlNdzhpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iX2hhWU9Zc2lNRWR5eE80RXN1UU9nVGciPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWU14TWlNRWR5eE80RXN1UU9nVGciIHR5cGU9IlRvUm9sZSIvPg0KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9oYVlNeGNpTUVkeXhPNEVzdVFPZ1RnIiB4PSItMTEyIiB5PSI5MTYiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlNeHNpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il9oYVlPVnNpTUVkeXhPNEVzdVFPZ1RnIj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlNeDhpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX2hhWU15TWlNRWR5eE80RXN1UU9nVGciIHg9IjU2OSIgeT0iLTI4OCIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWU15Y2lNRWR5eE80RXN1UU9nVGciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il9oYVlPVnNpTUVkeXhPNEVzdVFPZ1RnIj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlNeXNpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJGcm9tUm9sZSIvPg0KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9oYVlNeThpTUVkeXhPNEVzdVFPZ1RnIiB4PSItNTQ5IiB5PSIyNzkiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlNek1pTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfaGFZT1lzaU1FZHl4TzRFc3VRT2dUZyI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTXpjaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfaGFZTXpzaU1FZHl4TzRFc3VRT2dUZyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfaGFZTXo4aU1FZHl4TzRFc3VRT2dUZyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWU0wTWlNRWR5eE80RXN1UU9nVGciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iX2hhWU9Wc2lNRWR5eE80RXN1UU9nVGciPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWU0wY2lNRWR5eE80RXN1UU9nVGciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX2hhWU0wc2lNRWR5eE80RXN1UU9nVGciLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX2hhWU0wOGlNRWR5eE80RXN1UU9nVGciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlNMU1pTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iX2hhWU9Zc2lNRWR5eE80RXN1UU9nVGciPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWU0xY2lNRWR5eE80RXN1UU9nVGciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX2hhWU0xc2lNRWR5eE80RXN1UU9nVGciLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX2hhWU0xOGlNRWR5eE80RXN1UU9nVGciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlNMk1pTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfaGFZT1ZzaU1FZHl4TzRFc3VRT2dUZyI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTTJjaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9oYVlNMnNpTUVkeXhPNEVzdVFPZ1RnIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9oYVlNMjhpTUVkeXhPNEVzdVFPZ1RnIiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfaGFZTTNNaU1FZHl4TzRFc3VRT2dUZyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9oYVlNM2NpTUVkeXhPNEVzdVFPZ1RnIiBwb2ludHM9IlstODQsIDc4NywgNjE2MywgLTIwMDZdJFstODQsIDI0MjksIDYxNjMsIC0zNjRdJFstNDMyNiwgMjQyOSwgMTkyMSwgLTM2NF0iLz4NCi0gICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX2hhWU0zc2lNRWR5eE80RXN1UU9nVGciIGVsZW1lbnQ9Il9oYVlPWnNpTUVkeXhPNEVzdVFPZ1RnIiBzb3VyY2U9Il9oYVlLbE1pTUVkeXhPNEVzdVFPZ1RnIiB0YXJnZXQ9Il9oYVlLZE1pTUVkeXhPNEVzdVFPZ1RnIj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTTM4aU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlNNE1pTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTTRjaU1FZHl4TzRFc3VRT2dUZyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX2hhWU00c2lNRWR5eE80RXN1UU9nVGciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9oYVlNNDhpTUVkeXhPNEVzdVFPZ1RnIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfaGFZTTVNaU1FZHl4TzRFc3VRT2dUZyIgcG9pbnRzPSJbMTYyNSwgLTU4NCwgLTUyODMsIDE4NTRdJFs1MjU3LCAtMTg2MiwgLTE2NTEsIDU3NV0iLz4NCi0gICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfaGFZTTVjaU1FZHl4TzRFc3VRT2dUZyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX2hhWU01c2lNRWR5eE80RXN1UU9nVGciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfaGFZTTU4aU1FZHl4TzRFc3VRT2dUZyIgZWxlbWVudD0iX2hhWU9iTWlNRWR5eE80RXN1UU9nVGciIHNvdXJjZT0iX2hhWUt0TWlNRWR5eE80RXN1UU9nVGciIHRhcmdldD0iX2hhWUtkTWlNRWR5eE80RXN1UU9nVGciPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlNNk1pTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWU02Y2lNRWR5eE80RXN1UU9nVGciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlNNnNpTUVkeXhPNEVzdVFPZ1RnIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfaGFZTTY4aU1FZHl4TzRFc3VRT2dUZyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX2hhWU03TWlNRWR5eE80RXN1UU9nVGciIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9oYVlNN2NpTUVkeXhPNEVzdVFPZ1RnIiBwb2ludHM9IlstMTIxMCwgLTU0MSwgNDc4MywgMjA5OV0kWy00NjkwLCAtMjA2NSwgMTMwMywgNTc1XSIvPg0KLSAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9oYVlNN3NpTUVkeXhPNEVzdVFPZ1RnIiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfaGFZTTc4aU1FZHl4TzRFc3VRT2dUZyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9oYVlNOE1pTUVkeXhPNEVzdVFPZ1RnIiBlbGVtZW50PSJfaGFZT3JNaU1FZHl4TzRFc3VRT2dUZyIgc291cmNlPSJfaGFZS3RNaU1FZHl4TzRFc3VRT2dUZyIgdGFyZ2V0PSJfcUlBTFlNaU5FZHl4TzRFc3VRT2dUZyI+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWU04Y2lNRWR5eE80RXN1UU9nVGciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTThzaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWU04OGlNRWR5eE80RXN1UU9nVGciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9oYVlNOU1pTUVkeXhPNEVzdVFPZ1RnIiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTTljaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iX2hhWU9yY2lNRWR5eE80RXN1UU9nVGciPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWU05c2lNRWR5eE80RXN1UU9nVGciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX2hhWU05OGlNRWR5eE80RXN1UU9nVGciIHg9IjYxIiB5PSIzMTQiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlNLU1pTUVkeXhPNEVzdVFPZ1RnIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il9oYVlPcmNpTUVkeXhPNEVzdVFPZ1RnIj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlNLWNpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJUb1JvbGUiLz4NCi0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfaGFZTS1zaU1FZHl4TzRFc3VRT2dUZyIgeT0iLTM5NyIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWU0tOGlNRWR5eE80RXN1UU9nVGciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iX2hhWU9iY2lNRWR5eE80RXN1UU9nVGciPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWU1fTWlNRWR5eE80RXN1UU9nVGciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfaGFZTV9jaU1FZHl4TzRFc3VRT2dUZyIgeD0iLTI5OCIgeT0iMjg4Ii8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTV9zaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iX2hhWU9iY2lNRWR5eE80RXN1UU9nVGciPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWU1fOGlNRWR5eE80RXN1UU9nVGciIHR5cGU9IkZyb21Sb2xlIi8+DQotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX2hhWU5BTWlNRWR5eE80RXN1UU9nVGciIHg9Ii0yOTgiIHk9Ii0xMTAwIi8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTkFjaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iX2hhWU9yY2lNRWR5eE80RXN1UU9nVGciPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWU5Bc2lNRWR5eE80RXN1UU9nVGciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX2hhWU5BOGlNRWR5eE80RXN1UU9nVGciLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX2hhWU5CTWlNRWR5eE80RXN1UU9nVGciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlOQmNpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il9oYVlPYmNpTUVkeXhPNEVzdVFPZ1RnIj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlOQnNpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9oYVlOQjhpTUVkeXhPNEVzdVFPZ1RnIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9oYVlOQ01pTUVkeXhPNEVzdVFPZ1RnIiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTkNjaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il9oYVlPcmNpTUVkeXhPNEVzdVFPZ1RnIj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlOQ3NpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9oYVlOQzhpTUVkeXhPNEVzdVFPZ1RnIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9oYVlORE1pTUVkeXhPNEVzdVFPZ1RnIiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTkRjaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iX2hhWU9iY2lNRWR5eE80RXN1UU9nVGciPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWU5Ec2lNRWR5eE80RXN1UU9nVGciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfaGFZTkQ4aU1FZHl4TzRFc3VRT2dUZyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfaGFZTkVNaU1FZHl4TzRFc3VRT2dUZyIgeT0iMTA1OCIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX2hhWU5FY2lNRWR5eE80RXN1UU9nVGciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfaGFZTkVzaU1FZHl4TzRFc3VRT2dUZyIgcG9pbnRzPSJbLTEzMiwgNDUwLCAxMDMyLCAtMTkzMl0kWy0xMzIsIDE3NDcsIDEwMzIsIC02MzVdIi8+DQotICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX3NSMWxzTWlORWR5eE80RXN1UU9nVGciIGlkPSIoMC4yMzE3MzAxNiwwLjYyMjA2MzM0KSIvPg0KLSAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfaGFZTkU4aU1FZHl4TzRFc3VRT2dUZyIgZWxlbWVudD0iX2hhWU9zTWlNRWR5eE80RXN1UU9nVGciIHNvdXJjZT0iX2hhWUxKTWlNRWR5eE80RXN1UU9nVGciIHRhcmdldD0iX2hhWUxGTWlNRWR5eE80RXN1UU9nVGciPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlORk1pTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWU5GY2lNRWR5eE80RXN1UU9nVGciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlORnNpTUVkeXhPNEVzdVFPZ1RnIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfaGFZTkY4aU1FZHl4TzRFc3VRT2dUZyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWU5HTWlNRWR5eE80RXN1UU9nVGciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il9oYVlPc2NpTUVkeXhPNEVzdVFPZ1RnIj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlOR2NpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9oYVlOR3NpTUVkeXhPNEVzdVFPZ1RnIiB4PSI2NSIgeT0iLTI2MiIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWU5HOGlNRWR5eE80RXN1UU9nVGciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iX2hhWU9zY2lNRWR5eE80RXN1UU9nVGciPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWU5ITWlNRWR5eE80RXN1UU9nVGciIHR5cGU9IlRvUm9sZSIvPg0KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9oYVlOSGNpTUVkeXhPNEVzdVFPZ1RnIiB5PSItMzk3Ii8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTkhzaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfaGFZT2pjaU1FZHl4TzRFc3VRT2dUZyI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTkg4aU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPg0KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9oYVlOSU1pTUVkeXhPNEVzdVFPZ1RnIiB4PSItMTc1IiB5PSItNDE1Ii8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTkljaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iX2hhWU9qY2lNRWR5eE80RXN1UU9nVGciPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWU5Jc2lNRWR5eE80RXN1UU9nVGciIHR5cGU9IkZyb21Sb2xlIi8+DQotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX2hhWU5JOGlNRWR5eE80RXN1UU9nVGciIHg9Ii0zNzAiIHk9IjExNTIiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlOSk1pTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfaGFZT3NjaU1FZHl4TzRFc3VRT2dUZyI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTkpjaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfaGFZTkpzaU1FZHl4TzRFc3VRT2dUZyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfaGFZTko4aU1FZHl4TzRFc3VRT2dUZyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWU5LTWlNRWR5eE80RXN1UU9nVGciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iX2hhWU9qY2lNRWR5eE80RXN1UU9nVGciPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWU5LY2lNRWR5eE80RXN1UU9nVGciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX2hhWU5Lc2lNRWR5eE80RXN1UU9nVGciLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX2hhWU5LOGlNRWR5eE80RXN1UU9nVGciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlOTE1pTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iX2hhWU9zY2lNRWR5eE80RXN1UU9nVGciPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWU5MY2lNRWR5eE80RXN1UU9nVGciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX2hhWU5Mc2lNRWR5eE80RXN1UU9nVGciLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX2hhWU5MOGlNRWR5eE80RXN1UU9nVGciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlOTU1pTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfaGFZT2pjaU1FZHl4TzRFc3VRT2dUZyI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTk1jaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9oYVlOTXNpTUVkeXhPNEVzdVFPZ1RnIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9oYVlOTThpTUVkeXhPNEVzdVFPZ1RnIiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfaGFZTk5NaU1FZHl4TzRFc3VRT2dUZyIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX2hhWU5OY2lNRWR5eE80RXN1UU9nVGciIHBvaW50cz0iWzAsIDU3NSwgMCwgLTIzNzBdJFswLCAyNDQ2LCAwLCAtNDk5XSIvPg0KLSAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfaGFZTk5zaU1FZHl4TzRFc3VRT2dUZyIgZWxlbWVudD0iX2hhWU9rY2lNRWR5eE80RXN1UU9nVGciIHNvdXJjZT0iX2hhWUxCTWlNRWR5eE80RXN1UU9nVGciIHRhcmdldD0iX2hhWUs5TWlNRWR5eE80RXN1UU9nVGciPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlOTjhpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWU5PTWlNRWR5eE80RXN1UU9nVGciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlOT2NpTUVkeXhPNEVzdVFPZ1RnIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfaGFZTk9zaU1FZHl4TzRFc3VRT2dUZyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX2hhWU5POGlNRWR5eE80RXN1UU9nVGciIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9oYVlOUE1pTUVkeXhPNEVzdVFPZ1RnIiBwb2ludHM9IlstOTgyLCAtMTY1OSwgMTc2MSwgMzAxNF0kWy0yNDEzLCAtNDA5NywgMzMwLCA1NzVdIi8+DQotICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX2hhWU5QY2lNRWR5eE80RXN1UU9nVGciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9oYVlOUHNpTUVkeXhPNEVzdVFPZ1RnIiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX2hhWU5QOGlNRWR5eE80RXN1UU9nVGciIGVsZW1lbnQ9Il9oYVlPaXNpTUVkeXhPNEVzdVFPZ1RnIiBzb3VyY2U9Il9oYVlMSk1pTUVkeXhPNEVzdVFPZ1RnIiB0YXJnZXQ9Il9oYVlLOU1pTUVkeXhPNEVzdVFPZ1RnIj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTlFNaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlOUWNpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTlFzaU1FZHl4TzRFc3VRT2dUZyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX2hhWU5ROGlNRWR5eE80RXN1UU9nVGciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9oYVlOUk1pTUVkeXhPNEVzdVFPZ1RnIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfaGFZTlJjaU1FZHl4TzRFc3VRT2dUZyIgcG9pbnRzPSJbMTg2LCAtNTg0LCAtMTA4MywgMzAyMl0kWzEwNDksIC0zMDMxLCAtMjIwLCA1NzVdIi8+DQotICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX2hhWU5Sc2lNRWR5eE80RXN1UU9nVGciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9oYVlOUjhpTUVkeXhPNEVzdVFPZ1RnIiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX2hhWU5TTWlNRWR5eE80RXN1UU9nVGciIGVsZW1lbnQ9Il9oYVlPZU1pTUVkeXhPNEVzdVFPZ1RnIiBzb3VyY2U9Il9oYVlLMU1pTUVkeXhPNEVzdVFPZ1RnIiB0YXJnZXQ9Il9oYVlLeE1pTUVkeXhPNEVzdVFPZ1RnIj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTlNjaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlOU3NpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTlM4aU1FZHl4TzRFc3VRT2dUZyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX2hhWU5UTWlNRWR5eE80RXN1UU9nVGciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9oYVlOVGNpTUVkeXhPNEVzdVFPZ1RnIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfaGFZTlRzaU1FZHl4TzRFc3VRT2dUZyIgcG9pbnRzPSJbNjI2LCAtNTg0LCAtMjg3OCwgMjU2NV0kWzI4NDQsIC0yNTczLCAtNjYwLCA1NzVdIi8+DQotICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX2hhWU5UOGlNRWR5eE80RXN1UU9nVGciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9oYVlOVU1pTUVkeXhPNEVzdVFPZ1RnIiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX2hhWU5VY2lNRWR5eE80RXN1UU9nVGciIGVsZW1lbnQ9Il9oYVlPZnNpTUVkeXhPNEVzdVFPZ1RnIiBzb3VyY2U9Il9oYVlLNU1pTUVkeXhPNEVzdVFPZ1RnIiB0YXJnZXQ9Il9oYVlLeE1pTUVkeXhPNEVzdVFPZ1RnIj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTlVzaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlOVThpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTlZNaU1FZHl4TzRFc3VRT2dUZyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX2hhWU5WY2lNRWR5eE80RXN1UU9nVGciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9oYVlOVnNpTUVkeXhPNEVzdVFPZ1RnIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfaGFZTlY4aU1FZHl4TzRFc3VRT2dUZyIgcG9pbnRzPSJbMTI3LCAtNzk1LCAtNDMxLCAyNTU2XSRbNDQ4LCAtMjc3NywgLTExMCwgNTc1XSIvPg0KLSAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9oYVlOV01pTUVkeXhPNEVzdVFPZ1RnIiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfaGFZTldjaU1FZHl4TzRFc3VRT2dUZyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9oYVlOV3NpTUVkeXhPNEVzdVFPZ1RnIiBlbGVtZW50PSJfaGFZT2lNaU1FZHl4TzRFc3VRT2dUZyIgc291cmNlPSJfaGFZSzlNaU1FZHl4TzRFc3VRT2dUZyIgdGFyZ2V0PSJfaGFZS3hNaU1FZHl4TzRFc3VRT2dUZyI+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWU5XOGlNRWR5eE80RXN1UU9nVGciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTlhNaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWU5YY2lNRWR5eE80RXN1UU9nVGciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9oYVlOWHNpTUVkeXhPNEVzdVFPZ1RnIiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfaGFZTlg4aU1FZHl4TzRFc3VRT2dUZyIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX2hhWU5ZTWlNRWR5eE80RXN1UU9nVGciIHBvaW50cz0iWy01MDgsIC01ODQsIDIyMzUsIDI1NjVdJFstMjI0MywgLTI1NzMsIDQ5OSwgNTc1XSIvPg0KLSAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9oYVlOWWNpTUVkeXhPNEVzdVFPZ1RnIiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfaGFZTllzaU1FZHl4TzRFc3VRT2dUZyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9oYVlOWThpTUVkeXhPNEVzdVFPZ1RnIiBlbGVtZW50PSJfaGFZT01jaU1FZHl4TzRFc3VRT2dUZyIgc291cmNlPSJfaGFZS1JNaU1FZHl4TzRFc3VRT2dUZyIgdGFyZ2V0PSJfaGFZS1ZNaU1FZHl4TzRFc3VRT2dUZyI+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWU5aTWlNRWR5eE80RXN1UU9nVGciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTlpjaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWU5ac2lNRWR5eE80RXN1UU9nVGciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9oYVlOWjhpTUVkeXhPNEVzdVFPZ1RnIiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfaGFZTmFNaU1FZHl4TzRFc3VRT2dUZyIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX2hhWU5hY2lNRWR5eE80RXN1UU9nVGciIHBvaW50cz0iWzE0NTYsIC0zNzIsIC03MjMwLCAyODc4XSRbNTcwNiwgLTE0MDUsIC0yOTgwLCAxODQ1XSRbNzczMCwgLTI2NzUsIC05NTYsIDU3NV0iLz4NCi0gICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfaGFZTmFzaU1FZHl4TzRFc3VRT2dUZyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX2hhWU5hOGlNRWR5eE80RXN1UU9nVGciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfaGFZTmJNaU1FZHl4TzRFc3VRT2dUZyIgZWxlbWVudD0iX2hhWU9jY2lNRWR5eE80RXN1UU9nVGciIHNvdXJjZT0iX2hhWUxWTWlNRWR5eE80RXN1UU9nVGciIHRhcmdldD0iX2hhWUtkTWlNRWR5eE80RXN1UU9nVGciPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlOYmNpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWU5ic2lNRWR5eE80RXN1UU9nVGciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlOYjhpTUVkeXhPNEVzdVFPZ1RnIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfaGFZTmNNaU1FZHl4TzRFc3VRT2dUZyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX2hhWU5jY2lNRWR5eE80RXN1UU9nVGciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfaGFZTmNzaU1FZHl4TzRFc3VRT2dUZyIgcG9pbnRzPSJbMTY5LCAtNTQxLCAxNiwgMjIwMV0kWzE2OSwgLTIxNjcsIDE2LCA1NzVdIi8+DQotICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX2hhWU5jOGlNRWR5eE80RXN1UU9nVGciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9oYVlOZE1pTUVkeXhPNEVzdVFPZ1RnIiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX2hhWU5kY2lNRWR5eE80RXN1UU9nVGciIGVsZW1lbnQ9Il9oYVlPcU1pTUVkeXhPNEVzdVFPZ1RnIiBzb3VyY2U9Il9oYVlMVk1pTUVkeXhPNEVzdVFPZ1RnIiB0YXJnZXQ9Il90QTdnVU1pTkVkeXhPNEVzdVFPZ1RnIj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTmRzaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlOZDhpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTmVNaU1FZHl4TzRFc3VRT2dUZyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX2hhWU5lY2lNRWR5eE80RXN1UU9nVGciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlOZXNpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfaGFZT3FjaU1FZHl4TzRFc3VRT2dUZyI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTmU4aU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4NCi0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfaGFZTmZNaU1FZHl4TzRFc3VRT2dUZyIgeD0iMTQzIiB5PSItMzgxIi8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTmZjaU1FZHl4TzRFc3VRT2dUZyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfaGFZT3FjaU1FZHl4TzRFc3VRT2dUZyI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTmZzaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iVG9Sb2xlIi8+DQotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX2hhWU5mOGlNRWR5eE80RXN1UU9nVGciIHk9Ii0zOTciLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlOZ01pTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il9oYVlPY3NpTUVkeXhPNEVzdVFPZ1RnIj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlOZ2NpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+DQotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX2hhWU5nc2lNRWR5eE80RXN1UU9nVGciIHg9Ii02NiIgeT0iLTM1NSIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWU5nOGlNRWR5eE80RXN1UU9nVGciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il9oYVlPY3NpTUVkeXhPNEVzdVFPZ1RnIj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlOaE1pTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJGcm9tUm9sZSIvPg0KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9oYVlOaGNpTUVkeXhPNEVzdVFPZ1RnIiB4PSItMzU0IiB5PSI5ODIiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlOaHNpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfaGFZT3FjaU1FZHl4TzRFc3VRT2dUZyI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTmg4aU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfaGFZTmlNaU1FZHl4TzRFc3VRT2dUZyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfaGFZTmljaU1FZHl4TzRFc3VRT2dUZyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWU5pc2lNRWR5eE80RXN1UU9nVGciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iX2hhWU9jc2lNRWR5eE80RXN1UU9nVGciPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWU5pOGlNRWR5eE80RXN1UU9nVGciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX2hhWU5qTWlNRWR5eE80RXN1UU9nVGciLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX2hhWU5qY2lNRWR5eE80RXN1UU9nVGciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlOanNpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iX2hhWU9xY2lNRWR5eE80RXN1UU9nVGciPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWU5qOGlNRWR5eE80RXN1UU9nVGciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX2hhWU5rTWlNRWR5eE80RXN1UU9nVGciLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX2hhWU5rY2lNRWR5eE80RXN1UU9nVGciIHk9IjEwNTgiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlOa3NpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfaGFZT2NzaU1FZHl4TzRFc3VRT2dUZyI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTms4aU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9oYVlObE1pTUVkeXhPNEVzdVFPZ1RnIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9oYVlObGNpTUVkeXhPNEVzdVFPZ1RnIiB5PSIxMDU4Ii8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfaGFZTmxzaU1FZHl4TzRFc3VRT2dUZyIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX2hhWU5sOGlNRWR5eE80RXN1UU9nVGciIHBvaW50cz0iWzAsIDUzMywgMCwgLTIxMDhdJFswLCAyMTE2LCAwLCAtNTI0XSIvPg0KLSAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfaGFZTm1NaU1FZHl4TzRFc3VRT2dUZyIgZWxlbWVudD0iX2hhWU9Xc2lNRWR5eE80RXN1UU9nVGciIHNvdXJjZT0iX2hhWUtkTWlNRWR5eE80RXN1UU9nVGciIHRhcmdldD0iX2hhWUtOTWlNRWR5eE80RXN1UU9nVGciPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlObWNpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWU5tc2lNRWR5eE80RXN1UU9nVGciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlObThpTUVkeXhPNEVzdVFPZ1RnIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfaGFZTm5NaU1FZHl4TzRFc3VRT2dUZyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX2hhWU5uY2lNRWR5eE80RXN1UU9nVGciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfaGFZTm5zaU1FZHl4TzRFc3VRT2dUZyIgcG9pbnRzPSJbLTE5MjEsIDE5NCwgLTMxOTEsIDEyNjQwXSRbLTEwMDQxLCAxOTQsIC0xMTMxMSwgMTI2NDBdJFstMTAwNDEsIC0xMjg4NiwgLTExMzExLCAtNDQwXSRbLTkxNCwgLTEyODg2LCAtMjE4NCwgLTQ0MF0iLz4NCi0gICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfaGFZTm44aU1FZHl4TzRFc3VRT2dUZyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX2hhWU5vTWlNRWR5eE80RXN1UU9nVGciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICA8L2VkZ2VzPg0KLSAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfaGFZTm9jaU1FZHl4TzRFc3VRT2dUZyIgZWxlbWVudD0iX2hhWU9KOGlNRWR5eE80RXN1UU9nVGciIHNvdXJjZT0iX2hhWUtGTWlNRWR5eE80RXN1UU9nVGciIHRhcmdldD0iX2hhWUtOTWlNRWR5eE80RXN1UU9nVGciPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlOb3NpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWU5vOGlNRWR5eE80RXN1UU9nVGciIHR5cGU9IlN0ZXJlb3R5cGUiLz4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlOcE1pTUVkeXhPNEVzdVFPZ1RnIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPg0KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfaGFZTnBjaU1FZHl4TzRFc3VRT2dUZyIgeT0iLTE4NiIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX2hhWU5wc2lNRWR5eE80RXN1UU9nVGciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+DQotICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfaGFZTnA4aU1FZHl4TzRFc3VRT2dUZyIgcG9pbnRzPSJbNTc1LCAtNzg3LCAtNTcyMywgMTA5Ml0kWzU3NSwgLTIwMzIsIC01NzIzLCAtMTUyXSRbNDExNCwgLTIwMzIsIC0yMTg0LCAtMTUyXSIvPg0KLSAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9oYVlOcU1pTUVkeXhPNEVzdVFPZ1RnIiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfaGFZTnFjaU1FZHl4TzRFc3VRT2dUZyIgaWQ9ImFuY2hvcjUwIi8+DQotICAgICAgICAgIDwvZWRnZXM+DQotICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9oYVlOcXNpTUVkeXhPNEVzdVFPZ1RnIiBlbGVtZW50PSJfaGFZT0U4aU1FZHl4TzRFc3VRT2dUZyIgc291cmNlPSJfaGFZS05NaU1FZHl4TzRFc3VRT2dUZyIgdGFyZ2V0PSJfZzJ5ZXNNaU5FZHl4TzRFc3VRT2dUZyI+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWU5xOGlNRWR5eE80RXN1UU9nVGciIHR5cGU9Ik5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTnJNaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iU3RlcmVvdHlwZSIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWU5yY2lNRWR5eE80RXN1UU9nVGciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+DQotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9oYVlOcnNpTUVkeXhPNEVzdVFPZ1RnIiB5PSItMTg2Ii8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfaGFZTnI4aU1FZHl4TzRFc3VRT2dUZyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4NCi0gICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9oYVlOc01pTUVkeXhPNEVzdVFPZ1RnIiBwb2ludHM9IlstODAsIC01MDMsIC0xMDYsIDE3OTldJFstODAsIC0xMjcwLCAtMTA2LCAxMDMyXSIvPg0KLSAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9oYVlOc2NpTUVkeXhPNEVzdVFPZ1RnIiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX2hhWU5zOGlNRWR5eE80RXN1UU9nVGciIGVsZW1lbnQ9Il9oYVlPSU1pTUVkeXhPNEVzdVFPZ1RnIiBzb3VyY2U9Il9oYVlLQk1pTUVkeXhPNEVzdVFPZ1RnIiB0YXJnZXQ9Il9oYVlLTk1pTUVkeXhPNEVzdVFPZ1RnIj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTnRNaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlOdGNpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTnRzaU1FZHl4TzRFc3VRT2dUZyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX2hhWU50OGlNRWR5eE80RXN1UU9nVGciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9oYVlOdU1pTUVkeXhPNEVzdVFPZ1RnIiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX2hhWU51Y2lNRWR5eE80RXN1UU9nVGciIHBvaW50cz0iWy0zMTE1LCAtNDY1LCA4MDA5LCAtMzEzXSRbLTg5NDAsIC00NjUsIDIxODQsIC0zMTNdIi8+DQotICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX2hhWU51c2lNRWR5eE80RXN1UU9nVGciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9oYVlOdThpTUVkeXhPNEVzdVFPZ1RnIiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX2hhWU52TWlNRWR5eE80RXN1UU9nVGciIGVsZW1lbnQ9Il9oYVlPQWNpTUVkeXhPNEVzdVFPZ1RnIiBzb3VyY2U9Il9oYVlLVk1pTUVkeXhPNEVzdVFPZ1RnIiB0YXJnZXQ9Il9oYVlLTk1pTUVkeXhPNEVzdVFPZ1RnIj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTnZjaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlOdnNpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTnY4aU1FZHl4TzRFc3VRT2dUZyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX2hhWU53TWlNRWR5eE80RXN1UU9nVGciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9oYVlOd2NpTUVkeXhPNEVzdVFPZ1RnIiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX2hhWU53c2lNRWR5eE80RXN1UU9nVGciIHBvaW50cz0iWzMyMSwgLTU3NSwgNTI0LCAzMzg2XSRbMzIxLCAtMzM3OCwgNTI0LCA1ODRdIi8+DQotICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX2hhWU53OGlNRWR5eE80RXN1UU9nVGciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9oYVlOeE1pTUVkeXhPNEVzdVFPZ1RnIiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX2hhWU54Y2lNRWR5eE80RXN1UU9nVGciIGVsZW1lbnQ9Il9oYVlPUWNpTUVkeXhPNEVzdVFPZ1RnIiBzb3VyY2U9Il9oYVlLWk1pTUVkeXhPNEVzdVFPZ1RnIiB0YXJnZXQ9Il9oYVlLTk1pTUVkeXhPNEVzdVFPZ1RnIj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTnhzaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlOeDhpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTnlNaU1FZHl4TzRFc3VRT2dUZyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX2hhWU55Y2lNRWR5eE80RXN1UU9nVGciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9oYVlOeXNpTUVkeXhPNEVzdVFPZ1RnIiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX2hhWU55OGlNRWR5eE80RXN1UU9nVGciIHBvaW50cz0iWy05MywgLTc4NywgOTI1NCwgMzEyNF0kWy05MywgLTE0MTMsIDkyNTQsIDI0OTddJFstODM1NiwgLTE0MTMsIDk5MCwgMjQ5N10kWy04MzU2LCAtMzMyNywgOTkwLCA1ODRdIi8+DQotICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX2hhWU56TWlNRWR5eE80RXN1UU9nVGciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9oYVlOemNpTUVkeXhPNEVzdVFPZ1RnIiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX2hhWU56c2lNRWR5eE80RXN1UU9nVGciIGVsZW1lbnQ9Il9oYVlPZHNpTUVkeXhPNEVzdVFPZ1RnIiBzb3VyY2U9Il9oYVlLeE1pTUVkeXhPNEVzdVFPZ1RnIiB0YXJnZXQ9Il9oYVlLTk1pTUVkeXhPNEVzdVFPZ1RnIj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTno4aU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlOME1pTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTjBjaU1FZHl4TzRFc3VRT2dUZyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX2hhWU4wc2lNRWR5eE80RXN1UU9nVGciIHk9Ii0xODYiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9oYVlOMDhpTUVkeXhPNEVzdVFPZ1RnIiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPg0KLSAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX2hhWU4xTWlNRWR5eE80RXN1UU9nVGciIHBvaW50cz0iWy0zOTcsIC00NzYsIDEzNTk5LCA3MjIzXSRbLTM5NywgLTU3MTUsIDEzNTk5LCAxOTg0XSRbLTEzNTIwLCAtNTcxNSwgNDc2LCAxOTg0XSRbLTEzNTIwLCAtNzE5NywgNDc2LCA1MDJdIi8+DQotICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX2hhWU4xY2lNRWR5eE80RXN1UU9nVGciIGlkPSJhbmNob3I1MCIvPg0KLSAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9oYVlOMXNpTUVkeXhPNEVzdVFPZ1RnIiBpZD0iYW5jaG9yNTAiLz4NCi0gICAgICAgICAgPC9lZGdlcz4NCi0gICAgICAgIDwvY29udGVudHM+DQotICAgICAgICA8Y29udGVudHMgeG1pOnR5cGU9Im5vdGF0aW9uOkRpYWdyYW0iIHhtaTppZD0iX2hhWU4xOGlNRWR5eE80RXN1UU9nVGciIHR5cGU9IkNsYXNzIiBuYW1lPSJUeXBlcyI+DQotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlOMk1pTUVkeXhPNEVzdVFPZ1RnIiBlbGVtZW50PSJfaGFZTl9jaU1FZHl4TzRFc3VRT2dUZyI+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWU4yY2lNRWR5eE80RXN1UU9nVGciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX2hhWU4yc2lNRWR5eE80RXN1UU9nVGciIHdpZHRoPSIxOTY0IiBoZWlnaHQ9IjE5NjQiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlOMjhpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWU4zTWlNRWR5eE80RXN1UU9nVGciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTjNjaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWU4zc2lNRWR5eE80RXN1UU9nVGciIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9oYVlOMzhpTUVkeXhPNEVzdVFPZ1RnIi8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTjRNaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX2hhWU40Y2lNRWR5eE80RXN1UU9nVGciLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlONHNpTUVkeXhPNEVzdVFPZ1RnIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX2hhWU40OGlNRWR5eE80RXN1UU9nVGciLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlONU1pTUVkeXhPNEVzdVFPZ1RnIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9oYVlONWNpTUVkeXhPNEVzdVFPZ1RnIiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9oYVlONXNpTUVkeXhPNEVzdVFPZ1RnIiBzaG93TGlzdFN0ZXJlb3R5cGU9Ik5vbmUiIHNob3dMaXN0VmlzaWJpbGl0eT0iTm9uZSIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX2hhWU41OGlNRWR5eE80RXN1UU9nVGciIHg9Ijc0NSIgeT0iNjQzIi8+DQotICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlONk1pTUVkeXhPNEVzdVFPZ1RnIiBlbGVtZW50PSJfaGFZT0Q4aU1FZHl4TzRFc3VRT2dUZyI+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWU42Y2lNRWR5eE80RXN1UU9nVGciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX2hhWU42c2lNRWR5eE80RXN1UU9nVGciIHdpZHRoPSIyNzYwIiBoZWlnaHQ9IjE5NjQiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlONjhpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJTdGVyZW90eXBlIi8+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWU43TWlNRWR5eE80RXN1UU9nVGciIHR5cGU9Ik5hbWUiLz4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTjdjaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iUGFyZW50Ii8+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2hhWU43c2lNRWR5eE80RXN1UU9nVGciIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9oYVlONzhpTUVkeXhPNEVzdVFPZ1RnIi8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfaGFZTjhNaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX2hhWU44Y2lNRWR5eE80RXN1UU9nVGciLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlOOHNpTUVkeXhPNEVzdVFPZ1RnIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX2hhWU44OGlNRWR5eE80RXN1UU9nVGciLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9oYVlOOU1pTUVkeXhPNEVzdVFPZ1RnIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9oYVlOOWNpTUVkeXhPNEVzdVFPZ1RnIiBjYW5vbmljYWw9ImZhbHNlIi8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9oYVlOOXNpTUVkeXhPNEVzdVFPZ1RnIiBzaG93TGlzdFN0ZXJlb3R5cGU9Ik5vbmUiIHNob3dMaXN0VmlzaWJpbGl0eT0iTm9uZSIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPg0KLSAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX2hhWU45OGlNRWR5eE80RXN1UU9nVGciIHg9IjMwNTQiIHk9IjY3MSIvPg0KLSAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxEaWFncmFtU3R5bGUiIHhtaTppZD0iX2hhWU4tTWlNRWR5eE80RXN1UU9nVGciIGRlc2NyaXB0aW9uPSJUaGVzZSB0d3AgZGF0YSB0eXBlIGFyZSBiZWluZyB1c2VkIGJ5IHRoZSBkaWFtZ3JhbSBpbnRlcmNoYW5nZS4gIFRoZXkgbWlnaHQgYmUgcmVwbGFjZWQgd2l0aCB0eXBlcyBvZiB0aGUgaW1wbGVtZW50YXRpb24gcGxhdGZvcm0gYXMgbG9uZyBhcyB0aGUgYWxsb3cgdGhlIHNhbWUgdHlwZSBvZiBzZXJpYWxpemF0aW9uIGZvciBwZXJzaXN0ZW5jeS4iLz4NCi0gICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPg0KLSAgICAgICAgPC9jb250ZW50cz4NCi0gICAgICA8L2VBbm5vdGF0aW9ucz4NCi0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX2hhWU4tY2lNRWR5eE80RXN1UU9nVGciIGFubm90YXRlZEVsZW1lbnQ9Il9oYVlKNGNpTUVkeXhPNEVzdVFPZ1RnIj4NCi0gICAgICAgIDxib2R5PjAxPC9ib2R5Pg0KLSAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgIDxwYWNrYWdlSW1wb3J0IHhtaTppZD0iX2hhWU4tc2lNRWR5eE80RXN1UU9nVGciIGltcG9ydGVkUGFja2FnZT0iXzNBREM3Qjc0MDIyRDQxRERGODY5MDEyRSI+DQotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iX2hhWU4tOGlNRWR5eE80RXN1UU9nVGciIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy91bWwyLzIuMC4wL1VNTCIvPg0KLSAgICAgIDwvcGFja2FnZUltcG9ydD4NCi0gICAgICA8cGFja2FnZUltcG9ydCB4bWk6aWQ9Il9oYVlOX01pTUVkeXhPNEVzdVFPZ1RnIiBpbXBvcnRlZFBhY2thZ2U9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyNjIiLz4NCi0gICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX2hhWU5fY2lNRWR5eE80RXN1UU9nVGciIG5hbWU9IlBvaW50Ij4NCi0gICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il9oYVlOX3NpTUVkeXhPNEVzdVFPZ1RnIiBuYW1lPSJ4IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il9BVXE4SU94M0VkdTUtdlZqbGZWc2ZRIi8+DQotICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfaGFZTl84aU1FZHl4TzRFc3VRT2dUZyIgbmFtZT0ieSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfQVVxOElPeDNFZHU1LXZWamxmVnNmUSIvPg0KLSAgICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfaGFZT0FNaU1FZHl4TzRFc3VRT2dUZyIgbmFtZT0iR3JhcGhFbGVtZW50IiBpc0Fic3RyYWN0PSJ0cnVlIj4NCi0gICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il9oYVlPQWNpTUVkeXhPNEVzdVFPZ1RnIiBnZW5lcmFsPSJfaGFZT0VzaU1FZHl4TzRFc3VRT2dUZyIvPg0KLSAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX2hhWU9Bc2lNRWR5eE80RXN1UU9nVGciIG5hbWU9InBvc2l0aW9uIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il9oYVlOX2NpTUVkeXhPNEVzdVFPZ1RnIi8+DQotICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfaGFZT0E4aU1FZHl4TzRFc3VRT2dUZyIgbmFtZT0iY29udGFpbmVkIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il9oYVlPRXNpTUVkeXhPNEVzdVFPZ1RnIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBhc3NvY2lhdGlvbj0iX2hhWU9tTWlNRWR5eE80RXN1UU9nVGciPg0KLSAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9oYVlPQk1pTUVkeXhPNEVzdVFPZ1RnIiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9oYVlPQmNpTUVkeXhPNEVzdVFPZ1RnIi8+DQotICAgICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX2hhWU9Cc2lNRWR5eE80RXN1UU9nVGciIG5hbWU9ImxpbmsiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX2hhWU9RTWlNRWR5eE80RXN1UU9nVGciIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiIGFzc29jaWF0aW9uPSJfaGFZT25zaU1FZHl4TzRFc3VRT2dUZyI+DQotICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX2hhWU9COGlNRWR5eE80RXN1UU9nVGciIHZhbHVlPSIqIi8+DQotICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX2hhWU9DTWlNRWR5eE80RXN1UU9nVGciLz4NCi0gICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfaGFZT0NjaU1FZHl4TzRFc3VRT2dUZyIgbmFtZT0iYW5jaG9yYWdlIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il9oYVlPTU1pTUVkeXhPNEVzdVFPZ1RnIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBhc3NvY2lhdGlvbj0iX2hhWU9uOGlNRWR5eE80RXN1UU9nVGciPg0KLSAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9oYVlPQ3NpTUVkeXhPNEVzdVFPZ1RnIiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9oYVlPQzhpTUVkeXhPNEVzdVFPZ1RnIi8+DQotICAgICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX2hhWU9ETWlNRWR5eE80RXN1UU9nVGciIG5hbWU9InNlbWFudGljTW9kZWwiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX2hhWU9XY2lNRWR5eE80RXN1UU9nVGciIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiIGFzc29jaWF0aW9uPSJfaGFZT3BzaU1FZHl4TzRFc3VRT2dUZyI+DQotICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX2hhWU9EY2lNRWR5eE80RXN1UU9nVGciIHZhbHVlPSIxIi8+DQotICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX2hhWU9Ec2lNRWR5eE80RXN1UU9nVGciIHZhbHVlPSIxIi8+DQotICAgICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfaGFZT0Q4aU1FZHl4TzRFc3VRT2dUZyIgbmFtZT0iRGltZW5zaW9uIj4NCi0gICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il9oYVlPRU1pTUVkeXhPNEVzdVFPZ1RnIiBuYW1lPSJ3aWR0aCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfQVVxOElPeDNFZHU1LXZWamxmVnNmUSIvPg0KLSAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX2hhWU9FY2lNRWR5eE80RXN1UU9nVGciIG5hbWU9ImhlaWdodCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfQVVxOElPeDNFZHU1LXZWamxmVnNmUSIvPg0KLSAgICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfaGFZT0VzaU1FZHl4TzRFc3VRT2dUZyIgbmFtZT0iRGlhZ3JhbUVsZW1lbnQiIGlzQWJzdHJhY3Q9InRydWUiPg0KLSAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX2hhWU9FOGlNRWR5eE80RXN1UU9nVGciIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyODAiLz4NCi0gICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il9oYVlPRk1pTUVkeXhPNEVzdVFPZ1RnIiBuYW1lPSJpc1Zpc2libGUiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzVHY1lBT2llRWR1UWJ1WTZVd01TUWciPg0KLSAgICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJfaGFZT0ZjaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iXzVHY1lBT2llRWR1UWJ1WTZVd01TUWciPg0KLSAgICAgICAgICAgIDxib2R5PnRydWU8L2JvZHk+DQotICAgICAgICAgIDwvZGVmYXVsdFZhbHVlPg0KLSAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il9oYVlPRnNpTUVkeXhPNEVzdVFPZ1RnIiBuYW1lPSJjb250YWluZXIiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX2hhWU9BTWlNRWR5eE80RXN1UU9nVGciIGFzc29jaWF0aW9uPSJfaGFZT21NaU1FZHl4TzRFc3VRT2dUZyI+DQotICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX2hhWU9GOGlNRWR5eE80RXN1UU9nVGciIHZhbHVlPSIxIi8+DQotICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX2hhWU9HTWlNRWR5eE80RXN1UU9nVGciLz4NCi0gICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfaGFZT0djaU1FZHl4TzRFc3VRT2dUZyIgbmFtZT0icmVmZXJlbmNlIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il9oYVlPSDhpTUVkeXhPNEVzdVFPZ1RnIiBhc3NvY2lhdGlvbj0iX2hhWU9tY2lNRWR5eE80RXN1UU9nVGciPg0KLSAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9oYVlPR3NpTUVkeXhPNEVzdVFPZ1RnIiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9oYVlPRzhpTUVkeXhPNEVzdVFPZ1RnIi8+DQotICAgICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX2hhWU9ITWlNRWR5eE80RXN1UU9nVGciIG5hbWU9InByb3BlcnR5IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il9oYVlPSnNpTUVkeXhPNEVzdVFPZ1RnIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBhc3NvY2lhdGlvbj0iX2hhWU9tc2lNRWR5eE80RXN1UU9nVGciPg0KLSAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9oYVlPSGNpTUVkeXhPNEVzdVFPZ1RnIiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9oYVlPSHNpTUVkeXhPNEVzdVFPZ1RnIi8+DQotICAgICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfaGFZT0g4aU1FZHl4TzRFc3VRT2dUZyIgbmFtZT0iUmVmZXJlbmNlIj4NCi0gICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il9oYVlPSU1pTUVkeXhPNEVzdVFPZ1RnIiBnZW5lcmFsPSJfaGFZT0VzaU1FZHl4TzRFc3VRT2dUZyIvPg0KLSAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX2hhWU9JY2lNRWR5eE80RXN1UU9nVGciIG5hbWU9ImlzSW5kaXZpZHVhbFJlcHJlc2VudGF0aW9uIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il81R2NZQU9pZUVkdVFidVk2VXdNU1FnIj4NCi0gICAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxCb29sZWFuIiB4bWk6aWQ9Il9oYVlPSXNpTUVkeXhPNEVzdVFPZ1RnIiB0eXBlPSJfNUdjWUFPaWVFZHVRYnVZNlV3TVNRZyIvPg0KLSAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il9oYVlPSThpTUVkeXhPNEVzdVFPZ1RnIiBuYW1lPSJyZWZlcmVuY2VkIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il9oYVlPRXNpTUVkeXhPNEVzdVFPZ1RnIiBhc3NvY2lhdGlvbj0iX2hhWU9tY2lNRWR5eE80RXN1UU9nVGciPg0KLSAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9oYVlPSk1pTUVkeXhPNEVzdVFPZ1RnIiB2YWx1ZT0iMSIvPg0KLSAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9oYVlPSmNpTUVkeXhPNEVzdVFPZ1RnIiB2YWx1ZT0iMSIvPg0KLSAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX2hhWU9Kc2lNRWR5eE80RXN1UU9nVGciIG5hbWU9IlByb3BlcnR5Ij4NCi0gICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il9oYVlPSjhpTUVkeXhPNEVzdVFPZ1RnIiBnZW5lcmFsPSJfaGFZT0VzaU1FZHl4TzRFc3VRT2dUZyIvPg0KLSAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX2hhWU9LTWlNRWR5eE80RXN1UU9nVGciIG5hbWU9ImtleSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIj4NCi0gICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfaGFZT0tjaU1FZHl4TzRFc3VRT2dUZyIgdmFsdWU9IjEiLz4NCi0gICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfaGFZT0tzaU1FZHl4TzRFc3VRT2dUZyIvPg0KLSAgICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfaGFZT0s4aU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyIgdmFsdWU9IiIvPg0KLSAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il9oYVlPTE1pTUVkeXhPNEVzdVFPZ1RnIiBuYW1lPSJ2YWx1ZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIj4NCi0gICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfaGFZT0xjaU1FZHl4TzRFc3VRT2dUZyIgdmFsdWU9IjEiLz4NCi0gICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfaGFZT0xzaU1FZHl4TzRFc3VRT2dUZyIvPg0KLSAgICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfaGFZT0w4aU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyIgdmFsdWU9IiIvPg0KLSAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX2hhWU9NTWlNRWR5eE80RXN1UU9nVGciIG5hbWU9IkdyYXBoQ29ubmVjdG9yIj4NCi0gICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il9oYVlPTWNpTUVkeXhPNEVzdVFPZ1RnIiBnZW5lcmFsPSJfaGFZT0FNaU1FZHl4TzRFc3VRT2dUZyIvPg0KLSAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX2hhWU9Nc2lNRWR5eE80RXN1UU9nVGciIG5hbWU9ImdyYXBoRWxlbWVudCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfaGFZT0FNaU1FZHl4TzRFc3VRT2dUZyIgYXNzb2NpYXRpb249Il9oYVlPbjhpTUVkeXhPNEVzdVFPZ1RnIj4NCi0gICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfaGFZT004aU1FZHl4TzRFc3VRT2dUZyIgdmFsdWU9IjEiLz4NCi0gICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfaGFZT05NaU1FZHl4TzRFc3VRT2dUZyIgdmFsdWU9IjEiLz4NCi0gICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfaGFZT05jaU1FZHl4TzRFc3VRT2dUZyIgbmFtZT0iZ3JhcGhFZGdlIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il9oYVlPT01pTUVkeXhPNEVzdVFPZ1RnIiBhc3NvY2lhdGlvbj0iX2hhWU9vTWlNRWR5eE80RXN1UU9nVGciPg0KLSAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9oYVlPTnNpTUVkeXhPNEVzdVFPZ1RnIiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9oYVlPTjhpTUVkeXhPNEVzdVFPZ1RnIi8+DQotICAgICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfaGFZT09NaU1FZHl4TzRFc3VRT2dUZyIgbmFtZT0iR3JhcGhFZGdlIj4NCi0gICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il9oYVlPT2NpTUVkeXhPNEVzdVFPZ1RnIiBnZW5lcmFsPSJfaGFZT0FNaU1FZHl4TzRFc3VRT2dUZyIvPg0KLSAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX2hhWU9Pc2lNRWR5eE80RXN1UU9nVGciIG5hbWU9ImFuY2hvciIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfaGFZT01NaU1FZHl4TzRFc3VRT2dUZyIgYXNzb2NpYXRpb249Il9oYVlPb01pTUVkeXhPNEVzdVFPZ1RnIj4NCi0gICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfaGFZT084aU1FZHl4TzRFc3VRT2dUZyIgdmFsdWU9IjIiLz4NCi0gICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfaGFZT1BNaU1FZHl4TzRFc3VRT2dUZyIgdmFsdWU9IjIiLz4NCi0gICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfaGFZT1BjaU1FZHl4TzRFc3VRT2dUZyIgbmFtZT0id2F5cG9pbnRzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il9oYVlOX2NpTUVkeXhPNEVzdVFPZ1RnIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBhc3NvY2lhdGlvbj0iX2hhWU9vY2lNRWR5eE80RXN1UU9nVGciPg0KLSAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9oYVlPUHNpTUVkeXhPNEVzdVFPZ1RnIiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9oYVlPUDhpTUVkeXhPNEVzdVFPZ1RnIiB2YWx1ZT0iMiIvPg0KLSAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX2hhWU9RTWlNRWR5eE80RXN1UU9nVGciIG5hbWU9IkRpYWdyYW1MaW5rIj4NCi0gICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il9oYVlPUWNpTUVkeXhPNEVzdVFPZ1RnIiBnZW5lcmFsPSJfaGFZT0VzaU1FZHl4TzRFc3VRT2dUZyIvPg0KLSAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX2hhWU9Rc2lNRWR5eE80RXN1UU9nVGciIG5hbWU9Inpvb20iIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX0FVcThJT3gzRWR1NS12VmpsZlZzZlEiLz4NCi0gICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il9oYVlPUThpTUVkeXhPNEVzdVFPZ1RnIiBuYW1lPSJ2aWV3cG9ydCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfaGFZTl9jaU1FZHl4TzRFc3VRT2dUZyIvPg0KLSAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX2hhWU9STWlNRWR5eE80RXN1UU9nVGciIG5hbWU9ImdyYXBoRWxlbWVudCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfaGFZT0FNaU1FZHl4TzRFc3VRT2dUZyIgYXNzb2NpYXRpb249Il9oYVlPbnNpTUVkeXhPNEVzdVFPZ1RnIj4NCi0gICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfaGFZT1JjaU1FZHl4TzRFc3VRT2dUZyIgdmFsdWU9IjEiLz4NCi0gICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfaGFZT1JzaU1FZHl4TzRFc3VRT2dUZyIgdmFsdWU9IjEiLz4NCi0gICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfaGFZT1I4aU1FZHl4TzRFc3VRT2dUZyIgbmFtZT0iZGlhZ3JhbSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfaGFZT1RjaU1FZHl4TzRFc3VRT2dUZyIgYXNzb2NpYXRpb249Il9oYVlPcGNpTUVkeXhPNEVzdVFPZ1RnIj4NCi0gICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfaGFZT1NNaU1FZHl4TzRFc3VRT2dUZyIgdmFsdWU9IjEiLz4NCi0gICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfaGFZT1NjaU1FZHl4TzRFc3VRT2dUZyIgdmFsdWU9IjEiLz4NCi0gICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il9oYVlPU3NpTUVkeXhPNEVzdVFPZ1RnIiBuYW1lPSJHcmFwaE5vZGUiPg0KLSAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX2hhWU9TOGlNRWR5eE80RXN1UU9nVGciIGdlbmVyYWw9Il9oYVlPQU1pTUVkeXhPNEVzdVFPZ1RnIi8+DQotICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfaGFZT1RNaU1FZHl4TzRFc3VRT2dUZyIgbmFtZT0ic2l6ZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfaGFZT0Q4aU1FZHl4TzRFc3VRT2dUZyIvPg0KLSAgICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfaGFZT1RjaU1FZHl4TzRFc3VRT2dUZyIgbmFtZT0iRGlhZ3JhbSI+DQotICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfaGFZT1RzaU1FZHl4TzRFc3VRT2dUZyIgZ2VuZXJhbD0iX2hhWU9Tc2lNRWR5eE80RXN1UU9nVGciLz4NCi0gICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il9oYVlPVDhpTUVkeXhPNEVzdVFPZ1RnIiBuYW1lPSJ6b29tIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il9BVXE4SU94M0VkdTUtdlZqbGZWc2ZRIj4NCi0gICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfaGFZT1VNaU1FZHl4TzRFc3VRT2dUZyIgdmFsdWU9IjEiLz4NCi0gICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfaGFZT1VjaU1FZHl4TzRFc3VRT2dUZyIvPg0KLSAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il9oYVlPVXNpTUVkeXhPNEVzdVFPZ1RnIiBuYW1lPSJ2aWV3cG9pbnQiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX2hhWU5fY2lNRWR5eE80RXN1UU9nVGciLz4NCi0gICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il9oYVlPVThpTUVkeXhPNEVzdVFPZ1RnIiBuYW1lPSJkaWFncmFtTGluayIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfaGFZT1FNaU1FZHl4TzRFc3VRT2dUZyIgYXNzb2NpYXRpb249Il9oYVlPcGNpTUVkeXhPNEVzdVFPZ1RnIj4NCi0gICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfaGFZT1ZNaU1FZHl4TzRFc3VRT2dUZyIgdmFsdWU9IioiLz4NCi0gICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfaGFZT1ZjaU1FZHl4TzRFc3VRT2dUZyIvPg0KLSAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il9oYVlPVnNpTUVkeXhPNEVzdVFPZ1RnIiBuYW1lPSJuYW1lc3BhY2UiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX2hhWU9XY2lNRWR5eE80RXN1UU9nVGciIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiIGFzc29jaWF0aW9uPSJfaGFZT3A4aU1FZHl4TzRFc3VRT2dUZyI+DQotICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX2hhWU9WOGlNRWR5eE80RXN1UU9nVGciIHZhbHVlPSIxIi8+DQotICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX2hhWU9XTWlNRWR5eE80RXN1UU9nVGciIHZhbHVlPSIxIi8+DQotICAgICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfaGFZT1djaU1FZHl4TzRFc3VRT2dUZyIgbmFtZT0iU2VtYW50aWNNb2RlbEJyaWRnZSIgaXNBYnN0cmFjdD0idHJ1ZSI+DQotICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfaGFZT1dzaU1FZHl4TzRFc3VRT2dUZyIgZ2VuZXJhbD0iX2hhWU9Fc2lNRWR5eE80RXN1UU9nVGciLz4NCi0gICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il9oYVlPVzhpTUVkeXhPNEVzdVFPZ1RnIiBuYW1lPSJwcmVzZW50YXRpb24iIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyI+DQotICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX2hhWU9YTWlNRWR5eE80RXN1UU9nVGciIHZhbHVlPSIxIi8+DQotICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX2hhWU9YY2lNRWR5eE80RXN1UU9nVGciLz4NCi0gICAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iX2hhWU9Yc2lNRWR5eE80RXN1UU9nVGciIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiIHZhbHVlPSIiLz4NCi0gICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfaGFZT1g4aU1FZHl4TzRFc3VRT2dUZyIgbmFtZT0iZ3JhcGhFbGVtZW50IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il9oYVlPQU1pTUVkeXhPNEVzdVFPZ1RnIiBhc3NvY2lhdGlvbj0iX2hhWU9wc2lNRWR5eE80RXN1UU9nVGciPg0KLSAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9oYVlPWU1pTUVkeXhPNEVzdVFPZ1RnIiB2YWx1ZT0iMSIvPg0KLSAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9oYVlPWWNpTUVkeXhPNEVzdVFPZ1RnIi8+DQotICAgICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX2hhWU9Zc2lNRWR5eE80RXN1UU9nVGciIG5hbWU9ImRpYWdyYW0iIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX2hhWU9UY2lNRWR5eE80RXN1UU9nVGciIGFzc29jaWF0aW9uPSJfaGFZT3A4aU1FZHl4TzRFc3VRT2dUZyI+DQotICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX2hhWU9ZOGlNRWR5eE80RXN1UU9nVGciIHZhbHVlPSIxIi8+DQotICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX2hhWU9aTWlNRWR5eE80RXN1UU9nVGciLz4NCi0gICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il9oYVlPWmNpTUVkeXhPNEVzdVFPZ1RnIiBuYW1lPSJTaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudCI+DQotICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfaGFZT1pzaU1FZHl4TzRFc3VRT2dUZyIgZ2VuZXJhbD0iX2hhWU9XY2lNRWR5eE80RXN1UU9nVGciLz4NCi0gICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il9oYVlPWjhpTUVkeXhPNEVzdVFPZ1RnIiBuYW1lPSJ0eXBlSW5mbyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIj4NCi0gICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfaGFZT2FNaU1FZHl4TzRFc3VRT2dUZyIgdmFsdWU9IjEiLz4NCi0gICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfaGFZT2FjaU1FZHl4TzRFc3VRT2dUZyIvPg0KLSAgICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfaGFZT2FzaU1FZHl4TzRFc3VRT2dUZyIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyIgdmFsdWU9IiIvPg0KLSAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX2hhWU9hOGlNRWR5eE80RXN1UU9nVGciIG5hbWU9IlVNQVNlbWFudGljTW9kZWxCcmlkZ2UiPg0KLSAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX2hhWU9iTWlNRWR5eE80RXN1UU9nVGciIGdlbmVyYWw9Il9oYVlPV2NpTUVkeXhPNEVzdVFPZ1RnIi8+DQotICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfaGFZT2JjaU1FZHl4TzRFc3VRT2dUZyIgbmFtZT0iZWxlbWVudCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjgwIiBhc3NvY2lhdGlvbj0iX2hhWU9yTWlNRWR5eE80RXN1UU9nVGciPg0KLSAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9oYVlPYnNpTUVkeXhPNEVzdVFPZ1RnIiB2YWx1ZT0iMSIvPg0KLSAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9oYVlPYjhpTUVkeXhPNEVzdVFPZ1RnIiB2YWx1ZT0iMSIvPg0KLSAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX2hhWU9jTWlNRWR5eE80RXN1UU9nVGciIG5hbWU9IkNvcmVTZW1hbnRpY01vZGVsQnJpZGdlIj4NCi0gICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il9oYVlPY2NpTUVkeXhPNEVzdVFPZ1RnIiBnZW5lcmFsPSJfaGFZT1djaU1FZHl4TzRFc3VRT2dUZyIvPg0KLSAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX2hhWU9jc2lNRWR5eE80RXN1UU9nVGciIG5hbWU9ImVsZW1lbnQiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQxRERFNjY4MDBDRSIgYXNzb2NpYXRpb249Il9oYVlPcU1pTUVkeXhPNEVzdVFPZ1RnIj4NCi0gICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfaGFZT2M4aU1FZHl4TzRFc3VRT2dUZyIgdmFsdWU9IjEiLz4NCi0gICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfaGFZT2RNaU1FZHl4TzRFc3VRT2dUZyIgdmFsdWU9IjEiLz4NCi0gICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il9oYVlPZGNpTUVkeXhPNEVzdVFPZ1RnIiBuYW1lPSJMZWFmRWxlbWVudCIgaXNBYnN0cmFjdD0idHJ1ZSI+DQotICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfaGFZT2RzaU1FZHl4TzRFc3VRT2dUZyIgZ2VuZXJhbD0iX2hhWU9Fc2lNRWR5eE80RXN1UU9nVGciLz4NCi0gICAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX2hhWU9kOGlNRWR5eE80RXN1UU9nVGciIG5hbWU9IlRleHRFbGVtZW50Ij4NCi0gICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il9oYVlPZU1pTUVkeXhPNEVzdVFPZ1RnIiBnZW5lcmFsPSJfaGFZT2RjaU1FZHl4TzRFc3VRT2dUZyIvPg0KLSAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX2hhWU9lY2lNRWR5eE80RXN1UU9nVGciIG5hbWU9InRleHQiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyI+DQotICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX2hhWU9lc2lNRWR5eE80RXN1UU9nVGciIHZhbHVlPSIxIi8+DQotICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX2hhWU9lOGlNRWR5eE80RXN1UU9nVGciLz4NCi0gICAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iX2hhWU9mTWlNRWR5eE80RXN1UU9nVGciIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiIHZhbHVlPSIiLz4NCi0gICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il9oYVlPZmNpTUVkeXhPNEVzdVFPZ1RnIiBuYW1lPSJJbWFnZSI+DQotICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfaGFZT2ZzaU1FZHl4TzRFc3VRT2dUZyIgZ2VuZXJhbD0iX2hhWU9kY2lNRWR5eE80RXN1UU9nVGciLz4NCi0gICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il9oYVlPZjhpTUVkeXhPNEVzdVFPZ1RnIiBuYW1lPSJ1cmkiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQxMTNFQTI5MDJGRSI+DQotICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX2hhWU9nTWlNRWR5eE80RXN1UU9nVGciIHZhbHVlPSIxIi8+DQotICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX2hhWU9nY2lNRWR5eE80RXN1UU9nVGciLz4NCi0gICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfaGFZT2c4aU1FZHl4TzRFc3VRT2dUZyIgbmFtZT0ibWltZVR5cGUiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyI+DQotICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX2hhWU9oTWlNRWR5eE80RXN1UU9nVGciIHZhbHVlPSIxIi8+DQotICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX2hhWU9oY2lNRWR5eE80RXN1UU9nVGciLz4NCi0gICAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iX2hhWU9oc2lNRWR5eE80RXN1UU9nVGciIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiIHZhbHVlPSIiLz4NCi0gICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il9oYVlPaDhpTUVkeXhPNEVzdVFPZ1RnIiBuYW1lPSJHcmFwaGljUHJpbWl0aXZlIiBpc0Fic3RyYWN0PSJ0cnVlIj4NCi0gICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il9oYVlPaU1pTUVkeXhPNEVzdVFPZ1RnIiBnZW5lcmFsPSJfaGFZT2RjaU1FZHl4TzRFc3VRT2dUZyIvPg0KLSAgICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfaGFZT2ljaU1FZHl4TzRFc3VRT2dUZyIgbmFtZT0iUG9seWxpbmUiPg0KLSAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX2hhWU9pc2lNRWR5eE80RXN1UU9nVGciIGdlbmVyYWw9Il9oYVlPaDhpTUVkeXhPNEVzdVFPZ1RnIi8+DQotICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfaGFZT2k4aU1FZHl4TzRFc3VRT2dUZyIgbmFtZT0iY2xvc2VkIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il81R2NZQU9pZUVkdVFidVk2VXdNU1FnIj4NCi0gICAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iX2hhWU9qTWlNRWR5eE80RXN1UU9nVGciIHR5cGU9Il81R2NZQU9pZUVkdVFidVk2VXdNU1FnIj4NCi0gICAgICAgICAgICA8Ym9keT50cnVlPC9ib2R5Pg0KLSAgICAgICAgICA8L2RlZmF1bHRWYWx1ZT4NCi0gICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfaGFZT2pjaU1FZHl4TzRFc3VRT2dUZyIgbmFtZT0id2F5cG9pbnRzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il9oYVlOX2NpTUVkeXhPNEVzdVFPZ1RnIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBhc3NvY2lhdGlvbj0iX2hhWU9zTWlNRWR5eE80RXN1UU9nVGciPg0KLSAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9oYVlPanNpTUVkeXhPNEVzdVFPZ1RnIiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9oYVlPajhpTUVkeXhPNEVzdVFPZ1RnIiB2YWx1ZT0iMiIvPg0KLSAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX2hhWU9rTWlNRWR5eE80RXN1UU9nVGciIG5hbWU9IkVsbGlwc2UiPg0KLSAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX2hhWU9rY2lNRWR5eE80RXN1UU9nVGciIGdlbmVyYWw9Il9oYVlPaDhpTUVkeXhPNEVzdVFPZ1RnIi8+DQotICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfaGFZT2tzaU1FZHl4TzRFc3VRT2dUZyIgbmFtZT0iY2VudGVyIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il9oYVlOX2NpTUVkeXhPNEVzdVFPZ1RnIi8+DQotICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfaGFZT2s4aU1FZHl4TzRFc3VRT2dUZyIgbmFtZT0icmFkaXVzWCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfQVVxOElPeDNFZHU1LXZWamxmVnNmUSIvPg0KLSAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX2hhWU9sTWlNRWR5eE80RXN1UU9nVGciIG5hbWU9InJhZGl1c1kiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX0FVcThJT3gzRWR1NS12VmpsZlZzZlEiLz4NCi0gICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il9oYVlPbGNpTUVkeXhPNEVzdVFPZ1RnIiBuYW1lPSJyb3RhdGlvbiIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfQVVxOElPeDNFZHU1LXZWamxmVnNmUSIvPg0KLSAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX2hhWU9sc2lNRWR5eE80RXN1UU9nVGciIG5hbWU9InN0YXJ0QW5nbGUiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX0FVcThJT3gzRWR1NS12VmpsZlZzZlEiLz4NCi0gICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il9oYVlPbDhpTUVkeXhPNEVzdVFPZ1RnIiBuYW1lPSJlbmRBbmdsZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfQVVxOElPeDNFZHU1LXZWamxmVnNmUSIvPg0KLSAgICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfaGFZT21NaU1FZHl4TzRFc3VRT2dUZyIgbWVtYmVyRW5kPSJfaGFZT0E4aU1FZHl4TzRFc3VRT2dUZyBfaGFZT0ZzaU1FZHl4TzRFc3VRT2dUZyIvPg0KLSAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfaGFZT21jaU1FZHl4TzRFc3VRT2dUZyIgbWVtYmVyRW5kPSJfaGFZT0k4aU1FZHl4TzRFc3VRT2dUZyBfaGFZT0djaU1FZHl4TzRFc3VRT2dUZyIvPg0KLSAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfaGFZT21zaU1FZHl4TzRFc3VRT2dUZyIgbWVtYmVyRW5kPSJfaGFZT0hNaU1FZHl4TzRFc3VRT2dUZyBfaGFZT204aU1FZHl4TzRFc3VRT2dUZyI+DQotICAgICAgICA8b3duZWRFbmQgeG1pOmlkPSJfaGFZT204aU1FZHl4TzRFc3VRT2dUZyIgbmFtZT0iX2RpYWdyYW1FbGVtZW50IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il9oYVlPRXNpTUVkeXhPNEVzdVFPZ1RnIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfaGFZT21zaU1FZHl4TzRFc3VRT2dUZyI+DQotICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX2hhWU9uTWlNRWR5eE80RXN1UU9nVGciIHZhbHVlPSIxIi8+DQotICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX2hhWU9uY2lNRWR5eE80RXN1UU9nVGciIHZhbHVlPSIxIi8+DQotICAgICAgICA8L293bmVkRW5kPg0KLSAgICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfaGFZT25zaU1FZHl4TzRFc3VRT2dUZyIgbWVtYmVyRW5kPSJfaGFZT0JzaU1FZHl4TzRFc3VRT2dUZyBfaGFZT1JNaU1FZHl4TzRFc3VRT2dUZyIvPg0KLSAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfaGFZT244aU1FZHl4TzRFc3VRT2dUZyIgbWVtYmVyRW5kPSJfaGFZT0NjaU1FZHl4TzRFc3VRT2dUZyBfaGFZT01zaU1FZHl4TzRFc3VRT2dUZyIvPg0KLSAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfaGFZT29NaU1FZHl4TzRFc3VRT2dUZyIgbWVtYmVyRW5kPSJfaGFZT05jaU1FZHl4TzRFc3VRT2dUZyBfaGFZT09zaU1FZHl4TzRFc3VRT2dUZyIvPg0KLSAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfaGFZT29jaU1FZHl4TzRFc3VRT2dUZyIgbWVtYmVyRW5kPSJfaGFZT1BjaU1FZHl4TzRFc3VRT2dUZyBfaGFZT29zaU1FZHl4TzRFc3VRT2dUZyI+DQotICAgICAgICA8b3duZWRFbmQgeG1pOmlkPSJfaGFZT29zaU1FZHl4TzRFc3VRT2dUZyIgbmFtZT0iX2dyYXBoRWRnZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfaGFZT09NaU1FZHl4TzRFc3VRT2dUZyIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iX2hhWU9vY2lNRWR5eE80RXN1UU9nVGciPg0KLSAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9oYVlPbzhpTUVkeXhPNEVzdVFPZ1RnIiB2YWx1ZT0iMSIvPg0KLSAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9oYVlPcE1pTUVkeXhPNEVzdVFPZ1RnIiB2YWx1ZT0iMSIvPg0KLSAgICAgICAgPC9vd25lZEVuZD4NCi0gICAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX2hhWU9wY2lNRWR5eE80RXN1UU9nVGciIG1lbWJlckVuZD0iX2hhWU9VOGlNRWR5eE80RXN1UU9nVGcgX2hhWU9SOGlNRWR5eE80RXN1UU9nVGciLz4NCi0gICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX2hhWU9wc2lNRWR5eE80RXN1UU9nVGciIG1lbWJlckVuZD0iX2hhWU9ETWlNRWR5eE80RXN1UU9nVGcgX2hhWU9YOGlNRWR5eE80RXN1UU9nVGciLz4NCi0gICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX2hhWU9wOGlNRWR5eE80RXN1UU9nVGciIG1lbWJlckVuZD0iX2hhWU9Wc2lNRWR5eE80RXN1UU9nVGcgX2hhWU9Zc2lNRWR5eE80RXN1UU9nVGciLz4NCi0gICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX2hhWU9xTWlNRWR5eE80RXN1UU9nVGciIG1lbWJlckVuZD0iX2hhWU9jc2lNRWR5eE80RXN1UU9nVGcgX2hhWU9xY2lNRWR5eE80RXN1UU9nVGciPg0KLSAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iX2hhWU9xY2lNRWR5eE80RXN1UU9nVGciIG5hbWU9Il9jb3JlU2VtYW50aWNNb2RlbEJyaWRnZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfaGFZT2NNaU1FZHl4TzRFc3VRT2dUZyIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iX2hhWU9xTWlNRWR5eE80RXN1UU9nVGciPg0KLSAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9oYVlPcXNpTUVkeXhPNEVzdVFPZ1RnIiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9oYVlPcThpTUVkeXhPNEVzdVFPZ1RnIi8+DQotICAgICAgICA8L293bmVkRW5kPg0KLSAgICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfaGFZT3JNaU1FZHl4TzRFc3VRT2dUZyIgbWVtYmVyRW5kPSJfaGFZT2JjaU1FZHl4TzRFc3VRT2dUZyBfaGFZT3JjaU1FZHl4TzRFc3VRT2dUZyI+DQotICAgICAgICA8b3duZWRFbmQgeG1pOmlkPSJfaGFZT3JjaU1FZHl4TzRFc3VRT2dUZyIgbmFtZT0iX3VNQVNlbWFudGljTW9kZWxCcmlkZ2UiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX2hhWU9hOGlNRWR5eE80RXN1UU9nVGciIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il9oYVlPck1pTUVkeXhPNEVzdVFPZ1RnIj4NCi0gICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfaGFZT3JzaU1FZHl4TzRFc3VRT2dUZyIgdmFsdWU9IioiLz4NCi0gICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfaGFZT3I4aU1FZHl4TzRFc3VRT2dUZyIvPg0KLSAgICAgICAgPC9vd25lZEVuZD4NCi0gICAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX2hhWU9zTWlNRWR5eE80RXN1UU9nVGciIG1lbWJlckVuZD0iX2hhWU9qY2lNRWR5eE80RXN1UU9nVGcgX2hhWU9zY2lNRWR5eE80RXN1UU9nVGciPg0KLSAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iX2hhWU9zY2lNRWR5eE80RXN1UU9nVGciIG5hbWU9Il9wb2x5bGluZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfaGFZT2ljaU1FZHl4TzRFc3VRT2dUZyIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iX2hhWU9zTWlNRWR5eE80RXN1UU9nVGciPg0KLSAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9oYVlPc3NpTUVkeXhPNEVzdVFPZ1RnIiB2YWx1ZT0iMSIvPg0KLSAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9oYVlPczhpTUVkeXhPNEVzdVFPZ1RnIiB2YWx1ZT0iMSIvPg0KLSAgICAgICAgPC9vd25lZEVuZD4NCi0gICAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgIDxwcm9maWxlQXBwbGljYXRpb24geG1pOmlkPSJfR2RwbWtlZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il9HZHpYa09mWEVkdXFIb09KYlVSWlJ3IiBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvdW1sMi8yLjAuMC9VTUwiPg0KLSAgICAgICAgPHJlZmVyZW5jZXMgeG1pOnR5cGU9ImVjb3JlOkVQYWNrYWdlIiBocmVmPSJwYXRobWFwOi8vVU1MX1BST0ZJTEVTL1N0YW5kYXJkLnByb2ZpbGUudW1sI195elU1OFlpbkVkcXR2Ym5mQjJMXzV3Ii8+DQotICAgICAgPC9lQW5ub3RhdGlvbnM+DQotICAgICAgPGFwcGxpZWRQcm9maWxlIGhyZWY9InBhdGhtYXA6Ly9VTUxfUFJPRklMRVMvU3RhbmRhcmQucHJvZmlsZS51bWwjXzAiLz4NCi0gICAgPC9wcm9maWxlQXBwbGljYXRpb24+DQotICAgIDxwcm9maWxlQXBwbGljYXRpb24geG1pOmlkPSJfR2R6WGtlZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il9HZHpYa3VmWEVkdXFIb09KYlVSWlJ3IiBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvdW1sMi8yLjAuMC9VTUwiPg0KLSAgICAgICAgPHJlZmVyZW5jZXMgeG1pOnR5cGU9ImVjb3JlOkVQYWNrYWdlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9NU0xfUFJPRklMRVMvRGVmYXVsdC5lcHgjX0lOOGs4TW1CRWRxQmNOMVI2RXZXVXc/RGVmYXVsdC9EZWZhdWx0PyIvPg0KLSAgICAgIDwvZUFubm90YXRpb25zPg0KLSAgICAgIDxhcHBsaWVkUHJvZmlsZSBocmVmPSJwYXRobWFwOi8vVU1MMl9NU0xfUFJPRklMRVMvRGVmYXVsdC5lcHgjX2FfUzN3TldMRWRpeTRJcVA4d2hqRkE/RGVmYXVsdD8iLz4NCi0gICAgPC9wcm9maWxlQXBwbGljYXRpb24+DQotICAgIDxwcm9maWxlQXBwbGljYXRpb24geG1pOmlkPSJfR2R6WGstZlhFZHVxSG9PSmJVUlpSdyI+DQotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il9HZHpYbE9mWEVkdXFIb09KYlVSWlJ3IiBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvdW1sMi8yLjAuMC9VTUwiPg0KLSAgICAgICAgPHJlZmVyZW5jZXMgeG1pOnR5cGU9ImVjb3JlOkVQYWNrYWdlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9NU0xfUFJPRklMRVMvRGVwbG95bWVudC5lcHgjX0lyZEFVTW1CRWRxQmNOMVI2RXZXVXc/RGVwbG95bWVudC9EZXBsb3ltZW50PyIvPg0KLSAgICAgIDwvZUFubm90YXRpb25zPg0KLSAgICAgIDxhcHBsaWVkUHJvZmlsZSBocmVmPSJwYXRobWFwOi8vVU1MMl9NU0xfUFJPRklMRVMvRGVwbG95bWVudC5lcHgjX3ZqYnV3T3ZIRWRpRFg1YmppMGlWU0E/RGVwbG95bWVudD8iLz4NCi0gICAgPC9wcm9maWxlQXBwbGljYXRpb24+DQotICAgIDxwcm9maWxlQXBwbGljYXRpb24geG1pOmlkPSJfZ3FPUW9BQjJFZHVlcS1WaUxZaWV5USI+DQotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il9ncU9Rb1FCMkVkdWVxLVZpTFlpZXlRIiBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvdW1sMi8yLjAuMC9VTUwiPg0KLSAgICAgICAgPHJlZmVyZW5jZXMgeG1pOnR5cGU9ImVjb3JlOkVQYWNrYWdlIiBocmVmPSJwYXRobWFwOi8vVU1MX1BST0ZJTEVTL0Vjb3JlLnByb2ZpbGUudW1sI192eS1IVVlpbkVkcXR2Ym5mQjJMXzV3Ii8+DQotICAgICAgPC9lQW5ub3RhdGlvbnM+DQotICAgICAgPGFwcGxpZWRQcm9maWxlIGhyZWY9InBhdGhtYXA6Ly9VTUxfUFJPRklMRVMvRWNvcmUucHJvZmlsZS51bWwjXzAiLz4NCi0gICAgPC9wcm9maWxlQXBwbGljYXRpb24+DQotICA8L3VtbDpNb2RlbD4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR2hySzhPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR2hoWjlPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HaDBVNE9mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HaHJLLXVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0doMFU1ZWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0doMFU1T2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR2gtRjRPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR2gwVTZPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HaC1GNU9mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HaC1GNC1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dpSDI0T2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0doLUY1LWZYRWR1cUhvT0piVVJaUnciLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR2lIMjVPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR2lIMjQtZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HaUgyNS1mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HaUgyNXVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dpUkEwdWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dpUkEwZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR2lSQTFlZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR2lSQTFPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HaWF4ME9mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HaVJBMS1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dpYXgwLWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dpYXgwdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR2lheDEtZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR2lheDF1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HaWtpME9mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HaWF4MnVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dpa2kxT2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dpa2kwLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR2lraTEtZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR2lraTF1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HaXRzd09mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HaWtpMmVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dpdHN3LWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dpdHN3dWZYRWR1cUhvT0piVVJaUnciLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR2kzZHdPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR2l0c3gtZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HaTNkdy1mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HaTNkd3VmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dpM2R5T2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dpM2R4LWZYRWR1cUhvT0piVVJaUnciLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR2kzZHpPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR2kzZHktZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HakFuc3VmWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HakFuc2VmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dqQW51T2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dqQW50LWZYRWR1cUhvT0piVVJaUnciLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR2pBbnZPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR2pBbnUtZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HaktZc09mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HakFud09mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dqS1l0T2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dqS1lzLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR2pLWXQtZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR2pLWXR1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HalVKc09mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HaktZdWVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dqZFRvT2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dqVUpzLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR2pkVHBPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR2pkVG8tZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HamRUcU9mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HamRUcC1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dqZFRyT2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dqZFRxLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR2puRW9PZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR2pkVHItZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9Ham5FcE9mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9Ham5Fby1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0drRHdrT2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dqNV9sT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR2tEd21lZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR2tEd21PZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9Ha0R3b3VmWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9Ha0R3b2VmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0drTTZnT2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0drRHdxdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR2tNNmllZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR2tNNmlPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9Ha002a3VmWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9Ha002a2VmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0drV3JnT2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0drTTZtdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR2tXcmllZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR2tXcmlPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9Ha1dya3VmWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9Ha1dya2VmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0drZ2NnT2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0drV3JtdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR2tnY2llZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR2tnY2lPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9Ha2dja3VmWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9Ha2dja2VmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0drcG1jT2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0drZ2NtdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR2twbWVlZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR2twbWVPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9Ha3BtZ3VmWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9Ha3BtZ2VmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0drelhjT2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0drcG1pdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR2t6WGdPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR2t6WGYtZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HazlJY09mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9Ha3pYaU9mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0drOUllZWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0drOUllT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR2xzdlVPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR2xpLVdlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HbHN2V09mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HbHN2Vi1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dsc3ZYT2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dsc3ZXLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR2xzdllPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR2xzdlgtZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HbDE1UU9mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HbHN2WS1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dsMTVST2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dsMTVRLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR2wxNVNPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR2wxNVItZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HbF9xUU9mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HbDE1VGVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dsX3FST2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dsX3FRLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR2xfcVRlZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR2xfcVRPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HbUpiUU9mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HbF9xVmVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dtSmJSLWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dtSmJSdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR21KYlVPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR21KYlQtZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HbVNsTU9mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HbUpiV09mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dtU2xPZWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dtU2xPT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR21TbFF1ZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR21TbFFlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HbWNXTU9mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HbVNsVWVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dtY1dPZWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dtY1dPT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR21jV1F1ZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR21jV1FlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HbWxnSU9mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HbWNXU3VmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dtbGdLZWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dtbGdLT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR21sZ011ZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR21sZ01lZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HbTVDSk9mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HbTVDSS1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dtNUNMdWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dtNUNMZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR25DTUVPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR201Q01lZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HbkNNRk9mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HbkNNRS1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0duQ01HT2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0duQ01GLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR25DTUhPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR25DTUctZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9Hbkw5RU9mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HbkNNSk9mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0duTDlHZWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0duTDlHT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR25MOUl1ZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR25MOUllZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HblZ1RU9mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9Hbkw5S3VmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0duVnVHZWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0duVnVHT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR25lNEQtZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR25lNER1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9Hbm9wQU9mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HbmU0Ry1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dueHk4T2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dub3BCT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR254eTgtZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR254eTh1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9Hbnh5OXVmWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9Hbnh5OWVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dueHktLWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dueHktdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR243ajhPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR254eV9lZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HbjdqOC1mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HbjdqOHVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0duN2o5dWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0duN2o5ZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR243ai1lZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR243ai1PZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HbjdqX09mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HbjdqLS1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dvRlU5T2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dvRlU4LWZYRWR1cUhvT0piVVJaUnciLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR29GVTktZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR29GVTl1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9Hb0ZVX09mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9Hb0ZVLS1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dvT2U0T2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dvRlVfdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR29ZUDgtZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR29ZUDh1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9Hb1lQLXVmWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9Hb1lQLWVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dvaUE0T2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dvWVBfdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR29pQTVPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR29pQTQtZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9Hb2lBNk9mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9Hb2lBNS1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dvaUE2LWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dvaUE2dWZYRWR1cUhvT0piVVJaUnciLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR29ySzBPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR29pQTdlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9Hb3JLMC1mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9Hb3JLMHVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dvcksxdWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dvcksxZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR29ySzJlZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR29ySzJPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9Hb3JLMy1mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9Hb3JLM3VmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dvMDcwT2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dvcks0dWZYRWR1cUhvT0piVVJaUnciLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR28wNzFPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR28wNzAtZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HbzA3MmVmWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HbzA3Mk9mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dvMDczdWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dvMDczZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR28tRnhPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR28tRnctZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9Hby1GemVmWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9Hby1Gek9mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dvLUYxdWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dvLUYxZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3BSbndPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3BIMnktZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HcFJueC1mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HcFJueHVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dwUm55LWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dwUm55dWZYRWR1cUhvT0piVVJaUnciLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3BSbnotZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3BSbnp1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HcGF4c09mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HcFJuMHVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dwYXh0T2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dwYXhzLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3BheHVPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3BheHQtZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HcGF4dk9mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HcGF4dS1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dwYXh3T2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dwYXh2LWZYRWR1cUhvT0piVVJaUnciLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3BraXNPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3BheHctZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HcGtpdE9mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HcGtpcy1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dwa2l1T2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dwa2l0LWZYRWR1cUhvT0piVVJaUnciLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3BraXZPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3BraXUtZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HcHVUc09mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HcGtpdi1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dwdVR0T2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dwdVRzLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3B1VHZPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3B1VHUtZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HcHVUd09mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HcHVUdi1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dwM2RvdWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dwM2RvZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3AzZHEtZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3AzZHF1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HcDNkdE9mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HcDNkcy1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dxQk9vT2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dwM2R2T2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3FCT3FlZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3FCT3FPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HcUJPc3VmWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HcUJPc2VmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dxS1lrT2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dxQk91dWZYRWR1cUhvT0piVVJaUnciLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3FLWW1lZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3FLWW1PZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HcUtZb3VmWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HcUtZb2VmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dxVUprT2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dxS1lxT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3FVSm1lZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3FVSm1PZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HcW5FZ09mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HcWQ2ay1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dxbkVpT2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dxbkVoLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3FuRWpPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3FuRWktZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HcW5Fa09mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HcW5Fai1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dxbkVsT2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dxbkVrLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3F3MWdlZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3F3MWdPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HcXcxaGVmWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HcXcxaE9mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dxdzFpZWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dxdzFpT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3F3MWplZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3F3MWpPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HcTZtZ09mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HcXcxa09mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dxNm1oT2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dxNm1nLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3E2bWplZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3E2bWpPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HcTZtbHVmWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HcTZtbGVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dyRHdjLWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dyRHdjdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3JOaGNPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3JEd2UtZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9Hck5oZWVmWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9Hck5oZU9mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dyV3JZLWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dyV3JZdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3JXcmJPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3JXcmEtZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HcldyZGVmWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HcldyZE9mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dyZ2NaLWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dyZ2NadWZYRWR1cUhvT0piVVJaUnciLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3JxTll1ZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3JxTlllZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HcnFOYU9mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HcnFOWi1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dycU5iT2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dycU5hLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3J6WFVPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3JxTmJ1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HcnpYVS1mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HcnpYVXVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dyelhWLWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dyelhWdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3J6WFctZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3J6WFd1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HcjlJVU9mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HcnpYWGVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dyOUlWT2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dyOUlVLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3I5SVYtZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3I5SVZ1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HcjlJV3VmWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HcjlJV2VmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dzRzVVT2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dyOUlYZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3NHNVUtZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3NHNVV1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9Hc0c1V09mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9Hc0c1Vi1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dzRzVYdWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dzRzVYZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3NRRFJ1ZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3NRRFJlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9Hc1FEVC1mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9Hc1FEVHVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dzUURXT2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dzUURWLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3NaMFR1ZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3NaMFRlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9Hc2ktTU9mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9Hc1owVk9mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dzaS1OT2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dzaS1NLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3NpLU9lZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3NpLU9PZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9Hc2ktUGVmWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9Hc2ktUE9mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dzc3ZNT2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dzaS1RT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3Nzdk5PZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3Nzdk0tZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9Hc3N2T09mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9Hc3N2Ti1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dzc3ZQT2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dzc3ZPLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3MyZ01PZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3NzdlFPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HczJnTk9mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HczJnTS1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dzMmdQZWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dzMmdQT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3MyZ1J1ZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3MyZ1JlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9Hc19xSXVmWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9Hc19xSWVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dzX3FLLWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dzX3FLdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3NfcU5PZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3NfcU0tZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HdEpiSWVmWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HdEpiSU9mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0d0SmJLdWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0d0SmJLZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3RKYk0tZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3RKYk11ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HdFRNSU9mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HdEpiTy1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0d0VE1KLWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0d0VE1KdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3RUTUx1ZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3RUTUxlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HdG1IRk9mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HdG1IRS1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0d0bUhIT2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0d0bUhHLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3RtSEllZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3RtSElPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HdHZSQU9mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HdG1ISk9mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0d0dlJCT2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0d0dlJBLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3R2UkRlZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3R2UkRPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HdDVDQU9mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HdHZSRmVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0d0NUNEdWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0d0NUNEZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3Q1Q0dlZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3Q1Q0dPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HdUN6QXVmWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HdUN6QWVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0d1Q3pDZWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0d1Q3pDT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3VDekRPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3VDekMtZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HdUN6RWVmWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HdUN6RU9mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0d1TDg4T2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0d1Q3pFLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3VMODgtZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3VMODh1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HdUw4LU9mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HdUw4OS1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0d1TDgtLWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0d1TDgtdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3VWdDhPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3VMOF8tZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HdVZ0OC1mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HdVZ0OHVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0d1VnQ5dWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0d1VnQ5ZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3VWdC1lZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3VWdC1PZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HdVZ0X3VmWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HdVZ0X2VmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0d1ZmU4T2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0d1VnVBdWZYRWR1cUhvT0piVVJaUnciLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3VmZTgtZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3VmZTh1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HdWZlOXVmWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HdWZlOWVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0d1ZmUtZWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0d1ZmUtT2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3VmZV9PZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3VmZS0tZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HdW9vNGVmWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HdW9vNE9mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0d1b281T2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0d1b280LWZYRWR1cUhvT0piVVJaUnciLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3VvbzZPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3VvbzUtZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HdW9vNi1mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HdW9vNnVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0d1eVo0T2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0d1b283LWZYRWR1cUhvT0piVVJaUnciLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3ZZUHpPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3ZZUHktZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HdllQM2VmWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HdllQM09mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0d2aUF3T2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0d2WVA0T2ZYRWR1cUhvT0piVVJaUnciLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3ZpQXhPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3ZpQXctZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HdmlBeU9mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HdmlBeC1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0d2aUF6dWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0d2aUF6ZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3ZyeHdPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3ZpQTF1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HdnJ4eWVmWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HdnJ4eU9mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0d2cngwdWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0d2cngwZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3YwN3NPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3ZyeDJPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HdjA3dC1mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HdjA3dHVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0d2MDd3T2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0d2MDd2LWZYRWR1cUhvT0piVVJaUnciLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3Ytc3MtZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3Ytc3N1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9Hd0gycHVmWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9Hd0gycGVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0d3SDJ0T2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0d3SDJzLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3dSbm9PZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3dIMnQtZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9Hd1Juby1mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9Hd1Jub3VmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0d3Um5wdWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0d3Um5wZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3dSbnFlZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3dSbnFPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9Hd1Juci1mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9Hd1JucnVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0d3NEVsdWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0d3NEVsZWZYRWR1cUhvT0piVVJaUnciLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3hCT2d1ZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3hCT2dlZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HeG5yY09mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HeGQ2ZHVmWEVkdXFIb09KYlVSWlJ3Ii8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0d4bnJkT2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0d4bnJjLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3hucmQtZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3hucmR1ZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HeG5yZk9mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HeG5yZS1mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0d4bnJnT2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0d4bnJmLWZYRWR1cUhvT0piVVJaUnciLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3h3MVlPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3hucmhPZlhFZHVxSG9PSmJVUlpSdyIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HeHcxWmVmWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HeHcxWk9mWEVkdXFIb09KYlVSWlJ3Ii8+DQotICA8RWNvcmU6RURhdGFUeXBlIHhtaTppZD0iXzVHY1lDZWllRWR1UWJ1WTZVd01TUWciIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLmxhbmcuQm9vbGVhbiIgYmFzZV9QcmltaXRpdmVUeXBlPSJfNUdjWUFPaWVFZHVRYnVZNlV3TVNRZyIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il81R2NZRGVpZUVkdVFidVk2VXdNU1FnIiBiYXNlX0NvbW1lbnQ9Il81R2NZQWVpZUVkdVFidVk2VXdNU1FnIi8+DQotICA8RWNvcmU6RURhdGFUeXBlIHhtaTppZD0iX0Jhc3RNT2lmRWR1UWJ1WTZVd01TUWciIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLmxhbmcuU3RyaW5nIiBiYXNlX1ByaW1pdGl2ZVR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfaTdGVG9laWZFZHVRYnVZNlV3TVNRZyIgYmFzZV9Db21tZW50PSJfaTdGVG9PaWZFZHVRYnVZNlV3TVNRZyIvPg0KLSAgPEVjb3JlOkVEYXRhVHlwZSB4bWk6aWQ9Il9XZS1Ra09vRkVkdU9CUFFBMmhLcVVRIiBpbnN0YW5jZUNsYXNzTmFtZT0iaW50IiBiYXNlX1ByaW1pdGl2ZVR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBBNDAwN0IiLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfZFVjNm9lb0ZFZHVPQlBRQTJoS3FVUSIgYmFzZV9Db21tZW50PSJfZFVjNm9Pb0ZFZHVPQlBRQTJoS3FVUSIvPg0KLSAgPEVjb3JlOkVEYXRhVHlwZSB4bWk6aWQ9Il92MW5Jc09vRkVkdU9CUFFBMmhLcVVRIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS51dGlsLkRhdGUiIGJhc2VfUHJpbWl0aXZlVHlwZT0iXzNBREM3Qjc0MDIyRDQwRjQ0OThEMDE4NSIvPg0KLSAgPEVjb3JlOkVEYXRhVHlwZSB4bWk6aWQ9Il83Z0hBOE9vRkVkdU9CUFFBMmhLcVVRIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS51dGlsLkxpc3QiIGJhc2VfUHJpbWl0aXZlVHlwZT0iXzNBREM3Qjc0MDIyRDNGMDk4OTlDMDBFQSIvPg0KLSAgPEVjb3JlOkVEYXRhVHlwZSB4bWk6aWQ9Il9BR19GY09vR0VkdU9CUFFBMmhLcVVRIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS51dGlsLlNldCIgYmFzZV9QcmltaXRpdmVUeXBlPSJfM0FEQzdCNzQwMjJEM0YwOTg5QjkwMjkwIi8+DQotICA8RWNvcmU6RURhdGFUeXBlIHhtaTppZD0iX0VJZFcwT29HRWR1T0JQUUEyaEtxVVEiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLm5ldC5VUkkiIGJhc2VfUHJpbWl0aXZlVHlwZT0iXzNBREM3Qjc0MDIyRDQxMTNFQTI5MDJGRSIvPg0KLSAgPEVjb3JlOkVBdHRyaWJ1dGUgeG1pOmlkPSJfb2dpR29Pb0hFZHVPQlBRQTJoS3FVUSIgYmFzZV9Qcm9wZXJ0eT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDA1MCIgaXNJRD0idHJ1ZSIvPg0KLSAgPEVjb3JlOkVBdHRyaWJ1dGUgeG1pOmlkPSJfNTJUZm9Pb0hFZHVPQlBRQTJoS3FVUSIgYmFzZV9Qcm9wZXJ0eT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDA0NyIvPg0KLSAgPEVjb3JlOkVBdHRyaWJ1dGUgeG1pOmlkPSJfSkFJQm9Pb01FZHVPQlBRQTJoS3FVUSIgYmFzZV9Qcm9wZXJ0eT0iXzNBREM3Qjc0MDIyRDQyN0E4QTFGMDJGMyIvPg0KLSAgPEVjb3JlOkVBdHRyaWJ1dGUgeG1pOmlkPSJfTFJhSHdPb01FZHVPQlBRQTJoS3FVUSIgYmFzZV9Qcm9wZXJ0eT0iXzNBREM3Qjc0MDIyRDQwRjlBQjk4MDJCOSIvPg0KLSAgPEVjb3JlOkVBdHRyaWJ1dGUgeG1pOmlkPSJfTmNiTjBPb01FZHVPQlBRQTJoS3FVUSIgYmFzZV9Qcm9wZXJ0eT0iXzNBREM3Qjc0MDIyRDQ1NUU2NUM4MDIxOCIvPg0KLSAgPEVjb3JlOkVBdHRyaWJ1dGUgeG1pOmlkPSJfUEZuWk1Pb01FZHVPQlBRQTJoS3FVUSIgYmFzZV9Qcm9wZXJ0eT0iXzNBREM3Qjc0MDIyRDQxREYzMjE5MDAyOSIvPg0KLSAgPEVjb3JlOkVBdHRyaWJ1dGUgeG1pOmlkPSJfUldUQ1lPb01FZHVPQlBRQTJoS3FVUSIgYmFzZV9Qcm9wZXJ0eT0iXzNBREM3Qjc0MDIyRDQyNzk2MjVEMDIzNCIvPg0KLSAgPEVjb3JlOkVBdHRyaWJ1dGUgeG1pOmlkPSJfVURTMElPb01FZHVPQlBRQTJoS3FVUSIgYmFzZV9Qcm9wZXJ0eT0iXzNBREM3Qjc0MDIyRDQyMUU0REYzMDAzQSIvPg0KLSAgPEVjb3JlOkVBdHRyaWJ1dGUgeG1pOmlkPSJfcHd2WUFPb01FZHVPQlBRQTJoS3FVUSIgYmFzZV9Qcm9wZXJ0eT0iXzNBREM3Qjc0MDIyRDQxRERGQzhFMDBCNiIvPg0KLSAgPEVjb3JlOkVSZWZlcmVuY2UgeG1pOmlkPSJfcDZ4MkVPb1NFZHVPQlBRQTJoS3FVUSIgaXNUcmFuc2llbnQ9InRydWUiIGJhc2VfUHJvcGVydHk9Il8zQURDN0I3NDAyMkQ0Mjc5NjJENDAyMDMiLz4NCi0gIDxFY29yZTpFUmVmZXJlbmNlIHhtaTppZD0iXzFxWHBzT29TRWR1T0JQUUEyaEtxVVEiIGlzVHJhbnNpZW50PSJ0cnVlIiBiYXNlX1Byb3BlcnR5PSJfM0FEQzdCNzQwMjJENDBGMzZDOTMwMEY2Ii8+DQotICA8RWNvcmU6RVJlZmVyZW5jZSB4bWk6aWQ9Il80Wi1EZ09vU0VkdU9CUFFBMmhLcVVRIiBpc1RyYW5zaWVudD0idHJ1ZSIgYmFzZV9Qcm9wZXJ0eT0iXzNBREM3Qjc0MDIyRDQwRjM2QzkzMDBGOCIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9QNG9zWWVvZUVkdVZBN3Z0NXFiSUpRIiBiYXNlX0NvbW1lbnQ9Il9QNG9zWU9vZUVkdVZBN3Z0NXFiSUpRIi8+DQotICA8RWNvcmU6RURhdGFUeXBlIHhtaTppZD0iX0NFSUhrT3gzRWR1NS12VmpsZlZzZlEiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLmxhbmcuRG91YmxlIiBiYXNlX1ByaW1pdGl2ZVR5cGU9Il9BVXE4SU94M0VkdTUtdlZqbGZWc2ZRIi8+DQotICA8RWNvcmU6RUF0dHJpYnV0ZSB4bWk6aWQ9Il9LNzllME1WYkVkeTJtdVEyUFF2SF9BIiBiYXNlX1Byb3BlcnR5PSJfbFdRd0FjVXlFZHkybXVRMlBRdkhfQSIvPg0KLSAgPEVjb3JlOkVBdHRyaWJ1dGUgeG1pOmlkPSJfeHdTRUVNVmJFZHkybXVRMlBRdkhfQSIgYmFzZV9Qcm9wZXJ0eT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDAwQSIvPg0KLSAgPEVjb3JlOkVBdHRyaWJ1dGUgeG1pOmlkPSJfMFQ1M1lNVmJFZHkybXVRMlBRdkhfQSIgYmFzZV9Qcm9wZXJ0eT0iXzNBREM3Qjc0MDIyRDQ2MTFEQjREMDI0OCIvPg0KLSAgPEVjb3JlOkVBdHRyaWJ1dGUgeG1pOmlkPSJfMUpQajhNVmJFZHkybXVRMlBRdkhfQSIgYmFzZV9Qcm9wZXJ0eT0iXzNBREM3Qjc0MDIyRDQ2MTFEQjJGMDIwRCIvPg0KLSAgPEVjb3JlOkVBdHRyaWJ1dGUgeG1pOmlkPSJfMmNzSTBNVmJFZHkybXVRMlBRdkhfQSIgYmFzZV9Qcm9wZXJ0eT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDAwQiIvPg0KLSAgPEVjb3JlOkVBdHRyaWJ1dGUgeG1pOmlkPSJfM0ZYNWNNVmJFZHkybXVRMlBRdkhfQSIgYmFzZV9Qcm9wZXJ0eT0iXzNBREM3Qjc0MDIyRDQxNzdFNzE2MDM3RiIvPg0KLSAgPEVjb3JlOkVBdHRyaWJ1dGUgeG1pOmlkPSJfNHFzNGdNVmJFZHkybXVRMlBRdkhfQSIgYmFzZV9Qcm9wZXJ0eT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDAxNCIvPg0KLSAgPEVjb3JlOkVBdHRyaWJ1dGUgeG1pOmlkPSJfNHFzNGdjVmJFZHkybXVRMlBRdkhfQSIgYmFzZV9Qcm9wZXJ0eT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDAxRSIvPg0KLSAgPEVjb3JlOkVBdHRyaWJ1dGUgeG1pOmlkPSJfNnQtLTRNVmJFZHkybXVRMlBRdkhfQSIgYmFzZV9Qcm9wZXJ0eT0iXzNBREM3Qjc0MDIyRDQxRTQ5NTNDMDMxOSIvPg0KLSAgPEVjb3JlOkVBdHRyaWJ1dGUgeG1pOmlkPSJfNnQtLTRjVmJFZHkybXVRMlBRdkhfQSIgYmFzZV9Qcm9wZXJ0eT0iXzNBREM3Qjc0MDIyRDQxRTQ5NTM3MDM0MyIvPg0KLSAgPEVjb3JlOkVBdHRyaWJ1dGUgeG1pOmlkPSJfOGRsN1VNVmJFZHkybXVRMlBRdkhfQSIgYmFzZV9Qcm9wZXJ0eT0iXzNBREM3Qjc0MDIyRDQxQkUyNTE4MDBEMiIvPg0KLSAgPEVjb3JlOkVBdHRyaWJ1dGUgeG1pOmlkPSJfQ0l1NU1NVmNFZHkybXVRMlBRdkhfQSIgYmFzZV9Qcm9wZXJ0eT0iXzNBREM3Qjc0MDIyRDQwRkQ0RjA2MDEzOCIvPg0KLSAgPEVjb3JlOkVBdHRyaWJ1dGUgeG1pOmlkPSJfQ0l1NU1jVmNFZHkybXVRMlBRdkhfQSIgYmFzZV9Qcm9wZXJ0eT0iXzNBREM3Qjc0MDIyRDQwRkQ0RjAxMDIwNiIvPg0KLSAgPEVjb3JlOkVBdHRyaWJ1dGUgeG1pOmlkPSJfQ0l1NU1zVmNFZHkybXVRMlBRdkhfQSIgYmFzZV9Qcm9wZXJ0eT0iXzNBREM3Qjc0MDIyRDQwRkQ0RUY4MDE5MiIvPg0KLSAgPEVjb3JlOkVBdHRyaWJ1dGUgeG1pOmlkPSJfQ0l1NU04VmNFZHkybXVRMlBRdkhfQSIgYmFzZV9Qcm9wZXJ0eT0iXzNBREM3Qjc0MDIyRDQwRkQ1RDUzMDExRCIvPg0KLSAgPEVjb3JlOkVBdHRyaWJ1dGUgeG1pOmlkPSJfQ0l1NU5NVmNFZHkybXVRMlBRdkhfQSIgYmFzZV9Qcm9wZXJ0eT0iXzNBREM3Qjc0MDIyRDQwRkQ1RDNFMDMyNSIvPg0KLSAgPEVjb3JlOkVBdHRyaWJ1dGUgeG1pOmlkPSJfQ0l1NU5jVmNFZHkybXVRMlBRdkhfQSIgYmFzZV9Qcm9wZXJ0eT0iXzNBREM3Qjc0MDIyRDQwRkQ0RUYwMDI3RiIvPg0KLSAgPEVjb3JlOkVBdHRyaWJ1dGUgeG1pOmlkPSJfRktKYndNVmNFZHkybXVRMlBRdkhfQSIgYmFzZV9Qcm9wZXJ0eT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDA4MiIvPg0KLSAgPEVjb3JlOkVBdHRyaWJ1dGUgeG1pOmlkPSJfRktKYndjVmNFZHkybXVRMlBRdkhfQSIgYmFzZV9Qcm9wZXJ0eT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDA5NiIvPg0KLSAgPEVjb3JlOkVBdHRyaWJ1dGUgeG1pOmlkPSJfRktKYndzVmNFZHkybXVRMlBRdkhfQSIgYmFzZV9Qcm9wZXJ0eT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDBBQSIvPg0KLSAgPEVjb3JlOkVBdHRyaWJ1dGUgeG1pOmlkPSJfRktKYnc4VmNFZHkybXVRMlBRdkhfQSIgYmFzZV9Qcm9wZXJ0eT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDA3OCIvPg0KLSAgPEVjb3JlOkVBdHRyaWJ1dGUgeG1pOmlkPSJfRktKYnhNVmNFZHkybXVRMlBRdkhfQSIgYmFzZV9Qcm9wZXJ0eT0iXzNBREM3Qjc0MDIyRDQxNEIzNzdEMDI3MiIvPg0KLSAgPEVjb3JlOkVBdHRyaWJ1dGUgeG1pOmlkPSJfRktKYnhjVmNFZHkybXVRMlBRdkhfQSIgYmFzZV9Qcm9wZXJ0eT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDA4RCIvPg0KLSAgPEVjb3JlOkVBdHRyaWJ1dGUgeG1pOmlkPSJfRktUTXdNVmNFZHkybXVRMlBRdkhfQSIgYmFzZV9Qcm9wZXJ0eT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDBCRSIvPg0KLSAgPEVjb3JlOkVBdHRyaWJ1dGUgeG1pOmlkPSJfRktUTXdjVmNFZHkybXVRMlBRdkhfQSIgYmFzZV9Qcm9wZXJ0eT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDBCNCIvPg0KLSAgPEVjb3JlOkVBdHRyaWJ1dGUgeG1pOmlkPSJfRktUTXdzVmNFZHkybXVRMlBRdkhfQSIgYmFzZV9Qcm9wZXJ0eT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDBCRiIvPg0KLSAgPEVjb3JlOkVBdHRyaWJ1dGUgeG1pOmlkPSJfTkYtcDRNVmNFZHkybXVRMlBRdkhfQSIgYmFzZV9Qcm9wZXJ0eT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDM1MiIvPg0KLSAgPEVjb3JlOkVBdHRyaWJ1dGUgeG1pOmlkPSJfTkdJYTRNVmNFZHkybXVRMlBRdkhfQSIgYmFzZV9Qcm9wZXJ0eT0iXzNBREM3Qjc0MDIyRDQxMzc2MjdEMDA4NCIvPg0KLSAgPEVjb3JlOkVBdHRyaWJ1dGUgeG1pOmlkPSJfTkdJYTRjVmNFZHkybXVRMlBRdkhfQSIgYmFzZV9Qcm9wZXJ0eT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDM4NSIvPg0KLSAgPEVjb3JlOkVBdHRyaWJ1dGUgeG1pOmlkPSJfTkdJYTRzVmNFZHkybXVRMlBRdkhfQSIgYmFzZV9Qcm9wZXJ0eT0iXzNBREM3Qjc0MDIyRDQxRUQ3QjY1MDM5NCIvPg0KLSAgPEVjb3JlOkVBdHRyaWJ1dGUgeG1pOmlkPSJfTkdJYTVNVmNFZHkybXVRMlBRdkhfQSIgYmFzZV9Qcm9wZXJ0eT0iXzNBREM3Qjc0MDIyRDQxMzc2MjgzMDE1QSIvPg0KLSAgPEVjb3JlOkVBdHRyaWJ1dGUgeG1pOmlkPSJfTkdJYTVjVmNFZHkybXVRMlBRdkhfQSIgYmFzZV9Qcm9wZXJ0eT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDJFNCIvPg0KLSAgPEVjb3JlOkVBdHRyaWJ1dGUgeG1pOmlkPSJfTkdJYTVzVmNFZHkybXVRMlBRdkhfQSIgYmFzZV9Qcm9wZXJ0eT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDM3QSIvPg0KLSAgPEVjb3JlOkVBdHRyaWJ1dGUgeG1pOmlkPSJfTkdJYTU4VmNFZHkybXVRMlBRdkhfQSIgYmFzZV9Qcm9wZXJ0eT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDM4RSIvPg0KLSAgPEVjb3JlOkVBdHRyaWJ1dGUgeG1pOmlkPSJfTkdJYTZNVmNFZHkybXVRMlBRdkhfQSIgYmFzZV9Qcm9wZXJ0eT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDM4NCIvPg0KLSAgPEVjb3JlOkVBdHRyaWJ1dGUgeG1pOmlkPSJfTkdJYTZjVmNFZHkybXVRMlBRdkhfQSIgYmFzZV9Qcm9wZXJ0eT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDM3MSIvPg0KLSAgPEVjb3JlOkVBdHRyaWJ1dGUgeG1pOmlkPSJfTkdJYTZzVmNFZHkybXVRMlBRdkhfQSIgYmFzZV9Qcm9wZXJ0eT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDM5OCIvPg0KLSAgPEVjb3JlOkVBdHRyaWJ1dGUgeG1pOmlkPSJfTkdJYTY4VmNFZHkybXVRMlBRdkhfQSIgYmFzZV9Qcm9wZXJ0eT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDNBQyIvPg0KLSAgPEVjb3JlOkVBdHRyaWJ1dGUgeG1pOmlkPSJfTkdJYTdNVmNFZHkybXVRMlBRdkhfQSIgYmFzZV9Qcm9wZXJ0eT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDNBRCIvPg0KLSAgPEVjb3JlOkVBdHRyaWJ1dGUgeG1pOmlkPSJfMXJ4cU1NWVVFZHlqZ3BzZ0M1cGt6QSIgYmFzZV9Qcm9wZXJ0eT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDA1QiIvPg0KLSAgPEVjb3JlOkVBdHRyaWJ1dGUgeG1pOmlkPSJfMlJ4VE1NWVVFZHlqZ3BzZ0M1cGt6QSIgYmFzZV9Qcm9wZXJ0eT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDA2NCIvPg0KLSAgPEVjb3JlOkVBdHRyaWJ1dGUgeG1pOmlkPSJfMi1lb01NWVVFZHlqZ3BzZ0M1cGt6QSIgYmFzZV9Qcm9wZXJ0eT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDA2RSIvPg0KLSAgPEVjb3JlOkVBdHRyaWJ1dGUgeG1pOmlkPSJfNDgxeVVNWVVFZHlqZ3BzZ0M1cGt6QSIgYmFzZV9Qcm9wZXJ0eT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDA2RiIvPg0KLSAgPEVjb3JlOkVBdHRyaWJ1dGUgeG1pOmlkPSJfRVlMMFFNWVZFZHlqZ3BzZ0M1cGt6QSIgYmFzZV9Qcm9wZXJ0eT0iXzNBREM3Qjc0MDIyRDQyMzhFOTREMDAzRiIvPg0KLSAgPEVjb3JlOkVBdHRyaWJ1dGUgeG1pOmlkPSJfSV9GRzRNWVZFZHlqZ3BzZ0M1cGt6QSIgYmFzZV9Qcm9wZXJ0eT0iXzNBREM3Qjc0MDIyRDQxOEFDQTBBMDBFQiIvPg0KLSAgPEVjb3JlOkVBdHRyaWJ1dGUgeG1pOmlkPSJfVWRhTFlNWVZFZHlqZ3BzZ0M1cGt6QSIgYmFzZV9Qcm9wZXJ0eT0iXzNBREM3Qjc0MDIyRDQxQUU3MDczMDNCOCIvPg0KLSAgPEVjb3JlOkVBdHRyaWJ1dGUgeG1pOmlkPSJfZTNma29NWVZFZHlqZ3BzZ0M1cGt6QSIgYmFzZV9Qcm9wZXJ0eT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDNENCIvPg0KLSAgPEVjb3JlOkVBdHRyaWJ1dGUgeG1pOmlkPSJfZTNma29jWVZFZHlqZ3BzZ0M1cGt6QSIgYmFzZV9Qcm9wZXJ0eT0iXzNBREM3Qjc0MDIyRDQxMDA2QTZCMDFGQiIvPg0KLSAgPEVjb3JlOkVBdHRyaWJ1dGUgeG1pOmlkPSJfZTNma29zWVZFZHlqZ3BzZ0M1cGt6QSIgYmFzZV9Qcm9wZXJ0eT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDNDQSIvPg0KLSAgPEVjb3JlOkVBdHRyaWJ1dGUgeG1pOmlkPSJfZTNma284WVZFZHlqZ3BzZ0M1cGt6QSIgYmFzZV9Qcm9wZXJ0eT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDNCNiIvPg0KLSAgPEVjb3JlOkVBdHRyaWJ1dGUgeG1pOmlkPSJfbUs4a0lNWVZFZHlqZ3BzZ0M1cGt6QSIgYmFzZV9Qcm9wZXJ0eT0iXzNBREM3Qjc0MDIyRDQyODE0MkJCMDNCNSIvPg0KLSAgPEVjb3JlOkVBdHRyaWJ1dGUgeG1pOmlkPSJfckdHUGdNWVZFZHlqZ3BzZ0M1cGt6QSIgYmFzZV9Qcm9wZXJ0eT0iXzNBREM3Qjc0MDIyRDQxMTlBNTlBMDEyOSIvPg0KLSAgPEVjb3JlOkVBdHRyaWJ1dGUgeG1pOmlkPSJfckdHUGdjWVZFZHlqZ3BzZ0M1cGt6QSIgYmFzZV9Qcm9wZXJ0eT0iXzNBREM3Qjc0MDIyRDQxMTlBNzVDMDNEQiIvPg0KLSAgPEVjb3JlOkVBdHRyaWJ1dGUgeG1pOmlkPSJfckdHUGdzWVZFZHlqZ3BzZ0M1cGt6QSIgYmFzZV9Qcm9wZXJ0eT0iXzNBREM3Qjc0MDIyRDQxMTlBNThEMDBEOSIvPg0KLSAgPEVjb3JlOkVBdHRyaWJ1dGUgeG1pOmlkPSJfekJDczBNWVZFZHlqZ3BzZ0M1cGt6QSIgYmFzZV9Qcm9wZXJ0eT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDNERSIvPg0KLSAgPEVjb3JlOkVBdHRyaWJ1dGUgeG1pOmlkPSJfekJDczBjWVZFZHlqZ3BzZ0M1cGt6QSIgYmFzZV9Qcm9wZXJ0eT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDNENSIvPg0KLSAgPEVjb3JlOkVBdHRyaWJ1dGUgeG1pOmlkPSJfekJDczBzWVZFZHlqZ3BzZ0M1cGt6QSIgYmFzZV9Qcm9wZXJ0eT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDNDMCIvPg0KLSAgPEVjb3JlOkVBdHRyaWJ1dGUgeG1pOmlkPSJfNVRPY2tNWVZFZHlqZ3BzZ0M1cGt6QSIgYmFzZV9Qcm9wZXJ0eT0iXzNBREM3Qjc0MDIyRDQxMDgxOEVFMDA5RiIvPg0KLSAgPEVjb3JlOkVBdHRyaWJ1dGUgeG1pOmlkPSJfOW9Ga0FNWVZFZHlqZ3BzZ0M1cGt6QSIgYmFzZV9Qcm9wZXJ0eT0iXzNBREM3Qjc0MDIyRDQxMkE1Rjg2MDJGNiIvPg0KLSAgPEVjb3JlOkVBdHRyaWJ1dGUgeG1pOmlkPSJfOW9Ga0FjWVZFZHlqZ3BzZ0M1cGt6QSIgYmFzZV9Qcm9wZXJ0eT0iXzNBREM3Qjc0MDIyRDQxM0VDMDE4MDM0MCIvPg0KLSAgPEVjb3JlOkVBdHRyaWJ1dGUgeG1pOmlkPSJfdjJITWNNWVdFZHlqZ3BzZ0M1cGt6QSIgYmFzZV9Qcm9wZXJ0eT0iXzNBREM3Qjc0MDIyRDQwRjZCMEU2MDNDNyIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9oYXJFVU1pTUVkeXhPNEVzdVFPZ1RnIiBiYXNlX0NvbW1lbnQ9Il9oYVlKM2NpTUVkeXhPNEVzdVFPZ1RnIi8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX2hhckVVY2lNRWR5eE80RXN1UU9nVGciIGJhc2VfQ29tbWVudD0iX2hhWUoxY2lNRWR5eE80RXN1UU9nVGciLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfaGFyRVVzaU1FZHl4TzRFc3VRT2dUZyIgYmFzZV9Db21tZW50PSJfaGFZSmpjaU1FZHl4TzRFc3VRT2dUZyIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9oYXJFVThpTUVkeXhPNEVzdVFPZ1RnIiBiYXNlX0NvbW1lbnQ9Il9oYVlOLWNpTUVkeXhPNEVzdVFPZ1RnIi8+DQotICA8RWNvcmU6RUF0dHJpYnV0ZSB4bWk6aWQ9Il81VllmRU1pT0VkeXhPNEVzdVFPZ1RnIiBiYXNlX1Byb3BlcnR5PSJfaGFZT0VjaU1FZHl4TzRFc3VRT2dUZyIvPg0KLSAgPEVjb3JlOkVBdHRyaWJ1dGUgeG1pOmlkPSJfNVZZZkVjaU9FZHl4TzRFc3VRT2dUZyIgYmFzZV9Qcm9wZXJ0eT0iX2hhWU5fc2lNRWR5eE80RXN1UU9nVGciLz4NCi0gIDxFY29yZTpFQXR0cmlidXRlIHhtaTppZD0iXzVWWWZFc2lPRWR5eE80RXN1UU9nVGciIGJhc2VfUHJvcGVydHk9Il9oYVlPRU1pTUVkeXhPNEVzdVFPZ1RnIi8+DQotICA8RWNvcmU6RUF0dHJpYnV0ZSB4bWk6aWQ9Il81VllmRThpT0VkeXhPNEVzdVFPZ1RnIiBiYXNlX1Byb3BlcnR5PSJfaGFZTl84aU1FZHl4TzRFc3VRT2dUZyIvPg0KLSAgPEVjb3JlOkVBdHRyaWJ1dGUgeG1pOmlkPSJfTDV2eUlNaVBFZHl4TzRFc3VRT2dUZyIgYmFzZV9Qcm9wZXJ0eT0iX2hhWU9Vc2lNRWR5eE80RXN1UU9nVGciLz4NCi0gIDxFY29yZTpFQXR0cmlidXRlIHhtaTppZD0iX1NSNF84TWlQRWR5eE80RXN1UU9nVGciIGJhc2VfUHJvcGVydHk9Il9oYVlPVDhpTUVkeXhPNEVzdVFPZ1RnIi8+DQotICA8RWNvcmU6RUF0dHJpYnV0ZSB4bWk6aWQ9Il9YYnpnRU1pUEVkeXhPNEVzdVFPZ1RnIiBiYXNlX1Byb3BlcnR5PSJfaGFZT0ZNaU1FZHl4TzRFc3VRT2dUZyIvPg0KLSAgPEVjb3JlOkVBdHRyaWJ1dGUgeG1pOmlkPSJfbmR2NXNNaVBFZHl4TzRFc3VRT2dUZyIgYmFzZV9Qcm9wZXJ0eT0iX2hhWU9ROGlNRWR5eE80RXN1UU9nVGciLz4NCi0gIDxFY29yZTpFQXR0cmlidXRlIHhtaTppZD0iX25kdjVzY2lQRWR5eE80RXN1UU9nVGciIGJhc2VfUHJvcGVydHk9Il9oYVlPUXNpTUVkeXhPNEVzdVFPZ1RnIi8+DQotICA8RWNvcmU6RUF0dHJpYnV0ZSB4bWk6aWQ9Il8yWTZSY01pUEVkeXhPNEVzdVFPZ1RnIiBiYXNlX1Byb3BlcnR5PSJfaGFZT2tzaU1FZHl4TzRFc3VRT2dUZyIvPg0KLSAgPEVjb3JlOkVBdHRyaWJ1dGUgeG1pOmlkPSJfMlk2UmNjaVBFZHl4TzRFc3VRT2dUZyIgYmFzZV9Qcm9wZXJ0eT0iX2hhWU9sOGlNRWR5eE80RXN1UU9nVGciLz4NCi0gIDxFY29yZTpFQXR0cmlidXRlIHhtaTppZD0iXzJZNlJjc2lQRWR5eE80RXN1UU9nVGciIGJhc2VfUHJvcGVydHk9Il9oYVlPazhpTUVkeXhPNEVzdVFPZ1RnIi8+DQotICA8RWNvcmU6RUF0dHJpYnV0ZSB4bWk6aWQ9Il8yWTZSYzhpUEVkeXhPNEVzdVFPZ1RnIiBiYXNlX1Byb3BlcnR5PSJfaGFZT2xNaU1FZHl4TzRFc3VRT2dUZyIvPg0KLSAgPEVjb3JlOkVBdHRyaWJ1dGUgeG1pOmlkPSJfMlpFQ2NNaVBFZHl4TzRFc3VRT2dUZyIgYmFzZV9Qcm9wZXJ0eT0iX2hhWU9sY2lNRWR5eE80RXN1UU9nVGciLz4NCi0gIDxFY29yZTpFQXR0cmlidXRlIHhtaTppZD0iXzJaRUNjY2lQRWR5eE80RXN1UU9nVGciIGJhc2VfUHJvcGVydHk9Il9oYVlPbHNpTUVkeXhPNEVzdVFPZ1RnIi8+DQotICA8RWNvcmU6RUF0dHJpYnV0ZSB4bWk6aWQ9Il9GSUp0RU1pUUVkeXhPNEVzdVFPZ1RnIiBiYXNlX1Byb3BlcnR5PSJfaGFZT0FzaU1FZHl4TzRFc3VRT2dUZyIvPg0KLSAgPEVjb3JlOkVBdHRyaWJ1dGUgeG1pOmlkPSJfUE4wOGtNaVFFZHl4TzRFc3VRT2dUZyIgYmFzZV9Qcm9wZXJ0eT0iX2hhWU9UTWlNRWR5eE80RXN1UU9nVGciLz4NCi0gIDxFY29yZTpFQXR0cmlidXRlIHhtaTppZD0iX1RiLV9FTWlRRWR5eE80RXN1UU9nVGciIGJhc2VfUHJvcGVydHk9Il9oYVlPZzhpTUVkeXhPNEVzdVFPZ1RnIi8+DQotICA8RWNvcmU6RUF0dHJpYnV0ZSB4bWk6aWQ9Il9UY0lKQU1pUUVkeXhPNEVzdVFPZ1RnIiBiYXNlX1Byb3BlcnR5PSJfaGFZT2Y4aU1FZHl4TzRFc3VRT2dUZyIvPg0KLSAgPEVjb3JlOkVBdHRyaWJ1dGUgeG1pOmlkPSJfZmNsRElNaVFFZHl4TzRFc3VRT2dUZyIgYmFzZV9Qcm9wZXJ0eT0iX2hhWU9pOGlNRWR5eE80RXN1UU9nVGciLz4NCi0gIDxFY29yZTpFQXR0cmlidXRlIHhtaTppZD0iX2l6QXpjTWlRRWR5eE80RXN1UU9nVGciIGJhc2VfUHJvcGVydHk9Il9oYVlPS01pTUVkeXhPNEVzdVFPZ1RnIi8+DQotICA8RWNvcmU6RUF0dHJpYnV0ZSB4bWk6aWQ9Il9pekF6Y2NpUUVkeXhPNEVzdVFPZ1RnIiBiYXNlX1Byb3BlcnR5PSJfaGFZT0xNaU1FZHl4TzRFc3VRT2dUZyIvPg0KLSAgPEVjb3JlOkVBdHRyaWJ1dGUgeG1pOmlkPSJfdnVkOVFNaVFFZHl4TzRFc3VRT2dUZyIgYmFzZV9Qcm9wZXJ0eT0iX2hhWU9JY2lNRWR5eE80RXN1UU9nVGciLz4NCi0gIDxFY29yZTpFQXR0cmlidXRlIHhtaTppZD0iX3lDdkY4TWlRRWR5eE80RXN1UU9nVGciIGJhc2VfUHJvcGVydHk9Il9oYVlPVzhpTUVkeXhPNEVzdVFPZ1RnIi8+DQotICA8RWNvcmU6RUF0dHJpYnV0ZSB4bWk6aWQ9Il83UnQtQU1pUUVkeXhPNEVzdVFPZ1RnIiBiYXNlX1Byb3BlcnR5PSJfaGFZT1o4aU1FZHl4TzRFc3VRT2dUZyIvPg0KLSAgPEVjb3JlOkVBdHRyaWJ1dGUgeG1pOmlkPSJfX2UxZXNNaVFFZHl4TzRFc3VRT2dUZyIgYmFzZV9Qcm9wZXJ0eT0iX2hhWU9lY2lNRWR5eE80RXN1UU9nVGciLz4NCi0gIDxFY29yZTpFQXR0cmlidXRlIHhtaTppZD0iX2xPMGFJTW5tRWR5TjBjb2RFWGFSNmciIGJhc2VfUHJvcGVydHk9Il9PRnlwRU1ubUVkeU4wY29kRVhhUjZnIi8+DQotICA8RWNvcmU6RUF0dHJpYnV0ZSB4bWk6aWQ9Il9HaDVTY01ucEVkeU4wY29kRVhhUjZnIiBiYXNlX1Byb3BlcnR5PSJfaGNRU0FNbm5FZHlOMGNvZEVYYVI2ZyIvPg0KLSAgPEVjb3JlOkVBdHRyaWJ1dGUgeG1pOmlkPSJfOWhCY0FDWDNFZDJLbkoyeWpOWGhXUSIgYmFzZV9Qcm9wZXJ0eT0iX3BzTF9rQ1gzRWQyS25KMnlqTlhoV1EiLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfVGxORTRDWDRFZDJLbkoyeWpOWGhXUSIgYmFzZV9Db21tZW50PSJfVGxENjhDWDRFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9LQWZfQVNYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX0NvbW1lbnQ9Il9LQWZfQUNYNUVkMktuSjJ5ak5YaFdRIi8+DQotPC94bWk6WE1JPg0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvbW9kZWwvMS4wLjUvcHJvcGVydGllcy50eHQgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL21vZGVsLzEuMC41L3Byb3BlcnRpZXMudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZmFlODM4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvbW9kZWwvMS4wLjUvcHJvcGVydGllcy50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi1Nb2RlbAotPT09PT0KLU5vbi1OTFMgTWFya2VyczoJdHJ1ZQotQ29udGFpbm1lbnQgUHJveGllczoJdHJ1ZQotU3VwcHJlc3MgRU1GIE1ldGFkYXRhOglmYWxzZQotUm9vdCBFeHRlbmRzIENsYXNzOglvcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLmltcGwuTXVsdGlSZXNvdXJjZUVPYmplY3QKLVJvb3QgRXh0ZW5kcyBJbnRlcmZhY2U6CW9yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUuSU1vZGVsT2JqZWN0Ci1Db2RlIEZvcm1hdHRpbmc6CXRydWUKLUR5bmFtaWMgVGVtcGxhdGVzOgl0cnVlCi1UZW1wbGF0ZSBEaXJlY3Rvcnk6CS9vcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlL3RlbXBsYXRlcwotCi1QYWNrYWdlIChVbWEpCi09PT09PT09PT09PT09Ci1CYXNlIFBhY2thZ2U6IG9yZy5lY2xpcHNlLmVwZgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvbW9kZWwvMS4wLjUvdW1hLmVjb3JlIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9tb2RlbC8xLjAuNS91bWEuZWNvcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyYTc4NTcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9tb2RlbC8xLjAuNS91bWEuZWNvcmUKKysrIC9kZXYvbnVsbApAQCAtMSwxMjgyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZWNvcmU6RVBhY2thZ2UgeG1pOnZlcnNpb249IjIuMCIKLSAgICB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgeG1sbnM6ZWNvcmU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUiIG5hbWU9InVtYSIKLSAgICBuc1VSST0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC41L3VtYS5lY29yZSIgbnNQcmVmaXg9Im9yZy5lY2xpcHNlLmVwZi51bWEiPgotICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iMDYmI3hEOyYjeEE7MDUmI3hEOyYjeEE7MDQmI3hEOyYjeEE7MDMmI3hEOyYjeEE7MDEmI3hEOyYjeEE7MDIiLz4KLSAgPC9lQW5ub3RhdGlvbnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQ2xhc3NpZmllciIgYWJzdHJhY3Q9InRydWUiIGVTdXBlclR5cGVzPSIjLy9UeXBlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJVTUwgMi4wIG1ldGEtY2xhc3MgQ2xhc3NpZmllci4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaXNBYnN0cmFjdCIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIGxvd2VyQm91bmQ9IjEiIGVUeXBlPSIjLy9Cb29sZWFuIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJUeXBlIiBhYnN0cmFjdD0idHJ1ZSIgZVN1cGVyVHlwZXM9IiMvL1BhY2thZ2VhYmxlRWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVU1MIDIuMCBtZXRhLWNsYXNzIFR5cGUuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlBhY2thZ2VhYmxlRWxlbWVudCIgYWJzdHJhY3Q9InRydWUiCi0gICAgICBlU3VwZXJUeXBlcz0iIy8vTmFtZWRFbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJVTUwgMi4wIG1ldGEtY2xhc3MgUGFja2FnYWJsZSBFbGVtZW50LiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJOYW1lZEVsZW1lbnQiIGFic3RyYWN0PSJ0cnVlIiBlU3VwZXJUeXBlcz0iIy8vRWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVU1MIDIuMCBtZXRhLWNsYXNzIE5hbWVkIEVsZW1lbnQuICBEZWZpbmVkIHRoYXQgZXZlcnkgZWxlbWVudCBoYXMgYSBuYW1lLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJuYW1lIiBvcmRlcmVkPSJmYWxzZSIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkVsZW1lbnQiIGFic3RyYWN0PSJ0cnVlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJVTUwgMi4wIG1ldGEtY2xhc3MgRWxlbWVudC4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iU3RyaW5nIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5sYW5nLlN0cmluZyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBzdHJpbmcgaXMgYSBzZXF1ZW5jZSBvZiBjaGFyYWN0ZXJzIGluIHNvbWUgc3VpdGFibGUgY2hhcmFjdGVyIHNldCB1c2VkIHRvIGRpc3BsYXkgaW5mb3JtYXRpb24gYWJvdXQgdGhlIG1vZGVsLiBDaGFyYWN0ZXIgc2V0cyBtYXkgaW5jbHVkZSBub24tUm9tYW4gYWxwaGFiZXRzIGFuZCBjaGFyYWN0ZXJzLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJCb29sZWFuIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5sYW5nLkJvb2xlYW4iPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgQm9vbGVhbiB0eXBlIGlzIHVzZWQgZm9yIGxvZ2ljYWwgZXhwcmVzc2lvbiwgY29uc2lzdGluZyBvZiB0aGUgcHJlZGVmaW5lZCB2YWx1ZXMgdHJ1ZSBhbmQgZmFsc2UuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlBhY2thZ2UiIGVTdXBlclR5cGVzPSIjLy9OYW1lc3BhY2UgIy8vUGFja2FnZWFibGVFbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJVTUwgMi4wIG1ldGEtY2xhc3MgUGFja2FnZS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iTmFtZXNwYWNlIiBhYnN0cmFjdD0idHJ1ZSIgZVN1cGVyVHlwZXM9IiMvL05hbWVkRWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVU1MIDIuMCBtZXRhLWNsYXNzIE5hbWVzcGFjZS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iRGF0ZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEudXRpbC5EYXRlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJEYXRhIHR5cGUgdXNlZCBmb3IgYXR0cmlidXRlcyBvZiBtZXRhLW1vZGVsIGNsYXNzZXMgb2YgdGhlIHR5cGUgRGF0ZS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iVXJpIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5uZXQuVVJJIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJEYXRhIHR5cGUgdXNlZCBmb3IgYXR0cmlidXRlcyBvZiBtZXRhLW1vZGVsIGNsYXNzZXMgdGhhdCBwb2ludCB0byByZXNvdXJjZXMgc3VjaCBhcyBmaWxlcy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iU2V0IiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS51dGlsLlNldCIvPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IlNlcXVlbmNlIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS51dGlsLkxpc3QiLz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJJbnRlZ2VyIiBpbnN0YW5jZUNsYXNzTmFtZT0iaW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBbiBpbnRlZ2VyIGlzIGEgcHJpbWl0aXZlIHR5cGUgcmVwcmVzZW50aW5nIGludGVnZXIgdmFsdWVzLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJEb3VibGUiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLmxhbmcuRG91YmxlIi8+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQ29uc3RyYWludCIgZVN1cGVyVHlwZXM9IiMvL01ldGhvZEVsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgQ29uc3RyYWludCBpcyBhIE1ldGhvZCBFbGVtZW50IHRoYXQgcmVwcmVzZW50cyBhIGNvbmRpdGlvbiBvciByZXN0cmljdGlvbiBleHByZXNzZWQgaW4gbmF0dXJhbCBsYW5ndWFnZSB0ZXh0IG9yIGluIGEgbWFjaGluZSByZWFkYWJsZSBsYW5ndWFnZSBmb3IgdGhlIHB1cnBvc2Ugb2YgZGVjbGFyaW5nIHNvbWUgb2YgdGhlIHNlbWFudGljcyBvZiBhIE1ldGhvZCBFbGVtZW50LiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJib2R5IiBvcmRlcmVkPSJmYWxzZSIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhpcyBhdHRyaWJ1dGUgc3RvcmVzIHRoZSBkZWZpbml0aW9uIG9mIHRoZSBjb25zdHJhaW50LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJNZXRob2RFbGVtZW50IiBhYnN0cmFjdD0idHJ1ZSIgZVN1cGVyVHlwZXM9IiMvL1BhY2thZ2VhYmxlRWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRXZlcnkgY2xhc3MgZGVmaW5lZCBpbiB0aGlzIHNwZWNpZmljYXRpb24gaXMgZGVyaXZlZCBmcm9tIE1ldGhvZCBFbGVtZW50LiAgSW4gb3RoZXIgd29yZHMgTWV0aG9kIEVsZW1lbnQgaXMgdGhlIHJvb3QgZ2VuZXJhbGl6YXRpb24gZm9yIGFsbCBVTUEgY2xhc3NlcyBhbmQgZGVmaW5lcyBhIGNvbW1vbiBzZXQgb2YgYXR0cmlidXRlcyBpbmhlcml0ZWQgYnkgZXZlcnkgb3RoZXIgZWxlbWVudCB0eXBlIG9mIHRoaXMgbW9kZWwuICBNZXRob2QgRWxlbWVudCBpdHNlbGYgaXMgZGVyaXZlZCBmcm9tIFBhY2thZ2VhYmxlIEVsZW1lbnQgZnJvbSB0aGUgVU1MIDIuMCBJbmZyYXN0cnVjdHVyZS4gIE1ldGhvZCBFbGVtZW50IGluaGVyaXRzIHRoZSBOYW1lIGF0dHJpYnV0ZSBmcm9tIFBhY2thZ2VhYmxlIEVsZW1lbnQncyBzdXBlciBjbGFzcy4gIEV2ZXJ5IGVsZW1lbnQgZGVmaW5lZCBhcyBhIFVNQSBpbnN0YW5jZSBpcyBkZXJpdmVkIGZyb20gTW9kZWwgRWxlbWVudC4gIEV2ZXJ5IE1ldGhvZCBFbGVtZW50IGluLXN0YW5jZSBpcyBhdCBsZWFzdCBkZWZpbmVkIGJ5IGEgdW5pcXVlIGlkLCBhIG5hbWUsIGFzIHdlbGwgYXMgYnJpZWYgZGVzY3JpcHRpb24uJiN4RDsmI3hBO01ldGhvZCBFbGVtZW50IGluIHRoZSBwYWNrYWdlIE1ldGhvZCBQbHVnaW4gYWRkcyBhZGRpdGlvbmFsIHByb3BlcnRpZXMgdmlhIHBhY2thZ2UgbWVyZ2UgdG8gTWV0aG9kIEVsZW1lbnQgZGVmaW5lZCBpbiBNZXRob2QgQ29yZSBuZWVkZWQgZm9yIHRoZSB2YXJpYWJpbGl0eSBhbmQgZXh0ZW5zaWJpbGl0eSBjYXBhYmlsaXRpZXMgaW50cm9kdWNlcyBpbiB0aGlzIHBhY2thZ2UuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Imd1aWQiIG9yZGVyZWQ9ImZhbHNlIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiIGlEPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRXZlcnkgaW5zdGFuY2Ugb2YgTWV0aG9kIEVsZW1lbnQgaGFzIGEgZ2xvYmFsIHVuaXF1ZSBpZC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icHJlc2VudGF0aW9uTmFtZSIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9TdHJpbmciIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkV2ZXJ5IERlc2NyaWJhYmxlIEVsZW1lbnQgaGFzIGEgcHJlc2VudGF0aW9uIG5hbWUsIHdoaWNoIGlzIHVzZWQgZm9yIGV4dGVybmFsIHByZXNlbnRhdGlvbiBvZiB0aGUgZWxlbWVudC4gIEZvciBleGFtcGxlLCBuYW1lICh0aGUgaW50ZXJuYWwgcmVwcmVzZW50YXRpb24pIG1pZ2h0IGJlIHNldCB0byAmcXVvdDtydXBfYXJjaGl0ZWN0dXJlX2RvY3VtZW50JnF1b3Q7IHRvIGRpZmZlcmVudGlhdGUgZnJvbSBhICZxdW90O2oyZWVfYXJjaGl0Y3R1cmVfZG9jdW1lbnQmcXVvdDsgd2hlcmVhcyB0aGUgZXh0ZXJuYWwgcHJlc2VudGF0aW9uIHdvdWxkIGFsd2F5cyBiZSAmcXVvdDtBcmNoaXRlY3R1cmUgRG9jdW1lbnQmcXVvdDsuJiN4QTsiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYnJpZWZEZXNjcmlwdGlvbiIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9TdHJpbmciIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkV2ZXJ5IGluc3RhbmNlIG9mIE1ldGhvZCBFbGVtZW50IHNoYWxsIGJlIGJyaWVmbHkgZGVzY3JpYmVkIHdpdGggb25lIG9yIHR3byBzZW50ZW5jZXMgc3VtbWFyaXppbmcgdGhlIGVsZW1lbnQuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im93bmVkUnVsZXMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0NvbnN0cmFpbnQiIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im1ldGhvZEVsZW1lbnRQcm9wZXJ0eSIKLSAgICAgICAgb3JkZXJlZD0iZmFsc2UiIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vTWV0aG9kRWxlbWVudFByb3BlcnR5IiBjb250YWlubWVudD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJraW5kIiBvcmRlcmVkPSJmYWxzZSIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9LaW5kIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InN1cHByZXNzZWQiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICBsb3dlckJvdW5kPSIxIiBlVHlwZT0iIy8vQm9vbGVhbiIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJJZiBhIFZhcmlhYmlsaXR5IEVsZW1lbnQgaXMgZGVyaXZlZCBmcm9tIGFub3RoZXIgVmFyaWFiaWxpdHkgRWxlbWVudCB1c2luZyB0aGUgRXh0ZW5kcyBWYXJpYWJpbGl0eSBTcGVjaWFsaXphdGlvbiB0aGVuIHRoaXMgYXR0cmlidXRlIGNhbiBiZSB1c2VkIHRvIHN1cHByZXNzIGluaGVyaXRlZCBNZXRob2QgRWxlbWVudHMgdGhhdCB3ZXJlIHBhcnQgb2YgdGhlIGJhc2VkLW9uIFZhcmlhYmlsaXR5IEVsZW1lbnQsIHdoaWNoIGNhbiBiZSBhbnkgdHlwZSBvZiBNZXRob2QgRWxlbWVudC4gIEluIG90aGVyIHdvcmRzLCBpZiB0aGlzIGF0dHJpYnV0ZSBpcyBzZXQgdG8gdHJ1ZSBvbiBhIE1ldGhvZCBFbGVtZW50IHRoYXQgaGFzIHRoZSBzYW1lIG5hbWUgdGhhbiBhbiBpbmhlcml0ZWQgbWV0aG9kIGVsZW1lbnQgdGhlbiBpdCB3aWxsIG5vdCBiZSByZWdhcmRlZCBhcyBpbmhlcml0ZWQgYXQgYWxsLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJvcmRlcmluZ0d1aWRlIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL1N0cmluZyIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhpcyBhdHRyaWJ1dGUgaXMgdXNlZCBmb3IgQ0FTRSB0b29sIHJlYWxpemF0aW9ucyBvZiB0aGlzIG1vZGVsIHRvIGNvbnRhaW4gaW5mb3JtYXRpb24gYWJvdXQgbGF5b3V0IGFuZCBvcmRlcmluZyBvZiB0aGUgbWV0aG9kIGVsZW1lbnQgYW5kIGl0cyBwYXJ0cy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iTWV0aG9kRWxlbWVudFByb3BlcnR5IiBlU3VwZXJUeXBlcz0iIy8vUGFja2FnZWFibGVFbGVtZW50Ij4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idmFsdWUiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vU3RyaW5nIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iS2luZCIgZVN1cGVyVHlwZXM9IiMvL0NvbnRlbnRFbGVtZW50Ij4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iYXBwbGljYWJsZU1ldGFDbGFzc0luZm8iCi0gICAgICAgIG9yZGVyZWQ9ImZhbHNlIiB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0FwcGxpY2FibGVNZXRhQ2xhc3NJbmZvIiBjb250YWlubWVudD0idHJ1ZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJDb250ZW50RWxlbWVudCIgYWJzdHJhY3Q9InRydWUiIGVTdXBlclR5cGVzPSIjLy9EZXNjcmliYWJsZUVsZW1lbnQgIy8vVmFyaWFiaWxpdHlFbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJDb250ZW50IEVsZW1lbnQgaXMgYSBEZXNjcmliYWJsZSBFbGVtZW50IHRoYXQgcmVwcmVzZW50cyBhbiBhYnN0cmFjdCBnZW5lcmFsaXphdGlvbiBmb3IgYWxsIGVsZW1lbnRzIHRoYXQgYXJlIGNvbnNpZGVyZWQgdG8gYmUgYW5kIG1hbmFnZWQgYXMgTWV0aG9kIENvbnRlbnQuJiN4QTtDb250ZW50IEVsZW1lbnRzIHJlcHJlc2VudHMgcmV1c2FibGUgTWV0aG9kIENvbnRlbnQgdGhhdCBpcyBzdXBwb3NlZCB0byBiZSBtYW5hZ2VkIGluIENvbnRlbnQgUGFja2FnZXMuICBUaGUgc2VwYXJhdGlvbiBvZiBDb250ZW50IEVsZW1lbnQgZnJvbSBQcm9jZXNzIEVsZW1lbnQgYWxsb3dzIHRvIGNsZWFybHkgZGlzdGluZ3Vpc2ggYmV0d2VlbiBwdXJlIG1ldGhvZCBjb250ZW50IGZyb20gY29udGVudCB0aGF0IGlzIHJlcHJlc2VudGVkIGluIHByb2Nlc3Nlcy4mI3hBOyYjeEQ7JiN4QTtUaGlzIGlzIHRoZSBHdWlkYW5jZSBUeXBlcyBwYWNrYWdlJ3MgZXh0ZW5zaW9uIG9mIENvbnRlbnQgRWxlbWVudCAoZGVmaW5lZCBpbiBDb250ZW50IEVsZW1lbnRzKSBwcm92aWRpbmcgYWRkaXRvbmFsIGFzc29jaWF0aW9ucy4mI3hEOyYjeEE7Q29udGVudCBFbGVtZW50IGluIHRoZSBwYWNrYWdlIE1ldGhvZCBQbHVnaW4gaW5oZXJpdHMgZnJvbSBWYXJpYWJpbGl0eSBFbGVtZW50IGFuZCBub3QgZGlyZWN0bHkgZnJvbSBNZXRob2QgRWxlbWVudCBhbnltb3JlLiAgVGhpcyBpcyBhY2hpZXZlZCB1c2luZyBVTUwgMi4wIHBhY2thZ2UgbWVyZ2Ugc2VtYW50aWNzLiAgT25seSBpZiBhbiBhZG9wdGVyIG9mIHRoaXMgbWV0YS1tb2RlbCBkZWNpZGVzIHRvIHJlYWxpemUgTWV0aG9kIFBsdWdpbnMsIGhlIHdvdWxkIGdldCB0aGUgdmFyaWFiaWxpdHkgYW5kIGV4dGVuc2lvbiBjYXBhYmlsaXRpZXMgZm9yIGFsbCBDb250ZW50IEVsZW1lbnRzLiYjeEE7Q29udGVudCBFbGVtZW50IGluaGVyaXRzIHRoZSBzZW1hbnRpY3Mgb2YgVmFyaWFiaWxpdHkgRWxlbWVudC4mI3hBOyIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJzdXBwb3J0aW5nTWF0ZXJpYWxzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9TdXBwb3J0aW5nTWF0ZXJpYWwiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iY29uY2VwdHNBbmRQYXBlcnMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0NvbmNlcHQiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iY2hlY2tsaXN0cyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vQ2hlY2tsaXN0Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Imd1aWRlbGluZXMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0d1aWRlbGluZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJleGFtcGxlcyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vRXhhbXBsZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJhc3NldHMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1JldXNhYmxlQXNzZXQiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0idGVybWRlZmluaXRpb24iIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1Rlcm1EZWZpbml0aW9uIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkRlc2NyaWJhYmxlRWxlbWVudCIgYWJzdHJhY3Q9InRydWUiCi0gICAgICBlU3VwZXJUeXBlcz0iIy8vTWV0aG9kRWxlbWVudCAjLy9DbGFzc2lmaWVyIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJEZXNjcmliYWJsZSBFbGVtZW50IGlzIGFuIGFic3RyYWN0IGdlbmVyYWxpemF0aW9uIG9mIE1ldGhvZCBFbGVtZW50cyBmb3Igd2hpY2ggZXh0ZXJuYWwgcHJlc2VudGF0aW9uIG5hbWVzIGFzIHdlbGwgYXMgY29udGVudCBkZXNjcmlwdGlvbnMgaGF2ZSBiZWVuIGRlZmluZWQsIHN1Y2ggYXMgUm9sZXMgb3IgV29yayBQcm9kdWN0cy4gIFByZXNlbnRhdGlvbiBOYW1lIGFuZCBDb250ZW50IERlc2NyaXB0aW9ucyBhcmUgdHlwaWNhbGx5IGxvY2FsaXplZCB1c2luZyBhIHJlc291cmNlIGFsbG9jYXRpb24gbWVjaGFuaXNtIGZvciBpdHMgU3RyaW5nIHR5cGUgYXR0cmlidXRlcy4mI3hBO1RoaXMgYWJzdHJhY3Rpb24gcmVwcmVzZW50cyBhbGwgZWxlbWVudHMgaW4gdGhlIE1ldGhvZCBDb250ZW50IGFzIHdlbGwgYXMgUHJvY2VzcyBzcGFjZSBmb3Igd2hpY2ggY29uY3JldGUgdGV4dHVhbCBkZXNjcmlwdGlvbnMgYXJlIGRlZmluZWQgaW4gdGhlIGZvcm0gb2YgZG9jdW1lbnRpbmcgYXR0cmlidXRlcyBncm91cGVkIGluIGEgbWF0Y2hpbmcgQ29udGVudCBEZXNjcmlwdGlvbiBpbnN0YW5jZSAoc2VlIFNlY3Rpb24gNC4xLjQpLiAgRGVzY3JpYmFibGUgRWxlbWVudHMgYXJlIGludGVuZGVkIHRvIGJlIHB1Ymxpc2hlZCBpbiBtZXRob2Qgb3IgcHJvY2VzcyBwdWJsaWNhdGlvbnMgKHNpbWlsYXIgdG8gdGhlIElCTSBSYXRpb25hbCBVbmlmaWVkIFByb2Nlc3Mgd2ViKS4gIERlc2NyaWJhYmxlIEVsZW1lbnQgZGVmaW5lcyB0aGF0IHRoZSBlbGVtZW50IGl0IHJlcHJlc2VudHMgd2lsbCBoYXZlIGNvbnRlbnQgJ2F0dGFjaGVkJyB0byBpdC4gIENvbnRlbnQgRGVzY3JpcHRpb24gaXMgdGhlIGFic3RyYWN0aW9uIGZvciB0aGUgYWN0dWFsIHBsYWNlcyBpbiB3aGljaCB0aGUgY29udGVudCBpcyBiZWluZyByZXByZXNlbnRlZC4gIFRoaXMgc2VwYXJhdGlvbiBhbGxvd3MgYSBkaXN0aW5jdGlvbiBiZXR3ZWVuIGNvcmUgbWV0aG9kIG1vZGVsIGVsZW1lbnRzIGRlc2NyaWJpbmcgdGhlIHN0cnVjdHVyZSBvZiB0aGUgbW9kZWwgZnJvbSB0aGUgYWN0dWFsIGRlc2NyaXB0aW9uIGNvbnRhaW5lciBwcm92aWRpbmcsIGZvciBleGFtcGxlLCB0aGUgZG9jdW1lbnRhdGlvbiBvZiB0aGUgY29udGVudCBlbGVtZW50IGluIGRpZmZlcmVudCBhbHRlcm5hdGl2ZXMgbGFuZ3VhZ2VzLCBhdWRpZW5jZXMsIGxpY2Vuc2luZyBsZXZlbHMsIGV0Yy4mI3hBOyYjeEQ7JiN4QTtUaGlzIGRlZmluaXRpb24gb2YgQ29udGVudCBFbGVtZW50IGV4dGVuZHMgdGhlIENvbnRlbnQgRWxlbWVudCBkZWZpbml0aW9uIHZpYSBwYWNrYWdlIG1lcmdlIHdpdGggcmVmZXJlbmNlcyB0byBpY29ucyB0aGF0IGFyZSB1c2VkIGZvciBwcmVzZW50aW5nIENvbnRlbnQgRWxlbWVudHMgaW4gYSBVTUEtYmFzZWQgbW9kZWxpbmcgZW52aXJvbm1lbnQgYXMgd2VsbCBhcyB3aGVuIHB1Ymxpc2hpbmcgQ29udGVudCBFbGVtZW50cyBpbnRvIGRvY3VtZW50YXRpb24gcHJlc2VudGF0aW9uIChlLmcuIGRvY3VtZW50IG9yIGh0bWwgcGFnZXMpLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJwcmVzZW50YXRpb24iIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vQ29udGVudERlc2NyaXB0aW9uIiBjb250YWlubWVudD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzaGFwZWljb24iIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vVXJpIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSByZWZlcmVuY2UgdG8gYW4gaWNvbiB0aGF0IGNhbiBiZSB1c2VkIGZvciBtb2RlbGluZyB3aXRoIHNwZWNpZmljIENvbnRlbnQgRWxlbWVudCBpbnN0YW5jZXMgKGFzIGdyYXBoaWNhbCBzdGVyZW90eXBlcywgZS5nLiBhIHVzZSBjYXNlIHN5bWJvbCBmb3IgYSB1c2UgY2FzZSBhcnRpZmFjdCkgYXMgd2VsbCBhcyBwdWJsaWNhdGlvbiBvZiBjb250ZW50LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJub2RlaWNvbiIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9VcmkiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIHJlZmVyZW5jZSB0byBhbiBpY29uIHRoYXQgY2FuIGJlIHVzZWQgaW4gdHJlZSBicm93c2VyIHByZXNlbnRhdGlvbnMgYW5kIGJyZWFrZG93biBzdHJ1Y3R1cmVzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJDb250ZW50RGVzY3JpcHRpb24iIGVTdXBlclR5cGVzPSIjLy9NZXRob2RVbml0Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJDb250ZW50IERlc2NyaXB0aW9uIGlzIGEgTWV0aG9kIEVsZW1lbnQgdGhhdCBpcyB1c2VkIHRvIHN0b3JlIHRoZSB0ZXh0dWFsIGRlc2NyaXB0aW9uIGZvciBhIENvbnRlbnQgRWxlbWVudC4gIEl0IGRlZmluZXMgc3RhbmRhcmQgYXR0cmlidXRlcyBhcHBsaWNhYmxlIGZvciBhbGwgQ29udGVudCBFbGVtZW50IHR5cGVzLiAgU3BlY2lmaWMgQ29udGVudCBFbGVtZW50IHN1Yi10eXBlcyBjYW4gZGVmaW5lIHRoZWlyIG93biBtYXRjaGluZyBDb250ZW50IERlc2NyaXB0aW9uIHN1Yi10eXBlcy4gIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im1haW5EZXNjcmlwdGlvbiIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9TdHJpbmciIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoaXMgYXR0cmlidXRlIHN0b3JlIHRoZSBtYWluIGRlc2NyaXB0aXZlIHRleHQgZm9yIHRoZSBDb250ZW50IEVsZW1lbnQuICBBbGwgdGV4dCB0aGF0IGlzIG5vdCBwYXJ0IG9mIGFueSBvZiB0aGUgbW9yZSBzcGVjaWZpYyBhdHRyaWJ1dGVzIHNoYWxsIGJlIHN0b3JlZCBoZXJlLiAgSWYgdGhlIENvbnRlbnQgRGVzY3JpcHRpb24gaXMgZGl2aWRlZCBpbnRvIHNlY3Rpb25zIHVzaW5nIHRoZSBTZWN0aW9uIGNsYXNzLCB0aGVuIG9ubHkgdGhlIHRleHQgZnJvbSB0aGUgJ3N0YXJ0JyBvZiB0aGUgY29udGVudCBkZXNjcmlwdGlvbiB0byB0aGUgZmlyc3Qgc2VjdGlvbiB3aWxsIGJlIHN0b3JlZCBoZXJlIChzaW1pbGFyIHRvIGEgbm9ybWFsIGRvY3VtZW50IHdoZXJlIHlvdSBjYW4gcGxhY2UgdGV4dCBiZXR3ZWVuIGl0cyBiZWdpbm5pbmcgdG8gaXRzIGZpcnN0IGRpY3Rpb24gaGVhZGluZykuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InNlY3Rpb25zIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9TZWN0aW9uIiBjb250YWlubWVudD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJleHRlcm5hbElkIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL1N0cmluZyIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQW4gZXh0ZXJuYWwgdmlzaWJsZSBudW1iZXIgb3IgbGFiZWwgdGhhdCBpcyB1c2VkIHRvIHJlZmVyZW5jZSB0aGlzIGVsZW1lbnQuIFVzZWQgbGlrZSBhIHN5bm9ueW0gdG8gdGhlIG5hbWUuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImtleUNvbnNpZGVyYXRpb25zIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL1N0cmluZyIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iS2V5IENvbnNpZGVyYXRpb25zIHByb3ZpZGVzIGFkdmlzZSBhbmQgZ3VpZGFuY2Ugb2YgYSBjcml0aWNhbCBuYXR1cmUgZm9yIHRoZSBjb250ZW50IGVsZW1lbnQgYXMgd2VsbCBhcyB3YXJuaW5ncywgY2F1dGlvbnMsIHBpdGZhbGxzLCBkYW5nZXJzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJsb25nUHJlc2VudGF0aW9uTmFtZSIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIGxvd2VyQm91bmQ9IjEiIGVUeXBlPSIjLy9TdHJpbmciLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iTWV0aG9kVW5pdCIgYWJzdHJhY3Q9InRydWUiIGVTdXBlclR5cGVzPSIjLy9NZXRob2RFbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIE1ldGhvZCBVbml0IGlzIGEgc3BlY2lhbCBNZXRob2QgRWxlbWVudCB0aGF0IHNoYWxsIGJlIG1haW50YWluZWQgaW4gYSBNZXRob2QgTGlicmFyeSBhcyBhIHNlcGFyYXRlIHVuaXQgb2YgY29udHJvbC4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYXV0aG9ycyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9TdHJpbmciIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkV2ZXJ5IE1ldGhvZCBVbml0IGlzIGJlaW5nIGNyZWF0ZWQgYW5kIG93bmVkIGJ5IGFuIGF1dGhvciBvciBhdXRob3JpbmcgdGVhbS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY2hhbmdlRGF0ZSIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9EYXRlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGRhdGUgdGhlIGxhc3QgY2hhbmdlIHRoYXQgcmVzdWx0ZWQgaW50byB0aGlzIHZlcnNpb24gaGFzIGJlZW4gbWFkZS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY2hhbmdlRGVzY3JpcHRpb24iIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vU3RyaW5nIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZGVzY3JpcHRpb24gb2YgdGhlIGxhc3QgY2hhbmdlIHRoYXQgcmVzdWx0ZWQgaW50byB0aGlzIHZlcnNpb24uIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InZlcnNpb24iIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vU3RyaW5nIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJFdmVyeSBQYWNrYWdlIGhhcyBhIHZlcnNpb24gbnVtYmVyIHVzZWQgdG8gdHJhY2sgY2hhbmdlcy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iY29weXJpZ2h0U3RhdGVtZW50IiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL1N1cHBvcnRpbmdNYXRlcmlhbCIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJTdXBwb3J0aW5nTWF0ZXJpYWwiIGVTdXBlclR5cGVzPSIjLy9HdWlkYW5jZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iU3VwcG9ydGluZyBNYXRlcmlhbHMgaXMgY2F0Y2hhbGwgZm9yIG90aGVyIHR5cGVzIG9mIGd1aWRhbmNlIG5vdCBzcGVjaWZpY2FsbHkgZGVmaW5lZCBlbHNld2hlcmUuIEl0IGNhbiBiZSByZWxhdGVkIHRvIGFsbCBraW5kcyBvZiBDb250ZW50IEVsZW1lbnRzLCBpLmUuIGluY2x1ZGluZyBvdGhlciBndWlkYW5jZSBlbGVtZW50cy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iR3VpZGFuY2UiIGFic3RyYWN0PSJ0cnVlIiBlU3VwZXJUeXBlcz0iIy8vQ29udGVudEVsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9Ikd1aWRhbmNlIGlzIGFuIGFic3RyYWN0IGdlbmVyYWxpemF0aW9uIG9mIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVsYXRlZCB0byBjb250ZW50IGVsZW1lbnRzIHN1Y2ggYXMgUm9sZXMsIFRhc2tzLCBhbmQgV29yayBQcm9kdWN0cy4gIEV4YW1wbGVzIGZvciBHdWlkYW5jZSBhcmUgR3VpZGVsaW5lcywgVGVtcGxhdGVzLCBDaGVja2xpc3RzLCBUb29sIE1lbnRvcnMsIEVzdGltYXRlcywgU3VwcG9ydGluZyBNYXRlcmlhbHMsIFJlcG9ydHMsIENvbmNlcHRzLCBldGMuICBUaGlzIHBhY2thZ2Ugb25seSBjb250YWlucyB0aGUgZGVmaW5pdGlvbiBvZiB0aGUgYWJzdHJhY3QgR3VpZGFuY2UgY2xhc3MuICBUaGUgcGFja2FnZSBHdWlkYW5jZSBUeXBlcyBkZWZpbmVzIGNvbmNyZXRlIGd1aWRhbmNlIHR5cGVzLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJTZWN0aW9uIiBlU3VwZXJUeXBlcz0iIy8vVmFyaWFiaWxpdHlFbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIFNlY3Rpb24gaXMgYSBzcGVjaWFsIE1ldGhvZCBFbGVtZW50IHRoYXQgcmVwcmVzZW50cyBzdHJ1Y3R1cmFsIHN1YnNlY3Rpb25zIG9mIGEgQ29udGVudCBEZXNjcmlwdGlvbidzIHNlY3Rpb25EZXNjcmlwdGlvbiBhdHRyaWJ1dGUuICBJdCBpcyB1c2VkIGZvciBlaXRoZXIgbGFyZ2Ugc2NhbGUgZG9jdW1lbnRhdGlvbiBvZiBDb250ZW50IEVsZW1lbnRzIG9yZ2FuaXplZCBpbnRvIHNlY3Rpb25zIGFzIHdlbGwgYXMgdG8gZmxleGlibHkgYWRkIG5ldyBTZWN0aW9ucyB0byBDb250ZW50IEVsZW1lbnRzIHVzaW5nIGNvbnRyaWJ1dGlvbiB2YXJpYWJpbGl0eSBhZGRlZCB0byB0aGUgU2VjdGlvbiBjb25jZXB0IGZvciBNZXRob2QgUGx1Zy1pbnMuJiN4RDsmI3hBO1NlY3Rpb24gaW4gdGhlIHBhY2thZ2UgTWV0aG9kIFBsdWdpbiBpbmhlcml0cyBmcm9tIFZhcmlhYmlsaXR5IEVsZW1lbnQgYW5kIGV4dGVuZHMgU2VjdGlvbiBkZWZpbmVkIGluIE1ldGhvZCBDb3JlIDo6IEJhc2ljIEVsZW1lbnRzIHdpdGggbmV3IGNhcGFiaWxpdGllcyBmb3IgdmFyaWFiaWxpdHkuICYjeEE7Rm9yIGV4YW1wbGUsIHdoZW4gYSBUYXNrIGNvbnRyaWJ1dGVzIHRvIGFub3RoZXIgVGFzayBpdHMgUHJlc2VudGF0aW9uIGFzc29jaWF0aW9uIGlzIGNvbnRyaWJ1dGVkIGluY2x1ZGluZyBpdHMgU2VjdGlvbnMgKGkuZS4gaXRzIFN0ZXBzKSwgd2hpY2ggYXJlIG1vZGVsZWQgYXMgcGFydHMgb2YgdGhlIENvbnRlbnQgRGVzY3JpcHRpb24gaW5zdGFuY2UuICBTZWN0aW9ucyBjYW4gYmUgbmVzdGVkIGFuZCB0aGVyZWZvcmUgVGFzayBEZXNjcmlwdGlvbnMgY2FuIGJlIGZsZXhpYmx5IG9yZ2FuaXplZCBpbiBTdGVwcyB3aXRoIHN1Yi1TdGVwcy4gIFNlY3Rpb25zIGFyZSBWYXJpYWJpbGl0eSBFbGVtZW50cyB0aGVtc2VsdmVzLCBzbyB0aGV5IGNhbiBjb250cmlidXRlIHRvIGVhY2ggb3RoZXIuICBGb3IgZXhhbXBsZSwgb25lIGNvdWxkIG1vZGVsIGEgVGFzayBzdGVwIGFzIGEgU2VjdGlvbiBpbnN0YW5jZSB3aXRob3V0IHJlbGF0aW5nIGl0IHRvIGEgVGFzayBEZXNjcmlwdGlvbiB0aGF0IGRpcmVjdGx5IGNvbnRyaWJ1dGVzIHRvIChvciByZXBsYWNlcykgYW5vdGhlciBTZWN0aW9uIHdoaWNoIGlzIHBhcnQgb2YgYSBUYXNrIERlc2NyaXB0aW9uLiAgVGhpcyBjb250cmlidXRpb24gKG9yIHJlcGxhY2VtZW50KSB3b3VsZCBhZGQgbmV3IGRlc2NyaXB0aW9uIHRleHQgdG8gdGhlIG9yaWdpbmFsIHN0ZXAgZGVzY3JpcHRpb24gKG9yIHJlcGxhY2UgdGhlIG9yaWdpbmFsIHN0ZXAgZGVzY3JpcHRpb24pLiAgQW5vdGhlciBleGFtcGxlIHdvdWxkIGJlIHRvIGNvbnRyaWJ1dGUgbmV3IENoZWNrIExpc3QgaXRlbXMgb3JnYW5pemVkIGFzIFNlY3Rpb25zIHRvIGFuIGV4aXN0aW5nIENoZWNrIExpc3QgKGRlZmluZWQgYXMgZ3VpZGFuY2UpLiAgJiN4QTsmI3hBOyIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzZWN0aW9uTmFtZSIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9TdHJpbmciIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkV2ZXJ5IFNlY3Rpb24gaGFzIGEgbmFtZSB1c2VkIGZvciBleHRlcm5hbCBwcmVzZW50YXRpb24gb2YgdGhlIHNlY3Rpb24sIGUuZy4gd2hlbiBwdWJsaXNoZWQgb3Igd2hlbiBzZWN0aW9uIGhlYWRpbmcgYXJlIGxpc3RlZCBpbiBhIHRhYmxlIG9mIGNvbnRlbnRzLiAgVGhpcyBhdHRyaWJ1dGUgaXMgc2ltaWxhciB0byBQcmVzZW50YXRpb24gTmFtZSBmb3IgQ29udGVudCBFbGVtZW50cy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic2VjdGlvbkRlc2NyaXB0aW9uIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL1N0cmluZyIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhpcyBhdHRyaWJ1dGVzIHN0b3JlIHRoZSBkZXNjcmlwdGlvbiB0ZXh0IGZvciBhIENvbnRlbnQgRGVzY3JpcHRpb24ncyBTZWN0aW9uLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJzdWJTZWN0aW9ucyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vU2VjdGlvbiIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icHJlZGVjZXNzb3IiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vU2VjdGlvbiIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJWYXJpYWJpbGl0eUVsZW1lbnQiIGFic3RyYWN0PSJ0cnVlIgotICAgICAgZVN1cGVyVHlwZXM9IiMvL01ldGhvZEVsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlZhcmlhYmlsaXR5IEVsZW1lbnQgaXMgYW4gYWJzdHJhY3QgY2xhc3MgZGVyaXZlZCBmcm9tIE1ldGhvZCBFbGVtZW50IHRoYXQgcHJvdmlkZXMgbmV3IGNhcGFiaWxpdGllcyBmb3IgY29udGVudCB2YXJpYXRpb24gYW5kIGV4dGVuc2lvbiB0byBDb250ZW50IEVsZW1lbnRzIG9yIGFueSBvdGhlciBNZXRob2QgRWxlbWVudCB0aGF0IGRlcml2ZXMgZnJvbSBpdC4gIEl0IGhhcyBiZWVuIHBsYWNlZCBpbi1iZXR3ZWVuIHRoZSBjbGFzc2VzIE1ldGhvZCBFbGVtZW50IGFuZCBDb250ZW50IEVsZW1lbnQgaW4gdGhlIG92ZXJhbGwgVU1BIHRheG9ub215IG9mIGNsYXNzZXMgdXNpbmcgdGhlIFVNTCAyLjAgcGFja2FnZSBtZXJnZSBtZWNoYW5pc20uICBUaGUgYXNzb2NpYXRpb24gVmFyaWFiaWxpdHkgU3BlY2lhbGl6YXRpb24gc2hhbGwgb25seSBiZSBpbnN0YW50aWF0ZWQgYmV0d2VlbiB0d28gc3ViY2xhc3NlcyBvZiBWYXJpYWJpbGl0eSBFbGVtZW50IG9mIHRoZSBzYW1lIHR5cGUuICBUaGUgZWxlbWVudCBvbiB2YXJhaWJpbGl0eVNwZWNpYWxFbGVtZW50IHNpZGUgb2YgdGhlIHJlbGF0aW9uc2hpcCBkZWZpbmVzIGEgdmFsdWUgZm9yIHRoZSBhdHRyaWJ1dGUgdmFyaWFiaWxpdHlUeXBlIGRlZmluaW5nIHRoZSBuYXR1cmUgb2YgdGhlIHJlbGF0aW9uc2hpcCB1c2luZyBhIGxpdGVyYWwgZnJvbSB0aGUgZW51bWVyYXRpb24gVmFyaWFiaWxpdHkgVHlwZS4mI3hBO1ZhcmlhYmlsaXR5IEVsZW1lbnQgb2YgdGhlIG1ldGEtbW9kZWwgcGFja2FnZSBNZXRob2QgUGx1Z2lucyBhZGRzIHRoZSBjYXBhYmlsaXRpZXMgb2YgdmFyaWF0aW9uIGFuZCBleHRlbnNpb24gdG8gTWV0aG9kIEVsZW1lbnRzIHRoYXQgZGVyaXZlIGZyb20gaXQuICBCeSBkZWZhdWx0IGFsbCBDb250ZW50IEVsZW1lbnRzIHN1Y2ggYXMgUm9sZSwgVGFzaywgR3VpZGFuY2UgVHlwZXMsIG9yIEFjdGl2aXRpZXMgYXJlIGRlZmluZWQgdG8gYmUgVmFyaWFiaWxpdHkgRWxlbWVudHMuJiN4QTtWYXJpYWJpbGl0eSBhbmQgZXh0ZW5zaW9uIHByb3ZpZGVzIHVuaXF1ZSBtZWNoYW5pc21zIGZvciBjdXN0b21pemluZyBtZXRob2QgY29udGVudCB3aXRob3V0IGFjdHVhbGx5IGRpcmVjdGx5IG1vZGlmeWluZyB0aGUgb3JpZ2luYWwgY29udGVudCwgYnV0IGJ5IGp1c3QgYmUgYWJsZSB0byBkZXNjcmliZSB3aXRoIHNlcGFyYXRlIG9iamVjdHMgdGhlIGRpZmZlcmVuY2VzIChhZGRpdGlvbnMsIGNoYW5nZXMsIG9taXNzaW9ucykgcmVsYXRpdmUgdG8gdGhlIG9yaWdpbmFsLiAgVGhpcyBwbHVnLWluIGNvbmNlcHQgYWxsb3dzIHVzZXJzIHRvIGZhY3RvciB0aGVpciBtZXRob2QgY29udGVudCBhbmQgcHJvY2Vzc2VzIGluIGludGVycmVsYXRlZCB1bml0cyBhbmQgZXZlbiB0byBhcmNoaXRlY3QgbWV0aG9kIGNvbnRlbnQgYW5kIHByb2Nlc3NlcyBpbiBsYXllcnMgdGhhdCBleHRlbmQgZWFjaCBvdGhlciB3aXRoIG5ldyBjYXBhYmlsaXRpZXMuICBUaGUgcmVzdWx0aW5nIG1ldGhvZCBhbmQgcHJvY2VzcyBkZXNpZ24gY2FuIGJlIGR5bmFtaWNhbGx5IGNvbWJpbmVkIGFuZCBhcHBsaWVkIG9uIGRlbWFuZCB1c2luZyB0aGUgaW50ZXJwcmV0YXRpb24gcnVsZXMgZGVmaW5lZCBmb3IgVmFyaWFiaWxpdHkgRWxlbWVudCBTcGVjaWFsaXphdGlvbnMgYXNzZW1ibGluZyB0byBwcm9jZXNzIHByYWN0aXRpb25lcnMgdGhlIG1vc3QgYWNjdXJhdGUgbWV0aG9kIGFuZCBwcm9jZXNzIGRlc2NyaXB0aW9ucyBwb3NzaWJsZS4gIEl0IGFsc28gYWxsb3dzIHByb2Nlc3MgcHJhY3RpdGlvbmVycyB0byBleHRlbmRzIGFuZCB0YWlsb3IgbWV0aG9kIGNvbnRlbnQgYW5kIHByb2Nlc3NlcyB0aGV5IGRvIG5vdCBvd24gYW5kIHRvIGVhc2lseSB1cGdyYWRlIHRvIG5ld2VyIHZlcnNpb25zIGJ5IHNpbXBseSByZWFwcGx5IHRoZWlyIHBlcnNvbmFsIGNoYW5nZXMgdG8gdGhlc2UgdXBncmFkZXMuJiN4QTtWYXJpYWJpbGl0eSBFbGVtZW50IGRlZmluZXMgdHdvIHR5cGVzIG9mIHZhcmlhYmlsaXR5IGFuZCBvbmUgdHlwZSBvZiBleHRlbnNpb24gd2hpY2ggYXJlIGZvcm1hbGx5IGRlZmluZWQgZm9yIHRoZSBlbnVtZXJhdGlvbiBWYXJpYWJpbGl0eSBUeXBlLiYjeEE7Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InZhcmlhYmlsaXR5VHlwZSIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIGxvd2VyQm91bmQ9IjEiIGVUeXBlPSIjLy9WYXJpYWJpbGl0eVR5cGUiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9Im5hIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iSWYgaW4gaW5zdGFuY2Ugb2YgdGhlIHZhcmlhYmlsaXR5U3BlY2lhbGl6YXRpb24gYXNzb2NpYXRpb24gYmV0d2VlbiB0d28gVmFyaWFiaWxpdHkgRWxlbWVudHMgb2YgdGhlIHNhbWUgdHlwZSBleGlzdHMsIHRoZW4gdGhlIHZhcmlhYmlsaXR5VHlwZSBhdHRyaWJ1dGUgc3BlY2lmaWVzIGhvdyB0aGUgZWxlbWVudCBhdCB0aGUgdmFyaWFiaWxpdHlTcGVjaWFsRWxlbWVudCBlbmQgb2YgdGhlIGFzc29jaWF0aW9uIGNoYW5nZXMgdGhlIENvbnRlbnQgRWxlbWVudCBhdCB0aGUgdmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCBlbmQuIFNlZSB0aGUgVmFyaWFiaWxpdHkgVHlwZSBlbnVtZXJhdGlvbiBjbGFzcyBmb3IgZGVmaW5pdGlvbnMgZm9yIHRoZSBkaWZmZXJlbnQgdHlwZXMgb2YgdmFyaWFiaWxpdHkuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQiCi0gICAgICAgIG9yZGVyZWQ9ImZhbHNlIiBsb3dlckJvdW5kPSIxIiBlVHlwZT0iIy8vVmFyaWFiaWxpdHlFbGVtZW50Ii8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRW51bSIgbmFtZT0iVmFyaWFiaWxpdHlUeXBlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJWYXJpYWJpbGl0eSBUeXBlIGlzIGFuIEVudW1lcmF0aW9uIHVzZWQgZm9yIHZhbHVlcyBmb3IgaW5zdGFuY2VzIG9mIFZhcmlhYmlsaXR5IEVsZW1lbnQncyBhdHRyaWJ1dGUgdmFyaWFiaWxpdHlUeXBlLiAgSXQgZGVmaW5lcyB0aGUgbmF0dXJlIG9mIGhvdyBhIFZhcmlhYmlsaXR5IEVsZW1lbnQgZXh0ZW5kcyBhbm90aGVyIFZhcmlhYmlsaXR5IEVsZW1lbnQuIFNlZSBlbnVtZXJhdGlvbiBsaXRlcmFscyBmb3IgZGVmaW5pdGlvbnMgZm9yIGVhY2ggdHlwZS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9Im5hIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhpcyBpcyB0aGUgZGVmYXVsdCAmcXVvdDtub3QgYXNzaWduZWQmcXVvdDsgdmFsdWUgb2YgYSBWYXJpYWJpbGxpdHkgRWxlbWVudCdzIHZhcmlhYmlsaXR5VHlwZSBhdHRyaWJ1dGUgd2hpY2ggaXMgc2V0IGluIHRoZSBjYXNlIG5vIHZhcmlhYmlsaXR5IGFzc29jaWF0aW9uIGlzIHByZXNlbnQgYmV0d2VlbiB0aGUgVmFyaWFiaWxpdHkgRWxlbWVudCBhbmQgb3RoZXIgVmFyaWFiaWxpdHkgRWxlbWVudHMuJiN4QTsiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZUxpdGVyYWxzPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iY29udHJpYnV0ZXMiIHZhbHVlPSIxIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQ29udHJpYnV0ZXMgcHJvdmlkZXMgYSB3YXkgZm9yIGluc3RhbmNlcyBvZiBWYXJpYWJpbGl0eSBFbGVtZW50cyB0byBjb250cmlidXRlIHRoZWlyIHByb3BlcnRpZXMgaW50byB0aGVpciBiYXNlIFZhcmlhYmlsaXR5IEVsZW1lbnQgd2l0aG91dCBkaXJlY3RseSBhbHRlcmluZyBhbnkgb2YgaXRzIGV4aXN0aW5nIHByb3BlcnRpZXMsIGkuZS4gaW4gYW4gYWRkaXRpdmUgZmFzaGlvbi4gIFByb3BlcnRpZXMgY29udHJpYnV0ZWQgYXJlOiBhdHRyaWJ1dGUgdmFsdWVzIGFuZCBhc3NvY2lhdGlvbiBpbnN0YW5jZXMuICBUaGUgZWZmZWN0IGFmdGVyIGludGVycHJldGF0aW9uIG9mIGNvbnRyaWJ1dGlvbiBpcyB0aGF0IHRoZSBiYXNlIFZhcmlhYmlsaXR5IEVsZW1lbnQgaXMgbG9naWNhbGx5IHJlcGxhY2VkIHdpdGggYW4gYXVnbWVudGVkIHZhcmlhbnQgb2YgdGhlIGVsZW1lbnQgdGhhdCBjb21iaW5lcyBhdHRyaWJ1dGUgdmFsdWVzIGFuZCBhc3NvY2lhdGlvbiBpbnN0YW5jZXMuICBUaGUgd2F5IHRoaXMgY29tYmluYXRpb24gaXMgcmVhbGl6ZWQgZGVwZW5kcyBvbiB0aGUgdHlwZSBvZiB0aGUgYXR0cmlidXRlIG9yIGFzc29jaWF0aW9uLiAgRm9yIGV4YW1wbGUsIFN0cmluZyBhdHRyaWJ1dGVzIGFyZSBjb25jYXRlbmF0ZWQgcmVzb2x2aW5nIGVtYmVkZGVkIGNvbW1hbmRzIGZvciBkZXBlbmRlbnQgdGV4dCBvciBtZXJnaW5nIHRleHQgZnJhZ21lbnRzIChlLmcuIGRlc2NyaXB0aW9ucyBmb3IgY29udGVudCBlbGVtZW50cykuICBBZGRpdGlvbmFsIGVsZW1lbnRzIGluIHRvLW1hbnkgYXNzb2NpYXRpb25zIGFyZSBhZGRlZCAoZS5nLiBhZGRpdGlvbmFsIEd1aWRhbmNlIGVsZW1lbnRzIG9yIFRhc2sgRGVzY3JpcHRvcnMgb2YgYW4gQWN0aXZpdHkpLiAgRGlmZmVyZW50IGVsZW1lbnRzIGluIHRvLW9uZSBhc3NvY2lhdGlvbnMgYXJlIGlnbm9yZWQgKGUuZy4gdGhlIG9uZSBQcmltYXJ5IFBlcmZvcm1lciBvZiBhIFRhc2spLiAgTXVsdGlwbGUgQ29udGVudCBFbGVtZW50cyBjYW4gY29udHJpYnV0ZSB0byB0aGUgc2FtZSBiYXNlIGVsZW1lbnQgYW5kIGFsbCBvZiB0aGVzZSBjb250cmlidXRpb25zIHByb3BlcnRpZXMgYXJlIGFkZGVkIHRvIHRoZSBiYXNlIGluIHRoZSBzYW1lIGZhc2hpb24uIFRoZSBmb2xsb3dpbmcgdGFibGUgcHJvdmlkZXMgdGhlIGRldGFpbGVkIGxpc3Qgb2YgaW50ZXJwcmV0YXRpb24gcnVsZXM6JiN4QTthdHRyaWJ1dGUgdmFsdWVzOiYjeDk7U3RyaW5nIHZhbHVlcyBmcm9tIHRoZSBzcGVjaWFsIFZhcmlhYmlsaXR5IEVsZW1lbnQgYXJlIGNvbmNhdGVuYXRlZCB3aXRoIHZhbHVlcyBmcm9tIHRoZSBiYXNlZC1vbiBWYXJpYWJpbGl0eSBFbGVtZW50LiAgT3RoZXIgdmFsdWVzIGZyb20gdGhlIHNwZWNpYWwgVmFyaWFiaWxpdHkgRWxlbWVudCBvZiBhbnkgb3RoZXIgdHlwZSBzdWNoIGFzIEludGVnZXIsIERhdGUgYXJlIGlnbm9yZWQuJiN4QTtUaGUgaWRlbnRpZnlpbmcgYXR0cmlidXRlcyBndWlkIGFuZCBuYW1lIG9mIE1ldGhvZCBFbGVtZW50IGFyZSBleGVtcHQgZnJvbSB0aGlzIHJ1bGUgYW5kIHdpbGwgbm90IGJlIG1vZGlmaWVkLiYjeEE7MC4uMS1hc3NvY2lhdGlvbiBpbnN0YW5jZXM6JiN4OTtUaGUgb25lIGFzc29jaWF0aW9uIGluc3RhbmNlIG9mIHRoZSBiYXNlZC1vbiBWYXJpYWJpbGl0eSBFbGVtZW50IGlzIGtlcHQgYW5kIGFueSBhc3NvY2lhdGlvbiBmcm9tIHRoZSBjb250cmlidXRpbmcgc3BlY2lhbCBWYXJpYWJpbGl0eSBFbGVtZW50IGlzIGlnbm9yZWQuJiN4QTswLi5uLWFzc29jaWF0aW9uIGluc3RhbmNlczomI3g5O0Fzc29jaWF0aW9uIGluc3RhbmNlcyBvZiB0aGUgc3BlY2lhbCBWYXJpYWJpbGl0eSBFbGVtZW50IGFyZSBhZGRlZCB0byB0aGUgYWxyZWFkeSBleGlzdGluZyBhc3NvY2lhdGlvbiBpbnN0YW5jZXMgb2YgdGhlIGJhc2VkLW9uIGVsZW1lbnQuICBJZiBib3RoIFZhcmlhYmlsaXR5IEVsZW1lbnRzIHJlZmVyIHRvIHRoZSBzYW1lIG9iamVjdCB0aGVuIG9ubHkgb25lIGluc3RhbmNlIG9mIHRoZSBhc3NvY2lhdGlvbiB3aWxsIHJlbWFpbi4mI3hBOyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lTGl0ZXJhbHM+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJleHRlbmRzIiB2YWx1ZT0iMiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkV4dGVuc2lvbiBhbGxvd3MgTWV0aG9kIFBsdWdpbnMgdG8gZWFzaWx5IHJldXNlIGVsZW1lbnRzIGZyb20gYSBCYXNlIFBsdWdpbiBieSBwcm92aWRpbmcgYSBraW5kIG9mIGluaGVyaXRhbmNlIGZvciB0aGUgc3BlY2lhbCBWYXJpYWJpbGl0eSBFbGVtZW50LiAgQXR0cmlidXRlIHZhbHVlcyBhbmQgQXNzb2NpYXRpb24gaW5zdGFuY2VzIGFyZSBpbmhlcml0ZWQgZnJvbSB0aGUgYmFzZWQtb24gVmFyaWFiaWxpdHkgRWxlbWVudCB0byB0aGUgc3BlY2lhbCBWYXJpYWJpbGl0eSBFbGVtZW50LiAgVGhlIHJlc3VsdCBvZiBpbnRlcnByZXRhdGlvbiBpcyB0aGF0IHRoZSBzcGVjaWFsIGVsZW1lbnQgaGFzIHRoZSBzYW1lIHByb3BlcnRpZXMgYXMgdGhlIGJhc2VkLW9uIGhhcywgYnV0IG1pZ2h0IGRlZmluZSBpdHMgb3duIGFkZGl0aW9ucy4gIEhlbmNlIGV4dGVuZHMgaXMgbm90IHVzZWQgdG8gbW9kaWZ5IGNvbnRlbnQgb2YgdGhlIGJhc2UgUGx1Z2luLCBidXQgdG8gcHJvdmlkZSB0aGUgYWJpbGl0eSBmb3IgdGhlIGV4dGVuZGluZyBQbHVnaW4gdG8gZGVmaW5lIGl0cyBvd24gY29udGVudCB3aGljaCBpcyBhIHZhcmlhbnQgb2YgY29udGVudCBhbHJlYWR5IGRlZmluZWQgKGUuZy4gYSBzcGVjaWFsIHZlcnNpb24gb2YgYSBnZW5lcmljIFJldmlldyBSZWNvcmQgZm9yIGEgc3BlY2lmaWMgdHlwZSBvZiByZXZpZXcpLiAgVGhlIGVmZmVjdCBvZiB0aGlzIGlzIHRoYXQgdGhlIGJhc2UgVmFyaWFiaWxpdHkgRWxlbWVudCBhbmQgYW55IG51bWJlciBvZiBleHRlbmRpbmcgVmFyaWFiaWxpdHkgRWxlbWVudHMgY2FuIGJlIHVzZWQgc2lkZSBieSBzaWRlLCBidXQgcmVmZXIgdG8gZWFjaCBvdGhlciB2aWEgdGhlIGV4dGVuZHMgcmVsYXRpb25zaGlwLiAgRXh0ZW5kcyBhbHNvIHByb3ZpZGVzIHRoZSBrZXkgbWVjaGFuaXNtIGZvciBiaW5kaW5nIENhcGFiaWxpdHkgUGF0dGVybnMgdG8gUHJvY2Vzc2VzOiBBIHBhdHRlcm4gaXMgYXBwbGllZCBieSBkZWZpbmluZyBhbiBleHRlbmRzIHJlbGF0aW9uc2hpcHMgZnJvbSBhbiBBY3Rpdml0eSBvZiB0aGUgYXBwbHlpbmcgUHJvY2Vzc2VzIHRvIHRoZSBQYXR0ZXJuLiAgVGhlIEFjdGl2aXR5IGluaGVyaXRzIGFzc29jaWF0aW9ucyBpbnN0YW5jZXMgZnJvbSB0aGUgcGF0dGVybiBhbmQgdGhlIHBhdHRlcm4gYXBwZWFycyB0byBiZSBwYXJ0IG9mIHRoZSByZXN1bHRpbmcgUHJvY2VzcyBhZnRlciBJbnRlcnByZXRhdGlvbi4mI3hBO2F0dHJpYnV0ZSB2YWx1ZXM6JiN4OTtWYWx1ZXMgZnJvbSB0aGUgYmFzZWQtb24gVmFyaWFiaWxpdHkgZWxlbWVudCBhcmUgaW5oZXJpdGVkIGFuZCB1c2VkIHRvIHBvcHVsYXRlIHRoZSBzcGVjaWFsIFZhcmlhYmlsaXR5IEVsZW1lbnRzIGF0dHJpYnV0ZXMuICBJZiB0aGUgc3BlY2lhbCBlbGVtZW50IGF0dHJpYnV0ZXMgYXJlIGFscmVhZHkgcG9wdWxhdGVkIHRoZSBpbmhlcml0ZWQgdmFsdWVzIGFyZSBpZ25vcmVkLiAgJiN4QTtUaGUgaWRlbnRpZnlpbmcgYXR0cmlidXRlcyBndWlkIGFuZCBuYW1lIG9mIE1ldGhvZCBFbGVtZW50IGFyZSBleGVtcHQgZnJvbSB0aGlzIHJ1bGUgYW5kIHdpbGwgbm90IGJlIG1vZGlmaWVkLiYjeEE7MC4uMS1hc3NvY2lhdGlvbiBpbnN0YW5jZXM6JiN4OTtUaGUgb25lIGFzc29jaWF0aW9uIGluc3RhbmNlIG9mIHRoZSBiYXNlZC1vbiBWYXJpYWJpbGl0eSBFbGVtZW50IGlzIGluaGVyaXRlZCB0byB0aGUgc3BlY2lhbCBWYXJpYWJpbGl0eSBFbGVtZW50LiAgSWYgdGhlIHNwZWNpYWwgVmFyaWFiaWxpdHkgRWxlbWVudCBkZWZpbmVzIGl0cyBvd24gYXNzb2NpYXRpb24gaW5zdGFuY2UgdGhlbiB0aGUgaW5oZXJpdGVkIG9uZSBpcyBpZ25vcmVkLiYjeEE7MC4ubi1hc3NvY2lhdGlvbiBpbnN0YW5jZXM6JiN4OTtBc3NvY2lhdGlvbiBpbnN0YW5jZXMgZGVmaW5lZCBmb3IgdGhlIGJhc2VkLW9uIFZhcmlhYmlsaXR5IEVsZW1lbnQgYXJlIGluaGVyaXRlZCB0byB0aGUgc3BlY2lhbCBWYXJpYWJpbGl0eSBFbGVtZW50LiAgVGhlIHNwZWNpYWwgZWxlbWVudCBjYW4gYWRkIGFkZGl0aW9uYWwgYXNzb2NpYXRpb24gaW5zdGFuY2VzLiYjeEE7JiN4QTsiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZUxpdGVyYWxzPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0icmVwbGFjZXMiIHZhbHVlPSIzIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iUmVwbGFjZXMgcHJvdmlkZXMgYSB3YXkgZm9yIFZhcmlhYmlsaXR5IEVsZW1lbnRzIHRvIHJlcGxhY2UgYSBiYXNlIFZhcmlhYmlsaXR5IEVsZW1lbnQgd2l0aG91dCBkaXJlY3RseSBjaGFuZ2luZyBhbnkgb2YgaXRzIGV4aXN0aW5nIHByb3BlcnRpZXMuICBUaGlzIGlzIGluIG1vc3QgY2FzZXMgdXNlZCBmb3IgTWV0aG9kIFBsdWdpbnMgdGhhdCBhaW0gdG8gcmVwbGFjZSBzcGVjaWZpYyBDb250ZW50IEVsZW1lbnRzIHN1Y2ggYXMgUm9sZXMsIFRhc2ssIG9yIEFjdGl2aXRpZXMgd2l0aCBlaXRoZXIgYSBjb21wbGV0ZSBuZXcgdmFyaWFudCBvciB0byBjaGFuZ2UgZnVuZGFtZW50YWwgcmVsYXRpb25zaGlwcyBvZiB0aGVzZSBlbGVtZW50cyAoZS5nLiBSb2xlLUFydGlmYWN0IHJlc3BvbnNpYmlsaXR5KS4gIFByb3BlcnRpZXMgcmVwbGFjZWQgYXJlIGF0dHJpYnV0ZSB2YWx1ZXMgYW5kIGFzc29jaWF0aW9uIGluc3RhbmNlcy4gIFRoZSBlZmZlY3Qgb2YgdGhpcyBpcyB0aGF0IHRoZSBiYXNlIENvbnRlbnQgRWxlbWVudCBpcyBsb2dpY2FsbHkgcmVwbGFjZWQgd2l0aCB0aGlzIG5ldyB2YXJpYW50IG9mIHRoZSBlbGVtZW50IHRvIHdoaWNoIGFsbCBpbmNvbWluZyBhc3NvY2lhdGlvbnMgc3RpbGwgcG9pbnQgYXMgYmVmb3JlLCBidXQgd2hpY2ggaGFzIHBvdGVudGlhbGx5IG5ldyBhdHRyaWJ1dGUgdmFsdWVzIGFuZCBvdXRnb2luZyBhc3NvY2lhdGlvbiBwcm9wZXJ0aWVzLiAgVGhpcyBwcm92aWRlcyBhIHZlcnkgcG93ZXJmdWwgbWVjaGFuaXNtIHRvIHJlcGxhY2UsIGZvciBleGFtcGxlLCB3aG9sZSBBY3Rpdml0aWVzIGluIGEgUHJvY2VzcyB3aXRoIGNvbXBsZXRlIG5ldyByZWFsaXphdGlvbnMgb2YgdGhlIEFjdGl2aXR5LiAgRm9yIGluc3RhbmNlLCByZXBsYWNpbmcgYW4gQWN0aXZpdHkgZG9pbmcgdXNlIGNhc2UtYmFzZWQgZGVzaWduIHdpdGggYW4gYWN0aXZpdHkgZG9pbmcgYWdpbGUgY29kZS1jZW50cmljIGRldmVsb3BtZW50IGRvaW5nIHRoZSBzYW1lIHdvcmsgdXNpbmcgYSBkaWZmZXJlbnQgZGV2ZWxvcG1lbnQgdGVjaG5pcXVlIHV0aWxpemluZyBkaWZmZXJlbnQgUm9sZXMsIFRhc2tzLCBldGMuICBBbm90aGVyIGV4YW1wbGUsIHdvdWxkIGJlIHRvIHJlcGxhY2UgYW4gQWN0aXZpdHkgdGhhdCBkZXNjcmliZXMgZGF0YWJhc2UgZGVzaWduIGZvciBhbiBSREJNUyB3aXRoIGFuIEFjdGl2aXR5IHRoYXQgZGVzY3JpYmVzIGRhdGFiYXNlIGRlc2lnbiBmb3IgYW4gT09EQk1TLiAgQSBWYXJpYWJpbGl0eSBFbGVtZW50IGNhbiBvbmx5IGJlIHJlcGxhY2VkIGJ5IG9uZSBvdGhlciBlbGVtZW50IGF0IGEgdGltZS4gIEZvciBleGFtcGxlLCBpZiB0d28gTWV0aG9kIFBsdWdpbnMgcmVwbGFjZSB0aGUgc2FtZSBlbGVtZW50IG9ubHkgb25lIE1ldGhvZCBQbHVnaW4gY2FuIGJlIHVzZWQgZm9yIGludGVycHJldGF0aW9uIChzZWUgY29uY2VwdCBvZiBNZXRob2QgQ29uZmlndXJhdGlvbiBmb3IgbW9yZSBkZXRhaWxzIG9uIGhvdyB0byByZXNvbHZlIHN1Y2ggY29uZmxpY3RzLCBTZWN0aW9uIDcuMS4yKS4gIFRoZSBmb2xsb3dpbmcgdGFibGUgcHJvdmlkZXMgdGhlIGRldGFpbGVkIGxpc3Qgb2YgaW50ZXJwcmV0YXRpb24gcnVsZXM6JiN4QTthdHRyaWJ1dGUgdmFsdWVzOiYjeDk7VmFsdWVzIGZyb20gdGhlIHNwZWNpYWwgVmFyaWFiaWxpdHkgRWxlbWVudCBhcmUgcmVwbGFjZWQgd2l0aCB2YWx1ZXMgZnJvbSB0aGUgYmFzZWQtb24gVmFyaWFiaWxpdHkgRWxlbWVudCBpbmNsdWRpbmcgdW5hc3NpZ25lZCB2YWx1ZXMuJiN4QTtUaGUgaWRlbnRpZnlpbmcgYXR0cmlidXRlcyBndWlkIGFuZCBuYW1lIG9mIE1ldGhvZCBFbGVtZW50IGFyZSBleGVtcHQgZnJvbSB0aGlzIHJ1bGUgYW5kIHdpbGwgbm90IGJlIG1vZGlmaWVkLiYjeEE7MC4uMS1hc3NvY2lhdGlvbiBpbnN0YW5jZXM6JiN4OTtUaGUgb25lIGFzc29jaWF0aW9uIGluc3RhbmNlIG9mIHRoZSBiYXNlZC1vbiBWYXJpYWJpbGl0eSBFbGVtZW50IGlzIHJlcGxhY2VkIHdpdGggdGhlIGFzc29jaWF0aW9uIGluc3RhbmNlIGZyb20gdGhlIHJlcGxhY2luZyBzcGVjaWFsIFZhcmlhYmlsaXR5IEVsZW1lbnQuICBJZiB0aGUgc3BlY2lhbCBWYXJpYWJpbGl0eSBFbGVtZW50IGRvZXMgbm90IGhhdmUgYW4gYXNzb2NpYXRpb24gaW5zdGFuY2UgdGhlbiByZXN1bHRpbmcgZWxlbWVudCB3aWxsIGFsc28gbm90IGhhdmUgYW4gYXNzb2NpYXRpb24uJiN4QTswLi5uLWFzc29jaWF0aW9uIGluc3RhbmNlczomI3g5O0Fzc29jaWF0aW9uIGluc3RhbmNlcyBvZiB0aGUgc3BlY2lhbCBWYXJpYWJpbGl0eSBFbGVtZW50IHJlcGxhY2UgYWxsIGFzc29jaWF0aW9uIGluc3RhbmNlcyBvZiB0aGUgYmFzZWQtb24gVmFyaWFiaWxpdHkgRWxlbWVudC4mI3hBOyYjeEE7Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VMaXRlcmFscz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9ImxvY2FsQ29udHJpYnV0aW9uIiB2YWx1ZT0iNCIvPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0ibG9jYWxSZXBsYWNlbWVudCIgdmFsdWU9IjUiLz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9ImV4dGVuZHNSZXBsYWNlcyIgdmFsdWU9IjYiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQ29uY2VwdCIgZVN1cGVyVHlwZXM9IiMvL0d1aWRhbmNlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIENvbmNlcHQgaXMgYSBzcGVjaWZpYyB0eXBlIG9mIGd1aWRhbmNlIHRoYXQgb3V0bGluZXMga2V5IGlkZWFzIGFzc29jaWF0ZWQgd2l0aCBiYXNpYyBwcmluY2lwbGVzIHVuZGVybHlpbmcgdGhlIHJlZmVyZW5jZWQgaXRlbS4gQ29uY2VwdHMgbm9ybWFsbHkgYWRkcmVzcyBtb3JlIGdlbmVyYWwgdG9waWNzIHRoYW4gR3VpZGVsaW5lcyBhbmQgc3BhbiBhY3Jvc3Mgc2V2LWVyYWwgd29yayBwcm9kdWN0IGFuZC9vciB0YXNrcy9hY3Rpdml0aWVzLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJDaGVja2xpc3QiIGVTdXBlclR5cGVzPSIjLy9HdWlkYW5jZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBDaGVja2xpc3QgaXMgYSBzcGVjaWZpYyB0eXBlIG9mIGd1aWRhbmNlIHRoYXQgaWRlbnRpZmllcyBhIHNlcmllcyBvZiBpdGVtcyB0aGF0IG5lZWQgdG8gYmUgY29tcGxldGVkIG9yIHZlcmktZmllZC4gIENoZWNrbGlzdHMgYXJlIG9mdGVuIHVzZWQgaW4gcmV2aWV3cyBzdWNoIGFzIHdhbGt0aHJvdWdocyBvciBpbnNwZWN0aW9ucy4gIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ikd1aWRlbGluZSIgZVN1cGVyVHlwZXM9IiMvL0d1aWRhbmNlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIEd1aWRlbGluZSBpcyBhIHNwZWNpZmljIHR5cGUgb2YgZ3VpZGFuY2UgdGhhdCBwcm92aWRlcyBhZGRpdGlvbmFsIGRldGFpbCBvbiBob3cgdG8gcGVyZm9ybSBhIHBhcnRpY3VsYXIgdGFzayBvciBncm91cGluZyBvZiB0YXNrcyAoZS5nLiBncm91cGVkIHRvZ2V0aGVyIGFzIGFjdGl2aXRpZXMpIG9yIHRoYXQgcHJvdmlkZXMgYWRkaXRpb25hbCBkZXRhaWwsIHJ1bGVzLCBhbmQgcmVjb21tZW5kYXRpb25zIG9uIHdvcmsgcHJvZHVjdHMgYW5kIHRoZWlyIHByb3BlcnRpZXMuICBBbW9uZ3N0IG90aGVycywgaXQgY2FuIGluY2x1ZGUgZGV0YWlscyBhYm91dCBiZXN0IHByYWN0aWNlcyBhbmQgZGlmZmVyZW50IGFwcHJvYWNoZXMgZm9yIGRvaW5nIHdvcmssIGhvdyB0byB1c2UgcGFydGljdWxhciB0eXBlcyBvZiB3b3JrIHByb2R1Y3RzLCBpbmZvcm1hdGlvbiBvbiBkaWZmZXJlbnQgc3VidHlwZXMgYW5kIHZhcmlhbnRzIG9mIHRoZSB3b3JrIHByb2R1Y3QgYW5kIGhvdyB0aGV5IGV2b2x2ZSB0aHJvdWdob3V0IGEgbGlmZWN5Y2xlLCBkaXNjdXNzaW9ucyBvbiBza2lsbHMgdGhlIHBlcmZvcm1pbmcgcm9sZXMgc2hvdWxkIGFjcXVpcmUgb3IgaW1wcm92ZSB1cG9uLCBtZWFzdXJlbWVudHMgZm9yIHByb2dyZXNzIGFuZCBtYXR1cml0eSwgZXRjLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJFeGFtcGxlIiBlU3VwZXJUeXBlcz0iIy8vR3VpZGFuY2UiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkFuIEV4YW1wbGUgaXMgYSBzcGVjaWZpYyB0eXBlIG9mIEd1aWRhbmNlIHRoYXQgcmVwcmVzZW50cyBhIHR5cGljYWwsIHBhcnRpYWxseSBjb21wbGV0ZWQsIHNhbXBsZSBpbnN0YW5jZSBvZiBvbmUgb3IgbW9yZSB3b3JrIHByb2R1Y3RzIG9yIHNjZW5hcmlvIGxpa2UgZGVzY3JpcHRpb25zIG9mIGhvdyBUYXNrIG1heSBiZSBwZXJmb3JtZWQuIEV4YW1wbGVzIGNhbiBiZSByZWxhdGVkIHRvIFdvcmsgUHJvZHVjdHMgYXMgd2VsbCBhcyBUYXNrcyB0aGF0IHByb2R1Y2UgdGhlbSBhcyB3ZWxsIGFzIGFueSBvdGhlciBDb250ZW50IEVsZW1lbnQuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlJldXNhYmxlQXNzZXQiIGVTdXBlclR5cGVzPSIjLy9HdWlkYW5jZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBSZXVzYWJsZSBBc3NldCBwcm92aWRlcyBhIHNvbHV0aW9uIHRvIGEgcHJvYmxlbSBmb3IgYSBnaXZlbiBjb250ZXh0LiBUaGUgYXNzZXQgbWF5IGhhdmUgYSB2YXJpYWJpbGl0eSBwb2ludCwgd2hpY2ggaXMgYSBsb2NhdGlvbiBpbiB0aGUgYXNzZXQgdGhhdCBtYXkgaGF2ZSBhIHZhbHVlIHByb3ZpZGVkIG9yIGN1c3RvbWl6ZWQgYnkgdGhlIGFzc2V0IGNvbnN1bWVyLiBUaGUgYXNzZXQgaGFzIHJ1bGVzIGZvciB1c2FnZSB3aGljaCBhcmUgdGhlIGluc3RydWN0aW9ucyBkZXNjcmliaW5nJiN4QTtob3cgdGhlIGFzc2V0IHNob3VsZCBiZSB1c2VkLiYjeEE7Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlRlcm1EZWZpbml0aW9uIiBlU3VwZXJUeXBlcz0iIy8vR3VpZGFuY2UiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRlcm1EZWZpbml0aW9ucyBkZWZpbmUgY29uY2VwdHMgYW5kIGFyZSB1c2VkIHRvIGJ1aWxkIHVwIHRoZSBHbG9zc2FyeS4gVGhleSBhcmUgbm90IGRpcmVjdGx5IHJlbGF0ZWQgdG8gQ29udGVudEVsZW1lbnRzLCBidXQgdGhlaXIgcmVsYXRpb25zaGlwIGlzIGJlaW5nIGRlcml2ZWQgd2hlbiB0aGUgVGVybSBpcyB1c2VkIGluIHRoZSBDb250ZW50RWxlbWVudHMgZGVzY3JpcHRpb24gdGV4dC4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQXBwbGljYWJsZU1ldGFDbGFzc0luZm8iIGVTdXBlclR5cGVzPSIjLy9DbGFzc2lmaWVyIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaXNQcmltYXJ5RXh0ZW5zaW9uIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgbG93ZXJCb3VuZD0iMSIgZVR5cGU9IiMvL0Jvb2xlYW4iLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQXJ0aWZhY3QiIGVTdXBlclR5cGVzPSIjLy9Xb3JrUHJvZHVjdCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQXJ0aWZhY3QgaXMgYSBXb3JrIFByb2R1Y3QgdGhhdCBwcm92aWRlcyBhIGRlc2NyaXB0aW9uIGFuZCBkZWZpbml0aW9uIGZvciB0YW5naWJsZSB3b3JrIHByb2R1Y3QgdHlwZXMuIEFydGlmYWN0cyBtYXkgYmUgY29tcG9zZWQgb2Ygb3RoZXIgYXJ0aWZhY3RzLiBGb3IgZXhhbXBsZSwgYSBtb2RlbCBhcnRpZmFjdCBjYW4gYmUgY29tcG9zZWQgb2YgbW9kZWwgZWxlbWVudHMsIHdoaWNoIGFyZSBhbHNvIGFydGlmYWN0cy4mI3hBO0FydGlmYWN0cyBhcmUgdGFuZ2libGUgd29yayBwcm9kdWN0cyBjb25zdW1lZCwgcHJvZHVjZWQsIG9yIG1vZGlmaWVkIGJ5IFRhc2tzLiAgSXQgbWF5IHNlcnZlIGFzIGEgYmFzaXMgZm9yIGRlZmluaW5nIHJldXNhYmxlIGFzc2V0cy4gIFJvbGVzIHVzZSBBcnRpZmFjdHMgdG8gcGVyZm9ybSBUYXNrcyBhbmQgcHJvZHVjZSBBcnRpZmFjdHMgaW4gdGhlIGNvdXJzZSBvZiBwZXJmb3JtaW5nIFRhc2tzLiAgQXJ0aWZhY3RzIGFyZSB0aGUgcmVzcG9uc2liaWxpdHkgb2YgYSBzaW5nbGUgUm9sZSwgbWFraW5nIHJlc3BvbnNpYmlsaXR5IGVhc3kgdG8gaWRlbnRpZnkgYW5kIHVuZGVyc3RhbmQsIGFuZCBwcm9tb3RpbmcgdGhlIGlkZWEgdGhhdCBldmVyeSBwaWVjZSBvZiBpbmZvcm1hdGlvbiBwcm9kdWNlZCBpbiB0aGUgbWV0aG9kIHJlcXVpcmVzIHRoZSBhcHByb3ByaWF0ZSBzZXQgb2Ygc2tpbGxzLiBFdmVuIHRob3VnaCBvbmUgcm9sZSBtaWdodCAmcXVvdDtvd24mcXVvdDsgYSBzcGVjaWZpYyB0eXBlIG9mIEFydGlmYWN0cywgb3RoZXIgcm9sZXMgY2FuIHN0aWxsIHVzZSB0aGUgQXJ0aWZhY3RzOyBwZXJoYXBzIGV2ZW4gdXBkYXRlIHRoZW0gaWYgdGhlIFJvbGUgaGFzIGJlZW4gZ2l2ZW4gcGVybWlzc2lvbiB0byBkbyBzby4mI3hBOyIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJjb250YWluZXJBcnRpZmFjdCIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9BcnRpZmFjdCIgZU9wcG9zaXRlPSIjLy9BcnRpZmFjdC9jb250YWluZWRBcnRpZmFjdHMiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iY29udGFpbmVkQXJ0aWZhY3RzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9BcnRpZmFjdCIgY29udGFpbm1lbnQ9InRydWUiIGVPcHBvc2l0ZT0iIy8vQXJ0aWZhY3QvY29udGFpbmVyQXJ0aWZhY3QiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iV29ya1Byb2R1Y3QiIGVTdXBlclR5cGVzPSIjLy9Db250ZW50RWxlbWVudCAjLy9GdWxmaWxsYWJsZUVsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldvcmsgUHJvZHVjdCBpcyBhbiBhYnN0cmFjdCBjbGFzcyB3aGljaCBwcm92aWRlcyBhIGdlbmVyYWxpemF0aW9uIGZvciB0aGUgY29udGVudCBlbGVtZW50IHR5cGVzIEFydGlmYWN0LCBPdXRjb21lLCBhbmQgRGVsaXZlcmFibGUuICBUaGUgbWV0YS1tb2RlbCBjbGFzcyBXb3JrIFByb2R1Y3QgYWN0dWFsbHkgcmVwcmVzZW50cyB3b3JrIHByb2R1Y3QgdHlwZXMsIGkuZS4gYW4gaW5zdGFuY2Ugb2YgV29yayBQcm9kdWN0IGlzIGEgZGVzY3JpcHRpb24gb2YgYSBzcGVjaWZpYyB0eXBlIG9mIHdvcmsgcHJvZHVjdCBhbmQgbm90IGFuIGluZGl2aWR1YWwgd29yayBwcm9kdWN0IGluc3RhbmNlLiAgSG93ZXZlciwgZm9yIHNpbXBsaWNpdHkgcmVhc29ucyBhbmQgYmVjYXVzZSBvZiBsb3cgcmlzayBvZiBtaXNpbnRlcnByZXRhdGlvbiB3ZSBkaWQgbm90IGFwcGVuZCB0aGUgd29yZCAndHlwZScgdG8gZXZlcnkgbWV0YS1jbGFzcy4mI3hBO0Egd29yayBwcm9kdWN0IGlzIGFuIGFic3RyYWN0aW9uIGZvciBkZXNjcmlwdGlvbnMgb2YgY29udGVudCBlbGVtZW50cyB0aGF0IGFyZSB1c2VkIHRvIGRlZmluZSBhbnl0aGluZyB1c2VkLCBwcm9kdWNlZCwgb3IgbW9kaWZpZWQgYnkgYSB0YXNrLiYjeEE7JiN4RDsmI3hBO1RoaXMgaXMgdGhlIEd1aWRhbmNlIFR5cGVzIHBhY2thZ2UncyBleHRlbnNpb24gb2YgV29yayBQcm9kdWN0IChkZWZpbmVkIGluIENvbnRlbnQgRWxlbWVudHMpIHByb3ZpZGluZyBhZGRpdG9uYWwgYXNzb2NpYXRpb25zLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJyZXBvcnRzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9SZXBvcnQiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0idGVtcGxhdGVzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9UZW1wbGF0ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ0b29sTWVudG9ycyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vVG9vbE1lbnRvciIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJlc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMiCi0gICAgICAgIG9yZGVyZWQ9ImZhbHNlIiB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0VzdGltYXRpb25Db25zaWRlcmF0aW9ucyIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJGdWxmaWxsYWJsZUVsZW1lbnQiIGVTdXBlclR5cGVzPSIjLy9EZXNjcmliYWJsZUVsZW1lbnQiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJmdWxmaWxscyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vRnVsZmlsbGFibGVFbGVtZW50Ii8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlJlcG9ydCIgZVN1cGVyVHlwZXM9IiMvL0d1aWRhbmNlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIFJlcG9ydCBpcyBhIHByZWRlZmluZWQgdGVtcGxhdGUgb2YgYSByZXN1bHQgdGhhdCBpcyBnZW5lcmF0ZWQgb24gdGhlIGJhc2lzIG9mIG90aGVyIHdvcmsgcHJvZHVjdHMgYXMgYW4gb3V0cHV0IGZyb20gc29tZSBmb3JtIG9mIHRvb2wgYXV0b21hdGlvbi4gQW4gZXhhbXBsZSBmb3IgYSByZXBvcnQgd291bGQgYmUgYSB1c2UgY2FzZSBtb2RlbCBzdXJ2ZXksIHdoaWNoIGlzIGdlbmVyYXRlZCBieSBleHRyYWN0aW5nIGRpYWdyYW0gaW5mb3JtYXRpb24gZnJvbSBhIGdyYXBoaWNhbCBtb2RlbCBhbmQgdGV4dHVhbCBpbmZvcm1hdGlvbiBmcm9tIGRvY3VtZW50cyBhbmQgY29tYmluZXMgdGhlc2UgdHdvIHR5cGVzIG9mIGluZm9ybWF0aW9uIGludG8gYSByZXBvcnQuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlRlbXBsYXRlIiBlU3VwZXJUeXBlcz0iIy8vR3VpZGFuY2UiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgVGVtcGxhdGUgaXMgYSBzcGVjaWZpYyB0eXBlIG9mIGd1aWRhbmNlIHRoYXQgcHJvdmlkZXMgZm9yIGEgd29yayBwcm9kdWN0IGEgcHJlLWRlZmluZWQgdGFibGUgb2YgY29udGVudHMsIHNlY3Rpb25zLCBwYWNrYWdlcywgYW5kL29yIGhlYWRpbmdzLCBhIHN0YW5kYXJkaXplZCBmb3JtYXQsIGFzIHdlbGwgYXMgZGVzY3JpcHRpb25zIGhvdyB0aGUgc2VjdGlvbnMgYW5kIHBhY2thZ2VzIGFyZSBzdXBwb3NlZCB0byBiZSB1c2VkIGFuZCBjb21wbGV0ZWQuIFRlbXBsYXRlcyBjYW5ub3Qgb25seSBiZSBwcm92aWRlZCBmb3IgZG9jdW1lbnRzLCBidXQgYWxzbyBmb3IgY29uY2VwdHVhbCBtb2RlbHMgb3IgcGh5c2ljYWwgZGF0YSBzdG9yZXMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlRvb2xNZW50b3IiIGVTdXBlclR5cGVzPSIjLy9HdWlkYW5jZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBUb29sIE1lbnRvciBpcyBhIHNwZWNpZmljIHR5cGUgb2YgZ3VpZGFuY2UgdGhhdCBzaG93cyBob3cgdG8gdXNlIGEgc3BlY2lmaWMgdG9vbCB0byBhY2NvbXBsaXNoIHNvbWUgcGllY2Ugb2Ygd29yayBhIFdvcmsgUHJvZHVjdCBlaXRoZXIgaW4gdGhlIGNvbnRleHQgb2Ygb3IgaW5kZXBlbmRlbnQgZnJvbSBhIFRhc2sgb3IgQWN0aXZpdHkuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkVzdGltYXRpb25Db25zaWRlcmF0aW9ucyIgZVN1cGVyVHlwZXM9IiMvL0d1aWRhbmNlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJFc3RpbWF0aW9uIENvbnNpZGVyYXRpb25zIHF1YWxpZnkgdGhlIHVzYWdlIGFuZCBhcHBsaWNhdGlvbiBvZiBlc3RpbWF0aW9uIG1ldHJpY3MgaW4gdGhlIGRldmVsb3BtZW50IG9mIGFuIGFjdHVhbCBlc3RpbWF0ZS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRGVsaXZlcmFibGUiIGVTdXBlclR5cGVzPSIjLy9Xb3JrUHJvZHVjdCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBkZWxpdmVyYWJsZSBpcyBhIFdvcmsgUHJvZHVjdCB0aGF0IHByb3ZpZGVzIGEgZGVzY3JpcHRpb24gYW5kIGRlZmluaXRpb24gZm9yIHBhY2thZ2luZyBvdGhlciBXb3JrIFByb2R1Y3RzLCBhbmQgbWF5IGJlIGRlbGl2ZXJlZCB0byBhbiBpbnRlcm5hbCBvciBleHRlcm5hbCBwYXJ0eS4gIFRoZXJlZm9yZSwgYSBEZWxpdmVyYWJsZSBhZ2dyZWdhdGVzIG90aGVyIFdvcmsgUHJvZHVjdHMuIFRoZXJlZm9yZSwgYSBEZWxpdmVyYWJsZSBhZ2dyZWdhdGVzIG90aGVyIFdvcmsgUHJvZHVjdHMuICBBIERlbGl2ZXJhYmxlIGlzIHVzZWQgdG8gcHJlLWRlZmluZSB0eXBpY2FsIG9yIHJlY29tbWVuZGVkIGNvbnRlbnQgaW4gdGhlIGZvcm0gb3Igd29yayBwcm9kdWN0cyB0aGF0IHdvdWxkIGJlIHBhY2thZ2VkIGZvciBkZWxpdmVyeS4gIFRoZSBhY3R1YWwgcGFja2FnaW5nIG9mIHRoZSBEZWxpdmVyYWJsZSBpbiBhbiBhY3R1YWwgcHJvY2VzcyBvciBldmVuIHByb2plY3QgY291bGQgYmUgYSBtb2RpZmljYXRpb24gb2YgdGhpcyByZWNvbW1lbmRhdGlvbi4gIERlbGl2ZXJhYmxlcyBhcmUgdXNlZCB0byByZXByZXNlbnQgYW4gb3V0cHV0IGZyb20gYSBwcm9jZXNzIHRoYXQgaGFzIHZhbHVlLCBtYXRlcmlhbCBvciBvdGhlcndpc2UsIHRvIGEgY2xpZW50LCBjdXN0b21lciBvciBvdGhlciBzdGFrZWhvbGRlci4gIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImRlbGl2ZXJlZFdvcmtQcm9kdWN0cyIKLSAgICAgICAgb3JkZXJlZD0iZmFsc2UiIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vV29ya1Byb2R1Y3QiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iT3V0Y29tZSIgZVN1cGVyVHlwZXM9IiMvL1dvcmtQcm9kdWN0Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBbiBvdXRjb21lIGRlc2NyaWJlcyBpbnRhbmdpYmxlIHdvcmsgcHJvZHVjdHMgdGhhdCBhcmUgYSByZXN1bHQgb3Igc3RhdGUuIE91dGNvbWVzIG1heSBhbHNvIGJlIHVzZWQgdG8gZGVzY3JpYmUgd29yayBwcm9kdWN0cyB0aGF0IGFyZSBub3QgZm9ybWFsbHkgZGVmaW5lZC4gIEEga2V5IGRpZmZlcmVudGlhdG9yIGZvciBvdXRjb21lcyBhZ2FpbnN0IGFydGlmYWN0cyBpcyB0aGF0IG91dGNvbWVzIGFyZSBub3QgY2FuZGlkYXRlcyBmb3IgaGFydmVzdGluZyBhcyByZXVzYWJsZSBhc3NldHMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlN0ZXAiIGVTdXBlclR5cGVzPSIjLy9TZWN0aW9uICMvL1dvcmtEZWZpbml0aW9uIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIFN0ZXAgaXMgYSBTZWN0aW9uIGFuZCBXb3JrIERlZmluaXRpb24gdGhhdCBpcyB1c2VkIHRvIG9yZ2FuaXplIFRhc2tzIGludG8gcGFydHMgb3Igc3VidW5pdHMgb2Ygd29yay4gIFN0ZXBzIGluaGVyaXQgdGhlIHN1YlNlY3Rpb25zIGRlY29tcG9zaXRpb24gZnJvbSBTZWN0aW9uIGFuZCBjYW4gdGhlcmVmb3JlIGRlc2NyaWJlIFN1Yi1TdGVwcyBuZXN0ZWQgaW50byBTdGVwcy4mI3hBO0EgU3RlcCBkZXNjcmliZXMgYSBtZWFuaW5nZnVsIGFuZCBjb25zaXN0IHBhcnQgb2YgdGhlIG92ZXJhbGwgd29yayBkZXNjcmliZWQgZm9yIGEgVGFzay4gIFRoZSBjb2xsZWN0aW9uIG9mIFN0ZXBzIGRlZmluZWQgZm9yIGEgVGFzayByZXByZXNlbnRzIGFsbCB0aGUgd29yayB0aGF0IHNob3VsZCBiZSBkb25lIHRvIGFjaGlldmUgdGhlIG92ZXJhbGwgZGV2ZWxvcG1lbnQgZ29hbCBvZiB0aGUgVGFzay4gIE5vdCBhbGwgc3RlcHMgYXJlIG5lY2Vzc2FyaWx5IHBlcmZvcm1lZCBlYWNoIHRpbWUgYSBUYXNrIGlzIGludm9rZWQgaW4gYSBQcm9jZXNzIChzZWUgVGFzayBEZXNjcmlwdG9yKSwgc28gdGhleSBjYW4gYWxzbyBiZSBleHByZXNzZWQgaW4gdGhlIGZvcm0gb2YgYWx0ZXJuYXRlICdmbG93cycgb2Ygd29yay4gIERpZmZlcmVudCB3YXlzIG9mIGFjaGlldmluZyB0aGUgc2FtZSBkZXZlbG9wbWVudCBnb2FsIGNhbiB0aGVuIGJlICdhc3NlbWJsZWQnIGJ5IHNlbGVjdGluZyBkaWZmZXJlbnQgY29tYmluYXRpb25zIG9mIHN0ZXBzIHdoZW4gYXBwbHlpbmcgdGhlIFRhc2sgaW4gYSBQcm9jZXNzLiAgVHlwaWNhbCBraW5kcyBvZiBzdGVwcyBhIFRhc2sgYXV0aG9yIHNob3VsZCBjb25zaWRlciBhcmU6IFRoaW5raW5nIHN0ZXBzOiB3aGVyZSB0aGUgaW5kaXZpZHVhbCByb2xlcyB1bmRlcnN0YW5kIHRoZSBuYXR1cmUgb2YgdGhlIHRhc2ssIGdhdGhlcnMgYW5kIGV4YW1pbmVzIHRoZSBpbnB1dCBhcnRpZmFjdHMsIGFuZCBmb3JtdWxhdGVzIHRoZSBvdXRjb21lLiBQZXJmb3JtaW5nIHN0ZXBzOiB3aGVyZSB0aGUgaW5kaXZpZHVhbCByb2xlcyBjcmVhdGUgb3IgdXBkYXRlIHNvbWUgYXJ0aWZhY3RzLiBSZXZpZXdpbmcgc3RlcHM6IHdoZXJlIHRoZSBpbmRpdmlkdWFsIHJvbGVzIGluc3BlY3RzIHRoZSByZXN1bHRzIGFnYWluc3Qgc29tZSBjcml0ZXJpYS4mI3hBOyIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJXb3JrRGVmaW5pdGlvbiIgYWJzdHJhY3Q9InRydWUiIGVTdXBlclR5cGVzPSIjLy9NZXRob2RFbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXb3JrIERlZmluaXRpb24gaXMgYW4gYWJzdHJhY3QgTWV0aG9kIEVsZW1lbnQgdGhhdCBnZW5lcmFsaXplcyBhbGwgZGVzY3JpcHRpb25zIG9mIHdvcmsgd2l0aGluIHRoZSBVbmlmaWVkIE1ldGhvZCBBcmNoaXRlY3R1cmUuICBUaGlzIHBhY2thZ2UgaW50cm9kdWNlcyB0d28gY29uY3JldGUgdHlwZXMgb2YgV29yayBEZWZpbml0aW9uczogVGFzayBhbmQgU3RlcC4gIFdvcmsgRGVmaW5pdGlvbnMgY2FuIGNvbnRhaW4gc2V0cyBvZiBwcmUtIGFuZCBwb3N0LWNvbmRpdGlvbnMgZGVmaW5pbmcgY29uc3RyYWludHMgdGhhdCBuZWVkIHRvIGJlIHZhbGlkIGJlZm9yZSB0aGUgZGVzY3JpYmVkIHdvcmsgY2FuIGJlZ2luIG9yIGJlZm9yZSBpdCBjYW4gYmUgZGVjbGFyZWQgYXMgZmluaXNoZWQuICBOb3RlIHRoYXQgZ2VuZXJhbCBvd25lZFJ1bGVzIGNhbiBiZSB1c2VkIHRvIGRlZmluZSBhZGRpdGlvbmFsIGNvbnN0cmFpbnRzIGFuZCBydWxlcyBmb3IgV29yayBEZWZpbml0aW9ucy4mI3hBO1dvcmsgRGVmaW5pdGlvbnMgcmVwcmVzZW50IGJlaGF2aW9yYWwgZGVzY3JpcHRpb25zIGZvciBkb2luZyB3b3JrLiAgVGhlc2UgYmVoYXZpb3JhbCBkZXNjcmlwdGlvbnMgYXJlIG5vdCBib3VuZCB0byBvbmUgc3BlY2lmaWMgY2xhc3NpZmllciwgYnV0IHJlcHJlc2VudCBhbiBhcmJpdHJhcnkgZGVmaW5pdGlvbiBvZiB3b3JrLiAgRm9yIGV4YW1wbGUsIGEgV29yayBEZWZpbml0aW9uIGNvdWxkIHJlcHJlc2VudCB3b3JrIHRoYXQgaXMgYmVpbmcgcGVyZm9ybWVkIGJ5IGEgc3BlY2lmaWMgUm9sZSAoZS5nLiBhIFJvbGUgcGVyZm9ybWluZyBhIHNwZWNpZmljIFRhc2sgb3IgU3RlcHMgb2YgYSBUYXNrKSwgYnkgbWFueSBSb2xlcyB3b3JraW5nIGluIGNsb3NlIGNvbGxhYm9yYXRpb24gKG1hbnkgUm9sZXMgYWxsIHdvcmtpbmcgdG9nZXRoZXIgb24gdGhlIHNhbWUgaW50ZXJkaXNjaXBsaW5hcnkgVGFzayksIG9yIGNvbXBsZXggd29yayB0aGF0IGlzIHBlcmZvcm1lZCB0aHJvdWdob3V0IHRoZSBsaWZlY3ljbGUgKGUuZy4gYSBwcm9jZXNzIGRlZmluaW5nIGEgYnJlYWtkb3duIHN0cnVjdHVyZSBmb3Igb3JnYW5pemluZyBsYXJnZXIgY29tcG9zaXRlIHVuaXRzIG9mIHdvcmsgcGVyZm9ybWVkIGJ5IG1hbnkgUm9sZXMgd29ya2luZyBpbiBjb2xsYWJvcmF0aW9uKS4mI3hBOyIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJwcmVjb25kaXRpb24iIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vQ29uc3RyYWludCIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icG9zdGNvbmRpdGlvbiIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9Db25zdHJhaW50IiBjb250YWlubWVudD0idHJ1ZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJXaGl0ZXBhcGVyIiBlU3VwZXJUeXBlcz0iIy8vQ29uY2VwdCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV2hpdGVwYXBlcnMgYXJlIGEgc3BlY2lhbCBDb25jZXB0IGd1aWRhbmNlIHRoYXQgaGF2ZSBiZWVuIGV4dGVybmFsbHkgcmV2aWV3ZWQgb3IgcHVibGlzaGVkIGFuZCBjYW4gYmUgcmVhZCBhbmQgdW5kZXJzdG9vZCBpbiBpc29sYXRpb24gb2Ygb3RoZXIgY29udGVudCBlbGVtZW50cyBhbmQgZ3VpZGFuY2UuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlRhc2siIGVTdXBlclR5cGVzPSIjLy9Db250ZW50RWxlbWVudCAjLy9Xb3JrRGVmaW5pdGlvbiI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBUYXNrIGlzIGEgY29udGVudCBlbGVtZW50IHRoYXQgZGVzY3JpYmVzIHdvcmsgYmVpbmcgcGVyZm9ybWVkIGJ5IFJvbGVzLiAgSXQgZGVmaW5lcyBvbmUgZGVmYXVsdCBwZXJmb3JtaW5nIFJvbGUgYXMgd2VsbCBhcyBtYW55IGFkZGl0aW9uYWwgcGVyZm9ybWVycy4gIEEgVGFzayBpcyBhc3NvY2lhdGVkIHRvIGlucHV0IGFuZCBvdXRwdXQgd29yayBwcm9kdWN0cy4gIElucHV0cyBhcmUgZGlmZmVyZW50aWF0ZWQgaW4gbWFuZGF0b3J5IHZlcnN1cyBvcHRpb25hbCBpbnB1dHMuICBUaGUgYXNzb2NpYXRpb25zIHRvIFdvcmsgUHJvZHVjdHMgYXJlIG5vdCBpbnN0YW50aWF0YWJsZS92YXJpYWJsZS1saWtlIHBhcmFtZXRlcnMuICBUaGV5IHJhdGhlciBleHByZXNzIChoeXBlci0pbGlua3MgdG8gdGhlIGRlc2NyaXB0aW9ucyBvZiB0aGUgd29yayBwcm9kdWN0cyB0eXBlcyB0aGF0IGFyZSByZWxhdGVkIHRvIHRoZSBUYXNrIGFzIGlucHV0cyBhbmQgb3V0cHV0cy4gIEluIG90aGVyIHdvcmRzLCB0aGVzZSBhc3NvY2lhdGlvbnMgYXJlIG5vdCBpbnRlbmRlZCB0byBiZSB1c2VkIHRvIGNhcHR1cmUgd2hpY2ggY29uY3JldGUgaW5zdGFuY2VzIHdpbGwgYmUgcGFzc2VkIHdoZW4gaW5zdGFudGlhdGluZyB0aGUgbWV0aG9kIGluIGEgcHJvamVjdC4gIEFsbCBvZiB0aGUgVGFzaydzIGRlZmF1bHQgYXNzb2NpYXRpb25zIGNhbiBiZSBvdmVycmlkZGVuIGluIGFuIGFjdHVhbCBwcm9jZXNzIGRlZmluaXRpb24uJiN4QTtBIFRhc2sgZGVzY3JpYmVzIGFuIGFzc2lnbmFibGUgdW5pdCBvZiB3b3JrLiAgRXZlcnkgVGFzayBpcyBhc3NpZ25lZCB0byBzcGVjaWZpYyBSb2xlcy4gIFRoZSBncmFudWxhcml0eSBvZiBhIFRhc2sgaXMgZ2VuZXJhbGx5IGEgZmV3IGhvdXJzIHRvIGEgZmV3IGRheXMuICBJdCB1c3VhbGx5IGFmZmVjdHMgb25lIG9yIG9ubHkgYSBzbWFsbCBudW1iZXIgb2Ygd29yayBwcm9kdWN0cy4gQSBUYXNrIGlzIHVzZWQgYXMgYW4gZWxlbWVudCBvZiBkZWZpbmluZyBhIHByb2Nlc3MuIFRhc2tzIGFyZSBmdXJ0aGVyIHVzZWQgZm9yIHBsYW5uaW5nIGFuZCB0cmFja2luZyBwcm9ncmVzczsgdGhlcmVmb3JlLCBpZiB0aGV5IGFyZSBkZWZpbmVkIHRvbyBmaW5lLWdyYWluZWQsIHRoZXkgd2lsbCBiZSBuZWdsZWN0ZWQsIGFuZCBpZiB0aGV5IGFyZSB0b28gbGFyZ2UsIHByb2dyZXNzIHdvdWxkIGhhdmUgdG8gYmUgZXhwcmVzc2VkIGluIHRlcm1zIG9mIGEgVGFzaydzIHBhcnRzIChlLmcuIFN0ZXBzLCB3aGljaCBpcyBub3QgcmVjb21tZW5kZWQpLiAmI3hBO0EgVGFzayBoYXMgYSBjbGVhciBwdXJwb3NlIGluIHdoaWNoIHRoZSBwZXJmb3JtaW5nIHJvbGVzIGFjaGlldmUgYSB3ZWxsIGRlZmluZWQgZ29hbC4gIEl0IHByb3ZpZGVzIGNvbXBsZXRlIHN0ZXAtYnktc3RlcCBleHBsYW5hdGlvbnMgb2YgZG9pbmcgYWxsIHRoZSB3b3JrIHRoYXQgbmVlZHMgdG8gYmUgZG9uZSB0byBhY2hpZXZlIHRoaXMgZ29hbC4gIFRoaXMgZGVzY3JpcHRpb24gaXMgY29tcGxldGUsIGluZGVwZW5kZW50IG9mIHdoZW4gaW4gYSBwcm9jZXNzIGxpZmVjeWNsZSB0aGUgd29yayB3b3VsZCBhY3R1YWxseSBiZSBkb25lLiAgSXQgdGhlcmVmb3JlIGRvZXMgbm90IGRlc2NyaWJlIHdoZW4geW91IGRvIHdoYXQgd29yayBhdCB3aGF0IHBvaW50IG9mIHRpbWUsIGJ1dCBkZXNjcmliZXMgYWxsIHRoZSB3b3JrIHRoYXQgZ2V0cyBkb25lIHRocm91Z2hvdXQgdGhlIGRldmVsb3BtZW50IGxpZmVjeWNsZSB0aGF0IGNvbnRyaWJ1dGVzIHRvIHRoZSBhY2hpZXZlbWVudCBvZiB0aGlzIGdvYWwuICBXaGVuIHRoZSBUYXNrIGlzIGJlaW5nIGFwcGxpZWQgaW4gYSBwcm9jZXNzIHRoZW4gdGhpcyBwcm9jZXNzIGFwcGxpY2F0aW9uIChkZWZpbmVkIGFzIFRhc2sgRGVzY3JpcHRvcikgcHJvdmlkZXMgdGhlIGluZm9ybWF0aW9uIG9mIHdoaWNoIHBpZWNlcyBvZiB0aGUgVGFzayB3aWxsIGFjdHVhbGx5IGJlIHBlcmZvcm1lZCBhdCBhbnkgcGFydGljdWxhciBwb2ludCBpbiB0aW1lLiBUaGlzIGFzc3VtZXMgdGhhdCB0aGUgVGFzayB3aWxsIGJlIHBlcmZvcm1lZCBpbiB0aGUgcHJvY2VzcyBvdmVyIGFuZCBvdmVyIGFnYWluLCBidXQgZWFjaCB0aW1lIHdpdGggYSBzbGlnaHRseSBkaWZmZXJlbnQgZW1waGFzaXMgb24gZGlmZmVyZW50IHN0ZXBzIG9yIGFzcGVjdHMgb2YgdGhlIHRhc2sgZGVzY3JpcHRpb24uICYjeEE7Rm9yIGV4YW1wbGUsIGEgVGFzayBzdWNoIGFzICZxdW90O0RldmVsb3AgVXNlIENhc2UgTW9kZWwmcXVvdDsgZGVzY3JpYmVzIGFsbCB0aGUgd29yayB0aGF0IG5lZWRzIHRvIGJlIGRvbmUgdG8gZGV2ZWxvcCBhIGNvbXBsZXRlIHVzZSBjYXNlIG1vZGVsLiBUaGlzIHdvdWxkIGNvbXByaXNlIG9mIHRoZSBpZGVudGlmaWNhdGlvbiBhbmQgbmFtaW5nIG9mIHVzZSBjYXNlcyBhbmQgYWN0b3JzLCB0aGUgd3JpdGluZyBvZiBhIGJyaWVmIGRlc2NyaXB0aW9uLCB0aGUgbW9kZWxpbmcgb2YgdXNlIGNhc2VzIGFuZCB0aGVpciByZWxhdGlvbnNoaXBzIGluIGRpYWdyYW1zLCB0aGUgZGV0YWlsZWQgZGVzY3JpcHRpb24gb2YgYSBiYXNpYyBmbG93LCB0aGUgZGV0YWlsZWQgZGVzY3JpcHRpb24gb2YgYWx0ZXJuYXRpdmVzIGZsb3dzLCBwZXJmb3JtaW5nIG9mIHdhbGt0aHJvdWdocyB3b3Jrc2hvcHMgYW5kIHJldmlld3MsIGV0Yy4gIEFsbCBvZiB0aGVzZSBwYXJ0cyBjb250cmlidXRlIHRvIHRoZSBkZXZlbG9wbWVudCBnb2FsIG9mIGRldmVsb3BpbmcgdGhlIHVzZSBjYXNlIG1vZGVsLCBidXQgdGhlIHBhcnRzIHdpbGwgYmUgcGVyZm9ybWVkIGF0IGRpZmZlcmVudCBwb2ludHMgaW4gdGltZSBpbiBhIHByb2Nlc3MuICBJZGVudGlmaWNhdGlvbiwgbmFtaW5nLCBhbmQgYnJpZWYgZGVzY3JpcHRpb25zIHdvdWxkIGJlIHBlcmZvcm1lZCBlYXJseSBpbiBhIHR5cGljYWwgZGV2ZWxvcG1lbnQgcHJvY2VzcyB2ZXJzdXMgdGhlIHdyaXRpbmcgb2YgZGV0YWlsZWQgYWx0ZXJuYXRpdmUgZmxvd3Mgd2hpY2ggd291bGQgYmUgcGVyZm9ybWVkIG11Y2ggbGF0ZXIuICBBbGwgdGhlc2UgcGFydHMgb3Igc3RlcHMgd2l0aGluIHRoZSBzYW1lIFRhc2sgZGVmaW5lIHRoZSAmcXVvdDttZXRob2QmcXVvdDsgb2YgRGV2ZWxvcGluZyBhIFVzZSBDYXNlIE1vZGVsLiAgQXBwbHlpbmcgc3VjaCBhIG1ldGhvZCBpbiBhIGxpZmVjeWNsZSAoaS5lLiBpbiBhIHByb2Nlc3MpIGlzIGRlZmluaW5nIHdoaWNoIHN0ZXBzIGFyZSBkb25lIHdoZW4gZ29pbmcgZnJvbSBvbmUgaXRlcmF0aW9uIHRvIHRoZSBuZXh0LiYjeEE7JiN4RDsmI3hBO1RoaXMgaXMgdGhlIEd1aWRhbmNlIFR5cGVzIHBhY2thZ2UncyBleHRlbnNpb24gb2YgVGFzayAoZGVmaW5lZCBpbiBDb250ZW50IEVsZW1lbnRzKSBwcm92aWRpbmcgYWRkaXRpb25hbCBhc3NvY2lhdGlvbnMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InBlcmZvcm1lZEJ5IiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Sb2xlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im1hbmRhdG9yeUlucHV0IiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Xb3JrUHJvZHVjdCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJvdXRwdXQiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1dvcmtQcm9kdWN0Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5IgotICAgICAgICBvcmRlcmVkPSJmYWxzZSIgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Sb2xlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im9wdGlvbmFsSW5wdXQiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1dvcmtQcm9kdWN0Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InN0ZXBzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9TdGVwIiB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InRvb2xNZW50b3JzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Ub29sTWVudG9yIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImVzdGltYXRpb25Db25zaWRlcmF0aW9ucyIKLSAgICAgICAgb3JkZXJlZD0iZmFsc2UiIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlJvbGUiIGVTdXBlclR5cGVzPSIjLy9Db250ZW50RWxlbWVudCAjLy9GdWxmaWxsYWJsZUVsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgUm9sZSBpcyBhIGNvbnRlbnQgZWxlbWVudCB0aGF0IGRlZmluZXMgYSBzZXQgb2YgcmVsYXRlZCBza2lsbHMsIGNvbXBldGVuY2llcywgYW5kIHJlc3BvbnNpYmlsaXRpZXMuICBSb2xlcyBhcmUgdXNlZCBieSBUYXNrcyB0byBkZWZpbmUgd2hvIHBlcmZvcm1zIHRoZW0gYXMgd2VsbCBhcyBkZWZpbmUgYSBzZXQgb2Ygd29yayBwcm9kdWN0cyB0aGV5IGFyZSByZXNwb25zaWJsZSBmb3IuICAmI3hBO0EgUm9sZSBkZWZpbmVzIGEgc2V0IG9mIHJlbGF0ZWQgc2tpbGxzLCBjb21wZXRlbmNpZXMsIGFuZCByZXNwb25zaWJpbGl0aWVzIG9mIGFuIGluZGl2aWR1YWwgb3IgYSBzZXQgb2YgaW5kaXZpZHVhbHMuICBSb2xlcyBhcmUgbm90IGluZGl2aWR1YWxzIG9yIHJlc291cmNlcy4gIEluZGl2aWR1YWwgbWVtYmVycyBvZiB0aGUgZGV2ZWxvcG1lbnQgb3JnYW5pemF0aW9uIHdpbGwgd2VhciBkaWZmZXJlbnQgaGF0cywgb3IgcGVyZm9ybSBkaWZmZXJlbnQgcm9sZXMuIFRoZSBtYXBwaW5nIGZyb20gaW5kaXZpZHVhbCB0byByb2xlLCBwZXJmb3JtZWQgYnkgdGhlIHByb2plY3QgbWFuYWdlciB3aGVuIHBsYW5uaW5nIGFuZCBzdGFmZmluZyBmb3IgYSBwcm9qZWN0LCBhbGxvd3MgZGlmZmVyZW50IGluZGl2aWR1YWxzIHRvIGFjdCBhcyBzZXZlcmFsIGRpZmZlcmVudCByb2xlcywgYW5kIGZvciBhIHJvbGUgdG8gYmUgcGxheWVkIGJ5IHNldmVyYWwgaW5kaXZpZHVhbHMuJiN4QTsiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ibW9kaWZpZXMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1dvcmtQcm9kdWN0IiB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InJlc3BvbnNpYmxlRm9yIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Xb3JrUHJvZHVjdCIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJBcnRpZmFjdERlc2NyaXB0aW9uIiBlU3VwZXJUeXBlcz0iIy8vV29ya1Byb2R1Y3REZXNjcmlwdGlvbiI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImJyaWVmT3V0bGluZSIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9TdHJpbmciIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlByb3ZpZGVzIGEgYnJpZWYgZGVzY3JpcHRpb24gb2YgdGhlIGluZm9ybWF0aW9uIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoaXMgYXJ0aWZhY3QuIEZvciBleGFtcGxlLCBkaXNjdXNzZXMgdGhlIGNvbnRlbnRzIGZvciBrZXkgY2hhcHRlcnMgb2YgYSBkb2N1bWVudCBhcnRpZmFjdCBvciB0aGUga2V5IHBhY2thZ2VzIGFuZCBtb2R1bGVzIG9mIGEgbW9kZWwgYXJ0aWZhY3QuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJlcHJlc2VudGF0aW9uT3B0aW9ucyIKLSAgICAgICAgb3JkZXJlZD0iZmFsc2UiIGVUeXBlPSIjLy9TdHJpbmciIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkRpc2N1c3NlcyBkaWZmZXJlbnQgcG9zc2libGUgYWx0ZXJuYXRpdmUgcmVwcmVzZW50YXRpb25zIGZvciB0aGUgYXJ0aWZhY3QuIEZvciBleGFtcGxlIGEgZGVzaWduIG1vZGVsIGNhbiBiZSByZXByZXNlbnRlZCBhcyBhIFVNTCBtb2RlbCBvciBhbiBpbmZvcm1hbCBibG9jayBkaWFncmFtIG9yIGJ5IHRleHR1YWwgZGVzY3JpcHRpb24gb25seS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmVwcmVzZW50YXRpb24iIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vU3RyaW5nIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibm90YXRpb24iIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vU3RyaW5nIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iV29ya1Byb2R1Y3REZXNjcmlwdGlvbiIgZVN1cGVyVHlwZXM9IiMvL0NvbnRlbnREZXNjcmlwdGlvbiI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InB1cnBvc2UiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vU3RyaW5nIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJEZXNjcmliZXMgd2h5IHRoZSB3b3JrIHByb2R1Y3QgaXMgcHJvZHVjZWQgYW5kIHRvIHdoYXQgdXNlIGl0IHdpbGwgYmUgcHV0LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpbXBhY3RPZk5vdEhhdmluZyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9TdHJpbmciIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkRlc2NyaWJlcyB0aGUgY29uc2VxdWVuY2VzIG9mIG5vdCBwcm9kdWNpbmcgdGhlIHdvcmsgcHJvZHVjdC4gIFRoaXMgaXMgaW50ZW5kZWQgdG8gYWlkIGluIHRoZSB0YWlsb3JpbmcgdGhlIG1ldGhvZC9wcm9jZXNzIHRvIHRoZSBuZWVkcyBvZiBhIHNwZWNpZmljIHByb2plY3QuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJlYXNvbnNGb3JOb3ROZWVkaW5nIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL1N0cmluZyIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRGVzY3JpYmVzIHRoZSBjaXJjdW1zdGFuY2VzIGluIHdoaWNoIGl0IGlzIHJlYXNvbmFibGUgbm90IHRvIHByb2R1Y2UgdGhlIHdvcmsgcHJvZHVjdC4gIFRoaXMgaXMgaW50ZW5kZWQgdG8gYWlkIGluIHRoZSB0YWlsb3Jpbmcgb2YgdGhlIG1ldGhvZC9wcm9jZXNzIHRvIHRoZSBuZWVkcyBvZiBhIHNwZWNpZmljIHByb2plY3QuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkRlbGl2ZXJhYmxlRGVzY3JpcHRpb24iIGVTdXBlclR5cGVzPSIjLy9Xb3JrUHJvZHVjdERlc2NyaXB0aW9uIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZXh0ZXJuYWxEZXNjcmlwdGlvbiIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9TdHJpbmciIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgRGVsaXZlcmFibGUgdXNlZCBmb3IgY2xpZW50IGRvY3VtZW50cyAocHJvcG9zYWwsIHN0YXRlbWVudHMgb2Ygd29yayBvciBjb250cmFjdHVhbCBhZ3JlZW1lbnRzKS4gIEl0IG1pZ2h0IHVzZSBhIGRpZmZlcmVudCBsYW5ndWFnZSBhbmQgZm9sbG93IGxlZ2FsIGNvbnN0cmFpbnRzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwYWNrYWdpbmdHdWlkYW5jZSIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9TdHJpbmciIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlByb3ZpZGVzIGd1aWRhbmNlIG9uIGhvdyB0byBhc3NlbWJsZSB0aGUgZGVsaXZlcmFibGUgZnJvbSBhbGwgaXRzIHJlcXVpcmVkIGlucHV0cy4gIFRoaXMgc2VjdGlvbiBkZXNjcmliZXMgdGhlIG1vc3QgY29tbW9uIGNvbnRlbnQgbWVkaXVtIGFuZCBmb3JtYXQuICBEaXN0cmlidXRpb24gb2YgdGhlIGRlbGl2ZXJhYmxlIGlzIGFkZHJlc3NlZCBpbiB0aGlzIHNlY3Rpb24sIGlmIG5lY2Vzc2FyeS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUm9sZURlc2NyaXB0aW9uIiBlU3VwZXJUeXBlcz0iIy8vQ29udGVudERlc2NyaXB0aW9uIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic2tpbGxzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL1N0cmluZyIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iTGlzdHMgb2Ygc2V0IG9mIHJlcXVpcmVkIHNraWxscyBhIHBlcnNvbiBuZWVkcyB0byBwb3NzZXNzIHRvIGZ1bGZpbGwgdGhhdCBSb2xlLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhc3NpZ25tZW50QXBwcm9hY2hlcyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9TdHJpbmciIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlByb3ZpZGVzIGd1aWRhbmNlIG9uIGZvciBhc3NpZ25pbmcgaW5kaXZpZHVhbHMgdG8gdGhlIFJvbGUgaW4gdGVybXMgb2Ygd2hhdCBvdGhlciByb2xlcyB0aGVzZSBpbmRpdmlkdWFscyBjb3VsZCBwZXJmb3JtIGFuZCB3aGF0IHJlc3BvbnNpYmlsaXR5IGRpZmZlcmVudCBpbmRpdmlkdWFscyBhc3NpZ25lZCB0byB0aGlzIHJvbGUgbWlnaHQgaGF2ZS4gIFRoZSBndWlkYW5jZSBjYW4gYWxzbyBkZXNjcmliZSBkaWZmZXJlbnQgYXNzaWdubWVudCBhcHByb2FjaGVzIGZvciBkaWZmZXJlbnQgdHlwZXMgb2YgcHJvamVjdHMsIGUuZy4gZm9yIGxhcmdlIHZlcnN1cyBzbWFsbCB0ZWFtcyB3aGVyZSBpbmRpdmlkdWFscyBjb3VsZCBiZSBhbGxvY2F0ZWQgdG8gcm9sZXMgZnVsbCB0aW1lIHZlcnN1cyBzaGFyaW5nIHJvbGVzIHdpdGhpbiB0aGUgdGVhbS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic3lub255bXMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vU3RyaW5nIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJMaXN0cyBzeW5vbnltcywgaS5lLiBvdGhlciBuYW1lcyB0aGUgUm9sZSBtaWdodCBiZSByZWZlcnJlZCBieS4gIFRvb2wgc3VwcG9ydCBmb3IgdGhlIG1ldGEtbW9kZWwgbWlnaHQgc3VwcG9ydCB0aGF0IGEgUm9sZSBuYW1lIGNhbiBiZSBjb25zaXN0ZW50bHkgYmUgcmVwbGFjZWQgd2l0aCBvbmUgb2YgaXRzIHN5bm9ueW1zIHRocm91Z2h0IGEgUHJvY2Vzcy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iVGFza0Rlc2NyaXB0aW9uIiBlU3VwZXJUeXBlcz0iIy8vQ29udGVudERlc2NyaXB0aW9uIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icHVycG9zZSIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9TdHJpbmciIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlN1bW1hcml6ZXMgdGhlIG1haW4gcmVhc29uIGZvciBwZXJmb3JtaW5nIHRoaXMgVGFzayBhbmQgd2hhdCBpcyBpbnRlbmRlZCB0byBiZSBhY2hpZXZlZC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYWx0ZXJuYXRpdmVzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL1N0cmluZyIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQ29tcHJpc2VzIG9mIHN1bW1hcmllcyBkZXNjcmliaW5nIGltcG9ydGFudCBleGNlcHRpb25hbCBhbmQgbm9uLXN0YW5kYXJkIHdheXMgb2YgYWNoaWV2aW5nIHRoaXMgVGFzaydzIGRldmVsb3BtZW50IGdvYWxzIHRoYXQgd2VyZSBub3QgY292ZXJlZCBieSB0aGUgVGFzaydzIFN0ZXBzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJHdWlkYW5jZURlc2NyaXB0aW9uIiBlU3VwZXJUeXBlcz0iIy8vQ29udGVudERlc2NyaXB0aW9uIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYXR0YWNobWVudHMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vU3RyaW5nIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGlzIGZpZWxkIGlzIHByaW1hcmlseSB1c2VkIGZvciBhdHRhY2htZW50cyBhdWdtZW50aW5nIHRoZSBpbmZvcm1hdGlvbiBwcm92aWRlZCBmb3IgZ3VpZGFuY2UuICBJbiBwYXJ0aWN1bGFyIHRoZSBhdHRyaWJ1dGUgaXMgdXNlZCBmb3IgVGVtcGxhdGVzLCBFeGFtcGxlcywgYW5kIFJldXNhYmxlIEFzc2V0cyB0byBjb250YWluIHRoZSBhY3R1YWwgYXR0YWNobWVudCBkZXNjcmliZWQgaW4gdGhlIG1haW5EZXNjcmlwdGlvbi4gIEl0IGNhbiBhZGRpdGlvbmFsbHkgY29udGFpbiByZXByZXNlbnRhdGlvbnMgb2YgdGhlIGd1aWRhbmNlIGluIGp1c3QgYSB0aGlyZCBwYXJ0eSBmb3JtYXQsIGUuZy4gUERGLCBNUyBXb3JkLCBvciBXb3JkIFBlcmZlY3QuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlByYWN0aWNlRGVzY3JpcHRpb24iIGVTdXBlclR5cGVzPSIjLy9Db250ZW50RGVzY3JpcHRpb24iPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhZGRpdGlvbmFsSW5mbyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9TdHJpbmciIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkFueSBhZGRpdGlvbmFsIEluZm9ybWF0aW9uIG5vdCBjb3ZlcmVkIGJ5IHRoZSBvdGhlciBhdHRyaWJ1dGVzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwcm9ibGVtIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL1N0cmluZyIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBkZXNjcmlwdGlvbiBvZiB0aGUgcHJvYmxlbSB0aGUgUHJhY3RpY2UgYWRkcmVzc2VzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJiYWNrZ3JvdW5kIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL1N0cmluZyIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRWxhYm9yYXRpb24gb24gdGhlIGJhY2tncm91bmQgYW5kIHRoZSBjb250ZXh0IGluIHdoaWNoIHRoZSBwcm9ibGVtIG9jY3VycyBhbmQgd2hlcmUgdGhlIHNvbHV0aW9uIGRlc2NyaWJlZCBieSB0aGlzIFByYWN0aWNlIHdpbGwgZml0IGluLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJnb2FscyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9TdHJpbmciIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgc3VtbWFyeSBvZiB0aGUgb3ZlcmFsbCBnb2FscyB0byBiZSBhZGRyZXNzZWQgYnkgdGhlIFByYWN0aWNlLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhcHBsaWNhdGlvbiIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9TdHJpbmciIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkRlc2NyaWJlcyBob3cgdGhlIFByYWN0aWNlIGlzIGJlaW5nIGFwcGxpZWQgb3IgaW50cm9kdWNlZCBpbnRvIHRoZSBjb250ZXh0IGRlc2NyaWJlZCBpbiBiYWNrZ3JvdW5kLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJsZXZlbHNPZkFkb3B0aW9uIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL1N0cmluZyIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iT3V0bGluZXMgdGhlIGRpZmZlcmVudCBmb3JtcyBvciB2YXJpYW50cyBpbiB3aGljaCB0aGUgcHJhY3RpY2UgY291bGQgYmUgcmVhbGl6ZWQuIChlLmcuIGZ1bGwgYWRvcHRpb24gdmVydXMgYSBwYXJ0aWFsIGFkb3B0aW9uIG9mIHRoZSBQcmFjdGljZSkiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUm9sZVNldCIgZVN1cGVyVHlwZXM9IiMvL0NvbnRlbnRDYXRlZ29yeSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBSb2xlIFNldCBvcmdhbml6ZXMgUm9sZXMgaW50byBjYXRlZ29yaWVzLiAgSXQgaXMgdXNlZCB0byBncm91cCByb2xlcyB0b2dldGhlciB0aGF0IGhhdmUgY2VydGFpbiBjb21tb25hbGl0aWVzLiAgRm9yIGV4YW1wbGUsIHRoZSAmcXVvdDtBbmFseXN0cyZxdW90OyBSb2xlIFNldCBjb3VsZCBncm91cCB0aGUgJnF1b3Q7QnVzaW5lc3MgUHJvY2VzcyBBbmFseXN0JnF1b3Q7LCAmcXVvdDtTeXN0ZW0gQW5hbHlzdCZxdW90OywgYXMgd2VsbCBhcyAmcXVvdDtSZXF1aXJlbWVudHMgU3BlY2lmaWVyJnF1b3Q7IHJvbGVzLiAgQWxsIG9mIHRoZXNlIHdvcmsgd2l0aCBzaW1pbGFyIHRlY2huaXF1ZXMgYW5kIGhhdmUgb3ZlcmxhcHBpbmcgc2tpbGxzLCBidXQgYXJlIHJlcXVpcmVkIGFzIGRpc3RpbmN0IHJvbGVzIGZvciBhIG1ldGhvZCAoZS5nLiB0aGUgbWV0aG9kIHRoZSBJQk0gUmF0aW9uYWwgVW5pZmllZCBQcm9jZXNzIGlzIGJhc2VkIG9uKS4mI3hBOyIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJyb2xlcyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vUm9sZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJDb250ZW50Q2F0ZWdvcnkiIGFic3RyYWN0PSJ0cnVlIiBlU3VwZXJUeXBlcz0iIy8vQ29udGVudEVsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkNvbnRlbnQgQ2F0ZWdvcnkgaXMgYW4gYWJzdHJhY3QgY2xhc3MgZ2VuZXJhbGl6aW5nIGNvbnRlbnQgY2F0ZWdvcnkgdHlwZXMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkRvbWFpbiIgZVN1cGVyVHlwZXM9IiMvL0NvbnRlbnRDYXRlZ29yeSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRG9tYWluIGlzIGEgcmVmaW5lYWJsZSBoaWVyYXJjaHkgZ3JvdXBpbmcgcmVsYXRlZCB3b3JrIHByb2R1Y3RzLiAgSW4gb3RoZXIgd29yZHMsIERvbWFpbnMgY2FuIGJlIGZ1cnRoZXIgZGl2aWRlZCBpbnRvIHN1Yi1kb21haW5zLCB3aXRoIHdvcmsgcHJvZHVjdCBlbGVtZW50cyB0byBiZSBjYXRlZ29yaXplZCBvbmx5IGF0IHRoZSBsZWFmLWxldmVsIG9mIHRoaXMgaGllcmFyY2h5LiYjeEE7RG9tYWluIGlzIGEgbG9naWNhbCBncm91cGluZyBvZiB3b3JrIHByb2R1Y3RzIHRoYXQgaGF2ZSBhbiBhZmZpbml0eSB0byBlYWNoIG90aGVyIGJhc2VkIG9uIHJlc291cmNlcywgdGltaW5nLCBvciByZWxhdGlvbnNoaXAuICBBIERvbWFpbiBtYXkgYmUgZGl2aWRlZCBpbnRvIHN1YmRvbWFpbnMuICBGb3IgZXhhbXBsZSwgR1MgTWV0aG9kIHVzZXMgc2l4IHByZWRlZmluZWQgRG9tYWlucyBmb3IgV29yayBQcm9kdWN0czogQXBwbGljYXRpb24sIEFyY2hpdGVjdHVyZSwgQnVzaW5lc3MsIEVuZ2FnZW1lbnQsIE9wZXJhdGlvbnMgYW5kIE9yZ2FuaXphdGlvbi4mI3hBOyIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ3b3JrUHJvZHVjdHMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1dvcmtQcm9kdWN0Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InN1YmRvbWFpbnMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0RvbWFpbiIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iV29ya1Byb2R1Y3RUeXBlIiBlU3VwZXJUeXBlcz0iIy8vQ29udGVudENhdGVnb3J5Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXb3JrIFByb2R1Y3QgVHlwZSBpcyBhIHNlY29uZCBjYXRlZ29yeSBmb3Igd29yayBwcm9kdWN0cywgd2hpY2ggaW4gY29udHJhc3QgdG8gRG9tYWluIGlzIG1vcmUgcHJlc2VudGF0aW9uIG9yaWVudGVkLiAgQSB3b3JrIHByb2R1Y3QgY2FuIGhhdmUgbWFueSBXb3JrIFByb2R1Y3QgVHlwZXMuICBFeGFtcGxlcywgZm9yIGEgV29yayBQcm9kdWN0IFR5cGUgaXMgJnF1b3Q7Q2xhc3MgRGlhZ3JhbSZxdW90Oywgd2hpY2ggY2F0ZWdvcml6ZXMgdGhlIEFydGlmYWN0cyBBbmFseXNpcyBNb2RlbCwgRGVzaWduIE1vZGVsLCBVc2VyIEV4cGVyaWVuY2UgTW9kZWwsIG9yICZxdW90O1NwZWNpZmljYXRpb24mcXVvdDssIHdoaWNoIGNhdGVnb3JpemVzIHJlcXVpcmVtZW50cyBzcGVjaWZpY2F0aW9ucyB0aGF0IGRlZmluZSBhIHN5c3RlbSB3aXRoIGEgd2VsbC1kZWZpbmVkIHN5c3RlbSBib3VuZGFyeSwgc3VjaCBhcyB1c2UgY2FzZSBvciBmdW5jdGlvbmFsIHJlcXVpcmVtZW50cyBzcGVjaWZpY2F0aW9uLiAgQSBXb3JrIFByb2R1Y3QgY2FuIGJlIGNhdGVnb3JpemVkIHRvIGJlIG9mIG1hbnkgV29yayBQcm9kdWN0IFR5cGVzLiAgRm9yIGV4YW1wbGUsIGEgdXNlIGNhc2UgbW9kZWwgY2FuIGJlIGNhdGVnb3JpemVkIGFzIGEgU3BlY2lmaWNhdGlvbiBhcyB3ZWxsIGFzIERpYWdyYW0gV29yayBQcm9kdWN0IFR5cGUuJiN4QTsiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0id29ya1Byb2R1Y3RzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Xb3JrUHJvZHVjdCIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJEaXNjaXBsaW5lR3JvdXBpbmciIGVTdXBlclR5cGVzPSIjLy9Db250ZW50Q2F0ZWdvcnkiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkRpc2NpcGxpbmUgR3JvdXBpbmdzIGFyZSB1c2VkIHRvIGdyb3VwIERpc2NpcGxpbmVzLiAgRm9yIGV4YW1wbGUsIHRoZSBEaXNjaXBsaW5lIEdyb3VwaW5nICZxdW90O1NvZnR3YXJlIERpc2NpcGxpbmVzJnF1b3Q7IHdvdWxkIGJlIHRoZSBncm91cCBvZiBhbGwgZGlzY2lwbGluZXMgcmVsYXRlZCB0byBkZXZlbG9waW5nIHNvZnR3YXJlIHN1Y2ggYXMgJnF1b3Q7UmVxdWlyZW1lbnRzIE1hbmFnZW1lbnQmcXVvdDsgb3IgJnF1b3Q7VGVzdGluZyZxdW90OzsgJnF1b3Q7SVQgSW5mcmFzdHJ1Y3R1cmUgTWFuYWdlbWVudCZxdW90OyB3b3VsZCBiZSBhIERpc2NpcGxpbmVzIEdyb3VwaW5nIGZvciBkaXNjaXBsaW5lcyBzdWNoIGFzICZxdW90O0lUIE9wZXJhdGlvbmFsIFNlcnZpY2VzJnF1b3Q7LCAmcXVvdDtJVCBDdXN0b21lciBSZWxhdGlvbnNoaXBzJnF1b3Q7LCBvciAmcXVvdDtJVCBFbmFibGluZyBTZXJ2aWNlcyZxdW90Oy4gIERpc2NpcGxpbmVzIGNhbiBiZSBhc3NvY2lhdGVkIHRvIG1vcmUgdGhhbiBvbmUgRGlzY2lwbGluZSBHcm91cGluZy4mI3hBOyIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJkaXNjaXBsaW5lcyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vRGlzY2lwbGluZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJEaXNjaXBsaW5lIiBlU3VwZXJUeXBlcz0iIy8vQ29udGVudENhdGVnb3J5Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIERpc2NpcGxpbmUgaXMgYSBjYXRlZ29yaXphdGlvbiBvZiB3b3JrIChpLmUuIFRhc2tzIGZvciBNZXRob2QgQ29udGVudCksIGJhc2VkIHVwb24gc2ltaWxhcml0eSBvZiBjb25jZXJucyBhbmQgY29vcGVyYXRpb24gb2Ygd29yayBlZmZvcnQuJiN4QTtBIGRpc2NpcGxpbmUgaXMgYSBjb2xsZWN0aW9uIG9mIFRhc2tzIHRoYXQgYXJlIHJlbGF0ZWQgdG8gYSBtYWpvciAnYXJlYSBvZiBjb25jZXJuJyB3aXRoaW4gdGhlIG92ZXJhbGwgcHJvamVjdC4gVGhlIGdyb3VwaW5nIG9mIFRhc2tzIGludG8gZGlzY2lwbGluZXMgaXMgbWFpbmx5IGFuIGFpZCB0byB1bmRlcnN0YW5kaW5nIHRoZSBwcm9qZWN0IGZyb20gYSAndHJhZGl0aW9uYWwnIHdhdGVyZmFsbCBwZXJzcGVjdGl2ZS4gSG93ZXZlciwgdHlwaWNhbGx5LCBmb3IgZXhhbXBsZSwgaXQgaXMgbW9yZSBjb21tb24gdG8gcGVyZm9ybSBjZXJ0YWluIHJlcXVpcmVtZW50cyBhY3Rpdml0aWVzIGluIGNsb3NlIGNvb3JkaW5hdGlvbiB3aXRoIGFuYWx5c2lzIGFuZCBkZXNpZ24gYWN0aXZpdGllcy4gU2VwYXJhdGluZyB0aGVzZSBhY3Rpdml0aWVzIGludG8gc2VwYXJhdGUgZGlzY2lwbGluZXMgbWFrZXMgdGhlIGFjdGl2aXRpZXMgZWFzaWVyIHRvIGNvbXByZWhlbmQuJiN4QTsmI3hEOyYjeEE7RGlzY2lwbGluZSBpcyBhIGNhdGVnb3JpemF0aW9uIG9mIFRhc2tzIGJhc2VkIHVwb24gc2ltaWxhcml0eSBvZiBjb25jZXJucyBhbmQgY29vcGVyYXRpb24gb2Ygd29yayBlZmZvcnQuICBUaGlzIGlzIHRoZSBleHRlbnNpb25zIG9mIERpc2NpcGxpbmUgZGVmaW5lZCBpbiB0aGUgTWV0aG9kIENvcmUgcGFja2FnZSBhZGRpbmcgYW4gYWRkaXRpb25hbCBhc3NvY2lhdGlvbiB0byBBY3Rpdml0aWVzLCB3aGljaCByZXByZXNlbnQgdHlwaWNhbCBzdGFuZGFyZCBvciByZWZlcmVuY2Ugd2F5cyBvZiBtZWFuaW5nZnVsIGdyb3VwaW5ncyBvZiB0aGUgRGlzY2lwbGluZSdzIFRhc2tzIGludG8gd29ya2Zsb3dzLiYjeEE7VGFza3MgcmVwcmVzZW50IGRlc2NyaXB0aW9ucyBvZiB3b3JrLCB3aGljaCBhcmUgY2F0ZWdvcml6ZWQgYnkgRGlzY2lwbGluZXMuICBUaGUgcmVhc29uIHRoYXQgc2V2ZXJhbCBUYXNrcyBhcmUgYWxsIGNhdGVnb3JpemVkIGJ5IHRoZSBzYW1lIERpc2NpcGxpbmUgaXMgdGhhdCB0aGV5IGFsbCByZXByZXNlbnQgYSBwYXJ0IGluIGFjaGlldmluZyBhIGhpZ2hlciBnb2FsIG9yIHBlcmZvcm1pbmcgd29yayB0aGF0IGlzIGFsbCByZWxhdGVkIHRvIGVhY2ggb3RoZXIuICBFdmVyeSBEaXNjaXBsaW5lIGRlZmluZXMgc3RhbmRhcmQgd2F5cyBvZiBkb2luZyB0aGUgd29yayBpdCBjYXRlZ29yaXplcy4gIFN1Y2ggc3RhbmRhcmQgd2F5cyBhcmUgZXhwcmVzcyBieSBBY3Rpdml0aWVzIG9yIENhcGFiaWxpdHkgUGF0dGVybnMgZGVmaW5pbmcgaG93IHRoZSBUYXNrcyBjYXRlZ29yaXplZCBieSB0aGUgRGlzY2lwbGluZSAnd29yayB0b2dldGhlcicgaW4gdGhlIG1vc3QgZ2VuZXJpYyB3YXkuICBUaGVzZSByZWZlcmVuY2Ugd29ya2Zsb3dzIGFyZSBvZnRlbiB1c2VkIGZvciBlZHVjYXRpbmcgYW5kIHRlYWNoaW5nIHByYWN0aXRpb25lcnMuICYjeEE7Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InRhc2tzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9UYXNrIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InN1YmRpc2NpcGxpbmUiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0Rpc2NpcGxpbmUiIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InJlZmVyZW5jZVdvcmtmbG93cyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vQWN0aXZpdHkiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQWN0aXZpdHkiIGVTdXBlclR5cGVzPSIjLy9Xb3JrQnJlYWtkb3duRWxlbWVudCAjLy9GdWxmaWxsYWJsZUVsZW1lbnQgIy8vVmFyaWFiaWxpdHlFbGVtZW50ICMvL1dvcmtEZWZpbml0aW9uIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBbiBBY3Rpdml0eSBpcyBhIFdvcmsgQnJlYWtkb3duIEVsZW1lbnQgYW5kIFdvcmsgRGVmaW5pdGlvbiB3aGljaCBzdXBwb3J0cyB0aGUgbmVzdGluZyBhbmQgbG9naWNhbCBncm91cGluZyBvZiByZWxhdGVkIEJyZWFrZG93biBFbGVtZW50cyBmb3JtaW5nIGJyZWFrZG93biBzdHJ1Y3R1cmVzLiAgQWx0aG91Z2ggQWN0aXZpdHkgaXMgYSBjb25jcmV0ZSBtZXRhLWNsYXNzLCBvdGhlciBjbGFzc2VzIHdoaWNoIHJlcHJlc2VudCBicmVha2Rvd24gc3RydWN0dXJlcyBkZXJpdmUgZnJvbSBpdDsgc3VjaCBhcyBQaGFzZSwgSXRlcmF0aW9uLCBEZWxpdmVyeSBQcm9jZXNzLCBvciBDYXBhYmlsaXR5IFBhdHRlcm4uJiN4QTtBY3Rpdml0eSByZXByZXNlbnRzIGEgZ3JvdXBpbmcgZWxlbWVudCBmb3Igb3RoZXIgQnJlYWtkb3duIEVsZW1lbnRzIHN1Y2ggYXMgQWN0aXZpdGllcywgRGVzY3JpcHRvcnMsIE1pbGVzdG9uZXMsIGV0Yy4gIEl0IGlzIG5vdCBwZXItc2UgYSAnaGlnaC1sZXZlbCcgZ3JvdXBpbmcgb2Ygb25seSB3b3JrIGFzIGluIG90aGVyIG1ldGEtbW9kZWxzLCBidXQgZ3JvdXBzIGFueSBraW5kIG9mIEJyZWFrZG93biBFbGVtZW50cy4gIEZvciBleGFtcGxlLCBvbmUgY2FuIGRlZmluZSB2YWxpZCBBY3Rpdml0aWVzIHRoYXQgZ3JvdXAgb25seSBXb3JrIFByb2R1Y3RzIERlc2NyaXB0b3JzIHdpdGhvdXQgYW55IG1hdGNoaW5nIFRhc2sgRGVzY3JpcHRvcnMuICBBY3Rpdml0aWVzIGFsc28gaW5oZXJpdCBhbGwgcHJvcGVydGllcyBmcm9tIFdvcmsgQnJlYWtkb3duIEVsZW1lbnQgYW5kIGluZGlyZWN0bHkgZnJvbSBQcm9jZXNzIEVsZW1lbnQ7IGkuZS4gQWN0aXZpdHkgaXMgcmVhZHkgdG8gaGF2ZSBhIGZ1bGwgY29udGVudCBkZXNjcmlwdGlvbiBhdHRhY2hlZCB0byBpdC4mI3hBOyYjeEQ7JiN4QTtUaGlzIGRlZmluaXRpb24gb2YgQWN0aXZpdHkgZXh0ZW5kcyBBY3Rpdml0eSBpbnRyb2R1Y2VkIGluIHRoZSBwYWNrYWdlIEJyZWFrZG93biB3aXRoIG5ldyBjYXBhYmlsaXRpZXMgYW5kIGlzIHRoZSBiYXNpcyBmb3IgdGhlIGRlZmluaXRpb24gb2YgdGhlIGNsYXNzIFByb2Nlc3MuJiN4QTtFeHRlbmRzIEFjdGl2aXR5IHdpdGggYW4gYXNzb2NpYXRpb24gdG8gUm9hZG1hcC4gIFRoaXMgZGVmaW5pdGlvbiBvZiBBY3Rpdml0eSBhbHNvIHBhcnRpY2lwYXRlcyBpbiB0aGUgZXh0ZW5zaW9uIG9mIHRoZSBEaXNjaXBsaW5lIGNhdGVnb3J5LiYjeEE7JiN4RDsmI3hBO0FjdGl2aXR5IGluIHRoZSBwYWNrYWdlIE1ldGhvZCBQbHVnaW4gaW5oZXJpdHMgZnJvbSBWYXJpYWJpbGl0eSBFbGVtZW50IHRvIGV4dGVuZCBBY3Rpdml0eSB3aXRoIG5ldyBjYXBhYmlsaXRpZXMgZm9yIHZhcmlhYmlsaXR5LiYjeEQ7JiN4QTtBY3Rpdml0eSBpbmhlcml0cyB0aGUgc2VtYW50aWNzIG9mIFZhcmlhYmlsaXR5IEVsZW1lbnQgd2hpY2ggcHJvdmlkZXMga2V5IG1lY2hhbmlzbSB0byBlbmFibGUgZHluYW1pYyBiaW5kaW5nIG9mIENhcGFiaWxpdHkgUGF0dGVybnMgaW4gUHJvY2Vzc2VzIGFzIHdlbGwgYXMgUHJvY2VzcyBDb250cmlidXRpb25zLiAgVmFyaWFiaWxpdHkgaXMgdXNlZCBpbiB0aGUgZm9sbG93aW5nIHdheSBmb3IgQWN0aXZpdGllczomI3hEOyYjeEE7LSBFeHRlbmQ6IFRvIGFwcGx5IGEgQ2FwYWJpbGl0eSBQYXR0ZXJuIHRvIGEgcHJvY2VzcyBvbmUgd291bGQgY3JlYXRlIGFuIEFjdGl2aXR5IHdoaWNoIGV4dGVuZHMgdGhlIHBhdHRlcm4ncyB0b3AtbGV2ZWwgYWN0aXZpdHkuICBUaHJvdWdoIGV4dGVuc2lvbiB0aGUgZXh0ZW5kaW5nIEFjdGl2aXR5IGluaGVyaXRzIHRoZSBwYXR0ZXJucyBCcmVha2Rvd24gRWxlbWVudHMuJiN4RDsmI3hBOy0gUmVwbGFjZTogVG8gcmVwbGFjZSBhbiBBY3Rpdml0eSBvZiBhbiBhcHBsaWVkIENhcGFiaWxpdHkgUGF0dGVybiBvciBhbiBleGlzdGluZyBwcm9jZXNzIGZvciB3aGljaCBvbmUgZGV2ZWxvcHMgYSBQcm9jZXNzIENvbnRyaWJ1dGlvbiAob3IgYSBjb21iaW5hdGlvbiBvZiBib3RoKSBvbmUgd291bGQgY3JlYXRlIGFuIEFjdGl2aXR5IGFuZCBzcGVjaWZ5IHRoZSByZXBsYWNlIHZhcmlhYmlsaXR5IHNwZWNpYWxpemF0aW9uIGJldHdlZW4gdGhlbS4mI3hEOyYjeEE7LSBDb250cmlidXRlOiBUbyBjb250cmlidXRlIG5ldyBCcmVha2Rvd24gRWxlbWVudHMgdG8gYW4gZXhpc3RpbmcgQWN0aXZpdHkgb25lIHdvdWxkIGRlZmluZSBhbiBBY3Rpdml0eSB3aXRoIEJyZWFrZG93biBFbGVtZW50cyB0aGF0IHJlbGF0ZXMgdmlhIHRoZSBDb250cmlidXRlcyBWYXJpYWJpbGl0eSBTcGVjaWFsaXphdGlvbiB0byB0aGlzIGV4aXN0aW5nIEFjdGl2aXR5LiAgVGhlIGNvbnRyaWJ1dGluZyBBY3Rpdml0eSdzIEJyZWFrZG93biBFbGVtZW50cyB3aWxsIGJlIGFkZGVkIHRvIHRoZSBjb250cmlidXRlZCBBY3Rpdml0eS4mI3hEOyYjeEE7JiN4RDsmI3hBOyIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJicmVha2Rvd25FbGVtZW50cyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vQnJlYWtkb3duRWxlbWVudCIgZU9wcG9zaXRlPSIjLy9CcmVha2Rvd25FbGVtZW50L3N1cGVyQWN0aXZpdGllcyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJyb2FkbWFwcyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vUm9hZG1hcCIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJXb3JrQnJlYWtkb3duRWxlbWVudCIgYWJzdHJhY3Q9InRydWUiCi0gICAgICBlU3VwZXJUeXBlcz0iIy8vQnJlYWtkb3duRWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBXb3JrIEJyZWFrZG93biBFbGVtZW50IGlzIGEgc3BlY2lhbCBCcmVha2Rvd24gRWxlbWVudCB0aGF0IHByb3ZpZGVzIHNwZWNpZmljIHByb3BlcnRpZXMgZm9yIEJyZWFrZG93biBFbGVtZW50cyB0aGF0IHJlcHJlc2VudCBvciByZWZlciB0byBXb3JrIERlZmluaXRpb25zLiAgRm9yIGV4YW1wbGUgaXRzIHN1YmNsYXNzIEFjdGl2aXR5IGRlZmluZXMgd29yayBhcyBpdCBpcyBhbHNvIGEgc3ViY2xhc3Mgb2YgV29yayBEZWZpbml0aW9uLiAgSXRzIHN1YmNsYXNzIFRhc2sgRGVzY3JpcHRvciBkb2VzIG5vdCBkZWZpbmUgd29yayBieSBpdHNlbGYsIGJ1dCByZWZlcnMgdG8gYSBXb3JrIERlZmluaXRpb24gYW5kIHRoZXJlZm9yZSBjYW4gaGF2ZSB0aGUgc2FtZSBjb21tb24gcHJvcGVydGllcyBhbmQgV29yayBCcmVha2Rvd24gRWxlbWVudCBoYXMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImlzUmVwZWF0YWJsZSIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIGxvd2VyQm91bmQ9IjEiIGVUeXBlPSIjLy9Cb29sZWFuIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoaXMgYXR0cmlidXRlIGlzIHVzZWQgdG8gZGVmaW5lIHJlcGV0aXRpb24gb2Ygd29yaywgZS5nLiBpdGVyYXRpb25zLiAgQSBQcm9jZXNzIFdvcmsgRGVmaW5pdGlvbiB3aXRoIHRoaXMgYXR0cmlidXRlIHNldCB0byBUcnVlIHNoYWxsIGJlIHJlcGVhdGVkIG1vcmUgdGhhbiBvbmNlIG9uIHRoZSBzYW1lIHNldCBvZiBhcnRpZmFjdHMuICBGb3IgZXhhbXBsZSwgZm9yIGFuIGluc3RhbmNlIG9mIEl0ZXJhdGlvbiAoZGVmaW5lZCBhcyBhIHNwZWNpYWwgUHJvY2VzcyBXb3JrIERlZmluaXRpb24gYmVsb3cpIHRoaXMgYXR0cmlidXRlIGlzIHNldCB0byBUcnVlIGJ5IGRlZmF1bHQgaW5kaWNhdGluZyB0aGF0IGV2ZXJ5IHN1Yi1BY3Rpdml0eSB3aWxsIGJlIHJlcGVhdGVkIG1vcmUgdGhhbiBvbmNlLiAgSG93ZXZlciwgYW55IFByb2Nlc3MgV29yayBEZWZpbml0aW9uIGNhbiBzZXQgdGhpcyBhdHRyaWJ1dGUgdG8gVHJ1ZSB0byBkZWZpbmUgaXRlcmF0aW9ucyAoZS5nLiB0byBpdGVyYXRlIG9uZSBBY3Rpdml0eSBjb25zaXN0aW5nIG9mIG1hbnkgc3ViLWFjdGl2aXRpZXMgb3IgZXZlbiBQaGFzZXMsIGJ1dCB0byBpdGVyYXRlIGp1c3Qgb25lIFRhc2spLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpc09uZ29pbmciIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICBsb3dlckJvdW5kPSIxIiBlVHlwZT0iIy8vQm9vbGVhbiIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJJZiB0aGUgaXNPbmdvaW5nIGF0dHJpYnV0ZSBpcyBzZXQgdG8gVHJ1ZSBmb3IgYSBQcm9jZXNzIFdvcmsgRGVmaW5pdGlvbiBpbnN0YW5jZSwgdGhlbiB0aGUgZWxlbWVudCBkZXNjcmliZXMgYW4gb25nb2luZyBwaWVjZSBvZiB3b3JrIHdpdGhvdXQgYSBmaXhlZCBkdXJhdGlvbiBvciBlbmQgc3RhdGUuICBGb3IgZXhhbXBsZSwgdGhlIFByb2Nlc3MgV29yayBEZWZpbml0aW9uIGNvdWxkIHJlcHJlc2VudCB3b3JrIG9mIGFuIGFkbWluaXN0cmF0b3IgY29udGludW91c2x5IChlLmcuIDNoIGEgZGF5KSB3b3JraW5nIHRvIGVuc3VyZSB0aGF0IHN5c3RlbXMgYXJlIGtlcHQgaW4gYSBjZXJ0YWluIHN0YXRlLiAgQW5vdGhlciBleGFtcGxlIHdvdWxkIGJlIHByb2dyYW0gbWFuYWdlbWVudCB3b3JrIG92ZXJzZWVpbmcgbWFueSBkaWZmZXJlbnQgcHJvamVjdHMgYmVpbmcgc2NoZWR1bGVkIGZvciBvbmUgcGFydGljdWxhciBwcm9qZWN0IGF0IHNwZWNpZmljIHJlb2NjdXJyaW5nIGludGVydmFscyBkdXJpbmcgdGhlIHdob2xlIGxpZmVjeWNsZSBvZiB0aGUgcHJvamVjdC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaXNFdmVudERyaXZlbiIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIGxvd2VyQm91bmQ9IjEiIGVUeXBlPSIjLy9Cb29sZWFuIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBpc0V2ZW50RHJpdmVuIGF0dHJpYnV0ZSBpbmRpY2F0ZXMgdGhhdCB0aGUgUHJvY2VzcyBXb3JrIERlZmluaXRpb24gZGVzY3JpYmVzIGFuIGluc3RhbmNlIG9mIHdvcmsgd2hpY2ggaXMgbm90IHN0YXJ0ZWQgYmVjYXVzZSBpdCBoYXMgYmVlbiBzY2hlZHVsZWQgdG8gc3RhcnQgYXQgYSBjZXJ0YWluIHBvaW50IG9mIHRpbWUsIGJlY2F1c2UgcHJlY2VkaW5nIHdvcmsgaXMgYmVpbmcgY29tcGxldGVkLCBvciBpbnB1dCB3b3JrIHByb2R1Y3RzIGFyZSBhdmFpbGFibGUsIGJ1dCBiZWNhdXNlIGFub3RoZXIgc3BlY2lmaWMgZXZlbnQgaGFzIG9jY3VycmVkLiAgRXhhbXBsZXMgZm9yIHN1Y2ggZXZlbnRzIGFyZSBleGNlcHRpb25zIG9yIHByb2JsZW0gc2l0dWF0aW9ucyB3aGljaCByZXF1aXJlIHNwZWNpZmljIHdvcmsgdG8gYmUgcGVyZm9ybWVkIGFzIGEgcmVzdWx0LiAgQWxzbyBjaGFuZ2UgbWFuYWdlbWVudCB3b3JrIGNhbiBiZSBtb2RlbGVkIGFzIGV2ZW50IGRyaXZlbiB3b3JrIGFuYWx5emluZyBhIGNoYW5nZSByZXF1ZXN0IG9yIGRlZmVjdCBhbmQgYWxsb2NhdGluZyB3b3JrIGR5bmFtaWNhbGx5IHRvIHJlc291cmNlcyB0byBkZWFsIHdpdGggaXQgZm9sbG93aW5nIHRoZSB3b3JrIGRlc2NyaWJlZCB3aXRoIHN1Y2ggUHJvY2VzcyBXb3JrIERlZmluaXRpb24uICBUaGUgZXZlbnRzIHRoZW1zZWx2ZXMgYXJlIG5vdCBtb2RlbGVkIGluIHRoaXMgdmVyc2lvbiBvZiB0aGUgc3BlY2lmaWNhdGlvbi4gIFRoZXkgc2hhbGwgYmUgZGVzY3JpYmVkIGFzIHBhcnQgb2YgdGhlIG5vcm1hbCBkZXNjcmlwdGlvbnMgZmllbGRzIGF2YWlsYWJsZS4mI3hBOyYjeEE7JiN4QTsiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ibGlua1RvUHJlZGVjZXNzb3IiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1dvcmtPcmRlciIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJCcmVha2Rvd25FbGVtZW50IiBhYnN0cmFjdD0idHJ1ZSIgZVN1cGVyVHlwZXM9IiMvL1Byb2Nlc3NFbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJCcmVha2Rvd24gRWxlbWVudCBpcyBhbiBhYnN0cmFjdCBnZW5lcmFsaXphdGlvbiBmb3IgYW55IHR5cGUgb2YgTWV0aG9kIEVsZW1lbnQgdGhhdCBpcyBwYXJ0IG9mIGEgYnJlYWtkb3duIHN0cnVjdHVyZS4gIEl0IGRlZmluZXMgYSBzZXQgb2YgcHJvcGVydGllcyBhdmFpbGFibGUgdG8gYWxsIG9mIGl0cyBzcGVjaWFsaXphdGlvbnMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InByZWZpeCIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9TdHJpbmciIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlByZWZpeCByZXByZXNlbnRzIGFuIGFkZGl0aW9uYWwgbGFiZWwgdGhhdCB3aWxsIGJlIHByZXNlbnRlZCBhcyBhIHByZWZpeCB0byBhbnkgQnJlYWtkb3duIEVsZW1lbnQgdG8gaW5kaWNhdGUgYSB1c2VyLWRlZmluZWQgc3ViLXR5cGUgZm9yIHRoZSBlbGVtZW50LiAgRm9yIGV4YW1wbGUsIGlmIHRoZSBwcm9jZXNzIGVuZ2luZWVyIHdvdWxkIGxpa2UgdG8gZGlzdGluZ3Vpc2ggaGlzIEFjdGl2aXRpZXMgYnkgJ01vZHVsZScgKGFzIGRvbmUgaW4gdGhlIElCTSBSYXRpb25hbCBTdW1taXQgQXNjZW5kYW50IE1ldGhvZCksIGhlIGNhbiBkZWZpbmUgYSBkaWZmZXJlbnQgcHJlZml4IGZvciBldmVyeSBtb2RlbCB0byBiZSB1c2VkIGluIGFkZGl0aW9uIHRvIG5hbWluZyBBY3Rpdml0aWVzLCBlLmcuICZxdW90O1NSQS5Fc3RhYmxpc2ggUmVxdWlyZW1lbnRzJnF1b3Q7IHdpdGggU1JBIGluZGljYXRpbmcgdGhhdCB0aGlzIEFjdGl2aXR5IGJlbG9uZ3MgdG8gdGhlICZxdW90O1NvZnR3YXJlIFJlcXVpcmVtZW50cyBBbmFseXNpcyZxdW90OyBtb2R1bGUuICBBbm90aGVyIGNvbW1vbiBhcHBsaWNhdGlvbiBmb3IgcHJlZml4IGlzIHRvIHF1YWxpZnkgcm9sZXMgaW4gUm9sZSBEZXNjcmlwdG9ycy4gIEZvciBleGFtcGxlLCAmcXVvdDtDdXN0b21lci5BcmNoaXRlY3QmcXVvdDsgd291bGQgZGVmaW5lIGEgJnF1b3Q7Q3VzdG9tZXImcXVvdDsgcHJlZml4IGZvciB0aGUgUm9sZSBEZXNjcmlwdG9yICZxdW90O0FyY2hpdGVjdCZxdW90OyBleHByZXNzaW5nIHRoYXQgdGhpcyBpcyBhbiBhcmNoaXRlY3Qgb24gdGhlIGN1c3RvbWVyIHNpZGUgYW5kIG5vdCB0aGUgZGV2ZWxvcG1lbnQgdGVhbSBzaWRlLiYjeEE7Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImlzUGxhbm5lZCIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIGxvd2VyQm91bmQ9IjEiIGVUeXBlPSIjLy9Cb29sZWFuIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBrZXkgYXBwbGljYXRpb24gZm9yIERldmVsb3BtZW50IFByb2Nlc3NlcyBleHByZXNzZWQgd2l0aCBCcmVha2Rvd24gc3RydWN0dXJlcyBpcyB0byBnZW5lcmF0ZSBhIHByb2plY3QgcGxhbiBmcm9tIGl0LiAgQSBwcm9jZXNzIGFzIGRlZmluZWQgaW4gVU1BIChjZi4gd2l0aCBTZWN0aW9ucyBYWCBhbmQgNS4yKSBpcyBhIG11bHRpLWRpbWVuc2lvbmFsIHN0cnVjdHVyZSBkZWZpbmluZyB3aGF0IHdvcmsgaXMgYmVpbmcgcGVyZm9ybWVkIGF0IHdoYXQgdGltZSBieSB3aGljaCByb2xlcyB1c2luZyB3aGljaCBpbnB1dCBhbmQgcHJvZHVjaW5nIHdoYXQgb3V0cHV0cy4gIEEgcHJvamVjdCBwbGFuIGFzIGl0IGlzIHJlcHJlc2VudGVkIGluIHByb2plY3QgcGxhbm5pbmcgdG9vbHMgc3VjaCBhcyBJQk0gUmF0aW9uYWwgUG9ydGZvbGlvIE1hbmFnZXIgb3IgTWljcm9zb2Z0IFByb2plY3Qgbm9ybWFsbHkgZG9lcyBub3QgbmVlZCBhbGwgdGhpcyBpbmZvcm1hdGlvbiBhbmQgaXMgbm9ybWFsbHkgbGltaXRlZCB0byBqdXN0IHJlcHJlc2VudGluZyBhIHN1YnNldC4gIEZvciBleGFtcGxlLCBhIHR5cGljYWwgTVMgUHJvamVjdCBwbGFuIG9ubHkgcmVwcmVzZW50cyB0aGUgd29yayBicmVha2Rvd24gY29uc2lzdGluZyBvZiBUYXNrcyBhbmQgQWN0aXZpdGllcyAoc29tZXRpbWVzIHJlZmVycmVkIHRvIGFzIHN1bW1hcnkgdGFza3MpLiAgSXQgZG9lcyBub3Qgc2hvdyB0aGUgaW5wdXQgYW5kIG91dHB1dCBXb3JrIFByb2R1Y3RzIGZvciBhIFRhc2ssIGJ1dCBpdCBjYW4gc2hvdyB3aGljaCByb2xlcyBzaGFsbCBiZSBzdGFmZmVkIGZvciBwZXJmb3JtaW5nIHRoZSBUYXNrLiAgSG93ZXZlciwgc3VjaCByb2xlIGFsbG9jYXRpb24gbmVlZCB0byBiZSByZXBsYWNlZCB3aXRoIGNvbmNyZXRlIHJlc291cmNlcyB3aGVuIGluc3RhbnRpYXRpbmcgdGhlIHBsYW4gZm9yIGEgY29uY3JldGUgcHJvamVjdC4gIFNvbWV0aW1lcyBwcm9qZWN0IHBsYW5zIGNhbiB0aGVuIGFnYWluIGJlIG9yZ2FuaXplZCBkaWZmZXJlbnRseSBieSBvcmdhbml6aW5nIHdvcmsgYnkgZGVsaXZlcmFibGVzIGluIHdoaWNoIFdvcmsgUHJvZHVjdHMgYXJlIG1hcHBlZCB0byB0aGUgcGxhbidzIHN1bW1hcnkgdGFza3MgYW5kIFRhc2sgdGhhdCBoYXZlIHRoZXNlIHdvcmsgcHJvZHVjdHMgYXMgb3V0cHV0IG1hcHBlZCBiZWxvdyBzdWNoIGFzIHN1bW1hcnkgdGFzay4gIFRoZXJlZm9yZSwgYSBwcm9jZXNzIGNhbiBtYWtlIHJlY29tbWVuZGF0aW9ucyBhYm91dCB3aGljaCBlbGVtZW50cyB0byBpbmNsdWRlIGFuZCB3aGljaCB0byBleGNsdWRlIHdoZW4gZ2VuZXJhdGluZyBhIHBsYW4uICBXaGVuIHRoZSBpc1BsYW5uZWQgYXR0cmlidXRlIGlzIHNldCB0byBGYWxzZSBmb3IgYW4gaW5zdGFuY2Ugb2YgYSBCcmVha2Rvd24gRWxlbWVudCwgdGhlbiB0aGlzIGVsZW1lbnQgc2hhbGwgbm90IGJlIG5vdCBpbmNsdWRlZCB3aGVuIGEgY29uY3JldGUgcHJvamVjdCBwbGFuIGlzIGJlaW5nIGdlbmVyYXRlZCBmcm9tIHRoZSBicmVha2Rvd24gc3RydWN0dXJlIHRoYXQgY29udGFpbnMgdGhpcyBlbGVtZW50LiYjeEE7JiN4QTsmI3hBOyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJoYXNNdWx0aXBsZU9jY3VycmVuY2VzIgotICAgICAgICBvcmRlcmVkPSJmYWxzZSIgbG93ZXJCb3VuZD0iMSIgZVR5cGU9IiMvL0Jvb2xlYW4iIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iSnVzdCBhcyB0aGUgaXNQbGFubmVkIGF0dHJpYnV0ZSB0aGUgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcyBhdHRyaWJ1dGUgaGFzIGFuIGltcGFjdCBvbiBnZW5lcmF0aW5nIHBsYW5zIGZyb20gYSBQcm9jZXNzLiAgV2hlbiB0aGlzIGF0dHJpYnV0ZSBpcyBzZXQgdG8gVHJ1ZSBmb3IgYSBCcmVha2Rvd24gRWxlbWVudCB0aGVuIGl0IHdpbGwgdHlwaWNhbGx5IG9jY3VyIG11bHRpcGxlIHRpbWVzIHdpdGhpbiB0aGUgc2FtZSBBY3Rpdml0eS4gIEZvciBleGFtcGxlLCBhIFRhc2sgc3VjaCBhcyAmcXVvdDtEZXRhaWwgVXNlIENhc2UmcXVvdDsgd291bGQgYmUgcGVyZm9ybWVkIGZvciBldmVyeSB1c2UgY2FzZSBpZGVudGlmaWVkIGZvciBhIHBhcnRpY3VsYXIgSXRlcmF0aW9uIG9yIEFjdGl2aXR5LiAgR2VuZXJhdGluZyBhIHBsYW4gd291bGQgbGlzdCBvbmUgVGFzayBpbnN0YW5jZSBwZXIgdXNlIGNhc2UuJiN4QTsiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaXNPcHRpb25hbCIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIGxvd2VyQm91bmQ9IjEiIGVUeXBlPSIjLy9Cb29sZWFuIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBpc09wdGlvbmFsIGF0dHJpYnV0ZSBpbmRpY2F0ZXMgdGhhdCB0aGUgQnJlYWtkb3duIEVsZW1lbnQgZGVzY3JpYmVzIHdvcmssIGEgd29yayByZXN1bHQsIG9yIGV2ZW4gd29yayByZXNvdXJjZXMsIHdoaWNoIGluY2x1c2lvbiBpcyBub3QgbWFuZGF0b3J5IHdoZW4gcGVyZm9ybWluZyBhIHByb2plY3QgdGhhdCBpcyBwbGFubmVkIGJhc2VkIG9uIGEgcHJvY2VzcyBjb250YWluaW5nIHRoaXMgZWxlbWVudC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icHJlc2VudGVkQWZ0ZXIiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vQnJlYWtkb3duRWxlbWVudCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJwcmVzZW50ZWRCZWZvcmUiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vQnJlYWtkb3duRWxlbWVudCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJwbGFubmluZ0RhdGEiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vUGxhbm5pbmdEYXRhIiBjb250YWlubWVudD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJzdXBlckFjdGl2aXRpZXMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICBsb3dlckJvdW5kPSIxIiBlVHlwZT0iIy8vQWN0aXZpdHkiIGVPcHBvc2l0ZT0iIy8vQWN0aXZpdHkvYnJlYWtkb3duRWxlbWVudHMiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iY2hlY2tsaXN0cyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vQ2hlY2tsaXN0Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImNvbmNlcHRzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Db25jZXB0Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImV4YW1wbGVzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9FeGFtcGxlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Imd1aWRlbGluZXMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0d1aWRlbGluZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJyZXVzYWJsZUFzc2V0cyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vUmV1c2FibGVBc3NldCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJzdXBwb3J0aW5nTWF0ZXJpYWxzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9TdXBwb3J0aW5nTWF0ZXJpYWwiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0idGVtcGxhdGVzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9UZW1wbGF0ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJyZXBvcnRzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9SZXBvcnQiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZXN0aW1hdGlvbmNvbnNpZGVyYXRpb25zIgotICAgICAgICBvcmRlcmVkPSJmYWxzZSIgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0idG9vbG1lbnRvciIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vVG9vbE1lbnRvciIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQcm9jZXNzRWxlbWVudCIgYWJzdHJhY3Q9InRydWUiIGVTdXBlclR5cGVzPSIjLy9EZXNjcmliYWJsZUVsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlByb2Nlc3MgRWxlbWVudCBpcyBhIERlc2NyaWJhYmxlIEVsZW1lbnQgdGhhdCByZXByZXNlbnRzIGFuIGFic3RyYWN0IGdlbmVyYWxpemF0aW9uIGZvciBhbGwgZWxlbWVudHMgZGVmaW5lZCBpbiB0aGUgUHJvY2VzcyBwYWNrYWdlLiYjeEE7UHJvY2VzcyBFbGVtZW50cyByZXByZXNlbnRzIFByb2Nlc3Mgc3BlY2lmaWMgZWxlbWVudHMgdGhhdCBhcmUgc3VwcG9zZWQgdG8gYmUgbWFuYWdlZCBpbiBQcm9jZXNzIFBhY2thZ2VzLiAgVGhlIHNlcGFyYXRpb24gb2YgUHJvY2VzcyBFbGVtZW50IGZyb20gQ29udGVudCBFbGVtZW50IGFsbG93cyB0byBjbGVhcmx5IGRpc3Rpbmd1aXNoIGJldHdlZW4gcHVyZSBtZXRob2QgY29udGVudCBmcm9tIGNvbnRlbnQgdGhhdCBpcyByZXByZXNlbnRlZCBpbiBwcm9jZXNzZXMuICYjeEE7Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlBsYW5uaW5nRGF0YSIgZVN1cGVyVHlwZXM9IiMvL1Byb2Nlc3NFbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJQbGFubmluZyBEYXRhIGlzIGEgTWV0aG9kIEVsZW1lbnQgdGhhdCBhZGRzIHBsYW5uaW5nIGRhdGEgdG8gQnJlYWtkb3duIEVsZW1lbnRzIHdoZW4gaXQgaXMgdXNlZCBmb3IgYSBQcm9jZXNzIFBsYW5uaW5nIFRlbXBsYXRlLiAgRm9yIERlbGl2ZXJ5IFByb2Nlc3NlcyBhbmQgQ2FwYWJpbGl0eSBQYXR0ZXJucyB0aGlzIGNsYXNzIGNhbiBlaXRoZXIgbm90IGJlIGluc3RhbnRpYXRlZCBvciBwb3B1bGF0ZWQgd2l0aCBkZWZhdWx0IGRhdGEuJiN4QTtQbGFubmluZyBEYXRhIGZhY3RvcnMgb3V0IHNwZWNpZmljIG9wdGlvbmFsIGRhdGEgbmVlZGVkIGZvciByZXByZXNlbnRpbmcgcGxhbm5pbmcgdGVtcGxhdGVzLiAgVGhpcyBhc3NvY2lhdGlvbiBhbGxvd3MgdG8gYWNjZXNzIHBsYW5uaW5nIGRhdGEgaWYgaXQgaXMgc3RvcmVkIGZvciB0aGUgQnJlYWtkb3duIEVsZW1lbnQuJiN4QTsoTk9URSwgVEhFIEFUVFJJQlVURVMgRk9SIFRISVMgQ0xBU1MgQVJFIE5PVCBDT01QTEVURSwgWUVUKSYjeEE7Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InN0YXJ0RGF0ZSIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIGxvd2VyQm91bmQ9IjEiIGVUeXBlPSIjLy9EYXRlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGRlZmF1bHQgc3RhcnQgZGF0ZSBmb3IgYSBwbGFuZWQgVGFzay4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZmluaXNoRGF0ZSIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIGxvd2VyQm91bmQ9IjEiIGVUeXBlPSIjLy9EYXRlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGRlZmF1bHQgZmluaXNoIGRhdGUgZm9yIGEgcGxhbmVkIFRhc2suIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJhbmsiIG9yZGVyZWQ9ImZhbHNlIiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iIy8vSW50ZWdlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBkZWZhdWx0IHJhbmsgZm9yIGEgcGxhbmVkIFRhc2suIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IldvcmtPcmRlciIgZVN1cGVyVHlwZXM9IiMvL1Byb2Nlc3NFbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXb3JrIE9yZGVyIGlzIGEgTWV0aG9kIEVsZW1lbnQgdGhhdCByZXByZXNlbnRzIGEgcmVsYXRpb25zaGlwIGJldHdlZW4gdHdvIEJyZWFrZG93biBFbGVtZW50cyBpbiB3aGljaCBvbmUgQnJlYWtkb3duIEVsZW1lbnRzIGRlcGVuZHMgb24gdGhlIHN0YXJ0IG9yIGZpbmlzaCBvZiBhbm90aGVyIEJyZWFrZG93biBFbGVtZW50cyBpbiBvcmRlciB0byBiZWdpbiBvciBlbmQuICAmI3hBOyhOb3RlLCBXb3JrIE9yZGVyIGlzIG5vdCBtb2RlbGVkIGFzIGFuIEFzc29jaWF0aW9uIENsYXNzIHRvIHByb3ZpZGUgYSBzdHJhaWdodGZvcndhcmQgbWFwcGluZyAgdG8gWE1JIGFuZCBFTUYuKSYjeEE7VGhlIFdvcmsgT3JkZXIgY2xhc3MgZGVmaW5lcyBwcmVkZWNlc3NvciBhbmQgc3VjY2Vzc29yIHJlbGF0aW9ucyBhbW9uZ3N0IEJyZWFrZG93biBFbGVtZW50cy4gIFRoaXMgaW5mb3JtYXRpb24gaXMgaW4gcGFydGljdWxhciBjcml0aWNhbCBmb3IgcGxhbm5pbmcgYXBwbGljYXRpb25zLiAgU2VlIG1vcmUgZGV0YWlscyBvbiBkaWZmZXJlbnQgdHlwZXMgb2YgV29yayBPcmRlciByZWxhdGlvbnNoaXBzIGF0IFdvcmsgT3JkZXIgVHlwZS4mI3hBOyIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJsaW5rVHlwZSIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIGxvd2VyQm91bmQ9IjEiIGVUeXBlPSIjLy9Xb3JrT3JkZXJUeXBlIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmaW5pc2hUb1N0YXJ0Ij4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhpcyBhdHRyaWJ1dGUgZXhwcmVzc2VzIHRoZSB0eXBlIG9mIHRoZSBXb3JrIE9yZGVyIHJlbGF0aW9uc2hpcCBieSBhc3NpZ25pbmcgYSB2YWx1ZSBmcm9tIHRoZSBXb3JrIE9yZGVyIFR5cGUgZW51bWVyYXRpb24uIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InByZWQiIG9yZGVyZWQ9ImZhbHNlIiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iIy8vV29ya0JyZWFrZG93bkVsZW1lbnQiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVFbnVtIiBuYW1lPSJXb3JrT3JkZXJUeXBlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXb3JrIE9yZGVyIHJlcHJlc2VudHMgYSByZWxhdGlvbnNoaXAgYmV0d2VlbiB0d28gQnJlYWtkb3duIEVsZW1lbnQgaW4gd2hpY2ggb25lIEJyZWFrZG93biBFbGVtZW50IChyZWZlcnJlZCB0byBhcyAoQikgYmVsb3cpIGRlcGVuZHMgb24gdGhlIHN0YXJ0IG9yIGZpbmlzaCBvZiBhbm90aGVyIEJyZWFrZG93biBFbGVtZW50IChyZWZlcnJlZCB0byBhcyAoQSkgYmVsb3cpIGluIG9yZGVyIHRvIGJlZ2luIG9yIGVuZC4gVGhpcyBlbnVtZXJhdGlvbiBkZWZpbmVzIHRoZSBkaWZmZXJlbnQgdHlwZXMgb2YgV29yayBPcmRlciByZWxhdGlvbnNoaXBzIGF2YWlsYWJsZSBpbiBVTUEgYW5kIGlzIHVzZWQgdG8gcHJvdmlkZSB2YWx1ZXMgZm9yIFdvcmsgT3JkZXIncyBsaW5rVHlwZSBhdHRyaWJ1dGUuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJmaW5pc2hUb1N0YXJ0Ij4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQnJlYWtkb3duIEVsZW1lbnQgKEIpIGNhbm5vdCBzdGFydCB1bnRpbCBCcmVha2Rvd24gRWxlbWVudCAoQSkgZmluaXNoZXMuIEZvciBleGFtcGxlLCBpZiB5b3UgaGF2ZSB0d28gQnJlYWtkb3duIEVsZW1lbnRzLCAmcXVvdDtDb25zdHJ1Y3QgZmVuY2UmcXVvdDsgYW5kICZxdW90O1BhaW50IGZlbmNlLCZxdW90OyAmcXVvdDtQYWludCBmZW5jZSZxdW90OyBjYW4ndCBzdGFydCB1bnRpbCAmcXVvdDtDb25zdHJ1Y3QgZmVuY2UmcXVvdDsgZmluaXNoZXMuIFRoaXMgaXMgdGhlIG1vc3QgY29tbW9uIHR5cGUgb2YgZGVwZW5kZW5jeSBhbmQgdGhlIGRlZmF1bHQgZm9yIGEgbmV3IFdvcmsgT3JkZXIgaW5zdGFuY2UuJiN4QTsiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZUxpdGVyYWxzPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iZmluaXNoVG9GaW5pc2giIHZhbHVlPSIxIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQnJlYWtkb3duIEVsZW1lbnQgKEIpIGNhbm5vdCBmaW5pc2ggdW50aWwgQnJlYWtkb3duIEVsZW1lbnQgKEEpIGZpbmlzaGVzLiBGb3IgZXhhbXBsZSwgaWYgeW91IGhhdmUgdHdvIEJyZWFrZG93biBFbGVtZW50cywgJnF1b3Q7QWRkIHdpcmluZyZxdW90OyBhbmQgJnF1b3Q7SW5zcGVjdCBlbGVjdHJpY2FsLCZxdW90OyAmcXVvdDtJbnNwZWN0IGVsZWN0cmljYWwmcXVvdDsgY2FuJ3QgZmluaXNoIHVudGlsICZxdW90O0FkZCB3aXJpbmcmcXVvdDsgZmluaXNoZXMuJiN4QTsiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZUxpdGVyYWxzPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0ic3RhcnRUb1N0YXJ0IiB2YWx1ZT0iMiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkJyZWFrZG93biBFbGVtZW50IChCKSBjYW5ub3Qgc3RhcnQgdW50aWwgQnJlYWtkb3duIEVsZW1lbnQgKEEpIHN0YXJ0cy4gRm9yIGV4YW1wbGUsIGlmIHlvdSBoYXZlIHR3byBCcmVha2Rvd24gRWxlbWVudHMsICZxdW90O1BvdXIgZm91bmRhdGlvbiZxdW90OyBhbmQgJnF1b3Q7TGV2ZWwgY29uY3JldGUsJnF1b3Q7ICZxdW90O0xldmVsIGNvbmNyZXRlJnF1b3Q7IGNhbid0IGJlZ2luIHVudGlsICZxdW90O1BvdXIgZm91bmRhdGlvbiZxdW90OyBiZWdpbnMuJiN4QTsiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZUxpdGVyYWxzPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0ic3RhcnRUb0ZpbmlzaCIgdmFsdWU9IjMiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJCcmVha2Rvd24gRWxlbWVudCAoQikgY2Fubm90IGZpbmlzaCB1bnRpbCBCcmVha2Rvd24gRWxlbWVudCAoQSkgc3RhcnRzLiBUaGlzIGRlcGVuZGVuY3kgdHlwZSBjYW4gYmUgdXNlZCBmb3IganVzdC1pbi10aW1lIHNjaGVkdWxpbmcgdXAgdG8gYSBtaWxlc3RvbmUgb3IgdGhlIHByb2plY3QgZmluaXNoIGRhdGUgdG8gbWluaW1pemUgdGhlIHJpc2sgb2YgYSBCcmVha2Rvd24gRWxlbWVudCBmaW5pc2hpbmcgbGF0ZSBpZiBpdHMgZGVwZW5kZW50IEJyZWFrZG93biBFbGVtZW50cyBzbGlwLiBJZiBhIHJlbGF0ZWQgQnJlYWtkb3duIEVsZW1lbnQgbmVlZHMgdG8gZmluaXNoIGJlZm9yZSB0aGUgbWlsZXN0b25lIG9yIHByb2plY3QgZmluaXNoIGRhdGUsIGJ1dCBpdCBkb2Vzbid0IG1hdHRlciBleGFjdGx5IHdoZW4gYW5kIHlvdSBkb24ndCB3YW50IGEgbGF0ZSBmaW5pc2ggdG8gYWZmZWN0IHRoZSBqdXN0LWluLXRpbWUgQnJlYWtkb3duIEVsZW1lbnQsIHlvdSBjYW4gY3JlYXRlIGFuIFNGIGRlcGVuZGVuY3kgYmV0d2VlbiB0aGUgQnJlYWtkb3duIEVsZW1lbnQgeW91IHdhbnQgc2NoZWR1bGVkIGp1c3QgaW4gdGltZSAodGhlIHByZWRlY2Vzc29yKSBhbmQgaXRzIHJlbGF0ZWQgQnJlYWtkb3duIEVsZW1lbnQgKHRoZSBzdWNjZXNzb3IpLiBUaGVuIGlmIHlvdSB1cGRhdGUgcHJvZ3Jlc3Mgb24gdGhlIHN1Y2Nlc3NvciBCcmVha2Rvd24gRWxlbWVudCwgaXQgd29uJ3QgYWZmZWN0IHRoZSBzY2hlZHVsZWQgZGF0ZXMgb2YgdGhlIHByZWRlY2Vzc29yIEJyZWFrZG93biBFbGVtZW50LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lTGl0ZXJhbHM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlJvYWRtYXAiIGVTdXBlclR5cGVzPSIjLy9HdWlkYW5jZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBSb2FkbWFwIGlzIGEgc3BlY2lhbCBHdWlkYW5jZSBUeXBlIHdoaWNoIGlzIG9ubHkgcmVsYXRlZCB0byBBY3RpdmF0ZXMgYW5kIHRoZXJlZm9yZSBoYXMgYmVlbiBhZGRlZCBieSB0aGlzIHBhY2thZ2UgdG8gdGhlIGxpc3Qgb2YgR3VpZGFuY2UgVHlwZXMgcmF0aGVyIHRoYW4gbGlzdGVkIGluIHRoZSBHdWlkYW5jZSBUeXBlcyBwYWNrYWdlLiAgQSBSb2FkbWFwIHJlcHJlc2VudHMgYSBsaW5lYXIgd2Fsa3Rocm91Z2ggb2YgYW4gQWN0aXZpdHksIHR5cGljYWxseSBhIFByb2Nlc3MuJiN4QTtBbiBpbnN0YW5jZSBvZiBhIFJvYWRtYXAgcmVwcmVzZW50cyBpbXBvcnRhbnQgZG9jdW1lbnRhdGlvbiBmb3IgdGhlIEFjdGl2aXR5IG9yIFByb2Nlc3MgaXQgaXMgcmVsYXRlZCB0by4gIE9mdGVuIGEgY29tcGxleCBBY3Rpdml0eSBzdWNoIGFzIGEgUHJvY2VzcyBjYW4gYmUgbXVjaCBlYXNpZXIgdW5kZXJzdG9vZCBieSBwcm92aWRpbmcgYSB3YWxrdGhyb3VnaCB3aXRoIGEgbGluZWFyIHRocmVhZCBvZiBhIHR5cGljYWwgaW5zdGFudGlhdGlvbiBvZiB0aGlzIEFjdGl2aXR5LiAgSW4gYWRkaXRpb24gdG8gbWFraW5nIHRoZSBwcm9jZXNzIHByYWN0aXRpb25lciB1bmRlcnN0YW5kIGhvdyB3b3JrIGluIHRoZSBwcm9jZXNzIGlzIGJlaW5nIHBlcmZvcm1lZCwgYSBSb2FkbWFwIHByb3ZpZGVzIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gYWJvdXQgaG93IEFjdGl2aXRpZXMgYW5kIFRhc2tzIHJlbGF0ZSB0byBlYWNoIG90aGVyIG92ZXIgdGltZS4gIFJvYWRtYXBzIGFyZSBhbHNvIHVzZWQgdG8gc2hvdyBob3cgc3BlY2lmaWMgYXNwZWN0cyBhcmUgZGlzdHJpYnV0ZWQgb3ZlciBhIHdob2xlIHByb2Nlc3MgcHJvdmlkaW5nIGEga2luZCBvZiBmaWx0ZXIgb24gdGhlIHByb2Nlc3MgZm9yIHRoaXMgaW5mb3JtYXRpb24uJiN4QTsiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iVG9vbCIgZVN1cGVyVHlwZXM9IiMvL0NvbnRlbnRDYXRlZ29yeSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBUb29sIGlzIGEgY29udGFpbmVyL2FnZ3JlZ2F0ZSBmb3IgVG9vbE1lbnRvcnMuICBJdCBjYW4gYWxzbyBwcm92aWRlIGdlbmVyYWwgZGVzY3JpcHRpb25zIG9mIHRoZSB0b29sIGFuZCBpdHMgZ2VuZXJhbCBjYXBhYmlsaXRpZXMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InRvb2xNZW50b3JzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Ub29sTWVudG9yIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlJvbGVTZXRHcm91cGluZyIgZVN1cGVyVHlwZXM9IiMvL0NvbnRlbnRDYXRlZ29yeSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iUm9sZSBTZXRzIGNhbiBiZSBjYXRlZ29yaXplZCBpbnRvIFJvbGUgU2V0IEdyb3VwaW5ncy4gIEZvciBleGFtcGxlLCBkaWZmZXJlbnQgbWV0aG9kcyBtaWdodCBkZWZpbmUgc2ltaWxhciBSb2xlIFNldHMsIHdoaWNoIGhvd2V2ZXIgbmVlZCB0byBiZSBkaXN0aW5ndWlzaGVkIGZyb20gZWFjaCBvdGhlciBvbiBhIGdsb2JhbCBzY2FsZS4gIFRodXMsIFJvbGUgU2V0IEdyb3VwaW5ncyBhbGxvdyBkaXN0aW5ndWlzaGluZywgZm9yIGV4YW1wbGUsIFNvZnR3YXJlIFNlcnZpY2VzIE1hbmFnZXIgUm9sZSBTZXRzIGZyb20gU29mdHdhcmUgRGV2ZWxvcG1lbnQgT3JnYW5pemF0aW9uIE1hbmFnZXIgUm9sZSBTZXRzLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJyb2xlU2V0cyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vUm9sZVNldCIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJDdXN0b21DYXRlZ29yeSIgZVN1cGVyVHlwZXM9IiMvL0NvbnRlbnRDYXRlZ29yeSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBDdXN0b20gQ2F0ZWdvcnkgaXMgYSBjYXRlZ29yeSBpbnRyb2R1Y2VkIGJ5IGEgbWV0aG9kIGNvbnRlbnQgYXV0aG9yIHRvIHN0cnVjdHVyZSBhbnkgbnVtYmVyIG9mIG1ldGhvZCBDb250ZW50IEVsZW1lbnRzIG9mIGFueSBzdWJ0eXBlIGJhc2VkIG9uIHVzZXItZGVmaW5lZCBjcml0ZXJpYS4gIEJlY2F1c2UgQ29udGVudCBDYXRlZ29yaWVzIChhbmQgdGhlcmVmb3JlIEN1c3RvbSBDYXRlZ29yaWVzLCB0b28pIGFyZSBDb250ZW50IEVsZW1lbnRzIHRoZW1zZWx2ZXMsIEN1c3RvbSBDYXRlZ29yaWVzIGNhbiBiZSB1c2VkIHRvIHJlY3Vyc2l2ZWx5IGNhdGVnb3JpemUgQ29udGVudCBDYXRlZ29yaWVzIGFzIHdlbGwuICBDdXN0b20gQ2F0ZWdvcmllcyBjYW4gYWxzbyBiZSBuZXN0ZWQgd2l0aCBhbnkgQ29udGVudCBDYXRlZ29yeS4gIEN1c3RvbSBjYXRlZ29yaWVzIGNhbiBiZSB1c2VkIHRvIGNhdGVnb3JpemUgY29udGVudCBiYXNlZCBvbiB0aGUgdXNlcidzIGNyaXRlcmlhIGFzIHdlbGwgYXMgdG8gZGVmaW5lIHdob2xlIHRyZWUtc3RydWN0dXJlcyBvZiBuZXN0ZWQgY2F0ZWdvcmllcyBhbGxvd2luZyB0aGUgdXNlciB0byBzeXN0ZW1hdGljYWxseSBuYXZpZ2F0ZSBhbmQgYnJvd3NlIG1ldGhvZCBjb250ZW50IGFuZCBwcm9jZXNzZXMgYmFzZWQgb24gdGhlc2UgY2F0ZWdvcmllcy4gIEZvciBleGFtcGxlLCBvbmUgY291bGQgY3JlYXRlIGEgY3VzdG9tIGNhdGVnb3J5IHRvIGxvZ2ljYWxseSBvcmdhbml6ZSBjb250ZW50IHJlbGV2YW50IGZvciB0aGUgdXNlcidzIGRldmVsb3BtZW50IG9yZ2FuaXphdGlvbiBkZXBhcnRtZW50czsgZS5nLiBhICZxdW90O1Rlc3RpbmcmcXVvdDsgY2F0ZWdvcnkgdGhhdCBncm91cHMgdG9nZXRoZXIgYWxsIHJvbGVzLCB3b3JrIHByb2R1Y3RzLCB0YXNrcywgYW5kIGd1aWRhbmNlIGVsZW1lbnQgcmVsZXZhbnQgdG8gdGVzdGluZy4gIEFub3RoZXIgZXhhbXBsZSB3b3VsZCBiZSBjYXRlZ29yaWVzIHRoYXQgZXhwcmVzcyBsaWNlbnNpbmcgbGV2ZWxzIG9mIHRoZSBjb250ZW50IGdyb3VwaW5nIGZyZWVseSBkaXN0cmlidXRhYmxlIG1ldGhvZCBjb250ZW50IHZlcnN1cyBjb250ZW50IHRoYXQgcmVwcmVzZW50IGludGVsbGVjdHVhbCBwcm9wZXJ0eSBhbmQgcmVxdWlyZXMgYSBsaWNlbnNlIHRvIGJlIHB1cmNoYXNlZCB0byBiZSBhYmxlIHRvIHVzZSBpdC4mI3hBOyIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJjYXRlZ29yaXplZEVsZW1lbnRzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9EZXNjcmliYWJsZUVsZW1lbnQiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ic3ViQ2F0ZWdvcmllcyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vQ29udGVudENhdGVnb3J5Ii8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ik1ldGhvZFBhY2thZ2UiIGFic3RyYWN0PSJ0cnVlIiBlU3VwZXJUeXBlcz0iIy8vTWV0aG9kRWxlbWVudCAjLy9QYWNrYWdlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIE1ldGhvZCBQYWNrYWdlIGlzIGFuIGFic3RyYWN0IGNsYXNzIGZvciBwYWNrYWdpbmcgTWV0aG9kIEVsZW1lbnRzLiAgQWxsIE1ldGhvZCBFbGVtZW50cyBzaGFsbCBiZSBsb2NhdGVkIGluIGV4YWN0bHkgb25lIG9mIE1ldGhvZCBQYWNrYWdlJ3MgY29uY3JldGUgc3BlY2lhbGl6YXRpb25zIChlLmcuIENvbnRlbnQgUGFja2FnZSkuICAgTWV0aG9kIFBhY2thZ2UgZGVmaW5lcyBjb21tb24gcHJvcGVydGllcyBmb3IgYWxsIG9mIGl0cyBzcGVjaWFsaXphdGlvbnMuIEVsZW1lbnRzIGFyZSBvcmdhbml6ZWQgaW4gTWV0aG9kIFBhY2thZ2VzIHRvIHN0cnVjdHVyZSBsYXJnZSBzY2FsZSBvZiBtZXRob2QgY29udGVudCBhbmQgcHJvY2Vzc2VzIGFzIHdlbGwgYXMgdG8gZGVmaW5lIGEgbWVjaGFuaXNtIGZvciByZXVzZS4gIE1ldGhvZCBFbGVtZW50cyBmcm9tIG9uZSBwYWNrYWdlIGNhbiByZXVzZSBlbGVtZW50IGZyb20gb3RoZXIgcGFja2FnZXMgYnkgZGVmaW5pbmcgYSByZXVzZWRQYWNrYWdlcyBsaW5rLiAgRm9yIGV4YW1wbGUsIGEgd29yayBwcm9kdWN0IGRlZmluZWQgaW4gb25lIHBhY2thZ2UgY2FuIGJlIHVzZWQgYXMgYW4gaW5wdXQgZm9yIFRhc2tzIGRlZmluZWQgaW4gb3RoZXIgcGFja2FnZXMuICBCeSByZXVzaW5nIGl0IGZyb20gb25lIGNvbW1vbiBwbGFjZSAoaS5lLiB0aGUgcGFja2FnZSBpbiB3aGljaCBpdCBoYXMgYmVlbiBkZWZpbmVkKSBlbnN1cmVzIHRoYXQgbm8gcmVkdW5kYW50IGRlZmluaXRpb25zIG9mIHRoZSBzYW1lIGVsZW1lbnRzIGFyZSByZXF1aXJlZC4gIEFsc28gbWFpbnRlbmFuY2Ugb2YgbWV0aG9kIGNvbnRlbnQgaXMgZ3JlYXRseSBpbXByb3ZlZCBhcyBjaGFuZ2VzIGNhbiBiZSBwZXJmb3JtZWQgaW4gb25seSBvbmUgcGxhY2UuICBOb3RlLCB0aGF0IG90aGVyIHBhY2thZ2VzIHdpbGwgaW50cm9kdWNlIG1vcmUgc3BlY2lhbGl6YXRpb25zIG9mIE1ldGhvZCBQYWNrYWdlLCBlLmcuIFByb2Nlc3MgUGFja2FnZSBhbmQgUHJvY2VzcyBDb21wb25lbnQuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Imdsb2JhbCIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIGxvd2VyQm91bmQ9IjEiIGVUeXBlPSIjLy9Cb29sZWFuIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9Ik1ldGhvZCBQYWNrYWdlcyBjYW4gaGF2ZSBhIGdsb2JhbCBzY29wZS4gIFRoaXMgbWVhbnMgdGhhdCBldmVyeSBlbGVtZW50IG9mIGV2ZXJ5IG90aGVyIE1ldGhvZCBQYWNrYWdlIGNhbiBzZWUgdGhlIGdsb2JhbCBwYWNrYWdlJ3MgY29udGVudHMuICBHbG9iYWwgTWV0aG9kIFBhY2thZ2VzIGFyZSBwcmltYXJpbHkgdXNlZCB0byBzdG9yZSBjb21tb25seSB1c2VkIGNhdGVnb3J5IGRlZmluaXRpb25zIHN1Y2ggYXMgZm9yIERpc2NpcGxpbmVzIG9yIERvbWFpbnMsIHdoaWNoIGFyZSB1c2VkIGJ5IG1hbnkgVGFzayBhbmQgV29yayBQcm9kdWN0cyByZXNwZWN0aXZlbHkuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InJldXNlZFBhY2thZ2VzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9NZXRob2RQYWNrYWdlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImNoaWxkUGFja2FnZXMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL01ldGhvZFBhY2thZ2UiIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkNvbnRlbnRQYWNrYWdlIiBlU3VwZXJUeXBlcz0iIy8vTWV0aG9kUGFja2FnZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBDb250ZW50IFBhY2thZ2UgaXMgc3BlY2lhbCBNZXRob2QgUGFja2FnZSB0aGF0IGNvbnRhaW5zIENvbnRlbnQgRWxlbWVudHMgYW5kIENvbnRlbnQgRWxlbWVudHMsIG9ubHkuICBFeGFtcGxlcyBmb3IgQ29udGVudCBFbGVtZW50IGFyZSBBcnRpZmFjdHMsIFRhc2tzLCBSb2xlcywgZXRjLiAgQSBrZXkgc2VwYXJhdGlvbiBvZiBjb25jZXJucyBpbiBVTUEgaXMgdGhlIGRpc3RpbmN0aW9uIGJldHdlZW4gTWV0aG9kIENvbnRlbnQgYW5kIFByb2Nlc3MuICBUaGlzIHNlcGFyYXRpb24gaXMgZW5mb3JjZWQgYnkgc3BlY2lhbCBwYWNrYWdlIHR5cGVzLCB3aGljaCBkbyBub3QgYWxsb3cgdGhlIG1peGluZyBvZiBtZXRob2QgY29udGVudCB3aXRoIHByb2Nlc3Nlcy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iY29udGVudEVsZW1lbnRzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Db250ZW50RWxlbWVudCIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iTWlsZXN0b25lIiBlU3VwZXJUeXBlcz0iIy8vV29ya0JyZWFrZG93bkVsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgTWlsZXN0b25lIGRlc2NyaWJlcyBhIHNpZ25pZmljYW50IGV2ZW50IGluIGEgZGV2ZWxvcG1lbnQgcHJvamVjdCwgc3VjaCBhcyBhIG1ham9yIGRlY2lzaW9uLCBjb21wbGV0aW9uIG9mIGEgZGVsaXZlcmFibGUsIG9yIG1lZXRpbmcgb2YgYSBtYWpvciBkZXBlbmRlbmN5IChsaWtlIGNvbXBsZXRpb24gb2YgYSBwcm9qZWN0IHBoYXNlKS4gIEJlY2F1c2UsIE1pbGVzdG9uZSBpcyBjb21tb25seSB1c2VkIHRvIHJlZmVyIHRvIGJvdGggdGhlIGV2ZW50IGl0c2VsZiBhbmQgdGhlIHBvaW50IGluIHRpbWUgYXQgd2hpY2ggdGhlIGV2ZW50IGlzIHNjaGVkdWxlZCB0byBoYXBwZW4sIGl0IGlzIG1vZGVsZWQgYXMgYSBCcmVha2Rvd24gRWxlbWVudCAoaS5lLiBpdCBhcHBlYXJzIGFzIHBhcnQgb2YgYSBicmVha2Rvd24gc3RydWN0dXJlKS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icmVxdWlyZWRSZXN1bHRzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Xb3JrUHJvZHVjdERlc2NyaXB0b3IiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iV29ya1Byb2R1Y3REZXNjcmlwdG9yIiBlU3VwZXJUeXBlcz0iIy8vRGVzY3JpcHRvciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvciByZXByZXNlbnRzIGEgV29yayBQcm9kdWN0IGluIHRoZSBjb250ZXh0IG9mIG9uZSBzcGVjaWZpYyBBY3Rpdml0eS4gIEV2ZXJ5IGJyZWFrZG93biBzdHJ1Y3R1cmUgY2FuIGRlZmluZSBkaWZmZXJlbnQgcmVsYXRpb25zaGlwcyBvZiBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvcnMgdG8gVGFzayBEZXNjcmlwdG9ycyBhbmQgUm9sZSBEZXNjcmlwdG9ycy4gIFRoZXJlZm9yZSBvbmUgV29yayBQcm9kdWN0IGNhbiBiZSByZXByZXNlbnRlZCBieSBtYW55IFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9ycyBlYWNoIHdpdGhpbiB0aGUgY29udGV4dCBvZiBhbiBBY3Rpdml0eSB3aXRoIGl0cyBvd24gc2V0IG9mIHJlbGF0aW9uc2hpcHMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFjdGl2aXR5RW50cnlTdGF0ZSIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9TdHJpbmciIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkdpdmVuIHRoYXQgYW4gaW5zdGFuY2Ugb2YgV29yayBQcm9kdWN0IERlc2NyaXB0b3IgaGFzIGJlZW4gY3JlYXRlZCBmb3IgYSBzcGVjaWZpYyBBY3Rpdml0eSwgdGhlbiB0aGUgQWN0aXZpdHkgRW50cnkgU3RhdGUgYXR0cmlidXRlIHNwZWNpZmllcyB0aGUgZGVzaXJlZCBzdGF0ZSBvZiBpbnN0YW5jZXMgb2YgdGhlIHJlZmVyZW5jZWQgV29yayBQcm9kdWN0IHdoZW4gd29yayBvbiB0aGUgQWN0aXZpdHkgaXMgaW5pdGlhdGVkIChpLmUuIHdvcmsgb24gdGhlIEFjdGl2aXR5J3MgVGFzayBEZXNjcmlwdG9ycyBpcyBiZWluZyBpbml0aWF0ZWQgdGhhdCB1c2UgdGhpcyBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvciBhcyBpbnB1dCkuICAmI3hBO0ZvciBzb21lIFdvcmsgUHJvZHVjdHMgc3RhdGUgaXMgZXhwcmVzc2VkIGluIHBlcmNlbnRhZ2Ugb2YgY29tcGxldGlvbiwgY29tcGxpYW5jZSB0byB3b3JrIHByb2R1Y3QgY2hlY2tsaXN0LCBpbmZvcm1hbCBzdGF0ZSBkZXNjcmlwdGlvbnMsIGV0Yy4gIE90aGVycyBoYXZlIHZlcnkgc3BlY2lmaWMgc3RhdGVzIGV4cHJlc3NlZCBhcyBlbnVtZXJhdGlvbnMgc3VjaCBhcyBbaWRlbnRpZmllZCwgYnJpZWZseSBkZXNjcmliZWQsIG91dGxpbmVkLCBkZXRhaWxlZF0gZm9yIHVzZSBjYXNlcy4gIE90aGVyIFdvcmsgUHJvZHVjdCBzdGF0ZXMgcmVsYXRlIHRvIHNvbWUgcXVhbGl0eSBtZWFzdXJlcyBvciBsaWZlY3ljbGUgc3RhdGVzIHN1Y2ggYXMgW3Jldmlld2VkLCBpbXBsZW1lbnRlZCwgdGVzdGVkXS4mI3hBOyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhY3Rpdml0eUV4aXRTdGF0ZSIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9TdHJpbmciIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkdpdmVuIHRoYXQgYW4gaW5zdGFuY2Ugb2YgV29yayBQcm9kdWN0IERlc2NyaXB0b3IgaGFzIGJlZW4gY3JlYXRlZCBmb3IgYSBzcGVjaWZpYyBBY3Rpdml0eSwgdGhlbiB0aGUgQWN0aXZpdHkgRXhpc3QgU3RhdGUgYXR0cmlidXRlIHNwZWNpZmllcyB0aGUgZGVzaXJlZCBzdGF0ZSBvZiBpbnN0YW5jZXMgb2YgdGhlIHJlZmVyZW5jZWQgV29yayBQcm9kdWN0IHdoZW4gd29yayBvbiB0aGUgQWN0aXZpdHkgaXMgZmluaXNoZWQgKGkuZS4gd29yayBvbiB0aGUgQWN0aXZpdHkncyBUYXNrIERlc2NyaXB0b3JzIGhhcyBmaW5pc2hlZCB0aGF0IGhhdmUgdGhpcyBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvciBhcyBvdXRwdXQpLiYjeEE7Rm9yIHNvbWUgV29yayBQcm9kdWN0cyBzdGF0ZSBpcyBleHByZXNzZWQgaW4gcGVyY2VudGFnZSBvZiBjb21wbGV0aW9uLCBjb21wbGlhbmNlIHRvIHdvcmsgcHJvZHVjdCBjaGVja2xpc3QsIGluZm9ybWFsIHN0YXRlIGRlc2NyaXB0aW9ucywgZXRjLiAgT3RoZXJzIGhhdmUgdmVyeSBzcGVjaWZpYyBzdGF0ZXMgZXhwcmVzc2VkIGFzIGVudW1lcmF0aW9ucyBzdWNoIGFzIFtpZGVudGlmaWVkLCBicmllZmx5IGRlc2NyaWJlZCwgb3V0bGluZWQsIGRldGFpbGVkXSBmb3IgdXNlIGNhc2VzLiAgT3RoZXIgV29yayBQcm9kdWN0IHN0YXRlcyByZWxhdGUgdG8gc29tZSBxdWFsaXR5IG1lYXN1cmVzIG9yIGxpZmVjeWNsZSBzdGF0ZXMgc3VjaCBhcyBbcmV2aWV3ZWQsIGltcGxlbWVudGVkLCB0ZXN0ZWRdLiYjeEE7Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9IldvcmtQcm9kdWN0IiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL1dvcmtQcm9kdWN0Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImltcGFjdGVkQnkiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1dvcmtQcm9kdWN0RGVzY3JpcHRvciIgZU9wcG9zaXRlPSIjLy9Xb3JrUHJvZHVjdERlc2NyaXB0b3IvaW1wYWN0cyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJpbXBhY3RzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Xb3JrUHJvZHVjdERlc2NyaXB0b3IiIGVPcHBvc2l0ZT0iIy8vV29ya1Byb2R1Y3REZXNjcmlwdG9yL2ltcGFjdGVkQnkiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZGVsaXZlcmFibGVQYXJ0cyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vV29ya1Byb2R1Y3REZXNjcmlwdG9yIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkRlc2NyaXB0b3IiIGFic3RyYWN0PSJ0cnVlIiBlU3VwZXJUeXBlcz0iIy8vQnJlYWtkb3duRWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBEZXNjcmlwdG9yIGlzIGFuIGFic3RyYWN0IGdlbmVyYWxpemF0aW9uIGZvciBzcGVjaWFsIEJyZWFrZG93biBFbGVtZW50cyB0aGF0IHJlZmVyZW5jZXMgb25lIGNvbmNyZXRlIENvbnRlbnQgRWxlbWVudC4gIEEgZGVzY3JpcHRvciBwcm92aWRlcyBhIHJlcHJlc2VudGF0aW9uIG9mIGEgQ29udGVudCBFbGVtZW50IHdpdGhpbiBicmVha2Rvd24gc3RydWN0dXJlcy4gIEluIGFkZGl0aW9uIHRvIGp1c3QgcmVmZXJlbmNpbmcgQ29udGVudCBFbGVtZW50cyBpdCBhbGxvd3Mgb3ZlcnJpZGluZyB0aGUgQ29udGVudCBFbGVtZW50cyBzdHJ1Y3R1cmFsIHJlbGF0aW9uc2hpcHMgYnkgZGVmaW5pbmcgaXRzIG93biBzZXRzIG9mIGFzc29jaWF0aW9ucy4mI3hBO0Rlc2NyaXB0b3JzIGFyZSB0aGUga2V5IGNvbmNlcHQgZm9yIHJlYWxpemluZyB0aGUgc2VwYXJhdGlvbiBvZiBwcm9jZXNzZXMgZnJvbSBtZXRob2QgY29udGVudC4gIEEgRGVzY3JpcHRvciBjYW4gYmUgY2hhcmFjdGVyaXplZCBhcyBhIHJlZmVyZW5jZSBvYmplY3QgZm9yIG9uZSBwYXJ0aWN1bGFyIENvbnRlbnQgRWxlbWVudCwgd2hpY2ggaGFzIGl0cyBvd24gcmVsYXRpb25zaGlwcyBhbmQgcHJvcGVydGllcy4gIFdoZW4gYSBEZXNjcmlwdG9yIGlzIGNyZWF0ZWQgaXQgc2hhbGwgYmUgcHJvdmlkZWQgd2l0aCBjb25ncnVlbnQgY29waWVzIG9mIHRoZSByZWxhdGlvbnNoaXBzIGRlZmluZWQgZm9yIHRoZSByZWZlcmVuY2VkIGNvbnRlbnQgZWxlbWVudC4gIEhvd2V2ZXIsIGEgdXNlciBjYW4gbW9kaWZ5IHRoZXNlIHJlbGF0aW9uc2hpcHMgZm9yIHRoZSBwYXJ0aWN1bGFyIHByb2Nlc3Mgc2l0dWF0aW9uIGZvciB3aGljaCB0aGUgZGVzY3JpcHRvciBoYXMgYmVlbiBjcmVhdGVkLiAmI3hBOyIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpc1N5bmNocm9uaXplZFdpdGhTb3VyY2UiCi0gICAgICAgIG9yZGVyZWQ9ImZhbHNlIiBsb3dlckJvdW5kPSIxIiBlVHlwZT0iIy8vQm9vbGVhbiIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0idHJ1ZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJJdGVyYXRpb24iIGVTdXBlclR5cGVzPSIjLy9BY3Rpdml0eSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iSXRlcmF0aW9uIGlzIGEgc3BlY2lhbCBBY3Rpdml0eSwgd2hpY2ggcHJlc2NyaWJlcyBwcmUtZGVmaW5lZCB2YWx1ZXMgZm9yIGl0cyBpbnN0YW5jZXMgZm9yIHRoZSBhdHRyaWJ1dGVzIHByZWZpeCAoJ0l0ZXJhdGlvbicpIGFuZCBpc1JlcGVhdGFibGUgKCdUcnVlJykuICBJdCBoYXMgYmVlbiBpbmNsdWRlZCBpbnRvIHRoZSBtZXRhLW1vZGVsIGZvciBjb252ZW5pZW5jZSBhbmQgdG8gcHJvdmlkZSBhIHNwZWNpYWwgc3RlcmVvdHlwZSwgYmVjYXVzZSBpdCByZXByZXNlbnRzIGEgdmVyeSBjb21tb25seSB1c2VkIEFjdGl2aXR5IHR5cGUuJiN4QTtJdGVyYXRpb24gZ3JvdXBzIGEgc2V0IG9mIG5lc3RlZCBBY3Rpdml0aWVzIHRoYXQgYXJlIHJlcGVhdGVkIG1vcmUgdGhhbiBvbmNlLiAgSXQgcmVwcmVzZW50cyBhbiBpbXBvcnRhbnQgc3RydWN0dXJpbmcgZWxlbWVudCB0byBvcmdhbml6ZSB3b3JrIGluIHJlcGV0aXRpdmUgY3ljbGVzLiAgVGhlIGNvbmNlcHQgb2YgSXRlcmF0aW9uIGNhbiBiZSBhc3NvY2lhdGVkIHdpdGggZGlmZmVyZW50IHJ1bGVzIGluIGRpZmZlcmVudCBtZXRob2RzLiAgRm9yIGV4YW1wbGUsIHRoZSBJQk0gUmF0aW9uYWwgVW5pZmllZCBQcm9jZXNzIG1ldGhvZCBmcmFtZXdvcmsgKFJVUCkgZGVmaW5lcyBhIHJ1bGUgdGhhdCBJdGVyYXRpb25zIGFyZSBub3QgYWxsb3dlZCB0byBzcGFuIGFjcm9zcyBQaGFzZXMuICBJbiBjb250cmFzdCBJQk0gR2xvYmFsIFNlcnZpY2VzIE1ldGhvZCAoR1NNZXRob2QpIGJhc2VkIG1ldGhvZCBmcmFtZXdvcmtzIHRoaXMgcnVsZSBkb2VzIG5vdCBhcHBseSBhbmQgSXRlcmF0aW9uIGNhbiBiZSBkZWZpbmVkIHdoaWNoIG5lc3QgUGhhc2VzLiAgUnVsZXMgbGlrZSB0aGVzZSwgd2hpY2ggcGxheSBhbiBpbXBvcnRhbnQgcm9sZSBmb3IgZWFjaCBpbmRpdmlkdWFsIG1ldGhvZCBhbmQgYXJlIHRoZXJlZm9yZSBub3QgZW5mb3JjZWQgYnkgdGhpcyBtZXRhLW1vZGVsLiAgSW5zdGVhZCwgcHJvY2VzcyBhdXRob3JzIGFyZSBleHBlY3RlZCB0byBmb2xsb3cgYW5kIGNoZWNrIHRoZXNlIHJ1bGVzIG1hbnVhbGx5LiAgKE5vdGU6IEFueSBCcmVha2Rvd24gRWxlbWVudCBjYW4gYmUgcmVwZWF0ZWQ7IGhvd2V2ZXIsIEl0ZXJhdGlvbnMgaGFzIGJlZW4gaW50cm9kdWNlZCBhcyBhIHNwZWNpYWwgbWV0YS1tb2RlbCBjb25jZXB0LCBiZWNhdXNlIG9mIGl0cyBpbXBvcnRhbnQgcm9sZSBmb3IgbWFueSBtZXRob2RzLikmI3hBOyIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQaGFzZSIgZVN1cGVyVHlwZXM9IiMvL0FjdGl2aXR5Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJQaGFzZSBpcyBhIHNwZWNpYWwgQWN0aXZpdHksIHdoaWNoIHByZXNjcmliZXMgcHJlLWRlZmluZWQgdmFsdWVzIGZvciBpdHMgaW5zdGFuY2VzIGZvciB0aGUgYXR0cmlidXRlcyBwcmVmaXggKCdQaGFzZScpIGFuZCBpc1JlcGVhdGFibGUgKCdGYWxzZScpLiAgSXQgaGFzIGJlZW4gaW5jbHVkZWQgaW50byB0aGUgbWV0YS1tb2RlbCBmb3IgY29udmVuaWVuY2UgYW5kIHRvIHByb3ZpZGUgYSBzcGVjaWFsIHN0ZXJlb3R5cGUsIGJlY2F1c2UgaXQgcmVwcmVzZW50cyBhIHZlcnkgY29tbW9ubHkgdXNlZCBBY3Rpdml0eSB0eXBlLiYjeEE7UGhhc2UgcmVwcmVzZW50IGEgc2lnbmlmaWNhbnQgcGVyaW9kIGluIGEgcHJvamVjdCwgZW5kaW5nIHdpdGggbWFqb3IgbWFuYWdlbWVudCBjaGVja3BvaW50LCBtaWxlc3RvbmUgb3Igc2V0IG9mIERlbGl2ZXJhYmxlcy4gIEl0IGlzIGluY2x1ZGVkIGluIHRoZSBtb2RlbCBhcyBhIHByZWRlZmluZWQgc3BlY2lhbCBBY3Rpdml0eSwgYmVjYXVzZSBvZiBpdHMgc2lnbmlmaWNhbmNlIGluIGRlZmluaW5nIGJyZWFrZG93bnMuJiN4QTsiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iVGVhbVByb2ZpbGUiIGVTdXBlclR5cGVzPSIjLy9CcmVha2Rvd25FbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIFRlYW0gUHJvZmlsZSBpcyBhIEJyZWFrZG93biBFbGVtZW50IHRoYXQgZ3JvdXBzIFJvbGUgRGVzY3JpcHRvcnMgb3IgUmVzb3VyY2UgRGVmaW5pdGlvbnMgZGVmaW5pbmcgYSBuZXN0ZWQgaGllcmFyY2h5IG9mIHRlYW1zIGFuZCB0ZWFtIG1lbWJlcnMuJiN4QTtXb3JrIGFzc2lnbm1lbnRzIGFuZCBXb3JrIFByb2R1Y3QgcmVzcG9uc2liaWxpdGllcyBjYW4gYmUgZGlmZmVyZW50IGZyb20gQWN0aXZpdHkgdG8gQWN0aXZpdHkgaW4gYSBkZXZlbG9wbWVudCBwcm9qZWN0LiBEaWZmZXJlbnQgcGhhc2VzIHJlcXVpcmUgZGlmZmVyZW50IHN0YWZmaW5nIHByb2ZpbGVzLCBpLmUuIGRpZmZlcmVudCBza2lsbHMgYW5kIHJlc291cmNlcyBkb2luZyBkaWZmZXJlbnQgdHlwZXMgb2Ygd29yay4gIFRoZXJlZm9yZSwgYSBwcm9jZXNzIG5lZWRzIHRvIGRlZmluZSBzdWNoIGRpZmZlcmVudCBwcm9maWxlcyBpbiBhIGZsZXhpYmxlIG1hbm5lci4gIFdoZXJlYXMgQ29yZSBNZXRob2QgQ29udGVudCBkZWZpbmVzIHN0YW5kYXJkIHJlc3BvbnNpYmlsaXRpZXMgYW5kIGFzc2lnbm1lbnRzLCBhIHByb2Nlc3MgZXhwcmVzcyBieSBhIGJyZWFrZG93biBzdHJ1Y3R1cmVzIG5lZWRzIHRvIGJlIGFibGUgcmVmaW5lIGFuZCByZWRlZmluZSB0aGVzZSB0aHJvdWdob3V0IGl0cyBkZWZpbml0aW9uLiAgUm9sZSBEZXNjcmlwdG9ycywgUmVzb3VyY2UgRGVmaW5pdGlvbnMsIGFzIHdlbGwgYXMgVGVhbSBQcm9maWxlcyBwcm92aWRlIHRoZSBkYXRhIHN0cnVjdHVyZSBuZWNlc3NhcnkgdG8gYWNoaWV2ZSB0aGlzIGZsZXhpYmlsaXR5IGFuZCB0byBwcm92aWRlIGEgcHJvY2VzcyB1c2VyIHdpdGggdGhlIGNhcGFiaWxpdHkgdG8gZGVmaW5lIGRpZmZlcmVudCB0ZWFtcyBhbmQgcm9sZSByZWxhdGlvbnNoaXBzIGZvciBldmVyeSBBY3Rpdml0eSAoaW5jbHVkaW5nIEFjdGl2aXRpZXMgb24gYW55IG5lc3RpbmctbGV2ZWwgYXMgd2VsbCBhcyBJdGVyYXRpb25zIG9yIFBoYXNlcykuJiN4QTtIZW5jZSwgaW4gYWRkaXRpb24gdG8gdGhlIHdvcmsgYnJlYWtkb3duIGFuZCB3b3JrIHByb2R1Y3QgYnJlYWtkb3duIHN0cnVjdHVyZXMgZGVmaW5lZCBzbyBmYXIsIFRlYW0gUHJvZmlsZXMgYXJlIHVzZWQgdG8gZGVmaW5lIGEgdGhpcmQgdHlwZSBvZiBicmVha2Rvd24gc3RydWN0dXJlOiB0ZWFtIGJyZWFrZG93biBzdHJ1Y3R1cmVzLiAgVGhlc2UgYXJlIGNyZWF0ZWQgYXMgYW4gQWN0aXZpdHkgc3BlY2lmaWMgaGllcmFyY2h5IG9mIFRlYW0gUHJvZmlsZXMgY29tcHJpc2luZyBvZiBSb2xlIERlc2NyaXB0b3JzIGFuZCBSZXNvdXJjZSBEZWZpbml0aW9ucy4gIFRoZXNlIHN0cnVjdHVyZXMgY2FuIGJlIHByZXNlbnRlZCBhcyB3ZWxsLWtub3duIE9yZy1DaGFydHMuICBKdXN0IGFzIHdpdGggYW55IG90aGVyIEJyZWFrZG93biBFbGVtZW50IGFuZCBEZXNjcmlwdG9ycywgVGVhbSBQcm9maWxlcyBjYW4gYmUgZGVmaW5lZCB3aXRoaW4gdGhlIHNjb3BlIG9mIGFueSBBY3Rpdml0eSBpbiBhIGJyZWFrZG93biBzdHJ1Y3R1cmUuICBJbiBvdGhlciB3b3JkcyBldmVyeSBBY3Rpdml0eSBjYW4gZGVmaW5lIGl0cyBvd24gVGVhbSBQcm9maWxlcyBjb25zaXN0aW5nIG9mIEFjdGl2aXR5IHNwZWNpZmljIFJvbGUgRGVzY3JpcHRvcnMgYW5kIFJlc291cmNlIERlZmluaXRpb25zLiAgVHlwaWNhbGx5LCBUZWFtIFByb2ZpbGVzIGFyZSBkZWZpbmVkIG9uIHRoZSBsZXZlbCBvZiBJdGVyYXRpb25zIG9yIFBoYXNlcyBvciBvdGhlciBoaWdoZXItbGV2ZWwgQWN0aXZpdHkuJiN4QTsiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0idGVhbVJvbGVzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Sb2xlRGVzY3JpcHRvciIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJzdXBlclRlYW0iIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICBsb3dlckJvdW5kPSIxIiBlVHlwZT0iIy8vVGVhbVByb2ZpbGUiIGVPcHBvc2l0ZT0iIy8vVGVhbVByb2ZpbGUvc3ViVGVhbSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJzdWJUZWFtIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9UZWFtUHJvZmlsZSIgZU9wcG9zaXRlPSIjLy9UZWFtUHJvZmlsZS9zdXBlclRlYW0iLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUm9sZURlc2NyaXB0b3IiIGVTdXBlclR5cGVzPSIjLy9EZXNjcmlwdG9yIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIFJvbGUgRGVzY3JpcHRvciByZXByZXNlbnRzIGEgUm9sZSBpbiB0aGUgY29udGV4dCBvZiBvbmUgc3BlY2lmaWMgQWN0aXZpdHkuICBFdmVyeSBicmVha2Rvd24gc3RydWN0dXJlIGNhbiBkZWZpbmUgZGlmZmVyZW50IHJlbGF0aW9uc2hpcHMgb2YgUm9sZSBEZXNjcmlwdG9ycyB0byBUYXNrIERlc2NyaXB0b3JzIGFuZCBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvcnMuICBUaGVyZWZvcmUgb25lIFJvbGUgY2FuIGJlIHJlcHJlc2VudGVkIGJ5IG1hbnkgUm9sZSBEZXNjcmlwdG9ycyBlYWNoIHdpdGhpbiB0aGUgY29udGV4dCBvZiBhbiBBY3Rpdml0eSB3aXRoIGl0cyBvd24gc2V0IG9mIHJlbGF0aW9uc2hpcHMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9IlJvbGUiIG9yZGVyZWQ9ImZhbHNlIiBlVHlwZT0iIy8vUm9sZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJtb2RpZmllcyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vV29ya1Byb2R1Y3REZXNjcmlwdG9yIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJyZXNwb25zaWJsZUZvciIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vV29ya1Byb2R1Y3REZXNjcmlwdG9yIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlRhc2tEZXNjcmlwdG9yIiBlU3VwZXJUeXBlcz0iIy8vV29ya0JyZWFrZG93bkVsZW1lbnQgIy8vRGVzY3JpcHRvciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBUYXNrIERlc2NyaXB0b3IgaXMgYSBEZXNjcmlwdG9yIGFuZCBXb3JrIEJyZWFrZG93biBFbGVtZW50IHRoYXQgcmVwcmVzZW50cyBhIHByb3h5IGZvciBhIFRhc2sgaW4gdGhlIGNvbnRleHQgb2Ygb25lIHNwZWNpZmljIEFjdGl2aXR5LiAgRXZlcnkgYnJlYWtkb3duIHN0cnVjdHVyZSBjYW4gZGVmaW5lIGRpZmZlcmVudCByZWxhdGlvbnNoaXBzIG9mIFRhc2sgRGVzY3JpcHRvcnMgdG8gV29yayBQcm9kdWN0IERlc2NyaXB0b3JzIGFuZCBSb2xlIERlc2NyaXB0b3JzLiBUaGVyZWZvcmUgb25lIFRhc2sgY2FuIGJlIHJlcHJlc2VudGVkIGJ5IG1hbnkgVGFzayBEZXNjcmlwdG9ycyBlYWNoIHdpdGhpbiB0aGUgY29udGV4dCBvZiBhbiBBY3Rpdml0eSB3aXRoIGl0cyBvd24gc2V0IG9mIHJlbGF0aW9uc2hpcHMuJiN4QTtBIGtleSBkaWZmZXJlbmNlIGJldHdlZW4gTWV0aG9kIENvbnRlbnQgYW5kIFByb2Nlc3MgaXMgdGhhdCBhIENvbnRlbnQgRWxlbWVudCBzdWNoIGFzIFRhc2sgZGVzY3JpYmVzIGFsbCBhc3BlY3RzIG9mIGRvaW5nIHdvcmsgZGVmaW5lZCBhcm91bmQgdGhpcyBUYXNrLiAgVGhpcyBkZXNjcmlwdGlvbiBpcyBtYW5hZ2VkIGluIHN0ZXBzLCB3aGljaCBhcmUgbW9kZWxlZCBhcyBTZWN0aW9ucyBvZiB0aGUgVGFza3MnIENvbnRlbnQgRGVzY3JpcHRpb25zLiAgV2hlbiBhcHBseWluZyBhIFRhc2sgaW4gYSBQcm9jZXNzJyBBY3Rpdml0eSB3aXRoIGEgVGFzayBEZXNjcmlwdG9yIGEgUHJvY2VzcyBFbmdpbmVlciBuZWVkcyB0byBpbmRpY2F0ZSB0aGF0IGF0IHRoYXQgcGFydGljdWxhciBwb2ludCBpbiB0aW1lIGluIHRoZSBQcm9jZXNzIGRlZmluaXRpb24gZm9yIHdoaWNoIHRoZSBUYXNrIERlc2NyaXB0b3IgaGFzIGJlZW4gY3JlYXRlZCwgb25seSBhIHN1YnNldCBvZiBzdGVwcyBzaGFsbCBiZSBwZXJmb3JtZWQuICBIZSBkZWZpbmVzIHRoaXMgc2VsZWN0aW9uIHVzaW5nIHRoZSBzZWxlY3RlZFN0ZXBzIGFzc29jaWF0aW9uLiAgSWYgaGUgd2FudHMgdG8gYWRkIHN0ZXBzIHRvIGEgVGFzayBEZXNjcmlwdG9yLCBoZSBjYW4gZGVzY3JpYmUgdGhlc2UgZWl0aGVyIHByYWdtYXRpY2FsbHkgaW4gdGhlIHJlZmluZWREZXNjcmlwdGlvbiBhdHRyaWJ1dGUgb3IgJ3Byb3Blcmx5JyBjcmVhdGUgYSBjb250cmlidXRpbmcgVGFzayB0byB0aGUgVGFzayB0aGUgVGFzayBEZXNjcmlwdG9yIHJlZmVycyB0by4mI3hBOyYjeEE7Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9IlRhc2siIG9yZGVyZWQ9ImZhbHNlIiBlVHlwZT0iIy8vVGFzayIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJhZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSIKLSAgICAgICAgb3JkZXJlZD0iZmFsc2UiIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vUm9sZURlc2NyaXB0b3IiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iYXNzaXN0ZWRCeSIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vUm9sZURlc2NyaXB0b3IiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZXh0ZXJuYWxJbnB1dCIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vV29ya1Byb2R1Y3REZXNjcmlwdG9yIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im1hbmRhdG9yeUlucHV0IiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Xb3JrUHJvZHVjdERlc2NyaXB0b3IiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ib3B0aW9uYWxJbnB1dCIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vV29ya1Byb2R1Y3REZXNjcmlwdG9yIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im91dHB1dCIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vV29ya1Byb2R1Y3REZXNjcmlwdG9yIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InBlcmZvcm1lZFByaW1hcmlseUJ5IiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Sb2xlRGVzY3JpcHRvciIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJzZWxlY3RlZFN0ZXBzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9TZWN0aW9uIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkNvbXBvc2l0ZVJvbGUiIGVTdXBlclR5cGVzPSIjLy9Sb2xlRGVzY3JpcHRvciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBDb21wb3NpdGUgUm9sZSBpcyBhIHNwZWNpYWwgUm9sZSBEZXNjcmlwdG9yIHRoYXQgcmVsYXRlcyB0byBtb3JlIHRoZW4gb25lIFJvbGUuICBJdCByZXByZXNlbnRzIGEgZ3JvdXBpbmcgb2YgUm9sZXMgd2l0aCB0aGUgbWFpbiBwdXJwb3NlIG9mIHNpbXBsaWZpY2F0aW9uLCBpLmUuIHJlZHVjaW5nIHRoZSBudW1iZXIgb2Ygcm9sZXMgZm9yIGEgcHJvY2Vzcy4mI3hBO0EgQ29tcG9zaXRlIFJvbGUgaXMgYSBncm91cGluZyBvZiBSb2xlcyB0aGF0IGNhbiBiZSB1c2VkIGluIGFuIEFjdGl2aXR5IG9yIFByb2Nlc3MgdG8gcmVkdWNlIHRoZSBudW1iZXIgb2YgUm9sZXMuICBBIHR5cGljYWwgYXBwbGljYXRpb24gd291bGQgYmUgYSBwcm9jZXNzIGZvciBhIHNtYWxsIHRlYW0gaW4gd2hpY2ggYSBzdGFuZGFyZCBzZXQgb2Ygcm9sZXMgZnJvbSB0aGUgbWV0aG9kIGNvbnRlbnQgd291bGQgYmUgYWxsIHBlcmZvcm1lZCBieSBvbmUgb3IgbW9yZSByZXNvdXJjZS4gIEJ5IHVzaW5nIENvbXBvc2l0ZSBSb2xlIHRoZSBwcm9jZXNzIHdvdWxkIHN1Z2dlc3QgYSB0eXBpY2FsIGNsdXN0ZXJpbmcgb2YgUm9sZXMgdG8gUmVzb3VyY2VzLiAgQSBDb21wb3NpdGUgUm9sZSBjb3VsZCBwZXJmb3JtIGFsbCBUYXNrcyBkZWZpbmVkIGZvciB0aGUgUm9sZXMgaXQgcmVmZXJzIHRvLiYjeEE7Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImFnZ3JlZ2F0ZWRSb2xlcyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vUm9sZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJEZWxpdmVyeVByb2Nlc3MiIGVTdXBlclR5cGVzPSIjLy9Qcm9jZXNzIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIERlbGl2ZXJ5IFByb2Nlc3NlcyBpcyBhIHNwZWNpYWwgUHJvY2VzcyBkZXNjcmliaW5nIGEgY29tcGxldGUgYW5kIGludGVncmF0ZWQgYXBwcm9hY2ggZm9yIHBlcmZvcm1pbmcgYSBzcGVjaWZpYyBwcm9qZWN0IHR5cGUuICBJdCBkZXNjcmliZXMgYSBjb21wbGV0ZSBwcm9qZWN0IGxpZmVjeWNsZSBlbmQtdG8tZW5kIGFuZCBzaGFsbCBiZSB1c2VkIGFzIGEgcmVmZXJlbmNlIGZvciBydW5uaW5nIHByb2plY3RzIHdpdGggc2ltaWxhciBjaGFyYWN0ZXJpc3RpY3MgYXMgZGVmaW5lZCBmb3IgdGhlIHByb2Nlc3MuICBBIERlbGl2ZXJ5IFByb2Nlc3MgaXMgcmVsYXRlZCB0byBzcGVjaWZpYyBzdXBwb3J0aW5nIGluZm9ybWF0aW9uIHN1Y2ggYXMgUm9hZG1hcHMgKGluaGVyaXRlZCB2aWEgQWN0aXZpdHkpIGFzIHdlbGwgYXMgQ29tbXVuaWNhdGlvbnMgYW5kIEVkdWNhdGlvbiBNYXRlcmlhbC4mI3hBO0EgRGVsaXZlcnkgUHJvY2VzcyBpcyBhIFByb2Nlc3MgdGhhdCBjb3ZlcnMgYSB3aG9sZSBkZXZlbG9wbWVudCBsaWZlY3ljbGUgZnJvbSBiZWdpbm5pbmcgdG8gZW5kLiAgQSBEZWxpdmVyeSBQcm9jZXNzIHNoYWxsIGJlIHVzZWQgYXMgYSB0ZW1wbGF0ZSBmb3IgcGxhbm5pbmcgYW5kIHJ1bm5pbmcgYSBwcm9qZWN0LiAgSXQgcHJvdmlkZXMgYSBjb21wbGV0ZSBsaWZlY3ljbGUgbW9kZWwgd2l0aCBwcmVkZWZpbmVkIHBoYXNlcywgaXRlcmF0aW9ucywgYW5kIGFjdGl2aXRpZXMgdGhhdCBoYXZlIGJlZW4gZGV0YWlsZWQgYnkgc2VxdWVuY2luZyByZWZlcmVuY2luZyBtZXRob2QgY29udGVudCBpbiBicmVha2Rvd24gc3RydWN0dXJlcy4gIEl0IGlzIGRlZmluZWQgb24gdGhlIGJhc2lzIG9mIGV4cGVyaWVuY2Ugd2l0aCBwYXN0IHByb2plY3RzIG9yIGVuZ2FnZW1lbnRzLCBhbmQvb3IgdGhlIGJlc3QgcHJhY3RpY2UgdXNlIG9mIGEgZGV2ZWxvcG1lbnQgb3IgZGVsaXZlcnkgYXBwcm9hY2guICBJdCBkZWZpbmVzIHdoYXQgZ2V0cyBwcm9kdWNlZCwgaG93IHRob3NlIGl0ZW1zIGFyZSBwcm9kdWNlZCwgYW5kIHRoZSByZXF1aXJlZCBzdGFmZmluZyBpbiB0aGUgZm9ybSBvZiBpbnRlZ3JhdGVkIFdvcmssIFdvcmsgUHJvZHVjdCwgYW5kIFRlYW0gQnJlYWtkb3duIFN0cnVjdHVyZXMuICBGb3IgZXhhbXBsZSwgYSBwcm9jZXNzIGVuZ2luZWVyIGNhbiBkZWZpbmUgYWx0ZXJuYXRpdmUgRGVsaXZlcnkgUHJvY2Vzc2VzIGZvciBzb2Z0d2FyZSBkZXZlbG9wbWVudCBwcm9qZWN0cyB0aGF0IGRpZmZlciBpbiB0aGUgc2NhbGUgb2YgdGhlIGVuZ2FnZW1lbnQgYW5kIHN0YWZmaW5nIG5lY2Vzc2FyeSwgdGhlIHR5cGUgb2YgdGhlIHNvZnR3YXJlIGFwcGxpY2F0aW9uIHRvIGJlIGRldmVsb3BlZCwgdGhlIGRldmVsb3BtZW50IG1ldGhvZHMgYW5kIHRlY2hub2xvZ2llcyB0byBiZSB1c2VkLCBldGMuICBBbHRob3VnaCwgdGhlIERlbGl2ZXJ5IFByb2Nlc3MgYWltcyB0byBjb3ZlciBhIHdob2xlIHByb2plY3QgaXQga2VlcHMgY2VydGFpbiBkZWNpc2lvbiB0aGF0IGFyZSB0b28gcHJvamVjdCBzcGVjaWZpYyBvcGVuLiAgRm9yIGV4YW1wbGUsIHRoZSBicmVha2Rvd24gc3RydWN0dXJlIGRlZmluZXMgd2hpY2ggQnJlYWtkb3duIEVsZW1lbnRzIGhhdmUgbXVsdGlwbGUgb2NjdXJyZW5jZXMgb3IgaXMgcmVwZWF0YWJsZSB2aWEgaXQgcmVzcGVjdGl2ZSBhdHRyaWJ1dGVzLCBidXQgZG9lcyBub3Qgc2F5IGhvdyBtYW55IG9jY3VycmVuY2VzIGFuZCBob3cgbWFueSByZXBlYXRzL2l0ZXJhdGlvbnMgaXQgd2lsbCBoYXZlLiAgVGhlc2UgZGVjaXNpb25zIGhhdmUgdG8gYmUgZG9uZSBieSBhIHByb2plY3QgbWFuYWdlciB3aGVuIHBsYW5uaW5nIGEgY29uY3JldGUgcHJvamVjdCwgcHJvamVjdCBwaGFzZSwgb3IgcHJvamVjdCBpdGVyYXRpb25zLiAgQSBEZWxpdmVyeSBQcm9jZXNzIGlzIGFsd2F5cyBhIGNvbXBsZXRlIGRlc2NyaXB0aW9uIG9mIGEgcHJvY2VzcyBpbiB0ZXJtcyBvZiBjb21wbGV0ZW5lc3Mgb2YgdGhlIGxpZmVjeWNsZSwgYXMgd2VsbCBhcyBpbiB0ZXJtcyBvZiBhbGwgdGhyZWUgdmlld3Mgb24gdGhlIHByb2Nlc3Mgd2hpY2ggYXJlIHRoZSBXb3JrIEJyZWFrZG93biBTdHJ1Y3R1cmUsIFdvcmsgUHJvZHVjdCBCcmVha2Rvd24gU3RydWN0dXJlLCBhbmQgVGVhbSBCcmVha2Rvd24gU3RydWN0dXJlIGhhdmUgdG8gYmUgZnVsbHkgYW5kIGNvbnNpc3RlbnRseSBwb3B1bGF0ZWQuICBDb25zaXN0ZW5jeSBvZiBhIERlbGl2ZXJ5IFByb2Nlc3MgaXMgYWN0dWFsbHkgZW5zdXJlZCBieSB0aGUgZmFjdCB0aGF0IGFsbCB0aHJlZSBicmVha2Rvd25zIGFyZSByZXByZXNlbnRlZCBieSBvbmUgc2luZ2xlIGRhdGEgc3RydWN0dXJlIGFuZCBvbmUgcGFydGljdWxhciBicmVha2Rvd24gc3VjaCBhcyBUZWFtIEJyZWFrZG93biBpcyBqdXN0IGEgdmlldyBvbiB0aGF0IGRhdGEgc3RydWN0dXJlLiYjeEE7Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImVkdWNhdGlvbk1hdGVyaWFscyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vU3VwcG9ydGluZ01hdGVyaWFsIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImNvbW11bmljYXRpb25zTWF0ZXJpYWxzIgotICAgICAgICBvcmRlcmVkPSJmYWxzZSIgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9TdXBwb3J0aW5nTWF0ZXJpYWwiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUHJvY2VzcyIgYWJzdHJhY3Q9InRydWUiIGVTdXBlclR5cGVzPSIjLy9BY3Rpdml0eSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBQcm9jZXNzIGlzIGEgc3BlY2lhbCBBY3Rpdml0eSB0aGF0IGRlc2NyaWJlcyBhIHN0cnVjdHVyZSBmb3IgcGFydGljdWxhciB0eXBlcyBvZiBkZXZlbG9wbWVudCBwcm9qZWN0cy4gIFRvIHBlcmZvcm0gc3VjaCBhIGRldmVsb3BtZW50IHByb2plY3QgYSBQcm9jZXNzZXMgd291bGQgYmUgJ2luc3RhbnRpYXRlZCcgYW5kIGFkYXB0ZWQgZm9yIHRoZSBzcGVjaWZpYyBzaXR1YXRpb24uICBQcm9jZXNzIGlzIGFuIGFic3RyYWN0IGNsYXNzIGFuZCB0aGlzIG1ldGEtbW9kZWwgZGVmaW5lcyBkaWZmZXJlbnQgc3BlY2lhbCB0eXBlcyBvZiBQcm9jZXNzZXMgZm9yIGRpZmZlcmVudCBwcm9jZXNzIG1hbmFnZW1lbnQgYXBwbGljYXRpb25zIGFuZCBkaWZmZXJlbnQgc2l0dWF0aW9ucyBvZiBwcm9jZXNzIHJldXNlLiAgRXZlcnkgUHJvY2VzcyBjb21wcmlzZXMgb2YgYW5kIGlzIHRoZSB0b3AtbGV2ZWwgZWxlbWVudCBvZiBhbiBuLWxldmVsIGJyZWFrZG93biBzdHJ1Y3R1cmUgdXNpbmcgdGhlIE5lc3RpbmcgYXNzb2NpYXRpb24gZGVmaW5lZCBvbiBBY3Rpdml0eS4mI3hBO0NvcmUgTWV0aG9kIENvbnRlbnQgcHJvdmlkZXMgc3RlcC1ieS1zdGVwIGV4cGxhbmF0aW9ucywgZGVzY3JpYmluZyBob3cgdmVyeSBzcGVjaWZpYyBkZXZlbG9wbWVudCBnb2FscyBhcmUgYWNoaWV2ZWQgaW5kZXBlbmRlbnQgb2YgdGhlIHBsYWNlbWVudCBvZiB0aGVzZSBzdGVwcyB3aXRoaW4gYSBkZXZlbG9wbWVudCBsaWZlY3ljbGUuICBQcm9jZXNzZXMgdGFrZSB0aGVzZSBtZXRob2QgZWxlbWVudHMgYW5kIHJlbGF0ZSB0aGVtIGludG8gc2VtaS1vcmRlcmVkIHNlcXVlbmNlcyB0aGF0IGFyZSBjdXN0b21pemVkIHRvIHNwZWNpZmljIHR5cGVzIG9mIHByb2plY3RzLiAgVGh1cywgYSBwcm9jZXNzIGlzIGEgc2V0IG9mIHBhcnRpYWxseSBvcmRlcmVkIHdvcmsgZGVzY3JpcHRpb25zIGludGVuZGVkIHRvIHJlYWNoIGEgaGlnaGVyIGRldmVsb3BtZW50IGdvYWwsIHN1Y2ggYXMgdGhlIHJlbGVhc2Ugb2YgYSBzcGVjaWZpYyBzb2Z0d2FyZSBzeXN0ZW0uICBBIHByb2Nlc3MgYW5kIHRoZSBwcm9jZXNzIG1ldGEtbW9kZWwgc3RydWN0dXJlIGRlZmluZWQgaW4gdGhpcyBzcGVjaWZpY2F0aW9uIGZvY3VzZXMgb24gdGhlIGxpZmVjeWNsZSBhbmQgdGhlIHNlcXVlbmNpbmcgb2Ygd29yayBpbiBicmVha2Rvd24gc3RydWN0dXJlcy4gIFRvIGFjaGlldmUgdGhpcyBpdCB1c2VzIHRoZSBEZXNjcmlwdG9yIGNvbmNlcHQgcmVmZXJlbmNpbmcgbWV0aG9kIGNvbnRlbnQgYW5kIGFsbG93aW5nIGRlZmluaW5nIHRpbWUtc3BlY2lmaWMgY3VzdG9taXphdGlvbnMgb2YgdGhlIHJlZmVyZW5jZWQgY29udGVudCAoZS5nLiBkZWZpbmluZyBhIGZvY3VzIG9uIGRpZmZlcmVudCBzdGVwcyBvZiB0aGUgc2FtZSBUYXNrIGFuZCBwcm92aWRpbmcgaW5wdXQgV29yayBQcm9kdWN0cyBpbiBkaWZmZXJlbnQgc3RhdGVzIHdpdGhpbiB0aGUgZGlmZmVyZW50IFBoYXNlcyBvZiBhIHByb2Nlc3MgbGlmZWN5Y2xlIGluIHdoaWNoIHRoZSBzYW1lIFRhc2sgaXMgcGVyZm9ybWVkKS4mI3hBOyYjeEQ7JiN4QTtQcm9jZXNzIGluIHRoZSBwYWNrYWdlIExpYnJhcnkgQ29uZmlndXJhdGlvbiBleHRlbmRzIHRoZSBjbGFzcyBQcm9jZXNzIHdpdGggYXNzb2NpYXRpb24gcmVsYXRpbmcgYSBQcm9jZXNzIHRvIG9uZSBkZWZhdWx0IGFuZCBtYW55IG9wdGlvbmFsIHZhbGlkIENvbmZpZ3VyYXRpb25zLiYjeEE7VGhlc2UgY29uZmlndXJhdGlvbnMgZGVzY3JpYmUgdmFsaWQgY29udGV4dHMgZm9yIHRoZSBQcm9jZXNzIHdpdGhpbiBhIE1ldGhvZCBMaWJyYXJ5IGluZGljYXRpbmcgdW5kZXIgd2hpY2ggQ29uZmlndXJhdGlvbnMgYSBQcm9jZXNzIGlzIHdlbGwgZGVmaW5lZC4mI3hBOyIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJpbmNsdWRlc1BhdHRlcm5zIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9DYXBhYmlsaXR5UGF0dGVybiIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJkZWZhdWx0Q29udGV4dCIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIGxvd2VyQm91bmQ9IjEiIGVUeXBlPSIjLy9NZXRob2RDb25maWd1cmF0aW9uIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InZhbGlkQ29udGV4dCIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vTWV0aG9kQ29uZmlndXJhdGlvbiIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJDYXBhYmlsaXR5UGF0dGVybiIgZVN1cGVyVHlwZXM9IiMvL1Byb2Nlc3MiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgQ2FwYWJpbGl0eSBQYXR0ZXJuIGlzIGEgc3BlY2lhbCBQcm9jZXNzIHRoYXQgZGVzY3JpYmVzIGEgcmV1c2FibGUgY2x1c3RlciBvZiBkb2luZyB3b3JrIGluIGNvbW1vbiBwcm9jZXNzIGFyZWFzLiAgQ2FwYWJpbGl0aWVzIFBhdHRlcm5zIGV4cHJlc3MgYW5kIGNvbW11bmljYXRlIHByb2Nlc3Mga25vd2xlZGdlIGZvciBhIGtleSBhcmVhIG9mIGludGVyZXN0IHN1Y2ggYXMgYSBEaXNjaXBsaW5lIGFuZCBjYW4gYmUgZGlyZWN0bHkgdXNlZCBieSBwcm9jZXNzIHByYWN0aXRpb25lciB0byBndWlkZSBoaXMgd29yay4gIFRoZXkgYXJlIGFsc28gdXNlZCBhcyBidWlsZGluZyBibG9ja3MgdG8gYXNzZW1ibGUgRGVsaXZlcnkgUHJvY2Vzc2VzIG9yIGxhcmdlciBDYXBhYmlsaXR5IFBhdHRlcm5zIGVuc3VyaW5nIG9wdGltYWwgcmV1c2UgYW5kIGFwcGxpY2F0aW9uIG9mIHRoZSBrZXkgcHJhY3RpY2VzIHRoZXkgZXhwcmVzcy4mI3hBO0EgQ2FwYWJpbGl0eSBQYXR0ZXJuIGlzIGEgc3BlY2lhbCBQcm9jZXNzIHRoYXQgZGVzY3JpYmVzIGEgcmV1c2FibGUgY2x1c3RlciBvZiBkb2luZyB3b3JrIGluIGEgZ2VuZXJhbCBwcm9jZXNzIGFyZWEgdGhhdCBwcm92aWRlcyBhIGNvbnNpc3RlbnQgZGV2ZWxvcG1lbnQgYXBwcm9hY2ggdG8gY29tbW9uIHByb2JsZW1zLiAgRXhhbXBsZXMgZm9yIENhcGFiaWxpdHkgUGF0dGVybiBjb3VsZCBiZSAndXNlIGNhc2UtYmFzZWQgcmVxdWlyZW1lbnRzIG1hbmFnZW1lbnQnLCAndXNlIGNhc2UgYW5hbHlzaXMnLCBvciAndW5pdCB0ZXN0aW5nJy4gVHlwaWNhbGx5IGJ1dCBub3QgbmVjZXNzYXJpbHksIENhcGFiaWxpdHkgUGF0dGVybnMgaGF2ZSB0aGUgc2NvcGUgb2Ygb25lIGRpc2NpcGxpbmUgcHJvdmlkaW5nIGEgYnJlYWtkb3duIG9mIHJldXNhYmxlIGNvbXBsZXggQWN0aXZpdGllcywgcmVsYXRpb25zaGlwcyB0byB0aGUgUm9sZXMgd2hpY2ggcGVyZm9ybSBUYXNrcyB3aXRoaW4gdGhlc2UgQWN0aXZpdGllcywgYXMgd2VsbCBhcyB0byB0aGUgV29yayBQcm9kdWN0cyB0aGF0IGFyZSB1c2VkIGFuZCBwcm9kdWNlZC4gIEEgY2FwYWJpbGl0eSBwYXR0ZXJuIGRvZXMgbm90IHJlbGF0ZSB0byBhbnkgc3BlY2lmaWMgcGhhc2Ugb3IgaXRlcmF0aW9uIG9mIGEgZGV2ZWxvcG1lbnQgbGlmZWN5Y2xlLCBhbmQgc2hvdWxkIG5vdCBpbXBseSBhbnkuICBJbiBvdGhlciB3b3JkcywgYSBwYXR0ZXJuIHNob3VsZCBiZSBkZXNpZ25lZCBpbiBhIHdheSB0aGF0IGl0IGlzIGFwcGxpY2FibGUgYW55d2hlcmUgaW4gYSBEZWxpdmVyeSBQcm9jZXNzLiAgVGhpcyBlbmFibGVzIGl0cyBBY3Rpdml0aWVzIHRvIGJlIGZsZXhpYmx5IGFzc2lnbmVkIHRvIHdoYXRldmVyIHBoYXNlcyB0aGVyZSBhcmUgaW4gdGhlIERlbGl2ZXJ5IFByb2Nlc3MgdG8gd2hpY2ggaXQgaXMgYmVpbmcgYXBwbGllZC4gIEl0IGlzIGEgZ29vZCBwcmFjdGljZSB0byBkZXNpZ24gYSBDYXBhYmlsaXR5IFBhdHRlcm4gdG8gcHJvZHVjZSBvbmUgb3IgbW9yZSBnZW5lcmljIERlbGl2ZXJhYmxlcy4gIFRoZSB0eXBpY2FsIGNvbmZpZ3VyYXRpb24gaXMgdGhhdCBlYWNoIEFjdGl2aXR5IGluIHRoZSBDYXBhYmlsaXR5IFBhdHRlcm4gcHJvZHVjZXMgb25lIERlbGl2ZXJhYmxlLCBhbmQgdGhlIGxhc3QgVGFzayBEZXNjcmlwdG9yIGluIHRoZSBBY3Rpdml0eSBleHBsaWNpdGx5IG91dHB1dHMganVzdCB0aGlzIERlbGl2ZXJhYmxlLiAgVGhpcyBlbmFibGVzIHRoZSBwcm9jZXNzIGVuZ2luZWVyIHRvIHNlbGVjdCBQYXR0ZXJucyBvciBqdXN0IEFjdGl2aXRpZXMgYnkgZGVjaWRpbmcgd2hpY2ggRGVsaXZlcmFibGVzIGFyZSByZXF1aXJlZC4gIEl0IGFsc28gb2ZmZXJzIGEgc2ltcGxlIGludGVncmF0aW9uIGFwcHJvYWNoOiBhbiBBY3Rpdml0eSBmcm9tIGEgY2FwYWJpbGl0eSBwYXR0ZXJuIGlzIGxpbmtlZCB0byB0aGUgUGhhc2Ugb3IgSXRlcmF0aW9uIHdoaWNoIGlzIHJlcXVpcmVkIHRvIHByb2R1Y2UgdGhlIEFjdGl2aXR5J3MgRGVsaXZlcmFibGUuICBLZXkgYXBwbGljYXRpb25zIGFyZWFzIG9mIC8gYXJlYXMgb2YgcmV1c2UgZm9yIENhcGFiaWxpdHkgUGF0dGVybnMgYXJlOiYjeEE7LSBUbyBzZXJ2ZSBhcyBidWlsZGluZyBibG9ja3MgZm9yIGFzc2VtYmxpbmcgRGVsaXZlcnkgUHJvY2Vzc2VzIG9yIGxhcmdlciBDYXBhYmlsaXR5IFBhdHRlcm5zLiAgTm9ybWFsbHkgZGV2ZWxvcGluZyBhIERlbGl2ZXJ5IFByb2Nlc3MgaXMgbm90IGRvbmUgZnJvbSBzY3JhdGNoIGJ1dCBieSBzeXN0ZW1hdGljYWxseSBhcHBseWluZyBhbmQgYmluZGluZyBwYXR0ZXJucy4gIEluIGFkZGl0aW9uIHRvIHRoZSBzdGFuZGFyZCBwYXR0ZXJuIGFwcGxpY2F0aW9uIG9mICdjb3B5LWFuZC1tb2RpZnknLCB3aGljaCBhbGxvd3MgdGhlIHByb2Nlc3MgZW5naW5lZXIgdG8gaW5kaXZpZHVhbGx5IGN1c3RvbWl6ZSB0aGUgcGF0dGVybidzIGNvbnRlbnQgdG8gdGhlIHBhcnRpY3VsYXIgc2l0dWF0aW9uIGl0IGlzIGFwcGxpZWQgZm9yLCB0aGUgUGx1Z2luIG1ldGEtbW9kZWwgcGFja2FnZSAoU2VjdGlvbiA2LjEpIGludHJvZHVjZXMgZXZlbiBtb3JlIHNvcGhpc3RpY2F0ZWQgaW5oZXJpdGFuY2UgcmVsYXRpb25zaGlwcyB0aGF0IHN1cHBvcnQgZHluYW1pYyBiaW5kaW5nIG9mIHBhdHRlcm5zIChpLmUuIHRoZSBwYXR0ZXJuIGlzIHJlZmVyZW5jZWQgYW5kIG5vdCBjb3BpZWQpLiAgVGhpcyB1bmlxdWUgbmV3IHdheSBvZiByZXVzaW5nIHByb2Nlc3Mga25vd2xlZGdlIGFsbG93cyB0byBmYWN0b3Igb3V0IGNvbW1vbmx5IHJlb2NjdXJyaW5nIEFjdGl2aXRpZXMgaW50byBwYXR0ZXJucyBhbmQgdG8gYXBwbHkgdGhlbSBvdmVyIGFuZCBvdmVyIGFnYWluIGZvciBhIHByb2Nlc3MuICBXaGVuIHRoZSBwYXR0ZXJuIGlzIGJlaW5nIHJldmlzZWQgb3IgdXBkYXRlZCwgYWxsIGNoYW5nZXMgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IHJlZmxlY3RlZCBpbiBhbGwgcGF0dGVybiBhcHBsaWNhdGlvbiBpbiBhbGwgcHJvY2Vzc2VzIGJlY2F1c2Ugb2YgdGhlIGR5bmFtaWMgYmluZGluZy4mI3hBOy0gVG8gc3VwcG9ydCBkaXJlY3QgZXhlY3V0aW9uIGluIGEgZGV2ZWxvcG1lbnQgcHJvamVjdCB0aGF0IGRvZXMgbm90IHdvcmsgZm9sbG93aW5nIGEgd2VsbC1kZWZpbmVkIHByb2Nlc3MsIGJ1dCB3b3JrcyBiYXNlZCBvbiBsb29zZWx5IGNvbm5lY3RlZCBwcm9jZXNzIGZyYWdtZW50cyBvZiBiZXN0IHByYWN0aWNlcyBpbiBhIGZsZXhpYmxlIG1hbm5lciAoZS5nLiBBZ2lsZSBEZXZlbG9wbWVudCkuJiN4QTstIFRvIHN1cHBvcnQgcHJvY2VzcyBlZHVjYXRpb24gYnkgZGVzY3JpYmluZyBrbm93bGVkZ2UgZm9yIGEga2V5IGFyZWEgc3VjaCBhcyBiZXN0IHByYWN0aWNlcyBvbiBob3cgdG8gcGVyZm9ybSB0aGUgd29yayBmb3IgYSBEaXNjaXBsaW5lIChlLmcuIFJlcXVpcmVtZW50cyBNYW5hZ2VtZW50KSwgZm9yIGEgc3BlY2lmaWMgZGV2ZWxvcG1lbnQgdGVjaG5pcXVlIChhc3BlY3Qtb3JpZW50ZWQgZGV2ZWxvcG1lbnQpLCBvciBhIHNwZWNpZmljIHRlY2huaWNhbCBhcmVhIChlLmcuIHJlbGF0aW9uYWwgZGF0YWJhc2UgZGVzaWduKSwgd2hpY2ggaXMgdXNlZCBmb3IgZWR1Y2F0aW9uIGFuZCB0ZWFjaGluZy4mI3hBOyIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJNZXRob2RDb25maWd1cmF0aW9uIiBlU3VwZXJUeXBlcz0iIy8vTWV0aG9kVW5pdCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBNZXRob2QgQ29uZmlndXJhdGlvbiBpcyBhIGNvbGxlY3Rpb24gb2Ygc2VsZWN0ZWQgTWV0aG9kIE1vZGVscyBhbmQgTWV0aG9kUGFja2FnZXMuIEEgY29uZmlndXJhdGlvbiBjYW4gYmUgZXhwb3J0ZWQgaW50byBpdHMgb3duIHN0YW5kYWxvbmUgbGlicmFyeSB3aGVuIGl0IGluY2x1ZGVzIHRoZSBmdWxsIHRyYW5zaXRpdmUgY2xvc3VyZSBvZiBhbGwgZWxlbWVudHMgYWxsIG90aGVyIGVsZW1lbnRzIGRlcGVuZCBvbi4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ibWV0aG9kUGx1Z2luU2VsZWN0aW9uIgotICAgICAgICBvcmRlcmVkPSJmYWxzZSIgbG93ZXJCb3VuZD0iMSIgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9NZXRob2RQbHVnaW4iLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ibWV0aG9kUGFja2FnZVNlbGVjdGlvbiIKLSAgICAgICAgb3JkZXJlZD0iZmFsc2UiIGxvd2VyQm91bmQ9IjEiIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vTWV0aG9kUGFja2FnZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJwcm9jZXNzVmlld3MiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0NvbnRlbnRDYXRlZ29yeSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJkZWZhdWx0VmlldyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIGxvd2VyQm91bmQ9IjEiIGVUeXBlPSIjLy9Db250ZW50Q2F0ZWdvcnkiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iYmFzZUNvbmZpZ3VyYXRpb25zIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9NZXRob2RDb25maWd1cmF0aW9uIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InN1YnRyYWN0ZWRDYXRlZ29yeSIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vQ29udGVudENhdGVnb3J5Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImFkZGVkQ2F0ZWdvcnkiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0NvbnRlbnRDYXRlZ29yeSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJNZXRob2RQbHVnaW4iIGVTdXBlclR5cGVzPSIjLy9NZXRob2RVbml0ICMvL1BhY2thZ2UiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgTWV0aG9kIFBsdWdpbiBpcyBhIE1ldGhvZCBFbGVtZW50IHRoYXQgcmVwcmVzZW50cyBhIHBoeXNpY2FsIGNvbnRhaW5lciBmb3IgTWV0aG9kIFBhY2thZ2VzLiAgSXQgZGVmaW5lcyBhIGdyYW51bGFyaXR5IGxldmVsIGZvciB0aGUgbW9kdWxhcml6YXRpb24gYW5kIG9yZ2FuaXphdGlvbiBvZiBtZXRob2QgY29udGVudCBhbmQgcHJvY2Vzc2VzLiAgQSBNZXRob2QgUGx1Z2luIGNhbiBleHRlbmQgbWFueSBvdGhlciBNZXRob2QgUGx1Z2lucyBhbmQgaXQgY2FuIGJlIGV4dGVuZGVkIGJ5IG1hbnkgTWV0aG9kIFBsdWdpbnMuICBJdCBjYW4gYWxzbyBiZSB1c2VkIHN0YW5kLWFsb25lLCBpLmUuIHdpdGggbm8gRXh0ZW5zaW9uIHJlbGF0aW9uc2hpcCB0byBvdGhlciBwbHVnLWlucy4mI3hBO01ldGhvZCBQbHVnaW4gY29uY2VwdHVhbGx5IHJlcHJlc2VudHMgYSB1bml0IGZvciBjb25maWd1cmF0aW9uLCBtb2R1bGFyaXphdGlvbiwgZXh0ZW5zaW9uLCBwYWNrYWdpbmcsIGFuZCBkZXBsb3ltZW50IG9mIG1ldGhvZCBjb250ZW50IGFuZCBwcm9jZXNzZXMuICBBIFByb2Nlc3MgRW5naW5lZXIgc2hhbGwgZGVzaWduIGhpcyBQbHVnaW5zIGFuZCBhbGxvY2F0ZSBoaXMgY29udGVudCB0byB0aGVzZSBQbHVnaW5zIHdpdGggcmVxdWlyZW1lbnRzIGZvciBleHRlbnNpYmlsaXR5LCBtb2R1bGFyaXR5LCByZXVzZSwgYW5kIG1haW50YWluYWJpbGl0eSBpbiBtaW5kLiYjeEE7U3BlY2lhbCBleHRlbnNpYmlsaXR5IG1lY2hhbmlzbXMgZGVmaW5lZCBmb3IgdGhlIG1ldGEtY2xhc3NlcyBWYXJpYWJpbGl0eSBFbGVtZW50IGFuZCBQcm9jZXNzIENvbnRyaWJ1dGlvbiBhbGxvdyBQbHVnaW4gY29udGVudCB0byBkaXJlY3RseSBjb250cmlidXRlIG5ldyBjb250ZW50LCByZXBsYWNlIGV4aXN0aW5nIGNvbnRlbnQsIG9yIHRvIGNyb3NzLXJlZmVyZW5jZSB0byBhbnkgQ29udGVudCBFbGVtZW50IG9yIFByb2Nlc3Mgd2l0aGluIGFub3RoZXIgUGx1Z2luIHRoYXQgaXQgZXh0ZW5kcy4gIFNpbWlsYXIgdG8gVU1MIDIuMCdzICdwYWNrYWdlIG1lcmdlJyBtZWNoYW5pc20gdHJhbnNmb3JtYXRpb24gaW50ZXJwcmV0YXRpb25zLCBpbnRlcnByZXRpbmcgdGhlc2UgTWV0aG9kIFBsdWdpbiBtZWNoYW5pc21zIHJlc3VsdHMgaW50byBuZXcgZXh0ZW5kZWQgTWV0aG9kIENvbnRlbnQgYW5kIFByb2Nlc3Nlcy4mI3hBOyIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ1c2VyQ2hhbmdlYWJsZSIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIGxvd2VyQm91bmQ9IjEiIGVUeXBlPSIjLy9Cb29sZWFuIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im1ldGhvZFBhY2thZ2VzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgbG93ZXJCb3VuZD0iMSIgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9NZXRob2RQYWNrYWdlIiBjb250YWlubWVudD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJiYXNlcyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vTWV0aG9kUGx1Z2luIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InN1cHBvcnRpbmciIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBzdXBwb3J0aW5nIG1ldGhvZCBwbHVnLWluIGlzIGEgcGx1Zy1pbiB0aGF0IGNvbnRhaW5zIHN1cHBvcnRpbmcgYW5kIG9wdGlvbmFsIG1ldGhvZCBlbGVtZW50cy4gT25seSB0aGUgZWxlbWVudHMgdGhhdCBhcmUgcmVmZXJlbmNlZCBmcm9tIG5vbi1zdXBwb3J0aW5nIHBsdWctaW4gYXJlIHRvIGJlIGNvbnNpZGVyZWQgZm9yIGluY2x1c2lvbiBpbnRvIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24uIEluIG90aGVyIHdvcmRzLCBpZiBhIHN1cHBvcnRpbmcgbWV0aG9kIHBsdWctaW4gaXMgc2VsZWN0ZWQgZm9yIGEgY29uZmlndXJhdGlvbiBvbmx5IGl0cyBlbGVtZW50cyByZWZlcmVuY2VkIGZyb20gb3V0c2lkZSBvZiB0aGlzIHBsdWctaW4gd2lsbCBiZSBjb25zaWRlcmVkIGZvciB0aGUgY29uZmlndXJhdGlvbi4gIEFsbCBvdGhlciB1bnJlZmVyZW5jZWQgZWxlbWVudHMgd2lsbCBub3QgYmUuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlByb2Nlc3NQbGFubmluZ1RlbXBsYXRlIiBlU3VwZXJUeXBlcz0iIy8vUHJvY2VzcyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBQcm9jZXNzIFBsYW5uaW5nIFRlbXBsYXRlIGlzIGEgc3BlY2lhbCBQcm9jZXNzIHRoYXQgaXMgcHJlcGFyZWQgZm9yIGluc3RhbnRpYXRpb24gYnkgYSBwcm9qZWN0IHBsYW5uaW5nIHRvb2wuICBUeXBpY2FsbHksIGl0IGlzIGNyZWF0ZWQgYmFzZWQgb24gYSBQcm9jZXNzIHN1Y2ggYXMgYSBEZWxpdmVyeSBQcm9jZXNzIGFzIGEgd2hvbGUgKGUuZy4gaW4gY2FzZSBvZiBhIHdhdGVyZmFsbC1iYXNlZCBkZXZlbG9wbWVudCBhcHByb2FjaCkgb3IgaW4gcGFydHMgKGUuZy4gaW4gY2FzZSBvZiBhbiBpdGVyYXRpdmUgZGV2ZWxvcG1lbnQgYXBwcm9hY2gpLiYjeEE7QSBQcm9jZXNzIFBsYW5uaW5nIFRlbXBsYXRlIHJlcHJlc2VudHMgYSBwYXJ0aWFsbHkgZmluaXNoZWQgcGxhbiBmb3IgYSBjb25jcmV0ZSBwcm9qZWN0LiAgSXQgdXNlcyB0aGUgc2FtZSBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmVzIGFzIGFsbCBvdGhlciBQcm9jZXNzIFR5cGVzIHRvIHJlcHJlc2VudCB0ZW1wbGF0ZXMgZm9yIHByb2plY3QgcGxhbnMuICBIb3dldmVyLCBjZXJ0YWluIHBsYW5uaW5nIGRlY2lzaW9ucyBoYXZlIGFscmVhZHkgYmVlbiBhcHBsaWVkIHRvIHRoZSB0ZW1wbGF0ZSBhcyB3ZWxsIGFzIGluZm9ybWF0aW9uIGhhcyBiZWVuIHJlbW92ZWQgYW5kL29yIHJlZm9ybWF0dGVkIHRvIGJlIHJlYWR5IGZvciBleHBvcnQgdG8gYSBzcGVjaWZpYyBwbGFubmluZyB0b29sLiAgRXhhbXBsZXMgZm9yIHN1Y2ggZGVjaXNpb25zIGFyZTogYSB0ZW1wbGF0ZSBoYXMgYmVlbiBjcmVhdGVkIHRvIHJlcHJlc2VudCBhIHBsYW4gZm9yIGEgcGFydGljdWxhciBJdGVyYXRpb24gaW4gYW4gaXRlcmF0aXZlIGRldmVsb3BtZW50IHByb2plY3QsIHdoaWNoIGZyIGV4YW1wbGUgZGlzdGluZ3Vpc2hlcyBlYXJseSBmcm9tIGxhdGUgaXRlcmF0aW9ucyBpbiB0aGUgRWxhYm9yYXRpb24gcGhhc2Ugb2YgYSBwcm9qZWN0OyBpZiB0aGUgdGFyZ2V0ZWQgcGxhbm5pbmcgdG9vbCBjYW5ub3QgcmVwcmVzZW50IGlucHV0IGFuZCBvdXRwdXQgb2YgVGFzaywgdGhlbiB0aGVzZSBoYXZlIGJlZW4gcmVtb3ZlZCBmcm9tIHRoZSBzdHJ1Y3R1cmU7IGNlcnRhaW4gcmVwZXRpdGlvbnMgaGF2ZSBiZWVuIGFscmVhZHkgYXBwbGllZCwgZS5nLiBzdGF0aW5nIHRoYXQgYSBjeWNsZSBvZiBzcGVjaWZpYyBUYXNrIGdyb3VwZWQgaW4gYW4gQWN0aXZpdHkgaGF2ZSB0byBiZSByZXBlYXRlZCBuLXRpbWVzOyBldGMuJiN4QTsiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iYmFzZWRPblByb2Nlc3NlcyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vUHJvY2VzcyIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQcmFjdGljZSIgZVN1cGVyVHlwZXM9IiMvL0d1aWRhbmNlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIFByYWN0aWNlIHJlcHJlc2VudHMgYSBwcm92ZW4gd2F5IG9yIHN0cmF0ZWd5IG9mIGRvaW5nIHdvcmsgdG8gYWNoaWV2ZSBhIGdvYWwgdGhhdCBoYXMgYSBwb3NpdGl2ZSBpbXBhY3Qgb24gd29yayBwcm9kdWN0IG9yIHByb2Nlc3MgcXVhbGl0eS4gIFByYWN0aWNlcyBhcmUgZGVmaW5lZCBvcnRob2dvbmFsIHRvIG1ldGhvZHMgYW5kIHByb2Nlc3Nlcy4gIFRoZXkgY291bGQgc3VtbWFyaXplIGFzcGVjdHMgdGhhdCBpbXBhY3QgbWFueSBkaWZmZXJlbnQgcGFydHMgb2YgYSBtZXRob2Qgb3Igc3BlY2lmaWMgcHJvY2Vzc2VzLiAgRXhhbXBsZXMgZm9yIHByYWN0aWNlcyB3b3VsZCBiZSAmcXVvdDtNYW5hZ2UgUmlza3MmcXVvdDssICZxdW90O0NvbnRpbnVvdXNseSB2ZXJpZnkgcXVhbGl0eSZxdW90OywgJnF1b3Q7QXJjaGl0ZWN0dXJlLWNlbnRyaWMgYW5kIGNvbXBvbmVudC1iYXNlZCBkZXZlbG9wbWVudCZxdW90OywgZXRjLiYjeEE7Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InN1YlByYWN0aWNlcyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vUHJhY3RpY2UiIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImNvbnRlbnRSZWZlcmVuY2VzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Db250ZW50RWxlbWVudCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJhY3Rpdml0eVJlZmVyZW5jZXMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0FjdGl2aXR5Ii8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbiIgZVN1cGVyVHlwZXM9IiMvL0NvbnRlbnREZXNjcmlwdGlvbiI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InVzYWdlR3VpZGFuY2UiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vU3RyaW5nIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJQcm92aWRlcyBpbmZvcm1hdGlvbiBhbmQgZ3VpZGFuY2Ugb24gdGhlIG1lYW5pbmcgb2YgdGhlIEJvb2xlYW4gZmxhZyB2YWx1ZXMgYW5kIHVuZGVyIHdoYXQgY2lyY3Vtc3RhbmNlcyB0aGV5IHNob3VsZCBiZSBvdmVycmlkZGVuLiBGb3IgZXhhbXBsZSwgaXQgZGVzY3JpYmVzIHdoeSB0aGUgYnJlYWtkb3duIGVsZW1lbnQgaXMgb3B0aW9uYWwgb3IgY29uc2lkZXJhdGlvbnMgZm9yIHJlcGVhdGluZyBpdCBhbmQgZGlmZmVyZW5jZXMgaW4gdGhlIGluZGl2aWR1YWwgb2NjdXJyZW5jZXMgb2YgdGhpcyBCcmVha2Rvd24gRWxlbWVudCBhY3Jvc3MgdGhlIGxpZmVjeWNsZS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQWN0aXZpdHlEZXNjcmlwdGlvbiIgZVN1cGVyVHlwZXM9IiMvL0JyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbiI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InB1cnBvc2UiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vU3RyaW5nIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJTdW1tYXJpemVzIHRoZSBtYWluIHJlYXNvbiBmb3IgcGVyZm9ybWluZyB0aGlzIEFjdGl2aXR5LCBkZXNjcmliZXMgd2hhdCB0aGUgYWN0aXZpdHkgYXMgYSB3aG9sZSBpcyBpbnRlbmRlZCB0byBhY2hpZXZlLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhbHRlcm5hdGl2ZXMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vU3RyaW5nIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJDb21wcmlzZXMgb2Ygc3VtbWFyaWVzIGRlc2NyaWJpbmcgaW1wb3J0YW50IGV4Y2VwdGlvbmFsIGFuZCBub24tc3RhbmRhcmQgd2F5cyBvZiBkb2luZyB0aGUgd29yayBvZiB0aGlzIEFjdGl2aXR5IG5vdCBjb3ZlcmVkIGJ5IHRoZSBBY3Rpdml0eSdzIFRhc2tzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJob3d0b1N0YWZmIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL1N0cmluZyIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iUHJvdmlkZXMgYmFja2dyb3VuZCBvbiB3aG8gc2hvdWxkIGJlIGludm9sdmVkIGluIHRoaXMgYWN0aXZpdHkgd2hhdCBhcmUgdGhlIHJlcXVpcmVkIHNraWxscywgZXhwZXJpZW5jZSwgIGFuZCBwZXJoYXBzIGF0dGl0dWRlcy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24iIGVTdXBlclR5cGVzPSIjLy9Qcm9jZXNzRGVzY3JpcHRpb24iPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzY2FsZSIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9TdHJpbmciIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9Ik91dGxpbmVzIGNoYXJhY3RlcmlzdGljcyBhYm91dCB0aGUgc2l6ZSBvZiBhIHR5cGljYWwgcHJvamVjdCB0aGF0IHBlcmZvcm1zIHRoaXMgcHJvamVjdCBleHByZXNzZWQgaW4gdGVhbSBzaXplLCBtYW4geWVhcnMsIGV0Yy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icHJvamVjdENoYXJhY3RlcmlzdGljcyIKLSAgICAgICAgb3JkZXJlZD0iZmFsc2UiIGVUeXBlPSIjLy9TdHJpbmciIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkNoYXJhY3Rlcml6ZXMgdGhlIHByb2plY3QgdGhhdCB3b3VsZCB0eXBpY2FsbHkgcGVyZm9ybSB0aGlzIFByb2Nlc3MiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmlza0xldmVsIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL1N0cmluZyIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iT3V0bGluZXMgdHlwaWNhbCBwcm9qZWN0IHJpc2tzIHRoYXQgYXJlIGFkZHJlc3NlZCB3aXRoIHRoaXMgcHJvY2Vzcy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZXN0aW1hdGluZ1RlY2huaXF1ZSIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9TdHJpbmciIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkRlc2NyaWJlcyB0aGUgRXN0aW1hdGlvbiBUZWNobmlxdWVzIHByb3ZpZGVkIGZvciB0aGlzIFByb2Nlc3MuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InByb2plY3RNZW1iZXJFeHBlcnRpc2UiCi0gICAgICAgIG9yZGVyZWQ9ImZhbHNlIiBlVHlwZT0iIy8vU3RyaW5nIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJQcm92aWRlcyBhIHByb2ZpbGUgb2YgYSB0eXBpY2FsIHByb2plY3QgdGVhbSwgdGhlIGRpc3RyaWJ1dGlvbiBvZiByb2xlcywgc2tpbGxzIHJlcXVpcmVkIGZvciBhIHRlYW0gcGVyZm9ybXMgYSBwcm9qZWN0IGJhc2VkIG9uIHRoaXMgcHJvY2Vzcy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idHlwZU9mQ29udHJhY3QiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vU3RyaW5nIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJQcm92aWRlcyBiYWNrZ3JvdW5kIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjb250cmFjdHMgdGhhdCBuZWVkIHRvIGJlIGVzdGFibGlzaGVkIGJldHdlZW4gYSBwcm9qZWN0IHRlYW0gdGhhdCBwZXJmb3JtcyB0aGlzIHByb2Nlc3MgYW5kIGEgY2xpZW50IChlLmcuIGZvciBhbiBJR1MgZW5nYWdlbWVudCkuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlByb2Nlc3NEZXNjcmlwdGlvbiIgZVN1cGVyVHlwZXM9IiMvL0FjdGl2aXR5RGVzY3JpcHRpb24iPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzY29wZSIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9TdHJpbmciIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkRlZmluZXMgdGhlIHNjb3BlIG9mIHRoZSBQcm9jZXNzLCBpLmUuIHdoaWNoIHR5cGVzIG9mIHByb2plY3RzIGRvZXMgaXQgYWRkcmVzcyBhbmQgd2hpY2ggbm90LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ1c2FnZU5vdGVzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL1N0cmluZyIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQW55IGFkZGl0aW9uYWwgbm90ZXMgb24gaG93IHRvIGFwcGx5IGFuZCBpbnN0YW50aWF0ZSB0aGlzIHByb2Nlc3MgZm9yIGEgcHJvamVjdC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRGVzY3JpcHRvckRlc2NyaXB0aW9uIiBlU3VwZXJUeXBlcz0iIy8vQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmVmaW5lZERlc2NyaXB0aW9uIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL1N0cmluZyIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBEZXNjcmlwdG9yIG1pZ2h0IGFkZCByZWZpbmVtZW50cyB0byB0aGUgbWFpbiBkZXNjcmlwdGlvbiBvZiB0aGUgQ29udGVudCBFbGVtZW50IGl0IHJlZmVycyB0by4gIEZvciBleGFtcGxlLCBpdCBjb3VsZCBwcm92aWRlIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gYWJvdXQgYSBXb3JrIFByb2R1Y3QgcmVsZXZhbnQgZm9yIHRoZSBzcGVjaWZpYyBwb2ludCBpbiB0aW1lIGluIHRoZSBwcm9jZXNzIHRoaXMgV29yayBQcm9kdWN0IHR5cGUgaXMgYmVpbmcgdXNlZC4gIEl0IGNvdWxkIGRlc2NyaWJlIGFkZGl0aW9uYWwgc2tpbGxzIG5lZWRlZCBmb3IgYSBSb2xlIGF0IHRoYXQgcGFydGljdWxhciBwb2ludCBpbiB0aW1lIGluIGEgcHJvY2VzcywgZXRjLiAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3IiIGVTdXBlclR5cGVzPSIjLy9EZXNjcmlwdG9yIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIFByb2Nlc3MgQ29tcG9uZW50IERlc2NyaXB0b3IgcmVwcmVzZW50cyBhIFByb2Nlc3MgQ29tcG9uZW50IGFwcGxpY2F0aW9uIGluIGEgUHJvY2VzcywgaS5lLiB0aGUgYnJlYWtkb3duIHN0cnVjdHVyZSBkZWZpbmluZyB0aGUgUHJvY2Vzcy4gIFRoZSBQcm9jZXNzIENvbXBvbmVudCBEZXNjcmlwdG9yIGlzIHVzZWQgdG8gZW5jYXBzdWxhdGUgdGhlIGRldGFpbHMgb2YgdGhlIGNvbXBvbmVudCBpbiBhIGJyZWFrZG93biBzdHJ1Y3R1cmUgYW5kIHRvIHByb3ZpZGUgaXRzIG93biBzZXQgb2YgcmVsYXRpb25zaGlwcyBzdWNoIGFzIGl0IG93biBwcmVkZWNlc3NvcnMgYW5kIHN1Y2Nlc3NvcnMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Il9wcm9jZXNzQ29tcG9uZW50IiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdW5pcXVlPSJmYWxzZSIgbG93ZXJCb3VuZD0iMSIgZVR5cGU9IiMvL1Byb2Nlc3NDb21wb25lbnQiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUHJvY2Vzc0NvbXBvbmVudCIgZVN1cGVyVHlwZXM9IiMvL1Byb2Nlc3NQYWNrYWdlICMvL01ldGhvZFVuaXQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgUHJvY2VzcyBDb21wb25lbnQgaXMgYSBzcGVjaWFsIFByb2Nlc3MgUGFja2FnZSB0aGF0IGFwcGxpZXMgdGhlIHByaW5jaXBsZXMgb2YgZW5jYXBzdWxhdGlvbi4gIEEgUHJvY2VzcyBDb21wb25lbnQgcmVhbGl6ZXMgb25lIG9yIG1vcmUgSW50ZXJmYWNlcyB3aGljaCBzcGVjaWZ5IGlucHV0cyBhbmQgb3V0cHV0cyBvZiB0aGUgY29tcG9uZW50LiBUaGVyZSBtaWdodCBiZSBtYW55IGNvbXBvbmVudHMgcmVhbGl6aW5nIHRoZSBzYW1lIGludGVyZmFjZXMsIGJ1dCB1c2luZyBkaWZmZXJlbnQgdGVjaG5pcXVlcyB0byBhY2hpZXZlIHNpbWlsYXIgb3V0cHV0cyBmb3Igc2ltaWxhciBpbnB1dHMuICBXaGVyZWFzIHRoZSBDb21wb25lbnQgSW50ZXJmYWNlcyByZXByZXNlbnQgY29tcG9uZW50IHNwZWNpZmljYXRpb25zIChibGFjayBib3ggZGVzY3JpcHRpb25zIG9mIHRoZSBjb21wb25lbnQpLCBnb29kIGNhbmRpZGF0ZXMgZm9yIGNvbXBvbmVudCByZWFsaXphdGlvbnMgY2FuIGJlIGZvdW5kIGluIENhcGFiaWxpdHkgUGF0dGVybnMgKHdoaXRlIGJveCBkZXNjcmlwdGlvbnMgZm9yIHRoZSBjb21wb25lbnQpLiYjeEE7VU1BIHN1cHBvcnRzIHJlcGxhY2VhYmxlIGFuZCByZXVzYWJsZSBQcm9jZXNzIENvbXBvbmVudHMgcmVhbGl6aW5nIHRoZSBwcmluY2lwbGVzIG9mIGVuY2Fwc3VsYXRpb24uIENlcnRhaW4gc2l0dWF0aW9ucyBpbiBhIHNvZnR3YXJlIGRldmVsb3BtZW50IHByb2plY3QgbWlnaHQgcmVxdWlyZSB0aGF0IGNvbmNyZXRlIHJlYWxpemF0aW9ucyBvZiBwYXJ0cyBvZiB0aGUgcHJvY2VzcyByZW1haW4gdW5kZWNpZGVkIG9yIHdpbGwgYmUgZGVjaWRlZCBieSB0aGUgZXhlY3V0aW5nIHRlYW0gaXRzZWxmIChlLmcuIGluIG91dHNvdXJjaW5nIHNpdHVhdGlvbnMpLiAgVU1BIHByb3ZpZGVzIGEgdW5pcXVlIGNvbXBvbmVudCBjb25jZXB0IGRlZmluaW5nIGludGVyZmFjZXMgZm9yIHdvcmsgcHJvZHVjdCBpbnB1dCBhbmQgb3V0cHV0LCBhbGxvd2luZyB0cmVhdGluZyB0aGUgYWN0dWFsIGRlZmluaXRpb24gb2YgdGhlIHdvcmsgdGhhdCBwcm9kdWNlcyB0aGUgb3V0cHV0cyBhcyBhICZxdW90O2JsYWNrIGJveCZxdW90Oy4gIEF0IGFueSBwb2ludCBkdXJpbmcgYSBwcm9qZWN0IHRoZSBjb21wb25lbnQgJnF1b3Q7cmVhbGl6YXRpb24mcXVvdDsgZGV0YWlsaW5nIHRoZSB3b3JrIGNhbiBiZSBhZGRlZCB0byB0aGUgcHJvY2Vzcy4gIFRoZSBjb21wb25lbnQgYXBwcm9hY2ggYWxzbyBhbGxvd3MgdGhhdCBkaWZmZXJlbnQgc3R5bGVzIG9yIHRlY2huaXF1ZXMgb2YgZG9pbmcgd29yayBjYW4gYmUgcmVwbGFjZWQgd2l0aCBvbmUgYW5vdGhlci4gIEZvciBleGFtcGxlLCBhIHNvZnR3YXJlIGNvZGUgb3V0cHV0IG9mIGEgY29tcG9uZW50IGNvdWxkIGJlIHByb2R1Y2VkIHdpdGggYSBtb2RlbC1kcml2ZW4gZGV2ZWxvcG1lbnQgb3IgYSBjb2RlLWNlbnRyaWMgdGVjaG5pcXVlLiAgVGhlIGNvbXBvbmVudCBjb25jZXB0IGVuY2Fwc3VsYXRlcyB0aGUgYWN0dWFsIHdvcmsgYW5kIGxldHMgdGhlIGRldmVsb3BtZW50IHRlYW0gY2hvb3NlIHRoZSBhcHByb3ByaWF0ZSB0ZWNobmlxdWUgYW5kIGZpbGwgdGhlIGNvbXBvbmVudCdzIHJlYWxpemF0aW9uIHdpdGggdGhlaXIgY2hvaWNlIG9mIEFjdGl2aXRpZXMgdGhhdCBwcm9kdWNlIHRoZSByZXF1aXJlZCBvdXRwdXRzLiYjeEE7Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImludGVyZmFjZXMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICBsb3dlckJvdW5kPSIxIiB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1Byb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icHJvY2VzcyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIGxvd2VyQm91bmQ9IjEiIGVUeXBlPSIjLy9Qcm9jZXNzIiBjb250YWlubWVudD0idHJ1ZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQcm9jZXNzUGFja2FnZSIgZVN1cGVyVHlwZXM9IiMvL01ldGhvZFBhY2thZ2UiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlByb2Nlc3MgUGFja2FnZSBpcyBhIHNwZWNpYWwgTWV0aG9kIFBhY2thZ2UgdGhhdCBjb250YWlucyBQcm9jZXNzIEVsZW1lbnRzLCBvbmx5LiYjeEE7QSBrZXkgc2VwYXJhdGlvbiBvZiBjb25jZXJucyBpbiBVTUEgaXMgdGhlIGRpc3RpbmN0aW9uIGJldHdlZW4gTWV0aG9kIENvbnRlbnQgYW5kIFByb2Nlc3MuICBUaGlzIHNlcGFyYXRpb24gaXMgZW5mb3JjZWQgYnkgc3BlY2lhbCBwYWNrYWdlIHR5cGVzLCB3aGljaCBkbyBub3QgYWxsb3cgdGhlIG1peGluZyBvZiBtZXRob2QgY29udGVudCB3aXRoIHByb2Nlc3Nlcy4mI3hBOyIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJwcm9jZXNzRWxlbWVudHMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1Byb2Nlc3NFbGVtZW50IiBjb250YWlubWVudD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJkaWFncmFtcyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vRGlhZ3JhbSIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRGlhZ3JhbSIgZVN1cGVyVHlwZXM9IiMvL0dyYXBoTm9kZSI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImRpYWdyYW1MaW5rIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9EaWFncmFtTGluayIgZU9wcG9zaXRlPSIjLy9EaWFncmFtTGluay9kaWFncmFtIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im5hbWVzcGFjZSIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIGxvd2VyQm91bmQ9IjEiIGVUeXBlPSIjLy9TZW1hbnRpY01vZGVsQnJpZGdlIiBjb250YWlubWVudD0idHJ1ZSIgZU9wcG9zaXRlPSIjLy9TZW1hbnRpY01vZGVsQnJpZGdlL2RpYWdyYW0iLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iem9vbSIgb3JkZXJlZD0iZmFsc2UiIGVUeXBlPSIjLy9Eb3VibGUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0idmlld3BvaW50IiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgbG93ZXJCb3VuZD0iMSIgZVR5cGU9IiMvL1BvaW50Ii8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkdyYXBoTm9kZSIgZVN1cGVyVHlwZXM9IiMvL0dyYXBoRWxlbWVudCI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InNpemUiIG9yZGVyZWQ9ImZhbHNlIiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iIy8vRGltZW5zaW9uIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkdyYXBoRWxlbWVudCIgYWJzdHJhY3Q9InRydWUiIGVTdXBlclR5cGVzPSIjLy9EaWFncmFtRWxlbWVudCI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImNvbnRhaW5lZCIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vRGlhZ3JhbUVsZW1lbnQiIGNvbnRhaW5tZW50PSJ0cnVlIiBlT3Bwb3NpdGU9IiMvL0RpYWdyYW1FbGVtZW50L2NvbnRhaW5lciIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJwb3NpdGlvbiIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIGxvd2VyQm91bmQ9IjEiIGVUeXBlPSIjLy9Qb2ludCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJsaW5rIiBvcmRlcmVkPSJmYWxzZSIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9EaWFncmFtTGluayIgY29udGFpbm1lbnQ9InRydWUiIGVPcHBvc2l0ZT0iIy8vRGlhZ3JhbUxpbmsvZ3JhcGhFbGVtZW50Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImFuY2hvcmFnZSIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vR3JhcGhDb25uZWN0b3IiIGNvbnRhaW5tZW50PSJ0cnVlIiBlT3Bwb3NpdGU9IiMvL0dyYXBoQ29ubmVjdG9yL2dyYXBoRWxlbWVudCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJzZW1hbnRpY01vZGVsIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgbG93ZXJCb3VuZD0iMSIgZVR5cGU9IiMvL1NlbWFudGljTW9kZWxCcmlkZ2UiIGNvbnRhaW5tZW50PSJ0cnVlIiBlT3Bwb3NpdGU9IiMvL1NlbWFudGljTW9kZWxCcmlkZ2UvZ3JhcGhFbGVtZW50Ii8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkRpYWdyYW1FbGVtZW50IiBhYnN0cmFjdD0idHJ1ZSIgZVN1cGVyVHlwZXM9IiMvL01ldGhvZEVsZW1lbnQiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpc1Zpc2libGUiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICBsb3dlckJvdW5kPSIxIiBlVHlwZT0iIy8vQm9vbGVhbiIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJjb250YWluZXIiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vR3JhcGhFbGVtZW50IiBlT3Bwb3NpdGU9IiMvL0dyYXBoRWxlbWVudC9jb250YWluZWQiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icmVmZXJlbmNlIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9SZWZlcmVuY2UiIGVPcHBvc2l0ZT0iIy8vUmVmZXJlbmNlL3JlZmVyZW5jZWQiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icHJvcGVydHkiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1Byb3BlcnR5IiBjb250YWlubWVudD0idHJ1ZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJSZWZlcmVuY2UiIGVTdXBlclR5cGVzPSIjLy9EaWFncmFtRWxlbWVudCI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImlzSW5kaXZpZHVhbFJlcHJlc2VudGF0aW9uIgotICAgICAgICBvcmRlcmVkPSJmYWxzZSIgbG93ZXJCb3VuZD0iMSIgZVR5cGU9IiMvL0Jvb2xlYW4iIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InJlZmVyZW5jZWQiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICBsb3dlckJvdW5kPSIxIiBlVHlwZT0iIy8vRGlhZ3JhbUVsZW1lbnQiIGVPcHBvc2l0ZT0iIy8vRGlhZ3JhbUVsZW1lbnQvcmVmZXJlbmNlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlByb3BlcnR5IiBlU3VwZXJUeXBlcz0iIy8vRGlhZ3JhbUVsZW1lbnQiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJrZXkiIG9yZGVyZWQ9ImZhbHNlIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idmFsdWUiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vU3RyaW5nIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUG9pbnQiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ4IiBvcmRlcmVkPSJmYWxzZSIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9IiMvL0RvdWJsZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ5IiBvcmRlcmVkPSJmYWxzZSIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9IiMvL0RvdWJsZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJEaWFncmFtTGluayIgZVN1cGVyVHlwZXM9IiMvL0RpYWdyYW1FbGVtZW50Ij4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iem9vbSIgb3JkZXJlZD0iZmFsc2UiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSIjLy9Eb3VibGUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0idmlld3BvcnQiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICBsb3dlckJvdW5kPSIxIiBlVHlwZT0iIy8vUG9pbnQiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZGlhZ3JhbSIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIGxvd2VyQm91bmQ9IjEiIGVUeXBlPSIjLy9EaWFncmFtIiBlT3Bwb3NpdGU9IiMvL0RpYWdyYW0vZGlhZ3JhbUxpbmsiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZ3JhcGhFbGVtZW50IiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgbG93ZXJCb3VuZD0iMSIgZVR5cGU9IiMvL0dyYXBoRWxlbWVudCIgZU9wcG9zaXRlPSIjLy9HcmFwaEVsZW1lbnQvbGluayIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJHcmFwaENvbm5lY3RvciIgZVN1cGVyVHlwZXM9IiMvL0dyYXBoRWxlbWVudCI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImdyYXBoRWRnZSIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vR3JhcGhFZGdlIiBlT3Bwb3NpdGU9IiMvL0dyYXBoRWRnZS9hbmNob3IiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZ3JhcGhFbGVtZW50IiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgbG93ZXJCb3VuZD0iMSIgZVR5cGU9IiMvL0dyYXBoRWxlbWVudCIgZU9wcG9zaXRlPSIjLy9HcmFwaEVsZW1lbnQvYW5jaG9yYWdlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkdyYXBoRWRnZSIgZVN1cGVyVHlwZXM9IiMvL0dyYXBoRWxlbWVudCI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9IndheXBvaW50cyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIGxvd2VyQm91bmQ9IjIiIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vUG9pbnQiIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImFuY2hvciIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIGxvd2VyQm91bmQ9IjIiIHVwcGVyQm91bmQ9IjIiIGVUeXBlPSIjLy9HcmFwaENvbm5lY3RvciIgZU9wcG9zaXRlPSIjLy9HcmFwaENvbm5lY3Rvci9ncmFwaEVkZ2UiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iU2VtYW50aWNNb2RlbEJyaWRnZSIgYWJzdHJhY3Q9InRydWUiCi0gICAgICBlU3VwZXJUeXBlcz0iIy8vRGlhZ3JhbUVsZW1lbnQiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwcmVzZW50YXRpb24iIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vU3RyaW5nIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZGlhZ3JhbSIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9EaWFncmFtIiBlT3Bwb3NpdGU9IiMvL0RpYWdyYW0vbmFtZXNwYWNlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImdyYXBoRWxlbWVudCIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9HcmFwaEVsZW1lbnQiIGVPcHBvc2l0ZT0iIy8vR3JhcGhFbGVtZW50L3NlbWFudGljTW9kZWwiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRGltZW5zaW9uIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0id2lkdGgiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICBsb3dlckJvdW5kPSIxIiBlVHlwZT0iIy8vRG91YmxlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImhlaWdodCIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIGxvd2VyQm91bmQ9IjEiIGVUeXBlPSIjLy9Eb3VibGUiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSIgZVN1cGVyVHlwZXM9IiMvL0JyZWFrZG93bkVsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgUHJvY2VzcyBDb21wb25lbnQgSW50ZXJmYWNlIGNvbXByaXNlcyBvZiBhIGxpc3Qgb2YgaW50ZXJmYWNlIHNwZWNpZmljYXRpb25zIChzaW1pbGFyIHRvIG9wZXJhdGlvbiBkZWNsYXJhdGlvbnMpIHRoYXQgZXhwcmVzcyBpbnB1dHMgYW5kIG91dHB1dHMgZm9yIGEgcHJvY2VzcyBjb21wb25lbnQuICBUaGVzZSBpbnRlcmZhY2Ugc3BlY2lmaWNhdGlvbnMgYXJlIGV4cHJlc3NlZCB1c2luZyBUYXNrIERlc2NyaXB0b3JzIHdoaWNoIGFyZSBub3QgbGlua2VkIHRvIFRhc2tzIHRoYXQgYXJlIHJlbGF0ZWQgdG8gV29yayBQcm9kdWN0IERlc2NyaXB0b3JzIGFzIHdlbGwgYXMgb3B0aW9uYWwgYSBSb2xlIERlc2NyaXB0b3IuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImludGVyZmFjZVNwZWNpZmljYXRpb25zIgotICAgICAgICBvcmRlcmVkPSJmYWxzZSIgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9UYXNrRGVzY3JpcHRvciIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iaW50ZXJmYWNlSU8iIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1dvcmtQcm9kdWN0RGVzY3JpcHRvciIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnQiIGVTdXBlclR5cGVzPSIjLy9TZW1hbnRpY01vZGVsQnJpZGdlIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idHlwZUluZm8iIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vU3RyaW5nIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iVU1BU2VtYW50aWNNb2RlbEJyaWRnZSIgZVN1cGVyVHlwZXM9IiMvL1NlbWFudGljTW9kZWxCcmlkZ2UiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJlbGVtZW50IiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgbG93ZXJCb3VuZD0iMSIgZVR5cGU9IiMvL01ldGhvZEVsZW1lbnQiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQ29yZVNlbWFudGljTW9kZWxCcmlkZ2UiIGVTdXBlclR5cGVzPSIjLy9TZW1hbnRpY01vZGVsQnJpZGdlIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZWxlbWVudCIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIGxvd2VyQm91bmQ9IjEiIGVUeXBlPSIjLy9FbGVtZW50Ii8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkxlYWZFbGVtZW50IiBhYnN0cmFjdD0idHJ1ZSIgZVN1cGVyVHlwZXM9IiMvL0RpYWdyYW1FbGVtZW50Ii8+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iVGV4dEVsZW1lbnQiIGVTdXBlclR5cGVzPSIjLy9MZWFmRWxlbWVudCI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InRleHQiIG9yZGVyZWQ9ImZhbHNlIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iSW1hZ2UiIGVTdXBlclR5cGVzPSIjLy9MZWFmRWxlbWVudCI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InVyaSIgb3JkZXJlZD0iZmFsc2UiIGVUeXBlPSIjLy9VcmkiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibWltZVR5cGUiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vU3RyaW5nIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iR3JhcGhpY1ByaW1pdGl2ZSIgYWJzdHJhY3Q9InRydWUiIGVTdXBlclR5cGVzPSIjLy9MZWFmRWxlbWVudCIvPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlBvbHlsaW5lIiBlU3VwZXJUeXBlcz0iIy8vR3JhcGhpY1ByaW1pdGl2ZSI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNsb3NlZCIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIGxvd2VyQm91bmQ9IjEiIGVUeXBlPSIjLy9Cb29sZWFuIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9IndheXBvaW50cyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIGxvd2VyQm91bmQ9IjIiIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vUG9pbnQiIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkVsbGlwc2UiIGVTdXBlclR5cGVzPSIjLy9HcmFwaGljUHJpbWl0aXZlIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iY2VudGVyIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgbG93ZXJCb3VuZD0iMSIgZVR5cGU9IiMvL1BvaW50Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJhZGl1c1giIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICBsb3dlckJvdW5kPSIxIiBlVHlwZT0iIy8vRG91YmxlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJhZGl1c1kiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICBsb3dlckJvdW5kPSIxIiBlVHlwZT0iIy8vRG91YmxlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJvdGF0aW9uIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgbG93ZXJCb3VuZD0iMSIgZVR5cGU9IiMvL0RvdWJsZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzdGFydEFuZ2xlIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgbG93ZXJCb3VuZD0iMSIgZVR5cGU9IiMvL0RvdWJsZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJlbmRBbmdsZSIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIGxvd2VyQm91bmQ9IjEiIGVUeXBlPSIjLy9Eb3VibGUiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUHJvY2Vzc0ZhbWlseSIgZVN1cGVyVHlwZXM9IiMvL01ldGhvZENvbmZpZ3VyYXRpb24iPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgRGVsaXZlcnkgTW9kZWwgRmFtaWx5IGlzIGEgY29udmVuaWVudCBncm91cGluZyBvZiBEZWxpdmVyeSBQcm9jZXNzZXMgYW5kIENhcGFiaWxpdHkgUGF0dGVybnMgb2YgaW50ZXJlc3QgdG8gc29tZSBzcGVjaWZpYyB1c2VyIGNvbW11bml0eS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZGVsaXZlcnlQcm9jZXNzZXMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0RlbGl2ZXJ5UHJvY2VzcyIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJNZXRob2RMaWJyYXJ5IiBlU3VwZXJUeXBlcz0iIy8vTWV0aG9kVW5pdCAjLy9QYWNrYWdlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIE1ldGhvZCBMaWJyYXJ5IGlzIGEgcGh5c2ljYWwgY29udGFpbmVyIGZvciBNZXRob2QgUGx1Z2lucyBhbmQgTWV0aG9kIENvbmZpZ3VyYXRpb24gZGVmaW5pdGlvbnMuICBBbGwgTWV0aG9kIEVsZW1lbnRzIGFyZSBzdG9yZWQgaW4gYSBNZXRob2QgTGlicmFyeS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ibWV0aG9kUGx1Z2lucyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vTWV0aG9kUGx1Z2luIiBjb250YWlubWVudD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJwcmVkZWZpbmVkQ29uZmlndXJhdGlvbnMiCi0gICAgICAgIG9yZGVyZWQ9ImZhbHNlIiB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL01ldGhvZENvbmZpZ3VyYXRpb24iIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotPC9lY29yZTpFUGFja2FnZT4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvbW9kZWwvMS4wLjUvdW1hLmVteCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvbW9kZWwvMS4wLjUvdW1hLmVteApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2UyYzE1Yy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL21vZGVsLzEuMC41L3VtYS5lbXgKKysrIC9kZXYvbnVsbApAQCAtMSwzNDAwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPCEtLXh0b29sczJfdW5pdmVyc2FsX3R5cGVfbWFuYWdlci0tPg0KLTw/Y29tLmlibS54dG9vbHMuZW1mLmNvcmUuc2lnbmF0dXJlIDxzaWduYXR1cmUgaWQ9ImNvbS5pYm0ueHRvb2xzLnVtbC5tc2wubW9kZWwiIHZlcnNpb249IjcuMC4wIj48ZmVhdHVyZSBkZXNjcmlwdGlvbj0iIiBuYW1lPSJjb20uaWJtLnh0b29scy5ydW1sLmZlYXR1cmUiIHVybD0iIiB2ZXJzaW9uPSI3LjAuMCIvPjwvc2lnbmF0dXJlPj8+DQotPD9jb20uaWJtLnh0b29scy5lbWYuY29yZS5zaWduYXR1cmUgPHNpZ25hdHVyZSBpZD0iY29tLmlibS54dG9vbHMubW1pLnVpLnNpZ25hdHVyZXMuZGlhZ3JhbSIgdmVyc2lvbj0iNy4wLjAiPjxmZWF0dXJlIGRlc2NyaXB0aW9uPSIiIG5hbWU9IlJhdGlvbmFsIE1vZGVsaW5nIFBsYXRmb3JtIChjb20uaWJtLnh0b29scy5ybXApIiB1cmw9IiIgdmVyc2lvbj0iNy4wLjAiLz48L3NpZ25hdHVyZT4/Pg0KLTx4bWk6WE1JIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeG1sbnM6RGVmYXVsdD0iaHR0cDovLy9zY2hlbWFzL0RlZmF1bHQvMSIgeG1sbnM6RWNvcmU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvdW1sMi9zY2hlbWFzL0Vjb3JlLzMiIHhtbG5zOmVjb3JlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIiB4bWxuczp1bWw9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvdW1sMi8yLjAuMC9VTUwiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovLy9zY2hlbWFzL0RlZmF1bHQvMSBwYXRobWFwOi8vVU1MMl9NU0xfUFJPRklMRVMvRGVmYXVsdC5lcHgjX0lOOGs4TW1CRWRxQmNOMVI2RXZXVXc/RGVmYXVsdC9EZWZhdWx0PyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3VtbDIvc2NoZW1hcy9FY29yZS8zIHBhdGhtYXA6Ly9VTUxfUFJPRklMRVMvRWNvcmUucHJvZmlsZS51bWwjX3Z5LUhVWWluRWRxdHZibmZCMkxfNXciPg0KLSAgPHVtbDpNb2RlbCB4bWk6aWQ9Il9KN3RHME95Q0VkdTUtdlZqbGZWc2ZRIiBuYW1lPSJ1bWEiPg0KLSAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iX0o3dEcwZXlDRWR1NS12VmpsZlZzZlEiIHNvdXJjZT0idW1sMi5kaWFncmFtcyIvPg0KLSAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iX3RrOHU4Q1g1RWQyS25KMnlqTlhoV1EiIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy91bWwyLzIuMC4wL1VNTCI+DQotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il90azh1OFNYNUVkMktuSjJ5ak5YaFdRIiBzb3VyY2U9IlVuaWZpZWRNZXRob2RBcmNoaXRlY3R1cmU6OlVNTDJJbmZyYXN0cnVjdHVyZU1pbmk6OkNvbnN0cnVjdHMiIHJlZmVyZW5jZXM9Il90QlZzVFNYNUVkMktuSjJ5ak5YaFdRIF90QlZzU2lYNUVkMktuSjJ5ak5YaFdRIF90QmZja0NYNUVkMktuSjJ5ak5YaFdRIF90QmZjbFNYNUVkMktuSjJ5ak5YaFdRIF90QmZja2lYNUVkMktuSjJ5ak5YaFdRIF90QmZjbVNYNUVkMktuSjJ5ak5YaFdRIF90QmZjbkNYNUVkMktuSjJ5ak5YaFdRIF90QmZjb0NYNUVkMktuSjJ5ak5YaFdRIF90QmZjcENYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il90azh1OGlYNUVkMktuSjJ5ak5YaFdRIiBzb3VyY2U9IlVuaWZpZWRNZXRob2RBcmNoaXRlY3R1cmU6OlVuaWZpZWRNZXRob2RBcmNoaXRlY3R1cmU6OlByaW1pdGl2ZVR5cGVzIiByZWZlcmVuY2VzPSJfdEJmY3NDWDVFZDJLbkoyeWpOWGhXUSBfdEJmY3NpWDVFZDJLbkoyeWpOWGhXUSBfdEJmY3RDWDVFZDJLbkoyeWpOWGhXUSBfdEJmY3RpWDVFZDJLbkoyeWpOWGhXUSBfdEJvbWdDWDVFZDJLbkoyeWpOWGhXUSBfdEJvbWdTWDVFZDJLbkoyeWpOWGhXUSBfdEJvbWd5WDVFZDJLbkoyeWpOWGhXUSBfdEJvbWhTWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfdGs4dTh5WDVFZDJLbkoyeWpOWGhXUSIgc291cmNlPSJVbmlmaWVkTWV0aG9kQXJjaGl0ZWN0dXJlOjpVbmlmaWVkTWV0aG9kQXJjaGl0ZWN0dXJlOjpNZXRob2RDb3JlOjpCYXNpY0VsZW1lbnRzIiByZWZlcmVuY2VzPSJfdEI4SWhDWDVFZDJLbkoyeWpOWGhXUSBfdEI4SWlTWDVFZDJLbkoyeWpOWGhXUSBfdEI4SWppWDVFZDJLbkoyeWpOWGhXUSBfdEI4SWt5WDVFZDJLbkoyeWpOWGhXUSBfdEI4SWxpWDVFZDJLbkoyeWpOWGhXUSBfdEI4SW1TWDVFZDJLbkoyeWpOWGhXUSBfdEI4SWdTWDVFZDJLbkoyeWpOWGhXUSBfdEI4SW5DWDVFZDJLbkoyeWpOWGhXUSBfdEI4SW9pWDVFZDJLbkoyeWpOWGhXUSBfdEI4SXB5WDVFZDJLbkoyeWpOWGhXUSBfdEI4SW55WDVFZDJLbkoyeWpOWGhXUSBfdENGU2N5WDVFZDJLbkoyeWpOWGhXUSBfdENGU2VDWDVFZDJLbkoyeWpOWGhXUSBfdENGU2ZTWDVFZDJLbkoyeWpOWGhXUSBfdENGU2NDWDVFZDJLbkoyeWpOWGhXUSBfdENGU2d5WDVFZDJLbkoyeWpOWGhXUSBfdENGU2dDWDVFZDJLbkoyeWpOWGhXUSBfdENGU2pDWDVFZDJLbkoyeWpOWGhXUSBfdENGU2lDWDVFZDJLbkoyeWpOWGhXUSBfdENGU2tTWDVFZDJLbkoyeWpOWGhXUSBfdENGU2p5WDVFZDJLbkoyeWpOWGhXUSBfdENGU2x5WDVFZDJLbkoyeWpOWGhXUSBfdENGU2xTWDVFZDJLbkoyeWpOWGhXUSBfdENGU21pWDVFZDJLbkoyeWpOWGhXUSBfdENGU21DWDVFZDJLbkoyeWpOWGhXUSBfdENGU255WDVFZDJLbkoyeWpOWGhXUSBfdENGU25TWDVFZDJLbkoyeWpOWGhXUSBfdENGU3BDWDVFZDJLbkoyeWpOWGhXUSBfdENGU29pWDVFZDJLbkoyeWpOWGhXUSBfdENGU3FDWDVFZDJLbkoyeWpOWGhXUSBfdENGU3B5WDVFZDJLbkoyeWpOWGhXUSBfdENGU3F5WDVFZDJLbkoyeWpOWGhXUSBfdENGU3FTWDVFZDJLbkoyeWpOWGhXUSBfdENGU3J5WDVFZDJLbkoyeWpOWGhXUSBfdENGU3JpWDVFZDJLbkoyeWpOWGhXUSBfdENGU3RDWDVFZDJLbkoyeWpOWGhXUSBfdENGU3NpWDVFZDJLbkoyeWpOWGhXUSBfdENGU3RpWDVFZDJLbkoyeWpOWGhXUSBfdENGU3RTWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfdGs4dTlDWDVFZDJLbkoyeWpOWGhXUSIgc291cmNlPSJVbmlmaWVkTWV0aG9kQXJjaGl0ZWN0dXJlOjpVbmlmaWVkTWV0aG9kQXJjaGl0ZWN0dXJlOjpNZXRob2RQbHVnaW4iIHJlZmVyZW5jZXM9Il90QjhJZ1NYNUVkMktuSjJ5ak5YaFdRIF90QjhJbkNYNUVkMktuSjJ5ak5YaFdRIF90Q0ZTY0NYNUVkMktuSjJ5ak5YaFdRIF90REliVVNYNUVkMktuSjJ5ak5YaFdRIF90REliY0NYNUVkMktuSjJ5ak5YaFdRIF90S2xISUNYNUVkMktuSjJ5ak5YaFdRIF90V0RYVkNYNUVkMktuSjJ5ak5YaFdRIF90V0RYVnlYNUVkMktuSjJ5ak5YaFdRIF90V0RYV2lYNUVkMktuSjJ5ak5YaFdRIF90V0RYWFNYNUVkMktuSjJ5ak5YaFdRIF90V0RYVUNYNUVkMktuSjJ5ak5YaFdRIF90V0RYWXlYNUVkMktuSjJ5ak5YaFdRIF90V0RYWmlYNUVkMktuSjJ5ak5YaFdRIF90V0RYYXlYNUVkMktuSjJ5ak5YaFdRIF90V05JVXlYNUVkMktuSjJ5ak5YaFdRIF90V05JVmlYNUVkMktuSjJ5ak5YaFdRIF90V05JVUNYNUVkMktuSjJ5ak5YaFdRIF90V05JV3lYNUVkMktuSjJ5ak5YaFdRIF90V05JWXlYNUVkMktuSjJ5ak5YaFdRIF90V05JWVNYNUVkMktuSjJ5ak5YaFdRIF90V05JYUNYNUVkMktuSjJ5ak5YaFdRIF90V05JWmlYNUVkMktuSjJ5ak5YaFdRIF90V05JYlNYNUVkMktuSjJ5ak5YaFdRIF90V05JYXlYNUVkMktuSjJ5ak5YaFdRIF90V05JY2lYNUVkMktuSjJ5ak5YaFdRIF90V05JY0NYNUVkMktuSjJ5ak5YaFdRIF90V05JZHlYNUVkMktuSjJ5ak5YaFdRIF90V05JZFNYNUVkMktuSjJ5ak5YaFdRIF90V05JZXlYNUVkMktuSjJ5ak5YaFdRIF90V05JZWlYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il90azh1OVNYNUVkMktuSjJ5ak5YaFdRIiBzb3VyY2U9IlVuaWZpZWRNZXRob2RBcmNoaXRlY3R1cmU6OlVuaWZpZWRNZXRob2RBcmNoaXRlY3R1cmU6Ok1ldGhvZENvcmU6Okd1aWRhbmNlVHlwZXMiIHJlZmVyZW5jZXM9Il90QjhJbkNYNUVkMktuSjJ5ak5YaFdRIF90REliV2lYNUVkMktuSjJ5ak5YaFdRIF90REliY0NYNUVkMktuSjJ5ak5YaFdRIF90RUs5SVNYNUVkMktuSjJ5ak5YaFdRIF90RUs5SkNYNUVkMktuSjJ5ak5YaFdRIF90RUs5SnlYNUVkMktuSjJ5ak5YaFdRIF90RUs5S2lYNUVkMktuSjJ5ak5YaFdRIF90RUs5TFNYNUVkMktuSjJ5ak5YaFdRIF90RUs5TUNYNUVkMktuSjJ5ak5YaFdRIF90RUs5TXlYNUVkMktuSjJ5ak5YaFdRIF90RUs5TmlYNUVkMktuSjJ5ak5YaFdRIF90RUs5T1NYNUVkMktuSjJ5ak5YaFdRIF90RUs5UENYNUVkMktuSjJ5ak5YaFdRIF90RUs5UWlYNUVkMktuSjJ5ak5YaFdRIF90RUs5UlNYNUVkMktuSjJ5ak5YaFdRIF90RUs5UHlYNUVkMktuSjJ5ak5YaFdRIF90RUs5U1NYNUVkMktuSjJ5ak5YaFdRIF90RUs5VENYNUVkMktuSjJ5ak5YaFdRIF90RUs5VHlYNUVkMktuSjJ5ak5YaFdRIF90RUs5VWlYNUVkMktuSjJ5ak5YaFdRIF90RUs5VmlYNUVkMktuSjJ5ak5YaFdRIF90RUs5V1NYNUVkMktuSjJ5ak5YaFdRIF90RUs5WFNYNUVkMktuSjJ5ak5YaFdRIF90RUs5WUNYNUVkMktuSjJ5ak5YaFdRIF90RUs5WXlYNUVkMktuSjJ5ak5YaFdRIF90RVV1SUNYNUVkMktuSjJ5ak5YaFdRIF90RVV1SXlYNUVkMktuSjJ5ak5YaFdRIF90RVV1SmlYNUVkMktuSjJ5ak5YaFdRIF90RVV1S1NYNUVkMktuSjJ5ak5YaFdRIF90RVV1TENYNUVkMktuSjJ5ak5YaFdRIF90RVV1THlYNUVkMktuSjJ5ak5YaFdRIF90RVV1TkNYNUVkMktuSjJ5ak5YaFdRIF90RVV1TWlYNUVkMktuSjJ5ak5YaFdRIF90RVV1T1NYNUVkMktuSjJ5ak5YaFdRIF90RVV1TnlYNUVkMktuSjJ5ak5YaFdRIF90RVV1UGlYNUVkMktuSjJ5ak5YaFdRIF90RVV1UENYNUVkMktuSjJ5ak5YaFdRIF90RVV1UXlYNUVkMktuSjJ5ak5YaFdRIF90RVV1UVNYNUVkMktuSjJ5ak5YaFdRIF90RVV1U0NYNUVkMktuSjJ5ak5YaFdRIF90RVV1UmlYNUVkMktuSjJ5ak5YaFdRIF90RVV1VFNYNUVkMktuSjJ5ak5YaFdRIF90RVV1U3lYNUVkMktuSjJ5ak5YaFdRIF90RVV1VWlYNUVkMktuSjJ5ak5YaFdRIF90RVV1VUNYNUVkMktuSjJ5ak5YaFdRIF90RVV1VnlYNUVkMktuSjJ5ak5YaFdRIF90RVV1VlNYNUVkMktuSjJ5ak5YaFdRIF90RVV1WENYNUVkMktuSjJ5ak5YaFdRIF90RVV1V2lYNUVkMktuSjJ5ak5YaFdRIF90RVV1WHlYNUVkMktuSjJ5ak5YaFdRIF90RVV1WFNYNUVkMktuSjJ5ak5YaFdRIF90RVV1WkNYNUVkMktuSjJ5ak5YaFdRIF90RVV1WWlYNUVkMktuSjJ5ak5YaFdRIF90RVV1YUNYNUVkMktuSjJ5ak5YaFdRIF90RVV1WnlYNUVkMktuSjJ5ak5YaFdRIF90RVV1YkNYNUVkMktuSjJ5ak5YaFdRIF90RVV1YXlYNUVkMktuSjJ5ak5YaFdRIF90RVV1Y0NYNUVkMktuSjJ5ak5YaFdRIF90RVV1YnlYNUVkMktuSjJ5ak5YaFdRIF90RVV1ZENYNUVkMktuSjJ5ak5YaFdRIF90RVV1Y3lYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il90azh1OWlYNUVkMktuSjJ5ak5YaFdRIiBzb3VyY2U9IlVuaWZpZWRNZXRob2RBcmNoaXRlY3R1cmU6OlVuaWZpZWRNZXRob2RBcmNoaXRlY3R1cmU6Ok1ldGhvZENvcmU6Ok1ldGhvZENvcmVEZXNjcmlwdGlvbnMiIHJlZmVyZW5jZXM9Il90QjhJbnlYNUVkMktuSjJ5ak5YaFdRIF90Q0ZTaUNYNUVkMktuSjJ5ak5YaFdRIF90Rk5lOGlYNUVkMktuSjJ5ak5YaFdRIF90Rk5lOXlYNUVkMktuSjJ5ak5YaFdRIF90Rk5lX0NYNUVkMktuSjJ5ak5YaFdRIF90Rk5mQUNYNUVkMktuSjJ5ak5YaFdRIF90Rk5lOENYNUVkMktuSjJ5ak5YaFdRIF90Rk5mQmlYNUVkMktuSjJ5ak5YaFdRIF90Rk5mQ3lYNUVkMktuSjJ5ak5YaFdRIF90Rk5mQkNYNUVkMktuSjJ5ak5YaFdRIF90Rk5mRWlYNUVkMktuSjJ5ak5YaFdRIF90Rk5mRnlYNUVkMktuSjJ5ak5YaFdRIF90Rk5mSENYNUVkMktuSjJ5ak5YaFdRIF90Rk5mRUNYNUVkMktuSjJ5ak5YaFdRIF90Rk5mSXlYNUVkMktuSjJ5ak5YaFdRIF90Rk5mS0NYNUVkMktuSjJ5ak5YaFdRIF90Rk5mSVNYNUVkMktuSjJ5ak5YaFdRIF90Rk5mTHlYNUVkMktuSjJ5ak5YaFdRIF90Rk5mTkNYNUVkMktuSjJ5ak5YaFdRIF90Rk5mT1NYNUVkMktuSjJ5ak5YaFdRIF90Rk5mTFNYNUVkMktuSjJ5ak5YaFdRIF90Rk5mUUNYNUVkMktuSjJ5ak5YaFdRIF90Rk5mUGlYNUVkMktuSjJ5ak5YaFdRIF90Rk5mUnlYNUVkMktuSjJ5ak5YaFdRIF90Rk5mVENYNUVkMktuSjJ5ak5YaFdRIF90Rk5mVVNYNUVkMktuSjJ5ak5YaFdRIF90Rk5mVmlYNUVkMktuSjJ5ak5YaFdRIF90Rk5mV3lYNUVkMktuSjJ5ak5YaFdRIF90Rk5mWUNYNUVkMktuSjJ5ak5YaFdRIF90Rk5mUlNYNUVkMktuSjJ5ak5YaFdRIF90Rk5mWmlYNUVkMktuSjJ5ak5YaFdRIF90Rk5mYWlYNUVkMktuSjJ5ak5YaFdRIF90Rk5mYmlYNUVkMktuSjJ5ak5YaFdRIF90Rk5mY3lYNUVkMktuSjJ5ak5YaFdRIF90Rk5mZUNYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il90azh1OXlYNUVkMktuSjJ5ak5YaFdRIiBzb3VyY2U9IlVuaWZpZWRNZXRob2RBcmNoaXRlY3R1cmU6OlVuaWZpZWRNZXRob2RBcmNoaXRlY3R1cmU6Ok1ldGhvZExpYnJhcnk6Ok1ldGhvZFVuaXRzIiByZWZlcmVuY2VzPSJfdEI4SW55WDVFZDJLbkoyeWpOWGhXUSBfdFRYMndDWDVFZDJLbkoyeWpOWGhXUSBfdFdEWFVDWDVFZDJLbkoyeWpOWGhXUSBfdGUyRzlTWDVFZDJLbkoyeWpOWGhXUSBfdGUyRy1pWDVFZDJLbkoyeWpOWGhXUSBfdGUyR19pWDVFZDJLbkoyeWpOWGhXUSBfdGUySEF5WDVFZDJLbkoyeWpOWGhXUSBfdGUySENDWDVFZDJLbkoyeWpOWGhXUSBfdGUyRzhpWDVFZDJLbkoyeWpOWGhXUSBfdGUySERpWDVFZDJLbkoyeWpOWGhXUSBfdGUySERDWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfdGs4dS1DWDVFZDJLbkoyeWpOWGhXUSIgc291cmNlPSJVbmlmaWVkTWV0aG9kQXJjaGl0ZWN0dXJlOjpVbmlmaWVkTWV0aG9kQXJjaGl0ZWN0dXJlOjpNZXRob2RDb3JlOjpDb3JlQ29udGVudEVsZW1lbnRzIiByZWZlcmVuY2VzPSJfdERJYlZDWDVFZDJLbkoyeWpOWGhXUSBfdERJYlZ5WDVFZDJLbkoyeWpOWGhXUSBfdERJYlVTWDVFZDJLbkoyeWpOWGhXUSBfdERJYlhpWDVFZDJLbkoyeWpOWGhXUSBfdERJYllTWDVFZDJLbkoyeWpOWGhXUSBfdERJYlpDWDVFZDJLbkoyeWpOWGhXUSBfdERJYlp5WDVFZDJLbkoyeWpOWGhXUSBfdERJYmFpWDVFZDJLbkoyeWpOWGhXUSBfdERJYmJTWDVFZDJLbkoyeWpOWGhXUSBfdERJYldpWDVFZDJLbkoyeWpOWGhXUSBfdERJYmNDWDVFZDJLbkoyeWpOWGhXUSBfdERJYmN5WDVFZDJLbkoyeWpOWGhXUSBfdERJYmVTWDVFZDJLbkoyeWpOWGhXUSBfdERJYmZDWDVFZDJLbkoyeWpOWGhXUSBfdERJYmRpWDVFZDJLbkoyeWpOWGhXUSBfdERJYmdpWDVFZDJLbkoyeWpOWGhXUSBfdERJYmZ5WDVFZDJLbkoyeWpOWGhXUSBfdERJYmhTWDVFZDJLbkoyeWpOWGhXUSBfdERJYmlDWDVFZDJLbkoyeWpOWGhXUSBfdERJYmp5WDVFZDJLbkoyeWpOWGhXUSBfdERJYmtpWDVFZDJLbkoyeWpOWGhXUSBfdERJYmpDWDVFZDJLbkoyeWpOWGhXUSBfdERJYmx5WDVFZDJLbkoyeWpOWGhXUSBfdERJYmxTWDVFZDJLbkoyeWpOWGhXUSBfdERJYm5DWDVFZDJLbkoyeWpOWGhXUSBfdERJYm1pWDVFZDJLbkoyeWpOWGhXUSBfdERJYm9TWDVFZDJLbkoyeWpOWGhXUSBfdERJYm55WDVFZDJLbkoyeWpOWGhXUSBfdERJYnBpWDVFZDJLbkoyeWpOWGhXUSBfdERJYnBDWDVFZDJLbkoyeWpOWGhXUSBfdERJYnF5WDVFZDJLbkoyeWpOWGhXUSBfdERJYnFTWDVFZDJLbkoyeWpOWGhXUSBfdERJYnNDWDVFZDJLbkoyeWpOWGhXUSBfdERJYnJpWDVFZDJLbkoyeWpOWGhXUSBfdERJYnN5WDVFZDJLbkoyeWpOWGhXUSBfdERJYnR5WDVFZDJLbkoyeWpOWGhXUSBfdERJYnRTWDVFZDJLbkoyeWpOWGhXUSBfdERJYnZDWDVFZDJLbkoyeWpOWGhXUSBfdERJYnVpWDVFZDJLbkoyeWpOWGhXUSBfdERJYndTWDVFZDJLbkoyeWpOWGhXUSBfdERJYnZ5WDVFZDJLbkoyeWpOWGhXUSBfdERJYnhDWDVFZDJLbkoyeWpOWGhXUSBfdERJYndpWDVFZDJLbkoyeWpOWGhXUSBfdERJYnh5WDVFZDJLbkoyeWpOWGhXUSBfdERJYnhTWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfdGs4dS1TWDVFZDJLbkoyeWpOWGhXUSIgc291cmNlPSJVbmlmaWVkTWV0aG9kQXJjaGl0ZWN0dXJlOjpVbmlmaWVkTWV0aG9kQXJjaGl0ZWN0dXJlOjpQcm9jZXNzOjpQcm9jZXNzVHlwZXMiIHJlZmVyZW5jZXM9Il90RUs5UHlYNUVkMktuSjJ5ak5YaFdRIF90R1p4d1NYNUVkMktuSjJ5ak5YaFdRIF90S2xISUNYNUVkMktuSjJ5ak5YaFdRIF90S2xIV3lYNUVkMktuSjJ5ak5YaFdRIF90T0pfa3lYNUVkMktuSjJ5ak5YaFdRIF90T0pfbGlYNUVkMktuSjJ5ak5YaFdRIF90T0pfa0NYNUVkMktuSjJ5ak5YaFdRIF90T0pfbkNYNUVkMktuSjJ5ak5YaFdRIF90T0pfbVNYNUVkMktuSjJ5ak5YaFdRIF90T0pfb2lYNUVkMktuSjJ5ak5YaFdRIF90T0pfbnlYNUVkMktuSjJ5ak5YaFdRIF90T0pfcFNYNUVkMktuSjJ5ak5YaFdRIF90T0pfcWlYNUVkMktuSjJ5ak5YaFdRIF90T0pfcmlYNUVkMktuSjJ5ak5YaFdRIF90T0pfc1NYNUVkMktuSjJ5ak5YaFdRIF90T0pfdENYNUVkMktuSjJ5ak5YaFdRIF90T1RKZ2lYNUVkMktuSjJ5ak5YaFdRIF90T1RKZ0NYNUVkMktuSjJ5ak5YaFdRIF90T1RKaHlYNUVkMktuSjJ5ak5YaFdRIF90T1RKaFNYNUVkMktuSjJ5ak5YaFdRIF90T1RKakNYNUVkMktuSjJ5ak5YaFdRIF90T1RKaWlYNUVkMktuSjJ5ak5YaFdRIF90T1RKanlYNUVkMktuSjJ5ak5YaFdRIF90T1RKalNYNUVkMktuSjJ5ak5YaFdRIF90T1RKbENYNUVkMktuSjJ5ak5YaFdRIF90T1RKa2lYNUVkMktuSjJ5ak5YaFdRIF90T1RKbVNYNUVkMktuSjJ5ak5YaFdRIF90T1RKbHlYNUVkMktuSjJ5ak5YaFdRIF90T1RKbkNYNUVkMktuSjJ5ak5YaFdRIF90T1RKb0NYNUVkMktuSjJ5ak5YaFdRIF90T1RKbmlYNUVkMktuSjJ5ak5YaFdRIF90T1RKcENYNUVkMktuSjJ5ak5YaFdRIF90T1RKb3lYNUVkMktuSjJ5ak5YaFdRIF90T1RKcVNYNUVkMktuSjJ5ak5YaFdRIF90T1RKcHlYNUVkMktuSjJ5ak5YaFdRIF90T1RKcmlYNUVkMktuSjJ5ak5YaFdRIF90T1RKckNYNUVkMktuSjJ5ak5YaFdRIF90T1RKc3lYNUVkMktuSjJ5ak5YaFdRIF90T1RKc1NYNUVkMktuSjJ5ak5YaFdRIF90T1RKdUNYNUVkMktuSjJ5ak5YaFdRIF90T1RKdGlYNUVkMktuSjJ5ak5YaFdRIF90T1RKdlNYNUVkMktuSjJ5ak5YaFdRIF90T1RKdXlYNUVkMktuSjJ5ak5YaFdRIF90T1RKd2lYNUVkMktuSjJ5ak5YaFdRIF90T1RKd0NYNUVkMktuSjJ5ak5YaFdRIF90T1RKeFNYNUVkMktuSjJ5ak5YaFdRIF90T1RKeUNYNUVkMktuSjJ5ak5YaFdRIF90T1RKeXlYNUVkMktuSjJ5ak5YaFdRIF90T1RKemlYNUVkMktuSjJ5ak5YaFdRIF90T1RKMFNYNUVkMktuSjJ5ak5YaFdRIF90T1RKMUNYNUVkMktuSjJ5ak5YaFdRIF90T1RKMXlYNUVkMktuSjJ5ak5YaFdRIF90T1RKMmlYNUVkMktuSjJ5ak5YaFdRIF90T1RKM1NYNUVkMktuSjJ5ak5YaFdRIF90T1RKNENYNUVkMktuSjJ5ak5YaFdRIF90T2M2Z1NYNUVkMktuSjJ5ak5YaFdRIF90T2M2Z0NYNUVkMktuSjJ5ak5YaFdRIF90T2M2aFNYNUVkMktuSjJ5ak5YaFdRIF90T2M2aENYNUVkMktuSjJ5ak5YaFdRIF90T2M2aVNYNUVkMktuSjJ5ak5YaFdRIF90T2M2aUNYNUVkMktuSjJ5ak5YaFdRIF90T2M2alNYNUVkMktuSjJ5ak5YaFdRIF90T2M2akNYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il90bEdmOENYNUVkMktuSjJ5ak5YaFdRIiBzb3VyY2U9IlVuaWZpZWRNZXRob2RBcmNoaXRlY3R1cmU6OlVuaWZpZWRNZXRob2RBcmNoaXRlY3R1cmU6Ok1ldGhvZENvcmU6OkNhdGVnb3JpZXMiIHJlZmVyZW5jZXM9Il90R1p4eENYNUVkMktuSjJ5ak5YaFdRIF90R1p4eHlYNUVkMktuSjJ5ak5YaFdRIF90R1p4d1NYNUVkMktuSjJ5ak5YaFdRIF90R1p4elNYNUVkMktuSjJ5ak5YaFdRIF90R1p4eWlYNUVkMktuSjJ5ak5YaFdRIF90R1p4MHlYNUVkMktuSjJ5ak5YaFdRIF90R1p4MWlYNUVkMktuSjJ5ak5YaFdRIF90R1p4MENYNUVkMktuSjJ5ak5YaFdRIF90R1p4M0NYNUVkMktuSjJ5ak5YaFdRIF90R1p4MlNYNUVkMktuSjJ5ak5YaFdRIF90R1p4M3lYNUVkMktuSjJ5ak5YaFdRIF90R1p4NVNYNUVkMktuSjJ5ak5YaFdRIF90R1p4NGlYNUVkMktuSjJ5ak5YaFdRIF90R1p4NnlYNUVkMktuSjJ5ak5YaFdRIF90R1p4NkNYNUVkMktuSjJ5ak5YaFdRIF90R1p4OFNYNUVkMktuSjJ5ak5YaFdRIF90R1p4N2lYNUVkMktuSjJ5ak5YaFdRIF90R2ppd3lYNUVkMktuSjJ5ak5YaFdRIF90R2ppeGlYNUVkMktuSjJ5ak5YaFdRIF90R2ppd0NYNUVkMktuSjJ5ak5YaFdRIF90R2ppeXlYNUVkMktuSjJ5ak5YaFdRIF90R2ppeVNYNUVkMktuSjJ5ak5YaFdRIF90R2ppMENYNUVkMktuSjJ5ak5YaFdRIF90R2ppemlYNUVkMktuSjJ5ak5YaFdRIF90R2ppMVNYNUVkMktuSjJ5ak5YaFdRIF90R2ppMHlYNUVkMktuSjJ5ak5YaFdRIF90R2ppMkNYNUVkMktuSjJ5ak5YaFdRIF90R2ppMWlYNUVkMktuSjJ5ak5YaFdRIF90R2ppM1NYNUVkMktuSjJ5ak5YaFdRIF90R2ppMnlYNUVkMktuSjJ5ak5YaFdRIF90R2ppNGlYNUVkMktuSjJ5ak5YaFdRIF90R2ppNENYNUVkMktuSjJ5ak5YaFdRIF90R2ppNXlYNUVkMktuSjJ5ak5YaFdRIF90R2ppNVNYNUVkMktuSjJ5ak5YaFdRIF90R2ppN0NYNUVkMktuSjJ5ak5YaFdRIF90R2ppNmlYNUVkMktuSjJ5ak5YaFdRIF90R2ppOFNYNUVkMktuSjJ5ak5YaFdRIF90R2ppN3lYNUVkMktuSjJ5ak5YaFdRIF90R2ppOWlYNUVkMktuSjJ5ak5YaFdRIF90R2ppOUNYNUVkMktuSjJ5ak5YaFdRIF90R2ppLWlYNUVkMktuSjJ5ak5YaFdRIF90R2ppLVNYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il90bEdmOFNYNUVkMktuSjJ5ak5YaFdRIiBzb3VyY2U9IlVuaWZpZWRNZXRob2RBcmNoaXRlY3R1cmU6OlVuaWZpZWRNZXRob2RBcmNoaXRlY3R1cmU6Ok1ldGhvZENvcmU6Ok1ldGhvZFBhY2thZ2UiIHJlZmVyZW5jZXM9Il90SGM2cFNYNUVkMktuSjJ5ak5YaFdRIF90SGM2cUNYNUVkMktuSjJ5ak5YaFdRIF90SGM2cXlYNUVkMktuSjJ5ak5YaFdRIF90SGM2b1NYNUVkMktuSjJ5ak5YaFdRIF90SGM2c1NYNUVkMktuSjJ5ak5YaFdRIF90SGM2cmlYNUVkMktuSjJ5ak5YaFdRIF90SGM2dGlYNUVkMktuSjJ5ak5YaFdRIF90SGM2dENYNUVkMktuSjJ5ak5YaFdRIF90SGM2dXlYNUVkMktuSjJ5ak5YaFdRIF90SGM2dVNYNUVkMktuSjJ5ak5YaFdRIF90SGM2d0NYNUVkMktuSjJ5ak5YaFdRIF90SGM2dmlYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il90bEdmOGlYNUVkMktuSjJ5ak5YaFdRIiBzb3VyY2U9IlVuaWZpZWRNZXRob2RBcmNoaXRlY3R1cmU6OlVuaWZpZWRNZXRob2RBcmNoaXRlY3R1cmU6OlByb2Nlc3M6OkJyZWFrZG93biIgcmVmZXJlbmNlcz0iX3RLbEhKQ1g1RWQyS25KMnlqTlhoV1EgX3RLbEhJQ1g1RWQyS25KMnlqTlhoV1EgX3RLbEhLaVg1RWQyS25KMnlqTlhoV1EgX3RLbEhKeVg1RWQyS25KMnlqTlhoV1EgX3RLbEhMU1g1RWQyS25KMnlqTlhoV1EgX3RLbEhNQ1g1RWQyS25KMnlqTlhoV1EgX3RLbEhOaVg1RWQyS25KMnlqTlhoV1EgX3RLbEhPU1g1RWQyS25KMnlqTlhoV1EgX3RLbEhQQ1g1RWQyS25KMnlqTlhoV1EgX3RLbEhNeVg1RWQyS25KMnlqTlhoV1EgX3RLbEhQeVg1RWQyS25KMnlqTlhoV1EgX3RLbEhUQ1g1RWQyS25KMnlqTlhoV1EgX3RLbEhUeVg1RWQyS25KMnlqTlhoV1EgX3RLbEhTU1g1RWQyS25KMnlqTlhoV1EgX3RLbEhWU1g1RWQyS25KMnlqTlhoV1EgX3RLbEhWeVg1RWQyS25KMnlqTlhoV1EgX3RLbEhXU1g1RWQyS25KMnlqTlhoV1EgX3RLbEhVaVg1RWQyS25KMnlqTlhoV1EgX3RLbEhYeVg1RWQyS25KMnlqTlhoV1EgX3RLbEhaQ1g1RWQyS25KMnlqTlhoV1EgX3RLbEhaeVg1RWQyS25KMnlqTlhoV1EgX3RLbEhhaVg1RWQyS25KMnlqTlhoV1EgX3RLbEhiU1g1RWQyS25KMnlqTlhoV1EgX3RLbEhjQ1g1RWQyS25KMnlqTlhoV1EgX3RLbEhjeVg1RWQyS25KMnlqTlhoV1EgX3RLbEhkaVg1RWQyS25KMnlqTlhoV1EgX3RLbEhXeVg1RWQyS25KMnlqTlhoV1EgX3RLbEhmQ1g1RWQyS25KMnlqTlhoV1EgX3RLbEhlU1g1RWQyS25KMnlqTlhoV1EgX3RLbEhnU1g1RWQyS25KMnlqTlhoV1EgX3RLbEhoQ1g1RWQyS25KMnlqTlhoV1EgX3RLbEhoeVg1RWQyS25KMnlqTlhoV1EgX3RLbEhmaVg1RWQyS25KMnlqTlhoV1EgX3RLbEhqaVg1RWQyS25KMnlqTlhoV1EgX3RLbEhrU1g1RWQyS25KMnlqTlhoV1EgX3RLbEhsQ1g1RWQyS25KMnlqTlhoV1EgX3RLbEhseVg1RWQyS25KMnlqTlhoV1EgX3RLbEhtaVg1RWQyS25KMnlqTlhoV1EgX3RLbEhuU1g1RWQyS25KMnlqTlhoV1EgX3RLbEhvQ1g1RWQyS25KMnlqTlhoV1EgX3RLbEhveVg1RWQyS25KMnlqTlhoV1EgX3RLbEhwaVg1RWQyS25KMnlqTlhoV1EgX3RLbEhpaVg1RWQyS25KMnlqTlhoV1EgX3RLbEhyQ1g1RWQyS25KMnlqTlhoV1EgX3RLbEhzU1g1RWQyS25KMnlqTlhoV1EgX3RLbEh0aVg1RWQyS25KMnlqTlhoV1EgX3RLbEh1U1g1RWQyS25KMnlqTlhoV1EgX3RLbEh2Q1g1RWQyS25KMnlqTlhoV1EgX3RLbEh2eVg1RWQyS25KMnlqTlhoV1EgX3RLbEhxU1g1RWQyS25KMnlqTlhoV1EgX3RLdVJFeVg1RWQyS25KMnlqTlhoV1EgX3RLdVJFQ1g1RWQyS25KMnlqTlhoV1EgX3RLdVJHU1g1RWQyS25KMnlqTlhoV1EgX3RLdVJIQ1g1RWQyS25KMnlqTlhoV1EgX3RLdVJIeVg1RWQyS25KMnlqTlhoV1EgX3RLdVJJaVg1RWQyS25KMnlqTlhoV1EgX3RLdVJGaVg1RWQyS25KMnlqTlhoV1EgX3RLdVJKU1g1RWQyS25KMnlqTlhoV1EgX3RLdVJLaVg1RWQyS25KMnlqTlhoV1EgX3RLdVJLQ1g1RWQyS25KMnlqTlhoV1EgX3RLdVJMU1g1RWQyS25KMnlqTlhoV1EgX3RLdVJNU1g1RWQyS25KMnlqTlhoV1EgX3RLdVJMeVg1RWQyS25KMnlqTlhoV1EgX3RLdVJOaVg1RWQyS25KMnlqTlhoV1EgX3RLdVJOQ1g1RWQyS25KMnlqTlhoV1EgX3RLdVJPeVg1RWQyS25KMnlqTlhoV1EgX3RLdVJPU1g1RWQyS25KMnlqTlhoV1EgX3RLdVJRQ1g1RWQyS25KMnlqTlhoV1EgX3RLdVJQaVg1RWQyS25KMnlqTlhoV1EgX3RLdVJSU1g1RWQyS25KMnlqTlhoV1EgX3RLdVJReVg1RWQyS25KMnlqTlhoV1EgX3RLdVJTaVg1RWQyS25KMnlqTlhoV1EgX3RLdVJTQ1g1RWQyS25KMnlqTlhoV1EgX3RLdVJUeVg1RWQyS25KMnlqTlhoV1EgX3RLdVJUU1g1RWQyS25KMnlqTlhoV1EgX3RLdVJVaVg1RWQyS25KMnlqTlhoV1EgX3RLdVJWaVg1RWQyS25KMnlqTlhoV1EgX3RLdVJWQ1g1RWQyS25KMnlqTlhoV1EgX3RLdVJXeVg1RWQyS25KMnlqTlhoV1EgX3RLdVJXU1g1RWQyS25KMnlqTlhoV1EgX3RLdVJZQ1g1RWQyS25KMnlqTlhoV1EgX3RLdVJYaVg1RWQyS25KMnlqTlhoV1EgX3RLdVJaU1g1RWQyS25KMnlqTlhoV1EgX3RLdVJZeVg1RWQyS25KMnlqTlhoV1EgX3RMQnpFaVg1RWQyS25KMnlqTlhoV1EgX3RMQnpFQ1g1RWQyS25KMnlqTlhoV1EgX3RMQnpGeVg1RWQyS25KMnlqTlhoV1EgX3RMQnpGU1g1RWQyS25KMnlqTlhoV1EgX3RMQnpIQ1g1RWQyS25KMnlqTlhoV1EgX3RMQnpHaVg1RWQyS25KMnlqTlhoV1EgX3RMQnpJQ1g1RWQyS25KMnlqTlhoV1EgX3RMQnpIeVg1RWQyS25KMnlqTlhoV1EgX3RMQnpKU1g1RWQyS25KMnlqTlhoV1EgX3RMQnpJeVg1RWQyS25KMnlqTlhoV1EgX3RMQnpLaVg1RWQyS25KMnlqTlhoV1EgX3RMQnpLQ1g1RWQyS25KMnlqTlhoV1EgX3RMQnpMeVg1RWQyS25KMnlqTlhoV1EgX3RMQnpMU1g1RWQyS25KMnlqTlhoV1EgX3RMSzlBU1g1RWQyS25KMnlqTlhoV1EgX3RMSzlBQ1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iX3RsR2Y4eVg1RWQyS25KMnlqTlhoV1EiIHNvdXJjZT0iVW5pZmllZE1ldGhvZEFyY2hpdGVjdHVyZTo6VW5pZmllZE1ldGhvZEFyY2hpdGVjdHVyZTo6TWV0aG9kTGlicmFyeTo6TGlicmFyeUNvbmZpZ3VyYXRpb25zIiByZWZlcmVuY2VzPSJfdE9KX21TWDVFZDJLbkoyeWpOWGhXUSBfdGhobmhDWDVFZDJLbkoyeWpOWGhXUSBfdGhobmh5WDVFZDJLbkoyeWpOWGhXUSBfdGhobmlpWDVFZDJLbkoyeWpOWGhXUSBfdGhobmpTWDVFZDJLbkoyeWpOWGhXUSBfdGhobmtDWDVFZDJLbkoyeWpOWGhXUSBfdGhobmt5WDVFZDJLbkoyeWpOWGhXUSBfdGhobmxpWDVFZDJLbkoyeWpOWGhXUSBfdGhobmdDWDVFZDJLbkoyeWpOWGhXUSBfdGhobm5DWDVFZDJLbkoyeWpOWGhXUSBfdGhobm1TWDVFZDJLbkoyeWpOWGhXUSBfdGhobm9DWDVFZDJLbkoyeWpOWGhXUSBfdGhobm95WDVFZDJLbkoyeWpOWGhXUSBfdGhyWWhDWDVFZDJLbkoyeWpOWGhXUSBfdGhyWWh5WDVFZDJLbkoyeWpOWGhXUSBfdGhyWWdDWDVFZDJLbkoyeWpOWGhXUSBfdGhyWWpDWDVFZDJLbkoyeWpOWGhXUSBfdGhyWWlpWDVFZDJLbkoyeWpOWGhXUSBfdGhyWWtTWDVFZDJLbkoyeWpOWGhXUSBfdGhyWWp5WDVFZDJLbkoyeWpOWGhXUSBfdGhyWWxpWDVFZDJLbkoyeWpOWGhXUSBfdGhyWWxDWDVFZDJLbkoyeWpOWGhXUSBfdGhyWW15WDVFZDJLbkoyeWpOWGhXUSBfdGhyWW1TWDVFZDJLbkoyeWpOWGhXUSBfdGhyWW5pWDVFZDJLbkoyeWpOWGhXUSBfdGhyWW5DWDVFZDJLbkoyeWpOWGhXUSBfdGhyWW9TWDVFZDJLbkoyeWpOWGhXUSBfdGhyWW55WDVFZDJLbkoyeWpOWGhXUSBfdGhyWXBpWDVFZDJLbkoyeWpOWGhXUSBfdGhyWXBDWDVFZDJLbkoyeWpOWGhXUSBfdGhyWXFpWDVFZDJLbkoyeWpOWGhXUSBfdGhyWXFTWDVFZDJLbkoyeWpOWGhXUSBfdGhyWXJpWDVFZDJLbkoyeWpOWGhXUSBfdGhyWXJTWDVFZDJLbkoyeWpOWGhXUSBfdGhyWXN5WDVFZDJLbkoyeWpOWGhXUSBfdGhyWXNTWDVFZDJLbkoyeWpOWGhXUSBfdGhyWXR5WDVFZDJLbkoyeWpOWGhXUSBfdGhyWXRpWDVFZDJLbkoyeWpOWGhXUSBfdGhyWXV5WDVFZDJLbkoyeWpOWGhXUSBfdGhyWXVpWDVFZDJLbkoyeWpOWGhXUSBfdGhyWXZpWDVFZDJLbkoyeWpOWGhXUSBfdGhyWXZDWDVFZDJLbkoyeWpOWGhXUSBfdGhyWXdpWDVFZDJLbkoyeWpOWGhXUSBfdGhyWXdTWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfdGxHZjlDWDVFZDJLbkoyeWpOWGhXUSIgc291cmNlPSJVbmlmaWVkTWV0aG9kQXJjaGl0ZWN0dXJlOjpVbmlmaWVkTWV0aG9kQXJjaGl0ZWN0dXJlOjpQcm9jZXNzOjpQcm9jZXNzRGVzY3JpcHRpb25zIiByZWZlcmVuY2VzPSJfdFFydklpWDVFZDJLbkoyeWpOWGhXUSBfdFFydklDWDVFZDJLbkoyeWpOWGhXUSBfdFFydktTWDVFZDJLbkoyeWpOWGhXUSBfdFFydkxpWDVFZDJLbkoyeWpOWGhXUSBfdFFydk15WDVFZDJLbkoyeWpOWGhXUSBfdFFydkp5WDVFZDJLbkoyeWpOWGhXUSBfdFExZ0lpWDVFZDJLbkoyeWpOWGhXUSBfdFExZ0p5WDVFZDJLbkoyeWpOWGhXUSBfdFExZ0xDWDVFZDJLbkoyeWpOWGhXUSBfdFExZ01TWDVFZDJLbkoyeWpOWGhXUSBfdFExZ05pWDVFZDJLbkoyeWpOWGhXUSBfdFExZ095WDVFZDJLbkoyeWpOWGhXUSBfdFExZ0lDWDVFZDJLbkoyeWpOWGhXUSBfdFExZ1FpWDVFZDJLbkoyeWpOWGhXUSBfdFExZ1J5WDVFZDJLbkoyeWpOWGhXUSBfdFExZ1FDWDVFZDJLbkoyeWpOWGhXUSBfdFExZ1RpWDVFZDJLbkoyeWpOWGhXUSBfdFExZ1RDWDVFZDJLbkoyeWpOWGhXUSBfdFExZ1ZTWDVFZDJLbkoyeWpOWGhXUSBfdFExZ1V5WDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfdGxHZjlTWDVFZDJLbkoyeWpOWGhXUSIgc291cmNlPSJVbmlmaWVkTWV0aG9kQXJjaGl0ZWN0dXJlOjpVbmlmaWVkTWV0aG9kQXJjaGl0ZWN0dXJlOjpQcm9jZXNzOjpQcm9jZXNzUGFja2FnZSIgcmVmZXJlbmNlcz0iX3RUWDJ4U1g1RWQyS25KMnlqTlhoV1EgX3RUWDJ5Q1g1RWQyS25KMnlqTlhoV1EgX3RUWDJ3Q1g1RWQyS25KMnlqTlhoV1EgX3RUWDJ6aVg1RWQyS25KMnlqTlhoV1EgX3RUWDJ5eVg1RWQyS25KMnlqTlhoV1EgX3RUWDIxQ1g1RWQyS25KMnlqTlhoV1EgX3RUWDIxeVg1RWQyS25KMnlqTlhoV1EgX3RUWDIwU1g1RWQyS25KMnlqTlhoV1EgX3RUWDIzU1g1RWQyS25KMnlqTlhoV1EgX3RUWDIyaVg1RWQyS25KMnlqTlhoV1EgX3RUWDI0aVg1RWQyS25KMnlqTlhoV1EgX3RUWDI0Q1g1RWQyS25KMnlqTlhoV1EgX3RUWDI1eVg1RWQyS25KMnlqTlhoV1EgX3RUWDI1U1g1RWQyS25KMnlqTlhoV1EgX3RUWDI3Q1g1RWQyS25KMnlqTlhoV1EgX3RUWDI2aVg1RWQyS25KMnlqTlhoV1EgX3RUWDI4U1g1RWQyS25KMnlqTlhoV1EgX3RUWDI3eVg1RWQyS25KMnlqTlhoV1EgX3RUWDI5aVg1RWQyS25KMnlqTlhoV1EgX3RUWDI5Q1g1RWQyS25KMnlqTlhoV1EgX3RUWDIteVg1RWQyS25KMnlqTlhoV1EgX3RUWDItU1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iX3RsR2Y5aVg1RWQyS25KMnlqTlhoV1EiIHNvdXJjZT0iVW5pZmllZE1ldGhvZEFyY2hpdGVjdHVyZTo6VW5pZmllZE1ldGhvZEFyY2hpdGVjdHVyZTo6UHJvY2Vzc0RpYWdyYW1zX2RlcHJlY2F0ZWQ6OlVNQURpYWdyYW1zIiByZWZlcmVuY2VzPSJfdFRYMjJpWDVFZDJLbkoyeWpOWGhXUSBfdGNBMVlDWDVFZDJLbkoyeWpOWGhXUSBfdGNBMVpTWDVFZDJLbkoyeWpOWGhXUSBfdGNBMVl5WDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfdGxHZjl5WDVFZDJLbkoyeWpOWGhXUSIgc291cmNlPSJVbmlmaWVkTWV0aG9kQXJjaGl0ZWN0dXJlOjpVTUwyRGlhZ3JhbUludGVyY2hhbmdlX2RlcHJlY2F0ZWQiIHJlZmVyZW5jZXM9Il90WXUzNFNYNUVkMktuSjJ5ak5YaFdRIF90WXUzNGlYNUVkMktuSjJ5ak5YaFdRIF90WXUzNENYNUVkMktuSjJ5ak5YaFdRIF90WXUzNVNYNUVkMktuSjJ5ak5YaFdRIF90WXUzNWlYNUVkMktuSjJ5ak5YaFdRIF90WXUzNlNYNUVkMktuSjJ5ak5YaFdRIF90WXUzN0NYNUVkMktuSjJ5ak5YaFdRIF90WXUzN3lYNUVkMktuSjJ5ak5YaFdRIF90WXUzNHlYNUVkMktuSjJ5ak5YaFdRIF90WXUzOHlYNUVkMktuSjJ5ak5YaFdRIF90WXUzOUNYNUVkMktuSjJ5ak5YaFdRIF90WXUzOGlYNUVkMktuSjJ5ak5YaFdRIF90WTRvNGlYNUVkMktuSjJ5ak5YaFdRIF90WTRvNUNYNUVkMktuSjJ5ak5YaFdRIF90WTRvNXlYNUVkMktuSjJ5ak5YaFdRIF90WTRvNmlYNUVkMktuSjJ5ak5YaFdRIF90WTRvNENYNUVkMktuSjJ5ak5YaFdRIF90WTRvN3lYNUVkMktuSjJ5ak5YaFdRIF90WTRvOFNYNUVkMktuSjJ5ak5YaFdRIF90WTRvN1NYNUVkMktuSjJ5ak5YaFdRIF90WTRvOWlYNUVkMktuSjJ5ak5YaFdRIF90WTRvLWlYNUVkMktuSjJ5ak5YaFdRIF90WTRvOUNYNUVkMktuSjJ5ak5YaFdRIF90WTRwQUNYNUVkMktuSjJ5ak5YaFdRIF90WTRwQXlYNUVkMktuSjJ5ak5YaFdRIF90WTRvX2lYNUVkMktuSjJ5ak5YaFdRIF90WTRwQ0NYNUVkMktuSjJ5ak5YaFdRIF90WTRwQ3lYNUVkMktuSjJ5ak5YaFdRIF90WTRwQmlYNUVkMktuSjJ5ak5YaFdRIF90WTRwRUNYNUVkMktuSjJ5ak5YaFdRIF90WTRwRVNYNUVkMktuSjJ5ak5YaFdRIF90WTRwRWlYNUVkMktuSjJ5ak5YaFdRIF90WTRwRlNYNUVkMktuSjJ5ak5YaFdRIF90WTRwRGlYNUVkMktuSjJ5ak5YaFdRIF90WTRwR2lYNUVkMktuSjJ5ak5YaFdRIF90WTRwR0NYNUVkMktuSjJ5ak5YaFdRIF90WTRwSFNYNUVkMktuSjJ5ak5YaFdRIF90WTRwSUNYNUVkMktuSjJ5ak5YaFdRIF90WTRwSVNYNUVkMktuSjJ5ak5YaFdRIF90WTRwSkNYNUVkMktuSjJ5ak5YaFdRIF90WTRwR3lYNUVkMktuSjJ5ak5YaFdRIF90WTRwS1NYNUVkMktuSjJ5ak5YaFdRIF90WTRwTFNYNUVkMktuSjJ5ak5YaFdRIF90WTRwTUNYNUVkMktuSjJ5ak5YaFdRIF90WTRwSnlYNUVkMktuSjJ5ak5YaFdRIF90WTRwTlNYNUVkMktuSjJ5ak5YaFdRIF90WTRwTXlYNUVkMktuSjJ5ak5YaFdRIF90WTRwT3lYNUVkMktuSjJ5ak5YaFdRIF90WTRwT1NYNUVkMktuSjJ5ak5YaFdRIF90WTRwUUNYNUVkMktuSjJ5ak5YaFdRIF90WTRwUGlYNUVkMktuSjJ5ak5YaFdRIF90WTRwUXlYNUVkMktuSjJ5ak5YaFdRIF90WTRwUnlYNUVkMktuSjJ5ak5YaFdRIF90WTRwUlNYNUVkMktuSjJ5ak5YaFdRIF90WTRwVFNYNUVkMktuSjJ5ak5YaFdRIF90WTRwVUNYNUVkMktuSjJ5ak5YaFdRIF90WTRwU3lYNUVkMktuSjJ5ak5YaFdRIF90WTRwVkNYNUVkMktuSjJ5ak5YaFdRIF90WTRwV0NYNUVkMktuSjJ5ak5YaFdRIF90WTRwV2lYNUVkMktuSjJ5ak5YaFdRIF90WTRwVmlYNUVkMktuSjJ5ak5YaFdRIF90WTRwWHlYNUVkMktuSjJ5ak5YaFdRIF90WTRwWUNYNUVkMktuSjJ5ak5YaFdRIF90WTRwWVNYNUVkMktuSjJ5ak5YaFdRIF90WTRwWWlYNUVkMktuSjJ5ak5YaFdRIF90WTRwWXlYNUVkMktuSjJ5ak5YaFdRIF90WTRwWkNYNUVkMktuSjJ5ak5YaFdRIF90WTRwWFNYNUVkMktuSjJ5ak5YaFdRIF90WkJ5MENYNUVkMktuSjJ5ak5YaFdRIF90WkJ5MFNYNUVkMktuSjJ5ak5YaFdRIF90WkJ5MHlYNUVkMktuSjJ5ak5YaFdRIF90WkJ5MGlYNUVkMktuSjJ5ak5YaFdRIF90WkJ5MWlYNUVkMktuSjJ5ak5YaFdRIF90WkJ5MXlYNUVkMktuSjJ5ak5YaFdRIF90WkJ5MkNYNUVkMktuSjJ5ak5YaFdRIF90WkJ5MmlYNUVkMktuSjJ5ak5YaFdRIF90WkJ5MlNYNUVkMktuSjJ5ak5YaFdRIF90WkJ5M1NYNUVkMktuSjJ5ak5YaFdRIF90WkJ5M2lYNUVkMktuSjJ5ak5YaFdRIF90WkJ5M3lYNUVkMktuSjJ5ak5YaFdRIF90WkJ5NFNYNUVkMktuSjJ5ak5YaFdRIF90WkJ5NENYNUVkMktuSjJ5ak5YaFdRIF90WkJ5NVNYNUVkMktuSjJ5ak5YaFdRIF90WkJ5NUNYNUVkMktuSjJ5ak5YaFdRIF90WkJ5NlNYNUVkMktuSjJ5ak5YaFdRIF90WkJ5NkNYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgIDwvZUFubm90YXRpb25zPg0KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3RCVnNTaVg1RWQyS25KMnlqTlhoV1EiIG5hbWU9IkNsYXNzaWZpZXIiIGlzQWJzdHJhY3Q9InRydWUiPg0KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfdEJWc1N5WDVFZDJLbkoyeWpOWGhXUSIgYW5ub3RhdGVkRWxlbWVudD0iX3RCVnNTaVg1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPGJvZHk+VU1MIDIuMCBtZXRhLWNsYXNzIENsYXNzaWZpZXIuPC9ib2R5Pg0KLSAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il90QlZzVENYNUVkMktuSjJ5ak5YaFdRIiBnZW5lcmFsPSJfdEJmY25DWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il90QlZzVFNYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJpc0Fic3RyYWN0IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il90Qm9tZ3lYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsQm9vbGVhbiIgeG1pOmlkPSJfdEJWc1RpWDVFZDJLbkoyeWpOWGhXUSIgdHlwZT0iX3RCb21neVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il90QmZja0NYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJFbGVtZW50IiBpc0Fic3RyYWN0PSJ0cnVlIj4NCi0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3RCZmNrU1g1RWQyS25KMnlqTlhoV1EiIGFubm90YXRlZEVsZW1lbnQ9Il90QmZja0NYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDxib2R5PlVNTCAyLjAgbWV0YS1jbGFzcyBFbGVtZW50LjwvYm9keT4NCi0gICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfdEJmY2tpWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iTmFtZWRFbGVtZW50IiBpc0Fic3RyYWN0PSJ0cnVlIj4NCi0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3RCZmNreVg1RWQyS25KMnlqTlhoV1EiIGFubm90YXRlZEVsZW1lbnQ9Il90QmZja2lYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDxib2R5PlVNTCAyLjAgbWV0YS1jbGFzcyBOYW1lZCBFbGVtZW50LiAgRGVmaW5lZCB0aGF0IGV2ZXJ5IGVsZW1lbnQgaGFzIGEgbmFtZS48L2JvZHk+DQotICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3RCZmNsQ1g1RWQyS25KMnlqTlhoV1EiIGdlbmVyYWw9Il90QmZja0NYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3RCZmNsU1g1RWQyS25KMnlqTlhoV1EiIG5hbWU9Im5hbWUiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3RCZmN0Q1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfdEJmY2xpWDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IjEiLz4NCi0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3RCZmNseVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il90QmZjbUNYNUVkMktuSjJ5ak5YaFdRIiB0eXBlPSJfdEJmY3RDWDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IiIvPg0KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3RCZmNtU1g1RWQyS25KMnlqTlhoV1EiIG5hbWU9IlBhY2thZ2VhYmxlRWxlbWVudCIgaXNBYnN0cmFjdD0idHJ1ZSI+DQotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il90QmZjbWlYNUVkMktuSjJ5ak5YaFdRIiBhbm5vdGF0ZWRFbGVtZW50PSJfdEJmY21TWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8Ym9keT5VTUwgMi4wIG1ldGEtY2xhc3MgUGFja2FnYWJsZSBFbGVtZW50LjwvYm9keT4NCi0gICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfdEJmY215WDVFZDJLbkoyeWpOWGhXUSIgZ2VuZXJhbD0iX3RCZmNraVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfdEJmY25DWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iVHlwZSIgaXNBYnN0cmFjdD0idHJ1ZSI+DQotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il90QmZjblNYNUVkMktuSjJ5ak5YaFdRIiBhbm5vdGF0ZWRFbGVtZW50PSJfdEJmY25DWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8Ym9keT5VTUwgMi4wIG1ldGEtY2xhc3MgVHlwZS48L2JvZHk+DQotICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3RCZmNuaVg1RWQyS25KMnlqTlhoV1EiIGdlbmVyYWw9Il90QmZjbVNYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3RCZmNvQ1g1RWQyS25KMnlqTlhoV1EiIG5hbWU9IlBhY2thZ2UiPg0KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfdEJmY29TWDVFZDJLbkoyeWpOWGhXUSIgYW5ub3RhdGVkRWxlbWVudD0iX3RCZmNvQ1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPGJvZHk+VU1MIDIuMCBtZXRhLWNsYXNzIFBhY2thZ2UuPC9ib2R5Pg0KLSAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il90QmZjb2lYNUVkMktuSjJ5ak5YaFdRIiBnZW5lcmFsPSJfdEJmY3BDWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il90QmZjb3lYNUVkMktuSjJ5ak5YaFdRIiBnZW5lcmFsPSJfdEJmY21TWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il90QmZjcENYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJOYW1lc3BhY2UiIGlzQWJzdHJhY3Q9InRydWUiPg0KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfdEJmY3BTWDVFZDJLbkoyeWpOWGhXUSIgYW5ub3RhdGVkRWxlbWVudD0iX3RCZmNwQ1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPGJvZHk+VU1MIDIuMCBtZXRhLWNsYXNzIE5hbWVzcGFjZS48L2JvZHk+DQotICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3RCZmNwaVg1RWQyS25KMnlqTlhoV1EiIGdlbmVyYWw9Il90QmZja2lYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgeG1pOmlkPSJfdEJmY3NDWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iRGF0ZSI+DQotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il90QmZjc1NYNUVkMktuSjJ5ak5YaFdRIiBhbm5vdGF0ZWRFbGVtZW50PSJfdEJmY3NDWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8Ym9keT5EYXRhIHR5cGUgdXNlZCBmb3IgYXR0cmlidXRlcyBvZiBtZXRhLW1vZGVsIGNsYXNzZXMgb2YgdGhlIHR5cGUgRGF0ZS48L2JvZHk+DQotICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgeG1pOmlkPSJfdEJmY3NpWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iVXJpIj4NCi0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3RCZmNzeVg1RWQyS25KMnlqTlhoV1EiIGFubm90YXRlZEVsZW1lbnQ9Il90QmZjc2lYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDxib2R5PkRhdGEgdHlwZSB1c2VkIGZvciBhdHRyaWJ1dGVzIG9mIG1ldGEtbW9kZWwgY2xhc3NlcyB0aGF0IHBvaW50IHRvIHJlc291cmNlcyBzdWNoIGFzIGZpbGVzLjwvYm9keT4NCi0gICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiB4bWk6aWQ9Il90QmZjdENYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJTdHJpbmciPg0KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfdEJmY3RTWDVFZDJLbkoyeWpOWGhXUSIgYW5ub3RhdGVkRWxlbWVudD0iX3RCZmN0Q1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPGJvZHk+QSBzdHJpbmcgaXMgYSBzZXF1ZW5jZSBvZiBjaGFyYWN0ZXJzIGluIHNvbWUgc3VpdGFibGUgY2hhcmFjdGVyIHNldCB1c2VkIHRvIGRpc3BsYXkgaW5mb3JtYXRpb24gYWJvdXQgdGhlIG1vZGVsLiBDaGFyYWN0ZXIgc2V0cyBtYXkgaW5jbHVkZSBub24tUm9tYW4gYWxwaGFiZXRzIGFuZCBjaGFyYWN0ZXJzLjwvYm9keT4NCi0gICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiB4bWk6aWQ9Il90QmZjdGlYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJTZXQiLz4NCi0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIHhtaTppZD0iX3RCb21nQ1g1RWQyS25KMnlqTlhoV1EiIG5hbWU9IlNlcXVlbmNlIi8+DQotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiB4bWk6aWQ9Il90Qm9tZ1NYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJJbnRlZ2VyIj4NCi0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3RCb21naVg1RWQyS25KMnlqTlhoV1EiIGFubm90YXRlZEVsZW1lbnQ9Il90Qm9tZ1NYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDxib2R5PkFuIGludGVnZXIgaXMgYSBwcmltaXRpdmUgdHlwZSByZXByZXNlbnRpbmcgaW50ZWdlciB2YWx1ZXMuPC9ib2R5Pg0KLSAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIHhtaTppZD0iX3RCb21neVg1RWQyS25KMnlqTlhoV1EiIG5hbWU9IkJvb2xlYW4iPg0KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfdEJvbWhDWDVFZDJLbkoyeWpOWGhXUSIgYW5ub3RhdGVkRWxlbWVudD0iX3RCb21neVg1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPGJvZHk+QSBCb29sZWFuIHR5cGUgaXMgdXNlZCBmb3IgbG9naWNhbCBleHByZXNzaW9uLCBjb25zaXN0aW5nIG9mIHRoZSBwcmVkZWZpbmVkIHZhbHVlcyB0cnVlIGFuZCBmYWxzZS48L2JvZHk+DQotICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgeG1pOmlkPSJfdEJvbWhTWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iRG91YmxlIi8+DQotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfdENGU2dDWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iQ29uc3RyYWludCI+DQotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il90Q0ZTZ1NYNUVkMktuSjJ5ak5YaFdRIiBhbm5vdGF0ZWRFbGVtZW50PSJfdENGU2dDWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8Ym9keT5BIENvbnN0cmFpbnQgaXMgYSBNZXRob2QgRWxlbWVudCB0aGF0IHJlcHJlc2VudHMgYSBjb25kaXRpb24gb3IgcmVzdHJpY3Rpb24gZXhwcmVzc2VkIGluIG5hdHVyYWwgbGFuZ3VhZ2UgdGV4dCBvciBpbiBhIG1hY2hpbmUgcmVhZGFibGUgbGFuZ3VhZ2UgZm9yIHRoZSBwdXJwb3NlIG9mIGRlY2xhcmluZyBzb21lIG9mIHRoZSBzZW1hbnRpY3Mgb2YgYSBNZXRob2QgRWxlbWVudC48L2JvZHk+DQotICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3RDRlNnaVg1RWQyS25KMnlqTlhoV1EiIGdlbmVyYWw9Il90QjhJZ1NYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3RDRlNneVg1RWQyS25KMnlqTlhoV1EiIG5hbWU9ImJvZHkiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3RCZmN0Q1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il90Q0ZTaENYNUVkMktuSjJ5ak5YaFdRIiBhbm5vdGF0ZWRFbGVtZW50PSJfdENGU2d5WDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICAgIDxib2R5PlRoaXMgYXR0cmlidXRlIHN0b3JlcyB0aGUgZGVmaW5pdGlvbiBvZiB0aGUgY29uc3RyYWludC48L2JvZHk+DQotICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3RDRlNoU1g1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIxIi8+DQotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il90Q0ZTaGlYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfdENGU2h5WDVFZDJLbkoyeWpOWGhXUSIgdHlwZT0iX3RCZmN0Q1g1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIiLz4NCi0gICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il90Q0ZTanlYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJNZXRob2RFbGVtZW50UHJvcGVydHkiPg0KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il90Q0ZTa0NYNUVkMktuSjJ5ak5YaFdRIiBnZW5lcmFsPSJfdEJmY21TWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il90Q0ZTa1NYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJ2YWx1ZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdEJmY3RDWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il90Q0ZTa2lYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iMSIvPg0KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfdENGU2t5WDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iX3RDRlNsQ1g1RWQyS25KMnlqTlhoV1EiIHR5cGU9Il90QmZjdENYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iIi8+DQotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfdENGU2xTWDVFZDJLbkoyeWpOWGhXUSIgbWVtYmVyRW5kPSJfdEI4SWt5WDVFZDJLbkoyeWpOWGhXUSBfdENGU2x5WDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il90Q0ZTbGlYNUVkMktuSjJ5ak5YaFdRIiBhbm5vdGF0ZWRFbGVtZW50PSJfdENGU2xTWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8Ym9keT5BIE1ldGhvZCBFbGVtZW50IGNhbiBvd24gbWFueSBDb25zdHJhaW50cyBkZWZpbmluZyBydWxlcyBmb3IgdGhpcyBlbGVtZW50LjwvYm9keT4NCi0gICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfdENGU2x5WDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iX21ldGhvZEVsZW1lbnQiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3RCOElnU1g1RWQyS25KMnlqTlhoV1EiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il90Q0ZTbFNYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3RDRlNtQ1g1RWQyS25KMnlqTlhoV1EiIG1lbWJlckVuZD0iX3RCOElweVg1RWQyS25KMnlqTlhoV1EgX3RDRlNtaVg1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfdENGU21TWDVFZDJLbkoyeWpOWGhXUSIgYW5ub3RhdGVkRWxlbWVudD0iX3RDRlNtQ1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPGJvZHk+QSBDb250ZW50IERlc2NyaXB0aW9uIGNhbiBvcHRpb25hbGx5IGJlIHN0cnVjdHVyZSBpbnRvIFNlY3Rpb25zLiAgVGhpcyBhc3NvY2lhdGlvbiBpcyB1c2UgdG8gZGVjb21wb3NlZCBTZWN0aW9uIGludG8gYSBoaWVyYXJjaHkgb2YgU2VjdGlvbnMuPC9ib2R5Pg0KLSAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il90Q0ZTbWlYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJfY29udGVudERlc2NyaXB0aW9uIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il90QjhJbnlYNUVkMktuSjJ5ak5YaFdRIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfdENGU21DWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il90Q0ZTbXlYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iMSIvPg0KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfdENGU25DWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgIDwvb3duZWRFbmQ+DQotICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3RDRlNuU1g1RWQyS25KMnlqTlhoV1EiIG1lbWJlckVuZD0iX3RDRlNmU1g1RWQyS25KMnlqTlhoV1EgX3RDRlNueVg1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfdENGU25pWDVFZDJLbkoyeWpOWGhXUSIgYW5ub3RhdGVkRWxlbWVudD0iX3RDRlNuU1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPGJvZHk+U2VjdGlvbnMgY2FuIGJlIGZ1cnRoZXIgZGVjb21wb3NlZCBpbnRvIG4gbGV2ZWxzIG9mIHN1Yi1zZWN0aW9ucy48L2JvZHk+DQotICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgPG93bmVkRW5kIHhtaTppZD0iX3RDRlNueVg1RWQyS25KMnlqTlhoV1EiIG5hbWU9Il9zZWN0aW9uIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il90Q0ZTY0NYNUVkMktuSjJ5ak5YaFdRIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfdENGU25TWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il90Q0ZTb0NYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iMSIvPg0KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfdENGU29TWDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IjEiLz4NCi0gICAgICA8L293bmVkRW5kPg0KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il90Q0ZTb2lYNUVkMktuSjJ5ak5YaFdRIiBtZW1iZXJFbmQ9Il90Q0ZTcENYNUVkMktuSjJ5ak5YaFdRIF90Q0ZTakNYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3RDRlNveVg1RWQyS25KMnlqTlhoV1EiIGFubm90YXRlZEVsZW1lbnQ9Il90Q0ZTb2lYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDxib2R5PkEgRGVzY3JpYmFibGUgRWxlbWVudCBjYW4gY29udGFpbiBhIENvbnRlbnQgRGVzY3JpcHRpb24gZWxlbWVudCB0aGF0IHN0b3JlcyB0ZXh0dWFsIGRlc2NyaXB0aW9ucyBmb3IgdGhpcyBDb250ZW50IEVsZW1lbnQuICBDb250ZW50IERlc2NyaXB0aW9uIGlzIGludGVuZGVkIHRvIGJlIHJlZmluZWQgd2l0aCBzdWItY2xhc3NlcyBhZGRpbmcgbW9yZSBkZXNjcmlwdGlvbiBhdHRyaWJ1dGVzLiAgQW55IG9mIHRoZXNlIHN1Yi10eXBlcyBjYW4gYmUgcmVsYXRlZCB0byBhIENvbnRlbnQgRWxlbWVudC48L2JvZHk+DQotICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgPG93bmVkRW5kIHhtaTppZD0iX3RDRlNwQ1g1RWQyS25KMnlqTlhoV1EiIG5hbWU9Il9kZXNjcmliYWJsZUVsZW1lbnQiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3RDRlNpQ1g1RWQyS25KMnlqTlhoV1EiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il90Q0ZTb2lYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3RDRlNwU1g1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIxIi8+DQotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il90Q0ZTcGlYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iMSIvPg0KLSAgICAgIDwvb3duZWRFbmQ+DQotICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3RDRlNweVg1RWQyS25KMnlqTlhoV1EiIG1lbWJlckVuZD0iX3RCOElsaVg1RWQyS25KMnlqTlhoV1EgX3RDRlNxQ1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il90Q0ZTcUNYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJfbWV0aG9kRWxlbWVudCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdEI4SWdTWDVFZDJLbkoyeWpOWGhXUSIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iX3RDRlNweVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfdENGU3FTWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iS2luZCI+DQotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3RDRlNxaVg1RWQyS25KMnlqTlhoV1EiIGdlbmVyYWw9Il90QjhJbkNYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3RDRlNxeVg1RWQyS25KMnlqTlhoV1EiIG5hbWU9ImFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il90Q0ZTc2lYNUVkMktuSjJ5ak5YaFdRIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBhc3NvY2lhdGlvbj0iX3RDRlN0U1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfdENGU3JDWDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IioiLz4NCi0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3RDRlNyU1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il90Q0ZTcmlYNUVkMktuSjJ5ak5YaFdRIiBtZW1iZXJFbmQ9Il90QjhJbVNYNUVkMktuSjJ5ak5YaFdRIF90Q0ZTcnlYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfdENGU3J5WDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iIiB2aXNpYmlsaXR5PSJwcml2YXRlIiB0eXBlPSJfdEI4SWdTWDVFZDJLbkoyeWpOWGhXUSIgYXNzb2NpYXRpb249Il90Q0ZTcmlYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3RDRlNzQ1g1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIqIi8+DQotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il90Q0ZTc1NYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgPC9vd25lZEVuZD4NCi0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfdENGU3NpWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iQXBwbGljYWJsZU1ldGFDbGFzc0luZm8iPg0KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il90Q0ZTc3lYNUVkMktuSjJ5ak5YaFdRIiBnZW5lcmFsPSJfdEJWc1NpWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il90Q0ZTdENYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJpc1ByaW1hcnlFeHRlbnNpb24iIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3RCb21neVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfdENGU3RTWDVFZDJLbkoyeWpOWGhXUSIgbWVtYmVyRW5kPSJfdENGU3F5WDVFZDJLbkoyeWpOWGhXUSBfdENGU3RpWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgPG93bmVkRW5kIHhtaTppZD0iX3RDRlN0aVg1RWQyS25KMnlqTlhoV1EiIG5hbWU9IiIgdmlzaWJpbGl0eT0icHJpdmF0ZSIgdHlwZT0iX3RDRlNxU1g1RWQyS25KMnlqTlhoV1EiIGFzc29jaWF0aW9uPSJfdENGU3RTWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il90Q0ZTdHlYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iMSIvPg0KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfdENGU3VDWDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IjEiLz4NCi0gICAgICA8L293bmVkRW5kPg0KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il90REliY3lYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJHdWlkYW5jZSIgaXNBYnN0cmFjdD0idHJ1ZSI+DQotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il90REliZENYNUVkMktuSjJ5ak5YaFdRIiBhbm5vdGF0ZWRFbGVtZW50PSJfdERJYmN5WDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8Ym9keT5HdWlkYW5jZSBpcyBhbiBhYnN0cmFjdCBnZW5lcmFsaXphdGlvbiBvZiBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlbGF0ZWQgdG8gY29udGVudCBlbGVtZW50cyBzdWNoIGFzIFJvbGVzLCBUYXNrcywgYW5kIFdvcmsgUHJvZHVjdHMuICBFeGFtcGxlcyBmb3IgR3VpZGFuY2UgYXJlIEd1aWRlbGluZXMsIFRlbXBsYXRlcywgQ2hlY2tsaXN0cywgVG9vbCBNZW50b3JzLCBFc3RpbWF0ZXMsIFN1cHBvcnRpbmcgTWF0ZXJpYWxzLCBSZXBvcnRzLCBDb25jZXB0cywgZXRjLiAgVGhpcyBwYWNrYWdlIG9ubHkgY29udGFpbnMgdGhlIGRlZmluaXRpb24gb2YgdGhlIGFic3RyYWN0IEd1aWRhbmNlIGNsYXNzLiAgVGhlIHBhY2thZ2UgR3VpZGFuY2UgVHlwZXMgZGVmaW5lcyBjb25jcmV0ZSBndWlkYW5jZSB0eXBlcy48L2JvZHk+DQotICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3RESWJkU1g1RWQyS25KMnlqTlhoV1EiIGdlbmVyYWw9Il90QjhJbkNYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3RESWJkaVg1RWQyS25KMnlqTlhoV1EiIG5hbWU9IkFydGlmYWN0Ij4NCi0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3RESWJkeVg1RWQyS25KMnlqTlhoV1EiIGFubm90YXRlZEVsZW1lbnQ9Il90REliZGlYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDxib2R5PkFydGlmYWN0IGlzIGEgV29yayBQcm9kdWN0IHRoYXQgcHJvdmlkZXMgYSBkZXNjcmlwdGlvbiBhbmQgZGVmaW5pdGlvbiBmb3IgdGFuZ2libGUgd29yayBwcm9kdWN0IHR5cGVzLiBBcnRpZmFjdHMgbWF5IGJlIGNvbXBvc2VkIG9mIG90aGVyIGFydGlmYWN0cy4gRm9yIGV4YW1wbGUsIGEgbW9kZWwgYXJ0aWZhY3QgY2FuIGJlIGNvbXBvc2VkIG9mIG1vZGVsIGVsZW1lbnRzLCB3aGljaCBhcmUgYWxzbyBhcnRpZmFjdHMuDQotQXJ0aWZhY3RzIGFyZSB0YW5naWJsZSB3b3JrIHByb2R1Y3RzIGNvbnN1bWVkLCBwcm9kdWNlZCwgb3IgbW9kaWZpZWQgYnkgVGFza3MuICBJdCBtYXkgc2VydmUgYXMgYSBiYXNpcyBmb3IgZGVmaW5pbmcgcmV1c2FibGUgYXNzZXRzLiAgUm9sZXMgdXNlIEFydGlmYWN0cyB0byBwZXJmb3JtIFRhc2tzIGFuZCBwcm9kdWNlIEFydGlmYWN0cyBpbiB0aGUgY291cnNlIG9mIHBlcmZvcm1pbmcgVGFza3MuICBBcnRpZmFjdHMgYXJlIHRoZSByZXNwb25zaWJpbGl0eSBvZiBhIHNpbmdsZSBSb2xlLCBtYWtpbmcgcmVzcG9uc2liaWxpdHkgZWFzeSB0byBpZGVudGlmeSBhbmQgdW5kZXJzdGFuZCwgYW5kIHByb21vdGluZyB0aGUgaWRlYSB0aGF0IGV2ZXJ5IHBpZWNlIG9mIGluZm9ybWF0aW9uIHByb2R1Y2VkIGluIHRoZSBtZXRob2QgcmVxdWlyZXMgdGhlIGFwcHJvcHJpYXRlIHNldCBvZiBza2lsbHMuIEV2ZW4gdGhvdWdoIG9uZSByb2xlIG1pZ2h0ICZxdW90O293biZxdW90OyBhIHNwZWNpZmljIHR5cGUgb2YgQXJ0aWZhY3RzLCBvdGhlciByb2xlcyBjYW4gc3RpbGwgdXNlIHRoZSBBcnRpZmFjdHM7IHBlcmhhcHMgZXZlbiB1cGRhdGUgdGhlbSBpZiB0aGUgUm9sZSBoYXMgYmVlbiBnaXZlbiBwZXJtaXNzaW9uIHRvIGRvIHNvLg0KLTwvYm9keT4NCi0gICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfdERJYmVDWDVFZDJLbkoyeWpOWGhXUSIgZ2VuZXJhbD0iX3RESWJjQ1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfdERJYmVTWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iY29udGFpbmVyQXJ0aWZhY3QiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3RESWJkaVg1RWQyS25KMnlqTlhoV1EiIGFzc29jaWF0aW9uPSJfdERJYnN5WDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il90REliZWlYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iMSIvPg0KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfdERJYmV5WDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3RESWJmQ1g1RWQyS25KMnlqTlhoV1EiIG5hbWU9ImNvbnRhaW5lZEFydGlmYWN0cyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdERJYmRpWDVFZDJLbkoyeWpOWGhXUSIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgYXNzb2NpYXRpb249Il90RElic3lYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3RESWJmU1g1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIqIi8+DQotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il90REliZmlYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfdERJYmZ5WDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iRGVsaXZlcmFibGUiPg0KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfdERJYmdDWDVFZDJLbkoyeWpOWGhXUSIgYW5ub3RhdGVkRWxlbWVudD0iX3RESWJmeVg1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPGJvZHk+QSBkZWxpdmVyYWJsZSBpcyBhIFdvcmsgUHJvZHVjdCB0aGF0IHByb3ZpZGVzIGEgZGVzY3JpcHRpb24gYW5kIGRlZmluaXRpb24gZm9yIHBhY2thZ2luZyBvdGhlciBXb3JrIFByb2R1Y3RzLCBhbmQgbWF5IGJlIGRlbGl2ZXJlZCB0byBhbiBpbnRlcm5hbCBvciBleHRlcm5hbCBwYXJ0eS4gIFRoZXJlZm9yZSwgYSBEZWxpdmVyYWJsZSBhZ2dyZWdhdGVzIG90aGVyIFdvcmsgUHJvZHVjdHMuIFRoZXJlZm9yZSwgYSBEZWxpdmVyYWJsZSBhZ2dyZWdhdGVzIG90aGVyIFdvcmsgUHJvZHVjdHMuICBBIERlbGl2ZXJhYmxlIGlzIHVzZWQgdG8gcHJlLWRlZmluZSB0eXBpY2FsIG9yIHJlY29tbWVuZGVkIGNvbnRlbnQgaW4gdGhlIGZvcm0gb3Igd29yayBwcm9kdWN0cyB0aGF0IHdvdWxkIGJlIHBhY2thZ2VkIGZvciBkZWxpdmVyeS4gIFRoZSBhY3R1YWwgcGFja2FnaW5nIG9mIHRoZSBEZWxpdmVyYWJsZSBpbiBhbiBhY3R1YWwgcHJvY2VzcyBvciBldmVuIHByb2plY3QgY291bGQgYmUgYSBtb2RpZmljYXRpb24gb2YgdGhpcyByZWNvbW1lbmRhdGlvbi4gIERlbGl2ZXJhYmxlcyBhcmUgdXNlZCB0byByZXByZXNlbnQgYW4gb3V0cHV0IGZyb20gYSBwcm9jZXNzIHRoYXQgaGFzIHZhbHVlLCBtYXRlcmlhbCBvciBvdGhlcndpc2UsIHRvIGEgY2xpZW50LCBjdXN0b21lciBvciBvdGhlciBzdGFrZWhvbGRlci4gPC9ib2R5Pg0KLSAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il90REliZ1NYNUVkMktuSjJ5ak5YaFdRIiBnZW5lcmFsPSJfdERJYmNDWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il90REliZ2lYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJkZWxpdmVyZWRXb3JrUHJvZHVjdHMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3RESWJjQ1g1RWQyS25KMnlqTlhoV1EiIGFzc29jaWF0aW9uPSJfdERJYnRTWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il90REliZ3lYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfdERJYmhDWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3RESWJoU1g1RWQyS25KMnlqTlhoV1EiIG5hbWU9Ik91dGNvbWUiPg0KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfdERJYmhpWDVFZDJLbkoyeWpOWGhXUSIgYW5ub3RhdGVkRWxlbWVudD0iX3RESWJoU1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPGJvZHk+QW4gb3V0Y29tZSBkZXNjcmliZXMgaW50YW5naWJsZSB3b3JrIHByb2R1Y3RzIHRoYXQgYXJlIGEgcmVzdWx0IG9yIHN0YXRlLiBPdXRjb21lcyBtYXkgYWxzbyBiZSB1c2VkIHRvIGRlc2NyaWJlIHdvcmsgcHJvZHVjdHMgdGhhdCBhcmUgbm90IGZvcm1hbGx5IGRlZmluZWQuICBBIGtleSBkaWZmZXJlbnRpYXRvciBmb3Igb3V0Y29tZXMgYWdhaW5zdCBhcnRpZmFjdHMgaXMgdGhhdCBvdXRjb21lcyBhcmUgbm90IGNhbmRpZGF0ZXMgZm9yIGhhcnZlc3RpbmcgYXMgcmV1c2FibGUgYXNzZXRzLjwvYm9keT4NCi0gICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfdERJYmh5WDVFZDJLbkoyeWpOWGhXUSIgZ2VuZXJhbD0iX3RESWJjQ1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfdERJYmlDWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iU3RlcCI+DQotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il90REliaVNYNUVkMktuSjJ5ak5YaFdRIiBhbm5vdGF0ZWRFbGVtZW50PSJfdERJYmlDWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8Ym9keT5BIFN0ZXAgaXMgYSBTZWN0aW9uIGFuZCBXb3JrIERlZmluaXRpb24gdGhhdCBpcyB1c2VkIHRvIG9yZ2FuaXplIFRhc2tzIGludG8gcGFydHMgb3Igc3VidW5pdHMgb2Ygd29yay4gIFN0ZXBzIGluaGVyaXQgdGhlIHN1YlNlY3Rpb25zIGRlY29tcG9zaXRpb24gZnJvbSBTZWN0aW9uIGFuZCBjYW4gdGhlcmVmb3JlIGRlc2NyaWJlIFN1Yi1TdGVwcyBuZXN0ZWQgaW50byBTdGVwcy4NCi1BIFN0ZXAgZGVzY3JpYmVzIGEgbWVhbmluZ2Z1bCBhbmQgY29uc2lzdCBwYXJ0IG9mIHRoZSBvdmVyYWxsIHdvcmsgZGVzY3JpYmVkIGZvciBhIFRhc2suICBUaGUgY29sbGVjdGlvbiBvZiBTdGVwcyBkZWZpbmVkIGZvciBhIFRhc2sgcmVwcmVzZW50cyBhbGwgdGhlIHdvcmsgdGhhdCBzaG91bGQgYmUgZG9uZSB0byBhY2hpZXZlIHRoZSBvdmVyYWxsIGRldmVsb3BtZW50IGdvYWwgb2YgdGhlIFRhc2suICBOb3QgYWxsIHN0ZXBzIGFyZSBuZWNlc3NhcmlseSBwZXJmb3JtZWQgZWFjaCB0aW1lIGEgVGFzayBpcyBpbnZva2VkIGluIGEgUHJvY2VzcyAoc2VlIFRhc2sgRGVzY3JpcHRvciksIHNvIHRoZXkgY2FuIGFsc28gYmUgZXhwcmVzc2VkIGluIHRoZSBmb3JtIG9mIGFsdGVybmF0ZSAnZmxvd3MnIG9mIHdvcmsuICBEaWZmZXJlbnQgd2F5cyBvZiBhY2hpZXZpbmcgdGhlIHNhbWUgZGV2ZWxvcG1lbnQgZ29hbCBjYW4gdGhlbiBiZSAnYXNzZW1ibGVkJyBieSBzZWxlY3RpbmcgZGlmZmVyZW50IGNvbWJpbmF0aW9ucyBvZiBzdGVwcyB3aGVuIGFwcGx5aW5nIHRoZSBUYXNrIGluIGEgUHJvY2Vzcy4gIFR5cGljYWwga2luZHMgb2Ygc3RlcHMgYSBUYXNrIGF1dGhvciBzaG91bGQgY29uc2lkZXIgYXJlOiBUaGlua2luZyBzdGVwczogd2hlcmUgdGhlIGluZGl2aWR1YWwgcm9sZXMgdW5kZXJzdGFuZCB0aGUgbmF0dXJlIG9mIHRoZSB0YXNrLCBnYXRoZXJzIGFuZCBleGFtaW5lcyB0aGUgaW5wdXQgYXJ0aWZhY3RzLCBhbmQgZm9ybXVsYXRlcyB0aGUgb3V0Y29tZS4gUGVyZm9ybWluZyBzdGVwczogd2hlcmUgdGhlIGluZGl2aWR1YWwgcm9sZXMgY3JlYXRlIG9yIHVwZGF0ZSBzb21lIGFydGlmYWN0cy4gUmV2aWV3aW5nIHN0ZXBzOiB3aGVyZSB0aGUgaW5kaXZpZHVhbCByb2xlcyBpbnNwZWN0cyB0aGUgcmVzdWx0cyBhZ2FpbnN0IHNvbWUgY3JpdGVyaWEuDQotPC9ib2R5Pg0KLSAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il90REliaWlYNUVkMktuSjJ5ak5YaFdRIiBnZW5lcmFsPSJfdENGU2NDWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il90REliaXlYNUVkMktuSjJ5ak5YaFdRIiBnZW5lcmFsPSJfdERJYmpDWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il90REliakNYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJXb3JrRGVmaW5pdGlvbiIgaXNBYnN0cmFjdD0idHJ1ZSI+DQotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il90RElialNYNUVkMktuSjJ5ak5YaFdRIiBhbm5vdGF0ZWRFbGVtZW50PSJfdERJYmpDWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8Ym9keT5Xb3JrIERlZmluaXRpb24gaXMgYW4gYWJzdHJhY3QgTWV0aG9kIEVsZW1lbnQgdGhhdCBnZW5lcmFsaXplcyBhbGwgZGVzY3JpcHRpb25zIG9mIHdvcmsgd2l0aGluIHRoZSBVbmlmaWVkIE1ldGhvZCBBcmNoaXRlY3R1cmUuICBUaGlzIHBhY2thZ2UgaW50cm9kdWNlcyB0d28gY29uY3JldGUgdHlwZXMgb2YgV29yayBEZWZpbml0aW9uczogVGFzayBhbmQgU3RlcC4gIFdvcmsgRGVmaW5pdGlvbnMgY2FuIGNvbnRhaW4gc2V0cyBvZiBwcmUtIGFuZCBwb3N0LWNvbmRpdGlvbnMgZGVmaW5pbmcgY29uc3RyYWludHMgdGhhdCBuZWVkIHRvIGJlIHZhbGlkIGJlZm9yZSB0aGUgZGVzY3JpYmVkIHdvcmsgY2FuIGJlZ2luIG9yIGJlZm9yZSBpdCBjYW4gYmUgZGVjbGFyZWQgYXMgZmluaXNoZWQuICBOb3RlIHRoYXQgZ2VuZXJhbCBvd25lZFJ1bGVzIGNhbiBiZSB1c2VkIHRvIGRlZmluZSBhZGRpdGlvbmFsIGNvbnN0cmFpbnRzIGFuZCBydWxlcyBmb3IgV29yayBEZWZpbml0aW9ucy4NCi1Xb3JrIERlZmluaXRpb25zIHJlcHJlc2VudCBiZWhhdmlvcmFsIGRlc2NyaXB0aW9ucyBmb3IgZG9pbmcgd29yay4gIFRoZXNlIGJlaGF2aW9yYWwgZGVzY3JpcHRpb25zIGFyZSBub3QgYm91bmQgdG8gb25lIHNwZWNpZmljIGNsYXNzaWZpZXIsIGJ1dCByZXByZXNlbnQgYW4gYXJiaXRyYXJ5IGRlZmluaXRpb24gb2Ygd29yay4gIEZvciBleGFtcGxlLCBhIFdvcmsgRGVmaW5pdGlvbiBjb3VsZCByZXByZXNlbnQgd29yayB0aGF0IGlzIGJlaW5nIHBlcmZvcm1lZCBieSBhIHNwZWNpZmljIFJvbGUgKGUuZy4gYSBSb2xlIHBlcmZvcm1pbmcgYSBzcGVjaWZpYyBUYXNrIG9yIFN0ZXBzIG9mIGEgVGFzayksIGJ5IG1hbnkgUm9sZXMgd29ya2luZyBpbiBjbG9zZSBjb2xsYWJvcmF0aW9uIChtYW55IFJvbGVzIGFsbCB3b3JraW5nIHRvZ2V0aGVyIG9uIHRoZSBzYW1lIGludGVyZGlzY2lwbGluYXJ5IFRhc2spLCBvciBjb21wbGV4IHdvcmsgdGhhdCBpcyBwZXJmb3JtZWQgdGhyb3VnaG91dCB0aGUgbGlmZWN5Y2xlIChlLmcuIGEgcHJvY2VzcyBkZWZpbmluZyBhIGJyZWFrZG93biBzdHJ1Y3R1cmUgZm9yIG9yZ2FuaXppbmcgbGFyZ2VyIGNvbXBvc2l0ZSB1bml0cyBvZiB3b3JrIHBlcmZvcm1lZCBieSBtYW55IFJvbGVzIHdvcmtpbmcgaW4gY29sbGFib3JhdGlvbikuDQotPC9ib2R5Pg0KLSAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il90REliamlYNUVkMktuSjJ5ak5YaFdRIiBnZW5lcmFsPSJfdEI4SWdTWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il90RElianlYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJwcmVjb25kaXRpb24iIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3RDRlNnQ1g1RWQyS25KMnlqTlhoV1EiIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiIGFzc29jaWF0aW9uPSJfdERJYndpWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il90RElia0NYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iMSIvPg0KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfdERJYmtTWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3RESWJraVg1RWQyS25KMnlqTlhoV1EiIG5hbWU9InBvc3Rjb25kaXRpb24iIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3RDRlNnQ1g1RWQyS25KMnlqTlhoV1EiIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiIGFzc29jaWF0aW9uPSJfdERJYnhTWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il90RElia3lYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iMSIvPg0KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfdERJYmxDWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3RESWJsU1g1RWQyS25KMnlqTlhoV1EiIG5hbWU9IkRlZmF1bHRfUHJpbWFyeVBlcmZvcm1lciIgbWVtYmVyRW5kPSJfdERJYlhpWDVFZDJLbkoyeWpOWGhXUSBfdERJYmx5WDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il90RElibGlYNUVkMktuSjJ5ak5YaFdRIiBhbm5vdGF0ZWRFbGVtZW50PSJfdERJYmxTWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8Ym9keT5Sb2xlcyBjYW4gYmUgZGVmaW5lZCB0byBwZXJmb3JtIG1hbnkgVGFza3MsIGJ1dCBldmVyeSBUYXNrIG1heSBoYXZlIG9ubHkgb25lIFJvbGUgdGhhdCBpcyBieSBkZWZhdWx0IHRoZSBwcmltYXJ5IHBlcmZvcm1lciBvZiB0aGlzIFRhc2suPC9ib2R5Pg0KLSAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il90RElibHlYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSIiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3RESWJXaVg1RWQyS25KMnlqTlhoV1EiIGFzc29jaWF0aW9uPSJfdERJYmxTWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il90RElibUNYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfdERJYm1TWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgIDwvb3duZWRFbmQ+DQotICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3RESWJtaVg1RWQyS25KMnlqTlhoV1EiIG5hbWU9IkRlZmF1bHRfTWFuZGF0b3J5SW5wdXRzIiBtZW1iZXJFbmQ9Il90RElibkNYNUVkMktuSjJ5ak5YaFdRIF90REliWVNYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3RESWJteVg1RWQyS25KMnlqTlhoV1EiIGFubm90YXRlZEVsZW1lbnQ9Il90RElibWlYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDxib2R5PlRoaXMgYXNzb2NpYXRpb24gcHJvdmlkZXMgbGlua3MgdG8gemVybyBvciBtYW55IGRlZmluaXRpb25zIG9mIFdvcmsgUHJvZHVjdHMgdGhhdCBhcmUgZGVmaW5lZCBhcyBtYW5kYXRvcnkgaW5wdXRzIGZvciBwZXJmb3JtaW5nIHRoaXMgVGFzay48L2JvZHk+DQotICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgPG93bmVkRW5kIHhtaTppZD0iX3RESWJuQ1g1RWQyS25KMnlqTlhoV1EiIG5hbWU9IiIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdERJYldpWDVFZDJLbkoyeWpOWGhXUSIgYXNzb2NpYXRpb249Il90RElibWlYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3RESWJuU1g1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIqIi8+DQotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il90RElibmlYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgPC9vd25lZEVuZD4NCi0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfdERJYm55WDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iRGVmYXVsdF9PdXRwdXRzIiBtZW1iZXJFbmQ9Il90RElib1NYNUVkMktuSjJ5ak5YaFdRIF90REliWkNYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3RESWJvQ1g1RWQyS25KMnlqTlhoV1EiIGFubm90YXRlZEVsZW1lbnQ9Il90RElibnlYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDxib2R5PlRoaXMgYXNzb2NpYXRpb24gcHJvdmlkZXMgbGlua3MgdG8gemVybyBvciBtYW55IGRlZmluaXRpb25zIG9mIFdvcmsgUHJvZHVjdHMgdGhhdCBhcmUgZGVmaW5lZCBhcyBvdXRwdXRzIG9mIHRoaXMgVGFzay48L2JvZHk+DQotICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgPG93bmVkRW5kIHhtaTppZD0iX3RESWJvU1g1RWQyS25KMnlqTlhoV1EiIG5hbWU9IiIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdERJYldpWDVFZDJLbkoyeWpOWGhXUSIgYXNzb2NpYXRpb249Il90RElibnlYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3RESWJvaVg1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIqIi8+DQotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il90RElib3lYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgPC9vd25lZEVuZD4NCi0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfdERJYnBDWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iRGVmYXVsdF9Nb2RpZmllcyIgbWVtYmVyRW5kPSJfdERJYnBpWDVFZDJLbkoyeWpOWGhXUSBfdERJYlZDWDVFZDJLbkoyeWpOWGhXUSIgaXNEZXJpdmVkPSJ0cnVlIj4NCi0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3RESWJwU1g1RWQyS25KMnlqTlhoV1EiIGFubm90YXRlZEVsZW1lbnQ9Il90RElicENYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDxib2R5PlRoaXMgYXNzb2NpYXRpb24gaXMgZGVyaXZlZCBmcm9tIHRoZSBmYWN0IHRoYXQgUm9sZXMgcGVyZm9ybSBUYXNrcyB0aGF0IGhhdmUgV29yayBQcm9kdWN0cyBvZiB0aGF0IHBhcnRpY3VsYXIgdHlwZSBhcyBvdXRwdXRzLiAgL21vZGlmaWVzIHByb3ZpZGVzIGFsbCB0aGUgdHlwZXMgb2YgV29yayBQcm9kdWN0cyB0aGF0IHRoZSBSb2xlIHByb2R1Y2VzIG9yIG1vZGlmaWVzIHZpYSBvbmUgb2YgdGhlIFRhc2tzIGRlZmluZWQgdG8gYmUgcGVyZm9ybWVkIGJ5IHRoZSBSb2xlLCBlaXRoZXIgYXMgcHJpbWFyeSBvciBhZGRpdGlvbmFsIHBlcmZvcm1lci48L2JvZHk+DQotICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgPG93bmVkRW5kIHhtaTppZD0iX3RESWJwaVg1RWQyS25KMnlqTlhoV1EiIG5hbWU9Im1vZGlmaWVkQnkiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3RESWJVU1g1RWQyS25KMnlqTlhoV1EiIGlzRGVyaXZlZD0idHJ1ZSIgYXNzb2NpYXRpb249Il90RElicENYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3RESWJweVg1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIqIi8+DQotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il90RElicUNYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgPC9vd25lZEVuZD4NCi0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfdERJYnFTWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iRGVmYXVsdF9SZXNwb25zaWJsZSIgbWVtYmVyRW5kPSJfdERJYnF5WDVFZDJLbkoyeWpOWGhXUSBfdERJYlZ5WDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il90RElicWlYNUVkMktuSjJ5ak5YaFdRIiBhbm5vdGF0ZWRFbGVtZW50PSJfdERJYnFTWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8Ym9keT5SZXNwb25zaWJpbGl0eSBmb3IgYSB3b3JrIHByb2R1Y3QgaW5kaWNhdGVzIHRoZSByb2xlJ3Mgb3duZXJzaGlwIG9mIGFsbCBpbnN0YW5jZXMgb2YgdGhpcyB3b3JrIHByb2R1Y3QgdHlwZS4gIEZvciBleGFtcGxlLCB0aGUgcm9sZSByZXNwb25zaWJsZSBmb3IgYSB3b3JrIHByb2R1Y3QgYW5zd2VycyB0byBtYW5hZ2VtZW50IGFib3V0IGl0cyBxdWFsaXR5IHN0YXRlLiAgQmVpbmcgcmVzcG9uc2libGUgZm9yIHRoZSB3b3JrIHByb2R1Y3QgZG9lcyBub3QgbWVhbiB0aGF0IHRoZSByb2xlIGlzIHRoZSBvbmx5IG9uZSBtb2RpZnlpbmcgaXQsIGJ1dCBtYWtlcyB1bHRpbWF0ZSBkZWNpc2lvbnMgYWJvdXQgYWNjZXB0aW5nIG9yIHJlamVjdGluZyB0aGVzZSBtb2RpZmljYXRpb25zIHdoZW4gcmV2aWV3aW5nIHRoZXNlIG1vZGlmaWNhdGlvbnMuICBFdmVyeSB3b3JrIHByb2R1Y3QgaGFzIG5vbmUgb3Igb25lIHJvbGUgcmVzcG9uc2libGUgcm9sZS4gPC9ib2R5Pg0KLSAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il90RElicXlYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSIiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3RESWJVU1g1RWQyS25KMnlqTlhoV1EiIGFzc29jaWF0aW9uPSJfdERJYnFTWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il90RElickNYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfdERJYnJTWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgIDwvb3duZWRFbmQ+DQotICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3RESWJyaVg1RWQyS25KMnlqTlhoV1EiIG5hbWU9IkRlZmF1bHRfQWRkaXRpb25hbFBlcmZvcm1lciIgbWVtYmVyRW5kPSJfdERJYnNDWDVFZDJLbkoyeWpOWGhXUSBfdERJYlp5WDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il90RElicnlYNUVkMktuSjJ5ak5YaFdRIiBhbm5vdGF0ZWRFbGVtZW50PSJfdERJYnJpWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8Ym9keT5UaGlzIGFzc29jaWF0aW9uIGRlZmluZXMgYWRkaXRpb25hbCByb2xlcyB0aGF0IGJ5IGRlZmF1bHQgY2FuIGJlIGFzc2lnbmVkIHRvIGhlbHAgY29tcGxldGluZyBhIFRhc2suPC9ib2R5Pg0KLSAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il90RElic0NYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJoZWxwc1BlcmZvcm1pbmciIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3RESWJXaVg1RWQyS25KMnlqTlhoV1EiIGFzc29jaWF0aW9uPSJfdERJYnJpWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il90RElic1NYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfdERJYnNpWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgIDwvb3duZWRFbmQ+DQotICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3RESWJzeVg1RWQyS25KMnlqTlhoV1EiIG5hbWU9IkNvbXBvc2l0aW9uIiBtZW1iZXJFbmQ9Il90REliZVNYNUVkMktuSjJ5ak5YaFdRIF90REliZkNYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3RESWJ0Q1g1RWQyS25KMnlqTlhoV1EiIGFubm90YXRlZEVsZW1lbnQ9Il90RElic3lYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDxib2R5PkFydGlmYWN0IHR5cGVzIGNhbiBiZSBkZWZpbmVkIHRvIGJlIHBoeXNpY2FsbHkgY29tcG9zZWQgb2Ygb3RoZXIgYXJ0aWZhY3RzLiAgRm9yIGV4YW1wbGUsIGEgdXNlIGNhc2UgbW9kZWwgaXMgY29tcG9zZWQgb2YgdXNlIGNhc2VzIGFuZCBhY3RvcnMuPC9ib2R5Pg0KLSAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il90RElidFNYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJEZWZhdWx0RGVsaXZlcmVkV1AiIG1lbWJlckVuZD0iX3RESWJ0eVg1RWQyS25KMnlqTlhoV1EgX3RESWJnaVg1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfdERJYnRpWDVFZDJLbkoyeWpOWGhXUSIgYW5ub3RhdGVkRWxlbWVudD0iX3RESWJ0U1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPGJvZHk+VGhpcyBhc3NvY2lhdGlvbiBkZWZpbmVzIHRoZSBkZWZhdWx0IHBhcnRzIG9mIGEgZGVsaXZlcmFibGUsIGkuZS4gdGhlIHR5cGVzIG9mIHdvcmsgcHJvZHVjdHMgYSBEZWxpdmVyYWJsZSBjb21wcmlzZXMgb2YuICBUaGlzIGFnZ3JlZ2F0aW9uIGNhbiBiZSBvdmVycmlkZGVuIGluIGEgUHJvY2Vzcy48L2JvZHk+DQotICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgPG93bmVkRW5kIHhtaTppZD0iX3RESWJ0eVg1RWQyS25KMnlqTlhoV1EiIG5hbWU9Il9kZWxpdmVyYWJsZSIgdmlzaWJpbGl0eT0icHJpdmF0ZSIgdHlwZT0iX3RESWJmeVg1RWQyS25KMnlqTlhoV1EiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il90RElidFNYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3RESWJ1Q1g1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIqIi8+DQotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il90RElidVNYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgPC9vd25lZEVuZD4NCi0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfdERJYnVpWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iRGVmYXVsdF9PcHRpb25hbElucHV0cyIgbWVtYmVyRW5kPSJfdERJYmFpWDVFZDJLbkoyeWpOWGhXUSBfdERJYnZDWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il90RElidXlYNUVkMktuSjJ5ak5YaFdRIiBhbm5vdGF0ZWRFbGVtZW50PSJfdERJYnVpWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8Ym9keT5UaGlzIGFzc29jaWF0aW9uIHByb3ZpZGVzIGxpbmtzIHRvIHplcm8gb3IgbWFueSBkZWZpbml0aW9ucyBvZiBXb3JrIFByb2R1Y3RzIHRoYXQgYXJlIGRlZmluZWQgYXMgb3B0aW9uYWwgaW5wdXRzIGZvciBwZXJmb3JtaW5nIHRoaXMgVGFzay48L2JvZHk+DQotICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgPG93bmVkRW5kIHhtaTppZD0iX3RESWJ2Q1g1RWQyS25KMnlqTlhoV1EiIG5hbWU9Im9wdGlvbmFsSW5wdXRUbyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdERJYldpWDVFZDJLbkoyeWpOWGhXUSIgYXNzb2NpYXRpb249Il90RElidWlYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3RESWJ2U1g1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIqIi8+DQotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il90RElidmlYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgPC9vd25lZEVuZD4NCi0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfdERJYnZ5WDVFZDJLbkoyeWpOWGhXUSIgbWVtYmVyRW5kPSJfdERJYmJTWDVFZDJLbkoyeWpOWGhXUSBfdERJYndTWDVFZDJLbkoyeWpOWGhXUSIgaXNEZXJpdmVkPSJ0cnVlIj4NCi0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3RESWJ3Q1g1RWQyS25KMnlqTlhoV1EiIGFubm90YXRlZEVsZW1lbnQ9Il90RElidnlYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDxib2R5PlRoaXMgZGVyaXZlZCBhc3NvY2lhdGlvbiBpcyBhIHNob3J0Y3V0IGZvciBuYXZpZ2F0aW9uIGFsb25nIHRoZSBhc3NvY2lhdGlvbiBwcm9wZXJ0aWVzIENvbnRlbnRFbGVtZW50LnByZXNlbnRhdGlvbi5zZWN0aW9ucy48L2JvZHk+DQotICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgPG93bmVkRW5kIHhtaTppZD0iX3RESWJ3U1g1RWQyS25KMnlqTlhoV1EiIG5hbWU9Il90YXNrIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il90REliV2lYNUVkMktuSjJ5ak5YaFdRIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfdERJYnZ5WDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il90RElid2lYNUVkMktuSjJ5ak5YaFdRIiBtZW1iZXJFbmQ9Il90RElianlYNUVkMktuSjJ5ak5YaFdRIF90RElieENYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3RESWJ3eVg1RWQyS25KMnlqTlhoV1EiIGFubm90YXRlZEVsZW1lbnQ9Il90RElid2lYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDxib2R5PlRoaXMgY29tcG9zaXRpb24gYXNzb2NpYXRpb24gYWRkcyBhbiBvcHRpb25hbCBwcmUtY29uZGl0aW9uIHRvIGEgV29yayBEZWZpbml0aW9uLiAgQSBwcmUtY29uZGl0aW9uIGRlZmluZXMgYW55IGtpbmQgb2YgY29uc3RyYWludCB0aGF0IG11c3QgZXZhbHVhdGUgdG8gdHJ1ZSBiZWZvcmUgdGhlIHdvcmsgZGVzY3JpYmVkIGZvciB0aGUgV29yayBEZWZpbml0aW9uIGNhbiBzdGFydC4gRm9yIGV4YW1wbGUsIGEgcHJlLWNvbmRpdGlvbiBmb3IgYSBUYXNrIGNvdWxkIGRlZmluZSB0aGF0IGFuIGlucHV0IFdvcmsgUHJvZHVjdCBuZWVkcyB0byBiZSBpbiBhIHNwZWNpZmljIHN0YXRlIG9yIHRoYXQgb3RoZXIgcmVsYXRlZCB3b3JrIG11c3QgYmUgaW4gYSBjZXJ0YWluIHN0YXRlIChlLmcuICdJbnB1dCBkb2N1bWVudCBYIGhhcyBiZWVuIHJldmlld2VkIGFuZCBzaWduZWQgYnkgY3VzdG9tZXIgQU5EIFRhc2sgJnF1b3Q7TWFuYWdlbWVudCBSZXZpZXcmcXVvdDsgaXMgY29tcGxldGUnKSBiZWZvcmUgdGhlIFRhc2sgY2FuIGJlZ2luLg0KLTwvYm9keT4NCi0gICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfdERJYnhDWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iX3dvcmtEZWZpbml0aW9uIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il90REliakNYNUVkMktuSjJ5ak5YaFdRIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfdERJYndpWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il90RElieFNYNUVkMktuSjJ5ak5YaFdRIiBtZW1iZXJFbmQ9Il90RElia2lYNUVkMktuSjJ5ak5YaFdRIF90RElieHlYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3RESWJ4aVg1RWQyS25KMnlqTlhoV1EiIGFubm90YXRlZEVsZW1lbnQ9Il90RElieFNYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDxib2R5PlRoaXMgY29tcG9zaXRpb24gYXNzb2NpYXRpb24gYWRkcyBhbiBvcHRpb25hbCBwb3N0LWNvbmRpdGlvbiB0byBhIFdvcmsgRGVmaW5pdGlvbi4gIEEgcG9zdC1jb25kaXRpb24gZGVmaW5lcyBhbnkga2luZCBvZiBjb25zdHJhaW50IHRoYXQgbXVzdCBldmFsdWF0ZSB0byB0cnVlIGJlZm9yZSB0aGUgd29yayBkZXNjcmliZWQgZm9yIHRoZSBXb3JrIERlZmluaXRpb24gY2FuIGJlIGRlY2xhcmVkIGNvbXBsZXRlZCBvciBmaW5pc2hlZCBhbmQgd2hpY2ggb3RoZXIgV29yayBEZWZpbml0aW9ucyBtaWdodCBkZXBlbmQgdXBvbiAoZS5nLiBmb3IgdGhlaXIgcHJlLWNvbmRpdGlvbnMpLiAgRm9yIGV4YW1wbGUsIGEgcG9zdC1jb25kaXRpb24gZm9yIGEgVGFzayBjb3VsZCBkZWZpbmUgdGhhdCBhIHdvcmsgcHJvZHVjdCBkZWZpbmVkIHRvIGJlIHRoZSBvdXRwdXQgbXVzdCBiZSBpbiBhIHNwZWNpZmljIHN0YXRlIGJlZm9yZSB0aGUgVGFzayBjYW4gZW5kIChlLmcuICdVc2UgQ2FzZSBtdXN0IGJlIGluIHN0YXRlIGZ1bGx5IGRlc2NyaWJlZCBhbmQgcmV2aWV3ZWQgYnkgU3lzdGVtIEFuYWx5c3QnKS48L2JvZHk+DQotICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgPG93bmVkRW5kIHhtaTppZD0iX3RESWJ4eVg1RWQyS25KMnlqTlhoV1EiIG5hbWU9Il93b3JrRGVmaW5pdGlvbiIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdERJYmpDWDVFZDJLbkoyeWpOWGhXUSIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iX3RESWJ4U1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfdEVLOUlTWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iQ29uY2VwdCI+DQotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il90RUs5SWlYNUVkMktuSjJ5ak5YaFdRIiBhbm5vdGF0ZWRFbGVtZW50PSJfdEVLOUlTWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8Ym9keT5BIENvbmNlcHQgaXMgYSBzcGVjaWZpYyB0eXBlIG9mIGd1aWRhbmNlIHRoYXQgb3V0bGluZXMga2V5IGlkZWFzIGFzc29jaWF0ZWQgd2l0aCBiYXNpYyBwcmluY2lwbGVzIHVuZGVybHlpbmcgdGhlIHJlZmVyZW5jZWQgaXRlbS4gQ29uY2VwdHMgbm9ybWFsbHkgYWRkcmVzcyBtb3JlIGdlbmVyYWwgdG9waWNzIHRoYW4gR3VpZGVsaW5lcyBhbmQgc3BhbiBhY3Jvc3Mgc2V2LWVyYWwgd29yayBwcm9kdWN0IGFuZC9vciB0YXNrcy9hY3Rpdml0aWVzLjwvYm9keT4NCi0gICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfdEVLOUl5WDVFZDJLbkoyeWpOWGhXUSIgZ2VuZXJhbD0iX3RESWJjeVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfdEVLOUpDWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iQ2hlY2tsaXN0Ij4NCi0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3RFSzlKU1g1RWQyS25KMnlqTlhoV1EiIGFubm90YXRlZEVsZW1lbnQ9Il90RUs5SkNYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDxib2R5PkEgQ2hlY2tsaXN0IGlzIGEgc3BlY2lmaWMgdHlwZSBvZiBndWlkYW5jZSB0aGF0IGlkZW50aWZpZXMgYSBzZXJpZXMgb2YgaXRlbXMgdGhhdCBuZWVkIHRvIGJlIGNvbXBsZXRlZCBvciB2ZXJpLWZpZWQuICBDaGVja2xpc3RzIGFyZSBvZnRlbiB1c2VkIGluIHJldmlld3Mgc3VjaCBhcyB3YWxrdGhyb3VnaHMgb3IgaW5zcGVjdGlvbnMuIDwvYm9keT4NCi0gICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfdEVLOUppWDVFZDJLbkoyeWpOWGhXUSIgZ2VuZXJhbD0iX3RESWJjeVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfdEVLOUp5WDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iRXhhbXBsZSI+DQotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il90RUs5S0NYNUVkMktuSjJ5ak5YaFdRIiBhbm5vdGF0ZWRFbGVtZW50PSJfdEVLOUp5WDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8Ym9keT5BbiBFeGFtcGxlIGlzIGEgc3BlY2lmaWMgdHlwZSBvZiBHdWlkYW5jZSB0aGF0IHJlcHJlc2VudHMgYSB0eXBpY2FsLCBwYXJ0aWFsbHkgY29tcGxldGVkLCBzYW1wbGUgaW5zdGFuY2Ugb2Ygb25lIG9yIG1vcmUgd29yayBwcm9kdWN0cyBvciBzY2VuYXJpbyBsaWtlIGRlc2NyaXB0aW9ucyBvZiBob3cgVGFzayBtYXkgYmUgcGVyZm9ybWVkLiBFeGFtcGxlcyBjYW4gYmUgcmVsYXRlZCB0byBXb3JrIFByb2R1Y3RzIGFzIHdlbGwgYXMgVGFza3MgdGhhdCBwcm9kdWNlIHRoZW0gYXMgd2VsbCBhcyBhbnkgb3RoZXIgQ29udGVudCBFbGVtZW50LjwvYm9keT4NCi0gICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfdEVLOUtTWDVFZDJLbkoyeWpOWGhXUSIgZ2VuZXJhbD0iX3RESWJjeVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfdEVLOUtpWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iR3VpZGVsaW5lIj4NCi0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3RFSzlLeVg1RWQyS25KMnlqTlhoV1EiIGFubm90YXRlZEVsZW1lbnQ9Il90RUs5S2lYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDxib2R5PkEgR3VpZGVsaW5lIGlzIGEgc3BlY2lmaWMgdHlwZSBvZiBndWlkYW5jZSB0aGF0IHByb3ZpZGVzIGFkZGl0aW9uYWwgZGV0YWlsIG9uIGhvdyB0byBwZXJmb3JtIGEgcGFydGljdWxhciB0YXNrIG9yIGdyb3VwaW5nIG9mIHRhc2tzIChlLmcuIGdyb3VwZWQgdG9nZXRoZXIgYXMgYWN0aXZpdGllcykgb3IgdGhhdCBwcm92aWRlcyBhZGRpdGlvbmFsIGRldGFpbCwgcnVsZXMsIGFuZCByZWNvbW1lbmRhdGlvbnMgb24gd29yayBwcm9kdWN0cyBhbmQgdGhlaXIgcHJvcGVydGllcy4gIEFtb25nc3Qgb3RoZXJzLCBpdCBjYW4gaW5jbHVkZSBkZXRhaWxzIGFib3V0IGJlc3QgcHJhY3RpY2VzIGFuZCBkaWZmZXJlbnQgYXBwcm9hY2hlcyBmb3IgZG9pbmcgd29yaywgaG93IHRvIHVzZSBwYXJ0aWN1bGFyIHR5cGVzIG9mIHdvcmsgcHJvZHVjdHMsIGluZm9ybWF0aW9uIG9uIGRpZmZlcmVudCBzdWJ0eXBlcyBhbmQgdmFyaWFudHMgb2YgdGhlIHdvcmsgcHJvZHVjdCBhbmQgaG93IHRoZXkgZXZvbHZlIHRocm91Z2hvdXQgYSBsaWZlY3ljbGUsIGRpc2N1c3Npb25zIG9uIHNraWxscyB0aGUgcGVyZm9ybWluZyByb2xlcyBzaG91bGQgYWNxdWlyZSBvciBpbXByb3ZlIHVwb24sIG1lYXN1cmVtZW50cyBmb3IgcHJvZ3Jlc3MgYW5kIG1hdHVyaXR5LCBldGMuPC9ib2R5Pg0KLSAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il90RUs5TENYNUVkMktuSjJ5ak5YaFdRIiBnZW5lcmFsPSJfdERJYmN5WDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il90RUs5TFNYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJSZXBvcnQiPg0KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfdEVLOUxpWDVFZDJLbkoyeWpOWGhXUSIgYW5ub3RhdGVkRWxlbWVudD0iX3RFSzlMU1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPGJvZHk+QSBSZXBvcnQgaXMgYSBwcmVkZWZpbmVkIHRlbXBsYXRlIG9mIGEgcmVzdWx0IHRoYXQgaXMgZ2VuZXJhdGVkIG9uIHRoZSBiYXNpcyBvZiBvdGhlciB3b3JrIHByb2R1Y3RzIGFzIGFuIG91dHB1dCBmcm9tIHNvbWUgZm9ybSBvZiB0b29sIGF1dG9tYXRpb24uIEFuIGV4YW1wbGUgZm9yIGEgcmVwb3J0IHdvdWxkIGJlIGEgdXNlIGNhc2UgbW9kZWwgc3VydmV5LCB3aGljaCBpcyBnZW5lcmF0ZWQgYnkgZXh0cmFjdGluZyBkaWFncmFtIGluZm9ybWF0aW9uIGZyb20gYSBncmFwaGljYWwgbW9kZWwgYW5kIHRleHR1YWwgaW5mb3JtYXRpb24gZnJvbSBkb2N1bWVudHMgYW5kIGNvbWJpbmVzIHRoZXNlIHR3byB0eXBlcyBvZiBpbmZvcm1hdGlvbiBpbnRvIGEgcmVwb3J0LjwvYm9keT4NCi0gICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfdEVLOUx5WDVFZDJLbkoyeWpOWGhXUSIgZ2VuZXJhbD0iX3RESWJjeVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfdEVLOU1DWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iVGVtcGxhdGUiPg0KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfdEVLOU1TWDVFZDJLbkoyeWpOWGhXUSIgYW5ub3RhdGVkRWxlbWVudD0iX3RFSzlNQ1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPGJvZHk+QSBUZW1wbGF0ZSBpcyBhIHNwZWNpZmljIHR5cGUgb2YgZ3VpZGFuY2UgdGhhdCBwcm92aWRlcyBmb3IgYSB3b3JrIHByb2R1Y3QgYSBwcmUtZGVmaW5lZCB0YWJsZSBvZiBjb250ZW50cywgc2VjdGlvbnMsIHBhY2thZ2VzLCBhbmQvb3IgaGVhZGluZ3MsIGEgc3RhbmRhcmRpemVkIGZvcm1hdCwgYXMgd2VsbCBhcyBkZXNjcmlwdGlvbnMgaG93IHRoZSBzZWN0aW9ucyBhbmQgcGFja2FnZXMgYXJlIHN1cHBvc2VkIHRvIGJlIHVzZWQgYW5kIGNvbXBsZXRlZC4gVGVtcGxhdGVzIGNhbm5vdCBvbmx5IGJlIHByb3ZpZGVkIGZvciBkb2N1bWVudHMsIGJ1dCBhbHNvIGZvciBjb25jZXB0dWFsIG1vZGVscyBvciBwaHlzaWNhbCBkYXRhIHN0b3Jlcy48L2JvZHk+DQotICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3RFSzlNaVg1RWQyS25KMnlqTlhoV1EiIGdlbmVyYWw9Il90REliY3lYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3RFSzlNeVg1RWQyS25KMnlqTlhoV1EiIG5hbWU9IlN1cHBvcnRpbmdNYXRlcmlhbCI+DQotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il90RUs5TkNYNUVkMktuSjJ5ak5YaFdRIiBhbm5vdGF0ZWRFbGVtZW50PSJfdEVLOU15WDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8Ym9keT5TdXBwb3J0aW5nIE1hdGVyaWFscyBpcyBjYXRjaGFsbCBmb3Igb3RoZXIgdHlwZXMgb2YgZ3VpZGFuY2Ugbm90IHNwZWNpZmljYWxseSBkZWZpbmVkIGVsc2V3aGVyZS4gSXQgY2FuIGJlIHJlbGF0ZWQgdG8gYWxsIGtpbmRzIG9mIENvbnRlbnQgRWxlbWVudHMsIGkuZS4gaW5jbHVkaW5nIG90aGVyIGd1aWRhbmNlIGVsZW1lbnRzLjwvYm9keT4NCi0gICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfdEVLOU5TWDVFZDJLbkoyeWpOWGhXUSIgZ2VuZXJhbD0iX3RESWJjeVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfdEVLOU5pWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iVG9vbE1lbnRvciI+DQotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il90RUs5TnlYNUVkMktuSjJ5ak5YaFdRIiBhbm5vdGF0ZWRFbGVtZW50PSJfdEVLOU5pWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8Ym9keT5BIFRvb2wgTWVudG9yIGlzIGEgc3BlY2lmaWMgdHlwZSBvZiBndWlkYW5jZSB0aGF0IHNob3dzIGhvdyB0byB1c2UgYSBzcGVjaWZpYyB0b29sIHRvIGFjY29tcGxpc2ggc29tZSBwaWVjZSBvZiB3b3JrIGEgV29yayBQcm9kdWN0IGVpdGhlciBpbiB0aGUgY29udGV4dCBvZiBvciBpbmRlcGVuZGVudCBmcm9tIGEgVGFzayBvciBBY3Rpdml0eS48L2JvZHk+DQotICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3RFSzlPQ1g1RWQyS25KMnlqTlhoV1EiIGdlbmVyYWw9Il90REliY3lYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3RFSzlPU1g1RWQyS25KMnlqTlhoV1EiIG5hbWU9IldoaXRlcGFwZXIiPg0KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfdEVLOU9pWDVFZDJLbkoyeWpOWGhXUSIgYW5ub3RhdGVkRWxlbWVudD0iX3RFSzlPU1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPGJvZHk+V2hpdGVwYXBlcnMgYXJlIGEgc3BlY2lhbCBDb25jZXB0IGd1aWRhbmNlIHRoYXQgaGF2ZSBiZWVuIGV4dGVybmFsbHkgcmV2aWV3ZWQgb3IgcHVibGlzaGVkIGFuZCBjYW4gYmUgcmVhZCBhbmQgdW5kZXJzdG9vZCBpbiBpc29sYXRpb24gb2Ygb3RoZXIgY29udGVudCBlbGVtZW50cyBhbmQgZ3VpZGFuY2UuPC9ib2R5Pg0KLSAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il90RUs5T3lYNUVkMktuSjJ5ak5YaFdRIiBnZW5lcmFsPSJfdEVLOUlTWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il90RUs5UENYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJUZXJtRGVmaW5pdGlvbiI+DQotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il90RUs5UFNYNUVkMktuSjJ5ak5YaFdRIiBhbm5vdGF0ZWRFbGVtZW50PSJfdEVLOVBDWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8Ym9keT5UZXJtRGVmaW5pdGlvbnMgZGVmaW5lIGNvbmNlcHRzIGFuZCBhcmUgdXNlZCB0byBidWlsZCB1cCB0aGUgR2xvc3NhcnkuIFRoZXkgYXJlIG5vdCBkaXJlY3RseSByZWxhdGVkIHRvIENvbnRlbnRFbGVtZW50cywgYnV0IHRoZWlyIHJlbGF0aW9uc2hpcCBpcyBiZWluZyBkZXJpdmVkIHdoZW4gdGhlIFRlcm0gaXMgdXNlZCBpbiB0aGUgQ29udGVudEVsZW1lbnRzIGRlc2NyaXB0aW9uIHRleHQuPC9ib2R5Pg0KLSAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il90RUs5UGlYNUVkMktuSjJ5ak5YaFdRIiBnZW5lcmFsPSJfdERJYmN5WDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il90REliV2lYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJUYXNrIj4NCi0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3RESWJXeVg1RWQyS25KMnlqTlhoV1EiIGFubm90YXRlZEVsZW1lbnQ9Il90REliV2lYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDxib2R5PkEgVGFzayBpcyBhIGNvbnRlbnQgZWxlbWVudCB0aGF0IGRlc2NyaWJlcyB3b3JrIGJlaW5nIHBlcmZvcm1lZCBieSBSb2xlcy4gIEl0IGRlZmluZXMgb25lIGRlZmF1bHQgcGVyZm9ybWluZyBSb2xlIGFzIHdlbGwgYXMgbWFueSBhZGRpdGlvbmFsIHBlcmZvcm1lcnMuICBBIFRhc2sgaXMgYXNzb2NpYXRlZCB0byBpbnB1dCBhbmQgb3V0cHV0IHdvcmsgcHJvZHVjdHMuICBJbnB1dHMgYXJlIGRpZmZlcmVudGlhdGVkIGluIG1hbmRhdG9yeSB2ZXJzdXMgb3B0aW9uYWwgaW5wdXRzLiAgVGhlIGFzc29jaWF0aW9ucyB0byBXb3JrIFByb2R1Y3RzIGFyZSBub3QgaW5zdGFudGlhdGFibGUvdmFyaWFibGUtbGlrZSBwYXJhbWV0ZXJzLiAgVGhleSByYXRoZXIgZXhwcmVzcyAoaHlwZXItKWxpbmtzIHRvIHRoZSBkZXNjcmlwdGlvbnMgb2YgdGhlIHdvcmsgcHJvZHVjdHMgdHlwZXMgdGhhdCBhcmUgcmVsYXRlZCB0byB0aGUgVGFzayBhcyBpbnB1dHMgYW5kIG91dHB1dHMuICBJbiBvdGhlciB3b3JkcywgdGhlc2UgYXNzb2NpYXRpb25zIGFyZSBub3QgaW50ZW5kZWQgdG8gYmUgdXNlZCB0byBjYXB0dXJlIHdoaWNoIGNvbmNyZXRlIGluc3RhbmNlcyB3aWxsIGJlIHBhc3NlZCB3aGVuIGluc3RhbnRpYXRpbmcgdGhlIG1ldGhvZCBpbiBhIHByb2plY3QuICBBbGwgb2YgdGhlIFRhc2sncyBkZWZhdWx0IGFzc29jaWF0aW9ucyBjYW4gYmUgb3ZlcnJpZGRlbiBpbiBhbiBhY3R1YWwgcHJvY2VzcyBkZWZpbml0aW9uLg0KLUEgVGFzayBkZXNjcmliZXMgYW4gYXNzaWduYWJsZSB1bml0IG9mIHdvcmsuICBFdmVyeSBUYXNrIGlzIGFzc2lnbmVkIHRvIHNwZWNpZmljIFJvbGVzLiAgVGhlIGdyYW51bGFyaXR5IG9mIGEgVGFzayBpcyBnZW5lcmFsbHkgYSBmZXcgaG91cnMgdG8gYSBmZXcgZGF5cy4gIEl0IHVzdWFsbHkgYWZmZWN0cyBvbmUgb3Igb25seSBhIHNtYWxsIG51bWJlciBvZiB3b3JrIHByb2R1Y3RzLiBBIFRhc2sgaXMgdXNlZCBhcyBhbiBlbGVtZW50IG9mIGRlZmluaW5nIGEgcHJvY2Vzcy4gVGFza3MgYXJlIGZ1cnRoZXIgdXNlZCBmb3IgcGxhbm5pbmcgYW5kIHRyYWNraW5nIHByb2dyZXNzOyB0aGVyZWZvcmUsIGlmIHRoZXkgYXJlIGRlZmluZWQgdG9vIGZpbmUtZ3JhaW5lZCwgdGhleSB3aWxsIGJlIG5lZ2xlY3RlZCwgYW5kIGlmIHRoZXkgYXJlIHRvbyBsYXJnZSwgcHJvZ3Jlc3Mgd291bGQgaGF2ZSB0byBiZSBleHByZXNzZWQgaW4gdGVybXMgb2YgYSBUYXNrJ3MgcGFydHMgKGUuZy4gU3RlcHMsIHdoaWNoIGlzIG5vdCByZWNvbW1lbmRlZCkuIA0KLUEgVGFzayBoYXMgYSBjbGVhciBwdXJwb3NlIGluIHdoaWNoIHRoZSBwZXJmb3JtaW5nIHJvbGVzIGFjaGlldmUgYSB3ZWxsIGRlZmluZWQgZ29hbC4gIEl0IHByb3ZpZGVzIGNvbXBsZXRlIHN0ZXAtYnktc3RlcCBleHBsYW5hdGlvbnMgb2YgZG9pbmcgYWxsIHRoZSB3b3JrIHRoYXQgbmVlZHMgdG8gYmUgZG9uZSB0byBhY2hpZXZlIHRoaXMgZ29hbC4gIFRoaXMgZGVzY3JpcHRpb24gaXMgY29tcGxldGUsIGluZGVwZW5kZW50IG9mIHdoZW4gaW4gYSBwcm9jZXNzIGxpZmVjeWNsZSB0aGUgd29yayB3b3VsZCBhY3R1YWxseSBiZSBkb25lLiAgSXQgdGhlcmVmb3JlIGRvZXMgbm90IGRlc2NyaWJlIHdoZW4geW91IGRvIHdoYXQgd29yayBhdCB3aGF0IHBvaW50IG9mIHRpbWUsIGJ1dCBkZXNjcmliZXMgYWxsIHRoZSB3b3JrIHRoYXQgZ2V0cyBkb25lIHRocm91Z2hvdXQgdGhlIGRldmVsb3BtZW50IGxpZmVjeWNsZSB0aGF0IGNvbnRyaWJ1dGVzIHRvIHRoZSBhY2hpZXZlbWVudCBvZiB0aGlzIGdvYWwuICBXaGVuIHRoZSBUYXNrIGlzIGJlaW5nIGFwcGxpZWQgaW4gYSBwcm9jZXNzIHRoZW4gdGhpcyBwcm9jZXNzIGFwcGxpY2F0aW9uIChkZWZpbmVkIGFzIFRhc2sgRGVzY3JpcHRvcikgcHJvdmlkZXMgdGhlIGluZm9ybWF0aW9uIG9mIHdoaWNoIHBpZWNlcyBvZiB0aGUgVGFzayB3aWxsIGFjdHVhbGx5IGJlIHBlcmZvcm1lZCBhdCBhbnkgcGFydGljdWxhciBwb2ludCBpbiB0aW1lLiBUaGlzIGFzc3VtZXMgdGhhdCB0aGUgVGFzayB3aWxsIGJlIHBlcmZvcm1lZCBpbiB0aGUgcHJvY2VzcyBvdmVyIGFuZCBvdmVyIGFnYWluLCBidXQgZWFjaCB0aW1lIHdpdGggYSBzbGlnaHRseSBkaWZmZXJlbnQgZW1waGFzaXMgb24gZGlmZmVyZW50IHN0ZXBzIG9yIGFzcGVjdHMgb2YgdGhlIHRhc2sgZGVzY3JpcHRpb24uIA0KLUZvciBleGFtcGxlLCBhIFRhc2sgc3VjaCBhcyAmcXVvdDtEZXZlbG9wIFVzZSBDYXNlIE1vZGVsJnF1b3Q7IGRlc2NyaWJlcyBhbGwgdGhlIHdvcmsgdGhhdCBuZWVkcyB0byBiZSBkb25lIHRvIGRldmVsb3AgYSBjb21wbGV0ZSB1c2UgY2FzZSBtb2RlbC4gVGhpcyB3b3VsZCBjb21wcmlzZSBvZiB0aGUgaWRlbnRpZmljYXRpb24gYW5kIG5hbWluZyBvZiB1c2UgY2FzZXMgYW5kIGFjdG9ycywgdGhlIHdyaXRpbmcgb2YgYSBicmllZiBkZXNjcmlwdGlvbiwgdGhlIG1vZGVsaW5nIG9mIHVzZSBjYXNlcyBhbmQgdGhlaXIgcmVsYXRpb25zaGlwcyBpbiBkaWFncmFtcywgdGhlIGRldGFpbGVkIGRlc2NyaXB0aW9uIG9mIGEgYmFzaWMgZmxvdywgdGhlIGRldGFpbGVkIGRlc2NyaXB0aW9uIG9mIGFsdGVybmF0aXZlcyBmbG93cywgcGVyZm9ybWluZyBvZiB3YWxrdGhyb3VnaHMgd29ya3Nob3BzIGFuZCByZXZpZXdzLCBldGMuICBBbGwgb2YgdGhlc2UgcGFydHMgY29udHJpYnV0ZSB0byB0aGUgZGV2ZWxvcG1lbnQgZ29hbCBvZiBkZXZlbG9waW5nIHRoZSB1c2UgY2FzZSBtb2RlbCwgYnV0IHRoZSBwYXJ0cyB3aWxsIGJlIHBlcmZvcm1lZCBhdCBkaWZmZXJlbnQgcG9pbnRzIGluIHRpbWUgaW4gYSBwcm9jZXNzLiAgSWRlbnRpZmljYXRpb24sIG5hbWluZywgYW5kIGJyaWVmIGRlc2NyaXB0aW9ucyB3b3VsZCBiZSBwZXJmb3JtZWQgZWFybHkgaW4gYSB0eXBpY2FsIGRldmVsb3BtZW50IHByb2Nlc3MgdmVyc3VzIHRoZSB3cml0aW5nIG9mIGRldGFpbGVkIGFsdGVybmF0aXZlIGZsb3dzIHdoaWNoIHdvdWxkIGJlIHBlcmZvcm1lZCBtdWNoIGxhdGVyLiAgQWxsIHRoZXNlIHBhcnRzIG9yIHN0ZXBzIHdpdGhpbiB0aGUgc2FtZSBUYXNrIGRlZmluZSB0aGUgJnF1b3Q7bWV0aG9kJnF1b3Q7IG9mIERldmVsb3BpbmcgYSBVc2UgQ2FzZSBNb2RlbC4gIEFwcGx5aW5nIHN1Y2ggYSBtZXRob2QgaW4gYSBsaWZlY3ljbGUgKGkuZS4gaW4gYSBwcm9jZXNzKSBpcyBkZWZpbmluZyB3aGljaCBzdGVwcyBhcmUgZG9uZSB3aGVuIGdvaW5nIGZyb20gb25lIGl0ZXJhdGlvbiB0byB0aGUgbmV4dC4NCi08L2JvZHk+DQotICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il90RUs5VlNYNUVkMktuSjJ5ak5YaFdRIiBhbm5vdGF0ZWRFbGVtZW50PSJfdERJYldpWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8Ym9keT5UaGlzIGlzIHRoZSBHdWlkYW5jZSBUeXBlcyBwYWNrYWdlJ3MgZXh0ZW5zaW9uIG9mIFRhc2sgKGRlZmluZWQgaW4gQ29udGVudCBFbGVtZW50cykgcHJvdmlkaW5nIGFkZGl0aW9uYWwgYXNzb2NpYXRpb25zLjwvYm9keT4NCi0gICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfdERJYlhDWDVFZDJLbkoyeWpOWGhXUSIgZ2VuZXJhbD0iX3RCOEluQ1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfdERJYlhTWDVFZDJLbkoyeWpOWGhXUSIgZ2VuZXJhbD0iX3RESWJqQ1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfdERJYlhpWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0icGVyZm9ybWVkQnkiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3RESWJVU1g1RWQyS25KMnlqTlhoV1EiIGFzc29jaWF0aW9uPSJfdERJYmxTWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il90REliWHlYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfdERJYllDWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3RESWJZU1g1RWQyS25KMnlqTlhoV1EiIG5hbWU9Im1hbmRhdG9yeUlucHV0IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il90REliY0NYNUVkMktuSjJ5ak5YaFdRIiBhc3NvY2lhdGlvbj0iX3RESWJtaVg1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfdERJYllpWDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IioiLz4NCi0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3RESWJZeVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il90REliWkNYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJvdXRwdXQiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3RESWJjQ1g1RWQyS25KMnlqTlhoV1EiIGFzc29jaWF0aW9uPSJfdERJYm55WDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il90REliWlNYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfdERJYlppWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3RESWJaeVg1RWQyS25KMnlqTlhoV1EiIG5hbWU9ImFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il90REliVVNYNUVkMktuSjJ5ak5YaFdRIiBhc3NvY2lhdGlvbj0iX3RESWJyaVg1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfdERJYmFDWDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IioiLz4NCi0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3RESWJhU1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il90REliYWlYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJvcHRpb25hbElucHV0IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il90REliY0NYNUVkMktuSjJ5ak5YaFdRIiBhc3NvY2lhdGlvbj0iX3RESWJ1aVg1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfdERJYmF5WDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IioiLz4NCi0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3RESWJiQ1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il90REliYlNYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJzdGVwcyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdERJYmlDWDVFZDJLbkoyeWpOWGhXUSIgaXNEZXJpdmVkPSJ0cnVlIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBhc3NvY2lhdGlvbj0iX3RESWJ2eVg1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfdERJYmJpWDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IioiLz4NCi0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3RESWJieVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il90RUs5VmlYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJ0b29sTWVudG9ycyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdEVLOU5pWDVFZDJLbkoyeWpOWGhXUSIgYXNzb2NpYXRpb249Il90RVV1VlNYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3RFSzlWeVg1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIqIi8+DQotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il90RUs5V0NYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfdEVLOVdTWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il90RVV1THlYNUVkMktuSjJ5ak5YaFdRIiBhc3NvY2lhdGlvbj0iX3RFVXVheVg1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfdEVLOVdpWDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IioiLz4NCi0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3RFSzlXeVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il90RVV1TENYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJSZXVzYWJsZUFzc2V0Ij4NCi0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3RFVXVMU1g1RWQyS25KMnlqTlhoV1EiIGFubm90YXRlZEVsZW1lbnQ9Il90RVV1TENYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDxib2R5PkEgUmV1c2FibGUgQXNzZXQgcHJvdmlkZXMgYSBzb2x1dGlvbiB0byBhIHByb2JsZW0gZm9yIGEgZ2l2ZW4gY29udGV4dC4gVGhlIGFzc2V0IG1heSBoYXZlIGEgdmFyaWFiaWxpdHkgcG9pbnQsIHdoaWNoIGlzIGEgbG9jYXRpb24gaW4gdGhlIGFzc2V0IHRoYXQgbWF5IGhhdmUgYSB2YWx1ZSBwcm92aWRlZCBvciBjdXN0b21pemVkIGJ5IHRoZSBhc3NldCBjb25zdW1lci4gVGhlIGFzc2V0IGhhcyBydWxlcyBmb3IgdXNhZ2Ugd2hpY2ggYXJlIHRoZSBpbnN0cnVjdGlvbnMgZGVzY3JpYmluZw0KLWhvdyB0aGUgYXNzZXQgc2hvdWxkIGJlIHVzZWQuDQotPC9ib2R5Pg0KLSAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il90RVV1TGlYNUVkMktuSjJ5ak5YaFdRIiBnZW5lcmFsPSJfdERJYmN5WDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il90RVV1THlYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMiPg0KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfdEVVdU1DWDVFZDJLbkoyeWpOWGhXUSIgYW5ub3RhdGVkRWxlbWVudD0iX3RFVXVMeVg1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPGJvZHk+RXN0aW1hdGlvbiBDb25zaWRlcmF0aW9ucyBxdWFsaWZ5IHRoZSB1c2FnZSBhbmQgYXBwbGljYXRpb24gb2YgZXN0aW1hdGlvbiBtZXRyaWNzIGluIHRoZSBkZXZlbG9wbWVudCBvZiBhbiBhY3R1YWwgZXN0aW1hdGUuPC9ib2R5Pg0KLSAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il90RVV1TVNYNUVkMktuSjJ5ak5YaFdRIiBnZW5lcmFsPSJfdERJYmN5WDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il90RVV1TWlYNUVkMktuSjJ5ak5YaFdRIiBtZW1iZXJFbmQ9Il90RVV1TkNYNUVkMktuSjJ5ak5YaFdRIF90RUs5WFNYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3RFVXVNeVg1RWQyS25KMnlqTlhoV1EiIGFubm90YXRlZEVsZW1lbnQ9Il90RVV1TWlYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDxib2R5PkNvbnRlbnQgRWxlbWVudHMgY2FuIGJlIHJlbGF0ZWQgdG8gYW55IG51bWJlciBvZiBTdXBwb3J0aW5nIE1hdGVyaWFsIGd1aWRhbmNlIGVsZW1lbnRzLjwvYm9keT4NCi0gICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfdEVVdU5DWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iX2NvbnRlbnRFbGVtZW50IiB2aXNpYmlsaXR5PSJwcml2YXRlIiB0eXBlPSJfdEI4SW5DWDVFZDJLbkoyeWpOWGhXUSIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iX3RFVXVNaVg1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfdEVVdU5TWDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IioiLz4NCi0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3RFVXVOaVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICA8L293bmVkRW5kPg0KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il90RVV1TnlYNUVkMktuSjJ5ak5YaFdRIiBtZW1iZXJFbmQ9Il90RVV1T1NYNUVkMktuSjJ5ak5YaFdRIF90RUs5WUNYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3RFVXVPQ1g1RWQyS25KMnlqTlhoV1EiIGFubm90YXRlZEVsZW1lbnQ9Il90RVV1TnlYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDxib2R5PkNvbnRlbnQgRWxlbWVudHMgY2FuIHJlZmVyIHRvIGFueSBudW1iZXIgb2YgQ29uY2VwdCBndWlkYW5jZS4gPC9ib2R5Pg0KLSAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il90RVV1T1NYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJfY29udGVudEVsZW1lbnQiIHZpc2liaWxpdHk9InByaXZhdGUiIHR5cGU9Il90QjhJbkNYNUVkMktuSjJ5ak5YaFdRIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfdEVVdU55WDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il90RVV1T2lYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfdEVVdU95WDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgIDwvb3duZWRFbmQ+DQotICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3RFVXVQQ1g1RWQyS25KMnlqTlhoV1EiIG1lbWJlckVuZD0iX3RFVXVQaVg1RWQyS25KMnlqTlhoV1EgX3RFSzlZeVg1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfdEVVdVBTWDVFZDJLbkoyeWpOWGhXUSIgYW5ub3RhdGVkRWxlbWVudD0iX3RFVXVQQ1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPGJvZHk+UHJvdmlkZXMgY2hlY2sgcG9pbnRzIHJlbGF0ZWQgdG8gYSBwYXJ0aWN1bGFyIGNvbnRlbnQgZWxlbWVudHMuICBUaGVzZSBhcmUgdHlwaWNhbGx5IHVzZWQgaW4gcmV2aWV3cyBhbmQgaW5zcGVjdGlvbnMgb24gd29yayBwcm9kdWN0cy4NCi0NCi08L2JvZHk+DQotICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgPG93bmVkRW5kIHhtaTppZD0iX3RFVXVQaVg1RWQyS25KMnlqTlhoV1EiIG5hbWU9Il9jb250ZW50RWxlbWVudCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdEI4SW5DWDVFZDJLbkoyeWpOWGhXUSIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iX3RFVXVQQ1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfdEVVdVB5WDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IioiLz4NCi0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3RFVXVRQ1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICA8L293bmVkRW5kPg0KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il90RVV1UVNYNUVkMktuSjJ5ak5YaFdRIiBtZW1iZXJFbmQ9Il90RVV1UXlYNUVkMktuSjJ5ak5YaFdRIF90RVV1SUNYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3RFVXVRaVg1RWQyS25KMnlqTlhoV1EiIGFubm90YXRlZEVsZW1lbnQ9Il90RVV1UVNYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDxib2R5PlRoaXMgYXNzb2NpYXRpb24gcHJvdmlkZXMgYWNjZXNzIHRvIGRldGFpbGVkIEd1aWRlbGluZXMgcmVsYXRlZCB0byB0aGlzIENvbnRlbnQgRWxlbWVudC48L2JvZHk+DQotICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgPG93bmVkRW5kIHhtaTppZD0iX3RFVXVReVg1RWQyS25KMnlqTlhoV1EiIG5hbWU9Il9jb250ZW50RWxlbWVudCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdEI4SW5DWDVFZDJLbkoyeWpOWGhXUSIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iX3RFVXVRU1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfdEVVdVJDWDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IioiLz4NCi0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3RFVXVSU1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICA8L293bmVkRW5kPg0KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il90RVV1UmlYNUVkMktuSjJ5ak5YaFdRIiBtZW1iZXJFbmQ9Il90RVV1U0NYNUVkMktuSjJ5ak5YaFdRIF90RUs5U1NYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3RFVXVSeVg1RWQyS25KMnlqTlhoV1EiIGFubm90YXRlZEVsZW1lbnQ9Il90RVV1UmlYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDxib2R5PkEgUmVwb3J0IGV4dHJhY3RzIGluZm9ybWF0aW9uIGFib3V0IG9uZSBvciBtb3JlIFdvcmsgUHJvZHVjdDsgbm9ybWFsbHkgZGlyZWN0bHkgZnJvbSBhIHRvb2wgdGhhdCBtYWludGFpbnMgdGhlIFdvcmsgUHJvZHVjdHMuIEZvciBleGFtcGxlLCBhIFJlcG9ydCBjYW4gcHJlc2VudCBkZXRhaWxzIG9mIGFuIEFydGlmYWN0IG9yIGEgc2V0IG9mIEFydGlmYWN0cyBmb3IgdXNlIGluIGEgdGVjaG5pY2FsIHJldmlldy4gPC9ib2R5Pg0KLSAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il90RVV1U0NYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJfd29ya1Byb2R1Y3QiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3RESWJjQ1g1RWQyS25KMnlqTlhoV1EiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il90RVV1UmlYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3RFVXVTU1g1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIqIi8+DQotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il90RVV1U2lYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgPC9vd25lZEVuZD4NCi0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfdEVVdVN5WDVFZDJLbkoyeWpOWGhXUSIgbWVtYmVyRW5kPSJfdEVVdVRTWDVFZDJLbkoyeWpOWGhXUSBfdEVVdUl5WDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il90RVV1VENYNUVkMktuSjJ5ak5YaFdRIiBhbm5vdGF0ZWRFbGVtZW50PSJfdEVVdVN5WDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8Ym9keT5Qcm92aWRlcyBhIHNhbXBsZSBvZiB3aGF0IHRoZSB3b3JrIHByb2R1Y3QgbWF5IGxvb2sgbGlrZSwgYW4gYWN0dWFsIGluc3RhbmNlLjwvYm9keT4NCi0gICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfdEVVdVRTWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iX2NvbnRlbnRFbGVtZW50IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il90QjhJbkNYNUVkMktuSjJ5ak5YaFdRIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfdEVVdVN5WDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il90RVV1VGlYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfdEVVdVR5WDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgIDwvb3duZWRFbmQ+DQotICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3RFVXVVQ1g1RWQyS25KMnlqTlhoV1EiIG1lbWJlckVuZD0iX3RFVXVVaVg1RWQyS25KMnlqTlhoV1EgX3RFSzlUQ1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfdEVVdVVTWDVFZDJLbkoyeWpOWGhXUSIgYW5ub3RhdGVkRWxlbWVudD0iX3RFVXVVQ1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPGJvZHk+UHJvdmlkZXMgZGV0YWlsZWQgZ3VpZGFuY2Ugb24gaG93IHRvIHByb2R1Y2UgdGhlIHdvcmsgcHJvZHVjdCBpbmRlcGVuZGVudCBvZiBhIHNwZWNpZmljIHNldCBvZiB0YXNrcyBvciBXQlMuICBNYXkgY29udGFpbiBzcGVjaWZpYyBhbGdvcml0aG1zIG9yIGFsdGVybmF0aXZlIGRldmVsb3BtZW50IGFwcHJvYWNoZXMuPC9ib2R5Pg0KLSAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il90RVV1VWlYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJfd29ya1Byb2R1Y3QiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3RESWJjQ1g1RWQyS25KMnlqTlhoV1EiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il90RVV1VUNYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3RFVXVVeVg1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIqIi8+DQotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il90RVV1VkNYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgPC9vd25lZEVuZD4NCi0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfdEVVdVZTWDVFZDJLbkoyeWpOWGhXUSIgbWVtYmVyRW5kPSJfdEVVdVZ5WDVFZDJLbkoyeWpOWGhXUSBfdEVLOVZpWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il90RVV1VmlYNUVkMktuSjJ5ak5YaFdRIiBhbm5vdGF0ZWRFbGVtZW50PSJfdEVVdVZTWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8Ym9keT5MaW5rcyBUYXNrcyB3aXRoIFRvb2wgTWVudG9ycyB3aGljaCBhcmUgYSBzcGVjaWZpYyB0eXBlIG9mIGd1aWRhbmNlIHRoYXQgc2hvdyBob3cgdG8gdXNlIGEgc3BlY2lmaWMgdG9vbCB0byBwZXJmb3JtIHRoZSBUYXNrLjwvYm9keT4NCi0gICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfdEVVdVZ5WDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iX3Rhc2siIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3RESWJXaVg1RWQyS25KMnlqTlhoV1EiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il90RVV1VlNYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3RFVXVXQ1g1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIqIi8+DQotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il90RVV1V1NYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgPC9vd25lZEVuZD4NCi0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfdEVVdVdpWDVFZDJLbkoyeWpOWGhXUSIgbWVtYmVyRW5kPSJfdEVLOVFpWDVFZDJLbkoyeWpOWGhXUSBfdEVVdVhDWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il90RVV1V3lYNUVkMktuSjJ5ak5YaFdRIiBhbm5vdGF0ZWRFbGVtZW50PSJfdEVVdVdpWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8Ym9keT5BIFByYWN0aWNlIGNhbiBiZSBjb21wb3NlZCBvZiBvdGhlciBQcmFjdGljZXMuPC9ib2R5Pg0KLSAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il90RVV1WENYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJfcHJhY3RpY2UiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3RFSzlQeVg1RWQyS25KMnlqTlhoV1EiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il90RVV1V2lYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3RFVXVYU1g1RWQyS25KMnlqTlhoV1EiIG1lbWJlckVuZD0iX3RFSzlSU1g1RWQyS25KMnlqTlhoV1EgX3RFVXVYeVg1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfdEVVdVhpWDVFZDJLbkoyeWpOWGhXUSIgYW5ub3RhdGVkRWxlbWVudD0iX3RFVXVYU1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPGJvZHk+QSBQcmFjdGljZSBjYW4gcmVmZXJlbmNlIGFueSBDb250ZW50IEVsZW1lbnQuICBUaGUgYXNzb2NpYXRpb24gZXhwcmVzc2VzIHRoYXQgdGhpcyBDb250ZW50IEVsZW1lbnQgaXMgcGFydCBvZiBvciBiZWxvbmdzIHRvIHRoaXMgUHJhY3RpY2UuPC9ib2R5Pg0KLSAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il90RVV1WHlYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJfcHJhY3RpY2UiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3RFSzlQeVg1RWQyS25KMnlqTlhoV1EiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il90RVV1WFNYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3RFVXVZQ1g1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIqIi8+DQotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il90RVV1WVNYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgPC9vd25lZEVuZD4NCi0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfdEVVdVlpWDVFZDJLbkoyeWpOWGhXUSIgbWVtYmVyRW5kPSJfdEVVdUppWDVFZDJLbkoyeWpOWGhXUSBfdEVVdVpDWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il90RVV1WXlYNUVkMktuSjJ5ak5YaFdRIiBhbm5vdGF0ZWRFbGVtZW50PSJfdEVVdVlpWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8Ym9keT5BIHdvcmsgcHJvZHVjdCBpcyByZWxhdGVkIHRvIG9uZSBvciBtb3JlIGFzc2V0cyB0byA8L2JvZHk+DQotICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgPG93bmVkRW5kIHhtaTppZD0iX3RFVXVaQ1g1RWQyS25KMnlqTlhoV1EiIG5hbWU9Il9jb250ZW50RWxlbWVudCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdEI4SW5DWDVFZDJLbkoyeWpOWGhXUSIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iX3RFVXVZaVg1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfdEVVdVpTWDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IioiLz4NCi0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3RFVXVaaVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICA8L293bmVkRW5kPg0KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il90RVV1WnlYNUVkMktuSjJ5ak5YaFdRIiBtZW1iZXJFbmQ9Il90RUs5VHlYNUVkMktuSjJ5ak5YaFdRIF90RVV1YUNYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfdEVVdWFDWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iX3dvcmtQcm9kdWN0IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il90REliY0NYNUVkMktuSjJ5ak5YaFdRIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfdEVVdVp5WDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il90RVV1YVNYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfdEVVdWFpWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgIDwvb3duZWRFbmQ+DQotICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3RFVXVheVg1RWQyS25KMnlqTlhoV1EiIG1lbWJlckVuZD0iX3RFVXViQ1g1RWQyS25KMnlqTlhoV1EgX3RFSzlXU1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il90RVV1YkNYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJfdGFzayIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdERJYldpWDVFZDJLbkoyeWpOWGhXUSIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iX3RFVXVheVg1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfdEVVdWJTWDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IioiLz4NCi0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3RFVXViaVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICA8L293bmVkRW5kPg0KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il90RVV1YnlYNUVkMktuSjJ5ak5YaFdRIiBtZW1iZXJFbmQ9Il90RVV1Y0NYNUVkMktuSjJ5ak5YaFdRIF90RUs5VWlYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfdEVVdWNDWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iX3dvcmtQcm9kdWN0IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il90REliY0NYNUVkMktuSjJ5ak5YaFdRIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfdEVVdWJ5WDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il90RVV1Y1NYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfdEVVdWNpWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgIDwvb3duZWRFbmQ+DQotICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3RFVXVjeVg1RWQyS25KMnlqTlhoV1EiIG1lbWJlckVuZD0iX3RFVXVLU1g1RWQyS25KMnlqTlhoV1EgX3RFVXVkQ1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il90RVV1ZENYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSIiIHZpc2liaWxpdHk9InByaXZhdGUiIHR5cGU9Il90QjhJbkNYNUVkMktuSjJ5ak5YaFdRIiBhc3NvY2lhdGlvbj0iX3RFVXVjeVg1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfdEVVdWRTWDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IioiLz4NCi0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3RFVXVkaVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICA8L293bmVkRW5kPg0KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il90Rk5lOENYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJBcnRpZmFjdERlc2NyaXB0aW9uIj4NCi0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfdEZOZThTWDVFZDJLbkoyeWpOWGhXUSIgZ2VuZXJhbD0iX3RGTmZMU1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfdEZOZThpWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iYnJpZWZPdXRsaW5lIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il90QmZjdENYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfdEZOZTh5WDVFZDJLbkoyeWpOWGhXUSIgYW5ub3RhdGVkRWxlbWVudD0iX3RGTmU4aVg1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgICA8Ym9keT5Qcm92aWRlcyBhIGJyaWVmIGRlc2NyaXB0aW9uIG9mIHRoZSBpbmZvcm1hdGlvbiB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGlzIGFydGlmYWN0LiBGb3IgZXhhbXBsZSwgZGlzY3Vzc2VzIHRoZSBjb250ZW50cyBmb3Iga2V5IGNoYXB0ZXJzIG9mIGEgZG9jdW1lbnQgYXJ0aWZhY3Qgb3IgdGhlIGtleSBwYWNrYWdlcyBhbmQgbW9kdWxlcyBvZiBhIG1vZGVsIGFydGlmYWN0LjwvYm9keT4NCi0gICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfdEZOZTlDWDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IjEiLz4NCi0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3RGTmU5U1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il90Rk5lOWlYNUVkMktuSjJ5ak5YaFdRIiB0eXBlPSJfdEJmY3RDWDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IiIvPg0KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3RGTmU5eVg1RWQyS25KMnlqTlhoV1EiIG5hbWU9InJlcHJlc2VudGF0aW9uT3B0aW9ucyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdEJmY3RDWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3RGTmUtQ1g1RWQyS25KMnlqTlhoV1EiIGFubm90YXRlZEVsZW1lbnQ9Il90Rk5lOXlYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgICAgPGJvZHk+RGlzY3Vzc2VzIGRpZmZlcmVudCBwb3NzaWJsZSBhbHRlcm5hdGl2ZSByZXByZXNlbnRhdGlvbnMgZm9yIHRoZSBhcnRpZmFjdC4gRm9yIGV4YW1wbGUgYSBkZXNpZ24gbW9kZWwgY2FuIGJlIHJlcHJlc2VudGVkIGFzIGEgVU1MIG1vZGVsIG9yIGFuIGluZm9ybWFsIGJsb2NrIGRpYWdyYW0gb3IgYnkgdGV4dHVhbCBkZXNjcmlwdGlvbiBvbmx5LjwvYm9keT4NCi0gICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfdEZOZS1TWDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IjEiLz4NCi0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3RGTmUtaVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il90Rk5lLXlYNUVkMktuSjJ5ak5YaFdRIiB0eXBlPSJfdEJmY3RDWDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IiIvPg0KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3RGTmVfQ1g1RWQyS25KMnlqTlhoV1EiIG5hbWU9InJlcHJlc2VudGF0aW9uIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il90QmZjdENYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3RGTmVfU1g1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIxIi8+DQotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il90Rk5lX2lYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfdEZOZV95WDVFZDJLbkoyeWpOWGhXUSIgdHlwZT0iX3RCZmN0Q1g1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIiLz4NCi0gICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il90Rk5mQUNYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJub3RhdGlvbiIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdEJmY3RDWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il90Rk5mQVNYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iMSIvPg0KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfdEZOZkFpWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iX3RGTmZBeVg1RWQyS25KMnlqTlhoV1EiIHR5cGU9Il90QmZjdENYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iIi8+DQotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfdEZOZkJDWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iRGVsaXZlcmFibGVEZXNjcmlwdGlvbiI+DQotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3RGTmZCU1g1RWQyS25KMnlqTlhoV1EiIGdlbmVyYWw9Il90Rk5mTFNYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3RGTmZCaVg1RWQyS25KMnlqTlhoV1EiIG5hbWU9ImV4dGVybmFsRGVzY3JpcHRpb24iIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3RCZmN0Q1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il90Rk5mQnlYNUVkMktuSjJ5ak5YaFdRIiBhbm5vdGF0ZWRFbGVtZW50PSJfdEZOZkJpWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICAgIDxib2R5PlRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgRGVsaXZlcmFibGUgdXNlZCBmb3IgY2xpZW50IGRvY3VtZW50cyAocHJvcG9zYWwsIHN0YXRlbWVudHMgb2Ygd29yayBvciBjb250cmFjdHVhbCBhZ3JlZW1lbnRzKS4gIEl0IG1pZ2h0IHVzZSBhIGRpZmZlcmVudCBsYW5ndWFnZSBhbmQgZm9sbG93IGxlZ2FsIGNvbnN0cmFpbnRzLjwvYm9keT4NCi0gICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfdEZOZkNDWDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IjEiLz4NCi0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3RGTmZDU1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il90Rk5mQ2lYNUVkMktuSjJ5ak5YaFdRIiB0eXBlPSJfdEJmY3RDWDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IiIvPg0KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3RGTmZDeVg1RWQyS25KMnlqTlhoV1EiIG5hbWU9InBhY2thZ2luZ0d1aWRhbmNlIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il90QmZjdENYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfdEZOZkRDWDVFZDJLbkoyeWpOWGhXUSIgYW5ub3RhdGVkRWxlbWVudD0iX3RGTmZDeVg1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgICA8Ym9keT5Qcm92aWRlcyBndWlkYW5jZSBvbiBob3cgdG8gYXNzZW1ibGUgdGhlIGRlbGl2ZXJhYmxlIGZyb20gYWxsIGl0cyByZXF1aXJlZCBpbnB1dHMuICBUaGlzIHNlY3Rpb24gZGVzY3JpYmVzIHRoZSBtb3N0IGNvbW1vbiBjb250ZW50IG1lZGl1bSBhbmQgZm9ybWF0LiAgRGlzdHJpYnV0aW9uIG9mIHRoZSBkZWxpdmVyYWJsZSBpcyBhZGRyZXNzZWQgaW4gdGhpcyBzZWN0aW9uLCBpZiBuZWNlc3NhcnkuPC9ib2R5Pg0KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il90Rk5mRFNYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iMSIvPg0KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfdEZOZkRpWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iX3RGTmZEeVg1RWQyS25KMnlqTlhoV1EiIHR5cGU9Il90QmZjdENYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iIi8+DQotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfdEZOZkVDWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iUm9sZURlc2NyaXB0aW9uIj4NCi0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfdEZOZkVTWDVFZDJLbkoyeWpOWGhXUSIgZ2VuZXJhbD0iX3RCOElueVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfdEZOZkVpWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0ic2tpbGxzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il90QmZjdENYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfdEZOZkV5WDVFZDJLbkoyeWpOWGhXUSIgYW5ub3RhdGVkRWxlbWVudD0iX3RGTmZFaVg1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgICA8Ym9keT5MaXN0cyBvZiBzZXQgb2YgcmVxdWlyZWQgc2tpbGxzIGEgcGVyc29uIG5lZWRzIHRvIHBvc3Nlc3MgdG8gZnVsZmlsbCB0aGF0IFJvbGUuPC9ib2R5Pg0KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il90Rk5mRkNYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iMSIvPg0KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfdEZOZkZTWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iX3RGTmZGaVg1RWQyS25KMnlqTlhoV1EiIHR5cGU9Il90QmZjdENYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iIi8+DQotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfdEZOZkZ5WDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iYXNzaWdubWVudEFwcHJvYWNoZXMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3RCZmN0Q1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il90Rk5mR0NYNUVkMktuSjJ5ak5YaFdRIiBhbm5vdGF0ZWRFbGVtZW50PSJfdEZOZkZ5WDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICAgIDxib2R5PlByb3ZpZGVzIGd1aWRhbmNlIG9uIGZvciBhc3NpZ25pbmcgaW5kaXZpZHVhbHMgdG8gdGhlIFJvbGUgaW4gdGVybXMgb2Ygd2hhdCBvdGhlciByb2xlcyB0aGVzZSBpbmRpdmlkdWFscyBjb3VsZCBwZXJmb3JtIGFuZCB3aGF0IHJlc3BvbnNpYmlsaXR5IGRpZmZlcmVudCBpbmRpdmlkdWFscyBhc3NpZ25lZCB0byB0aGlzIHJvbGUgbWlnaHQgaGF2ZS4gIFRoZSBndWlkYW5jZSBjYW4gYWxzbyBkZXNjcmliZSBkaWZmZXJlbnQgYXNzaWdubWVudCBhcHByb2FjaGVzIGZvciBkaWZmZXJlbnQgdHlwZXMgb2YgcHJvamVjdHMsIGUuZy4gZm9yIGxhcmdlIHZlcnN1cyBzbWFsbCB0ZWFtcyB3aGVyZSBpbmRpdmlkdWFscyBjb3VsZCBiZSBhbGxvY2F0ZWQgdG8gcm9sZXMgZnVsbCB0aW1lIHZlcnN1cyBzaGFyaW5nIHJvbGVzIHdpdGhpbiB0aGUgdGVhbS48L2JvZHk+DQotICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3RGTmZHU1g1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIxIi8+DQotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il90Rk5mR2lYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfdEZOZkd5WDVFZDJLbkoyeWpOWGhXUSIgdHlwZT0iX3RCZmN0Q1g1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIiLz4NCi0gICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il90Rk5mSENYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJzeW5vbnltcyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdEJmY3RDWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3RGTmZIU1g1RWQyS25KMnlqTlhoV1EiIGFubm90YXRlZEVsZW1lbnQ9Il90Rk5mSENYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgICAgPGJvZHk+TGlzdHMgc3lub255bXMsIGkuZS4gb3RoZXIgbmFtZXMgdGhlIFJvbGUgbWlnaHQgYmUgcmVmZXJyZWQgYnkuICBUb29sIHN1cHBvcnQgZm9yIHRoZSBtZXRhLW1vZGVsIG1pZ2h0IHN1cHBvcnQgdGhhdCBhIFJvbGUgbmFtZSBjYW4gYmUgY29uc2lzdGVudGx5IGJlIHJlcGxhY2VkIHdpdGggb25lIG9mIGl0cyBzeW5vbnltcyB0aHJvdWdodCBhIFByb2Nlc3MuPC9ib2R5Pg0KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il90Rk5mSGlYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iMSIvPg0KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfdEZOZkh5WDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iX3RGTmZJQ1g1RWQyS25KMnlqTlhoV1EiIHR5cGU9Il90QmZjdENYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iIi8+DQotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfdEZOZklTWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iVGFza0Rlc2NyaXB0aW9uIj4NCi0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfdEZOZklpWDVFZDJLbkoyeWpOWGhXUSIgZ2VuZXJhbD0iX3RCOElueVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfdEZOZkl5WDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0icHVycG9zZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdEJmY3RDWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3RGTmZKQ1g1RWQyS25KMnlqTlhoV1EiIGFubm90YXRlZEVsZW1lbnQ9Il90Rk5mSXlYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgICAgPGJvZHk+U3VtbWFyaXplcyB0aGUgbWFpbiByZWFzb24gZm9yIHBlcmZvcm1pbmcgdGhpcyBUYXNrIGFuZCB3aGF0IGlzIGludGVuZGVkIHRvIGJlIGFjaGlldmVkLjwvYm9keT4NCi0gICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfdEZOZkpTWDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IjEiLz4NCi0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3RGTmZKaVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il90Rk5mSnlYNUVkMktuSjJ5ak5YaFdRIiB0eXBlPSJfdEJmY3RDWDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IiIvPg0KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3RGTmZLQ1g1RWQyS25KMnlqTlhoV1EiIG5hbWU9ImFsdGVybmF0aXZlcyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdEJmY3RDWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3RGTmZLU1g1RWQyS25KMnlqTlhoV1EiIGFubm90YXRlZEVsZW1lbnQ9Il90Rk5mS0NYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgICAgPGJvZHk+Q29tcHJpc2VzIG9mIHN1bW1hcmllcyBkZXNjcmliaW5nIGltcG9ydGFudCBleGNlcHRpb25hbCBhbmQgbm9uLXN0YW5kYXJkIHdheXMgb2YgYWNoaWV2aW5nIHRoaXMgVGFzaydzIGRldmVsb3BtZW50IGdvYWxzIHRoYXQgd2VyZSBub3QgY292ZXJlZCBieSB0aGUgVGFzaydzIFN0ZXBzLjwvYm9keT4NCi0gICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfdEZOZktpWDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IjEiLz4NCi0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3RGTmZLeVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il90Rk5mTENYNUVkMktuSjJ5ak5YaFdRIiB0eXBlPSJfdEJmY3RDWDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IiIvPg0KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3RGTmZMU1g1RWQyS25KMnlqTlhoV1EiIG5hbWU9IldvcmtQcm9kdWN0RGVzY3JpcHRpb24iPg0KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il90Rk5mTGlYNUVkMktuSjJ5ak5YaFdRIiBnZW5lcmFsPSJfdEI4SW55WDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il90Rk5mTHlYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJwdXJwb3NlIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il90QmZjdENYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfdEZOZk1DWDVFZDJLbkoyeWpOWGhXUSIgYW5ub3RhdGVkRWxlbWVudD0iX3RGTmZMeVg1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgICA8Ym9keT5EZXNjcmliZXMgd2h5IHRoZSB3b3JrIHByb2R1Y3QgaXMgcHJvZHVjZWQgYW5kIHRvIHdoYXQgdXNlIGl0IHdpbGwgYmUgcHV0LjwvYm9keT4NCi0gICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfdEZOZk1TWDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IjEiLz4NCi0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3RGTmZNaVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il90Rk5mTXlYNUVkMktuSjJ5ak5YaFdRIiB0eXBlPSJfdEJmY3RDWDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IiIvPg0KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3RGTmZOQ1g1RWQyS25KMnlqTlhoV1EiIG5hbWU9ImltcGFjdE9mTm90SGF2aW5nIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il90QmZjdENYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfdEZOZk5TWDVFZDJLbkoyeWpOWGhXUSIgYW5ub3RhdGVkRWxlbWVudD0iX3RGTmZOQ1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgICA8Ym9keT5EZXNjcmliZXMgdGhlIGNvbnNlcXVlbmNlcyBvZiBub3QgcHJvZHVjaW5nIHRoZSB3b3JrIHByb2R1Y3QuICBUaGlzIGlzIGludGVuZGVkIHRvIGFpZCBpbiB0aGUgdGFpbG9yaW5nIHRoZSBtZXRob2QvcHJvY2VzcyB0byB0aGUgbmVlZHMgb2YgYSBzcGVjaWZpYyBwcm9qZWN0LjwvYm9keT4NCi0gICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfdEZOZk5pWDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IjEiLz4NCi0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3RGTmZOeVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il90Rk5mT0NYNUVkMktuSjJ5ak5YaFdRIiB0eXBlPSJfdEJmY3RDWDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IiIvPg0KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3RGTmZPU1g1RWQyS25KMnlqTlhoV1EiIG5hbWU9InJlYXNvbnNGb3JOb3ROZWVkaW5nIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il90QmZjdENYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfdEZOZk9pWDVFZDJLbkoyeWpOWGhXUSIgYW5ub3RhdGVkRWxlbWVudD0iX3RGTmZPU1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgICA8Ym9keT5EZXNjcmliZXMgdGhlIGNpcmN1bXN0YW5jZXMgaW4gd2hpY2ggaXQgaXMgcmVhc29uYWJsZSBub3QgdG8gcHJvZHVjZSB0aGUgd29yayBwcm9kdWN0LiAgVGhpcyBpcyBpbnRlbmRlZCB0byBhaWQgaW4gdGhlIHRhaWxvcmluZyBvZiB0aGUgbWV0aG9kL3Byb2Nlc3MgdG8gdGhlIG5lZWRzIG9mIGEgc3BlY2lmaWMgcHJvamVjdC48L2JvZHk+DQotICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3RGTmZPeVg1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIxIi8+DQotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il90Rk5mUENYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfdEZOZlBTWDVFZDJLbkoyeWpOWGhXUSIgdHlwZT0iX3RCZmN0Q1g1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIiLz4NCi0gICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il90Rk5mUGlYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJHdWlkYW5jZURlc2NyaXB0aW9uIj4NCi0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfdEZOZlB5WDVFZDJLbkoyeWpOWGhXUSIgZ2VuZXJhbD0iX3RCOElueVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfdEZOZlFDWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iYXR0YWNobWVudHMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3RCZmN0Q1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il90Rk5mUVNYNUVkMktuSjJ5ak5YaFdRIiBhbm5vdGF0ZWRFbGVtZW50PSJfdEZOZlFDWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICAgIDxib2R5PlRoaXMgZmllbGQgaXMgcHJpbWFyaWx5IHVzZWQgZm9yIGF0dGFjaG1lbnRzIGF1Z21lbnRpbmcgdGhlIGluZm9ybWF0aW9uIHByb3ZpZGVkIGZvciBndWlkYW5jZS4gIEluIHBhcnRpY3VsYXIgdGhlIGF0dHJpYnV0ZSBpcyB1c2VkIGZvciBUZW1wbGF0ZXMsIEV4YW1wbGVzLCBhbmQgUmV1c2FibGUgQXNzZXRzIHRvIGNvbnRhaW4gdGhlIGFjdHVhbCBhdHRhY2htZW50IGRlc2NyaWJlZCBpbiB0aGUgbWFpbkRlc2NyaXB0aW9uLiAgSXQgY2FuIGFkZGl0aW9uYWxseSBjb250YWluIHJlcHJlc2VudGF0aW9ucyBvZiB0aGUgZ3VpZGFuY2UgaW4ganVzdCBhIHRoaXJkIHBhcnR5IGZvcm1hdCwgZS5nLiBQREYsIE1TIFdvcmQsIG9yIFdvcmQgUGVyZmVjdC48L2JvZHk+DQotICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3RGTmZRaVg1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIxIi8+DQotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il90Rk5mUXlYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfdEZOZlJDWDVFZDJLbkoyeWpOWGhXUSIgdHlwZT0iX3RCZmN0Q1g1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIiLz4NCi0gICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il90Rk5mUlNYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJQcmFjdGljZURlc2NyaXB0aW9uIj4NCi0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfdEZOZlJpWDVFZDJLbkoyeWpOWGhXUSIgZ2VuZXJhbD0iX3RCOElueVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfdEZOZlJ5WDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iYWRkaXRpb25hbEluZm8iIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3RCZmN0Q1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il90Rk5mU0NYNUVkMktuSjJ5ak5YaFdRIiBhbm5vdGF0ZWRFbGVtZW50PSJfdEZOZlJ5WDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICAgIDxib2R5PkFueSBhZGRpdGlvbmFsIEluZm9ybWF0aW9uIG5vdCBjb3ZlcmVkIGJ5IHRoZSBvdGhlciBhdHRyaWJ1dGVzLjwvYm9keT4NCi0gICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfdEZOZlNTWDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IjEiLz4NCi0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3RGTmZTaVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il90Rk5mU3lYNUVkMktuSjJ5ak5YaFdRIiB0eXBlPSJfdEJmY3RDWDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IiIvPg0KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3RGTmZUQ1g1RWQyS25KMnlqTlhoV1EiIG5hbWU9InByb2JsZW0iIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3RCZmN0Q1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il90Rk5mVFNYNUVkMktuSjJ5ak5YaFdRIiBhbm5vdGF0ZWRFbGVtZW50PSJfdEZOZlRDWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICAgIDxib2R5PkEgZGVzY3JpcHRpb24gb2YgdGhlIHByb2JsZW0gdGhlIFByYWN0aWNlIGFkZHJlc3Nlcy48L2JvZHk+DQotICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3RGTmZUaVg1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIxIi8+DQotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il90Rk5mVHlYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfdEZOZlVDWDVFZDJLbkoyeWpOWGhXUSIgdHlwZT0iX3RCZmN0Q1g1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIiLz4NCi0gICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il90Rk5mVVNYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJiYWNrZ3JvdW5kIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il90QmZjdENYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfdEZOZlVpWDVFZDJLbkoyeWpOWGhXUSIgYW5ub3RhdGVkRWxlbWVudD0iX3RGTmZVU1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgICA8Ym9keT5FbGFib3JhdGlvbiBvbiB0aGUgYmFja2dyb3VuZCBhbmQgdGhlIGNvbnRleHQgaW4gd2hpY2ggdGhlIHByb2JsZW0gb2NjdXJzIGFuZCB3aGVyZSB0aGUgc29sdXRpb24gZGVzY3JpYmVkIGJ5IHRoaXMgUHJhY3RpY2Ugd2lsbCBmaXQgaW4uPC9ib2R5Pg0KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il90Rk5mVXlYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iMSIvPg0KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfdEZOZlZDWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iX3RGTmZWU1g1RWQyS25KMnlqTlhoV1EiIHR5cGU9Il90QmZjdENYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iIi8+DQotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfdEZOZlZpWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iZ29hbHMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3RCZmN0Q1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il90Rk5mVnlYNUVkMktuSjJ5ak5YaFdRIiBhbm5vdGF0ZWRFbGVtZW50PSJfdEZOZlZpWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICAgIDxib2R5PkEgc3VtbWFyeSBvZiB0aGUgb3ZlcmFsbCBnb2FscyB0byBiZSBhZGRyZXNzZWQgYnkgdGhlIFByYWN0aWNlLjwvYm9keT4NCi0gICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfdEZOZldDWDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IjEiLz4NCi0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3RGTmZXU1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il90Rk5mV2lYNUVkMktuSjJ5ak5YaFdRIiB0eXBlPSJfdEJmY3RDWDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IiIvPg0KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3RGTmZXeVg1RWQyS25KMnlqTlhoV1EiIG5hbWU9ImFwcGxpY2F0aW9uIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il90QmZjdENYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfdEZOZlhDWDVFZDJLbkoyeWpOWGhXUSIgYW5ub3RhdGVkRWxlbWVudD0iX3RGTmZXeVg1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgICA8Ym9keT5EZXNjcmliZXMgaG93IHRoZSBQcmFjdGljZSBpcyBiZWluZyBhcHBsaWVkIG9yIGludHJvZHVjZWQgaW50byB0aGUgY29udGV4dCBkZXNjcmliZWQgaW4gYmFja2dyb3VuZC48L2JvZHk+DQotICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3RGTmZYU1g1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIxIi8+DQotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il90Rk5mWGlYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfdEZOZlh5WDVFZDJLbkoyeWpOWGhXUSIgdHlwZT0iX3RCZmN0Q1g1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIiLz4NCi0gICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il90Rk5mWUNYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJsZXZlbHNPZkFkb3B0aW9uIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il90QmZjdENYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfdEZOZllTWDVFZDJLbkoyeWpOWGhXUSIgYW5ub3RhdGVkRWxlbWVudD0iX3RGTmZZQ1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgICA8Ym9keT5PdXRsaW5lcyB0aGUgZGlmZmVyZW50IGZvcm1zIG9yIHZhcmlhbnRzIGluIHdoaWNoIHRoZSBwcmFjdGljZSBjb3VsZCBiZSByZWFsaXplZC4gKGUuZy4gZnVsbCBhZG9wdGlvbiB2ZXJ1cyBhIHBhcnRpYWwgYWRvcHRpb24gb2YgdGhlIFByYWN0aWNlKTwvYm9keT4NCi0gICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfdEZOZllpWDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IjEiLz4NCi0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3RGTmZZeVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il90Rk5mWkNYNUVkMktuSjJ5ak5YaFdRIiB0eXBlPSJfdEJmY3RDWDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IiIvPg0KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3RDRlNpQ1g1RWQyS25KMnlqTlhoV1EiIG5hbWU9IkRlc2NyaWJhYmxlRWxlbWVudCIgaXNBYnN0cmFjdD0idHJ1ZSI+DQotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il90Q0ZTaVNYNUVkMktuSjJ5ak5YaFdRIiBhbm5vdGF0ZWRFbGVtZW50PSJfdENGU2lDWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8Ym9keT5EZXNjcmliYWJsZSBFbGVtZW50IGlzIGFuIGFic3RyYWN0IGdlbmVyYWxpemF0aW9uIG9mIE1ldGhvZCBFbGVtZW50cyBmb3Igd2hpY2ggZXh0ZXJuYWwgcHJlc2VudGF0aW9uIG5hbWVzIGFzIHdlbGwgYXMgY29udGVudCBkZXNjcmlwdGlvbnMgaGF2ZSBiZWVuIGRlZmluZWQsIHN1Y2ggYXMgUm9sZXMgb3IgV29yayBQcm9kdWN0cy4gIFByZXNlbnRhdGlvbiBOYW1lIGFuZCBDb250ZW50IERlc2NyaXB0aW9ucyBhcmUgdHlwaWNhbGx5IGxvY2FsaXplZCB1c2luZyBhIHJlc291cmNlIGFsbG9jYXRpb24gbWVjaGFuaXNtIGZvciBpdHMgU3RyaW5nIHR5cGUgYXR0cmlidXRlcy4NCi1UaGlzIGFic3RyYWN0aW9uIHJlcHJlc2VudHMgYWxsIGVsZW1lbnRzIGluIHRoZSBNZXRob2QgQ29udGVudCBhcyB3ZWxsIGFzIFByb2Nlc3Mgc3BhY2UgZm9yIHdoaWNoIGNvbmNyZXRlIHRleHR1YWwgZGVzY3JpcHRpb25zIGFyZSBkZWZpbmVkIGluIHRoZSBmb3JtIG9mIGRvY3VtZW50aW5nIGF0dHJpYnV0ZXMgZ3JvdXBlZCBpbiBhIG1hdGNoaW5nIENvbnRlbnQgRGVzY3JpcHRpb24gaW5zdGFuY2UgKHNlZSBTZWN0aW9uIDQuMS40KS4gIERlc2NyaWJhYmxlIEVsZW1lbnRzIGFyZSBpbnRlbmRlZCB0byBiZSBwdWJsaXNoZWQgaW4gbWV0aG9kIG9yIHByb2Nlc3MgcHVibGljYXRpb25zIChzaW1pbGFyIHRvIHRoZSBJQk0gUmF0aW9uYWwgVW5pZmllZCBQcm9jZXNzIHdlYikuICBEZXNjcmliYWJsZSBFbGVtZW50IGRlZmluZXMgdGhhdCB0aGUgZWxlbWVudCBpdCByZXByZXNlbnRzIHdpbGwgaGF2ZSBjb250ZW50ICdhdHRhY2hlZCcgdG8gaXQuICBDb250ZW50IERlc2NyaXB0aW9uIGlzIHRoZSBhYnN0cmFjdGlvbiBmb3IgdGhlIGFjdHVhbCBwbGFjZXMgaW4gd2hpY2ggdGhlIGNvbnRlbnQgaXMgYmVpbmcgcmVwcmVzZW50ZWQuICBUaGlzIHNlcGFyYXRpb24gYWxsb3dzIGEgZGlzdGluY3Rpb24gYmV0d2VlbiBjb3JlIG1ldGhvZCBtb2RlbCBlbGVtZW50cyBkZXNjcmliaW5nIHRoZSBzdHJ1Y3R1cmUgb2YgdGhlIG1vZGVsIGZyb20gdGhlIGFjdHVhbCBkZXNjcmlwdGlvbiBjb250YWluZXIgcHJvdmlkaW5nLCBmb3IgZXhhbXBsZSwgdGhlIGRvY3VtZW50YXRpb24gb2YgdGhlIGNvbnRlbnQgZWxlbWVudCBpbiBkaWZmZXJlbnQgYWx0ZXJuYXRpdmVzIGxhbmd1YWdlcywgYXVkaWVuY2VzLCBsaWNlbnNpbmcgbGV2ZWxzLCBldGMuDQotPC9ib2R5Pg0KLSAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfdEZOZlpTWDVFZDJLbkoyeWpOWGhXUSIgYW5ub3RhdGVkRWxlbWVudD0iX3RDRlNpQ1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPGJvZHk+VGhpcyBkZWZpbml0aW9uIG9mIENvbnRlbnQgRWxlbWVudCBleHRlbmRzIHRoZSBDb250ZW50IEVsZW1lbnQgZGVmaW5pdGlvbiB2aWEgcGFja2FnZSBtZXJnZSB3aXRoIHJlZmVyZW5jZXMgdG8gaWNvbnMgdGhhdCBhcmUgdXNlZCBmb3IgcHJlc2VudGluZyBDb250ZW50IEVsZW1lbnRzIGluIGEgVU1BLWJhc2VkIG1vZGVsaW5nIGVudmlyb25tZW50IGFzIHdlbGwgYXMgd2hlbiBwdWJsaXNoaW5nIENvbnRlbnQgRWxlbWVudHMgaW50byBkb2N1bWVudGF0aW9uIHByZXNlbnRhdGlvbiAoZS5nLiBkb2N1bWVudCBvciBodG1sIHBhZ2VzKS48L2JvZHk+DQotICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3RDRlNpaVg1RWQyS25KMnlqTlhoV1EiIGdlbmVyYWw9Il90QlZzU2lYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3RDRlNpeVg1RWQyS25KMnlqTlhoV1EiIGdlbmVyYWw9Il90QjhJZ1NYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3RDRlNqQ1g1RWQyS25KMnlqTlhoV1EiIG5hbWU9InByZXNlbnRhdGlvbiIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdEI4SW55WDVFZDJLbkoyeWpOWGhXUSIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgYXNzb2NpYXRpb249Il90Q0ZTb2lYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3RDRlNqU1g1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIxIi8+DQotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il90Q0ZTamlYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfdEZOZlppWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0ic2hhcGVpY29uIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il90QmZjc2lYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfdEZOZlp5WDVFZDJLbkoyeWpOWGhXUSIgYW5ub3RhdGVkRWxlbWVudD0iX3RGTmZaaVg1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgICA8Ym9keT5BIHJlZmVyZW5jZSB0byBhbiBpY29uIHRoYXQgY2FuIGJlIHVzZWQgZm9yIG1vZGVsaW5nIHdpdGggc3BlY2lmaWMgQ29udGVudCBFbGVtZW50IGluc3RhbmNlcyAoYXMgZ3JhcGhpY2FsIHN0ZXJlb3R5cGVzLCBlLmcuIGEgdXNlIGNhc2Ugc3ltYm9sIGZvciBhIHVzZSBjYXNlIGFydGlmYWN0KSBhcyB3ZWxsIGFzIHB1YmxpY2F0aW9uIG9mIGNvbnRlbnQuPC9ib2R5Pg0KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il90Rk5mYUNYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iMSIvPg0KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfdEZOZmFTWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3RGTmZhaVg1RWQyS25KMnlqTlhoV1EiIG5hbWU9Im5vZGVpY29uIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il90QmZjc2lYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfdEZOZmF5WDVFZDJLbkoyeWpOWGhXUSIgYW5ub3RhdGVkRWxlbWVudD0iX3RGTmZhaVg1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgICA8Ym9keT5BIHJlZmVyZW5jZSB0byBhbiBpY29uIHRoYXQgY2FuIGJlIHVzZWQgaW4gdHJlZSBicm93c2VyIHByZXNlbnRhdGlvbnMgYW5kIGJyZWFrZG93biBzdHJ1Y3R1cmVzLjwvYm9keT4NCi0gICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfdEZOZmJDWDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IjEiLz4NCi0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3RGTmZiU1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il90R1p4eWlYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJSb2xlU2V0Ij4NCi0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3RHWnh5eVg1RWQyS25KMnlqTlhoV1EiIGFubm90YXRlZEVsZW1lbnQ9Il90R1p4eWlYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDxib2R5PkEgUm9sZSBTZXQgb3JnYW5pemVzIFJvbGVzIGludG8gY2F0ZWdvcmllcy4gIEl0IGlzIHVzZWQgdG8gZ3JvdXAgcm9sZXMgdG9nZXRoZXIgdGhhdCBoYXZlIGNlcnRhaW4gY29tbW9uYWxpdGllcy4gIEZvciBleGFtcGxlLCB0aGUgJnF1b3Q7QW5hbHlzdHMmcXVvdDsgUm9sZSBTZXQgY291bGQgZ3JvdXAgdGhlICZxdW90O0J1c2luZXNzIFByb2Nlc3MgQW5hbHlzdCZxdW90OywgJnF1b3Q7U3lzdGVtIEFuYWx5c3QmcXVvdDssIGFzIHdlbGwgYXMgJnF1b3Q7UmVxdWlyZW1lbnRzIFNwZWNpZmllciZxdW90OyByb2xlcy4gIEFsbCBvZiB0aGVzZSB3b3JrIHdpdGggc2ltaWxhciB0ZWNobmlxdWVzIGFuZCBoYXZlIG92ZXJsYXBwaW5nIHNraWxscywgYnV0IGFyZSByZXF1aXJlZCBhcyBkaXN0aW5jdCByb2xlcyBmb3IgYSBtZXRob2QgKGUuZy4gdGhlIG1ldGhvZCB0aGUgSUJNIFJhdGlvbmFsIFVuaWZpZWQgUHJvY2VzcyBpcyBiYXNlZCBvbikuDQotPC9ib2R5Pg0KLSAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il90R1p4ekNYNUVkMktuSjJ5ak5YaFdRIiBnZW5lcmFsPSJfdEdaeDN5WDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il90R1p4elNYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJyb2xlcyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdERJYlVTWDVFZDJLbkoyeWpOWGhXUSIgYXNzb2NpYXRpb249Il90R2ppeVNYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3RHWnh6aVg1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIqIi8+DQotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il90R1p4enlYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfdEdaeDBDWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iRG9tYWluIj4NCi0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3RHWngwU1g1RWQyS25KMnlqTlhoV1EiIGFubm90YXRlZEVsZW1lbnQ9Il90R1p4MENYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDxib2R5PkRvbWFpbiBpcyBhIHJlZmluZWFibGUgaGllcmFyY2h5IGdyb3VwaW5nIHJlbGF0ZWQgd29yayBwcm9kdWN0cy4gIEluIG90aGVyIHdvcmRzLCBEb21haW5zIGNhbiBiZSBmdXJ0aGVyIGRpdmlkZWQgaW50byBzdWItZG9tYWlucywgd2l0aCB3b3JrIHByb2R1Y3QgZWxlbWVudHMgdG8gYmUgY2F0ZWdvcml6ZWQgb25seSBhdCB0aGUgbGVhZi1sZXZlbCBvZiB0aGlzIGhpZXJhcmNoeS4NCi1Eb21haW4gaXMgYSBsb2dpY2FsIGdyb3VwaW5nIG9mIHdvcmsgcHJvZHVjdHMgdGhhdCBoYXZlIGFuIGFmZmluaXR5IHRvIGVhY2ggb3RoZXIgYmFzZWQgb24gcmVzb3VyY2VzLCB0aW1pbmcsIG9yIHJlbGF0aW9uc2hpcC4gIEEgRG9tYWluIG1heSBiZSBkaXZpZGVkIGludG8gc3ViZG9tYWlucy4gIEZvciBleGFtcGxlLCBHUyBNZXRob2QgdXNlcyBzaXggcHJlZGVmaW5lZCBEb21haW5zIGZvciBXb3JrIFByb2R1Y3RzOiBBcHBsaWNhdGlvbiwgQXJjaGl0ZWN0dXJlLCBCdXNpbmVzcywgRW5nYWdlbWVudCwgT3BlcmF0aW9ucyBhbmQgT3JnYW5pemF0aW9uLg0KLTwvYm9keT4NCi0gICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfdEdaeDBpWDVFZDJLbkoyeWpOWGhXUSIgZ2VuZXJhbD0iX3RHWngzeVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfdEdaeDB5WDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0id29ya1Byb2R1Y3RzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il90REliY0NYNUVkMktuSjJ5ak5YaFdRIiBhc3NvY2lhdGlvbj0iX3RHaml6aVg1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfdEdaeDFDWDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IioiLz4NCi0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3RHWngxU1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il90R1p4MWlYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJzdWJkb21haW5zIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il90R1p4MENYNUVkMktuSjJ5ak5YaFdRIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBhc3NvY2lhdGlvbj0iX3RHamkweVg1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfdEdaeDF5WDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IioiLz4NCi0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3RHWngyQ1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il90R1p4MlNYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJXb3JrUHJvZHVjdFR5cGUiPg0KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfdEdaeDJpWDVFZDJLbkoyeWpOWGhXUSIgYW5ub3RhdGVkRWxlbWVudD0iX3RHWngyU1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPGJvZHk+V29yayBQcm9kdWN0IFR5cGUgaXMgYSBzZWNvbmQgY2F0ZWdvcnkgZm9yIHdvcmsgcHJvZHVjdHMsIHdoaWNoIGluIGNvbnRyYXN0IHRvIERvbWFpbiBpcyBtb3JlIHByZXNlbnRhdGlvbiBvcmllbnRlZC4gIEEgd29yayBwcm9kdWN0IGNhbiBoYXZlIG1hbnkgV29yayBQcm9kdWN0IFR5cGVzLiAgRXhhbXBsZXMsIGZvciBhIFdvcmsgUHJvZHVjdCBUeXBlIGlzICZxdW90O0NsYXNzIERpYWdyYW0mcXVvdDssIHdoaWNoIGNhdGVnb3JpemVzIHRoZSBBcnRpZmFjdHMgQW5hbHlzaXMgTW9kZWwsIERlc2lnbiBNb2RlbCwgVXNlciBFeHBlcmllbmNlIE1vZGVsLCBvciAmcXVvdDtTcGVjaWZpY2F0aW9uJnF1b3Q7LCB3aGljaCBjYXRlZ29yaXplcyByZXF1aXJlbWVudHMgc3BlY2lmaWNhdGlvbnMgdGhhdCBkZWZpbmUgYSBzeXN0ZW0gd2l0aCBhIHdlbGwtZGVmaW5lZCBzeXN0ZW0gYm91bmRhcnksIHN1Y2ggYXMgdXNlIGNhc2Ugb3IgZnVuY3Rpb25hbCByZXF1aXJlbWVudHMgc3BlY2lmaWNhdGlvbi4gIEEgV29yayBQcm9kdWN0IGNhbiBiZSBjYXRlZ29yaXplZCB0byBiZSBvZiBtYW55IFdvcmsgUHJvZHVjdCBUeXBlcy4gIEZvciBleGFtcGxlLCBhIHVzZSBjYXNlIG1vZGVsIGNhbiBiZSBjYXRlZ29yaXplZCBhcyBhIFNwZWNpZmljYXRpb24gYXMgd2VsbCBhcyBEaWFncmFtIFdvcmsgUHJvZHVjdCBUeXBlLg0KLTwvYm9keT4NCi0gICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfdEdaeDJ5WDVFZDJLbkoyeWpOWGhXUSIgZ2VuZXJhbD0iX3RHWngzeVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfdEdaeDNDWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0id29ya1Byb2R1Y3RzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il90REliY0NYNUVkMktuSjJ5ak5YaFdRIiBhc3NvY2lhdGlvbj0iX3RHamkxaVg1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfdEdaeDNTWDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IioiLz4NCi0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3RHWngzaVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il90R1p4M3lYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJDb250ZW50Q2F0ZWdvcnkiIGlzQWJzdHJhY3Q9InRydWUiPg0KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfdEdaeDRDWDVFZDJLbkoyeWpOWGhXUSIgYW5ub3RhdGVkRWxlbWVudD0iX3RHWngzeVg1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPGJvZHk+Q29udGVudCBDYXRlZ29yeSBpcyBhbiBhYnN0cmFjdCBjbGFzcyBnZW5lcmFsaXppbmcgY29udGVudCBjYXRlZ29yeSB0eXBlcy48L2JvZHk+DQotICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3RHWng0U1g1RWQyS25KMnlqTlhoV1EiIGdlbmVyYWw9Il90QjhJbkNYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3RHWng0aVg1RWQyS25KMnlqTlhoV1EiIG5hbWU9IkRpc2NpcGxpbmVHcm91cGluZyI+DQotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il90R1p4NHlYNUVkMktuSjJ5ak5YaFdRIiBhbm5vdGF0ZWRFbGVtZW50PSJfdEdaeDRpWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8Ym9keT5EaXNjaXBsaW5lIEdyb3VwaW5ncyBhcmUgdXNlZCB0byBncm91cCBEaXNjaXBsaW5lcy4gIEZvciBleGFtcGxlLCB0aGUgRGlzY2lwbGluZSBHcm91cGluZyAmcXVvdDtTb2Z0d2FyZSBEaXNjaXBsaW5lcyZxdW90OyB3b3VsZCBiZSB0aGUgZ3JvdXAgb2YgYWxsIGRpc2NpcGxpbmVzIHJlbGF0ZWQgdG8gZGV2ZWxvcGluZyBzb2Z0d2FyZSBzdWNoIGFzICZxdW90O1JlcXVpcmVtZW50cyBNYW5hZ2VtZW50JnF1b3Q7IG9yICZxdW90O1Rlc3RpbmcmcXVvdDs7ICZxdW90O0lUIEluZnJhc3RydWN0dXJlIE1hbmFnZW1lbnQmcXVvdDsgd291bGQgYmUgYSBEaXNjaXBsaW5lcyBHcm91cGluZyBmb3IgZGlzY2lwbGluZXMgc3VjaCBhcyAmcXVvdDtJVCBPcGVyYXRpb25hbCBTZXJ2aWNlcyZxdW90OywgJnF1b3Q7SVQgQ3VzdG9tZXIgUmVsYXRpb25zaGlwcyZxdW90Oywgb3IgJnF1b3Q7SVQgRW5hYmxpbmcgU2VydmljZXMmcXVvdDsuICBEaXNjaXBsaW5lcyBjYW4gYmUgYXNzb2NpYXRlZCB0byBtb3JlIHRoYW4gb25lIERpc2NpcGxpbmUgR3JvdXBpbmcuDQotPC9ib2R5Pg0KLSAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il90R1p4NUNYNUVkMktuSjJ5ak5YaFdRIiBnZW5lcmFsPSJfdEdaeDN5WDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il90R1p4NVNYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJkaXNjaXBsaW5lcyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdEdaeHdTWDVFZDJLbkoyeWpOWGhXUSIgYXNzb2NpYXRpb249Il90R2ppMnlYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3RHWng1aVg1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIqIi8+DQotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il90R1p4NXlYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfdEdaeDZDWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iVG9vbCI+DQotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il90R1p4NlNYNUVkMktuSjJ5ak5YaFdRIiBhbm5vdGF0ZWRFbGVtZW50PSJfdEdaeDZDWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8Ym9keT5BIFRvb2wgaXMgYSBjb250YWluZXIvYWdncmVnYXRlIGZvciBUb29sTWVudG9ycy4gIEl0IGNhbiBhbHNvIHByb3ZpZGUgZ2VuZXJhbCBkZXNjcmlwdGlvbnMgb2YgdGhlIHRvb2wgYW5kIGl0cyBnZW5lcmFsIGNhcGFiaWxpdGllcy48L2JvZHk+DQotICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3RHWng2aVg1RWQyS25KMnlqTlhoV1EiIGdlbmVyYWw9Il90R1p4M3lYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3RHWng2eVg1RWQyS25KMnlqTlhoV1EiIG5hbWU9InRvb2xNZW50b3JzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il90RUs5TmlYNUVkMktuSjJ5ak5YaFdRIiBhc3NvY2lhdGlvbj0iX3RHamk0Q1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfdEdaeDdDWDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IioiLz4NCi0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3RHWng3U1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il90R1p4N2lYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJSb2xlU2V0R3JvdXBpbmciPg0KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfdEdaeDd5WDVFZDJLbkoyeWpOWGhXUSIgYW5ub3RhdGVkRWxlbWVudD0iX3RHWng3aVg1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPGJvZHk+Um9sZSBTZXRzIGNhbiBiZSBjYXRlZ29yaXplZCBpbnRvIFJvbGUgU2V0IEdyb3VwaW5ncy4gIEZvciBleGFtcGxlLCBkaWZmZXJlbnQgbWV0aG9kcyBtaWdodCBkZWZpbmUgc2ltaWxhciBSb2xlIFNldHMsIHdoaWNoIGhvd2V2ZXIgbmVlZCB0byBiZSBkaXN0aW5ndWlzaGVkIGZyb20gZWFjaCBvdGhlciBvbiBhIGdsb2JhbCBzY2FsZS4gIFRodXMsIFJvbGUgU2V0IEdyb3VwaW5ncyBhbGxvdyBkaXN0aW5ndWlzaGluZywgZm9yIGV4YW1wbGUsIFNvZnR3YXJlIFNlcnZpY2VzIE1hbmFnZXIgUm9sZSBTZXRzIGZyb20gU29mdHdhcmUgRGV2ZWxvcG1lbnQgT3JnYW5pemF0aW9uIE1hbmFnZXIgUm9sZSBTZXRzLjwvYm9keT4NCi0gICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfdEdaeDhDWDVFZDJLbkoyeWpOWGhXUSIgZ2VuZXJhbD0iX3RHWngzeVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfdEdaeDhTWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0icm9sZVNldHMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3RHWnh5aVg1RWQyS25KMnlqTlhoV1EiIGFzc29jaWF0aW9uPSJfdEdqaTVTWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il90R1p4OGlYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfdEdaeDh5WDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3RHaml3Q1g1RWQyS25KMnlqTlhoV1EiIG5hbWU9IkN1c3RvbUNhdGVnb3J5Ij4NCi0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3RHaml3U1g1RWQyS25KMnlqTlhoV1EiIGFubm90YXRlZEVsZW1lbnQ9Il90R2ppd0NYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDxib2R5PkEgQ3VzdG9tIENhdGVnb3J5IGlzIGEgY2F0ZWdvcnkgaW50cm9kdWNlZCBieSBhIG1ldGhvZCBjb250ZW50IGF1dGhvciB0byBzdHJ1Y3R1cmUgYW55IG51bWJlciBvZiBtZXRob2QgQ29udGVudCBFbGVtZW50cyBvZiBhbnkgc3VidHlwZSBiYXNlZCBvbiB1c2VyLWRlZmluZWQgY3JpdGVyaWEuICBCZWNhdXNlIENvbnRlbnQgQ2F0ZWdvcmllcyAoYW5kIHRoZXJlZm9yZSBDdXN0b20gQ2F0ZWdvcmllcywgdG9vKSBhcmUgQ29udGVudCBFbGVtZW50cyB0aGVtc2VsdmVzLCBDdXN0b20gQ2F0ZWdvcmllcyBjYW4gYmUgdXNlZCB0byByZWN1cnNpdmVseSBjYXRlZ29yaXplIENvbnRlbnQgQ2F0ZWdvcmllcyBhcyB3ZWxsLiAgQ3VzdG9tIENhdGVnb3JpZXMgY2FuIGFsc28gYmUgbmVzdGVkIHdpdGggYW55IENvbnRlbnQgQ2F0ZWdvcnkuICBDdXN0b20gY2F0ZWdvcmllcyBjYW4gYmUgdXNlZCB0byBjYXRlZ29yaXplIGNvbnRlbnQgYmFzZWQgb24gdGhlIHVzZXIncyBjcml0ZXJpYSBhcyB3ZWxsIGFzIHRvIGRlZmluZSB3aG9sZSB0cmVlLXN0cnVjdHVyZXMgb2YgbmVzdGVkIGNhdGVnb3JpZXMgYWxsb3dpbmcgdGhlIHVzZXIgdG8gc3lzdGVtYXRpY2FsbHkgbmF2aWdhdGUgYW5kIGJyb3dzZSBtZXRob2QgY29udGVudCBhbmQgcHJvY2Vzc2VzIGJhc2VkIG9uIHRoZXNlIGNhdGVnb3JpZXMuICBGb3IgZXhhbXBsZSwgb25lIGNvdWxkIGNyZWF0ZSBhIGN1c3RvbSBjYXRlZ29yeSB0byBsb2dpY2FsbHkgb3JnYW5pemUgY29udGVudCByZWxldmFudCBmb3IgdGhlIHVzZXIncyBkZXZlbG9wbWVudCBvcmdhbml6YXRpb24gZGVwYXJ0bWVudHM7IGUuZy4gYSAmcXVvdDtUZXN0aW5nJnF1b3Q7IGNhdGVnb3J5IHRoYXQgZ3JvdXBzIHRvZ2V0aGVyIGFsbCByb2xlcywgd29yayBwcm9kdWN0cywgdGFza3MsIGFuZCBndWlkYW5jZSBlbGVtZW50IHJlbGV2YW50IHRvIHRlc3RpbmcuICBBbm90aGVyIGV4YW1wbGUgd291bGQgYmUgY2F0ZWdvcmllcyB0aGF0IGV4cHJlc3MgbGljZW5zaW5nIGxldmVscyBvZiB0aGUgY29udGVudCBncm91cGluZyBmcmVlbHkgZGlzdHJpYnV0YWJsZSBtZXRob2QgY29udGVudCB2ZXJzdXMgY29udGVudCB0aGF0IHJlcHJlc2VudCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgYW5kIHJlcXVpcmVzIGEgbGljZW5zZSB0byBiZSBwdXJjaGFzZWQgdG8gYmUgYWJsZSB0byB1c2UgaXQuDQotPC9ib2R5Pg0KLSAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il90R2ppd2lYNUVkMktuSjJ5ak5YaFdRIiBnZW5lcmFsPSJfdEdaeDN5WDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il90R2ppd3lYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJjYXRlZ29yaXplZEVsZW1lbnRzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il90Q0ZTaUNYNUVkMktuSjJ5ak5YaFdRIiBhc3NvY2lhdGlvbj0iX3RHamk2aVg1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfdEdqaXhDWDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IioiLz4NCi0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3RHaml4U1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il90R2ppeGlYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJzdWJDYXRlZ29yaWVzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il90R1p4M3lYNUVkMktuSjJ5ak5YaFdRIiBhc3NvY2lhdGlvbj0iX3RHamk3eVg1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfdEdqaXh5WDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IioiLz4NCi0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3RHaml5Q1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il90R2ppeVNYNUVkMktuSjJ5ak5YaFdRIiBtZW1iZXJFbmQ9Il90R2ppeXlYNUVkMktuSjJ5ak5YaFdRIF90R1p4elNYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3RHaml5aVg1RWQyS25KMnlqTlhoV1EiIGFubm90YXRlZEVsZW1lbnQ9Il90R2ppeVNYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDxib2R5PkEgUm9sZSBTZXQgY2F0ZWdvcml6ZXMgbWFueSBSb2xlcyBhbmQgYSBSb2xlIGNhbiBiZSByZXByZXNlbnRlZCBpbiBtYXkgUm9sZSBTZXRzLjwvYm9keT4NCi0gICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfdEdqaXl5WDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0icm9sZVNldHMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3RHWnh5aVg1RWQyS25KMnlqTlhoV1EiIGFzc29jaWF0aW9uPSJfdEdqaXlTWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il90R2ppekNYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfdEdqaXpTWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgIDwvb3duZWRFbmQ+DQotICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3RHaml6aVg1RWQyS25KMnlqTlhoV1EiIG5hbWU9IiIgbWVtYmVyRW5kPSJfdEdqaTBDWDVFZDJLbkoyeWpOWGhXUSBfdEdaeDB5WDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il90R2ppenlYNUVkMktuSjJ5ak5YaFdRIiBhbm5vdGF0ZWRFbGVtZW50PSJfdEdqaXppWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8Ym9keT5BIERvbWFpbiBjYXRlZ29yaXplcyBtYW55IFdvcmsgUHJvZHVjdHMuIEEgV29yayBQcm9kdWN0IGJlbG9uZ3MgYXQgbW9zdCB0byBvbmUgRG9tYWluLjwvYm9keT4NCi0gICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfdEdqaTBDWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iZG9tYWluIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il90R1p4MENYNUVkMktuSjJ5ak5YaFdRIiBhc3NvY2lhdGlvbj0iX3RHaml6aVg1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfdEdqaTBTWDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IioiLz4NCi0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3RHamkwaVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICA8L293bmVkRW5kPg0KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il90R2ppMHlYNUVkMktuSjJ5ak5YaFdRIiBtZW1iZXJFbmQ9Il90R2ppMVNYNUVkMktuSjJ5ak5YaFdRIF90R1p4MWlYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3RHamkxQ1g1RWQyS25KMnlqTlhoV1EiIGFubm90YXRlZEVsZW1lbnQ9Il90R2ppMHlYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDxib2R5PkRvbWFpbnMgY2FuIGJlIGZ1cnRoZXIgZGl2aWRlZCBpbnRvIFN1YmRvbWFpbnMsIHdpdGggd29yayBwcm9kdWN0IGVsZW1lbnRzIG9ubHkgdG8gYmUgY2F0ZWdvcml6ZWQgYXQgdGhlIGxlYWYtbGV2ZWwuPC9ib2R5Pg0KLSAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il90R2ppMVNYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJfZG9tYWluIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il90R1p4MENYNUVkMktuSjJ5ak5YaFdRIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfdEdqaTB5WDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il90R2ppMWlYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSIiIG1lbWJlckVuZD0iX3RHamkyQ1g1RWQyS25KMnlqTlhoV1EgX3RHWngzQ1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfdEdqaTF5WDVFZDJLbkoyeWpOWGhXUSIgYW5ub3RhdGVkRWxlbWVudD0iX3RHamkxaVg1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPGJvZHk+QSBXb3JrIFByb2R1Y3QgY2FuIGJlIGNhdGVnb3JpemVkIHRvIGJlIHplcm8gb2YgbWFueSBXb3JrIFByb2R1Y3QgVHlwZXMuPC9ib2R5Pg0KLSAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il90R2ppMkNYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJ3b3JrUHJvZHVjdFR5cGVzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il90R1p4MlNYNUVkMktuSjJ5ak5YaFdRIiBhc3NvY2lhdGlvbj0iX3RHamkxaVg1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfdEdqaTJTWDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IioiLz4NCi0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3RHamkyaVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICA8L293bmVkRW5kPg0KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il90R2ppMnlYNUVkMktuSjJ5ak5YaFdRIiBtZW1iZXJFbmQ9Il90R2ppM1NYNUVkMktuSjJ5ak5YaFdRIF90R1p4NVNYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3RHamkzQ1g1RWQyS25KMnlqTlhoV1EiIGFubm90YXRlZEVsZW1lbnQ9Il90R2ppMnlYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDxib2R5PkRpc2NpcGxpbmUgR3JvdXBpbmdzIGdyb3VwIG1hbnkgRGlzY2lwbGluZXMuICBBIERpc2NpcGxpbmUgY2FuIGJlIGluIG1hbnkgRGlzY2lwbGluZSBHcm91cHMuPC9ib2R5Pg0KLSAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il90R2ppM1NYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJkaXNjaXBsaW5lR3JvdXBzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il90R1p4NGlYNUVkMktuSjJ5ak5YaFdRIiBhc3NvY2lhdGlvbj0iX3RHamkyeVg1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfdEdqaTNpWDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IioiLz4NCi0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3RHamkzeVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICA8L293bmVkRW5kPg0KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il90R2ppNENYNUVkMktuSjJ5ak5YaFdRIiBtZW1iZXJFbmQ9Il90R2ppNGlYNUVkMktuSjJ5ak5YaFdRIF90R1p4NnlYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3RHamk0U1g1RWQyS25KMnlqTlhoV1EiIGFubm90YXRlZEVsZW1lbnQ9Il90R2ppNENYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDxib2R5PkEgVG9vbCBNZW50b3IgZGVzY3JpYmVzIHdvcmsgd2l0aCBleGFjdGx5IG9uZSBUb29sLjwvYm9keT4NCi0gICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfdEdqaTRpWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0idG9vbCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdEdaeDZDWDVFZDJLbkoyeWpOWGhXUSIgYXNzb2NpYXRpb249Il90R2ppNENYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3RHamk0eVg1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIqIi8+DQotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il90R2ppNUNYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgPC9vd25lZEVuZD4NCi0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfdEdqaTVTWDVFZDJLbkoyeWpOWGhXUSIgbWVtYmVyRW5kPSJfdEdqaTV5WDVFZDJLbkoyeWpOWGhXUSBfdEdaeDhTWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il90R2ppNWlYNUVkMktuSjJ5ak5YaFdRIiBhbm5vdGF0ZWRFbGVtZW50PSJfdEdqaTVTWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8Ym9keT5BIFJvbGUgU2V0IEdyb3VwaW5nIGNvbnRhaW5zIG1hbnkgUm9sZSBTZXRzLiBSb2xlIFNldHMgY2FuIGJlIGluIG1hbnkgUm9sZSBTZXQgR3JvdXBpbmdzLjwvYm9keT4NCi0gICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfdEdqaTV5WDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0icm9sZVNldEdyb3VwcyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdEdaeDdpWDVFZDJLbkoyeWpOWGhXUSIgYXNzb2NpYXRpb249Il90R2ppNVNYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3RHamk2Q1g1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIqIi8+DQotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il90R2ppNlNYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgPC9vd25lZEVuZD4NCi0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfdEdqaTZpWDVFZDJLbkoyeWpOWGhXUSIgbWVtYmVyRW5kPSJfdEdqaXd5WDVFZDJLbkoyeWpOWGhXUSBfdEdqaTdDWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il90R2ppNnlYNUVkMktuSjJ5ak5YaFdRIiBhbm5vdGF0ZWRFbGVtZW50PSJfdEdqaTZpWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8Ym9keT5BIEN1c3RvbUNhdGVnb3J5IGdyb3VwcyB0b2dldGhlciBhbnkgbnVtYmVyIG9mIENvbnRlbnRFbGVtZW50cyBpbmNsdWRpbmcgb3RoZXIgQ29udGVudENhdGVnb3J5LiA8L2JvZHk+DQotICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgPG93bmVkRW5kIHhtaTppZD0iX3RHamk3Q1g1RWQyS25KMnlqTlhoV1EiIG5hbWU9ImN1c3RvbUNhdGVnb3JpZXMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3RHaml3Q1g1RWQyS25KMnlqTlhoV1EiIGFzc29jaWF0aW9uPSJfdEdqaTZpWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il90R2ppN1NYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfdEdqaTdpWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgIDwvb3duZWRFbmQ+DQotICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3RHamk3eVg1RWQyS25KMnlqTlhoV1EiIG1lbWJlckVuZD0iX3RHaml4aVg1RWQyS25KMnlqTlhoV1EgX3RHamk4U1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfdEdqaThDWDVFZDJLbkoyeWpOWGhXUSIgYW5ub3RhdGVkRWxlbWVudD0iX3RHamk3eVg1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPGJvZHk+QSBDdXN0b21DYXRlZ29yeSBjYW4gaGF2ZSBhbnkgbnVtYmVyIG9mIENvbnRlbnRDYXRlZ29yaWVzIGRlZmluZWQgYXMgbmVzdGVkIHN1YkNhdGVnb3JpZXMuICBUaGVyZWZvcmUsIG9uZSBjb3VsZCBuZXN0IEN1c3RvbUNhdGVnb3JpZXMgaW50byBuLWxldmVsIGhpZXJhcmNoaWVzLiA8L2JvZHk+DQotICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgPG93bmVkRW5kIHhtaTppZD0iX3RHamk4U1g1RWQyS25KMnlqTlhoV1EiIG5hbWU9Il9jdXN0b21DYXRlZ29yeSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdEdqaXdDWDVFZDJLbkoyeWpOWGhXUSIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iX3RHamk3eVg1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfdEdqaThpWDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IjEiLz4NCi0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3RHamk4eVg1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIxIi8+DQotICAgICAgPC9vd25lZEVuZD4NCi0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfdEdqaTlDWDVFZDJLbkoyeWpOWGhXUSIgbWVtYmVyRW5kPSJfdEdaeHhDWDVFZDJLbkoyeWpOWGhXUSBfdEdqaTlpWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il90R2ppOVNYNUVkMktuSjJ5ak5YaFdRIiBhbm5vdGF0ZWRFbGVtZW50PSJfdEdqaTlDWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8Ym9keT5FdmVyeSBUYXNrIHNob3VsZCBiZSByZWxhdGVkIHRvIGV4YWN0bHkgb25lIERpc2NpcGxpbmUuICBGb3IgbGVnYWN5IHJlYXNvbnMgdGhpcyBpcyBub3QgZW5mb3JjZWQgKGUuZy4gR1MgTWV0aG9kIGRvZXMgbm90IGRlZmluZSBEaXNjaXBsaW5lcywgeWV0KS48L2JvZHk+DQotICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgPG93bmVkRW5kIHhtaTppZD0iX3RHamk5aVg1RWQyS25KMnlqTlhoV1EiIG5hbWU9ImRpc2NpcGxpbmUiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3RHWnh3U1g1RWQyS25KMnlqTlhoV1EiIGFzc29jaWF0aW9uPSJfdEdqaTlDWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il90R2ppOXlYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfdEdqaS1DWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgIDwvb3duZWRFbmQ+DQotICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3RHamktU1g1RWQyS25KMnlqTlhoV1EiIG1lbWJlckVuZD0iX3RHWnh4eVg1RWQyS25KMnlqTlhoV1EgX3RHamktaVg1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il90R2ppLWlYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJfZGlzY2lwbGluZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdEdaeHdTWDVFZDJLbkoyeWpOWGhXUSIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iX3RHamktU1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfdEhjNm9TWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iTWV0aG9kUGFja2FnZSIgaXNBYnN0cmFjdD0idHJ1ZSI+DQotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il90SGM2b2lYNUVkMktuSjJ5ak5YaFdRIiBhbm5vdGF0ZWRFbGVtZW50PSJfdEhjNm9TWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8Ym9keT5BIE1ldGhvZCBQYWNrYWdlIGlzIGFuIGFic3RyYWN0IGNsYXNzIGZvciBwYWNrYWdpbmcgTWV0aG9kIEVsZW1lbnRzLiAgQWxsIE1ldGhvZCBFbGVtZW50cyBzaGFsbCBiZSBsb2NhdGVkIGluIGV4YWN0bHkgb25lIG9mIE1ldGhvZCBQYWNrYWdlJ3MgY29uY3JldGUgc3BlY2lhbGl6YXRpb25zIChlLmcuIENvbnRlbnQgUGFja2FnZSkuICAgTWV0aG9kIFBhY2thZ2UgZGVmaW5lcyBjb21tb24gcHJvcGVydGllcyBmb3IgYWxsIG9mIGl0cyBzcGVjaWFsaXphdGlvbnMuIEVsZW1lbnRzIGFyZSBvcmdhbml6ZWQgaW4gTWV0aG9kIFBhY2thZ2VzIHRvIHN0cnVjdHVyZSBsYXJnZSBzY2FsZSBvZiBtZXRob2QgY29udGVudCBhbmQgcHJvY2Vzc2VzIGFzIHdlbGwgYXMgdG8gZGVmaW5lIGEgbWVjaGFuaXNtIGZvciByZXVzZS4gIE1ldGhvZCBFbGVtZW50cyBmcm9tIG9uZSBwYWNrYWdlIGNhbiByZXVzZSBlbGVtZW50IGZyb20gb3RoZXIgcGFja2FnZXMgYnkgZGVmaW5pbmcgYSByZXVzZWRQYWNrYWdlcyBsaW5rLiAgRm9yIGV4YW1wbGUsIGEgd29yayBwcm9kdWN0IGRlZmluZWQgaW4gb25lIHBhY2thZ2UgY2FuIGJlIHVzZWQgYXMgYW4gaW5wdXQgZm9yIFRhc2tzIGRlZmluZWQgaW4gb3RoZXIgcGFja2FnZXMuICBCeSByZXVzaW5nIGl0IGZyb20gb25lIGNvbW1vbiBwbGFjZSAoaS5lLiB0aGUgcGFja2FnZSBpbiB3aGljaCBpdCBoYXMgYmVlbiBkZWZpbmVkKSBlbnN1cmVzIHRoYXQgbm8gcmVkdW5kYW50IGRlZmluaXRpb25zIG9mIHRoZSBzYW1lIGVsZW1lbnRzIGFyZSByZXF1aXJlZC4gIEFsc28gbWFpbnRlbmFuY2Ugb2YgbWV0aG9kIGNvbnRlbnQgaXMgZ3JlYXRseSBpbXByb3ZlZCBhcyBjaGFuZ2VzIGNhbiBiZSBwZXJmb3JtZWQgaW4gb25seSBvbmUgcGxhY2UuICBOb3RlLCB0aGF0IG90aGVyIHBhY2thZ2VzIHdpbGwgaW50cm9kdWNlIG1vcmUgc3BlY2lhbGl6YXRpb25zIG9mIE1ldGhvZCBQYWNrYWdlLCBlLmcuIFByb2Nlc3MgUGFja2FnZSBhbmQgUHJvY2VzcyBDb21wb25lbnQuPC9ib2R5Pg0KLSAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il90SGM2b3lYNUVkMktuSjJ5ak5YaFdRIiBnZW5lcmFsPSJfdEJmY29DWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il90SGM2cENYNUVkMktuSjJ5ak5YaFdRIiBnZW5lcmFsPSJfdEI4SWdTWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il90SGM2cFNYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJnbG9iYWwiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3RCb21neVg1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il90SGM2cGlYNUVkMktuSjJ5ak5YaFdRIiBhbm5vdGF0ZWRFbGVtZW50PSJfdEhjNnBTWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICAgIDxib2R5Pk1ldGhvZCBQYWNrYWdlcyBjYW4gaGF2ZSBhIGdsb2JhbCBzY29wZS4gIFRoaXMgbWVhbnMgdGhhdCBldmVyeSBlbGVtZW50IG9mIGV2ZXJ5IG90aGVyIE1ldGhvZCBQYWNrYWdlIGNhbiBzZWUgdGhlIGdsb2JhbCBwYWNrYWdlJ3MgY29udGVudHMuICBHbG9iYWwgTWV0aG9kIFBhY2thZ2VzIGFyZSBwcmltYXJpbHkgdXNlZCB0byBzdG9yZSBjb21tb25seSB1c2VkIGNhdGVnb3J5IGRlZmluaXRpb25zIHN1Y2ggYXMgZm9yIERpc2NpcGxpbmVzIG9yIERvbWFpbnMsIHdoaWNoIGFyZSB1c2VkIGJ5IG1hbnkgVGFzayBhbmQgV29yayBQcm9kdWN0cyByZXNwZWN0aXZlbHkuPC9ib2R5Pg0KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJfdEhjNnB5WDVFZDJLbkoyeWpOWGhXUSIgdHlwZT0iX3RCb21neVg1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgICA8Ym9keT5mYWxzZTwvYm9keT4NCi0gICAgICAgIDwvZGVmYXVsdFZhbHVlPg0KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3RIYzZxQ1g1RWQyS25KMnlqTlhoV1EiIG5hbWU9InJldXNlZFBhY2thZ2VzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il90SGM2b1NYNUVkMktuSjJ5ak5YaFdRIiBhc3NvY2lhdGlvbj0iX3RIYzZ1U1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfdEhjNnFTWDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IioiLz4NCi0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3RIYzZxaVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il90SGM2cXlYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJjaGlsZFBhY2thZ2VzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il90SGM2b1NYNUVkMktuSjJ5ak5YaFdRIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBhc3NvY2lhdGlvbj0iX3RIYzZ2aVg1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfdEhjNnJDWDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IioiLz4NCi0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3RIYzZyU1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il90SGM2cmlYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJDb250ZW50UGFja2FnZSI+DQotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il90SGM2cnlYNUVkMktuSjJ5ak5YaFdRIiBhbm5vdGF0ZWRFbGVtZW50PSJfdEhjNnJpWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8Ym9keT5BIENvbnRlbnQgUGFja2FnZSBpcyBzcGVjaWFsIE1ldGhvZCBQYWNrYWdlIHRoYXQgY29udGFpbnMgQ29udGVudCBFbGVtZW50cyBhbmQgQ29udGVudCBFbGVtZW50cywgb25seS4gIEV4YW1wbGVzIGZvciBDb250ZW50IEVsZW1lbnQgYXJlIEFydGlmYWN0cywgVGFza3MsIFJvbGVzLCBldGMuICBBIGtleSBzZXBhcmF0aW9uIG9mIGNvbmNlcm5zIGluIFVNQSBpcyB0aGUgZGlzdGluY3Rpb24gYmV0d2VlbiBNZXRob2QgQ29udGVudCBhbmQgUHJvY2Vzcy4gIFRoaXMgc2VwYXJhdGlvbiBpcyBlbmZvcmNlZCBieSBzcGVjaWFsIHBhY2thZ2UgdHlwZXMsIHdoaWNoIGRvIG5vdCBhbGxvdyB0aGUgbWl4aW5nIG9mIG1ldGhvZCBjb250ZW50IHdpdGggcHJvY2Vzc2VzLjwvYm9keT4NCi0gICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfdEhjNnNDWDVFZDJLbkoyeWpOWGhXUSIgZ2VuZXJhbD0iX3RIYzZvU1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfdEhjNnNTWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iY29udGVudEVsZW1lbnRzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il90QjhJbkNYNUVkMktuSjJ5ak5YaFdRIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBhc3NvY2lhdGlvbj0iX3RIYzZ0Q1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfdEhjNnNpWDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IioiLz4NCi0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3RIYzZzeVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il90SGM2dENYNUVkMktuSjJ5ak5YaFdRIiBtZW1iZXJFbmQ9Il90SGM2c1NYNUVkMktuSjJ5ak5YaFdRIF90SGM2dGlYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3RIYzZ0U1g1RWQyS25KMnlqTlhoV1EiIGFubm90YXRlZEVsZW1lbnQ9Il90SGM2dENYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDxib2R5PkEgQ29udGVudCBQYWNrYWdlIGNvbnRhaW5zIENvbnRlbnQgRWxlbWVudHMuICBBIENvbnRlbnQgRWxlbWVudCBpbnN0YW5jZSBjYW4gYmUgcGFydCBvZiBvbmx5IG9uZSBwYWNrYWdlIGluc3RhbmNlLjwvYm9keT4NCi0gICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfdEhjNnRpWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iX2NvbnRlbnRQYWNrYWdlIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il90SGM2cmlYNUVkMktuSjJ5ak5YaFdRIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfdEhjNnRDWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il90SGM2dHlYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iMSIvPg0KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfdEhjNnVDWDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IjEiLz4NCi0gICAgICA8L293bmVkRW5kPg0KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il90SGM2dVNYNUVkMktuSjJ5ak5YaFdRIiBtZW1iZXJFbmQ9Il90SGM2dXlYNUVkMktuSjJ5ak5YaFdRIF90SGM2cUNYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3RIYzZ1aVg1RWQyS25KMnlqTlhoV1EiIGFubm90YXRlZEVsZW1lbnQ9Il90SGM2dVNYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDxib2R5PlRoaXMgYXNzb2NpYXRpb24gZGVzY3JpYmVzIGEgZGVwZW5kZW5jeSBiZXR3ZWVuIHRoZSB0d28gcGFja2FnZXMgaXQgY29ubmVjdHMuICBUaGUgcGFja2FnZSBhdCB0aGUgdXNpbmdQYWNrYWdlIGVuZCBkZXBlbmRzIG9uIHRoZSBwYWNrYWdlIGF0IHRoZSByZXVzZWRQYWNrYWdlIGVuZC4gIEZvciBleGFtcGxlLCBhbiBlbGVtZW50IGluIHRoZSBmb3JtZXIgcGFja2FnZSBpcyB1c2luZyBhbiBlbGVtZW50IGluIHRoZSBsYXRlciBpbiBhIHJlbGF0aW9uc2hpcCBzdWNoIGFzIGEgVGFzayBpcyB1c2luZyBhIFdvcmsgUHJvZHVjdHMgYXMgYW4gaW5wdXQuICBSZWZsZXhpdmUgcmV1c2VkUGFja2FnZSBsaW5rcyAoaS5lLiBhIHBhY2thZ2UgdGhhdCBkZXBlbmRzIG9uIGl0c2VsZikgYXJlIG5vdCBhbGxvd2VkLjwvYm9keT4NCi0gICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfdEhjNnV5WDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0idXNpbmdQYWNrYWdlcyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdEhjNm9TWDVFZDJLbkoyeWpOWGhXUSIgYXNzb2NpYXRpb249Il90SGM2dVNYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3RIYzZ2Q1g1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIqIi8+DQotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il90SGM2dlNYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgPC9vd25lZEVuZD4NCi0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfdEhjNnZpWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iUGFja2FnZU5lc3RpbmciIG1lbWJlckVuZD0iX3RIYzZ3Q1g1RWQyS25KMnlqTlhoV1EgX3RIYzZxeVg1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfdEhjNnZ5WDVFZDJLbkoyeWpOWGhXUSIgYW5ub3RhdGVkRWxlbWVudD0iX3RIYzZ2aVg1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPGJvZHk+TWV0aG9kIFBhY2thZ2VzIGNhbiBiZSBuZXN0ZWQsIGkuZS4gYSBwYWNrYWdlIGNhbiBiZSBwYXJ0IG9mIGFub3RoZXIgcGFja2FnZS4gIE5lc3RlZCBwYWNrYWdlcyBkbyBub3QgbmVlZCB0byBiZSBvZiB0aGUgc2FtZSB0eXBlLCBlLmcuIGEgQ29udGVudCBQYWNrYWdlIGNhbiBiZSBkZWZpbmVkIGluc2lkZSBhIFByb2Nlc3MgUGFja2FnZSAoZGVmaW5lIGZvciB0aGUgUHJvY2VzcyBwYXJ0IG9mIHRoaXMgbW9kZWwpLjwvYm9keT4NCi0gICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfdEhjNndDWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iX21ldGhvZFBhY2thZ2UiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3RIYzZvU1g1RWQyS25KMnlqTlhoV1EiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il90SGM2dmlYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3RIYzZ3U1g1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIxIi8+DQotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il90SGM2d2lYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgPC9vd25lZEVuZD4NCi0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfdEtsSEp5WDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iTWlsZXN0b25lIj4NCi0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3RLbEhLQ1g1RWQyS25KMnlqTlhoV1EiIGFubm90YXRlZEVsZW1lbnQ9Il90S2xISnlYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDxib2R5PkEgTWlsZXN0b25lIGRlc2NyaWJlcyBhIHNpZ25pZmljYW50IGV2ZW50IGluIGEgZGV2ZWxvcG1lbnQgcHJvamVjdCwgc3VjaCBhcyBhIG1ham9yIGRlY2lzaW9uLCBjb21wbGV0aW9uIG9mIGEgZGVsaXZlcmFibGUsIG9yIG1lZXRpbmcgb2YgYSBtYWpvciBkZXBlbmRlbmN5IChsaWtlIGNvbXBsZXRpb24gb2YgYSBwcm9qZWN0IHBoYXNlKS4gIEJlY2F1c2UsIE1pbGVzdG9uZSBpcyBjb21tb25seSB1c2VkIHRvIHJlZmVyIHRvIGJvdGggdGhlIGV2ZW50IGl0c2VsZiBhbmQgdGhlIHBvaW50IGluIHRpbWUgYXQgd2hpY2ggdGhlIGV2ZW50IGlzIHNjaGVkdWxlZCB0byBoYXBwZW4sIGl0IGlzIG1vZGVsZWQgYXMgYSBCcmVha2Rvd24gRWxlbWVudCAoaS5lLiBpdCBhcHBlYXJzIGFzIHBhcnQgb2YgYSBicmVha2Rvd24gc3RydWN0dXJlKS48L2JvZHk+DQotICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3RLbEhLU1g1RWQyS25KMnlqTlhoV1EiIGdlbmVyYWw9Il90S3VSRmlYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3RLbEhLaVg1RWQyS25KMnlqTlhoV1EiIG5hbWU9InJlcXVpcmVkUmVzdWx0cyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdEtsSHFTWDVFZDJLbkoyeWpOWGhXUSIgYXNzb2NpYXRpb249Il90TEs5QUNYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3RLbEhLeVg1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIqIi8+DQotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il90S2xITENYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfdEtsSExTWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iSXRlcmF0aW9uIj4NCi0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3RLbEhMaVg1RWQyS25KMnlqTlhoV1EiIGFubm90YXRlZEVsZW1lbnQ9Il90S2xITFNYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDxib2R5Pkl0ZXJhdGlvbiBpcyBhIHNwZWNpYWwgQWN0aXZpdHksIHdoaWNoIHByZXNjcmliZXMgcHJlLWRlZmluZWQgdmFsdWVzIGZvciBpdHMgaW5zdGFuY2VzIGZvciB0aGUgYXR0cmlidXRlcyBwcmVmaXggKCdJdGVyYXRpb24nKSBhbmQgaXNSZXBlYXRhYmxlICgnVHJ1ZScpLiAgSXQgaGFzIGJlZW4gaW5jbHVkZWQgaW50byB0aGUgbWV0YS1tb2RlbCBmb3IgY29udmVuaWVuY2UgYW5kIHRvIHByb3ZpZGUgYSBzcGVjaWFsIHN0ZXJlb3R5cGUsIGJlY2F1c2UgaXQgcmVwcmVzZW50cyBhIHZlcnkgY29tbW9ubHkgdXNlZCBBY3Rpdml0eSB0eXBlLg0KLUl0ZXJhdGlvbiBncm91cHMgYSBzZXQgb2YgbmVzdGVkIEFjdGl2aXRpZXMgdGhhdCBhcmUgcmVwZWF0ZWQgbW9yZSB0aGFuIG9uY2UuICBJdCByZXByZXNlbnRzIGFuIGltcG9ydGFudCBzdHJ1Y3R1cmluZyBlbGVtZW50IHRvIG9yZ2FuaXplIHdvcmsgaW4gcmVwZXRpdGl2ZSBjeWNsZXMuICBUaGUgY29uY2VwdCBvZiBJdGVyYXRpb24gY2FuIGJlIGFzc29jaWF0ZWQgd2l0aCBkaWZmZXJlbnQgcnVsZXMgaW4gZGlmZmVyZW50IG1ldGhvZHMuICBGb3IgZXhhbXBsZSwgdGhlIElCTSBSYXRpb25hbCBVbmlmaWVkIFByb2Nlc3MgbWV0aG9kIGZyYW1ld29yayAoUlVQKSBkZWZpbmVzIGEgcnVsZSB0aGF0IEl0ZXJhdGlvbnMgYXJlIG5vdCBhbGxvd2VkIHRvIHNwYW4gYWNyb3NzIFBoYXNlcy4gIEluIGNvbnRyYXN0IElCTSBHbG9iYWwgU2VydmljZXMgTWV0aG9kIChHU01ldGhvZCkgYmFzZWQgbWV0aG9kIGZyYW1ld29ya3MgdGhpcyBydWxlIGRvZXMgbm90IGFwcGx5IGFuZCBJdGVyYXRpb24gY2FuIGJlIGRlZmluZWQgd2hpY2ggbmVzdCBQaGFzZXMuICBSdWxlcyBsaWtlIHRoZXNlLCB3aGljaCBwbGF5IGFuIGltcG9ydGFudCByb2xlIGZvciBlYWNoIGluZGl2aWR1YWwgbWV0aG9kIGFuZCBhcmUgdGhlcmVmb3JlIG5vdCBlbmZvcmNlZCBieSB0aGlzIG1ldGEtbW9kZWwuICBJbnN0ZWFkLCBwcm9jZXNzIGF1dGhvcnMgYXJlIGV4cGVjdGVkIHRvIGZvbGxvdyBhbmQgY2hlY2sgdGhlc2UgcnVsZXMgbWFudWFsbHkuICAoTm90ZTogQW55IEJyZWFrZG93biBFbGVtZW50IGNhbiBiZSByZXBlYXRlZDsgaG93ZXZlciwgSXRlcmF0aW9ucyBoYXMgYmVlbiBpbnRyb2R1Y2VkIGFzIGEgc3BlY2lhbCBtZXRhLW1vZGVsIGNvbmNlcHQsIGJlY2F1c2Ugb2YgaXRzIGltcG9ydGFudCByb2xlIGZvciBtYW55IG1ldGhvZHMuKQ0KLTwvYm9keT4NCi0gICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfdEtsSEx5WDVFZDJLbkoyeWpOWGhXUSIgZ2VuZXJhbD0iX3RLbEhJQ1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfdEtsSE1DWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iUGhhc2UiPg0KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfdEtsSE1TWDVFZDJLbkoyeWpOWGhXUSIgYW5ub3RhdGVkRWxlbWVudD0iX3RLbEhNQ1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPGJvZHk+UGhhc2UgaXMgYSBzcGVjaWFsIEFjdGl2aXR5LCB3aGljaCBwcmVzY3JpYmVzIHByZS1kZWZpbmVkIHZhbHVlcyBmb3IgaXRzIGluc3RhbmNlcyBmb3IgdGhlIGF0dHJpYnV0ZXMgcHJlZml4ICgnUGhhc2UnKSBhbmQgaXNSZXBlYXRhYmxlICgnRmFsc2UnKS4gIEl0IGhhcyBiZWVuIGluY2x1ZGVkIGludG8gdGhlIG1ldGEtbW9kZWwgZm9yIGNvbnZlbmllbmNlIGFuZCB0byBwcm92aWRlIGEgc3BlY2lhbCBzdGVyZW90eXBlLCBiZWNhdXNlIGl0IHJlcHJlc2VudHMgYSB2ZXJ5IGNvbW1vbmx5IHVzZWQgQWN0aXZpdHkgdHlwZS4NCi1QaGFzZSByZXByZXNlbnQgYSBzaWduaWZpY2FudCBwZXJpb2QgaW4gYSBwcm9qZWN0LCBlbmRpbmcgd2l0aCBtYWpvciBtYW5hZ2VtZW50IGNoZWNrcG9pbnQsIG1pbGVzdG9uZSBvciBzZXQgb2YgRGVsaXZlcmFibGVzLiAgSXQgaXMgaW5jbHVkZWQgaW4gdGhlIG1vZGVsIGFzIGEgcHJlZGVmaW5lZCBzcGVjaWFsIEFjdGl2aXR5LCBiZWNhdXNlIG9mIGl0cyBzaWduaWZpY2FuY2UgaW4gZGVmaW5pbmcgYnJlYWtkb3ducy4NCi08L2JvZHk+DQotICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3RLbEhNaVg1RWQyS25KMnlqTlhoV1EiIGdlbmVyYWw9Il90S2xISUNYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3RLbEhNeVg1RWQyS25KMnlqTlhoV1EiIG5hbWU9IlRlYW1Qcm9maWxlIj4NCi0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3RLbEhOQ1g1RWQyS25KMnlqTlhoV1EiIGFubm90YXRlZEVsZW1lbnQ9Il90S2xITXlYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDxib2R5PkEgVGVhbSBQcm9maWxlIGlzIGEgQnJlYWtkb3duIEVsZW1lbnQgdGhhdCBncm91cHMgUm9sZSBEZXNjcmlwdG9ycyBvciBSZXNvdXJjZSBEZWZpbml0aW9ucyBkZWZpbmluZyBhIG5lc3RlZCBoaWVyYXJjaHkgb2YgdGVhbXMgYW5kIHRlYW0gbWVtYmVycy4NCi1Xb3JrIGFzc2lnbm1lbnRzIGFuZCBXb3JrIFByb2R1Y3QgcmVzcG9uc2liaWxpdGllcyBjYW4gYmUgZGlmZmVyZW50IGZyb20gQWN0aXZpdHkgdG8gQWN0aXZpdHkgaW4gYSBkZXZlbG9wbWVudCBwcm9qZWN0LiBEaWZmZXJlbnQgcGhhc2VzIHJlcXVpcmUgZGlmZmVyZW50IHN0YWZmaW5nIHByb2ZpbGVzLCBpLmUuIGRpZmZlcmVudCBza2lsbHMgYW5kIHJlc291cmNlcyBkb2luZyBkaWZmZXJlbnQgdHlwZXMgb2Ygd29yay4gIFRoZXJlZm9yZSwgYSBwcm9jZXNzIG5lZWRzIHRvIGRlZmluZSBzdWNoIGRpZmZlcmVudCBwcm9maWxlcyBpbiBhIGZsZXhpYmxlIG1hbm5lci4gIFdoZXJlYXMgQ29yZSBNZXRob2QgQ29udGVudCBkZWZpbmVzIHN0YW5kYXJkIHJlc3BvbnNpYmlsaXRpZXMgYW5kIGFzc2lnbm1lbnRzLCBhIHByb2Nlc3MgZXhwcmVzcyBieSBhIGJyZWFrZG93biBzdHJ1Y3R1cmVzIG5lZWRzIHRvIGJlIGFibGUgcmVmaW5lIGFuZCByZWRlZmluZSB0aGVzZSB0aHJvdWdob3V0IGl0cyBkZWZpbml0aW9uLiAgUm9sZSBEZXNjcmlwdG9ycywgUmVzb3VyY2UgRGVmaW5pdGlvbnMsIGFzIHdlbGwgYXMgVGVhbSBQcm9maWxlcyBwcm92aWRlIHRoZSBkYXRhIHN0cnVjdHVyZSBuZWNlc3NhcnkgdG8gYWNoaWV2ZSB0aGlzIGZsZXhpYmlsaXR5IGFuZCB0byBwcm92aWRlIGEgcHJvY2VzcyB1c2VyIHdpdGggdGhlIGNhcGFiaWxpdHkgdG8gZGVmaW5lIGRpZmZlcmVudCB0ZWFtcyBhbmQgcm9sZSByZWxhdGlvbnNoaXBzIGZvciBldmVyeSBBY3Rpdml0eSAoaW5jbHVkaW5nIEFjdGl2aXRpZXMgb24gYW55IG5lc3RpbmctbGV2ZWwgYXMgd2VsbCBhcyBJdGVyYXRpb25zIG9yIFBoYXNlcykuDQotSGVuY2UsIGluIGFkZGl0aW9uIHRvIHRoZSB3b3JrIGJyZWFrZG93biBhbmQgd29yayBwcm9kdWN0IGJyZWFrZG93biBzdHJ1Y3R1cmVzIGRlZmluZWQgc28gZmFyLCBUZWFtIFByb2ZpbGVzIGFyZSB1c2VkIHRvIGRlZmluZSBhIHRoaXJkIHR5cGUgb2YgYnJlYWtkb3duIHN0cnVjdHVyZTogdGVhbSBicmVha2Rvd24gc3RydWN0dXJlcy4gIFRoZXNlIGFyZSBjcmVhdGVkIGFzIGFuIEFjdGl2aXR5IHNwZWNpZmljIGhpZXJhcmNoeSBvZiBUZWFtIFByb2ZpbGVzIGNvbXByaXNpbmcgb2YgUm9sZSBEZXNjcmlwdG9ycyBhbmQgUmVzb3VyY2UgRGVmaW5pdGlvbnMuICBUaGVzZSBzdHJ1Y3R1cmVzIGNhbiBiZSBwcmVzZW50ZWQgYXMgd2VsbC1rbm93biBPcmctQ2hhcnRzLiAgSnVzdCBhcyB3aXRoIGFueSBvdGhlciBCcmVha2Rvd24gRWxlbWVudCBhbmQgRGVzY3JpcHRvcnMsIFRlYW0gUHJvZmlsZXMgY2FuIGJlIGRlZmluZWQgd2l0aGluIHRoZSBzY29wZSBvZiBhbnkgQWN0aXZpdHkgaW4gYSBicmVha2Rvd24gc3RydWN0dXJlLiAgSW4gb3RoZXIgd29yZHMgZXZlcnkgQWN0aXZpdHkgY2FuIGRlZmluZSBpdHMgb3duIFRlYW0gUHJvZmlsZXMgY29uc2lzdGluZyBvZiBBY3Rpdml0eSBzcGVjaWZpYyBSb2xlIERlc2NyaXB0b3JzIGFuZCBSZXNvdXJjZSBEZWZpbml0aW9ucy4gIFR5cGljYWxseSwgVGVhbSBQcm9maWxlcyBhcmUgZGVmaW5lZCBvbiB0aGUgbGV2ZWwgb2YgSXRlcmF0aW9ucyBvciBQaGFzZXMgb3Igb3RoZXIgaGlnaGVyLWxldmVsIEFjdGl2aXR5Lg0KLTwvYm9keT4NCi0gICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfdEtsSE5TWDVFZDJLbkoyeWpOWGhXUSIgZ2VuZXJhbD0iX3RLbEhXeVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfdEtsSE5pWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0idGVhbVJvbGVzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il90S2xIZmlYNUVkMktuSjJ5ak5YaFdRIiBhc3NvY2lhdGlvbj0iX3RLdVJLQ1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfdEtsSE55WDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IioiLz4NCi0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3RLbEhPQ1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il90S2xIT1NYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJzdXBlclRlYW0iIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3RLbEhNeVg1RWQyS25KMnlqTlhoV1EiIGFzc29jaWF0aW9uPSJfdEt1UkxTWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il90S2xIT2lYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iMSIvPg0KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfdEtsSE95WDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IjEiLz4NCi0gICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il90S2xIUENYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJzdWJUZWFtIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il90S2xITXlYNUVkMktuSjJ5ak5YaFdRIiBhc3NvY2lhdGlvbj0iX3RLdVJMU1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfdEtsSFBTWDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IioiLz4NCi0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3RLbEhQaVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkVudW1lcmF0aW9uIiB4bWk6aWQ9Il90S2xIUHlYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJXb3JrT3JkZXJUeXBlIj4NCi0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3RLbEhRQ1g1RWQyS25KMnlqTlhoV1EiIGFubm90YXRlZEVsZW1lbnQ9Il90S2xIUHlYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDxib2R5PldvcmsgT3JkZXIgcmVwcmVzZW50cyBhIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHR3byBCcmVha2Rvd24gRWxlbWVudCBpbiB3aGljaCBvbmUgQnJlYWtkb3duIEVsZW1lbnQgKHJlZmVycmVkIHRvIGFzIChCKSBiZWxvdykgZGVwZW5kcyBvbiB0aGUgc3RhcnQgb3IgZmluaXNoIG9mIGFub3RoZXIgQnJlYWtkb3duIEVsZW1lbnQgKHJlZmVycmVkIHRvIGFzIChBKSBiZWxvdykgaW4gb3JkZXIgdG8gYmVnaW4gb3IgZW5kLiBUaGlzIGVudW1lcmF0aW9uIGRlZmluZXMgdGhlIGRpZmZlcmVudCB0eXBlcyBvZiBXb3JrIE9yZGVyIHJlbGF0aW9uc2hpcHMgYXZhaWxhYmxlIGluIFVNQSBhbmQgaXMgdXNlZCB0byBwcm92aWRlIHZhbHVlcyBmb3IgV29yayBPcmRlcidzIGxpbmtUeXBlIGF0dHJpYnV0ZS48L2JvZHk+DQotICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgPG93bmVkTGl0ZXJhbCB4bWk6aWQ9Il90S2xIUVNYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJmaW5pc2hUb1N0YXJ0Ij4NCi0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfdEtsSFFpWDVFZDJLbkoyeWpOWGhXUSIgYW5ub3RhdGVkRWxlbWVudD0iX3RLbEhRU1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgICA8Ym9keT5CcmVha2Rvd24gRWxlbWVudCAoQikgY2Fubm90IHN0YXJ0IHVudGlsIEJyZWFrZG93biBFbGVtZW50IChBKSBmaW5pc2hlcy4gRm9yIGV4YW1wbGUsIGlmIHlvdSBoYXZlIHR3byBCcmVha2Rvd24gRWxlbWVudHMsICZxdW90O0NvbnN0cnVjdCBmZW5jZSZxdW90OyBhbmQgJnF1b3Q7UGFpbnQgZmVuY2UsJnF1b3Q7ICZxdW90O1BhaW50IGZlbmNlJnF1b3Q7IGNhbid0IHN0YXJ0IHVudGlsICZxdW90O0NvbnN0cnVjdCBmZW5jZSZxdW90OyBmaW5pc2hlcy4gVGhpcyBpcyB0aGUgbW9zdCBjb21tb24gdHlwZSBvZiBkZXBlbmRlbmN5IGFuZCB0aGUgZGVmYXVsdCBmb3IgYSBuZXcgV29yayBPcmRlciBpbnN0YW5jZS4NCi08L2JvZHk+DQotICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICA8L293bmVkTGl0ZXJhbD4NCi0gICAgICA8b3duZWRMaXRlcmFsIHhtaTppZD0iX3RLbEhReVg1RWQyS25KMnlqTlhoV1EiIG5hbWU9ImZpbmlzaFRvRmluaXNoIj4NCi0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfdEtsSFJDWDVFZDJLbkoyeWpOWGhXUSIgYW5ub3RhdGVkRWxlbWVudD0iX3RLbEhReVg1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgICA8Ym9keT5CcmVha2Rvd24gRWxlbWVudCAoQikgY2Fubm90IGZpbmlzaCB1bnRpbCBCcmVha2Rvd24gRWxlbWVudCAoQSkgZmluaXNoZXMuIEZvciBleGFtcGxlLCBpZiB5b3UgaGF2ZSB0d28gQnJlYWtkb3duIEVsZW1lbnRzLCAmcXVvdDtBZGQgd2lyaW5nJnF1b3Q7IGFuZCAmcXVvdDtJbnNwZWN0IGVsZWN0cmljYWwsJnF1b3Q7ICZxdW90O0luc3BlY3QgZWxlY3RyaWNhbCZxdW90OyBjYW4ndCBmaW5pc2ggdW50aWwgJnF1b3Q7QWRkIHdpcmluZyZxdW90OyBmaW5pc2hlcy4NCi08L2JvZHk+DQotICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICA8L293bmVkTGl0ZXJhbD4NCi0gICAgICA8b3duZWRMaXRlcmFsIHhtaTppZD0iX3RLbEhSU1g1RWQyS25KMnlqTlhoV1EiIG5hbWU9InN0YXJ0VG9TdGFydCI+DQotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3RLbEhSaVg1RWQyS25KMnlqTlhoV1EiIGFubm90YXRlZEVsZW1lbnQ9Il90S2xIUlNYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgICAgPGJvZHk+QnJlYWtkb3duIEVsZW1lbnQgKEIpIGNhbm5vdCBzdGFydCB1bnRpbCBCcmVha2Rvd24gRWxlbWVudCAoQSkgc3RhcnRzLiBGb3IgZXhhbXBsZSwgaWYgeW91IGhhdmUgdHdvIEJyZWFrZG93biBFbGVtZW50cywgJnF1b3Q7UG91ciBmb3VuZGF0aW9uJnF1b3Q7IGFuZCAmcXVvdDtMZXZlbCBjb25jcmV0ZSwmcXVvdDsgJnF1b3Q7TGV2ZWwgY29uY3JldGUmcXVvdDsgY2FuJ3QgYmVnaW4gdW50aWwgJnF1b3Q7UG91ciBmb3VuZGF0aW9uJnF1b3Q7IGJlZ2lucy4NCi08L2JvZHk+DQotICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICA8L293bmVkTGl0ZXJhbD4NCi0gICAgICA8b3duZWRMaXRlcmFsIHhtaTppZD0iX3RLbEhSeVg1RWQyS25KMnlqTlhoV1EiIG5hbWU9InN0YXJ0VG9GaW5pc2giPg0KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il90S2xIU0NYNUVkMktuSjJ5ak5YaFdRIiBhbm5vdGF0ZWRFbGVtZW50PSJfdEtsSFJ5WDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICAgIDxib2R5PkJyZWFrZG93biBFbGVtZW50IChCKSBjYW5ub3QgZmluaXNoIHVudGlsIEJyZWFrZG93biBFbGVtZW50IChBKSBzdGFydHMuIFRoaXMgZGVwZW5kZW5jeSB0eXBlIGNhbiBiZSB1c2VkIGZvciBqdXN0LWluLXRpbWUgc2NoZWR1bGluZyB1cCB0byBhIG1pbGVzdG9uZSBvciB0aGUgcHJvamVjdCBmaW5pc2ggZGF0ZSB0byBtaW5pbWl6ZSB0aGUgcmlzayBvZiBhIEJyZWFrZG93biBFbGVtZW50IGZpbmlzaGluZyBsYXRlIGlmIGl0cyBkZXBlbmRlbnQgQnJlYWtkb3duIEVsZW1lbnRzIHNsaXAuIElmIGEgcmVsYXRlZCBCcmVha2Rvd24gRWxlbWVudCBuZWVkcyB0byBmaW5pc2ggYmVmb3JlIHRoZSBtaWxlc3RvbmUgb3IgcHJvamVjdCBmaW5pc2ggZGF0ZSwgYnV0IGl0IGRvZXNuJ3QgbWF0dGVyIGV4YWN0bHkgd2hlbiBhbmQgeW91IGRvbid0IHdhbnQgYSBsYXRlIGZpbmlzaCB0byBhZmZlY3QgdGhlIGp1c3QtaW4tdGltZSBCcmVha2Rvd24gRWxlbWVudCwgeW91IGNhbiBjcmVhdGUgYW4gU0YgZGVwZW5kZW5jeSBiZXR3ZWVuIHRoZSBCcmVha2Rvd24gRWxlbWVudCB5b3Ugd2FudCBzY2hlZHVsZWQganVzdCBpbiB0aW1lICh0aGUgcHJlZGVjZXNzb3IpIGFuZCBpdHMgcmVsYXRlZCBCcmVha2Rvd24gRWxlbWVudCAodGhlIHN1Y2Nlc3NvcikuIFRoZW4gaWYgeW91IHVwZGF0ZSBwcm9ncmVzcyBvbiB0aGUgc3VjY2Vzc29yIEJyZWFrZG93biBFbGVtZW50LCBpdCB3b24ndCBhZmZlY3QgdGhlIHNjaGVkdWxlZCBkYXRlcyBvZiB0aGUgcHJlZGVjZXNzb3IgQnJlYWtkb3duIEVsZW1lbnQuPC9ib2R5Pg0KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgPC9vd25lZExpdGVyYWw+DQotICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3RLbEhTU1g1RWQyS25KMnlqTlhoV1EiIG5hbWU9IldvcmtPcmRlciI+DQotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il90S2xIU2lYNUVkMktuSjJ5ak5YaFdRIiBhbm5vdGF0ZWRFbGVtZW50PSJfdEtsSFNTWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8Ym9keT5Xb3JrIE9yZGVyIGlzIGEgTWV0aG9kIEVsZW1lbnQgdGhhdCByZXByZXNlbnRzIGEgcmVsYXRpb25zaGlwIGJldHdlZW4gdHdvIEJyZWFrZG93biBFbGVtZW50cyBpbiB3aGljaCBvbmUgQnJlYWtkb3duIEVsZW1lbnRzIGRlcGVuZHMgb24gdGhlIHN0YXJ0IG9yIGZpbmlzaCBvZiBhbm90aGVyIEJyZWFrZG93biBFbGVtZW50cyBpbiBvcmRlciB0byBiZWdpbiBvciBlbmQuICANCi0oTm90ZSwgV29yayBPcmRlciBpcyBub3QgbW9kZWxlZCBhcyBhbiBBc3NvY2lhdGlvbiBDbGFzcyB0byBwcm92aWRlIGEgc3RyYWlnaHRmb3J3YXJkIG1hcHBpbmcgIHRvIFhNSSBhbmQgRU1GLikNCi1UaGUgV29yayBPcmRlciBjbGFzcyBkZWZpbmVzIHByZWRlY2Vzc29yIGFuZCBzdWNjZXNzb3IgcmVsYXRpb25zIGFtb25nc3QgQnJlYWtkb3duIEVsZW1lbnRzLiAgVGhpcyBpbmZvcm1hdGlvbiBpcyBpbiBwYXJ0aWN1bGFyIGNyaXRpY2FsIGZvciBwbGFubmluZyBhcHBsaWNhdGlvbnMuICBTZWUgbW9yZSBkZXRhaWxzIG9uIGRpZmZlcmVudCB0eXBlcyBvZiBXb3JrIE9yZGVyIHJlbGF0aW9uc2hpcHMgYXQgV29yayBPcmRlciBUeXBlLg0KLTwvYm9keT4NCi0gICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfdEtsSFN5WDVFZDJLbkoyeWpOWGhXUSIgZ2VuZXJhbD0iX3RLdVJKU1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfdEtsSFRDWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0ibGlua1R5cGUiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3RLbEhQeVg1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il90S2xIVFNYNUVkMktuSjJ5ak5YaFdRIiBhbm5vdGF0ZWRFbGVtZW50PSJfdEtsSFRDWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICAgIDxib2R5PlRoaXMgYXR0cmlidXRlIGV4cHJlc3NlcyB0aGUgdHlwZSBvZiB0aGUgV29yayBPcmRlciByZWxhdGlvbnNoaXAgYnkgYXNzaWduaW5nIGEgdmFsdWUgZnJvbSB0aGUgV29yayBPcmRlciBUeXBlIGVudW1lcmF0aW9uLjwvYm9keT4NCi0gICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iX3RLbEhUaVg1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgICA8Ym9keT5maW5pc2hUb1N0YXJ0PC9ib2R5Pg0KLSAgICAgICAgPC9kZWZhdWx0VmFsdWU+DQotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfdEtsSFR5WDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0icHJlZCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdEt1UkZpWDVFZDJLbkoyeWpOWGhXUSIgYXNzb2NpYXRpb249Il90TEJ6S0NYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3RLbEhVQ1g1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIxIi8+DQotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il90S2xIVVNYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iMSIvPg0KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3RLbEhVaVg1RWQyS25KMnlqTlhoV1EiIG5hbWU9IlBsYW5uaW5nRGF0YSI+DQotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il90S2xIVXlYNUVkMktuSjJ5ak5YaFdRIiBhbm5vdGF0ZWRFbGVtZW50PSJfdEtsSFVpWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8Ym9keT5QbGFubmluZyBEYXRhIGlzIGEgTWV0aG9kIEVsZW1lbnQgdGhhdCBhZGRzIHBsYW5uaW5nIGRhdGEgdG8gQnJlYWtkb3duIEVsZW1lbnRzIHdoZW4gaXQgaXMgdXNlZCBmb3IgYSBQcm9jZXNzIFBsYW5uaW5nIFRlbXBsYXRlLiAgRm9yIERlbGl2ZXJ5IFByb2Nlc3NlcyBhbmQgQ2FwYWJpbGl0eSBQYXR0ZXJucyB0aGlzIGNsYXNzIGNhbiBlaXRoZXIgbm90IGJlIGluc3RhbnRpYXRlZCBvciBwb3B1bGF0ZWQgd2l0aCBkZWZhdWx0IGRhdGEuDQotUGxhbm5pbmcgRGF0YSBmYWN0b3JzIG91dCBzcGVjaWZpYyBvcHRpb25hbCBkYXRhIG5lZWRlZCBmb3IgcmVwcmVzZW50aW5nIHBsYW5uaW5nIHRlbXBsYXRlcy4gIFRoaXMgYXNzb2NpYXRpb24gYWxsb3dzIHRvIGFjY2VzcyBwbGFubmluZyBkYXRhIGlmIGl0IGlzIHN0b3JlZCBmb3IgdGhlIEJyZWFrZG93biBFbGVtZW50Lg0KLShOT1RFLCBUSEUgQVRUUklCVVRFUyBGT1IgVEhJUyBDTEFTUyBBUkUgTk9UIENPTVBMRVRFLCBZRVQpDQotPC9ib2R5Pg0KLSAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il90S2xIVkNYNUVkMktuSjJ5ak5YaFdRIiBnZW5lcmFsPSJfdEt1UkpTWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il90S2xIVlNYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJzdGFydERhdGUiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3RCZmNzQ1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il90S2xIVmlYNUVkMktuSjJ5ak5YaFdRIiBhbm5vdGF0ZWRFbGVtZW50PSJfdEtsSFZTWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICAgIDxib2R5PlRoZSBkZWZhdWx0IHN0YXJ0IGRhdGUgZm9yIGEgcGxhbmVkIFRhc2suPC9ib2R5Pg0KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfdEtsSFZ5WDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iZmluaXNoRGF0ZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdEJmY3NDWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3RLbEhXQ1g1RWQyS25KMnlqTlhoV1EiIGFubm90YXRlZEVsZW1lbnQ9Il90S2xIVnlYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgICAgPGJvZHk+VGhlIGRlZmF1bHQgZmluaXNoIGRhdGUgZm9yIGEgcGxhbmVkIFRhc2suPC9ib2R5Pg0KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfdEtsSFdTWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0icmFuayIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdEJvbWdTWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3RLbEhXaVg1RWQyS25KMnlqTlhoV1EiIGFubm90YXRlZEVsZW1lbnQ9Il90S2xIV1NYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgICAgPGJvZHk+VGhlIGRlZmF1bHQgcmFuayBmb3IgYSBwbGFuZWQgVGFzay48L2JvZHk+DQotICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il90S2xIZVNYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJEZXNjcmlwdG9yIiBpc0Fic3RyYWN0PSJ0cnVlIj4NCi0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3RLbEhlaVg1RWQyS25KMnlqTlhoV1EiIGFubm90YXRlZEVsZW1lbnQ9Il90S2xIZVNYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDxib2R5PkEgRGVzY3JpcHRvciBpcyBhbiBhYnN0cmFjdCBnZW5lcmFsaXphdGlvbiBmb3Igc3BlY2lhbCBCcmVha2Rvd24gRWxlbWVudHMgdGhhdCByZWZlcmVuY2VzIG9uZSBjb25jcmV0ZSBDb250ZW50IEVsZW1lbnQuICBBIGRlc2NyaXB0b3IgcHJvdmlkZXMgYSByZXByZXNlbnRhdGlvbiBvZiBhIENvbnRlbnQgRWxlbWVudCB3aXRoaW4gYnJlYWtkb3duIHN0cnVjdHVyZXMuICBJbiBhZGRpdGlvbiB0byBqdXN0IHJlZmVyZW5jaW5nIENvbnRlbnQgRWxlbWVudHMgaXQgYWxsb3dzIG92ZXJyaWRpbmcgdGhlIENvbnRlbnQgRWxlbWVudHMgc3RydWN0dXJhbCByZWxhdGlvbnNoaXBzIGJ5IGRlZmluaW5nIGl0cyBvd24gc2V0cyBvZiBhc3NvY2lhdGlvbnMuDQotRGVzY3JpcHRvcnMgYXJlIHRoZSBrZXkgY29uY2VwdCBmb3IgcmVhbGl6aW5nIHRoZSBzZXBhcmF0aW9uIG9mIHByb2Nlc3NlcyBmcm9tIG1ldGhvZCBjb250ZW50LiAgQSBEZXNjcmlwdG9yIGNhbiBiZSBjaGFyYWN0ZXJpemVkIGFzIGEgcmVmZXJlbmNlIG9iamVjdCBmb3Igb25lIHBhcnRpY3VsYXIgQ29udGVudCBFbGVtZW50LCB3aGljaCBoYXMgaXRzIG93biByZWxhdGlvbnNoaXBzIGFuZCBwcm9wZXJ0aWVzLiAgV2hlbiBhIERlc2NyaXB0b3IgaXMgY3JlYXRlZCBpdCBzaGFsbCBiZSBwcm92aWRlZCB3aXRoIGNvbmdydWVudCBjb3BpZXMgb2YgdGhlIHJlbGF0aW9uc2hpcHMgZGVmaW5lZCBmb3IgdGhlIHJlZmVyZW5jZWQgY29udGVudCBlbGVtZW50LiAgSG93ZXZlciwgYSB1c2VyIGNhbiBtb2RpZnkgdGhlc2UgcmVsYXRpb25zaGlwcyBmb3IgdGhlIHBhcnRpY3VsYXIgcHJvY2VzcyBzaXR1YXRpb24gZm9yIHdoaWNoIHRoZSBkZXNjcmlwdG9yIGhhcyBiZWVuIGNyZWF0ZWQuIA0KLTwvYm9keT4NCi0gICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfdEtsSGV5WDVFZDJLbkoyeWpOWGhXUSIgZ2VuZXJhbD0iX3RLbEhXeVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfdEtsSGZDWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il90Qm9tZ3lYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9Il90S2xIZlNYNUVkMktuSjJ5ak5YaFdRIiB0eXBlPSJfdEJvbWd5WDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICAgIDxib2R5PnRydWU8L2JvZHk+DQotICAgICAgICA8L2RlZmF1bHRWYWx1ZT4NCi0gICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il90S2xIZmlYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJSb2xlRGVzY3JpcHRvciI+DQotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il90S2xIZnlYNUVkMktuSjJ5ak5YaFdRIiBhbm5vdGF0ZWRFbGVtZW50PSJfdEtsSGZpWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8Ym9keT5BIFJvbGUgRGVzY3JpcHRvciByZXByZXNlbnRzIGEgUm9sZSBpbiB0aGUgY29udGV4dCBvZiBvbmUgc3BlY2lmaWMgQWN0aXZpdHkuICBFdmVyeSBicmVha2Rvd24gc3RydWN0dXJlIGNhbiBkZWZpbmUgZGlmZmVyZW50IHJlbGF0aW9uc2hpcHMgb2YgUm9sZSBEZXNjcmlwdG9ycyB0byBUYXNrIERlc2NyaXB0b3JzIGFuZCBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvcnMuICBUaGVyZWZvcmUgb25lIFJvbGUgY2FuIGJlIHJlcHJlc2VudGVkIGJ5IG1hbnkgUm9sZSBEZXNjcmlwdG9ycyBlYWNoIHdpdGhpbiB0aGUgY29udGV4dCBvZiBhbiBBY3Rpdml0eSB3aXRoIGl0cyBvd24gc2V0IG9mIHJlbGF0aW9uc2hpcHMuPC9ib2R5Pg0KLSAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il90S2xIZ0NYNUVkMktuSjJ5ak5YaFdRIiBnZW5lcmFsPSJfdEtsSGVTWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il90S2xIZ1NYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJSb2xlIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il90REliVVNYNUVkMktuSjJ5ak5YaFdRIiBhc3NvY2lhdGlvbj0iX3RLdVJQaVg1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfdEtsSGdpWDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IjEiLz4NCi0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3RLbEhneVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il90S2xIaENYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJtb2RpZmllcyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdEtsSHFTWDVFZDJLbkoyeWpOWGhXUSIgaXNEZXJpdmVkPSJ0cnVlIiBhc3NvY2lhdGlvbj0iX3RLdVJXU1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfdEtsSGhTWDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IioiLz4NCi0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3RLbEhoaVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il90S2xIaHlYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJyZXNwb25zaWJsZUZvciIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdEtsSHFTWDVFZDJLbkoyeWpOWGhXUSIgYXNzb2NpYXRpb249Il90TEJ6R2lYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3RLbEhpQ1g1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIqIi8+DQotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il90S2xIaVNYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfdEtsSGlpWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iVGFza0Rlc2NyaXB0b3IiPg0KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfdEtsSGl5WDVFZDJLbkoyeWpOWGhXUSIgYW5ub3RhdGVkRWxlbWVudD0iX3RLbEhpaVg1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPGJvZHk+QSBUYXNrIERlc2NyaXB0b3IgaXMgYSBEZXNjcmlwdG9yIGFuZCBXb3JrIEJyZWFrZG93biBFbGVtZW50IHRoYXQgcmVwcmVzZW50cyBhIHByb3h5IGZvciBhIFRhc2sgaW4gdGhlIGNvbnRleHQgb2Ygb25lIHNwZWNpZmljIEFjdGl2aXR5LiAgRXZlcnkgYnJlYWtkb3duIHN0cnVjdHVyZSBjYW4gZGVmaW5lIGRpZmZlcmVudCByZWxhdGlvbnNoaXBzIG9mIFRhc2sgRGVzY3JpcHRvcnMgdG8gV29yayBQcm9kdWN0IERlc2NyaXB0b3JzIGFuZCBSb2xlIERlc2NyaXB0b3JzLiBUaGVyZWZvcmUgb25lIFRhc2sgY2FuIGJlIHJlcHJlc2VudGVkIGJ5IG1hbnkgVGFzayBEZXNjcmlwdG9ycyBlYWNoIHdpdGhpbiB0aGUgY29udGV4dCBvZiBhbiBBY3Rpdml0eSB3aXRoIGl0cyBvd24gc2V0IG9mIHJlbGF0aW9uc2hpcHMuDQotQSBrZXkgZGlmZmVyZW5jZSBiZXR3ZWVuIE1ldGhvZCBDb250ZW50IGFuZCBQcm9jZXNzIGlzIHRoYXQgYSBDb250ZW50IEVsZW1lbnQgc3VjaCBhcyBUYXNrIGRlc2NyaWJlcyBhbGwgYXNwZWN0cyBvZiBkb2luZyB3b3JrIGRlZmluZWQgYXJvdW5kIHRoaXMgVGFzay4gIFRoaXMgZGVzY3JpcHRpb24gaXMgbWFuYWdlZCBpbiBzdGVwcywgd2hpY2ggYXJlIG1vZGVsZWQgYXMgU2VjdGlvbnMgb2YgdGhlIFRhc2tzJyBDb250ZW50IERlc2NyaXB0aW9ucy4gIFdoZW4gYXBwbHlpbmcgYSBUYXNrIGluIGEgUHJvY2VzcycgQWN0aXZpdHkgd2l0aCBhIFRhc2sgRGVzY3JpcHRvciBhIFByb2Nlc3MgRW5naW5lZXIgbmVlZHMgdG8gaW5kaWNhdGUgdGhhdCBhdCB0aGF0IHBhcnRpY3VsYXIgcG9pbnQgaW4gdGltZSBpbiB0aGUgUHJvY2VzcyBkZWZpbml0aW9uIGZvciB3aGljaCB0aGUgVGFzayBEZXNjcmlwdG9yIGhhcyBiZWVuIGNyZWF0ZWQsIG9ubHkgYSBzdWJzZXQgb2Ygc3RlcHMgc2hhbGwgYmUgcGVyZm9ybWVkLiAgSGUgZGVmaW5lcyB0aGlzIHNlbGVjdGlvbiB1c2luZyB0aGUgc2VsZWN0ZWRTdGVwcyBhc3NvY2lhdGlvbi4gIElmIGhlIHdhbnRzIHRvIGFkZCBzdGVwcyB0byBhIFRhc2sgRGVzY3JpcHRvciwgaGUgY2FuIGRlc2NyaWJlIHRoZXNlIGVpdGhlciBwcmFnbWF0aWNhbGx5IGluIHRoZSByZWZpbmVkRGVzY3JpcHRpb24gYXR0cmlidXRlIG9yICdwcm9wZXJseScgY3JlYXRlIGEgY29udHJpYnV0aW5nIFRhc2sgdG8gdGhlIFRhc2sgdGhlIFRhc2sgRGVzY3JpcHRvciByZWZlcnMgdG8uDQotDQotPC9ib2R5Pg0KLSAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il90S2xIakNYNUVkMktuSjJ5ak5YaFdRIiBnZW5lcmFsPSJfdEtsSGVTWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il90S2xIalNYNUVkMktuSjJ5ak5YaFdRIiBnZW5lcmFsPSJfdEt1UkZpWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il90S2xIamlYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJUYXNrIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il90REliV2lYNUVkMktuSjJ5ak5YaFdRIiBhc3NvY2lhdGlvbj0iX3RLdVJOQ1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfdEtsSGp5WDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IjEiLz4NCi0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3RLbEhrQ1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il90S2xIa1NYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJhZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdEtsSGZpWDVFZDJLbkoyeWpOWGhXUSIgYXNzb2NpYXRpb249Il90S3VSUXlYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3RLbEhraVg1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIqIi8+DQotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il90S2xIa3lYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfdEtsSGxDWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iYXNzaXN0ZWRCeSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdEtsSGZpWDVFZDJLbkoyeWpOWGhXUSIgYXNzb2NpYXRpb249Il90S3VSU0NYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3RLbEhsU1g1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIqIi8+DQotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il90S2xIbGlYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfdEtsSGx5WDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iZXh0ZXJuYWxJbnB1dCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdEtsSHFTWDVFZDJLbkoyeWpOWGhXUSIgYXNzb2NpYXRpb249Il90S3VSVFNYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3RLbEhtQ1g1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIqIi8+DQotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il90S2xIbVNYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfdEtsSG1pWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0ibWFuZGF0b3J5SW5wdXQiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3RLbEhxU1g1RWQyS25KMnlqTlhoV1EiIGFzc29jaWF0aW9uPSJfdEt1UlZDWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il90S2xIbXlYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfdEtsSG5DWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3RLbEhuU1g1RWQyS25KMnlqTlhoV1EiIG5hbWU9Im9wdGlvbmFsSW5wdXQiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3RLbEhxU1g1RWQyS25KMnlqTlhoV1EiIGFzc29jaWF0aW9uPSJfdEt1UlhpWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il90S2xIbmlYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfdEtsSG55WDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3RLbEhvQ1g1RWQyS25KMnlqTlhoV1EiIG5hbWU9Im91dHB1dCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdEtsSHFTWDVFZDJLbkoyeWpOWGhXUSIgYXNzb2NpYXRpb249Il90S3VSWXlYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3RLbEhvU1g1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIqIi8+DQotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il90S2xIb2lYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfdEtsSG95WDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0icGVyZm9ybWVkUHJpbWFyaWx5QnkiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3RLbEhmaVg1RWQyS25KMnlqTlhoV1EiIGFzc29jaWF0aW9uPSJfdExCekZTWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il90S2xIcENYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfdEtsSHBTWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3RLbEhwaVg1RWQyS25KMnlqTlhoV1EiIG5hbWU9InNlbGVjdGVkU3RlcHMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3RDRlNjQ1g1RWQyS25KMnlqTlhoV1EiIGFzc29jaWF0aW9uPSJfdFExZ1V5WDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il90S2xIcHlYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfdEtsSHFDWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3RLbEhxU1g1RWQyS25KMnlqTlhoV1EiIG5hbWU9IldvcmtQcm9kdWN0RGVzY3JpcHRvciI+DQotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il90S2xIcWlYNUVkMktuSjJ5ak5YaFdRIiBhbm5vdGF0ZWRFbGVtZW50PSJfdEtsSHFTWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8Ym9keT5BIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9yIHJlcHJlc2VudHMgYSBXb3JrIFByb2R1Y3QgaW4gdGhlIGNvbnRleHQgb2Ygb25lIHNwZWNpZmljIEFjdGl2aXR5LiAgRXZlcnkgYnJlYWtkb3duIHN0cnVjdHVyZSBjYW4gZGVmaW5lIGRpZmZlcmVudCByZWxhdGlvbnNoaXBzIG9mIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9ycyB0byBUYXNrIERlc2NyaXB0b3JzIGFuZCBSb2xlIERlc2NyaXB0b3JzLiAgVGhlcmVmb3JlIG9uZSBXb3JrIFByb2R1Y3QgY2FuIGJlIHJlcHJlc2VudGVkIGJ5IG1hbnkgV29yayBQcm9kdWN0IERlc2NyaXB0b3JzIGVhY2ggd2l0aGluIHRoZSBjb250ZXh0IG9mIGFuIEFjdGl2aXR5IHdpdGggaXRzIG93biBzZXQgb2YgcmVsYXRpb25zaGlwcy48L2JvZHk+DQotICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3RLbEhxeVg1RWQyS25KMnlqTlhoV1EiIGdlbmVyYWw9Il90S2xIZVNYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3RLbEhyQ1g1RWQyS25KMnlqTlhoV1EiIG5hbWU9ImFjdGl2aXR5RW50cnlTdGF0ZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdEJmY3RDWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3RLbEhyU1g1RWQyS25KMnlqTlhoV1EiIGFubm90YXRlZEVsZW1lbnQ9Il90S2xIckNYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgICAgPGJvZHk+R2l2ZW4gdGhhdCBhbiBpbnN0YW5jZSBvZiBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvciBoYXMgYmVlbiBjcmVhdGVkIGZvciBhIHNwZWNpZmljIEFjdGl2aXR5LCB0aGVuIHRoZSBBY3Rpdml0eSBFbnRyeSBTdGF0ZSBhdHRyaWJ1dGUgc3BlY2lmaWVzIHRoZSBkZXNpcmVkIHN0YXRlIG9mIGluc3RhbmNlcyBvZiB0aGUgcmVmZXJlbmNlZCBXb3JrIFByb2R1Y3Qgd2hlbiB3b3JrIG9uIHRoZSBBY3Rpdml0eSBpcyBpbml0aWF0ZWQgKGkuZS4gd29yayBvbiB0aGUgQWN0aXZpdHkncyBUYXNrIERlc2NyaXB0b3JzIGlzIGJlaW5nIGluaXRpYXRlZCB0aGF0IHVzZSB0aGlzIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9yIGFzIGlucHV0KS4gIA0KLUZvciBzb21lIFdvcmsgUHJvZHVjdHMgc3RhdGUgaXMgZXhwcmVzc2VkIGluIHBlcmNlbnRhZ2Ugb2YgY29tcGxldGlvbiwgY29tcGxpYW5jZSB0byB3b3JrIHByb2R1Y3QgY2hlY2tsaXN0LCBpbmZvcm1hbCBzdGF0ZSBkZXNjcmlwdGlvbnMsIGV0Yy4gIE90aGVycyBoYXZlIHZlcnkgc3BlY2lmaWMgc3RhdGVzIGV4cHJlc3NlZCBhcyBlbnVtZXJhdGlvbnMgc3VjaCBhcyBbaWRlbnRpZmllZCwgYnJpZWZseSBkZXNjcmliZWQsIG91dGxpbmVkLCBkZXRhaWxlZF0gZm9yIHVzZSBjYXNlcy4gIE90aGVyIFdvcmsgUHJvZHVjdCBzdGF0ZXMgcmVsYXRlIHRvIHNvbWUgcXVhbGl0eSBtZWFzdXJlcyBvciBsaWZlY3ljbGUgc3RhdGVzIHN1Y2ggYXMgW3Jldmlld2VkLCBpbXBsZW1lbnRlZCwgdGVzdGVkXS4NCi08L2JvZHk+DQotICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3RLbEhyaVg1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIxIi8+DQotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il90S2xIcnlYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfdEtsSHNDWDVFZDJLbkoyeWpOWGhXUSIgdHlwZT0iX3RCZmN0Q1g1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIiLz4NCi0gICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il90S2xIc1NYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJhY3Rpdml0eUV4aXRTdGF0ZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdEJmY3RDWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3RLbEhzaVg1RWQyS25KMnlqTlhoV1EiIGFubm90YXRlZEVsZW1lbnQ9Il90S2xIc1NYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgICAgPGJvZHk+R2l2ZW4gdGhhdCBhbiBpbnN0YW5jZSBvZiBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvciBoYXMgYmVlbiBjcmVhdGVkIGZvciBhIHNwZWNpZmljIEFjdGl2aXR5LCB0aGVuIHRoZSBBY3Rpdml0eSBFeGlzdCBTdGF0ZSBhdHRyaWJ1dGUgc3BlY2lmaWVzIHRoZSBkZXNpcmVkIHN0YXRlIG9mIGluc3RhbmNlcyBvZiB0aGUgcmVmZXJlbmNlZCBXb3JrIFByb2R1Y3Qgd2hlbiB3b3JrIG9uIHRoZSBBY3Rpdml0eSBpcyBmaW5pc2hlZCAoaS5lLiB3b3JrIG9uIHRoZSBBY3Rpdml0eSdzIFRhc2sgRGVzY3JpcHRvcnMgaGFzIGZpbmlzaGVkIHRoYXQgaGF2ZSB0aGlzIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9yIGFzIG91dHB1dCkuDQotRm9yIHNvbWUgV29yayBQcm9kdWN0cyBzdGF0ZSBpcyBleHByZXNzZWQgaW4gcGVyY2VudGFnZSBvZiBjb21wbGV0aW9uLCBjb21wbGlhbmNlIHRvIHdvcmsgcHJvZHVjdCBjaGVja2xpc3QsIGluZm9ybWFsIHN0YXRlIGRlc2NyaXB0aW9ucywgZXRjLiAgT3RoZXJzIGhhdmUgdmVyeSBzcGVjaWZpYyBzdGF0ZXMgZXhwcmVzc2VkIGFzIGVudW1lcmF0aW9ucyBzdWNoIGFzIFtpZGVudGlmaWVkLCBicmllZmx5IGRlc2NyaWJlZCwgb3V0bGluZWQsIGRldGFpbGVkXSBmb3IgdXNlIGNhc2VzLiAgT3RoZXIgV29yayBQcm9kdWN0IHN0YXRlcyByZWxhdGUgdG8gc29tZSBxdWFsaXR5IG1lYXN1cmVzIG9yIGxpZmVjeWNsZSBzdGF0ZXMgc3VjaCBhcyBbcmV2aWV3ZWQsIGltcGxlbWVudGVkLCB0ZXN0ZWRdLg0KLTwvYm9keT4NCi0gICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfdEtsSHN5WDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IjEiLz4NCi0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3RLbEh0Q1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il90S2xIdFNYNUVkMktuSjJ5ak5YaFdRIiB0eXBlPSJfdEJmY3RDWDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IiIvPg0KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3RLbEh0aVg1RWQyS25KMnlqTlhoV1EiIG5hbWU9IldvcmtQcm9kdWN0IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il90REliY0NYNUVkMktuSjJ5ak5YaFdRIiBhc3NvY2lhdGlvbj0iX3RLdVJPU1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfdEtsSHR5WDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IjEiLz4NCi0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3RLbEh1Q1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il90S2xIdVNYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJpbXBhY3RlZEJ5IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il90S2xIcVNYNUVkMktuSjJ5ak5YaFdRIiBhc3NvY2lhdGlvbj0iX3RLdVJVaVg1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfdEtsSHVpWDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IioiLz4NCi0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3RLbEh1eVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il90S2xIdkNYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJpbXBhY3RzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il90S2xIcVNYNUVkMktuSjJ5ak5YaFdRIiBhc3NvY2lhdGlvbj0iX3RLdVJVaVg1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfdEtsSHZTWDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IioiLz4NCi0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3RLbEh2aVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il90S2xIdnlYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJkZWxpdmVyYWJsZVBhcnRzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il90S2xIcVNYNUVkMktuSjJ5ak5YaFdRIiBhc3NvY2lhdGlvbj0iX3RMQnpFQ1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfdEtsSHdDWDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IioiLz4NCi0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3RLbEh3U1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il90S3VSRUNYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJDb21wb3NpdGVSb2xlIj4NCi0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3RLdVJFU1g1RWQyS25KMnlqTlhoV1EiIGFubm90YXRlZEVsZW1lbnQ9Il90S3VSRUNYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDxib2R5PkEgQ29tcG9zaXRlIFJvbGUgaXMgYSBzcGVjaWFsIFJvbGUgRGVzY3JpcHRvciB0aGF0IHJlbGF0ZXMgdG8gbW9yZSB0aGVuIG9uZSBSb2xlLiAgSXQgcmVwcmVzZW50cyBhIGdyb3VwaW5nIG9mIFJvbGVzIHdpdGggdGhlIG1haW4gcHVycG9zZSBvZiBzaW1wbGlmaWNhdGlvbiwgaS5lLiByZWR1Y2luZyB0aGUgbnVtYmVyIG9mIHJvbGVzIGZvciBhIHByb2Nlc3MuDQotQSBDb21wb3NpdGUgUm9sZSBpcyBhIGdyb3VwaW5nIG9mIFJvbGVzIHRoYXQgY2FuIGJlIHVzZWQgaW4gYW4gQWN0aXZpdHkgb3IgUHJvY2VzcyB0byByZWR1Y2UgdGhlIG51bWJlciBvZiBSb2xlcy4gIEEgdHlwaWNhbCBhcHBsaWNhdGlvbiB3b3VsZCBiZSBhIHByb2Nlc3MgZm9yIGEgc21hbGwgdGVhbSBpbiB3aGljaCBhIHN0YW5kYXJkIHNldCBvZiByb2xlcyBmcm9tIHRoZSBtZXRob2QgY29udGVudCB3b3VsZCBiZSBhbGwgcGVyZm9ybWVkIGJ5IG9uZSBvciBtb3JlIHJlc291cmNlLiAgQnkgdXNpbmcgQ29tcG9zaXRlIFJvbGUgdGhlIHByb2Nlc3Mgd291bGQgc3VnZ2VzdCBhIHR5cGljYWwgY2x1c3RlcmluZyBvZiBSb2xlcyB0byBSZXNvdXJjZXMuICBBIENvbXBvc2l0ZSBSb2xlIGNvdWxkIHBlcmZvcm0gYWxsIFRhc2tzIGRlZmluZWQgZm9yIHRoZSBSb2xlcyBpdCByZWZlcnMgdG8uDQotPC9ib2R5Pg0KLSAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il90S3VSRWlYNUVkMktuSjJ5ak5YaFdRIiBnZW5lcmFsPSJfdEtsSGZpWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il90S3VSRXlYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJhZ2dyZWdhdGVkUm9sZXMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3RESWJVU1g1RWQyS25KMnlqTlhoV1EiIGFzc29jaWF0aW9uPSJfdExCekh5WDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il90S3VSRkNYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfdEt1UkZTWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3RLdVJGaVg1RWQyS25KMnlqTlhoV1EiIG5hbWU9IldvcmtCcmVha2Rvd25FbGVtZW50IiBpc0Fic3RyYWN0PSJ0cnVlIj4NCi0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3RLdVJGeVg1RWQyS25KMnlqTlhoV1EiIGFubm90YXRlZEVsZW1lbnQ9Il90S3VSRmlYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDxib2R5PkEgV29yayBCcmVha2Rvd24gRWxlbWVudCBpcyBhIHNwZWNpYWwgQnJlYWtkb3duIEVsZW1lbnQgdGhhdCBwcm92aWRlcyBzcGVjaWZpYyBwcm9wZXJ0aWVzIGZvciBCcmVha2Rvd24gRWxlbWVudHMgdGhhdCByZXByZXNlbnQgb3IgcmVmZXIgdG8gV29yayBEZWZpbml0aW9ucy4gIEZvciBleGFtcGxlIGl0cyBzdWJjbGFzcyBBY3Rpdml0eSBkZWZpbmVzIHdvcmsgYXMgaXQgaXMgYWxzbyBhIHN1YmNsYXNzIG9mIFdvcmsgRGVmaW5pdGlvbi4gIEl0cyBzdWJjbGFzcyBUYXNrIERlc2NyaXB0b3IgZG9lcyBub3QgZGVmaW5lIHdvcmsgYnkgaXRzZWxmLCBidXQgcmVmZXJzIHRvIGEgV29yayBEZWZpbml0aW9uIGFuZCB0aGVyZWZvcmUgY2FuIGhhdmUgdGhlIHNhbWUgY29tbW9uIHByb3BlcnRpZXMgYW5kIFdvcmsgQnJlYWtkb3duIEVsZW1lbnQgaGFzLjwvYm9keT4NCi0gICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfdEt1UkdDWDVFZDJLbkoyeWpOWGhXUSIgZ2VuZXJhbD0iX3RLbEhXeVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfdEt1UkdTWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iaXNSZXBlYXRhYmxlIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il90Qm9tZ3lYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfdEt1UkdpWDVFZDJLbkoyeWpOWGhXUSIgYW5ub3RhdGVkRWxlbWVudD0iX3RLdVJHU1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgICA8Ym9keT5UaGlzIGF0dHJpYnV0ZSBpcyB1c2VkIHRvIGRlZmluZSByZXBldGl0aW9uIG9mIHdvcmssIGUuZy4gaXRlcmF0aW9ucy4gIEEgUHJvY2VzcyBXb3JrIERlZmluaXRpb24gd2l0aCB0aGlzIGF0dHJpYnV0ZSBzZXQgdG8gVHJ1ZSBzaGFsbCBiZSByZXBlYXRlZCBtb3JlIHRoYW4gb25jZSBvbiB0aGUgc2FtZSBzZXQgb2YgYXJ0aWZhY3RzLiAgRm9yIGV4YW1wbGUsIGZvciBhbiBpbnN0YW5jZSBvZiBJdGVyYXRpb24gKGRlZmluZWQgYXMgYSBzcGVjaWFsIFByb2Nlc3MgV29yayBEZWZpbml0aW9uIGJlbG93KSB0aGlzIGF0dHJpYnV0ZSBpcyBzZXQgdG8gVHJ1ZSBieSBkZWZhdWx0IGluZGljYXRpbmcgdGhhdCBldmVyeSBzdWItQWN0aXZpdHkgd2lsbCBiZSByZXBlYXRlZCBtb3JlIHRoYW4gb25jZS4gIEhvd2V2ZXIsIGFueSBQcm9jZXNzIFdvcmsgRGVmaW5pdGlvbiBjYW4gc2V0IHRoaXMgYXR0cmlidXRlIHRvIFRydWUgdG8gZGVmaW5lIGl0ZXJhdGlvbnMgKGUuZy4gdG8gaXRlcmF0ZSBvbmUgQWN0aXZpdHkgY29uc2lzdGluZyBvZiBtYW55IHN1Yi1hY3Rpdml0aWVzIG9yIGV2ZW4gUGhhc2VzLCBidXQgdG8gaXRlcmF0ZSBqdXN0IG9uZSBUYXNrKS48L2JvZHk+DQotICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9Il90S3VSR3lYNUVkMktuSjJ5ak5YaFdRIiB0eXBlPSJfdEJvbWd5WDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICAgIDxib2R5PmZhbHNlPC9ib2R5Pg0KLSAgICAgICAgPC9kZWZhdWx0VmFsdWU+DQotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfdEt1UkhDWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iaXNPbmdvaW5nIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il90Qm9tZ3lYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfdEt1UkhTWDVFZDJLbkoyeWpOWGhXUSIgYW5ub3RhdGVkRWxlbWVudD0iX3RLdVJIQ1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgICA8Ym9keT5JZiB0aGUgaXNPbmdvaW5nIGF0dHJpYnV0ZSBpcyBzZXQgdG8gVHJ1ZSBmb3IgYSBQcm9jZXNzIFdvcmsgRGVmaW5pdGlvbiBpbnN0YW5jZSwgdGhlbiB0aGUgZWxlbWVudCBkZXNjcmliZXMgYW4gb25nb2luZyBwaWVjZSBvZiB3b3JrIHdpdGhvdXQgYSBmaXhlZCBkdXJhdGlvbiBvciBlbmQgc3RhdGUuICBGb3IgZXhhbXBsZSwgdGhlIFByb2Nlc3MgV29yayBEZWZpbml0aW9uIGNvdWxkIHJlcHJlc2VudCB3b3JrIG9mIGFuIGFkbWluaXN0cmF0b3IgY29udGludW91c2x5IChlLmcuIDNoIGEgZGF5KSB3b3JraW5nIHRvIGVuc3VyZSB0aGF0IHN5c3RlbXMgYXJlIGtlcHQgaW4gYSBjZXJ0YWluIHN0YXRlLiAgQW5vdGhlciBleGFtcGxlIHdvdWxkIGJlIHByb2dyYW0gbWFuYWdlbWVudCB3b3JrIG92ZXJzZWVpbmcgbWFueSBkaWZmZXJlbnQgcHJvamVjdHMgYmVpbmcgc2NoZWR1bGVkIGZvciBvbmUgcGFydGljdWxhciBwcm9qZWN0IGF0IHNwZWNpZmljIHJlb2NjdXJyaW5nIGludGVydmFscyBkdXJpbmcgdGhlIHdob2xlIGxpZmVjeWNsZSBvZiB0aGUgcHJvamVjdC48L2JvZHk+DQotICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9Il90S3VSSGlYNUVkMktuSjJ5ak5YaFdRIiB0eXBlPSJfdEJvbWd5WDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICAgIDxib2R5PmZhbHNlPC9ib2R5Pg0KLSAgICAgICAgPC9kZWZhdWx0VmFsdWU+DQotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfdEt1Ukh5WDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iaXNFdmVudERyaXZlbiIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdEJvbWd5WDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3RLdVJJQ1g1RWQyS25KMnlqTlhoV1EiIGFubm90YXRlZEVsZW1lbnQ9Il90S3VSSHlYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgICAgPGJvZHk+VGhlIGlzRXZlbnREcml2ZW4gYXR0cmlidXRlIGluZGljYXRlcyB0aGF0IHRoZSBQcm9jZXNzIFdvcmsgRGVmaW5pdGlvbiBkZXNjcmliZXMgYW4gaW5zdGFuY2Ugb2Ygd29yayB3aGljaCBpcyBub3Qgc3RhcnRlZCBiZWNhdXNlIGl0IGhhcyBiZWVuIHNjaGVkdWxlZCB0byBzdGFydCBhdCBhIGNlcnRhaW4gcG9pbnQgb2YgdGltZSwgYmVjYXVzZSBwcmVjZWRpbmcgd29yayBpcyBiZWluZyBjb21wbGV0ZWQsIG9yIGlucHV0IHdvcmsgcHJvZHVjdHMgYXJlIGF2YWlsYWJsZSwgYnV0IGJlY2F1c2UgYW5vdGhlciBzcGVjaWZpYyBldmVudCBoYXMgb2NjdXJyZWQuICBFeGFtcGxlcyBmb3Igc3VjaCBldmVudHMgYXJlIGV4Y2VwdGlvbnMgb3IgcHJvYmxlbSBzaXR1YXRpb25zIHdoaWNoIHJlcXVpcmUgc3BlY2lmaWMgd29yayB0byBiZSBwZXJmb3JtZWQgYXMgYSByZXN1bHQuICBBbHNvIGNoYW5nZSBtYW5hZ2VtZW50IHdvcmsgY2FuIGJlIG1vZGVsZWQgYXMgZXZlbnQgZHJpdmVuIHdvcmsgYW5hbHl6aW5nIGEgY2hhbmdlIHJlcXVlc3Qgb3IgZGVmZWN0IGFuZCBhbGxvY2F0aW5nIHdvcmsgZHluYW1pY2FsbHkgdG8gcmVzb3VyY2VzIHRvIGRlYWwgd2l0aCBpdCBmb2xsb3dpbmcgdGhlIHdvcmsgZGVzY3JpYmVkIHdpdGggc3VjaCBQcm9jZXNzIFdvcmsgRGVmaW5pdGlvbi4gIFRoZSBldmVudHMgdGhlbXNlbHZlcyBhcmUgbm90IG1vZGVsZWQgaW4gdGhpcyB2ZXJzaW9uIG9mIHRoZSBzcGVjaWZpY2F0aW9uLiAgVGhleSBzaGFsbCBiZSBkZXNjcmliZWQgYXMgcGFydCBvZiB0aGUgbm9ybWFsIGRlc2NyaXB0aW9ucyBmaWVsZHMgYXZhaWxhYmxlLg0KLQ0KLQ0KLTwvYm9keT4NCi0gICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iX3RLdVJJU1g1RWQyS25KMnlqTlhoV1EiIHR5cGU9Il90Qm9tZ3lYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgICAgPGJvZHk+ZmFsc2U8L2JvZHk+DQotICAgICAgICA8L2RlZmF1bHRWYWx1ZT4NCi0gICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il90S3VSSWlYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJsaW5rVG9QcmVkZWNlc3NvciIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdEtsSFNTWDVFZDJLbkoyeWpOWGhXUSIgYXNzb2NpYXRpb249Il90TEJ6TFNYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3RLdVJJeVg1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIqIi8+DQotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il90S3VSSkNYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfdEt1UkpTWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iUHJvY2Vzc0VsZW1lbnQiIGlzQWJzdHJhY3Q9InRydWUiPg0KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfdEt1UkppWDVFZDJLbkoyeWpOWGhXUSIgYW5ub3RhdGVkRWxlbWVudD0iX3RLdVJKU1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPGJvZHk+UHJvY2VzcyBFbGVtZW50IGlzIGEgRGVzY3JpYmFibGUgRWxlbWVudCB0aGF0IHJlcHJlc2VudHMgYW4gYWJzdHJhY3QgZ2VuZXJhbGl6YXRpb24gZm9yIGFsbCBlbGVtZW50cyBkZWZpbmVkIGluIHRoZSBQcm9jZXNzIHBhY2thZ2UuDQotUHJvY2VzcyBFbGVtZW50cyByZXByZXNlbnRzIFByb2Nlc3Mgc3BlY2lmaWMgZWxlbWVudHMgdGhhdCBhcmUgc3VwcG9zZWQgdG8gYmUgbWFuYWdlZCBpbiBQcm9jZXNzIFBhY2thZ2VzLiAgVGhlIHNlcGFyYXRpb24gb2YgUHJvY2VzcyBFbGVtZW50IGZyb20gQ29udGVudCBFbGVtZW50IGFsbG93cyB0byBjbGVhcmx5IGRpc3Rpbmd1aXNoIGJldHdlZW4gcHVyZSBtZXRob2QgY29udGVudCBmcm9tIGNvbnRlbnQgdGhhdCBpcyByZXByZXNlbnRlZCBpbiBwcm9jZXNzZXMuIA0KLTwvYm9keT4NCi0gICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfdEt1Ukp5WDVFZDJLbkoyeWpOWGhXUSIgZ2VuZXJhbD0iX3RDRlNpQ1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfdEt1UktDWDVFZDJLbkoyeWpOWGhXUSIgbWVtYmVyRW5kPSJfdEt1UktpWDVFZDJLbkoyeWpOWGhXUSBfdEtsSE5pWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il90S3VSS1NYNUVkMktuSjJ5ak5YaFdRIiBhbm5vdGF0ZWRFbGVtZW50PSJfdEt1UktDWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8Ym9keT5UaGlzIGFnZ3JlZ2F0aW9uIGFzc29jaWF0aW9uIHNwZWNpZmllcyB0aGUgcm9sZXMgb2YgdGVhbSBtZW1iZXJzIHdpdGggUm9sZSBEZXNjcmlwdG9ycy48L2JvZHk+DQotICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgPG93bmVkRW5kIHhtaTppZD0iX3RLdVJLaVg1RWQyS25KMnlqTlhoV1EiIG5hbWU9Il90ZWFtUHJvZmlsZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdEtsSE15WDVFZDJLbkoyeWpOWGhXUSIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iX3RLdVJLQ1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfdEt1Ukt5WDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IioiLz4NCi0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3RLdVJMQ1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICA8L293bmVkRW5kPg0KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il90S3VSTFNYNUVkMktuSjJ5ak5YaFdRIiBtZW1iZXJFbmQ9Il90S2xIT1NYNUVkMktuSjJ5ak5YaFdRIF90S2xIUENYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3RLdVJMaVg1RWQyS25KMnlqTlhoV1EiIGFubm90YXRlZEVsZW1lbnQ9Il90S3VSTFNYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDxib2R5PlRoaXMgYXNzb2NpYXRpb24gcmVsYXRlcyBhIFN1Yi1UZWFtIHRvIGl0cyBTdXBlci1UZWFtLCBpLmUuIHRoZSBUZWFtIHRoYXQgaXQgaXMgcGFydCBvZi48L2JvZHk+DQotICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3RLdVJMeVg1RWQyS25KMnlqTlhoV1EiIG1lbWJlckVuZD0iX3RLbEhiU1g1RWQyS25KMnlqTlhoV1EgX3RLdVJNU1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfdEt1Uk1DWDVFZDJLbkoyeWpOWGhXUSIgYW5ub3RhdGVkRWxlbWVudD0iX3RLdVJMeVg1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPGJvZHk+QnJlYWtkb3duIHN0cnVjdHVyZXMgYXJlIG5lc3RlZCBzdHJ1Y3R1cmVzIChzZWUgc3VwZXJBY3Rpdml0aWVzIGFzc29jaWF0aW9uKSBwcmVzZW50ZWQgbm9ybWFsbHkgYXMgaW5kZW50ZWQgbGlzdHMuICBXaXRoaW4gdGhpcyBuZXN0aW5nIGNoaWxkcmVuIG9uIHRoZSBzYW1lIGxldmVsIGFyZSBub3Qgc3BlY2lmaWNhbGx5IG9yZGVyZWQuICBIb3dldmVyLCBhIHVzZXIgb2YgdGhlc2UgZGF0YSBzdHJ1Y3R1cmVzIHdvdWxkIGV4cGVjdCB0byBvcmRlciBlbGVtZW50cyB3aXRoaW4gYSBsaXN0LiAgVGhpcyBhc3NvY2lhdGlvbiBpcyB1c2VkIHRvIHN0b3JlIHRoZSBwcmVzZW50YXRpb24gc2VxdWVuY2UgYW1vbmdzdCBCcmVha2Rvd24gRWxlbWVudHMuICBUaGUgYXNzb2NpYXRpb24gcHJlc2VudGVkQWZ0ZXIgaXMgcmVkdW5kYW50IHRvIHRoZSBhc3NvY2lhdGlvbiBwcmVzZW50ZWRCZWZvcmUuICBUaGlzIHJlZHVuZGFuY3kgaXMgcmVxdWlyZWQgdG8gc3VwcG9ydCBQcm9jZXNzIENvbnRyaWJ1dGlvbnMgKHNlZSBwbHVnaW5zKS48L2JvZHk+DQotICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgPG93bmVkRW5kIHhtaTppZD0iX3RLdVJNU1g1RWQyS25KMnlqTlhoV1EiIG5hbWU9Il9icmVha2Rvd25FbGVtZW50IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il90S2xIV3lYNUVkMktuSjJ5ak5YaFdRIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfdEt1Ukx5WDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il90S3VSTWlYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iMSIvPg0KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfdEt1Uk15WDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgIDwvb3duZWRFbmQ+DQotICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3RLdVJOQ1g1RWQyS25KMnlqTlhoV1EiIG1lbWJlckVuZD0iX3RLdVJOaVg1RWQyS25KMnlqTlhoV1EgX3RLbEhqaVg1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfdEt1Uk5TWDVFZDJLbkoyeWpOWGhXUSIgYW5ub3RhdGVkRWxlbWVudD0iX3RLdVJOQ1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPGJvZHk+VGhpcyBhc3NvY2lhdGlvbiByZXByZXNlbnRzIHRoZSByZWZlcmVuY2UgZnJvbSB0aGUgZGVzY3JpcHRvciB0byB0aGUgY29yZSBjb250ZW50IGVsZW1lbnQgaXQgcmVmZXJzIHRvLiAgRXZlcnkgVGFzayBEZXNjcmlwdG9yIGNhbiByZWZlcmVuY2Ugb25seSBvbiBUYXNrLiAgSG93ZXZlciwgYSBUYXNrIGNhbiBiZSByZXByZXNlbnRlZCBieSBtYW55IFRhc2sgRGVzY3JpcHRvcnMuICBJbiB0aGUgVU1BIFByb2ZpbGUgdGhpcyBhc3NvY2lhdGlvbiBpcyBpbnN0YW50aWF0ZWQgYnkgYSBkZXBlbmRlbmN5IHJlbGF0aW9uc2hpcCB3aXRoIGEgdHJhY2Ugc3RlcmVvdHlwZS48L2JvZHk+DQotICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgPG93bmVkRW5kIHhtaTppZD0iX3RLdVJOaVg1RWQyS25KMnlqTlhoV1EiIG5hbWU9InRhc2tEZXNjcmlwdG9yIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il90S2xIaWlYNUVkMktuSjJ5ak5YaFdRIiBhc3NvY2lhdGlvbj0iX3RLdVJOQ1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfdEt1Uk55WDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IioiLz4NCi0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3RLdVJPQ1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICA8L293bmVkRW5kPg0KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il90S3VST1NYNUVkMktuSjJ5ak5YaFdRIiBtZW1iZXJFbmQ9Il90S3VST3lYNUVkMktuSjJ5ak5YaFdRIF90S2xIdGlYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3RLdVJPaVg1RWQyS25KMnlqTlhoV1EiIGFubm90YXRlZEVsZW1lbnQ9Il90S3VST1NYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDxib2R5PlRoaXMgYXNzb2NpYXRpb24gcmVwcmVzZW50cyB0aGUgcmVmZXJlbmNlIGZyb20gdGhlIGRlc2NyaXB0b3IgdG8gdGhlIGNvcmUgY29udGVudCBlbGVtZW50IGl0IHJlZmVycyB0by4gIEV2ZXJ5IFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9yIGNhbiByZWZlcmVuY2Ugb25seSBvbmUgV29yayBQcm9kdWN0LiAgSG93ZXZlciwgYSBXb3JrIFByb2R1Y3QgY2FuIGJlIHJlcHJlc2VudGVkIGJ5IG1hbnkgV29yayBQcm9kdWN0IERlc2NyaXB0b3JzLiAgSW4gdGhlIFVNQSBQcm9maWxlIHRoaXMgYXNzb2NpYXRpb24gaXMgaW5zdGFudGlhdGVkIGJ5IGEgZGVwZW5kZW5jeSByZWxhdGlvbnNoaXAgd2l0aCBhIHRyYWNlIHN0ZXJlb3R5cGUuPC9ib2R5Pg0KLSAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il90S3VST3lYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJ3b3JrUHJvZHVjdERlc2NyaXB0b3IiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3RLbEhxU1g1RWQyS25KMnlqTlhoV1EiIGFzc29jaWF0aW9uPSJfdEt1Uk9TWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il90S3VSUENYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfdEt1UlBTWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgIDwvb3duZWRFbmQ+DQotICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3RLdVJQaVg1RWQyS25KMnlqTlhoV1EiIG1lbWJlckVuZD0iX3RLdVJRQ1g1RWQyS25KMnlqTlhoV1EgX3RLbEhnU1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfdEt1UlB5WDVFZDJLbkoyeWpOWGhXUSIgYW5ub3RhdGVkRWxlbWVudD0iX3RLdVJQaVg1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPGJvZHk+VGhpcyBhc3NvY2lhdGlvbiByZXByZXNlbnRzIHRoZSByZWZlcmVuY2UgZnJvbSB0aGUgZGVzY3JpcHRvciB0byB0aGUgY29yZSBjb250ZW50IGVsZW1lbnQgaXQgcmVmZXJzIHRvLiAgRXZlcnkgUm9sZSBEZXNjcmlwdG9yIGNhbiByZWZlcmVuY2Ugb25seSBvbmUgUm9sZS4gIEhvd2V2ZXIsIGEgUm9sZSBjYW4gYmUgcmVwcmVzZW50ZWQgYnkgbWFueSBSb2xlIERlc2NyaXB0b3JzLiAgSW4gdGhlIFVNQSBQcm9maWxlIHRoaXMgYXNzb2NpYXRpb24gaXMgaW5zdGFudGlhdGVkIGJ5IGEgZGVwZW5kZW5jeSByZWxhdGlvbnNoaXAgd2l0aCBhIHRyYWNlIHN0ZXJlb3R5cGUuPC9ib2R5Pg0KLSAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il90S3VSUUNYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJyb2xlRGVzY3JpcHRvciIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdEtsSGZpWDVFZDJLbkoyeWpOWGhXUSIgYXNzb2NpYXRpb249Il90S3VSUGlYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3RLdVJRU1g1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIqIi8+DQotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il90S3VSUWlYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgPC9vd25lZEVuZD4NCi0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfdEt1UlF5WDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iQWRkaXRpb25hbGx5UGVyZm9ybXMiIG1lbWJlckVuZD0iX3RLbEhrU1g1RWQyS25KMnlqTlhoV1EgX3RLdVJSU1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfdEt1UlJDWDVFZDJLbkoyeWpOWGhXUSIgYW5ub3RhdGVkRWxlbWVudD0iX3RLdVJReVg1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPGJvZHk+VGhpcyBhc3NvY2lhdGlvbiBtYXBzIHRvIHRoZSByZXNwZWN0aXZlIGFzc29jaWF0aW9uIGluIENvcmUgQ29udGVudCBFbGVtZW50cy4gIEl0IHNwZWNpZmllcyBkZXNjcmlwdG9ycyBmb3IgYWRkaXRpb25hbCByb2xlcyBuZWNlc3NhcnkgdG8gY29tcGxldGUgdGhlIHJlZmVycmVkIFRhc2suICBJbnN0YW5jZXMgb2YgdGhlc2Ugcm9sZXMgd291bGQgc2hvdyB1cCBhcyBzY2hlZHVsZWQgcmVzb3VyY2VzIG9uIGEgY29ycmVzcG9uZGluZyBwcm9qZWN0IHBsYW4gZ2VuZXJhdGVkIGZyb20gdGhpcyBzdHJ1Y3R1cmUuPC9ib2R5Pg0KLSAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il90S3VSUlNYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJwZXJmb3Jtc0FkZGl0aW9uYWxseSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdEtsSGlpWDVFZDJLbkoyeWpOWGhXUSIgYXNzb2NpYXRpb249Il90S3VSUXlYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3RLdVJSaVg1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIqIi8+DQotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il90S3VSUnlYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgPC9vd25lZEVuZD4NCi0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfdEt1UlNDWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iQXNzaXN0cyIgbWVtYmVyRW5kPSJfdEtsSGxDWDVFZDJLbkoyeWpOWGhXUSBfdEt1UlNpWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il90S3VSU1NYNUVkMktuSjJ5ak5YaFdRIiBhbm5vdGF0ZWRFbGVtZW50PSJfdEt1UlNDWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8Ym9keT5UaGlzIGFzc29jaWF0aW9uIGlzIHNwZWNpZmljIHRvIGEgcHJvY2VzcywgaS5lLiBubyBkZWZhdWx0cyBoYXZlIGJlZW4gZGVmaW5lZCBpbiBDb3JlIENvbnRlbnQgRWxlbWVudHMuICBJdCBzcGVjaWZpZXMgZGVzY3JpcHRvcnMgZm9yIGFkZGl0aW9uYWwgcm9sZXMgdGhhdCBtYXkgcHJvdmlkZSBpbmZvcm1hdGlvbiBvciBhc3Npc3RhbmNlIGhlbHBmdWwsIGJ1dCBub3QgbWFuZGF0b3J5IHRvIHRoZSBjb21wbGV0aW9uIG9mIHRoZSBUYXNrLiAgSW5zdGFuY2VzIG9mIHRoZXNlIHJvbGVzIHdvdWxkIG5vdCBzaG93IHVwIGFzIHNjaGVkdWxlZCByZXNvdXJjZXMgb24gdGhlIGNvcnJlc3BvbmRpbmcgcHJvamVjdCBwbGFuIGdlbmVyYXRlZCBmcm9tIHRoaXMgc3RydWN0dXJlLjwvYm9keT4NCi0gICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfdEt1UlNpWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iYXNzaXN0c0luIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il90S2xIaWlYNUVkMktuSjJ5ak5YaFdRIiBhc3NvY2lhdGlvbj0iX3RLdVJTQ1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfdEt1UlN5WDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IioiLz4NCi0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3RLdVJUQ1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICA8L293bmVkRW5kPg0KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il90S3VSVFNYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJFeHRlcm5hbElucHV0IiBtZW1iZXJFbmQ9Il90S2xIbHlYNUVkMktuSjJ5ak5YaFdRIF90S3VSVHlYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3RLdVJUaVg1RWQyS25KMnlqTlhoV1EiIGFubm90YXRlZEVsZW1lbnQ9Il90S3VSVFNYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDxib2R5PlRoaXMgYXNzb2NpYXRpb24gaXMgc3BlY2lmaWMgdG8gYSBwcm9jZXNzLCBpLmUuIG5vIGRlZmF1bHRzIHdpbGwgYmUgZGVmaW5lZCBpbiBDb3JlIENvbnRlbnQgRWxlbWVudHMuICBJdCBzcGVjaWZpZXMgZGVzY3JpcHRvcnMgZm9yIFdvcmsgUHJvZHVjdHMgdXNlZCBhcyBpbnB1dHMgdGhhdCBhcmUgbm90IHByb2R1Y2VkIGJ5IFRhc2tzIHdpdGhpbiB0aGUgc2FtZSBQcm9jZXNzLCBidXQgYnkgYW5vdGhlciBleHRlcm5hbCBwcm9jZXNzIG9yIGFuIHVua25vd24gc291cmNlLjwvYm9keT4NCi0gICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfdEt1UlR5WDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iZXh0ZXJuYWxJbnB1dFRvIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il90S2xIaWlYNUVkMktuSjJ5ak5YaFdRIiBhc3NvY2lhdGlvbj0iX3RLdVJUU1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfdEt1UlVDWDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IioiLz4NCi0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3RLdVJVU1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICA8L293bmVkRW5kPg0KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il90S3VSVWlYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJJbXBhY3RzRGVwZW5kZW5jeSIgbWVtYmVyRW5kPSJfdEtsSHVTWDVFZDJLbkoyeWpOWGhXUSBfdEtsSHZDWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il90S3VSVXlYNUVkMktuSjJ5ak5YaFdRIiBhbm5vdGF0ZWRFbGVtZW50PSJfdEt1UlVpWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8Ym9keT5UaGlzIGFzc29jaWF0aW9uIGlzIHVzZWQgdG8gc2VtaS1mb3JtYWxseSBzcGVjaWZ5IHRyYWNlYWJpbGl0eSByZWxhdGlvbnNoaXBzIGJldHdlZW4gV29yayBQcm9kdWN0cyB3aXRoaW4gdGhlIHNjb3BlIG9mIGFuIEFjdGl2aXR5LiAgQSBsaW5rIGZyb20gb25lIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9yIHRvIGFub3RoZXIgaW5kaWNhdGVzIHRoYXQgb25lIFdvcmsgUHJvZHVjdCBpcyByZXF1aXJlZCBhcyBpbnB1dCB0byBhIFRhc2sgdGhhdCBwcm9kdWNlcyB0aGUgcmVsYXRlZCBXb3JrIFByb2R1Y3QgKCdpbXBhY3RzJyByb2xlIGVuZCkuICBJdCB3b3VsZCBhbHNvIG1lYW4gdGhhdCBhIGNoYW5nZSBvbiBvbmUgV29yayBQcm9kdWN0IGluc3RhbmNlIG1heSBhZmZlY3QgYSBjaGFuZ2Ugb24gdGhlIHJlbGF0ZWQgcHJvZHVjdC48L2JvZHk+DQotICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3RLdVJWQ1g1RWQyS25KMnlqTlhoV1EiIG5hbWU9Ik1hbmRhdG9yeUlucHV0IiBtZW1iZXJFbmQ9Il90S2xIbWlYNUVkMktuSjJ5ak5YaFdRIF90S3VSVmlYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3RLdVJWU1g1RWQyS25KMnlqTlhoV1EiIGFubm90YXRlZEVsZW1lbnQ9Il90S3VSVkNYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDxib2R5PlRoaXMgYXNzb2NpYXRpb24gbWFwcyB0byB0aGUgcmVzcGVjdGl2ZSBhc3NvY2lhdGlvbiBpbiBDb3JlIENvbnRlbnQgRWxlbWVudHMuICBJdCBwb2ludHMgdG8gZGVzY3JpcHRvcnMgZm9yIFdvcmsgUHJvZHVjdHMgdGhhdCBhcmUgbWFuZGF0b3J5IGZvciB0aGUgVGFzayB0byBiZSBwZXJmb3JtZWQuPC9ib2R5Pg0KLSAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il90S3VSVmlYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJtYW5kYXRvcnlJbnB1dFRvIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il90S2xIaWlYNUVkMktuSjJ5ak5YaFdRIiBhc3NvY2lhdGlvbj0iX3RLdVJWQ1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfdEt1UlZ5WDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IioiLz4NCi0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3RLdVJXQ1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICA8L293bmVkRW5kPg0KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il90S3VSV1NYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJNb2RpZmllcyIgbWVtYmVyRW5kPSJfdEtsSGhDWDVFZDJLbkoyeWpOWGhXUSBfdEt1Uld5WDVFZDJLbkoyeWpOWGhXUSIgaXNEZXJpdmVkPSJ0cnVlIj4NCi0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3RLdVJXaVg1RWQyS25KMnlqTlhoV1EiIGFubm90YXRlZEVsZW1lbnQ9Il90S3VSV1NYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDxib2R5PlRoaXMgZGVyaXZlZCBhc3NvY2lhdGlvbiBtYXBzIHRvIHRoZSBNb2RpZmllcyBhc3NvY2lhdGlvbiBkZWZpbmVkIGJldHdlZW4gV29yayBQcm9kdWN0cyBhbmQgVGFza3MgaW4gQ29yZSBNZXRob2QgQ29udGVudC4gIFRoZSBzYW1lIGRlcml2YXRpb24gcnVsZSBhcyBmb3IgdGhlIGNvcmUgY29udGVudCBlbGVtZW50cyBhcHBsaWVzLjwvYm9keT4NCi0gICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfdEt1Uld5WDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iX3JvbGVEZXNjcmlwdG9yIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il90S2xIZmlYNUVkMktuSjJ5ak5YaFdRIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfdEt1UldTWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il90S3VSWENYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfdEt1UlhTWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgIDwvb3duZWRFbmQ+DQotICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3RLdVJYaVg1RWQyS25KMnlqTlhoV1EiIG5hbWU9Ik9wdGlvbmFsSW5wdXQiIG1lbWJlckVuZD0iX3RLdVJZQ1g1RWQyS25KMnlqTlhoV1EgX3RLbEhuU1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfdEt1Ulh5WDVFZDJLbkoyeWpOWGhXUSIgYW5ub3RhdGVkRWxlbWVudD0iX3RLdVJYaVg1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPGJvZHk+VGhpcyBhc3NvY2lhdGlvbiBtYXBzIHRvIHRoZSByZXNwZWN0aXZlIGFzc29jaWF0aW9uIGluIENvcmUgQ29udGVudCBFbGVtZW50cy4gIEl0IHBvaW50cyB0byBkZXNjcmlwdG9ycyBmb3IgV29yayBQcm9kdWN0cyB0aGF0IGFyZSBvcHRpb25hbCBmb3IgdGhlIFRhc2sgdG8gYmUgcGVyZm9ybWVkLjwvYm9keT4NCi0gICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfdEt1UllDWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iT3B0aW9uYWxJbnB1dFRvIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il90S2xIaWlYNUVkMktuSjJ5ak5YaFdRIiBhc3NvY2lhdGlvbj0iX3RLdVJYaVg1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfdEt1UllTWDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IioiLz4NCi0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3RLdVJZaVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICA8L293bmVkRW5kPg0KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il90S3VSWXlYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJPdXRwdXQiIG1lbWJlckVuZD0iX3RLdVJaU1g1RWQyS25KMnlqTlhoV1EgX3RLbEhvQ1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfdEt1UlpDWDVFZDJLbkoyeWpOWGhXUSIgYW5ub3RhdGVkRWxlbWVudD0iX3RLdVJZeVg1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPGJvZHk+VGhpcyBhc3NvY2lhdGlvbiBtYXBzIHRvIHRoZSByZXNwZWN0aXZlIGFzc29jaWF0aW9uIGluIENvcmUgQ29udGVudCBFbGVtZW50cy4gIEl0IHBvaW50cyB0byBkZXNjcmlwdG9ycyBmb3IgV29yayBQcm9kdWN0cyB0aGF0IGFyZSBvdXRwdXRzIGZvciBwZXJmb3JtaW5nIHRoZSByZWZlcnJlZCBUYXNrLjwvYm9keT4NCi0gICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfdEt1UlpTWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0ib3V0cHV0RnJvbSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdEtsSGlpWDVFZDJLbkoyeWpOWGhXUSIgYXNzb2NpYXRpb249Il90S3VSWXlYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3RLdVJaaVg1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIqIi8+DQotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il90S3VSWnlYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgPC9vd25lZEVuZD4NCi0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfdExCekVDWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iUGFja2FnZWRXUCIgbWVtYmVyRW5kPSJfdExCekVpWDVFZDJLbkoyeWpOWGhXUSBfdEtsSHZ5WDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il90TEJ6RVNYNUVkMktuSjJ5ak5YaFdRIiBhbm5vdGF0ZWRFbGVtZW50PSJfdExCekVDWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8Ym9keT5JZiBhIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9yIHJlZmVycyBhdCB0aGUgJ2RlbGl2ZXJhYmxlJyByb2xlIGVuZCB0byBhIERlbGl2ZXJhYmxlIFdvcmsgUHJvZHVjdCB0aGVuIHRoaXMgYXNzb2NpYXRpb24gaXMgdXNlZCB0byBzcGVjaWZ5IHRoZSBEZWxpdmVyYWJsZSdzIFdvcmsgUHJvZHVjdCBwYXJ0cy4gIEFzIGluZGljYXRlZCBmb3IgRGVsaXZlcmFibGUgaW4gdGhlIENvcmUgTWV0aG9kIENvbnRlbnQgcGFja2FnZSwgdGhpcyBhc3NvY2lhdGlvbiBvdmVycmlkZXMgdGhlICdkZWxpdmVyZWRXb3JrUHJvZHVjdHMnIGFzc29jaWF0aW9uIG9mIHRoZSBXb3JrIFByb2R1Y3QsIHdoaWNoIHN0b3JlcyB0aGUgcmVjb21tZW5kZWQgZGVsaXZlcmFibGUgcGFydHMsIGJ1dCBjYW4gYmUgY3VzdG9taXplZCBmb3IgZXZlcnkgV29yayBQcm9kdWN0IERlc2NyaXB0b3IuIDwvYm9keT4NCi0gICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfdExCekVpWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iZGVsaXZlcmFibGUiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3RLbEhxU1g1RWQyS25KMnlqTlhoV1EiIGFzc29jaWF0aW9uPSJfdExCekVDWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il90TEJ6RXlYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfdExCekZDWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgIDwvb3duZWRFbmQ+DQotICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3RMQnpGU1g1RWQyS25KMnlqTlhoV1EiIG5hbWU9IlByaW1hcnlQZXJmb3JtcyIgbWVtYmVyRW5kPSJfdEtsSG95WDVFZDJLbkoyeWpOWGhXUSBfdExCekZ5WDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il90TEJ6RmlYNUVkMktuSjJ5ak5YaFdRIiBhbm5vdGF0ZWRFbGVtZW50PSJfdExCekZTWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8Ym9keT5UaGlzIGFzc29jaWF0aW9uIG1hcHMgdG8gdGhlIHJlc3BlY3RpdmUgYXNzb2NpYXRpb24gaW4gQ29yZSBDb250ZW50IEVsZW1lbnRzLiAgSXQgcG9pbnRzIHRvIGEgZGVzY3JpcHRvciBmb3IgdGhlIG9uZSByb2xlIHJlc3BvbnNpYmxlIGZvciB0aGUgY29tcGxldGlvbiBvZiB0aGUgdGFzay4gIEFuIGluc3RhbmNlIG9mIHRoaXMgcm9sZSB3b3VsZCBzaG93IHVwIGFzIGEgc2NoZWR1bGVkIHJlc291cmNlIG9uIGEgY29ycmVzcG9uZGluZyBwcm9qZWN0IHBsYW4gZ2VuZXJhdGVkIGZyb20gdGhpcyBzdHJ1Y3R1cmUuPC9ib2R5Pg0KLSAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il90TEJ6RnlYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJwZXJmb3Jtc0FzT3duZXIiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3RLbEhpaVg1RWQyS25KMnlqTlhoV1EiIGFzc29jaWF0aW9uPSJfdExCekZTWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il90TEJ6R0NYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfdExCekdTWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgIDwvb3duZWRFbmQ+DQotICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3RMQnpHaVg1RWQyS25KMnlqTlhoV1EiIG5hbWU9IlJlc3BvbnNpYmxlIiBtZW1iZXJFbmQ9Il90S2xIaHlYNUVkMktuSjJ5ak5YaFdRIF90TEJ6SENYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3RMQnpHeVg1RWQyS25KMnlqTlhoV1EiIGFubm90YXRlZEVsZW1lbnQ9Il90TEJ6R2lYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDxib2R5PlRoaXMgYXNzb2NpYXRpb24gcmVwcmVzZW50cyByZXNwb25zaWJpbGl0eSBmb3IgV29yayBQcm9kdWN0IGluc3RhbmNlcy4gIEl0IGluZGljYXRlcyBvd25lcnNoaXAgYW5kIGZvciBleGFtcGxlIHdvdWxkIGRlZmluZSB0aGUgUm9sZSB0aGF0IGFuc3dlcnMgdG8gbWFuYWdlbWVudCBxdWVzdGlvbnMgYWJvdXQgdGhlIHF1YWxpdHkgd29yayBwcm9kdWN0LjwvYm9keT4NCi0gICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfdExCekhDWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0icmVzcG9uc2libGVSb2xlIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il90S2xIZmlYNUVkMktuSjJ5ak5YaFdRIiBhc3NvY2lhdGlvbj0iX3RMQnpHaVg1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfdExCekhTWDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IioiLz4NCi0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3RMQnpIaVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICA8L293bmVkRW5kPg0KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il90TEJ6SHlYNUVkMktuSjJ5ak5YaFdRIiBtZW1iZXJFbmQ9Il90S3VSRXlYNUVkMktuSjJ5ak5YaFdRIF90TEJ6SUNYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfdExCeklDWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iX2NvbXBvc2l0ZVJvbGUiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3RLdVJFQ1g1RWQyS25KMnlqTlhoV1EiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il90TEJ6SHlYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3RMQnpJU1g1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIqIi8+DQotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il90TEJ6SWlYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgPC9vd25lZEVuZD4NCi0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfdExCekl5WDVFZDJLbkoyeWpOWGhXUSIgbWVtYmVyRW5kPSJfdEtsSGNDWDVFZDJLbkoyeWpOWGhXUSBfdExCekpTWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il90TEJ6SkNYNUVkMktuSjJ5ak5YaFdRIiBhbm5vdGF0ZWRFbGVtZW50PSJfdExCekl5WDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8Ym9keT5CcmVha2Rvd24gc3RydWN0dXJlcyBhcmUgbmVzdGVkIHN0cnVjdHVyZXMgKHNlZSBzdXBlckFjdGl2aXRpZXMgYXNzb2NpYXRpb24pIHByZXNlbnRlZCBub3JtYWxseSBhcyBpbmRlbnRlZCBsaXN0cy4gIFdpdGhpbiB0aGlzIG5lc3RpbmcgY2hpbGRyZW4gb24gdGhlIHNhbWUgbGV2ZWwgYXJlIG5vdCBzcGVjaWZpY2FsbHkgb3JkZXJlZC4gIEhvd2V2ZXIsIGEgdXNlciBvZiB0aGVzZSBkYXRhIHN0cnVjdHVyZXMgd291bGQgZXhwZWN0IHRvIG9yZGVyIGVsZW1lbnRzIHdpdGhpbiBhIGxpc3QuICBUaGlzIGFzc29jaWF0aW9uIGlzIHVzZWQgdG8gc3RvcmUgdGhlIHByZXNlbnRhdGlvbiBzZXF1ZW5jZSBhbW9uZ3N0IEJyZWFrZG93biBFbGVtZW50cy4gIFRoZSBhc3NvY2lhdGlvbiBwcmVzZW50ZWRCZWZvcmUgaXMgcmVkdW5kYW50IHRvIHRoZSBhc3NvY2lhdGlvbiBwcmVzZW50ZWRBZnRlci4gIFRoaXMgcmVkdW5kYW5jeSBpcyByZXF1aXJlZCB0byBzdXBwb3J0IFByb2Nlc3MgQ29udHJpYnV0aW9ucyAoc2VlIHBsdWdpbnMpLjwvYm9keT4NCi0gICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfdExCekpTWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iX2JyZWFrZG93bkVsZW1lbnQiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3RLbEhXeVg1RWQyS25KMnlqTlhoV1EiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il90TEJ6SXlYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3RMQnpKaVg1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIxIi8+DQotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il90TEJ6SnlYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgPC9vd25lZEVuZD4NCi0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfdExCektDWDVFZDJLbkoyeWpOWGhXUSIgbWVtYmVyRW5kPSJfdEtsSFR5WDVFZDJLbkoyeWpOWGhXUSBfdExCektpWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il90TEJ6S1NYNUVkMktuSjJ5ak5YaFdRIiBhbm5vdGF0ZWRFbGVtZW50PSJfdExCektDWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8Ym9keT5UaGUgV29yayBPcmRlciBjbGFzcyBkZWZpbmVzIHByZWRlY2Vzc29yIGFuZCBzdWNjZXNzb3IgcmVsYXRpb25zIGFtb25nc3QgQnJlYWtkb3duIEVsZW1lbnRzLiAgVGhpcyBhc3NvY2lhdGlvbiBsaW5rcyBhIFdvcmsgQnJlYWtkb3duIEVsZW1lbnQgdG8gaXRzIHN1Y2Nlc3NvciBXb3JrIEJyZWFrZG93biBFbGVtZW50LjwvYm9keT4NCi0gICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfdExCektpWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0ibGlua1RvU3VjY2Vzc29yIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il90S2xIU1NYNUVkMktuSjJ5ak5YaFdRIiBhc3NvY2lhdGlvbj0iX3RMQnpLQ1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfdExCekt5WDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IioiLz4NCi0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3RMQnpMQ1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICA8L293bmVkRW5kPg0KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il90TEJ6TFNYNUVkMktuSjJ5ak5YaFdRIiBtZW1iZXJFbmQ9Il90TEJ6THlYNUVkMktuSjJ5ak5YaFdRIF90S3VSSWlYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3RMQnpMaVg1RWQyS25KMnlqTlhoV1EiIGFubm90YXRlZEVsZW1lbnQ9Il90TEJ6TFNYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDxib2R5PlRoaXMgYXNzb2NpYXRpb24gbGlua3MgYSBXb3JrIEJyZWFrZG93biBFbGVtZW50IHRvIGl0cyBwcmVkZWNlc3Nvci4gIEV2ZXJ5IFdvcmsgQnJlYWtkb3duIEVsZW1lbnQgY2FuIGhhdmUgcHJlZGVjZXNzb3IgaW5mb3JtYXRpb24gYXNzb2NpYXRlZCB0byBpdC4gIFNwZWNpZmljIHByZWRlY2Vzc29yIGluZm9ybWF0aW9uIGlzIHN0b3JlZCBpbiBpbnN0YW5jZXMgb2YgdGhlIGNsYXNzIFdvcmsgT3JkZXIsIHdoaWNoIGRlZmluZXMgdGhlIGtpbmQgb2YgcHJlZGVjZXNzb3IgYW5vdGhlciBXb3JrIEJyZWFrZG93biBFbGVtZW50IHJlcHJlc2VudHMgZm9yIGFub3RoZXIuPC9ib2R5Pg0KLSAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il90TEJ6THlYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJzdWNjIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il90S3VSRmlYNUVkMktuSjJ5ak5YaFdRIiBhc3NvY2lhdGlvbj0iX3RMQnpMU1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfdExCek1DWDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IjEiLz4NCi0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3RMQnpNU1g1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIxIi8+DQotICAgICAgPC9vd25lZEVuZD4NCi0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfdExLOUFDWDVFZDJLbkoyeWpOWGhXUSIgbWVtYmVyRW5kPSJfdEtsSEtpWDVFZDJLbkoyeWpOWGhXUSBfdExLOUFTWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgPG93bmVkRW5kIHhtaTppZD0iX3RMSzlBU1g1RWQyS25KMnlqTlhoV1EiIG5hbWU9IiIgdmlzaWJpbGl0eT0icHJpdmF0ZSIgdHlwZT0iX3RLbEhKeVg1RWQyS25KMnlqTlhoV1EiIGFzc29jaWF0aW9uPSJfdExLOUFDWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il90TEs5QWlYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfdExLOUF5WDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgIDwvb3duZWRFbmQ+DQotICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3RPSl9rQ1g1RWQyS25KMnlqTlhoV1EiIG5hbWU9IkRlbGl2ZXJ5UHJvY2VzcyI+DQotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il90T0pfa1NYNUVkMktuSjJ5ak5YaFdRIiBhbm5vdGF0ZWRFbGVtZW50PSJfdE9KX2tDWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8Ym9keT5BIERlbGl2ZXJ5IFByb2Nlc3NlcyBpcyBhIHNwZWNpYWwgUHJvY2VzcyBkZXNjcmliaW5nIGEgY29tcGxldGUgYW5kIGludGVncmF0ZWQgYXBwcm9hY2ggZm9yIHBlcmZvcm1pbmcgYSBzcGVjaWZpYyBwcm9qZWN0IHR5cGUuICBJdCBkZXNjcmliZXMgYSBjb21wbGV0ZSBwcm9qZWN0IGxpZmVjeWNsZSBlbmQtdG8tZW5kIGFuZCBzaGFsbCBiZSB1c2VkIGFzIGEgcmVmZXJlbmNlIGZvciBydW5uaW5nIHByb2plY3RzIHdpdGggc2ltaWxhciBjaGFyYWN0ZXJpc3RpY3MgYXMgZGVmaW5lZCBmb3IgdGhlIHByb2Nlc3MuICBBIERlbGl2ZXJ5IFByb2Nlc3MgaXMgcmVsYXRlZCB0byBzcGVjaWZpYyBzdXBwb3J0aW5nIGluZm9ybWF0aW9uIHN1Y2ggYXMgUm9hZG1hcHMgKGluaGVyaXRlZCB2aWEgQWN0aXZpdHkpIGFzIHdlbGwgYXMgQ29tbXVuaWNhdGlvbnMgYW5kIEVkdWNhdGlvbiBNYXRlcmlhbC4NCi1BIERlbGl2ZXJ5IFByb2Nlc3MgaXMgYSBQcm9jZXNzIHRoYXQgY292ZXJzIGEgd2hvbGUgZGV2ZWxvcG1lbnQgbGlmZWN5Y2xlIGZyb20gYmVnaW5uaW5nIHRvIGVuZC4gIEEgRGVsaXZlcnkgUHJvY2VzcyBzaGFsbCBiZSB1c2VkIGFzIGEgdGVtcGxhdGUgZm9yIHBsYW5uaW5nIGFuZCBydW5uaW5nIGEgcHJvamVjdC4gIEl0IHByb3ZpZGVzIGEgY29tcGxldGUgbGlmZWN5Y2xlIG1vZGVsIHdpdGggcHJlZGVmaW5lZCBwaGFzZXMsIGl0ZXJhdGlvbnMsIGFuZCBhY3Rpdml0aWVzIHRoYXQgaGF2ZSBiZWVuIGRldGFpbGVkIGJ5IHNlcXVlbmNpbmcgcmVmZXJlbmNpbmcgbWV0aG9kIGNvbnRlbnQgaW4gYnJlYWtkb3duIHN0cnVjdHVyZXMuICBJdCBpcyBkZWZpbmVkIG9uIHRoZSBiYXNpcyBvZiBleHBlcmllbmNlIHdpdGggcGFzdCBwcm9qZWN0cyBvciBlbmdhZ2VtZW50cywgYW5kL29yIHRoZSBiZXN0IHByYWN0aWNlIHVzZSBvZiBhIGRldmVsb3BtZW50IG9yIGRlbGl2ZXJ5IGFwcHJvYWNoLiAgSXQgZGVmaW5lcyB3aGF0IGdldHMgcHJvZHVjZWQsIGhvdyB0aG9zZSBpdGVtcyBhcmUgcHJvZHVjZWQsIGFuZCB0aGUgcmVxdWlyZWQgc3RhZmZpbmcgaW4gdGhlIGZvcm0gb2YgaW50ZWdyYXRlZCBXb3JrLCBXb3JrIFByb2R1Y3QsIGFuZCBUZWFtIEJyZWFrZG93biBTdHJ1Y3R1cmVzLiAgRm9yIGV4YW1wbGUsIGEgcHJvY2VzcyBlbmdpbmVlciBjYW4gZGVmaW5lIGFsdGVybmF0aXZlIERlbGl2ZXJ5IFByb2Nlc3NlcyBmb3Igc29mdHdhcmUgZGV2ZWxvcG1lbnQgcHJvamVjdHMgdGhhdCBkaWZmZXIgaW4gdGhlIHNjYWxlIG9mIHRoZSBlbmdhZ2VtZW50IGFuZCBzdGFmZmluZyBuZWNlc3NhcnksIHRoZSB0eXBlIG9mIHRoZSBzb2Z0d2FyZSBhcHBsaWNhdGlvbiB0byBiZSBkZXZlbG9wZWQsIHRoZSBkZXZlbG9wbWVudCBtZXRob2RzIGFuZCB0ZWNobm9sb2dpZXMgdG8gYmUgdXNlZCwgZXRjLiAgQWx0aG91Z2gsIHRoZSBEZWxpdmVyeSBQcm9jZXNzIGFpbXMgdG8gY292ZXIgYSB3aG9sZSBwcm9qZWN0IGl0IGtlZXBzIGNlcnRhaW4gZGVjaXNpb24gdGhhdCBhcmUgdG9vIHByb2plY3Qgc3BlY2lmaWMgb3Blbi4gIEZvciBleGFtcGxlLCB0aGUgYnJlYWtkb3duIHN0cnVjdHVyZSBkZWZpbmVzIHdoaWNoIEJyZWFrZG93biBFbGVtZW50cyBoYXZlIG11bHRpcGxlIG9jY3VycmVuY2VzIG9yIGlzIHJlcGVhdGFibGUgdmlhIGl0IHJlc3BlY3RpdmUgYXR0cmlidXRlcywgYnV0IGRvZXMgbm90IHNheSBob3cgbWFueSBvY2N1cnJlbmNlcyBhbmQgaG93IG1hbnkgcmVwZWF0cy9pdGVyYXRpb25zIGl0IHdpbGwgaGF2ZS4gIFRoZXNlIGRlY2lzaW9ucyBoYXZlIHRvIGJlIGRvbmUgYnkgYSBwcm9qZWN0IG1hbmFnZXIgd2hlbiBwbGFubmluZyBhIGNvbmNyZXRlIHByb2plY3QsIHByb2plY3QgcGhhc2UsIG9yIHByb2plY3QgaXRlcmF0aW9ucy4gIEEgRGVsaXZlcnkgUHJvY2VzcyBpcyBhbHdheXMgYSBjb21wbGV0ZSBkZXNjcmlwdGlvbiBvZiBhIHByb2Nlc3MgaW4gdGVybXMgb2YgY29tcGxldGVuZXNzIG9mIHRoZSBsaWZlY3ljbGUsIGFzIHdlbGwgYXMgaW4gdGVybXMgb2YgYWxsIHRocmVlIHZpZXdzIG9uIHRoZSBwcm9jZXNzIHdoaWNoIGFyZSB0aGUgV29yayBCcmVha2Rvd24gU3RydWN0dXJlLCBXb3JrIFByb2R1Y3QgQnJlYWtkb3duIFN0cnVjdHVyZSwgYW5kIFRlYW0gQnJlYWtkb3duIFN0cnVjdHVyZSBoYXZlIHRvIGJlIGZ1bGx5IGFuZCBjb25zaXN0ZW50bHkgcG9wdWxhdGVkLiAgQ29uc2lzdGVuY3kgb2YgYSBEZWxpdmVyeSBQcm9jZXNzIGlzIGFjdHVhbGx5IGVuc3VyZWQgYnkgdGhlIGZhY3QgdGhhdCBhbGwgdGhyZWUgYnJlYWtkb3ducyBhcmUgcmVwcmVzZW50ZWQgYnkgb25lIHNpbmdsZSBkYXRhIHN0cnVjdHVyZSBhbmQgb25lIHBhcnRpY3VsYXIgYnJlYWtkb3duIHN1Y2ggYXMgVGVhbSBCcmVha2Rvd24gaXMganVzdCBhIHZpZXcgb24gdGhhdCBkYXRhIHN0cnVjdHVyZS4NCi08L2JvZHk+DQotICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3RPSl9raVg1RWQyS25KMnlqTlhoV1EiIGdlbmVyYWw9Il90T0pfbVNYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3RPSl9reVg1RWQyS25KMnlqTlhoV1EiIG5hbWU9ImVkdWNhdGlvbk1hdGVyaWFscyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdEVLOU15WDVFZDJLbkoyeWpOWGhXUSIgYXNzb2NpYXRpb249Il90T1RKa2lYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3RPSl9sQ1g1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIqIi8+DQotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il90T0pfbFNYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfdE9KX2xpWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iY29tbXVuaWNhdGlvbnNNYXRlcmlhbHMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3RFSzlNeVg1RWQyS25KMnlqTlhoV1EiIGFzc29jaWF0aW9uPSJfdE9USmx5WDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il90T0pfbHlYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfdE9KX21DWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3RPSl9ueVg1RWQyS25KMnlqTlhoV1EiIG5hbWU9IlByb2Nlc3NQbGFubmluZ1RlbXBsYXRlIj4NCi0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3RPSl9vQ1g1RWQyS25KMnlqTlhoV1EiIGFubm90YXRlZEVsZW1lbnQ9Il90T0pfbnlYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDxib2R5PkEgUHJvY2VzcyBQbGFubmluZyBUZW1wbGF0ZSBpcyBhIHNwZWNpYWwgUHJvY2VzcyB0aGF0IGlzIHByZXBhcmVkIGZvciBpbnN0YW50aWF0aW9uIGJ5IGEgcHJvamVjdCBwbGFubmluZyB0b29sLiAgVHlwaWNhbGx5LCBpdCBpcyBjcmVhdGVkIGJhc2VkIG9uIGEgUHJvY2VzcyBzdWNoIGFzIGEgRGVsaXZlcnkgUHJvY2VzcyBhcyBhIHdob2xlIChlLmcuIGluIGNhc2Ugb2YgYSB3YXRlcmZhbGwtYmFzZWQgZGV2ZWxvcG1lbnQgYXBwcm9hY2gpIG9yIGluIHBhcnRzIChlLmcuIGluIGNhc2Ugb2YgYW4gaXRlcmF0aXZlIGRldmVsb3BtZW50IGFwcHJvYWNoKS4NCi1BIFByb2Nlc3MgUGxhbm5pbmcgVGVtcGxhdGUgcmVwcmVzZW50cyBhIHBhcnRpYWxseSBmaW5pc2hlZCBwbGFuIGZvciBhIGNvbmNyZXRlIHByb2plY3QuICBJdCB1c2VzIHRoZSBzYW1lIGluZm9ybWF0aW9uIHN0cnVjdHVyZXMgYXMgYWxsIG90aGVyIFByb2Nlc3MgVHlwZXMgdG8gcmVwcmVzZW50IHRlbXBsYXRlcyBmb3IgcHJvamVjdCBwbGFucy4gIEhvd2V2ZXIsIGNlcnRhaW4gcGxhbm5pbmcgZGVjaXNpb25zIGhhdmUgYWxyZWFkeSBiZWVuIGFwcGxpZWQgdG8gdGhlIHRlbXBsYXRlIGFzIHdlbGwgYXMgaW5mb3JtYXRpb24gaGFzIGJlZW4gcmVtb3ZlZCBhbmQvb3IgcmVmb3JtYXR0ZWQgdG8gYmUgcmVhZHkgZm9yIGV4cG9ydCB0byBhIHNwZWNpZmljIHBsYW5uaW5nIHRvb2wuICBFeGFtcGxlcyBmb3Igc3VjaCBkZWNpc2lvbnMgYXJlOiBhIHRlbXBsYXRlIGhhcyBiZWVuIGNyZWF0ZWQgdG8gcmVwcmVzZW50IGEgcGxhbiBmb3IgYSBwYXJ0aWN1bGFyIEl0ZXJhdGlvbiBpbiBhbiBpdGVyYXRpdmUgZGV2ZWxvcG1lbnQgcHJvamVjdCwgd2hpY2ggZnIgZXhhbXBsZSBkaXN0aW5ndWlzaGVzIGVhcmx5IGZyb20gbGF0ZSBpdGVyYXRpb25zIGluIHRoZSBFbGFib3JhdGlvbiBwaGFzZSBvZiBhIHByb2plY3Q7IGlmIHRoZSB0YXJnZXRlZCBwbGFubmluZyB0b29sIGNhbm5vdCByZXByZXNlbnQgaW5wdXQgYW5kIG91dHB1dCBvZiBUYXNrLCB0aGVuIHRoZXNlIGhhdmUgYmVlbiByZW1vdmVkIGZyb20gdGhlIHN0cnVjdHVyZTsgY2VydGFpbiByZXBldGl0aW9ucyBoYXZlIGJlZW4gYWxyZWFkeSBhcHBsaWVkLCBlLmcuIHN0YXRpbmcgdGhhdCBhIGN5Y2xlIG9mIHNwZWNpZmljIFRhc2sgZ3JvdXBlZCBpbiBhbiBBY3Rpdml0eSBoYXZlIHRvIGJlIHJlcGVhdGVkIG4tdGltZXM7IGV0Yy4NCi08L2JvZHk+DQotICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3RPSl9vU1g1RWQyS25KMnlqTlhoV1EiIGdlbmVyYWw9Il90T0pfbVNYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3RPSl9vaVg1RWQyS25KMnlqTlhoV1EiIG5hbWU9ImJhc2VkT25Qcm9jZXNzZXMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3RPSl9tU1g1RWQyS25KMnlqTlhoV1EiIGFzc29jaWF0aW9uPSJfdE9USmhTWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il90T0pfb3lYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfdE9KX3BDWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3RPSl9wU1g1RWQyS25KMnlqTlhoV1EiIG5hbWU9IlJvYWRtYXAiPg0KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfdE9KX3BpWDVFZDJLbkoyeWpOWGhXUSIgYW5ub3RhdGVkRWxlbWVudD0iX3RPSl9wU1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPGJvZHk+QSBSb2FkbWFwIGlzIGEgc3BlY2lhbCBHdWlkYW5jZSBUeXBlIHdoaWNoIGlzIG9ubHkgcmVsYXRlZCB0byBBY3RpdmF0ZXMgYW5kIHRoZXJlZm9yZSBoYXMgYmVlbiBhZGRlZCBieSB0aGlzIHBhY2thZ2UgdG8gdGhlIGxpc3Qgb2YgR3VpZGFuY2UgVHlwZXMgcmF0aGVyIHRoYW4gbGlzdGVkIGluIHRoZSBHdWlkYW5jZSBUeXBlcyBwYWNrYWdlLiAgQSBSb2FkbWFwIHJlcHJlc2VudHMgYSBsaW5lYXIgd2Fsa3Rocm91Z2ggb2YgYW4gQWN0aXZpdHksIHR5cGljYWxseSBhIFByb2Nlc3MuDQotQW4gaW5zdGFuY2Ugb2YgYSBSb2FkbWFwIHJlcHJlc2VudHMgaW1wb3J0YW50IGRvY3VtZW50YXRpb24gZm9yIHRoZSBBY3Rpdml0eSBvciBQcm9jZXNzIGl0IGlzIHJlbGF0ZWQgdG8uICBPZnRlbiBhIGNvbXBsZXggQWN0aXZpdHkgc3VjaCBhcyBhIFByb2Nlc3MgY2FuIGJlIG11Y2ggZWFzaWVyIHVuZGVyc3Rvb2QgYnkgcHJvdmlkaW5nIGEgd2Fsa3Rocm91Z2ggd2l0aCBhIGxpbmVhciB0aHJlYWQgb2YgYSB0eXBpY2FsIGluc3RhbnRpYXRpb24gb2YgdGhpcyBBY3Rpdml0eS4gIEluIGFkZGl0aW9uIHRvIG1ha2luZyB0aGUgcHJvY2VzcyBwcmFjdGl0aW9uZXIgdW5kZXJzdGFuZCBob3cgd29yayBpbiB0aGUgcHJvY2VzcyBpcyBiZWluZyBwZXJmb3JtZWQsIGEgUm9hZG1hcCBwcm92aWRlcyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGFib3V0IGhvdyBBY3Rpdml0aWVzIGFuZCBUYXNrcyByZWxhdGUgdG8gZWFjaCBvdGhlciBvdmVyIHRpbWUuICBSb2FkbWFwcyBhcmUgYWxzbyB1c2VkIHRvIHNob3cgaG93IHNwZWNpZmljIGFzcGVjdHMgYXJlIGRpc3RyaWJ1dGVkIG92ZXIgYSB3aG9sZSBwcm9jZXNzIHByb3ZpZGluZyBhIGtpbmQgb2YgZmlsdGVyIG9uIHRoZSBwcm9jZXNzIGZvciB0aGlzIGluZm9ybWF0aW9uLg0KLTwvYm9keT4NCi0gICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfdE9KX3B5WDVFZDJLbkoyeWpOWGhXUSIgZ2VuZXJhbD0iX3RESWJjeVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfdEdaeHdTWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iRGlzY2lwbGluZSI+DQotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il90R1p4d2lYNUVkMktuSjJ5ak5YaFdRIiBhbm5vdGF0ZWRFbGVtZW50PSJfdEdaeHdTWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8Ym9keT5BIERpc2NpcGxpbmUgaXMgYSBjYXRlZ29yaXphdGlvbiBvZiB3b3JrIChpLmUuIFRhc2tzIGZvciBNZXRob2QgQ29udGVudCksIGJhc2VkIHVwb24gc2ltaWxhcml0eSBvZiBjb25jZXJucyBhbmQgY29vcGVyYXRpb24gb2Ygd29yayBlZmZvcnQuDQotQSBkaXNjaXBsaW5lIGlzIGEgY29sbGVjdGlvbiBvZiBUYXNrcyB0aGF0IGFyZSByZWxhdGVkIHRvIGEgbWFqb3IgJ2FyZWEgb2YgY29uY2Vybicgd2l0aGluIHRoZSBvdmVyYWxsIHByb2plY3QuIFRoZSBncm91cGluZyBvZiBUYXNrcyBpbnRvIGRpc2NpcGxpbmVzIGlzIG1haW5seSBhbiBhaWQgdG8gdW5kZXJzdGFuZGluZyB0aGUgcHJvamVjdCBmcm9tIGEgJ3RyYWRpdGlvbmFsJyB3YXRlcmZhbGwgcGVyc3BlY3RpdmUuIEhvd2V2ZXIsIHR5cGljYWxseSwgZm9yIGV4YW1wbGUsIGl0IGlzIG1vcmUgY29tbW9uIHRvIHBlcmZvcm0gY2VydGFpbiByZXF1aXJlbWVudHMgYWN0aXZpdGllcyBpbiBjbG9zZSBjb29yZGluYXRpb24gd2l0aCBhbmFseXNpcyBhbmQgZGVzaWduIGFjdGl2aXRpZXMuIFNlcGFyYXRpbmcgdGhlc2UgYWN0aXZpdGllcyBpbnRvIHNlcGFyYXRlIGRpc2NpcGxpbmVzIG1ha2VzIHRoZSBhY3Rpdml0aWVzIGVhc2llciB0byBjb21wcmVoZW5kLg0KLTwvYm9keT4NCi0gICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3RPSl9yU1g1RWQyS25KMnlqTlhoV1EiIGFubm90YXRlZEVsZW1lbnQ9Il90R1p4d1NYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDxib2R5PkRpc2NpcGxpbmUgaXMgYSBjYXRlZ29yaXphdGlvbiBvZiBUYXNrcyBiYXNlZCB1cG9uIHNpbWlsYXJpdHkgb2YgY29uY2VybnMgYW5kIGNvb3BlcmF0aW9uIG9mIHdvcmsgZWZmb3J0LiAgVGhpcyBpcyB0aGUgZXh0ZW5zaW9ucyBvZiBEaXNjaXBsaW5lIGRlZmluZWQgaW4gdGhlIE1ldGhvZCBDb3JlIHBhY2thZ2UgYWRkaW5nIGFuIGFkZGl0aW9uYWwgYXNzb2NpYXRpb24gdG8gQWN0aXZpdGllcywgd2hpY2ggcmVwcmVzZW50IHR5cGljYWwgc3RhbmRhcmQgb3IgcmVmZXJlbmNlIHdheXMgb2YgbWVhbmluZ2Z1bCBncm91cGluZ3Mgb2YgdGhlIERpc2NpcGxpbmUncyBUYXNrcyBpbnRvIHdvcmtmbG93cy4NCi1UYXNrcyByZXByZXNlbnQgZGVzY3JpcHRpb25zIG9mIHdvcmssIHdoaWNoIGFyZSBjYXRlZ29yaXplZCBieSBEaXNjaXBsaW5lcy4gIFRoZSByZWFzb24gdGhhdCBzZXZlcmFsIFRhc2tzIGFyZSBhbGwgY2F0ZWdvcml6ZWQgYnkgdGhlIHNhbWUgRGlzY2lwbGluZSBpcyB0aGF0IHRoZXkgYWxsIHJlcHJlc2VudCBhIHBhcnQgaW4gYWNoaWV2aW5nIGEgaGlnaGVyIGdvYWwgb3IgcGVyZm9ybWluZyB3b3JrIHRoYXQgaXMgYWxsIHJlbGF0ZWQgdG8gZWFjaCBvdGhlci4gIEV2ZXJ5IERpc2NpcGxpbmUgZGVmaW5lcyBzdGFuZGFyZCB3YXlzIG9mIGRvaW5nIHRoZSB3b3JrIGl0IGNhdGVnb3JpemVzLiAgU3VjaCBzdGFuZGFyZCB3YXlzIGFyZSBleHByZXNzIGJ5IEFjdGl2aXRpZXMgb3IgQ2FwYWJpbGl0eSBQYXR0ZXJucyBkZWZpbmluZyBob3cgdGhlIFRhc2tzIGNhdGVnb3JpemVkIGJ5IHRoZSBEaXNjaXBsaW5lICd3b3JrIHRvZ2V0aGVyJyBpbiB0aGUgbW9zdCBnZW5lcmljIHdheS4gIFRoZXNlIHJlZmVyZW5jZSB3b3JrZmxvd3MgYXJlIG9mdGVuIHVzZWQgZm9yIGVkdWNhdGluZyBhbmQgdGVhY2hpbmcgcHJhY3RpdGlvbmVycy4gDQotPC9ib2R5Pg0KLSAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il90R1p4d3lYNUVkMktuSjJ5ak5YaFdRIiBnZW5lcmFsPSJfdEdaeDN5WDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il90R1p4eENYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJ0YXNrcyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdERJYldpWDVFZDJLbkoyeWpOWGhXUSIgYXNzb2NpYXRpb249Il90R2ppOUNYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3RHWnh4U1g1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIqIi8+DQotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il90R1p4eGlYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfdEdaeHh5WDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0ic3ViZGlzY2lwbGluZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdEdaeHdTWDVFZDJLbkoyeWpOWGhXUSIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgYXNzb2NpYXRpb249Il90R2ppLVNYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3RHWnh5Q1g1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIqIi8+DQotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il90R1p4eVNYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfdE9KX3JpWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0icmVmZXJlbmNlV29ya2Zsb3dzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il90S2xISUNYNUVkMktuSjJ5ak5YaFdRIiBhc3NvY2lhdGlvbj0iX3RPVEpuaVg1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfdE9KX3J5WDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IioiLz4NCi0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3RPSl9zQ1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il90RUs5UHlYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJQcmFjdGljZSI+DQotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il90RUs5UUNYNUVkMktuSjJ5ak5YaFdRIiBhbm5vdGF0ZWRFbGVtZW50PSJfdEVLOVB5WDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8Ym9keT5BIFByYWN0aWNlIHJlcHJlc2VudHMgYSBwcm92ZW4gd2F5IG9yIHN0cmF0ZWd5IG9mIGRvaW5nIHdvcmsgdG8gYWNoaWV2ZSBhIGdvYWwgdGhhdCBoYXMgYSBwb3NpdGl2ZSBpbXBhY3Qgb24gd29yayBwcm9kdWN0IG9yIHByb2Nlc3MgcXVhbGl0eS4gIFByYWN0aWNlcyBhcmUgZGVmaW5lZCBvcnRob2dvbmFsIHRvIG1ldGhvZHMgYW5kIHByb2Nlc3Nlcy4gIFRoZXkgY291bGQgc3VtbWFyaXplIGFzcGVjdHMgdGhhdCBpbXBhY3QgbWFueSBkaWZmZXJlbnQgcGFydHMgb2YgYSBtZXRob2Qgb3Igc3BlY2lmaWMgcHJvY2Vzc2VzLiAgRXhhbXBsZXMgZm9yIHByYWN0aWNlcyB3b3VsZCBiZSAmcXVvdDtNYW5hZ2UgUmlza3MmcXVvdDssICZxdW90O0NvbnRpbnVvdXNseSB2ZXJpZnkgcXVhbGl0eSZxdW90OywgJnF1b3Q7QXJjaGl0ZWN0dXJlLWNlbnRyaWMgYW5kIGNvbXBvbmVudC1iYXNlZCBkZXZlbG9wbWVudCZxdW90OywgZXRjLg0KLTwvYm9keT4NCi0gICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfdEVLOVFTWDVFZDJLbkoyeWpOWGhXUSIgZ2VuZXJhbD0iX3RESWJjeVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfdEVLOVFpWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0ic3ViUHJhY3RpY2VzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il90RUs5UHlYNUVkMktuSjJ5ak5YaFdRIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBhc3NvY2lhdGlvbj0iX3RFVXVXaVg1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfdEVLOVF5WDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IioiLz4NCi0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3RFSzlSQ1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il90RUs5UlNYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJjb250ZW50UmVmZXJlbmNlcyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdEI4SW5DWDVFZDJLbkoyeWpOWGhXUSIgYXNzb2NpYXRpb249Il90RVV1WFNYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3RFSzlSaVg1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIqIi8+DQotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il90RUs5UnlYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfdE9KX3NTWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iYWN0aXZpdHlSZWZlcmVuY2VzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il90S2xISUNYNUVkMktuSjJ5ak5YaFdRIiBhc3NvY2lhdGlvbj0iX3RPVEpveVg1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfdE9KX3NpWDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IioiLz4NCi0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3RPSl9zeVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il90T0pfdENYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJDYXBhYmlsaXR5UGF0dGVybiI+DQotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il90T0pfdFNYNUVkMktuSjJ5ak5YaFdRIiBhbm5vdGF0ZWRFbGVtZW50PSJfdE9KX3RDWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8Ym9keT5BIENhcGFiaWxpdHkgUGF0dGVybiBpcyBhIHNwZWNpYWwgUHJvY2VzcyB0aGF0IGRlc2NyaWJlcyBhIHJldXNhYmxlIGNsdXN0ZXIgb2YgZG9pbmcgd29yayBpbiBjb21tb24gcHJvY2VzcyBhcmVhcy4gIENhcGFiaWxpdGllcyBQYXR0ZXJucyBleHByZXNzIGFuZCBjb21tdW5pY2F0ZSBwcm9jZXNzIGtub3dsZWRnZSBmb3IgYSBrZXkgYXJlYSBvZiBpbnRlcmVzdCBzdWNoIGFzIGEgRGlzY2lwbGluZSBhbmQgY2FuIGJlIGRpcmVjdGx5IHVzZWQgYnkgcHJvY2VzcyBwcmFjdGl0aW9uZXIgdG8gZ3VpZGUgaGlzIHdvcmsuICBUaGV5IGFyZSBhbHNvIHVzZWQgYXMgYnVpbGRpbmcgYmxvY2tzIHRvIGFzc2VtYmxlIERlbGl2ZXJ5IFByb2Nlc3NlcyBvciBsYXJnZXIgQ2FwYWJpbGl0eSBQYXR0ZXJucyBlbnN1cmluZyBvcHRpbWFsIHJldXNlIGFuZCBhcHBsaWNhdGlvbiBvZiB0aGUga2V5IHByYWN0aWNlcyB0aGV5IGV4cHJlc3MuDQotQSBDYXBhYmlsaXR5IFBhdHRlcm4gaXMgYSBzcGVjaWFsIFByb2Nlc3MgdGhhdCBkZXNjcmliZXMgYSByZXVzYWJsZSBjbHVzdGVyIG9mIGRvaW5nIHdvcmsgaW4gYSBnZW5lcmFsIHByb2Nlc3MgYXJlYSB0aGF0IHByb3ZpZGVzIGEgY29uc2lzdGVudCBkZXZlbG9wbWVudCBhcHByb2FjaCB0byBjb21tb24gcHJvYmxlbXMuICBFeGFtcGxlcyBmb3IgQ2FwYWJpbGl0eSBQYXR0ZXJuIGNvdWxkIGJlICd1c2UgY2FzZS1iYXNlZCByZXF1aXJlbWVudHMgbWFuYWdlbWVudCcsICd1c2UgY2FzZSBhbmFseXNpcycsIG9yICd1bml0IHRlc3RpbmcnLiBUeXBpY2FsbHkgYnV0IG5vdCBuZWNlc3NhcmlseSwgQ2FwYWJpbGl0eSBQYXR0ZXJucyBoYXZlIHRoZSBzY29wZSBvZiBvbmUgZGlzY2lwbGluZSBwcm92aWRpbmcgYSBicmVha2Rvd24gb2YgcmV1c2FibGUgY29tcGxleCBBY3Rpdml0aWVzLCByZWxhdGlvbnNoaXBzIHRvIHRoZSBSb2xlcyB3aGljaCBwZXJmb3JtIFRhc2tzIHdpdGhpbiB0aGVzZSBBY3Rpdml0aWVzLCBhcyB3ZWxsIGFzIHRvIHRoZSBXb3JrIFByb2R1Y3RzIHRoYXQgYXJlIHVzZWQgYW5kIHByb2R1Y2VkLiAgQSBjYXBhYmlsaXR5IHBhdHRlcm4gZG9lcyBub3QgcmVsYXRlIHRvIGFueSBzcGVjaWZpYyBwaGFzZSBvciBpdGVyYXRpb24gb2YgYSBkZXZlbG9wbWVudCBsaWZlY3ljbGUsIGFuZCBzaG91bGQgbm90IGltcGx5IGFueS4gIEluIG90aGVyIHdvcmRzLCBhIHBhdHRlcm4gc2hvdWxkIGJlIGRlc2lnbmVkIGluIGEgd2F5IHRoYXQgaXQgaXMgYXBwbGljYWJsZSBhbnl3aGVyZSBpbiBhIERlbGl2ZXJ5IFByb2Nlc3MuICBUaGlzIGVuYWJsZXMgaXRzIEFjdGl2aXRpZXMgdG8gYmUgZmxleGlibHkgYXNzaWduZWQgdG8gd2hhdGV2ZXIgcGhhc2VzIHRoZXJlIGFyZSBpbiB0aGUgRGVsaXZlcnkgUHJvY2VzcyB0byB3aGljaCBpdCBpcyBiZWluZyBhcHBsaWVkLiAgSXQgaXMgYSBnb29kIHByYWN0aWNlIHRvIGRlc2lnbiBhIENhcGFiaWxpdHkgUGF0dGVybiB0byBwcm9kdWNlIG9uZSBvciBtb3JlIGdlbmVyaWMgRGVsaXZlcmFibGVzLiAgVGhlIHR5cGljYWwgY29uZmlndXJhdGlvbiBpcyB0aGF0IGVhY2ggQWN0aXZpdHkgaW4gdGhlIENhcGFiaWxpdHkgUGF0dGVybiBwcm9kdWNlcyBvbmUgRGVsaXZlcmFibGUsIGFuZCB0aGUgbGFzdCBUYXNrIERlc2NyaXB0b3IgaW4gdGhlIEFjdGl2aXR5IGV4cGxpY2l0bHkgb3V0cHV0cyBqdXN0IHRoaXMgRGVsaXZlcmFibGUuICBUaGlzIGVuYWJsZXMgdGhlIHByb2Nlc3MgZW5naW5lZXIgdG8gc2VsZWN0IFBhdHRlcm5zIG9yIGp1c3QgQWN0aXZpdGllcyBieSBkZWNpZGluZyB3aGljaCBEZWxpdmVyYWJsZXMgYXJlIHJlcXVpcmVkLiAgSXQgYWxzbyBvZmZlcnMgYSBzaW1wbGUgaW50ZWdyYXRpb24gYXBwcm9hY2g6IGFuIEFjdGl2aXR5IGZyb20gYSBjYXBhYmlsaXR5IHBhdHRlcm4gaXMgbGlua2VkIHRvIHRoZSBQaGFzZSBvciBJdGVyYXRpb24gd2hpY2ggaXMgcmVxdWlyZWQgdG8gcHJvZHVjZSB0aGUgQWN0aXZpdHkncyBEZWxpdmVyYWJsZS4gIEtleSBhcHBsaWNhdGlvbnMgYXJlYXMgb2YgLyBhcmVhcyBvZiByZXVzZSBmb3IgQ2FwYWJpbGl0eSBQYXR0ZXJucyBhcmU6DQotLSBUbyBzZXJ2ZSBhcyBidWlsZGluZyBibG9ja3MgZm9yIGFzc2VtYmxpbmcgRGVsaXZlcnkgUHJvY2Vzc2VzIG9yIGxhcmdlciBDYXBhYmlsaXR5IFBhdHRlcm5zLiAgTm9ybWFsbHkgZGV2ZWxvcGluZyBhIERlbGl2ZXJ5IFByb2Nlc3MgaXMgbm90IGRvbmUgZnJvbSBzY3JhdGNoIGJ1dCBieSBzeXN0ZW1hdGljYWxseSBhcHBseWluZyBhbmQgYmluZGluZyBwYXR0ZXJucy4gIEluIGFkZGl0aW9uIHRvIHRoZSBzdGFuZGFyZCBwYXR0ZXJuIGFwcGxpY2F0aW9uIG9mICdjb3B5LWFuZC1tb2RpZnknLCB3aGljaCBhbGxvd3MgdGhlIHByb2Nlc3MgZW5naW5lZXIgdG8gaW5kaXZpZHVhbGx5IGN1c3RvbWl6ZSB0aGUgcGF0dGVybidzIGNvbnRlbnQgdG8gdGhlIHBhcnRpY3VsYXIgc2l0dWF0aW9uIGl0IGlzIGFwcGxpZWQgZm9yLCB0aGUgUGx1Z2luIG1ldGEtbW9kZWwgcGFja2FnZSAoU2VjdGlvbiA2LjEpIGludHJvZHVjZXMgZXZlbiBtb3JlIHNvcGhpc3RpY2F0ZWQgaW5oZXJpdGFuY2UgcmVsYXRpb25zaGlwcyB0aGF0IHN1cHBvcnQgZHluYW1pYyBiaW5kaW5nIG9mIHBhdHRlcm5zIChpLmUuIHRoZSBwYXR0ZXJuIGlzIHJlZmVyZW5jZWQgYW5kIG5vdCBjb3BpZWQpLiAgVGhpcyB1bmlxdWUgbmV3IHdheSBvZiByZXVzaW5nIHByb2Nlc3Mga25vd2xlZGdlIGFsbG93cyB0byBmYWN0b3Igb3V0IGNvbW1vbmx5IHJlb2NjdXJyaW5nIEFjdGl2aXRpZXMgaW50byBwYXR0ZXJucyBhbmQgdG8gYXBwbHkgdGhlbSBvdmVyIGFuZCBvdmVyIGFnYWluIGZvciBhIHByb2Nlc3MuICBXaGVuIHRoZSBwYXR0ZXJuIGlzIGJlaW5nIHJldmlzZWQgb3IgdXBkYXRlZCwgYWxsIGNoYW5nZXMgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IHJlZmxlY3RlZCBpbiBhbGwgcGF0dGVybiBhcHBsaWNhdGlvbiBpbiBhbGwgcHJvY2Vzc2VzIGJlY2F1c2Ugb2YgdGhlIGR5bmFtaWMgYmluZGluZy4NCi0tIFRvIHN1cHBvcnQgZGlyZWN0IGV4ZWN1dGlvbiBpbiBhIGRldmVsb3BtZW50IHByb2plY3QgdGhhdCBkb2VzIG5vdCB3b3JrIGZvbGxvd2luZyBhIHdlbGwtZGVmaW5lZCBwcm9jZXNzLCBidXQgd29ya3MgYmFzZWQgb24gbG9vc2VseSBjb25uZWN0ZWQgcHJvY2VzcyBmcmFnbWVudHMgb2YgYmVzdCBwcmFjdGljZXMgaW4gYSBmbGV4aWJsZSBtYW5uZXIgKGUuZy4gQWdpbGUgRGV2ZWxvcG1lbnQpLg0KLS0gVG8gc3VwcG9ydCBwcm9jZXNzIGVkdWNhdGlvbiBieSBkZXNjcmliaW5nIGtub3dsZWRnZSBmb3IgYSBrZXkgYXJlYSBzdWNoIGFzIGJlc3QgcHJhY3RpY2VzIG9uIGhvdyB0byBwZXJmb3JtIHRoZSB3b3JrIGZvciBhIERpc2NpcGxpbmUgKGUuZy4gUmVxdWlyZW1lbnRzIE1hbmFnZW1lbnQpLCBmb3IgYSBzcGVjaWZpYyBkZXZlbG9wbWVudCB0ZWNobmlxdWUgKGFzcGVjdC1vcmllbnRlZCBkZXZlbG9wbWVudCksIG9yIGEgc3BlY2lmaWMgdGVjaG5pY2FsIGFyZWEgKGUuZy4gcmVsYXRpb25hbCBkYXRhYmFzZSBkZXNpZ24pLCB3aGljaCBpcyB1c2VkIGZvciBlZHVjYXRpb24gYW5kIHRlYWNoaW5nLg0KLTwvYm9keT4NCi0gICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfdE9KX3RpWDVFZDJLbkoyeWpOWGhXUSIgZ2VuZXJhbD0iX3RPSl9tU1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfdE9USmdDWDVFZDJLbkoyeWpOWGhXUSIgbWVtYmVyRW5kPSJfdE9KX25DWDVFZDJLbkoyeWpOWGhXUSBfdE9USmdpWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il90T1RKZ1NYNUVkMktuSjJ5ak5YaFdRIiBhbm5vdGF0ZWRFbGVtZW50PSJfdE9USmdDWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8Ym9keT5UaGlzIGFzc29jaWF0aW9uIHByb3ZpZGVzIHRyYWNlYWJpbGl0eSBmb3IgYSBQcm9jZXNzIGRvY3VtZW50aW5nIHdoaWNoIENhcGFiaWxpdHkgUGF0dGVybnMgaGF2ZSBiZWVuIHVzZWQgZm9yIGRlZmluaW5nIHRoZSBwcm9jZXNzLiAgSXQgZG9jdW1lbnRzIGFwcGxpY2F0aW9ucyBvZiBhIHBhdHRlcm4gdGhyb3VnaCBjb3B5IGFzIHdlbGwgYXMgcGF0dGVybiBiaW5kaW5nLjwvYm9keT4NCi0gICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfdE9USmdpWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iX3Byb2Nlc3MiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3RPSl9tU1g1RWQyS25KMnlqTlhoV1EiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il90T1RKZ0NYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3RPVEpneVg1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIqIi8+DQotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il90T1RKaENYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgPC9vd25lZEVuZD4NCi0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfdE9USmhTWDVFZDJLbkoyeWpOWGhXUSIgbWVtYmVyRW5kPSJfdE9KX29pWDVFZDJLbkoyeWpOWGhXUSBfdE9USmh5WDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il90T1RKaGlYNUVkMktuSjJ5ak5YaFdRIiBhbm5vdGF0ZWRFbGVtZW50PSJfdE9USmhTWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8Ym9keT5JZiB0aGUgUGxhbiBoYXMgYmVlbiBjcmVhdGVkIGJhc2VkIG9uIG9uZSBvciBtb3JlIHByb2Nlc3NlcyAoaS5lLiBvdGhlciBQbGFucywgQ2FwYWJpbGl0eSBQYXR0ZXJucywgYSBEZWxpdmVyeSBQcm9jZXNzLCBvciBhbnkgY29tYmluYXRpb24gb2YgdGhlc2UpLCB0aGVuIHRoaXMgYXNzb2NpYXRpb24gY2FwdHVyZXMgYSB0cmFjZSBiYWNrIHRvIHRoZXNlIHNvdXJjZXMuPC9ib2R5Pg0KLSAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il90T1RKaHlYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJfcHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3RPSl9ueVg1RWQyS25KMnlqTlhoV1EiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il90T1RKaFNYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3RPVEppQ1g1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIqIi8+DQotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il90T1RKaVNYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgPC9vd25lZEVuZD4NCi0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfdE9USmlpWDVFZDJLbkoyeWpOWGhXUSIgbWVtYmVyRW5kPSJfdEtsSGN5WDVFZDJLbkoyeWpOWGhXUSBfdE9USmpDWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il90T1RKaXlYNUVkMktuSjJ5ak5YaFdRIiBhbm5vdGF0ZWRFbGVtZW50PSJfdE9USmlpWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8Ym9keT5UaGUgUGxhbm5pbmdEYXRhIGNsYXNzIGZhY3RvcnMgb3V0IHNwZWNpZmljIG9wdGlvbmFsIGRhdGEgbmVlZGVkIGZvciByZXByZXNlbnRpbmcgcGxhbm5pbmcgdGVtcGxhdGVzLiAgVGhpcyBhc3NvY2lhdGlvbiBhbGxvd3MgdG8gYWNjZXNzIHBsYW5uaW5nIGRhdGEgaWYgaXQgaXMgc3RvcmVkIGZvciB0aGUgQnJlYWtkb3duIEVsZW1lbnQuPC9ib2R5Pg0KLSAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il90T1RKakNYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJfYnJlYWtkb3duRWxlbWVudCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdEtsSFd5WDVFZDJLbkoyeWpOWGhXUSIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iX3RPVEppaVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfdE9USmpTWDVFZDJLbkoyeWpOWGhXUSIgbWVtYmVyRW5kPSJfdE9KX3FpWDVFZDJLbkoyeWpOWGhXUSBfdE9USmp5WDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il90T1RKamlYNUVkMktuSjJ5ak5YaFdRIiBhbm5vdGF0ZWRFbGVtZW50PSJfdE9USmpTWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8Ym9keT5UaGlzIGFzc29jaWF0aW9uIGxpbmtzIGFuIEFjdGl2aXR5IHRvIHplcm8gb3IgbW9yZXMgaW5zdGFuY2VzIG9mIHRoZSBSb2FkbWFwIGd1aWRhbmNlIHR5cGUuPC9ib2R5Pg0KLSAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il90T1RKanlYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJhY3Rpdml0eSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdEtsSElDWDVFZDJLbkoyeWpOWGhXUSIgYXNzb2NpYXRpb249Il90T1RKalNYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3RPVEprQ1g1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIxIi8+DQotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il90T1RKa1NYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iMSIvPg0KLSAgICAgIDwvb3duZWRFbmQ+DQotICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3RPVEpraVg1RWQyS25KMnlqTlhoV1EiIG1lbWJlckVuZD0iX3RPVEpsQ1g1RWQyS25KMnlqTlhoV1EgX3RPSl9reVg1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfdE9USmt5WDVFZDJLbkoyeWpOWGhXUSIgYW5ub3RhdGVkRWxlbWVudD0iX3RPVEpraVg1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPGJvZHk+VGhpcyBhc3NvY2lhdGlvbiBkZWZpbmVzIGEgY29sbGVjdGlvbiBvZiBndWlkYW5jZSBkb2N1bWVudHMgdGhhdCBwcm92aWRlIGVkdWNhdGlvbiBtYXRlcmlhbCBmb3IgdGVhY2hpbmcgc3Rha2Vob2xkZXJzIHN1Y2ggYXMgcHJvamVjdCBtYW5hZ2VycyBvbiBob3cgdG8gcGVyZm9ybSBwcm9qZWN0cyB0aGF0IGZvbGxvdyB0aGlzIERlbGl2ZXJ5IFByb2Nlc3MuPC9ib2R5Pg0KLSAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il90T1RKbENYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJfZGVsaXZlcnlQcm9jZXNzIiB2aXNpYmlsaXR5PSJwcml2YXRlIiB0eXBlPSJfdE9KX2tDWDVFZDJLbkoyeWpOWGhXUSIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iX3RPVEpraVg1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfdE9USmxTWDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IioiLz4NCi0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3RPVEpsaVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICA8L293bmVkRW5kPg0KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il90T1RKbHlYNUVkMktuSjJ5ak5YaFdRIiBtZW1iZXJFbmQ9Il90T1RKbVNYNUVkMktuSjJ5ak5YaFdRIF90T0pfbGlYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3RPVEptQ1g1RWQyS25KMnlqTlhoV1EiIGFubm90YXRlZEVsZW1lbnQ9Il90T1RKbHlYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDxib2R5PlRoaXMgYXNzb2NpYXRpb24gZGVmaW5lcyBhIGNvbGxlY3Rpb24gb2YgZ3VpZGFuY2UgZG9jdW1lbnRzIHRoYXQgaGF2ZSBiZWVuIHJlbGF0ZWQgdG8gYSBEZWxpdmVyeSBQcm9jZXNzIGluc3RhbmNlIHRvIGRlc2NyaWJlIGFuZCBjaGFyYWN0ZXJpemUgaXRzIGZlYXR1cmVzIGFuZCBjYXBhYmlsaXRpZXMuIFRoZXNlIGRvY3VtZW50cyBjYW4gYmUgdXNlZCBmb3Igc2V2ZXJhbCBwdXJwb3NlcyBzdWNoIGFzIGludGVybmFsIG1hcmtldGluZyBjb21tdW5pY2F0aW9ucywgc2FsZXMgdHJhaW5pbmcgYW5kIGdlbmVyYWwgbWV0aG9kIGVkdWNhdGlvbi4gIEV4YW1wbGVzIGZvciBDb21tdW5pY2F0aW9ucyBNYXRlcmlhbCBhcmUgSGlnaGxpZ2h0IERvY3VtZW50LCBGYWN0IFNoZWV0LCBhbmQgRGVsaXZlcnkgUHJvY2VzcyBTcGVjaWZpY2F0aW9uIE92ZXJ2aWV3LjwvYm9keT4NCi0gICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfdE9USm1TWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iX2RlbGl2ZXJ5UHJvY2VzcyIgdmlzaWJpbGl0eT0icHJpdmF0ZSIgdHlwZT0iX3RPSl9rQ1g1RWQyS25KMnlqTlhoV1EiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il90T1RKbHlYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3RPVEptaVg1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIqIi8+DQotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il90T1RKbXlYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgPC9vd25lZEVuZD4NCi0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfdE9USm5DWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iQnJlYWtkb3duTmVzdGluZyIgbWVtYmVyRW5kPSJfdEtsSGRpWDVFZDJLbkoyeWpOWGhXUSBfdEtsSEpDWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il90T1RKblNYNUVkMktuSjJ5ak5YaFdRIiBhbm5vdGF0ZWRFbGVtZW50PSJfdE9USm5DWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8Ym9keT5UaGlzIGJpZGlyZWN0aW9uYWwgYXNzb2NpYXRpb24gcmVwcmVzZW50cyBicmVha2Rvd24gc3RydWN0dXJlIG5lc3RpbmcuICBJdCBkZWZpbmVzIGFuIG4tbGV2ZWwgaGllcmFyY2h5IG9mIEFjdGl2aXRpZXMgZ3JvdXBpbmcgdG9nZXRoZXIgb3RoZXIgQnJlYWtkb3duIEVsZW1lbnRzIHN1Y2ggYXMgb3RoZXIgQWN0aXZpdGllcywgRGVzY3JpcHRvcnMsIE1pbGVzdG9uZXMsIGV0Yy4NCi1UaGUgc3VwZXJBY3Rpdml0aWVzIHJvbGUgYWxsb3dzIG5hdmlnYXRpb24gb2YgYSBCcmVha2Rvd24gRWxlbWVudCB0byBpcyBwYXJlbnQgQWN0aXZpdHkuIFRoZSBicmVha2Rvd25FbGVtZW50cyByb2xlIGFsbG93cyBuYXZpZ2F0aW9uIGZyb20gYW4gQWN0aXZpdHkgdG8gaXRzIG5lc3RlZCBCcmVha2Rvd24gRWxlbWVudHMuDQotPC9ib2R5Pg0KLSAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il90T1RKbmlYNUVkMktuSjJ5ak5YaFdRIiBtZW1iZXJFbmQ9Il90T0pfcmlYNUVkMktuSjJ5ak5YaFdRIF90T1RKb0NYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3RPVEpueVg1RWQyS25KMnlqTlhoV1EiIGFubm90YXRlZEVsZW1lbnQ9Il90T1RKbmlYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDxib2R5PlRoaXMgYXNzb2NpYXRpb24gcHJvdmlkZXMgb25lIG1vcmUgcmVmZXJlbmNlIHdvcmtmbG93cyBmb3IgYSBEaXNjaXBsaW5lLiAgVGhlIHJlZmVyZW5jZSB3b3JrZmxvd3MgZGVmaW5lIHRoZSBtb3N0IHR5cGljYWwgd2F5cyBvZiBkb2luZyB0aGUgd29yayBvZiBhIERpc2NpcGxpbmUuPC9ib2R5Pg0KLSAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il90T1RKb0NYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJfZGlzY2lwbGluZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdEdaeHdTWDVFZDJLbkoyeWpOWGhXUSIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iX3RPVEpuaVg1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfdE9USm9TWDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IioiLz4NCi0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3RPVEpvaVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICA8L293bmVkRW5kPg0KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il90T1RKb3lYNUVkMktuSjJ5ak5YaFdRIiBtZW1iZXJFbmQ9Il90T0pfc1NYNUVkMktuSjJ5ak5YaFdRIF90T1RKcENYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfdE9USnBDWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iX3ByYWN0aWNlIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il90RUs5UHlYNUVkMktuSjJ5ak5YaFdRIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfdE9USm95WDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il90T1RKcFNYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfdE9USnBpWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgIDwvb3duZWRFbmQ+DQotICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3RPVEpweVg1RWQyS25KMnlqTlhoV1EiIG1lbWJlckVuZD0iX3RPVEoxQ1g1RWQyS25KMnlqTlhoV1EgX3RPVEpxU1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfdE9USnFDWDVFZDJLbkoyeWpOWGhXUSIgYW5ub3RhdGVkRWxlbWVudD0iX3RPVEpweVg1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPGJvZHk+VGhpcyBhc3NvY2lhdGlvbiBjYW4gYmUgdXNlZCB0byBsaW5rIGFsbCBraW5kcyBvZiBnZW5lcmFsIGd1aWRhbmNlIHRvIHRoZSBBY3Rpdml0eSB0aGF0IGlzIGJlaW5nIG1hbmFnZWQgYXMgZ2VuZXJhbCBTdXBwb3J0aW5nIE1hdGVyaWFsLjwvYm9keT4NCi0gICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfdE9USnFTWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iX2FjdGl2aXR5IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il90S2xIV3lYNUVkMktuSjJ5ak5YaFdRIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfdE9USnB5WDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il90T1RKcWlYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfdE9USnF5WDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgIDwvb3duZWRFbmQ+DQotICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3RPVEpyQ1g1RWQyS25KMnlqTlhoV1EiIG1lbWJlckVuZD0iX3RPVEp4U1g1RWQyS25KMnlqTlhoV1EgX3RPVEpyaVg1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfdE9USnJTWDVFZDJLbkoyeWpOWGhXUSIgYW5ub3RhdGVkRWxlbWVudD0iX3RPVEpyQ1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPGJvZHk+VGhpcyBhc3NvY2lhdGlvbiBwcm92aWRlcyBBY3Rpdml0eS0gKG9yIFByb2Nlc3MtKSBzcGVjaWZpYyBjaGVjayBwb2ludHMuICBUaGVzZSBhcmUgdHlwaWNhbGx5IHVzZWQgaW4gcmV2aWV3cyBhbmQgaW5zcGVjdGlvbnMgb24gdGhlIHdvcmsgcGVyZm9ybWVkLjwvYm9keT4NCi0gICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfdE9USnJpWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iX2FjdGl2aXR5IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il90S2xIV3lYNUVkMktuSjJ5ak5YaFdRIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfdE9USnJDWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il90T1RKcnlYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfdE9USnNDWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgIDwvb3duZWRFbmQ+DQotICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3RPVEpzU1g1RWQyS25KMnlqTlhoV1EiIG1lbWJlckVuZD0iX3RPVEp5Q1g1RWQyS25KMnlqTlhoV1EgX3RPVEpzeVg1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfdE9USnNpWDVFZDJLbkoyeWpOWGhXUSIgYW5ub3RhdGVkRWxlbWVudD0iX3RPVEpzU1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPGJvZHk+VGhpcyBhc3NvY2lhdGlvbiByZWxhdGVzIGNvbmNlcHRzIG9yIHdoaXRlcGFwZXJzIHRvIHRoZSBBY3Rpdml0eSBwcm92aWRpbmcgaW1wb3J0YW50IGJhY2tncm91bmQgaW5mb3JtYXRpb24gbmVjZXNzYXJ5IGZvciBkb2luZyB0aGUgd29yayBkZXNjcmliZWQgYnkgdGhlIEFjdGl2aXR5LjwvYm9keT4NCi0gICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfdE9USnN5WDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iX2FjdGl2aXR5IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il90S2xIV3lYNUVkMktuSjJ5ak5YaFdRIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfdE9USnNTWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il90T1RKdENYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfdE9USnRTWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgIDwvb3duZWRFbmQ+DQotICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3RPVEp0aVg1RWQyS25KMnlqTlhoV1EiIG1lbWJlckVuZD0iX3RPVEp5eVg1RWQyS25KMnlqTlhoV1EgX3RPVEp1Q1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfdE9USnR5WDVFZDJLbkoyeWpOWGhXUSIgYW5ub3RhdGVkRWxlbWVudD0iX3RPVEp0aVg1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPGJvZHk+VGhpcyBhc3NvY2lhdGlvbiBjYW4gcHJvdmlkZSByZWZlcmVuY2VzIHRvIGV4YW1wbGVzIHJlbGV2YW50IHRvIHRoaXMgc3BlY2lmaWMgQWN0aXZpdHkgKG9yIFByb2Nlc3MpLiAgPC9ib2R5Pg0KLSAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il90T1RKdUNYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJfYWN0aXZpdHkiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3RLbEhXeVg1RWQyS25KMnlqTlhoV1EiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il90T1RKdGlYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3RPVEp1U1g1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIqIi8+DQotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il90T1RKdWlYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgPC9vd25lZEVuZD4NCi0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfdE9USnV5WDVFZDJLbkoyeWpOWGhXUSIgbWVtYmVyRW5kPSJfdE9USnppWDVFZDJLbkoyeWpOWGhXUSBfdE9USnZTWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il90T1RKdkNYNUVkMktuSjJ5ak5YaFdRIiBhbm5vdGF0ZWRFbGVtZW50PSJfdE9USnV5WDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8Ym9keT5UaGlzIGFzc29jaWF0aW9uIHByb3ZpZGVzIEFjdGl2aXR5LXNwZWNpZmljIEd1aWRlbGluZXMuPC9ib2R5Pg0KLSAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il90T1RKdlNYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJfYWN0aXZpdHkiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3RLbEhXeVg1RWQyS25KMnlqTlhoV1EiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il90T1RKdXlYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3RPVEp2aVg1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIqIi8+DQotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il90T1RKdnlYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgPC9vd25lZEVuZD4NCi0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfdE9USndDWDVFZDJLbkoyeWpOWGhXUSIgbWVtYmVyRW5kPSJfdE9USjBTWDVFZDJLbkoyeWpOWGhXUSBfdE9USndpWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il90T1RKd1NYNUVkMktuSjJ5ak5YaFdRIiBhbm5vdGF0ZWRFbGVtZW50PSJfdE9USndDWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8Ym9keT5UaGlzIGFzc29jaWF0aW9uIHJlZmVycyB0byBSZXVzYWJsZSBBc3NldHMgc3BlY2lmaWMgdG8gdGhpcyBBY3Rpdml0eSAob3IgUHJvY2VzcykuIDwvYm9keT4NCi0gICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfdE9USndpWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iX2FjdGl2aXR5IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il90S2xIV3lYNUVkMktuSjJ5ak5YaFdRIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfdE9USndDWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il90T1RKd3lYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfdE9USnhDWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgIDwvb3duZWRFbmQ+DQotICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3RLbEhXeVg1RWQyS25KMnlqTlhoV1EiIG5hbWU9IkJyZWFrZG93bkVsZW1lbnQiIGlzQWJzdHJhY3Q9InRydWUiPg0KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfdEtsSFhDWDVFZDJLbkoyeWpOWGhXUSIgYW5ub3RhdGVkRWxlbWVudD0iX3RLbEhXeVg1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPGJvZHk+QnJlYWtkb3duIEVsZW1lbnQgaXMgYW4gYWJzdHJhY3QgZ2VuZXJhbGl6YXRpb24gZm9yIGFueSB0eXBlIG9mIE1ldGhvZCBFbGVtZW50IHRoYXQgaXMgcGFydCBvZiBhIGJyZWFrZG93biBzdHJ1Y3R1cmUuICBJdCBkZWZpbmVzIGEgc2V0IG9mIHByb3BlcnRpZXMgYXZhaWxhYmxlIHRvIGFsbCBvZiBpdHMgc3BlY2lhbGl6YXRpb25zLjwvYm9keT4NCi0gICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfdEtsSFhpWDVFZDJLbkoyeWpOWGhXUSIgZ2VuZXJhbD0iX3RLdVJKU1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfdEtsSFh5WDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0icHJlZml4IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il90QmZjdENYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfdEtsSFlDWDVFZDJLbkoyeWpOWGhXUSIgYW5ub3RhdGVkRWxlbWVudD0iX3RLbEhYeVg1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgICA8Ym9keT5QcmVmaXggcmVwcmVzZW50cyBhbiBhZGRpdGlvbmFsIGxhYmVsIHRoYXQgd2lsbCBiZSBwcmVzZW50ZWQgYXMgYSBwcmVmaXggdG8gYW55IEJyZWFrZG93biBFbGVtZW50IHRvIGluZGljYXRlIGEgdXNlci1kZWZpbmVkIHN1Yi10eXBlIGZvciB0aGUgZWxlbWVudC4gIEZvciBleGFtcGxlLCBpZiB0aGUgcHJvY2VzcyBlbmdpbmVlciB3b3VsZCBsaWtlIHRvIGRpc3Rpbmd1aXNoIGhpcyBBY3Rpdml0aWVzIGJ5ICdNb2R1bGUnIChhcyBkb25lIGluIHRoZSBJQk0gUmF0aW9uYWwgU3VtbWl0IEFzY2VuZGFudCBNZXRob2QpLCBoZSBjYW4gZGVmaW5lIGEgZGlmZmVyZW50IHByZWZpeCBmb3IgZXZlcnkgbW9kZWwgdG8gYmUgdXNlZCBpbiBhZGRpdGlvbiB0byBuYW1pbmcgQWN0aXZpdGllcywgZS5nLiAmcXVvdDtTUkEuRXN0YWJsaXNoIFJlcXVpcmVtZW50cyZxdW90OyB3aXRoIFNSQSBpbmRpY2F0aW5nIHRoYXQgdGhpcyBBY3Rpdml0eSBiZWxvbmdzIHRvIHRoZSAmcXVvdDtTb2Z0d2FyZSBSZXF1aXJlbWVudHMgQW5hbHlzaXMmcXVvdDsgbW9kdWxlLiAgQW5vdGhlciBjb21tb24gYXBwbGljYXRpb24gZm9yIHByZWZpeCBpcyB0byBxdWFsaWZ5IHJvbGVzIGluIFJvbGUgRGVzY3JpcHRvcnMuICBGb3IgZXhhbXBsZSwgJnF1b3Q7Q3VzdG9tZXIuQXJjaGl0ZWN0JnF1b3Q7IHdvdWxkIGRlZmluZSBhICZxdW90O0N1c3RvbWVyJnF1b3Q7IHByZWZpeCBmb3IgdGhlIFJvbGUgRGVzY3JpcHRvciAmcXVvdDtBcmNoaXRlY3QmcXVvdDsgZXhwcmVzc2luZyB0aGF0IHRoaXMgaXMgYW4gYXJjaGl0ZWN0IG9uIHRoZSBjdXN0b21lciBzaWRlIGFuZCBub3QgdGhlIGRldmVsb3BtZW50IHRlYW0gc2lkZS4NCi08L2JvZHk+DQotICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3RLbEhZU1g1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIxIi8+DQotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il90S2xIWWlYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfdEtsSFl5WDVFZDJLbkoyeWpOWGhXUSIgdHlwZT0iX3RCZmN0Q1g1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIiLz4NCi0gICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il90S2xIWkNYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJpc1BsYW5uZWQiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3RCb21neVg1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il90S2xIWlNYNUVkMktuSjJ5ak5YaFdRIiBhbm5vdGF0ZWRFbGVtZW50PSJfdEtsSFpDWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICAgIDxib2R5PkEga2V5IGFwcGxpY2F0aW9uIGZvciBEZXZlbG9wbWVudCBQcm9jZXNzZXMgZXhwcmVzc2VkIHdpdGggQnJlYWtkb3duIHN0cnVjdHVyZXMgaXMgdG8gZ2VuZXJhdGUgYSBwcm9qZWN0IHBsYW4gZnJvbSBpdC4gIEEgcHJvY2VzcyBhcyBkZWZpbmVkIGluIFVNQSAoY2YuIHdpdGggU2VjdGlvbnMgWFggYW5kIDUuMikgaXMgYSBtdWx0aS1kaW1lbnNpb25hbCBzdHJ1Y3R1cmUgZGVmaW5pbmcgd2hhdCB3b3JrIGlzIGJlaW5nIHBlcmZvcm1lZCBhdCB3aGF0IHRpbWUgYnkgd2hpY2ggcm9sZXMgdXNpbmcgd2hpY2ggaW5wdXQgYW5kIHByb2R1Y2luZyB3aGF0IG91dHB1dHMuICBBIHByb2plY3QgcGxhbiBhcyBpdCBpcyByZXByZXNlbnRlZCBpbiBwcm9qZWN0IHBsYW5uaW5nIHRvb2xzIHN1Y2ggYXMgSUJNIFJhdGlvbmFsIFBvcnRmb2xpbyBNYW5hZ2VyIG9yIE1pY3Jvc29mdCBQcm9qZWN0IG5vcm1hbGx5IGRvZXMgbm90IG5lZWQgYWxsIHRoaXMgaW5mb3JtYXRpb24gYW5kIGlzIG5vcm1hbGx5IGxpbWl0ZWQgdG8ganVzdCByZXByZXNlbnRpbmcgYSBzdWJzZXQuICBGb3IgZXhhbXBsZSwgYSB0eXBpY2FsIE1TIFByb2plY3QgcGxhbiBvbmx5IHJlcHJlc2VudHMgdGhlIHdvcmsgYnJlYWtkb3duIGNvbnNpc3Rpbmcgb2YgVGFza3MgYW5kIEFjdGl2aXRpZXMgKHNvbWV0aW1lcyByZWZlcnJlZCB0byBhcyBzdW1tYXJ5IHRhc2tzKS4gIEl0IGRvZXMgbm90IHNob3cgdGhlIGlucHV0IGFuZCBvdXRwdXQgV29yayBQcm9kdWN0cyBmb3IgYSBUYXNrLCBidXQgaXQgY2FuIHNob3cgd2hpY2ggcm9sZXMgc2hhbGwgYmUgc3RhZmZlZCBmb3IgcGVyZm9ybWluZyB0aGUgVGFzay4gIEhvd2V2ZXIsIHN1Y2ggcm9sZSBhbGxvY2F0aW9uIG5lZWQgdG8gYmUgcmVwbGFjZWQgd2l0aCBjb25jcmV0ZSByZXNvdXJjZXMgd2hlbiBpbnN0YW50aWF0aW5nIHRoZSBwbGFuIGZvciBhIGNvbmNyZXRlIHByb2plY3QuICBTb21ldGltZXMgcHJvamVjdCBwbGFucyBjYW4gdGhlbiBhZ2FpbiBiZSBvcmdhbml6ZWQgZGlmZmVyZW50bHkgYnkgb3JnYW5pemluZyB3b3JrIGJ5IGRlbGl2ZXJhYmxlcyBpbiB3aGljaCBXb3JrIFByb2R1Y3RzIGFyZSBtYXBwZWQgdG8gdGhlIHBsYW4ncyBzdW1tYXJ5IHRhc2tzIGFuZCBUYXNrIHRoYXQgaGF2ZSB0aGVzZSB3b3JrIHByb2R1Y3RzIGFzIG91dHB1dCBtYXBwZWQgYmVsb3cgc3VjaCBhcyBzdW1tYXJ5IHRhc2suICBUaGVyZWZvcmUsIGEgcHJvY2VzcyBjYW4gbWFrZSByZWNvbW1lbmRhdGlvbnMgYWJvdXQgd2hpY2ggZWxlbWVudHMgdG8gaW5jbHVkZSBhbmQgd2hpY2ggdG8gZXhjbHVkZSB3aGVuIGdlbmVyYXRpbmcgYSBwbGFuLiAgV2hlbiB0aGUgaXNQbGFubmVkIGF0dHJpYnV0ZSBpcyBzZXQgdG8gRmFsc2UgZm9yIGFuIGluc3RhbmNlIG9mIGEgQnJlYWtkb3duIEVsZW1lbnQsIHRoZW4gdGhpcyBlbGVtZW50IHNoYWxsIG5vdCBiZSBub3QgaW5jbHVkZWQgd2hlbiBhIGNvbmNyZXRlIHByb2plY3QgcGxhbiBpcyBiZWluZyBnZW5lcmF0ZWQgZnJvbSB0aGUgYnJlYWtkb3duIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zIHRoaXMgZWxlbWVudC4NCi0NCi0NCi08L2JvZHk+DQotICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9Il90S2xIWmlYNUVkMktuSjJ5ak5YaFdRIiB0eXBlPSJfdEJvbWd5WDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICAgIDxib2R5PnRydWU8L2JvZHk+DQotICAgICAgICA8L2RlZmF1bHRWYWx1ZT4NCi0gICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il90S2xIWnlYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJoYXNNdWx0aXBsZU9jY3VycmVuY2VzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il90Qm9tZ3lYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfdEtsSGFDWDVFZDJLbkoyeWpOWGhXUSIgYW5ub3RhdGVkRWxlbWVudD0iX3RLbEhaeVg1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgICA8Ym9keT5KdXN0IGFzIHRoZSBpc1BsYW5uZWQgYXR0cmlidXRlIHRoZSBoYXNNdWx0aXBsZU9jY3VycmVuY2VzIGF0dHJpYnV0ZSBoYXMgYW4gaW1wYWN0IG9uIGdlbmVyYXRpbmcgcGxhbnMgZnJvbSBhIFByb2Nlc3MuICBXaGVuIHRoaXMgYXR0cmlidXRlIGlzIHNldCB0byBUcnVlIGZvciBhIEJyZWFrZG93biBFbGVtZW50IHRoZW4gaXQgd2lsbCB0eXBpY2FsbHkgb2NjdXIgbXVsdGlwbGUgdGltZXMgd2l0aGluIHRoZSBzYW1lIEFjdGl2aXR5LiAgRm9yIGV4YW1wbGUsIGEgVGFzayBzdWNoIGFzICZxdW90O0RldGFpbCBVc2UgQ2FzZSZxdW90OyB3b3VsZCBiZSBwZXJmb3JtZWQgZm9yIGV2ZXJ5IHVzZSBjYXNlIGlkZW50aWZpZWQgZm9yIGEgcGFydGljdWxhciBJdGVyYXRpb24gb3IgQWN0aXZpdHkuICBHZW5lcmF0aW5nIGEgcGxhbiB3b3VsZCBsaXN0IG9uZSBUYXNrIGluc3RhbmNlIHBlciB1c2UgY2FzZS4NCi08L2JvZHk+DQotICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9Il90S2xIYVNYNUVkMktuSjJ5ak5YaFdRIiB0eXBlPSJfdEJvbWd5WDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICAgIDxib2R5PmZhbHNlPC9ib2R5Pg0KLSAgICAgICAgPC9kZWZhdWx0VmFsdWU+DQotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfdEtsSGFpWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iaXNPcHRpb25hbCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdEJvbWd5WDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3RLbEhheVg1RWQyS25KMnlqTlhoV1EiIGFubm90YXRlZEVsZW1lbnQ9Il90S2xIYWlYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgICAgPGJvZHk+VGhlIGlzT3B0aW9uYWwgYXR0cmlidXRlIGluZGljYXRlcyB0aGF0IHRoZSBCcmVha2Rvd24gRWxlbWVudCBkZXNjcmliZXMgd29yaywgYSB3b3JrIHJlc3VsdCwgb3IgZXZlbiB3b3JrIHJlc291cmNlcywgd2hpY2ggaW5jbHVzaW9uIGlzIG5vdCBtYW5kYXRvcnkgd2hlbiBwZXJmb3JtaW5nIGEgcHJvamVjdCB0aGF0IGlzIHBsYW5uZWQgYmFzZWQgb24gYSBwcm9jZXNzIGNvbnRhaW5pbmcgdGhpcyBlbGVtZW50LjwvYm9keT4NCi0gICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iX3RLbEhiQ1g1RWQyS25KMnlqTlhoV1EiIHR5cGU9Il90Qm9tZ3lYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgICAgPGJvZHk+ZmFsc2U8L2JvZHk+DQotICAgICAgICA8L2RlZmF1bHRWYWx1ZT4NCi0gICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il90S2xIYlNYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJwcmVzZW50ZWRBZnRlciIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdEtsSFd5WDVFZDJLbkoyeWpOWGhXUSIgYXNzb2NpYXRpb249Il90S3VSTHlYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3RLbEhiaVg1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIxIi8+DQotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il90S2xIYnlYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfdEtsSGNDWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0icHJlc2VudGVkQmVmb3JlIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il90S2xIV3lYNUVkMktuSjJ5ak5YaFdRIiBhc3NvY2lhdGlvbj0iX3RMQnpJeVg1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfdEtsSGNTWDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IjEiLz4NCi0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3RLbEhjaVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il90S2xIY3lYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJwbGFubmluZ0RhdGEiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3RLbEhVaVg1RWQyS25KMnlqTlhoV1EiIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiIGFzc29jaWF0aW9uPSJfdE9USmlpWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il90S2xIZENYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iMSIvPg0KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfdEtsSGRTWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3RLbEhkaVg1RWQyS25KMnlqTlhoV1EiIG5hbWU9InN1cGVyQWN0aXZpdGllcyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdEtsSElDWDVFZDJLbkoyeWpOWGhXUSIgYXNzb2NpYXRpb249Il90T1RKbkNYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3RLbEhkeVg1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIxIi8+DQotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il90S2xIZUNYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iMSIvPg0KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3RPVEp4U1g1RWQyS25KMnlqTlhoV1EiIG5hbWU9ImNoZWNrbGlzdHMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3RFSzlKQ1g1RWQyS25KMnlqTlhoV1EiIGFzc29jaWF0aW9uPSJfdE9USnJDWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il90T1RKeGlYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfdE9USnh5WDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3RPVEp5Q1g1RWQyS25KMnlqTlhoV1EiIG5hbWU9ImNvbmNlcHRzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il90RUs5SVNYNUVkMktuSjJ5ak5YaFdRIiBhc3NvY2lhdGlvbj0iX3RPVEpzU1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfdE9USnlTWDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IioiLz4NCi0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3RPVEp5aVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il90T1RKeXlYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJleGFtcGxlcyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdEVLOUp5WDVFZDJLbkoyeWpOWGhXUSIgYXNzb2NpYXRpb249Il90T1RKdGlYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3RPVEp6Q1g1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIqIi8+DQotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il90T1RKelNYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfdE9USnppWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iZ3VpZGVsaW5lcyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdEVLOUtpWDVFZDJLbkoyeWpOWGhXUSIgYXNzb2NpYXRpb249Il90T1RKdXlYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3RPVEp6eVg1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIqIi8+DQotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il90T1RKMENYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfdE9USjBTWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0icmV1c2FibGVBc3NldHMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3RFVXVMQ1g1RWQyS25KMnlqTlhoV1EiIGFzc29jaWF0aW9uPSJfdE9USndDWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il90T1RKMGlYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfdE9USjB5WDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3RPVEoxQ1g1RWQyS25KMnlqTlhoV1EiIG5hbWU9InN1cHBvcnRpbmdNYXRlcmlhbHMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3RFSzlNeVg1RWQyS25KMnlqTlhoV1EiIGFzc29jaWF0aW9uPSJfdE9USnB5WDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il90T1RKMVNYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfdE9USjFpWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3RPVEoxeVg1RWQyS25KMnlqTlhoV1EiIG5hbWU9InRlbXBsYXRlcyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdEVLOU1DWDVFZDJLbkoyeWpOWGhXUSIgYXNzb2NpYXRpb249Il90T2M2Z0NYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3RPVEoyQ1g1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIqIi8+DQotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il90T1RKMlNYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfdE9USjJpWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0icmVwb3J0cyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdEVLOUxTWDVFZDJLbkoyeWpOWGhXUSIgYXNzb2NpYXRpb249Il90T2M2aENYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3RPVEoyeVg1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIqIi8+DQotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il90T1RKM0NYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfdE9USjNTWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iZXN0aW1hdGlvbmNvbnNpZGVyYXRpb25zIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il90RVV1THlYNUVkMktuSjJ5ak5YaFdRIiBhc3NvY2lhdGlvbj0iX3RPYzZpQ1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfdE9USjNpWDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IioiLz4NCi0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3RPVEozeVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il90T1RKNENYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJ0b29sbWVudG9yIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il90RUs5TmlYNUVkMktuSjJ5ak5YaFdRIiBhc3NvY2lhdGlvbj0iX3RPYzZqQ1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfdE9USjRTWDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IioiLz4NCi0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3RPVEo0aVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il90T2M2Z0NYNUVkMktuSjJ5ak5YaFdRIiBtZW1iZXJFbmQ9Il90T1RKMXlYNUVkMktuSjJ5ak5YaFdRIF90T2M2Z1NYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfdE9jNmdTWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iIiB2aXNpYmlsaXR5PSJwcml2YXRlIiB0eXBlPSJfdEtsSFd5WDVFZDJLbkoyeWpOWGhXUSIgYXNzb2NpYXRpb249Il90T2M2Z0NYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3RPYzZnaVg1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIqIi8+DQotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il90T2M2Z3lYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgPC9vd25lZEVuZD4NCi0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfdE9jNmhDWDVFZDJLbkoyeWpOWGhXUSIgbWVtYmVyRW5kPSJfdE9USjJpWDVFZDJLbkoyeWpOWGhXUSBfdE9jNmhTWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgPG93bmVkRW5kIHhtaTppZD0iX3RPYzZoU1g1RWQyS25KMnlqTlhoV1EiIG5hbWU9IiIgdmlzaWJpbGl0eT0icHJpdmF0ZSIgdHlwZT0iX3RLbEhXeVg1RWQyS25KMnlqTlhoV1EiIGFzc29jaWF0aW9uPSJfdE9jNmhDWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il90T2M2aGlYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfdE9jNmh5WDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgIDwvb3duZWRFbmQ+DQotICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3RPYzZpQ1g1RWQyS25KMnlqTlhoV1EiIG1lbWJlckVuZD0iX3RPVEozU1g1RWQyS25KMnlqTlhoV1EgX3RPYzZpU1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il90T2M2aVNYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSIiIHZpc2liaWxpdHk9InByaXZhdGUiIHR5cGU9Il90S2xIV3lYNUVkMktuSjJ5ak5YaFdRIiBhc3NvY2lhdGlvbj0iX3RPYzZpQ1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfdE9jNmlpWDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IioiLz4NCi0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3RPYzZpeVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICA8L293bmVkRW5kPg0KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il90T2M2akNYNUVkMktuSjJ5ak5YaFdRIiBtZW1iZXJFbmQ9Il90T1RKNENYNUVkMktuSjJ5ak5YaFdRIF90T2M2alNYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfdE9jNmpTWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iIiB2aXNpYmlsaXR5PSJwcml2YXRlIiB0eXBlPSJfdEtsSFd5WDVFZDJLbkoyeWpOWGhXUSIgYXNzb2NpYXRpb249Il90T2M2akNYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3RPYzZqaVg1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIqIi8+DQotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il90T2M2anlYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgPC9vd25lZEVuZD4NCi0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfdFFydklDWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uIj4NCi0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfdFFydklTWDVFZDJLbkoyeWpOWGhXUSIgZ2VuZXJhbD0iX3RCOElueVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfdFFydklpWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0idXNhZ2VHdWlkYW5jZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdEJmY3RDWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3RRcnZJeVg1RWQyS25KMnlqTlhoV1EiIGFubm90YXRlZEVsZW1lbnQ9Il90UXJ2SWlYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgICAgPGJvZHk+UHJvdmlkZXMgaW5mb3JtYXRpb24gYW5kIGd1aWRhbmNlIG9uIHRoZSBtZWFuaW5nIG9mIHRoZSBCb29sZWFuIGZsYWcgdmFsdWVzIGFuZCB1bmRlciB3aGF0IGNpcmN1bXN0YW5jZXMgdGhleSBzaG91bGQgYmUgb3ZlcnJpZGRlbi4gRm9yIGV4YW1wbGUsIGl0IGRlc2NyaWJlcyB3aHkgdGhlIGJyZWFrZG93biBlbGVtZW50IGlzIG9wdGlvbmFsIG9yIGNvbnNpZGVyYXRpb25zIGZvciByZXBlYXRpbmcgaXQgYW5kIGRpZmZlcmVuY2VzIGluIHRoZSBpbmRpdmlkdWFsIG9jY3VycmVuY2VzIG9mIHRoaXMgQnJlYWtkb3duIEVsZW1lbnQgYWNyb3NzIHRoZSBsaWZlY3ljbGUuPC9ib2R5Pg0KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il90UXJ2SkNYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iMSIvPg0KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfdFFydkpTWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iX3RRcnZKaVg1RWQyS25KMnlqTlhoV1EiIHR5cGU9Il90QmZjdENYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iIi8+DQotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfdFFydkp5WDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iQWN0aXZpdHlEZXNjcmlwdGlvbiI+DQotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3RRcnZLQ1g1RWQyS25KMnlqTlhoV1EiIGdlbmVyYWw9Il90UXJ2SUNYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3RRcnZLU1g1RWQyS25KMnlqTlhoV1EiIG5hbWU9InB1cnBvc2UiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3RCZmN0Q1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il90UXJ2S2lYNUVkMktuSjJ5ak5YaFdRIiBhbm5vdGF0ZWRFbGVtZW50PSJfdFFydktTWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICAgIDxib2R5PlN1bW1hcml6ZXMgdGhlIG1haW4gcmVhc29uIGZvciBwZXJmb3JtaW5nIHRoaXMgQWN0aXZpdHksIGRlc2NyaWJlcyB3aGF0IHRoZSBhY3Rpdml0eSBhcyBhIHdob2xlIGlzIGludGVuZGVkIHRvIGFjaGlldmUuPC9ib2R5Pg0KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il90UXJ2S3lYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iMSIvPg0KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfdFFydkxDWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iX3RRcnZMU1g1RWQyS25KMnlqTlhoV1EiIHR5cGU9Il90QmZjdENYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iIi8+DQotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfdFFydkxpWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iYWx0ZXJuYXRpdmVzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il90QmZjdENYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfdFFydkx5WDVFZDJLbkoyeWpOWGhXUSIgYW5ub3RhdGVkRWxlbWVudD0iX3RRcnZMaVg1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgICA8Ym9keT5Db21wcmlzZXMgb2Ygc3VtbWFyaWVzIGRlc2NyaWJpbmcgaW1wb3J0YW50IGV4Y2VwdGlvbmFsIGFuZCBub24tc3RhbmRhcmQgd2F5cyBvZiBkb2luZyB0aGUgd29yayBvZiB0aGlzIEFjdGl2aXR5IG5vdCBjb3ZlcmVkIGJ5IHRoZSBBY3Rpdml0eSdzIFRhc2tzLjwvYm9keT4NCi0gICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfdFFydk1DWDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IjEiLz4NCi0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3RRcnZNU1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il90UXJ2TWlYNUVkMktuSjJ5ak5YaFdRIiB0eXBlPSJfdEJmY3RDWDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IiIvPg0KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3RRcnZNeVg1RWQyS25KMnlqTlhoV1EiIG5hbWU9Imhvd3RvU3RhZmYiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3RCZmN0Q1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il90UXJ2TkNYNUVkMktuSjJ5ak5YaFdRIiBhbm5vdGF0ZWRFbGVtZW50PSJfdFFydk15WDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICAgIDxib2R5PlByb3ZpZGVzIGJhY2tncm91bmQgb24gd2hvIHNob3VsZCBiZSBpbnZvbHZlZCBpbiB0aGlzIGFjdGl2aXR5IHdoYXQgYXJlIHRoZSByZXF1aXJlZCBza2lsbHMsIGV4cGVyaWVuY2UsICBhbmQgcGVyaGFwcyBhdHRpdHVkZXMuPC9ib2R5Pg0KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il90UXJ2TlNYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iMSIvPg0KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfdFFydk5pWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iX3RRcnZOeVg1RWQyS25KMnlqTlhoV1EiIHR5cGU9Il90QmZjdENYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iIi8+DQotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfdFExZ0lDWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24iPg0KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il90UTFnSVNYNUVkMktuSjJ5ak5YaFdRIiBnZW5lcmFsPSJfdFExZ1FDWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il90UTFnSWlYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJzY2FsZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdEJmY3RDWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3RRMWdJeVg1RWQyS25KMnlqTlhoV1EiIGFubm90YXRlZEVsZW1lbnQ9Il90UTFnSWlYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgICAgPGJvZHk+T3V0bGluZXMgY2hhcmFjdGVyaXN0aWNzIGFib3V0IHRoZSBzaXplIG9mIGEgdHlwaWNhbCBwcm9qZWN0IHRoYXQgcGVyZm9ybXMgdGhpcyBwcm9qZWN0IGV4cHJlc3NlZCBpbiB0ZWFtIHNpemUsIG1hbiB5ZWFycywgZXRjLjwvYm9keT4NCi0gICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfdFExZ0pDWDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IjEiLz4NCi0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3RRMWdKU1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il90UTFnSmlYNUVkMktuSjJ5ak5YaFdRIiB0eXBlPSJfdEJmY3RDWDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IiIvPg0KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3RRMWdKeVg1RWQyS25KMnlqTlhoV1EiIG5hbWU9InByb2plY3RDaGFyYWN0ZXJpc3RpY3MiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3RCZmN0Q1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il90UTFnS0NYNUVkMktuSjJ5ak5YaFdRIiBhbm5vdGF0ZWRFbGVtZW50PSJfdFExZ0p5WDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICAgIDxib2R5PkNoYXJhY3Rlcml6ZXMgdGhlIHByb2plY3QgdGhhdCB3b3VsZCB0eXBpY2FsbHkgcGVyZm9ybSB0aGlzIFByb2Nlc3M8L2JvZHk+DQotICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3RRMWdLU1g1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIxIi8+DQotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il90UTFnS2lYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfdFExZ0t5WDVFZDJLbkoyeWpOWGhXUSIgdHlwZT0iX3RCZmN0Q1g1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIiLz4NCi0gICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il90UTFnTENYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJyaXNrTGV2ZWwiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3RCZmN0Q1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il90UTFnTFNYNUVkMktuSjJ5ak5YaFdRIiBhbm5vdGF0ZWRFbGVtZW50PSJfdFExZ0xDWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICAgIDxib2R5Pk91dGxpbmVzIHR5cGljYWwgcHJvamVjdCByaXNrcyB0aGF0IGFyZSBhZGRyZXNzZWQgd2l0aCB0aGlzIHByb2Nlc3MuPC9ib2R5Pg0KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il90UTFnTGlYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iMSIvPg0KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfdFExZ0x5WDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iX3RRMWdNQ1g1RWQyS25KMnlqTlhoV1EiIHR5cGU9Il90QmZjdENYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iIi8+DQotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfdFExZ01TWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iZXN0aW1hdGluZ1RlY2huaXF1ZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdEJmY3RDWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3RRMWdNaVg1RWQyS25KMnlqTlhoV1EiIGFubm90YXRlZEVsZW1lbnQ9Il90UTFnTVNYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgICAgPGJvZHk+RGVzY3JpYmVzIHRoZSBFc3RpbWF0aW9uIFRlY2huaXF1ZXMgcHJvdmlkZWQgZm9yIHRoaXMgUHJvY2Vzcy48L2JvZHk+DQotICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3RRMWdNeVg1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIxIi8+DQotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il90UTFnTkNYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfdFExZ05TWDVFZDJLbkoyeWpOWGhXUSIgdHlwZT0iX3RCZmN0Q1g1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIiLz4NCi0gICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il90UTFnTmlYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJwcm9qZWN0TWVtYmVyRXhwZXJ0aXNlIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il90QmZjdENYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfdFExZ055WDVFZDJLbkoyeWpOWGhXUSIgYW5ub3RhdGVkRWxlbWVudD0iX3RRMWdOaVg1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgICA8Ym9keT5Qcm92aWRlcyBhIHByb2ZpbGUgb2YgYSB0eXBpY2FsIHByb2plY3QgdGVhbSwgdGhlIGRpc3RyaWJ1dGlvbiBvZiByb2xlcywgc2tpbGxzIHJlcXVpcmVkIGZvciBhIHRlYW0gcGVyZm9ybXMgYSBwcm9qZWN0IGJhc2VkIG9uIHRoaXMgcHJvY2Vzcy48L2JvZHk+DQotICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3RRMWdPQ1g1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIxIi8+DQotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il90UTFnT1NYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfdFExZ09pWDVFZDJLbkoyeWpOWGhXUSIgdHlwZT0iX3RCZmN0Q1g1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIiLz4NCi0gICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il90UTFnT3lYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJ0eXBlT2ZDb250cmFjdCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdEJmY3RDWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3RRMWdQQ1g1RWQyS25KMnlqTlhoV1EiIGFubm90YXRlZEVsZW1lbnQ9Il90UTFnT3lYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgICAgPGJvZHk+UHJvdmlkZXMgYmFja2dyb3VuZCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY29udHJhY3RzIHRoYXQgbmVlZCB0byBiZSBlc3RhYmxpc2hlZCBiZXR3ZWVuIGEgcHJvamVjdCB0ZWFtIHRoYXQgcGVyZm9ybXMgdGhpcyBwcm9jZXNzIGFuZCBhIGNsaWVudCAoZS5nLiBmb3IgYW4gSUdTIGVuZ2FnZW1lbnQpLjwvYm9keT4NCi0gICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfdFExZ1BTWDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IjEiLz4NCi0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3RRMWdQaVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il90UTFnUHlYNUVkMktuSjJ5ak5YaFdRIiB0eXBlPSJfdEJmY3RDWDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IiIvPg0KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3RRMWdRQ1g1RWQyS25KMnlqTlhoV1EiIG5hbWU9IlByb2Nlc3NEZXNjcmlwdGlvbiI+DQotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3RRMWdRU1g1RWQyS25KMnlqTlhoV1EiIGdlbmVyYWw9Il90UXJ2SnlYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3RRMWdRaVg1RWQyS25KMnlqTlhoV1EiIG5hbWU9InNjb3BlIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il90QmZjdENYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfdFExZ1F5WDVFZDJLbkoyeWpOWGhXUSIgYW5ub3RhdGVkRWxlbWVudD0iX3RRMWdRaVg1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgICA8Ym9keT5EZWZpbmVzIHRoZSBzY29wZSBvZiB0aGUgUHJvY2VzcywgaS5lLiB3aGljaCB0eXBlcyBvZiBwcm9qZWN0cyBkb2VzIGl0IGFkZHJlc3MgYW5kIHdoaWNoIG5vdC48L2JvZHk+DQotICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3RRMWdSQ1g1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIxIi8+DQotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il90UTFnUlNYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfdFExZ1JpWDVFZDJLbkoyeWpOWGhXUSIgdHlwZT0iX3RCZmN0Q1g1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIiLz4NCi0gICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il90UTFnUnlYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJ1c2FnZU5vdGVzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il90QmZjdENYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfdFExZ1NDWDVFZDJLbkoyeWpOWGhXUSIgYW5ub3RhdGVkRWxlbWVudD0iX3RRMWdSeVg1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgICA8Ym9keT5BbnkgYWRkaXRpb25hbCBub3RlcyBvbiBob3cgdG8gYXBwbHkgYW5kIGluc3RhbnRpYXRlIHRoaXMgcHJvY2VzcyBmb3IgYSBwcm9qZWN0LjwvYm9keT4NCi0gICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfdFExZ1NTWDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IjEiLz4NCi0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3RRMWdTaVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il90UTFnU3lYNUVkMktuSjJ5ak5YaFdRIiB0eXBlPSJfdEJmY3RDWDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IiIvPg0KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3RRMWdUQ1g1RWQyS25KMnlqTlhoV1EiIG5hbWU9IkRlc2NyaXB0b3JEZXNjcmlwdGlvbiI+DQotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3RRMWdUU1g1RWQyS25KMnlqTlhoV1EiIGdlbmVyYWw9Il90UXJ2SUNYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3RRMWdUaVg1RWQyS25KMnlqTlhoV1EiIG5hbWU9InJlZmluZWREZXNjcmlwdGlvbiIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdEJmY3RDWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3RRMWdUeVg1RWQyS25KMnlqTlhoV1EiIGFubm90YXRlZEVsZW1lbnQ9Il90UTFnVGlYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgICAgPGJvZHk+QSBEZXNjcmlwdG9yIG1pZ2h0IGFkZCByZWZpbmVtZW50cyB0byB0aGUgbWFpbiBkZXNjcmlwdGlvbiBvZiB0aGUgQ29udGVudCBFbGVtZW50IGl0IHJlZmVycyB0by4gIEZvciBleGFtcGxlLCBpdCBjb3VsZCBwcm92aWRlIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gYWJvdXQgYSBXb3JrIFByb2R1Y3QgcmVsZXZhbnQgZm9yIHRoZSBzcGVjaWZpYyBwb2ludCBpbiB0aW1lIGluIHRoZSBwcm9jZXNzIHRoaXMgV29yayBQcm9kdWN0IHR5cGUgaXMgYmVpbmcgdXNlZC4gIEl0IGNvdWxkIGRlc2NyaWJlIGFkZGl0aW9uYWwgc2tpbGxzIG5lZWRlZCBmb3IgYSBSb2xlIGF0IHRoYXQgcGFydGljdWxhciBwb2ludCBpbiB0aW1lIGluIGEgcHJvY2VzcywgZXRjLiA8L2JvZHk+DQotICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3RRMWdVQ1g1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIxIi8+DQotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il90UTFnVVNYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfdFExZ1VpWDVFZDJLbkoyeWpOWGhXUSIgdHlwZT0iX3RCZmN0Q1g1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIiLz4NCi0gICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il90UTFnVXlYNUVkMktuSjJ5ak5YaFdRIiBtZW1iZXJFbmQ9Il90S2xIcGlYNUVkMktuSjJ5ak5YaFdRIF90UTFnVlNYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3RRMWdWQ1g1RWQyS25KMnlqTlhoV1EiIGFubm90YXRlZEVsZW1lbnQ9Il90UTFnVXlYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDxib2R5Pkxpc3QgdGhlIHN0ZXBzIHRoYXQgaGF2ZSBiZWVuIHNlbGVjdGVkIHRvIGJlIHBlcmZvcm1lZCBmb3IgdGhlIGluc3RhbmNlIG9mIHRoZSBUYXNrIERlc2NyaXB0b3IuPC9ib2R5Pg0KLSAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il90UTFnVlNYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJfdGFza0Rlc2NyaXB0b3IiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3RLbEhpaVg1RWQyS25KMnlqTlhoV1EiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il90UTFnVXlYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3RRMWdWaVg1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIqIi8+DQotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il90UTFnVnlYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgPC9vd25lZEVuZD4NCi0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfdFRYMnl5WDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iUHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3IiPg0KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfdFRYMnpDWDVFZDJLbkoyeWpOWGhXUSIgYW5ub3RhdGVkRWxlbWVudD0iX3RUWDJ5eVg1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPGJvZHk+QSBQcm9jZXNzIENvbXBvbmVudCBEZXNjcmlwdG9yIHJlcHJlc2VudHMgYSBQcm9jZXNzIENvbXBvbmVudCBhcHBsaWNhdGlvbiBpbiBhIFByb2Nlc3MsIGkuZS4gdGhlIGJyZWFrZG93biBzdHJ1Y3R1cmUgZGVmaW5pbmcgdGhlIFByb2Nlc3MuICBUaGUgUHJvY2VzcyBDb21wb25lbnQgRGVzY3JpcHRvciBpcyB1c2VkIHRvIGVuY2Fwc3VsYXRlIHRoZSBkZXRhaWxzIG9mIHRoZSBjb21wb25lbnQgaW4gYSBicmVha2Rvd24gc3RydWN0dXJlIGFuZCB0byBwcm92aWRlIGl0cyBvd24gc2V0IG9mIHJlbGF0aW9uc2hpcHMgc3VjaCBhcyBpdCBvd24gcHJlZGVjZXNzb3JzIGFuZCBzdWNjZXNzb3JzLjwvYm9keT4NCi0gICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfdFRYMnpTWDVFZDJLbkoyeWpOWGhXUSIgZ2VuZXJhbD0iX3RLbEhlU1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfdFRYMnppWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iX3Byb2Nlc3NDb21wb25lbnQiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3RUWDJ3Q1g1RWQyS25KMnlqTlhoV1EiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il90VFgyN3lYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3RUWDJ6eVg1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIxIi8+DQotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il90VFgyMENYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iMSIvPg0KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3RUWDIwU1g1RWQyS25KMnlqTlhoV1EiIG5hbWU9IlByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UiPg0KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfdFRYMjBpWDVFZDJLbkoyeWpOWGhXUSIgYW5ub3RhdGVkRWxlbWVudD0iX3RUWDIwU1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPGJvZHk+QSBQcm9jZXNzIENvbXBvbmVudCBJbnRlcmZhY2UgY29tcHJpc2VzIG9mIGEgbGlzdCBvZiBpbnRlcmZhY2Ugc3BlY2lmaWNhdGlvbnMgKHNpbWlsYXIgdG8gb3BlcmF0aW9uIGRlY2xhcmF0aW9ucykgdGhhdCBleHByZXNzIGlucHV0cyBhbmQgb3V0cHV0cyBmb3IgYSBwcm9jZXNzIGNvbXBvbmVudC4gIFRoZXNlIGludGVyZmFjZSBzcGVjaWZpY2F0aW9ucyBhcmUgZXhwcmVzc2VkIHVzaW5nIFRhc2sgRGVzY3JpcHRvcnMgd2hpY2ggYXJlIG5vdCBsaW5rZWQgdG8gVGFza3MgdGhhdCBhcmUgcmVsYXRlZCB0byBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvcnMgYXMgd2VsbCBhcyBvcHRpb25hbCBhIFJvbGUgRGVzY3JpcHRvci48L2JvZHk+DQotICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3RUWDIweVg1RWQyS25KMnlqTlhoV1EiIGdlbmVyYWw9Il90S2xIV3lYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3RUWDIxQ1g1RWQyS25KMnlqTlhoV1EiIG5hbWU9ImludGVyZmFjZVNwZWNpZmljYXRpb25zIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il90S2xIaWlYNUVkMktuSjJ5ak5YaFdRIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBhc3NvY2lhdGlvbj0iX3RUWDI1U1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfdFRYMjFTWDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IioiLz4NCi0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3RUWDIxaVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il90VFgyMXlYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJpbnRlcmZhY2VJTyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdEtsSHFTWDVFZDJLbkoyeWpOWGhXUSIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgYXNzb2NpYXRpb249Il90VFgyNmlYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3RUWDIyQ1g1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIqIi8+DQotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il90VFgyMlNYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfdFRYMjRDWDVFZDJLbkoyeWpOWGhXUSIgbWVtYmVyRW5kPSJfdFRYMjRpWDVFZDJLbkoyeWpOWGhXUSBfdFRYMnhTWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il90VFgyNFNYNUVkMktuSjJ5ak5YaFdRIiBhbm5vdGF0ZWRFbGVtZW50PSJfdFRYMjRDWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8Ym9keT5UaGlzIGFzc29jaWF0aW9uIGRlc2NyaWJlcyB0aGUgcmVhbGl6YXRpb24gcmVsYXRpb25zaGlwcyBiZXR3ZWVuIGEgUHJvY2VzcyBDb21wb25lbnQgYW5kIGEgUHJvY2VzcyBDb21wb25lbnQgSW50ZXJmYWNlLjwvYm9keT4NCi0gICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfdFRYMjRpWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0icmVhbGl6ZWRCeSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdFRYMndDWDVFZDJLbkoyeWpOWGhXUSIgYXNzb2NpYXRpb249Il90VFgyNENYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3RUWDI0eVg1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIqIi8+DQotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il90VFgyNUNYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgPC9vd25lZEVuZD4NCi0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfdFRYMjVTWDVFZDJLbkoyeWpOWGhXUSIgbWVtYmVyRW5kPSJfdFRYMjV5WDVFZDJLbkoyeWpOWGhXUSBfdFRYMjFDWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il90VFgyNWlYNUVkMktuSjJ5ak5YaFdRIiBhbm5vdGF0ZWRFbGVtZW50PSJfdFRYMjVTWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8Ym9keT5JbnN0YW5jZXMgb2YgdGhpcyBhc3NvY2lhdGlvbiBjb250YWluIHRoZSBsaXN0IG9mIFRhc2sgRGVzY3JpcHRvcnMgdGhhdCByZXByZXNlbnQgYSBQcm9jZXNzIENvbXBvbmVudCBJbnRlcmZhY2UuPC9ib2R5Pg0KLSAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il90VFgyNXlYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJfcHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSIgdmlzaWJpbGl0eT0icHJpdmF0ZSIgdHlwZT0iX3RUWDIwU1g1RWQyS25KMnlqTlhoV1EiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il90VFgyNVNYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3RUWDI2Q1g1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIxIi8+DQotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il90VFgyNlNYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iMSIvPg0KLSAgICAgIDwvb3duZWRFbmQ+DQotICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3RUWDI2aVg1RWQyS25KMnlqTlhoV1EiIG1lbWJlckVuZD0iX3RUWDIxeVg1RWQyS25KMnlqTlhoV1EgX3RUWDI3Q1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfdFRYMjZ5WDVFZDJLbkoyeWpOWGhXUSIgYW5ub3RhdGVkRWxlbWVudD0iX3RUWDI2aVg1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPGJvZHk+VGhpcyBhc3NvY2lhdGlvbiBjb250YWlucyB0aGUgaW5wdXQgYW5kIG91dHB1dCBXb3JrIFByb2R1Y3QgdHlwZSBpbnN0YW5jZXMgdXNlZCBmb3IgdGhlIGludGVyZmFjZSBzcGVjaWZpY2F0aW9uLjwvYm9keT4NCi0gICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfdFRYMjdDWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iX3Byb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3RUWDIwU1g1RWQyS25KMnlqTlhoV1EiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il90VFgyNmlYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3RUWDI3U1g1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIxIi8+DQotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il90VFgyN2lYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iMSIvPg0KLSAgICAgIDwvb3duZWRFbmQ+DQotICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3RUWDI3eVg1RWQyS25KMnlqTlhoV1EiIG1lbWJlckVuZD0iX3RUWDJ6aVg1RWQyS25KMnlqTlhoV1EgX3RUWDI4U1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfdFRYMjhDWDVFZDJLbkoyeWpOWGhXUSIgYW5ub3RhdGVkRWxlbWVudD0iX3RUWDI3eVg1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPGJvZHk+VGhpcyBhc3NvY2lhdGlvbiByZXByZXNlbnRzIHRoZSByZWZlcmVuY2UgZnJvbSB0aGUgZGVzY3JpcHRvciB0byB0aGUgUHJvY2VzcyBDb21wb25lbnQgaXQgcmVmZXJzIHRvLiAgQSBQcm9jZXNzIENvbXBvbmVudCBEZXNjcmlwdG9yIHJlcHJlc2VudHMgZXhhY3RseSBvbmUgUHJvY2VzcyBDb21wb25lbnQuPC9ib2R5Pg0KLSAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il90VFgyOFNYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJfcHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3IiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3RUWDJ5eVg1RWQyS25KMnlqTlhoV1EiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il90VFgyN3lYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3RUWDI4aVg1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIqIi8+DQotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il90VFgyOHlYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgPC9vd25lZEVuZD4NCi0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfdFRYMjlDWDVFZDJLbkoyeWpOWGhXUSIgbWVtYmVyRW5kPSJfdFRYMnlDWDVFZDJLbkoyeWpOWGhXUSBfdFRYMjlpWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il90VFgyOVNYNUVkMktuSjJ5ak5YaFdRIiBhbm5vdGF0ZWRFbGVtZW50PSJfdFRYMjlDWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8Ym9keT5BIFByb2Nlc3MgQ29tcG9uZW50IGNvbnRhaW5zIG9ubHkgZXhhY3RseSBvbmUgUHJvY2Vzcy48L2JvZHk+DQotICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgPG93bmVkRW5kIHhtaTppZD0iX3RUWDI5aVg1RWQyS25KMnlqTlhoV1EiIG5hbWU9Il9wcm9jZXNzQ29tcG9uZW50IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il90VFgyd0NYNUVkMktuSjJ5ak5YaFdRIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfdFRYMjlDWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il90VFgyOXlYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iMSIvPg0KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfdFRYMi1DWDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IjEiLz4NCi0gICAgICA8L293bmVkRW5kPg0KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il90VFgyLVNYNUVkMktuSjJ5ak5YaFdRIiBtZW1iZXJFbmQ9Il90VFgyM1NYNUVkMktuSjJ5ak5YaFdRIF90VFgyLXlYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3RUWDItaVg1RWQyS25KMnlqTlhoV1EiIGFubm90YXRlZEVsZW1lbnQ9Il90VFgyLVNYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDxib2R5PkEgUHJvY2VzcyBQYWNrYWdlIGNvbnRhaW5zIFByb2Nlc3MgRWxlbWVudHMgd2hpY2ggYXJlIHVzZWQgdG8gZGVmaW5lIEJyZWFrZG93biBhbmQgUHJvY2Vzc2VzLiAgQSBQcm9jZXNzIEVsZW1lbnQgaW5zdGFuY2UgY2FuIGJlIHBhcnQgb2Ygb25seSBvbmUgUHJvY2VzcyBQYWNrYWdlIGluc3RhbmNlLjwvYm9keT4NCi0gICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfdFRYMi15WDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iX3Byb2Nlc3NQYWNrYWdlIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il90VFgyMmlYNUVkMktuSjJ5ak5YaFdRIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfdFRYMi1TWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il90QjhJbkNYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJDb250ZW50RWxlbWVudCIgaXNBYnN0cmFjdD0idHJ1ZSI+DQotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il90QjhJblNYNUVkMktuSjJ5ak5YaFdRIiBhbm5vdGF0ZWRFbGVtZW50PSJfdEI4SW5DWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8Ym9keT5Db250ZW50IEVsZW1lbnQgaXMgYSBEZXNjcmliYWJsZSBFbGVtZW50IHRoYXQgcmVwcmVzZW50cyBhbiBhYnN0cmFjdCBnZW5lcmFsaXphdGlvbiBmb3IgYWxsIGVsZW1lbnRzIHRoYXQgYXJlIGNvbnNpZGVyZWQgdG8gYmUgYW5kIG1hbmFnZWQgYXMgTWV0aG9kIENvbnRlbnQuDQotQ29udGVudCBFbGVtZW50cyByZXByZXNlbnRzIHJldXNhYmxlIE1ldGhvZCBDb250ZW50IHRoYXQgaXMgc3VwcG9zZWQgdG8gYmUgbWFuYWdlZCBpbiBDb250ZW50IFBhY2thZ2VzLiAgVGhlIHNlcGFyYXRpb24gb2YgQ29udGVudCBFbGVtZW50IGZyb20gUHJvY2VzcyBFbGVtZW50IGFsbG93cyB0byBjbGVhcmx5IGRpc3Rpbmd1aXNoIGJldHdlZW4gcHVyZSBtZXRob2QgY29udGVudCBmcm9tIGNvbnRlbnQgdGhhdCBpcyByZXByZXNlbnRlZCBpbiBwcm9jZXNzZXMuDQotPC9ib2R5Pg0KLSAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfdEVLOVhDWDVFZDJLbkoyeWpOWGhXUSIgYW5ub3RhdGVkRWxlbWVudD0iX3RCOEluQ1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPGJvZHk+VGhpcyBpcyB0aGUgR3VpZGFuY2UgVHlwZXMgcGFja2FnZSdzIGV4dGVuc2lvbiBvZiBDb250ZW50IEVsZW1lbnQgKGRlZmluZWQgaW4gQ29udGVudCBFbGVtZW50cykgcHJvdmlkaW5nIGFkZGl0b25hbCBhc3NvY2lhdGlvbnMuPC9ib2R5Pg0KLSAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfdFdEWFlDWDVFZDJLbkoyeWpOWGhXUSIgYW5ub3RhdGVkRWxlbWVudD0iX3RCOEluQ1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPGJvZHk+Q29udGVudCBFbGVtZW50IGluIHRoZSBwYWNrYWdlIE1ldGhvZCBQbHVnaW4gaW5oZXJpdHMgZnJvbSBWYXJpYWJpbGl0eSBFbGVtZW50IGFuZCBub3QgZGlyZWN0bHkgZnJvbSBNZXRob2QgRWxlbWVudCBhbnltb3JlLiAgVGhpcyBpcyBhY2hpZXZlZCB1c2luZyBVTUwgMi4wIHBhY2thZ2UgbWVyZ2Ugc2VtYW50aWNzLiAgT25seSBpZiBhbiBhZG9wdGVyIG9mIHRoaXMgbWV0YS1tb2RlbCBkZWNpZGVzIHRvIHJlYWxpemUgTWV0aG9kIFBsdWdpbnMsIGhlIHdvdWxkIGdldCB0aGUgdmFyaWFiaWxpdHkgYW5kIGV4dGVuc2lvbiBjYXBhYmlsaXRpZXMgZm9yIGFsbCBDb250ZW50IEVsZW1lbnRzLg0KLUNvbnRlbnQgRWxlbWVudCBpbmhlcml0cyB0aGUgc2VtYW50aWNzIG9mIFZhcmlhYmlsaXR5IEVsZW1lbnQuDQotPC9ib2R5Pg0KLSAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il90QjhJbmlYNUVkMktuSjJ5ak5YaFdRIiBnZW5lcmFsPSJfdENGU2lDWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il90V0RYWVNYNUVkMktuSjJ5ak5YaFdRIiBnZW5lcmFsPSJfdFdOSVVDWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il90RUs5WFNYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJzdXBwb3J0aW5nTWF0ZXJpYWxzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il90RUs5TXlYNUVkMktuSjJ5ak5YaFdRIiBhc3NvY2lhdGlvbj0iX3RFVXVNaVg1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfdEVLOVhpWDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IioiLz4NCi0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3RFSzlYeVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il90RUs5WUNYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJjb25jZXB0c0FuZFBhcGVycyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdEVLOUlTWDVFZDJLbkoyeWpOWGhXUSIgYXNzb2NpYXRpb249Il90RVV1TnlYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3RFSzlZU1g1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIqIi8+DQotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il90RUs5WWlYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfdEVLOVl5WDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iY2hlY2tsaXN0cyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdEVLOUpDWDVFZDJLbkoyeWpOWGhXUSIgYXNzb2NpYXRpb249Il90RVV1UENYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3RFSzlaQ1g1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIqIi8+DQotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il90RUs5WlNYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfdEVVdUlDWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iZ3VpZGVsaW5lcyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdEVLOUtpWDVFZDJLbkoyeWpOWGhXUSIgYXNzb2NpYXRpb249Il90RVV1UVNYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3RFVXVJU1g1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIqIi8+DQotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il90RVV1SWlYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfdEVVdUl5WDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iZXhhbXBsZXMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3RFSzlKeVg1RWQyS25KMnlqTlhoV1EiIGFzc29jaWF0aW9uPSJfdEVVdVN5WDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il90RVV1SkNYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfdEVVdUpTWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3RFVXVKaVg1RWQyS25KMnlqTlhoV1EiIG5hbWU9ImFzc2V0cyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdEVVdUxDWDVFZDJLbkoyeWpOWGhXUSIgYXNzb2NpYXRpb249Il90RVV1WWlYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3RFVXVKeVg1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIqIi8+DQotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il90RVV1S0NYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfdEVVdUtTWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0idGVybWRlZmluaXRpb24iIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3RFSzlQQ1g1RWQyS25KMnlqTlhoV1EiIGFzc29jaWF0aW9uPSJfdEVVdWN5WDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il90RVV1S2lYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfdEVVdUt5WDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3RCOElnU1g1RWQyS25KMnlqTlhoV1EiIG5hbWU9Ik1ldGhvZEVsZW1lbnQiIGlzQWJzdHJhY3Q9InRydWUiPg0KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfdEI4SWdpWDVFZDJLbkoyeWpOWGhXUSIgYW5ub3RhdGVkRWxlbWVudD0iX3RCOElnU1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPGJvZHk+RXZlcnkgY2xhc3MgZGVmaW5lZCBpbiB0aGlzIHNwZWNpZmljYXRpb24gaXMgZGVyaXZlZCBmcm9tIE1ldGhvZCBFbGVtZW50LiAgSW4gb3RoZXIgd29yZHMgTWV0aG9kIEVsZW1lbnQgaXMgdGhlIHJvb3QgZ2VuZXJhbGl6YXRpb24gZm9yIGFsbCBVTUEgY2xhc3NlcyBhbmQgZGVmaW5lcyBhIGNvbW1vbiBzZXQgb2YgYXR0cmlidXRlcyBpbmhlcml0ZWQgYnkgZXZlcnkgb3RoZXIgZWxlbWVudCB0eXBlIG9mIHRoaXMgbW9kZWwuICBNZXRob2QgRWxlbWVudCBpdHNlbGYgaXMgZGVyaXZlZCBmcm9tIFBhY2thZ2VhYmxlIEVsZW1lbnQgZnJvbSB0aGUgVU1MIDIuMCBJbmZyYXN0cnVjdHVyZS4gIE1ldGhvZCBFbGVtZW50IGluaGVyaXRzIHRoZSBOYW1lIGF0dHJpYnV0ZSBmcm9tIFBhY2thZ2VhYmxlIEVsZW1lbnQncyBzdXBlciBjbGFzcy4gIEV2ZXJ5IGVsZW1lbnQgZGVmaW5lZCBhcyBhIFVNQSBpbnN0YW5jZSBpcyBkZXJpdmVkIGZyb20gTW9kZWwgRWxlbWVudC4gIEV2ZXJ5IE1ldGhvZCBFbGVtZW50IGluLXN0YW5jZSBpcyBhdCBsZWFzdCBkZWZpbmVkIGJ5IGEgdW5pcXVlIGlkLCBhIG5hbWUsIGFzIHdlbGwgYXMgYnJpZWYgZGVzY3JpcHRpb24uPC9ib2R5Pg0KLSAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfdFdEWFlpWDVFZDJLbkoyeWpOWGhXUSIgYW5ub3RhdGVkRWxlbWVudD0iX3RCOElnU1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPGJvZHk+TWV0aG9kIEVsZW1lbnQgaW4gdGhlIHBhY2thZ2UgTWV0aG9kIFBsdWdpbiBhZGRzIGFkZGl0aW9uYWwgcHJvcGVydGllcyB2aWEgcGFja2FnZSBtZXJnZSB0byBNZXRob2QgRWxlbWVudCBkZWZpbmVkIGluIE1ldGhvZCBDb3JlIG5lZWRlZCBmb3IgdGhlIHZhcmlhYmlsaXR5IGFuZCBleHRlbnNpYmlsaXR5IGNhcGFiaWxpdGllcyBpbnRyb2R1Y2VzIGluIHRoaXMgcGFja2FnZS48L2JvZHk+DQotICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3RCOElneVg1RWQyS25KMnlqTlhoV1EiIGdlbmVyYWw9Il90QmZjbVNYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3RCOEloQ1g1RWQyS25KMnlqTlhoV1EiIG5hbWU9Imd1aWQiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3RCZmN0Q1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il90QjhJaFNYNUVkMktuSjJ5ak5YaFdRIiBhbm5vdGF0ZWRFbGVtZW50PSJfdEI4SWhDWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICAgIDxib2R5PkV2ZXJ5IGluc3RhbmNlIG9mIE1ldGhvZCBFbGVtZW50IGhhcyBhIGdsb2JhbCB1bmlxdWUgaWQuPC9ib2R5Pg0KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il90QjhJaGlYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iMSIvPg0KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfdEI4SWh5WDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iX3RCOElpQ1g1RWQyS25KMnlqTlhoV1EiIHR5cGU9Il90QmZjdENYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iIi8+DQotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfdEI4SWlTWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0icHJlc2VudGF0aW9uTmFtZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdEJmY3RDWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3RCOElpaVg1RWQyS25KMnlqTlhoV1EiIGFubm90YXRlZEVsZW1lbnQ9Il90QjhJaVNYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgICAgPGJvZHk+RXZlcnkgRGVzY3JpYmFibGUgRWxlbWVudCBoYXMgYSBwcmVzZW50YXRpb24gbmFtZSwgd2hpY2ggaXMgdXNlZCBmb3IgZXh0ZXJuYWwgcHJlc2VudGF0aW9uIG9mIHRoZSBlbGVtZW50LiAgRm9yIGV4YW1wbGUsIG5hbWUgKHRoZSBpbnRlcm5hbCByZXByZXNlbnRhdGlvbikgbWlnaHQgYmUgc2V0IHRvICZxdW90O3J1cF9hcmNoaXRlY3R1cmVfZG9jdW1lbnQmcXVvdDsgdG8gZGlmZmVyZW50aWF0ZSBmcm9tIGEgJnF1b3Q7ajJlZV9hcmNoaXRjdHVyZV9kb2N1bWVudCZxdW90OyB3aGVyZWFzIHRoZSBleHRlcm5hbCBwcmVzZW50YXRpb24gd291bGQgYWx3YXlzIGJlICZxdW90O0FyY2hpdGVjdHVyZSBEb2N1bWVudCZxdW90Oy4NCi08L2JvZHk+DQotICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3RCOElpeVg1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIxIi8+DQotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il90QjhJakNYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfdEI4SWpTWDVFZDJLbkoyeWpOWGhXUSIgdHlwZT0iX3RCZmN0Q1g1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIiLz4NCi0gICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il90QjhJamlYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJicmllZkRlc2NyaXB0aW9uIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il90QmZjdENYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfdEI4SWp5WDVFZDJLbkoyeWpOWGhXUSIgYW5ub3RhdGVkRWxlbWVudD0iX3RCOElqaVg1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgICA8Ym9keT5FdmVyeSBpbnN0YW5jZSBvZiBNZXRob2QgRWxlbWVudCBzaGFsbCBiZSBicmllZmx5IGRlc2NyaWJlZCB3aXRoIG9uZSBvciB0d28gc2VudGVuY2VzIHN1bW1hcml6aW5nIHRoZSBlbGVtZW50LjwvYm9keT4NCi0gICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfdEI4SWtDWDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IjEiLz4NCi0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3RCOElrU1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il90QjhJa2lYNUVkMktuSjJ5ak5YaFdRIiB0eXBlPSJfdEJmY3RDWDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IiIvPg0KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3RCOElreVg1RWQyS25KMnlqTlhoV1EiIG5hbWU9Im93bmVkUnVsZXMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3RDRlNnQ1g1RWQyS25KMnlqTlhoV1EiIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiIGFzc29jaWF0aW9uPSJfdENGU2xTWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il90QjhJbENYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfdEI4SWxTWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3RCOElsaVg1RWQyS25KMnlqTlhoV1EiIG5hbWU9Im1ldGhvZEVsZW1lbnRQcm9wZXJ0eSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdENGU2p5WDVFZDJLbkoyeWpOWGhXUSIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgYXNzb2NpYXRpb249Il90Q0ZTcHlYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3RCOElseVg1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIqIi8+DQotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il90QjhJbUNYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfdEI4SW1TWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0ia2luZCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdENGU3FTWDVFZDJLbkoyeWpOWGhXUSIgYXNzb2NpYXRpb249Il90Q0ZTcmlYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3RCOEltaVg1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIqIi8+DQotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il90QjhJbXlYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfdFdEWFl5WDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0ic3VwcHJlc3NlZCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdEJvbWd5WDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3RXRFhaQ1g1RWQyS25KMnlqTlhoV1EiIGFubm90YXRlZEVsZW1lbnQ9Il90V0RYWXlYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgICAgPGJvZHk+SWYgYSBWYXJpYWJpbGl0eSBFbGVtZW50IGlzIGRlcml2ZWQgZnJvbSBhbm90aGVyIFZhcmlhYmlsaXR5IEVsZW1lbnQgdXNpbmcgdGhlIEV4dGVuZHMgVmFyaWFiaWxpdHkgU3BlY2lhbGl6YXRpb24gdGhlbiB0aGlzIGF0dHJpYnV0ZSBjYW4gYmUgdXNlZCB0byBzdXBwcmVzcyBpbmhlcml0ZWQgTWV0aG9kIEVsZW1lbnRzIHRoYXQgd2VyZSBwYXJ0IG9mIHRoZSBiYXNlZC1vbiBWYXJpYWJpbGl0eSBFbGVtZW50LCB3aGljaCBjYW4gYmUgYW55IHR5cGUgb2YgTWV0aG9kIEVsZW1lbnQuICBJbiBvdGhlciB3b3JkcywgaWYgdGhpcyBhdHRyaWJ1dGUgaXMgc2V0IHRvIHRydWUgb24gYSBNZXRob2QgRWxlbWVudCB0aGF0IGhhcyB0aGUgc2FtZSBuYW1lIHRoYW4gYW4gaW5oZXJpdGVkIG1ldGhvZCBlbGVtZW50IHRoZW4gaXQgd2lsbCBub3QgYmUgcmVnYXJkZWQgYXMgaW5oZXJpdGVkIGF0IGFsbC48L2JvZHk+DQotICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9Il90V0RYWlNYNUVkMktuSjJ5ak5YaFdRIiB0eXBlPSJfdEJvbWd5WDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICAgIDxib2R5PmZhbHNlPC9ib2R5Pg0KLSAgICAgICAgPC9kZWZhdWx0VmFsdWU+DQotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfdFdEWFppWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0ib3JkZXJpbmdHdWlkZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdEJmY3RDWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3RXRFhaeVg1RWQyS25KMnlqTlhoV1EiIGFubm90YXRlZEVsZW1lbnQ9Il90V0RYWmlYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgICAgPGJvZHk+VGhpcyBhdHRyaWJ1dGUgaXMgdXNlZCBmb3IgQ0FTRSB0b29sIHJlYWxpemF0aW9ucyBvZiB0aGlzIG1vZGVsIHRvIGNvbnRhaW4gaW5mb3JtYXRpb24gYWJvdXQgbGF5b3V0IGFuZCBvcmRlcmluZyBvZiB0aGUgbWV0aG9kIGVsZW1lbnQgYW5kIGl0cyBwYXJ0cy48L2JvZHk+DQotICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3RXRFhhQ1g1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIxIi8+DQotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il90V0RYYVNYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfdFdEWGFpWDVFZDJLbkoyeWpOWGhXUSIgdHlwZT0iX3RCZmN0Q1g1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIiLz4NCi0gICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkVudW1lcmF0aW9uIiB4bWk6aWQ9Il90V0RYYXlYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJWYXJpYWJpbGl0eVR5cGUiPg0KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfdFdEWGJDWDVFZDJLbkoyeWpOWGhXUSIgYW5ub3RhdGVkRWxlbWVudD0iX3RXRFhheVg1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPGJvZHk+VmFyaWFiaWxpdHkgVHlwZSBpcyBhbiBFbnVtZXJhdGlvbiB1c2VkIGZvciB2YWx1ZXMgZm9yIGluc3RhbmNlcyBvZiBWYXJpYWJpbGl0eSBFbGVtZW50J3MgYXR0cmlidXRlIHZhcmlhYmlsaXR5VHlwZS4gIEl0IGRlZmluZXMgdGhlIG5hdHVyZSBvZiBob3cgYSBWYXJpYWJpbGl0eSBFbGVtZW50IGV4dGVuZHMgYW5vdGhlciBWYXJpYWJpbGl0eSBFbGVtZW50LiBTZWUgZW51bWVyYXRpb24gbGl0ZXJhbHMgZm9yIGRlZmluaXRpb25zIGZvciBlYWNoIHR5cGUuPC9ib2R5Pg0KLSAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgIDxvd25lZExpdGVyYWwgeG1pOmlkPSJfdFdEWGJTWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0ibmEiPg0KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il90V0RYYmlYNUVkMktuSjJ5ak5YaFdRIiBhbm5vdGF0ZWRFbGVtZW50PSJfdFdEWGJTWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICAgIDxib2R5PlRoaXMgaXMgdGhlIGRlZmF1bHQgJnF1b3Q7bm90IGFzc2lnbmVkJnF1b3Q7IHZhbHVlIG9mIGEgVmFyaWFiaWxsaXR5IEVsZW1lbnQncyB2YXJpYWJpbGl0eVR5cGUgYXR0cmlidXRlIHdoaWNoIGlzIHNldCBpbiB0aGUgY2FzZSBubyB2YXJpYWJpbGl0eSBhc3NvY2lhdGlvbiBpcyBwcmVzZW50IGJldHdlZW4gdGhlIFZhcmlhYmlsaXR5IEVsZW1lbnQgYW5kIG90aGVyIFZhcmlhYmlsaXR5IEVsZW1lbnRzLg0KLTwvYm9keT4NCi0gICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgIDwvb3duZWRMaXRlcmFsPg0KLSAgICAgIDxvd25lZExpdGVyYWwgeG1pOmlkPSJfdFdEWGJ5WDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iY29udHJpYnV0ZXMiPg0KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il90V0RYY0NYNUVkMktuSjJ5ak5YaFdRIiBhbm5vdGF0ZWRFbGVtZW50PSJfdFdEWGJ5WDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICAgIDxib2R5PkNvbnRyaWJ1dGVzIHByb3ZpZGVzIGEgd2F5IGZvciBpbnN0YW5jZXMgb2YgVmFyaWFiaWxpdHkgRWxlbWVudHMgdG8gY29udHJpYnV0ZSB0aGVpciBwcm9wZXJ0aWVzIGludG8gdGhlaXIgYmFzZSBWYXJpYWJpbGl0eSBFbGVtZW50IHdpdGhvdXQgZGlyZWN0bHkgYWx0ZXJpbmcgYW55IG9mIGl0cyBleGlzdGluZyBwcm9wZXJ0aWVzLCBpLmUuIGluIGFuIGFkZGl0aXZlIGZhc2hpb24uICBQcm9wZXJ0aWVzIGNvbnRyaWJ1dGVkIGFyZTogYXR0cmlidXRlIHZhbHVlcyBhbmQgYXNzb2NpYXRpb24gaW5zdGFuY2VzLiAgVGhlIGVmZmVjdCBhZnRlciBpbnRlcnByZXRhdGlvbiBvZiBjb250cmlidXRpb24gaXMgdGhhdCB0aGUgYmFzZSBWYXJpYWJpbGl0eSBFbGVtZW50IGlzIGxvZ2ljYWxseSByZXBsYWNlZCB3aXRoIGFuIGF1Z21lbnRlZCB2YXJpYW50IG9mIHRoZSBlbGVtZW50IHRoYXQgY29tYmluZXMgYXR0cmlidXRlIHZhbHVlcyBhbmQgYXNzb2NpYXRpb24gaW5zdGFuY2VzLiAgVGhlIHdheSB0aGlzIGNvbWJpbmF0aW9uIGlzIHJlYWxpemVkIGRlcGVuZHMgb24gdGhlIHR5cGUgb2YgdGhlIGF0dHJpYnV0ZSBvciBhc3NvY2lhdGlvbi4gIEZvciBleGFtcGxlLCBTdHJpbmcgYXR0cmlidXRlcyBhcmUgY29uY2F0ZW5hdGVkIHJlc29sdmluZyBlbWJlZGRlZCBjb21tYW5kcyBmb3IgZGVwZW5kZW50IHRleHQgb3IgbWVyZ2luZyB0ZXh0IGZyYWdtZW50cyAoZS5nLiBkZXNjcmlwdGlvbnMgZm9yIGNvbnRlbnQgZWxlbWVudHMpLiAgQWRkaXRpb25hbCBlbGVtZW50cyBpbiB0by1tYW55IGFzc29jaWF0aW9ucyBhcmUgYWRkZWQgKGUuZy4gYWRkaXRpb25hbCBHdWlkYW5jZSBlbGVtZW50cyBvciBUYXNrIERlc2NyaXB0b3JzIG9mIGFuIEFjdGl2aXR5KS4gIERpZmZlcmVudCBlbGVtZW50cyBpbiB0by1vbmUgYXNzb2NpYXRpb25zIGFyZSBpZ25vcmVkIChlLmcuIHRoZSBvbmUgUHJpbWFyeSBQZXJmb3JtZXIgb2YgYSBUYXNrKS4gIE11bHRpcGxlIENvbnRlbnQgRWxlbWVudHMgY2FuIGNvbnRyaWJ1dGUgdG8gdGhlIHNhbWUgYmFzZSBlbGVtZW50IGFuZCBhbGwgb2YgdGhlc2UgY29udHJpYnV0aW9ucyBwcm9wZXJ0aWVzIGFyZSBhZGRlZCB0byB0aGUgYmFzZSBpbiB0aGUgc2FtZSBmYXNoaW9uLiBUaGUgZm9sbG93aW5nIHRhYmxlIHByb3ZpZGVzIHRoZSBkZXRhaWxlZCBsaXN0IG9mIGludGVycHJldGF0aW9uIHJ1bGVzOg0KLWF0dHJpYnV0ZSB2YWx1ZXM6CVN0cmluZyB2YWx1ZXMgZnJvbSB0aGUgc3BlY2lhbCBWYXJpYWJpbGl0eSBFbGVtZW50IGFyZSBjb25jYXRlbmF0ZWQgd2l0aCB2YWx1ZXMgZnJvbSB0aGUgYmFzZWQtb24gVmFyaWFiaWxpdHkgRWxlbWVudC4gIE90aGVyIHZhbHVlcyBmcm9tIHRoZSBzcGVjaWFsIFZhcmlhYmlsaXR5IEVsZW1lbnQgb2YgYW55IG90aGVyIHR5cGUgc3VjaCBhcyBJbnRlZ2VyLCBEYXRlIGFyZSBpZ25vcmVkLg0KLVRoZSBpZGVudGlmeWluZyBhdHRyaWJ1dGVzIGd1aWQgYW5kIG5hbWUgb2YgTWV0aG9kIEVsZW1lbnQgYXJlIGV4ZW1wdCBmcm9tIHRoaXMgcnVsZSBhbmQgd2lsbCBub3QgYmUgbW9kaWZpZWQuDQotMC4uMS1hc3NvY2lhdGlvbiBpbnN0YW5jZXM6CVRoZSBvbmUgYXNzb2NpYXRpb24gaW5zdGFuY2Ugb2YgdGhlIGJhc2VkLW9uIFZhcmlhYmlsaXR5IEVsZW1lbnQgaXMga2VwdCBhbmQgYW55IGFzc29jaWF0aW9uIGZyb20gdGhlIGNvbnRyaWJ1dGluZyBzcGVjaWFsIFZhcmlhYmlsaXR5IEVsZW1lbnQgaXMgaWdub3JlZC4NCi0wLi5uLWFzc29jaWF0aW9uIGluc3RhbmNlczoJQXNzb2NpYXRpb24gaW5zdGFuY2VzIG9mIHRoZSBzcGVjaWFsIFZhcmlhYmlsaXR5IEVsZW1lbnQgYXJlIGFkZGVkIHRvIHRoZSBhbHJlYWR5IGV4aXN0aW5nIGFzc29jaWF0aW9uIGluc3RhbmNlcyBvZiB0aGUgYmFzZWQtb24gZWxlbWVudC4gIElmIGJvdGggVmFyaWFiaWxpdHkgRWxlbWVudHMgcmVmZXIgdG8gdGhlIHNhbWUgb2JqZWN0IHRoZW4gb25seSBvbmUgaW5zdGFuY2Ugb2YgdGhlIGFzc29jaWF0aW9uIHdpbGwgcmVtYWluLg0KLTwvYm9keT4NCi0gICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgIDwvb3duZWRMaXRlcmFsPg0KLSAgICAgIDxvd25lZExpdGVyYWwgeG1pOmlkPSJfdFdEWGNTWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iZXh0ZW5kcyI+DQotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3RXRFhjaVg1RWQyS25KMnlqTlhoV1EiIGFubm90YXRlZEVsZW1lbnQ9Il90V0RYY1NYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgICAgPGJvZHk+RXh0ZW5zaW9uIGFsbG93cyBNZXRob2QgUGx1Z2lucyB0byBlYXNpbHkgcmV1c2UgZWxlbWVudHMgZnJvbSBhIEJhc2UgUGx1Z2luIGJ5IHByb3ZpZGluZyBhIGtpbmQgb2YgaW5oZXJpdGFuY2UgZm9yIHRoZSBzcGVjaWFsIFZhcmlhYmlsaXR5IEVsZW1lbnQuICBBdHRyaWJ1dGUgdmFsdWVzIGFuZCBBc3NvY2lhdGlvbiBpbnN0YW5jZXMgYXJlIGluaGVyaXRlZCBmcm9tIHRoZSBiYXNlZC1vbiBWYXJpYWJpbGl0eSBFbGVtZW50IHRvIHRoZSBzcGVjaWFsIFZhcmlhYmlsaXR5IEVsZW1lbnQuICBUaGUgcmVzdWx0IG9mIGludGVycHJldGF0aW9uIGlzIHRoYXQgdGhlIHNwZWNpYWwgZWxlbWVudCBoYXMgdGhlIHNhbWUgcHJvcGVydGllcyBhcyB0aGUgYmFzZWQtb24gaGFzLCBidXQgbWlnaHQgZGVmaW5lIGl0cyBvd24gYWRkaXRpb25zLiAgSGVuY2UgZXh0ZW5kcyBpcyBub3QgdXNlZCB0byBtb2RpZnkgY29udGVudCBvZiB0aGUgYmFzZSBQbHVnaW4sIGJ1dCB0byBwcm92aWRlIHRoZSBhYmlsaXR5IGZvciB0aGUgZXh0ZW5kaW5nIFBsdWdpbiB0byBkZWZpbmUgaXRzIG93biBjb250ZW50IHdoaWNoIGlzIGEgdmFyaWFudCBvZiBjb250ZW50IGFscmVhZHkgZGVmaW5lZCAoZS5nLiBhIHNwZWNpYWwgdmVyc2lvbiBvZiBhIGdlbmVyaWMgUmV2aWV3IFJlY29yZCBmb3IgYSBzcGVjaWZpYyB0eXBlIG9mIHJldmlldykuICBUaGUgZWZmZWN0IG9mIHRoaXMgaXMgdGhhdCB0aGUgYmFzZSBWYXJpYWJpbGl0eSBFbGVtZW50IGFuZCBhbnkgbnVtYmVyIG9mIGV4dGVuZGluZyBWYXJpYWJpbGl0eSBFbGVtZW50cyBjYW4gYmUgdXNlZCBzaWRlIGJ5IHNpZGUsIGJ1dCByZWZlciB0byBlYWNoIG90aGVyIHZpYSB0aGUgZXh0ZW5kcyByZWxhdGlvbnNoaXAuICBFeHRlbmRzIGFsc28gcHJvdmlkZXMgdGhlIGtleSBtZWNoYW5pc20gZm9yIGJpbmRpbmcgQ2FwYWJpbGl0eSBQYXR0ZXJucyB0byBQcm9jZXNzZXM6IEEgcGF0dGVybiBpcyBhcHBsaWVkIGJ5IGRlZmluaW5nIGFuIGV4dGVuZHMgcmVsYXRpb25zaGlwcyBmcm9tIGFuIEFjdGl2aXR5IG9mIHRoZSBhcHBseWluZyBQcm9jZXNzZXMgdG8gdGhlIFBhdHRlcm4uICBUaGUgQWN0aXZpdHkgaW5oZXJpdHMgYXNzb2NpYXRpb25zIGluc3RhbmNlcyBmcm9tIHRoZSBwYXR0ZXJuIGFuZCB0aGUgcGF0dGVybiBhcHBlYXJzIHRvIGJlIHBhcnQgb2YgdGhlIHJlc3VsdGluZyBQcm9jZXNzIGFmdGVyIEludGVycHJldGF0aW9uLg0KLWF0dHJpYnV0ZSB2YWx1ZXM6CVZhbHVlcyBmcm9tIHRoZSBiYXNlZC1vbiBWYXJpYWJpbGl0eSBlbGVtZW50IGFyZSBpbmhlcml0ZWQgYW5kIHVzZWQgdG8gcG9wdWxhdGUgdGhlIHNwZWNpYWwgVmFyaWFiaWxpdHkgRWxlbWVudHMgYXR0cmlidXRlcy4gIElmIHRoZSBzcGVjaWFsIGVsZW1lbnQgYXR0cmlidXRlcyBhcmUgYWxyZWFkeSBwb3B1bGF0ZWQgdGhlIGluaGVyaXRlZCB2YWx1ZXMgYXJlIGlnbm9yZWQuICANCi1UaGUgaWRlbnRpZnlpbmcgYXR0cmlidXRlcyBndWlkIGFuZCBuYW1lIG9mIE1ldGhvZCBFbGVtZW50IGFyZSBleGVtcHQgZnJvbSB0aGlzIHJ1bGUgYW5kIHdpbGwgbm90IGJlIG1vZGlmaWVkLg0KLTAuLjEtYXNzb2NpYXRpb24gaW5zdGFuY2VzOglUaGUgb25lIGFzc29jaWF0aW9uIGluc3RhbmNlIG9mIHRoZSBiYXNlZC1vbiBWYXJpYWJpbGl0eSBFbGVtZW50IGlzIGluaGVyaXRlZCB0byB0aGUgc3BlY2lhbCBWYXJpYWJpbGl0eSBFbGVtZW50LiAgSWYgdGhlIHNwZWNpYWwgVmFyaWFiaWxpdHkgRWxlbWVudCBkZWZpbmVzIGl0cyBvd24gYXNzb2NpYXRpb24gaW5zdGFuY2UgdGhlbiB0aGUgaW5oZXJpdGVkIG9uZSBpcyBpZ25vcmVkLg0KLTAuLm4tYXNzb2NpYXRpb24gaW5zdGFuY2VzOglBc3NvY2lhdGlvbiBpbnN0YW5jZXMgZGVmaW5lZCBmb3IgdGhlIGJhc2VkLW9uIFZhcmlhYmlsaXR5IEVsZW1lbnQgYXJlIGluaGVyaXRlZCB0byB0aGUgc3BlY2lhbCBWYXJpYWJpbGl0eSBFbGVtZW50LiAgVGhlIHNwZWNpYWwgZWxlbWVudCBjYW4gYWRkIGFkZGl0aW9uYWwgYXNzb2NpYXRpb24gaW5zdGFuY2VzLg0KLQ0KLTwvYm9keT4NCi0gICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgIDwvb3duZWRMaXRlcmFsPg0KLSAgICAgIDxvd25lZExpdGVyYWwgeG1pOmlkPSJfdFdEWGN5WDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0icmVwbGFjZXMiPg0KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il90V0RYZENYNUVkMktuSjJ5ak5YaFdRIiBhbm5vdGF0ZWRFbGVtZW50PSJfdFdEWGN5WDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICAgIDxib2R5PlJlcGxhY2VzIHByb3ZpZGVzIGEgd2F5IGZvciBWYXJpYWJpbGl0eSBFbGVtZW50cyB0byByZXBsYWNlIGEgYmFzZSBWYXJpYWJpbGl0eSBFbGVtZW50IHdpdGhvdXQgZGlyZWN0bHkgY2hhbmdpbmcgYW55IG9mIGl0cyBleGlzdGluZyBwcm9wZXJ0aWVzLiAgVGhpcyBpcyBpbiBtb3N0IGNhc2VzIHVzZWQgZm9yIE1ldGhvZCBQbHVnaW5zIHRoYXQgYWltIHRvIHJlcGxhY2Ugc3BlY2lmaWMgQ29udGVudCBFbGVtZW50cyBzdWNoIGFzIFJvbGVzLCBUYXNrLCBvciBBY3Rpdml0aWVzIHdpdGggZWl0aGVyIGEgY29tcGxldGUgbmV3IHZhcmlhbnQgb3IgdG8gY2hhbmdlIGZ1bmRhbWVudGFsIHJlbGF0aW9uc2hpcHMgb2YgdGhlc2UgZWxlbWVudHMgKGUuZy4gUm9sZS1BcnRpZmFjdCByZXNwb25zaWJpbGl0eSkuICBQcm9wZXJ0aWVzIHJlcGxhY2VkIGFyZSBhdHRyaWJ1dGUgdmFsdWVzIGFuZCBhc3NvY2lhdGlvbiBpbnN0YW5jZXMuICBUaGUgZWZmZWN0IG9mIHRoaXMgaXMgdGhhdCB0aGUgYmFzZSBDb250ZW50IEVsZW1lbnQgaXMgbG9naWNhbGx5IHJlcGxhY2VkIHdpdGggdGhpcyBuZXcgdmFyaWFudCBvZiB0aGUgZWxlbWVudCB0byB3aGljaCBhbGwgaW5jb21pbmcgYXNzb2NpYXRpb25zIHN0aWxsIHBvaW50IGFzIGJlZm9yZSwgYnV0IHdoaWNoIGhhcyBwb3RlbnRpYWxseSBuZXcgYXR0cmlidXRlIHZhbHVlcyBhbmQgb3V0Z29pbmcgYXNzb2NpYXRpb24gcHJvcGVydGllcy4gIFRoaXMgcHJvdmlkZXMgYSB2ZXJ5IHBvd2VyZnVsIG1lY2hhbmlzbSB0byByZXBsYWNlLCBmb3IgZXhhbXBsZSwgd2hvbGUgQWN0aXZpdGllcyBpbiBhIFByb2Nlc3Mgd2l0aCBjb21wbGV0ZSBuZXcgcmVhbGl6YXRpb25zIG9mIHRoZSBBY3Rpdml0eS4gIEZvciBpbnN0YW5jZSwgcmVwbGFjaW5nIGFuIEFjdGl2aXR5IGRvaW5nIHVzZSBjYXNlLWJhc2VkIGRlc2lnbiB3aXRoIGFuIGFjdGl2aXR5IGRvaW5nIGFnaWxlIGNvZGUtY2VudHJpYyBkZXZlbG9wbWVudCBkb2luZyB0aGUgc2FtZSB3b3JrIHVzaW5nIGEgZGlmZmVyZW50IGRldmVsb3BtZW50IHRlY2huaXF1ZSB1dGlsaXppbmcgZGlmZmVyZW50IFJvbGVzLCBUYXNrcywgZXRjLiAgQW5vdGhlciBleGFtcGxlLCB3b3VsZCBiZSB0byByZXBsYWNlIGFuIEFjdGl2aXR5IHRoYXQgZGVzY3JpYmVzIGRhdGFiYXNlIGRlc2lnbiBmb3IgYW4gUkRCTVMgd2l0aCBhbiBBY3Rpdml0eSB0aGF0IGRlc2NyaWJlcyBkYXRhYmFzZSBkZXNpZ24gZm9yIGFuIE9PREJNUy4gIEEgVmFyaWFiaWxpdHkgRWxlbWVudCBjYW4gb25seSBiZSByZXBsYWNlZCBieSBvbmUgb3RoZXIgZWxlbWVudCBhdCBhIHRpbWUuICBGb3IgZXhhbXBsZSwgaWYgdHdvIE1ldGhvZCBQbHVnaW5zIHJlcGxhY2UgdGhlIHNhbWUgZWxlbWVudCBvbmx5IG9uZSBNZXRob2QgUGx1Z2luIGNhbiBiZSB1c2VkIGZvciBpbnRlcnByZXRhdGlvbiAoc2VlIGNvbmNlcHQgb2YgTWV0aG9kIENvbmZpZ3VyYXRpb24gZm9yIG1vcmUgZGV0YWlscyBvbiBob3cgdG8gcmVzb2x2ZSBzdWNoIGNvbmZsaWN0cywgU2VjdGlvbiA3LjEuMikuICBUaGUgZm9sbG93aW5nIHRhYmxlIHByb3ZpZGVzIHRoZSBkZXRhaWxlZCBsaXN0IG9mIGludGVycHJldGF0aW9uIHJ1bGVzOg0KLWF0dHJpYnV0ZSB2YWx1ZXM6CVZhbHVlcyBmcm9tIHRoZSBzcGVjaWFsIFZhcmlhYmlsaXR5IEVsZW1lbnQgYXJlIHJlcGxhY2VkIHdpdGggdmFsdWVzIGZyb20gdGhlIGJhc2VkLW9uIFZhcmlhYmlsaXR5IEVsZW1lbnQgaW5jbHVkaW5nIHVuYXNzaWduZWQgdmFsdWVzLg0KLVRoZSBpZGVudGlmeWluZyBhdHRyaWJ1dGVzIGd1aWQgYW5kIG5hbWUgb2YgTWV0aG9kIEVsZW1lbnQgYXJlIGV4ZW1wdCBmcm9tIHRoaXMgcnVsZSBhbmQgd2lsbCBub3QgYmUgbW9kaWZpZWQuDQotMC4uMS1hc3NvY2lhdGlvbiBpbnN0YW5jZXM6CVRoZSBvbmUgYXNzb2NpYXRpb24gaW5zdGFuY2Ugb2YgdGhlIGJhc2VkLW9uIFZhcmlhYmlsaXR5IEVsZW1lbnQgaXMgcmVwbGFjZWQgd2l0aCB0aGUgYXNzb2NpYXRpb24gaW5zdGFuY2UgZnJvbSB0aGUgcmVwbGFjaW5nIHNwZWNpYWwgVmFyaWFiaWxpdHkgRWxlbWVudC4gIElmIHRoZSBzcGVjaWFsIFZhcmlhYmlsaXR5IEVsZW1lbnQgZG9lcyBub3QgaGF2ZSBhbiBhc3NvY2lhdGlvbiBpbnN0YW5jZSB0aGVuIHJlc3VsdGluZyBlbGVtZW50IHdpbGwgYWxzbyBub3QgaGF2ZSBhbiBhc3NvY2lhdGlvbi4NCi0wLi5uLWFzc29jaWF0aW9uIGluc3RhbmNlczoJQXNzb2NpYXRpb24gaW5zdGFuY2VzIG9mIHRoZSBzcGVjaWFsIFZhcmlhYmlsaXR5IEVsZW1lbnQgcmVwbGFjZSBhbGwgYXNzb2NpYXRpb24gaW5zdGFuY2VzIG9mIHRoZSBiYXNlZC1vbiBWYXJpYWJpbGl0eSBFbGVtZW50Lg0KLQ0KLTwvYm9keT4NCi0gICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgIDwvb3duZWRMaXRlcmFsPg0KLSAgICAgIDxvd25lZExpdGVyYWwgeG1pOmlkPSJfdFdEWGRTWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0ibG9jYWxDb250cmlidXRpb24iLz4NCi0gICAgICA8b3duZWRMaXRlcmFsIHhtaTppZD0iX3RXRFhkaVg1RWQyS25KMnlqTlhoV1EiIG5hbWU9ImxvY2FsUmVwbGFjZW1lbnQiLz4NCi0gICAgICA8b3duZWRMaXRlcmFsIHhtaTppZD0iX3RXRFhkeVg1RWQyS25KMnlqTlhoV1EiIG5hbWU9ImV4dGVuZHNSZXBsYWNlcyIvPg0KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il90V05JVUNYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJWYXJpYWJpbGl0eUVsZW1lbnQiIGlzQWJzdHJhY3Q9InRydWUiPg0KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfdFdOSVVTWDVFZDJLbkoyeWpOWGhXUSIgYW5ub3RhdGVkRWxlbWVudD0iX3RXTklVQ1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPGJvZHk+VmFyaWFiaWxpdHkgRWxlbWVudCBpcyBhbiBhYnN0cmFjdCBjbGFzcyBkZXJpdmVkIGZyb20gTWV0aG9kIEVsZW1lbnQgdGhhdCBwcm92aWRlcyBuZXcgY2FwYWJpbGl0aWVzIGZvciBjb250ZW50IHZhcmlhdGlvbiBhbmQgZXh0ZW5zaW9uIHRvIENvbnRlbnQgRWxlbWVudHMgb3IgYW55IG90aGVyIE1ldGhvZCBFbGVtZW50IHRoYXQgZGVyaXZlcyBmcm9tIGl0LiAgSXQgaGFzIGJlZW4gcGxhY2VkIGluLWJldHdlZW4gdGhlIGNsYXNzZXMgTWV0aG9kIEVsZW1lbnQgYW5kIENvbnRlbnQgRWxlbWVudCBpbiB0aGUgb3ZlcmFsbCBVTUEgdGF4b25vbXkgb2YgY2xhc3NlcyB1c2luZyB0aGUgVU1MIDIuMCBwYWNrYWdlIG1lcmdlIG1lY2hhbmlzbS4gIFRoZSBhc3NvY2lhdGlvbiBWYXJpYWJpbGl0eSBTcGVjaWFsaXphdGlvbiBzaGFsbCBvbmx5IGJlIGluc3RhbnRpYXRlZCBiZXR3ZWVuIHR3byBzdWJjbGFzc2VzIG9mIFZhcmlhYmlsaXR5IEVsZW1lbnQgb2YgdGhlIHNhbWUgdHlwZS4gIFRoZSBlbGVtZW50IG9uIHZhcmFpYmlsaXR5U3BlY2lhbEVsZW1lbnQgc2lkZSBvZiB0aGUgcmVsYXRpb25zaGlwIGRlZmluZXMgYSB2YWx1ZSBmb3IgdGhlIGF0dHJpYnV0ZSB2YXJpYWJpbGl0eVR5cGUgZGVmaW5pbmcgdGhlIG5hdHVyZSBvZiB0aGUgcmVsYXRpb25zaGlwIHVzaW5nIGEgbGl0ZXJhbCBmcm9tIHRoZSBlbnVtZXJhdGlvbiBWYXJpYWJpbGl0eSBUeXBlLg0KLVZhcmlhYmlsaXR5IEVsZW1lbnQgb2YgdGhlIG1ldGEtbW9kZWwgcGFja2FnZSBNZXRob2QgUGx1Z2lucyBhZGRzIHRoZSBjYXBhYmlsaXRpZXMgb2YgdmFyaWF0aW9uIGFuZCBleHRlbnNpb24gdG8gTWV0aG9kIEVsZW1lbnRzIHRoYXQgZGVyaXZlIGZyb20gaXQuICBCeSBkZWZhdWx0IGFsbCBDb250ZW50IEVsZW1lbnRzIHN1Y2ggYXMgUm9sZSwgVGFzaywgR3VpZGFuY2UgVHlwZXMsIG9yIEFjdGl2aXRpZXMgYXJlIGRlZmluZWQgdG8gYmUgVmFyaWFiaWxpdHkgRWxlbWVudHMuDQotVmFyaWFiaWxpdHkgYW5kIGV4dGVuc2lvbiBwcm92aWRlcyB1bmlxdWUgbWVjaGFuaXNtcyBmb3IgY3VzdG9taXppbmcgbWV0aG9kIGNvbnRlbnQgd2l0aG91dCBhY3R1YWxseSBkaXJlY3RseSBtb2RpZnlpbmcgdGhlIG9yaWdpbmFsIGNvbnRlbnQsIGJ1dCBieSBqdXN0IGJlIGFibGUgdG8gZGVzY3JpYmUgd2l0aCBzZXBhcmF0ZSBvYmplY3RzIHRoZSBkaWZmZXJlbmNlcyAoYWRkaXRpb25zLCBjaGFuZ2VzLCBvbWlzc2lvbnMpIHJlbGF0aXZlIHRvIHRoZSBvcmlnaW5hbC4gIFRoaXMgcGx1Zy1pbiBjb25jZXB0IGFsbG93cyB1c2VycyB0byBmYWN0b3IgdGhlaXIgbWV0aG9kIGNvbnRlbnQgYW5kIHByb2Nlc3NlcyBpbiBpbnRlcnJlbGF0ZWQgdW5pdHMgYW5kIGV2ZW4gdG8gYXJjaGl0ZWN0IG1ldGhvZCBjb250ZW50IGFuZCBwcm9jZXNzZXMgaW4gbGF5ZXJzIHRoYXQgZXh0ZW5kIGVhY2ggb3RoZXIgd2l0aCBuZXcgY2FwYWJpbGl0aWVzLiAgVGhlIHJlc3VsdGluZyBtZXRob2QgYW5kIHByb2Nlc3MgZGVzaWduIGNhbiBiZSBkeW5hbWljYWxseSBjb21iaW5lZCBhbmQgYXBwbGllZCBvbiBkZW1hbmQgdXNpbmcgdGhlIGludGVycHJldGF0aW9uIHJ1bGVzIGRlZmluZWQgZm9yIFZhcmlhYmlsaXR5IEVsZW1lbnQgU3BlY2lhbGl6YXRpb25zIGFzc2VtYmxpbmcgdG8gcHJvY2VzcyBwcmFjdGl0aW9uZXJzIHRoZSBtb3N0IGFjY3VyYXRlIG1ldGhvZCBhbmQgcHJvY2VzcyBkZXNjcmlwdGlvbnMgcG9zc2libGUuICBJdCBhbHNvIGFsbG93cyBwcm9jZXNzIHByYWN0aXRpb25lcnMgdG8gZXh0ZW5kcyBhbmQgdGFpbG9yIG1ldGhvZCBjb250ZW50IGFuZCBwcm9jZXNzZXMgdGhleSBkbyBub3Qgb3duIGFuZCB0byBlYXNpbHkgdXBncmFkZSB0byBuZXdlciB2ZXJzaW9ucyBieSBzaW1wbHkgcmVhcHBseSB0aGVpciBwZXJzb25hbCBjaGFuZ2VzIHRvIHRoZXNlIHVwZ3JhZGVzLg0KLVZhcmlhYmlsaXR5IEVsZW1lbnQgZGVmaW5lcyB0d28gdHlwZXMgb2YgdmFyaWFiaWxpdHkgYW5kIG9uZSB0eXBlIG9mIGV4dGVuc2lvbiB3aGljaCBhcmUgZm9ybWFsbHkgZGVmaW5lZCBmb3IgdGhlIGVudW1lcmF0aW9uIFZhcmlhYmlsaXR5IFR5cGUuDQotPC9ib2R5Pg0KLSAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il90V05JVWlYNUVkMktuSjJ5ak5YaFdRIiBnZW5lcmFsPSJfdEI4SWdTWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il90V05JVXlYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJ2YXJpYWJpbGl0eVR5cGUiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3RXRFhheVg1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il90V05JVkNYNUVkMktuSjJ5ak5YaFdRIiBhbm5vdGF0ZWRFbGVtZW50PSJfdFdOSVV5WDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICAgIDxib2R5PklmIGluIGluc3RhbmNlIG9mIHRoZSB2YXJpYWJpbGl0eVNwZWNpYWxpemF0aW9uIGFzc29jaWF0aW9uIGJldHdlZW4gdHdvIFZhcmlhYmlsaXR5IEVsZW1lbnRzIG9mIHRoZSBzYW1lIHR5cGUgZXhpc3RzLCB0aGVuIHRoZSB2YXJpYWJpbGl0eVR5cGUgYXR0cmlidXRlIHNwZWNpZmllcyBob3cgdGhlIGVsZW1lbnQgYXQgdGhlIHZhcmlhYmlsaXR5U3BlY2lhbEVsZW1lbnQgZW5kIG9mIHRoZSBhc3NvY2lhdGlvbiBjaGFuZ2VzIHRoZSBDb250ZW50IEVsZW1lbnQgYXQgdGhlIHZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQgZW5kLiBTZWUgdGhlIFZhcmlhYmlsaXR5IFR5cGUgZW51bWVyYXRpb24gY2xhc3MgZm9yIGRlZmluaXRpb25zIGZvciB0aGUgZGlmZmVyZW50IHR5cGVzIG9mIHZhcmlhYmlsaXR5LjwvYm9keT4NCi0gICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iX3RXTklWU1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgICA8Ym9keT5uYTwvYm9keT4NCi0gICAgICAgIDwvZGVmYXVsdFZhbHVlPg0KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3RXTklWaVg1RWQyS25KMnlqTlhoV1EiIG5hbWU9InZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3RXTklVQ1g1RWQyS25KMnlqTlhoV1EiIGFzc29jaWF0aW9uPSJfdFdOSWF5WDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il90V05JVnlYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iMSIvPg0KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfdFdOSVdDWDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IjEiLz4NCi0gICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il90Q0ZTY0NYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJTZWN0aW9uIj4NCi0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3RDRlNjU1g1RWQyS25KMnlqTlhoV1EiIGFubm90YXRlZEVsZW1lbnQ9Il90Q0ZTY0NYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDxib2R5PkEgU2VjdGlvbiBpcyBhIHNwZWNpYWwgTWV0aG9kIEVsZW1lbnQgdGhhdCByZXByZXNlbnRzIHN0cnVjdHVyYWwgc3Vic2VjdGlvbnMgb2YgYSBDb250ZW50IERlc2NyaXB0aW9uJ3Mgc2VjdGlvbkRlc2NyaXB0aW9uIGF0dHJpYnV0ZS4gIEl0IGlzIHVzZWQgZm9yIGVpdGhlciBsYXJnZSBzY2FsZSBkb2N1bWVudGF0aW9uIG9mIENvbnRlbnQgRWxlbWVudHMgb3JnYW5pemVkIGludG8gc2VjdGlvbnMgYXMgd2VsbCBhcyB0byBmbGV4aWJseSBhZGQgbmV3IFNlY3Rpb25zIHRvIENvbnRlbnQgRWxlbWVudHMgdXNpbmcgY29udHJpYnV0aW9uIHZhcmlhYmlsaXR5IGFkZGVkIHRvIHRoZSBTZWN0aW9uIGNvbmNlcHQgZm9yIE1ldGhvZCBQbHVnLWlucy48L2JvZHk+DQotICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il90V05JV1NYNUVkMktuSjJ5ak5YaFdRIiBhbm5vdGF0ZWRFbGVtZW50PSJfdENGU2NDWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8Ym9keT5TZWN0aW9uIGluIHRoZSBwYWNrYWdlIE1ldGhvZCBQbHVnaW4gaW5oZXJpdHMgZnJvbSBWYXJpYWJpbGl0eSBFbGVtZW50IGFuZCBleHRlbmRzIFNlY3Rpb24gZGVmaW5lZCBpbiBNZXRob2QgQ29yZSA6OiBCYXNpYyBFbGVtZW50cyB3aXRoIG5ldyBjYXBhYmlsaXRpZXMgZm9yIHZhcmlhYmlsaXR5LiANCi1Gb3IgZXhhbXBsZSwgd2hlbiBhIFRhc2sgY29udHJpYnV0ZXMgdG8gYW5vdGhlciBUYXNrIGl0cyBQcmVzZW50YXRpb24gYXNzb2NpYXRpb24gaXMgY29udHJpYnV0ZWQgaW5jbHVkaW5nIGl0cyBTZWN0aW9ucyAoaS5lLiBpdHMgU3RlcHMpLCB3aGljaCBhcmUgbW9kZWxlZCBhcyBwYXJ0cyBvZiB0aGUgQ29udGVudCBEZXNjcmlwdGlvbiBpbnN0YW5jZS4gIFNlY3Rpb25zIGNhbiBiZSBuZXN0ZWQgYW5kIHRoZXJlZm9yZSBUYXNrIERlc2NyaXB0aW9ucyBjYW4gYmUgZmxleGlibHkgb3JnYW5pemVkIGluIFN0ZXBzIHdpdGggc3ViLVN0ZXBzLiAgU2VjdGlvbnMgYXJlIFZhcmlhYmlsaXR5IEVsZW1lbnRzIHRoZW1zZWx2ZXMsIHNvIHRoZXkgY2FuIGNvbnRyaWJ1dGUgdG8gZWFjaCBvdGhlci4gIEZvciBleGFtcGxlLCBvbmUgY291bGQgbW9kZWwgYSBUYXNrIHN0ZXAgYXMgYSBTZWN0aW9uIGluc3RhbmNlIHdpdGhvdXQgcmVsYXRpbmcgaXQgdG8gYSBUYXNrIERlc2NyaXB0aW9uIHRoYXQgZGlyZWN0bHkgY29udHJpYnV0ZXMgdG8gKG9yIHJlcGxhY2VzKSBhbm90aGVyIFNlY3Rpb24gd2hpY2ggaXMgcGFydCBvZiBhIFRhc2sgRGVzY3JpcHRpb24uICBUaGlzIGNvbnRyaWJ1dGlvbiAob3IgcmVwbGFjZW1lbnQpIHdvdWxkIGFkZCBuZXcgZGVzY3JpcHRpb24gdGV4dCB0byB0aGUgb3JpZ2luYWwgc3RlcCBkZXNjcmlwdGlvbiAob3IgcmVwbGFjZSB0aGUgb3JpZ2luYWwgc3RlcCBkZXNjcmlwdGlvbikuICBBbm90aGVyIGV4YW1wbGUgd291bGQgYmUgdG8gY29udHJpYnV0ZSBuZXcgQ2hlY2sgTGlzdCBpdGVtcyBvcmdhbml6ZWQgYXMgU2VjdGlvbnMgdG8gYW4gZXhpc3RpbmcgQ2hlY2sgTGlzdCAoZGVmaW5lZCBhcyBndWlkYW5jZSkuICANCi0NCi08L2JvZHk+DQotICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3RXTklXaVg1RWQyS25KMnlqTlhoV1EiIGdlbmVyYWw9Il90V05JVUNYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3RDRlNjeVg1RWQyS25KMnlqTlhoV1EiIG5hbWU9InNlY3Rpb25OYW1lIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il90QmZjdENYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfdENGU2RDWDVFZDJLbkoyeWpOWGhXUSIgYW5ub3RhdGVkRWxlbWVudD0iX3RDRlNjeVg1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgICA8Ym9keT5FdmVyeSBTZWN0aW9uIGhhcyBhIG5hbWUgdXNlZCBmb3IgZXh0ZXJuYWwgcHJlc2VudGF0aW9uIG9mIHRoZSBzZWN0aW9uLCBlLmcuIHdoZW4gcHVibGlzaGVkIG9yIHdoZW4gc2VjdGlvbiBoZWFkaW5nIGFyZSBsaXN0ZWQgaW4gYSB0YWJsZSBvZiBjb250ZW50cy4gIFRoaXMgYXR0cmlidXRlIGlzIHNpbWlsYXIgdG8gUHJlc2VudGF0aW9uIE5hbWUgZm9yIENvbnRlbnQgRWxlbWVudHMuPC9ib2R5Pg0KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il90Q0ZTZFNYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iMSIvPg0KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfdENGU2RpWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iX3RDRlNkeVg1RWQyS25KMnlqTlhoV1EiIHR5cGU9Il90QmZjdENYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iIi8+DQotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfdENGU2VDWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0ic2VjdGlvbkRlc2NyaXB0aW9uIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il90QmZjdENYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfdENGU2VTWDVFZDJLbkoyeWpOWGhXUSIgYW5ub3RhdGVkRWxlbWVudD0iX3RDRlNlQ1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgICA8Ym9keT5UaGlzIGF0dHJpYnV0ZXMgc3RvcmUgdGhlIGRlc2NyaXB0aW9uIHRleHQgZm9yIGEgQ29udGVudCBEZXNjcmlwdGlvbidzIFNlY3Rpb24uPC9ib2R5Pg0KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il90Q0ZTZWlYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iMSIvPg0KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfdENGU2V5WDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iX3RDRlNmQ1g1RWQyS25KMnlqTlhoV1EiIHR5cGU9Il90QmZjdENYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iIi8+DQotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfdENGU2ZTWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0ic3ViU2VjdGlvbnMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3RDRlNjQ1g1RWQyS25KMnlqTlhoV1EiIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiIGFzc29jaWF0aW9uPSJfdENGU25TWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il90Q0ZTZmlYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfdENGU2Z5WDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3RXTklXeVg1RWQyS25KMnlqTlhoV1EiIG5hbWU9InByZWRlY2Vzc29yIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il90Q0ZTY0NYNUVkMktuSjJ5ak5YaFdRIiBhc3NvY2lhdGlvbj0iX3RXTkljQ1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfdFdOSVhDWDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IjEiLz4NCi0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3RXTklYU1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il90S2xISUNYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJBY3Rpdml0eSI+DQotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il90S2xISVNYNUVkMktuSjJ5ak5YaFdRIiBhbm5vdGF0ZWRFbGVtZW50PSJfdEtsSElDWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8Ym9keT5BbiBBY3Rpdml0eSBpcyBhIFdvcmsgQnJlYWtkb3duIEVsZW1lbnQgYW5kIFdvcmsgRGVmaW5pdGlvbiB3aGljaCBzdXBwb3J0cyB0aGUgbmVzdGluZyBhbmQgbG9naWNhbCBncm91cGluZyBvZiByZWxhdGVkIEJyZWFrZG93biBFbGVtZW50cyBmb3JtaW5nIGJyZWFrZG93biBzdHJ1Y3R1cmVzLiAgQWx0aG91Z2ggQWN0aXZpdHkgaXMgYSBjb25jcmV0ZSBtZXRhLWNsYXNzLCBvdGhlciBjbGFzc2VzIHdoaWNoIHJlcHJlc2VudCBicmVha2Rvd24gc3RydWN0dXJlcyBkZXJpdmUgZnJvbSBpdDsgc3VjaCBhcyBQaGFzZSwgSXRlcmF0aW9uLCBEZWxpdmVyeSBQcm9jZXNzLCBvciBDYXBhYmlsaXR5IFBhdHRlcm4uDQotQWN0aXZpdHkgcmVwcmVzZW50cyBhIGdyb3VwaW5nIGVsZW1lbnQgZm9yIG90aGVyIEJyZWFrZG93biBFbGVtZW50cyBzdWNoIGFzIEFjdGl2aXRpZXMsIERlc2NyaXB0b3JzLCBNaWxlc3RvbmVzLCBldGMuICBJdCBpcyBub3QgcGVyLXNlIGEgJ2hpZ2gtbGV2ZWwnIGdyb3VwaW5nIG9mIG9ubHkgd29yayBhcyBpbiBvdGhlciBtZXRhLW1vZGVscywgYnV0IGdyb3VwcyBhbnkga2luZCBvZiBCcmVha2Rvd24gRWxlbWVudHMuICBGb3IgZXhhbXBsZSwgb25lIGNhbiBkZWZpbmUgdmFsaWQgQWN0aXZpdGllcyB0aGF0IGdyb3VwIG9ubHkgV29yayBQcm9kdWN0cyBEZXNjcmlwdG9ycyB3aXRob3V0IGFueSBtYXRjaGluZyBUYXNrIERlc2NyaXB0b3JzLiAgQWN0aXZpdGllcyBhbHNvIGluaGVyaXQgYWxsIHByb3BlcnRpZXMgZnJvbSBXb3JrIEJyZWFrZG93biBFbGVtZW50IGFuZCBpbmRpcmVjdGx5IGZyb20gUHJvY2VzcyBFbGVtZW50OyBpLmUuIEFjdGl2aXR5IGlzIHJlYWR5IHRvIGhhdmUgYSBmdWxsIGNvbnRlbnQgZGVzY3JpcHRpb24gYXR0YWNoZWQgdG8gaXQuDQotPC9ib2R5Pg0KLSAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfdE9KX3FDWDVFZDJLbkoyeWpOWGhXUSIgYW5ub3RhdGVkRWxlbWVudD0iX3RLbEhJQ1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPGJvZHk+VGhpcyBkZWZpbml0aW9uIG9mIEFjdGl2aXR5IGV4dGVuZHMgQWN0aXZpdHkgaW50cm9kdWNlZCBpbiB0aGUgcGFja2FnZSBCcmVha2Rvd24gd2l0aCBuZXcgY2FwYWJpbGl0aWVzIGFuZCBpcyB0aGUgYmFzaXMgZm9yIHRoZSBkZWZpbml0aW9uIG9mIHRoZSBjbGFzcyBQcm9jZXNzLg0KLUV4dGVuZHMgQWN0aXZpdHkgd2l0aCBhbiBhc3NvY2lhdGlvbiB0byBSb2FkbWFwLiAgVGhpcyBkZWZpbml0aW9uIG9mIEFjdGl2aXR5IGFsc28gcGFydGljaXBhdGVzIGluIHRoZSBleHRlbnNpb24gb2YgdGhlIERpc2NpcGxpbmUgY2F0ZWdvcnkuDQotPC9ib2R5Pg0KLSAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfdFdOSVhpWDVFZDJLbkoyeWpOWGhXUSIgYW5ub3RhdGVkRWxlbWVudD0iX3RLbEhJQ1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPGJvZHk+QWN0aXZpdHkgaW4gdGhlIHBhY2thZ2UgTWV0aG9kIFBsdWdpbiBpbmhlcml0cyBmcm9tIFZhcmlhYmlsaXR5IEVsZW1lbnQgdG8gZXh0ZW5kIEFjdGl2aXR5IHdpdGggbmV3IGNhcGFiaWxpdGllcyBmb3IgdmFyaWFiaWxpdHkuJiN4RDsNCi1BY3Rpdml0eSBpbmhlcml0cyB0aGUgc2VtYW50aWNzIG9mIFZhcmlhYmlsaXR5IEVsZW1lbnQgd2hpY2ggcHJvdmlkZXMga2V5IG1lY2hhbmlzbSB0byBlbmFibGUgZHluYW1pYyBiaW5kaW5nIG9mIENhcGFiaWxpdHkgUGF0dGVybnMgaW4gUHJvY2Vzc2VzIGFzIHdlbGwgYXMgUHJvY2VzcyBDb250cmlidXRpb25zLiAgVmFyaWFiaWxpdHkgaXMgdXNlZCBpbiB0aGUgZm9sbG93aW5nIHdheSBmb3IgQWN0aXZpdGllczomI3hEOw0KLS0gRXh0ZW5kOiBUbyBhcHBseSBhIENhcGFiaWxpdHkgUGF0dGVybiB0byBhIHByb2Nlc3Mgb25lIHdvdWxkIGNyZWF0ZSBhbiBBY3Rpdml0eSB3aGljaCBleHRlbmRzIHRoZSBwYXR0ZXJuJ3MgdG9wLWxldmVsIGFjdGl2aXR5LiAgVGhyb3VnaCBleHRlbnNpb24gdGhlIGV4dGVuZGluZyBBY3Rpdml0eSBpbmhlcml0cyB0aGUgcGF0dGVybnMgQnJlYWtkb3duIEVsZW1lbnRzLiYjeEQ7DQotLSBSZXBsYWNlOiBUbyByZXBsYWNlIGFuIEFjdGl2aXR5IG9mIGFuIGFwcGxpZWQgQ2FwYWJpbGl0eSBQYXR0ZXJuIG9yIGFuIGV4aXN0aW5nIHByb2Nlc3MgZm9yIHdoaWNoIG9uZSBkZXZlbG9wcyBhIFByb2Nlc3MgQ29udHJpYnV0aW9uIChvciBhIGNvbWJpbmF0aW9uIG9mIGJvdGgpIG9uZSB3b3VsZCBjcmVhdGUgYW4gQWN0aXZpdHkgYW5kIHNwZWNpZnkgdGhlIHJlcGxhY2UgdmFyaWFiaWxpdHkgc3BlY2lhbGl6YXRpb24gYmV0d2VlbiB0aGVtLiYjeEQ7DQotLSBDb250cmlidXRlOiBUbyBjb250cmlidXRlIG5ldyBCcmVha2Rvd24gRWxlbWVudHMgdG8gYW4gZXhpc3RpbmcgQWN0aXZpdHkgb25lIHdvdWxkIGRlZmluZSBhbiBBY3Rpdml0eSB3aXRoIEJyZWFrZG93biBFbGVtZW50cyB0aGF0IHJlbGF0ZXMgdmlhIHRoZSBDb250cmlidXRlcyBWYXJpYWJpbGl0eSBTcGVjaWFsaXphdGlvbiB0byB0aGlzIGV4aXN0aW5nIEFjdGl2aXR5LiAgVGhlIGNvbnRyaWJ1dGluZyBBY3Rpdml0eSdzIEJyZWFrZG93biBFbGVtZW50cyB3aWxsIGJlIGFkZGVkIHRvIHRoZSBjb250cmlidXRlZCBBY3Rpdml0eS4mI3hEOw0KLSYjeEQ7DQotPC9ib2R5Pg0KLSAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il90S2xISWlYNUVkMktuSjJ5ak5YaFdRIiBnZW5lcmFsPSJfdEt1UkZpWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il90S2xISXlYNUVkMktuSjJ5ak5YaFdRIiBnZW5lcmFsPSJfdERJYmpDWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il90V05JWHlYNUVkMktuSjJ5ak5YaFdRIiBnZW5lcmFsPSJfdFdOSVVDWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il90V05JWUNYNUVkMktuSjJ5ak5YaFdRIiBnZW5lcmFsPSJfdFdOSWRTWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il90S2xISkNYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJicmVha2Rvd25FbGVtZW50cyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdEtsSFd5WDVFZDJLbkoyeWpOWGhXUSIgYXNzb2NpYXRpb249Il90T1RKbkNYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3RLbEhKU1g1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIqIi8+DQotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il90S2xISmlYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfdE9KX3FpWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0icm9hZG1hcHMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3RPSl9wU1g1RWQyS25KMnlqTlhoV1EiIGFzc29jaWF0aW9uPSJfdE9USmpTWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il90T0pfcXlYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfdE9KX3JDWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3RXTklZU1g1RWQyS25KMnlqTlhoV1EiIG1lbWJlckVuZD0iX3RXTklZeVg1RWQyS25KMnlqTlhoV1EgX3RXRFhXaVg1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfdFdOSVlpWDVFZDJLbkoyeWpOWGhXUSIgYW5ub3RhdGVkRWxlbWVudD0iX3RXTklZU1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPGJvZHk+VGhpcyBjb21wb3NpdGlvbiBhc3NvY2lhdGlvbiByZXByZXNlbnRzIHRoYXQgZXZlcnkgTWV0aG9kIFBhY2thZ2UgKGVpdGhlciBDb250ZW50IFBhY2thZ2UsIFByb2Nlc3MgUGFja2FnZSwgb3IgUHJvY2VzcyBDb21wb25lbnQpIGlzIHBhcnQgb2YgZXhhY3RseSBvbmUgTWV0aG9kIFBsdWdpbi48L2JvZHk+DQotICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgPG93bmVkRW5kIHhtaTppZD0iX3RXTklZeVg1RWQyS25KMnlqTlhoV1EiIG5hbWU9Il9tZXRob2RQbHVnaW4iIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3RXRFhVQ1g1RWQyS25KMnlqTlhoV1EiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il90V05JWVNYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3RXTklaQ1g1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIxIi8+DQotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il90V05JWlNYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iMSIvPg0KLSAgICAgIDwvb3duZWRFbmQ+DQotICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3RXTklaaVg1RWQyS25KMnlqTlhoV1EiIG5hbWU9IkV4dGVuc2lvbiIgbWVtYmVyRW5kPSJfdFdOSWFDWDVFZDJLbkoyeWpOWGhXUSBfdFdEWFhTWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il90V05JWnlYNUVkMktuSjJ5ak5YaFdRIiBhbm5vdGF0ZWRFbGVtZW50PSJfdFdOSVppWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8Ym9keT5UaGlzIGFzc29jaWF0aW9uIGRlZmluZXMgaG93IE1ldGhvZCBQbHVnaW5zIGV4dGVuZCBtYW55IG90aGVyIE1ldGhvZCBQbHVnaW5zLiAgVGhlIGV4dGVuZGluZyBwbHVnLWluIGNvbnRhaW5zIG5ldyBtZXRob2QgZWxlbWVudHMsIGV4dGVuZHMgZXhpc3RpbmcgbWV0aG9kIGVsZW1lbnRzIGFuZCBwcm9jZXNzZXMgdXNpbmcgY29udGVudCBlbGVtZW50IHZhcmlhYmlsaXR5IG1lY2hhbmlzbXMgKGUuZy4gY29udHJpYnV0aW9uLCByZXBsYWNlLCBldGMuKSwgcHJvdmlkZXMgYWRkaXRpb25hbCBEZWxpdmVyeSBhbmQgQ2FwYWJpbGl0eSBQcm9jZXNzZXMgZm9yIGEgTWV0aG9kIEZyYW1ld29yaywgZXRjLjwvYm9keT4NCi0gICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfdFdOSWFDWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0icGx1Z2lucyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdFdEWFVDWDVFZDJLbkoyeWpOWGhXUSIgYXNzb2NpYXRpb249Il90V05JWmlYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3RXTklhU1g1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIqIi8+DQotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il90V05JYWlYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgPC9vd25lZEVuZD4NCi0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfdFdOSWF5WDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0idmFyaWFiaWxpdHlTcGVjaWFsaXphdGlvbiIgbWVtYmVyRW5kPSJfdFdOSWJTWDVFZDJLbkoyeWpOWGhXUSBfdFdOSVZpWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il90V05JYkNYNUVkMktuSjJ5ak5YaFdRIiBhbm5vdGF0ZWRFbGVtZW50PSJfdFdOSWF5WDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8Ym9keT5UaGlzIDEtdG8tbWFueSBhc3NvY2lhdGlvbiBkZWZpbmVzIGluIGNvbWJpbmF0aW9uIHdpdGggdGhlIHZhcmlhYmlsaXR5VHlwZSBhdHRyaWJ1dGUgdGhhdCBhIG51bWJlciBvZiBzcGVjaWFsIFZhcmlhYmlsaXR5IEVsZW1lbnRzIG9mIHRoZSBzYW1lIHR5cGUgcmVwcmVzZW50IGEgdmFyaWF0aW9uIG9mIGV4YWN0bHkgb25lIG90aGVyIFZhcmlhYmlsaXR5IEVsZW1lbnQuICBTZWUgdGhlIFZhcmlhYmlsaXR5IFR5cGUgZW51bWVyYXRpb24gY2xhc3MgZm9yIGRlZmluaXRpb25zIGZvciB0aGUgZGlmZmVyZW50IHR5cGVzIG9mIHZhcmlhYmlsaXR5LjwvYm9keT4NCi0gICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfdFdOSWJTWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0idmFyaWFiaWxpdHlTcGVjaWFsRWxlbWVudCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdFdOSVVDWDVFZDJLbkoyeWpOWGhXUSIgYXNzb2NpYXRpb249Il90V05JYXlYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3RXTkliaVg1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIqIi8+DQotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il90V05JYnlYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgPC9vd25lZEVuZD4NCi0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfdFdOSWNDWDVFZDJLbkoyeWpOWGhXUSIgbWVtYmVyRW5kPSJfdFdOSVd5WDVFZDJLbkoyeWpOWGhXUSBfdFdOSWNpWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il90V05JY1NYNUVkMktuSjJ5ak5YaFdRIiBhbm5vdGF0ZWRFbGVtZW50PSJfdFdOSWNDWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8Ym9keT5UaGlzIGFzc29jaWF0aW9uIGRlc2NyaWJlcyB0aGUgb3JkZXIgaW4gd2hpY2ggY29udHJpYnV0ZWQgU2VjdGlvbnMgc2hhbGwgYmUgaW5zZXJ0ZWQgaW50byBhbiAgZXhpc3RpbmcgbGlzdCBvZiBTZWN0aW9ucyBtYWludGFpbmVkIGZvciBhIENvbnRlbnQgRGVzY3JpcHRpb24uPC9ib2R5Pg0KLSAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il90V05JY2lYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJfc2VjdGlvbiIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdENGU2NDWDVFZDJLbkoyeWpOWGhXUSIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iX3RXTkljQ1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfdFdOSWN5WDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IioiLz4NCi0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3RXTklkQ1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICA8L293bmVkRW5kPg0KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il90V05JZFNYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJGdWxmaWxsYWJsZUVsZW1lbnQiPg0KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il90V05JZGlYNUVkMktuSjJ5ak5YaFdRIiBnZW5lcmFsPSJfdENGU2lDWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il90V05JZHlYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJmdWxmaWxscyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdFdOSWRTWDVFZDJLbkoyeWpOWGhXUSIgYXNzb2NpYXRpb249Il90V05JZWlYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3RXTkllQ1g1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIqIi8+DQotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il90V05JZVNYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfdFdOSWVpWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iRnVsZmlsbG1lbnQiIG1lbWJlckVuZD0iX3RXTklkeVg1RWQyS25KMnlqTlhoV1EgX3RXTklleVg1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il90V05JZXlYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSIiIHZpc2liaWxpdHk9InByaXZhdGUiIHR5cGU9Il90V05JZFNYNUVkMktuSjJ5ak5YaFdRIiBhc3NvY2lhdGlvbj0iX3RXTkllaVg1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfdFdOSWZDWDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IioiLz4NCi0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3RXTklmU1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICA8L293bmVkRW5kPg0KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il90REliY0NYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJXb3JrUHJvZHVjdCI+DQotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il90REliY1NYNUVkMktuSjJ5ak5YaFdRIiBhbm5vdGF0ZWRFbGVtZW50PSJfdERJYmNDWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8Ym9keT5Xb3JrIFByb2R1Y3QgaXMgYW4gYWJzdHJhY3QgY2xhc3Mgd2hpY2ggcHJvdmlkZXMgYSBnZW5lcmFsaXphdGlvbiBmb3IgdGhlIGNvbnRlbnQgZWxlbWVudCB0eXBlcyBBcnRpZmFjdCwgT3V0Y29tZSwgYW5kIERlbGl2ZXJhYmxlLiAgVGhlIG1ldGEtbW9kZWwgY2xhc3MgV29yayBQcm9kdWN0IGFjdHVhbGx5IHJlcHJlc2VudHMgd29yayBwcm9kdWN0IHR5cGVzLCBpLmUuIGFuIGluc3RhbmNlIG9mIFdvcmsgUHJvZHVjdCBpcyBhIGRlc2NyaXB0aW9uIG9mIGEgc3BlY2lmaWMgdHlwZSBvZiB3b3JrIHByb2R1Y3QgYW5kIG5vdCBhbiBpbmRpdmlkdWFsIHdvcmsgcHJvZHVjdCBpbnN0YW5jZS4gIEhvd2V2ZXIsIGZvciBzaW1wbGljaXR5IHJlYXNvbnMgYW5kIGJlY2F1c2Ugb2YgbG93IHJpc2sgb2YgbWlzaW50ZXJwcmV0YXRpb24gd2UgZGlkIG5vdCBhcHBlbmQgdGhlIHdvcmQgJ3R5cGUnIHRvIGV2ZXJ5IG1ldGEtY2xhc3MuDQotQSB3b3JrIHByb2R1Y3QgaXMgYW4gYWJzdHJhY3Rpb24gZm9yIGRlc2NyaXB0aW9ucyBvZiBjb250ZW50IGVsZW1lbnRzIHRoYXQgYXJlIHVzZWQgdG8gZGVmaW5lIGFueXRoaW5nIHVzZWQsIHByb2R1Y2VkLCBvciBtb2RpZmllZCBieSBhIHRhc2suDQotPC9ib2R5Pg0KLSAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfdEVLOVNDWDVFZDJLbkoyeWpOWGhXUSIgYW5ub3RhdGVkRWxlbWVudD0iX3RESWJjQ1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPGJvZHk+VGhpcyBpcyB0aGUgR3VpZGFuY2UgVHlwZXMgcGFja2FnZSdzIGV4dGVuc2lvbiBvZiBXb3JrIFByb2R1Y3QgKGRlZmluZWQgaW4gQ29udGVudCBFbGVtZW50cykgcHJvdmlkaW5nIGFkZGl0b25hbCBhc3NvY2lhdGlvbnMuPC9ib2R5Pg0KLSAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il90REliY2lYNUVkMktuSjJ5ak5YaFdRIiBnZW5lcmFsPSJfdEI4SW5DWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il90V05JZmlYNUVkMktuSjJ5ak5YaFdRIiBnZW5lcmFsPSJfdFdOSWRTWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il90RUs5U1NYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJyZXBvcnRzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il90RUs5TFNYNUVkMktuSjJ5ak5YaFdRIiBhc3NvY2lhdGlvbj0iX3RFVXVSaVg1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfdEVLOVNpWDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IioiLz4NCi0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3RFSzlTeVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il90RUs5VENYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJ0ZW1wbGF0ZXMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3RFSzlNQ1g1RWQyS25KMnlqTlhoV1EiIGFzc29jaWF0aW9uPSJfdEVVdVVDWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il90RUs5VFNYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfdEVLOVRpWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3RFSzlUeVg1RWQyS25KMnlqTlhoV1EiIG5hbWU9InRvb2xNZW50b3JzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il90RUs5TmlYNUVkMktuSjJ5ak5YaFdRIiBhc3NvY2lhdGlvbj0iX3RFVXVaeVg1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfdEVLOVVDWDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IioiLz4NCi0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3RFSzlVU1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il90RUs5VWlYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJlc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3RFVXVMeVg1RWQyS25KMnlqTlhoV1EiIGFzc29jaWF0aW9uPSJfdEVVdWJ5WDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il90RUs5VXlYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfdEVLOVZDWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3RESWJVU1g1RWQyS25KMnlqTlhoV1EiIG5hbWU9IlJvbGUiPg0KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfdERJYlVpWDVFZDJLbkoyeWpOWGhXUSIgYW5ub3RhdGVkRWxlbWVudD0iX3RESWJVU1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPGJvZHk+QSBSb2xlIGlzIGEgY29udGVudCBlbGVtZW50IHRoYXQgZGVmaW5lcyBhIHNldCBvZiByZWxhdGVkIHNraWxscywgY29tcGV0ZW5jaWVzLCBhbmQgcmVzcG9uc2liaWxpdGllcy4gIFJvbGVzIGFyZSB1c2VkIGJ5IFRhc2tzIHRvIGRlZmluZSB3aG8gcGVyZm9ybXMgdGhlbSBhcyB3ZWxsIGFzIGRlZmluZSBhIHNldCBvZiB3b3JrIHByb2R1Y3RzIHRoZXkgYXJlIHJlc3BvbnNpYmxlIGZvci4gIA0KLUEgUm9sZSBkZWZpbmVzIGEgc2V0IG9mIHJlbGF0ZWQgc2tpbGxzLCBjb21wZXRlbmNpZXMsIGFuZCByZXNwb25zaWJpbGl0aWVzIG9mIGFuIGluZGl2aWR1YWwgb3IgYSBzZXQgb2YgaW5kaXZpZHVhbHMuICBSb2xlcyBhcmUgbm90IGluZGl2aWR1YWxzIG9yIHJlc291cmNlcy4gIEluZGl2aWR1YWwgbWVtYmVycyBvZiB0aGUgZGV2ZWxvcG1lbnQgb3JnYW5pemF0aW9uIHdpbGwgd2VhciBkaWZmZXJlbnQgaGF0cywgb3IgcGVyZm9ybSBkaWZmZXJlbnQgcm9sZXMuIFRoZSBtYXBwaW5nIGZyb20gaW5kaXZpZHVhbCB0byByb2xlLCBwZXJmb3JtZWQgYnkgdGhlIHByb2plY3QgbWFuYWdlciB3aGVuIHBsYW5uaW5nIGFuZCBzdGFmZmluZyBmb3IgYSBwcm9qZWN0LCBhbGxvd3MgZGlmZmVyZW50IGluZGl2aWR1YWxzIHRvIGFjdCBhcyBzZXZlcmFsIGRpZmZlcmVudCByb2xlcywgYW5kIGZvciBhIHJvbGUgdG8gYmUgcGxheWVkIGJ5IHNldmVyYWwgaW5kaXZpZHVhbHMuDQotPC9ib2R5Pg0KLSAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il90REliVXlYNUVkMktuSjJ5ak5YaFdRIiBnZW5lcmFsPSJfdEI4SW5DWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il90V05JZnlYNUVkMktuSjJ5ak5YaFdRIiBnZW5lcmFsPSJfdFdOSWRTWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il90REliVkNYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJtb2RpZmllcyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdERJYmNDWDVFZDJLbkoyeWpOWGhXUSIgaXNEZXJpdmVkPSJ0cnVlIiBhc3NvY2lhdGlvbj0iX3RESWJwQ1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfdERJYlZTWDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IioiLz4NCi0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3RESWJWaVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il90REliVnlYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJyZXNwb25zaWJsZUZvciIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdERJYmNDWDVFZDJLbkoyeWpOWGhXUSIgYXNzb2NpYXRpb249Il90RElicVNYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3RESWJXQ1g1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIqIi8+DQotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il90REliV1NYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfdFl1MzRDWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iUG9pbnQiPg0KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il90WXUzNFNYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJ4IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il90Qm9taFNYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3RZdTM0aVg1RWQyS25KMnlqTlhoV1EiIG5hbWU9InkiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3RCb21oU1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfdFl1MzR5WDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iR3JhcGhFbGVtZW50IiBpc0Fic3RyYWN0PSJ0cnVlIj4NCi0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfdFl1MzVDWDVFZDJLbkoyeWpOWGhXUSIgZ2VuZXJhbD0iX3RZNG80Q1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfdFl1MzVTWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0icG9zaXRpb24iIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3RZdTM0Q1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfdFl1MzVpWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iY29udGFpbmVkIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il90WTRvNENYNUVkMktuSjJ5ak5YaFdRIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBhc3NvY2lhdGlvbj0iX3RaQnkwQ1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfdFl1MzV5WDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IioiLz4NCi0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3RZdTM2Q1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il90WXUzNlNYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJsaW5rIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il90WTRwRGlYNUVkMktuSjJ5ak5YaFdRIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBhc3NvY2lhdGlvbj0iX3RaQnkxaVg1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfdFl1MzZpWDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IioiLz4NCi0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3RZdTM2eVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il90WXUzN0NYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJhbmNob3JhZ2UiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3RZNG9faVg1RWQyS25KMnlqTlhoV1EiIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiIGFzc29jaWF0aW9uPSJfdFpCeTF5WDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il90WXUzN1NYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfdFl1MzdpWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3RZdTM3eVg1RWQyS25KMnlqTlhoV1EiIG5hbWU9InNlbWFudGljTW9kZWwiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3RZNHBKeVg1RWQyS25KMnlqTlhoV1EiIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiIGFzc29jaWF0aW9uPSJfdFpCeTNpWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il90WXUzOENYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iMSIvPg0KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfdFl1MzhTWDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IjEiLz4NCi0gICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il90WXUzOGlYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJEaW1lbnNpb24iPg0KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il90WXUzOHlYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJ3aWR0aCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdEJvbWhTWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il90WXUzOUNYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJoZWlnaHQiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3RCb21oU1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfdFk0bzRDWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iRGlhZ3JhbUVsZW1lbnQiIGlzQWJzdHJhY3Q9InRydWUiPg0KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il90WTRvNFNYNUVkMktuSjJ5ak5YaFdRIiBnZW5lcmFsPSJfdEI4SWdTWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il90WTRvNGlYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJpc1Zpc2libGUiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3RCb21neVg1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iX3RZNG80eVg1RWQyS25KMnlqTlhoV1EiIHR5cGU9Il90Qm9tZ3lYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgICAgPGJvZHk+dHJ1ZTwvYm9keT4NCi0gICAgICAgIDwvZGVmYXVsdFZhbHVlPg0KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3RZNG81Q1g1RWQyS25KMnlqTlhoV1EiIG5hbWU9ImNvbnRhaW5lciIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdFl1MzR5WDVFZDJLbkoyeWpOWGhXUSIgYXNzb2NpYXRpb249Il90WkJ5MENYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3RZNG81U1g1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIxIi8+DQotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il90WTRvNWlYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfdFk0bzV5WDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0icmVmZXJlbmNlIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il90WTRvN1NYNUVkMktuSjJ5ak5YaFdRIiBhc3NvY2lhdGlvbj0iX3RaQnkwU1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfdFk0bzZDWDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IioiLz4NCi0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3RZNG82U1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il90WTRvNmlYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJwcm9wZXJ0eSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdFk0bzlDWDVFZDJLbkoyeWpOWGhXUSIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgYXNzb2NpYXRpb249Il90WkJ5MGlYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3RZNG82eVg1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIqIi8+DQotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il90WTRvN0NYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfdFk0bzdTWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iUmVmZXJlbmNlIj4NCi0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfdFk0bzdpWDVFZDJLbkoyeWpOWGhXUSIgZ2VuZXJhbD0iX3RZNG80Q1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfdFk0bzd5WDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iaXNJbmRpdmlkdWFsUmVwcmVzZW50YXRpb24iIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3RCb21neVg1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxCb29sZWFuIiB4bWk6aWQ9Il90WTRvOENYNUVkMktuSjJ5ak5YaFdRIiB0eXBlPSJfdEJvbWd5WDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3RZNG84U1g1RWQyS25KMnlqTlhoV1EiIG5hbWU9InJlZmVyZW5jZWQiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3RZNG80Q1g1RWQyS25KMnlqTlhoV1EiIGFzc29jaWF0aW9uPSJfdFpCeTBTWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il90WTRvOGlYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iMSIvPg0KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfdFk0bzh5WDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IjEiLz4NCi0gICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il90WTRvOUNYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJQcm9wZXJ0eSI+DQotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3RZNG85U1g1RWQyS25KMnlqTlhoV1EiIGdlbmVyYWw9Il90WTRvNENYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3RZNG85aVg1RWQyS25KMnlqTlhoV1EiIG5hbWU9ImtleSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdEJmY3RDWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il90WTRvOXlYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iMSIvPg0KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfdFk0by1DWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iX3RZNG8tU1g1RWQyS25KMnlqTlhoV1EiIHR5cGU9Il90QmZjdENYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iIi8+DQotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfdFk0by1pWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0idmFsdWUiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3RCZmN0Q1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfdFk0by15WDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IjEiLz4NCi0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3RZNG9fQ1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il90WTRvX1NYNUVkMktuSjJ5ak5YaFdRIiB0eXBlPSJfdEJmY3RDWDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IiIvPg0KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3RZNG9faVg1RWQyS25KMnlqTlhoV1EiIG5hbWU9IkdyYXBoQ29ubmVjdG9yIj4NCi0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfdFk0b195WDVFZDJLbkoyeWpOWGhXUSIgZ2VuZXJhbD0iX3RZdTM0eVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfdFk0cEFDWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iZ3JhcGhFbGVtZW50IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il90WXUzNHlYNUVkMktuSjJ5ak5YaFdRIiBhc3NvY2lhdGlvbj0iX3RaQnkxeVg1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfdFk0cEFTWDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IjEiLz4NCi0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3RZNHBBaVg1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIxIi8+DQotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfdFk0cEF5WDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iZ3JhcGhFZGdlIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il90WTRwQmlYNUVkMktuSjJ5ak5YaFdRIiBhc3NvY2lhdGlvbj0iX3RaQnkyQ1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfdFk0cEJDWDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IioiLz4NCi0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3RZNHBCU1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il90WTRwQmlYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJHcmFwaEVkZ2UiPg0KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il90WTRwQnlYNUVkMktuSjJ5ak5YaFdRIiBnZW5lcmFsPSJfdFl1MzR5WDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il90WTRwQ0NYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJhbmNob3IiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3RZNG9faVg1RWQyS25KMnlqTlhoV1EiIGFzc29jaWF0aW9uPSJfdFpCeTJDWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il90WTRwQ1NYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iMiIvPg0KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfdFk0cENpWDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IjIiLz4NCi0gICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il90WTRwQ3lYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJ3YXlwb2ludHMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3RZdTM0Q1g1RWQyS25KMnlqTlhoV1EiIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiIGFzc29jaWF0aW9uPSJfdFpCeTJTWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il90WTRwRENYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfdFk0cERTWDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IjIiLz4NCi0gICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il90WTRwRGlYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJEaWFncmFtTGluayI+DQotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3RZNHBEeVg1RWQyS25KMnlqTlhoV1EiIGdlbmVyYWw9Il90WTRvNENYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3RZNHBFQ1g1RWQyS25KMnlqTlhoV1EiIG5hbWU9Inpvb20iIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3RCb21oU1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfdFk0cEVTWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0idmlld3BvcnQiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3RZdTM0Q1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfdFk0cEVpWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iZ3JhcGhFbGVtZW50IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il90WXUzNHlYNUVkMktuSjJ5ak5YaFdRIiBhc3NvY2lhdGlvbj0iX3RaQnkxaVg1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfdFk0cEV5WDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IjEiLz4NCi0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3RZNHBGQ1g1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIxIi8+DQotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfdFk0cEZTWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iZGlhZ3JhbSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdFk0cEd5WDVFZDJLbkoyeWpOWGhXUSIgYXNzb2NpYXRpb249Il90WkJ5M1NYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3RZNHBGaVg1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIxIi8+DQotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il90WTRwRnlYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iMSIvPg0KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3RZNHBHQ1g1RWQyS25KMnlqTlhoV1EiIG5hbWU9IkdyYXBoTm9kZSI+DQotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3RZNHBHU1g1RWQyS25KMnlqTlhoV1EiIGdlbmVyYWw9Il90WXUzNHlYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3RZNHBHaVg1RWQyS25KMnlqTlhoV1EiIG5hbWU9InNpemUiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3RZdTM4aVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfdFk0cEd5WDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iRGlhZ3JhbSI+DQotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3RZNHBIQ1g1RWQyS25KMnlqTlhoV1EiIGdlbmVyYWw9Il90WTRwR0NYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3RZNHBIU1g1RWQyS25KMnlqTlhoV1EiIG5hbWU9Inpvb20iIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3RCb21oU1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfdFk0cEhpWDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IjEiLz4NCi0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3RZNHBIeVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il90WTRwSUNYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJ2aWV3cG9pbnQiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3RZdTM0Q1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfdFk0cElTWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iZGlhZ3JhbUxpbmsiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3RZNHBEaVg1RWQyS25KMnlqTlhoV1EiIGFzc29jaWF0aW9uPSJfdFpCeTNTWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il90WTRwSWlYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfdFk0cEl5WDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3RZNHBKQ1g1RWQyS25KMnlqTlhoV1EiIG5hbWU9Im5hbWVzcGFjZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdFk0cEp5WDVFZDJLbkoyeWpOWGhXUSIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgYXNzb2NpYXRpb249Il90WkJ5M3lYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3RZNHBKU1g1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIxIi8+DQotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il90WTRwSmlYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iMSIvPg0KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3RZNHBKeVg1RWQyS25KMnlqTlhoV1EiIG5hbWU9IlNlbWFudGljTW9kZWxCcmlkZ2UiIGlzQWJzdHJhY3Q9InRydWUiPg0KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il90WTRwS0NYNUVkMktuSjJ5ak5YaFdRIiBnZW5lcmFsPSJfdFk0bzRDWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il90WTRwS1NYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJwcmVzZW50YXRpb24iIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3RCZmN0Q1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfdFk0cEtpWDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IjEiLz4NCi0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3RZNHBLeVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il90WTRwTENYNUVkMktuSjJ5ak5YaFdRIiB0eXBlPSJfdEJmY3RDWDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IiIvPg0KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3RZNHBMU1g1RWQyS25KMnlqTlhoV1EiIG5hbWU9ImdyYXBoRWxlbWVudCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdFl1MzR5WDVFZDJLbkoyeWpOWGhXUSIgYXNzb2NpYXRpb249Il90WkJ5M2lYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3RZNHBMaVg1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIxIi8+DQotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il90WTRwTHlYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfdFk0cE1DWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iZGlhZ3JhbSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdFk0cEd5WDVFZDJLbkoyeWpOWGhXUSIgYXNzb2NpYXRpb249Il90WkJ5M3lYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3RZNHBNU1g1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIxIi8+DQotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il90WTRwTWlYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfdFk0cE15WDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnQiPg0KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il90WTRwTkNYNUVkMktuSjJ5ak5YaFdRIiBnZW5lcmFsPSJfdFk0cEp5WDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il90WTRwTlNYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJ0eXBlSW5mbyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdEJmY3RDWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il90WTRwTmlYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iMSIvPg0KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfdFk0cE55WDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iX3RZNHBPQ1g1RWQyS25KMnlqTlhoV1EiIHR5cGU9Il90QmZjdENYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iIi8+DQotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfdFk0cE9TWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iVU1BU2VtYW50aWNNb2RlbEJyaWRnZSI+DQotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3RZNHBPaVg1RWQyS25KMnlqTlhoV1EiIGdlbmVyYWw9Il90WTRwSnlYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3RZNHBPeVg1RWQyS25KMnlqTlhoV1EiIG5hbWU9ImVsZW1lbnQiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3RCOElnU1g1RWQyS25KMnlqTlhoV1EiIGFzc29jaWF0aW9uPSJfdFpCeTVDWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il90WTRwUENYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iMSIvPg0KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfdFk0cFBTWDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IjEiLz4NCi0gICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il90WTRwUGlYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJDb3JlU2VtYW50aWNNb2RlbEJyaWRnZSI+DQotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3RZNHBQeVg1RWQyS25KMnlqTlhoV1EiIGdlbmVyYWw9Il90WTRwSnlYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3RZNHBRQ1g1RWQyS25KMnlqTlhoV1EiIG5hbWU9ImVsZW1lbnQiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3RCZmNrQ1g1RWQyS25KMnlqTlhoV1EiIGFzc29jaWF0aW9uPSJfdFpCeTRDWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il90WTRwUVNYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iMSIvPg0KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfdFk0cFFpWDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IjEiLz4NCi0gICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il90WTRwUXlYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJMZWFmRWxlbWVudCIgaXNBYnN0cmFjdD0idHJ1ZSI+DQotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3RZNHBSQ1g1RWQyS25KMnlqTlhoV1EiIGdlbmVyYWw9Il90WTRvNENYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3RZNHBSU1g1RWQyS25KMnlqTlhoV1EiIG5hbWU9IlRleHRFbGVtZW50Ij4NCi0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfdFk0cFJpWDVFZDJLbkoyeWpOWGhXUSIgZ2VuZXJhbD0iX3RZNHBReVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfdFk0cFJ5WDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0idGV4dCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdEJmY3RDWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il90WTRwU0NYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iMSIvPg0KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfdFk0cFNTWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iX3RZNHBTaVg1RWQyS25KMnlqTlhoV1EiIHR5cGU9Il90QmZjdENYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iIi8+DQotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfdFk0cFN5WDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iSW1hZ2UiPg0KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il90WTRwVENYNUVkMktuSjJ5ak5YaFdRIiBnZW5lcmFsPSJfdFk0cFF5WDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il90WTRwVFNYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJ1cmkiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3RCZmNzaVg1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfdFk0cFRpWDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IjEiLz4NCi0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3RZNHBUeVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il90WTRwVUNYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJtaW1lVHlwZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdEJmY3RDWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il90WTRwVVNYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iMSIvPg0KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfdFk0cFVpWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iX3RZNHBVeVg1RWQyS25KMnlqTlhoV1EiIHR5cGU9Il90QmZjdENYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iIi8+DQotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfdFk0cFZDWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iR3JhcGhpY1ByaW1pdGl2ZSIgaXNBYnN0cmFjdD0idHJ1ZSI+DQotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3RZNHBWU1g1RWQyS25KMnlqTlhoV1EiIGdlbmVyYWw9Il90WTRwUXlYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3RZNHBWaVg1RWQyS25KMnlqTlhoV1EiIG5hbWU9IlBvbHlsaW5lIj4NCi0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfdFk0cFZ5WDVFZDJLbkoyeWpOWGhXUSIgZ2VuZXJhbD0iX3RZNHBWQ1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfdFk0cFdDWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iY2xvc2VkIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il90Qm9tZ3lYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9Il90WTRwV1NYNUVkMktuSjJ5ak5YaFdRIiB0eXBlPSJfdEJvbWd5WDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICAgIDxib2R5PnRydWU8L2JvZHk+DQotICAgICAgICA8L2RlZmF1bHRWYWx1ZT4NCi0gICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il90WTRwV2lYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJ3YXlwb2ludHMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3RZdTM0Q1g1RWQyS25KMnlqTlhoV1EiIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiIGFzc29jaWF0aW9uPSJfdFpCeTZDWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il90WTRwV3lYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfdFk0cFhDWDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IjIiLz4NCi0gICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il90WTRwWFNYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJFbGxpcHNlIj4NCi0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfdFk0cFhpWDVFZDJLbkoyeWpOWGhXUSIgZ2VuZXJhbD0iX3RZNHBWQ1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfdFk0cFh5WDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iY2VudGVyIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il90WXUzNENYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3RZNHBZQ1g1RWQyS25KMnlqTlhoV1EiIG5hbWU9InJhZGl1c1giIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3RCb21oU1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfdFk0cFlTWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0icmFkaXVzWSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdEJvbWhTWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il90WTRwWWlYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJyb3RhdGlvbiIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdEJvbWhTWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il90WTRwWXlYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJzdGFydEFuZ2xlIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il90Qm9taFNYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3RZNHBaQ1g1RWQyS25KMnlqTlhoV1EiIG5hbWU9ImVuZEFuZ2xlIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il90Qm9taFNYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3RaQnkwQ1g1RWQyS25KMnlqTlhoV1EiIG1lbWJlckVuZD0iX3RZdTM1aVg1RWQyS25KMnlqTlhoV1EgX3RZNG81Q1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il90WkJ5MFNYNUVkMktuSjJ5ak5YaFdRIiBtZW1iZXJFbmQ9Il90WTRvOFNYNUVkMktuSjJ5ak5YaFdRIF90WTRvNXlYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfdFpCeTBpWDVFZDJLbkoyeWpOWGhXUSIgbWVtYmVyRW5kPSJfdFk0bzZpWDVFZDJLbkoyeWpOWGhXUSBfdFpCeTB5WDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgPG93bmVkRW5kIHhtaTppZD0iX3RaQnkweVg1RWQyS25KMnlqTlhoV1EiIG5hbWU9Il9kaWFncmFtRWxlbWVudCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdFk0bzRDWDVFZDJLbkoyeWpOWGhXUSIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iX3RaQnkwaVg1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfdFpCeTFDWDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IjEiLz4NCi0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3RaQnkxU1g1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIxIi8+DQotICAgICAgPC9vd25lZEVuZD4NCi0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfdFpCeTFpWDVFZDJLbkoyeWpOWGhXUSIgbWVtYmVyRW5kPSJfdFl1MzZTWDVFZDJLbkoyeWpOWGhXUSBfdFk0cEVpWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3RaQnkxeVg1RWQyS25KMnlqTlhoV1EiIG1lbWJlckVuZD0iX3RZdTM3Q1g1RWQyS25KMnlqTlhoV1EgX3RZNHBBQ1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il90WkJ5MkNYNUVkMktuSjJ5ak5YaFdRIiBtZW1iZXJFbmQ9Il90WTRwQXlYNUVkMktuSjJ5ak5YaFdRIF90WTRwQ0NYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfdFpCeTJTWDVFZDJLbkoyeWpOWGhXUSIgbWVtYmVyRW5kPSJfdFk0cEN5WDVFZDJLbkoyeWpOWGhXUSBfdFpCeTJpWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgPG93bmVkRW5kIHhtaTppZD0iX3RaQnkyaVg1RWQyS25KMnlqTlhoV1EiIG5hbWU9Il9ncmFwaEVkZ2UiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3RZNHBCaVg1RWQyS25KMnlqTlhoV1EiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il90WkJ5MlNYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3RaQnkyeVg1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIxIi8+DQotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il90WkJ5M0NYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iMSIvPg0KLSAgICAgIDwvb3duZWRFbmQ+DQotICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3RaQnkzU1g1RWQyS25KMnlqTlhoV1EiIG1lbWJlckVuZD0iX3RZNHBJU1g1RWQyS25KMnlqTlhoV1EgX3RZNHBGU1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il90WkJ5M2lYNUVkMktuSjJ5ak5YaFdRIiBtZW1iZXJFbmQ9Il90WXUzN3lYNUVkMktuSjJ5ak5YaFdRIF90WTRwTFNYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfdFpCeTN5WDVFZDJLbkoyeWpOWGhXUSIgbWVtYmVyRW5kPSJfdFk0cEpDWDVFZDJLbkoyeWpOWGhXUSBfdFk0cE1DWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3RaQnk0Q1g1RWQyS25KMnlqTlhoV1EiIG1lbWJlckVuZD0iX3RZNHBRQ1g1RWQyS25KMnlqTlhoV1EgX3RaQnk0U1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il90WkJ5NFNYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJfY29yZVNlbWFudGljTW9kZWxCcmlkZ2UiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3RZNHBQaVg1RWQyS25KMnlqTlhoV1EiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il90WkJ5NENYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3RaQnk0aVg1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIqIi8+DQotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il90WkJ5NHlYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgPC9vd25lZEVuZD4NCi0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfdFpCeTVDWDVFZDJLbkoyeWpOWGhXUSIgbWVtYmVyRW5kPSJfdFk0cE95WDVFZDJLbkoyeWpOWGhXUSBfdFpCeTVTWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgPG93bmVkRW5kIHhtaTppZD0iX3RaQnk1U1g1RWQyS25KMnlqTlhoV1EiIG5hbWU9Il91TUFTZW1hbnRpY01vZGVsQnJpZGdlIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il90WTRwT1NYNUVkMktuSjJ5ak5YaFdRIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfdFpCeTVDWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il90WkJ5NWlYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfdFpCeTV5WDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgIDwvb3duZWRFbmQ+DQotICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3RaQnk2Q1g1RWQyS25KMnlqTlhoV1EiIG1lbWJlckVuZD0iX3RZNHBXaVg1RWQyS25KMnlqTlhoV1EgX3RaQnk2U1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il90WkJ5NlNYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJfcG9seWxpbmUiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3RZNHBWaVg1RWQyS25KMnlqTlhoV1EiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il90WkJ5NkNYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3RaQnk2aVg1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIxIi8+DQotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il90WkJ5NnlYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iMSIvPg0KLSAgICAgIDwvb3duZWRFbmQ+DQotICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3RUWDIyaVg1RWQyS25KMnlqTlhoV1EiIG5hbWU9IlByb2Nlc3NQYWNrYWdlIj4NCi0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3RUWDIyeVg1RWQyS25KMnlqTlhoV1EiIGFubm90YXRlZEVsZW1lbnQ9Il90VFgyMmlYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDxib2R5PlByb2Nlc3MgUGFja2FnZSBpcyBhIHNwZWNpYWwgTWV0aG9kIFBhY2thZ2UgdGhhdCBjb250YWlucyBQcm9jZXNzIEVsZW1lbnRzLCBvbmx5Lg0KLUEga2V5IHNlcGFyYXRpb24gb2YgY29uY2VybnMgaW4gVU1BIGlzIHRoZSBkaXN0aW5jdGlvbiBiZXR3ZWVuIE1ldGhvZCBDb250ZW50IGFuZCBQcm9jZXNzLiAgVGhpcyBzZXBhcmF0aW9uIGlzIGVuZm9yY2VkIGJ5IHNwZWNpYWwgcGFja2FnZSB0eXBlcywgd2hpY2ggZG8gbm90IGFsbG93IHRoZSBtaXhpbmcgb2YgbWV0aG9kIGNvbnRlbnQgd2l0aCBwcm9jZXNzZXMuDQotPC9ib2R5Pg0KLSAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il90VFgyM0NYNUVkMktuSjJ5ak5YaFdRIiBnZW5lcmFsPSJfdEhjNm9TWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il90VFgyM1NYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJwcm9jZXNzRWxlbWVudHMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3RLdVJKU1g1RWQyS25KMnlqTlhoV1EiIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiIGFzc29jaWF0aW9uPSJfdFRYMi1TWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il90VFgyM2lYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfdFRYMjN5WDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3RjQTFZQ1g1RWQyS25KMnlqTlhoV1EiIG5hbWU9ImRpYWdyYW1zIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il90WTRwR3lYNUVkMktuSjJ5ak5YaFdRIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBhc3NvY2lhdGlvbj0iX3RjQTFZeVg1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfdGNBMVlTWDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IioiLz4NCi0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3RjQTFZaVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il90Y0ExWXlYNUVkMktuSjJ5ak5YaFdRIiBtZW1iZXJFbmQ9Il90Y0ExWUNYNUVkMktuSjJ5ak5YaFdRIF90Y0ExWlNYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3RjQTFaQ1g1RWQyS25KMnlqTlhoV1EiIGFubm90YXRlZEVsZW1lbnQ9Il90Y0ExWXlYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDxib2R5PlRoaXMgYXNzb2NpYXRpb24gaXMgdGhlIG9ubHkgbWVtYmVyIG9mIHRoZSB1bWFkaWFncmFtcyBwYWNrYWdlLiAgSXQgZGVmaW5lcyB0aGF0IERpYWdyYW1zIGNhbiBiZSBwYWNrYWdlZCBpbiBQcm9jZXNzIFBhY2thZ2VzLjwvYm9keT4NCi0gICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfdGNBMVpTWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iX3Byb2Nlc3NQYWNrYWdlIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il90VFgyMmlYNUVkMktuSjJ5ak5YaFdRIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfdGNBMVl5WDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il90Y0ExWmlYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iMSIvPg0KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfdGNBMVp5WDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IjEiLz4NCi0gICAgICA8L293bmVkRW5kPg0KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il90V0RYVUNYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJNZXRob2RQbHVnaW4iPg0KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfdFdEWFVTWDVFZDJLbkoyeWpOWGhXUSIgYW5ub3RhdGVkRWxlbWVudD0iX3RXRFhVQ1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPGJvZHk+QSBNZXRob2QgUGx1Z2luIGlzIGEgTWV0aG9kIEVsZW1lbnQgdGhhdCByZXByZXNlbnRzIGEgcGh5c2ljYWwgY29udGFpbmVyIGZvciBNZXRob2QgUGFja2FnZXMuICBJdCBkZWZpbmVzIGEgZ3JhbnVsYXJpdHkgbGV2ZWwgZm9yIHRoZSBtb2R1bGFyaXphdGlvbiBhbmQgb3JnYW5pemF0aW9uIG9mIG1ldGhvZCBjb250ZW50IGFuZCBwcm9jZXNzZXMuICBBIE1ldGhvZCBQbHVnaW4gY2FuIGV4dGVuZCBtYW55IG90aGVyIE1ldGhvZCBQbHVnaW5zIGFuZCBpdCBjYW4gYmUgZXh0ZW5kZWQgYnkgbWFueSBNZXRob2QgUGx1Z2lucy4gIEl0IGNhbiBhbHNvIGJlIHVzZWQgc3RhbmQtYWxvbmUsIGkuZS4gd2l0aCBubyBFeHRlbnNpb24gcmVsYXRpb25zaGlwIHRvIG90aGVyIHBsdWctaW5zLg0KLU1ldGhvZCBQbHVnaW4gY29uY2VwdHVhbGx5IHJlcHJlc2VudHMgYSB1bml0IGZvciBjb25maWd1cmF0aW9uLCBtb2R1bGFyaXphdGlvbiwgZXh0ZW5zaW9uLCBwYWNrYWdpbmcsIGFuZCBkZXBsb3ltZW50IG9mIG1ldGhvZCBjb250ZW50IGFuZCBwcm9jZXNzZXMuICBBIFByb2Nlc3MgRW5naW5lZXIgc2hhbGwgZGVzaWduIGhpcyBQbHVnaW5zIGFuZCBhbGxvY2F0ZSBoaXMgY29udGVudCB0byB0aGVzZSBQbHVnaW5zIHdpdGggcmVxdWlyZW1lbnRzIGZvciBleHRlbnNpYmlsaXR5LCBtb2R1bGFyaXR5LCByZXVzZSwgYW5kIG1haW50YWluYWJpbGl0eSBpbiBtaW5kLg0KLVNwZWNpYWwgZXh0ZW5zaWJpbGl0eSBtZWNoYW5pc21zIGRlZmluZWQgZm9yIHRoZSBtZXRhLWNsYXNzZXMgVmFyaWFiaWxpdHkgRWxlbWVudCBhbmQgUHJvY2VzcyBDb250cmlidXRpb24gYWxsb3cgUGx1Z2luIGNvbnRlbnQgdG8gZGlyZWN0bHkgY29udHJpYnV0ZSBuZXcgY29udGVudCwgcmVwbGFjZSBleGlzdGluZyBjb250ZW50LCBvciB0byBjcm9zcy1yZWZlcmVuY2UgdG8gYW55IENvbnRlbnQgRWxlbWVudCBvciBQcm9jZXNzIHdpdGhpbiBhbm90aGVyIFBsdWdpbiB0aGF0IGl0IGV4dGVuZHMuICBTaW1pbGFyIHRvIFVNTCAyLjAncyAncGFja2FnZSBtZXJnZScgbWVjaGFuaXNtIHRyYW5zZm9ybWF0aW9uIGludGVycHJldGF0aW9ucywgaW50ZXJwcmV0aW5nIHRoZXNlIE1ldGhvZCBQbHVnaW4gbWVjaGFuaXNtcyByZXN1bHRzIGludG8gbmV3IGV4dGVuZGVkIE1ldGhvZCBDb250ZW50IGFuZCBQcm9jZXNzZXMuDQotPC9ib2R5Pg0KLSAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il90V0RYVXlYNUVkMktuSjJ5ak5YaFdRIiBnZW5lcmFsPSJfdEJmY29DWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il90ZTJHOENYNUVkMktuSjJ5ak5YaFdRIiBnZW5lcmFsPSJfdGUyRzhpWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il90V0RYVkNYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJ1c2VyQ2hhbmdlYWJsZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdEJvbWd5WDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3RXRFhWU1g1RWQyS25KMnlqTlhoV1EiIGFubm90YXRlZEVsZW1lbnQ9Il90V0RYVkNYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgICAgPGJvZHk+RGVmaW5lcyBpZiBhIG1ldGhvZCBwbHVnLWluIGlzIGxvY2tlZCBmb3IgY2hhbmdlcyBvciBub3QuPC9ib2R5Pg0KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJfdFdEWFZpWDVFZDJLbkoyeWpOWGhXUSIgdHlwZT0iX3RCb21neVg1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgICA8Ym9keT50cnVlPC9ib2R5Pg0KLSAgICAgICAgPC9kZWZhdWx0VmFsdWU+DQotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfdFdEWFZ5WDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iaXNTdXBwb3J0aW5nIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il90Qm9tZ3lYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfdFdEWFdDWDVFZDJLbkoyeWpOWGhXUSIgYW5ub3RhdGVkRWxlbWVudD0iX3RXRFhWeVg1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgICA8Ym9keT5BIHN1cHBvcnRpbmcgbWV0aG9kIHBsdWctaW4gaXMgYSBwbHVnLWluIHRoYXQgY29udGFpbnMgc3VwcG9ydGluZyBhbmQgb3B0aW9uYWwgbWV0aG9kIGVsZW1lbnRzLiBPbmx5IHRoZSBlbGVtZW50cyB0aGF0IGFyZSByZWZlcmVuY2VkIGZyb20gbm9uLXN1cHBvcnRpbmcgcGx1Zy1pbiBhcmUgdG8gYmUgY29uc2lkZXJlZCBmb3IgaW5jbHVzaW9uIGludG8gYSBtZXRob2QgY29uZmlndXJhdGlvbi4gSW4gb3RoZXIgd29yZHMsIGlmIGEgc3VwcG9ydGluZyBtZXRob2QgcGx1Zy1pbiBpcyBzZWxlY3RlZCBmb3IgYSBjb25maWd1cmF0aW9uIG9ubHkgaXRzIGVsZW1lbnRzIHJlZmVyZW5jZWQgZnJvbSBvdXRzaWRlIG9mIHRoaXMgcGx1Zy1pbiB3aWxsIGJlIGNvbnNpZGVyZWQgZm9yIHRoZSBjb25maWd1cmF0aW9uLiAgQWxsIG90aGVyIHVucmVmZXJlbmNlZCBlbGVtZW50cyB3aWxsIG5vdCBiZS4gPC9ib2R5Pg0KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJfdFdEWFdTWDVFZDJLbkoyeWpOWGhXUSIgdHlwZT0iX3RCb21neVg1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgICA8Ym9keT5mYWxzZTwvYm9keT4NCi0gICAgICAgIDwvZGVmYXVsdFZhbHVlPg0KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3RXRFhXaVg1RWQyS25KMnlqTlhoV1EiIG5hbWU9Im1ldGhvZFBhY2thZ2VzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il90SGM2b1NYNUVkMktuSjJ5ak5YaFdRIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBhc3NvY2lhdGlvbj0iX3RXTklZU1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfdFdEWFd5WDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IioiLz4NCi0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3RXRFhYQ1g1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIxIi8+DQotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfdFdEWFhTWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iYmFzZXMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3RXRFhVQ1g1RWQyS25KMnlqTlhoV1EiIGFzc29jaWF0aW9uPSJfdFdOSVppWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il90V0RYWGlYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfdFdEWFh5WDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3RUWDJ3Q1g1RWQyS25KMnlqTlhoV1EiIG5hbWU9IlByb2Nlc3NDb21wb25lbnQiPg0KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfdFRYMndTWDVFZDJLbkoyeWpOWGhXUSIgYW5ub3RhdGVkRWxlbWVudD0iX3RUWDJ3Q1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPGJvZHk+QSBQcm9jZXNzIENvbXBvbmVudCBpcyBhIHNwZWNpYWwgUHJvY2VzcyBQYWNrYWdlIHRoYXQgYXBwbGllcyB0aGUgcHJpbmNpcGxlcyBvZiBlbmNhcHN1bGF0aW9uLiAgQSBQcm9jZXNzIENvbXBvbmVudCByZWFsaXplcyBvbmUgb3IgbW9yZSBJbnRlcmZhY2VzIHdoaWNoIHNwZWNpZnkgaW5wdXRzIGFuZCBvdXRwdXRzIG9mIHRoZSBjb21wb25lbnQuIFRoZXJlIG1pZ2h0IGJlIG1hbnkgY29tcG9uZW50cyByZWFsaXppbmcgdGhlIHNhbWUgaW50ZXJmYWNlcywgYnV0IHVzaW5nIGRpZmZlcmVudCB0ZWNobmlxdWVzIHRvIGFjaGlldmUgc2ltaWxhciBvdXRwdXRzIGZvciBzaW1pbGFyIGlucHV0cy4gIFdoZXJlYXMgdGhlIENvbXBvbmVudCBJbnRlcmZhY2VzIHJlcHJlc2VudCBjb21wb25lbnQgc3BlY2lmaWNhdGlvbnMgKGJsYWNrIGJveCBkZXNjcmlwdGlvbnMgb2YgdGhlIGNvbXBvbmVudCksIGdvb2QgY2FuZGlkYXRlcyBmb3IgY29tcG9uZW50IHJlYWxpemF0aW9ucyBjYW4gYmUgZm91bmQgaW4gQ2FwYWJpbGl0eSBQYXR0ZXJucyAod2hpdGUgYm94IGRlc2NyaXB0aW9ucyBmb3IgdGhlIGNvbXBvbmVudCkuDQotVU1BIHN1cHBvcnRzIHJlcGxhY2VhYmxlIGFuZCByZXVzYWJsZSBQcm9jZXNzIENvbXBvbmVudHMgcmVhbGl6aW5nIHRoZSBwcmluY2lwbGVzIG9mIGVuY2Fwc3VsYXRpb24uIENlcnRhaW4gc2l0dWF0aW9ucyBpbiBhIHNvZnR3YXJlIGRldmVsb3BtZW50IHByb2plY3QgbWlnaHQgcmVxdWlyZSB0aGF0IGNvbmNyZXRlIHJlYWxpemF0aW9ucyBvZiBwYXJ0cyBvZiB0aGUgcHJvY2VzcyByZW1haW4gdW5kZWNpZGVkIG9yIHdpbGwgYmUgZGVjaWRlZCBieSB0aGUgZXhlY3V0aW5nIHRlYW0gaXRzZWxmIChlLmcuIGluIG91dHNvdXJjaW5nIHNpdHVhdGlvbnMpLiAgVU1BIHByb3ZpZGVzIGEgdW5pcXVlIGNvbXBvbmVudCBjb25jZXB0IGRlZmluaW5nIGludGVyZmFjZXMgZm9yIHdvcmsgcHJvZHVjdCBpbnB1dCBhbmQgb3V0cHV0LCBhbGxvd2luZyB0cmVhdGluZyB0aGUgYWN0dWFsIGRlZmluaXRpb24gb2YgdGhlIHdvcmsgdGhhdCBwcm9kdWNlcyB0aGUgb3V0cHV0cyBhcyBhICZxdW90O2JsYWNrIGJveCZxdW90Oy4gIEF0IGFueSBwb2ludCBkdXJpbmcgYSBwcm9qZWN0IHRoZSBjb21wb25lbnQgJnF1b3Q7cmVhbGl6YXRpb24mcXVvdDsgZGV0YWlsaW5nIHRoZSB3b3JrIGNhbiBiZSBhZGRlZCB0byB0aGUgcHJvY2Vzcy4gIFRoZSBjb21wb25lbnQgYXBwcm9hY2ggYWxzbyBhbGxvd3MgdGhhdCBkaWZmZXJlbnQgc3R5bGVzIG9yIHRlY2huaXF1ZXMgb2YgZG9pbmcgd29yayBjYW4gYmUgcmVwbGFjZWQgd2l0aCBvbmUgYW5vdGhlci4gIEZvciBleGFtcGxlLCBhIHNvZnR3YXJlIGNvZGUgb3V0cHV0IG9mIGEgY29tcG9uZW50IGNvdWxkIGJlIHByb2R1Y2VkIHdpdGggYSBtb2RlbC1kcml2ZW4gZGV2ZWxvcG1lbnQgb3IgYSBjb2RlLWNlbnRyaWMgdGVjaG5pcXVlLiAgVGhlIGNvbXBvbmVudCBjb25jZXB0IGVuY2Fwc3VsYXRlcyB0aGUgYWN0dWFsIHdvcmsgYW5kIGxldHMgdGhlIGRldmVsb3BtZW50IHRlYW0gY2hvb3NlIHRoZSBhcHByb3ByaWF0ZSB0ZWNobmlxdWUgYW5kIGZpbGwgdGhlIGNvbXBvbmVudCdzIHJlYWxpemF0aW9uIHdpdGggdGhlaXIgY2hvaWNlIG9mIEFjdGl2aXRpZXMgdGhhdCBwcm9kdWNlIHRoZSByZXF1aXJlZCBvdXRwdXRzLg0KLTwvYm9keT4NCi0gICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfdFRYMndpWDVFZDJLbkoyeWpOWGhXUSIgZ2VuZXJhbD0iX3RUWDIyaVg1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il90VFgyd3lYNUVkMktuSjJ5ak5YaFdRIiBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvdW1sMi8yLjAuMC9VTUwiPg0KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il90VFgyeENYNUVkMktuSjJ5ak5YaFdRIiBrZXk9ImV4dGVuZCIvPg0KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+DQotICAgICAgPC9nZW5lcmFsaXphdGlvbj4NCi0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfdGUyRzhTWDVFZDJLbkoyeWpOWGhXUSIgZ2VuZXJhbD0iX3RlMkc4aVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfdFRYMnhTWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iaW50ZXJmYWNlcyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdFRYMjBTWDVFZDJLbkoyeWpOWGhXUSIgYXNzb2NpYXRpb249Il90VFgyNENYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3RUWDJ4aVg1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIqIi8+DQotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il90VFgyeHlYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iMSIvPg0KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3RUWDJ5Q1g1RWQyS25KMnlqTlhoV1EiIG5hbWU9InByb2Nlc3MiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3RPSl9tU1g1RWQyS25KMnlqTlhoV1EiIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiIGFzc29jaWF0aW9uPSJfdFRYMjlDWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il90VFgyeVNYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iMSIvPg0KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfdFRYMnlpWDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IjEiLz4NCi0gICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il90ZTJHOGlYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJNZXRob2RVbml0IiBpc0Fic3RyYWN0PSJ0cnVlIj4NCi0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3RlMkc4eVg1RWQyS25KMnlqTlhoV1EiIGFubm90YXRlZEVsZW1lbnQ9Il90ZTJHOGlYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDxib2R5PkEgTWV0aG9kIFVuaXQgaXMgYSBzcGVjaWFsIE1ldGhvZCBFbGVtZW50IHRoYXQgc2hhbGwgYmUgbWFpbnRhaW5lZCBpbiBhIE1ldGhvZCBMaWJyYXJ5IGFzIGEgc2VwYXJhdGUgdW5pdCBvZiBjb250cm9sLjwvYm9keT4NCi0gICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfdGUyRzlDWDVFZDJLbkoyeWpOWGhXUSIgZ2VuZXJhbD0iX3RCOElnU1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfdGUyRzlTWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iYXV0aG9ycyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdEJmY3RDWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3RlMkc5aVg1RWQyS25KMnlqTlhoV1EiIGFubm90YXRlZEVsZW1lbnQ9Il90ZTJHOVNYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgICAgPGJvZHk+RXZlcnkgTWV0aG9kIFVuaXQgaXMgYmVpbmcgY3JlYXRlZCBhbmQgb3duZWQgYnkgYW4gYXV0aG9yIG9yIGF1dGhvcmluZyB0ZWFtLjwvYm9keT4NCi0gICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfdGUyRzl5WDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IjEiLz4NCi0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3RlMkctQ1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il90ZTJHLVNYNUVkMktuSjJ5ak5YaFdRIiB0eXBlPSJfdEJmY3RDWDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IiIvPg0KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3RlMkctaVg1RWQyS25KMnlqTlhoV1EiIG5hbWU9ImNoYW5nZURhdGUiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3RCZmNzQ1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il90ZTJHLXlYNUVkMktuSjJ5ak5YaFdRIiBhbm5vdGF0ZWRFbGVtZW50PSJfdGUyRy1pWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICAgIDxib2R5PlRoZSBkYXRlIHRoZSBsYXN0IGNoYW5nZSB0aGF0IHJlc3VsdGVkIGludG8gdGhpcyB2ZXJzaW9uIGhhcyBiZWVuIG1hZGUuPC9ib2R5Pg0KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il90ZTJHX0NYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iMSIvPg0KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfdGUyR19TWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3RlMkdfaVg1RWQyS25KMnlqTlhoV1EiIG5hbWU9ImNoYW5nZURlc2NyaXB0aW9uIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il90QmZjdENYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfdGUyR195WDVFZDJLbkoyeWpOWGhXUSIgYW5ub3RhdGVkRWxlbWVudD0iX3RlMkdfaVg1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgICA8Ym9keT5UaGUgZGVzY3JpcHRpb24gb2YgdGhlIGxhc3QgY2hhbmdlIHRoYXQgcmVzdWx0ZWQgaW50byB0aGlzIHZlcnNpb24uPC9ib2R5Pg0KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il90ZTJIQUNYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iMSIvPg0KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfdGUySEFTWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iX3RlMkhBaVg1RWQyS25KMnlqTlhoV1EiIHR5cGU9Il90QmZjdENYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iIi8+DQotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfdGUySEF5WDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0idmVyc2lvbiIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdEJmY3RDWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3RlMkhCQ1g1RWQyS25KMnlqTlhoV1EiIGFubm90YXRlZEVsZW1lbnQ9Il90ZTJIQXlYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgICAgPGJvZHk+RXZlcnkgUGFja2FnZSBoYXMgYSB2ZXJzaW9uIG51bWJlciB1c2VkIHRvIHRyYWNrIGNoYW5nZXMuPC9ib2R5Pg0KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il90ZTJIQlNYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iMSIvPg0KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfdGUySEJpWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iX3RlMkhCeVg1RWQyS25KMnlqTlhoV1EiIHR5cGU9Il90QmZjdENYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iIi8+DQotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfdGUySENDWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iY29weXJpZ2h0U3RhdGVtZW50IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il90RUs5TXlYNUVkMktuSjJ5ak5YaFdRIiBhc3NvY2lhdGlvbj0iX3RlMkhEQ1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfdGUySENTWDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IjEiLz4NCi0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3RlMkhDaVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il90QjhJbnlYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJDb250ZW50RGVzY3JpcHRpb24iPg0KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfdEI4SW9DWDVFZDJLbkoyeWpOWGhXUSIgYW5ub3RhdGVkRWxlbWVudD0iX3RCOElueVg1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPGJvZHk+Q29udGVudCBEZXNjcmlwdGlvbiBpcyBhIE1ldGhvZCBFbGVtZW50IHRoYXQgaXMgdXNlZCB0byBzdG9yZSB0aGUgdGV4dHVhbCBkZXNjcmlwdGlvbiBmb3IgYSBDb250ZW50IEVsZW1lbnQuICBJdCBkZWZpbmVzIHN0YW5kYXJkIGF0dHJpYnV0ZXMgYXBwbGljYWJsZSBmb3IgYWxsIENvbnRlbnQgRWxlbWVudCB0eXBlcy4gIFNwZWNpZmljIENvbnRlbnQgRWxlbWVudCBzdWItdHlwZXMgY2FuIGRlZmluZSB0aGVpciBvd24gbWF0Y2hpbmcgQ29udGVudCBEZXNjcmlwdGlvbiBzdWItdHlwZXMuIDwvYm9keT4NCi0gICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfdGUySEN5WDVFZDJLbkoyeWpOWGhXUSIgZ2VuZXJhbD0iX3RlMkc4aVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfdEI4SW9pWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0ibWFpbkRlc2NyaXB0aW9uIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il90QmZjdENYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfdEI4SW95WDVFZDJLbkoyeWpOWGhXUSIgYW5ub3RhdGVkRWxlbWVudD0iX3RCOElvaVg1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgICA8Ym9keT5UaGlzIGF0dHJpYnV0ZSBzdG9yZSB0aGUgbWFpbiBkZXNjcmlwdGl2ZSB0ZXh0IGZvciB0aGUgQ29udGVudCBFbGVtZW50LiAgQWxsIHRleHQgdGhhdCBpcyBub3QgcGFydCBvZiBhbnkgb2YgdGhlIG1vcmUgc3BlY2lmaWMgYXR0cmlidXRlcyBzaGFsbCBiZSBzdG9yZWQgaGVyZS4gIElmIHRoZSBDb250ZW50IERlc2NyaXB0aW9uIGlzIGRpdmlkZWQgaW50byBzZWN0aW9ucyB1c2luZyB0aGUgU2VjdGlvbiBjbGFzcywgdGhlbiBvbmx5IHRoZSB0ZXh0IGZyb20gdGhlICdzdGFydCcgb2YgdGhlIGNvbnRlbnQgZGVzY3JpcHRpb24gdG8gdGhlIGZpcnN0IHNlY3Rpb24gd2lsbCBiZSBzdG9yZWQgaGVyZSAoc2ltaWxhciB0byBhIG5vcm1hbCBkb2N1bWVudCB3aGVyZSB5b3UgY2FuIHBsYWNlIHRleHQgYmV0d2VlbiBpdHMgYmVnaW5uaW5nIHRvIGl0cyBmaXJzdCBkaWN0aW9uIGhlYWRpbmcpLjwvYm9keT4NCi0gICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfdEI4SXBDWDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IjEiLz4NCi0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3RCOElwU1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il90QjhJcGlYNUVkMktuSjJ5ak5YaFdRIiB0eXBlPSJfdEJmY3RDWDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IiIvPg0KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3RCOElweVg1RWQyS25KMnlqTlhoV1EiIG5hbWU9InNlY3Rpb25zIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il90Q0ZTY0NYNUVkMktuSjJ5ak5YaFdRIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBhc3NvY2lhdGlvbj0iX3RDRlNtQ1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfdEI4SXFDWDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IioiLz4NCi0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3RCOElxU1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il90Rk5mYmlYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJleHRlcm5hbElkIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il90QmZjdENYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfdEZOZmJ5WDVFZDJLbkoyeWpOWGhXUSIgYW5ub3RhdGVkRWxlbWVudD0iX3RGTmZiaVg1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgICA8Ym9keT5BbiBleHRlcm5hbCB2aXNpYmxlIG51bWJlciBvciBsYWJlbCB0aGF0IGlzIHVzZWQgdG8gcmVmZXJlbmNlIHRoaXMgZWxlbWVudC4gVXNlZCBsaWtlIGEgc3lub255bSB0byB0aGUgbmFtZS48L2JvZHk+DQotICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3RGTmZjQ1g1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIxIi8+DQotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il90Rk5mY1NYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfdEZOZmNpWDVFZDJLbkoyeWpOWGhXUSIgdHlwZT0iX3RCZmN0Q1g1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIiLz4NCi0gICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il90Rk5mY3lYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJrZXlDb25zaWRlcmF0aW9ucyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdEJmY3RDWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3RGTmZkQ1g1RWQyS25KMnlqTlhoV1EiIGFubm90YXRlZEVsZW1lbnQ9Il90Rk5mY3lYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgICAgPGJvZHk+S2V5IENvbnNpZGVyYXRpb25zIHByb3ZpZGVzIGFkdmlzZSBhbmQgZ3VpZGFuY2Ugb2YgYSBjcml0aWNhbCBuYXR1cmUgZm9yIHRoZSBjb250ZW50IGVsZW1lbnQgYXMgd2VsbCBhcyB3YXJuaW5ncywgY2F1dGlvbnMsIHBpdGZhbGxzLCBkYW5nZXJzLjwvYm9keT4NCi0gICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfdEZOZmRTWDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IjEiLz4NCi0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3RGTmZkaVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il90Rk5mZHlYNUVkMktuSjJ5ak5YaFdRIiB0eXBlPSJfdEJmY3RDWDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IiIvPg0KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3RGTmZlQ1g1RWQyS25KMnlqTlhoV1EiIG5hbWU9ImxvbmdQcmVzZW50YXRpb25OYW1lIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il90QmZjdENYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3RlMkhEQ1g1RWQyS25KMnlqTlhoV1EiIG1lbWJlckVuZD0iX3RlMkhDQ1g1RWQyS25KMnlqTlhoV1EgX3RlMkhEaVg1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfdGUySERTWDVFZDJLbkoyeWpOWGhXUSIgYW5ub3RhdGVkRWxlbWVudD0iX3RlMkhEQ1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPGJvZHk+QSBNZXRob2QgVW5pdCBjYW4gaGF2ZSBleGFjdGx5IG9uZSBDb3B5cmlnaHQgU3RhdGVtZW50IHNlY3VyaW5nIHRoZSBpbnRlbGxlY3R1YWwgY2FwaXRhbCBpdCByZXByZXNlbnRzLiAgSXQgd2lsbCBiZSBwdWJsaXNoZWQgd2l0aCB0aGUgcmVzcGVjdGl2ZSBjb25jcmV0ZSBFbGVtZW50LiAgTm90ZSwgdGhhdCBDb3B5cmlnaHQgU3RhdGVtZW50cyBmb3IgTWV0aG9kIExpYnJhcmllcyBhbmQgTWV0aG9kIFBsdWdpbnMgZGVmaW5lIHRoZSBkZWZhdWx0IHN0YXRlbWVudCBmb3IgaXRzIGNvbnRhaW5lZCBlbGVtZW50cywgd2hpY2ggY2FuIGJlICdvdmVyd3JpdHRlbicgd2l0aCByZXZpc2VkIHN0YXRlbWVudHMgZm9yIGV2ZXJ5IENvbnRlbnQgRGVzY3JpcHRpb24gb3IgUHJvY2VzcyBDb21wb25lbnQuPC9ib2R5Pg0KLSAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il90ZTJIRGlYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJfbWV0aG9kVW5pdCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdGUyRzhpWDVFZDJLbkoyeWpOWGhXUSIgYXNzb2NpYXRpb249Il90ZTJIRENYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3RlMkhEeVg1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIqIi8+DQotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il90ZTJIRUNYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgPC9vd25lZEVuZD4NCi0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfdGhobmdDWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iTWV0aG9kQ29uZmlndXJhdGlvbiI+DQotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il90aGhuZ1NYNUVkMktuSjJ5ak5YaFdRIiBhbm5vdGF0ZWRFbGVtZW50PSJfdGhobmdDWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8Ym9keT5BIE1ldGhvZCBDb25maWd1cmF0aW9uIGlzIGEgY29sbGVjdGlvbiBvZiBzZWxlY3RlZCBNZXRob2QgTW9kZWxzIGFuZCBNZXRob2RQYWNrYWdlcy4gQSBjb25maWd1cmF0aW9uIGNhbiBiZSBleHBvcnRlZCBpbnRvIGl0cyBvd24gc3RhbmRhbG9uZSBsaWJyYXJ5IHdoZW4gaXQgaW5jbHVkZXMgdGhlIGZ1bGwgdHJhbnNpdGl2ZSBjbG9zdXJlIG9mIGFsbCBlbGVtZW50cyBhbGwgb3RoZXIgZWxlbWVudHMgZGVwZW5kIG9uLjwvYm9keT4NCi0gICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfdGhobmdpWDVFZDJLbkoyeWpOWGhXUSIgZ2VuZXJhbD0iX3RlMkc4aVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfdGhobmd5WDVFZDJLbkoyeWpOWGhXUSIgZ2VuZXJhbD0iX3RCOEluQ1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfdGhobmhDWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0ibWV0aG9kUGx1Z2luU2VsZWN0aW9uIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il90V0RYVUNYNUVkMktuSjJ5ak5YaFdRIiBhc3NvY2lhdGlvbj0iX3RocllpaVg1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfdGhobmhTWDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IioiLz4NCi0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3RoaG5oaVg1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIxIi8+DQotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfdGhobmh5WDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0ibWV0aG9kUGFja2FnZVNlbGVjdGlvbiIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdEhjNm9TWDVFZDJLbkoyeWpOWGhXUSIgYXNzb2NpYXRpb249Il90aHJZanlYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3RoaG5pQ1g1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIqIi8+DQotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il90aGhuaVNYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iMSIvPg0KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3RoaG5paVg1RWQyS25KMnlqTlhoV1EiIG5hbWU9InByb2Nlc3NWaWV3cyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdEdaeDN5WDVFZDJLbkoyeWpOWGhXUSIgYXNzb2NpYXRpb249Il90aHJZcVNYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3RoaG5peVg1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIqIi8+DQotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il90aGhuakNYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfdGhobmpTWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iZGVmYXVsdFZpZXciIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3RHWngzeVg1RWQyS25KMnlqTlhoV1EiIGFzc29jaWF0aW9uPSJfdGhyWXJTWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il90aGhuamlYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iMSIvPg0KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfdGhobmp5WDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IjEiLz4NCi0gICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il90aGhua0NYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJiYXNlQ29uZmlndXJhdGlvbnMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3RoaG5nQ1g1RWQyS25KMnlqTlhoV1EiIGFzc29jaWF0aW9uPSJfdGhyWXNTWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il90aGhua1NYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfdGhobmtpWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3RoaG5reVg1RWQyS25KMnlqTlhoV1EiIG5hbWU9InN1YnRyYWN0ZWRDYXRlZ29yeSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdEdaeDN5WDVFZDJLbkoyeWpOWGhXUSIgYXNzb2NpYXRpb249Il90aHJZdGlYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3RoaG5sQ1g1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIqIi8+DQotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il90aGhubFNYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfdGhobmxpWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iYWRkZWRDYXRlZ29yeSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdEdaeDN5WDVFZDJLbkoyeWpOWGhXUSIgYXNzb2NpYXRpb249Il90aHJZdWlYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3RoaG5seVg1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIqIi8+DQotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il90aGhubUNYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfdGhobm1TWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iUHJvY2Vzc0ZhbWlseSI+DQotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il90aGhubWlYNUVkMktuSjJ5ak5YaFdRIiBhbm5vdGF0ZWRFbGVtZW50PSJfdGhobm1TWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8Ym9keT5BIERlbGl2ZXJ5IE1vZGVsIEZhbWlseSBpcyBhIGNvbnZlbmllbnQgZ3JvdXBpbmcgb2YgRGVsaXZlcnkgUHJvY2Vzc2VzIGFuZCBDYXBhYmlsaXR5IFBhdHRlcm5zIG9mIGludGVyZXN0IHRvIHNvbWUgc3BlY2lmaWMgdXNlciBjb21tdW5pdHkuPC9ib2R5Pg0KLSAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il90aGhubXlYNUVkMktuSjJ5ak5YaFdRIiBnZW5lcmFsPSJfdGhobmdDWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il90aGhubkNYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJkZWxpdmVyeVByb2Nlc3NlcyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdE9KX2tDWDVFZDJLbkoyeWpOWGhXUSIgYXNzb2NpYXRpb249Il90aHJZbENYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3RoaG5uU1g1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIqIi8+DQotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il90aGhubmlYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfdE9KX21TWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iUHJvY2VzcyIgaXNBYnN0cmFjdD0idHJ1ZSI+DQotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il90T0pfbWlYNUVkMktuSjJ5ak5YaFdRIiBhbm5vdGF0ZWRFbGVtZW50PSJfdE9KX21TWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8Ym9keT5BIFByb2Nlc3MgaXMgYSBzcGVjaWFsIEFjdGl2aXR5IHRoYXQgZGVzY3JpYmVzIGEgc3RydWN0dXJlIGZvciBwYXJ0aWN1bGFyIHR5cGVzIG9mIGRldmVsb3BtZW50IHByb2plY3RzLiAgVG8gcGVyZm9ybSBzdWNoIGEgZGV2ZWxvcG1lbnQgcHJvamVjdCBhIFByb2Nlc3NlcyB3b3VsZCBiZSAnaW5zdGFudGlhdGVkJyBhbmQgYWRhcHRlZCBmb3IgdGhlIHNwZWNpZmljIHNpdHVhdGlvbi4gIFByb2Nlc3MgaXMgYW4gYWJzdHJhY3QgY2xhc3MgYW5kIHRoaXMgbWV0YS1tb2RlbCBkZWZpbmVzIGRpZmZlcmVudCBzcGVjaWFsIHR5cGVzIG9mIFByb2Nlc3NlcyBmb3IgZGlmZmVyZW50IHByb2Nlc3MgbWFuYWdlbWVudCBhcHBsaWNhdGlvbnMgYW5kIGRpZmZlcmVudCBzaXR1YXRpb25zIG9mIHByb2Nlc3MgcmV1c2UuICBFdmVyeSBQcm9jZXNzIGNvbXByaXNlcyBvZiBhbmQgaXMgdGhlIHRvcC1sZXZlbCBlbGVtZW50IG9mIGFuIG4tbGV2ZWwgYnJlYWtkb3duIHN0cnVjdHVyZSB1c2luZyB0aGUgTmVzdGluZyBhc3NvY2lhdGlvbiBkZWZpbmVkIG9uIEFjdGl2aXR5Lg0KLUNvcmUgTWV0aG9kIENvbnRlbnQgcHJvdmlkZXMgc3RlcC1ieS1zdGVwIGV4cGxhbmF0aW9ucywgZGVzY3JpYmluZyBob3cgdmVyeSBzcGVjaWZpYyBkZXZlbG9wbWVudCBnb2FscyBhcmUgYWNoaWV2ZWQgaW5kZXBlbmRlbnQgb2YgdGhlIHBsYWNlbWVudCBvZiB0aGVzZSBzdGVwcyB3aXRoaW4gYSBkZXZlbG9wbWVudCBsaWZlY3ljbGUuICBQcm9jZXNzZXMgdGFrZSB0aGVzZSBtZXRob2QgZWxlbWVudHMgYW5kIHJlbGF0ZSB0aGVtIGludG8gc2VtaS1vcmRlcmVkIHNlcXVlbmNlcyB0aGF0IGFyZSBjdXN0b21pemVkIHRvIHNwZWNpZmljIHR5cGVzIG9mIHByb2plY3RzLiAgVGh1cywgYSBwcm9jZXNzIGlzIGEgc2V0IG9mIHBhcnRpYWxseSBvcmRlcmVkIHdvcmsgZGVzY3JpcHRpb25zIGludGVuZGVkIHRvIHJlYWNoIGEgaGlnaGVyIGRldmVsb3BtZW50IGdvYWwsIHN1Y2ggYXMgdGhlIHJlbGVhc2Ugb2YgYSBzcGVjaWZpYyBzb2Z0d2FyZSBzeXN0ZW0uICBBIHByb2Nlc3MgYW5kIHRoZSBwcm9jZXNzIG1ldGEtbW9kZWwgc3RydWN0dXJlIGRlZmluZWQgaW4gdGhpcyBzcGVjaWZpY2F0aW9uIGZvY3VzZXMgb24gdGhlIGxpZmVjeWNsZSBhbmQgdGhlIHNlcXVlbmNpbmcgb2Ygd29yayBpbiBicmVha2Rvd24gc3RydWN0dXJlcy4gIFRvIGFjaGlldmUgdGhpcyBpdCB1c2VzIHRoZSBEZXNjcmlwdG9yIGNvbmNlcHQgcmVmZXJlbmNpbmcgbWV0aG9kIGNvbnRlbnQgYW5kIGFsbG93aW5nIGRlZmluaW5nIHRpbWUtc3BlY2lmaWMgY3VzdG9taXphdGlvbnMgb2YgdGhlIHJlZmVyZW5jZWQgY29udGVudCAoZS5nLiBkZWZpbmluZyBhIGZvY3VzIG9uIGRpZmZlcmVudCBzdGVwcyBvZiB0aGUgc2FtZSBUYXNrIGFuZCBwcm92aWRpbmcgaW5wdXQgV29yayBQcm9kdWN0cyBpbiBkaWZmZXJlbnQgc3RhdGVzIHdpdGhpbiB0aGUgZGlmZmVyZW50IFBoYXNlcyBvZiBhIHByb2Nlc3MgbGlmZWN5Y2xlIGluIHdoaWNoIHRoZSBzYW1lIFRhc2sgaXMgcGVyZm9ybWVkKS4NCi08L2JvZHk+DQotICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il90aGhubnlYNUVkMktuSjJ5ak5YaFdRIiBhbm5vdGF0ZWRFbGVtZW50PSJfdE9KX21TWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8Ym9keT5Qcm9jZXNzIGluIHRoZSBwYWNrYWdlIExpYnJhcnkgQ29uZmlndXJhdGlvbiBleHRlbmRzIHRoZSBjbGFzcyBQcm9jZXNzIHdpdGggYXNzb2NpYXRpb24gcmVsYXRpbmcgYSBQcm9jZXNzIHRvIG9uZSBkZWZhdWx0IGFuZCBtYW55IG9wdGlvbmFsIHZhbGlkIENvbmZpZ3VyYXRpb25zLg0KLVRoZXNlIGNvbmZpZ3VyYXRpb25zIGRlc2NyaWJlIHZhbGlkIGNvbnRleHRzIGZvciB0aGUgUHJvY2VzcyB3aXRoaW4gYSBNZXRob2QgTGlicmFyeSBpbmRpY2F0aW5nIHVuZGVyIHdoaWNoIENvbmZpZ3VyYXRpb25zIGEgUHJvY2VzcyBpcyB3ZWxsIGRlZmluZWQuDQotPC9ib2R5Pg0KLSAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il90T0pfbXlYNUVkMktuSjJ5ak5YaFdRIiBnZW5lcmFsPSJfdEtsSElDWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il90T0pfbkNYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJpbmNsdWRlc1BhdHRlcm5zIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il90T0pfdENYNUVkMktuSjJ5ak5YaFdRIiBhc3NvY2lhdGlvbj0iX3RPVEpnQ1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfdE9KX25TWDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IioiLz4NCi0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3RPSl9uaVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il90aGhub0NYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJkZWZhdWx0Q29udGV4dCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdGhobmdDWDVFZDJLbkoyeWpOWGhXUSIgYXNzb2NpYXRpb249Il90aHJZbnlYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3RoaG5vU1g1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIxIi8+DQotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il90aGhub2lYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iMSIvPg0KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3RoaG5veVg1RWQyS25KMnlqTlhoV1EiIG5hbWU9InZhbGlkQ29udGV4dCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdGhobmdDWDVFZDJLbkoyeWpOWGhXUSIgYXNzb2NpYXRpb249Il90aHJZcENYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3RoaG5wQ1g1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIqIi8+DQotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il90aGhucFNYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfdGhyWWdDWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iTWV0aG9kTGlicmFyeSI+DQotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il90aHJZZ1NYNUVkMktuSjJ5ak5YaFdRIiBhbm5vdGF0ZWRFbGVtZW50PSJfdGhyWWdDWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8Ym9keT5BIE1ldGhvZCBMaWJyYXJ5IGlzIGEgcGh5c2ljYWwgY29udGFpbmVyIGZvciBNZXRob2QgUGx1Z2lucyBhbmQgTWV0aG9kIENvbmZpZ3VyYXRpb24gZGVmaW5pdGlvbnMuICBBbGwgTWV0aG9kIEVsZW1lbnRzIGFyZSBzdG9yZWQgaW4gYSBNZXRob2QgTGlicmFyeS48L2JvZHk+DQotICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3RocllnaVg1RWQyS25KMnlqTlhoV1EiIGdlbmVyYWw9Il90ZTJHOGlYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3RocllneVg1RWQyS25KMnlqTlhoV1EiIGdlbmVyYWw9Il90QmZjb0NYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3RoclloQ1g1RWQyS25KMnlqTlhoV1EiIG5hbWU9Im1ldGhvZFBsdWdpbnMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3RXRFhVQ1g1RWQyS25KMnlqTlhoV1EiIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiIGFzc29jaWF0aW9uPSJfdGhyWW1TWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il90aHJZaFNYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfdGhyWWhpWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3RoclloeVg1RWQyS25KMnlqTlhoV1EiIG5hbWU9InByZWRlZmluZWRDb25maWd1cmF0aW9ucyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdGhobmdDWDVFZDJLbkoyeWpOWGhXUSIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgYXNzb2NpYXRpb249Il90aHJZbkNYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3RocllpQ1g1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIqIi8+DQotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il90aHJZaVNYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfdGhyWWlpWDVFZDJLbkoyeWpOWGhXUSIgbWVtYmVyRW5kPSJfdGhyWWpDWDVFZDJLbkoyeWpOWGhXUSBfdGhobmhDWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il90aHJZaXlYNUVkMktuSjJ5ak5YaFdRIiBhbm5vdGF0ZWRFbGVtZW50PSJfdGhyWWlpWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8Ym9keT5BIHNlbGVjdGlvbiBvZiBwYWNrYWdlcyB0byBiZSBpbmNsdWRlZCBpbiB0aGUgY29uZmlndXJhdGlvbi48L2JvZHk+DQotICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgPG93bmVkRW5kIHhtaTppZD0iX3RocllqQ1g1RWQyS25KMnlqTlhoV1EiIG5hbWU9Il9tZXRob2RDb25maWd1cmF0aW9uIiB2aXNpYmlsaXR5PSJwcml2YXRlIiB0eXBlPSJfdGhobmdDWDVFZDJLbkoyeWpOWGhXUSIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iX3RocllpaVg1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfdGhyWWpTWDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IioiLz4NCi0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3RocllqaVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICA8L293bmVkRW5kPg0KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il90aHJZanlYNUVkMktuSjJ5ak5YaFdRIiBtZW1iZXJFbmQ9Il90aHJZa1NYNUVkMktuSjJ5ak5YaFdRIF90aGhuaHlYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3RocllrQ1g1RWQyS25KMnlqTlhoV1EiIGFubm90YXRlZEVsZW1lbnQ9Il90aHJZanlYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDxib2R5PkEgc2VsZWN0aW9uIG9mIHBhY2thZ2VzIHRvIGJlIGluY2x1ZGVkIGluIHRoZSBjb25maWd1cmF0aW9uLjwvYm9keT4NCi0gICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfdGhyWWtTWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iX21ldGhvZENvbmZpZ3VyYXRpb24iIHZpc2liaWxpdHk9InByaXZhdGUiIHR5cGU9Il90aGhuZ0NYNUVkMktuSjJ5ak5YaFdRIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfdGhyWWp5WDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il90aHJZa2lYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfdGhyWWt5WDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgIDwvb3duZWRFbmQ+DQotICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3RocllsQ1g1RWQyS25KMnlqTlhoV1EiIG1lbWJlckVuZD0iX3RocllsaVg1RWQyS25KMnlqTlhoV1EgX3RoaG5uQ1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfdGhyWWxTWDVFZDJLbkoyeWpOWGhXUSIgYW5ub3RhdGVkRWxlbWVudD0iX3RocllsQ1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPGJvZHk+RGVsaXZlcnkgUHJvY2VzcyBjYW4gYmUgb3JnYW5pemVkIGluIG1hbnkgUHJvY2VzcyBGYW1pbGllcy48L2JvZHk+DQotICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgPG93bmVkRW5kIHhtaTppZD0iX3RocllsaVg1RWQyS25KMnlqTlhoV1EiIG5hbWU9InByb2Nlc3NGYW1pbGllcyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdGhobm1TWDVFZDJLbkoyeWpOWGhXUSIgYXNzb2NpYXRpb249Il90aHJZbENYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3RocllseVg1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIqIi8+DQotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il90aHJZbUNYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgPC9vd25lZEVuZD4NCi0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfdGhyWW1TWDVFZDJLbkoyeWpOWGhXUSIgbWVtYmVyRW5kPSJfdGhyWW15WDVFZDJLbkoyeWpOWGhXUSBfdGhyWWhDWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il90aHJZbWlYNUVkMktuSjJ5ak5YaFdRIiBhbm5vdGF0ZWRFbGVtZW50PSJfdGhyWW1TWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8Ym9keT5BIE1ldGhvZCBMaWJyYXJ5IHBoeXNpY2FsbHkgY29tcHJpc2VzIG9mIE1ldGhvZCBQbHVnaW5zLjwvYm9keT4NCi0gICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfdGhyWW15WDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iX21ldGhvZExpYnJhcnkiIHZpc2liaWxpdHk9InByaXZhdGUiIHR5cGU9Il90aHJZZ0NYNUVkMktuSjJ5ak5YaFdRIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfdGhyWW1TWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il90aHJZbkNYNUVkMktuSjJ5ak5YaFdRIiBtZW1iZXJFbmQ9Il90aHJZaHlYNUVkMktuSjJ5ak5YaFdRIF90aHJZbmlYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3RoclluU1g1RWQyS25KMnlqTlhoV1EiIGFubm90YXRlZEVsZW1lbnQ9Il90aHJZbkNYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDxib2R5PkEgTWV0aG9kIExpYnJhcnkgc3RvcmVzIGEgc2V0IG9mIHByZWRlZmluZWQgTWV0aG9kIENvbmZpZ3VyYXRpb25zIHRoYXQgYXJlIHJlZ3VsYXJseSB1c2VkIGJ5IHRoZSBsaWJyYXJ5IGF1dGhvcnMgKGUuZy4gdGhlIGNvbmZpZ3VyYXRpb25zIHRoYXQgdGhleSBzaGlwIHRvIHRoZWlyIHVzZXJzKS48L2JvZHk+DQotICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgPG93bmVkRW5kIHhtaTppZD0iX3RoclluaVg1RWQyS25KMnlqTlhoV1EiIG5hbWU9Il9tZXRob2RMaWJyYXJ5IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il90aHJZZ0NYNUVkMktuSjJ5ak5YaFdRIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfdGhyWW5DWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il90aHJZbnlYNUVkMktuSjJ5ak5YaFdRIiBtZW1iZXJFbmQ9Il90aHJZb1NYNUVkMktuSjJ5ak5YaFdRIF90aGhub0NYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3RocllvQ1g1RWQyS25KMnlqTlhoV1EiIGFubm90YXRlZEVsZW1lbnQ9Il90aHJZbnlYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDxib2R5PkEgUHJvY2VzcyBoYXMgZXhhY3RseSBvbiBkZWZhdWx0IGNvbmZpZ3VyYXRpb24uICBUaGlzIGlzIGluIG1vc3QgY2FzZXMgdGhlIGNvbmZpZ3VyYXRpb24gaW4gd2hpY2ggdGhlIHByb2Nlc3MgaGFzIGJlZW4gY3JlYXRlZC48L2JvZHk+DQotICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgPG93bmVkRW5kIHhtaTppZD0iX3RocllvU1g1RWQyS25KMnlqTlhoV1EiIG5hbWU9Il9wcm9jZXNzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il90T0pfbVNYNUVkMktuSjJ5ak5YaFdRIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfdGhyWW55WDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il90aHJZb2lYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfdGhyWW95WDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgIDwvb3duZWRFbmQ+DQotICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3RocllwQ1g1RWQyS25KMnlqTlhoV1EiIG1lbWJlckVuZD0iX3RocllwaVg1RWQyS25KMnlqTlhoV1EgX3RoaG5veVg1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfdGhyWXBTWDVFZDJLbkoyeWpOWGhXUSIgYW5ub3RhdGVkRWxlbWVudD0iX3RocllwQ1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPGJvZHk+QSBQcm9jZXNzIGNhbiBoYXZlIG1hbnkgYWRkaXRpb25hbCBjb25maWd1cmF0aW9ucyB0aGF0IGhhdmUgYmVlbiB2ZXJpZmllZCB0byBhbHNvIHByb2R1Y2UgdmFsaWQgcmVzdWx0cy4gIFByb2Nlc3MgRWxlbWVudHMgKGUuZy4gRGVzY3JpcHRvcnMpIHRoYXQgcmVmZXIgdG8gY29udGVudCBwYWNrYWdlcyB0aGF0IGFyZSBkZWZpbmVkIG91dHNpZGUgdGhlIHNjb3BlIG9mIHN1Y2ggYSBjb25maWd1cmF0aW9uIHdvdWxkIG5vdCBiZSBzaG93biBpbiB0aGUgcHJvY2VzcyB3aGVuIHB1Ymxpc2hlZCBvciB1c2VkIHVuZGVyIHN1Y2ggYSBjb25maWd1cmF0aW9uLiAgVGhpcyBhbGxvd3MgdG8gZWFzaWx5IHJlbW92ZSBjb250ZW50IGZyb20gYSBwcm9jZXNzIGJ5IHJlbW92aW5nIGNvbnRlbnQgcGFja2FnZXMgdG8gZnJvbSB0aGUgcmVsYXRlZCBjb25maWd1cmF0aW9uLjwvYm9keT4NCi0gICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfdGhyWXBpWDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iX3Byb2Nlc3MiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3RPSl9tU1g1RWQyS25KMnlqTlhoV1EiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il90aHJZcENYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3RocllweVg1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIqIi8+DQotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il90aHJZcUNYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgPC9vd25lZEVuZD4NCi0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfdGhyWXFTWDVFZDJLbkoyeWpOWGhXUSIgbWVtYmVyRW5kPSJfdGhyWXFpWDVFZDJLbkoyeWpOWGhXUSBfdGhobmlpWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgPG93bmVkRW5kIHhtaTppZD0iX3RocllxaVg1RWQyS25KMnlqTlhoV1EiIG5hbWU9Il9tZXRob2RDb25maWd1cmF0aW9uIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il90aGhuZ0NYNUVkMktuSjJ5ak5YaFdRIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfdGhyWXFTWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il90aHJZcXlYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfdGhyWXJDWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgIDwvb3duZWRFbmQ+DQotICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3RocllyU1g1RWQyS25KMnlqTlhoV1EiIG1lbWJlckVuZD0iX3RoaG5qU1g1RWQyS25KMnlqTlhoV1EgX3RocllyaVg1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il90aHJZcmlYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJfbWV0aG9kQ29uZmlndXJhdGlvbiIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdGhobmdDWDVFZDJLbkoyeWpOWGhXUSIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iX3RocllyU1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfdGhyWXJ5WDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IioiLz4NCi0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3RocllzQ1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICA8L293bmVkRW5kPg0KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il90aHJZc1NYNUVkMktuSjJ5ak5YaFdRIiBtZW1iZXJFbmQ9Il90aGhua0NYNUVkMktuSjJ5ak5YaFdRIF90aHJZc3lYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3RocllzaVg1RWQyS25KMnlqTlhoV1EiIGFubm90YXRlZEVsZW1lbnQ9Il90aHJZc1NYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDxib2R5PlRoZSBkZWZpbml0aW9uIG9mIGEgY29uZmlndXJhdGlvbiBjYW4gYmUgYmFzZWQgb24gdGhlIGRlZmluaXRpb25zIG9mIG90aGVyIGNvbmZpZ3VyYXRpb25zLiAgRm9yIGV4YW1wbGUsIGEgY29uZmlndXJhdGlvbiBBIGNvdWxkIGJlIGRlZmluZWQgYXMgdGhlIHN1cGVyc2V0IG9mIGNvbmZpZ3VyYXRpb25zIEIsIEMsIGFuZCBEIHBsdXMgYWRkIG1vcmUgc2VsZWN0ZWQgUGx1Z2lucyBhbmQgUGFja2FnZXMuICBJbiBzdWNoIGEgY2FzZSBBIHdvdWxkIGxpc3QgQiwgQywgYW5kIEQgYXMgaXRzIGJhc2VDb25maWd1cmF0aW9ucy4gIElmIGFueSBvZiB0aGVzZSBiYXNlIGNvbmZpZ3VyYXRpb25zIGNoYW5nZXMgYWxsIHVwZGF0ZXMgd291bGQgYmUgYXV0b21hdGljYWxseSB2YWxpZCBmb3IgQSBhcyB3ZWxsIHJlZHVjaW5nIG1haW50YWluYWJpbGl0eSBvdmVyaGVhZCBmb3Igb3ZlcmxhcHBpbmcvZGVwZW5kZW50IGNvbmZpZ3VyYXRpb25zLiA8L2JvZHk+DQotICAgICAgPC9vd25lZENvbW1lbnQ+DQotICAgICAgPG93bmVkRW5kIHhtaTppZD0iX3RocllzeVg1RWQyS25KMnlqTlhoV1EiIG5hbWU9IiIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfdGhobmdDWDVFZDJLbkoyeWpOWGhXUSIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iX3RocllzU1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfdGhyWXRDWDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IioiLz4NCi0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3Rocll0U1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gICAgICA8L293bmVkRW5kPg0KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il90aHJZdGlYNUVkMktuSjJ5ak5YaFdRIiBtZW1iZXJFbmQ9Il90aGhua3lYNUVkMktuSjJ5ak5YaFdRIF90aHJZdHlYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfdGhyWXR5WDVFZDJLbkoyeWpOWGhXUSIgbmFtZT0iX21ldGhvZENvbmZpZ3VyYXRpb24iIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3RoaG5nQ1g1RWQyS25KMnlqTlhoV1EiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il90aHJZdGlYNUVkMktuSjJ5ak5YaFdRIj4NCi0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3Rocll1Q1g1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIqIi8+DQotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il90aHJZdVNYNUVkMktuSjJ5ak5YaFdRIi8+DQotICAgICAgPC9vd25lZEVuZD4NCi0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfdGhyWXVpWDVFZDJLbkoyeWpOWGhXUSIgbWVtYmVyRW5kPSJfdGhobmxpWDVFZDJLbkoyeWpOWGhXUSBfdGhyWXV5WDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgPG93bmVkRW5kIHhtaTppZD0iX3Rocll1eVg1RWQyS25KMnlqTlhoV1EiIG5hbWU9Il9tZXRob2RDb25maWd1cmF0aW9uIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il90aGhuZ0NYNUVkMktuSjJ5ak5YaFdRIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfdGhyWXVpWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il90aHJZdkNYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJDb25maWd1cmF0aW9uQ2F0ZWdvcnkiPg0KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il90aHJZdlNYNUVkMktuSjJ5ak5YaFdRIiBnZW5lcmFsPSJfdEdaeDN5WDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il90aHJZdmlYNUVkMktuSjJ5ak5YaFdRIiBuYW1lPSJjb25maWd1cmF0aW9uIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il90aGhuZ0NYNUVkMktuSjJ5ak5YaFdRIiBhc3NvY2lhdGlvbj0iX3Rocll3U1g1RWQyS25KMnlqTlhoV1EiPg0KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfdGhyWXZ5WDVFZDJLbkoyeWpOWGhXUSIgdmFsdWU9IjEiLz4NCi0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3Rocll3Q1g1RWQyS25KMnlqTlhoV1EiIHZhbHVlPSIxIi8+DQotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfdGhyWXdTWDVFZDJLbkoyeWpOWGhXUSIgbWVtYmVyRW5kPSJfdGhyWXZpWDVFZDJLbkoyeWpOWGhXUSBfdGhyWXdpWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgPG93bmVkRW5kIHhtaTppZD0iX3Rocll3aVg1RWQyS25KMnlqTlhoV1EiIG5hbWU9IiIgdmlzaWJpbGl0eT0icHJpdmF0ZSIgdHlwZT0iX3Rocll2Q1g1RWQyS25KMnlqTlhoV1EiIGFzc29jaWF0aW9uPSJfdGhyWXdTWDVFZDJLbkoyeWpOWGhXUSI+DQotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il90aHJZd3lYNUVkMktuSjJ5ak5YaFdRIiB2YWx1ZT0iKiIvPg0KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfdGhyWXhDWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgICAgIDwvb3duZWRFbmQ+DQotICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICA8cHJvZmlsZUFwcGxpY2F0aW9uIHhtaTppZD0iX0o3dEcxZXlDRWR1NS12VmpsZlZzZlEiPg0KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfSjd0RzF1eUNFZHU1LXZWamxmVnNmUSIgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3VtbDIvMi4wLjAvVU1MIj4NCi0gICAgICAgIDxyZWZlcmVuY2VzIHhtaTp0eXBlPSJlY29yZTpFUGFja2FnZSIgaHJlZj0icGF0aG1hcDovL1VNTF9QUk9GSUxFUy9TdGFuZGFyZC5wcm9maWxlLnVtbCNfeXpVNThZaW5FZHF0dmJuZkIyTF81dyIvPg0KLSAgICAgIDwvZUFubm90YXRpb25zPg0KLSAgICAgIDxhcHBsaWVkUHJvZmlsZSBocmVmPSJwYXRobWFwOi8vVU1MX1BST0ZJTEVTL1N0YW5kYXJkLnByb2ZpbGUudW1sI18wIi8+DQotICAgIDwvcHJvZmlsZUFwcGxpY2F0aW9uPg0KLSAgICA8cHJvZmlsZUFwcGxpY2F0aW9uIHhtaTppZD0iX0o3dEcxLXlDRWR1NS12VmpsZlZzZlEiPg0KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfSjd0RzJPeUNFZHU1LXZWamxmVnNmUSIgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3VtbDIvMi4wLjAvVU1MIj4NCi0gICAgICAgIDxyZWZlcmVuY2VzIHhtaTp0eXBlPSJlY29yZTpFUGFja2FnZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTVNMX1BST0ZJTEVTL0RlZmF1bHQuZXB4I19JTjhrOE1tQkVkcUJjTjFSNkV2V1V3P0RlZmF1bHQvRGVmYXVsdD8iLz4NCi0gICAgICA8L2VBbm5vdGF0aW9ucz4NCi0gICAgICA8YXBwbGllZFByb2ZpbGUgaHJlZj0icGF0aG1hcDovL1VNTDJfTVNMX1BST0ZJTEVTL0RlZmF1bHQuZXB4I19hX1Mzd05XTEVkaXk0SXFQOHdoakZBP0RlZmF1bHQ/Ii8+DQotICAgIDwvcHJvZmlsZUFwcGxpY2F0aW9uPg0KLSAgICA8cHJvZmlsZUFwcGxpY2F0aW9uIHhtaTppZD0iX0o3dEcyZXlDRWR1NS12VmpsZlZzZlEiPg0KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfSjd0RzJ1eUNFZHU1LXZWamxmVnNmUSIgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3VtbDIvMi4wLjAvVU1MIj4NCi0gICAgICAgIDxyZWZlcmVuY2VzIHhtaTp0eXBlPSJlY29yZTpFUGFja2FnZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTVNMX1BST0ZJTEVTL0RlcGxveW1lbnQuZXB4I19JcmRBVU1tQkVkcUJjTjFSNkV2V1V3P0RlcGxveW1lbnQvRGVwbG95bWVudD8iLz4NCi0gICAgICA8L2VBbm5vdGF0aW9ucz4NCi0gICAgICA8YXBwbGllZFByb2ZpbGUgaHJlZj0icGF0aG1hcDovL1VNTDJfTVNMX1BST0ZJTEVTL0RlcGxveW1lbnQuZXB4I192amJ1d092SEVkaURYNWJqaTBpVlNBP0RlcGxveW1lbnQ/Ii8+DQotICAgIDwvcHJvZmlsZUFwcGxpY2F0aW9uPg0KLSAgICA8cHJvZmlsZUFwcGxpY2F0aW9uIHhtaTppZD0iX1RfY2NvT3lDRWR1NS12VmpsZlZzZlEiPg0KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfVF9jY29leUNFZHU1LXZWamxmVnNmUSIgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3VtbDIvMi4wLjAvVU1MIj4NCi0gICAgICAgIDxyZWZlcmVuY2VzIHhtaTp0eXBlPSJlY29yZTpFUGFja2FnZSIgaHJlZj0icGF0aG1hcDovL1VNTF9QUk9GSUxFUy9FY29yZS5wcm9maWxlLnVtbCNfdnktSFVZaW5FZHF0dmJuZkIyTF81dyIvPg0KLSAgICAgIDwvZUFubm90YXRpb25zPg0KLSAgICAgIDxhcHBsaWVkUHJvZmlsZSBocmVmPSJwYXRobWFwOi8vVU1MX1BST0ZJTEVTL0Vjb3JlLnByb2ZpbGUudW1sI18wIi8+DQotICAgIDwvcHJvZmlsZUFwcGxpY2F0aW9uPg0KLSAgPC91bWw6TW9kZWw+DQotICA8RWNvcmU6RVBhY2thZ2UgeG1pOmlkPSJfVTlJejhPeUNFZHU1LXZWamxmVnNmUSIgYmFzZV9QYWNrYWdlPSJfSjd0RzBPeUNFZHU1LXZWamxmVnNmUSIgcGFja2FnZU5hbWU9InVtYSIgbnNQcmVmaXg9Im9yZy5lY2xpcHNlLmVwZi51bWEiIG5zVVJJPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjUvdW1hLmVjb3JlIiBiYXNlUGFja2FnZT0ib3JnLmVjbGlwc2UuZXBmIi8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3RCZmNweVg1RWQyS25KMnlqTlhoV1EiIGJhc2VfQ29tbWVudD0iX3RCVnNTeVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxFY29yZTpFQXR0cmlidXRlIHhtaTppZD0iX3RCZmNxQ1g1RWQyS25KMnlqTlhoV1EiIGJhc2VfUHJvcGVydHk9Il90QlZzVFNYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3RCZmNxU1g1RWQyS25KMnlqTlhoV1EiIGJhc2VfQ29tbWVudD0iX3RCZmNrU1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfdEJmY3FpWDVFZDJLbkoyeWpOWGhXUSIgYmFzZV9Db21tZW50PSJfdEJmY2t5WDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPEVjb3JlOkVBdHRyaWJ1dGUgeG1pOmlkPSJfdEJmY3F5WDVFZDJLbkoyeWpOWGhXUSIgYmFzZV9Qcm9wZXJ0eT0iX3RCZmNsU1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfdEJmY3JDWDVFZDJLbkoyeWpOWGhXUSIgYmFzZV9Db21tZW50PSJfdEJmY21pWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il90QmZjclNYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX0NvbW1lbnQ9Il90QmZjblNYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3RCZmNyaVg1RWQyS25KMnlqTlhoV1EiIGJhc2VfQ29tbWVudD0iX3RCZmNvU1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfdEJmY3J5WDVFZDJLbkoyeWpOWGhXUSIgYmFzZV9Db21tZW50PSJfdEJmY3BTWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPEVjb3JlOkVEYXRhVHlwZSB4bWk6aWQ9Il90Qm9taGlYNUVkMktuSjJ5ak5YaFdRIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS51dGlsLkRhdGUiIGJhc2VfUHJpbWl0aXZlVHlwZT0iX3RCZmNzQ1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfdEJvbWh5WDVFZDJLbkoyeWpOWGhXUSIgYmFzZV9Db21tZW50PSJfdEJmY3NTWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPEVjb3JlOkVEYXRhVHlwZSB4bWk6aWQ9Il90Qm9taUNYNUVkMktuSjJ5ak5YaFdRIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5uZXQuVVJJIiBiYXNlX1ByaW1pdGl2ZVR5cGU9Il90QmZjc2lYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3RCb21pU1g1RWQyS25KMnlqTlhoV1EiIGJhc2VfQ29tbWVudD0iX3RCZmNzeVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxFY29yZTpFRGF0YVR5cGUgeG1pOmlkPSJfdEJvbWlpWDVFZDJLbkoyeWpOWGhXUSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubGFuZy5TdHJpbmciIGJhc2VfUHJpbWl0aXZlVHlwZT0iX3RCZmN0Q1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfdEJvbWl5WDVFZDJLbkoyeWpOWGhXUSIgYmFzZV9Db21tZW50PSJfdEJmY3RTWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPEVjb3JlOkVEYXRhVHlwZSB4bWk6aWQ9Il90Qm9takNYNUVkMktuSjJ5ak5YaFdRIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS51dGlsLlNldCIgYmFzZV9QcmltaXRpdmVUeXBlPSJfdEJmY3RpWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPEVjb3JlOkVEYXRhVHlwZSB4bWk6aWQ9Il90Qm9talNYNUVkMktuSjJ5ak5YaFdRIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS51dGlsLkxpc3QiIGJhc2VfUHJpbWl0aXZlVHlwZT0iX3RCb21nQ1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxFY29yZTpFRGF0YVR5cGUgeG1pOmlkPSJfdEJvbWppWDVFZDJLbkoyeWpOWGhXUSIgaW5zdGFuY2VDbGFzc05hbWU9ImludCIgYmFzZV9QcmltaXRpdmVUeXBlPSJfdEJvbWdTWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il90Qm9tanlYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX0NvbW1lbnQ9Il90Qm9tZ2lYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RWNvcmU6RURhdGFUeXBlIHhtaTppZD0iX3RCb21rQ1g1RWQyS25KMnlqTlhoV1EiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLmxhbmcuQm9vbGVhbiIgYmFzZV9QcmltaXRpdmVUeXBlPSJfdEJvbWd5WDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il90Qm9ta1NYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX0NvbW1lbnQ9Il90Qm9taENYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RWNvcmU6RURhdGFUeXBlIHhtaTppZD0iX3RCb21raVg1RWQyS25KMnlqTlhoV1EiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLmxhbmcuRG91YmxlIiBiYXNlX1ByaW1pdGl2ZVR5cGU9Il90Qm9taFNYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3RDRlN1aVg1RWQyS25KMnlqTlhoV1EiIGJhc2VfQ29tbWVudD0iX3RCOElnaVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxFY29yZTpFQXR0cmlidXRlIHhtaTppZD0iX3RDRlN1eVg1RWQyS25KMnlqTlhoV1EiIGJhc2VfUHJvcGVydHk9Il90QjhJaENYNUVkMktuSjJ5ak5YaFdRIiBpc0lEPSJ0cnVlIi8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3RDRlN2Q1g1RWQyS25KMnlqTlhoV1EiIGJhc2VfQ29tbWVudD0iX3RCOEloU1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxFY29yZTpFQXR0cmlidXRlIHhtaTppZD0iX3RDRlN2U1g1RWQyS25KMnlqTlhoV1EiIGJhc2VfUHJvcGVydHk9Il90QjhJaVNYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3RDRlN2aVg1RWQyS25KMnlqTlhoV1EiIGJhc2VfQ29tbWVudD0iX3RCOElpaVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxFY29yZTpFQXR0cmlidXRlIHhtaTppZD0iX3RDRlN2eVg1RWQyS25KMnlqTlhoV1EiIGJhc2VfUHJvcGVydHk9Il90QjhJamlYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3RDRlN3Q1g1RWQyS25KMnlqTlhoV1EiIGJhc2VfQ29tbWVudD0iX3RCOElqeVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfdENGU3dTWDVFZDJLbkoyeWpOWGhXUSIgYmFzZV9Db21tZW50PSJfdEI4SW5TWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il90Q0ZTd2lYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX0NvbW1lbnQ9Il90QjhJb0NYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RWNvcmU6RUF0dHJpYnV0ZSB4bWk6aWQ9Il90Q0ZTd3lYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX1Byb3BlcnR5PSJfdEI4SW9pWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il90Q0ZTeENYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX0NvbW1lbnQ9Il90QjhJb3lYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3RDRlN4U1g1RWQyS25KMnlqTlhoV1EiIGJhc2VfQ29tbWVudD0iX3RDRlNjU1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxFY29yZTpFQXR0cmlidXRlIHhtaTppZD0iX3RDRlN4aVg1RWQyS25KMnlqTlhoV1EiIGJhc2VfUHJvcGVydHk9Il90Q0ZTY3lYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3RDRlN4eVg1RWQyS25KMnlqTlhoV1EiIGJhc2VfQ29tbWVudD0iX3RDRlNkQ1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxFY29yZTpFQXR0cmlidXRlIHhtaTppZD0iX3RDRlN5Q1g1RWQyS25KMnlqTlhoV1EiIGJhc2VfUHJvcGVydHk9Il90Q0ZTZUNYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3RDUERjQ1g1RWQyS25KMnlqTlhoV1EiIGJhc2VfQ29tbWVudD0iX3RDRlNlU1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfdENQRGNTWDVFZDJLbkoyeWpOWGhXUSIgYmFzZV9Db21tZW50PSJfdENGU2dTWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPEVjb3JlOkVBdHRyaWJ1dGUgeG1pOmlkPSJfdENQRGNpWDVFZDJLbkoyeWpOWGhXUSIgYmFzZV9Qcm9wZXJ0eT0iX3RDRlNneVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfdENQRGN5WDVFZDJLbkoyeWpOWGhXUSIgYmFzZV9Db21tZW50PSJfdENGU2hDWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il90Q1BEZENYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX0NvbW1lbnQ9Il90Q0ZTaVNYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RWNvcmU6RUF0dHJpYnV0ZSB4bWk6aWQ9Il90Q1BEZFNYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX1Byb3BlcnR5PSJfdENGU2tTWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il90Q1BEZGlYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX0NvbW1lbnQ9Il90Q0ZTbGlYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3RDUERkeVg1RWQyS25KMnlqTlhoV1EiIGJhc2VfQ29tbWVudD0iX3RDRlNtU1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfdENQRGVDWDVFZDJLbkoyeWpOWGhXUSIgYmFzZV9Db21tZW50PSJfdENGU25pWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il90Q1BEZVNYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX0NvbW1lbnQ9Il90Q0ZTb3lYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RWNvcmU6RUF0dHJpYnV0ZSB4bWk6aWQ9Il90Q1BEZWlYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX1Byb3BlcnR5PSJfdENGU3RDWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il90RFJsUVNYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX0NvbW1lbnQ9Il90REliVWlYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RWNvcmU6RVJlZmVyZW5jZSB4bWk6aWQ9Il90RFJsUWlYNUVkMktuSjJ5ak5YaFdRIiBpc1RyYW5zaWVudD0idHJ1ZSIgYmFzZV9Qcm9wZXJ0eT0iX3RESWJWQ1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfdERSbFF5WDVFZDJLbkoyeWpOWGhXUSIgYmFzZV9Db21tZW50PSJfdERJYld5WDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPEVjb3JlOkVSZWZlcmVuY2UgeG1pOmlkPSJfdERSbFJDWDVFZDJLbkoyeWpOWGhXUSIgaXNUcmFuc2llbnQ9InRydWUiIGJhc2VfUHJvcGVydHk9Il90REliYlNYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3REUmxSU1g1RWQyS25KMnlqTlhoV1EiIGJhc2VfQ29tbWVudD0iX3RESWJjU1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfdERSbFJpWDVFZDJLbkoyeWpOWGhXUSIgYmFzZV9Db21tZW50PSJfdERJYmRDWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il90RFJsUnlYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX0NvbW1lbnQ9Il90REliZHlYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3REUmxTQ1g1RWQyS25KMnlqTlhoV1EiIGJhc2VfQ29tbWVudD0iX3RESWJnQ1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfdERSbFNTWDVFZDJLbkoyeWpOWGhXUSIgYmFzZV9Db21tZW50PSJfdERJYmhpWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il90RFJsU2lYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX0NvbW1lbnQ9Il90REliaVNYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3REUmxTeVg1RWQyS25KMnlqTlhoV1EiIGJhc2VfQ29tbWVudD0iX3RESWJqU1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfdERSbFRDWDVFZDJLbkoyeWpOWGhXUSIgYmFzZV9Db21tZW50PSJfdERJYmxpWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il90RFJsVFNYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX0NvbW1lbnQ9Il90RElibXlYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3REUmxUaVg1RWQyS25KMnlqTlhoV1EiIGJhc2VfQ29tbWVudD0iX3RESWJvQ1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfdERSbFR5WDVFZDJLbkoyeWpOWGhXUSIgYmFzZV9Db21tZW50PSJfdERJYnBTWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPEVjb3JlOkVSZWZlcmVuY2UgeG1pOmlkPSJfdERSbFVDWDVFZDJLbkoyeWpOWGhXUSIgaXNUcmFuc2llbnQ9InRydWUiIGJhc2VfUHJvcGVydHk9Il90RElicGlYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3REUmxVU1g1RWQyS25KMnlqTlhoV1EiIGJhc2VfQ29tbWVudD0iX3RESWJxaVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfdERSbFVpWDVFZDJLbkoyeWpOWGhXUSIgYmFzZV9Db21tZW50PSJfdERJYnJ5WDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il90RFJsVXlYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX0NvbW1lbnQ9Il90RElidENYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3REUmxWQ1g1RWQyS25KMnlqTlhoV1EiIGJhc2VfQ29tbWVudD0iX3RESWJ0aVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfdERSbFZTWDVFZDJLbkoyeWpOWGhXUSIgYmFzZV9Db21tZW50PSJfdERJYnV5WDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il90RFJsVmlYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX0NvbW1lbnQ9Il90RElid0NYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3REUmxWeVg1RWQyS25KMnlqTlhoV1EiIGJhc2VfQ29tbWVudD0iX3RESWJ3eVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfdERSbFdDWDVFZDJLbkoyeWpOWGhXUSIgYmFzZV9Db21tZW50PSJfdERJYnhpWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il90RWQ0RVNYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX0NvbW1lbnQ9Il90RUs5SWlYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3RFZDRFaVg1RWQyS25KMnlqTlhoV1EiIGJhc2VfQ29tbWVudD0iX3RFSzlKU1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfdEVkNEV5WDVFZDJLbkoyeWpOWGhXUSIgYmFzZV9Db21tZW50PSJfdEVLOUtDWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il90RWQ0RkNYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX0NvbW1lbnQ9Il90RUs5S3lYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3RFZDRGU1g1RWQyS25KMnlqTlhoV1EiIGJhc2VfQ29tbWVudD0iX3RFSzlMaVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfdEVkNEZpWDVFZDJLbkoyeWpOWGhXUSIgYmFzZV9Db21tZW50PSJfdEVLOU1TWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il90RWQ0RnlYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX0NvbW1lbnQ9Il90RUs5TkNYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3RFZDRHQ1g1RWQyS25KMnlqTlhoV1EiIGJhc2VfQ29tbWVudD0iX3RFSzlOeVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfdEVkNEdTWDVFZDJLbkoyeWpOWGhXUSIgYmFzZV9Db21tZW50PSJfdEVLOU9pWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il90RWQ0R2lYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX0NvbW1lbnQ9Il90RUs5UFNYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3RFZDRHeVg1RWQyS25KMnlqTlhoV1EiIGJhc2VfQ29tbWVudD0iX3RFSzlRQ1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfdEVkNEhDWDVFZDJLbkoyeWpOWGhXUSIgYmFzZV9Db21tZW50PSJfdEVLOVNDWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il90RWQ0SFNYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX0NvbW1lbnQ9Il90RUs5VlNYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3RFZDRIaVg1RWQyS25KMnlqTlhoV1EiIGJhc2VfQ29tbWVudD0iX3RFSzlYQ1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfdEVkNEh5WDVFZDJLbkoyeWpOWGhXUSIgYmFzZV9Db21tZW50PSJfdEVVdUxTWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il90RWQ0SUNYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX0NvbW1lbnQ9Il90RVV1TUNYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3RFZDRJU1g1RWQyS25KMnlqTlhoV1EiIGJhc2VfQ29tbWVudD0iX3RFVXVNeVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfdEVkNElpWDVFZDJLbkoyeWpOWGhXUSIgYmFzZV9Db21tZW50PSJfdEVVdU9DWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il90RWQ0SXlYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX0NvbW1lbnQ9Il90RVV1UFNYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3RFZDRKQ1g1RWQyS25KMnlqTlhoV1EiIGJhc2VfQ29tbWVudD0iX3RFVXVRaVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfdEVkNEpTWDVFZDJLbkoyeWpOWGhXUSIgYmFzZV9Db21tZW50PSJfdEVVdVJ5WDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il90RWQ0SmlYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX0NvbW1lbnQ9Il90RVV1VENYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3RFZDRKeVg1RWQyS25KMnlqTlhoV1EiIGJhc2VfQ29tbWVudD0iX3RFVXVVU1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfdEVkNEtDWDVFZDJLbkoyeWpOWGhXUSIgYmFzZV9Db21tZW50PSJfdEVVdVZpWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il90RWQ0S1NYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX0NvbW1lbnQ9Il90RVV1V3lYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3RFZDRLaVg1RWQyS25KMnlqTlhoV1EiIGJhc2VfQ29tbWVudD0iX3RFVXVYaVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfdEVkNEt5WDVFZDJLbkoyeWpOWGhXUSIgYmFzZV9Db21tZW50PSJfdEVVdVl5WDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPEVjb3JlOkVBdHRyaWJ1dGUgeG1pOmlkPSJfdEZoQThDWDVFZDJLbkoyeWpOWGhXUSIgYmFzZV9Qcm9wZXJ0eT0iX3RGTmU4aVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfdEZoQThTWDVFZDJLbkoyeWpOWGhXUSIgYmFzZV9Db21tZW50PSJfdEZOZTh5WDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPEVjb3JlOkVBdHRyaWJ1dGUgeG1pOmlkPSJfdEZoQThpWDVFZDJLbkoyeWpOWGhXUSIgYmFzZV9Qcm9wZXJ0eT0iX3RGTmU5eVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfdEZoQTh5WDVFZDJLbkoyeWpOWGhXUSIgYmFzZV9Db21tZW50PSJfdEZOZS1DWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPEVjb3JlOkVBdHRyaWJ1dGUgeG1pOmlkPSJfdEZoQTlDWDVFZDJLbkoyeWpOWGhXUSIgYmFzZV9Qcm9wZXJ0eT0iX3RGTmVfQ1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxFY29yZTpFQXR0cmlidXRlIHhtaTppZD0iX3RGaEE5U1g1RWQyS25KMnlqTlhoV1EiIGJhc2VfUHJvcGVydHk9Il90Rk5mQUNYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RWNvcmU6RUF0dHJpYnV0ZSB4bWk6aWQ9Il90RmhBOWlYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX1Byb3BlcnR5PSJfdEZOZkJpWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il90RmhBOXlYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX0NvbW1lbnQ9Il90Rk5mQnlYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RWNvcmU6RUF0dHJpYnV0ZSB4bWk6aWQ9Il90RmhBLUNYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX1Byb3BlcnR5PSJfdEZOZkN5WDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il90RmhBLVNYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX0NvbW1lbnQ9Il90Rk5mRENYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RWNvcmU6RUF0dHJpYnV0ZSB4bWk6aWQ9Il90RmhBLWlYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX1Byb3BlcnR5PSJfdEZOZkVpWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il90RmhBLXlYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX0NvbW1lbnQ9Il90Rk5mRXlYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RWNvcmU6RUF0dHJpYnV0ZSB4bWk6aWQ9Il90RmhBX0NYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX1Byb3BlcnR5PSJfdEZOZkZ5WDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il90RmhBX1NYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX0NvbW1lbnQ9Il90Rk5mR0NYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RWNvcmU6RUF0dHJpYnV0ZSB4bWk6aWQ9Il90RmhBX2lYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX1Byb3BlcnR5PSJfdEZOZkhDWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il90RmhBX3lYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX0NvbW1lbnQ9Il90Rk5mSFNYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RWNvcmU6RUF0dHJpYnV0ZSB4bWk6aWQ9Il90RmhCQUNYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX1Byb3BlcnR5PSJfdEZOZkl5WDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il90RmhCQVNYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX0NvbW1lbnQ9Il90Rk5mSkNYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RWNvcmU6RUF0dHJpYnV0ZSB4bWk6aWQ9Il90RmhCQWlYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX1Byb3BlcnR5PSJfdEZOZktDWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il90RmhCQXlYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX0NvbW1lbnQ9Il90Rk5mS1NYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RWNvcmU6RUF0dHJpYnV0ZSB4bWk6aWQ9Il90RmhCQkNYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX1Byb3BlcnR5PSJfdEZOZkx5WDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il90RmhCQlNYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX0NvbW1lbnQ9Il90Rk5mTUNYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RWNvcmU6RUF0dHJpYnV0ZSB4bWk6aWQ9Il90RmhCQmlYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX1Byb3BlcnR5PSJfdEZOZk5DWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il90RmhCQnlYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX0NvbW1lbnQ9Il90Rk5mTlNYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RWNvcmU6RUF0dHJpYnV0ZSB4bWk6aWQ9Il90RmhCQ0NYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX1Byb3BlcnR5PSJfdEZOZk9TWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il90RmhCQ1NYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX0NvbW1lbnQ9Il90Rk5mT2lYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RWNvcmU6RUF0dHJpYnV0ZSB4bWk6aWQ9Il90RmhCQ2lYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX1Byb3BlcnR5PSJfdEZOZlFDWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il90RmhCQ3lYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX0NvbW1lbnQ9Il90Rk5mUVNYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RWNvcmU6RUF0dHJpYnV0ZSB4bWk6aWQ9Il90RmhCRENYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX1Byb3BlcnR5PSJfdEZOZlJ5WDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il90RmhCRFNYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX0NvbW1lbnQ9Il90Rk5mU0NYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RWNvcmU6RUF0dHJpYnV0ZSB4bWk6aWQ9Il90RmhCRGlYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX1Byb3BlcnR5PSJfdEZOZlRDWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il90RmhCRHlYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX0NvbW1lbnQ9Il90Rk5mVFNYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RWNvcmU6RUF0dHJpYnV0ZSB4bWk6aWQ9Il90RmhCRUNYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX1Byb3BlcnR5PSJfdEZOZlVTWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il90RmhCRVNYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX0NvbW1lbnQ9Il90Rk5mVWlYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RWNvcmU6RUF0dHJpYnV0ZSB4bWk6aWQ9Il90RmhCRWlYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX1Byb3BlcnR5PSJfdEZOZlZpWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il90RmhCRXlYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX0NvbW1lbnQ9Il90Rk5mVnlYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RWNvcmU6RUF0dHJpYnV0ZSB4bWk6aWQ9Il90RmhCRkNYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX1Byb3BlcnR5PSJfdEZOZld5WDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il90RmhCRlNYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX0NvbW1lbnQ9Il90Rk5mWENYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RWNvcmU6RUF0dHJpYnV0ZSB4bWk6aWQ9Il90RmhCRmlYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX1Byb3BlcnR5PSJfdEZOZllDWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il90RmhCRnlYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX0NvbW1lbnQ9Il90Rk5mWVNYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3RGaEJHQ1g1RWQyS25KMnlqTlhoV1EiIGJhc2VfQ29tbWVudD0iX3RGTmZaU1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxFY29yZTpFQXR0cmlidXRlIHhtaTppZD0iX3RGaEJHU1g1RWQyS25KMnlqTlhoV1EiIGJhc2VfUHJvcGVydHk9Il90Rk5mWmlYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3RGaEJHaVg1RWQyS25KMnlqTlhoV1EiIGJhc2VfQ29tbWVudD0iX3RGTmZaeVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxFY29yZTpFQXR0cmlidXRlIHhtaTppZD0iX3RGaEJHeVg1RWQyS25KMnlqTlhoV1EiIGJhc2VfUHJvcGVydHk9Il90Rk5mYWlYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3RGaEJIQ1g1RWQyS25KMnlqTlhoV1EiIGJhc2VfQ29tbWVudD0iX3RGTmZheVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxFY29yZTpFQXR0cmlidXRlIHhtaTppZD0iX3RGaEJIU1g1RWQyS25KMnlqTlhoV1EiIGJhc2VfUHJvcGVydHk9Il90Rk5mYmlYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3RGaEJIaVg1RWQyS25KMnlqTlhoV1EiIGJhc2VfQ29tbWVudD0iX3RGTmZieVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxFY29yZTpFQXR0cmlidXRlIHhtaTppZD0iX3RGaEJIeVg1RWQyS25KMnlqTlhoV1EiIGJhc2VfUHJvcGVydHk9Il90Rk5mY3lYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3RGaEJJQ1g1RWQyS25KMnlqTlhoV1EiIGJhc2VfQ29tbWVudD0iX3RGTmZkQ1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxFY29yZTpFQXR0cmlidXRlIHhtaTppZD0iX3RGaEJJU1g1RWQyS25KMnlqTlhoV1EiIGJhc2VfUHJvcGVydHk9Il90Rk5mZUNYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3RHamlfQ1g1RWQyS25KMnlqTlhoV1EiIGJhc2VfQ29tbWVudD0iX3RHWnh3aVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfdEdqaV9TWDVFZDJLbkoyeWpOWGhXUSIgYmFzZV9Db21tZW50PSJfdEdaeHl5WDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il90R2ppX2lYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX0NvbW1lbnQ9Il90R1p4MFNYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3RHamlfeVg1RWQyS25KMnlqTlhoV1EiIGJhc2VfQ29tbWVudD0iX3RHWngyaVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfdEdqakFDWDVFZDJLbkoyeWpOWGhXUSIgYmFzZV9Db21tZW50PSJfdEdaeDRDWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il90R2pqQVNYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX0NvbW1lbnQ9Il90R1p4NHlYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3RHampBaVg1RWQyS25KMnlqTlhoV1EiIGJhc2VfQ29tbWVudD0iX3RHWng2U1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfdEdqakF5WDVFZDJLbkoyeWpOWGhXUSIgYmFzZV9Db21tZW50PSJfdEdaeDd5WDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il90R2pqQkNYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX0NvbW1lbnQ9Il90R2ppd1NYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3RHampCU1g1RWQyS25KMnlqTlhoV1EiIGJhc2VfQ29tbWVudD0iX3RHaml5aVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfdEdqakJpWDVFZDJLbkoyeWpOWGhXUSIgYmFzZV9Db21tZW50PSJfdEdqaXp5WDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il90R2pqQnlYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX0NvbW1lbnQ9Il90R2ppMUNYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3RHampDQ1g1RWQyS25KMnlqTlhoV1EiIGJhc2VfQ29tbWVudD0iX3RHamkxeVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfdEdqakNTWDVFZDJLbkoyeWpOWGhXUSIgYmFzZV9Db21tZW50PSJfdEdqaTNDWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il90R2pqQ2lYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX0NvbW1lbnQ9Il90R2ppNFNYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3RHampDeVg1RWQyS25KMnlqTlhoV1EiIGJhc2VfQ29tbWVudD0iX3RHamk1aVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfdEdqakRDWDVFZDJLbkoyeWpOWGhXUSIgYmFzZV9Db21tZW50PSJfdEdqaTZ5WDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il90R2pqRFNYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX0NvbW1lbnQ9Il90R2ppOENYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3RHampEaVg1RWQyS25KMnlqTlhoV1EiIGJhc2VfQ29tbWVudD0iX3RHamk5U1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfdEhjNnhDWDVFZDJLbkoyeWpOWGhXUSIgYmFzZV9Db21tZW50PSJfdEhjNm9pWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il90SGM2eFNYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX0NvbW1lbnQ9Il90SGM2cGlYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3RIYzZ4aVg1RWQyS25KMnlqTlhoV1EiIGJhc2VfQ29tbWVudD0iX3RIYzZyeVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfdEhjNnh5WDVFZDJLbkoyeWpOWGhXUSIgYmFzZV9Db21tZW50PSJfdEhjNnRTWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il90SGM2eUNYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX0NvbW1lbnQ9Il90SGM2dWlYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3RIYzZ5U1g1RWQyS25KMnlqTlhoV1EiIGJhc2VfQ29tbWVudD0iX3RIYzZ2eVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfdExLOUJDWDVFZDJLbkoyeWpOWGhXUSIgYmFzZV9Db21tZW50PSJfdEtsSElTWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il90TEs5QlNYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX0NvbW1lbnQ9Il90S2xIS0NYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3RMSzlCaVg1RWQyS25KMnlqTlhoV1EiIGJhc2VfQ29tbWVudD0iX3RLbEhMaVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfdExLOUJ5WDVFZDJLbkoyeWpOWGhXUSIgYmFzZV9Db21tZW50PSJfdEtsSE1TWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il90TEs5Q0NYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX0NvbW1lbnQ9Il90S2xITkNYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3RMSzlDU1g1RWQyS25KMnlqTlhoV1EiIGJhc2VfQ29tbWVudD0iX3RLbEhRQ1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfdExLOUNpWDVFZDJLbkoyeWpOWGhXUSIgYmFzZV9Db21tZW50PSJfdEtsSFFpWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il90TEs5Q3lYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX0NvbW1lbnQ9Il90S2xIUkNYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3RMSzlEQ1g1RWQyS25KMnlqTlhoV1EiIGJhc2VfQ29tbWVudD0iX3RLbEhSaVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfdExLOURTWDVFZDJLbkoyeWpOWGhXUSIgYmFzZV9Db21tZW50PSJfdEtsSFNDWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il90TEs5RGlYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX0NvbW1lbnQ9Il90S2xIU2lYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RWNvcmU6RUF0dHJpYnV0ZSB4bWk6aWQ9Il90TEs5RHlYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX1Byb3BlcnR5PSJfdEtsSFRDWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il90TEs5RUNYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX0NvbW1lbnQ9Il90S2xIVFNYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3RMSzlFU1g1RWQyS25KMnlqTlhoV1EiIGJhc2VfQ29tbWVudD0iX3RLbEhVeVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxFY29yZTpFQXR0cmlidXRlIHhtaTppZD0iX3RMSzlFaVg1RWQyS25KMnlqTlhoV1EiIGJhc2VfUHJvcGVydHk9Il90S2xIVlNYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3RMSzlFeVg1RWQyS25KMnlqTlhoV1EiIGJhc2VfQ29tbWVudD0iX3RLbEhWaVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxFY29yZTpFQXR0cmlidXRlIHhtaTppZD0iX3RMSzlGQ1g1RWQyS25KMnlqTlhoV1EiIGJhc2VfUHJvcGVydHk9Il90S2xIVnlYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3RMSzlGU1g1RWQyS25KMnlqTlhoV1EiIGJhc2VfQ29tbWVudD0iX3RLbEhXQ1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxFY29yZTpFQXR0cmlidXRlIHhtaTppZD0iX3RMSzlGaVg1RWQyS25KMnlqTlhoV1EiIGJhc2VfUHJvcGVydHk9Il90S2xIV1NYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3RMSzlGeVg1RWQyS25KMnlqTlhoV1EiIGJhc2VfQ29tbWVudD0iX3RLbEhXaVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfdExLOUdDWDVFZDJLbkoyeWpOWGhXUSIgYmFzZV9Db21tZW50PSJfdEtsSFhDWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPEVjb3JlOkVBdHRyaWJ1dGUgeG1pOmlkPSJfdExLOUdTWDVFZDJLbkoyeWpOWGhXUSIgYmFzZV9Qcm9wZXJ0eT0iX3RLbEhYeVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfdExLOUdpWDVFZDJLbkoyeWpOWGhXUSIgYmFzZV9Db21tZW50PSJfdEtsSFlDWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPEVjb3JlOkVBdHRyaWJ1dGUgeG1pOmlkPSJfdExLOUd5WDVFZDJLbkoyeWpOWGhXUSIgYmFzZV9Qcm9wZXJ0eT0iX3RLbEhaQ1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfdExLOUhDWDVFZDJLbkoyeWpOWGhXUSIgYmFzZV9Db21tZW50PSJfdEtsSFpTWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPEVjb3JlOkVBdHRyaWJ1dGUgeG1pOmlkPSJfdExLOUhTWDVFZDJLbkoyeWpOWGhXUSIgYmFzZV9Qcm9wZXJ0eT0iX3RLbEhaeVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfdExLOUhpWDVFZDJLbkoyeWpOWGhXUSIgYmFzZV9Db21tZW50PSJfdEtsSGFDWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPEVjb3JlOkVBdHRyaWJ1dGUgeG1pOmlkPSJfdExLOUh5WDVFZDJLbkoyeWpOWGhXUSIgYmFzZV9Qcm9wZXJ0eT0iX3RLbEhhaVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfdExLOUlDWDVFZDJLbkoyeWpOWGhXUSIgYmFzZV9Db21tZW50PSJfdEtsSGF5WDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il90TEs5SVNYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX0NvbW1lbnQ9Il90S2xIZWlYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RWNvcmU6RUF0dHJpYnV0ZSB4bWk6aWQ9Il90TEs5SWlYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX1Byb3BlcnR5PSJfdEtsSGZDWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il90TEs5SXlYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX0NvbW1lbnQ9Il90S2xIZnlYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3RMSzlKQ1g1RWQyS25KMnlqTlhoV1EiIGJhc2VfQ29tbWVudD0iX3RLbEhpeVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfdExLOUpTWDVFZDJLbkoyeWpOWGhXUSIgYmFzZV9Db21tZW50PSJfdEtsSHFpWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPEVjb3JlOkVBdHRyaWJ1dGUgeG1pOmlkPSJfdExLOUppWDVFZDJLbkoyeWpOWGhXUSIgYmFzZV9Qcm9wZXJ0eT0iX3RLbEhyQ1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfdExLOUp5WDVFZDJLbkoyeWpOWGhXUSIgYmFzZV9Db21tZW50PSJfdEtsSHJTWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPEVjb3JlOkVBdHRyaWJ1dGUgeG1pOmlkPSJfdExLOUtDWDVFZDJLbkoyeWpOWGhXUSIgYmFzZV9Qcm9wZXJ0eT0iX3RLbEhzU1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfdExLOUtTWDVFZDJLbkoyeWpOWGhXUSIgYmFzZV9Db21tZW50PSJfdEtsSHNpWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il90TEs5S2lYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX0NvbW1lbnQ9Il90S3VSRVNYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3RMSzlLeVg1RWQyS25KMnlqTlhoV1EiIGJhc2VfQ29tbWVudD0iX3RLdVJGeVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxFY29yZTpFQXR0cmlidXRlIHhtaTppZD0iX3RMSzlMQ1g1RWQyS25KMnlqTlhoV1EiIGJhc2VfUHJvcGVydHk9Il90S3VSR1NYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3RMSzlMU1g1RWQyS25KMnlqTlhoV1EiIGJhc2VfQ29tbWVudD0iX3RLdVJHaVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxFY29yZTpFQXR0cmlidXRlIHhtaTppZD0iX3RMSzlMaVg1RWQyS25KMnlqTlhoV1EiIGJhc2VfUHJvcGVydHk9Il90S3VSSENYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3RMSzlMeVg1RWQyS25KMnlqTlhoV1EiIGJhc2VfQ29tbWVudD0iX3RLdVJIU1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxFY29yZTpFQXR0cmlidXRlIHhtaTppZD0iX3RMSzlNQ1g1RWQyS25KMnlqTlhoV1EiIGJhc2VfUHJvcGVydHk9Il90S3VSSHlYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3RMSzlNU1g1RWQyS25KMnlqTlhoV1EiIGJhc2VfQ29tbWVudD0iX3RLdVJJQ1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfdExLOU1pWDVFZDJLbkoyeWpOWGhXUSIgYmFzZV9Db21tZW50PSJfdEt1UkppWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il90TEs5TXlYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX0NvbW1lbnQ9Il90S3VSS1NYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3RMSzlOQ1g1RWQyS25KMnlqTlhoV1EiIGJhc2VfQ29tbWVudD0iX3RLdVJMaVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfdExLOU5TWDVFZDJLbkoyeWpOWGhXUSIgYmFzZV9Db21tZW50PSJfdEt1Uk1DWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il90TEs5TmlYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX0NvbW1lbnQ9Il90S3VSTlNYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3RMSzlOeVg1RWQyS25KMnlqTlhoV1EiIGJhc2VfQ29tbWVudD0iX3RLdVJPaVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfdExLOU9DWDVFZDJLbkoyeWpOWGhXUSIgYmFzZV9Db21tZW50PSJfdEt1UlB5WDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il90TFV1QUNYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX0NvbW1lbnQ9Il90S3VSUkNYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3RMVXVBU1g1RWQyS25KMnlqTlhoV1EiIGJhc2VfQ29tbWVudD0iX3RLdVJTU1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfdExVdUFpWDVFZDJLbkoyeWpOWGhXUSIgYmFzZV9Db21tZW50PSJfdEt1UlRpWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il90TFV1QXlYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX0NvbW1lbnQ9Il90S3VSVXlYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3RMVXVCQ1g1RWQyS25KMnlqTlhoV1EiIGJhc2VfQ29tbWVudD0iX3RLdVJWU1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfdExVdUJTWDVFZDJLbkoyeWpOWGhXUSIgYmFzZV9Db21tZW50PSJfdEt1UldpWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il90TFV1QmlYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX0NvbW1lbnQ9Il90S3VSWHlYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3RMVXVCeVg1RWQyS25KMnlqTlhoV1EiIGJhc2VfQ29tbWVudD0iX3RLdVJaQ1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfdExVdUNDWDVFZDJLbkoyeWpOWGhXUSIgYmFzZV9Db21tZW50PSJfdExCekVTWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il90TFV1Q1NYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX0NvbW1lbnQ9Il90TEJ6RmlYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3RMVXVDaVg1RWQyS25KMnlqTlhoV1EiIGJhc2VfQ29tbWVudD0iX3RMQnpHeVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfdExVdUN5WDVFZDJLbkoyeWpOWGhXUSIgYmFzZV9Db21tZW50PSJfdExCekpDWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il90TFV1RENYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX0NvbW1lbnQ9Il90TEJ6S1NYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3RMVXVEU1g1RWQyS25KMnlqTlhoV1EiIGJhc2VfQ29tbWVudD0iX3RMQnpMaVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfdE9jNmtDWDVFZDJLbkoyeWpOWGhXUSIgYmFzZV9Db21tZW50PSJfdE9KX2tTWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il90T2M2a1NYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX0NvbW1lbnQ9Il90T0pfbWlYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3RPYzZraVg1RWQyS25KMnlqTlhoV1EiIGJhc2VfQ29tbWVudD0iX3RPSl9vQ1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfdE9jNmt5WDVFZDJLbkoyeWpOWGhXUSIgYmFzZV9Db21tZW50PSJfdE9KX3BpWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il90T2M2bENYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX0NvbW1lbnQ9Il90T0pfcUNYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3RPYzZsU1g1RWQyS25KMnlqTlhoV1EiIGJhc2VfQ29tbWVudD0iX3RPSl9yU1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfdE9jNmxpWDVFZDJLbkoyeWpOWGhXUSIgYmFzZV9Db21tZW50PSJfdE9KX3RTWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il90T2M2bHlYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX0NvbW1lbnQ9Il90T1RKZ1NYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3RPYzZtQ1g1RWQyS25KMnlqTlhoV1EiIGJhc2VfQ29tbWVudD0iX3RPVEpoaVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfdE9jNm1TWDVFZDJLbkoyeWpOWGhXUSIgYmFzZV9Db21tZW50PSJfdE9USml5WDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il90T2M2bWlYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX0NvbW1lbnQ9Il90T1RKamlYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3RPYzZteVg1RWQyS25KMnlqTlhoV1EiIGJhc2VfQ29tbWVudD0iX3RPVEpreVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfdE9jNm5DWDVFZDJLbkoyeWpOWGhXUSIgYmFzZV9Db21tZW50PSJfdE9USm1DWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il90T2M2blNYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX0NvbW1lbnQ9Il90T1RKblNYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3RPYzZuaVg1RWQyS25KMnlqTlhoV1EiIGJhc2VfQ29tbWVudD0iX3RPVEpueVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfdE9jNm55WDVFZDJLbkoyeWpOWGhXUSIgYmFzZV9Db21tZW50PSJfdE9USnFDWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il90T2M2b0NYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX0NvbW1lbnQ9Il90T1RKclNYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3RPYzZvU1g1RWQyS25KMnlqTlhoV1EiIGJhc2VfQ29tbWVudD0iX3RPVEpzaVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfdE9jNm9pWDVFZDJLbkoyeWpOWGhXUSIgYmFzZV9Db21tZW50PSJfdE9USnR5WDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il90T2M2b3lYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX0NvbW1lbnQ9Il90T1RKdkNYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3RPYzZwQ1g1RWQyS25KMnlqTlhoV1EiIGJhc2VfQ29tbWVudD0iX3RPVEp3U1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxFY29yZTpFQXR0cmlidXRlIHhtaTppZD0iX3RRMWdXQ1g1RWQyS25KMnlqTlhoV1EiIGJhc2VfUHJvcGVydHk9Il90UXJ2SWlYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3RRMWdXU1g1RWQyS25KMnlqTlhoV1EiIGJhc2VfQ29tbWVudD0iX3RRcnZJeVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxFY29yZTpFQXR0cmlidXRlIHhtaTppZD0iX3RRMWdXaVg1RWQyS25KMnlqTlhoV1EiIGJhc2VfUHJvcGVydHk9Il90UXJ2S1NYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3RRMWdXeVg1RWQyS25KMnlqTlhoV1EiIGJhc2VfQ29tbWVudD0iX3RRcnZLaVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxFY29yZTpFQXR0cmlidXRlIHhtaTppZD0iX3RRMWdYQ1g1RWQyS25KMnlqTlhoV1EiIGJhc2VfUHJvcGVydHk9Il90UXJ2TGlYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3RRMWdYU1g1RWQyS25KMnlqTlhoV1EiIGJhc2VfQ29tbWVudD0iX3RRcnZMeVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxFY29yZTpFQXR0cmlidXRlIHhtaTppZD0iX3RRMWdYaVg1RWQyS25KMnlqTlhoV1EiIGJhc2VfUHJvcGVydHk9Il90UXJ2TXlYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3RRMWdYeVg1RWQyS25KMnlqTlhoV1EiIGJhc2VfQ29tbWVudD0iX3RRcnZOQ1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxFY29yZTpFQXR0cmlidXRlIHhtaTppZD0iX3RRMWdZQ1g1RWQyS25KMnlqTlhoV1EiIGJhc2VfUHJvcGVydHk9Il90UTFnSWlYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3RRMWdZU1g1RWQyS25KMnlqTlhoV1EiIGJhc2VfQ29tbWVudD0iX3RRMWdJeVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxFY29yZTpFQXR0cmlidXRlIHhtaTppZD0iX3RRMWdZaVg1RWQyS25KMnlqTlhoV1EiIGJhc2VfUHJvcGVydHk9Il90UTFnSnlYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3RRMWdZeVg1RWQyS25KMnlqTlhoV1EiIGJhc2VfQ29tbWVudD0iX3RRMWdLQ1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxFY29yZTpFQXR0cmlidXRlIHhtaTppZD0iX3RRMWdaQ1g1RWQyS25KMnlqTlhoV1EiIGJhc2VfUHJvcGVydHk9Il90UTFnTENYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3RRMWdaU1g1RWQyS25KMnlqTlhoV1EiIGJhc2VfQ29tbWVudD0iX3RRMWdMU1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxFY29yZTpFQXR0cmlidXRlIHhtaTppZD0iX3RRMWdaaVg1RWQyS25KMnlqTlhoV1EiIGJhc2VfUHJvcGVydHk9Il90UTFnTVNYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3RRMWdaeVg1RWQyS25KMnlqTlhoV1EiIGJhc2VfQ29tbWVudD0iX3RRMWdNaVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxFY29yZTpFQXR0cmlidXRlIHhtaTppZD0iX3RRMWdhQ1g1RWQyS25KMnlqTlhoV1EiIGJhc2VfUHJvcGVydHk9Il90UTFnTmlYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3RRMWdhU1g1RWQyS25KMnlqTlhoV1EiIGJhc2VfQ29tbWVudD0iX3RRMWdOeVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxFY29yZTpFQXR0cmlidXRlIHhtaTppZD0iX3RRMWdhaVg1RWQyS25KMnlqTlhoV1EiIGJhc2VfUHJvcGVydHk9Il90UTFnT3lYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3RRMWdheVg1RWQyS25KMnlqTlhoV1EiIGJhc2VfQ29tbWVudD0iX3RRMWdQQ1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxFY29yZTpFQXR0cmlidXRlIHhtaTppZD0iX3RRMWdiQ1g1RWQyS25KMnlqTlhoV1EiIGJhc2VfUHJvcGVydHk9Il90UTFnUWlYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3RRMWdiU1g1RWQyS25KMnlqTlhoV1EiIGJhc2VfQ29tbWVudD0iX3RRMWdReVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxFY29yZTpFQXR0cmlidXRlIHhtaTppZD0iX3RRMWdiaVg1RWQyS25KMnlqTlhoV1EiIGJhc2VfUHJvcGVydHk9Il90UTFnUnlYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3RRMWdieVg1RWQyS25KMnlqTlhoV1EiIGJhc2VfQ29tbWVudD0iX3RRMWdTQ1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxFY29yZTpFQXR0cmlidXRlIHhtaTppZD0iX3RRMWdjQ1g1RWQyS25KMnlqTlhoV1EiIGJhc2VfUHJvcGVydHk9Il90UTFnVGlYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3RRMWdjU1g1RWQyS25KMnlqTlhoV1EiIGJhc2VfQ29tbWVudD0iX3RRMWdUeVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfdFExZ2NpWDVFZDJLbkoyeWpOWGhXUSIgYmFzZV9Db21tZW50PSJfdFExZ1ZDWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il90VFgyX0NYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX0NvbW1lbnQ9Il90VFgyd1NYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3RUWDJfU1g1RWQyS25KMnlqTlhoV1EiIGJhc2VfQ29tbWVudD0iX3RUWDJ6Q1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfdFRYMl9pWDVFZDJLbkoyeWpOWGhXUSIgYmFzZV9Db21tZW50PSJfdFRYMjBpWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il90VFgyX3lYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX0NvbW1lbnQ9Il90VFgyMnlYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3RUWDNBQ1g1RWQyS25KMnlqTlhoV1EiIGJhc2VfQ29tbWVudD0iX3RUWDI0U1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfdFRYM0FTWDVFZDJLbkoyeWpOWGhXUSIgYmFzZV9Db21tZW50PSJfdFRYMjVpWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il90VFgzQWlYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX0NvbW1lbnQ9Il90VFgyNnlYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3RUWDNBeVg1RWQyS25KMnlqTlhoV1EiIGJhc2VfQ29tbWVudD0iX3RUWDI4Q1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfdFRYM0JDWDVFZDJLbkoyeWpOWGhXUSIgYmFzZV9Db21tZW50PSJfdFRYMjlTWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il90VFgzQlNYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX0NvbW1lbnQ9Il90VFgyLWlYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3RXTklnQ1g1RWQyS25KMnlqTlhoV1EiIGJhc2VfQ29tbWVudD0iX3RXRFhVU1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxFY29yZTpFQXR0cmlidXRlIHhtaTppZD0iX3RXTklnU1g1RWQyS25KMnlqTlhoV1EiIGJhc2VfUHJvcGVydHk9Il90V0RYVkNYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3RXTklnaVg1RWQyS25KMnlqTlhoV1EiIGJhc2VfQ29tbWVudD0iX3RXRFhWU1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxFY29yZTpFQXR0cmlidXRlIHhtaTppZD0iX3RXTklneVg1RWQyS25KMnlqTlhoV1EiIGJhc2VfUHJvcGVydHk9Il90V0RYVnlYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3RXTkloQ1g1RWQyS25KMnlqTlhoV1EiIGJhc2VfQ29tbWVudD0iX3RXRFhXQ1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfdFdOSWhTWDVFZDJLbkoyeWpOWGhXUSIgYmFzZV9Db21tZW50PSJfdFdEWFlDWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il90V05JaGlYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX0NvbW1lbnQ9Il90V0RYWWlYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RWNvcmU6RUF0dHJpYnV0ZSB4bWk6aWQ9Il90V05JaHlYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX1Byb3BlcnR5PSJfdFdEWFl5WDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il90V05JaUNYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX0NvbW1lbnQ9Il90V0RYWkNYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RWNvcmU6RUF0dHJpYnV0ZSB4bWk6aWQ9Il90V05JaVNYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX1Byb3BlcnR5PSJfdFdEWFppWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il90V05JaWlYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX0NvbW1lbnQ9Il90V0RYWnlYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3RXTklpeVg1RWQyS25KMnlqTlhoV1EiIGJhc2VfQ29tbWVudD0iX3RXRFhiQ1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfdFdOSWpDWDVFZDJLbkoyeWpOWGhXUSIgYmFzZV9Db21tZW50PSJfdFdEWGJpWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il90V05JalNYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX0NvbW1lbnQ9Il90V0RYY0NYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3RXTklqaVg1RWQyS25KMnlqTlhoV1EiIGJhc2VfQ29tbWVudD0iX3RXRFhjaVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfdFdOSWp5WDVFZDJLbkoyeWpOWGhXUSIgYmFzZV9Db21tZW50PSJfdFdEWGRDWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il90V05Ja0NYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX0NvbW1lbnQ9Il90V05JVVNYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RWNvcmU6RUF0dHJpYnV0ZSB4bWk6aWQ9Il90V1dTUUNYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX1Byb3BlcnR5PSJfdFdOSVV5WDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il90V1dTUVNYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX0NvbW1lbnQ9Il90V05JVkNYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3RXV1NRaVg1RWQyS25KMnlqTlhoV1EiIGJhc2VfQ29tbWVudD0iX3RXTklXU1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfdFdXU1F5WDVFZDJLbkoyeWpOWGhXUSIgYmFzZV9Db21tZW50PSJfdFdOSVhpWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il90V1dTUkNYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX0NvbW1lbnQ9Il90V05JWWlYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3RXV1NSU1g1RWQyS25KMnlqTlhoV1EiIGJhc2VfQ29tbWVudD0iX3RXTklaeVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfdFdXU1JpWDVFZDJLbkoyeWpOWGhXUSIgYmFzZV9Db21tZW50PSJfdFdOSWJDWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il90V1dTUnlYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX0NvbW1lbnQ9Il90V05JY1NYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RWNvcmU6RUF0dHJpYnV0ZSB4bWk6aWQ9Il90WkJ5N0NYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX1Byb3BlcnR5PSJfdFl1MzRTWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPEVjb3JlOkVBdHRyaWJ1dGUgeG1pOmlkPSJfdFpCeTdTWDVFZDJLbkoyeWpOWGhXUSIgYmFzZV9Qcm9wZXJ0eT0iX3RZdTM0aVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxFY29yZTpFQXR0cmlidXRlIHhtaTppZD0iX3RaQnk3aVg1RWQyS25KMnlqTlhoV1EiIGJhc2VfUHJvcGVydHk9Il90WXUzNVNYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RWNvcmU6RUF0dHJpYnV0ZSB4bWk6aWQ9Il90WkJ5N3lYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX1Byb3BlcnR5PSJfdFl1Mzh5WDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPEVjb3JlOkVBdHRyaWJ1dGUgeG1pOmlkPSJfdFpCeThDWDVFZDJLbkoyeWpOWGhXUSIgYmFzZV9Qcm9wZXJ0eT0iX3RZdTM5Q1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxFY29yZTpFQXR0cmlidXRlIHhtaTppZD0iX3RaQnk4U1g1RWQyS25KMnlqTlhoV1EiIGJhc2VfUHJvcGVydHk9Il90WTRvNGlYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RWNvcmU6RUF0dHJpYnV0ZSB4bWk6aWQ9Il90WkJ5OGlYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX1Byb3BlcnR5PSJfdFk0bzd5WDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPEVjb3JlOkVBdHRyaWJ1dGUgeG1pOmlkPSJfdFpCeTh5WDVFZDJLbkoyeWpOWGhXUSIgYmFzZV9Qcm9wZXJ0eT0iX3RZNG85aVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxFY29yZTpFQXR0cmlidXRlIHhtaTppZD0iX3RaQnk5Q1g1RWQyS25KMnlqTlhoV1EiIGJhc2VfUHJvcGVydHk9Il90WTRvLWlYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RWNvcmU6RUF0dHJpYnV0ZSB4bWk6aWQ9Il90WkJ5OVNYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX1Byb3BlcnR5PSJfdFk0cEVDWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPEVjb3JlOkVBdHRyaWJ1dGUgeG1pOmlkPSJfdFpCeTlpWDVFZDJLbkoyeWpOWGhXUSIgYmFzZV9Qcm9wZXJ0eT0iX3RZNHBFU1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxFY29yZTpFQXR0cmlidXRlIHhtaTppZD0iX3RaQnk5eVg1RWQyS25KMnlqTlhoV1EiIGJhc2VfUHJvcGVydHk9Il90WTRwR2lYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RWNvcmU6RUF0dHJpYnV0ZSB4bWk6aWQ9Il90WkJ5LUNYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX1Byb3BlcnR5PSJfdFk0cEhTWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPEVjb3JlOkVBdHRyaWJ1dGUgeG1pOmlkPSJfdFpCeS1TWDVFZDJLbkoyeWpOWGhXUSIgYmFzZV9Qcm9wZXJ0eT0iX3RZNHBJQ1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxFY29yZTpFQXR0cmlidXRlIHhtaTppZD0iX3RaQnktaVg1RWQyS25KMnlqTlhoV1EiIGJhc2VfUHJvcGVydHk9Il90WTRwS1NYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RWNvcmU6RUF0dHJpYnV0ZSB4bWk6aWQ9Il90WkJ5LXlYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX1Byb3BlcnR5PSJfdFk0cE5TWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPEVjb3JlOkVBdHRyaWJ1dGUgeG1pOmlkPSJfdFpCeV9DWDVFZDJLbkoyeWpOWGhXUSIgYmFzZV9Qcm9wZXJ0eT0iX3RZNHBSeVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxFY29yZTpFQXR0cmlidXRlIHhtaTppZD0iX3RaQnlfU1g1RWQyS25KMnlqTlhoV1EiIGJhc2VfUHJvcGVydHk9Il90WTRwVFNYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RWNvcmU6RUF0dHJpYnV0ZSB4bWk6aWQ9Il90WkJ5X2lYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX1Byb3BlcnR5PSJfdFk0cFVDWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPEVjb3JlOkVBdHRyaWJ1dGUgeG1pOmlkPSJfdFpCeV95WDVFZDJLbkoyeWpOWGhXUSIgYmFzZV9Qcm9wZXJ0eT0iX3RZNHBXQ1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxFY29yZTpFQXR0cmlidXRlIHhtaTppZD0iX3RaQnpBQ1g1RWQyS25KMnlqTlhoV1EiIGJhc2VfUHJvcGVydHk9Il90WTRwWHlYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RWNvcmU6RUF0dHJpYnV0ZSB4bWk6aWQ9Il90WkJ6QVNYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX1Byb3BlcnR5PSJfdFk0cFlDWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPEVjb3JlOkVBdHRyaWJ1dGUgeG1pOmlkPSJfdFpCekFpWDVFZDJLbkoyeWpOWGhXUSIgYmFzZV9Qcm9wZXJ0eT0iX3RZNHBZU1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxFY29yZTpFQXR0cmlidXRlIHhtaTppZD0iX3RaQnpBeVg1RWQyS25KMnlqTlhoV1EiIGJhc2VfUHJvcGVydHk9Il90WTRwWWlYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RWNvcmU6RUF0dHJpYnV0ZSB4bWk6aWQ9Il90WkxqMENYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX1Byb3BlcnR5PSJfdFk0cFl5WDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPEVjb3JlOkVBdHRyaWJ1dGUgeG1pOmlkPSJfdFpMajBTWDVFZDJLbkoyeWpOWGhXUSIgYmFzZV9Qcm9wZXJ0eT0iX3RZNHBaQ1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfdGNBMWFDWDVFZDJLbkoyeWpOWGhXUSIgYmFzZV9Db21tZW50PSJfdGNBMVpDWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il90ZTJIRVNYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX0NvbW1lbnQ9Il90ZTJHOHlYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RWNvcmU6RUF0dHJpYnV0ZSB4bWk6aWQ9Il90ZTJIRWlYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX1Byb3BlcnR5PSJfdGUyRzlTWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il90ZTJIRXlYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX0NvbW1lbnQ9Il90ZTJHOWlYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RWNvcmU6RUF0dHJpYnV0ZSB4bWk6aWQ9Il90ZTJIRkNYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX1Byb3BlcnR5PSJfdGUyRy1pWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il90ZTJIRlNYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX0NvbW1lbnQ9Il90ZTJHLXlYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RWNvcmU6RUF0dHJpYnV0ZSB4bWk6aWQ9Il90ZTJIRmlYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX1Byb3BlcnR5PSJfdGUyR19pWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il90ZTJIRnlYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX0NvbW1lbnQ9Il90ZTJHX3lYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RWNvcmU6RUF0dHJpYnV0ZSB4bWk6aWQ9Il90ZTJIR0NYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX1Byb3BlcnR5PSJfdGUySEF5WDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il90ZTJIR1NYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX0NvbW1lbnQ9Il90ZTJIQkNYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3RlMkhHaVg1RWQyS25KMnlqTlhoV1EiIGJhc2VfQ29tbWVudD0iX3RlMkhEU1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfdGhyWXhTWDVFZDJLbkoyeWpOWGhXUSIgYmFzZV9Db21tZW50PSJfdGhobmdTWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il90aHJZeGlYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX0NvbW1lbnQ9Il90aGhubWlYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3Rocll4eVg1RWQyS25KMnlqTlhoV1EiIGJhc2VfQ29tbWVudD0iX3RoaG5ueVg1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfdGhyWXlDWDVFZDJLbkoyeWpOWGhXUSIgYmFzZV9Db21tZW50PSJfdGhyWWdTWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il90aHJZeVNYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX0NvbW1lbnQ9Il90aHJZaXlYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3Rocll5aVg1RWQyS25KMnlqTlhoV1EiIGJhc2VfQ29tbWVudD0iX3RocllrQ1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfdGhyWXl5WDVFZDJLbkoyeWpOWGhXUSIgYmFzZV9Db21tZW50PSJfdGhyWWxTWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il90aHJZekNYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX0NvbW1lbnQ9Il90aHJZbWlYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3Rocll6U1g1RWQyS25KMnlqTlhoV1EiIGJhc2VfQ29tbWVudD0iX3RoclluU1g1RWQyS25KMnlqTlhoV1EiLz4NCi0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfdGhyWXppWDVFZDJLbkoyeWpOWGhXUSIgYmFzZV9Db21tZW50PSJfdGhyWW9DWDVFZDJLbkoyeWpOWGhXUSIvPg0KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il90aHJZenlYNUVkMktuSjJ5ak5YaFdRIiBiYXNlX0NvbW1lbnQ9Il90aHJZcFNYNUVkMktuSjJ5ak5YaFdRIi8+DQotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3RoclkwQ1g1RWQyS25KMnlqTlhoV1EiIGJhc2VfQ29tbWVudD0iX3RocllzaVg1RWQyS25KMnlqTlhoV1EiLz4NCi08L3htaTpYTUk+DQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9tb2RlbC8xLjAuNS91bWEuZ2VubW9kZWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL21vZGVsLzEuMC41L3VtYS5nZW5tb2RlbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjg3YTBhOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL21vZGVsLzEuMC41L3VtYS5nZW5tb2RlbAorKysgL2Rldi9udWxsCkBAIC0xLDQ5NyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGdlbm1vZGVsOkdlbk1vZGVsIHhtaTp2ZXJzaW9uPSIyLjAiCi0gICAgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczplY29yZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSIKLSAgICB4bWxuczpnZW5tb2RlbD0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCIgbW9kZWxEaXJlY3Rvcnk9Ii9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYyIKLSAgICBtb2RlbFBsdWdpbklEPSJvcmcuZWNsaXBzZS51bWEiIHRlbXBsYXRlRGlyZWN0b3J5PSIvb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS90ZW1wbGF0ZXMiCi0gICAgcnVudGltZUphcj0idHJ1ZSIgZHluYW1pY1RlbXBsYXRlcz0idHJ1ZSIgbW9kZWxOYW1lPSJVbWEiIG1vZGVsUGx1Z2luQ2xhc3M9IiIKLSAgICBub25OTFNNYXJrZXJzPSJ0cnVlIiByb290RXh0ZW5kc0ludGVyZmFjZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS5JTW9kZWxPYmplY3QiCi0gICAgcm9vdEV4dGVuZHNDbGFzcz0ib3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS5pbXBsLk11bHRpUmVzb3VyY2VFT2JqZWN0IiByb290SW1wbGVtZW50c0ludGVyZmFjZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnNkby5JbnRlcm5hbEVEYXRhT2JqZWN0IgotICAgIHN1cHByZXNzRU1GVHlwZXM9InRydWUiIGZlYXR1cmVNYXBXcmFwcGVySW50ZXJmYWNlPSJjb21tb25qLnNkby5TZXF1ZW5jZSIgZmVhdHVyZU1hcFdyYXBwZXJJbnRlcm5hbEludGVyZmFjZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnNkby51dGlsLkVTZXF1ZW5jZSIKLSAgICBmZWF0dXJlTWFwV3JhcHBlckNsYXNzPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuc2RvLnV0aWwuQmFzaWNFU2VxdWVuY2UiIGNvZGVGb3JtYXR0aW5nPSJ0cnVlIgotICAgIGltcG9ydGVySUQ9ImNvbS5pYm0ueHRvb2xzLm1vZGVsZXIudWkud2l6YXJkcy5pbnRlcm5hbC5lY29yZS5pbXBvcnRlci5FbXhJbXBvcnRlcldpemFyZCIKLSAgICBjb250YWlubWVudFByb3hpZXM9InRydWUiIGNvbXBsaWFuY2VMZXZlbD0iNS4wIj4KLSAgPGdlbkFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbC9pbXBvcnRlci9jb20uaWJtLnh0b29scy5tb2RlbGVyLnVpLndpemFyZHMuaW50ZXJuYWwuZWNvcmUuaW1wb3J0ZXIuRW14SW1wb3J0ZXJXaXphcmQiPgotICAgIDxkZXRhaWxzIGtleT0iU1VQRVJfQ0xBU1NfT1JERVIiIHZhbHVlPSJQUk9DRVNTIi8+Ci0gICAgPGRldGFpbHMga2V5PSJPUEVSQVRJT05fQk9ESUVTIiB2YWx1ZT0iSUdOT1JFIi8+Ci0gICAgPGRldGFpbHMga2V5PSJERVJJVkVEX0ZFQVRVUkVTIiB2YWx1ZT0iUFJPQ0VTUyIvPgotICAgIDxkZXRhaWxzIGtleT0iRFVQTElDQVRFX09QRVJBVElPTl9JTkhFUklUQU5DRSIgdmFsdWU9IkRJU0NBUkQiLz4KLSAgICA8ZGV0YWlscyBrZXk9IlJFREVGSU5JTkdfT1BFUkFUSU9OUyIgdmFsdWU9IlJFUE9SVCIvPgotICAgIDxkZXRhaWxzIGtleT0iQU5OT1RBVElPTl9ERVRBSUxTIiB2YWx1ZT0iUFJPQ0VTUyIvPgotICAgIDxkZXRhaWxzIGtleT0iUkVERUZJTklOR19QUk9QRVJUSUVTIiB2YWx1ZT0iUkVQT1JUIi8+Ci0gICAgPGRldGFpbHMga2V5PSJJTlZBUklBTlRfQ09OU1RSQUlOVFMiIHZhbHVlPSJQUk9DRVNTIi8+Ci0gICAgPGRldGFpbHMga2V5PSJEVVBMSUNBVEVfRkVBVFVSRV9JTkhFUklUQU5DRSIgdmFsdWU9IkRJU0NBUkQiLz4KLSAgICA8ZGV0YWlscyBrZXk9IkRVUExJQ0FURV9PUEVSQVRJT05TIiB2YWx1ZT0iRElTQ0FSRCIvPgotICAgIDxkZXRhaWxzIGtleT0iQ09NTUVOVFMiIHZhbHVlPSJQUk9DRVNTIi8+Ci0gICAgPGRldGFpbHMga2V5PSJEVVBMSUNBVEVfRkVBVFVSRVMiIHZhbHVlPSJESVNDQVJEIi8+Ci0gICAgPGRldGFpbHMga2V5PSJTVUJTRVRUSU5HX1BST1BFUlRJRVMiIHZhbHVlPSJSRVBPUlQiLz4KLSAgICA8ZGV0YWlscyBrZXk9IkVDT1JFX1RBR0dFRF9WQUxVRVMiIHZhbHVlPSJQUk9DRVNTIi8+Ci0gICAgPGRldGFpbHMga2V5PSJVTklPTl9QUk9QRVJUSUVTIiB2YWx1ZT0iUkVQT1JUIi8+Ci0gIDwvZ2VuQW5ub3RhdGlvbnM+Ci0gIDxmb3JlaWduTW9kZWw+Li4vLi4vVU1BJTIwMS4wLjUlMjAoUlNNKS91bWEuZW14PC9mb3JlaWduTW9kZWw+Ci0gIDxzdGF0aWNQYWNrYWdlcz5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1NETzwvc3RhdGljUGFja2FnZXM+Ci0gIDxtb2RlbFBsdWdpblZhcmlhYmxlcz5FTUZfQ09NTU9OSl9TRE89b3JnLmVjbGlwc2UuZW1mLmNvbW1vbmouc2RvPC9tb2RlbFBsdWdpblZhcmlhYmxlcz4KLSAgPG1vZGVsUGx1Z2luVmFyaWFibGVzPkVNRl9FQ09SRV9TRE89b3JnLmVjbGlwc2UuZW1mLmVjb3JlLnNkbzwvbW9kZWxQbHVnaW5WYXJpYWJsZXM+Ci0gIDxnZW5QYWNrYWdlcyBwcmVmaXg9IlVtYSIgYmFzZVBhY2thZ2U9Im9yZy5lY2xpcHNlLmVwZiIgZGlzcG9zYWJsZVByb3ZpZGVyRmFjdG9yeT0idHJ1ZSIKLSAgICAgIGVjb3JlUGFja2FnZT0idW1hLmVjb3JlIy8iPgotICAgIDxnZW5FbnVtcyB0eXBlU2FmZUVudW1Db21wYXRpYmxlPSJmYWxzZSIgZWNvcmVFbnVtPSJ1bWEuZWNvcmUjLy9WYXJpYWJpbGl0eVR5cGUiPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJ1bWEuZWNvcmUjLy9WYXJpYWJpbGl0eVR5cGUvbmEiLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0idW1hLmVjb3JlIy8vVmFyaWFiaWxpdHlUeXBlL2NvbnRyaWJ1dGVzIi8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9InVtYS5lY29yZSMvL1ZhcmlhYmlsaXR5VHlwZS9leHRlbmRzIi8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9InVtYS5lY29yZSMvL1ZhcmlhYmlsaXR5VHlwZS9yZXBsYWNlcyIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJ1bWEuZWNvcmUjLy9WYXJpYWJpbGl0eVR5cGUvbG9jYWxDb250cmlidXRpb24iLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0idW1hLmVjb3JlIy8vVmFyaWFiaWxpdHlUeXBlL2xvY2FsUmVwbGFjZW1lbnQiLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0idW1hLmVjb3JlIy8vVmFyaWFiaWxpdHlUeXBlL2V4dGVuZHNSZXBsYWNlcyIvPgotICAgIDwvZ2VuRW51bXM+Ci0gICAgPGdlbkVudW1zIHR5cGVTYWZlRW51bUNvbXBhdGlibGU9ImZhbHNlIiBlY29yZUVudW09InVtYS5lY29yZSMvL1dvcmtPcmRlclR5cGUiPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJ1bWEuZWNvcmUjLy9Xb3JrT3JkZXJUeXBlL2ZpbmlzaFRvU3RhcnQiLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0idW1hLmVjb3JlIy8vV29ya09yZGVyVHlwZS9maW5pc2hUb0ZpbmlzaCIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJ1bWEuZWNvcmUjLy9Xb3JrT3JkZXJUeXBlL3N0YXJ0VG9TdGFydCIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJ1bWEuZWNvcmUjLy9Xb3JrT3JkZXJUeXBlL3N0YXJ0VG9GaW5pc2giLz4KLSAgICA8L2dlbkVudW1zPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0idW1hLmVjb3JlIy8vU3RyaW5nIi8+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJ1bWEuZWNvcmUjLy9Cb29sZWFuIi8+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJ1bWEuZWNvcmUjLy9EYXRlIi8+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJ1bWEuZWNvcmUjLy9VcmkiLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9InVtYS5lY29yZSMvL1NldCIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0idW1hLmVjb3JlIy8vU2VxdWVuY2UiLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9InVtYS5lY29yZSMvL0ludGVnZXIiLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9InVtYS5lY29yZSMvL0RvdWJsZSIvPgotICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vQ2xhc3NpZmllciI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vQ2xhc3NpZmllci9pc0Fic3RyYWN0Ii8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vVHlwZSIvPgotICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vUGFja2FnZWFibGVFbGVtZW50Ii8+Ci0gICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9OYW1lZEVsZW1lbnQiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL05hbWVkRWxlbWVudC9uYW1lIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vRWxlbWVudCIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1BhY2thZ2UiLz4KLSAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL05hbWVzcGFjZSIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0NvbnN0cmFpbnQiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0NvbnN0cmFpbnQvYm9keSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL01ldGhvZEVsZW1lbnQiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL01ldGhvZEVsZW1lbnQvZ3VpZCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL01ldGhvZEVsZW1lbnQvcHJlc2VudGF0aW9uTmFtZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL01ldGhvZEVsZW1lbnQvYnJpZWZEZXNjcmlwdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9NZXRob2RFbGVtZW50L293bmVkUnVsZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vTWV0aG9kRWxlbWVudC9tZXRob2RFbGVtZW50UHJvcGVydHkiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIHByb3BlcnR5U29ydENob2ljZXM9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9NZXRob2RFbGVtZW50L2tpbmQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9NZXRob2RFbGVtZW50L3N1cHByZXNzZWQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9NZXRob2RFbGVtZW50L29yZGVyaW5nR3VpZGUiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vTWV0aG9kRWxlbWVudFByb3BlcnR5Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9NZXRob2RFbGVtZW50UHJvcGVydHkvdmFsdWUiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vS2luZCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0tpbmQvYXBwbGljYWJsZU1ldGFDbGFzc0luZm8iLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Db250ZW50RWxlbWVudCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBwcm9wZXJ0eVNvcnRDaG9pY2VzPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vQ29udGVudEVsZW1lbnQvc3VwcG9ydGluZ01hdGVyaWFscyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgcHJvcGVydHlTb3J0Q2hvaWNlcz0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0NvbnRlbnRFbGVtZW50L2NvbmNlcHRzQW5kUGFwZXJzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBwcm9wZXJ0eVNvcnRDaG9pY2VzPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vQ29udGVudEVsZW1lbnQvY2hlY2tsaXN0cyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgcHJvcGVydHlTb3J0Q2hvaWNlcz0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0NvbnRlbnRFbGVtZW50L2d1aWRlbGluZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIHByb3BlcnR5U29ydENob2ljZXM9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Db250ZW50RWxlbWVudC9leGFtcGxlcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgcHJvcGVydHlTb3J0Q2hvaWNlcz0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0NvbnRlbnRFbGVtZW50L2Fzc2V0cyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgcHJvcGVydHlTb3J0Q2hvaWNlcz0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0NvbnRlbnRFbGVtZW50L3Rlcm1kZWZpbml0aW9uIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vRGVzY3JpYmFibGVFbGVtZW50Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vRGVzY3JpYmFibGVFbGVtZW50L3ByZXNlbnRhdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0Rlc2NyaWJhYmxlRWxlbWVudC9zaGFwZWljb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9EZXNjcmliYWJsZUVsZW1lbnQvbm9kZWljb24iLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vQ29udGVudERlc2NyaXB0aW9uIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9Db250ZW50RGVzY3JpcHRpb24vbWFpbkRlc2NyaXB0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0NvbnRlbnREZXNjcmlwdGlvbi9zZWN0aW9ucyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0NvbnRlbnREZXNjcmlwdGlvbi9leHRlcm5hbElkIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vQ29udGVudERlc2NyaXB0aW9uL2tleUNvbnNpZGVyYXRpb25zIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vQ29udGVudERlc2NyaXB0aW9uL2xvbmdQcmVzZW50YXRpb25OYW1lIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vTWV0aG9kVW5pdCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vTWV0aG9kVW5pdC9hdXRob3JzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vTWV0aG9kVW5pdC9jaGFuZ2VEYXRlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vTWV0aG9kVW5pdC9jaGFuZ2VEZXNjcmlwdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL01ldGhvZFVuaXQvdmVyc2lvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgcHJvcGVydHlTb3J0Q2hvaWNlcz0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL01ldGhvZFVuaXQvY29weXJpZ2h0U3RhdGVtZW50Ii8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1N1cHBvcnRpbmdNYXRlcmlhbCIvPgotICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vR3VpZGFuY2UiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9TZWN0aW9uIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9TZWN0aW9uL3NlY3Rpb25OYW1lIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vU2VjdGlvbi9zZWN0aW9uRGVzY3JpcHRpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vU2VjdGlvbi9zdWJTZWN0aW9ucyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgcHJvcGVydHlTb3J0Q2hvaWNlcz0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1NlY3Rpb24vcHJlZGVjZXNzb3IiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9WYXJpYWJpbGl0eUVsZW1lbnQiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1ZhcmlhYmlsaXR5RWxlbWVudC92YXJpYWJpbGl0eVR5cGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIHByb3BlcnR5U29ydENob2ljZXM9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9WYXJpYWJpbGl0eUVsZW1lbnQvdmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Db25jZXB0Ii8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vQ2hlY2tsaXN0Ii8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vR3VpZGVsaW5lIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vRXhhbXBsZSIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1JldXNhYmxlQXNzZXQiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9UZXJtRGVmaW5pdGlvbiIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0FwcGxpY2FibGVNZXRhQ2xhc3NJbmZvIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9BcHBsaWNhYmxlTWV0YUNsYXNzSW5mby9pc1ByaW1hcnlFeHRlbnNpb24iLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vQXJ0aWZhY3QiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9BcnRpZmFjdC9jb250YWluZXJBcnRpZmFjdCIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9BcnRpZmFjdC9jb250YWluZWRBcnRpZmFjdHMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vV29ya1Byb2R1Y3QiPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgcHJvcGVydHlTb3J0Q2hvaWNlcz0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1dvcmtQcm9kdWN0L3JlcG9ydHMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIHByb3BlcnR5U29ydENob2ljZXM9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Xb3JrUHJvZHVjdC90ZW1wbGF0ZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIHByb3BlcnR5U29ydENob2ljZXM9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Xb3JrUHJvZHVjdC90b29sTWVudG9ycyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgcHJvcGVydHlTb3J0Q2hvaWNlcz0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1dvcmtQcm9kdWN0L2VzdGltYXRpb25Db25zaWRlcmF0aW9ucyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9GdWxmaWxsYWJsZUVsZW1lbnQiPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgcHJvcGVydHlTb3J0Q2hvaWNlcz0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0Z1bGZpbGxhYmxlRWxlbWVudC9mdWxmaWxscyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9SZXBvcnQiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9UZW1wbGF0ZSIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1Rvb2xNZW50b3IiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9EZWxpdmVyYWJsZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBwcm9wZXJ0eVNvcnRDaG9pY2VzPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vRGVsaXZlcmFibGUvZGVsaXZlcmVkV29ya1Byb2R1Y3RzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL091dGNvbWUiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9TdGVwIi8+Ci0gICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Xb3JrRGVmaW5pdGlvbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1dvcmtEZWZpbml0aW9uL3ByZWNvbmRpdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Xb3JrRGVmaW5pdGlvbi9wb3N0Y29uZGl0aW9uIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1doaXRlcGFwZXIiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9UYXNrIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIHByb3BlcnR5U29ydENob2ljZXM9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9UYXNrL3BlcmZvcm1lZEJ5Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBwcm9wZXJ0eVNvcnRDaG9pY2VzPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vVGFzay9tYW5kYXRvcnlJbnB1dCIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgcHJvcGVydHlTb3J0Q2hvaWNlcz0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1Rhc2svb3V0cHV0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBwcm9wZXJ0eVNvcnRDaG9pY2VzPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vVGFzay9hZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgcHJvcGVydHlTb3J0Q2hvaWNlcz0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1Rhc2svb3B0aW9uYWxJbnB1dCIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgcHJvcGVydHlTb3J0Q2hvaWNlcz0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1Rhc2svc3RlcHMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIHByb3BlcnR5U29ydENob2ljZXM9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9UYXNrL3Rvb2xNZW50b3JzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBwcm9wZXJ0eVNvcnRDaG9pY2VzPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vVGFzay9lc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vUm9sZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBwcm9wZXJ0eVNvcnRDaG9pY2VzPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vUm9sZS9tb2RpZmllcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgcHJvcGVydHlTb3J0Q2hvaWNlcz0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1JvbGUvcmVzcG9uc2libGVGb3IiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vQXJ0aWZhY3REZXNjcmlwdGlvbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vQXJ0aWZhY3REZXNjcmlwdGlvbi9icmllZk91dGxpbmUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9BcnRpZmFjdERlc2NyaXB0aW9uL3JlcHJlc2VudGF0aW9uT3B0aW9ucyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0FydGlmYWN0RGVzY3JpcHRpb24vcmVwcmVzZW50YXRpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9BcnRpZmFjdERlc2NyaXB0aW9uL25vdGF0aW9uIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1dvcmtQcm9kdWN0RGVzY3JpcHRpb24iPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1dvcmtQcm9kdWN0RGVzY3JpcHRpb24vcHVycG9zZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1dvcmtQcm9kdWN0RGVzY3JpcHRpb24vaW1wYWN0T2ZOb3RIYXZpbmciLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9Xb3JrUHJvZHVjdERlc2NyaXB0aW9uL3JlYXNvbnNGb3JOb3ROZWVkaW5nIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0RlbGl2ZXJhYmxlRGVzY3JpcHRpb24iPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0RlbGl2ZXJhYmxlRGVzY3JpcHRpb24vZXh0ZXJuYWxEZXNjcmlwdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0RlbGl2ZXJhYmxlRGVzY3JpcHRpb24vcGFja2FnaW5nR3VpZGFuY2UiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vUm9sZURlc2NyaXB0aW9uIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9Sb2xlRGVzY3JpcHRpb24vc2tpbGxzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vUm9sZURlc2NyaXB0aW9uL2Fzc2lnbm1lbnRBcHByb2FjaGVzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vUm9sZURlc2NyaXB0aW9uL3N5bm9ueW1zIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1Rhc2tEZXNjcmlwdGlvbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vVGFza0Rlc2NyaXB0aW9uL3B1cnBvc2UiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9UYXNrRGVzY3JpcHRpb24vYWx0ZXJuYXRpdmVzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0d1aWRhbmNlRGVzY3JpcHRpb24iPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0d1aWRhbmNlRGVzY3JpcHRpb24vYXR0YWNobWVudHMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vUHJhY3RpY2VEZXNjcmlwdGlvbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vUHJhY3RpY2VEZXNjcmlwdGlvbi9hZGRpdGlvbmFsSW5mbyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1ByYWN0aWNlRGVzY3JpcHRpb24vcHJvYmxlbSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1ByYWN0aWNlRGVzY3JpcHRpb24vYmFja2dyb3VuZCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1ByYWN0aWNlRGVzY3JpcHRpb24vZ29hbHMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9QcmFjdGljZURlc2NyaXB0aW9uL2FwcGxpY2F0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vUHJhY3RpY2VEZXNjcmlwdGlvbi9sZXZlbHNPZkFkb3B0aW9uIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1JvbGVTZXQiPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgcHJvcGVydHlTb3J0Q2hvaWNlcz0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1JvbGVTZXQvcm9sZXMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Db250ZW50Q2F0ZWdvcnkiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Eb21haW4iPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgcHJvcGVydHlTb3J0Q2hvaWNlcz0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0RvbWFpbi93b3JrUHJvZHVjdHMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vRG9tYWluL3N1YmRvbWFpbnMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vV29ya1Byb2R1Y3RUeXBlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIHByb3BlcnR5U29ydENob2ljZXM9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Xb3JrUHJvZHVjdFR5cGUvd29ya1Byb2R1Y3RzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0Rpc2NpcGxpbmVHcm91cGluZyI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBwcm9wZXJ0eVNvcnRDaG9pY2VzPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vRGlzY2lwbGluZUdyb3VwaW5nL2Rpc2NpcGxpbmVzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0Rpc2NpcGxpbmUiPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgcHJvcGVydHlTb3J0Q2hvaWNlcz0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0Rpc2NpcGxpbmUvdGFza3MiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vRGlzY2lwbGluZS9zdWJkaXNjaXBsaW5lIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBwcm9wZXJ0eVNvcnRDaG9pY2VzPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vRGlzY2lwbGluZS9yZWZlcmVuY2VXb3JrZmxvd3MiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vQWN0aXZpdHkiPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgcHJvcGVydHlTb3J0Q2hvaWNlcz0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0FjdGl2aXR5L2JyZWFrZG93bkVsZW1lbnRzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBwcm9wZXJ0eVNvcnRDaG9pY2VzPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vQWN0aXZpdHkvcm9hZG1hcHMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Xb3JrQnJlYWtkb3duRWxlbWVudCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vV29ya0JyZWFrZG93bkVsZW1lbnQvaXNSZXBlYXRhYmxlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vV29ya0JyZWFrZG93bkVsZW1lbnQvaXNPbmdvaW5nIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vV29ya0JyZWFrZG93bkVsZW1lbnQvaXNFdmVudERyaXZlbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgcHJvcGVydHlTb3J0Q2hvaWNlcz0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1dvcmtCcmVha2Rvd25FbGVtZW50L2xpbmtUb1ByZWRlY2Vzc29yIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vQnJlYWtkb3duRWxlbWVudCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vQnJlYWtkb3duRWxlbWVudC9wcmVmaXgiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9CcmVha2Rvd25FbGVtZW50L2lzUGxhbm5lZCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0JyZWFrZG93bkVsZW1lbnQvaGFzTXVsdGlwbGVPY2N1cnJlbmNlcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0JyZWFrZG93bkVsZW1lbnQvaXNPcHRpb25hbCIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgcHJvcGVydHlTb3J0Q2hvaWNlcz0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0JyZWFrZG93bkVsZW1lbnQvcHJlc2VudGVkQWZ0ZXIiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIHByb3BlcnR5U29ydENob2ljZXM9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9CcmVha2Rvd25FbGVtZW50L3ByZXNlbnRlZEJlZm9yZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9CcmVha2Rvd25FbGVtZW50L3BsYW5uaW5nRGF0YSIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgcHJvcGVydHlTb3J0Q2hvaWNlcz0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0JyZWFrZG93bkVsZW1lbnQvc3VwZXJBY3Rpdml0aWVzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBwcm9wZXJ0eVNvcnRDaG9pY2VzPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vQnJlYWtkb3duRWxlbWVudC9jaGVja2xpc3RzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBwcm9wZXJ0eVNvcnRDaG9pY2VzPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vQnJlYWtkb3duRWxlbWVudC9jb25jZXB0cyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgcHJvcGVydHlTb3J0Q2hvaWNlcz0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0JyZWFrZG93bkVsZW1lbnQvZXhhbXBsZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIHByb3BlcnR5U29ydENob2ljZXM9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9CcmVha2Rvd25FbGVtZW50L2d1aWRlbGluZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIHByb3BlcnR5U29ydENob2ljZXM9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9CcmVha2Rvd25FbGVtZW50L3JldXNhYmxlQXNzZXRzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBwcm9wZXJ0eVNvcnRDaG9pY2VzPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vQnJlYWtkb3duRWxlbWVudC9zdXBwb3J0aW5nTWF0ZXJpYWxzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBwcm9wZXJ0eVNvcnRDaG9pY2VzPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vQnJlYWtkb3duRWxlbWVudC90ZW1wbGF0ZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIHByb3BlcnR5U29ydENob2ljZXM9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9CcmVha2Rvd25FbGVtZW50L3JlcG9ydHMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIHByb3BlcnR5U29ydENob2ljZXM9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9CcmVha2Rvd25FbGVtZW50L2VzdGltYXRpb25jb25zaWRlcmF0aW9ucyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgcHJvcGVydHlTb3J0Q2hvaWNlcz0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0JyZWFrZG93bkVsZW1lbnQvdG9vbG1lbnRvciIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1Byb2Nlc3NFbGVtZW50Ii8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vUGxhbm5pbmdEYXRhIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9QbGFubmluZ0RhdGEvc3RhcnREYXRlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vUGxhbm5pbmdEYXRhL2ZpbmlzaERhdGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9QbGFubmluZ0RhdGEvcmFuayIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Xb3JrT3JkZXIiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1dvcmtPcmRlci9saW5rVHlwZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgcHJvcGVydHlTb3J0Q2hvaWNlcz0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1dvcmtPcmRlci9wcmVkIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1JvYWRtYXAiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Ub29sIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIHByb3BlcnR5U29ydENob2ljZXM9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Ub29sL3Rvb2xNZW50b3JzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1JvbGVTZXRHcm91cGluZyI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBwcm9wZXJ0eVNvcnRDaG9pY2VzPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vUm9sZVNldEdyb3VwaW5nL3JvbGVTZXRzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0N1c3RvbUNhdGVnb3J5Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIHByb3BlcnR5U29ydENob2ljZXM9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9DdXN0b21DYXRlZ29yeS9jYXRlZ29yaXplZEVsZW1lbnRzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBwcm9wZXJ0eVNvcnRDaG9pY2VzPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vQ3VzdG9tQ2F0ZWdvcnkvc3ViQ2F0ZWdvcmllcyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL01ldGhvZFBhY2thZ2UiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL01ldGhvZFBhY2thZ2UvZ2xvYmFsIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBwcm9wZXJ0eVNvcnRDaG9pY2VzPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vTWV0aG9kUGFja2FnZS9yZXVzZWRQYWNrYWdlcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9NZXRob2RQYWNrYWdlL2NoaWxkUGFja2FnZXMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vQ29udGVudFBhY2thZ2UiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Db250ZW50UGFja2FnZS9jb250ZW50RWxlbWVudHMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vTWlsZXN0b25lIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIHByb3BlcnR5U29ydENob2ljZXM9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9NaWxlc3RvbmUvcmVxdWlyZWRSZXN1bHRzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1dvcmtQcm9kdWN0RGVzY3JpcHRvciI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vV29ya1Byb2R1Y3REZXNjcmlwdG9yL2FjdGl2aXR5RW50cnlTdGF0ZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1dvcmtQcm9kdWN0RGVzY3JpcHRvci9hY3Rpdml0eUV4aXRTdGF0ZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgcHJvcGVydHlTb3J0Q2hvaWNlcz0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1dvcmtQcm9kdWN0RGVzY3JpcHRvci9Xb3JrUHJvZHVjdCIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgcHJvcGVydHlTb3J0Q2hvaWNlcz0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1dvcmtQcm9kdWN0RGVzY3JpcHRvci9pbXBhY3RlZEJ5Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBwcm9wZXJ0eVNvcnRDaG9pY2VzPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vV29ya1Byb2R1Y3REZXNjcmlwdG9yL2ltcGFjdHMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIHByb3BlcnR5U29ydENob2ljZXM9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Xb3JrUHJvZHVjdERlc2NyaXB0b3IvZGVsaXZlcmFibGVQYXJ0cyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0Rlc2NyaXB0b3IiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0Rlc2NyaXB0b3IvaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0l0ZXJhdGlvbiIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1BoYXNlIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vVGVhbVByb2ZpbGUiPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgcHJvcGVydHlTb3J0Q2hvaWNlcz0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1RlYW1Qcm9maWxlL3RlYW1Sb2xlcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgcHJvcGVydHlTb3J0Q2hvaWNlcz0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1RlYW1Qcm9maWxlL3N1cGVyVGVhbSIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgcHJvcGVydHlTb3J0Q2hvaWNlcz0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1RlYW1Qcm9maWxlL3N1YlRlYW0iLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vUm9sZURlc2NyaXB0b3IiPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgcHJvcGVydHlTb3J0Q2hvaWNlcz0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1JvbGVEZXNjcmlwdG9yL1JvbGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIHByb3BlcnR5U29ydENob2ljZXM9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Sb2xlRGVzY3JpcHRvci9tb2RpZmllcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgcHJvcGVydHlTb3J0Q2hvaWNlcz0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1JvbGVEZXNjcmlwdG9yL3Jlc3BvbnNpYmxlRm9yIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1Rhc2tEZXNjcmlwdG9yIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIHByb3BlcnR5U29ydENob2ljZXM9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9UYXNrRGVzY3JpcHRvci9UYXNrIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBwcm9wZXJ0eVNvcnRDaG9pY2VzPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vVGFza0Rlc2NyaXB0b3IvYWRkaXRpb25hbGx5UGVyZm9ybWVkQnkiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIHByb3BlcnR5U29ydENob2ljZXM9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9UYXNrRGVzY3JpcHRvci9hc3Npc3RlZEJ5Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBwcm9wZXJ0eVNvcnRDaG9pY2VzPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vVGFza0Rlc2NyaXB0b3IvZXh0ZXJuYWxJbnB1dCIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgcHJvcGVydHlTb3J0Q2hvaWNlcz0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1Rhc2tEZXNjcmlwdG9yL21hbmRhdG9yeUlucHV0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBwcm9wZXJ0eVNvcnRDaG9pY2VzPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vVGFza0Rlc2NyaXB0b3Ivb3B0aW9uYWxJbnB1dCIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgcHJvcGVydHlTb3J0Q2hvaWNlcz0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1Rhc2tEZXNjcmlwdG9yL291dHB1dCIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgcHJvcGVydHlTb3J0Q2hvaWNlcz0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1Rhc2tEZXNjcmlwdG9yL3BlcmZvcm1lZFByaW1hcmlseUJ5Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBwcm9wZXJ0eVNvcnRDaG9pY2VzPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vVGFza0Rlc2NyaXB0b3Ivc2VsZWN0ZWRTdGVwcyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Db21wb3NpdGVSb2xlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIHByb3BlcnR5U29ydENob2ljZXM9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Db21wb3NpdGVSb2xlL2FnZ3JlZ2F0ZWRSb2xlcyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9EZWxpdmVyeVByb2Nlc3MiPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgcHJvcGVydHlTb3J0Q2hvaWNlcz0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0RlbGl2ZXJ5UHJvY2Vzcy9lZHVjYXRpb25NYXRlcmlhbHMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIHByb3BlcnR5U29ydENob2ljZXM9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9EZWxpdmVyeVByb2Nlc3MvY29tbXVuaWNhdGlvbnNNYXRlcmlhbHMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Qcm9jZXNzIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIHByb3BlcnR5U29ydENob2ljZXM9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Qcm9jZXNzL2luY2x1ZGVzUGF0dGVybnMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIHByb3BlcnR5U29ydENob2ljZXM9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Qcm9jZXNzL2RlZmF1bHRDb250ZXh0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBwcm9wZXJ0eVNvcnRDaG9pY2VzPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vUHJvY2Vzcy92YWxpZENvbnRleHQiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vQ2FwYWJpbGl0eVBhdHRlcm4iLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9NZXRob2RDb25maWd1cmF0aW9uIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIHByb3BlcnR5U29ydENob2ljZXM9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9NZXRob2RDb25maWd1cmF0aW9uL21ldGhvZFBsdWdpblNlbGVjdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgcHJvcGVydHlTb3J0Q2hvaWNlcz0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL01ldGhvZENvbmZpZ3VyYXRpb24vbWV0aG9kUGFja2FnZVNlbGVjdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgcHJvcGVydHlTb3J0Q2hvaWNlcz0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL01ldGhvZENvbmZpZ3VyYXRpb24vcHJvY2Vzc1ZpZXdzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBwcm9wZXJ0eVNvcnRDaG9pY2VzPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vTWV0aG9kQ29uZmlndXJhdGlvbi9kZWZhdWx0VmlldyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgcHJvcGVydHlTb3J0Q2hvaWNlcz0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL01ldGhvZENvbmZpZ3VyYXRpb24vYmFzZUNvbmZpZ3VyYXRpb25zIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBwcm9wZXJ0eVNvcnRDaG9pY2VzPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vTWV0aG9kQ29uZmlndXJhdGlvbi9zdWJ0cmFjdGVkQ2F0ZWdvcnkiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIHByb3BlcnR5U29ydENob2ljZXM9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9NZXRob2RDb25maWd1cmF0aW9uL2FkZGVkQ2F0ZWdvcnkiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vTWV0aG9kUGx1Z2luIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9NZXRob2RQbHVnaW4vdXNlckNoYW5nZWFibGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vTWV0aG9kUGx1Z2luL21ldGhvZFBhY2thZ2VzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBwcm9wZXJ0eVNvcnRDaG9pY2VzPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vTWV0aG9kUGx1Z2luL2Jhc2VzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1Byb2Nlc3NQbGFubmluZ1RlbXBsYXRlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIHByb3BlcnR5U29ydENob2ljZXM9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Qcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZS9iYXNlZE9uUHJvY2Vzc2VzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1ByYWN0aWNlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vUHJhY3RpY2Uvc3ViUHJhY3RpY2VzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBwcm9wZXJ0eVNvcnRDaG9pY2VzPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vUHJhY3RpY2UvY29udGVudFJlZmVyZW5jZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIHByb3BlcnR5U29ydENob2ljZXM9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9QcmFjdGljZS9hY3Rpdml0eVJlZmVyZW5jZXMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9CcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24vdXNhZ2VHdWlkYW5jZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9BY3Rpdml0eURlc2NyaXB0aW9uIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9BY3Rpdml0eURlc2NyaXB0aW9uL3B1cnBvc2UiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9BY3Rpdml0eURlc2NyaXB0aW9uL2FsdGVybmF0aXZlcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0FjdGl2aXR5RGVzY3JpcHRpb24vaG93dG9TdGFmZiIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24vc2NhbGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbi9wcm9qZWN0Q2hhcmFjdGVyaXN0aWNzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24vcmlza0xldmVsIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24vZXN0aW1hdGluZ1RlY2huaXF1ZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uL3Byb2plY3RNZW1iZXJFeHBlcnRpc2UiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbi90eXBlT2ZDb250cmFjdCIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Qcm9jZXNzRGVzY3JpcHRpb24iPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1Byb2Nlc3NEZXNjcmlwdGlvbi9zY29wZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1Byb2Nlc3NEZXNjcmlwdGlvbi91c2FnZU5vdGVzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0Rlc2NyaXB0b3JEZXNjcmlwdGlvbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vRGVzY3JpcHRvckRlc2NyaXB0aW9uL3JlZmluZWREZXNjcmlwdGlvbiIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Qcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvciI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBwcm9wZXJ0eVNvcnRDaG9pY2VzPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vUHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3IvX3Byb2Nlc3NDb21wb25lbnQiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vUHJvY2Vzc0NvbXBvbmVudCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBwcm9wZXJ0eVNvcnRDaG9pY2VzPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vUHJvY2Vzc0NvbXBvbmVudC9pbnRlcmZhY2VzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1Byb2Nlc3NDb21wb25lbnQvcHJvY2VzcyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Qcm9jZXNzUGFja2FnZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1Byb2Nlc3NQYWNrYWdlL3Byb2Nlc3NFbGVtZW50cyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Qcm9jZXNzUGFja2FnZS9kaWFncmFtcyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9EaWFncmFtIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIHByb3BlcnR5U29ydENob2ljZXM9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9EaWFncmFtL2RpYWdyYW1MaW5rIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0RpYWdyYW0vbmFtZXNwYWNlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vRGlhZ3JhbS96b29tIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBwcm9wZXJ0eVNvcnRDaG9pY2VzPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vRGlhZ3JhbS92aWV3cG9pbnQiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vR3JhcGhOb2RlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIHByb3BlcnR5U29ydENob2ljZXM9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9HcmFwaE5vZGUvc2l6ZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0dyYXBoRWxlbWVudCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0dyYXBoRWxlbWVudC9jb250YWluZWQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIHByb3BlcnR5U29ydENob2ljZXM9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9HcmFwaEVsZW1lbnQvcG9zaXRpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vR3JhcGhFbGVtZW50L2xpbmsiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vR3JhcGhFbGVtZW50L2FuY2hvcmFnZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9HcmFwaEVsZW1lbnQvc2VtYW50aWNNb2RlbCIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0RpYWdyYW1FbGVtZW50Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9EaWFncmFtRWxlbWVudC9pc1Zpc2libGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vRGlhZ3JhbUVsZW1lbnQvY29udGFpbmVyIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBwcm9wZXJ0eVNvcnRDaG9pY2VzPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vRGlhZ3JhbUVsZW1lbnQvcmVmZXJlbmNlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0RpYWdyYW1FbGVtZW50L3Byb3BlcnR5Ii8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1JlZmVyZW5jZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vUmVmZXJlbmNlL2lzSW5kaXZpZHVhbFJlcHJlc2VudGF0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBwcm9wZXJ0eVNvcnRDaG9pY2VzPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vUmVmZXJlbmNlL3JlZmVyZW5jZWQiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vUHJvcGVydHkiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1Byb3BlcnR5L2tleSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1Byb3BlcnR5L3ZhbHVlIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1BvaW50Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9Qb2ludC94Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vUG9pbnQveSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9EaWFncmFtTGluayI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vRGlhZ3JhbUxpbmsvem9vbSIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgcHJvcGVydHlTb3J0Q2hvaWNlcz0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0RpYWdyYW1MaW5rL3ZpZXdwb3J0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBwcm9wZXJ0eVNvcnRDaG9pY2VzPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vRGlhZ3JhbUxpbmsvZGlhZ3JhbSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9EaWFncmFtTGluay9ncmFwaEVsZW1lbnQiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vR3JhcGhDb25uZWN0b3IiPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgcHJvcGVydHlTb3J0Q2hvaWNlcz0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0dyYXBoQ29ubmVjdG9yL2dyYXBoRWRnZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9HcmFwaENvbm5lY3Rvci9ncmFwaEVsZW1lbnQiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vR3JhcGhFZGdlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vR3JhcGhFZGdlL3dheXBvaW50cyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgcHJvcGVydHlTb3J0Q2hvaWNlcz0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0dyYXBoRWRnZS9hbmNob3IiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9TZW1hbnRpY01vZGVsQnJpZGdlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9TZW1hbnRpY01vZGVsQnJpZGdlL3ByZXNlbnRhdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9TZW1hbnRpY01vZGVsQnJpZGdlL2RpYWdyYW0iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vU2VtYW50aWNNb2RlbEJyaWRnZS9ncmFwaEVsZW1lbnQiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vRGltZW5zaW9uIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9EaW1lbnNpb24vd2lkdGgiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9EaW1lbnNpb24vaGVpZ2h0Ii8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1Byb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlL2ludGVyZmFjZVNwZWNpZmljYXRpb25zIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1Byb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UvaW50ZXJmYWNlSU8iLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnQiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1NpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50L3R5cGVJbmZvIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1VNQVNlbWFudGljTW9kZWxCcmlkZ2UiPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgcHJvcGVydHlTb3J0Q2hvaWNlcz0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1VNQVNlbWFudGljTW9kZWxCcmlkZ2UvZWxlbWVudCIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Db3JlU2VtYW50aWNNb2RlbEJyaWRnZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBwcm9wZXJ0eVNvcnRDaG9pY2VzPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vQ29yZVNlbWFudGljTW9kZWxCcmlkZ2UvZWxlbWVudCIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0xlYWZFbGVtZW50Ii8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vVGV4dEVsZW1lbnQiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1RleHRFbGVtZW50L3RleHQiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vSW1hZ2UiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0ltYWdlL3VyaSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0ltYWdlL21pbWVUeXBlIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vR3JhcGhpY1ByaW1pdGl2ZSIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1BvbHlsaW5lIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9Qb2x5bGluZS9jbG9zZWQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vUG9seWxpbmUvd2F5cG9pbnRzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0VsbGlwc2UiPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgcHJvcGVydHlTb3J0Q2hvaWNlcz0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0VsbGlwc2UvY2VudGVyIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vRWxsaXBzZS9yYWRpdXNYIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vRWxsaXBzZS9yYWRpdXNZIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vRWxsaXBzZS9yb3RhdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0VsbGlwc2Uvc3RhcnRBbmdsZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0VsbGlwc2UvZW5kQW5nbGUiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vUHJvY2Vzc0ZhbWlseSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBwcm9wZXJ0eVNvcnRDaG9pY2VzPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vUHJvY2Vzc0ZhbWlseS9kZWxpdmVyeVByb2Nlc3NlcyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9NZXRob2RMaWJyYXJ5Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vTWV0aG9kTGlicmFyeS9tZXRob2RQbHVnaW5zIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL01ldGhvZExpYnJhcnkvcHJlZGVmaW5lZENvbmZpZ3VyYXRpb25zIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICA8L2dlblBhY2thZ2VzPgotPC9nZW5tb2RlbDpHZW5Nb2RlbD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvcGx1Z2luLnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOTE2NDg1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUgotCi0jIFBsdWctaW4KLXBsdWdpbk5hbWU9RVBGIFVNQQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCi0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9wbHVnaW4ueG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MjlkYWNjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci0KLTxwbHVnaW4+Ci0KLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5nZW5lcmF0ZWRfcGFja2FnZSI+Ci0gICAgICA8cGFja2FnZSAKLSAgICAgICAgICAgIHVyaSA9ICJodHRwOi8vd3d3LmlibS5jb20vdW1hLzEuMC4yL3VtYS5lY29yZSIgCi0gICAgICAgICAgICBjbGFzcyA9ICJvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UiIC8+Ci0gICAgICA8cGFja2FnZQotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSIKLSAgICAgICAgICAgIHVyaT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC4zL3VtYS5lY29yZSIvPgotICAgICAgPHBhY2thZ2UKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UiCi0gICAgICAgICAgICB1cmk9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiLz4gICAgICAgICAgICAKLSAgPC9leHRlbnNpb24+Ci0KLTwvcGx1Z2luPgotCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0FjdGl2aXR5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0FjdGl2aXR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2ODYyM2IuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9BY3Rpdml0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5BY3Rpdml0eTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEFuIEFjdGl2aXR5IGlzIGEgV29yayBCcmVha2Rvd24gRWxlbWVudCBhbmQgV29yayBEZWZpbml0aW9uIHdoaWNoIHN1cHBvcnRzIHRoZSBuZXN0aW5nIGFuZCBsb2dpY2FsIGdyb3VwaW5nIG9mIHJlbGF0ZWQgQnJlYWtkb3duIEVsZW1lbnRzIGZvcm1pbmcgYnJlYWtkb3duIHN0cnVjdHVyZXMuICBBbHRob3VnaCBBY3Rpdml0eSBpcyBhIGNvbmNyZXRlIG1ldGEtY2xhc3MsIG90aGVyIGNsYXNzZXMgd2hpY2ggcmVwcmVzZW50IGJyZWFrZG93biBzdHJ1Y3R1cmVzIGRlcml2ZSBmcm9tIGl0OyBzdWNoIGFzIFBoYXNlLCBJdGVyYXRpb24sIERlbGl2ZXJ5IFByb2Nlc3MsIG9yIENhcGFiaWxpdHkgUGF0dGVybi4KLSAqIEFjdGl2aXR5IHJlcHJlc2VudHMgYSBncm91cGluZyBlbGVtZW50IGZvciBvdGhlciBCcmVha2Rvd24gRWxlbWVudHMgc3VjaCBhcyBBY3Rpdml0aWVzLCBEZXNjcmlwdG9ycywgTWlsZXN0b25lcywgZXRjLiAgSXQgaXMgbm90IHBlci1zZSBhICdoaWdoLWxldmVsJyBncm91cGluZyBvZiBvbmx5IHdvcmsgYXMgaW4gb3RoZXIgbWV0YS1tb2RlbHMsIGJ1dCBncm91cHMgYW55IGtpbmQgb2YgQnJlYWtkb3duIEVsZW1lbnRzLiAgRm9yIGV4YW1wbGUsIG9uZSBjYW4gZGVmaW5lIHZhbGlkIEFjdGl2aXRpZXMgdGhhdCBncm91cCBvbmx5IFdvcmsgUHJvZHVjdHMgRGVzY3JpcHRvcnMgd2l0aG91dCBhbnkgbWF0Y2hpbmcgVGFzayBEZXNjcmlwdG9ycy4gIEFjdGl2aXRpZXMgYWxzbyBpbmhlcml0IGFsbCBwcm9wZXJ0aWVzIGZyb20gV29yayBCcmVha2Rvd24gRWxlbWVudCBhbmQgaW5kaXJlY3RseSBmcm9tIFByb2Nlc3MgRWxlbWVudDsgaS5lLiBBY3Rpdml0eSBpcyByZWFkeSB0byBoYXZlIGEgZnVsbCBjb250ZW50IGRlc2NyaXB0aW9uIGF0dGFjaGVkIHRvIGl0LgotICogCi0gKiBUaGlzIGRlZmluaXRpb24gb2YgQWN0aXZpdHkgZXh0ZW5kcyBBY3Rpdml0eSBpbnRyb2R1Y2VkIGluIHRoZSBwYWNrYWdlIEJyZWFrZG93biB3aXRoIG5ldyBjYXBhYmlsaXRpZXMgYW5kIGlzIHRoZSBiYXNpcyBmb3IgdGhlIGRlZmluaXRpb24gb2YgdGhlIGNsYXNzIFByb2Nlc3MuCi0gKiBFeHRlbmRzIEFjdGl2aXR5IHdpdGggYW4gYXNzb2NpYXRpb24gdG8gUm9hZG1hcC4gIFRoaXMgZGVmaW5pdGlvbiBvZiBBY3Rpdml0eSBhbHNvIHBhcnRpY2lwYXRlcyBpbiB0aGUgZXh0ZW5zaW9uIG9mIHRoZSBEaXNjaXBsaW5lIGNhdGVnb3J5LgotICogCi0gKiBBY3Rpdml0eSBpbiB0aGUgcGFja2FnZSBNZXRob2QgUGx1Z2luIGluaGVyaXRzIGZyb20gVmFyaWFiaWxpdHkgRWxlbWVudCB0byBleHRlbmQgQWN0aXZpdHkgd2l0aCBuZXcgY2FwYWJpbGl0aWVzIGZvciB2YXJpYWJpbGl0eS4KLSAqIEFjdGl2aXR5IGluaGVyaXRzIHRoZSBzZW1hbnRpY3Mgb2YgVmFyaWFiaWxpdHkgRWxlbWVudCB3aGljaCBwcm92aWRlcyBrZXkgbWVjaGFuaXNtIHRvIGVuYWJsZSBkeW5hbWljIGJpbmRpbmcgb2YgQ2FwYWJpbGl0eSBQYXR0ZXJucyBpbiBQcm9jZXNzZXMgYXMgd2VsbCBhcyBQcm9jZXNzIENvbnRyaWJ1dGlvbnMuICBWYXJpYWJpbGl0eSBpcyB1c2VkIGluIHRoZSBmb2xsb3dpbmcgd2F5IGZvciBBY3Rpdml0aWVzOgotICogLSBFeHRlbmQ6IFRvIGFwcGx5IGEgQ2FwYWJpbGl0eSBQYXR0ZXJuIHRvIGEgcHJvY2VzcyBvbmUgd291bGQgY3JlYXRlIGFuIEFjdGl2aXR5IHdoaWNoIGV4dGVuZHMgdGhlIHBhdHRlcm4ncyB0b3AtbGV2ZWwgYWN0aXZpdHkuICBUaHJvdWdoIGV4dGVuc2lvbiB0aGUgZXh0ZW5kaW5nIEFjdGl2aXR5IGluaGVyaXRzIHRoZSBwYXR0ZXJucyBCcmVha2Rvd24gRWxlbWVudHMuCi0gKiAtIFJlcGxhY2U6IFRvIHJlcGxhY2UgYW4gQWN0aXZpdHkgb2YgYW4gYXBwbGllZCBDYXBhYmlsaXR5IFBhdHRlcm4gb3IgYW4gZXhpc3RpbmcgcHJvY2VzcyBmb3Igd2hpY2ggb25lIGRldmVsb3BzIGEgUHJvY2VzcyBDb250cmlidXRpb24gKG9yIGEgY29tYmluYXRpb24gb2YgYm90aCkgb25lIHdvdWxkIGNyZWF0ZSBhbiBBY3Rpdml0eSBhbmQgc3BlY2lmeSB0aGUgcmVwbGFjZSB2YXJpYWJpbGl0eSBzcGVjaWFsaXphdGlvbiBiZXR3ZWVuIHRoZW0uCi0gKiAtIENvbnRyaWJ1dGU6IFRvIGNvbnRyaWJ1dGUgbmV3IEJyZWFrZG93biBFbGVtZW50cyB0byBhbiBleGlzdGluZyBBY3Rpdml0eSBvbmUgd291bGQgZGVmaW5lIGFuIEFjdGl2aXR5IHdpdGggQnJlYWtkb3duIEVsZW1lbnRzIHRoYXQgcmVsYXRlcyB2aWEgdGhlIENvbnRyaWJ1dGVzIFZhcmlhYmlsaXR5IFNwZWNpYWxpemF0aW9uIHRvIHRoaXMgZXhpc3RpbmcgQWN0aXZpdHkuICBUaGUgY29udHJpYnV0aW5nIEFjdGl2aXR5J3MgQnJlYWtkb3duIEVsZW1lbnRzIHdpbGwgYmUgYWRkZWQgdG8gdGhlIGNvbnRyaWJ1dGVkIEFjdGl2aXR5LgotICogCi0gKiAKLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5I2dldEJyZWFrZG93bkVsZW1lbnRzIDxlbT5CcmVha2Rvd24gRWxlbWVudHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHkjZ2V0Um9hZG1hcHMgPGVtPlJvYWRtYXBzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0QWN0aXZpdHkoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQWN0aXZpdHkgZXh0ZW5kcyBXb3JrQnJlYWtkb3duRWxlbWVudCwgRnVsZmlsbGFibGVFbGVtZW50LAotCQlWYXJpYWJpbGl0eUVsZW1lbnQsIFdvcmtEZWZpbml0aW9uIHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5CcmVha2Rvd24gRWxlbWVudHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnR9LgotCSAqIEl0IGlzIGJpZGlyZWN0aW9uYWwgYW5kIGl0cyBvcHBvc2l0ZSBpcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudCNnZXRTdXBlckFjdGl2aXRpZXMgPGVtPlN1cGVyIEFjdGl2aXRpZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+QnJlYWtkb3duIEVsZW1lbnRzPC9lbT4nIHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QnJlYWtkb3duIEVsZW1lbnRzPC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldEFjdGl2aXR5X0JyZWFrZG93bkVsZW1lbnRzKCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudCNnZXRTdXBlckFjdGl2aXRpZXMKLQkgKiBAbW9kZWwgb3Bwb3NpdGU9InN1cGVyQWN0aXZpdGllcyIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3Q8QnJlYWtkb3duRWxlbWVudD4gZ2V0QnJlYWtkb3duRWxlbWVudHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJvYWRtYXBzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2FkbWFwfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlJvYWRtYXBzPC9lbT4nIHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Um9hZG1hcHM8L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0QWN0aXZpdHlfUm9hZG1hcHMoKQotCSAqIEBtb2RlbCBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdDxSb2FkbWFwPiBnZXRSb2FkbWFwcygpOwotCi19IC8vIEFjdGl2aXR5CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0FjdGl2aXR5RGVzY3JpcHRpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvQWN0aXZpdHlEZXNjcmlwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYjExMzhkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvQWN0aXZpdHlEZXNjcmlwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWE7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkFjdGl2aXR5IERlc2NyaXB0aW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHlEZXNjcmlwdGlvbiNnZXRQdXJwb3NlIDxlbT5QdXJwb3NlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5RGVzY3JpcHRpb24jZ2V0QWx0ZXJuYXRpdmVzIDxlbT5BbHRlcm5hdGl2ZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHlEZXNjcmlwdGlvbiNnZXRIb3d0b1N0YWZmIDxlbT5Ib3d0byBTdGFmZjwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldEFjdGl2aXR5RGVzY3JpcHRpb24oKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQWN0aXZpdHlEZXNjcmlwdGlvbiBleHRlbmRzIEJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbiB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UHVycG9zZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiIiPC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFN1bW1hcml6ZXMgdGhlIG1haW4gcmVhc29uIGZvciBwZXJmb3JtaW5nIHRoaXMgQWN0aXZpdHksIGRlc2NyaWJlcyB3aGF0IHRoZSBhY3Rpdml0eSBhcyBhIHdob2xlIGlzIGludGVuZGVkIHRvIGFjaGlldmUuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlB1cnBvc2U8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFB1cnBvc2UoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldEFjdGl2aXR5RGVzY3JpcHRpb25fUHVycG9zZSgpCi0JICogQG1vZGVsIGRlZmF1bHQ9IiIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuU3RyaW5nIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFB1cnBvc2UoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHlEZXNjcmlwdGlvbiNnZXRQdXJwb3NlIDxlbT5QdXJwb3NlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5QdXJwb3NlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRQdXJwb3NlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRQdXJwb3NlKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BbHRlcm5hdGl2ZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iIjwvY29kZT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBDb21wcmlzZXMgb2Ygc3VtbWFyaWVzIGRlc2NyaWJpbmcgaW1wb3J0YW50IGV4Y2VwdGlvbmFsIGFuZCBub24tc3RhbmRhcmQgd2F5cyBvZiBkb2luZyB0aGUgd29yayBvZiB0aGlzIEFjdGl2aXR5IG5vdCBjb3ZlcmVkIGJ5IHRoZSBBY3Rpdml0eSdzIFRhc2tzLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BbHRlcm5hdGl2ZXM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEFsdGVybmF0aXZlcyhTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0QWN0aXZpdHlEZXNjcmlwdGlvbl9BbHRlcm5hdGl2ZXMoKQotCSAqIEBtb2RlbCBkZWZhdWx0PSIiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLlN0cmluZyIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRBbHRlcm5hdGl2ZXMoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHlEZXNjcmlwdGlvbiNnZXRBbHRlcm5hdGl2ZXMgPGVtPkFsdGVybmF0aXZlczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QWx0ZXJuYXRpdmVzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRBbHRlcm5hdGl2ZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEFsdGVybmF0aXZlcyhTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SG93dG8gU3RhZmY8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iIjwvY29kZT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBQcm92aWRlcyBiYWNrZ3JvdW5kIG9uIHdobyBzaG91bGQgYmUgaW52b2x2ZWQgaW4gdGhpcyBhY3Rpdml0eSB3aGF0IGFyZSB0aGUgcmVxdWlyZWQgc2tpbGxzLCBleHBlcmllbmNlLCAgYW5kIHBlcmhhcHMgYXR0aXR1ZGVzLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Ib3d0byBTdGFmZjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0SG93dG9TdGFmZihTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0QWN0aXZpdHlEZXNjcmlwdGlvbl9Ib3d0b1N0YWZmKCkKLQkgKiBAbW9kZWwgZGVmYXVsdD0iIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5TdHJpbmciIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0SG93dG9TdGFmZigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eURlc2NyaXB0aW9uI2dldEhvd3RvU3RhZmYgPGVtPkhvd3RvIFN0YWZmPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Ib3d0byBTdGFmZjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0SG93dG9TdGFmZigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0SG93dG9TdGFmZihTdHJpbmcgdmFsdWUpOwotCi19IC8vIEFjdGl2aXR5RGVzY3JpcHRpb24KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvQXBwbGljYWJsZU1ldGFDbGFzc0luZm8uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvQXBwbGljYWJsZU1ldGFDbGFzc0luZm8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWNmZmIwYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0FwcGxpY2FibGVNZXRhQ2xhc3NJbmZvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5BcHBsaWNhYmxlIE1ldGEgQ2xhc3MgSW5mbzwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvI2dldElzUHJpbWFyeUV4dGVuc2lvbiA8ZW0+SXMgUHJpbWFyeSBFeHRlbnNpb248L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRBcHBsaWNhYmxlTWV0YUNsYXNzSW5mbygpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBBcHBsaWNhYmxlTWV0YUNsYXNzSW5mbyBleHRlbmRzIENsYXNzaWZpZXIgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPklzIFByaW1hcnkgRXh0ZW5zaW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5JcyBQcmltYXJ5IEV4dGVuc2lvbjwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JcyBQcmltYXJ5IEV4dGVuc2lvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0SXNQcmltYXJ5RXh0ZW5zaW9uKEJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0QXBwbGljYWJsZU1ldGFDbGFzc0luZm9fSXNQcmltYXJ5RXh0ZW5zaW9uKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuQm9vbGVhbiIgcmVxdWlyZWQ9InRydWUiIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCb29sZWFuIGdldElzUHJpbWFyeUV4dGVuc2lvbigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5BcHBsaWNhYmxlTWV0YUNsYXNzSW5mbyNnZXRJc1ByaW1hcnlFeHRlbnNpb24gPGVtPklzIFByaW1hcnkgRXh0ZW5zaW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5JcyBQcmltYXJ5IEV4dGVuc2lvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0SXNQcmltYXJ5RXh0ZW5zaW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRJc1ByaW1hcnlFeHRlbnNpb24oQm9vbGVhbiB2YWx1ZSk7Ci0KLX0gLy8gQXBwbGljYWJsZU1ldGFDbGFzc0luZm8KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvQXJ0aWZhY3QuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvQXJ0aWZhY3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTRhNGM4Mi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0FydGlmYWN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkFydGlmYWN0PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQXJ0aWZhY3QgaXMgYSBXb3JrIFByb2R1Y3QgdGhhdCBwcm92aWRlcyBhIGRlc2NyaXB0aW9uIGFuZCBkZWZpbml0aW9uIGZvciB0YW5naWJsZSB3b3JrIHByb2R1Y3QgdHlwZXMuIEFydGlmYWN0cyBtYXkgYmUgY29tcG9zZWQgb2Ygb3RoZXIgYXJ0aWZhY3RzLiBGb3IgZXhhbXBsZSwgYSBtb2RlbCBhcnRpZmFjdCBjYW4gYmUgY29tcG9zZWQgb2YgbW9kZWwgZWxlbWVudHMsIHdoaWNoIGFyZSBhbHNvIGFydGlmYWN0cy4KLSAqIEFydGlmYWN0cyBhcmUgdGFuZ2libGUgd29yayBwcm9kdWN0cyBjb25zdW1lZCwgcHJvZHVjZWQsIG9yIG1vZGlmaWVkIGJ5IFRhc2tzLiAgSXQgbWF5IHNlcnZlIGFzIGEgYmFzaXMgZm9yIGRlZmluaW5nIHJldXNhYmxlIGFzc2V0cy4gIFJvbGVzIHVzZSBBcnRpZmFjdHMgdG8gcGVyZm9ybSBUYXNrcyBhbmQgcHJvZHVjZSBBcnRpZmFjdHMgaW4gdGhlIGNvdXJzZSBvZiBwZXJmb3JtaW5nIFRhc2tzLiAgQXJ0aWZhY3RzIGFyZSB0aGUgcmVzcG9uc2liaWxpdHkgb2YgYSBzaW5nbGUgUm9sZSwgbWFraW5nIHJlc3BvbnNpYmlsaXR5IGVhc3kgdG8gaWRlbnRpZnkgYW5kIHVuZGVyc3RhbmQsIGFuZCBwcm9tb3RpbmcgdGhlIGlkZWEgdGhhdCBldmVyeSBwaWVjZSBvZiBpbmZvcm1hdGlvbiBwcm9kdWNlZCBpbiB0aGUgbWV0aG9kIHJlcXVpcmVzIHRoZSBhcHByb3ByaWF0ZSBzZXQgb2Ygc2tpbGxzLiBFdmVuIHRob3VnaCBvbmUgcm9sZSBtaWdodCAib3duIiBhIHNwZWNpZmljIHR5cGUgb2YgQXJ0aWZhY3RzLCBvdGhlciByb2xlcyBjYW4gc3RpbGwgdXNlIHRoZSBBcnRpZmFjdHM7IHBlcmhhcHMgZXZlbiB1cGRhdGUgdGhlbSBpZiB0aGUgUm9sZSBoYXMgYmVlbiBnaXZlbiBwZXJtaXNzaW9uIHRvIGRvIHNvLgotICogCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5BcnRpZmFjdCNnZXRDb250YWluZXJBcnRpZmFjdCA8ZW0+Q29udGFpbmVyIEFydGlmYWN0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkFydGlmYWN0I2dldENvbnRhaW5lZEFydGlmYWN0cyA8ZW0+Q29udGFpbmVkIEFydGlmYWN0czwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldEFydGlmYWN0KCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEFydGlmYWN0IGV4dGVuZHMgV29ya1Byb2R1Y3QgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNvbnRhaW5lciBBcnRpZmFjdDwvYj48L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZS4KLQkgKiBJdCBpcyBiaWRpcmVjdGlvbmFsIGFuZCBpdHMgb3Bwb3NpdGUgaXMgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkFydGlmYWN0I2dldENvbnRhaW5lZEFydGlmYWN0cyA8ZW0+Q29udGFpbmVkIEFydGlmYWN0czwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Db250YWluZXIgQXJ0aWZhY3Q8L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNvbnRhaW5lciBBcnRpZmFjdDwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldENvbnRhaW5lckFydGlmYWN0KEFydGlmYWN0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldEFydGlmYWN0X0NvbnRhaW5lckFydGlmYWN0KCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuQXJ0aWZhY3QjZ2V0Q29udGFpbmVkQXJ0aWZhY3RzCi0JICogQG1vZGVsIG9wcG9zaXRlPSJjb250YWluZWRBcnRpZmFjdHMiIHRyYW5zaWVudD0iZmFsc2UiIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlBcnRpZmFjdCBnZXRDb250YWluZXJBcnRpZmFjdCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5BcnRpZmFjdCNnZXRDb250YWluZXJBcnRpZmFjdCA8ZW0+Q29udGFpbmVyIEFydGlmYWN0PC9lbT59JyBjb250YWluZXIgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q29udGFpbmVyIEFydGlmYWN0PC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0Q29udGFpbmVyQXJ0aWZhY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldENvbnRhaW5lckFydGlmYWN0KEFydGlmYWN0IHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNvbnRhaW5lZCBBcnRpZmFjdHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkFydGlmYWN0fS4KLQkgKiBJdCBpcyBiaWRpcmVjdGlvbmFsIGFuZCBpdHMgb3Bwb3NpdGUgaXMgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkFydGlmYWN0I2dldENvbnRhaW5lckFydGlmYWN0IDxlbT5Db250YWluZXIgQXJ0aWZhY3Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q29udGFpbmVkIEFydGlmYWN0czwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNvbnRhaW5lZCBBcnRpZmFjdHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0QXJ0aWZhY3RfQ29udGFpbmVkQXJ0aWZhY3RzKCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuQXJ0aWZhY3QjZ2V0Q29udGFpbmVyQXJ0aWZhY3QKLQkgKiBAbW9kZWwgb3Bwb3NpdGU9ImNvbnRhaW5lckFydGlmYWN0IiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9InRydWUiIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0PEFydGlmYWN0PiBnZXRDb250YWluZWRBcnRpZmFjdHMoKTsKLQotfSAvLyBBcnRpZmFjdApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9BcnRpZmFjdERlc2NyaXB0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0FydGlmYWN0RGVzY3JpcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjA5ZGU2NC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0FydGlmYWN0RGVzY3JpcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzOSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5BcnRpZmFjdCBEZXNjcmlwdGlvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkFydGlmYWN0RGVzY3JpcHRpb24jZ2V0QnJpZWZPdXRsaW5lIDxlbT5CcmllZiBPdXRsaW5lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkFydGlmYWN0RGVzY3JpcHRpb24jZ2V0UmVwcmVzZW50YXRpb25PcHRpb25zIDxlbT5SZXByZXNlbnRhdGlvbiBPcHRpb25zPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkFydGlmYWN0RGVzY3JpcHRpb24jZ2V0UmVwcmVzZW50YXRpb24gPGVtPlJlcHJlc2VudGF0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkFydGlmYWN0RGVzY3JpcHRpb24jZ2V0Tm90YXRpb24gPGVtPk5vdGF0aW9uPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0QXJ0aWZhY3REZXNjcmlwdGlvbigpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBBcnRpZmFjdERlc2NyaXB0aW9uIGV4dGVuZHMgV29ya1Byb2R1Y3REZXNjcmlwdGlvbiB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QnJpZWYgT3V0bGluZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiIiPC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFByb3ZpZGVzIGEgYnJpZWYgZGVzY3JpcHRpb24gb2YgdGhlIGluZm9ybWF0aW9uIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoaXMgYXJ0aWZhY3QuIEZvciBleGFtcGxlLCBkaXNjdXNzZXMgdGhlIGNvbnRlbnRzIGZvciBrZXkgY2hhcHRlcnMgb2YgYSBkb2N1bWVudCBhcnRpZmFjdCBvciB0aGUga2V5IHBhY2thZ2VzIGFuZCBtb2R1bGVzIG9mIGEgbW9kZWwgYXJ0aWZhY3QuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkJyaWVmIE91dGxpbmU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEJyaWVmT3V0bGluZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0QXJ0aWZhY3REZXNjcmlwdGlvbl9CcmllZk91dGxpbmUoKQotCSAqIEBtb2RlbCBkZWZhdWx0PSIiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLlN0cmluZyIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRCcmllZk91dGxpbmUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQXJ0aWZhY3REZXNjcmlwdGlvbiNnZXRCcmllZk91dGxpbmUgPGVtPkJyaWVmIE91dGxpbmU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkJyaWVmIE91dGxpbmU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEJyaWVmT3V0bGluZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0QnJpZWZPdXRsaW5lKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SZXByZXNlbnRhdGlvbiBPcHRpb25zPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+IiI8L2NvZGU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogRGlzY3Vzc2VzIGRpZmZlcmVudCBwb3NzaWJsZSBhbHRlcm5hdGl2ZSByZXByZXNlbnRhdGlvbnMgZm9yIHRoZSBhcnRpZmFjdC4gRm9yIGV4YW1wbGUgYSBkZXNpZ24gbW9kZWwgY2FuIGJlIHJlcHJlc2VudGVkIGFzIGEgVU1MIG1vZGVsIG9yIGFuIGluZm9ybWFsIGJsb2NrIGRpYWdyYW0gb3IgYnkgdGV4dHVhbCBkZXNjcmlwdGlvbiBvbmx5LgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZXByZXNlbnRhdGlvbiBPcHRpb25zPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRSZXByZXNlbnRhdGlvbk9wdGlvbnMoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldEFydGlmYWN0RGVzY3JpcHRpb25fUmVwcmVzZW50YXRpb25PcHRpb25zKCkKLQkgKiBAbW9kZWwgZGVmYXVsdD0iIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5TdHJpbmciIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0UmVwcmVzZW50YXRpb25PcHRpb25zKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkFydGlmYWN0RGVzY3JpcHRpb24jZ2V0UmVwcmVzZW50YXRpb25PcHRpb25zIDxlbT5SZXByZXNlbnRhdGlvbiBPcHRpb25zPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5SZXByZXNlbnRhdGlvbiBPcHRpb25zPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRSZXByZXNlbnRhdGlvbk9wdGlvbnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFJlcHJlc2VudGF0aW9uT3B0aW9ucyhTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmVwcmVzZW50YXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iIjwvY29kZT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5SZXByZXNlbnRhdGlvbjwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZXByZXNlbnRhdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UmVwcmVzZW50YXRpb24oU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldEFydGlmYWN0RGVzY3JpcHRpb25fUmVwcmVzZW50YXRpb24oKQotCSAqIEBtb2RlbCBkZWZhdWx0PSIiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLlN0cmluZyIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRSZXByZXNlbnRhdGlvbigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5BcnRpZmFjdERlc2NyaXB0aW9uI2dldFJlcHJlc2VudGF0aW9uIDxlbT5SZXByZXNlbnRhdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UmVwcmVzZW50YXRpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFJlcHJlc2VudGF0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRSZXByZXNlbnRhdGlvbihTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Tm90YXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iIjwvY29kZT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Ob3RhdGlvbjwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Ob3RhdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0Tm90YXRpb24oU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldEFydGlmYWN0RGVzY3JpcHRpb25fTm90YXRpb24oKQotCSAqIEBtb2RlbCBkZWZhdWx0PSIiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLlN0cmluZyIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXROb3RhdGlvbigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5BcnRpZmFjdERlc2NyaXB0aW9uI2dldE5vdGF0aW9uIDxlbT5Ob3RhdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Tm90YXRpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldE5vdGF0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXROb3RhdGlvbihTdHJpbmcgdmFsdWUpOwotCi19IC8vIEFydGlmYWN0RGVzY3JpcHRpb24KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvQnJlYWtkb3duRWxlbWVudC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9CcmVha2Rvd25FbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3NWM1OWUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9CcmVha2Rvd25FbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MjggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5CcmVha2Rvd24gRWxlbWVudDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEJyZWFrZG93biBFbGVtZW50IGlzIGFuIGFic3RyYWN0IGdlbmVyYWxpemF0aW9uIGZvciBhbnkgdHlwZSBvZiBNZXRob2QgRWxlbWVudCB0aGF0IGlzIHBhcnQgb2YgYSBicmVha2Rvd24gc3RydWN0dXJlLiAgSXQgZGVmaW5lcyBhIHNldCBvZiBwcm9wZXJ0aWVzIGF2YWlsYWJsZSB0byBhbGwgb2YgaXRzIHNwZWNpYWxpemF0aW9ucy4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQjZ2V0UHJlZml4IDxlbT5QcmVmaXg8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudCNnZXRJc1BsYW5uZWQgPGVtPklzIFBsYW5uZWQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudCNnZXRIYXNNdWx0aXBsZU9jY3VycmVuY2VzIDxlbT5IYXMgTXVsdGlwbGUgT2NjdXJyZW5jZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudCNnZXRJc09wdGlvbmFsIDxlbT5JcyBPcHRpb25hbDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50I2dldFByZXNlbnRlZEFmdGVyIDxlbT5QcmVzZW50ZWQgQWZ0ZXI8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudCNnZXRQcmVzZW50ZWRCZWZvcmUgPGVtPlByZXNlbnRlZCBCZWZvcmU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudCNnZXRQbGFubmluZ0RhdGEgPGVtPlBsYW5uaW5nIERhdGE8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudCNnZXRTdXBlckFjdGl2aXRpZXMgPGVtPlN1cGVyIEFjdGl2aXRpZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudCNnZXRDaGVja2xpc3RzIDxlbT5DaGVja2xpc3RzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQjZ2V0Q29uY2VwdHMgPGVtPkNvbmNlcHRzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQjZ2V0RXhhbXBsZXMgPGVtPkV4YW1wbGVzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQjZ2V0R3VpZGVsaW5lcyA8ZW0+R3VpZGVsaW5lczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50I2dldFJldXNhYmxlQXNzZXRzIDxlbT5SZXVzYWJsZSBBc3NldHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudCNnZXRTdXBwb3J0aW5nTWF0ZXJpYWxzIDxlbT5TdXBwb3J0aW5nIE1hdGVyaWFsczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50I2dldFRlbXBsYXRlcyA8ZW0+VGVtcGxhdGVzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQjZ2V0UmVwb3J0cyA8ZW0+UmVwb3J0czwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50I2dldEVzdGltYXRpb25jb25zaWRlcmF0aW9ucyA8ZW0+RXN0aW1hdGlvbmNvbnNpZGVyYXRpb25zPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQjZ2V0VG9vbG1lbnRvciA8ZW0+VG9vbG1lbnRvcjwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldEJyZWFrZG93bkVsZW1lbnQoKQotICogQG1vZGVsIGFic3RyYWN0PSJ0cnVlIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEJyZWFrZG93bkVsZW1lbnQgZXh0ZW5kcyBQcm9jZXNzRWxlbWVudCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UHJlZml4PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+IiI8L2NvZGU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogUHJlZml4IHJlcHJlc2VudHMgYW4gYWRkaXRpb25hbCBsYWJlbCB0aGF0IHdpbGwgYmUgcHJlc2VudGVkIGFzIGEgcHJlZml4IHRvIGFueSBCcmVha2Rvd24gRWxlbWVudCB0byBpbmRpY2F0ZSBhIHVzZXItZGVmaW5lZCBzdWItdHlwZSBmb3IgdGhlIGVsZW1lbnQuICBGb3IgZXhhbXBsZSwgaWYgdGhlIHByb2Nlc3MgZW5naW5lZXIgd291bGQgbGlrZSB0byBkaXN0aW5ndWlzaCBoaXMgQWN0aXZpdGllcyBieSAnTW9kdWxlJyAoYXMgZG9uZSBpbiB0aGUgSUJNIFJhdGlvbmFsIFN1bW1pdCBBc2NlbmRhbnQgTWV0aG9kKSwgaGUgY2FuIGRlZmluZSBhIGRpZmZlcmVudCBwcmVmaXggZm9yIGV2ZXJ5IG1vZGVsIHRvIGJlIHVzZWQgaW4gYWRkaXRpb24gdG8gbmFtaW5nIEFjdGl2aXRpZXMsIGUuZy4gIlNSQS5Fc3RhYmxpc2ggUmVxdWlyZW1lbnRzIiB3aXRoIFNSQSBpbmRpY2F0aW5nIHRoYXQgdGhpcyBBY3Rpdml0eSBiZWxvbmdzIHRvIHRoZSAiU29mdHdhcmUgUmVxdWlyZW1lbnRzIEFuYWx5c2lzIiBtb2R1bGUuICBBbm90aGVyIGNvbW1vbiBhcHBsaWNhdGlvbiBmb3IgcHJlZml4IGlzIHRvIHF1YWxpZnkgcm9sZXMgaW4gUm9sZSBEZXNjcmlwdG9ycy4gIEZvciBleGFtcGxlLCAiQ3VzdG9tZXIuQXJjaGl0ZWN0IiB3b3VsZCBkZWZpbmUgYSAiQ3VzdG9tZXIiIHByZWZpeCBmb3IgdGhlIFJvbGUgRGVzY3JpcHRvciAiQXJjaGl0ZWN0IiBleHByZXNzaW5nIHRoYXQgdGhpcyBpcyBhbiBhcmNoaXRlY3Qgb24gdGhlIGN1c3RvbWVyIHNpZGUgYW5kIG5vdCB0aGUgZGV2ZWxvcG1lbnQgdGVhbSBzaWRlLgotCSAqIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QcmVmaXg8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFByZWZpeChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0QnJlYWtkb3duRWxlbWVudF9QcmVmaXgoKQotCSAqIEBtb2RlbCBkZWZhdWx0PSIiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLlN0cmluZyIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRQcmVmaXgoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudCNnZXRQcmVmaXggPGVtPlByZWZpeDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UHJlZml4PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRQcmVmaXgoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFByZWZpeChTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SXMgUGxhbm5lZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiJ0cnVlIjwvY29kZT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBBIGtleSBhcHBsaWNhdGlvbiBmb3IgRGV2ZWxvcG1lbnQgUHJvY2Vzc2VzIGV4cHJlc3NlZCB3aXRoIEJyZWFrZG93biBzdHJ1Y3R1cmVzIGlzIHRvIGdlbmVyYXRlIGEgcHJvamVjdCBwbGFuIGZyb20gaXQuICBBIHByb2Nlc3MgYXMgZGVmaW5lZCBpbiBVTUEgKGNmLiB3aXRoIFNlY3Rpb25zIFhYIGFuZCA1LjIpIGlzIGEgbXVsdGktZGltZW5zaW9uYWwgc3RydWN0dXJlIGRlZmluaW5nIHdoYXQgd29yayBpcyBiZWluZyBwZXJmb3JtZWQgYXQgd2hhdCB0aW1lIGJ5IHdoaWNoIHJvbGVzIHVzaW5nIHdoaWNoIGlucHV0IGFuZCBwcm9kdWNpbmcgd2hhdCBvdXRwdXRzLiAgQSBwcm9qZWN0IHBsYW4gYXMgaXQgaXMgcmVwcmVzZW50ZWQgaW4gcHJvamVjdCBwbGFubmluZyB0b29scyBzdWNoIGFzIElCTSBSYXRpb25hbCBQb3J0Zm9saW8gTWFuYWdlciBvciBNaWNyb3NvZnQgUHJvamVjdCBub3JtYWxseSBkb2VzIG5vdCBuZWVkIGFsbCB0aGlzIGluZm9ybWF0aW9uIGFuZCBpcyBub3JtYWxseSBsaW1pdGVkIHRvIGp1c3QgcmVwcmVzZW50aW5nIGEgc3Vic2V0LiAgRm9yIGV4YW1wbGUsIGEgdHlwaWNhbCBNUyBQcm9qZWN0IHBsYW4gb25seSByZXByZXNlbnRzIHRoZSB3b3JrIGJyZWFrZG93biBjb25zaXN0aW5nIG9mIFRhc2tzIGFuZCBBY3Rpdml0aWVzIChzb21ldGltZXMgcmVmZXJyZWQgdG8gYXMgc3VtbWFyeSB0YXNrcykuICBJdCBkb2VzIG5vdCBzaG93IHRoZSBpbnB1dCBhbmQgb3V0cHV0IFdvcmsgUHJvZHVjdHMgZm9yIGEgVGFzaywgYnV0IGl0IGNhbiBzaG93IHdoaWNoIHJvbGVzIHNoYWxsIGJlIHN0YWZmZWQgZm9yIHBlcmZvcm1pbmcgdGhlIFRhc2suICBIb3dldmVyLCBzdWNoIHJvbGUgYWxsb2NhdGlvbiBuZWVkIHRvIGJlIHJlcGxhY2VkIHdpdGggY29uY3JldGUgcmVzb3VyY2VzIHdoZW4gaW5zdGFudGlhdGluZyB0aGUgcGxhbiBmb3IgYSBjb25jcmV0ZSBwcm9qZWN0LiAgU29tZXRpbWVzIHByb2plY3QgcGxhbnMgY2FuIHRoZW4gYWdhaW4gYmUgb3JnYW5pemVkIGRpZmZlcmVudGx5IGJ5IG9yZ2FuaXppbmcgd29yayBieSBkZWxpdmVyYWJsZXMgaW4gd2hpY2ggV29yayBQcm9kdWN0cyBhcmUgbWFwcGVkIHRvIHRoZSBwbGFuJ3Mgc3VtbWFyeSB0YXNrcyBhbmQgVGFzayB0aGF0IGhhdmUgdGhlc2Ugd29yayBwcm9kdWN0cyBhcyBvdXRwdXQgbWFwcGVkIGJlbG93IHN1Y2ggYXMgc3VtbWFyeSB0YXNrLiAgVGhlcmVmb3JlLCBhIHByb2Nlc3MgY2FuIG1ha2UgcmVjb21tZW5kYXRpb25zIGFib3V0IHdoaWNoIGVsZW1lbnRzIHRvIGluY2x1ZGUgYW5kIHdoaWNoIHRvIGV4Y2x1ZGUgd2hlbiBnZW5lcmF0aW5nIGEgcGxhbi4gIFdoZW4gdGhlIGlzUGxhbm5lZCBhdHRyaWJ1dGUgaXMgc2V0IHRvIEZhbHNlIGZvciBhbiBpbnN0YW5jZSBvZiBhIEJyZWFrZG93biBFbGVtZW50LCB0aGVuIHRoaXMgZWxlbWVudCBzaGFsbCBub3QgYmUgbm90IGluY2x1ZGVkIHdoZW4gYSBjb25jcmV0ZSBwcm9qZWN0IHBsYW4gaXMgYmVpbmcgZ2VuZXJhdGVkIGZyb20gdGhlIGJyZWFrZG93biBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucyB0aGlzIGVsZW1lbnQuCi0JICogCi0JICogCi0JICogCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPklzIFBsYW5uZWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldElzUGxhbm5lZChCb29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldEJyZWFrZG93bkVsZW1lbnRfSXNQbGFubmVkKCkKLQkgKiBAbW9kZWwgZGVmYXVsdD0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuQm9vbGVhbiIgcmVxdWlyZWQ9InRydWUiIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCb29sZWFuIGdldElzUGxhbm5lZCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50I2dldElzUGxhbm5lZCA8ZW0+SXMgUGxhbm5lZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SXMgUGxhbm5lZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0SXNQbGFubmVkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRJc1BsYW5uZWQoQm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5IYXMgTXVsdGlwbGUgT2NjdXJyZW5jZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iZmFsc2UiPC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIEp1c3QgYXMgdGhlIGlzUGxhbm5lZCBhdHRyaWJ1dGUgdGhlIGhhc011bHRpcGxlT2NjdXJyZW5jZXMgYXR0cmlidXRlIGhhcyBhbiBpbXBhY3Qgb24gZ2VuZXJhdGluZyBwbGFucyBmcm9tIGEgUHJvY2Vzcy4gIFdoZW4gdGhpcyBhdHRyaWJ1dGUgaXMgc2V0IHRvIFRydWUgZm9yIGEgQnJlYWtkb3duIEVsZW1lbnQgdGhlbiBpdCB3aWxsIHR5cGljYWxseSBvY2N1ciBtdWx0aXBsZSB0aW1lcyB3aXRoaW4gdGhlIHNhbWUgQWN0aXZpdHkuICBGb3IgZXhhbXBsZSwgYSBUYXNrIHN1Y2ggYXMgIkRldGFpbCBVc2UgQ2FzZSIgd291bGQgYmUgcGVyZm9ybWVkIGZvciBldmVyeSB1c2UgY2FzZSBpZGVudGlmaWVkIGZvciBhIHBhcnRpY3VsYXIgSXRlcmF0aW9uIG9yIEFjdGl2aXR5LiAgR2VuZXJhdGluZyBhIHBsYW4gd291bGQgbGlzdCBvbmUgVGFzayBpbnN0YW5jZSBwZXIgdXNlIGNhc2UuCi0JICogCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkhhcyBNdWx0aXBsZSBPY2N1cnJlbmNlczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0SGFzTXVsdGlwbGVPY2N1cnJlbmNlcyhCb29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldEJyZWFrZG93bkVsZW1lbnRfSGFzTXVsdGlwbGVPY2N1cnJlbmNlcygpCi0JICogQG1vZGVsIGRlZmF1bHQ9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5Cb29sZWFuIiByZXF1aXJlZD0idHJ1ZSIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJvb2xlYW4gZ2V0SGFzTXVsdGlwbGVPY2N1cnJlbmNlcygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50I2dldEhhc011bHRpcGxlT2NjdXJyZW5jZXMgPGVtPkhhcyBNdWx0aXBsZSBPY2N1cnJlbmNlczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SGFzIE11bHRpcGxlIE9jY3VycmVuY2VzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRIYXNNdWx0aXBsZU9jY3VycmVuY2VzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRIYXNNdWx0aXBsZU9jY3VycmVuY2VzKEJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SXMgT3B0aW9uYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iZmFsc2UiPC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBpc09wdGlvbmFsIGF0dHJpYnV0ZSBpbmRpY2F0ZXMgdGhhdCB0aGUgQnJlYWtkb3duIEVsZW1lbnQgZGVzY3JpYmVzIHdvcmssIGEgd29yayByZXN1bHQsIG9yIGV2ZW4gd29yayByZXNvdXJjZXMsIHdoaWNoIGluY2x1c2lvbiBpcyBub3QgbWFuZGF0b3J5IHdoZW4gcGVyZm9ybWluZyBhIHByb2plY3QgdGhhdCBpcyBwbGFubmVkIGJhc2VkIG9uIGEgcHJvY2VzcyBjb250YWluaW5nIHRoaXMgZWxlbWVudC4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SXMgT3B0aW9uYWw8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldElzT3B0aW9uYWwoQm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRCcmVha2Rvd25FbGVtZW50X0lzT3B0aW9uYWwoKQotCSAqIEBtb2RlbCBkZWZhdWx0PSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuQm9vbGVhbiIgcmVxdWlyZWQ9InRydWUiIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCb29sZWFuIGdldElzT3B0aW9uYWwoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudCNnZXRJc09wdGlvbmFsIDxlbT5JcyBPcHRpb25hbDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SXMgT3B0aW9uYWw8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldElzT3B0aW9uYWwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldElzT3B0aW9uYWwoQm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QcmVzZW50ZWQgQWZ0ZXI8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlByZXNlbnRlZCBBZnRlcjwvZW0+JyByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QcmVzZW50ZWQgQWZ0ZXI8L2VtPicgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFByZXNlbnRlZEFmdGVyKEJyZWFrZG93bkVsZW1lbnQpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0QnJlYWtkb3duRWxlbWVudF9QcmVzZW50ZWRBZnRlcigpCi0JICogQG1vZGVsIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCcmVha2Rvd25FbGVtZW50IGdldFByZXNlbnRlZEFmdGVyKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQjZ2V0UHJlc2VudGVkQWZ0ZXIgPGVtPlByZXNlbnRlZCBBZnRlcjwvZW0+fScgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UHJlc2VudGVkIEFmdGVyPC9lbT4nIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRQcmVzZW50ZWRBZnRlcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UHJlc2VudGVkQWZ0ZXIoQnJlYWtkb3duRWxlbWVudCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QcmVzZW50ZWQgQmVmb3JlPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5QcmVzZW50ZWQgQmVmb3JlPC9lbT4nIHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlByZXNlbnRlZCBCZWZvcmU8L2VtPicgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFByZXNlbnRlZEJlZm9yZShCcmVha2Rvd25FbGVtZW50KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldEJyZWFrZG93bkVsZW1lbnRfUHJlc2VudGVkQmVmb3JlKCkKLQkgKiBAbW9kZWwgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJyZWFrZG93bkVsZW1lbnQgZ2V0UHJlc2VudGVkQmVmb3JlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQjZ2V0UHJlc2VudGVkQmVmb3JlIDxlbT5QcmVzZW50ZWQgQmVmb3JlPC9lbT59JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5QcmVzZW50ZWQgQmVmb3JlPC9lbT4nIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRQcmVzZW50ZWRCZWZvcmUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFByZXNlbnRlZEJlZm9yZShCcmVha2Rvd25FbGVtZW50IHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlBsYW5uaW5nIERhdGE8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlBsYW5uaW5nIERhdGE8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UGxhbm5pbmcgRGF0YTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0UGxhbm5pbmdEYXRhKFBsYW5uaW5nRGF0YSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRCcmVha2Rvd25FbGVtZW50X1BsYW5uaW5nRGF0YSgpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0idHJ1ZSIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVBsYW5uaW5nRGF0YSBnZXRQbGFubmluZ0RhdGEoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudCNnZXRQbGFubmluZ0RhdGEgPGVtPlBsYW5uaW5nIERhdGE8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlBsYW5uaW5nIERhdGE8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldFBsYW5uaW5nRGF0YSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UGxhbm5pbmdEYXRhKFBsYW5uaW5nRGF0YSB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TdXBlciBBY3Rpdml0aWVzPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogSXQgaXMgYmlkaXJlY3Rpb25hbCBhbmQgaXRzIG9wcG9zaXRlIGlzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eSNnZXRCcmVha2Rvd25FbGVtZW50cyA8ZW0+QnJlYWtkb3duIEVsZW1lbnRzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlN1cGVyIEFjdGl2aXRpZXM8L2VtPicgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TdXBlciBBY3Rpdml0aWVzPC9lbT4nIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRTdXBlckFjdGl2aXRpZXMoQWN0aXZpdHkpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0QnJlYWtkb3duRWxlbWVudF9TdXBlckFjdGl2aXRpZXMoKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eSNnZXRCcmVha2Rvd25FbGVtZW50cwotCSAqIEBtb2RlbCBvcHBvc2l0ZT0iYnJlYWtkb3duRWxlbWVudHMiIHJlcXVpcmVkPSJ0cnVlIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQWN0aXZpdHkgZ2V0U3VwZXJBY3Rpdml0aWVzKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQjZ2V0U3VwZXJBY3Rpdml0aWVzIDxlbT5TdXBlciBBY3Rpdml0aWVzPC9lbT59JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TdXBlciBBY3Rpdml0aWVzPC9lbT4nIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRTdXBlckFjdGl2aXRpZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFN1cGVyQWN0aXZpdGllcyhBY3Rpdml0eSB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5DaGVja2xpc3RzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5DaGVja2xpc3R9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q2hlY2tsaXN0czwvZW0+JyByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNoZWNrbGlzdHM8L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0QnJlYWtkb3duRWxlbWVudF9DaGVja2xpc3RzKCkKLQkgKiBAbW9kZWwgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3Q8Q2hlY2tsaXN0PiBnZXRDaGVja2xpc3RzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Db25jZXB0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQ29uY2VwdH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Db25jZXB0czwvZW0+JyByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNvbmNlcHRzPC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldEJyZWFrZG93bkVsZW1lbnRfQ29uY2VwdHMoKQotCSAqIEBtb2RlbCBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdDxDb25jZXB0PiBnZXRDb25jZXB0cygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RXhhbXBsZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkV4YW1wbGV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RXhhbXBsZXM8L2VtPicgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FeGFtcGxlczwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRCcmVha2Rvd25FbGVtZW50X0V4YW1wbGVzKCkKLQkgKiBAbW9kZWwgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3Q8RXhhbXBsZT4gZ2V0RXhhbXBsZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkd1aWRlbGluZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkd1aWRlbGluZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5HdWlkZWxpbmVzPC9lbT4nIHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+R3VpZGVsaW5lczwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRCcmVha2Rvd25FbGVtZW50X0d1aWRlbGluZXMoKQotCSAqIEBtb2RlbCBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdDxHdWlkZWxpbmU+IGdldEd1aWRlbGluZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJldXNhYmxlIEFzc2V0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUmV1c2FibGVBc3NldH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5SZXVzYWJsZSBBc3NldHM8L2VtPicgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZXVzYWJsZSBBc3NldHM8L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0QnJlYWtkb3duRWxlbWVudF9SZXVzYWJsZUFzc2V0cygpCi0JICogQG1vZGVsIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0PFJldXNhYmxlQXNzZXQ+IGdldFJldXNhYmxlQXNzZXRzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TdXBwb3J0aW5nIE1hdGVyaWFsczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuU3VwcG9ydGluZ01hdGVyaWFsfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlN1cHBvcnRpbmcgTWF0ZXJpYWxzPC9lbT4nIHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U3VwcG9ydGluZyBNYXRlcmlhbHM8L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0QnJlYWtkb3duRWxlbWVudF9TdXBwb3J0aW5nTWF0ZXJpYWxzKCkKLQkgKiBAbW9kZWwgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3Q8U3VwcG9ydGluZ01hdGVyaWFsPiBnZXRTdXBwb3J0aW5nTWF0ZXJpYWxzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5UZW1wbGF0ZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlRlbXBsYXRlfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlRlbXBsYXRlczwvZW0+JyByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlRlbXBsYXRlczwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRCcmVha2Rvd25FbGVtZW50X1RlbXBsYXRlcygpCi0JICogQG1vZGVsIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0PFRlbXBsYXRlPiBnZXRUZW1wbGF0ZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJlcG9ydHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlJlcG9ydH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5SZXBvcnRzPC9lbT4nIHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmVwb3J0czwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRCcmVha2Rvd25FbGVtZW50X1JlcG9ydHMoKQotCSAqIEBtb2RlbCBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdDxSZXBvcnQ+IGdldFJlcG9ydHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkVzdGltYXRpb25jb25zaWRlcmF0aW9uczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkVzdGltYXRpb25jb25zaWRlcmF0aW9uczwvZW0+JyByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkVzdGltYXRpb25jb25zaWRlcmF0aW9uczwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRCcmVha2Rvd25FbGVtZW50X0VzdGltYXRpb25jb25zaWRlcmF0aW9ucygpCi0JICogQG1vZGVsIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0PEVzdGltYXRpb25Db25zaWRlcmF0aW9ucz4gZ2V0RXN0aW1hdGlvbmNvbnNpZGVyYXRpb25zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Ub29sbWVudG9yPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Ub29sTWVudG9yfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlRvb2xtZW50b3I8L2VtPicgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Ub29sbWVudG9yPC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldEJyZWFrZG93bkVsZW1lbnRfVG9vbG1lbnRvcigpCi0JICogQG1vZGVsIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0PFRvb2xNZW50b3I+IGdldFRvb2xtZW50b3IoKTsKLQotfSAvLyBCcmVha2Rvd25FbGVtZW50CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0JyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9CcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODM0Y2QwMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0JyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+QnJlYWtkb3duIEVsZW1lbnQgRGVzY3JpcHRpb248L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24jZ2V0VXNhZ2VHdWlkYW5jZSA8ZW0+VXNhZ2UgR3VpZGFuY2U8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24oKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uIGV4dGVuZHMgQ29udGVudERlc2NyaXB0aW9uIHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Vc2FnZSBHdWlkYW5jZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiIiPC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFByb3ZpZGVzIGluZm9ybWF0aW9uIGFuZCBndWlkYW5jZSBvbiB0aGUgbWVhbmluZyBvZiB0aGUgQm9vbGVhbiBmbGFnIHZhbHVlcyBhbmQgdW5kZXIgd2hhdCBjaXJjdW1zdGFuY2VzIHRoZXkgc2hvdWxkIGJlIG92ZXJyaWRkZW4uIEZvciBleGFtcGxlLCBpdCBkZXNjcmliZXMgd2h5IHRoZSBicmVha2Rvd24gZWxlbWVudCBpcyBvcHRpb25hbCBvciBjb25zaWRlcmF0aW9ucyBmb3IgcmVwZWF0aW5nIGl0IGFuZCBkaWZmZXJlbmNlcyBpbiB0aGUgaW5kaXZpZHVhbCBvY2N1cnJlbmNlcyBvZiB0aGlzIEJyZWFrZG93biBFbGVtZW50IGFjcm9zcyB0aGUgbGlmZWN5Y2xlLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Vc2FnZSBHdWlkYW5jZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0VXNhZ2VHdWlkYW5jZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0QnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uX1VzYWdlR3VpZGFuY2UoKQotCSAqIEBtb2RlbCBkZWZhdWx0PSIiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLlN0cmluZyIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRVc2FnZUd1aWRhbmNlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbiNnZXRVc2FnZUd1aWRhbmNlIDxlbT5Vc2FnZSBHdWlkYW5jZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VXNhZ2UgR3VpZGFuY2U8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFVzYWdlR3VpZGFuY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFVzYWdlR3VpZGFuY2UoU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvQ2FwYWJpbGl0eVBhdHRlcm4uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvQ2FwYWJpbGl0eVBhdHRlcm4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmJkMzcwZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0NhcGFiaWxpdHlQYXR0ZXJuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5DYXBhYmlsaXR5IFBhdHRlcm48L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIENhcGFiaWxpdHkgUGF0dGVybiBpcyBhIHNwZWNpYWwgUHJvY2VzcyB0aGF0IGRlc2NyaWJlcyBhIHJldXNhYmxlIGNsdXN0ZXIgb2YgZG9pbmcgd29yayBpbiBjb21tb24gcHJvY2VzcyBhcmVhcy4gIENhcGFiaWxpdGllcyBQYXR0ZXJucyBleHByZXNzIGFuZCBjb21tdW5pY2F0ZSBwcm9jZXNzIGtub3dsZWRnZSBmb3IgYSBrZXkgYXJlYSBvZiBpbnRlcmVzdCBzdWNoIGFzIGEgRGlzY2lwbGluZSBhbmQgY2FuIGJlIGRpcmVjdGx5IHVzZWQgYnkgcHJvY2VzcyBwcmFjdGl0aW9uZXIgdG8gZ3VpZGUgaGlzIHdvcmsuICBUaGV5IGFyZSBhbHNvIHVzZWQgYXMgYnVpbGRpbmcgYmxvY2tzIHRvIGFzc2VtYmxlIERlbGl2ZXJ5IFByb2Nlc3NlcyBvciBsYXJnZXIgQ2FwYWJpbGl0eSBQYXR0ZXJucyBlbnN1cmluZyBvcHRpbWFsIHJldXNlIGFuZCBhcHBsaWNhdGlvbiBvZiB0aGUga2V5IHByYWN0aWNlcyB0aGV5IGV4cHJlc3MuCi0gKiBBIENhcGFiaWxpdHkgUGF0dGVybiBpcyBhIHNwZWNpYWwgUHJvY2VzcyB0aGF0IGRlc2NyaWJlcyBhIHJldXNhYmxlIGNsdXN0ZXIgb2YgZG9pbmcgd29yayBpbiBhIGdlbmVyYWwgcHJvY2VzcyBhcmVhIHRoYXQgcHJvdmlkZXMgYSBjb25zaXN0ZW50IGRldmVsb3BtZW50IGFwcHJvYWNoIHRvIGNvbW1vbiBwcm9ibGVtcy4gIEV4YW1wbGVzIGZvciBDYXBhYmlsaXR5IFBhdHRlcm4gY291bGQgYmUgJ3VzZSBjYXNlLWJhc2VkIHJlcXVpcmVtZW50cyBtYW5hZ2VtZW50JywgJ3VzZSBjYXNlIGFuYWx5c2lzJywgb3IgJ3VuaXQgdGVzdGluZycuIFR5cGljYWxseSBidXQgbm90IG5lY2Vzc2FyaWx5LCBDYXBhYmlsaXR5IFBhdHRlcm5zIGhhdmUgdGhlIHNjb3BlIG9mIG9uZSBkaXNjaXBsaW5lIHByb3ZpZGluZyBhIGJyZWFrZG93biBvZiByZXVzYWJsZSBjb21wbGV4IEFjdGl2aXRpZXMsIHJlbGF0aW9uc2hpcHMgdG8gdGhlIFJvbGVzIHdoaWNoIHBlcmZvcm0gVGFza3Mgd2l0aGluIHRoZXNlIEFjdGl2aXRpZXMsIGFzIHdlbGwgYXMgdG8gdGhlIFdvcmsgUHJvZHVjdHMgdGhhdCBhcmUgdXNlZCBhbmQgcHJvZHVjZWQuICBBIGNhcGFiaWxpdHkgcGF0dGVybiBkb2VzIG5vdCByZWxhdGUgdG8gYW55IHNwZWNpZmljIHBoYXNlIG9yIGl0ZXJhdGlvbiBvZiBhIGRldmVsb3BtZW50IGxpZmVjeWNsZSwgYW5kIHNob3VsZCBub3QgaW1wbHkgYW55LiAgSW4gb3RoZXIgd29yZHMsIGEgcGF0dGVybiBzaG91bGQgYmUgZGVzaWduZWQgaW4gYSB3YXkgdGhhdCBpdCBpcyBhcHBsaWNhYmxlIGFueXdoZXJlIGluIGEgRGVsaXZlcnkgUHJvY2Vzcy4gIFRoaXMgZW5hYmxlcyBpdHMgQWN0aXZpdGllcyB0byBiZSBmbGV4aWJseSBhc3NpZ25lZCB0byB3aGF0ZXZlciBwaGFzZXMgdGhlcmUgYXJlIGluIHRoZSBEZWxpdmVyeSBQcm9jZXNzIHRvIHdoaWNoIGl0IGlzIGJlaW5nIGFwcGxpZWQuICBJdCBpcyBhIGdvb2QgcHJhY3RpY2UgdG8gZGVzaWduIGEgQ2FwYWJpbGl0eSBQYXR0ZXJuIHRvIHByb2R1Y2Ugb25lIG9yIG1vcmUgZ2VuZXJpYyBEZWxpdmVyYWJsZXMuICBUaGUgdHlwaWNhbCBjb25maWd1cmF0aW9uIGlzIHRoYXQgZWFjaCBBY3Rpdml0eSBpbiB0aGUgQ2FwYWJpbGl0eSBQYXR0ZXJuIHByb2R1Y2VzIG9uZSBEZWxpdmVyYWJsZSwgYW5kIHRoZSBsYXN0IFRhc2sgRGVzY3JpcHRvciBpbiB0aGUgQWN0aXZpdHkgZXhwbGljaXRseSBvdXRwdXRzIGp1c3QgdGhpcyBEZWxpdmVyYWJsZS4gIFRoaXMgZW5hYmxlcyB0aGUgcHJvY2VzcyBlbmdpbmVlciB0byBzZWxlY3QgUGF0dGVybnMgb3IganVzdCBBY3Rpdml0aWVzIGJ5IGRlY2lkaW5nIHdoaWNoIERlbGl2ZXJhYmxlcyBhcmUgcmVxdWlyZWQuICBJdCBhbHNvIG9mZmVycyBhIHNpbXBsZSBpbnRlZ3JhdGlvbiBhcHByb2FjaDogYW4gQWN0aXZpdHkgZnJvbSBhIGNhcGFiaWxpdHkgcGF0dGVybiBpcyBsaW5rZWQgdG8gdGhlIFBoYXNlIG9yIEl0ZXJhdGlvbiB3aGljaCBpcyByZXF1aXJlZCB0byBwcm9kdWNlIHRoZSBBY3Rpdml0eSdzIERlbGl2ZXJhYmxlLiAgS2V5IGFwcGxpY2F0aW9ucyBhcmVhcyBvZiAvIGFyZWFzIG9mIHJldXNlIGZvciBDYXBhYmlsaXR5IFBhdHRlcm5zIGFyZToKLSAqIC0gVG8gc2VydmUgYXMgYnVpbGRpbmcgYmxvY2tzIGZvciBhc3NlbWJsaW5nIERlbGl2ZXJ5IFByb2Nlc3NlcyBvciBsYXJnZXIgQ2FwYWJpbGl0eSBQYXR0ZXJucy4gIE5vcm1hbGx5IGRldmVsb3BpbmcgYSBEZWxpdmVyeSBQcm9jZXNzIGlzIG5vdCBkb25lIGZyb20gc2NyYXRjaCBidXQgYnkgc3lzdGVtYXRpY2FsbHkgYXBwbHlpbmcgYW5kIGJpbmRpbmcgcGF0dGVybnMuICBJbiBhZGRpdGlvbiB0byB0aGUgc3RhbmRhcmQgcGF0dGVybiBhcHBsaWNhdGlvbiBvZiAnY29weS1hbmQtbW9kaWZ5Jywgd2hpY2ggYWxsb3dzIHRoZSBwcm9jZXNzIGVuZ2luZWVyIHRvIGluZGl2aWR1YWxseSBjdXN0b21pemUgdGhlIHBhdHRlcm4ncyBjb250ZW50IHRvIHRoZSBwYXJ0aWN1bGFyIHNpdHVhdGlvbiBpdCBpcyBhcHBsaWVkIGZvciwgdGhlIFBsdWdpbiBtZXRhLW1vZGVsIHBhY2thZ2UgKFNlY3Rpb24gNi4xKSBpbnRyb2R1Y2VzIGV2ZW4gbW9yZSBzb3BoaXN0aWNhdGVkIGluaGVyaXRhbmNlIHJlbGF0aW9uc2hpcHMgdGhhdCBzdXBwb3J0IGR5bmFtaWMgYmluZGluZyBvZiBwYXR0ZXJucyAoaS5lLiB0aGUgcGF0dGVybiBpcyByZWZlcmVuY2VkIGFuZCBub3QgY29waWVkKS4gIFRoaXMgdW5pcXVlIG5ldyB3YXkgb2YgcmV1c2luZyBwcm9jZXNzIGtub3dsZWRnZSBhbGxvd3MgdG8gZmFjdG9yIG91dCBjb21tb25seSByZW9jY3VycmluZyBBY3Rpdml0aWVzIGludG8gcGF0dGVybnMgYW5kIHRvIGFwcGx5IHRoZW0gb3ZlciBhbmQgb3ZlciBhZ2FpbiBmb3IgYSBwcm9jZXNzLiAgV2hlbiB0aGUgcGF0dGVybiBpcyBiZWluZyByZXZpc2VkIG9yIHVwZGF0ZWQsIGFsbCBjaGFuZ2VzIHdpbGwgYmUgYXV0b21hdGljYWxseSByZWZsZWN0ZWQgaW4gYWxsIHBhdHRlcm4gYXBwbGljYXRpb24gaW4gYWxsIHByb2Nlc3NlcyBiZWNhdXNlIG9mIHRoZSBkeW5hbWljIGJpbmRpbmcuCi0gKiAtIFRvIHN1cHBvcnQgZGlyZWN0IGV4ZWN1dGlvbiBpbiBhIGRldmVsb3BtZW50IHByb2plY3QgdGhhdCBkb2VzIG5vdCB3b3JrIGZvbGxvd2luZyBhIHdlbGwtZGVmaW5lZCBwcm9jZXNzLCBidXQgd29ya3MgYmFzZWQgb24gbG9vc2VseSBjb25uZWN0ZWQgcHJvY2VzcyBmcmFnbWVudHMgb2YgYmVzdCBwcmFjdGljZXMgaW4gYSBmbGV4aWJsZSBtYW5uZXIgKGUuZy4gQWdpbGUgRGV2ZWxvcG1lbnQpLgotICogLSBUbyBzdXBwb3J0IHByb2Nlc3MgZWR1Y2F0aW9uIGJ5IGRlc2NyaWJpbmcga25vd2xlZGdlIGZvciBhIGtleSBhcmVhIHN1Y2ggYXMgYmVzdCBwcmFjdGljZXMgb24gaG93IHRvIHBlcmZvcm0gdGhlIHdvcmsgZm9yIGEgRGlzY2lwbGluZSAoZS5nLiBSZXF1aXJlbWVudHMgTWFuYWdlbWVudCksIGZvciBhIHNwZWNpZmljIGRldmVsb3BtZW50IHRlY2huaXF1ZSAoYXNwZWN0LW9yaWVudGVkIGRldmVsb3BtZW50KSwgb3IgYSBzcGVjaWZpYyB0ZWNobmljYWwgYXJlYSAoZS5nLiByZWxhdGlvbmFsIGRhdGFiYXNlIGRlc2lnbiksIHdoaWNoIGlzIHVzZWQgZm9yIGVkdWNhdGlvbiBhbmQgdGVhY2hpbmcuCi0gKiAKLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0Q2FwYWJpbGl0eVBhdHRlcm4oKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ2FwYWJpbGl0eVBhdHRlcm4gZXh0ZW5kcyBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3MgewotfSAvLyBDYXBhYmlsaXR5UGF0dGVybgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9DaGVja2xpc3QuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvQ2hlY2tsaXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyZjhlMWUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9DaGVja2xpc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWE7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkNoZWNrbGlzdDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEEgQ2hlY2tsaXN0IGlzIGEgc3BlY2lmaWMgdHlwZSBvZiBndWlkYW5jZSB0aGF0IGlkZW50aWZpZXMgYSBzZXJpZXMgb2YgaXRlbXMgdGhhdCBuZWVkIHRvIGJlIGNvbXBsZXRlZCBvciB2ZXJpLWZpZWQuICBDaGVja2xpc3RzIGFyZSBvZnRlbiB1c2VkIGluIHJldmlld3Mgc3VjaCBhcyB3YWxrdGhyb3VnaHMgb3IgaW5zcGVjdGlvbnMuIAotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRDaGVja2xpc3QoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ2hlY2tsaXN0IGV4dGVuZHMgR3VpZGFuY2UgewotfSAvLyBDaGVja2xpc3QKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvQ2xhc3NpZmllci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9DbGFzc2lmaWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyN2E4NGMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9DbGFzc2lmaWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5DbGFzc2lmaWVyPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogVU1MIDIuMCBtZXRhLWNsYXNzIENsYXNzaWZpZXIuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5DbGFzc2lmaWVyI2dldElzQWJzdHJhY3QgPGVtPklzIEFic3RyYWN0PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0Q2xhc3NpZmllcigpCi0gKiBAbW9kZWwgYWJzdHJhY3Q9InRydWUiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ2xhc3NpZmllciBleHRlbmRzIFR5cGUgewotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SXMgQWJzdHJhY3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iZmFsc2UiPC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPklzIEFic3RyYWN0PC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPklzIEFic3RyYWN0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRJc0Fic3RyYWN0KEJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0Q2xhc3NpZmllcl9Jc0Fic3RyYWN0KCkKLQkgKiBAbW9kZWwgZGVmYXVsdD0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLkJvb2xlYW4iIHJlcXVpcmVkPSJ0cnVlIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQm9vbGVhbiBnZXRJc0Fic3RyYWN0KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkNsYXNzaWZpZXIjZ2V0SXNBYnN0cmFjdCA8ZW0+SXMgQWJzdHJhY3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPklzIEFic3RyYWN0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRJc0Fic3RyYWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRJc0Fic3RyYWN0KEJvb2xlYW4gdmFsdWUpOwotfSAvLyBDbGFzc2lmaWVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0NvbXBvc2l0ZVJvbGUuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvQ29tcG9zaXRlUm9sZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMTg5MWMwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvQ29tcG9zaXRlUm9sZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Db21wb3NpdGUgUm9sZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEEgQ29tcG9zaXRlIFJvbGUgaXMgYSBzcGVjaWFsIFJvbGUgRGVzY3JpcHRvciB0aGF0IHJlbGF0ZXMgdG8gbW9yZSB0aGVuIG9uZSBSb2xlLiAgSXQgcmVwcmVzZW50cyBhIGdyb3VwaW5nIG9mIFJvbGVzIHdpdGggdGhlIG1haW4gcHVycG9zZSBvZiBzaW1wbGlmaWNhdGlvbiwgaS5lLiByZWR1Y2luZyB0aGUgbnVtYmVyIG9mIHJvbGVzIGZvciBhIHByb2Nlc3MuCi0gKiBBIENvbXBvc2l0ZSBSb2xlIGlzIGEgZ3JvdXBpbmcgb2YgUm9sZXMgdGhhdCBjYW4gYmUgdXNlZCBpbiBhbiBBY3Rpdml0eSBvciBQcm9jZXNzIHRvIHJlZHVjZSB0aGUgbnVtYmVyIG9mIFJvbGVzLiAgQSB0eXBpY2FsIGFwcGxpY2F0aW9uIHdvdWxkIGJlIGEgcHJvY2VzcyBmb3IgYSBzbWFsbCB0ZWFtIGluIHdoaWNoIGEgc3RhbmRhcmQgc2V0IG9mIHJvbGVzIGZyb20gdGhlIG1ldGhvZCBjb250ZW50IHdvdWxkIGJlIGFsbCBwZXJmb3JtZWQgYnkgb25lIG9yIG1vcmUgcmVzb3VyY2UuICBCeSB1c2luZyBDb21wb3NpdGUgUm9sZSB0aGUgcHJvY2VzcyB3b3VsZCBzdWdnZXN0IGEgdHlwaWNhbCBjbHVzdGVyaW5nIG9mIFJvbGVzIHRvIFJlc291cmNlcy4gIEEgQ29tcG9zaXRlIFJvbGUgY291bGQgcGVyZm9ybSBhbGwgVGFza3MgZGVmaW5lZCBmb3IgdGhlIFJvbGVzIGl0IHJlZmVycyB0by4KLSAqIAotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQ29tcG9zaXRlUm9sZSNnZXRBZ2dyZWdhdGVkUm9sZXMgPGVtPkFnZ3JlZ2F0ZWQgUm9sZXM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRDb21wb3NpdGVSb2xlKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIENvbXBvc2l0ZVJvbGUgZXh0ZW5kcyBSb2xlRGVzY3JpcHRvciB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QWdncmVnYXRlZCBSb2xlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5BZ2dyZWdhdGVkIFJvbGVzPC9lbT4nIHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QWdncmVnYXRlZCBSb2xlczwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRDb21wb3NpdGVSb2xlX0FnZ3JlZ2F0ZWRSb2xlcygpCi0JICogQG1vZGVsIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0PFJvbGU+IGdldEFnZ3JlZ2F0ZWRSb2xlcygpOwotCi19IC8vIENvbXBvc2l0ZVJvbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvQ29uY2VwdC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9Db25jZXB0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwOTIxMzQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9Db25jZXB0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Db25jZXB0PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQSBDb25jZXB0IGlzIGEgc3BlY2lmaWMgdHlwZSBvZiBndWlkYW5jZSB0aGF0IG91dGxpbmVzIGtleSBpZGVhcyBhc3NvY2lhdGVkIHdpdGggYmFzaWMgcHJpbmNpcGxlcyB1bmRlcmx5aW5nIHRoZSByZWZlcmVuY2VkIGl0ZW0uIENvbmNlcHRzIG5vcm1hbGx5IGFkZHJlc3MgbW9yZSBnZW5lcmFsIHRvcGljcyB0aGFuIEd1aWRlbGluZXMgYW5kIHNwYW4gYWNyb3NzIHNldi1lcmFsIHdvcmsgcHJvZHVjdCBhbmQvb3IgdGFza3MvYWN0aXZpdGllcy4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0Q29uY2VwdCgpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBDb25jZXB0IGV4dGVuZHMgR3VpZGFuY2UgewotfSAvLyBDb25jZXB0CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0NvbnN0cmFpbnQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvQ29uc3RyYWludC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZGU5ZWFiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvQ29uc3RyYWludC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Q29uc3RyYWludDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEEgQ29uc3RyYWludCBpcyBhIE1ldGhvZCBFbGVtZW50IHRoYXQgcmVwcmVzZW50cyBhIGNvbmRpdGlvbiBvciByZXN0cmljdGlvbiBleHByZXNzZWQgaW4gbmF0dXJhbCBsYW5ndWFnZSB0ZXh0IG9yIGluIGEgbWFjaGluZSByZWFkYWJsZSBsYW5ndWFnZSBmb3IgdGhlIHB1cnBvc2Ugb2YgZGVjbGFyaW5nIHNvbWUgb2YgdGhlIHNlbWFudGljcyBvZiBhIE1ldGhvZCBFbGVtZW50LgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQ29uc3RyYWludCNnZXRCb2R5IDxlbT5Cb2R5PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0Q29uc3RyYWludCgpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBDb25zdHJhaW50IGV4dGVuZHMgTWV0aG9kRWxlbWVudCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Qm9keTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiIiPC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoaXMgYXR0cmlidXRlIHN0b3JlcyB0aGUgZGVmaW5pdGlvbiBvZiB0aGUgY29uc3RyYWludC4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Qm9keTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0Qm9keShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0Q29uc3RyYWludF9Cb2R5KCkKLQkgKiBAbW9kZWwgZGVmYXVsdD0iIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5TdHJpbmciIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0Qm9keSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db25zdHJhaW50I2dldEJvZHkgPGVtPkJvZHk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkJvZHk8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEJvZHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEJvZHkoU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBDb25zdHJhaW50CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0NvbnRlbnRDYXRlZ29yeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9Db250ZW50Q2F0ZWdvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzViMTNhMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0NvbnRlbnRDYXRlZ29yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Q29udGVudCBDYXRlZ29yeTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIENvbnRlbnQgQ2F0ZWdvcnkgaXMgYW4gYWJzdHJhY3QgY2xhc3MgZ2VuZXJhbGl6aW5nIGNvbnRlbnQgY2F0ZWdvcnkgdHlwZXMuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldENvbnRlbnRDYXRlZ29yeSgpCi0gKiBAbW9kZWwgYWJzdHJhY3Q9InRydWUiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ29udGVudENhdGVnb3J5IGV4dGVuZHMgQ29udGVudEVsZW1lbnQgewotfSAvLyBDb250ZW50Q2F0ZWdvcnkKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvQ29udGVudERlc2NyaXB0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0NvbnRlbnREZXNjcmlwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNmQ1OGU5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvQ29udGVudERlc2NyaXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Db250ZW50IERlc2NyaXB0aW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQ29udGVudCBEZXNjcmlwdGlvbiBpcyBhIE1ldGhvZCBFbGVtZW50IHRoYXQgaXMgdXNlZCB0byBzdG9yZSB0aGUgdGV4dHVhbCBkZXNjcmlwdGlvbiBmb3IgYSBDb250ZW50IEVsZW1lbnQuICBJdCBkZWZpbmVzIHN0YW5kYXJkIGF0dHJpYnV0ZXMgYXBwbGljYWJsZSBmb3IgYWxsIENvbnRlbnQgRWxlbWVudCB0eXBlcy4gIFNwZWNpZmljIENvbnRlbnQgRWxlbWVudCBzdWItdHlwZXMgY2FuIGRlZmluZSB0aGVpciBvd24gbWF0Y2hpbmcgQ29udGVudCBEZXNjcmlwdGlvbiBzdWItdHlwZXMuIAotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudERlc2NyaXB0aW9uI2dldE1haW5EZXNjcmlwdGlvbiA8ZW0+TWFpbiBEZXNjcmlwdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RGVzY3JpcHRpb24jZ2V0U2VjdGlvbnMgPGVtPlNlY3Rpb25zPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnREZXNjcmlwdGlvbiNnZXRFeHRlcm5hbElkIDxlbT5FeHRlcm5hbCBJZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RGVzY3JpcHRpb24jZ2V0S2V5Q29uc2lkZXJhdGlvbnMgPGVtPktleSBDb25zaWRlcmF0aW9uczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RGVzY3JpcHRpb24jZ2V0TG9uZ1ByZXNlbnRhdGlvbk5hbWUgPGVtPkxvbmcgUHJlc2VudGF0aW9uIE5hbWU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRDb250ZW50RGVzY3JpcHRpb24oKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ29udGVudERlc2NyaXB0aW9uIGV4dGVuZHMgTWV0aG9kVW5pdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TWFpbiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiIiPC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoaXMgYXR0cmlidXRlIHN0b3JlIHRoZSBtYWluIGRlc2NyaXB0aXZlIHRleHQgZm9yIHRoZSBDb250ZW50IEVsZW1lbnQuICBBbGwgdGV4dCB0aGF0IGlzIG5vdCBwYXJ0IG9mIGFueSBvZiB0aGUgbW9yZSBzcGVjaWZpYyBhdHRyaWJ1dGVzIHNoYWxsIGJlIHN0b3JlZCBoZXJlLiAgSWYgdGhlIENvbnRlbnQgRGVzY3JpcHRpb24gaXMgZGl2aWRlZCBpbnRvIHNlY3Rpb25zIHVzaW5nIHRoZSBTZWN0aW9uIGNsYXNzLCB0aGVuIG9ubHkgdGhlIHRleHQgZnJvbSB0aGUgJ3N0YXJ0JyBvZiB0aGUgY29udGVudCBkZXNjcmlwdGlvbiB0byB0aGUgZmlyc3Qgc2VjdGlvbiB3aWxsIGJlIHN0b3JlZCBoZXJlIChzaW1pbGFyIHRvIGEgbm9ybWFsIGRvY3VtZW50IHdoZXJlIHlvdSBjYW4gcGxhY2UgdGV4dCBiZXR3ZWVuIGl0cyBiZWdpbm5pbmcgdG8gaXRzIGZpcnN0IGRpY3Rpb24gaGVhZGluZykuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1haW4gRGVzY3JpcHRpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldE1haW5EZXNjcmlwdGlvbihTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0Q29udGVudERlc2NyaXB0aW9uX01haW5EZXNjcmlwdGlvbigpCi0JICogQG1vZGVsIGRlZmF1bHQ9IiIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuU3RyaW5nIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldE1haW5EZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RGVzY3JpcHRpb24jZ2V0TWFpbkRlc2NyaXB0aW9uIDxlbT5NYWluIERlc2NyaXB0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5NYWluIERlc2NyaXB0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRNYWluRGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldE1haW5EZXNjcmlwdGlvbihTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U2VjdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlNlY3Rpb259LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U2VjdGlvbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TZWN0aW9uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRDb250ZW50RGVzY3JpcHRpb25fU2VjdGlvbnMoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9InRydWUiIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0PFNlY3Rpb24+IGdldFNlY3Rpb25zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FeHRlcm5hbCBJZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiIiPC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIEFuIGV4dGVybmFsIHZpc2libGUgbnVtYmVyIG9yIGxhYmVsIHRoYXQgaXMgdXNlZCB0byByZWZlcmVuY2UgdGhpcyBlbGVtZW50LiBVc2VkIGxpa2UgYSBzeW5vbnltIHRvIHRoZSBuYW1lLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FeHRlcm5hbCBJZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0RXh0ZXJuYWxJZChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0Q29udGVudERlc2NyaXB0aW9uX0V4dGVybmFsSWQoKQotCSAqIEBtb2RlbCBkZWZhdWx0PSIiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLlN0cmluZyIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRFeHRlcm5hbElkKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnREZXNjcmlwdGlvbiNnZXRFeHRlcm5hbElkIDxlbT5FeHRlcm5hbCBJZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RXh0ZXJuYWwgSWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEV4dGVybmFsSWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEV4dGVybmFsSWQoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPktleSBDb25zaWRlcmF0aW9uczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiIiPC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIEtleSBDb25zaWRlcmF0aW9ucyBwcm92aWRlcyBhZHZpc2UgYW5kIGd1aWRhbmNlIG9mIGEgY3JpdGljYWwgbmF0dXJlIGZvciB0aGUgY29udGVudCBlbGVtZW50IGFzIHdlbGwgYXMgd2FybmluZ3MsIGNhdXRpb25zLCBwaXRmYWxscywgZGFuZ2Vycy4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+S2V5IENvbnNpZGVyYXRpb25zPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRLZXlDb25zaWRlcmF0aW9ucyhTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0Q29udGVudERlc2NyaXB0aW9uX0tleUNvbnNpZGVyYXRpb25zKCkKLQkgKiBAbW9kZWwgZGVmYXVsdD0iIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5TdHJpbmciIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0S2V5Q29uc2lkZXJhdGlvbnMoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudERlc2NyaXB0aW9uI2dldEtleUNvbnNpZGVyYXRpb25zIDxlbT5LZXkgQ29uc2lkZXJhdGlvbnM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPktleSBDb25zaWRlcmF0aW9uczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0S2V5Q29uc2lkZXJhdGlvbnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEtleUNvbnNpZGVyYXRpb25zKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Mb25nIFByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Mb25nIFByZXNlbnRhdGlvbiBOYW1lPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkxvbmcgUHJlc2VudGF0aW9uIE5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldExvbmdQcmVzZW50YXRpb25OYW1lKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRDb250ZW50RGVzY3JpcHRpb25fTG9uZ1ByZXNlbnRhdGlvbk5hbWUoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5TdHJpbmciIHJlcXVpcmVkPSJ0cnVlIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldExvbmdQcmVzZW50YXRpb25OYW1lKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnREZXNjcmlwdGlvbiNnZXRMb25nUHJlc2VudGF0aW9uTmFtZSA8ZW0+TG9uZyBQcmVzZW50YXRpb24gTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TG9uZyBQcmVzZW50YXRpb24gTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0TG9uZ1ByZXNlbnRhdGlvbk5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldExvbmdQcmVzZW50YXRpb25OYW1lKFN0cmluZyB2YWx1ZSk7Ci0KLX0gLy8gQ29udGVudERlc2NyaXB0aW9uCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0NvbnRlbnRFbGVtZW50LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0NvbnRlbnRFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzYzM0YTQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9Db250ZW50RWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Q29udGVudCBFbGVtZW50PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQ29udGVudCBFbGVtZW50IGlzIGEgRGVzY3JpYmFibGUgRWxlbWVudCB0aGF0IHJlcHJlc2VudHMgYW4gYWJzdHJhY3QgZ2VuZXJhbGl6YXRpb24gZm9yIGFsbCBlbGVtZW50cyB0aGF0IGFyZSBjb25zaWRlcmVkIHRvIGJlIGFuZCBtYW5hZ2VkIGFzIE1ldGhvZCBDb250ZW50LgotICogQ29udGVudCBFbGVtZW50cyByZXByZXNlbnRzIHJldXNhYmxlIE1ldGhvZCBDb250ZW50IHRoYXQgaXMgc3VwcG9zZWQgdG8gYmUgbWFuYWdlZCBpbiBDb250ZW50IFBhY2thZ2VzLiAgVGhlIHNlcGFyYXRpb24gb2YgQ29udGVudCBFbGVtZW50IGZyb20gUHJvY2VzcyBFbGVtZW50IGFsbG93cyB0byBjbGVhcmx5IGRpc3Rpbmd1aXNoIGJldHdlZW4gcHVyZSBtZXRob2QgY29udGVudCBmcm9tIGNvbnRlbnQgdGhhdCBpcyByZXByZXNlbnRlZCBpbiBwcm9jZXNzZXMuCi0gKiAKLSAqIFRoaXMgaXMgdGhlIEd1aWRhbmNlIFR5cGVzIHBhY2thZ2UncyBleHRlbnNpb24gb2YgQ29udGVudCBFbGVtZW50IChkZWZpbmVkIGluIENvbnRlbnQgRWxlbWVudHMpIHByb3ZpZGluZyBhZGRpdG9uYWwgYXNzb2NpYXRpb25zLgotICogQ29udGVudCBFbGVtZW50IGluIHRoZSBwYWNrYWdlIE1ldGhvZCBQbHVnaW4gaW5oZXJpdHMgZnJvbSBWYXJpYWJpbGl0eSBFbGVtZW50IGFuZCBub3QgZGlyZWN0bHkgZnJvbSBNZXRob2QgRWxlbWVudCBhbnltb3JlLiAgVGhpcyBpcyBhY2hpZXZlZCB1c2luZyBVTUwgMi4wIHBhY2thZ2UgbWVyZ2Ugc2VtYW50aWNzLiAgT25seSBpZiBhbiBhZG9wdGVyIG9mIHRoaXMgbWV0YS1tb2RlbCBkZWNpZGVzIHRvIHJlYWxpemUgTWV0aG9kIFBsdWdpbnMsIGhlIHdvdWxkIGdldCB0aGUgdmFyaWFiaWxpdHkgYW5kIGV4dGVuc2lvbiBjYXBhYmlsaXRpZXMgZm9yIGFsbCBDb250ZW50IEVsZW1lbnRzLgotICogQ29udGVudCBFbGVtZW50IGluaGVyaXRzIHRoZSBzZW1hbnRpY3Mgb2YgVmFyaWFiaWxpdHkgRWxlbWVudC4KLSAqIAotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudEVsZW1lbnQjZ2V0U3VwcG9ydGluZ01hdGVyaWFscyA8ZW0+U3VwcG9ydGluZyBNYXRlcmlhbHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudEVsZW1lbnQjZ2V0Q29uY2VwdHNBbmRQYXBlcnMgPGVtPkNvbmNlcHRzIEFuZCBQYXBlcnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudEVsZW1lbnQjZ2V0Q2hlY2tsaXN0cyA8ZW0+Q2hlY2tsaXN0czwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RWxlbWVudCNnZXRHdWlkZWxpbmVzIDxlbT5HdWlkZWxpbmVzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRFbGVtZW50I2dldEV4YW1wbGVzIDxlbT5FeGFtcGxlczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RWxlbWVudCNnZXRBc3NldHMgPGVtPkFzc2V0czwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RWxlbWVudCNnZXRUZXJtZGVmaW5pdGlvbiA8ZW0+VGVybWRlZmluaXRpb248L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRDb250ZW50RWxlbWVudCgpCi0gKiBAbW9kZWwgYWJzdHJhY3Q9InRydWUiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ29udGVudEVsZW1lbnQgZXh0ZW5kcyBEZXNjcmliYWJsZUVsZW1lbnQsIFZhcmlhYmlsaXR5RWxlbWVudCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U3VwcG9ydGluZyBNYXRlcmlhbHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlN1cHBvcnRpbmdNYXRlcmlhbH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5TdXBwb3J0aW5nIE1hdGVyaWFsczwvZW0+JyByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlN1cHBvcnRpbmcgTWF0ZXJpYWxzPC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldENvbnRlbnRFbGVtZW50X1N1cHBvcnRpbmdNYXRlcmlhbHMoKQotCSAqIEBtb2RlbCBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdDxTdXBwb3J0aW5nTWF0ZXJpYWw+IGdldFN1cHBvcnRpbmdNYXRlcmlhbHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNvbmNlcHRzIEFuZCBQYXBlcnM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbmNlcHR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q29uY2VwdHMgQW5kIFBhcGVyczwvZW0+JyByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNvbmNlcHRzIEFuZCBQYXBlcnM8L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0Q29udGVudEVsZW1lbnRfQ29uY2VwdHNBbmRQYXBlcnMoKQotCSAqIEBtb2RlbCBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdDxDb25jZXB0PiBnZXRDb25jZXB0c0FuZFBhcGVycygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q2hlY2tsaXN0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQ2hlY2tsaXN0fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNoZWNrbGlzdHM8L2VtPicgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5DaGVja2xpc3RzPC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldENvbnRlbnRFbGVtZW50X0NoZWNrbGlzdHMoKQotCSAqIEBtb2RlbCBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdDxDaGVja2xpc3Q+IGdldENoZWNrbGlzdHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkd1aWRlbGluZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkd1aWRlbGluZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5HdWlkZWxpbmVzPC9lbT4nIHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+R3VpZGVsaW5lczwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRDb250ZW50RWxlbWVudF9HdWlkZWxpbmVzKCkKLQkgKiBAbW9kZWwgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3Q8R3VpZGVsaW5lPiBnZXRHdWlkZWxpbmVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FeGFtcGxlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRXhhbXBsZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5FeGFtcGxlczwvZW0+JyByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkV4YW1wbGVzPC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldENvbnRlbnRFbGVtZW50X0V4YW1wbGVzKCkKLQkgKiBAbW9kZWwgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3Q8RXhhbXBsZT4gZ2V0RXhhbXBsZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkFzc2V0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUmV1c2FibGVBc3NldH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Bc3NldHM8L2VtPicgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Bc3NldHM8L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0Q29udGVudEVsZW1lbnRfQXNzZXRzKCkKLQkgKiBAbW9kZWwgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3Q8UmV1c2FibGVBc3NldD4gZ2V0QXNzZXRzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5UZXJtZGVmaW5pdGlvbjwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVGVybURlZmluaXRpb259LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VGVybWRlZmluaXRpb248L2VtPicgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5UZXJtZGVmaW5pdGlvbjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRDb250ZW50RWxlbWVudF9UZXJtZGVmaW5pdGlvbigpCi0JICogQG1vZGVsIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0PFRlcm1EZWZpbml0aW9uPiBnZXRUZXJtZGVmaW5pdGlvbigpOwotCi19IC8vIENvbnRlbnRFbGVtZW50CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0NvbnRlbnRQYWNrYWdlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0NvbnRlbnRQYWNrYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxYmFhNGEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9Db250ZW50UGFja2FnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Db250ZW50IFBhY2thZ2U8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIENvbnRlbnQgUGFja2FnZSBpcyBzcGVjaWFsIE1ldGhvZCBQYWNrYWdlIHRoYXQgY29udGFpbnMgQ29udGVudCBFbGVtZW50cyBhbmQgQ29udGVudCBFbGVtZW50cywgb25seS4gIEV4YW1wbGVzIGZvciBDb250ZW50IEVsZW1lbnQgYXJlIEFydGlmYWN0cywgVGFza3MsIFJvbGVzLCBldGMuICBBIGtleSBzZXBhcmF0aW9uIG9mIGNvbmNlcm5zIGluIFVNQSBpcyB0aGUgZGlzdGluY3Rpb24gYmV0d2VlbiBNZXRob2QgQ29udGVudCBhbmQgUHJvY2Vzcy4gIFRoaXMgc2VwYXJhdGlvbiBpcyBlbmZvcmNlZCBieSBzcGVjaWFsIHBhY2thZ2UgdHlwZXMsIHdoaWNoIGRvIG5vdCBhbGxvdyB0aGUgbWl4aW5nIG9mIG1ldGhvZCBjb250ZW50IHdpdGggcHJvY2Vzc2VzLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudFBhY2thZ2UjZ2V0Q29udGVudEVsZW1lbnRzIDxlbT5Db250ZW50IEVsZW1lbnRzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0Q29udGVudFBhY2thZ2UoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ29udGVudFBhY2thZ2UgZXh0ZW5kcyBNZXRob2RQYWNrYWdlIHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Db250ZW50IEVsZW1lbnRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RWxlbWVudH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Db250ZW50IEVsZW1lbnRzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q29udGVudCBFbGVtZW50czwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRDb250ZW50UGFja2FnZV9Db250ZW50RWxlbWVudHMoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9InRydWUiIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0PENvbnRlbnRFbGVtZW50PiBnZXRDb250ZW50RWxlbWVudHMoKTsKLQotfSAvLyBDb250ZW50UGFja2FnZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9Db3JlU2VtYW50aWNNb2RlbEJyaWRnZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9Db3JlU2VtYW50aWNNb2RlbEJyaWRnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOGI5YjVlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvQ29yZVNlbWFudGljTW9kZWxCcmlkZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWE7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkNvcmUgU2VtYW50aWMgTW9kZWwgQnJpZGdlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQ29yZVNlbWFudGljTW9kZWxCcmlkZ2UjZ2V0RWxlbWVudCA8ZW0+RWxlbWVudDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldENvcmVTZW1hbnRpY01vZGVsQnJpZGdlKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIENvcmVTZW1hbnRpY01vZGVsQnJpZGdlIGV4dGVuZHMgU2VtYW50aWNNb2RlbEJyaWRnZSB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RWxlbWVudDwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RWxlbWVudDwvZW0+JyByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FbGVtZW50PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRFbGVtZW50KEVsZW1lbnQpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0Q29yZVNlbWFudGljTW9kZWxCcmlkZ2VfRWxlbWVudCgpCi0JICogQG1vZGVsIHJlcXVpcmVkPSJ0cnVlIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRWxlbWVudCBnZXRFbGVtZW50KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkNvcmVTZW1hbnRpY01vZGVsQnJpZGdlI2dldEVsZW1lbnQgPGVtPkVsZW1lbnQ8L2VtPn0nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkVsZW1lbnQ8L2VtPicgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldEVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEVsZW1lbnQoRWxlbWVudCB2YWx1ZSk7Ci0KLX0gLy8gQ29yZVNlbWFudGljTW9kZWxCcmlkZ2UKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvQ3VzdG9tQ2F0ZWdvcnkuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvQ3VzdG9tQ2F0ZWdvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODMzMzk4YS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0N1c3RvbUNhdGVnb3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkN1c3RvbSBDYXRlZ29yeTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEEgQ3VzdG9tIENhdGVnb3J5IGlzIGEgY2F0ZWdvcnkgaW50cm9kdWNlZCBieSBhIG1ldGhvZCBjb250ZW50IGF1dGhvciB0byBzdHJ1Y3R1cmUgYW55IG51bWJlciBvZiBtZXRob2QgQ29udGVudCBFbGVtZW50cyBvZiBhbnkgc3VidHlwZSBiYXNlZCBvbiB1c2VyLWRlZmluZWQgY3JpdGVyaWEuICBCZWNhdXNlIENvbnRlbnQgQ2F0ZWdvcmllcyAoYW5kIHRoZXJlZm9yZSBDdXN0b20gQ2F0ZWdvcmllcywgdG9vKSBhcmUgQ29udGVudCBFbGVtZW50cyB0aGVtc2VsdmVzLCBDdXN0b20gQ2F0ZWdvcmllcyBjYW4gYmUgdXNlZCB0byByZWN1cnNpdmVseSBjYXRlZ29yaXplIENvbnRlbnQgQ2F0ZWdvcmllcyBhcyB3ZWxsLiAgQ3VzdG9tIENhdGVnb3JpZXMgY2FuIGFsc28gYmUgbmVzdGVkIHdpdGggYW55IENvbnRlbnQgQ2F0ZWdvcnkuICBDdXN0b20gY2F0ZWdvcmllcyBjYW4gYmUgdXNlZCB0byBjYXRlZ29yaXplIGNvbnRlbnQgYmFzZWQgb24gdGhlIHVzZXIncyBjcml0ZXJpYSBhcyB3ZWxsIGFzIHRvIGRlZmluZSB3aG9sZSB0cmVlLXN0cnVjdHVyZXMgb2YgbmVzdGVkIGNhdGVnb3JpZXMgYWxsb3dpbmcgdGhlIHVzZXIgdG8gc3lzdGVtYXRpY2FsbHkgbmF2aWdhdGUgYW5kIGJyb3dzZSBtZXRob2QgY29udGVudCBhbmQgcHJvY2Vzc2VzIGJhc2VkIG9uIHRoZXNlIGNhdGVnb3JpZXMuICBGb3IgZXhhbXBsZSwgb25lIGNvdWxkIGNyZWF0ZSBhIGN1c3RvbSBjYXRlZ29yeSB0byBsb2dpY2FsbHkgb3JnYW5pemUgY29udGVudCByZWxldmFudCBmb3IgdGhlIHVzZXIncyBkZXZlbG9wbWVudCBvcmdhbml6YXRpb24gZGVwYXJ0bWVudHM7IGUuZy4gYSAiVGVzdGluZyIgY2F0ZWdvcnkgdGhhdCBncm91cHMgdG9nZXRoZXIgYWxsIHJvbGVzLCB3b3JrIHByb2R1Y3RzLCB0YXNrcywgYW5kIGd1aWRhbmNlIGVsZW1lbnQgcmVsZXZhbnQgdG8gdGVzdGluZy4gIEFub3RoZXIgZXhhbXBsZSB3b3VsZCBiZSBjYXRlZ29yaWVzIHRoYXQgZXhwcmVzcyBsaWNlbnNpbmcgbGV2ZWxzIG9mIHRoZSBjb250ZW50IGdyb3VwaW5nIGZyZWVseSBkaXN0cmlidXRhYmxlIG1ldGhvZCBjb250ZW50IHZlcnN1cyBjb250ZW50IHRoYXQgcmVwcmVzZW50IGludGVsbGVjdHVhbCBwcm9wZXJ0eSBhbmQgcmVxdWlyZXMgYSBsaWNlbnNlIHRvIGJlIHB1cmNoYXNlZCB0byBiZSBhYmxlIHRvIHVzZSBpdC4KLSAqIAotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQ3VzdG9tQ2F0ZWdvcnkjZ2V0Q2F0ZWdvcml6ZWRFbGVtZW50cyA8ZW0+Q2F0ZWdvcml6ZWQgRWxlbWVudHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQ3VzdG9tQ2F0ZWdvcnkjZ2V0U3ViQ2F0ZWdvcmllcyA8ZW0+U3ViIENhdGVnb3JpZXM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRDdXN0b21DYXRlZ29yeSgpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBDdXN0b21DYXRlZ29yeSBleHRlbmRzIENvbnRlbnRDYXRlZ29yeSB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q2F0ZWdvcml6ZWQgRWxlbWVudHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaWJhYmxlRWxlbWVudH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5DYXRlZ29yaXplZCBFbGVtZW50czwvZW0+JyByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNhdGVnb3JpemVkIEVsZW1lbnRzPC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldEN1c3RvbUNhdGVnb3J5X0NhdGVnb3JpemVkRWxlbWVudHMoKQotCSAqIEBtb2RlbCBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdDxEZXNjcmliYWJsZUVsZW1lbnQ+IGdldENhdGVnb3JpemVkRWxlbWVudHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlN1YiBDYXRlZ29yaWVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50Q2F0ZWdvcnl9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U3ViIENhdGVnb3JpZXM8L2VtPicgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TdWIgQ2F0ZWdvcmllczwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRDdXN0b21DYXRlZ29yeV9TdWJDYXRlZ29yaWVzKCkKLQkgKiBAbW9kZWwgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3Q8Q29udGVudENhdGVnb3J5PiBnZXRTdWJDYXRlZ29yaWVzKCk7Ci0KLX0gLy8gQ3VzdG9tQ2F0ZWdvcnkKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvRGVsaXZlcmFibGUuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvRGVsaXZlcmFibGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjNjNTgzZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0RlbGl2ZXJhYmxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkRlbGl2ZXJhYmxlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQSBkZWxpdmVyYWJsZSBpcyBhIFdvcmsgUHJvZHVjdCB0aGF0IHByb3ZpZGVzIGEgZGVzY3JpcHRpb24gYW5kIGRlZmluaXRpb24gZm9yIHBhY2thZ2luZyBvdGhlciBXb3JrIFByb2R1Y3RzLCBhbmQgbWF5IGJlIGRlbGl2ZXJlZCB0byBhbiBpbnRlcm5hbCBvciBleHRlcm5hbCBwYXJ0eS4gIFRoZXJlZm9yZSwgYSBEZWxpdmVyYWJsZSBhZ2dyZWdhdGVzIG90aGVyIFdvcmsgUHJvZHVjdHMuIFRoZXJlZm9yZSwgYSBEZWxpdmVyYWJsZSBhZ2dyZWdhdGVzIG90aGVyIFdvcmsgUHJvZHVjdHMuICBBIERlbGl2ZXJhYmxlIGlzIHVzZWQgdG8gcHJlLWRlZmluZSB0eXBpY2FsIG9yIHJlY29tbWVuZGVkIGNvbnRlbnQgaW4gdGhlIGZvcm0gb3Igd29yayBwcm9kdWN0cyB0aGF0IHdvdWxkIGJlIHBhY2thZ2VkIGZvciBkZWxpdmVyeS4gIFRoZSBhY3R1YWwgcGFja2FnaW5nIG9mIHRoZSBEZWxpdmVyYWJsZSBpbiBhbiBhY3R1YWwgcHJvY2VzcyBvciBldmVuIHByb2plY3QgY291bGQgYmUgYSBtb2RpZmljYXRpb24gb2YgdGhpcyByZWNvbW1lbmRhdGlvbi4gIERlbGl2ZXJhYmxlcyBhcmUgdXNlZCB0byByZXByZXNlbnQgYW4gb3V0cHV0IGZyb20gYSBwcm9jZXNzIHRoYXQgaGFzIHZhbHVlLCBtYXRlcmlhbCBvciBvdGhlcndpc2UsIHRvIGEgY2xpZW50LCBjdXN0b21lciBvciBvdGhlciBzdGFrZWhvbGRlci4gCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyYWJsZSNnZXREZWxpdmVyZWRXb3JrUHJvZHVjdHMgPGVtPkRlbGl2ZXJlZCBXb3JrIFByb2R1Y3RzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0RGVsaXZlcmFibGUoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRGVsaXZlcmFibGUgZXh0ZW5kcyBXb3JrUHJvZHVjdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGVsaXZlcmVkIFdvcmsgUHJvZHVjdHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkRlbGl2ZXJlZCBXb3JrIFByb2R1Y3RzPC9lbT4nIHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGVsaXZlcmVkIFdvcmsgUHJvZHVjdHM8L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0RGVsaXZlcmFibGVfRGVsaXZlcmVkV29ya1Byb2R1Y3RzKCkKLQkgKiBAbW9kZWwgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3Q8V29ya1Byb2R1Y3Q+IGdldERlbGl2ZXJlZFdvcmtQcm9kdWN0cygpOwotCi19IC8vIERlbGl2ZXJhYmxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0RlbGl2ZXJhYmxlRGVzY3JpcHRpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvRGVsaXZlcmFibGVEZXNjcmlwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NmQ5M2M0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvRGVsaXZlcmFibGVEZXNjcmlwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RGVsaXZlcmFibGUgRGVzY3JpcHRpb248L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyYWJsZURlc2NyaXB0aW9uI2dldEV4dGVybmFsRGVzY3JpcHRpb24gPGVtPkV4dGVybmFsIERlc2NyaXB0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJhYmxlRGVzY3JpcHRpb24jZ2V0UGFja2FnaW5nR3VpZGFuY2UgPGVtPlBhY2thZ2luZyBHdWlkYW5jZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldERlbGl2ZXJhYmxlRGVzY3JpcHRpb24oKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRGVsaXZlcmFibGVEZXNjcmlwdGlvbiBleHRlbmRzIFdvcmtQcm9kdWN0RGVzY3JpcHRpb24gewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkV4dGVybmFsIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+IiI8L2NvZGU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBEZWxpdmVyYWJsZSB1c2VkIGZvciBjbGllbnQgZG9jdW1lbnRzIChwcm9wb3NhbCwgc3RhdGVtZW50cyBvZiB3b3JrIG9yIGNvbnRyYWN0dWFsIGFncmVlbWVudHMpLiAgSXQgbWlnaHQgdXNlIGEgZGlmZmVyZW50IGxhbmd1YWdlIGFuZCBmb2xsb3cgbGVnYWwgY29uc3RyYWludHMuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkV4dGVybmFsIERlc2NyaXB0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRFeHRlcm5hbERlc2NyaXB0aW9uKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXREZWxpdmVyYWJsZURlc2NyaXB0aW9uX0V4dGVybmFsRGVzY3JpcHRpb24oKQotCSAqIEBtb2RlbCBkZWZhdWx0PSIiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLlN0cmluZyIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRFeHRlcm5hbERlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJhYmxlRGVzY3JpcHRpb24jZ2V0RXh0ZXJuYWxEZXNjcmlwdGlvbiA8ZW0+RXh0ZXJuYWwgRGVzY3JpcHRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkV4dGVybmFsIERlc2NyaXB0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRFeHRlcm5hbERlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRFeHRlcm5hbERlc2NyaXB0aW9uKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QYWNrYWdpbmcgR3VpZGFuY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iIjwvY29kZT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBQcm92aWRlcyBndWlkYW5jZSBvbiBob3cgdG8gYXNzZW1ibGUgdGhlIGRlbGl2ZXJhYmxlIGZyb20gYWxsIGl0cyByZXF1aXJlZCBpbnB1dHMuICBUaGlzIHNlY3Rpb24gZGVzY3JpYmVzIHRoZSBtb3N0IGNvbW1vbiBjb250ZW50IG1lZGl1bSBhbmQgZm9ybWF0LiAgRGlzdHJpYnV0aW9uIG9mIHRoZSBkZWxpdmVyYWJsZSBpcyBhZGRyZXNzZWQgaW4gdGhpcyBzZWN0aW9uLCBpZiBuZWNlc3NhcnkuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlBhY2thZ2luZyBHdWlkYW5jZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UGFja2FnaW5nR3VpZGFuY2UoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldERlbGl2ZXJhYmxlRGVzY3JpcHRpb25fUGFja2FnaW5nR3VpZGFuY2UoKQotCSAqIEBtb2RlbCBkZWZhdWx0PSIiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLlN0cmluZyIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRQYWNrYWdpbmdHdWlkYW5jZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyYWJsZURlc2NyaXB0aW9uI2dldFBhY2thZ2luZ0d1aWRhbmNlIDxlbT5QYWNrYWdpbmcgR3VpZGFuY2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlBhY2thZ2luZyBHdWlkYW5jZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UGFja2FnaW5nR3VpZGFuY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFBhY2thZ2luZ0d1aWRhbmNlKFN0cmluZyB2YWx1ZSk7Ci0KLX0gLy8gRGVsaXZlcmFibGVEZXNjcmlwdGlvbgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9EZWxpdmVyeVByb2Nlc3MuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvRGVsaXZlcnlQcm9jZXNzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxNTdlYmUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9EZWxpdmVyeVByb2Nlc3MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RGVsaXZlcnkgUHJvY2VzczwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEEgRGVsaXZlcnkgUHJvY2Vzc2VzIGlzIGEgc3BlY2lhbCBQcm9jZXNzIGRlc2NyaWJpbmcgYSBjb21wbGV0ZSBhbmQgaW50ZWdyYXRlZCBhcHByb2FjaCBmb3IgcGVyZm9ybWluZyBhIHNwZWNpZmljIHByb2plY3QgdHlwZS4gIEl0IGRlc2NyaWJlcyBhIGNvbXBsZXRlIHByb2plY3QgbGlmZWN5Y2xlIGVuZC10by1lbmQgYW5kIHNoYWxsIGJlIHVzZWQgYXMgYSByZWZlcmVuY2UgZm9yIHJ1bm5pbmcgcHJvamVjdHMgd2l0aCBzaW1pbGFyIGNoYXJhY3RlcmlzdGljcyBhcyBkZWZpbmVkIGZvciB0aGUgcHJvY2Vzcy4gIEEgRGVsaXZlcnkgUHJvY2VzcyBpcyByZWxhdGVkIHRvIHNwZWNpZmljIHN1cHBvcnRpbmcgaW5mb3JtYXRpb24gc3VjaCBhcyBSb2FkbWFwcyAoaW5oZXJpdGVkIHZpYSBBY3Rpdml0eSkgYXMgd2VsbCBhcyBDb21tdW5pY2F0aW9ucyBhbmQgRWR1Y2F0aW9uIE1hdGVyaWFsLgotICogQSBEZWxpdmVyeSBQcm9jZXNzIGlzIGEgUHJvY2VzcyB0aGF0IGNvdmVycyBhIHdob2xlIGRldmVsb3BtZW50IGxpZmVjeWNsZSBmcm9tIGJlZ2lubmluZyB0byBlbmQuICBBIERlbGl2ZXJ5IFByb2Nlc3Mgc2hhbGwgYmUgdXNlZCBhcyBhIHRlbXBsYXRlIGZvciBwbGFubmluZyBhbmQgcnVubmluZyBhIHByb2plY3QuICBJdCBwcm92aWRlcyBhIGNvbXBsZXRlIGxpZmVjeWNsZSBtb2RlbCB3aXRoIHByZWRlZmluZWQgcGhhc2VzLCBpdGVyYXRpb25zLCBhbmQgYWN0aXZpdGllcyB0aGF0IGhhdmUgYmVlbiBkZXRhaWxlZCBieSBzZXF1ZW5jaW5nIHJlZmVyZW5jaW5nIG1ldGhvZCBjb250ZW50IGluIGJyZWFrZG93biBzdHJ1Y3R1cmVzLiAgSXQgaXMgZGVmaW5lZCBvbiB0aGUgYmFzaXMgb2YgZXhwZXJpZW5jZSB3aXRoIHBhc3QgcHJvamVjdHMgb3IgZW5nYWdlbWVudHMsIGFuZC9vciB0aGUgYmVzdCBwcmFjdGljZSB1c2Ugb2YgYSBkZXZlbG9wbWVudCBvciBkZWxpdmVyeSBhcHByb2FjaC4gIEl0IGRlZmluZXMgd2hhdCBnZXRzIHByb2R1Y2VkLCBob3cgdGhvc2UgaXRlbXMgYXJlIHByb2R1Y2VkLCBhbmQgdGhlIHJlcXVpcmVkIHN0YWZmaW5nIGluIHRoZSBmb3JtIG9mIGludGVncmF0ZWQgV29yaywgV29yayBQcm9kdWN0LCBhbmQgVGVhbSBCcmVha2Rvd24gU3RydWN0dXJlcy4gIEZvciBleGFtcGxlLCBhIHByb2Nlc3MgZW5naW5lZXIgY2FuIGRlZmluZSBhbHRlcm5hdGl2ZSBEZWxpdmVyeSBQcm9jZXNzZXMgZm9yIHNvZnR3YXJlIGRldmVsb3BtZW50IHByb2plY3RzIHRoYXQgZGlmZmVyIGluIHRoZSBzY2FsZSBvZiB0aGUgZW5nYWdlbWVudCBhbmQgc3RhZmZpbmcgbmVjZXNzYXJ5LCB0aGUgdHlwZSBvZiB0aGUgc29mdHdhcmUgYXBwbGljYXRpb24gdG8gYmUgZGV2ZWxvcGVkLCB0aGUgZGV2ZWxvcG1lbnQgbWV0aG9kcyBhbmQgdGVjaG5vbG9naWVzIHRvIGJlIHVzZWQsIGV0Yy4gIEFsdGhvdWdoLCB0aGUgRGVsaXZlcnkgUHJvY2VzcyBhaW1zIHRvIGNvdmVyIGEgd2hvbGUgcHJvamVjdCBpdCBrZWVwcyBjZXJ0YWluIGRlY2lzaW9uIHRoYXQgYXJlIHRvbyBwcm9qZWN0IHNwZWNpZmljIG9wZW4uICBGb3IgZXhhbXBsZSwgdGhlIGJyZWFrZG93biBzdHJ1Y3R1cmUgZGVmaW5lcyB3aGljaCBCcmVha2Rvd24gRWxlbWVudHMgaGF2ZSBtdWx0aXBsZSBvY2N1cnJlbmNlcyBvciBpcyByZXBlYXRhYmxlIHZpYSBpdCByZXNwZWN0aXZlIGF0dHJpYnV0ZXMsIGJ1dCBkb2VzIG5vdCBzYXkgaG93IG1hbnkgb2NjdXJyZW5jZXMgYW5kIGhvdyBtYW55IHJlcGVhdHMvaXRlcmF0aW9ucyBpdCB3aWxsIGhhdmUuICBUaGVzZSBkZWNpc2lvbnMgaGF2ZSB0byBiZSBkb25lIGJ5IGEgcHJvamVjdCBtYW5hZ2VyIHdoZW4gcGxhbm5pbmcgYSBjb25jcmV0ZSBwcm9qZWN0LCBwcm9qZWN0IHBoYXNlLCBvciBwcm9qZWN0IGl0ZXJhdGlvbnMuICBBIERlbGl2ZXJ5IFByb2Nlc3MgaXMgYWx3YXlzIGEgY29tcGxldGUgZGVzY3JpcHRpb24gb2YgYSBwcm9jZXNzIGluIHRlcm1zIG9mIGNvbXBsZXRlbmVzcyBvZiB0aGUgbGlmZWN5Y2xlLCBhcyB3ZWxsIGFzIGluIHRlcm1zIG9mIGFsbCB0aHJlZSB2aWV3cyBvbiB0aGUgcHJvY2VzcyB3aGljaCBhcmUgdGhlIFdvcmsgQnJlYWtkb3duIFN0cnVjdHVyZSwgV29yayBQcm9kdWN0IEJyZWFrZG93biBTdHJ1Y3R1cmUsIGFuZCBUZWFtIEJyZWFrZG93biBTdHJ1Y3R1cmUgaGF2ZSB0byBiZSBmdWxseSBhbmQgY29uc2lzdGVudGx5IHBvcHVsYXRlZC4gIENvbnNpc3RlbmN5IG9mIGEgRGVsaXZlcnkgUHJvY2VzcyBpcyBhY3R1YWxseSBlbnN1cmVkIGJ5IHRoZSBmYWN0IHRoYXQgYWxsIHRocmVlIGJyZWFrZG93bnMgYXJlIHJlcHJlc2VudGVkIGJ5IG9uZSBzaW5nbGUgZGF0YSBzdHJ1Y3R1cmUgYW5kIG9uZSBwYXJ0aWN1bGFyIGJyZWFrZG93biBzdWNoIGFzIFRlYW0gQnJlYWtkb3duIGlzIGp1c3QgYSB2aWV3IG9uIHRoYXQgZGF0YSBzdHJ1Y3R1cmUuCi0gKiAKLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJ5UHJvY2VzcyNnZXRFZHVjYXRpb25NYXRlcmlhbHMgPGVtPkVkdWNhdGlvbiBNYXRlcmlhbHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcnlQcm9jZXNzI2dldENvbW11bmljYXRpb25zTWF0ZXJpYWxzIDxlbT5Db21tdW5pY2F0aW9ucyBNYXRlcmlhbHM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXREZWxpdmVyeVByb2Nlc3MoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRGVsaXZlcnlQcm9jZXNzIGV4dGVuZHMgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzIHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FZHVjYXRpb24gTWF0ZXJpYWxzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5TdXBwb3J0aW5nTWF0ZXJpYWx9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RWR1Y2F0aW9uIE1hdGVyaWFsczwvZW0+JyByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkVkdWNhdGlvbiBNYXRlcmlhbHM8L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0RGVsaXZlcnlQcm9jZXNzX0VkdWNhdGlvbk1hdGVyaWFscygpCi0JICogQG1vZGVsIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0PFN1cHBvcnRpbmdNYXRlcmlhbD4gZ2V0RWR1Y2F0aW9uTWF0ZXJpYWxzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Db21tdW5pY2F0aW9ucyBNYXRlcmlhbHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlN1cHBvcnRpbmdNYXRlcmlhbH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Db21tdW5pY2F0aW9ucyBNYXRlcmlhbHM8L2VtPicgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Db21tdW5pY2F0aW9ucyBNYXRlcmlhbHM8L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0RGVsaXZlcnlQcm9jZXNzX0NvbW11bmljYXRpb25zTWF0ZXJpYWxzKCkKLQkgKiBAbW9kZWwgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3Q8U3VwcG9ydGluZ01hdGVyaWFsPiBnZXRDb21tdW5pY2F0aW9uc01hdGVyaWFscygpOwotCi19IC8vIERlbGl2ZXJ5UHJvY2VzcwpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYTRhYzFjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5EZWxpdmVyeSBQcm9jZXNzIERlc2NyaXB0aW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24jZ2V0U2NhbGUgPGVtPlNjYWxlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uI2dldFByb2plY3RDaGFyYWN0ZXJpc3RpY3MgPGVtPlByb2plY3QgQ2hhcmFjdGVyaXN0aWNzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uI2dldFJpc2tMZXZlbCA8ZW0+UmlzayBMZXZlbDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbiNnZXRFc3RpbWF0aW5nVGVjaG5pcXVlIDxlbT5Fc3RpbWF0aW5nIFRlY2huaXF1ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbiNnZXRQcm9qZWN0TWVtYmVyRXhwZXJ0aXNlIDxlbT5Qcm9qZWN0IE1lbWJlciBFeHBlcnRpc2U8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24jZ2V0VHlwZU9mQ29udHJhY3QgPGVtPlR5cGUgT2YgQ29udHJhY3Q8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXREZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbigpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBEZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbiBleHRlbmRzIFByb2Nlc3NEZXNjcmlwdGlvbiB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U2NhbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iIjwvY29kZT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBPdXRsaW5lcyBjaGFyYWN0ZXJpc3RpY3MgYWJvdXQgdGhlIHNpemUgb2YgYSB0eXBpY2FsIHByb2plY3QgdGhhdCBwZXJmb3JtcyB0aGlzIHByb2plY3QgZXhwcmVzc2VkIGluIHRlYW0gc2l6ZSwgbWFuIHllYXJzLCBldGMuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlNjYWxlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRTY2FsZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fU2NhbGUoKQotCSAqIEBtb2RlbCBkZWZhdWx0PSIiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLlN0cmluZyIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRTY2FsZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbiNnZXRTY2FsZSA8ZW0+U2NhbGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlNjYWxlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRTY2FsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0U2NhbGUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlByb2plY3QgQ2hhcmFjdGVyaXN0aWNzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+IiI8L2NvZGU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogQ2hhcmFjdGVyaXplcyB0aGUgcHJvamVjdCB0aGF0IHdvdWxkIHR5cGljYWxseSBwZXJmb3JtIHRoaXMgUHJvY2VzcwotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Qcm9qZWN0IENoYXJhY3RlcmlzdGljczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UHJvamVjdENoYXJhY3RlcmlzdGljcyhTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fUHJvamVjdENoYXJhY3RlcmlzdGljcygpCi0JICogQG1vZGVsIGRlZmF1bHQ9IiIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuU3RyaW5nIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFByb2plY3RDaGFyYWN0ZXJpc3RpY3MoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24jZ2V0UHJvamVjdENoYXJhY3RlcmlzdGljcyA8ZW0+UHJvamVjdCBDaGFyYWN0ZXJpc3RpY3M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlByb2plY3QgQ2hhcmFjdGVyaXN0aWNzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRQcm9qZWN0Q2hhcmFjdGVyaXN0aWNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRQcm9qZWN0Q2hhcmFjdGVyaXN0aWNzKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SaXNrIExldmVsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+IiI8L2NvZGU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogT3V0bGluZXMgdHlwaWNhbCBwcm9qZWN0IHJpc2tzIHRoYXQgYXJlIGFkZHJlc3NlZCB3aXRoIHRoaXMgcHJvY2Vzcy4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmlzayBMZXZlbDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0Umlza0xldmVsKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXREZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl9SaXNrTGV2ZWwoKQotCSAqIEBtb2RlbCBkZWZhdWx0PSIiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLlN0cmluZyIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRSaXNrTGV2ZWwoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24jZ2V0Umlza0xldmVsIDxlbT5SaXNrIExldmVsPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5SaXNrIExldmVsPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRSaXNrTGV2ZWwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFJpc2tMZXZlbChTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RXN0aW1hdGluZyBUZWNobmlxdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iIjwvY29kZT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBEZXNjcmliZXMgdGhlIEVzdGltYXRpb24gVGVjaG5pcXVlcyBwcm92aWRlZCBmb3IgdGhpcyBQcm9jZXNzLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Fc3RpbWF0aW5nIFRlY2huaXF1ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0RXN0aW1hdGluZ1RlY2huaXF1ZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fRXN0aW1hdGluZ1RlY2huaXF1ZSgpCi0JICogQG1vZGVsIGRlZmF1bHQ9IiIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuU3RyaW5nIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldEVzdGltYXRpbmdUZWNobmlxdWUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24jZ2V0RXN0aW1hdGluZ1RlY2huaXF1ZSA8ZW0+RXN0aW1hdGluZyBUZWNobmlxdWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkVzdGltYXRpbmcgVGVjaG5pcXVlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRFc3RpbWF0aW5nVGVjaG5pcXVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRFc3RpbWF0aW5nVGVjaG5pcXVlKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Qcm9qZWN0IE1lbWJlciBFeHBlcnRpc2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iIjwvY29kZT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBQcm92aWRlcyBhIHByb2ZpbGUgb2YgYSB0eXBpY2FsIHByb2plY3QgdGVhbSwgdGhlIGRpc3RyaWJ1dGlvbiBvZiByb2xlcywgc2tpbGxzIHJlcXVpcmVkIGZvciBhIHRlYW0gcGVyZm9ybXMgYSBwcm9qZWN0IGJhc2VkIG9uIHRoaXMgcHJvY2Vzcy4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UHJvamVjdCBNZW1iZXIgRXhwZXJ0aXNlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRQcm9qZWN0TWVtYmVyRXhwZXJ0aXNlKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXREZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl9Qcm9qZWN0TWVtYmVyRXhwZXJ0aXNlKCkKLQkgKiBAbW9kZWwgZGVmYXVsdD0iIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5TdHJpbmciIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0UHJvamVjdE1lbWJlckV4cGVydGlzZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbiNnZXRQcm9qZWN0TWVtYmVyRXhwZXJ0aXNlIDxlbT5Qcm9qZWN0IE1lbWJlciBFeHBlcnRpc2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlByb2plY3QgTWVtYmVyIEV4cGVydGlzZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UHJvamVjdE1lbWJlckV4cGVydGlzZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UHJvamVjdE1lbWJlckV4cGVydGlzZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VHlwZSBPZiBDb250cmFjdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiIiPC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFByb3ZpZGVzIGJhY2tncm91bmQgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGNvbnRyYWN0cyB0aGF0IG5lZWQgdG8gYmUgZXN0YWJsaXNoZWQgYmV0d2VlbiBhIHByb2plY3QgdGVhbSB0aGF0IHBlcmZvcm1zIHRoaXMgcHJvY2VzcyBhbmQgYSBjbGllbnQgKGUuZy4gZm9yIGFuIElHUyBlbmdhZ2VtZW50KS4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VHlwZSBPZiBDb250cmFjdDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0VHlwZU9mQ29udHJhY3QoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX1R5cGVPZkNvbnRyYWN0KCkKLQkgKiBAbW9kZWwgZGVmYXVsdD0iIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5TdHJpbmciIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0VHlwZU9mQ29udHJhY3QoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24jZ2V0VHlwZU9mQ29udHJhY3QgPGVtPlR5cGUgT2YgQ29udHJhY3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlR5cGUgT2YgQ29udHJhY3Q8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFR5cGVPZkNvbnRyYWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRUeXBlT2ZDb250cmFjdChTdHJpbmcgdmFsdWUpOwotCi19IC8vIERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0Rlc2NyaWJhYmxlRWxlbWVudC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9EZXNjcmliYWJsZUVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTlmOGRmNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0Rlc2NyaWJhYmxlRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWE7Ci0KLWltcG9ydCBqYXZhLm5ldC5VUkk7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkRlc2NyaWJhYmxlIEVsZW1lbnQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBEZXNjcmliYWJsZSBFbGVtZW50IGlzIGFuIGFic3RyYWN0IGdlbmVyYWxpemF0aW9uIG9mIE1ldGhvZCBFbGVtZW50cyBmb3Igd2hpY2ggZXh0ZXJuYWwgcHJlc2VudGF0aW9uIG5hbWVzIGFzIHdlbGwgYXMgY29udGVudCBkZXNjcmlwdGlvbnMgaGF2ZSBiZWVuIGRlZmluZWQsIHN1Y2ggYXMgUm9sZXMgb3IgV29yayBQcm9kdWN0cy4gIFByZXNlbnRhdGlvbiBOYW1lIGFuZCBDb250ZW50IERlc2NyaXB0aW9ucyBhcmUgdHlwaWNhbGx5IGxvY2FsaXplZCB1c2luZyBhIHJlc291cmNlIGFsbG9jYXRpb24gbWVjaGFuaXNtIGZvciBpdHMgU3RyaW5nIHR5cGUgYXR0cmlidXRlcy4KLSAqIFRoaXMgYWJzdHJhY3Rpb24gcmVwcmVzZW50cyBhbGwgZWxlbWVudHMgaW4gdGhlIE1ldGhvZCBDb250ZW50IGFzIHdlbGwgYXMgUHJvY2VzcyBzcGFjZSBmb3Igd2hpY2ggY29uY3JldGUgdGV4dHVhbCBkZXNjcmlwdGlvbnMgYXJlIGRlZmluZWQgaW4gdGhlIGZvcm0gb2YgZG9jdW1lbnRpbmcgYXR0cmlidXRlcyBncm91cGVkIGluIGEgbWF0Y2hpbmcgQ29udGVudCBEZXNjcmlwdGlvbiBpbnN0YW5jZSAoc2VlIFNlY3Rpb24gNC4xLjQpLiAgRGVzY3JpYmFibGUgRWxlbWVudHMgYXJlIGludGVuZGVkIHRvIGJlIHB1Ymxpc2hlZCBpbiBtZXRob2Qgb3IgcHJvY2VzcyBwdWJsaWNhdGlvbnMgKHNpbWlsYXIgdG8gdGhlIElCTSBSYXRpb25hbCBVbmlmaWVkIFByb2Nlc3Mgd2ViKS4gIERlc2NyaWJhYmxlIEVsZW1lbnQgZGVmaW5lcyB0aGF0IHRoZSBlbGVtZW50IGl0IHJlcHJlc2VudHMgd2lsbCBoYXZlIGNvbnRlbnQgJ2F0dGFjaGVkJyB0byBpdC4gIENvbnRlbnQgRGVzY3JpcHRpb24gaXMgdGhlIGFic3RyYWN0aW9uIGZvciB0aGUgYWN0dWFsIHBsYWNlcyBpbiB3aGljaCB0aGUgY29udGVudCBpcyBiZWluZyByZXByZXNlbnRlZC4gIFRoaXMgc2VwYXJhdGlvbiBhbGxvd3MgYSBkaXN0aW5jdGlvbiBiZXR3ZWVuIGNvcmUgbWV0aG9kIG1vZGVsIGVsZW1lbnRzIGRlc2NyaWJpbmcgdGhlIHN0cnVjdHVyZSBvZiB0aGUgbW9kZWwgZnJvbSB0aGUgYWN0dWFsIGRlc2NyaXB0aW9uIGNvbnRhaW5lciBwcm92aWRpbmcsIGZvciBleGFtcGxlLCB0aGUgZG9jdW1lbnRhdGlvbiBvZiB0aGUgY29udGVudCBlbGVtZW50IGluIGRpZmZlcmVudCBhbHRlcm5hdGl2ZXMgbGFuZ3VhZ2VzLCBhdWRpZW5jZXMsIGxpY2Vuc2luZyBsZXZlbHMsIGV0Yy4KLSAqIAotICogVGhpcyBkZWZpbml0aW9uIG9mIENvbnRlbnQgRWxlbWVudCBleHRlbmRzIHRoZSBDb250ZW50IEVsZW1lbnQgZGVmaW5pdGlvbiB2aWEgcGFja2FnZSBtZXJnZSB3aXRoIHJlZmVyZW5jZXMgdG8gaWNvbnMgdGhhdCBhcmUgdXNlZCBmb3IgcHJlc2VudGluZyBDb250ZW50IEVsZW1lbnRzIGluIGEgVU1BLWJhc2VkIG1vZGVsaW5nIGVudmlyb25tZW50IGFzIHdlbGwgYXMgd2hlbiBwdWJsaXNoaW5nIENvbnRlbnQgRWxlbWVudHMgaW50byBkb2N1bWVudGF0aW9uIHByZXNlbnRhdGlvbiAoZS5nLiBkb2N1bWVudCBvciBodG1sIHBhZ2VzKS4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaWJhYmxlRWxlbWVudCNnZXRQcmVzZW50YXRpb24gPGVtPlByZXNlbnRhdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmliYWJsZUVsZW1lbnQjZ2V0U2hhcGVpY29uIDxlbT5TaGFwZWljb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpYmFibGVFbGVtZW50I2dldE5vZGVpY29uIDxlbT5Ob2RlaWNvbjwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldERlc2NyaWJhYmxlRWxlbWVudCgpCi0gKiBAbW9kZWwgYWJzdHJhY3Q9InRydWUiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRGVzY3JpYmFibGVFbGVtZW50IGV4dGVuZHMgTWV0aG9kRWxlbWVudCwgQ2xhc3NpZmllciB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5QcmVzZW50YXRpb248L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UHJlc2VudGF0aW9uPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRQcmVzZW50YXRpb24oQ29udGVudERlc2NyaXB0aW9uKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldERlc2NyaWJhYmxlRWxlbWVudF9QcmVzZW50YXRpb24oKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9InRydWUiIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlDb250ZW50RGVzY3JpcHRpb24gZ2V0UHJlc2VudGF0aW9uKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaWJhYmxlRWxlbWVudCNnZXRQcmVzZW50YXRpb24gPGVtPlByZXNlbnRhdGlvbjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UHJlc2VudGF0aW9uPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRQcmVzZW50YXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFByZXNlbnRhdGlvbihDb250ZW50RGVzY3JpcHRpb24gdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U2hhcGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBBIHJlZmVyZW5jZSB0byBhbiBpY29uIHRoYXQgY2FuIGJlIHVzZWQgZm9yIG1vZGVsaW5nIHdpdGggc3BlY2lmaWMgQ29udGVudCBFbGVtZW50IGluc3RhbmNlcyAoYXMgZ3JhcGhpY2FsIHN0ZXJlb3R5cGVzLCBlLmcuIGEgdXNlIGNhc2Ugc3ltYm9sIGZvciBhIHVzZSBjYXNlIGFydGlmYWN0KSBhcyB3ZWxsIGFzIHB1YmxpY2F0aW9uIG9mIGNvbnRlbnQuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlNoYXBlaWNvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0U2hhcGVpY29uKFVSSSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXREZXNjcmliYWJsZUVsZW1lbnRfU2hhcGVpY29uKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuVXJpIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JVVJJIGdldFNoYXBlaWNvbigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmliYWJsZUVsZW1lbnQjZ2V0U2hhcGVpY29uIDxlbT5TaGFwZWljb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlNoYXBlaWNvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0U2hhcGVpY29uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRTaGFwZWljb24oVVJJIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk5vZGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBBIHJlZmVyZW5jZSB0byBhbiBpY29uIHRoYXQgY2FuIGJlIHVzZWQgaW4gdHJlZSBicm93c2VyIHByZXNlbnRhdGlvbnMgYW5kIGJyZWFrZG93biBzdHJ1Y3R1cmVzLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Ob2RlaWNvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0Tm9kZWljb24oVVJJKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldERlc2NyaWJhYmxlRWxlbWVudF9Ob2RlaWNvbigpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLlVyaSIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVVSSSBnZXROb2RlaWNvbigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmliYWJsZUVsZW1lbnQjZ2V0Tm9kZWljb24gPGVtPk5vZGVpY29uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Ob2RlaWNvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0Tm9kZWljb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldE5vZGVpY29uKFVSSSB2YWx1ZSk7Ci0KLX0gLy8gRGVzY3JpYmFibGVFbGVtZW50CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0Rlc2NyaXB0b3IuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvRGVzY3JpcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYjY4MTZlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvRGVzY3JpcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RGVzY3JpcHRvcjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEEgRGVzY3JpcHRvciBpcyBhbiBhYnN0cmFjdCBnZW5lcmFsaXphdGlvbiBmb3Igc3BlY2lhbCBCcmVha2Rvd24gRWxlbWVudHMgdGhhdCByZWZlcmVuY2VzIG9uZSBjb25jcmV0ZSBDb250ZW50IEVsZW1lbnQuICBBIGRlc2NyaXB0b3IgcHJvdmlkZXMgYSByZXByZXNlbnRhdGlvbiBvZiBhIENvbnRlbnQgRWxlbWVudCB3aXRoaW4gYnJlYWtkb3duIHN0cnVjdHVyZXMuICBJbiBhZGRpdGlvbiB0byBqdXN0IHJlZmVyZW5jaW5nIENvbnRlbnQgRWxlbWVudHMgaXQgYWxsb3dzIG92ZXJyaWRpbmcgdGhlIENvbnRlbnQgRWxlbWVudHMgc3RydWN0dXJhbCByZWxhdGlvbnNoaXBzIGJ5IGRlZmluaW5nIGl0cyBvd24gc2V0cyBvZiBhc3NvY2lhdGlvbnMuCi0gKiBEZXNjcmlwdG9ycyBhcmUgdGhlIGtleSBjb25jZXB0IGZvciByZWFsaXppbmcgdGhlIHNlcGFyYXRpb24gb2YgcHJvY2Vzc2VzIGZyb20gbWV0aG9kIGNvbnRlbnQuICBBIERlc2NyaXB0b3IgY2FuIGJlIGNoYXJhY3Rlcml6ZWQgYXMgYSByZWZlcmVuY2Ugb2JqZWN0IGZvciBvbmUgcGFydGljdWxhciBDb250ZW50IEVsZW1lbnQsIHdoaWNoIGhhcyBpdHMgb3duIHJlbGF0aW9uc2hpcHMgYW5kIHByb3BlcnRpZXMuICBXaGVuIGEgRGVzY3JpcHRvciBpcyBjcmVhdGVkIGl0IHNoYWxsIGJlIHByb3ZpZGVkIHdpdGggY29uZ3J1ZW50IGNvcGllcyBvZiB0aGUgcmVsYXRpb25zaGlwcyBkZWZpbmVkIGZvciB0aGUgcmVmZXJlbmNlZCBjb250ZW50IGVsZW1lbnQuICBIb3dldmVyLCBhIHVzZXIgY2FuIG1vZGlmeSB0aGVzZSByZWxhdGlvbnNoaXBzIGZvciB0aGUgcGFydGljdWxhciBwcm9jZXNzIHNpdHVhdGlvbiBmb3Igd2hpY2ggdGhlIGRlc2NyaXB0b3IgaGFzIGJlZW4gY3JlYXRlZC4gCi0gKiAKLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaXB0b3IjZ2V0SXNTeW5jaHJvbml6ZWRXaXRoU291cmNlIDxlbT5JcyBTeW5jaHJvbml6ZWQgV2l0aCBTb3VyY2U8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXREZXNjcmlwdG9yKCkKLSAqIEBtb2RlbCBhYnN0cmFjdD0idHJ1ZSIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBEZXNjcmlwdG9yIGV4dGVuZHMgQnJlYWtkb3duRWxlbWVudCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SXMgU3luY2hyb25pemVkIFdpdGggU291cmNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+InRydWUiPC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPklzIFN5bmNocm9uaXplZCBXaXRoIFNvdXJjZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JcyBTeW5jaHJvbml6ZWQgV2l0aCBTb3VyY2U8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldElzU3luY2hyb25pemVkV2l0aFNvdXJjZShCb29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldERlc2NyaXB0b3JfSXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKCkKLQkgKiBAbW9kZWwgZGVmYXVsdD0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuQm9vbGVhbiIgcmVxdWlyZWQ9InRydWUiIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCb29sZWFuIGdldElzU3luY2hyb25pemVkV2l0aFNvdXJjZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmlwdG9yI2dldElzU3luY2hyb25pemVkV2l0aFNvdXJjZSA8ZW0+SXMgU3luY2hyb25pemVkIFdpdGggU291cmNlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5JcyBTeW5jaHJvbml6ZWQgV2l0aCBTb3VyY2U8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldElzU3luY2hyb25pemVkV2l0aFNvdXJjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0SXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKEJvb2xlYW4gdmFsdWUpOwotCi19IC8vIERlc2NyaXB0b3IKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvRGVzY3JpcHRvckRlc2NyaXB0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0Rlc2NyaXB0b3JEZXNjcmlwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NTBjYTFkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvRGVzY3JpcHRvckRlc2NyaXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5EZXNjcmlwdG9yIERlc2NyaXB0aW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpcHRvckRlc2NyaXB0aW9uI2dldFJlZmluZWREZXNjcmlwdGlvbiA8ZW0+UmVmaW5lZCBEZXNjcmlwdGlvbjwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldERlc2NyaXB0b3JEZXNjcmlwdGlvbigpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBEZXNjcmlwdG9yRGVzY3JpcHRpb24gZXh0ZW5kcyBCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24gewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJlZmluZWQgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iIjwvY29kZT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBBIERlc2NyaXB0b3IgbWlnaHQgYWRkIHJlZmluZW1lbnRzIHRvIHRoZSBtYWluIGRlc2NyaXB0aW9uIG9mIHRoZSBDb250ZW50IEVsZW1lbnQgaXQgcmVmZXJzIHRvLiAgRm9yIGV4YW1wbGUsIGl0IGNvdWxkIHByb3ZpZGUgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCBhIFdvcmsgUHJvZHVjdCByZWxldmFudCBmb3IgdGhlIHNwZWNpZmljIHBvaW50IGluIHRpbWUgaW4gdGhlIHByb2Nlc3MgdGhpcyBXb3JrIFByb2R1Y3QgdHlwZSBpcyBiZWluZyB1c2VkLiAgSXQgY291bGQgZGVzY3JpYmUgYWRkaXRpb25hbCBza2lsbHMgbmVlZGVkIGZvciBhIFJvbGUgYXQgdGhhdCBwYXJ0aWN1bGFyIHBvaW50IGluIHRpbWUgaW4gYSBwcm9jZXNzLCBldGMuIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZWZpbmVkIERlc2NyaXB0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRSZWZpbmVkRGVzY3JpcHRpb24oU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldERlc2NyaXB0b3JEZXNjcmlwdGlvbl9SZWZpbmVkRGVzY3JpcHRpb24oKQotCSAqIEBtb2RlbCBkZWZhdWx0PSIiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLlN0cmluZyIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRSZWZpbmVkRGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpcHRvckRlc2NyaXB0aW9uI2dldFJlZmluZWREZXNjcmlwdGlvbiA8ZW0+UmVmaW5lZCBEZXNjcmlwdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UmVmaW5lZCBEZXNjcmlwdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UmVmaW5lZERlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRSZWZpbmVkRGVzY3JpcHRpb24oU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBEZXNjcmlwdG9yRGVzY3JpcHRpb24KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvRGlhZ3JhbS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9EaWFncmFtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2M2VmOTUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9EaWFncmFtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5EaWFncmFtPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbSNnZXREaWFncmFtTGluayA8ZW0+RGlhZ3JhbSBMaW5rPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW0jZ2V0TmFtZXNwYWNlIDxlbT5OYW1lc3BhY2U8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbSNnZXRab29tIDxlbT5ab29tPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW0jZ2V0Vmlld3BvaW50IDxlbT5WaWV3cG9pbnQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXREaWFncmFtKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIERpYWdyYW0gZXh0ZW5kcyBHcmFwaE5vZGUgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlpvb208L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlpvb208L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Wm9vbTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0Wm9vbShEb3VibGUpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0RGlhZ3JhbV9ab29tKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuRG91YmxlIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRG91YmxlIGdldFpvb20oKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbSNnZXRab29tIDxlbT5ab29tPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5ab29tPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRab29tKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRab29tKERvdWJsZSB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5WaWV3cG9pbnQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlZpZXdwb2ludDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5WaWV3cG9pbnQ8L2VtPicgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFZpZXdwb2ludChQb2ludCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXREaWFncmFtX1ZpZXdwb2ludCgpCi0JICogQG1vZGVsIHJlcXVpcmVkPSJ0cnVlIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUG9pbnQgZ2V0Vmlld3BvaW50KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW0jZ2V0Vmlld3BvaW50IDxlbT5WaWV3cG9pbnQ8L2VtPn0nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlZpZXdwb2ludDwvZW0+JyByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0Vmlld3BvaW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRWaWV3cG9pbnQoUG9pbnQgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGlhZ3JhbSBMaW5rPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtTGlua30uCi0JICogSXQgaXMgYmlkaXJlY3Rpb25hbCBhbmQgaXRzIG9wcG9zaXRlIGlzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtTGluayNnZXREaWFncmFtIDxlbT5EaWFncmFtPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkRpYWdyYW0gTGluazwvZW0+JyByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRpYWdyYW0gTGluazwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXREaWFncmFtX0RpYWdyYW1MaW5rKCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbUxpbmsjZ2V0RGlhZ3JhbQotCSAqIEBtb2RlbCBvcHBvc2l0ZT0iZGlhZ3JhbSIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3Q8RGlhZ3JhbUxpbms+IGdldERpYWdyYW1MaW5rKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5OYW1lc3BhY2U8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBJdCBpcyBiaWRpcmVjdGlvbmFsIGFuZCBpdHMgb3Bwb3NpdGUgaXMgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlNlbWFudGljTW9kZWxCcmlkZ2UjZ2V0RGlhZ3JhbSA8ZW0+RGlhZ3JhbTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5OYW1lc3BhY2U8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZXNwYWNlPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXROYW1lc3BhY2UoU2VtYW50aWNNb2RlbEJyaWRnZSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXREaWFncmFtX05hbWVzcGFjZSgpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlNlbWFudGljTW9kZWxCcmlkZ2UjZ2V0RGlhZ3JhbQotCSAqIEBtb2RlbCBvcHBvc2l0ZT0iZGlhZ3JhbSIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJ0cnVlIiByZXF1aXJlZD0idHJ1ZSIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVNlbWFudGljTW9kZWxCcmlkZ2UgZ2V0TmFtZXNwYWNlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW0jZ2V0TmFtZXNwYWNlIDxlbT5OYW1lc3BhY2U8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk5hbWVzcGFjZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0TmFtZXNwYWNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXROYW1lc3BhY2UoU2VtYW50aWNNb2RlbEJyaWRnZSB2YWx1ZSk7Ci0KLX0gLy8gRGlhZ3JhbQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9EaWFncmFtRWxlbWVudC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9EaWFncmFtRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZTdkZGZiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvRGlhZ3JhbUVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkRpYWdyYW0gRWxlbWVudDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW1FbGVtZW50I2dldElzVmlzaWJsZSA8ZW0+SXMgVmlzaWJsZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtRWxlbWVudCNnZXRDb250YWluZXJfIDxlbT5Db250YWluZXI8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbUVsZW1lbnQjZ2V0UmVmZXJlbmNlIDxlbT5SZWZlcmVuY2U8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbUVsZW1lbnQjZ2V0UHJvcGVydHkgPGVtPlByb3BlcnR5PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0RGlhZ3JhbUVsZW1lbnQoKQotICogQG1vZGVsIGFic3RyYWN0PSJ0cnVlIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIERpYWdyYW1FbGVtZW50IGV4dGVuZHMgTWV0aG9kRWxlbWVudCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SXMgVmlzaWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiJ0cnVlIjwvY29kZT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5JcyBWaXNpYmxlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPklzIFZpc2libGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldElzVmlzaWJsZShCb29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldERpYWdyYW1FbGVtZW50X0lzVmlzaWJsZSgpCi0JICogQG1vZGVsIGRlZmF1bHQ9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLkJvb2xlYW4iIHJlcXVpcmVkPSJ0cnVlIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQm9vbGVhbiBnZXRJc1Zpc2libGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbUVsZW1lbnQjZ2V0SXNWaXNpYmxlIDxlbT5JcyBWaXNpYmxlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5JcyBWaXNpYmxlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRJc1Zpc2libGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldElzVmlzaWJsZShCb29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNvbnRhaW5lcjwvYj48L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZS4KLQkgKiBJdCBpcyBiaWRpcmVjdGlvbmFsIGFuZCBpdHMgb3Bwb3NpdGUgaXMgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoRWxlbWVudCNnZXRDb250YWluZWQgPGVtPkNvbnRhaW5lZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Db250YWluZXI8L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNvbnRhaW5lcjwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldENvbnRhaW5lcihHcmFwaEVsZW1lbnQpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0RGlhZ3JhbUVsZW1lbnRfQ29udGFpbmVyKCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhFbGVtZW50I2dldENvbnRhaW5lZAotCSAqIEBtb2RlbCBvcHBvc2l0ZT0iY29udGFpbmVkIiB0cmFuc2llbnQ9ImZhbHNlIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JR3JhcGhFbGVtZW50IGdldENvbnRhaW5lcl8oKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbUVsZW1lbnQjZ2V0Q29udGFpbmVyXyA8ZW0+Q29udGFpbmVyPC9lbT59JyBjb250YWluZXIgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q29udGFpbmVyPC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0Q29udGFpbmVyXygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Q29udGFpbmVyKEdyYXBoRWxlbWVudCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SZWZlcmVuY2U8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlJlZmVyZW5jZX0uCi0JICogSXQgaXMgYmlkaXJlY3Rpb25hbCBhbmQgaXRzIG9wcG9zaXRlIGlzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5SZWZlcmVuY2UjZ2V0UmVmZXJlbmNlZCA8ZW0+UmVmZXJlbmNlZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5SZWZlcmVuY2U8L2VtPicgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZWZlcmVuY2U8L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0RGlhZ3JhbUVsZW1lbnRfUmVmZXJlbmNlKCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuUmVmZXJlbmNlI2dldFJlZmVyZW5jZWQKLQkgKiBAbW9kZWwgb3Bwb3NpdGU9InJlZmVyZW5jZWQiIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0PFJlZmVyZW5jZT4gZ2V0UmVmZXJlbmNlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Qcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvcGVydHl9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UHJvcGVydHk8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Qcm9wZXJ0eTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXREaWFncmFtRWxlbWVudF9Qcm9wZXJ0eSgpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0idHJ1ZSIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3Q8UHJvcGVydHk+IGdldFByb3BlcnR5KCk7Ci0KLX0gLy8gRGlhZ3JhbUVsZW1lbnQKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvRGlhZ3JhbUxpbmsuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvRGlhZ3JhbUxpbmsuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTFhY2JlYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0RpYWdyYW1MaW5rLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RGlhZ3JhbSBMaW5rPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbUxpbmsjZ2V0Wm9vbSA8ZW0+Wm9vbTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtTGluayNnZXRWaWV3cG9ydCA8ZW0+Vmlld3BvcnQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbUxpbmsjZ2V0RGlhZ3JhbSA8ZW0+RGlhZ3JhbTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtTGluayNnZXRHcmFwaEVsZW1lbnQgPGVtPkdyYXBoIEVsZW1lbnQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXREaWFncmFtTGluaygpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBEaWFncmFtTGluayBleHRlbmRzIERpYWdyYW1FbGVtZW50IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5ab29tPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5ab29tPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlpvb208L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFpvb20oRG91YmxlKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldERpYWdyYW1MaW5rX1pvb20oKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5Eb3VibGUiIHJlcXVpcmVkPSJ0cnVlIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRG91YmxlIGdldFpvb20oKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbUxpbmsjZ2V0Wm9vbSA8ZW0+Wm9vbTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Wm9vbTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0Wm9vbSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Wm9vbShEb3VibGUgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Vmlld3BvcnQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlZpZXdwb3J0PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlZpZXdwb3J0PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRWaWV3cG9ydChQb2ludCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXREaWFncmFtTGlua19WaWV3cG9ydCgpCi0JICogQG1vZGVsIHJlcXVpcmVkPSJ0cnVlIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUG9pbnQgZ2V0Vmlld3BvcnQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbUxpbmsjZ2V0Vmlld3BvcnQgPGVtPlZpZXdwb3J0PC9lbT59JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5WaWV3cG9ydDwvZW0+JyByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0Vmlld3BvcnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFZpZXdwb3J0KFBvaW50IHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkdyYXBoIEVsZW1lbnQ8L2I+PC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UuCi0JICogSXQgaXMgYmlkaXJlY3Rpb25hbCBhbmQgaXRzIG9wcG9zaXRlIGlzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaEVsZW1lbnQjZ2V0TGluayA8ZW0+TGluazwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5HcmFwaCBFbGVtZW50PC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5HcmFwaCBFbGVtZW50PC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0R3JhcGhFbGVtZW50KEdyYXBoRWxlbWVudCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXREaWFncmFtTGlua19HcmFwaEVsZW1lbnQoKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaEVsZW1lbnQjZ2V0TGluawotCSAqIEBtb2RlbCBvcHBvc2l0ZT0ibGluayIgcmVxdWlyZWQ9InRydWUiIHRyYW5zaWVudD0iZmFsc2UiIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlHcmFwaEVsZW1lbnQgZ2V0R3JhcGhFbGVtZW50KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW1MaW5rI2dldEdyYXBoRWxlbWVudCA8ZW0+R3JhcGggRWxlbWVudDwvZW0+fScgY29udGFpbmVyIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkdyYXBoIEVsZW1lbnQ8L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRHcmFwaEVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEdyYXBoRWxlbWVudChHcmFwaEVsZW1lbnQgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGlhZ3JhbTwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIEl0IGlzIGJpZGlyZWN0aW9uYWwgYW5kIGl0cyBvcHBvc2l0ZSBpcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbSNnZXREaWFncmFtTGluayA8ZW0+RGlhZ3JhbSBMaW5rPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkRpYWdyYW08L2VtPicgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGlhZ3JhbTwvZW0+JyByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0RGlhZ3JhbShEaWFncmFtKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldERpYWdyYW1MaW5rX0RpYWdyYW0oKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtI2dldERpYWdyYW1MaW5rCi0JICogQG1vZGVsIG9wcG9zaXRlPSJkaWFncmFtTGluayIgcmVxdWlyZWQ9InRydWUiIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlEaWFncmFtIGdldERpYWdyYW0oKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbUxpbmsjZ2V0RGlhZ3JhbSA8ZW0+RGlhZ3JhbTwvZW0+fScgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RGlhZ3JhbTwvZW0+JyByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0RGlhZ3JhbSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RGlhZ3JhbShEaWFncmFtIHZhbHVlKTsKLQotfSAvLyBEaWFncmFtTGluawpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9EaW1lbnNpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvRGltZW5zaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmNTUzMjAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9EaW1lbnNpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLklNb2RlbE9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RGltZW5zaW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGltZW5zaW9uI2dldFdpZHRoIDxlbT5XaWR0aDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaW1lbnNpb24jZ2V0SGVpZ2h0IDxlbT5IZWlnaHQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXREaW1lbnNpb24oKQotICogQG1vZGVsCi0gKiBAZXh0ZW5kcyBJTW9kZWxPYmplY3QKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBEaW1lbnNpb24gZXh0ZW5kcyBJTW9kZWxPYmplY3QgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPldpZHRoPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5XaWR0aDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5XaWR0aDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0V2lkdGgoRG91YmxlKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldERpbWVuc2lvbl9XaWR0aCgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLkRvdWJsZSIgcmVxdWlyZWQ9InRydWUiIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlEb3VibGUgZ2V0V2lkdGgoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGltZW5zaW9uI2dldFdpZHRoIDxlbT5XaWR0aDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+V2lkdGg8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFdpZHRoKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRXaWR0aChEb3VibGUgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SGVpZ2h0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5IZWlnaHQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SGVpZ2h0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRIZWlnaHQoRG91YmxlKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldERpbWVuc2lvbl9IZWlnaHQoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5Eb3VibGUiIHJlcXVpcmVkPSJ0cnVlIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRG91YmxlIGdldEhlaWdodCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaW1lbnNpb24jZ2V0SGVpZ2h0IDxlbT5IZWlnaHQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkhlaWdodDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0SGVpZ2h0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRIZWlnaHQoRG91YmxlIHZhbHVlKTsKLQotfSAvLyBEaW1lbnNpb24KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvRGlzY2lwbGluZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9EaXNjaXBsaW5lLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkOTA2MTcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9EaXNjaXBsaW5lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkRpc2NpcGxpbmU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIERpc2NpcGxpbmUgaXMgYSBjYXRlZ29yaXphdGlvbiBvZiB3b3JrIChpLmUuIFRhc2tzIGZvciBNZXRob2QgQ29udGVudCksIGJhc2VkIHVwb24gc2ltaWxhcml0eSBvZiBjb25jZXJucyBhbmQgY29vcGVyYXRpb24gb2Ygd29yayBlZmZvcnQuCi0gKiBBIGRpc2NpcGxpbmUgaXMgYSBjb2xsZWN0aW9uIG9mIFRhc2tzIHRoYXQgYXJlIHJlbGF0ZWQgdG8gYSBtYWpvciAnYXJlYSBvZiBjb25jZXJuJyB3aXRoaW4gdGhlIG92ZXJhbGwgcHJvamVjdC4gVGhlIGdyb3VwaW5nIG9mIFRhc2tzIGludG8gZGlzY2lwbGluZXMgaXMgbWFpbmx5IGFuIGFpZCB0byB1bmRlcnN0YW5kaW5nIHRoZSBwcm9qZWN0IGZyb20gYSAndHJhZGl0aW9uYWwnIHdhdGVyZmFsbCBwZXJzcGVjdGl2ZS4gSG93ZXZlciwgdHlwaWNhbGx5LCBmb3IgZXhhbXBsZSwgaXQgaXMgbW9yZSBjb21tb24gdG8gcGVyZm9ybSBjZXJ0YWluIHJlcXVpcmVtZW50cyBhY3Rpdml0aWVzIGluIGNsb3NlIGNvb3JkaW5hdGlvbiB3aXRoIGFuYWx5c2lzIGFuZCBkZXNpZ24gYWN0aXZpdGllcy4gU2VwYXJhdGluZyB0aGVzZSBhY3Rpdml0aWVzIGludG8gc2VwYXJhdGUgZGlzY2lwbGluZXMgbWFrZXMgdGhlIGFjdGl2aXRpZXMgZWFzaWVyIHRvIGNvbXByZWhlbmQuCi0gKiAKLSAqIERpc2NpcGxpbmUgaXMgYSBjYXRlZ29yaXphdGlvbiBvZiBUYXNrcyBiYXNlZCB1cG9uIHNpbWlsYXJpdHkgb2YgY29uY2VybnMgYW5kIGNvb3BlcmF0aW9uIG9mIHdvcmsgZWZmb3J0LiAgVGhpcyBpcyB0aGUgZXh0ZW5zaW9ucyBvZiBEaXNjaXBsaW5lIGRlZmluZWQgaW4gdGhlIE1ldGhvZCBDb3JlIHBhY2thZ2UgYWRkaW5nIGFuIGFkZGl0aW9uYWwgYXNzb2NpYXRpb24gdG8gQWN0aXZpdGllcywgd2hpY2ggcmVwcmVzZW50IHR5cGljYWwgc3RhbmRhcmQgb3IgcmVmZXJlbmNlIHdheXMgb2YgbWVhbmluZ2Z1bCBncm91cGluZ3Mgb2YgdGhlIERpc2NpcGxpbmUncyBUYXNrcyBpbnRvIHdvcmtmbG93cy4KLSAqIFRhc2tzIHJlcHJlc2VudCBkZXNjcmlwdGlvbnMgb2Ygd29yaywgd2hpY2ggYXJlIGNhdGVnb3JpemVkIGJ5IERpc2NpcGxpbmVzLiAgVGhlIHJlYXNvbiB0aGF0IHNldmVyYWwgVGFza3MgYXJlIGFsbCBjYXRlZ29yaXplZCBieSB0aGUgc2FtZSBEaXNjaXBsaW5lIGlzIHRoYXQgdGhleSBhbGwgcmVwcmVzZW50IGEgcGFydCBpbiBhY2hpZXZpbmcgYSBoaWdoZXIgZ29hbCBvciBwZXJmb3JtaW5nIHdvcmsgdGhhdCBpcyBhbGwgcmVsYXRlZCB0byBlYWNoIG90aGVyLiAgRXZlcnkgRGlzY2lwbGluZSBkZWZpbmVzIHN0YW5kYXJkIHdheXMgb2YgZG9pbmcgdGhlIHdvcmsgaXQgY2F0ZWdvcml6ZXMuICBTdWNoIHN0YW5kYXJkIHdheXMgYXJlIGV4cHJlc3MgYnkgQWN0aXZpdGllcyBvciBDYXBhYmlsaXR5IFBhdHRlcm5zIGRlZmluaW5nIGhvdyB0aGUgVGFza3MgY2F0ZWdvcml6ZWQgYnkgdGhlIERpc2NpcGxpbmUgJ3dvcmsgdG9nZXRoZXInIGluIHRoZSBtb3N0IGdlbmVyaWMgd2F5LiAgVGhlc2UgcmVmZXJlbmNlIHdvcmtmbG93cyBhcmUgb2Z0ZW4gdXNlZCBmb3IgZWR1Y2F0aW5nIGFuZCB0ZWFjaGluZyBwcmFjdGl0aW9uZXJzLiAKLSAqIAotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlzY2lwbGluZSNnZXRUYXNrcyA8ZW0+VGFza3M8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlzY2lwbGluZSNnZXRTdWJkaXNjaXBsaW5lIDxlbT5TdWJkaXNjaXBsaW5lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRpc2NpcGxpbmUjZ2V0UmVmZXJlbmNlV29ya2Zsb3dzIDxlbT5SZWZlcmVuY2UgV29ya2Zsb3dzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0RGlzY2lwbGluZSgpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBEaXNjaXBsaW5lIGV4dGVuZHMgQ29udGVudENhdGVnb3J5IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5UYXNrczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5UYXNrczwvZW0+JyByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlRhc2tzPC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldERpc2NpcGxpbmVfVGFza3MoKQotCSAqIEBtb2RlbCBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdDxUYXNrPiBnZXRUYXNrcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U3ViZGlzY2lwbGluZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlzY2lwbGluZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5TdWJkaXNjaXBsaW5lPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U3ViZGlzY2lwbGluZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXREaXNjaXBsaW5lX1N1YmRpc2NpcGxpbmUoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9InRydWUiIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0PERpc2NpcGxpbmU+IGdldFN1YmRpc2NpcGxpbmUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJlZmVyZW5jZSBXb3JrZmxvd3M8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlJlZmVyZW5jZSBXb3JrZmxvd3M8L2VtPicgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZWZlcmVuY2UgV29ya2Zsb3dzPC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldERpc2NpcGxpbmVfUmVmZXJlbmNlV29ya2Zsb3dzKCkKLQkgKiBAbW9kZWwgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3Q8QWN0aXZpdHk+IGdldFJlZmVyZW5jZVdvcmtmbG93cygpOwotCi19IC8vIERpc2NpcGxpbmUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvRGlzY2lwbGluZUdyb3VwaW5nLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0Rpc2NpcGxpbmVHcm91cGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMDhjZjNkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvRGlzY2lwbGluZUdyb3VwaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkRpc2NpcGxpbmUgR3JvdXBpbmc8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBEaXNjaXBsaW5lIEdyb3VwaW5ncyBhcmUgdXNlZCB0byBncm91cCBEaXNjaXBsaW5lcy4gIEZvciBleGFtcGxlLCB0aGUgRGlzY2lwbGluZSBHcm91cGluZyAiU29mdHdhcmUgRGlzY2lwbGluZXMiIHdvdWxkIGJlIHRoZSBncm91cCBvZiBhbGwgZGlzY2lwbGluZXMgcmVsYXRlZCB0byBkZXZlbG9waW5nIHNvZnR3YXJlIHN1Y2ggYXMgIlJlcXVpcmVtZW50cyBNYW5hZ2VtZW50IiBvciAiVGVzdGluZyI7ICJJVCBJbmZyYXN0cnVjdHVyZSBNYW5hZ2VtZW50IiB3b3VsZCBiZSBhIERpc2NpcGxpbmVzIEdyb3VwaW5nIGZvciBkaXNjaXBsaW5lcyBzdWNoIGFzICJJVCBPcGVyYXRpb25hbCBTZXJ2aWNlcyIsICJJVCBDdXN0b21lciBSZWxhdGlvbnNoaXBzIiwgb3IgIklUIEVuYWJsaW5nIFNlcnZpY2VzIi4gIERpc2NpcGxpbmVzIGNhbiBiZSBhc3NvY2lhdGVkIHRvIG1vcmUgdGhhbiBvbmUgRGlzY2lwbGluZSBHcm91cGluZy4KLSAqIAotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlzY2lwbGluZUdyb3VwaW5nI2dldERpc2NpcGxpbmVzIDxlbT5EaXNjaXBsaW5lczwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldERpc2NpcGxpbmVHcm91cGluZygpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBEaXNjaXBsaW5lR3JvdXBpbmcgZXh0ZW5kcyBDb250ZW50Q2F0ZWdvcnkgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRpc2NpcGxpbmVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaXNjaXBsaW5lfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkRpc2NpcGxpbmVzPC9lbT4nIHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGlzY2lwbGluZXM8L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0RGlzY2lwbGluZUdyb3VwaW5nX0Rpc2NpcGxpbmVzKCkKLQkgKiBAbW9kZWwgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3Q8RGlzY2lwbGluZT4gZ2V0RGlzY2lwbGluZXMoKTsKLQotfSAvLyBEaXNjaXBsaW5lR3JvdXBpbmcKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvRG9tYWluLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0RvbWFpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNjVlMDZhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvRG9tYWluLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkRvbWFpbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIERvbWFpbiBpcyBhIHJlZmluZWFibGUgaGllcmFyY2h5IGdyb3VwaW5nIHJlbGF0ZWQgd29yayBwcm9kdWN0cy4gIEluIG90aGVyIHdvcmRzLCBEb21haW5zIGNhbiBiZSBmdXJ0aGVyIGRpdmlkZWQgaW50byBzdWItZG9tYWlucywgd2l0aCB3b3JrIHByb2R1Y3QgZWxlbWVudHMgdG8gYmUgY2F0ZWdvcml6ZWQgb25seSBhdCB0aGUgbGVhZi1sZXZlbCBvZiB0aGlzIGhpZXJhcmNoeS4KLSAqIERvbWFpbiBpcyBhIGxvZ2ljYWwgZ3JvdXBpbmcgb2Ygd29yayBwcm9kdWN0cyB0aGF0IGhhdmUgYW4gYWZmaW5pdHkgdG8gZWFjaCBvdGhlciBiYXNlZCBvbiByZXNvdXJjZXMsIHRpbWluZywgb3IgcmVsYXRpb25zaGlwLiAgQSBEb21haW4gbWF5IGJlIGRpdmlkZWQgaW50byBzdWJkb21haW5zLiAgRm9yIGV4YW1wbGUsIEdTIE1ldGhvZCB1c2VzIHNpeCBwcmVkZWZpbmVkIERvbWFpbnMgZm9yIFdvcmsgUHJvZHVjdHM6IEFwcGxpY2F0aW9uLCBBcmNoaXRlY3R1cmUsIEJ1c2luZXNzLCBFbmdhZ2VtZW50LCBPcGVyYXRpb25zIGFuZCBPcmdhbml6YXRpb24uCi0gKiAKLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRvbWFpbiNnZXRXb3JrUHJvZHVjdHMgPGVtPldvcmsgUHJvZHVjdHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRG9tYWluI2dldFN1YmRvbWFpbnMgPGVtPlN1YmRvbWFpbnM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXREb21haW4oKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRG9tYWluIGV4dGVuZHMgQ29udGVudENhdGVnb3J5IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Xb3JrIFByb2R1Y3RzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Xb3JrIFByb2R1Y3RzPC9lbT4nIHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+V29yayBQcm9kdWN0czwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXREb21haW5fV29ya1Byb2R1Y3RzKCkKLQkgKiBAbW9kZWwgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3Q8V29ya1Byb2R1Y3Q+IGdldFdvcmtQcm9kdWN0cygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U3ViZG9tYWluczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRG9tYWlufS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlN1YmRvbWFpbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TdWJkb21haW5zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldERvbWFpbl9TdWJkb21haW5zKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJ0cnVlIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdDxEb21haW4+IGdldFN1YmRvbWFpbnMoKTsKLQotfSAvLyBEb21haW4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvRWxlbWVudC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9FbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2MTRhZjkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9FbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS5JTW9kZWxPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkVsZW1lbnQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBVTUwgMi4wIG1ldGEtY2xhc3MgRWxlbWVudC4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0RWxlbWVudCgpCi0gKiBAbW9kZWwgYWJzdHJhY3Q9InRydWUiCi0gKiBAZXh0ZW5kcyBJTW9kZWxPYmplY3QKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBFbGVtZW50IGV4dGVuZHMgSU1vZGVsT2JqZWN0IHsKLX0gLy8gRWxlbWVudApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9FbGxpcHNlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0VsbGlwc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDA3ZTVlYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0VsbGlwc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5FbGxpcHNlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRWxsaXBzZSNnZXRDZW50ZXIgPGVtPkNlbnRlcjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5FbGxpcHNlI2dldFJhZGl1c1ggPGVtPlJhZGl1cyBYPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkVsbGlwc2UjZ2V0UmFkaXVzWSA8ZW0+UmFkaXVzIFk8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRWxsaXBzZSNnZXRSb3RhdGlvbiA8ZW0+Um90YXRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRWxsaXBzZSNnZXRTdGFydEFuZ2xlIDxlbT5TdGFydCBBbmdsZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5FbGxpcHNlI2dldEVuZEFuZ2xlIDxlbT5FbmQgQW5nbGU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRFbGxpcHNlKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEVsbGlwc2UgZXh0ZW5kcyBHcmFwaGljUHJpbWl0aXZlIHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SYWRpdXMgWDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UmFkaXVzIFg8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmFkaXVzIFg8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFJhZGl1c1goRG91YmxlKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldEVsbGlwc2VfUmFkaXVzWCgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLkRvdWJsZSIgcmVxdWlyZWQ9InRydWUiIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlEb3VibGUgZ2V0UmFkaXVzWCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5FbGxpcHNlI2dldFJhZGl1c1ggPGVtPlJhZGl1cyBYPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5SYWRpdXMgWDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UmFkaXVzWCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UmFkaXVzWChEb3VibGUgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmFkaXVzIFk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlJhZGl1cyBZPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJhZGl1cyBZPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRSYWRpdXNZKERvdWJsZSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRFbGxpcHNlX1JhZGl1c1koKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5Eb3VibGUiIHJlcXVpcmVkPSJ0cnVlIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRG91YmxlIGdldFJhZGl1c1koKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRWxsaXBzZSNnZXRSYWRpdXNZIDxlbT5SYWRpdXMgWTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UmFkaXVzIFk8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFJhZGl1c1koKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFJhZGl1c1koRG91YmxlIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJvdGF0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Sb3RhdGlvbjwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Sb3RhdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0Um90YXRpb24oRG91YmxlKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldEVsbGlwc2VfUm90YXRpb24oKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5Eb3VibGUiIHJlcXVpcmVkPSJ0cnVlIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRG91YmxlIGdldFJvdGF0aW9uKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkVsbGlwc2UjZ2V0Um90YXRpb24gPGVtPlJvdGF0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Sb3RhdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0Um90YXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFJvdGF0aW9uKERvdWJsZSB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TdGFydCBBbmdsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U3RhcnQgQW5nbGU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U3RhcnQgQW5nbGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFN0YXJ0QW5nbGUoRG91YmxlKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldEVsbGlwc2VfU3RhcnRBbmdsZSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLkRvdWJsZSIgcmVxdWlyZWQ9InRydWUiIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlEb3VibGUgZ2V0U3RhcnRBbmdsZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5FbGxpcHNlI2dldFN0YXJ0QW5nbGUgPGVtPlN0YXJ0IEFuZ2xlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TdGFydCBBbmdsZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0U3RhcnRBbmdsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0U3RhcnRBbmdsZShEb3VibGUgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RW5kIEFuZ2xlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5FbmQgQW5nbGU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RW5kIEFuZ2xlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRFbmRBbmdsZShEb3VibGUpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0RWxsaXBzZV9FbmRBbmdsZSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLkRvdWJsZSIgcmVxdWlyZWQ9InRydWUiIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlEb3VibGUgZ2V0RW5kQW5nbGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRWxsaXBzZSNnZXRFbmRBbmdsZSA8ZW0+RW5kIEFuZ2xlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5FbmQgQW5nbGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEVuZEFuZ2xlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRFbmRBbmdsZShEb3VibGUgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q2VudGVyPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5DZW50ZXI8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q2VudGVyPC9lbT4nIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRDZW50ZXIoUG9pbnQpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0RWxsaXBzZV9DZW50ZXIoKQotCSAqIEBtb2RlbCByZXF1aXJlZD0idHJ1ZSIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVBvaW50IGdldENlbnRlcigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5FbGxpcHNlI2dldENlbnRlciA8ZW0+Q2VudGVyPC9lbT59JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5DZW50ZXI8L2VtPicgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldENlbnRlcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Q2VudGVyKFBvaW50IHZhbHVlKTsKLQotfSAvLyBFbGxpcHNlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0VzdGltYXRpb25Db25zaWRlcmF0aW9ucy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzEyMTVkZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0VzdGltYXRpb25Db25zaWRlcmF0aW9ucy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RXN0aW1hdGlvbiBDb25zaWRlcmF0aW9uczwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEVzdGltYXRpb24gQ29uc2lkZXJhdGlvbnMgcXVhbGlmeSB0aGUgdXNhZ2UgYW5kIGFwcGxpY2F0aW9uIG9mIGVzdGltYXRpb24gbWV0cmljcyBpbiB0aGUgZGV2ZWxvcG1lbnQgb2YgYW4gYWN0dWFsIGVzdGltYXRlLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIGV4dGVuZHMgR3VpZGFuY2UgewotfSAvLyBFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvRXhhbXBsZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9FeGFtcGxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2Yjg3NGIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9FeGFtcGxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5FeGFtcGxlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQW4gRXhhbXBsZSBpcyBhIHNwZWNpZmljIHR5cGUgb2YgR3VpZGFuY2UgdGhhdCByZXByZXNlbnRzIGEgdHlwaWNhbCwgcGFydGlhbGx5IGNvbXBsZXRlZCwgc2FtcGxlIGluc3RhbmNlIG9mIG9uZSBvciBtb3JlIHdvcmsgcHJvZHVjdHMgb3Igc2NlbmFyaW8gbGlrZSBkZXNjcmlwdGlvbnMgb2YgaG93IFRhc2sgbWF5IGJlIHBlcmZvcm1lZC4gRXhhbXBsZXMgY2FuIGJlIHJlbGF0ZWQgdG8gV29yayBQcm9kdWN0cyBhcyB3ZWxsIGFzIFRhc2tzIHRoYXQgcHJvZHVjZSB0aGVtIGFzIHdlbGwgYXMgYW55IG90aGVyIENvbnRlbnQgRWxlbWVudC4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0RXhhbXBsZSgpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBFeGFtcGxlIGV4dGVuZHMgR3VpZGFuY2UgewotfSAvLyBFeGFtcGxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0Z1bGZpbGxhYmxlRWxlbWVudC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9GdWxmaWxsYWJsZUVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTRjOGU1My4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0Z1bGZpbGxhYmxlRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5GdWxmaWxsYWJsZSBFbGVtZW50PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRnVsZmlsbGFibGVFbGVtZW50I2dldEZ1bGZpbGxzIDxlbT5GdWxmaWxsczwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldEZ1bGZpbGxhYmxlRWxlbWVudCgpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBGdWxmaWxsYWJsZUVsZW1lbnQgZXh0ZW5kcyBEZXNjcmliYWJsZUVsZW1lbnQgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkZ1bGZpbGxzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5GdWxmaWxsYWJsZUVsZW1lbnR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RnVsZmlsbHM8L2VtPicgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5GdWxmaWxsczwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRGdWxmaWxsYWJsZUVsZW1lbnRfRnVsZmlsbHMoKQotCSAqIEBtb2RlbCBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdDxGdWxmaWxsYWJsZUVsZW1lbnQ+IGdldEZ1bGZpbGxzKCk7Ci0KLX0gLy8gRnVsZmlsbGFibGVFbGVtZW50CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0dyYXBoQ29ubmVjdG9yLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0dyYXBoQ29ubmVjdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2ZTBjZTUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9HcmFwaENvbm5lY3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5HcmFwaCBDb25uZWN0b3I8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaENvbm5lY3RvciNnZXRHcmFwaEVkZ2UgPGVtPkdyYXBoIEVkZ2U8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhDb25uZWN0b3IjZ2V0R3JhcGhFbGVtZW50IDxlbT5HcmFwaCBFbGVtZW50PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0R3JhcGhDb25uZWN0b3IoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgR3JhcGhDb25uZWN0b3IgZXh0ZW5kcyBHcmFwaEVsZW1lbnQgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkdyYXBoIEVsZW1lbnQ8L2I+PC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UuCi0JICogSXQgaXMgYmlkaXJlY3Rpb25hbCBhbmQgaXRzIG9wcG9zaXRlIGlzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaEVsZW1lbnQjZ2V0QW5jaG9yYWdlIDxlbT5BbmNob3JhZ2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+R3JhcGggRWxlbWVudDwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+R3JhcGggRWxlbWVudDwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldEdyYXBoRWxlbWVudChHcmFwaEVsZW1lbnQpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0R3JhcGhDb25uZWN0b3JfR3JhcGhFbGVtZW50KCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhFbGVtZW50I2dldEFuY2hvcmFnZQotCSAqIEBtb2RlbCBvcHBvc2l0ZT0iYW5jaG9yYWdlIiByZXF1aXJlZD0idHJ1ZSIgdHJhbnNpZW50PSJmYWxzZSIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUdyYXBoRWxlbWVudCBnZXRHcmFwaEVsZW1lbnQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhDb25uZWN0b3IjZ2V0R3JhcGhFbGVtZW50IDxlbT5HcmFwaCBFbGVtZW50PC9lbT59JyBjb250YWluZXIgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+R3JhcGggRWxlbWVudDwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldEdyYXBoRWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0R3JhcGhFbGVtZW50KEdyYXBoRWxlbWVudCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5HcmFwaCBFZGdlPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaEVkZ2V9LgotCSAqIEl0IGlzIGJpZGlyZWN0aW9uYWwgYW5kIGl0cyBvcHBvc2l0ZSBpcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhFZGdlI2dldEFuY2hvciA8ZW0+QW5jaG9yPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkdyYXBoIEVkZ2U8L2VtPicgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5HcmFwaCBFZGdlPC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldEdyYXBoQ29ubmVjdG9yX0dyYXBoRWRnZSgpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoRWRnZSNnZXRBbmNob3IKLQkgKiBAbW9kZWwgb3Bwb3NpdGU9ImFuY2hvciIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3Q8R3JhcGhFZGdlPiBnZXRHcmFwaEVkZ2UoKTsKLQotfSAvLyBHcmFwaENvbm5lY3RvcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9HcmFwaEVkZ2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvR3JhcGhFZGdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmODUzYjkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9HcmFwaEVkZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+R3JhcGggRWRnZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoRWRnZSNnZXRXYXlwb2ludHMgPGVtPldheXBvaW50czwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaEVkZ2UjZ2V0QW5jaG9yIDxlbT5BbmNob3I8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRHcmFwaEVkZ2UoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgR3JhcGhFZGdlIGV4dGVuZHMgR3JhcGhFbGVtZW50IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BbmNob3I8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoQ29ubmVjdG9yfS4KLQkgKiBJdCBpcyBiaWRpcmVjdGlvbmFsIGFuZCBpdHMgb3Bwb3NpdGUgaXMgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoQ29ubmVjdG9yI2dldEdyYXBoRWRnZSA8ZW0+R3JhcGggRWRnZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5BbmNob3I8L2VtPicgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BbmNob3I8L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0R3JhcGhFZGdlX0FuY2hvcigpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoQ29ubmVjdG9yI2dldEdyYXBoRWRnZQotCSAqIEBtb2RlbCBvcHBvc2l0ZT0iZ3JhcGhFZGdlIiBsb3dlcj0iMiIgdXBwZXI9IjIiIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0PEdyYXBoQ29ubmVjdG9yPiBnZXRBbmNob3IoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPldheXBvaW50czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUG9pbnR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+V2F5cG9pbnRzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+V2F5cG9pbnRzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldEdyYXBoRWRnZV9XYXlwb2ludHMoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9InRydWUiIGxvd2VyPSIyIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdDxQb2ludD4gZ2V0V2F5cG9pbnRzKCk7Ci0KLX0gLy8gR3JhcGhFZGdlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0dyYXBoRWxlbWVudC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9HcmFwaEVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGIzMzU2Yi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0dyYXBoRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+R3JhcGggRWxlbWVudDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoRWxlbWVudCNnZXRDb250YWluZWQgPGVtPkNvbnRhaW5lZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaEVsZW1lbnQjZ2V0UG9zaXRpb24gPGVtPlBvc2l0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoRWxlbWVudCNnZXRMaW5rIDxlbT5MaW5rPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoRWxlbWVudCNnZXRBbmNob3JhZ2UgPGVtPkFuY2hvcmFnZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaEVsZW1lbnQjZ2V0U2VtYW50aWNNb2RlbCA8ZW0+U2VtYW50aWMgTW9kZWw8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRHcmFwaEVsZW1lbnQoKQotICogQG1vZGVsIGFic3RyYWN0PSJ0cnVlIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEdyYXBoRWxlbWVudCBleHRlbmRzIERpYWdyYW1FbGVtZW50IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Qb3NpdGlvbjwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UG9zaXRpb248L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UG9zaXRpb248L2VtPicgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFBvc2l0aW9uKFBvaW50KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldEdyYXBoRWxlbWVudF9Qb3NpdGlvbigpCi0JICogQG1vZGVsIHJlcXVpcmVkPSJ0cnVlIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUG9pbnQgZ2V0UG9zaXRpb24oKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhFbGVtZW50I2dldFBvc2l0aW9uIDxlbT5Qb3NpdGlvbjwvZW0+fScgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UG9zaXRpb248L2VtPicgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldFBvc2l0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRQb3NpdGlvbihQb2ludCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Db250YWluZWQ8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW1FbGVtZW50fS4KLQkgKiBJdCBpcyBiaWRpcmVjdGlvbmFsIGFuZCBpdHMgb3Bwb3NpdGUgaXMgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW1FbGVtZW50I2dldENvbnRhaW5lcl8gPGVtPkNvbnRhaW5lcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Db250YWluZWQ8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Db250YWluZWQ8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0R3JhcGhFbGVtZW50X0NvbnRhaW5lZCgpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW1FbGVtZW50I2dldENvbnRhaW5lcl8KLQkgKiBAbW9kZWwgb3Bwb3NpdGU9ImNvbnRhaW5lciIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJ0cnVlIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdDxEaWFncmFtRWxlbWVudD4gZ2V0Q29udGFpbmVkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5MaW5rPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtTGlua30uCi0JICogSXQgaXMgYmlkaXJlY3Rpb25hbCBhbmQgaXRzIG9wcG9zaXRlIGlzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtTGluayNnZXRHcmFwaEVsZW1lbnQgPGVtPkdyYXBoIEVsZW1lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TGluazwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkxpbms8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0R3JhcGhFbGVtZW50X0xpbmsoKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtTGluayNnZXRHcmFwaEVsZW1lbnQKLQkgKiBAbW9kZWwgb3Bwb3NpdGU9ImdyYXBoRWxlbWVudCIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJ0cnVlIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdDxEaWFncmFtTGluaz4gZ2V0TGluaygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QW5jaG9yYWdlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaENvbm5lY3Rvcn0uCi0JICogSXQgaXMgYmlkaXJlY3Rpb25hbCBhbmQgaXRzIG9wcG9zaXRlIGlzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaENvbm5lY3RvciNnZXRHcmFwaEVsZW1lbnQgPGVtPkdyYXBoIEVsZW1lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+QW5jaG9yYWdlPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QW5jaG9yYWdlPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldEdyYXBoRWxlbWVudF9BbmNob3JhZ2UoKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaENvbm5lY3RvciNnZXRHcmFwaEVsZW1lbnQKLQkgKiBAbW9kZWwgb3Bwb3NpdGU9ImdyYXBoRWxlbWVudCIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJ0cnVlIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdDxHcmFwaENvbm5lY3Rvcj4gZ2V0QW5jaG9yYWdlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TZW1hbnRpYyBNb2RlbDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEl0IGlzIGJpZGlyZWN0aW9uYWwgYW5kIGl0cyBvcHBvc2l0ZSBpcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuU2VtYW50aWNNb2RlbEJyaWRnZSNnZXRHcmFwaEVsZW1lbnQgPGVtPkdyYXBoIEVsZW1lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U2VtYW50aWMgTW9kZWw8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U2VtYW50aWMgTW9kZWw8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFNlbWFudGljTW9kZWwoU2VtYW50aWNNb2RlbEJyaWRnZSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRHcmFwaEVsZW1lbnRfU2VtYW50aWNNb2RlbCgpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlNlbWFudGljTW9kZWxCcmlkZ2UjZ2V0R3JhcGhFbGVtZW50Ci0JICogQG1vZGVsIG9wcG9zaXRlPSJncmFwaEVsZW1lbnQiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0idHJ1ZSIgcmVxdWlyZWQ9InRydWUiIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTZW1hbnRpY01vZGVsQnJpZGdlIGdldFNlbWFudGljTW9kZWwoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhFbGVtZW50I2dldFNlbWFudGljTW9kZWwgPGVtPlNlbWFudGljIE1vZGVsPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TZW1hbnRpYyBNb2RlbDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0U2VtYW50aWNNb2RlbCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0U2VtYW50aWNNb2RlbChTZW1hbnRpY01vZGVsQnJpZGdlIHZhbHVlKTsKLQotfSAvLyBHcmFwaEVsZW1lbnQKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvR3JhcGhOb2RlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0dyYXBoTm9kZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YzczN2RhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvR3JhcGhOb2RlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5HcmFwaCBOb2RlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhOb2RlI2dldFNpemUgPGVtPlNpemU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRHcmFwaE5vZGUoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgR3JhcGhOb2RlIGV4dGVuZHMgR3JhcGhFbGVtZW50IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TaXplPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5TaXplPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlNpemU8L2VtPicgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFNpemUoRGltZW5zaW9uKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldEdyYXBoTm9kZV9TaXplKCkKLQkgKiBAbW9kZWwgcmVxdWlyZWQ9InRydWUiIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlEaW1lbnNpb24gZ2V0U2l6ZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaE5vZGUjZ2V0U2l6ZSA8ZW0+U2l6ZTwvZW0+fScgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U2l6ZTwvZW0+JyByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0U2l6ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0U2l6ZShEaW1lbnNpb24gdmFsdWUpOwotCi19IC8vIEdyYXBoTm9kZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9HcmFwaGljUHJpbWl0aXZlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0dyYXBoaWNQcmltaXRpdmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjQwYzhjZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0dyYXBoaWNQcmltaXRpdmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWE7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkdyYXBoaWMgUHJpbWl0aXZlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRHcmFwaGljUHJpbWl0aXZlKCkKLSAqIEBtb2RlbCBhYnN0cmFjdD0idHJ1ZSIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBHcmFwaGljUHJpbWl0aXZlIGV4dGVuZHMgTGVhZkVsZW1lbnQgewotfSAvLyBHcmFwaGljUHJpbWl0aXZlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0d1aWRhbmNlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0d1aWRhbmNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmNmM0NjAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9HdWlkYW5jZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+R3VpZGFuY2U8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBHdWlkYW5jZSBpcyBhbiBhYnN0cmFjdCBnZW5lcmFsaXphdGlvbiBvZiBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlbGF0ZWQgdG8gY29udGVudCBlbGVtZW50cyBzdWNoIGFzIFJvbGVzLCBUYXNrcywgYW5kIFdvcmsgUHJvZHVjdHMuICBFeGFtcGxlcyBmb3IgR3VpZGFuY2UgYXJlIEd1aWRlbGluZXMsIFRlbXBsYXRlcywgQ2hlY2tsaXN0cywgVG9vbCBNZW50b3JzLCBFc3RpbWF0ZXMsIFN1cHBvcnRpbmcgTWF0ZXJpYWxzLCBSZXBvcnRzLCBDb25jZXB0cywgZXRjLiAgVGhpcyBwYWNrYWdlIG9ubHkgY29udGFpbnMgdGhlIGRlZmluaXRpb24gb2YgdGhlIGFic3RyYWN0IEd1aWRhbmNlIGNsYXNzLiAgVGhlIHBhY2thZ2UgR3VpZGFuY2UgVHlwZXMgZGVmaW5lcyBjb25jcmV0ZSBndWlkYW5jZSB0eXBlcy4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0R3VpZGFuY2UoKQotICogQG1vZGVsIGFic3RyYWN0PSJ0cnVlIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEd1aWRhbmNlIGV4dGVuZHMgQ29udGVudEVsZW1lbnQgewotfSAvLyBHdWlkYW5jZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9HdWlkYW5jZURlc2NyaXB0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0d1aWRhbmNlRGVzY3JpcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzJhNmU2Ni4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0d1aWRhbmNlRGVzY3JpcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWE7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkd1aWRhbmNlIERlc2NyaXB0aW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuR3VpZGFuY2VEZXNjcmlwdGlvbiNnZXRBdHRhY2htZW50cyA8ZW0+QXR0YWNobWVudHM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRHdWlkYW5jZURlc2NyaXB0aW9uKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEd1aWRhbmNlRGVzY3JpcHRpb24gZXh0ZW5kcyBDb250ZW50RGVzY3JpcHRpb24gewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkF0dGFjaG1lbnRzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+IiI8L2NvZGU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhpcyBmaWVsZCBpcyBwcmltYXJpbHkgdXNlZCBmb3IgYXR0YWNobWVudHMgYXVnbWVudGluZyB0aGUgaW5mb3JtYXRpb24gcHJvdmlkZWQgZm9yIGd1aWRhbmNlLiAgSW4gcGFydGljdWxhciB0aGUgYXR0cmlidXRlIGlzIHVzZWQgZm9yIFRlbXBsYXRlcywgRXhhbXBsZXMsIGFuZCBSZXVzYWJsZSBBc3NldHMgdG8gY29udGFpbiB0aGUgYWN0dWFsIGF0dGFjaG1lbnQgZGVzY3JpYmVkIGluIHRoZSBtYWluRGVzY3JpcHRpb24uICBJdCBjYW4gYWRkaXRpb25hbGx5IGNvbnRhaW4gcmVwcmVzZW50YXRpb25zIG9mIHRoZSBndWlkYW5jZSBpbiBqdXN0IGEgdGhpcmQgcGFydHkgZm9ybWF0LCBlLmcuIFBERiwgTVMgV29yZCwgb3IgV29yZCBQZXJmZWN0LgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BdHRhY2htZW50czwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0QXR0YWNobWVudHMoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldEd1aWRhbmNlRGVzY3JpcHRpb25fQXR0YWNobWVudHMoKQotCSAqIEBtb2RlbCBkZWZhdWx0PSIiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLlN0cmluZyIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRBdHRhY2htZW50cygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5HdWlkYW5jZURlc2NyaXB0aW9uI2dldEF0dGFjaG1lbnRzIDxlbT5BdHRhY2htZW50czwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QXR0YWNobWVudHM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEF0dGFjaG1lbnRzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRBdHRhY2htZW50cyhTdHJpbmcgdmFsdWUpOwotCi19IC8vIEd1aWRhbmNlRGVzY3JpcHRpb24KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvR3VpZGVsaW5lLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0d1aWRlbGluZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZGIxOGQwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvR3VpZGVsaW5lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5HdWlkZWxpbmU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIEd1aWRlbGluZSBpcyBhIHNwZWNpZmljIHR5cGUgb2YgZ3VpZGFuY2UgdGhhdCBwcm92aWRlcyBhZGRpdGlvbmFsIGRldGFpbCBvbiBob3cgdG8gcGVyZm9ybSBhIHBhcnRpY3VsYXIgdGFzayBvciBncm91cGluZyBvZiB0YXNrcyAoZS5nLiBncm91cGVkIHRvZ2V0aGVyIGFzIGFjdGl2aXRpZXMpIG9yIHRoYXQgcHJvdmlkZXMgYWRkaXRpb25hbCBkZXRhaWwsIHJ1bGVzLCBhbmQgcmVjb21tZW5kYXRpb25zIG9uIHdvcmsgcHJvZHVjdHMgYW5kIHRoZWlyIHByb3BlcnRpZXMuICBBbW9uZ3N0IG90aGVycywgaXQgY2FuIGluY2x1ZGUgZGV0YWlscyBhYm91dCBiZXN0IHByYWN0aWNlcyBhbmQgZGlmZmVyZW50IGFwcHJvYWNoZXMgZm9yIGRvaW5nIHdvcmssIGhvdyB0byB1c2UgcGFydGljdWxhciB0eXBlcyBvZiB3b3JrIHByb2R1Y3RzLCBpbmZvcm1hdGlvbiBvbiBkaWZmZXJlbnQgc3VidHlwZXMgYW5kIHZhcmlhbnRzIG9mIHRoZSB3b3JrIHByb2R1Y3QgYW5kIGhvdyB0aGV5IGV2b2x2ZSB0aHJvdWdob3V0IGEgbGlmZWN5Y2xlLCBkaXNjdXNzaW9ucyBvbiBza2lsbHMgdGhlIHBlcmZvcm1pbmcgcm9sZXMgc2hvdWxkIGFjcXVpcmUgb3IgaW1wcm92ZSB1cG9uLCBtZWFzdXJlbWVudHMgZm9yIHByb2dyZXNzIGFuZCBtYXR1cml0eSwgZXRjLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRHdWlkZWxpbmUoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgR3VpZGVsaW5lIGV4dGVuZHMgR3VpZGFuY2UgewotfSAvLyBHdWlkZWxpbmUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvSW1hZ2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvSW1hZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWNjNjFkNy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0ltYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi1pbXBvcnQgamF2YS5uZXQuVVJJOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5JbWFnZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkltYWdlI2dldFVyaSA8ZW0+VXJpPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkltYWdlI2dldE1pbWVUeXBlIDxlbT5NaW1lIFR5cGU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRJbWFnZSgpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBJbWFnZSBleHRlbmRzIExlYWZFbGVtZW50IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Vcmk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlVyaTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Vcmk8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFVyaShVUkkpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0SW1hZ2VfVXJpKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuVXJpIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JVVJJIGdldFVyaSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5JbWFnZSNnZXRVcmkgPGVtPlVyaTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VXJpPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRVcmkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFVyaShVUkkgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TWltZSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+IiI8L2NvZGU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TWltZSBUeXBlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1pbWUgVHlwZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0TWltZVR5cGUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldEltYWdlX01pbWVUeXBlKCkKLQkgKiBAbW9kZWwgZGVmYXVsdD0iIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5TdHJpbmciIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0TWltZVR5cGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuSW1hZ2UjZ2V0TWltZVR5cGUgPGVtPk1pbWUgVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TWltZSBUeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRNaW1lVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TWltZVR5cGUoU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBJbWFnZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9JdGVyYXRpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvSXRlcmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0MGRiMzAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9JdGVyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWE7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkl0ZXJhdGlvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEl0ZXJhdGlvbiBpcyBhIHNwZWNpYWwgQWN0aXZpdHksIHdoaWNoIHByZXNjcmliZXMgcHJlLWRlZmluZWQgdmFsdWVzIGZvciBpdHMgaW5zdGFuY2VzIGZvciB0aGUgYXR0cmlidXRlcyBwcmVmaXggKCdJdGVyYXRpb24nKSBhbmQgaXNSZXBlYXRhYmxlICgnVHJ1ZScpLiAgSXQgaGFzIGJlZW4gaW5jbHVkZWQgaW50byB0aGUgbWV0YS1tb2RlbCBmb3IgY29udmVuaWVuY2UgYW5kIHRvIHByb3ZpZGUgYSBzcGVjaWFsIHN0ZXJlb3R5cGUsIGJlY2F1c2UgaXQgcmVwcmVzZW50cyBhIHZlcnkgY29tbW9ubHkgdXNlZCBBY3Rpdml0eSB0eXBlLgotICogSXRlcmF0aW9uIGdyb3VwcyBhIHNldCBvZiBuZXN0ZWQgQWN0aXZpdGllcyB0aGF0IGFyZSByZXBlYXRlZCBtb3JlIHRoYW4gb25jZS4gIEl0IHJlcHJlc2VudHMgYW4gaW1wb3J0YW50IHN0cnVjdHVyaW5nIGVsZW1lbnQgdG8gb3JnYW5pemUgd29yayBpbiByZXBldGl0aXZlIGN5Y2xlcy4gIFRoZSBjb25jZXB0IG9mIEl0ZXJhdGlvbiBjYW4gYmUgYXNzb2NpYXRlZCB3aXRoIGRpZmZlcmVudCBydWxlcyBpbiBkaWZmZXJlbnQgbWV0aG9kcy4gIEZvciBleGFtcGxlLCB0aGUgSUJNIFJhdGlvbmFsIFVuaWZpZWQgUHJvY2VzcyBtZXRob2QgZnJhbWV3b3JrIChSVVApIGRlZmluZXMgYSBydWxlIHRoYXQgSXRlcmF0aW9ucyBhcmUgbm90IGFsbG93ZWQgdG8gc3BhbiBhY3Jvc3MgUGhhc2VzLiAgSW4gY29udHJhc3QgSUJNIEdsb2JhbCBTZXJ2aWNlcyBNZXRob2QgKEdTTWV0aG9kKSBiYXNlZCBtZXRob2QgZnJhbWV3b3JrcyB0aGlzIHJ1bGUgZG9lcyBub3QgYXBwbHkgYW5kIEl0ZXJhdGlvbiBjYW4gYmUgZGVmaW5lZCB3aGljaCBuZXN0IFBoYXNlcy4gIFJ1bGVzIGxpa2UgdGhlc2UsIHdoaWNoIHBsYXkgYW4gaW1wb3J0YW50IHJvbGUgZm9yIGVhY2ggaW5kaXZpZHVhbCBtZXRob2QgYW5kIGFyZSB0aGVyZWZvcmUgbm90IGVuZm9yY2VkIGJ5IHRoaXMgbWV0YS1tb2RlbC4gIEluc3RlYWQsIHByb2Nlc3MgYXV0aG9ycyBhcmUgZXhwZWN0ZWQgdG8gZm9sbG93IGFuZCBjaGVjayB0aGVzZSBydWxlcyBtYW51YWxseS4gIChOb3RlOiBBbnkgQnJlYWtkb3duIEVsZW1lbnQgY2FuIGJlIHJlcGVhdGVkOyBob3dldmVyLCBJdGVyYXRpb25zIGhhcyBiZWVuIGludHJvZHVjZWQgYXMgYSBzcGVjaWFsIG1ldGEtbW9kZWwgY29uY2VwdCwgYmVjYXVzZSBvZiBpdHMgaW1wb3J0YW50IHJvbGUgZm9yIG1hbnkgbWV0aG9kcy4pCi0gKiAKLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0SXRlcmF0aW9uKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEl0ZXJhdGlvbiBleHRlbmRzIEFjdGl2aXR5IHsKLX0gLy8gSXRlcmF0aW9uCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0tpbmQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvS2luZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYzA0OWUyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvS2luZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPktpbmQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5LaW5kI2dldEFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvIDxlbT5BcHBsaWNhYmxlIE1ldGEgQ2xhc3MgSW5mbzwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldEtpbmQoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgS2luZCBleHRlbmRzIENvbnRlbnRFbGVtZW50IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BcHBsaWNhYmxlIE1ldGEgQ2xhc3MgSW5mbzwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQXBwbGljYWJsZU1ldGFDbGFzc0luZm99LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+QXBwbGljYWJsZSBNZXRhIENsYXNzIEluZm88L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BcHBsaWNhYmxlIE1ldGEgQ2xhc3MgSW5mbzwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRLaW5kX0FwcGxpY2FibGVNZXRhQ2xhc3NJbmZvKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJ0cnVlIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdDxBcHBsaWNhYmxlTWV0YUNsYXNzSW5mbz4gZ2V0QXBwbGljYWJsZU1ldGFDbGFzc0luZm8oKTsKLQotfSAvLyBLaW5kCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0xlYWZFbGVtZW50LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0xlYWZFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliOGY5ZTAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9MZWFmRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+TGVhZiBFbGVtZW50PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRMZWFmRWxlbWVudCgpCi0gKiBAbW9kZWwgYWJzdHJhY3Q9InRydWUiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgTGVhZkVsZW1lbnQgZXh0ZW5kcyBEaWFncmFtRWxlbWVudCB7Ci19IC8vIExlYWZFbGVtZW50CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL01ldGhvZENvbmZpZ3VyYXRpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvTWV0aG9kQ29uZmlndXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYjBmMGFjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvTWV0aG9kQ29uZmlndXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+TWV0aG9kIENvbmZpZ3VyYXRpb248L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIE1ldGhvZCBDb25maWd1cmF0aW9uIGlzIGEgY29sbGVjdGlvbiBvZiBzZWxlY3RlZCBNZXRob2QgTW9kZWxzIGFuZCBNZXRob2RQYWNrYWdlcy4gQSBjb25maWd1cmF0aW9uIGNhbiBiZSBleHBvcnRlZCBpbnRvIGl0cyBvd24gc3RhbmRhbG9uZSBsaWJyYXJ5IHdoZW4gaXQgaW5jbHVkZXMgdGhlIGZ1bGwgdHJhbnNpdGl2ZSBjbG9zdXJlIG9mIGFsbCBlbGVtZW50cyBhbGwgb3RoZXIgZWxlbWVudHMgZGVwZW5kIG9uLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbiNnZXRNZXRob2RQbHVnaW5TZWxlY3Rpb24gPGVtPk1ldGhvZCBQbHVnaW4gU2VsZWN0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb24jZ2V0TWV0aG9kUGFja2FnZVNlbGVjdGlvbiA8ZW0+TWV0aG9kIFBhY2thZ2UgU2VsZWN0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb24jZ2V0UHJvY2Vzc1ZpZXdzIDxlbT5Qcm9jZXNzIFZpZXdzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb24jZ2V0RGVmYXVsdFZpZXcgPGVtPkRlZmF1bHQgVmlldzwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uI2dldEJhc2VDb25maWd1cmF0aW9ucyA8ZW0+QmFzZSBDb25maWd1cmF0aW9uczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uI2dldFN1YnRyYWN0ZWRDYXRlZ29yeSA8ZW0+U3VidHJhY3RlZCBDYXRlZ29yeTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uI2dldEFkZGVkQ2F0ZWdvcnkgPGVtPkFkZGVkIENhdGVnb3J5PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0TWV0aG9kQ29uZmlndXJhdGlvbigpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBNZXRob2RDb25maWd1cmF0aW9uIGV4dGVuZHMgTWV0aG9kVW5pdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TWV0aG9kIFBsdWdpbiBTZWxlY3Rpb248L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5NZXRob2QgUGx1Z2luIFNlbGVjdGlvbjwvZW0+JyByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1ldGhvZCBQbHVnaW4gU2VsZWN0aW9uPC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldE1ldGhvZENvbmZpZ3VyYXRpb25fTWV0aG9kUGx1Z2luU2VsZWN0aW9uKCkKLQkgKiBAbW9kZWwgcmVxdWlyZWQ9InRydWUiIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0PE1ldGhvZFBsdWdpbj4gZ2V0TWV0aG9kUGx1Z2luU2VsZWN0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5NZXRob2QgUGFja2FnZSBTZWxlY3Rpb248L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBhY2thZ2V9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TWV0aG9kIFBhY2thZ2UgU2VsZWN0aW9uPC9lbT4nIHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TWV0aG9kIFBhY2thZ2UgU2VsZWN0aW9uPC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldE1ldGhvZENvbmZpZ3VyYXRpb25fTWV0aG9kUGFja2FnZVNlbGVjdGlvbigpCi0JICogQG1vZGVsIHJlcXVpcmVkPSJ0cnVlIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdDxNZXRob2RQYWNrYWdlPiBnZXRNZXRob2RQYWNrYWdlU2VsZWN0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Qcm9jZXNzIFZpZXdzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50Q2F0ZWdvcnl9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UHJvY2VzcyBWaWV3czwvZW0+JyByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlByb2Nlc3MgVmlld3M8L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0TWV0aG9kQ29uZmlndXJhdGlvbl9Qcm9jZXNzVmlld3MoKQotCSAqIEBtb2RlbCBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdDxDb250ZW50Q2F0ZWdvcnk+IGdldFByb2Nlc3NWaWV3cygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGVmYXVsdCBWaWV3PC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5EZWZhdWx0IFZpZXc8L2VtPicgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGVmYXVsdCBWaWV3PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXREZWZhdWx0VmlldyhDb250ZW50Q2F0ZWdvcnkpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0TWV0aG9kQ29uZmlndXJhdGlvbl9EZWZhdWx0VmlldygpCi0JICogQG1vZGVsIHJlcXVpcmVkPSJ0cnVlIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQ29udGVudENhdGVnb3J5IGdldERlZmF1bHRWaWV3KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb24jZ2V0RGVmYXVsdFZpZXcgPGVtPkRlZmF1bHQgVmlldzwvZW0+fScgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RGVmYXVsdCBWaWV3PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXREZWZhdWx0VmlldygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RGVmYXVsdFZpZXcoQ29udGVudENhdGVnb3J5IHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkJhc2UgQ29uZmlndXJhdGlvbnM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb259LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+QmFzZSBDb25maWd1cmF0aW9uczwvZW0+JyByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkJhc2UgQ29uZmlndXJhdGlvbnM8L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0TWV0aG9kQ29uZmlndXJhdGlvbl9CYXNlQ29uZmlndXJhdGlvbnMoKQotCSAqIEBtb2RlbCBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdDxNZXRob2RDb25maWd1cmF0aW9uPiBnZXRCYXNlQ29uZmlndXJhdGlvbnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlN1YnRyYWN0ZWQgQ2F0ZWdvcnk8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRDYXRlZ29yeX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5TdWJ0cmFjdGVkIENhdGVnb3J5PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U3VidHJhY3RlZCBDYXRlZ29yeTwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRNZXRob2RDb25maWd1cmF0aW9uX1N1YnRyYWN0ZWRDYXRlZ29yeSgpCi0JICogQG1vZGVsIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0PENvbnRlbnRDYXRlZ29yeT4gZ2V0U3VidHJhY3RlZENhdGVnb3J5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BZGRlZCBDYXRlZ29yeTwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudENhdGVnb3J5fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkFkZGVkIENhdGVnb3J5PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QWRkZWQgQ2F0ZWdvcnk8L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0TWV0aG9kQ29uZmlndXJhdGlvbl9BZGRlZENhdGVnb3J5KCkKLQkgKiBAbW9kZWwgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3Q8Q29udGVudENhdGVnb3J5PiBnZXRBZGRlZENhdGVnb3J5KCk7Ci0KLX0gLy8gTWV0aG9kQ29uZmlndXJhdGlvbgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvTWV0aG9kRWxlbWVudC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9NZXRob2RFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyMzcwYjIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9NZXRob2RFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5NZXRob2QgRWxlbWVudDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEV2ZXJ5IGNsYXNzIGRlZmluZWQgaW4gdGhpcyBzcGVjaWZpY2F0aW9uIGlzIGRlcml2ZWQgZnJvbSBNZXRob2QgRWxlbWVudC4gIEluIG90aGVyIHdvcmRzIE1ldGhvZCBFbGVtZW50IGlzIHRoZSByb290IGdlbmVyYWxpemF0aW9uIGZvciBhbGwgVU1BIGNsYXNzZXMgYW5kIGRlZmluZXMgYSBjb21tb24gc2V0IG9mIGF0dHJpYnV0ZXMgaW5oZXJpdGVkIGJ5IGV2ZXJ5IG90aGVyIGVsZW1lbnQgdHlwZSBvZiB0aGlzIG1vZGVsLiAgTWV0aG9kIEVsZW1lbnQgaXRzZWxmIGlzIGRlcml2ZWQgZnJvbSBQYWNrYWdlYWJsZSBFbGVtZW50IGZyb20gdGhlIFVNTCAyLjAgSW5mcmFzdHJ1Y3R1cmUuICBNZXRob2QgRWxlbWVudCBpbmhlcml0cyB0aGUgTmFtZSBhdHRyaWJ1dGUgZnJvbSBQYWNrYWdlYWJsZSBFbGVtZW50J3Mgc3VwZXIgY2xhc3MuICBFdmVyeSBlbGVtZW50IGRlZmluZWQgYXMgYSBVTUEgaW5zdGFuY2UgaXMgZGVyaXZlZCBmcm9tIE1vZGVsIEVsZW1lbnQuICBFdmVyeSBNZXRob2QgRWxlbWVudCBpbi1zdGFuY2UgaXMgYXQgbGVhc3QgZGVmaW5lZCBieSBhIHVuaXF1ZSBpZCwgYSBuYW1lLCBhcyB3ZWxsIGFzIGJyaWVmIGRlc2NyaXB0aW9uLgotICogTWV0aG9kIEVsZW1lbnQgaW4gdGhlIHBhY2thZ2UgTWV0aG9kIFBsdWdpbiBhZGRzIGFkZGl0aW9uYWwgcHJvcGVydGllcyB2aWEgcGFja2FnZSBtZXJnZSB0byBNZXRob2QgRWxlbWVudCBkZWZpbmVkIGluIE1ldGhvZCBDb3JlIG5lZWRlZCBmb3IgdGhlIHZhcmlhYmlsaXR5IGFuZCBleHRlbnNpYmlsaXR5IGNhcGFiaWxpdGllcyBpbnRyb2R1Y2VzIGluIHRoaXMgcGFja2FnZS4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQjZ2V0R3VpZCA8ZW0+R3VpZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50I2dldFByZXNlbnRhdGlvbk5hbWUgPGVtPlByZXNlbnRhdGlvbiBOYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQjZ2V0QnJpZWZEZXNjcmlwdGlvbiA8ZW0+QnJpZWYgRGVzY3JpcHRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudCNnZXRPd25lZFJ1bGVzIDxlbT5Pd25lZCBSdWxlczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50I2dldE1ldGhvZEVsZW1lbnRQcm9wZXJ0eSA8ZW0+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudCNnZXRLaW5kIDxlbT5LaW5kPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQjZ2V0U3VwcHJlc3NlZCA8ZW0+U3VwcHJlc3NlZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50I2dldE9yZGVyaW5nR3VpZGUgPGVtPk9yZGVyaW5nIEd1aWRlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0TWV0aG9kRWxlbWVudCgpCi0gKiBAbW9kZWwgYWJzdHJhY3Q9InRydWUiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgTWV0aG9kRWxlbWVudCBleHRlbmRzIFBhY2thZ2VhYmxlRWxlbWVudCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+R3VpZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiIiPC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIEV2ZXJ5IGluc3RhbmNlIG9mIE1ldGhvZCBFbGVtZW50IGhhcyBhIGdsb2JhbCB1bmlxdWUgaWQuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkd1aWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEd1aWQoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldE1ldGhvZEVsZW1lbnRfR3VpZCgpCi0JICogQG1vZGVsIGRlZmF1bHQ9IiIgaWQ9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLlN0cmluZyIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRHdWlkKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQjZ2V0R3VpZCA8ZW0+R3VpZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+R3VpZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0R3VpZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0R3VpZChTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iIjwvY29kZT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBFdmVyeSBEZXNjcmliYWJsZSBFbGVtZW50IGhhcyBhIHByZXNlbnRhdGlvbiBuYW1lLCB3aGljaCBpcyB1c2VkIGZvciBleHRlcm5hbCBwcmVzZW50YXRpb24gb2YgdGhlIGVsZW1lbnQuICBGb3IgZXhhbXBsZSwgbmFtZSAodGhlIGludGVybmFsIHJlcHJlc2VudGF0aW9uKSBtaWdodCBiZSBzZXQgdG8gInJ1cF9hcmNoaXRlY3R1cmVfZG9jdW1lbnQiIHRvIGRpZmZlcmVudGlhdGUgZnJvbSBhICJqMmVlX2FyY2hpdGN0dXJlX2RvY3VtZW50IiB3aGVyZWFzIHRoZSBleHRlcm5hbCBwcmVzZW50YXRpb24gd291bGQgYWx3YXlzIGJlICJBcmNoaXRlY3R1cmUgRG9jdW1lbnQiLgotCSAqIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QcmVzZW50YXRpb24gTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UHJlc2VudGF0aW9uTmFtZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0TWV0aG9kRWxlbWVudF9QcmVzZW50YXRpb25OYW1lKCkKLQkgKiBAbW9kZWwgZGVmYXVsdD0iIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5TdHJpbmciIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0UHJlc2VudGF0aW9uTmFtZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50I2dldFByZXNlbnRhdGlvbk5hbWUgPGVtPlByZXNlbnRhdGlvbiBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5QcmVzZW50YXRpb24gTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UHJlc2VudGF0aW9uTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UHJlc2VudGF0aW9uTmFtZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iIjwvY29kZT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBFdmVyeSBpbnN0YW5jZSBvZiBNZXRob2QgRWxlbWVudCBzaGFsbCBiZSBicmllZmx5IGRlc2NyaWJlZCB3aXRoIG9uZSBvciB0d28gc2VudGVuY2VzIHN1bW1hcml6aW5nIHRoZSBlbGVtZW50LgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5CcmllZiBEZXNjcmlwdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0QnJpZWZEZXNjcmlwdGlvbihTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0TWV0aG9kRWxlbWVudF9CcmllZkRlc2NyaXB0aW9uKCkKLQkgKiBAbW9kZWwgZGVmYXVsdD0iIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5TdHJpbmciIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0QnJpZWZEZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50I2dldEJyaWVmRGVzY3JpcHRpb24gPGVtPkJyaWVmIERlc2NyaXB0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5CcmllZiBEZXNjcmlwdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0QnJpZWZEZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0QnJpZWZEZXNjcmlwdGlvbihTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+T3duZWQgUnVsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnN0cmFpbnR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+T3duZWQgUnVsZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Pd25lZCBSdWxlczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRNZXRob2RFbGVtZW50X093bmVkUnVsZXMoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9InRydWUiIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0PENvbnN0cmFpbnQ+IGdldE93bmVkUnVsZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50UHJvcGVydHl9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRNZXRob2RFbGVtZW50X01ldGhvZEVsZW1lbnRQcm9wZXJ0eSgpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0idHJ1ZSIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3Q8TWV0aG9kRWxlbWVudFByb3BlcnR5PiBnZXRNZXRob2RFbGVtZW50UHJvcGVydHkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPktpbmQ8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLktpbmR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+S2luZDwvZW0+JyByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPktpbmQ8L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0TWV0aG9kRWxlbWVudF9LaW5kKCkKLQkgKiBAbW9kZWwgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3Q8S2luZD4gZ2V0S2luZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiJmYWxzZSI8L2NvZGU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogSWYgYSBWYXJpYWJpbGl0eSBFbGVtZW50IGlzIGRlcml2ZWQgZnJvbSBhbm90aGVyIFZhcmlhYmlsaXR5IEVsZW1lbnQgdXNpbmcgdGhlIEV4dGVuZHMgVmFyaWFiaWxpdHkgU3BlY2lhbGl6YXRpb24gdGhlbiB0aGlzIGF0dHJpYnV0ZSBjYW4gYmUgdXNlZCB0byBzdXBwcmVzcyBpbmhlcml0ZWQgTWV0aG9kIEVsZW1lbnRzIHRoYXQgd2VyZSBwYXJ0IG9mIHRoZSBiYXNlZC1vbiBWYXJpYWJpbGl0eSBFbGVtZW50LCB3aGljaCBjYW4gYmUgYW55IHR5cGUgb2YgTWV0aG9kIEVsZW1lbnQuICBJbiBvdGhlciB3b3JkcywgaWYgdGhpcyBhdHRyaWJ1dGUgaXMgc2V0IHRvIHRydWUgb24gYSBNZXRob2QgRWxlbWVudCB0aGF0IGhhcyB0aGUgc2FtZSBuYW1lIHRoYW4gYW4gaW5oZXJpdGVkIG1ldGhvZCBlbGVtZW50IHRoZW4gaXQgd2lsbCBub3QgYmUgcmVnYXJkZWQgYXMgaW5oZXJpdGVkIGF0IGFsbC4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U3VwcHJlc3NlZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0U3VwcHJlc3NlZChCb29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldE1ldGhvZEVsZW1lbnRfU3VwcHJlc3NlZCgpCi0JICogQG1vZGVsIGRlZmF1bHQ9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5Cb29sZWFuIiByZXF1aXJlZD0idHJ1ZSIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJvb2xlYW4gZ2V0U3VwcHJlc3NlZCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50I2dldFN1cHByZXNzZWQgPGVtPlN1cHByZXNzZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlN1cHByZXNzZWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFN1cHByZXNzZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFN1cHByZXNzZWQoQm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiIiPC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoaXMgYXR0cmlidXRlIGlzIHVzZWQgZm9yIENBU0UgdG9vbCByZWFsaXphdGlvbnMgb2YgdGhpcyBtb2RlbCB0byBjb250YWluIGluZm9ybWF0aW9uIGFib3V0IGxheW91dCBhbmQgb3JkZXJpbmcgb2YgdGhlIG1ldGhvZCBlbGVtZW50IGFuZCBpdHMgcGFydHMuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk9yZGVyaW5nIEd1aWRlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRPcmRlcmluZ0d1aWRlKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRNZXRob2RFbGVtZW50X09yZGVyaW5nR3VpZGUoKQotCSAqIEBtb2RlbCBkZWZhdWx0PSIiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLlN0cmluZyIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRPcmRlcmluZ0d1aWRlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQjZ2V0T3JkZXJpbmdHdWlkZSA8ZW0+T3JkZXJpbmcgR3VpZGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk9yZGVyaW5nIEd1aWRlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRPcmRlcmluZ0d1aWRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRPcmRlcmluZ0d1aWRlKFN0cmluZyB2YWx1ZSk7Ci0KLX0gLy8gTWV0aG9kRWxlbWVudApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9NZXRob2RFbGVtZW50UHJvcGVydHkuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvTWV0aG9kRWxlbWVudFByb3BlcnR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjY2IwMjcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9NZXRob2RFbGVtZW50UHJvcGVydHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWE7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudFByb3BlcnR5I2dldFZhbHVlIDxlbT5WYWx1ZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldE1ldGhvZEVsZW1lbnRQcm9wZXJ0eSgpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBNZXRob2RFbGVtZW50UHJvcGVydHkgZXh0ZW5kcyBQYWNrYWdlYWJsZUVsZW1lbnQgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+IiI8L2NvZGU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VmFsdWU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VmFsdWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFZhbHVlKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRNZXRob2RFbGVtZW50UHJvcGVydHlfVmFsdWUoKQotCSAqIEBtb2RlbCBkZWZhdWx0PSIiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLlN0cmluZyIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRWYWx1ZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50UHJvcGVydHkjZ2V0VmFsdWUgPGVtPlZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5WYWx1ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0VmFsdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFZhbHVlKFN0cmluZyB2YWx1ZSk7Ci0KLX0gLy8gTWV0aG9kRWxlbWVudFByb3BlcnR5CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL01ldGhvZExpYnJhcnkuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvTWV0aG9kTGlicmFyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMDRlNThmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvTWV0aG9kTGlicmFyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5NZXRob2QgTGlicmFyeTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEEgTWV0aG9kIExpYnJhcnkgaXMgYSBwaHlzaWNhbCBjb250YWluZXIgZm9yIE1ldGhvZCBQbHVnaW5zIGFuZCBNZXRob2QgQ29uZmlndXJhdGlvbiBkZWZpbml0aW9ucy4gIEFsbCBNZXRob2QgRWxlbWVudHMgYXJlIHN0b3JlZCBpbiBhIE1ldGhvZCBMaWJyYXJ5LgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeSNnZXRNZXRob2RQbHVnaW5zIDxlbT5NZXRob2QgUGx1Z2luczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5I2dldFByZWRlZmluZWRDb25maWd1cmF0aW9ucyA8ZW0+UHJlZGVmaW5lZCBDb25maWd1cmF0aW9uczwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldE1ldGhvZExpYnJhcnkoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgTWV0aG9kTGlicmFyeSBleHRlbmRzIE1ldGhvZFVuaXQsIG9yZy5lY2xpcHNlLmVwZi51bWEuUGFja2FnZSB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TWV0aG9kIFBsdWdpbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5NZXRob2QgUGx1Z2luczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1ldGhvZCBQbHVnaW5zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldE1ldGhvZExpYnJhcnlfTWV0aG9kUGx1Z2lucygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0idHJ1ZSIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3Q8TWV0aG9kUGx1Z2luPiBnZXRNZXRob2RQbHVnaW5zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QcmVkZWZpbmVkIENvbmZpZ3VyYXRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9ufS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlByZWRlZmluZWQgQ29uZmlndXJhdGlvbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QcmVkZWZpbmVkIENvbmZpZ3VyYXRpb25zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldE1ldGhvZExpYnJhcnlfUHJlZGVmaW5lZENvbmZpZ3VyYXRpb25zKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJ0cnVlIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdDxNZXRob2RDb25maWd1cmF0aW9uPiBnZXRQcmVkZWZpbmVkQ29uZmlndXJhdGlvbnMoKTsKLQotfSAvLyBNZXRob2RMaWJyYXJ5CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL01ldGhvZFBhY2thZ2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvTWV0aG9kUGFja2FnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NDI0MTFkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvTWV0aG9kUGFja2FnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5NZXRob2QgUGFja2FnZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEEgTWV0aG9kIFBhY2thZ2UgaXMgYW4gYWJzdHJhY3QgY2xhc3MgZm9yIHBhY2thZ2luZyBNZXRob2QgRWxlbWVudHMuICBBbGwgTWV0aG9kIEVsZW1lbnRzIHNoYWxsIGJlIGxvY2F0ZWQgaW4gZXhhY3RseSBvbmUgb2YgTWV0aG9kIFBhY2thZ2UncyBjb25jcmV0ZSBzcGVjaWFsaXphdGlvbnMgKGUuZy4gQ29udGVudCBQYWNrYWdlKS4gICBNZXRob2QgUGFja2FnZSBkZWZpbmVzIGNvbW1vbiBwcm9wZXJ0aWVzIGZvciBhbGwgb2YgaXRzIHNwZWNpYWxpemF0aW9ucy4gRWxlbWVudHMgYXJlIG9yZ2FuaXplZCBpbiBNZXRob2QgUGFja2FnZXMgdG8gc3RydWN0dXJlIGxhcmdlIHNjYWxlIG9mIG1ldGhvZCBjb250ZW50IGFuZCBwcm9jZXNzZXMgYXMgd2VsbCBhcyB0byBkZWZpbmUgYSBtZWNoYW5pc20gZm9yIHJldXNlLiAgTWV0aG9kIEVsZW1lbnRzIGZyb20gb25lIHBhY2thZ2UgY2FuIHJldXNlIGVsZW1lbnQgZnJvbSBvdGhlciBwYWNrYWdlcyBieSBkZWZpbmluZyBhIHJldXNlZFBhY2thZ2VzIGxpbmsuICBGb3IgZXhhbXBsZSwgYSB3b3JrIHByb2R1Y3QgZGVmaW5lZCBpbiBvbmUgcGFja2FnZSBjYW4gYmUgdXNlZCBhcyBhbiBpbnB1dCBmb3IgVGFza3MgZGVmaW5lZCBpbiBvdGhlciBwYWNrYWdlcy4gIEJ5IHJldXNpbmcgaXQgZnJvbSBvbmUgY29tbW9uIHBsYWNlIChpLmUuIHRoZSBwYWNrYWdlIGluIHdoaWNoIGl0IGhhcyBiZWVuIGRlZmluZWQpIGVuc3VyZXMgdGhhdCBubyByZWR1bmRhbnQgZGVmaW5pdGlvbnMgb2YgdGhlIHNhbWUgZWxlbWVudHMgYXJlIHJlcXVpcmVkLiAgQWxzbyBtYWludGVuYW5jZSBvZiBtZXRob2QgY29udGVudCBpcyBncmVhdGx5IGltcHJvdmVkIGFzIGNoYW5nZXMgY2FuIGJlIHBlcmZvcm1lZCBpbiBvbmx5IG9uZSBwbGFjZS4gIE5vdGUsIHRoYXQgb3RoZXIgcGFja2FnZXMgd2lsbCBpbnRyb2R1Y2UgbW9yZSBzcGVjaWFsaXphdGlvbnMgb2YgTWV0aG9kIFBhY2thZ2UsIGUuZy4gUHJvY2VzcyBQYWNrYWdlIGFuZCBQcm9jZXNzIENvbXBvbmVudC4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBhY2thZ2UjZ2V0R2xvYmFsIDxlbT5HbG9iYWw8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGFja2FnZSNnZXRSZXVzZWRQYWNrYWdlcyA8ZW0+UmV1c2VkIFBhY2thZ2VzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBhY2thZ2UjZ2V0Q2hpbGRQYWNrYWdlcyA8ZW0+Q2hpbGQgUGFja2FnZXM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRNZXRob2RQYWNrYWdlKCkKLSAqIEBtb2RlbCBhYnN0cmFjdD0idHJ1ZSIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBNZXRob2RQYWNrYWdlIGV4dGVuZHMgTWV0aG9kRWxlbWVudCwKLQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5QYWNrYWdlIHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5HbG9iYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iZmFsc2UiPC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIE1ldGhvZCBQYWNrYWdlcyBjYW4gaGF2ZSBhIGdsb2JhbCBzY29wZS4gIFRoaXMgbWVhbnMgdGhhdCBldmVyeSBlbGVtZW50IG9mIGV2ZXJ5IG90aGVyIE1ldGhvZCBQYWNrYWdlIGNhbiBzZWUgdGhlIGdsb2JhbCBwYWNrYWdlJ3MgY29udGVudHMuICBHbG9iYWwgTWV0aG9kIFBhY2thZ2VzIGFyZSBwcmltYXJpbHkgdXNlZCB0byBzdG9yZSBjb21tb25seSB1c2VkIGNhdGVnb3J5IGRlZmluaXRpb25zIHN1Y2ggYXMgZm9yIERpc2NpcGxpbmVzIG9yIERvbWFpbnMsIHdoaWNoIGFyZSB1c2VkIGJ5IG1hbnkgVGFzayBhbmQgV29yayBQcm9kdWN0cyByZXNwZWN0aXZlbHkuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkdsb2JhbDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0R2xvYmFsKEJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0TWV0aG9kUGFja2FnZV9HbG9iYWwoKQotCSAqIEBtb2RlbCBkZWZhdWx0PSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuQm9vbGVhbiIgcmVxdWlyZWQ9InRydWUiIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCb29sZWFuIGdldEdsb2JhbCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQYWNrYWdlI2dldEdsb2JhbCA8ZW0+R2xvYmFsPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5HbG9iYWw8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEdsb2JhbCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0R2xvYmFsKEJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmV1c2VkIFBhY2thZ2VzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQYWNrYWdlfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlJldXNlZCBQYWNrYWdlczwvZW0+JyByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJldXNlZCBQYWNrYWdlczwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRNZXRob2RQYWNrYWdlX1JldXNlZFBhY2thZ2VzKCkKLQkgKiBAbW9kZWwgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3Q8TWV0aG9kUGFja2FnZT4gZ2V0UmV1c2VkUGFja2FnZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNoaWxkIFBhY2thZ2VzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQYWNrYWdlfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNoaWxkIFBhY2thZ2VzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q2hpbGQgUGFja2FnZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0TWV0aG9kUGFja2FnZV9DaGlsZFBhY2thZ2VzKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJ0cnVlIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdDxNZXRob2RQYWNrYWdlPiBnZXRDaGlsZFBhY2thZ2VzKCk7Ci0KLQlNZXRob2RQYWNrYWdlIGdldFBhcmVudFBhY2thZ2UoKTsKLQotfSAvLyBNZXRob2RQYWNrYWdlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL01ldGhvZFBsdWdpbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9NZXRob2RQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWQ3ZThjOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL01ldGhvZFBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+TWV0aG9kIFBsdWdpbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEEgTWV0aG9kIFBsdWdpbiBpcyBhIE1ldGhvZCBFbGVtZW50IHRoYXQgcmVwcmVzZW50cyBhIHBoeXNpY2FsIGNvbnRhaW5lciBmb3IgTWV0aG9kIFBhY2thZ2VzLiAgSXQgZGVmaW5lcyBhIGdyYW51bGFyaXR5IGxldmVsIGZvciB0aGUgbW9kdWxhcml6YXRpb24gYW5kIG9yZ2FuaXphdGlvbiBvZiBtZXRob2QgY29udGVudCBhbmQgcHJvY2Vzc2VzLiAgQSBNZXRob2QgUGx1Z2luIGNhbiBleHRlbmQgbWFueSBvdGhlciBNZXRob2QgUGx1Z2lucyBhbmQgaXQgY2FuIGJlIGV4dGVuZGVkIGJ5IG1hbnkgTWV0aG9kIFBsdWdpbnMuICBJdCBjYW4gYWxzbyBiZSB1c2VkIHN0YW5kLWFsb25lLCBpLmUuIHdpdGggbm8gRXh0ZW5zaW9uIHJlbGF0aW9uc2hpcCB0byBvdGhlciBwbHVnLWlucy4KLSAqIE1ldGhvZCBQbHVnaW4gY29uY2VwdHVhbGx5IHJlcHJlc2VudHMgYSB1bml0IGZvciBjb25maWd1cmF0aW9uLCBtb2R1bGFyaXphdGlvbiwgZXh0ZW5zaW9uLCBwYWNrYWdpbmcsIGFuZCBkZXBsb3ltZW50IG9mIG1ldGhvZCBjb250ZW50IGFuZCBwcm9jZXNzZXMuICBBIFByb2Nlc3MgRW5naW5lZXIgc2hhbGwgZGVzaWduIGhpcyBQbHVnaW5zIGFuZCBhbGxvY2F0ZSBoaXMgY29udGVudCB0byB0aGVzZSBQbHVnaW5zIHdpdGggcmVxdWlyZW1lbnRzIGZvciBleHRlbnNpYmlsaXR5LCBtb2R1bGFyaXR5LCByZXVzZSwgYW5kIG1haW50YWluYWJpbGl0eSBpbiBtaW5kLgotICogU3BlY2lhbCBleHRlbnNpYmlsaXR5IG1lY2hhbmlzbXMgZGVmaW5lZCBmb3IgdGhlIG1ldGEtY2xhc3NlcyBWYXJpYWJpbGl0eSBFbGVtZW50IGFuZCBQcm9jZXNzIENvbnRyaWJ1dGlvbiBhbGxvdyBQbHVnaW4gY29udGVudCB0byBkaXJlY3RseSBjb250cmlidXRlIG5ldyBjb250ZW50LCByZXBsYWNlIGV4aXN0aW5nIGNvbnRlbnQsIG9yIHRvIGNyb3NzLXJlZmVyZW5jZSB0byBhbnkgQ29udGVudCBFbGVtZW50IG9yIFByb2Nlc3Mgd2l0aGluIGFub3RoZXIgUGx1Z2luIHRoYXQgaXQgZXh0ZW5kcy4gIFNpbWlsYXIgdG8gVU1MIDIuMCdzICdwYWNrYWdlIG1lcmdlJyBtZWNoYW5pc20gdHJhbnNmb3JtYXRpb24gaW50ZXJwcmV0YXRpb25zLCBpbnRlcnByZXRpbmcgdGhlc2UgTWV0aG9kIFBsdWdpbiBtZWNoYW5pc21zIHJlc3VsdHMgaW50byBuZXcgZXh0ZW5kZWQgTWV0aG9kIENvbnRlbnQgYW5kIFByb2Nlc3Nlcy4KLSAqIAotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luI2dldFVzZXJDaGFuZ2VhYmxlIDxlbT5Vc2VyIENoYW5nZWFibGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luI2dldE1ldGhvZFBhY2thZ2VzIDxlbT5NZXRob2QgUGFja2FnZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luI2dldEJhc2VzIDxlbT5CYXNlczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW4jaXNTdXBwb3J0aW5nIDxlbT5TdXBwb3J0aW5nPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0TWV0aG9kUGx1Z2luKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIE1ldGhvZFBsdWdpbiBleHRlbmRzIE1ldGhvZFVuaXQsIG9yZy5lY2xpcHNlLmVwZi51bWEuUGFja2FnZSB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VXNlciBDaGFuZ2VhYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+InRydWUiPC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlVzZXIgQ2hhbmdlYWJsZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Vc2VyIENoYW5nZWFibGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFVzZXJDaGFuZ2VhYmxlKEJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0TWV0aG9kUGx1Z2luX1VzZXJDaGFuZ2VhYmxlKCkKLQkgKiBAbW9kZWwgZGVmYXVsdD0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuQm9vbGVhbiIgcmVxdWlyZWQ9InRydWUiIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCb29sZWFuIGdldFVzZXJDaGFuZ2VhYmxlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbiNnZXRVc2VyQ2hhbmdlYWJsZSA8ZW0+VXNlciBDaGFuZ2VhYmxlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Vc2VyIENoYW5nZWFibGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFVzZXJDaGFuZ2VhYmxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRVc2VyQ2hhbmdlYWJsZShCb29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1ldGhvZCBQYWNrYWdlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGFja2FnZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5NZXRob2QgUGFja2FnZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NZXRob2QgUGFja2FnZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0TWV0aG9kUGx1Z2luX01ldGhvZFBhY2thZ2VzKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJ0cnVlIiByZXF1aXJlZD0idHJ1ZSIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3Q8TWV0aG9kUGFja2FnZT4gZ2V0TWV0aG9kUGFja2FnZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkJhc2VzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW59LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+QmFzZXM8L2VtPicgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5CYXNlczwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRNZXRob2RQbHVnaW5fQmFzZXMoKQotCSAqIEBtb2RlbCBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdDxNZXRob2RQbHVnaW4+IGdldEJhc2VzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TdXBwb3J0aW5nPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5TdXBwb3J0aW5nPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIEEgc3VwcG9ydGluZyBtZXRob2QgcGx1Zy1pbiBpcyBhIHBsdWctaW4gdGhhdCBjb250YWlucyBzdXBwb3J0aW5nIGFuZCBvcHRpb25hbCBtZXRob2QgZWxlbWVudHMuIE9ubHkgdGhlIGVsZW1lbnRzIHRoYXQgYXJlIHJlZmVyZW5jZWQgZnJvbSBub24tc3VwcG9ydGluZyBwbHVnLWluIGFyZSB0byBiZSBjb25zaWRlcmVkIGZvciBpbmNsdXNpb24gaW50byBhIG1ldGhvZCBjb25maWd1cmF0aW9uLiBJbiBvdGhlciB3b3JkcywgaWYgYSBzdXBwb3J0aW5nIG1ldGhvZCBwbHVnLWluIGlzIHNlbGVjdGVkIGZvciBhIGNvbmZpZ3VyYXRpb24gb25seSBpdHMgZWxlbWVudHMgcmVmZXJlbmNlZCBmcm9tIG91dHNpZGUgb2YgdGhpcyBwbHVnLWluIHdpbGwgYmUgY29uc2lkZXJlZCBmb3IgdGhlIGNvbmZpZ3VyYXRpb24uICBBbGwgb3RoZXIgdW5yZWZlcmVuY2VkIGVsZW1lbnRzIHdpbGwgbm90IGJlLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TdXBwb3J0aW5nPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRTdXBwb3J0aW5nKGJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0TWV0aG9kUGx1Z2luX1N1cHBvcnRpbmcoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU3VwcG9ydGluZygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW4jaXNTdXBwb3J0aW5nIDxlbT5TdXBwb3J0aW5nPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TdXBwb3J0aW5nPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1N1cHBvcnRpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFN1cHBvcnRpbmcoYm9vbGVhbiB2YWx1ZSk7Ci0KLX0gLy8gTWV0aG9kUGx1Z2luCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL01ldGhvZFVuaXQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvTWV0aG9kVW5pdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNzk2MDIxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvTWV0aG9kVW5pdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+TWV0aG9kIFVuaXQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIE1ldGhvZCBVbml0IGlzIGEgc3BlY2lhbCBNZXRob2QgRWxlbWVudCB0aGF0IHNoYWxsIGJlIG1haW50YWluZWQgaW4gYSBNZXRob2QgTGlicmFyeSBhcyBhIHNlcGFyYXRlIHVuaXQgb2YgY29udHJvbC4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFVuaXQjZ2V0QXV0aG9ycyA8ZW0+QXV0aG9yczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RVbml0I2dldENoYW5nZURhdGUgPGVtPkNoYW5nZSBEYXRlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFVuaXQjZ2V0Q2hhbmdlRGVzY3JpcHRpb24gPGVtPkNoYW5nZSBEZXNjcmlwdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RVbml0I2dldFZlcnNpb24gPGVtPlZlcnNpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kVW5pdCNnZXRDb3B5cmlnaHRTdGF0ZW1lbnQgPGVtPkNvcHlyaWdodCBTdGF0ZW1lbnQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRNZXRob2RVbml0KCkKLSAqIEBtb2RlbCBhYnN0cmFjdD0idHJ1ZSIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBNZXRob2RVbml0IGV4dGVuZHMgTWV0aG9kRWxlbWVudCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QXV0aG9yczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiIiPC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIEV2ZXJ5IE1ldGhvZCBVbml0IGlzIGJlaW5nIGNyZWF0ZWQgYW5kIG93bmVkIGJ5IGFuIGF1dGhvciBvciBhdXRob3JpbmcgdGVhbS4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QXV0aG9yczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0QXV0aG9ycyhTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0TWV0aG9kVW5pdF9BdXRob3JzKCkKLQkgKiBAbW9kZWwgZGVmYXVsdD0iIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5TdHJpbmciIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0QXV0aG9ycygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RVbml0I2dldEF1dGhvcnMgPGVtPkF1dGhvcnM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkF1dGhvcnM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEF1dGhvcnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEF1dGhvcnMoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNoYW5nZSBEYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgZGF0ZSB0aGUgbGFzdCBjaGFuZ2UgdGhhdCByZXN1bHRlZCBpbnRvIHRoaXMgdmVyc2lvbiBoYXMgYmVlbiBtYWRlLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5DaGFuZ2UgRGF0ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0Q2hhbmdlRGF0ZShEYXRlKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldE1ldGhvZFVuaXRfQ2hhbmdlRGF0ZSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLkRhdGUiIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlEYXRlIGdldENoYW5nZURhdGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kVW5pdCNnZXRDaGFuZ2VEYXRlIDxlbT5DaGFuZ2UgRGF0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q2hhbmdlIERhdGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldENoYW5nZURhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldENoYW5nZURhdGUoRGF0ZSB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5DaGFuZ2UgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iIjwvY29kZT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgZGVzY3JpcHRpb24gb2YgdGhlIGxhc3QgY2hhbmdlIHRoYXQgcmVzdWx0ZWQgaW50byB0aGlzIHZlcnNpb24uCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNoYW5nZSBEZXNjcmlwdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0Q2hhbmdlRGVzY3JpcHRpb24oU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldE1ldGhvZFVuaXRfQ2hhbmdlRGVzY3JpcHRpb24oKQotCSAqIEBtb2RlbCBkZWZhdWx0PSIiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLlN0cmluZyIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRDaGFuZ2VEZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RVbml0I2dldENoYW5nZURlc2NyaXB0aW9uIDxlbT5DaGFuZ2UgRGVzY3JpcHRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNoYW5nZSBEZXNjcmlwdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0Q2hhbmdlRGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldENoYW5nZURlc2NyaXB0aW9uKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5WZXJzaW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+IiI8L2NvZGU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogRXZlcnkgUGFja2FnZSBoYXMgYSB2ZXJzaW9uIG51bWJlciB1c2VkIHRvIHRyYWNrIGNoYW5nZXMuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlZlcnNpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFZlcnNpb24oU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldE1ldGhvZFVuaXRfVmVyc2lvbigpCi0JICogQG1vZGVsIGRlZmF1bHQ9IiIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuU3RyaW5nIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFZlcnNpb24oKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kVW5pdCNnZXRWZXJzaW9uIDxlbT5WZXJzaW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5WZXJzaW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRWZXJzaW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRWZXJzaW9uKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Db3B5cmlnaHQgU3RhdGVtZW50PC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Db3B5cmlnaHQgU3RhdGVtZW50PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRDb3B5cmlnaHRTdGF0ZW1lbnQoU3VwcG9ydGluZ01hdGVyaWFsKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldE1ldGhvZFVuaXRfQ29weXJpZ2h0U3RhdGVtZW50KCkKLQkgKiBAbW9kZWwgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN1cHBvcnRpbmdNYXRlcmlhbCBnZXRDb3B5cmlnaHRTdGF0ZW1lbnQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kVW5pdCNnZXRDb3B5cmlnaHRTdGF0ZW1lbnQgPGVtPkNvcHlyaWdodCBTdGF0ZW1lbnQ8L2VtPn0nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNvcHlyaWdodCBTdGF0ZW1lbnQ8L2VtPicgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldENvcHlyaWdodFN0YXRlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Q29weXJpZ2h0U3RhdGVtZW50KFN1cHBvcnRpbmdNYXRlcmlhbCB2YWx1ZSk7Ci0KLX0gLy8gTWV0aG9kVW5pdApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9NaWxlc3RvbmUuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvTWlsZXN0b25lLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzZWM4NzEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9NaWxlc3RvbmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+TWlsZXN0b25lPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQSBNaWxlc3RvbmUgZGVzY3JpYmVzIGEgc2lnbmlmaWNhbnQgZXZlbnQgaW4gYSBkZXZlbG9wbWVudCBwcm9qZWN0LCBzdWNoIGFzIGEgbWFqb3IgZGVjaXNpb24sIGNvbXBsZXRpb24gb2YgYSBkZWxpdmVyYWJsZSwgb3IgbWVldGluZyBvZiBhIG1ham9yIGRlcGVuZGVuY3kgKGxpa2UgY29tcGxldGlvbiBvZiBhIHByb2plY3QgcGhhc2UpLiAgQmVjYXVzZSwgTWlsZXN0b25lIGlzIGNvbW1vbmx5IHVzZWQgdG8gcmVmZXIgdG8gYm90aCB0aGUgZXZlbnQgaXRzZWxmIGFuZCB0aGUgcG9pbnQgaW4gdGltZSBhdCB3aGljaCB0aGUgZXZlbnQgaXMgc2NoZWR1bGVkIHRvIGhhcHBlbiwgaXQgaXMgbW9kZWxlZCBhcyBhIEJyZWFrZG93biBFbGVtZW50IChpLmUuIGl0IGFwcGVhcnMgYXMgcGFydCBvZiBhIGJyZWFrZG93biBzdHJ1Y3R1cmUpLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWlsZXN0b25lI2dldFJlcXVpcmVkUmVzdWx0cyA8ZW0+UmVxdWlyZWQgUmVzdWx0czwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldE1pbGVzdG9uZSgpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBNaWxlc3RvbmUgZXh0ZW5kcyBXb3JrQnJlYWtkb3duRWxlbWVudCB7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SZXF1aXJlZCBSZXN1bHRzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3J9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UmVxdWlyZWQgUmVzdWx0czwvZW0+JyByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJlcXVpcmVkIFJlc3VsdHM8L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0TWlsZXN0b25lX1JlcXVpcmVkUmVzdWx0cygpCi0JICogQG1vZGVsIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0PFdvcmtQcm9kdWN0RGVzY3JpcHRvcj4gZ2V0UmVxdWlyZWRSZXN1bHRzKCk7Ci19IC8vIE1pbGVzdG9uZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9OYW1lZEVsZW1lbnQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvTmFtZWRFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxOWRmNDIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9OYW1lZEVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWE7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk5hbWVkIEVsZW1lbnQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBVTUwgMi4wIG1ldGEtY2xhc3MgTmFtZWQgRWxlbWVudC4gIERlZmluZWQgdGhhdCBldmVyeSBlbGVtZW50IGhhcyBhIG5hbWUuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5OYW1lZEVsZW1lbnQjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldE5hbWVkRWxlbWVudCgpCi0gKiBAbW9kZWwgYWJzdHJhY3Q9InRydWUiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgTmFtZWRFbGVtZW50IGV4dGVuZHMgRWxlbWVudCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiIiPC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0TmFtZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0TmFtZWRFbGVtZW50X05hbWUoKQotCSAqIEBtb2RlbCBkZWZhdWx0PSIiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLlN0cmluZyIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXROYW1lKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk5hbWVkRWxlbWVudCNnZXROYW1lIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXROYW1lKFN0cmluZyB2YWx1ZSk7Ci0KLX0gLy8gTmFtZWRFbGVtZW50CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL05hbWVzcGFjZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9OYW1lc3BhY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2NlYWEyNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL05hbWVzcGFjZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+TmFtZXNwYWNlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogVU1MIDIuMCBtZXRhLWNsYXNzIE5hbWVzcGFjZS4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0TmFtZXNwYWNlKCkKLSAqIEBtb2RlbCBhYnN0cmFjdD0idHJ1ZSIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBOYW1lc3BhY2UgZXh0ZW5kcyBOYW1lZEVsZW1lbnQgewotfSAvLyBOYW1lc3BhY2UKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvT3V0Y29tZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9PdXRjb21lLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxMzU5NmYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9PdXRjb21lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5PdXRjb21lPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQW4gb3V0Y29tZSBkZXNjcmliZXMgaW50YW5naWJsZSB3b3JrIHByb2R1Y3RzIHRoYXQgYXJlIGEgcmVzdWx0IG9yIHN0YXRlLiBPdXRjb21lcyBtYXkgYWxzbyBiZSB1c2VkIHRvIGRlc2NyaWJlIHdvcmsgcHJvZHVjdHMgdGhhdCBhcmUgbm90IGZvcm1hbGx5IGRlZmluZWQuICBBIGtleSBkaWZmZXJlbnRpYXRvciBmb3Igb3V0Y29tZXMgYWdhaW5zdCBhcnRpZmFjdHMgaXMgdGhhdCBvdXRjb21lcyBhcmUgbm90IGNhbmRpZGF0ZXMgZm9yIGhhcnZlc3RpbmcgYXMgcmV1c2FibGUgYXNzZXRzLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRPdXRjb21lKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIE91dGNvbWUgZXh0ZW5kcyBXb3JrUHJvZHVjdCB7Ci19IC8vIE91dGNvbWUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvUGFja2FnZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9QYWNrYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3NDQ2M2QuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9QYWNrYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5QYWNrYWdlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogVU1MIDIuMCBtZXRhLWNsYXNzIFBhY2thZ2UuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFBhY2thZ2UoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUGFja2FnZSBleHRlbmRzIE5hbWVzcGFjZSwgUGFja2FnZWFibGVFbGVtZW50IHsKLX0gLy8gUGFja2FnZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9QYWNrYWdlYWJsZUVsZW1lbnQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvUGFja2FnZWFibGVFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjOTQ3ZTUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9QYWNrYWdlYWJsZUVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWE7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlBhY2thZ2VhYmxlIEVsZW1lbnQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBVTUwgMi4wIG1ldGEtY2xhc3MgUGFja2FnYWJsZSBFbGVtZW50LgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRQYWNrYWdlYWJsZUVsZW1lbnQoKQotICogQG1vZGVsIGFic3RyYWN0PSJ0cnVlIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFBhY2thZ2VhYmxlRWxlbWVudCBleHRlbmRzIE5hbWVkRWxlbWVudCB7Ci19IC8vIFBhY2thZ2VhYmxlRWxlbWVudApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9QaGFzZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9QaGFzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YjQxMDNiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvUGhhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWE7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlBoYXNlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogUGhhc2UgaXMgYSBzcGVjaWFsIEFjdGl2aXR5LCB3aGljaCBwcmVzY3JpYmVzIHByZS1kZWZpbmVkIHZhbHVlcyBmb3IgaXRzIGluc3RhbmNlcyBmb3IgdGhlIGF0dHJpYnV0ZXMgcHJlZml4ICgnUGhhc2UnKSBhbmQgaXNSZXBlYXRhYmxlICgnRmFsc2UnKS4gIEl0IGhhcyBiZWVuIGluY2x1ZGVkIGludG8gdGhlIG1ldGEtbW9kZWwgZm9yIGNvbnZlbmllbmNlIGFuZCB0byBwcm92aWRlIGEgc3BlY2lhbCBzdGVyZW90eXBlLCBiZWNhdXNlIGl0IHJlcHJlc2VudHMgYSB2ZXJ5IGNvbW1vbmx5IHVzZWQgQWN0aXZpdHkgdHlwZS4KLSAqIFBoYXNlIHJlcHJlc2VudCBhIHNpZ25pZmljYW50IHBlcmlvZCBpbiBhIHByb2plY3QsIGVuZGluZyB3aXRoIG1ham9yIG1hbmFnZW1lbnQgY2hlY2twb2ludCwgbWlsZXN0b25lIG9yIHNldCBvZiBEZWxpdmVyYWJsZXMuICBJdCBpcyBpbmNsdWRlZCBpbiB0aGUgbW9kZWwgYXMgYSBwcmVkZWZpbmVkIHNwZWNpYWwgQWN0aXZpdHksIGJlY2F1c2Ugb2YgaXRzIHNpZ25pZmljYW5jZSBpbiBkZWZpbmluZyBicmVha2Rvd25zLgotICogCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFBoYXNlKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFBoYXNlIGV4dGVuZHMgQWN0aXZpdHkgewotfSAvLyBQaGFzZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9QbGFubmluZ0RhdGEuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvUGxhbm5pbmdEYXRhLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2Yjk3NjUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9QbGFubmluZ0RhdGEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi1pbXBvcnQgamF2YS51dGlsLkRhdGU7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlBsYW5uaW5nIERhdGE8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBQbGFubmluZyBEYXRhIGlzIGEgTWV0aG9kIEVsZW1lbnQgdGhhdCBhZGRzIHBsYW5uaW5nIGRhdGEgdG8gQnJlYWtkb3duIEVsZW1lbnRzIHdoZW4gaXQgaXMgdXNlZCBmb3IgYSBQcm9jZXNzIFBsYW5uaW5nIFRlbXBsYXRlLiAgRm9yIERlbGl2ZXJ5IFByb2Nlc3NlcyBhbmQgQ2FwYWJpbGl0eSBQYXR0ZXJucyB0aGlzIGNsYXNzIGNhbiBlaXRoZXIgbm90IGJlIGluc3RhbnRpYXRlZCBvciBwb3B1bGF0ZWQgd2l0aCBkZWZhdWx0IGRhdGEuCi0gKiBQbGFubmluZyBEYXRhIGZhY3RvcnMgb3V0IHNwZWNpZmljIG9wdGlvbmFsIGRhdGEgbmVlZGVkIGZvciByZXByZXNlbnRpbmcgcGxhbm5pbmcgdGVtcGxhdGVzLiAgVGhpcyBhc3NvY2lhdGlvbiBhbGxvd3MgdG8gYWNjZXNzIHBsYW5uaW5nIGRhdGEgaWYgaXQgaXMgc3RvcmVkIGZvciB0aGUgQnJlYWtkb3duIEVsZW1lbnQuCi0gKiAoTk9URSwgVEhFIEFUVFJJQlVURVMgRk9SIFRISVMgQ0xBU1MgQVJFIE5PVCBDT01QTEVURSwgWUVUKQotICogCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5QbGFubmluZ0RhdGEjZ2V0U3RhcnREYXRlIDxlbT5TdGFydCBEYXRlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlBsYW5uaW5nRGF0YSNnZXRGaW5pc2hEYXRlIDxlbT5GaW5pc2ggRGF0ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5QbGFubmluZ0RhdGEjZ2V0UmFuayA8ZW0+UmFuazwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFBsYW5uaW5nRGF0YSgpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBQbGFubmluZ0RhdGEgZXh0ZW5kcyBQcm9jZXNzRWxlbWVudCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U3RhcnQgRGF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGRlZmF1bHQgc3RhcnQgZGF0ZSBmb3IgYSBwbGFuZWQgVGFzay4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U3RhcnQgRGF0ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0U3RhcnREYXRlKERhdGUpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0UGxhbm5pbmdEYXRhX1N0YXJ0RGF0ZSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLkRhdGUiIHJlcXVpcmVkPSJ0cnVlIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRGF0ZSBnZXRTdGFydERhdGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUGxhbm5pbmdEYXRhI2dldFN0YXJ0RGF0ZSA8ZW0+U3RhcnQgRGF0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U3RhcnQgRGF0ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0U3RhcnREYXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRTdGFydERhdGUoRGF0ZSB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5GaW5pc2ggRGF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGRlZmF1bHQgZmluaXNoIGRhdGUgZm9yIGEgcGxhbmVkIFRhc2suCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkZpbmlzaCBEYXRlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRGaW5pc2hEYXRlKERhdGUpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0UGxhbm5pbmdEYXRhX0ZpbmlzaERhdGUoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5EYXRlIiByZXF1aXJlZD0idHJ1ZSIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCURhdGUgZ2V0RmluaXNoRGF0ZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5QbGFubmluZ0RhdGEjZ2V0RmluaXNoRGF0ZSA8ZW0+RmluaXNoIERhdGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkZpbmlzaCBEYXRlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRGaW5pc2hEYXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRGaW5pc2hEYXRlKERhdGUgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmFuazwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGRlZmF1bHQgcmFuayBmb3IgYSBwbGFuZWQgVGFzay4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmFuazwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UmFuayhpbnQpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0UGxhbm5pbmdEYXRhX1JhbmsoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5JbnRlZ2VyIiByZXF1aXJlZD0idHJ1ZSIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBnZXRSYW5rKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlBsYW5uaW5nRGF0YSNnZXRSYW5rIDxlbT5SYW5rPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5SYW5rPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRSYW5rKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRSYW5rKGludCB2YWx1ZSk7Ci0KLX0gLy8gUGxhbm5pbmdEYXRhCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1BvaW50LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1BvaW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5MGRhZTguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9Qb2ludC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUuSU1vZGVsT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Qb2ludDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlBvaW50I2dldFggPGVtPlg8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUG9pbnQjZ2V0WSA8ZW0+WTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFBvaW50KCkKLSAqIEBtb2RlbAotICogQGV4dGVuZHMgSU1vZGVsT2JqZWN0Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUG9pbnQgZXh0ZW5kcyBJTW9kZWxPYmplY3QgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlg8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlg8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+WDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0WChEb3VibGUpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0UG9pbnRfWCgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLkRvdWJsZSIgcmVxdWlyZWQ9InRydWUiIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlEb3VibGUgZ2V0WCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qb2ludCNnZXRYIDxlbT5YPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5YPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRYKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRYKERvdWJsZSB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5ZPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5ZPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlk8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFkoRG91YmxlKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFBvaW50X1koKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5Eb3VibGUiIHJlcXVpcmVkPSJ0cnVlIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRG91YmxlIGdldFkoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUG9pbnQjZ2V0WSA8ZW0+WTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+WTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0WSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0WShEb3VibGUgdmFsdWUpOwotCi19IC8vIFBvaW50CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1BvbHlsaW5lLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1BvbHlsaW5lLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxNTU2Y2QuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9Qb2x5bGluZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Qb2x5bGluZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlBvbHlsaW5lI2dldENsb3NlZCA8ZW0+Q2xvc2VkPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlBvbHlsaW5lI2dldFdheXBvaW50cyA8ZW0+V2F5cG9pbnRzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0UG9seWxpbmUoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUG9seWxpbmUgZXh0ZW5kcyBHcmFwaGljUHJpbWl0aXZlIHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5DbG9zZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4idHJ1ZSI8L2NvZGU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q2xvc2VkPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNsb3NlZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0Q2xvc2VkKEJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0UG9seWxpbmVfQ2xvc2VkKCkKLQkgKiBAbW9kZWwgZGVmYXVsdD0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuQm9vbGVhbiIgcmVxdWlyZWQ9InRydWUiIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCb29sZWFuIGdldENsb3NlZCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qb2x5bGluZSNnZXRDbG9zZWQgPGVtPkNsb3NlZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q2xvc2VkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRDbG9zZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldENsb3NlZChCb29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPldheXBvaW50czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUG9pbnR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+V2F5cG9pbnRzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+V2F5cG9pbnRzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFBvbHlsaW5lX1dheXBvaW50cygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0idHJ1ZSIgbG93ZXI9IjIiIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0PFBvaW50PiBnZXRXYXlwb2ludHMoKTsKLQotfSAvLyBQb2x5bGluZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9QcmFjdGljZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9QcmFjdGljZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0M2ExNzJkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvUHJhY3RpY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UHJhY3RpY2U8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIFByYWN0aWNlIHJlcHJlc2VudHMgYSBwcm92ZW4gd2F5IG9yIHN0cmF0ZWd5IG9mIGRvaW5nIHdvcmsgdG8gYWNoaWV2ZSBhIGdvYWwgdGhhdCBoYXMgYSBwb3NpdGl2ZSBpbXBhY3Qgb24gd29yayBwcm9kdWN0IG9yIHByb2Nlc3MgcXVhbGl0eS4gIFByYWN0aWNlcyBhcmUgZGVmaW5lZCBvcnRob2dvbmFsIHRvIG1ldGhvZHMgYW5kIHByb2Nlc3Nlcy4gIFRoZXkgY291bGQgc3VtbWFyaXplIGFzcGVjdHMgdGhhdCBpbXBhY3QgbWFueSBkaWZmZXJlbnQgcGFydHMgb2YgYSBtZXRob2Qgb3Igc3BlY2lmaWMgcHJvY2Vzc2VzLiAgRXhhbXBsZXMgZm9yIHByYWN0aWNlcyB3b3VsZCBiZSAiTWFuYWdlIFJpc2tzIiwgIkNvbnRpbnVvdXNseSB2ZXJpZnkgcXVhbGl0eSIsICJBcmNoaXRlY3R1cmUtY2VudHJpYyBhbmQgY29tcG9uZW50LWJhc2VkIGRldmVsb3BtZW50IiwgZXRjLgotICogCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5QcmFjdGljZSNnZXRTdWJQcmFjdGljZXMgPGVtPlN1YiBQcmFjdGljZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJhY3RpY2UjZ2V0Q29udGVudFJlZmVyZW5jZXMgPGVtPkNvbnRlbnQgUmVmZXJlbmNlczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5QcmFjdGljZSNnZXRBY3Rpdml0eVJlZmVyZW5jZXMgPGVtPkFjdGl2aXR5IFJlZmVyZW5jZXM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRQcmFjdGljZSgpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBQcmFjdGljZSBleHRlbmRzIEd1aWRhbmNlIHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TdWIgUHJhY3RpY2VzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5QcmFjdGljZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5TdWIgUHJhY3RpY2VzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U3ViIFByYWN0aWNlczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRQcmFjdGljZV9TdWJQcmFjdGljZXMoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9InRydWUiIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0PFByYWN0aWNlPiBnZXRTdWJQcmFjdGljZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNvbnRlbnQgUmVmZXJlbmNlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudEVsZW1lbnR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q29udGVudCBSZWZlcmVuY2VzPC9lbT4nIHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q29udGVudCBSZWZlcmVuY2VzPC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFByYWN0aWNlX0NvbnRlbnRSZWZlcmVuY2VzKCkKLQkgKiBAbW9kZWwgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3Q8Q29udGVudEVsZW1lbnQ+IGdldENvbnRlbnRSZWZlcmVuY2VzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BY3Rpdml0eSBSZWZlcmVuY2VzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5BY3Rpdml0eSBSZWZlcmVuY2VzPC9lbT4nIHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QWN0aXZpdHkgUmVmZXJlbmNlczwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRQcmFjdGljZV9BY3Rpdml0eVJlZmVyZW5jZXMoKQotCSAqIEBtb2RlbCBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdDxBY3Rpdml0eT4gZ2V0QWN0aXZpdHlSZWZlcmVuY2VzKCk7Ci0KLX0gLy8gUHJhY3RpY2UKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvUHJhY3RpY2VEZXNjcmlwdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9QcmFjdGljZURlc2NyaXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1YmU2ZDIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9QcmFjdGljZURlc2NyaXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UHJhY3RpY2UgRGVzY3JpcHRpb248L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5QcmFjdGljZURlc2NyaXB0aW9uI2dldEFkZGl0aW9uYWxJbmZvIDxlbT5BZGRpdGlvbmFsIEluZm88L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJhY3RpY2VEZXNjcmlwdGlvbiNnZXRQcm9ibGVtIDxlbT5Qcm9ibGVtPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlByYWN0aWNlRGVzY3JpcHRpb24jZ2V0QmFja2dyb3VuZCA8ZW0+QmFja2dyb3VuZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5QcmFjdGljZURlc2NyaXB0aW9uI2dldEdvYWxzIDxlbT5Hb2FsczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5QcmFjdGljZURlc2NyaXB0aW9uI2dldEFwcGxpY2F0aW9uIDxlbT5BcHBsaWNhdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5QcmFjdGljZURlc2NyaXB0aW9uI2dldExldmVsc09mQWRvcHRpb24gPGVtPkxldmVscyBPZiBBZG9wdGlvbjwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFByYWN0aWNlRGVzY3JpcHRpb24oKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUHJhY3RpY2VEZXNjcmlwdGlvbiBleHRlbmRzIENvbnRlbnREZXNjcmlwdGlvbiB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QWRkaXRpb25hbCBJbmZvPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+IiI8L2NvZGU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogQW55IGFkZGl0aW9uYWwgSW5mb3JtYXRpb24gbm90IGNvdmVyZWQgYnkgdGhlIG90aGVyIGF0dHJpYnV0ZXMuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkFkZGl0aW9uYWwgSW5mbzwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0QWRkaXRpb25hbEluZm8oU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFByYWN0aWNlRGVzY3JpcHRpb25fQWRkaXRpb25hbEluZm8oKQotCSAqIEBtb2RlbCBkZWZhdWx0PSIiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLlN0cmluZyIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRBZGRpdGlvbmFsSW5mbygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5QcmFjdGljZURlc2NyaXB0aW9uI2dldEFkZGl0aW9uYWxJbmZvIDxlbT5BZGRpdGlvbmFsIEluZm88L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkFkZGl0aW9uYWwgSW5mbzwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0QWRkaXRpb25hbEluZm8oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEFkZGl0aW9uYWxJbmZvKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Qcm9ibGVtPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+IiI8L2NvZGU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogQSBkZXNjcmlwdGlvbiBvZiB0aGUgcHJvYmxlbSB0aGUgUHJhY3RpY2UgYWRkcmVzc2VzLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Qcm9ibGVtPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRQcm9ibGVtKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRQcmFjdGljZURlc2NyaXB0aW9uX1Byb2JsZW0oKQotCSAqIEBtb2RlbCBkZWZhdWx0PSIiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLlN0cmluZyIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRQcm9ibGVtKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlByYWN0aWNlRGVzY3JpcHRpb24jZ2V0UHJvYmxlbSA8ZW0+UHJvYmxlbTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UHJvYmxlbTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UHJvYmxlbSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UHJvYmxlbShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QmFja2dyb3VuZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiIiPC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIEVsYWJvcmF0aW9uIG9uIHRoZSBiYWNrZ3JvdW5kIGFuZCB0aGUgY29udGV4dCBpbiB3aGljaCB0aGUgcHJvYmxlbSBvY2N1cnMgYW5kIHdoZXJlIHRoZSBzb2x1dGlvbiBkZXNjcmliZWQgYnkgdGhpcyBQcmFjdGljZSB3aWxsIGZpdCBpbi4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QmFja2dyb3VuZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0QmFja2dyb3VuZChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0UHJhY3RpY2VEZXNjcmlwdGlvbl9CYWNrZ3JvdW5kKCkKLQkgKiBAbW9kZWwgZGVmYXVsdD0iIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5TdHJpbmciIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0QmFja2dyb3VuZCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5QcmFjdGljZURlc2NyaXB0aW9uI2dldEJhY2tncm91bmQgPGVtPkJhY2tncm91bmQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkJhY2tncm91bmQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEJhY2tncm91bmQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEJhY2tncm91bmQoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkdvYWxzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+IiI8L2NvZGU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogQSBzdW1tYXJ5IG9mIHRoZSBvdmVyYWxsIGdvYWxzIHRvIGJlIGFkZHJlc3NlZCBieSB0aGUgUHJhY3RpY2UuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkdvYWxzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRHb2FscyhTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0UHJhY3RpY2VEZXNjcmlwdGlvbl9Hb2FscygpCi0JICogQG1vZGVsIGRlZmF1bHQ9IiIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuU3RyaW5nIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldEdvYWxzKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlByYWN0aWNlRGVzY3JpcHRpb24jZ2V0R29hbHMgPGVtPkdvYWxzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Hb2FsczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0R29hbHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEdvYWxzKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BcHBsaWNhdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiIiPC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIERlc2NyaWJlcyBob3cgdGhlIFByYWN0aWNlIGlzIGJlaW5nIGFwcGxpZWQgb3IgaW50cm9kdWNlZCBpbnRvIHRoZSBjb250ZXh0IGRlc2NyaWJlZCBpbiBiYWNrZ3JvdW5kLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BcHBsaWNhdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0QXBwbGljYXRpb24oU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFByYWN0aWNlRGVzY3JpcHRpb25fQXBwbGljYXRpb24oKQotCSAqIEBtb2RlbCBkZWZhdWx0PSIiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLlN0cmluZyIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRBcHBsaWNhdGlvbigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5QcmFjdGljZURlc2NyaXB0aW9uI2dldEFwcGxpY2F0aW9uIDxlbT5BcHBsaWNhdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QXBwbGljYXRpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEFwcGxpY2F0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRBcHBsaWNhdGlvbihTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TGV2ZWxzIE9mIEFkb3B0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+IiI8L2NvZGU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogT3V0bGluZXMgdGhlIGRpZmZlcmVudCBmb3JtcyBvciB2YXJpYW50cyBpbiB3aGljaCB0aGUgcHJhY3RpY2UgY291bGQgYmUgcmVhbGl6ZWQuIChlLmcuIGZ1bGwgYWRvcHRpb24gdmVydXMgYSBwYXJ0aWFsIGFkb3B0aW9uIG9mIHRoZSBQcmFjdGljZSkKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TGV2ZWxzIE9mIEFkb3B0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRMZXZlbHNPZkFkb3B0aW9uKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRQcmFjdGljZURlc2NyaXB0aW9uX0xldmVsc09mQWRvcHRpb24oKQotCSAqIEBtb2RlbCBkZWZhdWx0PSIiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLlN0cmluZyIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRMZXZlbHNPZkFkb3B0aW9uKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlByYWN0aWNlRGVzY3JpcHRpb24jZ2V0TGV2ZWxzT2ZBZG9wdGlvbiA8ZW0+TGV2ZWxzIE9mIEFkb3B0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5MZXZlbHMgT2YgQWRvcHRpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldExldmVsc09mQWRvcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldExldmVsc09mQWRvcHRpb24oU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBQcmFjdGljZURlc2NyaXB0aW9uCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1Byb2Nlc3MuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvUHJvY2Vzcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyODFmODdjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvUHJvY2Vzcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UHJvY2VzczwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEEgUHJvY2VzcyBpcyBhIHNwZWNpYWwgQWN0aXZpdHkgdGhhdCBkZXNjcmliZXMgYSBzdHJ1Y3R1cmUgZm9yIHBhcnRpY3VsYXIgdHlwZXMgb2YgZGV2ZWxvcG1lbnQgcHJvamVjdHMuICBUbyBwZXJmb3JtIHN1Y2ggYSBkZXZlbG9wbWVudCBwcm9qZWN0IGEgUHJvY2Vzc2VzIHdvdWxkIGJlICdpbnN0YW50aWF0ZWQnIGFuZCBhZGFwdGVkIGZvciB0aGUgc3BlY2lmaWMgc2l0dWF0aW9uLiAgUHJvY2VzcyBpcyBhbiBhYnN0cmFjdCBjbGFzcyBhbmQgdGhpcyBtZXRhLW1vZGVsIGRlZmluZXMgZGlmZmVyZW50IHNwZWNpYWwgdHlwZXMgb2YgUHJvY2Vzc2VzIGZvciBkaWZmZXJlbnQgcHJvY2VzcyBtYW5hZ2VtZW50IGFwcGxpY2F0aW9ucyBhbmQgZGlmZmVyZW50IHNpdHVhdGlvbnMgb2YgcHJvY2VzcyByZXVzZS4gIEV2ZXJ5IFByb2Nlc3MgY29tcHJpc2VzIG9mIGFuZCBpcyB0aGUgdG9wLWxldmVsIGVsZW1lbnQgb2YgYW4gbi1sZXZlbCBicmVha2Rvd24gc3RydWN0dXJlIHVzaW5nIHRoZSBOZXN0aW5nIGFzc29jaWF0aW9uIGRlZmluZWQgb24gQWN0aXZpdHkuCi0gKiBDb3JlIE1ldGhvZCBDb250ZW50IHByb3ZpZGVzIHN0ZXAtYnktc3RlcCBleHBsYW5hdGlvbnMsIGRlc2NyaWJpbmcgaG93IHZlcnkgc3BlY2lmaWMgZGV2ZWxvcG1lbnQgZ29hbHMgYXJlIGFjaGlldmVkIGluZGVwZW5kZW50IG9mIHRoZSBwbGFjZW1lbnQgb2YgdGhlc2Ugc3RlcHMgd2l0aGluIGEgZGV2ZWxvcG1lbnQgbGlmZWN5Y2xlLiAgUHJvY2Vzc2VzIHRha2UgdGhlc2UgbWV0aG9kIGVsZW1lbnRzIGFuZCByZWxhdGUgdGhlbSBpbnRvIHNlbWktb3JkZXJlZCBzZXF1ZW5jZXMgdGhhdCBhcmUgY3VzdG9taXplZCB0byBzcGVjaWZpYyB0eXBlcyBvZiBwcm9qZWN0cy4gIFRodXMsIGEgcHJvY2VzcyBpcyBhIHNldCBvZiBwYXJ0aWFsbHkgb3JkZXJlZCB3b3JrIGRlc2NyaXB0aW9ucyBpbnRlbmRlZCB0byByZWFjaCBhIGhpZ2hlciBkZXZlbG9wbWVudCBnb2FsLCBzdWNoIGFzIHRoZSByZWxlYXNlIG9mIGEgc3BlY2lmaWMgc29mdHdhcmUgc3lzdGVtLiAgQSBwcm9jZXNzIGFuZCB0aGUgcHJvY2VzcyBtZXRhLW1vZGVsIHN0cnVjdHVyZSBkZWZpbmVkIGluIHRoaXMgc3BlY2lmaWNhdGlvbiBmb2N1c2VzIG9uIHRoZSBsaWZlY3ljbGUgYW5kIHRoZSBzZXF1ZW5jaW5nIG9mIHdvcmsgaW4gYnJlYWtkb3duIHN0cnVjdHVyZXMuICBUbyBhY2hpZXZlIHRoaXMgaXQgdXNlcyB0aGUgRGVzY3JpcHRvciBjb25jZXB0IHJlZmVyZW5jaW5nIG1ldGhvZCBjb250ZW50IGFuZCBhbGxvd2luZyBkZWZpbmluZyB0aW1lLXNwZWNpZmljIGN1c3RvbWl6YXRpb25zIG9mIHRoZSByZWZlcmVuY2VkIGNvbnRlbnQgKGUuZy4gZGVmaW5pbmcgYSBmb2N1cyBvbiBkaWZmZXJlbnQgc3RlcHMgb2YgdGhlIHNhbWUgVGFzayBhbmQgcHJvdmlkaW5nIGlucHV0IFdvcmsgUHJvZHVjdHMgaW4gZGlmZmVyZW50IHN0YXRlcyB3aXRoaW4gdGhlIGRpZmZlcmVudCBQaGFzZXMgb2YgYSBwcm9jZXNzIGxpZmVjeWNsZSBpbiB3aGljaCB0aGUgc2FtZSBUYXNrIGlzIHBlcmZvcm1lZCkuCi0gKiAKLSAqIFByb2Nlc3MgaW4gdGhlIHBhY2thZ2UgTGlicmFyeSBDb25maWd1cmF0aW9uIGV4dGVuZHMgdGhlIGNsYXNzIFByb2Nlc3Mgd2l0aCBhc3NvY2lhdGlvbiByZWxhdGluZyBhIFByb2Nlc3MgdG8gb25lIGRlZmF1bHQgYW5kIG1hbnkgb3B0aW9uYWwgdmFsaWQgQ29uZmlndXJhdGlvbnMuCi0gKiBUaGVzZSBjb25maWd1cmF0aW9ucyBkZXNjcmliZSB2YWxpZCBjb250ZXh0cyBmb3IgdGhlIFByb2Nlc3Mgd2l0aGluIGEgTWV0aG9kIExpYnJhcnkgaW5kaWNhdGluZyB1bmRlciB3aGljaCBDb25maWd1cmF0aW9ucyBhIFByb2Nlc3MgaXMgd2VsbCBkZWZpbmVkLgotICogCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzI2dldEluY2x1ZGVzUGF0dGVybnMgPGVtPkluY2x1ZGVzIFBhdHRlcm5zPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3MjZ2V0RGVmYXVsdENvbnRleHQgPGVtPkRlZmF1bHQgQ29udGV4dDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzI2dldFZhbGlkQ29udGV4dCA8ZW0+VmFsaWQgQ29udGV4dDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFByb2Nlc3MoKQotICogQG1vZGVsIGFic3RyYWN0PSJ0cnVlIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFByb2Nlc3MgZXh0ZW5kcyBBY3Rpdml0eSB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SW5jbHVkZXMgUGF0dGVybnM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkNhcGFiaWxpdHlQYXR0ZXJufS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkluY2x1ZGVzIFBhdHRlcm5zPC9lbT4nIHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SW5jbHVkZXMgUGF0dGVybnM8L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0UHJvY2Vzc19JbmNsdWRlc1BhdHRlcm5zKCkKLQkgKiBAbW9kZWwgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3Q8Q2FwYWJpbGl0eVBhdHRlcm4+IGdldEluY2x1ZGVzUGF0dGVybnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRlZmF1bHQgQ29udGV4dDwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RGVmYXVsdCBDb250ZXh0PC9lbT4nIHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRlZmF1bHQgQ29udGV4dDwvZW0+JyByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0RGVmYXVsdENvbnRleHQoTWV0aG9kQ29uZmlndXJhdGlvbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRQcm9jZXNzX0RlZmF1bHRDb250ZXh0KCkKLQkgKiBAbW9kZWwgcmVxdWlyZWQ9InRydWUiIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlNZXRob2RDb25maWd1cmF0aW9uIGdldERlZmF1bHRDb250ZXh0KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3MjZ2V0RGVmYXVsdENvbnRleHQgPGVtPkRlZmF1bHQgQ29udGV4dDwvZW0+fScgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RGVmYXVsdCBDb250ZXh0PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXREZWZhdWx0Q29udGV4dCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RGVmYXVsdENvbnRleHQoTWV0aG9kQ29uZmlndXJhdGlvbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5WYWxpZCBDb250ZXh0PC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9ufS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlZhbGlkIENvbnRleHQ8L2VtPicgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5WYWxpZCBDb250ZXh0PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFByb2Nlc3NfVmFsaWRDb250ZXh0KCkKLQkgKiBAbW9kZWwgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3Q8TWV0aG9kQ29uZmlndXJhdGlvbj4gZ2V0VmFsaWRDb250ZXh0KCk7Ci0KLX0gLy8gUHJvY2VzcwpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9Qcm9jZXNzQ29tcG9uZW50LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1Byb2Nlc3NDb21wb25lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWJlM2VlMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1Byb2Nlc3NDb21wb25lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UHJvY2VzcyBDb21wb25lbnQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIFByb2Nlc3MgQ29tcG9uZW50IGlzIGEgc3BlY2lhbCBQcm9jZXNzIFBhY2thZ2UgdGhhdCBhcHBsaWVzIHRoZSBwcmluY2lwbGVzIG9mIGVuY2Fwc3VsYXRpb24uICBBIFByb2Nlc3MgQ29tcG9uZW50IHJlYWxpemVzIG9uZSBvciBtb3JlIEludGVyZmFjZXMgd2hpY2ggc3BlY2lmeSBpbnB1dHMgYW5kIG91dHB1dHMgb2YgdGhlIGNvbXBvbmVudC4gVGhlcmUgbWlnaHQgYmUgbWFueSBjb21wb25lbnRzIHJlYWxpemluZyB0aGUgc2FtZSBpbnRlcmZhY2VzLCBidXQgdXNpbmcgZGlmZmVyZW50IHRlY2huaXF1ZXMgdG8gYWNoaWV2ZSBzaW1pbGFyIG91dHB1dHMgZm9yIHNpbWlsYXIgaW5wdXRzLiAgV2hlcmVhcyB0aGUgQ29tcG9uZW50IEludGVyZmFjZXMgcmVwcmVzZW50IGNvbXBvbmVudCBzcGVjaWZpY2F0aW9ucyAoYmxhY2sgYm94IGRlc2NyaXB0aW9ucyBvZiB0aGUgY29tcG9uZW50KSwgZ29vZCBjYW5kaWRhdGVzIGZvciBjb21wb25lbnQgcmVhbGl6YXRpb25zIGNhbiBiZSBmb3VuZCBpbiBDYXBhYmlsaXR5IFBhdHRlcm5zICh3aGl0ZSBib3ggZGVzY3JpcHRpb25zIGZvciB0aGUgY29tcG9uZW50KS4KLSAqIFVNQSBzdXBwb3J0cyByZXBsYWNlYWJsZSBhbmQgcmV1c2FibGUgUHJvY2VzcyBDb21wb25lbnRzIHJlYWxpemluZyB0aGUgcHJpbmNpcGxlcyBvZiBlbmNhcHN1bGF0aW9uLiBDZXJ0YWluIHNpdHVhdGlvbnMgaW4gYSBzb2Z0d2FyZSBkZXZlbG9wbWVudCBwcm9qZWN0IG1pZ2h0IHJlcXVpcmUgdGhhdCBjb25jcmV0ZSByZWFsaXphdGlvbnMgb2YgcGFydHMgb2YgdGhlIHByb2Nlc3MgcmVtYWluIHVuZGVjaWRlZCBvciB3aWxsIGJlIGRlY2lkZWQgYnkgdGhlIGV4ZWN1dGluZyB0ZWFtIGl0c2VsZiAoZS5nLiBpbiBvdXRzb3VyY2luZyBzaXR1YXRpb25zKS4gIFVNQSBwcm92aWRlcyBhIHVuaXF1ZSBjb21wb25lbnQgY29uY2VwdCBkZWZpbmluZyBpbnRlcmZhY2VzIGZvciB3b3JrIHByb2R1Y3QgaW5wdXQgYW5kIG91dHB1dCwgYWxsb3dpbmcgdHJlYXRpbmcgdGhlIGFjdHVhbCBkZWZpbml0aW9uIG9mIHRoZSB3b3JrIHRoYXQgcHJvZHVjZXMgdGhlIG91dHB1dHMgYXMgYSAiYmxhY2sgYm94Ii4gIEF0IGFueSBwb2ludCBkdXJpbmcgYSBwcm9qZWN0IHRoZSBjb21wb25lbnQgInJlYWxpemF0aW9uIiBkZXRhaWxpbmcgdGhlIHdvcmsgY2FuIGJlIGFkZGVkIHRvIHRoZSBwcm9jZXNzLiAgVGhlIGNvbXBvbmVudCBhcHByb2FjaCBhbHNvIGFsbG93cyB0aGF0IGRpZmZlcmVudCBzdHlsZXMgb3IgdGVjaG5pcXVlcyBvZiBkb2luZyB3b3JrIGNhbiBiZSByZXBsYWNlZCB3aXRoIG9uZSBhbm90aGVyLiAgRm9yIGV4YW1wbGUsIGEgc29mdHdhcmUgY29kZSBvdXRwdXQgb2YgYSBjb21wb25lbnQgY291bGQgYmUgcHJvZHVjZWQgd2l0aCBhIG1vZGVsLWRyaXZlbiBkZXZlbG9wbWVudCBvciBhIGNvZGUtY2VudHJpYyB0ZWNobmlxdWUuICBUaGUgY29tcG9uZW50IGNvbmNlcHQgZW5jYXBzdWxhdGVzIHRoZSBhY3R1YWwgd29yayBhbmQgbGV0cyB0aGUgZGV2ZWxvcG1lbnQgdGVhbSBjaG9vc2UgdGhlIGFwcHJvcHJpYXRlIHRlY2huaXF1ZSBhbmQgZmlsbCB0aGUgY29tcG9uZW50J3MgcmVhbGl6YXRpb24gd2l0aCB0aGVpciBjaG9pY2Ugb2YgQWN0aXZpdGllcyB0aGF0IHByb2R1Y2UgdGhlIHJlcXVpcmVkIG91dHB1dHMuCi0gKiAKLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnQjZ2V0SW50ZXJmYWNlcyA8ZW0+SW50ZXJmYWNlczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50I2dldFByb2Nlc3MgPGVtPlByb2Nlc3M8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRQcm9jZXNzQ29tcG9uZW50KCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFByb2Nlc3NDb21wb25lbnQgZXh0ZW5kcyBQcm9jZXNzUGFja2FnZSwgTWV0aG9kVW5pdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SW50ZXJmYWNlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5JbnRlcmZhY2VzPC9lbT4nIHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SW50ZXJmYWNlczwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRQcm9jZXNzQ29tcG9uZW50X0ludGVyZmFjZXMoKQotCSAqIEBtb2RlbCByZXF1aXJlZD0idHJ1ZSIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3Q8UHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZT4gZ2V0SW50ZXJmYWNlcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UHJvY2VzczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UHJvY2VzczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Qcm9jZXNzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRQcm9jZXNzKG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzcykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRQcm9jZXNzQ29tcG9uZW50X1Byb2Nlc3MoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9InRydWUiIHJlcXVpcmVkPSJ0cnVlIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzIGdldFByb2Nlc3MoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudCNnZXRQcm9jZXNzIDxlbT5Qcm9jZXNzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Qcm9jZXNzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRQcm9jZXNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRQcm9jZXNzKG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzcyB2YWx1ZSk7Ci0KLX0gLy8gUHJvY2Vzc0NvbXBvbmVudApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9Qcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9Qcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YTlmZTQ1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvUHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWE7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlByb2Nlc3MgQ29tcG9uZW50IERlc2NyaXB0b3I8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIFByb2Nlc3MgQ29tcG9uZW50IERlc2NyaXB0b3IgcmVwcmVzZW50cyBhIFByb2Nlc3MgQ29tcG9uZW50IGFwcGxpY2F0aW9uIGluIGEgUHJvY2VzcywgaS5lLiB0aGUgYnJlYWtkb3duIHN0cnVjdHVyZSBkZWZpbmluZyB0aGUgUHJvY2Vzcy4gIFRoZSBQcm9jZXNzIENvbXBvbmVudCBEZXNjcmlwdG9yIGlzIHVzZWQgdG8gZW5jYXBzdWxhdGUgdGhlIGRldGFpbHMgb2YgdGhlIGNvbXBvbmVudCBpbiBhIGJyZWFrZG93biBzdHJ1Y3R1cmUgYW5kIHRvIHByb3ZpZGUgaXRzIG93biBzZXQgb2YgcmVsYXRpb25zaGlwcyBzdWNoIGFzIGl0IG93biBwcmVkZWNlc3NvcnMgYW5kIHN1Y2Nlc3NvcnMuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvciNnZXRfcHJvY2Vzc0NvbXBvbmVudCA8ZW0+cHJvY2VzcyBDb21wb25lbnQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRQcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvcigpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBQcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvciBleHRlbmRzIERlc2NyaXB0b3IgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPnByb2Nlc3MgQ29tcG9uZW50PC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5wcm9jZXNzIENvbXBvbmVudDwvZW0+JyByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5wcm9jZXNzIENvbXBvbmVudDwvZW0+JyByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0X3Byb2Nlc3NDb21wb25lbnQoUHJvY2Vzc0NvbXBvbmVudCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRQcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvcl9fcHJvY2Vzc0NvbXBvbmVudCgpCi0JICogQG1vZGVsIHJlcXVpcmVkPSJ0cnVlIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUHJvY2Vzc0NvbXBvbmVudCBnZXRfcHJvY2Vzc0NvbXBvbmVudCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvciNnZXRfcHJvY2Vzc0NvbXBvbmVudCA8ZW0+cHJvY2VzcyBDb21wb25lbnQ8L2VtPn0nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPnByb2Nlc3MgQ29tcG9uZW50PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRfcHJvY2Vzc0NvbXBvbmVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0X3Byb2Nlc3NDb21wb25lbnQoUHJvY2Vzc0NvbXBvbmVudCB2YWx1ZSk7Ci0KLX0gLy8gUHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3IKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjNWRlY2UuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlByb2Nlc3MgQ29tcG9uZW50IEludGVyZmFjZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEEgUHJvY2VzcyBDb21wb25lbnQgSW50ZXJmYWNlIGNvbXByaXNlcyBvZiBhIGxpc3Qgb2YgaW50ZXJmYWNlIHNwZWNpZmljYXRpb25zIChzaW1pbGFyIHRvIG9wZXJhdGlvbiBkZWNsYXJhdGlvbnMpIHRoYXQgZXhwcmVzcyBpbnB1dHMgYW5kIG91dHB1dHMgZm9yIGEgcHJvY2VzcyBjb21wb25lbnQuICBUaGVzZSBpbnRlcmZhY2Ugc3BlY2lmaWNhdGlvbnMgYXJlIGV4cHJlc3NlZCB1c2luZyBUYXNrIERlc2NyaXB0b3JzIHdoaWNoIGFyZSBub3QgbGlua2VkIHRvIFRhc2tzIHRoYXQgYXJlIHJlbGF0ZWQgdG8gV29yayBQcm9kdWN0IERlc2NyaXB0b3JzIGFzIHdlbGwgYXMgb3B0aW9uYWwgYSBSb2xlIERlc2NyaXB0b3IuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlI2dldEludGVyZmFjZVNwZWNpZmljYXRpb25zIDxlbT5JbnRlcmZhY2UgU3BlY2lmaWNhdGlvbnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSNnZXRJbnRlcmZhY2VJTyA8ZW0+SW50ZXJmYWNlIElPPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0UHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSgpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlIGV4dGVuZHMgQnJlYWtkb3duRWxlbWVudCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SW50ZXJmYWNlIFNwZWNpZmljYXRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRvcn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5JbnRlcmZhY2UgU3BlY2lmaWNhdGlvbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JbnRlcmZhY2UgU3BlY2lmaWNhdGlvbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0UHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZV9JbnRlcmZhY2VTcGVjaWZpY2F0aW9ucygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0idHJ1ZSIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3Q8VGFza0Rlc2NyaXB0b3I+IGdldEludGVyZmFjZVNwZWNpZmljYXRpb25zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JbnRlcmZhY2UgSU88L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvcn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5JbnRlcmZhY2UgSU88L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JbnRlcmZhY2UgSU88L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0UHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZV9JbnRlcmZhY2VJTygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0idHJ1ZSIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3Q8V29ya1Byb2R1Y3REZXNjcmlwdG9yPiBnZXRJbnRlcmZhY2VJTygpOwotCi19IC8vIFByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvUHJvY2Vzc0Rlc2NyaXB0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1Byb2Nlc3NEZXNjcmlwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYTFhODk0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvUHJvY2Vzc0Rlc2NyaXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Qcm9jZXNzIERlc2NyaXB0aW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0Rlc2NyaXB0aW9uI2dldFNjb3BlIDxlbT5TY29wZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzRGVzY3JpcHRpb24jZ2V0VXNhZ2VOb3RlcyA8ZW0+VXNhZ2UgTm90ZXM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRQcm9jZXNzRGVzY3JpcHRpb24oKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUHJvY2Vzc0Rlc2NyaXB0aW9uIGV4dGVuZHMgQWN0aXZpdHlEZXNjcmlwdGlvbiB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U2NvcGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iIjwvY29kZT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBEZWZpbmVzIHRoZSBzY29wZSBvZiB0aGUgUHJvY2VzcywgaS5lLiB3aGljaCB0eXBlcyBvZiBwcm9qZWN0cyBkb2VzIGl0IGFkZHJlc3MgYW5kIHdoaWNoIG5vdC4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U2NvcGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFNjb3BlKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRQcm9jZXNzRGVzY3JpcHRpb25fU2NvcGUoKQotCSAqIEBtb2RlbCBkZWZhdWx0PSIiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLlN0cmluZyIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRTY29wZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzRGVzY3JpcHRpb24jZ2V0U2NvcGUgPGVtPlNjb3BlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TY29wZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0U2NvcGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFNjb3BlKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Vc2FnZSBOb3RlczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiIiPC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIEFueSBhZGRpdGlvbmFsIG5vdGVzIG9uIGhvdyB0byBhcHBseSBhbmQgaW5zdGFudGlhdGUgdGhpcyBwcm9jZXNzIGZvciBhIHByb2plY3QuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlVzYWdlIE5vdGVzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRVc2FnZU5vdGVzKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRQcm9jZXNzRGVzY3JpcHRpb25fVXNhZ2VOb3RlcygpCi0JICogQG1vZGVsIGRlZmF1bHQ9IiIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuU3RyaW5nIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFVzYWdlTm90ZXMoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0Rlc2NyaXB0aW9uI2dldFVzYWdlTm90ZXMgPGVtPlVzYWdlIE5vdGVzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Vc2FnZSBOb3RlczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0VXNhZ2VOb3RlcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VXNhZ2VOb3RlcyhTdHJpbmcgdmFsdWUpOwotCi19IC8vIFByb2Nlc3NEZXNjcmlwdGlvbgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9Qcm9jZXNzRWxlbWVudC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9Qcm9jZXNzRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNWViYjQ4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvUHJvY2Vzc0VsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWE7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlByb2Nlc3MgRWxlbWVudDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIFByb2Nlc3MgRWxlbWVudCBpcyBhIERlc2NyaWJhYmxlIEVsZW1lbnQgdGhhdCByZXByZXNlbnRzIGFuIGFic3RyYWN0IGdlbmVyYWxpemF0aW9uIGZvciBhbGwgZWxlbWVudHMgZGVmaW5lZCBpbiB0aGUgUHJvY2VzcyBwYWNrYWdlLgotICogUHJvY2VzcyBFbGVtZW50cyByZXByZXNlbnRzIFByb2Nlc3Mgc3BlY2lmaWMgZWxlbWVudHMgdGhhdCBhcmUgc3VwcG9zZWQgdG8gYmUgbWFuYWdlZCBpbiBQcm9jZXNzIFBhY2thZ2VzLiAgVGhlIHNlcGFyYXRpb24gb2YgUHJvY2VzcyBFbGVtZW50IGZyb20gQ29udGVudCBFbGVtZW50IGFsbG93cyB0byBjbGVhcmx5IGRpc3Rpbmd1aXNoIGJldHdlZW4gcHVyZSBtZXRob2QgY29udGVudCBmcm9tIGNvbnRlbnQgdGhhdCBpcyByZXByZXNlbnRlZCBpbiBwcm9jZXNzZXMuIAotICogCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFByb2Nlc3NFbGVtZW50KCkKLSAqIEBtb2RlbCBhYnN0cmFjdD0idHJ1ZSIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBQcm9jZXNzRWxlbWVudCBleHRlbmRzIERlc2NyaWJhYmxlRWxlbWVudCB7Ci19IC8vIFByb2Nlc3NFbGVtZW50CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1Byb2Nlc3NGYW1pbHkuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvUHJvY2Vzc0ZhbWlseS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNjhhMDYwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvUHJvY2Vzc0ZhbWlseS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Qcm9jZXNzIEZhbWlseTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEEgRGVsaXZlcnkgTW9kZWwgRmFtaWx5IGlzIGEgY29udmVuaWVudCBncm91cGluZyBvZiBEZWxpdmVyeSBQcm9jZXNzZXMgYW5kIENhcGFiaWxpdHkgUGF0dGVybnMgb2YgaW50ZXJlc3QgdG8gc29tZSBzcGVjaWZpYyB1c2VyIGNvbW11bml0eS4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NGYW1pbHkjZ2V0RGVsaXZlcnlQcm9jZXNzZXMgPGVtPkRlbGl2ZXJ5IFByb2Nlc3NlczwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFByb2Nlc3NGYW1pbHkoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUHJvY2Vzc0ZhbWlseSBleHRlbmRzIE1ldGhvZENvbmZpZ3VyYXRpb24gewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRlbGl2ZXJ5IFByb2Nlc3NlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcnlQcm9jZXNzfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkRlbGl2ZXJ5IFByb2Nlc3NlczwvZW0+JyByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRlbGl2ZXJ5IFByb2Nlc3NlczwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRQcm9jZXNzRmFtaWx5X0RlbGl2ZXJ5UHJvY2Vzc2VzKCkKLQkgKiBAbW9kZWwgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3Q8RGVsaXZlcnlQcm9jZXNzPiBnZXREZWxpdmVyeVByb2Nlc3NlcygpOwotCi19IC8vIFByb2Nlc3NGYW1pbHkKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvUHJvY2Vzc1BhY2thZ2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvUHJvY2Vzc1BhY2thZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzM3MzU3MS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1Byb2Nlc3NQYWNrYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlByb2Nlc3MgUGFja2FnZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIFByb2Nlc3MgUGFja2FnZSBpcyBhIHNwZWNpYWwgTWV0aG9kIFBhY2thZ2UgdGhhdCBjb250YWlucyBQcm9jZXNzIEVsZW1lbnRzLCBvbmx5LgotICogQSBrZXkgc2VwYXJhdGlvbiBvZiBjb25jZXJucyBpbiBVTUEgaXMgdGhlIGRpc3RpbmN0aW9uIGJldHdlZW4gTWV0aG9kIENvbnRlbnQgYW5kIFByb2Nlc3MuICBUaGlzIHNlcGFyYXRpb24gaXMgZW5mb3JjZWQgYnkgc3BlY2lhbCBwYWNrYWdlIHR5cGVzLCB3aGljaCBkbyBub3QgYWxsb3cgdGhlIG1peGluZyBvZiBtZXRob2QgY29udGVudCB3aXRoIHByb2Nlc3Nlcy4KLSAqIAotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc1BhY2thZ2UjZ2V0UHJvY2Vzc0VsZW1lbnRzIDxlbT5Qcm9jZXNzIEVsZW1lbnRzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NQYWNrYWdlI2dldERpYWdyYW1zIDxlbT5EaWFncmFtczwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFByb2Nlc3NQYWNrYWdlKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFByb2Nlc3NQYWNrYWdlIGV4dGVuZHMgTWV0aG9kUGFja2FnZSB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UHJvY2VzcyBFbGVtZW50czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0VsZW1lbnR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UHJvY2VzcyBFbGVtZW50czwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlByb2Nlc3MgRWxlbWVudHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0UHJvY2Vzc1BhY2thZ2VfUHJvY2Vzc0VsZW1lbnRzKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJ0cnVlIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdDxQcm9jZXNzRWxlbWVudD4gZ2V0UHJvY2Vzc0VsZW1lbnRzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EaWFncmFtczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5EaWFncmFtczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRpYWdyYW1zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFByb2Nlc3NQYWNrYWdlX0RpYWdyYW1zKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJ0cnVlIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdDxEaWFncmFtPiBnZXREaWFncmFtcygpOwotCi19IC8vIFByb2Nlc3NQYWNrYWdlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1Byb2Nlc3NQbGFubmluZ1RlbXBsYXRlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1Byb2Nlc3NQbGFubmluZ1RlbXBsYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxZjY0ZGQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9Qcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Qcm9jZXNzIFBsYW5uaW5nIFRlbXBsYXRlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQSBQcm9jZXNzIFBsYW5uaW5nIFRlbXBsYXRlIGlzIGEgc3BlY2lhbCBQcm9jZXNzIHRoYXQgaXMgcHJlcGFyZWQgZm9yIGluc3RhbnRpYXRpb24gYnkgYSBwcm9qZWN0IHBsYW5uaW5nIHRvb2wuICBUeXBpY2FsbHksIGl0IGlzIGNyZWF0ZWQgYmFzZWQgb24gYSBQcm9jZXNzIHN1Y2ggYXMgYSBEZWxpdmVyeSBQcm9jZXNzIGFzIGEgd2hvbGUgKGUuZy4gaW4gY2FzZSBvZiBhIHdhdGVyZmFsbC1iYXNlZCBkZXZlbG9wbWVudCBhcHByb2FjaCkgb3IgaW4gcGFydHMgKGUuZy4gaW4gY2FzZSBvZiBhbiBpdGVyYXRpdmUgZGV2ZWxvcG1lbnQgYXBwcm9hY2gpLgotICogQSBQcm9jZXNzIFBsYW5uaW5nIFRlbXBsYXRlIHJlcHJlc2VudHMgYSBwYXJ0aWFsbHkgZmluaXNoZWQgcGxhbiBmb3IgYSBjb25jcmV0ZSBwcm9qZWN0LiAgSXQgdXNlcyB0aGUgc2FtZSBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmVzIGFzIGFsbCBvdGhlciBQcm9jZXNzIFR5cGVzIHRvIHJlcHJlc2VudCB0ZW1wbGF0ZXMgZm9yIHByb2plY3QgcGxhbnMuICBIb3dldmVyLCBjZXJ0YWluIHBsYW5uaW5nIGRlY2lzaW9ucyBoYXZlIGFscmVhZHkgYmVlbiBhcHBsaWVkIHRvIHRoZSB0ZW1wbGF0ZSBhcyB3ZWxsIGFzIGluZm9ybWF0aW9uIGhhcyBiZWVuIHJlbW92ZWQgYW5kL29yIHJlZm9ybWF0dGVkIHRvIGJlIHJlYWR5IGZvciBleHBvcnQgdG8gYSBzcGVjaWZpYyBwbGFubmluZyB0b29sLiAgRXhhbXBsZXMgZm9yIHN1Y2ggZGVjaXNpb25zIGFyZTogYSB0ZW1wbGF0ZSBoYXMgYmVlbiBjcmVhdGVkIHRvIHJlcHJlc2VudCBhIHBsYW4gZm9yIGEgcGFydGljdWxhciBJdGVyYXRpb24gaW4gYW4gaXRlcmF0aXZlIGRldmVsb3BtZW50IHByb2plY3QsIHdoaWNoIGZyIGV4YW1wbGUgZGlzdGluZ3Vpc2hlcyBlYXJseSBmcm9tIGxhdGUgaXRlcmF0aW9ucyBpbiB0aGUgRWxhYm9yYXRpb24gcGhhc2Ugb2YgYSBwcm9qZWN0OyBpZiB0aGUgdGFyZ2V0ZWQgcGxhbm5pbmcgdG9vbCBjYW5ub3QgcmVwcmVzZW50IGlucHV0IGFuZCBvdXRwdXQgb2YgVGFzaywgdGhlbiB0aGVzZSBoYXZlIGJlZW4gcmVtb3ZlZCBmcm9tIHRoZSBzdHJ1Y3R1cmU7IGNlcnRhaW4gcmVwZXRpdGlvbnMgaGF2ZSBiZWVuIGFscmVhZHkgYXBwbGllZCwgZS5nLiBzdGF0aW5nIHRoYXQgYSBjeWNsZSBvZiBzcGVjaWZpYyBUYXNrIGdyb3VwZWQgaW4gYW4gQWN0aXZpdHkgaGF2ZSB0byBiZSByZXBlYXRlZCBuLXRpbWVzOyBldGMuCi0gKiAKLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NQbGFubmluZ1RlbXBsYXRlI2dldEJhc2VkT25Qcm9jZXNzZXMgPGVtPkJhc2VkIE9uIFByb2Nlc3NlczwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFByb2Nlc3NQbGFubmluZ1RlbXBsYXRlKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFByb2Nlc3NQbGFubmluZ1RlbXBsYXRlIGV4dGVuZHMgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzIHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5CYXNlZCBPbiBQcm9jZXNzZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3N9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+QmFzZWQgT24gUHJvY2Vzc2VzPC9lbT4nIHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QmFzZWQgT24gUHJvY2Vzc2VzPC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFByb2Nlc3NQbGFubmluZ1RlbXBsYXRlX0Jhc2VkT25Qcm9jZXNzZXMoKQotCSAqIEBtb2RlbCBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdDxvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M+IGdldEJhc2VkT25Qcm9jZXNzZXMoKTsKLQotfSAvLyBQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9Qcm9wZXJ0eS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9Qcm9wZXJ0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MDRhMDI0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvUHJvcGVydHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWE7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlByb3BlcnR5PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvcGVydHkjZ2V0S2V5IDxlbT5LZXk8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvcGVydHkjZ2V0VmFsdWUgPGVtPlZhbHVlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0UHJvcGVydHkoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUHJvcGVydHkgZXh0ZW5kcyBEaWFncmFtRWxlbWVudCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+S2V5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+IiI8L2NvZGU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+S2V5PC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPktleTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0S2V5KFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRQcm9wZXJ0eV9LZXkoKQotCSAqIEBtb2RlbCBkZWZhdWx0PSIiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLlN0cmluZyIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRLZXkoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvcGVydHkjZ2V0S2V5IDxlbT5LZXk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPktleTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0S2V5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRLZXkoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+IiI8L2NvZGU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VmFsdWU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VmFsdWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFZhbHVlKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRQcm9wZXJ0eV9WYWx1ZSgpCi0JICogQG1vZGVsIGRlZmF1bHQ9IiIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuU3RyaW5nIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFZhbHVlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlByb3BlcnR5I2dldFZhbHVlIDxlbT5WYWx1ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VmFsdWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFZhbHVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRWYWx1ZShTdHJpbmcgdmFsdWUpOwotCi19IC8vIFByb3BlcnR5CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1JlZmVyZW5jZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9SZWZlcmVuY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzRhYmE1YS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1JlZmVyZW5jZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UmVmZXJlbmNlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUmVmZXJlbmNlI2dldElzSW5kaXZpZHVhbFJlcHJlc2VudGF0aW9uIDxlbT5JcyBJbmRpdmlkdWFsIFJlcHJlc2VudGF0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlJlZmVyZW5jZSNnZXRSZWZlcmVuY2VkIDxlbT5SZWZlcmVuY2VkPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0UmVmZXJlbmNlKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFJlZmVyZW5jZSBleHRlbmRzIERpYWdyYW1FbGVtZW50IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JcyBJbmRpdmlkdWFsIFJlcHJlc2VudGF0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+ImZhbHNlIjwvY29kZT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5JcyBJbmRpdmlkdWFsIFJlcHJlc2VudGF0aW9uPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPklzIEluZGl2aWR1YWwgUmVwcmVzZW50YXRpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldElzSW5kaXZpZHVhbFJlcHJlc2VudGF0aW9uKEJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0UmVmZXJlbmNlX0lzSW5kaXZpZHVhbFJlcHJlc2VudGF0aW9uKCkKLQkgKiBAbW9kZWwgZGVmYXVsdD0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLkJvb2xlYW4iIHJlcXVpcmVkPSJ0cnVlIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQm9vbGVhbiBnZXRJc0luZGl2aWR1YWxSZXByZXNlbnRhdGlvbigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5SZWZlcmVuY2UjZ2V0SXNJbmRpdmlkdWFsUmVwcmVzZW50YXRpb24gPGVtPklzIEluZGl2aWR1YWwgUmVwcmVzZW50YXRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPklzIEluZGl2aWR1YWwgUmVwcmVzZW50YXRpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldElzSW5kaXZpZHVhbFJlcHJlc2VudGF0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRJc0luZGl2aWR1YWxSZXByZXNlbnRhdGlvbihCb29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJlZmVyZW5jZWQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiBJdCBpcyBiaWRpcmVjdGlvbmFsIGFuZCBpdHMgb3Bwb3NpdGUgaXMgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW1FbGVtZW50I2dldFJlZmVyZW5jZSA8ZW0+UmVmZXJlbmNlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlJlZmVyZW5jZWQ8L2VtPicgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmVmZXJlbmNlZDwvZW0+JyByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0UmVmZXJlbmNlZChEaWFncmFtRWxlbWVudCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRSZWZlcmVuY2VfUmVmZXJlbmNlZCgpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW1FbGVtZW50I2dldFJlZmVyZW5jZQotCSAqIEBtb2RlbCBvcHBvc2l0ZT0icmVmZXJlbmNlIiByZXF1aXJlZD0idHJ1ZSIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCURpYWdyYW1FbGVtZW50IGdldFJlZmVyZW5jZWQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUmVmZXJlbmNlI2dldFJlZmVyZW5jZWQgPGVtPlJlZmVyZW5jZWQ8L2VtPn0nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlJlZmVyZW5jZWQ8L2VtPicgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldFJlZmVyZW5jZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFJlZmVyZW5jZWQoRGlhZ3JhbUVsZW1lbnQgdmFsdWUpOwotCi19IC8vIFJlZmVyZW5jZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9SZXBvcnQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvUmVwb3J0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4ODdkNDQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9SZXBvcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWE7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlJlcG9ydDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEEgUmVwb3J0IGlzIGEgcHJlZGVmaW5lZCB0ZW1wbGF0ZSBvZiBhIHJlc3VsdCB0aGF0IGlzIGdlbmVyYXRlZCBvbiB0aGUgYmFzaXMgb2Ygb3RoZXIgd29yayBwcm9kdWN0cyBhcyBhbiBvdXRwdXQgZnJvbSBzb21lIGZvcm0gb2YgdG9vbCBhdXRvbWF0aW9uLiBBbiBleGFtcGxlIGZvciBhIHJlcG9ydCB3b3VsZCBiZSBhIHVzZSBjYXNlIG1vZGVsIHN1cnZleSwgd2hpY2ggaXMgZ2VuZXJhdGVkIGJ5IGV4dHJhY3RpbmcgZGlhZ3JhbSBpbmZvcm1hdGlvbiBmcm9tIGEgZ3JhcGhpY2FsIG1vZGVsIGFuZCB0ZXh0dWFsIGluZm9ybWF0aW9uIGZyb20gZG9jdW1lbnRzIGFuZCBjb21iaW5lcyB0aGVzZSB0d28gdHlwZXMgb2YgaW5mb3JtYXRpb24gaW50byBhIHJlcG9ydC4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0UmVwb3J0KCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFJlcG9ydCBleHRlbmRzIEd1aWRhbmNlIHsKLX0gLy8gUmVwb3J0CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1JldXNhYmxlQXNzZXQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvUmV1c2FibGVBc3NldC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNjFkZGFiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvUmV1c2FibGVBc3NldC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UmV1c2FibGUgQXNzZXQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIFJldXNhYmxlIEFzc2V0IHByb3ZpZGVzIGEgc29sdXRpb24gdG8gYSBwcm9ibGVtIGZvciBhIGdpdmVuIGNvbnRleHQuIFRoZSBhc3NldCBtYXkgaGF2ZSBhIHZhcmlhYmlsaXR5IHBvaW50LCB3aGljaCBpcyBhIGxvY2F0aW9uIGluIHRoZSBhc3NldCB0aGF0IG1heSBoYXZlIGEgdmFsdWUgcHJvdmlkZWQgb3IgY3VzdG9taXplZCBieSB0aGUgYXNzZXQgY29uc3VtZXIuIFRoZSBhc3NldCBoYXMgcnVsZXMgZm9yIHVzYWdlIHdoaWNoIGFyZSB0aGUgaW5zdHJ1Y3Rpb25zIGRlc2NyaWJpbmcKLSAqIGhvdyB0aGUgYXNzZXQgc2hvdWxkIGJlIHVzZWQuCi0gKiAKLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0UmV1c2FibGVBc3NldCgpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBSZXVzYWJsZUFzc2V0IGV4dGVuZHMgR3VpZGFuY2UgewotfSAvLyBSZXVzYWJsZUFzc2V0CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1JvYWRtYXAuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvUm9hZG1hcC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNDA5MDVlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvUm9hZG1hcC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Um9hZG1hcDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEEgUm9hZG1hcCBpcyBhIHNwZWNpYWwgR3VpZGFuY2UgVHlwZSB3aGljaCBpcyBvbmx5IHJlbGF0ZWQgdG8gQWN0aXZhdGVzIGFuZCB0aGVyZWZvcmUgaGFzIGJlZW4gYWRkZWQgYnkgdGhpcyBwYWNrYWdlIHRvIHRoZSBsaXN0IG9mIEd1aWRhbmNlIFR5cGVzIHJhdGhlciB0aGFuIGxpc3RlZCBpbiB0aGUgR3VpZGFuY2UgVHlwZXMgcGFja2FnZS4gIEEgUm9hZG1hcCByZXByZXNlbnRzIGEgbGluZWFyIHdhbGt0aHJvdWdoIG9mIGFuIEFjdGl2aXR5LCB0eXBpY2FsbHkgYSBQcm9jZXNzLgotICogQW4gaW5zdGFuY2Ugb2YgYSBSb2FkbWFwIHJlcHJlc2VudHMgaW1wb3J0YW50IGRvY3VtZW50YXRpb24gZm9yIHRoZSBBY3Rpdml0eSBvciBQcm9jZXNzIGl0IGlzIHJlbGF0ZWQgdG8uICBPZnRlbiBhIGNvbXBsZXggQWN0aXZpdHkgc3VjaCBhcyBhIFByb2Nlc3MgY2FuIGJlIG11Y2ggZWFzaWVyIHVuZGVyc3Rvb2QgYnkgcHJvdmlkaW5nIGEgd2Fsa3Rocm91Z2ggd2l0aCBhIGxpbmVhciB0aHJlYWQgb2YgYSB0eXBpY2FsIGluc3RhbnRpYXRpb24gb2YgdGhpcyBBY3Rpdml0eS4gIEluIGFkZGl0aW9uIHRvIG1ha2luZyB0aGUgcHJvY2VzcyBwcmFjdGl0aW9uZXIgdW5kZXJzdGFuZCBob3cgd29yayBpbiB0aGUgcHJvY2VzcyBpcyBiZWluZyBwZXJmb3JtZWQsIGEgUm9hZG1hcCBwcm92aWRlcyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGFib3V0IGhvdyBBY3Rpdml0aWVzIGFuZCBUYXNrcyByZWxhdGUgdG8gZWFjaCBvdGhlciBvdmVyIHRpbWUuICBSb2FkbWFwcyBhcmUgYWxzbyB1c2VkIHRvIHNob3cgaG93IHNwZWNpZmljIGFzcGVjdHMgYXJlIGRpc3RyaWJ1dGVkIG92ZXIgYSB3aG9sZSBwcm9jZXNzIHByb3ZpZGluZyBhIGtpbmQgb2YgZmlsdGVyIG9uIHRoZSBwcm9jZXNzIGZvciB0aGlzIGluZm9ybWF0aW9uLgotICogCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFJvYWRtYXAoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUm9hZG1hcCBleHRlbmRzIEd1aWRhbmNlIHsKLX0gLy8gUm9hZG1hcApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9Sb2xlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1JvbGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTMwMzZjZi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1JvbGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Um9sZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEEgUm9sZSBpcyBhIGNvbnRlbnQgZWxlbWVudCB0aGF0IGRlZmluZXMgYSBzZXQgb2YgcmVsYXRlZCBza2lsbHMsIGNvbXBldGVuY2llcywgYW5kIHJlc3BvbnNpYmlsaXRpZXMuICBSb2xlcyBhcmUgdXNlZCBieSBUYXNrcyB0byBkZWZpbmUgd2hvIHBlcmZvcm1zIHRoZW0gYXMgd2VsbCBhcyBkZWZpbmUgYSBzZXQgb2Ygd29yayBwcm9kdWN0cyB0aGV5IGFyZSByZXNwb25zaWJsZSBmb3IuICAKLSAqIEEgUm9sZSBkZWZpbmVzIGEgc2V0IG9mIHJlbGF0ZWQgc2tpbGxzLCBjb21wZXRlbmNpZXMsIGFuZCByZXNwb25zaWJpbGl0aWVzIG9mIGFuIGluZGl2aWR1YWwgb3IgYSBzZXQgb2YgaW5kaXZpZHVhbHMuICBSb2xlcyBhcmUgbm90IGluZGl2aWR1YWxzIG9yIHJlc291cmNlcy4gIEluZGl2aWR1YWwgbWVtYmVycyBvZiB0aGUgZGV2ZWxvcG1lbnQgb3JnYW5pemF0aW9uIHdpbGwgd2VhciBkaWZmZXJlbnQgaGF0cywgb3IgcGVyZm9ybSBkaWZmZXJlbnQgcm9sZXMuIFRoZSBtYXBwaW5nIGZyb20gaW5kaXZpZHVhbCB0byByb2xlLCBwZXJmb3JtZWQgYnkgdGhlIHByb2plY3QgbWFuYWdlciB3aGVuIHBsYW5uaW5nIGFuZCBzdGFmZmluZyBmb3IgYSBwcm9qZWN0LCBhbGxvd3MgZGlmZmVyZW50IGluZGl2aWR1YWxzIHRvIGFjdCBhcyBzZXZlcmFsIGRpZmZlcmVudCByb2xlcywgYW5kIGZvciBhIHJvbGUgdG8gYmUgcGxheWVkIGJ5IHNldmVyYWwgaW5kaXZpZHVhbHMuCi0gKiAKLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGUjZ2V0TW9kaWZpZXMgPGVtPk1vZGlmaWVzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGUjZ2V0UmVzcG9uc2libGVGb3IgPGVtPlJlc3BvbnNpYmxlIEZvcjwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFJvbGUoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUm9sZSBleHRlbmRzIENvbnRlbnRFbGVtZW50LCBGdWxmaWxsYWJsZUVsZW1lbnQgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1vZGlmaWVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Nb2RpZmllczwvZW0+JyByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1vZGlmaWVzPC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFJvbGVfTW9kaWZpZXMoKQotCSAqIEBtb2RlbCB0cmFuc2llbnQ9InRydWUiIHZvbGF0aWxlPSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdDxXb3JrUHJvZHVjdD4gZ2V0TW9kaWZpZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJlc3BvbnNpYmxlIEZvcjwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3R9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UmVzcG9uc2libGUgRm9yPC9lbT4nIHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmVzcG9uc2libGUgRm9yPC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFJvbGVfUmVzcG9uc2libGVGb3IoKQotCSAqIEBtb2RlbCBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdDxXb3JrUHJvZHVjdD4gZ2V0UmVzcG9uc2libGVGb3IoKTsKLQotfSAvLyBSb2xlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1JvbGVEZXNjcmlwdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9Sb2xlRGVzY3JpcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzM3OTAxYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1JvbGVEZXNjcmlwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWE7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlJvbGUgRGVzY3JpcHRpb248L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRpb24jZ2V0U2tpbGxzIDxlbT5Ta2lsbHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZURlc2NyaXB0aW9uI2dldEFzc2lnbm1lbnRBcHByb2FjaGVzIDxlbT5Bc3NpZ25tZW50IEFwcHJvYWNoZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZURlc2NyaXB0aW9uI2dldFN5bm9ueW1zIDxlbT5TeW5vbnltczwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFJvbGVEZXNjcmlwdGlvbigpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBSb2xlRGVzY3JpcHRpb24gZXh0ZW5kcyBDb250ZW50RGVzY3JpcHRpb24gewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlNraWxsczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiIiPC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIExpc3RzIG9mIHNldCBvZiByZXF1aXJlZCBza2lsbHMgYSBwZXJzb24gbmVlZHMgdG8gcG9zc2VzcyB0byBmdWxmaWxsIHRoYXQgUm9sZS4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U2tpbGxzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRTa2lsbHMoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFJvbGVEZXNjcmlwdGlvbl9Ta2lsbHMoKQotCSAqIEBtb2RlbCBkZWZhdWx0PSIiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLlN0cmluZyIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRTa2lsbHMoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZURlc2NyaXB0aW9uI2dldFNraWxscyA8ZW0+U2tpbGxzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Ta2lsbHM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFNraWxscygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0U2tpbGxzKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Bc3NpZ25tZW50IEFwcHJvYWNoZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iIjwvY29kZT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBQcm92aWRlcyBndWlkYW5jZSBvbiBmb3IgYXNzaWduaW5nIGluZGl2aWR1YWxzIHRvIHRoZSBSb2xlIGluIHRlcm1zIG9mIHdoYXQgb3RoZXIgcm9sZXMgdGhlc2UgaW5kaXZpZHVhbHMgY291bGQgcGVyZm9ybSBhbmQgd2hhdCByZXNwb25zaWJpbGl0eSBkaWZmZXJlbnQgaW5kaXZpZHVhbHMgYXNzaWduZWQgdG8gdGhpcyByb2xlIG1pZ2h0IGhhdmUuICBUaGUgZ3VpZGFuY2UgY2FuIGFsc28gZGVzY3JpYmUgZGlmZmVyZW50IGFzc2lnbm1lbnQgYXBwcm9hY2hlcyBmb3IgZGlmZmVyZW50IHR5cGVzIG9mIHByb2plY3RzLCBlLmcuIGZvciBsYXJnZSB2ZXJzdXMgc21hbGwgdGVhbXMgd2hlcmUgaW5kaXZpZHVhbHMgY291bGQgYmUgYWxsb2NhdGVkIHRvIHJvbGVzIGZ1bGwgdGltZSB2ZXJzdXMgc2hhcmluZyByb2xlcyB3aXRoaW4gdGhlIHRlYW0uCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkFzc2lnbm1lbnQgQXBwcm9hY2hlczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0QXNzaWdubWVudEFwcHJvYWNoZXMoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFJvbGVEZXNjcmlwdGlvbl9Bc3NpZ25tZW50QXBwcm9hY2hlcygpCi0JICogQG1vZGVsIGRlZmF1bHQ9IiIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuU3RyaW5nIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldEFzc2lnbm1lbnRBcHByb2FjaGVzKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdGlvbiNnZXRBc3NpZ25tZW50QXBwcm9hY2hlcyA8ZW0+QXNzaWdubWVudCBBcHByb2FjaGVzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Bc3NpZ25tZW50IEFwcHJvYWNoZXM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEFzc2lnbm1lbnRBcHByb2FjaGVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRBc3NpZ25tZW50QXBwcm9hY2hlcyhTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U3lub255bXM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iIjwvY29kZT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBMaXN0cyBzeW5vbnltcywgaS5lLiBvdGhlciBuYW1lcyB0aGUgUm9sZSBtaWdodCBiZSByZWZlcnJlZCBieS4gIFRvb2wgc3VwcG9ydCBmb3IgdGhlIG1ldGEtbW9kZWwgbWlnaHQgc3VwcG9ydCB0aGF0IGEgUm9sZSBuYW1lIGNhbiBiZSBjb25zaXN0ZW50bHkgYmUgcmVwbGFjZWQgd2l0aCBvbmUgb2YgaXRzIHN5bm9ueW1zIHRocm91Z2h0IGEgUHJvY2Vzcy4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U3lub255bXM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFN5bm9ueW1zKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRSb2xlRGVzY3JpcHRpb25fU3lub255bXMoKQotCSAqIEBtb2RlbCBkZWZhdWx0PSIiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLlN0cmluZyIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRTeW5vbnltcygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRpb24jZ2V0U3lub255bXMgPGVtPlN5bm9ueW1zPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TeW5vbnltczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0U3lub255bXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFN5bm9ueW1zKFN0cmluZyB2YWx1ZSk7Ci0KLX0gLy8gUm9sZURlc2NyaXB0aW9uCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1JvbGVEZXNjcmlwdG9yLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1JvbGVEZXNjcmlwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyMTdmMDIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9Sb2xlRGVzY3JpcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Sb2xlIERlc2NyaXB0b3I8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIFJvbGUgRGVzY3JpcHRvciByZXByZXNlbnRzIGEgUm9sZSBpbiB0aGUgY29udGV4dCBvZiBvbmUgc3BlY2lmaWMgQWN0aXZpdHkuICBFdmVyeSBicmVha2Rvd24gc3RydWN0dXJlIGNhbiBkZWZpbmUgZGlmZmVyZW50IHJlbGF0aW9uc2hpcHMgb2YgUm9sZSBEZXNjcmlwdG9ycyB0byBUYXNrIERlc2NyaXB0b3JzIGFuZCBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvcnMuICBUaGVyZWZvcmUgb25lIFJvbGUgY2FuIGJlIHJlcHJlc2VudGVkIGJ5IG1hbnkgUm9sZSBEZXNjcmlwdG9ycyBlYWNoIHdpdGhpbiB0aGUgY29udGV4dCBvZiBhbiBBY3Rpdml0eSB3aXRoIGl0cyBvd24gc2V0IG9mIHJlbGF0aW9uc2hpcHMuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRvciNnZXRSb2xlIDxlbT5Sb2xlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdG9yI2dldE1vZGlmaWVzIDxlbT5Nb2RpZmllczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRvciNnZXRSZXNwb25zaWJsZUZvciA8ZW0+UmVzcG9uc2libGUgRm9yPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0Um9sZURlc2NyaXB0b3IoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUm9sZURlc2NyaXB0b3IgZXh0ZW5kcyBEZXNjcmlwdG9yIHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Sb2xlPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Sb2xlPC9lbT4nIHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJvbGU8L2VtPicgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFJvbGUoUm9sZSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRSb2xlRGVzY3JpcHRvcl9Sb2xlKCkKLQkgKiBAbW9kZWwgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVJvbGUgZ2V0Um9sZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRvciNnZXRSb2xlIDxlbT5Sb2xlPC9lbT59JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Sb2xlPC9lbT4nIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRSb2xlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRSb2xlKFJvbGUgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TW9kaWZpZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvcn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Nb2RpZmllczwvZW0+JyByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1vZGlmaWVzPC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFJvbGVEZXNjcmlwdG9yX01vZGlmaWVzKCkKLQkgKiBAbW9kZWwgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0PFdvcmtQcm9kdWN0RGVzY3JpcHRvcj4gZ2V0TW9kaWZpZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJlc3BvbnNpYmxlIEZvcjwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlJlc3BvbnNpYmxlIEZvcjwvZW0+JyByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJlc3BvbnNpYmxlIEZvcjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRSb2xlRGVzY3JpcHRvcl9SZXNwb25zaWJsZUZvcigpCi0JICogQG1vZGVsIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0PFdvcmtQcm9kdWN0RGVzY3JpcHRvcj4gZ2V0UmVzcG9uc2libGVGb3IoKTsKLQotfSAvLyBSb2xlRGVzY3JpcHRvcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9Sb2xlU2V0LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1JvbGVTZXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWUyMTRjNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1JvbGVTZXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Um9sZSBTZXQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIFJvbGUgU2V0IG9yZ2FuaXplcyBSb2xlcyBpbnRvIGNhdGVnb3JpZXMuICBJdCBpcyB1c2VkIHRvIGdyb3VwIHJvbGVzIHRvZ2V0aGVyIHRoYXQgaGF2ZSBjZXJ0YWluIGNvbW1vbmFsaXRpZXMuICBGb3IgZXhhbXBsZSwgdGhlICJBbmFseXN0cyIgUm9sZSBTZXQgY291bGQgZ3JvdXAgdGhlICJCdXNpbmVzcyBQcm9jZXNzIEFuYWx5c3QiLCAiU3lzdGVtIEFuYWx5c3QiLCBhcyB3ZWxsIGFzICJSZXF1aXJlbWVudHMgU3BlY2lmaWVyIiByb2xlcy4gIEFsbCBvZiB0aGVzZSB3b3JrIHdpdGggc2ltaWxhciB0ZWNobmlxdWVzIGFuZCBoYXZlIG92ZXJsYXBwaW5nIHNraWxscywgYnV0IGFyZSByZXF1aXJlZCBhcyBkaXN0aW5jdCByb2xlcyBmb3IgYSBtZXRob2QgKGUuZy4gdGhlIG1ldGhvZCB0aGUgSUJNIFJhdGlvbmFsIFVuaWZpZWQgUHJvY2VzcyBpcyBiYXNlZCBvbikuCi0gKiAKLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVTZXQjZ2V0Um9sZXMgPGVtPlJvbGVzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0Um9sZVNldCgpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBSb2xlU2V0IGV4dGVuZHMgQ29udGVudENhdGVnb3J5IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Sb2xlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Sb2xlczwvZW0+JyByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJvbGVzPC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFJvbGVTZXRfUm9sZXMoKQotCSAqIEBtb2RlbCBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdDxSb2xlPiBnZXRSb2xlcygpOwotCi19IC8vIFJvbGVTZXQKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvUm9sZVNldEdyb3VwaW5nLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1JvbGVTZXRHcm91cGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYzFmNDUxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvUm9sZVNldEdyb3VwaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlJvbGUgU2V0IEdyb3VwaW5nPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogUm9sZSBTZXRzIGNhbiBiZSBjYXRlZ29yaXplZCBpbnRvIFJvbGUgU2V0IEdyb3VwaW5ncy4gIEZvciBleGFtcGxlLCBkaWZmZXJlbnQgbWV0aG9kcyBtaWdodCBkZWZpbmUgc2ltaWxhciBSb2xlIFNldHMsIHdoaWNoIGhvd2V2ZXIgbmVlZCB0byBiZSBkaXN0aW5ndWlzaGVkIGZyb20gZWFjaCBvdGhlciBvbiBhIGdsb2JhbCBzY2FsZS4gIFRodXMsIFJvbGUgU2V0IEdyb3VwaW5ncyBhbGxvdyBkaXN0aW5ndWlzaGluZywgZm9yIGV4YW1wbGUsIFNvZnR3YXJlIFNlcnZpY2VzIE1hbmFnZXIgUm9sZSBTZXRzIGZyb20gU29mdHdhcmUgRGV2ZWxvcG1lbnQgT3JnYW5pemF0aW9uIE1hbmFnZXIgUm9sZSBTZXRzLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZVNldEdyb3VwaW5nI2dldFJvbGVTZXRzIDxlbT5Sb2xlIFNldHM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRSb2xlU2V0R3JvdXBpbmcoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUm9sZVNldEdyb3VwaW5nIGV4dGVuZHMgQ29udGVudENhdGVnb3J5IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Sb2xlIFNldHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVTZXR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Um9sZSBTZXRzPC9lbT4nIHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Um9sZSBTZXRzPC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFJvbGVTZXRHcm91cGluZ19Sb2xlU2V0cygpCi0JICogQG1vZGVsIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0PFJvbGVTZXQ+IGdldFJvbGVTZXRzKCk7Ci0KLX0gLy8gUm9sZVNldEdyb3VwaW5nCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1NlY3Rpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvU2VjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMGMzZTExLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvU2VjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+U2VjdGlvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEEgU2VjdGlvbiBpcyBhIHNwZWNpYWwgTWV0aG9kIEVsZW1lbnQgdGhhdCByZXByZXNlbnRzIHN0cnVjdHVyYWwgc3Vic2VjdGlvbnMgb2YgYSBDb250ZW50IERlc2NyaXB0aW9uJ3Mgc2VjdGlvbkRlc2NyaXB0aW9uIGF0dHJpYnV0ZS4gIEl0IGlzIHVzZWQgZm9yIGVpdGhlciBsYXJnZSBzY2FsZSBkb2N1bWVudGF0aW9uIG9mIENvbnRlbnQgRWxlbWVudHMgb3JnYW5pemVkIGludG8gc2VjdGlvbnMgYXMgd2VsbCBhcyB0byBmbGV4aWJseSBhZGQgbmV3IFNlY3Rpb25zIHRvIENvbnRlbnQgRWxlbWVudHMgdXNpbmcgY29udHJpYnV0aW9uIHZhcmlhYmlsaXR5IGFkZGVkIHRvIHRoZSBTZWN0aW9uIGNvbmNlcHQgZm9yIE1ldGhvZCBQbHVnLWlucy4KLSAqIFNlY3Rpb24gaW4gdGhlIHBhY2thZ2UgTWV0aG9kIFBsdWdpbiBpbmhlcml0cyBmcm9tIFZhcmlhYmlsaXR5IEVsZW1lbnQgYW5kIGV4dGVuZHMgU2VjdGlvbiBkZWZpbmVkIGluIE1ldGhvZCBDb3JlIDo6IEJhc2ljIEVsZW1lbnRzIHdpdGggbmV3IGNhcGFiaWxpdGllcyBmb3IgdmFyaWFiaWxpdHkuIAotICogRm9yIGV4YW1wbGUsIHdoZW4gYSBUYXNrIGNvbnRyaWJ1dGVzIHRvIGFub3RoZXIgVGFzayBpdHMgUHJlc2VudGF0aW9uIGFzc29jaWF0aW9uIGlzIGNvbnRyaWJ1dGVkIGluY2x1ZGluZyBpdHMgU2VjdGlvbnMgKGkuZS4gaXRzIFN0ZXBzKSwgd2hpY2ggYXJlIG1vZGVsZWQgYXMgcGFydHMgb2YgdGhlIENvbnRlbnQgRGVzY3JpcHRpb24gaW5zdGFuY2UuICBTZWN0aW9ucyBjYW4gYmUgbmVzdGVkIGFuZCB0aGVyZWZvcmUgVGFzayBEZXNjcmlwdGlvbnMgY2FuIGJlIGZsZXhpYmx5IG9yZ2FuaXplZCBpbiBTdGVwcyB3aXRoIHN1Yi1TdGVwcy4gIFNlY3Rpb25zIGFyZSBWYXJpYWJpbGl0eSBFbGVtZW50cyB0aGVtc2VsdmVzLCBzbyB0aGV5IGNhbiBjb250cmlidXRlIHRvIGVhY2ggb3RoZXIuICBGb3IgZXhhbXBsZSwgb25lIGNvdWxkIG1vZGVsIGEgVGFzayBzdGVwIGFzIGEgU2VjdGlvbiBpbnN0YW5jZSB3aXRob3V0IHJlbGF0aW5nIGl0IHRvIGEgVGFzayBEZXNjcmlwdGlvbiB0aGF0IGRpcmVjdGx5IGNvbnRyaWJ1dGVzIHRvIChvciByZXBsYWNlcykgYW5vdGhlciBTZWN0aW9uIHdoaWNoIGlzIHBhcnQgb2YgYSBUYXNrIERlc2NyaXB0aW9uLiAgVGhpcyBjb250cmlidXRpb24gKG9yIHJlcGxhY2VtZW50KSB3b3VsZCBhZGQgbmV3IGRlc2NyaXB0aW9uIHRleHQgdG8gdGhlIG9yaWdpbmFsIHN0ZXAgZGVzY3JpcHRpb24gKG9yIHJlcGxhY2UgdGhlIG9yaWdpbmFsIHN0ZXAgZGVzY3JpcHRpb24pLiAgQW5vdGhlciBleGFtcGxlIHdvdWxkIGJlIHRvIGNvbnRyaWJ1dGUgbmV3IENoZWNrIExpc3QgaXRlbXMgb3JnYW5pemVkIGFzIFNlY3Rpb25zIHRvIGFuIGV4aXN0aW5nIENoZWNrIExpc3QgKGRlZmluZWQgYXMgZ3VpZGFuY2UpLiAgCi0gKiAKLSAqIAotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuU2VjdGlvbiNnZXRTZWN0aW9uTmFtZSA8ZW0+U2VjdGlvbiBOYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlNlY3Rpb24jZ2V0U2VjdGlvbkRlc2NyaXB0aW9uIDxlbT5TZWN0aW9uIERlc2NyaXB0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlNlY3Rpb24jZ2V0U3ViU2VjdGlvbnMgPGVtPlN1YiBTZWN0aW9uczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5TZWN0aW9uI2dldFByZWRlY2Vzc29yIDxlbT5QcmVkZWNlc3NvcjwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFNlY3Rpb24oKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgU2VjdGlvbiBleHRlbmRzIFZhcmlhYmlsaXR5RWxlbWVudCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U2VjdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+IiI8L2NvZGU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogRXZlcnkgU2VjdGlvbiBoYXMgYSBuYW1lIHVzZWQgZm9yIGV4dGVybmFsIHByZXNlbnRhdGlvbiBvZiB0aGUgc2VjdGlvbiwgZS5nLiB3aGVuIHB1Ymxpc2hlZCBvciB3aGVuIHNlY3Rpb24gaGVhZGluZyBhcmUgbGlzdGVkIGluIGEgdGFibGUgb2YgY29udGVudHMuICBUaGlzIGF0dHJpYnV0ZSBpcyBzaW1pbGFyIHRvIFByZXNlbnRhdGlvbiBOYW1lIGZvciBDb250ZW50IEVsZW1lbnRzLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TZWN0aW9uIE5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFNlY3Rpb25OYW1lKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRTZWN0aW9uX1NlY3Rpb25OYW1lKCkKLQkgKiBAbW9kZWwgZGVmYXVsdD0iIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5TdHJpbmciIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0U2VjdGlvbk5hbWUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuU2VjdGlvbiNnZXRTZWN0aW9uTmFtZSA8ZW0+U2VjdGlvbiBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TZWN0aW9uIE5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFNlY3Rpb25OYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRTZWN0aW9uTmFtZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U2VjdGlvbiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiIiPC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoaXMgYXR0cmlidXRlcyBzdG9yZSB0aGUgZGVzY3JpcHRpb24gdGV4dCBmb3IgYSBDb250ZW50IERlc2NyaXB0aW9uJ3MgU2VjdGlvbi4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U2VjdGlvbiBEZXNjcmlwdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0U2VjdGlvbkRlc2NyaXB0aW9uKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRTZWN0aW9uX1NlY3Rpb25EZXNjcmlwdGlvbigpCi0JICogQG1vZGVsIGRlZmF1bHQ9IiIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuU3RyaW5nIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFNlY3Rpb25EZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5TZWN0aW9uI2dldFNlY3Rpb25EZXNjcmlwdGlvbiA8ZW0+U2VjdGlvbiBEZXNjcmlwdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U2VjdGlvbiBEZXNjcmlwdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0U2VjdGlvbkRlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRTZWN0aW9uRGVzY3JpcHRpb24oU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlN1YiBTZWN0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuU2VjdGlvbn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5TdWIgU2VjdGlvbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TdWIgU2VjdGlvbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0U2VjdGlvbl9TdWJTZWN0aW9ucygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0idHJ1ZSIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3Q8U2VjdGlvbj4gZ2V0U3ViU2VjdGlvbnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlByZWRlY2Vzc29yPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5QcmVkZWNlc3NvcjwvZW0+JyByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QcmVkZWNlc3NvcjwvZW0+JyByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0UHJlZGVjZXNzb3IoU2VjdGlvbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRTZWN0aW9uX1ByZWRlY2Vzc29yKCkKLQkgKiBAbW9kZWwgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVNlY3Rpb24gZ2V0UHJlZGVjZXNzb3IoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuU2VjdGlvbiNnZXRQcmVkZWNlc3NvciA8ZW0+UHJlZGVjZXNzb3I8L2VtPn0nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlByZWRlY2Vzc29yPC9lbT4nIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRQcmVkZWNlc3NvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UHJlZGVjZXNzb3IoU2VjdGlvbiB2YWx1ZSk7Ci0KLX0gLy8gU2VjdGlvbgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9TZW1hbnRpY01vZGVsQnJpZGdlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1NlbWFudGljTW9kZWxCcmlkZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGEwNDY2MC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1NlbWFudGljTW9kZWxCcmlkZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5TZW1hbnRpYyBNb2RlbCBCcmlkZ2U8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5TZW1hbnRpY01vZGVsQnJpZGdlI2dldFByZXNlbnRhdGlvbiA8ZW0+UHJlc2VudGF0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlNlbWFudGljTW9kZWxCcmlkZ2UjZ2V0RGlhZ3JhbSA8ZW0+RGlhZ3JhbTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5TZW1hbnRpY01vZGVsQnJpZGdlI2dldEdyYXBoRWxlbWVudCA8ZW0+R3JhcGggRWxlbWVudDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFNlbWFudGljTW9kZWxCcmlkZ2UoKQotICogQG1vZGVsIGFic3RyYWN0PSJ0cnVlIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFNlbWFudGljTW9kZWxCcmlkZ2UgZXh0ZW5kcyBEaWFncmFtRWxlbWVudCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+IiI8L2NvZGU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UHJlc2VudGF0aW9uPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlByZXNlbnRhdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UHJlc2VudGF0aW9uKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRTZW1hbnRpY01vZGVsQnJpZGdlX1ByZXNlbnRhdGlvbigpCi0JICogQG1vZGVsIGRlZmF1bHQ9IiIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuU3RyaW5nIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFByZXNlbnRhdGlvbigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5TZW1hbnRpY01vZGVsQnJpZGdlI2dldFByZXNlbnRhdGlvbiA8ZW0+UHJlc2VudGF0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5QcmVzZW50YXRpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFByZXNlbnRhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UHJlc2VudGF0aW9uKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5HcmFwaCBFbGVtZW50PC9iPjwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlLgotCSAqIEl0IGlzIGJpZGlyZWN0aW9uYWwgYW5kIGl0cyBvcHBvc2l0ZSBpcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhFbGVtZW50I2dldFNlbWFudGljTW9kZWwgPGVtPlNlbWFudGljIE1vZGVsPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkdyYXBoIEVsZW1lbnQ8L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkdyYXBoIEVsZW1lbnQ8L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRHcmFwaEVsZW1lbnQoR3JhcGhFbGVtZW50KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFNlbWFudGljTW9kZWxCcmlkZ2VfR3JhcGhFbGVtZW50KCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhFbGVtZW50I2dldFNlbWFudGljTW9kZWwKLQkgKiBAbW9kZWwgb3Bwb3NpdGU9InNlbWFudGljTW9kZWwiIHRyYW5zaWVudD0iZmFsc2UiIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlHcmFwaEVsZW1lbnQgZ2V0R3JhcGhFbGVtZW50KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlNlbWFudGljTW9kZWxCcmlkZ2UjZ2V0R3JhcGhFbGVtZW50IDxlbT5HcmFwaCBFbGVtZW50PC9lbT59JyBjb250YWluZXIgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+R3JhcGggRWxlbWVudDwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldEdyYXBoRWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0R3JhcGhFbGVtZW50KEdyYXBoRWxlbWVudCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EaWFncmFtPC9iPjwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlLgotCSAqIEl0IGlzIGJpZGlyZWN0aW9uYWwgYW5kIGl0cyBvcHBvc2l0ZSBpcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbSNnZXROYW1lc3BhY2UgPGVtPk5hbWVzcGFjZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5EaWFncmFtPC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EaWFncmFtPC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0RGlhZ3JhbShEaWFncmFtKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFNlbWFudGljTW9kZWxCcmlkZ2VfRGlhZ3JhbSgpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW0jZ2V0TmFtZXNwYWNlCi0JICogQG1vZGVsIG9wcG9zaXRlPSJuYW1lc3BhY2UiIHRyYW5zaWVudD0iZmFsc2UiIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlEaWFncmFtIGdldERpYWdyYW0oKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuU2VtYW50aWNNb2RlbEJyaWRnZSNnZXREaWFncmFtIDxlbT5EaWFncmFtPC9lbT59JyBjb250YWluZXIgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RGlhZ3JhbTwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldERpYWdyYW0oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldERpYWdyYW0oRGlhZ3JhbSB2YWx1ZSk7Ci0KLX0gLy8gU2VtYW50aWNNb2RlbEJyaWRnZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9TaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9TaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZWZiYTA4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWE7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlNpbXBsZSBTZW1hbnRpYyBNb2RlbCBFbGVtZW50PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnQjZ2V0VHlwZUluZm8gPGVtPlR5cGUgSW5mbzwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFNpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50KCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFNpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50IGV4dGVuZHMgU2VtYW50aWNNb2RlbEJyaWRnZSB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VHlwZSBJbmZvPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+IiI8L2NvZGU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VHlwZSBJbmZvPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlR5cGUgSW5mbzwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0VHlwZUluZm8oU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFNpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50X1R5cGVJbmZvKCkKLQkgKiBAbW9kZWwgZGVmYXVsdD0iIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5TdHJpbmciIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0VHlwZUluZm8oKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnQjZ2V0VHlwZUluZm8gPGVtPlR5cGUgSW5mbzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VHlwZSBJbmZvPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRUeXBlSW5mbygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VHlwZUluZm8oU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBTaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9TdGVwLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1N0ZXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmFmNjIzMS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1N0ZXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWE7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlN0ZXA8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIFN0ZXAgaXMgYSBTZWN0aW9uIGFuZCBXb3JrIERlZmluaXRpb24gdGhhdCBpcyB1c2VkIHRvIG9yZ2FuaXplIFRhc2tzIGludG8gcGFydHMgb3Igc3VidW5pdHMgb2Ygd29yay4gIFN0ZXBzIGluaGVyaXQgdGhlIHN1YlNlY3Rpb25zIGRlY29tcG9zaXRpb24gZnJvbSBTZWN0aW9uIGFuZCBjYW4gdGhlcmVmb3JlIGRlc2NyaWJlIFN1Yi1TdGVwcyBuZXN0ZWQgaW50byBTdGVwcy4KLSAqIEEgU3RlcCBkZXNjcmliZXMgYSBtZWFuaW5nZnVsIGFuZCBjb25zaXN0IHBhcnQgb2YgdGhlIG92ZXJhbGwgd29yayBkZXNjcmliZWQgZm9yIGEgVGFzay4gIFRoZSBjb2xsZWN0aW9uIG9mIFN0ZXBzIGRlZmluZWQgZm9yIGEgVGFzayByZXByZXNlbnRzIGFsbCB0aGUgd29yayB0aGF0IHNob3VsZCBiZSBkb25lIHRvIGFjaGlldmUgdGhlIG92ZXJhbGwgZGV2ZWxvcG1lbnQgZ29hbCBvZiB0aGUgVGFzay4gIE5vdCBhbGwgc3RlcHMgYXJlIG5lY2Vzc2FyaWx5IHBlcmZvcm1lZCBlYWNoIHRpbWUgYSBUYXNrIGlzIGludm9rZWQgaW4gYSBQcm9jZXNzIChzZWUgVGFzayBEZXNjcmlwdG9yKSwgc28gdGhleSBjYW4gYWxzbyBiZSBleHByZXNzZWQgaW4gdGhlIGZvcm0gb2YgYWx0ZXJuYXRlICdmbG93cycgb2Ygd29yay4gIERpZmZlcmVudCB3YXlzIG9mIGFjaGlldmluZyB0aGUgc2FtZSBkZXZlbG9wbWVudCBnb2FsIGNhbiB0aGVuIGJlICdhc3NlbWJsZWQnIGJ5IHNlbGVjdGluZyBkaWZmZXJlbnQgY29tYmluYXRpb25zIG9mIHN0ZXBzIHdoZW4gYXBwbHlpbmcgdGhlIFRhc2sgaW4gYSBQcm9jZXNzLiAgVHlwaWNhbCBraW5kcyBvZiBzdGVwcyBhIFRhc2sgYXV0aG9yIHNob3VsZCBjb25zaWRlciBhcmU6IFRoaW5raW5nIHN0ZXBzOiB3aGVyZSB0aGUgaW5kaXZpZHVhbCByb2xlcyB1bmRlcnN0YW5kIHRoZSBuYXR1cmUgb2YgdGhlIHRhc2ssIGdhdGhlcnMgYW5kIGV4YW1pbmVzIHRoZSBpbnB1dCBhcnRpZmFjdHMsIGFuZCBmb3JtdWxhdGVzIHRoZSBvdXRjb21lLiBQZXJmb3JtaW5nIHN0ZXBzOiB3aGVyZSB0aGUgaW5kaXZpZHVhbCByb2xlcyBjcmVhdGUgb3IgdXBkYXRlIHNvbWUgYXJ0aWZhY3RzLiBSZXZpZXdpbmcgc3RlcHM6IHdoZXJlIHRoZSBpbmRpdmlkdWFsIHJvbGVzIGluc3BlY3RzIHRoZSByZXN1bHRzIGFnYWluc3Qgc29tZSBjcml0ZXJpYS4KLSAqIAotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRTdGVwKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFN0ZXAgZXh0ZW5kcyBTZWN0aW9uLCBXb3JrRGVmaW5pdGlvbiB7Ci19IC8vIFN0ZXAKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvU3VwcG9ydGluZ01hdGVyaWFsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1N1cHBvcnRpbmdNYXRlcmlhbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NjEyYTNmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvU3VwcG9ydGluZ01hdGVyaWFsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5TdXBwb3J0aW5nIE1hdGVyaWFsPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogU3VwcG9ydGluZyBNYXRlcmlhbHMgaXMgY2F0Y2hhbGwgZm9yIG90aGVyIHR5cGVzIG9mIGd1aWRhbmNlIG5vdCBzcGVjaWZpY2FsbHkgZGVmaW5lZCBlbHNld2hlcmUuIEl0IGNhbiBiZSByZWxhdGVkIHRvIGFsbCBraW5kcyBvZiBDb250ZW50IEVsZW1lbnRzLCBpLmUuIGluY2x1ZGluZyBvdGhlciBndWlkYW5jZSBlbGVtZW50cy4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0U3VwcG9ydGluZ01hdGVyaWFsKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFN1cHBvcnRpbmdNYXRlcmlhbCBleHRlbmRzIEd1aWRhbmNlIHsKLX0gLy8gU3VwcG9ydGluZ01hdGVyaWFsCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1Rhc2suamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvVGFzay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZjNiMzAzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvVGFzay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+VGFzazwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEEgVGFzayBpcyBhIGNvbnRlbnQgZWxlbWVudCB0aGF0IGRlc2NyaWJlcyB3b3JrIGJlaW5nIHBlcmZvcm1lZCBieSBSb2xlcy4gIEl0IGRlZmluZXMgb25lIGRlZmF1bHQgcGVyZm9ybWluZyBSb2xlIGFzIHdlbGwgYXMgbWFueSBhZGRpdGlvbmFsIHBlcmZvcm1lcnMuICBBIFRhc2sgaXMgYXNzb2NpYXRlZCB0byBpbnB1dCBhbmQgb3V0cHV0IHdvcmsgcHJvZHVjdHMuICBJbnB1dHMgYXJlIGRpZmZlcmVudGlhdGVkIGluIG1hbmRhdG9yeSB2ZXJzdXMgb3B0aW9uYWwgaW5wdXRzLiAgVGhlIGFzc29jaWF0aW9ucyB0byBXb3JrIFByb2R1Y3RzIGFyZSBub3QgaW5zdGFudGlhdGFibGUvdmFyaWFibGUtbGlrZSBwYXJhbWV0ZXJzLiAgVGhleSByYXRoZXIgZXhwcmVzcyAoaHlwZXItKWxpbmtzIHRvIHRoZSBkZXNjcmlwdGlvbnMgb2YgdGhlIHdvcmsgcHJvZHVjdHMgdHlwZXMgdGhhdCBhcmUgcmVsYXRlZCB0byB0aGUgVGFzayBhcyBpbnB1dHMgYW5kIG91dHB1dHMuICBJbiBvdGhlciB3b3JkcywgdGhlc2UgYXNzb2NpYXRpb25zIGFyZSBub3QgaW50ZW5kZWQgdG8gYmUgdXNlZCB0byBjYXB0dXJlIHdoaWNoIGNvbmNyZXRlIGluc3RhbmNlcyB3aWxsIGJlIHBhc3NlZCB3aGVuIGluc3RhbnRpYXRpbmcgdGhlIG1ldGhvZCBpbiBhIHByb2plY3QuICBBbGwgb2YgdGhlIFRhc2sncyBkZWZhdWx0IGFzc29jaWF0aW9ucyBjYW4gYmUgb3ZlcnJpZGRlbiBpbiBhbiBhY3R1YWwgcHJvY2VzcyBkZWZpbml0aW9uLgotICogQSBUYXNrIGRlc2NyaWJlcyBhbiBhc3NpZ25hYmxlIHVuaXQgb2Ygd29yay4gIEV2ZXJ5IFRhc2sgaXMgYXNzaWduZWQgdG8gc3BlY2lmaWMgUm9sZXMuICBUaGUgZ3JhbnVsYXJpdHkgb2YgYSBUYXNrIGlzIGdlbmVyYWxseSBhIGZldyBob3VycyB0byBhIGZldyBkYXlzLiAgSXQgdXN1YWxseSBhZmZlY3RzIG9uZSBvciBvbmx5IGEgc21hbGwgbnVtYmVyIG9mIHdvcmsgcHJvZHVjdHMuIEEgVGFzayBpcyB1c2VkIGFzIGFuIGVsZW1lbnQgb2YgZGVmaW5pbmcgYSBwcm9jZXNzLiBUYXNrcyBhcmUgZnVydGhlciB1c2VkIGZvciBwbGFubmluZyBhbmQgdHJhY2tpbmcgcHJvZ3Jlc3M7IHRoZXJlZm9yZSwgaWYgdGhleSBhcmUgZGVmaW5lZCB0b28gZmluZS1ncmFpbmVkLCB0aGV5IHdpbGwgYmUgbmVnbGVjdGVkLCBhbmQgaWYgdGhleSBhcmUgdG9vIGxhcmdlLCBwcm9ncmVzcyB3b3VsZCBoYXZlIHRvIGJlIGV4cHJlc3NlZCBpbiB0ZXJtcyBvZiBhIFRhc2sncyBwYXJ0cyAoZS5nLiBTdGVwcywgd2hpY2ggaXMgbm90IHJlY29tbWVuZGVkKS4gCi0gKiBBIFRhc2sgaGFzIGEgY2xlYXIgcHVycG9zZSBpbiB3aGljaCB0aGUgcGVyZm9ybWluZyByb2xlcyBhY2hpZXZlIGEgd2VsbCBkZWZpbmVkIGdvYWwuICBJdCBwcm92aWRlcyBjb21wbGV0ZSBzdGVwLWJ5LXN0ZXAgZXhwbGFuYXRpb25zIG9mIGRvaW5nIGFsbCB0aGUgd29yayB0aGF0IG5lZWRzIHRvIGJlIGRvbmUgdG8gYWNoaWV2ZSB0aGlzIGdvYWwuICBUaGlzIGRlc2NyaXB0aW9uIGlzIGNvbXBsZXRlLCBpbmRlcGVuZGVudCBvZiB3aGVuIGluIGEgcHJvY2VzcyBsaWZlY3ljbGUgdGhlIHdvcmsgd291bGQgYWN0dWFsbHkgYmUgZG9uZS4gIEl0IHRoZXJlZm9yZSBkb2VzIG5vdCBkZXNjcmliZSB3aGVuIHlvdSBkbyB3aGF0IHdvcmsgYXQgd2hhdCBwb2ludCBvZiB0aW1lLCBidXQgZGVzY3JpYmVzIGFsbCB0aGUgd29yayB0aGF0IGdldHMgZG9uZSB0aHJvdWdob3V0IHRoZSBkZXZlbG9wbWVudCBsaWZlY3ljbGUgdGhhdCBjb250cmlidXRlcyB0byB0aGUgYWNoaWV2ZW1lbnQgb2YgdGhpcyBnb2FsLiAgV2hlbiB0aGUgVGFzayBpcyBiZWluZyBhcHBsaWVkIGluIGEgcHJvY2VzcyB0aGVuIHRoaXMgcHJvY2VzcyBhcHBsaWNhdGlvbiAoZGVmaW5lZCBhcyBUYXNrIERlc2NyaXB0b3IpIHByb3ZpZGVzIHRoZSBpbmZvcm1hdGlvbiBvZiB3aGljaCBwaWVjZXMgb2YgdGhlIFRhc2sgd2lsbCBhY3R1YWxseSBiZSBwZXJmb3JtZWQgYXQgYW55IHBhcnRpY3VsYXIgcG9pbnQgaW4gdGltZS4gVGhpcyBhc3N1bWVzIHRoYXQgdGhlIFRhc2sgd2lsbCBiZSBwZXJmb3JtZWQgaW4gdGhlIHByb2Nlc3Mgb3ZlciBhbmQgb3ZlciBhZ2FpbiwgYnV0IGVhY2ggdGltZSB3aXRoIGEgc2xpZ2h0bHkgZGlmZmVyZW50IGVtcGhhc2lzIG9uIGRpZmZlcmVudCBzdGVwcyBvciBhc3BlY3RzIG9mIHRoZSB0YXNrIGRlc2NyaXB0aW9uLiAKLSAqIEZvciBleGFtcGxlLCBhIFRhc2sgc3VjaCBhcyAiRGV2ZWxvcCBVc2UgQ2FzZSBNb2RlbCIgZGVzY3JpYmVzIGFsbCB0aGUgd29yayB0aGF0IG5lZWRzIHRvIGJlIGRvbmUgdG8gZGV2ZWxvcCBhIGNvbXBsZXRlIHVzZSBjYXNlIG1vZGVsLiBUaGlzIHdvdWxkIGNvbXByaXNlIG9mIHRoZSBpZGVudGlmaWNhdGlvbiBhbmQgbmFtaW5nIG9mIHVzZSBjYXNlcyBhbmQgYWN0b3JzLCB0aGUgd3JpdGluZyBvZiBhIGJyaWVmIGRlc2NyaXB0aW9uLCB0aGUgbW9kZWxpbmcgb2YgdXNlIGNhc2VzIGFuZCB0aGVpciByZWxhdGlvbnNoaXBzIGluIGRpYWdyYW1zLCB0aGUgZGV0YWlsZWQgZGVzY3JpcHRpb24gb2YgYSBiYXNpYyBmbG93LCB0aGUgZGV0YWlsZWQgZGVzY3JpcHRpb24gb2YgYWx0ZXJuYXRpdmVzIGZsb3dzLCBwZXJmb3JtaW5nIG9mIHdhbGt0aHJvdWdocyB3b3Jrc2hvcHMgYW5kIHJldmlld3MsIGV0Yy4gIEFsbCBvZiB0aGVzZSBwYXJ0cyBjb250cmlidXRlIHRvIHRoZSBkZXZlbG9wbWVudCBnb2FsIG9mIGRldmVsb3BpbmcgdGhlIHVzZSBjYXNlIG1vZGVsLCBidXQgdGhlIHBhcnRzIHdpbGwgYmUgcGVyZm9ybWVkIGF0IGRpZmZlcmVudCBwb2ludHMgaW4gdGltZSBpbiBhIHByb2Nlc3MuICBJZGVudGlmaWNhdGlvbiwgbmFtaW5nLCBhbmQgYnJpZWYgZGVzY3JpcHRpb25zIHdvdWxkIGJlIHBlcmZvcm1lZCBlYXJseSBpbiBhIHR5cGljYWwgZGV2ZWxvcG1lbnQgcHJvY2VzcyB2ZXJzdXMgdGhlIHdyaXRpbmcgb2YgZGV0YWlsZWQgYWx0ZXJuYXRpdmUgZmxvd3Mgd2hpY2ggd291bGQgYmUgcGVyZm9ybWVkIG11Y2ggbGF0ZXIuICBBbGwgdGhlc2UgcGFydHMgb3Igc3RlcHMgd2l0aGluIHRoZSBzYW1lIFRhc2sgZGVmaW5lIHRoZSAibWV0aG9kIiBvZiBEZXZlbG9waW5nIGEgVXNlIENhc2UgTW9kZWwuICBBcHBseWluZyBzdWNoIGEgbWV0aG9kIGluIGEgbGlmZWN5Y2xlIChpLmUuIGluIGEgcHJvY2VzcykgaXMgZGVmaW5pbmcgd2hpY2ggc3RlcHMgYXJlIGRvbmUgd2hlbiBnb2luZyBmcm9tIG9uZSBpdGVyYXRpb24gdG8gdGhlIG5leHQuCi0gKiAKLSAqIFRoaXMgaXMgdGhlIEd1aWRhbmNlIFR5cGVzIHBhY2thZ2UncyBleHRlbnNpb24gb2YgVGFzayAoZGVmaW5lZCBpbiBDb250ZW50IEVsZW1lbnRzKSBwcm92aWRpbmcgYWRkaXRpb25hbCBhc3NvY2lhdGlvbnMuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrI2dldFBlcmZvcm1lZEJ5IDxlbT5QZXJmb3JtZWQgQnk8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVGFzayNnZXRNYW5kYXRvcnlJbnB1dCA8ZW0+TWFuZGF0b3J5IElucHV0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2sjZ2V0T3V0cHV0IDxlbT5PdXRwdXQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVGFzayNnZXRBZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSA8ZW0+QWRkaXRpb25hbGx5IFBlcmZvcm1lZCBCeTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrI2dldE9wdGlvbmFsSW5wdXQgPGVtPk9wdGlvbmFsIElucHV0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2sjZ2V0U3RlcHMgPGVtPlN0ZXBzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2sjZ2V0VG9vbE1lbnRvcnMgPGVtPlRvb2wgTWVudG9yczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrI2dldEVzdGltYXRpb25Db25zaWRlcmF0aW9ucyA8ZW0+RXN0aW1hdGlvbiBDb25zaWRlcmF0aW9uczwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFRhc2soKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgVGFzayBleHRlbmRzIENvbnRlbnRFbGVtZW50LCBXb3JrRGVmaW5pdGlvbiB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UGVyZm9ybWVkIEJ5PC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlBlcmZvcm1lZCBCeTwvZW0+JyByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QZXJmb3JtZWQgQnk8L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0VGFza19QZXJmb3JtZWRCeSgpCi0JICogQG1vZGVsIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0PFJvbGU+IGdldFBlcmZvcm1lZEJ5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5NYW5kYXRvcnkgSW5wdXQ8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk1hbmRhdG9yeSBJbnB1dDwvZW0+JyByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1hbmRhdG9yeSBJbnB1dDwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRUYXNrX01hbmRhdG9yeUlucHV0KCkKLQkgKiBAbW9kZWwgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3Q8V29ya1Byb2R1Y3Q+IGdldE1hbmRhdG9yeUlucHV0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5PdXRwdXQ8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk91dHB1dDwvZW0+JyByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk91dHB1dDwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRUYXNrX091dHB1dCgpCi0JICogQG1vZGVsIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0PFdvcmtQcm9kdWN0PiBnZXRPdXRwdXQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkFkZGl0aW9uYWxseSBQZXJmb3JtZWQgQnk8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+QWRkaXRpb25hbGx5IFBlcmZvcm1lZCBCeTwvZW0+JyByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkFkZGl0aW9uYWxseSBQZXJmb3JtZWQgQnk8L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0VGFza19BZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSgpCi0JICogQG1vZGVsIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0PFJvbGU+IGdldEFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5PcHRpb25hbCBJbnB1dDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3R9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+T3B0aW9uYWwgSW5wdXQ8L2VtPicgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5PcHRpb25hbCBJbnB1dDwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRUYXNrX09wdGlvbmFsSW5wdXQoKQotCSAqIEBtb2RlbCBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdDxXb3JrUHJvZHVjdD4gZ2V0T3B0aW9uYWxJbnB1dCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U3RlcHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlN0ZXB9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U3RlcHM8L2VtPicgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TdGVwczwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRUYXNrX1N0ZXBzKCkKLQkgKiBAbW9kZWwgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3Q8U3RlcD4gZ2V0U3RlcHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlRvb2wgTWVudG9yczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVG9vbE1lbnRvcn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Ub29sIE1lbnRvcnM8L2VtPicgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Ub29sIE1lbnRvcnM8L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0VGFza19Ub29sTWVudG9ycygpCi0JICogQG1vZGVsIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0PFRvb2xNZW50b3I+IGdldFRvb2xNZW50b3JzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Fc3RpbWF0aW9uIENvbnNpZGVyYXRpb25zPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnN9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RXN0aW1hdGlvbiBDb25zaWRlcmF0aW9uczwvZW0+JyByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkVzdGltYXRpb24gQ29uc2lkZXJhdGlvbnM8L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0VGFza19Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMoKQotCSAqIEBtb2RlbCBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdDxFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnM+IGdldEVzdGltYXRpb25Db25zaWRlcmF0aW9ucygpOwotCi19IC8vIFRhc2sKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvVGFza0Rlc2NyaXB0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1Rhc2tEZXNjcmlwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOWVlNTVmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvVGFza0Rlc2NyaXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5UYXNrIERlc2NyaXB0aW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0aW9uI2dldFB1cnBvc2UgPGVtPlB1cnBvc2U8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0aW9uI2dldEFsdGVybmF0aXZlcyA8ZW0+QWx0ZXJuYXRpdmVzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0VGFza0Rlc2NyaXB0aW9uKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFRhc2tEZXNjcmlwdGlvbiBleHRlbmRzIENvbnRlbnREZXNjcmlwdGlvbiB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UHVycG9zZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiIiPC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFN1bW1hcml6ZXMgdGhlIG1haW4gcmVhc29uIGZvciBwZXJmb3JtaW5nIHRoaXMgVGFzayBhbmQgd2hhdCBpcyBpbnRlbmRlZCB0byBiZSBhY2hpZXZlZC4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UHVycG9zZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UHVycG9zZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0VGFza0Rlc2NyaXB0aW9uX1B1cnBvc2UoKQotCSAqIEBtb2RlbCBkZWZhdWx0PSIiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLlN0cmluZyIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRQdXJwb3NlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdGlvbiNnZXRQdXJwb3NlIDxlbT5QdXJwb3NlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5QdXJwb3NlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRQdXJwb3NlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRQdXJwb3NlKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BbHRlcm5hdGl2ZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iIjwvY29kZT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBDb21wcmlzZXMgb2Ygc3VtbWFyaWVzIGRlc2NyaWJpbmcgaW1wb3J0YW50IGV4Y2VwdGlvbmFsIGFuZCBub24tc3RhbmRhcmQgd2F5cyBvZiBhY2hpZXZpbmcgdGhpcyBUYXNrJ3MgZGV2ZWxvcG1lbnQgZ29hbHMgdGhhdCB3ZXJlIG5vdCBjb3ZlcmVkIGJ5IHRoZSBUYXNrJ3MgU3RlcHMuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkFsdGVybmF0aXZlczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0QWx0ZXJuYXRpdmVzKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRUYXNrRGVzY3JpcHRpb25fQWx0ZXJuYXRpdmVzKCkKLQkgKiBAbW9kZWwgZGVmYXVsdD0iIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5TdHJpbmciIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0QWx0ZXJuYXRpdmVzKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdGlvbiNnZXRBbHRlcm5hdGl2ZXMgPGVtPkFsdGVybmF0aXZlczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QWx0ZXJuYXRpdmVzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRBbHRlcm5hdGl2ZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEFsdGVybmF0aXZlcyhTdHJpbmcgdmFsdWUpOwotCi19IC8vIFRhc2tEZXNjcmlwdGlvbgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9UYXNrRGVzY3JpcHRvci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9UYXNrRGVzY3JpcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZmNmNzhkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvVGFza0Rlc2NyaXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwMSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlRhc2sgRGVzY3JpcHRvcjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEEgVGFzayBEZXNjcmlwdG9yIGlzIGEgRGVzY3JpcHRvciBhbmQgV29yayBCcmVha2Rvd24gRWxlbWVudCB0aGF0IHJlcHJlc2VudHMgYSBwcm94eSBmb3IgYSBUYXNrIGluIHRoZSBjb250ZXh0IG9mIG9uZSBzcGVjaWZpYyBBY3Rpdml0eS4gIEV2ZXJ5IGJyZWFrZG93biBzdHJ1Y3R1cmUgY2FuIGRlZmluZSBkaWZmZXJlbnQgcmVsYXRpb25zaGlwcyBvZiBUYXNrIERlc2NyaXB0b3JzIHRvIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9ycyBhbmQgUm9sZSBEZXNjcmlwdG9ycy4gVGhlcmVmb3JlIG9uZSBUYXNrIGNhbiBiZSByZXByZXNlbnRlZCBieSBtYW55IFRhc2sgRGVzY3JpcHRvcnMgZWFjaCB3aXRoaW4gdGhlIGNvbnRleHQgb2YgYW4gQWN0aXZpdHkgd2l0aCBpdHMgb3duIHNldCBvZiByZWxhdGlvbnNoaXBzLgotICogQSBrZXkgZGlmZmVyZW5jZSBiZXR3ZWVuIE1ldGhvZCBDb250ZW50IGFuZCBQcm9jZXNzIGlzIHRoYXQgYSBDb250ZW50IEVsZW1lbnQgc3VjaCBhcyBUYXNrIGRlc2NyaWJlcyBhbGwgYXNwZWN0cyBvZiBkb2luZyB3b3JrIGRlZmluZWQgYXJvdW5kIHRoaXMgVGFzay4gIFRoaXMgZGVzY3JpcHRpb24gaXMgbWFuYWdlZCBpbiBzdGVwcywgd2hpY2ggYXJlIG1vZGVsZWQgYXMgU2VjdGlvbnMgb2YgdGhlIFRhc2tzJyBDb250ZW50IERlc2NyaXB0aW9ucy4gIFdoZW4gYXBwbHlpbmcgYSBUYXNrIGluIGEgUHJvY2VzcycgQWN0aXZpdHkgd2l0aCBhIFRhc2sgRGVzY3JpcHRvciBhIFByb2Nlc3MgRW5naW5lZXIgbmVlZHMgdG8gaW5kaWNhdGUgdGhhdCBhdCB0aGF0IHBhcnRpY3VsYXIgcG9pbnQgaW4gdGltZSBpbiB0aGUgUHJvY2VzcyBkZWZpbml0aW9uIGZvciB3aGljaCB0aGUgVGFzayBEZXNjcmlwdG9yIGhhcyBiZWVuIGNyZWF0ZWQsIG9ubHkgYSBzdWJzZXQgb2Ygc3RlcHMgc2hhbGwgYmUgcGVyZm9ybWVkLiAgSGUgZGVmaW5lcyB0aGlzIHNlbGVjdGlvbiB1c2luZyB0aGUgc2VsZWN0ZWRTdGVwcyBhc3NvY2lhdGlvbi4gIElmIGhlIHdhbnRzIHRvIGFkZCBzdGVwcyB0byBhIFRhc2sgRGVzY3JpcHRvciwgaGUgY2FuIGRlc2NyaWJlIHRoZXNlIGVpdGhlciBwcmFnbWF0aWNhbGx5IGluIHRoZSByZWZpbmVkRGVzY3JpcHRpb24gYXR0cmlidXRlIG9yICdwcm9wZXJseScgY3JlYXRlIGEgY29udHJpYnV0aW5nIFRhc2sgdG8gdGhlIFRhc2sgdGhlIFRhc2sgRGVzY3JpcHRvciByZWZlcnMgdG8uCi0gKiAKLSAqIAotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0b3IjZ2V0VGFzayA8ZW0+VGFzazwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRvciNnZXRBZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSA8ZW0+QWRkaXRpb25hbGx5IFBlcmZvcm1lZCBCeTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRvciNnZXRBc3Npc3RlZEJ5IDxlbT5Bc3Npc3RlZCBCeTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRvciNnZXRFeHRlcm5hbElucHV0IDxlbT5FeHRlcm5hbCBJbnB1dDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRvciNnZXRNYW5kYXRvcnlJbnB1dCA8ZW0+TWFuZGF0b3J5IElucHV0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdG9yI2dldE9wdGlvbmFsSW5wdXQgPGVtPk9wdGlvbmFsIElucHV0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdG9yI2dldE91dHB1dCA8ZW0+T3V0cHV0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdG9yI2dldFBlcmZvcm1lZFByaW1hcmlseUJ5IDxlbT5QZXJmb3JtZWQgUHJpbWFyaWx5IEJ5PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdG9yI2dldFNlbGVjdGVkU3RlcHMgPGVtPlNlbGVjdGVkIFN0ZXBzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0VGFza0Rlc2NyaXB0b3IoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgVGFza0Rlc2NyaXB0b3IgZXh0ZW5kcyBXb3JrQnJlYWtkb3duRWxlbWVudCwgRGVzY3JpcHRvciB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VGFzazwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VGFzazwvZW0+JyByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5UYXNrPC9lbT4nIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRUYXNrKFRhc2spCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0VGFza0Rlc2NyaXB0b3JfVGFzaygpCi0JICogQG1vZGVsIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlUYXNrIGdldFRhc2soKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0b3IjZ2V0VGFzayA8ZW0+VGFzazwvZW0+fScgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VGFzazwvZW0+JyByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0VGFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VGFzayhUYXNrIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkFkZGl0aW9uYWxseSBQZXJmb3JtZWQgQnk8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdG9yfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkFkZGl0aW9uYWxseSBQZXJmb3JtZWQgQnk8L2VtPicgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BZGRpdGlvbmFsbHkgUGVyZm9ybWVkIEJ5PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFRhc2tEZXNjcmlwdG9yX0FkZGl0aW9uYWxseVBlcmZvcm1lZEJ5KCkKLQkgKiBAbW9kZWwgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3Q8Um9sZURlc2NyaXB0b3I+IGdldEFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Bc3Npc3RlZCBCeTwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZURlc2NyaXB0b3J9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+QXNzaXN0ZWQgQnk8L2VtPicgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Bc3Npc3RlZCBCeTwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRUYXNrRGVzY3JpcHRvcl9Bc3Npc3RlZEJ5KCkKLQkgKiBAbW9kZWwgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3Q8Um9sZURlc2NyaXB0b3I+IGdldEFzc2lzdGVkQnkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkV4dGVybmFsIElucHV0PC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3J9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RXh0ZXJuYWwgSW5wdXQ8L2VtPicgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FeHRlcm5hbCBJbnB1dDwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRUYXNrRGVzY3JpcHRvcl9FeHRlcm5hbElucHV0KCkKLQkgKiBAbW9kZWwgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3Q8V29ya1Byb2R1Y3REZXNjcmlwdG9yPiBnZXRFeHRlcm5hbElucHV0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5NYW5kYXRvcnkgSW5wdXQ8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvcn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5NYW5kYXRvcnkgSW5wdXQ8L2VtPicgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NYW5kYXRvcnkgSW5wdXQ8L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0VGFza0Rlc2NyaXB0b3JfTWFuZGF0b3J5SW5wdXQoKQotCSAqIEBtb2RlbCBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdDxXb3JrUHJvZHVjdERlc2NyaXB0b3I+IGdldE1hbmRhdG9yeUlucHV0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5PcHRpb25hbCBJbnB1dDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk9wdGlvbmFsIElucHV0PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+T3B0aW9uYWwgSW5wdXQ8L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0VGFza0Rlc2NyaXB0b3JfT3B0aW9uYWxJbnB1dCgpCi0JICogQG1vZGVsIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0PFdvcmtQcm9kdWN0RGVzY3JpcHRvcj4gZ2V0T3B0aW9uYWxJbnB1dCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+T3V0cHV0PC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3J9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+T3V0cHV0PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+T3V0cHV0PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFRhc2tEZXNjcmlwdG9yX091dHB1dCgpCi0JICogQG1vZGVsIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0PFdvcmtQcm9kdWN0RGVzY3JpcHRvcj4gZ2V0T3V0cHV0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QZXJmb3JtZWQgUHJpbWFyaWx5IEJ5PC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRvcn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5QZXJmb3JtZWQgUHJpbWFyaWx5IEJ5PC9lbT4nIHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlBlcmZvcm1lZCBQcmltYXJpbHkgQnk8L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0VGFza0Rlc2NyaXB0b3JfUGVyZm9ybWVkUHJpbWFyaWx5QnkoKQotCSAqIEBtb2RlbCBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdDxSb2xlRGVzY3JpcHRvcj4gZ2V0UGVyZm9ybWVkUHJpbWFyaWx5QnkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlNlbGVjdGVkIFN0ZXBzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5TZWN0aW9ufS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlNlbGVjdGVkIFN0ZXBzPC9lbT4nIHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U2VsZWN0ZWQgU3RlcHM8L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0VGFza0Rlc2NyaXB0b3JfU2VsZWN0ZWRTdGVwcygpCi0JICogQG1vZGVsIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0PFNlY3Rpb24+IGdldFNlbGVjdGVkU3RlcHMoKTsKLQotfSAvLyBUYXNrRGVzY3JpcHRvcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9UZWFtUHJvZmlsZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9UZWFtUHJvZmlsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNDU2N2ViLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvVGVhbVByb2ZpbGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlRlYW0gUHJvZmlsZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEEgVGVhbSBQcm9maWxlIGlzIGEgQnJlYWtkb3duIEVsZW1lbnQgdGhhdCBncm91cHMgUm9sZSBEZXNjcmlwdG9ycyBvciBSZXNvdXJjZSBEZWZpbml0aW9ucyBkZWZpbmluZyBhIG5lc3RlZCBoaWVyYXJjaHkgb2YgdGVhbXMgYW5kIHRlYW0gbWVtYmVycy4KLSAqIFdvcmsgYXNzaWdubWVudHMgYW5kIFdvcmsgUHJvZHVjdCByZXNwb25zaWJpbGl0aWVzIGNhbiBiZSBkaWZmZXJlbnQgZnJvbSBBY3Rpdml0eSB0byBBY3Rpdml0eSBpbiBhIGRldmVsb3BtZW50IHByb2plY3QuIERpZmZlcmVudCBwaGFzZXMgcmVxdWlyZSBkaWZmZXJlbnQgc3RhZmZpbmcgcHJvZmlsZXMsIGkuZS4gZGlmZmVyZW50IHNraWxscyBhbmQgcmVzb3VyY2VzIGRvaW5nIGRpZmZlcmVudCB0eXBlcyBvZiB3b3JrLiAgVGhlcmVmb3JlLCBhIHByb2Nlc3MgbmVlZHMgdG8gZGVmaW5lIHN1Y2ggZGlmZmVyZW50IHByb2ZpbGVzIGluIGEgZmxleGlibGUgbWFubmVyLiAgV2hlcmVhcyBDb3JlIE1ldGhvZCBDb250ZW50IGRlZmluZXMgc3RhbmRhcmQgcmVzcG9uc2liaWxpdGllcyBhbmQgYXNzaWdubWVudHMsIGEgcHJvY2VzcyBleHByZXNzIGJ5IGEgYnJlYWtkb3duIHN0cnVjdHVyZXMgbmVlZHMgdG8gYmUgYWJsZSByZWZpbmUgYW5kIHJlZGVmaW5lIHRoZXNlIHRocm91Z2hvdXQgaXRzIGRlZmluaXRpb24uICBSb2xlIERlc2NyaXB0b3JzLCBSZXNvdXJjZSBEZWZpbml0aW9ucywgYXMgd2VsbCBhcyBUZWFtIFByb2ZpbGVzIHByb3ZpZGUgdGhlIGRhdGEgc3RydWN0dXJlIG5lY2Vzc2FyeSB0byBhY2hpZXZlIHRoaXMgZmxleGliaWxpdHkgYW5kIHRvIHByb3ZpZGUgYSBwcm9jZXNzIHVzZXIgd2l0aCB0aGUgY2FwYWJpbGl0eSB0byBkZWZpbmUgZGlmZmVyZW50IHRlYW1zIGFuZCByb2xlIHJlbGF0aW9uc2hpcHMgZm9yIGV2ZXJ5IEFjdGl2aXR5IChpbmNsdWRpbmcgQWN0aXZpdGllcyBvbiBhbnkgbmVzdGluZy1sZXZlbCBhcyB3ZWxsIGFzIEl0ZXJhdGlvbnMgb3IgUGhhc2VzKS4KLSAqIEhlbmNlLCBpbiBhZGRpdGlvbiB0byB0aGUgd29yayBicmVha2Rvd24gYW5kIHdvcmsgcHJvZHVjdCBicmVha2Rvd24gc3RydWN0dXJlcyBkZWZpbmVkIHNvIGZhciwgVGVhbSBQcm9maWxlcyBhcmUgdXNlZCB0byBkZWZpbmUgYSB0aGlyZCB0eXBlIG9mIGJyZWFrZG93biBzdHJ1Y3R1cmU6IHRlYW0gYnJlYWtkb3duIHN0cnVjdHVyZXMuICBUaGVzZSBhcmUgY3JlYXRlZCBhcyBhbiBBY3Rpdml0eSBzcGVjaWZpYyBoaWVyYXJjaHkgb2YgVGVhbSBQcm9maWxlcyBjb21wcmlzaW5nIG9mIFJvbGUgRGVzY3JpcHRvcnMgYW5kIFJlc291cmNlIERlZmluaXRpb25zLiAgVGhlc2Ugc3RydWN0dXJlcyBjYW4gYmUgcHJlc2VudGVkIGFzIHdlbGwta25vd24gT3JnLUNoYXJ0cy4gIEp1c3QgYXMgd2l0aCBhbnkgb3RoZXIgQnJlYWtkb3duIEVsZW1lbnQgYW5kIERlc2NyaXB0b3JzLCBUZWFtIFByb2ZpbGVzIGNhbiBiZSBkZWZpbmVkIHdpdGhpbiB0aGUgc2NvcGUgb2YgYW55IEFjdGl2aXR5IGluIGEgYnJlYWtkb3duIHN0cnVjdHVyZS4gIEluIG90aGVyIHdvcmRzIGV2ZXJ5IEFjdGl2aXR5IGNhbiBkZWZpbmUgaXRzIG93biBUZWFtIFByb2ZpbGVzIGNvbnNpc3Rpbmcgb2YgQWN0aXZpdHkgc3BlY2lmaWMgUm9sZSBEZXNjcmlwdG9ycyBhbmQgUmVzb3VyY2UgRGVmaW5pdGlvbnMuICBUeXBpY2FsbHksIFRlYW0gUHJvZmlsZXMgYXJlIGRlZmluZWQgb24gdGhlIGxldmVsIG9mIEl0ZXJhdGlvbnMgb3IgUGhhc2VzIG9yIG90aGVyIGhpZ2hlci1sZXZlbCBBY3Rpdml0eS4KLSAqIAotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVGVhbVByb2ZpbGUjZ2V0VGVhbVJvbGVzIDxlbT5UZWFtIFJvbGVzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlRlYW1Qcm9maWxlI2dldFN1cGVyVGVhbSA8ZW0+U3VwZXIgVGVhbTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZWFtUHJvZmlsZSNnZXRTdWJUZWFtIDxlbT5TdWIgVGVhbTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFRlYW1Qcm9maWxlKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFRlYW1Qcm9maWxlIGV4dGVuZHMgQnJlYWtkb3duRWxlbWVudCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VGVhbSBSb2xlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZURlc2NyaXB0b3J9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VGVhbSBSb2xlczwvZW0+JyByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlRlYW0gUm9sZXM8L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0VGVhbVByb2ZpbGVfVGVhbVJvbGVzKCkKLQkgKiBAbW9kZWwgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3Q8Um9sZURlc2NyaXB0b3I+IGdldFRlYW1Sb2xlcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U3VwZXIgVGVhbTwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIEl0IGlzIGJpZGlyZWN0aW9uYWwgYW5kIGl0cyBvcHBvc2l0ZSBpcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVGVhbVByb2ZpbGUjZ2V0U3ViVGVhbSA8ZW0+U3ViIFRlYW08L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U3VwZXIgVGVhbTwvZW0+JyByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TdXBlciBUZWFtPC9lbT4nIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRTdXBlclRlYW0oVGVhbVByb2ZpbGUpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0VGVhbVByb2ZpbGVfU3VwZXJUZWFtKCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVGVhbVByb2ZpbGUjZ2V0U3ViVGVhbQotCSAqIEBtb2RlbCBvcHBvc2l0ZT0ic3ViVGVhbSIgcmVxdWlyZWQ9InRydWUiIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlUZWFtUHJvZmlsZSBnZXRTdXBlclRlYW0oKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVGVhbVByb2ZpbGUjZ2V0U3VwZXJUZWFtIDxlbT5TdXBlciBUZWFtPC9lbT59JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TdXBlciBUZWFtPC9lbT4nIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRTdXBlclRlYW0oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFN1cGVyVGVhbShUZWFtUHJvZmlsZSB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TdWIgVGVhbTwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVGVhbVByb2ZpbGV9LgotCSAqIEl0IGlzIGJpZGlyZWN0aW9uYWwgYW5kIGl0cyBvcHBvc2l0ZSBpcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVGVhbVByb2ZpbGUjZ2V0U3VwZXJUZWFtIDxlbT5TdXBlciBUZWFtPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlN1YiBUZWFtPC9lbT4nIHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U3ViIFRlYW08L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0VGVhbVByb2ZpbGVfU3ViVGVhbSgpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlRlYW1Qcm9maWxlI2dldFN1cGVyVGVhbQotCSAqIEBtb2RlbCBvcHBvc2l0ZT0ic3VwZXJUZWFtIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdDxUZWFtUHJvZmlsZT4gZ2V0U3ViVGVhbSgpOwotCi19IC8vIFRlYW1Qcm9maWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1RlbXBsYXRlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1RlbXBsYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwYWRjNDkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9UZW1wbGF0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+VGVtcGxhdGU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIFRlbXBsYXRlIGlzIGEgc3BlY2lmaWMgdHlwZSBvZiBndWlkYW5jZSB0aGF0IHByb3ZpZGVzIGZvciBhIHdvcmsgcHJvZHVjdCBhIHByZS1kZWZpbmVkIHRhYmxlIG9mIGNvbnRlbnRzLCBzZWN0aW9ucywgcGFja2FnZXMsIGFuZC9vciBoZWFkaW5ncywgYSBzdGFuZGFyZGl6ZWQgZm9ybWF0LCBhcyB3ZWxsIGFzIGRlc2NyaXB0aW9ucyBob3cgdGhlIHNlY3Rpb25zIGFuZCBwYWNrYWdlcyBhcmUgc3VwcG9zZWQgdG8gYmUgdXNlZCBhbmQgY29tcGxldGVkLiBUZW1wbGF0ZXMgY2Fubm90IG9ubHkgYmUgcHJvdmlkZWQgZm9yIGRvY3VtZW50cywgYnV0IGFsc28gZm9yIGNvbmNlcHR1YWwgbW9kZWxzIG9yIHBoeXNpY2FsIGRhdGEgc3RvcmVzLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRUZW1wbGF0ZSgpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBUZW1wbGF0ZSBleHRlbmRzIEd1aWRhbmNlIHsKLX0gLy8gVGVtcGxhdGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvVGVybURlZmluaXRpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvVGVybURlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzczZWRjYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1Rlcm1EZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5UZXJtIERlZmluaXRpb248L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBUZXJtRGVmaW5pdGlvbnMgZGVmaW5lIGNvbmNlcHRzIGFuZCBhcmUgdXNlZCB0byBidWlsZCB1cCB0aGUgR2xvc3NhcnkuIFRoZXkgYXJlIG5vdCBkaXJlY3RseSByZWxhdGVkIHRvIENvbnRlbnRFbGVtZW50cywgYnV0IHRoZWlyIHJlbGF0aW9uc2hpcCBpcyBiZWluZyBkZXJpdmVkIHdoZW4gdGhlIFRlcm0gaXMgdXNlZCBpbiB0aGUgQ29udGVudEVsZW1lbnRzIGRlc2NyaXB0aW9uIHRleHQuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFRlcm1EZWZpbml0aW9uKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFRlcm1EZWZpbml0aW9uIGV4dGVuZHMgR3VpZGFuY2UgewotfSAvLyBUZXJtRGVmaW5pdGlvbgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9UZXh0RWxlbWVudC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9UZXh0RWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkM2UxMTE4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvVGV4dEVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWE7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlRleHQgRWxlbWVudDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlRleHRFbGVtZW50I2dldFRleHQgPGVtPlRleHQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRUZXh0RWxlbWVudCgpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBUZXh0RWxlbWVudCBleHRlbmRzIExlYWZFbGVtZW50IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5UZXh0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+IiI8L2NvZGU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VGV4dDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5UZXh0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRUZXh0KFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRUZXh0RWxlbWVudF9UZXh0KCkKLQkgKiBAbW9kZWwgZGVmYXVsdD0iIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5TdHJpbmciIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0VGV4dCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZXh0RWxlbWVudCNnZXRUZXh0IDxlbT5UZXh0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5UZXh0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRUZXh0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRUZXh0KFN0cmluZyB2YWx1ZSk7Ci0KLX0gLy8gVGV4dEVsZW1lbnQKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvVG9vbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9Ub29sLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwYTRkNDIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9Ub29sLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlRvb2w8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIFRvb2wgaXMgYSBjb250YWluZXIvYWdncmVnYXRlIGZvciBUb29sTWVudG9ycy4gIEl0IGNhbiBhbHNvIHByb3ZpZGUgZ2VuZXJhbCBkZXNjcmlwdGlvbnMgb2YgdGhlIHRvb2wgYW5kIGl0cyBnZW5lcmFsIGNhcGFiaWxpdGllcy4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlRvb2wjZ2V0VG9vbE1lbnRvcnMgPGVtPlRvb2wgTWVudG9yczwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFRvb2woKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgVG9vbCBleHRlbmRzIENvbnRlbnRDYXRlZ29yeSB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VG9vbCBNZW50b3JzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Ub29sTWVudG9yfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlRvb2wgTWVudG9yczwvZW0+JyByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlRvb2wgTWVudG9yczwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRUb29sX1Rvb2xNZW50b3JzKCkKLQkgKiBAbW9kZWwgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3Q8VG9vbE1lbnRvcj4gZ2V0VG9vbE1lbnRvcnMoKTsKLQotfSAvLyBUb29sCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1Rvb2xNZW50b3IuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvVG9vbE1lbnRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZjZlOTU5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvVG9vbE1lbnRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+VG9vbCBNZW50b3I8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIFRvb2wgTWVudG9yIGlzIGEgc3BlY2lmaWMgdHlwZSBvZiBndWlkYW5jZSB0aGF0IHNob3dzIGhvdyB0byB1c2UgYSBzcGVjaWZpYyB0b29sIHRvIGFjY29tcGxpc2ggc29tZSBwaWVjZSBvZiB3b3JrIGEgV29yayBQcm9kdWN0IGVpdGhlciBpbiB0aGUgY29udGV4dCBvZiBvciBpbmRlcGVuZGVudCBmcm9tIGEgVGFzayBvciBBY3Rpdml0eS4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0VG9vbE1lbnRvcigpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBUb29sTWVudG9yIGV4dGVuZHMgR3VpZGFuY2UgewotfSAvLyBUb29sTWVudG9yCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1R5cGUuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYTNjZWFjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+VHlwZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIFVNTCAyLjAgbWV0YS1jbGFzcyBUeXBlLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRUeXBlKCkKLSAqIEBtb2RlbCBhYnN0cmFjdD0idHJ1ZSIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBUeXBlIGV4dGVuZHMgUGFja2FnZWFibGVFbGVtZW50IHsKLX0gLy8gVHlwZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9VTUFTZW1hbnRpY01vZGVsQnJpZGdlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1VNQVNlbWFudGljTW9kZWxCcmlkZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODk1MDAwOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1VNQVNlbWFudGljTW9kZWxCcmlkZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWE7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlVNQSBTZW1hbnRpYyBNb2RlbCBCcmlkZ2U8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5VTUFTZW1hbnRpY01vZGVsQnJpZGdlI2dldEVsZW1lbnQgPGVtPkVsZW1lbnQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRVTUFTZW1hbnRpY01vZGVsQnJpZGdlKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgZXh0ZW5kcyBTZW1hbnRpY01vZGVsQnJpZGdlIHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FbGVtZW50PC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5FbGVtZW50PC9lbT4nIHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkVsZW1lbnQ8L2VtPicgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldEVsZW1lbnQoTWV0aG9kRWxlbWVudCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRVTUFTZW1hbnRpY01vZGVsQnJpZGdlX0VsZW1lbnQoKQotCSAqIEBtb2RlbCByZXF1aXJlZD0idHJ1ZSIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU1ldGhvZEVsZW1lbnQgZ2V0RWxlbWVudCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5VTUFTZW1hbnRpY01vZGVsQnJpZGdlI2dldEVsZW1lbnQgPGVtPkVsZW1lbnQ8L2VtPn0nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkVsZW1lbnQ8L2VtPicgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldEVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEVsZW1lbnQoTWV0aG9kRWxlbWVudCB2YWx1ZSk7Ci0KLX0gLy8gVU1BU2VtYW50aWNNb2RlbEJyaWRnZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9VbWFGYWN0b3J5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1VtYUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTNlM2EyOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1VtYUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzMyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVGYWN0b3J5OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBUaGUgPGI+RmFjdG9yeTwvYj4gZm9yIHRoZSBtb2RlbC4KLSAqIEl0IHByb3ZpZGVzIGEgY3JlYXRlIG1ldGhvZCBmb3IgZWFjaCBub24tYWJzdHJhY3QgY2xhc3Mgb2YgdGhlIG1vZGVsLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZQotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFVtYUZhY3RvcnkgZXh0ZW5kcyBFRmFjdG9yeSB7Ci0JLyoqCi0JICogVGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgZmFjdG9yeS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlVbWFGYWN0b3J5IGVJTlNUQU5DRSA9IG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFGYWN0b3J5SW1wbC5pbml0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlBhY2thZ2U8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlBhY2thZ2U8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCW9yZy5lY2xpcHNlLmVwZi51bWEuUGFja2FnZSBjcmVhdGVQYWNrYWdlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkNvbnN0cmFpbnQ8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkNvbnN0cmFpbnQ8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUNvbnN0cmFpbnQgY3JlYXRlQ29uc3RyYWludCgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU1ldGhvZEVsZW1lbnRQcm9wZXJ0eSBjcmVhdGVNZXRob2RFbGVtZW50UHJvcGVydHkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+S2luZDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+S2luZDwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JS2luZCBjcmVhdGVLaW5kKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkNvbnRlbnQgRGVzY3JpcHRpb248L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkNvbnRlbnQgRGVzY3JpcHRpb248L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUNvbnRlbnREZXNjcmlwdGlvbiBjcmVhdGVDb250ZW50RGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+U2VjdGlvbjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+U2VjdGlvbjwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU2VjdGlvbiBjcmVhdGVTZWN0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlJvbGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlJvbGU8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVJvbGUgY3JlYXRlUm9sZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5UYXNrPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5UYXNrPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlUYXNrIGNyZWF0ZVRhc2soKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+U3RlcDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+U3RlcDwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RlcCBjcmVhdGVTdGVwKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkFydGlmYWN0PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5BcnRpZmFjdDwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQXJ0aWZhY3QgY3JlYXRlQXJ0aWZhY3QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+V29yayBQcm9kdWN0PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Xb3JrIFByb2R1Y3Q8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVdvcmtQcm9kdWN0IGNyZWF0ZVdvcmtQcm9kdWN0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkZ1bGZpbGxhYmxlIEVsZW1lbnQ8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkZ1bGZpbGxhYmxlIEVsZW1lbnQ8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUZ1bGZpbGxhYmxlRWxlbWVudCBjcmVhdGVGdWxmaWxsYWJsZUVsZW1lbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RGVsaXZlcmFibGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkRlbGl2ZXJhYmxlPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlEZWxpdmVyYWJsZSBjcmVhdGVEZWxpdmVyYWJsZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5PdXRjb21lPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5PdXRjb21lPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlPdXRjb21lIGNyZWF0ZU91dGNvbWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+Q29udGVudCBQYWNrYWdlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Db250ZW50IFBhY2thZ2U8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUNvbnRlbnRQYWNrYWdlIGNyZWF0ZUNvbnRlbnRQYWNrYWdlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkFydGlmYWN0IERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5BcnRpZmFjdCBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQXJ0aWZhY3REZXNjcmlwdGlvbiBjcmVhdGVBcnRpZmFjdERlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPldvcmsgUHJvZHVjdCBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+V29yayBQcm9kdWN0IERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlXb3JrUHJvZHVjdERlc2NyaXB0aW9uIGNyZWF0ZVdvcmtQcm9kdWN0RGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RGVsaXZlcmFibGUgRGVzY3JpcHRpb248L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkRlbGl2ZXJhYmxlIERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlEZWxpdmVyYWJsZURlc2NyaXB0aW9uIGNyZWF0ZURlbGl2ZXJhYmxlRGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+Um9sZSBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+Um9sZSBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUm9sZURlc2NyaXB0aW9uIGNyZWF0ZVJvbGVEZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5UYXNrIERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5UYXNrIERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlUYXNrRGVzY3JpcHRpb24gY3JlYXRlVGFza0Rlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkd1aWRhbmNlIERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5HdWlkYW5jZSBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JR3VpZGFuY2VEZXNjcmlwdGlvbiBjcmVhdGVHdWlkYW5jZURlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlByYWN0aWNlIERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5QcmFjdGljZSBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUHJhY3RpY2VEZXNjcmlwdGlvbiBjcmVhdGVQcmFjdGljZURlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkFjdGl2aXR5PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5BY3Rpdml0eTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQWN0aXZpdHkgY3JlYXRlQWN0aXZpdHkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+TWlsZXN0b25lPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5NaWxlc3RvbmU8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU1pbGVzdG9uZSBjcmVhdGVNaWxlc3RvbmUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+SXRlcmF0aW9uPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5JdGVyYXRpb248L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUl0ZXJhdGlvbiBjcmVhdGVJdGVyYXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UGhhc2U8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlBoYXNlPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlQaGFzZSBjcmVhdGVQaGFzZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5UZWFtIFByb2ZpbGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlRlYW0gUHJvZmlsZTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JVGVhbVByb2ZpbGUgY3JlYXRlVGVhbVByb2ZpbGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+Um9sZSBEZXNjcmlwdG9yPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Sb2xlIERlc2NyaXB0b3I8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVJvbGVEZXNjcmlwdG9yIGNyZWF0ZVJvbGVEZXNjcmlwdG9yKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPldvcmsgT3JkZXI8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPldvcmsgT3JkZXI8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVdvcmtPcmRlciBjcmVhdGVXb3JrT3JkZXIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UGxhbm5pbmcgRGF0YTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UGxhbm5pbmcgRGF0YTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUGxhbm5pbmdEYXRhIGNyZWF0ZVBsYW5uaW5nRGF0YSgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5UYXNrIERlc2NyaXB0b3I8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlRhc2sgRGVzY3JpcHRvcjwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JVGFza0Rlc2NyaXB0b3IgY3JlYXRlVGFza0Rlc2NyaXB0b3IoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+V29yayBQcm9kdWN0IERlc2NyaXB0b3I8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPldvcmsgUHJvZHVjdCBEZXNjcmlwdG9yPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlXb3JrUHJvZHVjdERlc2NyaXB0b3IgY3JlYXRlV29ya1Byb2R1Y3REZXNjcmlwdG9yKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkNvbXBvc2l0ZSBSb2xlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Db21wb3NpdGUgUm9sZTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQ29tcG9zaXRlUm9sZSBjcmVhdGVDb21wb3NpdGVSb2xlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkJyZWFrZG93biBFbGVtZW50IERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5CcmVha2Rvd24gRWxlbWVudCBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uIGNyZWF0ZUJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5BY3Rpdml0eSBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+QWN0aXZpdHkgRGVzY3JpcHRpb248L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUFjdGl2aXR5RGVzY3JpcHRpb24gY3JlYXRlQWN0aXZpdHlEZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5EZWxpdmVyeSBQcm9jZXNzIERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5EZWxpdmVyeSBQcm9jZXNzIERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlEZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbiBjcmVhdGVEZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Qcm9jZXNzIERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Qcm9jZXNzIERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlQcm9jZXNzRGVzY3JpcHRpb24gY3JlYXRlUHJvY2Vzc0Rlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkRlc2NyaXB0b3IgRGVzY3JpcHRpb248L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkRlc2NyaXB0b3IgRGVzY3JpcHRpb248L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCURlc2NyaXB0b3JEZXNjcmlwdGlvbiBjcmVhdGVEZXNjcmlwdG9yRGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+Q29uY2VwdDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+Q29uY2VwdDwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQ29uY2VwdCBjcmVhdGVDb25jZXB0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkNoZWNrbGlzdDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+Q2hlY2tsaXN0PC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlDaGVja2xpc3QgY3JlYXRlQ2hlY2tsaXN0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkV4YW1wbGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkV4YW1wbGU8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUV4YW1wbGUgY3JlYXRlRXhhbXBsZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5HdWlkZWxpbmU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkd1aWRlbGluZTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JR3VpZGVsaW5lIGNyZWF0ZUd1aWRlbGluZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Fc3RpbWF0aW9uIENvbnNpZGVyYXRpb25zPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Fc3RpbWF0aW9uIENvbnNpZGVyYXRpb25zPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMgY3JlYXRlRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlJlcG9ydDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UmVwb3J0PC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlSZXBvcnQgY3JlYXRlUmVwb3J0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlRlbXBsYXRlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5UZW1wbGF0ZTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JVGVtcGxhdGUgY3JlYXRlVGVtcGxhdGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+U3VwcG9ydGluZyBNYXRlcmlhbDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+U3VwcG9ydGluZyBNYXRlcmlhbDwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3VwcG9ydGluZ01hdGVyaWFsIGNyZWF0ZVN1cHBvcnRpbmdNYXRlcmlhbCgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Ub29sIE1lbnRvcjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+VG9vbCBNZW50b3I8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVRvb2xNZW50b3IgY3JlYXRlVG9vbE1lbnRvcigpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5XaGl0ZXBhcGVyPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5XaGl0ZXBhcGVyPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlXaGl0ZXBhcGVyIGNyZWF0ZVdoaXRlcGFwZXIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+VGVybSBEZWZpbml0aW9uPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5UZXJtIERlZmluaXRpb248L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVRlcm1EZWZpbml0aW9uIGNyZWF0ZVRlcm1EZWZpbml0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkFwcGxpY2FibGUgTWV0YSBDbGFzcyBJbmZvPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5BcHBsaWNhYmxlIE1ldGEgQ2xhc3MgSW5mbzwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQXBwbGljYWJsZU1ldGFDbGFzc0luZm8gY3JlYXRlQXBwbGljYWJsZU1ldGFDbGFzc0luZm8oKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UHJhY3RpY2U8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlByYWN0aWNlPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlQcmFjdGljZSBjcmVhdGVQcmFjdGljZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5SZXVzYWJsZSBBc3NldDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UmV1c2FibGUgQXNzZXQ8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVJldXNhYmxlQXNzZXQgY3JlYXRlUmV1c2FibGVBc3NldCgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5EaXNjaXBsaW5lPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5EaXNjaXBsaW5lPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlEaXNjaXBsaW5lIGNyZWF0ZURpc2NpcGxpbmUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+Um9sZSBTZXQ8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlJvbGUgU2V0PC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlSb2xlU2V0IGNyZWF0ZVJvbGVTZXQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RG9tYWluPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Eb21haW48L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCURvbWFpbiBjcmVhdGVEb21haW4oKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+V29yayBQcm9kdWN0IFR5cGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPldvcmsgUHJvZHVjdCBUeXBlPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlXb3JrUHJvZHVjdFR5cGUgY3JlYXRlV29ya1Byb2R1Y3RUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkRpc2NpcGxpbmUgR3JvdXBpbmc8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkRpc2NpcGxpbmUgR3JvdXBpbmc8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCURpc2NpcGxpbmVHcm91cGluZyBjcmVhdGVEaXNjaXBsaW5lR3JvdXBpbmcoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+VG9vbDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+VG9vbDwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JVG9vbCBjcmVhdGVUb29sKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlJvbGUgU2V0IEdyb3VwaW5nPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Sb2xlIFNldCBHcm91cGluZzwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUm9sZVNldEdyb3VwaW5nIGNyZWF0ZVJvbGVTZXRHcm91cGluZygpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5DdXN0b20gQ2F0ZWdvcnk8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkN1c3RvbSBDYXRlZ29yeTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQ3VzdG9tQ2F0ZWdvcnkgY3JlYXRlQ3VzdG9tQ2F0ZWdvcnkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RGVsaXZlcnkgUHJvY2VzczwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RGVsaXZlcnkgUHJvY2VzczwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRGVsaXZlcnlQcm9jZXNzIGNyZWF0ZURlbGl2ZXJ5UHJvY2VzcygpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5DYXBhYmlsaXR5IFBhdHRlcm48L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkNhcGFiaWxpdHkgUGF0dGVybjwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQ2FwYWJpbGl0eVBhdHRlcm4gY3JlYXRlQ2FwYWJpbGl0eVBhdHRlcm4oKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UHJvY2VzcyBQbGFubmluZyBUZW1wbGF0ZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UHJvY2VzcyBQbGFubmluZyBUZW1wbGF0ZTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUgY3JlYXRlUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+Um9hZG1hcDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+Um9hZG1hcDwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUm9hZG1hcCBjcmVhdGVSb2FkbWFwKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlByb2Nlc3MgQ29tcG9uZW50PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Qcm9jZXNzIENvbXBvbmVudDwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUHJvY2Vzc0NvbXBvbmVudCBjcmVhdGVQcm9jZXNzQ29tcG9uZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlByb2Nlc3MgUGFja2FnZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UHJvY2VzcyBQYWNrYWdlPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlQcm9jZXNzUGFja2FnZSBjcmVhdGVQcm9jZXNzUGFja2FnZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Qcm9jZXNzIENvbXBvbmVudCBJbnRlcmZhY2U8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlByb2Nlc3MgQ29tcG9uZW50IEludGVyZmFjZTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSBjcmVhdGVQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlByb2Nlc3MgQ29tcG9uZW50IERlc2NyaXB0b3I8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlByb2Nlc3MgQ29tcG9uZW50IERlc2NyaXB0b3I8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVByb2Nlc3NDb21wb25lbnREZXNjcmlwdG9yIGNyZWF0ZVByb2Nlc3NDb21wb25lbnREZXNjcmlwdG9yKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPk1ldGhvZCBQbHVnaW48L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPk1ldGhvZCBQbHVnaW48L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU1ldGhvZFBsdWdpbiBjcmVhdGVNZXRob2RQbHVnaW4oKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+TWV0aG9kIENvbmZpZ3VyYXRpb248L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPk1ldGhvZCBDb25maWd1cmF0aW9uPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlNZXRob2RDb25maWd1cmF0aW9uIGNyZWF0ZU1ldGhvZENvbmZpZ3VyYXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UHJvY2VzcyBGYW1pbHk8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlByb2Nlc3MgRmFtaWx5PC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlQcm9jZXNzRmFtaWx5IGNyZWF0ZVByb2Nlc3NGYW1pbHkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+TWV0aG9kIExpYnJhcnk8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPk1ldGhvZCBMaWJyYXJ5PC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlNZXRob2RMaWJyYXJ5IGNyZWF0ZU1ldGhvZExpYnJhcnkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UG9pbnQ8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlBvaW50PC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlQb2ludCBjcmVhdGVQb2ludCgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5EaWFncmFtIExpbms8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkRpYWdyYW0gTGluazwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRGlhZ3JhbUxpbmsgY3JlYXRlRGlhZ3JhbUxpbmsoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+R3JhcGggQ29ubmVjdG9yPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5HcmFwaCBDb25uZWN0b3I8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUdyYXBoQ29ubmVjdG9yIGNyZWF0ZUdyYXBoQ29ubmVjdG9yKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkRpbWVuc2lvbjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RGltZW5zaW9uPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlEaW1lbnNpb24gY3JlYXRlRGltZW5zaW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlJlZmVyZW5jZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UmVmZXJlbmNlPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlSZWZlcmVuY2UgY3JlYXRlUmVmZXJlbmNlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlByb3BlcnR5PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Qcm9wZXJ0eTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUHJvcGVydHkgY3JlYXRlUHJvcGVydHkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+R3JhcGggRWRnZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+R3JhcGggRWRnZTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JR3JhcGhFZGdlIGNyZWF0ZUdyYXBoRWRnZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5EaWFncmFtPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5EaWFncmFtPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlEaWFncmFtIGNyZWF0ZURpYWdyYW0oKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+R3JhcGggTm9kZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+R3JhcGggTm9kZTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JR3JhcGhOb2RlIGNyZWF0ZUdyYXBoTm9kZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5TaW1wbGUgU2VtYW50aWMgTW9kZWwgRWxlbWVudDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+U2ltcGxlIFNlbWFudGljIE1vZGVsIEVsZW1lbnQ8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVNpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50IGNyZWF0ZVNpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlVNQSBTZW1hbnRpYyBNb2RlbCBCcmlkZ2U8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlVNQSBTZW1hbnRpYyBNb2RlbCBCcmlkZ2U8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVVNQVNlbWFudGljTW9kZWxCcmlkZ2UgY3JlYXRlVU1BU2VtYW50aWNNb2RlbEJyaWRnZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Db3JlIFNlbWFudGljIE1vZGVsIEJyaWRnZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+Q29yZSBTZW1hbnRpYyBNb2RlbCBCcmlkZ2U8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUNvcmVTZW1hbnRpY01vZGVsQnJpZGdlIGNyZWF0ZUNvcmVTZW1hbnRpY01vZGVsQnJpZGdlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlRleHQgRWxlbWVudDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+VGV4dCBFbGVtZW50PC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlUZXh0RWxlbWVudCBjcmVhdGVUZXh0RWxlbWVudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5JbWFnZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+SW1hZ2U8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUltYWdlIGNyZWF0ZUltYWdlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlBvbHlsaW5lPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Qb2x5bGluZTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUG9seWxpbmUgY3JlYXRlUG9seWxpbmUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RWxsaXBzZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RWxsaXBzZTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRWxsaXBzZSBjcmVhdGVFbGxpcHNlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwYWNrYWdlIHN1cHBvcnRlZCBieSB0aGlzIGZhY3RvcnkuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBwYWNrYWdlIHN1cHBvcnRlZCBieSB0aGlzIGZhY3RvcnkuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVVtYVBhY2thZ2UgZ2V0VW1hUGFja2FnZSgpOwotCi19IC8vVW1hRmFjdG9yeQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9VbWFQYWNrYWdlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1VtYVBhY2thZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGFkYjMyNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1VtYVBhY2thZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwOTcxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVFbnVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogVGhlIDxiPlBhY2thZ2U8L2I+IGZvciB0aGUgbW9kZWwuCi0gKiBJdCBjb250YWlucyBhY2Nlc3NvcnMgZm9yIHRoZSBtZXRhIG9iamVjdHMgdG8gcmVwcmVzZW50Ci0gKiA8dWw+Ci0gKiAgIDxsaT5lYWNoIGNsYXNzLDwvbGk+Ci0gKiAgIDxsaT5lYWNoIGZlYXR1cmUgb2YgZWFjaCBjbGFzcyw8L2xpPgotICogICA8bGk+ZWFjaCBlbnVtLDwvbGk+Ci0gKiAgIDxsaT5hbmQgZWFjaCBkYXRhIHR5cGU8L2xpPgotICogPC91bD4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiAwNgotICogMDUKLSAqIDA0Ci0gKiAwMwotICogMDEKLSAqIDAyCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hRmFjdG9yeQotICogQG1vZGVsIGtpbmQ9InBhY2thZ2UiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgVW1hUGFja2FnZSBleHRlbmRzIEVQYWNrYWdlIHsKLQkvKioKLQkgKiBUaGUgcGFja2FnZSBuYW1lLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBlTkFNRSA9ICJ1bWEiOwotCi0JLyoqCi0JICogVGhlIHBhY2thZ2UgbmFtZXNwYWNlIFVSSS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZU5TX1VSSSA9ICJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjUvdW1hLmVjb3JlIjsKLQotCS8qKgotCSAqIFRoZSBwYWNrYWdlIG5hbWVzcGFjZSBuYW1lLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBlTlNfUFJFRklYID0gIm9yZy5lY2xpcHNlLmVwZi51bWEiOwotCi0JLyoqCi0JICogVGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgcGFja2FnZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlVbWFQYWNrYWdlIGVJTlNUQU5DRSA9IG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbC5pbml0KCk7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5FbGVtZW50SW1wbCA8ZW0+RWxlbWVudDwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5FbGVtZW50SW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldEVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgRUxFTUVOVCA9IDQ7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+RWxlbWVudDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFTEVNRU5UX0ZFQVRVUkVfQ09VTlQgPSAwOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuTmFtZWRFbGVtZW50SW1wbCA8ZW0+TmFtZWQgRWxlbWVudDwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5OYW1lZEVsZW1lbnRJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0TmFtZWRFbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IE5BTUVEX0VMRU1FTlQgPSAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBOQU1FRF9FTEVNRU5UX19OQU1FID0gRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5OYW1lZCBFbGVtZW50PC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE5BTUVEX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCA9IEVMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5QYWNrYWdlYWJsZUVsZW1lbnRJbXBsIDxlbT5QYWNrYWdlYWJsZSBFbGVtZW50PC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlBhY2thZ2VhYmxlRWxlbWVudEltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRQYWNrYWdlYWJsZUVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgUEFDS0FHRUFCTEVfRUxFTUVOVCA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBBQ0tBR0VBQkxFX0VMRU1FTlRfX05BTUUgPSBOQU1FRF9FTEVNRU5UX19OQU1FOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlBhY2thZ2VhYmxlIEVsZW1lbnQ8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUEFDS0FHRUFCTEVfRUxFTUVOVF9GRUFUVVJFX0NPVU5UID0gTkFNRURfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlR5cGVJbXBsIDxlbT5UeXBlPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlR5cGVJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBUWVBFID0gMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVFlQRV9fTkFNRSA9IFBBQ0tBR0VBQkxFX0VMRU1FTlRfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+VHlwZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUWVBFX0ZFQVRVUkVfQ09VTlQgPSBQQUNLQUdFQUJMRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQ2xhc3NpZmllckltcGwgPGVtPkNsYXNzaWZpZXI8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQ2xhc3NpZmllckltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRDbGFzc2lmaWVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IENMQVNTSUZJRVIgPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDTEFTU0lGSUVSX19OQU1FID0gVFlQRV9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBBYnN0cmFjdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENMQVNTSUZJRVJfX0lTX0FCU1RSQUNUID0gVFlQRV9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5DbGFzc2lmaWVyPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENMQVNTSUZJRVJfRkVBVFVSRV9DT1VOVCA9IFRZUEVfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5OYW1lc3BhY2VJbXBsIDxlbT5OYW1lc3BhY2U8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuTmFtZXNwYWNlSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldE5hbWVzcGFjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBOQU1FU1BBQ0UgPSA2OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBOQU1FU1BBQ0VfX05BTUUgPSBOQU1FRF9FTEVNRU5UX19OQU1FOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPk5hbWVzcGFjZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBOQU1FU1BBQ0VfRkVBVFVSRV9DT1VOVCA9IE5BTUVEX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5QYWNrYWdlSW1wbCA8ZW0+UGFja2FnZTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5QYWNrYWdlSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFBhY2thZ2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgUEFDS0FHRSA9IDU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBBQ0tBR0VfX05BTUUgPSBOQU1FU1BBQ0VfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+UGFja2FnZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQQUNLQUdFX0ZFQVRVUkVfQ09VTlQgPSBOQU1FU1BBQ0VfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5NZXRob2RFbGVtZW50SW1wbCA8ZW0+TWV0aG9kIEVsZW1lbnQ8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuTWV0aG9kRWxlbWVudEltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRNZXRob2RFbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IE1FVEhPRF9FTEVNRU5UID0gODsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX0VMRU1FTlRfX05BTUUgPSBQQUNLQUdFQUJMRV9FTEVNRU5UX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfRUxFTUVOVF9fR1VJRCA9IFBBQ0tBR0VBQkxFX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfRUxFTUVOVF9fUFJFU0VOVEFUSU9OX05BTUUgPSBQQUNLQUdFQUJMRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX0VMRU1FTlRfX0JSSUVGX0RFU0NSSVBUSU9OID0gUEFDS0FHRUFCTEVfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX0VMRU1FTlRfX09XTkVEX1JVTEVTID0gUEFDS0FHRUFCTEVfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX0VMRU1FTlRfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gUEFDS0FHRUFCTEVfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5LaW5kPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfRUxFTUVOVF9fS0lORCA9IFBBQ0tBR0VBQkxFX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9FTEVNRU5UX19TVVBQUkVTU0VEID0gUEFDS0FHRUFCTEVfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgNjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9FTEVNRU5UX19PUkRFUklOR19HVUlERSA9IFBBQ0tBR0VBQkxFX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDc7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+TWV0aG9kIEVsZW1lbnQ8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCA9IFBBQ0tBR0VBQkxFX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDg7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Db25zdHJhaW50SW1wbCA8ZW0+Q29uc3RyYWludDwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Db25zdHJhaW50SW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldENvbnN0cmFpbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgQ09OU1RSQUlOVCA9IDc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlNUUkFJTlRfX05BTUUgPSBNRVRIT0RfRUxFTUVOVF9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OU1RSQUlOVF9fR1VJRCA9IE1FVEhPRF9FTEVNRU5UX19HVUlEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OU1RSQUlOVF9fUFJFU0VOVEFUSU9OX05BTUUgPSBNRVRIT0RfRUxFTUVOVF9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05TVFJBSU5UX19CUklFRl9ERVNDUklQVElPTiA9IE1FVEhPRF9FTEVNRU5UX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OU1RSQUlOVF9fT1dORURfUlVMRVMgPSBNRVRIT0RfRUxFTUVOVF9fT1dORURfUlVMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlNUUkFJTlRfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gTUVUSE9EX0VMRU1FTlRfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPktpbmQ8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlNUUkFJTlRfX0tJTkQgPSBNRVRIT0RfRUxFTUVOVF9fS0lORDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OU1RSQUlOVF9fU1VQUFJFU1NFRCA9IE1FVEhPRF9FTEVNRU5UX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OU1RSQUlOVF9fT1JERVJJTkdfR1VJREUgPSBNRVRIT0RfRUxFTUVOVF9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Qm9keTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlNUUkFJTlRfX0JPRFkgPSBNRVRIT0RfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Db25zdHJhaW50PC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlNUUkFJTlRfRkVBVFVSRV9DT1VOVCA9IE1FVEhPRF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuTWV0aG9kRWxlbWVudFByb3BlcnR5SW1wbCA8ZW0+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuTWV0aG9kRWxlbWVudFByb3BlcnR5SW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldE1ldGhvZEVsZW1lbnRQcm9wZXJ0eSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBNRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IDk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9FTEVNRU5UX1BST1BFUlRZX19OQU1FID0gUEFDS0FHRUFCTEVfRUxFTUVOVF9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9FTEVNRU5UX1BST1BFUlRZX19WQUxVRSA9IFBBQ0tBR0VBQkxFX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFlfRkVBVFVSRV9DT1VOVCA9IFBBQ0tBR0VBQkxFX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5EZXNjcmliYWJsZUVsZW1lbnRJbXBsIDxlbT5EZXNjcmliYWJsZSBFbGVtZW50PC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkRlc2NyaWJhYmxlRWxlbWVudEltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXREZXNjcmliYWJsZUVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgREVTQ1JJQkFCTEVfRUxFTUVOVCA9IDEyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklCQUJMRV9FTEVNRU5UX19OQU1FID0gTUVUSE9EX0VMRU1FTlRfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSUJBQkxFX0VMRU1FTlRfX0dVSUQgPSBNRVRIT0RfRUxFTUVOVF9fR1VJRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSUJBQkxFX0VMRU1FTlRfX1BSRVNFTlRBVElPTl9OQU1FID0gTUVUSE9EX0VMRU1FTlRfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJQkFCTEVfRUxFTUVOVF9fQlJJRUZfREVTQ1JJUFRJT04gPSBNRVRIT0RfRUxFTUVOVF9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSUJBQkxFX0VMRU1FTlRfX09XTkVEX1JVTEVTID0gTUVUSE9EX0VMRU1FTlRfX09XTkVEX1JVTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklCQUJMRV9FTEVNRU5UX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IE1FVEhPRF9FTEVNRU5UX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5LaW5kPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklCQUJMRV9FTEVNRU5UX19LSU5EID0gTUVUSE9EX0VMRU1FTlRfX0tJTkQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSUJBQkxFX0VMRU1FTlRfX1NVUFBSRVNTRUQgPSBNRVRIT0RfRUxFTUVOVF9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSUJBQkxFX0VMRU1FTlRfX09SREVSSU5HX0dVSURFID0gTUVUSE9EX0VMRU1FTlRfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIEFic3RyYWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJQkFCTEVfRUxFTUVOVF9fSVNfQUJTVFJBQ1QgPSBNRVRIT0RfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklCQUJMRV9FTEVNRU5UX19QUkVTRU5UQVRJT04gPSBNRVRIT0RfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TaGFwZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklCQUJMRV9FTEVNRU5UX19TSEFQRUlDT04gPSBNRVRIT0RfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob2RlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSUJBQkxFX0VMRU1FTlRfX05PREVJQ09OID0gTUVUSE9EX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+RGVzY3JpYmFibGUgRWxlbWVudDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklCQUJMRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgPSBNRVRIT0RfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgNDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlZhcmlhYmlsaXR5RWxlbWVudEltcGwgPGVtPlZhcmlhYmlsaXR5IEVsZW1lbnQ8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVmFyaWFiaWxpdHlFbGVtZW50SW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFZhcmlhYmlsaXR5RWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBWQVJJQUJJTElUWV9FTEVNRU5UID0gMTg7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Db250ZW50RWxlbWVudEltcGwgPGVtPkNvbnRlbnQgRWxlbWVudDwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Db250ZW50RWxlbWVudEltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRDb250ZW50RWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBDT05URU5UX0VMRU1FTlQgPSAxMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9FTEVNRU5UX19OQU1FID0gREVTQ1JJQkFCTEVfRUxFTUVOVF9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9FTEVNRU5UX19HVUlEID0gREVTQ1JJQkFCTEVfRUxFTUVOVF9fR1VJRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfRUxFTUVOVF9fUFJFU0VOVEFUSU9OX05BTUUgPSBERVNDUklCQUJMRV9FTEVNRU5UX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfRUxFTUVOVF9fQlJJRUZfREVTQ1JJUFRJT04gPSBERVNDUklCQUJMRV9FTEVNRU5UX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9FTEVNRU5UX19PV05FRF9SVUxFUyA9IERFU0NSSUJBQkxFX0VMRU1FTlRfX09XTkVEX1JVTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0VMRU1FTlRfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gREVTQ1JJQkFCTEVfRUxFTUVOVF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+S2luZDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9FTEVNRU5UX19LSU5EID0gREVTQ1JJQkFCTEVfRUxFTUVOVF9fS0lORDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9FTEVNRU5UX19TVVBQUkVTU0VEID0gREVTQ1JJQkFCTEVfRUxFTUVOVF9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfRUxFTUVOVF9fT1JERVJJTkdfR1VJREUgPSBERVNDUklCQUJMRV9FTEVNRU5UX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBBYnN0cmFjdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfRUxFTUVOVF9fSVNfQUJTVFJBQ1QgPSBERVNDUklCQUJMRV9FTEVNRU5UX19JU19BQlNUUkFDVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0VMRU1FTlRfX1BSRVNFTlRBVElPTiA9IERFU0NSSUJBQkxFX0VMRU1FTlRfX1BSRVNFTlRBVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TaGFwZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0VMRU1FTlRfX1NIQVBFSUNPTiA9IERFU0NSSUJBQkxFX0VMRU1FTlRfX1NIQVBFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob2RlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfRUxFTUVOVF9fTk9ERUlDT04gPSBERVNDUklCQUJMRV9FTEVNRU5UX19OT0RFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9FTEVNRU5UX19WQVJJQUJJTElUWV9UWVBFID0gREVTQ1JJQkFCTEVfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9FTEVNRU5UX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UID0gREVTQ1JJQkFCTEVfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwb3J0aW5nIE1hdGVyaWFsczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9FTEVNRU5UX19TVVBQT1JUSU5HX01BVEVSSUFMUyA9IERFU0NSSUJBQkxFX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29uY2VwdHMgQW5kIFBhcGVyczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9FTEVNRU5UX19DT05DRVBUU19BTkRfUEFQRVJTID0gREVTQ1JJQkFCTEVfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGVja2xpc3RzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0VMRU1FTlRfX0NIRUNLTElTVFMgPSBERVNDUklCQUJMRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWRlbGluZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfRUxFTUVOVF9fR1VJREVMSU5FUyA9IERFU0NSSUJBQkxFX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXhhbXBsZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfRUxFTUVOVF9fRVhBTVBMRVMgPSBERVNDUklCQUJMRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA2OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFzc2V0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9FTEVNRU5UX19BU1NFVFMgPSBERVNDUklCQUJMRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA3OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRlcm1kZWZpbml0aW9uPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0VMRU1FTlRfX1RFUk1ERUZJTklUSU9OID0gREVTQ1JJQkFCTEVfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgODsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Db250ZW50IEVsZW1lbnQ8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgPSBERVNDUklCQUJMRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA5OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuS2luZEltcGwgPGVtPktpbmQ8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuS2luZEltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRLaW5kKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IEtJTkQgPSAxMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgS0lORF9fTkFNRSA9IENPTlRFTlRfRUxFTUVOVF9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgS0lORF9fR1VJRCA9IENPTlRFTlRfRUxFTUVOVF9fR1VJRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEtJTkRfX1BSRVNFTlRBVElPTl9OQU1FID0gQ09OVEVOVF9FTEVNRU5UX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEtJTkRfX0JSSUVGX0RFU0NSSVBUSU9OID0gQ09OVEVOVF9FTEVNRU5UX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgS0lORF9fT1dORURfUlVMRVMgPSBDT05URU5UX0VMRU1FTlRfX09XTkVEX1JVTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBLSU5EX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IENPTlRFTlRfRUxFTUVOVF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+S2luZDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgS0lORF9fS0lORCA9IENPTlRFTlRfRUxFTUVOVF9fS0lORDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgS0lORF9fU1VQUFJFU1NFRCA9IENPTlRFTlRfRUxFTUVOVF9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEtJTkRfX09SREVSSU5HX0dVSURFID0gQ09OVEVOVF9FTEVNRU5UX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBBYnN0cmFjdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEtJTkRfX0lTX0FCU1RSQUNUID0gQ09OVEVOVF9FTEVNRU5UX19JU19BQlNUUkFDVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBLSU5EX19QUkVTRU5UQVRJT04gPSBDT05URU5UX0VMRU1FTlRfX1BSRVNFTlRBVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TaGFwZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBLSU5EX19TSEFQRUlDT04gPSBDT05URU5UX0VMRU1FTlRfX1NIQVBFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob2RlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEtJTkRfX05PREVJQ09OID0gQ09OVEVOVF9FTEVNRU5UX19OT0RFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgS0lORF9fVkFSSUFCSUxJVFlfVFlQRSA9IENPTlRFTlRfRUxFTUVOVF9fVkFSSUFCSUxJVFlfVFlQRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgS0lORF9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVCA9IENPTlRFTlRfRUxFTUVOVF9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwb3J0aW5nIE1hdGVyaWFsczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgS0lORF9fU1VQUE9SVElOR19NQVRFUklBTFMgPSBDT05URU5UX0VMRU1FTlRfX1NVUFBPUlRJTkdfTUFURVJJQUxTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbmNlcHRzIEFuZCBQYXBlcnM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEtJTkRfX0NPTkNFUFRTX0FORF9QQVBFUlMgPSBDT05URU5UX0VMRU1FTlRfX0NPTkNFUFRTX0FORF9QQVBFUlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hlY2tsaXN0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgS0lORF9fQ0hFQ0tMSVNUUyA9IENPTlRFTlRfRUxFTUVOVF9fQ0hFQ0tMSVNUUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkZWxpbmVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBLSU5EX19HVUlERUxJTkVTID0gQ09OVEVOVF9FTEVNRU5UX19HVUlERUxJTkVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4YW1wbGVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBLSU5EX19FWEFNUExFUyA9IENPTlRFTlRfRUxFTUVOVF9fRVhBTVBMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXNzZXRzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBLSU5EX19BU1NFVFMgPSBDT05URU5UX0VMRU1FTlRfX0FTU0VUUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UZXJtZGVmaW5pdGlvbjwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgS0lORF9fVEVSTURFRklOSVRJT04gPSBDT05URU5UX0VMRU1FTlRfX1RFUk1ERUZJTklUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFwcGxpY2FibGUgTWV0YSBDbGFzcyBJbmZvPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBLSU5EX19BUFBMSUNBQkxFX01FVEFfQ0xBU1NfSU5GTyA9IENPTlRFTlRfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5LaW5kPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEtJTkRfRkVBVFVSRV9DT1VOVCA9IENPTlRFTlRfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLk1ldGhvZFVuaXRJbXBsIDxlbT5NZXRob2QgVW5pdDwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5NZXRob2RVbml0SW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldE1ldGhvZFVuaXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgTUVUSE9EX1VOSVQgPSAxNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX1VOSVRfX05BTUUgPSBNRVRIT0RfRUxFTUVOVF9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX1VOSVRfX0dVSUQgPSBNRVRIT0RfRUxFTUVOVF9fR1VJRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9VTklUX19QUkVTRU5UQVRJT05fTkFNRSA9IE1FVEhPRF9FTEVNRU5UX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9VTklUX19CUklFRl9ERVNDUklQVElPTiA9IE1FVEhPRF9FTEVNRU5UX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX1VOSVRfX09XTkVEX1JVTEVTID0gTUVUSE9EX0VMRU1FTlRfX09XTkVEX1JVTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfVU5JVF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBNRVRIT0RfRUxFTUVOVF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+S2luZDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX1VOSVRfX0tJTkQgPSBNRVRIT0RfRUxFTUVOVF9fS0lORDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX1VOSVRfX1NVUFBSRVNTRUQgPSBNRVRIT0RfRUxFTUVOVF9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9VTklUX19PUkRFUklOR19HVUlERSA9IE1FVEhPRF9FTEVNRU5UX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BdXRob3JzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX1VOSVRfX0FVVEhPUlMgPSBNRVRIT0RfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGFuZ2UgRGF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9VTklUX19DSEFOR0VfREFURSA9IE1FVEhPRF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoYW5nZSBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9VTklUX19DSEFOR0VfREVTQ1JJUFRJT04gPSBNRVRIT0RfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WZXJzaW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX1VOSVRfX1ZFUlNJT04gPSBNRVRIT0RfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db3B5cmlnaHQgU3RhdGVtZW50PC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX1VOSVRfX0NPUFlSSUdIVF9TVEFURU1FTlQgPSBNRVRIT0RfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgNDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5NZXRob2QgVW5pdDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfVU5JVF9GRUFUVVJFX0NPVU5UID0gTUVUSE9EX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDU7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Db250ZW50RGVzY3JpcHRpb25JbXBsIDxlbT5Db250ZW50IERlc2NyaXB0aW9uPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkNvbnRlbnREZXNjcmlwdGlvbkltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRDb250ZW50RGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9ERVNDUklQVElPTiA9IDEzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0RFU0NSSVBUSU9OX19OQU1FID0gTUVUSE9EX1VOSVRfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfREVTQ1JJUFRJT05fX0dVSUQgPSBNRVRIT0RfVU5JVF9fR1VJRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfREVTQ1JJUFRJT05fX1BSRVNFTlRBVElPTl9OQU1FID0gTUVUSE9EX1VOSVRfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9ERVNDUklQVElPTl9fQlJJRUZfREVTQ1JJUFRJT04gPSBNRVRIT0RfVU5JVF9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfREVTQ1JJUFRJT05fX09XTkVEX1JVTEVTID0gTUVUSE9EX1VOSVRfX09XTkVEX1JVTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0RFU0NSSVBUSU9OX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IE1FVEhPRF9VTklUX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5LaW5kPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0RFU0NSSVBUSU9OX19LSU5EID0gTUVUSE9EX1VOSVRfX0tJTkQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfREVTQ1JJUFRJT05fX1NVUFBSRVNTRUQgPSBNRVRIT0RfVU5JVF9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfREVTQ1JJUFRJT05fX09SREVSSU5HX0dVSURFID0gTUVUSE9EX1VOSVRfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkF1dGhvcnM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0RFU0NSSVBUSU9OX19BVVRIT1JTID0gTUVUSE9EX1VOSVRfX0FVVEhPUlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hhbmdlIERhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0RFU0NSSVBUSU9OX19DSEFOR0VfREFURSA9IE1FVEhPRF9VTklUX19DSEFOR0VfREFURTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGFuZ2UgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0RFU0NSSVBUSU9OX19DSEFOR0VfREVTQ1JJUFRJT04gPSBNRVRIT0RfVU5JVF9fQ0hBTkdFX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZlcnNpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0RFU0NSSVBUSU9OX19WRVJTSU9OID0gTUVUSE9EX1VOSVRfX1ZFUlNJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29weXJpZ2h0IFN0YXRlbWVudDwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfREVTQ1JJUFRJT05fX0NPUFlSSUdIVF9TVEFURU1FTlQgPSBNRVRIT0RfVU5JVF9fQ09QWVJJR0hUX1NUQVRFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYWluIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9ERVNDUklQVElPTl9fTUFJTl9ERVNDUklQVElPTiA9IE1FVEhPRF9VTklUX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNlY3Rpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0RFU0NSSVBUSU9OX19TRUNUSU9OUyA9IE1FVEhPRF9VTklUX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4dGVybmFsIElkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9ERVNDUklQVElPTl9fRVhURVJOQUxfSUQgPSBNRVRIT0RfVU5JVF9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5LZXkgQ29uc2lkZXJhdGlvbnM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0RFU0NSSVBUSU9OX19LRVlfQ09OU0lERVJBVElPTlMgPSBNRVRIT0RfVU5JVF9GRUFUVVJFX0NPVU5UICsgMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Mb25nIFByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9ERVNDUklQVElPTl9fTE9OR19QUkVTRU5UQVRJT05fTkFNRSA9IE1FVEhPRF9VTklUX0ZFQVRVUkVfQ09VTlQgKyA0OwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkNvbnRlbnQgRGVzY3JpcHRpb248L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9ERVNDUklQVElPTl9GRUFUVVJFX0NPVU5UID0gTUVUSE9EX1VOSVRfRkVBVFVSRV9DT1VOVCArIDU7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5TZWN0aW9uSW1wbCA8ZW0+U2VjdGlvbjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5TZWN0aW9uSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFNlY3Rpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgU0VDVElPTiA9IDE3OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUm9sZUltcGwgPGVtPlJvbGU8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUm9sZUltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRSb2xlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFJPTEUgPSAzOTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLldvcmtQcm9kdWN0SW1wbCA8ZW0+V29yayBQcm9kdWN0PC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLldvcmtQcm9kdWN0SW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFdvcmtQcm9kdWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVCA9IDI3OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVGFza0ltcGwgPGVtPlRhc2s8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVGFza0ltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFRBU0sgPSAzODsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLldvcmtEZWZpbml0aW9uSW1wbCA8ZW0+V29yayBEZWZpbml0aW9uPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLldvcmtEZWZpbml0aW9uSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFdvcmtEZWZpbml0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFdPUktfREVGSU5JVElPTiA9IDM2OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuU3RlcEltcGwgPGVtPlN0ZXA8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuU3RlcEltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRTdGVwKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFNURVAgPSAzNTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkd1aWRhbmNlSW1wbCA8ZW0+R3VpZGFuY2U8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuR3VpZGFuY2VJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0R3VpZGFuY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgR1VJREFOQ0UgPSAxNjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREFOQ0VfX05BTUUgPSBDT05URU5UX0VMRU1FTlRfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURBTkNFX19HVUlEID0gQ09OVEVOVF9FTEVNRU5UX19HVUlEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREFOQ0VfX1BSRVNFTlRBVElPTl9OQU1FID0gQ09OVEVOVF9FTEVNRU5UX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURBTkNFX19CUklFRl9ERVNDUklQVElPTiA9IENPTlRFTlRfRUxFTUVOVF9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURBTkNFX19PV05FRF9SVUxFUyA9IENPTlRFTlRfRUxFTUVOVF9fT1dORURfUlVMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURBTkNFX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IENPTlRFTlRfRUxFTUVOVF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+S2luZDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREFOQ0VfX0tJTkQgPSBDT05URU5UX0VMRU1FTlRfX0tJTkQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURBTkNFX19TVVBQUkVTU0VEID0gQ09OVEVOVF9FTEVNRU5UX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREFOQ0VfX09SREVSSU5HX0dVSURFID0gQ09OVEVOVF9FTEVNRU5UX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBBYnN0cmFjdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURBTkNFX19JU19BQlNUUkFDVCA9IENPTlRFTlRfRUxFTUVOVF9fSVNfQUJTVFJBQ1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREFOQ0VfX1BSRVNFTlRBVElPTiA9IENPTlRFTlRfRUxFTUVOVF9fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNoYXBlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURBTkNFX19TSEFQRUlDT04gPSBDT05URU5UX0VMRU1FTlRfX1NIQVBFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob2RlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURBTkNFX19OT0RFSUNPTiA9IENPTlRFTlRfRUxFTUVOVF9fTk9ERUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURBTkNFX19WQVJJQUJJTElUWV9UWVBFID0gQ09OVEVOVF9FTEVNRU5UX19WQVJJQUJJTElUWV9UWVBFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHVUlEQU5DRV9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVCA9IENPTlRFTlRfRUxFTUVOVF9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwb3J0aW5nIE1hdGVyaWFsczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREFOQ0VfX1NVUFBPUlRJTkdfTUFURVJJQUxTID0gQ09OVEVOVF9FTEVNRU5UX19TVVBQT1JUSU5HX01BVEVSSUFMUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db25jZXB0cyBBbmQgUGFwZXJzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHVUlEQU5DRV9fQ09OQ0VQVFNfQU5EX1BBUEVSUyA9IENPTlRFTlRfRUxFTUVOVF9fQ09OQ0VQVFNfQU5EX1BBUEVSUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGVja2xpc3RzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHVUlEQU5DRV9fQ0hFQ0tMSVNUUyA9IENPTlRFTlRfRUxFTUVOVF9fQ0hFQ0tMSVNUUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkZWxpbmVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHVUlEQU5DRV9fR1VJREVMSU5FUyA9IENPTlRFTlRfRUxFTUVOVF9fR1VJREVMSU5FUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeGFtcGxlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREFOQ0VfX0VYQU1QTEVTID0gQ09OVEVOVF9FTEVNRU5UX19FWEFNUExFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Bc3NldHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURBTkNFX19BU1NFVFMgPSBDT05URU5UX0VMRU1FTlRfX0FTU0VUUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UZXJtZGVmaW5pdGlvbjwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREFOQ0VfX1RFUk1ERUZJTklUSU9OID0gQ09OVEVOVF9FTEVNRU5UX19URVJNREVGSU5JVElPTjsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5HdWlkYW5jZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHVUlEQU5DRV9GRUFUVVJFX0NPVU5UID0gQ09OVEVOVF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQXJ0aWZhY3RJbXBsIDxlbT5BcnRpZmFjdDwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5BcnRpZmFjdEltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRBcnRpZmFjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBBUlRJRkFDVCA9IDI2OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRnVsZmlsbGFibGVFbGVtZW50SW1wbCA8ZW0+RnVsZmlsbGFibGUgRWxlbWVudDwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5GdWxmaWxsYWJsZUVsZW1lbnRJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0RnVsZmlsbGFibGVFbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IEZVTEZJTExBQkxFX0VMRU1FTlQgPSAyODsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkRlbGl2ZXJhYmxlSW1wbCA8ZW0+RGVsaXZlcmFibGU8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRGVsaXZlcmFibGVJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0RGVsaXZlcmFibGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgREVMSVZFUkFCTEUgPSAzMzsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLk91dGNvbWVJbXBsIDxlbT5PdXRjb21lPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLk91dGNvbWVJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0T3V0Y29tZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBPVVRDT01FID0gMzQ7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5NZXRob2RQYWNrYWdlSW1wbCA8ZW0+TWV0aG9kIFBhY2thZ2U8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuTWV0aG9kUGFja2FnZUltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRNZXRob2RQYWNrYWdlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IE1FVEhPRF9QQUNLQUdFID0gNjM7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Db250ZW50UGFja2FnZUltcGwgPGVtPkNvbnRlbnQgUGFja2FnZTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Db250ZW50UGFja2FnZUltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRDb250ZW50UGFja2FnZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBDT05URU5UX1BBQ0tBR0UgPSA2NDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLldvcmtQcm9kdWN0RGVzY3JpcHRpb25JbXBsIDxlbT5Xb3JrIFByb2R1Y3QgRGVzY3JpcHRpb248L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuV29ya1Byb2R1Y3REZXNjcmlwdGlvbkltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRXb3JrUHJvZHVjdERlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTiA9IDQxOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQXJ0aWZhY3REZXNjcmlwdGlvbkltcGwgPGVtPkFydGlmYWN0IERlc2NyaXB0aW9uPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkFydGlmYWN0RGVzY3JpcHRpb25JbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0QXJ0aWZhY3REZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBBUlRJRkFDVF9ERVNDUklQVElPTiA9IDQwOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRGVsaXZlcmFibGVEZXNjcmlwdGlvbkltcGwgPGVtPkRlbGl2ZXJhYmxlIERlc2NyaXB0aW9uPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkRlbGl2ZXJhYmxlRGVzY3JpcHRpb25JbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0RGVsaXZlcmFibGVEZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBERUxJVkVSQUJMRV9ERVNDUklQVElPTiA9IDQyOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUm9sZURlc2NyaXB0aW9uSW1wbCA8ZW0+Um9sZSBEZXNjcmlwdGlvbjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Sb2xlRGVzY3JpcHRpb25JbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0Um9sZURlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFJPTEVfREVTQ1JJUFRJT04gPSA0MzsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlRhc2tEZXNjcmlwdGlvbkltcGwgPGVtPlRhc2sgRGVzY3JpcHRpb248L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVGFza0Rlc2NyaXB0aW9uSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFRhc2tEZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUSU9OID0gNDQ7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5HdWlkYW5jZURlc2NyaXB0aW9uSW1wbCA8ZW0+R3VpZGFuY2UgRGVzY3JpcHRpb248L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuR3VpZGFuY2VEZXNjcmlwdGlvbkltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRHdWlkYW5jZURlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IEdVSURBTkNFX0RFU0NSSVBUSU9OID0gNDU7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5QcmFjdGljZURlc2NyaXB0aW9uSW1wbCA8ZW0+UHJhY3RpY2UgRGVzY3JpcHRpb248L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUHJhY3RpY2VEZXNjcmlwdGlvbkltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRQcmFjdGljZURlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFBSQUNUSUNFX0RFU0NSSVBUSU9OID0gNDY7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Qcm9jZXNzRWxlbWVudEltcGwgPGVtPlByb2Nlc3MgRWxlbWVudDwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Qcm9jZXNzRWxlbWVudEltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRQcm9jZXNzRWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBQUk9DRVNTX0VMRU1FTlQgPSA1NjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkJyZWFrZG93bkVsZW1lbnRJbXBsIDxlbT5CcmVha2Rvd24gRWxlbWVudDwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5CcmVha2Rvd25FbGVtZW50SW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldEJyZWFrZG93bkVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgQlJFQUtET1dOX0VMRU1FTlQgPSA1NTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLldvcmtCcmVha2Rvd25FbGVtZW50SW1wbCA8ZW0+V29yayBCcmVha2Rvd24gRWxlbWVudDwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Xb3JrQnJlYWtkb3duRWxlbWVudEltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRXb3JrQnJlYWtkb3duRWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UID0gNTQ7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5BY3Rpdml0eUltcGwgPGVtPkFjdGl2aXR5PC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkFjdGl2aXR5SW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldEFjdGl2aXR5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IEFDVElWSVRZID0gNTM7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5NaWxlc3RvbmVJbXBsIDxlbT5NaWxlc3RvbmU8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuTWlsZXN0b25lSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldE1pbGVzdG9uZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBNSUxFU1RPTkUgPSA2NTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkl0ZXJhdGlvbkltcGwgPGVtPkl0ZXJhdGlvbjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5JdGVyYXRpb25JbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0SXRlcmF0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IElURVJBVElPTiA9IDY4OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUGhhc2VJbXBsIDxlbT5QaGFzZTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5QaGFzZUltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRQaGFzZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBQSEFTRSA9IDY5OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVGVhbVByb2ZpbGVJbXBsIDxlbT5UZWFtIFByb2ZpbGU8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVGVhbVByb2ZpbGVJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0VGVhbVByb2ZpbGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgVEVBTV9QUk9GSUxFID0gNzA7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5EZXNjcmlwdG9ySW1wbCA8ZW0+RGVzY3JpcHRvcjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5EZXNjcmlwdG9ySW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldERlc2NyaXB0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgREVTQ1JJUFRPUiA9IDY3OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUm9sZURlc2NyaXB0b3JJbXBsIDxlbT5Sb2xlIERlc2NyaXB0b3I8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUm9sZURlc2NyaXB0b3JJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0Um9sZURlc2NyaXB0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgUk9MRV9ERVNDUklQVE9SID0gNzE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Xb3JrT3JkZXJJbXBsIDxlbT5Xb3JrIE9yZGVyPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLldvcmtPcmRlckltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRXb3JrT3JkZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgV09SS19PUkRFUiA9IDU4OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUGxhbm5pbmdEYXRhSW1wbCA8ZW0+UGxhbm5pbmcgRGF0YTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5QbGFubmluZ0RhdGFJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0UGxhbm5pbmdEYXRhKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFBMQU5OSU5HX0RBVEEgPSA1NzsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlRhc2tEZXNjcmlwdG9ySW1wbCA8ZW0+VGFzayBEZXNjcmlwdG9yPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlRhc2tEZXNjcmlwdG9ySW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFRhc2tEZXNjcmlwdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRPUiA9IDcyOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuV29ya1Byb2R1Y3REZXNjcmlwdG9ySW1wbCA8ZW0+V29yayBQcm9kdWN0IERlc2NyaXB0b3I8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuV29ya1Byb2R1Y3REZXNjcmlwdG9ySW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFdvcmtQcm9kdWN0RGVzY3JpcHRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUiA9IDY2OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQ29tcG9zaXRlUm9sZUltcGwgPGVtPkNvbXBvc2l0ZSBSb2xlPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkNvbXBvc2l0ZVJvbGVJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0Q29tcG9zaXRlUm9sZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBDT01QT1NJVEVfUk9MRSA9IDczOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uSW1wbCA8ZW0+QnJlYWtkb3duIEVsZW1lbnQgRGVzY3JpcHRpb248L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldEJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTiA9IDgxOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQWN0aXZpdHlEZXNjcmlwdGlvbkltcGwgPGVtPkFjdGl2aXR5IERlc2NyaXB0aW9uPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkFjdGl2aXR5RGVzY3JpcHRpb25JbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0QWN0aXZpdHlEZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBBQ1RJVklUWV9ERVNDUklQVElPTiA9IDgyOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUHJvY2Vzc0Rlc2NyaXB0aW9uSW1wbCA8ZW0+UHJvY2VzcyBEZXNjcmlwdGlvbjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Qcm9jZXNzRGVzY3JpcHRpb25JbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0UHJvY2Vzc0Rlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFBST0NFU1NfREVTQ1JJUFRJT04gPSA4NDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uSW1wbCA8ZW0+RGVsaXZlcnkgUHJvY2VzcyBEZXNjcmlwdGlvbjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbkltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXREZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OID0gODM7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5EZXNjcmlwdG9yRGVzY3JpcHRpb25JbXBsIDxlbT5EZXNjcmlwdG9yIERlc2NyaXB0aW9uPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkRlc2NyaXB0b3JEZXNjcmlwdGlvbkltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXREZXNjcmlwdG9yRGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgREVTQ1JJUFRPUl9ERVNDUklQVElPTiA9IDg1OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQ29uY2VwdEltcGwgPGVtPkNvbmNlcHQ8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQ29uY2VwdEltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRDb25jZXB0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IENPTkNFUFQgPSAxOTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkNoZWNrbGlzdEltcGwgPGVtPkNoZWNrbGlzdDwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5DaGVja2xpc3RJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0Q2hlY2tsaXN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IENIRUNLTElTVCA9IDIwOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRXhhbXBsZUltcGwgPGVtPkV4YW1wbGU8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRXhhbXBsZUltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRFeGFtcGxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IEVYQU1QTEUgPSAyMjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkd1aWRlbGluZUltcGwgPGVtPkd1aWRlbGluZTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5HdWlkZWxpbmVJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0R3VpZGVsaW5lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IEdVSURFTElORSA9IDIxOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zSW1wbCA8ZW0+RXN0aW1hdGlvbiBDb25zaWRlcmF0aW9uczwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnNJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0RXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IEVTVElNQVRJT05fQ09OU0lERVJBVElPTlMgPSAzMjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlJlcG9ydEltcGwgPGVtPlJlcG9ydDwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5SZXBvcnRJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0UmVwb3J0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFJFUE9SVCA9IDI5OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVGVtcGxhdGVJbXBsIDxlbT5UZW1wbGF0ZTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5UZW1wbGF0ZUltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRUZW1wbGF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBURU1QTEFURSA9IDMwOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuU3VwcG9ydGluZ01hdGVyaWFsSW1wbCA8ZW0+U3VwcG9ydGluZyBNYXRlcmlhbDwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5TdXBwb3J0aW5nTWF0ZXJpYWxJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0U3VwcG9ydGluZ01hdGVyaWFsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFNVUFBPUlRJTkdfTUFURVJJQUwgPSAxNTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU1VQUE9SVElOR19NQVRFUklBTF9fTkFNRSA9IEdVSURBTkNFX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTVVBQT1JUSU5HX01BVEVSSUFMX19HVUlEID0gR1VJREFOQ0VfX0dVSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTVVBQT1JUSU5HX01BVEVSSUFMX19QUkVTRU5UQVRJT05fTkFNRSA9IEdVSURBTkNFX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNVUFBPUlRJTkdfTUFURVJJQUxfX0JSSUVGX0RFU0NSSVBUSU9OID0gR1VJREFOQ0VfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTVVBQT1JUSU5HX01BVEVSSUFMX19PV05FRF9SVUxFUyA9IEdVSURBTkNFX19PV05FRF9SVUxFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU1VQUE9SVElOR19NQVRFUklBTF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBHVUlEQU5DRV9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+S2luZDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU1VQUE9SVElOR19NQVRFUklBTF9fS0lORCA9IEdVSURBTkNFX19LSU5EOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTVVBQT1JUSU5HX01BVEVSSUFMX19TVVBQUkVTU0VEID0gR1VJREFOQ0VfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTVVBQT1JUSU5HX01BVEVSSUFMX19PUkRFUklOR19HVUlERSA9IEdVSURBTkNFX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBBYnN0cmFjdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNVUFBPUlRJTkdfTUFURVJJQUxfX0lTX0FCU1RSQUNUID0gR1VJREFOQ0VfX0lTX0FCU1RSQUNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNVUFBPUlRJTkdfTUFURVJJQUxfX1BSRVNFTlRBVElPTiA9IEdVSURBTkNFX19QUkVTRU5UQVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2hhcGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU1VQUE9SVElOR19NQVRFUklBTF9fU0hBUEVJQ09OID0gR1VJREFOQ0VfX1NIQVBFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob2RlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNVUFBPUlRJTkdfTUFURVJJQUxfX05PREVJQ09OID0gR1VJREFOQ0VfX05PREVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTVVBQT1JUSU5HX01BVEVSSUFMX19WQVJJQUJJTElUWV9UWVBFID0gR1VJREFOQ0VfX1ZBUklBQklMSVRZX1RZUEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNVUFBPUlRJTkdfTUFURVJJQUxfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQgPSBHVUlEQU5DRV9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwb3J0aW5nIE1hdGVyaWFsczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU1VQUE9SVElOR19NQVRFUklBTF9fU1VQUE9SVElOR19NQVRFUklBTFMgPSBHVUlEQU5DRV9fU1VQUE9SVElOR19NQVRFUklBTFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29uY2VwdHMgQW5kIFBhcGVyczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU1VQUE9SVElOR19NQVRFUklBTF9fQ09OQ0VQVFNfQU5EX1BBUEVSUyA9IEdVSURBTkNFX19DT05DRVBUU19BTkRfUEFQRVJTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoZWNrbGlzdHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNVUFBPUlRJTkdfTUFURVJJQUxfX0NIRUNLTElTVFMgPSBHVUlEQU5DRV9fQ0hFQ0tMSVNUUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkZWxpbmVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTVVBQT1JUSU5HX01BVEVSSUFMX19HVUlERUxJTkVTID0gR1VJREFOQ0VfX0dVSURFTElORVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXhhbXBsZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNVUFBPUlRJTkdfTUFURVJJQUxfX0VYQU1QTEVTID0gR1VJREFOQ0VfX0VYQU1QTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFzc2V0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU1VQUE9SVElOR19NQVRFUklBTF9fQVNTRVRTID0gR1VJREFOQ0VfX0FTU0VUUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UZXJtZGVmaW5pdGlvbjwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU1VQUE9SVElOR19NQVRFUklBTF9fVEVSTURFRklOSVRJT04gPSBHVUlEQU5DRV9fVEVSTURFRklOSVRJT047Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+U3VwcG9ydGluZyBNYXRlcmlhbDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTVVBQT1JUSU5HX01BVEVSSUFMX0ZFQVRVUkVfQ09VTlQgPSBHVUlEQU5DRV9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVkFSSUFCSUxJVFlfRUxFTUVOVF9fTkFNRSA9IE1FVEhPRF9FTEVNRU5UX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBWQVJJQUJJTElUWV9FTEVNRU5UX19HVUlEID0gTUVUSE9EX0VMRU1FTlRfX0dVSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBWQVJJQUJJTElUWV9FTEVNRU5UX19QUkVTRU5UQVRJT05fTkFNRSA9IE1FVEhPRF9FTEVNRU5UX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFZBUklBQklMSVRZX0VMRU1FTlRfX0JSSUVGX0RFU0NSSVBUSU9OID0gTUVUSE9EX0VMRU1FTlRfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBWQVJJQUJJTElUWV9FTEVNRU5UX19PV05FRF9SVUxFUyA9IE1FVEhPRF9FTEVNRU5UX19PV05FRF9SVUxFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVkFSSUFCSUxJVFlfRUxFTUVOVF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBNRVRIT0RfRUxFTUVOVF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+S2luZDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVkFSSUFCSUxJVFlfRUxFTUVOVF9fS0lORCA9IE1FVEhPRF9FTEVNRU5UX19LSU5EOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBWQVJJQUJJTElUWV9FTEVNRU5UX19TVVBQUkVTU0VEID0gTUVUSE9EX0VMRU1FTlRfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBWQVJJQUJJTElUWV9FTEVNRU5UX19PUkRFUklOR19HVUlERSA9IE1FVEhPRF9FTEVNRU5UX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVkFSSUFCSUxJVFlfRUxFTUVOVF9fVkFSSUFCSUxJVFlfVFlQRSA9IE1FVEhPRF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBWQVJJQUJJTElUWV9FTEVNRU5UX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UID0gTUVUSE9EX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+VmFyaWFiaWxpdHkgRWxlbWVudDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBWQVJJQUJJTElUWV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgPSBNRVRIT0RfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0VDVElPTl9fTkFNRSA9IFZBUklBQklMSVRZX0VMRU1FTlRfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNFQ1RJT05fX0dVSUQgPSBWQVJJQUJJTElUWV9FTEVNRU5UX19HVUlEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0VDVElPTl9fUFJFU0VOVEFUSU9OX05BTUUgPSBWQVJJQUJJTElUWV9FTEVNRU5UX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNFQ1RJT05fX0JSSUVGX0RFU0NSSVBUSU9OID0gVkFSSUFCSUxJVFlfRUxFTUVOVF9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNFQ1RJT05fX09XTkVEX1JVTEVTID0gVkFSSUFCSUxJVFlfRUxFTUVOVF9fT1dORURfUlVMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNFQ1RJT05fX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gVkFSSUFCSUxJVFlfRUxFTUVOVF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+S2luZDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0VDVElPTl9fS0lORCA9IFZBUklBQklMSVRZX0VMRU1FTlRfX0tJTkQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNFQ1RJT05fX1NVUFBSRVNTRUQgPSBWQVJJQUJJTElUWV9FTEVNRU5UX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0VDVElPTl9fT1JERVJJTkdfR1VJREUgPSBWQVJJQUJJTElUWV9FTEVNRU5UX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0VDVElPTl9fVkFSSUFCSUxJVFlfVFlQRSA9IFZBUklBQklMSVRZX0VMRU1FTlRfX1ZBUklBQklMSVRZX1RZUEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNFQ1RJT05fX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQgPSBWQVJJQUJJTElUWV9FTEVNRU5UX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNlY3Rpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNFQ1RJT05fX1NFQ1RJT05fTkFNRSA9IFZBUklBQklMSVRZX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2VjdGlvbiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNFQ1RJT05fX1NFQ1RJT05fREVTQ1JJUFRJT04gPSBWQVJJQUJJTElUWV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1YiBTZWN0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0VDVElPTl9fU1VCX1NFQ1RJT05TID0gVkFSSUFCSUxJVFlfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVkZWNlc3NvcjwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNFQ1RJT05fX1BSRURFQ0VTU09SID0gVkFSSUFCSUxJVFlfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMzsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5TZWN0aW9uPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNFQ1RJT05fRkVBVFVSRV9DT1VOVCA9IFZBUklBQklMSVRZX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTkNFUFRfX05BTUUgPSBHVUlEQU5DRV9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OQ0VQVF9fR1VJRCA9IEdVSURBTkNFX19HVUlEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OQ0VQVF9fUFJFU0VOVEFUSU9OX05BTUUgPSBHVUlEQU5DRV9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05DRVBUX19CUklFRl9ERVNDUklQVElPTiA9IEdVSURBTkNFX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OQ0VQVF9fT1dORURfUlVMRVMgPSBHVUlEQU5DRV9fT1dORURfUlVMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTkNFUFRfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gR1VJREFOQ0VfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPktpbmQ8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTkNFUFRfX0tJTkQgPSBHVUlEQU5DRV9fS0lORDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OQ0VQVF9fU1VQUFJFU1NFRCA9IEdVSURBTkNFX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OQ0VQVF9fT1JERVJJTkdfR1VJREUgPSBHVUlEQU5DRV9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgQWJzdHJhY3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05DRVBUX19JU19BQlNUUkFDVCA9IEdVSURBTkNFX19JU19BQlNUUkFDVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05DRVBUX19QUkVTRU5UQVRJT04gPSBHVUlEQU5DRV9fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNoYXBlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTkNFUFRfX1NIQVBFSUNPTiA9IEdVSURBTkNFX19TSEFQRUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm9kZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05DRVBUX19OT0RFSUNPTiA9IEdVSURBTkNFX19OT0RFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OQ0VQVF9fVkFSSUFCSUxJVFlfVFlQRSA9IEdVSURBTkNFX19WQVJJQUJJTElUWV9UWVBFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05DRVBUX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UID0gR1VJREFOQ0VfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcG9ydGluZyBNYXRlcmlhbHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTkNFUFRfX1NVUFBPUlRJTkdfTUFURVJJQUxTID0gR1VJREFOQ0VfX1NVUFBPUlRJTkdfTUFURVJJQUxTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbmNlcHRzIEFuZCBQYXBlcnM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTkNFUFRfX0NPTkNFUFRTX0FORF9QQVBFUlMgPSBHVUlEQU5DRV9fQ09OQ0VQVFNfQU5EX1BBUEVSUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGVja2xpc3RzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05DRVBUX19DSEVDS0xJU1RTID0gR1VJREFOQ0VfX0NIRUNLTElTVFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZGVsaW5lczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OQ0VQVF9fR1VJREVMSU5FUyA9IEdVSURBTkNFX19HVUlERUxJTkVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4YW1wbGVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05DRVBUX19FWEFNUExFUyA9IEdVSURBTkNFX19FWEFNUExFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Bc3NldHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTkNFUFRfX0FTU0VUUyA9IEdVSURBTkNFX19BU1NFVFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGVybWRlZmluaXRpb248L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTkNFUFRfX1RFUk1ERUZJTklUSU9OID0gR1VJREFOQ0VfX1RFUk1ERUZJTklUSU9OOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkNvbmNlcHQ8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OQ0VQVF9GRUFUVVJFX0NPVU5UID0gR1VJREFOQ0VfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENIRUNLTElTVF9fTkFNRSA9IEdVSURBTkNFX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDSEVDS0xJU1RfX0dVSUQgPSBHVUlEQU5DRV9fR1VJRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENIRUNLTElTVF9fUFJFU0VOVEFUSU9OX05BTUUgPSBHVUlEQU5DRV9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDSEVDS0xJU1RfX0JSSUVGX0RFU0NSSVBUSU9OID0gR1VJREFOQ0VfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDSEVDS0xJU1RfX09XTkVEX1JVTEVTID0gR1VJREFOQ0VfX09XTkVEX1JVTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDSEVDS0xJU1RfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gR1VJREFOQ0VfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPktpbmQ8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENIRUNLTElTVF9fS0lORCA9IEdVSURBTkNFX19LSU5EOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDSEVDS0xJU1RfX1NVUFBSRVNTRUQgPSBHVUlEQU5DRV9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENIRUNLTElTVF9fT1JERVJJTkdfR1VJREUgPSBHVUlEQU5DRV9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgQWJzdHJhY3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDSEVDS0xJU1RfX0lTX0FCU1RSQUNUID0gR1VJREFOQ0VfX0lTX0FCU1RSQUNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENIRUNLTElTVF9fUFJFU0VOVEFUSU9OID0gR1VJREFOQ0VfX1BSRVNFTlRBVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TaGFwZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDSEVDS0xJU1RfX1NIQVBFSUNPTiA9IEdVSURBTkNFX19TSEFQRUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm9kZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDSEVDS0xJU1RfX05PREVJQ09OID0gR1VJREFOQ0VfX05PREVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDSEVDS0xJU1RfX1ZBUklBQklMSVRZX1RZUEUgPSBHVUlEQU5DRV9fVkFSSUFCSUxJVFlfVFlQRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0hFQ0tMSVNUX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UID0gR1VJREFOQ0VfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcG9ydGluZyBNYXRlcmlhbHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENIRUNLTElTVF9fU1VQUE9SVElOR19NQVRFUklBTFMgPSBHVUlEQU5DRV9fU1VQUE9SVElOR19NQVRFUklBTFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29uY2VwdHMgQW5kIFBhcGVyczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0hFQ0tMSVNUX19DT05DRVBUU19BTkRfUEFQRVJTID0gR1VJREFOQ0VfX0NPTkNFUFRTX0FORF9QQVBFUlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hlY2tsaXN0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0hFQ0tMSVNUX19DSEVDS0xJU1RTID0gR1VJREFOQ0VfX0NIRUNLTElTVFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZGVsaW5lczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0hFQ0tMSVNUX19HVUlERUxJTkVTID0gR1VJREFOQ0VfX0dVSURFTElORVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXhhbXBsZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENIRUNLTElTVF9fRVhBTVBMRVMgPSBHVUlEQU5DRV9fRVhBTVBMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXNzZXRzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDSEVDS0xJU1RfX0FTU0VUUyA9IEdVSURBTkNFX19BU1NFVFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGVybWRlZmluaXRpb248L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENIRUNLTElTVF9fVEVSTURFRklOSVRJT04gPSBHVUlEQU5DRV9fVEVSTURFRklOSVRJT047Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+Q2hlY2tsaXN0PC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENIRUNLTElTVF9GRUFUVVJFX0NPVU5UID0gR1VJREFOQ0VfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURFTElORV9fTkFNRSA9IEdVSURBTkNFX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHVUlERUxJTkVfX0dVSUQgPSBHVUlEQU5DRV9fR1VJRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURFTElORV9fUFJFU0VOVEFUSU9OX05BTUUgPSBHVUlEQU5DRV9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHVUlERUxJTkVfX0JSSUVGX0RFU0NSSVBUSU9OID0gR1VJREFOQ0VfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHVUlERUxJTkVfX09XTkVEX1JVTEVTID0gR1VJREFOQ0VfX09XTkVEX1JVTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHVUlERUxJTkVfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gR1VJREFOQ0VfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPktpbmQ8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURFTElORV9fS0lORCA9IEdVSURBTkNFX19LSU5EOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHVUlERUxJTkVfX1NVUFBSRVNTRUQgPSBHVUlEQU5DRV9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURFTElORV9fT1JERVJJTkdfR1VJREUgPSBHVUlEQU5DRV9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgQWJzdHJhY3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHVUlERUxJTkVfX0lTX0FCU1RSQUNUID0gR1VJREFOQ0VfX0lTX0FCU1RSQUNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURFTElORV9fUFJFU0VOVEFUSU9OID0gR1VJREFOQ0VfX1BSRVNFTlRBVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TaGFwZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHVUlERUxJTkVfX1NIQVBFSUNPTiA9IEdVSURBTkNFX19TSEFQRUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm9kZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHVUlERUxJTkVfX05PREVJQ09OID0gR1VJREFOQ0VfX05PREVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHVUlERUxJTkVfX1ZBUklBQklMSVRZX1RZUEUgPSBHVUlEQU5DRV9fVkFSSUFCSUxJVFlfVFlQRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREVMSU5FX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UID0gR1VJREFOQ0VfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcG9ydGluZyBNYXRlcmlhbHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURFTElORV9fU1VQUE9SVElOR19NQVRFUklBTFMgPSBHVUlEQU5DRV9fU1VQUE9SVElOR19NQVRFUklBTFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29uY2VwdHMgQW5kIFBhcGVyczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREVMSU5FX19DT05DRVBUU19BTkRfUEFQRVJTID0gR1VJREFOQ0VfX0NPTkNFUFRTX0FORF9QQVBFUlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hlY2tsaXN0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREVMSU5FX19DSEVDS0xJU1RTID0gR1VJREFOQ0VfX0NIRUNLTElTVFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZGVsaW5lczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREVMSU5FX19HVUlERUxJTkVTID0gR1VJREFOQ0VfX0dVSURFTElORVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXhhbXBsZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURFTElORV9fRVhBTVBMRVMgPSBHVUlEQU5DRV9fRVhBTVBMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXNzZXRzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHVUlERUxJTkVfX0FTU0VUUyA9IEdVSURBTkNFX19BU1NFVFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGVybWRlZmluaXRpb248L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURFTElORV9fVEVSTURFRklOSVRJT04gPSBHVUlEQU5DRV9fVEVSTURFRklOSVRJT047Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+R3VpZGVsaW5lPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURFTElORV9GRUFUVVJFX0NPVU5UID0gR1VJREFOQ0VfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVYQU1QTEVfX05BTUUgPSBHVUlEQU5DRV9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVhBTVBMRV9fR1VJRCA9IEdVSURBTkNFX19HVUlEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVhBTVBMRV9fUFJFU0VOVEFUSU9OX05BTUUgPSBHVUlEQU5DRV9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFWEFNUExFX19CUklFRl9ERVNDUklQVElPTiA9IEdVSURBTkNFX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVhBTVBMRV9fT1dORURfUlVMRVMgPSBHVUlEQU5DRV9fT1dORURfUlVMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVYQU1QTEVfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gR1VJREFOQ0VfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPktpbmQ8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVYQU1QTEVfX0tJTkQgPSBHVUlEQU5DRV9fS0lORDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVhBTVBMRV9fU1VQUFJFU1NFRCA9IEdVSURBTkNFX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVhBTVBMRV9fT1JERVJJTkdfR1VJREUgPSBHVUlEQU5DRV9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgQWJzdHJhY3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFWEFNUExFX19JU19BQlNUUkFDVCA9IEdVSURBTkNFX19JU19BQlNUUkFDVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFWEFNUExFX19QUkVTRU5UQVRJT04gPSBHVUlEQU5DRV9fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNoYXBlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVYQU1QTEVfX1NIQVBFSUNPTiA9IEdVSURBTkNFX19TSEFQRUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm9kZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFWEFNUExFX19OT0RFSUNPTiA9IEdVSURBTkNFX19OT0RFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVhBTVBMRV9fVkFSSUFCSUxJVFlfVFlQRSA9IEdVSURBTkNFX19WQVJJQUJJTElUWV9UWVBFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFWEFNUExFX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UID0gR1VJREFOQ0VfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcG9ydGluZyBNYXRlcmlhbHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVYQU1QTEVfX1NVUFBPUlRJTkdfTUFURVJJQUxTID0gR1VJREFOQ0VfX1NVUFBPUlRJTkdfTUFURVJJQUxTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbmNlcHRzIEFuZCBQYXBlcnM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVYQU1QTEVfX0NPTkNFUFRTX0FORF9QQVBFUlMgPSBHVUlEQU5DRV9fQ09OQ0VQVFNfQU5EX1BBUEVSUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGVja2xpc3RzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFWEFNUExFX19DSEVDS0xJU1RTID0gR1VJREFOQ0VfX0NIRUNLTElTVFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZGVsaW5lczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVhBTVBMRV9fR1VJREVMSU5FUyA9IEdVSURBTkNFX19HVUlERUxJTkVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4YW1wbGVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFWEFNUExFX19FWEFNUExFUyA9IEdVSURBTkNFX19FWEFNUExFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Bc3NldHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVYQU1QTEVfX0FTU0VUUyA9IEdVSURBTkNFX19BU1NFVFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGVybWRlZmluaXRpb248L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVYQU1QTEVfX1RFUk1ERUZJTklUSU9OID0gR1VJREFOQ0VfX1RFUk1ERUZJTklUSU9OOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkV4YW1wbGU8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVhBTVBMRV9GRUFUVVJFX0NPVU5UID0gR1VJREFOQ0VfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Ub29sTWVudG9ySW1wbCA8ZW0+VG9vbCBNZW50b3I8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVG9vbE1lbnRvckltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRUb29sTWVudG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFRPT0xfTUVOVE9SID0gMzE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5XaGl0ZXBhcGVySW1wbCA8ZW0+V2hpdGVwYXBlcjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5XaGl0ZXBhcGVySW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFdoaXRlcGFwZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgV0hJVEVQQVBFUiA9IDM3OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVGVybURlZmluaXRpb25JbXBsIDxlbT5UZXJtIERlZmluaXRpb248L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVGVybURlZmluaXRpb25JbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0VGVybURlZmluaXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgVEVSTV9ERUZJTklUSU9OID0gMjQ7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5QcmFjdGljZUltcGwgPGVtPlByYWN0aWNlPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlByYWN0aWNlSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFByYWN0aWNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFBSQUNUSUNFID0gODA7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5SZXVzYWJsZUFzc2V0SW1wbCA8ZW0+UmV1c2FibGUgQXNzZXQ8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUmV1c2FibGVBc3NldEltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRSZXVzYWJsZUFzc2V0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFJFVVNBQkxFX0FTU0VUID0gMjM7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Db250ZW50Q2F0ZWdvcnlJbXBsIDxlbT5Db250ZW50IENhdGVnb3J5PC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkNvbnRlbnRDYXRlZ29yeUltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRDb250ZW50Q2F0ZWdvcnkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9DQVRFR09SWSA9IDQ4OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRGlzY2lwbGluZUltcGwgPGVtPkRpc2NpcGxpbmU8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRGlzY2lwbGluZUltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXREaXNjaXBsaW5lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IERJU0NJUExJTkUgPSA1MjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlJvbGVTZXRJbXBsIDxlbT5Sb2xlIFNldDwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Sb2xlU2V0SW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFJvbGVTZXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgUk9MRV9TRVQgPSA0NzsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkRvbWFpbkltcGwgPGVtPkRvbWFpbjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Eb21haW5JbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0RG9tYWluKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IERPTUFJTiA9IDQ5OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuV29ya1Byb2R1Y3RUeXBlSW1wbCA8ZW0+V29yayBQcm9kdWN0IFR5cGU8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuV29ya1Byb2R1Y3RUeXBlSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFdvcmtQcm9kdWN0VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfVFlQRSA9IDUwOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRGlzY2lwbGluZUdyb3VwaW5nSW1wbCA8ZW0+RGlzY2lwbGluZSBHcm91cGluZzwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5EaXNjaXBsaW5lR3JvdXBpbmdJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0RGlzY2lwbGluZUdyb3VwaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IERJU0NJUExJTkVfR1JPVVBJTkcgPSA1MTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlRvb2xJbXBsIDxlbT5Ub29sPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlRvb2xJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0VG9vbCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBUT09MID0gNjA7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Sb2xlU2V0R3JvdXBpbmdJbXBsIDxlbT5Sb2xlIFNldCBHcm91cGluZzwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Sb2xlU2V0R3JvdXBpbmdJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0Um9sZVNldEdyb3VwaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFJPTEVfU0VUX0dST1VQSU5HID0gNjE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5DdXN0b21DYXRlZ29yeUltcGwgPGVtPkN1c3RvbSBDYXRlZ29yeTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5DdXN0b21DYXRlZ29yeUltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRDdXN0b21DYXRlZ29yeSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBDVVNUT01fQ0FURUdPUlkgPSA2MjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlByb2Nlc3NJbXBsIDxlbT5Qcm9jZXNzPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlByb2Nlc3NJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0UHJvY2VzcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBQUk9DRVNTID0gNzU7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5EZWxpdmVyeVByb2Nlc3NJbXBsIDxlbT5EZWxpdmVyeSBQcm9jZXNzPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkRlbGl2ZXJ5UHJvY2Vzc0ltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXREZWxpdmVyeVByb2Nlc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTUyA9IDc0OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQ2FwYWJpbGl0eVBhdHRlcm5JbXBsIDxlbT5DYXBhYmlsaXR5IFBhdHRlcm48L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQ2FwYWJpbGl0eVBhdHRlcm5JbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0Q2FwYWJpbGl0eVBhdHRlcm4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgQ0FQQUJJTElUWV9QQVRURVJOID0gNzY7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Qcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZUltcGwgPGVtPlByb2Nlc3MgUGxhbm5pbmcgVGVtcGxhdGU8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGVJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0UHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QTEFOTklOR19URU1QTEFURSA9IDc5OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUm9hZG1hcEltcGwgPGVtPlJvYWRtYXA8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUm9hZG1hcEltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRSb2FkbWFwKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFJPQURNQVAgPSA1OTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlByb2Nlc3NQYWNrYWdlSW1wbCA8ZW0+UHJvY2VzcyBQYWNrYWdlPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlByb2Nlc3NQYWNrYWdlSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFByb2Nlc3NQYWNrYWdlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFBST0NFU1NfUEFDS0FHRSA9IDg4OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUHJvY2Vzc0NvbXBvbmVudEltcGwgPGVtPlByb2Nlc3MgQ29tcG9uZW50PC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlByb2Nlc3NDb21wb25lbnRJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0UHJvY2Vzc0NvbXBvbmVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVCA9IDg3OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZUltcGwgPGVtPlByb2Nlc3MgQ29tcG9uZW50IEludGVyZmFjZTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfSU5URVJGQUNFID0gMTAxOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3JJbXBsIDxlbT5Qcm9jZXNzIENvbXBvbmVudCBEZXNjcmlwdG9yPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlByb2Nlc3NDb21wb25lbnREZXNjcmlwdG9ySW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFByb2Nlc3NDb21wb25lbnREZXNjcmlwdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX0RFU0NSSVBUT1IgPSA4NjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLk1ldGhvZFBsdWdpbkltcGwgPGVtPk1ldGhvZCBQbHVnaW48L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuTWV0aG9kUGx1Z2luSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldE1ldGhvZFBsdWdpbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBNRVRIT0RfUExVR0lOID0gNzg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFVVNBQkxFX0FTU0VUX19OQU1FID0gR1VJREFOQ0VfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFVVNBQkxFX0FTU0VUX19HVUlEID0gR1VJREFOQ0VfX0dVSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVVTQUJMRV9BU1NFVF9fUFJFU0VOVEFUSU9OX05BTUUgPSBHVUlEQU5DRV9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVVTQUJMRV9BU1NFVF9fQlJJRUZfREVTQ1JJUFRJT04gPSBHVUlEQU5DRV9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFVVNBQkxFX0FTU0VUX19PV05FRF9SVUxFUyA9IEdVSURBTkNFX19PV05FRF9SVUxFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVVU0FCTEVfQVNTRVRfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gR1VJREFOQ0VfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPktpbmQ8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFVVNBQkxFX0FTU0VUX19LSU5EID0gR1VJREFOQ0VfX0tJTkQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFVVNBQkxFX0FTU0VUX19TVVBQUkVTU0VEID0gR1VJREFOQ0VfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVVTQUJMRV9BU1NFVF9fT1JERVJJTkdfR1VJREUgPSBHVUlEQU5DRV9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgQWJzdHJhY3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVVTQUJMRV9BU1NFVF9fSVNfQUJTVFJBQ1QgPSBHVUlEQU5DRV9fSVNfQUJTVFJBQ1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVVU0FCTEVfQVNTRVRfX1BSRVNFTlRBVElPTiA9IEdVSURBTkNFX19QUkVTRU5UQVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2hhcGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVVU0FCTEVfQVNTRVRfX1NIQVBFSUNPTiA9IEdVSURBTkNFX19TSEFQRUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm9kZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVVTQUJMRV9BU1NFVF9fTk9ERUlDT04gPSBHVUlEQU5DRV9fTk9ERUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFVVNBQkxFX0FTU0VUX19WQVJJQUJJTElUWV9UWVBFID0gR1VJREFOQ0VfX1ZBUklBQklMSVRZX1RZUEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFVVNBQkxFX0FTU0VUX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UID0gR1VJREFOQ0VfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcG9ydGluZyBNYXRlcmlhbHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFVVNBQkxFX0FTU0VUX19TVVBQT1JUSU5HX01BVEVSSUFMUyA9IEdVSURBTkNFX19TVVBQT1JUSU5HX01BVEVSSUFMUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db25jZXB0cyBBbmQgUGFwZXJzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVVTQUJMRV9BU1NFVF9fQ09OQ0VQVFNfQU5EX1BBUEVSUyA9IEdVSURBTkNFX19DT05DRVBUU19BTkRfUEFQRVJTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoZWNrbGlzdHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFVVNBQkxFX0FTU0VUX19DSEVDS0xJU1RTID0gR1VJREFOQ0VfX0NIRUNLTElTVFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZGVsaW5lczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVVU0FCTEVfQVNTRVRfX0dVSURFTElORVMgPSBHVUlEQU5DRV9fR1VJREVMSU5FUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeGFtcGxlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVVU0FCTEVfQVNTRVRfX0VYQU1QTEVTID0gR1VJREFOQ0VfX0VYQU1QTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFzc2V0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVVU0FCTEVfQVNTRVRfX0FTU0VUUyA9IEdVSURBTkNFX19BU1NFVFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGVybWRlZmluaXRpb248L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFVVNBQkxFX0FTU0VUX19URVJNREVGSU5JVElPTiA9IEdVSURBTkNFX19URVJNREVGSU5JVElPTjsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5SZXVzYWJsZSBBc3NldDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVVTQUJMRV9BU1NFVF9GRUFUVVJFX0NPVU5UID0gR1VJREFOQ0VfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFUk1fREVGSU5JVElPTl9fTkFNRSA9IEdVSURBTkNFX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURVJNX0RFRklOSVRJT05fX0dVSUQgPSBHVUlEQU5DRV9fR1VJRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFUk1fREVGSU5JVElPTl9fUFJFU0VOVEFUSU9OX05BTUUgPSBHVUlEQU5DRV9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURVJNX0RFRklOSVRJT05fX0JSSUVGX0RFU0NSSVBUSU9OID0gR1VJREFOQ0VfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURVJNX0RFRklOSVRJT05fX09XTkVEX1JVTEVTID0gR1VJREFOQ0VfX09XTkVEX1JVTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURVJNX0RFRklOSVRJT05fX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gR1VJREFOQ0VfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPktpbmQ8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFUk1fREVGSU5JVElPTl9fS0lORCA9IEdVSURBTkNFX19LSU5EOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURVJNX0RFRklOSVRJT05fX1NVUFBSRVNTRUQgPSBHVUlEQU5DRV9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFUk1fREVGSU5JVElPTl9fT1JERVJJTkdfR1VJREUgPSBHVUlEQU5DRV9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgQWJzdHJhY3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURVJNX0RFRklOSVRJT05fX0lTX0FCU1RSQUNUID0gR1VJREFOQ0VfX0lTX0FCU1RSQUNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFUk1fREVGSU5JVElPTl9fUFJFU0VOVEFUSU9OID0gR1VJREFOQ0VfX1BSRVNFTlRBVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TaGFwZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURVJNX0RFRklOSVRJT05fX1NIQVBFSUNPTiA9IEdVSURBTkNFX19TSEFQRUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm9kZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURVJNX0RFRklOSVRJT05fX05PREVJQ09OID0gR1VJREFOQ0VfX05PREVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURVJNX0RFRklOSVRJT05fX1ZBUklBQklMSVRZX1RZUEUgPSBHVUlEQU5DRV9fVkFSSUFCSUxJVFlfVFlQRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVSTV9ERUZJTklUSU9OX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UID0gR1VJREFOQ0VfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcG9ydGluZyBNYXRlcmlhbHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFUk1fREVGSU5JVElPTl9fU1VQUE9SVElOR19NQVRFUklBTFMgPSBHVUlEQU5DRV9fU1VQUE9SVElOR19NQVRFUklBTFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29uY2VwdHMgQW5kIFBhcGVyczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVSTV9ERUZJTklUSU9OX19DT05DRVBUU19BTkRfUEFQRVJTID0gR1VJREFOQ0VfX0NPTkNFUFRTX0FORF9QQVBFUlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hlY2tsaXN0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVSTV9ERUZJTklUSU9OX19DSEVDS0xJU1RTID0gR1VJREFOQ0VfX0NIRUNLTElTVFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZGVsaW5lczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVSTV9ERUZJTklUSU9OX19HVUlERUxJTkVTID0gR1VJREFOQ0VfX0dVSURFTElORVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXhhbXBsZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFUk1fREVGSU5JVElPTl9fRVhBTVBMRVMgPSBHVUlEQU5DRV9fRVhBTVBMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXNzZXRzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURVJNX0RFRklOSVRJT05fX0FTU0VUUyA9IEdVSURBTkNFX19BU1NFVFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGVybWRlZmluaXRpb248L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFUk1fREVGSU5JVElPTl9fVEVSTURFRklOSVRJT04gPSBHVUlEQU5DRV9fVEVSTURFRklOSVRJT047Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+VGVybSBEZWZpbml0aW9uPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFUk1fREVGSU5JVElPTl9GRUFUVVJFX0NPVU5UID0gR1VJREFOQ0VfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5BcHBsaWNhYmxlTWV0YUNsYXNzSW5mb0ltcGwgPGVtPkFwcGxpY2FibGUgTWV0YSBDbGFzcyBJbmZvPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldEFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IEFQUExJQ0FCTEVfTUVUQV9DTEFTU19JTkZPID0gMjU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFQUExJQ0FCTEVfTUVUQV9DTEFTU19JTkZPX19OQU1FID0gQ0xBU1NJRklFUl9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBBYnN0cmFjdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFQUExJQ0FCTEVfTUVUQV9DTEFTU19JTkZPX19JU19BQlNUUkFDVCA9IENMQVNTSUZJRVJfX0lTX0FCU1RSQUNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIFByaW1hcnkgRXh0ZW5zaW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVBQTElDQUJMRV9NRVRBX0NMQVNTX0lORk9fX0lTX1BSSU1BUllfRVhURU5TSU9OID0gQ0xBU1NJRklFUl9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5BcHBsaWNhYmxlIE1ldGEgQ2xhc3MgSW5mbzwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUFBMSUNBQkxFX01FVEFfQ0xBU1NfSU5GT19GRUFUVVJFX0NPVU5UID0gQ0xBU1NJRklFUl9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX19OQU1FID0gQ09OVEVOVF9FTEVNRU5UX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfX0dVSUQgPSBDT05URU5UX0VMRU1FTlRfX0dVSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfX1BSRVNFTlRBVElPTl9OQU1FID0gQ09OVEVOVF9FTEVNRU5UX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9fQlJJRUZfREVTQ1JJUFRJT04gPSBDT05URU5UX0VMRU1FTlRfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfX09XTkVEX1JVTEVTID0gQ09OVEVOVF9FTEVNRU5UX19PV05FRF9SVUxFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IENPTlRFTlRfRUxFTUVOVF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+S2luZDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX19LSU5EID0gQ09OVEVOVF9FTEVNRU5UX19LSU5EOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfX1NVUFBSRVNTRUQgPSBDT05URU5UX0VMRU1FTlRfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfX09SREVSSU5HX0dVSURFID0gQ09OVEVOVF9FTEVNRU5UX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBBYnN0cmFjdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9fSVNfQUJTVFJBQ1QgPSBDT05URU5UX0VMRU1FTlRfX0lTX0FCU1RSQUNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9fUFJFU0VOVEFUSU9OID0gQ09OVEVOVF9FTEVNRU5UX19QUkVTRU5UQVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2hhcGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX19TSEFQRUlDT04gPSBDT05URU5UX0VMRU1FTlRfX1NIQVBFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob2RlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9fTk9ERUlDT04gPSBDT05URU5UX0VMRU1FTlRfX05PREVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfX1ZBUklBQklMSVRZX1RZUEUgPSBDT05URU5UX0VMRU1FTlRfX1ZBUklBQklMSVRZX1RZUEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVCA9IENPTlRFTlRfRUxFTUVOVF9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwb3J0aW5nIE1hdGVyaWFsczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX19TVVBQT1JUSU5HX01BVEVSSUFMUyA9IENPTlRFTlRfRUxFTUVOVF9fU1VQUE9SVElOR19NQVRFUklBTFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29uY2VwdHMgQW5kIFBhcGVyczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX19DT05DRVBUU19BTkRfUEFQRVJTID0gQ09OVEVOVF9FTEVNRU5UX19DT05DRVBUU19BTkRfUEFQRVJTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoZWNrbGlzdHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9fQ0hFQ0tMSVNUUyA9IENPTlRFTlRfRUxFTUVOVF9fQ0hFQ0tMSVNUUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkZWxpbmVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfX0dVSURFTElORVMgPSBDT05URU5UX0VMRU1FTlRfX0dVSURFTElORVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXhhbXBsZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9fRVhBTVBMRVMgPSBDT05URU5UX0VMRU1FTlRfX0VYQU1QTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFzc2V0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX19BU1NFVFMgPSBDT05URU5UX0VMRU1FTlRfX0FTU0VUUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UZXJtZGVmaW5pdGlvbjwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX19URVJNREVGSU5JVElPTiA9IENPTlRFTlRfRUxFTUVOVF9fVEVSTURFRklOSVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RnVsZmlsbHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9fRlVMRklMTFMgPSBDT05URU5UX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVwb3J0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX19SRVBPUlRTID0gQ09OVEVOVF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRlbXBsYXRlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX19URU1QTEFURVMgPSBDT05URU5UX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VG9vbCBNZW50b3JzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfX1RPT0xfTUVOVE9SUyA9IENPTlRFTlRfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Fc3RpbWF0aW9uIENvbnNpZGVyYXRpb25zPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfX0VTVElNQVRJT05fQ09OU0lERVJBVElPTlMgPSBDT05URU5UX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDQ7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+V29yayBQcm9kdWN0PC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9GRUFUVVJFX0NPVU5UID0gQ09OVEVOVF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlRJRkFDVF9fTkFNRSA9IFdPUktfUFJPRFVDVF9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1RfX0dVSUQgPSBXT1JLX1BST0RVQ1RfX0dVSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlRJRkFDVF9fUFJFU0VOVEFUSU9OX05BTUUgPSBXT1JLX1BST0RVQ1RfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1RfX0JSSUVGX0RFU0NSSVBUSU9OID0gV09SS19QUk9EVUNUX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1RfX09XTkVEX1JVTEVTID0gV09SS19QUk9EVUNUX19PV05FRF9SVUxFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1RfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gV09SS19QUk9EVUNUX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5LaW5kPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlRJRkFDVF9fS0lORCA9IFdPUktfUFJPRFVDVF9fS0lORDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1RfX1NVUFBSRVNTRUQgPSBXT1JLX1BST0RVQ1RfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlRJRkFDVF9fT1JERVJJTkdfR1VJREUgPSBXT1JLX1BST0RVQ1RfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIEFic3RyYWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1RfX0lTX0FCU1RSQUNUID0gV09SS19QUk9EVUNUX19JU19BQlNUUkFDVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlRJRkFDVF9fUFJFU0VOVEFUSU9OID0gV09SS19QUk9EVUNUX19QUkVTRU5UQVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2hhcGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1RfX1NIQVBFSUNPTiA9IFdPUktfUFJPRFVDVF9fU0hBUEVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1RfX05PREVJQ09OID0gV09SS19QUk9EVUNUX19OT0RFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1RfX1ZBUklBQklMSVRZX1RZUEUgPSBXT1JLX1BST0RVQ1RfX1ZBUklBQklMSVRZX1RZUEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSVElGQUNUX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UID0gV09SS19QUk9EVUNUX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHBvcnRpbmcgTWF0ZXJpYWxzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlRJRkFDVF9fU1VQUE9SVElOR19NQVRFUklBTFMgPSBXT1JLX1BST0RVQ1RfX1NVUFBPUlRJTkdfTUFURVJJQUxTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbmNlcHRzIEFuZCBQYXBlcnM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSVElGQUNUX19DT05DRVBUU19BTkRfUEFQRVJTID0gV09SS19QUk9EVUNUX19DT05DRVBUU19BTkRfUEFQRVJTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoZWNrbGlzdHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSVElGQUNUX19DSEVDS0xJU1RTID0gV09SS19QUk9EVUNUX19DSEVDS0xJU1RTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWRlbGluZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSVElGQUNUX19HVUlERUxJTkVTID0gV09SS19QUk9EVUNUX19HVUlERUxJTkVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4YW1wbGVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlRJRkFDVF9fRVhBTVBMRVMgPSBXT1JLX1BST0RVQ1RfX0VYQU1QTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFzc2V0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1RfX0FTU0VUUyA9IFdPUktfUFJPRFVDVF9fQVNTRVRTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRlcm1kZWZpbml0aW9uPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlRJRkFDVF9fVEVSTURFRklOSVRJT04gPSBXT1JLX1BST0RVQ1RfX1RFUk1ERUZJTklUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZ1bGZpbGxzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlRJRkFDVF9fRlVMRklMTFMgPSBXT1JLX1BST0RVQ1RfX0ZVTEZJTExTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlcG9ydHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSVElGQUNUX19SRVBPUlRTID0gV09SS19QUk9EVUNUX19SRVBPUlRTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRlbXBsYXRlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1RfX1RFTVBMQVRFUyA9IFdPUktfUFJPRFVDVF9fVEVNUExBVEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRvb2wgTWVudG9yczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1RfX1RPT0xfTUVOVE9SUyA9IFdPUktfUFJPRFVDVF9fVE9PTF9NRU5UT1JTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVzdGltYXRpb24gQ29uc2lkZXJhdGlvbnM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSVElGQUNUX19FU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TID0gV09SS19QUk9EVUNUX19FU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbnRhaW5lciBBcnRpZmFjdDwvYj48L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlRJRkFDVF9fQ09OVEFJTkVSX0FSVElGQUNUID0gV09SS19QUk9EVUNUX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbnRhaW5lZCBBcnRpZmFjdHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSVElGQUNUX19DT05UQUlORURfQVJUSUZBQ1RTID0gV09SS19QUk9EVUNUX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkFydGlmYWN0PC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSVElGQUNUX0ZFQVRVUkVfQ09VTlQgPSBXT1JLX1BST0RVQ1RfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEZVTEZJTExBQkxFX0VMRU1FTlRfX05BTUUgPSBERVNDUklCQUJMRV9FTEVNRU5UX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBGVUxGSUxMQUJMRV9FTEVNRU5UX19HVUlEID0gREVTQ1JJQkFCTEVfRUxFTUVOVF9fR1VJRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEZVTEZJTExBQkxFX0VMRU1FTlRfX1BSRVNFTlRBVElPTl9OQU1FID0gREVTQ1JJQkFCTEVfRUxFTUVOVF9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBGVUxGSUxMQUJMRV9FTEVNRU5UX19CUklFRl9ERVNDUklQVElPTiA9IERFU0NSSUJBQkxFX0VMRU1FTlRfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBGVUxGSUxMQUJMRV9FTEVNRU5UX19PV05FRF9SVUxFUyA9IERFU0NSSUJBQkxFX0VMRU1FTlRfX09XTkVEX1JVTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBGVUxGSUxMQUJMRV9FTEVNRU5UX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IERFU0NSSUJBQkxFX0VMRU1FTlRfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPktpbmQ8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEZVTEZJTExBQkxFX0VMRU1FTlRfX0tJTkQgPSBERVNDUklCQUJMRV9FTEVNRU5UX19LSU5EOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBGVUxGSUxMQUJMRV9FTEVNRU5UX19TVVBQUkVTU0VEID0gREVTQ1JJQkFCTEVfRUxFTUVOVF9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEZVTEZJTExBQkxFX0VMRU1FTlRfX09SREVSSU5HX0dVSURFID0gREVTQ1JJQkFCTEVfRUxFTUVOVF9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgQWJzdHJhY3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBGVUxGSUxMQUJMRV9FTEVNRU5UX19JU19BQlNUUkFDVCA9IERFU0NSSUJBQkxFX0VMRU1FTlRfX0lTX0FCU1RSQUNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEZVTEZJTExBQkxFX0VMRU1FTlRfX1BSRVNFTlRBVElPTiA9IERFU0NSSUJBQkxFX0VMRU1FTlRfX1BSRVNFTlRBVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TaGFwZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBGVUxGSUxMQUJMRV9FTEVNRU5UX19TSEFQRUlDT04gPSBERVNDUklCQUJMRV9FTEVNRU5UX19TSEFQRUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm9kZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBGVUxGSUxMQUJMRV9FTEVNRU5UX19OT0RFSUNPTiA9IERFU0NSSUJBQkxFX0VMRU1FTlRfX05PREVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZ1bGZpbGxzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBGVUxGSUxMQUJMRV9FTEVNRU5UX19GVUxGSUxMUyA9IERFU0NSSUJBQkxFX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+RnVsZmlsbGFibGUgRWxlbWVudDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBGVUxGSUxMQUJMRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgPSBERVNDUklCQUJMRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVBPUlRfX05BTUUgPSBHVUlEQU5DRV9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVQT1JUX19HVUlEID0gR1VJREFOQ0VfX0dVSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVBPUlRfX1BSRVNFTlRBVElPTl9OQU1FID0gR1VJREFOQ0VfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVQT1JUX19CUklFRl9ERVNDUklQVElPTiA9IEdVSURBTkNFX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVQT1JUX19PV05FRF9SVUxFUyA9IEdVSURBTkNFX19PV05FRF9SVUxFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVQT1JUX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IEdVSURBTkNFX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5LaW5kPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVBPUlRfX0tJTkQgPSBHVUlEQU5DRV9fS0lORDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVQT1JUX19TVVBQUkVTU0VEID0gR1VJREFOQ0VfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVBPUlRfX09SREVSSU5HX0dVSURFID0gR1VJREFOQ0VfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIEFic3RyYWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVQT1JUX19JU19BQlNUUkFDVCA9IEdVSURBTkNFX19JU19BQlNUUkFDVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVBPUlRfX1BSRVNFTlRBVElPTiA9IEdVSURBTkNFX19QUkVTRU5UQVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2hhcGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVQT1JUX19TSEFQRUlDT04gPSBHVUlEQU5DRV9fU0hBUEVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVQT1JUX19OT0RFSUNPTiA9IEdVSURBTkNFX19OT0RFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVQT1JUX19WQVJJQUJJTElUWV9UWVBFID0gR1VJREFOQ0VfX1ZBUklBQklMSVRZX1RZUEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFUE9SVF9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVCA9IEdVSURBTkNFX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHBvcnRpbmcgTWF0ZXJpYWxzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVBPUlRfX1NVUFBPUlRJTkdfTUFURVJJQUxTID0gR1VJREFOQ0VfX1NVUFBPUlRJTkdfTUFURVJJQUxTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbmNlcHRzIEFuZCBQYXBlcnM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFUE9SVF9fQ09OQ0VQVFNfQU5EX1BBUEVSUyA9IEdVSURBTkNFX19DT05DRVBUU19BTkRfUEFQRVJTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoZWNrbGlzdHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFUE9SVF9fQ0hFQ0tMSVNUUyA9IEdVSURBTkNFX19DSEVDS0xJU1RTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWRlbGluZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFUE9SVF9fR1VJREVMSU5FUyA9IEdVSURBTkNFX19HVUlERUxJTkVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4YW1wbGVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVBPUlRfX0VYQU1QTEVTID0gR1VJREFOQ0VfX0VYQU1QTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFzc2V0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVQT1JUX19BU1NFVFMgPSBHVUlEQU5DRV9fQVNTRVRTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRlcm1kZWZpbml0aW9uPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVBPUlRfX1RFUk1ERUZJTklUSU9OID0gR1VJREFOQ0VfX1RFUk1ERUZJTklUSU9OOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlJlcG9ydDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVBPUlRfRkVBVFVSRV9DT1VOVCA9IEdVSURBTkNFX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURU1QTEFURV9fTkFNRSA9IEdVSURBTkNFX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURU1QTEFURV9fR1VJRCA9IEdVSURBTkNFX19HVUlEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVNUExBVEVfX1BSRVNFTlRBVElPTl9OQU1FID0gR1VJREFOQ0VfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVNUExBVEVfX0JSSUVGX0RFU0NSSVBUSU9OID0gR1VJREFOQ0VfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURU1QTEFURV9fT1dORURfUlVMRVMgPSBHVUlEQU5DRV9fT1dORURfUlVMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFTVBMQVRFX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IEdVSURBTkNFX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5LaW5kPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURU1QTEFURV9fS0lORCA9IEdVSURBTkNFX19LSU5EOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURU1QTEFURV9fU1VQUFJFU1NFRCA9IEdVSURBTkNFX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVNUExBVEVfX09SREVSSU5HX0dVSURFID0gR1VJREFOQ0VfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIEFic3RyYWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVNUExBVEVfX0lTX0FCU1RSQUNUID0gR1VJREFOQ0VfX0lTX0FCU1RSQUNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFTVBMQVRFX19QUkVTRU5UQVRJT04gPSBHVUlEQU5DRV9fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNoYXBlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFTVBMQVRFX19TSEFQRUlDT04gPSBHVUlEQU5DRV9fU0hBUEVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVNUExBVEVfX05PREVJQ09OID0gR1VJREFOQ0VfX05PREVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURU1QTEFURV9fVkFSSUFCSUxJVFlfVFlQRSA9IEdVSURBTkNFX19WQVJJQUJJTElUWV9UWVBFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURU1QTEFURV9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVCA9IEdVSURBTkNFX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHBvcnRpbmcgTWF0ZXJpYWxzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURU1QTEFURV9fU1VQUE9SVElOR19NQVRFUklBTFMgPSBHVUlEQU5DRV9fU1VQUE9SVElOR19NQVRFUklBTFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29uY2VwdHMgQW5kIFBhcGVyczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVNUExBVEVfX0NPTkNFUFRTX0FORF9QQVBFUlMgPSBHVUlEQU5DRV9fQ09OQ0VQVFNfQU5EX1BBUEVSUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGVja2xpc3RzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURU1QTEFURV9fQ0hFQ0tMSVNUUyA9IEdVSURBTkNFX19DSEVDS0xJU1RTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWRlbGluZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFTVBMQVRFX19HVUlERUxJTkVTID0gR1VJREFOQ0VfX0dVSURFTElORVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXhhbXBsZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFTVBMQVRFX19FWEFNUExFUyA9IEdVSURBTkNFX19FWEFNUExFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Bc3NldHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFTVBMQVRFX19BU1NFVFMgPSBHVUlEQU5DRV9fQVNTRVRTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRlcm1kZWZpbml0aW9uPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURU1QTEFURV9fVEVSTURFRklOSVRJT04gPSBHVUlEQU5DRV9fVEVSTURFRklOSVRJT047Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+VGVtcGxhdGU8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVNUExBVEVfRkVBVFVSRV9DT1VOVCA9IEdVSURBTkNFX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUT09MX01FTlRPUl9fTkFNRSA9IEdVSURBTkNFX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUT09MX01FTlRPUl9fR1VJRCA9IEdVSURBTkNFX19HVUlEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVE9PTF9NRU5UT1JfX1BSRVNFTlRBVElPTl9OQU1FID0gR1VJREFOQ0VfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVE9PTF9NRU5UT1JfX0JSSUVGX0RFU0NSSVBUSU9OID0gR1VJREFOQ0VfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUT09MX01FTlRPUl9fT1dORURfUlVMRVMgPSBHVUlEQU5DRV9fT1dORURfUlVMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRPT0xfTUVOVE9SX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IEdVSURBTkNFX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5LaW5kPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUT09MX01FTlRPUl9fS0lORCA9IEdVSURBTkNFX19LSU5EOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUT09MX01FTlRPUl9fU1VQUFJFU1NFRCA9IEdVSURBTkNFX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVE9PTF9NRU5UT1JfX09SREVSSU5HX0dVSURFID0gR1VJREFOQ0VfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIEFic3RyYWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVE9PTF9NRU5UT1JfX0lTX0FCU1RSQUNUID0gR1VJREFOQ0VfX0lTX0FCU1RSQUNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRPT0xfTUVOVE9SX19QUkVTRU5UQVRJT04gPSBHVUlEQU5DRV9fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNoYXBlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRPT0xfTUVOVE9SX19TSEFQRUlDT04gPSBHVUlEQU5DRV9fU0hBUEVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVE9PTF9NRU5UT1JfX05PREVJQ09OID0gR1VJREFOQ0VfX05PREVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUT09MX01FTlRPUl9fVkFSSUFCSUxJVFlfVFlQRSA9IEdVSURBTkNFX19WQVJJQUJJTElUWV9UWVBFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUT09MX01FTlRPUl9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVCA9IEdVSURBTkNFX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHBvcnRpbmcgTWF0ZXJpYWxzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUT09MX01FTlRPUl9fU1VQUE9SVElOR19NQVRFUklBTFMgPSBHVUlEQU5DRV9fU1VQUE9SVElOR19NQVRFUklBTFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29uY2VwdHMgQW5kIFBhcGVyczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVE9PTF9NRU5UT1JfX0NPTkNFUFRTX0FORF9QQVBFUlMgPSBHVUlEQU5DRV9fQ09OQ0VQVFNfQU5EX1BBUEVSUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGVja2xpc3RzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUT09MX01FTlRPUl9fQ0hFQ0tMSVNUUyA9IEdVSURBTkNFX19DSEVDS0xJU1RTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWRlbGluZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRPT0xfTUVOVE9SX19HVUlERUxJTkVTID0gR1VJREFOQ0VfX0dVSURFTElORVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXhhbXBsZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRPT0xfTUVOVE9SX19FWEFNUExFUyA9IEdVSURBTkNFX19FWEFNUExFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Bc3NldHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRPT0xfTUVOVE9SX19BU1NFVFMgPSBHVUlEQU5DRV9fQVNTRVRTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRlcm1kZWZpbml0aW9uPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUT09MX01FTlRPUl9fVEVSTURFRklOSVRJT04gPSBHVUlEQU5DRV9fVEVSTURFRklOSVRJT047Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+VG9vbCBNZW50b3I8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVE9PTF9NRU5UT1JfRkVBVFVSRV9DT1VOVCA9IEdVSURBTkNFX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TX19OQU1FID0gR1VJREFOQ0VfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVTVElNQVRJT05fQ09OU0lERVJBVElPTlNfX0dVSUQgPSBHVUlEQU5DRV9fR1VJRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVTVElNQVRJT05fQ09OU0lERVJBVElPTlNfX1BSRVNFTlRBVElPTl9OQU1FID0gR1VJREFOQ0VfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVNUSU1BVElPTl9DT05TSURFUkFUSU9OU19fQlJJRUZfREVTQ1JJUFRJT04gPSBHVUlEQU5DRV9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVTVElNQVRJT05fQ09OU0lERVJBVElPTlNfX09XTkVEX1JVTEVTID0gR1VJREFOQ0VfX09XTkVEX1JVTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IEdVSURBTkNFX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5LaW5kPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TX19LSU5EID0gR1VJREFOQ0VfX0tJTkQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVTVElNQVRJT05fQ09OU0lERVJBVElPTlNfX1NVUFBSRVNTRUQgPSBHVUlEQU5DRV9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVTVElNQVRJT05fQ09OU0lERVJBVElPTlNfX09SREVSSU5HX0dVSURFID0gR1VJREFOQ0VfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIEFic3RyYWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVNUSU1BVElPTl9DT05TSURFUkFUSU9OU19fSVNfQUJTVFJBQ1QgPSBHVUlEQU5DRV9fSVNfQUJTVFJBQ1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVNUSU1BVElPTl9DT05TSURFUkFUSU9OU19fUFJFU0VOVEFUSU9OID0gR1VJREFOQ0VfX1BSRVNFTlRBVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TaGFwZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TX19TSEFQRUlDT04gPSBHVUlEQU5DRV9fU0hBUEVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVNUSU1BVElPTl9DT05TSURFUkFUSU9OU19fTk9ERUlDT04gPSBHVUlEQU5DRV9fTk9ERUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVTVElNQVRJT05fQ09OU0lERVJBVElPTlNfX1ZBUklBQklMSVRZX1RZUEUgPSBHVUlEQU5DRV9fVkFSSUFCSUxJVFlfVFlQRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVNUSU1BVElPTl9DT05TSURFUkFUSU9OU19fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVCA9IEdVSURBTkNFX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHBvcnRpbmcgTWF0ZXJpYWxzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TX19TVVBQT1JUSU5HX01BVEVSSUFMUyA9IEdVSURBTkNFX19TVVBQT1JUSU5HX01BVEVSSUFMUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db25jZXB0cyBBbmQgUGFwZXJzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TX19DT05DRVBUU19BTkRfUEFQRVJTID0gR1VJREFOQ0VfX0NPTkNFUFRTX0FORF9QQVBFUlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hlY2tsaXN0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVNUSU1BVElPTl9DT05TSURFUkFUSU9OU19fQ0hFQ0tMSVNUUyA9IEdVSURBTkNFX19DSEVDS0xJU1RTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWRlbGluZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVTVElNQVRJT05fQ09OU0lERVJBVElPTlNfX0dVSURFTElORVMgPSBHVUlEQU5DRV9fR1VJREVMSU5FUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeGFtcGxlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVNUSU1BVElPTl9DT05TSURFUkFUSU9OU19fRVhBTVBMRVMgPSBHVUlEQU5DRV9fRVhBTVBMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXNzZXRzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TX19BU1NFVFMgPSBHVUlEQU5DRV9fQVNTRVRTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRlcm1kZWZpbml0aW9uPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TX19URVJNREVGSU5JVElPTiA9IEdVSURBTkNFX19URVJNREVGSU5JVElPTjsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Fc3RpbWF0aW9uIENvbnNpZGVyYXRpb25zPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVTVElNQVRJT05fQ09OU0lERVJBVElPTlNfRkVBVFVSRV9DT1VOVCA9IEdVSURBTkNFX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSQUJMRV9fTkFNRSA9IFdPUktfUFJPRFVDVF9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUkFCTEVfX0dVSUQgPSBXT1JLX1BST0RVQ1RfX0dVSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSQUJMRV9fUFJFU0VOVEFUSU9OX05BTUUgPSBXT1JLX1BST0RVQ1RfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUkFCTEVfX0JSSUVGX0RFU0NSSVBUSU9OID0gV09SS19QUk9EVUNUX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUkFCTEVfX09XTkVEX1JVTEVTID0gV09SS19QUk9EVUNUX19PV05FRF9SVUxFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUkFCTEVfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gV09SS19QUk9EVUNUX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5LaW5kPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSQUJMRV9fS0lORCA9IFdPUktfUFJPRFVDVF9fS0lORDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUkFCTEVfX1NVUFBSRVNTRUQgPSBXT1JLX1BST0RVQ1RfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSQUJMRV9fT1JERVJJTkdfR1VJREUgPSBXT1JLX1BST0RVQ1RfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIEFic3RyYWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUkFCTEVfX0lTX0FCU1RSQUNUID0gV09SS19QUk9EVUNUX19JU19BQlNUUkFDVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSQUJMRV9fUFJFU0VOVEFUSU9OID0gV09SS19QUk9EVUNUX19QUkVTRU5UQVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2hhcGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUkFCTEVfX1NIQVBFSUNPTiA9IFdPUktfUFJPRFVDVF9fU0hBUEVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUkFCTEVfX05PREVJQ09OID0gV09SS19QUk9EVUNUX19OT0RFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUkFCTEVfX1ZBUklBQklMSVRZX1RZUEUgPSBXT1JLX1BST0RVQ1RfX1ZBUklBQklMSVRZX1RZUEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJBQkxFX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UID0gV09SS19QUk9EVUNUX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHBvcnRpbmcgTWF0ZXJpYWxzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSQUJMRV9fU1VQUE9SVElOR19NQVRFUklBTFMgPSBXT1JLX1BST0RVQ1RfX1NVUFBPUlRJTkdfTUFURVJJQUxTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbmNlcHRzIEFuZCBQYXBlcnM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJBQkxFX19DT05DRVBUU19BTkRfUEFQRVJTID0gV09SS19QUk9EVUNUX19DT05DRVBUU19BTkRfUEFQRVJTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoZWNrbGlzdHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJBQkxFX19DSEVDS0xJU1RTID0gV09SS19QUk9EVUNUX19DSEVDS0xJU1RTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWRlbGluZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJBQkxFX19HVUlERUxJTkVTID0gV09SS19QUk9EVUNUX19HVUlERUxJTkVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4YW1wbGVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSQUJMRV9fRVhBTVBMRVMgPSBXT1JLX1BST0RVQ1RfX0VYQU1QTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFzc2V0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUkFCTEVfX0FTU0VUUyA9IFdPUktfUFJPRFVDVF9fQVNTRVRTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRlcm1kZWZpbml0aW9uPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSQUJMRV9fVEVSTURFRklOSVRJT04gPSBXT1JLX1BST0RVQ1RfX1RFUk1ERUZJTklUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZ1bGZpbGxzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSQUJMRV9fRlVMRklMTFMgPSBXT1JLX1BST0RVQ1RfX0ZVTEZJTExTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlcG9ydHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJBQkxFX19SRVBPUlRTID0gV09SS19QUk9EVUNUX19SRVBPUlRTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRlbXBsYXRlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUkFCTEVfX1RFTVBMQVRFUyA9IFdPUktfUFJPRFVDVF9fVEVNUExBVEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRvb2wgTWVudG9yczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUkFCTEVfX1RPT0xfTUVOVE9SUyA9IFdPUktfUFJPRFVDVF9fVE9PTF9NRU5UT1JTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVzdGltYXRpb24gQ29uc2lkZXJhdGlvbnM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJBQkxFX19FU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TID0gV09SS19QUk9EVUNUX19FU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlbGl2ZXJlZCBXb3JrIFByb2R1Y3RzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSQUJMRV9fREVMSVZFUkVEX1dPUktfUFJPRFVDVFMgPSBXT1JLX1BST0RVQ1RfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+RGVsaXZlcmFibGU8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUkFCTEVfRkVBVFVSRV9DT1VOVCA9IFdPUktfUFJPRFVDVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgT1VUQ09NRV9fTkFNRSA9IFdPUktfUFJPRFVDVF9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgT1VUQ09NRV9fR1VJRCA9IFdPUktfUFJPRFVDVF9fR1VJRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE9VVENPTUVfX1BSRVNFTlRBVElPTl9OQU1FID0gV09SS19QUk9EVUNUX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE9VVENPTUVfX0JSSUVGX0RFU0NSSVBUSU9OID0gV09SS19QUk9EVUNUX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgT1VUQ09NRV9fT1dORURfUlVMRVMgPSBXT1JLX1BST0RVQ1RfX09XTkVEX1JVTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBPVVRDT01FX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IFdPUktfUFJPRFVDVF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+S2luZDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgT1VUQ09NRV9fS0lORCA9IFdPUktfUFJPRFVDVF9fS0lORDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgT1VUQ09NRV9fU1VQUFJFU1NFRCA9IFdPUktfUFJPRFVDVF9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE9VVENPTUVfX09SREVSSU5HX0dVSURFID0gV09SS19QUk9EVUNUX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBBYnN0cmFjdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE9VVENPTUVfX0lTX0FCU1RSQUNUID0gV09SS19QUk9EVUNUX19JU19BQlNUUkFDVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBPVVRDT01FX19QUkVTRU5UQVRJT04gPSBXT1JLX1BST0RVQ1RfX1BSRVNFTlRBVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TaGFwZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBPVVRDT01FX19TSEFQRUlDT04gPSBXT1JLX1BST0RVQ1RfX1NIQVBFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob2RlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE9VVENPTUVfX05PREVJQ09OID0gV09SS19QUk9EVUNUX19OT0RFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgT1VUQ09NRV9fVkFSSUFCSUxJVFlfVFlQRSA9IFdPUktfUFJPRFVDVF9fVkFSSUFCSUxJVFlfVFlQRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgT1VUQ09NRV9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVCA9IFdPUktfUFJPRFVDVF9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwb3J0aW5nIE1hdGVyaWFsczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgT1VUQ09NRV9fU1VQUE9SVElOR19NQVRFUklBTFMgPSBXT1JLX1BST0RVQ1RfX1NVUFBPUlRJTkdfTUFURVJJQUxTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbmNlcHRzIEFuZCBQYXBlcnM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE9VVENPTUVfX0NPTkNFUFRTX0FORF9QQVBFUlMgPSBXT1JLX1BST0RVQ1RfX0NPTkNFUFRTX0FORF9QQVBFUlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hlY2tsaXN0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgT1VUQ09NRV9fQ0hFQ0tMSVNUUyA9IFdPUktfUFJPRFVDVF9fQ0hFQ0tMSVNUUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkZWxpbmVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBPVVRDT01FX19HVUlERUxJTkVTID0gV09SS19QUk9EVUNUX19HVUlERUxJTkVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4YW1wbGVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBPVVRDT01FX19FWEFNUExFUyA9IFdPUktfUFJPRFVDVF9fRVhBTVBMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXNzZXRzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBPVVRDT01FX19BU1NFVFMgPSBXT1JLX1BST0RVQ1RfX0FTU0VUUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UZXJtZGVmaW5pdGlvbjwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgT1VUQ09NRV9fVEVSTURFRklOSVRJT04gPSBXT1JLX1BST0RVQ1RfX1RFUk1ERUZJTklUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZ1bGZpbGxzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBPVVRDT01FX19GVUxGSUxMUyA9IFdPUktfUFJPRFVDVF9fRlVMRklMTFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVwb3J0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgT1VUQ09NRV9fUkVQT1JUUyA9IFdPUktfUFJPRFVDVF9fUkVQT1JUUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UZW1wbGF0ZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE9VVENPTUVfX1RFTVBMQVRFUyA9IFdPUktfUFJPRFVDVF9fVEVNUExBVEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRvb2wgTWVudG9yczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgT1VUQ09NRV9fVE9PTF9NRU5UT1JTID0gV09SS19QUk9EVUNUX19UT09MX01FTlRPUlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXN0aW1hdGlvbiBDb25zaWRlcmF0aW9uczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgT1VUQ09NRV9fRVNUSU1BVElPTl9DT05TSURFUkFUSU9OUyA9IFdPUktfUFJPRFVDVF9fRVNUSU1BVElPTl9DT05TSURFUkFUSU9OUzsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5PdXRjb21lPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE9VVENPTUVfRkVBVFVSRV9DT1VOVCA9IFdPUktfUFJPRFVDVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU1RFUF9fTkFNRSA9IFNFQ1RJT05fX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNURVBfX0dVSUQgPSBTRUNUSU9OX19HVUlEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU1RFUF9fUFJFU0VOVEFUSU9OX05BTUUgPSBTRUNUSU9OX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNURVBfX0JSSUVGX0RFU0NSSVBUSU9OID0gU0VDVElPTl9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNURVBfX09XTkVEX1JVTEVTID0gU0VDVElPTl9fT1dORURfUlVMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNURVBfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gU0VDVElPTl9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+S2luZDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU1RFUF9fS0lORCA9IFNFQ1RJT05fX0tJTkQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNURVBfX1NVUFBSRVNTRUQgPSBTRUNUSU9OX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU1RFUF9fT1JERVJJTkdfR1VJREUgPSBTRUNUSU9OX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU1RFUF9fVkFSSUFCSUxJVFlfVFlQRSA9IFNFQ1RJT05fX1ZBUklBQklMSVRZX1RZUEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNURVBfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQgPSBTRUNUSU9OX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNlY3Rpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNURVBfX1NFQ1RJT05fTkFNRSA9IFNFQ1RJT05fX1NFQ1RJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TZWN0aW9uIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU1RFUF9fU0VDVElPTl9ERVNDUklQVElPTiA9IFNFQ1RJT05fX1NFQ1RJT05fREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3ViIFNlY3Rpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTVEVQX19TVUJfU0VDVElPTlMgPSBTRUNUSU9OX19TVUJfU0VDVElPTlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlZGVjZXNzb3I8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTVEVQX19QUkVERUNFU1NPUiA9IFNFQ1RJT05fX1BSRURFQ0VTU09SOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZWNvbmRpdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNURVBfX1BSRUNPTkRJVElPTiA9IFNFQ1RJT05fRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UG9zdGNvbmRpdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNURVBfX1BPU1RDT05ESVRJT04gPSBTRUNUSU9OX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlN0ZXA8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU1RFUF9GRUFUVVJFX0NPVU5UID0gU0VDVElPTl9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19ERUZJTklUSU9OX19OQU1FID0gTUVUSE9EX0VMRU1FTlRfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfREVGSU5JVElPTl9fR1VJRCA9IE1FVEhPRF9FTEVNRU5UX19HVUlEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19ERUZJTklUSU9OX19QUkVTRU5UQVRJT05fTkFNRSA9IE1FVEhPRF9FTEVNRU5UX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfREVGSU5JVElPTl9fQlJJRUZfREVTQ1JJUFRJT04gPSBNRVRIT0RfRUxFTUVOVF9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfREVGSU5JVElPTl9fT1dORURfUlVMRVMgPSBNRVRIT0RfRUxFTUVOVF9fT1dORURfUlVMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfREVGSU5JVElPTl9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBNRVRIT0RfRUxFTUVOVF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+S2luZDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19ERUZJTklUSU9OX19LSU5EID0gTUVUSE9EX0VMRU1FTlRfX0tJTkQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfREVGSU5JVElPTl9fU1VQUFJFU1NFRCA9IE1FVEhPRF9FTEVNRU5UX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19ERUZJTklUSU9OX19PUkRFUklOR19HVUlERSA9IE1FVEhPRF9FTEVNRU5UX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVjb25kaXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX0RFRklOSVRJT05fX1BSRUNPTkRJVElPTiA9IE1FVEhPRF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBvc3Rjb25kaXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX0RFRklOSVRJT05fX1BPU1RDT05ESVRJT04gPSBNRVRIT0RfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Xb3JrIERlZmluaXRpb248L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19ERUZJTklUSU9OX0ZFQVRVUkVfQ09VTlQgPSBNRVRIT0RfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV0hJVEVQQVBFUl9fTkFNRSA9IENPTkNFUFRfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdISVRFUEFQRVJfX0dVSUQgPSBDT05DRVBUX19HVUlEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV0hJVEVQQVBFUl9fUFJFU0VOVEFUSU9OX05BTUUgPSBDT05DRVBUX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdISVRFUEFQRVJfX0JSSUVGX0RFU0NSSVBUSU9OID0gQ09OQ0VQVF9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdISVRFUEFQRVJfX09XTkVEX1JVTEVTID0gQ09OQ0VQVF9fT1dORURfUlVMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdISVRFUEFQRVJfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gQ09OQ0VQVF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+S2luZDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV0hJVEVQQVBFUl9fS0lORCA9IENPTkNFUFRfX0tJTkQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdISVRFUEFQRVJfX1NVUFBSRVNTRUQgPSBDT05DRVBUX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV0hJVEVQQVBFUl9fT1JERVJJTkdfR1VJREUgPSBDT05DRVBUX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBBYnN0cmFjdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdISVRFUEFQRVJfX0lTX0FCU1RSQUNUID0gQ09OQ0VQVF9fSVNfQUJTVFJBQ1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV0hJVEVQQVBFUl9fUFJFU0VOVEFUSU9OID0gQ09OQ0VQVF9fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNoYXBlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdISVRFUEFQRVJfX1NIQVBFSUNPTiA9IENPTkNFUFRfX1NIQVBFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob2RlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdISVRFUEFQRVJfX05PREVJQ09OID0gQ09OQ0VQVF9fTk9ERUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdISVRFUEFQRVJfX1ZBUklBQklMSVRZX1RZUEUgPSBDT05DRVBUX19WQVJJQUJJTElUWV9UWVBFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXSElURVBBUEVSX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UID0gQ09OQ0VQVF9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwb3J0aW5nIE1hdGVyaWFsczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV0hJVEVQQVBFUl9fU1VQUE9SVElOR19NQVRFUklBTFMgPSBDT05DRVBUX19TVVBQT1JUSU5HX01BVEVSSUFMUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db25jZXB0cyBBbmQgUGFwZXJzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXSElURVBBUEVSX19DT05DRVBUU19BTkRfUEFQRVJTID0gQ09OQ0VQVF9fQ09OQ0VQVFNfQU5EX1BBUEVSUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGVja2xpc3RzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXSElURVBBUEVSX19DSEVDS0xJU1RTID0gQ09OQ0VQVF9fQ0hFQ0tMSVNUUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkZWxpbmVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXSElURVBBUEVSX19HVUlERUxJTkVTID0gQ09OQ0VQVF9fR1VJREVMSU5FUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeGFtcGxlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV0hJVEVQQVBFUl9fRVhBTVBMRVMgPSBDT05DRVBUX19FWEFNUExFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Bc3NldHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdISVRFUEFQRVJfX0FTU0VUUyA9IENPTkNFUFRfX0FTU0VUUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UZXJtZGVmaW5pdGlvbjwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV0hJVEVQQVBFUl9fVEVSTURFRklOSVRJT04gPSBDT05DRVBUX19URVJNREVGSU5JVElPTjsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5XaGl0ZXBhcGVyPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdISVRFUEFQRVJfRkVBVFVSRV9DT1VOVCA9IENPTkNFUFRfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX05BTUUgPSBDT05URU5UX0VMRU1FTlRfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX0dVSUQgPSBDT05URU5UX0VMRU1FTlRfX0dVSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19QUkVTRU5UQVRJT05fTkFNRSA9IENPTlRFTlRfRUxFTUVOVF9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19CUklFRl9ERVNDUklQVElPTiA9IENPTlRFTlRfRUxFTUVOVF9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX09XTkVEX1JVTEVTID0gQ09OVEVOVF9FTEVNRU5UX19PV05FRF9SVUxFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBDT05URU5UX0VMRU1FTlRfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPktpbmQ8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX0tJTkQgPSBDT05URU5UX0VMRU1FTlRfX0tJTkQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX1NVUFBSRVNTRUQgPSBDT05URU5UX0VMRU1FTlRfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19PUkRFUklOR19HVUlERSA9IENPTlRFTlRfRUxFTUVOVF9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgQWJzdHJhY3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19JU19BQlNUUkFDVCA9IENPTlRFTlRfRUxFTUVOVF9fSVNfQUJTVFJBQ1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fUFJFU0VOVEFUSU9OID0gQ09OVEVOVF9FTEVNRU5UX19QUkVTRU5UQVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2hhcGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fU0hBUEVJQ09OID0gQ09OVEVOVF9FTEVNRU5UX19TSEFQRUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm9kZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19OT0RFSUNPTiA9IENPTlRFTlRfRUxFTUVOVF9fTk9ERUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX1ZBUklBQklMSVRZX1RZUEUgPSBDT05URU5UX0VMRU1FTlRfX1ZBUklBQklMSVRZX1RZUEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQgPSBDT05URU5UX0VMRU1FTlRfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcG9ydGluZyBNYXRlcmlhbHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX1NVUFBPUlRJTkdfTUFURVJJQUxTID0gQ09OVEVOVF9FTEVNRU5UX19TVVBQT1JUSU5HX01BVEVSSUFMUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db25jZXB0cyBBbmQgUGFwZXJzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19DT05DRVBUU19BTkRfUEFQRVJTID0gQ09OVEVOVF9FTEVNRU5UX19DT05DRVBUU19BTkRfUEFQRVJTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoZWNrbGlzdHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX0NIRUNLTElTVFMgPSBDT05URU5UX0VMRU1FTlRfX0NIRUNLTElTVFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZGVsaW5lczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fR1VJREVMSU5FUyA9IENPTlRFTlRfRUxFTUVOVF9fR1VJREVMSU5FUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeGFtcGxlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fRVhBTVBMRVMgPSBDT05URU5UX0VMRU1FTlRfX0VYQU1QTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFzc2V0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fQVNTRVRTID0gQ09OVEVOVF9FTEVNRU5UX19BU1NFVFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGVybWRlZmluaXRpb248L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX1RFUk1ERUZJTklUSU9OID0gQ09OVEVOVF9FTEVNRU5UX19URVJNREVGSU5JVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVjb25kaXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19QUkVDT05ESVRJT04gPSBDT05URU5UX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UG9zdGNvbmRpdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX1BPU1RDT05ESVRJT04gPSBDT05URU5UX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UGVyZm9ybWVkIEJ5PC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19QRVJGT1JNRURfQlkgPSBDT05URU5UX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWFuZGF0b3J5IElucHV0PC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19NQU5EQVRPUllfSU5QVVQgPSBDT05URU5UX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3V0cHV0PC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19PVVRQVVQgPSBDT05URU5UX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWRkaXRpb25hbGx5IFBlcmZvcm1lZCBCeTwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fQURESVRJT05BTExZX1BFUkZPUk1FRF9CWSA9IENPTlRFTlRfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgNTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcHRpb25hbCBJbnB1dDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fT1BUSU9OQUxfSU5QVVQgPSBDT05URU5UX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDY7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3RlcHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX1NURVBTID0gQ09OVEVOVF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA3OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRvb2wgTWVudG9yczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fVE9PTF9NRU5UT1JTID0gQ09OVEVOVF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA4OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVzdGltYXRpb24gQ29uc2lkZXJhdGlvbnM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX0VTVElNQVRJT05fQ09OU0lERVJBVElPTlMgPSBDT05URU5UX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDk7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+VGFzazwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0ZFQVRVUkVfQ09VTlQgPSBDT05URU5UX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDEwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX19OQU1FID0gQ09OVEVOVF9FTEVNRU5UX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX19HVUlEID0gQ09OVEVOVF9FTEVNRU5UX19HVUlEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9fUFJFU0VOVEFUSU9OX05BTUUgPSBDT05URU5UX0VMRU1FTlRfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9fQlJJRUZfREVTQ1JJUFRJT04gPSBDT05URU5UX0VMRU1FTlRfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX19PV05FRF9SVUxFUyA9IENPTlRFTlRfRUxFTUVOVF9fT1dORURfUlVMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gQ09OVEVOVF9FTEVNRU5UX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5LaW5kPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX19LSU5EID0gQ09OVEVOVF9FTEVNRU5UX19LSU5EOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX19TVVBQUkVTU0VEID0gQ09OVEVOVF9FTEVNRU5UX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9fT1JERVJJTkdfR1VJREUgPSBDT05URU5UX0VMRU1FTlRfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIEFic3RyYWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9fSVNfQUJTVFJBQ1QgPSBDT05URU5UX0VMRU1FTlRfX0lTX0FCU1RSQUNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfX1BSRVNFTlRBVElPTiA9IENPTlRFTlRfRUxFTUVOVF9fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNoYXBlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfX1NIQVBFSUNPTiA9IENPTlRFTlRfRUxFTUVOVF9fU0hBUEVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9fTk9ERUlDT04gPSBDT05URU5UX0VMRU1FTlRfX05PREVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX19WQVJJQUJJTElUWV9UWVBFID0gQ09OVEVOVF9FTEVNRU5UX19WQVJJQUJJTElUWV9UWVBFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UID0gQ09OVEVOVF9FTEVNRU5UX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHBvcnRpbmcgTWF0ZXJpYWxzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX19TVVBQT1JUSU5HX01BVEVSSUFMUyA9IENPTlRFTlRfRUxFTUVOVF9fU1VQUE9SVElOR19NQVRFUklBTFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29uY2VwdHMgQW5kIFBhcGVyczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9fQ09OQ0VQVFNfQU5EX1BBUEVSUyA9IENPTlRFTlRfRUxFTUVOVF9fQ09OQ0VQVFNfQU5EX1BBUEVSUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGVja2xpc3RzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX19DSEVDS0xJU1RTID0gQ09OVEVOVF9FTEVNRU5UX19DSEVDS0xJU1RTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWRlbGluZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfX0dVSURFTElORVMgPSBDT05URU5UX0VMRU1FTlRfX0dVSURFTElORVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXhhbXBsZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfX0VYQU1QTEVTID0gQ09OVEVOVF9FTEVNRU5UX19FWEFNUExFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Bc3NldHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfX0FTU0VUUyA9IENPTlRFTlRfRUxFTUVOVF9fQVNTRVRTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRlcm1kZWZpbml0aW9uPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX19URVJNREVGSU5JVElPTiA9IENPTlRFTlRfRUxFTUVOVF9fVEVSTURFRklOSVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RnVsZmlsbHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfX0ZVTEZJTExTID0gQ09OVEVOVF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1vZGlmaWVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX19NT0RJRklFUyA9IENPTlRFTlRfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXNwb25zaWJsZSBGb3I8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfX1JFU1BPTlNJQkxFX0ZPUiA9IENPTlRFTlRfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Sb2xlPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfRkVBVFVSRV9DT1VOVCA9IENPTlRFTlRfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19OQU1FID0gQ09OVEVOVF9ERVNDUklQVElPTl9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19HVUlEID0gQ09OVEVOVF9ERVNDUklQVElPTl9fR1VJRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fUFJFU0VOVEFUSU9OX05BTUUgPSBDT05URU5UX0RFU0NSSVBUSU9OX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fQlJJRUZfREVTQ1JJUFRJT04gPSBDT05URU5UX0RFU0NSSVBUSU9OX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19PV05FRF9SVUxFUyA9IENPTlRFTlRfREVTQ1JJUFRJT05fX09XTkVEX1JVTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gQ09OVEVOVF9ERVNDUklQVElPTl9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+S2luZDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19LSU5EID0gQ09OVEVOVF9ERVNDUklQVElPTl9fS0lORDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19TVVBQUkVTU0VEID0gQ09OVEVOVF9ERVNDUklQVElPTl9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fT1JERVJJTkdfR1VJREUgPSBDT05URU5UX0RFU0NSSVBUSU9OX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BdXRob3JzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19BVVRIT1JTID0gQ09OVEVOVF9ERVNDUklQVElPTl9fQVVUSE9SUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGFuZ2UgRGF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fQ0hBTkdFX0RBVEUgPSBDT05URU5UX0RFU0NSSVBUSU9OX19DSEFOR0VfREFURTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGFuZ2UgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX0NIQU5HRV9ERVNDUklQVElPTiA9IENPTlRFTlRfREVTQ1JJUFRJT05fX0NIQU5HRV9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WZXJzaW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19WRVJTSU9OID0gQ09OVEVOVF9ERVNDUklQVElPTl9fVkVSU0lPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db3B5cmlnaHQgU3RhdGVtZW50PC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19DT1BZUklHSFRfU1RBVEVNRU5UID0gQ09OVEVOVF9ERVNDUklQVElPTl9fQ09QWVJJR0hUX1NUQVRFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYWluIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19NQUlOX0RFU0NSSVBUSU9OID0gQ09OVEVOVF9ERVNDUklQVElPTl9fTUFJTl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TZWN0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19TRUNUSU9OUyA9IENPTlRFTlRfREVTQ1JJUFRJT05fX1NFQ1RJT05TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4dGVybmFsIElkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19FWFRFUk5BTF9JRCA9IENPTlRFTlRfREVTQ1JJUFRJT05fX0VYVEVSTkFMX0lEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPktleSBDb25zaWRlcmF0aW9uczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fS0VZX0NPTlNJREVSQVRJT05TID0gQ09OVEVOVF9ERVNDUklQVElPTl9fS0VZX0NPTlNJREVSQVRJT05TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxvbmcgUHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX0xPTkdfUFJFU0VOVEFUSU9OX05BTUUgPSBDT05URU5UX0RFU0NSSVBUSU9OX19MT05HX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlB1cnBvc2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX1BVUlBPU0UgPSBDT05URU5UX0RFU0NSSVBUSU9OX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkltcGFjdCBPZiBOb3QgSGF2aW5nPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19JTVBBQ1RfT0ZfTk9UX0hBVklORyA9IENPTlRFTlRfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVhc29ucyBGb3IgTm90IE5lZWRpbmc8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX1JFQVNPTlNfRk9SX05PVF9ORUVESU5HID0gQ09OVEVOVF9ERVNDUklQVElPTl9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Xb3JrIFByb2R1Y3QgRGVzY3JpcHRpb248L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX0ZFQVRVUkVfQ09VTlQgPSBDT05URU5UX0RFU0NSSVBUSU9OX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlRJRkFDVF9ERVNDUklQVElPTl9fTkFNRSA9IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1RfREVTQ1JJUFRJT05fX0dVSUQgPSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX0dVSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlRJRkFDVF9ERVNDUklQVElPTl9fUFJFU0VOVEFUSU9OX05BTUUgPSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1RfREVTQ1JJUFRJT05fX0JSSUVGX0RFU0NSSVBUSU9OID0gV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1RfREVTQ1JJUFRJT05fX09XTkVEX1JVTEVTID0gV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19PV05FRF9SVUxFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1RfREVTQ1JJUFRJT05fX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5LaW5kPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlRJRkFDVF9ERVNDUklQVElPTl9fS0lORCA9IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fS0lORDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1RfREVTQ1JJUFRJT05fX1NVUFBSRVNTRUQgPSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlRJRkFDVF9ERVNDUklQVElPTl9fT1JERVJJTkdfR1VJREUgPSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkF1dGhvcnM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlRJRkFDVF9ERVNDUklQVElPTl9fQVVUSE9SUyA9IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fQVVUSE9SUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGFuZ2UgRGF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSVElGQUNUX0RFU0NSSVBUSU9OX19DSEFOR0VfREFURSA9IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fQ0hBTkdFX0RBVEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hhbmdlIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1RfREVTQ1JJUFRJT05fX0NIQU5HRV9ERVNDUklQVElPTiA9IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fQ0hBTkdFX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZlcnNpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlRJRkFDVF9ERVNDUklQVElPTl9fVkVSU0lPTiA9IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fVkVSU0lPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db3B5cmlnaHQgU3RhdGVtZW50PC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1RfREVTQ1JJUFRJT05fX0NPUFlSSUdIVF9TVEFURU1FTlQgPSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX0NPUFlSSUdIVF9TVEFURU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWFpbiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSVElGQUNUX0RFU0NSSVBUSU9OX19NQUlOX0RFU0NSSVBUSU9OID0gV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19NQUlOX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNlY3Rpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlRJRkFDVF9ERVNDUklQVElPTl9fU0VDVElPTlMgPSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX1NFQ1RJT05TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4dGVybmFsIElkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1RfREVTQ1JJUFRJT05fX0VYVEVSTkFMX0lEID0gV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19FWFRFUk5BTF9JRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5LZXkgQ29uc2lkZXJhdGlvbnM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlRJRkFDVF9ERVNDUklQVElPTl9fS0VZX0NPTlNJREVSQVRJT05TID0gV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19LRVlfQ09OU0lERVJBVElPTlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TG9uZyBQcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSVElGQUNUX0RFU0NSSVBUSU9OX19MT05HX1BSRVNFTlRBVElPTl9OQU1FID0gV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19MT05HX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlB1cnBvc2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlRJRkFDVF9ERVNDUklQVElPTl9fUFVSUE9TRSA9IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fUFVSUE9TRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbXBhY3QgT2YgTm90IEhhdmluZzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSVElGQUNUX0RFU0NSSVBUSU9OX19JTVBBQ1RfT0ZfTk9UX0hBVklORyA9IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fSU1QQUNUX09GX05PVF9IQVZJTkc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVhc29ucyBGb3IgTm90IE5lZWRpbmc8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlRJRkFDVF9ERVNDUklQVElPTl9fUkVBU09OU19GT1JfTk9UX05FRURJTkcgPSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX1JFQVNPTlNfRk9SX05PVF9ORUVESU5HOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIE91dGxpbmU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlRJRkFDVF9ERVNDUklQVElPTl9fQlJJRUZfT1VUTElORSA9IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXByZXNlbnRhdGlvbiBPcHRpb25zPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1RfREVTQ1JJUFRJT05fX1JFUFJFU0VOVEFUSU9OX09QVElPTlMgPSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVwcmVzZW50YXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlRJRkFDVF9ERVNDUklQVElPTl9fUkVQUkVTRU5UQVRJT04gPSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm90YXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlRJRkFDVF9ERVNDUklQVElPTl9fTk9UQVRJT04gPSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+QXJ0aWZhY3QgRGVzY3JpcHRpb248L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1RfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCA9IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9GRUFUVVJFX0NPVU5UICsgNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUkFCTEVfREVTQ1JJUFRJT05fX05BTUUgPSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJBQkxFX0RFU0NSSVBUSU9OX19HVUlEID0gV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19HVUlEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUkFCTEVfREVTQ1JJUFRJT05fX1BSRVNFTlRBVElPTl9OQU1FID0gV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJBQkxFX0RFU0NSSVBUSU9OX19CUklFRl9ERVNDUklQVElPTiA9IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJBQkxFX0RFU0NSSVBUSU9OX19PV05FRF9SVUxFUyA9IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fT1dORURfUlVMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJBQkxFX0RFU0NSSVBUSU9OX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+S2luZDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUkFCTEVfREVTQ1JJUFRJT05fX0tJTkQgPSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX0tJTkQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJBQkxFX0RFU0NSSVBUSU9OX19TVVBQUkVTU0VEID0gV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUkFCTEVfREVTQ1JJUFRJT05fX09SREVSSU5HX0dVSURFID0gV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BdXRob3JzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUkFCTEVfREVTQ1JJUFRJT05fX0FVVEhPUlMgPSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX0FVVEhPUlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hhbmdlIERhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSQUJMRV9ERVNDUklQVElPTl9fQ0hBTkdFX0RBVEUgPSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX0NIQU5HRV9EQVRFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoYW5nZSBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJBQkxFX0RFU0NSSVBUSU9OX19DSEFOR0VfREVTQ1JJUFRJT04gPSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX0NIQU5HRV9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WZXJzaW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUkFCTEVfREVTQ1JJUFRJT05fX1ZFUlNJT04gPSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX1ZFUlNJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29weXJpZ2h0IFN0YXRlbWVudDwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJBQkxFX0RFU0NSSVBUSU9OX19DT1BZUklHSFRfU1RBVEVNRU5UID0gV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19DT1BZUklHSFRfU1RBVEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1haW4gRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSQUJMRV9ERVNDUklQVElPTl9fTUFJTl9ERVNDUklQVElPTiA9IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fTUFJTl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TZWN0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUkFCTEVfREVTQ1JJUFRJT05fX1NFQ1RJT05TID0gV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19TRUNUSU9OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeHRlcm5hbCBJZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJBQkxFX0RFU0NSSVBUSU9OX19FWFRFUk5BTF9JRCA9IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fRVhURVJOQUxfSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+S2V5IENvbnNpZGVyYXRpb25zPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUkFCTEVfREVTQ1JJUFRJT05fX0tFWV9DT05TSURFUkFUSU9OUyA9IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fS0VZX0NPTlNJREVSQVRJT05TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxvbmcgUHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSQUJMRV9ERVNDUklQVElPTl9fTE9OR19QUkVTRU5UQVRJT05fTkFNRSA9IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fTE9OR19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QdXJwb3NlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUkFCTEVfREVTQ1JJUFRJT05fX1BVUlBPU0UgPSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX1BVUlBPU0U7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW1wYWN0IE9mIE5vdCBIYXZpbmc8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSQUJMRV9ERVNDUklQVElPTl9fSU1QQUNUX09GX05PVF9IQVZJTkcgPSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX0lNUEFDVF9PRl9OT1RfSEFWSU5HOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlYXNvbnMgRm9yIE5vdCBOZWVkaW5nPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUkFCTEVfREVTQ1JJUFRJT05fX1JFQVNPTlNfRk9SX05PVF9ORUVESU5HID0gV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19SRUFTT05TX0ZPUl9OT1RfTkVFRElORzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeHRlcm5hbCBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJBQkxFX0RFU0NSSVBUSU9OX19FWFRFUk5BTF9ERVNDUklQVElPTiA9IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QYWNrYWdpbmcgR3VpZGFuY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSQUJMRV9ERVNDUklQVElPTl9fUEFDS0FHSU5HX0dVSURBTkNFID0gV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkRlbGl2ZXJhYmxlIERlc2NyaXB0aW9uPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJBQkxFX0RFU0NSSVBUSU9OX0ZFQVRVUkVfQ09VTlQgPSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfREVTQ1JJUFRJT05fX05BTUUgPSBDT05URU5UX0RFU0NSSVBUSU9OX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX0RFU0NSSVBUSU9OX19HVUlEID0gQ09OVEVOVF9ERVNDUklQVElPTl9fR1VJRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfREVTQ1JJUFRJT05fX1BSRVNFTlRBVElPTl9OQU1FID0gQ09OVEVOVF9ERVNDUklQVElPTl9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX0RFU0NSSVBUSU9OX19CUklFRl9ERVNDUklQVElPTiA9IENPTlRFTlRfREVTQ1JJUFRJT05fX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX0RFU0NSSVBUSU9OX19PV05FRF9SVUxFUyA9IENPTlRFTlRfREVTQ1JJUFRJT05fX09XTkVEX1JVTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX0RFU0NSSVBUSU9OX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IENPTlRFTlRfREVTQ1JJUFRJT05fX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPktpbmQ8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfREVTQ1JJUFRJT05fX0tJTkQgPSBDT05URU5UX0RFU0NSSVBUSU9OX19LSU5EOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX0RFU0NSSVBUSU9OX19TVVBQUkVTU0VEID0gQ09OVEVOVF9ERVNDUklQVElPTl9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfREVTQ1JJUFRJT05fX09SREVSSU5HX0dVSURFID0gQ09OVEVOVF9ERVNDUklQVElPTl9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXV0aG9yczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfREVTQ1JJUFRJT05fX0FVVEhPUlMgPSBDT05URU5UX0RFU0NSSVBUSU9OX19BVVRIT1JTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoYW5nZSBEYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9ERVNDUklQVElPTl9fQ0hBTkdFX0RBVEUgPSBDT05URU5UX0RFU0NSSVBUSU9OX19DSEFOR0VfREFURTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGFuZ2UgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX0RFU0NSSVBUSU9OX19DSEFOR0VfREVTQ1JJUFRJT04gPSBDT05URU5UX0RFU0NSSVBUSU9OX19DSEFOR0VfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmVyc2lvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfREVTQ1JJUFRJT05fX1ZFUlNJT04gPSBDT05URU5UX0RFU0NSSVBUSU9OX19WRVJTSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvcHlyaWdodCBTdGF0ZW1lbnQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX0RFU0NSSVBUSU9OX19DT1BZUklHSFRfU1RBVEVNRU5UID0gQ09OVEVOVF9ERVNDUklQVElPTl9fQ09QWVJJR0hUX1NUQVRFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYWluIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9ERVNDUklQVElPTl9fTUFJTl9ERVNDUklQVElPTiA9IENPTlRFTlRfREVTQ1JJUFRJT05fX01BSU5fREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2VjdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfREVTQ1JJUFRJT05fX1NFQ1RJT05TID0gQ09OVEVOVF9ERVNDUklQVElPTl9fU0VDVElPTlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXh0ZXJuYWwgSWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX0RFU0NSSVBUSU9OX19FWFRFUk5BTF9JRCA9IENPTlRFTlRfREVTQ1JJUFRJT05fX0VYVEVSTkFMX0lEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPktleSBDb25zaWRlcmF0aW9uczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfREVTQ1JJUFRJT05fX0tFWV9DT05TSURFUkFUSU9OUyA9IENPTlRFTlRfREVTQ1JJUFRJT05fX0tFWV9DT05TSURFUkFUSU9OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Mb25nIFByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9ERVNDUklQVElPTl9fTE9OR19QUkVTRU5UQVRJT05fTkFNRSA9IENPTlRFTlRfREVTQ1JJUFRJT05fX0xPTkdfUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2tpbGxzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9ERVNDUklQVElPTl9fU0tJTExTID0gQ09OVEVOVF9ERVNDUklQVElPTl9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Bc3NpZ25tZW50IEFwcHJvYWNoZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX0RFU0NSSVBUSU9OX19BU1NJR05NRU5UX0FQUFJPQUNIRVMgPSBDT05URU5UX0RFU0NSSVBUSU9OX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN5bm9ueW1zPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9ERVNDUklQVElPTl9fU1lOT05ZTVMgPSBDT05URU5UX0RFU0NSSVBUSU9OX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlJvbGUgRGVzY3JpcHRpb248L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9ERVNDUklQVElPTl9GRUFUVVJFX0NPVU5UID0gQ09OVEVOVF9ERVNDUklQVElPTl9GRUFUVVJFX0NPVU5UICsgMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVElPTl9fTkFNRSA9IENPTlRFTlRfREVTQ1JJUFRJT05fX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRJT05fX0dVSUQgPSBDT05URU5UX0RFU0NSSVBUSU9OX19HVUlEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVElPTl9fUFJFU0VOVEFUSU9OX05BTUUgPSBDT05URU5UX0RFU0NSSVBUSU9OX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRJT05fX0JSSUVGX0RFU0NSSVBUSU9OID0gQ09OVEVOVF9ERVNDUklQVElPTl9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRJT05fX09XTkVEX1JVTEVTID0gQ09OVEVOVF9ERVNDUklQVElPTl9fT1dORURfUlVMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRJT05fX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gQ09OVEVOVF9ERVNDUklQVElPTl9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+S2luZDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVElPTl9fS0lORCA9IENPTlRFTlRfREVTQ1JJUFRJT05fX0tJTkQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRJT05fX1NVUFBSRVNTRUQgPSBDT05URU5UX0RFU0NSSVBUSU9OX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVElPTl9fT1JERVJJTkdfR1VJREUgPSBDT05URU5UX0RFU0NSSVBUSU9OX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BdXRob3JzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVElPTl9fQVVUSE9SUyA9IENPTlRFTlRfREVTQ1JJUFRJT05fX0FVVEhPUlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hhbmdlIERhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUSU9OX19DSEFOR0VfREFURSA9IENPTlRFTlRfREVTQ1JJUFRJT05fX0NIQU5HRV9EQVRFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoYW5nZSBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRJT05fX0NIQU5HRV9ERVNDUklQVElPTiA9IENPTlRFTlRfREVTQ1JJUFRJT05fX0NIQU5HRV9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WZXJzaW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVElPTl9fVkVSU0lPTiA9IENPTlRFTlRfREVTQ1JJUFRJT05fX1ZFUlNJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29weXJpZ2h0IFN0YXRlbWVudDwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRJT05fX0NPUFlSSUdIVF9TVEFURU1FTlQgPSBDT05URU5UX0RFU0NSSVBUSU9OX19DT1BZUklHSFRfU1RBVEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1haW4gRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUSU9OX19NQUlOX0RFU0NSSVBUSU9OID0gQ09OVEVOVF9ERVNDUklQVElPTl9fTUFJTl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TZWN0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVElPTl9fU0VDVElPTlMgPSBDT05URU5UX0RFU0NSSVBUSU9OX19TRUNUSU9OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeHRlcm5hbCBJZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRJT05fX0VYVEVSTkFMX0lEID0gQ09OVEVOVF9ERVNDUklQVElPTl9fRVhURVJOQUxfSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+S2V5IENvbnNpZGVyYXRpb25zPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVElPTl9fS0VZX0NPTlNJREVSQVRJT05TID0gQ09OVEVOVF9ERVNDUklQVElPTl9fS0VZX0NPTlNJREVSQVRJT05TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxvbmcgUHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUSU9OX19MT05HX1BSRVNFTlRBVElPTl9OQU1FID0gQ09OVEVOVF9ERVNDUklQVElPTl9fTE9OR19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QdXJwb3NlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVElPTl9fUFVSUE9TRSA9IENPTlRFTlRfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWx0ZXJuYXRpdmVzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVElPTl9fQUxURVJOQVRJVkVTID0gQ09OVEVOVF9ERVNDUklQVElPTl9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5UYXNrIERlc2NyaXB0aW9uPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCA9IENPTlRFTlRfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURBTkNFX0RFU0NSSVBUSU9OX19OQU1FID0gQ09OVEVOVF9ERVNDUklQVElPTl9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREFOQ0VfREVTQ1JJUFRJT05fX0dVSUQgPSBDT05URU5UX0RFU0NSSVBUSU9OX19HVUlEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREFOQ0VfREVTQ1JJUFRJT05fX1BSRVNFTlRBVElPTl9OQU1FID0gQ09OVEVOVF9ERVNDUklQVElPTl9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHVUlEQU5DRV9ERVNDUklQVElPTl9fQlJJRUZfREVTQ1JJUFRJT04gPSBDT05URU5UX0RFU0NSSVBUSU9OX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREFOQ0VfREVTQ1JJUFRJT05fX09XTkVEX1JVTEVTID0gQ09OVEVOVF9ERVNDUklQVElPTl9fT1dORURfUlVMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURBTkNFX0RFU0NSSVBUSU9OX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IENPTlRFTlRfREVTQ1JJUFRJT05fX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPktpbmQ8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURBTkNFX0RFU0NSSVBUSU9OX19LSU5EID0gQ09OVEVOVF9ERVNDUklQVElPTl9fS0lORDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREFOQ0VfREVTQ1JJUFRJT05fX1NVUFBSRVNTRUQgPSBDT05URU5UX0RFU0NSSVBUSU9OX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREFOQ0VfREVTQ1JJUFRJT05fX09SREVSSU5HX0dVSURFID0gQ09OVEVOVF9ERVNDUklQVElPTl9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXV0aG9yczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURBTkNFX0RFU0NSSVBUSU9OX19BVVRIT1JTID0gQ09OVEVOVF9ERVNDUklQVElPTl9fQVVUSE9SUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGFuZ2UgRGF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURBTkNFX0RFU0NSSVBUSU9OX19DSEFOR0VfREFURSA9IENPTlRFTlRfREVTQ1JJUFRJT05fX0NIQU5HRV9EQVRFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoYW5nZSBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURBTkNFX0RFU0NSSVBUSU9OX19DSEFOR0VfREVTQ1JJUFRJT04gPSBDT05URU5UX0RFU0NSSVBUSU9OX19DSEFOR0VfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmVyc2lvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURBTkNFX0RFU0NSSVBUSU9OX19WRVJTSU9OID0gQ09OVEVOVF9ERVNDUklQVElPTl9fVkVSU0lPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db3B5cmlnaHQgU3RhdGVtZW50PC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREFOQ0VfREVTQ1JJUFRJT05fX0NPUFlSSUdIVF9TVEFURU1FTlQgPSBDT05URU5UX0RFU0NSSVBUSU9OX19DT1BZUklHSFRfU1RBVEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1haW4gRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHVUlEQU5DRV9ERVNDUklQVElPTl9fTUFJTl9ERVNDUklQVElPTiA9IENPTlRFTlRfREVTQ1JJUFRJT05fX01BSU5fREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2VjdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURBTkNFX0RFU0NSSVBUSU9OX19TRUNUSU9OUyA9IENPTlRFTlRfREVTQ1JJUFRJT05fX1NFQ1RJT05TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4dGVybmFsIElkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREFOQ0VfREVTQ1JJUFRJT05fX0VYVEVSTkFMX0lEID0gQ09OVEVOVF9ERVNDUklQVElPTl9fRVhURVJOQUxfSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+S2V5IENvbnNpZGVyYXRpb25zPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREFOQ0VfREVTQ1JJUFRJT05fX0tFWV9DT05TSURFUkFUSU9OUyA9IENPTlRFTlRfREVTQ1JJUFRJT05fX0tFWV9DT05TSURFUkFUSU9OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Mb25nIFByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREFOQ0VfREVTQ1JJUFRJT05fX0xPTkdfUFJFU0VOVEFUSU9OX05BTUUgPSBDT05URU5UX0RFU0NSSVBUSU9OX19MT05HX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkF0dGFjaG1lbnRzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREFOQ0VfREVTQ1JJUFRJT05fX0FUVEFDSE1FTlRTID0gQ09OVEVOVF9ERVNDUklQVElPTl9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5HdWlkYW5jZSBEZXNjcmlwdGlvbjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHVUlEQU5DRV9ERVNDUklQVElPTl9GRUFUVVJFX0NPVU5UID0gQ09OVEVOVF9ERVNDUklQVElPTl9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX05BTUUgPSBDT05URU5UX0RFU0NSSVBUSU9OX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUkFDVElDRV9ERVNDUklQVElPTl9fR1VJRCA9IENPTlRFTlRfREVTQ1JJUFRJT05fX0dVSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUkFDVElDRV9ERVNDUklQVElPTl9fUFJFU0VOVEFUSU9OX05BTUUgPSBDT05URU5UX0RFU0NSSVBUSU9OX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBSQUNUSUNFX0RFU0NSSVBUSU9OX19CUklFRl9ERVNDUklQVElPTiA9IENPTlRFTlRfREVTQ1JJUFRJT05fX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUkFDVElDRV9ERVNDUklQVElPTl9fT1dORURfUlVMRVMgPSBDT05URU5UX0RFU0NSSVBUSU9OX19PV05FRF9SVUxFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gQ09OVEVOVF9ERVNDUklQVElPTl9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+S2luZDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0tJTkQgPSBDT05URU5UX0RFU0NSSVBUSU9OX19LSU5EOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUkFDVElDRV9ERVNDUklQVElPTl9fU1VQUFJFU1NFRCA9IENPTlRFTlRfREVTQ1JJUFRJT05fX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUkFDVElDRV9ERVNDUklQVElPTl9fT1JERVJJTkdfR1VJREUgPSBDT05URU5UX0RFU0NSSVBUSU9OX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BdXRob3JzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0FVVEhPUlMgPSBDT05URU5UX0RFU0NSSVBUSU9OX19BVVRIT1JTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoYW5nZSBEYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0NIQU5HRV9EQVRFID0gQ09OVEVOVF9ERVNDUklQVElPTl9fQ0hBTkdFX0RBVEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hhbmdlIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0NIQU5HRV9ERVNDUklQVElPTiA9IENPTlRFTlRfREVTQ1JJUFRJT05fX0NIQU5HRV9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WZXJzaW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX1ZFUlNJT04gPSBDT05URU5UX0RFU0NSSVBUSU9OX19WRVJTSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvcHlyaWdodCBTdGF0ZW1lbnQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUkFDVElDRV9ERVNDUklQVElPTl9fQ09QWVJJR0hUX1NUQVRFTUVOVCA9IENPTlRFTlRfREVTQ1JJUFRJT05fX0NPUFlSSUdIVF9TVEFURU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWFpbiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBSQUNUSUNFX0RFU0NSSVBUSU9OX19NQUlOX0RFU0NSSVBUSU9OID0gQ09OVEVOVF9ERVNDUklQVElPTl9fTUFJTl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TZWN0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX1NFQ1RJT05TID0gQ09OVEVOVF9ERVNDUklQVElPTl9fU0VDVElPTlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXh0ZXJuYWwgSWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUkFDVElDRV9ERVNDUklQVElPTl9fRVhURVJOQUxfSUQgPSBDT05URU5UX0RFU0NSSVBUSU9OX19FWFRFUk5BTF9JRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5LZXkgQ29uc2lkZXJhdGlvbnM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUkFDVElDRV9ERVNDUklQVElPTl9fS0VZX0NPTlNJREVSQVRJT05TID0gQ09OVEVOVF9ERVNDUklQVElPTl9fS0VZX0NPTlNJREVSQVRJT05TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxvbmcgUHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUkFDVElDRV9ERVNDUklQVElPTl9fTE9OR19QUkVTRU5UQVRJT05fTkFNRSA9IENPTlRFTlRfREVTQ1JJUFRJT05fX0xPTkdfUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWRkaXRpb25hbCBJbmZvPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0FERElUSU9OQUxfSU5GTyA9IENPTlRFTlRfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJvYmxlbTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBSQUNUSUNFX0RFU0NSSVBUSU9OX19QUk9CTEVNID0gQ09OVEVOVF9ERVNDUklQVElPTl9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CYWNrZ3JvdW5kPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0JBQ0tHUk9VTkQgPSBDT05URU5UX0RFU0NSSVBUSU9OX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdvYWxzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0dPQUxTID0gQ09OVEVOVF9ERVNDUklQVElPTl9GRUFUVVJFX0NPVU5UICsgMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BcHBsaWNhdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBSQUNUSUNFX0RFU0NSSVBUSU9OX19BUFBMSUNBVElPTiA9IENPTlRFTlRfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCArIDQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TGV2ZWxzIE9mIEFkb3B0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0xFVkVMU19PRl9BRE9QVElPTiA9IENPTlRFTlRfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCArIDU7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+UHJhY3RpY2UgRGVzY3JpcHRpb248L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJBQ1RJQ0VfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCA9IENPTlRFTlRfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCArIDY7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfQ0FURUdPUllfX05BTUUgPSBDT05URU5UX0VMRU1FTlRfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfQ0FURUdPUllfX0dVSUQgPSBDT05URU5UX0VMRU1FTlRfX0dVSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0NBVEVHT1JZX19QUkVTRU5UQVRJT05fTkFNRSA9IENPTlRFTlRfRUxFTUVOVF9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0NBVEVHT1JZX19CUklFRl9ERVNDUklQVElPTiA9IENPTlRFTlRfRUxFTUVOVF9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfQ0FURUdPUllfX09XTkVEX1JVTEVTID0gQ09OVEVOVF9FTEVNRU5UX19PV05FRF9SVUxFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9DQVRFR09SWV9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBDT05URU5UX0VMRU1FTlRfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPktpbmQ8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfQ0FURUdPUllfX0tJTkQgPSBDT05URU5UX0VMRU1FTlRfX0tJTkQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfQ0FURUdPUllfX1NVUFBSRVNTRUQgPSBDT05URU5UX0VMRU1FTlRfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0NBVEVHT1JZX19PUkRFUklOR19HVUlERSA9IENPTlRFTlRfRUxFTUVOVF9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgQWJzdHJhY3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0NBVEVHT1JZX19JU19BQlNUUkFDVCA9IENPTlRFTlRfRUxFTUVOVF9fSVNfQUJTVFJBQ1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9DQVRFR09SWV9fUFJFU0VOVEFUSU9OID0gQ09OVEVOVF9FTEVNRU5UX19QUkVTRU5UQVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2hhcGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9DQVRFR09SWV9fU0hBUEVJQ09OID0gQ09OVEVOVF9FTEVNRU5UX19TSEFQRUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm9kZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0NBVEVHT1JZX19OT0RFSUNPTiA9IENPTlRFTlRfRUxFTUVOVF9fTk9ERUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfQ0FURUdPUllfX1ZBUklBQklMSVRZX1RZUEUgPSBDT05URU5UX0VMRU1FTlRfX1ZBUklBQklMSVRZX1RZUEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfQ0FURUdPUllfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQgPSBDT05URU5UX0VMRU1FTlRfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcG9ydGluZyBNYXRlcmlhbHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfQ0FURUdPUllfX1NVUFBPUlRJTkdfTUFURVJJQUxTID0gQ09OVEVOVF9FTEVNRU5UX19TVVBQT1JUSU5HX01BVEVSSUFMUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db25jZXB0cyBBbmQgUGFwZXJzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0NBVEVHT1JZX19DT05DRVBUU19BTkRfUEFQRVJTID0gQ09OVEVOVF9FTEVNRU5UX19DT05DRVBUU19BTkRfUEFQRVJTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoZWNrbGlzdHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfQ0FURUdPUllfX0NIRUNLTElTVFMgPSBDT05URU5UX0VMRU1FTlRfX0NIRUNLTElTVFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZGVsaW5lczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9DQVRFR09SWV9fR1VJREVMSU5FUyA9IENPTlRFTlRfRUxFTUVOVF9fR1VJREVMSU5FUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeGFtcGxlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9DQVRFR09SWV9fRVhBTVBMRVMgPSBDT05URU5UX0VMRU1FTlRfX0VYQU1QTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFzc2V0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9DQVRFR09SWV9fQVNTRVRTID0gQ09OVEVOVF9FTEVNRU5UX19BU1NFVFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGVybWRlZmluaXRpb248L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfQ0FURUdPUllfX1RFUk1ERUZJTklUSU9OID0gQ09OVEVOVF9FTEVNRU5UX19URVJNREVGSU5JVElPTjsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Db250ZW50IENhdGVnb3J5PC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfQ0FURUdPUllfRkVBVFVSRV9DT1VOVCA9IENPTlRFTlRfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9TRVRfX05BTUUgPSBDT05URU5UX0NBVEVHT1JZX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX1NFVF9fR1VJRCA9IENPTlRFTlRfQ0FURUdPUllfX0dVSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX1NFVF9fUFJFU0VOVEFUSU9OX05BTUUgPSBDT05URU5UX0NBVEVHT1JZX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfU0VUX19CUklFRl9ERVNDUklQVElPTiA9IENPTlRFTlRfQ0FURUdPUllfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX1NFVF9fT1dORURfUlVMRVMgPSBDT05URU5UX0NBVEVHT1JZX19PV05FRF9SVUxFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9TRVRfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gQ09OVEVOVF9DQVRFR09SWV9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+S2luZDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9TRVRfX0tJTkQgPSBDT05URU5UX0NBVEVHT1JZX19LSU5EOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX1NFVF9fU1VQUFJFU1NFRCA9IENPTlRFTlRfQ0FURUdPUllfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX1NFVF9fT1JERVJJTkdfR1VJREUgPSBDT05URU5UX0NBVEVHT1JZX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBBYnN0cmFjdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfU0VUX19JU19BQlNUUkFDVCA9IENPTlRFTlRfQ0FURUdPUllfX0lTX0FCU1RSQUNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfU0VUX19QUkVTRU5UQVRJT04gPSBDT05URU5UX0NBVEVHT1JZX19QUkVTRU5UQVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2hhcGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9TRVRfX1NIQVBFSUNPTiA9IENPTlRFTlRfQ0FURUdPUllfX1NIQVBFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob2RlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfU0VUX19OT0RFSUNPTiA9IENPTlRFTlRfQ0FURUdPUllfX05PREVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX1NFVF9fVkFSSUFCSUxJVFlfVFlQRSA9IENPTlRFTlRfQ0FURUdPUllfX1ZBUklBQklMSVRZX1RZUEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfU0VUX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UID0gQ09OVEVOVF9DQVRFR09SWV9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwb3J0aW5nIE1hdGVyaWFsczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9TRVRfX1NVUFBPUlRJTkdfTUFURVJJQUxTID0gQ09OVEVOVF9DQVRFR09SWV9fU1VQUE9SVElOR19NQVRFUklBTFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29uY2VwdHMgQW5kIFBhcGVyczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9TRVRfX0NPTkNFUFRTX0FORF9QQVBFUlMgPSBDT05URU5UX0NBVEVHT1JZX19DT05DRVBUU19BTkRfUEFQRVJTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoZWNrbGlzdHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfU0VUX19DSEVDS0xJU1RTID0gQ09OVEVOVF9DQVRFR09SWV9fQ0hFQ0tMSVNUUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkZWxpbmVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX1NFVF9fR1VJREVMSU5FUyA9IENPTlRFTlRfQ0FURUdPUllfX0dVSURFTElORVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXhhbXBsZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfU0VUX19FWEFNUExFUyA9IENPTlRFTlRfQ0FURUdPUllfX0VYQU1QTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFzc2V0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9TRVRfX0FTU0VUUyA9IENPTlRFTlRfQ0FURUdPUllfX0FTU0VUUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UZXJtZGVmaW5pdGlvbjwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9TRVRfX1RFUk1ERUZJTklUSU9OID0gQ09OVEVOVF9DQVRFR09SWV9fVEVSTURFRklOSVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Um9sZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfU0VUX19ST0xFUyA9IENPTlRFTlRfQ0FURUdPUllfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+Um9sZSBTZXQ8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9TRVRfRkVBVFVSRV9DT1VOVCA9IENPTlRFTlRfQ0FURUdPUllfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERPTUFJTl9fTkFNRSA9IENPTlRFTlRfQ0FURUdPUllfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERPTUFJTl9fR1VJRCA9IENPTlRFTlRfQ0FURUdPUllfX0dVSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBET01BSU5fX1BSRVNFTlRBVElPTl9OQU1FID0gQ09OVEVOVF9DQVRFR09SWV9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBET01BSU5fX0JSSUVGX0RFU0NSSVBUSU9OID0gQ09OVEVOVF9DQVRFR09SWV9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERPTUFJTl9fT1dORURfUlVMRVMgPSBDT05URU5UX0NBVEVHT1JZX19PV05FRF9SVUxFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRE9NQUlOX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IENPTlRFTlRfQ0FURUdPUllfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPktpbmQ8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERPTUFJTl9fS0lORCA9IENPTlRFTlRfQ0FURUdPUllfX0tJTkQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERPTUFJTl9fU1VQUFJFU1NFRCA9IENPTlRFTlRfQ0FURUdPUllfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBET01BSU5fX09SREVSSU5HX0dVSURFID0gQ09OVEVOVF9DQVRFR09SWV9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgQWJzdHJhY3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBET01BSU5fX0lTX0FCU1RSQUNUID0gQ09OVEVOVF9DQVRFR09SWV9fSVNfQUJTVFJBQ1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRE9NQUlOX19QUkVTRU5UQVRJT04gPSBDT05URU5UX0NBVEVHT1JZX19QUkVTRU5UQVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2hhcGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRE9NQUlOX19TSEFQRUlDT04gPSBDT05URU5UX0NBVEVHT1JZX19TSEFQRUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm9kZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBET01BSU5fX05PREVJQ09OID0gQ09OVEVOVF9DQVRFR09SWV9fTk9ERUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERPTUFJTl9fVkFSSUFCSUxJVFlfVFlQRSA9IENPTlRFTlRfQ0FURUdPUllfX1ZBUklBQklMSVRZX1RZUEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERPTUFJTl9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVCA9IENPTlRFTlRfQ0FURUdPUllfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcG9ydGluZyBNYXRlcmlhbHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERPTUFJTl9fU1VQUE9SVElOR19NQVRFUklBTFMgPSBDT05URU5UX0NBVEVHT1JZX19TVVBQT1JUSU5HX01BVEVSSUFMUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db25jZXB0cyBBbmQgUGFwZXJzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBET01BSU5fX0NPTkNFUFRTX0FORF9QQVBFUlMgPSBDT05URU5UX0NBVEVHT1JZX19DT05DRVBUU19BTkRfUEFQRVJTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoZWNrbGlzdHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERPTUFJTl9fQ0hFQ0tMSVNUUyA9IENPTlRFTlRfQ0FURUdPUllfX0NIRUNLTElTVFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZGVsaW5lczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRE9NQUlOX19HVUlERUxJTkVTID0gQ09OVEVOVF9DQVRFR09SWV9fR1VJREVMSU5FUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeGFtcGxlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRE9NQUlOX19FWEFNUExFUyA9IENPTlRFTlRfQ0FURUdPUllfX0VYQU1QTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFzc2V0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRE9NQUlOX19BU1NFVFMgPSBDT05URU5UX0NBVEVHT1JZX19BU1NFVFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGVybWRlZmluaXRpb248L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERPTUFJTl9fVEVSTURFRklOSVRJT04gPSBDT05URU5UX0NBVEVHT1JZX19URVJNREVGSU5JVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Xb3JrIFByb2R1Y3RzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBET01BSU5fX1dPUktfUFJPRFVDVFMgPSBDT05URU5UX0NBVEVHT1JZX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1YmRvbWFpbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERPTUFJTl9fU1VCRE9NQUlOUyA9IENPTlRFTlRfQ0FURUdPUllfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+RG9tYWluPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERPTUFJTl9GRUFUVVJFX0NPVU5UID0gQ09OVEVOVF9DQVRFR09SWV9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX1RZUEVfX05BTUUgPSBDT05URU5UX0NBVEVHT1JZX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfVFlQRV9fR1VJRCA9IENPTlRFTlRfQ0FURUdPUllfX0dVSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfVFlQRV9fUFJFU0VOVEFUSU9OX05BTUUgPSBDT05URU5UX0NBVEVHT1JZX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9UWVBFX19CUklFRl9ERVNDUklQVElPTiA9IENPTlRFTlRfQ0FURUdPUllfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfVFlQRV9fT1dORURfUlVMRVMgPSBDT05URU5UX0NBVEVHT1JZX19PV05FRF9SVUxFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX1RZUEVfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gQ09OVEVOVF9DQVRFR09SWV9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+S2luZDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX1RZUEVfX0tJTkQgPSBDT05URU5UX0NBVEVHT1JZX19LSU5EOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfVFlQRV9fU1VQUFJFU1NFRCA9IENPTlRFTlRfQ0FURUdPUllfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfVFlQRV9fT1JERVJJTkdfR1VJREUgPSBDT05URU5UX0NBVEVHT1JZX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBBYnN0cmFjdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9UWVBFX19JU19BQlNUUkFDVCA9IENPTlRFTlRfQ0FURUdPUllfX0lTX0FCU1RSQUNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9UWVBFX19QUkVTRU5UQVRJT04gPSBDT05URU5UX0NBVEVHT1JZX19QUkVTRU5UQVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2hhcGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX1RZUEVfX1NIQVBFSUNPTiA9IENPTlRFTlRfQ0FURUdPUllfX1NIQVBFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob2RlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9UWVBFX19OT0RFSUNPTiA9IENPTlRFTlRfQ0FURUdPUllfX05PREVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfVFlQRV9fVkFSSUFCSUxJVFlfVFlQRSA9IENPTlRFTlRfQ0FURUdPUllfX1ZBUklBQklMSVRZX1RZUEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9UWVBFX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UID0gQ09OVEVOVF9DQVRFR09SWV9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwb3J0aW5nIE1hdGVyaWFsczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX1RZUEVfX1NVUFBPUlRJTkdfTUFURVJJQUxTID0gQ09OVEVOVF9DQVRFR09SWV9fU1VQUE9SVElOR19NQVRFUklBTFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29uY2VwdHMgQW5kIFBhcGVyczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX1RZUEVfX0NPTkNFUFRTX0FORF9QQVBFUlMgPSBDT05URU5UX0NBVEVHT1JZX19DT05DRVBUU19BTkRfUEFQRVJTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoZWNrbGlzdHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9UWVBFX19DSEVDS0xJU1RTID0gQ09OVEVOVF9DQVRFR09SWV9fQ0hFQ0tMSVNUUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkZWxpbmVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfVFlQRV9fR1VJREVMSU5FUyA9IENPTlRFTlRfQ0FURUdPUllfX0dVSURFTElORVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXhhbXBsZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9UWVBFX19FWEFNUExFUyA9IENPTlRFTlRfQ0FURUdPUllfX0VYQU1QTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFzc2V0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX1RZUEVfX0FTU0VUUyA9IENPTlRFTlRfQ0FURUdPUllfX0FTU0VUUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UZXJtZGVmaW5pdGlvbjwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX1RZUEVfX1RFUk1ERUZJTklUSU9OID0gQ09OVEVOVF9DQVRFR09SWV9fVEVSTURFRklOSVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+V29yayBQcm9kdWN0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX1RZUEVfX1dPUktfUFJPRFVDVFMgPSBDT05URU5UX0NBVEVHT1JZX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPldvcmsgUHJvZHVjdCBUeXBlPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9UWVBFX0ZFQVRVUkVfQ09VTlQgPSBDT05URU5UX0NBVEVHT1JZX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESVNDSVBMSU5FX0dST1VQSU5HX19OQU1FID0gQ09OVEVOVF9DQVRFR09SWV9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElTQ0lQTElORV9HUk9VUElOR19fR1VJRCA9IENPTlRFTlRfQ0FURUdPUllfX0dVSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESVNDSVBMSU5FX0dST1VQSU5HX19QUkVTRU5UQVRJT05fTkFNRSA9IENPTlRFTlRfQ0FURUdPUllfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElTQ0lQTElORV9HUk9VUElOR19fQlJJRUZfREVTQ1JJUFRJT04gPSBDT05URU5UX0NBVEVHT1JZX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElTQ0lQTElORV9HUk9VUElOR19fT1dORURfUlVMRVMgPSBDT05URU5UX0NBVEVHT1JZX19PV05FRF9SVUxFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElTQ0lQTElORV9HUk9VUElOR19fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBDT05URU5UX0NBVEVHT1JZX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5LaW5kPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESVNDSVBMSU5FX0dST1VQSU5HX19LSU5EID0gQ09OVEVOVF9DQVRFR09SWV9fS0lORDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElTQ0lQTElORV9HUk9VUElOR19fU1VQUFJFU1NFRCA9IENPTlRFTlRfQ0FURUdPUllfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESVNDSVBMSU5FX0dST1VQSU5HX19PUkRFUklOR19HVUlERSA9IENPTlRFTlRfQ0FURUdPUllfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIEFic3RyYWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElTQ0lQTElORV9HUk9VUElOR19fSVNfQUJTVFJBQ1QgPSBDT05URU5UX0NBVEVHT1JZX19JU19BQlNUUkFDVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESVNDSVBMSU5FX0dST1VQSU5HX19QUkVTRU5UQVRJT04gPSBDT05URU5UX0NBVEVHT1JZX19QUkVTRU5UQVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2hhcGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElTQ0lQTElORV9HUk9VUElOR19fU0hBUEVJQ09OID0gQ09OVEVOVF9DQVRFR09SWV9fU0hBUEVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElTQ0lQTElORV9HUk9VUElOR19fTk9ERUlDT04gPSBDT05URU5UX0NBVEVHT1JZX19OT0RFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElTQ0lQTElORV9HUk9VUElOR19fVkFSSUFCSUxJVFlfVFlQRSA9IENPTlRFTlRfQ0FURUdPUllfX1ZBUklBQklMSVRZX1RZUEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJU0NJUExJTkVfR1JPVVBJTkdfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQgPSBDT05URU5UX0NBVEVHT1JZX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHBvcnRpbmcgTWF0ZXJpYWxzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESVNDSVBMSU5FX0dST1VQSU5HX19TVVBQT1JUSU5HX01BVEVSSUFMUyA9IENPTlRFTlRfQ0FURUdPUllfX1NVUFBPUlRJTkdfTUFURVJJQUxTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbmNlcHRzIEFuZCBQYXBlcnM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJU0NJUExJTkVfR1JPVVBJTkdfX0NPTkNFUFRTX0FORF9QQVBFUlMgPSBDT05URU5UX0NBVEVHT1JZX19DT05DRVBUU19BTkRfUEFQRVJTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoZWNrbGlzdHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJU0NJUExJTkVfR1JPVVBJTkdfX0NIRUNLTElTVFMgPSBDT05URU5UX0NBVEVHT1JZX19DSEVDS0xJU1RTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWRlbGluZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJU0NJUExJTkVfR1JPVVBJTkdfX0dVSURFTElORVMgPSBDT05URU5UX0NBVEVHT1JZX19HVUlERUxJTkVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4YW1wbGVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESVNDSVBMSU5FX0dST1VQSU5HX19FWEFNUExFUyA9IENPTlRFTlRfQ0FURUdPUllfX0VYQU1QTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFzc2V0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElTQ0lQTElORV9HUk9VUElOR19fQVNTRVRTID0gQ09OVEVOVF9DQVRFR09SWV9fQVNTRVRTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRlcm1kZWZpbml0aW9uPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESVNDSVBMSU5FX0dST1VQSU5HX19URVJNREVGSU5JVElPTiA9IENPTlRFTlRfQ0FURUdPUllfX1RFUk1ERUZJTklUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRpc2NpcGxpbmVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESVNDSVBMSU5FX0dST1VQSU5HX19ESVNDSVBMSU5FUyA9IENPTlRFTlRfQ0FURUdPUllfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+RGlzY2lwbGluZSBHcm91cGluZzwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESVNDSVBMSU5FX0dST1VQSU5HX0ZFQVRVUkVfQ09VTlQgPSBDT05URU5UX0NBVEVHT1JZX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESVNDSVBMSU5FX19OQU1FID0gQ09OVEVOVF9DQVRFR09SWV9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElTQ0lQTElORV9fR1VJRCA9IENPTlRFTlRfQ0FURUdPUllfX0dVSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESVNDSVBMSU5FX19QUkVTRU5UQVRJT05fTkFNRSA9IENPTlRFTlRfQ0FURUdPUllfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElTQ0lQTElORV9fQlJJRUZfREVTQ1JJUFRJT04gPSBDT05URU5UX0NBVEVHT1JZX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElTQ0lQTElORV9fT1dORURfUlVMRVMgPSBDT05URU5UX0NBVEVHT1JZX19PV05FRF9SVUxFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElTQ0lQTElORV9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBDT05URU5UX0NBVEVHT1JZX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5LaW5kPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESVNDSVBMSU5FX19LSU5EID0gQ09OVEVOVF9DQVRFR09SWV9fS0lORDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElTQ0lQTElORV9fU1VQUFJFU1NFRCA9IENPTlRFTlRfQ0FURUdPUllfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESVNDSVBMSU5FX19PUkRFUklOR19HVUlERSA9IENPTlRFTlRfQ0FURUdPUllfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIEFic3RyYWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElTQ0lQTElORV9fSVNfQUJTVFJBQ1QgPSBDT05URU5UX0NBVEVHT1JZX19JU19BQlNUUkFDVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESVNDSVBMSU5FX19QUkVTRU5UQVRJT04gPSBDT05URU5UX0NBVEVHT1JZX19QUkVTRU5UQVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2hhcGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElTQ0lQTElORV9fU0hBUEVJQ09OID0gQ09OVEVOVF9DQVRFR09SWV9fU0hBUEVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElTQ0lQTElORV9fTk9ERUlDT04gPSBDT05URU5UX0NBVEVHT1JZX19OT0RFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElTQ0lQTElORV9fVkFSSUFCSUxJVFlfVFlQRSA9IENPTlRFTlRfQ0FURUdPUllfX1ZBUklBQklMSVRZX1RZUEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJU0NJUExJTkVfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQgPSBDT05URU5UX0NBVEVHT1JZX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHBvcnRpbmcgTWF0ZXJpYWxzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESVNDSVBMSU5FX19TVVBQT1JUSU5HX01BVEVSSUFMUyA9IENPTlRFTlRfQ0FURUdPUllfX1NVUFBPUlRJTkdfTUFURVJJQUxTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbmNlcHRzIEFuZCBQYXBlcnM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJU0NJUExJTkVfX0NPTkNFUFRTX0FORF9QQVBFUlMgPSBDT05URU5UX0NBVEVHT1JZX19DT05DRVBUU19BTkRfUEFQRVJTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoZWNrbGlzdHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJU0NJUExJTkVfX0NIRUNLTElTVFMgPSBDT05URU5UX0NBVEVHT1JZX19DSEVDS0xJU1RTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWRlbGluZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJU0NJUExJTkVfX0dVSURFTElORVMgPSBDT05URU5UX0NBVEVHT1JZX19HVUlERUxJTkVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4YW1wbGVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESVNDSVBMSU5FX19FWEFNUExFUyA9IENPTlRFTlRfQ0FURUdPUllfX0VYQU1QTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFzc2V0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElTQ0lQTElORV9fQVNTRVRTID0gQ09OVEVOVF9DQVRFR09SWV9fQVNTRVRTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRlcm1kZWZpbml0aW9uPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESVNDSVBMSU5FX19URVJNREVGSU5JVElPTiA9IENPTlRFTlRfQ0FURUdPUllfX1RFUk1ERUZJTklUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRhc2tzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESVNDSVBMSU5FX19UQVNLUyA9IENPTlRFTlRfQ0FURUdPUllfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3ViZGlzY2lwbGluZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElTQ0lQTElORV9fU1VCRElTQ0lQTElORSA9IENPTlRFTlRfQ0FURUdPUllfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVmZXJlbmNlIFdvcmtmbG93czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElTQ0lQTElORV9fUkVGRVJFTkNFX1dPUktGTE9XUyA9IENPTlRFTlRfQ0FURUdPUllfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+RGlzY2lwbGluZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESVNDSVBMSU5FX0ZFQVRVUkVfQ09VTlQgPSBDT05URU5UX0NBVEVHT1JZX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0VMRU1FTlRfX05BTUUgPSBERVNDUklCQUJMRV9FTEVNRU5UX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0VMRU1FTlRfX0dVSUQgPSBERVNDUklCQUJMRV9FTEVNRU5UX19HVUlEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19FTEVNRU5UX19QUkVTRU5UQVRJT05fTkFNRSA9IERFU0NSSUJBQkxFX0VMRU1FTlRfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19FTEVNRU5UX19CUklFRl9ERVNDUklQVElPTiA9IERFU0NSSUJBQkxFX0VMRU1FTlRfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0VMRU1FTlRfX09XTkVEX1JVTEVTID0gREVTQ1JJQkFCTEVfRUxFTUVOVF9fT1dORURfUlVMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfRUxFTUVOVF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBERVNDUklCQUJMRV9FTEVNRU5UX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5LaW5kPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0VMRU1FTlRfX0tJTkQgPSBERVNDUklCQUJMRV9FTEVNRU5UX19LSU5EOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0VMRU1FTlRfX1NVUFBSRVNTRUQgPSBERVNDUklCQUJMRV9FTEVNRU5UX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19FTEVNRU5UX19PUkRFUklOR19HVUlERSA9IERFU0NSSUJBQkxFX0VMRU1FTlRfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIEFic3RyYWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19FTEVNRU5UX19JU19BQlNUUkFDVCA9IERFU0NSSUJBQkxFX0VMRU1FTlRfX0lTX0FCU1RSQUNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfRUxFTUVOVF9fUFJFU0VOVEFUSU9OID0gREVTQ1JJQkFCTEVfRUxFTUVOVF9fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNoYXBlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfRUxFTUVOVF9fU0hBUEVJQ09OID0gREVTQ1JJQkFCTEVfRUxFTUVOVF9fU0hBUEVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19FTEVNRU5UX19OT0RFSUNPTiA9IERFU0NSSUJBQkxFX0VMRU1FTlRfX05PREVJQ09OOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlByb2Nlc3MgRWxlbWVudDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCA9IERFU0NSSUJBQkxFX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJSRUFLRE9XTl9FTEVNRU5UX19OQU1FID0gUFJPQ0VTU19FTEVNRU5UX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCUkVBS0RPV05fRUxFTUVOVF9fR1VJRCA9IFBST0NFU1NfRUxFTUVOVF9fR1VJRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJSRUFLRE9XTl9FTEVNRU5UX19QUkVTRU5UQVRJT05fTkFNRSA9IFBST0NFU1NfRUxFTUVOVF9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCUkVBS0RPV05fRUxFTUVOVF9fQlJJRUZfREVTQ1JJUFRJT04gPSBQUk9DRVNTX0VMRU1FTlRfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCUkVBS0RPV05fRUxFTUVOVF9fT1dORURfUlVMRVMgPSBQUk9DRVNTX0VMRU1FTlRfX09XTkVEX1JVTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCUkVBS0RPV05fRUxFTUVOVF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBQUk9DRVNTX0VMRU1FTlRfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPktpbmQ8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJSRUFLRE9XTl9FTEVNRU5UX19LSU5EID0gUFJPQ0VTU19FTEVNRU5UX19LSU5EOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCUkVBS0RPV05fRUxFTUVOVF9fU1VQUFJFU1NFRCA9IFBST0NFU1NfRUxFTUVOVF9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJSRUFLRE9XTl9FTEVNRU5UX19PUkRFUklOR19HVUlERSA9IFBST0NFU1NfRUxFTUVOVF9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgQWJzdHJhY3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCUkVBS0RPV05fRUxFTUVOVF9fSVNfQUJTVFJBQ1QgPSBQUk9DRVNTX0VMRU1FTlRfX0lTX0FCU1RSQUNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJSRUFLRE9XTl9FTEVNRU5UX19QUkVTRU5UQVRJT04gPSBQUk9DRVNTX0VMRU1FTlRfX1BSRVNFTlRBVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TaGFwZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCUkVBS0RPV05fRUxFTUVOVF9fU0hBUEVJQ09OID0gUFJPQ0VTU19FTEVNRU5UX19TSEFQRUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm9kZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCUkVBS0RPV05fRUxFTUVOVF9fTk9ERUlDT04gPSBQUk9DRVNTX0VMRU1FTlRfX05PREVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZWZpeDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJSRUFLRE9XTl9FTEVNRU5UX19QUkVGSVggPSBQUk9DRVNTX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgUGxhbm5lZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJSRUFLRE9XTl9FTEVNRU5UX19JU19QTEFOTkVEID0gUFJPQ0VTU19FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkhhcyBNdWx0aXBsZSBPY2N1cnJlbmNlczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJSRUFLRE9XTl9FTEVNRU5UX19IQVNfTVVMVElQTEVfT0NDVVJSRU5DRVMgPSBQUk9DRVNTX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgT3B0aW9uYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCUkVBS0RPV05fRUxFTUVOVF9fSVNfT1BUSU9OQUwgPSBQUk9DRVNTX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGVkIEFmdGVyPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQlJFQUtET1dOX0VMRU1FTlRfX1BSRVNFTlRFRF9BRlRFUiA9IFBST0NFU1NfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50ZWQgQmVmb3JlPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQlJFQUtET1dOX0VMRU1FTlRfX1BSRVNFTlRFRF9CRUZPUkUgPSBQUk9DRVNTX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UGxhbm5pbmcgRGF0YTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJSRUFLRE9XTl9FTEVNRU5UX19QTEFOTklOR19EQVRBID0gUFJPQ0VTU19FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA2OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cGVyIEFjdGl2aXRpZXM8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCUkVBS0RPV05fRUxFTUVOVF9fU1VQRVJfQUNUSVZJVElFUyA9IFBST0NFU1NfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgNzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGVja2xpc3RzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCUkVBS0RPV05fRUxFTUVOVF9fQ0hFQ0tMSVNUUyA9IFBST0NFU1NfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgODsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db25jZXB0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQlJFQUtET1dOX0VMRU1FTlRfX0NPTkNFUFRTID0gUFJPQ0VTU19FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA5OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4YW1wbGVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCUkVBS0RPV05fRUxFTUVOVF9fRVhBTVBMRVMgPSBQUk9DRVNTX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDEwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWRlbGluZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJSRUFLRE9XTl9FTEVNRU5UX19HVUlERUxJTkVTID0gUFJPQ0VTU19FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXVzYWJsZSBBc3NldHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJSRUFLRE9XTl9FTEVNRU5UX19SRVVTQUJMRV9BU1NFVFMgPSBQUk9DRVNTX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDEyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHBvcnRpbmcgTWF0ZXJpYWxzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCUkVBS0RPV05fRUxFTUVOVF9fU1VQUE9SVElOR19NQVRFUklBTFMgPSBQUk9DRVNTX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDEzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRlbXBsYXRlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQlJFQUtET1dOX0VMRU1FTlRfX1RFTVBMQVRFUyA9IFBST0NFU1NfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMTQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVwb3J0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQlJFQUtET1dOX0VMRU1FTlRfX1JFUE9SVFMgPSBQUk9DRVNTX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDE1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVzdGltYXRpb25jb25zaWRlcmF0aW9uczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQlJFQUtET1dOX0VMRU1FTlRfX0VTVElNQVRJT05DT05TSURFUkFUSU9OUyA9IFBST0NFU1NfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMTY7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VG9vbG1lbnRvcjwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQlJFQUtET1dOX0VMRU1FTlRfX1RPT0xNRU5UT1IgPSBQUk9DRVNTX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDE3OwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkJyZWFrZG93biBFbGVtZW50PC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJSRUFLRE9XTl9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgPSBQUk9DRVNTX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDE4OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19OQU1FID0gQlJFQUtET1dOX0VMRU1FTlRfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0dVSUQgPSBCUkVBS0RPV05fRUxFTUVOVF9fR1VJRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX1BSRVNFTlRBVElPTl9OQU1FID0gQlJFQUtET1dOX0VMRU1FTlRfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19CUkVBS0RPV05fRUxFTUVOVF9fQlJJRUZfREVTQ1JJUFRJT04gPSBCUkVBS0RPV05fRUxFTUVOVF9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX09XTkVEX1JVTEVTID0gQlJFQUtET1dOX0VMRU1FTlRfX09XTkVEX1JVTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IEJSRUFLRE9XTl9FTEVNRU5UX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5LaW5kPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19LSU5EID0gQlJFQUtET1dOX0VMRU1FTlRfX0tJTkQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX1NVUFBSRVNTRUQgPSBCUkVBS0RPV05fRUxFTUVOVF9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX09SREVSSU5HX0dVSURFID0gQlJFQUtET1dOX0VMRU1FTlRfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIEFic3RyYWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19CUkVBS0RPV05fRUxFTUVOVF9fSVNfQUJTVFJBQ1QgPSBCUkVBS0RPV05fRUxFTUVOVF9fSVNfQUJTVFJBQ1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19CUkVBS0RPV05fRUxFTUVOVF9fUFJFU0VOVEFUSU9OID0gQlJFQUtET1dOX0VMRU1FTlRfX1BSRVNFTlRBVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TaGFwZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19TSEFQRUlDT04gPSBCUkVBS0RPV05fRUxFTUVOVF9fU0hBUEVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19CUkVBS0RPV05fRUxFTUVOVF9fTk9ERUlDT04gPSBCUkVBS0RPV05fRUxFTUVOVF9fTk9ERUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlZml4PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19CUkVBS0RPV05fRUxFTUVOVF9fUFJFRklYID0gQlJFQUtET1dOX0VMRU1FTlRfX1BSRUZJWDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBQbGFubmVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19CUkVBS0RPV05fRUxFTUVOVF9fSVNfUExBTk5FRCA9IEJSRUFLRE9XTl9FTEVNRU5UX19JU19QTEFOTkVEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkhhcyBNdWx0aXBsZSBPY2N1cnJlbmNlczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0hBU19NVUxUSVBMRV9PQ0NVUlJFTkNFUyA9IEJSRUFLRE9XTl9FTEVNRU5UX19IQVNfTVVMVElQTEVfT0NDVVJSRU5DRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgT3B0aW9uYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19JU19PUFRJT05BTCA9IEJSRUFLRE9XTl9FTEVNRU5UX19JU19PUFRJT05BTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50ZWQgQWZ0ZXI8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19QUkVTRU5URURfQUZURVIgPSBCUkVBS0RPV05fRUxFTUVOVF9fUFJFU0VOVEVEX0FGVEVSOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRlZCBCZWZvcmU8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19QUkVTRU5URURfQkVGT1JFID0gQlJFQUtET1dOX0VMRU1FTlRfX1BSRVNFTlRFRF9CRUZPUkU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UGxhbm5pbmcgRGF0YTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX1BMQU5OSU5HX0RBVEEgPSBCUkVBS0RPV05fRUxFTUVOVF9fUExBTk5JTkdfREFUQTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBlciBBY3Rpdml0aWVzPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19CUkVBS0RPV05fRUxFTUVOVF9fU1VQRVJfQUNUSVZJVElFUyA9IEJSRUFLRE9XTl9FTEVNRU5UX19TVVBFUl9BQ1RJVklUSUVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoZWNrbGlzdHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0NIRUNLTElTVFMgPSBCUkVBS0RPV05fRUxFTUVOVF9fQ0hFQ0tMSVNUUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db25jZXB0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19CUkVBS0RPV05fRUxFTUVOVF9fQ09OQ0VQVFMgPSBCUkVBS0RPV05fRUxFTUVOVF9fQ09OQ0VQVFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXhhbXBsZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0VYQU1QTEVTID0gQlJFQUtET1dOX0VMRU1FTlRfX0VYQU1QTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWRlbGluZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0dVSURFTElORVMgPSBCUkVBS0RPV05fRUxFTUVOVF9fR1VJREVMSU5FUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXVzYWJsZSBBc3NldHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX1JFVVNBQkxFX0FTU0VUUyA9IEJSRUFLRE9XTl9FTEVNRU5UX19SRVVTQUJMRV9BU1NFVFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcG9ydGluZyBNYXRlcmlhbHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX1NVUFBPUlRJTkdfTUFURVJJQUxTID0gQlJFQUtET1dOX0VMRU1FTlRfX1NVUFBPUlRJTkdfTUFURVJJQUxTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRlbXBsYXRlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19CUkVBS0RPV05fRUxFTUVOVF9fVEVNUExBVEVTID0gQlJFQUtET1dOX0VMRU1FTlRfX1RFTVBMQVRFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXBvcnRzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19SRVBPUlRTID0gQlJFQUtET1dOX0VMRU1FTlRfX1JFUE9SVFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXN0aW1hdGlvbmNvbnNpZGVyYXRpb25zPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19FU1RJTUFUSU9OQ09OU0lERVJBVElPTlMgPSBCUkVBS0RPV05fRUxFTUVOVF9fRVNUSU1BVElPTkNPTlNJREVSQVRJT05TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRvb2xtZW50b3I8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX1RPT0xNRU5UT1IgPSBCUkVBS0RPV05fRUxFTUVOVF9fVE9PTE1FTlRPUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBSZXBlYXRhYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19CUkVBS0RPV05fRUxFTUVOVF9fSVNfUkVQRUFUQUJMRSA9IEJSRUFLRE9XTl9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIE9uZ29pbmc8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19JU19PTkdPSU5HID0gQlJFQUtET1dOX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgRXZlbnQgRHJpdmVuPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19CUkVBS0RPV05fRUxFTUVOVF9fSVNfRVZFTlRfRFJJVkVOID0gQlJFQUtET1dOX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TGluayBUbyBQcmVkZWNlc3NvcjwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19CUkVBS0RPV05fRUxFTUVOVF9fTElOS19UT19QUkVERUNFU1NPUiA9IEJSRUFLRE9XTl9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPldvcmsgQnJlYWtkb3duIEVsZW1lbnQ8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19CUkVBS0RPV05fRUxFTUVOVF9GRUFUVVJFX0NPVU5UID0gQlJFQUtET1dOX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX19OQU1FID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfX0dVSUQgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19HVUlEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfX1BSRVNFTlRBVElPTl9OQU1FID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9fQlJJRUZfREVTQ1JJUFRJT04gPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfX09XTkVEX1JVTEVTID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fT1dORURfUlVMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPktpbmQ8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX19LSU5EID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fS0lORDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfX1NVUFBSRVNTRUQgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfX09SREVSSU5HX0dVSURFID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgQWJzdHJhY3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9fSVNfQUJTVFJBQ1QgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19JU19BQlNUUkFDVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9fUFJFU0VOVEFUSU9OID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNoYXBlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX19TSEFQRUlDT04gPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19TSEFQRUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm9kZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9fTk9ERUlDT04gPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19OT0RFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVmaXg8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9fUFJFRklYID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fUFJFRklYOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIFBsYW5uZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9fSVNfUExBTk5FRCA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0lTX1BMQU5ORUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SGFzIE11bHRpcGxlIE9jY3VycmVuY2VzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfX0hBU19NVUxUSVBMRV9PQ0NVUlJFTkNFUyA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0hBU19NVUxUSVBMRV9PQ0NVUlJFTkNFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBPcHRpb25hbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX19JU19PUFRJT05BTCA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0lTX09QVElPTkFMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRlZCBBZnRlcjwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX19QUkVTRU5URURfQUZURVIgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19QUkVTRU5URURfQUZURVI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGVkIEJlZm9yZTwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX19QUkVTRU5URURfQkVGT1JFID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fUFJFU0VOVEVEX0JFRk9SRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QbGFubmluZyBEYXRhPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfX1BMQU5OSU5HX0RBVEEgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19QTEFOTklOR19EQVRBOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cGVyIEFjdGl2aXRpZXM8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9fU1VQRVJfQUNUSVZJVElFUyA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX1NVUEVSX0FDVElWSVRJRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hlY2tsaXN0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfX0NIRUNLTElTVFMgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19DSEVDS0xJU1RTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbmNlcHRzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9fQ09OQ0VQVFMgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19DT05DRVBUUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeGFtcGxlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfX0VYQU1QTEVTID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fRVhBTVBMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZGVsaW5lczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfX0dVSURFTElORVMgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19HVUlERUxJTkVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJldXNhYmxlIEFzc2V0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfX1JFVVNBQkxFX0FTU0VUUyA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX1JFVVNBQkxFX0FTU0VUUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwb3J0aW5nIE1hdGVyaWFsczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfX1NVUFBPUlRJTkdfTUFURVJJQUxTID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fU1VQUE9SVElOR19NQVRFUklBTFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGVtcGxhdGVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9fVEVNUExBVEVTID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fVEVNUExBVEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlcG9ydHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX19SRVBPUlRTID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fUkVQT1JUUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Fc3RpbWF0aW9uY29uc2lkZXJhdGlvbnM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX19FU1RJTUFUSU9OQ09OU0lERVJBVElPTlMgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19FU1RJTUFUSU9OQ09OU0lERVJBVElPTlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VG9vbG1lbnRvcjwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfX1RPT0xNRU5UT1IgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19UT09MTUVOVE9SOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIFJlcGVhdGFibGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9fSVNfUkVQRUFUQUJMRSA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0lTX1JFUEVBVEFCTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgT25nb2luZzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX19JU19PTkdPSU5HID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fSVNfT05HT0lORzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBFdmVudCBEcml2ZW48L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9fSVNfRVZFTlRfRFJJVkVOID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fSVNfRVZFTlRfRFJJVkVOOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxpbmsgVG8gUHJlZGVjZXNzb3I8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX19MSU5LX1RPX1BSRURFQ0VTU09SID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fTElOS19UT19QUkVERUNFU1NPUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GdWxmaWxsczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfX0ZVTEZJTExTID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfX1ZBUklBQklMSVRZX1RZUEUgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVCA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlY29uZGl0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfX1BSRUNPTkRJVElPTiA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UG9zdGNvbmRpdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX19QT1NUQ09ORElUSU9OID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmVha2Rvd24gRWxlbWVudHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX19CUkVBS0RPV05fRUxFTUVOVFMgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJvYWRtYXBzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9fUk9BRE1BUFMgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA2OwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkFjdGl2aXR5PC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX0ZFQVRVUkVfQ09VTlQgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA3OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQTEFOTklOR19EQVRBX19OQU1FID0gUFJPQ0VTU19FTEVNRU5UX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQTEFOTklOR19EQVRBX19HVUlEID0gUFJPQ0VTU19FTEVNRU5UX19HVUlEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUExBTk5JTkdfREFUQV9fUFJFU0VOVEFUSU9OX05BTUUgPSBQUk9DRVNTX0VMRU1FTlRfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUExBTk5JTkdfREFUQV9fQlJJRUZfREVTQ1JJUFRJT04gPSBQUk9DRVNTX0VMRU1FTlRfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQTEFOTklOR19EQVRBX19PV05FRF9SVUxFUyA9IFBST0NFU1NfRUxFTUVOVF9fT1dORURfUlVMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBMQU5OSU5HX0RBVEFfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gUFJPQ0VTU19FTEVNRU5UX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5LaW5kPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQTEFOTklOR19EQVRBX19LSU5EID0gUFJPQ0VTU19FTEVNRU5UX19LSU5EOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQTEFOTklOR19EQVRBX19TVVBQUkVTU0VEID0gUFJPQ0VTU19FTEVNRU5UX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUExBTk5JTkdfREFUQV9fT1JERVJJTkdfR1VJREUgPSBQUk9DRVNTX0VMRU1FTlRfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIEFic3RyYWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUExBTk5JTkdfREFUQV9fSVNfQUJTVFJBQ1QgPSBQUk9DRVNTX0VMRU1FTlRfX0lTX0FCU1RSQUNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBMQU5OSU5HX0RBVEFfX1BSRVNFTlRBVElPTiA9IFBST0NFU1NfRUxFTUVOVF9fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNoYXBlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBMQU5OSU5HX0RBVEFfX1NIQVBFSUNPTiA9IFBST0NFU1NfRUxFTUVOVF9fU0hBUEVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUExBTk5JTkdfREFUQV9fTk9ERUlDT04gPSBQUk9DRVNTX0VMRU1FTlRfX05PREVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN0YXJ0IERhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQTEFOTklOR19EQVRBX19TVEFSVF9EQVRFID0gUFJPQ0VTU19FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZpbmlzaCBEYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUExBTk5JTkdfREFUQV9fRklOSVNIX0RBVEUgPSBQUk9DRVNTX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmFuazwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBMQU5OSU5HX0RBVEFfX1JBTksgPSBQUk9DRVNTX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+UGxhbm5pbmcgRGF0YTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQTEFOTklOR19EQVRBX0ZFQVRVUkVfQ09VTlQgPSBQUk9DRVNTX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfT1JERVJfX05BTUUgPSBQUk9DRVNTX0VMRU1FTlRfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfT1JERVJfX0dVSUQgPSBQUk9DRVNTX0VMRU1FTlRfX0dVSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX09SREVSX19QUkVTRU5UQVRJT05fTkFNRSA9IFBST0NFU1NfRUxFTUVOVF9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX09SREVSX19CUklFRl9ERVNDUklQVElPTiA9IFBST0NFU1NfRUxFTUVOVF9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfT1JERVJfX09XTkVEX1JVTEVTID0gUFJPQ0VTU19FTEVNRU5UX19PV05FRF9SVUxFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19PUkRFUl9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBQUk9DRVNTX0VMRU1FTlRfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPktpbmQ8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfT1JERVJfX0tJTkQgPSBQUk9DRVNTX0VMRU1FTlRfX0tJTkQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfT1JERVJfX1NVUFBSRVNTRUQgPSBQUk9DRVNTX0VMRU1FTlRfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX09SREVSX19PUkRFUklOR19HVUlERSA9IFBST0NFU1NfRUxFTUVOVF9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgQWJzdHJhY3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX09SREVSX19JU19BQlNUUkFDVCA9IFBST0NFU1NfRUxFTUVOVF9fSVNfQUJTVFJBQ1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19PUkRFUl9fUFJFU0VOVEFUSU9OID0gUFJPQ0VTU19FTEVNRU5UX19QUkVTRU5UQVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2hhcGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19PUkRFUl9fU0hBUEVJQ09OID0gUFJPQ0VTU19FTEVNRU5UX19TSEFQRUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm9kZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX09SREVSX19OT0RFSUNPTiA9IFBST0NFU1NfRUxFTUVOVF9fTk9ERUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TGluayBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19PUkRFUl9fTElOS19UWVBFID0gUFJPQ0VTU19FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZWQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX09SREVSX19QUkVEID0gUFJPQ0VTU19FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPldvcmsgT3JkZXI8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19PUkRFUl9GRUFUVVJFX0NPVU5UID0gUFJPQ0VTU19FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0FETUFQX19OQU1FID0gR1VJREFOQ0VfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPQURNQVBfX0dVSUQgPSBHVUlEQU5DRV9fR1VJRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPQURNQVBfX1BSRVNFTlRBVElPTl9OQU1FID0gR1VJREFOQ0VfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9BRE1BUF9fQlJJRUZfREVTQ1JJUFRJT04gPSBHVUlEQU5DRV9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPQURNQVBfX09XTkVEX1JVTEVTID0gR1VJREFOQ0VfX09XTkVEX1JVTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0FETUFQX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IEdVSURBTkNFX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5LaW5kPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0FETUFQX19LSU5EID0gR1VJREFOQ0VfX0tJTkQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPQURNQVBfX1NVUFBSRVNTRUQgPSBHVUlEQU5DRV9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPQURNQVBfX09SREVSSU5HX0dVSURFID0gR1VJREFOQ0VfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIEFic3RyYWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9BRE1BUF9fSVNfQUJTVFJBQ1QgPSBHVUlEQU5DRV9fSVNfQUJTVFJBQ1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9BRE1BUF9fUFJFU0VOVEFUSU9OID0gR1VJREFOQ0VfX1BSRVNFTlRBVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TaGFwZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0FETUFQX19TSEFQRUlDT04gPSBHVUlEQU5DRV9fU0hBUEVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9BRE1BUF9fTk9ERUlDT04gPSBHVUlEQU5DRV9fTk9ERUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPQURNQVBfX1ZBUklBQklMSVRZX1RZUEUgPSBHVUlEQU5DRV9fVkFSSUFCSUxJVFlfVFlQRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9BRE1BUF9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVCA9IEdVSURBTkNFX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHBvcnRpbmcgTWF0ZXJpYWxzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0FETUFQX19TVVBQT1JUSU5HX01BVEVSSUFMUyA9IEdVSURBTkNFX19TVVBQT1JUSU5HX01BVEVSSUFMUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db25jZXB0cyBBbmQgUGFwZXJzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0FETUFQX19DT05DRVBUU19BTkRfUEFQRVJTID0gR1VJREFOQ0VfX0NPTkNFUFRTX0FORF9QQVBFUlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hlY2tsaXN0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9BRE1BUF9fQ0hFQ0tMSVNUUyA9IEdVSURBTkNFX19DSEVDS0xJU1RTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWRlbGluZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPQURNQVBfX0dVSURFTElORVMgPSBHVUlEQU5DRV9fR1VJREVMSU5FUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeGFtcGxlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9BRE1BUF9fRVhBTVBMRVMgPSBHVUlEQU5DRV9fRVhBTVBMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXNzZXRzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0FETUFQX19BU1NFVFMgPSBHVUlEQU5DRV9fQVNTRVRTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRlcm1kZWZpbml0aW9uPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0FETUFQX19URVJNREVGSU5JVElPTiA9IEdVSURBTkNFX19URVJNREVGSU5JVElPTjsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Sb2FkbWFwPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPQURNQVBfRkVBVFVSRV9DT1VOVCA9IEdVSURBTkNFX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUT09MX19OQU1FID0gQ09OVEVOVF9DQVRFR09SWV9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVE9PTF9fR1VJRCA9IENPTlRFTlRfQ0FURUdPUllfX0dVSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUT09MX19QUkVTRU5UQVRJT05fTkFNRSA9IENPTlRFTlRfQ0FURUdPUllfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVE9PTF9fQlJJRUZfREVTQ1JJUFRJT04gPSBDT05URU5UX0NBVEVHT1JZX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVE9PTF9fT1dORURfUlVMRVMgPSBDT05URU5UX0NBVEVHT1JZX19PV05FRF9SVUxFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVE9PTF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBDT05URU5UX0NBVEVHT1JZX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5LaW5kPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUT09MX19LSU5EID0gQ09OVEVOVF9DQVRFR09SWV9fS0lORDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVE9PTF9fU1VQUFJFU1NFRCA9IENPTlRFTlRfQ0FURUdPUllfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUT09MX19PUkRFUklOR19HVUlERSA9IENPTlRFTlRfQ0FURUdPUllfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIEFic3RyYWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVE9PTF9fSVNfQUJTVFJBQ1QgPSBDT05URU5UX0NBVEVHT1JZX19JU19BQlNUUkFDVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUT09MX19QUkVTRU5UQVRJT04gPSBDT05URU5UX0NBVEVHT1JZX19QUkVTRU5UQVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2hhcGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVE9PTF9fU0hBUEVJQ09OID0gQ09OVEVOVF9DQVRFR09SWV9fU0hBUEVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVE9PTF9fTk9ERUlDT04gPSBDT05URU5UX0NBVEVHT1JZX19OT0RFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVE9PTF9fVkFSSUFCSUxJVFlfVFlQRSA9IENPTlRFTlRfQ0FURUdPUllfX1ZBUklBQklMSVRZX1RZUEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRPT0xfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQgPSBDT05URU5UX0NBVEVHT1JZX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHBvcnRpbmcgTWF0ZXJpYWxzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUT09MX19TVVBQT1JUSU5HX01BVEVSSUFMUyA9IENPTlRFTlRfQ0FURUdPUllfX1NVUFBPUlRJTkdfTUFURVJJQUxTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbmNlcHRzIEFuZCBQYXBlcnM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRPT0xfX0NPTkNFUFRTX0FORF9QQVBFUlMgPSBDT05URU5UX0NBVEVHT1JZX19DT05DRVBUU19BTkRfUEFQRVJTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoZWNrbGlzdHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRPT0xfX0NIRUNLTElTVFMgPSBDT05URU5UX0NBVEVHT1JZX19DSEVDS0xJU1RTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWRlbGluZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRPT0xfX0dVSURFTElORVMgPSBDT05URU5UX0NBVEVHT1JZX19HVUlERUxJTkVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4YW1wbGVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUT09MX19FWEFNUExFUyA9IENPTlRFTlRfQ0FURUdPUllfX0VYQU1QTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFzc2V0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVE9PTF9fQVNTRVRTID0gQ09OVEVOVF9DQVRFR09SWV9fQVNTRVRTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRlcm1kZWZpbml0aW9uPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUT09MX19URVJNREVGSU5JVElPTiA9IENPTlRFTlRfQ0FURUdPUllfX1RFUk1ERUZJTklUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRvb2wgTWVudG9yczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVE9PTF9fVE9PTF9NRU5UT1JTID0gQ09OVEVOVF9DQVRFR09SWV9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Ub29sPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRPT0xfRkVBVFVSRV9DT1VOVCA9IENPTlRFTlRfQ0FURUdPUllfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfU0VUX0dST1VQSU5HX19OQU1FID0gQ09OVEVOVF9DQVRFR09SWV9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9TRVRfR1JPVVBJTkdfX0dVSUQgPSBDT05URU5UX0NBVEVHT1JZX19HVUlEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9TRVRfR1JPVVBJTkdfX1BSRVNFTlRBVElPTl9OQU1FID0gQ09OVEVOVF9DQVRFR09SWV9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX1NFVF9HUk9VUElOR19fQlJJRUZfREVTQ1JJUFRJT04gPSBDT05URU5UX0NBVEVHT1JZX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9TRVRfR1JPVVBJTkdfX09XTkVEX1JVTEVTID0gQ09OVEVOVF9DQVRFR09SWV9fT1dORURfUlVMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfU0VUX0dST1VQSU5HX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IENPTlRFTlRfQ0FURUdPUllfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPktpbmQ8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfU0VUX0dST1VQSU5HX19LSU5EID0gQ09OVEVOVF9DQVRFR09SWV9fS0lORDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9TRVRfR1JPVVBJTkdfX1NVUFBSRVNTRUQgPSBDT05URU5UX0NBVEVHT1JZX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9TRVRfR1JPVVBJTkdfX09SREVSSU5HX0dVSURFID0gQ09OVEVOVF9DQVRFR09SWV9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgQWJzdHJhY3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX1NFVF9HUk9VUElOR19fSVNfQUJTVFJBQ1QgPSBDT05URU5UX0NBVEVHT1JZX19JU19BQlNUUkFDVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX1NFVF9HUk9VUElOR19fUFJFU0VOVEFUSU9OID0gQ09OVEVOVF9DQVRFR09SWV9fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNoYXBlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfU0VUX0dST1VQSU5HX19TSEFQRUlDT04gPSBDT05URU5UX0NBVEVHT1JZX19TSEFQRUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm9kZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX1NFVF9HUk9VUElOR19fTk9ERUlDT04gPSBDT05URU5UX0NBVEVHT1JZX19OT0RFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9TRVRfR1JPVVBJTkdfX1ZBUklBQklMSVRZX1RZUEUgPSBDT05URU5UX0NBVEVHT1JZX19WQVJJQUJJTElUWV9UWVBFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX1NFVF9HUk9VUElOR19fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVCA9IENPTlRFTlRfQ0FURUdPUllfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcG9ydGluZyBNYXRlcmlhbHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfU0VUX0dST1VQSU5HX19TVVBQT1JUSU5HX01BVEVSSUFMUyA9IENPTlRFTlRfQ0FURUdPUllfX1NVUFBPUlRJTkdfTUFURVJJQUxTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbmNlcHRzIEFuZCBQYXBlcnM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfU0VUX0dST1VQSU5HX19DT05DRVBUU19BTkRfUEFQRVJTID0gQ09OVEVOVF9DQVRFR09SWV9fQ09OQ0VQVFNfQU5EX1BBUEVSUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGVja2xpc3RzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX1NFVF9HUk9VUElOR19fQ0hFQ0tMSVNUUyA9IENPTlRFTlRfQ0FURUdPUllfX0NIRUNLTElTVFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZGVsaW5lczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9TRVRfR1JPVVBJTkdfX0dVSURFTElORVMgPSBDT05URU5UX0NBVEVHT1JZX19HVUlERUxJTkVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4YW1wbGVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX1NFVF9HUk9VUElOR19fRVhBTVBMRVMgPSBDT05URU5UX0NBVEVHT1JZX19FWEFNUExFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Bc3NldHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfU0VUX0dST1VQSU5HX19BU1NFVFMgPSBDT05URU5UX0NBVEVHT1JZX19BU1NFVFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGVybWRlZmluaXRpb248L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfU0VUX0dST1VQSU5HX19URVJNREVGSU5JVElPTiA9IENPTlRFTlRfQ0FURUdPUllfX1RFUk1ERUZJTklUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJvbGUgU2V0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9TRVRfR1JPVVBJTkdfX1JPTEVfU0VUUyA9IENPTlRFTlRfQ0FURUdPUllfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+Um9sZSBTZXQgR3JvdXBpbmc8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9TRVRfR1JPVVBJTkdfRkVBVFVSRV9DT1VOVCA9IENPTlRFTlRfQ0FURUdPUllfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENVU1RPTV9DQVRFR09SWV9fTkFNRSA9IENPTlRFTlRfQ0FURUdPUllfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENVU1RPTV9DQVRFR09SWV9fR1VJRCA9IENPTlRFTlRfQ0FURUdPUllfX0dVSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDVVNUT01fQ0FURUdPUllfX1BSRVNFTlRBVElPTl9OQU1FID0gQ09OVEVOVF9DQVRFR09SWV9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDVVNUT01fQ0FURUdPUllfX0JSSUVGX0RFU0NSSVBUSU9OID0gQ09OVEVOVF9DQVRFR09SWV9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENVU1RPTV9DQVRFR09SWV9fT1dORURfUlVMRVMgPSBDT05URU5UX0NBVEVHT1JZX19PV05FRF9SVUxFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ1VTVE9NX0NBVEVHT1JZX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IENPTlRFTlRfQ0FURUdPUllfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPktpbmQ8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENVU1RPTV9DQVRFR09SWV9fS0lORCA9IENPTlRFTlRfQ0FURUdPUllfX0tJTkQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENVU1RPTV9DQVRFR09SWV9fU1VQUFJFU1NFRCA9IENPTlRFTlRfQ0FURUdPUllfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDVVNUT01fQ0FURUdPUllfX09SREVSSU5HX0dVSURFID0gQ09OVEVOVF9DQVRFR09SWV9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgQWJzdHJhY3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDVVNUT01fQ0FURUdPUllfX0lTX0FCU1RSQUNUID0gQ09OVEVOVF9DQVRFR09SWV9fSVNfQUJTVFJBQ1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ1VTVE9NX0NBVEVHT1JZX19QUkVTRU5UQVRJT04gPSBDT05URU5UX0NBVEVHT1JZX19QUkVTRU5UQVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2hhcGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ1VTVE9NX0NBVEVHT1JZX19TSEFQRUlDT04gPSBDT05URU5UX0NBVEVHT1JZX19TSEFQRUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm9kZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDVVNUT01fQ0FURUdPUllfX05PREVJQ09OID0gQ09OVEVOVF9DQVRFR09SWV9fTk9ERUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENVU1RPTV9DQVRFR09SWV9fVkFSSUFCSUxJVFlfVFlQRSA9IENPTlRFTlRfQ0FURUdPUllfX1ZBUklBQklMSVRZX1RZUEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENVU1RPTV9DQVRFR09SWV9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVCA9IENPTlRFTlRfQ0FURUdPUllfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcG9ydGluZyBNYXRlcmlhbHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENVU1RPTV9DQVRFR09SWV9fU1VQUE9SVElOR19NQVRFUklBTFMgPSBDT05URU5UX0NBVEVHT1JZX19TVVBQT1JUSU5HX01BVEVSSUFMUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db25jZXB0cyBBbmQgUGFwZXJzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDVVNUT01fQ0FURUdPUllfX0NPTkNFUFRTX0FORF9QQVBFUlMgPSBDT05URU5UX0NBVEVHT1JZX19DT05DRVBUU19BTkRfUEFQRVJTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoZWNrbGlzdHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENVU1RPTV9DQVRFR09SWV9fQ0hFQ0tMSVNUUyA9IENPTlRFTlRfQ0FURUdPUllfX0NIRUNLTElTVFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZGVsaW5lczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ1VTVE9NX0NBVEVHT1JZX19HVUlERUxJTkVTID0gQ09OVEVOVF9DQVRFR09SWV9fR1VJREVMSU5FUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeGFtcGxlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ1VTVE9NX0NBVEVHT1JZX19FWEFNUExFUyA9IENPTlRFTlRfQ0FURUdPUllfX0VYQU1QTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFzc2V0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ1VTVE9NX0NBVEVHT1JZX19BU1NFVFMgPSBDT05URU5UX0NBVEVHT1JZX19BU1NFVFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGVybWRlZmluaXRpb248L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENVU1RPTV9DQVRFR09SWV9fVEVSTURFRklOSVRJT04gPSBDT05URU5UX0NBVEVHT1JZX19URVJNREVGSU5JVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DYXRlZ29yaXplZCBFbGVtZW50czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ1VTVE9NX0NBVEVHT1JZX19DQVRFR09SSVpFRF9FTEVNRU5UUyA9IENPTlRFTlRfQ0FURUdPUllfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3ViIENhdGVnb3JpZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENVU1RPTV9DQVRFR09SWV9fU1VCX0NBVEVHT1JJRVMgPSBDT05URU5UX0NBVEVHT1JZX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkN1c3RvbSBDYXRlZ29yeTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDVVNUT01fQ0FURUdPUllfRkVBVFVSRV9DT1VOVCA9IENPTlRFTlRfQ0FURUdPUllfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9QQUNLQUdFX19OQU1FID0gTUVUSE9EX0VMRU1FTlRfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9QQUNLQUdFX19HVUlEID0gTUVUSE9EX0VMRU1FTlRfX0dVSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfUEFDS0FHRV9fUFJFU0VOVEFUSU9OX05BTUUgPSBNRVRIT0RfRUxFTUVOVF9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfUEFDS0FHRV9fQlJJRUZfREVTQ1JJUFRJT04gPSBNRVRIT0RfRUxFTUVOVF9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9QQUNLQUdFX19PV05FRF9SVUxFUyA9IE1FVEhPRF9FTEVNRU5UX19PV05FRF9SVUxFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX1BBQ0tBR0VfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gTUVUSE9EX0VMRU1FTlRfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPktpbmQ8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9QQUNLQUdFX19LSU5EID0gTUVUSE9EX0VMRU1FTlRfX0tJTkQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9QQUNLQUdFX19TVVBQUkVTU0VEID0gTUVUSE9EX0VMRU1FTlRfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfUEFDS0FHRV9fT1JERVJJTkdfR1VJREUgPSBNRVRIT0RfRUxFTUVOVF9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R2xvYmFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX1BBQ0tBR0VfX0dMT0JBTCA9IE1FVEhPRF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJldXNlZCBQYWNrYWdlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX1BBQ0tBR0VfX1JFVVNFRF9QQUNLQUdFUyA9IE1FVEhPRF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoaWxkIFBhY2thZ2VzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfUEFDS0FHRV9fQ0hJTERfUEFDS0FHRVMgPSBNRVRIT0RfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5NZXRob2QgUGFja2FnZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfUEFDS0FHRV9GRUFUVVJFX0NPVU5UID0gTUVUSE9EX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfUEFDS0FHRV9fTkFNRSA9IE1FVEhPRF9QQUNLQUdFX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX1BBQ0tBR0VfX0dVSUQgPSBNRVRIT0RfUEFDS0FHRV9fR1VJRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfUEFDS0FHRV9fUFJFU0VOVEFUSU9OX05BTUUgPSBNRVRIT0RfUEFDS0FHRV9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX1BBQ0tBR0VfX0JSSUVGX0RFU0NSSVBUSU9OID0gTUVUSE9EX1BBQ0tBR0VfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX1BBQ0tBR0VfX09XTkVEX1JVTEVTID0gTUVUSE9EX1BBQ0tBR0VfX09XTkVEX1JVTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX1BBQ0tBR0VfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gTUVUSE9EX1BBQ0tBR0VfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPktpbmQ8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfUEFDS0FHRV9fS0lORCA9IE1FVEhPRF9QQUNLQUdFX19LSU5EOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX1BBQ0tBR0VfX1NVUFBSRVNTRUQgPSBNRVRIT0RfUEFDS0FHRV9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfUEFDS0FHRV9fT1JERVJJTkdfR1VJREUgPSBNRVRIT0RfUEFDS0FHRV9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R2xvYmFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9QQUNLQUdFX19HTE9CQUwgPSBNRVRIT0RfUEFDS0FHRV9fR0xPQkFMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJldXNlZCBQYWNrYWdlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9QQUNLQUdFX19SRVVTRURfUEFDS0FHRVMgPSBNRVRIT0RfUEFDS0FHRV9fUkVVU0VEX1BBQ0tBR0VTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoaWxkIFBhY2thZ2VzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX1BBQ0tBR0VfX0NISUxEX1BBQ0tBR0VTID0gTUVUSE9EX1BBQ0tBR0VfX0NISUxEX1BBQ0tBR0VTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbnRlbnQgRWxlbWVudHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfUEFDS0FHRV9fQ09OVEVOVF9FTEVNRU5UUyA9IE1FVEhPRF9QQUNLQUdFX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkNvbnRlbnQgUGFja2FnZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX1BBQ0tBR0VfRkVBVFVSRV9DT1VOVCA9IE1FVEhPRF9QQUNLQUdFX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNSUxFU1RPTkVfX05BTUUgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNSUxFU1RPTkVfX0dVSUQgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19HVUlEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUlMRVNUT05FX19QUkVTRU5UQVRJT05fTkFNRSA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUlMRVNUT05FX19CUklFRl9ERVNDUklQVElPTiA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNSUxFU1RPTkVfX09XTkVEX1JVTEVTID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fT1dORURfUlVMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1JTEVTVE9ORV9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5LaW5kPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNSUxFU1RPTkVfX0tJTkQgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19LSU5EOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNSUxFU1RPTkVfX1NVUFBSRVNTRUQgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUlMRVNUT05FX19PUkRFUklOR19HVUlERSA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIEFic3RyYWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUlMRVNUT05FX19JU19BQlNUUkFDVCA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0lTX0FCU1RSQUNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1JTEVTVE9ORV9fUFJFU0VOVEFUSU9OID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNoYXBlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1JTEVTVE9ORV9fU0hBUEVJQ09OID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fU0hBUEVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUlMRVNUT05FX19OT0RFSUNPTiA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX05PREVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZWZpeDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1JTEVTVE9ORV9fUFJFRklYID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fUFJFRklYOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIFBsYW5uZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNSUxFU1RPTkVfX0lTX1BMQU5ORUQgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19JU19QTEFOTkVEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkhhcyBNdWx0aXBsZSBPY2N1cnJlbmNlczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1JTEVTVE9ORV9fSEFTX01VTFRJUExFX09DQ1VSUkVOQ0VTID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fSEFTX01VTFRJUExFX09DQ1VSUkVOQ0VTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIE9wdGlvbmFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUlMRVNUT05FX19JU19PUFRJT05BTCA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0lTX09QVElPTkFMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRlZCBBZnRlcjwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1JTEVTVE9ORV9fUFJFU0VOVEVEX0FGVEVSID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fUFJFU0VOVEVEX0FGVEVSOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRlZCBCZWZvcmU8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNSUxFU1RPTkVfX1BSRVNFTlRFRF9CRUZPUkUgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19QUkVTRU5URURfQkVGT1JFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBsYW5uaW5nIERhdGE8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNSUxFU1RPTkVfX1BMQU5OSU5HX0RBVEEgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19QTEFOTklOR19EQVRBOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cGVyIEFjdGl2aXRpZXM8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNSUxFU1RPTkVfX1NVUEVSX0FDVElWSVRJRVMgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19TVVBFUl9BQ1RJVklUSUVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoZWNrbGlzdHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1JTEVTVE9ORV9fQ0hFQ0tMSVNUUyA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0NIRUNLTElTVFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29uY2VwdHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1JTEVTVE9ORV9fQ09OQ0VQVFMgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19DT05DRVBUUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeGFtcGxlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUlMRVNUT05FX19FWEFNUExFUyA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0VYQU1QTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWRlbGluZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1JTEVTVE9ORV9fR1VJREVMSU5FUyA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0dVSURFTElORVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmV1c2FibGUgQXNzZXRzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNSUxFU1RPTkVfX1JFVVNBQkxFX0FTU0VUUyA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX1JFVVNBQkxFX0FTU0VUUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwb3J0aW5nIE1hdGVyaWFsczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUlMRVNUT05FX19TVVBQT1JUSU5HX01BVEVSSUFMUyA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX1NVUFBPUlRJTkdfTUFURVJJQUxTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRlbXBsYXRlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUlMRVNUT05FX19URU1QTEFURVMgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19URU1QTEFURVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVwb3J0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUlMRVNUT05FX19SRVBPUlRTID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fUkVQT1JUUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Fc3RpbWF0aW9uY29uc2lkZXJhdGlvbnM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1JTEVTVE9ORV9fRVNUSU1BVElPTkNPTlNJREVSQVRJT05TID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fRVNUSU1BVElPTkNPTlNJREVSQVRJT05TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRvb2xtZW50b3I8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1JTEVTVE9ORV9fVE9PTE1FTlRPUiA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX1RPT0xNRU5UT1I7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgUmVwZWF0YWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1JTEVTVE9ORV9fSVNfUkVQRUFUQUJMRSA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0lTX1JFUEVBVEFCTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgT25nb2luZzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1JTEVTVE9ORV9fSVNfT05HT0lORyA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0lTX09OR09JTkc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgRXZlbnQgRHJpdmVuPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUlMRVNUT05FX19JU19FVkVOVF9EUklWRU4gPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19JU19FVkVOVF9EUklWRU47Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TGluayBUbyBQcmVkZWNlc3NvcjwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUlMRVNUT05FX19MSU5LX1RPX1BSRURFQ0VTU09SID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fTElOS19UT19QUkVERUNFU1NPUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXF1aXJlZCBSZXN1bHRzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNSUxFU1RPTkVfX1JFUVVJUkVEX1JFU1VMVFMgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPk1pbGVzdG9uZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNSUxFU1RPTkVfRkVBVFVSRV9DT1VOVCA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSVBUT1JfX05BTUUgPSBCUkVBS0RPV05fRUxFTUVOVF9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJUFRPUl9fR1VJRCA9IEJSRUFLRE9XTl9FTEVNRU5UX19HVUlEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJUFRPUl9fUFJFU0VOVEFUSU9OX05BTUUgPSBCUkVBS0RPV05fRUxFTUVOVF9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklQVE9SX19CUklFRl9ERVNDUklQVElPTiA9IEJSRUFLRE9XTl9FTEVNRU5UX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJUFRPUl9fT1dORURfUlVMRVMgPSBCUkVBS0RPV05fRUxFTUVOVF9fT1dORURfUlVMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSVBUT1JfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gQlJFQUtET1dOX0VMRU1FTlRfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPktpbmQ8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSVBUT1JfX0tJTkQgPSBCUkVBS0RPV05fRUxFTUVOVF9fS0lORDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJUFRPUl9fU1VQUFJFU1NFRCA9IEJSRUFLRE9XTl9FTEVNRU5UX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJUFRPUl9fT1JERVJJTkdfR1VJREUgPSBCUkVBS0RPV05fRUxFTUVOVF9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgQWJzdHJhY3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklQVE9SX19JU19BQlNUUkFDVCA9IEJSRUFLRE9XTl9FTEVNRU5UX19JU19BQlNUUkFDVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklQVE9SX19QUkVTRU5UQVRJT04gPSBCUkVBS0RPV05fRUxFTUVOVF9fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNoYXBlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSVBUT1JfX1NIQVBFSUNPTiA9IEJSRUFLRE9XTl9FTEVNRU5UX19TSEFQRUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm9kZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklQVE9SX19OT0RFSUNPTiA9IEJSRUFLRE9XTl9FTEVNRU5UX19OT0RFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVmaXg8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklQVE9SX19QUkVGSVggPSBCUkVBS0RPV05fRUxFTUVOVF9fUFJFRklYOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIFBsYW5uZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklQVE9SX19JU19QTEFOTkVEID0gQlJFQUtET1dOX0VMRU1FTlRfX0lTX1BMQU5ORUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SGFzIE11bHRpcGxlIE9jY3VycmVuY2VzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJUFRPUl9fSEFTX01VTFRJUExFX09DQ1VSUkVOQ0VTID0gQlJFQUtET1dOX0VMRU1FTlRfX0hBU19NVUxUSVBMRV9PQ0NVUlJFTkNFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBPcHRpb25hbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSVBUT1JfX0lTX09QVElPTkFMID0gQlJFQUtET1dOX0VMRU1FTlRfX0lTX09QVElPTkFMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRlZCBBZnRlcjwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSVBUT1JfX1BSRVNFTlRFRF9BRlRFUiA9IEJSRUFLRE9XTl9FTEVNRU5UX19QUkVTRU5URURfQUZURVI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGVkIEJlZm9yZTwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSVBUT1JfX1BSRVNFTlRFRF9CRUZPUkUgPSBCUkVBS0RPV05fRUxFTUVOVF9fUFJFU0VOVEVEX0JFRk9SRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QbGFubmluZyBEYXRhPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJUFRPUl9fUExBTk5JTkdfREFUQSA9IEJSRUFLRE9XTl9FTEVNRU5UX19QTEFOTklOR19EQVRBOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cGVyIEFjdGl2aXRpZXM8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklQVE9SX19TVVBFUl9BQ1RJVklUSUVTID0gQlJFQUtET1dOX0VMRU1FTlRfX1NVUEVSX0FDVElWSVRJRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hlY2tsaXN0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJUFRPUl9fQ0hFQ0tMSVNUUyA9IEJSRUFLRE9XTl9FTEVNRU5UX19DSEVDS0xJU1RTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbmNlcHRzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklQVE9SX19DT05DRVBUUyA9IEJSRUFLRE9XTl9FTEVNRU5UX19DT05DRVBUUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeGFtcGxlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJUFRPUl9fRVhBTVBMRVMgPSBCUkVBS0RPV05fRUxFTUVOVF9fRVhBTVBMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZGVsaW5lczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJUFRPUl9fR1VJREVMSU5FUyA9IEJSRUFLRE9XTl9FTEVNRU5UX19HVUlERUxJTkVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJldXNhYmxlIEFzc2V0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJUFRPUl9fUkVVU0FCTEVfQVNTRVRTID0gQlJFQUtET1dOX0VMRU1FTlRfX1JFVVNBQkxFX0FTU0VUUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwb3J0aW5nIE1hdGVyaWFsczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJUFRPUl9fU1VQUE9SVElOR19NQVRFUklBTFMgPSBCUkVBS0RPV05fRUxFTUVOVF9fU1VQUE9SVElOR19NQVRFUklBTFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGVtcGxhdGVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklQVE9SX19URU1QTEFURVMgPSBCUkVBS0RPV05fRUxFTUVOVF9fVEVNUExBVEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlcG9ydHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSVBUT1JfX1JFUE9SVFMgPSBCUkVBS0RPV05fRUxFTUVOVF9fUkVQT1JUUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Fc3RpbWF0aW9uY29uc2lkZXJhdGlvbnM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSVBUT1JfX0VTVElNQVRJT05DT05TSURFUkFUSU9OUyA9IEJSRUFLRE9XTl9FTEVNRU5UX19FU1RJTUFUSU9OQ09OU0lERVJBVElPTlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VG9vbG1lbnRvcjwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJUFRPUl9fVE9PTE1FTlRPUiA9IEJSRUFLRE9XTl9FTEVNRU5UX19UT09MTUVOVE9SOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIFN5bmNocm9uaXplZCBXaXRoIFNvdXJjZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSVBUT1JfX0lTX1NZTkNIUk9OSVpFRF9XSVRIX1NPVVJDRSA9IEJSRUFLRE9XTl9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkRlc2NyaXB0b3I8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJUFRPUl9GRUFUVVJFX0NPVU5UID0gQlJFQUtET1dOX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVE9SX19OQU1FID0gREVTQ1JJUFRPUl9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0dVSUQgPSBERVNDUklQVE9SX19HVUlEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX1BSRVNFTlRBVElPTl9OQU1FID0gREVTQ1JJUFRPUl9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fQlJJRUZfREVTQ1JJUFRJT04gPSBERVNDUklQVE9SX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX09XTkVEX1JVTEVTID0gREVTQ1JJUFRPUl9fT1dORURfUlVMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVE9SX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IERFU0NSSVBUT1JfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPktpbmQ8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVE9SX19LSU5EID0gREVTQ1JJUFRPUl9fS0lORDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX1NVUFBSRVNTRUQgPSBERVNDUklQVE9SX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX09SREVSSU5HX0dVSURFID0gREVTQ1JJUFRPUl9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgQWJzdHJhY3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fSVNfQUJTVFJBQ1QgPSBERVNDUklQVE9SX19JU19BQlNUUkFDVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fUFJFU0VOVEFUSU9OID0gREVTQ1JJUFRPUl9fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNoYXBlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVE9SX19TSEFQRUlDT04gPSBERVNDUklQVE9SX19TSEFQRUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm9kZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fTk9ERUlDT04gPSBERVNDUklQVE9SX19OT0RFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVmaXg8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fUFJFRklYID0gREVTQ1JJUFRPUl9fUFJFRklYOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIFBsYW5uZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fSVNfUExBTk5FRCA9IERFU0NSSVBUT1JfX0lTX1BMQU5ORUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SGFzIE11bHRpcGxlIE9jY3VycmVuY2VzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0hBU19NVUxUSVBMRV9PQ0NVUlJFTkNFUyA9IERFU0NSSVBUT1JfX0hBU19NVUxUSVBMRV9PQ0NVUlJFTkNFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBPcHRpb25hbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVE9SX19JU19PUFRJT05BTCA9IERFU0NSSVBUT1JfX0lTX09QVElPTkFMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRlZCBBZnRlcjwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVE9SX19QUkVTRU5URURfQUZURVIgPSBERVNDUklQVE9SX19QUkVTRU5URURfQUZURVI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGVkIEJlZm9yZTwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVE9SX19QUkVTRU5URURfQkVGT1JFID0gREVTQ1JJUFRPUl9fUFJFU0VOVEVEX0JFRk9SRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QbGFubmluZyBEYXRhPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX1BMQU5OSU5HX0RBVEEgPSBERVNDUklQVE9SX19QTEFOTklOR19EQVRBOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cGVyIEFjdGl2aXRpZXM8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fU1VQRVJfQUNUSVZJVElFUyA9IERFU0NSSVBUT1JfX1NVUEVSX0FDVElWSVRJRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hlY2tsaXN0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0NIRUNLTElTVFMgPSBERVNDUklQVE9SX19DSEVDS0xJU1RTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbmNlcHRzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fQ09OQ0VQVFMgPSBERVNDUklQVE9SX19DT05DRVBUUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeGFtcGxlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0VYQU1QTEVTID0gREVTQ1JJUFRPUl9fRVhBTVBMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZGVsaW5lczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0dVSURFTElORVMgPSBERVNDUklQVE9SX19HVUlERUxJTkVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJldXNhYmxlIEFzc2V0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX1JFVVNBQkxFX0FTU0VUUyA9IERFU0NSSVBUT1JfX1JFVVNBQkxFX0FTU0VUUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwb3J0aW5nIE1hdGVyaWFsczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX1NVUFBPUlRJTkdfTUFURVJJQUxTID0gREVTQ1JJUFRPUl9fU1VQUE9SVElOR19NQVRFUklBTFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGVtcGxhdGVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fVEVNUExBVEVTID0gREVTQ1JJUFRPUl9fVEVNUExBVEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlcG9ydHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVE9SX19SRVBPUlRTID0gREVTQ1JJUFRPUl9fUkVQT1JUUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Fc3RpbWF0aW9uY29uc2lkZXJhdGlvbnM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVE9SX19FU1RJTUFUSU9OQ09OU0lERVJBVElPTlMgPSBERVNDUklQVE9SX19FU1RJTUFUSU9OQ09OU0lERVJBVElPTlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VG9vbG1lbnRvcjwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX1RPT0xNRU5UT1IgPSBERVNDUklQVE9SX19UT09MTUVOVE9SOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIFN5bmNocm9uaXplZCBXaXRoIFNvdXJjZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVE9SX19JU19TWU5DSFJPTklaRURfV0lUSF9TT1VSQ0UgPSBERVNDUklQVE9SX19JU19TWU5DSFJPTklaRURfV0lUSF9TT1VSQ0U7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWN0aXZpdHkgRW50cnkgU3RhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fQUNUSVZJVFlfRU5UUllfU1RBVEUgPSBERVNDUklQVE9SX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFjdGl2aXR5IEV4aXQgU3RhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fQUNUSVZJVFlfRVhJVF9TVEFURSA9IERFU0NSSVBUT1JfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+V29yayBQcm9kdWN0PC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX1dPUktfUFJPRFVDVCA9IERFU0NSSVBUT1JfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW1wYWN0ZWQgQnk8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVE9SX19JTVBBQ1RFRF9CWSA9IERFU0NSSVBUT1JfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW1wYWN0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0lNUEFDVFMgPSBERVNDUklQVE9SX0ZFQVRVUkVfQ09VTlQgKyA0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlbGl2ZXJhYmxlIFBhcnRzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fREVMSVZFUkFCTEVfUEFSVFMgPSBERVNDUklQVE9SX0ZFQVRVUkVfQ09VTlQgKyA1OwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPldvcmsgUHJvZHVjdCBEZXNjcmlwdG9yPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVE9SX0ZFQVRVUkVfQ09VTlQgPSBERVNDUklQVE9SX0ZFQVRVUkVfQ09VTlQgKyA2OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJVEVSQVRJT05fX05BTUUgPSBBQ1RJVklUWV9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSVRFUkFUSU9OX19HVUlEID0gQUNUSVZJVFlfX0dVSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJVEVSQVRJT05fX1BSRVNFTlRBVElPTl9OQU1FID0gQUNUSVZJVFlfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSVRFUkFUSU9OX19CUklFRl9ERVNDUklQVElPTiA9IEFDVElWSVRZX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSVRFUkFUSU9OX19PV05FRF9SVUxFUyA9IEFDVElWSVRZX19PV05FRF9SVUxFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSVRFUkFUSU9OX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IEFDVElWSVRZX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5LaW5kPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJVEVSQVRJT05fX0tJTkQgPSBBQ1RJVklUWV9fS0lORDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSVRFUkFUSU9OX19TVVBQUkVTU0VEID0gQUNUSVZJVFlfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJVEVSQVRJT05fX09SREVSSU5HX0dVSURFID0gQUNUSVZJVFlfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIEFic3RyYWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSVRFUkFUSU9OX19JU19BQlNUUkFDVCA9IEFDVElWSVRZX19JU19BQlNUUkFDVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJVEVSQVRJT05fX1BSRVNFTlRBVElPTiA9IEFDVElWSVRZX19QUkVTRU5UQVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2hhcGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSVRFUkFUSU9OX19TSEFQRUlDT04gPSBBQ1RJVklUWV9fU0hBUEVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSVRFUkFUSU9OX19OT0RFSUNPTiA9IEFDVElWSVRZX19OT0RFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVmaXg8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJVEVSQVRJT05fX1BSRUZJWCA9IEFDVElWSVRZX19QUkVGSVg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgUGxhbm5lZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElURVJBVElPTl9fSVNfUExBTk5FRCA9IEFDVElWSVRZX19JU19QTEFOTkVEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkhhcyBNdWx0aXBsZSBPY2N1cnJlbmNlczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElURVJBVElPTl9fSEFTX01VTFRJUExFX09DQ1VSUkVOQ0VTID0gQUNUSVZJVFlfX0hBU19NVUxUSVBMRV9PQ0NVUlJFTkNFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBPcHRpb25hbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElURVJBVElPTl9fSVNfT1BUSU9OQUwgPSBBQ1RJVklUWV9fSVNfT1BUSU9OQUw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGVkIEFmdGVyPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSVRFUkFUSU9OX19QUkVTRU5URURfQUZURVIgPSBBQ1RJVklUWV9fUFJFU0VOVEVEX0FGVEVSOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRlZCBCZWZvcmU8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJVEVSQVRJT05fX1BSRVNFTlRFRF9CRUZPUkUgPSBBQ1RJVklUWV9fUFJFU0VOVEVEX0JFRk9SRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QbGFubmluZyBEYXRhPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSVRFUkFUSU9OX19QTEFOTklOR19EQVRBID0gQUNUSVZJVFlfX1BMQU5OSU5HX0RBVEE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwZXIgQWN0aXZpdGllczwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElURVJBVElPTl9fU1VQRVJfQUNUSVZJVElFUyA9IEFDVElWSVRZX19TVVBFUl9BQ1RJVklUSUVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoZWNrbGlzdHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElURVJBVElPTl9fQ0hFQ0tMSVNUUyA9IEFDVElWSVRZX19DSEVDS0xJU1RTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbmNlcHRzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJVEVSQVRJT05fX0NPTkNFUFRTID0gQUNUSVZJVFlfX0NPTkNFUFRTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4YW1wbGVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJVEVSQVRJT05fX0VYQU1QTEVTID0gQUNUSVZJVFlfX0VYQU1QTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWRlbGluZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElURVJBVElPTl9fR1VJREVMSU5FUyA9IEFDVElWSVRZX19HVUlERUxJTkVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJldXNhYmxlIEFzc2V0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSVRFUkFUSU9OX19SRVVTQUJMRV9BU1NFVFMgPSBBQ1RJVklUWV9fUkVVU0FCTEVfQVNTRVRTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHBvcnRpbmcgTWF0ZXJpYWxzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJVEVSQVRJT05fX1NVUFBPUlRJTkdfTUFURVJJQUxTID0gQUNUSVZJVFlfX1NVUFBPUlRJTkdfTUFURVJJQUxTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRlbXBsYXRlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSVRFUkFUSU9OX19URU1QTEFURVMgPSBBQ1RJVklUWV9fVEVNUExBVEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlcG9ydHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElURVJBVElPTl9fUkVQT1JUUyA9IEFDVElWSVRZX19SRVBPUlRTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVzdGltYXRpb25jb25zaWRlcmF0aW9uczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSVRFUkFUSU9OX19FU1RJTUFUSU9OQ09OU0lERVJBVElPTlMgPSBBQ1RJVklUWV9fRVNUSU1BVElPTkNPTlNJREVSQVRJT05TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRvb2xtZW50b3I8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElURVJBVElPTl9fVE9PTE1FTlRPUiA9IEFDVElWSVRZX19UT09MTUVOVE9SOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIFJlcGVhdGFibGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJVEVSQVRJT05fX0lTX1JFUEVBVEFCTEUgPSBBQ1RJVklUWV9fSVNfUkVQRUFUQUJMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBPbmdvaW5nPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSVRFUkFUSU9OX19JU19PTkdPSU5HID0gQUNUSVZJVFlfX0lTX09OR09JTkc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgRXZlbnQgRHJpdmVuPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSVRFUkFUSU9OX19JU19FVkVOVF9EUklWRU4gPSBBQ1RJVklUWV9fSVNfRVZFTlRfRFJJVkVOOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxpbmsgVG8gUHJlZGVjZXNzb3I8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElURVJBVElPTl9fTElOS19UT19QUkVERUNFU1NPUiA9IEFDVElWSVRZX19MSU5LX1RPX1BSRURFQ0VTU09SOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZ1bGZpbGxzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJVEVSQVRJT05fX0ZVTEZJTExTID0gQUNUSVZJVFlfX0ZVTEZJTExTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJVEVSQVRJT05fX1ZBUklBQklMSVRZX1RZUEUgPSBBQ1RJVklUWV9fVkFSSUFCSUxJVFlfVFlQRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSVRFUkFUSU9OX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UID0gQUNUSVZJVFlfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlY29uZGl0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSVRFUkFUSU9OX19QUkVDT05ESVRJT04gPSBBQ1RJVklUWV9fUFJFQ09ORElUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBvc3Rjb25kaXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJVEVSQVRJT05fX1BPU1RDT05ESVRJT04gPSBBQ1RJVklUWV9fUE9TVENPTkRJVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmVha2Rvd24gRWxlbWVudHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElURVJBVElPTl9fQlJFQUtET1dOX0VMRU1FTlRTID0gQUNUSVZJVFlfX0JSRUFLRE9XTl9FTEVNRU5UUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Sb2FkbWFwczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSVRFUkFUSU9OX19ST0FETUFQUyA9IEFDVElWSVRZX19ST0FETUFQUzsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5JdGVyYXRpb248L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSVRFUkFUSU9OX0ZFQVRVUkVfQ09VTlQgPSBBQ1RJVklUWV9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUEhBU0VfX05BTUUgPSBBQ1RJVklUWV9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUEhBU0VfX0dVSUQgPSBBQ1RJVklUWV9fR1VJRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBIQVNFX19QUkVTRU5UQVRJT05fTkFNRSA9IEFDVElWSVRZX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBIQVNFX19CUklFRl9ERVNDUklQVElPTiA9IEFDVElWSVRZX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUEhBU0VfX09XTkVEX1JVTEVTID0gQUNUSVZJVFlfX09XTkVEX1JVTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQSEFTRV9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBBQ1RJVklUWV9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+S2luZDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUEhBU0VfX0tJTkQgPSBBQ1RJVklUWV9fS0lORDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUEhBU0VfX1NVUFBSRVNTRUQgPSBBQ1RJVklUWV9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBIQVNFX19PUkRFUklOR19HVUlERSA9IEFDVElWSVRZX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBBYnN0cmFjdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBIQVNFX19JU19BQlNUUkFDVCA9IEFDVElWSVRZX19JU19BQlNUUkFDVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQSEFTRV9fUFJFU0VOVEFUSU9OID0gQUNUSVZJVFlfX1BSRVNFTlRBVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TaGFwZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQSEFTRV9fU0hBUEVJQ09OID0gQUNUSVZJVFlfX1NIQVBFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob2RlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBIQVNFX19OT0RFSUNPTiA9IEFDVElWSVRZX19OT0RFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVmaXg8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQSEFTRV9fUFJFRklYID0gQUNUSVZJVFlfX1BSRUZJWDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBQbGFubmVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUEhBU0VfX0lTX1BMQU5ORUQgPSBBQ1RJVklUWV9fSVNfUExBTk5FRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5IYXMgTXVsdGlwbGUgT2NjdXJyZW5jZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQSEFTRV9fSEFTX01VTFRJUExFX09DQ1VSUkVOQ0VTID0gQUNUSVZJVFlfX0hBU19NVUxUSVBMRV9PQ0NVUlJFTkNFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBPcHRpb25hbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBIQVNFX19JU19PUFRJT05BTCA9IEFDVElWSVRZX19JU19PUFRJT05BTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50ZWQgQWZ0ZXI8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQSEFTRV9fUFJFU0VOVEVEX0FGVEVSID0gQUNUSVZJVFlfX1BSRVNFTlRFRF9BRlRFUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50ZWQgQmVmb3JlPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUEhBU0VfX1BSRVNFTlRFRF9CRUZPUkUgPSBBQ1RJVklUWV9fUFJFU0VOVEVEX0JFRk9SRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QbGFubmluZyBEYXRhPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUEhBU0VfX1BMQU5OSU5HX0RBVEEgPSBBQ1RJVklUWV9fUExBTk5JTkdfREFUQTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBlciBBY3Rpdml0aWVzPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUEhBU0VfX1NVUEVSX0FDVElWSVRJRVMgPSBBQ1RJVklUWV9fU1VQRVJfQUNUSVZJVElFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGVja2xpc3RzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQSEFTRV9fQ0hFQ0tMSVNUUyA9IEFDVElWSVRZX19DSEVDS0xJU1RTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbmNlcHRzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQSEFTRV9fQ09OQ0VQVFMgPSBBQ1RJVklUWV9fQ09OQ0VQVFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXhhbXBsZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBIQVNFX19FWEFNUExFUyA9IEFDVElWSVRZX19FWEFNUExFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkZWxpbmVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQSEFTRV9fR1VJREVMSU5FUyA9IEFDVElWSVRZX19HVUlERUxJTkVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJldXNhYmxlIEFzc2V0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUEhBU0VfX1JFVVNBQkxFX0FTU0VUUyA9IEFDVElWSVRZX19SRVVTQUJMRV9BU1NFVFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcG9ydGluZyBNYXRlcmlhbHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBIQVNFX19TVVBQT1JUSU5HX01BVEVSSUFMUyA9IEFDVElWSVRZX19TVVBQT1JUSU5HX01BVEVSSUFMUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UZW1wbGF0ZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBIQVNFX19URU1QTEFURVMgPSBBQ1RJVklUWV9fVEVNUExBVEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlcG9ydHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBIQVNFX19SRVBPUlRTID0gQUNUSVZJVFlfX1JFUE9SVFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXN0aW1hdGlvbmNvbnNpZGVyYXRpb25zPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQSEFTRV9fRVNUSU1BVElPTkNPTlNJREVSQVRJT05TID0gQUNUSVZJVFlfX0VTVElNQVRJT05DT05TSURFUkFUSU9OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ub29sbWVudG9yPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQSEFTRV9fVE9PTE1FTlRPUiA9IEFDVElWSVRZX19UT09MTUVOVE9SOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIFJlcGVhdGFibGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQSEFTRV9fSVNfUkVQRUFUQUJMRSA9IEFDVElWSVRZX19JU19SRVBFQVRBQkxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIE9uZ29pbmc8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQSEFTRV9fSVNfT05HT0lORyA9IEFDVElWSVRZX19JU19PTkdPSU5HOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIEV2ZW50IERyaXZlbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBIQVNFX19JU19FVkVOVF9EUklWRU4gPSBBQ1RJVklUWV9fSVNfRVZFTlRfRFJJVkVOOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxpbmsgVG8gUHJlZGVjZXNzb3I8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBIQVNFX19MSU5LX1RPX1BSRURFQ0VTU09SID0gQUNUSVZJVFlfX0xJTktfVE9fUFJFREVDRVNTT1I7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RnVsZmlsbHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBIQVNFX19GVUxGSUxMUyA9IEFDVElWSVRZX19GVUxGSUxMUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUEhBU0VfX1ZBUklBQklMSVRZX1RZUEUgPSBBQ1RJVklUWV9fVkFSSUFCSUxJVFlfVFlQRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUEhBU0VfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQgPSBBQ1RJVklUWV9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVjb25kaXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQSEFTRV9fUFJFQ09ORElUSU9OID0gQUNUSVZJVFlfX1BSRUNPTkRJVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qb3N0Y29uZGl0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUEhBU0VfX1BPU1RDT05ESVRJT04gPSBBQ1RJVklUWV9fUE9TVENPTkRJVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmVha2Rvd24gRWxlbWVudHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBIQVNFX19CUkVBS0RPV05fRUxFTUVOVFMgPSBBQ1RJVklUWV9fQlJFQUtET1dOX0VMRU1FTlRTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJvYWRtYXBzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQSEFTRV9fUk9BRE1BUFMgPSBBQ1RJVklUWV9fUk9BRE1BUFM7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+UGhhc2U8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUEhBU0VfRkVBVFVSRV9DT1VOVCA9IEFDVElWSVRZX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURUFNX1BST0ZJTEVfX05BTUUgPSBCUkVBS0RPV05fRUxFTUVOVF9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVBTV9QUk9GSUxFX19HVUlEID0gQlJFQUtET1dOX0VMRU1FTlRfX0dVSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURUFNX1BST0ZJTEVfX1BSRVNFTlRBVElPTl9OQU1FID0gQlJFQUtET1dOX0VMRU1FTlRfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVBTV9QUk9GSUxFX19CUklFRl9ERVNDUklQVElPTiA9IEJSRUFLRE9XTl9FTEVNRU5UX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVBTV9QUk9GSUxFX19PV05FRF9SVUxFUyA9IEJSRUFLRE9XTl9FTEVNRU5UX19PV05FRF9SVUxFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVBTV9QUk9GSUxFX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IEJSRUFLRE9XTl9FTEVNRU5UX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5LaW5kPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURUFNX1BST0ZJTEVfX0tJTkQgPSBCUkVBS0RPV05fRUxFTUVOVF9fS0lORDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVBTV9QUk9GSUxFX19TVVBQUkVTU0VEID0gQlJFQUtET1dOX0VMRU1FTlRfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURUFNX1BST0ZJTEVfX09SREVSSU5HX0dVSURFID0gQlJFQUtET1dOX0VMRU1FTlRfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIEFic3RyYWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVBTV9QUk9GSUxFX19JU19BQlNUUkFDVCA9IEJSRUFLRE9XTl9FTEVNRU5UX19JU19BQlNUUkFDVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURUFNX1BST0ZJTEVfX1BSRVNFTlRBVElPTiA9IEJSRUFLRE9XTl9FTEVNRU5UX19QUkVTRU5UQVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2hhcGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVBTV9QUk9GSUxFX19TSEFQRUlDT04gPSBCUkVBS0RPV05fRUxFTUVOVF9fU0hBUEVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVBTV9QUk9GSUxFX19OT0RFSUNPTiA9IEJSRUFLRE9XTl9FTEVNRU5UX19OT0RFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVmaXg8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURUFNX1BST0ZJTEVfX1BSRUZJWCA9IEJSRUFLRE9XTl9FTEVNRU5UX19QUkVGSVg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgUGxhbm5lZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFQU1fUFJPRklMRV9fSVNfUExBTk5FRCA9IEJSRUFLRE9XTl9FTEVNRU5UX19JU19QTEFOTkVEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkhhcyBNdWx0aXBsZSBPY2N1cnJlbmNlczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFQU1fUFJPRklMRV9fSEFTX01VTFRJUExFX09DQ1VSUkVOQ0VTID0gQlJFQUtET1dOX0VMRU1FTlRfX0hBU19NVUxUSVBMRV9PQ0NVUlJFTkNFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBPcHRpb25hbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFQU1fUFJPRklMRV9fSVNfT1BUSU9OQUwgPSBCUkVBS0RPV05fRUxFTUVOVF9fSVNfT1BUSU9OQUw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGVkIEFmdGVyPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVBTV9QUk9GSUxFX19QUkVTRU5URURfQUZURVIgPSBCUkVBS0RPV05fRUxFTUVOVF9fUFJFU0VOVEVEX0FGVEVSOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRlZCBCZWZvcmU8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURUFNX1BST0ZJTEVfX1BSRVNFTlRFRF9CRUZPUkUgPSBCUkVBS0RPV05fRUxFTUVOVF9fUFJFU0VOVEVEX0JFRk9SRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QbGFubmluZyBEYXRhPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVBTV9QUk9GSUxFX19QTEFOTklOR19EQVRBID0gQlJFQUtET1dOX0VMRU1FTlRfX1BMQU5OSU5HX0RBVEE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwZXIgQWN0aXZpdGllczwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFQU1fUFJPRklMRV9fU1VQRVJfQUNUSVZJVElFUyA9IEJSRUFLRE9XTl9FTEVNRU5UX19TVVBFUl9BQ1RJVklUSUVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoZWNrbGlzdHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFQU1fUFJPRklMRV9fQ0hFQ0tMSVNUUyA9IEJSRUFLRE9XTl9FTEVNRU5UX19DSEVDS0xJU1RTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbmNlcHRzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURUFNX1BST0ZJTEVfX0NPTkNFUFRTID0gQlJFQUtET1dOX0VMRU1FTlRfX0NPTkNFUFRTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4YW1wbGVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURUFNX1BST0ZJTEVfX0VYQU1QTEVTID0gQlJFQUtET1dOX0VMRU1FTlRfX0VYQU1QTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWRlbGluZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFQU1fUFJPRklMRV9fR1VJREVMSU5FUyA9IEJSRUFLRE9XTl9FTEVNRU5UX19HVUlERUxJTkVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJldXNhYmxlIEFzc2V0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVBTV9QUk9GSUxFX19SRVVTQUJMRV9BU1NFVFMgPSBCUkVBS0RPV05fRUxFTUVOVF9fUkVVU0FCTEVfQVNTRVRTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHBvcnRpbmcgTWF0ZXJpYWxzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURUFNX1BST0ZJTEVfX1NVUFBPUlRJTkdfTUFURVJJQUxTID0gQlJFQUtET1dOX0VMRU1FTlRfX1NVUFBPUlRJTkdfTUFURVJJQUxTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRlbXBsYXRlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVBTV9QUk9GSUxFX19URU1QTEFURVMgPSBCUkVBS0RPV05fRUxFTUVOVF9fVEVNUExBVEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlcG9ydHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFQU1fUFJPRklMRV9fUkVQT1JUUyA9IEJSRUFLRE9XTl9FTEVNRU5UX19SRVBPUlRTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVzdGltYXRpb25jb25zaWRlcmF0aW9uczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVBTV9QUk9GSUxFX19FU1RJTUFUSU9OQ09OU0lERVJBVElPTlMgPSBCUkVBS0RPV05fRUxFTUVOVF9fRVNUSU1BVElPTkNPTlNJREVSQVRJT05TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRvb2xtZW50b3I8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFQU1fUFJPRklMRV9fVE9PTE1FTlRPUiA9IEJSRUFLRE9XTl9FTEVNRU5UX19UT09MTUVOVE9SOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRlYW0gUm9sZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFQU1fUFJPRklMRV9fVEVBTV9ST0xFUyA9IEJSRUFLRE9XTl9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cGVyIFRlYW08L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURUFNX1BST0ZJTEVfX1NVUEVSX1RFQU0gPSBCUkVBS0RPV05fRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdWIgVGVhbTwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVBTV9QUk9GSUxFX19TVUJfVEVBTSA9IEJSRUFLRE9XTl9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlRlYW0gUHJvZmlsZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURUFNX1BST0ZJTEVfRkVBVFVSRV9DT1VOVCA9IEJSRUFLRE9XTl9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX0RFU0NSSVBUT1JfX05BTUUgPSBERVNDUklQVE9SX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX0RFU0NSSVBUT1JfX0dVSUQgPSBERVNDUklQVE9SX19HVUlEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9ERVNDUklQVE9SX19QUkVTRU5UQVRJT05fTkFNRSA9IERFU0NSSVBUT1JfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9ERVNDUklQVE9SX19CUklFRl9ERVNDUklQVElPTiA9IERFU0NSSVBUT1JfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX0RFU0NSSVBUT1JfX09XTkVEX1JVTEVTID0gREVTQ1JJUFRPUl9fT1dORURfUlVMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfREVTQ1JJUFRPUl9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBERVNDUklQVE9SX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5LaW5kPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX0RFU0NSSVBUT1JfX0tJTkQgPSBERVNDUklQVE9SX19LSU5EOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX0RFU0NSSVBUT1JfX1NVUFBSRVNTRUQgPSBERVNDUklQVE9SX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9ERVNDUklQVE9SX19PUkRFUklOR19HVUlERSA9IERFU0NSSVBUT1JfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIEFic3RyYWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9ERVNDUklQVE9SX19JU19BQlNUUkFDVCA9IERFU0NSSVBUT1JfX0lTX0FCU1RSQUNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfREVTQ1JJUFRPUl9fUFJFU0VOVEFUSU9OID0gREVTQ1JJUFRPUl9fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNoYXBlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfREVTQ1JJUFRPUl9fU0hBUEVJQ09OID0gREVTQ1JJUFRPUl9fU0hBUEVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9ERVNDUklQVE9SX19OT0RFSUNPTiA9IERFU0NSSVBUT1JfX05PREVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZWZpeDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfREVTQ1JJUFRPUl9fUFJFRklYID0gREVTQ1JJUFRPUl9fUFJFRklYOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIFBsYW5uZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX0RFU0NSSVBUT1JfX0lTX1BMQU5ORUQgPSBERVNDUklQVE9SX19JU19QTEFOTkVEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkhhcyBNdWx0aXBsZSBPY2N1cnJlbmNlczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfREVTQ1JJUFRPUl9fSEFTX01VTFRJUExFX09DQ1VSUkVOQ0VTID0gREVTQ1JJUFRPUl9fSEFTX01VTFRJUExFX09DQ1VSUkVOQ0VTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIE9wdGlvbmFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9ERVNDUklQVE9SX19JU19PUFRJT05BTCA9IERFU0NSSVBUT1JfX0lTX09QVElPTkFMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRlZCBBZnRlcjwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfREVTQ1JJUFRPUl9fUFJFU0VOVEVEX0FGVEVSID0gREVTQ1JJUFRPUl9fUFJFU0VOVEVEX0FGVEVSOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRlZCBCZWZvcmU8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX0RFU0NSSVBUT1JfX1BSRVNFTlRFRF9CRUZPUkUgPSBERVNDUklQVE9SX19QUkVTRU5URURfQkVGT1JFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBsYW5uaW5nIERhdGE8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX0RFU0NSSVBUT1JfX1BMQU5OSU5HX0RBVEEgPSBERVNDUklQVE9SX19QTEFOTklOR19EQVRBOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cGVyIEFjdGl2aXRpZXM8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX0RFU0NSSVBUT1JfX1NVUEVSX0FDVElWSVRJRVMgPSBERVNDUklQVE9SX19TVVBFUl9BQ1RJVklUSUVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoZWNrbGlzdHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfREVTQ1JJUFRPUl9fQ0hFQ0tMSVNUUyA9IERFU0NSSVBUT1JfX0NIRUNLTElTVFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29uY2VwdHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfREVTQ1JJUFRPUl9fQ09OQ0VQVFMgPSBERVNDUklQVE9SX19DT05DRVBUUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeGFtcGxlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9ERVNDUklQVE9SX19FWEFNUExFUyA9IERFU0NSSVBUT1JfX0VYQU1QTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWRlbGluZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfREVTQ1JJUFRPUl9fR1VJREVMSU5FUyA9IERFU0NSSVBUT1JfX0dVSURFTElORVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmV1c2FibGUgQXNzZXRzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX0RFU0NSSVBUT1JfX1JFVVNBQkxFX0FTU0VUUyA9IERFU0NSSVBUT1JfX1JFVVNBQkxFX0FTU0VUUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwb3J0aW5nIE1hdGVyaWFsczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9ERVNDUklQVE9SX19TVVBQT1JUSU5HX01BVEVSSUFMUyA9IERFU0NSSVBUT1JfX1NVUFBPUlRJTkdfTUFURVJJQUxTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRlbXBsYXRlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9ERVNDUklQVE9SX19URU1QTEFURVMgPSBERVNDUklQVE9SX19URU1QTEFURVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVwb3J0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9ERVNDUklQVE9SX19SRVBPUlRTID0gREVTQ1JJUFRPUl9fUkVQT1JUUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Fc3RpbWF0aW9uY29uc2lkZXJhdGlvbnM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfREVTQ1JJUFRPUl9fRVNUSU1BVElPTkNPTlNJREVSQVRJT05TID0gREVTQ1JJUFRPUl9fRVNUSU1BVElPTkNPTlNJREVSQVRJT05TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRvb2xtZW50b3I8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfREVTQ1JJUFRPUl9fVE9PTE1FTlRPUiA9IERFU0NSSVBUT1JfX1RPT0xNRU5UT1I7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgU3luY2hyb25pemVkIFdpdGggU291cmNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9ERVNDUklQVE9SX19JU19TWU5DSFJPTklaRURfV0lUSF9TT1VSQ0UgPSBERVNDUklQVE9SX19JU19TWU5DSFJPTklaRURfV0lUSF9TT1VSQ0U7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Um9sZTwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfREVTQ1JJUFRPUl9fUk9MRSA9IERFU0NSSVBUT1JfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TW9kaWZpZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfREVTQ1JJUFRPUl9fTU9ESUZJRVMgPSBERVNDUklQVE9SX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlc3BvbnNpYmxlIEZvcjwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9ERVNDUklQVE9SX19SRVNQT05TSUJMRV9GT1IgPSBERVNDUklQVE9SX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlJvbGUgRGVzY3JpcHRvcjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX0RFU0NSSVBUT1JfRkVBVFVSRV9DT1VOVCA9IERFU0NSSVBUT1JfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRPUl9fTkFNRSA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRPUl9fR1VJRCA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0dVSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUT1JfX1BSRVNFTlRBVElPTl9OQU1FID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUT1JfX0JSSUVGX0RFU0NSSVBUSU9OID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRPUl9fT1dORURfUlVMRVMgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19PV05FRF9SVUxFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVE9SX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPktpbmQ8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRPUl9fS0lORCA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0tJTkQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRPUl9fU1VQUFJFU1NFRCA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUT1JfX09SREVSSU5HX0dVSURFID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgQWJzdHJhY3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUT1JfX0lTX0FCU1RSQUNUID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fSVNfQUJTVFJBQ1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVE9SX19QUkVTRU5UQVRJT04gPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19QUkVTRU5UQVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2hhcGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVE9SX19TSEFQRUlDT04gPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19TSEFQRUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm9kZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUT1JfX05PREVJQ09OID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fTk9ERUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlZml4PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVE9SX19QUkVGSVggPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19QUkVGSVg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgUGxhbm5lZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRPUl9fSVNfUExBTk5FRCA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0lTX1BMQU5ORUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SGFzIE11bHRpcGxlIE9jY3VycmVuY2VzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVE9SX19IQVNfTVVMVElQTEVfT0NDVVJSRU5DRVMgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19IQVNfTVVMVElQTEVfT0NDVVJSRU5DRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgT3B0aW9uYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUT1JfX0lTX09QVElPTkFMID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fSVNfT1BUSU9OQUw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGVkIEFmdGVyPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVE9SX19QUkVTRU5URURfQUZURVIgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19QUkVTRU5URURfQUZURVI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGVkIEJlZm9yZTwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRPUl9fUFJFU0VOVEVEX0JFRk9SRSA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX1BSRVNFTlRFRF9CRUZPUkU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UGxhbm5pbmcgRGF0YTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRPUl9fUExBTk5JTkdfREFUQSA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX1BMQU5OSU5HX0RBVEE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwZXIgQWN0aXZpdGllczwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRPUl9fU1VQRVJfQUNUSVZJVElFUyA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX1NVUEVSX0FDVElWSVRJRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hlY2tsaXN0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVE9SX19DSEVDS0xJU1RTID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fQ0hFQ0tMSVNUUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db25jZXB0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVE9SX19DT05DRVBUUyA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0NPTkNFUFRTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4YW1wbGVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUT1JfX0VYQU1QTEVTID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fRVhBTVBMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZGVsaW5lczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVE9SX19HVUlERUxJTkVTID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fR1VJREVMSU5FUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXVzYWJsZSBBc3NldHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRPUl9fUkVVU0FCTEVfQVNTRVRTID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fUkVVU0FCTEVfQVNTRVRTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHBvcnRpbmcgTWF0ZXJpYWxzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUT1JfX1NVUFBPUlRJTkdfTUFURVJJQUxTID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fU1VQUE9SVElOR19NQVRFUklBTFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGVtcGxhdGVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUT1JfX1RFTVBMQVRFUyA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX1RFTVBMQVRFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXBvcnRzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUT1JfX1JFUE9SVFMgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19SRVBPUlRTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVzdGltYXRpb25jb25zaWRlcmF0aW9uczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVE9SX19FU1RJTUFUSU9OQ09OU0lERVJBVElPTlMgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19FU1RJTUFUSU9OQ09OU0lERVJBVElPTlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VG9vbG1lbnRvcjwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVE9SX19UT09MTUVOVE9SID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fVE9PTE1FTlRPUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBSZXBlYXRhYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVE9SX19JU19SRVBFQVRBQkxFID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fSVNfUkVQRUFUQUJMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBPbmdvaW5nPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVE9SX19JU19PTkdPSU5HID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fSVNfT05HT0lORzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBFdmVudCBEcml2ZW48L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUT1JfX0lTX0VWRU5UX0RSSVZFTiA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0lTX0VWRU5UX0RSSVZFTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5MaW5rIFRvIFByZWRlY2Vzc29yPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUT1JfX0xJTktfVE9fUFJFREVDRVNTT1IgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19MSU5LX1RPX1BSRURFQ0VTU09SOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIFN5bmNocm9uaXplZCBXaXRoIFNvdXJjZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRPUl9fSVNfU1lOQ0hST05JWkVEX1dJVEhfU09VUkNFID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UYXNrPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVE9SX19UQVNLID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BZGRpdGlvbmFsbHkgUGVyZm9ybWVkIEJ5PC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUT1JfX0FERElUSU9OQUxMWV9QRVJGT1JNRURfQlkgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFzc2lzdGVkIEJ5PC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUT1JfX0FTU0lTVEVEX0JZID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeHRlcm5hbCBJbnB1dDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVE9SX19FWFRFUk5BTF9JTlBVVCA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWFuZGF0b3J5IElucHV0PC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUT1JfX01BTkRBVE9SWV9JTlBVVCA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3B0aW9uYWwgSW5wdXQ8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRPUl9fT1BUSU9OQUxfSU5QVVQgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA2OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk91dHB1dDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVE9SX19PVVRQVVQgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA3OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBlcmZvcm1lZCBQcmltYXJpbHkgQnk8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRPUl9fUEVSRk9STUVEX1BSSU1BUklMWV9CWSA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2VsZWN0ZWQgU3RlcHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRPUl9fU0VMRUNURURfU1RFUFMgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA5OwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlRhc2sgRGVzY3JpcHRvcjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUT1JfRkVBVFVSRV9DT1VOVCA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDEwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT01QT1NJVEVfUk9MRV9fTkFNRSA9IFJPTEVfREVTQ1JJUFRPUl9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09NUE9TSVRFX1JPTEVfX0dVSUQgPSBST0xFX0RFU0NSSVBUT1JfX0dVSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT01QT1NJVEVfUk9MRV9fUFJFU0VOVEFUSU9OX05BTUUgPSBST0xFX0RFU0NSSVBUT1JfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09NUE9TSVRFX1JPTEVfX0JSSUVGX0RFU0NSSVBUSU9OID0gUk9MRV9ERVNDUklQVE9SX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09NUE9TSVRFX1JPTEVfX09XTkVEX1JVTEVTID0gUk9MRV9ERVNDUklQVE9SX19PV05FRF9SVUxFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09NUE9TSVRFX1JPTEVfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gUk9MRV9ERVNDUklQVE9SX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5LaW5kPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT01QT1NJVEVfUk9MRV9fS0lORCA9IFJPTEVfREVTQ1JJUFRPUl9fS0lORDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09NUE9TSVRFX1JPTEVfX1NVUFBSRVNTRUQgPSBST0xFX0RFU0NSSVBUT1JfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT01QT1NJVEVfUk9MRV9fT1JERVJJTkdfR1VJREUgPSBST0xFX0RFU0NSSVBUT1JfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIEFic3RyYWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09NUE9TSVRFX1JPTEVfX0lTX0FCU1RSQUNUID0gUk9MRV9ERVNDUklQVE9SX19JU19BQlNUUkFDVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT01QT1NJVEVfUk9MRV9fUFJFU0VOVEFUSU9OID0gUk9MRV9ERVNDUklQVE9SX19QUkVTRU5UQVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2hhcGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09NUE9TSVRFX1JPTEVfX1NIQVBFSUNPTiA9IFJPTEVfREVTQ1JJUFRPUl9fU0hBUEVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09NUE9TSVRFX1JPTEVfX05PREVJQ09OID0gUk9MRV9ERVNDUklQVE9SX19OT0RFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVmaXg8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT01QT1NJVEVfUk9MRV9fUFJFRklYID0gUk9MRV9ERVNDUklQVE9SX19QUkVGSVg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgUGxhbm5lZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTVBPU0lURV9ST0xFX19JU19QTEFOTkVEID0gUk9MRV9ERVNDUklQVE9SX19JU19QTEFOTkVEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkhhcyBNdWx0aXBsZSBPY2N1cnJlbmNlczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTVBPU0lURV9ST0xFX19IQVNfTVVMVElQTEVfT0NDVVJSRU5DRVMgPSBST0xFX0RFU0NSSVBUT1JfX0hBU19NVUxUSVBMRV9PQ0NVUlJFTkNFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBPcHRpb25hbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTVBPU0lURV9ST0xFX19JU19PUFRJT05BTCA9IFJPTEVfREVTQ1JJUFRPUl9fSVNfT1BUSU9OQUw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGVkIEFmdGVyPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09NUE9TSVRFX1JPTEVfX1BSRVNFTlRFRF9BRlRFUiA9IFJPTEVfREVTQ1JJUFRPUl9fUFJFU0VOVEVEX0FGVEVSOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRlZCBCZWZvcmU8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT01QT1NJVEVfUk9MRV9fUFJFU0VOVEVEX0JFRk9SRSA9IFJPTEVfREVTQ1JJUFRPUl9fUFJFU0VOVEVEX0JFRk9SRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QbGFubmluZyBEYXRhPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09NUE9TSVRFX1JPTEVfX1BMQU5OSU5HX0RBVEEgPSBST0xFX0RFU0NSSVBUT1JfX1BMQU5OSU5HX0RBVEE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwZXIgQWN0aXZpdGllczwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTVBPU0lURV9ST0xFX19TVVBFUl9BQ1RJVklUSUVTID0gUk9MRV9ERVNDUklQVE9SX19TVVBFUl9BQ1RJVklUSUVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoZWNrbGlzdHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTVBPU0lURV9ST0xFX19DSEVDS0xJU1RTID0gUk9MRV9ERVNDUklQVE9SX19DSEVDS0xJU1RTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbmNlcHRzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT01QT1NJVEVfUk9MRV9fQ09OQ0VQVFMgPSBST0xFX0RFU0NSSVBUT1JfX0NPTkNFUFRTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4YW1wbGVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT01QT1NJVEVfUk9MRV9fRVhBTVBMRVMgPSBST0xFX0RFU0NSSVBUT1JfX0VYQU1QTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWRlbGluZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTVBPU0lURV9ST0xFX19HVUlERUxJTkVTID0gUk9MRV9ERVNDUklQVE9SX19HVUlERUxJTkVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJldXNhYmxlIEFzc2V0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09NUE9TSVRFX1JPTEVfX1JFVVNBQkxFX0FTU0VUUyA9IFJPTEVfREVTQ1JJUFRPUl9fUkVVU0FCTEVfQVNTRVRTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHBvcnRpbmcgTWF0ZXJpYWxzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT01QT1NJVEVfUk9MRV9fU1VQUE9SVElOR19NQVRFUklBTFMgPSBST0xFX0RFU0NSSVBUT1JfX1NVUFBPUlRJTkdfTUFURVJJQUxTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRlbXBsYXRlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09NUE9TSVRFX1JPTEVfX1RFTVBMQVRFUyA9IFJPTEVfREVTQ1JJUFRPUl9fVEVNUExBVEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlcG9ydHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTVBPU0lURV9ST0xFX19SRVBPUlRTID0gUk9MRV9ERVNDUklQVE9SX19SRVBPUlRTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVzdGltYXRpb25jb25zaWRlcmF0aW9uczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09NUE9TSVRFX1JPTEVfX0VTVElNQVRJT05DT05TSURFUkFUSU9OUyA9IFJPTEVfREVTQ1JJUFRPUl9fRVNUSU1BVElPTkNPTlNJREVSQVRJT05TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRvb2xtZW50b3I8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTVBPU0lURV9ST0xFX19UT09MTUVOVE9SID0gUk9MRV9ERVNDUklQVE9SX19UT09MTUVOVE9SOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIFN5bmNocm9uaXplZCBXaXRoIFNvdXJjZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTVBPU0lURV9ST0xFX19JU19TWU5DSFJPTklaRURfV0lUSF9TT1VSQ0UgPSBST0xFX0RFU0NSSVBUT1JfX0lTX1NZTkNIUk9OSVpFRF9XSVRIX1NPVVJDRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Sb2xlPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09NUE9TSVRFX1JPTEVfX1JPTEUgPSBST0xFX0RFU0NSSVBUT1JfX1JPTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TW9kaWZpZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTVBPU0lURV9ST0xFX19NT0RJRklFUyA9IFJPTEVfREVTQ1JJUFRPUl9fTU9ESUZJRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVzcG9uc2libGUgRm9yPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT01QT1NJVEVfUk9MRV9fUkVTUE9OU0lCTEVfRk9SID0gUk9MRV9ERVNDUklQVE9SX19SRVNQT05TSUJMRV9GT1I7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWdncmVnYXRlZCBSb2xlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09NUE9TSVRFX1JPTEVfX0FHR1JFR0FURURfUk9MRVMgPSBST0xFX0RFU0NSSVBUT1JfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+Q29tcG9zaXRlIFJvbGU8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09NUE9TSVRFX1JPTEVfRkVBVFVSRV9DT1VOVCA9IFJPTEVfREVTQ1JJUFRPUl9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19fTkFNRSA9IEFDVElWSVRZX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX19HVUlEID0gQUNUSVZJVFlfX0dVSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX19QUkVTRU5UQVRJT05fTkFNRSA9IEFDVElWSVRZX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfX0JSSUVGX0RFU0NSSVBUSU9OID0gQUNUSVZJVFlfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX19PV05FRF9SVUxFUyA9IEFDVElWSVRZX19PV05FRF9SVUxFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBBQ1RJVklUWV9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+S2luZDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19fS0lORCA9IEFDVElWSVRZX19LSU5EOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX19TVVBQUkVTU0VEID0gQUNUSVZJVFlfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX19PUkRFUklOR19HVUlERSA9IEFDVElWSVRZX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBBYnN0cmFjdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfX0lTX0FCU1RSQUNUID0gQUNUSVZJVFlfX0lTX0FCU1RSQUNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfX1BSRVNFTlRBVElPTiA9IEFDVElWSVRZX19QUkVTRU5UQVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2hhcGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19fU0hBUEVJQ09OID0gQUNUSVZJVFlfX1NIQVBFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob2RlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfX05PREVJQ09OID0gQUNUSVZJVFlfX05PREVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZWZpeDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfX1BSRUZJWCA9IEFDVElWSVRZX19QUkVGSVg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgUGxhbm5lZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfX0lTX1BMQU5ORUQgPSBBQ1RJVklUWV9fSVNfUExBTk5FRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5IYXMgTXVsdGlwbGUgT2NjdXJyZW5jZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX19IQVNfTVVMVElQTEVfT0NDVVJSRU5DRVMgPSBBQ1RJVklUWV9fSEFTX01VTFRJUExFX09DQ1VSUkVOQ0VTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIE9wdGlvbmFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19fSVNfT1BUSU9OQUwgPSBBQ1RJVklUWV9fSVNfT1BUSU9OQUw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGVkIEFmdGVyPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19fUFJFU0VOVEVEX0FGVEVSID0gQUNUSVZJVFlfX1BSRVNFTlRFRF9BRlRFUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50ZWQgQmVmb3JlPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19fUFJFU0VOVEVEX0JFRk9SRSA9IEFDVElWSVRZX19QUkVTRU5URURfQkVGT1JFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBsYW5uaW5nIERhdGE8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX19QTEFOTklOR19EQVRBID0gQUNUSVZJVFlfX1BMQU5OSU5HX0RBVEE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwZXIgQWN0aXZpdGllczwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfX1NVUEVSX0FDVElWSVRJRVMgPSBBQ1RJVklUWV9fU1VQRVJfQUNUSVZJVElFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGVja2xpc3RzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX19DSEVDS0xJU1RTID0gQUNUSVZJVFlfX0NIRUNLTElTVFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29uY2VwdHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfX0NPTkNFUFRTID0gQUNUSVZJVFlfX0NPTkNFUFRTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4YW1wbGVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX19FWEFNUExFUyA9IEFDVElWSVRZX19FWEFNUExFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkZWxpbmVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX19HVUlERUxJTkVTID0gQUNUSVZJVFlfX0dVSURFTElORVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmV1c2FibGUgQXNzZXRzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX19SRVVTQUJMRV9BU1NFVFMgPSBBQ1RJVklUWV9fUkVVU0FCTEVfQVNTRVRTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHBvcnRpbmcgTWF0ZXJpYWxzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX19TVVBQT1JUSU5HX01BVEVSSUFMUyA9IEFDVElWSVRZX19TVVBQT1JUSU5HX01BVEVSSUFMUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UZW1wbGF0ZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfX1RFTVBMQVRFUyA9IEFDVElWSVRZX19URU1QTEFURVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVwb3J0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19fUkVQT1JUUyA9IEFDVElWSVRZX19SRVBPUlRTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVzdGltYXRpb25jb25zaWRlcmF0aW9uczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19fRVNUSU1BVElPTkNPTlNJREVSQVRJT05TID0gQUNUSVZJVFlfX0VTVElNQVRJT05DT05TSURFUkFUSU9OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ub29sbWVudG9yPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX19UT09MTUVOVE9SID0gQUNUSVZJVFlfX1RPT0xNRU5UT1I7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgUmVwZWF0YWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfX0lTX1JFUEVBVEFCTEUgPSBBQ1RJVklUWV9fSVNfUkVQRUFUQUJMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBPbmdvaW5nPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19fSVNfT05HT0lORyA9IEFDVElWSVRZX19JU19PTkdPSU5HOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIEV2ZW50IERyaXZlbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfX0lTX0VWRU5UX0RSSVZFTiA9IEFDVElWSVRZX19JU19FVkVOVF9EUklWRU47Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TGluayBUbyBQcmVkZWNlc3NvcjwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19fTElOS19UT19QUkVERUNFU1NPUiA9IEFDVElWSVRZX19MSU5LX1RPX1BSRURFQ0VTU09SOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZ1bGZpbGxzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX19GVUxGSUxMUyA9IEFDVElWSVRZX19GVUxGSUxMUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19fVkFSSUFCSUxJVFlfVFlQRSA9IEFDVElWSVRZX19WQVJJQUJJTElUWV9UWVBFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UID0gQUNUSVZJVFlfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlY29uZGl0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19fUFJFQ09ORElUSU9OID0gQUNUSVZJVFlfX1BSRUNPTkRJVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qb3N0Y29uZGl0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19fUE9TVENPTkRJVElPTiA9IEFDVElWSVRZX19QT1NUQ09ORElUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyZWFrZG93biBFbGVtZW50czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19fQlJFQUtET1dOX0VMRU1FTlRTID0gQUNUSVZJVFlfX0JSRUFLRE9XTl9FTEVNRU5UUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Sb2FkbWFwczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19fUk9BRE1BUFMgPSBBQ1RJVklUWV9fUk9BRE1BUFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW5jbHVkZXMgUGF0dGVybnM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfX0lOQ0xVREVTX1BBVFRFUk5TID0gQUNUSVZJVFlfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVmYXVsdCBDb250ZXh0PC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19fREVGQVVMVF9DT05URVhUID0gQUNUSVZJVFlfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFsaWQgQ29udGV4dDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19fVkFMSURfQ09OVEVYVCA9IEFDVElWSVRZX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlByb2Nlc3M8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19GRUFUVVJFX0NPVU5UID0gQUNUSVZJVFlfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfX05BTUUgPSBQUk9DRVNTX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX19HVUlEID0gUFJPQ0VTU19fR1VJRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfX1BSRVNFTlRBVElPTl9OQU1FID0gUFJPQ0VTU19fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX19CUklFRl9ERVNDUklQVElPTiA9IFBST0NFU1NfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX19PV05FRF9SVUxFUyA9IFBST0NFU1NfX09XTkVEX1JVTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IFBST0NFU1NfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPktpbmQ8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfX0tJTkQgPSBQUk9DRVNTX19LSU5EOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX19TVVBQUkVTU0VEID0gUFJPQ0VTU19fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfX09SREVSSU5HX0dVSURFID0gUFJPQ0VTU19fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgQWJzdHJhY3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX19JU19BQlNUUkFDVCA9IFBST0NFU1NfX0lTX0FCU1RSQUNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfX1BSRVNFTlRBVElPTiA9IFBST0NFU1NfX1BSRVNFTlRBVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TaGFwZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX19TSEFQRUlDT04gPSBQUk9DRVNTX19TSEFQRUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm9kZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX19OT0RFSUNPTiA9IFBST0NFU1NfX05PREVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZWZpeDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfX1BSRUZJWCA9IFBST0NFU1NfX1BSRUZJWDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBQbGFubmVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19fSVNfUExBTk5FRCA9IFBST0NFU1NfX0lTX1BMQU5ORUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SGFzIE11bHRpcGxlIE9jY3VycmVuY2VzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19fSEFTX01VTFRJUExFX09DQ1VSUkVOQ0VTID0gUFJPQ0VTU19fSEFTX01VTFRJUExFX09DQ1VSUkVOQ0VTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIE9wdGlvbmFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19fSVNfT1BUSU9OQUwgPSBQUk9DRVNTX19JU19PUFRJT05BTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50ZWQgQWZ0ZXI8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX19QUkVTRU5URURfQUZURVIgPSBQUk9DRVNTX19QUkVTRU5URURfQUZURVI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGVkIEJlZm9yZTwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfX1BSRVNFTlRFRF9CRUZPUkUgPSBQUk9DRVNTX19QUkVTRU5URURfQkVGT1JFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBsYW5uaW5nIERhdGE8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX19QTEFOTklOR19EQVRBID0gUFJPQ0VTU19fUExBTk5JTkdfREFUQTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBlciBBY3Rpdml0aWVzPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19fU1VQRVJfQUNUSVZJVElFUyA9IFBST0NFU1NfX1NVUEVSX0FDVElWSVRJRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hlY2tsaXN0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19fQ0hFQ0tMSVNUUyA9IFBST0NFU1NfX0NIRUNLTElTVFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29uY2VwdHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfX0NPTkNFUFRTID0gUFJPQ0VTU19fQ09OQ0VQVFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXhhbXBsZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfX0VYQU1QTEVTID0gUFJPQ0VTU19fRVhBTVBMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZGVsaW5lczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19fR1VJREVMSU5FUyA9IFBST0NFU1NfX0dVSURFTElORVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmV1c2FibGUgQXNzZXRzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX19SRVVTQUJMRV9BU1NFVFMgPSBQUk9DRVNTX19SRVVTQUJMRV9BU1NFVFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcG9ydGluZyBNYXRlcmlhbHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfX1NVUFBPUlRJTkdfTUFURVJJQUxTID0gUFJPQ0VTU19fU1VQUE9SVElOR19NQVRFUklBTFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGVtcGxhdGVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX19URU1QTEFURVMgPSBQUk9DRVNTX19URU1QTEFURVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVwb3J0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19fUkVQT1JUUyA9IFBST0NFU1NfX1JFUE9SVFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXN0aW1hdGlvbmNvbnNpZGVyYXRpb25zPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX19FU1RJTUFUSU9OQ09OU0lERVJBVElPTlMgPSBQUk9DRVNTX19FU1RJTUFUSU9OQ09OU0lERVJBVElPTlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VG9vbG1lbnRvcjwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19fVE9PTE1FTlRPUiA9IFBST0NFU1NfX1RPT0xNRU5UT1I7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgUmVwZWF0YWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfX0lTX1JFUEVBVEFCTEUgPSBQUk9DRVNTX19JU19SRVBFQVRBQkxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIE9uZ29pbmc8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX19JU19PTkdPSU5HID0gUFJPQ0VTU19fSVNfT05HT0lORzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBFdmVudCBEcml2ZW48L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX19JU19FVkVOVF9EUklWRU4gPSBQUk9DRVNTX19JU19FVkVOVF9EUklWRU47Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TGluayBUbyBQcmVkZWNlc3NvcjwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19fTElOS19UT19QUkVERUNFU1NPUiA9IFBST0NFU1NfX0xJTktfVE9fUFJFREVDRVNTT1I7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RnVsZmlsbHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfX0ZVTEZJTExTID0gUFJPQ0VTU19fRlVMRklMTFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfX1ZBUklBQklMSVRZX1RZUEUgPSBQUk9DRVNTX19WQVJJQUJJTElUWV9UWVBFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UID0gUFJPQ0VTU19fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVjb25kaXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX19QUkVDT05ESVRJT04gPSBQUk9DRVNTX19QUkVDT05ESVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UG9zdGNvbmRpdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfX1BPU1RDT05ESVRJT04gPSBQUk9DRVNTX19QT1NUQ09ORElUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyZWFrZG93biBFbGVtZW50czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19fQlJFQUtET1dOX0VMRU1FTlRTID0gUFJPQ0VTU19fQlJFQUtET1dOX0VMRU1FTlRTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJvYWRtYXBzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX19ST0FETUFQUyA9IFBST0NFU1NfX1JPQURNQVBTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkluY2x1ZGVzIFBhdHRlcm5zPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX19JTkNMVURFU19QQVRURVJOUyA9IFBST0NFU1NfX0lOQ0xVREVTX1BBVFRFUk5TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlZmF1bHQgQ29udGV4dDwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfX0RFRkFVTFRfQ09OVEVYVCA9IFBST0NFU1NfX0RFRkFVTFRfQ09OVEVYVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYWxpZCBDb250ZXh0PC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX19WQUxJRF9DT05URVhUID0gUFJPQ0VTU19fVkFMSURfQ09OVEVYVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FZHVjYXRpb24gTWF0ZXJpYWxzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX19FRFVDQVRJT05fTUFURVJJQUxTID0gUFJPQ0VTU19GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db21tdW5pY2F0aW9ucyBNYXRlcmlhbHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfX0NPTU1VTklDQVRJT05TX01BVEVSSUFMUyA9IFBST0NFU1NfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+RGVsaXZlcnkgUHJvY2VzczwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX0ZFQVRVUkVfQ09VTlQgPSBQUk9DRVNTX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDQVBBQklMSVRZX1BBVFRFUk5fX05BTUUgPSBQUk9DRVNTX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDQVBBQklMSVRZX1BBVFRFUk5fX0dVSUQgPSBQUk9DRVNTX19HVUlEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0FQQUJJTElUWV9QQVRURVJOX19QUkVTRU5UQVRJT05fTkFNRSA9IFBST0NFU1NfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0FQQUJJTElUWV9QQVRURVJOX19CUklFRl9ERVNDUklQVElPTiA9IFBST0NFU1NfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDQVBBQklMSVRZX1BBVFRFUk5fX09XTkVEX1JVTEVTID0gUFJPQ0VTU19fT1dORURfUlVMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENBUEFCSUxJVFlfUEFUVEVSTl9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBQUk9DRVNTX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5LaW5kPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDQVBBQklMSVRZX1BBVFRFUk5fX0tJTkQgPSBQUk9DRVNTX19LSU5EOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDQVBBQklMSVRZX1BBVFRFUk5fX1NVUFBSRVNTRUQgPSBQUk9DRVNTX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0FQQUJJTElUWV9QQVRURVJOX19PUkRFUklOR19HVUlERSA9IFBST0NFU1NfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIEFic3RyYWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0FQQUJJTElUWV9QQVRURVJOX19JU19BQlNUUkFDVCA9IFBST0NFU1NfX0lTX0FCU1RSQUNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENBUEFCSUxJVFlfUEFUVEVSTl9fUFJFU0VOVEFUSU9OID0gUFJPQ0VTU19fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNoYXBlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENBUEFCSUxJVFlfUEFUVEVSTl9fU0hBUEVJQ09OID0gUFJPQ0VTU19fU0hBUEVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0FQQUJJTElUWV9QQVRURVJOX19OT0RFSUNPTiA9IFBST0NFU1NfX05PREVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZWZpeDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENBUEFCSUxJVFlfUEFUVEVSTl9fUFJFRklYID0gUFJPQ0VTU19fUFJFRklYOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIFBsYW5uZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDQVBBQklMSVRZX1BBVFRFUk5fX0lTX1BMQU5ORUQgPSBQUk9DRVNTX19JU19QTEFOTkVEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkhhcyBNdWx0aXBsZSBPY2N1cnJlbmNlczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENBUEFCSUxJVFlfUEFUVEVSTl9fSEFTX01VTFRJUExFX09DQ1VSUkVOQ0VTID0gUFJPQ0VTU19fSEFTX01VTFRJUExFX09DQ1VSUkVOQ0VTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIE9wdGlvbmFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0FQQUJJTElUWV9QQVRURVJOX19JU19PUFRJT05BTCA9IFBST0NFU1NfX0lTX09QVElPTkFMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRlZCBBZnRlcjwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENBUEFCSUxJVFlfUEFUVEVSTl9fUFJFU0VOVEVEX0FGVEVSID0gUFJPQ0VTU19fUFJFU0VOVEVEX0FGVEVSOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRlZCBCZWZvcmU8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDQVBBQklMSVRZX1BBVFRFUk5fX1BSRVNFTlRFRF9CRUZPUkUgPSBQUk9DRVNTX19QUkVTRU5URURfQkVGT1JFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBsYW5uaW5nIERhdGE8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDQVBBQklMSVRZX1BBVFRFUk5fX1BMQU5OSU5HX0RBVEEgPSBQUk9DRVNTX19QTEFOTklOR19EQVRBOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cGVyIEFjdGl2aXRpZXM8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDQVBBQklMSVRZX1BBVFRFUk5fX1NVUEVSX0FDVElWSVRJRVMgPSBQUk9DRVNTX19TVVBFUl9BQ1RJVklUSUVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoZWNrbGlzdHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENBUEFCSUxJVFlfUEFUVEVSTl9fQ0hFQ0tMSVNUUyA9IFBST0NFU1NfX0NIRUNLTElTVFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29uY2VwdHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENBUEFCSUxJVFlfUEFUVEVSTl9fQ09OQ0VQVFMgPSBQUk9DRVNTX19DT05DRVBUUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeGFtcGxlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0FQQUJJTElUWV9QQVRURVJOX19FWEFNUExFUyA9IFBST0NFU1NfX0VYQU1QTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWRlbGluZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENBUEFCSUxJVFlfUEFUVEVSTl9fR1VJREVMSU5FUyA9IFBST0NFU1NfX0dVSURFTElORVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmV1c2FibGUgQXNzZXRzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDQVBBQklMSVRZX1BBVFRFUk5fX1JFVVNBQkxFX0FTU0VUUyA9IFBST0NFU1NfX1JFVVNBQkxFX0FTU0VUUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwb3J0aW5nIE1hdGVyaWFsczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0FQQUJJTElUWV9QQVRURVJOX19TVVBQT1JUSU5HX01BVEVSSUFMUyA9IFBST0NFU1NfX1NVUFBPUlRJTkdfTUFURVJJQUxTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRlbXBsYXRlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0FQQUJJTElUWV9QQVRURVJOX19URU1QTEFURVMgPSBQUk9DRVNTX19URU1QTEFURVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVwb3J0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0FQQUJJTElUWV9QQVRURVJOX19SRVBPUlRTID0gUFJPQ0VTU19fUkVQT1JUUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Fc3RpbWF0aW9uY29uc2lkZXJhdGlvbnM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENBUEFCSUxJVFlfUEFUVEVSTl9fRVNUSU1BVElPTkNPTlNJREVSQVRJT05TID0gUFJPQ0VTU19fRVNUSU1BVElPTkNPTlNJREVSQVRJT05TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRvb2xtZW50b3I8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENBUEFCSUxJVFlfUEFUVEVSTl9fVE9PTE1FTlRPUiA9IFBST0NFU1NfX1RPT0xNRU5UT1I7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgUmVwZWF0YWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENBUEFCSUxJVFlfUEFUVEVSTl9fSVNfUkVQRUFUQUJMRSA9IFBST0NFU1NfX0lTX1JFUEVBVEFCTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgT25nb2luZzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENBUEFCSUxJVFlfUEFUVEVSTl9fSVNfT05HT0lORyA9IFBST0NFU1NfX0lTX09OR09JTkc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgRXZlbnQgRHJpdmVuPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0FQQUJJTElUWV9QQVRURVJOX19JU19FVkVOVF9EUklWRU4gPSBQUk9DRVNTX19JU19FVkVOVF9EUklWRU47Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TGluayBUbyBQcmVkZWNlc3NvcjwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0FQQUJJTElUWV9QQVRURVJOX19MSU5LX1RPX1BSRURFQ0VTU09SID0gUFJPQ0VTU19fTElOS19UT19QUkVERUNFU1NPUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GdWxmaWxsczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0FQQUJJTElUWV9QQVRURVJOX19GVUxGSUxMUyA9IFBST0NFU1NfX0ZVTEZJTExTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDQVBBQklMSVRZX1BBVFRFUk5fX1ZBUklBQklMSVRZX1RZUEUgPSBQUk9DRVNTX19WQVJJQUJJTElUWV9UWVBFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDQVBBQklMSVRZX1BBVFRFUk5fX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQgPSBQUk9DRVNTX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZWNvbmRpdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENBUEFCSUxJVFlfUEFUVEVSTl9fUFJFQ09ORElUSU9OID0gUFJPQ0VTU19fUFJFQ09ORElUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBvc3Rjb25kaXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDQVBBQklMSVRZX1BBVFRFUk5fX1BPU1RDT05ESVRJT04gPSBQUk9DRVNTX19QT1NUQ09ORElUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyZWFrZG93biBFbGVtZW50czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0FQQUJJTElUWV9QQVRURVJOX19CUkVBS0RPV05fRUxFTUVOVFMgPSBQUk9DRVNTX19CUkVBS0RPV05fRUxFTUVOVFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Um9hZG1hcHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENBUEFCSUxJVFlfUEFUVEVSTl9fUk9BRE1BUFMgPSBQUk9DRVNTX19ST0FETUFQUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbmNsdWRlcyBQYXR0ZXJuczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0FQQUJJTElUWV9QQVRURVJOX19JTkNMVURFU19QQVRURVJOUyA9IFBST0NFU1NfX0lOQ0xVREVTX1BBVFRFUk5TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlZmF1bHQgQ29udGV4dDwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENBUEFCSUxJVFlfUEFUVEVSTl9fREVGQVVMVF9DT05URVhUID0gUFJPQ0VTU19fREVGQVVMVF9DT05URVhUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhbGlkIENvbnRleHQ8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENBUEFCSUxJVFlfUEFUVEVSTl9fVkFMSURfQ09OVEVYVCA9IFBST0NFU1NfX1ZBTElEX0NPTlRFWFQ7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+Q2FwYWJpbGl0eSBQYXR0ZXJuPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENBUEFCSUxJVFlfUEFUVEVSTl9GRUFUVVJFX0NPVU5UID0gUFJPQ0VTU19GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLk1ldGhvZENvbmZpZ3VyYXRpb25JbXBsIDxlbT5NZXRob2QgQ29uZmlndXJhdGlvbjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5NZXRob2RDb25maWd1cmF0aW9uSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldE1ldGhvZENvbmZpZ3VyYXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgTUVUSE9EX0NPTkZJR1VSQVRJT04gPSA3NzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX0NPTkZJR1VSQVRJT05fX05BTUUgPSBNRVRIT0RfVU5JVF9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX0NPTkZJR1VSQVRJT05fX0dVSUQgPSBNRVRIT0RfVU5JVF9fR1VJRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9DT05GSUdVUkFUSU9OX19QUkVTRU5UQVRJT05fTkFNRSA9IE1FVEhPRF9VTklUX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9DT05GSUdVUkFUSU9OX19CUklFRl9ERVNDUklQVElPTiA9IE1FVEhPRF9VTklUX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX0NPTkZJR1VSQVRJT05fX09XTkVEX1JVTEVTID0gTUVUSE9EX1VOSVRfX09XTkVEX1JVTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfQ09ORklHVVJBVElPTl9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBNRVRIT0RfVU5JVF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+S2luZDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX0NPTkZJR1VSQVRJT05fX0tJTkQgPSBNRVRIT0RfVU5JVF9fS0lORDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX0NPTkZJR1VSQVRJT05fX1NVUFBSRVNTRUQgPSBNRVRIT0RfVU5JVF9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9DT05GSUdVUkFUSU9OX19PUkRFUklOR19HVUlERSA9IE1FVEhPRF9VTklUX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BdXRob3JzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX0NPTkZJR1VSQVRJT05fX0FVVEhPUlMgPSBNRVRIT0RfVU5JVF9fQVVUSE9SUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGFuZ2UgRGF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9DT05GSUdVUkFUSU9OX19DSEFOR0VfREFURSA9IE1FVEhPRF9VTklUX19DSEFOR0VfREFURTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGFuZ2UgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfQ09ORklHVVJBVElPTl9fQ0hBTkdFX0RFU0NSSVBUSU9OID0gTUVUSE9EX1VOSVRfX0NIQU5HRV9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WZXJzaW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX0NPTkZJR1VSQVRJT05fX1ZFUlNJT04gPSBNRVRIT0RfVU5JVF9fVkVSU0lPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db3B5cmlnaHQgU3RhdGVtZW50PC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX0NPTkZJR1VSQVRJT05fX0NPUFlSSUdIVF9TVEFURU1FTlQgPSBNRVRIT0RfVU5JVF9fQ09QWVJJR0hUX1NUQVRFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgUGx1Z2luIFNlbGVjdGlvbjwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX0NPTkZJR1VSQVRJT05fX01FVEhPRF9QTFVHSU5fU0VMRUNUSU9OID0gTUVUSE9EX1VOSVRfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIFBhY2thZ2UgU2VsZWN0aW9uPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfQ09ORklHVVJBVElPTl9fTUVUSE9EX1BBQ0tBR0VfU0VMRUNUSU9OID0gTUVUSE9EX1VOSVRfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJvY2VzcyBWaWV3czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX0NPTkZJR1VSQVRJT05fX1BST0NFU1NfVklFV1MgPSBNRVRIT0RfVU5JVF9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZWZhdWx0IFZpZXc8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfQ09ORklHVVJBVElPTl9fREVGQVVMVF9WSUVXID0gTUVUSE9EX1VOSVRfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QmFzZSBDb25maWd1cmF0aW9uczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX0NPTkZJR1VSQVRJT05fX0JBU0VfQ09ORklHVVJBVElPTlMgPSBNRVRIT0RfVU5JVF9GRUFUVVJFX0NPVU5UICsgNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdWJ0cmFjdGVkIENhdGVnb3J5PC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfQ09ORklHVVJBVElPTl9fU1VCVFJBQ1RFRF9DQVRFR09SWSA9IE1FVEhPRF9VTklUX0ZFQVRVUkVfQ09VTlQgKyA1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFkZGVkIENhdGVnb3J5PC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfQ09ORklHVVJBVElPTl9fQURERURfQ0FURUdPUlkgPSBNRVRIT0RfVU5JVF9GRUFUVVJFX0NPVU5UICsgNjsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5NZXRob2QgQ29uZmlndXJhdGlvbjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfQ09ORklHVVJBVElPTl9GRUFUVVJFX0NPVU5UID0gTUVUSE9EX1VOSVRfRkVBVFVSRV9DT1VOVCArIDc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9QTFVHSU5fX05BTUUgPSBNRVRIT0RfVU5JVF9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX1BMVUdJTl9fR1VJRCA9IE1FVEhPRF9VTklUX19HVUlEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX1BMVUdJTl9fUFJFU0VOVEFUSU9OX05BTUUgPSBNRVRIT0RfVU5JVF9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfUExVR0lOX19CUklFRl9ERVNDUklQVElPTiA9IE1FVEhPRF9VTklUX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX1BMVUdJTl9fT1dORURfUlVMRVMgPSBNRVRIT0RfVU5JVF9fT1dORURfUlVMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9QTFVHSU5fX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gTUVUSE9EX1VOSVRfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPktpbmQ8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9QTFVHSU5fX0tJTkQgPSBNRVRIT0RfVU5JVF9fS0lORDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX1BMVUdJTl9fU1VQUFJFU1NFRCA9IE1FVEhPRF9VTklUX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX1BMVUdJTl9fT1JERVJJTkdfR1VJREUgPSBNRVRIT0RfVU5JVF9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXV0aG9yczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9QTFVHSU5fX0FVVEhPUlMgPSBNRVRIT0RfVU5JVF9fQVVUSE9SUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGFuZ2UgRGF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9QTFVHSU5fX0NIQU5HRV9EQVRFID0gTUVUSE9EX1VOSVRfX0NIQU5HRV9EQVRFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoYW5nZSBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9QTFVHSU5fX0NIQU5HRV9ERVNDUklQVElPTiA9IE1FVEhPRF9VTklUX19DSEFOR0VfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmVyc2lvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9QTFVHSU5fX1ZFUlNJT04gPSBNRVRIT0RfVU5JVF9fVkVSU0lPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db3B5cmlnaHQgU3RhdGVtZW50PC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX1BMVUdJTl9fQ09QWVJJR0hUX1NUQVRFTUVOVCA9IE1FVEhPRF9VTklUX19DT1BZUklHSFRfU1RBVEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVzZXIgQ2hhbmdlYWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9QTFVHSU5fX1VTRVJfQ0hBTkdFQUJMRSA9IE1FVEhPRF9VTklUX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBQYWNrYWdlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX1BMVUdJTl9fTUVUSE9EX1BBQ0tBR0VTID0gTUVUSE9EX1VOSVRfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QmFzZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9QTFVHSU5fX0JBU0VTID0gTUVUSE9EX1VOSVRfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcG9ydGluZzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9QTFVHSU5fX1NVUFBPUlRJTkcgPSBNRVRIT0RfVU5JVF9GRUFUVVJFX0NPVU5UICsgMzsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5NZXRob2QgUGx1Z2luPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9QTFVHSU5fRkVBVFVSRV9DT1VOVCA9IE1FVEhPRF9VTklUX0ZFQVRVUkVfQ09VTlQgKyA0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19OQU1FID0gUFJPQ0VTU19fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QTEFOTklOR19URU1QTEFURV9fR1VJRCA9IFBST0NFU1NfX0dVSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19QUkVTRU5UQVRJT05fTkFNRSA9IFBST0NFU1NfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QTEFOTklOR19URU1QTEFURV9fQlJJRUZfREVTQ1JJUFRJT04gPSBQUk9DRVNTX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QTEFOTklOR19URU1QTEFURV9fT1dORURfUlVMRVMgPSBQUk9DRVNTX19PV05FRF9SVUxFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QTEFOTklOR19URU1QTEFURV9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBQUk9DRVNTX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5LaW5kPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19LSU5EID0gUFJPQ0VTU19fS0lORDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QTEFOTklOR19URU1QTEFURV9fU1VQUFJFU1NFRCA9IFBST0NFU1NfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19PUkRFUklOR19HVUlERSA9IFBST0NFU1NfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIEFic3RyYWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QTEFOTklOR19URU1QTEFURV9fSVNfQUJTVFJBQ1QgPSBQUk9DRVNTX19JU19BQlNUUkFDVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19QUkVTRU5UQVRJT04gPSBQUk9DRVNTX19QUkVTRU5UQVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2hhcGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QTEFOTklOR19URU1QTEFURV9fU0hBUEVJQ09OID0gUFJPQ0VTU19fU0hBUEVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QTEFOTklOR19URU1QTEFURV9fTk9ERUlDT04gPSBQUk9DRVNTX19OT0RFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVmaXg8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19QUkVGSVggPSBQUk9DRVNTX19QUkVGSVg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgUGxhbm5lZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX0lTX1BMQU5ORUQgPSBQUk9DRVNTX19JU19QTEFOTkVEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkhhcyBNdWx0aXBsZSBPY2N1cnJlbmNlczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX0hBU19NVUxUSVBMRV9PQ0NVUlJFTkNFUyA9IFBST0NFU1NfX0hBU19NVUxUSVBMRV9PQ0NVUlJFTkNFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBPcHRpb25hbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX0lTX09QVElPTkFMID0gUFJPQ0VTU19fSVNfT1BUSU9OQUw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGVkIEFmdGVyPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QTEFOTklOR19URU1QTEFURV9fUFJFU0VOVEVEX0FGVEVSID0gUFJPQ0VTU19fUFJFU0VOVEVEX0FGVEVSOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRlZCBCZWZvcmU8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19QUkVTRU5URURfQkVGT1JFID0gUFJPQ0VTU19fUFJFU0VOVEVEX0JFRk9SRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QbGFubmluZyBEYXRhPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QTEFOTklOR19URU1QTEFURV9fUExBTk5JTkdfREFUQSA9IFBST0NFU1NfX1BMQU5OSU5HX0RBVEE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwZXIgQWN0aXZpdGllczwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX1NVUEVSX0FDVElWSVRJRVMgPSBQUk9DRVNTX19TVVBFUl9BQ1RJVklUSUVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoZWNrbGlzdHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX0NIRUNLTElTVFMgPSBQUk9DRVNTX19DSEVDS0xJU1RTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbmNlcHRzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19DT05DRVBUUyA9IFBST0NFU1NfX0NPTkNFUFRTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4YW1wbGVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19FWEFNUExFUyA9IFBST0NFU1NfX0VYQU1QTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWRlbGluZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX0dVSURFTElORVMgPSBQUk9DRVNTX19HVUlERUxJTkVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJldXNhYmxlIEFzc2V0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QTEFOTklOR19URU1QTEFURV9fUkVVU0FCTEVfQVNTRVRTID0gUFJPQ0VTU19fUkVVU0FCTEVfQVNTRVRTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHBvcnRpbmcgTWF0ZXJpYWxzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19TVVBQT1JUSU5HX01BVEVSSUFMUyA9IFBST0NFU1NfX1NVUFBPUlRJTkdfTUFURVJJQUxTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRlbXBsYXRlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QTEFOTklOR19URU1QTEFURV9fVEVNUExBVEVTID0gUFJPQ0VTU19fVEVNUExBVEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlcG9ydHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX1JFUE9SVFMgPSBQUk9DRVNTX19SRVBPUlRTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVzdGltYXRpb25jb25zaWRlcmF0aW9uczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QTEFOTklOR19URU1QTEFURV9fRVNUSU1BVElPTkNPTlNJREVSQVRJT05TID0gUFJPQ0VTU19fRVNUSU1BVElPTkNPTlNJREVSQVRJT05TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRvb2xtZW50b3I8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX1RPT0xNRU5UT1IgPSBQUk9DRVNTX19UT09MTUVOVE9SOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIFJlcGVhdGFibGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19JU19SRVBFQVRBQkxFID0gUFJPQ0VTU19fSVNfUkVQRUFUQUJMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBPbmdvaW5nPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QTEFOTklOR19URU1QTEFURV9fSVNfT05HT0lORyA9IFBST0NFU1NfX0lTX09OR09JTkc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgRXZlbnQgRHJpdmVuPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QTEFOTklOR19URU1QTEFURV9fSVNfRVZFTlRfRFJJVkVOID0gUFJPQ0VTU19fSVNfRVZFTlRfRFJJVkVOOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxpbmsgVG8gUHJlZGVjZXNzb3I8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX0xJTktfVE9fUFJFREVDRVNTT1IgPSBQUk9DRVNTX19MSU5LX1RPX1BSRURFQ0VTU09SOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZ1bGZpbGxzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19GVUxGSUxMUyA9IFBST0NFU1NfX0ZVTEZJTExTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19WQVJJQUJJTElUWV9UWVBFID0gUFJPQ0VTU19fVkFSSUFCSUxJVFlfVFlQRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QTEFOTklOR19URU1QTEFURV9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVCA9IFBST0NFU1NfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlY29uZGl0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QTEFOTklOR19URU1QTEFURV9fUFJFQ09ORElUSU9OID0gUFJPQ0VTU19fUFJFQ09ORElUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBvc3Rjb25kaXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19QT1NUQ09ORElUSU9OID0gUFJPQ0VTU19fUE9TVENPTkRJVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmVha2Rvd24gRWxlbWVudHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX0JSRUFLRE9XTl9FTEVNRU5UUyA9IFBST0NFU1NfX0JSRUFLRE9XTl9FTEVNRU5UUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Sb2FkbWFwczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QTEFOTklOR19URU1QTEFURV9fUk9BRE1BUFMgPSBQUk9DRVNTX19ST0FETUFQUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbmNsdWRlcyBQYXR0ZXJuczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QTEFOTklOR19URU1QTEFURV9fSU5DTFVERVNfUEFUVEVSTlMgPSBQUk9DRVNTX19JTkNMVURFU19QQVRURVJOUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZWZhdWx0IENvbnRleHQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19ERUZBVUxUX0NPTlRFWFQgPSBQUk9DRVNTX19ERUZBVUxUX0NPTlRFWFQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFsaWQgQ29udGV4dDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QTEFOTklOR19URU1QTEFURV9fVkFMSURfQ09OVEVYVCA9IFBST0NFU1NfX1ZBTElEX0NPTlRFWFQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QmFzZWQgT24gUHJvY2Vzc2VzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19CQVNFRF9PTl9QUk9DRVNTRVMgPSBQUk9DRVNTX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlByb2Nlc3MgUGxhbm5pbmcgVGVtcGxhdGU8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QTEFOTklOR19URU1QTEFURV9GRUFUVVJFX0NPVU5UID0gUFJPQ0VTU19GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJBQ1RJQ0VfX05BTUUgPSBHVUlEQU5DRV9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJBQ1RJQ0VfX0dVSUQgPSBHVUlEQU5DRV9fR1VJRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBSQUNUSUNFX19QUkVTRU5UQVRJT05fTkFNRSA9IEdVSURBTkNFX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBSQUNUSUNFX19CUklFRl9ERVNDUklQVElPTiA9IEdVSURBTkNFX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJBQ1RJQ0VfX09XTkVEX1JVTEVTID0gR1VJREFOQ0VfX09XTkVEX1JVTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUkFDVElDRV9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBHVUlEQU5DRV9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+S2luZDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJBQ1RJQ0VfX0tJTkQgPSBHVUlEQU5DRV9fS0lORDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJBQ1RJQ0VfX1NVUFBSRVNTRUQgPSBHVUlEQU5DRV9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBSQUNUSUNFX19PUkRFUklOR19HVUlERSA9IEdVSURBTkNFX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBBYnN0cmFjdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBSQUNUSUNFX19JU19BQlNUUkFDVCA9IEdVSURBTkNFX19JU19BQlNUUkFDVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUkFDVElDRV9fUFJFU0VOVEFUSU9OID0gR1VJREFOQ0VfX1BSRVNFTlRBVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TaGFwZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUkFDVElDRV9fU0hBUEVJQ09OID0gR1VJREFOQ0VfX1NIQVBFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob2RlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBSQUNUSUNFX19OT0RFSUNPTiA9IEdVSURBTkNFX19OT0RFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJBQ1RJQ0VfX1ZBUklBQklMSVRZX1RZUEUgPSBHVUlEQU5DRV9fVkFSSUFCSUxJVFlfVFlQRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJBQ1RJQ0VfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQgPSBHVUlEQU5DRV9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwb3J0aW5nIE1hdGVyaWFsczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJBQ1RJQ0VfX1NVUFBPUlRJTkdfTUFURVJJQUxTID0gR1VJREFOQ0VfX1NVUFBPUlRJTkdfTUFURVJJQUxTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbmNlcHRzIEFuZCBQYXBlcnM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBSQUNUSUNFX19DT05DRVBUU19BTkRfUEFQRVJTID0gR1VJREFOQ0VfX0NPTkNFUFRTX0FORF9QQVBFUlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hlY2tsaXN0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJBQ1RJQ0VfX0NIRUNLTElTVFMgPSBHVUlEQU5DRV9fQ0hFQ0tMSVNUUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkZWxpbmVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUkFDVElDRV9fR1VJREVMSU5FUyA9IEdVSURBTkNFX19HVUlERUxJTkVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4YW1wbGVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUkFDVElDRV9fRVhBTVBMRVMgPSBHVUlEQU5DRV9fRVhBTVBMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXNzZXRzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUkFDVElDRV9fQVNTRVRTID0gR1VJREFOQ0VfX0FTU0VUUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UZXJtZGVmaW5pdGlvbjwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJBQ1RJQ0VfX1RFUk1ERUZJTklUSU9OID0gR1VJREFOQ0VfX1RFUk1ERUZJTklUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1YiBQcmFjdGljZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBSQUNUSUNFX19TVUJfUFJBQ1RJQ0VTID0gR1VJREFOQ0VfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29udGVudCBSZWZlcmVuY2VzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUkFDVElDRV9fQ09OVEVOVF9SRUZFUkVOQ0VTID0gR1VJREFOQ0VfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWN0aXZpdHkgUmVmZXJlbmNlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJBQ1RJQ0VfX0FDVElWSVRZX1JFRkVSRU5DRVMgPSBHVUlEQU5DRV9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5QcmFjdGljZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUkFDVElDRV9GRUFUVVJFX0NPVU5UID0gR1VJREFOQ0VfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19OQU1FID0gQ09OVEVOVF9ERVNDUklQVElPTl9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX0dVSUQgPSBDT05URU5UX0RFU0NSSVBUSU9OX19HVUlEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX1BSRVNFTlRBVElPTl9OQU1FID0gQ09OVEVOVF9ERVNDUklQVElPTl9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fQlJJRUZfREVTQ1JJUFRJT04gPSBDT05URU5UX0RFU0NSSVBUSU9OX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX09XTkVEX1JVTEVTID0gQ09OVEVOVF9ERVNDUklQVElPTl9fT1dORURfUlVMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IENPTlRFTlRfREVTQ1JJUFRJT05fX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPktpbmQ8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19LSU5EID0gQ09OVEVOVF9ERVNDUklQVElPTl9fS0lORDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX1NVUFBSRVNTRUQgPSBDT05URU5UX0RFU0NSSVBUSU9OX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX09SREVSSU5HX0dVSURFID0gQ09OVEVOVF9ERVNDUklQVElPTl9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXV0aG9yczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19BVVRIT1JTID0gQ09OVEVOVF9ERVNDUklQVElPTl9fQVVUSE9SUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGFuZ2UgRGF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19DSEFOR0VfREFURSA9IENPTlRFTlRfREVTQ1JJUFRJT05fX0NIQU5HRV9EQVRFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoYW5nZSBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19DSEFOR0VfREVTQ1JJUFRJT04gPSBDT05URU5UX0RFU0NSSVBUSU9OX19DSEFOR0VfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmVyc2lvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19WRVJTSU9OID0gQ09OVEVOVF9ERVNDUklQVElPTl9fVkVSU0lPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db3B5cmlnaHQgU3RhdGVtZW50PC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX0NPUFlSSUdIVF9TVEFURU1FTlQgPSBDT05URU5UX0RFU0NSSVBUSU9OX19DT1BZUklHSFRfU1RBVEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1haW4gRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fTUFJTl9ERVNDUklQVElPTiA9IENPTlRFTlRfREVTQ1JJUFRJT05fX01BSU5fREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2VjdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19TRUNUSU9OUyA9IENPTlRFTlRfREVTQ1JJUFRJT05fX1NFQ1RJT05TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4dGVybmFsIElkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX0VYVEVSTkFMX0lEID0gQ09OVEVOVF9ERVNDUklQVElPTl9fRVhURVJOQUxfSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+S2V5IENvbnNpZGVyYXRpb25zPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX0tFWV9DT05TSURFUkFUSU9OUyA9IENPTlRFTlRfREVTQ1JJUFRJT05fX0tFWV9DT05TSURFUkFUSU9OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Mb25nIFByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX0xPTkdfUFJFU0VOVEFUSU9OX05BTUUgPSBDT05URU5UX0RFU0NSSVBUSU9OX19MT05HX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVzYWdlIEd1aWRhbmNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX1VTQUdFX0dVSURBTkNFID0gQ09OVEVOVF9ERVNDUklQVElPTl9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5CcmVha2Rvd24gRWxlbWVudCBEZXNjcmlwdGlvbjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9GRUFUVVJFX0NPVU5UID0gQ09OVEVOVF9ERVNDUklQVElPTl9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfREVTQ1JJUFRJT05fX05BTUUgPSBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfREVTQ1JJUFRJT05fX0dVSUQgPSBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fR1VJRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX0RFU0NSSVBUSU9OX19QUkVTRU5UQVRJT05fTkFNRSA9IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX0RFU0NSSVBUSU9OX19CUklFRl9ERVNDUklQVElPTiA9IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfREVTQ1JJUFRJT05fX09XTkVEX1JVTEVTID0gQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX09XTkVEX1JVTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9ERVNDUklQVElPTl9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+S2luZDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfREVTQ1JJUFRJT05fX0tJTkQgPSBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fS0lORDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfREVTQ1JJUFRJT05fX1NVUFBSRVNTRUQgPSBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX0RFU0NSSVBUSU9OX19PUkRFUklOR19HVUlERSA9IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BdXRob3JzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfREVTQ1JJUFRJT05fX0FVVEhPUlMgPSBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fQVVUSE9SUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGFuZ2UgRGF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX0RFU0NSSVBUSU9OX19DSEFOR0VfREFURSA9IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19DSEFOR0VfREFURTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGFuZ2UgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9ERVNDUklQVElPTl9fQ0hBTkdFX0RFU0NSSVBUSU9OID0gQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX0NIQU5HRV9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WZXJzaW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfREVTQ1JJUFRJT05fX1ZFUlNJT04gPSBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fVkVSU0lPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db3B5cmlnaHQgU3RhdGVtZW50PC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfREVTQ1JJUFRJT05fX0NPUFlSSUdIVF9TVEFURU1FTlQgPSBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fQ09QWVJJR0hUX1NUQVRFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYWluIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfREVTQ1JJUFRJT05fX01BSU5fREVTQ1JJUFRJT04gPSBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fTUFJTl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TZWN0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfREVTQ1JJUFRJT05fX1NFQ1RJT05TID0gQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX1NFQ1RJT05TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4dGVybmFsIElkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfREVTQ1JJUFRJT05fX0VYVEVSTkFMX0lEID0gQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX0VYVEVSTkFMX0lEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPktleSBDb25zaWRlcmF0aW9uczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX0RFU0NSSVBUSU9OX19LRVlfQ09OU0lERVJBVElPTlMgPSBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fS0VZX0NPTlNJREVSQVRJT05TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxvbmcgUHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9ERVNDUklQVElPTl9fTE9OR19QUkVTRU5UQVRJT05fTkFNRSA9IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19MT05HX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVzYWdlIEd1aWRhbmNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfREVTQ1JJUFRJT05fX1VTQUdFX0dVSURBTkNFID0gQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX1VTQUdFX0dVSURBTkNFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlB1cnBvc2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9ERVNDUklQVElPTl9fUFVSUE9TRSA9IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFsdGVybmF0aXZlczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX0RFU0NSSVBUSU9OX19BTFRFUk5BVElWRVMgPSBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ib3d0byBTdGFmZjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX0RFU0NSSVBUSU9OX19IT1dUT19TVEFGRiA9IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkFjdGl2aXR5IERlc2NyaXB0aW9uPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX0RFU0NSSVBUSU9OX0ZFQVRVUkVfQ09VTlQgPSBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9GRUFUVVJFX0NPVU5UICsgMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19ERVNDUklQVElPTl9fTkFNRSA9IEFDVElWSVRZX0RFU0NSSVBUSU9OX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0RFU0NSSVBUSU9OX19HVUlEID0gQUNUSVZJVFlfREVTQ1JJUFRJT05fX0dVSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0RFU0NSSVBUSU9OX19QUkVTRU5UQVRJT05fTkFNRSA9IEFDVElWSVRZX0RFU0NSSVBUSU9OX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfREVTQ1JJUFRJT05fX0JSSUVGX0RFU0NSSVBUSU9OID0gQUNUSVZJVFlfREVTQ1JJUFRJT05fX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0RFU0NSSVBUSU9OX19PV05FRF9SVUxFUyA9IEFDVElWSVRZX0RFU0NSSVBUSU9OX19PV05FRF9SVUxFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19ERVNDUklQVElPTl9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBBQ1RJVklUWV9ERVNDUklQVElPTl9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+S2luZDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19ERVNDUklQVElPTl9fS0lORCA9IEFDVElWSVRZX0RFU0NSSVBUSU9OX19LSU5EOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0RFU0NSSVBUSU9OX19TVVBQUkVTU0VEID0gQUNUSVZJVFlfREVTQ1JJUFRJT05fX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0RFU0NSSVBUSU9OX19PUkRFUklOR19HVUlERSA9IEFDVElWSVRZX0RFU0NSSVBUSU9OX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BdXRob3JzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19ERVNDUklQVElPTl9fQVVUSE9SUyA9IEFDVElWSVRZX0RFU0NSSVBUSU9OX19BVVRIT1JTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoYW5nZSBEYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19ERVNDUklQVElPTl9fQ0hBTkdFX0RBVEUgPSBBQ1RJVklUWV9ERVNDUklQVElPTl9fQ0hBTkdFX0RBVEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hhbmdlIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19ERVNDUklQVElPTl9fQ0hBTkdFX0RFU0NSSVBUSU9OID0gQUNUSVZJVFlfREVTQ1JJUFRJT05fX0NIQU5HRV9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WZXJzaW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19ERVNDUklQVElPTl9fVkVSU0lPTiA9IEFDVElWSVRZX0RFU0NSSVBUSU9OX19WRVJTSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvcHlyaWdodCBTdGF0ZW1lbnQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0RFU0NSSVBUSU9OX19DT1BZUklHSFRfU1RBVEVNRU5UID0gQUNUSVZJVFlfREVTQ1JJUFRJT05fX0NPUFlSSUdIVF9TVEFURU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWFpbiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfREVTQ1JJUFRJT05fX01BSU5fREVTQ1JJUFRJT04gPSBBQ1RJVklUWV9ERVNDUklQVElPTl9fTUFJTl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TZWN0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19ERVNDUklQVElPTl9fU0VDVElPTlMgPSBBQ1RJVklUWV9ERVNDUklQVElPTl9fU0VDVElPTlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXh0ZXJuYWwgSWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0RFU0NSSVBUSU9OX19FWFRFUk5BTF9JRCA9IEFDVElWSVRZX0RFU0NSSVBUSU9OX19FWFRFUk5BTF9JRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5LZXkgQ29uc2lkZXJhdGlvbnM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0RFU0NSSVBUSU9OX19LRVlfQ09OU0lERVJBVElPTlMgPSBBQ1RJVklUWV9ERVNDUklQVElPTl9fS0VZX0NPTlNJREVSQVRJT05TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxvbmcgUHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0RFU0NSSVBUSU9OX19MT05HX1BSRVNFTlRBVElPTl9OQU1FID0gQUNUSVZJVFlfREVTQ1JJUFRJT05fX0xPTkdfUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VXNhZ2UgR3VpZGFuY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0RFU0NSSVBUSU9OX19VU0FHRV9HVUlEQU5DRSA9IEFDVElWSVRZX0RFU0NSSVBUSU9OX19VU0FHRV9HVUlEQU5DRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QdXJwb3NlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19ERVNDUklQVElPTl9fUFVSUE9TRSA9IEFDVElWSVRZX0RFU0NSSVBUSU9OX19QVVJQT1NFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFsdGVybmF0aXZlczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfREVTQ1JJUFRJT05fX0FMVEVSTkFUSVZFUyA9IEFDVElWSVRZX0RFU0NSSVBUSU9OX19BTFRFUk5BVElWRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SG93dG8gU3RhZmY8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0RFU0NSSVBUSU9OX19IT1dUT19TVEFGRiA9IEFDVElWSVRZX0RFU0NSSVBUSU9OX19IT1dUT19TVEFGRjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TY29wZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfREVTQ1JJUFRJT05fX1NDT1BFID0gQUNUSVZJVFlfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VXNhZ2UgTm90ZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0RFU0NSSVBUSU9OX19VU0FHRV9OT1RFUyA9IEFDVElWSVRZX0RFU0NSSVBUSU9OX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlByb2Nlc3MgRGVzY3JpcHRpb248L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19ERVNDUklQVElPTl9GRUFUVVJFX0NPVU5UID0gQUNUSVZJVFlfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX05BTUUgPSBQUk9DRVNTX0RFU0NSSVBUSU9OX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19HVUlEID0gUFJPQ0VTU19ERVNDUklQVElPTl9fR1VJRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1BSRVNFTlRBVElPTl9OQU1FID0gUFJPQ0VTU19ERVNDUklQVElPTl9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19CUklFRl9ERVNDUklQVElPTiA9IFBST0NFU1NfREVTQ1JJUFRJT05fX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19PV05FRF9SVUxFUyA9IFBST0NFU1NfREVTQ1JJUFRJT05fX09XTkVEX1JVTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IFBST0NFU1NfREVTQ1JJUFRJT05fX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPktpbmQ8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX0tJTkQgPSBQUk9DRVNTX0RFU0NSSVBUSU9OX19LSU5EOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19TVVBQUkVTU0VEID0gUFJPQ0VTU19ERVNDUklQVElPTl9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX09SREVSSU5HX0dVSURFID0gUFJPQ0VTU19ERVNDUklQVElPTl9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXV0aG9yczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX0FVVEhPUlMgPSBQUk9DRVNTX0RFU0NSSVBUSU9OX19BVVRIT1JTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoYW5nZSBEYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fQ0hBTkdFX0RBVEUgPSBQUk9DRVNTX0RFU0NSSVBUSU9OX19DSEFOR0VfREFURTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGFuZ2UgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19DSEFOR0VfREVTQ1JJUFRJT04gPSBQUk9DRVNTX0RFU0NSSVBUSU9OX19DSEFOR0VfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmVyc2lvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1ZFUlNJT04gPSBQUk9DRVNTX0RFU0NSSVBUSU9OX19WRVJTSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvcHlyaWdodCBTdGF0ZW1lbnQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19DT1BZUklHSFRfU1RBVEVNRU5UID0gUFJPQ0VTU19ERVNDUklQVElPTl9fQ09QWVJJR0hUX1NUQVRFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYWluIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fTUFJTl9ERVNDUklQVElPTiA9IFBST0NFU1NfREVTQ1JJUFRJT05fX01BSU5fREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2VjdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1NFQ1RJT05TID0gUFJPQ0VTU19ERVNDUklQVElPTl9fU0VDVElPTlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXh0ZXJuYWwgSWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19FWFRFUk5BTF9JRCA9IFBST0NFU1NfREVTQ1JJUFRJT05fX0VYVEVSTkFMX0lEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPktleSBDb25zaWRlcmF0aW9uczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX0tFWV9DT05TSURFUkFUSU9OUyA9IFBST0NFU1NfREVTQ1JJUFRJT05fX0tFWV9DT05TSURFUkFUSU9OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Mb25nIFByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fTE9OR19QUkVTRU5UQVRJT05fTkFNRSA9IFBST0NFU1NfREVTQ1JJUFRJT05fX0xPTkdfUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VXNhZ2UgR3VpZGFuY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19VU0FHRV9HVUlEQU5DRSA9IFBST0NFU1NfREVTQ1JJUFRJT05fX1VTQUdFX0dVSURBTkNFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlB1cnBvc2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19QVVJQT1NFID0gUFJPQ0VTU19ERVNDUklQVElPTl9fUFVSUE9TRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BbHRlcm5hdGl2ZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19BTFRFUk5BVElWRVMgPSBQUk9DRVNTX0RFU0NSSVBUSU9OX19BTFRFUk5BVElWRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SG93dG8gU3RhZmY8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19IT1dUT19TVEFGRiA9IFBST0NFU1NfREVTQ1JJUFRJT05fX0hPV1RPX1NUQUZGOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNjb3BlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fU0NPUEUgPSBQUk9DRVNTX0RFU0NSSVBUSU9OX19TQ09QRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Vc2FnZSBOb3RlczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1VTQUdFX05PVEVTID0gUFJPQ0VTU19ERVNDUklQVElPTl9fVVNBR0VfTk9URVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2NhbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19TQ0FMRSA9IFBST0NFU1NfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJvamVjdCBDaGFyYWN0ZXJpc3RpY3M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19QUk9KRUNUX0NIQVJBQ1RFUklTVElDUyA9IFBST0NFU1NfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmlzayBMZXZlbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1JJU0tfTEVWRUwgPSBQUk9DRVNTX0RFU0NSSVBUSU9OX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVzdGltYXRpbmcgVGVjaG5pcXVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fRVNUSU1BVElOR19URUNITklRVUUgPSBQUk9DRVNTX0RFU0NSSVBUSU9OX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByb2plY3QgTWVtYmVyIEV4cGVydGlzZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1BST0pFQ1RfTUVNQkVSX0VYUEVSVElTRSA9IFBST0NFU1NfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCArIDQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VHlwZSBPZiBDb250cmFjdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1RZUEVfT0ZfQ09OVFJBQ1QgPSBQUk9DRVNTX0RFU0NSSVBUSU9OX0ZFQVRVUkVfQ09VTlQgKyA1OwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkRlbGl2ZXJ5IFByb2Nlc3MgRGVzY3JpcHRpb248L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9GRUFUVVJFX0NPVU5UID0gUFJPQ0VTU19ERVNDUklQVElPTl9GRUFUVVJFX0NPVU5UICsgNjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJUFRPUl9ERVNDUklQVElPTl9fTkFNRSA9IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklQVE9SX0RFU0NSSVBUSU9OX19HVUlEID0gQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX0dVSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklQVE9SX0RFU0NSSVBUSU9OX19QUkVTRU5UQVRJT05fTkFNRSA9IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSVBUT1JfREVTQ1JJUFRJT05fX0JSSUVGX0RFU0NSSVBUSU9OID0gQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklQVE9SX0RFU0NSSVBUSU9OX19PV05FRF9SVUxFUyA9IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19PV05FRF9SVUxFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJUFRPUl9ERVNDUklQVElPTl9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+S2luZDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJUFRPUl9ERVNDUklQVElPTl9fS0lORCA9IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19LSU5EOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklQVE9SX0RFU0NSSVBUSU9OX19TVVBQUkVTU0VEID0gQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklQVE9SX0RFU0NSSVBUSU9OX19PUkRFUklOR19HVUlERSA9IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BdXRob3JzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJUFRPUl9ERVNDUklQVElPTl9fQVVUSE9SUyA9IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19BVVRIT1JTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoYW5nZSBEYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJUFRPUl9ERVNDUklQVElPTl9fQ0hBTkdFX0RBVEUgPSBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fQ0hBTkdFX0RBVEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hhbmdlIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJUFRPUl9ERVNDUklQVElPTl9fQ0hBTkdFX0RFU0NSSVBUSU9OID0gQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX0NIQU5HRV9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WZXJzaW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJUFRPUl9ERVNDUklQVElPTl9fVkVSU0lPTiA9IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19WRVJTSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvcHlyaWdodCBTdGF0ZW1lbnQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklQVE9SX0RFU0NSSVBUSU9OX19DT1BZUklHSFRfU1RBVEVNRU5UID0gQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX0NPUFlSSUdIVF9TVEFURU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWFpbiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSVBUT1JfREVTQ1JJUFRJT05fX01BSU5fREVTQ1JJUFRJT04gPSBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fTUFJTl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TZWN0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJUFRPUl9ERVNDUklQVElPTl9fU0VDVElPTlMgPSBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fU0VDVElPTlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXh0ZXJuYWwgSWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklQVE9SX0RFU0NSSVBUSU9OX19FWFRFUk5BTF9JRCA9IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19FWFRFUk5BTF9JRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5LZXkgQ29uc2lkZXJhdGlvbnM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklQVE9SX0RFU0NSSVBUSU9OX19LRVlfQ09OU0lERVJBVElPTlMgPSBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fS0VZX0NPTlNJREVSQVRJT05TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxvbmcgUHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklQVE9SX0RFU0NSSVBUSU9OX19MT05HX1BSRVNFTlRBVElPTl9OQU1FID0gQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX0xPTkdfUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VXNhZ2UgR3VpZGFuY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklQVE9SX0RFU0NSSVBUSU9OX19VU0FHRV9HVUlEQU5DRSA9IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19VU0FHRV9HVUlEQU5DRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZWZpbmVkIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJUFRPUl9ERVNDUklQVElPTl9fUkVGSU5FRF9ERVNDUklQVElPTiA9IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkRlc2NyaXB0b3IgRGVzY3JpcHRpb248L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJUFRPUl9ERVNDUklQVElPTl9GRUFUVVJFX0NPVU5UID0gQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX0RFU0NSSVBUT1JfX05BTUUgPSBERVNDUklQVE9SX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9ERVNDUklQVE9SX19HVUlEID0gREVTQ1JJUFRPUl9fR1VJRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX0RFU0NSSVBUT1JfX1BSRVNFTlRBVElPTl9OQU1FID0gREVTQ1JJUFRPUl9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9ERVNDUklQVE9SX19CUklFRl9ERVNDUklQVElPTiA9IERFU0NSSVBUT1JfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9ERVNDUklQVE9SX19PV05FRF9SVUxFUyA9IERFU0NSSVBUT1JfX09XTkVEX1JVTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9ERVNDUklQVE9SX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IERFU0NSSVBUT1JfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPktpbmQ8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX0RFU0NSSVBUT1JfX0tJTkQgPSBERVNDUklQVE9SX19LSU5EOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9ERVNDUklQVE9SX19TVVBQUkVTU0VEID0gREVTQ1JJUFRPUl9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX0RFU0NSSVBUT1JfX09SREVSSU5HX0dVSURFID0gREVTQ1JJUFRPUl9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgQWJzdHJhY3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9ERVNDUklQVE9SX19JU19BQlNUUkFDVCA9IERFU0NSSVBUT1JfX0lTX0FCU1RSQUNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX0RFU0NSSVBUT1JfX1BSRVNFTlRBVElPTiA9IERFU0NSSVBUT1JfX1BSRVNFTlRBVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TaGFwZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9ERVNDUklQVE9SX19TSEFQRUlDT04gPSBERVNDUklQVE9SX19TSEFQRUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm9kZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9ERVNDUklQVE9SX19OT0RFSUNPTiA9IERFU0NSSVBUT1JfX05PREVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZWZpeDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX0RFU0NSSVBUT1JfX1BSRUZJWCA9IERFU0NSSVBUT1JfX1BSRUZJWDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBQbGFubmVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfREVTQ1JJUFRPUl9fSVNfUExBTk5FRCA9IERFU0NSSVBUT1JfX0lTX1BMQU5ORUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SGFzIE11bHRpcGxlIE9jY3VycmVuY2VzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfREVTQ1JJUFRPUl9fSEFTX01VTFRJUExFX09DQ1VSUkVOQ0VTID0gREVTQ1JJUFRPUl9fSEFTX01VTFRJUExFX09DQ1VSUkVOQ0VTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIE9wdGlvbmFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfREVTQ1JJUFRPUl9fSVNfT1BUSU9OQUwgPSBERVNDUklQVE9SX19JU19PUFRJT05BTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50ZWQgQWZ0ZXI8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9ERVNDUklQVE9SX19QUkVTRU5URURfQUZURVIgPSBERVNDUklQVE9SX19QUkVTRU5URURfQUZURVI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGVkIEJlZm9yZTwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX0RFU0NSSVBUT1JfX1BSRVNFTlRFRF9CRUZPUkUgPSBERVNDUklQVE9SX19QUkVTRU5URURfQkVGT1JFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBsYW5uaW5nIERhdGE8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9ERVNDUklQVE9SX19QTEFOTklOR19EQVRBID0gREVTQ1JJUFRPUl9fUExBTk5JTkdfREFUQTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBlciBBY3Rpdml0aWVzPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfREVTQ1JJUFRPUl9fU1VQRVJfQUNUSVZJVElFUyA9IERFU0NSSVBUT1JfX1NVUEVSX0FDVElWSVRJRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hlY2tsaXN0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfREVTQ1JJUFRPUl9fQ0hFQ0tMSVNUUyA9IERFU0NSSVBUT1JfX0NIRUNLTElTVFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29uY2VwdHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX0RFU0NSSVBUT1JfX0NPTkNFUFRTID0gREVTQ1JJUFRPUl9fQ09OQ0VQVFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXhhbXBsZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX0RFU0NSSVBUT1JfX0VYQU1QTEVTID0gREVTQ1JJUFRPUl9fRVhBTVBMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZGVsaW5lczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfREVTQ1JJUFRPUl9fR1VJREVMSU5FUyA9IERFU0NSSVBUT1JfX0dVSURFTElORVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmV1c2FibGUgQXNzZXRzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9ERVNDUklQVE9SX19SRVVTQUJMRV9BU1NFVFMgPSBERVNDUklQVE9SX19SRVVTQUJMRV9BU1NFVFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcG9ydGluZyBNYXRlcmlhbHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX0RFU0NSSVBUT1JfX1NVUFBPUlRJTkdfTUFURVJJQUxTID0gREVTQ1JJUFRPUl9fU1VQUE9SVElOR19NQVRFUklBTFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGVtcGxhdGVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9ERVNDUklQVE9SX19URU1QTEFURVMgPSBERVNDUklQVE9SX19URU1QTEFURVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVwb3J0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfREVTQ1JJUFRPUl9fUkVQT1JUUyA9IERFU0NSSVBUT1JfX1JFUE9SVFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXN0aW1hdGlvbmNvbnNpZGVyYXRpb25zPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9ERVNDUklQVE9SX19FU1RJTUFUSU9OQ09OU0lERVJBVElPTlMgPSBERVNDUklQVE9SX19FU1RJTUFUSU9OQ09OU0lERVJBVElPTlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VG9vbG1lbnRvcjwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfREVTQ1JJUFRPUl9fVE9PTE1FTlRPUiA9IERFU0NSSVBUT1JfX1RPT0xNRU5UT1I7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgU3luY2hyb25pemVkIFdpdGggU291cmNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfREVTQ1JJUFRPUl9fSVNfU1lOQ0hST05JWkVEX1dJVEhfU09VUkNFID0gREVTQ1JJUFRPUl9fSVNfU1lOQ0hST05JWkVEX1dJVEhfU09VUkNFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPnByb2Nlc3MgQ29tcG9uZW50PC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfREVTQ1JJUFRPUl9fUFJPQ0VTU19DT01QT05FTlQgPSBERVNDUklQVE9SX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlByb2Nlc3MgQ29tcG9uZW50IERlc2NyaXB0b3I8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfREVTQ1JJUFRPUl9GRUFUVVJFX0NPVU5UID0gREVTQ1JJUFRPUl9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QQUNLQUdFX19OQU1FID0gTUVUSE9EX1BBQ0tBR0VfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUEFDS0FHRV9fR1VJRCA9IE1FVEhPRF9QQUNLQUdFX19HVUlEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QQUNLQUdFX19QUkVTRU5UQVRJT05fTkFNRSA9IE1FVEhPRF9QQUNLQUdFX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUEFDS0FHRV9fQlJJRUZfREVTQ1JJUFRJT04gPSBNRVRIT0RfUEFDS0FHRV9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUEFDS0FHRV9fT1dORURfUlVMRVMgPSBNRVRIT0RfUEFDS0FHRV9fT1dORURfUlVMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUEFDS0FHRV9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBNRVRIT0RfUEFDS0FHRV9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+S2luZDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QQUNLQUdFX19LSU5EID0gTUVUSE9EX1BBQ0tBR0VfX0tJTkQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUEFDS0FHRV9fU1VQUFJFU1NFRCA9IE1FVEhPRF9QQUNLQUdFX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QQUNLQUdFX19PUkRFUklOR19HVUlERSA9IE1FVEhPRF9QQUNLQUdFX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HbG9iYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BBQ0tBR0VfX0dMT0JBTCA9IE1FVEhPRF9QQUNLQUdFX19HTE9CQUw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmV1c2VkIFBhY2thZ2VzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BBQ0tBR0VfX1JFVVNFRF9QQUNLQUdFUyA9IE1FVEhPRF9QQUNLQUdFX19SRVVTRURfUEFDS0FHRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hpbGQgUGFja2FnZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUEFDS0FHRV9fQ0hJTERfUEFDS0FHRVMgPSBNRVRIT0RfUEFDS0FHRV9fQ0hJTERfUEFDS0FHRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJvY2VzcyBFbGVtZW50czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QQUNLQUdFX19QUk9DRVNTX0VMRU1FTlRTID0gTUVUSE9EX1BBQ0tBR0VfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGlhZ3JhbXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUEFDS0FHRV9fRElBR1JBTVMgPSBNRVRIT0RfUEFDS0FHRV9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Qcm9jZXNzIFBhY2thZ2U8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QQUNLQUdFX0ZFQVRVUkVfQ09VTlQgPSBNRVRIT0RfUEFDS0FHRV9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfX05BTUUgPSBQUk9DRVNTX1BBQ0tBR0VfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX19HVUlEID0gUFJPQ0VTU19QQUNLQUdFX19HVUlEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfX1BSRVNFTlRBVElPTl9OQU1FID0gUFJPQ0VTU19QQUNLQUdFX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX19CUklFRl9ERVNDUklQVElPTiA9IFBST0NFU1NfUEFDS0FHRV9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX19PV05FRF9SVUxFUyA9IFBST0NFU1NfUEFDS0FHRV9fT1dORURfUlVMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IFBST0NFU1NfUEFDS0FHRV9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+S2luZDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfX0tJTkQgPSBQUk9DRVNTX1BBQ0tBR0VfX0tJTkQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX19TVVBQUkVTU0VEID0gUFJPQ0VTU19QQUNLQUdFX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfX09SREVSSU5HX0dVSURFID0gUFJPQ0VTU19QQUNLQUdFX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HbG9iYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9fR0xPQkFMID0gUFJPQ0VTU19QQUNLQUdFX19HTE9CQUw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmV1c2VkIFBhY2thZ2VzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9fUkVVU0VEX1BBQ0tBR0VTID0gUFJPQ0VTU19QQUNLQUdFX19SRVVTRURfUEFDS0FHRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hpbGQgUGFja2FnZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX19DSElMRF9QQUNLQUdFUyA9IFBST0NFU1NfUEFDS0FHRV9fQ0hJTERfUEFDS0FHRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJvY2VzcyBFbGVtZW50czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfX1BST0NFU1NfRUxFTUVOVFMgPSBQUk9DRVNTX1BBQ0tBR0VfX1BST0NFU1NfRUxFTUVOVFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGlhZ3JhbXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX19ESUFHUkFNUyA9IFBST0NFU1NfUEFDS0FHRV9fRElBR1JBTVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXV0aG9yczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX19BVVRIT1JTID0gUFJPQ0VTU19QQUNLQUdFX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoYW5nZSBEYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfX0NIQU5HRV9EQVRFID0gUFJPQ0VTU19QQUNLQUdFX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoYW5nZSBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX19DSEFOR0VfREVTQ1JJUFRJT04gPSBQUk9DRVNTX1BBQ0tBR0VfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmVyc2lvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX19WRVJTSU9OID0gUFJPQ0VTU19QQUNLQUdFX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvcHlyaWdodCBTdGF0ZW1lbnQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9fQ09QWVJJR0hUX1NUQVRFTUVOVCA9IFBST0NFU1NfUEFDS0FHRV9GRUFUVVJFX0NPVU5UICsgNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbnRlcmZhY2VzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9fSU5URVJGQUNFUyA9IFBST0NFU1NfUEFDS0FHRV9GRUFUVVJFX0NPVU5UICsgNTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qcm9jZXNzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfX1BST0NFU1MgPSBQUk9DRVNTX1BBQ0tBR0VfRkVBVFVSRV9DT1VOVCArIDY7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+UHJvY2VzcyBDb21wb25lbnQ8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfRkVBVFVSRV9DT1VOVCA9IFBST0NFU1NfUEFDS0FHRV9GRUFUVVJFX0NPVU5UICsgNzsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlByb2Nlc3NGYW1pbHlJbXBsIDxlbT5Qcm9jZXNzIEZhbWlseTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Qcm9jZXNzRmFtaWx5SW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFByb2Nlc3NGYW1pbHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19GQU1JTFkgPSAxMTE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5NZXRob2RMaWJyYXJ5SW1wbCA8ZW0+TWV0aG9kIExpYnJhcnk8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuTWV0aG9kTGlicmFyeUltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRNZXRob2RMaWJyYXJ5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IE1FVEhPRF9MSUJSQVJZID0gMTEyOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUG9pbnRJbXBsIDxlbT5Qb2ludDwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Qb2ludEltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRQb2ludCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBQT0lOVCA9IDk1OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRGlhZ3JhbUVsZW1lbnRJbXBsIDxlbT5EaWFncmFtIEVsZW1lbnQ8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRGlhZ3JhbUVsZW1lbnRJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0RGlhZ3JhbUVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgRElBR1JBTV9FTEVNRU5UID0gOTI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJQUdSQU1fRUxFTUVOVF9fTkFNRSA9IE1FVEhPRF9FTEVNRU5UX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESUFHUkFNX0VMRU1FTlRfX0dVSUQgPSBNRVRIT0RfRUxFTUVOVF9fR1VJRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJQUdSQU1fRUxFTUVOVF9fUFJFU0VOVEFUSU9OX05BTUUgPSBNRVRIT0RfRUxFTUVOVF9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESUFHUkFNX0VMRU1FTlRfX0JSSUVGX0RFU0NSSVBUSU9OID0gTUVUSE9EX0VMRU1FTlRfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESUFHUkFNX0VMRU1FTlRfX09XTkVEX1JVTEVTID0gTUVUSE9EX0VMRU1FTlRfX09XTkVEX1JVTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESUFHUkFNX0VMRU1FTlRfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gTUVUSE9EX0VMRU1FTlRfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPktpbmQ8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJQUdSQU1fRUxFTUVOVF9fS0lORCA9IE1FVEhPRF9FTEVNRU5UX19LSU5EOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESUFHUkFNX0VMRU1FTlRfX1NVUFBSRVNTRUQgPSBNRVRIT0RfRUxFTUVOVF9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJQUdSQU1fRUxFTUVOVF9fT1JERVJJTkdfR1VJREUgPSBNRVRIT0RfRUxFTUVOVF9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgVmlzaWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJQUdSQU1fRUxFTUVOVF9fSVNfVklTSUJMRSA9IE1FVEhPRF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbnRhaW5lcjwvYj48L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESUFHUkFNX0VMRU1FTlRfX0NPTlRBSU5FUiA9IE1FVEhPRF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlZmVyZW5jZTwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElBR1JBTV9FTEVNRU5UX19SRUZFUkVOQ0UgPSBNRVRIT0RfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElBR1JBTV9FTEVNRU5UX19QUk9QRVJUWSA9IE1FVEhPRF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkRpYWdyYW0gRWxlbWVudDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESUFHUkFNX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCA9IE1FVEhPRF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA0OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuR3JhcGhFbGVtZW50SW1wbCA8ZW0+R3JhcGggRWxlbWVudDwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5HcmFwaEVsZW1lbnRJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0R3JhcGhFbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IEdSQVBIX0VMRU1FTlQgPSA5MTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1JBUEhfRUxFTUVOVF9fTkFNRSA9IERJQUdSQU1fRUxFTUVOVF9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1JBUEhfRUxFTUVOVF9fR1VJRCA9IERJQUdSQU1fRUxFTUVOVF9fR1VJRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdSQVBIX0VMRU1FTlRfX1BSRVNFTlRBVElPTl9OQU1FID0gRElBR1JBTV9FTEVNRU5UX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdSQVBIX0VMRU1FTlRfX0JSSUVGX0RFU0NSSVBUSU9OID0gRElBR1JBTV9FTEVNRU5UX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1JBUEhfRUxFTUVOVF9fT1dORURfUlVMRVMgPSBESUFHUkFNX0VMRU1FTlRfX09XTkVEX1JVTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHUkFQSF9FTEVNRU5UX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IERJQUdSQU1fRUxFTUVOVF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+S2luZDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1JBUEhfRUxFTUVOVF9fS0lORCA9IERJQUdSQU1fRUxFTUVOVF9fS0lORDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1JBUEhfRUxFTUVOVF9fU1VQUFJFU1NFRCA9IERJQUdSQU1fRUxFTUVOVF9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdSQVBIX0VMRU1FTlRfX09SREVSSU5HX0dVSURFID0gRElBR1JBTV9FTEVNRU5UX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBWaXNpYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1JBUEhfRUxFTUVOVF9fSVNfVklTSUJMRSA9IERJQUdSQU1fRUxFTUVOVF9fSVNfVklTSUJMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db250YWluZXI8L2I+PC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1JBUEhfRUxFTUVOVF9fQ09OVEFJTkVSID0gRElBR1JBTV9FTEVNRU5UX19DT05UQUlORVI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVmZXJlbmNlPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHUkFQSF9FTEVNRU5UX19SRUZFUkVOQ0UgPSBESUFHUkFNX0VMRU1FTlRfX1JFRkVSRU5DRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1JBUEhfRUxFTUVOVF9fUFJPUEVSVFkgPSBESUFHUkFNX0VMRU1FTlRfX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbnRhaW5lZDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1JBUEhfRUxFTUVOVF9fQ09OVEFJTkVEID0gRElBR1JBTV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBvc2l0aW9uPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1JBUEhfRUxFTUVOVF9fUE9TSVRJT04gPSBESUFHUkFNX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TGluazwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1JBUEhfRUxFTUVOVF9fTElOSyA9IERJQUdSQU1fRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BbmNob3JhZ2U8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdSQVBIX0VMRU1FTlRfX0FOQ0hPUkFHRSA9IERJQUdSQU1fRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TZW1hbnRpYyBNb2RlbDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdSQVBIX0VMRU1FTlRfX1NFTUFOVElDX01PREVMID0gRElBR1JBTV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA0OwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkdyYXBoIEVsZW1lbnQ8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1JBUEhfRUxFTUVOVF9GRUFUVVJFX0NPVU5UID0gRElBR1JBTV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA1OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRGlhZ3JhbUxpbmtJbXBsIDxlbT5EaWFncmFtIExpbms8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRGlhZ3JhbUxpbmtJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0RGlhZ3JhbUxpbmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgRElBR1JBTV9MSU5LID0gOTY7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5HcmFwaENvbm5lY3RvckltcGwgPGVtPkdyYXBoIENvbm5lY3RvcjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5HcmFwaENvbm5lY3RvckltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRHcmFwaENvbm5lY3RvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBHUkFQSF9DT05ORUNUT1IgPSA5NzsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlNlbWFudGljTW9kZWxCcmlkZ2VJbXBsIDxlbT5TZW1hbnRpYyBNb2RlbCBCcmlkZ2U8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuU2VtYW50aWNNb2RlbEJyaWRnZUltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRTZW1hbnRpY01vZGVsQnJpZGdlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFNFTUFOVElDX01PREVMX0JSSURHRSA9IDk5OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRGltZW5zaW9uSW1wbCA8ZW0+RGltZW5zaW9uPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkRpbWVuc2lvbkltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXREaW1lbnNpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgRElNRU5TSU9OID0gMTAwOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUmVmZXJlbmNlSW1wbCA8ZW0+UmVmZXJlbmNlPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlJlZmVyZW5jZUltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRSZWZlcmVuY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgUkVGRVJFTkNFID0gOTM7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Qcm9wZXJ0eUltcGwgPGVtPlByb3BlcnR5PC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlByb3BlcnR5SW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFByb3BlcnR5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFBST1BFUlRZID0gOTQ7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5HcmFwaEVkZ2VJbXBsIDxlbT5HcmFwaCBFZGdlPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkdyYXBoRWRnZUltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRHcmFwaEVkZ2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgR1JBUEhfRURHRSA9IDk4OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuR3JhcGhOb2RlSW1wbCA8ZW0+R3JhcGggTm9kZTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5HcmFwaE5vZGVJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0R3JhcGhOb2RlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IEdSQVBIX05PREUgPSA5MDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1JBUEhfTk9ERV9fTkFNRSA9IEdSQVBIX0VMRU1FTlRfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdSQVBIX05PREVfX0dVSUQgPSBHUkFQSF9FTEVNRU5UX19HVUlEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1JBUEhfTk9ERV9fUFJFU0VOVEFUSU9OX05BTUUgPSBHUkFQSF9FTEVNRU5UX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdSQVBIX05PREVfX0JSSUVGX0RFU0NSSVBUSU9OID0gR1JBUEhfRUxFTUVOVF9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdSQVBIX05PREVfX09XTkVEX1JVTEVTID0gR1JBUEhfRUxFTUVOVF9fT1dORURfUlVMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdSQVBIX05PREVfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gR1JBUEhfRUxFTUVOVF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+S2luZDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1JBUEhfTk9ERV9fS0lORCA9IEdSQVBIX0VMRU1FTlRfX0tJTkQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdSQVBIX05PREVfX1NVUFBSRVNTRUQgPSBHUkFQSF9FTEVNRU5UX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1JBUEhfTk9ERV9fT1JERVJJTkdfR1VJREUgPSBHUkFQSF9FTEVNRU5UX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBWaXNpYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1JBUEhfTk9ERV9fSVNfVklTSUJMRSA9IEdSQVBIX0VMRU1FTlRfX0lTX1ZJU0lCTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29udGFpbmVyPC9iPjwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdSQVBIX05PREVfX0NPTlRBSU5FUiA9IEdSQVBIX0VMRU1FTlRfX0NPTlRBSU5FUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZWZlcmVuY2U8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdSQVBIX05PREVfX1JFRkVSRU5DRSA9IEdSQVBIX0VMRU1FTlRfX1JFRkVSRU5DRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1JBUEhfTk9ERV9fUFJPUEVSVFkgPSBHUkFQSF9FTEVNRU5UX19QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db250YWluZWQ8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdSQVBIX05PREVfX0NPTlRBSU5FRCA9IEdSQVBIX0VMRU1FTlRfX0NPTlRBSU5FRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qb3NpdGlvbjwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdSQVBIX05PREVfX1BPU0lUSU9OID0gR1JBUEhfRUxFTUVOVF9fUE9TSVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TGluazwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1JBUEhfTk9ERV9fTElOSyA9IEdSQVBIX0VMRU1FTlRfX0xJTks7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QW5jaG9yYWdlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHUkFQSF9OT0RFX19BTkNIT1JBR0UgPSBHUkFQSF9FTEVNRU5UX19BTkNIT1JBR0U7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2VtYW50aWMgTW9kZWw8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHUkFQSF9OT0RFX19TRU1BTlRJQ19NT0RFTCA9IEdSQVBIX0VMRU1FTlRfX1NFTUFOVElDX01PREVMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNpemU8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHUkFQSF9OT0RFX19TSVpFID0gR1JBUEhfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5HcmFwaCBOb2RlPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdSQVBIX05PREVfRkVBVFVSRV9DT1VOVCA9IEdSQVBIX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5EaWFncmFtSW1wbCA8ZW0+RGlhZ3JhbTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5EaWFncmFtSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldERpYWdyYW0oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgRElBR1JBTSA9IDg5OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESUFHUkFNX19OQU1FID0gR1JBUEhfTk9ERV9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElBR1JBTV9fR1VJRCA9IEdSQVBIX05PREVfX0dVSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESUFHUkFNX19QUkVTRU5UQVRJT05fTkFNRSA9IEdSQVBIX05PREVfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElBR1JBTV9fQlJJRUZfREVTQ1JJUFRJT04gPSBHUkFQSF9OT0RFX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElBR1JBTV9fT1dORURfUlVMRVMgPSBHUkFQSF9OT0RFX19PV05FRF9SVUxFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElBR1JBTV9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBHUkFQSF9OT0RFX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5LaW5kPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESUFHUkFNX19LSU5EID0gR1JBUEhfTk9ERV9fS0lORDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElBR1JBTV9fU1VQUFJFU1NFRCA9IEdSQVBIX05PREVfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESUFHUkFNX19PUkRFUklOR19HVUlERSA9IEdSQVBIX05PREVfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIFZpc2libGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESUFHUkFNX19JU19WSVNJQkxFID0gR1JBUEhfTk9ERV9fSVNfVklTSUJMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db250YWluZXI8L2I+PC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElBR1JBTV9fQ09OVEFJTkVSID0gR1JBUEhfTk9ERV9fQ09OVEFJTkVSOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlZmVyZW5jZTwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElBR1JBTV9fUkVGRVJFTkNFID0gR1JBUEhfTk9ERV9fUkVGRVJFTkNFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESUFHUkFNX19QUk9QRVJUWSA9IEdSQVBIX05PREVfX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbnRhaW5lZDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElBR1JBTV9fQ09OVEFJTkVEID0gR1JBUEhfTk9ERV9fQ09OVEFJTkVEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBvc2l0aW9uPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElBR1JBTV9fUE9TSVRJT04gPSBHUkFQSF9OT0RFX19QT1NJVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5MaW5rPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESUFHUkFNX19MSU5LID0gR1JBUEhfTk9ERV9fTElOSzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BbmNob3JhZ2U8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJQUdSQU1fX0FOQ0hPUkFHRSA9IEdSQVBIX05PREVfX0FOQ0hPUkFHRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TZW1hbnRpYyBNb2RlbDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJQUdSQU1fX1NFTUFOVElDX01PREVMID0gR1JBUEhfTk9ERV9fU0VNQU5USUNfTU9ERUw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2l6ZTwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJQUdSQU1fX1NJWkUgPSBHUkFQSF9OT0RFX19TSVpFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRpYWdyYW0gTGluazwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElBR1JBTV9fRElBR1JBTV9MSU5LID0gR1JBUEhfTk9ERV9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lc3BhY2U8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESUFHUkFNX19OQU1FU1BBQ0UgPSBHUkFQSF9OT0RFX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlpvb208L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESUFHUkFNX19aT09NID0gR1JBUEhfTk9ERV9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WaWV3cG9pbnQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESUFHUkFNX19WSUVXUE9JTlQgPSBHUkFQSF9OT0RFX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkRpYWdyYW08L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElBR1JBTV9GRUFUVVJFX0NPVU5UID0gR1JBUEhfTk9ERV9GRUFUVVJFX0NPVU5UICsgNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVGRVJFTkNFX19OQU1FID0gRElBR1JBTV9FTEVNRU5UX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRUZFUkVOQ0VfX0dVSUQgPSBESUFHUkFNX0VMRU1FTlRfX0dVSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRUZFUkVOQ0VfX1BSRVNFTlRBVElPTl9OQU1FID0gRElBR1JBTV9FTEVNRU5UX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFRkVSRU5DRV9fQlJJRUZfREVTQ1JJUFRJT04gPSBESUFHUkFNX0VMRU1FTlRfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRUZFUkVOQ0VfX09XTkVEX1JVTEVTID0gRElBR1JBTV9FTEVNRU5UX19PV05FRF9SVUxFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVGRVJFTkNFX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IERJQUdSQU1fRUxFTUVOVF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+S2luZDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVGRVJFTkNFX19LSU5EID0gRElBR1JBTV9FTEVNRU5UX19LSU5EOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRUZFUkVOQ0VfX1NVUFBSRVNTRUQgPSBESUFHUkFNX0VMRU1FTlRfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRUZFUkVOQ0VfX09SREVSSU5HX0dVSURFID0gRElBR1JBTV9FTEVNRU5UX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBWaXNpYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVGRVJFTkNFX19JU19WSVNJQkxFID0gRElBR1JBTV9FTEVNRU5UX19JU19WSVNJQkxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbnRhaW5lcjwvYj48L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRUZFUkVOQ0VfX0NPTlRBSU5FUiA9IERJQUdSQU1fRUxFTUVOVF9fQ09OVEFJTkVSOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlZmVyZW5jZTwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVGRVJFTkNFX19SRUZFUkVOQ0UgPSBESUFHUkFNX0VMRU1FTlRfX1JFRkVSRU5DRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVGRVJFTkNFX19QUk9QRVJUWSA9IERJQUdSQU1fRUxFTUVOVF9fUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgSW5kaXZpZHVhbCBSZXByZXNlbnRhdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFRkVSRU5DRV9fSVNfSU5ESVZJRFVBTF9SRVBSRVNFTlRBVElPTiA9IERJQUdSQU1fRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZWZlcmVuY2VkPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVGRVJFTkNFX19SRUZFUkVOQ0VEID0gRElBR1JBTV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlJlZmVyZW5jZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRUZFUkVOQ0VfRkVBVFVSRV9DT1VOVCA9IERJQUdSQU1fRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPUEVSVFlfX05BTUUgPSBESUFHUkFNX0VMRU1FTlRfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST1BFUlRZX19HVUlEID0gRElBR1JBTV9FTEVNRU5UX19HVUlEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPUEVSVFlfX1BSRVNFTlRBVElPTl9OQU1FID0gRElBR1JBTV9FTEVNRU5UX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST1BFUlRZX19CUklFRl9ERVNDUklQVElPTiA9IERJQUdSQU1fRUxFTUVOVF9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST1BFUlRZX19PV05FRF9SVUxFUyA9IERJQUdSQU1fRUxFTUVOVF9fT1dORURfUlVMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST1BFUlRZX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IERJQUdSQU1fRUxFTUVOVF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+S2luZDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPUEVSVFlfX0tJTkQgPSBESUFHUkFNX0VMRU1FTlRfX0tJTkQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST1BFUlRZX19TVVBQUkVTU0VEID0gRElBR1JBTV9FTEVNRU5UX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPUEVSVFlfX09SREVSSU5HX0dVSURFID0gRElBR1JBTV9FTEVNRU5UX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBWaXNpYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPUEVSVFlfX0lTX1ZJU0lCTEUgPSBESUFHUkFNX0VMRU1FTlRfX0lTX1ZJU0lCTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29udGFpbmVyPC9iPjwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST1BFUlRZX19DT05UQUlORVIgPSBESUFHUkFNX0VMRU1FTlRfX0NPTlRBSU5FUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZWZlcmVuY2U8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST1BFUlRZX19SRUZFUkVOQ0UgPSBESUFHUkFNX0VMRU1FTlRfX1JFRkVSRU5DRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPUEVSVFlfX1BST1BFUlRZID0gRElBR1JBTV9FTEVNRU5UX19QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5LZXk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9QRVJUWV9fS0VZID0gRElBR1JBTV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPUEVSVFlfX1ZBTFVFID0gRElBR1JBTV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlByb3BlcnR5PC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST1BFUlRZX0ZFQVRVUkVfQ09VTlQgPSBESUFHUkFNX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+WDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBPSU5UX19YID0gMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5ZPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUE9JTlRfX1kgPSAxOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlBvaW50PC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBPSU5UX0ZFQVRVUkVfQ09VTlQgPSAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESUFHUkFNX0xJTktfX05BTUUgPSBESUFHUkFNX0VMRU1FTlRfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJQUdSQU1fTElOS19fR1VJRCA9IERJQUdSQU1fRUxFTUVOVF9fR1VJRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJQUdSQU1fTElOS19fUFJFU0VOVEFUSU9OX05BTUUgPSBESUFHUkFNX0VMRU1FTlRfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElBR1JBTV9MSU5LX19CUklFRl9ERVNDUklQVElPTiA9IERJQUdSQU1fRUxFTUVOVF9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJQUdSQU1fTElOS19fT1dORURfUlVMRVMgPSBESUFHUkFNX0VMRU1FTlRfX09XTkVEX1JVTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESUFHUkFNX0xJTktfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gRElBR1JBTV9FTEVNRU5UX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5LaW5kPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESUFHUkFNX0xJTktfX0tJTkQgPSBESUFHUkFNX0VMRU1FTlRfX0tJTkQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJQUdSQU1fTElOS19fU1VQUFJFU1NFRCA9IERJQUdSQU1fRUxFTUVOVF9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJQUdSQU1fTElOS19fT1JERVJJTkdfR1VJREUgPSBESUFHUkFNX0VMRU1FTlRfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIFZpc2libGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESUFHUkFNX0xJTktfX0lTX1ZJU0lCTEUgPSBESUFHUkFNX0VMRU1FTlRfX0lTX1ZJU0lCTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29udGFpbmVyPC9iPjwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJQUdSQU1fTElOS19fQ09OVEFJTkVSID0gRElBR1JBTV9FTEVNRU5UX19DT05UQUlORVI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVmZXJlbmNlPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESUFHUkFNX0xJTktfX1JFRkVSRU5DRSA9IERJQUdSQU1fRUxFTUVOVF9fUkVGRVJFTkNFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESUFHUkFNX0xJTktfX1BST1BFUlRZID0gRElBR1JBTV9FTEVNRU5UX19QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5ab29tPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElBR1JBTV9MSU5LX19aT09NID0gRElBR1JBTV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZpZXdwb3J0PC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElBR1JBTV9MSU5LX19WSUVXUE9SVCA9IERJQUdSQU1fRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EaWFncmFtPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElBR1JBTV9MSU5LX19ESUFHUkFNID0gRElBR1JBTV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyYXBoIEVsZW1lbnQ8L2I+PC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElBR1JBTV9MSU5LX19HUkFQSF9FTEVNRU5UID0gRElBR1JBTV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkRpYWdyYW0gTGluazwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESUFHUkFNX0xJTktfRkVBVFVSRV9DT1VOVCA9IERJQUdSQU1fRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1JBUEhfQ09OTkVDVE9SX19OQU1FID0gR1JBUEhfRUxFTUVOVF9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1JBUEhfQ09OTkVDVE9SX19HVUlEID0gR1JBUEhfRUxFTUVOVF9fR1VJRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdSQVBIX0NPTk5FQ1RPUl9fUFJFU0VOVEFUSU9OX05BTUUgPSBHUkFQSF9FTEVNRU5UX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdSQVBIX0NPTk5FQ1RPUl9fQlJJRUZfREVTQ1JJUFRJT04gPSBHUkFQSF9FTEVNRU5UX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1JBUEhfQ09OTkVDVE9SX19PV05FRF9SVUxFUyA9IEdSQVBIX0VMRU1FTlRfX09XTkVEX1JVTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHUkFQSF9DT05ORUNUT1JfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gR1JBUEhfRUxFTUVOVF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+S2luZDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1JBUEhfQ09OTkVDVE9SX19LSU5EID0gR1JBUEhfRUxFTUVOVF9fS0lORDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1JBUEhfQ09OTkVDVE9SX19TVVBQUkVTU0VEID0gR1JBUEhfRUxFTUVOVF9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdSQVBIX0NPTk5FQ1RPUl9fT1JERVJJTkdfR1VJREUgPSBHUkFQSF9FTEVNRU5UX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBWaXNpYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1JBUEhfQ09OTkVDVE9SX19JU19WSVNJQkxFID0gR1JBUEhfRUxFTUVOVF9fSVNfVklTSUJMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db250YWluZXI8L2I+PC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1JBUEhfQ09OTkVDVE9SX19DT05UQUlORVIgPSBHUkFQSF9FTEVNRU5UX19DT05UQUlORVI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVmZXJlbmNlPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHUkFQSF9DT05ORUNUT1JfX1JFRkVSRU5DRSA9IEdSQVBIX0VMRU1FTlRfX1JFRkVSRU5DRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1JBUEhfQ09OTkVDVE9SX19QUk9QRVJUWSA9IEdSQVBIX0VMRU1FTlRfX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbnRhaW5lZDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1JBUEhfQ09OTkVDVE9SX19DT05UQUlORUQgPSBHUkFQSF9FTEVNRU5UX19DT05UQUlORUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UG9zaXRpb248L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHUkFQSF9DT05ORUNUT1JfX1BPU0lUSU9OID0gR1JBUEhfRUxFTUVOVF9fUE9TSVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TGluazwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1JBUEhfQ09OTkVDVE9SX19MSU5LID0gR1JBUEhfRUxFTUVOVF9fTElOSzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BbmNob3JhZ2U8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdSQVBIX0NPTk5FQ1RPUl9fQU5DSE9SQUdFID0gR1JBUEhfRUxFTUVOVF9fQU5DSE9SQUdFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNlbWFudGljIE1vZGVsPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1JBUEhfQ09OTkVDVE9SX19TRU1BTlRJQ19NT0RFTCA9IEdSQVBIX0VMRU1FTlRfX1NFTUFOVElDX01PREVMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyYXBoIEVkZ2U8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdSQVBIX0NPTk5FQ1RPUl9fR1JBUEhfRURHRSA9IEdSQVBIX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JhcGggRWxlbWVudDwvYj48L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHUkFQSF9DT05ORUNUT1JfX0dSQVBIX0VMRU1FTlQgPSBHUkFQSF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkdyYXBoIENvbm5lY3RvcjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHUkFQSF9DT05ORUNUT1JfRkVBVFVSRV9DT1VOVCA9IEdSQVBIX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdSQVBIX0VER0VfX05BTUUgPSBHUkFQSF9FTEVNRU5UX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHUkFQSF9FREdFX19HVUlEID0gR1JBUEhfRUxFTUVOVF9fR1VJRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdSQVBIX0VER0VfX1BSRVNFTlRBVElPTl9OQU1FID0gR1JBUEhfRUxFTUVOVF9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHUkFQSF9FREdFX19CUklFRl9ERVNDUklQVElPTiA9IEdSQVBIX0VMRU1FTlRfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHUkFQSF9FREdFX19PV05FRF9SVUxFUyA9IEdSQVBIX0VMRU1FTlRfX09XTkVEX1JVTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHUkFQSF9FREdFX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IEdSQVBIX0VMRU1FTlRfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPktpbmQ8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdSQVBIX0VER0VfX0tJTkQgPSBHUkFQSF9FTEVNRU5UX19LSU5EOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHUkFQSF9FREdFX19TVVBQUkVTU0VEID0gR1JBUEhfRUxFTUVOVF9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdSQVBIX0VER0VfX09SREVSSU5HX0dVSURFID0gR1JBUEhfRUxFTUVOVF9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgVmlzaWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdSQVBIX0VER0VfX0lTX1ZJU0lCTEUgPSBHUkFQSF9FTEVNRU5UX19JU19WSVNJQkxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbnRhaW5lcjwvYj48L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHUkFQSF9FREdFX19DT05UQUlORVIgPSBHUkFQSF9FTEVNRU5UX19DT05UQUlORVI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVmZXJlbmNlPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHUkFQSF9FREdFX19SRUZFUkVOQ0UgPSBHUkFQSF9FTEVNRU5UX19SRUZFUkVOQ0U7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdSQVBIX0VER0VfX1BST1BFUlRZID0gR1JBUEhfRUxFTUVOVF9fUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29udGFpbmVkPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHUkFQSF9FREdFX19DT05UQUlORUQgPSBHUkFQSF9FTEVNRU5UX19DT05UQUlORUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UG9zaXRpb248L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHUkFQSF9FREdFX19QT1NJVElPTiA9IEdSQVBIX0VMRU1FTlRfX1BPU0lUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxpbms8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdSQVBIX0VER0VfX0xJTksgPSBHUkFQSF9FTEVNRU5UX19MSU5LOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFuY2hvcmFnZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1JBUEhfRURHRV9fQU5DSE9SQUdFID0gR1JBUEhfRUxFTUVOVF9fQU5DSE9SQUdFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNlbWFudGljIE1vZGVsPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1JBUEhfRURHRV9fU0VNQU5USUNfTU9ERUwgPSBHUkFQSF9FTEVNRU5UX19TRU1BTlRJQ19NT0RFTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5XYXlwb2ludHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdSQVBIX0VER0VfX1dBWVBPSU5UUyA9IEdSQVBIX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QW5jaG9yPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHUkFQSF9FREdFX19BTkNIT1IgPSBHUkFQSF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkdyYXBoIEVkZ2U8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1JBUEhfRURHRV9GRUFUVVJFX0NPVU5UID0gR1JBUEhfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0VNQU5USUNfTU9ERUxfQlJJREdFX19OQU1FID0gRElBR1JBTV9FTEVNRU5UX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTRU1BTlRJQ19NT0RFTF9CUklER0VfX0dVSUQgPSBESUFHUkFNX0VMRU1FTlRfX0dVSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTRU1BTlRJQ19NT0RFTF9CUklER0VfX1BSRVNFTlRBVElPTl9OQU1FID0gRElBR1JBTV9FTEVNRU5UX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNFTUFOVElDX01PREVMX0JSSURHRV9fQlJJRUZfREVTQ1JJUFRJT04gPSBESUFHUkFNX0VMRU1FTlRfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTRU1BTlRJQ19NT0RFTF9CUklER0VfX09XTkVEX1JVTEVTID0gRElBR1JBTV9FTEVNRU5UX19PV05FRF9SVUxFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0VNQU5USUNfTU9ERUxfQlJJREdFX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IERJQUdSQU1fRUxFTUVOVF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+S2luZDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0VNQU5USUNfTU9ERUxfQlJJREdFX19LSU5EID0gRElBR1JBTV9FTEVNRU5UX19LSU5EOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTRU1BTlRJQ19NT0RFTF9CUklER0VfX1NVUFBSRVNTRUQgPSBESUFHUkFNX0VMRU1FTlRfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTRU1BTlRJQ19NT0RFTF9CUklER0VfX09SREVSSU5HX0dVSURFID0gRElBR1JBTV9FTEVNRU5UX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBWaXNpYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0VNQU5USUNfTU9ERUxfQlJJREdFX19JU19WSVNJQkxFID0gRElBR1JBTV9FTEVNRU5UX19JU19WSVNJQkxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbnRhaW5lcjwvYj48L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTRU1BTlRJQ19NT0RFTF9CUklER0VfX0NPTlRBSU5FUiA9IERJQUdSQU1fRUxFTUVOVF9fQ09OVEFJTkVSOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlZmVyZW5jZTwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0VNQU5USUNfTU9ERUxfQlJJREdFX19SRUZFUkVOQ0UgPSBESUFHUkFNX0VMRU1FTlRfX1JFRkVSRU5DRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0VNQU5USUNfTU9ERUxfQlJJREdFX19QUk9QRVJUWSA9IERJQUdSQU1fRUxFTUVOVF9fUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0VNQU5USUNfTU9ERUxfQlJJREdFX19QUkVTRU5UQVRJT04gPSBESUFHUkFNX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGlhZ3JhbTwvYj48L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTRU1BTlRJQ19NT0RFTF9CUklER0VfX0RJQUdSQU0gPSBESUFHUkFNX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JhcGggRWxlbWVudDwvYj48L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTRU1BTlRJQ19NT0RFTF9CUklER0VfX0dSQVBIX0VMRU1FTlQgPSBESUFHUkFNX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+U2VtYW50aWMgTW9kZWwgQnJpZGdlPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNFTUFOVElDX01PREVMX0JSSURHRV9GRUFUVVJFX0NPVU5UID0gRElBR1JBTV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldpZHRoPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElNRU5TSU9OX19XSURUSCA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SGVpZ2h0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElNRU5TSU9OX19IRUlHSFQgPSAxOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkRpbWVuc2lvbjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESU1FTlNJT05fRkVBVFVSRV9DT1VOVCA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRV9fTkFNRSA9IEJSRUFLRE9XTl9FTEVNRU5UX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfX0dVSUQgPSBCUkVBS0RPV05fRUxFTUVOVF9fR1VJRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRV9fUFJFU0VOVEFUSU9OX05BTUUgPSBCUkVBS0RPV05fRUxFTUVOVF9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfX0JSSUVGX0RFU0NSSVBUSU9OID0gQlJFQUtET1dOX0VMRU1FTlRfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfX09XTkVEX1JVTEVTID0gQlJFQUtET1dOX0VMRU1FTlRfX09XTkVEX1JVTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gQlJFQUtET1dOX0VMRU1FTlRfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPktpbmQ8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRV9fS0lORCA9IEJSRUFLRE9XTl9FTEVNRU5UX19LSU5EOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfX1NVUFBSRVNTRUQgPSBCUkVBS0RPV05fRUxFTUVOVF9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRV9fT1JERVJJTkdfR1VJREUgPSBCUkVBS0RPV05fRUxFTUVOVF9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgQWJzdHJhY3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfX0lTX0FCU1RSQUNUID0gQlJFQUtET1dOX0VMRU1FTlRfX0lTX0FCU1RSQUNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRV9fUFJFU0VOVEFUSU9OID0gQlJFQUtET1dOX0VMRU1FTlRfX1BSRVNFTlRBVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TaGFwZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfX1NIQVBFSUNPTiA9IEJSRUFLRE9XTl9FTEVNRU5UX19TSEFQRUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm9kZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfX05PREVJQ09OID0gQlJFQUtET1dOX0VMRU1FTlRfX05PREVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZWZpeDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRV9fUFJFRklYID0gQlJFQUtET1dOX0VMRU1FTlRfX1BSRUZJWDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBQbGFubmVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfSU5URVJGQUNFX19JU19QTEFOTkVEID0gQlJFQUtET1dOX0VMRU1FTlRfX0lTX1BMQU5ORUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SGFzIE11bHRpcGxlIE9jY3VycmVuY2VzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfSU5URVJGQUNFX19IQVNfTVVMVElQTEVfT0NDVVJSRU5DRVMgPSBCUkVBS0RPV05fRUxFTUVOVF9fSEFTX01VTFRJUExFX09DQ1VSUkVOQ0VTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIE9wdGlvbmFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfSU5URVJGQUNFX19JU19PUFRJT05BTCA9IEJSRUFLRE9XTl9FTEVNRU5UX19JU19PUFRJT05BTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50ZWQgQWZ0ZXI8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfX1BSRVNFTlRFRF9BRlRFUiA9IEJSRUFLRE9XTl9FTEVNRU5UX19QUkVTRU5URURfQUZURVI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGVkIEJlZm9yZTwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRV9fUFJFU0VOVEVEX0JFRk9SRSA9IEJSRUFLRE9XTl9FTEVNRU5UX19QUkVTRU5URURfQkVGT1JFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBsYW5uaW5nIERhdGE8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfX1BMQU5OSU5HX0RBVEEgPSBCUkVBS0RPV05fRUxFTUVOVF9fUExBTk5JTkdfREFUQTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBlciBBY3Rpdml0aWVzPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfSU5URVJGQUNFX19TVVBFUl9BQ1RJVklUSUVTID0gQlJFQUtET1dOX0VMRU1FTlRfX1NVUEVSX0FDVElWSVRJRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hlY2tsaXN0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfSU5URVJGQUNFX19DSEVDS0xJU1RTID0gQlJFQUtET1dOX0VMRU1FTlRfX0NIRUNLTElTVFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29uY2VwdHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRV9fQ09OQ0VQVFMgPSBCUkVBS0RPV05fRUxFTUVOVF9fQ09OQ0VQVFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXhhbXBsZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRV9fRVhBTVBMRVMgPSBCUkVBS0RPV05fRUxFTUVOVF9fRVhBTVBMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZGVsaW5lczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfSU5URVJGQUNFX19HVUlERUxJTkVTID0gQlJFQUtET1dOX0VMRU1FTlRfX0dVSURFTElORVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmV1c2FibGUgQXNzZXRzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfX1JFVVNBQkxFX0FTU0VUUyA9IEJSRUFLRE9XTl9FTEVNRU5UX19SRVVTQUJMRV9BU1NFVFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcG9ydGluZyBNYXRlcmlhbHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRV9fU1VQUE9SVElOR19NQVRFUklBTFMgPSBCUkVBS0RPV05fRUxFTUVOVF9fU1VQUE9SVElOR19NQVRFUklBTFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGVtcGxhdGVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfX1RFTVBMQVRFUyA9IEJSRUFLRE9XTl9FTEVNRU5UX19URU1QTEFURVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVwb3J0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfSU5URVJGQUNFX19SRVBPUlRTID0gQlJFQUtET1dOX0VMRU1FTlRfX1JFUE9SVFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXN0aW1hdGlvbmNvbnNpZGVyYXRpb25zPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfX0VTVElNQVRJT05DT05TSURFUkFUSU9OUyA9IEJSRUFLRE9XTl9FTEVNRU5UX19FU1RJTUFUSU9OQ09OU0lERVJBVElPTlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VG9vbG1lbnRvcjwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfSU5URVJGQUNFX19UT09MTUVOVE9SID0gQlJFQUtET1dOX0VMRU1FTlRfX1RPT0xNRU5UT1I7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW50ZXJmYWNlIFNwZWNpZmljYXRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfX0lOVEVSRkFDRV9TUEVDSUZJQ0FUSU9OUyA9IEJSRUFLRE9XTl9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkludGVyZmFjZSBJTzwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfSU5URVJGQUNFX19JTlRFUkZBQ0VfSU8gPSBCUkVBS0RPV05fRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Qcm9jZXNzIENvbXBvbmVudCBJbnRlcmZhY2U8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfSU5URVJGQUNFX0ZFQVRVUkVfQ09VTlQgPSBCUkVBS0RPV05fRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlNpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50SW1wbCA8ZW0+U2ltcGxlIFNlbWFudGljIE1vZGVsIEVsZW1lbnQ8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnRJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0U2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgU0lNUExFX1NFTUFOVElDX01PREVMX0VMRU1FTlQgPSAxMDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNJTVBMRV9TRU1BTlRJQ19NT0RFTF9FTEVNRU5UX19OQU1FID0gU0VNQU5USUNfTU9ERUxfQlJJREdFX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTSU1QTEVfU0VNQU5USUNfTU9ERUxfRUxFTUVOVF9fR1VJRCA9IFNFTUFOVElDX01PREVMX0JSSURHRV9fR1VJRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNJTVBMRV9TRU1BTlRJQ19NT0RFTF9FTEVNRU5UX19QUkVTRU5UQVRJT05fTkFNRSA9IFNFTUFOVElDX01PREVMX0JSSURHRV9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTSU1QTEVfU0VNQU5USUNfTU9ERUxfRUxFTUVOVF9fQlJJRUZfREVTQ1JJUFRJT04gPSBTRU1BTlRJQ19NT0RFTF9CUklER0VfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTSU1QTEVfU0VNQU5USUNfTU9ERUxfRUxFTUVOVF9fT1dORURfUlVMRVMgPSBTRU1BTlRJQ19NT0RFTF9CUklER0VfX09XTkVEX1JVTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTSU1QTEVfU0VNQU5USUNfTU9ERUxfRUxFTUVOVF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBTRU1BTlRJQ19NT0RFTF9CUklER0VfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPktpbmQ8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNJTVBMRV9TRU1BTlRJQ19NT0RFTF9FTEVNRU5UX19LSU5EID0gU0VNQU5USUNfTU9ERUxfQlJJREdFX19LSU5EOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTSU1QTEVfU0VNQU5USUNfTU9ERUxfRUxFTUVOVF9fU1VQUFJFU1NFRCA9IFNFTUFOVElDX01PREVMX0JSSURHRV9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNJTVBMRV9TRU1BTlRJQ19NT0RFTF9FTEVNRU5UX19PUkRFUklOR19HVUlERSA9IFNFTUFOVElDX01PREVMX0JSSURHRV9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgVmlzaWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNJTVBMRV9TRU1BTlRJQ19NT0RFTF9FTEVNRU5UX19JU19WSVNJQkxFID0gU0VNQU5USUNfTU9ERUxfQlJJREdFX19JU19WSVNJQkxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbnRhaW5lcjwvYj48L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTSU1QTEVfU0VNQU5USUNfTU9ERUxfRUxFTUVOVF9fQ09OVEFJTkVSID0gU0VNQU5USUNfTU9ERUxfQlJJREdFX19DT05UQUlORVI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVmZXJlbmNlPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTSU1QTEVfU0VNQU5USUNfTU9ERUxfRUxFTUVOVF9fUkVGRVJFTkNFID0gU0VNQU5USUNfTU9ERUxfQlJJREdFX19SRUZFUkVOQ0U7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNJTVBMRV9TRU1BTlRJQ19NT0RFTF9FTEVNRU5UX19QUk9QRVJUWSA9IFNFTUFOVElDX01PREVMX0JSSURHRV9fUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0lNUExFX1NFTUFOVElDX01PREVMX0VMRU1FTlRfX1BSRVNFTlRBVElPTiA9IFNFTUFOVElDX01PREVMX0JSSURHRV9fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRpYWdyYW08L2I+PC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0lNUExFX1NFTUFOVElDX01PREVMX0VMRU1FTlRfX0RJQUdSQU0gPSBTRU1BTlRJQ19NT0RFTF9CUklER0VfX0RJQUdSQU07Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JhcGggRWxlbWVudDwvYj48L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTSU1QTEVfU0VNQU5USUNfTU9ERUxfRUxFTUVOVF9fR1JBUEhfRUxFTUVOVCA9IFNFTUFOVElDX01PREVMX0JSSURHRV9fR1JBUEhfRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UeXBlIEluZm88L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTSU1QTEVfU0VNQU5USUNfTU9ERUxfRUxFTUVOVF9fVFlQRV9JTkZPID0gU0VNQU5USUNfTU9ERUxfQlJJREdFX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlNpbXBsZSBTZW1hbnRpYyBNb2RlbCBFbGVtZW50PC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNJTVBMRV9TRU1BTlRJQ19NT0RFTF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgPSBTRU1BTlRJQ19NT0RFTF9CUklER0VfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VTUFTZW1hbnRpY01vZGVsQnJpZGdlSW1wbCA8ZW0+VU1BIFNlbWFudGljIE1vZGVsIEJyaWRnZTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VTUFTZW1hbnRpY01vZGVsQnJpZGdlSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFVNQVNlbWFudGljTW9kZWxCcmlkZ2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgVU1BX1NFTUFOVElDX01PREVMX0JSSURHRSA9IDEwMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVU1BX1NFTUFOVElDX01PREVMX0JSSURHRV9fTkFNRSA9IFNFTUFOVElDX01PREVMX0JSSURHRV9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVU1BX1NFTUFOVElDX01PREVMX0JSSURHRV9fR1VJRCA9IFNFTUFOVElDX01PREVMX0JSSURHRV9fR1VJRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFVNQV9TRU1BTlRJQ19NT0RFTF9CUklER0VfX1BSRVNFTlRBVElPTl9OQU1FID0gU0VNQU5USUNfTU9ERUxfQlJJREdFX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFVNQV9TRU1BTlRJQ19NT0RFTF9CUklER0VfX0JSSUVGX0RFU0NSSVBUSU9OID0gU0VNQU5USUNfTU9ERUxfQlJJREdFX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVU1BX1NFTUFOVElDX01PREVMX0JSSURHRV9fT1dORURfUlVMRVMgPSBTRU1BTlRJQ19NT0RFTF9CUklER0VfX09XTkVEX1JVTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBVTUFfU0VNQU5USUNfTU9ERUxfQlJJREdFX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IFNFTUFOVElDX01PREVMX0JSSURHRV9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+S2luZDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVU1BX1NFTUFOVElDX01PREVMX0JSSURHRV9fS0lORCA9IFNFTUFOVElDX01PREVMX0JSSURHRV9fS0lORDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVU1BX1NFTUFOVElDX01PREVMX0JSSURHRV9fU1VQUFJFU1NFRCA9IFNFTUFOVElDX01PREVMX0JSSURHRV9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFVNQV9TRU1BTlRJQ19NT0RFTF9CUklER0VfX09SREVSSU5HX0dVSURFID0gU0VNQU5USUNfTU9ERUxfQlJJREdFX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBWaXNpYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVU1BX1NFTUFOVElDX01PREVMX0JSSURHRV9fSVNfVklTSUJMRSA9IFNFTUFOVElDX01PREVMX0JSSURHRV9fSVNfVklTSUJMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db250YWluZXI8L2I+PC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVU1BX1NFTUFOVElDX01PREVMX0JSSURHRV9fQ09OVEFJTkVSID0gU0VNQU5USUNfTU9ERUxfQlJJREdFX19DT05UQUlORVI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVmZXJlbmNlPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBVTUFfU0VNQU5USUNfTU9ERUxfQlJJREdFX19SRUZFUkVOQ0UgPSBTRU1BTlRJQ19NT0RFTF9CUklER0VfX1JFRkVSRU5DRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVU1BX1NFTUFOVElDX01PREVMX0JSSURHRV9fUFJPUEVSVFkgPSBTRU1BTlRJQ19NT0RFTF9CUklER0VfX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFVNQV9TRU1BTlRJQ19NT0RFTF9CUklER0VfX1BSRVNFTlRBVElPTiA9IFNFTUFOVElDX01PREVMX0JSSURHRV9fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRpYWdyYW08L2I+PC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVU1BX1NFTUFOVElDX01PREVMX0JSSURHRV9fRElBR1JBTSA9IFNFTUFOVElDX01PREVMX0JSSURHRV9fRElBR1JBTTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HcmFwaCBFbGVtZW50PC9iPjwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFVNQV9TRU1BTlRJQ19NT0RFTF9CUklER0VfX0dSQVBIX0VMRU1FTlQgPSBTRU1BTlRJQ19NT0RFTF9CUklER0VfX0dSQVBIX0VMRU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RWxlbWVudDwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFVNQV9TRU1BTlRJQ19NT0RFTF9CUklER0VfX0VMRU1FTlQgPSBTRU1BTlRJQ19NT0RFTF9CUklER0VfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+VU1BIFNlbWFudGljIE1vZGVsIEJyaWRnZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBVTUFfU0VNQU5USUNfTU9ERUxfQlJJREdFX0ZFQVRVUkVfQ09VTlQgPSBTRU1BTlRJQ19NT0RFTF9CUklER0VfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Db3JlU2VtYW50aWNNb2RlbEJyaWRnZUltcGwgPGVtPkNvcmUgU2VtYW50aWMgTW9kZWwgQnJpZGdlPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkNvcmVTZW1hbnRpY01vZGVsQnJpZGdlSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldENvcmVTZW1hbnRpY01vZGVsQnJpZGdlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IENPUkVfU0VNQU5USUNfTU9ERUxfQlJJREdFID0gMTA0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT1JFX1NFTUFOVElDX01PREVMX0JSSURHRV9fTkFNRSA9IFNFTUFOVElDX01PREVMX0JSSURHRV9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09SRV9TRU1BTlRJQ19NT0RFTF9CUklER0VfX0dVSUQgPSBTRU1BTlRJQ19NT0RFTF9CUklER0VfX0dVSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT1JFX1NFTUFOVElDX01PREVMX0JSSURHRV9fUFJFU0VOVEFUSU9OX05BTUUgPSBTRU1BTlRJQ19NT0RFTF9CUklER0VfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09SRV9TRU1BTlRJQ19NT0RFTF9CUklER0VfX0JSSUVGX0RFU0NSSVBUSU9OID0gU0VNQU5USUNfTU9ERUxfQlJJREdFX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09SRV9TRU1BTlRJQ19NT0RFTF9CUklER0VfX09XTkVEX1JVTEVTID0gU0VNQU5USUNfTU9ERUxfQlJJREdFX19PV05FRF9SVUxFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09SRV9TRU1BTlRJQ19NT0RFTF9CUklER0VfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gU0VNQU5USUNfTU9ERUxfQlJJREdFX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5LaW5kPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT1JFX1NFTUFOVElDX01PREVMX0JSSURHRV9fS0lORCA9IFNFTUFOVElDX01PREVMX0JSSURHRV9fS0lORDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09SRV9TRU1BTlRJQ19NT0RFTF9CUklER0VfX1NVUFBSRVNTRUQgPSBTRU1BTlRJQ19NT0RFTF9CUklER0VfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT1JFX1NFTUFOVElDX01PREVMX0JSSURHRV9fT1JERVJJTkdfR1VJREUgPSBTRU1BTlRJQ19NT0RFTF9CUklER0VfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIFZpc2libGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT1JFX1NFTUFOVElDX01PREVMX0JSSURHRV9fSVNfVklTSUJMRSA9IFNFTUFOVElDX01PREVMX0JSSURHRV9fSVNfVklTSUJMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db250YWluZXI8L2I+PC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09SRV9TRU1BTlRJQ19NT0RFTF9CUklER0VfX0NPTlRBSU5FUiA9IFNFTUFOVElDX01PREVMX0JSSURHRV9fQ09OVEFJTkVSOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlZmVyZW5jZTwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09SRV9TRU1BTlRJQ19NT0RFTF9CUklER0VfX1JFRkVSRU5DRSA9IFNFTUFOVElDX01PREVMX0JSSURHRV9fUkVGRVJFTkNFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT1JFX1NFTUFOVElDX01PREVMX0JSSURHRV9fUFJPUEVSVFkgPSBTRU1BTlRJQ19NT0RFTF9CUklER0VfX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPUkVfU0VNQU5USUNfTU9ERUxfQlJJREdFX19QUkVTRU5UQVRJT04gPSBTRU1BTlRJQ19NT0RFTF9CUklER0VfX1BSRVNFTlRBVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EaWFncmFtPC9iPjwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPUkVfU0VNQU5USUNfTU9ERUxfQlJJREdFX19ESUFHUkFNID0gU0VNQU5USUNfTU9ERUxfQlJJREdFX19ESUFHUkFNOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyYXBoIEVsZW1lbnQ8L2I+PC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09SRV9TRU1BTlRJQ19NT0RFTF9CUklER0VfX0dSQVBIX0VMRU1FTlQgPSBTRU1BTlRJQ19NT0RFTF9CUklER0VfX0dSQVBIX0VMRU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RWxlbWVudDwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPUkVfU0VNQU5USUNfTU9ERUxfQlJJREdFX19FTEVNRU5UID0gU0VNQU5USUNfTU9ERUxfQlJJREdFX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkNvcmUgU2VtYW50aWMgTW9kZWwgQnJpZGdlPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPUkVfU0VNQU5USUNfTU9ERUxfQlJJREdFX0ZFQVRVUkVfQ09VTlQgPSBTRU1BTlRJQ19NT0RFTF9CUklER0VfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5MZWFmRWxlbWVudEltcGwgPGVtPkxlYWYgRWxlbWVudDwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5MZWFmRWxlbWVudEltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRMZWFmRWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBMRUFGX0VMRU1FTlQgPSAxMDU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IExFQUZfRUxFTUVOVF9fTkFNRSA9IERJQUdSQU1fRUxFTUVOVF9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTEVBRl9FTEVNRU5UX19HVUlEID0gRElBR1JBTV9FTEVNRU5UX19HVUlEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTEVBRl9FTEVNRU5UX19QUkVTRU5UQVRJT05fTkFNRSA9IERJQUdSQU1fRUxFTUVOVF9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBMRUFGX0VMRU1FTlRfX0JSSUVGX0RFU0NSSVBUSU9OID0gRElBR1JBTV9FTEVNRU5UX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTEVBRl9FTEVNRU5UX19PV05FRF9SVUxFUyA9IERJQUdSQU1fRUxFTUVOVF9fT1dORURfUlVMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IExFQUZfRUxFTUVOVF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBESUFHUkFNX0VMRU1FTlRfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPktpbmQ8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IExFQUZfRUxFTUVOVF9fS0lORCA9IERJQUdSQU1fRUxFTUVOVF9fS0lORDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTEVBRl9FTEVNRU5UX19TVVBQUkVTU0VEID0gRElBR1JBTV9FTEVNRU5UX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTEVBRl9FTEVNRU5UX19PUkRFUklOR19HVUlERSA9IERJQUdSQU1fRUxFTUVOVF9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgVmlzaWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IExFQUZfRUxFTUVOVF9fSVNfVklTSUJMRSA9IERJQUdSQU1fRUxFTUVOVF9fSVNfVklTSUJMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db250YWluZXI8L2I+PC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTEVBRl9FTEVNRU5UX19DT05UQUlORVIgPSBESUFHUkFNX0VMRU1FTlRfX0NPTlRBSU5FUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZWZlcmVuY2U8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IExFQUZfRUxFTUVOVF9fUkVGRVJFTkNFID0gRElBR1JBTV9FTEVNRU5UX19SRUZFUkVOQ0U7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IExFQUZfRUxFTUVOVF9fUFJPUEVSVFkgPSBESUFHUkFNX0VMRU1FTlRfX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkxlYWYgRWxlbWVudDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBMRUFGX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCA9IERJQUdSQU1fRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlRleHRFbGVtZW50SW1wbCA8ZW0+VGV4dCBFbGVtZW50PC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlRleHRFbGVtZW50SW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFRleHRFbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFRFWFRfRUxFTUVOVCA9IDEwNjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVYVF9FTEVNRU5UX19OQU1FID0gTEVBRl9FTEVNRU5UX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURVhUX0VMRU1FTlRfX0dVSUQgPSBMRUFGX0VMRU1FTlRfX0dVSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURVhUX0VMRU1FTlRfX1BSRVNFTlRBVElPTl9OQU1FID0gTEVBRl9FTEVNRU5UX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFWFRfRUxFTUVOVF9fQlJJRUZfREVTQ1JJUFRJT04gPSBMRUFGX0VMRU1FTlRfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURVhUX0VMRU1FTlRfX09XTkVEX1JVTEVTID0gTEVBRl9FTEVNRU5UX19PV05FRF9SVUxFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVYVF9FTEVNRU5UX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IExFQUZfRUxFTUVOVF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+S2luZDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVYVF9FTEVNRU5UX19LSU5EID0gTEVBRl9FTEVNRU5UX19LSU5EOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURVhUX0VMRU1FTlRfX1NVUFBSRVNTRUQgPSBMRUFGX0VMRU1FTlRfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURVhUX0VMRU1FTlRfX09SREVSSU5HX0dVSURFID0gTEVBRl9FTEVNRU5UX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBWaXNpYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVYVF9FTEVNRU5UX19JU19WSVNJQkxFID0gTEVBRl9FTEVNRU5UX19JU19WSVNJQkxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbnRhaW5lcjwvYj48L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURVhUX0VMRU1FTlRfX0NPTlRBSU5FUiA9IExFQUZfRUxFTUVOVF9fQ09OVEFJTkVSOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlZmVyZW5jZTwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVYVF9FTEVNRU5UX19SRUZFUkVOQ0UgPSBMRUFGX0VMRU1FTlRfX1JFRkVSRU5DRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVYVF9FTEVNRU5UX19QUk9QRVJUWSA9IExFQUZfRUxFTUVOVF9fUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGV4dDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFWFRfRUxFTUVOVF9fVEVYVCA9IExFQUZfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5UZXh0IEVsZW1lbnQ8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVYVF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgPSBMRUFGX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5JbWFnZUltcGwgPGVtPkltYWdlPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkltYWdlSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldEltYWdlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IElNQUdFID0gMTA3OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJTUFHRV9fTkFNRSA9IExFQUZfRUxFTUVOVF9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSU1BR0VfX0dVSUQgPSBMRUFGX0VMRU1FTlRfX0dVSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJTUFHRV9fUFJFU0VOVEFUSU9OX05BTUUgPSBMRUFGX0VMRU1FTlRfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSU1BR0VfX0JSSUVGX0RFU0NSSVBUSU9OID0gTEVBRl9FTEVNRU5UX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSU1BR0VfX09XTkVEX1JVTEVTID0gTEVBRl9FTEVNRU5UX19PV05FRF9SVUxFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSU1BR0VfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gTEVBRl9FTEVNRU5UX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5LaW5kPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJTUFHRV9fS0lORCA9IExFQUZfRUxFTUVOVF9fS0lORDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSU1BR0VfX1NVUFBSRVNTRUQgPSBMRUFGX0VMRU1FTlRfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJTUFHRV9fT1JERVJJTkdfR1VJREUgPSBMRUFGX0VMRU1FTlRfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIFZpc2libGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJTUFHRV9fSVNfVklTSUJMRSA9IExFQUZfRUxFTUVOVF9fSVNfVklTSUJMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db250YWluZXI8L2I+PC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSU1BR0VfX0NPTlRBSU5FUiA9IExFQUZfRUxFTUVOVF9fQ09OVEFJTkVSOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlZmVyZW5jZTwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSU1BR0VfX1JFRkVSRU5DRSA9IExFQUZfRUxFTUVOVF9fUkVGRVJFTkNFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJTUFHRV9fUFJPUEVSVFkgPSBMRUFGX0VMRU1FTlRfX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVyaTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElNQUdFX19VUkkgPSBMRUFGX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWltZSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSU1BR0VfX01JTUVfVFlQRSA9IExFQUZfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5JbWFnZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJTUFHRV9GRUFUVVJFX0NPVU5UID0gTEVBRl9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuR3JhcGhpY1ByaW1pdGl2ZUltcGwgPGVtPkdyYXBoaWMgUHJpbWl0aXZlPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkdyYXBoaWNQcmltaXRpdmVJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0R3JhcGhpY1ByaW1pdGl2ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBHUkFQSElDX1BSSU1JVElWRSA9IDEwODsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1JBUEhJQ19QUklNSVRJVkVfX05BTUUgPSBMRUFGX0VMRU1FTlRfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdSQVBISUNfUFJJTUlUSVZFX19HVUlEID0gTEVBRl9FTEVNRU5UX19HVUlEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1JBUEhJQ19QUklNSVRJVkVfX1BSRVNFTlRBVElPTl9OQU1FID0gTEVBRl9FTEVNRU5UX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdSQVBISUNfUFJJTUlUSVZFX19CUklFRl9ERVNDUklQVElPTiA9IExFQUZfRUxFTUVOVF9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdSQVBISUNfUFJJTUlUSVZFX19PV05FRF9SVUxFUyA9IExFQUZfRUxFTUVOVF9fT1dORURfUlVMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdSQVBISUNfUFJJTUlUSVZFX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IExFQUZfRUxFTUVOVF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+S2luZDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1JBUEhJQ19QUklNSVRJVkVfX0tJTkQgPSBMRUFGX0VMRU1FTlRfX0tJTkQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdSQVBISUNfUFJJTUlUSVZFX19TVVBQUkVTU0VEID0gTEVBRl9FTEVNRU5UX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1JBUEhJQ19QUklNSVRJVkVfX09SREVSSU5HX0dVSURFID0gTEVBRl9FTEVNRU5UX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBWaXNpYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1JBUEhJQ19QUklNSVRJVkVfX0lTX1ZJU0lCTEUgPSBMRUFGX0VMRU1FTlRfX0lTX1ZJU0lCTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29udGFpbmVyPC9iPjwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdSQVBISUNfUFJJTUlUSVZFX19DT05UQUlORVIgPSBMRUFGX0VMRU1FTlRfX0NPTlRBSU5FUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZWZlcmVuY2U8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdSQVBISUNfUFJJTUlUSVZFX19SRUZFUkVOQ0UgPSBMRUFGX0VMRU1FTlRfX1JFRkVSRU5DRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1JBUEhJQ19QUklNSVRJVkVfX1BST1BFUlRZID0gTEVBRl9FTEVNRU5UX19QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5HcmFwaGljIFByaW1pdGl2ZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHUkFQSElDX1BSSU1JVElWRV9GRUFUVVJFX0NPVU5UID0gTEVBRl9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUG9seWxpbmVJbXBsIDxlbT5Qb2x5bGluZTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Qb2x5bGluZUltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRQb2x5bGluZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBQT0xZTElORSA9IDEwOTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUE9MWUxJTkVfX05BTUUgPSBHUkFQSElDX1BSSU1JVElWRV9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUE9MWUxJTkVfX0dVSUQgPSBHUkFQSElDX1BSSU1JVElWRV9fR1VJRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBPTFlMSU5FX19QUkVTRU5UQVRJT05fTkFNRSA9IEdSQVBISUNfUFJJTUlUSVZFX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBPTFlMSU5FX19CUklFRl9ERVNDUklQVElPTiA9IEdSQVBISUNfUFJJTUlUSVZFX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUE9MWUxJTkVfX09XTkVEX1JVTEVTID0gR1JBUEhJQ19QUklNSVRJVkVfX09XTkVEX1JVTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQT0xZTElORV9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBHUkFQSElDX1BSSU1JVElWRV9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+S2luZDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUE9MWUxJTkVfX0tJTkQgPSBHUkFQSElDX1BSSU1JVElWRV9fS0lORDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUE9MWUxJTkVfX1NVUFBSRVNTRUQgPSBHUkFQSElDX1BSSU1JVElWRV9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBPTFlMSU5FX19PUkRFUklOR19HVUlERSA9IEdSQVBISUNfUFJJTUlUSVZFX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBWaXNpYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUE9MWUxJTkVfX0lTX1ZJU0lCTEUgPSBHUkFQSElDX1BSSU1JVElWRV9fSVNfVklTSUJMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db250YWluZXI8L2I+PC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUE9MWUxJTkVfX0NPTlRBSU5FUiA9IEdSQVBISUNfUFJJTUlUSVZFX19DT05UQUlORVI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVmZXJlbmNlPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQT0xZTElORV9fUkVGRVJFTkNFID0gR1JBUEhJQ19QUklNSVRJVkVfX1JFRkVSRU5DRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUE9MWUxJTkVfX1BST1BFUlRZID0gR1JBUEhJQ19QUklNSVRJVkVfX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNsb3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBPTFlMSU5FX19DTE9TRUQgPSBHUkFQSElDX1BSSU1JVElWRV9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5XYXlwb2ludHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBPTFlMSU5FX19XQVlQT0lOVFMgPSBHUkFQSElDX1BSSU1JVElWRV9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Qb2x5bGluZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQT0xZTElORV9GRUFUVVJFX0NPVU5UID0gR1JBUEhJQ19QUklNSVRJVkVfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5FbGxpcHNlSW1wbCA8ZW0+RWxsaXBzZTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5FbGxpcHNlSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldEVsbGlwc2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgRUxMSVBTRSA9IDExMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRUxMSVBTRV9fTkFNRSA9IEdSQVBISUNfUFJJTUlUSVZFX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFTExJUFNFX19HVUlEID0gR1JBUEhJQ19QUklNSVRJVkVfX0dVSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFTExJUFNFX19QUkVTRU5UQVRJT05fTkFNRSA9IEdSQVBISUNfUFJJTUlUSVZFX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVMTElQU0VfX0JSSUVGX0RFU0NSSVBUSU9OID0gR1JBUEhJQ19QUklNSVRJVkVfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFTExJUFNFX19PV05FRF9SVUxFUyA9IEdSQVBISUNfUFJJTUlUSVZFX19PV05FRF9SVUxFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRUxMSVBTRV9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBHUkFQSElDX1BSSU1JVElWRV9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+S2luZDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRUxMSVBTRV9fS0lORCA9IEdSQVBISUNfUFJJTUlUSVZFX19LSU5EOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFTExJUFNFX19TVVBQUkVTU0VEID0gR1JBUEhJQ19QUklNSVRJVkVfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFTExJUFNFX19PUkRFUklOR19HVUlERSA9IEdSQVBISUNfUFJJTUlUSVZFX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBWaXNpYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRUxMSVBTRV9fSVNfVklTSUJMRSA9IEdSQVBISUNfUFJJTUlUSVZFX19JU19WSVNJQkxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbnRhaW5lcjwvYj48L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFTExJUFNFX19DT05UQUlORVIgPSBHUkFQSElDX1BSSU1JVElWRV9fQ09OVEFJTkVSOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlZmVyZW5jZTwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRUxMSVBTRV9fUkVGRVJFTkNFID0gR1JBUEhJQ19QUklNSVRJVkVfX1JFRkVSRU5DRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRUxMSVBTRV9fUFJPUEVSVFkgPSBHUkFQSElDX1BSSU1JVElWRV9fUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2VudGVyPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRUxMSVBTRV9fQ0VOVEVSID0gR1JBUEhJQ19QUklNSVRJVkVfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmFkaXVzIFg8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFTExJUFNFX19SQURJVVNfWCA9IEdSQVBISUNfUFJJTUlUSVZFX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJhZGl1cyBZPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRUxMSVBTRV9fUkFESVVTX1kgPSBHUkFQSElDX1BSSU1JVElWRV9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Sb3RhdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVMTElQU0VfX1JPVEFUSU9OID0gR1JBUEhJQ19QUklNSVRJVkVfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3RhcnQgQW5nbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFTExJUFNFX19TVEFSVF9BTkdMRSA9IEdSQVBISUNfUFJJTUlUSVZFX0ZFQVRVUkVfQ09VTlQgKyA0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVuZCBBbmdsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVMTElQU0VfX0VORF9BTkdMRSA9IEdSQVBISUNfUFJJTUlUSVZFX0ZFQVRVUkVfQ09VTlQgKyA1OwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkVsbGlwc2U8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRUxMSVBTRV9GRUFUVVJFX0NPVU5UID0gR1JBUEhJQ19QUklNSVRJVkVfRkVBVFVSRV9DT1VOVCArIDY7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfRkFNSUxZX19OQU1FID0gTUVUSE9EX0NPTkZJR1VSQVRJT05fX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfRkFNSUxZX19HVUlEID0gTUVUSE9EX0NPTkZJR1VSQVRJT05fX0dVSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0ZBTUlMWV9fUFJFU0VOVEFUSU9OX05BTUUgPSBNRVRIT0RfQ09ORklHVVJBVElPTl9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0ZBTUlMWV9fQlJJRUZfREVTQ1JJUFRJT04gPSBNRVRIT0RfQ09ORklHVVJBVElPTl9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfRkFNSUxZX19PV05FRF9SVUxFUyA9IE1FVEhPRF9DT05GSUdVUkFUSU9OX19PV05FRF9SVUxFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19GQU1JTFlfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gTUVUSE9EX0NPTkZJR1VSQVRJT05fX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPktpbmQ8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfRkFNSUxZX19LSU5EID0gTUVUSE9EX0NPTkZJR1VSQVRJT05fX0tJTkQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfRkFNSUxZX19TVVBQUkVTU0VEID0gTUVUSE9EX0NPTkZJR1VSQVRJT05fX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0ZBTUlMWV9fT1JERVJJTkdfR1VJREUgPSBNRVRIT0RfQ09ORklHVVJBVElPTl9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXV0aG9yczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfRkFNSUxZX19BVVRIT1JTID0gTUVUSE9EX0NPTkZJR1VSQVRJT05fX0FVVEhPUlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hhbmdlIERhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0ZBTUlMWV9fQ0hBTkdFX0RBVEUgPSBNRVRIT0RfQ09ORklHVVJBVElPTl9fQ0hBTkdFX0RBVEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hhbmdlIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19GQU1JTFlfX0NIQU5HRV9ERVNDUklQVElPTiA9IE1FVEhPRF9DT05GSUdVUkFUSU9OX19DSEFOR0VfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmVyc2lvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfRkFNSUxZX19WRVJTSU9OID0gTUVUSE9EX0NPTkZJR1VSQVRJT05fX1ZFUlNJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29weXJpZ2h0IFN0YXRlbWVudDwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfRkFNSUxZX19DT1BZUklHSFRfU1RBVEVNRU5UID0gTUVUSE9EX0NPTkZJR1VSQVRJT05fX0NPUFlSSUdIVF9TVEFURU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIFBsdWdpbiBTZWxlY3Rpb248L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfRkFNSUxZX19NRVRIT0RfUExVR0lOX1NFTEVDVElPTiA9IE1FVEhPRF9DT05GSUdVUkFUSU9OX19NRVRIT0RfUExVR0lOX1NFTEVDVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgUGFja2FnZSBTZWxlY3Rpb248L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfRkFNSUxZX19NRVRIT0RfUEFDS0FHRV9TRUxFQ1RJT04gPSBNRVRIT0RfQ09ORklHVVJBVElPTl9fTUVUSE9EX1BBQ0tBR0VfU0VMRUNUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByb2Nlc3MgVmlld3M8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfRkFNSUxZX19QUk9DRVNTX1ZJRVdTID0gTUVUSE9EX0NPTkZJR1VSQVRJT05fX1BST0NFU1NfVklFV1M7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVmYXVsdCBWaWV3PC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19GQU1JTFlfX0RFRkFVTFRfVklFVyA9IE1FVEhPRF9DT05GSUdVUkFUSU9OX19ERUZBVUxUX1ZJRVc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QmFzZSBDb25maWd1cmF0aW9uczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19GQU1JTFlfX0JBU0VfQ09ORklHVVJBVElPTlMgPSBNRVRIT0RfQ09ORklHVVJBVElPTl9fQkFTRV9DT05GSUdVUkFUSU9OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdWJ0cmFjdGVkIENhdGVnb3J5PC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0ZBTUlMWV9fU1VCVFJBQ1RFRF9DQVRFR09SWSA9IE1FVEhPRF9DT05GSUdVUkFUSU9OX19TVUJUUkFDVEVEX0NBVEVHT1JZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFkZGVkIENhdGVnb3J5PC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0ZBTUlMWV9fQURERURfQ0FURUdPUlkgPSBNRVRIT0RfQ09ORklHVVJBVElPTl9fQURERURfQ0FURUdPUlk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVsaXZlcnkgUHJvY2Vzc2VzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0ZBTUlMWV9fREVMSVZFUllfUFJPQ0VTU0VTID0gTUVUSE9EX0NPTkZJR1VSQVRJT05fRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+UHJvY2VzcyBGYW1pbHk8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19GQU1JTFlfRkVBVFVSRV9DT1VOVCA9IE1FVEhPRF9DT05GSUdVUkFUSU9OX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfTElCUkFSWV9fTkFNRSA9IE1FVEhPRF9VTklUX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfTElCUkFSWV9fR1VJRCA9IE1FVEhPRF9VTklUX19HVUlEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX0xJQlJBUllfX1BSRVNFTlRBVElPTl9OQU1FID0gTUVUSE9EX1VOSVRfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX0xJQlJBUllfX0JSSUVGX0RFU0NSSVBUSU9OID0gTUVUSE9EX1VOSVRfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfTElCUkFSWV9fT1dORURfUlVMRVMgPSBNRVRIT0RfVU5JVF9fT1dORURfUlVMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9MSUJSQVJZX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IE1FVEhPRF9VTklUX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5LaW5kPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfTElCUkFSWV9fS0lORCA9IE1FVEhPRF9VTklUX19LSU5EOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfTElCUkFSWV9fU1VQUFJFU1NFRCA9IE1FVEhPRF9VTklUX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX0xJQlJBUllfX09SREVSSU5HX0dVSURFID0gTUVUSE9EX1VOSVRfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkF1dGhvcnM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfTElCUkFSWV9fQVVUSE9SUyA9IE1FVEhPRF9VTklUX19BVVRIT1JTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoYW5nZSBEYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX0xJQlJBUllfX0NIQU5HRV9EQVRFID0gTUVUSE9EX1VOSVRfX0NIQU5HRV9EQVRFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoYW5nZSBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9MSUJSQVJZX19DSEFOR0VfREVTQ1JJUFRJT04gPSBNRVRIT0RfVU5JVF9fQ0hBTkdFX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZlcnNpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfTElCUkFSWV9fVkVSU0lPTiA9IE1FVEhPRF9VTklUX19WRVJTSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvcHlyaWdodCBTdGF0ZW1lbnQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfTElCUkFSWV9fQ09QWVJJR0hUX1NUQVRFTUVOVCA9IE1FVEhPRF9VTklUX19DT1BZUklHSFRfU1RBVEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBQbHVnaW5zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfTElCUkFSWV9fTUVUSE9EX1BMVUdJTlMgPSBNRVRIT0RfVU5JVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVkZWZpbmVkIENvbmZpZ3VyYXRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfTElCUkFSWV9fUFJFREVGSU5FRF9DT05GSUdVUkFUSU9OUyA9IE1FVEhPRF9VTklUX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPk1ldGhvZCBMaWJyYXJ5PC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9MSUJSQVJZX0ZFQVRVUkVfQ09VTlQgPSBNRVRIT0RfVU5JVF9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrT3JkZXJUeXBlIDxlbT5Xb3JrIE9yZGVyIFR5cGU8L2VtPn0nIGVudW0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya09yZGVyVHlwZQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFdvcmtPcmRlclR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgV09SS19PUkRFUl9UWVBFID0gMTE0OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5VHlwZSA8ZW0+VmFyaWFiaWxpdHkgVHlwZTwvZW0+fScgZW51bS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eVR5cGUKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRWYXJpYWJpbGl0eVR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgVkFSSUFCSUxJVFlfVFlQRSA9IDExMzsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+RGF0ZTwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGphdmEudXRpbC5EYXRlCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0RGF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBEQVRFID0gMTE3OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5Vcmk8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqYXZhLm5ldC5VUkkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRVcmkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgVVJJID0gMTE4OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5TdHJpbmc8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0U3RyaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFNUUklORyA9IDExNTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+Qm9vbGVhbjwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGphdmEubGFuZy5Cb29sZWFuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0Qm9vbGVhbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBCT09MRUFOID0gMTE2OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5TZXQ8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqYXZhLnV0aWwuU2V0Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0U2V0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFNFVCA9IDExOTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+U2VxdWVuY2U8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqYXZhLnV0aWwuTGlzdAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFNlcXVlbmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFNFUVVFTkNFID0gMTIwOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5JbnRlZ2VyPC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldEludGVnZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgSU5URUdFUiA9IDEyMTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+RG91YmxlPC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgamF2YS5sYW5nLkRvdWJsZQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldERvdWJsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBET1VCTEUgPSAxMjI7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkNsYXNzaWZpZXIgPGVtPkNsYXNzaWZpZXI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+Q2xhc3NpZmllcjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuQ2xhc3NpZmllcgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0Q2xhc3NpZmllcigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkNsYXNzaWZpZXIjZ2V0SXNBYnN0cmFjdCA8ZW0+SXMgQWJzdHJhY3Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5JcyBBYnN0cmFjdDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuQ2xhc3NpZmllciNnZXRJc0Fic3RyYWN0KCkKLQkgKiBAc2VlICNnZXRDbGFzc2lmaWVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRDbGFzc2lmaWVyX0lzQWJzdHJhY3QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVHlwZSA8ZW0+VHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5UeXBlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5UeXBlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkVsZW1lbnQgPGVtPkVsZW1lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+RWxlbWVudDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuRWxlbWVudAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0RWxlbWVudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5OYW1lZEVsZW1lbnQgPGVtPk5hbWVkIEVsZW1lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+TmFtZWQgRWxlbWVudDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuTmFtZWRFbGVtZW50Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXROYW1lZEVsZW1lbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5OYW1lZEVsZW1lbnQjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk5hbWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLk5hbWVkRWxlbWVudCNnZXROYW1lKCkKLQkgKiBAc2VlICNnZXROYW1lZEVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldE5hbWVkRWxlbWVudF9OYW1lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlBhY2thZ2VhYmxlRWxlbWVudCA8ZW0+UGFja2FnZWFibGUgRWxlbWVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5QYWNrYWdlYWJsZSBFbGVtZW50PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5QYWNrYWdlYWJsZUVsZW1lbnQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFBhY2thZ2VhYmxlRWxlbWVudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5QYWNrYWdlIDxlbT5QYWNrYWdlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlBhY2thZ2U8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlBhY2thZ2UKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFBhY2thZ2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTmFtZXNwYWNlIDxlbT5OYW1lc3BhY2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+TmFtZXNwYWNlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5OYW1lc3BhY2UKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldE5hbWVzcGFjZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50IDxlbT5NZXRob2QgRWxlbWVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5NZXRob2QgRWxlbWVudDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0TWV0aG9kRWxlbWVudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQjZ2V0R3VpZCA8ZW0+R3VpZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkd1aWQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQjZ2V0R3VpZCgpCi0JICogQHNlZSAjZ2V0TWV0aG9kRWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0TWV0aG9kRWxlbWVudF9HdWlkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudCNnZXRQcmVzZW50YXRpb25OYW1lIDxlbT5QcmVzZW50YXRpb24gTmFtZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlByZXNlbnRhdGlvbiBOYW1lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50I2dldFByZXNlbnRhdGlvbk5hbWUoKQotCSAqIEBzZWUgI2dldE1ldGhvZEVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldE1ldGhvZEVsZW1lbnRfUHJlc2VudGF0aW9uTmFtZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQjZ2V0QnJpZWZEZXNjcmlwdGlvbiA8ZW0+QnJpZWYgRGVzY3JpcHRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5CcmllZiBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudCNnZXRCcmllZkRlc2NyaXB0aW9uKCkKLQkgKiBAc2VlICNnZXRNZXRob2RFbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRNZXRob2RFbGVtZW50X0JyaWVmRGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQjZ2V0T3duZWRSdWxlcyA8ZW0+T3duZWQgUnVsZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPk93bmVkIFJ1bGVzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50I2dldE93bmVkUnVsZXMoKQotCSAqIEBzZWUgI2dldE1ldGhvZEVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldE1ldGhvZEVsZW1lbnRfT3duZWRSdWxlcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudCNnZXRNZXRob2RFbGVtZW50UHJvcGVydHkgPGVtPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudCNnZXRNZXRob2RFbGVtZW50UHJvcGVydHkoKQotCSAqIEBzZWUgI2dldE1ldGhvZEVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldE1ldGhvZEVsZW1lbnRfTWV0aG9kRWxlbWVudFByb3BlcnR5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50I2dldEtpbmQgPGVtPktpbmQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAnPGVtPktpbmQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQjZ2V0S2luZCgpCi0JICogQHNlZSAjZ2V0TWV0aG9kRWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0TWV0aG9kRWxlbWVudF9LaW5kKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudCNnZXRTdXBwcmVzc2VkIDxlbT5TdXBwcmVzc2VkPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+U3VwcHJlc3NlZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudCNnZXRTdXBwcmVzc2VkKCkKLQkgKiBAc2VlICNnZXRNZXRob2RFbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRNZXRob2RFbGVtZW50X1N1cHByZXNzZWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50I2dldE9yZGVyaW5nR3VpZGUgPGVtPk9yZGVyaW5nIEd1aWRlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+T3JkZXJpbmcgR3VpZGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQjZ2V0T3JkZXJpbmdHdWlkZSgpCi0JICogQHNlZSAjZ2V0TWV0aG9kRWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0TWV0aG9kRWxlbWVudF9PcmRlcmluZ0d1aWRlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnN0cmFpbnQgPGVtPkNvbnN0cmFpbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+Q29uc3RyYWludDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuQ29uc3RyYWludAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0Q29uc3RyYWludCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnN0cmFpbnQjZ2V0Qm9keSA8ZW0+Qm9keTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkJvZHk8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnN0cmFpbnQjZ2V0Qm9keSgpCi0JICogQHNlZSAjZ2V0Q29uc3RyYWludCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0Q29uc3RyYWludF9Cb2R5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnRQcm9wZXJ0eSA8ZW0+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnRQcm9wZXJ0eQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0TWV0aG9kRWxlbWVudFByb3BlcnR5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudFByb3BlcnR5I2dldFZhbHVlIDxlbT5WYWx1ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlZhbHVlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50UHJvcGVydHkjZ2V0VmFsdWUoKQotCSAqIEBzZWUgI2dldE1ldGhvZEVsZW1lbnRQcm9wZXJ0eSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0TWV0aG9kRWxlbWVudFByb3BlcnR5X1ZhbHVlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLktpbmQgPGVtPktpbmQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+S2luZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuS2luZAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0S2luZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuS2luZCNnZXRBcHBsaWNhYmxlTWV0YUNsYXNzSW5mbyA8ZW0+QXBwbGljYWJsZSBNZXRhIENsYXNzIEluZm88L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkFwcGxpY2FibGUgTWV0YSBDbGFzcyBJbmZvPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5LaW5kI2dldEFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvKCkKLQkgKiBAc2VlICNnZXRLaW5kKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRLaW5kX0FwcGxpY2FibGVNZXRhQ2xhc3NJbmZvKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRFbGVtZW50IDxlbT5Db250ZW50IEVsZW1lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+Q29udGVudCBFbGVtZW50PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RWxlbWVudAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0Q29udGVudEVsZW1lbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRFbGVtZW50I2dldFN1cHBvcnRpbmdNYXRlcmlhbHMgPGVtPlN1cHBvcnRpbmcgTWF0ZXJpYWxzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJzxlbT5TdXBwb3J0aW5nIE1hdGVyaWFsczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudEVsZW1lbnQjZ2V0U3VwcG9ydGluZ01hdGVyaWFscygpCi0JICogQHNlZSAjZ2V0Q29udGVudEVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldENvbnRlbnRFbGVtZW50X1N1cHBvcnRpbmdNYXRlcmlhbHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRFbGVtZW50I2dldENvbmNlcHRzQW5kUGFwZXJzIDxlbT5Db25jZXB0cyBBbmQgUGFwZXJzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJzxlbT5Db25jZXB0cyBBbmQgUGFwZXJzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RWxlbWVudCNnZXRDb25jZXB0c0FuZFBhcGVycygpCi0JICogQHNlZSAjZ2V0Q29udGVudEVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldENvbnRlbnRFbGVtZW50X0NvbmNlcHRzQW5kUGFwZXJzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RWxlbWVudCNnZXRDaGVja2xpc3RzIDxlbT5DaGVja2xpc3RzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJzxlbT5DaGVja2xpc3RzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RWxlbWVudCNnZXRDaGVja2xpc3RzKCkKLQkgKiBAc2VlICNnZXRDb250ZW50RWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0Q29udGVudEVsZW1lbnRfQ2hlY2tsaXN0cygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudEVsZW1lbnQjZ2V0R3VpZGVsaW5lcyA8ZW0+R3VpZGVsaW5lczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICc8ZW0+R3VpZGVsaW5lczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudEVsZW1lbnQjZ2V0R3VpZGVsaW5lcygpCi0JICogQHNlZSAjZ2V0Q29udGVudEVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldENvbnRlbnRFbGVtZW50X0d1aWRlbGluZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRFbGVtZW50I2dldEV4YW1wbGVzIDxlbT5FeGFtcGxlczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICc8ZW0+RXhhbXBsZXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRFbGVtZW50I2dldEV4YW1wbGVzKCkKLQkgKiBAc2VlICNnZXRDb250ZW50RWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0Q29udGVudEVsZW1lbnRfRXhhbXBsZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRFbGVtZW50I2dldEFzc2V0cyA8ZW0+QXNzZXRzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJzxlbT5Bc3NldHM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRFbGVtZW50I2dldEFzc2V0cygpCi0JICogQHNlZSAjZ2V0Q29udGVudEVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldENvbnRlbnRFbGVtZW50X0Fzc2V0cygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudEVsZW1lbnQjZ2V0VGVybWRlZmluaXRpb24gPGVtPlRlcm1kZWZpbml0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJzxlbT5UZXJtZGVmaW5pdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudEVsZW1lbnQjZ2V0VGVybWRlZmluaXRpb24oKQotCSAqIEBzZWUgI2dldENvbnRlbnRFbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRDb250ZW50RWxlbWVudF9UZXJtZGVmaW5pdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmliYWJsZUVsZW1lbnQgPGVtPkRlc2NyaWJhYmxlIEVsZW1lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+RGVzY3JpYmFibGUgRWxlbWVudDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpYmFibGVFbGVtZW50Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXREZXNjcmliYWJsZUVsZW1lbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmliYWJsZUVsZW1lbnQjZ2V0UHJlc2VudGF0aW9uIDxlbT5QcmVzZW50YXRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5QcmVzZW50YXRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaWJhYmxlRWxlbWVudCNnZXRQcmVzZW50YXRpb24oKQotCSAqIEBzZWUgI2dldERlc2NyaWJhYmxlRWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0RGVzY3JpYmFibGVFbGVtZW50X1ByZXNlbnRhdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaWJhYmxlRWxlbWVudCNnZXRTaGFwZWljb24gPGVtPlNoYXBlaWNvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlNoYXBlaWNvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpYmFibGVFbGVtZW50I2dldFNoYXBlaWNvbigpCi0JICogQHNlZSAjZ2V0RGVzY3JpYmFibGVFbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXREZXNjcmliYWJsZUVsZW1lbnRfU2hhcGVpY29uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpYmFibGVFbGVtZW50I2dldE5vZGVpY29uIDxlbT5Ob2RlaWNvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk5vZGVpY29uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmliYWJsZUVsZW1lbnQjZ2V0Tm9kZWljb24oKQotCSAqIEBzZWUgI2dldERlc2NyaWJhYmxlRWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RGVzY3JpYmFibGVFbGVtZW50X05vZGVpY29uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnREZXNjcmlwdGlvbiA8ZW0+Q29udGVudCBEZXNjcmlwdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Db250ZW50IERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RGVzY3JpcHRpb24KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldENvbnRlbnREZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnREZXNjcmlwdGlvbiNnZXRNYWluRGVzY3JpcHRpb24gPGVtPk1haW4gRGVzY3JpcHRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5NYWluIERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RGVzY3JpcHRpb24jZ2V0TWFpbkRlc2NyaXB0aW9uKCkKLQkgKiBAc2VlICNnZXRDb250ZW50RGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldENvbnRlbnREZXNjcmlwdGlvbl9NYWluRGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnREZXNjcmlwdGlvbiNnZXRTZWN0aW9ucyA8ZW0+U2VjdGlvbnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPlNlY3Rpb25zPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RGVzY3JpcHRpb24jZ2V0U2VjdGlvbnMoKQotCSAqIEBzZWUgI2dldENvbnRlbnREZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0Q29udGVudERlc2NyaXB0aW9uX1NlY3Rpb25zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudERlc2NyaXB0aW9uI2dldEV4dGVybmFsSWQgPGVtPkV4dGVybmFsIElkPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RXh0ZXJuYWwgSWQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnREZXNjcmlwdGlvbiNnZXRFeHRlcm5hbElkKCkKLQkgKiBAc2VlICNnZXRDb250ZW50RGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldENvbnRlbnREZXNjcmlwdGlvbl9FeHRlcm5hbElkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudERlc2NyaXB0aW9uI2dldEtleUNvbnNpZGVyYXRpb25zIDxlbT5LZXkgQ29uc2lkZXJhdGlvbnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5LZXkgQ29uc2lkZXJhdGlvbnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnREZXNjcmlwdGlvbiNnZXRLZXlDb25zaWRlcmF0aW9ucygpCi0JICogQHNlZSAjZ2V0Q29udGVudERlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRDb250ZW50RGVzY3JpcHRpb25fS2V5Q29uc2lkZXJhdGlvbnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RGVzY3JpcHRpb24jZ2V0TG9uZ1ByZXNlbnRhdGlvbk5hbWUgPGVtPkxvbmcgUHJlc2VudGF0aW9uIE5hbWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Mb25nIFByZXNlbnRhdGlvbiBOYW1lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RGVzY3JpcHRpb24jZ2V0TG9uZ1ByZXNlbnRhdGlvbk5hbWUoKQotCSAqIEBzZWUgI2dldENvbnRlbnREZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0Q29udGVudERlc2NyaXB0aW9uX0xvbmdQcmVzZW50YXRpb25OYW1lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlNlY3Rpb24gPGVtPlNlY3Rpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+U2VjdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuU2VjdGlvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0U2VjdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlNlY3Rpb24jZ2V0U2VjdGlvbk5hbWUgPGVtPlNlY3Rpb24gTmFtZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlNlY3Rpb24gTmFtZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuU2VjdGlvbiNnZXRTZWN0aW9uTmFtZSgpCi0JICogQHNlZSAjZ2V0U2VjdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0U2VjdGlvbl9TZWN0aW9uTmFtZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlNlY3Rpb24jZ2V0U2VjdGlvbkRlc2NyaXB0aW9uIDxlbT5TZWN0aW9uIERlc2NyaXB0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+U2VjdGlvbiBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuU2VjdGlvbiNnZXRTZWN0aW9uRGVzY3JpcHRpb24oKQotCSAqIEBzZWUgI2dldFNlY3Rpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFNlY3Rpb25fU2VjdGlvbkRlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5TZWN0aW9uI2dldFN1YlNlY3Rpb25zIDxlbT5TdWIgU2VjdGlvbnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPlN1YiBTZWN0aW9uczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuU2VjdGlvbiNnZXRTdWJTZWN0aW9ucygpCi0JICogQHNlZSAjZ2V0U2VjdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0U2VjdGlvbl9TdWJTZWN0aW9ucygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlNlY3Rpb24jZ2V0UHJlZGVjZXNzb3IgPGVtPlByZWRlY2Vzc29yPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICc8ZW0+UHJlZGVjZXNzb3I8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlNlY3Rpb24jZ2V0UHJlZGVjZXNzb3IoKQotCSAqIEBzZWUgI2dldFNlY3Rpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFNlY3Rpb25fUHJlZGVjZXNzb3IoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZSA8ZW0+Um9sZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Sb2xlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRSb2xlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlI2dldE1vZGlmaWVzIDxlbT5Nb2RpZmllczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICc8ZW0+TW9kaWZpZXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGUjZ2V0TW9kaWZpZXMoKQotCSAqIEBzZWUgI2dldFJvbGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFJvbGVfTW9kaWZpZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGUjZ2V0UmVzcG9uc2libGVGb3IgPGVtPlJlc3BvbnNpYmxlIEZvcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICc8ZW0+UmVzcG9uc2libGUgRm9yPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlI2dldFJlc3BvbnNpYmxlRm9yKCkKLQkgKiBAc2VlICNnZXRSb2xlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRSb2xlX1Jlc3BvbnNpYmxlRm9yKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0IDxlbT5Xb3JrIFByb2R1Y3Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+V29yayBQcm9kdWN0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0V29ya1Byb2R1Y3QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0I2dldFJlcG9ydHMgPGVtPlJlcG9ydHM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAnPGVtPlJlcG9ydHM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0I2dldFJlcG9ydHMoKQotCSAqIEBzZWUgI2dldFdvcmtQcm9kdWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRXb3JrUHJvZHVjdF9SZXBvcnRzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdCNnZXRUZW1wbGF0ZXMgPGVtPlRlbXBsYXRlczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICc8ZW0+VGVtcGxhdGVzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdCNnZXRUZW1wbGF0ZXMoKQotCSAqIEBzZWUgI2dldFdvcmtQcm9kdWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRXb3JrUHJvZHVjdF9UZW1wbGF0ZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0I2dldFRvb2xNZW50b3JzIDxlbT5Ub29sIE1lbnRvcnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAnPGVtPlRvb2wgTWVudG9yczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3QjZ2V0VG9vbE1lbnRvcnMoKQotCSAqIEBzZWUgI2dldFdvcmtQcm9kdWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRXb3JrUHJvZHVjdF9Ub29sTWVudG9ycygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3QjZ2V0RXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIDxlbT5Fc3RpbWF0aW9uIENvbnNpZGVyYXRpb25zPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJzxlbT5Fc3RpbWF0aW9uIENvbnNpZGVyYXRpb25zPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdCNnZXRFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMoKQotCSAqIEBzZWUgI2dldFdvcmtQcm9kdWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRXb3JrUHJvZHVjdF9Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRnVsZmlsbGFibGVFbGVtZW50IDxlbT5GdWxmaWxsYWJsZSBFbGVtZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkZ1bGZpbGxhYmxlIEVsZW1lbnQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkZ1bGZpbGxhYmxlRWxlbWVudAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0RnVsZmlsbGFibGVFbGVtZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5GdWxmaWxsYWJsZUVsZW1lbnQjZ2V0RnVsZmlsbHMgPGVtPkZ1bGZpbGxzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJzxlbT5GdWxmaWxsczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuRnVsZmlsbGFibGVFbGVtZW50I2dldEZ1bGZpbGxzKCkKLQkgKiBAc2VlICNnZXRGdWxmaWxsYWJsZUVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldEZ1bGZpbGxhYmxlRWxlbWVudF9GdWxmaWxscygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrIDxlbT5UYXNrPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlRhc2s8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2sKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFRhc2soKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2sjZ2V0UGVyZm9ybWVkQnkgPGVtPlBlcmZvcm1lZCBCeTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICc8ZW0+UGVyZm9ybWVkIEJ5PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrI2dldFBlcmZvcm1lZEJ5KCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRUYXNrX1BlcmZvcm1lZEJ5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrI2dldE1hbmRhdG9yeUlucHV0IDxlbT5NYW5kYXRvcnkgSW5wdXQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAnPGVtPk1hbmRhdG9yeSBJbnB1dDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVGFzayNnZXRNYW5kYXRvcnlJbnB1dCgpCi0JICogQHNlZSAjZ2V0VGFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0VGFza19NYW5kYXRvcnlJbnB1dCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVGFzayNnZXRPdXRwdXQgPGVtPk91dHB1dDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICc8ZW0+T3V0cHV0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrI2dldE91dHB1dCgpCi0JICogQHNlZSAjZ2V0VGFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0VGFza19PdXRwdXQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2sjZ2V0QWRkaXRpb25hbGx5UGVyZm9ybWVkQnkgPGVtPkFkZGl0aW9uYWxseSBQZXJmb3JtZWQgQnk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAnPGVtPkFkZGl0aW9uYWxseSBQZXJmb3JtZWQgQnk8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2sjZ2V0QWRkaXRpb25hbGx5UGVyZm9ybWVkQnkoKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFRhc2tfQWRkaXRpb25hbGx5UGVyZm9ybWVkQnkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2sjZ2V0T3B0aW9uYWxJbnB1dCA8ZW0+T3B0aW9uYWwgSW5wdXQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAnPGVtPk9wdGlvbmFsIElucHV0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrI2dldE9wdGlvbmFsSW5wdXQoKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFRhc2tfT3B0aW9uYWxJbnB1dCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVGFzayNnZXRTdGVwcyA8ZW0+U3RlcHM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAnPGVtPlN0ZXBzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrI2dldFN0ZXBzKCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRUYXNrX1N0ZXBzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrI2dldFRvb2xNZW50b3JzIDxlbT5Ub29sIE1lbnRvcnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAnPGVtPlRvb2wgTWVudG9yczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVGFzayNnZXRUb29sTWVudG9ycygpCi0JICogQHNlZSAjZ2V0VGFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0VGFza19Ub29sTWVudG9ycygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVGFzayNnZXRFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMgPGVtPkVzdGltYXRpb24gQ29uc2lkZXJhdGlvbnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAnPGVtPkVzdGltYXRpb24gQ29uc2lkZXJhdGlvbnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2sjZ2V0RXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRUYXNrX0VzdGltYXRpb25Db25zaWRlcmF0aW9ucygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrRGVmaW5pdGlvbiA8ZW0+V29yayBEZWZpbml0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPldvcmsgRGVmaW5pdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya0RlZmluaXRpb24KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFdvcmtEZWZpbml0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya0RlZmluaXRpb24jZ2V0UHJlY29uZGl0aW9uIDxlbT5QcmVjb25kaXRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5QcmVjb25kaXRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtEZWZpbml0aW9uI2dldFByZWNvbmRpdGlvbigpCi0JICogQHNlZSAjZ2V0V29ya0RlZmluaXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFdvcmtEZWZpbml0aW9uX1ByZWNvbmRpdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtEZWZpbml0aW9uI2dldFBvc3Rjb25kaXRpb24gPGVtPlBvc3Rjb25kaXRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5Qb3N0Y29uZGl0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrRGVmaW5pdGlvbiNnZXRQb3N0Y29uZGl0aW9uKCkKLQkgKiBAc2VlICNnZXRXb3JrRGVmaW5pdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0V29ya0RlZmluaXRpb25fUG9zdGNvbmRpdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5TdGVwIDxlbT5TdGVwPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlN0ZXA8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlN0ZXAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFN0ZXAoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuR3VpZGFuY2UgPGVtPkd1aWRhbmNlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkd1aWRhbmNlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5HdWlkYW5jZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0R3VpZGFuY2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQXJ0aWZhY3QgPGVtPkFydGlmYWN0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkFydGlmYWN0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5BcnRpZmFjdAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0QXJ0aWZhY3QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbmVyIHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQXJ0aWZhY3QjZ2V0Q29udGFpbmVyQXJ0aWZhY3QgPGVtPkNvbnRhaW5lciBBcnRpZmFjdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5lciByZWZlcmVuY2UgJzxlbT5Db250YWluZXIgQXJ0aWZhY3Q8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkFydGlmYWN0I2dldENvbnRhaW5lckFydGlmYWN0KCkKLQkgKiBAc2VlICNnZXRBcnRpZmFjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0QXJ0aWZhY3RfQ29udGFpbmVyQXJ0aWZhY3QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkFydGlmYWN0I2dldENvbnRhaW5lZEFydGlmYWN0cyA8ZW0+Q29udGFpbmVkIEFydGlmYWN0czwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+Q29udGFpbmVkIEFydGlmYWN0czwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuQXJ0aWZhY3QjZ2V0Q29udGFpbmVkQXJ0aWZhY3RzKCkKLQkgKiBAc2VlICNnZXRBcnRpZmFjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0QXJ0aWZhY3RfQ29udGFpbmVkQXJ0aWZhY3RzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJhYmxlIDxlbT5EZWxpdmVyYWJsZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5EZWxpdmVyYWJsZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcmFibGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldERlbGl2ZXJhYmxlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyYWJsZSNnZXREZWxpdmVyZWRXb3JrUHJvZHVjdHMgPGVtPkRlbGl2ZXJlZCBXb3JrIFByb2R1Y3RzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJzxlbT5EZWxpdmVyZWQgV29yayBQcm9kdWN0czwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcmFibGUjZ2V0RGVsaXZlcmVkV29ya1Byb2R1Y3RzKCkKLQkgKiBAc2VlICNnZXREZWxpdmVyYWJsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0RGVsaXZlcmFibGVfRGVsaXZlcmVkV29ya1Byb2R1Y3RzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk91dGNvbWUgPGVtPk91dGNvbWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+T3V0Y29tZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuT3V0Y29tZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0T3V0Y29tZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQYWNrYWdlIDxlbT5NZXRob2QgUGFja2FnZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5NZXRob2QgUGFja2FnZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGFja2FnZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0TWV0aG9kUGFja2FnZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBhY2thZ2UjZ2V0R2xvYmFsIDxlbT5HbG9iYWw8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5HbG9iYWw8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBhY2thZ2UjZ2V0R2xvYmFsKCkKLQkgKiBAc2VlICNnZXRNZXRob2RQYWNrYWdlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRNZXRob2RQYWNrYWdlX0dsb2JhbCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGFja2FnZSNnZXRSZXVzZWRQYWNrYWdlcyA8ZW0+UmV1c2VkIFBhY2thZ2VzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJzxlbT5SZXVzZWQgUGFja2FnZXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBhY2thZ2UjZ2V0UmV1c2VkUGFja2FnZXMoKQotCSAqIEBzZWUgI2dldE1ldGhvZFBhY2thZ2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldE1ldGhvZFBhY2thZ2VfUmV1c2VkUGFja2FnZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBhY2thZ2UjZ2V0Q2hpbGRQYWNrYWdlcyA8ZW0+Q2hpbGQgUGFja2FnZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkNoaWxkIFBhY2thZ2VzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQYWNrYWdlI2dldENoaWxkUGFja2FnZXMoKQotCSAqIEBzZWUgI2dldE1ldGhvZFBhY2thZ2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldE1ldGhvZFBhY2thZ2VfQ2hpbGRQYWNrYWdlcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50UGFja2FnZSA8ZW0+Q29udGVudCBQYWNrYWdlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkNvbnRlbnQgUGFja2FnZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudFBhY2thZ2UKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldENvbnRlbnRQYWNrYWdlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50UGFja2FnZSNnZXRDb250ZW50RWxlbWVudHMgPGVtPkNvbnRlbnQgRWxlbWVudHM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkNvbnRlbnQgRWxlbWVudHM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRQYWNrYWdlI2dldENvbnRlbnRFbGVtZW50cygpCi0JICogQHNlZSAjZ2V0Q29udGVudFBhY2thZ2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldENvbnRlbnRQYWNrYWdlX0NvbnRlbnRFbGVtZW50cygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5BcnRpZmFjdERlc2NyaXB0aW9uIDxlbT5BcnRpZmFjdCBEZXNjcmlwdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5BcnRpZmFjdCBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuQXJ0aWZhY3REZXNjcmlwdGlvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0QXJ0aWZhY3REZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkFydGlmYWN0RGVzY3JpcHRpb24jZ2V0QnJpZWZPdXRsaW5lIDxlbT5CcmllZiBPdXRsaW5lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+QnJpZWYgT3V0bGluZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuQXJ0aWZhY3REZXNjcmlwdGlvbiNnZXRCcmllZk91dGxpbmUoKQotCSAqIEBzZWUgI2dldEFydGlmYWN0RGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEFydGlmYWN0RGVzY3JpcHRpb25fQnJpZWZPdXRsaW5lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQXJ0aWZhY3REZXNjcmlwdGlvbiNnZXRSZXByZXNlbnRhdGlvbk9wdGlvbnMgPGVtPlJlcHJlc2VudGF0aW9uIE9wdGlvbnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5SZXByZXNlbnRhdGlvbiBPcHRpb25zPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5BcnRpZmFjdERlc2NyaXB0aW9uI2dldFJlcHJlc2VudGF0aW9uT3B0aW9ucygpCi0JICogQHNlZSAjZ2V0QXJ0aWZhY3REZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QXJ0aWZhY3REZXNjcmlwdGlvbl9SZXByZXNlbnRhdGlvbk9wdGlvbnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5BcnRpZmFjdERlc2NyaXB0aW9uI2dldFJlcHJlc2VudGF0aW9uIDxlbT5SZXByZXNlbnRhdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlJlcHJlc2VudGF0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5BcnRpZmFjdERlc2NyaXB0aW9uI2dldFJlcHJlc2VudGF0aW9uKCkKLQkgKiBAc2VlICNnZXRBcnRpZmFjdERlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRBcnRpZmFjdERlc2NyaXB0aW9uX1JlcHJlc2VudGF0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQXJ0aWZhY3REZXNjcmlwdGlvbiNnZXROb3RhdGlvbiA8ZW0+Tm90YXRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Ob3RhdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuQXJ0aWZhY3REZXNjcmlwdGlvbiNnZXROb3RhdGlvbigpCi0JICogQHNlZSAjZ2V0QXJ0aWZhY3REZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QXJ0aWZhY3REZXNjcmlwdGlvbl9Ob3RhdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0aW9uIDxlbT5Xb3JrIFByb2R1Y3QgRGVzY3JpcHRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+V29yayBQcm9kdWN0IERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0aW9uCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRXb3JrUHJvZHVjdERlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdGlvbiNnZXRQdXJwb3NlIDxlbT5QdXJwb3NlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UHVycG9zZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdGlvbiNnZXRQdXJwb3NlKCkKLQkgKiBAc2VlICNnZXRXb3JrUHJvZHVjdERlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRXb3JrUHJvZHVjdERlc2NyaXB0aW9uX1B1cnBvc2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0aW9uI2dldEltcGFjdE9mTm90SGF2aW5nIDxlbT5JbXBhY3QgT2YgTm90IEhhdmluZzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkltcGFjdCBPZiBOb3QgSGF2aW5nPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0aW9uI2dldEltcGFjdE9mTm90SGF2aW5nKCkKLQkgKiBAc2VlICNnZXRXb3JrUHJvZHVjdERlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRXb3JrUHJvZHVjdERlc2NyaXB0aW9uX0ltcGFjdE9mTm90SGF2aW5nKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdGlvbiNnZXRSZWFzb25zRm9yTm90TmVlZGluZyA8ZW0+UmVhc29ucyBGb3IgTm90IE5lZWRpbmc8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5SZWFzb25zIEZvciBOb3QgTmVlZGluZzwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdGlvbiNnZXRSZWFzb25zRm9yTm90TmVlZGluZygpCi0JICogQHNlZSAjZ2V0V29ya1Byb2R1Y3REZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0V29ya1Byb2R1Y3REZXNjcmlwdGlvbl9SZWFzb25zRm9yTm90TmVlZGluZygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyYWJsZURlc2NyaXB0aW9uIDxlbT5EZWxpdmVyYWJsZSBEZXNjcmlwdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5EZWxpdmVyYWJsZSBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcmFibGVEZXNjcmlwdGlvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0RGVsaXZlcmFibGVEZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJhYmxlRGVzY3JpcHRpb24jZ2V0RXh0ZXJuYWxEZXNjcmlwdGlvbiA8ZW0+RXh0ZXJuYWwgRGVzY3JpcHRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5FeHRlcm5hbCBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcmFibGVEZXNjcmlwdGlvbiNnZXRFeHRlcm5hbERlc2NyaXB0aW9uKCkKLQkgKiBAc2VlICNnZXREZWxpdmVyYWJsZURlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXREZWxpdmVyYWJsZURlc2NyaXB0aW9uX0V4dGVybmFsRGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyYWJsZURlc2NyaXB0aW9uI2dldFBhY2thZ2luZ0d1aWRhbmNlIDxlbT5QYWNrYWdpbmcgR3VpZGFuY2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5QYWNrYWdpbmcgR3VpZGFuY2U8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJhYmxlRGVzY3JpcHRpb24jZ2V0UGFja2FnaW5nR3VpZGFuY2UoKQotCSAqIEBzZWUgI2dldERlbGl2ZXJhYmxlRGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldERlbGl2ZXJhYmxlRGVzY3JpcHRpb25fUGFja2FnaW5nR3VpZGFuY2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZURlc2NyaXB0aW9uIDxlbT5Sb2xlIERlc2NyaXB0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlJvbGUgRGVzY3JpcHRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdGlvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0Um9sZURlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZURlc2NyaXB0aW9uI2dldFNraWxscyA8ZW0+U2tpbGxzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+U2tpbGxzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRpb24jZ2V0U2tpbGxzKCkKLQkgKiBAc2VlICNnZXRSb2xlRGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFJvbGVEZXNjcmlwdGlvbl9Ta2lsbHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRpb24jZ2V0QXNzaWdubWVudEFwcHJvYWNoZXMgPGVtPkFzc2lnbm1lbnQgQXBwcm9hY2hlczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkFzc2lnbm1lbnQgQXBwcm9hY2hlczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZURlc2NyaXB0aW9uI2dldEFzc2lnbm1lbnRBcHByb2FjaGVzKCkKLQkgKiBAc2VlICNnZXRSb2xlRGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFJvbGVEZXNjcmlwdGlvbl9Bc3NpZ25tZW50QXBwcm9hY2hlcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdGlvbiNnZXRTeW5vbnltcyA8ZW0+U3lub255bXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5TeW5vbnltczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZURlc2NyaXB0aW9uI2dldFN5bm9ueW1zKCkKLQkgKiBAc2VlICNnZXRSb2xlRGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFJvbGVEZXNjcmlwdGlvbl9TeW5vbnltcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRpb24gPGVtPlRhc2sgRGVzY3JpcHRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+VGFzayBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0aW9uCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRUYXNrRGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRpb24jZ2V0UHVycG9zZSA8ZW0+UHVycG9zZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlB1cnBvc2U8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdGlvbiNnZXRQdXJwb3NlKCkKLQkgKiBAc2VlICNnZXRUYXNrRGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tEZXNjcmlwdGlvbl9QdXJwb3NlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0aW9uI2dldEFsdGVybmF0aXZlcyA8ZW0+QWx0ZXJuYXRpdmVzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+QWx0ZXJuYXRpdmVzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRpb24jZ2V0QWx0ZXJuYXRpdmVzKCkKLQkgKiBAc2VlICNnZXRUYXNrRGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tEZXNjcmlwdGlvbl9BbHRlcm5hdGl2ZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuR3VpZGFuY2VEZXNjcmlwdGlvbiA8ZW0+R3VpZGFuY2UgRGVzY3JpcHRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+R3VpZGFuY2UgRGVzY3JpcHRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkd1aWRhbmNlRGVzY3JpcHRpb24KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldEd1aWRhbmNlRGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5HdWlkYW5jZURlc2NyaXB0aW9uI2dldEF0dGFjaG1lbnRzIDxlbT5BdHRhY2htZW50czwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkF0dGFjaG1lbnRzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5HdWlkYW5jZURlc2NyaXB0aW9uI2dldEF0dGFjaG1lbnRzKCkKLQkgKiBAc2VlICNnZXRHdWlkYW5jZURlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRHdWlkYW5jZURlc2NyaXB0aW9uX0F0dGFjaG1lbnRzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlByYWN0aWNlRGVzY3JpcHRpb24gPGVtPlByYWN0aWNlIERlc2NyaXB0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlByYWN0aWNlIERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5QcmFjdGljZURlc2NyaXB0aW9uCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRQcmFjdGljZURlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJhY3RpY2VEZXNjcmlwdGlvbiNnZXRBZGRpdGlvbmFsSW5mbyA8ZW0+QWRkaXRpb25hbCBJbmZvPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+QWRkaXRpb25hbCBJbmZvPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5QcmFjdGljZURlc2NyaXB0aW9uI2dldEFkZGl0aW9uYWxJbmZvKCkKLQkgKiBAc2VlICNnZXRQcmFjdGljZURlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcmFjdGljZURlc2NyaXB0aW9uX0FkZGl0aW9uYWxJbmZvKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJhY3RpY2VEZXNjcmlwdGlvbiNnZXRQcm9ibGVtIDxlbT5Qcm9ibGVtPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UHJvYmxlbTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJhY3RpY2VEZXNjcmlwdGlvbiNnZXRQcm9ibGVtKCkKLQkgKiBAc2VlICNnZXRQcmFjdGljZURlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcmFjdGljZURlc2NyaXB0aW9uX1Byb2JsZW0oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5QcmFjdGljZURlc2NyaXB0aW9uI2dldEJhY2tncm91bmQgPGVtPkJhY2tncm91bmQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5CYWNrZ3JvdW5kPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5QcmFjdGljZURlc2NyaXB0aW9uI2dldEJhY2tncm91bmQoKQotCSAqIEBzZWUgI2dldFByYWN0aWNlRGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFByYWN0aWNlRGVzY3JpcHRpb25fQmFja2dyb3VuZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlByYWN0aWNlRGVzY3JpcHRpb24jZ2V0R29hbHMgPGVtPkdvYWxzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+R29hbHM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlByYWN0aWNlRGVzY3JpcHRpb24jZ2V0R29hbHMoKQotCSAqIEBzZWUgI2dldFByYWN0aWNlRGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFByYWN0aWNlRGVzY3JpcHRpb25fR29hbHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5QcmFjdGljZURlc2NyaXB0aW9uI2dldEFwcGxpY2F0aW9uIDxlbT5BcHBsaWNhdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkFwcGxpY2F0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5QcmFjdGljZURlc2NyaXB0aW9uI2dldEFwcGxpY2F0aW9uKCkKLQkgKiBAc2VlICNnZXRQcmFjdGljZURlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcmFjdGljZURlc2NyaXB0aW9uX0FwcGxpY2F0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJhY3RpY2VEZXNjcmlwdGlvbiNnZXRMZXZlbHNPZkFkb3B0aW9uIDxlbT5MZXZlbHMgT2YgQWRvcHRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5MZXZlbHMgT2YgQWRvcHRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlByYWN0aWNlRGVzY3JpcHRpb24jZ2V0TGV2ZWxzT2ZBZG9wdGlvbigpCi0JICogQHNlZSAjZ2V0UHJhY3RpY2VEZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UHJhY3RpY2VEZXNjcmlwdGlvbl9MZXZlbHNPZkFkb3B0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5IDxlbT5BY3Rpdml0eTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5BY3Rpdml0eTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldEFjdGl2aXR5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eSNnZXRCcmVha2Rvd25FbGVtZW50cyA8ZW0+QnJlYWtkb3duIEVsZW1lbnRzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJzxlbT5CcmVha2Rvd24gRWxlbWVudHM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5I2dldEJyZWFrZG93bkVsZW1lbnRzKCkKLQkgKiBAc2VlICNnZXRBY3Rpdml0eSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0QWN0aXZpdHlfQnJlYWtkb3duRWxlbWVudHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5I2dldFJvYWRtYXBzIDxlbT5Sb2FkbWFwczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICc8ZW0+Um9hZG1hcHM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5I2dldFJvYWRtYXBzKCkKLQkgKiBAc2VlICNnZXRBY3Rpdml0eSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0QWN0aXZpdHlfUm9hZG1hcHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya0JyZWFrZG93bkVsZW1lbnQgPGVtPldvcmsgQnJlYWtkb3duIEVsZW1lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+V29yayBCcmVha2Rvd24gRWxlbWVudDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya0JyZWFrZG93bkVsZW1lbnQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFdvcmtCcmVha2Rvd25FbGVtZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya0JyZWFrZG93bkVsZW1lbnQjZ2V0SXNSZXBlYXRhYmxlIDxlbT5JcyBSZXBlYXRhYmxlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SXMgUmVwZWF0YWJsZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya0JyZWFrZG93bkVsZW1lbnQjZ2V0SXNSZXBlYXRhYmxlKCkKLQkgKiBAc2VlICNnZXRXb3JrQnJlYWtkb3duRWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0V29ya0JyZWFrZG93bkVsZW1lbnRfSXNSZXBlYXRhYmxlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya0JyZWFrZG93bkVsZW1lbnQjZ2V0SXNPbmdvaW5nIDxlbT5JcyBPbmdvaW5nPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SXMgT25nb2luZzwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya0JyZWFrZG93bkVsZW1lbnQjZ2V0SXNPbmdvaW5nKCkKLQkgKiBAc2VlICNnZXRXb3JrQnJlYWtkb3duRWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0V29ya0JyZWFrZG93bkVsZW1lbnRfSXNPbmdvaW5nKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya0JyZWFrZG93bkVsZW1lbnQjZ2V0SXNFdmVudERyaXZlbiA8ZW0+SXMgRXZlbnQgRHJpdmVuPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SXMgRXZlbnQgRHJpdmVuPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrQnJlYWtkb3duRWxlbWVudCNnZXRJc0V2ZW50RHJpdmVuKCkKLQkgKiBAc2VlICNnZXRXb3JrQnJlYWtkb3duRWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0V29ya0JyZWFrZG93bkVsZW1lbnRfSXNFdmVudERyaXZlbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya0JyZWFrZG93bkVsZW1lbnQjZ2V0TGlua1RvUHJlZGVjZXNzb3IgPGVtPkxpbmsgVG8gUHJlZGVjZXNzb3I8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAnPGVtPkxpbmsgVG8gUHJlZGVjZXNzb3I8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtCcmVha2Rvd25FbGVtZW50I2dldExpbmtUb1ByZWRlY2Vzc29yKCkKLQkgKiBAc2VlICNnZXRXb3JrQnJlYWtkb3duRWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0V29ya0JyZWFrZG93bkVsZW1lbnRfTGlua1RvUHJlZGVjZXNzb3IoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudCA8ZW0+QnJlYWtkb3duIEVsZW1lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+QnJlYWtkb3duIEVsZW1lbnQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldEJyZWFrZG93bkVsZW1lbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50I2dldFByZWZpeCA8ZW0+UHJlZml4PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UHJlZml4PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50I2dldFByZWZpeCgpCi0JICogQHNlZSAjZ2V0QnJlYWtkb3duRWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QnJlYWtkb3duRWxlbWVudF9QcmVmaXgoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50I2dldElzUGxhbm5lZCA8ZW0+SXMgUGxhbm5lZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPklzIFBsYW5uZWQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQjZ2V0SXNQbGFubmVkKCkKLQkgKiBAc2VlICNnZXRCcmVha2Rvd25FbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRCcmVha2Rvd25FbGVtZW50X0lzUGxhbm5lZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQjZ2V0SGFzTXVsdGlwbGVPY2N1cnJlbmNlcyA8ZW0+SGFzIE11bHRpcGxlIE9jY3VycmVuY2VzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SGFzIE11bHRpcGxlIE9jY3VycmVuY2VzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50I2dldEhhc011bHRpcGxlT2NjdXJyZW5jZXMoKQotCSAqIEBzZWUgI2dldEJyZWFrZG93bkVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEJyZWFrZG93bkVsZW1lbnRfSGFzTXVsdGlwbGVPY2N1cnJlbmNlcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQjZ2V0SXNPcHRpb25hbCA8ZW0+SXMgT3B0aW9uYWw8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5JcyBPcHRpb25hbDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudCNnZXRJc09wdGlvbmFsKCkKLQkgKiBAc2VlICNnZXRCcmVha2Rvd25FbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRCcmVha2Rvd25FbGVtZW50X0lzT3B0aW9uYWwoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50I2dldFByZXNlbnRlZEFmdGVyIDxlbT5QcmVzZW50ZWQgQWZ0ZXI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJzxlbT5QcmVzZW50ZWQgQWZ0ZXI8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQjZ2V0UHJlc2VudGVkQWZ0ZXIoKQotCSAqIEBzZWUgI2dldEJyZWFrZG93bkVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldEJyZWFrZG93bkVsZW1lbnRfUHJlc2VudGVkQWZ0ZXIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50I2dldFByZXNlbnRlZEJlZm9yZSA8ZW0+UHJlc2VudGVkIEJlZm9yZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAnPGVtPlByZXNlbnRlZCBCZWZvcmU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQjZ2V0UHJlc2VudGVkQmVmb3JlKCkKLQkgKiBAc2VlICNnZXRCcmVha2Rvd25FbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRCcmVha2Rvd25FbGVtZW50X1ByZXNlbnRlZEJlZm9yZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQjZ2V0UGxhbm5pbmdEYXRhIDxlbT5QbGFubmluZyBEYXRhPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+UGxhbm5pbmcgRGF0YTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudCNnZXRQbGFubmluZ0RhdGEoKQotCSAqIEBzZWUgI2dldEJyZWFrZG93bkVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldEJyZWFrZG93bkVsZW1lbnRfUGxhbm5pbmdEYXRhKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudCNnZXRTdXBlckFjdGl2aXRpZXMgPGVtPlN1cGVyIEFjdGl2aXRpZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJzxlbT5TdXBlciBBY3Rpdml0aWVzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50I2dldFN1cGVyQWN0aXZpdGllcygpCi0JICogQHNlZSAjZ2V0QnJlYWtkb3duRWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0QnJlYWtkb3duRWxlbWVudF9TdXBlckFjdGl2aXRpZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQjZ2V0Q2hlY2tsaXN0cyA8ZW0+Q2hlY2tsaXN0czwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICc8ZW0+Q2hlY2tsaXN0czwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudCNnZXRDaGVja2xpc3RzKCkKLQkgKiBAc2VlICNnZXRCcmVha2Rvd25FbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRCcmVha2Rvd25FbGVtZW50X0NoZWNrbGlzdHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQjZ2V0Q29uY2VwdHMgPGVtPkNvbmNlcHRzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJzxlbT5Db25jZXB0czwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudCNnZXRDb25jZXB0cygpCi0JICogQHNlZSAjZ2V0QnJlYWtkb3duRWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0QnJlYWtkb3duRWxlbWVudF9Db25jZXB0cygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudCNnZXRFeGFtcGxlcyA8ZW0+RXhhbXBsZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAnPGVtPkV4YW1wbGVzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50I2dldEV4YW1wbGVzKCkKLQkgKiBAc2VlICNnZXRCcmVha2Rvd25FbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRCcmVha2Rvd25FbGVtZW50X0V4YW1wbGVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50I2dldEd1aWRlbGluZXMgPGVtPkd1aWRlbGluZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAnPGVtPkd1aWRlbGluZXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQjZ2V0R3VpZGVsaW5lcygpCi0JICogQHNlZSAjZ2V0QnJlYWtkb3duRWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0QnJlYWtkb3duRWxlbWVudF9HdWlkZWxpbmVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50I2dldFJldXNhYmxlQXNzZXRzIDxlbT5SZXVzYWJsZSBBc3NldHM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAnPGVtPlJldXNhYmxlIEFzc2V0czwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudCNnZXRSZXVzYWJsZUFzc2V0cygpCi0JICogQHNlZSAjZ2V0QnJlYWtkb3duRWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0QnJlYWtkb3duRWxlbWVudF9SZXVzYWJsZUFzc2V0cygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudCNnZXRTdXBwb3J0aW5nTWF0ZXJpYWxzIDxlbT5TdXBwb3J0aW5nIE1hdGVyaWFsczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICc8ZW0+U3VwcG9ydGluZyBNYXRlcmlhbHM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQjZ2V0U3VwcG9ydGluZ01hdGVyaWFscygpCi0JICogQHNlZSAjZ2V0QnJlYWtkb3duRWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0QnJlYWtkb3duRWxlbWVudF9TdXBwb3J0aW5nTWF0ZXJpYWxzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50I2dldFRlbXBsYXRlcyA8ZW0+VGVtcGxhdGVzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJzxlbT5UZW1wbGF0ZXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQjZ2V0VGVtcGxhdGVzKCkKLQkgKiBAc2VlICNnZXRCcmVha2Rvd25FbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRCcmVha2Rvd25FbGVtZW50X1RlbXBsYXRlcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudCNnZXRSZXBvcnRzIDxlbT5SZXBvcnRzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJzxlbT5SZXBvcnRzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50I2dldFJlcG9ydHMoKQotCSAqIEBzZWUgI2dldEJyZWFrZG93bkVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldEJyZWFrZG93bkVsZW1lbnRfUmVwb3J0cygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudCNnZXRFc3RpbWF0aW9uY29uc2lkZXJhdGlvbnMgPGVtPkVzdGltYXRpb25jb25zaWRlcmF0aW9uczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICc8ZW0+RXN0aW1hdGlvbmNvbnNpZGVyYXRpb25zPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50I2dldEVzdGltYXRpb25jb25zaWRlcmF0aW9ucygpCi0JICogQHNlZSAjZ2V0QnJlYWtkb3duRWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0QnJlYWtkb3duRWxlbWVudF9Fc3RpbWF0aW9uY29uc2lkZXJhdGlvbnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQjZ2V0VG9vbG1lbnRvciA8ZW0+VG9vbG1lbnRvcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICc8ZW0+VG9vbG1lbnRvcjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudCNnZXRUb29sbWVudG9yKCkKLQkgKiBAc2VlICNnZXRCcmVha2Rvd25FbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRCcmVha2Rvd25FbGVtZW50X1Rvb2xtZW50b3IoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWlsZXN0b25lIDxlbT5NaWxlc3RvbmU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+TWlsZXN0b25lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5NaWxlc3RvbmUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldE1pbGVzdG9uZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWlsZXN0b25lI2dldFJlcXVpcmVkUmVzdWx0cyA8ZW0+UmVxdWlyZWQgUmVzdWx0czwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICc8ZW0+UmVxdWlyZWQgUmVzdWx0czwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuTWlsZXN0b25lI2dldFJlcXVpcmVkUmVzdWx0cygpCi0JICogQHNlZSAjZ2V0TWlsZXN0b25lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRNaWxlc3RvbmVfUmVxdWlyZWRSZXN1bHRzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkl0ZXJhdGlvbiA8ZW0+SXRlcmF0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkl0ZXJhdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuSXRlcmF0aW9uCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRJdGVyYXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUGhhc2UgPGVtPlBoYXNlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlBoYXNlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5QaGFzZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0UGhhc2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVGVhbVByb2ZpbGUgPGVtPlRlYW0gUHJvZmlsZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5UZWFtIFByb2ZpbGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlRlYW1Qcm9maWxlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRUZWFtUHJvZmlsZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVGVhbVByb2ZpbGUjZ2V0VGVhbVJvbGVzIDxlbT5UZWFtIFJvbGVzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJzxlbT5UZWFtIFJvbGVzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZWFtUHJvZmlsZSNnZXRUZWFtUm9sZXMoKQotCSAqIEBzZWUgI2dldFRlYW1Qcm9maWxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRUZWFtUHJvZmlsZV9UZWFtUm9sZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZWFtUHJvZmlsZSNnZXRTdXBlclRlYW0gPGVtPlN1cGVyIFRlYW08L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJzxlbT5TdXBlciBUZWFtPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZWFtUHJvZmlsZSNnZXRTdXBlclRlYW0oKQotCSAqIEBzZWUgI2dldFRlYW1Qcm9maWxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRUZWFtUHJvZmlsZV9TdXBlclRlYW0oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlRlYW1Qcm9maWxlI2dldFN1YlRlYW0gPGVtPlN1YiBUZWFtPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJzxlbT5TdWIgVGVhbTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVGVhbVByb2ZpbGUjZ2V0U3ViVGVhbSgpCi0JICogQHNlZSAjZ2V0VGVhbVByb2ZpbGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFRlYW1Qcm9maWxlX1N1YlRlYW0oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZURlc2NyaXB0b3IgPGVtPlJvbGUgRGVzY3JpcHRvcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Sb2xlIERlc2NyaXB0b3I8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdG9yCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRSb2xlRGVzY3JpcHRvcigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdG9yI2dldFJvbGUgPGVtPlJvbGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJzxlbT5Sb2xlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRvciNnZXRSb2xlKCkKLQkgKiBAc2VlICNnZXRSb2xlRGVzY3JpcHRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0Um9sZURlc2NyaXB0b3JfUm9sZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZURlc2NyaXB0b3IjZ2V0TW9kaWZpZXMgPGVtPk1vZGlmaWVzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJzxlbT5Nb2RpZmllczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZURlc2NyaXB0b3IjZ2V0TW9kaWZpZXMoKQotCSAqIEBzZWUgI2dldFJvbGVEZXNjcmlwdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRSb2xlRGVzY3JpcHRvcl9Nb2RpZmllcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZURlc2NyaXB0b3IjZ2V0UmVzcG9uc2libGVGb3IgPGVtPlJlc3BvbnNpYmxlIEZvcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICc8ZW0+UmVzcG9uc2libGUgRm9yPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRvciNnZXRSZXNwb25zaWJsZUZvcigpCi0JICogQHNlZSAjZ2V0Um9sZURlc2NyaXB0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFJvbGVEZXNjcmlwdG9yX1Jlc3BvbnNpYmxlRm9yKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtPcmRlciA8ZW0+V29yayBPcmRlcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Xb3JrIE9yZGVyPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrT3JkZXIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFdvcmtPcmRlcigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtPcmRlciNnZXRMaW5rVHlwZSA8ZW0+TGluayBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TGluayBUeXBlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrT3JkZXIjZ2V0TGlua1R5cGUoKQotCSAqIEBzZWUgI2dldFdvcmtPcmRlcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0V29ya09yZGVyX0xpbmtUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya09yZGVyI2dldFByZWQgPGVtPlByZWQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJzxlbT5QcmVkPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrT3JkZXIjZ2V0UHJlZCgpCi0JICogQHNlZSAjZ2V0V29ya09yZGVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRXb3JrT3JkZXJfUHJlZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzRWxlbWVudCA8ZW0+UHJvY2VzcyBFbGVtZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlByb2Nlc3MgRWxlbWVudDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0VsZW1lbnQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFByb2Nlc3NFbGVtZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlBsYW5uaW5nRGF0YSA8ZW0+UGxhbm5pbmcgRGF0YTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5QbGFubmluZyBEYXRhPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5QbGFubmluZ0RhdGEKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFBsYW5uaW5nRGF0YSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlBsYW5uaW5nRGF0YSNnZXRTdGFydERhdGUgPGVtPlN0YXJ0IERhdGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5TdGFydCBEYXRlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5QbGFubmluZ0RhdGEjZ2V0U3RhcnREYXRlKCkKLQkgKiBAc2VlICNnZXRQbGFubmluZ0RhdGEoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFBsYW5uaW5nRGF0YV9TdGFydERhdGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5QbGFubmluZ0RhdGEjZ2V0RmluaXNoRGF0ZSA8ZW0+RmluaXNoIERhdGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5GaW5pc2ggRGF0ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuUGxhbm5pbmdEYXRhI2dldEZpbmlzaERhdGUoKQotCSAqIEBzZWUgI2dldFBsYW5uaW5nRGF0YSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UGxhbm5pbmdEYXRhX0ZpbmlzaERhdGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5QbGFubmluZ0RhdGEjZ2V0UmFuayA8ZW0+UmFuazwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlJhbms8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlBsYW5uaW5nRGF0YSNnZXRSYW5rKCkKLQkgKiBAc2VlICNnZXRQbGFubmluZ0RhdGEoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFBsYW5uaW5nRGF0YV9SYW5rKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaXB0b3IgPGVtPkRlc2NyaXB0b3I8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+RGVzY3JpcHRvcjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpcHRvcgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0RGVzY3JpcHRvcigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaXB0b3IjZ2V0SXNTeW5jaHJvbml6ZWRXaXRoU291cmNlIDxlbT5JcyBTeW5jaHJvbml6ZWQgV2l0aCBTb3VyY2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5JcyBTeW5jaHJvbml6ZWQgV2l0aCBTb3VyY2U8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaXB0b3IjZ2V0SXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKCkKLQkgKiBAc2VlICNnZXREZXNjcmlwdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXREZXNjcmlwdG9yX0lzU3luY2hyb25pemVkV2l0aFNvdXJjZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRvciA8ZW0+VGFzayBEZXNjcmlwdG9yPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlRhc2sgRGVzY3JpcHRvcjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0b3IKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFRhc2tEZXNjcmlwdG9yKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0b3IjZ2V0VGFzayA8ZW0+VGFzazwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAnPGVtPlRhc2s8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdG9yI2dldFRhc2soKQotCSAqIEBzZWUgI2dldFRhc2tEZXNjcmlwdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRUYXNrRGVzY3JpcHRvcl9UYXNrKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRvciNnZXRBZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSA8ZW0+QWRkaXRpb25hbGx5IFBlcmZvcm1lZCBCeTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICc8ZW0+QWRkaXRpb25hbGx5IFBlcmZvcm1lZCBCeTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0b3IjZ2V0QWRkaXRpb25hbGx5UGVyZm9ybWVkQnkoKQotCSAqIEBzZWUgI2dldFRhc2tEZXNjcmlwdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRUYXNrRGVzY3JpcHRvcl9BZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0b3IjZ2V0QXNzaXN0ZWRCeSA8ZW0+QXNzaXN0ZWQgQnk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAnPGVtPkFzc2lzdGVkIEJ5PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRvciNnZXRBc3Npc3RlZEJ5KCkKLQkgKiBAc2VlICNnZXRUYXNrRGVzY3JpcHRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0VGFza0Rlc2NyaXB0b3JfQXNzaXN0ZWRCeSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0b3IjZ2V0RXh0ZXJuYWxJbnB1dCA8ZW0+RXh0ZXJuYWwgSW5wdXQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAnPGVtPkV4dGVybmFsIElucHV0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRvciNnZXRFeHRlcm5hbElucHV0KCkKLQkgKiBAc2VlICNnZXRUYXNrRGVzY3JpcHRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0VGFza0Rlc2NyaXB0b3JfRXh0ZXJuYWxJbnB1dCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0b3IjZ2V0TWFuZGF0b3J5SW5wdXQgPGVtPk1hbmRhdG9yeSBJbnB1dDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICc8ZW0+TWFuZGF0b3J5IElucHV0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRvciNnZXRNYW5kYXRvcnlJbnB1dCgpCi0JICogQHNlZSAjZ2V0VGFza0Rlc2NyaXB0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFRhc2tEZXNjcmlwdG9yX01hbmRhdG9yeUlucHV0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRvciNnZXRPcHRpb25hbElucHV0IDxlbT5PcHRpb25hbCBJbnB1dDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICc8ZW0+T3B0aW9uYWwgSW5wdXQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdG9yI2dldE9wdGlvbmFsSW5wdXQoKQotCSAqIEBzZWUgI2dldFRhc2tEZXNjcmlwdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRUYXNrRGVzY3JpcHRvcl9PcHRpb25hbElucHV0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRvciNnZXRPdXRwdXQgPGVtPk91dHB1dDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICc8ZW0+T3V0cHV0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRvciNnZXRPdXRwdXQoKQotCSAqIEBzZWUgI2dldFRhc2tEZXNjcmlwdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRUYXNrRGVzY3JpcHRvcl9PdXRwdXQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdG9yI2dldFBlcmZvcm1lZFByaW1hcmlseUJ5IDxlbT5QZXJmb3JtZWQgUHJpbWFyaWx5IEJ5PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJzxlbT5QZXJmb3JtZWQgUHJpbWFyaWx5IEJ5PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRvciNnZXRQZXJmb3JtZWRQcmltYXJpbHlCeSgpCi0JICogQHNlZSAjZ2V0VGFza0Rlc2NyaXB0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFRhc2tEZXNjcmlwdG9yX1BlcmZvcm1lZFByaW1hcmlseUJ5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRvciNnZXRTZWxlY3RlZFN0ZXBzIDxlbT5TZWxlY3RlZCBTdGVwczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICc8ZW0+U2VsZWN0ZWQgU3RlcHM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdG9yI2dldFNlbGVjdGVkU3RlcHMoKQotCSAqIEBzZWUgI2dldFRhc2tEZXNjcmlwdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRUYXNrRGVzY3JpcHRvcl9TZWxlY3RlZFN0ZXBzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvciA8ZW0+V29yayBQcm9kdWN0IERlc2NyaXB0b3I8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+V29yayBQcm9kdWN0IERlc2NyaXB0b3I8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvcgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yI2dldEFjdGl2aXR5RW50cnlTdGF0ZSA8ZW0+QWN0aXZpdHkgRW50cnkgU3RhdGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5BY3Rpdml0eSBFbnRyeSBTdGF0ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yI2dldEFjdGl2aXR5RW50cnlTdGF0ZSgpCi0JICogQHNlZSAjZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JfQWN0aXZpdHlFbnRyeVN0YXRlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yI2dldEFjdGl2aXR5RXhpdFN0YXRlIDxlbT5BY3Rpdml0eSBFeGl0IFN0YXRlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+QWN0aXZpdHkgRXhpdCBTdGF0ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yI2dldEFjdGl2aXR5RXhpdFN0YXRlKCkKLQkgKiBAc2VlICNnZXRXb3JrUHJvZHVjdERlc2NyaXB0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9BY3Rpdml0eUV4aXRTdGF0ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvciNnZXRXb3JrUHJvZHVjdCA8ZW0+V29yayBQcm9kdWN0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICc8ZW0+V29yayBQcm9kdWN0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3IjZ2V0V29ya1Byb2R1Y3QoKQotCSAqIEBzZWUgI2dldFdvcmtQcm9kdWN0RGVzY3JpcHRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX1dvcmtQcm9kdWN0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3IjZ2V0SW1wYWN0ZWRCeSA8ZW0+SW1wYWN0ZWQgQnk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAnPGVtPkltcGFjdGVkIEJ5PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3IjZ2V0SW1wYWN0ZWRCeSgpCi0JICogQHNlZSAjZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JfSW1wYWN0ZWRCeSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yI2dldEltcGFjdHMgPGVtPkltcGFjdHM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAnPGVtPkltcGFjdHM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvciNnZXRJbXBhY3RzKCkKLQkgKiBAc2VlICNnZXRXb3JrUHJvZHVjdERlc2NyaXB0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9JbXBhY3RzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3IjZ2V0RGVsaXZlcmFibGVQYXJ0cyA8ZW0+RGVsaXZlcmFibGUgUGFydHM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAnPGVtPkRlbGl2ZXJhYmxlIFBhcnRzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3IjZ2V0RGVsaXZlcmFibGVQYXJ0cygpCi0JICogQHNlZSAjZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JfRGVsaXZlcmFibGVQYXJ0cygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db21wb3NpdGVSb2xlIDxlbT5Db21wb3NpdGUgUm9sZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Db21wb3NpdGUgUm9sZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuQ29tcG9zaXRlUm9sZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0Q29tcG9zaXRlUm9sZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQ29tcG9zaXRlUm9sZSNnZXRBZ2dyZWdhdGVkUm9sZXMgPGVtPkFnZ3JlZ2F0ZWQgUm9sZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAnPGVtPkFnZ3JlZ2F0ZWQgUm9sZXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbXBvc2l0ZVJvbGUjZ2V0QWdncmVnYXRlZFJvbGVzKCkKLQkgKiBAc2VlICNnZXRDb21wb3NpdGVSb2xlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRDb21wb3NpdGVSb2xlX0FnZ3JlZ2F0ZWRSb2xlcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24gPGVtPkJyZWFrZG93biBFbGVtZW50IERlc2NyaXB0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkJyZWFrZG93biBFbGVtZW50IERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldEJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbiNnZXRVc2FnZUd1aWRhbmNlIDxlbT5Vc2FnZSBHdWlkYW5jZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlVzYWdlIEd1aWRhbmNlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24jZ2V0VXNhZ2VHdWlkYW5jZSgpCi0JICogQHNlZSAjZ2V0QnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb25fVXNhZ2VHdWlkYW5jZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eURlc2NyaXB0aW9uIDxlbT5BY3Rpdml0eSBEZXNjcmlwdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5BY3Rpdml0eSBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHlEZXNjcmlwdGlvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0QWN0aXZpdHlEZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5RGVzY3JpcHRpb24jZ2V0UHVycG9zZSA8ZW0+UHVycG9zZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlB1cnBvc2U8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5RGVzY3JpcHRpb24jZ2V0UHVycG9zZSgpCi0JICogQHNlZSAjZ2V0QWN0aXZpdHlEZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QWN0aXZpdHlEZXNjcmlwdGlvbl9QdXJwb3NlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHlEZXNjcmlwdGlvbiNnZXRBbHRlcm5hdGl2ZXMgPGVtPkFsdGVybmF0aXZlczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkFsdGVybmF0aXZlczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHlEZXNjcmlwdGlvbiNnZXRBbHRlcm5hdGl2ZXMoKQotCSAqIEBzZWUgI2dldEFjdGl2aXR5RGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEFjdGl2aXR5RGVzY3JpcHRpb25fQWx0ZXJuYXRpdmVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHlEZXNjcmlwdGlvbiNnZXRIb3d0b1N0YWZmIDxlbT5Ib3d0byBTdGFmZjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkhvd3RvIFN0YWZmPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eURlc2NyaXB0aW9uI2dldEhvd3RvU3RhZmYoKQotCSAqIEBzZWUgI2dldEFjdGl2aXR5RGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEFjdGl2aXR5RGVzY3JpcHRpb25fSG93dG9TdGFmZigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbiA8ZW0+RGVsaXZlcnkgUHJvY2VzcyBEZXNjcmlwdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5EZWxpdmVyeSBQcm9jZXNzIERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbiNnZXRTY2FsZSA8ZW0+U2NhbGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5TY2FsZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24jZ2V0U2NhbGUoKQotCSAqIEBzZWUgI2dldERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXREZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl9TY2FsZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uI2dldFByb2plY3RDaGFyYWN0ZXJpc3RpY3MgPGVtPlByb2plY3QgQ2hhcmFjdGVyaXN0aWNzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UHJvamVjdCBDaGFyYWN0ZXJpc3RpY3M8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uI2dldFByb2plY3RDaGFyYWN0ZXJpc3RpY3MoKQotCSAqIEBzZWUgI2dldERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXREZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl9Qcm9qZWN0Q2hhcmFjdGVyaXN0aWNzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24jZ2V0Umlza0xldmVsIDxlbT5SaXNrIExldmVsPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UmlzayBMZXZlbDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24jZ2V0Umlza0xldmVsKCkKLQkgKiBAc2VlICNnZXREZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fUmlza0xldmVsKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24jZ2V0RXN0aW1hdGluZ1RlY2huaXF1ZSA8ZW0+RXN0aW1hdGluZyBUZWNobmlxdWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Fc3RpbWF0aW5nIFRlY2huaXF1ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24jZ2V0RXN0aW1hdGluZ1RlY2huaXF1ZSgpCi0JICogQHNlZSAjZ2V0RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX0VzdGltYXRpbmdUZWNobmlxdWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbiNnZXRQcm9qZWN0TWVtYmVyRXhwZXJ0aXNlIDxlbT5Qcm9qZWN0IE1lbWJlciBFeHBlcnRpc2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Qcm9qZWN0IE1lbWJlciBFeHBlcnRpc2U8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uI2dldFByb2plY3RNZW1iZXJFeHBlcnRpc2UoKQotCSAqIEBzZWUgI2dldERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXREZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl9Qcm9qZWN0TWVtYmVyRXhwZXJ0aXNlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24jZ2V0VHlwZU9mQ29udHJhY3QgPGVtPlR5cGUgT2YgQ29udHJhY3Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5UeXBlIE9mIENvbnRyYWN0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbiNnZXRUeXBlT2ZDb250cmFjdCgpCi0JICogQHNlZSAjZ2V0RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX1R5cGVPZkNvbnRyYWN0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NEZXNjcmlwdGlvbiA8ZW0+UHJvY2VzcyBEZXNjcmlwdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Qcm9jZXNzIERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzRGVzY3JpcHRpb24KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFByb2Nlc3NEZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NEZXNjcmlwdGlvbiNnZXRTY29wZSA8ZW0+U2NvcGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5TY29wZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0Rlc2NyaXB0aW9uI2dldFNjb3BlKCkKLQkgKiBAc2VlICNnZXRQcm9jZXNzRGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFByb2Nlc3NEZXNjcmlwdGlvbl9TY29wZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NEZXNjcmlwdGlvbiNnZXRVc2FnZU5vdGVzIDxlbT5Vc2FnZSBOb3RlczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlVzYWdlIE5vdGVzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzRGVzY3JpcHRpb24jZ2V0VXNhZ2VOb3RlcygpCi0JICogQHNlZSAjZ2V0UHJvY2Vzc0Rlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcm9jZXNzRGVzY3JpcHRpb25fVXNhZ2VOb3RlcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmlwdG9yRGVzY3JpcHRpb24gPGVtPkRlc2NyaXB0b3IgRGVzY3JpcHRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+RGVzY3JpcHRvciBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpcHRvckRlc2NyaXB0aW9uCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXREZXNjcmlwdG9yRGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmlwdG9yRGVzY3JpcHRpb24jZ2V0UmVmaW5lZERlc2NyaXB0aW9uIDxlbT5SZWZpbmVkIERlc2NyaXB0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UmVmaW5lZCBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpcHRvckRlc2NyaXB0aW9uI2dldFJlZmluZWREZXNjcmlwdGlvbigpCi0JICogQHNlZSAjZ2V0RGVzY3JpcHRvckRlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXREZXNjcmlwdG9yRGVzY3JpcHRpb25fUmVmaW5lZERlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbmNlcHQgPGVtPkNvbmNlcHQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+Q29uY2VwdDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuQ29uY2VwdAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0Q29uY2VwdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5DaGVja2xpc3QgPGVtPkNoZWNrbGlzdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5DaGVja2xpc3Q8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkNoZWNrbGlzdAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0Q2hlY2tsaXN0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkV4YW1wbGUgPGVtPkV4YW1wbGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+RXhhbXBsZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuRXhhbXBsZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0RXhhbXBsZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5HdWlkZWxpbmUgPGVtPkd1aWRlbGluZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5HdWlkZWxpbmU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkd1aWRlbGluZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0R3VpZGVsaW5lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkVzdGltYXRpb25Db25zaWRlcmF0aW9ucyA8ZW0+RXN0aW1hdGlvbiBDb25zaWRlcmF0aW9uczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Fc3RpbWF0aW9uIENvbnNpZGVyYXRpb25zPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldEVzdGltYXRpb25Db25zaWRlcmF0aW9ucygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5SZXBvcnQgPGVtPlJlcG9ydDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5SZXBvcnQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlJlcG9ydAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0UmVwb3J0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlRlbXBsYXRlIDxlbT5UZW1wbGF0ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5UZW1wbGF0ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVGVtcGxhdGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFRlbXBsYXRlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlN1cHBvcnRpbmdNYXRlcmlhbCA8ZW0+U3VwcG9ydGluZyBNYXRlcmlhbDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5TdXBwb3J0aW5nIE1hdGVyaWFsPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5TdXBwb3J0aW5nTWF0ZXJpYWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFN1cHBvcnRpbmdNYXRlcmlhbCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Ub29sTWVudG9yIDxlbT5Ub29sIE1lbnRvcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Ub29sIE1lbnRvcjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVG9vbE1lbnRvcgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0VG9vbE1lbnRvcigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5XaGl0ZXBhcGVyIDxlbT5XaGl0ZXBhcGVyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPldoaXRlcGFwZXI8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLldoaXRlcGFwZXIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFdoaXRlcGFwZXIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVGVybURlZmluaXRpb24gPGVtPlRlcm0gRGVmaW5pdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5UZXJtIERlZmluaXRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlRlcm1EZWZpbml0aW9uCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRUZXJtRGVmaW5pdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5BcHBsaWNhYmxlTWV0YUNsYXNzSW5mbyA8ZW0+QXBwbGljYWJsZSBNZXRhIENsYXNzIEluZm88L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+QXBwbGljYWJsZSBNZXRhIENsYXNzIEluZm88L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRBcHBsaWNhYmxlTWV0YUNsYXNzSW5mbygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvI2dldElzUHJpbWFyeUV4dGVuc2lvbiA8ZW0+SXMgUHJpbWFyeSBFeHRlbnNpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5JcyBQcmltYXJ5IEV4dGVuc2lvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuQXBwbGljYWJsZU1ldGFDbGFzc0luZm8jZ2V0SXNQcmltYXJ5RXh0ZW5zaW9uKCkKLQkgKiBAc2VlICNnZXRBcHBsaWNhYmxlTWV0YUNsYXNzSW5mbygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QXBwbGljYWJsZU1ldGFDbGFzc0luZm9fSXNQcmltYXJ5RXh0ZW5zaW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlByYWN0aWNlIDxlbT5QcmFjdGljZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5QcmFjdGljZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJhY3RpY2UKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFByYWN0aWNlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5QcmFjdGljZSNnZXRTdWJQcmFjdGljZXMgPGVtPlN1YiBQcmFjdGljZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPlN1YiBQcmFjdGljZXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlByYWN0aWNlI2dldFN1YlByYWN0aWNlcygpCi0JICogQHNlZSAjZ2V0UHJhY3RpY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFByYWN0aWNlX1N1YlByYWN0aWNlcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJhY3RpY2UjZ2V0Q29udGVudFJlZmVyZW5jZXMgPGVtPkNvbnRlbnQgUmVmZXJlbmNlczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICc8ZW0+Q29udGVudCBSZWZlcmVuY2VzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5QcmFjdGljZSNnZXRDb250ZW50UmVmZXJlbmNlcygpCi0JICogQHNlZSAjZ2V0UHJhY3RpY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFByYWN0aWNlX0NvbnRlbnRSZWZlcmVuY2VzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5QcmFjdGljZSNnZXRBY3Rpdml0eVJlZmVyZW5jZXMgPGVtPkFjdGl2aXR5IFJlZmVyZW5jZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAnPGVtPkFjdGl2aXR5IFJlZmVyZW5jZXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlByYWN0aWNlI2dldEFjdGl2aXR5UmVmZXJlbmNlcygpCi0JICogQHNlZSAjZ2V0UHJhY3RpY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFByYWN0aWNlX0FjdGl2aXR5UmVmZXJlbmNlcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5SZXVzYWJsZUFzc2V0IDxlbT5SZXVzYWJsZSBBc3NldDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5SZXVzYWJsZSBBc3NldDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuUmV1c2FibGVBc3NldAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0UmV1c2FibGVBc3NldCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaXNjaXBsaW5lIDxlbT5EaXNjaXBsaW5lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkRpc2NpcGxpbmU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkRpc2NpcGxpbmUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldERpc2NpcGxpbmUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRpc2NpcGxpbmUjZ2V0VGFza3MgPGVtPlRhc2tzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJzxlbT5UYXNrczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlzY2lwbGluZSNnZXRUYXNrcygpCi0JICogQHNlZSAjZ2V0RGlzY2lwbGluZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0RGlzY2lwbGluZV9UYXNrcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlzY2lwbGluZSNnZXRTdWJkaXNjaXBsaW5lIDxlbT5TdWJkaXNjaXBsaW5lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5TdWJkaXNjaXBsaW5lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaXNjaXBsaW5lI2dldFN1YmRpc2NpcGxpbmUoKQotCSAqIEBzZWUgI2dldERpc2NpcGxpbmUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldERpc2NpcGxpbmVfU3ViZGlzY2lwbGluZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlzY2lwbGluZSNnZXRSZWZlcmVuY2VXb3JrZmxvd3MgPGVtPlJlZmVyZW5jZSBXb3JrZmxvd3M8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAnPGVtPlJlZmVyZW5jZSBXb3JrZmxvd3M8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkRpc2NpcGxpbmUjZ2V0UmVmZXJlbmNlV29ya2Zsb3dzKCkKLQkgKiBAc2VlICNnZXREaXNjaXBsaW5lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXREaXNjaXBsaW5lX1JlZmVyZW5jZVdvcmtmbG93cygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50Q2F0ZWdvcnkgPGVtPkNvbnRlbnQgQ2F0ZWdvcnk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+Q29udGVudCBDYXRlZ29yeTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudENhdGVnb3J5Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRDb250ZW50Q2F0ZWdvcnkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZVNldCA8ZW0+Um9sZSBTZXQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+Um9sZSBTZXQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVTZXQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFJvbGVTZXQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVTZXQjZ2V0Um9sZXMgPGVtPlJvbGVzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJzxlbT5Sb2xlczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZVNldCNnZXRSb2xlcygpCi0JICogQHNlZSAjZ2V0Um9sZVNldCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0Um9sZVNldF9Sb2xlcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Eb21haW4gPGVtPkRvbWFpbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Eb21haW48L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkRvbWFpbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0RG9tYWluKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Eb21haW4jZ2V0V29ya1Byb2R1Y3RzIDxlbT5Xb3JrIFByb2R1Y3RzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJzxlbT5Xb3JrIFByb2R1Y3RzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Eb21haW4jZ2V0V29ya1Byb2R1Y3RzKCkKLQkgKiBAc2VlICNnZXREb21haW4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldERvbWFpbl9Xb3JrUHJvZHVjdHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRvbWFpbiNnZXRTdWJkb21haW5zIDxlbT5TdWJkb21haW5zPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5TdWJkb21haW5zPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Eb21haW4jZ2V0U3ViZG9tYWlucygpCi0JICogQHNlZSAjZ2V0RG9tYWluKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXREb21haW5fU3ViZG9tYWlucygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdFR5cGUgPGVtPldvcmsgUHJvZHVjdCBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPldvcmsgUHJvZHVjdCBUeXBlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdFR5cGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFdvcmtQcm9kdWN0VHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3RUeXBlI2dldFdvcmtQcm9kdWN0cyA8ZW0+V29yayBQcm9kdWN0czwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICc8ZW0+V29yayBQcm9kdWN0czwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3RUeXBlI2dldFdvcmtQcm9kdWN0cygpCi0JICogQHNlZSAjZ2V0V29ya1Byb2R1Y3RUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRXb3JrUHJvZHVjdFR5cGVfV29ya1Byb2R1Y3RzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRpc2NpcGxpbmVHcm91cGluZyA8ZW0+RGlzY2lwbGluZSBHcm91cGluZzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5EaXNjaXBsaW5lIEdyb3VwaW5nPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaXNjaXBsaW5lR3JvdXBpbmcKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldERpc2NpcGxpbmVHcm91cGluZygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlzY2lwbGluZUdyb3VwaW5nI2dldERpc2NpcGxpbmVzIDxlbT5EaXNjaXBsaW5lczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICc8ZW0+RGlzY2lwbGluZXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkRpc2NpcGxpbmVHcm91cGluZyNnZXREaXNjaXBsaW5lcygpCi0JICogQHNlZSAjZ2V0RGlzY2lwbGluZUdyb3VwaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXREaXNjaXBsaW5lR3JvdXBpbmdfRGlzY2lwbGluZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVG9vbCA8ZW0+VG9vbDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Ub29sPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Ub29sCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRUb29sKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Ub29sI2dldFRvb2xNZW50b3JzIDxlbT5Ub29sIE1lbnRvcnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAnPGVtPlRvb2wgTWVudG9yczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVG9vbCNnZXRUb29sTWVudG9ycygpCi0JICogQHNlZSAjZ2V0VG9vbCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0VG9vbF9Ub29sTWVudG9ycygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlU2V0R3JvdXBpbmcgPGVtPlJvbGUgU2V0IEdyb3VwaW5nPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlJvbGUgU2V0IEdyb3VwaW5nPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlU2V0R3JvdXBpbmcKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFJvbGVTZXRHcm91cGluZygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZVNldEdyb3VwaW5nI2dldFJvbGVTZXRzIDxlbT5Sb2xlIFNldHM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAnPGVtPlJvbGUgU2V0czwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZVNldEdyb3VwaW5nI2dldFJvbGVTZXRzKCkKLQkgKiBAc2VlICNnZXRSb2xlU2V0R3JvdXBpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFJvbGVTZXRHcm91cGluZ19Sb2xlU2V0cygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5DdXN0b21DYXRlZ29yeSA8ZW0+Q3VzdG9tIENhdGVnb3J5PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkN1c3RvbSBDYXRlZ29yeTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuQ3VzdG9tQ2F0ZWdvcnkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldEN1c3RvbUNhdGVnb3J5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5DdXN0b21DYXRlZ29yeSNnZXRDYXRlZ29yaXplZEVsZW1lbnRzIDxlbT5DYXRlZ29yaXplZCBFbGVtZW50czwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICc8ZW0+Q2F0ZWdvcml6ZWQgRWxlbWVudHM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkN1c3RvbUNhdGVnb3J5I2dldENhdGVnb3JpemVkRWxlbWVudHMoKQotCSAqIEBzZWUgI2dldEN1c3RvbUNhdGVnb3J5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRDdXN0b21DYXRlZ29yeV9DYXRlZ29yaXplZEVsZW1lbnRzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5DdXN0b21DYXRlZ29yeSNnZXRTdWJDYXRlZ29yaWVzIDxlbT5TdWIgQ2F0ZWdvcmllczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICc8ZW0+U3ViIENhdGVnb3JpZXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkN1c3RvbUNhdGVnb3J5I2dldFN1YkNhdGVnb3JpZXMoKQotCSAqIEBzZWUgI2dldEN1c3RvbUNhdGVnb3J5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRDdXN0b21DYXRlZ29yeV9TdWJDYXRlZ29yaWVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJ5UHJvY2VzcyA8ZW0+RGVsaXZlcnkgUHJvY2VzczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5EZWxpdmVyeSBQcm9jZXNzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyeVByb2Nlc3MKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldERlbGl2ZXJ5UHJvY2VzcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcnlQcm9jZXNzI2dldEVkdWNhdGlvbk1hdGVyaWFscyA8ZW0+RWR1Y2F0aW9uIE1hdGVyaWFsczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICc8ZW0+RWR1Y2F0aW9uIE1hdGVyaWFsczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcnlQcm9jZXNzI2dldEVkdWNhdGlvbk1hdGVyaWFscygpCi0JICogQHNlZSAjZ2V0RGVsaXZlcnlQcm9jZXNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXREZWxpdmVyeVByb2Nlc3NfRWR1Y2F0aW9uTWF0ZXJpYWxzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyeVByb2Nlc3MjZ2V0Q29tbXVuaWNhdGlvbnNNYXRlcmlhbHMgPGVtPkNvbW11bmljYXRpb25zIE1hdGVyaWFsczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICc8ZW0+Q29tbXVuaWNhdGlvbnMgTWF0ZXJpYWxzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyeVByb2Nlc3MjZ2V0Q29tbXVuaWNhdGlvbnNNYXRlcmlhbHMoKQotCSAqIEBzZWUgI2dldERlbGl2ZXJ5UHJvY2VzcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0RGVsaXZlcnlQcm9jZXNzX0NvbW11bmljYXRpb25zTWF0ZXJpYWxzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3MgPGVtPlByb2Nlc3M8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+UHJvY2VzczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzcwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0UHJvY2VzcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzcyNnZXRJbmNsdWRlc1BhdHRlcm5zIDxlbT5JbmNsdWRlcyBQYXR0ZXJuczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICc8ZW0+SW5jbHVkZXMgUGF0dGVybnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3MjZ2V0SW5jbHVkZXNQYXR0ZXJucygpCi0JICogQHNlZSAjZ2V0UHJvY2VzcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0UHJvY2Vzc19JbmNsdWRlc1BhdHRlcm5zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzcyNnZXREZWZhdWx0Q29udGV4dCA8ZW0+RGVmYXVsdCBDb250ZXh0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICc8ZW0+RGVmYXVsdCBDb250ZXh0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzI2dldERlZmF1bHRDb250ZXh0KCkKLQkgKiBAc2VlICNnZXRQcm9jZXNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRQcm9jZXNzX0RlZmF1bHRDb250ZXh0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzI2dldFZhbGlkQ29udGV4dCA8ZW0+VmFsaWQgQ29udGV4dDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICc8ZW0+VmFsaWQgQ29udGV4dDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzcyNnZXRWYWxpZENvbnRleHQoKQotCSAqIEBzZWUgI2dldFByb2Nlc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFByb2Nlc3NfVmFsaWRDb250ZXh0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkNhcGFiaWxpdHlQYXR0ZXJuIDxlbT5DYXBhYmlsaXR5IFBhdHRlcm48L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+Q2FwYWJpbGl0eSBQYXR0ZXJuPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5DYXBhYmlsaXR5UGF0dGVybgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0Q2FwYWJpbGl0eVBhdHRlcm4oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUgPGVtPlByb2Nlc3MgUGxhbm5pbmcgVGVtcGxhdGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+UHJvY2VzcyBQbGFubmluZyBUZW1wbGF0ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFByb2Nlc3NQbGFubmluZ1RlbXBsYXRlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSNnZXRCYXNlZE9uUHJvY2Vzc2VzIDxlbT5CYXNlZCBPbiBQcm9jZXNzZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAnPGVtPkJhc2VkIE9uIFByb2Nlc3NlczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUjZ2V0QmFzZWRPblByb2Nlc3NlcygpCi0JICogQHNlZSAjZ2V0UHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFByb2Nlc3NQbGFubmluZ1RlbXBsYXRlX0Jhc2VkT25Qcm9jZXNzZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUm9hZG1hcCA8ZW0+Um9hZG1hcDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Sb2FkbWFwPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2FkbWFwCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRSb2FkbWFwKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnQgPGVtPlByb2Nlc3MgQ29tcG9uZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlByb2Nlc3MgQ29tcG9uZW50PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRQcm9jZXNzQ29tcG9uZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50I2dldEludGVyZmFjZXMgPGVtPkludGVyZmFjZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAnPGVtPkludGVyZmFjZXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnQjZ2V0SW50ZXJmYWNlcygpCi0JICogQHNlZSAjZ2V0UHJvY2Vzc0NvbXBvbmVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0UHJvY2Vzc0NvbXBvbmVudF9JbnRlcmZhY2VzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudCNnZXRQcm9jZXNzIDxlbT5Qcm9jZXNzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+UHJvY2VzczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudCNnZXRQcm9jZXNzKCkKLQkgKiBAc2VlICNnZXRQcm9jZXNzQ29tcG9uZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRQcm9jZXNzQ29tcG9uZW50X1Byb2Nlc3MoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc1BhY2thZ2UgPGVtPlByb2Nlc3MgUGFja2FnZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Qcm9jZXNzIFBhY2thZ2U8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NQYWNrYWdlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRQcm9jZXNzUGFja2FnZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc1BhY2thZ2UjZ2V0UHJvY2Vzc0VsZW1lbnRzIDxlbT5Qcm9jZXNzIEVsZW1lbnRzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5Qcm9jZXNzIEVsZW1lbnRzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzUGFja2FnZSNnZXRQcm9jZXNzRWxlbWVudHMoKQotCSAqIEBzZWUgI2dldFByb2Nlc3NQYWNrYWdlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRQcm9jZXNzUGFja2FnZV9Qcm9jZXNzRWxlbWVudHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NQYWNrYWdlI2dldERpYWdyYW1zIDxlbT5EaWFncmFtczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+RGlhZ3JhbXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NQYWNrYWdlI2dldERpYWdyYW1zKCkKLQkgKiBAc2VlICNnZXRQcm9jZXNzUGFja2FnZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0UHJvY2Vzc1BhY2thZ2VfRGlhZ3JhbXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSA8ZW0+UHJvY2VzcyBDb21wb25lbnQgSW50ZXJmYWNlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlByb2Nlc3MgQ29tcG9uZW50IEludGVyZmFjZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0UHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSNnZXRJbnRlcmZhY2VTcGVjaWZpY2F0aW9ucyA8ZW0+SW50ZXJmYWNlIFNwZWNpZmljYXRpb25zPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5JbnRlcmZhY2UgU3BlY2lmaWNhdGlvbnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UjZ2V0SW50ZXJmYWNlU3BlY2lmaWNhdGlvbnMoKQotCSAqIEBzZWUgI2dldFByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VfSW50ZXJmYWNlU3BlY2lmaWNhdGlvbnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UjZ2V0SW50ZXJmYWNlSU8gPGVtPkludGVyZmFjZSBJTzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+SW50ZXJmYWNlIElPPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlI2dldEludGVyZmFjZUlPKCkKLQkgKiBAc2VlICNnZXRQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlX0ludGVyZmFjZUlPKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnREZXNjcmlwdG9yIDxlbT5Qcm9jZXNzIENvbXBvbmVudCBEZXNjcmlwdG9yPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlByb2Nlc3MgQ29tcG9uZW50IERlc2NyaXB0b3I8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnREZXNjcmlwdG9yCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRQcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvcigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnREZXNjcmlwdG9yI2dldF9wcm9jZXNzQ29tcG9uZW50IDxlbT5wcm9jZXNzIENvbXBvbmVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAnPGVtPnByb2Nlc3MgQ29tcG9uZW50PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvciNnZXRfcHJvY2Vzc0NvbXBvbmVudCgpCi0JICogQHNlZSAjZ2V0UHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFByb2Nlc3NDb21wb25lbnREZXNjcmlwdG9yX19wcm9jZXNzQ29tcG9uZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbiA8ZW0+TWV0aG9kIFBsdWdpbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5NZXRob2QgUGx1Z2luPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldE1ldGhvZFBsdWdpbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbiNnZXRVc2VyQ2hhbmdlYWJsZSA8ZW0+VXNlciBDaGFuZ2VhYmxlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VXNlciBDaGFuZ2VhYmxlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW4jZ2V0VXNlckNoYW5nZWFibGUoKQotCSAqIEBzZWUgI2dldE1ldGhvZFBsdWdpbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0TWV0aG9kUGx1Z2luX1VzZXJDaGFuZ2VhYmxlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW4jZ2V0TWV0aG9kUGFja2FnZXMgPGVtPk1ldGhvZCBQYWNrYWdlczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+TWV0aG9kIFBhY2thZ2VzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW4jZ2V0TWV0aG9kUGFja2FnZXMoKQotCSAqIEBzZWUgI2dldE1ldGhvZFBsdWdpbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0TWV0aG9kUGx1Z2luX01ldGhvZFBhY2thZ2VzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW4jZ2V0QmFzZXMgPGVtPkJhc2VzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJzxlbT5CYXNlczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luI2dldEJhc2VzKCkKLQkgKiBAc2VlICNnZXRNZXRob2RQbHVnaW4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldE1ldGhvZFBsdWdpbl9CYXNlcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbiNpc1N1cHBvcnRpbmcgPGVtPlN1cHBvcnRpbmc8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5TdXBwb3J0aW5nPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW4jaXNTdXBwb3J0aW5nKCkKLQkgKiBAc2VlICNnZXRNZXRob2RQbHVnaW4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldE1ldGhvZFBsdWdpbl9TdXBwb3J0aW5nKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudCA8ZW0+VmFyaWFiaWxpdHkgRWxlbWVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5WYXJpYWJpbGl0eSBFbGVtZW50PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFZhcmlhYmlsaXR5RWxlbWVudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudCNnZXRWYXJpYWJpbGl0eVR5cGUgPGVtPlZhcmlhYmlsaXR5IFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5WYXJpYWJpbGl0eSBUeXBlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQjZ2V0VmFyaWFiaWxpdHlUeXBlKCkKLQkgKiBAc2VlICNnZXRWYXJpYWJpbGl0eUVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFZhcmlhYmlsaXR5RWxlbWVudF9WYXJpYWJpbGl0eVR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQjZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCA8ZW0+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAnPGVtPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudCNnZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkKLQkgKiBAc2VlICNnZXRWYXJpYWJpbGl0eUVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFZhcmlhYmlsaXR5RWxlbWVudF9WYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFVuaXQgPGVtPk1ldGhvZCBVbml0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPk1ldGhvZCBVbml0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RVbml0Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRNZXRob2RVbml0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kVW5pdCNnZXRBdXRob3JzIDxlbT5BdXRob3JzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+QXV0aG9yczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kVW5pdCNnZXRBdXRob3JzKCkKLQkgKiBAc2VlICNnZXRNZXRob2RVbml0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRNZXRob2RVbml0X0F1dGhvcnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RVbml0I2dldENoYW5nZURhdGUgPGVtPkNoYW5nZSBEYXRlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Q2hhbmdlIERhdGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFVuaXQjZ2V0Q2hhbmdlRGF0ZSgpCi0JICogQHNlZSAjZ2V0TWV0aG9kVW5pdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0TWV0aG9kVW5pdF9DaGFuZ2VEYXRlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kVW5pdCNnZXRDaGFuZ2VEZXNjcmlwdGlvbiA8ZW0+Q2hhbmdlIERlc2NyaXB0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Q2hhbmdlIERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RVbml0I2dldENoYW5nZURlc2NyaXB0aW9uKCkKLQkgKiBAc2VlICNnZXRNZXRob2RVbml0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRNZXRob2RVbml0X0NoYW5nZURlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kVW5pdCNnZXRWZXJzaW9uIDxlbT5WZXJzaW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VmVyc2lvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kVW5pdCNnZXRWZXJzaW9uKCkKLQkgKiBAc2VlICNnZXRNZXRob2RVbml0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRNZXRob2RVbml0X1ZlcnNpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RVbml0I2dldENvcHlyaWdodFN0YXRlbWVudCA8ZW0+Q29weXJpZ2h0IFN0YXRlbWVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAnPGVtPkNvcHlyaWdodCBTdGF0ZW1lbnQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFVuaXQjZ2V0Q29weXJpZ2h0U3RhdGVtZW50KCkKLQkgKiBAc2VlICNnZXRNZXRob2RVbml0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRNZXRob2RVbml0X0NvcHlyaWdodFN0YXRlbWVudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uIDxlbT5NZXRob2QgQ29uZmlndXJhdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5NZXRob2QgQ29uZmlndXJhdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0TWV0aG9kQ29uZmlndXJhdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbiNnZXRNZXRob2RQbHVnaW5TZWxlY3Rpb24gPGVtPk1ldGhvZCBQbHVnaW4gU2VsZWN0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJzxlbT5NZXRob2QgUGx1Z2luIFNlbGVjdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbiNnZXRNZXRob2RQbHVnaW5TZWxlY3Rpb24oKQotCSAqIEBzZWUgI2dldE1ldGhvZENvbmZpZ3VyYXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldE1ldGhvZENvbmZpZ3VyYXRpb25fTWV0aG9kUGx1Z2luU2VsZWN0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uI2dldE1ldGhvZFBhY2thZ2VTZWxlY3Rpb24gPGVtPk1ldGhvZCBQYWNrYWdlIFNlbGVjdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICc8ZW0+TWV0aG9kIFBhY2thZ2UgU2VsZWN0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uI2dldE1ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKQotCSAqIEBzZWUgI2dldE1ldGhvZENvbmZpZ3VyYXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldE1ldGhvZENvbmZpZ3VyYXRpb25fTWV0aG9kUGFja2FnZVNlbGVjdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbiNnZXRQcm9jZXNzVmlld3MgPGVtPlByb2Nlc3MgVmlld3M8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAnPGVtPlByb2Nlc3MgVmlld3M8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb24jZ2V0UHJvY2Vzc1ZpZXdzKCkKLQkgKiBAc2VlICNnZXRNZXRob2RDb25maWd1cmF0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRNZXRob2RDb25maWd1cmF0aW9uX1Byb2Nlc3NWaWV3cygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb24jZ2V0RGVmYXVsdFZpZXcgPGVtPkRlZmF1bHQgVmlldzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAnPGVtPkRlZmF1bHQgVmlldzwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbiNnZXREZWZhdWx0VmlldygpCi0JICogQHNlZSAjZ2V0TWV0aG9kQ29uZmlndXJhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0TWV0aG9kQ29uZmlndXJhdGlvbl9EZWZhdWx0VmlldygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbiNnZXRCYXNlQ29uZmlndXJhdGlvbnMgPGVtPkJhc2UgQ29uZmlndXJhdGlvbnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAnPGVtPkJhc2UgQ29uZmlndXJhdGlvbnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb24jZ2V0QmFzZUNvbmZpZ3VyYXRpb25zKCkKLQkgKiBAc2VlICNnZXRNZXRob2RDb25maWd1cmF0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRNZXRob2RDb25maWd1cmF0aW9uX0Jhc2VDb25maWd1cmF0aW9ucygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbiNnZXRTdWJ0cmFjdGVkQ2F0ZWdvcnkgPGVtPlN1YnRyYWN0ZWQgQ2F0ZWdvcnk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAnPGVtPlN1YnRyYWN0ZWQgQ2F0ZWdvcnk8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb24jZ2V0U3VidHJhY3RlZENhdGVnb3J5KCkKLQkgKiBAc2VlICNnZXRNZXRob2RDb25maWd1cmF0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRNZXRob2RDb25maWd1cmF0aW9uX1N1YnRyYWN0ZWRDYXRlZ29yeSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbiNnZXRBZGRlZENhdGVnb3J5IDxlbT5BZGRlZCBDYXRlZ29yeTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICc8ZW0+QWRkZWQgQ2F0ZWdvcnk8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb24jZ2V0QWRkZWRDYXRlZ29yeSgpCi0JICogQHNlZSAjZ2V0TWV0aG9kQ29uZmlndXJhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0TWV0aG9kQ29uZmlndXJhdGlvbl9BZGRlZENhdGVnb3J5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NGYW1pbHkgPGVtPlByb2Nlc3MgRmFtaWx5PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlByb2Nlc3MgRmFtaWx5PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzRmFtaWx5Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRQcm9jZXNzRmFtaWx5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzRmFtaWx5I2dldERlbGl2ZXJ5UHJvY2Vzc2VzIDxlbT5EZWxpdmVyeSBQcm9jZXNzZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAnPGVtPkRlbGl2ZXJ5IFByb2Nlc3NlczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0ZhbWlseSNnZXREZWxpdmVyeVByb2Nlc3NlcygpCi0JICogQHNlZSAjZ2V0UHJvY2Vzc0ZhbWlseSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0UHJvY2Vzc0ZhbWlseV9EZWxpdmVyeVByb2Nlc3NlcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5IDxlbT5NZXRob2QgTGlicmFyeTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5NZXRob2QgTGlicmFyeTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0TWV0aG9kTGlicmFyeSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeSNnZXRNZXRob2RQbHVnaW5zIDxlbT5NZXRob2QgUGx1Z2luczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+TWV0aG9kIFBsdWdpbnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnkjZ2V0TWV0aG9kUGx1Z2lucygpCi0JICogQHNlZSAjZ2V0TWV0aG9kTGlicmFyeSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0TWV0aG9kTGlicmFyeV9NZXRob2RQbHVnaW5zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5I2dldFByZWRlZmluZWRDb25maWd1cmF0aW9ucyA8ZW0+UHJlZGVmaW5lZCBDb25maWd1cmF0aW9uczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+UHJlZGVmaW5lZCBDb25maWd1cmF0aW9uczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeSNnZXRQcmVkZWZpbmVkQ29uZmlndXJhdGlvbnMoKQotCSAqIEBzZWUgI2dldE1ldGhvZExpYnJhcnkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldE1ldGhvZExpYnJhcnlfUHJlZGVmaW5lZENvbmZpZ3VyYXRpb25zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlBvaW50IDxlbT5Qb2ludDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Qb2ludDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuUG9pbnQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFBvaW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUG9pbnQjZ2V0WCA8ZW0+WDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlg8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlBvaW50I2dldFgoKQotCSAqIEBzZWUgI2dldFBvaW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQb2ludF9YKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUG9pbnQjZ2V0WSA8ZW0+WTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlk8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlBvaW50I2dldFkoKQotCSAqIEBzZWUgI2dldFBvaW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQb2ludF9ZKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoRWxlbWVudCA8ZW0+R3JhcGggRWxlbWVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5HcmFwaCBFbGVtZW50PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaEVsZW1lbnQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldEdyYXBoRWxlbWVudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoRWxlbWVudCNnZXRQb3NpdGlvbiA8ZW0+UG9zaXRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJzxlbT5Qb3NpdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhFbGVtZW50I2dldFBvc2l0aW9uKCkKLQkgKiBAc2VlICNnZXRHcmFwaEVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldEdyYXBoRWxlbWVudF9Qb3NpdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhFbGVtZW50I2dldENvbnRhaW5lZCA8ZW0+Q29udGFpbmVkPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5Db250YWluZWQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoRWxlbWVudCNnZXRDb250YWluZWQoKQotCSAqIEBzZWUgI2dldEdyYXBoRWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0R3JhcGhFbGVtZW50X0NvbnRhaW5lZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhFbGVtZW50I2dldExpbmsgPGVtPkxpbms8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkxpbms8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoRWxlbWVudCNnZXRMaW5rKCkKLQkgKiBAc2VlICNnZXRHcmFwaEVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldEdyYXBoRWxlbWVudF9MaW5rKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaEVsZW1lbnQjZ2V0QW5jaG9yYWdlIDxlbT5BbmNob3JhZ2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkFuY2hvcmFnZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhFbGVtZW50I2dldEFuY2hvcmFnZSgpCi0JICogQHNlZSAjZ2V0R3JhcGhFbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRHcmFwaEVsZW1lbnRfQW5jaG9yYWdlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhFbGVtZW50I2dldFNlbWFudGljTW9kZWwgPGVtPlNlbWFudGljIE1vZGVsPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+U2VtYW50aWMgTW9kZWw8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoRWxlbWVudCNnZXRTZW1hbnRpY01vZGVsKCkKLQkgKiBAc2VlICNnZXRHcmFwaEVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldEdyYXBoRWxlbWVudF9TZW1hbnRpY01vZGVsKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW1FbGVtZW50IDxlbT5EaWFncmFtIEVsZW1lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+RGlhZ3JhbSBFbGVtZW50PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtRWxlbWVudAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0RGlhZ3JhbUVsZW1lbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtRWxlbWVudCNnZXRJc1Zpc2libGUgPGVtPklzIFZpc2libGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5JcyBWaXNpYmxlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtRWxlbWVudCNnZXRJc1Zpc2libGUoKQotCSAqIEBzZWUgI2dldERpYWdyYW1FbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXREaWFncmFtRWxlbWVudF9Jc1Zpc2libGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbmVyIHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbUVsZW1lbnQjZ2V0Q29udGFpbmVyXyA8ZW0+Q29udGFpbmVyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbmVyIHJlZmVyZW5jZSAnPGVtPkNvbnRhaW5lcjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbUVsZW1lbnQjZ2V0Q29udGFpbmVyXygpCi0JICogQHNlZSAjZ2V0RGlhZ3JhbUVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldERpYWdyYW1FbGVtZW50X0NvbnRhaW5lcigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbUVsZW1lbnQjZ2V0UmVmZXJlbmNlIDxlbT5SZWZlcmVuY2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAnPGVtPlJlZmVyZW5jZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbUVsZW1lbnQjZ2V0UmVmZXJlbmNlKCkKLQkgKiBAc2VlICNnZXREaWFncmFtRWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0RGlhZ3JhbUVsZW1lbnRfUmVmZXJlbmNlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtRWxlbWVudCNnZXRQcm9wZXJ0eSA8ZW0+UHJvcGVydHk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPlByb3BlcnR5PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtRWxlbWVudCNnZXRQcm9wZXJ0eSgpCi0JICogQHNlZSAjZ2V0RGlhZ3JhbUVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldERpYWdyYW1FbGVtZW50X1Byb3BlcnR5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW1MaW5rIDxlbT5EaWFncmFtIExpbms8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+RGlhZ3JhbSBMaW5rPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtTGluawotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0RGlhZ3JhbUxpbmsoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtTGluayNnZXRab29tIDxlbT5ab29tPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Wm9vbTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbUxpbmsjZ2V0Wm9vbSgpCi0JICogQHNlZSAjZ2V0RGlhZ3JhbUxpbmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldERpYWdyYW1MaW5rX1pvb20oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtTGluayNnZXRWaWV3cG9ydCA8ZW0+Vmlld3BvcnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJzxlbT5WaWV3cG9ydDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbUxpbmsjZ2V0Vmlld3BvcnQoKQotCSAqIEBzZWUgI2dldERpYWdyYW1MaW5rKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXREaWFncmFtTGlua19WaWV3cG9ydCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWluZXIgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtTGluayNnZXRHcmFwaEVsZW1lbnQgPGVtPkdyYXBoIEVsZW1lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWluZXIgcmVmZXJlbmNlICc8ZW0+R3JhcGggRWxlbWVudDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbUxpbmsjZ2V0R3JhcGhFbGVtZW50KCkKLQkgKiBAc2VlICNnZXREaWFncmFtTGluaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0RGlhZ3JhbUxpbmtfR3JhcGhFbGVtZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbUxpbmsjZ2V0RGlhZ3JhbSA8ZW0+RGlhZ3JhbTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAnPGVtPkRpYWdyYW08L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW1MaW5rI2dldERpYWdyYW0oKQotCSAqIEBzZWUgI2dldERpYWdyYW1MaW5rKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXREaWFncmFtTGlua19EaWFncmFtKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoQ29ubmVjdG9yIDxlbT5HcmFwaCBDb25uZWN0b3I8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+R3JhcGggQ29ubmVjdG9yPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaENvbm5lY3RvcgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0R3JhcGhDb25uZWN0b3IoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbmVyIHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhDb25uZWN0b3IjZ2V0R3JhcGhFbGVtZW50IDxlbT5HcmFwaCBFbGVtZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbmVyIHJlZmVyZW5jZSAnPGVtPkdyYXBoIEVsZW1lbnQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoQ29ubmVjdG9yI2dldEdyYXBoRWxlbWVudCgpCi0JICogQHNlZSAjZ2V0R3JhcGhDb25uZWN0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldEdyYXBoQ29ubmVjdG9yX0dyYXBoRWxlbWVudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhDb25uZWN0b3IjZ2V0R3JhcGhFZGdlIDxlbT5HcmFwaCBFZGdlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJzxlbT5HcmFwaCBFZGdlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaENvbm5lY3RvciNnZXRHcmFwaEVkZ2UoKQotCSAqIEBzZWUgI2dldEdyYXBoQ29ubmVjdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRHcmFwaENvbm5lY3Rvcl9HcmFwaEVkZ2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuU2VtYW50aWNNb2RlbEJyaWRnZSA8ZW0+U2VtYW50aWMgTW9kZWwgQnJpZGdlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlNlbWFudGljIE1vZGVsIEJyaWRnZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuU2VtYW50aWNNb2RlbEJyaWRnZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0U2VtYW50aWNNb2RlbEJyaWRnZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlNlbWFudGljTW9kZWxCcmlkZ2UjZ2V0UHJlc2VudGF0aW9uIDxlbT5QcmVzZW50YXRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5QcmVzZW50YXRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlNlbWFudGljTW9kZWxCcmlkZ2UjZ2V0UHJlc2VudGF0aW9uKCkKLQkgKiBAc2VlICNnZXRTZW1hbnRpY01vZGVsQnJpZGdlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRTZW1hbnRpY01vZGVsQnJpZGdlX1ByZXNlbnRhdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWluZXIgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5TZW1hbnRpY01vZGVsQnJpZGdlI2dldEdyYXBoRWxlbWVudCA8ZW0+R3JhcGggRWxlbWVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5lciByZWZlcmVuY2UgJzxlbT5HcmFwaCBFbGVtZW50PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5TZW1hbnRpY01vZGVsQnJpZGdlI2dldEdyYXBoRWxlbWVudCgpCi0JICogQHNlZSAjZ2V0U2VtYW50aWNNb2RlbEJyaWRnZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0U2VtYW50aWNNb2RlbEJyaWRnZV9HcmFwaEVsZW1lbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbmVyIHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuU2VtYW50aWNNb2RlbEJyaWRnZSNnZXREaWFncmFtIDxlbT5EaWFncmFtPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbmVyIHJlZmVyZW5jZSAnPGVtPkRpYWdyYW08L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlNlbWFudGljTW9kZWxCcmlkZ2UjZ2V0RGlhZ3JhbSgpCi0JICogQHNlZSAjZ2V0U2VtYW50aWNNb2RlbEJyaWRnZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0U2VtYW50aWNNb2RlbEJyaWRnZV9EaWFncmFtKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRpbWVuc2lvbiA8ZW0+RGltZW5zaW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkRpbWVuc2lvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuRGltZW5zaW9uCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXREaW1lbnNpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaW1lbnNpb24jZ2V0V2lkdGggPGVtPldpZHRoPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+V2lkdGg8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkRpbWVuc2lvbiNnZXRXaWR0aCgpCi0JICogQHNlZSAjZ2V0RGltZW5zaW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXREaW1lbnNpb25fV2lkdGgoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaW1lbnNpb24jZ2V0SGVpZ2h0IDxlbT5IZWlnaHQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5IZWlnaHQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkRpbWVuc2lvbiNnZXRIZWlnaHQoKQotCSAqIEBzZWUgI2dldERpbWVuc2lvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RGltZW5zaW9uX0hlaWdodCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5SZWZlcmVuY2UgPGVtPlJlZmVyZW5jZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5SZWZlcmVuY2U8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlJlZmVyZW5jZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0UmVmZXJlbmNlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUmVmZXJlbmNlI2dldElzSW5kaXZpZHVhbFJlcHJlc2VudGF0aW9uIDxlbT5JcyBJbmRpdmlkdWFsIFJlcHJlc2VudGF0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SXMgSW5kaXZpZHVhbCBSZXByZXNlbnRhdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuUmVmZXJlbmNlI2dldElzSW5kaXZpZHVhbFJlcHJlc2VudGF0aW9uKCkKLQkgKiBAc2VlICNnZXRSZWZlcmVuY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFJlZmVyZW5jZV9Jc0luZGl2aWR1YWxSZXByZXNlbnRhdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlJlZmVyZW5jZSNnZXRSZWZlcmVuY2VkIDxlbT5SZWZlcmVuY2VkPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICc8ZW0+UmVmZXJlbmNlZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuUmVmZXJlbmNlI2dldFJlZmVyZW5jZWQoKQotCSAqIEBzZWUgI2dldFJlZmVyZW5jZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0UmVmZXJlbmNlX1JlZmVyZW5jZWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvcGVydHkgPGVtPlByb3BlcnR5PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlByb3BlcnR5PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9wZXJ0eQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0UHJvcGVydHkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9wZXJ0eSNnZXRLZXkgPGVtPktleTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPktleTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvcGVydHkjZ2V0S2V5KCkKLQkgKiBAc2VlICNnZXRQcm9wZXJ0eSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UHJvcGVydHlfS2V5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvcGVydHkjZ2V0VmFsdWUgPGVtPlZhbHVlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VmFsdWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlByb3BlcnR5I2dldFZhbHVlKCkKLQkgKiBAc2VlICNnZXRQcm9wZXJ0eSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UHJvcGVydHlfVmFsdWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhFZGdlIDxlbT5HcmFwaCBFZGdlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkdyYXBoIEVkZ2U8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoRWRnZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0R3JhcGhFZGdlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaEVkZ2UjZ2V0QW5jaG9yIDxlbT5BbmNob3I8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAnPGVtPkFuY2hvcjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhFZGdlI2dldEFuY2hvcigpCi0JICogQHNlZSAjZ2V0R3JhcGhFZGdlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRHcmFwaEVkZ2VfQW5jaG9yKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaEVkZ2UjZ2V0V2F5cG9pbnRzIDxlbT5XYXlwb2ludHM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPldheXBvaW50czwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhFZGdlI2dldFdheXBvaW50cygpCi0JICogQHNlZSAjZ2V0R3JhcGhFZGdlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRHcmFwaEVkZ2VfV2F5cG9pbnRzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW0gPGVtPkRpYWdyYW08L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+RGlhZ3JhbTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0RGlhZ3JhbSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW0jZ2V0Wm9vbSA8ZW0+Wm9vbTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlpvb208L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW0jZ2V0Wm9vbSgpCi0JICogQHNlZSAjZ2V0RGlhZ3JhbSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RGlhZ3JhbV9ab29tKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbSNnZXRWaWV3cG9pbnQgPGVtPlZpZXdwb2ludDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAnPGVtPlZpZXdwb2ludDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbSNnZXRWaWV3cG9pbnQoKQotCSAqIEBzZWUgI2dldERpYWdyYW0oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldERpYWdyYW1fVmlld3BvaW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtI2dldERpYWdyYW1MaW5rIDxlbT5EaWFncmFtIExpbms8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAnPGVtPkRpYWdyYW0gTGluazwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbSNnZXREaWFncmFtTGluaygpCi0JICogQHNlZSAjZ2V0RGlhZ3JhbSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0RGlhZ3JhbV9EaWFncmFtTGluaygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW0jZ2V0TmFtZXNwYWNlIDxlbT5OYW1lc3BhY2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5OYW1lc3BhY2U8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW0jZ2V0TmFtZXNwYWNlKCkKLQkgKiBAc2VlICNnZXREaWFncmFtKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXREaWFncmFtX05hbWVzcGFjZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaE5vZGUgPGVtPkdyYXBoIE5vZGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+R3JhcGggTm9kZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhOb2RlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRHcmFwaE5vZGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaE5vZGUjZ2V0U2l6ZSA8ZW0+U2l6ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAnPGVtPlNpemU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoTm9kZSNnZXRTaXplKCkKLQkgKiBAc2VlICNnZXRHcmFwaE5vZGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldEdyYXBoTm9kZV9TaXplKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlNpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50IDxlbT5TaW1wbGUgU2VtYW50aWMgTW9kZWwgRWxlbWVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5TaW1wbGUgU2VtYW50aWMgTW9kZWwgRWxlbWVudDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFNpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnQjZ2V0VHlwZUluZm8gPGVtPlR5cGUgSW5mbzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlR5cGUgSW5mbzwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnQjZ2V0VHlwZUluZm8oKQotCSAqIEBzZWUgI2dldFNpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRTaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudF9UeXBlSW5mbygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5VTUFTZW1hbnRpY01vZGVsQnJpZGdlIDxlbT5VTUEgU2VtYW50aWMgTW9kZWwgQnJpZGdlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlVNQSBTZW1hbnRpYyBNb2RlbCBCcmlkZ2U8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVNQVNlbWFudGljTW9kZWxCcmlkZ2UKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFVNQVNlbWFudGljTW9kZWxCcmlkZ2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5VTUFTZW1hbnRpY01vZGVsQnJpZGdlI2dldEVsZW1lbnQgPGVtPkVsZW1lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJzxlbT5FbGVtZW50PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VTUFTZW1hbnRpY01vZGVsQnJpZGdlI2dldEVsZW1lbnQoKQotCSAqIEBzZWUgI2dldFVNQVNlbWFudGljTW9kZWxCcmlkZ2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFVNQVNlbWFudGljTW9kZWxCcmlkZ2VfRWxlbWVudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db3JlU2VtYW50aWNNb2RlbEJyaWRnZSA8ZW0+Q29yZSBTZW1hbnRpYyBNb2RlbCBCcmlkZ2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+Q29yZSBTZW1hbnRpYyBNb2RlbCBCcmlkZ2U8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkNvcmVTZW1hbnRpY01vZGVsQnJpZGdlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRDb3JlU2VtYW50aWNNb2RlbEJyaWRnZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkNvcmVTZW1hbnRpY01vZGVsQnJpZGdlI2dldEVsZW1lbnQgPGVtPkVsZW1lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJzxlbT5FbGVtZW50PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db3JlU2VtYW50aWNNb2RlbEJyaWRnZSNnZXRFbGVtZW50KCkKLQkgKiBAc2VlICNnZXRDb3JlU2VtYW50aWNNb2RlbEJyaWRnZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0Q29yZVNlbWFudGljTW9kZWxCcmlkZ2VfRWxlbWVudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5MZWFmRWxlbWVudCA8ZW0+TGVhZiBFbGVtZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkxlYWYgRWxlbWVudDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuTGVhZkVsZW1lbnQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldExlYWZFbGVtZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlRleHRFbGVtZW50IDxlbT5UZXh0IEVsZW1lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+VGV4dCBFbGVtZW50PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZXh0RWxlbWVudAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0VGV4dEVsZW1lbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZXh0RWxlbWVudCNnZXRUZXh0IDxlbT5UZXh0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VGV4dDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVGV4dEVsZW1lbnQjZ2V0VGV4dCgpCi0JICogQHNlZSAjZ2V0VGV4dEVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRleHRFbGVtZW50X1RleHQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuSW1hZ2UgPGVtPkltYWdlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkltYWdlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5JbWFnZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0SW1hZ2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5JbWFnZSNnZXRVcmkgPGVtPlVyaTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlVyaTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuSW1hZ2UjZ2V0VXJpKCkKLQkgKiBAc2VlICNnZXRJbWFnZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0SW1hZ2VfVXJpKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuSW1hZ2UjZ2V0TWltZVR5cGUgPGVtPk1pbWUgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk1pbWUgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuSW1hZ2UjZ2V0TWltZVR5cGUoKQotCSAqIEBzZWUgI2dldEltYWdlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRJbWFnZV9NaW1lVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaGljUHJpbWl0aXZlIDxlbT5HcmFwaGljIFByaW1pdGl2ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5HcmFwaGljIFByaW1pdGl2ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhpY1ByaW1pdGl2ZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0R3JhcGhpY1ByaW1pdGl2ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qb2x5bGluZSA8ZW0+UG9seWxpbmU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+UG9seWxpbmU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlBvbHlsaW5lCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRQb2x5bGluZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlBvbHlsaW5lI2dldENsb3NlZCA8ZW0+Q2xvc2VkPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Q2xvc2VkPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qb2x5bGluZSNnZXRDbG9zZWQoKQotCSAqIEBzZWUgI2dldFBvbHlsaW5lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQb2x5bGluZV9DbG9zZWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlBvbHlsaW5lI2dldFdheXBvaW50cyA8ZW0+V2F5cG9pbnRzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5XYXlwb2ludHM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlBvbHlsaW5lI2dldFdheXBvaW50cygpCi0JICogQHNlZSAjZ2V0UG9seWxpbmUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFBvbHlsaW5lX1dheXBvaW50cygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5FbGxpcHNlIDxlbT5FbGxpcHNlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkVsbGlwc2U8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkVsbGlwc2UKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldEVsbGlwc2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5FbGxpcHNlI2dldFJhZGl1c1ggPGVtPlJhZGl1cyBYPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UmFkaXVzIFg8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkVsbGlwc2UjZ2V0UmFkaXVzWCgpCi0JICogQHNlZSAjZ2V0RWxsaXBzZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RWxsaXBzZV9SYWRpdXNYKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRWxsaXBzZSNnZXRSYWRpdXNZIDxlbT5SYWRpdXMgWTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlJhZGl1cyBZPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5FbGxpcHNlI2dldFJhZGl1c1koKQotCSAqIEBzZWUgI2dldEVsbGlwc2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEVsbGlwc2VfUmFkaXVzWSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkVsbGlwc2UjZ2V0Um90YXRpb24gPGVtPlJvdGF0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Um90YXRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkVsbGlwc2UjZ2V0Um90YXRpb24oKQotCSAqIEBzZWUgI2dldEVsbGlwc2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEVsbGlwc2VfUm90YXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5FbGxpcHNlI2dldFN0YXJ0QW5nbGUgPGVtPlN0YXJ0IEFuZ2xlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+U3RhcnQgQW5nbGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkVsbGlwc2UjZ2V0U3RhcnRBbmdsZSgpCi0JICogQHNlZSAjZ2V0RWxsaXBzZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RWxsaXBzZV9TdGFydEFuZ2xlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRWxsaXBzZSNnZXRFbmRBbmdsZSA8ZW0+RW5kIEFuZ2xlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RW5kIEFuZ2xlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5FbGxpcHNlI2dldEVuZEFuZ2xlKCkKLQkgKiBAc2VlICNnZXRFbGxpcHNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRFbGxpcHNlX0VuZEFuZ2xlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRWxsaXBzZSNnZXRDZW50ZXIgPGVtPkNlbnRlcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAnPGVtPkNlbnRlcjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuRWxsaXBzZSNnZXRDZW50ZXIoKQotCSAqIEBzZWUgI2dldEVsbGlwc2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldEVsbGlwc2VfQ2VudGVyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZW51bSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya09yZGVyVHlwZSA8ZW0+V29yayBPcmRlciBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBlbnVtICc8ZW0+V29yayBPcmRlciBUeXBlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrT3JkZXJUeXBlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVFbnVtIGdldFdvcmtPcmRlclR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBlbnVtICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eVR5cGUgPGVtPlZhcmlhYmlsaXR5IFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGVudW0gJzxlbT5WYXJpYWJpbGl0eSBUeXBlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eVR5cGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUVudW0gZ2V0VmFyaWFiaWxpdHlUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICd7QGxpbmsgamF2YS51dGlsLkRhdGUgPGVtPkRhdGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPkRhdGU8L2VtPicuCi0JICogQHNlZSBqYXZhLnV0aWwuRGF0ZQotCSAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZhLnV0aWwuRGF0ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRURhdGFUeXBlIGdldERhdGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLm5ldC5VUkkgPGVtPlVyaTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+VXJpPC9lbT4nLgotCSAqIEBzZWUgamF2YS5uZXQuVVJJCi0JICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmEubmV0LlVSSSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRURhdGFUeXBlIGdldFVyaSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIGphdmEubGFuZy5TdHJpbmcgPGVtPlN0cmluZzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+U3RyaW5nPC9lbT4nLgotCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZwotCSAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZhLmxhbmcuU3RyaW5nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRGF0YVR5cGUgZ2V0U3RyaW5nKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICd7QGxpbmsgamF2YS5sYW5nLkJvb2xlYW4gPGVtPkJvb2xlYW48L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPkJvb2xlYW48L2VtPicuCi0JICogQHNlZSBqYXZhLmxhbmcuQm9vbGVhbgotCSAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZhLmxhbmcuQm9vbGVhbiIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRURhdGFUeXBlIGdldEJvb2xlYW4oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLnV0aWwuU2V0IDxlbT5TZXQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPlNldDwvZW0+Jy4KLQkgKiBAc2VlIGphdmEudXRpbC5TZXQKLQkgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0iamF2YS51dGlsLlNldCIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRURhdGFUeXBlIGdldFNldCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIGphdmEudXRpbC5MaXN0IDxlbT5TZXF1ZW5jZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+U2VxdWVuY2U8L2VtPicuCi0JICogQHNlZSBqYXZhLnV0aWwuTGlzdAotCSAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZhLnV0aWwuTGlzdCIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRURhdGFUeXBlIGdldFNlcXVlbmNlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+SW50ZWdlcjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5JbnRlZ2VyPC9lbT4nLgotCSAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJpbnQiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXRJbnRlZ2VyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICd7QGxpbmsgamF2YS5sYW5nLkRvdWJsZSA8ZW0+RG91YmxlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5Eb3VibGU8L2VtPicuCi0JICogQHNlZSBqYXZhLmxhbmcuRG91YmxlCi0JICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmEubGFuZy5Eb3VibGUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXREb3VibGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGZhY3RvcnkgdGhhdCBjcmVhdGVzIHRoZSBpbnN0YW5jZXMgb2YgdGhlIG1vZGVsLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgZmFjdG9yeSB0aGF0IGNyZWF0ZXMgdGhlIGluc3RhbmNlcyBvZiB0aGUgbW9kZWwuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVVtYUZhY3RvcnkgZ2V0VW1hRmFjdG9yeSgpOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBEZWZpbmVzIGxpdGVyYWxzIGZvciB0aGUgbWV0YSBvYmplY3RzIHRoYXQgcmVwcmVzZW50Ci0JICogPHVsPgotCSAqICAgPGxpPmVhY2ggY2xhc3MsPC9saT4KLQkgKiAgIDxsaT5lYWNoIGZlYXR1cmUgb2YgZWFjaCBjbGFzcyw8L2xpPgotCSAqICAgPGxpPmVhY2ggZW51bSw8L2xpPgotCSAqICAgPGxpPmFuZCBlYWNoIGRhdGEgdHlwZTwvbGk+Ci0JICogPC91bD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50ZXJmYWNlIExpdGVyYWxzIHsKLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQ2xhc3NpZmllckltcGwgPGVtPkNsYXNzaWZpZXI8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQ2xhc3NpZmllckltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0Q2xhc3NpZmllcigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBDTEFTU0lGSUVSID0gZUlOU1RBTkNFLmdldENsYXNzaWZpZXIoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPklzIEFic3RyYWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgQ0xBU1NJRklFUl9fSVNfQUJTVFJBQ1QgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0Q2xhc3NpZmllcl9Jc0Fic3RyYWN0KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVHlwZUltcGwgPGVtPlR5cGU8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVHlwZUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0VHlwZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBUWVBFID0gZUlOU1RBTkNFLmdldFR5cGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5FbGVtZW50SW1wbCA8ZW0+RWxlbWVudDwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5FbGVtZW50SW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRFbGVtZW50KCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIEVMRU1FTlQgPSBlSU5TVEFOQ0UuZ2V0RWxlbWVudCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLk5hbWVkRWxlbWVudEltcGwgPGVtPk5hbWVkIEVsZW1lbnQ8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuTmFtZWRFbGVtZW50SW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXROYW1lZEVsZW1lbnQoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgTkFNRURfRUxFTUVOVCA9IGVJTlNUQU5DRS5nZXROYW1lZEVsZW1lbnQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBOQU1FRF9FTEVNRU5UX19OQU1FID0gZUlOU1RBTkNFLmdldE5hbWVkRWxlbWVudF9OYW1lKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUGFja2FnZWFibGVFbGVtZW50SW1wbCA8ZW0+UGFja2FnZWFibGUgRWxlbWVudDwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5QYWNrYWdlYWJsZUVsZW1lbnRJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFBhY2thZ2VhYmxlRWxlbWVudCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBQQUNLQUdFQUJMRV9FTEVNRU5UID0gZUlOU1RBTkNFLmdldFBhY2thZ2VhYmxlRWxlbWVudCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlBhY2thZ2VJbXBsIDxlbT5QYWNrYWdlPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlBhY2thZ2VJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFBhY2thZ2UoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgUEFDS0FHRSA9IGVJTlNUQU5DRS5nZXRQYWNrYWdlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuTmFtZXNwYWNlSW1wbCA8ZW0+TmFtZXNwYWNlPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLk5hbWVzcGFjZUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0TmFtZXNwYWNlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIE5BTUVTUEFDRSA9IGVJTlNUQU5DRS5nZXROYW1lc3BhY2UoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5NZXRob2RFbGVtZW50SW1wbCA8ZW0+TWV0aG9kIEVsZW1lbnQ8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuTWV0aG9kRWxlbWVudEltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0TWV0aG9kRWxlbWVudCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBNRVRIT0RfRUxFTUVOVCA9IGVJTlNUQU5DRS5nZXRNZXRob2RFbGVtZW50KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5HdWlkPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgTUVUSE9EX0VMRU1FTlRfX0dVSUQgPSBlSU5TVEFOQ0UuZ2V0TWV0aG9kRWxlbWVudF9HdWlkKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIE1FVEhPRF9FTEVNRU5UX19QUkVTRU5UQVRJT05fTkFNRSA9IGVJTlNUQU5DRQotCQkJCS5nZXRNZXRob2RFbGVtZW50X1ByZXNlbnRhdGlvbk5hbWUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgTUVUSE9EX0VMRU1FTlRfX0JSSUVGX0RFU0NSSVBUSU9OID0gZUlOU1RBTkNFCi0JCQkJLmdldE1ldGhvZEVsZW1lbnRfQnJpZWZEZXNjcmlwdGlvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIE1FVEhPRF9FTEVNRU5UX19PV05FRF9SVUxFUyA9IGVJTlNUQU5DRQotCQkJCS5nZXRNZXRob2RFbGVtZW50X093bmVkUnVsZXMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBNRVRIT0RfRUxFTUVOVF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0TWV0aG9kRWxlbWVudF9NZXRob2RFbGVtZW50UHJvcGVydHkoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPktpbmQ8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIE1FVEhPRF9FTEVNRU5UX19LSU5EID0gZUlOU1RBTkNFLmdldE1ldGhvZEVsZW1lbnRfS2luZCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIE1FVEhPRF9FTEVNRU5UX19TVVBQUkVTU0VEID0gZUlOU1RBTkNFCi0JCQkJLmdldE1ldGhvZEVsZW1lbnRfU3VwcHJlc3NlZCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBNRVRIT0RfRUxFTUVOVF9fT1JERVJJTkdfR1VJREUgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0TWV0aG9kRWxlbWVudF9PcmRlcmluZ0d1aWRlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQ29uc3RyYWludEltcGwgPGVtPkNvbnN0cmFpbnQ8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQ29uc3RyYWludEltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0Q29uc3RyYWludCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBDT05TVFJBSU5UID0gZUlOU1RBTkNFLmdldENvbnN0cmFpbnQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkJvZHk8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBDT05TVFJBSU5UX19CT0RZID0gZUlOU1RBTkNFLmdldENvbnN0cmFpbnRfQm9keSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLk1ldGhvZEVsZW1lbnRQcm9wZXJ0eUltcGwgPGVtPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLk1ldGhvZEVsZW1lbnRQcm9wZXJ0eUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0TWV0aG9kRWxlbWVudFByb3BlcnR5KCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIE1FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gZUlOU1RBTkNFLmdldE1ldGhvZEVsZW1lbnRQcm9wZXJ0eSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBNRVRIT0RfRUxFTUVOVF9QUk9QRVJUWV9fVkFMVUUgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0TWV0aG9kRWxlbWVudFByb3BlcnR5X1ZhbHVlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuS2luZEltcGwgPGVtPktpbmQ8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuS2luZEltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0S2luZCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBLSU5EID0gZUlOU1RBTkNFLmdldEtpbmQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkFwcGxpY2FibGUgTWV0YSBDbGFzcyBJbmZvPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBLSU5EX19BUFBMSUNBQkxFX01FVEFfQ0xBU1NfSU5GTyA9IGVJTlNUQU5DRQotCQkJCS5nZXRLaW5kX0FwcGxpY2FibGVNZXRhQ2xhc3NJbmZvKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQ29udGVudEVsZW1lbnRJbXBsIDxlbT5Db250ZW50IEVsZW1lbnQ8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQ29udGVudEVsZW1lbnRJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldENvbnRlbnRFbGVtZW50KCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIENPTlRFTlRfRUxFTUVOVCA9IGVJTlNUQU5DRS5nZXRDb250ZW50RWxlbWVudCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U3VwcG9ydGluZyBNYXRlcmlhbHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIENPTlRFTlRfRUxFTUVOVF9fU1VQUE9SVElOR19NQVRFUklBTFMgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0Q29udGVudEVsZW1lbnRfU3VwcG9ydGluZ01hdGVyaWFscygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Q29uY2VwdHMgQW5kIFBhcGVyczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgQ09OVEVOVF9FTEVNRU5UX19DT05DRVBUU19BTkRfUEFQRVJTID0gZUlOU1RBTkNFCi0JCQkJLmdldENvbnRlbnRFbGVtZW50X0NvbmNlcHRzQW5kUGFwZXJzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5DaGVja2xpc3RzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBDT05URU5UX0VMRU1FTlRfX0NIRUNLTElTVFMgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0Q29udGVudEVsZW1lbnRfQ2hlY2tsaXN0cygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+R3VpZGVsaW5lczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgQ09OVEVOVF9FTEVNRU5UX19HVUlERUxJTkVTID0gZUlOU1RBTkNFCi0JCQkJLmdldENvbnRlbnRFbGVtZW50X0d1aWRlbGluZXMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkV4YW1wbGVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBDT05URU5UX0VMRU1FTlRfX0VYQU1QTEVTID0gZUlOU1RBTkNFCi0JCQkJLmdldENvbnRlbnRFbGVtZW50X0V4YW1wbGVzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Bc3NldHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIENPTlRFTlRfRUxFTUVOVF9fQVNTRVRTID0gZUlOU1RBTkNFCi0JCQkJLmdldENvbnRlbnRFbGVtZW50X0Fzc2V0cygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VGVybWRlZmluaXRpb248L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIENPTlRFTlRfRUxFTUVOVF9fVEVSTURFRklOSVRJT04gPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0Q29udGVudEVsZW1lbnRfVGVybWRlZmluaXRpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5EZXNjcmliYWJsZUVsZW1lbnRJbXBsIDxlbT5EZXNjcmliYWJsZSBFbGVtZW50PC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkRlc2NyaWJhYmxlRWxlbWVudEltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0RGVzY3JpYmFibGVFbGVtZW50KCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIERFU0NSSUJBQkxFX0VMRU1FTlQgPSBlSU5TVEFOQ0UuZ2V0RGVzY3JpYmFibGVFbGVtZW50KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBERVNDUklCQUJMRV9FTEVNRU5UX19QUkVTRU5UQVRJT04gPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0RGVzY3JpYmFibGVFbGVtZW50X1ByZXNlbnRhdGlvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U2hhcGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgREVTQ1JJQkFCTEVfRUxFTUVOVF9fU0hBUEVJQ09OID0gZUlOU1RBTkNFCi0JCQkJLmdldERlc2NyaWJhYmxlRWxlbWVudF9TaGFwZWljb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk5vZGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgREVTQ1JJQkFCTEVfRUxFTUVOVF9fTk9ERUlDT04gPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0RGVzY3JpYmFibGVFbGVtZW50X05vZGVpY29uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQ29udGVudERlc2NyaXB0aW9uSW1wbCA8ZW0+Q29udGVudCBEZXNjcmlwdGlvbjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Db250ZW50RGVzY3JpcHRpb25JbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldENvbnRlbnREZXNjcmlwdGlvbigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBDT05URU5UX0RFU0NSSVBUSU9OID0gZUlOU1RBTkNFLmdldENvbnRlbnREZXNjcmlwdGlvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TWFpbiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIENPTlRFTlRfREVTQ1JJUFRJT05fX01BSU5fREVTQ1JJUFRJT04gPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0Q29udGVudERlc2NyaXB0aW9uX01haW5EZXNjcmlwdGlvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U2VjdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIENPTlRFTlRfREVTQ1JJUFRJT05fX1NFQ1RJT05TID0gZUlOU1RBTkNFCi0JCQkJLmdldENvbnRlbnREZXNjcmlwdGlvbl9TZWN0aW9ucygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RXh0ZXJuYWwgSWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBDT05URU5UX0RFU0NSSVBUSU9OX19FWFRFUk5BTF9JRCA9IGVJTlNUQU5DRQotCQkJCS5nZXRDb250ZW50RGVzY3JpcHRpb25fRXh0ZXJuYWxJZCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+S2V5IENvbnNpZGVyYXRpb25zPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgQ09OVEVOVF9ERVNDUklQVElPTl9fS0VZX0NPTlNJREVSQVRJT05TID0gZUlOU1RBTkNFCi0JCQkJLmdldENvbnRlbnREZXNjcmlwdGlvbl9LZXlDb25zaWRlcmF0aW9ucygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TG9uZyBQcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIENPTlRFTlRfREVTQ1JJUFRJT05fX0xPTkdfUFJFU0VOVEFUSU9OX05BTUUgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0Q29udGVudERlc2NyaXB0aW9uX0xvbmdQcmVzZW50YXRpb25OYW1lKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuU2VjdGlvbkltcGwgPGVtPlNlY3Rpb248L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuU2VjdGlvbkltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0U2VjdGlvbigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBTRUNUSU9OID0gZUlOU1RBTkNFLmdldFNlY3Rpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlNlY3Rpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFNFQ1RJT05fX1NFQ1RJT05fTkFNRSA9IGVJTlNUQU5DRS5nZXRTZWN0aW9uX1NlY3Rpb25OYW1lKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TZWN0aW9uIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgU0VDVElPTl9fU0VDVElPTl9ERVNDUklQVElPTiA9IGVJTlNUQU5DRQotCQkJCS5nZXRTZWN0aW9uX1NlY3Rpb25EZXNjcmlwdGlvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U3ViIFNlY3Rpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBTRUNUSU9OX19TVUJfU0VDVElPTlMgPSBlSU5TVEFOQ0UuZ2V0U2VjdGlvbl9TdWJTZWN0aW9ucygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UHJlZGVjZXNzb3I8L2I+PC9lbT4nIHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBTRUNUSU9OX19QUkVERUNFU1NPUiA9IGVJTlNUQU5DRS5nZXRTZWN0aW9uX1ByZWRlY2Vzc29yKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUm9sZUltcGwgPGVtPlJvbGU8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUm9sZUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0Um9sZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBST0xFID0gZUlOU1RBTkNFLmdldFJvbGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk1vZGlmaWVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBST0xFX19NT0RJRklFUyA9IGVJTlNUQU5DRS5nZXRSb2xlX01vZGlmaWVzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5SZXNwb25zaWJsZSBGb3I8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFJPTEVfX1JFU1BPTlNJQkxFX0ZPUiA9IGVJTlNUQU5DRS5nZXRSb2xlX1Jlc3BvbnNpYmxlRm9yKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuV29ya1Byb2R1Y3RJbXBsIDxlbT5Xb3JrIFByb2R1Y3Q8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuV29ya1Byb2R1Y3RJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFdvcmtQcm9kdWN0KCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFdPUktfUFJPRFVDVCA9IGVJTlNUQU5DRS5nZXRXb3JrUHJvZHVjdCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UmVwb3J0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgV09SS19QUk9EVUNUX19SRVBPUlRTID0gZUlOU1RBTkNFLmdldFdvcmtQcm9kdWN0X1JlcG9ydHMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlRlbXBsYXRlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgV09SS19QUk9EVUNUX19URU1QTEFURVMgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0V29ya1Byb2R1Y3RfVGVtcGxhdGVzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Ub29sIE1lbnRvcnM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFdPUktfUFJPRFVDVF9fVE9PTF9NRU5UT1JTID0gZUlOU1RBTkNFCi0JCQkJLmdldFdvcmtQcm9kdWN0X1Rvb2xNZW50b3JzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Fc3RpbWF0aW9uIENvbnNpZGVyYXRpb25zPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBXT1JLX1BST0RVQ1RfX0VTVElNQVRJT05fQ09OU0lERVJBVElPTlMgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0V29ya1Byb2R1Y3RfRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRnVsZmlsbGFibGVFbGVtZW50SW1wbCA8ZW0+RnVsZmlsbGFibGUgRWxlbWVudDwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5GdWxmaWxsYWJsZUVsZW1lbnRJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldEZ1bGZpbGxhYmxlRWxlbWVudCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBGVUxGSUxMQUJMRV9FTEVNRU5UID0gZUlOU1RBTkNFLmdldEZ1bGZpbGxhYmxlRWxlbWVudCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RnVsZmlsbHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIEZVTEZJTExBQkxFX0VMRU1FTlRfX0ZVTEZJTExTID0gZUlOU1RBTkNFCi0JCQkJLmdldEZ1bGZpbGxhYmxlRWxlbWVudF9GdWxmaWxscygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlRhc2tJbXBsIDxlbT5UYXNrPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlRhc2tJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFRhc2soKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgVEFTSyA9IGVJTlNUQU5DRS5nZXRUYXNrKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5QZXJmb3JtZWQgQnk8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFRBU0tfX1BFUkZPUk1FRF9CWSA9IGVJTlNUQU5DRS5nZXRUYXNrX1BlcmZvcm1lZEJ5KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5NYW5kYXRvcnkgSW5wdXQ8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFRBU0tfX01BTkRBVE9SWV9JTlBVVCA9IGVJTlNUQU5DRS5nZXRUYXNrX01hbmRhdG9yeUlucHV0KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5PdXRwdXQ8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFRBU0tfX09VVFBVVCA9IGVJTlNUQU5DRS5nZXRUYXNrX091dHB1dCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+QWRkaXRpb25hbGx5IFBlcmZvcm1lZCBCeTwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgVEFTS19fQURESVRJT05BTExZX1BFUkZPUk1FRF9CWSA9IGVJTlNUQU5DRQotCQkJCS5nZXRUYXNrX0FkZGl0aW9uYWxseVBlcmZvcm1lZEJ5KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5PcHRpb25hbCBJbnB1dDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgVEFTS19fT1BUSU9OQUxfSU5QVVQgPSBlSU5TVEFOQ0UuZ2V0VGFza19PcHRpb25hbElucHV0KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TdGVwczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgVEFTS19fU1RFUFMgPSBlSU5TVEFOQ0UuZ2V0VGFza19TdGVwcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VG9vbCBNZW50b3JzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBUQVNLX19UT09MX01FTlRPUlMgPSBlSU5TVEFOQ0UuZ2V0VGFza19Ub29sTWVudG9ycygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RXN0aW1hdGlvbiBDb25zaWRlcmF0aW9uczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgVEFTS19fRVNUSU1BVElPTl9DT05TSURFUkFUSU9OUyA9IGVJTlNUQU5DRQotCQkJCS5nZXRUYXNrX0VzdGltYXRpb25Db25zaWRlcmF0aW9ucygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLldvcmtEZWZpbml0aW9uSW1wbCA8ZW0+V29yayBEZWZpbml0aW9uPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLldvcmtEZWZpbml0aW9uSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRXb3JrRGVmaW5pdGlvbigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBXT1JLX0RFRklOSVRJT04gPSBlSU5TVEFOQ0UuZ2V0V29ya0RlZmluaXRpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlByZWNvbmRpdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFdPUktfREVGSU5JVElPTl9fUFJFQ09ORElUSU9OID0gZUlOU1RBTkNFCi0JCQkJLmdldFdvcmtEZWZpbml0aW9uX1ByZWNvbmRpdGlvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UG9zdGNvbmRpdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFdPUktfREVGSU5JVElPTl9fUE9TVENPTkRJVElPTiA9IGVJTlNUQU5DRQotCQkJCS5nZXRXb3JrRGVmaW5pdGlvbl9Qb3N0Y29uZGl0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuU3RlcEltcGwgPGVtPlN0ZXA8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuU3RlcEltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0U3RlcCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBTVEVQID0gZUlOU1RBTkNFLmdldFN0ZXAoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5HdWlkYW5jZUltcGwgPGVtPkd1aWRhbmNlPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkd1aWRhbmNlSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRHdWlkYW5jZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBHVUlEQU5DRSA9IGVJTlNUQU5DRS5nZXRHdWlkYW5jZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkFydGlmYWN0SW1wbCA8ZW0+QXJ0aWZhY3Q8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQXJ0aWZhY3RJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldEFydGlmYWN0KCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIEFSVElGQUNUID0gZUlOU1RBTkNFLmdldEFydGlmYWN0KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Db250YWluZXIgQXJ0aWZhY3Q8L2I+PC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgQVJUSUZBQ1RfX0NPTlRBSU5FUl9BUlRJRkFDVCA9IGVJTlNUQU5DRQotCQkJCS5nZXRBcnRpZmFjdF9Db250YWluZXJBcnRpZmFjdCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Q29udGFpbmVkIEFydGlmYWN0czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgQVJUSUZBQ1RfX0NPTlRBSU5FRF9BUlRJRkFDVFMgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0QXJ0aWZhY3RfQ29udGFpbmVkQXJ0aWZhY3RzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRGVsaXZlcmFibGVJbXBsIDxlbT5EZWxpdmVyYWJsZTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5EZWxpdmVyYWJsZUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0RGVsaXZlcmFibGUoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgREVMSVZFUkFCTEUgPSBlSU5TVEFOQ0UuZ2V0RGVsaXZlcmFibGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkRlbGl2ZXJlZCBXb3JrIFByb2R1Y3RzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBERUxJVkVSQUJMRV9fREVMSVZFUkVEX1dPUktfUFJPRFVDVFMgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0RGVsaXZlcmFibGVfRGVsaXZlcmVkV29ya1Byb2R1Y3RzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuT3V0Y29tZUltcGwgPGVtPk91dGNvbWU8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuT3V0Y29tZUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0T3V0Y29tZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBPVVRDT01FID0gZUlOU1RBTkNFLmdldE91dGNvbWUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5NZXRob2RQYWNrYWdlSW1wbCA8ZW0+TWV0aG9kIFBhY2thZ2U8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuTWV0aG9kUGFja2FnZUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0TWV0aG9kUGFja2FnZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBNRVRIT0RfUEFDS0FHRSA9IGVJTlNUQU5DRS5nZXRNZXRob2RQYWNrYWdlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5HbG9iYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBNRVRIT0RfUEFDS0FHRV9fR0xPQkFMID0gZUlOU1RBTkNFLmdldE1ldGhvZFBhY2thZ2VfR2xvYmFsKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5SZXVzZWQgUGFja2FnZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIE1FVEhPRF9QQUNLQUdFX19SRVVTRURfUEFDS0FHRVMgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0TWV0aG9kUGFja2FnZV9SZXVzZWRQYWNrYWdlcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Q2hpbGQgUGFja2FnZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIE1FVEhPRF9QQUNLQUdFX19DSElMRF9QQUNLQUdFUyA9IGVJTlNUQU5DRQotCQkJCS5nZXRNZXRob2RQYWNrYWdlX0NoaWxkUGFja2FnZXMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Db250ZW50UGFja2FnZUltcGwgPGVtPkNvbnRlbnQgUGFja2FnZTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Db250ZW50UGFja2FnZUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0Q29udGVudFBhY2thZ2UoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgQ09OVEVOVF9QQUNLQUdFID0gZUlOU1RBTkNFLmdldENvbnRlbnRQYWNrYWdlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Db250ZW50IEVsZW1lbnRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBDT05URU5UX1BBQ0tBR0VfX0NPTlRFTlRfRUxFTUVOVFMgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0Q29udGVudFBhY2thZ2VfQ29udGVudEVsZW1lbnRzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQXJ0aWZhY3REZXNjcmlwdGlvbkltcGwgPGVtPkFydGlmYWN0IERlc2NyaXB0aW9uPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkFydGlmYWN0RGVzY3JpcHRpb25JbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldEFydGlmYWN0RGVzY3JpcHRpb24oKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgQVJUSUZBQ1RfREVTQ1JJUFRJT04gPSBlSU5TVEFOQ0UuZ2V0QXJ0aWZhY3REZXNjcmlwdGlvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgT3V0bGluZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEFSVElGQUNUX0RFU0NSSVBUSU9OX19CUklFRl9PVVRMSU5FID0gZUlOU1RBTkNFCi0JCQkJLmdldEFydGlmYWN0RGVzY3JpcHRpb25fQnJpZWZPdXRsaW5lKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5SZXByZXNlbnRhdGlvbiBPcHRpb25zPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgQVJUSUZBQ1RfREVTQ1JJUFRJT05fX1JFUFJFU0VOVEFUSU9OX09QVElPTlMgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0QXJ0aWZhY3REZXNjcmlwdGlvbl9SZXByZXNlbnRhdGlvbk9wdGlvbnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlJlcHJlc2VudGF0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgQVJUSUZBQ1RfREVTQ1JJUFRJT05fX1JFUFJFU0VOVEFUSU9OID0gZUlOU1RBTkNFCi0JCQkJLmdldEFydGlmYWN0RGVzY3JpcHRpb25fUmVwcmVzZW50YXRpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk5vdGF0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgQVJUSUZBQ1RfREVTQ1JJUFRJT05fX05PVEFUSU9OID0gZUlOU1RBTkNFCi0JCQkJLmdldEFydGlmYWN0RGVzY3JpcHRpb25fTm90YXRpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Xb3JrUHJvZHVjdERlc2NyaXB0aW9uSW1wbCA8ZW0+V29yayBQcm9kdWN0IERlc2NyaXB0aW9uPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLldvcmtQcm9kdWN0RGVzY3JpcHRpb25JbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFdvcmtQcm9kdWN0RGVzY3JpcHRpb24oKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OID0gZUlOU1RBTkNFLmdldFdvcmtQcm9kdWN0RGVzY3JpcHRpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlB1cnBvc2U8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX1BVUlBPU0UgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0V29ya1Byb2R1Y3REZXNjcmlwdGlvbl9QdXJwb3NlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JbXBhY3QgT2YgTm90IEhhdmluZzwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fSU1QQUNUX09GX05PVF9IQVZJTkcgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0V29ya1Byb2R1Y3REZXNjcmlwdGlvbl9JbXBhY3RPZk5vdEhhdmluZygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UmVhc29ucyBGb3IgTm90IE5lZWRpbmc8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX1JFQVNPTlNfRk9SX05PVF9ORUVESU5HID0gZUlOU1RBTkNFCi0JCQkJLmdldFdvcmtQcm9kdWN0RGVzY3JpcHRpb25fUmVhc29uc0Zvck5vdE5lZWRpbmcoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5EZWxpdmVyYWJsZURlc2NyaXB0aW9uSW1wbCA8ZW0+RGVsaXZlcmFibGUgRGVzY3JpcHRpb248L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRGVsaXZlcmFibGVEZXNjcmlwdGlvbkltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0RGVsaXZlcmFibGVEZXNjcmlwdGlvbigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBERUxJVkVSQUJMRV9ERVNDUklQVElPTiA9IGVJTlNUQU5DRS5nZXREZWxpdmVyYWJsZURlc2NyaXB0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5FeHRlcm5hbCBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIERFTElWRVJBQkxFX0RFU0NSSVBUSU9OX19FWFRFUk5BTF9ERVNDUklQVElPTiA9IGVJTlNUQU5DRQotCQkJCS5nZXREZWxpdmVyYWJsZURlc2NyaXB0aW9uX0V4dGVybmFsRGVzY3JpcHRpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlBhY2thZ2luZyBHdWlkYW5jZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIERFTElWRVJBQkxFX0RFU0NSSVBUSU9OX19QQUNLQUdJTkdfR1VJREFOQ0UgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0RGVsaXZlcmFibGVEZXNjcmlwdGlvbl9QYWNrYWdpbmdHdWlkYW5jZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlJvbGVEZXNjcmlwdGlvbkltcGwgPGVtPlJvbGUgRGVzY3JpcHRpb248L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUm9sZURlc2NyaXB0aW9uSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRSb2xlRGVzY3JpcHRpb24oKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgUk9MRV9ERVNDUklQVElPTiA9IGVJTlNUQU5DRS5nZXRSb2xlRGVzY3JpcHRpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlNraWxsczwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFJPTEVfREVTQ1JJUFRJT05fX1NLSUxMUyA9IGVJTlNUQU5DRQotCQkJCS5nZXRSb2xlRGVzY3JpcHRpb25fU2tpbGxzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Bc3NpZ25tZW50IEFwcHJvYWNoZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBST0xFX0RFU0NSSVBUSU9OX19BU1NJR05NRU5UX0FQUFJPQUNIRVMgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0Um9sZURlc2NyaXB0aW9uX0Fzc2lnbm1lbnRBcHByb2FjaGVzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TeW5vbnltczwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFJPTEVfREVTQ1JJUFRJT05fX1NZTk9OWU1TID0gZUlOU1RBTkNFCi0JCQkJLmdldFJvbGVEZXNjcmlwdGlvbl9TeW5vbnltcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlRhc2tEZXNjcmlwdGlvbkltcGwgPGVtPlRhc2sgRGVzY3JpcHRpb248L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVGFza0Rlc2NyaXB0aW9uSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRUYXNrRGVzY3JpcHRpb24oKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgVEFTS19ERVNDUklQVElPTiA9IGVJTlNUQU5DRS5nZXRUYXNrRGVzY3JpcHRpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlB1cnBvc2U8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBUQVNLX0RFU0NSSVBUSU9OX19QVVJQT1NFID0gZUlOU1RBTkNFCi0JCQkJLmdldFRhc2tEZXNjcmlwdGlvbl9QdXJwb3NlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5BbHRlcm5hdGl2ZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBUQVNLX0RFU0NSSVBUSU9OX19BTFRFUk5BVElWRVMgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0VGFza0Rlc2NyaXB0aW9uX0FsdGVybmF0aXZlcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkd1aWRhbmNlRGVzY3JpcHRpb25JbXBsIDxlbT5HdWlkYW5jZSBEZXNjcmlwdGlvbjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5HdWlkYW5jZURlc2NyaXB0aW9uSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRHdWlkYW5jZURlc2NyaXB0aW9uKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIEdVSURBTkNFX0RFU0NSSVBUSU9OID0gZUlOU1RBTkNFLmdldEd1aWRhbmNlRGVzY3JpcHRpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkF0dGFjaG1lbnRzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgR1VJREFOQ0VfREVTQ1JJUFRJT05fX0FUVEFDSE1FTlRTID0gZUlOU1RBTkNFCi0JCQkJLmdldEd1aWRhbmNlRGVzY3JpcHRpb25fQXR0YWNobWVudHMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5QcmFjdGljZURlc2NyaXB0aW9uSW1wbCA8ZW0+UHJhY3RpY2UgRGVzY3JpcHRpb248L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUHJhY3RpY2VEZXNjcmlwdGlvbkltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0UHJhY3RpY2VEZXNjcmlwdGlvbigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBQUkFDVElDRV9ERVNDUklQVElPTiA9IGVJTlNUQU5DRS5nZXRQcmFjdGljZURlc2NyaXB0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5BZGRpdGlvbmFsIEluZm88L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBQUkFDVElDRV9ERVNDUklQVElPTl9fQURESVRJT05BTF9JTkZPID0gZUlOU1RBTkNFCi0JCQkJLmdldFByYWN0aWNlRGVzY3JpcHRpb25fQWRkaXRpb25hbEluZm8oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlByb2JsZW08L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBQUkFDVElDRV9ERVNDUklQVElPTl9fUFJPQkxFTSA9IGVJTlNUQU5DRQotCQkJCS5nZXRQcmFjdGljZURlc2NyaXB0aW9uX1Byb2JsZW0oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkJhY2tncm91bmQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBQUkFDVElDRV9ERVNDUklQVElPTl9fQkFDS0dST1VORCA9IGVJTlNUQU5DRQotCQkJCS5nZXRQcmFjdGljZURlc2NyaXB0aW9uX0JhY2tncm91bmQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkdvYWxzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0dPQUxTID0gZUlOU1RBTkNFCi0JCQkJLmdldFByYWN0aWNlRGVzY3JpcHRpb25fR29hbHMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkFwcGxpY2F0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0FQUExJQ0FUSU9OID0gZUlOU1RBTkNFCi0JCQkJLmdldFByYWN0aWNlRGVzY3JpcHRpb25fQXBwbGljYXRpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkxldmVscyBPZiBBZG9wdGlvbjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFBSQUNUSUNFX0RFU0NSSVBUSU9OX19MRVZFTFNfT0ZfQURPUFRJT04gPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0UHJhY3RpY2VEZXNjcmlwdGlvbl9MZXZlbHNPZkFkb3B0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQWN0aXZpdHlJbXBsIDxlbT5BY3Rpdml0eTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5BY3Rpdml0eUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0QWN0aXZpdHkoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgQUNUSVZJVFkgPSBlSU5TVEFOQ0UuZ2V0QWN0aXZpdHkoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkJyZWFrZG93biBFbGVtZW50czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgQUNUSVZJVFlfX0JSRUFLRE9XTl9FTEVNRU5UUyA9IGVJTlNUQU5DRQotCQkJCS5nZXRBY3Rpdml0eV9CcmVha2Rvd25FbGVtZW50cygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Um9hZG1hcHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIEFDVElWSVRZX19ST0FETUFQUyA9IGVJTlNUQU5DRS5nZXRBY3Rpdml0eV9Sb2FkbWFwcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLldvcmtCcmVha2Rvd25FbGVtZW50SW1wbCA8ZW0+V29yayBCcmVha2Rvd24gRWxlbWVudDwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Xb3JrQnJlYWtkb3duRWxlbWVudEltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0V29ya0JyZWFrZG93bkVsZW1lbnQoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgV09SS19CUkVBS0RPV05fRUxFTUVOVCA9IGVJTlNUQU5DRS5nZXRXb3JrQnJlYWtkb3duRWxlbWVudCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SXMgUmVwZWF0YWJsZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0lTX1JFUEVBVEFCTEUgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0V29ya0JyZWFrZG93bkVsZW1lbnRfSXNSZXBlYXRhYmxlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JcyBPbmdvaW5nPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgV09SS19CUkVBS0RPV05fRUxFTUVOVF9fSVNfT05HT0lORyA9IGVJTlNUQU5DRQotCQkJCS5nZXRXb3JrQnJlYWtkb3duRWxlbWVudF9Jc09uZ29pbmcoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPklzIEV2ZW50IERyaXZlbjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0lTX0VWRU5UX0RSSVZFTiA9IGVJTlNUQU5DRQotCQkJCS5nZXRXb3JrQnJlYWtkb3duRWxlbWVudF9Jc0V2ZW50RHJpdmVuKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5MaW5rIFRvIFByZWRlY2Vzc29yPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19MSU5LX1RPX1BSRURFQ0VTU09SID0gZUlOU1RBTkNFCi0JCQkJLmdldFdvcmtCcmVha2Rvd25FbGVtZW50X0xpbmtUb1ByZWRlY2Vzc29yKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQnJlYWtkb3duRWxlbWVudEltcGwgPGVtPkJyZWFrZG93biBFbGVtZW50PC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkJyZWFrZG93bkVsZW1lbnRJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldEJyZWFrZG93bkVsZW1lbnQoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgQlJFQUtET1dOX0VMRU1FTlQgPSBlSU5TVEFOQ0UuZ2V0QnJlYWtkb3duRWxlbWVudCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UHJlZml4PC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgQlJFQUtET1dOX0VMRU1FTlRfX1BSRUZJWCA9IGVJTlNUQU5DRQotCQkJCS5nZXRCcmVha2Rvd25FbGVtZW50X1ByZWZpeCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SXMgUGxhbm5lZDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEJSRUFLRE9XTl9FTEVNRU5UX19JU19QTEFOTkVEID0gZUlOU1RBTkNFCi0JCQkJLmdldEJyZWFrZG93bkVsZW1lbnRfSXNQbGFubmVkKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5IYXMgTXVsdGlwbGUgT2NjdXJyZW5jZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBCUkVBS0RPV05fRUxFTUVOVF9fSEFTX01VTFRJUExFX09DQ1VSUkVOQ0VTID0gZUlOU1RBTkNFCi0JCQkJLmdldEJyZWFrZG93bkVsZW1lbnRfSGFzTXVsdGlwbGVPY2N1cnJlbmNlcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SXMgT3B0aW9uYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBCUkVBS0RPV05fRUxFTUVOVF9fSVNfT1BUSU9OQUwgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0QnJlYWtkb3duRWxlbWVudF9Jc09wdGlvbmFsKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50ZWQgQWZ0ZXI8L2I+PC9lbT4nIHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBCUkVBS0RPV05fRUxFTUVOVF9fUFJFU0VOVEVEX0FGVEVSID0gZUlOU1RBTkNFCi0JCQkJLmdldEJyZWFrZG93bkVsZW1lbnRfUHJlc2VudGVkQWZ0ZXIoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRlZCBCZWZvcmU8L2I+PC9lbT4nIHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBCUkVBS0RPV05fRUxFTUVOVF9fUFJFU0VOVEVEX0JFRk9SRSA9IGVJTlNUQU5DRQotCQkJCS5nZXRCcmVha2Rvd25FbGVtZW50X1ByZXNlbnRlZEJlZm9yZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UGxhbm5pbmcgRGF0YTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIEJSRUFLRE9XTl9FTEVNRU5UX19QTEFOTklOR19EQVRBID0gZUlOU1RBTkNFCi0JCQkJLmdldEJyZWFrZG93bkVsZW1lbnRfUGxhbm5pbmdEYXRhKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TdXBlciBBY3Rpdml0aWVzPC9iPjwvZW0+JyByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgQlJFQUtET1dOX0VMRU1FTlRfX1NVUEVSX0FDVElWSVRJRVMgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0QnJlYWtkb3duRWxlbWVudF9TdXBlckFjdGl2aXRpZXMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkNoZWNrbGlzdHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIEJSRUFLRE9XTl9FTEVNRU5UX19DSEVDS0xJU1RTID0gZUlOU1RBTkNFCi0JCQkJLmdldEJyZWFrZG93bkVsZW1lbnRfQ2hlY2tsaXN0cygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Q29uY2VwdHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIEJSRUFLRE9XTl9FTEVNRU5UX19DT05DRVBUUyA9IGVJTlNUQU5DRQotCQkJCS5nZXRCcmVha2Rvd25FbGVtZW50X0NvbmNlcHRzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5FeGFtcGxlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgQlJFQUtET1dOX0VMRU1FTlRfX0VYQU1QTEVTID0gZUlOU1RBTkNFCi0JCQkJLmdldEJyZWFrZG93bkVsZW1lbnRfRXhhbXBsZXMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkd1aWRlbGluZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIEJSRUFLRE9XTl9FTEVNRU5UX19HVUlERUxJTkVTID0gZUlOU1RBTkNFCi0JCQkJLmdldEJyZWFrZG93bkVsZW1lbnRfR3VpZGVsaW5lcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UmV1c2FibGUgQXNzZXRzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBCUkVBS0RPV05fRUxFTUVOVF9fUkVVU0FCTEVfQVNTRVRTID0gZUlOU1RBTkNFCi0JCQkJLmdldEJyZWFrZG93bkVsZW1lbnRfUmV1c2FibGVBc3NldHMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlN1cHBvcnRpbmcgTWF0ZXJpYWxzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBCUkVBS0RPV05fRUxFTUVOVF9fU1VQUE9SVElOR19NQVRFUklBTFMgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0QnJlYWtkb3duRWxlbWVudF9TdXBwb3J0aW5nTWF0ZXJpYWxzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5UZW1wbGF0ZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIEJSRUFLRE9XTl9FTEVNRU5UX19URU1QTEFURVMgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0QnJlYWtkb3duRWxlbWVudF9UZW1wbGF0ZXMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlJlcG9ydHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIEJSRUFLRE9XTl9FTEVNRU5UX19SRVBPUlRTID0gZUlOU1RBTkNFCi0JCQkJLmdldEJyZWFrZG93bkVsZW1lbnRfUmVwb3J0cygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RXN0aW1hdGlvbmNvbnNpZGVyYXRpb25zPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBCUkVBS0RPV05fRUxFTUVOVF9fRVNUSU1BVElPTkNPTlNJREVSQVRJT05TID0gZUlOU1RBTkNFCi0JCQkJLmdldEJyZWFrZG93bkVsZW1lbnRfRXN0aW1hdGlvbmNvbnNpZGVyYXRpb25zKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Ub29sbWVudG9yPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBCUkVBS0RPV05fRUxFTUVOVF9fVE9PTE1FTlRPUiA9IGVJTlNUQU5DRQotCQkJCS5nZXRCcmVha2Rvd25FbGVtZW50X1Rvb2xtZW50b3IoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5NaWxlc3RvbmVJbXBsIDxlbT5NaWxlc3RvbmU8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuTWlsZXN0b25lSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRNaWxlc3RvbmUoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgTUlMRVNUT05FID0gZUlOU1RBTkNFLmdldE1pbGVzdG9uZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UmVxdWlyZWQgUmVzdWx0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgTUlMRVNUT05FX19SRVFVSVJFRF9SRVNVTFRTID0gZUlOU1RBTkNFCi0JCQkJLmdldE1pbGVzdG9uZV9SZXF1aXJlZFJlc3VsdHMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5JdGVyYXRpb25JbXBsIDxlbT5JdGVyYXRpb248L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuSXRlcmF0aW9uSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRJdGVyYXRpb24oKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgSVRFUkFUSU9OID0gZUlOU1RBTkNFLmdldEl0ZXJhdGlvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlBoYXNlSW1wbCA8ZW0+UGhhc2U8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUGhhc2VJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFBoYXNlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFBIQVNFID0gZUlOU1RBTkNFLmdldFBoYXNlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVGVhbVByb2ZpbGVJbXBsIDxlbT5UZWFtIFByb2ZpbGU8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVGVhbVByb2ZpbGVJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFRlYW1Qcm9maWxlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFRFQU1fUFJPRklMRSA9IGVJTlNUQU5DRS5nZXRUZWFtUHJvZmlsZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VGVhbSBSb2xlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgVEVBTV9QUk9GSUxFX19URUFNX1JPTEVTID0gZUlOU1RBTkNFCi0JCQkJLmdldFRlYW1Qcm9maWxlX1RlYW1Sb2xlcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U3VwZXIgVGVhbTwvYj48L2VtPicgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFRFQU1fUFJPRklMRV9fU1VQRVJfVEVBTSA9IGVJTlNUQU5DRQotCQkJCS5nZXRUZWFtUHJvZmlsZV9TdXBlclRlYW0oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlN1YiBUZWFtPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBURUFNX1BST0ZJTEVfX1NVQl9URUFNID0gZUlOU1RBTkNFLmdldFRlYW1Qcm9maWxlX1N1YlRlYW0oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Sb2xlRGVzY3JpcHRvckltcGwgPGVtPlJvbGUgRGVzY3JpcHRvcjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Sb2xlRGVzY3JpcHRvckltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0Um9sZURlc2NyaXB0b3IoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgUk9MRV9ERVNDUklQVE9SID0gZUlOU1RBTkNFLmdldFJvbGVEZXNjcmlwdG9yKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Sb2xlPC9iPjwvZW0+JyByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgUk9MRV9ERVNDUklQVE9SX19ST0xFID0gZUlOU1RBTkNFLmdldFJvbGVEZXNjcmlwdG9yX1JvbGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk1vZGlmaWVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBST0xFX0RFU0NSSVBUT1JfX01PRElGSUVTID0gZUlOU1RBTkNFCi0JCQkJLmdldFJvbGVEZXNjcmlwdG9yX01vZGlmaWVzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5SZXNwb25zaWJsZSBGb3I8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFJPTEVfREVTQ1JJUFRPUl9fUkVTUE9OU0lCTEVfRk9SID0gZUlOU1RBTkNFCi0JCQkJLmdldFJvbGVEZXNjcmlwdG9yX1Jlc3BvbnNpYmxlRm9yKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuV29ya09yZGVySW1wbCA8ZW0+V29yayBPcmRlcjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Xb3JrT3JkZXJJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFdvcmtPcmRlcigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBXT1JLX09SREVSID0gZUlOU1RBTkNFLmdldFdvcmtPcmRlcigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TGluayBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgV09SS19PUkRFUl9fTElOS19UWVBFID0gZUlOU1RBTkNFLmdldFdvcmtPcmRlcl9MaW5rVHlwZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UHJlZDwvYj48L2VtPicgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFdPUktfT1JERVJfX1BSRUQgPSBlSU5TVEFOQ0UuZ2V0V29ya09yZGVyX1ByZWQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Qcm9jZXNzRWxlbWVudEltcGwgPGVtPlByb2Nlc3MgRWxlbWVudDwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Qcm9jZXNzRWxlbWVudEltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0UHJvY2Vzc0VsZW1lbnQoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgUFJPQ0VTU19FTEVNRU5UID0gZUlOU1RBTkNFLmdldFByb2Nlc3NFbGVtZW50KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUGxhbm5pbmdEYXRhSW1wbCA8ZW0+UGxhbm5pbmcgRGF0YTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5QbGFubmluZ0RhdGFJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFBsYW5uaW5nRGF0YSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBQTEFOTklOR19EQVRBID0gZUlOU1RBTkNFLmdldFBsYW5uaW5nRGF0YSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U3RhcnQgRGF0ZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFBMQU5OSU5HX0RBVEFfX1NUQVJUX0RBVEUgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0UGxhbm5pbmdEYXRhX1N0YXJ0RGF0ZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RmluaXNoIERhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBQTEFOTklOR19EQVRBX19GSU5JU0hfREFURSA9IGVJTlNUQU5DRQotCQkJCS5nZXRQbGFubmluZ0RhdGFfRmluaXNoRGF0ZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UmFuazwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFBMQU5OSU5HX0RBVEFfX1JBTksgPSBlSU5TVEFOQ0UuZ2V0UGxhbm5pbmdEYXRhX1JhbmsoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5EZXNjcmlwdG9ySW1wbCA8ZW0+RGVzY3JpcHRvcjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5EZXNjcmlwdG9ySW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXREZXNjcmlwdG9yKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIERFU0NSSVBUT1IgPSBlSU5TVEFOQ0UuZ2V0RGVzY3JpcHRvcigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SXMgU3luY2hyb25pemVkIFdpdGggU291cmNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgREVTQ1JJUFRPUl9fSVNfU1lOQ0hST05JWkVEX1dJVEhfU09VUkNFID0gZUlOU1RBTkNFCi0JCQkJLmdldERlc2NyaXB0b3JfSXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVGFza0Rlc2NyaXB0b3JJbXBsIDxlbT5UYXNrIERlc2NyaXB0b3I8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVGFza0Rlc2NyaXB0b3JJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFRhc2tEZXNjcmlwdG9yKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFRBU0tfREVTQ1JJUFRPUiA9IGVJTlNUQU5DRS5nZXRUYXNrRGVzY3JpcHRvcigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VGFzazwvYj48L2VtPicgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFRBU0tfREVTQ1JJUFRPUl9fVEFTSyA9IGVJTlNUQU5DRS5nZXRUYXNrRGVzY3JpcHRvcl9UYXNrKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5BZGRpdGlvbmFsbHkgUGVyZm9ybWVkIEJ5PC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBUQVNLX0RFU0NSSVBUT1JfX0FERElUSU9OQUxMWV9QRVJGT1JNRURfQlkgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0VGFza0Rlc2NyaXB0b3JfQWRkaXRpb25hbGx5UGVyZm9ybWVkQnkoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkFzc2lzdGVkIEJ5PC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBUQVNLX0RFU0NSSVBUT1JfX0FTU0lTVEVEX0JZID0gZUlOU1RBTkNFCi0JCQkJLmdldFRhc2tEZXNjcmlwdG9yX0Fzc2lzdGVkQnkoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkV4dGVybmFsIElucHV0PC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBUQVNLX0RFU0NSSVBUT1JfX0VYVEVSTkFMX0lOUFVUID0gZUlOU1RBTkNFCi0JCQkJLmdldFRhc2tEZXNjcmlwdG9yX0V4dGVybmFsSW5wdXQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk1hbmRhdG9yeSBJbnB1dDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgVEFTS19ERVNDUklQVE9SX19NQU5EQVRPUllfSU5QVVQgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0VGFza0Rlc2NyaXB0b3JfTWFuZGF0b3J5SW5wdXQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk9wdGlvbmFsIElucHV0PC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBUQVNLX0RFU0NSSVBUT1JfX09QVElPTkFMX0lOUFVUID0gZUlOU1RBTkNFCi0JCQkJLmdldFRhc2tEZXNjcmlwdG9yX09wdGlvbmFsSW5wdXQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk91dHB1dDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgVEFTS19ERVNDUklQVE9SX19PVVRQVVQgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0VGFza0Rlc2NyaXB0b3JfT3V0cHV0KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5QZXJmb3JtZWQgUHJpbWFyaWx5IEJ5PC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBUQVNLX0RFU0NSSVBUT1JfX1BFUkZPUk1FRF9QUklNQVJJTFlfQlkgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0VGFza0Rlc2NyaXB0b3JfUGVyZm9ybWVkUHJpbWFyaWx5QnkoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlNlbGVjdGVkIFN0ZXBzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBUQVNLX0RFU0NSSVBUT1JfX1NFTEVDVEVEX1NURVBTID0gZUlOU1RBTkNFCi0JCQkJLmdldFRhc2tEZXNjcmlwdG9yX1NlbGVjdGVkU3RlcHMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Xb3JrUHJvZHVjdERlc2NyaXB0b3JJbXBsIDxlbT5Xb3JrIFByb2R1Y3QgRGVzY3JpcHRvcjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Xb3JrUHJvZHVjdERlc2NyaXB0b3JJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFdvcmtQcm9kdWN0RGVzY3JpcHRvcigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUiA9IGVJTlNUQU5DRS5nZXRXb3JrUHJvZHVjdERlc2NyaXB0b3IoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkFjdGl2aXR5IEVudHJ5IFN0YXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0FDVElWSVRZX0VOVFJZX1NUQVRFID0gZUlOU1RBTkNFCi0JCQkJLmdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9BY3Rpdml0eUVudHJ5U3RhdGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkFjdGl2aXR5IEV4aXQgU3RhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fQUNUSVZJVFlfRVhJVF9TVEFURSA9IGVJTlNUQU5DRQotCQkJCS5nZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JfQWN0aXZpdHlFeGl0U3RhdGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPldvcmsgUHJvZHVjdDwvYj48L2VtPicgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFdPUktfUFJPRFVDVF9ERVNDUklQVE9SX19XT1JLX1BST0RVQ1QgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX1dvcmtQcm9kdWN0KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JbXBhY3RlZCBCeTwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0lNUEFDVEVEX0JZID0gZUlOU1RBTkNFCi0JCQkJLmdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9JbXBhY3RlZEJ5KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JbXBhY3RzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fSU1QQUNUUyA9IGVJTlNUQU5DRQotCQkJCS5nZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JfSW1wYWN0cygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RGVsaXZlcmFibGUgUGFydHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFdPUktfUFJPRFVDVF9ERVNDUklQVE9SX19ERUxJVkVSQUJMRV9QQVJUUyA9IGVJTlNUQU5DRQotCQkJCS5nZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JfRGVsaXZlcmFibGVQYXJ0cygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkNvbXBvc2l0ZVJvbGVJbXBsIDxlbT5Db21wb3NpdGUgUm9sZTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Db21wb3NpdGVSb2xlSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRDb21wb3NpdGVSb2xlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIENPTVBPU0lURV9ST0xFID0gZUlOU1RBTkNFLmdldENvbXBvc2l0ZVJvbGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkFnZ3JlZ2F0ZWQgUm9sZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIENPTVBPU0lURV9ST0xFX19BR0dSRUdBVEVEX1JPTEVTID0gZUlOU1RBTkNFCi0JCQkJLmdldENvbXBvc2l0ZVJvbGVfQWdncmVnYXRlZFJvbGVzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uSW1wbCA8ZW0+QnJlYWtkb3duIEVsZW1lbnQgRGVzY3JpcHRpb248L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24oKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT04gPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0QnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Vc2FnZSBHdWlkYW5jZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19VU0FHRV9HVUlEQU5DRSA9IGVJTlNUQU5DRQotCQkJCS5nZXRCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb25fVXNhZ2VHdWlkYW5jZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkFjdGl2aXR5RGVzY3JpcHRpb25JbXBsIDxlbT5BY3Rpdml0eSBEZXNjcmlwdGlvbjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5BY3Rpdml0eURlc2NyaXB0aW9uSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRBY3Rpdml0eURlc2NyaXB0aW9uKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIEFDVElWSVRZX0RFU0NSSVBUSU9OID0gZUlOU1RBTkNFLmdldEFjdGl2aXR5RGVzY3JpcHRpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlB1cnBvc2U8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBBQ1RJVklUWV9ERVNDUklQVElPTl9fUFVSUE9TRSA9IGVJTlNUQU5DRQotCQkJCS5nZXRBY3Rpdml0eURlc2NyaXB0aW9uX1B1cnBvc2UoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkFsdGVybmF0aXZlczwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEFDVElWSVRZX0RFU0NSSVBUSU9OX19BTFRFUk5BVElWRVMgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0QWN0aXZpdHlEZXNjcmlwdGlvbl9BbHRlcm5hdGl2ZXMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkhvd3RvIFN0YWZmPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgQUNUSVZJVFlfREVTQ1JJUFRJT05fX0hPV1RPX1NUQUZGID0gZUlOU1RBTkNFCi0JCQkJLmdldEFjdGl2aXR5RGVzY3JpcHRpb25fSG93dG9TdGFmZigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uSW1wbCA8ZW0+RGVsaXZlcnkgUHJvY2VzcyBEZXNjcmlwdGlvbjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbkltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24oKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTiA9IGVJTlNUQU5DRQotCQkJCS5nZXREZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U2NhbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19TQ0FMRSA9IGVJTlNUQU5DRQotCQkJCS5nZXREZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl9TY2FsZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UHJvamVjdCBDaGFyYWN0ZXJpc3RpY3M8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19QUk9KRUNUX0NIQVJBQ1RFUklTVElDUyA9IGVJTlNUQU5DRQotCQkJCS5nZXREZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl9Qcm9qZWN0Q2hhcmFjdGVyaXN0aWNzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5SaXNrIExldmVsPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fUklTS19MRVZFTCA9IGVJTlNUQU5DRQotCQkJCS5nZXREZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl9SaXNrTGV2ZWwoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkVzdGltYXRpbmcgVGVjaG5pcXVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fRVNUSU1BVElOR19URUNITklRVUUgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fRXN0aW1hdGluZ1RlY2huaXF1ZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UHJvamVjdCBNZW1iZXIgRXhwZXJ0aXNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fUFJPSkVDVF9NRU1CRVJfRVhQRVJUSVNFID0gZUlOU1RBTkNFCi0JCQkJLmdldERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX1Byb2plY3RNZW1iZXJFeHBlcnRpc2UoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlR5cGUgT2YgQ29udHJhY3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19UWVBFX09GX0NPTlRSQUNUID0gZUlOU1RBTkNFCi0JCQkJLmdldERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX1R5cGVPZkNvbnRyYWN0KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUHJvY2Vzc0Rlc2NyaXB0aW9uSW1wbCA8ZW0+UHJvY2VzcyBEZXNjcmlwdGlvbjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Qcm9jZXNzRGVzY3JpcHRpb25JbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFByb2Nlc3NEZXNjcmlwdGlvbigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBQUk9DRVNTX0RFU0NSSVBUSU9OID0gZUlOU1RBTkNFLmdldFByb2Nlc3NEZXNjcmlwdGlvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U2NvcGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBQUk9DRVNTX0RFU0NSSVBUSU9OX19TQ09QRSA9IGVJTlNUQU5DRQotCQkJCS5nZXRQcm9jZXNzRGVzY3JpcHRpb25fU2NvcGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlVzYWdlIE5vdGVzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgUFJPQ0VTU19ERVNDUklQVElPTl9fVVNBR0VfTk9URVMgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0UHJvY2Vzc0Rlc2NyaXB0aW9uX1VzYWdlTm90ZXMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5EZXNjcmlwdG9yRGVzY3JpcHRpb25JbXBsIDxlbT5EZXNjcmlwdG9yIERlc2NyaXB0aW9uPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkRlc2NyaXB0b3JEZXNjcmlwdGlvbkltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0RGVzY3JpcHRvckRlc2NyaXB0aW9uKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIERFU0NSSVBUT1JfREVTQ1JJUFRJT04gPSBlSU5TVEFOQ0UuZ2V0RGVzY3JpcHRvckRlc2NyaXB0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5SZWZpbmVkIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgREVTQ1JJUFRPUl9ERVNDUklQVElPTl9fUkVGSU5FRF9ERVNDUklQVElPTiA9IGVJTlNUQU5DRQotCQkJCS5nZXREZXNjcmlwdG9yRGVzY3JpcHRpb25fUmVmaW5lZERlc2NyaXB0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQ29uY2VwdEltcGwgPGVtPkNvbmNlcHQ8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQ29uY2VwdEltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0Q29uY2VwdCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBDT05DRVBUID0gZUlOU1RBTkNFLmdldENvbmNlcHQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5DaGVja2xpc3RJbXBsIDxlbT5DaGVja2xpc3Q8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQ2hlY2tsaXN0SW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRDaGVja2xpc3QoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgQ0hFQ0tMSVNUID0gZUlOU1RBTkNFLmdldENoZWNrbGlzdCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkV4YW1wbGVJbXBsIDxlbT5FeGFtcGxlPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkV4YW1wbGVJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldEV4YW1wbGUoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgRVhBTVBMRSA9IGVJTlNUQU5DRS5nZXRFeGFtcGxlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuR3VpZGVsaW5lSW1wbCA8ZW0+R3VpZGVsaW5lPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkd1aWRlbGluZUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0R3VpZGVsaW5lKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIEdVSURFTElORSA9IGVJTlNUQU5DRS5nZXRHdWlkZWxpbmUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnNJbXBsIDxlbT5Fc3RpbWF0aW9uIENvbnNpZGVyYXRpb25zPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkVzdGltYXRpb25Db25zaWRlcmF0aW9uc0ltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0RXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIEVTVElNQVRJT05fQ09OU0lERVJBVElPTlMgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0RXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUmVwb3J0SW1wbCA8ZW0+UmVwb3J0PC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlJlcG9ydEltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0UmVwb3J0KCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFJFUE9SVCA9IGVJTlNUQU5DRS5nZXRSZXBvcnQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5UZW1wbGF0ZUltcGwgPGVtPlRlbXBsYXRlPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlRlbXBsYXRlSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRUZW1wbGF0ZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBURU1QTEFURSA9IGVJTlNUQU5DRS5nZXRUZW1wbGF0ZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlN1cHBvcnRpbmdNYXRlcmlhbEltcGwgPGVtPlN1cHBvcnRpbmcgTWF0ZXJpYWw8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuU3VwcG9ydGluZ01hdGVyaWFsSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRTdXBwb3J0aW5nTWF0ZXJpYWwoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgU1VQUE9SVElOR19NQVRFUklBTCA9IGVJTlNUQU5DRS5nZXRTdXBwb3J0aW5nTWF0ZXJpYWwoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Ub29sTWVudG9ySW1wbCA8ZW0+VG9vbCBNZW50b3I8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVG9vbE1lbnRvckltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0VG9vbE1lbnRvcigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBUT09MX01FTlRPUiA9IGVJTlNUQU5DRS5nZXRUb29sTWVudG9yKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuV2hpdGVwYXBlckltcGwgPGVtPldoaXRlcGFwZXI8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuV2hpdGVwYXBlckltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0V2hpdGVwYXBlcigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBXSElURVBBUEVSID0gZUlOU1RBTkNFLmdldFdoaXRlcGFwZXIoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5UZXJtRGVmaW5pdGlvbkltcGwgPGVtPlRlcm0gRGVmaW5pdGlvbjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5UZXJtRGVmaW5pdGlvbkltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0VGVybURlZmluaXRpb24oKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgVEVSTV9ERUZJTklUSU9OID0gZUlOU1RBTkNFLmdldFRlcm1EZWZpbml0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQXBwbGljYWJsZU1ldGFDbGFzc0luZm9JbXBsIDxlbT5BcHBsaWNhYmxlIE1ldGEgQ2xhc3MgSW5mbzwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5BcHBsaWNhYmxlTWV0YUNsYXNzSW5mb0ltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0QXBwbGljYWJsZU1ldGFDbGFzc0luZm8oKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgQVBQTElDQUJMRV9NRVRBX0NMQVNTX0lORk8gPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0QXBwbGljYWJsZU1ldGFDbGFzc0luZm8oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPklzIFByaW1hcnkgRXh0ZW5zaW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgQVBQTElDQUJMRV9NRVRBX0NMQVNTX0lORk9fX0lTX1BSSU1BUllfRVhURU5TSU9OID0gZUlOU1RBTkNFCi0JCQkJLmdldEFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvX0lzUHJpbWFyeUV4dGVuc2lvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlByYWN0aWNlSW1wbCA8ZW0+UHJhY3RpY2U8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUHJhY3RpY2VJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFByYWN0aWNlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFBSQUNUSUNFID0gZUlOU1RBTkNFLmdldFByYWN0aWNlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TdWIgUHJhY3RpY2VzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBQUkFDVElDRV9fU1VCX1BSQUNUSUNFUyA9IGVJTlNUQU5DRQotCQkJCS5nZXRQcmFjdGljZV9TdWJQcmFjdGljZXMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkNvbnRlbnQgUmVmZXJlbmNlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgUFJBQ1RJQ0VfX0NPTlRFTlRfUkVGRVJFTkNFUyA9IGVJTlNUQU5DRQotCQkJCS5nZXRQcmFjdGljZV9Db250ZW50UmVmZXJlbmNlcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+QWN0aXZpdHkgUmVmZXJlbmNlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgUFJBQ1RJQ0VfX0FDVElWSVRZX1JFRkVSRU5DRVMgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0UHJhY3RpY2VfQWN0aXZpdHlSZWZlcmVuY2VzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUmV1c2FibGVBc3NldEltcGwgPGVtPlJldXNhYmxlIEFzc2V0PC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlJldXNhYmxlQXNzZXRJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFJldXNhYmxlQXNzZXQoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgUkVVU0FCTEVfQVNTRVQgPSBlSU5TVEFOQ0UuZ2V0UmV1c2FibGVBc3NldCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkRpc2NpcGxpbmVJbXBsIDxlbT5EaXNjaXBsaW5lPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkRpc2NpcGxpbmVJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldERpc2NpcGxpbmUoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgRElTQ0lQTElORSA9IGVJTlNUQU5DRS5nZXREaXNjaXBsaW5lKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5UYXNrczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgRElTQ0lQTElORV9fVEFTS1MgPSBlSU5TVEFOQ0UuZ2V0RGlzY2lwbGluZV9UYXNrcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U3ViZGlzY2lwbGluZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgRElTQ0lQTElORV9fU1VCRElTQ0lQTElORSA9IGVJTlNUQU5DRQotCQkJCS5nZXREaXNjaXBsaW5lX1N1YmRpc2NpcGxpbmUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlJlZmVyZW5jZSBXb3JrZmxvd3M8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIERJU0NJUExJTkVfX1JFRkVSRU5DRV9XT1JLRkxPV1MgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0RGlzY2lwbGluZV9SZWZlcmVuY2VXb3JrZmxvd3MoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Db250ZW50Q2F0ZWdvcnlJbXBsIDxlbT5Db250ZW50IENhdGVnb3J5PC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkNvbnRlbnRDYXRlZ29yeUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0Q29udGVudENhdGVnb3J5KCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIENPTlRFTlRfQ0FURUdPUlkgPSBlSU5TVEFOQ0UuZ2V0Q29udGVudENhdGVnb3J5KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUm9sZVNldEltcGwgPGVtPlJvbGUgU2V0PC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlJvbGVTZXRJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFJvbGVTZXQoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgUk9MRV9TRVQgPSBlSU5TVEFOQ0UuZ2V0Um9sZVNldCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Um9sZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFJPTEVfU0VUX19ST0xFUyA9IGVJTlNUQU5DRS5nZXRSb2xlU2V0X1JvbGVzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRG9tYWluSW1wbCA8ZW0+RG9tYWluPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkRvbWFpbkltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0RG9tYWluKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIERPTUFJTiA9IGVJTlNUQU5DRS5nZXREb21haW4oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPldvcmsgUHJvZHVjdHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIERPTUFJTl9fV09SS19QUk9EVUNUUyA9IGVJTlNUQU5DRS5nZXREb21haW5fV29ya1Byb2R1Y3RzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TdWJkb21haW5zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBET01BSU5fX1NVQkRPTUFJTlMgPSBlSU5TVEFOQ0UuZ2V0RG9tYWluX1N1YmRvbWFpbnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Xb3JrUHJvZHVjdFR5cGVJbXBsIDxlbT5Xb3JrIFByb2R1Y3QgVHlwZTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Xb3JrUHJvZHVjdFR5cGVJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFdvcmtQcm9kdWN0VHlwZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBXT1JLX1BST0RVQ1RfVFlQRSA9IGVJTlNUQU5DRS5nZXRXb3JrUHJvZHVjdFR5cGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPldvcmsgUHJvZHVjdHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFdPUktfUFJPRFVDVF9UWVBFX19XT1JLX1BST0RVQ1RTID0gZUlOU1RBTkNFCi0JCQkJLmdldFdvcmtQcm9kdWN0VHlwZV9Xb3JrUHJvZHVjdHMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5EaXNjaXBsaW5lR3JvdXBpbmdJbXBsIDxlbT5EaXNjaXBsaW5lIEdyb3VwaW5nPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkRpc2NpcGxpbmVHcm91cGluZ0ltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0RGlzY2lwbGluZUdyb3VwaW5nKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIERJU0NJUExJTkVfR1JPVVBJTkcgPSBlSU5TVEFOQ0UuZ2V0RGlzY2lwbGluZUdyb3VwaW5nKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5EaXNjaXBsaW5lczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgRElTQ0lQTElORV9HUk9VUElOR19fRElTQ0lQTElORVMgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0RGlzY2lwbGluZUdyb3VwaW5nX0Rpc2NpcGxpbmVzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVG9vbEltcGwgPGVtPlRvb2w8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVG9vbEltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0VG9vbCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBUT09MID0gZUlOU1RBTkNFLmdldFRvb2woKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlRvb2wgTWVudG9yczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgVE9PTF9fVE9PTF9NRU5UT1JTID0gZUlOU1RBTkNFLmdldFRvb2xfVG9vbE1lbnRvcnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Sb2xlU2V0R3JvdXBpbmdJbXBsIDxlbT5Sb2xlIFNldCBHcm91cGluZzwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Sb2xlU2V0R3JvdXBpbmdJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFJvbGVTZXRHcm91cGluZygpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBST0xFX1NFVF9HUk9VUElORyA9IGVJTlNUQU5DRS5nZXRSb2xlU2V0R3JvdXBpbmcoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlJvbGUgU2V0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgUk9MRV9TRVRfR1JPVVBJTkdfX1JPTEVfU0VUUyA9IGVJTlNUQU5DRQotCQkJCS5nZXRSb2xlU2V0R3JvdXBpbmdfUm9sZVNldHMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5DdXN0b21DYXRlZ29yeUltcGwgPGVtPkN1c3RvbSBDYXRlZ29yeTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5DdXN0b21DYXRlZ29yeUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0Q3VzdG9tQ2F0ZWdvcnkoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgQ1VTVE9NX0NBVEVHT1JZID0gZUlOU1RBTkNFLmdldEN1c3RvbUNhdGVnb3J5KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5DYXRlZ29yaXplZCBFbGVtZW50czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgQ1VTVE9NX0NBVEVHT1JZX19DQVRFR09SSVpFRF9FTEVNRU5UUyA9IGVJTlNUQU5DRQotCQkJCS5nZXRDdXN0b21DYXRlZ29yeV9DYXRlZ29yaXplZEVsZW1lbnRzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TdWIgQ2F0ZWdvcmllczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgQ1VTVE9NX0NBVEVHT1JZX19TVUJfQ0FURUdPUklFUyA9IGVJTlNUQU5DRQotCQkJCS5nZXRDdXN0b21DYXRlZ29yeV9TdWJDYXRlZ29yaWVzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRGVsaXZlcnlQcm9jZXNzSW1wbCA8ZW0+RGVsaXZlcnkgUHJvY2VzczwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5EZWxpdmVyeVByb2Nlc3NJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldERlbGl2ZXJ5UHJvY2VzcygpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBERUxJVkVSWV9QUk9DRVNTID0gZUlOU1RBTkNFLmdldERlbGl2ZXJ5UHJvY2VzcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RWR1Y2F0aW9uIE1hdGVyaWFsczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgREVMSVZFUllfUFJPQ0VTU19fRURVQ0FUSU9OX01BVEVSSUFMUyA9IGVJTlNUQU5DRQotCQkJCS5nZXREZWxpdmVyeVByb2Nlc3NfRWR1Y2F0aW9uTWF0ZXJpYWxzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Db21tdW5pY2F0aW9ucyBNYXRlcmlhbHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIERFTElWRVJZX1BST0NFU1NfX0NPTU1VTklDQVRJT05TX01BVEVSSUFMUyA9IGVJTlNUQU5DRQotCQkJCS5nZXREZWxpdmVyeVByb2Nlc3NfQ29tbXVuaWNhdGlvbnNNYXRlcmlhbHMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Qcm9jZXNzSW1wbCA8ZW0+UHJvY2VzczwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Qcm9jZXNzSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRQcm9jZXNzKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFBST0NFU1MgPSBlSU5TVEFOQ0UuZ2V0UHJvY2VzcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SW5jbHVkZXMgUGF0dGVybnM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFBST0NFU1NfX0lOQ0xVREVTX1BBVFRFUk5TID0gZUlOU1RBTkNFCi0JCQkJLmdldFByb2Nlc3NfSW5jbHVkZXNQYXR0ZXJucygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RGVmYXVsdCBDb250ZXh0PC9iPjwvZW0+JyByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgUFJPQ0VTU19fREVGQVVMVF9DT05URVhUID0gZUlOU1RBTkNFCi0JCQkJLmdldFByb2Nlc3NfRGVmYXVsdENvbnRleHQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlZhbGlkIENvbnRleHQ8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFBST0NFU1NfX1ZBTElEX0NPTlRFWFQgPSBlSU5TVEFOQ0UuZ2V0UHJvY2Vzc19WYWxpZENvbnRleHQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5DYXBhYmlsaXR5UGF0dGVybkltcGwgPGVtPkNhcGFiaWxpdHkgUGF0dGVybjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5DYXBhYmlsaXR5UGF0dGVybkltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0Q2FwYWJpbGl0eVBhdHRlcm4oKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgQ0FQQUJJTElUWV9QQVRURVJOID0gZUlOU1RBTkNFLmdldENhcGFiaWxpdHlQYXR0ZXJuKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGVJbXBsIDxlbT5Qcm9jZXNzIFBsYW5uaW5nIFRlbXBsYXRlPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlByb2Nlc3NQbGFubmluZ1RlbXBsYXRlSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFID0gZUlOU1RBTkNFCi0JCQkJLmdldFByb2Nlc3NQbGFubmluZ1RlbXBsYXRlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5CYXNlZCBPbiBQcm9jZXNzZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX0JBU0VEX09OX1BST0NFU1NFUyA9IGVJTlNUQU5DRQotCQkJCS5nZXRQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZV9CYXNlZE9uUHJvY2Vzc2VzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUm9hZG1hcEltcGwgPGVtPlJvYWRtYXA8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUm9hZG1hcEltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0Um9hZG1hcCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBST0FETUFQID0gZUlOU1RBTkNFLmdldFJvYWRtYXAoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Qcm9jZXNzQ29tcG9uZW50SW1wbCA8ZW0+UHJvY2VzcyBDb21wb25lbnQ8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUHJvY2Vzc0NvbXBvbmVudEltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0UHJvY2Vzc0NvbXBvbmVudCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBQUk9DRVNTX0NPTVBPTkVOVCA9IGVJTlNUQU5DRS5nZXRQcm9jZXNzQ29tcG9uZW50KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JbnRlcmZhY2VzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBQUk9DRVNTX0NPTVBPTkVOVF9fSU5URVJGQUNFUyA9IGVJTlNUQU5DRQotCQkJCS5nZXRQcm9jZXNzQ29tcG9uZW50X0ludGVyZmFjZXMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlByb2Nlc3M8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBQUk9DRVNTX0NPTVBPTkVOVF9fUFJPQ0VTUyA9IGVJTlNUQU5DRQotCQkJCS5nZXRQcm9jZXNzQ29tcG9uZW50X1Byb2Nlc3MoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Qcm9jZXNzUGFja2FnZUltcGwgPGVtPlByb2Nlc3MgUGFja2FnZTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Qcm9jZXNzUGFja2FnZUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0UHJvY2Vzc1BhY2thZ2UoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgUFJPQ0VTU19QQUNLQUdFID0gZUlOU1RBTkNFLmdldFByb2Nlc3NQYWNrYWdlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Qcm9jZXNzIEVsZW1lbnRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBQUk9DRVNTX1BBQ0tBR0VfX1BST0NFU1NfRUxFTUVOVFMgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0UHJvY2Vzc1BhY2thZ2VfUHJvY2Vzc0VsZW1lbnRzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5EaWFncmFtczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgUFJPQ0VTU19QQUNLQUdFX19ESUFHUkFNUyA9IGVJTlNUQU5DRQotCQkJCS5nZXRQcm9jZXNzUGFja2FnZV9EaWFncmFtcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VJbXBsIDxlbT5Qcm9jZXNzIENvbXBvbmVudCBJbnRlcmZhY2U8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0UHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBQUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0UgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0UHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SW50ZXJmYWNlIFNwZWNpZmljYXRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBQUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfX0lOVEVSRkFDRV9TUEVDSUZJQ0FUSU9OUyA9IGVJTlNUQU5DRQotCQkJCS5nZXRQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlX0ludGVyZmFjZVNwZWNpZmljYXRpb25zKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JbnRlcmZhY2UgSU88L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRV9fSU5URVJGQUNFX0lPID0gZUlOU1RBTkNFCi0JCQkJLmdldFByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VfSW50ZXJmYWNlSU8oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Qcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvckltcGwgPGVtPlByb2Nlc3MgQ29tcG9uZW50IERlc2NyaXB0b3I8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3JJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFByb2Nlc3NDb21wb25lbnREZXNjcmlwdG9yKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFBST0NFU1NfQ09NUE9ORU5UX0RFU0NSSVBUT1IgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0UHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3IoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPnByb2Nlc3MgQ29tcG9uZW50PC9iPjwvZW0+JyByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgUFJPQ0VTU19DT01QT05FTlRfREVTQ1JJUFRPUl9fUFJPQ0VTU19DT01QT05FTlQgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0UHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3JfX3Byb2Nlc3NDb21wb25lbnQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5NZXRob2RQbHVnaW5JbXBsIDxlbT5NZXRob2QgUGx1Z2luPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLk1ldGhvZFBsdWdpbkltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0TWV0aG9kUGx1Z2luKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIE1FVEhPRF9QTFVHSU4gPSBlSU5TVEFOQ0UuZ2V0TWV0aG9kUGx1Z2luKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Vc2VyIENoYW5nZWFibGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBNRVRIT0RfUExVR0lOX19VU0VSX0NIQU5HRUFCTEUgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0TWV0aG9kUGx1Z2luX1VzZXJDaGFuZ2VhYmxlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgUGFja2FnZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIE1FVEhPRF9QTFVHSU5fX01FVEhPRF9QQUNLQUdFUyA9IGVJTlNUQU5DRQotCQkJCS5nZXRNZXRob2RQbHVnaW5fTWV0aG9kUGFja2FnZXMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkJhc2VzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBNRVRIT0RfUExVR0lOX19CQVNFUyA9IGVJTlNUQU5DRS5nZXRNZXRob2RQbHVnaW5fQmFzZXMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlN1cHBvcnRpbmc8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBNRVRIT0RfUExVR0lOX19TVVBQT1JUSU5HID0gZUlOU1RBTkNFCi0JCQkJLmdldE1ldGhvZFBsdWdpbl9TdXBwb3J0aW5nKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVmFyaWFiaWxpdHlFbGVtZW50SW1wbCA8ZW0+VmFyaWFiaWxpdHkgRWxlbWVudDwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5WYXJpYWJpbGl0eUVsZW1lbnRJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFZhcmlhYmlsaXR5RWxlbWVudCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBWQVJJQUJJTElUWV9FTEVNRU5UID0gZUlOU1RBTkNFLmdldFZhcmlhYmlsaXR5RWxlbWVudCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFZBUklBQklMSVRZX0VMRU1FTlRfX1ZBUklBQklMSVRZX1RZUEUgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0VmFyaWFiaWxpdHlFbGVtZW50X1ZhcmlhYmlsaXR5VHlwZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvYj48L2VtPicgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFZBUklBQklMSVRZX0VMRU1FTlRfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0VmFyaWFiaWxpdHlFbGVtZW50X1ZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5NZXRob2RVbml0SW1wbCA8ZW0+TWV0aG9kIFVuaXQ8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuTWV0aG9kVW5pdEltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0TWV0aG9kVW5pdCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBNRVRIT0RfVU5JVCA9IGVJTlNUQU5DRS5nZXRNZXRob2RVbml0KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5BdXRob3JzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgTUVUSE9EX1VOSVRfX0FVVEhPUlMgPSBlSU5TVEFOQ0UuZ2V0TWV0aG9kVW5pdF9BdXRob3JzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5DaGFuZ2UgRGF0ZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIE1FVEhPRF9VTklUX19DSEFOR0VfREFURSA9IGVJTlNUQU5DRQotCQkJCS5nZXRNZXRob2RVbml0X0NoYW5nZURhdGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkNoYW5nZSBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIE1FVEhPRF9VTklUX19DSEFOR0VfREVTQ1JJUFRJT04gPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0TWV0aG9kVW5pdF9DaGFuZ2VEZXNjcmlwdGlvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VmVyc2lvbjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIE1FVEhPRF9VTklUX19WRVJTSU9OID0gZUlOU1RBTkNFLmdldE1ldGhvZFVuaXRfVmVyc2lvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Q29weXJpZ2h0IFN0YXRlbWVudDwvYj48L2VtPicgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIE1FVEhPRF9VTklUX19DT1BZUklHSFRfU1RBVEVNRU5UID0gZUlOU1RBTkNFCi0JCQkJLmdldE1ldGhvZFVuaXRfQ29weXJpZ2h0U3RhdGVtZW50KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuTWV0aG9kQ29uZmlndXJhdGlvbkltcGwgPGVtPk1ldGhvZCBDb25maWd1cmF0aW9uPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLk1ldGhvZENvbmZpZ3VyYXRpb25JbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldE1ldGhvZENvbmZpZ3VyYXRpb24oKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgTUVUSE9EX0NPTkZJR1VSQVRJT04gPSBlSU5TVEFOQ0UuZ2V0TWV0aG9kQ29uZmlndXJhdGlvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIFBsdWdpbiBTZWxlY3Rpb248L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIE1FVEhPRF9DT05GSUdVUkFUSU9OX19NRVRIT0RfUExVR0lOX1NFTEVDVElPTiA9IGVJTlNUQU5DRQotCQkJCS5nZXRNZXRob2RDb25maWd1cmF0aW9uX01ldGhvZFBsdWdpblNlbGVjdGlvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIFBhY2thZ2UgU2VsZWN0aW9uPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBNRVRIT0RfQ09ORklHVVJBVElPTl9fTUVUSE9EX1BBQ0tBR0VfU0VMRUNUSU9OID0gZUlOU1RBTkNFCi0JCQkJLmdldE1ldGhvZENvbmZpZ3VyYXRpb25fTWV0aG9kUGFja2FnZVNlbGVjdGlvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UHJvY2VzcyBWaWV3czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgTUVUSE9EX0NPTkZJR1VSQVRJT05fX1BST0NFU1NfVklFV1MgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0TWV0aG9kQ29uZmlndXJhdGlvbl9Qcm9jZXNzVmlld3MoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkRlZmF1bHQgVmlldzwvYj48L2VtPicgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIE1FVEhPRF9DT05GSUdVUkFUSU9OX19ERUZBVUxUX1ZJRVcgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0TWV0aG9kQ29uZmlndXJhdGlvbl9EZWZhdWx0VmlldygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+QmFzZSBDb25maWd1cmF0aW9uczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgTUVUSE9EX0NPTkZJR1VSQVRJT05fX0JBU0VfQ09ORklHVVJBVElPTlMgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0TWV0aG9kQ29uZmlndXJhdGlvbl9CYXNlQ29uZmlndXJhdGlvbnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlN1YnRyYWN0ZWQgQ2F0ZWdvcnk8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIE1FVEhPRF9DT05GSUdVUkFUSU9OX19TVUJUUkFDVEVEX0NBVEVHT1JZID0gZUlOU1RBTkNFCi0JCQkJLmdldE1ldGhvZENvbmZpZ3VyYXRpb25fU3VidHJhY3RlZENhdGVnb3J5KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5BZGRlZCBDYXRlZ29yeTwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgTUVUSE9EX0NPTkZJR1VSQVRJT05fX0FEREVEX0NBVEVHT1JZID0gZUlOU1RBTkNFCi0JCQkJLmdldE1ldGhvZENvbmZpZ3VyYXRpb25fQWRkZWRDYXRlZ29yeSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlByb2Nlc3NGYW1pbHlJbXBsIDxlbT5Qcm9jZXNzIEZhbWlseTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Qcm9jZXNzRmFtaWx5SW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRQcm9jZXNzRmFtaWx5KCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFBST0NFU1NfRkFNSUxZID0gZUlOU1RBTkNFLmdldFByb2Nlc3NGYW1pbHkoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkRlbGl2ZXJ5IFByb2Nlc3NlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgUFJPQ0VTU19GQU1JTFlfX0RFTElWRVJZX1BST0NFU1NFUyA9IGVJTlNUQU5DRQotCQkJCS5nZXRQcm9jZXNzRmFtaWx5X0RlbGl2ZXJ5UHJvY2Vzc2VzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuTWV0aG9kTGlicmFyeUltcGwgPGVtPk1ldGhvZCBMaWJyYXJ5PC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLk1ldGhvZExpYnJhcnlJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldE1ldGhvZExpYnJhcnkoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgTUVUSE9EX0xJQlJBUlkgPSBlSU5TVEFOQ0UuZ2V0TWV0aG9kTGlicmFyeSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIFBsdWdpbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIE1FVEhPRF9MSUJSQVJZX19NRVRIT0RfUExVR0lOUyA9IGVJTlNUQU5DRQotCQkJCS5nZXRNZXRob2RMaWJyYXJ5X01ldGhvZFBsdWdpbnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlByZWRlZmluZWQgQ29uZmlndXJhdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIE1FVEhPRF9MSUJSQVJZX19QUkVERUZJTkVEX0NPTkZJR1VSQVRJT05TID0gZUlOU1RBTkNFCi0JCQkJLmdldE1ldGhvZExpYnJhcnlfUHJlZGVmaW5lZENvbmZpZ3VyYXRpb25zKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUG9pbnRJbXBsIDxlbT5Qb2ludDwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Qb2ludEltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0UG9pbnQoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgUE9JTlQgPSBlSU5TVEFOQ0UuZ2V0UG9pbnQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlg8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBQT0lOVF9fWCA9IGVJTlNUQU5DRS5nZXRQb2ludF9YKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5ZPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgUE9JTlRfX1kgPSBlSU5TVEFOQ0UuZ2V0UG9pbnRfWSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkdyYXBoRWxlbWVudEltcGwgPGVtPkdyYXBoIEVsZW1lbnQ8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuR3JhcGhFbGVtZW50SW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRHcmFwaEVsZW1lbnQoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgR1JBUEhfRUxFTUVOVCA9IGVJTlNUQU5DRS5nZXRHcmFwaEVsZW1lbnQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlBvc2l0aW9uPC9iPjwvZW0+JyByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgR1JBUEhfRUxFTUVOVF9fUE9TSVRJT04gPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0R3JhcGhFbGVtZW50X1Bvc2l0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Db250YWluZWQ8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIEdSQVBIX0VMRU1FTlRfX0NPTlRBSU5FRCA9IGVJTlNUQU5DRQotCQkJCS5nZXRHcmFwaEVsZW1lbnRfQ29udGFpbmVkKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5MaW5rPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBHUkFQSF9FTEVNRU5UX19MSU5LID0gZUlOU1RBTkNFLmdldEdyYXBoRWxlbWVudF9MaW5rKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5BbmNob3JhZ2U8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIEdSQVBIX0VMRU1FTlRfX0FOQ0hPUkFHRSA9IGVJTlNUQU5DRQotCQkJCS5nZXRHcmFwaEVsZW1lbnRfQW5jaG9yYWdlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TZW1hbnRpYyBNb2RlbDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIEdSQVBIX0VMRU1FTlRfX1NFTUFOVElDX01PREVMID0gZUlOU1RBTkNFCi0JCQkJLmdldEdyYXBoRWxlbWVudF9TZW1hbnRpY01vZGVsKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRGlhZ3JhbUVsZW1lbnRJbXBsIDxlbT5EaWFncmFtIEVsZW1lbnQ8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRGlhZ3JhbUVsZW1lbnRJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldERpYWdyYW1FbGVtZW50KCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIERJQUdSQU1fRUxFTUVOVCA9IGVJTlNUQU5DRS5nZXREaWFncmFtRWxlbWVudCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SXMgVmlzaWJsZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIERJQUdSQU1fRUxFTUVOVF9fSVNfVklTSUJMRSA9IGVJTlNUQU5DRQotCQkJCS5nZXREaWFncmFtRWxlbWVudF9Jc1Zpc2libGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkNvbnRhaW5lcjwvYj48L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBESUFHUkFNX0VMRU1FTlRfX0NPTlRBSU5FUiA9IGVJTlNUQU5DRQotCQkJCS5nZXREaWFncmFtRWxlbWVudF9Db250YWluZXIoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlJlZmVyZW5jZTwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgRElBR1JBTV9FTEVNRU5UX19SRUZFUkVOQ0UgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0RGlhZ3JhbUVsZW1lbnRfUmVmZXJlbmNlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Qcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgRElBR1JBTV9FTEVNRU5UX19QUk9QRVJUWSA9IGVJTlNUQU5DRQotCQkJCS5nZXREaWFncmFtRWxlbWVudF9Qcm9wZXJ0eSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkRpYWdyYW1MaW5rSW1wbCA8ZW0+RGlhZ3JhbSBMaW5rPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkRpYWdyYW1MaW5rSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXREaWFncmFtTGluaygpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBESUFHUkFNX0xJTksgPSBlSU5TVEFOQ0UuZ2V0RGlhZ3JhbUxpbmsoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlpvb208L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBESUFHUkFNX0xJTktfX1pPT00gPSBlSU5TVEFOQ0UuZ2V0RGlhZ3JhbUxpbmtfWm9vbSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Vmlld3BvcnQ8L2I+PC9lbT4nIHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBESUFHUkFNX0xJTktfX1ZJRVdQT1JUID0gZUlOU1RBTkNFLmdldERpYWdyYW1MaW5rX1ZpZXdwb3J0KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5HcmFwaCBFbGVtZW50PC9iPjwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIERJQUdSQU1fTElOS19fR1JBUEhfRUxFTUVOVCA9IGVJTlNUQU5DRQotCQkJCS5nZXREaWFncmFtTGlua19HcmFwaEVsZW1lbnQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkRpYWdyYW08L2I+PC9lbT4nIHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBESUFHUkFNX0xJTktfX0RJQUdSQU0gPSBlSU5TVEFOQ0UuZ2V0RGlhZ3JhbUxpbmtfRGlhZ3JhbSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkdyYXBoQ29ubmVjdG9ySW1wbCA8ZW0+R3JhcGggQ29ubmVjdG9yPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkdyYXBoQ29ubmVjdG9ySW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRHcmFwaENvbm5lY3RvcigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBHUkFQSF9DT05ORUNUT1IgPSBlSU5TVEFOQ0UuZ2V0R3JhcGhDb25uZWN0b3IoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkdyYXBoIEVsZW1lbnQ8L2I+PC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgR1JBUEhfQ09OTkVDVE9SX19HUkFQSF9FTEVNRU5UID0gZUlOU1RBTkNFCi0JCQkJLmdldEdyYXBoQ29ubmVjdG9yX0dyYXBoRWxlbWVudCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+R3JhcGggRWRnZTwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgR1JBUEhfQ09OTkVDVE9SX19HUkFQSF9FREdFID0gZUlOU1RBTkNFCi0JCQkJLmdldEdyYXBoQ29ubmVjdG9yX0dyYXBoRWRnZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlNlbWFudGljTW9kZWxCcmlkZ2VJbXBsIDxlbT5TZW1hbnRpYyBNb2RlbCBCcmlkZ2U8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuU2VtYW50aWNNb2RlbEJyaWRnZUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0U2VtYW50aWNNb2RlbEJyaWRnZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBTRU1BTlRJQ19NT0RFTF9CUklER0UgPSBlSU5TVEFOQ0UuZ2V0U2VtYW50aWNNb2RlbEJyaWRnZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgU0VNQU5USUNfTU9ERUxfQlJJREdFX19QUkVTRU5UQVRJT04gPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0U2VtYW50aWNNb2RlbEJyaWRnZV9QcmVzZW50YXRpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkdyYXBoIEVsZW1lbnQ8L2I+PC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgU0VNQU5USUNfTU9ERUxfQlJJREdFX19HUkFQSF9FTEVNRU5UID0gZUlOU1RBTkNFCi0JCQkJLmdldFNlbWFudGljTW9kZWxCcmlkZ2VfR3JhcGhFbGVtZW50KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5EaWFncmFtPC9iPjwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFNFTUFOVElDX01PREVMX0JSSURHRV9fRElBR1JBTSA9IGVJTlNUQU5DRQotCQkJCS5nZXRTZW1hbnRpY01vZGVsQnJpZGdlX0RpYWdyYW0oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5EaW1lbnNpb25JbXBsIDxlbT5EaW1lbnNpb248L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRGltZW5zaW9uSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXREaW1lbnNpb24oKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgRElNRU5TSU9OID0gZUlOU1RBTkNFLmdldERpbWVuc2lvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+V2lkdGg8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBESU1FTlNJT05fX1dJRFRIID0gZUlOU1RBTkNFLmdldERpbWVuc2lvbl9XaWR0aCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SGVpZ2h0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgRElNRU5TSU9OX19IRUlHSFQgPSBlSU5TVEFOQ0UuZ2V0RGltZW5zaW9uX0hlaWdodCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlJlZmVyZW5jZUltcGwgPGVtPlJlZmVyZW5jZTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5SZWZlcmVuY2VJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFJlZmVyZW5jZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBSRUZFUkVOQ0UgPSBlSU5TVEFOQ0UuZ2V0UmVmZXJlbmNlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JcyBJbmRpdmlkdWFsIFJlcHJlc2VudGF0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgUkVGRVJFTkNFX19JU19JTkRJVklEVUFMX1JFUFJFU0VOVEFUSU9OID0gZUlOU1RBTkNFCi0JCQkJLmdldFJlZmVyZW5jZV9Jc0luZGl2aWR1YWxSZXByZXNlbnRhdGlvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UmVmZXJlbmNlZDwvYj48L2VtPicgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFJFRkVSRU5DRV9fUkVGRVJFTkNFRCA9IGVJTlNUQU5DRS5nZXRSZWZlcmVuY2VfUmVmZXJlbmNlZCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlByb3BlcnR5SW1wbCA8ZW0+UHJvcGVydHk8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUHJvcGVydHlJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFByb3BlcnR5KCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFBST1BFUlRZID0gZUlOU1RBTkNFLmdldFByb3BlcnR5KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5LZXk8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBQUk9QRVJUWV9fS0VZID0gZUlOU1RBTkNFLmdldFByb3BlcnR5X0tleSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBQUk9QRVJUWV9fVkFMVUUgPSBlSU5TVEFOQ0UuZ2V0UHJvcGVydHlfVmFsdWUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5HcmFwaEVkZ2VJbXBsIDxlbT5HcmFwaCBFZGdlPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkdyYXBoRWRnZUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0R3JhcGhFZGdlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIEdSQVBIX0VER0UgPSBlSU5TVEFOQ0UuZ2V0R3JhcGhFZGdlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5BbmNob3I8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIEdSQVBIX0VER0VfX0FOQ0hPUiA9IGVJTlNUQU5DRS5nZXRHcmFwaEVkZ2VfQW5jaG9yKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5XYXlwb2ludHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIEdSQVBIX0VER0VfX1dBWVBPSU5UUyA9IGVJTlNUQU5DRS5nZXRHcmFwaEVkZ2VfV2F5cG9pbnRzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRGlhZ3JhbUltcGwgPGVtPkRpYWdyYW08L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRGlhZ3JhbUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0RGlhZ3JhbSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBESUFHUkFNID0gZUlOU1RBTkNFLmdldERpYWdyYW0oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlpvb208L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBESUFHUkFNX19aT09NID0gZUlOU1RBTkNFLmdldERpYWdyYW1fWm9vbSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Vmlld3BvaW50PC9iPjwvZW0+JyByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgRElBR1JBTV9fVklFV1BPSU5UID0gZUlOU1RBTkNFLmdldERpYWdyYW1fVmlld3BvaW50KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5EaWFncmFtIExpbms8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIERJQUdSQU1fX0RJQUdSQU1fTElOSyA9IGVJTlNUQU5DRS5nZXREaWFncmFtX0RpYWdyYW1MaW5rKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5OYW1lc3BhY2U8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBESUFHUkFNX19OQU1FU1BBQ0UgPSBlSU5TVEFOQ0UuZ2V0RGlhZ3JhbV9OYW1lc3BhY2UoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5HcmFwaE5vZGVJbXBsIDxlbT5HcmFwaCBOb2RlPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkdyYXBoTm9kZUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0R3JhcGhOb2RlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIEdSQVBIX05PREUgPSBlSU5TVEFOQ0UuZ2V0R3JhcGhOb2RlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TaXplPC9iPjwvZW0+JyByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgR1JBUEhfTk9ERV9fU0laRSA9IGVJTlNUQU5DRS5nZXRHcmFwaE5vZGVfU2l6ZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlNpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50SW1wbCA8ZW0+U2ltcGxlIFNlbWFudGljIE1vZGVsIEVsZW1lbnQ8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnRJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFNpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50KCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFNJTVBMRV9TRU1BTlRJQ19NT0RFTF9FTEVNRU5UID0gZUlOU1RBTkNFCi0JCQkJLmdldFNpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5UeXBlIEluZm88L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBTSU1QTEVfU0VNQU5USUNfTU9ERUxfRUxFTUVOVF9fVFlQRV9JTkZPID0gZUlOU1RBTkNFCi0JCQkJLmdldFNpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50X1R5cGVJbmZvKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVU1BU2VtYW50aWNNb2RlbEJyaWRnZUltcGwgPGVtPlVNQSBTZW1hbnRpYyBNb2RlbCBCcmlkZ2U8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVU1BU2VtYW50aWNNb2RlbEJyaWRnZUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0VU1BU2VtYW50aWNNb2RlbEJyaWRnZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBVTUFfU0VNQU5USUNfTU9ERUxfQlJJREdFID0gZUlOU1RBTkNFCi0JCQkJLmdldFVNQVNlbWFudGljTW9kZWxCcmlkZ2UoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkVsZW1lbnQ8L2I+PC9lbT4nIHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBVTUFfU0VNQU5USUNfTU9ERUxfQlJJREdFX19FTEVNRU5UID0gZUlOU1RBTkNFCi0JCQkJLmdldFVNQVNlbWFudGljTW9kZWxCcmlkZ2VfRWxlbWVudCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkNvcmVTZW1hbnRpY01vZGVsQnJpZGdlSW1wbCA8ZW0+Q29yZSBTZW1hbnRpYyBNb2RlbCBCcmlkZ2U8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQ29yZVNlbWFudGljTW9kZWxCcmlkZ2VJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldENvcmVTZW1hbnRpY01vZGVsQnJpZGdlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIENPUkVfU0VNQU5USUNfTU9ERUxfQlJJREdFID0gZUlOU1RBTkNFCi0JCQkJLmdldENvcmVTZW1hbnRpY01vZGVsQnJpZGdlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5FbGVtZW50PC9iPjwvZW0+JyByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgQ09SRV9TRU1BTlRJQ19NT0RFTF9CUklER0VfX0VMRU1FTlQgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0Q29yZVNlbWFudGljTW9kZWxCcmlkZ2VfRWxlbWVudCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkxlYWZFbGVtZW50SW1wbCA8ZW0+TGVhZiBFbGVtZW50PC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkxlYWZFbGVtZW50SW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRMZWFmRWxlbWVudCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBMRUFGX0VMRU1FTlQgPSBlSU5TVEFOQ0UuZ2V0TGVhZkVsZW1lbnQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5UZXh0RWxlbWVudEltcGwgPGVtPlRleHQgRWxlbWVudDwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5UZXh0RWxlbWVudEltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0VGV4dEVsZW1lbnQoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgVEVYVF9FTEVNRU5UID0gZUlOU1RBTkNFLmdldFRleHRFbGVtZW50KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5UZXh0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgVEVYVF9FTEVNRU5UX19URVhUID0gZUlOU1RBTkNFLmdldFRleHRFbGVtZW50X1RleHQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5JbWFnZUltcGwgPGVtPkltYWdlPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkltYWdlSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRJbWFnZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBJTUFHRSA9IGVJTlNUQU5DRS5nZXRJbWFnZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VXJpPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgSU1BR0VfX1VSSSA9IGVJTlNUQU5DRS5nZXRJbWFnZV9VcmkoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk1pbWUgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIElNQUdFX19NSU1FX1RZUEUgPSBlSU5TVEFOQ0UuZ2V0SW1hZ2VfTWltZVR5cGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5HcmFwaGljUHJpbWl0aXZlSW1wbCA8ZW0+R3JhcGhpYyBQcmltaXRpdmU8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuR3JhcGhpY1ByaW1pdGl2ZUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0R3JhcGhpY1ByaW1pdGl2ZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBHUkFQSElDX1BSSU1JVElWRSA9IGVJTlNUQU5DRS5nZXRHcmFwaGljUHJpbWl0aXZlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUG9seWxpbmVJbXBsIDxlbT5Qb2x5bGluZTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Qb2x5bGluZUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0UG9seWxpbmUoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgUE9MWUxJTkUgPSBlSU5TVEFOQ0UuZ2V0UG9seWxpbmUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkNsb3NlZDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFBPTFlMSU5FX19DTE9TRUQgPSBlSU5TVEFOQ0UuZ2V0UG9seWxpbmVfQ2xvc2VkKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5XYXlwb2ludHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFBPTFlMSU5FX19XQVlQT0lOVFMgPSBlSU5TVEFOQ0UuZ2V0UG9seWxpbmVfV2F5cG9pbnRzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRWxsaXBzZUltcGwgPGVtPkVsbGlwc2U8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRWxsaXBzZUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0RWxsaXBzZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBFTExJUFNFID0gZUlOU1RBTkNFLmdldEVsbGlwc2UoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlJhZGl1cyBYPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgRUxMSVBTRV9fUkFESVVTX1ggPSBlSU5TVEFOQ0UuZ2V0RWxsaXBzZV9SYWRpdXNYKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5SYWRpdXMgWTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEVMTElQU0VfX1JBRElVU19ZID0gZUlOU1RBTkNFLmdldEVsbGlwc2VfUmFkaXVzWSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Um90YXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBFTExJUFNFX19ST1RBVElPTiA9IGVJTlNUQU5DRS5nZXRFbGxpcHNlX1JvdGF0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TdGFydCBBbmdsZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEVMTElQU0VfX1NUQVJUX0FOR0xFID0gZUlOU1RBTkNFLmdldEVsbGlwc2VfU3RhcnRBbmdsZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RW5kIEFuZ2xlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgRUxMSVBTRV9fRU5EX0FOR0xFID0gZUlOU1RBTkNFLmdldEVsbGlwc2VfRW5kQW5nbGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkNlbnRlcjwvYj48L2VtPicgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIEVMTElQU0VfX0NFTlRFUiA9IGVJTlNUQU5DRS5nZXRFbGxpcHNlX0NlbnRlcigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrT3JkZXJUeXBlIDxlbT5Xb3JrIE9yZGVyIFR5cGU8L2VtPn0nIGVudW0uCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya09yZGVyVHlwZQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRXb3JrT3JkZXJUeXBlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUVudW0gV09SS19PUkRFUl9UWVBFID0gZUlOU1RBTkNFLmdldFdvcmtPcmRlclR5cGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlUeXBlIDxlbT5WYXJpYWJpbGl0eSBUeXBlPC9lbT59JyBlbnVtLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5VHlwZQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRWYXJpYWJpbGl0eVR5cGUoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFRW51bSBWQVJJQUJJTElUWV9UWVBFID0gZUlOU1RBTkNFLmdldFZhcmlhYmlsaXR5VHlwZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+RGF0ZTwvZW0+JyBkYXRhIHR5cGUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIGphdmEudXRpbC5EYXRlCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldERhdGUoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFRGF0YVR5cGUgREFURSA9IGVJTlNUQU5DRS5nZXREYXRlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT5Vcmk8L2VtPicgZGF0YSB0eXBlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBqYXZhLm5ldC5VUkkKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0VXJpKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRURhdGFUeXBlIFVSSSA9IGVJTlNUQU5DRS5nZXRVcmkoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPlN0cmluZzwvZW0+JyBkYXRhIHR5cGUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0U3RyaW5nKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRURhdGFUeXBlIFNUUklORyA9IGVJTlNUQU5DRS5nZXRTdHJpbmcoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPkJvb2xlYW48L2VtPicgZGF0YSB0eXBlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBqYXZhLmxhbmcuQm9vbGVhbgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRCb29sZWFuKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRURhdGFUeXBlIEJPT0xFQU4gPSBlSU5TVEFOQ0UuZ2V0Qm9vbGVhbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+U2V0PC9lbT4nIGRhdGEgdHlwZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgamF2YS51dGlsLlNldAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRTZXQoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFRGF0YVR5cGUgU0VUID0gZUlOU1RBTkNFLmdldFNldCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+U2VxdWVuY2U8L2VtPicgZGF0YSB0eXBlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBqYXZhLnV0aWwuTGlzdAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRTZXF1ZW5jZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVEYXRhVHlwZSBTRVFVRU5DRSA9IGVJTlNUQU5DRS5nZXRTZXF1ZW5jZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+SW50ZWdlcjwvZW0+JyBkYXRhIHR5cGUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRJbnRlZ2VyKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRURhdGFUeXBlIElOVEVHRVIgPSBlSU5TVEFOQ0UuZ2V0SW50ZWdlcigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+RG91YmxlPC9lbT4nIGRhdGEgdHlwZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgamF2YS5sYW5nLkRvdWJsZQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXREb3VibGUoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFRGF0YVR5cGUgRE9VQkxFID0gZUlOU1RBTkNFLmdldERvdWJsZSgpOwotCi0JfQotCi19IC8vVW1hUGFja2FnZQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvVmFyaWFiaWxpdHlFbGVtZW50LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1ZhcmlhYmlsaXR5RWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMTJiNjdkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvVmFyaWFiaWxpdHlFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5WYXJpYWJpbGl0eSBFbGVtZW50PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogVmFyaWFiaWxpdHkgRWxlbWVudCBpcyBhbiBhYnN0cmFjdCBjbGFzcyBkZXJpdmVkIGZyb20gTWV0aG9kIEVsZW1lbnQgdGhhdCBwcm92aWRlcyBuZXcgY2FwYWJpbGl0aWVzIGZvciBjb250ZW50IHZhcmlhdGlvbiBhbmQgZXh0ZW5zaW9uIHRvIENvbnRlbnQgRWxlbWVudHMgb3IgYW55IG90aGVyIE1ldGhvZCBFbGVtZW50IHRoYXQgZGVyaXZlcyBmcm9tIGl0LiAgSXQgaGFzIGJlZW4gcGxhY2VkIGluLWJldHdlZW4gdGhlIGNsYXNzZXMgTWV0aG9kIEVsZW1lbnQgYW5kIENvbnRlbnQgRWxlbWVudCBpbiB0aGUgb3ZlcmFsbCBVTUEgdGF4b25vbXkgb2YgY2xhc3NlcyB1c2luZyB0aGUgVU1MIDIuMCBwYWNrYWdlIG1lcmdlIG1lY2hhbmlzbS4gIFRoZSBhc3NvY2lhdGlvbiBWYXJpYWJpbGl0eSBTcGVjaWFsaXphdGlvbiBzaGFsbCBvbmx5IGJlIGluc3RhbnRpYXRlZCBiZXR3ZWVuIHR3byBzdWJjbGFzc2VzIG9mIFZhcmlhYmlsaXR5IEVsZW1lbnQgb2YgdGhlIHNhbWUgdHlwZS4gIFRoZSBlbGVtZW50IG9uIHZhcmFpYmlsaXR5U3BlY2lhbEVsZW1lbnQgc2lkZSBvZiB0aGUgcmVsYXRpb25zaGlwIGRlZmluZXMgYSB2YWx1ZSBmb3IgdGhlIGF0dHJpYnV0ZSB2YXJpYWJpbGl0eVR5cGUgZGVmaW5pbmcgdGhlIG5hdHVyZSBvZiB0aGUgcmVsYXRpb25zaGlwIHVzaW5nIGEgbGl0ZXJhbCBmcm9tIHRoZSBlbnVtZXJhdGlvbiBWYXJpYWJpbGl0eSBUeXBlLgotICogVmFyaWFiaWxpdHkgRWxlbWVudCBvZiB0aGUgbWV0YS1tb2RlbCBwYWNrYWdlIE1ldGhvZCBQbHVnaW5zIGFkZHMgdGhlIGNhcGFiaWxpdGllcyBvZiB2YXJpYXRpb24gYW5kIGV4dGVuc2lvbiB0byBNZXRob2QgRWxlbWVudHMgdGhhdCBkZXJpdmUgZnJvbSBpdC4gIEJ5IGRlZmF1bHQgYWxsIENvbnRlbnQgRWxlbWVudHMgc3VjaCBhcyBSb2xlLCBUYXNrLCBHdWlkYW5jZSBUeXBlcywgb3IgQWN0aXZpdGllcyBhcmUgZGVmaW5lZCB0byBiZSBWYXJpYWJpbGl0eSBFbGVtZW50cy4KLSAqIFZhcmlhYmlsaXR5IGFuZCBleHRlbnNpb24gcHJvdmlkZXMgdW5pcXVlIG1lY2hhbmlzbXMgZm9yIGN1c3RvbWl6aW5nIG1ldGhvZCBjb250ZW50IHdpdGhvdXQgYWN0dWFsbHkgZGlyZWN0bHkgbW9kaWZ5aW5nIHRoZSBvcmlnaW5hbCBjb250ZW50LCBidXQgYnkganVzdCBiZSBhYmxlIHRvIGRlc2NyaWJlIHdpdGggc2VwYXJhdGUgb2JqZWN0cyB0aGUgZGlmZmVyZW5jZXMgKGFkZGl0aW9ucywgY2hhbmdlcywgb21pc3Npb25zKSByZWxhdGl2ZSB0byB0aGUgb3JpZ2luYWwuICBUaGlzIHBsdWctaW4gY29uY2VwdCBhbGxvd3MgdXNlcnMgdG8gZmFjdG9yIHRoZWlyIG1ldGhvZCBjb250ZW50IGFuZCBwcm9jZXNzZXMgaW4gaW50ZXJyZWxhdGVkIHVuaXRzIGFuZCBldmVuIHRvIGFyY2hpdGVjdCBtZXRob2QgY29udGVudCBhbmQgcHJvY2Vzc2VzIGluIGxheWVycyB0aGF0IGV4dGVuZCBlYWNoIG90aGVyIHdpdGggbmV3IGNhcGFiaWxpdGllcy4gIFRoZSByZXN1bHRpbmcgbWV0aG9kIGFuZCBwcm9jZXNzIGRlc2lnbiBjYW4gYmUgZHluYW1pY2FsbHkgY29tYmluZWQgYW5kIGFwcGxpZWQgb24gZGVtYW5kIHVzaW5nIHRoZSBpbnRlcnByZXRhdGlvbiBydWxlcyBkZWZpbmVkIGZvciBWYXJpYWJpbGl0eSBFbGVtZW50IFNwZWNpYWxpemF0aW9ucyBhc3NlbWJsaW5nIHRvIHByb2Nlc3MgcHJhY3RpdGlvbmVycyB0aGUgbW9zdCBhY2N1cmF0ZSBtZXRob2QgYW5kIHByb2Nlc3MgZGVzY3JpcHRpb25zIHBvc3NpYmxlLiAgSXQgYWxzbyBhbGxvd3MgcHJvY2VzcyBwcmFjdGl0aW9uZXJzIHRvIGV4dGVuZHMgYW5kIHRhaWxvciBtZXRob2QgY29udGVudCBhbmQgcHJvY2Vzc2VzIHRoZXkgZG8gbm90IG93biBhbmQgdG8gZWFzaWx5IHVwZ3JhZGUgdG8gbmV3ZXIgdmVyc2lvbnMgYnkgc2ltcGx5IHJlYXBwbHkgdGhlaXIgcGVyc29uYWwgY2hhbmdlcyB0byB0aGVzZSB1cGdyYWRlcy4KLSAqIFZhcmlhYmlsaXR5IEVsZW1lbnQgZGVmaW5lcyB0d28gdHlwZXMgb2YgdmFyaWFiaWxpdHkgYW5kIG9uZSB0eXBlIG9mIGV4dGVuc2lvbiB3aGljaCBhcmUgZm9ybWFsbHkgZGVmaW5lZCBmb3IgdGhlIGVudW1lcmF0aW9uIFZhcmlhYmlsaXR5IFR5cGUuCi0gKiAKLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudCNnZXRWYXJpYWJpbGl0eVR5cGUgPGVtPlZhcmlhYmlsaXR5IFR5cGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50I2dldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQgPGVtPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRWYXJpYWJpbGl0eUVsZW1lbnQoKQotICogQG1vZGVsIGFic3RyYWN0PSJ0cnVlIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFZhcmlhYmlsaXR5RWxlbWVudCBleHRlbmRzIE1ldGhvZEVsZW1lbnQgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4ibmEiPC9jb2RlPi4KLQkgKiBUaGUgbGl0ZXJhbHMgYXJlIGZyb20gdGhlIGVudW1lcmF0aW9uIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5VHlwZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBJZiBpbiBpbnN0YW5jZSBvZiB0aGUgdmFyaWFiaWxpdHlTcGVjaWFsaXphdGlvbiBhc3NvY2lhdGlvbiBiZXR3ZWVuIHR3byBWYXJpYWJpbGl0eSBFbGVtZW50cyBvZiB0aGUgc2FtZSB0eXBlIGV4aXN0cywgdGhlbiB0aGUgdmFyaWFiaWxpdHlUeXBlIGF0dHJpYnV0ZSBzcGVjaWZpZXMgaG93IHRoZSBlbGVtZW50IGF0IHRoZSB2YXJpYWJpbGl0eVNwZWNpYWxFbGVtZW50IGVuZCBvZiB0aGUgYXNzb2NpYXRpb24gY2hhbmdlcyB0aGUgQ29udGVudCBFbGVtZW50IGF0IHRoZSB2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50IGVuZC4gU2VlIHRoZSBWYXJpYWJpbGl0eSBUeXBlIGVudW1lcmF0aW9uIGNsYXNzIGZvciBkZWZpbml0aW9ucyBmb3IgdGhlIGRpZmZlcmVudCB0eXBlcyBvZiB2YXJpYWJpbGl0eS4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VmFyaWFiaWxpdHkgVHlwZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5VHlwZQotCSAqIEBzZWUgI3NldFZhcmlhYmlsaXR5VHlwZShWYXJpYWJpbGl0eVR5cGUpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0VmFyaWFiaWxpdHlFbGVtZW50X1ZhcmlhYmlsaXR5VHlwZSgpCi0JICogQG1vZGVsIGRlZmF1bHQ9Im5hIiByZXF1aXJlZD0idHJ1ZSIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVZhcmlhYmlsaXR5VHlwZSBnZXRWYXJpYWJpbGl0eVR5cGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50I2dldFZhcmlhYmlsaXR5VHlwZSA8ZW0+VmFyaWFiaWxpdHkgVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VmFyaWFiaWxpdHkgVHlwZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5VHlwZQotCSAqIEBzZWUgI2dldFZhcmlhYmlsaXR5VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VmFyaWFiaWxpdHlUeXBlKFZhcmlhYmlsaXR5VHlwZSB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9lbT4nIHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2VtPicgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoVmFyaWFiaWxpdHlFbGVtZW50KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFZhcmlhYmlsaXR5RWxlbWVudF9WYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkKLQkgKiBAbW9kZWwgcmVxdWlyZWQ9InRydWUiIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlWYXJpYWJpbGl0eUVsZW1lbnQgZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQjZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCA8ZW0+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvZW0+fScgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvZW0+JyByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudChWYXJpYWJpbGl0eUVsZW1lbnQgdmFsdWUpOwotCi19IC8vIFZhcmlhYmlsaXR5RWxlbWVudApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9WYXJpYWJpbGl0eVR5cGUuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvVmFyaWFiaWxpdHlUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyZjA3ZTAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9WYXJpYWJpbGl0eVR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRW51bWVyYXRvcjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbGl0ZXJhbHMgb2YgdGhlIGVudW1lcmF0aW9uICc8ZW0+PGI+VmFyaWFiaWxpdHkgVHlwZTwvYj48L2VtPicsCi0gKiBhbmQgdXRpbGl0eSBtZXRob2RzIGZvciB3b3JraW5nIHdpdGggdGhlbS4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBWYXJpYWJpbGl0eSBUeXBlIGlzIGFuIEVudW1lcmF0aW9uIHVzZWQgZm9yIHZhbHVlcyBmb3IgaW5zdGFuY2VzIG9mIFZhcmlhYmlsaXR5IEVsZW1lbnQncyBhdHRyaWJ1dGUgdmFyaWFiaWxpdHlUeXBlLiAgSXQgZGVmaW5lcyB0aGUgbmF0dXJlIG9mIGhvdyBhIFZhcmlhYmlsaXR5IEVsZW1lbnQgZXh0ZW5kcyBhbm90aGVyIFZhcmlhYmlsaXR5IEVsZW1lbnQuIFNlZSBlbnVtZXJhdGlvbiBsaXRlcmFscyBmb3IgZGVmaW5pdGlvbnMgZm9yIGVhY2ggdHlwZS4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFZhcmlhYmlsaXR5VHlwZSgpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGVudW0gVmFyaWFiaWxpdHlUeXBlIGltcGxlbWVudHMgRW51bWVyYXRvciB7Ci0JLyoqCi0JICogVGhlICc8ZW0+PGI+TmE8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjTkFfVkFMVUUKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlOQSgwLCAibmEiLCAibmEiKSwKLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5Db250cmlidXRlczwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNDT05UUklCVVRFU19WQUxVRQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCUNPTlRSSUJVVEVTKDEsICJjb250cmlidXRlcyIsICJjb250cmlidXRlcyIpLAotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkV4dGVuZHM8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjRVhURU5EU19WQUxVRQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCUVYVEVORFMoMiwgImV4dGVuZHMiLCAiZXh0ZW5kcyIpLAotCS8qKgotCSAqIFRoZSAnPGVtPjxiPlJlcGxhY2VzPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI1JFUExBQ0VTX1ZBTFVFCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JUkVQTEFDRVMoMywgInJlcGxhY2VzIiwgInJlcGxhY2VzIiksCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+TG9jYWwgQ29udHJpYnV0aW9uPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0xPQ0FMX0NPTlRSSUJVVElPTl9WQUxVRQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCUxPQ0FMX0NPTlRSSUJVVElPTig0LCAibG9jYWxDb250cmlidXRpb24iLCAibG9jYWxDb250cmlidXRpb24iKSwKLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5Mb2NhbCBSZXBsYWNlbWVudDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNMT0NBTF9SRVBMQUNFTUVOVF9WQUxVRQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCUxPQ0FMX1JFUExBQ0VNRU5UKDUsICJsb2NhbFJlcGxhY2VtZW50IiwgImxvY2FsUmVwbGFjZW1lbnQiKSwKLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5FeHRlbmRzIFJlcGxhY2VzPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0VYVEVORFNfUkVQTEFDRVNfVkFMVUUKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlFWFRFTkRTX1JFUExBQ0VTKDYsICJleHRlbmRzUmVwbGFjZXMiLCAiZXh0ZW5kc1JlcGxhY2VzIik7Ci0JLyoqCi0JICogVGhlICc8ZW0+PGI+TmE8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGlzIGlzIHRoZSBkZWZhdWx0ICJub3QgYXNzaWduZWQiIHZhbHVlIG9mIGEgVmFyaWFiaWxsaXR5IEVsZW1lbnQncyB2YXJpYWJpbGl0eVR5cGUgYXR0cmlidXRlIHdoaWNoIGlzIHNldCBpbiB0aGUgY2FzZSBubyB2YXJpYWJpbGl0eSBhc3NvY2lhdGlvbiBpcyBwcmVzZW50IGJldHdlZW4gdGhlIFZhcmlhYmlsaXR5IEVsZW1lbnQgYW5kIG90aGVyIFZhcmlhYmlsaXR5IEVsZW1lbnRzLgotCSAqIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAc2VlICNOQQotCSAqIEBtb2RlbCBuYW1lPSJuYSIKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOQV9WQUxVRSA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5Db250cmlidXRlczwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIENvbnRyaWJ1dGVzIHByb3ZpZGVzIGEgd2F5IGZvciBpbnN0YW5jZXMgb2YgVmFyaWFiaWxpdHkgRWxlbWVudHMgdG8gY29udHJpYnV0ZSB0aGVpciBwcm9wZXJ0aWVzIGludG8gdGhlaXIgYmFzZSBWYXJpYWJpbGl0eSBFbGVtZW50IHdpdGhvdXQgZGlyZWN0bHkgYWx0ZXJpbmcgYW55IG9mIGl0cyBleGlzdGluZyBwcm9wZXJ0aWVzLCBpLmUuIGluIGFuIGFkZGl0aXZlIGZhc2hpb24uICBQcm9wZXJ0aWVzIGNvbnRyaWJ1dGVkIGFyZTogYXR0cmlidXRlIHZhbHVlcyBhbmQgYXNzb2NpYXRpb24gaW5zdGFuY2VzLiAgVGhlIGVmZmVjdCBhZnRlciBpbnRlcnByZXRhdGlvbiBvZiBjb250cmlidXRpb24gaXMgdGhhdCB0aGUgYmFzZSBWYXJpYWJpbGl0eSBFbGVtZW50IGlzIGxvZ2ljYWxseSByZXBsYWNlZCB3aXRoIGFuIGF1Z21lbnRlZCB2YXJpYW50IG9mIHRoZSBlbGVtZW50IHRoYXQgY29tYmluZXMgYXR0cmlidXRlIHZhbHVlcyBhbmQgYXNzb2NpYXRpb24gaW5zdGFuY2VzLiAgVGhlIHdheSB0aGlzIGNvbWJpbmF0aW9uIGlzIHJlYWxpemVkIGRlcGVuZHMgb24gdGhlIHR5cGUgb2YgdGhlIGF0dHJpYnV0ZSBvciBhc3NvY2lhdGlvbi4gIEZvciBleGFtcGxlLCBTdHJpbmcgYXR0cmlidXRlcyBhcmUgY29uY2F0ZW5hdGVkIHJlc29sdmluZyBlbWJlZGRlZCBjb21tYW5kcyBmb3IgZGVwZW5kZW50IHRleHQgb3IgbWVyZ2luZyB0ZXh0IGZyYWdtZW50cyAoZS5nLiBkZXNjcmlwdGlvbnMgZm9yIGNvbnRlbnQgZWxlbWVudHMpLiAgQWRkaXRpb25hbCBlbGVtZW50cyBpbiB0by1tYW55IGFzc29jaWF0aW9ucyBhcmUgYWRkZWQgKGUuZy4gYWRkaXRpb25hbCBHdWlkYW5jZSBlbGVtZW50cyBvciBUYXNrIERlc2NyaXB0b3JzIG9mIGFuIEFjdGl2aXR5KS4gIERpZmZlcmVudCBlbGVtZW50cyBpbiB0by1vbmUgYXNzb2NpYXRpb25zIGFyZSBpZ25vcmVkIChlLmcuIHRoZSBvbmUgUHJpbWFyeSBQZXJmb3JtZXIgb2YgYSBUYXNrKS4gIE11bHRpcGxlIENvbnRlbnQgRWxlbWVudHMgY2FuIGNvbnRyaWJ1dGUgdG8gdGhlIHNhbWUgYmFzZSBlbGVtZW50IGFuZCBhbGwgb2YgdGhlc2UgY29udHJpYnV0aW9ucyBwcm9wZXJ0aWVzIGFyZSBhZGRlZCB0byB0aGUgYmFzZSBpbiB0aGUgc2FtZSBmYXNoaW9uLiBUaGUgZm9sbG93aW5nIHRhYmxlIHByb3ZpZGVzIHRoZSBkZXRhaWxlZCBsaXN0IG9mIGludGVycHJldGF0aW9uIHJ1bGVzOgotCSAqIGF0dHJpYnV0ZSB2YWx1ZXM6CVN0cmluZyB2YWx1ZXMgZnJvbSB0aGUgc3BlY2lhbCBWYXJpYWJpbGl0eSBFbGVtZW50IGFyZSBjb25jYXRlbmF0ZWQgd2l0aCB2YWx1ZXMgZnJvbSB0aGUgYmFzZWQtb24gVmFyaWFiaWxpdHkgRWxlbWVudC4gIE90aGVyIHZhbHVlcyBmcm9tIHRoZSBzcGVjaWFsIFZhcmlhYmlsaXR5IEVsZW1lbnQgb2YgYW55IG90aGVyIHR5cGUgc3VjaCBhcyBJbnRlZ2VyLCBEYXRlIGFyZSBpZ25vcmVkLgotCSAqIFRoZSBpZGVudGlmeWluZyBhdHRyaWJ1dGVzIGd1aWQgYW5kIG5hbWUgb2YgTWV0aG9kIEVsZW1lbnQgYXJlIGV4ZW1wdCBmcm9tIHRoaXMgcnVsZSBhbmQgd2lsbCBub3QgYmUgbW9kaWZpZWQuCi0JICogMC4uMS1hc3NvY2lhdGlvbiBpbnN0YW5jZXM6CVRoZSBvbmUgYXNzb2NpYXRpb24gaW5zdGFuY2Ugb2YgdGhlIGJhc2VkLW9uIFZhcmlhYmlsaXR5IEVsZW1lbnQgaXMga2VwdCBhbmQgYW55IGFzc29jaWF0aW9uIGZyb20gdGhlIGNvbnRyaWJ1dGluZyBzcGVjaWFsIFZhcmlhYmlsaXR5IEVsZW1lbnQgaXMgaWdub3JlZC4KLQkgKiAwLi5uLWFzc29jaWF0aW9uIGluc3RhbmNlczoJQXNzb2NpYXRpb24gaW5zdGFuY2VzIG9mIHRoZSBzcGVjaWFsIFZhcmlhYmlsaXR5IEVsZW1lbnQgYXJlIGFkZGVkIHRvIHRoZSBhbHJlYWR5IGV4aXN0aW5nIGFzc29jaWF0aW9uIGluc3RhbmNlcyBvZiB0aGUgYmFzZWQtb24gZWxlbWVudC4gIElmIGJvdGggVmFyaWFiaWxpdHkgRWxlbWVudHMgcmVmZXIgdG8gdGhlIHNhbWUgb2JqZWN0IHRoZW4gb25seSBvbmUgaW5zdGFuY2Ugb2YgdGhlIGFzc29jaWF0aW9uIHdpbGwgcmVtYWluLgotCSAqIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAc2VlICNDT05UUklCVVRFUwotCSAqIEBtb2RlbCBuYW1lPSJjb250cmlidXRlcyIKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT05UUklCVVRFU19WQUxVRSA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5FeHRlbmRzPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogRXh0ZW5zaW9uIGFsbG93cyBNZXRob2QgUGx1Z2lucyB0byBlYXNpbHkgcmV1c2UgZWxlbWVudHMgZnJvbSBhIEJhc2UgUGx1Z2luIGJ5IHByb3ZpZGluZyBhIGtpbmQgb2YgaW5oZXJpdGFuY2UgZm9yIHRoZSBzcGVjaWFsIFZhcmlhYmlsaXR5IEVsZW1lbnQuICBBdHRyaWJ1dGUgdmFsdWVzIGFuZCBBc3NvY2lhdGlvbiBpbnN0YW5jZXMgYXJlIGluaGVyaXRlZCBmcm9tIHRoZSBiYXNlZC1vbiBWYXJpYWJpbGl0eSBFbGVtZW50IHRvIHRoZSBzcGVjaWFsIFZhcmlhYmlsaXR5IEVsZW1lbnQuICBUaGUgcmVzdWx0IG9mIGludGVycHJldGF0aW9uIGlzIHRoYXQgdGhlIHNwZWNpYWwgZWxlbWVudCBoYXMgdGhlIHNhbWUgcHJvcGVydGllcyBhcyB0aGUgYmFzZWQtb24gaGFzLCBidXQgbWlnaHQgZGVmaW5lIGl0cyBvd24gYWRkaXRpb25zLiAgSGVuY2UgZXh0ZW5kcyBpcyBub3QgdXNlZCB0byBtb2RpZnkgY29udGVudCBvZiB0aGUgYmFzZSBQbHVnaW4sIGJ1dCB0byBwcm92aWRlIHRoZSBhYmlsaXR5IGZvciB0aGUgZXh0ZW5kaW5nIFBsdWdpbiB0byBkZWZpbmUgaXRzIG93biBjb250ZW50IHdoaWNoIGlzIGEgdmFyaWFudCBvZiBjb250ZW50IGFscmVhZHkgZGVmaW5lZCAoZS5nLiBhIHNwZWNpYWwgdmVyc2lvbiBvZiBhIGdlbmVyaWMgUmV2aWV3IFJlY29yZCBmb3IgYSBzcGVjaWZpYyB0eXBlIG9mIHJldmlldykuICBUaGUgZWZmZWN0IG9mIHRoaXMgaXMgdGhhdCB0aGUgYmFzZSBWYXJpYWJpbGl0eSBFbGVtZW50IGFuZCBhbnkgbnVtYmVyIG9mIGV4dGVuZGluZyBWYXJpYWJpbGl0eSBFbGVtZW50cyBjYW4gYmUgdXNlZCBzaWRlIGJ5IHNpZGUsIGJ1dCByZWZlciB0byBlYWNoIG90aGVyIHZpYSB0aGUgZXh0ZW5kcyByZWxhdGlvbnNoaXAuICBFeHRlbmRzIGFsc28gcHJvdmlkZXMgdGhlIGtleSBtZWNoYW5pc20gZm9yIGJpbmRpbmcgQ2FwYWJpbGl0eSBQYXR0ZXJucyB0byBQcm9jZXNzZXM6IEEgcGF0dGVybiBpcyBhcHBsaWVkIGJ5IGRlZmluaW5nIGFuIGV4dGVuZHMgcmVsYXRpb25zaGlwcyBmcm9tIGFuIEFjdGl2aXR5IG9mIHRoZSBhcHBseWluZyBQcm9jZXNzZXMgdG8gdGhlIFBhdHRlcm4uICBUaGUgQWN0aXZpdHkgaW5oZXJpdHMgYXNzb2NpYXRpb25zIGluc3RhbmNlcyBmcm9tIHRoZSBwYXR0ZXJuIGFuZCB0aGUgcGF0dGVybiBhcHBlYXJzIHRvIGJlIHBhcnQgb2YgdGhlIHJlc3VsdGluZyBQcm9jZXNzIGFmdGVyIEludGVycHJldGF0aW9uLgotCSAqIGF0dHJpYnV0ZSB2YWx1ZXM6CVZhbHVlcyBmcm9tIHRoZSBiYXNlZC1vbiBWYXJpYWJpbGl0eSBlbGVtZW50IGFyZSBpbmhlcml0ZWQgYW5kIHVzZWQgdG8gcG9wdWxhdGUgdGhlIHNwZWNpYWwgVmFyaWFiaWxpdHkgRWxlbWVudHMgYXR0cmlidXRlcy4gIElmIHRoZSBzcGVjaWFsIGVsZW1lbnQgYXR0cmlidXRlcyBhcmUgYWxyZWFkeSBwb3B1bGF0ZWQgdGhlIGluaGVyaXRlZCB2YWx1ZXMgYXJlIGlnbm9yZWQuICAKLQkgKiBUaGUgaWRlbnRpZnlpbmcgYXR0cmlidXRlcyBndWlkIGFuZCBuYW1lIG9mIE1ldGhvZCBFbGVtZW50IGFyZSBleGVtcHQgZnJvbSB0aGlzIHJ1bGUgYW5kIHdpbGwgbm90IGJlIG1vZGlmaWVkLgotCSAqIDAuLjEtYXNzb2NpYXRpb24gaW5zdGFuY2VzOglUaGUgb25lIGFzc29jaWF0aW9uIGluc3RhbmNlIG9mIHRoZSBiYXNlZC1vbiBWYXJpYWJpbGl0eSBFbGVtZW50IGlzIGluaGVyaXRlZCB0byB0aGUgc3BlY2lhbCBWYXJpYWJpbGl0eSBFbGVtZW50LiAgSWYgdGhlIHNwZWNpYWwgVmFyaWFiaWxpdHkgRWxlbWVudCBkZWZpbmVzIGl0cyBvd24gYXNzb2NpYXRpb24gaW5zdGFuY2UgdGhlbiB0aGUgaW5oZXJpdGVkIG9uZSBpcyBpZ25vcmVkLgotCSAqIDAuLm4tYXNzb2NpYXRpb24gaW5zdGFuY2VzOglBc3NvY2lhdGlvbiBpbnN0YW5jZXMgZGVmaW5lZCBmb3IgdGhlIGJhc2VkLW9uIFZhcmlhYmlsaXR5IEVsZW1lbnQgYXJlIGluaGVyaXRlZCB0byB0aGUgc3BlY2lhbCBWYXJpYWJpbGl0eSBFbGVtZW50LiAgVGhlIHNwZWNpYWwgZWxlbWVudCBjYW4gYWRkIGFkZGl0aW9uYWwgYXNzb2NpYXRpb24gaW5zdGFuY2VzLgotCSAqIAotCSAqIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAc2VlICNFWFRFTkRTCi0JICogQG1vZGVsIG5hbWU9ImV4dGVuZHMiCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVhURU5EU19WQUxVRSA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5SZXBsYWNlczwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFJlcGxhY2VzIHByb3ZpZGVzIGEgd2F5IGZvciBWYXJpYWJpbGl0eSBFbGVtZW50cyB0byByZXBsYWNlIGEgYmFzZSBWYXJpYWJpbGl0eSBFbGVtZW50IHdpdGhvdXQgZGlyZWN0bHkgY2hhbmdpbmcgYW55IG9mIGl0cyBleGlzdGluZyBwcm9wZXJ0aWVzLiAgVGhpcyBpcyBpbiBtb3N0IGNhc2VzIHVzZWQgZm9yIE1ldGhvZCBQbHVnaW5zIHRoYXQgYWltIHRvIHJlcGxhY2Ugc3BlY2lmaWMgQ29udGVudCBFbGVtZW50cyBzdWNoIGFzIFJvbGVzLCBUYXNrLCBvciBBY3Rpdml0aWVzIHdpdGggZWl0aGVyIGEgY29tcGxldGUgbmV3IHZhcmlhbnQgb3IgdG8gY2hhbmdlIGZ1bmRhbWVudGFsIHJlbGF0aW9uc2hpcHMgb2YgdGhlc2UgZWxlbWVudHMgKGUuZy4gUm9sZS1BcnRpZmFjdCByZXNwb25zaWJpbGl0eSkuICBQcm9wZXJ0aWVzIHJlcGxhY2VkIGFyZSBhdHRyaWJ1dGUgdmFsdWVzIGFuZCBhc3NvY2lhdGlvbiBpbnN0YW5jZXMuICBUaGUgZWZmZWN0IG9mIHRoaXMgaXMgdGhhdCB0aGUgYmFzZSBDb250ZW50IEVsZW1lbnQgaXMgbG9naWNhbGx5IHJlcGxhY2VkIHdpdGggdGhpcyBuZXcgdmFyaWFudCBvZiB0aGUgZWxlbWVudCB0byB3aGljaCBhbGwgaW5jb21pbmcgYXNzb2NpYXRpb25zIHN0aWxsIHBvaW50IGFzIGJlZm9yZSwgYnV0IHdoaWNoIGhhcyBwb3RlbnRpYWxseSBuZXcgYXR0cmlidXRlIHZhbHVlcyBhbmQgb3V0Z29pbmcgYXNzb2NpYXRpb24gcHJvcGVydGllcy4gIFRoaXMgcHJvdmlkZXMgYSB2ZXJ5IHBvd2VyZnVsIG1lY2hhbmlzbSB0byByZXBsYWNlLCBmb3IgZXhhbXBsZSwgd2hvbGUgQWN0aXZpdGllcyBpbiBhIFByb2Nlc3Mgd2l0aCBjb21wbGV0ZSBuZXcgcmVhbGl6YXRpb25zIG9mIHRoZSBBY3Rpdml0eS4gIEZvciBpbnN0YW5jZSwgcmVwbGFjaW5nIGFuIEFjdGl2aXR5IGRvaW5nIHVzZSBjYXNlLWJhc2VkIGRlc2lnbiB3aXRoIGFuIGFjdGl2aXR5IGRvaW5nIGFnaWxlIGNvZGUtY2VudHJpYyBkZXZlbG9wbWVudCBkb2luZyB0aGUgc2FtZSB3b3JrIHVzaW5nIGEgZGlmZmVyZW50IGRldmVsb3BtZW50IHRlY2huaXF1ZSB1dGlsaXppbmcgZGlmZmVyZW50IFJvbGVzLCBUYXNrcywgZXRjLiAgQW5vdGhlciBleGFtcGxlLCB3b3VsZCBiZSB0byByZXBsYWNlIGFuIEFjdGl2aXR5IHRoYXQgZGVzY3JpYmVzIGRhdGFiYXNlIGRlc2lnbiBmb3IgYW4gUkRCTVMgd2l0aCBhbiBBY3Rpdml0eSB0aGF0IGRlc2NyaWJlcyBkYXRhYmFzZSBkZXNpZ24gZm9yIGFuIE9PREJNUy4gIEEgVmFyaWFiaWxpdHkgRWxlbWVudCBjYW4gb25seSBiZSByZXBsYWNlZCBieSBvbmUgb3RoZXIgZWxlbWVudCBhdCBhIHRpbWUuICBGb3IgZXhhbXBsZSwgaWYgdHdvIE1ldGhvZCBQbHVnaW5zIHJlcGxhY2UgdGhlIHNhbWUgZWxlbWVudCBvbmx5IG9uZSBNZXRob2QgUGx1Z2luIGNhbiBiZSB1c2VkIGZvciBpbnRlcnByZXRhdGlvbiAoc2VlIGNvbmNlcHQgb2YgTWV0aG9kIENvbmZpZ3VyYXRpb24gZm9yIG1vcmUgZGV0YWlscyBvbiBob3cgdG8gcmVzb2x2ZSBzdWNoIGNvbmZsaWN0cywgU2VjdGlvbiA3LjEuMikuICBUaGUgZm9sbG93aW5nIHRhYmxlIHByb3ZpZGVzIHRoZSBkZXRhaWxlZCBsaXN0IG9mIGludGVycHJldGF0aW9uIHJ1bGVzOgotCSAqIGF0dHJpYnV0ZSB2YWx1ZXM6CVZhbHVlcyBmcm9tIHRoZSBzcGVjaWFsIFZhcmlhYmlsaXR5IEVsZW1lbnQgYXJlIHJlcGxhY2VkIHdpdGggdmFsdWVzIGZyb20gdGhlIGJhc2VkLW9uIFZhcmlhYmlsaXR5IEVsZW1lbnQgaW5jbHVkaW5nIHVuYXNzaWduZWQgdmFsdWVzLgotCSAqIFRoZSBpZGVudGlmeWluZyBhdHRyaWJ1dGVzIGd1aWQgYW5kIG5hbWUgb2YgTWV0aG9kIEVsZW1lbnQgYXJlIGV4ZW1wdCBmcm9tIHRoaXMgcnVsZSBhbmQgd2lsbCBub3QgYmUgbW9kaWZpZWQuCi0JICogMC4uMS1hc3NvY2lhdGlvbiBpbnN0YW5jZXM6CVRoZSBvbmUgYXNzb2NpYXRpb24gaW5zdGFuY2Ugb2YgdGhlIGJhc2VkLW9uIFZhcmlhYmlsaXR5IEVsZW1lbnQgaXMgcmVwbGFjZWQgd2l0aCB0aGUgYXNzb2NpYXRpb24gaW5zdGFuY2UgZnJvbSB0aGUgcmVwbGFjaW5nIHNwZWNpYWwgVmFyaWFiaWxpdHkgRWxlbWVudC4gIElmIHRoZSBzcGVjaWFsIFZhcmlhYmlsaXR5IEVsZW1lbnQgZG9lcyBub3QgaGF2ZSBhbiBhc3NvY2lhdGlvbiBpbnN0YW5jZSB0aGVuIHJlc3VsdGluZyBlbGVtZW50IHdpbGwgYWxzbyBub3QgaGF2ZSBhbiBhc3NvY2lhdGlvbi4KLQkgKiAwLi5uLWFzc29jaWF0aW9uIGluc3RhbmNlczoJQXNzb2NpYXRpb24gaW5zdGFuY2VzIG9mIHRoZSBzcGVjaWFsIFZhcmlhYmlsaXR5IEVsZW1lbnQgcmVwbGFjZSBhbGwgYXNzb2NpYXRpb24gaW5zdGFuY2VzIG9mIHRoZSBiYXNlZC1vbiBWYXJpYWJpbGl0eSBFbGVtZW50LgotCSAqIAotCSAqIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAc2VlICNSRVBMQUNFUwotCSAqIEBtb2RlbCBuYW1lPSJyZXBsYWNlcyIKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRVBMQUNFU19WQUxVRSA9IDM7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5Mb2NhbCBDb250cmlidXRpb248L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPkxvY2FsIENvbnRyaWJ1dGlvbjwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNMT0NBTF9DT05UUklCVVRJT04KLQkgKiBAbW9kZWwgbmFtZT0ibG9jYWxDb250cmlidXRpb24iCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTE9DQUxfQ09OVFJJQlVUSU9OX1ZBTFVFID0gNDsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkxvY2FsIFJlcGxhY2VtZW50PC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5Mb2NhbCBSZXBsYWNlbWVudDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNMT0NBTF9SRVBMQUNFTUVOVAotCSAqIEBtb2RlbCBuYW1lPSJsb2NhbFJlcGxhY2VtZW50IgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExPQ0FMX1JFUExBQ0VNRU5UX1ZBTFVFID0gNTsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkV4dGVuZHMgUmVwbGFjZXM8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPkV4dGVuZHMgUmVwbGFjZXM8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjRVhURU5EU19SRVBMQUNFUwotCSAqIEBtb2RlbCBuYW1lPSJleHRlbmRzUmVwbGFjZXMiCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVhURU5EU19SRVBMQUNFU19WQUxVRSA9IDY7Ci0KLQkvKioKLQkgKiBBbiBhcnJheSBvZiBhbGwgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgVHlwZTwvYj48L2VtPicgZW51bWVyYXRvcnMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgVmFyaWFiaWxpdHlUeXBlW10gVkFMVUVTX0FSUkFZID0gbmV3IFZhcmlhYmlsaXR5VHlwZVtdIHsKLQkJCU5BLCBDT05UUklCVVRFUywgRVhURU5EUywgUkVQTEFDRVMsIExPQ0FMX0NPTlRSSUJVVElPTiwKLQkJCUxPQ0FMX1JFUExBQ0VNRU5ULCBFWFRFTkRTX1JFUExBQ0VTLCB9OwotCi0JLyoqCi0JICogQSBwdWJsaWMgcmVhZC1vbmx5IGxpc3Qgb2YgYWxsIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IFR5cGU8L2I+PC9lbT4nIGVudW1lcmF0b3JzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgTGlzdDxWYXJpYWJpbGl0eVR5cGU+IFZBTFVFUyA9IENvbGxlY3Rpb25zCi0JCQkudW5tb2RpZmlhYmxlTGlzdChBcnJheXMuYXNMaXN0KFZBTFVFU19BUlJBWSkpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBUeXBlPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgVmFyaWFiaWxpdHlUeXBlIGdldChTdHJpbmcgbGl0ZXJhbCkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IFZBTFVFU19BUlJBWS5sZW5ndGg7ICsraSkgewotCQkJVmFyaWFiaWxpdHlUeXBlIHJlc3VsdCA9IFZBTFVFU19BUlJBWVtpXTsKLQkJCWlmIChyZXN1bHQudG9TdHJpbmcoKS5lcXVhbHMobGl0ZXJhbCkpIHsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgVHlwZTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFZhcmlhYmlsaXR5VHlwZSBnZXRCeU5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBWQUxVRVNfQVJSQVkubGVuZ3RoOyArK2kpIHsKLQkJCVZhcmlhYmlsaXR5VHlwZSByZXN1bHQgPSBWQUxVRVNfQVJSQVlbaV07Ci0JCQlpZiAocmVzdWx0LmdldE5hbWUoKS5lcXVhbHMobmFtZSkpIHsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgVHlwZTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgaW50ZWdlciB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFZhcmlhYmlsaXR5VHlwZSBnZXQoaW50IHZhbHVlKSB7Ci0JCXN3aXRjaCAodmFsdWUpIHsKLQkJY2FzZSBOQV9WQUxVRToKLQkJCXJldHVybiBOQTsKLQkJY2FzZSBDT05UUklCVVRFU19WQUxVRToKLQkJCXJldHVybiBDT05UUklCVVRFUzsKLQkJY2FzZSBFWFRFTkRTX1ZBTFVFOgotCQkJcmV0dXJuIEVYVEVORFM7Ci0JCWNhc2UgUkVQTEFDRVNfVkFMVUU6Ci0JCQlyZXR1cm4gUkVQTEFDRVM7Ci0JCWNhc2UgTE9DQUxfQ09OVFJJQlVUSU9OX1ZBTFVFOgotCQkJcmV0dXJuIExPQ0FMX0NPTlRSSUJVVElPTjsKLQkJY2FzZSBMT0NBTF9SRVBMQUNFTUVOVF9WQUxVRToKLQkJCXJldHVybiBMT0NBTF9SRVBMQUNFTUVOVDsKLQkJY2FzZSBFWFRFTkRTX1JFUExBQ0VTX1ZBTFVFOgotCQkJcmV0dXJuIEVYVEVORFNfUkVQTEFDRVM7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBpbnQgdmFsdWU7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIGZpbmFsIFN0cmluZyBuYW1lOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbGl0ZXJhbDsKLQotCS8qKgotCSAqIE9ubHkgdGhpcyBjbGFzcyBjYW4gY29uc3RydWN0IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIFZhcmlhYmlsaXR5VHlwZShpbnQgdmFsdWUsIFN0cmluZyBuYW1lLCBTdHJpbmcgbGl0ZXJhbCkgewotCQl0aGlzLnZhbHVlID0gdmFsdWU7Ci0JCXRoaXMubmFtZSA9IG5hbWU7Ci0JCXRoaXMubGl0ZXJhbCA9IGxpdGVyYWw7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGludCBnZXRWYWx1ZSgpIHsKLQkJcmV0dXJuIHZhbHVlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMaXRlcmFsKCkgewotCQlyZXR1cm4gbGl0ZXJhbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBsaXRlcmFsIHZhbHVlIG9mIHRoZSBlbnVtZXJhdG9yLCB3aGljaCBpcyBpdHMgc3RyaW5nIHJlcHJlc2VudGF0aW9uLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBsaXRlcmFsOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvV2hpdGVwYXBlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9XaGl0ZXBhcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxZTZkMjguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9XaGl0ZXBhcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5XaGl0ZXBhcGVyPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogV2hpdGVwYXBlcnMgYXJlIGEgc3BlY2lhbCBDb25jZXB0IGd1aWRhbmNlIHRoYXQgaGF2ZSBiZWVuIGV4dGVybmFsbHkgcmV2aWV3ZWQgb3IgcHVibGlzaGVkIGFuZCBjYW4gYmUgcmVhZCBhbmQgdW5kZXJzdG9vZCBpbiBpc29sYXRpb24gb2Ygb3RoZXIgY29udGVudCBlbGVtZW50cyBhbmQgZ3VpZGFuY2UuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFdoaXRlcGFwZXIoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgV2hpdGVwYXBlciBleHRlbmRzIENvbmNlcHQgewotfSAvLyBXaGl0ZXBhcGVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1dvcmtCcmVha2Rvd25FbGVtZW50LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1dvcmtCcmVha2Rvd25FbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzNGUxYjguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9Xb3JrQnJlYWtkb3duRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+V29yayBCcmVha2Rvd24gRWxlbWVudDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEEgV29yayBCcmVha2Rvd24gRWxlbWVudCBpcyBhIHNwZWNpYWwgQnJlYWtkb3duIEVsZW1lbnQgdGhhdCBwcm92aWRlcyBzcGVjaWZpYyBwcm9wZXJ0aWVzIGZvciBCcmVha2Rvd24gRWxlbWVudHMgdGhhdCByZXByZXNlbnQgb3IgcmVmZXIgdG8gV29yayBEZWZpbml0aW9ucy4gIEZvciBleGFtcGxlIGl0cyBzdWJjbGFzcyBBY3Rpdml0eSBkZWZpbmVzIHdvcmsgYXMgaXQgaXMgYWxzbyBhIHN1YmNsYXNzIG9mIFdvcmsgRGVmaW5pdGlvbi4gIEl0cyBzdWJjbGFzcyBUYXNrIERlc2NyaXB0b3IgZG9lcyBub3QgZGVmaW5lIHdvcmsgYnkgaXRzZWxmLCBidXQgcmVmZXJzIHRvIGEgV29yayBEZWZpbml0aW9uIGFuZCB0aGVyZWZvcmUgY2FuIGhhdmUgdGhlIHNhbWUgY29tbW9uIHByb3BlcnRpZXMgYW5kIFdvcmsgQnJlYWtkb3duIEVsZW1lbnQgaGFzLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya0JyZWFrZG93bkVsZW1lbnQjZ2V0SXNSZXBlYXRhYmxlIDxlbT5JcyBSZXBlYXRhYmxlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtCcmVha2Rvd25FbGVtZW50I2dldElzT25nb2luZyA8ZW0+SXMgT25nb2luZzwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrQnJlYWtkb3duRWxlbWVudCNnZXRJc0V2ZW50RHJpdmVuIDxlbT5JcyBFdmVudCBEcml2ZW48L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya0JyZWFrZG93bkVsZW1lbnQjZ2V0TGlua1RvUHJlZGVjZXNzb3IgPGVtPkxpbmsgVG8gUHJlZGVjZXNzb3I8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRXb3JrQnJlYWtkb3duRWxlbWVudCgpCi0gKiBAbW9kZWwgYWJzdHJhY3Q9InRydWUiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgV29ya0JyZWFrZG93bkVsZW1lbnQgZXh0ZW5kcyBCcmVha2Rvd25FbGVtZW50IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JcyBSZXBlYXRhYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+ImZhbHNlIjwvY29kZT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGlzIGF0dHJpYnV0ZSBpcyB1c2VkIHRvIGRlZmluZSByZXBldGl0aW9uIG9mIHdvcmssIGUuZy4gaXRlcmF0aW9ucy4gIEEgUHJvY2VzcyBXb3JrIERlZmluaXRpb24gd2l0aCB0aGlzIGF0dHJpYnV0ZSBzZXQgdG8gVHJ1ZSBzaGFsbCBiZSByZXBlYXRlZCBtb3JlIHRoYW4gb25jZSBvbiB0aGUgc2FtZSBzZXQgb2YgYXJ0aWZhY3RzLiAgRm9yIGV4YW1wbGUsIGZvciBhbiBpbnN0YW5jZSBvZiBJdGVyYXRpb24gKGRlZmluZWQgYXMgYSBzcGVjaWFsIFByb2Nlc3MgV29yayBEZWZpbml0aW9uIGJlbG93KSB0aGlzIGF0dHJpYnV0ZSBpcyBzZXQgdG8gVHJ1ZSBieSBkZWZhdWx0IGluZGljYXRpbmcgdGhhdCBldmVyeSBzdWItQWN0aXZpdHkgd2lsbCBiZSByZXBlYXRlZCBtb3JlIHRoYW4gb25jZS4gIEhvd2V2ZXIsIGFueSBQcm9jZXNzIFdvcmsgRGVmaW5pdGlvbiBjYW4gc2V0IHRoaXMgYXR0cmlidXRlIHRvIFRydWUgdG8gZGVmaW5lIGl0ZXJhdGlvbnMgKGUuZy4gdG8gaXRlcmF0ZSBvbmUgQWN0aXZpdHkgY29uc2lzdGluZyBvZiBtYW55IHN1Yi1hY3Rpdml0aWVzIG9yIGV2ZW4gUGhhc2VzLCBidXQgdG8gaXRlcmF0ZSBqdXN0IG9uZSBUYXNrKS4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SXMgUmVwZWF0YWJsZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0SXNSZXBlYXRhYmxlKEJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0V29ya0JyZWFrZG93bkVsZW1lbnRfSXNSZXBlYXRhYmxlKCkKLQkgKiBAbW9kZWwgZGVmYXVsdD0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLkJvb2xlYW4iIHJlcXVpcmVkPSJ0cnVlIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQm9vbGVhbiBnZXRJc1JlcGVhdGFibGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya0JyZWFrZG93bkVsZW1lbnQjZ2V0SXNSZXBlYXRhYmxlIDxlbT5JcyBSZXBlYXRhYmxlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5JcyBSZXBlYXRhYmxlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRJc1JlcGVhdGFibGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldElzUmVwZWF0YWJsZShCb29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPklzIE9uZ29pbmc8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iZmFsc2UiPC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIElmIHRoZSBpc09uZ29pbmcgYXR0cmlidXRlIGlzIHNldCB0byBUcnVlIGZvciBhIFByb2Nlc3MgV29yayBEZWZpbml0aW9uIGluc3RhbmNlLCB0aGVuIHRoZSBlbGVtZW50IGRlc2NyaWJlcyBhbiBvbmdvaW5nIHBpZWNlIG9mIHdvcmsgd2l0aG91dCBhIGZpeGVkIGR1cmF0aW9uIG9yIGVuZCBzdGF0ZS4gIEZvciBleGFtcGxlLCB0aGUgUHJvY2VzcyBXb3JrIERlZmluaXRpb24gY291bGQgcmVwcmVzZW50IHdvcmsgb2YgYW4gYWRtaW5pc3RyYXRvciBjb250aW51b3VzbHkgKGUuZy4gM2ggYSBkYXkpIHdvcmtpbmcgdG8gZW5zdXJlIHRoYXQgc3lzdGVtcyBhcmUga2VwdCBpbiBhIGNlcnRhaW4gc3RhdGUuICBBbm90aGVyIGV4YW1wbGUgd291bGQgYmUgcHJvZ3JhbSBtYW5hZ2VtZW50IHdvcmsgb3ZlcnNlZWluZyBtYW55IGRpZmZlcmVudCBwcm9qZWN0cyBiZWluZyBzY2hlZHVsZWQgZm9yIG9uZSBwYXJ0aWN1bGFyIHByb2plY3QgYXQgc3BlY2lmaWMgcmVvY2N1cnJpbmcgaW50ZXJ2YWxzIGR1cmluZyB0aGUgd2hvbGUgbGlmZWN5Y2xlIG9mIHRoZSBwcm9qZWN0LgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JcyBPbmdvaW5nPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRJc09uZ29pbmcoQm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRXb3JrQnJlYWtkb3duRWxlbWVudF9Jc09uZ29pbmcoKQotCSAqIEBtb2RlbCBkZWZhdWx0PSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuQm9vbGVhbiIgcmVxdWlyZWQ9InRydWUiIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCb29sZWFuIGdldElzT25nb2luZygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrQnJlYWtkb3duRWxlbWVudCNnZXRJc09uZ29pbmcgPGVtPklzIE9uZ29pbmc8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPklzIE9uZ29pbmc8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldElzT25nb2luZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0SXNPbmdvaW5nKEJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SXMgRXZlbnQgRHJpdmVuPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+ImZhbHNlIjwvY29kZT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgaXNFdmVudERyaXZlbiBhdHRyaWJ1dGUgaW5kaWNhdGVzIHRoYXQgdGhlIFByb2Nlc3MgV29yayBEZWZpbml0aW9uIGRlc2NyaWJlcyBhbiBpbnN0YW5jZSBvZiB3b3JrIHdoaWNoIGlzIG5vdCBzdGFydGVkIGJlY2F1c2UgaXQgaGFzIGJlZW4gc2NoZWR1bGVkIHRvIHN0YXJ0IGF0IGEgY2VydGFpbiBwb2ludCBvZiB0aW1lLCBiZWNhdXNlIHByZWNlZGluZyB3b3JrIGlzIGJlaW5nIGNvbXBsZXRlZCwgb3IgaW5wdXQgd29yayBwcm9kdWN0cyBhcmUgYXZhaWxhYmxlLCBidXQgYmVjYXVzZSBhbm90aGVyIHNwZWNpZmljIGV2ZW50IGhhcyBvY2N1cnJlZC4gIEV4YW1wbGVzIGZvciBzdWNoIGV2ZW50cyBhcmUgZXhjZXB0aW9ucyBvciBwcm9ibGVtIHNpdHVhdGlvbnMgd2hpY2ggcmVxdWlyZSBzcGVjaWZpYyB3b3JrIHRvIGJlIHBlcmZvcm1lZCBhcyBhIHJlc3VsdC4gIEFsc28gY2hhbmdlIG1hbmFnZW1lbnQgd29yayBjYW4gYmUgbW9kZWxlZCBhcyBldmVudCBkcml2ZW4gd29yayBhbmFseXppbmcgYSBjaGFuZ2UgcmVxdWVzdCBvciBkZWZlY3QgYW5kIGFsbG9jYXRpbmcgd29yayBkeW5hbWljYWxseSB0byByZXNvdXJjZXMgdG8gZGVhbCB3aXRoIGl0IGZvbGxvd2luZyB0aGUgd29yayBkZXNjcmliZWQgd2l0aCBzdWNoIFByb2Nlc3MgV29yayBEZWZpbml0aW9uLiAgVGhlIGV2ZW50cyB0aGVtc2VsdmVzIGFyZSBub3QgbW9kZWxlZCBpbiB0aGlzIHZlcnNpb24gb2YgdGhlIHNwZWNpZmljYXRpb24uICBUaGV5IHNoYWxsIGJlIGRlc2NyaWJlZCBhcyBwYXJ0IG9mIHRoZSBub3JtYWwgZGVzY3JpcHRpb25zIGZpZWxkcyBhdmFpbGFibGUuCi0JICogCi0JICogCi0JICogCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPklzIEV2ZW50IERyaXZlbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0SXNFdmVudERyaXZlbihCb29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFdvcmtCcmVha2Rvd25FbGVtZW50X0lzRXZlbnREcml2ZW4oKQotCSAqIEBtb2RlbCBkZWZhdWx0PSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuQm9vbGVhbiIgcmVxdWlyZWQ9InRydWUiIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCb29sZWFuIGdldElzRXZlbnREcml2ZW4oKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya0JyZWFrZG93bkVsZW1lbnQjZ2V0SXNFdmVudERyaXZlbiA8ZW0+SXMgRXZlbnQgRHJpdmVuPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5JcyBFdmVudCBEcml2ZW48L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldElzRXZlbnREcml2ZW4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldElzRXZlbnREcml2ZW4oQm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5MaW5rIFRvIFByZWRlY2Vzc29yPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrT3JkZXJ9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TGluayBUbyBQcmVkZWNlc3NvcjwvZW0+JyByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkxpbmsgVG8gUHJlZGVjZXNzb3I8L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0V29ya0JyZWFrZG93bkVsZW1lbnRfTGlua1RvUHJlZGVjZXNzb3IoKQotCSAqIEBtb2RlbCBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdDxXb3JrT3JkZXI+IGdldExpbmtUb1ByZWRlY2Vzc29yKCk7Ci0KLX0gLy8gV29ya0JyZWFrZG93bkVsZW1lbnQKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvV29ya0RlZmluaXRpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvV29ya0RlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWUzMDkxZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1dvcmtEZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Xb3JrIERlZmluaXRpb248L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBXb3JrIERlZmluaXRpb24gaXMgYW4gYWJzdHJhY3QgTWV0aG9kIEVsZW1lbnQgdGhhdCBnZW5lcmFsaXplcyBhbGwgZGVzY3JpcHRpb25zIG9mIHdvcmsgd2l0aGluIHRoZSBVbmlmaWVkIE1ldGhvZCBBcmNoaXRlY3R1cmUuICBUaGlzIHBhY2thZ2UgaW50cm9kdWNlcyB0d28gY29uY3JldGUgdHlwZXMgb2YgV29yayBEZWZpbml0aW9uczogVGFzayBhbmQgU3RlcC4gIFdvcmsgRGVmaW5pdGlvbnMgY2FuIGNvbnRhaW4gc2V0cyBvZiBwcmUtIGFuZCBwb3N0LWNvbmRpdGlvbnMgZGVmaW5pbmcgY29uc3RyYWludHMgdGhhdCBuZWVkIHRvIGJlIHZhbGlkIGJlZm9yZSB0aGUgZGVzY3JpYmVkIHdvcmsgY2FuIGJlZ2luIG9yIGJlZm9yZSBpdCBjYW4gYmUgZGVjbGFyZWQgYXMgZmluaXNoZWQuICBOb3RlIHRoYXQgZ2VuZXJhbCBvd25lZFJ1bGVzIGNhbiBiZSB1c2VkIHRvIGRlZmluZSBhZGRpdGlvbmFsIGNvbnN0cmFpbnRzIGFuZCBydWxlcyBmb3IgV29yayBEZWZpbml0aW9ucy4KLSAqIFdvcmsgRGVmaW5pdGlvbnMgcmVwcmVzZW50IGJlaGF2aW9yYWwgZGVzY3JpcHRpb25zIGZvciBkb2luZyB3b3JrLiAgVGhlc2UgYmVoYXZpb3JhbCBkZXNjcmlwdGlvbnMgYXJlIG5vdCBib3VuZCB0byBvbmUgc3BlY2lmaWMgY2xhc3NpZmllciwgYnV0IHJlcHJlc2VudCBhbiBhcmJpdHJhcnkgZGVmaW5pdGlvbiBvZiB3b3JrLiAgRm9yIGV4YW1wbGUsIGEgV29yayBEZWZpbml0aW9uIGNvdWxkIHJlcHJlc2VudCB3b3JrIHRoYXQgaXMgYmVpbmcgcGVyZm9ybWVkIGJ5IGEgc3BlY2lmaWMgUm9sZSAoZS5nLiBhIFJvbGUgcGVyZm9ybWluZyBhIHNwZWNpZmljIFRhc2sgb3IgU3RlcHMgb2YgYSBUYXNrKSwgYnkgbWFueSBSb2xlcyB3b3JraW5nIGluIGNsb3NlIGNvbGxhYm9yYXRpb24gKG1hbnkgUm9sZXMgYWxsIHdvcmtpbmcgdG9nZXRoZXIgb24gdGhlIHNhbWUgaW50ZXJkaXNjaXBsaW5hcnkgVGFzayksIG9yIGNvbXBsZXggd29yayB0aGF0IGlzIHBlcmZvcm1lZCB0aHJvdWdob3V0IHRoZSBsaWZlY3ljbGUgKGUuZy4gYSBwcm9jZXNzIGRlZmluaW5nIGEgYnJlYWtkb3duIHN0cnVjdHVyZSBmb3Igb3JnYW5pemluZyBsYXJnZXIgY29tcG9zaXRlIHVuaXRzIG9mIHdvcmsgcGVyZm9ybWVkIGJ5IG1hbnkgUm9sZXMgd29ya2luZyBpbiBjb2xsYWJvcmF0aW9uKS4KLSAqIAotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya0RlZmluaXRpb24jZ2V0UHJlY29uZGl0aW9uIDxlbT5QcmVjb25kaXRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya0RlZmluaXRpb24jZ2V0UG9zdGNvbmRpdGlvbiA8ZW0+UG9zdGNvbmRpdGlvbjwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFdvcmtEZWZpbml0aW9uKCkKLSAqIEBtb2RlbCBhYnN0cmFjdD0idHJ1ZSIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBXb3JrRGVmaW5pdGlvbiBleHRlbmRzIE1ldGhvZEVsZW1lbnQgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlByZWNvbmRpdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UHJlY29uZGl0aW9uPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlByZWNvbmRpdGlvbjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0UHJlY29uZGl0aW9uKENvbnN0cmFpbnQpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0V29ya0RlZmluaXRpb25fUHJlY29uZGl0aW9uKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJ0cnVlIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQ29uc3RyYWludCBnZXRQcmVjb25kaXRpb24oKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya0RlZmluaXRpb24jZ2V0UHJlY29uZGl0aW9uIDxlbT5QcmVjb25kaXRpb248L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlByZWNvbmRpdGlvbjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0UHJlY29uZGl0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRQcmVjb25kaXRpb24oQ29uc3RyYWludCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Qb3N0Y29uZGl0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Qb3N0Y29uZGl0aW9uPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlBvc3Rjb25kaXRpb248L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFBvc3Rjb25kaXRpb24oQ29uc3RyYWludCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRXb3JrRGVmaW5pdGlvbl9Qb3N0Y29uZGl0aW9uKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJ0cnVlIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQ29uc3RyYWludCBnZXRQb3N0Y29uZGl0aW9uKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtEZWZpbml0aW9uI2dldFBvc3Rjb25kaXRpb24gPGVtPlBvc3Rjb25kaXRpb248L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlBvc3Rjb25kaXRpb248L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldFBvc3Rjb25kaXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFBvc3Rjb25kaXRpb24oQ29uc3RyYWludCB2YWx1ZSk7Ci0KLX0gLy8gV29ya0RlZmluaXRpb24KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvV29ya09yZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1dvcmtPcmRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZWRmNGJlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvV29ya09yZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Xb3JrIE9yZGVyPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogV29yayBPcmRlciBpcyBhIE1ldGhvZCBFbGVtZW50IHRoYXQgcmVwcmVzZW50cyBhIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHR3byBCcmVha2Rvd24gRWxlbWVudHMgaW4gd2hpY2ggb25lIEJyZWFrZG93biBFbGVtZW50cyBkZXBlbmRzIG9uIHRoZSBzdGFydCBvciBmaW5pc2ggb2YgYW5vdGhlciBCcmVha2Rvd24gRWxlbWVudHMgaW4gb3JkZXIgdG8gYmVnaW4gb3IgZW5kLiAgCi0gKiAoTm90ZSwgV29yayBPcmRlciBpcyBub3QgbW9kZWxlZCBhcyBhbiBBc3NvY2lhdGlvbiBDbGFzcyB0byBwcm92aWRlIGEgc3RyYWlnaHRmb3J3YXJkIG1hcHBpbmcgIHRvIFhNSSBhbmQgRU1GLikKLSAqIFRoZSBXb3JrIE9yZGVyIGNsYXNzIGRlZmluZXMgcHJlZGVjZXNzb3IgYW5kIHN1Y2Nlc3NvciByZWxhdGlvbnMgYW1vbmdzdCBCcmVha2Rvd24gRWxlbWVudHMuICBUaGlzIGluZm9ybWF0aW9uIGlzIGluIHBhcnRpY3VsYXIgY3JpdGljYWwgZm9yIHBsYW5uaW5nIGFwcGxpY2F0aW9ucy4gIFNlZSBtb3JlIGRldGFpbHMgb24gZGlmZmVyZW50IHR5cGVzIG9mIFdvcmsgT3JkZXIgcmVsYXRpb25zaGlwcyBhdCBXb3JrIE9yZGVyIFR5cGUuCi0gKiAKLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtPcmRlciNnZXRMaW5rVHlwZSA8ZW0+TGluayBUeXBlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtPcmRlciNnZXRQcmVkIDxlbT5QcmVkPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0V29ya09yZGVyKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFdvcmtPcmRlciBleHRlbmRzIFByb2Nlc3NFbGVtZW50IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5MaW5rIFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iZmluaXNoVG9TdGFydCI8L2NvZGU+LgotCSAqIFRoZSBsaXRlcmFscyBhcmUgZnJvbSB0aGUgZW51bWVyYXRpb24ge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya09yZGVyVHlwZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGlzIGF0dHJpYnV0ZSBleHByZXNzZXMgdGhlIHR5cGUgb2YgdGhlIFdvcmsgT3JkZXIgcmVsYXRpb25zaGlwIGJ5IGFzc2lnbmluZyBhIHZhbHVlIGZyb20gdGhlIFdvcmsgT3JkZXIgVHlwZSBlbnVtZXJhdGlvbi4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TGluayBUeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya09yZGVyVHlwZQotCSAqIEBzZWUgI3NldExpbmtUeXBlKFdvcmtPcmRlclR5cGUpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0V29ya09yZGVyX0xpbmtUeXBlKCkKLQkgKiBAbW9kZWwgZGVmYXVsdD0iZmluaXNoVG9TdGFydCIgcmVxdWlyZWQ9InRydWUiIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlXb3JrT3JkZXJUeXBlIGdldExpbmtUeXBlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtPcmRlciNnZXRMaW5rVHlwZSA8ZW0+TGluayBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5MaW5rIFR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrT3JkZXJUeXBlCi0JICogQHNlZSAjZ2V0TGlua1R5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldExpbmtUeXBlKFdvcmtPcmRlclR5cGUgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UHJlZDwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UHJlZDwvZW0+JyByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QcmVkPC9lbT4nIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRQcmVkKFdvcmtCcmVha2Rvd25FbGVtZW50KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFdvcmtPcmRlcl9QcmVkKCkKLQkgKiBAbW9kZWwgcmVxdWlyZWQ9InRydWUiIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlXb3JrQnJlYWtkb3duRWxlbWVudCBnZXRQcmVkKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtPcmRlciNnZXRQcmVkIDxlbT5QcmVkPC9lbT59JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5QcmVkPC9lbT4nIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRQcmVkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRQcmVkKFdvcmtCcmVha2Rvd25FbGVtZW50IHZhbHVlKTsKLQotfSAvLyBXb3JrT3JkZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvV29ya09yZGVyVHlwZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9Xb3JrT3JkZXJUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4ZjUzMTMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9Xb3JrT3JkZXJUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVudW1lcmF0b3I7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIGxpdGVyYWxzIG9mIHRoZSBlbnVtZXJhdGlvbiAnPGVtPjxiPldvcmsgT3JkZXIgVHlwZTwvYj48L2VtPicsCi0gKiBhbmQgdXRpbGl0eSBtZXRob2RzIGZvciB3b3JraW5nIHdpdGggdGhlbS4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBXb3JrIE9yZGVyIHJlcHJlc2VudHMgYSByZWxhdGlvbnNoaXAgYmV0d2VlbiB0d28gQnJlYWtkb3duIEVsZW1lbnQgaW4gd2hpY2ggb25lIEJyZWFrZG93biBFbGVtZW50IChyZWZlcnJlZCB0byBhcyAoQikgYmVsb3cpIGRlcGVuZHMgb24gdGhlIHN0YXJ0IG9yIGZpbmlzaCBvZiBhbm90aGVyIEJyZWFrZG93biBFbGVtZW50IChyZWZlcnJlZCB0byBhcyAoQSkgYmVsb3cpIGluIG9yZGVyIHRvIGJlZ2luIG9yIGVuZC4gVGhpcyBlbnVtZXJhdGlvbiBkZWZpbmVzIHRoZSBkaWZmZXJlbnQgdHlwZXMgb2YgV29yayBPcmRlciByZWxhdGlvbnNoaXBzIGF2YWlsYWJsZSBpbiBVTUEgYW5kIGlzIHVzZWQgdG8gcHJvdmlkZSB2YWx1ZXMgZm9yIFdvcmsgT3JkZXIncyBsaW5rVHlwZSBhdHRyaWJ1dGUuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRXb3JrT3JkZXJUeXBlKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgZW51bSBXb3JrT3JkZXJUeXBlIGltcGxlbWVudHMgRW51bWVyYXRvciB7Ci0JLyoqCi0JICogVGhlICc8ZW0+PGI+RmluaXNoIFRvIFN0YXJ0PC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0ZJTklTSF9UT19TVEFSVF9WQUxVRQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCUZJTklTSF9UT19TVEFSVCgwLCAiZmluaXNoVG9TdGFydCIsICJmaW5pc2hUb1N0YXJ0IiksCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+RmluaXNoIFRvIEZpbmlzaDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNGSU5JU0hfVE9fRklOSVNIX1ZBTFVFCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JRklOSVNIX1RPX0ZJTklTSCgxLCAiZmluaXNoVG9GaW5pc2giLCAiZmluaXNoVG9GaW5pc2giKSwKLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5TdGFydCBUbyBTdGFydDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNTVEFSVF9UT19TVEFSVF9WQUxVRQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCVNUQVJUX1RPX1NUQVJUKDIsICJzdGFydFRvU3RhcnQiLCAic3RhcnRUb1N0YXJ0IiksCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+U3RhcnQgVG8gRmluaXNoPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI1NUQVJUX1RPX0ZJTklTSF9WQUxVRQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCVNUQVJUX1RPX0ZJTklTSCgzLCAic3RhcnRUb0ZpbmlzaCIsICJzdGFydFRvRmluaXNoIik7Ci0JLyoqCi0JICogVGhlICc8ZW0+PGI+RmluaXNoIFRvIFN0YXJ0PC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogQnJlYWtkb3duIEVsZW1lbnQgKEIpIGNhbm5vdCBzdGFydCB1bnRpbCBCcmVha2Rvd24gRWxlbWVudCAoQSkgZmluaXNoZXMuIEZvciBleGFtcGxlLCBpZiB5b3UgaGF2ZSB0d28gQnJlYWtkb3duIEVsZW1lbnRzLCAiQ29uc3RydWN0IGZlbmNlIiBhbmQgIlBhaW50IGZlbmNlLCIgIlBhaW50IGZlbmNlIiBjYW4ndCBzdGFydCB1bnRpbCAiQ29uc3RydWN0IGZlbmNlIiBmaW5pc2hlcy4gVGhpcyBpcyB0aGUgbW9zdCBjb21tb24gdHlwZSBvZiBkZXBlbmRlbmN5IGFuZCB0aGUgZGVmYXVsdCBmb3IgYSBuZXcgV29yayBPcmRlciBpbnN0YW5jZS4KLQkgKiAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHNlZSAjRklOSVNIX1RPX1NUQVJUCi0JICogQG1vZGVsIG5hbWU9ImZpbmlzaFRvU3RhcnQiCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRklOSVNIX1RPX1NUQVJUX1ZBTFVFID0gMDsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkZpbmlzaCBUbyBGaW5pc2g8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBCcmVha2Rvd24gRWxlbWVudCAoQikgY2Fubm90IGZpbmlzaCB1bnRpbCBCcmVha2Rvd24gRWxlbWVudCAoQSkgZmluaXNoZXMuIEZvciBleGFtcGxlLCBpZiB5b3UgaGF2ZSB0d28gQnJlYWtkb3duIEVsZW1lbnRzLCAiQWRkIHdpcmluZyIgYW5kICJJbnNwZWN0IGVsZWN0cmljYWwsIiAiSW5zcGVjdCBlbGVjdHJpY2FsIiBjYW4ndCBmaW5pc2ggdW50aWwgIkFkZCB3aXJpbmciIGZpbmlzaGVzLgotCSAqIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAc2VlICNGSU5JU0hfVE9fRklOSVNICi0JICogQG1vZGVsIG5hbWU9ImZpbmlzaFRvRmluaXNoIgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZJTklTSF9UT19GSU5JU0hfVkFMVUUgPSAxOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+U3RhcnQgVG8gU3RhcnQ8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBCcmVha2Rvd24gRWxlbWVudCAoQikgY2Fubm90IHN0YXJ0IHVudGlsIEJyZWFrZG93biBFbGVtZW50IChBKSBzdGFydHMuIEZvciBleGFtcGxlLCBpZiB5b3UgaGF2ZSB0d28gQnJlYWtkb3duIEVsZW1lbnRzLCAiUG91ciBmb3VuZGF0aW9uIiBhbmQgIkxldmVsIGNvbmNyZXRlLCIgIkxldmVsIGNvbmNyZXRlIiBjYW4ndCBiZWdpbiB1bnRpbCAiUG91ciBmb3VuZGF0aW9uIiBiZWdpbnMuCi0JICogCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEBzZWUgI1NUQVJUX1RPX1NUQVJUCi0JICogQG1vZGVsIG5hbWU9InN0YXJ0VG9TdGFydCIKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFSVF9UT19TVEFSVF9WQUxVRSA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5TdGFydCBUbyBGaW5pc2g8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBCcmVha2Rvd24gRWxlbWVudCAoQikgY2Fubm90IGZpbmlzaCB1bnRpbCBCcmVha2Rvd24gRWxlbWVudCAoQSkgc3RhcnRzLiBUaGlzIGRlcGVuZGVuY3kgdHlwZSBjYW4gYmUgdXNlZCBmb3IganVzdC1pbi10aW1lIHNjaGVkdWxpbmcgdXAgdG8gYSBtaWxlc3RvbmUgb3IgdGhlIHByb2plY3QgZmluaXNoIGRhdGUgdG8gbWluaW1pemUgdGhlIHJpc2sgb2YgYSBCcmVha2Rvd24gRWxlbWVudCBmaW5pc2hpbmcgbGF0ZSBpZiBpdHMgZGVwZW5kZW50IEJyZWFrZG93biBFbGVtZW50cyBzbGlwLiBJZiBhIHJlbGF0ZWQgQnJlYWtkb3duIEVsZW1lbnQgbmVlZHMgdG8gZmluaXNoIGJlZm9yZSB0aGUgbWlsZXN0b25lIG9yIHByb2plY3QgZmluaXNoIGRhdGUsIGJ1dCBpdCBkb2Vzbid0IG1hdHRlciBleGFjdGx5IHdoZW4gYW5kIHlvdSBkb24ndCB3YW50IGEgbGF0ZSBmaW5pc2ggdG8gYWZmZWN0IHRoZSBqdXN0LWluLXRpbWUgQnJlYWtkb3duIEVsZW1lbnQsIHlvdSBjYW4gY3JlYXRlIGFuIFNGIGRlcGVuZGVuY3kgYmV0d2VlbiB0aGUgQnJlYWtkb3duIEVsZW1lbnQgeW91IHdhbnQgc2NoZWR1bGVkIGp1c3QgaW4gdGltZSAodGhlIHByZWRlY2Vzc29yKSBhbmQgaXRzIHJlbGF0ZWQgQnJlYWtkb3duIEVsZW1lbnQgKHRoZSBzdWNjZXNzb3IpLiBUaGVuIGlmIHlvdSB1cGRhdGUgcHJvZ3Jlc3Mgb24gdGhlIHN1Y2Nlc3NvciBCcmVha2Rvd24gRWxlbWVudCwgaXQgd29uJ3QgYWZmZWN0IHRoZSBzY2hlZHVsZWQgZGF0ZXMgb2YgdGhlIHByZWRlY2Vzc29yIEJyZWFrZG93biBFbGVtZW50LgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAc2VlICNTVEFSVF9UT19GSU5JU0gKLQkgKiBAbW9kZWwgbmFtZT0ic3RhcnRUb0ZpbmlzaCIKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFSVF9UT19GSU5JU0hfVkFMVUUgPSAzOwotCi0JLyoqCi0JICogQW4gYXJyYXkgb2YgYWxsIHRoZSAnPGVtPjxiPldvcmsgT3JkZXIgVHlwZTwvYj48L2VtPicgZW51bWVyYXRvcnMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgV29ya09yZGVyVHlwZVtdIFZBTFVFU19BUlJBWSA9IG5ldyBXb3JrT3JkZXJUeXBlW10gewotCQkJRklOSVNIX1RPX1NUQVJULCBGSU5JU0hfVE9fRklOSVNILCBTVEFSVF9UT19TVEFSVCwgU1RBUlRfVE9fRklOSVNILCB9OwotCi0JLyoqCi0JICogQSBwdWJsaWMgcmVhZC1vbmx5IGxpc3Qgb2YgYWxsIHRoZSAnPGVtPjxiPldvcmsgT3JkZXIgVHlwZTwvYj48L2VtPicgZW51bWVyYXRvcnMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBMaXN0PFdvcmtPcmRlclR5cGU+IFZBTFVFUyA9IENvbGxlY3Rpb25zCi0JCQkudW5tb2RpZmlhYmxlTGlzdChBcnJheXMuYXNMaXN0KFZBTFVFU19BUlJBWSkpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5Xb3JrIE9yZGVyIFR5cGU8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBXb3JrT3JkZXJUeXBlIGdldChTdHJpbmcgbGl0ZXJhbCkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IFZBTFVFU19BUlJBWS5sZW5ndGg7ICsraSkgewotCQkJV29ya09yZGVyVHlwZSByZXN1bHQgPSBWQUxVRVNfQVJSQVlbaV07Ci0JCQlpZiAocmVzdWx0LnRvU3RyaW5nKCkuZXF1YWxzKGxpdGVyYWwpKSB7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPldvcmsgT3JkZXIgVHlwZTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFdvcmtPcmRlclR5cGUgZ2V0QnlOYW1lKFN0cmluZyBuYW1lKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgVkFMVUVTX0FSUkFZLmxlbmd0aDsgKytpKSB7Ci0JCQlXb3JrT3JkZXJUeXBlIHJlc3VsdCA9IFZBTFVFU19BUlJBWVtpXTsKLQkJCWlmIChyZXN1bHQuZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSkgewotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5Xb3JrIE9yZGVyIFR5cGU8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIGludGVnZXIgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBXb3JrT3JkZXJUeXBlIGdldChpbnQgdmFsdWUpIHsKLQkJc3dpdGNoICh2YWx1ZSkgewotCQljYXNlIEZJTklTSF9UT19TVEFSVF9WQUxVRToKLQkJCXJldHVybiBGSU5JU0hfVE9fU1RBUlQ7Ci0JCWNhc2UgRklOSVNIX1RPX0ZJTklTSF9WQUxVRToKLQkJCXJldHVybiBGSU5JU0hfVE9fRklOSVNIOwotCQljYXNlIFNUQVJUX1RPX1NUQVJUX1ZBTFVFOgotCQkJcmV0dXJuIFNUQVJUX1RPX1NUQVJUOwotCQljYXNlIFNUQVJUX1RPX0ZJTklTSF9WQUxVRToKLQkJCXJldHVybiBTVEFSVF9UT19GSU5JU0g7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBpbnQgdmFsdWU7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIGZpbmFsIFN0cmluZyBuYW1lOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbGl0ZXJhbDsKLQotCS8qKgotCSAqIE9ubHkgdGhpcyBjbGFzcyBjYW4gY29uc3RydWN0IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIFdvcmtPcmRlclR5cGUoaW50IHZhbHVlLCBTdHJpbmcgbmFtZSwgU3RyaW5nIGxpdGVyYWwpIHsKLQkJdGhpcy52YWx1ZSA9IHZhbHVlOwotCQl0aGlzLm5hbWUgPSBuYW1lOwotCQl0aGlzLmxpdGVyYWwgPSBsaXRlcmFsOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0VmFsdWUoKSB7Ci0JCXJldHVybiB2YWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBuYW1lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TGl0ZXJhbCgpIHsKLQkJcmV0dXJuIGxpdGVyYWw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbGl0ZXJhbCB2YWx1ZSBvZiB0aGUgZW51bWVyYXRvciwgd2hpY2ggaXMgaXRzIHN0cmluZyByZXByZXNlbnRhdGlvbi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gbGl0ZXJhbDsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1dvcmtQcm9kdWN0LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1dvcmtQcm9kdWN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwODhlZWYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9Xb3JrUHJvZHVjdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+V29yayBQcm9kdWN0PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogV29yayBQcm9kdWN0IGlzIGFuIGFic3RyYWN0IGNsYXNzIHdoaWNoIHByb3ZpZGVzIGEgZ2VuZXJhbGl6YXRpb24gZm9yIHRoZSBjb250ZW50IGVsZW1lbnQgdHlwZXMgQXJ0aWZhY3QsIE91dGNvbWUsIGFuZCBEZWxpdmVyYWJsZS4gIFRoZSBtZXRhLW1vZGVsIGNsYXNzIFdvcmsgUHJvZHVjdCBhY3R1YWxseSByZXByZXNlbnRzIHdvcmsgcHJvZHVjdCB0eXBlcywgaS5lLiBhbiBpbnN0YW5jZSBvZiBXb3JrIFByb2R1Y3QgaXMgYSBkZXNjcmlwdGlvbiBvZiBhIHNwZWNpZmljIHR5cGUgb2Ygd29yayBwcm9kdWN0IGFuZCBub3QgYW4gaW5kaXZpZHVhbCB3b3JrIHByb2R1Y3QgaW5zdGFuY2UuICBIb3dldmVyLCBmb3Igc2ltcGxpY2l0eSByZWFzb25zIGFuZCBiZWNhdXNlIG9mIGxvdyByaXNrIG9mIG1pc2ludGVycHJldGF0aW9uIHdlIGRpZCBub3QgYXBwZW5kIHRoZSB3b3JkICd0eXBlJyB0byBldmVyeSBtZXRhLWNsYXNzLgotICogQSB3b3JrIHByb2R1Y3QgaXMgYW4gYWJzdHJhY3Rpb24gZm9yIGRlc2NyaXB0aW9ucyBvZiBjb250ZW50IGVsZW1lbnRzIHRoYXQgYXJlIHVzZWQgdG8gZGVmaW5lIGFueXRoaW5nIHVzZWQsIHByb2R1Y2VkLCBvciBtb2RpZmllZCBieSBhIHRhc2suCi0gKiAKLSAqIFRoaXMgaXMgdGhlIEd1aWRhbmNlIFR5cGVzIHBhY2thZ2UncyBleHRlbnNpb24gb2YgV29yayBQcm9kdWN0IChkZWZpbmVkIGluIENvbnRlbnQgRWxlbWVudHMpIHByb3ZpZGluZyBhZGRpdG9uYWwgYXNzb2NpYXRpb25zLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3QjZ2V0UmVwb3J0cyA8ZW0+UmVwb3J0czwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdCNnZXRUZW1wbGF0ZXMgPGVtPlRlbXBsYXRlczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdCNnZXRUb29sTWVudG9ycyA8ZW0+VG9vbCBNZW50b3JzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0I2dldEVzdGltYXRpb25Db25zaWRlcmF0aW9ucyA8ZW0+RXN0aW1hdGlvbiBDb25zaWRlcmF0aW9uczwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFdvcmtQcm9kdWN0KCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFdvcmtQcm9kdWN0IGV4dGVuZHMgQ29udGVudEVsZW1lbnQsIEZ1bGZpbGxhYmxlRWxlbWVudCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmVwb3J0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUmVwb3J0fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlJlcG9ydHM8L2VtPicgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZXBvcnRzPC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFdvcmtQcm9kdWN0X1JlcG9ydHMoKQotCSAqIEBtb2RlbCBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdDxSZXBvcnQ+IGdldFJlcG9ydHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlRlbXBsYXRlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVGVtcGxhdGV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VGVtcGxhdGVzPC9lbT4nIHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VGVtcGxhdGVzPC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFdvcmtQcm9kdWN0X1RlbXBsYXRlcygpCi0JICogQG1vZGVsIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0PFRlbXBsYXRlPiBnZXRUZW1wbGF0ZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlRvb2wgTWVudG9yczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVG9vbE1lbnRvcn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Ub29sIE1lbnRvcnM8L2VtPicgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Ub29sIE1lbnRvcnM8L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0V29ya1Byb2R1Y3RfVG9vbE1lbnRvcnMoKQotCSAqIEBtb2RlbCBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdDxUb29sTWVudG9yPiBnZXRUb29sTWVudG9ycygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RXN0aW1hdGlvbiBDb25zaWRlcmF0aW9uczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkVzdGltYXRpb24gQ29uc2lkZXJhdGlvbnM8L2VtPicgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Fc3RpbWF0aW9uIENvbnNpZGVyYXRpb25zPC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFdvcmtQcm9kdWN0X0VzdGltYXRpb25Db25zaWRlcmF0aW9ucygpCi0JICogQG1vZGVsIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0PEVzdGltYXRpb25Db25zaWRlcmF0aW9ucz4gZ2V0RXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKCk7Ci0KLX0gLy8gV29ya1Byb2R1Y3QKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvV29ya1Byb2R1Y3REZXNjcmlwdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9Xb3JrUHJvZHVjdERlc2NyaXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4YjA0ZGMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9Xb3JrUHJvZHVjdERlc2NyaXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+V29yayBQcm9kdWN0IERlc2NyaXB0aW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdGlvbiNnZXRQdXJwb3NlIDxlbT5QdXJwb3NlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRpb24jZ2V0SW1wYWN0T2ZOb3RIYXZpbmcgPGVtPkltcGFjdCBPZiBOb3QgSGF2aW5nPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRpb24jZ2V0UmVhc29uc0Zvck5vdE5lZWRpbmcgPGVtPlJlYXNvbnMgRm9yIE5vdCBOZWVkaW5nPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0V29ya1Byb2R1Y3REZXNjcmlwdGlvbigpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBXb3JrUHJvZHVjdERlc2NyaXB0aW9uIGV4dGVuZHMgQ29udGVudERlc2NyaXB0aW9uIHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QdXJwb3NlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+IiI8L2NvZGU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogRGVzY3JpYmVzIHdoeSB0aGUgd29yayBwcm9kdWN0IGlzIHByb2R1Y2VkIGFuZCB0byB3aGF0IHVzZSBpdCB3aWxsIGJlIHB1dC4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UHVycG9zZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UHVycG9zZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0V29ya1Byb2R1Y3REZXNjcmlwdGlvbl9QdXJwb3NlKCkKLQkgKiBAbW9kZWwgZGVmYXVsdD0iIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5TdHJpbmciIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0UHVycG9zZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0aW9uI2dldFB1cnBvc2UgPGVtPlB1cnBvc2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlB1cnBvc2U8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFB1cnBvc2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFB1cnBvc2UoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkltcGFjdCBPZiBOb3QgSGF2aW5nPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+IiI8L2NvZGU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogRGVzY3JpYmVzIHRoZSBjb25zZXF1ZW5jZXMgb2Ygbm90IHByb2R1Y2luZyB0aGUgd29yayBwcm9kdWN0LiAgVGhpcyBpcyBpbnRlbmRlZCB0byBhaWQgaW4gdGhlIHRhaWxvcmluZyB0aGUgbWV0aG9kL3Byb2Nlc3MgdG8gdGhlIG5lZWRzIG9mIGEgc3BlY2lmaWMgcHJvamVjdC4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SW1wYWN0IE9mIE5vdCBIYXZpbmc8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEltcGFjdE9mTm90SGF2aW5nKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRXb3JrUHJvZHVjdERlc2NyaXB0aW9uX0ltcGFjdE9mTm90SGF2aW5nKCkKLQkgKiBAbW9kZWwgZGVmYXVsdD0iIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5TdHJpbmciIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0SW1wYWN0T2ZOb3RIYXZpbmcoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdGlvbiNnZXRJbXBhY3RPZk5vdEhhdmluZyA8ZW0+SW1wYWN0IE9mIE5vdCBIYXZpbmc8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkltcGFjdCBPZiBOb3QgSGF2aW5nPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRJbXBhY3RPZk5vdEhhdmluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0SW1wYWN0T2ZOb3RIYXZpbmcoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJlYXNvbnMgRm9yIE5vdCBOZWVkaW5nPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+IiI8L2NvZGU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogRGVzY3JpYmVzIHRoZSBjaXJjdW1zdGFuY2VzIGluIHdoaWNoIGl0IGlzIHJlYXNvbmFibGUgbm90IHRvIHByb2R1Y2UgdGhlIHdvcmsgcHJvZHVjdC4gIFRoaXMgaXMgaW50ZW5kZWQgdG8gYWlkIGluIHRoZSB0YWlsb3Jpbmcgb2YgdGhlIG1ldGhvZC9wcm9jZXNzIHRvIHRoZSBuZWVkcyBvZiBhIHNwZWNpZmljIHByb2plY3QuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJlYXNvbnMgRm9yIE5vdCBOZWVkaW5nPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRSZWFzb25zRm9yTm90TmVlZGluZyhTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0V29ya1Byb2R1Y3REZXNjcmlwdGlvbl9SZWFzb25zRm9yTm90TmVlZGluZygpCi0JICogQG1vZGVsIGRlZmF1bHQ9IiIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuU3RyaW5nIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFJlYXNvbnNGb3JOb3ROZWVkaW5nKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRpb24jZ2V0UmVhc29uc0Zvck5vdE5lZWRpbmcgPGVtPlJlYXNvbnMgRm9yIE5vdCBOZWVkaW5nPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5SZWFzb25zIEZvciBOb3QgTmVlZGluZzwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UmVhc29uc0Zvck5vdE5lZWRpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFJlYXNvbnNGb3JOb3ROZWVkaW5nKFN0cmluZyB2YWx1ZSk7Ci0KLX0gLy8gV29ya1Byb2R1Y3REZXNjcmlwdGlvbgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9Xb3JrUHJvZHVjdERlc2NyaXB0b3IuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvV29ya1Byb2R1Y3REZXNjcmlwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5ZTExZDcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9Xb3JrUHJvZHVjdERlc2NyaXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPldvcmsgUHJvZHVjdCBEZXNjcmlwdG9yPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQSBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvciByZXByZXNlbnRzIGEgV29yayBQcm9kdWN0IGluIHRoZSBjb250ZXh0IG9mIG9uZSBzcGVjaWZpYyBBY3Rpdml0eS4gIEV2ZXJ5IGJyZWFrZG93biBzdHJ1Y3R1cmUgY2FuIGRlZmluZSBkaWZmZXJlbnQgcmVsYXRpb25zaGlwcyBvZiBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvcnMgdG8gVGFzayBEZXNjcmlwdG9ycyBhbmQgUm9sZSBEZXNjcmlwdG9ycy4gIFRoZXJlZm9yZSBvbmUgV29yayBQcm9kdWN0IGNhbiBiZSByZXByZXNlbnRlZCBieSBtYW55IFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9ycyBlYWNoIHdpdGhpbiB0aGUgY29udGV4dCBvZiBhbiBBY3Rpdml0eSB3aXRoIGl0cyBvd24gc2V0IG9mIHJlbGF0aW9uc2hpcHMuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3IjZ2V0QWN0aXZpdHlFbnRyeVN0YXRlIDxlbT5BY3Rpdml0eSBFbnRyeSBTdGF0ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3IjZ2V0QWN0aXZpdHlFeGl0U3RhdGUgPGVtPkFjdGl2aXR5IEV4aXQgU3RhdGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yI2dldFdvcmtQcm9kdWN0IDxlbT5Xb3JrIFByb2R1Y3Q8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yI2dldEltcGFjdGVkQnkgPGVtPkltcGFjdGVkIEJ5PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvciNnZXRJbXBhY3RzIDxlbT5JbXBhY3RzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvciNnZXREZWxpdmVyYWJsZVBhcnRzIDxlbT5EZWxpdmVyYWJsZSBQYXJ0czwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFdvcmtQcm9kdWN0RGVzY3JpcHRvcigpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBXb3JrUHJvZHVjdERlc2NyaXB0b3IgZXh0ZW5kcyBEZXNjcmlwdG9yIHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BY3Rpdml0eSBFbnRyeSBTdGF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiIiPC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIEdpdmVuIHRoYXQgYW4gaW5zdGFuY2Ugb2YgV29yayBQcm9kdWN0IERlc2NyaXB0b3IgaGFzIGJlZW4gY3JlYXRlZCBmb3IgYSBzcGVjaWZpYyBBY3Rpdml0eSwgdGhlbiB0aGUgQWN0aXZpdHkgRW50cnkgU3RhdGUgYXR0cmlidXRlIHNwZWNpZmllcyB0aGUgZGVzaXJlZCBzdGF0ZSBvZiBpbnN0YW5jZXMgb2YgdGhlIHJlZmVyZW5jZWQgV29yayBQcm9kdWN0IHdoZW4gd29yayBvbiB0aGUgQWN0aXZpdHkgaXMgaW5pdGlhdGVkIChpLmUuIHdvcmsgb24gdGhlIEFjdGl2aXR5J3MgVGFzayBEZXNjcmlwdG9ycyBpcyBiZWluZyBpbml0aWF0ZWQgdGhhdCB1c2UgdGhpcyBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvciBhcyBpbnB1dCkuICAKLQkgKiBGb3Igc29tZSBXb3JrIFByb2R1Y3RzIHN0YXRlIGlzIGV4cHJlc3NlZCBpbiBwZXJjZW50YWdlIG9mIGNvbXBsZXRpb24sIGNvbXBsaWFuY2UgdG8gd29yayBwcm9kdWN0IGNoZWNrbGlzdCwgaW5mb3JtYWwgc3RhdGUgZGVzY3JpcHRpb25zLCBldGMuICBPdGhlcnMgaGF2ZSB2ZXJ5IHNwZWNpZmljIHN0YXRlcyBleHByZXNzZWQgYXMgZW51bWVyYXRpb25zIHN1Y2ggYXMgW2lkZW50aWZpZWQsIGJyaWVmbHkgZGVzY3JpYmVkLCBvdXRsaW5lZCwgZGV0YWlsZWRdIGZvciB1c2UgY2FzZXMuICBPdGhlciBXb3JrIFByb2R1Y3Qgc3RhdGVzIHJlbGF0ZSB0byBzb21lIHF1YWxpdHkgbWVhc3VyZXMgb3IgbGlmZWN5Y2xlIHN0YXRlcyBzdWNoIGFzIFtyZXZpZXdlZCwgaW1wbGVtZW50ZWQsIHRlc3RlZF0uCi0JICogCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkFjdGl2aXR5IEVudHJ5IFN0YXRlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRBY3Rpdml0eUVudHJ5U3RhdGUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9BY3Rpdml0eUVudHJ5U3RhdGUoKQotCSAqIEBtb2RlbCBkZWZhdWx0PSIiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLlN0cmluZyIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRBY3Rpdml0eUVudHJ5U3RhdGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yI2dldEFjdGl2aXR5RW50cnlTdGF0ZSA8ZW0+QWN0aXZpdHkgRW50cnkgU3RhdGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkFjdGl2aXR5IEVudHJ5IFN0YXRlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRBY3Rpdml0eUVudHJ5U3RhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEFjdGl2aXR5RW50cnlTdGF0ZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QWN0aXZpdHkgRXhpdCBTdGF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiIiPC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIEdpdmVuIHRoYXQgYW4gaW5zdGFuY2Ugb2YgV29yayBQcm9kdWN0IERlc2NyaXB0b3IgaGFzIGJlZW4gY3JlYXRlZCBmb3IgYSBzcGVjaWZpYyBBY3Rpdml0eSwgdGhlbiB0aGUgQWN0aXZpdHkgRXhpc3QgU3RhdGUgYXR0cmlidXRlIHNwZWNpZmllcyB0aGUgZGVzaXJlZCBzdGF0ZSBvZiBpbnN0YW5jZXMgb2YgdGhlIHJlZmVyZW5jZWQgV29yayBQcm9kdWN0IHdoZW4gd29yayBvbiB0aGUgQWN0aXZpdHkgaXMgZmluaXNoZWQgKGkuZS4gd29yayBvbiB0aGUgQWN0aXZpdHkncyBUYXNrIERlc2NyaXB0b3JzIGhhcyBmaW5pc2hlZCB0aGF0IGhhdmUgdGhpcyBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvciBhcyBvdXRwdXQpLgotCSAqIEZvciBzb21lIFdvcmsgUHJvZHVjdHMgc3RhdGUgaXMgZXhwcmVzc2VkIGluIHBlcmNlbnRhZ2Ugb2YgY29tcGxldGlvbiwgY29tcGxpYW5jZSB0byB3b3JrIHByb2R1Y3QgY2hlY2tsaXN0LCBpbmZvcm1hbCBzdGF0ZSBkZXNjcmlwdGlvbnMsIGV0Yy4gIE90aGVycyBoYXZlIHZlcnkgc3BlY2lmaWMgc3RhdGVzIGV4cHJlc3NlZCBhcyBlbnVtZXJhdGlvbnMgc3VjaCBhcyBbaWRlbnRpZmllZCwgYnJpZWZseSBkZXNjcmliZWQsIG91dGxpbmVkLCBkZXRhaWxlZF0gZm9yIHVzZSBjYXNlcy4gIE90aGVyIFdvcmsgUHJvZHVjdCBzdGF0ZXMgcmVsYXRlIHRvIHNvbWUgcXVhbGl0eSBtZWFzdXJlcyBvciBsaWZlY3ljbGUgc3RhdGVzIHN1Y2ggYXMgW3Jldmlld2VkLCBpbXBsZW1lbnRlZCwgdGVzdGVkXS4KLQkgKiAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QWN0aXZpdHkgRXhpdCBTdGF0ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0QWN0aXZpdHlFeGl0U3RhdGUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9BY3Rpdml0eUV4aXRTdGF0ZSgpCi0JICogQG1vZGVsIGRlZmF1bHQ9IiIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuU3RyaW5nIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldEFjdGl2aXR5RXhpdFN0YXRlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvciNnZXRBY3Rpdml0eUV4aXRTdGF0ZSA8ZW0+QWN0aXZpdHkgRXhpdCBTdGF0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QWN0aXZpdHkgRXhpdCBTdGF0ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0QWN0aXZpdHlFeGl0U3RhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEFjdGl2aXR5RXhpdFN0YXRlKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Xb3JrIFByb2R1Y3Q8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPldvcmsgUHJvZHVjdDwvZW0+JyByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Xb3JrIFByb2R1Y3Q8L2VtPicgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFdvcmtQcm9kdWN0KFdvcmtQcm9kdWN0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9Xb3JrUHJvZHVjdCgpCi0JICogQG1vZGVsIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlXb3JrUHJvZHVjdCBnZXRXb3JrUHJvZHVjdCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3IjZ2V0V29ya1Byb2R1Y3QgPGVtPldvcmsgUHJvZHVjdDwvZW0+fScgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+V29yayBQcm9kdWN0PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRXb3JrUHJvZHVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0V29ya1Byb2R1Y3QoV29ya1Byb2R1Y3QgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SW1wYWN0ZWQgQnk8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvcn0uCi0JICogSXQgaXMgYmlkaXJlY3Rpb25hbCBhbmQgaXRzIG9wcG9zaXRlIGlzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3IjZ2V0SW1wYWN0cyA8ZW0+SW1wYWN0czwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5JbXBhY3RlZCBCeTwvZW0+JyByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkltcGFjdGVkIEJ5PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9JbXBhY3RlZEJ5KCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yI2dldEltcGFjdHMKLQkgKiBAbW9kZWwgb3Bwb3NpdGU9ImltcGFjdHMiIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0PFdvcmtQcm9kdWN0RGVzY3JpcHRvcj4gZ2V0SW1wYWN0ZWRCeSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SW1wYWN0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yfS4KLQkgKiBJdCBpcyBiaWRpcmVjdGlvbmFsIGFuZCBpdHMgb3Bwb3NpdGUgaXMgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvciNnZXRJbXBhY3RlZEJ5IDxlbT5JbXBhY3RlZCBCeTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5JbXBhY3RzPC9lbT4nIHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SW1wYWN0czwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JfSW1wYWN0cygpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvciNnZXRJbXBhY3RlZEJ5Ci0JICogQG1vZGVsIG9wcG9zaXRlPSJpbXBhY3RlZEJ5IiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdDxXb3JrUHJvZHVjdERlc2NyaXB0b3I+IGdldEltcGFjdHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRlbGl2ZXJhYmxlIFBhcnRzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3J9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RGVsaXZlcmFibGUgUGFydHM8L2VtPicgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EZWxpdmVyYWJsZSBQYXJ0czwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JfRGVsaXZlcmFibGVQYXJ0cygpCi0JICogQG1vZGVsIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0PFdvcmtQcm9kdWN0RGVzY3JpcHRvcj4gZ2V0RGVsaXZlcmFibGVQYXJ0cygpOwotCi19IC8vIFdvcmtQcm9kdWN0RGVzY3JpcHRvcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9Xb3JrUHJvZHVjdFR5cGUuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvV29ya1Byb2R1Y3RUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjMDcyYWEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9Xb3JrUHJvZHVjdFR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+V29yayBQcm9kdWN0IFR5cGU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBXb3JrIFByb2R1Y3QgVHlwZSBpcyBhIHNlY29uZCBjYXRlZ29yeSBmb3Igd29yayBwcm9kdWN0cywgd2hpY2ggaW4gY29udHJhc3QgdG8gRG9tYWluIGlzIG1vcmUgcHJlc2VudGF0aW9uIG9yaWVudGVkLiAgQSB3b3JrIHByb2R1Y3QgY2FuIGhhdmUgbWFueSBXb3JrIFByb2R1Y3QgVHlwZXMuICBFeGFtcGxlcywgZm9yIGEgV29yayBQcm9kdWN0IFR5cGUgaXMgIkNsYXNzIERpYWdyYW0iLCB3aGljaCBjYXRlZ29yaXplcyB0aGUgQXJ0aWZhY3RzIEFuYWx5c2lzIE1vZGVsLCBEZXNpZ24gTW9kZWwsIFVzZXIgRXhwZXJpZW5jZSBNb2RlbCwgb3IgIlNwZWNpZmljYXRpb24iLCB3aGljaCBjYXRlZ29yaXplcyByZXF1aXJlbWVudHMgc3BlY2lmaWNhdGlvbnMgdGhhdCBkZWZpbmUgYSBzeXN0ZW0gd2l0aCBhIHdlbGwtZGVmaW5lZCBzeXN0ZW0gYm91bmRhcnksIHN1Y2ggYXMgdXNlIGNhc2Ugb3IgZnVuY3Rpb25hbCByZXF1aXJlbWVudHMgc3BlY2lmaWNhdGlvbi4gIEEgV29yayBQcm9kdWN0IGNhbiBiZSBjYXRlZ29yaXplZCB0byBiZSBvZiBtYW55IFdvcmsgUHJvZHVjdCBUeXBlcy4gIEZvciBleGFtcGxlLCBhIHVzZSBjYXNlIG1vZGVsIGNhbiBiZSBjYXRlZ29yaXplZCBhcyBhIFNwZWNpZmljYXRpb24gYXMgd2VsbCBhcyBEaWFncmFtIFdvcmsgUHJvZHVjdCBUeXBlLgotICogCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdFR5cGUjZ2V0V29ya1Byb2R1Y3RzIDxlbT5Xb3JrIFByb2R1Y3RzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0V29ya1Byb2R1Y3RUeXBlKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFdvcmtQcm9kdWN0VHlwZSBleHRlbmRzIENvbnRlbnRDYXRlZ29yeSB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+V29yayBQcm9kdWN0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3R9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+V29yayBQcm9kdWN0czwvZW0+JyByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPldvcmsgUHJvZHVjdHM8L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0V29ya1Byb2R1Y3RUeXBlX1dvcmtQcm9kdWN0cygpCi0JICogQG1vZGVsIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0PFdvcmtQcm9kdWN0PiBnZXRXb3JrUHJvZHVjdHMoKTsKLQotfSAvLyBXb3JrUHJvZHVjdFR5cGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9BY3Rpdml0eURlc2NyaXB0aW9uSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0FjdGl2aXR5RGVzY3JpcHRpb25JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlMTA2YjcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0FjdGl2aXR5RGVzY3JpcHRpb25JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMDQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+QWN0aXZpdHkgRGVzY3JpcHRpb248L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5BY3Rpdml0eURlc2NyaXB0aW9uSW1wbCNnZXRQdXJwb3NlIDxlbT5QdXJwb3NlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQWN0aXZpdHlEZXNjcmlwdGlvbkltcGwjZ2V0QWx0ZXJuYXRpdmVzIDxlbT5BbHRlcm5hdGl2ZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5BY3Rpdml0eURlc2NyaXB0aW9uSW1wbCNnZXRIb3d0b1N0YWZmIDxlbT5Ib3d0byBTdGFmZjwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXR5RGVzY3JpcHRpb25JbXBsIGV4dGVuZHMgQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uSW1wbAotCQlpbXBsZW1lbnRzIEFjdGl2aXR5RGVzY3JpcHRpb24gewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFB1cnBvc2UoKSA8ZW0+UHVycG9zZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UHVycG9zZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFVSUE9TRV9FREVGQVVMVCA9ICIiOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHVycG9zZSgpIDxlbT5QdXJwb3NlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQdXJwb3NlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHB1cnBvc2UgPSBQVVJQT1NFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFsdGVybmF0aXZlcygpIDxlbT5BbHRlcm5hdGl2ZXM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFsdGVybmF0aXZlcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUxURVJOQVRJVkVTX0VERUZBVUxUID0gIiI7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBbHRlcm5hdGl2ZXMoKSA8ZW0+QWx0ZXJuYXRpdmVzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBbHRlcm5hdGl2ZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgYWx0ZXJuYXRpdmVzID0gQUxURVJOQVRJVkVTX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEhvd3RvU3RhZmYoKSA8ZW0+SG93dG8gU3RhZmY8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEhvd3RvU3RhZmYoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEhPV1RPX1NUQUZGX0VERUZBVUxUID0gIiI7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRIb3d0b1N0YWZmKCkgPGVtPkhvd3RvIFN0YWZmPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRIb3d0b1N0YWZmKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGhvd3RvU3RhZmYgPSBIT1dUT19TVEFGRl9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBBY3Rpdml0eURlc2NyaXB0aW9uSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQotCQkvL1VNQS0tPgotCQlyZWFzc2lnbkRlZmF1bHRWYWx1ZXMoKTsKLQkJLy9VTUE8LS0gIAotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5BQ1RJVklUWV9ERVNDUklQVElPTjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFB1cnBvc2UoKSB7Ci0JCXJldHVybiBwdXJwb3NlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFB1cnBvc2UoU3RyaW5nIG5ld1B1cnBvc2UpIHsKLQkJU3RyaW5nIG9sZFB1cnBvc2UgPSBwdXJwb3NlOwotCQlwdXJwb3NlID0gbmV3UHVycG9zZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5BQ1RJVklUWV9ERVNDUklQVElPTl9fUFVSUE9TRSwgb2xkUHVycG9zZSwKLQkJCQkJcHVycG9zZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0QWx0ZXJuYXRpdmVzKCkgewotCQlyZXR1cm4gYWx0ZXJuYXRpdmVzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFsdGVybmF0aXZlcyhTdHJpbmcgbmV3QWx0ZXJuYXRpdmVzKSB7Ci0JCVN0cmluZyBvbGRBbHRlcm5hdGl2ZXMgPSBhbHRlcm5hdGl2ZXM7Ci0JCWFsdGVybmF0aXZlcyA9IG5ld0FsdGVybmF0aXZlczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5BQ1RJVklUWV9ERVNDUklQVElPTl9fQUxURVJOQVRJVkVTLAotCQkJCQlvbGRBbHRlcm5hdGl2ZXMsIGFsdGVybmF0aXZlcykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SG93dG9TdGFmZigpIHsKLQkJcmV0dXJuIGhvd3RvU3RhZmY7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SG93dG9TdGFmZihTdHJpbmcgbmV3SG93dG9TdGFmZikgewotCQlTdHJpbmcgb2xkSG93dG9TdGFmZiA9IGhvd3RvU3RhZmY7Ci0JCWhvd3RvU3RhZmYgPSBuZXdIb3d0b1N0YWZmOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLkFDVElWSVRZX0RFU0NSSVBUSU9OX19IT1dUT19TVEFGRiwKLQkJCQkJb2xkSG93dG9TdGFmZiwgaG93dG9TdGFmZikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX0RFU0NSSVBUSU9OX19QVVJQT1NFOgotCQkJcmV0dXJuIGdldFB1cnBvc2UoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX0RFU0NSSVBUSU9OX19BTFRFUk5BVElWRVM6Ci0JCQlyZXR1cm4gZ2V0QWx0ZXJuYXRpdmVzKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9ERVNDUklQVElPTl9fSE9XVE9fU1RBRkY6Ci0JCQlyZXR1cm4gZ2V0SG93dG9TdGFmZigpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9ERVNDUklQVElPTl9fUFVSUE9TRToKLQkJCXNldFB1cnBvc2UoKFN0cmluZykgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfREVTQ1JJUFRJT05fX0FMVEVSTkFUSVZFUzoKLQkJCXNldEFsdGVybmF0aXZlcygoU3RyaW5nKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9ERVNDUklQVElPTl9fSE9XVE9fU1RBRkY6Ci0JCQlzZXRIb3d0b1N0YWZmKChTdHJpbmcpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9ERVNDUklQVElPTl9fUFVSUE9TRToKLQkJCXNldFB1cnBvc2UoUFVSUE9TRV9FREVGQVVMVCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9ERVNDUklQVElPTl9fQUxURVJOQVRJVkVTOgotCQkJc2V0QWx0ZXJuYXRpdmVzKEFMVEVSTkFUSVZFU19FREVGQVVMVCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9ERVNDUklQVElPTl9fSE9XVE9fU1RBRkY6Ci0JCQlzZXRIb3d0b1N0YWZmKEhPV1RPX1NUQUZGX0VERUZBVUxUKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQkvL1VNQS0tPgotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IGdldEZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlKGZlYXR1cmVJRCk7Ci0JCWlmIChmZWF0dXJlICE9IG51bGwpIHsKLQkJCXJldHVybiBpc0ZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlU2V0KGZlYXR1cmUpOwotCQl9Ci0JCS8vVU1BPC0tCQkKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX0RFU0NSSVBUSU9OX19QVVJQT1NFOgotCQkJcmV0dXJuIFBVUlBPU0VfRURFRkFVTFQgPT0gbnVsbCA/IHB1cnBvc2UgIT0gbnVsbAotCQkJCQk6ICFQVVJQT1NFX0VERUZBVUxULmVxdWFscyhwdXJwb3NlKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX0RFU0NSSVBUSU9OX19BTFRFUk5BVElWRVM6Ci0JCQlyZXR1cm4gQUxURVJOQVRJVkVTX0VERUZBVUxUID09IG51bGwgPyBhbHRlcm5hdGl2ZXMgIT0gbnVsbAotCQkJCQk6ICFBTFRFUk5BVElWRVNfRURFRkFVTFQuZXF1YWxzKGFsdGVybmF0aXZlcyk7Ci0JCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9ERVNDUklQVElPTl9fSE9XVE9fU1RBRkY6Ci0JCQlyZXR1cm4gSE9XVE9fU1RBRkZfRURFRkFVTFQgPT0gbnVsbCA/IGhvd3RvU3RhZmYgIT0gbnVsbAotCQkJCQk6ICFIT1dUT19TVEFGRl9FREVGQVVMVC5lcXVhbHMoaG93dG9TdGFmZik7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKQotCQkJcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAocHVycG9zZTogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChwdXJwb3NlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBhbHRlcm5hdGl2ZXM6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoYWx0ZXJuYXRpdmVzKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBob3d0b1N0YWZmOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGhvd3RvU3RhZmYpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9BY3Rpdml0eURlc2NyaXB0aW9uSW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0FjdGl2aXR5SW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0FjdGl2aXR5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNDdlZGYwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9BY3Rpdml0eUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyNSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdFJlc29sdmluZ0VMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RXaXRoSW52ZXJzZVJlc29sdmluZ0VMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DaGVja2xpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db25jZXB0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29uc3RyYWludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkZ1bGZpbGxhYmxlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkV4YW1wbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HdWlkZWxpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5SZXVzYWJsZUFzc2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9hZG1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlN1cHBvcnRpbmdNYXRlcmlhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrRGVmaW5pdGlvbjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkFjdGl2aXR5PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQWN0aXZpdHlJbXBsI2dldEZ1bGZpbGxzIDxlbT5GdWxmaWxsczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkFjdGl2aXR5SW1wbCNnZXRWYXJpYWJpbGl0eVR5cGUgPGVtPlZhcmlhYmlsaXR5IFR5cGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5BY3Rpdml0eUltcGwjZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCA8ZW0+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkFjdGl2aXR5SW1wbCNnZXRQcmVjb25kaXRpb24gPGVtPlByZWNvbmRpdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkFjdGl2aXR5SW1wbCNnZXRQb3N0Y29uZGl0aW9uIDxlbT5Qb3N0Y29uZGl0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQWN0aXZpdHlJbXBsI2dldEJyZWFrZG93bkVsZW1lbnRzIDxlbT5CcmVha2Rvd24gRWxlbWVudHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5BY3Rpdml0eUltcGwjZ2V0Um9hZG1hcHMgPGVtPlJvYWRtYXBzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZpdHlJbXBsIGV4dGVuZHMgV29ya0JyZWFrZG93bkVsZW1lbnRJbXBsIGltcGxlbWVudHMgQWN0aXZpdHkgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RnVsZmlsbHMoKSA8ZW0+RnVsZmlsbHM8L2VtPn0nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RnVsZmlsbHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxGdWxmaWxsYWJsZUVsZW1lbnQ+IGZ1bGZpbGxzOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZhcmlhYmlsaXR5VHlwZSgpIDxlbT5WYXJpYWJpbGl0eSBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRWYXJpYWJpbGl0eVR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgVmFyaWFiaWxpdHlUeXBlIFZBUklBQklMSVRZX1RZUEVfRURFRkFVTFQgPSBWYXJpYWJpbGl0eVR5cGUuTkE7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWYXJpYWJpbGl0eVR5cGUoKSA8ZW0+VmFyaWFiaWxpdHkgVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VmFyaWFiaWxpdHlUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgVmFyaWFiaWxpdHlUeXBlIHZhcmlhYmlsaXR5VHlwZSA9IFZBUklBQklMSVRZX1RZUEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkgPGVtPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2VtPn0nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBWYXJpYWJpbGl0eUVsZW1lbnQgdmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByZWNvbmRpdGlvbigpIDxlbT5QcmVjb25kaXRpb248L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFByZWNvbmRpdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIENvbnN0cmFpbnQgcHJlY29uZGl0aW9uOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UG9zdGNvbmRpdGlvbigpIDxlbT5Qb3N0Y29uZGl0aW9uPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQb3N0Y29uZGl0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29uc3RyYWludCBwb3N0Y29uZGl0aW9uOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QnJlYWtkb3duRWxlbWVudHMoKSA8ZW0+QnJlYWtkb3duIEVsZW1lbnRzPC9lbT59JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEJyZWFrZG93bkVsZW1lbnRzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8QnJlYWtkb3duRWxlbWVudD4gYnJlYWtkb3duRWxlbWVudHM7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSb2FkbWFwcygpIDxlbT5Sb2FkbWFwczwvZW0+fScgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSb2FkbWFwcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PFJvYWRtYXA+IHJvYWRtYXBzOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEFjdGl2aXR5SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQotCQkvL1VNQS0tPgotCQlyZWFzc2lnbkRlZmF1bHRWYWx1ZXMoKTsKLQkJLy9VTUE8LS0gIAotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5BQ1RJVklUWTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdDxGdWxmaWxsYWJsZUVsZW1lbnQ+IGdldEZ1bGZpbGxzKCkgewotCQlpZiAoZnVsZmlsbHMgPT0gbnVsbCkgewotCQkJZnVsZmlsbHMgPSBuZXcgRU9iamVjdFJlc29sdmluZ0VMaXN0PEZ1bGZpbGxhYmxlRWxlbWVudD4oCi0JCQkJCUZ1bGZpbGxhYmxlRWxlbWVudC5jbGFzcywgdGhpcywKLQkJCQkJVW1hUGFja2FnZS5BQ1RJVklUWV9fRlVMRklMTFMpOwotCQl9Ci0JCXJldHVybiBmdWxmaWxsczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVmFyaWFiaWxpdHlUeXBlIGdldFZhcmlhYmlsaXR5VHlwZSgpIHsKLQkJcmV0dXJuIHZhcmlhYmlsaXR5VHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWYXJpYWJpbGl0eVR5cGUoVmFyaWFiaWxpdHlUeXBlIG5ld1ZhcmlhYmlsaXR5VHlwZSkgewotCQlWYXJpYWJpbGl0eVR5cGUgb2xkVmFyaWFiaWxpdHlUeXBlID0gdmFyaWFiaWxpdHlUeXBlOwotCQl2YXJpYWJpbGl0eVR5cGUgPSBuZXdWYXJpYWJpbGl0eVR5cGUgPT0gbnVsbCA/IFZBUklBQklMSVRZX1RZUEVfRURFRkFVTFQKLQkJCQk6IG5ld1ZhcmlhYmlsaXR5VHlwZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5BQ1RJVklUWV9fVkFSSUFCSUxJVFlfVFlQRSwgb2xkVmFyaWFiaWxpdHlUeXBlLAotCQkJCQl2YXJpYWJpbGl0eVR5cGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVmFyaWFiaWxpdHlFbGVtZW50IGdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSB7Ci0JCWlmICh2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50ICE9IG51bGwKLQkJCQkmJiAoKEVPYmplY3QpIHZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQpLmVJc1Byb3h5KCkpIHsKLQkJCUludGVybmFsRU9iamVjdCBvbGRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50ID0gKEludGVybmFsRU9iamVjdCkgdmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudDsKLQkJCXZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQgPSAoVmFyaWFiaWxpdHlFbGVtZW50KSBlUmVzb2x2ZVByb3h5KG9sZFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQpOwotCQkJaWYgKHZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQgIT0gb2xkVmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCkgewotCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlJFU09MVkUsCi0JCQkJCQkJVW1hUGFja2FnZS5BQ1RJVklUWV9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVCwKLQkJCQkJCQlvbGRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50LAotCQkJCQkJCXZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVmFyaWFiaWxpdHlFbGVtZW50IGJhc2ljR2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpIHsKLQkJcmV0dXJuIHZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgKLQkJCVZhcmlhYmlsaXR5RWxlbWVudCBuZXdWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KSB7Ci0JCVZhcmlhYmlsaXR5RWxlbWVudCBvbGRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50ID0gdmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudDsKLQkJdmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCA9IG5ld1ZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuQUNUSVZJVFlfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQsCi0JCQkJCW9sZFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQsIHZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ29uc3RyYWludCBnZXRQcmVjb25kaXRpb24oKSB7Ci0JCWlmIChwcmVjb25kaXRpb24gIT0gbnVsbCAmJiAoKEVPYmplY3QpIHByZWNvbmRpdGlvbikuZUlzUHJveHkoKSkgewotCQkJSW50ZXJuYWxFT2JqZWN0IG9sZFByZWNvbmRpdGlvbiA9IChJbnRlcm5hbEVPYmplY3QpIHByZWNvbmRpdGlvbjsKLQkJCXByZWNvbmRpdGlvbiA9IChDb25zdHJhaW50KSBlUmVzb2x2ZVByb3h5KG9sZFByZWNvbmRpdGlvbik7Ci0JCQlpZiAocHJlY29uZGl0aW9uICE9IG9sZFByZWNvbmRpdGlvbikgewotCQkJCUludGVybmFsRU9iamVjdCBuZXdQcmVjb25kaXRpb24gPSAoSW50ZXJuYWxFT2JqZWN0KSBwcmVjb25kaXRpb247Ci0JCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG9sZFByZWNvbmRpdGlvbgotCQkJCQkJLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UKLQkJCQkJCQkJLSBVbWFQYWNrYWdlLkFDVElWSVRZX19QUkVDT05ESVRJT04sIG51bGwsIG51bGwpOwotCQkJCWlmIChuZXdQcmVjb25kaXRpb24uZUludGVybmFsQ29udGFpbmVyKCkgPT0gbnVsbCkgewotCQkJCQltc2dzID0gbmV3UHJlY29uZGl0aW9uLmVJbnZlcnNlQWRkKHRoaXMsCi0JCQkJCQkJRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRQotCQkJCQkJCQkJLSBVbWFQYWNrYWdlLkFDVElWSVRZX19QUkVDT05ESVRJT04sIG51bGwsCi0JCQkJCQkJbXNncyk7Ci0JCQkJfQotCQkJCWlmIChtc2dzICE9IG51bGwpCi0JCQkJCW1zZ3MuZGlzcGF0Y2goKTsKLQkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLAotCQkJCQkJCVVtYVBhY2thZ2UuQUNUSVZJVFlfX1BSRUNPTkRJVElPTiwgb2xkUHJlY29uZGl0aW9uLAotCQkJCQkJCXByZWNvbmRpdGlvbikpOwotCQkJfQotCQl9Ci0JCXJldHVybiBwcmVjb25kaXRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENvbnN0cmFpbnQgYmFzaWNHZXRQcmVjb25kaXRpb24oKSB7Ci0JCXJldHVybiBwcmVjb25kaXRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0UHJlY29uZGl0aW9uKENvbnN0cmFpbnQgbmV3UHJlY29uZGl0aW9uLAotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlDb25zdHJhaW50IG9sZFByZWNvbmRpdGlvbiA9IHByZWNvbmRpdGlvbjsKLQkJcHJlY29uZGl0aW9uID0gbmV3UHJlY29uZGl0aW9uOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLAotCQkJCQlOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLkFDVElWSVRZX19QUkVDT05ESVRJT04sCi0JCQkJCW9sZFByZWNvbmRpdGlvbiwgbmV3UHJlY29uZGl0aW9uKTsKLQkJCWlmIChtc2dzID09IG51bGwpCi0JCQkJbXNncyA9IG5vdGlmaWNhdGlvbjsKLQkJCWVsc2UKLQkJCQltc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFByZWNvbmRpdGlvbihDb25zdHJhaW50IG5ld1ByZWNvbmRpdGlvbikgewotCQlpZiAobmV3UHJlY29uZGl0aW9uICE9IHByZWNvbmRpdGlvbikgewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAocHJlY29uZGl0aW9uICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KSBwcmVjb25kaXRpb24pCi0JCQkJCQkuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRQotCQkJCQkJCQktIFVtYVBhY2thZ2UuQUNUSVZJVFlfX1BSRUNPTkRJVElPTiwgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3UHJlY29uZGl0aW9uICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KSBuZXdQcmVjb25kaXRpb24pCi0JCQkJCQkuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRQotCQkJCQkJCQktIFVtYVBhY2thZ2UuQUNUSVZJVFlfX1BSRUNPTkRJVElPTiwgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRQcmVjb25kaXRpb24obmV3UHJlY29uZGl0aW9uLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpCi0JCQkJbXNncy5kaXNwYXRjaCgpOwotCQl9IGVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5BQ1RJVklUWV9fUFJFQ09ORElUSU9OLCBuZXdQcmVjb25kaXRpb24sCi0JCQkJCW5ld1ByZWNvbmRpdGlvbikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb25zdHJhaW50IGdldFBvc3Rjb25kaXRpb24oKSB7Ci0JCWlmIChwb3N0Y29uZGl0aW9uICE9IG51bGwgJiYgKChFT2JqZWN0KSBwb3N0Y29uZGl0aW9uKS5lSXNQcm94eSgpKSB7Ci0JCQlJbnRlcm5hbEVPYmplY3Qgb2xkUG9zdGNvbmRpdGlvbiA9IChJbnRlcm5hbEVPYmplY3QpIHBvc3Rjb25kaXRpb247Ci0JCQlwb3N0Y29uZGl0aW9uID0gKENvbnN0cmFpbnQpIGVSZXNvbHZlUHJveHkob2xkUG9zdGNvbmRpdGlvbik7Ci0JCQlpZiAocG9zdGNvbmRpdGlvbiAhPSBvbGRQb3N0Y29uZGl0aW9uKSB7Ci0JCQkJSW50ZXJuYWxFT2JqZWN0IG5ld1Bvc3Rjb25kaXRpb24gPSAoSW50ZXJuYWxFT2JqZWN0KSBwb3N0Y29uZGl0aW9uOwotCQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBvbGRQb3N0Y29uZGl0aW9uLmVJbnZlcnNlUmVtb3ZlKHRoaXMsCi0JCQkJCQlFT1BQT1NJVEVfRkVBVFVSRV9CQVNFCi0JCQkJCQkJCS0gVW1hUGFja2FnZS5BQ1RJVklUWV9fUE9TVENPTkRJVElPTiwgbnVsbCwKLQkJCQkJCW51bGwpOwotCQkJCWlmIChuZXdQb3N0Y29uZGl0aW9uLmVJbnRlcm5hbENvbnRhaW5lcigpID09IG51bGwpIHsKLQkJCQkJbXNncyA9IG5ld1Bvc3Rjb25kaXRpb24uZUludmVyc2VBZGQodGhpcywKLQkJCQkJCQlFT1BQT1NJVEVfRkVBVFVSRV9CQVNFCi0JCQkJCQkJCQktIFVtYVBhY2thZ2UuQUNUSVZJVFlfX1BPU1RDT05ESVRJT04sIG51bGwsCi0JCQkJCQkJbXNncyk7Ci0JCQkJfQotCQkJCWlmIChtc2dzICE9IG51bGwpCi0JCQkJCW1zZ3MuZGlzcGF0Y2goKTsKLQkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLAotCQkJCQkJCVVtYVBhY2thZ2UuQUNUSVZJVFlfX1BPU1RDT05ESVRJT04sCi0JCQkJCQkJb2xkUG9zdGNvbmRpdGlvbiwgcG9zdGNvbmRpdGlvbikpOwotCQkJfQotCQl9Ci0JCXJldHVybiBwb3N0Y29uZGl0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb25zdHJhaW50IGJhc2ljR2V0UG9zdGNvbmRpdGlvbigpIHsKLQkJcmV0dXJuIHBvc3Rjb25kaXRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0UG9zdGNvbmRpdGlvbihDb25zdHJhaW50IG5ld1Bvc3Rjb25kaXRpb24sCi0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCUNvbnN0cmFpbnQgb2xkUG9zdGNvbmRpdGlvbiA9IHBvc3Rjb25kaXRpb247Ci0JCXBvc3Rjb25kaXRpb24gPSBuZXdQb3N0Y29uZGl0aW9uOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLAotCQkJCQlOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLkFDVElWSVRZX19QT1NUQ09ORElUSU9OLAotCQkJCQlvbGRQb3N0Y29uZGl0aW9uLCBuZXdQb3N0Y29uZGl0aW9uKTsKLQkJCWlmIChtc2dzID09IG51bGwpCi0JCQkJbXNncyA9IG5vdGlmaWNhdGlvbjsKLQkJCWVsc2UKLQkJCQltc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBvc3Rjb25kaXRpb24oQ29uc3RyYWludCBuZXdQb3N0Y29uZGl0aW9uKSB7Ci0JCWlmIChuZXdQb3N0Y29uZGl0aW9uICE9IHBvc3Rjb25kaXRpb24pIHsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKHBvc3Rjb25kaXRpb24gIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpIHBvc3Rjb25kaXRpb24pLmVJbnZlcnNlUmVtb3ZlKHRoaXMsCi0JCQkJCQlFT1BQT1NJVEVfRkVBVFVSRV9CQVNFCi0JCQkJCQkJCS0gVW1hUGFja2FnZS5BQ1RJVklUWV9fUE9TVENPTkRJVElPTiwgbnVsbCwKLQkJCQkJCW1zZ3MpOwotCQkJaWYgKG5ld1Bvc3Rjb25kaXRpb24gIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpIG5ld1Bvc3Rjb25kaXRpb24pLmVJbnZlcnNlQWRkKHRoaXMsCi0JCQkJCQlFT1BQT1NJVEVfRkVBVFVSRV9CQVNFCi0JCQkJCQkJCS0gVW1hUGFja2FnZS5BQ1RJVklUWV9fUE9TVENPTkRJVElPTiwgbnVsbCwKLQkJCQkJCW1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0UG9zdGNvbmRpdGlvbihuZXdQb3N0Y29uZGl0aW9uLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpCi0JCQkJbXNncy5kaXNwYXRjaCgpOwotCQl9IGVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5BQ1RJVklUWV9fUE9TVENPTkRJVElPTiwgbmV3UG9zdGNvbmRpdGlvbiwKLQkJCQkJbmV3UG9zdGNvbmRpdGlvbikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0PEJyZWFrZG93bkVsZW1lbnQ+IGdldEJyZWFrZG93bkVsZW1lbnRzKCkgewotCQlpZiAoYnJlYWtkb3duRWxlbWVudHMgPT0gbnVsbCkgewotCQkJYnJlYWtkb3duRWxlbWVudHMgPSBuZXcgRU9iamVjdFdpdGhJbnZlcnNlUmVzb2x2aW5nRUxpc3Q8QnJlYWtkb3duRWxlbWVudD4oCi0JCQkJCUJyZWFrZG93bkVsZW1lbnQuY2xhc3MsIHRoaXMsCi0JCQkJCVVtYVBhY2thZ2UuQUNUSVZJVFlfX0JSRUFLRE9XTl9FTEVNRU5UUywKLQkJCQkJVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fU1VQRVJfQUNUSVZJVElFUyk7Ci0JCX0KLQkJcmV0dXJuIGJyZWFrZG93bkVsZW1lbnRzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0PFJvYWRtYXA+IGdldFJvYWRtYXBzKCkgewotCQlpZiAocm9hZG1hcHMgPT0gbnVsbCkgewotCQkJcm9hZG1hcHMgPSBuZXcgRU9iamVjdFJlc29sdmluZ0VMaXN0PFJvYWRtYXA+KFJvYWRtYXAuY2xhc3MsIHRoaXMsCi0JCQkJCVVtYVBhY2thZ2UuQUNUSVZJVFlfX1JPQURNQVBTKTsKLQkJfQotCQlyZXR1cm4gcm9hZG1hcHM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JQE92ZXJyaWRlCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlQWRkKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwKLQkJCWludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX19CUkVBS0RPV05fRUxFTUVOVFM6Ci0JCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PEludGVybmFsRU9iamVjdD4pIChJbnRlcm5hbEVMaXN0PD8+KSBnZXRCcmVha2Rvd25FbGVtZW50cygpKQotCQkJCQkuYmFzaWNBZGQob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZUFkZChvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLAotCQkJaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX1BSRUNPTkRJVElPTjoKLQkJCXJldHVybiBiYXNpY1NldFByZWNvbmRpdGlvbihudWxsLCBtc2dzKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX19QT1NUQ09ORElUSU9OOgotCQkJcmV0dXJuIGJhc2ljU2V0UG9zdGNvbmRpdGlvbihudWxsLCBtc2dzKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX19CUkVBS0RPV05fRUxFTUVOVFM6Ci0JCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KSBnZXRCcmVha2Rvd25FbGVtZW50cygpKS5iYXNpY1JlbW92ZSgKLQkJCQkJb3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9fRlVMRklMTFM6Ci0JCQlyZXR1cm4gZ2V0RnVsZmlsbHMoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX19WQVJJQUJJTElUWV9UWVBFOgotCQkJcmV0dXJuIGdldFZhcmlhYmlsaXR5VHlwZSgpOwotCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQ6Ci0JCQlpZiAocmVzb2x2ZSkKLQkJCQlyZXR1cm4gZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpOwotCQkJcmV0dXJuIGJhc2ljR2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpOwotCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX1BSRUNPTkRJVElPTjoKLQkJCWlmIChyZXNvbHZlKQotCQkJCXJldHVybiBnZXRQcmVjb25kaXRpb24oKTsKLQkJCXJldHVybiBiYXNpY0dldFByZWNvbmRpdGlvbigpOwotCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX1BPU1RDT05ESVRJT046Ci0JCQlpZiAocmVzb2x2ZSkKLQkJCQlyZXR1cm4gZ2V0UG9zdGNvbmRpdGlvbigpOwotCQkJcmV0dXJuIGJhc2ljR2V0UG9zdGNvbmRpdGlvbigpOwotCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX0JSRUFLRE9XTl9FTEVNRU5UUzoKLQkJCXJldHVybiBnZXRCcmVha2Rvd25FbGVtZW50cygpOwotCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX1JPQURNQVBTOgotCQkJcmV0dXJuIGdldFJvYWRtYXBzKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX19GVUxGSUxMUzoKLQkJCWdldEZ1bGZpbGxzKCkuY2xlYXIoKTsKLQkJCWdldEZ1bGZpbGxzKCkuYWRkQWxsKAotCQkJCQkoQ29sbGVjdGlvbjw/IGV4dGVuZHMgRnVsZmlsbGFibGVFbGVtZW50PikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX1ZBUklBQklMSVRZX1RZUEU6Ci0JCQlzZXRWYXJpYWJpbGl0eVR5cGUoKFZhcmlhYmlsaXR5VHlwZSkgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQ6Ci0JCQlzZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KChWYXJpYWJpbGl0eUVsZW1lbnQpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX19QUkVDT05ESVRJT046Ci0JCQlzZXRQcmVjb25kaXRpb24oKENvbnN0cmFpbnQpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX19QT1NUQ09ORElUSU9OOgotCQkJc2V0UG9zdGNvbmRpdGlvbigoQ29uc3RyYWludCkgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX0JSRUFLRE9XTl9FTEVNRU5UUzoKLQkJCWdldEJyZWFrZG93bkVsZW1lbnRzKCkuY2xlYXIoKTsKLQkJCWdldEJyZWFrZG93bkVsZW1lbnRzKCkuYWRkQWxsKAotCQkJCQkoQ29sbGVjdGlvbjw/IGV4dGVuZHMgQnJlYWtkb3duRWxlbWVudD4pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX19ST0FETUFQUzoKLQkJCWdldFJvYWRtYXBzKCkuY2xlYXIoKTsKLQkJCWdldFJvYWRtYXBzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBSb2FkbWFwPikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX19GVUxGSUxMUzoKLQkJCWdldEZ1bGZpbGxzKCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX19WQVJJQUJJTElUWV9UWVBFOgotCQkJc2V0VmFyaWFiaWxpdHlUeXBlKFZBUklBQklMSVRZX1RZUEVfRURFRkFVTFQpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQ6Ci0JCQlzZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KChWYXJpYWJpbGl0eUVsZW1lbnQpIG51bGwpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX1BSRUNPTkRJVElPTjoKLQkJCXNldFByZWNvbmRpdGlvbigoQ29uc3RyYWludCkgbnVsbCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9fUE9TVENPTkRJVElPTjoKLQkJCXNldFBvc3Rjb25kaXRpb24oKENvbnN0cmFpbnQpIG51bGwpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX0JSRUFLRE9XTl9FTEVNRU5UUzoKLQkJCWdldEJyZWFrZG93bkVsZW1lbnRzKCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX19ST0FETUFQUzoKLQkJCWdldFJvYWRtYXBzKCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQkvL1VNQS0tPgotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IGdldEZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlKGZlYXR1cmVJRCk7Ci0JCWlmIChmZWF0dXJlICE9IG51bGwpIHsKLQkJCXJldHVybiBpc0ZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlU2V0KGZlYXR1cmUpOwotCQl9Ci0JCS8vVU1BPC0tCQkKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX19GVUxGSUxMUzoKLQkJCXJldHVybiBmdWxmaWxscyAhPSBudWxsICYmICFmdWxmaWxscy5pc0VtcHR5KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9fVkFSSUFCSUxJVFlfVFlQRToKLQkJCXJldHVybiB2YXJpYWJpbGl0eVR5cGUgIT0gVkFSSUFCSUxJVFlfVFlQRV9FREVGQVVMVDsKLQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UOgotCQkJcmV0dXJuIHZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQgIT0gbnVsbDsKLQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX19QUkVDT05ESVRJT046Ci0JCQlyZXR1cm4gcHJlY29uZGl0aW9uICE9IG51bGw7Ci0JCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9fUE9TVENPTkRJVElPTjoKLQkJCXJldHVybiBwb3N0Y29uZGl0aW9uICE9IG51bGw7Ci0JCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9fQlJFQUtET1dOX0VMRU1FTlRTOgotCQkJcmV0dXJuIGJyZWFrZG93bkVsZW1lbnRzICE9IG51bGwgJiYgIWJyZWFrZG93bkVsZW1lbnRzLmlzRW1wdHkoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX19ST0FETUFQUzoKLQkJCXJldHVybiByb2FkbWFwcyAhPSBudWxsICYmICFyb2FkbWFwcy5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBpbnQgZUJhc2VTdHJ1Y3R1cmFsRmVhdHVyZUlEKGludCBkZXJpdmVkRmVhdHVyZUlELCBDbGFzczw/PiBiYXNlQ2xhc3MpIHsKLQkJaWYgKGJhc2VDbGFzcyA9PSBGdWxmaWxsYWJsZUVsZW1lbnQuY2xhc3MpIHsKLQkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX19GVUxGSUxMUzoKLQkJCQlyZXR1cm4gVW1hUGFja2FnZS5GVUxGSUxMQUJMRV9FTEVNRU5UX19GVUxGSUxMUzsKLQkJCWRlZmF1bHQ6Ci0JCQkJcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gVmFyaWFiaWxpdHlFbGVtZW50LmNsYXNzKSB7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9fVkFSSUFCSUxJVFlfVFlQRToKLQkJCQlyZXR1cm4gVW1hUGFja2FnZS5WQVJJQUJJTElUWV9FTEVNRU5UX19WQVJJQUJJTElUWV9UWVBFOwotCQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UOgotCQkJCXJldHVybiBVbWFQYWNrYWdlLlZBUklBQklMSVRZX0VMRU1FTlRfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQ7Ci0JCQlkZWZhdWx0OgotCQkJCXJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFdvcmtEZWZpbml0aW9uLmNsYXNzKSB7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9fUFJFQ09ORElUSU9OOgotCQkJCXJldHVybiBVbWFQYWNrYWdlLldPUktfREVGSU5JVElPTl9fUFJFQ09ORElUSU9OOwotCQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX19QT1NUQ09ORElUSU9OOgotCQkJCXJldHVybiBVbWFQYWNrYWdlLldPUktfREVGSU5JVElPTl9fUE9TVENPTkRJVElPTjsKLQkJCWRlZmF1bHQ6Ci0JCQkJcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCXJldHVybiBzdXBlci5lQmFzZVN0cnVjdHVyYWxGZWF0dXJlSUQoZGVyaXZlZEZlYXR1cmVJRCwgYmFzZUNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgaW50IGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChpbnQgYmFzZUZlYXR1cmVJRCwgQ2xhc3M8Pz4gYmFzZUNsYXNzKSB7Ci0JCWlmIChiYXNlQ2xhc3MgPT0gRnVsZmlsbGFibGVFbGVtZW50LmNsYXNzKSB7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5GVUxGSUxMQUJMRV9FTEVNRU5UX19GVUxGSUxMUzoKLQkJCQlyZXR1cm4gVW1hUGFja2FnZS5BQ1RJVklUWV9fRlVMRklMTFM7Ci0JCQlkZWZhdWx0OgotCQkJCXJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFZhcmlhYmlsaXR5RWxlbWVudC5jbGFzcykgewotCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuVkFSSUFCSUxJVFlfRUxFTUVOVF9fVkFSSUFCSUxJVFlfVFlQRToKLQkJCQlyZXR1cm4gVW1hUGFja2FnZS5BQ1RJVklUWV9fVkFSSUFCSUxJVFlfVFlQRTsKLQkJCWNhc2UgVW1hUGFja2FnZS5WQVJJQUJJTElUWV9FTEVNRU5UX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UOgotCQkJCXJldHVybiBVbWFQYWNrYWdlLkFDVElWSVRZX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UOwotCQkJZGVmYXVsdDoKLQkJCQlyZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBXb3JrRGVmaW5pdGlvbi5jbGFzcykgewotCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19ERUZJTklUSU9OX19QUkVDT05ESVRJT046Ci0JCQkJcmV0dXJuIFVtYVBhY2thZ2UuQUNUSVZJVFlfX1BSRUNPTkRJVElPTjsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX0RFRklOSVRJT05fX1BPU1RDT05ESVRJT046Ci0JCQkJcmV0dXJuIFVtYVBhY2thZ2UuQUNUSVZJVFlfX1BPU1RDT05ESVRJT047Ci0JCQlkZWZhdWx0OgotCQkJCXJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXIuZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGJhc2VGZWF0dXJlSUQsIGJhc2VDbGFzcyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpCi0JCQlyZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiICh2YXJpYWJpbGl0eVR5cGU6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQodmFyaWFiaWxpdHlUeXBlKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vQWN0aXZpdHlJbXBsCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvQXBwbGljYWJsZU1ldGFDbGFzc0luZm9JbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvQXBwbGljYWJsZU1ldGFDbGFzc0luZm9JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlMDI4NWYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0FwcGxpY2FibGVNZXRhQ2xhc3NJbmZvSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BcHBsaWNhYmxlTWV0YUNsYXNzSW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5BcHBsaWNhYmxlIE1ldGEgQ2xhc3MgSW5mbzwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvSW1wbCNnZXRJc1ByaW1hcnlFeHRlbnNpb24gPGVtPklzIFByaW1hcnkgRXh0ZW5zaW9uPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQXBwbGljYWJsZU1ldGFDbGFzc0luZm9JbXBsIGV4dGVuZHMgQ2xhc3NpZmllckltcGwgaW1wbGVtZW50cwotCQlBcHBsaWNhYmxlTWV0YUNsYXNzSW5mbyB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SXNQcmltYXJ5RXh0ZW5zaW9uKCkgPGVtPklzIFByaW1hcnkgRXh0ZW5zaW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJc1ByaW1hcnlFeHRlbnNpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQm9vbGVhbiBJU19QUklNQVJZX0VYVEVOU0lPTl9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJc1ByaW1hcnlFeHRlbnNpb24oKSA8ZW0+SXMgUHJpbWFyeSBFeHRlbnNpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldElzUHJpbWFyeUV4dGVuc2lvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJvb2xlYW4gaXNQcmltYXJ5RXh0ZW5zaW9uID0gSVNfUFJJTUFSWV9FWFRFTlNJT05fRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQXBwbGljYWJsZU1ldGFDbGFzc0luZm9JbXBsKCkgewotCQlzdXBlcigpOwotCi0JCS8vVU1BLS0+Ci0JCXJlYXNzaWduRGVmYXVsdFZhbHVlcygpOwotCQkvL1VNQTwtLSAgCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLkFQUExJQ0FCTEVfTUVUQV9DTEFTU19JTkZPOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCb29sZWFuIGdldElzUHJpbWFyeUV4dGVuc2lvbigpIHsKLQkJcmV0dXJuIGlzUHJpbWFyeUV4dGVuc2lvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJc1ByaW1hcnlFeHRlbnNpb24oQm9vbGVhbiBuZXdJc1ByaW1hcnlFeHRlbnNpb24pIHsKLQkJQm9vbGVhbiBvbGRJc1ByaW1hcnlFeHRlbnNpb24gPSBpc1ByaW1hcnlFeHRlbnNpb247Ci0JCWlzUHJpbWFyeUV4dGVuc2lvbiA9IG5ld0lzUHJpbWFyeUV4dGVuc2lvbjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwoCi0JCQkJCXRoaXMsCi0JCQkJCU5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuQVBQTElDQUJMRV9NRVRBX0NMQVNTX0lORk9fX0lTX1BSSU1BUllfRVhURU5TSU9OLAotCQkJCQlvbGRJc1ByaW1hcnlFeHRlbnNpb24sIGlzUHJpbWFyeUV4dGVuc2lvbikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkFQUExJQ0FCTEVfTUVUQV9DTEFTU19JTkZPX19JU19QUklNQVJZX0VYVEVOU0lPTjoKLQkJCXJldHVybiBnZXRJc1ByaW1hcnlFeHRlbnNpb24oKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuQVBQTElDQUJMRV9NRVRBX0NMQVNTX0lORk9fX0lTX1BSSU1BUllfRVhURU5TSU9OOgotCQkJc2V0SXNQcmltYXJ5RXh0ZW5zaW9uKChCb29sZWFuKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuQVBQTElDQUJMRV9NRVRBX0NMQVNTX0lORk9fX0lTX1BSSU1BUllfRVhURU5TSU9OOgotCQkJc2V0SXNQcmltYXJ5RXh0ZW5zaW9uKElTX1BSSU1BUllfRVhURU5TSU9OX0VERUZBVUxUKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQkvL1VNQS0tPgotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IGdldEZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlKGZlYXR1cmVJRCk7Ci0JCWlmIChmZWF0dXJlICE9IG51bGwpIHsKLQkJCXJldHVybiBpc0ZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlU2V0KGZlYXR1cmUpOwotCQl9Ci0JCS8vVU1BPC0tCQkKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkFQUExJQ0FCTEVfTUVUQV9DTEFTU19JTkZPX19JU19QUklNQVJZX0VYVEVOU0lPTjoKLQkJCXJldHVybiBJU19QUklNQVJZX0VYVEVOU0lPTl9FREVGQVVMVCA9PSBudWxsID8gaXNQcmltYXJ5RXh0ZW5zaW9uICE9IG51bGwKLQkJCQkJOiAhSVNfUFJJTUFSWV9FWFRFTlNJT05fRURFRkFVTFQuZXF1YWxzKGlzUHJpbWFyeUV4dGVuc2lvbik7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKQotCQkJcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoaXNQcmltYXJ5RXh0ZW5zaW9uOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGlzUHJpbWFyeUV4dGVuc2lvbik7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL0FwcGxpY2FibGVNZXRhQ2xhc3NJbmZvSW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0FydGlmYWN0RGVzY3JpcHRpb25JbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvQXJ0aWZhY3REZXNjcmlwdGlvbkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTZjMmQ0Ny4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvQXJ0aWZhY3REZXNjcmlwdGlvbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQXJ0aWZhY3REZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5BcnRpZmFjdCBEZXNjcmlwdGlvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkFydGlmYWN0RGVzY3JpcHRpb25JbXBsI2dldEJyaWVmT3V0bGluZSA8ZW0+QnJpZWYgT3V0bGluZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkFydGlmYWN0RGVzY3JpcHRpb25JbXBsI2dldFJlcHJlc2VudGF0aW9uT3B0aW9ucyA8ZW0+UmVwcmVzZW50YXRpb24gT3B0aW9uczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkFydGlmYWN0RGVzY3JpcHRpb25JbXBsI2dldFJlcHJlc2VudGF0aW9uIDxlbT5SZXByZXNlbnRhdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkFydGlmYWN0RGVzY3JpcHRpb25JbXBsI2dldE5vdGF0aW9uIDxlbT5Ob3RhdGlvbjwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEFydGlmYWN0RGVzY3JpcHRpb25JbXBsIGV4dGVuZHMgV29ya1Byb2R1Y3REZXNjcmlwdGlvbkltcGwKLQkJaW1wbGVtZW50cyBBcnRpZmFjdERlc2NyaXB0aW9uIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRCcmllZk91dGxpbmUoKSA8ZW0+QnJpZWYgT3V0bGluZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QnJpZWZPdXRsaW5lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBCUklFRl9PVVRMSU5FX0VERUZBVUxUID0gIiI7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRCcmllZk91dGxpbmUoKSA8ZW0+QnJpZWYgT3V0bGluZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QnJpZWZPdXRsaW5lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGJyaWVmT3V0bGluZSA9IEJSSUVGX09VVExJTkVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVwcmVzZW50YXRpb25PcHRpb25zKCkgPGVtPlJlcHJlc2VudGF0aW9uIE9wdGlvbnM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJlcHJlc2VudGF0aW9uT3B0aW9ucygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVQUkVTRU5UQVRJT05fT1BUSU9OU19FREVGQVVMVCA9ICIiOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVwcmVzZW50YXRpb25PcHRpb25zKCkgPGVtPlJlcHJlc2VudGF0aW9uIE9wdGlvbnM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJlcHJlc2VudGF0aW9uT3B0aW9ucygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyByZXByZXNlbnRhdGlvbk9wdGlvbnMgPSBSRVBSRVNFTlRBVElPTl9PUFRJT05TX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlcHJlc2VudGF0aW9uKCkgPGVtPlJlcHJlc2VudGF0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZXByZXNlbnRhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVQUkVTRU5UQVRJT05fRURFRkFVTFQgPSAiIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVwcmVzZW50YXRpb24oKSA8ZW0+UmVwcmVzZW50YXRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJlcHJlc2VudGF0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHJlcHJlc2VudGF0aW9uID0gUkVQUkVTRU5UQVRJT05fRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Tm90YXRpb24oKSA8ZW0+Tm90YXRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE5vdGF0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBOT1RBVElPTl9FREVGQVVMVCA9ICIiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROb3RhdGlvbigpIDxlbT5Ob3RhdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Tm90YXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgbm90YXRpb24gPSBOT1RBVElPTl9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBBcnRpZmFjdERlc2NyaXB0aW9uSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQotCQkvL1VNQS0tPgotCQlyZWFzc2lnbkRlZmF1bHRWYWx1ZXMoKTsKLQkJLy9VTUE8LS0gIAotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5BUlRJRkFDVF9ERVNDUklQVElPTjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEJyaWVmT3V0bGluZSgpIHsKLQkJcmV0dXJuIGJyaWVmT3V0bGluZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRCcmllZk91dGxpbmUoU3RyaW5nIG5ld0JyaWVmT3V0bGluZSkgewotCQlTdHJpbmcgb2xkQnJpZWZPdXRsaW5lID0gYnJpZWZPdXRsaW5lOwotCQlicmllZk91dGxpbmUgPSBuZXdCcmllZk91dGxpbmU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuQVJUSUZBQ1RfREVTQ1JJUFRJT05fX0JSSUVGX09VVExJTkUsCi0JCQkJCW9sZEJyaWVmT3V0bGluZSwgYnJpZWZPdXRsaW5lKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRSZXByZXNlbnRhdGlvbk9wdGlvbnMoKSB7Ci0JCXJldHVybiByZXByZXNlbnRhdGlvbk9wdGlvbnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmVwcmVzZW50YXRpb25PcHRpb25zKFN0cmluZyBuZXdSZXByZXNlbnRhdGlvbk9wdGlvbnMpIHsKLQkJU3RyaW5nIG9sZFJlcHJlc2VudGF0aW9uT3B0aW9ucyA9IHJlcHJlc2VudGF0aW9uT3B0aW9uczsKLQkJcmVwcmVzZW50YXRpb25PcHRpb25zID0gbmV3UmVwcmVzZW50YXRpb25PcHRpb25zOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLkFSVElGQUNUX0RFU0NSSVBUSU9OX19SRVBSRVNFTlRBVElPTl9PUFRJT05TLAotCQkJCQlvbGRSZXByZXNlbnRhdGlvbk9wdGlvbnMsIHJlcHJlc2VudGF0aW9uT3B0aW9ucykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UmVwcmVzZW50YXRpb24oKSB7Ci0JCXJldHVybiByZXByZXNlbnRhdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZXByZXNlbnRhdGlvbihTdHJpbmcgbmV3UmVwcmVzZW50YXRpb24pIHsKLQkJU3RyaW5nIG9sZFJlcHJlc2VudGF0aW9uID0gcmVwcmVzZW50YXRpb247Ci0JCXJlcHJlc2VudGF0aW9uID0gbmV3UmVwcmVzZW50YXRpb247Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuQVJUSUZBQ1RfREVTQ1JJUFRJT05fX1JFUFJFU0VOVEFUSU9OLAotCQkJCQlvbGRSZXByZXNlbnRhdGlvbiwgcmVwcmVzZW50YXRpb24pKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5vdGF0aW9uKCkgewotCQlyZXR1cm4gbm90YXRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Tm90YXRpb24oU3RyaW5nIG5ld05vdGF0aW9uKSB7Ci0JCVN0cmluZyBvbGROb3RhdGlvbiA9IG5vdGF0aW9uOwotCQlub3RhdGlvbiA9IG5ld05vdGF0aW9uOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLkFSVElGQUNUX0RFU0NSSVBUSU9OX19OT1RBVElPTiwgb2xkTm90YXRpb24sCi0JCQkJCW5vdGF0aW9uKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuQVJUSUZBQ1RfREVTQ1JJUFRJT05fX0JSSUVGX09VVExJTkU6Ci0JCQlyZXR1cm4gZ2V0QnJpZWZPdXRsaW5lKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5BUlRJRkFDVF9ERVNDUklQVElPTl9fUkVQUkVTRU5UQVRJT05fT1BUSU9OUzoKLQkJCXJldHVybiBnZXRSZXByZXNlbnRhdGlvbk9wdGlvbnMoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkFSVElGQUNUX0RFU0NSSVBUSU9OX19SRVBSRVNFTlRBVElPTjoKLQkJCXJldHVybiBnZXRSZXByZXNlbnRhdGlvbigpOwotCQljYXNlIFVtYVBhY2thZ2UuQVJUSUZBQ1RfREVTQ1JJUFRJT05fX05PVEFUSU9OOgotCQkJcmV0dXJuIGdldE5vdGF0aW9uKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkFSVElGQUNUX0RFU0NSSVBUSU9OX19CUklFRl9PVVRMSU5FOgotCQkJc2V0QnJpZWZPdXRsaW5lKChTdHJpbmcpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkFSVElGQUNUX0RFU0NSSVBUSU9OX19SRVBSRVNFTlRBVElPTl9PUFRJT05TOgotCQkJc2V0UmVwcmVzZW50YXRpb25PcHRpb25zKChTdHJpbmcpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkFSVElGQUNUX0RFU0NSSVBUSU9OX19SRVBSRVNFTlRBVElPTjoKLQkJCXNldFJlcHJlc2VudGF0aW9uKChTdHJpbmcpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkFSVElGQUNUX0RFU0NSSVBUSU9OX19OT1RBVElPTjoKLQkJCXNldE5vdGF0aW9uKChTdHJpbmcpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5BUlRJRkFDVF9ERVNDUklQVElPTl9fQlJJRUZfT1VUTElORToKLQkJCXNldEJyaWVmT3V0bGluZShCUklFRl9PVVRMSU5FX0VERUZBVUxUKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkFSVElGQUNUX0RFU0NSSVBUSU9OX19SRVBSRVNFTlRBVElPTl9PUFRJT05TOgotCQkJc2V0UmVwcmVzZW50YXRpb25PcHRpb25zKFJFUFJFU0VOVEFUSU9OX09QVElPTlNfRURFRkFVTFQpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuQVJUSUZBQ1RfREVTQ1JJUFRJT05fX1JFUFJFU0VOVEFUSU9OOgotCQkJc2V0UmVwcmVzZW50YXRpb24oUkVQUkVTRU5UQVRJT05fRURFRkFVTFQpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuQVJUSUZBQ1RfREVTQ1JJUFRJT05fX05PVEFUSU9OOgotCQkJc2V0Tm90YXRpb24oTk9UQVRJT05fRURFRkFVTFQpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCS8vVU1BLS0+Ci0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gZ2V0RmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWUoZmVhdHVyZUlEKTsKLQkJaWYgKGZlYXR1cmUgIT0gbnVsbCkgewotCQkJcmV0dXJuIGlzRmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWVTZXQoZmVhdHVyZSk7Ci0JCX0KLQkJLy9VTUE8LS0JCQotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuQVJUSUZBQ1RfREVTQ1JJUFRJT05fX0JSSUVGX09VVExJTkU6Ci0JCQlyZXR1cm4gQlJJRUZfT1VUTElORV9FREVGQVVMVCA9PSBudWxsID8gYnJpZWZPdXRsaW5lICE9IG51bGwKLQkJCQkJOiAhQlJJRUZfT1VUTElORV9FREVGQVVMVC5lcXVhbHMoYnJpZWZPdXRsaW5lKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkFSVElGQUNUX0RFU0NSSVBUSU9OX19SRVBSRVNFTlRBVElPTl9PUFRJT05TOgotCQkJcmV0dXJuIFJFUFJFU0VOVEFUSU9OX09QVElPTlNfRURFRkFVTFQgPT0gbnVsbCA/IHJlcHJlc2VudGF0aW9uT3B0aW9ucyAhPSBudWxsCi0JCQkJCTogIVJFUFJFU0VOVEFUSU9OX09QVElPTlNfRURFRkFVTFQKLQkJCQkJCQkuZXF1YWxzKHJlcHJlc2VudGF0aW9uT3B0aW9ucyk7Ci0JCWNhc2UgVW1hUGFja2FnZS5BUlRJRkFDVF9ERVNDUklQVElPTl9fUkVQUkVTRU5UQVRJT046Ci0JCQlyZXR1cm4gUkVQUkVTRU5UQVRJT05fRURFRkFVTFQgPT0gbnVsbCA/IHJlcHJlc2VudGF0aW9uICE9IG51bGwKLQkJCQkJOiAhUkVQUkVTRU5UQVRJT05fRURFRkFVTFQuZXF1YWxzKHJlcHJlc2VudGF0aW9uKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkFSVElGQUNUX0RFU0NSSVBUSU9OX19OT1RBVElPTjoKLQkJCXJldHVybiBOT1RBVElPTl9FREVGQVVMVCA9PSBudWxsID8gbm90YXRpb24gIT0gbnVsbAotCQkJCQk6ICFOT1RBVElPTl9FREVGQVVMVC5lcXVhbHMobm90YXRpb24pOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkKLQkJCXJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGJyaWVmT3V0bGluZTogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChicmllZk91dGxpbmUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHJlcHJlc2VudGF0aW9uT3B0aW9uczogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChyZXByZXNlbnRhdGlvbk9wdGlvbnMpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHJlcHJlc2VudGF0aW9uOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKHJlcHJlc2VudGF0aW9uKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBub3RhdGlvbjogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChub3RhdGlvbik7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL0FydGlmYWN0RGVzY3JpcHRpb25JbXBsCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvQXJ0aWZhY3RJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvQXJ0aWZhY3RJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiZTAzNDYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0FydGlmYWN0SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjk2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRXaXRoSW52ZXJzZUVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQXJ0aWZhY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+QXJ0aWZhY3Q8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5BcnRpZmFjdEltcGwjZ2V0Q29udGFpbmVyQXJ0aWZhY3QgPGVtPkNvbnRhaW5lciBBcnRpZmFjdDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkFydGlmYWN0SW1wbCNnZXRDb250YWluZWRBcnRpZmFjdHMgPGVtPkNvbnRhaW5lZCBBcnRpZmFjdHM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBBcnRpZmFjdEltcGwgZXh0ZW5kcyBXb3JrUHJvZHVjdEltcGwgaW1wbGVtZW50cyBBcnRpZmFjdCB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb250YWluZWRBcnRpZmFjdHMoKSA8ZW0+Q29udGFpbmVkIEFydGlmYWN0czwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDb250YWluZWRBcnRpZmFjdHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxBcnRpZmFjdD4gY29udGFpbmVkQXJ0aWZhY3RzOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEFydGlmYWN0SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQotCQkvL1VNQS0tPgotCQlyZWFzc2lnbkRlZmF1bHRWYWx1ZXMoKTsKLQkJLy9VTUE8LS0gIAotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5BUlRJRkFDVDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQXJ0aWZhY3QgZ2V0Q29udGFpbmVyQXJ0aWZhY3QoKSB7Ci0JCWlmIChlQ29udGFpbmVyRmVhdHVyZUlEICE9IFVtYVBhY2thZ2UuQVJUSUZBQ1RfX0NPTlRBSU5FUl9BUlRJRkFDVCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gKEFydGlmYWN0KSBlQ29udGFpbmVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFydGlmYWN0IGJhc2ljR2V0Q29udGFpbmVyQXJ0aWZhY3QoKSB7Ci0JCWlmIChlQ29udGFpbmVyRmVhdHVyZUlEICE9IFVtYVBhY2thZ2UuQVJUSUZBQ1RfX0NPTlRBSU5FUl9BUlRJRkFDVCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gKEFydGlmYWN0KSBlSW50ZXJuYWxDb250YWluZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRDb250YWluZXJBcnRpZmFjdCgKLQkJCUFydGlmYWN0IG5ld0NvbnRhaW5lckFydGlmYWN0LCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCW1zZ3MgPSBlQmFzaWNTZXRDb250YWluZXIoKEludGVybmFsRU9iamVjdCkgbmV3Q29udGFpbmVyQXJ0aWZhY3QsCi0JCQkJVW1hUGFja2FnZS5BUlRJRkFDVF9fQ09OVEFJTkVSX0FSVElGQUNULCBtc2dzKTsKLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29udGFpbmVyQXJ0aWZhY3QoQXJ0aWZhY3QgbmV3Q29udGFpbmVyQXJ0aWZhY3QpIHsKLQkJaWYgKG5ld0NvbnRhaW5lckFydGlmYWN0ICE9IGVJbnRlcm5hbENvbnRhaW5lcigpCi0JCQkJfHwgKGVDb250YWluZXJGZWF0dXJlSUQgIT0gVW1hUGFja2FnZS5BUlRJRkFDVF9fQ09OVEFJTkVSX0FSVElGQUNUICYmIG5ld0NvbnRhaW5lckFydGlmYWN0ICE9IG51bGwpKSB7Ci0JCQlpZiAoRWNvcmVVdGlsLmlzQW5jZXN0b3IodGhpcywgKEVPYmplY3QpIG5ld0NvbnRhaW5lckFydGlmYWN0KSkKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAotCQkJCQkJIlJlY3Vyc2l2ZSBjb250YWlubWVudCBub3QgYWxsb3dlZCBmb3IgIiArIHRvU3RyaW5nKCkpOyAvLyROT04tTkxTLTEkCi0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChlSW50ZXJuYWxDb250YWluZXIoKSAhPSBudWxsKQotCQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJaWYgKG5ld0NvbnRhaW5lckFydGlmYWN0ICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KSBuZXdDb250YWluZXJBcnRpZmFjdCkuZUludmVyc2VBZGQoCi0JCQkJCQl0aGlzLCBVbWFQYWNrYWdlLkFSVElGQUNUX19DT05UQUlORURfQVJUSUZBQ1RTLAotCQkJCQkJQXJ0aWZhY3QuY2xhc3MsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0Q29udGFpbmVyQXJ0aWZhY3QobmV3Q29udGFpbmVyQXJ0aWZhY3QsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkKLQkJCQltc2dzLmRpc3BhdGNoKCk7Ci0JCX0gZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLkFSVElGQUNUX19DT05UQUlORVJfQVJUSUZBQ1QsCi0JCQkJCW5ld0NvbnRhaW5lckFydGlmYWN0LCBuZXdDb250YWluZXJBcnRpZmFjdCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0PEFydGlmYWN0PiBnZXRDb250YWluZWRBcnRpZmFjdHMoKSB7Ci0JCWlmIChjb250YWluZWRBcnRpZmFjdHMgPT0gbnVsbCkgewotCQkJY29udGFpbmVkQXJ0aWZhY3RzID0gbmV3IEVPYmplY3RDb250YWlubWVudFdpdGhJbnZlcnNlRUxpc3QuUmVzb2x2aW5nPEFydGlmYWN0PigKLQkJCQkJQXJ0aWZhY3QuY2xhc3MsIHRoaXMsCi0JCQkJCVVtYVBhY2thZ2UuQVJUSUZBQ1RfX0NPTlRBSU5FRF9BUlRJRkFDVFMsCi0JCQkJCVVtYVBhY2thZ2UuQVJUSUZBQ1RfX0NPTlRBSU5FUl9BUlRJRkFDVCk7Ci0JCX0KLQkJcmV0dXJuIGNvbnRhaW5lZEFydGlmYWN0czsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VBZGQoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLAotCQkJaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuQVJUSUZBQ1RfX0NPTlRBSU5FUl9BUlRJRkFDVDoKLQkJCWlmIChlSW50ZXJuYWxDb250YWluZXIoKSAhPSBudWxsKQotCQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJcmV0dXJuIGJhc2ljU2V0Q29udGFpbmVyQXJ0aWZhY3QoKEFydGlmYWN0KSBvdGhlckVuZCwgbXNncyk7Ci0JCWNhc2UgVW1hUGFja2FnZS5BUlRJRkFDVF9fQ09OVEFJTkVEX0FSVElGQUNUUzoKLQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8SW50ZXJuYWxFT2JqZWN0PikgKEludGVybmFsRUxpc3Q8Pz4pIGdldENvbnRhaW5lZEFydGlmYWN0cygpKQotCQkJCQkuYmFzaWNBZGQob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZUFkZChvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLAotCQkJaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuQVJUSUZBQ1RfX0NPTlRBSU5FUl9BUlRJRkFDVDoKLQkJCXJldHVybiBiYXNpY1NldENvbnRhaW5lckFydGlmYWN0KG51bGwsIG1zZ3MpOwotCQljYXNlIFVtYVBhY2thZ2UuQVJUSUZBQ1RfX0NPTlRBSU5FRF9BUlRJRkFDVFM6Ci0JCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KSBnZXRDb250YWluZWRBcnRpZmFjdHMoKSkuYmFzaWNSZW1vdmUoCi0JCQkJCW90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVCYXNpY1JlbW92ZUZyb21Db250YWluZXJGZWF0dXJlKAotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGVDb250YWluZXJGZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkFSVElGQUNUX19DT05UQUlORVJfQVJUSUZBQ1Q6Ci0JCQlyZXR1cm4gZUludGVybmFsQ29udGFpbmVyKCkuZUludmVyc2VSZW1vdmUodGhpcywKLQkJCQkJVW1hUGFja2FnZS5BUlRJRkFDVF9fQ09OVEFJTkVEX0FSVElGQUNUUywgQXJ0aWZhY3QuY2xhc3MsCi0JCQkJCW1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyRmVhdHVyZShtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5BUlRJRkFDVF9fQ09OVEFJTkVSX0FSVElGQUNUOgotCQkJaWYgKHJlc29sdmUpCi0JCQkJcmV0dXJuIGdldENvbnRhaW5lckFydGlmYWN0KCk7Ci0JCQlyZXR1cm4gYmFzaWNHZXRDb250YWluZXJBcnRpZmFjdCgpOwotCQljYXNlIFVtYVBhY2thZ2UuQVJUSUZBQ1RfX0NPTlRBSU5FRF9BUlRJRkFDVFM6Ci0JCQlyZXR1cm4gZ2V0Q29udGFpbmVkQXJ0aWZhY3RzKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkFSVElGQUNUX19DT05UQUlORVJfQVJUSUZBQ1Q6Ci0JCQlzZXRDb250YWluZXJBcnRpZmFjdCgoQXJ0aWZhY3QpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkFSVElGQUNUX19DT05UQUlORURfQVJUSUZBQ1RTOgotCQkJZ2V0Q29udGFpbmVkQXJ0aWZhY3RzKCkuY2xlYXIoKTsKLQkJCWdldENvbnRhaW5lZEFydGlmYWN0cygpLmFkZEFsbCgKLQkJCQkJKENvbGxlY3Rpb248PyBleHRlbmRzIEFydGlmYWN0PikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkFSVElGQUNUX19DT05UQUlORVJfQVJUSUZBQ1Q6Ci0JCQlzZXRDb250YWluZXJBcnRpZmFjdCgoQXJ0aWZhY3QpIG51bGwpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuQVJUSUZBQ1RfX0NPTlRBSU5FRF9BUlRJRkFDVFM6Ci0JCQlnZXRDb250YWluZWRBcnRpZmFjdHMoKS5jbGVhcigpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCS8vVU1BLS0+Ci0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gZ2V0RmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWUoZmVhdHVyZUlEKTsKLQkJaWYgKGZlYXR1cmUgIT0gbnVsbCkgewotCQkJcmV0dXJuIGlzRmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWVTZXQoZmVhdHVyZSk7Ci0JCX0KLQkJLy9VTUE8LS0JCQotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuQVJUSUZBQ1RfX0NPTlRBSU5FUl9BUlRJRkFDVDoKLQkJCXJldHVybiBiYXNpY0dldENvbnRhaW5lckFydGlmYWN0KCkgIT0gbnVsbDsKLQkJY2FzZSBVbWFQYWNrYWdlLkFSVElGQUNUX19DT05UQUlORURfQVJUSUZBQ1RTOgotCQkJcmV0dXJuIGNvbnRhaW5lZEFydGlmYWN0cyAhPSBudWxsICYmICFjb250YWluZWRBcnRpZmFjdHMuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLX0gLy9BcnRpZmFjdEltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9CcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb25JbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMjM0OWU5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9CcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb25JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5CcmVha2Rvd24gRWxlbWVudCBEZXNjcmlwdGlvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbkltcGwjZ2V0VXNhZ2VHdWlkYW5jZSA8ZW0+VXNhZ2UgR3VpZGFuY2U8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb25JbXBsIGV4dGVuZHMgQ29udGVudERlc2NyaXB0aW9uSW1wbAotCQlpbXBsZW1lbnRzIEJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbiB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VXNhZ2VHdWlkYW5jZSgpIDxlbT5Vc2FnZSBHdWlkYW5jZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VXNhZ2VHdWlkYW5jZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVNBR0VfR1VJREFOQ0VfRURFRkFVTFQgPSAiIjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFVzYWdlR3VpZGFuY2UoKSA8ZW0+VXNhZ2UgR3VpZGFuY2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFVzYWdlR3VpZGFuY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgdXNhZ2VHdWlkYW5jZSA9IFVTQUdFX0dVSURBTkNFX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbkltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJLy9VTUEtLT4KLQkJcmVhc3NpZ25EZWZhdWx0VmFsdWVzKCk7Ci0JCS8vVU1BPC0tICAKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT047Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRVc2FnZUd1aWRhbmNlKCkgewotCQlyZXR1cm4gdXNhZ2VHdWlkYW5jZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRVc2FnZUd1aWRhbmNlKFN0cmluZyBuZXdVc2FnZUd1aWRhbmNlKSB7Ci0JCVN0cmluZyBvbGRVc2FnZUd1aWRhbmNlID0gdXNhZ2VHdWlkYW5jZTsKLQkJdXNhZ2VHdWlkYW5jZSA9IG5ld1VzYWdlR3VpZGFuY2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX1VTQUdFX0dVSURBTkNFLAotCQkJCQlvbGRVc2FnZUd1aWRhbmNlLCB1c2FnZUd1aWRhbmNlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX1VTQUdFX0dVSURBTkNFOgotCQkJcmV0dXJuIGdldFVzYWdlR3VpZGFuY2UoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX1VTQUdFX0dVSURBTkNFOgotCQkJc2V0VXNhZ2VHdWlkYW5jZSgoU3RyaW5nKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX1VTQUdFX0dVSURBTkNFOgotCQkJc2V0VXNhZ2VHdWlkYW5jZShVU0FHRV9HVUlEQU5DRV9FREVGQVVMVCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJLy9VTUEtLT4KLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBnZXRGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZShmZWF0dXJlSUQpOwotCQlpZiAoZmVhdHVyZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gaXNGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZVNldChmZWF0dXJlKTsKLQkJfQotCQkvL1VNQTwtLQkJCi0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fVVNBR0VfR1VJREFOQ0U6Ci0JCQlyZXR1cm4gVVNBR0VfR1VJREFOQ0VfRURFRkFVTFQgPT0gbnVsbCA/IHVzYWdlR3VpZGFuY2UgIT0gbnVsbAotCQkJCQk6ICFVU0FHRV9HVUlEQU5DRV9FREVGQVVMVC5lcXVhbHModXNhZ2VHdWlkYW5jZSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKQotCQkJcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAodXNhZ2VHdWlkYW5jZTogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZCh1c2FnZUd1aWRhbmNlKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uSW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0JyZWFrZG93bkVsZW1lbnRJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvQnJlYWtkb3duRWxlbWVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTI4NDljMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvQnJlYWtkb3duRWxlbWVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMTkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0UmVzb2x2aW5nRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DaGVja2xpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db25jZXB0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRXhhbXBsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkd1aWRlbGluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlBsYW5uaW5nRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJlcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJldXNhYmxlQXNzZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5TdXBwb3J0aW5nTWF0ZXJpYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZW1wbGF0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRvb2xNZW50b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+QnJlYWtkb3duIEVsZW1lbnQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5CcmVha2Rvd25FbGVtZW50SW1wbCNnZXRQcmVmaXggPGVtPlByZWZpeDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkJyZWFrZG93bkVsZW1lbnRJbXBsI2dldElzUGxhbm5lZCA8ZW0+SXMgUGxhbm5lZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkJyZWFrZG93bkVsZW1lbnRJbXBsI2dldEhhc011bHRpcGxlT2NjdXJyZW5jZXMgPGVtPkhhcyBNdWx0aXBsZSBPY2N1cnJlbmNlczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkJyZWFrZG93bkVsZW1lbnRJbXBsI2dldElzT3B0aW9uYWwgPGVtPklzIE9wdGlvbmFsPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQnJlYWtkb3duRWxlbWVudEltcGwjZ2V0UHJlc2VudGVkQWZ0ZXIgPGVtPlByZXNlbnRlZCBBZnRlcjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkJyZWFrZG93bkVsZW1lbnRJbXBsI2dldFByZXNlbnRlZEJlZm9yZSA8ZW0+UHJlc2VudGVkIEJlZm9yZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkJyZWFrZG93bkVsZW1lbnRJbXBsI2dldFBsYW5uaW5nRGF0YSA8ZW0+UGxhbm5pbmcgRGF0YTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkJyZWFrZG93bkVsZW1lbnRJbXBsI2dldFN1cGVyQWN0aXZpdGllcyA8ZW0+U3VwZXIgQWN0aXZpdGllczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkJyZWFrZG93bkVsZW1lbnRJbXBsI2dldENoZWNrbGlzdHMgPGVtPkNoZWNrbGlzdHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5CcmVha2Rvd25FbGVtZW50SW1wbCNnZXRDb25jZXB0cyA8ZW0+Q29uY2VwdHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5CcmVha2Rvd25FbGVtZW50SW1wbCNnZXRFeGFtcGxlcyA8ZW0+RXhhbXBsZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5CcmVha2Rvd25FbGVtZW50SW1wbCNnZXRHdWlkZWxpbmVzIDxlbT5HdWlkZWxpbmVzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQnJlYWtkb3duRWxlbWVudEltcGwjZ2V0UmV1c2FibGVBc3NldHMgPGVtPlJldXNhYmxlIEFzc2V0czwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkJyZWFrZG93bkVsZW1lbnRJbXBsI2dldFN1cHBvcnRpbmdNYXRlcmlhbHMgPGVtPlN1cHBvcnRpbmcgTWF0ZXJpYWxzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQnJlYWtkb3duRWxlbWVudEltcGwjZ2V0VGVtcGxhdGVzIDxlbT5UZW1wbGF0ZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5CcmVha2Rvd25FbGVtZW50SW1wbCNnZXRSZXBvcnRzIDxlbT5SZXBvcnRzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQnJlYWtkb3duRWxlbWVudEltcGwjZ2V0RXN0aW1hdGlvbmNvbnNpZGVyYXRpb25zIDxlbT5Fc3RpbWF0aW9uY29uc2lkZXJhdGlvbnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5CcmVha2Rvd25FbGVtZW50SW1wbCNnZXRUb29sbWVudG9yIDxlbT5Ub29sbWVudG9yPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQnJlYWtkb3duRWxlbWVudEltcGwgZXh0ZW5kcyBQcm9jZXNzRWxlbWVudEltcGwgaW1wbGVtZW50cwotCQlCcmVha2Rvd25FbGVtZW50IHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQcmVmaXgoKSA8ZW0+UHJlZml4PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQcmVmaXgoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZJWF9FREVGQVVMVCA9ICIiOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJlZml4KCkgPGVtPlByZWZpeDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UHJlZml4KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHByZWZpeCA9IFBSRUZJWF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJc1BsYW5uZWQoKSA8ZW0+SXMgUGxhbm5lZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SXNQbGFubmVkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJvb2xlYW4gSVNfUExBTk5FRF9FREVGQVVMVCA9IEJvb2xlYW4uVFJVRTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElzUGxhbm5lZCgpIDxlbT5JcyBQbGFubmVkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJc1BsYW5uZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCb29sZWFuIGlzUGxhbm5lZCA9IElTX1BMQU5ORURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SGFzTXVsdGlwbGVPY2N1cnJlbmNlcygpIDxlbT5IYXMgTXVsdGlwbGUgT2NjdXJyZW5jZXM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEhhc011bHRpcGxlT2NjdXJyZW5jZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQm9vbGVhbiBIQVNfTVVMVElQTEVfT0NDVVJSRU5DRVNfRURFRkFVTFQgPSBCb29sZWFuLkZBTFNFOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SGFzTXVsdGlwbGVPY2N1cnJlbmNlcygpIDxlbT5IYXMgTXVsdGlwbGUgT2NjdXJyZW5jZXM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEhhc011bHRpcGxlT2NjdXJyZW5jZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCb29sZWFuIGhhc011bHRpcGxlT2NjdXJyZW5jZXMgPSBIQVNfTVVMVElQTEVfT0NDVVJSRU5DRVNfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SXNPcHRpb25hbCgpIDxlbT5JcyBPcHRpb25hbDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SXNPcHRpb25hbCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCb29sZWFuIElTX09QVElPTkFMX0VERUZBVUxUID0gQm9vbGVhbi5GQUxTRTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElzT3B0aW9uYWwoKSA8ZW0+SXMgT3B0aW9uYWw8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldElzT3B0aW9uYWwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCb29sZWFuIGlzT3B0aW9uYWwgPSBJU19PUFRJT05BTF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByZXNlbnRlZEFmdGVyKCkgPGVtPlByZXNlbnRlZCBBZnRlcjwvZW0+fScgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UHJlc2VudGVkQWZ0ZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCcmVha2Rvd25FbGVtZW50IHByZXNlbnRlZEFmdGVyOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJlc2VudGVkQmVmb3JlKCkgPGVtPlByZXNlbnRlZCBCZWZvcmU8L2VtPn0nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFByZXNlbnRlZEJlZm9yZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJyZWFrZG93bkVsZW1lbnQgcHJlc2VudGVkQmVmb3JlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UGxhbm5pbmdEYXRhKCkgPGVtPlBsYW5uaW5nIERhdGE8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFBsYW5uaW5nRGF0YSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFBsYW5uaW5nRGF0YSBwbGFubmluZ0RhdGE7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTdXBlckFjdGl2aXRpZXMoKSA8ZW0+U3VwZXIgQWN0aXZpdGllczwvZW0+fScgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U3VwZXJBY3Rpdml0aWVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQWN0aXZpdHkgc3VwZXJBY3Rpdml0aWVzOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q2hlY2tsaXN0cygpIDxlbT5DaGVja2xpc3RzPC9lbT59JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENoZWNrbGlzdHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxDaGVja2xpc3Q+IGNoZWNrbGlzdHM7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb25jZXB0cygpIDxlbT5Db25jZXB0czwvZW0+fScgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDb25jZXB0cygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PENvbmNlcHQ+IGNvbmNlcHRzOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RXhhbXBsZXMoKSA8ZW0+RXhhbXBsZXM8L2VtPn0nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RXhhbXBsZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxFeGFtcGxlPiBleGFtcGxlczsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEd1aWRlbGluZXMoKSA8ZW0+R3VpZGVsaW5lczwvZW0+fScgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRHdWlkZWxpbmVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8R3VpZGVsaW5lPiBndWlkZWxpbmVzOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmV1c2FibGVBc3NldHMoKSA8ZW0+UmV1c2FibGUgQXNzZXRzPC9lbT59JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJldXNhYmxlQXNzZXRzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8UmV1c2FibGVBc3NldD4gcmV1c2FibGVBc3NldHM7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTdXBwb3J0aW5nTWF0ZXJpYWxzKCkgPGVtPlN1cHBvcnRpbmcgTWF0ZXJpYWxzPC9lbT59JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFN1cHBvcnRpbmdNYXRlcmlhbHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxTdXBwb3J0aW5nTWF0ZXJpYWw+IHN1cHBvcnRpbmdNYXRlcmlhbHM7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUZW1wbGF0ZXMoKSA8ZW0+VGVtcGxhdGVzPC9lbT59JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFRlbXBsYXRlcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PFRlbXBsYXRlPiB0ZW1wbGF0ZXM7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZXBvcnRzKCkgPGVtPlJlcG9ydHM8L2VtPn0nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmVwb3J0cygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PFJlcG9ydD4gcmVwb3J0czsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEVzdGltYXRpb25jb25zaWRlcmF0aW9ucygpIDxlbT5Fc3RpbWF0aW9uY29uc2lkZXJhdGlvbnM8L2VtPn0nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RXN0aW1hdGlvbmNvbnNpZGVyYXRpb25zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8RXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zPiBlc3RpbWF0aW9uY29uc2lkZXJhdGlvbnM7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUb29sbWVudG9yKCkgPGVtPlRvb2xtZW50b3I8L2VtPn0nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VG9vbG1lbnRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PFRvb2xNZW50b3I+IHRvb2xtZW50b3I7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQnJlYWtkb3duRWxlbWVudEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJLy9VTUEtLT4KLQkJcmVhc3NpZ25EZWZhdWx0VmFsdWVzKCk7Ci0JCS8vVU1BPC0tICAKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuQlJFQUtET1dOX0VMRU1FTlQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQcmVmaXgoKSB7Ci0JCXJldHVybiBwcmVmaXg7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHJlZml4KFN0cmluZyBuZXdQcmVmaXgpIHsKLQkJU3RyaW5nIG9sZFByZWZpeCA9IHByZWZpeDsKLQkJcHJlZml4ID0gbmV3UHJlZml4OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19QUkVGSVgsIG9sZFByZWZpeCwgcHJlZml4KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJvb2xlYW4gZ2V0SXNQbGFubmVkKCkgewotCQlyZXR1cm4gaXNQbGFubmVkOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldElzUGxhbm5lZChCb29sZWFuIG5ld0lzUGxhbm5lZCkgewotCQlCb29sZWFuIG9sZElzUGxhbm5lZCA9IGlzUGxhbm5lZDsKLQkJaXNQbGFubmVkID0gbmV3SXNQbGFubmVkOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19JU19QTEFOTkVELCBvbGRJc1BsYW5uZWQsCi0JCQkJCWlzUGxhbm5lZCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCb29sZWFuIGdldEhhc011bHRpcGxlT2NjdXJyZW5jZXMoKSB7Ci0JCXJldHVybiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEhhc011bHRpcGxlT2NjdXJyZW5jZXMoQm9vbGVhbiBuZXdIYXNNdWx0aXBsZU9jY3VycmVuY2VzKSB7Ci0JCUJvb2xlYW4gb2xkSGFzTXVsdGlwbGVPY2N1cnJlbmNlcyA9IGhhc011bHRpcGxlT2NjdXJyZW5jZXM7Ci0JCWhhc011bHRpcGxlT2NjdXJyZW5jZXMgPSBuZXdIYXNNdWx0aXBsZU9jY3VycmVuY2VzOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19IQVNfTVVMVElQTEVfT0NDVVJSRU5DRVMsCi0JCQkJCW9sZEhhc011bHRpcGxlT2NjdXJyZW5jZXMsIGhhc011bHRpcGxlT2NjdXJyZW5jZXMpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQm9vbGVhbiBnZXRJc09wdGlvbmFsKCkgewotCQlyZXR1cm4gaXNPcHRpb25hbDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJc09wdGlvbmFsKEJvb2xlYW4gbmV3SXNPcHRpb25hbCkgewotCQlCb29sZWFuIG9sZElzT3B0aW9uYWwgPSBpc09wdGlvbmFsOwotCQlpc09wdGlvbmFsID0gbmV3SXNPcHRpb25hbDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fSVNfT1BUSU9OQUwsIG9sZElzT3B0aW9uYWwsCi0JCQkJCWlzT3B0aW9uYWwpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQnJlYWtkb3duRWxlbWVudCBnZXRQcmVzZW50ZWRBZnRlcigpIHsKLQkJaWYgKHByZXNlbnRlZEFmdGVyICE9IG51bGwgJiYgKChFT2JqZWN0KSBwcmVzZW50ZWRBZnRlcikuZUlzUHJveHkoKSkgewotCQkJSW50ZXJuYWxFT2JqZWN0IG9sZFByZXNlbnRlZEFmdGVyID0gKEludGVybmFsRU9iamVjdCkgcHJlc2VudGVkQWZ0ZXI7Ci0JCQlwcmVzZW50ZWRBZnRlciA9IChCcmVha2Rvd25FbGVtZW50KSBlUmVzb2x2ZVByb3h5KG9sZFByZXNlbnRlZEFmdGVyKTsKLQkJCWlmIChwcmVzZW50ZWRBZnRlciAhPSBvbGRQcmVzZW50ZWRBZnRlcikgewotCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlJFU09MVkUsCi0JCQkJCQkJVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fUFJFU0VOVEVEX0FGVEVSLAotCQkJCQkJCW9sZFByZXNlbnRlZEFmdGVyLCBwcmVzZW50ZWRBZnRlcikpOwotCQkJfQotCQl9Ci0JCXJldHVybiBwcmVzZW50ZWRBZnRlcjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQnJlYWtkb3duRWxlbWVudCBiYXNpY0dldFByZXNlbnRlZEFmdGVyKCkgewotCQlyZXR1cm4gcHJlc2VudGVkQWZ0ZXI7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHJlc2VudGVkQWZ0ZXIoQnJlYWtkb3duRWxlbWVudCBuZXdQcmVzZW50ZWRBZnRlcikgewotCQlCcmVha2Rvd25FbGVtZW50IG9sZFByZXNlbnRlZEFmdGVyID0gcHJlc2VudGVkQWZ0ZXI7Ci0JCXByZXNlbnRlZEFmdGVyID0gbmV3UHJlc2VudGVkQWZ0ZXI7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX1BSRVNFTlRFRF9BRlRFUiwKLQkJCQkJb2xkUHJlc2VudGVkQWZ0ZXIsIHByZXNlbnRlZEFmdGVyKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJyZWFrZG93bkVsZW1lbnQgZ2V0UHJlc2VudGVkQmVmb3JlKCkgewotCQlpZiAocHJlc2VudGVkQmVmb3JlICE9IG51bGwgJiYgKChFT2JqZWN0KSBwcmVzZW50ZWRCZWZvcmUpLmVJc1Byb3h5KCkpIHsKLQkJCUludGVybmFsRU9iamVjdCBvbGRQcmVzZW50ZWRCZWZvcmUgPSAoSW50ZXJuYWxFT2JqZWN0KSBwcmVzZW50ZWRCZWZvcmU7Ci0JCQlwcmVzZW50ZWRCZWZvcmUgPSAoQnJlYWtkb3duRWxlbWVudCkgZVJlc29sdmVQcm94eShvbGRQcmVzZW50ZWRCZWZvcmUpOwotCQkJaWYgKHByZXNlbnRlZEJlZm9yZSAhPSBvbGRQcmVzZW50ZWRCZWZvcmUpIHsKLQkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLAotCQkJCQkJCVVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX1BSRVNFTlRFRF9CRUZPUkUsCi0JCQkJCQkJb2xkUHJlc2VudGVkQmVmb3JlLCBwcmVzZW50ZWRCZWZvcmUpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcHJlc2VudGVkQmVmb3JlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCcmVha2Rvd25FbGVtZW50IGJhc2ljR2V0UHJlc2VudGVkQmVmb3JlKCkgewotCQlyZXR1cm4gcHJlc2VudGVkQmVmb3JlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFByZXNlbnRlZEJlZm9yZShCcmVha2Rvd25FbGVtZW50IG5ld1ByZXNlbnRlZEJlZm9yZSkgewotCQlCcmVha2Rvd25FbGVtZW50IG9sZFByZXNlbnRlZEJlZm9yZSA9IHByZXNlbnRlZEJlZm9yZTsKLQkJcHJlc2VudGVkQmVmb3JlID0gbmV3UHJlc2VudGVkQmVmb3JlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19QUkVTRU5URURfQkVGT1JFLAotCQkJCQlvbGRQcmVzZW50ZWRCZWZvcmUsIHByZXNlbnRlZEJlZm9yZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQbGFubmluZ0RhdGEgZ2V0UGxhbm5pbmdEYXRhKCkgewotCQlpZiAocGxhbm5pbmdEYXRhICE9IG51bGwgJiYgKChFT2JqZWN0KSBwbGFubmluZ0RhdGEpLmVJc1Byb3h5KCkpIHsKLQkJCUludGVybmFsRU9iamVjdCBvbGRQbGFubmluZ0RhdGEgPSAoSW50ZXJuYWxFT2JqZWN0KSBwbGFubmluZ0RhdGE7Ci0JCQlwbGFubmluZ0RhdGEgPSAoUGxhbm5pbmdEYXRhKSBlUmVzb2x2ZVByb3h5KG9sZFBsYW5uaW5nRGF0YSk7Ci0JCQlpZiAocGxhbm5pbmdEYXRhICE9IG9sZFBsYW5uaW5nRGF0YSkgewotCQkJCUludGVybmFsRU9iamVjdCBuZXdQbGFubmluZ0RhdGEgPSAoSW50ZXJuYWxFT2JqZWN0KSBwbGFubmluZ0RhdGE7Ci0JCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG9sZFBsYW5uaW5nRGF0YS5lSW52ZXJzZVJlbW92ZSh0aGlzLAotCQkJCQkJRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRQotCQkJCQkJCQktIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX1BMQU5OSU5HX0RBVEEsCi0JCQkJCQludWxsLCBudWxsKTsKLQkJCQlpZiAobmV3UGxhbm5pbmdEYXRhLmVJbnRlcm5hbENvbnRhaW5lcigpID09IG51bGwpIHsKLQkJCQkJbXNncyA9IG5ld1BsYW5uaW5nRGF0YQotCQkJCQkJCS5lSW52ZXJzZUFkZCgKLQkJCQkJCQkJCXRoaXMsCi0JCQkJCQkJCQlFT1BQT1NJVEVfRkVBVFVSRV9CQVNFCi0JCQkJCQkJCQkJCS0gVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fUExBTk5JTkdfREFUQSwKLQkJCQkJCQkJCW51bGwsIG1zZ3MpOwotCQkJCX0KLQkJCQlpZiAobXNncyAhPSBudWxsKQotCQkJCQltc2dzLmRpc3BhdGNoKCk7Ci0JCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwKLQkJCQkJCQlVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19QTEFOTklOR19EQVRBLAotCQkJCQkJCW9sZFBsYW5uaW5nRGF0YSwgcGxhbm5pbmdEYXRhKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHBsYW5uaW5nRGF0YTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUGxhbm5pbmdEYXRhIGJhc2ljR2V0UGxhbm5pbmdEYXRhKCkgewotCQlyZXR1cm4gcGxhbm5pbmdEYXRhOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldFBsYW5uaW5nRGF0YShQbGFubmluZ0RhdGEgbmV3UGxhbm5pbmdEYXRhLAotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlQbGFubmluZ0RhdGEgb2xkUGxhbm5pbmdEYXRhID0gcGxhbm5pbmdEYXRhOwotCQlwbGFubmluZ0RhdGEgPSBuZXdQbGFubmluZ0RhdGE7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsCi0JCQkJCU5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX1BMQU5OSU5HX0RBVEEsCi0JCQkJCW9sZFBsYW5uaW5nRGF0YSwgbmV3UGxhbm5pbmdEYXRhKTsKLQkJCWlmIChtc2dzID09IG51bGwpCi0JCQkJbXNncyA9IG5vdGlmaWNhdGlvbjsKLQkJCWVsc2UKLQkJCQltc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBsYW5uaW5nRGF0YShQbGFubmluZ0RhdGEgbmV3UGxhbm5pbmdEYXRhKSB7Ci0JCWlmIChuZXdQbGFubmluZ0RhdGEgIT0gcGxhbm5pbmdEYXRhKSB7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChwbGFubmluZ0RhdGEgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpIHBsYW5uaW5nRGF0YSkuZUludmVyc2VSZW1vdmUodGhpcywKLQkJCQkJCUVPUFBPU0lURV9GRUFUVVJFX0JBU0UKLQkJCQkJCQkJLSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19QTEFOTklOR19EQVRBLAotCQkJCQkJbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3UGxhbm5pbmdEYXRhICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KSBuZXdQbGFubmluZ0RhdGEpLmVJbnZlcnNlQWRkKHRoaXMsCi0JCQkJCQlFT1BQT1NJVEVfRkVBVFVSRV9CQVNFCi0JCQkJCQkJCS0gVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fUExBTk5JTkdfREFUQSwKLQkJCQkJCW51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0UGxhbm5pbmdEYXRhKG5ld1BsYW5uaW5nRGF0YSwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKQotCQkJCW1zZ3MuZGlzcGF0Y2goKTsKLQkJfSBlbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX1BMQU5OSU5HX0RBVEEsCi0JCQkJCW5ld1BsYW5uaW5nRGF0YSwgbmV3UGxhbm5pbmdEYXRhKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFjdGl2aXR5IGdldFN1cGVyQWN0aXZpdGllcygpIHsKLQkJaWYgKHN1cGVyQWN0aXZpdGllcyAhPSBudWxsICYmICgoRU9iamVjdCkgc3VwZXJBY3Rpdml0aWVzKS5lSXNQcm94eSgpKSB7Ci0JCQlJbnRlcm5hbEVPYmplY3Qgb2xkU3VwZXJBY3Rpdml0aWVzID0gKEludGVybmFsRU9iamVjdCkgc3VwZXJBY3Rpdml0aWVzOwotCQkJc3VwZXJBY3Rpdml0aWVzID0gKEFjdGl2aXR5KSBlUmVzb2x2ZVByb3h5KG9sZFN1cGVyQWN0aXZpdGllcyk7Ci0JCQlpZiAoc3VwZXJBY3Rpdml0aWVzICE9IG9sZFN1cGVyQWN0aXZpdGllcykgewotCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlJFU09MVkUsCi0JCQkJCQkJVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fU1VQRVJfQUNUSVZJVElFUywKLQkJCQkJCQlvbGRTdXBlckFjdGl2aXRpZXMsIHN1cGVyQWN0aXZpdGllcykpOwotCQkJfQotCQl9Ci0JCXJldHVybiBzdXBlckFjdGl2aXRpZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFjdGl2aXR5IGJhc2ljR2V0U3VwZXJBY3Rpdml0aWVzKCkgewotCQlyZXR1cm4gc3VwZXJBY3Rpdml0aWVzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldFN1cGVyQWN0aXZpdGllcygKLQkJCUFjdGl2aXR5IG5ld1N1cGVyQWN0aXZpdGllcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlBY3Rpdml0eSBvbGRTdXBlckFjdGl2aXRpZXMgPSBzdXBlckFjdGl2aXRpZXM7Ci0JCXN1cGVyQWN0aXZpdGllcyA9IG5ld1N1cGVyQWN0aXZpdGllczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywKLQkJCQkJTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fU1VQRVJfQUNUSVZJVElFUywKLQkJCQkJb2xkU3VwZXJBY3Rpdml0aWVzLCBuZXdTdXBlckFjdGl2aXRpZXMpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkKLQkJCQltc2dzID0gbm90aWZpY2F0aW9uOwotCQkJZWxzZQotCQkJCW1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0U3VwZXJBY3Rpdml0aWVzKEFjdGl2aXR5IG5ld1N1cGVyQWN0aXZpdGllcykgewotCQlpZiAobmV3U3VwZXJBY3Rpdml0aWVzICE9IHN1cGVyQWN0aXZpdGllcykgewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoc3VwZXJBY3Rpdml0aWVzICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KSBzdXBlckFjdGl2aXRpZXMpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsCi0JCQkJCQlVbWFQYWNrYWdlLkFDVElWSVRZX19CUkVBS0RPV05fRUxFTUVOVFMsCi0JCQkJCQlBY3Rpdml0eS5jbGFzcywgbXNncyk7Ci0JCQlpZiAobmV3U3VwZXJBY3Rpdml0aWVzICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KSBuZXdTdXBlckFjdGl2aXRpZXMpLmVJbnZlcnNlQWRkKHRoaXMsCi0JCQkJCQlVbWFQYWNrYWdlLkFDVElWSVRZX19CUkVBS0RPV05fRUxFTUVOVFMsCi0JCQkJCQlBY3Rpdml0eS5jbGFzcywgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRTdXBlckFjdGl2aXRpZXMobmV3U3VwZXJBY3Rpdml0aWVzLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpCi0JCQkJbXNncy5kaXNwYXRjaCgpOwotCQl9IGVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fU1VQRVJfQUNUSVZJVElFUywKLQkJCQkJbmV3U3VwZXJBY3Rpdml0aWVzLCBuZXdTdXBlckFjdGl2aXRpZXMpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdDxDaGVja2xpc3Q+IGdldENoZWNrbGlzdHMoKSB7Ci0JCWlmIChjaGVja2xpc3RzID09IG51bGwpIHsKLQkJCWNoZWNrbGlzdHMgPSBuZXcgRU9iamVjdFJlc29sdmluZ0VMaXN0PENoZWNrbGlzdD4oQ2hlY2tsaXN0LmNsYXNzLAotCQkJCQl0aGlzLCBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19DSEVDS0xJU1RTKTsKLQkJfQotCQlyZXR1cm4gY2hlY2tsaXN0czsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdDxDb25jZXB0PiBnZXRDb25jZXB0cygpIHsKLQkJaWYgKGNvbmNlcHRzID09IG51bGwpIHsKLQkJCWNvbmNlcHRzID0gbmV3IEVPYmplY3RSZXNvbHZpbmdFTGlzdDxDb25jZXB0PihDb25jZXB0LmNsYXNzLCB0aGlzLAotCQkJCQlVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19DT05DRVBUUyk7Ci0JCX0KLQkJcmV0dXJuIGNvbmNlcHRzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0PEV4YW1wbGU+IGdldEV4YW1wbGVzKCkgewotCQlpZiAoZXhhbXBsZXMgPT0gbnVsbCkgewotCQkJZXhhbXBsZXMgPSBuZXcgRU9iamVjdFJlc29sdmluZ0VMaXN0PEV4YW1wbGU+KEV4YW1wbGUuY2xhc3MsIHRoaXMsCi0JCQkJCVVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX0VYQU1QTEVTKTsKLQkJfQotCQlyZXR1cm4gZXhhbXBsZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3Q8R3VpZGVsaW5lPiBnZXRHdWlkZWxpbmVzKCkgewotCQlpZiAoZ3VpZGVsaW5lcyA9PSBudWxsKSB7Ci0JCQlndWlkZWxpbmVzID0gbmV3IEVPYmplY3RSZXNvbHZpbmdFTGlzdDxHdWlkZWxpbmU+KEd1aWRlbGluZS5jbGFzcywKLQkJCQkJdGhpcywgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fR1VJREVMSU5FUyk7Ci0JCX0KLQkJcmV0dXJuIGd1aWRlbGluZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3Q8UmV1c2FibGVBc3NldD4gZ2V0UmV1c2FibGVBc3NldHMoKSB7Ci0JCWlmIChyZXVzYWJsZUFzc2V0cyA9PSBudWxsKSB7Ci0JCQlyZXVzYWJsZUFzc2V0cyA9IG5ldyBFT2JqZWN0UmVzb2x2aW5nRUxpc3Q8UmV1c2FibGVBc3NldD4oCi0JCQkJCVJldXNhYmxlQXNzZXQuY2xhc3MsIHRoaXMsCi0JCQkJCVVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX1JFVVNBQkxFX0FTU0VUUyk7Ci0JCX0KLQkJcmV0dXJuIHJldXNhYmxlQXNzZXRzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0PFN1cHBvcnRpbmdNYXRlcmlhbD4gZ2V0U3VwcG9ydGluZ01hdGVyaWFscygpIHsKLQkJaWYgKHN1cHBvcnRpbmdNYXRlcmlhbHMgPT0gbnVsbCkgewotCQkJc3VwcG9ydGluZ01hdGVyaWFscyA9IG5ldyBFT2JqZWN0UmVzb2x2aW5nRUxpc3Q8U3VwcG9ydGluZ01hdGVyaWFsPigKLQkJCQkJU3VwcG9ydGluZ01hdGVyaWFsLmNsYXNzLCB0aGlzLAotCQkJCQlVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19TVVBQT1JUSU5HX01BVEVSSUFMUyk7Ci0JCX0KLQkJcmV0dXJuIHN1cHBvcnRpbmdNYXRlcmlhbHM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3Q8VGVtcGxhdGU+IGdldFRlbXBsYXRlcygpIHsKLQkJaWYgKHRlbXBsYXRlcyA9PSBudWxsKSB7Ci0JCQl0ZW1wbGF0ZXMgPSBuZXcgRU9iamVjdFJlc29sdmluZ0VMaXN0PFRlbXBsYXRlPihUZW1wbGF0ZS5jbGFzcywKLQkJCQkJdGhpcywgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fVEVNUExBVEVTKTsKLQkJfQotCQlyZXR1cm4gdGVtcGxhdGVzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0PFJlcG9ydD4gZ2V0UmVwb3J0cygpIHsKLQkJaWYgKHJlcG9ydHMgPT0gbnVsbCkgewotCQkJcmVwb3J0cyA9IG5ldyBFT2JqZWN0UmVzb2x2aW5nRUxpc3Q8UmVwb3J0PihSZXBvcnQuY2xhc3MsIHRoaXMsCi0JCQkJCVVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX1JFUE9SVFMpOwotCQl9Ci0JCXJldHVybiByZXBvcnRzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0PEVzdGltYXRpb25Db25zaWRlcmF0aW9ucz4gZ2V0RXN0aW1hdGlvbmNvbnNpZGVyYXRpb25zKCkgewotCQlpZiAoZXN0aW1hdGlvbmNvbnNpZGVyYXRpb25zID09IG51bGwpIHsKLQkJCWVzdGltYXRpb25jb25zaWRlcmF0aW9ucyA9IG5ldyBFT2JqZWN0UmVzb2x2aW5nRUxpc3Q8RXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zPigKLQkJCQkJRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zLmNsYXNzLCB0aGlzLAotCQkJCQlVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19FU1RJTUFUSU9OQ09OU0lERVJBVElPTlMpOwotCQl9Ci0JCXJldHVybiBlc3RpbWF0aW9uY29uc2lkZXJhdGlvbnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3Q8VG9vbE1lbnRvcj4gZ2V0VG9vbG1lbnRvcigpIHsKLQkJaWYgKHRvb2xtZW50b3IgPT0gbnVsbCkgewotCQkJdG9vbG1lbnRvciA9IG5ldyBFT2JqZWN0UmVzb2x2aW5nRUxpc3Q8VG9vbE1lbnRvcj4oCi0JCQkJCVRvb2xNZW50b3IuY2xhc3MsIHRoaXMsCi0JCQkJCVVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX1RPT0xNRU5UT1IpOwotCQl9Ci0JCXJldHVybiB0b29sbWVudG9yOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZUFkZChJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsCi0JCQlpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fU1VQRVJfQUNUSVZJVElFUzoKLQkJCWlmIChzdXBlckFjdGl2aXRpZXMgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpIHN1cGVyQWN0aXZpdGllcykuZUludmVyc2VSZW1vdmUodGhpcywKLQkJCQkJCVVtYVBhY2thZ2UuQUNUSVZJVFlfX0JSRUFLRE9XTl9FTEVNRU5UUywKLQkJCQkJCUFjdGl2aXR5LmNsYXNzLCBtc2dzKTsKLQkJCXJldHVybiBiYXNpY1NldFN1cGVyQWN0aXZpdGllcygoQWN0aXZpdHkpIG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VBZGQob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwKLQkJCWludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19QTEFOTklOR19EQVRBOgotCQkJcmV0dXJuIGJhc2ljU2V0UGxhbm5pbmdEYXRhKG51bGwsIG1zZ3MpOwotCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX1NVUEVSX0FDVElWSVRJRVM6Ci0JCQlyZXR1cm4gYmFzaWNTZXRTdXBlckFjdGl2aXRpZXMobnVsbCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19QUkVGSVg6Ci0JCQlyZXR1cm4gZ2V0UHJlZml4KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fSVNfUExBTk5FRDoKLQkJCXJldHVybiBnZXRJc1BsYW5uZWQoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19IQVNfTVVMVElQTEVfT0NDVVJSRU5DRVM6Ci0JCQlyZXR1cm4gZ2V0SGFzTXVsdGlwbGVPY2N1cnJlbmNlcygpOwotCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX0lTX09QVElPTkFMOgotCQkJcmV0dXJuIGdldElzT3B0aW9uYWwoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19QUkVTRU5URURfQUZURVI6Ci0JCQlpZiAocmVzb2x2ZSkKLQkJCQlyZXR1cm4gZ2V0UHJlc2VudGVkQWZ0ZXIoKTsKLQkJCXJldHVybiBiYXNpY0dldFByZXNlbnRlZEFmdGVyKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fUFJFU0VOVEVEX0JFRk9SRToKLQkJCWlmIChyZXNvbHZlKQotCQkJCXJldHVybiBnZXRQcmVzZW50ZWRCZWZvcmUoKTsKLQkJCXJldHVybiBiYXNpY0dldFByZXNlbnRlZEJlZm9yZSgpOwotCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX1BMQU5OSU5HX0RBVEE6Ci0JCQlpZiAocmVzb2x2ZSkKLQkJCQlyZXR1cm4gZ2V0UGxhbm5pbmdEYXRhKCk7Ci0JCQlyZXR1cm4gYmFzaWNHZXRQbGFubmluZ0RhdGEoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19TVVBFUl9BQ1RJVklUSUVTOgotCQkJaWYgKHJlc29sdmUpCi0JCQkJcmV0dXJuIGdldFN1cGVyQWN0aXZpdGllcygpOwotCQkJcmV0dXJuIGJhc2ljR2V0U3VwZXJBY3Rpdml0aWVzKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fQ0hFQ0tMSVNUUzoKLQkJCXJldHVybiBnZXRDaGVja2xpc3RzKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fQ09OQ0VQVFM6Ci0JCQlyZXR1cm4gZ2V0Q29uY2VwdHMoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19FWEFNUExFUzoKLQkJCXJldHVybiBnZXRFeGFtcGxlcygpOwotCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX0dVSURFTElORVM6Ci0JCQlyZXR1cm4gZ2V0R3VpZGVsaW5lcygpOwotCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX1JFVVNBQkxFX0FTU0VUUzoKLQkJCXJldHVybiBnZXRSZXVzYWJsZUFzc2V0cygpOwotCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX1NVUFBPUlRJTkdfTUFURVJJQUxTOgotCQkJcmV0dXJuIGdldFN1cHBvcnRpbmdNYXRlcmlhbHMoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19URU1QTEFURVM6Ci0JCQlyZXR1cm4gZ2V0VGVtcGxhdGVzKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fUkVQT1JUUzoKLQkJCXJldHVybiBnZXRSZXBvcnRzKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fRVNUSU1BVElPTkNPTlNJREVSQVRJT05TOgotCQkJcmV0dXJuIGdldEVzdGltYXRpb25jb25zaWRlcmF0aW9ucygpOwotCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX1RPT0xNRU5UT1I6Ci0JCQlyZXR1cm4gZ2V0VG9vbG1lbnRvcigpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fUFJFRklYOgotCQkJc2V0UHJlZml4KChTdHJpbmcpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19JU19QTEFOTkVEOgotCQkJc2V0SXNQbGFubmVkKChCb29sZWFuKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fSEFTX01VTFRJUExFX09DQ1VSUkVOQ0VTOgotCQkJc2V0SGFzTXVsdGlwbGVPY2N1cnJlbmNlcygoQm9vbGVhbikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX0lTX09QVElPTkFMOgotCQkJc2V0SXNPcHRpb25hbCgoQm9vbGVhbikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX1BSRVNFTlRFRF9BRlRFUjoKLQkJCXNldFByZXNlbnRlZEFmdGVyKChCcmVha2Rvd25FbGVtZW50KSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fUFJFU0VOVEVEX0JFRk9SRToKLQkJCXNldFByZXNlbnRlZEJlZm9yZSgoQnJlYWtkb3duRWxlbWVudCkgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX1BMQU5OSU5HX0RBVEE6Ci0JCQlzZXRQbGFubmluZ0RhdGEoKFBsYW5uaW5nRGF0YSkgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX1NVUEVSX0FDVElWSVRJRVM6Ci0JCQlzZXRTdXBlckFjdGl2aXRpZXMoKEFjdGl2aXR5KSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fQ0hFQ0tMSVNUUzoKLQkJCWdldENoZWNrbGlzdHMoKS5jbGVhcigpOwotCQkJZ2V0Q2hlY2tsaXN0cygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgQ2hlY2tsaXN0PikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX0NPTkNFUFRTOgotCQkJZ2V0Q29uY2VwdHMoKS5jbGVhcigpOwotCQkJZ2V0Q29uY2VwdHMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIENvbmNlcHQ+KSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fRVhBTVBMRVM6Ci0JCQlnZXRFeGFtcGxlcygpLmNsZWFyKCk7Ci0JCQlnZXRFeGFtcGxlcygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgRXhhbXBsZT4pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19HVUlERUxJTkVTOgotCQkJZ2V0R3VpZGVsaW5lcygpLmNsZWFyKCk7Ci0JCQlnZXRHdWlkZWxpbmVzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBHdWlkZWxpbmU+KSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fUkVVU0FCTEVfQVNTRVRTOgotCQkJZ2V0UmV1c2FibGVBc3NldHMoKS5jbGVhcigpOwotCQkJZ2V0UmV1c2FibGVBc3NldHMoKS5hZGRBbGwoCi0JCQkJCShDb2xsZWN0aW9uPD8gZXh0ZW5kcyBSZXVzYWJsZUFzc2V0PikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX1NVUFBPUlRJTkdfTUFURVJJQUxTOgotCQkJZ2V0U3VwcG9ydGluZ01hdGVyaWFscygpLmNsZWFyKCk7Ci0JCQlnZXRTdXBwb3J0aW5nTWF0ZXJpYWxzKCkuYWRkQWxsKAotCQkJCQkoQ29sbGVjdGlvbjw/IGV4dGVuZHMgU3VwcG9ydGluZ01hdGVyaWFsPikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX1RFTVBMQVRFUzoKLQkJCWdldFRlbXBsYXRlcygpLmNsZWFyKCk7Ci0JCQlnZXRUZW1wbGF0ZXMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFRlbXBsYXRlPikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX1JFUE9SVFM6Ci0JCQlnZXRSZXBvcnRzKCkuY2xlYXIoKTsKLQkJCWdldFJlcG9ydHMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFJlcG9ydD4pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19FU1RJTUFUSU9OQ09OU0lERVJBVElPTlM6Ci0JCQlnZXRFc3RpbWF0aW9uY29uc2lkZXJhdGlvbnMoKS5jbGVhcigpOwotCQkJZ2V0RXN0aW1hdGlvbmNvbnNpZGVyYXRpb25zKCkuYWRkQWxsKAotCQkJCQkoQ29sbGVjdGlvbjw/IGV4dGVuZHMgRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zPikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX1RPT0xNRU5UT1I6Ci0JCQlnZXRUb29sbWVudG9yKCkuY2xlYXIoKTsKLQkJCWdldFRvb2xtZW50b3IoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFRvb2xNZW50b3I+KSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX1BSRUZJWDoKLQkJCXNldFByZWZpeChQUkVGSVhfRURFRkFVTFQpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX0lTX1BMQU5ORUQ6Ci0JCQlzZXRJc1BsYW5uZWQoSVNfUExBTk5FRF9FREVGQVVMVCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fSEFTX01VTFRJUExFX09DQ1VSUkVOQ0VTOgotCQkJc2V0SGFzTXVsdGlwbGVPY2N1cnJlbmNlcyhIQVNfTVVMVElQTEVfT0NDVVJSRU5DRVNfRURFRkFVTFQpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX0lTX09QVElPTkFMOgotCQkJc2V0SXNPcHRpb25hbChJU19PUFRJT05BTF9FREVGQVVMVCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fUFJFU0VOVEVEX0FGVEVSOgotCQkJc2V0UHJlc2VudGVkQWZ0ZXIoKEJyZWFrZG93bkVsZW1lbnQpIG51bGwpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX1BSRVNFTlRFRF9CRUZPUkU6Ci0JCQlzZXRQcmVzZW50ZWRCZWZvcmUoKEJyZWFrZG93bkVsZW1lbnQpIG51bGwpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX1BMQU5OSU5HX0RBVEE6Ci0JCQlzZXRQbGFubmluZ0RhdGEoKFBsYW5uaW5nRGF0YSkgbnVsbCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fU1VQRVJfQUNUSVZJVElFUzoKLQkJCXNldFN1cGVyQWN0aXZpdGllcygoQWN0aXZpdHkpIG51bGwpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX0NIRUNLTElTVFM6Ci0JCQlnZXRDaGVja2xpc3RzKCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19DT05DRVBUUzoKLQkJCWdldENvbmNlcHRzKCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19FWEFNUExFUzoKLQkJCWdldEV4YW1wbGVzKCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19HVUlERUxJTkVTOgotCQkJZ2V0R3VpZGVsaW5lcygpLmNsZWFyKCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fUkVVU0FCTEVfQVNTRVRTOgotCQkJZ2V0UmV1c2FibGVBc3NldHMoKS5jbGVhcigpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX1NVUFBPUlRJTkdfTUFURVJJQUxTOgotCQkJZ2V0U3VwcG9ydGluZ01hdGVyaWFscygpLmNsZWFyKCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fVEVNUExBVEVTOgotCQkJZ2V0VGVtcGxhdGVzKCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19SRVBPUlRTOgotCQkJZ2V0UmVwb3J0cygpLmNsZWFyKCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fRVNUSU1BVElPTkNPTlNJREVSQVRJT05TOgotCQkJZ2V0RXN0aW1hdGlvbmNvbnNpZGVyYXRpb25zKCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19UT09MTUVOVE9SOgotCQkJZ2V0VG9vbG1lbnRvcigpLmNsZWFyKCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJLy9VTUEtLT4KLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBnZXRGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZShmZWF0dXJlSUQpOwotCQlpZiAoZmVhdHVyZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gaXNGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZVNldChmZWF0dXJlKTsKLQkJfQotCQkvL1VNQTwtLQkJCi0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fUFJFRklYOgotCQkJcmV0dXJuIFBSRUZJWF9FREVGQVVMVCA9PSBudWxsID8gcHJlZml4ICE9IG51bGwgOiAhUFJFRklYX0VERUZBVUxUCi0JCQkJCS5lcXVhbHMocHJlZml4KTsKLQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19JU19QTEFOTkVEOgotCQkJcmV0dXJuIElTX1BMQU5ORURfRURFRkFVTFQgPT0gbnVsbCA/IGlzUGxhbm5lZCAhPSBudWxsCi0JCQkJCTogIUlTX1BMQU5ORURfRURFRkFVTFQuZXF1YWxzKGlzUGxhbm5lZCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fSEFTX01VTFRJUExFX09DQ1VSUkVOQ0VTOgotCQkJcmV0dXJuIEhBU19NVUxUSVBMRV9PQ0NVUlJFTkNFU19FREVGQVVMVCA9PSBudWxsID8gaGFzTXVsdGlwbGVPY2N1cnJlbmNlcyAhPSBudWxsCi0JCQkJCTogIUhBU19NVUxUSVBMRV9PQ0NVUlJFTkNFU19FREVGQVVMVAotCQkJCQkJCS5lcXVhbHMoaGFzTXVsdGlwbGVPY2N1cnJlbmNlcyk7Ci0JCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fSVNfT1BUSU9OQUw6Ci0JCQlyZXR1cm4gSVNfT1BUSU9OQUxfRURFRkFVTFQgPT0gbnVsbCA/IGlzT3B0aW9uYWwgIT0gbnVsbAotCQkJCQk6ICFJU19PUFRJT05BTF9FREVGQVVMVC5lcXVhbHMoaXNPcHRpb25hbCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fUFJFU0VOVEVEX0FGVEVSOgotCQkJcmV0dXJuIHByZXNlbnRlZEFmdGVyICE9IG51bGw7Ci0JCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fUFJFU0VOVEVEX0JFRk9SRToKLQkJCXJldHVybiBwcmVzZW50ZWRCZWZvcmUgIT0gbnVsbDsKLQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19QTEFOTklOR19EQVRBOgotCQkJcmV0dXJuIHBsYW5uaW5nRGF0YSAhPSBudWxsOwotCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX1NVUEVSX0FDVElWSVRJRVM6Ci0JCQlyZXR1cm4gc3VwZXJBY3Rpdml0aWVzICE9IG51bGw7Ci0JCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fQ0hFQ0tMSVNUUzoKLQkJCXJldHVybiBjaGVja2xpc3RzICE9IG51bGwgJiYgIWNoZWNrbGlzdHMuaXNFbXB0eSgpOwotCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX0NPTkNFUFRTOgotCQkJcmV0dXJuIGNvbmNlcHRzICE9IG51bGwgJiYgIWNvbmNlcHRzLmlzRW1wdHkoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19FWEFNUExFUzoKLQkJCXJldHVybiBleGFtcGxlcyAhPSBudWxsICYmICFleGFtcGxlcy5pc0VtcHR5KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fR1VJREVMSU5FUzoKLQkJCXJldHVybiBndWlkZWxpbmVzICE9IG51bGwgJiYgIWd1aWRlbGluZXMuaXNFbXB0eSgpOwotCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX1JFVVNBQkxFX0FTU0VUUzoKLQkJCXJldHVybiByZXVzYWJsZUFzc2V0cyAhPSBudWxsICYmICFyZXVzYWJsZUFzc2V0cy5pc0VtcHR5KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fU1VQUE9SVElOR19NQVRFUklBTFM6Ci0JCQlyZXR1cm4gc3VwcG9ydGluZ01hdGVyaWFscyAhPSBudWxsCi0JCQkJCSYmICFzdXBwb3J0aW5nTWF0ZXJpYWxzLmlzRW1wdHkoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19URU1QTEFURVM6Ci0JCQlyZXR1cm4gdGVtcGxhdGVzICE9IG51bGwgJiYgIXRlbXBsYXRlcy5pc0VtcHR5KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fUkVQT1JUUzoKLQkJCXJldHVybiByZXBvcnRzICE9IG51bGwgJiYgIXJlcG9ydHMuaXNFbXB0eSgpOwotCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX0VTVElNQVRJT05DT05TSURFUkFUSU9OUzoKLQkJCXJldHVybiBlc3RpbWF0aW9uY29uc2lkZXJhdGlvbnMgIT0gbnVsbAotCQkJCQkmJiAhZXN0aW1hdGlvbmNvbnNpZGVyYXRpb25zLmlzRW1wdHkoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19UT09MTUVOVE9SOgotCQkJcmV0dXJuIHRvb2xtZW50b3IgIT0gbnVsbCAmJiAhdG9vbG1lbnRvci5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKQotCQkJcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAocHJlZml4OiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKHByZWZpeCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgaXNQbGFubmVkOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGlzUGxhbm5lZCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgaGFzTXVsdGlwbGVPY2N1cnJlbmNlczogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChoYXNNdWx0aXBsZU9jY3VycmVuY2VzKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBpc09wdGlvbmFsOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGlzT3B0aW9uYWwpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9CcmVha2Rvd25FbGVtZW50SW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0NhcGFiaWxpdHlQYXR0ZXJuSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0NhcGFiaWxpdHlQYXR0ZXJuSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MmRkYTA5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9DYXBhYmlsaXR5UGF0dGVybkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DYXBhYmlsaXR5UGF0dGVybjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5DYXBhYmlsaXR5IFBhdHRlcm48L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBDYXBhYmlsaXR5UGF0dGVybkltcGwgZXh0ZW5kcyBQcm9jZXNzSW1wbCBpbXBsZW1lbnRzCi0JCUNhcGFiaWxpdHlQYXR0ZXJuIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDYXBhYmlsaXR5UGF0dGVybkltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJLy9VTUEtLT4KLQkJcmVhc3NpZ25EZWZhdWx0VmFsdWVzKCk7Ci0JCS8vVU1BPC0tICAKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuQ0FQQUJJTElUWV9QQVRURVJOOwotCX0KLQotfSAvL0NhcGFiaWxpdHlQYXR0ZXJuSW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0NoZWNrbGlzdEltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9DaGVja2xpc3RJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjYzRmZTMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0NoZWNrbGlzdEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DaGVja2xpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Q2hlY2tsaXN0PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQ2hlY2tsaXN0SW1wbCBleHRlbmRzIEd1aWRhbmNlSW1wbCBpbXBsZW1lbnRzIENoZWNrbGlzdCB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ2hlY2tsaXN0SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQotCQkvL1VNQS0tPgotCQlyZWFzc2lnbkRlZmF1bHRWYWx1ZXMoKTsKLQkJLy9VTUE8LS0gIAotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5DSEVDS0xJU1Q7Ci0JfQotCi19IC8vQ2hlY2tsaXN0SW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0NsYXNzaWZpZXJJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvQ2xhc3NpZmllckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjZjYWY0My4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvQ2xhc3NpZmllckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ2xhc3NpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5DbGFzc2lmaWVyPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQ2xhc3NpZmllckltcGwjZ2V0SXNBYnN0cmFjdCA8ZW0+SXMgQWJzdHJhY3Q8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBDbGFzc2lmaWVySW1wbCBleHRlbmRzIFR5cGVJbXBsIGltcGxlbWVudHMgQ2xhc3NpZmllciB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SXNBYnN0cmFjdCgpIDxlbT5JcyBBYnN0cmFjdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SXNBYnN0cmFjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCb29sZWFuIElTX0FCU1RSQUNUX0VERUZBVUxUID0gQm9vbGVhbi5GQUxTRTsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJc0Fic3RyYWN0KCkgPGVtPklzIEFic3RyYWN0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJc0Fic3RyYWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQm9vbGVhbiBpc0Fic3RyYWN0ID0gSVNfQUJTVFJBQ1RfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ2xhc3NpZmllckltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJLy9VTUEtLT4KLQkJcmVhc3NpZ25EZWZhdWx0VmFsdWVzKCk7Ci0JCS8vVU1BPC0tICAKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuQ0xBU1NJRklFUjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQm9vbGVhbiBnZXRJc0Fic3RyYWN0KCkgewotCQlyZXR1cm4gaXNBYnN0cmFjdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJc0Fic3RyYWN0KEJvb2xlYW4gbmV3SXNBYnN0cmFjdCkgewotCQlCb29sZWFuIG9sZElzQWJzdHJhY3QgPSBpc0Fic3RyYWN0OwotCQlpc0Fic3RyYWN0ID0gbmV3SXNBYnN0cmFjdDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5DTEFTU0lGSUVSX19JU19BQlNUUkFDVCwgb2xkSXNBYnN0cmFjdCwKLQkJCQkJaXNBYnN0cmFjdCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkNMQVNTSUZJRVJfX0lTX0FCU1RSQUNUOgotCQkJcmV0dXJuIGdldElzQWJzdHJhY3QoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuQ0xBU1NJRklFUl9fSVNfQUJTVFJBQ1Q6Ci0JCQlzZXRJc0Fic3RyYWN0KChCb29sZWFuKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuQ0xBU1NJRklFUl9fSVNfQUJTVFJBQ1Q6Ci0JCQlzZXRJc0Fic3RyYWN0KElTX0FCU1RSQUNUX0VERUZBVUxUKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQkvL1VNQS0tPgotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IGdldEZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlKGZlYXR1cmVJRCk7Ci0JCWlmIChmZWF0dXJlICE9IG51bGwpIHsKLQkJCXJldHVybiBpc0ZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlU2V0KGZlYXR1cmUpOwotCQl9Ci0JCS8vVU1BPC0tCQkKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkNMQVNTSUZJRVJfX0lTX0FCU1RSQUNUOgotCQkJcmV0dXJuIElTX0FCU1RSQUNUX0VERUZBVUxUID09IG51bGwgPyBpc0Fic3RyYWN0ICE9IG51bGwKLQkJCQkJOiAhSVNfQUJTVFJBQ1RfRURFRkFVTFQuZXF1YWxzKGlzQWJzdHJhY3QpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkKLQkJCXJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGlzQWJzdHJhY3Q6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoaXNBYnN0cmFjdCk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL0NsYXNzaWZpZXJJbXBsCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvQ29tcG9zaXRlUm9sZUltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Db21wb3NpdGVSb2xlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNTA0ZWFkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Db21wb3NpdGVSb2xlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0UmVzb2x2aW5nRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db21wb3NpdGVSb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Db21wb3NpdGUgUm9sZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkNvbXBvc2l0ZVJvbGVJbXBsI2dldEFnZ3JlZ2F0ZWRSb2xlcyA8ZW0+QWdncmVnYXRlZCBSb2xlczwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIENvbXBvc2l0ZVJvbGVJbXBsIGV4dGVuZHMgUm9sZURlc2NyaXB0b3JJbXBsIGltcGxlbWVudHMKLQkJQ29tcG9zaXRlUm9sZSB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBZ2dyZWdhdGVkUm9sZXMoKSA8ZW0+QWdncmVnYXRlZCBSb2xlczwvZW0+fScgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBZ2dyZWdhdGVkUm9sZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxSb2xlPiBhZ2dyZWdhdGVkUm9sZXM7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tcG9zaXRlUm9sZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJLy9VTUEtLT4KLQkJcmVhc3NpZ25EZWZhdWx0VmFsdWVzKCk7Ci0JCS8vVU1BPC0tICAKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuQ09NUE9TSVRFX1JPTEU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3Q8Um9sZT4gZ2V0QWdncmVnYXRlZFJvbGVzKCkgewotCQlpZiAoYWdncmVnYXRlZFJvbGVzID09IG51bGwpIHsKLQkJCWFnZ3JlZ2F0ZWRSb2xlcyA9IG5ldyBFT2JqZWN0UmVzb2x2aW5nRUxpc3Q8Um9sZT4oUm9sZS5jbGFzcywgdGhpcywKLQkJCQkJVW1hUGFja2FnZS5DT01QT1NJVEVfUk9MRV9fQUdHUkVHQVRFRF9ST0xFUyk7Ci0JCX0KLQkJcmV0dXJuIGFnZ3JlZ2F0ZWRSb2xlczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5DT01QT1NJVEVfUk9MRV9fQUdHUkVHQVRFRF9ST0xFUzoKLQkJCXJldHVybiBnZXRBZ2dyZWdhdGVkUm9sZXMoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuQ09NUE9TSVRFX1JPTEVfX0FHR1JFR0FURURfUk9MRVM6Ci0JCQlnZXRBZ2dyZWdhdGVkUm9sZXMoKS5jbGVhcigpOwotCQkJZ2V0QWdncmVnYXRlZFJvbGVzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBSb2xlPikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkNPTVBPU0lURV9ST0xFX19BR0dSRUdBVEVEX1JPTEVTOgotCQkJZ2V0QWdncmVnYXRlZFJvbGVzKCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQkvL1VNQS0tPgotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IGdldEZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlKGZlYXR1cmVJRCk7Ci0JCWlmIChmZWF0dXJlICE9IG51bGwpIHsKLQkJCXJldHVybiBpc0ZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlU2V0KGZlYXR1cmUpOwotCQl9Ci0JCS8vVU1BPC0tCQkKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkNPTVBPU0lURV9ST0xFX19BR0dSRUdBVEVEX1JPTEVTOgotCQkJcmV0dXJuIGFnZ3JlZ2F0ZWRSb2xlcyAhPSBudWxsICYmICFhZ2dyZWdhdGVkUm9sZXMuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLX0gLy9Db21wb3NpdGVSb2xlSW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0NvbmNlcHRJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvQ29uY2VwdEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2UyMTc1OC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvQ29uY2VwdEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db25jZXB0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkNvbmNlcHQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBDb25jZXB0SW1wbCBleHRlbmRzIEd1aWRhbmNlSW1wbCBpbXBsZW1lbnRzIENvbmNlcHQgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbmNlcHRJbXBsKCkgewotCQlzdXBlcigpOwotCi0JCS8vVU1BLS0+Ci0JCXJlYXNzaWduRGVmYXVsdFZhbHVlcygpOwotCQkvL1VNQTwtLSAgCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLkNPTkNFUFQ7Ci0JfQotCi19IC8vQ29uY2VwdEltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Db25zdHJhaW50SW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0NvbnN0cmFpbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjMDY0ZTYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0NvbnN0cmFpbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnN0cmFpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Q29uc3RyYWludDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkNvbnN0cmFpbnRJbXBsI2dldEJvZHkgPGVtPkJvZHk8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBDb25zdHJhaW50SW1wbCBleHRlbmRzIE1ldGhvZEVsZW1lbnRJbXBsIGltcGxlbWVudHMgQ29uc3RyYWludCB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Qm9keSgpIDxlbT5Cb2R5PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRCb2R5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBCT0RZX0VERUZBVUxUID0gIiI7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRCb2R5KCkgPGVtPkJvZHk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEJvZHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgYm9keSA9IEJPRFlfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29uc3RyYWludEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJLy9VTUEtLT4KLQkJcmVhc3NpZ25EZWZhdWx0VmFsdWVzKCk7Ci0JCS8vVU1BPC0tICAKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuQ09OU1RSQUlOVDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEJvZHkoKSB7Ci0JCXJldHVybiBib2R5OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEJvZHkoU3RyaW5nIG5ld0JvZHkpIHsKLQkJU3RyaW5nIG9sZEJvZHkgPSBib2R5OwotCQlib2R5ID0gbmV3Qm9keTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5DT05TVFJBSU5UX19CT0RZLCBvbGRCb2R5LCBib2R5KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuQ09OU1RSQUlOVF9fQk9EWToKLQkJCXJldHVybiBnZXRCb2R5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkNPTlNUUkFJTlRfX0JPRFk6Ci0JCQlzZXRCb2R5KChTdHJpbmcpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5DT05TVFJBSU5UX19CT0RZOgotCQkJc2V0Qm9keShCT0RZX0VERUZBVUxUKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQkvL1VNQS0tPgotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IGdldEZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlKGZlYXR1cmVJRCk7Ci0JCWlmIChmZWF0dXJlICE9IG51bGwpIHsKLQkJCXJldHVybiBpc0ZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlU2V0KGZlYXR1cmUpOwotCQl9Ci0JCS8vVU1BPC0tCQkKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkNPTlNUUkFJTlRfX0JPRFk6Ci0JCQlyZXR1cm4gQk9EWV9FREVGQVVMVCA9PSBudWxsID8gYm9keSAhPSBudWxsIDogIUJPRFlfRURFRkFVTFQKLQkJCQkJLmVxdWFscyhib2R5KTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpCi0JCQlyZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChib2R5OiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGJvZHkpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9Db25zdHJhaW50SW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0NvbnRlbnRDYXRlZ29yeUltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Db250ZW50Q2F0ZWdvcnlJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlOWYwY2UuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0NvbnRlbnRDYXRlZ29yeUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50Q2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Q29udGVudCBDYXRlZ29yeTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIENvbnRlbnRDYXRlZ29yeUltcGwgZXh0ZW5kcyBDb250ZW50RWxlbWVudEltcGwgaW1wbGVtZW50cwotCQlDb250ZW50Q2F0ZWdvcnkgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbnRlbnRDYXRlZ29yeUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJLy9VTUEtLT4KLQkJcmVhc3NpZ25EZWZhdWx0VmFsdWVzKCk7Ci0JCS8vVU1BPC0tICAKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuQ09OVEVOVF9DQVRFR09SWTsKLQl9Ci0KLX0gLy9Db250ZW50Q2F0ZWdvcnlJbXBsCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvQ29udGVudERlc2NyaXB0aW9uSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0NvbnRlbnREZXNjcmlwdGlvbkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmI5MzA4Zi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvQ29udGVudERlc2NyaXB0aW9uSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDI0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuU2VjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Db250ZW50IERlc2NyaXB0aW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQ29udGVudERlc2NyaXB0aW9uSW1wbCNnZXRNYWluRGVzY3JpcHRpb24gPGVtPk1haW4gRGVzY3JpcHRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Db250ZW50RGVzY3JpcHRpb25JbXBsI2dldFNlY3Rpb25zIDxlbT5TZWN0aW9uczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkNvbnRlbnREZXNjcmlwdGlvbkltcGwjZ2V0RXh0ZXJuYWxJZCA8ZW0+RXh0ZXJuYWwgSWQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Db250ZW50RGVzY3JpcHRpb25JbXBsI2dldEtleUNvbnNpZGVyYXRpb25zIDxlbT5LZXkgQ29uc2lkZXJhdGlvbnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Db250ZW50RGVzY3JpcHRpb25JbXBsI2dldExvbmdQcmVzZW50YXRpb25OYW1lIDxlbT5Mb25nIFByZXNlbnRhdGlvbiBOYW1lPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQ29udGVudERlc2NyaXB0aW9uSW1wbCBleHRlbmRzIE1ldGhvZFVuaXRJbXBsIGltcGxlbWVudHMKLQkJQ29udGVudERlc2NyaXB0aW9uIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNYWluRGVzY3JpcHRpb24oKSA8ZW0+TWFpbiBEZXNjcmlwdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TWFpbkRlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBNQUlOX0RFU0NSSVBUSU9OX0VERUZBVUxUID0gIiI7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNYWluRGVzY3JpcHRpb24oKSA8ZW0+TWFpbiBEZXNjcmlwdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TWFpbkRlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIG1haW5EZXNjcmlwdGlvbiA9IE1BSU5fREVTQ1JJUFRJT05fRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTZWN0aW9ucygpIDxlbT5TZWN0aW9uczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTZWN0aW9ucygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PFNlY3Rpb24+IHNlY3Rpb25zOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEV4dGVybmFsSWQoKSA8ZW0+RXh0ZXJuYWwgSWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEV4dGVybmFsSWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVEVSTkFMX0lEX0VERUZBVUxUID0gIiI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEV4dGVybmFsSWQoKSA8ZW0+RXh0ZXJuYWwgSWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEV4dGVybmFsSWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZXh0ZXJuYWxJZCA9IEVYVEVSTkFMX0lEX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEtleUNvbnNpZGVyYXRpb25zKCkgPGVtPktleSBDb25zaWRlcmF0aW9uczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0S2V5Q29uc2lkZXJhdGlvbnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9DT05TSURFUkFUSU9OU19FREVGQVVMVCA9ICIiOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0S2V5Q29uc2lkZXJhdGlvbnMoKSA8ZW0+S2V5IENvbnNpZGVyYXRpb25zPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRLZXlDb25zaWRlcmF0aW9ucygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBrZXlDb25zaWRlcmF0aW9ucyA9IEtFWV9DT05TSURFUkFUSU9OU19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRMb25nUHJlc2VudGF0aW9uTmFtZSgpIDxlbT5Mb25nIFByZXNlbnRhdGlvbiBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRMb25nUHJlc2VudGF0aW9uTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9OR19QUkVTRU5UQVRJT05fTkFNRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRMb25nUHJlc2VudGF0aW9uTmFtZSgpIDxlbT5Mb25nIFByZXNlbnRhdGlvbiBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRMb25nUHJlc2VudGF0aW9uTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBsb25nUHJlc2VudGF0aW9uTmFtZSA9IExPTkdfUFJFU0VOVEFUSU9OX05BTUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29udGVudERlc2NyaXB0aW9uSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQotCQkvL1VNQS0tPgotCQlyZWFzc2lnbkRlZmF1bHRWYWx1ZXMoKTsKLQkJLy9VTUE8LS0gIAotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5DT05URU5UX0RFU0NSSVBUSU9OOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TWFpbkRlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gbWFpbkRlc2NyaXB0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1haW5EZXNjcmlwdGlvbihTdHJpbmcgbmV3TWFpbkRlc2NyaXB0aW9uKSB7Ci0JCVN0cmluZyBvbGRNYWluRGVzY3JpcHRpb24gPSBtYWluRGVzY3JpcHRpb247Ci0JCW1haW5EZXNjcmlwdGlvbiA9IG5ld01haW5EZXNjcmlwdGlvbjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5DT05URU5UX0RFU0NSSVBUSU9OX19NQUlOX0RFU0NSSVBUSU9OLAotCQkJCQlvbGRNYWluRGVzY3JpcHRpb24sIG1haW5EZXNjcmlwdGlvbikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0PFNlY3Rpb24+IGdldFNlY3Rpb25zKCkgewotCQlpZiAoc2VjdGlvbnMgPT0gbnVsbCkgewotCQkJc2VjdGlvbnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QuUmVzb2x2aW5nPFNlY3Rpb24+KAotCQkJCQlTZWN0aW9uLmNsYXNzLCB0aGlzLAotCQkJCQlVbWFQYWNrYWdlLkNPTlRFTlRfREVTQ1JJUFRJT05fX1NFQ1RJT05TKTsKLQkJfQotCQlyZXR1cm4gc2VjdGlvbnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRFeHRlcm5hbElkKCkgewotCQlyZXR1cm4gZXh0ZXJuYWxJZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFeHRlcm5hbElkKFN0cmluZyBuZXdFeHRlcm5hbElkKSB7Ci0JCVN0cmluZyBvbGRFeHRlcm5hbElkID0gZXh0ZXJuYWxJZDsKLQkJZXh0ZXJuYWxJZCA9IG5ld0V4dGVybmFsSWQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuQ09OVEVOVF9ERVNDUklQVElPTl9fRVhURVJOQUxfSUQsIG9sZEV4dGVybmFsSWQsCi0JCQkJCWV4dGVybmFsSWQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEtleUNvbnNpZGVyYXRpb25zKCkgewotCQlyZXR1cm4ga2V5Q29uc2lkZXJhdGlvbnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0S2V5Q29uc2lkZXJhdGlvbnMoU3RyaW5nIG5ld0tleUNvbnNpZGVyYXRpb25zKSB7Ci0JCVN0cmluZyBvbGRLZXlDb25zaWRlcmF0aW9ucyA9IGtleUNvbnNpZGVyYXRpb25zOwotCQlrZXlDb25zaWRlcmF0aW9ucyA9IG5ld0tleUNvbnNpZGVyYXRpb25zOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLkNPTlRFTlRfREVTQ1JJUFRJT05fX0tFWV9DT05TSURFUkFUSU9OUywKLQkJCQkJb2xkS2V5Q29uc2lkZXJhdGlvbnMsIGtleUNvbnNpZGVyYXRpb25zKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMb25nUHJlc2VudGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIGxvbmdQcmVzZW50YXRpb25OYW1lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExvbmdQcmVzZW50YXRpb25OYW1lKFN0cmluZyBuZXdMb25nUHJlc2VudGF0aW9uTmFtZSkgewotCQlTdHJpbmcgb2xkTG9uZ1ByZXNlbnRhdGlvbk5hbWUgPSBsb25nUHJlc2VudGF0aW9uTmFtZTsKLQkJbG9uZ1ByZXNlbnRhdGlvbk5hbWUgPSBuZXdMb25nUHJlc2VudGF0aW9uTmFtZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5DT05URU5UX0RFU0NSSVBUSU9OX19MT05HX1BSRVNFTlRBVElPTl9OQU1FLAotCQkJCQlvbGRMb25nUHJlc2VudGF0aW9uTmFtZSwgbG9uZ1ByZXNlbnRhdGlvbk5hbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLAotCQkJaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9ERVNDUklQVElPTl9fU0VDVElPTlM6Ci0JCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KSBnZXRTZWN0aW9ucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwKLQkJCQkJbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfREVTQ1JJUFRJT05fX01BSU5fREVTQ1JJUFRJT046Ci0JCQlyZXR1cm4gZ2V0TWFpbkRlc2NyaXB0aW9uKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0RFU0NSSVBUSU9OX19TRUNUSU9OUzoKLQkJCXJldHVybiBnZXRTZWN0aW9ucygpOwotCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9ERVNDUklQVElPTl9fRVhURVJOQUxfSUQ6Ci0JCQlyZXR1cm4gZ2V0RXh0ZXJuYWxJZCgpOwotCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9ERVNDUklQVElPTl9fS0VZX0NPTlNJREVSQVRJT05TOgotCQkJcmV0dXJuIGdldEtleUNvbnNpZGVyYXRpb25zKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0RFU0NSSVBUSU9OX19MT05HX1BSRVNFTlRBVElPTl9OQU1FOgotCQkJcmV0dXJuIGdldExvbmdQcmVzZW50YXRpb25OYW1lKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfREVTQ1JJUFRJT05fX01BSU5fREVTQ1JJUFRJT046Ci0JCQlzZXRNYWluRGVzY3JpcHRpb24oKFN0cmluZykgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9ERVNDUklQVElPTl9fU0VDVElPTlM6Ci0JCQlnZXRTZWN0aW9ucygpLmNsZWFyKCk7Ci0JCQlnZXRTZWN0aW9ucygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgU2VjdGlvbj4pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfREVTQ1JJUFRJT05fX0VYVEVSTkFMX0lEOgotCQkJc2V0RXh0ZXJuYWxJZCgoU3RyaW5nKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0RFU0NSSVBUSU9OX19LRVlfQ09OU0lERVJBVElPTlM6Ci0JCQlzZXRLZXlDb25zaWRlcmF0aW9ucygoU3RyaW5nKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0RFU0NSSVBUSU9OX19MT05HX1BSRVNFTlRBVElPTl9OQU1FOgotCQkJc2V0TG9uZ1ByZXNlbnRhdGlvbk5hbWUoKFN0cmluZykgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfREVTQ1JJUFRJT05fX01BSU5fREVTQ1JJUFRJT046Ci0JCQlzZXRNYWluRGVzY3JpcHRpb24oTUFJTl9ERVNDUklQVElPTl9FREVGQVVMVCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0RFU0NSSVBUSU9OX19TRUNUSU9OUzoKLQkJCWdldFNlY3Rpb25zKCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfREVTQ1JJUFRJT05fX0VYVEVSTkFMX0lEOgotCQkJc2V0RXh0ZXJuYWxJZChFWFRFUk5BTF9JRF9FREVGQVVMVCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0RFU0NSSVBUSU9OX19LRVlfQ09OU0lERVJBVElPTlM6Ci0JCQlzZXRLZXlDb25zaWRlcmF0aW9ucyhLRVlfQ09OU0lERVJBVElPTlNfRURFRkFVTFQpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9ERVNDUklQVElPTl9fTE9OR19QUkVTRU5UQVRJT05fTkFNRToKLQkJCXNldExvbmdQcmVzZW50YXRpb25OYW1lKExPTkdfUFJFU0VOVEFUSU9OX05BTUVfRURFRkFVTFQpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCS8vVU1BLS0+Ci0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gZ2V0RmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWUoZmVhdHVyZUlEKTsKLQkJaWYgKGZlYXR1cmUgIT0gbnVsbCkgewotCQkJcmV0dXJuIGlzRmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWVTZXQoZmVhdHVyZSk7Ci0JCX0KLQkJLy9VTUE8LS0JCQotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9ERVNDUklQVElPTl9fTUFJTl9ERVNDUklQVElPTjoKLQkJCXJldHVybiBNQUlOX0RFU0NSSVBUSU9OX0VERUZBVUxUID09IG51bGwgPyBtYWluRGVzY3JpcHRpb24gIT0gbnVsbAotCQkJCQk6ICFNQUlOX0RFU0NSSVBUSU9OX0VERUZBVUxULmVxdWFscyhtYWluRGVzY3JpcHRpb24pOwotCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9ERVNDUklQVElPTl9fU0VDVElPTlM6Ci0JCQlyZXR1cm4gc2VjdGlvbnMgIT0gbnVsbCAmJiAhc2VjdGlvbnMuaXNFbXB0eSgpOwotCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9ERVNDUklQVElPTl9fRVhURVJOQUxfSUQ6Ci0JCQlyZXR1cm4gRVhURVJOQUxfSURfRURFRkFVTFQgPT0gbnVsbCA/IGV4dGVybmFsSWQgIT0gbnVsbAotCQkJCQk6ICFFWFRFUk5BTF9JRF9FREVGQVVMVC5lcXVhbHMoZXh0ZXJuYWxJZCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0RFU0NSSVBUSU9OX19LRVlfQ09OU0lERVJBVElPTlM6Ci0JCQlyZXR1cm4gS0VZX0NPTlNJREVSQVRJT05TX0VERUZBVUxUID09IG51bGwgPyBrZXlDb25zaWRlcmF0aW9ucyAhPSBudWxsCi0JCQkJCTogIUtFWV9DT05TSURFUkFUSU9OU19FREVGQVVMVC5lcXVhbHMoa2V5Q29uc2lkZXJhdGlvbnMpOwotCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9ERVNDUklQVElPTl9fTE9OR19QUkVTRU5UQVRJT05fTkFNRToKLQkJCXJldHVybiBMT05HX1BSRVNFTlRBVElPTl9OQU1FX0VERUZBVUxUID09IG51bGwgPyBsb25nUHJlc2VudGF0aW9uTmFtZSAhPSBudWxsCi0JCQkJCTogIUxPTkdfUFJFU0VOVEFUSU9OX05BTUVfRURFRkFVTFQKLQkJCQkJCQkuZXF1YWxzKGxvbmdQcmVzZW50YXRpb25OYW1lKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpCi0JCQlyZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChtYWluRGVzY3JpcHRpb246ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQobWFpbkRlc2NyaXB0aW9uKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBleHRlcm5hbElkOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGV4dGVybmFsSWQpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGtleUNvbnNpZGVyYXRpb25zOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGtleUNvbnNpZGVyYXRpb25zKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBsb25nUHJlc2VudGF0aW9uTmFtZTogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChsb25nUHJlc2VudGF0aW9uTmFtZSk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL0NvbnRlbnREZXNjcmlwdGlvbkltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Db250ZW50RWxlbWVudEltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Db250ZW50RWxlbWVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWMwNmMwNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvQ29udGVudEVsZW1lbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OTEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RSZXNvbHZpbmdFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNoZWNrbGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbmNlcHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkV4YW1wbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HdWlkZWxpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5SZXVzYWJsZUFzc2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuU3VwcG9ydGluZ01hdGVyaWFsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGVybURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5VbWFVdGlsOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Q29udGVudCBFbGVtZW50PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQ29udGVudEVsZW1lbnRJbXBsI2dldFZhcmlhYmlsaXR5VHlwZSA8ZW0+VmFyaWFiaWxpdHkgVHlwZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkNvbnRlbnRFbGVtZW50SW1wbCNnZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50IDxlbT5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQ29udGVudEVsZW1lbnRJbXBsI2dldFN1cHBvcnRpbmdNYXRlcmlhbHMgPGVtPlN1cHBvcnRpbmcgTWF0ZXJpYWxzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQ29udGVudEVsZW1lbnRJbXBsI2dldENvbmNlcHRzQW5kUGFwZXJzIDxlbT5Db25jZXB0cyBBbmQgUGFwZXJzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQ29udGVudEVsZW1lbnRJbXBsI2dldENoZWNrbGlzdHMgPGVtPkNoZWNrbGlzdHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Db250ZW50RWxlbWVudEltcGwjZ2V0R3VpZGVsaW5lcyA8ZW0+R3VpZGVsaW5lczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkNvbnRlbnRFbGVtZW50SW1wbCNnZXRFeGFtcGxlcyA8ZW0+RXhhbXBsZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Db250ZW50RWxlbWVudEltcGwjZ2V0QXNzZXRzIDxlbT5Bc3NldHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Db250ZW50RWxlbWVudEltcGwjZ2V0VGVybWRlZmluaXRpb24gPGVtPlRlcm1kZWZpbml0aW9uPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQ29udGVudEVsZW1lbnRJbXBsIGV4dGVuZHMgRGVzY3JpYmFibGVFbGVtZW50SW1wbAotCQlpbXBsZW1lbnRzIENvbnRlbnRFbGVtZW50IHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWYXJpYWJpbGl0eVR5cGUoKSA8ZW0+VmFyaWFiaWxpdHkgVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VmFyaWFiaWxpdHlUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFZhcmlhYmlsaXR5VHlwZSBWQVJJQUJJTElUWV9UWVBFX0VERUZBVUxUID0gVmFyaWFiaWxpdHlUeXBlLk5BOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmFyaWFiaWxpdHlUeXBlKCkgPGVtPlZhcmlhYmlsaXR5IFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFZhcmlhYmlsaXR5VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFZhcmlhYmlsaXR5VHlwZSB2YXJpYWJpbGl0eVR5cGUgPSBWQVJJQUJJTElUWV9UWVBFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpIDxlbT5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9lbT59JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgVmFyaWFiaWxpdHlFbGVtZW50IHZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTdXBwb3J0aW5nTWF0ZXJpYWxzKCkgPGVtPlN1cHBvcnRpbmcgTWF0ZXJpYWxzPC9lbT59JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFN1cHBvcnRpbmdNYXRlcmlhbHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxTdXBwb3J0aW5nTWF0ZXJpYWw+IHN1cHBvcnRpbmdNYXRlcmlhbHM7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb25jZXB0c0FuZFBhcGVycygpIDxlbT5Db25jZXB0cyBBbmQgUGFwZXJzPC9lbT59JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENvbmNlcHRzQW5kUGFwZXJzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8Q29uY2VwdD4gY29uY2VwdHNBbmRQYXBlcnM7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDaGVja2xpc3RzKCkgPGVtPkNoZWNrbGlzdHM8L2VtPn0nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q2hlY2tsaXN0cygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PENoZWNrbGlzdD4gY2hlY2tsaXN0czsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEd1aWRlbGluZXMoKSA8ZW0+R3VpZGVsaW5lczwvZW0+fScgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRHdWlkZWxpbmVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8R3VpZGVsaW5lPiBndWlkZWxpbmVzOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RXhhbXBsZXMoKSA8ZW0+RXhhbXBsZXM8L2VtPn0nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RXhhbXBsZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxFeGFtcGxlPiBleGFtcGxlczsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFzc2V0cygpIDxlbT5Bc3NldHM8L2VtPn0nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QXNzZXRzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8UmV1c2FibGVBc3NldD4gYXNzZXRzOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VGVybWRlZmluaXRpb24oKSA8ZW0+VGVybWRlZmluaXRpb248L2VtPn0nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VGVybWRlZmluaXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxUZXJtRGVmaW5pdGlvbj4gdGVybWRlZmluaXRpb247Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29udGVudEVsZW1lbnRJbXBsKCkgewotCQlzdXBlcigpOwotCi0JCS8vVU1BLS0+Ci0JCXJlYXNzaWduRGVmYXVsdFZhbHVlcygpOwotCQkvL1VNQTwtLSAgCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLkNPTlRFTlRfRUxFTUVOVDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVmFyaWFiaWxpdHlUeXBlIGdldFZhcmlhYmlsaXR5VHlwZSgpIHsKLQkJcmV0dXJuIHZhcmlhYmlsaXR5VHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWYXJpYWJpbGl0eVR5cGUoVmFyaWFiaWxpdHlUeXBlIG5ld1ZhcmlhYmlsaXR5VHlwZSkgewotCQlWYXJpYWJpbGl0eVR5cGUgb2xkVmFyaWFiaWxpdHlUeXBlID0gdmFyaWFiaWxpdHlUeXBlOwotCQl2YXJpYWJpbGl0eVR5cGUgPSBuZXdWYXJpYWJpbGl0eVR5cGUgPT0gbnVsbCA/IFZBUklBQklMSVRZX1RZUEVfRURFRkFVTFQKLQkJCQk6IG5ld1ZhcmlhYmlsaXR5VHlwZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5DT05URU5UX0VMRU1FTlRfX1ZBUklBQklMSVRZX1RZUEUsCi0JCQkJCW9sZFZhcmlhYmlsaXR5VHlwZSwgdmFyaWFiaWxpdHlUeXBlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFZhcmlhYmlsaXR5RWxlbWVudCBnZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkgewotCQlpZiAodmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCAhPSBudWxsCi0JCQkJJiYgKChFT2JqZWN0KSB2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KS5lSXNQcm94eSgpKSB7Ci0JCQlJbnRlcm5hbEVPYmplY3Qgb2xkVmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCA9IChJbnRlcm5hbEVPYmplY3QpIHZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQ7Ci0JCQl2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50ID0gKFZhcmlhYmlsaXR5RWxlbWVudCkgZVJlc29sdmVQcm94eShvbGRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KTsKLQkJCWlmICh2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50ICE9IG9sZFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQpIHsKLQkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKAotCQkJCQkJCXRoaXMsCi0JCQkJCQkJTm90aWZpY2F0aW9uLlJFU09MVkUsCi0JCQkJCQkJVW1hUGFja2FnZS5DT05URU5UX0VMRU1FTlRfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQsCi0JCQkJCQkJb2xkVmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCwKLQkJCQkJCQl2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFZhcmlhYmlsaXR5RWxlbWVudCBiYXNpY0dldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSB7Ci0JCXJldHVybiB2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoCi0JCQlWYXJpYWJpbGl0eUVsZW1lbnQgbmV3VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCkgewotCQlWYXJpYWJpbGl0eUVsZW1lbnQgb2xkVmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCA9IHZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQ7Ci0JCXZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQgPSBuZXdWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLkNPTlRFTlRfRUxFTUVOVF9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVCwKLQkJCQkJb2xkVmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCwgdmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0PENvbmNlcHQ+IGdldENvbmNlcHRzQW5kUGFwZXJzKCkgewotCQlpZiAoY29uY2VwdHNBbmRQYXBlcnMgPT0gbnVsbCkgewotCQkJY29uY2VwdHNBbmRQYXBlcnMgPSBuZXcgRU9iamVjdFJlc29sdmluZ0VMaXN0PENvbmNlcHQ+KAotCQkJCQlDb25jZXB0LmNsYXNzLCB0aGlzLAotCQkJCQlVbWFQYWNrYWdlLkNPTlRFTlRfRUxFTUVOVF9fQ09OQ0VQVFNfQU5EX1BBUEVSUyk7Ci0JCX0KLQkJcmV0dXJuIGNvbmNlcHRzQW5kUGFwZXJzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0PENoZWNrbGlzdD4gZ2V0Q2hlY2tsaXN0cygpIHsKLQkJaWYgKGNoZWNrbGlzdHMgPT0gbnVsbCkgewotCQkJY2hlY2tsaXN0cyA9IG5ldyBFT2JqZWN0UmVzb2x2aW5nRUxpc3Q8Q2hlY2tsaXN0PihDaGVja2xpc3QuY2xhc3MsCi0JCQkJCXRoaXMsIFVtYVBhY2thZ2UuQ09OVEVOVF9FTEVNRU5UX19DSEVDS0xJU1RTKTsKLQkJfQotCQlyZXR1cm4gY2hlY2tsaXN0czsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdDxHdWlkZWxpbmU+IGdldEd1aWRlbGluZXMoKSB7Ci0JCWlmIChndWlkZWxpbmVzID09IG51bGwpIHsKLQkJCWd1aWRlbGluZXMgPSBuZXcgRU9iamVjdFJlc29sdmluZ0VMaXN0PEd1aWRlbGluZT4oR3VpZGVsaW5lLmNsYXNzLAotCQkJCQl0aGlzLCBVbWFQYWNrYWdlLkNPTlRFTlRfRUxFTUVOVF9fR1VJREVMSU5FUyk7Ci0JCX0KLQkJcmV0dXJuIGd1aWRlbGluZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3Q8RXhhbXBsZT4gZ2V0RXhhbXBsZXMoKSB7Ci0JCWlmIChleGFtcGxlcyA9PSBudWxsKSB7Ci0JCQlleGFtcGxlcyA9IG5ldyBFT2JqZWN0UmVzb2x2aW5nRUxpc3Q8RXhhbXBsZT4oRXhhbXBsZS5jbGFzcywgdGhpcywKLQkJCQkJVW1hUGFja2FnZS5DT05URU5UX0VMRU1FTlRfX0VYQU1QTEVTKTsKLQkJfQotCQlyZXR1cm4gZXhhbXBsZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3Q8UmV1c2FibGVBc3NldD4gZ2V0QXNzZXRzKCkgewotCQlpZiAoYXNzZXRzID09IG51bGwpIHsKLQkJCWFzc2V0cyA9IG5ldyBFT2JqZWN0UmVzb2x2aW5nRUxpc3Q8UmV1c2FibGVBc3NldD4oCi0JCQkJCVJldXNhYmxlQXNzZXQuY2xhc3MsIHRoaXMsCi0JCQkJCVVtYVBhY2thZ2UuQ09OVEVOVF9FTEVNRU5UX19BU1NFVFMpOwotCQl9Ci0JCXJldHVybiBhc3NldHM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3Q8VGVybURlZmluaXRpb24+IGdldFRlcm1kZWZpbml0aW9uKCkgewotCQlpZiAodGVybWRlZmluaXRpb24gPT0gbnVsbCkgewotCQkJdGVybWRlZmluaXRpb24gPSBuZXcgRU9iamVjdFJlc29sdmluZ0VMaXN0PFRlcm1EZWZpbml0aW9uPigKLQkJCQkJVGVybURlZmluaXRpb24uY2xhc3MsIHRoaXMsCi0JCQkJCVVtYVBhY2thZ2UuQ09OVEVOVF9FTEVNRU5UX19URVJNREVGSU5JVElPTik7Ci0JCX0KLQkJcmV0dXJuIHRlcm1kZWZpbml0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfRUxFTUVOVF9fVkFSSUFCSUxJVFlfVFlQRToKLQkJCXJldHVybiBnZXRWYXJpYWJpbGl0eVR5cGUoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfRUxFTUVOVF9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVDoKLQkJCWlmIChyZXNvbHZlKQotCQkJCXJldHVybiBnZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCk7Ci0JCQlyZXR1cm4gYmFzaWNHZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0VMRU1FTlRfX1NVUFBPUlRJTkdfTUFURVJJQUxTOgotCQkJcmV0dXJuIGdldFN1cHBvcnRpbmdNYXRlcmlhbHMoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfRUxFTUVOVF9fQ09OQ0VQVFNfQU5EX1BBUEVSUzoKLQkJCXJldHVybiBnZXRDb25jZXB0c0FuZFBhcGVycygpOwotCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9FTEVNRU5UX19DSEVDS0xJU1RTOgotCQkJcmV0dXJuIGdldENoZWNrbGlzdHMoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfRUxFTUVOVF9fR1VJREVMSU5FUzoKLQkJCXJldHVybiBnZXRHdWlkZWxpbmVzKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0VMRU1FTlRfX0VYQU1QTEVTOgotCQkJcmV0dXJuIGdldEV4YW1wbGVzKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0VMRU1FTlRfX0FTU0VUUzoKLQkJCXJldHVybiBnZXRBc3NldHMoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfRUxFTUVOVF9fVEVSTURFRklOSVRJT046Ci0JCQlyZXR1cm4gZ2V0VGVybWRlZmluaXRpb24oKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9FTEVNRU5UX19WQVJJQUJJTElUWV9UWVBFOgotCQkJc2V0VmFyaWFiaWxpdHlUeXBlKChWYXJpYWJpbGl0eVR5cGUpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfRUxFTUVOVF9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVDoKLQkJCXNldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKFZhcmlhYmlsaXR5RWxlbWVudCkgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9FTEVNRU5UX19TVVBQT1JUSU5HX01BVEVSSUFMUzoKLQkJCWdldFN1cHBvcnRpbmdNYXRlcmlhbHMoKS5jbGVhcigpOwotCQkJZ2V0U3VwcG9ydGluZ01hdGVyaWFscygpLmFkZEFsbCgKLQkJCQkJKENvbGxlY3Rpb248PyBleHRlbmRzIFN1cHBvcnRpbmdNYXRlcmlhbD4pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfRUxFTUVOVF9fQ09OQ0VQVFNfQU5EX1BBUEVSUzoKLQkJCWdldENvbmNlcHRzQW5kUGFwZXJzKCkuY2xlYXIoKTsKLQkJCWdldENvbmNlcHRzQW5kUGFwZXJzKCkuYWRkQWxsKAotCQkJCQkoQ29sbGVjdGlvbjw/IGV4dGVuZHMgQ29uY2VwdD4pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfRUxFTUVOVF9fQ0hFQ0tMSVNUUzoKLQkJCWdldENoZWNrbGlzdHMoKS5jbGVhcigpOwotCQkJZ2V0Q2hlY2tsaXN0cygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgQ2hlY2tsaXN0PikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9FTEVNRU5UX19HVUlERUxJTkVTOgotCQkJZ2V0R3VpZGVsaW5lcygpLmNsZWFyKCk7Ci0JCQlnZXRHdWlkZWxpbmVzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBHdWlkZWxpbmU+KSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0VMRU1FTlRfX0VYQU1QTEVTOgotCQkJZ2V0RXhhbXBsZXMoKS5jbGVhcigpOwotCQkJZ2V0RXhhbXBsZXMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIEV4YW1wbGU+KSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0VMRU1FTlRfX0FTU0VUUzoKLQkJCWdldEFzc2V0cygpLmNsZWFyKCk7Ci0JCQlnZXRBc3NldHMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFJldXNhYmxlQXNzZXQ+KSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0VMRU1FTlRfX1RFUk1ERUZJTklUSU9OOgotCQkJZ2V0VGVybWRlZmluaXRpb24oKS5jbGVhcigpOwotCQkJZ2V0VGVybWRlZmluaXRpb24oKS5hZGRBbGwoCi0JCQkJCShDb2xsZWN0aW9uPD8gZXh0ZW5kcyBUZXJtRGVmaW5pdGlvbj4pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0VMRU1FTlRfX1ZBUklBQklMSVRZX1RZUEU6Ci0JCQlzZXRWYXJpYWJpbGl0eVR5cGUoVkFSSUFCSUxJVFlfVFlQRV9FREVGQVVMVCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0VMRU1FTlRfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQ6Ci0JCQlzZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KChWYXJpYWJpbGl0eUVsZW1lbnQpIG51bGwpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9FTEVNRU5UX19TVVBQT1JUSU5HX01BVEVSSUFMUzoKLQkJCWdldFN1cHBvcnRpbmdNYXRlcmlhbHMoKS5jbGVhcigpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9FTEVNRU5UX19DT05DRVBUU19BTkRfUEFQRVJTOgotCQkJZ2V0Q29uY2VwdHNBbmRQYXBlcnMoKS5jbGVhcigpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9FTEVNRU5UX19DSEVDS0xJU1RTOgotCQkJZ2V0Q2hlY2tsaXN0cygpLmNsZWFyKCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0VMRU1FTlRfX0dVSURFTElORVM6Ci0JCQlnZXRHdWlkZWxpbmVzKCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfRUxFTUVOVF9fRVhBTVBMRVM6Ci0JCQlnZXRFeGFtcGxlcygpLmNsZWFyKCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0VMRU1FTlRfX0FTU0VUUzoKLQkJCWdldEFzc2V0cygpLmNsZWFyKCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0VMRU1FTlRfX1RFUk1ERUZJTklUSU9OOgotCQkJZ2V0VGVybWRlZmluaXRpb24oKS5jbGVhcigpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCS8vVU1BLS0+Ci0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gZ2V0RmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWUoZmVhdHVyZUlEKTsKLQkJaWYgKGZlYXR1cmUgIT0gbnVsbCkgewotCQkJcmV0dXJuIGlzRmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWVTZXQoZmVhdHVyZSk7Ci0JCX0KLQkJLy9VTUE8LS0JCQotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9FTEVNRU5UX19WQVJJQUJJTElUWV9UWVBFOgotCQkJcmV0dXJuIHZhcmlhYmlsaXR5VHlwZSAhPSBWQVJJQUJJTElUWV9UWVBFX0VERUZBVUxUOwotCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9FTEVNRU5UX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UOgotCQkJcmV0dXJuIHZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQgIT0gbnVsbDsKLQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfRUxFTUVOVF9fU1VQUE9SVElOR19NQVRFUklBTFM6Ci0JCQlyZXR1cm4gc3VwcG9ydGluZ01hdGVyaWFscyAhPSBudWxsCi0JCQkJCSYmICFzdXBwb3J0aW5nTWF0ZXJpYWxzLmlzRW1wdHkoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfRUxFTUVOVF9fQ09OQ0VQVFNfQU5EX1BBUEVSUzoKLQkJCXJldHVybiBjb25jZXB0c0FuZFBhcGVycyAhPSBudWxsICYmICFjb25jZXB0c0FuZFBhcGVycy5pc0VtcHR5KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0VMRU1FTlRfX0NIRUNLTElTVFM6Ci0JCQlyZXR1cm4gY2hlY2tsaXN0cyAhPSBudWxsICYmICFjaGVja2xpc3RzLmlzRW1wdHkoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfRUxFTUVOVF9fR1VJREVMSU5FUzoKLQkJCXJldHVybiBndWlkZWxpbmVzICE9IG51bGwgJiYgIWd1aWRlbGluZXMuaXNFbXB0eSgpOwotCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9FTEVNRU5UX19FWEFNUExFUzoKLQkJCXJldHVybiBleGFtcGxlcyAhPSBudWxsICYmICFleGFtcGxlcy5pc0VtcHR5KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0VMRU1FTlRfX0FTU0VUUzoKLQkJCXJldHVybiBhc3NldHMgIT0gbnVsbCAmJiAhYXNzZXRzLmlzRW1wdHkoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfRUxFTUVOVF9fVEVSTURFRklOSVRJT046Ci0JCQlyZXR1cm4gdGVybWRlZmluaXRpb24gIT0gbnVsbCAmJiAhdGVybWRlZmluaXRpb24uaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdDxTdXBwb3J0aW5nTWF0ZXJpYWw+IGdldFN1cHBvcnRpbmdNYXRlcmlhbHMoKSB7Ci0JCWlmIChzdXBwb3J0aW5nTWF0ZXJpYWxzID09IG51bGwpIHsKLQkJCXN1cHBvcnRpbmdNYXRlcmlhbHMgPSBuZXcgRU9iamVjdFJlc29sdmluZ0VMaXN0PFN1cHBvcnRpbmdNYXRlcmlhbD4oCi0JCQkJCVN1cHBvcnRpbmdNYXRlcmlhbC5jbGFzcywgdGhpcywKLQkJCQkJVW1hUGFja2FnZS5DT05URU5UX0VMRU1FTlRfX1NVUFBPUlRJTkdfTUFURVJJQUxTKTsKLQkJfQotCQlyZXR1cm4gc3VwcG9ydGluZ01hdGVyaWFsczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgaW50IGVCYXNlU3RydWN0dXJhbEZlYXR1cmVJRChpbnQgZGVyaXZlZEZlYXR1cmVJRCwgQ2xhc3M8Pz4gYmFzZUNsYXNzKSB7Ci0JCWlmIChiYXNlQ2xhc3MgPT0gVmFyaWFiaWxpdHlFbGVtZW50LmNsYXNzKSB7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0VMRU1FTlRfX1ZBUklBQklMSVRZX1RZUEU6Ci0JCQkJcmV0dXJuIFVtYVBhY2thZ2UuVkFSSUFCSUxJVFlfRUxFTUVOVF9fVkFSSUFCSUxJVFlfVFlQRTsKLQkJCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0VMRU1FTlRfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQ6Ci0JCQkJcmV0dXJuIFVtYVBhY2thZ2UuVkFSSUFCSUxJVFlfRUxFTUVOVF9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVDsKLQkJCWRlZmF1bHQ6Ci0JCQkJcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCXJldHVybiBzdXBlci5lQmFzZVN0cnVjdHVyYWxGZWF0dXJlSUQoZGVyaXZlZEZlYXR1cmVJRCwgYmFzZUNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgaW50IGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChpbnQgYmFzZUZlYXR1cmVJRCwgQ2xhc3M8Pz4gYmFzZUNsYXNzKSB7Ci0JCWlmIChiYXNlQ2xhc3MgPT0gVmFyaWFiaWxpdHlFbGVtZW50LmNsYXNzKSB7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5WQVJJQUJJTElUWV9FTEVNRU5UX19WQVJJQUJJTElUWV9UWVBFOgotCQkJCXJldHVybiBVbWFQYWNrYWdlLkNPTlRFTlRfRUxFTUVOVF9fVkFSSUFCSUxJVFlfVFlQRTsKLQkJCWNhc2UgVW1hUGFja2FnZS5WQVJJQUJJTElUWV9FTEVNRU5UX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UOgotCQkJCXJldHVybiBVbWFQYWNrYWdlLkNPTlRFTlRfRUxFTUVOVF9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVDsKLQkJCWRlZmF1bHQ6Ci0JCQkJcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCXJldHVybiBzdXBlci5lRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoYmFzZUZlYXR1cmVJRCwgYmFzZUNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkKLQkJCXJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHZhcmlhYmlsaXR5VHlwZTogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZCh2YXJpYWJpbGl0eVR5cGUpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLQkvLwotCS8vIFN0YXJ0IGN1c3RvbSBjb2RlCi0JLy8KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5OYW1lZEVsZW1lbnRJbXBsI3NldE5hbWUoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuZXdOYW1lKSB7Ci0JCWlmIChwcmVzZW50YXRpb24gPT0gbnVsbCkgewotCQkJc3VwZXIuc2V0TmFtZShuZXdOYW1lKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCVN0cmluZyBvbGROYW1lID0gbmFtZTsKLQkJc3VwZXIuc2V0TmFtZShuZXdOYW1lKTsKLQkJaWYgKG5ld05hbWUgIT0gbnVsbCAmJiAhbmV3TmFtZS5lcXVhbHMob2xkTmFtZSkpIHsKLQkJCXByZXNlbnRhdGlvbi5zZXROYW1lKFVtYVV0aWwuY3JlYXRlQ29udGVudERlc2NyaXB0aW9uTmFtZSh0aGlzKSk7Ci0JCX0KLQl9Ci0KLX0gLy9Db250ZW50RWxlbWVudEltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Db250ZW50UGFja2FnZUltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Db250ZW50UGFja2FnZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTVmZDdjNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvQ29udGVudFBhY2thZ2VJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Q29udGVudCBQYWNrYWdlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQ29udGVudFBhY2thZ2VJbXBsI2dldENvbnRlbnRFbGVtZW50cyA8ZW0+Q29udGVudCBFbGVtZW50czwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIENvbnRlbnRQYWNrYWdlSW1wbCBleHRlbmRzIE1ldGhvZFBhY2thZ2VJbXBsIGltcGxlbWVudHMKLQkJQ29udGVudFBhY2thZ2UgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q29udGVudEVsZW1lbnRzKCkgPGVtPkNvbnRlbnQgRWxlbWVudHM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q29udGVudEVsZW1lbnRzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8Q29udGVudEVsZW1lbnQ+IGNvbnRlbnRFbGVtZW50czsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb250ZW50UGFja2FnZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJLy9VTUEtLT4KLQkJcmVhc3NpZ25EZWZhdWx0VmFsdWVzKCk7Ci0JCS8vVU1BPC0tICAKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuQ09OVEVOVF9QQUNLQUdFOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0PENvbnRlbnRFbGVtZW50PiBnZXRDb250ZW50RWxlbWVudHMoKSB7Ci0JCWlmIChjb250ZW50RWxlbWVudHMgPT0gbnVsbCkgewotCQkJY29udGVudEVsZW1lbnRzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0LlJlc29sdmluZzxDb250ZW50RWxlbWVudD4oCi0JCQkJCUNvbnRlbnRFbGVtZW50LmNsYXNzLCB0aGlzLAotCQkJCQlVbWFQYWNrYWdlLkNPTlRFTlRfUEFDS0FHRV9fQ09OVEVOVF9FTEVNRU5UUyk7Ci0JCX0KLQkJcmV0dXJuIGNvbnRlbnRFbGVtZW50czsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLAotCQkJaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9QQUNLQUdFX19DT05URU5UX0VMRU1FTlRTOgotCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PikgZ2V0Q29udGVudEVsZW1lbnRzKCkpLmJhc2ljUmVtb3ZlKAotCQkJCQlvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfUEFDS0FHRV9fQ09OVEVOVF9FTEVNRU5UUzoKLQkJCXJldHVybiBnZXRDb250ZW50RWxlbWVudHMoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9QQUNLQUdFX19DT05URU5UX0VMRU1FTlRTOgotCQkJZ2V0Q29udGVudEVsZW1lbnRzKCkuY2xlYXIoKTsKLQkJCWdldENvbnRlbnRFbGVtZW50cygpLmFkZEFsbCgKLQkJCQkJKENvbGxlY3Rpb248PyBleHRlbmRzIENvbnRlbnRFbGVtZW50PikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfUEFDS0FHRV9fQ09OVEVOVF9FTEVNRU5UUzoKLQkJCWdldENvbnRlbnRFbGVtZW50cygpLmNsZWFyKCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJLy9VTUEtLT4KLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBnZXRGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZShmZWF0dXJlSUQpOwotCQlpZiAoZmVhdHVyZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gaXNGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZVNldChmZWF0dXJlKTsKLQkJfQotCQkvL1VNQTwtLQkJCi0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX1BBQ0tBR0VfX0NPTlRFTlRfRUxFTUVOVFM6Ci0JCQlyZXR1cm4gY29udGVudEVsZW1lbnRzICE9IG51bGwgJiYgIWNvbnRlbnRFbGVtZW50cy5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotfSAvL0NvbnRlbnRQYWNrYWdlSW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0NvcmVTZW1hbnRpY01vZGVsQnJpZGdlSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0NvcmVTZW1hbnRpY01vZGVsQnJpZGdlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YzlkM2ZkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Db3JlU2VtYW50aWNNb2RlbEJyaWRnZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db3JlU2VtYW50aWNNb2RlbEJyaWRnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Q29yZSBTZW1hbnRpYyBNb2RlbCBCcmlkZ2U8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Db3JlU2VtYW50aWNNb2RlbEJyaWRnZUltcGwjZ2V0RWxlbWVudCA8ZW0+RWxlbWVudDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIENvcmVTZW1hbnRpY01vZGVsQnJpZGdlSW1wbCBleHRlbmRzIFNlbWFudGljTW9kZWxCcmlkZ2VJbXBsCi0JCWltcGxlbWVudHMgQ29yZVNlbWFudGljTW9kZWxCcmlkZ2UgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RWxlbWVudCgpIDxlbT5FbGVtZW50PC9lbT59JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRFbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRWxlbWVudCBlbGVtZW50OwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvcmVTZW1hbnRpY01vZGVsQnJpZGdlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQotCQkvL1VNQS0tPgotCQlyZWFzc2lnbkRlZmF1bHRWYWx1ZXMoKTsKLQkJLy9VTUE8LS0gIAotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5DT1JFX1NFTUFOVElDX01PREVMX0JSSURHRTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRWxlbWVudCBnZXRFbGVtZW50KCkgewotCQlpZiAoZWxlbWVudCAhPSBudWxsICYmICgoRU9iamVjdCkgZWxlbWVudCkuZUlzUHJveHkoKSkgewotCQkJSW50ZXJuYWxFT2JqZWN0IG9sZEVsZW1lbnQgPSAoSW50ZXJuYWxFT2JqZWN0KSBlbGVtZW50OwotCQkJZWxlbWVudCA9IChFbGVtZW50KSBlUmVzb2x2ZVByb3h5KG9sZEVsZW1lbnQpOwotCQkJaWYgKGVsZW1lbnQgIT0gb2xkRWxlbWVudCkgewotCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlJFU09MVkUsCi0JCQkJCQkJVW1hUGFja2FnZS5DT1JFX1NFTUFOVElDX01PREVMX0JSSURHRV9fRUxFTUVOVCwKLQkJCQkJCQlvbGRFbGVtZW50LCBlbGVtZW50KSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVsZW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVsZW1lbnQgYmFzaWNHZXRFbGVtZW50KCkgewotCQlyZXR1cm4gZWxlbWVudDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFbGVtZW50KEVsZW1lbnQgbmV3RWxlbWVudCkgewotCQlFbGVtZW50IG9sZEVsZW1lbnQgPSBlbGVtZW50OwotCQllbGVtZW50ID0gbmV3RWxlbWVudDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5DT1JFX1NFTUFOVElDX01PREVMX0JSSURHRV9fRUxFTUVOVCwgb2xkRWxlbWVudCwKLQkJCQkJZWxlbWVudCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkNPUkVfU0VNQU5USUNfTU9ERUxfQlJJREdFX19FTEVNRU5UOgotCQkJaWYgKHJlc29sdmUpCi0JCQkJcmV0dXJuIGdldEVsZW1lbnQoKTsKLQkJCXJldHVybiBiYXNpY0dldEVsZW1lbnQoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuQ09SRV9TRU1BTlRJQ19NT0RFTF9CUklER0VfX0VMRU1FTlQ6Ci0JCQlzZXRFbGVtZW50KChFbGVtZW50KSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuQ09SRV9TRU1BTlRJQ19NT0RFTF9CUklER0VfX0VMRU1FTlQ6Ci0JCQlzZXRFbGVtZW50KChFbGVtZW50KSBudWxsKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQkvL1VNQS0tPgotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IGdldEZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlKGZlYXR1cmVJRCk7Ci0JCWlmIChmZWF0dXJlICE9IG51bGwpIHsKLQkJCXJldHVybiBpc0ZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlU2V0KGZlYXR1cmUpOwotCQl9Ci0JCS8vVU1BPC0tCQkKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkNPUkVfU0VNQU5USUNfTU9ERUxfQlJJREdFX19FTEVNRU5UOgotCQkJcmV0dXJuIGVsZW1lbnQgIT0gbnVsbDsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi19IC8vQ29yZVNlbWFudGljTW9kZWxCcmlkZ2VJbXBsCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvQ3VzdG9tQ2F0ZWdvcnlJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvQ3VzdG9tQ2F0ZWdvcnlJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3OWZhNDIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0N1c3RvbUNhdGVnb3J5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0UmVzb2x2aW5nRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50Q2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DdXN0b21DYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaWJhYmxlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5DdXN0b20gQ2F0ZWdvcnk8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5DdXN0b21DYXRlZ29yeUltcGwjZ2V0Q2F0ZWdvcml6ZWRFbGVtZW50cyA8ZW0+Q2F0ZWdvcml6ZWQgRWxlbWVudHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5DdXN0b21DYXRlZ29yeUltcGwjZ2V0U3ViQ2F0ZWdvcmllcyA8ZW0+U3ViIENhdGVnb3JpZXM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBDdXN0b21DYXRlZ29yeUltcGwgZXh0ZW5kcyBDb250ZW50Q2F0ZWdvcnlJbXBsIGltcGxlbWVudHMKLQkJQ3VzdG9tQ2F0ZWdvcnkgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q2F0ZWdvcml6ZWRFbGVtZW50cygpIDxlbT5DYXRlZ29yaXplZCBFbGVtZW50czwvZW0+fScgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDYXRlZ29yaXplZEVsZW1lbnRzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8RGVzY3JpYmFibGVFbGVtZW50PiBjYXRlZ29yaXplZEVsZW1lbnRzOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U3ViQ2F0ZWdvcmllcygpIDxlbT5TdWIgQ2F0ZWdvcmllczwvZW0+fScgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTdWJDYXRlZ29yaWVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8Q29udGVudENhdGVnb3J5PiBzdWJDYXRlZ29yaWVzOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEN1c3RvbUNhdGVnb3J5SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQotCQkvL1VNQS0tPgotCQlyZWFzc2lnbkRlZmF1bHRWYWx1ZXMoKTsKLQkJLy9VTUE8LS0gIAotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5DVVNUT01fQ0FURUdPUlk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3Q8RGVzY3JpYmFibGVFbGVtZW50PiBnZXRDYXRlZ29yaXplZEVsZW1lbnRzKCkgewotCQlpZiAoY2F0ZWdvcml6ZWRFbGVtZW50cyA9PSBudWxsKSB7Ci0JCQljYXRlZ29yaXplZEVsZW1lbnRzID0gbmV3IEVPYmplY3RSZXNvbHZpbmdFTGlzdDxEZXNjcmliYWJsZUVsZW1lbnQ+KAotCQkJCQlEZXNjcmliYWJsZUVsZW1lbnQuY2xhc3MsIHRoaXMsCi0JCQkJCVVtYVBhY2thZ2UuQ1VTVE9NX0NBVEVHT1JZX19DQVRFR09SSVpFRF9FTEVNRU5UUyk7Ci0JCX0KLQkJcmV0dXJuIGNhdGVnb3JpemVkRWxlbWVudHM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3Q8Q29udGVudENhdGVnb3J5PiBnZXRTdWJDYXRlZ29yaWVzKCkgewotCQlpZiAoc3ViQ2F0ZWdvcmllcyA9PSBudWxsKSB7Ci0JCQlzdWJDYXRlZ29yaWVzID0gbmV3IEVPYmplY3RSZXNvbHZpbmdFTGlzdDxDb250ZW50Q2F0ZWdvcnk+KAotCQkJCQlDb250ZW50Q2F0ZWdvcnkuY2xhc3MsIHRoaXMsCi0JCQkJCVVtYVBhY2thZ2UuQ1VTVE9NX0NBVEVHT1JZX19TVUJfQ0FURUdPUklFUyk7Ci0JCX0KLQkJcmV0dXJuIHN1YkNhdGVnb3JpZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuQ1VTVE9NX0NBVEVHT1JZX19DQVRFR09SSVpFRF9FTEVNRU5UUzoKLQkJCXJldHVybiBnZXRDYXRlZ29yaXplZEVsZW1lbnRzKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5DVVNUT01fQ0FURUdPUllfX1NVQl9DQVRFR09SSUVTOgotCQkJcmV0dXJuIGdldFN1YkNhdGVnb3JpZXMoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuQ1VTVE9NX0NBVEVHT1JZX19DQVRFR09SSVpFRF9FTEVNRU5UUzoKLQkJCWdldENhdGVnb3JpemVkRWxlbWVudHMoKS5jbGVhcigpOwotCQkJZ2V0Q2F0ZWdvcml6ZWRFbGVtZW50cygpLmFkZEFsbCgKLQkJCQkJKENvbGxlY3Rpb248PyBleHRlbmRzIERlc2NyaWJhYmxlRWxlbWVudD4pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkNVU1RPTV9DQVRFR09SWV9fU1VCX0NBVEVHT1JJRVM6Ci0JCQlnZXRTdWJDYXRlZ29yaWVzKCkuY2xlYXIoKTsKLQkJCWdldFN1YkNhdGVnb3JpZXMoKS5hZGRBbGwoCi0JCQkJCShDb2xsZWN0aW9uPD8gZXh0ZW5kcyBDb250ZW50Q2F0ZWdvcnk+KSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuQ1VTVE9NX0NBVEVHT1JZX19DQVRFR09SSVpFRF9FTEVNRU5UUzoKLQkJCWdldENhdGVnb3JpemVkRWxlbWVudHMoKS5jbGVhcigpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuQ1VTVE9NX0NBVEVHT1JZX19TVUJfQ0FURUdPUklFUzoKLQkJCWdldFN1YkNhdGVnb3JpZXMoKS5jbGVhcigpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCS8vVU1BLS0+Ci0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gZ2V0RmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWUoZmVhdHVyZUlEKTsKLQkJaWYgKGZlYXR1cmUgIT0gbnVsbCkgewotCQkJcmV0dXJuIGlzRmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWVTZXQoZmVhdHVyZSk7Ci0JCX0KLQkJLy9VTUE8LS0JCQotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuQ1VTVE9NX0NBVEVHT1JZX19DQVRFR09SSVpFRF9FTEVNRU5UUzoKLQkJCXJldHVybiBjYXRlZ29yaXplZEVsZW1lbnRzICE9IG51bGwKLQkJCQkJJiYgIWNhdGVnb3JpemVkRWxlbWVudHMuaXNFbXB0eSgpOwotCQljYXNlIFVtYVBhY2thZ2UuQ1VTVE9NX0NBVEVHT1JZX19TVUJfQ0FURUdPUklFUzoKLQkJCXJldHVybiBzdWJDYXRlZ29yaWVzICE9IG51bGwgJiYgIXN1YkNhdGVnb3JpZXMuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLX0gLy9DdXN0b21DYXRlZ29yeUltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9EZWxpdmVyYWJsZURlc2NyaXB0aW9uSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0RlbGl2ZXJhYmxlRGVzY3JpcHRpb25JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwMzVmODkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0RlbGl2ZXJhYmxlRGVzY3JpcHRpb25JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJhYmxlRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RGVsaXZlcmFibGUgRGVzY3JpcHRpb248L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5EZWxpdmVyYWJsZURlc2NyaXB0aW9uSW1wbCNnZXRFeHRlcm5hbERlc2NyaXB0aW9uIDxlbT5FeHRlcm5hbCBEZXNjcmlwdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkRlbGl2ZXJhYmxlRGVzY3JpcHRpb25JbXBsI2dldFBhY2thZ2luZ0d1aWRhbmNlIDxlbT5QYWNrYWdpbmcgR3VpZGFuY2U8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEZWxpdmVyYWJsZURlc2NyaXB0aW9uSW1wbCBleHRlbmRzIFdvcmtQcm9kdWN0RGVzY3JpcHRpb25JbXBsCi0JCWltcGxlbWVudHMgRGVsaXZlcmFibGVEZXNjcmlwdGlvbiB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RXh0ZXJuYWxEZXNjcmlwdGlvbigpIDxlbT5FeHRlcm5hbCBEZXNjcmlwdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RXh0ZXJuYWxEZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhURVJOQUxfREVTQ1JJUFRJT05fRURFRkFVTFQgPSAiIjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEV4dGVybmFsRGVzY3JpcHRpb24oKSA8ZW0+RXh0ZXJuYWwgRGVzY3JpcHRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEV4dGVybmFsRGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZXh0ZXJuYWxEZXNjcmlwdGlvbiA9IEVYVEVSTkFMX0RFU0NSSVBUSU9OX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBhY2thZ2luZ0d1aWRhbmNlKCkgPGVtPlBhY2thZ2luZyBHdWlkYW5jZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UGFja2FnaW5nR3VpZGFuY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBBQ0tBR0lOR19HVUlEQU5DRV9FREVGQVVMVCA9ICIiOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UGFja2FnaW5nR3VpZGFuY2UoKSA8ZW0+UGFja2FnaW5nIEd1aWRhbmNlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQYWNrYWdpbmdHdWlkYW5jZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBwYWNrYWdpbmdHdWlkYW5jZSA9IFBBQ0tBR0lOR19HVUlEQU5DRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBEZWxpdmVyYWJsZURlc2NyaXB0aW9uSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQotCQkvL1VNQS0tPgotCQlyZWFzc2lnbkRlZmF1bHRWYWx1ZXMoKTsKLQkJLy9VTUE8LS0gIAotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5ERUxJVkVSQUJMRV9ERVNDUklQVElPTjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEV4dGVybmFsRGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBleHRlcm5hbERlc2NyaXB0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEV4dGVybmFsRGVzY3JpcHRpb24oU3RyaW5nIG5ld0V4dGVybmFsRGVzY3JpcHRpb24pIHsKLQkJU3RyaW5nIG9sZEV4dGVybmFsRGVzY3JpcHRpb24gPSBleHRlcm5hbERlc2NyaXB0aW9uOwotCQlleHRlcm5hbERlc2NyaXB0aW9uID0gbmV3RXh0ZXJuYWxEZXNjcmlwdGlvbjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5ERUxJVkVSQUJMRV9ERVNDUklQVElPTl9fRVhURVJOQUxfREVTQ1JJUFRJT04sCi0JCQkJCW9sZEV4dGVybmFsRGVzY3JpcHRpb24sIGV4dGVybmFsRGVzY3JpcHRpb24pKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFBhY2thZ2luZ0d1aWRhbmNlKCkgewotCQlyZXR1cm4gcGFja2FnaW5nR3VpZGFuY2U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UGFja2FnaW5nR3VpZGFuY2UoU3RyaW5nIG5ld1BhY2thZ2luZ0d1aWRhbmNlKSB7Ci0JCVN0cmluZyBvbGRQYWNrYWdpbmdHdWlkYW5jZSA9IHBhY2thZ2luZ0d1aWRhbmNlOwotCQlwYWNrYWdpbmdHdWlkYW5jZSA9IG5ld1BhY2thZ2luZ0d1aWRhbmNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLkRFTElWRVJBQkxFX0RFU0NSSVBUSU9OX19QQUNLQUdJTkdfR1VJREFOQ0UsCi0JCQkJCW9sZFBhY2thZ2luZ0d1aWRhbmNlLCBwYWNrYWdpbmdHdWlkYW5jZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJBQkxFX0RFU0NSSVBUSU9OX19FWFRFUk5BTF9ERVNDUklQVElPTjoKLQkJCXJldHVybiBnZXRFeHRlcm5hbERlc2NyaXB0aW9uKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSQUJMRV9ERVNDUklQVElPTl9fUEFDS0FHSU5HX0dVSURBTkNFOgotCQkJcmV0dXJuIGdldFBhY2thZ2luZ0d1aWRhbmNlKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJBQkxFX0RFU0NSSVBUSU9OX19FWFRFUk5BTF9ERVNDUklQVElPTjoKLQkJCXNldEV4dGVybmFsRGVzY3JpcHRpb24oKFN0cmluZykgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUkFCTEVfREVTQ1JJUFRJT05fX1BBQ0tBR0lOR19HVUlEQU5DRToKLQkJCXNldFBhY2thZ2luZ0d1aWRhbmNlKChTdHJpbmcpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSQUJMRV9ERVNDUklQVElPTl9fRVhURVJOQUxfREVTQ1JJUFRJT046Ci0JCQlzZXRFeHRlcm5hbERlc2NyaXB0aW9uKEVYVEVSTkFMX0RFU0NSSVBUSU9OX0VERUZBVUxUKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJBQkxFX0RFU0NSSVBUSU9OX19QQUNLQUdJTkdfR1VJREFOQ0U6Ci0JCQlzZXRQYWNrYWdpbmdHdWlkYW5jZShQQUNLQUdJTkdfR1VJREFOQ0VfRURFRkFVTFQpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCS8vVU1BLS0+Ci0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gZ2V0RmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWUoZmVhdHVyZUlEKTsKLQkJaWYgKGZlYXR1cmUgIT0gbnVsbCkgewotCQkJcmV0dXJuIGlzRmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWVTZXQoZmVhdHVyZSk7Ci0JCX0KLQkJLy9VTUE8LS0JCQotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUkFCTEVfREVTQ1JJUFRJT05fX0VYVEVSTkFMX0RFU0NSSVBUSU9OOgotCQkJcmV0dXJuIEVYVEVSTkFMX0RFU0NSSVBUSU9OX0VERUZBVUxUID09IG51bGwgPyBleHRlcm5hbERlc2NyaXB0aW9uICE9IG51bGwKLQkJCQkJOiAhRVhURVJOQUxfREVTQ1JJUFRJT05fRURFRkFVTFQKLQkJCQkJCQkuZXF1YWxzKGV4dGVybmFsRGVzY3JpcHRpb24pOwotCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUkFCTEVfREVTQ1JJUFRJT05fX1BBQ0tBR0lOR19HVUlEQU5DRToKLQkJCXJldHVybiBQQUNLQUdJTkdfR1VJREFOQ0VfRURFRkFVTFQgPT0gbnVsbCA/IHBhY2thZ2luZ0d1aWRhbmNlICE9IG51bGwKLQkJCQkJOiAhUEFDS0FHSU5HX0dVSURBTkNFX0VERUZBVUxULmVxdWFscyhwYWNrYWdpbmdHdWlkYW5jZSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKQotCQkJcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoZXh0ZXJuYWxEZXNjcmlwdGlvbjogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChleHRlcm5hbERlc2NyaXB0aW9uKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBwYWNrYWdpbmdHdWlkYW5jZTogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChwYWNrYWdpbmdHdWlkYW5jZSk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL0RlbGl2ZXJhYmxlRGVzY3JpcHRpb25JbXBsCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvRGVsaXZlcmFibGVJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvRGVsaXZlcmFibGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiNzBkMjMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0RlbGl2ZXJhYmxlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0UmVzb2x2aW5nRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkRlbGl2ZXJhYmxlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRGVsaXZlcmFibGVJbXBsI2dldERlbGl2ZXJlZFdvcmtQcm9kdWN0cyA8ZW0+RGVsaXZlcmVkIFdvcmsgUHJvZHVjdHM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEZWxpdmVyYWJsZUltcGwgZXh0ZW5kcyBXb3JrUHJvZHVjdEltcGwgaW1wbGVtZW50cyBEZWxpdmVyYWJsZSB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZWxpdmVyZWRXb3JrUHJvZHVjdHMoKSA8ZW0+RGVsaXZlcmVkIFdvcmsgUHJvZHVjdHM8L2VtPn0nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGVsaXZlcmVkV29ya1Byb2R1Y3RzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8V29ya1Byb2R1Y3Q+IGRlbGl2ZXJlZFdvcmtQcm9kdWN0czsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBEZWxpdmVyYWJsZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJLy9VTUEtLT4KLQkJcmVhc3NpZ25EZWZhdWx0VmFsdWVzKCk7Ci0JCS8vVU1BPC0tICAKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuREVMSVZFUkFCTEU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3Q8V29ya1Byb2R1Y3Q+IGdldERlbGl2ZXJlZFdvcmtQcm9kdWN0cygpIHsKLQkJaWYgKGRlbGl2ZXJlZFdvcmtQcm9kdWN0cyA9PSBudWxsKSB7Ci0JCQlkZWxpdmVyZWRXb3JrUHJvZHVjdHMgPSBuZXcgRU9iamVjdFJlc29sdmluZ0VMaXN0PFdvcmtQcm9kdWN0PigKLQkJCQkJV29ya1Byb2R1Y3QuY2xhc3MsIHRoaXMsCi0JCQkJCVVtYVBhY2thZ2UuREVMSVZFUkFCTEVfX0RFTElWRVJFRF9XT1JLX1BST0RVQ1RTKTsKLQkJfQotCQlyZXR1cm4gZGVsaXZlcmVkV29ya1Byb2R1Y3RzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJBQkxFX19ERUxJVkVSRURfV09SS19QUk9EVUNUUzoKLQkJCXJldHVybiBnZXREZWxpdmVyZWRXb3JrUHJvZHVjdHMoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUkFCTEVfX0RFTElWRVJFRF9XT1JLX1BST0RVQ1RTOgotCQkJZ2V0RGVsaXZlcmVkV29ya1Byb2R1Y3RzKCkuY2xlYXIoKTsKLQkJCWdldERlbGl2ZXJlZFdvcmtQcm9kdWN0cygpLmFkZEFsbCgKLQkJCQkJKENvbGxlY3Rpb248PyBleHRlbmRzIFdvcmtQcm9kdWN0PikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJBQkxFX19ERUxJVkVSRURfV09SS19QUk9EVUNUUzoKLQkJCWdldERlbGl2ZXJlZFdvcmtQcm9kdWN0cygpLmNsZWFyKCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJLy9VTUEtLT4KLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBnZXRGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZShmZWF0dXJlSUQpOwotCQlpZiAoZmVhdHVyZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gaXNGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZVNldChmZWF0dXJlKTsKLQkJfQotCQkvL1VNQTwtLQkJCi0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSQUJMRV9fREVMSVZFUkVEX1dPUktfUFJPRFVDVFM6Ci0JCQlyZXR1cm4gZGVsaXZlcmVkV29ya1Byb2R1Y3RzICE9IG51bGwKLQkJCQkJJiYgIWRlbGl2ZXJlZFdvcmtQcm9kdWN0cy5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotfSAvL0RlbGl2ZXJhYmxlSW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMDYzMzBiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RGVsaXZlcnkgUHJvY2VzcyBEZXNjcmlwdGlvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uSW1wbCNnZXRTY2FsZSA8ZW0+U2NhbGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbkltcGwjZ2V0UHJvamVjdENoYXJhY3RlcmlzdGljcyA8ZW0+UHJvamVjdCBDaGFyYWN0ZXJpc3RpY3M8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbkltcGwjZ2V0Umlza0xldmVsIDxlbT5SaXNrIExldmVsPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25JbXBsI2dldEVzdGltYXRpbmdUZWNobmlxdWUgPGVtPkVzdGltYXRpbmcgVGVjaG5pcXVlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25JbXBsI2dldFByb2plY3RNZW1iZXJFeHBlcnRpc2UgPGVtPlByb2plY3QgTWVtYmVyIEV4cGVydGlzZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uSW1wbCNnZXRUeXBlT2ZDb250cmFjdCA8ZW0+VHlwZSBPZiBDb250cmFjdDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uSW1wbCBleHRlbmRzIFByb2Nlc3NEZXNjcmlwdGlvbkltcGwKLQkJaW1wbGVtZW50cyBEZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbiB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U2NhbGUoKSA8ZW0+U2NhbGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFNjYWxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBTQ0FMRV9FREVGQVVMVCA9ICIiOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U2NhbGUoKSA8ZW0+U2NhbGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFNjYWxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHNjYWxlID0gU0NBTEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJvamVjdENoYXJhY3RlcmlzdGljcygpIDxlbT5Qcm9qZWN0IENoYXJhY3RlcmlzdGljczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UHJvamVjdENoYXJhY3RlcmlzdGljcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPSkVDVF9DSEFSQUNURVJJU1RJQ1NfRURFRkFVTFQgPSAiIjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByb2plY3RDaGFyYWN0ZXJpc3RpY3MoKSA8ZW0+UHJvamVjdCBDaGFyYWN0ZXJpc3RpY3M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFByb2plY3RDaGFyYWN0ZXJpc3RpY3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgcHJvamVjdENoYXJhY3RlcmlzdGljcyA9IFBST0pFQ1RfQ0hBUkFDVEVSSVNUSUNTX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJpc2tMZXZlbCgpIDxlbT5SaXNrIExldmVsPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSaXNrTGV2ZWwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFJJU0tfTEVWRUxfRURFRkFVTFQgPSAiIjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJpc2tMZXZlbCgpIDxlbT5SaXNrIExldmVsPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSaXNrTGV2ZWwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgcmlza0xldmVsID0gUklTS19MRVZFTF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFc3RpbWF0aW5nVGVjaG5pcXVlKCkgPGVtPkVzdGltYXRpbmcgVGVjaG5pcXVlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRFc3RpbWF0aW5nVGVjaG5pcXVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBFU1RJTUFUSU5HX1RFQ0hOSVFVRV9FREVGQVVMVCA9ICIiOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RXN0aW1hdGluZ1RlY2huaXF1ZSgpIDxlbT5Fc3RpbWF0aW5nIFRlY2huaXF1ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RXN0aW1hdGluZ1RlY2huaXF1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBlc3RpbWF0aW5nVGVjaG5pcXVlID0gRVNUSU1BVElOR19URUNITklRVUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJvamVjdE1lbWJlckV4cGVydGlzZSgpIDxlbT5Qcm9qZWN0IE1lbWJlciBFeHBlcnRpc2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFByb2plY3RNZW1iZXJFeHBlcnRpc2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0pFQ1RfTUVNQkVSX0VYUEVSVElTRV9FREVGQVVMVCA9ICIiOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJvamVjdE1lbWJlckV4cGVydGlzZSgpIDxlbT5Qcm9qZWN0IE1lbWJlciBFeHBlcnRpc2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFByb2plY3RNZW1iZXJFeHBlcnRpc2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgcHJvamVjdE1lbWJlckV4cGVydGlzZSA9IFBST0pFQ1RfTUVNQkVSX0VYUEVSVElTRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUeXBlT2ZDb250cmFjdCgpIDxlbT5UeXBlIE9mIENvbnRyYWN0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUeXBlT2ZDb250cmFjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQRV9PRl9DT05UUkFDVF9FREVGQVVMVCA9ICIiOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VHlwZU9mQ29udHJhY3QoKSA8ZW0+VHlwZSBPZiBDb250cmFjdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VHlwZU9mQ29udHJhY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgdHlwZU9mQ29udHJhY3QgPSBUWVBFX09GX0NPTlRSQUNUX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQotCQkvL1VNQS0tPgotCQlyZWFzc2lnbkRlZmF1bHRWYWx1ZXMoKTsKLQkJLy9VTUE8LS0gIAotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5ERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U2NhbGUoKSB7Ci0JCXJldHVybiBzY2FsZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTY2FsZShTdHJpbmcgbmV3U2NhbGUpIHsKLQkJU3RyaW5nIG9sZFNjYWxlID0gc2NhbGU7Ci0JCXNjYWxlID0gbmV3U2NhbGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fU0NBTEUsIG9sZFNjYWxlLAotCQkJCQlzY2FsZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UHJvamVjdENoYXJhY3RlcmlzdGljcygpIHsKLQkJcmV0dXJuIHByb2plY3RDaGFyYWN0ZXJpc3RpY3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHJvamVjdENoYXJhY3RlcmlzdGljcyhTdHJpbmcgbmV3UHJvamVjdENoYXJhY3RlcmlzdGljcykgewotCQlTdHJpbmcgb2xkUHJvamVjdENoYXJhY3RlcmlzdGljcyA9IHByb2plY3RDaGFyYWN0ZXJpc3RpY3M7Ci0JCXByb2plY3RDaGFyYWN0ZXJpc3RpY3MgPSBuZXdQcm9qZWN0Q2hhcmFjdGVyaXN0aWNzOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCgKLQkJCQkJdGhpcywKLQkJCQkJTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5ERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19QUk9KRUNUX0NIQVJBQ1RFUklTVElDUywKLQkJCQkJb2xkUHJvamVjdENoYXJhY3RlcmlzdGljcywgcHJvamVjdENoYXJhY3RlcmlzdGljcykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Umlza0xldmVsKCkgewotCQlyZXR1cm4gcmlza0xldmVsOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJpc2tMZXZlbChTdHJpbmcgbmV3Umlza0xldmVsKSB7Ci0JCVN0cmluZyBvbGRSaXNrTGV2ZWwgPSByaXNrTGV2ZWw7Ci0JCXJpc2tMZXZlbCA9IG5ld1Jpc2tMZXZlbDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5ERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19SSVNLX0xFVkVMLAotCQkJCQlvbGRSaXNrTGV2ZWwsIHJpc2tMZXZlbCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RXN0aW1hdGluZ1RlY2huaXF1ZSgpIHsKLQkJcmV0dXJuIGVzdGltYXRpbmdUZWNobmlxdWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RXN0aW1hdGluZ1RlY2huaXF1ZShTdHJpbmcgbmV3RXN0aW1hdGluZ1RlY2huaXF1ZSkgewotCQlTdHJpbmcgb2xkRXN0aW1hdGluZ1RlY2huaXF1ZSA9IGVzdGltYXRpbmdUZWNobmlxdWU7Ci0JCWVzdGltYXRpbmdUZWNobmlxdWUgPSBuZXdFc3RpbWF0aW5nVGVjaG5pcXVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCgKLQkJCQkJdGhpcywKLQkJCQkJTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5ERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19FU1RJTUFUSU5HX1RFQ0hOSVFVRSwKLQkJCQkJb2xkRXN0aW1hdGluZ1RlY2huaXF1ZSwgZXN0aW1hdGluZ1RlY2huaXF1ZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UHJvamVjdE1lbWJlckV4cGVydGlzZSgpIHsKLQkJcmV0dXJuIHByb2plY3RNZW1iZXJFeHBlcnRpc2U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHJvamVjdE1lbWJlckV4cGVydGlzZShTdHJpbmcgbmV3UHJvamVjdE1lbWJlckV4cGVydGlzZSkgewotCQlTdHJpbmcgb2xkUHJvamVjdE1lbWJlckV4cGVydGlzZSA9IHByb2plY3RNZW1iZXJFeHBlcnRpc2U7Ci0JCXByb2plY3RNZW1iZXJFeHBlcnRpc2UgPSBuZXdQcm9qZWN0TWVtYmVyRXhwZXJ0aXNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCgKLQkJCQkJdGhpcywKLQkJCQkJTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5ERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19QUk9KRUNUX01FTUJFUl9FWFBFUlRJU0UsCi0JCQkJCW9sZFByb2plY3RNZW1iZXJFeHBlcnRpc2UsIHByb2plY3RNZW1iZXJFeHBlcnRpc2UpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGVPZkNvbnRyYWN0KCkgewotCQlyZXR1cm4gdHlwZU9mQ29udHJhY3Q7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VHlwZU9mQ29udHJhY3QoU3RyaW5nIG5ld1R5cGVPZkNvbnRyYWN0KSB7Ci0JCVN0cmluZyBvbGRUeXBlT2ZDb250cmFjdCA9IHR5cGVPZkNvbnRyYWN0OwotCQl0eXBlT2ZDb250cmFjdCA9IG5ld1R5cGVPZkNvbnRyYWN0OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLkRFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1RZUEVfT0ZfQ09OVFJBQ1QsCi0JCQkJCW9sZFR5cGVPZkNvbnRyYWN0LCB0eXBlT2ZDb250cmFjdCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1NDQUxFOgotCQkJcmV0dXJuIGdldFNjYWxlKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19QUk9KRUNUX0NIQVJBQ1RFUklTVElDUzoKLQkJCXJldHVybiBnZXRQcm9qZWN0Q2hhcmFjdGVyaXN0aWNzKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19SSVNLX0xFVkVMOgotCQkJcmV0dXJuIGdldFJpc2tMZXZlbCgpOwotCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fRVNUSU1BVElOR19URUNITklRVUU6Ci0JCQlyZXR1cm4gZ2V0RXN0aW1hdGluZ1RlY2huaXF1ZSgpOwotCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fUFJPSkVDVF9NRU1CRVJfRVhQRVJUSVNFOgotCQkJcmV0dXJuIGdldFByb2plY3RNZW1iZXJFeHBlcnRpc2UoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1RZUEVfT0ZfQ09OVFJBQ1Q6Ci0JCQlyZXR1cm4gZ2V0VHlwZU9mQ29udHJhY3QoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fU0NBTEU6Ci0JCQlzZXRTY2FsZSgoU3RyaW5nKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19QUk9KRUNUX0NIQVJBQ1RFUklTVElDUzoKLQkJCXNldFByb2plY3RDaGFyYWN0ZXJpc3RpY3MoKFN0cmluZykgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fUklTS19MRVZFTDoKLQkJCXNldFJpc2tMZXZlbCgoU3RyaW5nKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19FU1RJTUFUSU5HX1RFQ0hOSVFVRToKLQkJCXNldEVzdGltYXRpbmdUZWNobmlxdWUoKFN0cmluZykgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fUFJPSkVDVF9NRU1CRVJfRVhQRVJUSVNFOgotCQkJc2V0UHJvamVjdE1lbWJlckV4cGVydGlzZSgoU3RyaW5nKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19UWVBFX09GX0NPTlRSQUNUOgotCQkJc2V0VHlwZU9mQ29udHJhY3QoKFN0cmluZykgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1NDQUxFOgotCQkJc2V0U2NhbGUoU0NBTEVfRURFRkFVTFQpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fUFJPSkVDVF9DSEFSQUNURVJJU1RJQ1M6Ci0JCQlzZXRQcm9qZWN0Q2hhcmFjdGVyaXN0aWNzKFBST0pFQ1RfQ0hBUkFDVEVSSVNUSUNTX0VERUZBVUxUKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1JJU0tfTEVWRUw6Ci0JCQlzZXRSaXNrTGV2ZWwoUklTS19MRVZFTF9FREVGQVVMVCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19FU1RJTUFUSU5HX1RFQ0hOSVFVRToKLQkJCXNldEVzdGltYXRpbmdUZWNobmlxdWUoRVNUSU1BVElOR19URUNITklRVUVfRURFRkFVTFQpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fUFJPSkVDVF9NRU1CRVJfRVhQRVJUSVNFOgotCQkJc2V0UHJvamVjdE1lbWJlckV4cGVydGlzZShQUk9KRUNUX01FTUJFUl9FWFBFUlRJU0VfRURFRkFVTFQpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fVFlQRV9PRl9DT05UUkFDVDoKLQkJCXNldFR5cGVPZkNvbnRyYWN0KFRZUEVfT0ZfQ09OVFJBQ1RfRURFRkFVTFQpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCS8vVU1BLS0+Ci0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gZ2V0RmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWUoZmVhdHVyZUlEKTsKLQkJaWYgKGZlYXR1cmUgIT0gbnVsbCkgewotCQkJcmV0dXJuIGlzRmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWVTZXQoZmVhdHVyZSk7Ci0JCX0KLQkJLy9VTUE8LS0JCQotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fU0NBTEU6Ci0JCQlyZXR1cm4gU0NBTEVfRURFRkFVTFQgPT0gbnVsbCA/IHNjYWxlICE9IG51bGwgOiAhU0NBTEVfRURFRkFVTFQKLQkJCQkJLmVxdWFscyhzY2FsZSk7Ci0JCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19QUk9KRUNUX0NIQVJBQ1RFUklTVElDUzoKLQkJCXJldHVybiBQUk9KRUNUX0NIQVJBQ1RFUklTVElDU19FREVGQVVMVCA9PSBudWxsID8gcHJvamVjdENoYXJhY3RlcmlzdGljcyAhPSBudWxsCi0JCQkJCTogIVBST0pFQ1RfQ0hBUkFDVEVSSVNUSUNTX0VERUZBVUxUCi0JCQkJCQkJLmVxdWFscyhwcm9qZWN0Q2hhcmFjdGVyaXN0aWNzKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1JJU0tfTEVWRUw6Ci0JCQlyZXR1cm4gUklTS19MRVZFTF9FREVGQVVMVCA9PSBudWxsID8gcmlza0xldmVsICE9IG51bGwKLQkJCQkJOiAhUklTS19MRVZFTF9FREVGQVVMVC5lcXVhbHMocmlza0xldmVsKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX0VTVElNQVRJTkdfVEVDSE5JUVVFOgotCQkJcmV0dXJuIEVTVElNQVRJTkdfVEVDSE5JUVVFX0VERUZBVUxUID09IG51bGwgPyBlc3RpbWF0aW5nVGVjaG5pcXVlICE9IG51bGwKLQkJCQkJOiAhRVNUSU1BVElOR19URUNITklRVUVfRURFRkFVTFQKLQkJCQkJCQkuZXF1YWxzKGVzdGltYXRpbmdUZWNobmlxdWUpOwotCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fUFJPSkVDVF9NRU1CRVJfRVhQRVJUSVNFOgotCQkJcmV0dXJuIFBST0pFQ1RfTUVNQkVSX0VYUEVSVElTRV9FREVGQVVMVCA9PSBudWxsID8gcHJvamVjdE1lbWJlckV4cGVydGlzZSAhPSBudWxsCi0JCQkJCTogIVBST0pFQ1RfTUVNQkVSX0VYUEVSVElTRV9FREVGQVVMVAotCQkJCQkJCS5lcXVhbHMocHJvamVjdE1lbWJlckV4cGVydGlzZSk7Ci0JCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19UWVBFX09GX0NPTlRSQUNUOgotCQkJcmV0dXJuIFRZUEVfT0ZfQ09OVFJBQ1RfRURFRkFVTFQgPT0gbnVsbCA/IHR5cGVPZkNvbnRyYWN0ICE9IG51bGwKLQkJCQkJOiAhVFlQRV9PRl9DT05UUkFDVF9FREVGQVVMVC5lcXVhbHModHlwZU9mQ29udHJhY3QpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkKLQkJCXJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHNjYWxlOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKHNjYWxlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBwcm9qZWN0Q2hhcmFjdGVyaXN0aWNzOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKHByb2plY3RDaGFyYWN0ZXJpc3RpY3MpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHJpc2tMZXZlbDogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChyaXNrTGV2ZWwpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGVzdGltYXRpbmdUZWNobmlxdWU6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoZXN0aW1hdGluZ1RlY2huaXF1ZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcHJvamVjdE1lbWJlckV4cGVydGlzZTogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChwcm9qZWN0TWVtYmVyRXhwZXJ0aXNlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCB0eXBlT2ZDb250cmFjdDogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZCh0eXBlT2ZDb250cmFjdCk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uSW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0RlbGl2ZXJ5UHJvY2Vzc0ltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9EZWxpdmVyeVByb2Nlc3NJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3YzZkZDcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0RlbGl2ZXJ5UHJvY2Vzc0ltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdFJlc29sdmluZ0VMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcnlQcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuU3VwcG9ydGluZ01hdGVyaWFsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkRlbGl2ZXJ5IFByb2Nlc3M8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5EZWxpdmVyeVByb2Nlc3NJbXBsI2dldEVkdWNhdGlvbk1hdGVyaWFscyA8ZW0+RWR1Y2F0aW9uIE1hdGVyaWFsczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkRlbGl2ZXJ5UHJvY2Vzc0ltcGwjZ2V0Q29tbXVuaWNhdGlvbnNNYXRlcmlhbHMgPGVtPkNvbW11bmljYXRpb25zIE1hdGVyaWFsczwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERlbGl2ZXJ5UHJvY2Vzc0ltcGwgZXh0ZW5kcyBQcm9jZXNzSW1wbCBpbXBsZW1lbnRzIERlbGl2ZXJ5UHJvY2VzcyB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFZHVjYXRpb25NYXRlcmlhbHMoKSA8ZW0+RWR1Y2F0aW9uIE1hdGVyaWFsczwvZW0+fScgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRFZHVjYXRpb25NYXRlcmlhbHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxTdXBwb3J0aW5nTWF0ZXJpYWw+IGVkdWNhdGlvbk1hdGVyaWFsczsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENvbW11bmljYXRpb25zTWF0ZXJpYWxzKCkgPGVtPkNvbW11bmljYXRpb25zIE1hdGVyaWFsczwvZW0+fScgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDb21tdW5pY2F0aW9uc01hdGVyaWFscygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PFN1cHBvcnRpbmdNYXRlcmlhbD4gY29tbXVuaWNhdGlvbnNNYXRlcmlhbHM7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRGVsaXZlcnlQcm9jZXNzSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQotCQkvL1VNQS0tPgotCQlyZWFzc2lnbkRlZmF1bHRWYWx1ZXMoKTsKLQkJLy9VTUE8LS0gIAotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5ERUxJVkVSWV9QUk9DRVNTOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0PFN1cHBvcnRpbmdNYXRlcmlhbD4gZ2V0RWR1Y2F0aW9uTWF0ZXJpYWxzKCkgewotCQlpZiAoZWR1Y2F0aW9uTWF0ZXJpYWxzID09IG51bGwpIHsKLQkJCWVkdWNhdGlvbk1hdGVyaWFscyA9IG5ldyBFT2JqZWN0UmVzb2x2aW5nRUxpc3Q8U3VwcG9ydGluZ01hdGVyaWFsPigKLQkJCQkJU3VwcG9ydGluZ01hdGVyaWFsLmNsYXNzLCB0aGlzLAotCQkJCQlVbWFQYWNrYWdlLkRFTElWRVJZX1BST0NFU1NfX0VEVUNBVElPTl9NQVRFUklBTFMpOwotCQl9Ci0JCXJldHVybiBlZHVjYXRpb25NYXRlcmlhbHM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3Q8U3VwcG9ydGluZ01hdGVyaWFsPiBnZXRDb21tdW5pY2F0aW9uc01hdGVyaWFscygpIHsKLQkJaWYgKGNvbW11bmljYXRpb25zTWF0ZXJpYWxzID09IG51bGwpIHsKLQkJCWNvbW11bmljYXRpb25zTWF0ZXJpYWxzID0gbmV3IEVPYmplY3RSZXNvbHZpbmdFTGlzdDxTdXBwb3J0aW5nTWF0ZXJpYWw+KAotCQkJCQlTdXBwb3J0aW5nTWF0ZXJpYWwuY2xhc3MsIHRoaXMsCi0JCQkJCVVtYVBhY2thZ2UuREVMSVZFUllfUFJPQ0VTU19fQ09NTVVOSUNBVElPTlNfTUFURVJJQUxTKTsKLQkJfQotCQlyZXR1cm4gY29tbXVuaWNhdGlvbnNNYXRlcmlhbHM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUllfUFJPQ0VTU19fRURVQ0FUSU9OX01BVEVSSUFMUzoKLQkJCXJldHVybiBnZXRFZHVjYXRpb25NYXRlcmlhbHMoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJZX1BST0NFU1NfX0NPTU1VTklDQVRJT05TX01BVEVSSUFMUzoKLQkJCXJldHVybiBnZXRDb21tdW5pY2F0aW9uc01hdGVyaWFscygpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSWV9QUk9DRVNTX19FRFVDQVRJT05fTUFURVJJQUxTOgotCQkJZ2V0RWR1Y2F0aW9uTWF0ZXJpYWxzKCkuY2xlYXIoKTsKLQkJCWdldEVkdWNhdGlvbk1hdGVyaWFscygpLmFkZEFsbCgKLQkJCQkJKENvbGxlY3Rpb248PyBleHRlbmRzIFN1cHBvcnRpbmdNYXRlcmlhbD4pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJZX1BST0NFU1NfX0NPTU1VTklDQVRJT05TX01BVEVSSUFMUzoKLQkJCWdldENvbW11bmljYXRpb25zTWF0ZXJpYWxzKCkuY2xlYXIoKTsKLQkJCWdldENvbW11bmljYXRpb25zTWF0ZXJpYWxzKCkuYWRkQWxsKAotCQkJCQkoQ29sbGVjdGlvbjw/IGV4dGVuZHMgU3VwcG9ydGluZ01hdGVyaWFsPikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJZX1BST0NFU1NfX0VEVUNBVElPTl9NQVRFUklBTFM6Ci0JCQlnZXRFZHVjYXRpb25NYXRlcmlhbHMoKS5jbGVhcigpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUllfUFJPQ0VTU19fQ09NTVVOSUNBVElPTlNfTUFURVJJQUxTOgotCQkJZ2V0Q29tbXVuaWNhdGlvbnNNYXRlcmlhbHMoKS5jbGVhcigpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCS8vVU1BLS0+Ci0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gZ2V0RmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWUoZmVhdHVyZUlEKTsKLQkJaWYgKGZlYXR1cmUgIT0gbnVsbCkgewotCQkJcmV0dXJuIGlzRmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWVTZXQoZmVhdHVyZSk7Ci0JCX0KLQkJLy9VTUE8LS0JCQotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUllfUFJPQ0VTU19fRURVQ0FUSU9OX01BVEVSSUFMUzoKLQkJCXJldHVybiBlZHVjYXRpb25NYXRlcmlhbHMgIT0gbnVsbCAmJiAhZWR1Y2F0aW9uTWF0ZXJpYWxzLmlzRW1wdHkoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJZX1BST0NFU1NfX0NPTU1VTklDQVRJT05TX01BVEVSSUFMUzoKLQkJCXJldHVybiBjb21tdW5pY2F0aW9uc01hdGVyaWFscyAhPSBudWxsCi0JCQkJCSYmICFjb21tdW5pY2F0aW9uc01hdGVyaWFscy5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotfSAvL0RlbGl2ZXJ5UHJvY2Vzc0ltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9EZXNjcmliYWJsZUVsZW1lbnRJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvRGVzY3JpYmFibGVFbGVtZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMTI2MDFiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9EZXNjcmliYWJsZUVsZW1lbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MTAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsOwotCi1pbXBvcnQgamF2YS5uZXQuVVJJOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNsYXNzaWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmliYWJsZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkNvbnRlbnREZXNjcmlwdGlvbkZhY3Rvcnk7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5EZXNjcmliYWJsZSBFbGVtZW50PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRGVzY3JpYmFibGVFbGVtZW50SW1wbCNnZXRJc0Fic3RyYWN0IDxlbT5JcyBBYnN0cmFjdDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkRlc2NyaWJhYmxlRWxlbWVudEltcGwjZ2V0UHJlc2VudGF0aW9uIDxlbT5QcmVzZW50YXRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5EZXNjcmliYWJsZUVsZW1lbnRJbXBsI2dldFNoYXBlaWNvbiA8ZW0+U2hhcGVpY29uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRGVzY3JpYmFibGVFbGVtZW50SW1wbCNnZXROb2RlaWNvbiA8ZW0+Tm9kZWljb248L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBEZXNjcmliYWJsZUVsZW1lbnRJbXBsIGV4dGVuZHMgTWV0aG9kRWxlbWVudEltcGwKLQkJaW1wbGVtZW50cyBEZXNjcmliYWJsZUVsZW1lbnQgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElzQWJzdHJhY3QoKSA8ZW0+SXMgQWJzdHJhY3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldElzQWJzdHJhY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQm9vbGVhbiBJU19BQlNUUkFDVF9FREVGQVVMVCA9IEJvb2xlYW4uRkFMU0U7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJc0Fic3RyYWN0KCkgPGVtPklzIEFic3RyYWN0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJc0Fic3RyYWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQm9vbGVhbiBpc0Fic3RyYWN0ID0gSVNfQUJTVFJBQ1RfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQcmVzZW50YXRpb24oKSA8ZW0+UHJlc2VudGF0aW9uPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQcmVzZW50YXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBDb250ZW50RGVzY3JpcHRpb24gcHJlc2VudGF0aW9uOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNoYXBlaWNvbigpIDxlbT5TaGFwZWljb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFNoYXBlaWNvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBVUkkgU0hBUEVJQ09OX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNoYXBlaWNvbigpIDxlbT5TaGFwZWljb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFNoYXBlaWNvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFVSSSBzaGFwZWljb24gPSBTSEFQRUlDT05fRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Tm9kZWljb24oKSA8ZW0+Tm9kZWljb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE5vZGVpY29uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFVSSSBOT0RFSUNPTl9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROb2RlaWNvbigpIDxlbT5Ob2RlaWNvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Tm9kZWljb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBVUkkgbm9kZWljb24gPSBOT0RFSUNPTl9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBEZXNjcmliYWJsZUVsZW1lbnRJbXBsKCkgewotCQlzdXBlcigpOwotCi0JCS8vVU1BLS0+Ci0JCXJlYXNzaWduRGVmYXVsdFZhbHVlcygpOwotCQkvL1VNQTwtLSAgCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLkRFU0NSSUJBQkxFX0VMRU1FTlQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJvb2xlYW4gZ2V0SXNBYnN0cmFjdCgpIHsKLQkJcmV0dXJuIGlzQWJzdHJhY3Q7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SXNBYnN0cmFjdChCb29sZWFuIG5ld0lzQWJzdHJhY3QpIHsKLQkJQm9vbGVhbiBvbGRJc0Fic3RyYWN0ID0gaXNBYnN0cmFjdDsKLQkJaXNBYnN0cmFjdCA9IG5ld0lzQWJzdHJhY3Q7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuREVTQ1JJQkFCTEVfRUxFTUVOVF9fSVNfQUJTVFJBQ1QsIG9sZElzQWJzdHJhY3QsCi0JCQkJCWlzQWJzdHJhY3QpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRQcmVzZW50YXRpb24oCi0JCQlDb250ZW50RGVzY3JpcHRpb24gbmV3UHJlc2VudGF0aW9uLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCUNvbnRlbnREZXNjcmlwdGlvbiBvbGRQcmVzZW50YXRpb24gPSBwcmVzZW50YXRpb247Ci0JCXByZXNlbnRhdGlvbiA9IG5ld1ByZXNlbnRhdGlvbjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywKLQkJCQkJTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5ERVNDUklCQUJMRV9FTEVNRU5UX19QUkVTRU5UQVRJT04sCi0JCQkJCW9sZFByZXNlbnRhdGlvbiwgbmV3UHJlc2VudGF0aW9uKTsKLQkJCWlmIChtc2dzID09IG51bGwpCi0JCQkJbXNncyA9IG5vdGlmaWNhdGlvbjsKLQkJCWVsc2UKLQkJCQltc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBVUkkgZ2V0U2hhcGVpY29uKCkgewotCQlyZXR1cm4gc2hhcGVpY29uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNoYXBlaWNvbihVUkkgbmV3U2hhcGVpY29uKSB7Ci0JCVVSSSBvbGRTaGFwZWljb24gPSBzaGFwZWljb247Ci0JCXNoYXBlaWNvbiA9IG5ld1NoYXBlaWNvbjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5ERVNDUklCQUJMRV9FTEVNRU5UX19TSEFQRUlDT04sIG9sZFNoYXBlaWNvbiwKLQkJCQkJc2hhcGVpY29uKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFVSSSBnZXROb2RlaWNvbigpIHsKLQkJcmV0dXJuIG5vZGVpY29uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE5vZGVpY29uKFVSSSBuZXdOb2RlaWNvbikgewotCQlVUkkgb2xkTm9kZWljb24gPSBub2RlaWNvbjsKLQkJbm9kZWljb24gPSBuZXdOb2RlaWNvbjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5ERVNDUklCQUJMRV9FTEVNRU5UX19OT0RFSUNPTiwgb2xkTm9kZWljb24sCi0JCQkJCW5vZGVpY29uKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwKLQkJCWludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkRFU0NSSUJBQkxFX0VMRU1FTlRfX1BSRVNFTlRBVElPTjoKLQkJCXJldHVybiBiYXNpY1NldFByZXNlbnRhdGlvbihudWxsLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuREVTQ1JJQkFCTEVfRUxFTUVOVF9fSVNfQUJTVFJBQ1Q6Ci0JCQlyZXR1cm4gZ2V0SXNBYnN0cmFjdCgpOwotCQljYXNlIFVtYVBhY2thZ2UuREVTQ1JJQkFCTEVfRUxFTUVOVF9fUFJFU0VOVEFUSU9OOgotCQkJaWYgKHJlc29sdmUpCi0JCQkJcmV0dXJuIGdldFByZXNlbnRhdGlvbigpOwotCQkJcmV0dXJuIGJhc2ljR2V0UHJlc2VudGF0aW9uKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5ERVNDUklCQUJMRV9FTEVNRU5UX19TSEFQRUlDT046Ci0JCQlyZXR1cm4gZ2V0U2hhcGVpY29uKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5ERVNDUklCQUJMRV9FTEVNRU5UX19OT0RFSUNPTjoKLQkJCXJldHVybiBnZXROb2RlaWNvbigpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ERVNDUklCQUJMRV9FTEVNRU5UX19JU19BQlNUUkFDVDoKLQkJCXNldElzQWJzdHJhY3QoKEJvb2xlYW4pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkRFU0NSSUJBQkxFX0VMRU1FTlRfX1BSRVNFTlRBVElPTjoKLQkJCXNldFByZXNlbnRhdGlvbigoQ29udGVudERlc2NyaXB0aW9uKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5ERVNDUklCQUJMRV9FTEVNRU5UX19TSEFQRUlDT046Ci0JCQlzZXRTaGFwZWljb24oKFVSSSkgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuREVTQ1JJQkFCTEVfRUxFTUVOVF9fTk9ERUlDT046Ci0JCQlzZXROb2RlaWNvbigoVVJJKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuREVTQ1JJQkFCTEVfRUxFTUVOVF9fSVNfQUJTVFJBQ1Q6Ci0JCQlzZXRJc0Fic3RyYWN0KElTX0FCU1RSQUNUX0VERUZBVUxUKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkRFU0NSSUJBQkxFX0VMRU1FTlRfX1BSRVNFTlRBVElPTjoKLQkJCXNldFByZXNlbnRhdGlvbigoQ29udGVudERlc2NyaXB0aW9uKSBudWxsKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkRFU0NSSUJBQkxFX0VMRU1FTlRfX1NIQVBFSUNPTjoKLQkJCXNldFNoYXBlaWNvbihTSEFQRUlDT05fRURFRkFVTFQpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuREVTQ1JJQkFCTEVfRUxFTUVOVF9fTk9ERUlDT046Ci0JCQlzZXROb2RlaWNvbihOT0RFSUNPTl9FREVGQVVMVCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJLy9VTUEtLT4KLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBnZXRGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZShmZWF0dXJlSUQpOwotCQlpZiAoZmVhdHVyZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gaXNGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZVNldChmZWF0dXJlKTsKLQkJfQotCQkvL1VNQTwtLQkJCi0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ERVNDUklCQUJMRV9FTEVNRU5UX19JU19BQlNUUkFDVDoKLQkJCXJldHVybiBJU19BQlNUUkFDVF9FREVGQVVMVCA9PSBudWxsID8gaXNBYnN0cmFjdCAhPSBudWxsCi0JCQkJCTogIUlTX0FCU1RSQUNUX0VERUZBVUxULmVxdWFscyhpc0Fic3RyYWN0KTsKLQkJY2FzZSBVbWFQYWNrYWdlLkRFU0NSSUJBQkxFX0VMRU1FTlRfX1BSRVNFTlRBVElPTjoKLQkJCXJldHVybiBwcmVzZW50YXRpb24gIT0gbnVsbDsKLQkJY2FzZSBVbWFQYWNrYWdlLkRFU0NSSUJBQkxFX0VMRU1FTlRfX1NIQVBFSUNPTjoKLQkJCXJldHVybiBTSEFQRUlDT05fRURFRkFVTFQgPT0gbnVsbCA/IHNoYXBlaWNvbiAhPSBudWxsCi0JCQkJCTogIVNIQVBFSUNPTl9FREVGQVVMVC5lcXVhbHMoc2hhcGVpY29uKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkRFU0NSSUJBQkxFX0VMRU1FTlRfX05PREVJQ09OOgotCQkJcmV0dXJuIE5PREVJQ09OX0VERUZBVUxUID09IG51bGwgPyBub2RlaWNvbiAhPSBudWxsCi0JCQkJCTogIU5PREVJQ09OX0VERUZBVUxULmVxdWFscyhub2RlaWNvbik7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBpbnQgZUJhc2VTdHJ1Y3R1cmFsRmVhdHVyZUlEKGludCBkZXJpdmVkRmVhdHVyZUlELCBDbGFzczw/PiBiYXNlQ2xhc3MpIHsKLQkJaWYgKGJhc2VDbGFzcyA9PSBUeXBlLmNsYXNzKSB7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpIHsKLQkJCWRlZmF1bHQ6Ci0JCQkJcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gQ2xhc3NpZmllci5jbGFzcykgewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuREVTQ1JJQkFCTEVfRUxFTUVOVF9fSVNfQUJTVFJBQ1Q6Ci0JCQkJcmV0dXJuIFVtYVBhY2thZ2UuQ0xBU1NJRklFUl9fSVNfQUJTVFJBQ1Q7Ci0JCQlkZWZhdWx0OgotCQkJCXJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXIuZUJhc2VTdHJ1Y3R1cmFsRmVhdHVyZUlEKGRlcml2ZWRGZWF0dXJlSUQsIGJhc2VDbGFzcyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGludCBlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoaW50IGJhc2VGZWF0dXJlSUQsIENsYXNzPD8+IGJhc2VDbGFzcykgewotCQlpZiAoYmFzZUNsYXNzID09IFR5cGUuY2xhc3MpIHsKLQkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkgewotCQkJZGVmYXVsdDoKLQkJCQlyZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBDbGFzc2lmaWVyLmNsYXNzKSB7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5DTEFTU0lGSUVSX19JU19BQlNUUkFDVDoKLQkJCQlyZXR1cm4gVW1hUGFja2FnZS5ERVNDUklCQUJMRV9FTEVNRU5UX19JU19BQlNUUkFDVDsKLQkJCWRlZmF1bHQ6Ci0JCQkJcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCXJldHVybiBzdXBlci5lRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoYmFzZUZlYXR1cmVJRCwgYmFzZUNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkKLQkJCXJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGlzQWJzdHJhY3Q6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoaXNBYnN0cmFjdCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgc2hhcGVpY29uOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKHNoYXBlaWNvbik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgbm9kZWljb246ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQobm9kZWljb24pOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLQkvLwotCS8vIFN0YXJ0IGN1c3RvbSBjb2RlCi0JLy8KLQotCXB1YmxpYyBDb250ZW50RGVzY3JpcHRpb24gYmFzaWNHZXRQcmVzZW50YXRpb24oKSB7Ci0JCXJldHVybiBwcmVzZW50YXRpb247Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkRlc2NyaWJhYmxlRWxlbWVudEltcGwjZ2V0UHJlc2VudGF0aW9uKCkKLQkgKi8KLQlwdWJsaWMgQ29udGVudERlc2NyaXB0aW9uIGdldFByZXNlbnRhdGlvbigpIHsKLQkJaWYgKHByZXNlbnRhdGlvbiBpbnN0YW5jZW9mIEVPYmplY3QKLQkJCQkmJiAoKEVPYmplY3QpIHByZXNlbnRhdGlvbikuZUlzUHJveHkoKSkgewotCQkJQ29udGVudERlc2NyaXB0aW9uIG9sZFByZXNlbnRhdGlvbiA9IHByZXNlbnRhdGlvbjsKLQkJCXByZXNlbnRhdGlvbiA9IChDb250ZW50RGVzY3JpcHRpb24pIGVSZXNvbHZlUHJveHkoKEludGVybmFsRU9iamVjdCkgcHJlc2VudGF0aW9uKTsKLQkJCWlmIChwcmVzZW50YXRpb24gIT0gb2xkUHJlc2VudGF0aW9uKSB7Ci0JCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwKLQkJCQkJCQlVbWFQYWNrYWdlLkRFU0NSSUJBQkxFX0VMRU1FTlRfX1BSRVNFTlRBVElPTiwKLQkJCQkJCQlvbGRQcmVzZW50YXRpb24sIHByZXNlbnRhdGlvbikpOwotCQkJfQotCQl9IGVsc2UgaWYgKHByZXNlbnRhdGlvbiA9PSBudWxsKSB7Ci0JCQkvLwkJCXNldFByZXNlbnRhdGlvbihDb250ZW50RGVzY3JpcHRpb25GYWN0b3J5LmNyZWF0ZUNvbnRlbnREZXNjcmlwdGlvbih0aGlzKSk7Ci0JCQlpZiAoZW1wdHlQcmVzZW50YXRpb24gPT0gbnVsbCkgewotCQkJCWVtcHR5UHJlc2VudGF0aW9uID0gQ29udGVudERlc2NyaXB0aW9uRmFjdG9yeQotCQkJCQkJLmNyZWF0ZUNvbnRlbnREZXNjcmlwdGlvbih0aGlzKTsKLQkJCQllbXB0eVByZXNlbnRhdGlvbi5lQWRhcHRlcnMoKS5hZGQoY2hhbmdlTGlzdGVuZXIpOwotCQkJfQotCQkJcmV0dXJuIGVtcHR5UHJlc2VudGF0aW9uOwotCQl9Ci0KLQkJcmV0dXJuIHByZXNlbnRhdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFByZXNlbnRhdGlvbihDb250ZW50RGVzY3JpcHRpb24gbmV3UHJlc2VudGF0aW9uKSB7Ci0JCWlmIChuZXdQcmVzZW50YXRpb24gIT0gcHJlc2VudGF0aW9uKSB7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChwcmVzZW50YXRpb24gIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpIHByZXNlbnRhdGlvbikuZUludmVyc2VSZW1vdmUodGhpcywKLQkJCQkJCUVPUFBPU0lURV9GRUFUVVJFX0JBU0UKLQkJCQkJCQkJLSBVbWFQYWNrYWdlLkRFU0NSSUJBQkxFX0VMRU1FTlRfX1BSRVNFTlRBVElPTiwKLQkJCQkJCW51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld1ByZXNlbnRhdGlvbiAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCkgbmV3UHJlc2VudGF0aW9uKS5lSW52ZXJzZUFkZCh0aGlzLAotCQkJCQkJRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRQotCQkJCQkJCQktIFVtYVBhY2thZ2UuREVTQ1JJQkFCTEVfRUxFTUVOVF9fUFJFU0VOVEFUSU9OLAotCQkJCQkJbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRQcmVzZW50YXRpb24obmV3UHJlc2VudGF0aW9uLCBtc2dzKTsKLQotCQkJLy8gY3VzdG9tIGNvZGUKLQkJCS8vCi0JCQllbXB0eVByZXNlbnRhdGlvbiA9IG51bGw7Ci0KLQkJCWlmIChtc2dzICE9IG51bGwpCi0JCQkJbXNncy5kaXNwYXRjaCgpOwotCQl9IGVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5ERVNDUklCQUJMRV9FTEVNRU5UX19QUkVTRU5UQVRJT04sCi0JCQkJCW5ld1ByZXNlbnRhdGlvbiwgbmV3UHJlc2VudGF0aW9uKSk7Ci0JfQotCi0JcHJpdmF0ZSBDb250ZW50RGVzY3JpcHRpb24gZW1wdHlQcmVzZW50YXRpb247Ci0KLQlwcml2YXRlIEFkYXB0ZXIgY2hhbmdlTGlzdGVuZXIgPSBuZXcgQWRhcHRlckltcGwoKSB7Ci0JCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG1zZykgewotCQkJc3dpdGNoIChtc2cuZ2V0RXZlbnRUeXBlKCkpIHsKLQkJCWNhc2UgTm90aWZpY2F0aW9uLkFERDoKLQkJCWNhc2UgTm90aWZpY2F0aW9uLkFERF9NQU5ZOgotCQkJY2FzZSBOb3RpZmljYXRpb24uU0VUOgotCQkJCUNvbnRlbnREZXNjcmlwdGlvbiBjb250ZW50ID0gKENvbnRlbnREZXNjcmlwdGlvbikgZ2V0VGFyZ2V0KCk7Ci0JCQkJY29udGVudC5lQWRhcHRlcnMoKS5yZW1vdmUodGhpcyk7Ci0KLQkJCQkvLyBlbXB0eVByZXNlbnRhdGlvbiBpcyBtb2RpZmllZCwgY29udmVydCBpdCB0byByZWFsIHByZXNlbnRhdGlvbiBpZiBubyBwcmVzZW50YXRpb24gaXMgc2V0IHlldCAKLQkJCQkvLyBmb3IgdGhlIFByb2Nlc3NFbGVtZW50Ci0JCQkJLy8KLQkJCQlpZiAocHJlc2VudGF0aW9uID09IG51bGwpIHsKLQkJCQkJc2V0UHJlc2VudGF0aW9uKGNvbnRlbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCX07Ci19IC8vRGVzY3JpYmFibGVFbGVtZW50SW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0Rlc2NyaXB0b3JEZXNjcmlwdGlvbkltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9EZXNjcmlwdG9yRGVzY3JpcHRpb25JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4Y2U1NjQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0Rlc2NyaXB0b3JEZXNjcmlwdGlvbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpcHRvckRlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkRlc2NyaXB0b3IgRGVzY3JpcHRpb248L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5EZXNjcmlwdG9yRGVzY3JpcHRpb25JbXBsI2dldFJlZmluZWREZXNjcmlwdGlvbiA8ZW0+UmVmaW5lZCBEZXNjcmlwdGlvbjwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERlc2NyaXB0b3JEZXNjcmlwdGlvbkltcGwgZXh0ZW5kcyBCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb25JbXBsCi0JCWltcGxlbWVudHMgRGVzY3JpcHRvckRlc2NyaXB0aW9uIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZWZpbmVkRGVzY3JpcHRpb24oKSA8ZW0+UmVmaW5lZCBEZXNjcmlwdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmVmaW5lZERlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBSRUZJTkVEX0RFU0NSSVBUSU9OX0VERUZBVUxUID0gIiI7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZWZpbmVkRGVzY3JpcHRpb24oKSA8ZW0+UmVmaW5lZCBEZXNjcmlwdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmVmaW5lZERlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHJlZmluZWREZXNjcmlwdGlvbiA9IFJFRklORURfREVTQ1JJUFRJT05fRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRGVzY3JpcHRvckRlc2NyaXB0aW9uSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQotCQkvL1VNQS0tPgotCQlyZWFzc2lnbkRlZmF1bHRWYWx1ZXMoKTsKLQkJLy9VTUE8LS0gIAotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5ERVNDUklQVE9SX0RFU0NSSVBUSU9OOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UmVmaW5lZERlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gcmVmaW5lZERlc2NyaXB0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlZmluZWREZXNjcmlwdGlvbihTdHJpbmcgbmV3UmVmaW5lZERlc2NyaXB0aW9uKSB7Ci0JCVN0cmluZyBvbGRSZWZpbmVkRGVzY3JpcHRpb24gPSByZWZpbmVkRGVzY3JpcHRpb247Ci0JCXJlZmluZWREZXNjcmlwdGlvbiA9IG5ld1JlZmluZWREZXNjcmlwdGlvbjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5ERVNDUklQVE9SX0RFU0NSSVBUSU9OX19SRUZJTkVEX0RFU0NSSVBUSU9OLAotCQkJCQlvbGRSZWZpbmVkRGVzY3JpcHRpb24sIHJlZmluZWREZXNjcmlwdGlvbikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkRFU0NSSVBUT1JfREVTQ1JJUFRJT05fX1JFRklORURfREVTQ1JJUFRJT046Ci0JCQlyZXR1cm4gZ2V0UmVmaW5lZERlc2NyaXB0aW9uKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkRFU0NSSVBUT1JfREVTQ1JJUFRJT05fX1JFRklORURfREVTQ1JJUFRJT046Ci0JCQlzZXRSZWZpbmVkRGVzY3JpcHRpb24oKFN0cmluZykgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkRFU0NSSVBUT1JfREVTQ1JJUFRJT05fX1JFRklORURfREVTQ1JJUFRJT046Ci0JCQlzZXRSZWZpbmVkRGVzY3JpcHRpb24oUkVGSU5FRF9ERVNDUklQVElPTl9FREVGQVVMVCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJLy9VTUEtLT4KLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBnZXRGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZShmZWF0dXJlSUQpOwotCQlpZiAoZmVhdHVyZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gaXNGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZVNldChmZWF0dXJlKTsKLQkJfQotCQkvL1VNQTwtLQkJCi0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ERVNDUklQVE9SX0RFU0NSSVBUSU9OX19SRUZJTkVEX0RFU0NSSVBUSU9OOgotCQkJcmV0dXJuIFJFRklORURfREVTQ1JJUFRJT05fRURFRkFVTFQgPT0gbnVsbCA/IHJlZmluZWREZXNjcmlwdGlvbiAhPSBudWxsCi0JCQkJCTogIVJFRklORURfREVTQ1JJUFRJT05fRURFRkFVTFQuZXF1YWxzKHJlZmluZWREZXNjcmlwdGlvbik7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKQotCQkJcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAocmVmaW5lZERlc2NyaXB0aW9uOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKHJlZmluZWREZXNjcmlwdGlvbik7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL0Rlc2NyaXB0b3JEZXNjcmlwdGlvbkltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9EZXNjcmlwdG9ySW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0Rlc2NyaXB0b3JJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5ZGVmMzkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0Rlc2NyaXB0b3JJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RGVzY3JpcHRvcjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkRlc2NyaXB0b3JJbXBsI2dldElzU3luY2hyb25pemVkV2l0aFNvdXJjZSA8ZW0+SXMgU3luY2hyb25pemVkIFdpdGggU291cmNlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgRGVzY3JpcHRvckltcGwgZXh0ZW5kcyBCcmVha2Rvd25FbGVtZW50SW1wbCBpbXBsZW1lbnRzCi0JCURlc2NyaXB0b3IgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElzU3luY2hyb25pemVkV2l0aFNvdXJjZSgpIDxlbT5JcyBTeW5jaHJvbml6ZWQgV2l0aCBTb3VyY2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldElzU3luY2hyb25pemVkV2l0aFNvdXJjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCb29sZWFuIElTX1NZTkNIUk9OSVpFRF9XSVRIX1NPVVJDRV9FREVGQVVMVCA9IEJvb2xlYW4uVFJVRTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElzU3luY2hyb25pemVkV2l0aFNvdXJjZSgpIDxlbT5JcyBTeW5jaHJvbml6ZWQgV2l0aCBTb3VyY2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldElzU3luY2hyb25pemVkV2l0aFNvdXJjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJvb2xlYW4gaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlID0gSVNfU1lOQ0hST05JWkVEX1dJVEhfU09VUkNFX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIERlc2NyaXB0b3JJbXBsKCkgewotCQlzdXBlcigpOwotCi0JCS8vVU1BLS0+Ci0JCXJlYXNzaWduRGVmYXVsdFZhbHVlcygpOwotCQkvL1VNQTwtLSAgCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLkRFU0NSSVBUT1I7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJvb2xlYW4gZ2V0SXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKCkgewotCQlyZXR1cm4gaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldElzU3luY2hyb25pemVkV2l0aFNvdXJjZShCb29sZWFuIG5ld0lzU3luY2hyb25pemVkV2l0aFNvdXJjZSkgewotCQlCb29sZWFuIG9sZElzU3luY2hyb25pemVkV2l0aFNvdXJjZSA9IGlzU3luY2hyb25pemVkV2l0aFNvdXJjZTsKLQkJaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlID0gbmV3SXNTeW5jaHJvbml6ZWRXaXRoU291cmNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLkRFU0NSSVBUT1JfX0lTX1NZTkNIUk9OSVpFRF9XSVRIX1NPVVJDRSwKLQkJCQkJb2xkSXNTeW5jaHJvbml6ZWRXaXRoU291cmNlLCBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2UpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ERVNDUklQVE9SX19JU19TWU5DSFJPTklaRURfV0lUSF9TT1VSQ0U6Ci0JCQlyZXR1cm4gZ2V0SXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkRFU0NSSVBUT1JfX0lTX1NZTkNIUk9OSVpFRF9XSVRIX1NPVVJDRToKLQkJCXNldElzU3luY2hyb25pemVkV2l0aFNvdXJjZSgoQm9vbGVhbikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkRFU0NSSVBUT1JfX0lTX1NZTkNIUk9OSVpFRF9XSVRIX1NPVVJDRToKLQkJCXNldElzU3luY2hyb25pemVkV2l0aFNvdXJjZShJU19TWU5DSFJPTklaRURfV0lUSF9TT1VSQ0VfRURFRkFVTFQpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCS8vVU1BLS0+Ci0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gZ2V0RmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWUoZmVhdHVyZUlEKTsKLQkJaWYgKGZlYXR1cmUgIT0gbnVsbCkgewotCQkJcmV0dXJuIGlzRmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWVTZXQoZmVhdHVyZSk7Ci0JCX0KLQkJLy9VTUE8LS0JCQotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuREVTQ1JJUFRPUl9fSVNfU1lOQ0hST05JWkVEX1dJVEhfU09VUkNFOgotCQkJcmV0dXJuIElTX1NZTkNIUk9OSVpFRF9XSVRIX1NPVVJDRV9FREVGQVVMVCA9PSBudWxsID8gaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlICE9IG51bGwKLQkJCQkJOiAhSVNfU1lOQ0hST05JWkVEX1dJVEhfU09VUkNFX0VERUZBVUxUCi0JCQkJCQkJLmVxdWFscyhpc1N5bmNocm9uaXplZFdpdGhTb3VyY2UpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkKLQkJCXJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGlzU3luY2hyb25pemVkV2l0aFNvdXJjZTogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChpc1N5bmNocm9uaXplZFdpdGhTb3VyY2UpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9EZXNjcmlwdG9ySW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0RpYWdyYW1FbGVtZW50SW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0RpYWdyYW1FbGVtZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMDA5ODJmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9EaWFncmFtRWxlbWVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxNSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0V2l0aEludmVyc2VSZXNvbHZpbmdFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5EaWFncmFtIEVsZW1lbnQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5EaWFncmFtRWxlbWVudEltcGwjZ2V0SXNWaXNpYmxlIDxlbT5JcyBWaXNpYmxlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRGlhZ3JhbUVsZW1lbnRJbXBsI2dldENvbnRhaW5lcl8gPGVtPkNvbnRhaW5lcjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkRpYWdyYW1FbGVtZW50SW1wbCNnZXRSZWZlcmVuY2UgPGVtPlJlZmVyZW5jZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkRpYWdyYW1FbGVtZW50SW1wbCNnZXRQcm9wZXJ0eSA8ZW0+UHJvcGVydHk8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBEaWFncmFtRWxlbWVudEltcGwgZXh0ZW5kcyBNZXRob2RFbGVtZW50SW1wbCBpbXBsZW1lbnRzCi0JCURpYWdyYW1FbGVtZW50IHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJc1Zpc2libGUoKSA8ZW0+SXMgVmlzaWJsZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SXNWaXNpYmxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJvb2xlYW4gSVNfVklTSUJMRV9FREVGQVVMVCA9IEJvb2xlYW4uVFJVRTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElzVmlzaWJsZSgpIDxlbT5JcyBWaXNpYmxlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJc1Zpc2libGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCb29sZWFuIGlzVmlzaWJsZSA9IElTX1ZJU0lCTEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZWZlcmVuY2UoKSA8ZW0+UmVmZXJlbmNlPC9lbT59JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJlZmVyZW5jZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PFJlZmVyZW5jZT4gcmVmZXJlbmNlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJvcGVydHkoKSA8ZW0+UHJvcGVydHk8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UHJvcGVydHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxQcm9wZXJ0eT4gcHJvcGVydHk7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRGlhZ3JhbUVsZW1lbnRJbXBsKCkgewotCQlzdXBlcigpOwotCi0JCS8vVU1BLS0+Ci0JCXJlYXNzaWduRGVmYXVsdFZhbHVlcygpOwotCQkvL1VNQTwtLSAgCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLkRJQUdSQU1fRUxFTUVOVDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQm9vbGVhbiBnZXRJc1Zpc2libGUoKSB7Ci0JCXJldHVybiBpc1Zpc2libGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SXNWaXNpYmxlKEJvb2xlYW4gbmV3SXNWaXNpYmxlKSB7Ci0JCUJvb2xlYW4gb2xkSXNWaXNpYmxlID0gaXNWaXNpYmxlOwotCQlpc1Zpc2libGUgPSBuZXdJc1Zpc2libGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuRElBR1JBTV9FTEVNRU5UX19JU19WSVNJQkxFLCBvbGRJc1Zpc2libGUsCi0JCQkJCWlzVmlzaWJsZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBHcmFwaEVsZW1lbnQgZ2V0Q29udGFpbmVyXygpIHsKLQkJaWYgKGVDb250YWluZXJGZWF0dXJlSUQgIT0gVW1hUGFja2FnZS5ESUFHUkFNX0VMRU1FTlRfX0NPTlRBSU5FUikKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gKEdyYXBoRWxlbWVudCkgZUNvbnRhaW5lcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBHcmFwaEVsZW1lbnQgYmFzaWNHZXRDb250YWluZXIoKSB7Ci0JCWlmIChlQ29udGFpbmVyRmVhdHVyZUlEICE9IFVtYVBhY2thZ2UuRElBR1JBTV9FTEVNRU5UX19DT05UQUlORVIpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIChHcmFwaEVsZW1lbnQpIGVJbnRlcm5hbENvbnRhaW5lcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldENvbnRhaW5lcihHcmFwaEVsZW1lbnQgbmV3Q29udGFpbmVyLAotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQltc2dzID0gZUJhc2ljU2V0Q29udGFpbmVyKChJbnRlcm5hbEVPYmplY3QpIG5ld0NvbnRhaW5lciwKLQkJCQlVbWFQYWNrYWdlLkRJQUdSQU1fRUxFTUVOVF9fQ09OVEFJTkVSLCBtc2dzKTsKLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29udGFpbmVyKEdyYXBoRWxlbWVudCBuZXdDb250YWluZXIpIHsKLQkJaWYgKG5ld0NvbnRhaW5lciAhPSBlSW50ZXJuYWxDb250YWluZXIoKQotCQkJCXx8IChlQ29udGFpbmVyRmVhdHVyZUlEICE9IFVtYVBhY2thZ2UuRElBR1JBTV9FTEVNRU5UX19DT05UQUlORVIgJiYgbmV3Q29udGFpbmVyICE9IG51bGwpKSB7Ci0JCQlpZiAoRWNvcmVVdGlsLmlzQW5jZXN0b3IodGhpcywgKEVPYmplY3QpIG5ld0NvbnRhaW5lcikpCi0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKLQkJCQkJCSJSZWN1cnNpdmUgY29udGFpbm1lbnQgbm90IGFsbG93ZWQgZm9yICIgKyB0b1N0cmluZygpKTsgLy8kTk9OLU5MUy0xJAotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoZUludGVybmFsQ29udGFpbmVyKCkgIT0gbnVsbCkKLQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCWlmIChuZXdDb250YWluZXIgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpIG5ld0NvbnRhaW5lcikuZUludmVyc2VBZGQodGhpcywKLQkJCQkJCVVtYVBhY2thZ2UuR1JBUEhfRUxFTUVOVF9fQ09OVEFJTkVELAotCQkJCQkJR3JhcGhFbGVtZW50LmNsYXNzLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldENvbnRhaW5lcihuZXdDb250YWluZXIsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkKLQkJCQltc2dzLmRpc3BhdGNoKCk7Ci0JCX0gZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLkRJQUdSQU1fRUxFTUVOVF9fQ09OVEFJTkVSLCBuZXdDb250YWluZXIsCi0JCQkJCW5ld0NvbnRhaW5lcikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0PFJlZmVyZW5jZT4gZ2V0UmVmZXJlbmNlKCkgewotCQlpZiAocmVmZXJlbmNlID09IG51bGwpIHsKLQkJCXJlZmVyZW5jZSA9IG5ldyBFT2JqZWN0V2l0aEludmVyc2VSZXNvbHZpbmdFTGlzdDxSZWZlcmVuY2U+KAotCQkJCQlSZWZlcmVuY2UuY2xhc3MsIHRoaXMsCi0JCQkJCVVtYVBhY2thZ2UuRElBR1JBTV9FTEVNRU5UX19SRUZFUkVOQ0UsCi0JCQkJCVVtYVBhY2thZ2UuUkVGRVJFTkNFX19SRUZFUkVOQ0VEKTsKLQkJfQotCQlyZXR1cm4gcmVmZXJlbmNlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0PFByb3BlcnR5PiBnZXRQcm9wZXJ0eSgpIHsKLQkJaWYgKHByb3BlcnR5ID09IG51bGwpIHsKLQkJCXByb3BlcnR5ID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0LlJlc29sdmluZzxQcm9wZXJ0eT4oCi0JCQkJCVByb3BlcnR5LmNsYXNzLCB0aGlzLCBVbWFQYWNrYWdlLkRJQUdSQU1fRUxFTUVOVF9fUFJPUEVSVFkpOwotCQl9Ci0JCXJldHVybiBwcm9wZXJ0eTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VBZGQoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLAotCQkJaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuRElBR1JBTV9FTEVNRU5UX19DT05UQUlORVI6Ci0JCQlpZiAoZUludGVybmFsQ29udGFpbmVyKCkgIT0gbnVsbCkKLQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCXJldHVybiBiYXNpY1NldENvbnRhaW5lcigoR3JhcGhFbGVtZW50KSBvdGhlckVuZCwgbXNncyk7Ci0JCWNhc2UgVW1hUGFja2FnZS5ESUFHUkFNX0VMRU1FTlRfX1JFRkVSRU5DRToKLQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8SW50ZXJuYWxFT2JqZWN0PikgKEludGVybmFsRUxpc3Q8Pz4pIGdldFJlZmVyZW5jZSgpKQotCQkJCQkuYmFzaWNBZGQob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZUFkZChvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLAotCQkJaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuRElBR1JBTV9FTEVNRU5UX19DT05UQUlORVI6Ci0JCQlyZXR1cm4gYmFzaWNTZXRDb250YWluZXIobnVsbCwgbXNncyk7Ci0JCWNhc2UgVW1hUGFja2FnZS5ESUFHUkFNX0VMRU1FTlRfX1JFRkVSRU5DRToKLQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pIGdldFJlZmVyZW5jZSgpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwKLQkJCQkJbXNncyk7Ci0JCWNhc2UgVW1hUGFja2FnZS5ESUFHUkFNX0VMRU1FTlRfX1BST1BFUlRZOgotCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PikgZ2V0UHJvcGVydHkoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsCi0JCQkJCW1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lckZlYXR1cmUoCi0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZUNvbnRhaW5lckZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuRElBR1JBTV9FTEVNRU5UX19DT05UQUlORVI6Ci0JCQlyZXR1cm4gZUludGVybmFsQ29udGFpbmVyKCkuZUludmVyc2VSZW1vdmUodGhpcywKLQkJCQkJVW1hUGFja2FnZS5HUkFQSF9FTEVNRU5UX19DT05UQUlORUQsIEdyYXBoRWxlbWVudC5jbGFzcywKLQkJCQkJbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVCYXNpY1JlbW92ZUZyb21Db250YWluZXJGZWF0dXJlKG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkRJQUdSQU1fRUxFTUVOVF9fSVNfVklTSUJMRToKLQkJCXJldHVybiBnZXRJc1Zpc2libGUoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkRJQUdSQU1fRUxFTUVOVF9fQ09OVEFJTkVSOgotCQkJaWYgKHJlc29sdmUpCi0JCQkJcmV0dXJuIGdldENvbnRhaW5lcl8oKTsKLQkJCXJldHVybiBiYXNpY0dldENvbnRhaW5lcigpOwotCQljYXNlIFVtYVBhY2thZ2UuRElBR1JBTV9FTEVNRU5UX19SRUZFUkVOQ0U6Ci0JCQlyZXR1cm4gZ2V0UmVmZXJlbmNlKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5ESUFHUkFNX0VMRU1FTlRfX1BST1BFUlRZOgotCQkJcmV0dXJuIGdldFByb3BlcnR5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkRJQUdSQU1fRUxFTUVOVF9fSVNfVklTSUJMRToKLQkJCXNldElzVmlzaWJsZSgoQm9vbGVhbikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuRElBR1JBTV9FTEVNRU5UX19DT05UQUlORVI6Ci0JCQlzZXRDb250YWluZXIoKEdyYXBoRWxlbWVudCkgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuRElBR1JBTV9FTEVNRU5UX19SRUZFUkVOQ0U6Ci0JCQlnZXRSZWZlcmVuY2UoKS5jbGVhcigpOwotCQkJZ2V0UmVmZXJlbmNlKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBSZWZlcmVuY2U+KSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5ESUFHUkFNX0VMRU1FTlRfX1BST1BFUlRZOgotCQkJZ2V0UHJvcGVydHkoKS5jbGVhcigpOwotCQkJZ2V0UHJvcGVydHkoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFByb3BlcnR5PikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkRJQUdSQU1fRUxFTUVOVF9fSVNfVklTSUJMRToKLQkJCXNldElzVmlzaWJsZShJU19WSVNJQkxFX0VERUZBVUxUKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkRJQUdSQU1fRUxFTUVOVF9fQ09OVEFJTkVSOgotCQkJc2V0Q29udGFpbmVyKChHcmFwaEVsZW1lbnQpIG51bGwpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuRElBR1JBTV9FTEVNRU5UX19SRUZFUkVOQ0U6Ci0JCQlnZXRSZWZlcmVuY2UoKS5jbGVhcigpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuRElBR1JBTV9FTEVNRU5UX19QUk9QRVJUWToKLQkJCWdldFByb3BlcnR5KCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQkvL1VNQS0tPgotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IGdldEZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlKGZlYXR1cmVJRCk7Ci0JCWlmIChmZWF0dXJlICE9IG51bGwpIHsKLQkJCXJldHVybiBpc0ZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlU2V0KGZlYXR1cmUpOwotCQl9Ci0JCS8vVU1BPC0tCQkKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkRJQUdSQU1fRUxFTUVOVF9fSVNfVklTSUJMRToKLQkJCXJldHVybiBJU19WSVNJQkxFX0VERUZBVUxUID09IG51bGwgPyBpc1Zpc2libGUgIT0gbnVsbAotCQkJCQk6ICFJU19WSVNJQkxFX0VERUZBVUxULmVxdWFscyhpc1Zpc2libGUpOwotCQljYXNlIFVtYVBhY2thZ2UuRElBR1JBTV9FTEVNRU5UX19DT05UQUlORVI6Ci0JCQlyZXR1cm4gYmFzaWNHZXRDb250YWluZXIoKSAhPSBudWxsOwotCQljYXNlIFVtYVBhY2thZ2UuRElBR1JBTV9FTEVNRU5UX19SRUZFUkVOQ0U6Ci0JCQlyZXR1cm4gcmVmZXJlbmNlICE9IG51bGwgJiYgIXJlZmVyZW5jZS5pc0VtcHR5KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5ESUFHUkFNX0VMRU1FTlRfX1BST1BFUlRZOgotCQkJcmV0dXJuIHByb3BlcnR5ICE9IG51bGwgJiYgIXByb3BlcnR5LmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpCi0JCQlyZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChpc1Zpc2libGU6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoaXNWaXNpYmxlKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vRGlhZ3JhbUVsZW1lbnRJbXBsCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvRGlhZ3JhbUltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9EaWFncmFtSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOGM4OWM2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9EaWFncmFtSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDU1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RXaXRoSW52ZXJzZVJlc29sdmluZ0VMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuU2VtYW50aWNNb2RlbEJyaWRnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5EaWFncmFtPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRGlhZ3JhbUltcGwjZ2V0RGlhZ3JhbUxpbmsgPGVtPkRpYWdyYW0gTGluazwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkRpYWdyYW1JbXBsI2dldE5hbWVzcGFjZSA8ZW0+TmFtZXNwYWNlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRGlhZ3JhbUltcGwjZ2V0Wm9vbSA8ZW0+Wm9vbTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkRpYWdyYW1JbXBsI2dldFZpZXdwb2ludCA8ZW0+Vmlld3BvaW50PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRGlhZ3JhbUltcGwgZXh0ZW5kcyBHcmFwaE5vZGVJbXBsIGltcGxlbWVudHMgRGlhZ3JhbSB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREaWFncmFtTGluaygpIDxlbT5EaWFncmFtIExpbms8L2VtPn0nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGlhZ3JhbUxpbmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxEaWFncmFtTGluaz4gZGlhZ3JhbUxpbms7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lc3BhY2UoKSA8ZW0+TmFtZXNwYWNlPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROYW1lc3BhY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWVzcGFjZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRab29tKCkgPGVtPlpvb208L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFpvb20oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgRG91YmxlIFpPT01fRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Wm9vbSgpIDxlbT5ab29tPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRab29tKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRG91YmxlIHpvb20gPSBaT09NX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Vmlld3BvaW50KCkgPGVtPlZpZXdwb2ludDwvZW0+fScgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Vmlld3BvaW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUG9pbnQgdmlld3BvaW50OwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIERpYWdyYW1JbXBsKCkgewotCQlzdXBlcigpOwotCi0JCS8vVU1BLS0+Ci0JCXJlYXNzaWduRGVmYXVsdFZhbHVlcygpOwotCQkvL1VNQTwtLSAgCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLkRJQUdSQU07Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERvdWJsZSBnZXRab29tKCkgewotCQlyZXR1cm4gem9vbTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRab29tKERvdWJsZSBuZXdab29tKSB7Ci0JCURvdWJsZSBvbGRab29tID0gem9vbTsKLQkJem9vbSA9IG5ld1pvb207Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuRElBR1JBTV9fWk9PTSwgb2xkWm9vbSwgem9vbSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQb2ludCBnZXRWaWV3cG9pbnQoKSB7Ci0JCWlmICh2aWV3cG9pbnQgIT0gbnVsbCAmJiAoKEVPYmplY3QpIHZpZXdwb2ludCkuZUlzUHJveHkoKSkgewotCQkJSW50ZXJuYWxFT2JqZWN0IG9sZFZpZXdwb2ludCA9IChJbnRlcm5hbEVPYmplY3QpIHZpZXdwb2ludDsKLQkJCXZpZXdwb2ludCA9IChQb2ludCkgZVJlc29sdmVQcm94eShvbGRWaWV3cG9pbnQpOwotCQkJaWYgKHZpZXdwb2ludCAhPSBvbGRWaWV3cG9pbnQpIHsKLQkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLAotCQkJCQkJCVVtYVBhY2thZ2UuRElBR1JBTV9fVklFV1BPSU5ULCBvbGRWaWV3cG9pbnQsCi0JCQkJCQkJdmlld3BvaW50KSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHZpZXdwb2ludDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUG9pbnQgYmFzaWNHZXRWaWV3cG9pbnQoKSB7Ci0JCXJldHVybiB2aWV3cG9pbnQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Vmlld3BvaW50KFBvaW50IG5ld1ZpZXdwb2ludCkgewotCQlQb2ludCBvbGRWaWV3cG9pbnQgPSB2aWV3cG9pbnQ7Ci0JCXZpZXdwb2ludCA9IG5ld1ZpZXdwb2ludDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5ESUFHUkFNX19WSUVXUE9JTlQsIG9sZFZpZXdwb2ludCwgdmlld3BvaW50KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3Q8RGlhZ3JhbUxpbms+IGdldERpYWdyYW1MaW5rKCkgewotCQlpZiAoZGlhZ3JhbUxpbmsgPT0gbnVsbCkgewotCQkJZGlhZ3JhbUxpbmsgPSBuZXcgRU9iamVjdFdpdGhJbnZlcnNlUmVzb2x2aW5nRUxpc3Q8RGlhZ3JhbUxpbms+KAotCQkJCQlEaWFncmFtTGluay5jbGFzcywgdGhpcywgVW1hUGFja2FnZS5ESUFHUkFNX19ESUFHUkFNX0xJTkssCi0JCQkJCVVtYVBhY2thZ2UuRElBR1JBTV9MSU5LX19ESUFHUkFNKTsKLQkJfQotCQlyZXR1cm4gZGlhZ3JhbUxpbms7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFNlbWFudGljTW9kZWxCcmlkZ2UgZ2V0TmFtZXNwYWNlKCkgewotCQlpZiAobmFtZXNwYWNlICE9IG51bGwgJiYgKChFT2JqZWN0KSBuYW1lc3BhY2UpLmVJc1Byb3h5KCkpIHsKLQkJCUludGVybmFsRU9iamVjdCBvbGROYW1lc3BhY2UgPSAoSW50ZXJuYWxFT2JqZWN0KSBuYW1lc3BhY2U7Ci0JCQluYW1lc3BhY2UgPSAoU2VtYW50aWNNb2RlbEJyaWRnZSkgZVJlc29sdmVQcm94eShvbGROYW1lc3BhY2UpOwotCQkJaWYgKG5hbWVzcGFjZSAhPSBvbGROYW1lc3BhY2UpIHsKLQkJCQlJbnRlcm5hbEVPYmplY3QgbmV3TmFtZXNwYWNlID0gKEludGVybmFsRU9iamVjdCkgbmFtZXNwYWNlOwotCQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBvbGROYW1lc3BhY2UuZUludmVyc2VSZW1vdmUodGhpcywKLQkJCQkJCVVtYVBhY2thZ2UuU0VNQU5USUNfTU9ERUxfQlJJREdFX19ESUFHUkFNLAotCQkJCQkJU2VtYW50aWNNb2RlbEJyaWRnZS5jbGFzcywgbnVsbCk7Ci0JCQkJaWYgKG5ld05hbWVzcGFjZS5lSW50ZXJuYWxDb250YWluZXIoKSA9PSBudWxsKSB7Ci0JCQkJCW1zZ3MgPSBuZXdOYW1lc3BhY2UuZUludmVyc2VBZGQodGhpcywKLQkJCQkJCQlVbWFQYWNrYWdlLlNFTUFOVElDX01PREVMX0JSSURHRV9fRElBR1JBTSwKLQkJCQkJCQlTZW1hbnRpY01vZGVsQnJpZGdlLmNsYXNzLCBtc2dzKTsKLQkJCQl9Ci0JCQkJaWYgKG1zZ3MgIT0gbnVsbCkKLQkJCQkJbXNncy5kaXNwYXRjaCgpOwotCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlJFU09MVkUsCi0JCQkJCQkJVW1hUGFja2FnZS5ESUFHUkFNX19OQU1FU1BBQ0UsIG9sZE5hbWVzcGFjZSwKLQkJCQkJCQluYW1lc3BhY2UpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbmFtZXNwYWNlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTZW1hbnRpY01vZGVsQnJpZGdlIGJhc2ljR2V0TmFtZXNwYWNlKCkgewotCQlyZXR1cm4gbmFtZXNwYWNlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldE5hbWVzcGFjZSgKLQkJCVNlbWFudGljTW9kZWxCcmlkZ2UgbmV3TmFtZXNwYWNlLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCVNlbWFudGljTW9kZWxCcmlkZ2Ugb2xkTmFtZXNwYWNlID0gbmFtZXNwYWNlOwotCQluYW1lc3BhY2UgPSBuZXdOYW1lc3BhY2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsCi0JCQkJCU5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuRElBR1JBTV9fTkFNRVNQQUNFLAotCQkJCQlvbGROYW1lc3BhY2UsIG5ld05hbWVzcGFjZSk7Ci0JCQlpZiAobXNncyA9PSBudWxsKQotCQkJCW1zZ3MgPSBub3RpZmljYXRpb247Ci0JCQllbHNlCi0JCQkJbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXROYW1lc3BhY2UoU2VtYW50aWNNb2RlbEJyaWRnZSBuZXdOYW1lc3BhY2UpIHsKLQkJaWYgKG5ld05hbWVzcGFjZSAhPSBuYW1lc3BhY2UpIHsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKG5hbWVzcGFjZSAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCkgbmFtZXNwYWNlKS5lSW52ZXJzZVJlbW92ZSh0aGlzLAotCQkJCQkJVW1hUGFja2FnZS5TRU1BTlRJQ19NT0RFTF9CUklER0VfX0RJQUdSQU0sCi0JCQkJCQlTZW1hbnRpY01vZGVsQnJpZGdlLmNsYXNzLCBtc2dzKTsKLQkJCWlmIChuZXdOYW1lc3BhY2UgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpIG5ld05hbWVzcGFjZSkuZUludmVyc2VBZGQodGhpcywKLQkJCQkJCVVtYVBhY2thZ2UuU0VNQU5USUNfTU9ERUxfQlJJREdFX19ESUFHUkFNLAotCQkJCQkJU2VtYW50aWNNb2RlbEJyaWRnZS5jbGFzcywgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXROYW1lc3BhY2UobmV3TmFtZXNwYWNlLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpCi0JCQkJbXNncy5kaXNwYXRjaCgpOwotCQl9IGVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5ESUFHUkFNX19OQU1FU1BBQ0UsIG5ld05hbWVzcGFjZSwgbmV3TmFtZXNwYWNlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JQE92ZXJyaWRlCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlQWRkKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwKLQkJCWludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkRJQUdSQU1fX0RJQUdSQU1fTElOSzoKLQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8SW50ZXJuYWxFT2JqZWN0PikgKEludGVybmFsRUxpc3Q8Pz4pIGdldERpYWdyYW1MaW5rKCkpCi0JCQkJCS5iYXNpY0FkZChvdGhlckVuZCwgbXNncyk7Ci0JCWNhc2UgVW1hUGFja2FnZS5ESUFHUkFNX19OQU1FU1BBQ0U6Ci0JCQlpZiAobmFtZXNwYWNlICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KSBuYW1lc3BhY2UpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsCi0JCQkJCQlFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gVW1hUGFja2FnZS5ESUFHUkFNX19OQU1FU1BBQ0UsCi0JCQkJCQludWxsLCBtc2dzKTsKLQkJCXJldHVybiBiYXNpY1NldE5hbWVzcGFjZSgoU2VtYW50aWNNb2RlbEJyaWRnZSkgb3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZUFkZChvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLAotCQkJaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuRElBR1JBTV9fRElBR1JBTV9MSU5LOgotCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PikgZ2V0RGlhZ3JhbUxpbmsoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsCi0JCQkJCW1zZ3MpOwotCQljYXNlIFVtYVBhY2thZ2UuRElBR1JBTV9fTkFNRVNQQUNFOgotCQkJcmV0dXJuIGJhc2ljU2V0TmFtZXNwYWNlKG51bGwsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ESUFHUkFNX19ESUFHUkFNX0xJTks6Ci0JCQlyZXR1cm4gZ2V0RGlhZ3JhbUxpbmsoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkRJQUdSQU1fX05BTUVTUEFDRToKLQkJCWlmIChyZXNvbHZlKQotCQkJCXJldHVybiBnZXROYW1lc3BhY2UoKTsKLQkJCXJldHVybiBiYXNpY0dldE5hbWVzcGFjZSgpOwotCQljYXNlIFVtYVBhY2thZ2UuRElBR1JBTV9fWk9PTToKLQkJCXJldHVybiBnZXRab29tKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5ESUFHUkFNX19WSUVXUE9JTlQ6Ci0JCQlpZiAocmVzb2x2ZSkKLQkJCQlyZXR1cm4gZ2V0Vmlld3BvaW50KCk7Ci0JCQlyZXR1cm4gYmFzaWNHZXRWaWV3cG9pbnQoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuRElBR1JBTV9fRElBR1JBTV9MSU5LOgotCQkJZ2V0RGlhZ3JhbUxpbmsoKS5jbGVhcigpOwotCQkJZ2V0RGlhZ3JhbUxpbmsoKS5hZGRBbGwoCi0JCQkJCShDb2xsZWN0aW9uPD8gZXh0ZW5kcyBEaWFncmFtTGluaz4pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkRJQUdSQU1fX05BTUVTUEFDRToKLQkJCXNldE5hbWVzcGFjZSgoU2VtYW50aWNNb2RlbEJyaWRnZSkgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuRElBR1JBTV9fWk9PTToKLQkJCXNldFpvb20oKERvdWJsZSkgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuRElBR1JBTV9fVklFV1BPSU5UOgotCQkJc2V0Vmlld3BvaW50KChQb2ludCkgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkRJQUdSQU1fX0RJQUdSQU1fTElOSzoKLQkJCWdldERpYWdyYW1MaW5rKCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkRJQUdSQU1fX05BTUVTUEFDRToKLQkJCXNldE5hbWVzcGFjZSgoU2VtYW50aWNNb2RlbEJyaWRnZSkgbnVsbCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5ESUFHUkFNX19aT09NOgotCQkJc2V0Wm9vbShaT09NX0VERUZBVUxUKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkRJQUdSQU1fX1ZJRVdQT0lOVDoKLQkJCXNldFZpZXdwb2ludCgoUG9pbnQpIG51bGwpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCS8vVU1BLS0+Ci0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gZ2V0RmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWUoZmVhdHVyZUlEKTsKLQkJaWYgKGZlYXR1cmUgIT0gbnVsbCkgewotCQkJcmV0dXJuIGlzRmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWVTZXQoZmVhdHVyZSk7Ci0JCX0KLQkJLy9VTUE8LS0JCQotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuRElBR1JBTV9fRElBR1JBTV9MSU5LOgotCQkJcmV0dXJuIGRpYWdyYW1MaW5rICE9IG51bGwgJiYgIWRpYWdyYW1MaW5rLmlzRW1wdHkoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkRJQUdSQU1fX05BTUVTUEFDRToKLQkJCXJldHVybiBuYW1lc3BhY2UgIT0gbnVsbDsKLQkJY2FzZSBVbWFQYWNrYWdlLkRJQUdSQU1fX1pPT006Ci0JCQlyZXR1cm4gWk9PTV9FREVGQVVMVCA9PSBudWxsID8gem9vbSAhPSBudWxsIDogIVpPT01fRURFRkFVTFQKLQkJCQkJLmVxdWFscyh6b29tKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkRJQUdSQU1fX1ZJRVdQT0lOVDoKLQkJCXJldHVybiB2aWV3cG9pbnQgIT0gbnVsbDsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpCi0JCQlyZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiICh6b29tOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKHpvb20pOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9EaWFncmFtSW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0RpYWdyYW1MaW5rSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0RpYWdyYW1MaW5rSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZWE2OGU5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9EaWFncmFtTGlua0ltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbUxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5EaWFncmFtIExpbms8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5EaWFncmFtTGlua0ltcGwjZ2V0Wm9vbSA8ZW0+Wm9vbTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkRpYWdyYW1MaW5rSW1wbCNnZXRWaWV3cG9ydCA8ZW0+Vmlld3BvcnQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5EaWFncmFtTGlua0ltcGwjZ2V0RGlhZ3JhbSA8ZW0+RGlhZ3JhbTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkRpYWdyYW1MaW5rSW1wbCNnZXRHcmFwaEVsZW1lbnQgPGVtPkdyYXBoIEVsZW1lbnQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEaWFncmFtTGlua0ltcGwgZXh0ZW5kcyBEaWFncmFtRWxlbWVudEltcGwgaW1wbGVtZW50cyBEaWFncmFtTGluayB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Wm9vbSgpIDxlbT5ab29tPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRab29tKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIERvdWJsZSBaT09NX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFpvb20oKSA8ZW0+Wm9vbTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Wm9vbSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIERvdWJsZSB6b29tID0gWk9PTV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZpZXdwb3J0KCkgPGVtPlZpZXdwb3J0PC9lbT59JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRWaWV3cG9ydCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFBvaW50IHZpZXdwb3J0OwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGlhZ3JhbSgpIDxlbT5EaWFncmFtPC9lbT59JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREaWFncmFtKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRGlhZ3JhbSBkaWFncmFtOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIERpYWdyYW1MaW5rSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQotCQkvL1VNQS0tPgotCQlyZWFzc2lnbkRlZmF1bHRWYWx1ZXMoKTsKLQkJLy9VTUE8LS0gIAotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5ESUFHUkFNX0xJTks7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERvdWJsZSBnZXRab29tKCkgewotCQlyZXR1cm4gem9vbTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRab29tKERvdWJsZSBuZXdab29tKSB7Ci0JCURvdWJsZSBvbGRab29tID0gem9vbTsKLQkJem9vbSA9IG5ld1pvb207Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuRElBR1JBTV9MSU5LX19aT09NLCBvbGRab29tLCB6b29tKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFBvaW50IGdldFZpZXdwb3J0KCkgewotCQlpZiAodmlld3BvcnQgIT0gbnVsbCAmJiAoKEVPYmplY3QpIHZpZXdwb3J0KS5lSXNQcm94eSgpKSB7Ci0JCQlJbnRlcm5hbEVPYmplY3Qgb2xkVmlld3BvcnQgPSAoSW50ZXJuYWxFT2JqZWN0KSB2aWV3cG9ydDsKLQkJCXZpZXdwb3J0ID0gKFBvaW50KSBlUmVzb2x2ZVByb3h5KG9sZFZpZXdwb3J0KTsKLQkJCWlmICh2aWV3cG9ydCAhPSBvbGRWaWV3cG9ydCkgewotCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlJFU09MVkUsCi0JCQkJCQkJVW1hUGFja2FnZS5ESUFHUkFNX0xJTktfX1ZJRVdQT1JULCBvbGRWaWV3cG9ydCwKLQkJCQkJCQl2aWV3cG9ydCkpOwotCQkJfQotCQl9Ci0JCXJldHVybiB2aWV3cG9ydDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUG9pbnQgYmFzaWNHZXRWaWV3cG9ydCgpIHsKLQkJcmV0dXJuIHZpZXdwb3J0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZpZXdwb3J0KFBvaW50IG5ld1ZpZXdwb3J0KSB7Ci0JCVBvaW50IG9sZFZpZXdwb3J0ID0gdmlld3BvcnQ7Ci0JCXZpZXdwb3J0ID0gbmV3Vmlld3BvcnQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuRElBR1JBTV9MSU5LX19WSUVXUE9SVCwgb2xkVmlld3BvcnQsIHZpZXdwb3J0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEdyYXBoRWxlbWVudCBnZXRHcmFwaEVsZW1lbnQoKSB7Ci0JCWlmIChlQ29udGFpbmVyRmVhdHVyZUlEICE9IFVtYVBhY2thZ2UuRElBR1JBTV9MSU5LX19HUkFQSF9FTEVNRU5UKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoR3JhcGhFbGVtZW50KSBlQ29udGFpbmVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEdyYXBoRWxlbWVudCBiYXNpY0dldEdyYXBoRWxlbWVudCgpIHsKLQkJaWYgKGVDb250YWluZXJGZWF0dXJlSUQgIT0gVW1hUGFja2FnZS5ESUFHUkFNX0xJTktfX0dSQVBIX0VMRU1FTlQpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIChHcmFwaEVsZW1lbnQpIGVJbnRlcm5hbENvbnRhaW5lcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldEdyYXBoRWxlbWVudChHcmFwaEVsZW1lbnQgbmV3R3JhcGhFbGVtZW50LAotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQltc2dzID0gZUJhc2ljU2V0Q29udGFpbmVyKChJbnRlcm5hbEVPYmplY3QpIG5ld0dyYXBoRWxlbWVudCwKLQkJCQlVbWFQYWNrYWdlLkRJQUdSQU1fTElOS19fR1JBUEhfRUxFTUVOVCwgbXNncyk7Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEdyYXBoRWxlbWVudChHcmFwaEVsZW1lbnQgbmV3R3JhcGhFbGVtZW50KSB7Ci0JCWlmIChuZXdHcmFwaEVsZW1lbnQgIT0gZUludGVybmFsQ29udGFpbmVyKCkKLQkJCQl8fCAoZUNvbnRhaW5lckZlYXR1cmVJRCAhPSBVbWFQYWNrYWdlLkRJQUdSQU1fTElOS19fR1JBUEhfRUxFTUVOVCAmJiBuZXdHcmFwaEVsZW1lbnQgIT0gbnVsbCkpIHsKLQkJCWlmIChFY29yZVV0aWwuaXNBbmNlc3Rvcih0aGlzLCAoRU9iamVjdCkgbmV3R3JhcGhFbGVtZW50KSkKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAotCQkJCQkJIlJlY3Vyc2l2ZSBjb250YWlubWVudCBub3QgYWxsb3dlZCBmb3IgIiArIHRvU3RyaW5nKCkpOyAvLyROT04tTkxTLTEkCi0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChlSW50ZXJuYWxDb250YWluZXIoKSAhPSBudWxsKQotCQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJaWYgKG5ld0dyYXBoRWxlbWVudCAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCkgbmV3R3JhcGhFbGVtZW50KS5lSW52ZXJzZUFkZCh0aGlzLAotCQkJCQkJVW1hUGFja2FnZS5HUkFQSF9FTEVNRU5UX19MSU5LLCBHcmFwaEVsZW1lbnQuY2xhc3MsCi0JCQkJCQltc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldEdyYXBoRWxlbWVudChuZXdHcmFwaEVsZW1lbnQsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkKLQkJCQltc2dzLmRpc3BhdGNoKCk7Ci0JCX0gZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLkRJQUdSQU1fTElOS19fR1JBUEhfRUxFTUVOVCwgbmV3R3JhcGhFbGVtZW50LAotCQkJCQluZXdHcmFwaEVsZW1lbnQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRGlhZ3JhbSBnZXREaWFncmFtKCkgewotCQlpZiAoZGlhZ3JhbSAhPSBudWxsICYmICgoRU9iamVjdCkgZGlhZ3JhbSkuZUlzUHJveHkoKSkgewotCQkJSW50ZXJuYWxFT2JqZWN0IG9sZERpYWdyYW0gPSAoSW50ZXJuYWxFT2JqZWN0KSBkaWFncmFtOwotCQkJZGlhZ3JhbSA9IChEaWFncmFtKSBlUmVzb2x2ZVByb3h5KG9sZERpYWdyYW0pOwotCQkJaWYgKGRpYWdyYW0gIT0gb2xkRGlhZ3JhbSkgewotCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlJFU09MVkUsCi0JCQkJCQkJVW1hUGFja2FnZS5ESUFHUkFNX0xJTktfX0RJQUdSQU0sIG9sZERpYWdyYW0sCi0JCQkJCQkJZGlhZ3JhbSkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBkaWFncmFtOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEaWFncmFtIGJhc2ljR2V0RGlhZ3JhbSgpIHsKLQkJcmV0dXJuIGRpYWdyYW07Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0RGlhZ3JhbShEaWFncmFtIG5ld0RpYWdyYW0sCi0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCURpYWdyYW0gb2xkRGlhZ3JhbSA9IGRpYWdyYW07Ci0JCWRpYWdyYW0gPSBuZXdEaWFncmFtOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLAotCQkJCQlOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLkRJQUdSQU1fTElOS19fRElBR1JBTSwKLQkJCQkJb2xkRGlhZ3JhbSwgbmV3RGlhZ3JhbSk7Ci0JCQlpZiAobXNncyA9PSBudWxsKQotCQkJCW1zZ3MgPSBub3RpZmljYXRpb247Ci0JCQllbHNlCi0JCQkJbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREaWFncmFtKERpYWdyYW0gbmV3RGlhZ3JhbSkgewotCQlpZiAobmV3RGlhZ3JhbSAhPSBkaWFncmFtKSB7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChkaWFncmFtICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KSBkaWFncmFtKS5lSW52ZXJzZVJlbW92ZSh0aGlzLAotCQkJCQkJVW1hUGFja2FnZS5ESUFHUkFNX19ESUFHUkFNX0xJTkssIERpYWdyYW0uY2xhc3MsIG1zZ3MpOwotCQkJaWYgKG5ld0RpYWdyYW0gIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpIG5ld0RpYWdyYW0pLmVJbnZlcnNlQWRkKHRoaXMsCi0JCQkJCQlVbWFQYWNrYWdlLkRJQUdSQU1fX0RJQUdSQU1fTElOSywgRGlhZ3JhbS5jbGFzcywgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXREaWFncmFtKG5ld0RpYWdyYW0sIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkKLQkJCQltc2dzLmRpc3BhdGNoKCk7Ci0JCX0gZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLkRJQUdSQU1fTElOS19fRElBR1JBTSwgbmV3RGlhZ3JhbSwgbmV3RGlhZ3JhbSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZUFkZChJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsCi0JCQlpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ESUFHUkFNX0xJTktfX0RJQUdSQU06Ci0JCQlpZiAoZGlhZ3JhbSAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCkgZGlhZ3JhbSkuZUludmVyc2VSZW1vdmUodGhpcywKLQkJCQkJCVVtYVBhY2thZ2UuRElBR1JBTV9fRElBR1JBTV9MSU5LLCBEaWFncmFtLmNsYXNzLCBtc2dzKTsKLQkJCXJldHVybiBiYXNpY1NldERpYWdyYW0oKERpYWdyYW0pIG90aGVyRW5kLCBtc2dzKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkRJQUdSQU1fTElOS19fR1JBUEhfRUxFTUVOVDoKLQkJCWlmIChlSW50ZXJuYWxDb250YWluZXIoKSAhPSBudWxsKQotCQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJcmV0dXJuIGJhc2ljU2V0R3JhcGhFbGVtZW50KChHcmFwaEVsZW1lbnQpIG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VBZGQob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwKLQkJCWludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkRJQUdSQU1fTElOS19fRElBR1JBTToKLQkJCXJldHVybiBiYXNpY1NldERpYWdyYW0obnVsbCwgbXNncyk7Ci0JCWNhc2UgVW1hUGFja2FnZS5ESUFHUkFNX0xJTktfX0dSQVBIX0VMRU1FTlQ6Ci0JCQlyZXR1cm4gYmFzaWNTZXRHcmFwaEVsZW1lbnQobnVsbCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyRmVhdHVyZSgKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChlQ29udGFpbmVyRmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ESUFHUkFNX0xJTktfX0dSQVBIX0VMRU1FTlQ6Ci0JCQlyZXR1cm4gZUludGVybmFsQ29udGFpbmVyKCkuZUludmVyc2VSZW1vdmUodGhpcywKLQkJCQkJVW1hUGFja2FnZS5HUkFQSF9FTEVNRU5UX19MSU5LLCBHcmFwaEVsZW1lbnQuY2xhc3MsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyRmVhdHVyZShtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ESUFHUkFNX0xJTktfX1pPT006Ci0JCQlyZXR1cm4gZ2V0Wm9vbSgpOwotCQljYXNlIFVtYVBhY2thZ2UuRElBR1JBTV9MSU5LX19WSUVXUE9SVDoKLQkJCWlmIChyZXNvbHZlKQotCQkJCXJldHVybiBnZXRWaWV3cG9ydCgpOwotCQkJcmV0dXJuIGJhc2ljR2V0Vmlld3BvcnQoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkRJQUdSQU1fTElOS19fRElBR1JBTToKLQkJCWlmIChyZXNvbHZlKQotCQkJCXJldHVybiBnZXREaWFncmFtKCk7Ci0JCQlyZXR1cm4gYmFzaWNHZXREaWFncmFtKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5ESUFHUkFNX0xJTktfX0dSQVBIX0VMRU1FTlQ6Ci0JCQlpZiAocmVzb2x2ZSkKLQkJCQlyZXR1cm4gZ2V0R3JhcGhFbGVtZW50KCk7Ci0JCQlyZXR1cm4gYmFzaWNHZXRHcmFwaEVsZW1lbnQoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuRElBR1JBTV9MSU5LX19aT09NOgotCQkJc2V0Wm9vbSgoRG91YmxlKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5ESUFHUkFNX0xJTktfX1ZJRVdQT1JUOgotCQkJc2V0Vmlld3BvcnQoKFBvaW50KSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5ESUFHUkFNX0xJTktfX0RJQUdSQU06Ci0JCQlzZXREaWFncmFtKChEaWFncmFtKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5ESUFHUkFNX0xJTktfX0dSQVBIX0VMRU1FTlQ6Ci0JCQlzZXRHcmFwaEVsZW1lbnQoKEdyYXBoRWxlbWVudCkgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkRJQUdSQU1fTElOS19fWk9PTToKLQkJCXNldFpvb20oWk9PTV9FREVGQVVMVCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5ESUFHUkFNX0xJTktfX1ZJRVdQT1JUOgotCQkJc2V0Vmlld3BvcnQoKFBvaW50KSBudWxsKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkRJQUdSQU1fTElOS19fRElBR1JBTToKLQkJCXNldERpYWdyYW0oKERpYWdyYW0pIG51bGwpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuRElBR1JBTV9MSU5LX19HUkFQSF9FTEVNRU5UOgotCQkJc2V0R3JhcGhFbGVtZW50KChHcmFwaEVsZW1lbnQpIG51bGwpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCS8vVU1BLS0+Ci0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gZ2V0RmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWUoZmVhdHVyZUlEKTsKLQkJaWYgKGZlYXR1cmUgIT0gbnVsbCkgewotCQkJcmV0dXJuIGlzRmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWVTZXQoZmVhdHVyZSk7Ci0JCX0KLQkJLy9VTUE8LS0JCQotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuRElBR1JBTV9MSU5LX19aT09NOgotCQkJcmV0dXJuIFpPT01fRURFRkFVTFQgPT0gbnVsbCA/IHpvb20gIT0gbnVsbCA6ICFaT09NX0VERUZBVUxUCi0JCQkJCS5lcXVhbHMoem9vbSk7Ci0JCWNhc2UgVW1hUGFja2FnZS5ESUFHUkFNX0xJTktfX1ZJRVdQT1JUOgotCQkJcmV0dXJuIHZpZXdwb3J0ICE9IG51bGw7Ci0JCWNhc2UgVW1hUGFja2FnZS5ESUFHUkFNX0xJTktfX0RJQUdSQU06Ci0JCQlyZXR1cm4gZGlhZ3JhbSAhPSBudWxsOwotCQljYXNlIFVtYVBhY2thZ2UuRElBR1JBTV9MSU5LX19HUkFQSF9FTEVNRU5UOgotCQkJcmV0dXJuIGJhc2ljR2V0R3JhcGhFbGVtZW50KCkgIT0gbnVsbDsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpCi0JCQlyZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiICh6b29tOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKHpvb20pOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9EaWFncmFtTGlua0ltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9EaW1lbnNpb25JbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvRGltZW5zaW9uSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZjE1ZDgyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9EaW1lbnNpb25JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpbWVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS5pbXBsLk11bHRpUmVzb3VyY2VFT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RGltZW5zaW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRGltZW5zaW9uSW1wbCNnZXRXaWR0aCA8ZW0+V2lkdGg8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5EaW1lbnNpb25JbXBsI2dldEhlaWdodCA8ZW0+SGVpZ2h0PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRGltZW5zaW9uSW1wbCBleHRlbmRzIE11bHRpUmVzb3VyY2VFT2JqZWN0IGltcGxlbWVudHMgRGltZW5zaW9uIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRXaWR0aCgpIDxlbT5XaWR0aDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0V2lkdGgoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgRG91YmxlIFdJRFRIX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFdpZHRoKCkgPGVtPldpZHRoPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRXaWR0aCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIERvdWJsZSB3aWR0aCA9IFdJRFRIX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEhlaWdodCgpIDxlbT5IZWlnaHQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEhlaWdodCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBEb3VibGUgSEVJR0hUX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEhlaWdodCgpIDxlbT5IZWlnaHQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEhlaWdodCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIERvdWJsZSBoZWlnaHQgPSBIRUlHSFRfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRGltZW5zaW9uSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQotCQkvL1VNQS0tPgotCQlyZWFzc2lnbkRlZmF1bHRWYWx1ZXMoKTsKLQkJLy9VTUE8LS0gIAotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5ESU1FTlNJT047Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERvdWJsZSBnZXRXaWR0aCgpIHsKLQkJcmV0dXJuIHdpZHRoOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFdpZHRoKERvdWJsZSBuZXdXaWR0aCkgewotCQlEb3VibGUgb2xkV2lkdGggPSB3aWR0aDsKLQkJd2lkdGggPSBuZXdXaWR0aDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5ESU1FTlNJT05fX1dJRFRILCBvbGRXaWR0aCwgd2lkdGgpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRG91YmxlIGdldEhlaWdodCgpIHsKLQkJcmV0dXJuIGhlaWdodDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRIZWlnaHQoRG91YmxlIG5ld0hlaWdodCkgewotCQlEb3VibGUgb2xkSGVpZ2h0ID0gaGVpZ2h0OwotCQloZWlnaHQgPSBuZXdIZWlnaHQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuRElNRU5TSU9OX19IRUlHSFQsIG9sZEhlaWdodCwgaGVpZ2h0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuRElNRU5TSU9OX19XSURUSDoKLQkJCXJldHVybiBnZXRXaWR0aCgpOwotCQljYXNlIFVtYVBhY2thZ2UuRElNRU5TSU9OX19IRUlHSFQ6Ci0JCQlyZXR1cm4gZ2V0SGVpZ2h0KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkRJTUVOU0lPTl9fV0lEVEg6Ci0JCQlzZXRXaWR0aCgoRG91YmxlKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5ESU1FTlNJT05fX0hFSUdIVDoKLQkJCXNldEhlaWdodCgoRG91YmxlKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuRElNRU5TSU9OX19XSURUSDoKLQkJCXNldFdpZHRoKFdJRFRIX0VERUZBVUxUKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkRJTUVOU0lPTl9fSEVJR0hUOgotCQkJc2V0SGVpZ2h0KEhFSUdIVF9FREVGQVVMVCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJLy9VTUEtLT4KLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBnZXRGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZShmZWF0dXJlSUQpOwotCQlpZiAoZmVhdHVyZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gaXNGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZVNldChmZWF0dXJlKTsKLQkJfQotCQkvL1VNQTwtLQkJCi0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ESU1FTlNJT05fX1dJRFRIOgotCQkJcmV0dXJuIFdJRFRIX0VERUZBVUxUID09IG51bGwgPyB3aWR0aCAhPSBudWxsIDogIVdJRFRIX0VERUZBVUxUCi0JCQkJCS5lcXVhbHMod2lkdGgpOwotCQljYXNlIFVtYVBhY2thZ2UuRElNRU5TSU9OX19IRUlHSFQ6Ci0JCQlyZXR1cm4gSEVJR0hUX0VERUZBVUxUID09IG51bGwgPyBoZWlnaHQgIT0gbnVsbCA6ICFIRUlHSFRfRURFRkFVTFQKLQkJCQkJLmVxdWFscyhoZWlnaHQpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkKLQkJCXJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHdpZHRoOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKHdpZHRoKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBoZWlnaHQ6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoaGVpZ2h0KTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vRGltZW5zaW9uSW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0Rpc2NpcGxpbmVHcm91cGluZ0ltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9EaXNjaXBsaW5lR3JvdXBpbmdJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzZGQ5NWUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0Rpc2NpcGxpbmVHcm91cGluZ0ltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdFJlc29sdmluZ0VMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGlzY2lwbGluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpc2NpcGxpbmVHcm91cGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5EaXNjaXBsaW5lIEdyb3VwaW5nPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRGlzY2lwbGluZUdyb3VwaW5nSW1wbCNnZXREaXNjaXBsaW5lcyA8ZW0+RGlzY2lwbGluZXM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEaXNjaXBsaW5lR3JvdXBpbmdJbXBsIGV4dGVuZHMgQ29udGVudENhdGVnb3J5SW1wbCBpbXBsZW1lbnRzCi0JCURpc2NpcGxpbmVHcm91cGluZyB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREaXNjaXBsaW5lcygpIDxlbT5EaXNjaXBsaW5lczwvZW0+fScgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREaXNjaXBsaW5lcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PERpc2NpcGxpbmU+IGRpc2NpcGxpbmVzOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIERpc2NpcGxpbmVHcm91cGluZ0ltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJLy9VTUEtLT4KLQkJcmVhc3NpZ25EZWZhdWx0VmFsdWVzKCk7Ci0JCS8vVU1BPC0tICAKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuRElTQ0lQTElORV9HUk9VUElORzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdDxEaXNjaXBsaW5lPiBnZXREaXNjaXBsaW5lcygpIHsKLQkJaWYgKGRpc2NpcGxpbmVzID09IG51bGwpIHsKLQkJCWRpc2NpcGxpbmVzID0gbmV3IEVPYmplY3RSZXNvbHZpbmdFTGlzdDxEaXNjaXBsaW5lPigKLQkJCQkJRGlzY2lwbGluZS5jbGFzcywgdGhpcywKLQkJCQkJVW1hUGFja2FnZS5ESVNDSVBMSU5FX0dST1VQSU5HX19ESVNDSVBMSU5FUyk7Ci0JCX0KLQkJcmV0dXJuIGRpc2NpcGxpbmVzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkRJU0NJUExJTkVfR1JPVVBJTkdfX0RJU0NJUExJTkVTOgotCQkJcmV0dXJuIGdldERpc2NpcGxpbmVzKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkRJU0NJUExJTkVfR1JPVVBJTkdfX0RJU0NJUExJTkVTOgotCQkJZ2V0RGlzY2lwbGluZXMoKS5jbGVhcigpOwotCQkJZ2V0RGlzY2lwbGluZXMoKQotCQkJCQkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBEaXNjaXBsaW5lPikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkRJU0NJUExJTkVfR1JPVVBJTkdfX0RJU0NJUExJTkVTOgotCQkJZ2V0RGlzY2lwbGluZXMoKS5jbGVhcigpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCS8vVU1BLS0+Ci0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gZ2V0RmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWUoZmVhdHVyZUlEKTsKLQkJaWYgKGZlYXR1cmUgIT0gbnVsbCkgewotCQkJcmV0dXJuIGlzRmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWVTZXQoZmVhdHVyZSk7Ci0JCX0KLQkJLy9VTUE8LS0JCQotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuRElTQ0lQTElORV9HUk9VUElOR19fRElTQ0lQTElORVM6Ci0JCQlyZXR1cm4gZGlzY2lwbGluZXMgIT0gbnVsbCAmJiAhZGlzY2lwbGluZXMuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLX0gLy9EaXNjaXBsaW5lR3JvdXBpbmdJbXBsCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvRGlzY2lwbGluZUltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9EaXNjaXBsaW5lSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMTU1YjQ4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9EaXNjaXBsaW5lSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RSZXNvbHZpbmdFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaXNjaXBsaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFzazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5EaXNjaXBsaW5lPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRGlzY2lwbGluZUltcGwjZ2V0VGFza3MgPGVtPlRhc2tzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRGlzY2lwbGluZUltcGwjZ2V0U3ViZGlzY2lwbGluZSA8ZW0+U3ViZGlzY2lwbGluZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkRpc2NpcGxpbmVJbXBsI2dldFJlZmVyZW5jZVdvcmtmbG93cyA8ZW0+UmVmZXJlbmNlIFdvcmtmbG93czwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERpc2NpcGxpbmVJbXBsIGV4dGVuZHMgQ29udGVudENhdGVnb3J5SW1wbCBpbXBsZW1lbnRzIERpc2NpcGxpbmUgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VGFza3MoKSA8ZW0+VGFza3M8L2VtPn0nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VGFza3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxUYXNrPiB0YXNrczsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFN1YmRpc2NpcGxpbmUoKSA8ZW0+U3ViZGlzY2lwbGluZTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTdWJkaXNjaXBsaW5lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8RGlzY2lwbGluZT4gc3ViZGlzY2lwbGluZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlZmVyZW5jZVdvcmtmbG93cygpIDxlbT5SZWZlcmVuY2UgV29ya2Zsb3dzPC9lbT59JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJlZmVyZW5jZVdvcmtmbG93cygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PEFjdGl2aXR5PiByZWZlcmVuY2VXb3JrZmxvd3M7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRGlzY2lwbGluZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJLy9VTUEtLT4KLQkJcmVhc3NpZ25EZWZhdWx0VmFsdWVzKCk7Ci0JCS8vVU1BPC0tICAKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuRElTQ0lQTElORTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdDxUYXNrPiBnZXRUYXNrcygpIHsKLQkJaWYgKHRhc2tzID09IG51bGwpIHsKLQkJCXRhc2tzID0gbmV3IEVPYmplY3RSZXNvbHZpbmdFTGlzdDxUYXNrPihUYXNrLmNsYXNzLCB0aGlzLAotCQkJCQlVbWFQYWNrYWdlLkRJU0NJUExJTkVfX1RBU0tTKTsKLQkJfQotCQlyZXR1cm4gdGFza3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3Q8RGlzY2lwbGluZT4gZ2V0U3ViZGlzY2lwbGluZSgpIHsKLQkJaWYgKHN1YmRpc2NpcGxpbmUgPT0gbnVsbCkgewotCQkJc3ViZGlzY2lwbGluZSA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdC5SZXNvbHZpbmc8RGlzY2lwbGluZT4oCi0JCQkJCURpc2NpcGxpbmUuY2xhc3MsIHRoaXMsCi0JCQkJCVVtYVBhY2thZ2UuRElTQ0lQTElORV9fU1VCRElTQ0lQTElORSk7Ci0JCX0KLQkJcmV0dXJuIHN1YmRpc2NpcGxpbmU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3Q8QWN0aXZpdHk+IGdldFJlZmVyZW5jZVdvcmtmbG93cygpIHsKLQkJaWYgKHJlZmVyZW5jZVdvcmtmbG93cyA9PSBudWxsKSB7Ci0JCQlyZWZlcmVuY2VXb3JrZmxvd3MgPSBuZXcgRU9iamVjdFJlc29sdmluZ0VMaXN0PEFjdGl2aXR5PigKLQkJCQkJQWN0aXZpdHkuY2xhc3MsIHRoaXMsCi0JCQkJCVVtYVBhY2thZ2UuRElTQ0lQTElORV9fUkVGRVJFTkNFX1dPUktGTE9XUyk7Ci0JCX0KLQkJcmV0dXJuIHJlZmVyZW5jZVdvcmtmbG93czsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLAotCQkJaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuRElTQ0lQTElORV9fU1VCRElTQ0lQTElORToKLQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pIGdldFN1YmRpc2NpcGxpbmUoKSkuYmFzaWNSZW1vdmUoCi0JCQkJCW90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuRElTQ0lQTElORV9fVEFTS1M6Ci0JCQlyZXR1cm4gZ2V0VGFza3MoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkRJU0NJUExJTkVfX1NVQkRJU0NJUExJTkU6Ci0JCQlyZXR1cm4gZ2V0U3ViZGlzY2lwbGluZSgpOwotCQljYXNlIFVtYVBhY2thZ2UuRElTQ0lQTElORV9fUkVGRVJFTkNFX1dPUktGTE9XUzoKLQkJCXJldHVybiBnZXRSZWZlcmVuY2VXb3JrZmxvd3MoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuRElTQ0lQTElORV9fVEFTS1M6Ci0JCQlnZXRUYXNrcygpLmNsZWFyKCk7Ci0JCQlnZXRUYXNrcygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgVGFzaz4pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkRJU0NJUExJTkVfX1NVQkRJU0NJUExJTkU6Ci0JCQlnZXRTdWJkaXNjaXBsaW5lKCkuY2xlYXIoKTsKLQkJCWdldFN1YmRpc2NpcGxpbmUoKS5hZGRBbGwoCi0JCQkJCShDb2xsZWN0aW9uPD8gZXh0ZW5kcyBEaXNjaXBsaW5lPikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuRElTQ0lQTElORV9fUkVGRVJFTkNFX1dPUktGTE9XUzoKLQkJCWdldFJlZmVyZW5jZVdvcmtmbG93cygpLmNsZWFyKCk7Ci0JCQlnZXRSZWZlcmVuY2VXb3JrZmxvd3MoKS5hZGRBbGwoCi0JCQkJCShDb2xsZWN0aW9uPD8gZXh0ZW5kcyBBY3Rpdml0eT4pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ESVNDSVBMSU5FX19UQVNLUzoKLQkJCWdldFRhc2tzKCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkRJU0NJUExJTkVfX1NVQkRJU0NJUExJTkU6Ci0JCQlnZXRTdWJkaXNjaXBsaW5lKCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkRJU0NJUExJTkVfX1JFRkVSRU5DRV9XT1JLRkxPV1M6Ci0JCQlnZXRSZWZlcmVuY2VXb3JrZmxvd3MoKS5jbGVhcigpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCS8vVU1BLS0+Ci0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gZ2V0RmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWUoZmVhdHVyZUlEKTsKLQkJaWYgKGZlYXR1cmUgIT0gbnVsbCkgewotCQkJcmV0dXJuIGlzRmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWVTZXQoZmVhdHVyZSk7Ci0JCX0KLQkJLy9VTUE8LS0JCQotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuRElTQ0lQTElORV9fVEFTS1M6Ci0JCQlyZXR1cm4gdGFza3MgIT0gbnVsbCAmJiAhdGFza3MuaXNFbXB0eSgpOwotCQljYXNlIFVtYVBhY2thZ2UuRElTQ0lQTElORV9fU1VCRElTQ0lQTElORToKLQkJCXJldHVybiBzdWJkaXNjaXBsaW5lICE9IG51bGwgJiYgIXN1YmRpc2NpcGxpbmUuaXNFbXB0eSgpOwotCQljYXNlIFVtYVBhY2thZ2UuRElTQ0lQTElORV9fUkVGRVJFTkNFX1dPUktGTE9XUzoKLQkJCXJldHVybiByZWZlcmVuY2VXb3JrZmxvd3MgIT0gbnVsbCAmJiAhcmVmZXJlbmNlV29ya2Zsb3dzLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi19IC8vRGlzY2lwbGluZUltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Eb21haW5JbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvRG9tYWluSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NzkzZTU0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Eb21haW5JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdFJlc29sdmluZ0VMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Eb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Eb21haW48L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Eb21haW5JbXBsI2dldFdvcmtQcm9kdWN0cyA8ZW0+V29yayBQcm9kdWN0czwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkRvbWFpbkltcGwjZ2V0U3ViZG9tYWlucyA8ZW0+U3ViZG9tYWluczwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERvbWFpbkltcGwgZXh0ZW5kcyBDb250ZW50Q2F0ZWdvcnlJbXBsIGltcGxlbWVudHMgRG9tYWluIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFdvcmtQcm9kdWN0cygpIDxlbT5Xb3JrIFByb2R1Y3RzPC9lbT59JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFdvcmtQcm9kdWN0cygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PFdvcmtQcm9kdWN0PiB3b3JrUHJvZHVjdHM7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTdWJkb21haW5zKCkgPGVtPlN1YmRvbWFpbnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U3ViZG9tYWlucygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PERvbWFpbj4gc3ViZG9tYWluczsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBEb21haW5JbXBsKCkgewotCQlzdXBlcigpOwotCi0JCS8vVU1BLS0+Ci0JCXJlYXNzaWduRGVmYXVsdFZhbHVlcygpOwotCQkvL1VNQTwtLSAgCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLkRPTUFJTjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdDxXb3JrUHJvZHVjdD4gZ2V0V29ya1Byb2R1Y3RzKCkgewotCQlpZiAod29ya1Byb2R1Y3RzID09IG51bGwpIHsKLQkJCXdvcmtQcm9kdWN0cyA9IG5ldyBFT2JqZWN0UmVzb2x2aW5nRUxpc3Q8V29ya1Byb2R1Y3Q+KAotCQkJCQlXb3JrUHJvZHVjdC5jbGFzcywgdGhpcywgVW1hUGFja2FnZS5ET01BSU5fX1dPUktfUFJPRFVDVFMpOwotCQl9Ci0JCXJldHVybiB3b3JrUHJvZHVjdHM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3Q8RG9tYWluPiBnZXRTdWJkb21haW5zKCkgewotCQlpZiAoc3ViZG9tYWlucyA9PSBudWxsKSB7Ci0JCQlzdWJkb21haW5zID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0LlJlc29sdmluZzxEb21haW4+KAotCQkJCQlEb21haW4uY2xhc3MsIHRoaXMsIFVtYVBhY2thZ2UuRE9NQUlOX19TVUJET01BSU5TKTsKLQkJfQotCQlyZXR1cm4gc3ViZG9tYWluczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLAotCQkJaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuRE9NQUlOX19TVUJET01BSU5TOgotCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PikgZ2V0U3ViZG9tYWlucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwKLQkJCQkJbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkRPTUFJTl9fV09SS19QUk9EVUNUUzoKLQkJCXJldHVybiBnZXRXb3JrUHJvZHVjdHMoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkRPTUFJTl9fU1VCRE9NQUlOUzoKLQkJCXJldHVybiBnZXRTdWJkb21haW5zKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkRPTUFJTl9fV09SS19QUk9EVUNUUzoKLQkJCWdldFdvcmtQcm9kdWN0cygpLmNsZWFyKCk7Ci0JCQlnZXRXb3JrUHJvZHVjdHMoKS5hZGRBbGwoCi0JCQkJCShDb2xsZWN0aW9uPD8gZXh0ZW5kcyBXb3JrUHJvZHVjdD4pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkRPTUFJTl9fU1VCRE9NQUlOUzoKLQkJCWdldFN1YmRvbWFpbnMoKS5jbGVhcigpOwotCQkJZ2V0U3ViZG9tYWlucygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgRG9tYWluPikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkRPTUFJTl9fV09SS19QUk9EVUNUUzoKLQkJCWdldFdvcmtQcm9kdWN0cygpLmNsZWFyKCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5ET01BSU5fX1NVQkRPTUFJTlM6Ci0JCQlnZXRTdWJkb21haW5zKCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQkvL1VNQS0tPgotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IGdldEZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlKGZlYXR1cmVJRCk7Ci0JCWlmIChmZWF0dXJlICE9IG51bGwpIHsKLQkJCXJldHVybiBpc0ZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlU2V0KGZlYXR1cmUpOwotCQl9Ci0JCS8vVU1BPC0tCQkKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkRPTUFJTl9fV09SS19QUk9EVUNUUzoKLQkJCXJldHVybiB3b3JrUHJvZHVjdHMgIT0gbnVsbCAmJiAhd29ya1Byb2R1Y3RzLmlzRW1wdHkoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkRPTUFJTl9fU1VCRE9NQUlOUzoKLQkJCXJldHVybiBzdWJkb21haW5zICE9IG51bGwgJiYgIXN1YmRvbWFpbnMuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLX0gLy9Eb21haW5JbXBsCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvRWxlbWVudEltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9FbGVtZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZTBmYjE3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9FbGVtZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUuaW1wbC5NdWx0aVJlc291cmNlRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkVsZW1lbnQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBFbGVtZW50SW1wbCBleHRlbmRzIE11bHRpUmVzb3VyY2VFT2JqZWN0IGltcGxlbWVudHMKLQkJRWxlbWVudCB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRWxlbWVudEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJLy9VTUEtLT4KLQkJcmVhc3NpZ25EZWZhdWx0VmFsdWVzKCk7Ci0JCS8vVU1BPC0tICAKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuRUxFTUVOVDsKLQl9Ci0KLX0gLy9FbGVtZW50SW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0VsbGlwc2VJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvRWxsaXBzZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWE5NzgzMS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvRWxsaXBzZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5FbGxpcHNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RWxsaXBzZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkVsbGlwc2VJbXBsI2dldENlbnRlciA8ZW0+Q2VudGVyPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRWxsaXBzZUltcGwjZ2V0UmFkaXVzWCA8ZW0+UmFkaXVzIFg8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5FbGxpcHNlSW1wbCNnZXRSYWRpdXNZIDxlbT5SYWRpdXMgWTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkVsbGlwc2VJbXBsI2dldFJvdGF0aW9uIDxlbT5Sb3RhdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkVsbGlwc2VJbXBsI2dldFN0YXJ0QW5nbGUgPGVtPlN0YXJ0IEFuZ2xlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRWxsaXBzZUltcGwjZ2V0RW5kQW5nbGUgPGVtPkVuZCBBbmdsZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEVsbGlwc2VJbXBsIGV4dGVuZHMgR3JhcGhpY1ByaW1pdGl2ZUltcGwgaW1wbGVtZW50cyBFbGxpcHNlIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENlbnRlcigpIDxlbT5DZW50ZXI8L2VtPn0nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENlbnRlcigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFBvaW50IGNlbnRlcjsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSYWRpdXNYKCkgPGVtPlJhZGl1cyBYPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSYWRpdXNYKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIERvdWJsZSBSQURJVVNfWF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSYWRpdXNYKCkgPGVtPlJhZGl1cyBYPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSYWRpdXNYKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRG91YmxlIHJhZGl1c1ggPSBSQURJVVNfWF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSYWRpdXNZKCkgPGVtPlJhZGl1cyBZPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSYWRpdXNZKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIERvdWJsZSBSQURJVVNfWV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSYWRpdXNZKCkgPGVtPlJhZGl1cyBZPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSYWRpdXNZKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRG91YmxlIHJhZGl1c1kgPSBSQURJVVNfWV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSb3RhdGlvbigpIDxlbT5Sb3RhdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Um90YXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgRG91YmxlIFJPVEFUSU9OX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJvdGF0aW9uKCkgPGVtPlJvdGF0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSb3RhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIERvdWJsZSByb3RhdGlvbiA9IFJPVEFUSU9OX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFN0YXJ0QW5nbGUoKSA8ZW0+U3RhcnQgQW5nbGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFN0YXJ0QW5nbGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgRG91YmxlIFNUQVJUX0FOR0xFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFN0YXJ0QW5nbGUoKSA8ZW0+U3RhcnQgQW5nbGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFN0YXJ0QW5nbGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBEb3VibGUgc3RhcnRBbmdsZSA9IFNUQVJUX0FOR0xFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEVuZEFuZ2xlKCkgPGVtPkVuZCBBbmdsZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RW5kQW5nbGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgRG91YmxlIEVORF9BTkdMRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFbmRBbmdsZSgpIDxlbT5FbmQgQW5nbGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEVuZEFuZ2xlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRG91YmxlIGVuZEFuZ2xlID0gRU5EX0FOR0xFX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVsbGlwc2VJbXBsKCkgewotCQlzdXBlcigpOwotCi0JCS8vVU1BLS0+Ci0JCXJlYXNzaWduRGVmYXVsdFZhbHVlcygpOwotCQkvL1VNQTwtLSAgCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLkVMTElQU0U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERvdWJsZSBnZXRSYWRpdXNYKCkgewotCQlyZXR1cm4gcmFkaXVzWDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSYWRpdXNYKERvdWJsZSBuZXdSYWRpdXNYKSB7Ci0JCURvdWJsZSBvbGRSYWRpdXNYID0gcmFkaXVzWDsKLQkJcmFkaXVzWCA9IG5ld1JhZGl1c1g7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuRUxMSVBTRV9fUkFESVVTX1gsIG9sZFJhZGl1c1gsIHJhZGl1c1gpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRG91YmxlIGdldFJhZGl1c1koKSB7Ci0JCXJldHVybiByYWRpdXNZOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJhZGl1c1koRG91YmxlIG5ld1JhZGl1c1kpIHsKLQkJRG91YmxlIG9sZFJhZGl1c1kgPSByYWRpdXNZOwotCQlyYWRpdXNZID0gbmV3UmFkaXVzWTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5FTExJUFNFX19SQURJVVNfWSwgb2xkUmFkaXVzWSwgcmFkaXVzWSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEb3VibGUgZ2V0Um90YXRpb24oKSB7Ci0JCXJldHVybiByb3RhdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSb3RhdGlvbihEb3VibGUgbmV3Um90YXRpb24pIHsKLQkJRG91YmxlIG9sZFJvdGF0aW9uID0gcm90YXRpb247Ci0JCXJvdGF0aW9uID0gbmV3Um90YXRpb247Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuRUxMSVBTRV9fUk9UQVRJT04sIG9sZFJvdGF0aW9uLCByb3RhdGlvbikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEb3VibGUgZ2V0U3RhcnRBbmdsZSgpIHsKLQkJcmV0dXJuIHN0YXJ0QW5nbGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0U3RhcnRBbmdsZShEb3VibGUgbmV3U3RhcnRBbmdsZSkgewotCQlEb3VibGUgb2xkU3RhcnRBbmdsZSA9IHN0YXJ0QW5nbGU7Ci0JCXN0YXJ0QW5nbGUgPSBuZXdTdGFydEFuZ2xlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLkVMTElQU0VfX1NUQVJUX0FOR0xFLCBvbGRTdGFydEFuZ2xlLCBzdGFydEFuZ2xlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERvdWJsZSBnZXRFbmRBbmdsZSgpIHsKLQkJcmV0dXJuIGVuZEFuZ2xlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVuZEFuZ2xlKERvdWJsZSBuZXdFbmRBbmdsZSkgewotCQlEb3VibGUgb2xkRW5kQW5nbGUgPSBlbmRBbmdsZTsKLQkJZW5kQW5nbGUgPSBuZXdFbmRBbmdsZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5FTExJUFNFX19FTkRfQU5HTEUsIG9sZEVuZEFuZ2xlLCBlbmRBbmdsZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQb2ludCBnZXRDZW50ZXIoKSB7Ci0JCWlmIChjZW50ZXIgIT0gbnVsbCAmJiAoKEVPYmplY3QpIGNlbnRlcikuZUlzUHJveHkoKSkgewotCQkJSW50ZXJuYWxFT2JqZWN0IG9sZENlbnRlciA9IChJbnRlcm5hbEVPYmplY3QpIGNlbnRlcjsKLQkJCWNlbnRlciA9IChQb2ludCkgZVJlc29sdmVQcm94eShvbGRDZW50ZXIpOwotCQkJaWYgKGNlbnRlciAhPSBvbGRDZW50ZXIpIHsKLQkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLAotCQkJCQkJCVVtYVBhY2thZ2UuRUxMSVBTRV9fQ0VOVEVSLCBvbGRDZW50ZXIsIGNlbnRlcikpOwotCQkJfQotCQl9Ci0JCXJldHVybiBjZW50ZXI7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFBvaW50IGJhc2ljR2V0Q2VudGVyKCkgewotCQlyZXR1cm4gY2VudGVyOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENlbnRlcihQb2ludCBuZXdDZW50ZXIpIHsKLQkJUG9pbnQgb2xkQ2VudGVyID0gY2VudGVyOwotCQljZW50ZXIgPSBuZXdDZW50ZXI7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuRUxMSVBTRV9fQ0VOVEVSLCBvbGRDZW50ZXIsIGNlbnRlcikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkVMTElQU0VfX0NFTlRFUjoKLQkJCWlmIChyZXNvbHZlKQotCQkJCXJldHVybiBnZXRDZW50ZXIoKTsKLQkJCXJldHVybiBiYXNpY0dldENlbnRlcigpOwotCQljYXNlIFVtYVBhY2thZ2UuRUxMSVBTRV9fUkFESVVTX1g6Ci0JCQlyZXR1cm4gZ2V0UmFkaXVzWCgpOwotCQljYXNlIFVtYVBhY2thZ2UuRUxMSVBTRV9fUkFESVVTX1k6Ci0JCQlyZXR1cm4gZ2V0UmFkaXVzWSgpOwotCQljYXNlIFVtYVBhY2thZ2UuRUxMSVBTRV9fUk9UQVRJT046Ci0JCQlyZXR1cm4gZ2V0Um90YXRpb24oKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkVMTElQU0VfX1NUQVJUX0FOR0xFOgotCQkJcmV0dXJuIGdldFN0YXJ0QW5nbGUoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkVMTElQU0VfX0VORF9BTkdMRToKLQkJCXJldHVybiBnZXRFbmRBbmdsZSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5FTExJUFNFX19DRU5URVI6Ci0JCQlzZXRDZW50ZXIoKFBvaW50KSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5FTExJUFNFX19SQURJVVNfWDoKLQkJCXNldFJhZGl1c1goKERvdWJsZSkgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuRUxMSVBTRV9fUkFESVVTX1k6Ci0JCQlzZXRSYWRpdXNZKChEb3VibGUpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkVMTElQU0VfX1JPVEFUSU9OOgotCQkJc2V0Um90YXRpb24oKERvdWJsZSkgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuRUxMSVBTRV9fU1RBUlRfQU5HTEU6Ci0JCQlzZXRTdGFydEFuZ2xlKChEb3VibGUpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkVMTElQU0VfX0VORF9BTkdMRToKLQkJCXNldEVuZEFuZ2xlKChEb3VibGUpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5FTExJUFNFX19DRU5URVI6Ci0JCQlzZXRDZW50ZXIoKFBvaW50KSBudWxsKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkVMTElQU0VfX1JBRElVU19YOgotCQkJc2V0UmFkaXVzWChSQURJVVNfWF9FREVGQVVMVCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5FTExJUFNFX19SQURJVVNfWToKLQkJCXNldFJhZGl1c1koUkFESVVTX1lfRURFRkFVTFQpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuRUxMSVBTRV9fUk9UQVRJT046Ci0JCQlzZXRSb3RhdGlvbihST1RBVElPTl9FREVGQVVMVCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5FTExJUFNFX19TVEFSVF9BTkdMRToKLQkJCXNldFN0YXJ0QW5nbGUoU1RBUlRfQU5HTEVfRURFRkFVTFQpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuRUxMSVBTRV9fRU5EX0FOR0xFOgotCQkJc2V0RW5kQW5nbGUoRU5EX0FOR0xFX0VERUZBVUxUKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQkvL1VNQS0tPgotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IGdldEZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlKGZlYXR1cmVJRCk7Ci0JCWlmIChmZWF0dXJlICE9IG51bGwpIHsKLQkJCXJldHVybiBpc0ZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlU2V0KGZlYXR1cmUpOwotCQl9Ci0JCS8vVU1BPC0tCQkKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkVMTElQU0VfX0NFTlRFUjoKLQkJCXJldHVybiBjZW50ZXIgIT0gbnVsbDsKLQkJY2FzZSBVbWFQYWNrYWdlLkVMTElQU0VfX1JBRElVU19YOgotCQkJcmV0dXJuIFJBRElVU19YX0VERUZBVUxUID09IG51bGwgPyByYWRpdXNYICE9IG51bGwKLQkJCQkJOiAhUkFESVVTX1hfRURFRkFVTFQuZXF1YWxzKHJhZGl1c1gpOwotCQljYXNlIFVtYVBhY2thZ2UuRUxMSVBTRV9fUkFESVVTX1k6Ci0JCQlyZXR1cm4gUkFESVVTX1lfRURFRkFVTFQgPT0gbnVsbCA/IHJhZGl1c1kgIT0gbnVsbAotCQkJCQk6ICFSQURJVVNfWV9FREVGQVVMVC5lcXVhbHMocmFkaXVzWSk7Ci0JCWNhc2UgVW1hUGFja2FnZS5FTExJUFNFX19ST1RBVElPTjoKLQkJCXJldHVybiBST1RBVElPTl9FREVGQVVMVCA9PSBudWxsID8gcm90YXRpb24gIT0gbnVsbAotCQkJCQk6ICFST1RBVElPTl9FREVGQVVMVC5lcXVhbHMocm90YXRpb24pOwotCQljYXNlIFVtYVBhY2thZ2UuRUxMSVBTRV9fU1RBUlRfQU5HTEU6Ci0JCQlyZXR1cm4gU1RBUlRfQU5HTEVfRURFRkFVTFQgPT0gbnVsbCA/IHN0YXJ0QW5nbGUgIT0gbnVsbAotCQkJCQk6ICFTVEFSVF9BTkdMRV9FREVGQVVMVC5lcXVhbHMoc3RhcnRBbmdsZSk7Ci0JCWNhc2UgVW1hUGFja2FnZS5FTExJUFNFX19FTkRfQU5HTEU6Ci0JCQlyZXR1cm4gRU5EX0FOR0xFX0VERUZBVUxUID09IG51bGwgPyBlbmRBbmdsZSAhPSBudWxsCi0JCQkJCTogIUVORF9BTkdMRV9FREVGQVVMVC5lcXVhbHMoZW5kQW5nbGUpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkKLQkJCXJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHJhZGl1c1g6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQocmFkaXVzWCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcmFkaXVzWTogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChyYWRpdXNZKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCByb3RhdGlvbjogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChyb3RhdGlvbik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgc3RhcnRBbmdsZTogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChzdGFydEFuZ2xlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBlbmRBbmdsZTogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChlbmRBbmdsZSk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL0VsbGlwc2VJbXBsCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0VzdGltYXRpb25Db25zaWRlcmF0aW9uc0ltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2RhY2ZkZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkVzdGltYXRpb25Db25zaWRlcmF0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Fc3RpbWF0aW9uIENvbnNpZGVyYXRpb25zPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zSW1wbCBleHRlbmRzIEd1aWRhbmNlSW1wbCBpbXBsZW1lbnRzCi0JCUVzdGltYXRpb25Db25zaWRlcmF0aW9ucyB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQotCQkvL1VNQS0tPgotCQlyZWFzc2lnbkRlZmF1bHRWYWx1ZXMoKTsKLQkJLy9VTUE8LS0gIAotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5FU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TOwotCX0KLQotfSAvL0VzdGltYXRpb25Db25zaWRlcmF0aW9uc0ltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9FeGFtcGxlSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0V4YW1wbGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2M2MyOGQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0V4YW1wbGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRXhhbXBsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5FeGFtcGxlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRXhhbXBsZUltcGwgZXh0ZW5kcyBHdWlkYW5jZUltcGwgaW1wbGVtZW50cyBFeGFtcGxlIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFeGFtcGxlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQotCQkvL1VNQS0tPgotCQlyZWFzc2lnbkRlZmF1bHRWYWx1ZXMoKTsKLQkJLy9VTUE8LS0gIAotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5FWEFNUExFOwotCX0KLQotfSAvL0V4YW1wbGVJbXBsCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvRnVsZmlsbGFibGVFbGVtZW50SW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0Z1bGZpbGxhYmxlRWxlbWVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDJjZWQ2MC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvRnVsZmlsbGFibGVFbGVtZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdFJlc29sdmluZ0VMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5GdWxmaWxsYWJsZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RnVsZmlsbGFibGUgRWxlbWVudDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkZ1bGZpbGxhYmxlRWxlbWVudEltcGwjZ2V0RnVsZmlsbHMgPGVtPkZ1bGZpbGxzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRnVsZmlsbGFibGVFbGVtZW50SW1wbCBleHRlbmRzIERlc2NyaWJhYmxlRWxlbWVudEltcGwgaW1wbGVtZW50cwotCQlGdWxmaWxsYWJsZUVsZW1lbnQgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RnVsZmlsbHMoKSA8ZW0+RnVsZmlsbHM8L2VtPn0nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RnVsZmlsbHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxGdWxmaWxsYWJsZUVsZW1lbnQ+IGZ1bGZpbGxzOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEZ1bGZpbGxhYmxlRWxlbWVudEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJLy9VTUEtLT4KLQkJcmVhc3NpZ25EZWZhdWx0VmFsdWVzKCk7Ci0JCS8vVU1BPC0tICAKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuRlVMRklMTEFCTEVfRUxFTUVOVDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdDxGdWxmaWxsYWJsZUVsZW1lbnQ+IGdldEZ1bGZpbGxzKCkgewotCQlpZiAoZnVsZmlsbHMgPT0gbnVsbCkgewotCQkJZnVsZmlsbHMgPSBuZXcgRU9iamVjdFJlc29sdmluZ0VMaXN0PEZ1bGZpbGxhYmxlRWxlbWVudD4oCi0JCQkJCUZ1bGZpbGxhYmxlRWxlbWVudC5jbGFzcywgdGhpcywKLQkJCQkJVW1hUGFja2FnZS5GVUxGSUxMQUJMRV9FTEVNRU5UX19GVUxGSUxMUyk7Ci0JCX0KLQkJcmV0dXJuIGZ1bGZpbGxzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkZVTEZJTExBQkxFX0VMRU1FTlRfX0ZVTEZJTExTOgotCQkJcmV0dXJuIGdldEZ1bGZpbGxzKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkZVTEZJTExBQkxFX0VMRU1FTlRfX0ZVTEZJTExTOgotCQkJZ2V0RnVsZmlsbHMoKS5jbGVhcigpOwotCQkJZ2V0RnVsZmlsbHMoKS5hZGRBbGwoCi0JCQkJCShDb2xsZWN0aW9uPD8gZXh0ZW5kcyBGdWxmaWxsYWJsZUVsZW1lbnQ+KSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuRlVMRklMTEFCTEVfRUxFTUVOVF9fRlVMRklMTFM6Ci0JCQlnZXRGdWxmaWxscygpLmNsZWFyKCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJLy9VTUEtLT4KLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBnZXRGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZShmZWF0dXJlSUQpOwotCQlpZiAoZmVhdHVyZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gaXNGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZVNldChmZWF0dXJlKTsKLQkJfQotCQkvL1VNQTwtLQkJCi0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5GVUxGSUxMQUJMRV9FTEVNRU5UX19GVUxGSUxMUzoKLQkJCXJldHVybiBmdWxmaWxscyAhPSBudWxsICYmICFmdWxmaWxscy5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotfSAvL0Z1bGZpbGxhYmxlRWxlbWVudEltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9HcmFwaENvbm5lY3RvckltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9HcmFwaENvbm5lY3RvckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWU3YTE0Ny4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvR3JhcGhDb25uZWN0b3JJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RXaXRoSW52ZXJzZVJlc29sdmluZ0VMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhDb25uZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaEVkZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+R3JhcGggQ29ubmVjdG9yPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuR3JhcGhDb25uZWN0b3JJbXBsI2dldEdyYXBoRWRnZSA8ZW0+R3JhcGggRWRnZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkdyYXBoQ29ubmVjdG9ySW1wbCNnZXRHcmFwaEVsZW1lbnQgPGVtPkdyYXBoIEVsZW1lbnQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBHcmFwaENvbm5lY3RvckltcGwgZXh0ZW5kcyBHcmFwaEVsZW1lbnRJbXBsIGltcGxlbWVudHMKLQkJR3JhcGhDb25uZWN0b3IgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0R3JhcGhFZGdlKCkgPGVtPkdyYXBoIEVkZ2U8L2VtPn0nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0R3JhcGhFZGdlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8R3JhcGhFZGdlPiBncmFwaEVkZ2U7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgR3JhcGhDb25uZWN0b3JJbXBsKCkgewotCQlzdXBlcigpOwotCi0JCS8vVU1BLS0+Ci0JCXJlYXNzaWduRGVmYXVsdFZhbHVlcygpOwotCQkvL1VNQTwtLSAgCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLkdSQVBIX0NPTk5FQ1RPUjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgR3JhcGhFbGVtZW50IGdldEdyYXBoRWxlbWVudCgpIHsKLQkJaWYgKGVDb250YWluZXJGZWF0dXJlSUQgIT0gVW1hUGFja2FnZS5HUkFQSF9DT05ORUNUT1JfX0dSQVBIX0VMRU1FTlQpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIChHcmFwaEVsZW1lbnQpIGVDb250YWluZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgR3JhcGhFbGVtZW50IGJhc2ljR2V0R3JhcGhFbGVtZW50KCkgewotCQlpZiAoZUNvbnRhaW5lckZlYXR1cmVJRCAhPSBVbWFQYWNrYWdlLkdSQVBIX0NPTk5FQ1RPUl9fR1JBUEhfRUxFTUVOVCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gKEdyYXBoRWxlbWVudCkgZUludGVybmFsQ29udGFpbmVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0R3JhcGhFbGVtZW50KEdyYXBoRWxlbWVudCBuZXdHcmFwaEVsZW1lbnQsCi0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCW1zZ3MgPSBlQmFzaWNTZXRDb250YWluZXIoKEludGVybmFsRU9iamVjdCkgbmV3R3JhcGhFbGVtZW50LAotCQkJCVVtYVBhY2thZ2UuR1JBUEhfQ09OTkVDVE9SX19HUkFQSF9FTEVNRU5ULCBtc2dzKTsKLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0R3JhcGhFbGVtZW50KEdyYXBoRWxlbWVudCBuZXdHcmFwaEVsZW1lbnQpIHsKLQkJaWYgKG5ld0dyYXBoRWxlbWVudCAhPSBlSW50ZXJuYWxDb250YWluZXIoKQotCQkJCXx8IChlQ29udGFpbmVyRmVhdHVyZUlEICE9IFVtYVBhY2thZ2UuR1JBUEhfQ09OTkVDVE9SX19HUkFQSF9FTEVNRU5UICYmIG5ld0dyYXBoRWxlbWVudCAhPSBudWxsKSkgewotCQkJaWYgKEVjb3JlVXRpbC5pc0FuY2VzdG9yKHRoaXMsIChFT2JqZWN0KSBuZXdHcmFwaEVsZW1lbnQpKQotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCi0JCQkJCQkiUmVjdXJzaXZlIGNvbnRhaW5tZW50IG5vdCBhbGxvd2VkIGZvciAiICsgdG9TdHJpbmcoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGVJbnRlcm5hbENvbnRhaW5lcigpICE9IG51bGwpCi0JCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQlpZiAobmV3R3JhcGhFbGVtZW50ICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KSBuZXdHcmFwaEVsZW1lbnQpLmVJbnZlcnNlQWRkKHRoaXMsCi0JCQkJCQlVbWFQYWNrYWdlLkdSQVBIX0VMRU1FTlRfX0FOQ0hPUkFHRSwKLQkJCQkJCUdyYXBoRWxlbWVudC5jbGFzcywgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRHcmFwaEVsZW1lbnQobmV3R3JhcGhFbGVtZW50LCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpCi0JCQkJbXNncy5kaXNwYXRjaCgpOwotCQl9IGVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5HUkFQSF9DT05ORUNUT1JfX0dSQVBIX0VMRU1FTlQsIG5ld0dyYXBoRWxlbWVudCwKLQkJCQkJbmV3R3JhcGhFbGVtZW50KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3Q8R3JhcGhFZGdlPiBnZXRHcmFwaEVkZ2UoKSB7Ci0JCWlmIChncmFwaEVkZ2UgPT0gbnVsbCkgewotCQkJZ3JhcGhFZGdlID0gbmV3IEVPYmplY3RXaXRoSW52ZXJzZVJlc29sdmluZ0VMaXN0Lk1hbnlJbnZlcnNlPEdyYXBoRWRnZT4oCi0JCQkJCUdyYXBoRWRnZS5jbGFzcywgdGhpcywKLQkJCQkJVW1hUGFja2FnZS5HUkFQSF9DT05ORUNUT1JfX0dSQVBIX0VER0UsCi0JCQkJCVVtYVBhY2thZ2UuR1JBUEhfRURHRV9fQU5DSE9SKTsKLQkJfQotCQlyZXR1cm4gZ3JhcGhFZGdlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCUBPdmVycmlkZQotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZUFkZChJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsCi0JCQlpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5HUkFQSF9DT05ORUNUT1JfX0dSQVBIX0VER0U6Ci0JCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PEludGVybmFsRU9iamVjdD4pIChJbnRlcm5hbEVMaXN0PD8+KSBnZXRHcmFwaEVkZ2UoKSkKLQkJCQkJLmJhc2ljQWRkKG90aGVyRW5kLCBtc2dzKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkdSQVBIX0NPTk5FQ1RPUl9fR1JBUEhfRUxFTUVOVDoKLQkJCWlmIChlSW50ZXJuYWxDb250YWluZXIoKSAhPSBudWxsKQotCQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJcmV0dXJuIGJhc2ljU2V0R3JhcGhFbGVtZW50KChHcmFwaEVsZW1lbnQpIG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VBZGQob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwKLQkJCWludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkdSQVBIX0NPTk5FQ1RPUl9fR1JBUEhfRURHRToKLQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pIGdldEdyYXBoRWRnZSgpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwKLQkJCQkJbXNncyk7Ci0JCWNhc2UgVW1hUGFja2FnZS5HUkFQSF9DT05ORUNUT1JfX0dSQVBIX0VMRU1FTlQ6Ci0JCQlyZXR1cm4gYmFzaWNTZXRHcmFwaEVsZW1lbnQobnVsbCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyRmVhdHVyZSgKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChlQ29udGFpbmVyRmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5HUkFQSF9DT05ORUNUT1JfX0dSQVBIX0VMRU1FTlQ6Ci0JCQlyZXR1cm4gZUludGVybmFsQ29udGFpbmVyKCkuZUludmVyc2VSZW1vdmUodGhpcywKLQkJCQkJVW1hUGFja2FnZS5HUkFQSF9FTEVNRU5UX19BTkNIT1JBR0UsIEdyYXBoRWxlbWVudC5jbGFzcywKLQkJCQkJbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVCYXNpY1JlbW92ZUZyb21Db250YWluZXJGZWF0dXJlKG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkdSQVBIX0NPTk5FQ1RPUl9fR1JBUEhfRURHRToKLQkJCXJldHVybiBnZXRHcmFwaEVkZ2UoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkdSQVBIX0NPTk5FQ1RPUl9fR1JBUEhfRUxFTUVOVDoKLQkJCWlmIChyZXNvbHZlKQotCQkJCXJldHVybiBnZXRHcmFwaEVsZW1lbnQoKTsKLQkJCXJldHVybiBiYXNpY0dldEdyYXBoRWxlbWVudCgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5HUkFQSF9DT05ORUNUT1JfX0dSQVBIX0VER0U6Ci0JCQlnZXRHcmFwaEVkZ2UoKS5jbGVhcigpOwotCQkJZ2V0R3JhcGhFZGdlKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBHcmFwaEVkZ2U+KSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5HUkFQSF9DT05ORUNUT1JfX0dSQVBIX0VMRU1FTlQ6Ci0JCQlzZXRHcmFwaEVsZW1lbnQoKEdyYXBoRWxlbWVudCkgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkdSQVBIX0NPTk5FQ1RPUl9fR1JBUEhfRURHRToKLQkJCWdldEdyYXBoRWRnZSgpLmNsZWFyKCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5HUkFQSF9DT05ORUNUT1JfX0dSQVBIX0VMRU1FTlQ6Ci0JCQlzZXRHcmFwaEVsZW1lbnQoKEdyYXBoRWxlbWVudCkgbnVsbCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJLy9VTUEtLT4KLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBnZXRGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZShmZWF0dXJlSUQpOwotCQlpZiAoZmVhdHVyZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gaXNGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZVNldChmZWF0dXJlKTsKLQkJfQotCQkvL1VNQTwtLQkJCi0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5HUkFQSF9DT05ORUNUT1JfX0dSQVBIX0VER0U6Ci0JCQlyZXR1cm4gZ3JhcGhFZGdlICE9IG51bGwgJiYgIWdyYXBoRWRnZS5pc0VtcHR5KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5HUkFQSF9DT05ORUNUT1JfX0dSQVBIX0VMRU1FTlQ6Ci0JCQlyZXR1cm4gYmFzaWNHZXRHcmFwaEVsZW1lbnQoKSAhPSBudWxsOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLX0gLy9HcmFwaENvbm5lY3RvckltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9HcmFwaEVkZ2VJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvR3JhcGhFZGdlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNjViMTdjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9HcmFwaEVkZ2VJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdFdpdGhJbnZlcnNlUmVzb2x2aW5nRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoQ29ubmVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhFZGdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+R3JhcGggRWRnZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkdyYXBoRWRnZUltcGwjZ2V0V2F5cG9pbnRzIDxlbT5XYXlwb2ludHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5HcmFwaEVkZ2VJbXBsI2dldEFuY2hvciA8ZW0+QW5jaG9yPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgR3JhcGhFZGdlSW1wbCBleHRlbmRzIEdyYXBoRWxlbWVudEltcGwgaW1wbGVtZW50cyBHcmFwaEVkZ2UgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0V2F5cG9pbnRzKCkgPGVtPldheXBvaW50czwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRXYXlwb2ludHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxQb2ludD4gd2F5cG9pbnRzOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QW5jaG9yKCkgPGVtPkFuY2hvcjwvZW0+fScgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBbmNob3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxHcmFwaENvbm5lY3Rvcj4gYW5jaG9yOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEdyYXBoRWRnZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJLy9VTUEtLT4KLQkJcmVhc3NpZ25EZWZhdWx0VmFsdWVzKCk7Ci0JCS8vVU1BPC0tICAKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuR1JBUEhfRURHRTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdDxHcmFwaENvbm5lY3Rvcj4gZ2V0QW5jaG9yKCkgewotCQlpZiAoYW5jaG9yID09IG51bGwpIHsKLQkJCWFuY2hvciA9IG5ldyBFT2JqZWN0V2l0aEludmVyc2VSZXNvbHZpbmdFTGlzdC5NYW55SW52ZXJzZTxHcmFwaENvbm5lY3Rvcj4oCi0JCQkJCUdyYXBoQ29ubmVjdG9yLmNsYXNzLCB0aGlzLCBVbWFQYWNrYWdlLkdSQVBIX0VER0VfX0FOQ0hPUiwKLQkJCQkJVW1hUGFja2FnZS5HUkFQSF9DT05ORUNUT1JfX0dSQVBIX0VER0UpOwotCQl9Ci0JCXJldHVybiBhbmNob3I7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3Q8UG9pbnQ+IGdldFdheXBvaW50cygpIHsKLQkJaWYgKHdheXBvaW50cyA9PSBudWxsKSB7Ci0JCQl3YXlwb2ludHMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QuUmVzb2x2aW5nPFBvaW50PigKLQkJCQkJUG9pbnQuY2xhc3MsIHRoaXMsIFVtYVBhY2thZ2UuR1JBUEhfRURHRV9fV0FZUE9JTlRTKTsKLQkJfQotCQlyZXR1cm4gd2F5cG9pbnRzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCUBPdmVycmlkZQotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZUFkZChJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsCi0JCQlpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5HUkFQSF9FREdFX19BTkNIT1I6Ci0JCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PEludGVybmFsRU9iamVjdD4pIChJbnRlcm5hbEVMaXN0PD8+KSBnZXRBbmNob3IoKSkKLQkJCQkJLmJhc2ljQWRkKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VBZGQob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwKLQkJCWludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkdSQVBIX0VER0VfX1dBWVBPSU5UUzoKLQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pIGdldFdheXBvaW50cygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwKLQkJCQkJbXNncyk7Ci0JCWNhc2UgVW1hUGFja2FnZS5HUkFQSF9FREdFX19BTkNIT1I6Ci0JCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KSBnZXRBbmNob3IoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5HUkFQSF9FREdFX19XQVlQT0lOVFM6Ci0JCQlyZXR1cm4gZ2V0V2F5cG9pbnRzKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5HUkFQSF9FREdFX19BTkNIT1I6Ci0JCQlyZXR1cm4gZ2V0QW5jaG9yKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkdSQVBIX0VER0VfX1dBWVBPSU5UUzoKLQkJCWdldFdheXBvaW50cygpLmNsZWFyKCk7Ci0JCQlnZXRXYXlwb2ludHMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFBvaW50PikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuR1JBUEhfRURHRV9fQU5DSE9SOgotCQkJZ2V0QW5jaG9yKCkuY2xlYXIoKTsKLQkJCWdldEFuY2hvcigpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgR3JhcGhDb25uZWN0b3I+KSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuR1JBUEhfRURHRV9fV0FZUE9JTlRTOgotCQkJZ2V0V2F5cG9pbnRzKCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkdSQVBIX0VER0VfX0FOQ0hPUjoKLQkJCWdldEFuY2hvcigpLmNsZWFyKCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJLy9VTUEtLT4KLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBnZXRGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZShmZWF0dXJlSUQpOwotCQlpZiAoZmVhdHVyZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gaXNGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZVNldChmZWF0dXJlKTsKLQkJfQotCQkvL1VNQTwtLQkJCi0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5HUkFQSF9FREdFX19XQVlQT0lOVFM6Ci0JCQlyZXR1cm4gd2F5cG9pbnRzICE9IG51bGwgJiYgIXdheXBvaW50cy5pc0VtcHR5KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5HUkFQSF9FREdFX19BTkNIT1I6Ci0JCQlyZXR1cm4gYW5jaG9yICE9IG51bGwgJiYgIWFuY2hvci5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotfSAvL0dyYXBoRWRnZUltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9HcmFwaEVsZW1lbnRJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvR3JhcGhFbGVtZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZWE0MzJlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9HcmFwaEVsZW1lbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NzAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudFdpdGhJbnZlcnNlRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW1FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbUxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaENvbm5lY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuU2VtYW50aWNNb2RlbEJyaWRnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5HcmFwaCBFbGVtZW50PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuR3JhcGhFbGVtZW50SW1wbCNnZXRDb250YWluZWQgPGVtPkNvbnRhaW5lZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkdyYXBoRWxlbWVudEltcGwjZ2V0UG9zaXRpb24gPGVtPlBvc2l0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuR3JhcGhFbGVtZW50SW1wbCNnZXRMaW5rIDxlbT5MaW5rPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuR3JhcGhFbGVtZW50SW1wbCNnZXRBbmNob3JhZ2UgPGVtPkFuY2hvcmFnZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkdyYXBoRWxlbWVudEltcGwjZ2V0U2VtYW50aWNNb2RlbCA8ZW0+U2VtYW50aWMgTW9kZWw8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBHcmFwaEVsZW1lbnRJbXBsIGV4dGVuZHMgRGlhZ3JhbUVsZW1lbnRJbXBsIGltcGxlbWVudHMKLQkJR3JhcGhFbGVtZW50IHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENvbnRhaW5lZCgpIDxlbT5Db250YWluZWQ8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q29udGFpbmVkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8RGlhZ3JhbUVsZW1lbnQ+IGNvbnRhaW5lZDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBvc2l0aW9uKCkgPGVtPlBvc2l0aW9uPC9lbT59JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQb3NpdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFBvaW50IHBvc2l0aW9uOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TGluaygpIDxlbT5MaW5rPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldExpbmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxEaWFncmFtTGluaz4gbGluazsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFuY2hvcmFnZSgpIDxlbT5BbmNob3JhZ2U8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QW5jaG9yYWdlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8R3JhcGhDb25uZWN0b3I+IGFuY2hvcmFnZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNlbWFudGljTW9kZWwoKSA8ZW0+U2VtYW50aWMgTW9kZWw8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFNlbWFudGljTW9kZWwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTZW1hbnRpY01vZGVsQnJpZGdlIHNlbWFudGljTW9kZWw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgR3JhcGhFbGVtZW50SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQotCQkvL1VNQS0tPgotCQlyZWFzc2lnbkRlZmF1bHRWYWx1ZXMoKTsKLQkJLy9VTUE8LS0gIAotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5HUkFQSF9FTEVNRU5UOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQb2ludCBnZXRQb3NpdGlvbigpIHsKLQkJaWYgKHBvc2l0aW9uICE9IG51bGwgJiYgKChFT2JqZWN0KSBwb3NpdGlvbikuZUlzUHJveHkoKSkgewotCQkJSW50ZXJuYWxFT2JqZWN0IG9sZFBvc2l0aW9uID0gKEludGVybmFsRU9iamVjdCkgcG9zaXRpb247Ci0JCQlwb3NpdGlvbiA9IChQb2ludCkgZVJlc29sdmVQcm94eShvbGRQb3NpdGlvbik7Ci0JCQlpZiAocG9zaXRpb24gIT0gb2xkUG9zaXRpb24pIHsKLQkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLAotCQkJCQkJCVVtYVBhY2thZ2UuR1JBUEhfRUxFTUVOVF9fUE9TSVRJT04sIG9sZFBvc2l0aW9uLAotCQkJCQkJCXBvc2l0aW9uKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHBvc2l0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQb2ludCBiYXNpY0dldFBvc2l0aW9uKCkgewotCQlyZXR1cm4gcG9zaXRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UG9zaXRpb24oUG9pbnQgbmV3UG9zaXRpb24pIHsKLQkJUG9pbnQgb2xkUG9zaXRpb24gPSBwb3NpdGlvbjsKLQkJcG9zaXRpb24gPSBuZXdQb3NpdGlvbjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5HUkFQSF9FTEVNRU5UX19QT1NJVElPTiwgb2xkUG9zaXRpb24sIHBvc2l0aW9uKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3Q8RGlhZ3JhbUVsZW1lbnQ+IGdldENvbnRhaW5lZCgpIHsKLQkJaWYgKGNvbnRhaW5lZCA9PSBudWxsKSB7Ci0JCQljb250YWluZWQgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50V2l0aEludmVyc2VFTGlzdC5SZXNvbHZpbmc8RGlhZ3JhbUVsZW1lbnQ+KAotCQkJCQlEaWFncmFtRWxlbWVudC5jbGFzcywgdGhpcywKLQkJCQkJVW1hUGFja2FnZS5HUkFQSF9FTEVNRU5UX19DT05UQUlORUQsCi0JCQkJCVVtYVBhY2thZ2UuRElBR1JBTV9FTEVNRU5UX19DT05UQUlORVIpOwotCQl9Ci0JCXJldHVybiBjb250YWluZWQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3Q8RGlhZ3JhbUxpbms+IGdldExpbmsoKSB7Ci0JCWlmIChsaW5rID09IG51bGwpIHsKLQkJCWxpbmsgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50V2l0aEludmVyc2VFTGlzdC5SZXNvbHZpbmc8RGlhZ3JhbUxpbms+KAotCQkJCQlEaWFncmFtTGluay5jbGFzcywgdGhpcywgVW1hUGFja2FnZS5HUkFQSF9FTEVNRU5UX19MSU5LLAotCQkJCQlVbWFQYWNrYWdlLkRJQUdSQU1fTElOS19fR1JBUEhfRUxFTUVOVCk7Ci0JCX0KLQkJcmV0dXJuIGxpbms7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3Q8R3JhcGhDb25uZWN0b3I+IGdldEFuY2hvcmFnZSgpIHsKLQkJaWYgKGFuY2hvcmFnZSA9PSBudWxsKSB7Ci0JCQlhbmNob3JhZ2UgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50V2l0aEludmVyc2VFTGlzdC5SZXNvbHZpbmc8R3JhcGhDb25uZWN0b3I+KAotCQkJCQlHcmFwaENvbm5lY3Rvci5jbGFzcywgdGhpcywKLQkJCQkJVW1hUGFja2FnZS5HUkFQSF9FTEVNRU5UX19BTkNIT1JBR0UsCi0JCQkJCVVtYVBhY2thZ2UuR1JBUEhfQ09OTkVDVE9SX19HUkFQSF9FTEVNRU5UKTsKLQkJfQotCQlyZXR1cm4gYW5jaG9yYWdlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTZW1hbnRpY01vZGVsQnJpZGdlIGdldFNlbWFudGljTW9kZWwoKSB7Ci0JCWlmIChzZW1hbnRpY01vZGVsICE9IG51bGwgJiYgKChFT2JqZWN0KSBzZW1hbnRpY01vZGVsKS5lSXNQcm94eSgpKSB7Ci0JCQlJbnRlcm5hbEVPYmplY3Qgb2xkU2VtYW50aWNNb2RlbCA9IChJbnRlcm5hbEVPYmplY3QpIHNlbWFudGljTW9kZWw7Ci0JCQlzZW1hbnRpY01vZGVsID0gKFNlbWFudGljTW9kZWxCcmlkZ2UpIGVSZXNvbHZlUHJveHkob2xkU2VtYW50aWNNb2RlbCk7Ci0JCQlpZiAoc2VtYW50aWNNb2RlbCAhPSBvbGRTZW1hbnRpY01vZGVsKSB7Ci0JCQkJSW50ZXJuYWxFT2JqZWN0IG5ld1NlbWFudGljTW9kZWwgPSAoSW50ZXJuYWxFT2JqZWN0KSBzZW1hbnRpY01vZGVsOwotCQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBvbGRTZW1hbnRpY01vZGVsLmVJbnZlcnNlUmVtb3ZlKHRoaXMsCi0JCQkJCQlVbWFQYWNrYWdlLlNFTUFOVElDX01PREVMX0JSSURHRV9fR1JBUEhfRUxFTUVOVCwKLQkJCQkJCVNlbWFudGljTW9kZWxCcmlkZ2UuY2xhc3MsIG51bGwpOwotCQkJCWlmIChuZXdTZW1hbnRpY01vZGVsLmVJbnRlcm5hbENvbnRhaW5lcigpID09IG51bGwpIHsKLQkJCQkJbXNncyA9IG5ld1NlbWFudGljTW9kZWwuZUludmVyc2VBZGQodGhpcywKLQkJCQkJCQlVbWFQYWNrYWdlLlNFTUFOVElDX01PREVMX0JSSURHRV9fR1JBUEhfRUxFTUVOVCwKLQkJCQkJCQlTZW1hbnRpY01vZGVsQnJpZGdlLmNsYXNzLCBtc2dzKTsKLQkJCQl9Ci0JCQkJaWYgKG1zZ3MgIT0gbnVsbCkKLQkJCQkJbXNncy5kaXNwYXRjaCgpOwotCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlJFU09MVkUsCi0JCQkJCQkJVW1hUGFja2FnZS5HUkFQSF9FTEVNRU5UX19TRU1BTlRJQ19NT0RFTCwKLQkJCQkJCQlvbGRTZW1hbnRpY01vZGVsLCBzZW1hbnRpY01vZGVsKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHNlbWFudGljTW9kZWw7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFNlbWFudGljTW9kZWxCcmlkZ2UgYmFzaWNHZXRTZW1hbnRpY01vZGVsKCkgewotCQlyZXR1cm4gc2VtYW50aWNNb2RlbDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRTZW1hbnRpY01vZGVsKAotCQkJU2VtYW50aWNNb2RlbEJyaWRnZSBuZXdTZW1hbnRpY01vZGVsLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCVNlbWFudGljTW9kZWxCcmlkZ2Ugb2xkU2VtYW50aWNNb2RlbCA9IHNlbWFudGljTW9kZWw7Ci0JCXNlbWFudGljTW9kZWwgPSBuZXdTZW1hbnRpY01vZGVsOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLAotCQkJCQlOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLkdSQVBIX0VMRU1FTlRfX1NFTUFOVElDX01PREVMLAotCQkJCQlvbGRTZW1hbnRpY01vZGVsLCBuZXdTZW1hbnRpY01vZGVsKTsKLQkJCWlmIChtc2dzID09IG51bGwpCi0JCQkJbXNncyA9IG5vdGlmaWNhdGlvbjsKLQkJCWVsc2UKLQkJCQltc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNlbWFudGljTW9kZWwoU2VtYW50aWNNb2RlbEJyaWRnZSBuZXdTZW1hbnRpY01vZGVsKSB7Ci0JCWlmIChuZXdTZW1hbnRpY01vZGVsICE9IHNlbWFudGljTW9kZWwpIHsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKHNlbWFudGljTW9kZWwgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpIHNlbWFudGljTW9kZWwpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsCi0JCQkJCQlVbWFQYWNrYWdlLlNFTUFOVElDX01PREVMX0JSSURHRV9fR1JBUEhfRUxFTUVOVCwKLQkJCQkJCVNlbWFudGljTW9kZWxCcmlkZ2UuY2xhc3MsIG1zZ3MpOwotCQkJaWYgKG5ld1NlbWFudGljTW9kZWwgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpIG5ld1NlbWFudGljTW9kZWwpLmVJbnZlcnNlQWRkKHRoaXMsCi0JCQkJCQlVbWFQYWNrYWdlLlNFTUFOVElDX01PREVMX0JSSURHRV9fR1JBUEhfRUxFTUVOVCwKLQkJCQkJCVNlbWFudGljTW9kZWxCcmlkZ2UuY2xhc3MsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0U2VtYW50aWNNb2RlbChuZXdTZW1hbnRpY01vZGVsLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpCi0JCQkJbXNncy5kaXNwYXRjaCgpOwotCQl9IGVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5HUkFQSF9FTEVNRU5UX19TRU1BTlRJQ19NT0RFTCwgbmV3U2VtYW50aWNNb2RlbCwKLQkJCQkJbmV3U2VtYW50aWNNb2RlbCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCUBPdmVycmlkZQotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZUFkZChJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsCi0JCQlpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5HUkFQSF9FTEVNRU5UX19DT05UQUlORUQ6Ci0JCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PEludGVybmFsRU9iamVjdD4pIChJbnRlcm5hbEVMaXN0PD8+KSBnZXRDb250YWluZWQoKSkKLQkJCQkJLmJhc2ljQWRkKG90aGVyRW5kLCBtc2dzKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkdSQVBIX0VMRU1FTlRfX0xJTks6Ci0JCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PEludGVybmFsRU9iamVjdD4pIChJbnRlcm5hbEVMaXN0PD8+KSBnZXRMaW5rKCkpCi0JCQkJCS5iYXNpY0FkZChvdGhlckVuZCwgbXNncyk7Ci0JCWNhc2UgVW1hUGFja2FnZS5HUkFQSF9FTEVNRU5UX19BTkNIT1JBR0U6Ci0JCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PEludGVybmFsRU9iamVjdD4pIChJbnRlcm5hbEVMaXN0PD8+KSBnZXRBbmNob3JhZ2UoKSkKLQkJCQkJLmJhc2ljQWRkKG90aGVyRW5kLCBtc2dzKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkdSQVBIX0VMRU1FTlRfX1NFTUFOVElDX01PREVMOgotCQkJaWYgKHNlbWFudGljTW9kZWwgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpIHNlbWFudGljTW9kZWwpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsCi0JCQkJCQlFT1BQT1NJVEVfRkVBVFVSRV9CQVNFCi0JCQkJCQkJCS0gVW1hUGFja2FnZS5HUkFQSF9FTEVNRU5UX19TRU1BTlRJQ19NT0RFTCwKLQkJCQkJCW51bGwsIG1zZ3MpOwotCQkJcmV0dXJuIGJhc2ljU2V0U2VtYW50aWNNb2RlbCgoU2VtYW50aWNNb2RlbEJyaWRnZSkgb3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZUFkZChvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLAotCQkJaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuR1JBUEhfRUxFTUVOVF9fQ09OVEFJTkVEOgotCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PikgZ2V0Q29udGFpbmVkKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLAotCQkJCQltc2dzKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkdSQVBIX0VMRU1FTlRfX0xJTks6Ci0JCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KSBnZXRMaW5rKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkdSQVBIX0VMRU1FTlRfX0FOQ0hPUkFHRToKLQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pIGdldEFuY2hvcmFnZSgpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwKLQkJCQkJbXNncyk7Ci0JCWNhc2UgVW1hUGFja2FnZS5HUkFQSF9FTEVNRU5UX19TRU1BTlRJQ19NT0RFTDoKLQkJCXJldHVybiBiYXNpY1NldFNlbWFudGljTW9kZWwobnVsbCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkdSQVBIX0VMRU1FTlRfX0NPTlRBSU5FRDoKLQkJCXJldHVybiBnZXRDb250YWluZWQoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkdSQVBIX0VMRU1FTlRfX1BPU0lUSU9OOgotCQkJaWYgKHJlc29sdmUpCi0JCQkJcmV0dXJuIGdldFBvc2l0aW9uKCk7Ci0JCQlyZXR1cm4gYmFzaWNHZXRQb3NpdGlvbigpOwotCQljYXNlIFVtYVBhY2thZ2UuR1JBUEhfRUxFTUVOVF9fTElOSzoKLQkJCXJldHVybiBnZXRMaW5rKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5HUkFQSF9FTEVNRU5UX19BTkNIT1JBR0U6Ci0JCQlyZXR1cm4gZ2V0QW5jaG9yYWdlKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5HUkFQSF9FTEVNRU5UX19TRU1BTlRJQ19NT0RFTDoKLQkJCWlmIChyZXNvbHZlKQotCQkJCXJldHVybiBnZXRTZW1hbnRpY01vZGVsKCk7Ci0JCQlyZXR1cm4gYmFzaWNHZXRTZW1hbnRpY01vZGVsKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkdSQVBIX0VMRU1FTlRfX0NPTlRBSU5FRDoKLQkJCWdldENvbnRhaW5lZCgpLmNsZWFyKCk7Ci0JCQlnZXRDb250YWluZWQoKS5hZGRBbGwoCi0JCQkJCShDb2xsZWN0aW9uPD8gZXh0ZW5kcyBEaWFncmFtRWxlbWVudD4pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkdSQVBIX0VMRU1FTlRfX1BPU0lUSU9OOgotCQkJc2V0UG9zaXRpb24oKFBvaW50KSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5HUkFQSF9FTEVNRU5UX19MSU5LOgotCQkJZ2V0TGluaygpLmNsZWFyKCk7Ci0JCQlnZXRMaW5rKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBEaWFncmFtTGluaz4pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkdSQVBIX0VMRU1FTlRfX0FOQ0hPUkFHRToKLQkJCWdldEFuY2hvcmFnZSgpLmNsZWFyKCk7Ci0JCQlnZXRBbmNob3JhZ2UoKS5hZGRBbGwoCi0JCQkJCShDb2xsZWN0aW9uPD8gZXh0ZW5kcyBHcmFwaENvbm5lY3Rvcj4pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkdSQVBIX0VMRU1FTlRfX1NFTUFOVElDX01PREVMOgotCQkJc2V0U2VtYW50aWNNb2RlbCgoU2VtYW50aWNNb2RlbEJyaWRnZSkgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkdSQVBIX0VMRU1FTlRfX0NPTlRBSU5FRDoKLQkJCWdldENvbnRhaW5lZCgpLmNsZWFyKCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5HUkFQSF9FTEVNRU5UX19QT1NJVElPTjoKLQkJCXNldFBvc2l0aW9uKChQb2ludCkgbnVsbCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5HUkFQSF9FTEVNRU5UX19MSU5LOgotCQkJZ2V0TGluaygpLmNsZWFyKCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5HUkFQSF9FTEVNRU5UX19BTkNIT1JBR0U6Ci0JCQlnZXRBbmNob3JhZ2UoKS5jbGVhcigpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuR1JBUEhfRUxFTUVOVF9fU0VNQU5USUNfTU9ERUw6Ci0JCQlzZXRTZW1hbnRpY01vZGVsKChTZW1hbnRpY01vZGVsQnJpZGdlKSBudWxsKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQkvL1VNQS0tPgotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IGdldEZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlKGZlYXR1cmVJRCk7Ci0JCWlmIChmZWF0dXJlICE9IG51bGwpIHsKLQkJCXJldHVybiBpc0ZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlU2V0KGZlYXR1cmUpOwotCQl9Ci0JCS8vVU1BPC0tCQkKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkdSQVBIX0VMRU1FTlRfX0NPTlRBSU5FRDoKLQkJCXJldHVybiBjb250YWluZWQgIT0gbnVsbCAmJiAhY29udGFpbmVkLmlzRW1wdHkoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkdSQVBIX0VMRU1FTlRfX1BPU0lUSU9OOgotCQkJcmV0dXJuIHBvc2l0aW9uICE9IG51bGw7Ci0JCWNhc2UgVW1hUGFja2FnZS5HUkFQSF9FTEVNRU5UX19MSU5LOgotCQkJcmV0dXJuIGxpbmsgIT0gbnVsbCAmJiAhbGluay5pc0VtcHR5KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5HUkFQSF9FTEVNRU5UX19BTkNIT1JBR0U6Ci0JCQlyZXR1cm4gYW5jaG9yYWdlICE9IG51bGwgJiYgIWFuY2hvcmFnZS5pc0VtcHR5KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5HUkFQSF9FTEVNRU5UX19TRU1BTlRJQ19NT0RFTDoKLQkJCXJldHVybiBzZW1hbnRpY01vZGVsICE9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotfSAvL0dyYXBoRWxlbWVudEltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9HcmFwaE5vZGVJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvR3JhcGhOb2RlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMjk3ZDNmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9HcmFwaE5vZGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGltZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkdyYXBoIE5vZGU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5HcmFwaE5vZGVJbXBsI2dldFNpemUgPGVtPlNpemU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBHcmFwaE5vZGVJbXBsIGV4dGVuZHMgR3JhcGhFbGVtZW50SW1wbCBpbXBsZW1lbnRzIEdyYXBoTm9kZSB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTaXplKCkgPGVtPlNpemU8L2VtPn0nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFNpemUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBEaW1lbnNpb24gc2l6ZTsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBHcmFwaE5vZGVJbXBsKCkgewotCQlzdXBlcigpOwotCi0JCS8vVU1BLS0+Ci0JCXJlYXNzaWduRGVmYXVsdFZhbHVlcygpOwotCQkvL1VNQTwtLSAgCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLkdSQVBIX05PREU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERpbWVuc2lvbiBnZXRTaXplKCkgewotCQlpZiAoc2l6ZSAhPSBudWxsICYmICgoRU9iamVjdCkgc2l6ZSkuZUlzUHJveHkoKSkgewotCQkJSW50ZXJuYWxFT2JqZWN0IG9sZFNpemUgPSAoSW50ZXJuYWxFT2JqZWN0KSBzaXplOwotCQkJc2l6ZSA9IChEaW1lbnNpb24pIGVSZXNvbHZlUHJveHkob2xkU2l6ZSk7Ci0JCQlpZiAoc2l6ZSAhPSBvbGRTaXplKSB7Ci0JCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwKLQkJCQkJCQlVbWFQYWNrYWdlLkdSQVBIX05PREVfX1NJWkUsIG9sZFNpemUsIHNpemUpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc2l6ZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRGltZW5zaW9uIGJhc2ljR2V0U2l6ZSgpIHsKLQkJcmV0dXJuIHNpemU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2l6ZShEaW1lbnNpb24gbmV3U2l6ZSkgewotCQlEaW1lbnNpb24gb2xkU2l6ZSA9IHNpemU7Ci0JCXNpemUgPSBuZXdTaXplOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLkdSQVBIX05PREVfX1NJWkUsIG9sZFNpemUsIHNpemUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5HUkFQSF9OT0RFX19TSVpFOgotCQkJaWYgKHJlc29sdmUpCi0JCQkJcmV0dXJuIGdldFNpemUoKTsKLQkJCXJldHVybiBiYXNpY0dldFNpemUoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuR1JBUEhfTk9ERV9fU0laRToKLQkJCXNldFNpemUoKERpbWVuc2lvbikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkdSQVBIX05PREVfX1NJWkU6Ci0JCQlzZXRTaXplKChEaW1lbnNpb24pIG51bGwpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCS8vVU1BLS0+Ci0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gZ2V0RmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWUoZmVhdHVyZUlEKTsKLQkJaWYgKGZlYXR1cmUgIT0gbnVsbCkgewotCQkJcmV0dXJuIGlzRmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWVTZXQoZmVhdHVyZSk7Ci0JCX0KLQkJLy9VTUE8LS0JCQotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuR1JBUEhfTk9ERV9fU0laRToKLQkJCXJldHVybiBzaXplICE9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotfSAvL0dyYXBoTm9kZUltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9HcmFwaGljUHJpbWl0aXZlSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0dyYXBoaWNQcmltaXRpdmVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4MDczNTguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0dyYXBoaWNQcmltaXRpdmVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhpY1ByaW1pdGl2ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5HcmFwaGljIFByaW1pdGl2ZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEdyYXBoaWNQcmltaXRpdmVJbXBsIGV4dGVuZHMgTGVhZkVsZW1lbnRJbXBsIGltcGxlbWVudHMKLQkJR3JhcGhpY1ByaW1pdGl2ZSB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgR3JhcGhpY1ByaW1pdGl2ZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJLy9VTUEtLT4KLQkJcmVhc3NpZ25EZWZhdWx0VmFsdWVzKCk7Ci0JCS8vVU1BPC0tICAKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuR1JBUEhJQ19QUklNSVRJVkU7Ci0JfQotCi19IC8vR3JhcGhpY1ByaW1pdGl2ZUltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9HdWlkYW5jZURlc2NyaXB0aW9uSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0d1aWRhbmNlRGVzY3JpcHRpb25JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhMzJiMjMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0d1aWRhbmNlRGVzY3JpcHRpb25JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkd1aWRhbmNlRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+R3VpZGFuY2UgRGVzY3JpcHRpb248L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5HdWlkYW5jZURlc2NyaXB0aW9uSW1wbCNnZXRBdHRhY2htZW50cyA8ZW0+QXR0YWNobWVudHM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBHdWlkYW5jZURlc2NyaXB0aW9uSW1wbCBleHRlbmRzIENvbnRlbnREZXNjcmlwdGlvbkltcGwgaW1wbGVtZW50cwotCQlHdWlkYW5jZURlc2NyaXB0aW9uIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBdHRhY2htZW50cygpIDxlbT5BdHRhY2htZW50czwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QXR0YWNobWVudHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVEFDSE1FTlRTX0VERUZBVUxUID0gIiI7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBdHRhY2htZW50cygpIDxlbT5BdHRhY2htZW50czwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QXR0YWNobWVudHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgYXR0YWNobWVudHMgPSBBVFRBQ0hNRU5UU19FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBHdWlkYW5jZURlc2NyaXB0aW9uSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQotCQkvL1VNQS0tPgotCQlyZWFzc2lnbkRlZmF1bHRWYWx1ZXMoKTsKLQkJLy9VTUE8LS0gIAotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5HVUlEQU5DRV9ERVNDUklQVElPTjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEF0dGFjaG1lbnRzKCkgewotCQlyZXR1cm4gYXR0YWNobWVudHM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QXR0YWNobWVudHMoU3RyaW5nIG5ld0F0dGFjaG1lbnRzKSB7Ci0JCVN0cmluZyBvbGRBdHRhY2htZW50cyA9IGF0dGFjaG1lbnRzOwotCQlhdHRhY2htZW50cyA9IG5ld0F0dGFjaG1lbnRzOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLkdVSURBTkNFX0RFU0NSSVBUSU9OX19BVFRBQ0hNRU5UUywKLQkJCQkJb2xkQXR0YWNobWVudHMsIGF0dGFjaG1lbnRzKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuR1VJREFOQ0VfREVTQ1JJUFRJT05fX0FUVEFDSE1FTlRTOgotCQkJcmV0dXJuIGdldEF0dGFjaG1lbnRzKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkdVSURBTkNFX0RFU0NSSVBUSU9OX19BVFRBQ0hNRU5UUzoKLQkJCXNldEF0dGFjaG1lbnRzKChTdHJpbmcpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5HVUlEQU5DRV9ERVNDUklQVElPTl9fQVRUQUNITUVOVFM6Ci0JCQlzZXRBdHRhY2htZW50cyhBVFRBQ0hNRU5UU19FREVGQVVMVCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJLy9VTUEtLT4KLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBnZXRGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZShmZWF0dXJlSUQpOwotCQlpZiAoZmVhdHVyZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gaXNGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZVNldChmZWF0dXJlKTsKLQkJfQotCQkvL1VNQTwtLQkJCi0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5HVUlEQU5DRV9ERVNDUklQVElPTl9fQVRUQUNITUVOVFM6Ci0JCQlyZXR1cm4gQVRUQUNITUVOVFNfRURFRkFVTFQgPT0gbnVsbCA/IGF0dGFjaG1lbnRzICE9IG51bGwKLQkJCQkJOiAhQVRUQUNITUVOVFNfRURFRkFVTFQuZXF1YWxzKGF0dGFjaG1lbnRzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpCi0JCQlyZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChhdHRhY2htZW50czogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChhdHRhY2htZW50cyk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL0d1aWRhbmNlRGVzY3JpcHRpb25JbXBsCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvR3VpZGFuY2VJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvR3VpZGFuY2VJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0YzUwMjUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0d1aWRhbmNlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkd1aWRhbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkd1aWRhbmNlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgR3VpZGFuY2VJbXBsIGV4dGVuZHMgQ29udGVudEVsZW1lbnRJbXBsIGltcGxlbWVudHMKLQkJR3VpZGFuY2UgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEd1aWRhbmNlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQotCQkvL1VNQS0tPgotCQlyZWFzc2lnbkRlZmF1bHRWYWx1ZXMoKTsKLQkJLy9VTUE8LS0gIAotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5HVUlEQU5DRTsKLQl9Ci0KLX0gLy9HdWlkYW5jZUltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9HdWlkZWxpbmVJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvR3VpZGVsaW5lSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNDMzNWY2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9HdWlkZWxpbmVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3VpZGVsaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkd1aWRlbGluZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEd1aWRlbGluZUltcGwgZXh0ZW5kcyBHdWlkYW5jZUltcGwgaW1wbGVtZW50cyBHdWlkZWxpbmUgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEd1aWRlbGluZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJLy9VTUEtLT4KLQkJcmVhc3NpZ25EZWZhdWx0VmFsdWVzKCk7Ci0JCS8vVU1BPC0tICAKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuR1VJREVMSU5FOwotCX0KLQotfSAvL0d1aWRlbGluZUltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9JbWFnZUltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9JbWFnZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjM4MDY0Yy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvSW1hZ2VJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsOwotCi1pbXBvcnQgamF2YS5uZXQuVVJJOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5JbWFnZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkltYWdlSW1wbCNnZXRVcmkgPGVtPlVyaTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkltYWdlSW1wbCNnZXRNaW1lVHlwZSA8ZW0+TWltZSBUeXBlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgSW1hZ2VJbXBsIGV4dGVuZHMgTGVhZkVsZW1lbnRJbXBsIGltcGxlbWVudHMgSW1hZ2UgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFVyaSgpIDxlbT5Vcmk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFVyaSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBVUkkgVVJJX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFVyaSgpIDxlbT5Vcmk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFVyaSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFVSSSB1cmkgPSBVUklfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWltZVR5cGUoKSA8ZW0+TWltZSBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRNaW1lVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUlNRV9UWVBFX0VERUZBVUxUID0gIiI7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNaW1lVHlwZSgpIDxlbT5NaW1lIFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE1pbWVUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIG1pbWVUeXBlID0gTUlNRV9UWVBFX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEltYWdlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQotCQkvL1VNQS0tPgotCQlyZWFzc2lnbkRlZmF1bHRWYWx1ZXMoKTsKLQkJLy9VTUE8LS0gIAotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5JTUFHRTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVVJJIGdldFVyaSgpIHsKLQkJcmV0dXJuIHVyaTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRVcmkoVVJJIG5ld1VyaSkgewotCQlVUkkgb2xkVXJpID0gdXJpOwotCQl1cmkgPSBuZXdVcmk7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuSU1BR0VfX1VSSSwgb2xkVXJpLCB1cmkpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE1pbWVUeXBlKCkgewotCQlyZXR1cm4gbWltZVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TWltZVR5cGUoU3RyaW5nIG5ld01pbWVUeXBlKSB7Ci0JCVN0cmluZyBvbGRNaW1lVHlwZSA9IG1pbWVUeXBlOwotCQltaW1lVHlwZSA9IG5ld01pbWVUeXBlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLklNQUdFX19NSU1FX1RZUEUsIG9sZE1pbWVUeXBlLCBtaW1lVHlwZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLklNQUdFX19VUkk6Ci0JCQlyZXR1cm4gZ2V0VXJpKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5JTUFHRV9fTUlNRV9UWVBFOgotCQkJcmV0dXJuIGdldE1pbWVUeXBlKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLklNQUdFX19VUkk6Ci0JCQlzZXRVcmkoKFVSSSkgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuSU1BR0VfX01JTUVfVFlQRToKLQkJCXNldE1pbWVUeXBlKChTdHJpbmcpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5JTUFHRV9fVVJJOgotCQkJc2V0VXJpKFVSSV9FREVGQVVMVCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5JTUFHRV9fTUlNRV9UWVBFOgotCQkJc2V0TWltZVR5cGUoTUlNRV9UWVBFX0VERUZBVUxUKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQkvL1VNQS0tPgotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IGdldEZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlKGZlYXR1cmVJRCk7Ci0JCWlmIChmZWF0dXJlICE9IG51bGwpIHsKLQkJCXJldHVybiBpc0ZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlU2V0KGZlYXR1cmUpOwotCQl9Ci0JCS8vVU1BPC0tCQkKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLklNQUdFX19VUkk6Ci0JCQlyZXR1cm4gVVJJX0VERUZBVUxUID09IG51bGwgPyB1cmkgIT0gbnVsbCA6ICFVUklfRURFRkFVTFQKLQkJCQkJLmVxdWFscyh1cmkpOwotCQljYXNlIFVtYVBhY2thZ2UuSU1BR0VfX01JTUVfVFlQRToKLQkJCXJldHVybiBNSU1FX1RZUEVfRURFRkFVTFQgPT0gbnVsbCA/IG1pbWVUeXBlICE9IG51bGwKLQkJCQkJOiAhTUlNRV9UWVBFX0VERUZBVUxULmVxdWFscyhtaW1lVHlwZSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKQotCQkJcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAodXJpOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKHVyaSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgbWltZVR5cGU6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQobWltZVR5cGUpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9JbWFnZUltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9JdGVyYXRpb25JbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvSXRlcmF0aW9uSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMjkyNThjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9JdGVyYXRpb25JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuSXRlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkl0ZXJhdGlvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEl0ZXJhdGlvbkltcGwgZXh0ZW5kcyBBY3Rpdml0eUltcGwgaW1wbGVtZW50cyBJdGVyYXRpb24gewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEl0ZXJhdGlvbkltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJLy9VTUEtLT4KLQkJcmVhc3NpZ25EZWZhdWx0VmFsdWVzKCk7Ci0JCS8vVU1BPC0tICAKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuSVRFUkFUSU9OOwotCX0KLQotfSAvL0l0ZXJhdGlvbkltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9LaW5kSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0tpbmRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5ODZmOWYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0tpbmRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQXBwbGljYWJsZU1ldGFDbGFzc0luZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLktpbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+S2luZDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLktpbmRJbXBsI2dldEFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvIDxlbT5BcHBsaWNhYmxlIE1ldGEgQ2xhc3MgSW5mbzwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEtpbmRJbXBsIGV4dGVuZHMgQ29udGVudEVsZW1lbnRJbXBsIGltcGxlbWVudHMgS2luZCB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBcHBsaWNhYmxlTWV0YUNsYXNzSW5mbygpIDxlbT5BcHBsaWNhYmxlIE1ldGEgQ2xhc3MgSW5mbzwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBcHBsaWNhYmxlTWV0YUNsYXNzSW5mbygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PEFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvPiBhcHBsaWNhYmxlTWV0YUNsYXNzSW5mbzsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBLaW5kSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQotCQkvL1VNQS0tPgotCQlyZWFzc2lnbkRlZmF1bHRWYWx1ZXMoKTsKLQkJLy9VTUE8LS0gIAotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5LSU5EOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0PEFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvPiBnZXRBcHBsaWNhYmxlTWV0YUNsYXNzSW5mbygpIHsKLQkJaWYgKGFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvID09IG51bGwpIHsKLQkJCWFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0LlJlc29sdmluZzxBcHBsaWNhYmxlTWV0YUNsYXNzSW5mbz4oCi0JCQkJCUFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvLmNsYXNzLCB0aGlzLAotCQkJCQlVbWFQYWNrYWdlLktJTkRfX0FQUExJQ0FCTEVfTUVUQV9DTEFTU19JTkZPKTsKLQkJfQotCQlyZXR1cm4gYXBwbGljYWJsZU1ldGFDbGFzc0luZm87Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwKLQkJCWludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLktJTkRfX0FQUExJQ0FCTEVfTUVUQV9DTEFTU19JTkZPOgotCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PikgZ2V0QXBwbGljYWJsZU1ldGFDbGFzc0luZm8oKSkKLQkJCQkJLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuS0lORF9fQVBQTElDQUJMRV9NRVRBX0NMQVNTX0lORk86Ci0JCQlyZXR1cm4gZ2V0QXBwbGljYWJsZU1ldGFDbGFzc0luZm8oKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuS0lORF9fQVBQTElDQUJMRV9NRVRBX0NMQVNTX0lORk86Ci0JCQlnZXRBcHBsaWNhYmxlTWV0YUNsYXNzSW5mbygpLmNsZWFyKCk7Ci0JCQlnZXRBcHBsaWNhYmxlTWV0YUNsYXNzSW5mbygpLmFkZEFsbCgKLQkJCQkJKENvbGxlY3Rpb248PyBleHRlbmRzIEFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvPikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLktJTkRfX0FQUExJQ0FCTEVfTUVUQV9DTEFTU19JTkZPOgotCQkJZ2V0QXBwbGljYWJsZU1ldGFDbGFzc0luZm8oKS5jbGVhcigpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCS8vVU1BLS0+Ci0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gZ2V0RmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWUoZmVhdHVyZUlEKTsKLQkJaWYgKGZlYXR1cmUgIT0gbnVsbCkgewotCQkJcmV0dXJuIGlzRmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWVTZXQoZmVhdHVyZSk7Ci0JCX0KLQkJLy9VTUE8LS0JCQotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuS0lORF9fQVBQTElDQUJMRV9NRVRBX0NMQVNTX0lORk86Ci0JCQlyZXR1cm4gYXBwbGljYWJsZU1ldGFDbGFzc0luZm8gIT0gbnVsbAotCQkJCQkmJiAhYXBwbGljYWJsZU1ldGFDbGFzc0luZm8uaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLX0gLy9LaW5kSW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0xlYWZFbGVtZW50SW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0xlYWZFbGVtZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YjYwZmVlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9MZWFmRWxlbWVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5MZWFmRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5MZWFmIEVsZW1lbnQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBMZWFmRWxlbWVudEltcGwgZXh0ZW5kcyBEaWFncmFtRWxlbWVudEltcGwgaW1wbGVtZW50cwotCQlMZWFmRWxlbWVudCB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTGVhZkVsZW1lbnRJbXBsKCkgewotCQlzdXBlcigpOwotCi0JCS8vVU1BLS0+Ci0JCXJlYXNzaWduRGVmYXVsdFZhbHVlcygpOwotCQkvL1VNQTwtLSAgCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLkxFQUZfRUxFTUVOVDsKLQl9Ci0KLX0gLy9MZWFmRWxlbWVudEltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9NZXRob2RDb25maWd1cmF0aW9uSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL01ldGhvZENvbmZpZ3VyYXRpb25JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiOTA5NGYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL01ldGhvZENvbmZpZ3VyYXRpb25JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MTggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RSZXNvbHZpbmdFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRDYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk1ldGhvZCBDb25maWd1cmF0aW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuTWV0aG9kQ29uZmlndXJhdGlvbkltcGwjZ2V0TWV0aG9kUGx1Z2luU2VsZWN0aW9uIDxlbT5NZXRob2QgUGx1Z2luIFNlbGVjdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLk1ldGhvZENvbmZpZ3VyYXRpb25JbXBsI2dldE1ldGhvZFBhY2thZ2VTZWxlY3Rpb24gPGVtPk1ldGhvZCBQYWNrYWdlIFNlbGVjdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLk1ldGhvZENvbmZpZ3VyYXRpb25JbXBsI2dldFByb2Nlc3NWaWV3cyA8ZW0+UHJvY2VzcyBWaWV3czwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLk1ldGhvZENvbmZpZ3VyYXRpb25JbXBsI2dldERlZmF1bHRWaWV3IDxlbT5EZWZhdWx0IFZpZXc8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5NZXRob2RDb25maWd1cmF0aW9uSW1wbCNnZXRCYXNlQ29uZmlndXJhdGlvbnMgPGVtPkJhc2UgQ29uZmlndXJhdGlvbnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5NZXRob2RDb25maWd1cmF0aW9uSW1wbCNnZXRTdWJ0cmFjdGVkQ2F0ZWdvcnkgPGVtPlN1YnRyYWN0ZWQgQ2F0ZWdvcnk8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5NZXRob2RDb25maWd1cmF0aW9uSW1wbCNnZXRBZGRlZENhdGVnb3J5IDxlbT5BZGRlZCBDYXRlZ29yeTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIE1ldGhvZENvbmZpZ3VyYXRpb25JbXBsIGV4dGVuZHMgTWV0aG9kVW5pdEltcGwgaW1wbGVtZW50cwotCQlNZXRob2RDb25maWd1cmF0aW9uIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1ldGhvZFBsdWdpblNlbGVjdGlvbigpIDxlbT5NZXRob2QgUGx1Z2luIFNlbGVjdGlvbjwvZW0+fScgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRNZXRob2RQbHVnaW5TZWxlY3Rpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxNZXRob2RQbHVnaW4+IG1ldGhvZFBsdWdpblNlbGVjdGlvbjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKSA8ZW0+TWV0aG9kIFBhY2thZ2UgU2VsZWN0aW9uPC9lbT59JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE1ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxNZXRob2RQYWNrYWdlPiBtZXRob2RQYWNrYWdlU2VsZWN0aW9uOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJvY2Vzc1ZpZXdzKCkgPGVtPlByb2Nlc3MgVmlld3M8L2VtPn0nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UHJvY2Vzc1ZpZXdzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8Q29udGVudENhdGVnb3J5PiBwcm9jZXNzVmlld3M7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZWZhdWx0VmlldygpIDxlbT5EZWZhdWx0IFZpZXc8L2VtPn0nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERlZmF1bHRWaWV3KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29udGVudENhdGVnb3J5IGRlZmF1bHRWaWV3OwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QmFzZUNvbmZpZ3VyYXRpb25zKCkgPGVtPkJhc2UgQ29uZmlndXJhdGlvbnM8L2VtPn0nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QmFzZUNvbmZpZ3VyYXRpb25zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8TWV0aG9kQ29uZmlndXJhdGlvbj4gYmFzZUNvbmZpZ3VyYXRpb25zOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U3VidHJhY3RlZENhdGVnb3J5KCkgPGVtPlN1YnRyYWN0ZWQgQ2F0ZWdvcnk8L2VtPn0nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U3VidHJhY3RlZENhdGVnb3J5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8Q29udGVudENhdGVnb3J5PiBzdWJ0cmFjdGVkQ2F0ZWdvcnk7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBZGRlZENhdGVnb3J5KCkgPGVtPkFkZGVkIENhdGVnb3J5PC9lbT59JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFkZGVkQ2F0ZWdvcnkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxDb250ZW50Q2F0ZWdvcnk+IGFkZGVkQ2F0ZWdvcnk7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTWV0aG9kQ29uZmlndXJhdGlvbkltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJLy9VTUEtLT4KLQkJcmVhc3NpZ25EZWZhdWx0VmFsdWVzKCk7Ci0JCS8vVU1BPC0tICAKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuTUVUSE9EX0NPTkZJR1VSQVRJT047Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3Q8TWV0aG9kUGx1Z2luPiBnZXRNZXRob2RQbHVnaW5TZWxlY3Rpb24oKSB7Ci0JCWlmIChtZXRob2RQbHVnaW5TZWxlY3Rpb24gPT0gbnVsbCkgewotCQkJbWV0aG9kUGx1Z2luU2VsZWN0aW9uID0gbmV3IEVPYmplY3RSZXNvbHZpbmdFTGlzdDxNZXRob2RQbHVnaW4+KAotCQkJCQlNZXRob2RQbHVnaW4uY2xhc3MsIHRoaXMsCi0JCQkJCVVtYVBhY2thZ2UuTUVUSE9EX0NPTkZJR1VSQVRJT05fX01FVEhPRF9QTFVHSU5fU0VMRUNUSU9OKTsKLQkJfQotCQlyZXR1cm4gbWV0aG9kUGx1Z2luU2VsZWN0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0PE1ldGhvZFBhY2thZ2U+IGdldE1ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKSB7Ci0JCWlmIChtZXRob2RQYWNrYWdlU2VsZWN0aW9uID09IG51bGwpIHsKLQkJCW1ldGhvZFBhY2thZ2VTZWxlY3Rpb24gPSBuZXcgRU9iamVjdFJlc29sdmluZ0VMaXN0PE1ldGhvZFBhY2thZ2U+KAotCQkJCQlNZXRob2RQYWNrYWdlLmNsYXNzLCB0aGlzLAotCQkJCQlVbWFQYWNrYWdlLk1FVEhPRF9DT05GSUdVUkFUSU9OX19NRVRIT0RfUEFDS0FHRV9TRUxFQ1RJT04pOwotCQl9Ci0JCXJldHVybiBtZXRob2RQYWNrYWdlU2VsZWN0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0PENvbnRlbnRDYXRlZ29yeT4gZ2V0UHJvY2Vzc1ZpZXdzKCkgewotCQlpZiAocHJvY2Vzc1ZpZXdzID09IG51bGwpIHsKLQkJCXByb2Nlc3NWaWV3cyA9IG5ldyBFT2JqZWN0UmVzb2x2aW5nRUxpc3Q8Q29udGVudENhdGVnb3J5PigKLQkJCQkJQ29udGVudENhdGVnb3J5LmNsYXNzLCB0aGlzLAotCQkJCQlVbWFQYWNrYWdlLk1FVEhPRF9DT05GSUdVUkFUSU9OX19QUk9DRVNTX1ZJRVdTKTsKLQkJfQotCQlyZXR1cm4gcHJvY2Vzc1ZpZXdzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb250ZW50Q2F0ZWdvcnkgZ2V0RGVmYXVsdFZpZXcoKSB7Ci0JCWlmIChkZWZhdWx0VmlldyAhPSBudWxsICYmICgoRU9iamVjdCkgZGVmYXVsdFZpZXcpLmVJc1Byb3h5KCkpIHsKLQkJCUludGVybmFsRU9iamVjdCBvbGREZWZhdWx0VmlldyA9IChJbnRlcm5hbEVPYmplY3QpIGRlZmF1bHRWaWV3OwotCQkJZGVmYXVsdFZpZXcgPSAoQ29udGVudENhdGVnb3J5KSBlUmVzb2x2ZVByb3h5KG9sZERlZmF1bHRWaWV3KTsKLQkJCWlmIChkZWZhdWx0VmlldyAhPSBvbGREZWZhdWx0VmlldykgewotCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlJFU09MVkUsCi0JCQkJCQkJVW1hUGFja2FnZS5NRVRIT0RfQ09ORklHVVJBVElPTl9fREVGQVVMVF9WSUVXLAotCQkJCQkJCW9sZERlZmF1bHRWaWV3LCBkZWZhdWx0VmlldykpOwotCQkJfQotCQl9Ci0JCXJldHVybiBkZWZhdWx0VmlldzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ29udGVudENhdGVnb3J5IGJhc2ljR2V0RGVmYXVsdFZpZXcoKSB7Ci0JCXJldHVybiBkZWZhdWx0VmlldzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZWZhdWx0VmlldyhDb250ZW50Q2F0ZWdvcnkgbmV3RGVmYXVsdFZpZXcpIHsKLQkJQ29udGVudENhdGVnb3J5IG9sZERlZmF1bHRWaWV3ID0gZGVmYXVsdFZpZXc7Ci0JCWRlZmF1bHRWaWV3ID0gbmV3RGVmYXVsdFZpZXc7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuTUVUSE9EX0NPTkZJR1VSQVRJT05fX0RFRkFVTFRfVklFVywKLQkJCQkJb2xkRGVmYXVsdFZpZXcsIGRlZmF1bHRWaWV3KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3Q8TWV0aG9kQ29uZmlndXJhdGlvbj4gZ2V0QmFzZUNvbmZpZ3VyYXRpb25zKCkgewotCQlpZiAoYmFzZUNvbmZpZ3VyYXRpb25zID09IG51bGwpIHsKLQkJCWJhc2VDb25maWd1cmF0aW9ucyA9IG5ldyBFT2JqZWN0UmVzb2x2aW5nRUxpc3Q8TWV0aG9kQ29uZmlndXJhdGlvbj4oCi0JCQkJCU1ldGhvZENvbmZpZ3VyYXRpb24uY2xhc3MsIHRoaXMsCi0JCQkJCVVtYVBhY2thZ2UuTUVUSE9EX0NPTkZJR1VSQVRJT05fX0JBU0VfQ09ORklHVVJBVElPTlMpOwotCQl9Ci0JCXJldHVybiBiYXNlQ29uZmlndXJhdGlvbnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3Q8Q29udGVudENhdGVnb3J5PiBnZXRTdWJ0cmFjdGVkQ2F0ZWdvcnkoKSB7Ci0JCWlmIChzdWJ0cmFjdGVkQ2F0ZWdvcnkgPT0gbnVsbCkgewotCQkJc3VidHJhY3RlZENhdGVnb3J5ID0gbmV3IEVPYmplY3RSZXNvbHZpbmdFTGlzdDxDb250ZW50Q2F0ZWdvcnk+KAotCQkJCQlDb250ZW50Q2F0ZWdvcnkuY2xhc3MsIHRoaXMsCi0JCQkJCVVtYVBhY2thZ2UuTUVUSE9EX0NPTkZJR1VSQVRJT05fX1NVQlRSQUNURURfQ0FURUdPUlkpOwotCQl9Ci0JCXJldHVybiBzdWJ0cmFjdGVkQ2F0ZWdvcnk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3Q8Q29udGVudENhdGVnb3J5PiBnZXRBZGRlZENhdGVnb3J5KCkgewotCQlpZiAoYWRkZWRDYXRlZ29yeSA9PSBudWxsKSB7Ci0JCQlhZGRlZENhdGVnb3J5ID0gbmV3IEVPYmplY3RSZXNvbHZpbmdFTGlzdDxDb250ZW50Q2F0ZWdvcnk+KAotCQkJCQlDb250ZW50Q2F0ZWdvcnkuY2xhc3MsIHRoaXMsCi0JCQkJCVVtYVBhY2thZ2UuTUVUSE9EX0NPTkZJR1VSQVRJT05fX0FEREVEX0NBVEVHT1JZKTsKLQkJfQotCQlyZXR1cm4gYWRkZWRDYXRlZ29yeTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfQ09ORklHVVJBVElPTl9fTUVUSE9EX1BMVUdJTl9TRUxFQ1RJT046Ci0JCQlyZXR1cm4gZ2V0TWV0aG9kUGx1Z2luU2VsZWN0aW9uKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfQ09ORklHVVJBVElPTl9fTUVUSE9EX1BBQ0tBR0VfU0VMRUNUSU9OOgotCQkJcmV0dXJuIGdldE1ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKTsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9DT05GSUdVUkFUSU9OX19QUk9DRVNTX1ZJRVdTOgotCQkJcmV0dXJuIGdldFByb2Nlc3NWaWV3cygpOwotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0NPTkZJR1VSQVRJT05fX0RFRkFVTFRfVklFVzoKLQkJCWlmIChyZXNvbHZlKQotCQkJCXJldHVybiBnZXREZWZhdWx0VmlldygpOwotCQkJcmV0dXJuIGJhc2ljR2V0RGVmYXVsdFZpZXcoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9DT05GSUdVUkFUSU9OX19CQVNFX0NPTkZJR1VSQVRJT05TOgotCQkJcmV0dXJuIGdldEJhc2VDb25maWd1cmF0aW9ucygpOwotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0NPTkZJR1VSQVRJT05fX1NVQlRSQUNURURfQ0FURUdPUlk6Ci0JCQlyZXR1cm4gZ2V0U3VidHJhY3RlZENhdGVnb3J5KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfQ09ORklHVVJBVElPTl9fQURERURfQ0FURUdPUlk6Ci0JCQlyZXR1cm4gZ2V0QWRkZWRDYXRlZ29yeSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfQ09ORklHVVJBVElPTl9fTUVUSE9EX1BMVUdJTl9TRUxFQ1RJT046Ci0JCQlnZXRNZXRob2RQbHVnaW5TZWxlY3Rpb24oKS5jbGVhcigpOwotCQkJZ2V0TWV0aG9kUGx1Z2luU2VsZWN0aW9uKCkuYWRkQWxsKAotCQkJCQkoQ29sbGVjdGlvbjw/IGV4dGVuZHMgTWV0aG9kUGx1Z2luPikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0NPTkZJR1VSQVRJT05fX01FVEhPRF9QQUNLQUdFX1NFTEVDVElPTjoKLQkJCWdldE1ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKS5jbGVhcigpOwotCQkJZ2V0TWV0aG9kUGFja2FnZVNlbGVjdGlvbigpLmFkZEFsbCgKLQkJCQkJKENvbGxlY3Rpb248PyBleHRlbmRzIE1ldGhvZFBhY2thZ2U+KSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfQ09ORklHVVJBVElPTl9fUFJPQ0VTU19WSUVXUzoKLQkJCWdldFByb2Nlc3NWaWV3cygpLmNsZWFyKCk7Ci0JCQlnZXRQcm9jZXNzVmlld3MoKS5hZGRBbGwoCi0JCQkJCShDb2xsZWN0aW9uPD8gZXh0ZW5kcyBDb250ZW50Q2F0ZWdvcnk+KSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfQ09ORklHVVJBVElPTl9fREVGQVVMVF9WSUVXOgotCQkJc2V0RGVmYXVsdFZpZXcoKENvbnRlbnRDYXRlZ29yeSkgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0NPTkZJR1VSQVRJT05fX0JBU0VfQ09ORklHVVJBVElPTlM6Ci0JCQlnZXRCYXNlQ29uZmlndXJhdGlvbnMoKS5jbGVhcigpOwotCQkJZ2V0QmFzZUNvbmZpZ3VyYXRpb25zKCkuYWRkQWxsKAotCQkJCQkoQ29sbGVjdGlvbjw/IGV4dGVuZHMgTWV0aG9kQ29uZmlndXJhdGlvbj4pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9DT05GSUdVUkFUSU9OX19TVUJUUkFDVEVEX0NBVEVHT1JZOgotCQkJZ2V0U3VidHJhY3RlZENhdGVnb3J5KCkuY2xlYXIoKTsKLQkJCWdldFN1YnRyYWN0ZWRDYXRlZ29yeSgpLmFkZEFsbCgKLQkJCQkJKENvbGxlY3Rpb248PyBleHRlbmRzIENvbnRlbnRDYXRlZ29yeT4pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9DT05GSUdVUkFUSU9OX19BRERFRF9DQVRFR09SWToKLQkJCWdldEFkZGVkQ2F0ZWdvcnkoKS5jbGVhcigpOwotCQkJZ2V0QWRkZWRDYXRlZ29yeSgpLmFkZEFsbCgKLQkJCQkJKENvbGxlY3Rpb248PyBleHRlbmRzIENvbnRlbnRDYXRlZ29yeT4pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfQ09ORklHVVJBVElPTl9fTUVUSE9EX1BMVUdJTl9TRUxFQ1RJT046Ci0JCQlnZXRNZXRob2RQbHVnaW5TZWxlY3Rpb24oKS5jbGVhcigpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0NPTkZJR1VSQVRJT05fX01FVEhPRF9QQUNLQUdFX1NFTEVDVElPTjoKLQkJCWdldE1ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKS5jbGVhcigpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0NPTkZJR1VSQVRJT05fX1BST0NFU1NfVklFV1M6Ci0JCQlnZXRQcm9jZXNzVmlld3MoKS5jbGVhcigpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0NPTkZJR1VSQVRJT05fX0RFRkFVTFRfVklFVzoKLQkJCXNldERlZmF1bHRWaWV3KChDb250ZW50Q2F0ZWdvcnkpIG51bGwpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0NPTkZJR1VSQVRJT05fX0JBU0VfQ09ORklHVVJBVElPTlM6Ci0JCQlnZXRCYXNlQ29uZmlndXJhdGlvbnMoKS5jbGVhcigpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0NPTkZJR1VSQVRJT05fX1NVQlRSQUNURURfQ0FURUdPUlk6Ci0JCQlnZXRTdWJ0cmFjdGVkQ2F0ZWdvcnkoKS5jbGVhcigpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0NPTkZJR1VSQVRJT05fX0FEREVEX0NBVEVHT1JZOgotCQkJZ2V0QWRkZWRDYXRlZ29yeSgpLmNsZWFyKCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJLy9VTUEtLT4KLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBnZXRGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZShmZWF0dXJlSUQpOwotCQlpZiAoZmVhdHVyZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gaXNGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZVNldChmZWF0dXJlKTsKLQkJfQotCQkvL1VNQTwtLQkJCi0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfQ09ORklHVVJBVElPTl9fTUVUSE9EX1BMVUdJTl9TRUxFQ1RJT046Ci0JCQlyZXR1cm4gbWV0aG9kUGx1Z2luU2VsZWN0aW9uICE9IG51bGwKLQkJCQkJJiYgIW1ldGhvZFBsdWdpblNlbGVjdGlvbi5pc0VtcHR5KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfQ09ORklHVVJBVElPTl9fTUVUSE9EX1BBQ0tBR0VfU0VMRUNUSU9OOgotCQkJcmV0dXJuIG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24gIT0gbnVsbAotCQkJCQkmJiAhbWV0aG9kUGFja2FnZVNlbGVjdGlvbi5pc0VtcHR5KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfQ09ORklHVVJBVElPTl9fUFJPQ0VTU19WSUVXUzoKLQkJCXJldHVybiBwcm9jZXNzVmlld3MgIT0gbnVsbCAmJiAhcHJvY2Vzc1ZpZXdzLmlzRW1wdHkoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9DT05GSUdVUkFUSU9OX19ERUZBVUxUX1ZJRVc6Ci0JCQlyZXR1cm4gZGVmYXVsdFZpZXcgIT0gbnVsbDsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9DT05GSUdVUkFUSU9OX19CQVNFX0NPTkZJR1VSQVRJT05TOgotCQkJcmV0dXJuIGJhc2VDb25maWd1cmF0aW9ucyAhPSBudWxsICYmICFiYXNlQ29uZmlndXJhdGlvbnMuaXNFbXB0eSgpOwotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0NPTkZJR1VSQVRJT05fX1NVQlRSQUNURURfQ0FURUdPUlk6Ci0JCQlyZXR1cm4gc3VidHJhY3RlZENhdGVnb3J5ICE9IG51bGwgJiYgIXN1YnRyYWN0ZWRDYXRlZ29yeS5pc0VtcHR5KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfQ09ORklHVVJBVElPTl9fQURERURfQ0FURUdPUlk6Ci0JCQlyZXR1cm4gYWRkZWRDYXRlZ29yeSAhPSBudWxsICYmICFhZGRlZENhdGVnb3J5LmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi19IC8vTWV0aG9kQ29uZmlndXJhdGlvbkltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9NZXRob2RFbGVtZW50SW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL01ldGhvZEVsZW1lbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2YWI5NGIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL01ldGhvZEVsZW1lbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1ODEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RSZXNvbHZpbmdFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuWE1MUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5FeHRlbnNpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db25zdHJhaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuS2luZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50UHJvcGVydHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5VbWFVdGlsOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5NZXRob2RFbGVtZW50SW1wbCNnZXRHdWlkIDxlbT5HdWlkPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuTWV0aG9kRWxlbWVudEltcGwjZ2V0UHJlc2VudGF0aW9uTmFtZSA8ZW0+UHJlc2VudGF0aW9uIE5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5NZXRob2RFbGVtZW50SW1wbCNnZXRCcmllZkRlc2NyaXB0aW9uIDxlbT5CcmllZiBEZXNjcmlwdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLk1ldGhvZEVsZW1lbnRJbXBsI2dldE93bmVkUnVsZXMgPGVtPk93bmVkIFJ1bGVzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuTWV0aG9kRWxlbWVudEltcGwjZ2V0TWV0aG9kRWxlbWVudFByb3BlcnR5IDxlbT5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLk1ldGhvZEVsZW1lbnRJbXBsI2dldEtpbmQgPGVtPktpbmQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5NZXRob2RFbGVtZW50SW1wbCNnZXRTdXBwcmVzc2VkIDxlbT5TdXBwcmVzc2VkPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuTWV0aG9kRWxlbWVudEltcGwjZ2V0T3JkZXJpbmdHdWlkZSA8ZW0+T3JkZXJpbmcgR3VpZGU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBNZXRob2RFbGVtZW50SW1wbCBleHRlbmRzIFBhY2thZ2VhYmxlRWxlbWVudEltcGwKLQkJaW1wbGVtZW50cyBNZXRob2RFbGVtZW50LCBJQWRhcHRhYmxlIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRHdWlkKCkgPGVtPkd1aWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEd1aWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEdVSURfRURFRkFVTFQgPSAiIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0R3VpZCgpIDxlbT5HdWlkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRHdWlkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGd1aWQgPSBHVUlEX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByZXNlbnRhdGlvbk5hbWUoKSA8ZW0+UHJlc2VudGF0aW9uIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFByZXNlbnRhdGlvbk5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRVNFTlRBVElPTl9OQU1FX0VERUZBVUxUID0gIiI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByZXNlbnRhdGlvbk5hbWUoKSA8ZW0+UHJlc2VudGF0aW9uIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFByZXNlbnRhdGlvbk5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgcHJlc2VudGF0aW9uTmFtZSA9IFBSRVNFTlRBVElPTl9OQU1FX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEJyaWVmRGVzY3JpcHRpb24oKSA8ZW0+QnJpZWYgRGVzY3JpcHRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEJyaWVmRGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEJSSUVGX0RFU0NSSVBUSU9OX0VERUZBVUxUID0gIiI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEJyaWVmRGVzY3JpcHRpb24oKSA8ZW0+QnJpZWYgRGVzY3JpcHRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEJyaWVmRGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgYnJpZWZEZXNjcmlwdGlvbiA9IEJSSUVGX0RFU0NSSVBUSU9OX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0T3duZWRSdWxlcygpIDxlbT5Pd25lZCBSdWxlczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRPd25lZFJ1bGVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8Q29uc3RyYWludD4gb3duZWRSdWxlczsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1ldGhvZEVsZW1lbnRQcm9wZXJ0eSgpIDxlbT5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRNZXRob2RFbGVtZW50UHJvcGVydHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxNZXRob2RFbGVtZW50UHJvcGVydHk+IG1ldGhvZEVsZW1lbnRQcm9wZXJ0eTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEtpbmQoKSA8ZW0+S2luZDwvZW0+fScgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRLaW5kKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8S2luZD4ga2luZDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTdXBwcmVzc2VkKCkgPGVtPlN1cHByZXNzZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFN1cHByZXNzZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQm9vbGVhbiBTVVBQUkVTU0VEX0VERUZBVUxUID0gQm9vbGVhbi5GQUxTRTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFN1cHByZXNzZWQoKSA8ZW0+U3VwcHJlc3NlZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U3VwcHJlc3NlZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJvb2xlYW4gc3VwcHJlc3NlZCA9IFNVUFBSRVNTRURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0T3JkZXJpbmdHdWlkZSgpIDxlbT5PcmRlcmluZyBHdWlkZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0T3JkZXJpbmdHdWlkZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1JERVJJTkdfR1VJREVfRURFRkFVTFQgPSAiIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0T3JkZXJpbmdHdWlkZSgpIDxlbT5PcmRlcmluZyBHdWlkZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0T3JkZXJpbmdHdWlkZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBvcmRlcmluZ0d1aWRlID0gT1JERVJJTkdfR1VJREVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTWV0aG9kRWxlbWVudEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJLy9VTUEtLT4KLQkJcmVhc3NpZ25EZWZhdWx0VmFsdWVzKCk7Ci0JCS8vVU1BPC0tICAKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuTUVUSE9EX0VMRU1FTlQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEd1aWQoKSB7Ci0JCWlmIChndWlkID09IG51bGwgfHwgZ3VpZC5sZW5ndGgoKSA9PSAwKSB7Ci0JCQlndWlkID0gVW1hVXRpbC5nZW5lcmF0ZUdVSUQoKTsKLQkJfQotCQlyZXR1cm4gZ3VpZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEd1aWQoU3RyaW5nIG5ld0d1aWQpIHsKLQkJU3RyaW5nIG9sZEd1aWQgPSBndWlkOwotCQlndWlkID0gbmV3R3VpZDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9fR1VJRCwgb2xkR3VpZCwgZ3VpZCkpOwotCi0JCS8vIHN5bmNoIHVwIHRoZSByZXNvdXJjZSdzIElEVG9FT2JqZWN0TWFwIGFuZCBFT2JqZWN0VG9JRE1hcCB3aXRoIG5ld0d1aWQKLQkJLy8KLQkJaWYgKGVSZXNvdXJjZSgpIGluc3RhbmNlb2YgWE1MUmVzb3VyY2UpIHsKLQkJCVhNTFJlc291cmNlIHJlc291cmNlID0gKChYTUxSZXNvdXJjZSkgZVJlc291cmNlKCkpOwotCQkJcmVzb3VyY2Uuc2V0SUQodGhpcywgbmV3R3VpZCk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKENsYXNzIGFkYXB0ZXIpIHsKLQkJTGlzdDxJQWRhcHRhYmxlPiBleHRlbnNpb25zID0gRXh0ZW5zaW9uSGVscGVyLmdldEV4dGVuc2lvbnMoIm9yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUiLCAibWV0aG9kRWxlbWVudElBZGFwdGFibGUiLCBJQWRhcHRhYmxlLmNsYXNzKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWZvciAoSUFkYXB0YWJsZSBhZGFwdGFibGUgOiBleHRlbnNpb25zKSB7Ci0JCQlPYmplY3QgcmVzdWx0ID0gYWRhcHRhYmxlLmdldEFkYXB0ZXIoYWRhcHRlcik7Ci0JCQlpZiAocmVzdWx0ICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UHJlc2VudGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIHByZXNlbnRhdGlvbk5hbWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHJlc2VudGF0aW9uTmFtZShTdHJpbmcgbmV3UHJlc2VudGF0aW9uTmFtZSkgewotCQlTdHJpbmcgb2xkUHJlc2VudGF0aW9uTmFtZSA9IHByZXNlbnRhdGlvbk5hbWU7Ci0JCXByZXNlbnRhdGlvbk5hbWUgPSBuZXdQcmVzZW50YXRpb25OYW1lOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19QUkVTRU5UQVRJT05fTkFNRSwKLQkJCQkJb2xkUHJlc2VudGF0aW9uTmFtZSwgcHJlc2VudGF0aW9uTmFtZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0QnJpZWZEZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIGJyaWVmRGVzY3JpcHRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QnJpZWZEZXNjcmlwdGlvbihTdHJpbmcgbmV3QnJpZWZEZXNjcmlwdGlvbikgewotCQlTdHJpbmcgb2xkQnJpZWZEZXNjcmlwdGlvbiA9IGJyaWVmRGVzY3JpcHRpb247Ci0JCWJyaWVmRGVzY3JpcHRpb24gPSBuZXdCcmllZkRlc2NyaXB0aW9uOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19CUklFRl9ERVNDUklQVElPTiwKLQkJCQkJb2xkQnJpZWZEZXNjcmlwdGlvbiwgYnJpZWZEZXNjcmlwdGlvbikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0PENvbnN0cmFpbnQ+IGdldE93bmVkUnVsZXMoKSB7Ci0JCWlmIChvd25lZFJ1bGVzID09IG51bGwpIHsKLQkJCW93bmVkUnVsZXMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QuUmVzb2x2aW5nPENvbnN0cmFpbnQ+KAotCQkJCQlDb25zdHJhaW50LmNsYXNzLCB0aGlzLAotCQkJCQlVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19PV05FRF9SVUxFUyk7Ci0JCX0KLQkJcmV0dXJuIG93bmVkUnVsZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3Q8TWV0aG9kRWxlbWVudFByb3BlcnR5PiBnZXRNZXRob2RFbGVtZW50UHJvcGVydHkoKSB7Ci0JCWlmIChtZXRob2RFbGVtZW50UHJvcGVydHkgPT0gbnVsbCkgewotCQkJbWV0aG9kRWxlbWVudFByb3BlcnR5ID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0LlJlc29sdmluZzxNZXRob2RFbGVtZW50UHJvcGVydHk+KAotCQkJCQlNZXRob2RFbGVtZW50UHJvcGVydHkuY2xhc3MsIHRoaXMsCi0JCQkJCVVtYVBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZKTsKLQkJfQotCQlyZXR1cm4gbWV0aG9kRWxlbWVudFByb3BlcnR5OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0PEtpbmQ+IGdldEtpbmQoKSB7Ci0JCWlmIChraW5kID09IG51bGwpIHsKLQkJCWtpbmQgPSBuZXcgRU9iamVjdFJlc29sdmluZ0VMaXN0PEtpbmQ+KEtpbmQuY2xhc3MsIHRoaXMsCi0JCQkJCVVtYVBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfX0tJTkQpOwotCQl9Ci0JCXJldHVybiBraW5kOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCb29sZWFuIGdldFN1cHByZXNzZWQoKSB7Ci0JCXJldHVybiBzdXBwcmVzc2VkOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFN1cHByZXNzZWQoQm9vbGVhbiBuZXdTdXBwcmVzc2VkKSB7Ci0JCUJvb2xlYW4gb2xkU3VwcHJlc3NlZCA9IHN1cHByZXNzZWQ7Ci0JCXN1cHByZXNzZWQgPSBuZXdTdXBwcmVzc2VkOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19TVVBQUkVTU0VELCBvbGRTdXBwcmVzc2VkLAotCQkJCQlzdXBwcmVzc2VkKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRPcmRlcmluZ0d1aWRlKCkgewotCQlyZXR1cm4gb3JkZXJpbmdHdWlkZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRPcmRlcmluZ0d1aWRlKFN0cmluZyBuZXdPcmRlcmluZ0d1aWRlKSB7Ci0JCVN0cmluZyBvbGRPcmRlcmluZ0d1aWRlID0gb3JkZXJpbmdHdWlkZTsKLQkJb3JkZXJpbmdHdWlkZSA9IG5ld09yZGVyaW5nR3VpZGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfX09SREVSSU5HX0dVSURFLAotCQkJCQlvbGRPcmRlcmluZ0d1aWRlLCBvcmRlcmluZ0d1aWRlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwKLQkJCWludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19PV05FRF9SVUxFUzoKLQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pIGdldE93bmVkUnVsZXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsCi0JCQkJCW1zZ3MpOwotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOgotCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PikgZ2V0TWV0aG9kRWxlbWVudFByb3BlcnR5KCkpLmJhc2ljUmVtb3ZlKAotCQkJCQlvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19HVUlEOgotCQkJcmV0dXJuIGdldEd1aWQoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19QUkVTRU5UQVRJT05fTkFNRToKLQkJCXJldHVybiBnZXRQcmVzZW50YXRpb25OYW1lKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9fQlJJRUZfREVTQ1JJUFRJT046Ci0JCQlyZXR1cm4gZ2V0QnJpZWZEZXNjcmlwdGlvbigpOwotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfX09XTkVEX1JVTEVTOgotCQkJcmV0dXJuIGdldE93bmVkUnVsZXMoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWToKLQkJCXJldHVybiBnZXRNZXRob2RFbGVtZW50UHJvcGVydHkoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19LSU5EOgotCQkJcmV0dXJuIGdldEtpbmQoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19TVVBQUkVTU0VEOgotCQkJcmV0dXJuIGdldFN1cHByZXNzZWQoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19PUkRFUklOR19HVUlERToKLQkJCXJldHVybiBnZXRPcmRlcmluZ0d1aWRlKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19HVUlEOgotCQkJc2V0R3VpZCgoU3RyaW5nKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9fUFJFU0VOVEFUSU9OX05BTUU6Ci0JCQlzZXRQcmVzZW50YXRpb25OYW1lKChTdHJpbmcpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19CUklFRl9ERVNDUklQVElPTjoKLQkJCXNldEJyaWVmRGVzY3JpcHRpb24oKFN0cmluZykgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfX09XTkVEX1JVTEVTOgotCQkJZ2V0T3duZWRSdWxlcygpLmNsZWFyKCk7Ci0JCQlnZXRPd25lZFJ1bGVzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBDb25zdHJhaW50PikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOgotCQkJZ2V0TWV0aG9kRWxlbWVudFByb3BlcnR5KCkuY2xlYXIoKTsKLQkJCWdldE1ldGhvZEVsZW1lbnRQcm9wZXJ0eSgpLmFkZEFsbCgKLQkJCQkJKENvbGxlY3Rpb248PyBleHRlbmRzIE1ldGhvZEVsZW1lbnRQcm9wZXJ0eT4pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19LSU5EOgotCQkJZ2V0S2luZCgpLmNsZWFyKCk7Ci0JCQlnZXRLaW5kKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBLaW5kPikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfX1NVUFBSRVNTRUQ6Ci0JCQlzZXRTdXBwcmVzc2VkKChCb29sZWFuKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9fT1JERVJJTkdfR1VJREU6Ci0JCQlzZXRPcmRlcmluZ0d1aWRlKChTdHJpbmcpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9fR1VJRDoKLQkJCXNldEd1aWQoR1VJRF9FREVGQVVMVCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9fUFJFU0VOVEFUSU9OX05BTUU6Ci0JCQlzZXRQcmVzZW50YXRpb25OYW1lKFBSRVNFTlRBVElPTl9OQU1FX0VERUZBVUxUKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19CUklFRl9ERVNDUklQVElPTjoKLQkJCXNldEJyaWVmRGVzY3JpcHRpb24oQlJJRUZfREVTQ1JJUFRJT05fRURFRkFVTFQpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfX09XTkVEX1JVTEVTOgotCQkJZ2V0T3duZWRSdWxlcygpLmNsZWFyKCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk6Ci0JCQlnZXRNZXRob2RFbGVtZW50UHJvcGVydHkoKS5jbGVhcigpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfX0tJTkQ6Ci0JCQlnZXRLaW5kKCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19TVVBQUkVTU0VEOgotCQkJc2V0U3VwcHJlc3NlZChTVVBQUkVTU0VEX0VERUZBVUxUKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19PUkRFUklOR19HVUlERToKLQkJCXNldE9yZGVyaW5nR3VpZGUoT1JERVJJTkdfR1VJREVfRURFRkFVTFQpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCS8vVU1BLS0+Ci0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gZ2V0RmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWUoZmVhdHVyZUlEKTsKLQkJaWYgKGZlYXR1cmUgIT0gbnVsbCkgewotCQkJcmV0dXJuIGlzRmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWVTZXQoZmVhdHVyZSk7Ci0JCX0KLQkJLy9VTUE8LS0JCQotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfX0dVSUQ6Ci0JCQlyZXR1cm4gR1VJRF9FREVGQVVMVCA9PSBudWxsID8gZ3VpZCAhPSBudWxsIDogIUdVSURfRURFRkFVTFQKLQkJCQkJLmVxdWFscyhndWlkKTsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19QUkVTRU5UQVRJT05fTkFNRToKLQkJCXJldHVybiBQUkVTRU5UQVRJT05fTkFNRV9FREVGQVVMVCA9PSBudWxsID8gcHJlc2VudGF0aW9uTmFtZSAhPSBudWxsCi0JCQkJCTogIVBSRVNFTlRBVElPTl9OQU1FX0VERUZBVUxULmVxdWFscyhwcmVzZW50YXRpb25OYW1lKTsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19CUklFRl9ERVNDUklQVElPTjoKLQkJCXJldHVybiBCUklFRl9ERVNDUklQVElPTl9FREVGQVVMVCA9PSBudWxsID8gYnJpZWZEZXNjcmlwdGlvbiAhPSBudWxsCi0JCQkJCTogIUJSSUVGX0RFU0NSSVBUSU9OX0VERUZBVUxULmVxdWFscyhicmllZkRlc2NyaXB0aW9uKTsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19PV05FRF9SVUxFUzoKLQkJCXJldHVybiBvd25lZFJ1bGVzICE9IG51bGwgJiYgIW93bmVkUnVsZXMuaXNFbXB0eSgpOwotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOgotCQkJcmV0dXJuIG1ldGhvZEVsZW1lbnRQcm9wZXJ0eSAhPSBudWxsCi0JCQkJCSYmICFtZXRob2RFbGVtZW50UHJvcGVydHkuaXNFbXB0eSgpOwotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfX0tJTkQ6Ci0JCQlyZXR1cm4ga2luZCAhPSBudWxsICYmICFraW5kLmlzRW1wdHkoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19TVVBQUkVTU0VEOgotCQkJcmV0dXJuIFNVUFBSRVNTRURfRURFRkFVTFQgPT0gbnVsbCA/IHN1cHByZXNzZWQgIT0gbnVsbAotCQkJCQk6ICFTVVBQUkVTU0VEX0VERUZBVUxULmVxdWFscyhzdXBwcmVzc2VkKTsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19PUkRFUklOR19HVUlERToKLQkJCXJldHVybiBPUkRFUklOR19HVUlERV9FREVGQVVMVCA9PSBudWxsID8gb3JkZXJpbmdHdWlkZSAhPSBudWxsCi0JCQkJCTogIU9SREVSSU5HX0dVSURFX0VERUZBVUxULmVxdWFscyhvcmRlcmluZ0d1aWRlKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpCi0JCQlyZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChndWlkOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGd1aWQpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHByZXNlbnRhdGlvbk5hbWU6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQocHJlc2VudGF0aW9uTmFtZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgYnJpZWZEZXNjcmlwdGlvbjogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChicmllZkRlc2NyaXB0aW9uKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBzdXBwcmVzc2VkOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKHN1cHByZXNzZWQpOwotCQlyZXN1bHQuYXBwZW5kKCIsIG9yZGVyaW5nR3VpZGU6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQob3JkZXJpbmdHdWlkZSk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL01ldGhvZEVsZW1lbnRJbXBsCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvTWV0aG9kRWxlbWVudFByb3BlcnR5SW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL01ldGhvZEVsZW1lbnRQcm9wZXJ0eUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWU2NDA3ZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvTWV0aG9kRWxlbWVudFByb3BlcnR5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50UHJvcGVydHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5NZXRob2RFbGVtZW50UHJvcGVydHlJbXBsI2dldFZhbHVlIDxlbT5WYWx1ZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIE1ldGhvZEVsZW1lbnRQcm9wZXJ0eUltcGwgZXh0ZW5kcyBQYWNrYWdlYWJsZUVsZW1lbnRJbXBsIGltcGxlbWVudHMKLQkJTWV0aG9kRWxlbWVudFByb3BlcnR5IHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWYWx1ZSgpIDxlbT5WYWx1ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VmFsdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTFVFX0VERUZBVUxUID0gIiI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZhbHVlKCkgPGVtPlZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRWYWx1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyB2YWx1ZSA9IFZBTFVFX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE1ldGhvZEVsZW1lbnRQcm9wZXJ0eUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJLy9VTUEtLT4KLQkJcmVhc3NpZ25EZWZhdWx0VmFsdWVzKCk7Ci0JCS8vVU1BPC0tICAKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpIHsKLQkJcmV0dXJuIHZhbHVlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyBuZXdWYWx1ZSkgewotCQlTdHJpbmcgb2xkVmFsdWUgPSB2YWx1ZTsKLQkJdmFsdWUgPSBuZXdWYWx1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWV9fVkFMVUUsIG9sZFZhbHVlLCB2YWx1ZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX1BST1BFUlRZX19WQUxVRToKLQkJCXJldHVybiBnZXRWYWx1ZSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWV9fVkFMVUU6Ci0JCQlzZXRWYWx1ZSgoU3RyaW5nKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFlfX1ZBTFVFOgotCQkJc2V0VmFsdWUoVkFMVUVfRURFRkFVTFQpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCS8vVU1BLS0+Ci0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gZ2V0RmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWUoZmVhdHVyZUlEKTsKLQkJaWYgKGZlYXR1cmUgIT0gbnVsbCkgewotCQkJcmV0dXJuIGlzRmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWVTZXQoZmVhdHVyZSk7Ci0JCX0KLQkJLy9VTUE8LS0JCQotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFlfX1ZBTFVFOgotCQkJcmV0dXJuIFZBTFVFX0VERUZBVUxUID09IG51bGwgPyB2YWx1ZSAhPSBudWxsIDogIVZBTFVFX0VERUZBVUxUCi0JCQkJCS5lcXVhbHModmFsdWUpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkKLQkJCXJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHZhbHVlOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKHZhbHVlKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vTWV0aG9kRWxlbWVudFByb3BlcnR5SW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL01ldGhvZExpYnJhcnlJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvTWV0aG9kTGlicmFyeUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDY0ZDJlZi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvTWV0aG9kTGlicmFyeUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyMCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+TWV0aG9kIExpYnJhcnk8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5NZXRob2RMaWJyYXJ5SW1wbCNnZXRNZXRob2RQbHVnaW5zIDxlbT5NZXRob2QgUGx1Z2luczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLk1ldGhvZExpYnJhcnlJbXBsI2dldFByZWRlZmluZWRDb25maWd1cmF0aW9ucyA8ZW0+UHJlZGVmaW5lZCBDb25maWd1cmF0aW9uczwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIE1ldGhvZExpYnJhcnlJbXBsIGV4dGVuZHMgTWV0aG9kVW5pdEltcGwgaW1wbGVtZW50cyBNZXRob2RMaWJyYXJ5IHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1ldGhvZFBsdWdpbnMoKSA8ZW0+TWV0aG9kIFBsdWdpbnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TWV0aG9kUGx1Z2lucygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PE1ldGhvZFBsdWdpbj4gbWV0aG9kUGx1Z2luczsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByZWRlZmluZWRDb25maWd1cmF0aW9ucygpIDxlbT5QcmVkZWZpbmVkIENvbmZpZ3VyYXRpb25zPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFByZWRlZmluZWRDb25maWd1cmF0aW9ucygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PE1ldGhvZENvbmZpZ3VyYXRpb24+IHByZWRlZmluZWRDb25maWd1cmF0aW9uczsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBNZXRob2RMaWJyYXJ5SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQotCQkvL1VNQS0tPgotCQlyZWFzc2lnbkRlZmF1bHRWYWx1ZXMoKTsKLQkJLy9VTUE8LS0gIAotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5NRVRIT0RfTElCUkFSWTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdDxNZXRob2RQbHVnaW4+IGdldE1ldGhvZFBsdWdpbnMoKSB7Ci0JCWlmIChtZXRob2RQbHVnaW5zID09IG51bGwpIHsKLQkJCW1ldGhvZFBsdWdpbnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QuUmVzb2x2aW5nPE1ldGhvZFBsdWdpbj4oCi0JCQkJCU1ldGhvZFBsdWdpbi5jbGFzcywgdGhpcywKLQkJCQkJVW1hUGFja2FnZS5NRVRIT0RfTElCUkFSWV9fTUVUSE9EX1BMVUdJTlMpOwotCQl9Ci0JCXJldHVybiBtZXRob2RQbHVnaW5zOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0PE1ldGhvZENvbmZpZ3VyYXRpb24+IGdldFByZWRlZmluZWRDb25maWd1cmF0aW9ucygpIHsKLQkJaWYgKHByZWRlZmluZWRDb25maWd1cmF0aW9ucyA9PSBudWxsKSB7Ci0JCQlwcmVkZWZpbmVkQ29uZmlndXJhdGlvbnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QuUmVzb2x2aW5nPE1ldGhvZENvbmZpZ3VyYXRpb24+KAotCQkJCQlNZXRob2RDb25maWd1cmF0aW9uLmNsYXNzLCB0aGlzLAotCQkJCQlVbWFQYWNrYWdlLk1FVEhPRF9MSUJSQVJZX19QUkVERUZJTkVEX0NPTkZJR1VSQVRJT05TKTsKLQkJfQotCQlyZXR1cm4gcHJlZGVmaW5lZENvbmZpZ3VyYXRpb25zOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsCi0JCQlpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfTElCUkFSWV9fTUVUSE9EX1BMVUdJTlM6Ci0JCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KSBnZXRNZXRob2RQbHVnaW5zKCkpLmJhc2ljUmVtb3ZlKAotCQkJCQlvdGhlckVuZCwgbXNncyk7Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfTElCUkFSWV9fUFJFREVGSU5FRF9DT05GSUdVUkFUSU9OUzoKLQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pIGdldFByZWRlZmluZWRDb25maWd1cmF0aW9ucygpKQotCQkJCQkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfTElCUkFSWV9fTUVUSE9EX1BMVUdJTlM6Ci0JCQlyZXR1cm4gZ2V0TWV0aG9kUGx1Z2lucygpOwotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0xJQlJBUllfX1BSRURFRklORURfQ09ORklHVVJBVElPTlM6Ci0JCQlyZXR1cm4gZ2V0UHJlZGVmaW5lZENvbmZpZ3VyYXRpb25zKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9MSUJSQVJZX19NRVRIT0RfUExVR0lOUzoKLQkJCWdldE1ldGhvZFBsdWdpbnMoKS5jbGVhcigpOwotCQkJZ2V0TWV0aG9kUGx1Z2lucygpLmFkZEFsbCgKLQkJCQkJKENvbGxlY3Rpb248PyBleHRlbmRzIE1ldGhvZFBsdWdpbj4pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9MSUJSQVJZX19QUkVERUZJTkVEX0NPTkZJR1VSQVRJT05TOgotCQkJZ2V0UHJlZGVmaW5lZENvbmZpZ3VyYXRpb25zKCkuY2xlYXIoKTsKLQkJCWdldFByZWRlZmluZWRDb25maWd1cmF0aW9ucygpLmFkZEFsbCgKLQkJCQkJKENvbGxlY3Rpb248PyBleHRlbmRzIE1ldGhvZENvbmZpZ3VyYXRpb24+KSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0xJQlJBUllfX01FVEhPRF9QTFVHSU5TOgotCQkJZ2V0TWV0aG9kUGx1Z2lucygpLmNsZWFyKCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfTElCUkFSWV9fUFJFREVGSU5FRF9DT05GSUdVUkFUSU9OUzoKLQkJCWdldFByZWRlZmluZWRDb25maWd1cmF0aW9ucygpLmNsZWFyKCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJLy9VTUEtLT4KLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBnZXRGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZShmZWF0dXJlSUQpOwotCQlpZiAoZmVhdHVyZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gaXNGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZVNldChmZWF0dXJlKTsKLQkJfQotCQkvL1VNQTwtLQkJCi0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfTElCUkFSWV9fTUVUSE9EX1BMVUdJTlM6Ci0JCQlyZXR1cm4gbWV0aG9kUGx1Z2lucyAhPSBudWxsICYmICFtZXRob2RQbHVnaW5zLmlzRW1wdHkoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9MSUJSQVJZX19QUkVERUZJTkVEX0NPTkZJR1VSQVRJT05TOgotCQkJcmV0dXJuIHByZWRlZmluZWRDb25maWd1cmF0aW9ucyAhPSBudWxsCi0JCQkJCSYmICFwcmVkZWZpbmVkQ29uZmlndXJhdGlvbnMuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLX0gLy9NZXRob2RMaWJyYXJ5SW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL01ldGhvZFBhY2thZ2VJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvTWV0aG9kUGFja2FnZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWIxNDc3ZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvTWV0aG9kUGFja2FnZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwMSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdFJlc29sdmluZ0VMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk1ldGhvZCBQYWNrYWdlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuTWV0aG9kUGFja2FnZUltcGwjZ2V0R2xvYmFsIDxlbT5HbG9iYWw8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5NZXRob2RQYWNrYWdlSW1wbCNnZXRSZXVzZWRQYWNrYWdlcyA8ZW0+UmV1c2VkIFBhY2thZ2VzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuTWV0aG9kUGFja2FnZUltcGwjZ2V0Q2hpbGRQYWNrYWdlcyA8ZW0+Q2hpbGQgUGFja2FnZXM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBNZXRob2RQYWNrYWdlSW1wbCBleHRlbmRzIE1ldGhvZEVsZW1lbnRJbXBsIGltcGxlbWVudHMKLQkJTWV0aG9kUGFja2FnZSB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0R2xvYmFsKCkgPGVtPkdsb2JhbDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0R2xvYmFsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJvb2xlYW4gR0xPQkFMX0VERUZBVUxUID0gQm9vbGVhbi5GQUxTRTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEdsb2JhbCgpIDxlbT5HbG9iYWw8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEdsb2JhbCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJvb2xlYW4gZ2xvYmFsID0gR0xPQkFMX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmV1c2VkUGFja2FnZXMoKSA8ZW0+UmV1c2VkIFBhY2thZ2VzPC9lbT59JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJldXNlZFBhY2thZ2VzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8TWV0aG9kUGFja2FnZT4gcmV1c2VkUGFja2FnZXM7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDaGlsZFBhY2thZ2VzKCkgPGVtPkNoaWxkIFBhY2thZ2VzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENoaWxkUGFja2FnZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxNZXRob2RQYWNrYWdlPiBjaGlsZFBhY2thZ2VzOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE1ldGhvZFBhY2thZ2VJbXBsKCkgewotCQlzdXBlcigpOwotCi0JCS8vVU1BLS0+Ci0JCXJlYXNzaWduRGVmYXVsdFZhbHVlcygpOwotCQkvL1VNQTwtLSAgCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLk1FVEhPRF9QQUNLQUdFOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCb29sZWFuIGdldEdsb2JhbCgpIHsKLQkJcmV0dXJuIGdsb2JhbDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRHbG9iYWwoQm9vbGVhbiBuZXdHbG9iYWwpIHsKLQkJQm9vbGVhbiBvbGRHbG9iYWwgPSBnbG9iYWw7Ci0JCWdsb2JhbCA9IG5ld0dsb2JhbDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5NRVRIT0RfUEFDS0FHRV9fR0xPQkFMLCBvbGRHbG9iYWwsIGdsb2JhbCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0PE1ldGhvZFBhY2thZ2U+IGdldFJldXNlZFBhY2thZ2VzKCkgewotCQlpZiAocmV1c2VkUGFja2FnZXMgPT0gbnVsbCkgewotCQkJcmV1c2VkUGFja2FnZXMgPSBuZXcgRU9iamVjdFJlc29sdmluZ0VMaXN0PE1ldGhvZFBhY2thZ2U+KAotCQkJCQlNZXRob2RQYWNrYWdlLmNsYXNzLCB0aGlzLAotCQkJCQlVbWFQYWNrYWdlLk1FVEhPRF9QQUNLQUdFX19SRVVTRURfUEFDS0FHRVMpOwotCQl9Ci0JCXJldHVybiByZXVzZWRQYWNrYWdlczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdDxNZXRob2RQYWNrYWdlPiBnZXRDaGlsZFBhY2thZ2VzKCkgewotCQlpZiAoY2hpbGRQYWNrYWdlcyA9PSBudWxsKSB7Ci0JCQljaGlsZFBhY2thZ2VzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0LlJlc29sdmluZzxNZXRob2RQYWNrYWdlPigKLQkJCQkJTWV0aG9kUGFja2FnZS5jbGFzcywgdGhpcywKLQkJCQkJVW1hUGFja2FnZS5NRVRIT0RfUEFDS0FHRV9fQ0hJTERfUEFDS0FHRVMpOwotCQl9Ci0JCXJldHVybiBjaGlsZFBhY2thZ2VzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsCi0JCQlpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfUEFDS0FHRV9fQ0hJTERfUEFDS0FHRVM6Ci0JCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KSBnZXRDaGlsZFBhY2thZ2VzKCkpLmJhc2ljUmVtb3ZlKAotCQkJCQlvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9QQUNLQUdFX19HTE9CQUw6Ci0JCQlyZXR1cm4gZ2V0R2xvYmFsKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfUEFDS0FHRV9fUkVVU0VEX1BBQ0tBR0VTOgotCQkJcmV0dXJuIGdldFJldXNlZFBhY2thZ2VzKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfUEFDS0FHRV9fQ0hJTERfUEFDS0FHRVM6Ci0JCQlyZXR1cm4gZ2V0Q2hpbGRQYWNrYWdlcygpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfUEFDS0FHRV9fR0xPQkFMOgotCQkJc2V0R2xvYmFsKChCb29sZWFuKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfUEFDS0FHRV9fUkVVU0VEX1BBQ0tBR0VTOgotCQkJZ2V0UmV1c2VkUGFja2FnZXMoKS5jbGVhcigpOwotCQkJZ2V0UmV1c2VkUGFja2FnZXMoKS5hZGRBbGwoCi0JCQkJCShDb2xsZWN0aW9uPD8gZXh0ZW5kcyBNZXRob2RQYWNrYWdlPikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1BBQ0tBR0VfX0NISUxEX1BBQ0tBR0VTOgotCQkJZ2V0Q2hpbGRQYWNrYWdlcygpLmNsZWFyKCk7Ci0JCQlnZXRDaGlsZFBhY2thZ2VzKCkuYWRkQWxsKAotCQkJCQkoQ29sbGVjdGlvbjw/IGV4dGVuZHMgTWV0aG9kUGFja2FnZT4pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfUEFDS0FHRV9fR0xPQkFMOgotCQkJc2V0R2xvYmFsKEdMT0JBTF9FREVGQVVMVCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfUEFDS0FHRV9fUkVVU0VEX1BBQ0tBR0VTOgotCQkJZ2V0UmV1c2VkUGFja2FnZXMoKS5jbGVhcigpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1BBQ0tBR0VfX0NISUxEX1BBQ0tBR0VTOgotCQkJZ2V0Q2hpbGRQYWNrYWdlcygpLmNsZWFyKCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJLy9VTUEtLT4KLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBnZXRGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZShmZWF0dXJlSUQpOwotCQlpZiAoZmVhdHVyZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gaXNGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZVNldChmZWF0dXJlKTsKLQkJfQotCQkvL1VNQTwtLQkJCi0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfUEFDS0FHRV9fR0xPQkFMOgotCQkJcmV0dXJuIEdMT0JBTF9FREVGQVVMVCA9PSBudWxsID8gZ2xvYmFsICE9IG51bGwgOiAhR0xPQkFMX0VERUZBVUxUCi0JCQkJCS5lcXVhbHMoZ2xvYmFsKTsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9QQUNLQUdFX19SRVVTRURfUEFDS0FHRVM6Ci0JCQlyZXR1cm4gcmV1c2VkUGFja2FnZXMgIT0gbnVsbCAmJiAhcmV1c2VkUGFja2FnZXMuaXNFbXB0eSgpOwotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1BBQ0tBR0VfX0NISUxEX1BBQ0tBR0VTOgotCQkJcmV0dXJuIGNoaWxkUGFja2FnZXMgIT0gbnVsbCAmJiAhY2hpbGRQYWNrYWdlcy5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKQotCQkJcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoZ2xvYmFsOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGdsb2JhbCk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGFja2FnZSNnZXRQYXJlbnRQYWNrYWdlKCkKLQkgKi8KLQlwdWJsaWMgTWV0aG9kUGFja2FnZSBnZXRQYXJlbnRQYWNrYWdlKCkgewotCQlFT2JqZWN0IHBhcmVudCA9IGVDb250YWluZXIoKTsKLQkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIE1ldGhvZFBhY2thZ2UpIHsKLQkJCXJldHVybiAoTWV0aG9kUGFja2FnZSkgcGFyZW50OwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotfSAvL01ldGhvZFBhY2thZ2VJbXBsCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvTWV0aG9kUGx1Z2luSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL01ldGhvZFBsdWdpbkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDAwOGUwMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvTWV0aG9kUGx1Z2luSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQ0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0UmVzb2x2aW5nRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+TWV0aG9kIFBsdWdpbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLk1ldGhvZFBsdWdpbkltcGwjZ2V0VXNlckNoYW5nZWFibGUgPGVtPlVzZXIgQ2hhbmdlYWJsZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLk1ldGhvZFBsdWdpbkltcGwjZ2V0TWV0aG9kUGFja2FnZXMgPGVtPk1ldGhvZCBQYWNrYWdlczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLk1ldGhvZFBsdWdpbkltcGwjZ2V0QmFzZXMgPGVtPkJhc2VzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuTWV0aG9kUGx1Z2luSW1wbCNpc1N1cHBvcnRpbmcgPGVtPlN1cHBvcnRpbmc8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXRob2RQbHVnaW5JbXBsIGV4dGVuZHMgTWV0aG9kVW5pdEltcGwgaW1wbGVtZW50cyBNZXRob2RQbHVnaW4gewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFVzZXJDaGFuZ2VhYmxlKCkgPGVtPlVzZXIgQ2hhbmdlYWJsZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VXNlckNoYW5nZWFibGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQm9vbGVhbiBVU0VSX0NIQU5HRUFCTEVfRURFRkFVTFQgPSBCb29sZWFuLlRSVUU7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRVc2VyQ2hhbmdlYWJsZSgpIDxlbT5Vc2VyIENoYW5nZWFibGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFVzZXJDaGFuZ2VhYmxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQm9vbGVhbiB1c2VyQ2hhbmdlYWJsZSA9IFVTRVJfQ0hBTkdFQUJMRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1ldGhvZFBhY2thZ2VzKCkgPGVtPk1ldGhvZCBQYWNrYWdlczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRNZXRob2RQYWNrYWdlcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PE1ldGhvZFBhY2thZ2U+IG1ldGhvZFBhY2thZ2VzOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QmFzZXMoKSA8ZW0+QmFzZXM8L2VtPn0nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QmFzZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxNZXRob2RQbHVnaW4+IGJhc2VzOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzU3VwcG9ydGluZygpIDxlbT5TdXBwb3J0aW5nPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1N1cHBvcnRpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBTVVBQT1JUSU5HX0VERUZBVUxUID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1N1cHBvcnRpbmcoKSA8ZW0+U3VwcG9ydGluZzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTdXBwb3J0aW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBzdXBwb3J0aW5nID0gU1VQUE9SVElOR19FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBNZXRob2RQbHVnaW5JbXBsKCkgewotCQlzdXBlcigpOwotCi0JCS8vVU1BLS0+Ci0JCXJlYXNzaWduRGVmYXVsdFZhbHVlcygpOwotCQkvL1VNQTwtLSAgCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLk1FVEhPRF9QTFVHSU47Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJvb2xlYW4gZ2V0VXNlckNoYW5nZWFibGUoKSB7Ci0JCXJldHVybiB1c2VyQ2hhbmdlYWJsZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRVc2VyQ2hhbmdlYWJsZShCb29sZWFuIG5ld1VzZXJDaGFuZ2VhYmxlKSB7Ci0JCUJvb2xlYW4gb2xkVXNlckNoYW5nZWFibGUgPSB1c2VyQ2hhbmdlYWJsZTsKLQkJdXNlckNoYW5nZWFibGUgPSBuZXdVc2VyQ2hhbmdlYWJsZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5NRVRIT0RfUExVR0lOX19VU0VSX0NIQU5HRUFCTEUsCi0JCQkJCW9sZFVzZXJDaGFuZ2VhYmxlLCB1c2VyQ2hhbmdlYWJsZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0PE1ldGhvZFBhY2thZ2U+IGdldE1ldGhvZFBhY2thZ2VzKCkgewotCQlpZiAobWV0aG9kUGFja2FnZXMgPT0gbnVsbCkgewotCQkJbWV0aG9kUGFja2FnZXMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QuUmVzb2x2aW5nPE1ldGhvZFBhY2thZ2U+KAotCQkJCQlNZXRob2RQYWNrYWdlLmNsYXNzLCB0aGlzLAotCQkJCQlVbWFQYWNrYWdlLk1FVEhPRF9QTFVHSU5fX01FVEhPRF9QQUNLQUdFUyk7Ci0JCX0KLQkJcmV0dXJuIG1ldGhvZFBhY2thZ2VzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0PE1ldGhvZFBsdWdpbj4gZ2V0QmFzZXMoKSB7Ci0JCWlmIChiYXNlcyA9PSBudWxsKSB7Ci0JCQliYXNlcyA9IG5ldyBFT2JqZWN0UmVzb2x2aW5nRUxpc3Q8TWV0aG9kUGx1Z2luPihNZXRob2RQbHVnaW4uY2xhc3MsCi0JCQkJCXRoaXMsIFVtYVBhY2thZ2UuTUVUSE9EX1BMVUdJTl9fQkFTRVMpOwotCQl9Ci0JCXJldHVybiBiYXNlczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1N1cHBvcnRpbmcoKSB7Ci0JCXJldHVybiBzdXBwb3J0aW5nOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFN1cHBvcnRpbmcoYm9vbGVhbiBuZXdTdXBwb3J0aW5nKSB7Ci0JCWJvb2xlYW4gb2xkU3VwcG9ydGluZyA9IHN1cHBvcnRpbmc7Ci0JCXN1cHBvcnRpbmcgPSBuZXdTdXBwb3J0aW5nOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLk1FVEhPRF9QTFVHSU5fX1NVUFBPUlRJTkcsIG9sZFN1cHBvcnRpbmcsCi0JCQkJCXN1cHBvcnRpbmcpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLAotCQkJaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1BMVUdJTl9fTUVUSE9EX1BBQ0tBR0VTOgotCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PikgZ2V0TWV0aG9kUGFja2FnZXMoKSkuYmFzaWNSZW1vdmUoCi0JCQkJCW90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1BMVUdJTl9fVVNFUl9DSEFOR0VBQkxFOgotCQkJcmV0dXJuIGdldFVzZXJDaGFuZ2VhYmxlKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfUExVR0lOX19NRVRIT0RfUEFDS0FHRVM6Ci0JCQlyZXR1cm4gZ2V0TWV0aG9kUGFja2FnZXMoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9QTFVHSU5fX0JBU0VTOgotCQkJcmV0dXJuIGdldEJhc2VzKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfUExVR0lOX19TVVBQT1JUSU5HOgotCQkJcmV0dXJuIGlzU3VwcG9ydGluZygpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1BMVUdJTl9fVVNFUl9DSEFOR0VBQkxFOgotCQkJc2V0VXNlckNoYW5nZWFibGUoKEJvb2xlYW4pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9QTFVHSU5fX01FVEhPRF9QQUNLQUdFUzoKLQkJCWdldE1ldGhvZFBhY2thZ2VzKCkuY2xlYXIoKTsKLQkJCWdldE1ldGhvZFBhY2thZ2VzKCkuYWRkQWxsKAotCQkJCQkoQ29sbGVjdGlvbjw/IGV4dGVuZHMgTWV0aG9kUGFja2FnZT4pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9QTFVHSU5fX0JBU0VTOgotCQkJZ2V0QmFzZXMoKS5jbGVhcigpOwotCQkJZ2V0QmFzZXMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIE1ldGhvZFBsdWdpbj4pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9QTFVHSU5fX1NVUFBPUlRJTkc6Ci0JCQlzZXRTdXBwb3J0aW5nKCgoQm9vbGVhbikgbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfUExVR0lOX19VU0VSX0NIQU5HRUFCTEU6Ci0JCQlzZXRVc2VyQ2hhbmdlYWJsZShVU0VSX0NIQU5HRUFCTEVfRURFRkFVTFQpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1BMVUdJTl9fTUVUSE9EX1BBQ0tBR0VTOgotCQkJZ2V0TWV0aG9kUGFja2FnZXMoKS5jbGVhcigpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1BMVUdJTl9fQkFTRVM6Ci0JCQlnZXRCYXNlcygpLmNsZWFyKCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfUExVR0lOX19TVVBQT1JUSU5HOgotCQkJc2V0U3VwcG9ydGluZyhTVVBQT1JUSU5HX0VERUZBVUxUKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQkvL1VNQS0tPgotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IGdldEZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlKGZlYXR1cmVJRCk7Ci0JCWlmIChmZWF0dXJlICE9IG51bGwpIHsKLQkJCXJldHVybiBpc0ZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlU2V0KGZlYXR1cmUpOwotCQl9Ci0JCS8vVU1BPC0tCQkKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9QTFVHSU5fX1VTRVJfQ0hBTkdFQUJMRToKLQkJCXJldHVybiBVU0VSX0NIQU5HRUFCTEVfRURFRkFVTFQgPT0gbnVsbCA/IHVzZXJDaGFuZ2VhYmxlICE9IG51bGwKLQkJCQkJOiAhVVNFUl9DSEFOR0VBQkxFX0VERUZBVUxULmVxdWFscyh1c2VyQ2hhbmdlYWJsZSk7Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfUExVR0lOX19NRVRIT0RfUEFDS0FHRVM6Ci0JCQlyZXR1cm4gbWV0aG9kUGFja2FnZXMgIT0gbnVsbCAmJiAhbWV0aG9kUGFja2FnZXMuaXNFbXB0eSgpOwotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1BMVUdJTl9fQkFTRVM6Ci0JCQlyZXR1cm4gYmFzZXMgIT0gbnVsbCAmJiAhYmFzZXMuaXNFbXB0eSgpOwotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1BMVUdJTl9fU1VQUE9SVElORzoKLQkJCXJldHVybiBzdXBwb3J0aW5nICE9IFNVUFBPUlRJTkdfRURFRkFVTFQ7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKQotCQkJcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAodXNlckNoYW5nZWFibGU6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQodXNlckNoYW5nZWFibGUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHN1cHBvcnRpbmc6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoc3VwcG9ydGluZyk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL01ldGhvZFBsdWdpbkltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9NZXRob2RVbml0SW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL01ldGhvZFVuaXRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0ZmRiZTAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL01ldGhvZFVuaXRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MzAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkRhdGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuU3VwcG9ydGluZ01hdGVyaWFsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk1ldGhvZCBVbml0PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuTWV0aG9kVW5pdEltcGwjZ2V0QXV0aG9ycyA8ZW0+QXV0aG9yczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLk1ldGhvZFVuaXRJbXBsI2dldENoYW5nZURhdGUgPGVtPkNoYW5nZSBEYXRlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuTWV0aG9kVW5pdEltcGwjZ2V0Q2hhbmdlRGVzY3JpcHRpb24gPGVtPkNoYW5nZSBEZXNjcmlwdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLk1ldGhvZFVuaXRJbXBsI2dldFZlcnNpb24gPGVtPlZlcnNpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5NZXRob2RVbml0SW1wbCNnZXRDb3B5cmlnaHRTdGF0ZW1lbnQgPGVtPkNvcHlyaWdodCBTdGF0ZW1lbnQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBNZXRob2RVbml0SW1wbCBleHRlbmRzIE1ldGhvZEVsZW1lbnRJbXBsIGltcGxlbWVudHMKLQkJTWV0aG9kVW5pdCB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QXV0aG9ycygpIDxlbT5BdXRob3JzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBdXRob3JzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBBVVRIT1JTX0VERUZBVUxUID0gIiI7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBdXRob3JzKCkgPGVtPkF1dGhvcnM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEF1dGhvcnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgYXV0aG9ycyA9IEFVVEhPUlNfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q2hhbmdlRGF0ZSgpIDxlbT5DaGFuZ2UgRGF0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q2hhbmdlRGF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBEYXRlIENIQU5HRV9EQVRFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENoYW5nZURhdGUoKSA8ZW0+Q2hhbmdlIERhdGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENoYW5nZURhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBEYXRlIGNoYW5nZURhdGUgPSBDSEFOR0VfREFURV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDaGFuZ2VEZXNjcmlwdGlvbigpIDxlbT5DaGFuZ2UgRGVzY3JpcHRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENoYW5nZURlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBDSEFOR0VfREVTQ1JJUFRJT05fRURFRkFVTFQgPSAiIjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENoYW5nZURlc2NyaXB0aW9uKCkgPGVtPkNoYW5nZSBEZXNjcmlwdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q2hhbmdlRGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgY2hhbmdlRGVzY3JpcHRpb24gPSBDSEFOR0VfREVTQ1JJUFRJT05fRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmVyc2lvbigpIDxlbT5WZXJzaW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRWZXJzaW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBWRVJTSU9OX0VERUZBVUxUID0gIiI7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWZXJzaW9uKCkgPGVtPlZlcnNpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFZlcnNpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgdmVyc2lvbiA9IFZFUlNJT05fRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb3B5cmlnaHRTdGF0ZW1lbnQoKSA8ZW0+Q29weXJpZ2h0IFN0YXRlbWVudDwvZW0+fScgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q29weXJpZ2h0U3RhdGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3VwcG9ydGluZ01hdGVyaWFsIGNvcHlyaWdodFN0YXRlbWVudDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBNZXRob2RVbml0SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQotCQkvL1VNQS0tPgotCQlyZWFzc2lnbkRlZmF1bHRWYWx1ZXMoKTsKLQkJLy9VTUE8LS0gIAotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5NRVRIT0RfVU5JVDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEF1dGhvcnMoKSB7Ci0JCXJldHVybiBhdXRob3JzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEF1dGhvcnMoU3RyaW5nIG5ld0F1dGhvcnMpIHsKLQkJU3RyaW5nIG9sZEF1dGhvcnMgPSBhdXRob3JzOwotCQlhdXRob3JzID0gbmV3QXV0aG9yczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5NRVRIT0RfVU5JVF9fQVVUSE9SUywgb2xkQXV0aG9ycywgYXV0aG9ycykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEYXRlIGdldENoYW5nZURhdGUoKSB7Ci0JCXJldHVybiBjaGFuZ2VEYXRlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENoYW5nZURhdGUoRGF0ZSBuZXdDaGFuZ2VEYXRlKSB7Ci0JCURhdGUgb2xkQ2hhbmdlRGF0ZSA9IGNoYW5nZURhdGU7Ci0JCWNoYW5nZURhdGUgPSBuZXdDaGFuZ2VEYXRlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLk1FVEhPRF9VTklUX19DSEFOR0VfREFURSwgb2xkQ2hhbmdlRGF0ZSwKLQkJCQkJY2hhbmdlRGF0ZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q2hhbmdlRGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBjaGFuZ2VEZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDaGFuZ2VEZXNjcmlwdGlvbihTdHJpbmcgbmV3Q2hhbmdlRGVzY3JpcHRpb24pIHsKLQkJU3RyaW5nIG9sZENoYW5nZURlc2NyaXB0aW9uID0gY2hhbmdlRGVzY3JpcHRpb247Ci0JCWNoYW5nZURlc2NyaXB0aW9uID0gbmV3Q2hhbmdlRGVzY3JpcHRpb247Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuTUVUSE9EX1VOSVRfX0NIQU5HRV9ERVNDUklQVElPTiwKLQkJCQkJb2xkQ2hhbmdlRGVzY3JpcHRpb24sIGNoYW5nZURlc2NyaXB0aW9uKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRWZXJzaW9uKCkgewotCQlyZXR1cm4gdmVyc2lvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWZXJzaW9uKFN0cmluZyBuZXdWZXJzaW9uKSB7Ci0JCVN0cmluZyBvbGRWZXJzaW9uID0gdmVyc2lvbjsKLQkJdmVyc2lvbiA9IG5ld1ZlcnNpb247Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuTUVUSE9EX1VOSVRfX1ZFUlNJT04sIG9sZFZlcnNpb24sIHZlcnNpb24pKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3VwcG9ydGluZ01hdGVyaWFsIGdldENvcHlyaWdodFN0YXRlbWVudCgpIHsKLQkJaWYgKGNvcHlyaWdodFN0YXRlbWVudCAhPSBudWxsCi0JCQkJJiYgKChFT2JqZWN0KSBjb3B5cmlnaHRTdGF0ZW1lbnQpLmVJc1Byb3h5KCkpIHsKLQkJCUludGVybmFsRU9iamVjdCBvbGRDb3B5cmlnaHRTdGF0ZW1lbnQgPSAoSW50ZXJuYWxFT2JqZWN0KSBjb3B5cmlnaHRTdGF0ZW1lbnQ7Ci0JCQljb3B5cmlnaHRTdGF0ZW1lbnQgPSAoU3VwcG9ydGluZ01hdGVyaWFsKSBlUmVzb2x2ZVByb3h5KG9sZENvcHlyaWdodFN0YXRlbWVudCk7Ci0JCQlpZiAoY29weXJpZ2h0U3RhdGVtZW50ICE9IG9sZENvcHlyaWdodFN0YXRlbWVudCkgewotCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlJFU09MVkUsCi0JCQkJCQkJVW1hUGFja2FnZS5NRVRIT0RfVU5JVF9fQ09QWVJJR0hUX1NUQVRFTUVOVCwKLQkJCQkJCQlvbGRDb3B5cmlnaHRTdGF0ZW1lbnQsIGNvcHlyaWdodFN0YXRlbWVudCkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBjb3B5cmlnaHRTdGF0ZW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN1cHBvcnRpbmdNYXRlcmlhbCBiYXNpY0dldENvcHlyaWdodFN0YXRlbWVudCgpIHsKLQkJcmV0dXJuIGNvcHlyaWdodFN0YXRlbWVudDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb3B5cmlnaHRTdGF0ZW1lbnQoU3VwcG9ydGluZ01hdGVyaWFsIG5ld0NvcHlyaWdodFN0YXRlbWVudCkgewotCQlTdXBwb3J0aW5nTWF0ZXJpYWwgb2xkQ29weXJpZ2h0U3RhdGVtZW50ID0gY29weXJpZ2h0U3RhdGVtZW50OwotCQljb3B5cmlnaHRTdGF0ZW1lbnQgPSBuZXdDb3B5cmlnaHRTdGF0ZW1lbnQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuTUVUSE9EX1VOSVRfX0NPUFlSSUdIVF9TVEFURU1FTlQsCi0JCQkJCW9sZENvcHlyaWdodFN0YXRlbWVudCwgY29weXJpZ2h0U3RhdGVtZW50KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1VOSVRfX0FVVEhPUlM6Ci0JCQlyZXR1cm4gZ2V0QXV0aG9ycygpOwotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1VOSVRfX0NIQU5HRV9EQVRFOgotCQkJcmV0dXJuIGdldENoYW5nZURhdGUoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9VTklUX19DSEFOR0VfREVTQ1JJUFRJT046Ci0JCQlyZXR1cm4gZ2V0Q2hhbmdlRGVzY3JpcHRpb24oKTsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9VTklUX19WRVJTSU9OOgotCQkJcmV0dXJuIGdldFZlcnNpb24oKTsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9VTklUX19DT1BZUklHSFRfU1RBVEVNRU5UOgotCQkJaWYgKHJlc29sdmUpCi0JCQkJcmV0dXJuIGdldENvcHlyaWdodFN0YXRlbWVudCgpOwotCQkJcmV0dXJuIGJhc2ljR2V0Q29weXJpZ2h0U3RhdGVtZW50KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9VTklUX19BVVRIT1JTOgotCQkJc2V0QXV0aG9ycygoU3RyaW5nKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfVU5JVF9fQ0hBTkdFX0RBVEU6Ci0JCQlzZXRDaGFuZ2VEYXRlKChEYXRlKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfVU5JVF9fQ0hBTkdFX0RFU0NSSVBUSU9OOgotCQkJc2V0Q2hhbmdlRGVzY3JpcHRpb24oKFN0cmluZykgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1VOSVRfX1ZFUlNJT046Ci0JCQlzZXRWZXJzaW9uKChTdHJpbmcpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9VTklUX19DT1BZUklHSFRfU1RBVEVNRU5UOgotCQkJc2V0Q29weXJpZ2h0U3RhdGVtZW50KChTdXBwb3J0aW5nTWF0ZXJpYWwpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfVU5JVF9fQVVUSE9SUzoKLQkJCXNldEF1dGhvcnMoQVVUSE9SU19FREVGQVVMVCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfVU5JVF9fQ0hBTkdFX0RBVEU6Ci0JCQlzZXRDaGFuZ2VEYXRlKENIQU5HRV9EQVRFX0VERUZBVUxUKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9VTklUX19DSEFOR0VfREVTQ1JJUFRJT046Ci0JCQlzZXRDaGFuZ2VEZXNjcmlwdGlvbihDSEFOR0VfREVTQ1JJUFRJT05fRURFRkFVTFQpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1VOSVRfX1ZFUlNJT046Ci0JCQlzZXRWZXJzaW9uKFZFUlNJT05fRURFRkFVTFQpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1VOSVRfX0NPUFlSSUdIVF9TVEFURU1FTlQ6Ci0JCQlzZXRDb3B5cmlnaHRTdGF0ZW1lbnQoKFN1cHBvcnRpbmdNYXRlcmlhbCkgbnVsbCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJLy9VTUEtLT4KLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBnZXRGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZShmZWF0dXJlSUQpOwotCQlpZiAoZmVhdHVyZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gaXNGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZVNldChmZWF0dXJlKTsKLQkJfQotCQkvL1VNQTwtLQkJCi0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfVU5JVF9fQVVUSE9SUzoKLQkJCXJldHVybiBBVVRIT1JTX0VERUZBVUxUID09IG51bGwgPyBhdXRob3JzICE9IG51bGwKLQkJCQkJOiAhQVVUSE9SU19FREVGQVVMVC5lcXVhbHMoYXV0aG9ycyk7Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfVU5JVF9fQ0hBTkdFX0RBVEU6Ci0JCQlyZXR1cm4gQ0hBTkdFX0RBVEVfRURFRkFVTFQgPT0gbnVsbCA/IGNoYW5nZURhdGUgIT0gbnVsbAotCQkJCQk6ICFDSEFOR0VfREFURV9FREVGQVVMVC5lcXVhbHMoY2hhbmdlRGF0ZSk7Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfVU5JVF9fQ0hBTkdFX0RFU0NSSVBUSU9OOgotCQkJcmV0dXJuIENIQU5HRV9ERVNDUklQVElPTl9FREVGQVVMVCA9PSBudWxsID8gY2hhbmdlRGVzY3JpcHRpb24gIT0gbnVsbAotCQkJCQk6ICFDSEFOR0VfREVTQ1JJUFRJT05fRURFRkFVTFQuZXF1YWxzKGNoYW5nZURlc2NyaXB0aW9uKTsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9VTklUX19WRVJTSU9OOgotCQkJcmV0dXJuIFZFUlNJT05fRURFRkFVTFQgPT0gbnVsbCA/IHZlcnNpb24gIT0gbnVsbAotCQkJCQk6ICFWRVJTSU9OX0VERUZBVUxULmVxdWFscyh2ZXJzaW9uKTsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9VTklUX19DT1BZUklHSFRfU1RBVEVNRU5UOgotCQkJcmV0dXJuIGNvcHlyaWdodFN0YXRlbWVudCAhPSBudWxsOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkKLQkJCXJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGF1dGhvcnM6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoYXV0aG9ycyk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgY2hhbmdlRGF0ZTogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChjaGFuZ2VEYXRlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBjaGFuZ2VEZXNjcmlwdGlvbjogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChjaGFuZ2VEZXNjcmlwdGlvbik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgdmVyc2lvbjogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZCh2ZXJzaW9uKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vTWV0aG9kVW5pdEltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9NaWxlc3RvbmVJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvTWlsZXN0b25lSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYTJhYzcxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9NaWxlc3RvbmVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0UmVzb2x2aW5nRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NaWxlc3RvbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+TWlsZXN0b25lPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuTWlsZXN0b25lSW1wbCNnZXRSZXF1aXJlZFJlc3VsdHMgPGVtPlJlcXVpcmVkIFJlc3VsdHM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBNaWxlc3RvbmVJbXBsIGV4dGVuZHMgV29ya0JyZWFrZG93bkVsZW1lbnRJbXBsIGltcGxlbWVudHMKLQkJTWlsZXN0b25lIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlcXVpcmVkUmVzdWx0cygpIDxlbT5SZXF1aXJlZCBSZXN1bHRzPC9lbT59JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJlcXVpcmVkUmVzdWx0cygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PFdvcmtQcm9kdWN0RGVzY3JpcHRvcj4gcmVxdWlyZWRSZXN1bHRzOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE1pbGVzdG9uZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJLy9VTUEtLT4KLQkJcmVhc3NpZ25EZWZhdWx0VmFsdWVzKCk7Ci0JCS8vVU1BPC0tICAKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuTUlMRVNUT05FOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0PFdvcmtQcm9kdWN0RGVzY3JpcHRvcj4gZ2V0UmVxdWlyZWRSZXN1bHRzKCkgewotCQlpZiAocmVxdWlyZWRSZXN1bHRzID09IG51bGwpIHsKLQkJCXJlcXVpcmVkUmVzdWx0cyA9IG5ldyBFT2JqZWN0UmVzb2x2aW5nRUxpc3Q8V29ya1Byb2R1Y3REZXNjcmlwdG9yPigKLQkJCQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yLmNsYXNzLCB0aGlzLAotCQkJCQlVbWFQYWNrYWdlLk1JTEVTVE9ORV9fUkVRVUlSRURfUkVTVUxUUyk7Ci0JCX0KLQkJcmV0dXJuIHJlcXVpcmVkUmVzdWx0czsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5NSUxFU1RPTkVfX1JFUVVJUkVEX1JFU1VMVFM6Ci0JCQlyZXR1cm4gZ2V0UmVxdWlyZWRSZXN1bHRzKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLk1JTEVTVE9ORV9fUkVRVUlSRURfUkVTVUxUUzoKLQkJCWdldFJlcXVpcmVkUmVzdWx0cygpLmNsZWFyKCk7Ci0JCQlnZXRSZXF1aXJlZFJlc3VsdHMoKS5hZGRBbGwoCi0JCQkJCShDb2xsZWN0aW9uPD8gZXh0ZW5kcyBXb3JrUHJvZHVjdERlc2NyaXB0b3I+KSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuTUlMRVNUT05FX19SRVFVSVJFRF9SRVNVTFRTOgotCQkJZ2V0UmVxdWlyZWRSZXN1bHRzKCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQkvL1VNQS0tPgotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IGdldEZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlKGZlYXR1cmVJRCk7Ci0JCWlmIChmZWF0dXJlICE9IG51bGwpIHsKLQkJCXJldHVybiBpc0ZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlU2V0KGZlYXR1cmUpOwotCQl9Ci0JCS8vVU1BPC0tCQkKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLk1JTEVTVE9ORV9fUkVRVUlSRURfUkVTVUxUUzoKLQkJCXJldHVybiByZXF1aXJlZFJlc3VsdHMgIT0gbnVsbCAmJiAhcmVxdWlyZWRSZXN1bHRzLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi19IC8vTWlsZXN0b25lSW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL05hbWVkRWxlbWVudEltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9OYW1lZEVsZW1lbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5ODhiNmYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL05hbWVkRWxlbWVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTmFtZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk5hbWVkIEVsZW1lbnQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5OYW1lZEVsZW1lbnRJbXBsI2dldE5hbWUgPGVtPk5hbWU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBOYW1lZEVsZW1lbnRJbXBsIGV4dGVuZHMgRWxlbWVudEltcGwgaW1wbGVtZW50cwotCQlOYW1lZEVsZW1lbnQgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWUoKSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9FREVGQVVMVCA9ICIiOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZSgpIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIG5hbWUgPSBOQU1FX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE5hbWVkRWxlbWVudEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJLy9VTUEtLT4KLQkJcmVhc3NpZ25EZWZhdWx0VmFsdWVzKCk7Ci0JCS8vVU1BPC0tICAKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuTkFNRURfRUxFTUVOVDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBuYW1lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5ld05hbWUpIHsKLQkJU3RyaW5nIG9sZE5hbWUgPSBuYW1lOwotCQluYW1lID0gbmV3TmFtZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5OQU1FRF9FTEVNRU5UX19OQU1FLCBvbGROYW1lLCBuYW1lKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuTkFNRURfRUxFTUVOVF9fTkFNRToKLQkJCXJldHVybiBnZXROYW1lKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLk5BTUVEX0VMRU1FTlRfX05BTUU6Ci0JCQlzZXROYW1lKChTdHJpbmcpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5OQU1FRF9FTEVNRU5UX19OQU1FOgotCQkJc2V0TmFtZShOQU1FX0VERUZBVUxUKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQkvL1VNQS0tPgotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IGdldEZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlKGZlYXR1cmVJRCk7Ci0JCWlmIChmZWF0dXJlICE9IG51bGwpIHsKLQkJCXJldHVybiBpc0ZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlU2V0KGZlYXR1cmUpOwotCQl9Ci0JCS8vVU1BPC0tCQkKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLk5BTUVEX0VMRU1FTlRfX05BTUU6Ci0JCQlyZXR1cm4gTkFNRV9FREVGQVVMVCA9PSBudWxsID8gbmFtZSAhPSBudWxsIDogIU5BTUVfRURFRkFVTFQKLQkJCQkJLmVxdWFscyhuYW1lKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpCi0JCQlyZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChuYW1lOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKG5hbWUpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9OYW1lZEVsZW1lbnRJbXBsCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvTmFtZXNwYWNlSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL05hbWVzcGFjZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTBmZWJmYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvTmFtZXNwYWNlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5OYW1lc3BhY2U8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBOYW1lc3BhY2VJbXBsIGV4dGVuZHMgTmFtZWRFbGVtZW50SW1wbCBpbXBsZW1lbnRzCi0JCU5hbWVzcGFjZSB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTmFtZXNwYWNlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQotCQkvL1VNQS0tPgotCQlyZWFzc2lnbkRlZmF1bHRWYWx1ZXMoKTsKLQkJLy9VTUE8LS0gIAotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5OQU1FU1BBQ0U7Ci0JfQotCi19IC8vTmFtZXNwYWNlSW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL091dGNvbWVJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvT3V0Y29tZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWMzNzQ0OC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvT3V0Y29tZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5PdXRjb21lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk91dGNvbWU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBPdXRjb21lSW1wbCBleHRlbmRzIFdvcmtQcm9kdWN0SW1wbCBpbXBsZW1lbnRzIE91dGNvbWUgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE91dGNvbWVJbXBsKCkgewotCQlzdXBlcigpOwotCi0JCS8vVU1BLS0+Ci0JCXJlYXNzaWduRGVmYXVsdFZhbHVlcygpOwotCQkvL1VNQTwtLSAgCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLk9VVENPTUU7Ci0JfQotCi19IC8vT3V0Y29tZUltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9QYWNrYWdlSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1BhY2thZ2VJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhYjg2NWMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1BhY2thZ2VJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlBhY2thZ2U8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBQYWNrYWdlSW1wbCBleHRlbmRzIE5hbWVzcGFjZUltcGwgaW1wbGVtZW50cwotCQlvcmcuZWNsaXBzZS5lcGYudW1hLlBhY2thZ2UgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFBhY2thZ2VJbXBsKCkgewotCQlzdXBlcigpOwotCi0JCS8vVU1BLS0+Ci0JCXJlYXNzaWduRGVmYXVsdFZhbHVlcygpOwotCQkvL1VNQTwtLSAgCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLlBBQ0tBR0U7Ci0JfQotCi19IC8vUGFja2FnZUltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9QYWNrYWdlYWJsZUVsZW1lbnRJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvUGFja2FnZWFibGVFbGVtZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZDkwNDUxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9QYWNrYWdlYWJsZUVsZW1lbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUGFja2FnZWFibGVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlBhY2thZ2VhYmxlIEVsZW1lbnQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBQYWNrYWdlYWJsZUVsZW1lbnRJbXBsIGV4dGVuZHMgTmFtZWRFbGVtZW50SW1wbCBpbXBsZW1lbnRzCi0JCVBhY2thZ2VhYmxlRWxlbWVudCB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUGFja2FnZWFibGVFbGVtZW50SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQotCQkvL1VNQS0tPgotCQlyZWFzc2lnbkRlZmF1bHRWYWx1ZXMoKTsKLQkJLy9VTUE8LS0gIAotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5QQUNLQUdFQUJMRV9FTEVNRU5UOwotCX0KLQotfSAvL1BhY2thZ2VhYmxlRWxlbWVudEltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9QaGFzZUltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9QaGFzZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmRhMWM0OS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvUGhhc2VJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUGhhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UGhhc2U8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBQaGFzZUltcGwgZXh0ZW5kcyBBY3Rpdml0eUltcGwgaW1wbGVtZW50cyBQaGFzZSB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUGhhc2VJbXBsKCkgewotCQlzdXBlcigpOwotCi0JCS8vVU1BLS0+Ci0JCXJlYXNzaWduRGVmYXVsdFZhbHVlcygpOwotCQkvL1VNQTwtLSAgCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLlBIQVNFOwotCX0KLQotfSAvL1BoYXNlSW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1BsYW5uaW5nRGF0YUltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9QbGFubmluZ0RhdGFJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyNTU5ZDkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1BsYW5uaW5nRGF0YUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwNCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5QbGFubmluZ0RhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UGxhbm5pbmcgRGF0YTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlBsYW5uaW5nRGF0YUltcGwjZ2V0U3RhcnREYXRlIDxlbT5TdGFydCBEYXRlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUGxhbm5pbmdEYXRhSW1wbCNnZXRGaW5pc2hEYXRlIDxlbT5GaW5pc2ggRGF0ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlBsYW5uaW5nRGF0YUltcGwjZ2V0UmFuayA8ZW0+UmFuazwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFBsYW5uaW5nRGF0YUltcGwgZXh0ZW5kcyBQcm9jZXNzRWxlbWVudEltcGwgaW1wbGVtZW50cwotCQlQbGFubmluZ0RhdGEgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFN0YXJ0RGF0ZSgpIDxlbT5TdGFydCBEYXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTdGFydERhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgRGF0ZSBTVEFSVF9EQVRFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFN0YXJ0RGF0ZSgpIDxlbT5TdGFydCBEYXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTdGFydERhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBEYXRlIHN0YXJ0RGF0ZSA9IFNUQVJUX0RBVEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RmluaXNoRGF0ZSgpIDxlbT5GaW5pc2ggRGF0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RmluaXNoRGF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBEYXRlIEZJTklTSF9EQVRFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEZpbmlzaERhdGUoKSA8ZW0+RmluaXNoIERhdGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEZpbmlzaERhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBEYXRlIGZpbmlzaERhdGUgPSBGSU5JU0hfREFURV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSYW5rKCkgPGVtPlJhbms8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJhbmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IFJBTktfRURFRkFVTFQgPSAwOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmFuaygpIDxlbT5SYW5rPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSYW5rKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgaW50IHJhbmsgPSBSQU5LX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFBsYW5uaW5nRGF0YUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJLy9VTUEtLT4KLQkJcmVhc3NpZ25EZWZhdWx0VmFsdWVzKCk7Ci0JCS8vVU1BPC0tICAKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuUExBTk5JTkdfREFUQTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRGF0ZSBnZXRTdGFydERhdGUoKSB7Ci0JCXJldHVybiBzdGFydERhdGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0U3RhcnREYXRlKERhdGUgbmV3U3RhcnREYXRlKSB7Ci0JCURhdGUgb2xkU3RhcnREYXRlID0gc3RhcnREYXRlOwotCQlzdGFydERhdGUgPSBuZXdTdGFydERhdGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuUExBTk5JTkdfREFUQV9fU1RBUlRfREFURSwgb2xkU3RhcnREYXRlLAotCQkJCQlzdGFydERhdGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRGF0ZSBnZXRGaW5pc2hEYXRlKCkgewotCQlyZXR1cm4gZmluaXNoRGF0ZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGaW5pc2hEYXRlKERhdGUgbmV3RmluaXNoRGF0ZSkgewotCQlEYXRlIG9sZEZpbmlzaERhdGUgPSBmaW5pc2hEYXRlOwotCQlmaW5pc2hEYXRlID0gbmV3RmluaXNoRGF0ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5QTEFOTklOR19EQVRBX19GSU5JU0hfREFURSwgb2xkRmluaXNoRGF0ZSwKLQkJCQkJZmluaXNoRGF0ZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0UmFuaygpIHsKLQkJcmV0dXJuIHJhbms7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmFuayhpbnQgbmV3UmFuaykgewotCQlpbnQgb2xkUmFuayA9IHJhbms7Ci0JCXJhbmsgPSBuZXdSYW5rOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLlBMQU5OSU5HX0RBVEFfX1JBTkssIG9sZFJhbmssIHJhbmspKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5QTEFOTklOR19EQVRBX19TVEFSVF9EQVRFOgotCQkJcmV0dXJuIGdldFN0YXJ0RGF0ZSgpOwotCQljYXNlIFVtYVBhY2thZ2UuUExBTk5JTkdfREFUQV9fRklOSVNIX0RBVEU6Ci0JCQlyZXR1cm4gZ2V0RmluaXNoRGF0ZSgpOwotCQljYXNlIFVtYVBhY2thZ2UuUExBTk5JTkdfREFUQV9fUkFOSzoKLQkJCXJldHVybiBuZXcgSW50ZWdlcihnZXRSYW5rKCkpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5QTEFOTklOR19EQVRBX19TVEFSVF9EQVRFOgotCQkJc2V0U3RhcnREYXRlKChEYXRlKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5QTEFOTklOR19EQVRBX19GSU5JU0hfREFURToKLQkJCXNldEZpbmlzaERhdGUoKERhdGUpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlBMQU5OSU5HX0RBVEFfX1JBTks6Ci0JCQlzZXRSYW5rKCgoSW50ZWdlcikgbmV3VmFsdWUpLmludFZhbHVlKCkpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlBMQU5OSU5HX0RBVEFfX1NUQVJUX0RBVEU6Ci0JCQlzZXRTdGFydERhdGUoU1RBUlRfREFURV9FREVGQVVMVCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5QTEFOTklOR19EQVRBX19GSU5JU0hfREFURToKLQkJCXNldEZpbmlzaERhdGUoRklOSVNIX0RBVEVfRURFRkFVTFQpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuUExBTk5JTkdfREFUQV9fUkFOSzoKLQkJCXNldFJhbmsoUkFOS19FREVGQVVMVCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJLy9VTUEtLT4KLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBnZXRGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZShmZWF0dXJlSUQpOwotCQlpZiAoZmVhdHVyZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gaXNGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZVNldChmZWF0dXJlKTsKLQkJfQotCQkvL1VNQTwtLQkJCi0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5QTEFOTklOR19EQVRBX19TVEFSVF9EQVRFOgotCQkJcmV0dXJuIFNUQVJUX0RBVEVfRURFRkFVTFQgPT0gbnVsbCA/IHN0YXJ0RGF0ZSAhPSBudWxsCi0JCQkJCTogIVNUQVJUX0RBVEVfRURFRkFVTFQuZXF1YWxzKHN0YXJ0RGF0ZSk7Ci0JCWNhc2UgVW1hUGFja2FnZS5QTEFOTklOR19EQVRBX19GSU5JU0hfREFURToKLQkJCXJldHVybiBGSU5JU0hfREFURV9FREVGQVVMVCA9PSBudWxsID8gZmluaXNoRGF0ZSAhPSBudWxsCi0JCQkJCTogIUZJTklTSF9EQVRFX0VERUZBVUxULmVxdWFscyhmaW5pc2hEYXRlKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlBMQU5OSU5HX0RBVEFfX1JBTks6Ci0JCQlyZXR1cm4gcmFuayAhPSBSQU5LX0VERUZBVUxUOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkKLQkJCXJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHN0YXJ0RGF0ZTogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChzdGFydERhdGUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGZpbmlzaERhdGU6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoZmluaXNoRGF0ZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcmFuazogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChyYW5rKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vUGxhbm5pbmdEYXRhSW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1BvaW50SW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1BvaW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NWZhMmIzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Qb2ludEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUuaW1wbC5NdWx0aVJlc291cmNlRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlBvaW50PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUG9pbnRJbXBsI2dldFggPGVtPlg8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Qb2ludEltcGwjZ2V0WSA8ZW0+WTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFBvaW50SW1wbCBleHRlbmRzIE11bHRpUmVzb3VyY2VFT2JqZWN0IGltcGxlbWVudHMgUG9pbnQgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFgoKSA8ZW0+WDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0WCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBEb3VibGUgWF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRYKCkgPGVtPlg8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFgoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBEb3VibGUgeCA9IFhfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0WSgpIDxlbT5ZPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRZKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIERvdWJsZSBZX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFkoKSA8ZW0+WTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0WSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIERvdWJsZSB5ID0gWV9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBQb2ludEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJLy9VTUEtLT4KLQkJcmVhc3NpZ25EZWZhdWx0VmFsdWVzKCk7Ci0JCS8vVU1BPC0tICAKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuUE9JTlQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERvdWJsZSBnZXRYKCkgewotCQlyZXR1cm4geDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRYKERvdWJsZSBuZXdYKSB7Ci0JCURvdWJsZSBvbGRYID0geDsKLQkJeCA9IG5ld1g7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuUE9JTlRfX1gsIG9sZFgsIHgpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRG91YmxlIGdldFkoKSB7Ci0JCXJldHVybiB5OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFkoRG91YmxlIG5ld1kpIHsKLQkJRG91YmxlIG9sZFkgPSB5OwotCQl5ID0gbmV3WTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5QT0lOVF9fWSwgb2xkWSwgeSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlBPSU5UX19YOgotCQkJcmV0dXJuIGdldFgoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlBPSU5UX19ZOgotCQkJcmV0dXJuIGdldFkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuUE9JTlRfX1g6Ci0JCQlzZXRYKChEb3VibGUpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlBPSU5UX19ZOgotCQkJc2V0WSgoRG91YmxlKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuUE9JTlRfX1g6Ci0JCQlzZXRYKFhfRURFRkFVTFQpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuUE9JTlRfX1k6Ci0JCQlzZXRZKFlfRURFRkFVTFQpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCS8vVU1BLS0+Ci0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gZ2V0RmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWUoZmVhdHVyZUlEKTsKLQkJaWYgKGZlYXR1cmUgIT0gbnVsbCkgewotCQkJcmV0dXJuIGlzRmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWVTZXQoZmVhdHVyZSk7Ci0JCX0KLQkJLy9VTUE8LS0JCQotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuUE9JTlRfX1g6Ci0JCQlyZXR1cm4gWF9FREVGQVVMVCA9PSBudWxsID8geCAhPSBudWxsIDogIVhfRURFRkFVTFQuZXF1YWxzKHgpOwotCQljYXNlIFVtYVBhY2thZ2UuUE9JTlRfX1k6Ci0JCQlyZXR1cm4gWV9FREVGQVVMVCA9PSBudWxsID8geSAhPSBudWxsIDogIVlfRURFRkFVTFQuZXF1YWxzKHkpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkKLQkJCXJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHg6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoeCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgeTogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZCh5KTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vUG9pbnRJbXBsCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvUG9seWxpbmVJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvUG9seWxpbmVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkNmM1YzcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1BvbHlsaW5lSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQ5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qb2x5bGluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Qb2x5bGluZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlBvbHlsaW5lSW1wbCNnZXRDbG9zZWQgPGVtPkNsb3NlZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlBvbHlsaW5lSW1wbCNnZXRXYXlwb2ludHMgPGVtPldheXBvaW50czwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFBvbHlsaW5lSW1wbCBleHRlbmRzIEdyYXBoaWNQcmltaXRpdmVJbXBsIGltcGxlbWVudHMgUG9seWxpbmUgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENsb3NlZCgpIDxlbT5DbG9zZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENsb3NlZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCb29sZWFuIENMT1NFRF9FREVGQVVMVCA9IEJvb2xlYW4uVFJVRTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENsb3NlZCgpIDxlbT5DbG9zZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENsb3NlZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJvb2xlYW4gY2xvc2VkID0gQ0xPU0VEX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0V2F5cG9pbnRzKCkgPGVtPldheXBvaW50czwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRXYXlwb2ludHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxQb2ludD4gd2F5cG9pbnRzOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFBvbHlsaW5lSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQotCQkvL1VNQS0tPgotCQlyZWFzc2lnbkRlZmF1bHRWYWx1ZXMoKTsKLQkJLy9VTUE8LS0gIAotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5QT0xZTElORTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQm9vbGVhbiBnZXRDbG9zZWQoKSB7Ci0JCXJldHVybiBjbG9zZWQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q2xvc2VkKEJvb2xlYW4gbmV3Q2xvc2VkKSB7Ci0JCUJvb2xlYW4gb2xkQ2xvc2VkID0gY2xvc2VkOwotCQljbG9zZWQgPSBuZXdDbG9zZWQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuUE9MWUxJTkVfX0NMT1NFRCwgb2xkQ2xvc2VkLCBjbG9zZWQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdDxQb2ludD4gZ2V0V2F5cG9pbnRzKCkgewotCQlpZiAod2F5cG9pbnRzID09IG51bGwpIHsKLQkJCXdheXBvaW50cyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdC5SZXNvbHZpbmc8UG9pbnQ+KAotCQkJCQlQb2ludC5jbGFzcywgdGhpcywgVW1hUGFja2FnZS5QT0xZTElORV9fV0FZUE9JTlRTKTsKLQkJfQotCQlyZXR1cm4gd2F5cG9pbnRzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsCi0JCQlpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5QT0xZTElORV9fV0FZUE9JTlRTOgotCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PikgZ2V0V2F5cG9pbnRzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLAotCQkJCQltc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuUE9MWUxJTkVfX0NMT1NFRDoKLQkJCXJldHVybiBnZXRDbG9zZWQoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlBPTFlMSU5FX19XQVlQT0lOVFM6Ci0JCQlyZXR1cm4gZ2V0V2F5cG9pbnRzKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlBPTFlMSU5FX19DTE9TRUQ6Ci0JCQlzZXRDbG9zZWQoKEJvb2xlYW4pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlBPTFlMSU5FX19XQVlQT0lOVFM6Ci0JCQlnZXRXYXlwb2ludHMoKS5jbGVhcigpOwotCQkJZ2V0V2F5cG9pbnRzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBQb2ludD4pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5QT0xZTElORV9fQ0xPU0VEOgotCQkJc2V0Q2xvc2VkKENMT1NFRF9FREVGQVVMVCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5QT0xZTElORV9fV0FZUE9JTlRTOgotCQkJZ2V0V2F5cG9pbnRzKCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQkvL1VNQS0tPgotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IGdldEZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlKGZlYXR1cmVJRCk7Ci0JCWlmIChmZWF0dXJlICE9IG51bGwpIHsKLQkJCXJldHVybiBpc0ZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlU2V0KGZlYXR1cmUpOwotCQl9Ci0JCS8vVU1BPC0tCQkKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlBPTFlMSU5FX19DTE9TRUQ6Ci0JCQlyZXR1cm4gQ0xPU0VEX0VERUZBVUxUID09IG51bGwgPyBjbG9zZWQgIT0gbnVsbCA6ICFDTE9TRURfRURFRkFVTFQKLQkJCQkJLmVxdWFscyhjbG9zZWQpOwotCQljYXNlIFVtYVBhY2thZ2UuUE9MWUxJTkVfX1dBWVBPSU5UUzoKLQkJCXJldHVybiB3YXlwb2ludHMgIT0gbnVsbCAmJiAhd2F5cG9pbnRzLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpCi0JCQlyZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChjbG9zZWQ6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoY2xvc2VkKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vUG9seWxpbmVJbXBsCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvUHJhY3RpY2VEZXNjcmlwdGlvbkltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9QcmFjdGljZURlc2NyaXB0aW9uSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZjljOGZjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9QcmFjdGljZURlc2NyaXB0aW9uSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDc0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5QcmFjdGljZURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlByYWN0aWNlIERlc2NyaXB0aW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUHJhY3RpY2VEZXNjcmlwdGlvbkltcGwjZ2V0QWRkaXRpb25hbEluZm8gPGVtPkFkZGl0aW9uYWwgSW5mbzwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlByYWN0aWNlRGVzY3JpcHRpb25JbXBsI2dldFByb2JsZW0gPGVtPlByb2JsZW08L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5QcmFjdGljZURlc2NyaXB0aW9uSW1wbCNnZXRCYWNrZ3JvdW5kIDxlbT5CYWNrZ3JvdW5kPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUHJhY3RpY2VEZXNjcmlwdGlvbkltcGwjZ2V0R29hbHMgPGVtPkdvYWxzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUHJhY3RpY2VEZXNjcmlwdGlvbkltcGwjZ2V0QXBwbGljYXRpb24gPGVtPkFwcGxpY2F0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUHJhY3RpY2VEZXNjcmlwdGlvbkltcGwjZ2V0TGV2ZWxzT2ZBZG9wdGlvbiA8ZW0+TGV2ZWxzIE9mIEFkb3B0aW9uPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUHJhY3RpY2VEZXNjcmlwdGlvbkltcGwgZXh0ZW5kcyBDb250ZW50RGVzY3JpcHRpb25JbXBsIGltcGxlbWVudHMKLQkJUHJhY3RpY2VEZXNjcmlwdGlvbiB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QWRkaXRpb25hbEluZm8oKSA8ZW0+QWRkaXRpb25hbCBJbmZvPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBZGRpdGlvbmFsSW5mbygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQURESVRJT05BTF9JTkZPX0VERUZBVUxUID0gIiI7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBZGRpdGlvbmFsSW5mbygpIDxlbT5BZGRpdGlvbmFsIEluZm88L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFkZGl0aW9uYWxJbmZvKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGFkZGl0aW9uYWxJbmZvID0gQURESVRJT05BTF9JTkZPX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByb2JsZW0oKSA8ZW0+UHJvYmxlbTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UHJvYmxlbSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPQkxFTV9FREVGQVVMVCA9ICIiOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJvYmxlbSgpIDxlbT5Qcm9ibGVtPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQcm9ibGVtKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHByb2JsZW0gPSBQUk9CTEVNX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEJhY2tncm91bmQoKSA8ZW0+QmFja2dyb3VuZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QmFja2dyb3VuZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkFDS0dST1VORF9FREVGQVVMVCA9ICIiOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QmFja2dyb3VuZCgpIDxlbT5CYWNrZ3JvdW5kPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRCYWNrZ3JvdW5kKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGJhY2tncm91bmQgPSBCQUNLR1JPVU5EX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEdvYWxzKCkgPGVtPkdvYWxzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRHb2FscygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgR09BTFNfRURFRkFVTFQgPSAiIjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEdvYWxzKCkgPGVtPkdvYWxzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRHb2FscygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnb2FscyA9IEdPQUxTX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFwcGxpY2F0aW9uKCkgPGVtPkFwcGxpY2F0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBcHBsaWNhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVBQTElDQVRJT05fRURFRkFVTFQgPSAiIjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFwcGxpY2F0aW9uKCkgPGVtPkFwcGxpY2F0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBcHBsaWNhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBhcHBsaWNhdGlvbiA9IEFQUExJQ0FUSU9OX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldExldmVsc09mQWRvcHRpb24oKSA8ZW0+TGV2ZWxzIE9mIEFkb3B0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRMZXZlbHNPZkFkb3B0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBMRVZFTFNfT0ZfQURPUFRJT05fRURFRkFVTFQgPSAiIjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldExldmVsc09mQWRvcHRpb24oKSA8ZW0+TGV2ZWxzIE9mIEFkb3B0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRMZXZlbHNPZkFkb3B0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGxldmVsc09mQWRvcHRpb24gPSBMRVZFTFNfT0ZfQURPUFRJT05fRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUHJhY3RpY2VEZXNjcmlwdGlvbkltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJLy9VTUEtLT4KLQkJcmVhc3NpZ25EZWZhdWx0VmFsdWVzKCk7Ci0JCS8vVU1BPC0tICAKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuUFJBQ1RJQ0VfREVTQ1JJUFRJT047Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRBZGRpdGlvbmFsSW5mbygpIHsKLQkJcmV0dXJuIGFkZGl0aW9uYWxJbmZvOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFkZGl0aW9uYWxJbmZvKFN0cmluZyBuZXdBZGRpdGlvbmFsSW5mbykgewotCQlTdHJpbmcgb2xkQWRkaXRpb25hbEluZm8gPSBhZGRpdGlvbmFsSW5mbzsKLQkJYWRkaXRpb25hbEluZm8gPSBuZXdBZGRpdGlvbmFsSW5mbzsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5QUkFDVElDRV9ERVNDUklQVElPTl9fQURESVRJT05BTF9JTkZPLAotCQkJCQlvbGRBZGRpdGlvbmFsSW5mbywgYWRkaXRpb25hbEluZm8pKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFByb2JsZW0oKSB7Ci0JCXJldHVybiBwcm9ibGVtOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFByb2JsZW0oU3RyaW5nIG5ld1Byb2JsZW0pIHsKLQkJU3RyaW5nIG9sZFByb2JsZW0gPSBwcm9ibGVtOwotCQlwcm9ibGVtID0gbmV3UHJvYmxlbTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5QUkFDVElDRV9ERVNDUklQVElPTl9fUFJPQkxFTSwgb2xkUHJvYmxlbSwKLQkJCQkJcHJvYmxlbSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0QmFja2dyb3VuZCgpIHsKLQkJcmV0dXJuIGJhY2tncm91bmQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QmFja2dyb3VuZChTdHJpbmcgbmV3QmFja2dyb3VuZCkgewotCQlTdHJpbmcgb2xkQmFja2dyb3VuZCA9IGJhY2tncm91bmQ7Ci0JCWJhY2tncm91bmQgPSBuZXdCYWNrZ3JvdW5kOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLlBSQUNUSUNFX0RFU0NSSVBUSU9OX19CQUNLR1JPVU5ELCBvbGRCYWNrZ3JvdW5kLAotCQkJCQliYWNrZ3JvdW5kKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRHb2FscygpIHsKLQkJcmV0dXJuIGdvYWxzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEdvYWxzKFN0cmluZyBuZXdHb2FscykgewotCQlTdHJpbmcgb2xkR29hbHMgPSBnb2FsczsKLQkJZ29hbHMgPSBuZXdHb2FsczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5QUkFDVElDRV9ERVNDUklQVElPTl9fR09BTFMsIG9sZEdvYWxzLCBnb2FscykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0QXBwbGljYXRpb24oKSB7Ci0JCXJldHVybiBhcHBsaWNhdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBcHBsaWNhdGlvbihTdHJpbmcgbmV3QXBwbGljYXRpb24pIHsKLQkJU3RyaW5nIG9sZEFwcGxpY2F0aW9uID0gYXBwbGljYXRpb247Ci0JCWFwcGxpY2F0aW9uID0gbmV3QXBwbGljYXRpb247Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0FQUExJQ0FUSU9OLAotCQkJCQlvbGRBcHBsaWNhdGlvbiwgYXBwbGljYXRpb24pKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExldmVsc09mQWRvcHRpb24oKSB7Ci0JCXJldHVybiBsZXZlbHNPZkFkb3B0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExldmVsc09mQWRvcHRpb24oU3RyaW5nIG5ld0xldmVsc09mQWRvcHRpb24pIHsKLQkJU3RyaW5nIG9sZExldmVsc09mQWRvcHRpb24gPSBsZXZlbHNPZkFkb3B0aW9uOwotCQlsZXZlbHNPZkFkb3B0aW9uID0gbmV3TGV2ZWxzT2ZBZG9wdGlvbjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5QUkFDVElDRV9ERVNDUklQVElPTl9fTEVWRUxTX09GX0FET1BUSU9OLAotCQkJCQlvbGRMZXZlbHNPZkFkb3B0aW9uLCBsZXZlbHNPZkFkb3B0aW9uKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0FERElUSU9OQUxfSU5GTzoKLQkJCXJldHVybiBnZXRBZGRpdGlvbmFsSW5mbygpOwotCQljYXNlIFVtYVBhY2thZ2UuUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX1BST0JMRU06Ci0JCQlyZXR1cm4gZ2V0UHJvYmxlbSgpOwotCQljYXNlIFVtYVBhY2thZ2UuUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0JBQ0tHUk9VTkQ6Ci0JCQlyZXR1cm4gZ2V0QmFja2dyb3VuZCgpOwotCQljYXNlIFVtYVBhY2thZ2UuUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0dPQUxTOgotCQkJcmV0dXJuIGdldEdvYWxzKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5QUkFDVElDRV9ERVNDUklQVElPTl9fQVBQTElDQVRJT046Ci0JCQlyZXR1cm4gZ2V0QXBwbGljYXRpb24oKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlBSQUNUSUNFX0RFU0NSSVBUSU9OX19MRVZFTFNfT0ZfQURPUFRJT046Ci0JCQlyZXR1cm4gZ2V0TGV2ZWxzT2ZBZG9wdGlvbigpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5QUkFDVElDRV9ERVNDUklQVElPTl9fQURESVRJT05BTF9JTkZPOgotCQkJc2V0QWRkaXRpb25hbEluZm8oKFN0cmluZykgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX1BST0JMRU06Ci0JCQlzZXRQcm9ibGVtKChTdHJpbmcpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlBSQUNUSUNFX0RFU0NSSVBUSU9OX19CQUNLR1JPVU5EOgotCQkJc2V0QmFja2dyb3VuZCgoU3RyaW5nKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5QUkFDVElDRV9ERVNDUklQVElPTl9fR09BTFM6Ci0JCQlzZXRHb2FscygoU3RyaW5nKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5QUkFDVElDRV9ERVNDUklQVElPTl9fQVBQTElDQVRJT046Ci0JCQlzZXRBcHBsaWNhdGlvbigoU3RyaW5nKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5QUkFDVElDRV9ERVNDUklQVElPTl9fTEVWRUxTX09GX0FET1BUSU9OOgotCQkJc2V0TGV2ZWxzT2ZBZG9wdGlvbigoU3RyaW5nKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0FERElUSU9OQUxfSU5GTzoKLQkJCXNldEFkZGl0aW9uYWxJbmZvKEFERElUSU9OQUxfSU5GT19FREVGQVVMVCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5QUkFDVElDRV9ERVNDUklQVElPTl9fUFJPQkxFTToKLQkJCXNldFByb2JsZW0oUFJPQkxFTV9FREVGQVVMVCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5QUkFDVElDRV9ERVNDUklQVElPTl9fQkFDS0dST1VORDoKLQkJCXNldEJhY2tncm91bmQoQkFDS0dST1VORF9FREVGQVVMVCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5QUkFDVElDRV9ERVNDUklQVElPTl9fR09BTFM6Ci0JCQlzZXRHb2FscyhHT0FMU19FREVGQVVMVCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5QUkFDVElDRV9ERVNDUklQVElPTl9fQVBQTElDQVRJT046Ci0JCQlzZXRBcHBsaWNhdGlvbihBUFBMSUNBVElPTl9FREVGQVVMVCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5QUkFDVElDRV9ERVNDUklQVElPTl9fTEVWRUxTX09GX0FET1BUSU9OOgotCQkJc2V0TGV2ZWxzT2ZBZG9wdGlvbihMRVZFTFNfT0ZfQURPUFRJT05fRURFRkFVTFQpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCS8vVU1BLS0+Ci0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gZ2V0RmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWUoZmVhdHVyZUlEKTsKLQkJaWYgKGZlYXR1cmUgIT0gbnVsbCkgewotCQkJcmV0dXJuIGlzRmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWVTZXQoZmVhdHVyZSk7Ci0JCX0KLQkJLy9VTUE8LS0JCQotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0FERElUSU9OQUxfSU5GTzoKLQkJCXJldHVybiBBRERJVElPTkFMX0lORk9fRURFRkFVTFQgPT0gbnVsbCA/IGFkZGl0aW9uYWxJbmZvICE9IG51bGwKLQkJCQkJOiAhQURESVRJT05BTF9JTkZPX0VERUZBVUxULmVxdWFscyhhZGRpdGlvbmFsSW5mbyk7Ci0JCWNhc2UgVW1hUGFja2FnZS5QUkFDVElDRV9ERVNDUklQVElPTl9fUFJPQkxFTToKLQkJCXJldHVybiBQUk9CTEVNX0VERUZBVUxUID09IG51bGwgPyBwcm9ibGVtICE9IG51bGwKLQkJCQkJOiAhUFJPQkxFTV9FREVGQVVMVC5lcXVhbHMocHJvYmxlbSk7Ci0JCWNhc2UgVW1hUGFja2FnZS5QUkFDVElDRV9ERVNDUklQVElPTl9fQkFDS0dST1VORDoKLQkJCXJldHVybiBCQUNLR1JPVU5EX0VERUZBVUxUID09IG51bGwgPyBiYWNrZ3JvdW5kICE9IG51bGwKLQkJCQkJOiAhQkFDS0dST1VORF9FREVGQVVMVC5lcXVhbHMoYmFja2dyb3VuZCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5QUkFDVElDRV9ERVNDUklQVElPTl9fR09BTFM6Ci0JCQlyZXR1cm4gR09BTFNfRURFRkFVTFQgPT0gbnVsbCA/IGdvYWxzICE9IG51bGwgOiAhR09BTFNfRURFRkFVTFQKLQkJCQkJLmVxdWFscyhnb2Fscyk7Ci0JCWNhc2UgVW1hUGFja2FnZS5QUkFDVElDRV9ERVNDUklQVElPTl9fQVBQTElDQVRJT046Ci0JCQlyZXR1cm4gQVBQTElDQVRJT05fRURFRkFVTFQgPT0gbnVsbCA/IGFwcGxpY2F0aW9uICE9IG51bGwKLQkJCQkJOiAhQVBQTElDQVRJT05fRURFRkFVTFQuZXF1YWxzKGFwcGxpY2F0aW9uKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlBSQUNUSUNFX0RFU0NSSVBUSU9OX19MRVZFTFNfT0ZfQURPUFRJT046Ci0JCQlyZXR1cm4gTEVWRUxTX09GX0FET1BUSU9OX0VERUZBVUxUID09IG51bGwgPyBsZXZlbHNPZkFkb3B0aW9uICE9IG51bGwKLQkJCQkJOiAhTEVWRUxTX09GX0FET1BUSU9OX0VERUZBVUxULmVxdWFscyhsZXZlbHNPZkFkb3B0aW9uKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpCi0JCQlyZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChhZGRpdGlvbmFsSW5mbzogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChhZGRpdGlvbmFsSW5mbyk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcHJvYmxlbTogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChwcm9ibGVtKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBiYWNrZ3JvdW5kOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGJhY2tncm91bmQpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGdvYWxzOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGdvYWxzKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBhcHBsaWNhdGlvbjogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChhcHBsaWNhdGlvbik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgbGV2ZWxzT2ZBZG9wdGlvbjogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChsZXZlbHNPZkFkb3B0aW9uKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vUHJhY3RpY2VEZXNjcmlwdGlvbkltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9QcmFjdGljZUltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9QcmFjdGljZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjk0ZjQ1My4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvUHJhY3RpY2VJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdFJlc29sdmluZ0VMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJhY3RpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UHJhY3RpY2U8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5QcmFjdGljZUltcGwjZ2V0U3ViUHJhY3RpY2VzIDxlbT5TdWIgUHJhY3RpY2VzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUHJhY3RpY2VJbXBsI2dldENvbnRlbnRSZWZlcmVuY2VzIDxlbT5Db250ZW50IFJlZmVyZW5jZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5QcmFjdGljZUltcGwjZ2V0QWN0aXZpdHlSZWZlcmVuY2VzIDxlbT5BY3Rpdml0eSBSZWZlcmVuY2VzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUHJhY3RpY2VJbXBsIGV4dGVuZHMgR3VpZGFuY2VJbXBsIGltcGxlbWVudHMgUHJhY3RpY2UgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U3ViUHJhY3RpY2VzKCkgPGVtPlN1YiBQcmFjdGljZXM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U3ViUHJhY3RpY2VzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8UHJhY3RpY2U+IHN1YlByYWN0aWNlczsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENvbnRlbnRSZWZlcmVuY2VzKCkgPGVtPkNvbnRlbnQgUmVmZXJlbmNlczwvZW0+fScgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDb250ZW50UmVmZXJlbmNlcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PENvbnRlbnRFbGVtZW50PiBjb250ZW50UmVmZXJlbmNlczsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFjdGl2aXR5UmVmZXJlbmNlcygpIDxlbT5BY3Rpdml0eSBSZWZlcmVuY2VzPC9lbT59JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFjdGl2aXR5UmVmZXJlbmNlcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PEFjdGl2aXR5PiBhY3Rpdml0eVJlZmVyZW5jZXM7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUHJhY3RpY2VJbXBsKCkgewotCQlzdXBlcigpOwotCi0JCS8vVU1BLS0+Ci0JCXJlYXNzaWduRGVmYXVsdFZhbHVlcygpOwotCQkvL1VNQTwtLSAgCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLlBSQUNUSUNFOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0PFByYWN0aWNlPiBnZXRTdWJQcmFjdGljZXMoKSB7Ci0JCWlmIChzdWJQcmFjdGljZXMgPT0gbnVsbCkgewotCQkJc3ViUHJhY3RpY2VzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0LlJlc29sdmluZzxQcmFjdGljZT4oCi0JCQkJCVByYWN0aWNlLmNsYXNzLCB0aGlzLCBVbWFQYWNrYWdlLlBSQUNUSUNFX19TVUJfUFJBQ1RJQ0VTKTsKLQkJfQotCQlyZXR1cm4gc3ViUHJhY3RpY2VzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0PENvbnRlbnRFbGVtZW50PiBnZXRDb250ZW50UmVmZXJlbmNlcygpIHsKLQkJaWYgKGNvbnRlbnRSZWZlcmVuY2VzID09IG51bGwpIHsKLQkJCWNvbnRlbnRSZWZlcmVuY2VzID0gbmV3IEVPYmplY3RSZXNvbHZpbmdFTGlzdDxDb250ZW50RWxlbWVudD4oCi0JCQkJCUNvbnRlbnRFbGVtZW50LmNsYXNzLCB0aGlzLAotCQkJCQlVbWFQYWNrYWdlLlBSQUNUSUNFX19DT05URU5UX1JFRkVSRU5DRVMpOwotCQl9Ci0JCXJldHVybiBjb250ZW50UmVmZXJlbmNlczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdDxBY3Rpdml0eT4gZ2V0QWN0aXZpdHlSZWZlcmVuY2VzKCkgewotCQlpZiAoYWN0aXZpdHlSZWZlcmVuY2VzID09IG51bGwpIHsKLQkJCWFjdGl2aXR5UmVmZXJlbmNlcyA9IG5ldyBFT2JqZWN0UmVzb2x2aW5nRUxpc3Q8QWN0aXZpdHk+KAotCQkJCQlBY3Rpdml0eS5jbGFzcywgdGhpcywKLQkJCQkJVW1hUGFja2FnZS5QUkFDVElDRV9fQUNUSVZJVFlfUkVGRVJFTkNFUyk7Ci0JCX0KLQkJcmV0dXJuIGFjdGl2aXR5UmVmZXJlbmNlczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLAotCQkJaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuUFJBQ1RJQ0VfX1NVQl9QUkFDVElDRVM6Ci0JCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KSBnZXRTdWJQcmFjdGljZXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsCi0JCQkJCW1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5QUkFDVElDRV9fU1VCX1BSQUNUSUNFUzoKLQkJCXJldHVybiBnZXRTdWJQcmFjdGljZXMoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlBSQUNUSUNFX19DT05URU5UX1JFRkVSRU5DRVM6Ci0JCQlyZXR1cm4gZ2V0Q29udGVudFJlZmVyZW5jZXMoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlBSQUNUSUNFX19BQ1RJVklUWV9SRUZFUkVOQ0VTOgotCQkJcmV0dXJuIGdldEFjdGl2aXR5UmVmZXJlbmNlcygpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5QUkFDVElDRV9fU1VCX1BSQUNUSUNFUzoKLQkJCWdldFN1YlByYWN0aWNlcygpLmNsZWFyKCk7Ci0JCQlnZXRTdWJQcmFjdGljZXMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFByYWN0aWNlPikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuUFJBQ1RJQ0VfX0NPTlRFTlRfUkVGRVJFTkNFUzoKLQkJCWdldENvbnRlbnRSZWZlcmVuY2VzKCkuY2xlYXIoKTsKLQkJCWdldENvbnRlbnRSZWZlcmVuY2VzKCkuYWRkQWxsKAotCQkJCQkoQ29sbGVjdGlvbjw/IGV4dGVuZHMgQ29udGVudEVsZW1lbnQ+KSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5QUkFDVElDRV9fQUNUSVZJVFlfUkVGRVJFTkNFUzoKLQkJCWdldEFjdGl2aXR5UmVmZXJlbmNlcygpLmNsZWFyKCk7Ci0JCQlnZXRBY3Rpdml0eVJlZmVyZW5jZXMoKS5hZGRBbGwoCi0JCQkJCShDb2xsZWN0aW9uPD8gZXh0ZW5kcyBBY3Rpdml0eT4pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5QUkFDVElDRV9fU1VCX1BSQUNUSUNFUzoKLQkJCWdldFN1YlByYWN0aWNlcygpLmNsZWFyKCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5QUkFDVElDRV9fQ09OVEVOVF9SRUZFUkVOQ0VTOgotCQkJZ2V0Q29udGVudFJlZmVyZW5jZXMoKS5jbGVhcigpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuUFJBQ1RJQ0VfX0FDVElWSVRZX1JFRkVSRU5DRVM6Ci0JCQlnZXRBY3Rpdml0eVJlZmVyZW5jZXMoKS5jbGVhcigpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCS8vVU1BLS0+Ci0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gZ2V0RmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWUoZmVhdHVyZUlEKTsKLQkJaWYgKGZlYXR1cmUgIT0gbnVsbCkgewotCQkJcmV0dXJuIGlzRmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWVTZXQoZmVhdHVyZSk7Ci0JCX0KLQkJLy9VTUE8LS0JCQotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuUFJBQ1RJQ0VfX1NVQl9QUkFDVElDRVM6Ci0JCQlyZXR1cm4gc3ViUHJhY3RpY2VzICE9IG51bGwgJiYgIXN1YlByYWN0aWNlcy5pc0VtcHR5KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5QUkFDVElDRV9fQ09OVEVOVF9SRUZFUkVOQ0VTOgotCQkJcmV0dXJuIGNvbnRlbnRSZWZlcmVuY2VzICE9IG51bGwgJiYgIWNvbnRlbnRSZWZlcmVuY2VzLmlzRW1wdHkoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlBSQUNUSUNFX19BQ1RJVklUWV9SRUZFUkVOQ0VTOgotCQkJcmV0dXJuIGFjdGl2aXR5UmVmZXJlbmNlcyAhPSBudWxsICYmICFhY3Rpdml0eVJlZmVyZW5jZXMuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLX0gLy9QcmFjdGljZUltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Qcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvckltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Qcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGI0MGUxZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvUHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3JJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnREZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlByb2Nlc3MgQ29tcG9uZW50IERlc2NyaXB0b3I8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Qcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvckltcGwjZ2V0X3Byb2Nlc3NDb21wb25lbnQgPGVtPnByb2Nlc3MgQ29tcG9uZW50PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3JJbXBsIGV4dGVuZHMgRGVzY3JpcHRvckltcGwgaW1wbGVtZW50cwotCQlQcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvciB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRfcHJvY2Vzc0NvbXBvbmVudCgpIDxlbT5wcm9jZXNzIENvbXBvbmVudDwvZW0+fScgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0X3Byb2Nlc3NDb21wb25lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBQcm9jZXNzQ29tcG9uZW50IF9wcm9jZXNzQ29tcG9uZW50OwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFByb2Nlc3NDb21wb25lbnREZXNjcmlwdG9ySW1wbCgpIHsKLQkJc3VwZXIoKTsKLQotCQkvL1VNQS0tPgotCQlyZWFzc2lnbkRlZmF1bHRWYWx1ZXMoKTsKLQkJLy9VTUE8LS0gIAotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5QUk9DRVNTX0NPTVBPTkVOVF9ERVNDUklQVE9SOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQcm9jZXNzQ29tcG9uZW50IGdldF9wcm9jZXNzQ29tcG9uZW50KCkgewotCQlpZiAoX3Byb2Nlc3NDb21wb25lbnQgIT0gbnVsbAotCQkJCSYmICgoRU9iamVjdCkgX3Byb2Nlc3NDb21wb25lbnQpLmVJc1Byb3h5KCkpIHsKLQkJCUludGVybmFsRU9iamVjdCBvbGRfcHJvY2Vzc0NvbXBvbmVudCA9IChJbnRlcm5hbEVPYmplY3QpIF9wcm9jZXNzQ29tcG9uZW50OwotCQkJX3Byb2Nlc3NDb21wb25lbnQgPSAoUHJvY2Vzc0NvbXBvbmVudCkgZVJlc29sdmVQcm94eShvbGRfcHJvY2Vzc0NvbXBvbmVudCk7Ci0JCQlpZiAoX3Byb2Nlc3NDb21wb25lbnQgIT0gb2xkX3Byb2Nlc3NDb21wb25lbnQpIHsKLQkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKAotCQkJCQkJCXRoaXMsCi0JCQkJCQkJTm90aWZpY2F0aW9uLlJFU09MVkUsCi0JCQkJCQkJVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9ERVNDUklQVE9SX19QUk9DRVNTX0NPTVBPTkVOVCwKLQkJCQkJCQlvbGRfcHJvY2Vzc0NvbXBvbmVudCwgX3Byb2Nlc3NDb21wb25lbnQpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gX3Byb2Nlc3NDb21wb25lbnQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFByb2Nlc3NDb21wb25lbnQgYmFzaWNHZXRfcHJvY2Vzc0NvbXBvbmVudCgpIHsKLQkJcmV0dXJuIF9wcm9jZXNzQ29tcG9uZW50OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldF9wcm9jZXNzQ29tcG9uZW50KFByb2Nlc3NDb21wb25lbnQgbmV3X3Byb2Nlc3NDb21wb25lbnQpIHsKLQkJUHJvY2Vzc0NvbXBvbmVudCBvbGRfcHJvY2Vzc0NvbXBvbmVudCA9IF9wcm9jZXNzQ29tcG9uZW50OwotCQlfcHJvY2Vzc0NvbXBvbmVudCA9IG5ld19wcm9jZXNzQ29tcG9uZW50OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX0RFU0NSSVBUT1JfX1BST0NFU1NfQ09NUE9ORU5ULAotCQkJCQlvbGRfcHJvY2Vzc0NvbXBvbmVudCwgX3Byb2Nlc3NDb21wb25lbnQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9ERVNDUklQVE9SX19QUk9DRVNTX0NPTVBPTkVOVDoKLQkJCWlmIChyZXNvbHZlKQotCQkJCXJldHVybiBnZXRfcHJvY2Vzc0NvbXBvbmVudCgpOwotCQkJcmV0dXJuIGJhc2ljR2V0X3Byb2Nlc3NDb21wb25lbnQoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfREVTQ1JJUFRPUl9fUFJPQ0VTU19DT01QT05FTlQ6Ci0JCQlzZXRfcHJvY2Vzc0NvbXBvbmVudCgoUHJvY2Vzc0NvbXBvbmVudCkgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX0RFU0NSSVBUT1JfX1BST0NFU1NfQ09NUE9ORU5UOgotCQkJc2V0X3Byb2Nlc3NDb21wb25lbnQoKFByb2Nlc3NDb21wb25lbnQpIG51bGwpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCS8vVU1BLS0+Ci0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gZ2V0RmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWUoZmVhdHVyZUlEKTsKLQkJaWYgKGZlYXR1cmUgIT0gbnVsbCkgewotCQkJcmV0dXJuIGlzRmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWVTZXQoZmVhdHVyZSk7Ci0JCX0KLQkJLy9VTUE8LS0JCQotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfREVTQ1JJUFRPUl9fUFJPQ0VTU19DT01QT05FTlQ6Ci0JCQlyZXR1cm4gX3Byb2Nlc3NDb21wb25lbnQgIT0gbnVsbDsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi19IC8vUHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3JJbXBsCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvUHJvY2Vzc0NvbXBvbmVudEltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Qcm9jZXNzQ29tcG9uZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMmMzMWM4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Qcm9jZXNzQ29tcG9uZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjU0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5EYXRlOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0UmVzb2x2aW5nRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5TdXBwb3J0aW5nTWF0ZXJpYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UHJvY2VzcyBDb21wb25lbnQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Qcm9jZXNzQ29tcG9uZW50SW1wbCNnZXRBdXRob3JzIDxlbT5BdXRob3JzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUHJvY2Vzc0NvbXBvbmVudEltcGwjZ2V0Q2hhbmdlRGF0ZSA8ZW0+Q2hhbmdlIERhdGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Qcm9jZXNzQ29tcG9uZW50SW1wbCNnZXRDaGFuZ2VEZXNjcmlwdGlvbiA8ZW0+Q2hhbmdlIERlc2NyaXB0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUHJvY2Vzc0NvbXBvbmVudEltcGwjZ2V0VmVyc2lvbiA8ZW0+VmVyc2lvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlByb2Nlc3NDb21wb25lbnRJbXBsI2dldENvcHlyaWdodFN0YXRlbWVudCA8ZW0+Q29weXJpZ2h0IFN0YXRlbWVudDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlByb2Nlc3NDb21wb25lbnRJbXBsI2dldEludGVyZmFjZXMgPGVtPkludGVyZmFjZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Qcm9jZXNzQ29tcG9uZW50SW1wbCNnZXRQcm9jZXNzIDxlbT5Qcm9jZXNzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUHJvY2Vzc0NvbXBvbmVudEltcGwgZXh0ZW5kcyBQcm9jZXNzUGFja2FnZUltcGwgaW1wbGVtZW50cwotCQlQcm9jZXNzQ29tcG9uZW50IHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBdXRob3JzKCkgPGVtPkF1dGhvcnM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEF1dGhvcnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEFVVEhPUlNfRURFRkFVTFQgPSAiIjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEF1dGhvcnMoKSA8ZW0+QXV0aG9yczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QXV0aG9ycygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBhdXRob3JzID0gQVVUSE9SU19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDaGFuZ2VEYXRlKCkgPGVtPkNoYW5nZSBEYXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDaGFuZ2VEYXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIERhdGUgQ0hBTkdFX0RBVEVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q2hhbmdlRGF0ZSgpIDxlbT5DaGFuZ2UgRGF0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q2hhbmdlRGF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIERhdGUgY2hhbmdlRGF0ZSA9IENIQU5HRV9EQVRFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENoYW5nZURlc2NyaXB0aW9uKCkgPGVtPkNoYW5nZSBEZXNjcmlwdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q2hhbmdlRGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIENIQU5HRV9ERVNDUklQVElPTl9FREVGQVVMVCA9ICIiOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q2hhbmdlRGVzY3JpcHRpb24oKSA8ZW0+Q2hhbmdlIERlc2NyaXB0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDaGFuZ2VEZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBjaGFuZ2VEZXNjcmlwdGlvbiA9IENIQU5HRV9ERVNDUklQVElPTl9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWZXJzaW9uKCkgPGVtPlZlcnNpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFZlcnNpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFZFUlNJT05fRURFRkFVTFQgPSAiIjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZlcnNpb24oKSA8ZW0+VmVyc2lvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VmVyc2lvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyB2ZXJzaW9uID0gVkVSU0lPTl9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENvcHlyaWdodFN0YXRlbWVudCgpIDxlbT5Db3B5cmlnaHQgU3RhdGVtZW50PC9lbT59JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDb3B5cmlnaHRTdGF0ZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdXBwb3J0aW5nTWF0ZXJpYWwgY29weXJpZ2h0U3RhdGVtZW50OwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SW50ZXJmYWNlcygpIDxlbT5JbnRlcmZhY2VzPC9lbT59JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEludGVyZmFjZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlPiBpbnRlcmZhY2VzOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJvY2VzcygpIDxlbT5Qcm9jZXNzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQcm9jZXNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzIHByb2Nlc3M7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUHJvY2Vzc0NvbXBvbmVudEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJLy9VTUEtLT4KLQkJcmVhc3NpZ25EZWZhdWx0VmFsdWVzKCk7Ci0JCS8vVU1BPC0tICAKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuUFJPQ0VTU19DT01QT05FTlQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRBdXRob3JzKCkgewotCQlyZXR1cm4gYXV0aG9yczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBdXRob3JzKFN0cmluZyBuZXdBdXRob3JzKSB7Ci0JCVN0cmluZyBvbGRBdXRob3JzID0gYXV0aG9yczsKLQkJYXV0aG9ycyA9IG5ld0F1dGhvcnM7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfX0FVVEhPUlMsIG9sZEF1dGhvcnMsIGF1dGhvcnMpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRGF0ZSBnZXRDaGFuZ2VEYXRlKCkgewotCQlyZXR1cm4gY2hhbmdlRGF0ZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDaGFuZ2VEYXRlKERhdGUgbmV3Q2hhbmdlRGF0ZSkgewotCQlEYXRlIG9sZENoYW5nZURhdGUgPSBjaGFuZ2VEYXRlOwotCQljaGFuZ2VEYXRlID0gbmV3Q2hhbmdlRGF0ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9fQ0hBTkdFX0RBVEUsIG9sZENoYW5nZURhdGUsCi0JCQkJCWNoYW5nZURhdGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENoYW5nZURlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gY2hhbmdlRGVzY3JpcHRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q2hhbmdlRGVzY3JpcHRpb24oU3RyaW5nIG5ld0NoYW5nZURlc2NyaXB0aW9uKSB7Ci0JCVN0cmluZyBvbGRDaGFuZ2VEZXNjcmlwdGlvbiA9IGNoYW5nZURlc2NyaXB0aW9uOwotCQljaGFuZ2VEZXNjcmlwdGlvbiA9IG5ld0NoYW5nZURlc2NyaXB0aW9uOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX19DSEFOR0VfREVTQ1JJUFRJT04sCi0JCQkJCW9sZENoYW5nZURlc2NyaXB0aW9uLCBjaGFuZ2VEZXNjcmlwdGlvbikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VmVyc2lvbigpIHsKLQkJcmV0dXJuIHZlcnNpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmVyc2lvbihTdHJpbmcgbmV3VmVyc2lvbikgewotCQlTdHJpbmcgb2xkVmVyc2lvbiA9IHZlcnNpb247Ci0JCXZlcnNpb24gPSBuZXdWZXJzaW9uOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX19WRVJTSU9OLCBvbGRWZXJzaW9uLCB2ZXJzaW9uKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN1cHBvcnRpbmdNYXRlcmlhbCBnZXRDb3B5cmlnaHRTdGF0ZW1lbnQoKSB7Ci0JCWlmIChjb3B5cmlnaHRTdGF0ZW1lbnQgIT0gbnVsbAotCQkJCSYmICgoRU9iamVjdCkgY29weXJpZ2h0U3RhdGVtZW50KS5lSXNQcm94eSgpKSB7Ci0JCQlJbnRlcm5hbEVPYmplY3Qgb2xkQ29weXJpZ2h0U3RhdGVtZW50ID0gKEludGVybmFsRU9iamVjdCkgY29weXJpZ2h0U3RhdGVtZW50OwotCQkJY29weXJpZ2h0U3RhdGVtZW50ID0gKFN1cHBvcnRpbmdNYXRlcmlhbCkgZVJlc29sdmVQcm94eShvbGRDb3B5cmlnaHRTdGF0ZW1lbnQpOwotCQkJaWYgKGNvcHlyaWdodFN0YXRlbWVudCAhPSBvbGRDb3B5cmlnaHRTdGF0ZW1lbnQpIHsKLQkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLAotCQkJCQkJCVVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfX0NPUFlSSUdIVF9TVEFURU1FTlQsCi0JCQkJCQkJb2xkQ29weXJpZ2h0U3RhdGVtZW50LCBjb3B5cmlnaHRTdGF0ZW1lbnQpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gY29weXJpZ2h0U3RhdGVtZW50OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdXBwb3J0aW5nTWF0ZXJpYWwgYmFzaWNHZXRDb3B5cmlnaHRTdGF0ZW1lbnQoKSB7Ci0JCXJldHVybiBjb3B5cmlnaHRTdGF0ZW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29weXJpZ2h0U3RhdGVtZW50KFN1cHBvcnRpbmdNYXRlcmlhbCBuZXdDb3B5cmlnaHRTdGF0ZW1lbnQpIHsKLQkJU3VwcG9ydGluZ01hdGVyaWFsIG9sZENvcHlyaWdodFN0YXRlbWVudCA9IGNvcHlyaWdodFN0YXRlbWVudDsKLQkJY29weXJpZ2h0U3RhdGVtZW50ID0gbmV3Q29weXJpZ2h0U3RhdGVtZW50OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX19DT1BZUklHSFRfU1RBVEVNRU5ULAotCQkJCQlvbGRDb3B5cmlnaHRTdGF0ZW1lbnQsIGNvcHlyaWdodFN0YXRlbWVudCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0PFByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2U+IGdldEludGVyZmFjZXMoKSB7Ci0JCWlmIChpbnRlcmZhY2VzID09IG51bGwpIHsKLQkJCWludGVyZmFjZXMgPSBuZXcgRU9iamVjdFJlc29sdmluZ0VMaXN0PFByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2U+KAotCQkJCQlQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlLmNsYXNzLCB0aGlzLAotCQkJCQlVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX19JTlRFUkZBQ0VTKTsKLQkJfQotCQlyZXR1cm4gaW50ZXJmYWNlczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzIGdldFByb2Nlc3MoKSB7Ci0JCWlmIChwcm9jZXNzICE9IG51bGwgJiYgKChFT2JqZWN0KSBwcm9jZXNzKS5lSXNQcm94eSgpKSB7Ci0JCQlJbnRlcm5hbEVPYmplY3Qgb2xkUHJvY2VzcyA9IChJbnRlcm5hbEVPYmplY3QpIHByb2Nlc3M7Ci0JCQlwcm9jZXNzID0gKG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzcykgZVJlc29sdmVQcm94eShvbGRQcm9jZXNzKTsKLQkJCWlmIChwcm9jZXNzICE9IG9sZFByb2Nlc3MpIHsKLQkJCQlJbnRlcm5hbEVPYmplY3QgbmV3UHJvY2VzcyA9IChJbnRlcm5hbEVPYmplY3QpIHByb2Nlc3M7Ci0JCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG9sZFByb2Nlc3MuZUludmVyc2VSZW1vdmUodGhpcywKLQkJCQkJCUVPUFBPU0lURV9GRUFUVVJFX0JBU0UKLQkJCQkJCQkJLSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX19QUk9DRVNTLCBudWxsLAotCQkJCQkJbnVsbCk7Ci0JCQkJaWYgKG5ld1Byb2Nlc3MuZUludGVybmFsQ29udGFpbmVyKCkgPT0gbnVsbCkgewotCQkJCQltc2dzID0gbmV3UHJvY2VzcwotCQkJCQkJCS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFCi0JCQkJCQkJCQktIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfX1BST0NFU1MsCi0JCQkJCQkJCQludWxsLCBtc2dzKTsKLQkJCQl9Ci0JCQkJaWYgKG1zZ3MgIT0gbnVsbCkKLQkJCQkJbXNncy5kaXNwYXRjaCgpOwotCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlJFU09MVkUsCi0JCQkJCQkJVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9fUFJPQ0VTUywgb2xkUHJvY2VzcywKLQkJCQkJCQlwcm9jZXNzKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHByb2Nlc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzcyBiYXNpY0dldFByb2Nlc3MoKSB7Ci0JCXJldHVybiBwcm9jZXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldFByb2Nlc3MoCi0JCQlvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3MgbmV3UHJvY2VzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3Mgb2xkUHJvY2VzcyA9IHByb2Nlc3M7Ci0JCXByb2Nlc3MgPSBuZXdQcm9jZXNzOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLAotCQkJCQlOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX19QUk9DRVNTLAotCQkJCQlvbGRQcm9jZXNzLCBuZXdQcm9jZXNzKTsKLQkJCWlmIChtc2dzID09IG51bGwpCi0JCQkJbXNncyA9IG5vdGlmaWNhdGlvbjsKLQkJCWVsc2UKLQkJCQltc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFByb2Nlc3Mob3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzIG5ld1Byb2Nlc3MpIHsKLQkJaWYgKG5ld1Byb2Nlc3MgIT0gcHJvY2VzcykgewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAocHJvY2VzcyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCkgcHJvY2VzcykuZUludmVyc2VSZW1vdmUodGhpcywKLQkJCQkJCUVPUFBPU0lURV9GRUFUVVJFX0JBU0UKLQkJCQkJCQkJLSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX19QUk9DRVNTLCBudWxsLAotCQkJCQkJbXNncyk7Ci0JCQlpZiAobmV3UHJvY2VzcyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCkgbmV3UHJvY2VzcykuZUludmVyc2VBZGQodGhpcywKLQkJCQkJCUVPUFBPU0lURV9GRUFUVVJFX0JBU0UKLQkJCQkJCQkJLSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX19QUk9DRVNTLCBudWxsLAotCQkJCQkJbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRQcm9jZXNzKG5ld1Byb2Nlc3MsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkKLQkJCQltc2dzLmRpc3BhdGNoKCk7Ci0JCX0gZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX19QUk9DRVNTLCBuZXdQcm9jZXNzLAotCQkJCQluZXdQcm9jZXNzKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwKLQkJCWludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX19QUk9DRVNTOgotCQkJcmV0dXJuIGJhc2ljU2V0UHJvY2VzcyhudWxsLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfX0FVVEhPUlM6Ci0JCQlyZXR1cm4gZ2V0QXV0aG9ycygpOwotCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfX0NIQU5HRV9EQVRFOgotCQkJcmV0dXJuIGdldENoYW5nZURhdGUoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX19DSEFOR0VfREVTQ1JJUFRJT046Ci0JCQlyZXR1cm4gZ2V0Q2hhbmdlRGVzY3JpcHRpb24oKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX19WRVJTSU9OOgotCQkJcmV0dXJuIGdldFZlcnNpb24oKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX19DT1BZUklHSFRfU1RBVEVNRU5UOgotCQkJaWYgKHJlc29sdmUpCi0JCQkJcmV0dXJuIGdldENvcHlyaWdodFN0YXRlbWVudCgpOwotCQkJcmV0dXJuIGJhc2ljR2V0Q29weXJpZ2h0U3RhdGVtZW50KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9fSU5URVJGQUNFUzoKLQkJCXJldHVybiBnZXRJbnRlcmZhY2VzKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9fUFJPQ0VTUzoKLQkJCWlmIChyZXNvbHZlKQotCQkJCXJldHVybiBnZXRQcm9jZXNzKCk7Ci0JCQlyZXR1cm4gYmFzaWNHZXRQcm9jZXNzKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX19BVVRIT1JTOgotCQkJc2V0QXV0aG9ycygoU3RyaW5nKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9fQ0hBTkdFX0RBVEU6Ci0JCQlzZXRDaGFuZ2VEYXRlKChEYXRlKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9fQ0hBTkdFX0RFU0NSSVBUSU9OOgotCQkJc2V0Q2hhbmdlRGVzY3JpcHRpb24oKFN0cmluZykgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfX1ZFUlNJT046Ci0JCQlzZXRWZXJzaW9uKChTdHJpbmcpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX19DT1BZUklHSFRfU1RBVEVNRU5UOgotCQkJc2V0Q29weXJpZ2h0U3RhdGVtZW50KChTdXBwb3J0aW5nTWF0ZXJpYWwpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX19JTlRFUkZBQ0VTOgotCQkJZ2V0SW50ZXJmYWNlcygpLmNsZWFyKCk7Ci0JCQlnZXRJbnRlcmZhY2VzKCkuYWRkQWxsKAotCQkJCQkoQ29sbGVjdGlvbjw/IGV4dGVuZHMgUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZT4pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX19QUk9DRVNTOgotCQkJc2V0UHJvY2Vzcygob3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfX0FVVEhPUlM6Ci0JCQlzZXRBdXRob3JzKEFVVEhPUlNfRURFRkFVTFQpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfX0NIQU5HRV9EQVRFOgotCQkJc2V0Q2hhbmdlRGF0ZShDSEFOR0VfREFURV9FREVGQVVMVCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9fQ0hBTkdFX0RFU0NSSVBUSU9OOgotCQkJc2V0Q2hhbmdlRGVzY3JpcHRpb24oQ0hBTkdFX0RFU0NSSVBUSU9OX0VERUZBVUxUKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX19WRVJTSU9OOgotCQkJc2V0VmVyc2lvbihWRVJTSU9OX0VERUZBVUxUKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX19DT1BZUklHSFRfU1RBVEVNRU5UOgotCQkJc2V0Q29weXJpZ2h0U3RhdGVtZW50KChTdXBwb3J0aW5nTWF0ZXJpYWwpIG51bGwpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfX0lOVEVSRkFDRVM6Ci0JCQlnZXRJbnRlcmZhY2VzKCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX19QUk9DRVNTOgotCQkJc2V0UHJvY2Vzcygob3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzKSBudWxsKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQkvL1VNQS0tPgotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IGdldEZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlKGZlYXR1cmVJRCk7Ci0JCWlmIChmZWF0dXJlICE9IG51bGwpIHsKLQkJCXJldHVybiBpc0ZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlU2V0KGZlYXR1cmUpOwotCQl9Ci0JCS8vVU1BPC0tCQkKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX19BVVRIT1JTOgotCQkJcmV0dXJuIEFVVEhPUlNfRURFRkFVTFQgPT0gbnVsbCA/IGF1dGhvcnMgIT0gbnVsbAotCQkJCQk6ICFBVVRIT1JTX0VERUZBVUxULmVxdWFscyhhdXRob3JzKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX19DSEFOR0VfREFURToKLQkJCXJldHVybiBDSEFOR0VfREFURV9FREVGQVVMVCA9PSBudWxsID8gY2hhbmdlRGF0ZSAhPSBudWxsCi0JCQkJCTogIUNIQU5HRV9EQVRFX0VERUZBVUxULmVxdWFscyhjaGFuZ2VEYXRlKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX19DSEFOR0VfREVTQ1JJUFRJT046Ci0JCQlyZXR1cm4gQ0hBTkdFX0RFU0NSSVBUSU9OX0VERUZBVUxUID09IG51bGwgPyBjaGFuZ2VEZXNjcmlwdGlvbiAhPSBudWxsCi0JCQkJCTogIUNIQU5HRV9ERVNDUklQVElPTl9FREVGQVVMVC5lcXVhbHMoY2hhbmdlRGVzY3JpcHRpb24pOwotCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfX1ZFUlNJT046Ci0JCQlyZXR1cm4gVkVSU0lPTl9FREVGQVVMVCA9PSBudWxsID8gdmVyc2lvbiAhPSBudWxsCi0JCQkJCTogIVZFUlNJT05fRURFRkFVTFQuZXF1YWxzKHZlcnNpb24pOwotCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfX0NPUFlSSUdIVF9TVEFURU1FTlQ6Ci0JCQlyZXR1cm4gY29weXJpZ2h0U3RhdGVtZW50ICE9IG51bGw7Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9fSU5URVJGQUNFUzoKLQkJCXJldHVybiBpbnRlcmZhY2VzICE9IG51bGwgJiYgIWludGVyZmFjZXMuaXNFbXB0eSgpOwotCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfX1BST0NFU1M6Ci0JCQlyZXR1cm4gcHJvY2VzcyAhPSBudWxsOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgaW50IGVCYXNlU3RydWN0dXJhbEZlYXR1cmVJRChpbnQgZGVyaXZlZEZlYXR1cmVJRCwgQ2xhc3M8Pz4gYmFzZUNsYXNzKSB7Ci0JCWlmIChiYXNlQ2xhc3MgPT0gTWV0aG9kVW5pdC5jbGFzcykgewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfX0FVVEhPUlM6Ci0JCQkJcmV0dXJuIFVtYVBhY2thZ2UuTUVUSE9EX1VOSVRfX0FVVEhPUlM7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfX0NIQU5HRV9EQVRFOgotCQkJCXJldHVybiBVbWFQYWNrYWdlLk1FVEhPRF9VTklUX19DSEFOR0VfREFURTsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9fQ0hBTkdFX0RFU0NSSVBUSU9OOgotCQkJCXJldHVybiBVbWFQYWNrYWdlLk1FVEhPRF9VTklUX19DSEFOR0VfREVTQ1JJUFRJT047Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfX1ZFUlNJT046Ci0JCQkJcmV0dXJuIFVtYVBhY2thZ2UuTUVUSE9EX1VOSVRfX1ZFUlNJT047Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfX0NPUFlSSUdIVF9TVEFURU1FTlQ6Ci0JCQkJcmV0dXJuIFVtYVBhY2thZ2UuTUVUSE9EX1VOSVRfX0NPUFlSSUdIVF9TVEFURU1FTlQ7Ci0JCQlkZWZhdWx0OgotCQkJCXJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXIuZUJhc2VTdHJ1Y3R1cmFsRmVhdHVyZUlEKGRlcml2ZWRGZWF0dXJlSUQsIGJhc2VDbGFzcyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGludCBlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoaW50IGJhc2VGZWF0dXJlSUQsIENsYXNzPD8+IGJhc2VDbGFzcykgewotCQlpZiAoYmFzZUNsYXNzID09IE1ldGhvZFVuaXQuY2xhc3MpIHsKLQkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9VTklUX19BVVRIT1JTOgotCQkJCXJldHVybiBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX19BVVRIT1JTOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9VTklUX19DSEFOR0VfREFURToKLQkJCQlyZXR1cm4gVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9fQ0hBTkdFX0RBVEU7Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1VOSVRfX0NIQU5HRV9ERVNDUklQVElPTjoKLQkJCQlyZXR1cm4gVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9fQ0hBTkdFX0RFU0NSSVBUSU9OOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9VTklUX19WRVJTSU9OOgotCQkJCXJldHVybiBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX19WRVJTSU9OOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9VTklUX19DT1BZUklHSFRfU1RBVEVNRU5UOgotCQkJCXJldHVybiBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX19DT1BZUklHSFRfU1RBVEVNRU5UOwotCQkJZGVmYXVsdDoKLQkJCQlyZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChiYXNlRmVhdHVyZUlELCBiYXNlQ2xhc3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKQotCQkJcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoYXV0aG9yczogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChhdXRob3JzKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBjaGFuZ2VEYXRlOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGNoYW5nZURhdGUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGNoYW5nZURlc2NyaXB0aW9uOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGNoYW5nZURlc2NyaXB0aW9uKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCB2ZXJzaW9uOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKHZlcnNpb24pOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9Qcm9jZXNzQ29tcG9uZW50SW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1Byb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjAzOWFiZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyMiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvcjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlByb2Nlc3MgQ29tcG9uZW50IEludGVyZmFjZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VJbXBsI2dldEludGVyZmFjZVNwZWNpZmljYXRpb25zIDxlbT5JbnRlcmZhY2UgU3BlY2lmaWNhdGlvbnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlSW1wbCNnZXRJbnRlcmZhY2VJTyA8ZW0+SW50ZXJmYWNlIElPPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZUltcGwgZXh0ZW5kcyBCcmVha2Rvd25FbGVtZW50SW1wbAotCQlpbXBsZW1lbnRzIFByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SW50ZXJmYWNlU3BlY2lmaWNhdGlvbnMoKSA8ZW0+SW50ZXJmYWNlIFNwZWNpZmljYXRpb25zPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEludGVyZmFjZVNwZWNpZmljYXRpb25zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8VGFza0Rlc2NyaXB0b3I+IGludGVyZmFjZVNwZWNpZmljYXRpb25zOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SW50ZXJmYWNlSU8oKSA8ZW0+SW50ZXJmYWNlIElPPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEludGVyZmFjZUlPKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8V29ya1Byb2R1Y3REZXNjcmlwdG9yPiBpbnRlcmZhY2VJTzsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQotCQkvL1VNQS0tPgotCQlyZWFzc2lnbkRlZmF1bHRWYWx1ZXMoKTsKLQkJLy9VTUE8LS0gIAotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5QUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3Q8VGFza0Rlc2NyaXB0b3I+IGdldEludGVyZmFjZVNwZWNpZmljYXRpb25zKCkgewotCQlpZiAoaW50ZXJmYWNlU3BlY2lmaWNhdGlvbnMgPT0gbnVsbCkgewotCQkJaW50ZXJmYWNlU3BlY2lmaWNhdGlvbnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QuUmVzb2x2aW5nPFRhc2tEZXNjcmlwdG9yPigKLQkJCQkJVGFza0Rlc2NyaXB0b3IuY2xhc3MsCi0JCQkJCXRoaXMsCi0JCQkJCVVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfSU5URVJGQUNFX19JTlRFUkZBQ0VfU1BFQ0lGSUNBVElPTlMpOwotCQl9Ci0JCXJldHVybiBpbnRlcmZhY2VTcGVjaWZpY2F0aW9uczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdDxXb3JrUHJvZHVjdERlc2NyaXB0b3I+IGdldEludGVyZmFjZUlPKCkgewotCQlpZiAoaW50ZXJmYWNlSU8gPT0gbnVsbCkgewotCQkJaW50ZXJmYWNlSU8gPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QuUmVzb2x2aW5nPFdvcmtQcm9kdWN0RGVzY3JpcHRvcj4oCi0JCQkJCVdvcmtQcm9kdWN0RGVzY3JpcHRvci5jbGFzcywgdGhpcywKLQkJCQkJVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfX0lOVEVSRkFDRV9JTyk7Ci0JCX0KLQkJcmV0dXJuIGludGVyZmFjZUlPOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsCi0JCQlpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfX0lOVEVSRkFDRV9TUEVDSUZJQ0FUSU9OUzoKLQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pIGdldEludGVyZmFjZVNwZWNpZmljYXRpb25zKCkpCi0JCQkJCS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfX0lOVEVSRkFDRV9JTzoKLQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pIGdldEludGVyZmFjZUlPKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLAotCQkJCQltc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfSU5URVJGQUNFX19JTlRFUkZBQ0VfU1BFQ0lGSUNBVElPTlM6Ci0JCQlyZXR1cm4gZ2V0SW50ZXJmYWNlU3BlY2lmaWNhdGlvbnMoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRV9fSU5URVJGQUNFX0lPOgotCQkJcmV0dXJuIGdldEludGVyZmFjZUlPKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRV9fSU5URVJGQUNFX1NQRUNJRklDQVRJT05TOgotCQkJZ2V0SW50ZXJmYWNlU3BlY2lmaWNhdGlvbnMoKS5jbGVhcigpOwotCQkJZ2V0SW50ZXJmYWNlU3BlY2lmaWNhdGlvbnMoKS5hZGRBbGwoCi0JCQkJCShDb2xsZWN0aW9uPD8gZXh0ZW5kcyBUYXNrRGVzY3JpcHRvcj4pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRV9fSU5URVJGQUNFX0lPOgotCQkJZ2V0SW50ZXJmYWNlSU8oKS5jbGVhcigpOwotCQkJZ2V0SW50ZXJmYWNlSU8oKS5hZGRBbGwoCi0JCQkJCShDb2xsZWN0aW9uPD8gZXh0ZW5kcyBXb3JrUHJvZHVjdERlc2NyaXB0b3I+KSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfSU5URVJGQUNFX19JTlRFUkZBQ0VfU1BFQ0lGSUNBVElPTlM6Ci0JCQlnZXRJbnRlcmZhY2VTcGVjaWZpY2F0aW9ucygpLmNsZWFyKCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfX0lOVEVSRkFDRV9JTzoKLQkJCWdldEludGVyZmFjZUlPKCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQkvL1VNQS0tPgotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IGdldEZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlKGZlYXR1cmVJRCk7Ci0JCWlmIChmZWF0dXJlICE9IG51bGwpIHsKLQkJCXJldHVybiBpc0ZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlU2V0KGZlYXR1cmUpOwotCQl9Ci0JCS8vVU1BPC0tCQkKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRV9fSU5URVJGQUNFX1NQRUNJRklDQVRJT05TOgotCQkJcmV0dXJuIGludGVyZmFjZVNwZWNpZmljYXRpb25zICE9IG51bGwKLQkJCQkJJiYgIWludGVyZmFjZVNwZWNpZmljYXRpb25zLmlzRW1wdHkoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRV9fSU5URVJGQUNFX0lPOgotCQkJcmV0dXJuIGludGVyZmFjZUlPICE9IG51bGwgJiYgIWludGVyZmFjZUlPLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi19IC8vUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZUltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Qcm9jZXNzRGVzY3JpcHRpb25JbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvUHJvY2Vzc0Rlc2NyaXB0aW9uSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjM2VhYWIwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Qcm9jZXNzRGVzY3JpcHRpb25JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Qcm9jZXNzIERlc2NyaXB0aW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUHJvY2Vzc0Rlc2NyaXB0aW9uSW1wbCNnZXRTY29wZSA8ZW0+U2NvcGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Qcm9jZXNzRGVzY3JpcHRpb25JbXBsI2dldFVzYWdlTm90ZXMgPGVtPlVzYWdlIE5vdGVzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUHJvY2Vzc0Rlc2NyaXB0aW9uSW1wbCBleHRlbmRzIEFjdGl2aXR5RGVzY3JpcHRpb25JbXBsIGltcGxlbWVudHMKLQkJUHJvY2Vzc0Rlc2NyaXB0aW9uIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTY29wZSgpIDxlbT5TY29wZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U2NvcGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFNDT1BFX0VERUZBVUxUID0gIiI7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTY29wZSgpIDxlbT5TY29wZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U2NvcGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgc2NvcGUgPSBTQ09QRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRVc2FnZU5vdGVzKCkgPGVtPlVzYWdlIE5vdGVzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRVc2FnZU5vdGVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBVU0FHRV9OT1RFU19FREVGQVVMVCA9ICIiOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VXNhZ2VOb3RlcygpIDxlbT5Vc2FnZSBOb3RlczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VXNhZ2VOb3RlcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyB1c2FnZU5vdGVzID0gVVNBR0VfTk9URVNfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUHJvY2Vzc0Rlc2NyaXB0aW9uSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQotCQkvL1VNQS0tPgotCQlyZWFzc2lnbkRlZmF1bHRWYWx1ZXMoKTsKLQkJLy9VTUE8LS0gIAotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5QUk9DRVNTX0RFU0NSSVBUSU9OOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U2NvcGUoKSB7Ci0JCXJldHVybiBzY29wZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTY29wZShTdHJpbmcgbmV3U2NvcGUpIHsKLQkJU3RyaW5nIG9sZFNjb3BlID0gc2NvcGU7Ci0JCXNjb3BlID0gbmV3U2NvcGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuUFJPQ0VTU19ERVNDUklQVElPTl9fU0NPUEUsIG9sZFNjb3BlLCBzY29wZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VXNhZ2VOb3RlcygpIHsKLQkJcmV0dXJuIHVzYWdlTm90ZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VXNhZ2VOb3RlcyhTdHJpbmcgbmV3VXNhZ2VOb3RlcykgewotCQlTdHJpbmcgb2xkVXNhZ2VOb3RlcyA9IHVzYWdlTm90ZXM7Ci0JCXVzYWdlTm90ZXMgPSBuZXdVc2FnZU5vdGVzOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLlBST0NFU1NfREVTQ1JJUFRJT05fX1VTQUdFX05PVEVTLCBvbGRVc2FnZU5vdGVzLAotCQkJCQl1c2FnZU5vdGVzKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19ERVNDUklQVElPTl9fU0NPUEU6Ci0JCQlyZXR1cm4gZ2V0U2NvcGUoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfREVTQ1JJUFRJT05fX1VTQUdFX05PVEVTOgotCQkJcmV0dXJuIGdldFVzYWdlTm90ZXMoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19ERVNDUklQVElPTl9fU0NPUEU6Ci0JCQlzZXRTY29wZSgoU3RyaW5nKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0RFU0NSSVBUSU9OX19VU0FHRV9OT1RFUzoKLQkJCXNldFVzYWdlTm90ZXMoKFN0cmluZykgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfREVTQ1JJUFRJT05fX1NDT1BFOgotCQkJc2V0U2NvcGUoU0NPUEVfRURFRkFVTFQpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19ERVNDUklQVElPTl9fVVNBR0VfTk9URVM6Ci0JCQlzZXRVc2FnZU5vdGVzKFVTQUdFX05PVEVTX0VERUZBVUxUKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQkvL1VNQS0tPgotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IGdldEZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlKGZlYXR1cmVJRCk7Ci0JCWlmIChmZWF0dXJlICE9IG51bGwpIHsKLQkJCXJldHVybiBpc0ZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlU2V0KGZlYXR1cmUpOwotCQl9Ci0JCS8vVU1BPC0tCQkKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfREVTQ1JJUFRJT05fX1NDT1BFOgotCQkJcmV0dXJuIFNDT1BFX0VERUZBVUxUID09IG51bGwgPyBzY29wZSAhPSBudWxsIDogIVNDT1BFX0VERUZBVUxUCi0JCQkJCS5lcXVhbHMoc2NvcGUpOwotCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19ERVNDUklQVElPTl9fVVNBR0VfTk9URVM6Ci0JCQlyZXR1cm4gVVNBR0VfTk9URVNfRURFRkFVTFQgPT0gbnVsbCA/IHVzYWdlTm90ZXMgIT0gbnVsbAotCQkJCQk6ICFVU0FHRV9OT1RFU19FREVGQVVMVC5lcXVhbHModXNhZ2VOb3Rlcyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKQotCQkJcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoc2NvcGU6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoc2NvcGUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHVzYWdlTm90ZXM6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQodXNhZ2VOb3Rlcyk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL1Byb2Nlc3NEZXNjcmlwdGlvbkltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Qcm9jZXNzRWxlbWVudEltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Qcm9jZXNzRWxlbWVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWM3MmQ5Yy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvUHJvY2Vzc0VsZW1lbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0VsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UHJvY2VzcyBFbGVtZW50PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgUHJvY2Vzc0VsZW1lbnRJbXBsIGV4dGVuZHMgRGVzY3JpYmFibGVFbGVtZW50SW1wbAotCQlpbXBsZW1lbnRzIFByb2Nlc3NFbGVtZW50IHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBQcm9jZXNzRWxlbWVudEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJLy9VTUEtLT4KLQkJcmVhc3NpZ25EZWZhdWx0VmFsdWVzKCk7Ci0JCS8vVU1BPC0tICAKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuUFJPQ0VTU19FTEVNRU5UOwotCX0KLQotfSAvL1Byb2Nlc3NFbGVtZW50SW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1Byb2Nlc3NGYW1pbHlJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvUHJvY2Vzc0ZhbWlseUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTBkMDk0ZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvUHJvY2Vzc0ZhbWlseUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdFJlc29sdmluZ0VMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcnlQcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0ZhbWlseTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Qcm9jZXNzIEZhbWlseTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlByb2Nlc3NGYW1pbHlJbXBsI2dldERlbGl2ZXJ5UHJvY2Vzc2VzIDxlbT5EZWxpdmVyeSBQcm9jZXNzZXM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9jZXNzRmFtaWx5SW1wbCBleHRlbmRzIE1ldGhvZENvbmZpZ3VyYXRpb25JbXBsIGltcGxlbWVudHMKLQkJUHJvY2Vzc0ZhbWlseSB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZWxpdmVyeVByb2Nlc3NlcygpIDxlbT5EZWxpdmVyeSBQcm9jZXNzZXM8L2VtPn0nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGVsaXZlcnlQcm9jZXNzZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxEZWxpdmVyeVByb2Nlc3M+IGRlbGl2ZXJ5UHJvY2Vzc2VzOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFByb2Nlc3NGYW1pbHlJbXBsKCkgewotCQlzdXBlcigpOwotCi0JCS8vVU1BLS0+Ci0JCXJlYXNzaWduRGVmYXVsdFZhbHVlcygpOwotCQkvL1VNQTwtLSAgCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLlBST0NFU1NfRkFNSUxZOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0PERlbGl2ZXJ5UHJvY2Vzcz4gZ2V0RGVsaXZlcnlQcm9jZXNzZXMoKSB7Ci0JCWlmIChkZWxpdmVyeVByb2Nlc3NlcyA9PSBudWxsKSB7Ci0JCQlkZWxpdmVyeVByb2Nlc3NlcyA9IG5ldyBFT2JqZWN0UmVzb2x2aW5nRUxpc3Q8RGVsaXZlcnlQcm9jZXNzPigKLQkJCQkJRGVsaXZlcnlQcm9jZXNzLmNsYXNzLCB0aGlzLAotCQkJCQlVbWFQYWNrYWdlLlBST0NFU1NfRkFNSUxZX19ERUxJVkVSWV9QUk9DRVNTRVMpOwotCQl9Ci0JCXJldHVybiBkZWxpdmVyeVByb2Nlc3NlczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0ZBTUlMWV9fREVMSVZFUllfUFJPQ0VTU0VTOgotCQkJcmV0dXJuIGdldERlbGl2ZXJ5UHJvY2Vzc2VzKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfRkFNSUxZX19ERUxJVkVSWV9QUk9DRVNTRVM6Ci0JCQlnZXREZWxpdmVyeVByb2Nlc3NlcygpLmNsZWFyKCk7Ci0JCQlnZXREZWxpdmVyeVByb2Nlc3NlcygpLmFkZEFsbCgKLQkJCQkJKENvbGxlY3Rpb248PyBleHRlbmRzIERlbGl2ZXJ5UHJvY2Vzcz4pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0ZBTUlMWV9fREVMSVZFUllfUFJPQ0VTU0VTOgotCQkJZ2V0RGVsaXZlcnlQcm9jZXNzZXMoKS5jbGVhcigpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCS8vVU1BLS0+Ci0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gZ2V0RmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWUoZmVhdHVyZUlEKTsKLQkJaWYgKGZlYXR1cmUgIT0gbnVsbCkgewotCQkJcmV0dXJuIGlzRmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWVTZXQoZmVhdHVyZSk7Ci0JCX0KLQkJLy9VTUE8LS0JCQotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19GQU1JTFlfX0RFTElWRVJZX1BST0NFU1NFUzoKLQkJCXJldHVybiBkZWxpdmVyeVByb2Nlc3NlcyAhPSBudWxsICYmICFkZWxpdmVyeVByb2Nlc3Nlcy5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotfSAvL1Byb2Nlc3NGYW1pbHlJbXBsCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvUHJvY2Vzc0ltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Qcm9jZXNzSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYmY1OTFlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Qcm9jZXNzSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjY2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0UmVzb2x2aW5nRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DYXBhYmlsaXR5UGF0dGVybjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UHJvY2VzczwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlByb2Nlc3NJbXBsI2dldEluY2x1ZGVzUGF0dGVybnMgPGVtPkluY2x1ZGVzIFBhdHRlcm5zPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUHJvY2Vzc0ltcGwjZ2V0RGVmYXVsdENvbnRleHQgPGVtPkRlZmF1bHQgQ29udGV4dDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlByb2Nlc3NJbXBsI2dldFZhbGlkQ29udGV4dCA8ZW0+VmFsaWQgQ29udGV4dDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFByb2Nlc3NJbXBsIGV4dGVuZHMgQWN0aXZpdHlJbXBsIGltcGxlbWVudHMKLQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEluY2x1ZGVzUGF0dGVybnMoKSA8ZW0+SW5jbHVkZXMgUGF0dGVybnM8L2VtPn0nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SW5jbHVkZXNQYXR0ZXJucygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PENhcGFiaWxpdHlQYXR0ZXJuPiBpbmNsdWRlc1BhdHRlcm5zOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVmYXVsdENvbnRleHQoKSA8ZW0+RGVmYXVsdCBDb250ZXh0PC9lbT59JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREZWZhdWx0Q29udGV4dCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIE1ldGhvZENvbmZpZ3VyYXRpb24gZGVmYXVsdENvbnRleHQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWYWxpZENvbnRleHQoKSA8ZW0+VmFsaWQgQ29udGV4dDwvZW0+fScgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRWYWxpZENvbnRleHQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxNZXRob2RDb25maWd1cmF0aW9uPiB2YWxpZENvbnRleHQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUHJvY2Vzc0ltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJLy9VTUEtLT4KLQkJcmVhc3NpZ25EZWZhdWx0VmFsdWVzKCk7Ci0JCS8vVU1BPC0tICAKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuUFJPQ0VTUzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdDxDYXBhYmlsaXR5UGF0dGVybj4gZ2V0SW5jbHVkZXNQYXR0ZXJucygpIHsKLQkJaWYgKGluY2x1ZGVzUGF0dGVybnMgPT0gbnVsbCkgewotCQkJaW5jbHVkZXNQYXR0ZXJucyA9IG5ldyBFT2JqZWN0UmVzb2x2aW5nRUxpc3Q8Q2FwYWJpbGl0eVBhdHRlcm4+KAotCQkJCQlDYXBhYmlsaXR5UGF0dGVybi5jbGFzcywgdGhpcywKLQkJCQkJVW1hUGFja2FnZS5QUk9DRVNTX19JTkNMVURFU19QQVRURVJOUyk7Ci0JCX0KLQkJcmV0dXJuIGluY2x1ZGVzUGF0dGVybnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE1ldGhvZENvbmZpZ3VyYXRpb24gZ2V0RGVmYXVsdENvbnRleHQoKSB7Ci0JCWlmIChkZWZhdWx0Q29udGV4dCAhPSBudWxsICYmICgoRU9iamVjdCkgZGVmYXVsdENvbnRleHQpLmVJc1Byb3h5KCkpIHsKLQkJCUludGVybmFsRU9iamVjdCBvbGREZWZhdWx0Q29udGV4dCA9IChJbnRlcm5hbEVPYmplY3QpIGRlZmF1bHRDb250ZXh0OwotCQkJZGVmYXVsdENvbnRleHQgPSAoTWV0aG9kQ29uZmlndXJhdGlvbikgZVJlc29sdmVQcm94eShvbGREZWZhdWx0Q29udGV4dCk7Ci0JCQlpZiAoZGVmYXVsdENvbnRleHQgIT0gb2xkRGVmYXVsdENvbnRleHQpIHsKLQkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLAotCQkJCQkJCVVtYVBhY2thZ2UuUFJPQ0VTU19fREVGQVVMVF9DT05URVhULAotCQkJCQkJCW9sZERlZmF1bHRDb250ZXh0LCBkZWZhdWx0Q29udGV4dCkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBkZWZhdWx0Q29udGV4dDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTWV0aG9kQ29uZmlndXJhdGlvbiBiYXNpY0dldERlZmF1bHRDb250ZXh0KCkgewotCQlyZXR1cm4gZGVmYXVsdENvbnRleHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGVmYXVsdENvbnRleHQoTWV0aG9kQ29uZmlndXJhdGlvbiBuZXdEZWZhdWx0Q29udGV4dCkgewotCQlNZXRob2RDb25maWd1cmF0aW9uIG9sZERlZmF1bHRDb250ZXh0ID0gZGVmYXVsdENvbnRleHQ7Ci0JCWRlZmF1bHRDb250ZXh0ID0gbmV3RGVmYXVsdENvbnRleHQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuUFJPQ0VTU19fREVGQVVMVF9DT05URVhULCBvbGREZWZhdWx0Q29udGV4dCwKLQkJCQkJZGVmYXVsdENvbnRleHQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdDxNZXRob2RDb25maWd1cmF0aW9uPiBnZXRWYWxpZENvbnRleHQoKSB7Ci0JCWlmICh2YWxpZENvbnRleHQgPT0gbnVsbCkgewotCQkJdmFsaWRDb250ZXh0ID0gbmV3IEVPYmplY3RSZXNvbHZpbmdFTGlzdDxNZXRob2RDb25maWd1cmF0aW9uPigKLQkJCQkJTWV0aG9kQ29uZmlndXJhdGlvbi5jbGFzcywgdGhpcywKLQkJCQkJVW1hUGFja2FnZS5QUk9DRVNTX19WQUxJRF9DT05URVhUKTsKLQkJfQotCQlyZXR1cm4gdmFsaWRDb250ZXh0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfX0lOQ0xVREVTX1BBVFRFUk5TOgotCQkJcmV0dXJuIGdldEluY2x1ZGVzUGF0dGVybnMoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfX0RFRkFVTFRfQ09OVEVYVDoKLQkJCWlmIChyZXNvbHZlKQotCQkJCXJldHVybiBnZXREZWZhdWx0Q29udGV4dCgpOwotCQkJcmV0dXJuIGJhc2ljR2V0RGVmYXVsdENvbnRleHQoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfX1ZBTElEX0NPTlRFWFQ6Ci0JCQlyZXR1cm4gZ2V0VmFsaWRDb250ZXh0KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfX0lOQ0xVREVTX1BBVFRFUk5TOgotCQkJZ2V0SW5jbHVkZXNQYXR0ZXJucygpLmNsZWFyKCk7Ci0JCQlnZXRJbmNsdWRlc1BhdHRlcm5zKCkuYWRkQWxsKAotCQkJCQkoQ29sbGVjdGlvbjw/IGV4dGVuZHMgQ2FwYWJpbGl0eVBhdHRlcm4+KSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX19ERUZBVUxUX0NPTlRFWFQ6Ci0JCQlzZXREZWZhdWx0Q29udGV4dCgoTWV0aG9kQ29uZmlndXJhdGlvbikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19fVkFMSURfQ09OVEVYVDoKLQkJCWdldFZhbGlkQ29udGV4dCgpLmNsZWFyKCk7Ci0JCQlnZXRWYWxpZENvbnRleHQoKS5hZGRBbGwoCi0JCQkJCShDb2xsZWN0aW9uPD8gZXh0ZW5kcyBNZXRob2RDb25maWd1cmF0aW9uPikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfX0lOQ0xVREVTX1BBVFRFUk5TOgotCQkJZ2V0SW5jbHVkZXNQYXR0ZXJucygpLmNsZWFyKCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX19ERUZBVUxUX0NPTlRFWFQ6Ci0JCQlzZXREZWZhdWx0Q29udGV4dCgoTWV0aG9kQ29uZmlndXJhdGlvbikgbnVsbCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX19WQUxJRF9DT05URVhUOgotCQkJZ2V0VmFsaWRDb250ZXh0KCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQkvL1VNQS0tPgotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IGdldEZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlKGZlYXR1cmVJRCk7Ci0JCWlmIChmZWF0dXJlICE9IG51bGwpIHsKLQkJCXJldHVybiBpc0ZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlU2V0KGZlYXR1cmUpOwotCQl9Ci0JCS8vVU1BPC0tCQkKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfX0lOQ0xVREVTX1BBVFRFUk5TOgotCQkJcmV0dXJuIGluY2x1ZGVzUGF0dGVybnMgIT0gbnVsbCAmJiAhaW5jbHVkZXNQYXR0ZXJucy5pc0VtcHR5KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX19ERUZBVUxUX0NPTlRFWFQ6Ci0JCQlyZXR1cm4gZGVmYXVsdENvbnRleHQgIT0gbnVsbDsKLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfX1ZBTElEX0NPTlRFWFQ6Ci0JCQlyZXR1cm4gdmFsaWRDb250ZXh0ICE9IG51bGwgJiYgIXZhbGlkQ29udGV4dC5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotfSAvL1Byb2Nlc3NJbXBsCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvUHJvY2Vzc1BhY2thZ2VJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvUHJvY2Vzc1BhY2thZ2VJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhMjA3NTAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1Byb2Nlc3NQYWNrYWdlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0VsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Qcm9jZXNzIFBhY2thZ2U8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Qcm9jZXNzUGFja2FnZUltcGwjZ2V0UHJvY2Vzc0VsZW1lbnRzIDxlbT5Qcm9jZXNzIEVsZW1lbnRzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUHJvY2Vzc1BhY2thZ2VJbXBsI2dldERpYWdyYW1zIDxlbT5EaWFncmFtczwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFByb2Nlc3NQYWNrYWdlSW1wbCBleHRlbmRzIE1ldGhvZFBhY2thZ2VJbXBsIGltcGxlbWVudHMKLQkJUHJvY2Vzc1BhY2thZ2UgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJvY2Vzc0VsZW1lbnRzKCkgPGVtPlByb2Nlc3MgRWxlbWVudHM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UHJvY2Vzc0VsZW1lbnRzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8UHJvY2Vzc0VsZW1lbnQ+IHByb2Nlc3NFbGVtZW50czsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERpYWdyYW1zKCkgPGVtPkRpYWdyYW1zPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERpYWdyYW1zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8RGlhZ3JhbT4gZGlhZ3JhbXM7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUHJvY2Vzc1BhY2thZ2VJbXBsKCkgewotCQlzdXBlcigpOwotCi0JCS8vVU1BLS0+Ci0JCXJlYXNzaWduRGVmYXVsdFZhbHVlcygpOwotCQkvL1VNQTwtLSAgCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLlBST0NFU1NfUEFDS0FHRTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdDxQcm9jZXNzRWxlbWVudD4gZ2V0UHJvY2Vzc0VsZW1lbnRzKCkgewotCQlpZiAocHJvY2Vzc0VsZW1lbnRzID09IG51bGwpIHsKLQkJCXByb2Nlc3NFbGVtZW50cyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdC5SZXNvbHZpbmc8UHJvY2Vzc0VsZW1lbnQ+KAotCQkJCQlQcm9jZXNzRWxlbWVudC5jbGFzcywgdGhpcywKLQkJCQkJVW1hUGFja2FnZS5QUk9DRVNTX1BBQ0tBR0VfX1BST0NFU1NfRUxFTUVOVFMpOwotCQl9Ci0JCXJldHVybiBwcm9jZXNzRWxlbWVudHM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3Q8RGlhZ3JhbT4gZ2V0RGlhZ3JhbXMoKSB7Ci0JCWlmIChkaWFncmFtcyA9PSBudWxsKSB7Ci0JCQlkaWFncmFtcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdC5SZXNvbHZpbmc8RGlhZ3JhbT4oCi0JCQkJCURpYWdyYW0uY2xhc3MsIHRoaXMsIFVtYVBhY2thZ2UuUFJPQ0VTU19QQUNLQUdFX19ESUFHUkFNUyk7Ci0JCX0KLQkJcmV0dXJuIGRpYWdyYW1zOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsCi0JCQlpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX1BBQ0tBR0VfX1BST0NFU1NfRUxFTUVOVFM6Ci0JCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KSBnZXRQcm9jZXNzRWxlbWVudHMoKSkuYmFzaWNSZW1vdmUoCi0JCQkJCW90aGVyRW5kLCBtc2dzKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfUEFDS0FHRV9fRElBR1JBTVM6Ci0JCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KSBnZXREaWFncmFtcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwKLQkJCQkJbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfUEFDS0FHRV9fUFJPQ0VTU19FTEVNRU5UUzoKLQkJCXJldHVybiBnZXRQcm9jZXNzRWxlbWVudHMoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfUEFDS0FHRV9fRElBR1JBTVM6Ci0JCQlyZXR1cm4gZ2V0RGlhZ3JhbXMoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19QQUNLQUdFX19QUk9DRVNTX0VMRU1FTlRTOgotCQkJZ2V0UHJvY2Vzc0VsZW1lbnRzKCkuY2xlYXIoKTsKLQkJCWdldFByb2Nlc3NFbGVtZW50cygpLmFkZEFsbCgKLQkJCQkJKENvbGxlY3Rpb248PyBleHRlbmRzIFByb2Nlc3NFbGVtZW50PikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19QQUNLQUdFX19ESUFHUkFNUzoKLQkJCWdldERpYWdyYW1zKCkuY2xlYXIoKTsKLQkJCWdldERpYWdyYW1zKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBEaWFncmFtPikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfUEFDS0FHRV9fUFJPQ0VTU19FTEVNRU5UUzoKLQkJCWdldFByb2Nlc3NFbGVtZW50cygpLmNsZWFyKCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX1BBQ0tBR0VfX0RJQUdSQU1TOgotCQkJZ2V0RGlhZ3JhbXMoKS5jbGVhcigpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCS8vVU1BLS0+Ci0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gZ2V0RmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWUoZmVhdHVyZUlEKTsKLQkJaWYgKGZlYXR1cmUgIT0gbnVsbCkgewotCQkJcmV0dXJuIGlzRmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWVTZXQoZmVhdHVyZSk7Ci0JCX0KLQkJLy9VTUE8LS0JCQotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19QQUNLQUdFX19QUk9DRVNTX0VMRU1FTlRTOgotCQkJcmV0dXJuIHByb2Nlc3NFbGVtZW50cyAhPSBudWxsICYmICFwcm9jZXNzRWxlbWVudHMuaXNFbXB0eSgpOwotCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19QQUNLQUdFX19ESUFHUkFNUzoKLQkJCXJldHVybiBkaWFncmFtcyAhPSBudWxsICYmICFkaWFncmFtcy5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotfSAvL1Byb2Nlc3NQYWNrYWdlSW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1Byb2Nlc3NQbGFubmluZ1RlbXBsYXRlSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1Byb2Nlc3NQbGFubmluZ1RlbXBsYXRlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OTJmYTQ3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Qcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdFJlc29sdmluZ0VMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UHJvY2VzcyBQbGFubmluZyBUZW1wbGF0ZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlByb2Nlc3NQbGFubmluZ1RlbXBsYXRlSW1wbCNnZXRCYXNlZE9uUHJvY2Vzc2VzIDxlbT5CYXNlZCBPbiBQcm9jZXNzZXM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZUltcGwgZXh0ZW5kcyBQcm9jZXNzSW1wbCBpbXBsZW1lbnRzCi0JCVByb2Nlc3NQbGFubmluZ1RlbXBsYXRlIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEJhc2VkT25Qcm9jZXNzZXMoKSA8ZW0+QmFzZWQgT24gUHJvY2Vzc2VzPC9lbT59JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEJhc2VkT25Qcm9jZXNzZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M+IGJhc2VkT25Qcm9jZXNzZXM7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGVJbXBsKCkgewotCQlzdXBlcigpOwotCi0JCS8vVU1BLS0+Ci0JCXJlYXNzaWduRGVmYXVsdFZhbHVlcygpOwotCQkvL1VNQTwtLSAgCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLlBST0NFU1NfUExBTk5JTkdfVEVNUExBVEU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3Q8b3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzPiBnZXRCYXNlZE9uUHJvY2Vzc2VzKCkgewotCQlpZiAoYmFzZWRPblByb2Nlc3NlcyA9PSBudWxsKSB7Ci0JCQliYXNlZE9uUHJvY2Vzc2VzID0gbmV3IEVPYmplY3RSZXNvbHZpbmdFTGlzdDxvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M+KAotCQkJCQlvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3MuY2xhc3MsIHRoaXMsCi0JCQkJCVVtYVBhY2thZ2UuUFJPQ0VTU19QTEFOTklOR19URU1QTEFURV9fQkFTRURfT05fUFJPQ0VTU0VTKTsKLQkJfQotCQlyZXR1cm4gYmFzZWRPblByb2Nlc3NlczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19CQVNFRF9PTl9QUk9DRVNTRVM6Ci0JCQlyZXR1cm4gZ2V0QmFzZWRPblByb2Nlc3NlcygpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19CQVNFRF9PTl9QUk9DRVNTRVM6Ci0JCQlnZXRCYXNlZE9uUHJvY2Vzc2VzKCkuY2xlYXIoKTsKLQkJCWdldEJhc2VkT25Qcm9jZXNzZXMoKQotCQkJCQkuYWRkQWxsKAotCQkJCQkJCShDb2xsZWN0aW9uPD8gZXh0ZW5kcyBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M+KSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19QTEFOTklOR19URU1QTEFURV9fQkFTRURfT05fUFJPQ0VTU0VTOgotCQkJZ2V0QmFzZWRPblByb2Nlc3NlcygpLmNsZWFyKCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJLy9VTUEtLT4KLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBnZXRGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZShmZWF0dXJlSUQpOwotCQlpZiAoZmVhdHVyZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gaXNGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZVNldChmZWF0dXJlKTsKLQkJfQotCQkvL1VNQTwtLQkJCi0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19CQVNFRF9PTl9QUk9DRVNTRVM6Ci0JCQlyZXR1cm4gYmFzZWRPblByb2Nlc3NlcyAhPSBudWxsICYmICFiYXNlZE9uUHJvY2Vzc2VzLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi19IC8vUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGVJbXBsCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvUHJvcGVydHlJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvUHJvcGVydHlJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwZjNlMDIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1Byb3BlcnR5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQ0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Qcm9wZXJ0eTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlByb3BlcnR5SW1wbCNnZXRLZXkgPGVtPktleTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlByb3BlcnR5SW1wbCNnZXRWYWx1ZSA8ZW0+VmFsdWU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9wZXJ0eUltcGwgZXh0ZW5kcyBEaWFncmFtRWxlbWVudEltcGwgaW1wbGVtZW50cyBQcm9wZXJ0eSB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0S2V5KCkgPGVtPktleTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0S2V5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfRURFRkFVTFQgPSAiIjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEtleSgpIDxlbT5LZXk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEtleSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBrZXkgPSBLRVlfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmFsdWUoKSA8ZW0+VmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFZhbHVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxVRV9FREVGQVVMVCA9ICIiOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmFsdWUoKSA8ZW0+VmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFZhbHVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHZhbHVlID0gVkFMVUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUHJvcGVydHlJbXBsKCkgewotCQlzdXBlcigpOwotCi0JCS8vVU1BLS0+Ci0JCXJlYXNzaWduRGVmYXVsdFZhbHVlcygpOwotCQkvL1VNQTwtLSAgCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLlBST1BFUlRZOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0S2V5KCkgewotCQlyZXR1cm4ga2V5OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEtleShTdHJpbmcgbmV3S2V5KSB7Ci0JCVN0cmluZyBvbGRLZXkgPSBrZXk7Ci0JCWtleSA9IG5ld0tleTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5QUk9QRVJUWV9fS0VZLCBvbGRLZXksIGtleSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKSB7Ci0JCXJldHVybiB2YWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShTdHJpbmcgbmV3VmFsdWUpIHsKLQkJU3RyaW5nIG9sZFZhbHVlID0gdmFsdWU7Ci0JCXZhbHVlID0gbmV3VmFsdWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuUFJPUEVSVFlfX1ZBTFVFLCBvbGRWYWx1ZSwgdmFsdWUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9QRVJUWV9fS0VZOgotCQkJcmV0dXJuIGdldEtleSgpOwotCQljYXNlIFVtYVBhY2thZ2UuUFJPUEVSVFlfX1ZBTFVFOgotCQkJcmV0dXJuIGdldFZhbHVlKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlBST1BFUlRZX19LRVk6Ci0JCQlzZXRLZXkoKFN0cmluZykgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuUFJPUEVSVFlfX1ZBTFVFOgotCQkJc2V0VmFsdWUoKFN0cmluZykgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlBST1BFUlRZX19LRVk6Ci0JCQlzZXRLZXkoS0VZX0VERUZBVUxUKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlBST1BFUlRZX19WQUxVRToKLQkJCXNldFZhbHVlKFZBTFVFX0VERUZBVUxUKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQkvL1VNQS0tPgotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IGdldEZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlKGZlYXR1cmVJRCk7Ci0JCWlmIChmZWF0dXJlICE9IG51bGwpIHsKLQkJCXJldHVybiBpc0ZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlU2V0KGZlYXR1cmUpOwotCQl9Ci0JCS8vVU1BPC0tCQkKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlBST1BFUlRZX19LRVk6Ci0JCQlyZXR1cm4gS0VZX0VERUZBVUxUID09IG51bGwgPyBrZXkgIT0gbnVsbCA6ICFLRVlfRURFRkFVTFQKLQkJCQkJLmVxdWFscyhrZXkpOwotCQljYXNlIFVtYVBhY2thZ2UuUFJPUEVSVFlfX1ZBTFVFOgotCQkJcmV0dXJuIFZBTFVFX0VERUZBVUxUID09IG51bGwgPyB2YWx1ZSAhPSBudWxsIDogIVZBTFVFX0VERUZBVUxUCi0JCQkJCS5lcXVhbHModmFsdWUpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkKLQkJCXJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGtleTogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChrZXkpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHZhbHVlOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKHZhbHVlKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vUHJvcGVydHlJbXBsCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvUmVmZXJlbmNlSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1JlZmVyZW5jZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTBiZDFkZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvUmVmZXJlbmNlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzI2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW1FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlJlZmVyZW5jZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlJlZmVyZW5jZUltcGwjZ2V0SXNJbmRpdmlkdWFsUmVwcmVzZW50YXRpb24gPGVtPklzIEluZGl2aWR1YWwgUmVwcmVzZW50YXRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5SZWZlcmVuY2VJbXBsI2dldFJlZmVyZW5jZWQgPGVtPlJlZmVyZW5jZWQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBSZWZlcmVuY2VJbXBsIGV4dGVuZHMgRGlhZ3JhbUVsZW1lbnRJbXBsIGltcGxlbWVudHMgUmVmZXJlbmNlIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJc0luZGl2aWR1YWxSZXByZXNlbnRhdGlvbigpIDxlbT5JcyBJbmRpdmlkdWFsIFJlcHJlc2VudGF0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJc0luZGl2aWR1YWxSZXByZXNlbnRhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCb29sZWFuIElTX0lORElWSURVQUxfUkVQUkVTRU5UQVRJT05fRURFRkFVTFQgPSBCb29sZWFuLkZBTFNFOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SXNJbmRpdmlkdWFsUmVwcmVzZW50YXRpb24oKSA8ZW0+SXMgSW5kaXZpZHVhbCBSZXByZXNlbnRhdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SXNJbmRpdmlkdWFsUmVwcmVzZW50YXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCb29sZWFuIGlzSW5kaXZpZHVhbFJlcHJlc2VudGF0aW9uID0gSVNfSU5ESVZJRFVBTF9SRVBSRVNFTlRBVElPTl9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlZmVyZW5jZWQoKSA8ZW0+UmVmZXJlbmNlZDwvZW0+fScgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmVmZXJlbmNlZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIERpYWdyYW1FbGVtZW50IHJlZmVyZW5jZWQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUmVmZXJlbmNlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQotCQkvL1VNQS0tPgotCQlyZWFzc2lnbkRlZmF1bHRWYWx1ZXMoKTsKLQkJLy9VTUE8LS0gIAotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5SRUZFUkVOQ0U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJvb2xlYW4gZ2V0SXNJbmRpdmlkdWFsUmVwcmVzZW50YXRpb24oKSB7Ci0JCXJldHVybiBpc0luZGl2aWR1YWxSZXByZXNlbnRhdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJc0luZGl2aWR1YWxSZXByZXNlbnRhdGlvbigKLQkJCUJvb2xlYW4gbmV3SXNJbmRpdmlkdWFsUmVwcmVzZW50YXRpb24pIHsKLQkJQm9vbGVhbiBvbGRJc0luZGl2aWR1YWxSZXByZXNlbnRhdGlvbiA9IGlzSW5kaXZpZHVhbFJlcHJlc2VudGF0aW9uOwotCQlpc0luZGl2aWR1YWxSZXByZXNlbnRhdGlvbiA9IG5ld0lzSW5kaXZpZHVhbFJlcHJlc2VudGF0aW9uOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLlJFRkVSRU5DRV9fSVNfSU5ESVZJRFVBTF9SRVBSRVNFTlRBVElPTiwKLQkJCQkJb2xkSXNJbmRpdmlkdWFsUmVwcmVzZW50YXRpb24sIGlzSW5kaXZpZHVhbFJlcHJlc2VudGF0aW9uKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERpYWdyYW1FbGVtZW50IGdldFJlZmVyZW5jZWQoKSB7Ci0JCWlmIChyZWZlcmVuY2VkICE9IG51bGwgJiYgKChFT2JqZWN0KSByZWZlcmVuY2VkKS5lSXNQcm94eSgpKSB7Ci0JCQlJbnRlcm5hbEVPYmplY3Qgb2xkUmVmZXJlbmNlZCA9IChJbnRlcm5hbEVPYmplY3QpIHJlZmVyZW5jZWQ7Ci0JCQlyZWZlcmVuY2VkID0gKERpYWdyYW1FbGVtZW50KSBlUmVzb2x2ZVByb3h5KG9sZFJlZmVyZW5jZWQpOwotCQkJaWYgKHJlZmVyZW5jZWQgIT0gb2xkUmVmZXJlbmNlZCkgewotCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlJFU09MVkUsCi0JCQkJCQkJVW1hUGFja2FnZS5SRUZFUkVOQ0VfX1JFRkVSRU5DRUQsIG9sZFJlZmVyZW5jZWQsCi0JCQkJCQkJcmVmZXJlbmNlZCkpOwotCQkJfQotCQl9Ci0JCXJldHVybiByZWZlcmVuY2VkOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEaWFncmFtRWxlbWVudCBiYXNpY0dldFJlZmVyZW5jZWQoKSB7Ci0JCXJldHVybiByZWZlcmVuY2VkOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldFJlZmVyZW5jZWQoRGlhZ3JhbUVsZW1lbnQgbmV3UmVmZXJlbmNlZCwKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJRGlhZ3JhbUVsZW1lbnQgb2xkUmVmZXJlbmNlZCA9IHJlZmVyZW5jZWQ7Ci0JCXJlZmVyZW5jZWQgPSBuZXdSZWZlcmVuY2VkOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLAotCQkJCQlOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLlJFRkVSRU5DRV9fUkVGRVJFTkNFRCwKLQkJCQkJb2xkUmVmZXJlbmNlZCwgbmV3UmVmZXJlbmNlZCk7Ci0JCQlpZiAobXNncyA9PSBudWxsKQotCQkJCW1zZ3MgPSBub3RpZmljYXRpb247Ci0JCQllbHNlCi0JCQkJbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZWZlcmVuY2VkKERpYWdyYW1FbGVtZW50IG5ld1JlZmVyZW5jZWQpIHsKLQkJaWYgKG5ld1JlZmVyZW5jZWQgIT0gcmVmZXJlbmNlZCkgewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAocmVmZXJlbmNlZCAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCkgcmVmZXJlbmNlZCkuZUludmVyc2VSZW1vdmUodGhpcywKLQkJCQkJCVVtYVBhY2thZ2UuRElBR1JBTV9FTEVNRU5UX19SRUZFUkVOQ0UsCi0JCQkJCQlEaWFncmFtRWxlbWVudC5jbGFzcywgbXNncyk7Ci0JCQlpZiAobmV3UmVmZXJlbmNlZCAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCkgbmV3UmVmZXJlbmNlZCkuZUludmVyc2VBZGQodGhpcywKLQkJCQkJCVVtYVBhY2thZ2UuRElBR1JBTV9FTEVNRU5UX19SRUZFUkVOQ0UsCi0JCQkJCQlEaWFncmFtRWxlbWVudC5jbGFzcywgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRSZWZlcmVuY2VkKG5ld1JlZmVyZW5jZWQsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkKLQkJCQltc2dzLmRpc3BhdGNoKCk7Ci0JCX0gZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLlJFRkVSRU5DRV9fUkVGRVJFTkNFRCwgbmV3UmVmZXJlbmNlZCwKLQkJCQkJbmV3UmVmZXJlbmNlZCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZUFkZChJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsCi0JCQlpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5SRUZFUkVOQ0VfX1JFRkVSRU5DRUQ6Ci0JCQlpZiAocmVmZXJlbmNlZCAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCkgcmVmZXJlbmNlZCkuZUludmVyc2VSZW1vdmUodGhpcywKLQkJCQkJCVVtYVBhY2thZ2UuRElBR1JBTV9FTEVNRU5UX19SRUZFUkVOQ0UsCi0JCQkJCQlEaWFncmFtRWxlbWVudC5jbGFzcywgbXNncyk7Ci0JCQlyZXR1cm4gYmFzaWNTZXRSZWZlcmVuY2VkKChEaWFncmFtRWxlbWVudCkgb3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZUFkZChvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLAotCQkJaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuUkVGRVJFTkNFX19SRUZFUkVOQ0VEOgotCQkJcmV0dXJuIGJhc2ljU2V0UmVmZXJlbmNlZChudWxsLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuUkVGRVJFTkNFX19JU19JTkRJVklEVUFMX1JFUFJFU0VOVEFUSU9OOgotCQkJcmV0dXJuIGdldElzSW5kaXZpZHVhbFJlcHJlc2VudGF0aW9uKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5SRUZFUkVOQ0VfX1JFRkVSRU5DRUQ6Ci0JCQlpZiAocmVzb2x2ZSkKLQkJCQlyZXR1cm4gZ2V0UmVmZXJlbmNlZCgpOwotCQkJcmV0dXJuIGJhc2ljR2V0UmVmZXJlbmNlZCgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5SRUZFUkVOQ0VfX0lTX0lORElWSURVQUxfUkVQUkVTRU5UQVRJT046Ci0JCQlzZXRJc0luZGl2aWR1YWxSZXByZXNlbnRhdGlvbigoQm9vbGVhbikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuUkVGRVJFTkNFX19SRUZFUkVOQ0VEOgotCQkJc2V0UmVmZXJlbmNlZCgoRGlhZ3JhbUVsZW1lbnQpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5SRUZFUkVOQ0VfX0lTX0lORElWSURVQUxfUkVQUkVTRU5UQVRJT046Ci0JCQlzZXRJc0luZGl2aWR1YWxSZXByZXNlbnRhdGlvbihJU19JTkRJVklEVUFMX1JFUFJFU0VOVEFUSU9OX0VERUZBVUxUKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlJFRkVSRU5DRV9fUkVGRVJFTkNFRDoKLQkJCXNldFJlZmVyZW5jZWQoKERpYWdyYW1FbGVtZW50KSBudWxsKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQkvL1VNQS0tPgotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IGdldEZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlKGZlYXR1cmVJRCk7Ci0JCWlmIChmZWF0dXJlICE9IG51bGwpIHsKLQkJCXJldHVybiBpc0ZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlU2V0KGZlYXR1cmUpOwotCQl9Ci0JCS8vVU1BPC0tCQkKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlJFRkVSRU5DRV9fSVNfSU5ESVZJRFVBTF9SRVBSRVNFTlRBVElPTjoKLQkJCXJldHVybiBJU19JTkRJVklEVUFMX1JFUFJFU0VOVEFUSU9OX0VERUZBVUxUID09IG51bGwgPyBpc0luZGl2aWR1YWxSZXByZXNlbnRhdGlvbiAhPSBudWxsCi0JCQkJCTogIUlTX0lORElWSURVQUxfUkVQUkVTRU5UQVRJT05fRURFRkFVTFQKLQkJCQkJCQkuZXF1YWxzKGlzSW5kaXZpZHVhbFJlcHJlc2VudGF0aW9uKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlJFRkVSRU5DRV9fUkVGRVJFTkNFRDoKLQkJCXJldHVybiByZWZlcmVuY2VkICE9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKQotCQkJcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoaXNJbmRpdmlkdWFsUmVwcmVzZW50YXRpb246ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoaXNJbmRpdmlkdWFsUmVwcmVzZW50YXRpb24pOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9SZWZlcmVuY2VJbXBsCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvUmVwb3J0SW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1JlcG9ydEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmI5YWRiYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvUmVwb3J0SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJlcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5SZXBvcnQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBSZXBvcnRJbXBsIGV4dGVuZHMgR3VpZGFuY2VJbXBsIGltcGxlbWVudHMgUmVwb3J0IHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBSZXBvcnRJbXBsKCkgewotCQlzdXBlcigpOwotCi0JCS8vVU1BLS0+Ci0JCXJlYXNzaWduRGVmYXVsdFZhbHVlcygpOwotCQkvL1VNQTwtLSAgCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLlJFUE9SVDsKLQl9Ci0KLX0gLy9SZXBvcnRJbXBsCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvUmV1c2FibGVBc3NldEltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9SZXVzYWJsZUFzc2V0SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZjM4Yzg3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9SZXVzYWJsZUFzc2V0SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJldXNhYmxlQXNzZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UmV1c2FibGUgQXNzZXQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBSZXVzYWJsZUFzc2V0SW1wbCBleHRlbmRzIEd1aWRhbmNlSW1wbCBpbXBsZW1lbnRzIFJldXNhYmxlQXNzZXQgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFJldXNhYmxlQXNzZXRJbXBsKCkgewotCQlzdXBlcigpOwotCi0JCS8vVU1BLS0+Ci0JCXJlYXNzaWduRGVmYXVsdFZhbHVlcygpOwotCQkvL1VNQTwtLSAgCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLlJFVVNBQkxFX0FTU0VUOwotCX0KLQotfSAvL1JldXNhYmxlQXNzZXRJbXBsCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvUm9hZG1hcEltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Sb2FkbWFwSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MGQ1NDQwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Sb2FkbWFwSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvYWRtYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Um9hZG1hcDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFJvYWRtYXBJbXBsIGV4dGVuZHMgR3VpZGFuY2VJbXBsIGltcGxlbWVudHMgUm9hZG1hcCB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUm9hZG1hcEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJLy9VTUEtLT4KLQkJcmVhc3NpZ25EZWZhdWx0VmFsdWVzKCk7Ci0JCS8vVU1BPC0tICAKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuUk9BRE1BUDsKLQl9Ci0KLX0gLy9Sb2FkbWFwSW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1JvbGVEZXNjcmlwdGlvbkltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Sb2xlRGVzY3JpcHRpb25JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyMGE4YTcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1JvbGVEZXNjcmlwdGlvbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwNCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlJvbGUgRGVzY3JpcHRpb248L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Sb2xlRGVzY3JpcHRpb25JbXBsI2dldFNraWxscyA8ZW0+U2tpbGxzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUm9sZURlc2NyaXB0aW9uSW1wbCNnZXRBc3NpZ25tZW50QXBwcm9hY2hlcyA8ZW0+QXNzaWdubWVudCBBcHByb2FjaGVzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUm9sZURlc2NyaXB0aW9uSW1wbCNnZXRTeW5vbnltcyA8ZW0+U3lub255bXM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBSb2xlRGVzY3JpcHRpb25JbXBsIGV4dGVuZHMgQ29udGVudERlc2NyaXB0aW9uSW1wbCBpbXBsZW1lbnRzCi0JCVJvbGVEZXNjcmlwdGlvbiB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U2tpbGxzKCkgPGVtPlNraWxsczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U2tpbGxzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBTS0lMTFNfRURFRkFVTFQgPSAiIjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNraWxscygpIDxlbT5Ta2lsbHM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFNraWxscygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBza2lsbHMgPSBTS0lMTFNfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QXNzaWdubWVudEFwcHJvYWNoZXMoKSA8ZW0+QXNzaWdubWVudCBBcHByb2FjaGVzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBc3NpZ25tZW50QXBwcm9hY2hlcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVNTSUdOTUVOVF9BUFBST0FDSEVTX0VERUZBVUxUID0gIiI7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBc3NpZ25tZW50QXBwcm9hY2hlcygpIDxlbT5Bc3NpZ25tZW50IEFwcHJvYWNoZXM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFzc2lnbm1lbnRBcHByb2FjaGVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGFzc2lnbm1lbnRBcHByb2FjaGVzID0gQVNTSUdOTUVOVF9BUFBST0FDSEVTX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFN5bm9ueW1zKCkgPGVtPlN5bm9ueW1zPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTeW5vbnltcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1lOT05ZTVNfRURFRkFVTFQgPSAiIjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFN5bm9ueW1zKCkgPGVtPlN5bm9ueW1zPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTeW5vbnltcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBzeW5vbnltcyA9IFNZTk9OWU1TX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFJvbGVEZXNjcmlwdGlvbkltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJLy9VTUEtLT4KLQkJcmVhc3NpZ25EZWZhdWx0VmFsdWVzKCk7Ci0JCS8vVU1BPC0tICAKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuUk9MRV9ERVNDUklQVElPTjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFNraWxscygpIHsKLQkJcmV0dXJuIHNraWxsczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTa2lsbHMoU3RyaW5nIG5ld1NraWxscykgewotCQlTdHJpbmcgb2xkU2tpbGxzID0gc2tpbGxzOwotCQlza2lsbHMgPSBuZXdTa2lsbHM7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuUk9MRV9ERVNDUklQVElPTl9fU0tJTExTLCBvbGRTa2lsbHMsIHNraWxscykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0QXNzaWdubWVudEFwcHJvYWNoZXMoKSB7Ci0JCXJldHVybiBhc3NpZ25tZW50QXBwcm9hY2hlczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBc3NpZ25tZW50QXBwcm9hY2hlcyhTdHJpbmcgbmV3QXNzaWdubWVudEFwcHJvYWNoZXMpIHsKLQkJU3RyaW5nIG9sZEFzc2lnbm1lbnRBcHByb2FjaGVzID0gYXNzaWdubWVudEFwcHJvYWNoZXM7Ci0JCWFzc2lnbm1lbnRBcHByb2FjaGVzID0gbmV3QXNzaWdubWVudEFwcHJvYWNoZXM7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuUk9MRV9ERVNDUklQVElPTl9fQVNTSUdOTUVOVF9BUFBST0FDSEVTLAotCQkJCQlvbGRBc3NpZ25tZW50QXBwcm9hY2hlcywgYXNzaWdubWVudEFwcHJvYWNoZXMpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFN5bm9ueW1zKCkgewotCQlyZXR1cm4gc3lub255bXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0U3lub255bXMoU3RyaW5nIG5ld1N5bm9ueW1zKSB7Ci0JCVN0cmluZyBvbGRTeW5vbnltcyA9IHN5bm9ueW1zOwotCQlzeW5vbnltcyA9IG5ld1N5bm9ueW1zOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLlJPTEVfREVTQ1JJUFRJT05fX1NZTk9OWU1TLCBvbGRTeW5vbnltcywKLQkJCQkJc3lub255bXMpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ST0xFX0RFU0NSSVBUSU9OX19TS0lMTFM6Ci0JCQlyZXR1cm4gZ2V0U2tpbGxzKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5ST0xFX0RFU0NSSVBUSU9OX19BU1NJR05NRU5UX0FQUFJPQUNIRVM6Ci0JCQlyZXR1cm4gZ2V0QXNzaWdubWVudEFwcHJvYWNoZXMoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfREVTQ1JJUFRJT05fX1NZTk9OWU1TOgotCQkJcmV0dXJuIGdldFN5bm9ueW1zKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfREVTQ1JJUFRJT05fX1NLSUxMUzoKLQkJCXNldFNraWxscygoU3RyaW5nKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5ST0xFX0RFU0NSSVBUSU9OX19BU1NJR05NRU5UX0FQUFJPQUNIRVM6Ci0JCQlzZXRBc3NpZ25tZW50QXBwcm9hY2hlcygoU3RyaW5nKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5ST0xFX0RFU0NSSVBUSU9OX19TWU5PTllNUzoKLQkJCXNldFN5bm9ueW1zKChTdHJpbmcpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ST0xFX0RFU0NSSVBUSU9OX19TS0lMTFM6Ci0JCQlzZXRTa2lsbHMoU0tJTExTX0VERUZBVUxUKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfREVTQ1JJUFRJT05fX0FTU0lHTk1FTlRfQVBQUk9BQ0hFUzoKLQkJCXNldEFzc2lnbm1lbnRBcHByb2FjaGVzKEFTU0lHTk1FTlRfQVBQUk9BQ0hFU19FREVGQVVMVCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5ST0xFX0RFU0NSSVBUSU9OX19TWU5PTllNUzoKLQkJCXNldFN5bm9ueW1zKFNZTk9OWU1TX0VERUZBVUxUKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQkvL1VNQS0tPgotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IGdldEZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlKGZlYXR1cmVJRCk7Ci0JCWlmIChmZWF0dXJlICE9IG51bGwpIHsKLQkJCXJldHVybiBpc0ZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlU2V0KGZlYXR1cmUpOwotCQl9Ci0JCS8vVU1BPC0tCQkKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfREVTQ1JJUFRJT05fX1NLSUxMUzoKLQkJCXJldHVybiBTS0lMTFNfRURFRkFVTFQgPT0gbnVsbCA/IHNraWxscyAhPSBudWxsIDogIVNLSUxMU19FREVGQVVMVAotCQkJCQkuZXF1YWxzKHNraWxscyk7Ci0JCWNhc2UgVW1hUGFja2FnZS5ST0xFX0RFU0NSSVBUSU9OX19BU1NJR05NRU5UX0FQUFJPQUNIRVM6Ci0JCQlyZXR1cm4gQVNTSUdOTUVOVF9BUFBST0FDSEVTX0VERUZBVUxUID09IG51bGwgPyBhc3NpZ25tZW50QXBwcm9hY2hlcyAhPSBudWxsCi0JCQkJCTogIUFTU0lHTk1FTlRfQVBQUk9BQ0hFU19FREVGQVVMVAotCQkJCQkJCS5lcXVhbHMoYXNzaWdubWVudEFwcHJvYWNoZXMpOwotCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9ERVNDUklQVElPTl9fU1lOT05ZTVM6Ci0JCQlyZXR1cm4gU1lOT05ZTVNfRURFRkFVTFQgPT0gbnVsbCA/IHN5bm9ueW1zICE9IG51bGwKLQkJCQkJOiAhU1lOT05ZTVNfRURFRkFVTFQuZXF1YWxzKHN5bm9ueW1zKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpCi0JCQlyZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChza2lsbHM6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoc2tpbGxzKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBhc3NpZ25tZW50QXBwcm9hY2hlczogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChhc3NpZ25tZW50QXBwcm9hY2hlcyk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgc3lub255bXM6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoc3lub255bXMpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9Sb2xlRGVzY3JpcHRpb25JbXBsCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvUm9sZURlc2NyaXB0b3JJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvUm9sZURlc2NyaXB0b3JJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyNDFjM2QuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1JvbGVEZXNjcmlwdG9ySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjc2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuQmFzaWNJbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RSZXNvbHZpbmdFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5Bc3NvY2lhdGlvbkhlbHBlcjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlJvbGUgRGVzY3JpcHRvcjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlJvbGVEZXNjcmlwdG9ySW1wbCNnZXRSb2xlIDxlbT5Sb2xlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUm9sZURlc2NyaXB0b3JJbXBsI2dldE1vZGlmaWVzIDxlbT5Nb2RpZmllczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlJvbGVEZXNjcmlwdG9ySW1wbCNnZXRSZXNwb25zaWJsZUZvciA8ZW0+UmVzcG9uc2libGUgRm9yPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUm9sZURlc2NyaXB0b3JJbXBsIGV4dGVuZHMgRGVzY3JpcHRvckltcGwgaW1wbGVtZW50cwotCQlSb2xlRGVzY3JpcHRvciB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSb2xlKCkgPGVtPlJvbGU8L2VtPn0nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJvbGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBSb2xlIHJvbGU7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZXNwb25zaWJsZUZvcigpIDxlbT5SZXNwb25zaWJsZSBGb3I8L2VtPn0nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmVzcG9uc2libGVGb3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxXb3JrUHJvZHVjdERlc2NyaXB0b3I+IHJlc3BvbnNpYmxlRm9yOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFJvbGVEZXNjcmlwdG9ySW1wbCgpIHsKLQkJc3VwZXIoKTsKLQotCQkvL1VNQS0tPgotCQlyZWFzc2lnbkRlZmF1bHRWYWx1ZXMoKTsKLQkJLy9VTUE8LS0gIAotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5ST0xFX0RFU0NSSVBUT1I7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJvbGUgZ2V0Um9sZSgpIHsKLQkJaWYgKHJvbGUgIT0gbnVsbCAmJiAoKEVPYmplY3QpIHJvbGUpLmVJc1Byb3h5KCkpIHsKLQkJCUludGVybmFsRU9iamVjdCBvbGRSb2xlID0gKEludGVybmFsRU9iamVjdCkgcm9sZTsKLQkJCXJvbGUgPSAoUm9sZSkgZVJlc29sdmVQcm94eShvbGRSb2xlKTsKLQkJCWlmIChyb2xlICE9IG9sZFJvbGUpIHsKLQkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLAotCQkJCQkJCVVtYVBhY2thZ2UuUk9MRV9ERVNDUklQVE9SX19ST0xFLCBvbGRSb2xlLCByb2xlKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJvbGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJvbGUgYmFzaWNHZXRSb2xlKCkgewotCQlyZXR1cm4gcm9sZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSb2xlKFJvbGUgbmV3Um9sZSkgewotCQlSb2xlIG9sZFJvbGUgPSByb2xlOwotCQlyb2xlID0gbmV3Um9sZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5ST0xFX0RFU0NSSVBUT1JfX1JPTEUsIG9sZFJvbGUsIHJvbGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqLwotCXB1YmxpYyBMaXN0IGdldE1vZGlmaWVzKCkgewotCQlMaXN0IHBlcmZvcm1zID0gQXNzb2NpYXRpb25IZWxwZXIuZ2V0UHJpbWFyeVRhc2tEZXNjcmlwdG9ycyh0aGlzKTsKLQkJSW50ZXJuYWxFTGlzdCBtb2RpZmllcyA9IG5ldyBCYXNpY0ludGVybmFsRUxpc3QoCi0JCQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yLmNsYXNzKTsKLQkJaWYgKHBlcmZvcm1zICE9IG51bGwgJiYgcGVyZm9ybXMuc2l6ZSgpID4gMCkgewotCQkJZm9yIChJdGVyYXRvciBpID0gcGVyZm9ybXMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQkJVGFza0Rlc2NyaXB0b3IgdGQgPSAoVGFza0Rlc2NyaXB0b3IpIGkubmV4dCgpOwotCi0JCQkJLy8gZm9yIGVhY2ggdGFzaywgZ2V0IG91dHB1dCB3b3JrIHByb2R1Y3Q7Ci0JCQkJTGlzdCBvdXRwdXRXUHMgPSB0ZC5nZXRPdXRwdXQoKTsKLQkJCQlpZiAob3V0cHV0V1BzICE9IG51bGwgJiYgb3V0cHV0V1BzLnNpemUoKSA+IDApIHsKLQkJCQkJZm9yIChJdGVyYXRvciBpdCA9IG91dHB1dFdQcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlXb3JrUHJvZHVjdERlc2NyaXB0b3Igd3BkID0gKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgaXQKLQkJCQkJCQkJLm5leHQoKTsKLQkJCQkJCWlmICh3cGQgIT0gbnVsbCkgewotCQkJCQkJCWlmICghbW9kaWZpZXMuY29udGFpbnMod3BkKSkgewotCQkJCQkJCQltb2RpZmllcy5hZGQod3BkKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG1vZGlmaWVzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0PFdvcmtQcm9kdWN0RGVzY3JpcHRvcj4gZ2V0UmVzcG9uc2libGVGb3IoKSB7Ci0JCWlmIChyZXNwb25zaWJsZUZvciA9PSBudWxsKSB7Ci0JCQlyZXNwb25zaWJsZUZvciA9IG5ldyBFT2JqZWN0UmVzb2x2aW5nRUxpc3Q8V29ya1Byb2R1Y3REZXNjcmlwdG9yPigKLQkJCQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yLmNsYXNzLCB0aGlzLAotCQkJCQlVbWFQYWNrYWdlLlJPTEVfREVTQ1JJUFRPUl9fUkVTUE9OU0lCTEVfRk9SKTsKLQkJfQotCQlyZXR1cm4gcmVzcG9uc2libGVGb3I7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9ERVNDUklQVE9SX19ST0xFOgotCQkJaWYgKHJlc29sdmUpCi0JCQkJcmV0dXJuIGdldFJvbGUoKTsKLQkJCXJldHVybiBiYXNpY0dldFJvbGUoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfREVTQ1JJUFRPUl9fTU9ESUZJRVM6Ci0JCQlyZXR1cm4gZ2V0TW9kaWZpZXMoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfREVTQ1JJUFRPUl9fUkVTUE9OU0lCTEVfRk9SOgotCQkJcmV0dXJuIGdldFJlc3BvbnNpYmxlRm9yKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfREVTQ1JJUFRPUl9fUk9MRToKLQkJCXNldFJvbGUoKFJvbGUpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfREVTQ1JJUFRPUl9fTU9ESUZJRVM6Ci0JCQlnZXRNb2RpZmllcygpLmNsZWFyKCk7Ci0JCQlnZXRNb2RpZmllcygpLmFkZEFsbCgKLQkJCQkJKENvbGxlY3Rpb248PyBleHRlbmRzIFdvcmtQcm9kdWN0RGVzY3JpcHRvcj4pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfREVTQ1JJUFRPUl9fUkVTUE9OU0lCTEVfRk9SOgotCQkJZ2V0UmVzcG9uc2libGVGb3IoKS5jbGVhcigpOwotCQkJZ2V0UmVzcG9uc2libGVGb3IoKS5hZGRBbGwoCi0JCQkJCShDb2xsZWN0aW9uPD8gZXh0ZW5kcyBXb3JrUHJvZHVjdERlc2NyaXB0b3I+KSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9ERVNDUklQVE9SX19ST0xFOgotCQkJc2V0Um9sZSgoUm9sZSkgbnVsbCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5ST0xFX0RFU0NSSVBUT1JfX01PRElGSUVTOgotCQkJZ2V0TW9kaWZpZXMoKS5jbGVhcigpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9ERVNDUklQVE9SX19SRVNQT05TSUJMRV9GT1I6Ci0JCQlnZXRSZXNwb25zaWJsZUZvcigpLmNsZWFyKCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJLy9VTUEtLT4KLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBnZXRGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZShmZWF0dXJlSUQpOwotCQlpZiAoZmVhdHVyZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gaXNGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZVNldChmZWF0dXJlKTsKLQkJfQotCQkvL1VNQTwtLQkJCi0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ST0xFX0RFU0NSSVBUT1JfX1JPTEU6Ci0JCQlyZXR1cm4gcm9sZSAhPSBudWxsOwotCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9ERVNDUklQVE9SX19NT0RJRklFUzoKLQkJCXJldHVybiAhZ2V0TW9kaWZpZXMoKS5pc0VtcHR5KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5ST0xFX0RFU0NSSVBUT1JfX1JFU1BPTlNJQkxFX0ZPUjoKLQkJCXJldHVybiByZXNwb25zaWJsZUZvciAhPSBudWxsICYmICFyZXNwb25zaWJsZUZvci5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotfSAvL1JvbGVEZXNjcmlwdG9ySW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1JvbGVJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvUm9sZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2MwZmEyZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvUm9sZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdFJlc29sdmluZ0VMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRnVsZmlsbGFibGVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQXNzb2NpYXRpb25IZWxwZXI7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Sb2xlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUm9sZUltcGwjZ2V0RnVsZmlsbHMgPGVtPkZ1bGZpbGxzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUm9sZUltcGwjZ2V0TW9kaWZpZXMgPGVtPk1vZGlmaWVzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUm9sZUltcGwjZ2V0UmVzcG9uc2libGVGb3IgPGVtPlJlc3BvbnNpYmxlIEZvcjwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFJvbGVJbXBsIGV4dGVuZHMgQ29udGVudEVsZW1lbnRJbXBsIGltcGxlbWVudHMgUm9sZSB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRGdWxmaWxscygpIDxlbT5GdWxmaWxsczwvZW0+fScgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRGdWxmaWxscygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PEZ1bGZpbGxhYmxlRWxlbWVudD4gZnVsZmlsbHM7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZXNwb25zaWJsZUZvcigpIDxlbT5SZXNwb25zaWJsZSBGb3I8L2VtPn0nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmVzcG9uc2libGVGb3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxXb3JrUHJvZHVjdD4gcmVzcG9uc2libGVGb3I7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUm9sZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJLy9VTUEtLT4KLQkJcmVhc3NpZ25EZWZhdWx0VmFsdWVzKCk7Ci0JCS8vVU1BPC0tICAKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuUk9MRTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdDxGdWxmaWxsYWJsZUVsZW1lbnQ+IGdldEZ1bGZpbGxzKCkgewotCQlpZiAoZnVsZmlsbHMgPT0gbnVsbCkgewotCQkJZnVsZmlsbHMgPSBuZXcgRU9iamVjdFJlc29sdmluZ0VMaXN0PEZ1bGZpbGxhYmxlRWxlbWVudD4oCi0JCQkJCUZ1bGZpbGxhYmxlRWxlbWVudC5jbGFzcywgdGhpcywgVW1hUGFja2FnZS5ST0xFX19GVUxGSUxMUyk7Ci0JCX0KLQkJcmV0dXJuIGZ1bGZpbGxzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICovCi0JcHVibGljIExpc3QgZ2V0TW9kaWZpZXMoKSB7Ci0JCXJldHVybiBBc3NvY2lhdGlvbkhlbHBlci5nZXRNb2RpZmllZFdvcmtQcm9kdWN0cyh0aGlzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdDxXb3JrUHJvZHVjdD4gZ2V0UmVzcG9uc2libGVGb3IoKSB7Ci0JCWlmIChyZXNwb25zaWJsZUZvciA9PSBudWxsKSB7Ci0JCQlyZXNwb25zaWJsZUZvciA9IG5ldyBFT2JqZWN0UmVzb2x2aW5nRUxpc3Q8V29ya1Byb2R1Y3Q+KAotCQkJCQlXb3JrUHJvZHVjdC5jbGFzcywgdGhpcywgVW1hUGFja2FnZS5ST0xFX19SRVNQT05TSUJMRV9GT1IpOwotCQl9Ci0JCXJldHVybiByZXNwb25zaWJsZUZvcjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ST0xFX19GVUxGSUxMUzoKLQkJCXJldHVybiBnZXRGdWxmaWxscygpOwotCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9fTU9ESUZJRVM6Ci0JCQlyZXR1cm4gZ2V0TW9kaWZpZXMoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfX1JFU1BPTlNJQkxFX0ZPUjoKLQkJCXJldHVybiBnZXRSZXNwb25zaWJsZUZvcigpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ST0xFX19GVUxGSUxMUzoKLQkJCWdldEZ1bGZpbGxzKCkuY2xlYXIoKTsKLQkJCWdldEZ1bGZpbGxzKCkuYWRkQWxsKAotCQkJCQkoQ29sbGVjdGlvbjw/IGV4dGVuZHMgRnVsZmlsbGFibGVFbGVtZW50PikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9fTU9ESUZJRVM6Ci0JCQlnZXRNb2RpZmllcygpLmNsZWFyKCk7Ci0JCQlnZXRNb2RpZmllcygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgV29ya1Byb2R1Y3Q+KSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5ST0xFX19SRVNQT05TSUJMRV9GT1I6Ci0JCQlnZXRSZXNwb25zaWJsZUZvcigpLmNsZWFyKCk7Ci0JCQlnZXRSZXNwb25zaWJsZUZvcigpLmFkZEFsbCgKLQkJCQkJKENvbGxlY3Rpb248PyBleHRlbmRzIFdvcmtQcm9kdWN0PikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfX0ZVTEZJTExTOgotCQkJZ2V0RnVsZmlsbHMoKS5jbGVhcigpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9fTU9ESUZJRVM6Ci0JCQlnZXRNb2RpZmllcygpLmNsZWFyKCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5ST0xFX19SRVNQT05TSUJMRV9GT1I6Ci0JCQlnZXRSZXNwb25zaWJsZUZvcigpLmNsZWFyKCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJLy9VTUEtLT4KLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBnZXRGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZShmZWF0dXJlSUQpOwotCQlpZiAoZmVhdHVyZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gaXNGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZVNldChmZWF0dXJlKTsKLQkJfQotCQkvL1VNQTwtLQkJCi0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ST0xFX19GVUxGSUxMUzoKLQkJCXJldHVybiBmdWxmaWxscyAhPSBudWxsICYmICFmdWxmaWxscy5pc0VtcHR5KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5ST0xFX19NT0RJRklFUzoKLQkJCXJldHVybiAhZ2V0TW9kaWZpZXMoKS5pc0VtcHR5KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5ST0xFX19SRVNQT05TSUJMRV9GT1I6Ci0JCQlyZXR1cm4gcmVzcG9uc2libGVGb3IgIT0gbnVsbCAmJiAhcmVzcG9uc2libGVGb3IuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgaW50IGVCYXNlU3RydWN0dXJhbEZlYXR1cmVJRChpbnQgZGVyaXZlZEZlYXR1cmVJRCwgQ2xhc3M8Pz4gYmFzZUNsYXNzKSB7Ci0JCWlmIChiYXNlQ2xhc3MgPT0gRnVsZmlsbGFibGVFbGVtZW50LmNsYXNzKSB7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5ST0xFX19GVUxGSUxMUzoKLQkJCQlyZXR1cm4gVW1hUGFja2FnZS5GVUxGSUxMQUJMRV9FTEVNRU5UX19GVUxGSUxMUzsKLQkJCWRlZmF1bHQ6Ci0JCQkJcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCXJldHVybiBzdXBlci5lQmFzZVN0cnVjdHVyYWxGZWF0dXJlSUQoZGVyaXZlZEZlYXR1cmVJRCwgYmFzZUNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgaW50IGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChpbnQgYmFzZUZlYXR1cmVJRCwgQ2xhc3M8Pz4gYmFzZUNsYXNzKSB7Ci0JCWlmIChiYXNlQ2xhc3MgPT0gRnVsZmlsbGFibGVFbGVtZW50LmNsYXNzKSB7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5GVUxGSUxMQUJMRV9FTEVNRU5UX19GVUxGSUxMUzoKLQkJCQlyZXR1cm4gVW1hUGFja2FnZS5ST0xFX19GVUxGSUxMUzsKLQkJCWRlZmF1bHQ6Ci0JCQkJcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCXJldHVybiBzdXBlci5lRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoYmFzZUZlYXR1cmVJRCwgYmFzZUNsYXNzKTsKLQl9Ci0KLX0gLy9Sb2xlSW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1JvbGVTZXRHcm91cGluZ0ltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Sb2xlU2V0R3JvdXBpbmdJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1NDgxZTcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1JvbGVTZXRHcm91cGluZ0ltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdFJlc29sdmluZ0VMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVTZXRHcm91cGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Sb2xlIFNldCBHcm91cGluZzwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlJvbGVTZXRHcm91cGluZ0ltcGwjZ2V0Um9sZVNldHMgPGVtPlJvbGUgU2V0czwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFJvbGVTZXRHcm91cGluZ0ltcGwgZXh0ZW5kcyBDb250ZW50Q2F0ZWdvcnlJbXBsIGltcGxlbWVudHMKLQkJUm9sZVNldEdyb3VwaW5nIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJvbGVTZXRzKCkgPGVtPlJvbGUgU2V0czwvZW0+fScgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSb2xlU2V0cygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PFJvbGVTZXQ+IHJvbGVTZXRzOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFJvbGVTZXRHcm91cGluZ0ltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJLy9VTUEtLT4KLQkJcmVhc3NpZ25EZWZhdWx0VmFsdWVzKCk7Ci0JCS8vVU1BPC0tICAKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuUk9MRV9TRVRfR1JPVVBJTkc7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3Q8Um9sZVNldD4gZ2V0Um9sZVNldHMoKSB7Ci0JCWlmIChyb2xlU2V0cyA9PSBudWxsKSB7Ci0JCQlyb2xlU2V0cyA9IG5ldyBFT2JqZWN0UmVzb2x2aW5nRUxpc3Q8Um9sZVNldD4oUm9sZVNldC5jbGFzcywgdGhpcywKLQkJCQkJVW1hUGFja2FnZS5ST0xFX1NFVF9HUk9VUElOR19fUk9MRV9TRVRTKTsKLQkJfQotCQlyZXR1cm4gcm9sZVNldHM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9TRVRfR1JPVVBJTkdfX1JPTEVfU0VUUzoKLQkJCXJldHVybiBnZXRSb2xlU2V0cygpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ST0xFX1NFVF9HUk9VUElOR19fUk9MRV9TRVRTOgotCQkJZ2V0Um9sZVNldHMoKS5jbGVhcigpOwotCQkJZ2V0Um9sZVNldHMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFJvbGVTZXQ+KSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9TRVRfR1JPVVBJTkdfX1JPTEVfU0VUUzoKLQkJCWdldFJvbGVTZXRzKCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQkvL1VNQS0tPgotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IGdldEZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlKGZlYXR1cmVJRCk7Ci0JCWlmIChmZWF0dXJlICE9IG51bGwpIHsKLQkJCXJldHVybiBpc0ZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlU2V0KGZlYXR1cmUpOwotCQl9Ci0JCS8vVU1BPC0tCQkKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfU0VUX0dST1VQSU5HX19ST0xFX1NFVFM6Ci0JCQlyZXR1cm4gcm9sZVNldHMgIT0gbnVsbCAmJiAhcm9sZVNldHMuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLX0gLy9Sb2xlU2V0R3JvdXBpbmdJbXBsCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvUm9sZVNldEltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Sb2xlU2V0SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMjM5YzMyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Sb2xlU2V0SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0UmVzb2x2aW5nRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Sb2xlIFNldDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlJvbGVTZXRJbXBsI2dldFJvbGVzIDxlbT5Sb2xlczwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFJvbGVTZXRJbXBsIGV4dGVuZHMgQ29udGVudENhdGVnb3J5SW1wbCBpbXBsZW1lbnRzIFJvbGVTZXQgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Um9sZXMoKSA8ZW0+Um9sZXM8L2VtPn0nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Um9sZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxSb2xlPiByb2xlczsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBSb2xlU2V0SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQotCQkvL1VNQS0tPgotCQlyZWFzc2lnbkRlZmF1bHRWYWx1ZXMoKTsKLQkJLy9VTUE8LS0gIAotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5ST0xFX1NFVDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdDxSb2xlPiBnZXRSb2xlcygpIHsKLQkJaWYgKHJvbGVzID09IG51bGwpIHsKLQkJCXJvbGVzID0gbmV3IEVPYmplY3RSZXNvbHZpbmdFTGlzdDxSb2xlPihSb2xlLmNsYXNzLCB0aGlzLAotCQkJCQlVbWFQYWNrYWdlLlJPTEVfU0VUX19ST0xFUyk7Ci0JCX0KLQkJcmV0dXJuIHJvbGVzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfU0VUX19ST0xFUzoKLQkJCXJldHVybiBnZXRSb2xlcygpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ST0xFX1NFVF9fUk9MRVM6Ci0JCQlnZXRSb2xlcygpLmNsZWFyKCk7Ci0JCQlnZXRSb2xlcygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgUm9sZT4pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ST0xFX1NFVF9fUk9MRVM6Ci0JCQlnZXRSb2xlcygpLmNsZWFyKCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJLy9VTUEtLT4KLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBnZXRGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZShmZWF0dXJlSUQpOwotCQlpZiAoZmVhdHVyZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gaXNGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZVNldChmZWF0dXJlKTsKLQkJfQotCQkvL1VNQTwtLQkJCi0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ST0xFX1NFVF9fUk9MRVM6Ci0JCQlyZXR1cm4gcm9sZXMgIT0gbnVsbCAmJiAhcm9sZXMuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLX0gLy9Sb2xlU2V0SW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1NlY3Rpb25JbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvU2VjdGlvbkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTFhNDc2NC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvU2VjdGlvbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlNlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+U2VjdGlvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlNlY3Rpb25JbXBsI2dldFNlY3Rpb25OYW1lIDxlbT5TZWN0aW9uIE5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5TZWN0aW9uSW1wbCNnZXRTZWN0aW9uRGVzY3JpcHRpb24gPGVtPlNlY3Rpb24gRGVzY3JpcHRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5TZWN0aW9uSW1wbCNnZXRTdWJTZWN0aW9ucyA8ZW0+U3ViIFNlY3Rpb25zPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuU2VjdGlvbkltcGwjZ2V0UHJlZGVjZXNzb3IgPGVtPlByZWRlY2Vzc29yPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgU2VjdGlvbkltcGwgZXh0ZW5kcyBWYXJpYWJpbGl0eUVsZW1lbnRJbXBsIGltcGxlbWVudHMgU2VjdGlvbiB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U2VjdGlvbk5hbWUoKSA8ZW0+U2VjdGlvbiBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTZWN0aW9uTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VDVElPTl9OQU1FX0VERUZBVUxUID0gIiI7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTZWN0aW9uTmFtZSgpIDxlbT5TZWN0aW9uIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFNlY3Rpb25OYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHNlY3Rpb25OYW1lID0gU0VDVElPTl9OQU1FX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNlY3Rpb25EZXNjcmlwdGlvbigpIDxlbT5TZWN0aW9uIERlc2NyaXB0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTZWN0aW9uRGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFNFQ1RJT05fREVTQ1JJUFRJT05fRURFRkFVTFQgPSAiIjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNlY3Rpb25EZXNjcmlwdGlvbigpIDxlbT5TZWN0aW9uIERlc2NyaXB0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTZWN0aW9uRGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgc2VjdGlvbkRlc2NyaXB0aW9uID0gU0VDVElPTl9ERVNDUklQVElPTl9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFN1YlNlY3Rpb25zKCkgPGVtPlN1YiBTZWN0aW9uczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTdWJTZWN0aW9ucygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PFNlY3Rpb24+IHN1YlNlY3Rpb25zOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJlZGVjZXNzb3IoKSA8ZW0+UHJlZGVjZXNzb3I8L2VtPn0nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFByZWRlY2Vzc29yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU2VjdGlvbiBwcmVkZWNlc3NvcjsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBTZWN0aW9uSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQotCQkvL1VNQS0tPgotCQlyZWFzc2lnbkRlZmF1bHRWYWx1ZXMoKTsKLQkJLy9VTUE8LS0gIAotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5TRUNUSU9OOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U2VjdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBzZWN0aW9uTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTZWN0aW9uTmFtZShTdHJpbmcgbmV3U2VjdGlvbk5hbWUpIHsKLQkJU3RyaW5nIG9sZFNlY3Rpb25OYW1lID0gc2VjdGlvbk5hbWU7Ci0JCXNlY3Rpb25OYW1lID0gbmV3U2VjdGlvbk5hbWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuU0VDVElPTl9fU0VDVElPTl9OQU1FLCBvbGRTZWN0aW9uTmFtZSwKLQkJCQkJc2VjdGlvbk5hbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFNlY3Rpb25EZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIHNlY3Rpb25EZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTZWN0aW9uRGVzY3JpcHRpb24oU3RyaW5nIG5ld1NlY3Rpb25EZXNjcmlwdGlvbikgewotCQlTdHJpbmcgb2xkU2VjdGlvbkRlc2NyaXB0aW9uID0gc2VjdGlvbkRlc2NyaXB0aW9uOwotCQlzZWN0aW9uRGVzY3JpcHRpb24gPSBuZXdTZWN0aW9uRGVzY3JpcHRpb247Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuU0VDVElPTl9fU0VDVElPTl9ERVNDUklQVElPTiwKLQkJCQkJb2xkU2VjdGlvbkRlc2NyaXB0aW9uLCBzZWN0aW9uRGVzY3JpcHRpb24pKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdDxTZWN0aW9uPiBnZXRTdWJTZWN0aW9ucygpIHsKLQkJaWYgKHN1YlNlY3Rpb25zID09IG51bGwpIHsKLQkJCXN1YlNlY3Rpb25zID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0LlJlc29sdmluZzxTZWN0aW9uPigKLQkJCQkJU2VjdGlvbi5jbGFzcywgdGhpcywgVW1hUGFja2FnZS5TRUNUSU9OX19TVUJfU0VDVElPTlMpOwotCQl9Ci0JCXJldHVybiBzdWJTZWN0aW9uczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU2VjdGlvbiBnZXRQcmVkZWNlc3NvcigpIHsKLQkJaWYgKHByZWRlY2Vzc29yICE9IG51bGwgJiYgKChFT2JqZWN0KSBwcmVkZWNlc3NvcikuZUlzUHJveHkoKSkgewotCQkJSW50ZXJuYWxFT2JqZWN0IG9sZFByZWRlY2Vzc29yID0gKEludGVybmFsRU9iamVjdCkgcHJlZGVjZXNzb3I7Ci0JCQlwcmVkZWNlc3NvciA9IChTZWN0aW9uKSBlUmVzb2x2ZVByb3h5KG9sZFByZWRlY2Vzc29yKTsKLQkJCWlmIChwcmVkZWNlc3NvciAhPSBvbGRQcmVkZWNlc3NvcikgewotCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlJFU09MVkUsCi0JCQkJCQkJVW1hUGFja2FnZS5TRUNUSU9OX19QUkVERUNFU1NPUiwgb2xkUHJlZGVjZXNzb3IsCi0JCQkJCQkJcHJlZGVjZXNzb3IpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcHJlZGVjZXNzb3I7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFNlY3Rpb24gYmFzaWNHZXRQcmVkZWNlc3NvcigpIHsKLQkJcmV0dXJuIHByZWRlY2Vzc29yOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFByZWRlY2Vzc29yKFNlY3Rpb24gbmV3UHJlZGVjZXNzb3IpIHsKLQkJU2VjdGlvbiBvbGRQcmVkZWNlc3NvciA9IHByZWRlY2Vzc29yOwotCQlwcmVkZWNlc3NvciA9IG5ld1ByZWRlY2Vzc29yOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLlNFQ1RJT05fX1BSRURFQ0VTU09SLCBvbGRQcmVkZWNlc3NvciwKLQkJCQkJcHJlZGVjZXNzb3IpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLAotCQkJaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuU0VDVElPTl9fU1VCX1NFQ1RJT05TOgotCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PikgZ2V0U3ViU2VjdGlvbnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsCi0JCQkJCW1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5TRUNUSU9OX19TRUNUSU9OX05BTUU6Ci0JCQlyZXR1cm4gZ2V0U2VjdGlvbk5hbWUoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlNFQ1RJT05fX1NFQ1RJT05fREVTQ1JJUFRJT046Ci0JCQlyZXR1cm4gZ2V0U2VjdGlvbkRlc2NyaXB0aW9uKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5TRUNUSU9OX19TVUJfU0VDVElPTlM6Ci0JCQlyZXR1cm4gZ2V0U3ViU2VjdGlvbnMoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlNFQ1RJT05fX1BSRURFQ0VTU09SOgotCQkJaWYgKHJlc29sdmUpCi0JCQkJcmV0dXJuIGdldFByZWRlY2Vzc29yKCk7Ci0JCQlyZXR1cm4gYmFzaWNHZXRQcmVkZWNlc3NvcigpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5TRUNUSU9OX19TRUNUSU9OX05BTUU6Ci0JCQlzZXRTZWN0aW9uTmFtZSgoU3RyaW5nKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5TRUNUSU9OX19TRUNUSU9OX0RFU0NSSVBUSU9OOgotCQkJc2V0U2VjdGlvbkRlc2NyaXB0aW9uKChTdHJpbmcpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlNFQ1RJT05fX1NVQl9TRUNUSU9OUzoKLQkJCWdldFN1YlNlY3Rpb25zKCkuY2xlYXIoKTsKLQkJCWdldFN1YlNlY3Rpb25zKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBTZWN0aW9uPikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuU0VDVElPTl9fUFJFREVDRVNTT1I6Ci0JCQlzZXRQcmVkZWNlc3NvcigoU2VjdGlvbikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlNFQ1RJT05fX1NFQ1RJT05fTkFNRToKLQkJCXNldFNlY3Rpb25OYW1lKFNFQ1RJT05fTkFNRV9FREVGQVVMVCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5TRUNUSU9OX19TRUNUSU9OX0RFU0NSSVBUSU9OOgotCQkJc2V0U2VjdGlvbkRlc2NyaXB0aW9uKFNFQ1RJT05fREVTQ1JJUFRJT05fRURFRkFVTFQpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuU0VDVElPTl9fU1VCX1NFQ1RJT05TOgotCQkJZ2V0U3ViU2VjdGlvbnMoKS5jbGVhcigpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuU0VDVElPTl9fUFJFREVDRVNTT1I6Ci0JCQlzZXRQcmVkZWNlc3NvcigoU2VjdGlvbikgbnVsbCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJLy9VTUEtLT4KLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBnZXRGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZShmZWF0dXJlSUQpOwotCQlpZiAoZmVhdHVyZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gaXNGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZVNldChmZWF0dXJlKTsKLQkJfQotCQkvL1VNQTwtLQkJCi0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5TRUNUSU9OX19TRUNUSU9OX05BTUU6Ci0JCQlyZXR1cm4gU0VDVElPTl9OQU1FX0VERUZBVUxUID09IG51bGwgPyBzZWN0aW9uTmFtZSAhPSBudWxsCi0JCQkJCTogIVNFQ1RJT05fTkFNRV9FREVGQVVMVC5lcXVhbHMoc2VjdGlvbk5hbWUpOwotCQljYXNlIFVtYVBhY2thZ2UuU0VDVElPTl9fU0VDVElPTl9ERVNDUklQVElPTjoKLQkJCXJldHVybiBTRUNUSU9OX0RFU0NSSVBUSU9OX0VERUZBVUxUID09IG51bGwgPyBzZWN0aW9uRGVzY3JpcHRpb24gIT0gbnVsbAotCQkJCQk6ICFTRUNUSU9OX0RFU0NSSVBUSU9OX0VERUZBVUxULmVxdWFscyhzZWN0aW9uRGVzY3JpcHRpb24pOwotCQljYXNlIFVtYVBhY2thZ2UuU0VDVElPTl9fU1VCX1NFQ1RJT05TOgotCQkJcmV0dXJuIHN1YlNlY3Rpb25zICE9IG51bGwgJiYgIXN1YlNlY3Rpb25zLmlzRW1wdHkoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlNFQ1RJT05fX1BSRURFQ0VTU09SOgotCQkJcmV0dXJuIHByZWRlY2Vzc29yICE9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKQotCQkJcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoc2VjdGlvbk5hbWU6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoc2VjdGlvbk5hbWUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHNlY3Rpb25EZXNjcmlwdGlvbjogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChzZWN0aW9uRGVzY3JpcHRpb24pOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9TZWN0aW9uSW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1NlbWFudGljTW9kZWxCcmlkZ2VJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvU2VtYW50aWNNb2RlbEJyaWRnZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjM5ZDU0MC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvU2VtYW50aWNNb2RlbEJyaWRnZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwMSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlNlbWFudGljTW9kZWxCcmlkZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+U2VtYW50aWMgTW9kZWwgQnJpZGdlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuU2VtYW50aWNNb2RlbEJyaWRnZUltcGwjZ2V0UHJlc2VudGF0aW9uIDxlbT5QcmVzZW50YXRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5TZW1hbnRpY01vZGVsQnJpZGdlSW1wbCNnZXREaWFncmFtIDxlbT5EaWFncmFtPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuU2VtYW50aWNNb2RlbEJyaWRnZUltcGwjZ2V0R3JhcGhFbGVtZW50IDxlbT5HcmFwaCBFbGVtZW50PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgU2VtYW50aWNNb2RlbEJyaWRnZUltcGwgZXh0ZW5kcyBEaWFncmFtRWxlbWVudEltcGwKLQkJaW1wbGVtZW50cyBTZW1hbnRpY01vZGVsQnJpZGdlIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQcmVzZW50YXRpb24oKSA8ZW0+UHJlc2VudGF0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQcmVzZW50YXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRVNFTlRBVElPTl9FREVGQVVMVCA9ICIiOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJlc2VudGF0aW9uKCkgPGVtPlByZXNlbnRhdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UHJlc2VudGF0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHByZXNlbnRhdGlvbiA9IFBSRVNFTlRBVElPTl9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBTZW1hbnRpY01vZGVsQnJpZGdlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQotCQkvL1VNQS0tPgotCQlyZWFzc2lnbkRlZmF1bHRWYWx1ZXMoKTsKLQkJLy9VTUE8LS0gIAotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5TRU1BTlRJQ19NT0RFTF9CUklER0U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQcmVzZW50YXRpb24oKSB7Ci0JCXJldHVybiBwcmVzZW50YXRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHJlc2VudGF0aW9uKFN0cmluZyBuZXdQcmVzZW50YXRpb24pIHsKLQkJU3RyaW5nIG9sZFByZXNlbnRhdGlvbiA9IHByZXNlbnRhdGlvbjsKLQkJcHJlc2VudGF0aW9uID0gbmV3UHJlc2VudGF0aW9uOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLlNFTUFOVElDX01PREVMX0JSSURHRV9fUFJFU0VOVEFUSU9OLAotCQkJCQlvbGRQcmVzZW50YXRpb24sIHByZXNlbnRhdGlvbikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBHcmFwaEVsZW1lbnQgZ2V0R3JhcGhFbGVtZW50KCkgewotCQlpZiAoZUNvbnRhaW5lckZlYXR1cmVJRCAhPSBVbWFQYWNrYWdlLlNFTUFOVElDX01PREVMX0JSSURHRV9fR1JBUEhfRUxFTUVOVCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gKEdyYXBoRWxlbWVudCkgZUNvbnRhaW5lcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBHcmFwaEVsZW1lbnQgYmFzaWNHZXRHcmFwaEVsZW1lbnQoKSB7Ci0JCWlmIChlQ29udGFpbmVyRmVhdHVyZUlEICE9IFVtYVBhY2thZ2UuU0VNQU5USUNfTU9ERUxfQlJJREdFX19HUkFQSF9FTEVNRU5UKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoR3JhcGhFbGVtZW50KSBlSW50ZXJuYWxDb250YWluZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRHcmFwaEVsZW1lbnQoR3JhcGhFbGVtZW50IG5ld0dyYXBoRWxlbWVudCwKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJbXNncyA9IGVCYXNpY1NldENvbnRhaW5lcigoSW50ZXJuYWxFT2JqZWN0KSBuZXdHcmFwaEVsZW1lbnQsCi0JCQkJVW1hUGFja2FnZS5TRU1BTlRJQ19NT0RFTF9CUklER0VfX0dSQVBIX0VMRU1FTlQsIG1zZ3MpOwotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRHcmFwaEVsZW1lbnQoR3JhcGhFbGVtZW50IG5ld0dyYXBoRWxlbWVudCkgewotCQlpZiAobmV3R3JhcGhFbGVtZW50ICE9IGVJbnRlcm5hbENvbnRhaW5lcigpCi0JCQkJfHwgKGVDb250YWluZXJGZWF0dXJlSUQgIT0gVW1hUGFja2FnZS5TRU1BTlRJQ19NT0RFTF9CUklER0VfX0dSQVBIX0VMRU1FTlQgJiYgbmV3R3JhcGhFbGVtZW50ICE9IG51bGwpKSB7Ci0JCQlpZiAoRWNvcmVVdGlsLmlzQW5jZXN0b3IodGhpcywgKEVPYmplY3QpIG5ld0dyYXBoRWxlbWVudCkpCi0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKLQkJCQkJCSJSZWN1cnNpdmUgY29udGFpbm1lbnQgbm90IGFsbG93ZWQgZm9yICIgKyB0b1N0cmluZygpKTsgLy8kTk9OLU5MUy0xJAotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoZUludGVybmFsQ29udGFpbmVyKCkgIT0gbnVsbCkKLQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCWlmIChuZXdHcmFwaEVsZW1lbnQgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpIG5ld0dyYXBoRWxlbWVudCkuZUludmVyc2VBZGQodGhpcywKLQkJCQkJCVVtYVBhY2thZ2UuR1JBUEhfRUxFTUVOVF9fU0VNQU5USUNfTU9ERUwsCi0JCQkJCQlHcmFwaEVsZW1lbnQuY2xhc3MsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0R3JhcGhFbGVtZW50KG5ld0dyYXBoRWxlbWVudCwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKQotCQkJCW1zZ3MuZGlzcGF0Y2goKTsKLQkJfSBlbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuU0VNQU5USUNfTU9ERUxfQlJJREdFX19HUkFQSF9FTEVNRU5ULAotCQkJCQluZXdHcmFwaEVsZW1lbnQsIG5ld0dyYXBoRWxlbWVudCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEaWFncmFtIGdldERpYWdyYW0oKSB7Ci0JCWlmIChlQ29udGFpbmVyRmVhdHVyZUlEICE9IFVtYVBhY2thZ2UuU0VNQU5USUNfTU9ERUxfQlJJREdFX19ESUFHUkFNKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoRGlhZ3JhbSkgZUNvbnRhaW5lcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEaWFncmFtIGJhc2ljR2V0RGlhZ3JhbSgpIHsKLQkJaWYgKGVDb250YWluZXJGZWF0dXJlSUQgIT0gVW1hUGFja2FnZS5TRU1BTlRJQ19NT0RFTF9CUklER0VfX0RJQUdSQU0pCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIChEaWFncmFtKSBlSW50ZXJuYWxDb250YWluZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXREaWFncmFtKERpYWdyYW0gbmV3RGlhZ3JhbSwKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJbXNncyA9IGVCYXNpY1NldENvbnRhaW5lcigoSW50ZXJuYWxFT2JqZWN0KSBuZXdEaWFncmFtLAotCQkJCVVtYVBhY2thZ2UuU0VNQU5USUNfTU9ERUxfQlJJREdFX19ESUFHUkFNLCBtc2dzKTsKLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGlhZ3JhbShEaWFncmFtIG5ld0RpYWdyYW0pIHsKLQkJaWYgKG5ld0RpYWdyYW0gIT0gZUludGVybmFsQ29udGFpbmVyKCkKLQkJCQl8fCAoZUNvbnRhaW5lckZlYXR1cmVJRCAhPSBVbWFQYWNrYWdlLlNFTUFOVElDX01PREVMX0JSSURHRV9fRElBR1JBTSAmJiBuZXdEaWFncmFtICE9IG51bGwpKSB7Ci0JCQlpZiAoRWNvcmVVdGlsLmlzQW5jZXN0b3IodGhpcywgKEVPYmplY3QpIG5ld0RpYWdyYW0pKQotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCi0JCQkJCQkiUmVjdXJzaXZlIGNvbnRhaW5tZW50IG5vdCBhbGxvd2VkIGZvciAiICsgdG9TdHJpbmcoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGVJbnRlcm5hbENvbnRhaW5lcigpICE9IG51bGwpCi0JCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQlpZiAobmV3RGlhZ3JhbSAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCkgbmV3RGlhZ3JhbSkuZUludmVyc2VBZGQodGhpcywKLQkJCQkJCVVtYVBhY2thZ2UuRElBR1JBTV9fTkFNRVNQQUNFLCBEaWFncmFtLmNsYXNzLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldERpYWdyYW0obmV3RGlhZ3JhbSwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKQotCQkJCW1zZ3MuZGlzcGF0Y2goKTsKLQkJfSBlbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuU0VNQU5USUNfTU9ERUxfQlJJREdFX19ESUFHUkFNLCBuZXdEaWFncmFtLAotCQkJCQluZXdEaWFncmFtKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlQWRkKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwKLQkJCWludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlNFTUFOVElDX01PREVMX0JSSURHRV9fRElBR1JBTToKLQkJCWlmIChlSW50ZXJuYWxDb250YWluZXIoKSAhPSBudWxsKQotCQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJcmV0dXJuIGJhc2ljU2V0RGlhZ3JhbSgoRGlhZ3JhbSkgb3RoZXJFbmQsIG1zZ3MpOwotCQljYXNlIFVtYVBhY2thZ2UuU0VNQU5USUNfTU9ERUxfQlJJREdFX19HUkFQSF9FTEVNRU5UOgotCQkJaWYgKGVJbnRlcm5hbENvbnRhaW5lcigpICE9IG51bGwpCi0JCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQlyZXR1cm4gYmFzaWNTZXRHcmFwaEVsZW1lbnQoKEdyYXBoRWxlbWVudCkgb3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZUFkZChvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLAotCQkJaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuU0VNQU5USUNfTU9ERUxfQlJJREdFX19ESUFHUkFNOgotCQkJcmV0dXJuIGJhc2ljU2V0RGlhZ3JhbShudWxsLCBtc2dzKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlNFTUFOVElDX01PREVMX0JSSURHRV9fR1JBUEhfRUxFTUVOVDoKLQkJCXJldHVybiBiYXNpY1NldEdyYXBoRWxlbWVudChudWxsLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVCYXNpY1JlbW92ZUZyb21Db250YWluZXJGZWF0dXJlKAotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGVDb250YWluZXJGZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlNFTUFOVElDX01PREVMX0JSSURHRV9fRElBR1JBTToKLQkJCXJldHVybiBlSW50ZXJuYWxDb250YWluZXIoKS5lSW52ZXJzZVJlbW92ZSh0aGlzLAotCQkJCQlVbWFQYWNrYWdlLkRJQUdSQU1fX05BTUVTUEFDRSwgRGlhZ3JhbS5jbGFzcywgbXNncyk7Ci0JCWNhc2UgVW1hUGFja2FnZS5TRU1BTlRJQ19NT0RFTF9CUklER0VfX0dSQVBIX0VMRU1FTlQ6Ci0JCQlyZXR1cm4gZUludGVybmFsQ29udGFpbmVyKCkuZUludmVyc2VSZW1vdmUodGhpcywKLQkJCQkJVW1hUGFja2FnZS5HUkFQSF9FTEVNRU5UX19TRU1BTlRJQ19NT0RFTCwKLQkJCQkJR3JhcGhFbGVtZW50LmNsYXNzLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lckZlYXR1cmUobXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuU0VNQU5USUNfTU9ERUxfQlJJREdFX19QUkVTRU5UQVRJT046Ci0JCQlyZXR1cm4gZ2V0UHJlc2VudGF0aW9uKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5TRU1BTlRJQ19NT0RFTF9CUklER0VfX0RJQUdSQU06Ci0JCQlpZiAocmVzb2x2ZSkKLQkJCQlyZXR1cm4gZ2V0RGlhZ3JhbSgpOwotCQkJcmV0dXJuIGJhc2ljR2V0RGlhZ3JhbSgpOwotCQljYXNlIFVtYVBhY2thZ2UuU0VNQU5USUNfTU9ERUxfQlJJREdFX19HUkFQSF9FTEVNRU5UOgotCQkJaWYgKHJlc29sdmUpCi0JCQkJcmV0dXJuIGdldEdyYXBoRWxlbWVudCgpOwotCQkJcmV0dXJuIGJhc2ljR2V0R3JhcGhFbGVtZW50KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlNFTUFOVElDX01PREVMX0JSSURHRV9fUFJFU0VOVEFUSU9OOgotCQkJc2V0UHJlc2VudGF0aW9uKChTdHJpbmcpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlNFTUFOVElDX01PREVMX0JSSURHRV9fRElBR1JBTToKLQkJCXNldERpYWdyYW0oKERpYWdyYW0pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlNFTUFOVElDX01PREVMX0JSSURHRV9fR1JBUEhfRUxFTUVOVDoKLQkJCXNldEdyYXBoRWxlbWVudCgoR3JhcGhFbGVtZW50KSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuU0VNQU5USUNfTU9ERUxfQlJJREdFX19QUkVTRU5UQVRJT046Ci0JCQlzZXRQcmVzZW50YXRpb24oUFJFU0VOVEFUSU9OX0VERUZBVUxUKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlNFTUFOVElDX01PREVMX0JSSURHRV9fRElBR1JBTToKLQkJCXNldERpYWdyYW0oKERpYWdyYW0pIG51bGwpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuU0VNQU5USUNfTU9ERUxfQlJJREdFX19HUkFQSF9FTEVNRU5UOgotCQkJc2V0R3JhcGhFbGVtZW50KChHcmFwaEVsZW1lbnQpIG51bGwpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCS8vVU1BLS0+Ci0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gZ2V0RmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWUoZmVhdHVyZUlEKTsKLQkJaWYgKGZlYXR1cmUgIT0gbnVsbCkgewotCQkJcmV0dXJuIGlzRmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWVTZXQoZmVhdHVyZSk7Ci0JCX0KLQkJLy9VTUE8LS0JCQotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuU0VNQU5USUNfTU9ERUxfQlJJREdFX19QUkVTRU5UQVRJT046Ci0JCQlyZXR1cm4gUFJFU0VOVEFUSU9OX0VERUZBVUxUID09IG51bGwgPyBwcmVzZW50YXRpb24gIT0gbnVsbAotCQkJCQk6ICFQUkVTRU5UQVRJT05fRURFRkFVTFQuZXF1YWxzKHByZXNlbnRhdGlvbik7Ci0JCWNhc2UgVW1hUGFja2FnZS5TRU1BTlRJQ19NT0RFTF9CUklER0VfX0RJQUdSQU06Ci0JCQlyZXR1cm4gYmFzaWNHZXREaWFncmFtKCkgIT0gbnVsbDsKLQkJY2FzZSBVbWFQYWNrYWdlLlNFTUFOVElDX01PREVMX0JSSURHRV9fR1JBUEhfRUxFTUVOVDoKLQkJCXJldHVybiBiYXNpY0dldEdyYXBoRWxlbWVudCgpICE9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKQotCQkJcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAocHJlc2VudGF0aW9uOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKHByZXNlbnRhdGlvbik7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL1NlbWFudGljTW9kZWxCcmlkZ2VJbXBsCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnRJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5NTBmNWQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1NpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5TaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5TaW1wbGUgU2VtYW50aWMgTW9kZWwgRWxlbWVudDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlNpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50SW1wbCNnZXRUeXBlSW5mbyA8ZW0+VHlwZSBJbmZvPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnRJbXBsIGV4dGVuZHMgU2VtYW50aWNNb2RlbEJyaWRnZUltcGwKLQkJaW1wbGVtZW50cyBTaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudCB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VHlwZUluZm8oKSA8ZW0+VHlwZSBJbmZvPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUeXBlSW5mbygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQRV9JTkZPX0VERUZBVUxUID0gIiI7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUeXBlSW5mbygpIDxlbT5UeXBlIEluZm88L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFR5cGVJbmZvKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHR5cGVJbmZvID0gVFlQRV9JTkZPX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFNpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQotCQkvL1VNQS0tPgotCQlyZWFzc2lnbkRlZmF1bHRWYWx1ZXMoKTsKLQkJLy9VTUE8LS0gIAotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5TSU1QTEVfU0VNQU5USUNfTU9ERUxfRUxFTUVOVDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGVJbmZvKCkgewotCQlyZXR1cm4gdHlwZUluZm87Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VHlwZUluZm8oU3RyaW5nIG5ld1R5cGVJbmZvKSB7Ci0JCVN0cmluZyBvbGRUeXBlSW5mbyA9IHR5cGVJbmZvOwotCQl0eXBlSW5mbyA9IG5ld1R5cGVJbmZvOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLlNJTVBMRV9TRU1BTlRJQ19NT0RFTF9FTEVNRU5UX19UWVBFX0lORk8sCi0JCQkJCW9sZFR5cGVJbmZvLCB0eXBlSW5mbykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlNJTVBMRV9TRU1BTlRJQ19NT0RFTF9FTEVNRU5UX19UWVBFX0lORk86Ci0JCQlyZXR1cm4gZ2V0VHlwZUluZm8oKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuU0lNUExFX1NFTUFOVElDX01PREVMX0VMRU1FTlRfX1RZUEVfSU5GTzoKLQkJCXNldFR5cGVJbmZvKChTdHJpbmcpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5TSU1QTEVfU0VNQU5USUNfTU9ERUxfRUxFTUVOVF9fVFlQRV9JTkZPOgotCQkJc2V0VHlwZUluZm8oVFlQRV9JTkZPX0VERUZBVUxUKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQkvL1VNQS0tPgotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IGdldEZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlKGZlYXR1cmVJRCk7Ci0JCWlmIChmZWF0dXJlICE9IG51bGwpIHsKLQkJCXJldHVybiBpc0ZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlU2V0KGZlYXR1cmUpOwotCQl9Ci0JCS8vVU1BPC0tCQkKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlNJTVBMRV9TRU1BTlRJQ19NT0RFTF9FTEVNRU5UX19UWVBFX0lORk86Ci0JCQlyZXR1cm4gVFlQRV9JTkZPX0VERUZBVUxUID09IG51bGwgPyB0eXBlSW5mbyAhPSBudWxsCi0JCQkJCTogIVRZUEVfSU5GT19FREVGQVVMVC5lcXVhbHModHlwZUluZm8pOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkKLQkJCXJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHR5cGVJbmZvOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKHR5cGVJbmZvKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnRJbXBsCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvU3RlcEltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9TdGVwSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMmU4NmQ0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9TdGVwSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzk2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnN0cmFpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5TdGVwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtEZWZpbml0aW9uOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+U3RlcDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlN0ZXBJbXBsI2dldFByZWNvbmRpdGlvbiA8ZW0+UHJlY29uZGl0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuU3RlcEltcGwjZ2V0UG9zdGNvbmRpdGlvbiA8ZW0+UG9zdGNvbmRpdGlvbjwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFN0ZXBJbXBsIGV4dGVuZHMgU2VjdGlvbkltcGwgaW1wbGVtZW50cyBTdGVwIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByZWNvbmRpdGlvbigpIDxlbT5QcmVjb25kaXRpb248L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFByZWNvbmRpdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIENvbnN0cmFpbnQgcHJlY29uZGl0aW9uOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UG9zdGNvbmRpdGlvbigpIDxlbT5Qb3N0Y29uZGl0aW9uPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQb3N0Y29uZGl0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29uc3RyYWludCBwb3N0Y29uZGl0aW9uOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFN0ZXBJbXBsKCkgewotCQlzdXBlcigpOwotCi0JCS8vVU1BLS0+Ci0JCXJlYXNzaWduRGVmYXVsdFZhbHVlcygpOwotCQkvL1VNQTwtLSAgCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLlNURVA7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENvbnN0cmFpbnQgZ2V0UHJlY29uZGl0aW9uKCkgewotCQlpZiAocHJlY29uZGl0aW9uICE9IG51bGwgJiYgKChFT2JqZWN0KSBwcmVjb25kaXRpb24pLmVJc1Byb3h5KCkpIHsKLQkJCUludGVybmFsRU9iamVjdCBvbGRQcmVjb25kaXRpb24gPSAoSW50ZXJuYWxFT2JqZWN0KSBwcmVjb25kaXRpb247Ci0JCQlwcmVjb25kaXRpb24gPSAoQ29uc3RyYWludCkgZVJlc29sdmVQcm94eShvbGRQcmVjb25kaXRpb24pOwotCQkJaWYgKHByZWNvbmRpdGlvbiAhPSBvbGRQcmVjb25kaXRpb24pIHsKLQkJCQlJbnRlcm5hbEVPYmplY3QgbmV3UHJlY29uZGl0aW9uID0gKEludGVybmFsRU9iamVjdCkgcHJlY29uZGl0aW9uOwotCQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBvbGRQcmVjb25kaXRpb24uZUludmVyc2VSZW1vdmUodGhpcywKLQkJCQkJCUVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBVbWFQYWNrYWdlLlNURVBfX1BSRUNPTkRJVElPTiwKLQkJCQkJCW51bGwsIG51bGwpOwotCQkJCWlmIChuZXdQcmVjb25kaXRpb24uZUludGVybmFsQ29udGFpbmVyKCkgPT0gbnVsbCkgewotCQkJCQltc2dzID0gbmV3UHJlY29uZGl0aW9uCi0JCQkJCQkJLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UKLQkJCQkJCQkJCS0gVW1hUGFja2FnZS5TVEVQX19QUkVDT05ESVRJT04sIG51bGwsIG1zZ3MpOwotCQkJCX0KLQkJCQlpZiAobXNncyAhPSBudWxsKQotCQkJCQltc2dzLmRpc3BhdGNoKCk7Ci0JCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwKLQkJCQkJCQlVbWFQYWNrYWdlLlNURVBfX1BSRUNPTkRJVElPTiwgb2xkUHJlY29uZGl0aW9uLAotCQkJCQkJCXByZWNvbmRpdGlvbikpOwotCQkJfQotCQl9Ci0JCXJldHVybiBwcmVjb25kaXRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENvbnN0cmFpbnQgYmFzaWNHZXRQcmVjb25kaXRpb24oKSB7Ci0JCXJldHVybiBwcmVjb25kaXRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0UHJlY29uZGl0aW9uKENvbnN0cmFpbnQgbmV3UHJlY29uZGl0aW9uLAotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlDb25zdHJhaW50IG9sZFByZWNvbmRpdGlvbiA9IHByZWNvbmRpdGlvbjsKLQkJcHJlY29uZGl0aW9uID0gbmV3UHJlY29uZGl0aW9uOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLAotCQkJCQlOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLlNURVBfX1BSRUNPTkRJVElPTiwKLQkJCQkJb2xkUHJlY29uZGl0aW9uLCBuZXdQcmVjb25kaXRpb24pOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkKLQkJCQltc2dzID0gbm90aWZpY2F0aW9uOwotCQkJZWxzZQotCQkJCW1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHJlY29uZGl0aW9uKENvbnN0cmFpbnQgbmV3UHJlY29uZGl0aW9uKSB7Ci0JCWlmIChuZXdQcmVjb25kaXRpb24gIT0gcHJlY29uZGl0aW9uKSB7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChwcmVjb25kaXRpb24gIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpIHByZWNvbmRpdGlvbikuZUludmVyc2VSZW1vdmUodGhpcywKLQkJCQkJCUVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBVbWFQYWNrYWdlLlNURVBfX1BSRUNPTkRJVElPTiwKLQkJCQkJCW51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld1ByZWNvbmRpdGlvbiAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCkgbmV3UHJlY29uZGl0aW9uKS5lSW52ZXJzZUFkZCh0aGlzLAotCQkJCQkJRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIFVtYVBhY2thZ2UuU1RFUF9fUFJFQ09ORElUSU9OLAotCQkJCQkJbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRQcmVjb25kaXRpb24obmV3UHJlY29uZGl0aW9uLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpCi0JCQkJbXNncy5kaXNwYXRjaCgpOwotCQl9IGVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5TVEVQX19QUkVDT05ESVRJT04sIG5ld1ByZWNvbmRpdGlvbiwKLQkJCQkJbmV3UHJlY29uZGl0aW9uKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENvbnN0cmFpbnQgZ2V0UG9zdGNvbmRpdGlvbigpIHsKLQkJaWYgKHBvc3Rjb25kaXRpb24gIT0gbnVsbCAmJiAoKEVPYmplY3QpIHBvc3Rjb25kaXRpb24pLmVJc1Byb3h5KCkpIHsKLQkJCUludGVybmFsRU9iamVjdCBvbGRQb3N0Y29uZGl0aW9uID0gKEludGVybmFsRU9iamVjdCkgcG9zdGNvbmRpdGlvbjsKLQkJCXBvc3Rjb25kaXRpb24gPSAoQ29uc3RyYWludCkgZVJlc29sdmVQcm94eShvbGRQb3N0Y29uZGl0aW9uKTsKLQkJCWlmIChwb3N0Y29uZGl0aW9uICE9IG9sZFBvc3Rjb25kaXRpb24pIHsKLQkJCQlJbnRlcm5hbEVPYmplY3QgbmV3UG9zdGNvbmRpdGlvbiA9IChJbnRlcm5hbEVPYmplY3QpIHBvc3Rjb25kaXRpb247Ci0JCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG9sZFBvc3Rjb25kaXRpb24KLQkJCQkJCS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFCi0JCQkJCQkJCS0gVW1hUGFja2FnZS5TVEVQX19QT1NUQ09ORElUSU9OLCBudWxsLCBudWxsKTsKLQkJCQlpZiAobmV3UG9zdGNvbmRpdGlvbi5lSW50ZXJuYWxDb250YWluZXIoKSA9PSBudWxsKSB7Ci0JCQkJCW1zZ3MgPSBuZXdQb3N0Y29uZGl0aW9uLmVJbnZlcnNlQWRkKHRoaXMsCi0JCQkJCQkJRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRQotCQkJCQkJCQkJLSBVbWFQYWNrYWdlLlNURVBfX1BPU1RDT05ESVRJT04sIG51bGwsCi0JCQkJCQkJbXNncyk7Ci0JCQkJfQotCQkJCWlmIChtc2dzICE9IG51bGwpCi0JCQkJCW1zZ3MuZGlzcGF0Y2goKTsKLQkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLAotCQkJCQkJCVVtYVBhY2thZ2UuU1RFUF9fUE9TVENPTkRJVElPTiwgb2xkUG9zdGNvbmRpdGlvbiwKLQkJCQkJCQlwb3N0Y29uZGl0aW9uKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHBvc3Rjb25kaXRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENvbnN0cmFpbnQgYmFzaWNHZXRQb3N0Y29uZGl0aW9uKCkgewotCQlyZXR1cm4gcG9zdGNvbmRpdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRQb3N0Y29uZGl0aW9uKENvbnN0cmFpbnQgbmV3UG9zdGNvbmRpdGlvbiwKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJQ29uc3RyYWludCBvbGRQb3N0Y29uZGl0aW9uID0gcG9zdGNvbmRpdGlvbjsKLQkJcG9zdGNvbmRpdGlvbiA9IG5ld1Bvc3Rjb25kaXRpb247Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsCi0JCQkJCU5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuU1RFUF9fUE9TVENPTkRJVElPTiwKLQkJCQkJb2xkUG9zdGNvbmRpdGlvbiwgbmV3UG9zdGNvbmRpdGlvbik7Ci0JCQlpZiAobXNncyA9PSBudWxsKQotCQkJCW1zZ3MgPSBub3RpZmljYXRpb247Ci0JCQllbHNlCi0JCQkJbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQb3N0Y29uZGl0aW9uKENvbnN0cmFpbnQgbmV3UG9zdGNvbmRpdGlvbikgewotCQlpZiAobmV3UG9zdGNvbmRpdGlvbiAhPSBwb3N0Y29uZGl0aW9uKSB7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChwb3N0Y29uZGl0aW9uICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KSBwb3N0Y29uZGl0aW9uKQotCQkJCQkJLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UKLQkJCQkJCQkJLSBVbWFQYWNrYWdlLlNURVBfX1BPU1RDT05ESVRJT04sIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld1Bvc3Rjb25kaXRpb24gIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpIG5ld1Bvc3Rjb25kaXRpb24pCi0JCQkJCQkuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRQotCQkJCQkJCQktIFVtYVBhY2thZ2UuU1RFUF9fUE9TVENPTkRJVElPTiwgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRQb3N0Y29uZGl0aW9uKG5ld1Bvc3Rjb25kaXRpb24sIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkKLQkJCQltc2dzLmRpc3BhdGNoKCk7Ci0JCX0gZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLlNURVBfX1BPU1RDT05ESVRJT04sIG5ld1Bvc3Rjb25kaXRpb24sCi0JCQkJCW5ld1Bvc3Rjb25kaXRpb24pKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLAotCQkJaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuU1RFUF9fUFJFQ09ORElUSU9OOgotCQkJcmV0dXJuIGJhc2ljU2V0UHJlY29uZGl0aW9uKG51bGwsIG1zZ3MpOwotCQljYXNlIFVtYVBhY2thZ2UuU1RFUF9fUE9TVENPTkRJVElPTjoKLQkJCXJldHVybiBiYXNpY1NldFBvc3Rjb25kaXRpb24obnVsbCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlNURVBfX1BSRUNPTkRJVElPTjoKLQkJCWlmIChyZXNvbHZlKQotCQkJCXJldHVybiBnZXRQcmVjb25kaXRpb24oKTsKLQkJCXJldHVybiBiYXNpY0dldFByZWNvbmRpdGlvbigpOwotCQljYXNlIFVtYVBhY2thZ2UuU1RFUF9fUE9TVENPTkRJVElPTjoKLQkJCWlmIChyZXNvbHZlKQotCQkJCXJldHVybiBnZXRQb3N0Y29uZGl0aW9uKCk7Ci0JCQlyZXR1cm4gYmFzaWNHZXRQb3N0Y29uZGl0aW9uKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlNURVBfX1BSRUNPTkRJVElPTjoKLQkJCXNldFByZWNvbmRpdGlvbigoQ29uc3RyYWludCkgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuU1RFUF9fUE9TVENPTkRJVElPTjoKLQkJCXNldFBvc3Rjb25kaXRpb24oKENvbnN0cmFpbnQpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5TVEVQX19QUkVDT05ESVRJT046Ci0JCQlzZXRQcmVjb25kaXRpb24oKENvbnN0cmFpbnQpIG51bGwpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuU1RFUF9fUE9TVENPTkRJVElPTjoKLQkJCXNldFBvc3Rjb25kaXRpb24oKENvbnN0cmFpbnQpIG51bGwpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCS8vVU1BLS0+Ci0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gZ2V0RmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWUoZmVhdHVyZUlEKTsKLQkJaWYgKGZlYXR1cmUgIT0gbnVsbCkgewotCQkJcmV0dXJuIGlzRmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWVTZXQoZmVhdHVyZSk7Ci0JCX0KLQkJLy9VTUE8LS0JCQotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuU1RFUF9fUFJFQ09ORElUSU9OOgotCQkJcmV0dXJuIHByZWNvbmRpdGlvbiAhPSBudWxsOwotCQljYXNlIFVtYVBhY2thZ2UuU1RFUF9fUE9TVENPTkRJVElPTjoKLQkJCXJldHVybiBwb3N0Y29uZGl0aW9uICE9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBpbnQgZUJhc2VTdHJ1Y3R1cmFsRmVhdHVyZUlEKGludCBkZXJpdmVkRmVhdHVyZUlELCBDbGFzczw/PiBiYXNlQ2xhc3MpIHsKLQkJaWYgKGJhc2VDbGFzcyA9PSBXb3JrRGVmaW5pdGlvbi5jbGFzcykgewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuU1RFUF9fUFJFQ09ORElUSU9OOgotCQkJCXJldHVybiBVbWFQYWNrYWdlLldPUktfREVGSU5JVElPTl9fUFJFQ09ORElUSU9OOwotCQkJY2FzZSBVbWFQYWNrYWdlLlNURVBfX1BPU1RDT05ESVRJT046Ci0JCQkJcmV0dXJuIFVtYVBhY2thZ2UuV09SS19ERUZJTklUSU9OX19QT1NUQ09ORElUSU9OOwotCQkJZGVmYXVsdDoKLQkJCQlyZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVCYXNlU3RydWN0dXJhbEZlYXR1cmVJRChkZXJpdmVkRmVhdHVyZUlELCBiYXNlQ2xhc3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBpbnQgZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGludCBiYXNlRmVhdHVyZUlELCBDbGFzczw/PiBiYXNlQ2xhc3MpIHsKLQkJaWYgKGJhc2VDbGFzcyA9PSBXb3JrRGVmaW5pdGlvbi5jbGFzcykgewotCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19ERUZJTklUSU9OX19QUkVDT05ESVRJT046Ci0JCQkJcmV0dXJuIFVtYVBhY2thZ2UuU1RFUF9fUFJFQ09ORElUSU9OOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfREVGSU5JVElPTl9fUE9TVENPTkRJVElPTjoKLQkJCQlyZXR1cm4gVW1hUGFja2FnZS5TVEVQX19QT1NUQ09ORElUSU9OOwotCQkJZGVmYXVsdDoKLQkJCQlyZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChiYXNlRmVhdHVyZUlELCBiYXNlQ2xhc3MpOwotCX0KLQotfSAvL1N0ZXBJbXBsCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvU3VwcG9ydGluZ01hdGVyaWFsSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1N1cHBvcnRpbmdNYXRlcmlhbEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGZjMWRjYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvU3VwcG9ydGluZ01hdGVyaWFsSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlN1cHBvcnRpbmdNYXRlcmlhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5TdXBwb3J0aW5nIE1hdGVyaWFsPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgU3VwcG9ydGluZ01hdGVyaWFsSW1wbCBleHRlbmRzIEd1aWRhbmNlSW1wbCBpbXBsZW1lbnRzCi0JCVN1cHBvcnRpbmdNYXRlcmlhbCB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3VwcG9ydGluZ01hdGVyaWFsSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQotCQkvL1VNQS0tPgotCQlyZWFzc2lnbkRlZmF1bHRWYWx1ZXMoKTsKLQkJLy9VTUE8LS0gIAotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5TVVBQT1JUSU5HX01BVEVSSUFMOwotCX0KLQotfSAvL1N1cHBvcnRpbmdNYXRlcmlhbEltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9UYXNrRGVzY3JpcHRpb25JbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvVGFza0Rlc2NyaXB0aW9uSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ODUyZmNkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9UYXNrRGVzY3JpcHRpb25JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5UYXNrIERlc2NyaXB0aW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVGFza0Rlc2NyaXB0aW9uSW1wbCNnZXRQdXJwb3NlIDxlbT5QdXJwb3NlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVGFza0Rlc2NyaXB0aW9uSW1wbCNnZXRBbHRlcm5hdGl2ZXMgPGVtPkFsdGVybmF0aXZlczwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFRhc2tEZXNjcmlwdGlvbkltcGwgZXh0ZW5kcyBDb250ZW50RGVzY3JpcHRpb25JbXBsIGltcGxlbWVudHMKLQkJVGFza0Rlc2NyaXB0aW9uIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQdXJwb3NlKCkgPGVtPlB1cnBvc2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFB1cnBvc2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBVUlBPU0VfRURFRkFVTFQgPSAiIjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFB1cnBvc2UoKSA8ZW0+UHVycG9zZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UHVycG9zZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBwdXJwb3NlID0gUFVSUE9TRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBbHRlcm5hdGl2ZXMoKSA8ZW0+QWx0ZXJuYXRpdmVzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBbHRlcm5hdGl2ZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEFMVEVSTkFUSVZFU19FREVGQVVMVCA9ICIiOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QWx0ZXJuYXRpdmVzKCkgPGVtPkFsdGVybmF0aXZlczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QWx0ZXJuYXRpdmVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGFsdGVybmF0aXZlcyA9IEFMVEVSTkFUSVZFU19FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBUYXNrRGVzY3JpcHRpb25JbXBsKCkgewotCQlzdXBlcigpOwotCi0JCS8vVU1BLS0+Ci0JCXJlYXNzaWduRGVmYXVsdFZhbHVlcygpOwotCQkvL1VNQTwtLSAgCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLlRBU0tfREVTQ1JJUFRJT047Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQdXJwb3NlKCkgewotCQlyZXR1cm4gcHVycG9zZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQdXJwb3NlKFN0cmluZyBuZXdQdXJwb3NlKSB7Ci0JCVN0cmluZyBvbGRQdXJwb3NlID0gcHVycG9zZTsKLQkJcHVycG9zZSA9IG5ld1B1cnBvc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuVEFTS19ERVNDUklQVElPTl9fUFVSUE9TRSwgb2xkUHVycG9zZSwgcHVycG9zZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0QWx0ZXJuYXRpdmVzKCkgewotCQlyZXR1cm4gYWx0ZXJuYXRpdmVzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFsdGVybmF0aXZlcyhTdHJpbmcgbmV3QWx0ZXJuYXRpdmVzKSB7Ci0JCVN0cmluZyBvbGRBbHRlcm5hdGl2ZXMgPSBhbHRlcm5hdGl2ZXM7Ci0JCWFsdGVybmF0aXZlcyA9IG5ld0FsdGVybmF0aXZlczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUSU9OX19BTFRFUk5BVElWRVMsIG9sZEFsdGVybmF0aXZlcywKLQkJCQkJYWx0ZXJuYXRpdmVzKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVElPTl9fUFVSUE9TRToKLQkJCXJldHVybiBnZXRQdXJwb3NlKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUSU9OX19BTFRFUk5BVElWRVM6Ci0JCQlyZXR1cm4gZ2V0QWx0ZXJuYXRpdmVzKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRJT05fX1BVUlBPU0U6Ci0JCQlzZXRQdXJwb3NlKChTdHJpbmcpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRJT05fX0FMVEVSTkFUSVZFUzoKLQkJCXNldEFsdGVybmF0aXZlcygoU3RyaW5nKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVElPTl9fUFVSUE9TRToKLQkJCXNldFB1cnBvc2UoUFVSUE9TRV9FREVGQVVMVCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUSU9OX19BTFRFUk5BVElWRVM6Ci0JCQlzZXRBbHRlcm5hdGl2ZXMoQUxURVJOQVRJVkVTX0VERUZBVUxUKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQkvL1VNQS0tPgotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IGdldEZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlKGZlYXR1cmVJRCk7Ci0JCWlmIChmZWF0dXJlICE9IG51bGwpIHsKLQkJCXJldHVybiBpc0ZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlU2V0KGZlYXR1cmUpOwotCQl9Ci0JCS8vVU1BPC0tCQkKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRJT05fX1BVUlBPU0U6Ci0JCQlyZXR1cm4gUFVSUE9TRV9FREVGQVVMVCA9PSBudWxsID8gcHVycG9zZSAhPSBudWxsCi0JCQkJCTogIVBVUlBPU0VfRURFRkFVTFQuZXF1YWxzKHB1cnBvc2UpOwotCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVElPTl9fQUxURVJOQVRJVkVTOgotCQkJcmV0dXJuIEFMVEVSTkFUSVZFU19FREVGQVVMVCA9PSBudWxsID8gYWx0ZXJuYXRpdmVzICE9IG51bGwKLQkJCQkJOiAhQUxURVJOQVRJVkVTX0VERUZBVUxULmVxdWFscyhhbHRlcm5hdGl2ZXMpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkKLQkJCXJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHB1cnBvc2U6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQocHVycG9zZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgYWx0ZXJuYXRpdmVzOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGFsdGVybmF0aXZlcyk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL1Rhc2tEZXNjcmlwdGlvbkltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9UYXNrRGVzY3JpcHRvckltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9UYXNrRGVzY3JpcHRvckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmVlZDdhYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvVGFza0Rlc2NyaXB0b3JJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MDkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RSZXNvbHZpbmdFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlNlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUudXRpbC5EZWZhdWx0VmFsdWVNYW5hZ2VyOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+VGFzayBEZXNjcmlwdG9yPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVGFza0Rlc2NyaXB0b3JJbXBsI2dldElzU3luY2hyb25pemVkV2l0aFNvdXJjZSA8ZW0+SXMgU3luY2hyb25pemVkIFdpdGggU291cmNlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVGFza0Rlc2NyaXB0b3JJbXBsI2dldFRhc2sgPGVtPlRhc2s8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5UYXNrRGVzY3JpcHRvckltcGwjZ2V0QWRkaXRpb25hbGx5UGVyZm9ybWVkQnkgPGVtPkFkZGl0aW9uYWxseSBQZXJmb3JtZWQgQnk8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5UYXNrRGVzY3JpcHRvckltcGwjZ2V0QXNzaXN0ZWRCeSA8ZW0+QXNzaXN0ZWQgQnk8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5UYXNrRGVzY3JpcHRvckltcGwjZ2V0RXh0ZXJuYWxJbnB1dCA8ZW0+RXh0ZXJuYWwgSW5wdXQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5UYXNrRGVzY3JpcHRvckltcGwjZ2V0TWFuZGF0b3J5SW5wdXQgPGVtPk1hbmRhdG9yeSBJbnB1dDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlRhc2tEZXNjcmlwdG9ySW1wbCNnZXRPcHRpb25hbElucHV0IDxlbT5PcHRpb25hbCBJbnB1dDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlRhc2tEZXNjcmlwdG9ySW1wbCNnZXRPdXRwdXQgPGVtPk91dHB1dDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlRhc2tEZXNjcmlwdG9ySW1wbCNnZXRQZXJmb3JtZWRQcmltYXJpbHlCeSA8ZW0+UGVyZm9ybWVkIFByaW1hcmlseSBCeTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlRhc2tEZXNjcmlwdG9ySW1wbCNnZXRTZWxlY3RlZFN0ZXBzIDxlbT5TZWxlY3RlZCBTdGVwczwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFRhc2tEZXNjcmlwdG9ySW1wbCBleHRlbmRzIFdvcmtCcmVha2Rvd25FbGVtZW50SW1wbCBpbXBsZW1lbnRzCi0JCVRhc2tEZXNjcmlwdG9yIHsKLQkvKioKLQkgKiBDb21tZW50IGZvciA8Y29kZT5zZXJpYWxWZXJzaW9uVUlEPC9jb2RlPgotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC00NDE5NDE0NjY0MjczOTEwODYzTDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UoKSA8ZW0+SXMgU3luY2hyb25pemVkIFdpdGggU291cmNlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQm9vbGVhbiBJU19TWU5DSFJPTklaRURfV0lUSF9TT1VSQ0VfRURFRkFVTFQgPSBCb29sZWFuLlRSVUU7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UoKSA8ZW0+SXMgU3luY2hyb25pemVkIFdpdGggU291cmNlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCb29sZWFuIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZSA9IElTX1NZTkNIUk9OSVpFRF9XSVRIX1NPVVJDRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFRhc2soKSA8ZW0+VGFzazwvZW0+fScgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VGFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFRhc2sgdGFzazsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5KCkgPGVtPkFkZGl0aW9uYWxseSBQZXJmb3JtZWQgQnk8L2VtPn0nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QWRkaXRpb25hbGx5UGVyZm9ybWVkQnkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxSb2xlRGVzY3JpcHRvcj4gYWRkaXRpb25hbGx5UGVyZm9ybWVkQnk7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBc3Npc3RlZEJ5KCkgPGVtPkFzc2lzdGVkIEJ5PC9lbT59JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFzc2lzdGVkQnkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxSb2xlRGVzY3JpcHRvcj4gYXNzaXN0ZWRCeTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEV4dGVybmFsSW5wdXQoKSA8ZW0+RXh0ZXJuYWwgSW5wdXQ8L2VtPn0nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RXh0ZXJuYWxJbnB1dCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PFdvcmtQcm9kdWN0RGVzY3JpcHRvcj4gZXh0ZXJuYWxJbnB1dDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1hbmRhdG9yeUlucHV0KCkgPGVtPk1hbmRhdG9yeSBJbnB1dDwvZW0+fScgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRNYW5kYXRvcnlJbnB1dCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PFdvcmtQcm9kdWN0RGVzY3JpcHRvcj4gbWFuZGF0b3J5SW5wdXQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRPcHRpb25hbElucHV0KCkgPGVtPk9wdGlvbmFsIElucHV0PC9lbT59JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE9wdGlvbmFsSW5wdXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxXb3JrUHJvZHVjdERlc2NyaXB0b3I+IG9wdGlvbmFsSW5wdXQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRPdXRwdXQoKSA8ZW0+T3V0cHV0PC9lbT59JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE91dHB1dCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PFdvcmtQcm9kdWN0RGVzY3JpcHRvcj4gb3V0cHV0OwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UGVyZm9ybWVkUHJpbWFyaWx5QnkoKSA8ZW0+UGVyZm9ybWVkIFByaW1hcmlseSBCeTwvZW0+fScgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQZXJmb3JtZWRQcmltYXJpbHlCeSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PFJvbGVEZXNjcmlwdG9yPiBwZXJmb3JtZWRQcmltYXJpbHlCeTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNlbGVjdGVkU3RlcHMoKSA8ZW0+U2VsZWN0ZWQgU3RlcHM8L2VtPn0nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U2VsZWN0ZWRTdGVwcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PFNlY3Rpb24+IHNlbGVjdGVkU3RlcHM7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgVGFza0Rlc2NyaXB0b3JJbXBsKCkgewotCQlzdXBlcigpOwotCi0JCS8vVU1BLS0+Ci0JCXJlYXNzaWduRGVmYXVsdFZhbHVlcygpOwotCQkvL1VNQTwtLSAgCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLlRBU0tfREVTQ1JJUFRPUjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQm9vbGVhbiBnZXRJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UoKSB7Ci0JCXJldHVybiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKEJvb2xlYW4gbmV3SXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKSB7Ci0JCUJvb2xlYW4gb2xkSXNTeW5jaHJvbml6ZWRXaXRoU291cmNlID0gaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlOwotCQlpc1N5bmNocm9uaXplZFdpdGhTb3VyY2UgPSBuZXdJc1N5bmNocm9uaXplZFdpdGhTb3VyY2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19JU19TWU5DSFJPTklaRURfV0lUSF9TT1VSQ0UsCi0JCQkJCW9sZElzU3luY2hyb25pemVkV2l0aFNvdXJjZSwgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFRhc2sgZ2V0VGFzaygpIHsKLQkJaWYgKHRhc2sgIT0gbnVsbCAmJiAoKEVPYmplY3QpIHRhc2spLmVJc1Byb3h5KCkpIHsKLQkJCUludGVybmFsRU9iamVjdCBvbGRUYXNrID0gKEludGVybmFsRU9iamVjdCkgdGFzazsKLQkJCXRhc2sgPSAoVGFzaykgZVJlc29sdmVQcm94eShvbGRUYXNrKTsKLQkJCWlmICh0YXNrICE9IG9sZFRhc2spIHsKLQkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLAotCQkJCQkJCVVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19UQVNLLCBvbGRUYXNrLCB0YXNrKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRhc2s7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFRhc2sgYmFzaWNHZXRUYXNrKCkgewotCQlyZXR1cm4gdGFzazsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUYXNrKFRhc2sgbmV3VGFzaykgewotCQlUYXNrIG9sZFRhc2sgPSB0YXNrOwotCQl0YXNrID0gbmV3VGFzazsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX1RBU0ssIG9sZFRhc2ssIHRhc2spKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdDxSb2xlRGVzY3JpcHRvcj4gZ2V0QWRkaXRpb25hbGx5UGVyZm9ybWVkQnkoKSB7Ci0JCWlmIChhZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSA9PSBudWxsKSB7Ci0JCQlhZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSA9IG5ldyBFT2JqZWN0UmVzb2x2aW5nRUxpc3Q8Um9sZURlc2NyaXB0b3I+KAotCQkJCQlSb2xlRGVzY3JpcHRvci5jbGFzcywgdGhpcywKLQkJCQkJVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX0FERElUSU9OQUxMWV9QRVJGT1JNRURfQlkpOwotCQl9Ci0JCXJldHVybiBhZGRpdGlvbmFsbHlQZXJmb3JtZWRCeTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdDxSb2xlRGVzY3JpcHRvcj4gZ2V0QXNzaXN0ZWRCeSgpIHsKLQkJaWYgKGFzc2lzdGVkQnkgPT0gbnVsbCkgewotCQkJYXNzaXN0ZWRCeSA9IG5ldyBFT2JqZWN0UmVzb2x2aW5nRUxpc3Q8Um9sZURlc2NyaXB0b3I+KAotCQkJCQlSb2xlRGVzY3JpcHRvci5jbGFzcywgdGhpcywKLQkJCQkJVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX0FTU0lTVEVEX0JZKTsKLQkJfQotCQlyZXR1cm4gYXNzaXN0ZWRCeTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdDxXb3JrUHJvZHVjdERlc2NyaXB0b3I+IGdldEV4dGVybmFsSW5wdXQoKSB7Ci0JCWlmIChleHRlcm5hbElucHV0ID09IG51bGwpIHsKLQkJCWV4dGVybmFsSW5wdXQgPSBuZXcgRU9iamVjdFJlc29sdmluZ0VMaXN0PFdvcmtQcm9kdWN0RGVzY3JpcHRvcj4oCi0JCQkJCVdvcmtQcm9kdWN0RGVzY3JpcHRvci5jbGFzcywgdGhpcywKLQkJCQkJVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX0VYVEVSTkFMX0lOUFVUKTsKLQkJfQotCQlyZXR1cm4gZXh0ZXJuYWxJbnB1dDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdDxXb3JrUHJvZHVjdERlc2NyaXB0b3I+IGdldE1hbmRhdG9yeUlucHV0KCkgewotCQlpZiAobWFuZGF0b3J5SW5wdXQgPT0gbnVsbCkgewotCQkJbWFuZGF0b3J5SW5wdXQgPSBuZXcgRU9iamVjdFJlc29sdmluZ0VMaXN0PFdvcmtQcm9kdWN0RGVzY3JpcHRvcj4oCi0JCQkJCVdvcmtQcm9kdWN0RGVzY3JpcHRvci5jbGFzcywgdGhpcywKLQkJCQkJVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX01BTkRBVE9SWV9JTlBVVCk7Ci0JCX0KLQkJcmV0dXJuIG1hbmRhdG9yeUlucHV0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0PFdvcmtQcm9kdWN0RGVzY3JpcHRvcj4gZ2V0T3B0aW9uYWxJbnB1dCgpIHsKLQkJaWYgKG9wdGlvbmFsSW5wdXQgPT0gbnVsbCkgewotCQkJb3B0aW9uYWxJbnB1dCA9IG5ldyBFT2JqZWN0UmVzb2x2aW5nRUxpc3Q8V29ya1Byb2R1Y3REZXNjcmlwdG9yPigKLQkJCQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yLmNsYXNzLCB0aGlzLAotCQkJCQlVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fT1BUSU9OQUxfSU5QVVQpOwotCQl9Ci0JCXJldHVybiBvcHRpb25hbElucHV0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0PFdvcmtQcm9kdWN0RGVzY3JpcHRvcj4gZ2V0T3V0cHV0KCkgewotCQlpZiAob3V0cHV0ID09IG51bGwpIHsKLQkJCW91dHB1dCA9IG5ldyBFT2JqZWN0UmVzb2x2aW5nRUxpc3Q8V29ya1Byb2R1Y3REZXNjcmlwdG9yPigKLQkJCQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yLmNsYXNzLCB0aGlzLAotCQkJCQlVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fT1VUUFVUKTsKLQkJfQotCQlyZXR1cm4gb3V0cHV0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0PFJvbGVEZXNjcmlwdG9yPiBnZXRQZXJmb3JtZWRQcmltYXJpbHlCeSgpIHsKLQkJaWYgKHBlcmZvcm1lZFByaW1hcmlseUJ5ID09IG51bGwpIHsKLQkJCXBlcmZvcm1lZFByaW1hcmlseUJ5ID0gbmV3IEVPYmplY3RSZXNvbHZpbmdFTGlzdDxSb2xlRGVzY3JpcHRvcj4oCi0JCQkJCVJvbGVEZXNjcmlwdG9yLmNsYXNzLCB0aGlzLAotCQkJCQlVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fUEVSRk9STUVEX1BSSU1BUklMWV9CWSk7Ci0JCX0KLQkJcmV0dXJuIHBlcmZvcm1lZFByaW1hcmlseUJ5OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0PFNlY3Rpb24+IGdldFNlbGVjdGVkU3RlcHMoKSB7Ci0JCWlmIChzZWxlY3RlZFN0ZXBzID09IG51bGwpIHsKLQkJCXNlbGVjdGVkU3RlcHMgPSBuZXcgRU9iamVjdFJlc29sdmluZ0VMaXN0PFNlY3Rpb24+KFNlY3Rpb24uY2xhc3MsCi0JCQkJCXRoaXMsIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19TRUxFQ1RFRF9TVEVQUyk7Ci0JCX0KLQkJcmV0dXJuIHNlbGVjdGVkU3RlcHM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19JU19TWU5DSFJPTklaRURfV0lUSF9TT1VSQ0U6Ci0JCQlyZXR1cm4gZ2V0SXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX1RBU0s6Ci0JCQlpZiAocmVzb2x2ZSkKLQkJCQlyZXR1cm4gZ2V0VGFzaygpOwotCQkJcmV0dXJuIGJhc2ljR2V0VGFzaygpOwotCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19BRERJVElPTkFMTFlfUEVSRk9STUVEX0JZOgotCQkJcmV0dXJuIGdldEFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX0FTU0lTVEVEX0JZOgotCQkJcmV0dXJuIGdldEFzc2lzdGVkQnkoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fRVhURVJOQUxfSU5QVVQ6Ci0JCQlyZXR1cm4gZ2V0RXh0ZXJuYWxJbnB1dCgpOwotCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19NQU5EQVRPUllfSU5QVVQ6Ci0JCQlyZXR1cm4gZ2V0TWFuZGF0b3J5SW5wdXQoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fT1BUSU9OQUxfSU5QVVQ6Ci0JCQlyZXR1cm4gZ2V0T3B0aW9uYWxJbnB1dCgpOwotCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19PVVRQVVQ6Ci0JCQlyZXR1cm4gZ2V0T3V0cHV0KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX1BFUkZPUk1FRF9QUklNQVJJTFlfQlk6Ci0JCQlyZXR1cm4gZ2V0UGVyZm9ybWVkUHJpbWFyaWx5QnkoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fU0VMRUNURURfU1RFUFM6Ci0JCQlyZXR1cm4gZ2V0U2VsZWN0ZWRTdGVwcygpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX0lTX1NZTkNIUk9OSVpFRF9XSVRIX1NPVVJDRToKLQkJCXNldElzU3luY2hyb25pemVkV2l0aFNvdXJjZSgoQm9vbGVhbikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19UQVNLOgotCQkJc2V0VGFzaygoVGFzaykgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19BRERJVElPTkFMTFlfUEVSRk9STUVEX0JZOgotCQkJZ2V0QWRkaXRpb25hbGx5UGVyZm9ybWVkQnkoKS5jbGVhcigpOwotCQkJZ2V0QWRkaXRpb25hbGx5UGVyZm9ybWVkQnkoKS5hZGRBbGwoCi0JCQkJCShDb2xsZWN0aW9uPD8gZXh0ZW5kcyBSb2xlRGVzY3JpcHRvcj4pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fQVNTSVNURURfQlk6Ci0JCQlnZXRBc3Npc3RlZEJ5KCkuY2xlYXIoKTsKLQkJCWdldEFzc2lzdGVkQnkoKS5hZGRBbGwoCi0JCQkJCShDb2xsZWN0aW9uPD8gZXh0ZW5kcyBSb2xlRGVzY3JpcHRvcj4pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fRVhURVJOQUxfSU5QVVQ6Ci0JCQlnZXRFeHRlcm5hbElucHV0KCkuY2xlYXIoKTsKLQkJCWdldEV4dGVybmFsSW5wdXQoKS5hZGRBbGwoCi0JCQkJCShDb2xsZWN0aW9uPD8gZXh0ZW5kcyBXb3JrUHJvZHVjdERlc2NyaXB0b3I+KSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX01BTkRBVE9SWV9JTlBVVDoKLQkJCWdldE1hbmRhdG9yeUlucHV0KCkuY2xlYXIoKTsKLQkJCWdldE1hbmRhdG9yeUlucHV0KCkuYWRkQWxsKAotCQkJCQkoQ29sbGVjdGlvbjw/IGV4dGVuZHMgV29ya1Byb2R1Y3REZXNjcmlwdG9yPikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19PUFRJT05BTF9JTlBVVDoKLQkJCWdldE9wdGlvbmFsSW5wdXQoKS5jbGVhcigpOwotCQkJZ2V0T3B0aW9uYWxJbnB1dCgpLmFkZEFsbCgKLQkJCQkJKENvbGxlY3Rpb248PyBleHRlbmRzIFdvcmtQcm9kdWN0RGVzY3JpcHRvcj4pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fT1VUUFVUOgotCQkJZ2V0T3V0cHV0KCkuY2xlYXIoKTsKLQkJCWdldE91dHB1dCgpLmFkZEFsbCgKLQkJCQkJKENvbGxlY3Rpb248PyBleHRlbmRzIFdvcmtQcm9kdWN0RGVzY3JpcHRvcj4pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fUEVSRk9STUVEX1BSSU1BUklMWV9CWToKLQkJCWdldFBlcmZvcm1lZFByaW1hcmlseUJ5KCkuY2xlYXIoKTsKLQkJCWdldFBlcmZvcm1lZFByaW1hcmlseUJ5KCkuYWRkQWxsKAotCQkJCQkoQ29sbGVjdGlvbjw/IGV4dGVuZHMgUm9sZURlc2NyaXB0b3I+KSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX1NFTEVDVEVEX1NURVBTOgotCQkJZ2V0U2VsZWN0ZWRTdGVwcygpLmNsZWFyKCk7Ci0JCQlnZXRTZWxlY3RlZFN0ZXBzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBTZWN0aW9uPikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fSVNfU1lOQ0hST05JWkVEX1dJVEhfU09VUkNFOgotCQkJc2V0SXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKElTX1NZTkNIUk9OSVpFRF9XSVRIX1NPVVJDRV9FREVGQVVMVCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX1RBU0s6Ci0JCQlzZXRUYXNrKChUYXNrKSBudWxsKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fQURESVRJT05BTExZX1BFUkZPUk1FRF9CWToKLQkJCWdldEFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5KCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fQVNTSVNURURfQlk6Ci0JCQlnZXRBc3Npc3RlZEJ5KCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fRVhURVJOQUxfSU5QVVQ6Ci0JCQlnZXRFeHRlcm5hbElucHV0KCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fTUFOREFUT1JZX0lOUFVUOgotCQkJZ2V0TWFuZGF0b3J5SW5wdXQoKS5jbGVhcigpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19PUFRJT05BTF9JTlBVVDoKLQkJCWdldE9wdGlvbmFsSW5wdXQoKS5jbGVhcigpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19PVVRQVVQ6Ci0JCQlnZXRPdXRwdXQoKS5jbGVhcigpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19QRVJGT1JNRURfUFJJTUFSSUxZX0JZOgotCQkJZ2V0UGVyZm9ybWVkUHJpbWFyaWx5QnkoKS5jbGVhcigpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19TRUxFQ1RFRF9TVEVQUzoKLQkJCWdldFNlbGVjdGVkU3RlcHMoKS5jbGVhcigpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCS8vVU1BLS0+Ci0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gZ2V0RmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWUoZmVhdHVyZUlEKTsKLQkJaWYgKGZlYXR1cmUgIT0gbnVsbCkgewotCQkJcmV0dXJuIGlzRmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWVTZXQoZmVhdHVyZSk7Ci0JCX0KLQkJLy9VTUE8LS0JCQotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19JU19TWU5DSFJPTklaRURfV0lUSF9TT1VSQ0U6Ci0JCQlyZXR1cm4gSVNfU1lOQ0hST05JWkVEX1dJVEhfU09VUkNFX0VERUZBVUxUID09IG51bGwgPyBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2UgIT0gbnVsbAotCQkJCQk6ICFJU19TWU5DSFJPTklaRURfV0lUSF9TT1VSQ0VfRURFRkFVTFQKLQkJCQkJCQkuZXF1YWxzKGlzU3luY2hyb25pemVkV2l0aFNvdXJjZSk7Ci0JCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX1RBU0s6Ci0JCQlyZXR1cm4gdGFzayAhPSBudWxsOwotCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19BRERJVElPTkFMTFlfUEVSRk9STUVEX0JZOgotCQkJcmV0dXJuIGFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5ICE9IG51bGwKLQkJCQkJJiYgIWFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5LmlzRW1wdHkoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fQVNTSVNURURfQlk6Ci0JCQlyZXR1cm4gYXNzaXN0ZWRCeSAhPSBudWxsICYmICFhc3Npc3RlZEJ5LmlzRW1wdHkoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fRVhURVJOQUxfSU5QVVQ6Ci0JCQlyZXR1cm4gZXh0ZXJuYWxJbnB1dCAhPSBudWxsICYmICFleHRlcm5hbElucHV0LmlzRW1wdHkoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fTUFOREFUT1JZX0lOUFVUOgotCQkJcmV0dXJuIG1hbmRhdG9yeUlucHV0ICE9IG51bGwgJiYgIW1hbmRhdG9yeUlucHV0LmlzRW1wdHkoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fT1BUSU9OQUxfSU5QVVQ6Ci0JCQlyZXR1cm4gb3B0aW9uYWxJbnB1dCAhPSBudWxsICYmICFvcHRpb25hbElucHV0LmlzRW1wdHkoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fT1VUUFVUOgotCQkJcmV0dXJuIG91dHB1dCAhPSBudWxsICYmICFvdXRwdXQuaXNFbXB0eSgpOwotCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19QRVJGT1JNRURfUFJJTUFSSUxZX0JZOgotCQkJcmV0dXJuIHBlcmZvcm1lZFByaW1hcmlseUJ5ICE9IG51bGwKLQkJCQkJJiYgIXBlcmZvcm1lZFByaW1hcmlseUJ5LmlzRW1wdHkoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fU0VMRUNURURfU1RFUFM6Ci0JCQlyZXR1cm4gc2VsZWN0ZWRTdGVwcyAhPSBudWxsICYmICFzZWxlY3RlZFN0ZXBzLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGludCBlQmFzZVN0cnVjdHVyYWxGZWF0dXJlSUQoaW50IGRlcml2ZWRGZWF0dXJlSUQsIENsYXNzPD8+IGJhc2VDbGFzcykgewotCQlpZiAoYmFzZUNsYXNzID09IERlc2NyaXB0b3IuY2xhc3MpIHsKLQkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fSVNfU1lOQ0hST05JWkVEX1dJVEhfU09VUkNFOgotCQkJCXJldHVybiBVbWFQYWNrYWdlLkRFU0NSSVBUT1JfX0lTX1NZTkNIUk9OSVpFRF9XSVRIX1NPVVJDRTsKLQkJCWRlZmF1bHQ6Ci0JCQkJcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCXJldHVybiBzdXBlci5lQmFzZVN0cnVjdHVyYWxGZWF0dXJlSUQoZGVyaXZlZEZlYXR1cmVJRCwgYmFzZUNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgaW50IGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChpbnQgYmFzZUZlYXR1cmVJRCwgQ2xhc3M8Pz4gYmFzZUNsYXNzKSB7Ci0JCWlmIChiYXNlQ2xhc3MgPT0gRGVzY3JpcHRvci5jbGFzcykgewotCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuREVTQ1JJUFRPUl9fSVNfU1lOQ0hST05JWkVEX1dJVEhfU09VUkNFOgotCQkJCXJldHVybiBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fSVNfU1lOQ0hST05JWkVEX1dJVEhfU09VUkNFOwotCQkJZGVmYXVsdDoKLQkJCQlyZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChiYXNlRmVhdHVyZUlELCBiYXNlQ2xhc3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKQotCQkJcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGlzU3luY2hyb25pemVkV2l0aFNvdXJjZSk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCS8vIEJlZ2luIG9mIGN1c3RvbSBjb2RlIAotCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi0Jc3RhdGljIHsKLQkJLy8gb3ZlcnJpZGUgdGhlIGRlZmF1bHQgdmFsdWUgb2YgQnJlYWtkb3duRWxlbWVudC5pc1BsYW5uZWQKLQkJLy8KLQkJRGVmYXVsdFZhbHVlTWFuYWdlci5JTlNUQU5DRS5zZXRTdGF0aWNEZWZhdWx0VmFsdWUoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0VGFza0Rlc2NyaXB0b3IoKSwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0QnJlYWtkb3duRWxlbWVudF9Jc1BsYW5uZWQoKSwgQm9vbGVhbi5GQUxTRSk7Ci0JfQotfSAvL1Rhc2tEZXNjcmlwdG9ySW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1Rhc2tJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvVGFza0ltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGE3MjcwZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvVGFza0ltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdFJlc29sdmluZ0VMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29uc3RyYWludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkVzdGltYXRpb25Db25zaWRlcmF0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5TdGVwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFzazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRvb2xNZW50b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlRhc2s8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5UYXNrSW1wbCNnZXRQcmVjb25kaXRpb24gPGVtPlByZWNvbmRpdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlRhc2tJbXBsI2dldFBvc3Rjb25kaXRpb24gPGVtPlBvc3Rjb25kaXRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5UYXNrSW1wbCNnZXRQZXJmb3JtZWRCeSA8ZW0+UGVyZm9ybWVkIEJ5PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVGFza0ltcGwjZ2V0TWFuZGF0b3J5SW5wdXQgPGVtPk1hbmRhdG9yeSBJbnB1dDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlRhc2tJbXBsI2dldE91dHB1dCA8ZW0+T3V0cHV0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVGFza0ltcGwjZ2V0QWRkaXRpb25hbGx5UGVyZm9ybWVkQnkgPGVtPkFkZGl0aW9uYWxseSBQZXJmb3JtZWQgQnk8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5UYXNrSW1wbCNnZXRPcHRpb25hbElucHV0IDxlbT5PcHRpb25hbCBJbnB1dDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlRhc2tJbXBsI2dldFN0ZXBzIDxlbT5TdGVwczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlRhc2tJbXBsI2dldFRvb2xNZW50b3JzIDxlbT5Ub29sIE1lbnRvcnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5UYXNrSW1wbCNnZXRFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMgPGVtPkVzdGltYXRpb24gQ29uc2lkZXJhdGlvbnM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBUYXNrSW1wbCBleHRlbmRzIENvbnRlbnRFbGVtZW50SW1wbCBpbXBsZW1lbnRzIFRhc2sgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJlY29uZGl0aW9uKCkgPGVtPlByZWNvbmRpdGlvbjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UHJlY29uZGl0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29uc3RyYWludCBwcmVjb25kaXRpb247Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQb3N0Y29uZGl0aW9uKCkgPGVtPlBvc3Rjb25kaXRpb248L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFBvc3Rjb25kaXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBDb25zdHJhaW50IHBvc3Rjb25kaXRpb247Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQZXJmb3JtZWRCeSgpIDxlbT5QZXJmb3JtZWQgQnk8L2VtPn0nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UGVyZm9ybWVkQnkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxSb2xlPiBwZXJmb3JtZWRCeTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1hbmRhdG9yeUlucHV0KCkgPGVtPk1hbmRhdG9yeSBJbnB1dDwvZW0+fScgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRNYW5kYXRvcnlJbnB1dCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PFdvcmtQcm9kdWN0PiBtYW5kYXRvcnlJbnB1dDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE91dHB1dCgpIDxlbT5PdXRwdXQ8L2VtPn0nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0T3V0cHV0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8V29ya1Byb2R1Y3Q+IG91dHB1dDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5KCkgPGVtPkFkZGl0aW9uYWxseSBQZXJmb3JtZWQgQnk8L2VtPn0nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QWRkaXRpb25hbGx5UGVyZm9ybWVkQnkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxSb2xlPiBhZGRpdGlvbmFsbHlQZXJmb3JtZWRCeTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE9wdGlvbmFsSW5wdXQoKSA8ZW0+T3B0aW9uYWwgSW5wdXQ8L2VtPn0nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0T3B0aW9uYWxJbnB1dCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PFdvcmtQcm9kdWN0PiBvcHRpb25hbElucHV0OwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VG9vbE1lbnRvcnMoKSA8ZW0+VG9vbCBNZW50b3JzPC9lbT59JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFRvb2xNZW50b3JzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8VG9vbE1lbnRvcj4gdG9vbE1lbnRvcnM7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMoKSA8ZW0+RXN0aW1hdGlvbiBDb25zaWRlcmF0aW9uczwvZW0+fScgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnM+IGVzdGltYXRpb25Db25zaWRlcmF0aW9uczsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBUYXNrSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQotCQkvL1VNQS0tPgotCQlyZWFzc2lnbkRlZmF1bHRWYWx1ZXMoKTsKLQkJLy9VTUE8LS0gIAotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5UQVNLOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb25zdHJhaW50IGdldFByZWNvbmRpdGlvbigpIHsKLQkJaWYgKHByZWNvbmRpdGlvbiAhPSBudWxsICYmICgoRU9iamVjdCkgcHJlY29uZGl0aW9uKS5lSXNQcm94eSgpKSB7Ci0JCQlJbnRlcm5hbEVPYmplY3Qgb2xkUHJlY29uZGl0aW9uID0gKEludGVybmFsRU9iamVjdCkgcHJlY29uZGl0aW9uOwotCQkJcHJlY29uZGl0aW9uID0gKENvbnN0cmFpbnQpIGVSZXNvbHZlUHJveHkob2xkUHJlY29uZGl0aW9uKTsKLQkJCWlmIChwcmVjb25kaXRpb24gIT0gb2xkUHJlY29uZGl0aW9uKSB7Ci0JCQkJSW50ZXJuYWxFT2JqZWN0IG5ld1ByZWNvbmRpdGlvbiA9IChJbnRlcm5hbEVPYmplY3QpIHByZWNvbmRpdGlvbjsKLQkJCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gb2xkUHJlY29uZGl0aW9uLmVJbnZlcnNlUmVtb3ZlKHRoaXMsCi0JCQkJCQlFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gVW1hUGFja2FnZS5UQVNLX19QUkVDT05ESVRJT04sCi0JCQkJCQludWxsLCBudWxsKTsKLQkJCQlpZiAobmV3UHJlY29uZGl0aW9uLmVJbnRlcm5hbENvbnRhaW5lcigpID09IG51bGwpIHsKLQkJCQkJbXNncyA9IG5ld1ByZWNvbmRpdGlvbgotCQkJCQkJCS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFCi0JCQkJCQkJCQktIFVtYVBhY2thZ2UuVEFTS19fUFJFQ09ORElUSU9OLCBudWxsLCBtc2dzKTsKLQkJCQl9Ci0JCQkJaWYgKG1zZ3MgIT0gbnVsbCkKLQkJCQkJbXNncy5kaXNwYXRjaCgpOwotCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlJFU09MVkUsCi0JCQkJCQkJVW1hUGFja2FnZS5UQVNLX19QUkVDT05ESVRJT04sIG9sZFByZWNvbmRpdGlvbiwKLQkJCQkJCQlwcmVjb25kaXRpb24pKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcHJlY29uZGl0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb25zdHJhaW50IGJhc2ljR2V0UHJlY29uZGl0aW9uKCkgewotCQlyZXR1cm4gcHJlY29uZGl0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldFByZWNvbmRpdGlvbihDb25zdHJhaW50IG5ld1ByZWNvbmRpdGlvbiwKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJQ29uc3RyYWludCBvbGRQcmVjb25kaXRpb24gPSBwcmVjb25kaXRpb247Ci0JCXByZWNvbmRpdGlvbiA9IG5ld1ByZWNvbmRpdGlvbjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywKLQkJCQkJTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5UQVNLX19QUkVDT05ESVRJT04sCi0JCQkJCW9sZFByZWNvbmRpdGlvbiwgbmV3UHJlY29uZGl0aW9uKTsKLQkJCWlmIChtc2dzID09IG51bGwpCi0JCQkJbXNncyA9IG5vdGlmaWNhdGlvbjsKLQkJCWVsc2UKLQkJCQltc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFByZWNvbmRpdGlvbihDb25zdHJhaW50IG5ld1ByZWNvbmRpdGlvbikgewotCQlpZiAobmV3UHJlY29uZGl0aW9uICE9IHByZWNvbmRpdGlvbikgewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAocHJlY29uZGl0aW9uICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KSBwcmVjb25kaXRpb24pLmVJbnZlcnNlUmVtb3ZlKHRoaXMsCi0JCQkJCQlFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gVW1hUGFja2FnZS5UQVNLX19QUkVDT05ESVRJT04sCi0JCQkJCQludWxsLCBtc2dzKTsKLQkJCWlmIChuZXdQcmVjb25kaXRpb24gIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpIG5ld1ByZWNvbmRpdGlvbikuZUludmVyc2VBZGQodGhpcywKLQkJCQkJCUVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBVbWFQYWNrYWdlLlRBU0tfX1BSRUNPTkRJVElPTiwKLQkJCQkJCW51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0UHJlY29uZGl0aW9uKG5ld1ByZWNvbmRpdGlvbiwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKQotCQkJCW1zZ3MuZGlzcGF0Y2goKTsKLQkJfSBlbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuVEFTS19fUFJFQ09ORElUSU9OLCBuZXdQcmVjb25kaXRpb24sCi0JCQkJCW5ld1ByZWNvbmRpdGlvbikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb25zdHJhaW50IGdldFBvc3Rjb25kaXRpb24oKSB7Ci0JCWlmIChwb3N0Y29uZGl0aW9uICE9IG51bGwgJiYgKChFT2JqZWN0KSBwb3N0Y29uZGl0aW9uKS5lSXNQcm94eSgpKSB7Ci0JCQlJbnRlcm5hbEVPYmplY3Qgb2xkUG9zdGNvbmRpdGlvbiA9IChJbnRlcm5hbEVPYmplY3QpIHBvc3Rjb25kaXRpb247Ci0JCQlwb3N0Y29uZGl0aW9uID0gKENvbnN0cmFpbnQpIGVSZXNvbHZlUHJveHkob2xkUG9zdGNvbmRpdGlvbik7Ci0JCQlpZiAocG9zdGNvbmRpdGlvbiAhPSBvbGRQb3N0Y29uZGl0aW9uKSB7Ci0JCQkJSW50ZXJuYWxFT2JqZWN0IG5ld1Bvc3Rjb25kaXRpb24gPSAoSW50ZXJuYWxFT2JqZWN0KSBwb3N0Y29uZGl0aW9uOwotCQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBvbGRQb3N0Y29uZGl0aW9uCi0JCQkJCQkuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRQotCQkJCQkJCQktIFVtYVBhY2thZ2UuVEFTS19fUE9TVENPTkRJVElPTiwgbnVsbCwgbnVsbCk7Ci0JCQkJaWYgKG5ld1Bvc3Rjb25kaXRpb24uZUludGVybmFsQ29udGFpbmVyKCkgPT0gbnVsbCkgewotCQkJCQltc2dzID0gbmV3UG9zdGNvbmRpdGlvbi5lSW52ZXJzZUFkZCh0aGlzLAotCQkJCQkJCUVPUFBPU0lURV9GRUFUVVJFX0JBU0UKLQkJCQkJCQkJCS0gVW1hUGFja2FnZS5UQVNLX19QT1NUQ09ORElUSU9OLCBudWxsLAotCQkJCQkJCW1zZ3MpOwotCQkJCX0KLQkJCQlpZiAobXNncyAhPSBudWxsKQotCQkJCQltc2dzLmRpc3BhdGNoKCk7Ci0JCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwKLQkJCQkJCQlVbWFQYWNrYWdlLlRBU0tfX1BPU1RDT05ESVRJT04sIG9sZFBvc3Rjb25kaXRpb24sCi0JCQkJCQkJcG9zdGNvbmRpdGlvbikpOwotCQkJfQotCQl9Ci0JCXJldHVybiBwb3N0Y29uZGl0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb25zdHJhaW50IGJhc2ljR2V0UG9zdGNvbmRpdGlvbigpIHsKLQkJcmV0dXJuIHBvc3Rjb25kaXRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0UG9zdGNvbmRpdGlvbihDb25zdHJhaW50IG5ld1Bvc3Rjb25kaXRpb24sCi0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCUNvbnN0cmFpbnQgb2xkUG9zdGNvbmRpdGlvbiA9IHBvc3Rjb25kaXRpb247Ci0JCXBvc3Rjb25kaXRpb24gPSBuZXdQb3N0Y29uZGl0aW9uOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLAotCQkJCQlOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLlRBU0tfX1BPU1RDT05ESVRJT04sCi0JCQkJCW9sZFBvc3Rjb25kaXRpb24sIG5ld1Bvc3Rjb25kaXRpb24pOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkKLQkJCQltc2dzID0gbm90aWZpY2F0aW9uOwotCQkJZWxzZQotCQkJCW1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UG9zdGNvbmRpdGlvbihDb25zdHJhaW50IG5ld1Bvc3Rjb25kaXRpb24pIHsKLQkJaWYgKG5ld1Bvc3Rjb25kaXRpb24gIT0gcG9zdGNvbmRpdGlvbikgewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAocG9zdGNvbmRpdGlvbiAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCkgcG9zdGNvbmRpdGlvbikKLQkJCQkJCS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFCi0JCQkJCQkJCS0gVW1hUGFja2FnZS5UQVNLX19QT1NUQ09ORElUSU9OLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdQb3N0Y29uZGl0aW9uICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KSBuZXdQb3N0Y29uZGl0aW9uKQotCQkJCQkJLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UKLQkJCQkJCQkJLSBVbWFQYWNrYWdlLlRBU0tfX1BPU1RDT05ESVRJT04sIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0UG9zdGNvbmRpdGlvbihuZXdQb3N0Y29uZGl0aW9uLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpCi0JCQkJbXNncy5kaXNwYXRjaCgpOwotCQl9IGVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5UQVNLX19QT1NUQ09ORElUSU9OLCBuZXdQb3N0Y29uZGl0aW9uLAotCQkJCQluZXdQb3N0Y29uZGl0aW9uKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3Q8Um9sZT4gZ2V0UGVyZm9ybWVkQnkoKSB7Ci0JCWlmIChwZXJmb3JtZWRCeSA9PSBudWxsKSB7Ci0JCQlwZXJmb3JtZWRCeSA9IG5ldyBFT2JqZWN0UmVzb2x2aW5nRUxpc3Q8Um9sZT4oUm9sZS5jbGFzcywgdGhpcywKLQkJCQkJVW1hUGFja2FnZS5UQVNLX19QRVJGT1JNRURfQlkpOwotCQl9Ci0JCXJldHVybiBwZXJmb3JtZWRCeTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdDxXb3JrUHJvZHVjdD4gZ2V0TWFuZGF0b3J5SW5wdXQoKSB7Ci0JCWlmIChtYW5kYXRvcnlJbnB1dCA9PSBudWxsKSB7Ci0JCQltYW5kYXRvcnlJbnB1dCA9IG5ldyBFT2JqZWN0UmVzb2x2aW5nRUxpc3Q8V29ya1Byb2R1Y3Q+KAotCQkJCQlXb3JrUHJvZHVjdC5jbGFzcywgdGhpcywgVW1hUGFja2FnZS5UQVNLX19NQU5EQVRPUllfSU5QVVQpOwotCQl9Ci0JCXJldHVybiBtYW5kYXRvcnlJbnB1dDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdDxXb3JrUHJvZHVjdD4gZ2V0T3V0cHV0KCkgewotCQlpZiAob3V0cHV0ID09IG51bGwpIHsKLQkJCW91dHB1dCA9IG5ldyBFT2JqZWN0UmVzb2x2aW5nRUxpc3Q8V29ya1Byb2R1Y3Q+KFdvcmtQcm9kdWN0LmNsYXNzLAotCQkJCQl0aGlzLCBVbWFQYWNrYWdlLlRBU0tfX09VVFBVVCk7Ci0JCX0KLQkJcmV0dXJuIG91dHB1dDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdDxSb2xlPiBnZXRBZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSgpIHsKLQkJaWYgKGFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5ID09IG51bGwpIHsKLQkJCWFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5ID0gbmV3IEVPYmplY3RSZXNvbHZpbmdFTGlzdDxSb2xlPigKLQkJCQkJUm9sZS5jbGFzcywgdGhpcywKLQkJCQkJVW1hUGFja2FnZS5UQVNLX19BRERJVElPTkFMTFlfUEVSRk9STUVEX0JZKTsKLQkJfQotCQlyZXR1cm4gYWRkaXRpb25hbGx5UGVyZm9ybWVkQnk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3Q8V29ya1Byb2R1Y3Q+IGdldE9wdGlvbmFsSW5wdXQoKSB7Ci0JCWlmIChvcHRpb25hbElucHV0ID09IG51bGwpIHsKLQkJCW9wdGlvbmFsSW5wdXQgPSBuZXcgRU9iamVjdFJlc29sdmluZ0VMaXN0PFdvcmtQcm9kdWN0PigKLQkJCQkJV29ya1Byb2R1Y3QuY2xhc3MsIHRoaXMsIFVtYVBhY2thZ2UuVEFTS19fT1BUSU9OQUxfSU5QVVQpOwotCQl9Ci0JCXJldHVybiBvcHRpb25hbElucHV0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICovCi0JcHVibGljIExpc3QgZ2V0U3RlcHMoKSB7Ci0JCXJldHVybiBnZXRQcmVzZW50YXRpb24oKS5nZXRTZWN0aW9ucygpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0PFRvb2xNZW50b3I+IGdldFRvb2xNZW50b3JzKCkgewotCQlpZiAodG9vbE1lbnRvcnMgPT0gbnVsbCkgewotCQkJdG9vbE1lbnRvcnMgPSBuZXcgRU9iamVjdFJlc29sdmluZ0VMaXN0PFRvb2xNZW50b3I+KAotCQkJCQlUb29sTWVudG9yLmNsYXNzLCB0aGlzLCBVbWFQYWNrYWdlLlRBU0tfX1RPT0xfTUVOVE9SUyk7Ci0JCX0KLQkJcmV0dXJuIHRvb2xNZW50b3JzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0PEVzdGltYXRpb25Db25zaWRlcmF0aW9ucz4gZ2V0RXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKCkgewotCQlpZiAoZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zID09IG51bGwpIHsKLQkJCWVzdGltYXRpb25Db25zaWRlcmF0aW9ucyA9IG5ldyBFT2JqZWN0UmVzb2x2aW5nRUxpc3Q8RXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zPigKLQkJCQkJRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zLmNsYXNzLCB0aGlzLAotCQkJCQlVbWFQYWNrYWdlLlRBU0tfX0VTVElNQVRJT05fQ09OU0lERVJBVElPTlMpOwotCQl9Ci0JCXJldHVybiBlc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwKLQkJCWludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfX1BSRUNPTkRJVElPTjoKLQkJCXJldHVybiBiYXNpY1NldFByZWNvbmRpdGlvbihudWxsLCBtc2dzKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfX1BPU1RDT05ESVRJT046Ci0JCQlyZXR1cm4gYmFzaWNTZXRQb3N0Y29uZGl0aW9uKG51bGwsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5UQVNLX19QUkVDT05ESVRJT046Ci0JCQlpZiAocmVzb2x2ZSkKLQkJCQlyZXR1cm4gZ2V0UHJlY29uZGl0aW9uKCk7Ci0JCQlyZXR1cm4gYmFzaWNHZXRQcmVjb25kaXRpb24oKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfX1BPU1RDT05ESVRJT046Ci0JCQlpZiAocmVzb2x2ZSkKLQkJCQlyZXR1cm4gZ2V0UG9zdGNvbmRpdGlvbigpOwotCQkJcmV0dXJuIGJhc2ljR2V0UG9zdGNvbmRpdGlvbigpOwotCQljYXNlIFVtYVBhY2thZ2UuVEFTS19fUEVSRk9STUVEX0JZOgotCQkJcmV0dXJuIGdldFBlcmZvcm1lZEJ5KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5UQVNLX19NQU5EQVRPUllfSU5QVVQ6Ci0JCQlyZXR1cm4gZ2V0TWFuZGF0b3J5SW5wdXQoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfX09VVFBVVDoKLQkJCXJldHVybiBnZXRPdXRwdXQoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfX0FERElUSU9OQUxMWV9QRVJGT1JNRURfQlk6Ci0JCQlyZXR1cm4gZ2V0QWRkaXRpb25hbGx5UGVyZm9ybWVkQnkoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfX09QVElPTkFMX0lOUFVUOgotCQkJcmV0dXJuIGdldE9wdGlvbmFsSW5wdXQoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfX1NURVBTOgotCQkJcmV0dXJuIGdldFN0ZXBzKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5UQVNLX19UT09MX01FTlRPUlM6Ci0JCQlyZXR1cm4gZ2V0VG9vbE1lbnRvcnMoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfX0VTVElNQVRJT05fQ09OU0lERVJBVElPTlM6Ci0JCQlyZXR1cm4gZ2V0RXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfX1BSRUNPTkRJVElPTjoKLQkJCXNldFByZWNvbmRpdGlvbigoQ29uc3RyYWludCkgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuVEFTS19fUE9TVENPTkRJVElPTjoKLQkJCXNldFBvc3Rjb25kaXRpb24oKENvbnN0cmFpbnQpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfX1BFUkZPUk1FRF9CWToKLQkJCWdldFBlcmZvcm1lZEJ5KCkuY2xlYXIoKTsKLQkJCWdldFBlcmZvcm1lZEJ5KCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBSb2xlPikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuVEFTS19fTUFOREFUT1JZX0lOUFVUOgotCQkJZ2V0TWFuZGF0b3J5SW5wdXQoKS5jbGVhcigpOwotCQkJZ2V0TWFuZGF0b3J5SW5wdXQoKS5hZGRBbGwoCi0JCQkJCShDb2xsZWN0aW9uPD8gZXh0ZW5kcyBXb3JrUHJvZHVjdD4pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfX09VVFBVVDoKLQkJCWdldE91dHB1dCgpLmNsZWFyKCk7Ci0JCQlnZXRPdXRwdXQoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFdvcmtQcm9kdWN0PikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuVEFTS19fQURESVRJT05BTExZX1BFUkZPUk1FRF9CWToKLQkJCWdldEFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5KCkuY2xlYXIoKTsKLQkJCWdldEFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5KCkuYWRkQWxsKAotCQkJCQkoQ29sbGVjdGlvbjw/IGV4dGVuZHMgUm9sZT4pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfX09QVElPTkFMX0lOUFVUOgotCQkJZ2V0T3B0aW9uYWxJbnB1dCgpLmNsZWFyKCk7Ci0JCQlnZXRPcHRpb25hbElucHV0KCkuYWRkQWxsKAotCQkJCQkoQ29sbGVjdGlvbjw/IGV4dGVuZHMgV29ya1Byb2R1Y3Q+KSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5UQVNLX19TVEVQUzoKLQkJCWdldFN0ZXBzKCkuY2xlYXIoKTsKLQkJCWdldFN0ZXBzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBTdGVwPikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuVEFTS19fVE9PTF9NRU5UT1JTOgotCQkJZ2V0VG9vbE1lbnRvcnMoKS5jbGVhcigpOwotCQkJZ2V0VG9vbE1lbnRvcnMoKQotCQkJCQkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBUb29sTWVudG9yPikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuVEFTS19fRVNUSU1BVElPTl9DT05TSURFUkFUSU9OUzoKLQkJCWdldEVzdGltYXRpb25Db25zaWRlcmF0aW9ucygpLmNsZWFyKCk7Ci0JCQlnZXRFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMoKS5hZGRBbGwoCi0JCQkJCShDb2xsZWN0aW9uPD8gZXh0ZW5kcyBFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnM+KSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuVEFTS19fUFJFQ09ORElUSU9OOgotCQkJc2V0UHJlY29uZGl0aW9uKChDb25zdHJhaW50KSBudWxsKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfX1BPU1RDT05ESVRJT046Ci0JCQlzZXRQb3N0Y29uZGl0aW9uKChDb25zdHJhaW50KSBudWxsKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfX1BFUkZPUk1FRF9CWToKLQkJCWdldFBlcmZvcm1lZEJ5KCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfX01BTkRBVE9SWV9JTlBVVDoKLQkJCWdldE1hbmRhdG9yeUlucHV0KCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfX09VVFBVVDoKLQkJCWdldE91dHB1dCgpLmNsZWFyKCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5UQVNLX19BRERJVElPTkFMTFlfUEVSRk9STUVEX0JZOgotCQkJZ2V0QWRkaXRpb25hbGx5UGVyZm9ybWVkQnkoKS5jbGVhcigpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuVEFTS19fT1BUSU9OQUxfSU5QVVQ6Ci0JCQlnZXRPcHRpb25hbElucHV0KCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfX1NURVBTOgotCQkJZ2V0U3RlcHMoKS5jbGVhcigpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuVEFTS19fVE9PTF9NRU5UT1JTOgotCQkJZ2V0VG9vbE1lbnRvcnMoKS5jbGVhcigpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuVEFTS19fRVNUSU1BVElPTl9DT05TSURFUkFUSU9OUzoKLQkJCWdldEVzdGltYXRpb25Db25zaWRlcmF0aW9ucygpLmNsZWFyKCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJLy9VTUEtLT4KLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBnZXRGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZShmZWF0dXJlSUQpOwotCQlpZiAoZmVhdHVyZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gaXNGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZVNldChmZWF0dXJlKTsKLQkJfQotCQkvL1VNQTwtLQkJCi0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5UQVNLX19QUkVDT05ESVRJT046Ci0JCQlyZXR1cm4gcHJlY29uZGl0aW9uICE9IG51bGw7Ci0JCWNhc2UgVW1hUGFja2FnZS5UQVNLX19QT1NUQ09ORElUSU9OOgotCQkJcmV0dXJuIHBvc3Rjb25kaXRpb24gIT0gbnVsbDsKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfX1BFUkZPUk1FRF9CWToKLQkJCXJldHVybiBwZXJmb3JtZWRCeSAhPSBudWxsICYmICFwZXJmb3JtZWRCeS5pc0VtcHR5KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5UQVNLX19NQU5EQVRPUllfSU5QVVQ6Ci0JCQlyZXR1cm4gbWFuZGF0b3J5SW5wdXQgIT0gbnVsbCAmJiAhbWFuZGF0b3J5SW5wdXQuaXNFbXB0eSgpOwotCQljYXNlIFVtYVBhY2thZ2UuVEFTS19fT1VUUFVUOgotCQkJcmV0dXJuIG91dHB1dCAhPSBudWxsICYmICFvdXRwdXQuaXNFbXB0eSgpOwotCQljYXNlIFVtYVBhY2thZ2UuVEFTS19fQURESVRJT05BTExZX1BFUkZPUk1FRF9CWToKLQkJCXJldHVybiBhZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSAhPSBudWxsCi0JCQkJCSYmICFhZGRpdGlvbmFsbHlQZXJmb3JtZWRCeS5pc0VtcHR5KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5UQVNLX19PUFRJT05BTF9JTlBVVDoKLQkJCXJldHVybiBvcHRpb25hbElucHV0ICE9IG51bGwgJiYgIW9wdGlvbmFsSW5wdXQuaXNFbXB0eSgpOwotCQljYXNlIFVtYVBhY2thZ2UuVEFTS19fU1RFUFM6Ci0JCQlyZXR1cm4gIWdldFN0ZXBzKCkuaXNFbXB0eSgpOwotCQljYXNlIFVtYVBhY2thZ2UuVEFTS19fVE9PTF9NRU5UT1JTOgotCQkJcmV0dXJuIHRvb2xNZW50b3JzICE9IG51bGwgJiYgIXRvb2xNZW50b3JzLmlzRW1wdHkoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfX0VTVElNQVRJT05fQ09OU0lERVJBVElPTlM6Ci0JCQlyZXR1cm4gZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zICE9IG51bGwKLQkJCQkJJiYgIWVzdGltYXRpb25Db25zaWRlcmF0aW9ucy5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBpbnQgZUJhc2VTdHJ1Y3R1cmFsRmVhdHVyZUlEKGludCBkZXJpdmVkRmVhdHVyZUlELCBDbGFzczw/PiBiYXNlQ2xhc3MpIHsKLQkJaWYgKGJhc2VDbGFzcyA9PSBXb3JrRGVmaW5pdGlvbi5jbGFzcykgewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19fUFJFQ09ORElUSU9OOgotCQkJCXJldHVybiBVbWFQYWNrYWdlLldPUktfREVGSU5JVElPTl9fUFJFQ09ORElUSU9OOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfX1BPU1RDT05ESVRJT046Ci0JCQkJcmV0dXJuIFVtYVBhY2thZ2UuV09SS19ERUZJTklUSU9OX19QT1NUQ09ORElUSU9OOwotCQkJZGVmYXVsdDoKLQkJCQlyZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVCYXNlU3RydWN0dXJhbEZlYXR1cmVJRChkZXJpdmVkRmVhdHVyZUlELCBiYXNlQ2xhc3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBpbnQgZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGludCBiYXNlRmVhdHVyZUlELCBDbGFzczw/PiBiYXNlQ2xhc3MpIHsKLQkJaWYgKGJhc2VDbGFzcyA9PSBXb3JrRGVmaW5pdGlvbi5jbGFzcykgewotCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19ERUZJTklUSU9OX19QUkVDT05ESVRJT046Ci0JCQkJcmV0dXJuIFVtYVBhY2thZ2UuVEFTS19fUFJFQ09ORElUSU9OOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfREVGSU5JVElPTl9fUE9TVENPTkRJVElPTjoKLQkJCQlyZXR1cm4gVW1hUGFja2FnZS5UQVNLX19QT1NUQ09ORElUSU9OOwotCQkJZGVmYXVsdDoKLQkJCQlyZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChiYXNlRmVhdHVyZUlELCBiYXNlQ2xhc3MpOwotCX0KLQotfSAvL1Rhc2tJbXBsCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvVGVhbVByb2ZpbGVJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvVGVhbVByb2ZpbGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjMjRiNjUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1RlYW1Qcm9maWxlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0UmVzb2x2aW5nRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdFdpdGhJbnZlcnNlUmVzb2x2aW5nRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGVhbVByb2ZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+VGVhbSBQcm9maWxlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVGVhbVByb2ZpbGVJbXBsI2dldFRlYW1Sb2xlcyA8ZW0+VGVhbSBSb2xlczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlRlYW1Qcm9maWxlSW1wbCNnZXRTdXBlclRlYW0gPGVtPlN1cGVyIFRlYW08L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5UZWFtUHJvZmlsZUltcGwjZ2V0U3ViVGVhbSA8ZW0+U3ViIFRlYW08L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBUZWFtUHJvZmlsZUltcGwgZXh0ZW5kcyBCcmVha2Rvd25FbGVtZW50SW1wbCBpbXBsZW1lbnRzCi0JCVRlYW1Qcm9maWxlIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFRlYW1Sb2xlcygpIDxlbT5UZWFtIFJvbGVzPC9lbT59JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFRlYW1Sb2xlcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PFJvbGVEZXNjcmlwdG9yPiB0ZWFtUm9sZXM7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTdXBlclRlYW0oKSA8ZW0+U3VwZXIgVGVhbTwvZW0+fScgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U3VwZXJUZWFtKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgVGVhbVByb2ZpbGUgc3VwZXJUZWFtOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U3ViVGVhbSgpIDxlbT5TdWIgVGVhbTwvZW0+fScgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTdWJUZWFtKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8VGVhbVByb2ZpbGU+IHN1YlRlYW07Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgVGVhbVByb2ZpbGVJbXBsKCkgewotCQlzdXBlcigpOwotCi0JCS8vVU1BLS0+Ci0JCXJlYXNzaWduRGVmYXVsdFZhbHVlcygpOwotCQkvL1VNQTwtLSAgCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLlRFQU1fUFJPRklMRTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdDxSb2xlRGVzY3JpcHRvcj4gZ2V0VGVhbVJvbGVzKCkgewotCQlpZiAodGVhbVJvbGVzID09IG51bGwpIHsKLQkJCXRlYW1Sb2xlcyA9IG5ldyBFT2JqZWN0UmVzb2x2aW5nRUxpc3Q8Um9sZURlc2NyaXB0b3I+KAotCQkJCQlSb2xlRGVzY3JpcHRvci5jbGFzcywgdGhpcywKLQkJCQkJVW1hUGFja2FnZS5URUFNX1BST0ZJTEVfX1RFQU1fUk9MRVMpOwotCQl9Ci0JCXJldHVybiB0ZWFtUm9sZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFRlYW1Qcm9maWxlIGdldFN1cGVyVGVhbSgpIHsKLQkJaWYgKHN1cGVyVGVhbSAhPSBudWxsICYmICgoRU9iamVjdCkgc3VwZXJUZWFtKS5lSXNQcm94eSgpKSB7Ci0JCQlJbnRlcm5hbEVPYmplY3Qgb2xkU3VwZXJUZWFtID0gKEludGVybmFsRU9iamVjdCkgc3VwZXJUZWFtOwotCQkJc3VwZXJUZWFtID0gKFRlYW1Qcm9maWxlKSBlUmVzb2x2ZVByb3h5KG9sZFN1cGVyVGVhbSk7Ci0JCQlpZiAoc3VwZXJUZWFtICE9IG9sZFN1cGVyVGVhbSkgewotCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlJFU09MVkUsCi0JCQkJCQkJVW1hUGFja2FnZS5URUFNX1BST0ZJTEVfX1NVUEVSX1RFQU0sIG9sZFN1cGVyVGVhbSwKLQkJCQkJCQlzdXBlclRlYW0pKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXJUZWFtOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUZWFtUHJvZmlsZSBiYXNpY0dldFN1cGVyVGVhbSgpIHsKLQkJcmV0dXJuIHN1cGVyVGVhbTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRTdXBlclRlYW0oVGVhbVByb2ZpbGUgbmV3U3VwZXJUZWFtLAotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlUZWFtUHJvZmlsZSBvbGRTdXBlclRlYW0gPSBzdXBlclRlYW07Ci0JCXN1cGVyVGVhbSA9IG5ld1N1cGVyVGVhbTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywKLQkJCQkJTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5URUFNX1BST0ZJTEVfX1NVUEVSX1RFQU0sCi0JCQkJCW9sZFN1cGVyVGVhbSwgbmV3U3VwZXJUZWFtKTsKLQkJCWlmIChtc2dzID09IG51bGwpCi0JCQkJbXNncyA9IG5vdGlmaWNhdGlvbjsKLQkJCWVsc2UKLQkJCQltc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFN1cGVyVGVhbShUZWFtUHJvZmlsZSBuZXdTdXBlclRlYW0pIHsKLQkJaWYgKG5ld1N1cGVyVGVhbSAhPSBzdXBlclRlYW0pIHsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKHN1cGVyVGVhbSAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCkgc3VwZXJUZWFtKS5lSW52ZXJzZVJlbW92ZSh0aGlzLAotCQkJCQkJVW1hUGFja2FnZS5URUFNX1BST0ZJTEVfX1NVQl9URUFNLCBUZWFtUHJvZmlsZS5jbGFzcywKLQkJCQkJCW1zZ3MpOwotCQkJaWYgKG5ld1N1cGVyVGVhbSAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCkgbmV3U3VwZXJUZWFtKS5lSW52ZXJzZUFkZCh0aGlzLAotCQkJCQkJVW1hUGFja2FnZS5URUFNX1BST0ZJTEVfX1NVQl9URUFNLCBUZWFtUHJvZmlsZS5jbGFzcywKLQkJCQkJCW1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0U3VwZXJUZWFtKG5ld1N1cGVyVGVhbSwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKQotCQkJCW1zZ3MuZGlzcGF0Y2goKTsKLQkJfSBlbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuVEVBTV9QUk9GSUxFX19TVVBFUl9URUFNLCBuZXdTdXBlclRlYW0sCi0JCQkJCW5ld1N1cGVyVGVhbSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0PFRlYW1Qcm9maWxlPiBnZXRTdWJUZWFtKCkgewotCQlpZiAoc3ViVGVhbSA9PSBudWxsKSB7Ci0JCQlzdWJUZWFtID0gbmV3IEVPYmplY3RXaXRoSW52ZXJzZVJlc29sdmluZ0VMaXN0PFRlYW1Qcm9maWxlPigKLQkJCQkJVGVhbVByb2ZpbGUuY2xhc3MsIHRoaXMsIFVtYVBhY2thZ2UuVEVBTV9QUk9GSUxFX19TVUJfVEVBTSwKLQkJCQkJVW1hUGFja2FnZS5URUFNX1BST0ZJTEVfX1NVUEVSX1RFQU0pOwotCQl9Ci0JCXJldHVybiBzdWJUZWFtOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCUBPdmVycmlkZQotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZUFkZChJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsCi0JCQlpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5URUFNX1BST0ZJTEVfX1NVUEVSX1RFQU06Ci0JCQlpZiAoc3VwZXJUZWFtICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KSBzdXBlclRlYW0pLmVJbnZlcnNlUmVtb3ZlKHRoaXMsCi0JCQkJCQlVbWFQYWNrYWdlLlRFQU1fUFJPRklMRV9fU1VCX1RFQU0sIFRlYW1Qcm9maWxlLmNsYXNzLAotCQkJCQkJbXNncyk7Ci0JCQlyZXR1cm4gYmFzaWNTZXRTdXBlclRlYW0oKFRlYW1Qcm9maWxlKSBvdGhlckVuZCwgbXNncyk7Ci0JCWNhc2UgVW1hUGFja2FnZS5URUFNX1BST0ZJTEVfX1NVQl9URUFNOgotCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDxJbnRlcm5hbEVPYmplY3Q+KSAoSW50ZXJuYWxFTGlzdDw/PikgZ2V0U3ViVGVhbSgpKQotCQkJCQkuYmFzaWNBZGQob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZUFkZChvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLAotCQkJaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuVEVBTV9QUk9GSUxFX19TVVBFUl9URUFNOgotCQkJcmV0dXJuIGJhc2ljU2V0U3VwZXJUZWFtKG51bGwsIG1zZ3MpOwotCQljYXNlIFVtYVBhY2thZ2UuVEVBTV9QUk9GSUxFX19TVUJfVEVBTToKLQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pIGdldFN1YlRlYW0oKSkKLQkJCQkJLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuVEVBTV9QUk9GSUxFX19URUFNX1JPTEVTOgotCQkJcmV0dXJuIGdldFRlYW1Sb2xlcygpOwotCQljYXNlIFVtYVBhY2thZ2UuVEVBTV9QUk9GSUxFX19TVVBFUl9URUFNOgotCQkJaWYgKHJlc29sdmUpCi0JCQkJcmV0dXJuIGdldFN1cGVyVGVhbSgpOwotCQkJcmV0dXJuIGJhc2ljR2V0U3VwZXJUZWFtKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5URUFNX1BST0ZJTEVfX1NVQl9URUFNOgotCQkJcmV0dXJuIGdldFN1YlRlYW0oKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuVEVBTV9QUk9GSUxFX19URUFNX1JPTEVTOgotCQkJZ2V0VGVhbVJvbGVzKCkuY2xlYXIoKTsKLQkJCWdldFRlYW1Sb2xlcygpLmFkZEFsbCgKLQkJCQkJKENvbGxlY3Rpb248PyBleHRlbmRzIFJvbGVEZXNjcmlwdG9yPikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuVEVBTV9QUk9GSUxFX19TVVBFUl9URUFNOgotCQkJc2V0U3VwZXJUZWFtKChUZWFtUHJvZmlsZSkgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuVEVBTV9QUk9GSUxFX19TVUJfVEVBTToKLQkJCWdldFN1YlRlYW0oKS5jbGVhcigpOwotCQkJZ2V0U3ViVGVhbSgpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgVGVhbVByb2ZpbGU+KSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuVEVBTV9QUk9GSUxFX19URUFNX1JPTEVTOgotCQkJZ2V0VGVhbVJvbGVzKCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlRFQU1fUFJPRklMRV9fU1VQRVJfVEVBTToKLQkJCXNldFN1cGVyVGVhbSgoVGVhbVByb2ZpbGUpIG51bGwpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuVEVBTV9QUk9GSUxFX19TVUJfVEVBTToKLQkJCWdldFN1YlRlYW0oKS5jbGVhcigpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCS8vVU1BLS0+Ci0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gZ2V0RmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWUoZmVhdHVyZUlEKTsKLQkJaWYgKGZlYXR1cmUgIT0gbnVsbCkgewotCQkJcmV0dXJuIGlzRmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWVTZXQoZmVhdHVyZSk7Ci0JCX0KLQkJLy9VTUE8LS0JCQotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuVEVBTV9QUk9GSUxFX19URUFNX1JPTEVTOgotCQkJcmV0dXJuIHRlYW1Sb2xlcyAhPSBudWxsICYmICF0ZWFtUm9sZXMuaXNFbXB0eSgpOwotCQljYXNlIFVtYVBhY2thZ2UuVEVBTV9QUk9GSUxFX19TVVBFUl9URUFNOgotCQkJcmV0dXJuIHN1cGVyVGVhbSAhPSBudWxsOwotCQljYXNlIFVtYVBhY2thZ2UuVEVBTV9QUk9GSUxFX19TVUJfVEVBTToKLQkJCXJldHVybiBzdWJUZWFtICE9IG51bGwgJiYgIXN1YlRlYW0uaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLX0gLy9UZWFtUHJvZmlsZUltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9UZW1wbGF0ZUltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9UZW1wbGF0ZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2NmYzY3My4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvVGVtcGxhdGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGVtcGxhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+VGVtcGxhdGU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBUZW1wbGF0ZUltcGwgZXh0ZW5kcyBHdWlkYW5jZUltcGwgaW1wbGVtZW50cyBUZW1wbGF0ZSB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgVGVtcGxhdGVJbXBsKCkgewotCQlzdXBlcigpOwotCi0JCS8vVU1BLS0+Ci0JCXJlYXNzaWduRGVmYXVsdFZhbHVlcygpOwotCQkvL1VNQTwtLSAgCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLlRFTVBMQVRFOwotCX0KLQotfSAvL1RlbXBsYXRlSW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1Rlcm1EZWZpbml0aW9uSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1Rlcm1EZWZpbml0aW9uSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZGI3Njk2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9UZXJtRGVmaW5pdGlvbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZXJtRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5UZXJtIERlZmluaXRpb248L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXJtRGVmaW5pdGlvbkltcGwgZXh0ZW5kcyBHdWlkYW5jZUltcGwgaW1wbGVtZW50cyBUZXJtRGVmaW5pdGlvbiB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgVGVybURlZmluaXRpb25JbXBsKCkgewotCQlzdXBlcigpOwotCi0JCS8vVU1BLS0+Ci0JCXJlYXNzaWduRGVmYXVsdFZhbHVlcygpOwotCQkvL1VNQTwtLSAgCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLlRFUk1fREVGSU5JVElPTjsKLQl9Ci0KLX0gLy9UZXJtRGVmaW5pdGlvbkltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9UZXh0RWxlbWVudEltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9UZXh0RWxlbWVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzU2MmQ5MS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvVGV4dEVsZW1lbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRleHRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlRleHQgRWxlbWVudDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlRleHRFbGVtZW50SW1wbCNnZXRUZXh0IDxlbT5UZXh0PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgVGV4dEVsZW1lbnRJbXBsIGV4dGVuZHMgTGVhZkVsZW1lbnRJbXBsIGltcGxlbWVudHMgVGV4dEVsZW1lbnQgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFRleHQoKSA8ZW0+VGV4dDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VGV4dCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9FREVGQVVMVCA9ICIiOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VGV4dCgpIDxlbT5UZXh0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUZXh0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHRleHQgPSBURVhUX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFRleHRFbGVtZW50SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQotCQkvL1VNQS0tPgotCQlyZWFzc2lnbkRlZmF1bHRWYWx1ZXMoKTsKLQkJLy9VTUE8LS0gIAotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5URVhUX0VMRU1FTlQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KCkgewotCQlyZXR1cm4gdGV4dDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUZXh0KFN0cmluZyBuZXdUZXh0KSB7Ci0JCVN0cmluZyBvbGRUZXh0ID0gdGV4dDsKLQkJdGV4dCA9IG5ld1RleHQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuVEVYVF9FTEVNRU5UX19URVhULCBvbGRUZXh0LCB0ZXh0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuVEVYVF9FTEVNRU5UX19URVhUOgotCQkJcmV0dXJuIGdldFRleHQoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuVEVYVF9FTEVNRU5UX19URVhUOgotCQkJc2V0VGV4dCgoU3RyaW5nKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuVEVYVF9FTEVNRU5UX19URVhUOgotCQkJc2V0VGV4dChURVhUX0VERUZBVUxUKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQkvL1VNQS0tPgotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IGdldEZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlKGZlYXR1cmVJRCk7Ci0JCWlmIChmZWF0dXJlICE9IG51bGwpIHsKLQkJCXJldHVybiBpc0ZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlU2V0KGZlYXR1cmUpOwotCQl9Ci0JCS8vVU1BPC0tCQkKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlRFWFRfRUxFTUVOVF9fVEVYVDoKLQkJCXJldHVybiBURVhUX0VERUZBVUxUID09IG51bGwgPyB0ZXh0ICE9IG51bGwgOiAhVEVYVF9FREVGQVVMVAotCQkJCQkuZXF1YWxzKHRleHQpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkKLQkJCXJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHRleHQ6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQodGV4dCk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL1RleHRFbGVtZW50SW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1Rvb2xJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvVG9vbEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTFmYWM5YS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvVG9vbEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdFJlc29sdmluZ0VMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVG9vbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRvb2xNZW50b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+VG9vbDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlRvb2xJbXBsI2dldFRvb2xNZW50b3JzIDxlbT5Ub29sIE1lbnRvcnM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBUb29sSW1wbCBleHRlbmRzIENvbnRlbnRDYXRlZ29yeUltcGwgaW1wbGVtZW50cyBUb29sIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFRvb2xNZW50b3JzKCkgPGVtPlRvb2wgTWVudG9yczwvZW0+fScgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUb29sTWVudG9ycygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PFRvb2xNZW50b3I+IHRvb2xNZW50b3JzOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFRvb2xJbXBsKCkgewotCQlzdXBlcigpOwotCi0JCS8vVU1BLS0+Ci0JCXJlYXNzaWduRGVmYXVsdFZhbHVlcygpOwotCQkvL1VNQTwtLSAgCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLlRPT0w7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3Q8VG9vbE1lbnRvcj4gZ2V0VG9vbE1lbnRvcnMoKSB7Ci0JCWlmICh0b29sTWVudG9ycyA9PSBudWxsKSB7Ci0JCQl0b29sTWVudG9ycyA9IG5ldyBFT2JqZWN0UmVzb2x2aW5nRUxpc3Q8VG9vbE1lbnRvcj4oCi0JCQkJCVRvb2xNZW50b3IuY2xhc3MsIHRoaXMsIFVtYVBhY2thZ2UuVE9PTF9fVE9PTF9NRU5UT1JTKTsKLQkJfQotCQlyZXR1cm4gdG9vbE1lbnRvcnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuVE9PTF9fVE9PTF9NRU5UT1JTOgotCQkJcmV0dXJuIGdldFRvb2xNZW50b3JzKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlRPT0xfX1RPT0xfTUVOVE9SUzoKLQkJCWdldFRvb2xNZW50b3JzKCkuY2xlYXIoKTsKLQkJCWdldFRvb2xNZW50b3JzKCkKLQkJCQkJLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgVG9vbE1lbnRvcj4pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5UT09MX19UT09MX01FTlRPUlM6Ci0JCQlnZXRUb29sTWVudG9ycygpLmNsZWFyKCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJLy9VTUEtLT4KLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBnZXRGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZShmZWF0dXJlSUQpOwotCQlpZiAoZmVhdHVyZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gaXNGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZVNldChmZWF0dXJlKTsKLQkJfQotCQkvL1VNQTwtLQkJCi0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5UT09MX19UT09MX01FTlRPUlM6Ci0JCQlyZXR1cm4gdG9vbE1lbnRvcnMgIT0gbnVsbCAmJiAhdG9vbE1lbnRvcnMuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLX0gLy9Ub29sSW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1Rvb2xNZW50b3JJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvVG9vbE1lbnRvckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmFhNGM2Yi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvVG9vbE1lbnRvckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Ub29sTWVudG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlRvb2wgTWVudG9yPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgVG9vbE1lbnRvckltcGwgZXh0ZW5kcyBHdWlkYW5jZUltcGwgaW1wbGVtZW50cyBUb29sTWVudG9yIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBUb29sTWVudG9ySW1wbCgpIHsKLQkJc3VwZXIoKTsKLQotCQkvL1VNQS0tPgotCQlyZWFzc2lnbkRlZmF1bHRWYWx1ZXMoKTsKLQkJLy9VTUE8LS0gIAotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5UT09MX01FTlRPUjsKLQl9Ci0KLX0gLy9Ub29sTWVudG9ySW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1R5cGVJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvVHlwZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzA3MTFjNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvVHlwZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlR5cGU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBUeXBlSW1wbCBleHRlbmRzIFBhY2thZ2VhYmxlRWxlbWVudEltcGwgaW1wbGVtZW50cyBUeXBlIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBUeXBlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQotCQkvL1VNQS0tPgotCQlyZWFzc2lnbkRlZmF1bHRWYWx1ZXMoKTsKLQkJLy9VTUE8LS0gIAotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5UWVBFOwotCX0KLQotfSAvL1R5cGVJbXBsCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZUltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NDM3MWQ1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VTUFTZW1hbnRpY01vZGVsQnJpZGdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlVNQSBTZW1hbnRpYyBNb2RlbCBCcmlkZ2U8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VTUFTZW1hbnRpY01vZGVsQnJpZGdlSW1wbCNnZXRFbGVtZW50IDxlbT5FbGVtZW50PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgVU1BU2VtYW50aWNNb2RlbEJyaWRnZUltcGwgZXh0ZW5kcyBTZW1hbnRpY01vZGVsQnJpZGdlSW1wbAotCQlpbXBsZW1lbnRzIFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RWxlbWVudCgpIDxlbT5FbGVtZW50PC9lbT59JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRFbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTWV0aG9kRWxlbWVudCBlbGVtZW50OwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFVNQVNlbWFudGljTW9kZWxCcmlkZ2VJbXBsKCkgewotCQlzdXBlcigpOwotCi0JCS8vVU1BLS0+Ci0JCXJlYXNzaWduRGVmYXVsdFZhbHVlcygpOwotCQkvL1VNQTwtLSAgCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLlVNQV9TRU1BTlRJQ19NT0RFTF9CUklER0U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE1ldGhvZEVsZW1lbnQgZ2V0RWxlbWVudCgpIHsKLQkJaWYgKGVsZW1lbnQgIT0gbnVsbCAmJiAoKEVPYmplY3QpIGVsZW1lbnQpLmVJc1Byb3h5KCkpIHsKLQkJCUludGVybmFsRU9iamVjdCBvbGRFbGVtZW50ID0gKEludGVybmFsRU9iamVjdCkgZWxlbWVudDsKLQkJCWVsZW1lbnQgPSAoTWV0aG9kRWxlbWVudCkgZVJlc29sdmVQcm94eShvbGRFbGVtZW50KTsKLQkJCWlmIChlbGVtZW50ICE9IG9sZEVsZW1lbnQpIHsKLQkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLAotCQkJCQkJCVVtYVBhY2thZ2UuVU1BX1NFTUFOVElDX01PREVMX0JSSURHRV9fRUxFTUVOVCwKLQkJCQkJCQlvbGRFbGVtZW50LCBlbGVtZW50KSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVsZW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE1ldGhvZEVsZW1lbnQgYmFzaWNHZXRFbGVtZW50KCkgewotCQlyZXR1cm4gZWxlbWVudDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFbGVtZW50KE1ldGhvZEVsZW1lbnQgbmV3RWxlbWVudCkgewotCQlNZXRob2RFbGVtZW50IG9sZEVsZW1lbnQgPSBlbGVtZW50OwotCQllbGVtZW50ID0gbmV3RWxlbWVudDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5VTUFfU0VNQU5USUNfTU9ERUxfQlJJREdFX19FTEVNRU5ULCBvbGRFbGVtZW50LAotCQkJCQllbGVtZW50KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuVU1BX1NFTUFOVElDX01PREVMX0JSSURHRV9fRUxFTUVOVDoKLQkJCWlmIChyZXNvbHZlKQotCQkJCXJldHVybiBnZXRFbGVtZW50KCk7Ci0JCQlyZXR1cm4gYmFzaWNHZXRFbGVtZW50KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlVNQV9TRU1BTlRJQ19NT0RFTF9CUklER0VfX0VMRU1FTlQ6Ci0JCQlzZXRFbGVtZW50KChNZXRob2RFbGVtZW50KSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuVU1BX1NFTUFOVElDX01PREVMX0JSSURHRV9fRUxFTUVOVDoKLQkJCXNldEVsZW1lbnQoKE1ldGhvZEVsZW1lbnQpIG51bGwpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCS8vVU1BLS0+Ci0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gZ2V0RmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWUoZmVhdHVyZUlEKTsKLQkJaWYgKGZlYXR1cmUgIT0gbnVsbCkgewotCQkJcmV0dXJuIGlzRmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWVTZXQoZmVhdHVyZSk7Ci0JCX0KLQkJLy9VTUE8LS0JCQotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuVU1BX1NFTUFOVElDX01PREVMX0JSSURHRV9fRUxFTUVOVDoKLQkJCXJldHVybiBlbGVtZW50ICE9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotfSAvL1VNQVNlbWFudGljTW9kZWxCcmlkZ2VJbXBsCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvVW1hRmFjdG9yeUltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9VbWFGYWN0b3J5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZmFiYWM5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9VbWFGYWN0b3J5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUxMiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBqYXZhLm5ldC5VUkk7Ci1pbXBvcnQgamF2YS51dGlsLkRhdGU7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVEYXRhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRUZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5wbHVnaW4uRWNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BcHBsaWNhYmxlTWV0YUNsYXNzSW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFydGlmYWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQXJ0aWZhY3REZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNhcGFiaWxpdHlQYXR0ZXJuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ2hlY2tsaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29tcG9zaXRlUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbmNlcHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db25zdHJhaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db3JlU2VtYW50aWNNb2RlbEJyaWRnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkN1c3RvbUNhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyYWJsZURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcnlQcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmlwdG9yRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbUxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaW1lbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaXNjaXBsaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGlzY2lwbGluZUdyb3VwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRWxsaXBzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkVzdGltYXRpb25Db25zaWRlcmF0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkV4YW1wbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5GdWxmaWxsYWJsZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaENvbm5lY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoRWRnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkd1aWRhbmNlRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HdWlkZWxpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkl0ZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLktpbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudFByb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1pbGVzdG9uZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk91dGNvbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5QaGFzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlBsYW5uaW5nRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUG9seWxpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5QcmFjdGljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByYWN0aWNlRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0Rlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0ZhbWlseTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJlcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJldXNhYmxlQXNzZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2FkbWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVTZXRHcm91cGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlNlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5TaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlN0ZXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5TdXBwb3J0aW5nTWF0ZXJpYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZWFtUHJvZmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRlbXBsYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGVybURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZXh0RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRvb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Ub29sTWVudG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVU1BU2VtYW50aWNNb2RlbEJyaWRnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV2hpdGVwYXBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtPcmRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtPcmRlclR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdFR5cGU7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCA8Yj5GYWN0b3J5PC9iPi4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgVW1hRmFjdG9yeUltcGwgZXh0ZW5kcyBFRmFjdG9yeUltcGwgaW1wbGVtZW50cyBVbWFGYWN0b3J5IHsKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBkZWZhdWx0IGZhY3RvcnkgaW1wbGVtZW50YXRpb24uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBVbWFGYWN0b3J5IGluaXQoKSB7Ci0JCXRyeSB7Ci0JCQlVbWFGYWN0b3J5IHRoZVVtYUZhY3RvcnkgPSAoVW1hRmFjdG9yeSkgRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UKLQkJCQkJLmdldEVGYWN0b3J5KCJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjUvdW1hLmVjb3JlIik7IC8vJE5PTi1OTFMtMSQgCi0JCQlpZiAodGhlVW1hRmFjdG9yeSAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIHRoZVVtYUZhY3Rvcnk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLQkJCUVjb3JlUGx1Z2luLklOU1RBTkNFLmxvZyhleGNlcHRpb24pOwotCQl9Ci0JCXJldHVybiBuZXcgVW1hRmFjdG9yeUltcGwoKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBmYWN0b3J5LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBVbWFGYWN0b3J5SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgRU9iamVjdCBjcmVhdGUoRUNsYXNzIGVDbGFzcykgewotCQlzd2l0Y2ggKGVDbGFzcy5nZXRDbGFzc2lmaWVySUQoKSkgewotCQljYXNlIFVtYVBhY2thZ2UuUEFDS0FHRToKLQkJCXJldHVybiAoRU9iamVjdCkgY3JlYXRlUGFja2FnZSgpOwotCQljYXNlIFVtYVBhY2thZ2UuQ09OU1RSQUlOVDoKLQkJCXJldHVybiAoRU9iamVjdCkgY3JlYXRlQ29uc3RyYWludCgpOwotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk6Ci0JCQlyZXR1cm4gKEVPYmplY3QpIGNyZWF0ZU1ldGhvZEVsZW1lbnRQcm9wZXJ0eSgpOwotCQljYXNlIFVtYVBhY2thZ2UuS0lORDoKLQkJCXJldHVybiAoRU9iamVjdCkgY3JlYXRlS2luZCgpOwotCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9ERVNDUklQVElPTjoKLQkJCXJldHVybiAoRU9iamVjdCkgY3JlYXRlQ29udGVudERlc2NyaXB0aW9uKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5TVVBQT1JUSU5HX01BVEVSSUFMOgotCQkJcmV0dXJuIChFT2JqZWN0KSBjcmVhdGVTdXBwb3J0aW5nTWF0ZXJpYWwoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlNFQ1RJT046Ci0JCQlyZXR1cm4gKEVPYmplY3QpIGNyZWF0ZVNlY3Rpb24oKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkNPTkNFUFQ6Ci0JCQlyZXR1cm4gKEVPYmplY3QpIGNyZWF0ZUNvbmNlcHQoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkNIRUNLTElTVDoKLQkJCXJldHVybiAoRU9iamVjdCkgY3JlYXRlQ2hlY2tsaXN0KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5HVUlERUxJTkU6Ci0JCQlyZXR1cm4gKEVPYmplY3QpIGNyZWF0ZUd1aWRlbGluZSgpOwotCQljYXNlIFVtYVBhY2thZ2UuRVhBTVBMRToKLQkJCXJldHVybiAoRU9iamVjdCkgY3JlYXRlRXhhbXBsZSgpOwotCQljYXNlIFVtYVBhY2thZ2UuUkVVU0FCTEVfQVNTRVQ6Ci0JCQlyZXR1cm4gKEVPYmplY3QpIGNyZWF0ZVJldXNhYmxlQXNzZXQoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlRFUk1fREVGSU5JVElPTjoKLQkJCXJldHVybiAoRU9iamVjdCkgY3JlYXRlVGVybURlZmluaXRpb24oKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkFQUExJQ0FCTEVfTUVUQV9DTEFTU19JTkZPOgotCQkJcmV0dXJuIChFT2JqZWN0KSBjcmVhdGVBcHBsaWNhYmxlTWV0YUNsYXNzSW5mbygpOwotCQljYXNlIFVtYVBhY2thZ2UuQVJUSUZBQ1Q6Ci0JCQlyZXR1cm4gKEVPYmplY3QpIGNyZWF0ZUFydGlmYWN0KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1Q6Ci0JCQlyZXR1cm4gKEVPYmplY3QpIGNyZWF0ZVdvcmtQcm9kdWN0KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5GVUxGSUxMQUJMRV9FTEVNRU5UOgotCQkJcmV0dXJuIChFT2JqZWN0KSBjcmVhdGVGdWxmaWxsYWJsZUVsZW1lbnQoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlJFUE9SVDoKLQkJCXJldHVybiAoRU9iamVjdCkgY3JlYXRlUmVwb3J0KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5URU1QTEFURToKLQkJCXJldHVybiAoRU9iamVjdCkgY3JlYXRlVGVtcGxhdGUoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlRPT0xfTUVOVE9SOgotCQkJcmV0dXJuIChFT2JqZWN0KSBjcmVhdGVUb29sTWVudG9yKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5FU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TOgotCQkJcmV0dXJuIChFT2JqZWN0KSBjcmVhdGVFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJBQkxFOgotCQkJcmV0dXJuIChFT2JqZWN0KSBjcmVhdGVEZWxpdmVyYWJsZSgpOwotCQljYXNlIFVtYVBhY2thZ2UuT1VUQ09NRToKLQkJCXJldHVybiAoRU9iamVjdCkgY3JlYXRlT3V0Y29tZSgpOwotCQljYXNlIFVtYVBhY2thZ2UuU1RFUDoKLQkJCXJldHVybiAoRU9iamVjdCkgY3JlYXRlU3RlcCgpOwotCQljYXNlIFVtYVBhY2thZ2UuV0hJVEVQQVBFUjoKLQkJCXJldHVybiAoRU9iamVjdCkgY3JlYXRlV2hpdGVwYXBlcigpOwotCQljYXNlIFVtYVBhY2thZ2UuVEFTSzoKLQkJCXJldHVybiAoRU9iamVjdCkgY3JlYXRlVGFzaygpOwotCQljYXNlIFVtYVBhY2thZ2UuUk9MRToKLQkJCXJldHVybiAoRU9iamVjdCkgY3JlYXRlUm9sZSgpOwotCQljYXNlIFVtYVBhY2thZ2UuQVJUSUZBQ1RfREVTQ1JJUFRJT046Ci0JCQlyZXR1cm4gKEVPYmplY3QpIGNyZWF0ZUFydGlmYWN0RGVzY3JpcHRpb24oKTsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVElPTjoKLQkJCXJldHVybiAoRU9iamVjdCkgY3JlYXRlV29ya1Byb2R1Y3REZXNjcmlwdGlvbigpOwotCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUkFCTEVfREVTQ1JJUFRJT046Ci0JCQlyZXR1cm4gKEVPYmplY3QpIGNyZWF0ZURlbGl2ZXJhYmxlRGVzY3JpcHRpb24oKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfREVTQ1JJUFRJT046Ci0JCQlyZXR1cm4gKEVPYmplY3QpIGNyZWF0ZVJvbGVEZXNjcmlwdGlvbigpOwotCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVElPTjoKLQkJCXJldHVybiAoRU9iamVjdCkgY3JlYXRlVGFza0Rlc2NyaXB0aW9uKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5HVUlEQU5DRV9ERVNDUklQVElPTjoKLQkJCXJldHVybiAoRU9iamVjdCkgY3JlYXRlR3VpZGFuY2VEZXNjcmlwdGlvbigpOwotCQljYXNlIFVtYVBhY2thZ2UuUFJBQ1RJQ0VfREVTQ1JJUFRJT046Ci0JCQlyZXR1cm4gKEVPYmplY3QpIGNyZWF0ZVByYWN0aWNlRGVzY3JpcHRpb24oKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfU0VUOgotCQkJcmV0dXJuIChFT2JqZWN0KSBjcmVhdGVSb2xlU2V0KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5ET01BSU46Ci0JCQlyZXR1cm4gKEVPYmplY3QpIGNyZWF0ZURvbWFpbigpOwotCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX1RZUEU6Ci0JCQlyZXR1cm4gKEVPYmplY3QpIGNyZWF0ZVdvcmtQcm9kdWN0VHlwZSgpOwotCQljYXNlIFVtYVBhY2thZ2UuRElTQ0lQTElORV9HUk9VUElORzoKLQkJCXJldHVybiAoRU9iamVjdCkgY3JlYXRlRGlzY2lwbGluZUdyb3VwaW5nKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5ESVNDSVBMSU5FOgotCQkJcmV0dXJuIChFT2JqZWN0KSBjcmVhdGVEaXNjaXBsaW5lKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWToKLQkJCXJldHVybiAoRU9iamVjdCkgY3JlYXRlQWN0aXZpdHkoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlBMQU5OSU5HX0RBVEE6Ci0JCQlyZXR1cm4gKEVPYmplY3QpIGNyZWF0ZVBsYW5uaW5nRGF0YSgpOwotCQljYXNlIFVtYVBhY2thZ2UuV09SS19PUkRFUjoKLQkJCXJldHVybiAoRU9iamVjdCkgY3JlYXRlV29ya09yZGVyKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5ST0FETUFQOgotCQkJcmV0dXJuIChFT2JqZWN0KSBjcmVhdGVSb2FkbWFwKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5UT09MOgotCQkJcmV0dXJuIChFT2JqZWN0KSBjcmVhdGVUb29sKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5ST0xFX1NFVF9HUk9VUElORzoKLQkJCXJldHVybiAoRU9iamVjdCkgY3JlYXRlUm9sZVNldEdyb3VwaW5nKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5DVVNUT01fQ0FURUdPUlk6Ci0JCQlyZXR1cm4gKEVPYmplY3QpIGNyZWF0ZUN1c3RvbUNhdGVnb3J5KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX1BBQ0tBR0U6Ci0JCQlyZXR1cm4gKEVPYmplY3QpIGNyZWF0ZUNvbnRlbnRQYWNrYWdlKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5NSUxFU1RPTkU6Ci0JCQlyZXR1cm4gKEVPYmplY3QpIGNyZWF0ZU1pbGVzdG9uZSgpOwotCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUT1I6Ci0JCQlyZXR1cm4gKEVPYmplY3QpIGNyZWF0ZVdvcmtQcm9kdWN0RGVzY3JpcHRvcigpOwotCQljYXNlIFVtYVBhY2thZ2UuSVRFUkFUSU9OOgotCQkJcmV0dXJuIChFT2JqZWN0KSBjcmVhdGVJdGVyYXRpb24oKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlBIQVNFOgotCQkJcmV0dXJuIChFT2JqZWN0KSBjcmVhdGVQaGFzZSgpOwotCQljYXNlIFVtYVBhY2thZ2UuVEVBTV9QUk9GSUxFOgotCQkJcmV0dXJuIChFT2JqZWN0KSBjcmVhdGVUZWFtUHJvZmlsZSgpOwotCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9ERVNDUklQVE9SOgotCQkJcmV0dXJuIChFT2JqZWN0KSBjcmVhdGVSb2xlRGVzY3JpcHRvcigpOwotCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SOgotCQkJcmV0dXJuIChFT2JqZWN0KSBjcmVhdGVUYXNrRGVzY3JpcHRvcigpOwotCQljYXNlIFVtYVBhY2thZ2UuQ09NUE9TSVRFX1JPTEU6Ci0JCQlyZXR1cm4gKEVPYmplY3QpIGNyZWF0ZUNvbXBvc2l0ZVJvbGUoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJZX1BST0NFU1M6Ci0JCQlyZXR1cm4gKEVPYmplY3QpIGNyZWF0ZURlbGl2ZXJ5UHJvY2VzcygpOwotCQljYXNlIFVtYVBhY2thZ2UuQ0FQQUJJTElUWV9QQVRURVJOOgotCQkJcmV0dXJuIChFT2JqZWN0KSBjcmVhdGVDYXBhYmlsaXR5UGF0dGVybigpOwotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0NPTkZJR1VSQVRJT046Ci0JCQlyZXR1cm4gKEVPYmplY3QpIGNyZWF0ZU1ldGhvZENvbmZpZ3VyYXRpb24oKTsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9QTFVHSU46Ci0JCQlyZXR1cm4gKEVPYmplY3QpIGNyZWF0ZU1ldGhvZFBsdWdpbigpOwotCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19QTEFOTklOR19URU1QTEFURToKLQkJCXJldHVybiAoRU9iamVjdCkgY3JlYXRlUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlBSQUNUSUNFOgotCQkJcmV0dXJuIChFT2JqZWN0KSBjcmVhdGVQcmFjdGljZSgpOwotCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT046Ci0JCQlyZXR1cm4gKEVPYmplY3QpIGNyZWF0ZUJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbigpOwotCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfREVTQ1JJUFRJT046Ci0JCQlyZXR1cm4gKEVPYmplY3QpIGNyZWF0ZUFjdGl2aXR5RGVzY3JpcHRpb24oKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT046Ci0JCQlyZXR1cm4gKEVPYmplY3QpIGNyZWF0ZURlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0RFU0NSSVBUSU9OOgotCQkJcmV0dXJuIChFT2JqZWN0KSBjcmVhdGVQcm9jZXNzRGVzY3JpcHRpb24oKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkRFU0NSSVBUT1JfREVTQ1JJUFRJT046Ci0JCQlyZXR1cm4gKEVPYmplY3QpIGNyZWF0ZURlc2NyaXB0b3JEZXNjcmlwdGlvbigpOwotCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfREVTQ1JJUFRPUjoKLQkJCXJldHVybiAoRU9iamVjdCkgY3JlYXRlUHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3IoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UOgotCQkJcmV0dXJuIChFT2JqZWN0KSBjcmVhdGVQcm9jZXNzQ29tcG9uZW50KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX1BBQ0tBR0U6Ci0JCQlyZXR1cm4gKEVPYmplY3QpIGNyZWF0ZVByb2Nlc3NQYWNrYWdlKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5ESUFHUkFNOgotCQkJcmV0dXJuIChFT2JqZWN0KSBjcmVhdGVEaWFncmFtKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5HUkFQSF9OT0RFOgotCQkJcmV0dXJuIChFT2JqZWN0KSBjcmVhdGVHcmFwaE5vZGUoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlJFRkVSRU5DRToKLQkJCXJldHVybiAoRU9iamVjdCkgY3JlYXRlUmVmZXJlbmNlKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9QRVJUWToKLQkJCXJldHVybiAoRU9iamVjdCkgY3JlYXRlUHJvcGVydHkoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlBPSU5UOgotCQkJcmV0dXJuIChFT2JqZWN0KSBjcmVhdGVQb2ludCgpOwotCQljYXNlIFVtYVBhY2thZ2UuRElBR1JBTV9MSU5LOgotCQkJcmV0dXJuIChFT2JqZWN0KSBjcmVhdGVEaWFncmFtTGluaygpOwotCQljYXNlIFVtYVBhY2thZ2UuR1JBUEhfQ09OTkVDVE9SOgotCQkJcmV0dXJuIChFT2JqZWN0KSBjcmVhdGVHcmFwaENvbm5lY3RvcigpOwotCQljYXNlIFVtYVBhY2thZ2UuR1JBUEhfRURHRToKLQkJCXJldHVybiAoRU9iamVjdCkgY3JlYXRlR3JhcGhFZGdlKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5ESU1FTlNJT046Ci0JCQlyZXR1cm4gKEVPYmplY3QpIGNyZWF0ZURpbWVuc2lvbigpOwotCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfSU5URVJGQUNFOgotCQkJcmV0dXJuIChFT2JqZWN0KSBjcmVhdGVQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5TSU1QTEVfU0VNQU5USUNfTU9ERUxfRUxFTUVOVDoKLQkJCXJldHVybiAoRU9iamVjdCkgY3JlYXRlU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnQoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlVNQV9TRU1BTlRJQ19NT0RFTF9CUklER0U6Ci0JCQlyZXR1cm4gKEVPYmplY3QpIGNyZWF0ZVVNQVNlbWFudGljTW9kZWxCcmlkZ2UoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkNPUkVfU0VNQU5USUNfTU9ERUxfQlJJREdFOgotCQkJcmV0dXJuIChFT2JqZWN0KSBjcmVhdGVDb3JlU2VtYW50aWNNb2RlbEJyaWRnZSgpOwotCQljYXNlIFVtYVBhY2thZ2UuVEVYVF9FTEVNRU5UOgotCQkJcmV0dXJuIChFT2JqZWN0KSBjcmVhdGVUZXh0RWxlbWVudCgpOwotCQljYXNlIFVtYVBhY2thZ2UuSU1BR0U6Ci0JCQlyZXR1cm4gKEVPYmplY3QpIGNyZWF0ZUltYWdlKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5QT0xZTElORToKLQkJCXJldHVybiAoRU9iamVjdCkgY3JlYXRlUG9seWxpbmUoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkVMTElQU0U6Ci0JCQlyZXR1cm4gKEVPYmplY3QpIGNyZWF0ZUVsbGlwc2UoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfRkFNSUxZOgotCQkJcmV0dXJuIChFT2JqZWN0KSBjcmVhdGVQcm9jZXNzRmFtaWx5KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfTElCUkFSWToKLQkJCXJldHVybiAoRU9iamVjdCkgY3JlYXRlTWV0aG9kTGlicmFyeSgpOwotCQlkZWZhdWx0OgotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKLQkJCQkJIlRoZSBjbGFzcyAnIiArIGVDbGFzcy5nZXROYW1lKCkgKyAiJyBpcyBub3QgYSB2YWxpZCBjbGFzc2lmaWVyIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBjcmVhdGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJc3dpdGNoIChlRGF0YVR5cGUuZ2V0Q2xhc3NpZmllcklEKCkpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlZBUklBQklMSVRZX1RZUEU6Ci0JCQlyZXR1cm4gY3JlYXRlVmFyaWFiaWxpdHlUeXBlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX09SREVSX1RZUEU6Ci0JCQlyZXR1cm4gY3JlYXRlV29ya09yZGVyVHlwZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQljYXNlIFVtYVBhY2thZ2UuU1RSSU5HOgotCQkJcmV0dXJuIGNyZWF0ZVN0cmluZ0Zyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQljYXNlIFVtYVBhY2thZ2UuQk9PTEVBTjoKLQkJCXJldHVybiBjcmVhdGVCb29sZWFuRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCWNhc2UgVW1hUGFja2FnZS5EQVRFOgotCQkJcmV0dXJuIGNyZWF0ZURhdGVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlVSSToKLQkJCXJldHVybiBjcmVhdGVVcmlGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlNFVDoKLQkJCXJldHVybiBjcmVhdGVTZXRGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlNFUVVFTkNFOgotCQkJcmV0dXJuIGNyZWF0ZVNlcXVlbmNlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCWNhc2UgVW1hUGFja2FnZS5JTlRFR0VSOgotCQkJcmV0dXJuIGNyZWF0ZUludGVnZXJGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkRPVUJMRToKLQkJCXJldHVybiBjcmVhdGVEb3VibGVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJZGVmYXVsdDoKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCi0JCQkJCSJUaGUgZGF0YXR5cGUgJyIgKyBlRGF0YVR5cGUuZ2V0TmFtZSgpICsgIicgaXMgbm90IGEgdmFsaWQgY2xhc3NpZmllciIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgY29udmVydFRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXN3aXRjaCAoZURhdGFUeXBlLmdldENsYXNzaWZpZXJJRCgpKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5WQVJJQUJJTElUWV9UWVBFOgotCQkJcmV0dXJuIGNvbnZlcnRWYXJpYWJpbGl0eVR5cGVUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQljYXNlIFVtYVBhY2thZ2UuV09SS19PUkRFUl9UWVBFOgotCQkJcmV0dXJuIGNvbnZlcnRXb3JrT3JkZXJUeXBlVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlNUUklORzoKLQkJCXJldHVybiBjb252ZXJ0U3RyaW5nVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkJPT0xFQU46Ci0JCQlyZXR1cm4gY29udmVydEJvb2xlYW5Ub1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQljYXNlIFVtYVBhY2thZ2UuREFURToKLQkJCXJldHVybiBjb252ZXJ0RGF0ZVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCWNhc2UgVW1hUGFja2FnZS5VUkk6Ci0JCQlyZXR1cm4gY29udmVydFVyaVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCWNhc2UgVW1hUGFja2FnZS5TRVQ6Ci0JCQlyZXR1cm4gY29udmVydFNldFRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCWNhc2UgVW1hUGFja2FnZS5TRVFVRU5DRToKLQkJCXJldHVybiBjb252ZXJ0U2VxdWVuY2VUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQljYXNlIFVtYVBhY2thZ2UuSU5URUdFUjoKLQkJCXJldHVybiBjb252ZXJ0SW50ZWdlclRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCWNhc2UgVW1hUGFja2FnZS5ET1VCTEU6Ci0JCQlyZXR1cm4gY29udmVydERvdWJsZVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCWRlZmF1bHQ6Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAotCQkJCQkiVGhlIGRhdGF0eXBlICciICsgZURhdGFUeXBlLmdldE5hbWUoKSArICInIGlzIG5vdCBhIHZhbGlkIGNsYXNzaWZpZXIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgb3JnLmVjbGlwc2UuZXBmLnVtYS5QYWNrYWdlIGNyZWF0ZVBhY2thZ2UoKSB7Ci0JCVBhY2thZ2VJbXBsIHBhY2thZ2VfID0gbmV3IFBhY2thZ2VJbXBsKCk7Ci0JCXJldHVybiBwYWNrYWdlXzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ29uc3RyYWludCBjcmVhdGVDb25zdHJhaW50KCkgewotCQlDb25zdHJhaW50SW1wbCBjb25zdHJhaW50ID0gbmV3IENvbnN0cmFpbnRJbXBsKCk7Ci0JCXJldHVybiBjb25zdHJhaW50OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBNZXRob2RFbGVtZW50UHJvcGVydHkgY3JlYXRlTWV0aG9kRWxlbWVudFByb3BlcnR5KCkgewotCQlNZXRob2RFbGVtZW50UHJvcGVydHlJbXBsIG1ldGhvZEVsZW1lbnRQcm9wZXJ0eSA9IG5ldyBNZXRob2RFbGVtZW50UHJvcGVydHlJbXBsKCk7Ci0JCXJldHVybiBtZXRob2RFbGVtZW50UHJvcGVydHk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEtpbmQgY3JlYXRlS2luZCgpIHsKLQkJS2luZEltcGwga2luZCA9IG5ldyBLaW5kSW1wbCgpOwotCQlyZXR1cm4ga2luZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ29udGVudERlc2NyaXB0aW9uIGNyZWF0ZUNvbnRlbnREZXNjcmlwdGlvbigpIHsKLQkJQ29udGVudERlc2NyaXB0aW9uSW1wbCBjb250ZW50RGVzY3JpcHRpb24gPSBuZXcgQ29udGVudERlc2NyaXB0aW9uSW1wbCgpOwotCQlyZXR1cm4gY29udGVudERlc2NyaXB0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTZWN0aW9uIGNyZWF0ZVNlY3Rpb24oKSB7Ci0JCVNlY3Rpb25JbXBsIHNlY3Rpb24gPSBuZXcgU2VjdGlvbkltcGwoKTsKLQkJcmV0dXJuIHNlY3Rpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJvbGUgY3JlYXRlUm9sZSgpIHsKLQkJUm9sZUltcGwgcm9sZSA9IG5ldyBSb2xlSW1wbCgpOwotCQlyZXR1cm4gcm9sZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVGFzayBjcmVhdGVUYXNrKCkgewotCQlUYXNrSW1wbCB0YXNrID0gbmV3IFRhc2tJbXBsKCk7Ci0JCXJldHVybiB0YXNrOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdGVwIGNyZWF0ZVN0ZXAoKSB7Ci0JCVN0ZXBJbXBsIHN0ZXAgPSBuZXcgU3RlcEltcGwoKTsKLQkJcmV0dXJuIHN0ZXA7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFydGlmYWN0IGNyZWF0ZUFydGlmYWN0KCkgewotCQlBcnRpZmFjdEltcGwgYXJ0aWZhY3QgPSBuZXcgQXJ0aWZhY3RJbXBsKCk7Ci0JCXJldHVybiBhcnRpZmFjdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgV29ya1Byb2R1Y3QgY3JlYXRlV29ya1Byb2R1Y3QoKSB7Ci0JCVdvcmtQcm9kdWN0SW1wbCB3b3JrUHJvZHVjdCA9IG5ldyBXb3JrUHJvZHVjdEltcGwoKTsKLQkJcmV0dXJuIHdvcmtQcm9kdWN0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBGdWxmaWxsYWJsZUVsZW1lbnQgY3JlYXRlRnVsZmlsbGFibGVFbGVtZW50KCkgewotCQlGdWxmaWxsYWJsZUVsZW1lbnRJbXBsIGZ1bGZpbGxhYmxlRWxlbWVudCA9IG5ldyBGdWxmaWxsYWJsZUVsZW1lbnRJbXBsKCk7Ci0JCXJldHVybiBmdWxmaWxsYWJsZUVsZW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERlbGl2ZXJhYmxlIGNyZWF0ZURlbGl2ZXJhYmxlKCkgewotCQlEZWxpdmVyYWJsZUltcGwgZGVsaXZlcmFibGUgPSBuZXcgRGVsaXZlcmFibGVJbXBsKCk7Ci0JCXJldHVybiBkZWxpdmVyYWJsZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT3V0Y29tZSBjcmVhdGVPdXRjb21lKCkgewotCQlPdXRjb21lSW1wbCBvdXRjb21lID0gbmV3IE91dGNvbWVJbXBsKCk7Ci0JCXJldHVybiBvdXRjb21lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb250ZW50UGFja2FnZSBjcmVhdGVDb250ZW50UGFja2FnZSgpIHsKLQkJQ29udGVudFBhY2thZ2VJbXBsIGNvbnRlbnRQYWNrYWdlID0gbmV3IENvbnRlbnRQYWNrYWdlSW1wbCgpOwotCQlyZXR1cm4gY29udGVudFBhY2thZ2U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFydGlmYWN0RGVzY3JpcHRpb24gY3JlYXRlQXJ0aWZhY3REZXNjcmlwdGlvbigpIHsKLQkJQXJ0aWZhY3REZXNjcmlwdGlvbkltcGwgYXJ0aWZhY3REZXNjcmlwdGlvbiA9IG5ldyBBcnRpZmFjdERlc2NyaXB0aW9uSW1wbCgpOwotCQlyZXR1cm4gYXJ0aWZhY3REZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgV29ya1Byb2R1Y3REZXNjcmlwdGlvbiBjcmVhdGVXb3JrUHJvZHVjdERlc2NyaXB0aW9uKCkgewotCQlXb3JrUHJvZHVjdERlc2NyaXB0aW9uSW1wbCB3b3JrUHJvZHVjdERlc2NyaXB0aW9uID0gbmV3IFdvcmtQcm9kdWN0RGVzY3JpcHRpb25JbXBsKCk7Ci0JCXJldHVybiB3b3JrUHJvZHVjdERlc2NyaXB0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEZWxpdmVyYWJsZURlc2NyaXB0aW9uIGNyZWF0ZURlbGl2ZXJhYmxlRGVzY3JpcHRpb24oKSB7Ci0JCURlbGl2ZXJhYmxlRGVzY3JpcHRpb25JbXBsIGRlbGl2ZXJhYmxlRGVzY3JpcHRpb24gPSBuZXcgRGVsaXZlcmFibGVEZXNjcmlwdGlvbkltcGwoKTsKLQkJcmV0dXJuIGRlbGl2ZXJhYmxlRGVzY3JpcHRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJvbGVEZXNjcmlwdGlvbiBjcmVhdGVSb2xlRGVzY3JpcHRpb24oKSB7Ci0JCVJvbGVEZXNjcmlwdGlvbkltcGwgcm9sZURlc2NyaXB0aW9uID0gbmV3IFJvbGVEZXNjcmlwdGlvbkltcGwoKTsKLQkJcmV0dXJuIHJvbGVEZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVGFza0Rlc2NyaXB0aW9uIGNyZWF0ZVRhc2tEZXNjcmlwdGlvbigpIHsKLQkJVGFza0Rlc2NyaXB0aW9uSW1wbCB0YXNrRGVzY3JpcHRpb24gPSBuZXcgVGFza0Rlc2NyaXB0aW9uSW1wbCgpOwotCQlyZXR1cm4gdGFza0Rlc2NyaXB0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBHdWlkYW5jZURlc2NyaXB0aW9uIGNyZWF0ZUd1aWRhbmNlRGVzY3JpcHRpb24oKSB7Ci0JCUd1aWRhbmNlRGVzY3JpcHRpb25JbXBsIGd1aWRhbmNlRGVzY3JpcHRpb24gPSBuZXcgR3VpZGFuY2VEZXNjcmlwdGlvbkltcGwoKTsKLQkJcmV0dXJuIGd1aWRhbmNlRGVzY3JpcHRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFByYWN0aWNlRGVzY3JpcHRpb24gY3JlYXRlUHJhY3RpY2VEZXNjcmlwdGlvbigpIHsKLQkJUHJhY3RpY2VEZXNjcmlwdGlvbkltcGwgcHJhY3RpY2VEZXNjcmlwdGlvbiA9IG5ldyBQcmFjdGljZURlc2NyaXB0aW9uSW1wbCgpOwotCQlyZXR1cm4gcHJhY3RpY2VEZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWN0aXZpdHkgY3JlYXRlQWN0aXZpdHkoKSB7Ci0JCUFjdGl2aXR5SW1wbCBhY3Rpdml0eSA9IG5ldyBBY3Rpdml0eUltcGwoKTsKLQkJcmV0dXJuIGFjdGl2aXR5OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBNaWxlc3RvbmUgY3JlYXRlTWlsZXN0b25lKCkgewotCQlNaWxlc3RvbmVJbXBsIG1pbGVzdG9uZSA9IG5ldyBNaWxlc3RvbmVJbXBsKCk7Ci0JCXJldHVybiBtaWxlc3RvbmU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEl0ZXJhdGlvbiBjcmVhdGVJdGVyYXRpb24oKSB7Ci0JCUl0ZXJhdGlvbkltcGwgaXRlcmF0aW9uID0gbmV3IEl0ZXJhdGlvbkltcGwoKTsKLQkJcmV0dXJuIGl0ZXJhdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUGhhc2UgY3JlYXRlUGhhc2UoKSB7Ci0JCVBoYXNlSW1wbCBwaGFzZSA9IG5ldyBQaGFzZUltcGwoKTsKLQkJcmV0dXJuIHBoYXNlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUZWFtUHJvZmlsZSBjcmVhdGVUZWFtUHJvZmlsZSgpIHsKLQkJVGVhbVByb2ZpbGVJbXBsIHRlYW1Qcm9maWxlID0gbmV3IFRlYW1Qcm9maWxlSW1wbCgpOwotCQlyZXR1cm4gdGVhbVByb2ZpbGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJvbGVEZXNjcmlwdG9yIGNyZWF0ZVJvbGVEZXNjcmlwdG9yKCkgewotCQlSb2xlRGVzY3JpcHRvckltcGwgcm9sZURlc2NyaXB0b3IgPSBuZXcgUm9sZURlc2NyaXB0b3JJbXBsKCk7Ci0JCXJldHVybiByb2xlRGVzY3JpcHRvcjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgV29ya09yZGVyIGNyZWF0ZVdvcmtPcmRlcigpIHsKLQkJV29ya09yZGVySW1wbCB3b3JrT3JkZXIgPSBuZXcgV29ya09yZGVySW1wbCgpOwotCQlyZXR1cm4gd29ya09yZGVyOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQbGFubmluZ0RhdGEgY3JlYXRlUGxhbm5pbmdEYXRhKCkgewotCQlQbGFubmluZ0RhdGFJbXBsIHBsYW5uaW5nRGF0YSA9IG5ldyBQbGFubmluZ0RhdGFJbXBsKCk7Ci0JCXJldHVybiBwbGFubmluZ0RhdGE7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFRhc2tEZXNjcmlwdG9yIGNyZWF0ZVRhc2tEZXNjcmlwdG9yKCkgewotCQlUYXNrRGVzY3JpcHRvckltcGwgdGFza0Rlc2NyaXB0b3IgPSBuZXcgVGFza0Rlc2NyaXB0b3JJbXBsKCk7Ci0JCXJldHVybiB0YXNrRGVzY3JpcHRvcjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgV29ya1Byb2R1Y3REZXNjcmlwdG9yIGNyZWF0ZVdvcmtQcm9kdWN0RGVzY3JpcHRvcigpIHsKLQkJV29ya1Byb2R1Y3REZXNjcmlwdG9ySW1wbCB3b3JrUHJvZHVjdERlc2NyaXB0b3IgPSBuZXcgV29ya1Byb2R1Y3REZXNjcmlwdG9ySW1wbCgpOwotCQlyZXR1cm4gd29ya1Byb2R1Y3REZXNjcmlwdG9yOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb21wb3NpdGVSb2xlIGNyZWF0ZUNvbXBvc2l0ZVJvbGUoKSB7Ci0JCUNvbXBvc2l0ZVJvbGVJbXBsIGNvbXBvc2l0ZVJvbGUgPSBuZXcgQ29tcG9zaXRlUm9sZUltcGwoKTsKLQkJcmV0dXJuIGNvbXBvc2l0ZVJvbGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbiBjcmVhdGVCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24oKSB7Ci0JCUJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbkltcGwgYnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uID0gbmV3IEJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbkltcGwoKTsKLQkJcmV0dXJuIGJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWN0aXZpdHlEZXNjcmlwdGlvbiBjcmVhdGVBY3Rpdml0eURlc2NyaXB0aW9uKCkgewotCQlBY3Rpdml0eURlc2NyaXB0aW9uSW1wbCBhY3Rpdml0eURlc2NyaXB0aW9uID0gbmV3IEFjdGl2aXR5RGVzY3JpcHRpb25JbXBsKCk7Ci0JCXJldHVybiBhY3Rpdml0eURlc2NyaXB0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbiBjcmVhdGVEZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbigpIHsKLQkJRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25JbXBsIGRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uID0gbmV3IERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uSW1wbCgpOwotCQlyZXR1cm4gZGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFByb2Nlc3NEZXNjcmlwdGlvbiBjcmVhdGVQcm9jZXNzRGVzY3JpcHRpb24oKSB7Ci0JCVByb2Nlc3NEZXNjcmlwdGlvbkltcGwgcHJvY2Vzc0Rlc2NyaXB0aW9uID0gbmV3IFByb2Nlc3NEZXNjcmlwdGlvbkltcGwoKTsKLQkJcmV0dXJuIHByb2Nlc3NEZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRGVzY3JpcHRvckRlc2NyaXB0aW9uIGNyZWF0ZURlc2NyaXB0b3JEZXNjcmlwdGlvbigpIHsKLQkJRGVzY3JpcHRvckRlc2NyaXB0aW9uSW1wbCBkZXNjcmlwdG9yRGVzY3JpcHRpb24gPSBuZXcgRGVzY3JpcHRvckRlc2NyaXB0aW9uSW1wbCgpOwotCQlyZXR1cm4gZGVzY3JpcHRvckRlc2NyaXB0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb25jZXB0IGNyZWF0ZUNvbmNlcHQoKSB7Ci0JCUNvbmNlcHRJbXBsIGNvbmNlcHQgPSBuZXcgQ29uY2VwdEltcGwoKTsKLQkJcmV0dXJuIGNvbmNlcHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENoZWNrbGlzdCBjcmVhdGVDaGVja2xpc3QoKSB7Ci0JCUNoZWNrbGlzdEltcGwgY2hlY2tsaXN0ID0gbmV3IENoZWNrbGlzdEltcGwoKTsKLQkJcmV0dXJuIGNoZWNrbGlzdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRXhhbXBsZSBjcmVhdGVFeGFtcGxlKCkgewotCQlFeGFtcGxlSW1wbCBleGFtcGxlID0gbmV3IEV4YW1wbGVJbXBsKCk7Ci0JCXJldHVybiBleGFtcGxlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBHdWlkZWxpbmUgY3JlYXRlR3VpZGVsaW5lKCkgewotCQlHdWlkZWxpbmVJbXBsIGd1aWRlbGluZSA9IG5ldyBHdWlkZWxpbmVJbXBsKCk7Ci0JCXJldHVybiBndWlkZWxpbmU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVzdGltYXRpb25Db25zaWRlcmF0aW9ucyBjcmVhdGVFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMoKSB7Ci0JCUVzdGltYXRpb25Db25zaWRlcmF0aW9uc0ltcGwgZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zID0gbmV3IEVzdGltYXRpb25Db25zaWRlcmF0aW9uc0ltcGwoKTsKLQkJcmV0dXJuIGVzdGltYXRpb25Db25zaWRlcmF0aW9uczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUmVwb3J0IGNyZWF0ZVJlcG9ydCgpIHsKLQkJUmVwb3J0SW1wbCByZXBvcnQgPSBuZXcgUmVwb3J0SW1wbCgpOwotCQlyZXR1cm4gcmVwb3J0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUZW1wbGF0ZSBjcmVhdGVUZW1wbGF0ZSgpIHsKLQkJVGVtcGxhdGVJbXBsIHRlbXBsYXRlID0gbmV3IFRlbXBsYXRlSW1wbCgpOwotCQlyZXR1cm4gdGVtcGxhdGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN1cHBvcnRpbmdNYXRlcmlhbCBjcmVhdGVTdXBwb3J0aW5nTWF0ZXJpYWwoKSB7Ci0JCVN1cHBvcnRpbmdNYXRlcmlhbEltcGwgc3VwcG9ydGluZ01hdGVyaWFsID0gbmV3IFN1cHBvcnRpbmdNYXRlcmlhbEltcGwoKTsKLQkJcmV0dXJuIHN1cHBvcnRpbmdNYXRlcmlhbDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVG9vbE1lbnRvciBjcmVhdGVUb29sTWVudG9yKCkgewotCQlUb29sTWVudG9ySW1wbCB0b29sTWVudG9yID0gbmV3IFRvb2xNZW50b3JJbXBsKCk7Ci0JCXJldHVybiB0b29sTWVudG9yOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBXaGl0ZXBhcGVyIGNyZWF0ZVdoaXRlcGFwZXIoKSB7Ci0JCVdoaXRlcGFwZXJJbXBsIHdoaXRlcGFwZXIgPSBuZXcgV2hpdGVwYXBlckltcGwoKTsKLQkJcmV0dXJuIHdoaXRlcGFwZXI7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFRlcm1EZWZpbml0aW9uIGNyZWF0ZVRlcm1EZWZpbml0aW9uKCkgewotCQlUZXJtRGVmaW5pdGlvbkltcGwgdGVybURlZmluaXRpb24gPSBuZXcgVGVybURlZmluaXRpb25JbXBsKCk7Ci0JCXJldHVybiB0ZXJtRGVmaW5pdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQXBwbGljYWJsZU1ldGFDbGFzc0luZm8gY3JlYXRlQXBwbGljYWJsZU1ldGFDbGFzc0luZm8oKSB7Ci0JCUFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvSW1wbCBhcHBsaWNhYmxlTWV0YUNsYXNzSW5mbyA9IG5ldyBBcHBsaWNhYmxlTWV0YUNsYXNzSW5mb0ltcGwoKTsKLQkJcmV0dXJuIGFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQcmFjdGljZSBjcmVhdGVQcmFjdGljZSgpIHsKLQkJUHJhY3RpY2VJbXBsIHByYWN0aWNlID0gbmV3IFByYWN0aWNlSW1wbCgpOwotCQlyZXR1cm4gcHJhY3RpY2U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJldXNhYmxlQXNzZXQgY3JlYXRlUmV1c2FibGVBc3NldCgpIHsKLQkJUmV1c2FibGVBc3NldEltcGwgcmV1c2FibGVBc3NldCA9IG5ldyBSZXVzYWJsZUFzc2V0SW1wbCgpOwotCQlyZXR1cm4gcmV1c2FibGVBc3NldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRGlzY2lwbGluZSBjcmVhdGVEaXNjaXBsaW5lKCkgewotCQlEaXNjaXBsaW5lSW1wbCBkaXNjaXBsaW5lID0gbmV3IERpc2NpcGxpbmVJbXBsKCk7Ci0JCXJldHVybiBkaXNjaXBsaW5lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSb2xlU2V0IGNyZWF0ZVJvbGVTZXQoKSB7Ci0JCVJvbGVTZXRJbXBsIHJvbGVTZXQgPSBuZXcgUm9sZVNldEltcGwoKTsKLQkJcmV0dXJuIHJvbGVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERvbWFpbiBjcmVhdGVEb21haW4oKSB7Ci0JCURvbWFpbkltcGwgZG9tYWluID0gbmV3IERvbWFpbkltcGwoKTsKLQkJcmV0dXJuIGRvbWFpbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgV29ya1Byb2R1Y3RUeXBlIGNyZWF0ZVdvcmtQcm9kdWN0VHlwZSgpIHsKLQkJV29ya1Byb2R1Y3RUeXBlSW1wbCB3b3JrUHJvZHVjdFR5cGUgPSBuZXcgV29ya1Byb2R1Y3RUeXBlSW1wbCgpOwotCQlyZXR1cm4gd29ya1Byb2R1Y3RUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEaXNjaXBsaW5lR3JvdXBpbmcgY3JlYXRlRGlzY2lwbGluZUdyb3VwaW5nKCkgewotCQlEaXNjaXBsaW5lR3JvdXBpbmdJbXBsIGRpc2NpcGxpbmVHcm91cGluZyA9IG5ldyBEaXNjaXBsaW5lR3JvdXBpbmdJbXBsKCk7Ci0JCXJldHVybiBkaXNjaXBsaW5lR3JvdXBpbmc7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFRvb2wgY3JlYXRlVG9vbCgpIHsKLQkJVG9vbEltcGwgdG9vbCA9IG5ldyBUb29sSW1wbCgpOwotCQlyZXR1cm4gdG9vbDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUm9sZVNldEdyb3VwaW5nIGNyZWF0ZVJvbGVTZXRHcm91cGluZygpIHsKLQkJUm9sZVNldEdyb3VwaW5nSW1wbCByb2xlU2V0R3JvdXBpbmcgPSBuZXcgUm9sZVNldEdyb3VwaW5nSW1wbCgpOwotCQlyZXR1cm4gcm9sZVNldEdyb3VwaW5nOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDdXN0b21DYXRlZ29yeSBjcmVhdGVDdXN0b21DYXRlZ29yeSgpIHsKLQkJQ3VzdG9tQ2F0ZWdvcnlJbXBsIGN1c3RvbUNhdGVnb3J5ID0gbmV3IEN1c3RvbUNhdGVnb3J5SW1wbCgpOwotCQlyZXR1cm4gY3VzdG9tQ2F0ZWdvcnk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERlbGl2ZXJ5UHJvY2VzcyBjcmVhdGVEZWxpdmVyeVByb2Nlc3MoKSB7Ci0JCURlbGl2ZXJ5UHJvY2Vzc0ltcGwgZGVsaXZlcnlQcm9jZXNzID0gbmV3IERlbGl2ZXJ5UHJvY2Vzc0ltcGwoKTsKLQkJcmV0dXJuIGRlbGl2ZXJ5UHJvY2VzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ2FwYWJpbGl0eVBhdHRlcm4gY3JlYXRlQ2FwYWJpbGl0eVBhdHRlcm4oKSB7Ci0JCUNhcGFiaWxpdHlQYXR0ZXJuSW1wbCBjYXBhYmlsaXR5UGF0dGVybiA9IG5ldyBDYXBhYmlsaXR5UGF0dGVybkltcGwoKTsKLQkJcmV0dXJuIGNhcGFiaWxpdHlQYXR0ZXJuOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSBjcmVhdGVQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSgpIHsKLQkJUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGVJbXBsIHByb2Nlc3NQbGFubmluZ1RlbXBsYXRlID0gbmV3IFByb2Nlc3NQbGFubmluZ1RlbXBsYXRlSW1wbCgpOwotCQlyZXR1cm4gcHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJvYWRtYXAgY3JlYXRlUm9hZG1hcCgpIHsKLQkJUm9hZG1hcEltcGwgcm9hZG1hcCA9IG5ldyBSb2FkbWFwSW1wbCgpOwotCQlyZXR1cm4gcm9hZG1hcDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUHJvY2Vzc0NvbXBvbmVudCBjcmVhdGVQcm9jZXNzQ29tcG9uZW50KCkgewotCQlQcm9jZXNzQ29tcG9uZW50SW1wbCBwcm9jZXNzQ29tcG9uZW50ID0gbmV3IFByb2Nlc3NDb21wb25lbnRJbXBsKCk7Ci0JCXJldHVybiBwcm9jZXNzQ29tcG9uZW50OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQcm9jZXNzUGFja2FnZSBjcmVhdGVQcm9jZXNzUGFja2FnZSgpIHsKLQkJUHJvY2Vzc1BhY2thZ2VJbXBsIHByb2Nlc3NQYWNrYWdlID0gbmV3IFByb2Nlc3NQYWNrYWdlSW1wbCgpOwotCQlyZXR1cm4gcHJvY2Vzc1BhY2thZ2U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UgY3JlYXRlUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSgpIHsKLQkJUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZUltcGwgcHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSA9IG5ldyBQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlSW1wbCgpOwotCQlyZXR1cm4gcHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3IgY3JlYXRlUHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3IoKSB7Ci0JCVByb2Nlc3NDb21wb25lbnREZXNjcmlwdG9ySW1wbCBwcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvciA9IG5ldyBQcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvckltcGwoKTsKLQkJcmV0dXJuIHByb2Nlc3NDb21wb25lbnREZXNjcmlwdG9yOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBNZXRob2RQbHVnaW4gY3JlYXRlTWV0aG9kUGx1Z2luKCkgewotCQlNZXRob2RQbHVnaW5JbXBsIG1ldGhvZFBsdWdpbiA9IG5ldyBNZXRob2RQbHVnaW5JbXBsKCk7Ci0JCXJldHVybiBtZXRob2RQbHVnaW47Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE1ldGhvZENvbmZpZ3VyYXRpb24gY3JlYXRlTWV0aG9kQ29uZmlndXJhdGlvbigpIHsKLQkJTWV0aG9kQ29uZmlndXJhdGlvbkltcGwgbWV0aG9kQ29uZmlndXJhdGlvbiA9IG5ldyBNZXRob2RDb25maWd1cmF0aW9uSW1wbCgpOwotCQlyZXR1cm4gbWV0aG9kQ29uZmlndXJhdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUHJvY2Vzc0ZhbWlseSBjcmVhdGVQcm9jZXNzRmFtaWx5KCkgewotCQlQcm9jZXNzRmFtaWx5SW1wbCBwcm9jZXNzRmFtaWx5ID0gbmV3IFByb2Nlc3NGYW1pbHlJbXBsKCk7Ci0JCXJldHVybiBwcm9jZXNzRmFtaWx5OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBNZXRob2RMaWJyYXJ5IGNyZWF0ZU1ldGhvZExpYnJhcnkoKSB7Ci0JCU1ldGhvZExpYnJhcnlJbXBsIG1ldGhvZExpYnJhcnkgPSBuZXcgTWV0aG9kTGlicmFyeUltcGwoKTsKLQkJcmV0dXJuIG1ldGhvZExpYnJhcnk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFBvaW50IGNyZWF0ZVBvaW50KCkgewotCQlQb2ludEltcGwgcG9pbnQgPSBuZXcgUG9pbnRJbXBsKCk7Ci0JCXJldHVybiBwb2ludDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRGlhZ3JhbUxpbmsgY3JlYXRlRGlhZ3JhbUxpbmsoKSB7Ci0JCURpYWdyYW1MaW5rSW1wbCBkaWFncmFtTGluayA9IG5ldyBEaWFncmFtTGlua0ltcGwoKTsKLQkJcmV0dXJuIGRpYWdyYW1MaW5rOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBHcmFwaENvbm5lY3RvciBjcmVhdGVHcmFwaENvbm5lY3RvcigpIHsKLQkJR3JhcGhDb25uZWN0b3JJbXBsIGdyYXBoQ29ubmVjdG9yID0gbmV3IEdyYXBoQ29ubmVjdG9ySW1wbCgpOwotCQlyZXR1cm4gZ3JhcGhDb25uZWN0b3I7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERpbWVuc2lvbiBjcmVhdGVEaW1lbnNpb24oKSB7Ci0JCURpbWVuc2lvbkltcGwgZGltZW5zaW9uID0gbmV3IERpbWVuc2lvbkltcGwoKTsKLQkJcmV0dXJuIGRpbWVuc2lvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUmVmZXJlbmNlIGNyZWF0ZVJlZmVyZW5jZSgpIHsKLQkJUmVmZXJlbmNlSW1wbCByZWZlcmVuY2UgPSBuZXcgUmVmZXJlbmNlSW1wbCgpOwotCQlyZXR1cm4gcmVmZXJlbmNlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQcm9wZXJ0eSBjcmVhdGVQcm9wZXJ0eSgpIHsKLQkJUHJvcGVydHlJbXBsIHByb3BlcnR5ID0gbmV3IFByb3BlcnR5SW1wbCgpOwotCQlyZXR1cm4gcHJvcGVydHk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEdyYXBoRWRnZSBjcmVhdGVHcmFwaEVkZ2UoKSB7Ci0JCUdyYXBoRWRnZUltcGwgZ3JhcGhFZGdlID0gbmV3IEdyYXBoRWRnZUltcGwoKTsKLQkJcmV0dXJuIGdyYXBoRWRnZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRGlhZ3JhbSBjcmVhdGVEaWFncmFtKCkgewotCQlEaWFncmFtSW1wbCBkaWFncmFtID0gbmV3IERpYWdyYW1JbXBsKCk7Ci0JCXJldHVybiBkaWFncmFtOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBHcmFwaE5vZGUgY3JlYXRlR3JhcGhOb2RlKCkgewotCQlHcmFwaE5vZGVJbXBsIGdyYXBoTm9kZSA9IG5ldyBHcmFwaE5vZGVJbXBsKCk7Ci0JCXJldHVybiBncmFwaE5vZGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFNpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50IGNyZWF0ZVNpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50KCkgewotCQlTaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudEltcGwgc2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnQgPSBuZXcgU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnRJbXBsKCk7Ci0JCXJldHVybiBzaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVU1BU2VtYW50aWNNb2RlbEJyaWRnZSBjcmVhdGVVTUFTZW1hbnRpY01vZGVsQnJpZGdlKCkgewotCQlVTUFTZW1hbnRpY01vZGVsQnJpZGdlSW1wbCB1bWFTZW1hbnRpY01vZGVsQnJpZGdlID0gbmV3IFVNQVNlbWFudGljTW9kZWxCcmlkZ2VJbXBsKCk7Ci0JCXJldHVybiB1bWFTZW1hbnRpY01vZGVsQnJpZGdlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb3JlU2VtYW50aWNNb2RlbEJyaWRnZSBjcmVhdGVDb3JlU2VtYW50aWNNb2RlbEJyaWRnZSgpIHsKLQkJQ29yZVNlbWFudGljTW9kZWxCcmlkZ2VJbXBsIGNvcmVTZW1hbnRpY01vZGVsQnJpZGdlID0gbmV3IENvcmVTZW1hbnRpY01vZGVsQnJpZGdlSW1wbCgpOwotCQlyZXR1cm4gY29yZVNlbWFudGljTW9kZWxCcmlkZ2U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFRleHRFbGVtZW50IGNyZWF0ZVRleHRFbGVtZW50KCkgewotCQlUZXh0RWxlbWVudEltcGwgdGV4dEVsZW1lbnQgPSBuZXcgVGV4dEVsZW1lbnRJbXBsKCk7Ci0JCXJldHVybiB0ZXh0RWxlbWVudDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSW1hZ2UgY3JlYXRlSW1hZ2UoKSB7Ci0JCUltYWdlSW1wbCBpbWFnZSA9IG5ldyBJbWFnZUltcGwoKTsKLQkJcmV0dXJuIGltYWdlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQb2x5bGluZSBjcmVhdGVQb2x5bGluZSgpIHsKLQkJUG9seWxpbmVJbXBsIHBvbHlsaW5lID0gbmV3IFBvbHlsaW5lSW1wbCgpOwotCQlyZXR1cm4gcG9seWxpbmU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVsbGlwc2UgY3JlYXRlRWxsaXBzZSgpIHsKLQkJRWxsaXBzZUltcGwgZWxsaXBzZSA9IG5ldyBFbGxpcHNlSW1wbCgpOwotCQlyZXR1cm4gZWxsaXBzZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgV29ya09yZGVyVHlwZSBjcmVhdGVXb3JrT3JkZXJUeXBlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLAotCQkJU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlXb3JrT3JkZXJUeXBlIHJlc3VsdCA9IFdvcmtPcmRlclR5cGUuZ2V0KGluaXRpYWxWYWx1ZSk7Ci0JCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCi0JCQkJCSJUaGUgdmFsdWUgJyIgKyBpbml0aWFsVmFsdWUgKyAiJyBpcyBub3QgYSB2YWxpZCBlbnVtZXJhdG9yIG9mICciICsgZURhdGFUeXBlLmdldE5hbWUoKSArICInIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0V29ya09yZGVyVHlwZVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsCi0JCQlPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gaW5zdGFuY2VWYWx1ZSA9PSBudWxsID8gbnVsbCA6IGluc3RhbmNlVmFsdWUudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVmFyaWFiaWxpdHlUeXBlIGNyZWF0ZVZhcmlhYmlsaXR5VHlwZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwKLQkJCVN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJVmFyaWFiaWxpdHlUeXBlIHJlc3VsdCA9IFZhcmlhYmlsaXR5VHlwZS5nZXQoaW5pdGlhbFZhbHVlKTsKLQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKLQkJCQkJIlRoZSB2YWx1ZSAnIiArIGluaXRpYWxWYWx1ZSArICInIGlzIG5vdCBhIHZhbGlkIGVudW1lcmF0b3Igb2YgJyIgKyBlRGF0YVR5cGUuZ2V0TmFtZSgpICsgIiciKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRWYXJpYWJpbGl0eVR5cGVUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLAotCQkJT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIGluc3RhbmNlVmFsdWUgPT0gbnVsbCA/IG51bGwgOiBpbnN0YW5jZVZhbHVlLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERhdGUgY3JlYXRlRGF0ZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlyZXR1cm4gKERhdGUpIHN1cGVyLmNyZWF0ZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydERhdGVUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gc3VwZXIuY29udmVydFRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFVSSSBjcmVhdGVVcmlGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChVUkkpIHN1cGVyLmNyZWF0ZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydFVyaVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBzdXBlci5jb252ZXJ0VG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNyZWF0ZVN0cmluZ0Zyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwKLQkJCVN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChTdHJpbmcpIHN1cGVyLmNyZWF0ZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydFN0cmluZ1RvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsCi0JCQlPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gc3VwZXIuY29udmVydFRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJvb2xlYW4gY3JlYXRlQm9vbGVhbkZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwKLQkJCVN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChCb29sZWFuKSBzdXBlci5jcmVhdGVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRCb29sZWFuVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwKLQkJCU9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBzdXBlci5jb252ZXJ0VG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU2V0IGNyZWF0ZVNldEZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlyZXR1cm4gKFNldCkgc3VwZXIuY3JlYXRlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0U2V0VG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIHN1cGVyLmNvbnZlcnRUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGNyZWF0ZVNlcXVlbmNlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLAotCQkJU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlyZXR1cm4gKExpc3QpIHN1cGVyLmNyZWF0ZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydFNlcXVlbmNlVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwKLQkJCU9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBzdXBlci5jb252ZXJ0VG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSW50ZWdlciBjcmVhdGVJbnRlZ2VyRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLAotCQkJU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlyZXR1cm4gKEludGVnZXIpIHN1cGVyLmNyZWF0ZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydEludGVnZXJUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLAotCQkJT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIHN1cGVyLmNvbnZlcnRUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEb3VibGUgY3JlYXRlRG91YmxlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLAotCQkJU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlyZXR1cm4gKERvdWJsZSkgc3VwZXIuY3JlYXRlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0RG91YmxlVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwKLQkJCU9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBzdXBlci5jb252ZXJ0VG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVW1hUGFja2FnZSBnZXRVbWFQYWNrYWdlKCkgewotCQlyZXR1cm4gKFVtYVBhY2thZ2UpIGdldEVQYWNrYWdlKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZGVwcmVjYXRlZAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlARGVwcmVjYXRlZAotCXB1YmxpYyBzdGF0aWMgVW1hUGFja2FnZSBnZXRQYWNrYWdlKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5lSU5TVEFOQ0U7Ci0JfQotCi19IC8vVW1hRmFjdG9yeUltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9VbWFQYWNrYWdlSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1VtYVBhY2thZ2VJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkODU2MjMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1VtYVBhY2thZ2VJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OTcxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5EYXRlOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVFbnVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FUGFja2FnZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BcHBsaWNhYmxlTWV0YUNsYXNzSW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFydGlmYWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQXJ0aWZhY3REZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DYXBhYmlsaXR5UGF0dGVybjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNoZWNrbGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNsYXNzaWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db21wb3NpdGVSb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29uY2VwdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnN0cmFpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50Q2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29yZVNlbWFudGljTW9kZWxCcmlkZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DdXN0b21DYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcmFibGVEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJ5UHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpYmFibGVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpcHRvckRlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW1FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbUxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaW1lbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaXNjaXBsaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGlzY2lwbGluZUdyb3VwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkVsbGlwc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5FeGFtcGxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRnVsZmlsbGFibGVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhDb25uZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaEVkZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaGljUHJpbWl0aXZlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3VpZGFuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HdWlkYW5jZURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3VpZGVsaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5JdGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5LaW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTGVhZkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnRQcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1pbGVzdG9uZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk5hbWVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk91dGNvbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5QYWNrYWdlYWJsZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5QaGFzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlBsYW5uaW5nRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUG9seWxpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5QcmFjdGljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByYWN0aWNlRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0Rlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0VsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzRmFtaWx5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc1BhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUmVwb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUmV1c2FibGVBc3NldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvYWRtYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZVNldEdyb3VwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuU2VjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlNlbWFudGljTW9kZWxCcmlkZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5TaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlN0ZXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5TdXBwb3J0aW5nTWF0ZXJpYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZWFtUHJvZmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRlbXBsYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGVybURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZXh0RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRvb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Ub29sTWVudG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVNQVNlbWFudGljTW9kZWxCcmlkZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldoaXRlcGFwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya09yZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya09yZGVyVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLio7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCA8Yj5QYWNrYWdlPC9iPi4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgVW1hUGFja2FnZUltcGwgZXh0ZW5kcyBFUGFja2FnZUltcGwgaW1wbGVtZW50cyBVbWFQYWNrYWdlIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBjbGFzc2lmaWVyRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHR5cGVFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgZWxlbWVudEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBuYW1lZEVsZW1lbnRFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgcGFja2FnZWFibGVFbGVtZW50RUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHBhY2thZ2VFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgbmFtZXNwYWNlRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIG1ldGhvZEVsZW1lbnRFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgY29uc3RyYWludEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBtZXRob2RFbGVtZW50UHJvcGVydHlFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3Mga2luZEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBjb250ZW50RWxlbWVudEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBkZXNjcmliYWJsZUVsZW1lbnRFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgY29udGVudERlc2NyaXB0aW9uRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHNlY3Rpb25FQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3Mgcm9sZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB3b3JrUHJvZHVjdEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBmdWxmaWxsYWJsZUVsZW1lbnRFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgdGFza0VDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB3b3JrRGVmaW5pdGlvbkVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBzdGVwRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGd1aWRhbmNlRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGFydGlmYWN0RUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGRlbGl2ZXJhYmxlRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIG91dGNvbWVFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgbWV0aG9kUGFja2FnZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBjb250ZW50UGFja2FnZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBhcnRpZmFjdERlc2NyaXB0aW9uRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHdvcmtQcm9kdWN0RGVzY3JpcHRpb25FQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgZGVsaXZlcmFibGVEZXNjcmlwdGlvbkVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyByb2xlRGVzY3JpcHRpb25FQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgdGFza0Rlc2NyaXB0aW9uRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGd1aWRhbmNlRGVzY3JpcHRpb25FQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgcHJhY3RpY2VEZXNjcmlwdGlvbkVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBhY3Rpdml0eUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB3b3JrQnJlYWtkb3duRWxlbWVudEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBicmVha2Rvd25FbGVtZW50RUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIG1pbGVzdG9uZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBpdGVyYXRpb25FQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgcGhhc2VFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgdGVhbVByb2ZpbGVFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3Mgcm9sZURlc2NyaXB0b3JFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3Mgd29ya09yZGVyRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHByb2Nlc3NFbGVtZW50RUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHBsYW5uaW5nRGF0YUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBkZXNjcmlwdG9yRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHRhc2tEZXNjcmlwdG9yRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHdvcmtQcm9kdWN0RGVzY3JpcHRvckVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBjb21wb3NpdGVSb2xlRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbkVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBhY3Rpdml0eURlc2NyaXB0aW9uRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHByb2Nlc3NEZXNjcmlwdGlvbkVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBkZXNjcmlwdG9yRGVzY3JpcHRpb25FQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgY29uY2VwdEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBjaGVja2xpc3RFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgZXhhbXBsZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBndWlkZWxpbmVFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHJlcG9ydEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB0ZW1wbGF0ZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBzdXBwb3J0aW5nTWF0ZXJpYWxFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgdG9vbE1lbnRvckVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB3aGl0ZXBhcGVyRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHRlcm1EZWZpbml0aW9uRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHByYWN0aWNlRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHJldXNhYmxlQXNzZXRFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgZGlzY2lwbGluZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBjb250ZW50Q2F0ZWdvcnlFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3Mgcm9sZVNldEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBkb21haW5FQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3Mgd29ya1Byb2R1Y3RUeXBlRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGRpc2NpcGxpbmVHcm91cGluZ0VDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB0b29sRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHJvbGVTZXRHcm91cGluZ0VDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBjdXN0b21DYXRlZ29yeUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBkZWxpdmVyeVByb2Nlc3NFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgcHJvY2Vzc0VDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBjYXBhYmlsaXR5UGF0dGVybkVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBwcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyByb2FkbWFwRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHByb2Nlc3NDb21wb25lbnRFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgcHJvY2Vzc1BhY2thZ2VFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgcHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBwcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvckVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBtZXRob2RQbHVnaW5FQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgdmFyaWFiaWxpdHlFbGVtZW50RUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIG1ldGhvZFVuaXRFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgbWV0aG9kQ29uZmlndXJhdGlvbkVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBwcm9jZXNzRmFtaWx5RUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIG1ldGhvZExpYnJhcnlFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgcG9pbnRFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgZ3JhcGhFbGVtZW50RUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGRpYWdyYW1FbGVtZW50RUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGRpYWdyYW1MaW5rRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGdyYXBoQ29ubmVjdG9yRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHNlbWFudGljTW9kZWxCcmlkZ2VFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgZGltZW5zaW9uRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHJlZmVyZW5jZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBwcm9wZXJ0eUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBncmFwaEVkZ2VFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgZGlhZ3JhbUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBncmFwaE5vZGVFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3Mgc2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnRFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgdW1hU2VtYW50aWNNb2RlbEJyaWRnZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBjb3JlU2VtYW50aWNNb2RlbEJyaWRnZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBsZWFmRWxlbWVudEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB0ZXh0RWxlbWVudEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBpbWFnZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBncmFwaGljUHJpbWl0aXZlRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHBvbHlsaW5lRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGVsbGlwc2VFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRW51bSB3b3JrT3JkZXJUeXBlRUVudW0gPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRW51bSB2YXJpYWJpbGl0eVR5cGVFRW51bSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSBkYXRlRURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIHVyaUVEYXRhVHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSBzdHJpbmdFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgYm9vbGVhbkVEYXRhVHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSBzZXRFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgc2VxdWVuY2VFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgaW50ZWdlckVEYXRhVHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSBkb3VibGVFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgbW9kZWwgPGI+UGFja2FnZTwvYj4sIHJlZ2lzdGVyZWQgd2l0aAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2UuUmVnaXN0cnkgRVBhY2thZ2UuUmVnaXN0cnl9IGJ5IHRoZSBwYWNrYWdlCi0JICogcGFja2FnZSBVUkkgdmFsdWUuCi0JICogPHA+Tm90ZTogdGhlIGNvcnJlY3Qgd2F5IHRvIGNyZWF0ZSB0aGUgcGFja2FnZSBpcyB2aWEgdGhlIHN0YXRpYwotCSAqIGZhY3RvcnkgbWV0aG9kIHtAbGluayAjaW5pdCBpbml0KCl9LCB3aGljaCBhbHNvIHBlcmZvcm1zCi0JICogaW5pdGlhbGl6YXRpb24gb2YgdGhlIHBhY2thZ2UsIG9yIHJldHVybnMgdGhlIHJlZ2lzdGVyZWQgcGFja2FnZSwKLQkgKiBpZiBvbmUgYWxyZWFkeSBleGlzdHMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZS5SZWdpc3RyeQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2VOU19VUkkKLQkgKiBAc2VlICNpbml0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBVbWFQYWNrYWdlSW1wbCgpIHsKLQkJc3VwZXIoZU5TX1VSSSwgVW1hRmFjdG9yeS5lSU5TVEFOQ0UpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNJbml0ZWQgPSBmYWxzZTsKLQotCS8qKgotCSAqIENyZWF0ZXMsIHJlZ2lzdGVycywgYW5kIGluaXRpYWxpemVzIHRoZSA8Yj5QYWNrYWdlPC9iPiBmb3IgdGhpcwotCSAqIG1vZGVsLCBhbmQgZm9yIGFueSBvdGhlcnMgdXBvbiB3aGljaCBpdCBkZXBlbmRzLiAgU2ltcGxlCi0JICogZGVwZW5kZW5jaWVzIGFyZSBzYXRpc2ZpZWQgYnkgY2FsbGluZyB0aGlzIG1ldGhvZCBvbiBhbGwKLQkgKiBkZXBlbmRlbnQgcGFja2FnZXMgYmVmb3JlIGRvaW5nIGFueXRoaW5nIGVsc2UuICBUaGlzIG1ldGhvZCBkcml2ZXMKLQkgKiBpbml0aWFsaXphdGlvbiBmb3IgaW50ZXJkZXBlbmRlbnQgcGFja2FnZXMgZGlyZWN0bHksIGluIHBhcmFsbGVsCi0JICogd2l0aCB0aGlzIHBhY2thZ2UsIGl0c2VsZi4KLQkgKiA8cD5PZiB0aGlzIHBhY2thZ2UgYW5kIGl0cyBpbnRlcmRlcGVuZGVuY2llcywgYWxsIHBhY2thZ2VzIHdoaWNoCi0JICogaGF2ZSBub3QgeWV0IGJlZW4gcmVnaXN0ZXJlZCBieSB0aGVpciBVUkkgdmFsdWVzIGFyZSBmaXJzdCBjcmVhdGVkCi0JICogYW5kIHJlZ2lzdGVyZWQuICBUaGUgcGFja2FnZXMgYXJlIHRoZW4gaW5pdGlhbGl6ZWQgaW4gdHdvIHN0ZXBzOgotCSAqIG1ldGEtbW9kZWwgb2JqZWN0cyBmb3IgYWxsIG9mIHRoZSBwYWNrYWdlcyBhcmUgY3JlYXRlZCBiZWZvcmUgYW55Ci0JICogYXJlIGluaXRpYWxpemVkLCBzaW5jZSBvbmUgcGFja2FnZSdzIG1ldGEtbW9kZWwgb2JqZWN0cyBtYXkgcmVmZXIgdG8KLQkgKiB0aG9zZSBvZiBhbm90aGVyLgotCSAqIDxwPkludm9jYXRpb24gb2YgdGhpcyBtZXRob2Qgd2lsbCBub3QgYWZmZWN0IGFueSBwYWNrYWdlcyB0aGF0IGhhdmUKLQkgKiBhbHJlYWR5IGJlZW4gaW5pdGlhbGl6ZWQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNlTlNfVVJJCi0JICogQHNlZSAjY3JlYXRlUGFja2FnZUNvbnRlbnRzKCkKLQkgKiBAc2VlICNpbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBVbWFQYWNrYWdlIGluaXQoKSB7Ci0JCWlmIChpc0luaXRlZCkKLQkJCXJldHVybiAoVW1hUGFja2FnZSkgRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UKLQkJCQkJLmdldEVQYWNrYWdlKFVtYVBhY2thZ2UuZU5TX1VSSSk7Ci0KLQkJLy8gT2J0YWluIG9yIGNyZWF0ZSBhbmQgcmVnaXN0ZXIgcGFja2FnZQotCQlVbWFQYWNrYWdlSW1wbCB0aGVVbWFQYWNrYWdlID0gKFVtYVBhY2thZ2VJbXBsKSAoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UKLQkJCQkuZ2V0RVBhY2thZ2UoZU5TX1VSSSkgaW5zdGFuY2VvZiBVbWFQYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFCi0JCQkJLmdldEVQYWNrYWdlKGVOU19VUkkpCi0JCQkJOiBuZXcgVW1hUGFja2FnZUltcGwoKSk7Ci0KLQkJaXNJbml0ZWQgPSB0cnVlOwotCi0JCS8vIENyZWF0ZSBwYWNrYWdlIG1ldGEtZGF0YSBvYmplY3RzCi0JCXRoZVVtYVBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBjcmVhdGVkIG1ldGEtZGF0YQotCQl0aGVVbWFQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQotCQkvLyBNYXJrIG1ldGEtZGF0YSB0byBpbmRpY2F0ZSBpdCBjYW4ndCBiZSBjaGFuZ2VkCi0JCXRoZVVtYVBhY2thZ2UuZnJlZXplKCk7Ci0KLQkJcmV0dXJuIHRoZVVtYVBhY2thZ2U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRDbGFzc2lmaWVyKCkgewotCQlyZXR1cm4gY2xhc3NpZmllckVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRDbGFzc2lmaWVyX0lzQWJzdHJhY3QoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgY2xhc3NpZmllckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIHR5cGVFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRFbGVtZW50KCkgewotCQlyZXR1cm4gZWxlbWVudEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldE5hbWVkRWxlbWVudCgpIHsKLQkJcmV0dXJuIG5hbWVkRWxlbWVudEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXROYW1lZEVsZW1lbnRfTmFtZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSBuYW1lZEVsZW1lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFBhY2thZ2VhYmxlRWxlbWVudCgpIHsKLQkJcmV0dXJuIHBhY2thZ2VhYmxlRWxlbWVudEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFBhY2thZ2UoKSB7Ci0JCXJldHVybiBwYWNrYWdlRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0TmFtZXNwYWNlKCkgewotCQlyZXR1cm4gbmFtZXNwYWNlRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0TWV0aG9kRWxlbWVudCgpIHsKLQkJcmV0dXJuIG1ldGhvZEVsZW1lbnRFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0TWV0aG9kRWxlbWVudF9HdWlkKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIG1ldGhvZEVsZW1lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRNZXRob2RFbGVtZW50X1ByZXNlbnRhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgbWV0aG9kRWxlbWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldE1ldGhvZEVsZW1lbnRfQnJpZWZEZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSBtZXRob2RFbGVtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0TWV0aG9kRWxlbWVudF9Pd25lZFJ1bGVzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIG1ldGhvZEVsZW1lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRNZXRob2RFbGVtZW50X01ldGhvZEVsZW1lbnRQcm9wZXJ0eSgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBtZXRob2RFbGVtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0TWV0aG9kRWxlbWVudF9LaW5kKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIG1ldGhvZEVsZW1lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRNZXRob2RFbGVtZW50X1N1cHByZXNzZWQoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgbWV0aG9kRWxlbWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDYpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldE1ldGhvZEVsZW1lbnRfT3JkZXJpbmdHdWlkZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSBtZXRob2RFbGVtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRDb25zdHJhaW50KCkgewotCQlyZXR1cm4gY29uc3RyYWludEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRDb25zdHJhaW50X0JvZHkoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgY29uc3RyYWludEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0TWV0aG9kRWxlbWVudFByb3BlcnR5KCkgewotCQlyZXR1cm4gbWV0aG9kRWxlbWVudFByb3BlcnR5RUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldE1ldGhvZEVsZW1lbnRQcm9wZXJ0eV9WYWx1ZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSBtZXRob2RFbGVtZW50UHJvcGVydHlFQ2xhc3MKLQkJCQkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldEtpbmQoKSB7Ci0JCXJldHVybiBraW5kRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEtpbmRfQXBwbGljYWJsZU1ldGFDbGFzc0luZm8oKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkga2luZEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0Q29udGVudEVsZW1lbnQoKSB7Ci0JCXJldHVybiBjb250ZW50RWxlbWVudEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRDb250ZW50RWxlbWVudF9TdXBwb3J0aW5nTWF0ZXJpYWxzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIGNvbnRlbnRFbGVtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKQotCQkJCS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0Q29udGVudEVsZW1lbnRfQ29uY2VwdHNBbmRQYXBlcnMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgY29udGVudEVsZW1lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpCi0JCQkJLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRDb250ZW50RWxlbWVudF9DaGVja2xpc3RzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIGNvbnRlbnRFbGVtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKQotCQkJCS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0Q29udGVudEVsZW1lbnRfR3VpZGVsaW5lcygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBjb250ZW50RWxlbWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkKLQkJCQkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldENvbnRlbnRFbGVtZW50X0V4YW1wbGVzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIGNvbnRlbnRFbGVtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKQotCQkJCS5nZXQoNCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0Q29udGVudEVsZW1lbnRfQXNzZXRzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIGNvbnRlbnRFbGVtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKQotCQkJCS5nZXQoNSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0Q29udGVudEVsZW1lbnRfVGVybWRlZmluaXRpb24oKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgY29udGVudEVsZW1lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpCi0JCQkJLmdldCg2KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldERlc2NyaWJhYmxlRWxlbWVudCgpIHsKLQkJcmV0dXJuIGRlc2NyaWJhYmxlRWxlbWVudEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXREZXNjcmliYWJsZUVsZW1lbnRfUHJlc2VudGF0aW9uKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIGRlc2NyaWJhYmxlRWxlbWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkKLQkJCQkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldERlc2NyaWJhYmxlRWxlbWVudF9TaGFwZWljb24oKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgZGVzY3JpYmFibGVFbGVtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKQotCQkJCS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RGVzY3JpYmFibGVFbGVtZW50X05vZGVpY29uKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIGRlc2NyaWJhYmxlRWxlbWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkKLQkJCQkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0Q29udGVudERlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gY29udGVudERlc2NyaXB0aW9uRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldENvbnRlbnREZXNjcmlwdGlvbl9NYWluRGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgY29udGVudERlc2NyaXB0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKQotCQkJCS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0Q29udGVudERlc2NyaXB0aW9uX1NlY3Rpb25zKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIGNvbnRlbnREZXNjcmlwdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkKLQkJCQkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldENvbnRlbnREZXNjcmlwdGlvbl9FeHRlcm5hbElkKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIGNvbnRlbnREZXNjcmlwdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkKLQkJCQkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldENvbnRlbnREZXNjcmlwdGlvbl9LZXlDb25zaWRlcmF0aW9ucygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSBjb250ZW50RGVzY3JpcHRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpCi0JCQkJLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRDb250ZW50RGVzY3JpcHRpb25fTG9uZ1ByZXNlbnRhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgY29udGVudERlc2NyaXB0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKQotCQkJCS5nZXQoNCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRTZWN0aW9uKCkgewotCQlyZXR1cm4gc2VjdGlvbkVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRTZWN0aW9uX1NlY3Rpb25OYW1lKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIHNlY3Rpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRTZWN0aW9uX1NlY3Rpb25EZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSBzZWN0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0U2VjdGlvbl9TdWJTZWN0aW9ucygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBzZWN0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0U2VjdGlvbl9QcmVkZWNlc3NvcigpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBzZWN0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRSb2xlKCkgewotCQlyZXR1cm4gcm9sZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRSb2xlX01vZGlmaWVzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIHJvbGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRSb2xlX1Jlc3BvbnNpYmxlRm9yKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIHJvbGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFdvcmtQcm9kdWN0KCkgewotCQlyZXR1cm4gd29ya1Byb2R1Y3RFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0V29ya1Byb2R1Y3RfUmVwb3J0cygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSB3b3JrUHJvZHVjdEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFdvcmtQcm9kdWN0X1RlbXBsYXRlcygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSB3b3JrUHJvZHVjdEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFdvcmtQcm9kdWN0X1Rvb2xNZW50b3JzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIHdvcmtQcm9kdWN0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0V29ya1Byb2R1Y3RfRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIHdvcmtQcm9kdWN0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRGdWxmaWxsYWJsZUVsZW1lbnQoKSB7Ci0JCXJldHVybiBmdWxmaWxsYWJsZUVsZW1lbnRFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0RnVsZmlsbGFibGVFbGVtZW50X0Z1bGZpbGxzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIGZ1bGZpbGxhYmxlRWxlbWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkKLQkJCQkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0VGFzaygpIHsKLQkJcmV0dXJuIHRhc2tFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0VGFza19QZXJmb3JtZWRCeSgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSB0YXNrRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0VGFza19NYW5kYXRvcnlJbnB1dCgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSB0YXNrRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0VGFza19PdXRwdXQoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgdGFza0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFRhc2tfQWRkaXRpb25hbGx5UGVyZm9ybWVkQnkoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgdGFza0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFRhc2tfT3B0aW9uYWxJbnB1dCgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSB0YXNrRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0VGFza19TdGVwcygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSB0YXNrRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0VGFza19Ub29sTWVudG9ycygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSB0YXNrRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0VGFza19Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgdGFza0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDcpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0V29ya0RlZmluaXRpb24oKSB7Ci0JCXJldHVybiB3b3JrRGVmaW5pdGlvbkVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRXb3JrRGVmaW5pdGlvbl9QcmVjb25kaXRpb24oKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgd29ya0RlZmluaXRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpCi0JCQkJLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRXb3JrRGVmaW5pdGlvbl9Qb3N0Y29uZGl0aW9uKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIHdvcmtEZWZpbml0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKQotCQkJCS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRTdGVwKCkgewotCQlyZXR1cm4gc3RlcEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldEd1aWRhbmNlKCkgewotCQlyZXR1cm4gZ3VpZGFuY2VFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRBcnRpZmFjdCgpIHsKLQkJcmV0dXJuIGFydGlmYWN0RUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEFydGlmYWN0X0NvbnRhaW5lckFydGlmYWN0KCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIGFydGlmYWN0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0QXJ0aWZhY3RfQ29udGFpbmVkQXJ0aWZhY3RzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIGFydGlmYWN0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXREZWxpdmVyYWJsZSgpIHsKLQkJcmV0dXJuIGRlbGl2ZXJhYmxlRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldERlbGl2ZXJhYmxlX0RlbGl2ZXJlZFdvcmtQcm9kdWN0cygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBkZWxpdmVyYWJsZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0T3V0Y29tZSgpIHsKLQkJcmV0dXJuIG91dGNvbWVFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRNZXRob2RQYWNrYWdlKCkgewotCQlyZXR1cm4gbWV0aG9kUGFja2FnZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRNZXRob2RQYWNrYWdlX0dsb2JhbCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSBtZXRob2RQYWNrYWdlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0TWV0aG9kUGFja2FnZV9SZXVzZWRQYWNrYWdlcygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBtZXRob2RQYWNrYWdlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0TWV0aG9kUGFja2FnZV9DaGlsZFBhY2thZ2VzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIG1ldGhvZFBhY2thZ2VFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldENvbnRlbnRQYWNrYWdlKCkgewotCQlyZXR1cm4gY29udGVudFBhY2thZ2VFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0Q29udGVudFBhY2thZ2VfQ29udGVudEVsZW1lbnRzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIGNvbnRlbnRQYWNrYWdlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKQotCQkJCS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRBcnRpZmFjdERlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gYXJ0aWZhY3REZXNjcmlwdGlvbkVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBcnRpZmFjdERlc2NyaXB0aW9uX0JyaWVmT3V0bGluZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSBhcnRpZmFjdERlc2NyaXB0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKQotCQkJCS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QXJ0aWZhY3REZXNjcmlwdGlvbl9SZXByZXNlbnRhdGlvbk9wdGlvbnMoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgYXJ0aWZhY3REZXNjcmlwdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkKLQkJCQkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEFydGlmYWN0RGVzY3JpcHRpb25fUmVwcmVzZW50YXRpb24oKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgYXJ0aWZhY3REZXNjcmlwdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkKLQkJCQkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEFydGlmYWN0RGVzY3JpcHRpb25fTm90YXRpb24oKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgYXJ0aWZhY3REZXNjcmlwdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkKLQkJCQkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0V29ya1Byb2R1Y3REZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIHdvcmtQcm9kdWN0RGVzY3JpcHRpb25FQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0V29ya1Byb2R1Y3REZXNjcmlwdGlvbl9QdXJwb3NlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIHdvcmtQcm9kdWN0RGVzY3JpcHRpb25FQ2xhc3MKLQkJCQkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRXb3JrUHJvZHVjdERlc2NyaXB0aW9uX0ltcGFjdE9mTm90SGF2aW5nKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIHdvcmtQcm9kdWN0RGVzY3JpcHRpb25FQ2xhc3MKLQkJCQkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRXb3JrUHJvZHVjdERlc2NyaXB0aW9uX1JlYXNvbnNGb3JOb3ROZWVkaW5nKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIHdvcmtQcm9kdWN0RGVzY3JpcHRpb25FQ2xhc3MKLQkJCQkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldERlbGl2ZXJhYmxlRGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBkZWxpdmVyYWJsZURlc2NyaXB0aW9uRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldERlbGl2ZXJhYmxlRGVzY3JpcHRpb25fRXh0ZXJuYWxEZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSBkZWxpdmVyYWJsZURlc2NyaXB0aW9uRUNsYXNzCi0JCQkJLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RGVsaXZlcmFibGVEZXNjcmlwdGlvbl9QYWNrYWdpbmdHdWlkYW5jZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSBkZWxpdmVyYWJsZURlc2NyaXB0aW9uRUNsYXNzCi0JCQkJLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRSb2xlRGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiByb2xlRGVzY3JpcHRpb25FQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0Um9sZURlc2NyaXB0aW9uX1NraWxscygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSByb2xlRGVzY3JpcHRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgKLQkJCQkwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRSb2xlRGVzY3JpcHRpb25fQXNzaWdubWVudEFwcHJvYWNoZXMoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgcm9sZURlc2NyaXB0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoCi0JCQkJMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0Um9sZURlc2NyaXB0aW9uX1N5bm9ueW1zKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIHJvbGVEZXNjcmlwdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KAotCQkJCTIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0VGFza0Rlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gdGFza0Rlc2NyaXB0aW9uRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhc2tEZXNjcmlwdGlvbl9QdXJwb3NlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIHRhc2tEZXNjcmlwdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KAotCQkJCTApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhc2tEZXNjcmlwdGlvbl9BbHRlcm5hdGl2ZXMoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgdGFza0Rlc2NyaXB0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoCi0JCQkJMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRHdWlkYW5jZURlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gZ3VpZGFuY2VEZXNjcmlwdGlvbkVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRHdWlkYW5jZURlc2NyaXB0aW9uX0F0dGFjaG1lbnRzKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIGd1aWRhbmNlRGVzY3JpcHRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpCi0JCQkJLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFByYWN0aWNlRGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBwcmFjdGljZURlc2NyaXB0aW9uRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByYWN0aWNlRGVzY3JpcHRpb25fQWRkaXRpb25hbEluZm8oKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgcHJhY3RpY2VEZXNjcmlwdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkKLQkJCQkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByYWN0aWNlRGVzY3JpcHRpb25fUHJvYmxlbSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSBwcmFjdGljZURlc2NyaXB0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKQotCQkJCS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJhY3RpY2VEZXNjcmlwdGlvbl9CYWNrZ3JvdW5kKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIHByYWN0aWNlRGVzY3JpcHRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpCi0JCQkJLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQcmFjdGljZURlc2NyaXB0aW9uX0dvYWxzKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIHByYWN0aWNlRGVzY3JpcHRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpCi0JCQkJLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQcmFjdGljZURlc2NyaXB0aW9uX0FwcGxpY2F0aW9uKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIHByYWN0aWNlRGVzY3JpcHRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpCi0JCQkJLmdldCg0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQcmFjdGljZURlc2NyaXB0aW9uX0xldmVsc09mQWRvcHRpb24oKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgcHJhY3RpY2VEZXNjcmlwdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkKLQkJCQkuZ2V0KDUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0QWN0aXZpdHkoKSB7Ci0JCXJldHVybiBhY3Rpdml0eUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRBY3Rpdml0eV9CcmVha2Rvd25FbGVtZW50cygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBhY3Rpdml0eUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEFjdGl2aXR5X1JvYWRtYXBzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIGFjdGl2aXR5RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRXb3JrQnJlYWtkb3duRWxlbWVudCgpIHsKLQkJcmV0dXJuIHdvcmtCcmVha2Rvd25FbGVtZW50RUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFdvcmtCcmVha2Rvd25FbGVtZW50X0lzUmVwZWF0YWJsZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSB3b3JrQnJlYWtkb3duRWxlbWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkKLQkJCQkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFdvcmtCcmVha2Rvd25FbGVtZW50X0lzT25nb2luZygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSB3b3JrQnJlYWtkb3duRWxlbWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkKLQkJCQkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFdvcmtCcmVha2Rvd25FbGVtZW50X0lzRXZlbnREcml2ZW4oKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgd29ya0JyZWFrZG93bkVsZW1lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpCi0JCQkJLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRXb3JrQnJlYWtkb3duRWxlbWVudF9MaW5rVG9QcmVkZWNlc3NvcigpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSB3b3JrQnJlYWtkb3duRWxlbWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkKLQkJCQkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0QnJlYWtkb3duRWxlbWVudCgpIHsKLQkJcmV0dXJuIGJyZWFrZG93bkVsZW1lbnRFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QnJlYWtkb3duRWxlbWVudF9QcmVmaXgoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgYnJlYWtkb3duRWxlbWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkKLQkJCQkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEJyZWFrZG93bkVsZW1lbnRfSXNQbGFubmVkKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIGJyZWFrZG93bkVsZW1lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpCi0JCQkJLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRCcmVha2Rvd25FbGVtZW50X0hhc011bHRpcGxlT2NjdXJyZW5jZXMoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgYnJlYWtkb3duRWxlbWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkKLQkJCQkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEJyZWFrZG93bkVsZW1lbnRfSXNPcHRpb25hbCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSBicmVha2Rvd25FbGVtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKQotCQkJCS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0QnJlYWtkb3duRWxlbWVudF9QcmVzZW50ZWRBZnRlcigpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBicmVha2Rvd25FbGVtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKQotCQkJCS5nZXQoNCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0QnJlYWtkb3duRWxlbWVudF9QcmVzZW50ZWRCZWZvcmUoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgYnJlYWtkb3duRWxlbWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkKLQkJCQkuZ2V0KDUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEJyZWFrZG93bkVsZW1lbnRfUGxhbm5pbmdEYXRhKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIGJyZWFrZG93bkVsZW1lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpCi0JCQkJLmdldCg2KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRCcmVha2Rvd25FbGVtZW50X1N1cGVyQWN0aXZpdGllcygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBicmVha2Rvd25FbGVtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKQotCQkJCS5nZXQoNyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0QnJlYWtkb3duRWxlbWVudF9DaGVja2xpc3RzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIGJyZWFrZG93bkVsZW1lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpCi0JCQkJLmdldCg4KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRCcmVha2Rvd25FbGVtZW50X0NvbmNlcHRzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIGJyZWFrZG93bkVsZW1lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpCi0JCQkJLmdldCg5KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRCcmVha2Rvd25FbGVtZW50X0V4YW1wbGVzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIGJyZWFrZG93bkVsZW1lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpCi0JCQkJLmdldCgxMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0QnJlYWtkb3duRWxlbWVudF9HdWlkZWxpbmVzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIGJyZWFrZG93bkVsZW1lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpCi0JCQkJLmdldCgxMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0QnJlYWtkb3duRWxlbWVudF9SZXVzYWJsZUFzc2V0cygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBicmVha2Rvd25FbGVtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKQotCQkJCS5nZXQoMTIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEJyZWFrZG93bkVsZW1lbnRfU3VwcG9ydGluZ01hdGVyaWFscygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBicmVha2Rvd25FbGVtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKQotCQkJCS5nZXQoMTMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEJyZWFrZG93bkVsZW1lbnRfVGVtcGxhdGVzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIGJyZWFrZG93bkVsZW1lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpCi0JCQkJLmdldCgxNCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0QnJlYWtkb3duRWxlbWVudF9SZXBvcnRzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIGJyZWFrZG93bkVsZW1lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpCi0JCQkJLmdldCgxNSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0QnJlYWtkb3duRWxlbWVudF9Fc3RpbWF0aW9uY29uc2lkZXJhdGlvbnMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgYnJlYWtkb3duRWxlbWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkKLQkJCQkuZ2V0KDE2KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRCcmVha2Rvd25FbGVtZW50X1Rvb2xtZW50b3IoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgYnJlYWtkb3duRWxlbWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkKLQkJCQkuZ2V0KDE3KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldE1pbGVzdG9uZSgpIHsKLQkJcmV0dXJuIG1pbGVzdG9uZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRNaWxlc3RvbmVfUmVxdWlyZWRSZXN1bHRzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIG1pbGVzdG9uZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0SXRlcmF0aW9uKCkgewotCQlyZXR1cm4gaXRlcmF0aW9uRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0UGhhc2UoKSB7Ci0JCXJldHVybiBwaGFzZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFRlYW1Qcm9maWxlKCkgewotCQlyZXR1cm4gdGVhbVByb2ZpbGVFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0VGVhbVByb2ZpbGVfVGVhbVJvbGVzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIHRlYW1Qcm9maWxlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0VGVhbVByb2ZpbGVfU3VwZXJUZWFtKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIHRlYW1Qcm9maWxlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0VGVhbVByb2ZpbGVfU3ViVGVhbSgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSB0ZWFtUHJvZmlsZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0Um9sZURlc2NyaXB0b3IoKSB7Ci0JCXJldHVybiByb2xlRGVzY3JpcHRvckVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRSb2xlRGVzY3JpcHRvcl9Sb2xlKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIHJvbGVEZXNjcmlwdG9yRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKQotCQkJCS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0Um9sZURlc2NyaXB0b3JfTW9kaWZpZXMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgcm9sZURlc2NyaXB0b3JFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpCi0JCQkJLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRSb2xlRGVzY3JpcHRvcl9SZXNwb25zaWJsZUZvcigpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSByb2xlRGVzY3JpcHRvckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkKLQkJCQkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0V29ya09yZGVyKCkgewotCQlyZXR1cm4gd29ya09yZGVyRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFdvcmtPcmRlcl9MaW5rVHlwZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSB3b3JrT3JkZXJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRXb3JrT3JkZXJfUHJlZCgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSB3b3JrT3JkZXJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFByb2Nlc3NFbGVtZW50KCkgewotCQlyZXR1cm4gcHJvY2Vzc0VsZW1lbnRFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRQbGFubmluZ0RhdGEoKSB7Ci0JCXJldHVybiBwbGFubmluZ0RhdGFFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UGxhbm5pbmdEYXRhX1N0YXJ0RGF0ZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSBwbGFubmluZ0RhdGFFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQbGFubmluZ0RhdGFfRmluaXNoRGF0ZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSBwbGFubmluZ0RhdGFFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQbGFubmluZ0RhdGFfUmFuaygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSBwbGFubmluZ0RhdGFFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldERlc2NyaXB0b3IoKSB7Ci0JCXJldHVybiBkZXNjcmlwdG9yRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldERlc2NyaXB0b3JfSXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIGRlc2NyaXB0b3JFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFRhc2tEZXNjcmlwdG9yKCkgewotCQlyZXR1cm4gdGFza0Rlc2NyaXB0b3JFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0VGFza0Rlc2NyaXB0b3JfVGFzaygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSB0YXNrRGVzY3JpcHRvckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkKLQkJCQkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFRhc2tEZXNjcmlwdG9yX0FkZGl0aW9uYWxseVBlcmZvcm1lZEJ5KCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIHRhc2tEZXNjcmlwdG9yRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKQotCQkJCS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0VGFza0Rlc2NyaXB0b3JfQXNzaXN0ZWRCeSgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSB0YXNrRGVzY3JpcHRvckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkKLQkJCQkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFRhc2tEZXNjcmlwdG9yX0V4dGVybmFsSW5wdXQoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgdGFza0Rlc2NyaXB0b3JFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpCi0JCQkJLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRUYXNrRGVzY3JpcHRvcl9NYW5kYXRvcnlJbnB1dCgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSB0YXNrRGVzY3JpcHRvckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkKLQkJCQkuZ2V0KDQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFRhc2tEZXNjcmlwdG9yX09wdGlvbmFsSW5wdXQoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgdGFza0Rlc2NyaXB0b3JFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpCi0JCQkJLmdldCg1KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRUYXNrRGVzY3JpcHRvcl9PdXRwdXQoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgdGFza0Rlc2NyaXB0b3JFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpCi0JCQkJLmdldCg2KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRUYXNrRGVzY3JpcHRvcl9QZXJmb3JtZWRQcmltYXJpbHlCeSgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSB0YXNrRGVzY3JpcHRvckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkKLQkJCQkuZ2V0KDcpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFRhc2tEZXNjcmlwdG9yX1NlbGVjdGVkU3RlcHMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgdGFza0Rlc2NyaXB0b3JFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpCi0JCQkJLmdldCg4KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcigpIHsKLQkJcmV0dXJuIHdvcmtQcm9kdWN0RGVzY3JpcHRvckVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JfQWN0aXZpdHlFbnRyeVN0YXRlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIHdvcmtQcm9kdWN0RGVzY3JpcHRvckVDbGFzcwotCQkJCS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9BY3Rpdml0eUV4aXRTdGF0ZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSB3b3JrUHJvZHVjdERlc2NyaXB0b3JFQ2xhc3MKLQkJCQkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JfV29ya1Byb2R1Y3QoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgd29ya1Byb2R1Y3REZXNjcmlwdG9yRUNsYXNzCi0JCQkJLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX0ltcGFjdGVkQnkoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgd29ya1Byb2R1Y3REZXNjcmlwdG9yRUNsYXNzCi0JCQkJLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX0ltcGFjdHMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgd29ya1Byb2R1Y3REZXNjcmlwdG9yRUNsYXNzCi0JCQkJLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX0RlbGl2ZXJhYmxlUGFydHMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgd29ya1Byb2R1Y3REZXNjcmlwdG9yRUNsYXNzCi0JCQkJLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRDb21wb3NpdGVSb2xlKCkgewotCQlyZXR1cm4gY29tcG9zaXRlUm9sZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRDb21wb3NpdGVSb2xlX0FnZ3JlZ2F0ZWRSb2xlcygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBjb21wb3NpdGVSb2xlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBicmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb25FQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uX1VzYWdlR3VpZGFuY2UoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgYnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uRUNsYXNzCi0JCQkJLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRBY3Rpdml0eURlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gYWN0aXZpdHlEZXNjcmlwdGlvbkVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBY3Rpdml0eURlc2NyaXB0aW9uX1B1cnBvc2UoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgYWN0aXZpdHlEZXNjcmlwdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkKLQkJCQkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEFjdGl2aXR5RGVzY3JpcHRpb25fQWx0ZXJuYXRpdmVzKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIGFjdGl2aXR5RGVzY3JpcHRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpCi0JCQkJLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBY3Rpdml0eURlc2NyaXB0aW9uX0hvd3RvU3RhZmYoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgYWN0aXZpdHlEZXNjcmlwdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkKLQkJCQkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBkZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbkVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXREZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl9TY2FsZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSBkZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbkVDbGFzcwotCQkJCS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX1Byb2plY3RDaGFyYWN0ZXJpc3RpY3MoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgZGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25FQ2xhc3MKLQkJCQkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXREZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl9SaXNrTGV2ZWwoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgZGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25FQ2xhc3MKLQkJCQkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXREZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl9Fc3RpbWF0aW5nVGVjaG5pcXVlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIGRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uRUNsYXNzCi0JCQkJLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fUHJvamVjdE1lbWJlckV4cGVydGlzZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSBkZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbkVDbGFzcwotCQkJCS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX1R5cGVPZkNvbnRyYWN0KCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIGRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uRUNsYXNzCi0JCQkJLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRQcm9jZXNzRGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBwcm9jZXNzRGVzY3JpcHRpb25FQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJvY2Vzc0Rlc2NyaXB0aW9uX1Njb3BlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIHByb2Nlc3NEZXNjcmlwdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkKLQkJCQkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByb2Nlc3NEZXNjcmlwdGlvbl9Vc2FnZU5vdGVzKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIHByb2Nlc3NEZXNjcmlwdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkKLQkJCQkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0RGVzY3JpcHRvckRlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gZGVzY3JpcHRvckRlc2NyaXB0aW9uRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldERlc2NyaXB0b3JEZXNjcmlwdGlvbl9SZWZpbmVkRGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgZGVzY3JpcHRvckRlc2NyaXB0aW9uRUNsYXNzCi0JCQkJLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRDb25jZXB0KCkgewotCQlyZXR1cm4gY29uY2VwdEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldENoZWNrbGlzdCgpIHsKLQkJcmV0dXJuIGNoZWNrbGlzdEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldEV4YW1wbGUoKSB7Ci0JCXJldHVybiBleGFtcGxlRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0R3VpZGVsaW5lKCkgewotCQlyZXR1cm4gZ3VpZGVsaW5lRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0RXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKCkgewotCQlyZXR1cm4gZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0UmVwb3J0KCkgewotCQlyZXR1cm4gcmVwb3J0RUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0VGVtcGxhdGUoKSB7Ci0JCXJldHVybiB0ZW1wbGF0ZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFN1cHBvcnRpbmdNYXRlcmlhbCgpIHsKLQkJcmV0dXJuIHN1cHBvcnRpbmdNYXRlcmlhbEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFRvb2xNZW50b3IoKSB7Ci0JCXJldHVybiB0b29sTWVudG9yRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0V2hpdGVwYXBlcigpIHsKLQkJcmV0dXJuIHdoaXRlcGFwZXJFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRUZXJtRGVmaW5pdGlvbigpIHsKLQkJcmV0dXJuIHRlcm1EZWZpbml0aW9uRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0QXBwbGljYWJsZU1ldGFDbGFzc0luZm8oKSB7Ci0JCXJldHVybiBhcHBsaWNhYmxlTWV0YUNsYXNzSW5mb0VDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBcHBsaWNhYmxlTWV0YUNsYXNzSW5mb19Jc1ByaW1hcnlFeHRlbnNpb24oKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgYXBwbGljYWJsZU1ldGFDbGFzc0luZm9FQ2xhc3MKLQkJCQkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFByYWN0aWNlKCkgewotCQlyZXR1cm4gcHJhY3RpY2VFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0UHJhY3RpY2VfU3ViUHJhY3RpY2VzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIHByYWN0aWNlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0UHJhY3RpY2VfQ29udGVudFJlZmVyZW5jZXMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgcHJhY3RpY2VFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRQcmFjdGljZV9BY3Rpdml0eVJlZmVyZW5jZXMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgcHJhY3RpY2VFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFJldXNhYmxlQXNzZXQoKSB7Ci0JCXJldHVybiByZXVzYWJsZUFzc2V0RUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0RGlzY2lwbGluZSgpIHsKLQkJcmV0dXJuIGRpc2NpcGxpbmVFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0RGlzY2lwbGluZV9UYXNrcygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBkaXNjaXBsaW5lRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0RGlzY2lwbGluZV9TdWJkaXNjaXBsaW5lKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIGRpc2NpcGxpbmVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXREaXNjaXBsaW5lX1JlZmVyZW5jZVdvcmtmbG93cygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBkaXNjaXBsaW5lRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRDb250ZW50Q2F0ZWdvcnkoKSB7Ci0JCXJldHVybiBjb250ZW50Q2F0ZWdvcnlFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRSb2xlU2V0KCkgewotCQlyZXR1cm4gcm9sZVNldEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRSb2xlU2V0X1JvbGVzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIHJvbGVTZXRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldERvbWFpbigpIHsKLQkJcmV0dXJuIGRvbWFpbkVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXREb21haW5fV29ya1Byb2R1Y3RzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIGRvbWFpbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldERvbWFpbl9TdWJkb21haW5zKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIGRvbWFpbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0V29ya1Byb2R1Y3RUeXBlKCkgewotCQlyZXR1cm4gd29ya1Byb2R1Y3RUeXBlRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFdvcmtQcm9kdWN0VHlwZV9Xb3JrUHJvZHVjdHMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgd29ya1Byb2R1Y3RUeXBlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoCi0JCQkJMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXREaXNjaXBsaW5lR3JvdXBpbmcoKSB7Ci0JCXJldHVybiBkaXNjaXBsaW5lR3JvdXBpbmdFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0RGlzY2lwbGluZUdyb3VwaW5nX0Rpc2NpcGxpbmVzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIGRpc2NpcGxpbmVHcm91cGluZ0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkKLQkJCQkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0VG9vbCgpIHsKLQkJcmV0dXJuIHRvb2xFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0VG9vbF9Ub29sTWVudG9ycygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSB0b29sRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRSb2xlU2V0R3JvdXBpbmcoKSB7Ci0JCXJldHVybiByb2xlU2V0R3JvdXBpbmdFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0Um9sZVNldEdyb3VwaW5nX1JvbGVTZXRzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIHJvbGVTZXRHcm91cGluZ0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KAotCQkJCTApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0Q3VzdG9tQ2F0ZWdvcnkoKSB7Ci0JCXJldHVybiBjdXN0b21DYXRlZ29yeUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRDdXN0b21DYXRlZ29yeV9DYXRlZ29yaXplZEVsZW1lbnRzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIGN1c3RvbUNhdGVnb3J5RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKQotCQkJCS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0Q3VzdG9tQ2F0ZWdvcnlfU3ViQ2F0ZWdvcmllcygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBjdXN0b21DYXRlZ29yeUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkKLQkJCQkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0RGVsaXZlcnlQcm9jZXNzKCkgewotCQlyZXR1cm4gZGVsaXZlcnlQcm9jZXNzRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldERlbGl2ZXJ5UHJvY2Vzc19FZHVjYXRpb25NYXRlcmlhbHMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgZGVsaXZlcnlQcm9jZXNzRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoCi0JCQkJMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0RGVsaXZlcnlQcm9jZXNzX0NvbW11bmljYXRpb25zTWF0ZXJpYWxzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIGRlbGl2ZXJ5UHJvY2Vzc0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KAotCQkJCTEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0UHJvY2VzcygpIHsKLQkJcmV0dXJuIHByb2Nlc3NFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0UHJvY2Vzc19JbmNsdWRlc1BhdHRlcm5zKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIHByb2Nlc3NFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRQcm9jZXNzX0RlZmF1bHRDb250ZXh0KCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIHByb2Nlc3NFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRQcm9jZXNzX1ZhbGlkQ29udGV4dCgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBwcm9jZXNzRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRDYXBhYmlsaXR5UGF0dGVybigpIHsKLQkJcmV0dXJuIGNhcGFiaWxpdHlQYXR0ZXJuRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0UHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUoKSB7Ci0JCXJldHVybiBwcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZV9CYXNlZE9uUHJvY2Vzc2VzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIHByb2Nlc3NQbGFubmluZ1RlbXBsYXRlRUNsYXNzCi0JCQkJLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRSb2FkbWFwKCkgewotCQlyZXR1cm4gcm9hZG1hcEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFByb2Nlc3NDb21wb25lbnQoKSB7Ci0JCXJldHVybiBwcm9jZXNzQ29tcG9uZW50RUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFByb2Nlc3NDb21wb25lbnRfSW50ZXJmYWNlcygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBwcm9jZXNzQ29tcG9uZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKQotCQkJCS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0UHJvY2Vzc0NvbXBvbmVudF9Qcm9jZXNzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIHByb2Nlc3NDb21wb25lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpCi0JCQkJLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFByb2Nlc3NQYWNrYWdlKCkgewotCQlyZXR1cm4gcHJvY2Vzc1BhY2thZ2VFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0UHJvY2Vzc1BhY2thZ2VfUHJvY2Vzc0VsZW1lbnRzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIHByb2Nlc3NQYWNrYWdlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKQotCQkJCS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0UHJvY2Vzc1BhY2thZ2VfRGlhZ3JhbXMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgcHJvY2Vzc1BhY2thZ2VFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpCi0JCQkJLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UoKSB7Ci0JCXJldHVybiBwcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VfSW50ZXJmYWNlU3BlY2lmaWNhdGlvbnMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgcHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZUVDbGFzcwotCQkJCS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VfSW50ZXJmYWNlSU8oKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgcHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZUVDbGFzcwotCQkJCS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0UHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3IoKSB7Ci0JCXJldHVybiBwcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvckVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRQcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvcl9fcHJvY2Vzc0NvbXBvbmVudCgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBwcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvckVDbGFzcwotCQkJCS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0TWV0aG9kUGx1Z2luKCkgewotCQlyZXR1cm4gbWV0aG9kUGx1Z2luRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldE1ldGhvZFBsdWdpbl9Vc2VyQ2hhbmdlYWJsZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSBtZXRob2RQbHVnaW5FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRNZXRob2RQbHVnaW5fTWV0aG9kUGFja2FnZXMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgbWV0aG9kUGx1Z2luRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0TWV0aG9kUGx1Z2luX0Jhc2VzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIG1ldGhvZFBsdWdpbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldE1ldGhvZFBsdWdpbl9TdXBwb3J0aW5nKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIG1ldGhvZFBsdWdpbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0VmFyaWFiaWxpdHlFbGVtZW50KCkgewotCQlyZXR1cm4gdmFyaWFiaWxpdHlFbGVtZW50RUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFZhcmlhYmlsaXR5RWxlbWVudF9WYXJpYWJpbGl0eVR5cGUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgdmFyaWFiaWxpdHlFbGVtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKQotCQkJCS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0VmFyaWFiaWxpdHlFbGVtZW50X1ZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgdmFyaWFiaWxpdHlFbGVtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKQotCQkJCS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRNZXRob2RVbml0KCkgewotCQlyZXR1cm4gbWV0aG9kVW5pdEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRNZXRob2RVbml0X0F1dGhvcnMoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgbWV0aG9kVW5pdEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldE1ldGhvZFVuaXRfQ2hhbmdlRGF0ZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSBtZXRob2RVbml0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0TWV0aG9kVW5pdF9DaGFuZ2VEZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSBtZXRob2RVbml0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0TWV0aG9kVW5pdF9WZXJzaW9uKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIG1ldGhvZFVuaXRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRNZXRob2RVbml0X0NvcHlyaWdodFN0YXRlbWVudCgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBtZXRob2RVbml0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRNZXRob2RDb25maWd1cmF0aW9uKCkgewotCQlyZXR1cm4gbWV0aG9kQ29uZmlndXJhdGlvbkVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRNZXRob2RDb25maWd1cmF0aW9uX01ldGhvZFBsdWdpblNlbGVjdGlvbigpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBtZXRob2RDb25maWd1cmF0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKQotCQkJCS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0TWV0aG9kQ29uZmlndXJhdGlvbl9NZXRob2RQYWNrYWdlU2VsZWN0aW9uKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIG1ldGhvZENvbmZpZ3VyYXRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpCi0JCQkJLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRNZXRob2RDb25maWd1cmF0aW9uX1Byb2Nlc3NWaWV3cygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBtZXRob2RDb25maWd1cmF0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKQotCQkJCS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0TWV0aG9kQ29uZmlndXJhdGlvbl9EZWZhdWx0VmlldygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBtZXRob2RDb25maWd1cmF0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKQotCQkJCS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0TWV0aG9kQ29uZmlndXJhdGlvbl9CYXNlQ29uZmlndXJhdGlvbnMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgbWV0aG9kQ29uZmlndXJhdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkKLQkJCQkuZ2V0KDQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldE1ldGhvZENvbmZpZ3VyYXRpb25fU3VidHJhY3RlZENhdGVnb3J5KCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIG1ldGhvZENvbmZpZ3VyYXRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpCi0JCQkJLmdldCg1KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRNZXRob2RDb25maWd1cmF0aW9uX0FkZGVkQ2F0ZWdvcnkoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgbWV0aG9kQ29uZmlndXJhdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkKLQkJCQkuZ2V0KDYpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0UHJvY2Vzc0ZhbWlseSgpIHsKLQkJcmV0dXJuIHByb2Nlc3NGYW1pbHlFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0UHJvY2Vzc0ZhbWlseV9EZWxpdmVyeVByb2Nlc3NlcygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBwcm9jZXNzRmFtaWx5RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRNZXRob2RMaWJyYXJ5KCkgewotCQlyZXR1cm4gbWV0aG9kTGlicmFyeUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRNZXRob2RMaWJyYXJ5X01ldGhvZFBsdWdpbnMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgbWV0aG9kTGlicmFyeUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldE1ldGhvZExpYnJhcnlfUHJlZGVmaW5lZENvbmZpZ3VyYXRpb25zKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIG1ldGhvZExpYnJhcnlFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFBvaW50KCkgewotCQlyZXR1cm4gcG9pbnRFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UG9pbnRfWCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSBwb2ludEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFBvaW50X1koKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgcG9pbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldEdyYXBoRWxlbWVudCgpIHsKLQkJcmV0dXJuIGdyYXBoRWxlbWVudEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRHcmFwaEVsZW1lbnRfUG9zaXRpb24oKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgZ3JhcGhFbGVtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0R3JhcGhFbGVtZW50X0NvbnRhaW5lZCgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBncmFwaEVsZW1lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRHcmFwaEVsZW1lbnRfTGluaygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBncmFwaEVsZW1lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRHcmFwaEVsZW1lbnRfQW5jaG9yYWdlKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIGdyYXBoRWxlbWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEdyYXBoRWxlbWVudF9TZW1hbnRpY01vZGVsKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIGdyYXBoRWxlbWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0RGlhZ3JhbUVsZW1lbnQoKSB7Ci0JCXJldHVybiBkaWFncmFtRWxlbWVudEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXREaWFncmFtRWxlbWVudF9Jc1Zpc2libGUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgZGlhZ3JhbUVsZW1lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpCi0JCQkJLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXREaWFncmFtRWxlbWVudF9Db250YWluZXIoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgZGlhZ3JhbUVsZW1lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpCi0JCQkJLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXREaWFncmFtRWxlbWVudF9SZWZlcmVuY2UoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgZGlhZ3JhbUVsZW1lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpCi0JCQkJLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXREaWFncmFtRWxlbWVudF9Qcm9wZXJ0eSgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBkaWFncmFtRWxlbWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkKLQkJCQkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0RGlhZ3JhbUxpbmsoKSB7Ci0JCXJldHVybiBkaWFncmFtTGlua0VDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXREaWFncmFtTGlua19ab29tKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIGRpYWdyYW1MaW5rRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0RGlhZ3JhbUxpbmtfVmlld3BvcnQoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgZGlhZ3JhbUxpbmtFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXREaWFncmFtTGlua19HcmFwaEVsZW1lbnQoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgZGlhZ3JhbUxpbmtFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXREaWFncmFtTGlua19EaWFncmFtKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIGRpYWdyYW1MaW5rRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRHcmFwaENvbm5lY3RvcigpIHsKLQkJcmV0dXJuIGdyYXBoQ29ubmVjdG9yRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEdyYXBoQ29ubmVjdG9yX0dyYXBoRWxlbWVudCgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBncmFwaENvbm5lY3RvckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkKLQkJCQkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEdyYXBoQ29ubmVjdG9yX0dyYXBoRWRnZSgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBncmFwaENvbm5lY3RvckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkKLQkJCQkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0U2VtYW50aWNNb2RlbEJyaWRnZSgpIHsKLQkJcmV0dXJuIHNlbWFudGljTW9kZWxCcmlkZ2VFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0U2VtYW50aWNNb2RlbEJyaWRnZV9QcmVzZW50YXRpb24oKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgc2VtYW50aWNNb2RlbEJyaWRnZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkKLQkJCQkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFNlbWFudGljTW9kZWxCcmlkZ2VfR3JhcGhFbGVtZW50KCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIHNlbWFudGljTW9kZWxCcmlkZ2VFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpCi0JCQkJLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRTZW1hbnRpY01vZGVsQnJpZGdlX0RpYWdyYW0oKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgc2VtYW50aWNNb2RlbEJyaWRnZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkKLQkJCQkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0RGltZW5zaW9uKCkgewotCQlyZXR1cm4gZGltZW5zaW9uRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldERpbWVuc2lvbl9XaWR0aCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSBkaW1lbnNpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXREaW1lbnNpb25fSGVpZ2h0KCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIGRpbWVuc2lvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0UmVmZXJlbmNlKCkgewotCQlyZXR1cm4gcmVmZXJlbmNlRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFJlZmVyZW5jZV9Jc0luZGl2aWR1YWxSZXByZXNlbnRhdGlvbigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSByZWZlcmVuY2VFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRSZWZlcmVuY2VfUmVmZXJlbmNlZCgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSByZWZlcmVuY2VFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFByb3BlcnR5KCkgewotCQlyZXR1cm4gcHJvcGVydHlFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJvcGVydHlfS2V5KCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIHByb3BlcnR5RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJvcGVydHlfVmFsdWUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgcHJvcGVydHlFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldEdyYXBoRWRnZSgpIHsKLQkJcmV0dXJuIGdyYXBoRWRnZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRHcmFwaEVkZ2VfQW5jaG9yKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIGdyYXBoRWRnZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEdyYXBoRWRnZV9XYXlwb2ludHMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgZ3JhcGhFZGdlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXREaWFncmFtKCkgewotCQlyZXR1cm4gZGlhZ3JhbUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXREaWFncmFtX1pvb20oKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgZGlhZ3JhbUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldERpYWdyYW1fVmlld3BvaW50KCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIGRpYWdyYW1FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXREaWFncmFtX0RpYWdyYW1MaW5rKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIGRpYWdyYW1FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXREaWFncmFtX05hbWVzcGFjZSgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBkaWFncmFtRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRHcmFwaE5vZGUoKSB7Ci0JCXJldHVybiBncmFwaE5vZGVFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0R3JhcGhOb2RlX1NpemUoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgZ3JhcGhOb2RlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRTaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudCgpIHsKLQkJcmV0dXJuIHNpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50RUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFNpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50X1R5cGVJbmZvKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIHNpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50RUNsYXNzCi0JCQkJLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRVTUFTZW1hbnRpY01vZGVsQnJpZGdlKCkgewotCQlyZXR1cm4gdW1hU2VtYW50aWNNb2RlbEJyaWRnZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRVTUFTZW1hbnRpY01vZGVsQnJpZGdlX0VsZW1lbnQoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgdW1hU2VtYW50aWNNb2RlbEJyaWRnZUVDbGFzcwotCQkJCS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0Q29yZVNlbWFudGljTW9kZWxCcmlkZ2UoKSB7Ci0JCXJldHVybiBjb3JlU2VtYW50aWNNb2RlbEJyaWRnZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRDb3JlU2VtYW50aWNNb2RlbEJyaWRnZV9FbGVtZW50KCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIGNvcmVTZW1hbnRpY01vZGVsQnJpZGdlRUNsYXNzCi0JCQkJLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRMZWFmRWxlbWVudCgpIHsKLQkJcmV0dXJuIGxlYWZFbGVtZW50RUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0VGV4dEVsZW1lbnQoKSB7Ci0JCXJldHVybiB0ZXh0RWxlbWVudEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUZXh0RWxlbWVudF9UZXh0KCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIHRleHRFbGVtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRJbWFnZSgpIHsKLQkJcmV0dXJuIGltYWdlRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEltYWdlX1VyaSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSBpbWFnZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEltYWdlX01pbWVUeXBlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIGltYWdlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRHcmFwaGljUHJpbWl0aXZlKCkgewotCQlyZXR1cm4gZ3JhcGhpY1ByaW1pdGl2ZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFBvbHlsaW5lKCkgewotCQlyZXR1cm4gcG9seWxpbmVFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UG9seWxpbmVfQ2xvc2VkKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIHBvbHlsaW5lRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0UG9seWxpbmVfV2F5cG9pbnRzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIHBvbHlsaW5lRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRFbGxpcHNlKCkgewotCQlyZXR1cm4gZWxsaXBzZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRFbGxpcHNlX1JhZGl1c1goKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgZWxsaXBzZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEVsbGlwc2VfUmFkaXVzWSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSBlbGxpcHNlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RWxsaXBzZV9Sb3RhdGlvbigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSBlbGxpcHNlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RWxsaXBzZV9TdGFydEFuZ2xlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIGVsbGlwc2VFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRFbGxpcHNlX0VuZEFuZ2xlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIGVsbGlwc2VFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRFbGxpcHNlX0NlbnRlcigpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBlbGxpcHNlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVFbnVtIGdldFdvcmtPcmRlclR5cGUoKSB7Ci0JCXJldHVybiB3b3JrT3JkZXJUeXBlRUVudW07Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVFbnVtIGdldFZhcmlhYmlsaXR5VHlwZSgpIHsKLQkJcmV0dXJuIHZhcmlhYmlsaXR5VHlwZUVFbnVtOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0RGF0ZSgpIHsKLQkJcmV0dXJuIGRhdGVFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXRVcmkoKSB7Ci0JCXJldHVybiB1cmlFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXRTdHJpbmcoKSB7Ci0JCXJldHVybiBzdHJpbmdFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXRCb29sZWFuKCkgewotCQlyZXR1cm4gYm9vbGVhbkVEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldFNldCgpIHsKLQkJcmV0dXJuIHNldEVEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldFNlcXVlbmNlKCkgewotCQlyZXR1cm4gc2VxdWVuY2VFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXRJbnRlZ2VyKCkgewotCQlyZXR1cm4gaW50ZWdlckVEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldERvdWJsZSgpIHsKLQkJcmV0dXJuIGRvdWJsZUVEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVW1hRmFjdG9yeSBnZXRVbWFGYWN0b3J5KCkgewotCQlyZXR1cm4gKFVtYUZhY3RvcnkpIGdldEVGYWN0b3J5SW5zdGFuY2UoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNDcmVhdGVkID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBtZXRhLW1vZGVsIG9iamVjdHMgZm9yIHRoZSBwYWNrYWdlLiAgVGhpcyBtZXRob2QgaXMKLQkgKiBndWFyZGVkIHRvIGhhdmUgbm8gYWZmZWN0IG9uIGFueSBpbnZvY2F0aW9uIGJ1dCBpdHMgZmlyc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlUGFja2FnZUNvbnRlbnRzKCkgewotCQlpZiAoaXNDcmVhdGVkKQotCQkJcmV0dXJuOwotCQlpc0NyZWF0ZWQgPSB0cnVlOwotCi0JCS8vIENyZWF0ZSBjbGFzc2VzIGFuZCB0aGVpciBmZWF0dXJlcwotCQljbGFzc2lmaWVyRUNsYXNzID0gY3JlYXRlRUNsYXNzKENMQVNTSUZJRVIpOwotCQljcmVhdGVFQXR0cmlidXRlKGNsYXNzaWZpZXJFQ2xhc3MsIENMQVNTSUZJRVJfX0lTX0FCU1RSQUNUKTsKLQotCQl0eXBlRUNsYXNzID0gY3JlYXRlRUNsYXNzKFRZUEUpOwotCi0JCXBhY2thZ2VhYmxlRWxlbWVudEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhQQUNLQUdFQUJMRV9FTEVNRU5UKTsKLQotCQluYW1lZEVsZW1lbnRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoTkFNRURfRUxFTUVOVCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUobmFtZWRFbGVtZW50RUNsYXNzLCBOQU1FRF9FTEVNRU5UX19OQU1FKTsKLQotCQllbGVtZW50RUNsYXNzID0gY3JlYXRlRUNsYXNzKEVMRU1FTlQpOwotCi0JCXBhY2thZ2VFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUEFDS0FHRSk7Ci0KLQkJbmFtZXNwYWNlRUNsYXNzID0gY3JlYXRlRUNsYXNzKE5BTUVTUEFDRSk7Ci0KLQkJY29uc3RyYWludEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhDT05TVFJBSU5UKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShjb25zdHJhaW50RUNsYXNzLCBDT05TVFJBSU5UX19CT0RZKTsKLQotCQltZXRob2RFbGVtZW50RUNsYXNzID0gY3JlYXRlRUNsYXNzKE1FVEhPRF9FTEVNRU5UKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShtZXRob2RFbGVtZW50RUNsYXNzLCBNRVRIT0RfRUxFTUVOVF9fR1VJRCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUobWV0aG9kRWxlbWVudEVDbGFzcywgTUVUSE9EX0VMRU1FTlRfX1BSRVNFTlRBVElPTl9OQU1FKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShtZXRob2RFbGVtZW50RUNsYXNzLCBNRVRIT0RfRUxFTUVOVF9fQlJJRUZfREVTQ1JJUFRJT04pOwotCQljcmVhdGVFUmVmZXJlbmNlKG1ldGhvZEVsZW1lbnRFQ2xhc3MsIE1FVEhPRF9FTEVNRU5UX19PV05FRF9SVUxFUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UobWV0aG9kRWxlbWVudEVDbGFzcywKLQkJCQlNRVRIT0RfRUxFTUVOVF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkpOwotCQljcmVhdGVFUmVmZXJlbmNlKG1ldGhvZEVsZW1lbnRFQ2xhc3MsIE1FVEhPRF9FTEVNRU5UX19LSU5EKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShtZXRob2RFbGVtZW50RUNsYXNzLCBNRVRIT0RfRUxFTUVOVF9fU1VQUFJFU1NFRCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUobWV0aG9kRWxlbWVudEVDbGFzcywgTUVUSE9EX0VMRU1FTlRfX09SREVSSU5HX0dVSURFKTsKLQotCQltZXRob2RFbGVtZW50UHJvcGVydHlFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkpOwotCQljcmVhdGVFQXR0cmlidXRlKG1ldGhvZEVsZW1lbnRQcm9wZXJ0eUVDbGFzcywKLQkJCQlNRVRIT0RfRUxFTUVOVF9QUk9QRVJUWV9fVkFMVUUpOwotCi0JCWtpbmRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoS0lORCk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2Uoa2luZEVDbGFzcywgS0lORF9fQVBQTElDQUJMRV9NRVRBX0NMQVNTX0lORk8pOwotCi0JCWNvbnRlbnRFbGVtZW50RUNsYXNzID0gY3JlYXRlRUNsYXNzKENPTlRFTlRfRUxFTUVOVCk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoY29udGVudEVsZW1lbnRFQ2xhc3MsCi0JCQkJQ09OVEVOVF9FTEVNRU5UX19TVVBQT1JUSU5HX01BVEVSSUFMUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoY29udGVudEVsZW1lbnRFQ2xhc3MsCi0JCQkJQ09OVEVOVF9FTEVNRU5UX19DT05DRVBUU19BTkRfUEFQRVJTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShjb250ZW50RWxlbWVudEVDbGFzcywgQ09OVEVOVF9FTEVNRU5UX19DSEVDS0xJU1RTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShjb250ZW50RWxlbWVudEVDbGFzcywgQ09OVEVOVF9FTEVNRU5UX19HVUlERUxJTkVTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShjb250ZW50RWxlbWVudEVDbGFzcywgQ09OVEVOVF9FTEVNRU5UX19FWEFNUExFUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoY29udGVudEVsZW1lbnRFQ2xhc3MsIENPTlRFTlRfRUxFTUVOVF9fQVNTRVRTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShjb250ZW50RWxlbWVudEVDbGFzcywgQ09OVEVOVF9FTEVNRU5UX19URVJNREVGSU5JVElPTik7Ci0KLQkJZGVzY3JpYmFibGVFbGVtZW50RUNsYXNzID0gY3JlYXRlRUNsYXNzKERFU0NSSUJBQkxFX0VMRU1FTlQpOwotCQljcmVhdGVFUmVmZXJlbmNlKGRlc2NyaWJhYmxlRWxlbWVudEVDbGFzcywKLQkJCQlERVNDUklCQUJMRV9FTEVNRU5UX19QUkVTRU5UQVRJT04pOwotCQljcmVhdGVFQXR0cmlidXRlKGRlc2NyaWJhYmxlRWxlbWVudEVDbGFzcywKLQkJCQlERVNDUklCQUJMRV9FTEVNRU5UX19TSEFQRUlDT04pOwotCQljcmVhdGVFQXR0cmlidXRlKGRlc2NyaWJhYmxlRWxlbWVudEVDbGFzcywKLQkJCQlERVNDUklCQUJMRV9FTEVNRU5UX19OT0RFSUNPTik7Ci0KLQkJY29udGVudERlc2NyaXB0aW9uRUNsYXNzID0gY3JlYXRlRUNsYXNzKENPTlRFTlRfREVTQ1JJUFRJT04pOwotCQljcmVhdGVFQXR0cmlidXRlKGNvbnRlbnREZXNjcmlwdGlvbkVDbGFzcywKLQkJCQlDT05URU5UX0RFU0NSSVBUSU9OX19NQUlOX0RFU0NSSVBUSU9OKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShjb250ZW50RGVzY3JpcHRpb25FQ2xhc3MsCi0JCQkJQ09OVEVOVF9ERVNDUklQVElPTl9fU0VDVElPTlMpOwotCQljcmVhdGVFQXR0cmlidXRlKGNvbnRlbnREZXNjcmlwdGlvbkVDbGFzcywKLQkJCQlDT05URU5UX0RFU0NSSVBUSU9OX19FWFRFUk5BTF9JRCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoY29udGVudERlc2NyaXB0aW9uRUNsYXNzLAotCQkJCUNPTlRFTlRfREVTQ1JJUFRJT05fX0tFWV9DT05TSURFUkFUSU9OUyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoY29udGVudERlc2NyaXB0aW9uRUNsYXNzLAotCQkJCUNPTlRFTlRfREVTQ1JJUFRJT05fX0xPTkdfUFJFU0VOVEFUSU9OX05BTUUpOwotCi0JCW1ldGhvZFVuaXRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoTUVUSE9EX1VOSVQpOwotCQljcmVhdGVFQXR0cmlidXRlKG1ldGhvZFVuaXRFQ2xhc3MsIE1FVEhPRF9VTklUX19BVVRIT1JTKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShtZXRob2RVbml0RUNsYXNzLCBNRVRIT0RfVU5JVF9fQ0hBTkdFX0RBVEUpOwotCQljcmVhdGVFQXR0cmlidXRlKG1ldGhvZFVuaXRFQ2xhc3MsIE1FVEhPRF9VTklUX19DSEFOR0VfREVTQ1JJUFRJT04pOwotCQljcmVhdGVFQXR0cmlidXRlKG1ldGhvZFVuaXRFQ2xhc3MsIE1FVEhPRF9VTklUX19WRVJTSU9OKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShtZXRob2RVbml0RUNsYXNzLCBNRVRIT0RfVU5JVF9fQ09QWVJJR0hUX1NUQVRFTUVOVCk7Ci0KLQkJc3VwcG9ydGluZ01hdGVyaWFsRUNsYXNzID0gY3JlYXRlRUNsYXNzKFNVUFBPUlRJTkdfTUFURVJJQUwpOwotCi0JCWd1aWRhbmNlRUNsYXNzID0gY3JlYXRlRUNsYXNzKEdVSURBTkNFKTsKLQotCQlzZWN0aW9uRUNsYXNzID0gY3JlYXRlRUNsYXNzKFNFQ1RJT04pOwotCQljcmVhdGVFQXR0cmlidXRlKHNlY3Rpb25FQ2xhc3MsIFNFQ1RJT05fX1NFQ1RJT05fTkFNRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoc2VjdGlvbkVDbGFzcywgU0VDVElPTl9fU0VDVElPTl9ERVNDUklQVElPTik7Ci0JCWNyZWF0ZUVSZWZlcmVuY2Uoc2VjdGlvbkVDbGFzcywgU0VDVElPTl9fU1VCX1NFQ1RJT05TKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShzZWN0aW9uRUNsYXNzLCBTRUNUSU9OX19QUkVERUNFU1NPUik7Ci0KLQkJdmFyaWFiaWxpdHlFbGVtZW50RUNsYXNzID0gY3JlYXRlRUNsYXNzKFZBUklBQklMSVRZX0VMRU1FTlQpOwotCQljcmVhdGVFQXR0cmlidXRlKHZhcmlhYmlsaXR5RWxlbWVudEVDbGFzcywKLQkJCQlWQVJJQUJJTElUWV9FTEVNRU5UX19WQVJJQUJJTElUWV9UWVBFKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh2YXJpYWJpbGl0eUVsZW1lbnRFQ2xhc3MsCi0JCQkJVkFSSUFCSUxJVFlfRUxFTUVOVF9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVCk7Ci0KLQkJY29uY2VwdEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhDT05DRVBUKTsKLQotCQljaGVja2xpc3RFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoQ0hFQ0tMSVNUKTsKLQotCQlndWlkZWxpbmVFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoR1VJREVMSU5FKTsKLQotCQlleGFtcGxlRUNsYXNzID0gY3JlYXRlRUNsYXNzKEVYQU1QTEUpOwotCi0JCXJldXNhYmxlQXNzZXRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUkVVU0FCTEVfQVNTRVQpOwotCi0JCXRlcm1EZWZpbml0aW9uRUNsYXNzID0gY3JlYXRlRUNsYXNzKFRFUk1fREVGSU5JVElPTik7Ci0KLQkJYXBwbGljYWJsZU1ldGFDbGFzc0luZm9FQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoQVBQTElDQUJMRV9NRVRBX0NMQVNTX0lORk8pOwotCQljcmVhdGVFQXR0cmlidXRlKGFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvRUNsYXNzLAotCQkJCUFQUExJQ0FCTEVfTUVUQV9DTEFTU19JTkZPX19JU19QUklNQVJZX0VYVEVOU0lPTik7Ci0KLQkJYXJ0aWZhY3RFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoQVJUSUZBQ1QpOwotCQljcmVhdGVFUmVmZXJlbmNlKGFydGlmYWN0RUNsYXNzLCBBUlRJRkFDVF9fQ09OVEFJTkVSX0FSVElGQUNUKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShhcnRpZmFjdEVDbGFzcywgQVJUSUZBQ1RfX0NPTlRBSU5FRF9BUlRJRkFDVFMpOwotCi0JCXdvcmtQcm9kdWN0RUNsYXNzID0gY3JlYXRlRUNsYXNzKFdPUktfUFJPRFVDVCk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2Uod29ya1Byb2R1Y3RFQ2xhc3MsIFdPUktfUFJPRFVDVF9fUkVQT1JUUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2Uod29ya1Byb2R1Y3RFQ2xhc3MsIFdPUktfUFJPRFVDVF9fVEVNUExBVEVTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh3b3JrUHJvZHVjdEVDbGFzcywgV09SS19QUk9EVUNUX19UT09MX01FTlRPUlMpOwotCQljcmVhdGVFUmVmZXJlbmNlKHdvcmtQcm9kdWN0RUNsYXNzLAotCQkJCVdPUktfUFJPRFVDVF9fRVNUSU1BVElPTl9DT05TSURFUkFUSU9OUyk7Ci0KLQkJZnVsZmlsbGFibGVFbGVtZW50RUNsYXNzID0gY3JlYXRlRUNsYXNzKEZVTEZJTExBQkxFX0VMRU1FTlQpOwotCQljcmVhdGVFUmVmZXJlbmNlKGZ1bGZpbGxhYmxlRWxlbWVudEVDbGFzcywKLQkJCQlGVUxGSUxMQUJMRV9FTEVNRU5UX19GVUxGSUxMUyk7Ci0KLQkJcmVwb3J0RUNsYXNzID0gY3JlYXRlRUNsYXNzKFJFUE9SVCk7Ci0KLQkJdGVtcGxhdGVFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoVEVNUExBVEUpOwotCi0JCXRvb2xNZW50b3JFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoVE9PTF9NRU5UT1IpOwotCi0JCWVzdGltYXRpb25Db25zaWRlcmF0aW9uc0VDbGFzcyA9IGNyZWF0ZUVDbGFzcyhFU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TKTsKLQotCQlkZWxpdmVyYWJsZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhERUxJVkVSQUJMRSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZGVsaXZlcmFibGVFQ2xhc3MsCi0JCQkJREVMSVZFUkFCTEVfX0RFTElWRVJFRF9XT1JLX1BST0RVQ1RTKTsKLQotCQlvdXRjb21lRUNsYXNzID0gY3JlYXRlRUNsYXNzKE9VVENPTUUpOwotCi0JCXN0ZXBFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoU1RFUCk7Ci0KLQkJd29ya0RlZmluaXRpb25FQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoV09SS19ERUZJTklUSU9OKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh3b3JrRGVmaW5pdGlvbkVDbGFzcywgV09SS19ERUZJTklUSU9OX19QUkVDT05ESVRJT04pOwotCQljcmVhdGVFUmVmZXJlbmNlKHdvcmtEZWZpbml0aW9uRUNsYXNzLCBXT1JLX0RFRklOSVRJT05fX1BPU1RDT05ESVRJT04pOwotCi0JCXdoaXRlcGFwZXJFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoV0hJVEVQQVBFUik7Ci0KLQkJdGFza0VDbGFzcyA9IGNyZWF0ZUVDbGFzcyhUQVNLKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh0YXNrRUNsYXNzLCBUQVNLX19QRVJGT1JNRURfQlkpOwotCQljcmVhdGVFUmVmZXJlbmNlKHRhc2tFQ2xhc3MsIFRBU0tfX01BTkRBVE9SWV9JTlBVVCk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UodGFza0VDbGFzcywgVEFTS19fT1VUUFVUKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh0YXNrRUNsYXNzLCBUQVNLX19BRERJVElPTkFMTFlfUEVSRk9STUVEX0JZKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh0YXNrRUNsYXNzLCBUQVNLX19PUFRJT05BTF9JTlBVVCk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UodGFza0VDbGFzcywgVEFTS19fU1RFUFMpOwotCQljcmVhdGVFUmVmZXJlbmNlKHRhc2tFQ2xhc3MsIFRBU0tfX1RPT0xfTUVOVE9SUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UodGFza0VDbGFzcywgVEFTS19fRVNUSU1BVElPTl9DT05TSURFUkFUSU9OUyk7Ci0KLQkJcm9sZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhST0xFKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShyb2xlRUNsYXNzLCBST0xFX19NT0RJRklFUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2Uocm9sZUVDbGFzcywgUk9MRV9fUkVTUE9OU0lCTEVfRk9SKTsKLQotCQlhcnRpZmFjdERlc2NyaXB0aW9uRUNsYXNzID0gY3JlYXRlRUNsYXNzKEFSVElGQUNUX0RFU0NSSVBUSU9OKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShhcnRpZmFjdERlc2NyaXB0aW9uRUNsYXNzLAotCQkJCUFSVElGQUNUX0RFU0NSSVBUSU9OX19CUklFRl9PVVRMSU5FKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShhcnRpZmFjdERlc2NyaXB0aW9uRUNsYXNzLAotCQkJCUFSVElGQUNUX0RFU0NSSVBUSU9OX19SRVBSRVNFTlRBVElPTl9PUFRJT05TKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShhcnRpZmFjdERlc2NyaXB0aW9uRUNsYXNzLAotCQkJCUFSVElGQUNUX0RFU0NSSVBUSU9OX19SRVBSRVNFTlRBVElPTik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoYXJ0aWZhY3REZXNjcmlwdGlvbkVDbGFzcywKLQkJCQlBUlRJRkFDVF9ERVNDUklQVElPTl9fTk9UQVRJT04pOwotCi0JCXdvcmtQcm9kdWN0RGVzY3JpcHRpb25FQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh3b3JrUHJvZHVjdERlc2NyaXB0aW9uRUNsYXNzLAotCQkJCVdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fUFVSUE9TRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUod29ya1Byb2R1Y3REZXNjcmlwdGlvbkVDbGFzcywKLQkJCQlXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX0lNUEFDVF9PRl9OT1RfSEFWSU5HKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh3b3JrUHJvZHVjdERlc2NyaXB0aW9uRUNsYXNzLAotCQkJCVdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fUkVBU09OU19GT1JfTk9UX05FRURJTkcpOwotCi0JCWRlbGl2ZXJhYmxlRGVzY3JpcHRpb25FQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoREVMSVZFUkFCTEVfREVTQ1JJUFRJT04pOwotCQljcmVhdGVFQXR0cmlidXRlKGRlbGl2ZXJhYmxlRGVzY3JpcHRpb25FQ2xhc3MsCi0JCQkJREVMSVZFUkFCTEVfREVTQ1JJUFRJT05fX0VYVEVSTkFMX0RFU0NSSVBUSU9OKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShkZWxpdmVyYWJsZURlc2NyaXB0aW9uRUNsYXNzLAotCQkJCURFTElWRVJBQkxFX0RFU0NSSVBUSU9OX19QQUNLQUdJTkdfR1VJREFOQ0UpOwotCi0JCXJvbGVEZXNjcmlwdGlvbkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhST0xFX0RFU0NSSVBUSU9OKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShyb2xlRGVzY3JpcHRpb25FQ2xhc3MsIFJPTEVfREVTQ1JJUFRJT05fX1NLSUxMUyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocm9sZURlc2NyaXB0aW9uRUNsYXNzLAotCQkJCVJPTEVfREVTQ1JJUFRJT05fX0FTU0lHTk1FTlRfQVBQUk9BQ0hFUyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocm9sZURlc2NyaXB0aW9uRUNsYXNzLCBST0xFX0RFU0NSSVBUSU9OX19TWU5PTllNUyk7Ci0KLQkJdGFza0Rlc2NyaXB0aW9uRUNsYXNzID0gY3JlYXRlRUNsYXNzKFRBU0tfREVTQ1JJUFRJT04pOwotCQljcmVhdGVFQXR0cmlidXRlKHRhc2tEZXNjcmlwdGlvbkVDbGFzcywgVEFTS19ERVNDUklQVElPTl9fUFVSUE9TRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUodGFza0Rlc2NyaXB0aW9uRUNsYXNzLCBUQVNLX0RFU0NSSVBUSU9OX19BTFRFUk5BVElWRVMpOwotCi0JCWd1aWRhbmNlRGVzY3JpcHRpb25FQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoR1VJREFOQ0VfREVTQ1JJUFRJT04pOwotCQljcmVhdGVFQXR0cmlidXRlKGd1aWRhbmNlRGVzY3JpcHRpb25FQ2xhc3MsCi0JCQkJR1VJREFOQ0VfREVTQ1JJUFRJT05fX0FUVEFDSE1FTlRTKTsKLQotCQlwcmFjdGljZURlc2NyaXB0aW9uRUNsYXNzID0gY3JlYXRlRUNsYXNzKFBSQUNUSUNFX0RFU0NSSVBUSU9OKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShwcmFjdGljZURlc2NyaXB0aW9uRUNsYXNzLAotCQkJCVBSQUNUSUNFX0RFU0NSSVBUSU9OX19BRERJVElPTkFMX0lORk8pOwotCQljcmVhdGVFQXR0cmlidXRlKHByYWN0aWNlRGVzY3JpcHRpb25FQ2xhc3MsCi0JCQkJUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX1BST0JMRU0pOwotCQljcmVhdGVFQXR0cmlidXRlKHByYWN0aWNlRGVzY3JpcHRpb25FQ2xhc3MsCi0JCQkJUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0JBQ0tHUk9VTkQpOwotCQljcmVhdGVFQXR0cmlidXRlKHByYWN0aWNlRGVzY3JpcHRpb25FQ2xhc3MsIFBSQUNUSUNFX0RFU0NSSVBUSU9OX19HT0FMUyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocHJhY3RpY2VEZXNjcmlwdGlvbkVDbGFzcywKLQkJCQlQUkFDVElDRV9ERVNDUklQVElPTl9fQVBQTElDQVRJT04pOwotCQljcmVhdGVFQXR0cmlidXRlKHByYWN0aWNlRGVzY3JpcHRpb25FQ2xhc3MsCi0JCQkJUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0xFVkVMU19PRl9BRE9QVElPTik7Ci0KLQkJcm9sZVNldEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhST0xFX1NFVCk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2Uocm9sZVNldEVDbGFzcywgUk9MRV9TRVRfX1JPTEVTKTsKLQotCQljb250ZW50Q2F0ZWdvcnlFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoQ09OVEVOVF9DQVRFR09SWSk7Ci0KLQkJZG9tYWluRUNsYXNzID0gY3JlYXRlRUNsYXNzKERPTUFJTik7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZG9tYWluRUNsYXNzLCBET01BSU5fX1dPUktfUFJPRFVDVFMpOwotCQljcmVhdGVFUmVmZXJlbmNlKGRvbWFpbkVDbGFzcywgRE9NQUlOX19TVUJET01BSU5TKTsKLQotCQl3b3JrUHJvZHVjdFR5cGVFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoV09SS19QUk9EVUNUX1RZUEUpOwotCQljcmVhdGVFUmVmZXJlbmNlKHdvcmtQcm9kdWN0VHlwZUVDbGFzcywKLQkJCQlXT1JLX1BST0RVQ1RfVFlQRV9fV09SS19QUk9EVUNUUyk7Ci0KLQkJZGlzY2lwbGluZUdyb3VwaW5nRUNsYXNzID0gY3JlYXRlRUNsYXNzKERJU0NJUExJTkVfR1JPVVBJTkcpOwotCQljcmVhdGVFUmVmZXJlbmNlKGRpc2NpcGxpbmVHcm91cGluZ0VDbGFzcywKLQkJCQlESVNDSVBMSU5FX0dST1VQSU5HX19ESVNDSVBMSU5FUyk7Ci0KLQkJZGlzY2lwbGluZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhESVNDSVBMSU5FKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShkaXNjaXBsaW5lRUNsYXNzLCBESVNDSVBMSU5FX19UQVNLUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZGlzY2lwbGluZUVDbGFzcywgRElTQ0lQTElORV9fU1VCRElTQ0lQTElORSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZGlzY2lwbGluZUVDbGFzcywgRElTQ0lQTElORV9fUkVGRVJFTkNFX1dPUktGTE9XUyk7Ci0KLQkJYWN0aXZpdHlFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoQUNUSVZJVFkpOwotCQljcmVhdGVFUmVmZXJlbmNlKGFjdGl2aXR5RUNsYXNzLCBBQ1RJVklUWV9fQlJFQUtET1dOX0VMRU1FTlRTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShhY3Rpdml0eUVDbGFzcywgQUNUSVZJVFlfX1JPQURNQVBTKTsKLQotCQl3b3JrQnJlYWtkb3duRWxlbWVudEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhXT1JLX0JSRUFLRE9XTl9FTEVNRU5UKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh3b3JrQnJlYWtkb3duRWxlbWVudEVDbGFzcywKLQkJCQlXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19JU19SRVBFQVRBQkxFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh3b3JrQnJlYWtkb3duRWxlbWVudEVDbGFzcywKLQkJCQlXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19JU19PTkdPSU5HKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh3b3JrQnJlYWtkb3duRWxlbWVudEVDbGFzcywKLQkJCQlXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19JU19FVkVOVF9EUklWRU4pOwotCQljcmVhdGVFUmVmZXJlbmNlKHdvcmtCcmVha2Rvd25FbGVtZW50RUNsYXNzLAotCQkJCVdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0xJTktfVE9fUFJFREVDRVNTT1IpOwotCi0JCWJyZWFrZG93bkVsZW1lbnRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoQlJFQUtET1dOX0VMRU1FTlQpOwotCQljcmVhdGVFQXR0cmlidXRlKGJyZWFrZG93bkVsZW1lbnRFQ2xhc3MsIEJSRUFLRE9XTl9FTEVNRU5UX19QUkVGSVgpOwotCQljcmVhdGVFQXR0cmlidXRlKGJyZWFrZG93bkVsZW1lbnRFQ2xhc3MsIEJSRUFLRE9XTl9FTEVNRU5UX19JU19QTEFOTkVEKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShicmVha2Rvd25FbGVtZW50RUNsYXNzLAotCQkJCUJSRUFLRE9XTl9FTEVNRU5UX19IQVNfTVVMVElQTEVfT0NDVVJSRU5DRVMpOwotCQljcmVhdGVFQXR0cmlidXRlKGJyZWFrZG93bkVsZW1lbnRFQ2xhc3MsIEJSRUFLRE9XTl9FTEVNRU5UX19JU19PUFRJT05BTCk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoYnJlYWtkb3duRWxlbWVudEVDbGFzcywKLQkJCQlCUkVBS0RPV05fRUxFTUVOVF9fUFJFU0VOVEVEX0FGVEVSKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShicmVha2Rvd25FbGVtZW50RUNsYXNzLAotCQkJCUJSRUFLRE9XTl9FTEVNRU5UX19QUkVTRU5URURfQkVGT1JFKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShicmVha2Rvd25FbGVtZW50RUNsYXNzLAotCQkJCUJSRUFLRE9XTl9FTEVNRU5UX19QTEFOTklOR19EQVRBKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShicmVha2Rvd25FbGVtZW50RUNsYXNzLAotCQkJCUJSRUFLRE9XTl9FTEVNRU5UX19TVVBFUl9BQ1RJVklUSUVTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShicmVha2Rvd25FbGVtZW50RUNsYXNzLCBCUkVBS0RPV05fRUxFTUVOVF9fQ0hFQ0tMSVNUUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoYnJlYWtkb3duRWxlbWVudEVDbGFzcywgQlJFQUtET1dOX0VMRU1FTlRfX0NPTkNFUFRTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShicmVha2Rvd25FbGVtZW50RUNsYXNzLCBCUkVBS0RPV05fRUxFTUVOVF9fRVhBTVBMRVMpOwotCQljcmVhdGVFUmVmZXJlbmNlKGJyZWFrZG93bkVsZW1lbnRFQ2xhc3MsIEJSRUFLRE9XTl9FTEVNRU5UX19HVUlERUxJTkVTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShicmVha2Rvd25FbGVtZW50RUNsYXNzLAotCQkJCUJSRUFLRE9XTl9FTEVNRU5UX19SRVVTQUJMRV9BU1NFVFMpOwotCQljcmVhdGVFUmVmZXJlbmNlKGJyZWFrZG93bkVsZW1lbnRFQ2xhc3MsCi0JCQkJQlJFQUtET1dOX0VMRU1FTlRfX1NVUFBPUlRJTkdfTUFURVJJQUxTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShicmVha2Rvd25FbGVtZW50RUNsYXNzLCBCUkVBS0RPV05fRUxFTUVOVF9fVEVNUExBVEVTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShicmVha2Rvd25FbGVtZW50RUNsYXNzLCBCUkVBS0RPV05fRUxFTUVOVF9fUkVQT1JUUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoYnJlYWtkb3duRWxlbWVudEVDbGFzcywKLQkJCQlCUkVBS0RPV05fRUxFTUVOVF9fRVNUSU1BVElPTkNPTlNJREVSQVRJT05TKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShicmVha2Rvd25FbGVtZW50RUNsYXNzLCBCUkVBS0RPV05fRUxFTUVOVF9fVE9PTE1FTlRPUik7Ci0KLQkJcHJvY2Vzc0VsZW1lbnRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUFJPQ0VTU19FTEVNRU5UKTsKLQotCQlwbGFubmluZ0RhdGFFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUExBTk5JTkdfREFUQSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocGxhbm5pbmdEYXRhRUNsYXNzLCBQTEFOTklOR19EQVRBX19TVEFSVF9EQVRFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShwbGFubmluZ0RhdGFFQ2xhc3MsIFBMQU5OSU5HX0RBVEFfX0ZJTklTSF9EQVRFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShwbGFubmluZ0RhdGFFQ2xhc3MsIFBMQU5OSU5HX0RBVEFfX1JBTkspOwotCi0JCXdvcmtPcmRlckVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhXT1JLX09SREVSKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh3b3JrT3JkZXJFQ2xhc3MsIFdPUktfT1JERVJfX0xJTktfVFlQRSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2Uod29ya09yZGVyRUNsYXNzLCBXT1JLX09SREVSX19QUkVEKTsKLQotCQlyb2FkbWFwRUNsYXNzID0gY3JlYXRlRUNsYXNzKFJPQURNQVApOwotCi0JCXRvb2xFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoVE9PTCk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UodG9vbEVDbGFzcywgVE9PTF9fVE9PTF9NRU5UT1JTKTsKLQotCQlyb2xlU2V0R3JvdXBpbmdFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUk9MRV9TRVRfR1JPVVBJTkcpOwotCQljcmVhdGVFUmVmZXJlbmNlKHJvbGVTZXRHcm91cGluZ0VDbGFzcywgUk9MRV9TRVRfR1JPVVBJTkdfX1JPTEVfU0VUUyk7Ci0KLQkJY3VzdG9tQ2F0ZWdvcnlFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoQ1VTVE9NX0NBVEVHT1JZKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShjdXN0b21DYXRlZ29yeUVDbGFzcywKLQkJCQlDVVNUT01fQ0FURUdPUllfX0NBVEVHT1JJWkVEX0VMRU1FTlRTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShjdXN0b21DYXRlZ29yeUVDbGFzcywgQ1VTVE9NX0NBVEVHT1JZX19TVUJfQ0FURUdPUklFUyk7Ci0KLQkJbWV0aG9kUGFja2FnZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhNRVRIT0RfUEFDS0FHRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUobWV0aG9kUGFja2FnZUVDbGFzcywgTUVUSE9EX1BBQ0tBR0VfX0dMT0JBTCk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UobWV0aG9kUGFja2FnZUVDbGFzcywgTUVUSE9EX1BBQ0tBR0VfX1JFVVNFRF9QQUNLQUdFUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UobWV0aG9kUGFja2FnZUVDbGFzcywgTUVUSE9EX1BBQ0tBR0VfX0NISUxEX1BBQ0tBR0VTKTsKLQotCQljb250ZW50UGFja2FnZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhDT05URU5UX1BBQ0tBR0UpOwotCQljcmVhdGVFUmVmZXJlbmNlKGNvbnRlbnRQYWNrYWdlRUNsYXNzLAotCQkJCUNPTlRFTlRfUEFDS0FHRV9fQ09OVEVOVF9FTEVNRU5UUyk7Ci0KLQkJbWlsZXN0b25lRUNsYXNzID0gY3JlYXRlRUNsYXNzKE1JTEVTVE9ORSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UobWlsZXN0b25lRUNsYXNzLCBNSUxFU1RPTkVfX1JFUVVJUkVEX1JFU1VMVFMpOwotCi0JCXdvcmtQcm9kdWN0RGVzY3JpcHRvckVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUod29ya1Byb2R1Y3REZXNjcmlwdG9yRUNsYXNzLAotCQkJCVdPUktfUFJPRFVDVF9ERVNDUklQVE9SX19BQ1RJVklUWV9FTlRSWV9TVEFURSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUod29ya1Byb2R1Y3REZXNjcmlwdG9yRUNsYXNzLAotCQkJCVdPUktfUFJPRFVDVF9ERVNDUklQVE9SX19BQ1RJVklUWV9FWElUX1NUQVRFKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh3b3JrUHJvZHVjdERlc2NyaXB0b3JFQ2xhc3MsCi0JCQkJV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX1dPUktfUFJPRFVDVCk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2Uod29ya1Byb2R1Y3REZXNjcmlwdG9yRUNsYXNzLAotCQkJCVdPUktfUFJPRFVDVF9ERVNDUklQVE9SX19JTVBBQ1RFRF9CWSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2Uod29ya1Byb2R1Y3REZXNjcmlwdG9yRUNsYXNzLAotCQkJCVdPUktfUFJPRFVDVF9ERVNDUklQVE9SX19JTVBBQ1RTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh3b3JrUHJvZHVjdERlc2NyaXB0b3JFQ2xhc3MsCi0JCQkJV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0RFTElWRVJBQkxFX1BBUlRTKTsKLQotCQlkZXNjcmlwdG9yRUNsYXNzID0gY3JlYXRlRUNsYXNzKERFU0NSSVBUT1IpOwotCQljcmVhdGVFQXR0cmlidXRlKGRlc2NyaXB0b3JFQ2xhc3MsCi0JCQkJREVTQ1JJUFRPUl9fSVNfU1lOQ0hST05JWkVEX1dJVEhfU09VUkNFKTsKLQotCQlpdGVyYXRpb25FQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoSVRFUkFUSU9OKTsKLQotCQlwaGFzZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhQSEFTRSk7Ci0KLQkJdGVhbVByb2ZpbGVFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoVEVBTV9QUk9GSUxFKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh0ZWFtUHJvZmlsZUVDbGFzcywgVEVBTV9QUk9GSUxFX19URUFNX1JPTEVTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh0ZWFtUHJvZmlsZUVDbGFzcywgVEVBTV9QUk9GSUxFX19TVVBFUl9URUFNKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh0ZWFtUHJvZmlsZUVDbGFzcywgVEVBTV9QUk9GSUxFX19TVUJfVEVBTSk7Ci0KLQkJcm9sZURlc2NyaXB0b3JFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUk9MRV9ERVNDUklQVE9SKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShyb2xlRGVzY3JpcHRvckVDbGFzcywgUk9MRV9ERVNDUklQVE9SX19ST0xFKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShyb2xlRGVzY3JpcHRvckVDbGFzcywgUk9MRV9ERVNDUklQVE9SX19NT0RJRklFUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2Uocm9sZURlc2NyaXB0b3JFQ2xhc3MsIFJPTEVfREVTQ1JJUFRPUl9fUkVTUE9OU0lCTEVfRk9SKTsKLQotCQl0YXNrRGVzY3JpcHRvckVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhUQVNLX0RFU0NSSVBUT1IpOwotCQljcmVhdGVFUmVmZXJlbmNlKHRhc2tEZXNjcmlwdG9yRUNsYXNzLCBUQVNLX0RFU0NSSVBUT1JfX1RBU0spOwotCQljcmVhdGVFUmVmZXJlbmNlKHRhc2tEZXNjcmlwdG9yRUNsYXNzLAotCQkJCVRBU0tfREVTQ1JJUFRPUl9fQURESVRJT05BTExZX1BFUkZPUk1FRF9CWSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UodGFza0Rlc2NyaXB0b3JFQ2xhc3MsIFRBU0tfREVTQ1JJUFRPUl9fQVNTSVNURURfQlkpOwotCQljcmVhdGVFUmVmZXJlbmNlKHRhc2tEZXNjcmlwdG9yRUNsYXNzLCBUQVNLX0RFU0NSSVBUT1JfX0VYVEVSTkFMX0lOUFVUKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh0YXNrRGVzY3JpcHRvckVDbGFzcywgVEFTS19ERVNDUklQVE9SX19NQU5EQVRPUllfSU5QVVQpOwotCQljcmVhdGVFUmVmZXJlbmNlKHRhc2tEZXNjcmlwdG9yRUNsYXNzLCBUQVNLX0RFU0NSSVBUT1JfX09QVElPTkFMX0lOUFVUKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh0YXNrRGVzY3JpcHRvckVDbGFzcywgVEFTS19ERVNDUklQVE9SX19PVVRQVVQpOwotCQljcmVhdGVFUmVmZXJlbmNlKHRhc2tEZXNjcmlwdG9yRUNsYXNzLAotCQkJCVRBU0tfREVTQ1JJUFRPUl9fUEVSRk9STUVEX1BSSU1BUklMWV9CWSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UodGFza0Rlc2NyaXB0b3JFQ2xhc3MsIFRBU0tfREVTQ1JJUFRPUl9fU0VMRUNURURfU1RFUFMpOwotCi0JCWNvbXBvc2l0ZVJvbGVFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoQ09NUE9TSVRFX1JPTEUpOwotCQljcmVhdGVFUmVmZXJlbmNlKGNvbXBvc2l0ZVJvbGVFQ2xhc3MsIENPTVBPU0lURV9ST0xFX19BR0dSRUdBVEVEX1JPTEVTKTsKLQotCQlkZWxpdmVyeVByb2Nlc3NFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoREVMSVZFUllfUFJPQ0VTUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZGVsaXZlcnlQcm9jZXNzRUNsYXNzLAotCQkJCURFTElWRVJZX1BST0NFU1NfX0VEVUNBVElPTl9NQVRFUklBTFMpOwotCQljcmVhdGVFUmVmZXJlbmNlKGRlbGl2ZXJ5UHJvY2Vzc0VDbGFzcywKLQkJCQlERUxJVkVSWV9QUk9DRVNTX19DT01NVU5JQ0FUSU9OU19NQVRFUklBTFMpOwotCi0JCXByb2Nlc3NFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUFJPQ0VTUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UocHJvY2Vzc0VDbGFzcywgUFJPQ0VTU19fSU5DTFVERVNfUEFUVEVSTlMpOwotCQljcmVhdGVFUmVmZXJlbmNlKHByb2Nlc3NFQ2xhc3MsIFBST0NFU1NfX0RFRkFVTFRfQ09OVEVYVCk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UocHJvY2Vzc0VDbGFzcywgUFJPQ0VTU19fVkFMSURfQ09OVEVYVCk7Ci0KLQkJY2FwYWJpbGl0eVBhdHRlcm5FQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoQ0FQQUJJTElUWV9QQVRURVJOKTsKLQotCQltZXRob2RDb25maWd1cmF0aW9uRUNsYXNzID0gY3JlYXRlRUNsYXNzKE1FVEhPRF9DT05GSUdVUkFUSU9OKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShtZXRob2RDb25maWd1cmF0aW9uRUNsYXNzLAotCQkJCU1FVEhPRF9DT05GSUdVUkFUSU9OX19NRVRIT0RfUExVR0lOX1NFTEVDVElPTik7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UobWV0aG9kQ29uZmlndXJhdGlvbkVDbGFzcywKLQkJCQlNRVRIT0RfQ09ORklHVVJBVElPTl9fTUVUSE9EX1BBQ0tBR0VfU0VMRUNUSU9OKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShtZXRob2RDb25maWd1cmF0aW9uRUNsYXNzLAotCQkJCU1FVEhPRF9DT05GSUdVUkFUSU9OX19QUk9DRVNTX1ZJRVdTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShtZXRob2RDb25maWd1cmF0aW9uRUNsYXNzLAotCQkJCU1FVEhPRF9DT05GSUdVUkFUSU9OX19ERUZBVUxUX1ZJRVcpOwotCQljcmVhdGVFUmVmZXJlbmNlKG1ldGhvZENvbmZpZ3VyYXRpb25FQ2xhc3MsCi0JCQkJTUVUSE9EX0NPTkZJR1VSQVRJT05fX0JBU0VfQ09ORklHVVJBVElPTlMpOwotCQljcmVhdGVFUmVmZXJlbmNlKG1ldGhvZENvbmZpZ3VyYXRpb25FQ2xhc3MsCi0JCQkJTUVUSE9EX0NPTkZJR1VSQVRJT05fX1NVQlRSQUNURURfQ0FURUdPUlkpOwotCQljcmVhdGVFUmVmZXJlbmNlKG1ldGhvZENvbmZpZ3VyYXRpb25FQ2xhc3MsCi0JCQkJTUVUSE9EX0NPTkZJR1VSQVRJT05fX0FEREVEX0NBVEVHT1JZKTsKLQotCQltZXRob2RQbHVnaW5FQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoTUVUSE9EX1BMVUdJTik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUobWV0aG9kUGx1Z2luRUNsYXNzLCBNRVRIT0RfUExVR0lOX19VU0VSX0NIQU5HRUFCTEUpOwotCQljcmVhdGVFUmVmZXJlbmNlKG1ldGhvZFBsdWdpbkVDbGFzcywgTUVUSE9EX1BMVUdJTl9fTUVUSE9EX1BBQ0tBR0VTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShtZXRob2RQbHVnaW5FQ2xhc3MsIE1FVEhPRF9QTFVHSU5fX0JBU0VTKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShtZXRob2RQbHVnaW5FQ2xhc3MsIE1FVEhPRF9QTFVHSU5fX1NVUFBPUlRJTkcpOwotCi0JCXByb2Nlc3NQbGFubmluZ1RlbXBsYXRlRUNsYXNzID0gY3JlYXRlRUNsYXNzKFBST0NFU1NfUExBTk5JTkdfVEVNUExBVEUpOwotCQljcmVhdGVFUmVmZXJlbmNlKHByb2Nlc3NQbGFubmluZ1RlbXBsYXRlRUNsYXNzLAotCQkJCVBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX0JBU0VEX09OX1BST0NFU1NFUyk7Ci0KLQkJcHJhY3RpY2VFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUFJBQ1RJQ0UpOwotCQljcmVhdGVFUmVmZXJlbmNlKHByYWN0aWNlRUNsYXNzLCBQUkFDVElDRV9fU1VCX1BSQUNUSUNFUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UocHJhY3RpY2VFQ2xhc3MsIFBSQUNUSUNFX19DT05URU5UX1JFRkVSRU5DRVMpOwotCQljcmVhdGVFUmVmZXJlbmNlKHByYWN0aWNlRUNsYXNzLCBQUkFDVElDRV9fQUNUSVZJVFlfUkVGRVJFTkNFUyk7Ci0KLQkJYnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uRUNsYXNzID0gY3JlYXRlRUNsYXNzKEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShicmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb25FQ2xhc3MsCi0JCQkJQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX1VTQUdFX0dVSURBTkNFKTsKLQotCQlhY3Rpdml0eURlc2NyaXB0aW9uRUNsYXNzID0gY3JlYXRlRUNsYXNzKEFDVElWSVRZX0RFU0NSSVBUSU9OKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShhY3Rpdml0eURlc2NyaXB0aW9uRUNsYXNzLAotCQkJCUFDVElWSVRZX0RFU0NSSVBUSU9OX19QVVJQT1NFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShhY3Rpdml0eURlc2NyaXB0aW9uRUNsYXNzLAotCQkJCUFDVElWSVRZX0RFU0NSSVBUSU9OX19BTFRFUk5BVElWRVMpOwotCQljcmVhdGVFQXR0cmlidXRlKGFjdGl2aXR5RGVzY3JpcHRpb25FQ2xhc3MsCi0JCQkJQUNUSVZJVFlfREVTQ1JJUFRJT05fX0hPV1RPX1NUQUZGKTsKLQotCQlkZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShkZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbkVDbGFzcywKLQkJCQlERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19TQ0FMRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25FQ2xhc3MsCi0JCQkJREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fUFJPSkVDVF9DSEFSQUNURVJJU1RJQ1MpOwotCQljcmVhdGVFQXR0cmlidXRlKGRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uRUNsYXNzLAotCQkJCURFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1JJU0tfTEVWRUwpOwotCQljcmVhdGVFQXR0cmlidXRlKGRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uRUNsYXNzLAotCQkJCURFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX0VTVElNQVRJTkdfVEVDSE5JUVVFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShkZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbkVDbGFzcywKLQkJCQlERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19QUk9KRUNUX01FTUJFUl9FWFBFUlRJU0UpOwotCQljcmVhdGVFQXR0cmlidXRlKGRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uRUNsYXNzLAotCQkJCURFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1RZUEVfT0ZfQ09OVFJBQ1QpOwotCi0JCXByb2Nlc3NEZXNjcmlwdGlvbkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhQUk9DRVNTX0RFU0NSSVBUSU9OKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShwcm9jZXNzRGVzY3JpcHRpb25FQ2xhc3MsIFBST0NFU1NfREVTQ1JJUFRJT05fX1NDT1BFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShwcm9jZXNzRGVzY3JpcHRpb25FQ2xhc3MsCi0JCQkJUFJPQ0VTU19ERVNDUklQVElPTl9fVVNBR0VfTk9URVMpOwotCi0JCWRlc2NyaXB0b3JEZXNjcmlwdGlvbkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhERVNDUklQVE9SX0RFU0NSSVBUSU9OKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShkZXNjcmlwdG9yRGVzY3JpcHRpb25FQ2xhc3MsCi0JCQkJREVTQ1JJUFRPUl9ERVNDUklQVElPTl9fUkVGSU5FRF9ERVNDUklQVElPTik7Ci0KLQkJcHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3JFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUFJPQ0VTU19DT01QT05FTlRfREVTQ1JJUFRPUik7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UocHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3JFQ2xhc3MsCi0JCQkJUFJPQ0VTU19DT01QT05FTlRfREVTQ1JJUFRPUl9fUFJPQ0VTU19DT01QT05FTlQpOwotCi0JCXByb2Nlc3NDb21wb25lbnRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUFJPQ0VTU19DT01QT05FTlQpOwotCQljcmVhdGVFUmVmZXJlbmNlKHByb2Nlc3NDb21wb25lbnRFQ2xhc3MsIFBST0NFU1NfQ09NUE9ORU5UX19JTlRFUkZBQ0VTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShwcm9jZXNzQ29tcG9uZW50RUNsYXNzLCBQUk9DRVNTX0NPTVBPTkVOVF9fUFJPQ0VTUyk7Ci0KLQkJcHJvY2Vzc1BhY2thZ2VFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUFJPQ0VTU19QQUNLQUdFKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShwcm9jZXNzUGFja2FnZUVDbGFzcywKLQkJCQlQUk9DRVNTX1BBQ0tBR0VfX1BST0NFU1NfRUxFTUVOVFMpOwotCQljcmVhdGVFUmVmZXJlbmNlKHByb2Nlc3NQYWNrYWdlRUNsYXNzLCBQUk9DRVNTX1BBQ0tBR0VfX0RJQUdSQU1TKTsKLQotCQlkaWFncmFtRUNsYXNzID0gY3JlYXRlRUNsYXNzKERJQUdSQU0pOwotCQljcmVhdGVFUmVmZXJlbmNlKGRpYWdyYW1FQ2xhc3MsIERJQUdSQU1fX0RJQUdSQU1fTElOSyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZGlhZ3JhbUVDbGFzcywgRElBR1JBTV9fTkFNRVNQQUNFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShkaWFncmFtRUNsYXNzLCBESUFHUkFNX19aT09NKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShkaWFncmFtRUNsYXNzLCBESUFHUkFNX19WSUVXUE9JTlQpOwotCi0JCWdyYXBoTm9kZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhHUkFQSF9OT0RFKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShncmFwaE5vZGVFQ2xhc3MsIEdSQVBIX05PREVfX1NJWkUpOwotCi0JCWdyYXBoRWxlbWVudEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhHUkFQSF9FTEVNRU5UKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShncmFwaEVsZW1lbnRFQ2xhc3MsIEdSQVBIX0VMRU1FTlRfX0NPTlRBSU5FRCk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZ3JhcGhFbGVtZW50RUNsYXNzLCBHUkFQSF9FTEVNRU5UX19QT1NJVElPTik7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZ3JhcGhFbGVtZW50RUNsYXNzLCBHUkFQSF9FTEVNRU5UX19MSU5LKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShncmFwaEVsZW1lbnRFQ2xhc3MsIEdSQVBIX0VMRU1FTlRfX0FOQ0hPUkFHRSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZ3JhcGhFbGVtZW50RUNsYXNzLCBHUkFQSF9FTEVNRU5UX19TRU1BTlRJQ19NT0RFTCk7Ci0KLQkJZGlhZ3JhbUVsZW1lbnRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoRElBR1JBTV9FTEVNRU5UKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShkaWFncmFtRWxlbWVudEVDbGFzcywgRElBR1JBTV9FTEVNRU5UX19JU19WSVNJQkxFKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShkaWFncmFtRWxlbWVudEVDbGFzcywgRElBR1JBTV9FTEVNRU5UX19DT05UQUlORVIpOwotCQljcmVhdGVFUmVmZXJlbmNlKGRpYWdyYW1FbGVtZW50RUNsYXNzLCBESUFHUkFNX0VMRU1FTlRfX1JFRkVSRU5DRSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZGlhZ3JhbUVsZW1lbnRFQ2xhc3MsIERJQUdSQU1fRUxFTUVOVF9fUFJPUEVSVFkpOwotCi0JCXJlZmVyZW5jZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhSRUZFUkVOQ0UpOwotCQljcmVhdGVFQXR0cmlidXRlKHJlZmVyZW5jZUVDbGFzcywKLQkJCQlSRUZFUkVOQ0VfX0lTX0lORElWSURVQUxfUkVQUkVTRU5UQVRJT04pOwotCQljcmVhdGVFUmVmZXJlbmNlKHJlZmVyZW5jZUVDbGFzcywgUkVGRVJFTkNFX19SRUZFUkVOQ0VEKTsKLQotCQlwcm9wZXJ0eUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhQUk9QRVJUWSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocHJvcGVydHlFQ2xhc3MsIFBST1BFUlRZX19LRVkpOwotCQljcmVhdGVFQXR0cmlidXRlKHByb3BlcnR5RUNsYXNzLCBQUk9QRVJUWV9fVkFMVUUpOwotCi0JCXBvaW50RUNsYXNzID0gY3JlYXRlRUNsYXNzKFBPSU5UKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShwb2ludEVDbGFzcywgUE9JTlRfX1gpOwotCQljcmVhdGVFQXR0cmlidXRlKHBvaW50RUNsYXNzLCBQT0lOVF9fWSk7Ci0KLQkJZGlhZ3JhbUxpbmtFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoRElBR1JBTV9MSU5LKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShkaWFncmFtTGlua0VDbGFzcywgRElBR1JBTV9MSU5LX19aT09NKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShkaWFncmFtTGlua0VDbGFzcywgRElBR1JBTV9MSU5LX19WSUVXUE9SVCk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZGlhZ3JhbUxpbmtFQ2xhc3MsIERJQUdSQU1fTElOS19fRElBR1JBTSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZGlhZ3JhbUxpbmtFQ2xhc3MsIERJQUdSQU1fTElOS19fR1JBUEhfRUxFTUVOVCk7Ci0KLQkJZ3JhcGhDb25uZWN0b3JFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoR1JBUEhfQ09OTkVDVE9SKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShncmFwaENvbm5lY3RvckVDbGFzcywgR1JBUEhfQ09OTkVDVE9SX19HUkFQSF9FREdFKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShncmFwaENvbm5lY3RvckVDbGFzcywgR1JBUEhfQ09OTkVDVE9SX19HUkFQSF9FTEVNRU5UKTsKLQotCQlncmFwaEVkZ2VFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoR1JBUEhfRURHRSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZ3JhcGhFZGdlRUNsYXNzLCBHUkFQSF9FREdFX19XQVlQT0lOVFMpOwotCQljcmVhdGVFUmVmZXJlbmNlKGdyYXBoRWRnZUVDbGFzcywgR1JBUEhfRURHRV9fQU5DSE9SKTsKLQotCQlzZW1hbnRpY01vZGVsQnJpZGdlRUNsYXNzID0gY3JlYXRlRUNsYXNzKFNFTUFOVElDX01PREVMX0JSSURHRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoc2VtYW50aWNNb2RlbEJyaWRnZUVDbGFzcywKLQkJCQlTRU1BTlRJQ19NT0RFTF9CUklER0VfX1BSRVNFTlRBVElPTik7Ci0JCWNyZWF0ZUVSZWZlcmVuY2Uoc2VtYW50aWNNb2RlbEJyaWRnZUVDbGFzcywKLQkJCQlTRU1BTlRJQ19NT0RFTF9CUklER0VfX0RJQUdSQU0pOwotCQljcmVhdGVFUmVmZXJlbmNlKHNlbWFudGljTW9kZWxCcmlkZ2VFQ2xhc3MsCi0JCQkJU0VNQU5USUNfTU9ERUxfQlJJREdFX19HUkFQSF9FTEVNRU5UKTsKLQotCQlkaW1lbnNpb25FQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoRElNRU5TSU9OKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShkaW1lbnNpb25FQ2xhc3MsIERJTUVOU0lPTl9fV0lEVEgpOwotCQljcmVhdGVFQXR0cmlidXRlKGRpbWVuc2lvbkVDbGFzcywgRElNRU5TSU9OX19IRUlHSFQpOwotCi0JCXByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUFJPQ0VTU19DT01QT05FTlRfSU5URVJGQUNFKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShwcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlRUNsYXNzLAotCQkJCVBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRV9fSU5URVJGQUNFX1NQRUNJRklDQVRJT05TKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShwcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlRUNsYXNzLAotCQkJCVBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRV9fSU5URVJGQUNFX0lPKTsKLQotCQlzaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhTSU1QTEVfU0VNQU5USUNfTU9ERUxfRUxFTUVOVCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoc2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnRFQ2xhc3MsCi0JCQkJU0lNUExFX1NFTUFOVElDX01PREVMX0VMRU1FTlRfX1RZUEVfSU5GTyk7Ci0KLQkJdW1hU2VtYW50aWNNb2RlbEJyaWRnZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhVTUFfU0VNQU5USUNfTU9ERUxfQlJJREdFKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh1bWFTZW1hbnRpY01vZGVsQnJpZGdlRUNsYXNzLAotCQkJCVVNQV9TRU1BTlRJQ19NT0RFTF9CUklER0VfX0VMRU1FTlQpOwotCi0JCWNvcmVTZW1hbnRpY01vZGVsQnJpZGdlRUNsYXNzID0gY3JlYXRlRUNsYXNzKENPUkVfU0VNQU5USUNfTU9ERUxfQlJJREdFKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShjb3JlU2VtYW50aWNNb2RlbEJyaWRnZUVDbGFzcywKLQkJCQlDT1JFX1NFTUFOVElDX01PREVMX0JSSURHRV9fRUxFTUVOVCk7Ci0KLQkJbGVhZkVsZW1lbnRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoTEVBRl9FTEVNRU5UKTsKLQotCQl0ZXh0RWxlbWVudEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhURVhUX0VMRU1FTlQpOwotCQljcmVhdGVFQXR0cmlidXRlKHRleHRFbGVtZW50RUNsYXNzLCBURVhUX0VMRU1FTlRfX1RFWFQpOwotCi0JCWltYWdlRUNsYXNzID0gY3JlYXRlRUNsYXNzKElNQUdFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShpbWFnZUVDbGFzcywgSU1BR0VfX1VSSSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoaW1hZ2VFQ2xhc3MsIElNQUdFX19NSU1FX1RZUEUpOwotCi0JCWdyYXBoaWNQcmltaXRpdmVFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoR1JBUEhJQ19QUklNSVRJVkUpOwotCi0JCXBvbHlsaW5lRUNsYXNzID0gY3JlYXRlRUNsYXNzKFBPTFlMSU5FKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShwb2x5bGluZUVDbGFzcywgUE9MWUxJTkVfX0NMT1NFRCk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UocG9seWxpbmVFQ2xhc3MsIFBPTFlMSU5FX19XQVlQT0lOVFMpOwotCi0JCWVsbGlwc2VFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoRUxMSVBTRSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZWxsaXBzZUVDbGFzcywgRUxMSVBTRV9fQ0VOVEVSKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShlbGxpcHNlRUNsYXNzLCBFTExJUFNFX19SQURJVVNfWCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZWxsaXBzZUVDbGFzcywgRUxMSVBTRV9fUkFESVVTX1kpOwotCQljcmVhdGVFQXR0cmlidXRlKGVsbGlwc2VFQ2xhc3MsIEVMTElQU0VfX1JPVEFUSU9OKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShlbGxpcHNlRUNsYXNzLCBFTExJUFNFX19TVEFSVF9BTkdMRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZWxsaXBzZUVDbGFzcywgRUxMSVBTRV9fRU5EX0FOR0xFKTsKLQotCQlwcm9jZXNzRmFtaWx5RUNsYXNzID0gY3JlYXRlRUNsYXNzKFBST0NFU1NfRkFNSUxZKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShwcm9jZXNzRmFtaWx5RUNsYXNzLAotCQkJCVBST0NFU1NfRkFNSUxZX19ERUxJVkVSWV9QUk9DRVNTRVMpOwotCi0JCW1ldGhvZExpYnJhcnlFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoTUVUSE9EX0xJQlJBUlkpOwotCQljcmVhdGVFUmVmZXJlbmNlKG1ldGhvZExpYnJhcnlFQ2xhc3MsIE1FVEhPRF9MSUJSQVJZX19NRVRIT0RfUExVR0lOUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UobWV0aG9kTGlicmFyeUVDbGFzcywKLQkJCQlNRVRIT0RfTElCUkFSWV9fUFJFREVGSU5FRF9DT05GSUdVUkFUSU9OUyk7Ci0KLQkJLy8gQ3JlYXRlIGVudW1zCi0JCXZhcmlhYmlsaXR5VHlwZUVFbnVtID0gY3JlYXRlRUVudW0oVkFSSUFCSUxJVFlfVFlQRSk7Ci0JCXdvcmtPcmRlclR5cGVFRW51bSA9IGNyZWF0ZUVFbnVtKFdPUktfT1JERVJfVFlQRSk7Ci0KLQkJLy8gQ3JlYXRlIGRhdGEgdHlwZXMKLQkJc3RyaW5nRURhdGFUeXBlID0gY3JlYXRlRURhdGFUeXBlKFNUUklORyk7Ci0JCWJvb2xlYW5FRGF0YVR5cGUgPSBjcmVhdGVFRGF0YVR5cGUoQk9PTEVBTik7Ci0JCWRhdGVFRGF0YVR5cGUgPSBjcmVhdGVFRGF0YVR5cGUoREFURSk7Ci0JCXVyaUVEYXRhVHlwZSA9IGNyZWF0ZUVEYXRhVHlwZShVUkkpOwotCQlzZXRFRGF0YVR5cGUgPSBjcmVhdGVFRGF0YVR5cGUoU0VUKTsKLQkJc2VxdWVuY2VFRGF0YVR5cGUgPSBjcmVhdGVFRGF0YVR5cGUoU0VRVUVOQ0UpOwotCQlpbnRlZ2VyRURhdGFUeXBlID0gY3JlYXRlRURhdGFUeXBlKElOVEVHRVIpOwotCQlkb3VibGVFRGF0YVR5cGUgPSBjcmVhdGVFRGF0YVR5cGUoRE9VQkxFKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNJbml0aWFsaXplZCA9IGZhbHNlOwotCi0JLyoqCi0JICogQ29tcGxldGUgdGhlIGluaXRpYWxpemF0aW9uIG9mIHRoZSBwYWNrYWdlIGFuZCBpdHMgbWV0YS1tb2RlbC4gIFRoaXMKLQkgKiBtZXRob2QgaXMgZ3VhcmRlZCB0byBoYXZlIG5vIGFmZmVjdCBvbiBhbnkgaW52b2NhdGlvbiBidXQgaXRzIGZpcnN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKSB7Ci0JCWlmIChpc0luaXRpYWxpemVkKQotCQkJcmV0dXJuOwotCQlpc0luaXRpYWxpemVkID0gdHJ1ZTsKLQotCQkvLyBJbml0aWFsaXplIHBhY2thZ2UKLQkJc2V0TmFtZShlTkFNRSk7Ci0JCXNldE5zUHJlZml4KGVOU19QUkVGSVgpOwotCQlzZXROc1VSSShlTlNfVVJJKTsKLQotCQkvLyBDcmVhdGUgdHlwZSBwYXJhbWV0ZXJzCi0KLQkJLy8gU2V0IGJvdW5kcyBmb3IgdHlwZSBwYXJhbWV0ZXJzCi0KLQkJLy8gQWRkIHN1cGVydHlwZXMgdG8gY2xhc3NlcwotCQljbGFzc2lmaWVyRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0VHlwZSgpKTsKLQkJdHlwZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFBhY2thZ2VhYmxlRWxlbWVudCgpKTsKLQkJcGFja2FnZWFibGVFbGVtZW50RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0TmFtZWRFbGVtZW50KCkpOwotCQluYW1lZEVsZW1lbnRFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRFbGVtZW50KCkpOwotCQlwYWNrYWdlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0TmFtZXNwYWNlKCkpOwotCQlwYWNrYWdlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0UGFja2FnZWFibGVFbGVtZW50KCkpOwotCQluYW1lc3BhY2VFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXROYW1lZEVsZW1lbnQoKSk7Ci0JCWNvbnN0cmFpbnRFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRNZXRob2RFbGVtZW50KCkpOwotCQltZXRob2RFbGVtZW50RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0UGFja2FnZWFibGVFbGVtZW50KCkpOwotCQltZXRob2RFbGVtZW50UHJvcGVydHlFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQoCi0JCQkJdGhpcy5nZXRQYWNrYWdlYWJsZUVsZW1lbnQoKSk7Ci0JCWtpbmRFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRDb250ZW50RWxlbWVudCgpKTsKLQkJY29udGVudEVsZW1lbnRFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXREZXNjcmliYWJsZUVsZW1lbnQoKSk7Ci0JCWNvbnRlbnRFbGVtZW50RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0VmFyaWFiaWxpdHlFbGVtZW50KCkpOwotCQlkZXNjcmliYWJsZUVsZW1lbnRFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRNZXRob2RFbGVtZW50KCkpOwotCQlkZXNjcmliYWJsZUVsZW1lbnRFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRDbGFzc2lmaWVyKCkpOwotCQljb250ZW50RGVzY3JpcHRpb25FQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRNZXRob2RVbml0KCkpOwotCQltZXRob2RVbml0RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0TWV0aG9kRWxlbWVudCgpKTsKLQkJc3VwcG9ydGluZ01hdGVyaWFsRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0R3VpZGFuY2UoKSk7Ci0JCWd1aWRhbmNlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0Q29udGVudEVsZW1lbnQoKSk7Ci0JCXNlY3Rpb25FQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRWYXJpYWJpbGl0eUVsZW1lbnQoKSk7Ci0JCXZhcmlhYmlsaXR5RWxlbWVudEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldE1ldGhvZEVsZW1lbnQoKSk7Ci0JCWNvbmNlcHRFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRHdWlkYW5jZSgpKTsKLQkJY2hlY2tsaXN0RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0R3VpZGFuY2UoKSk7Ci0JCWd1aWRlbGluZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEd1aWRhbmNlKCkpOwotCQlleGFtcGxlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0R3VpZGFuY2UoKSk7Ci0JCXJldXNhYmxlQXNzZXRFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRHdWlkYW5jZSgpKTsKLQkJdGVybURlZmluaXRpb25FQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRHdWlkYW5jZSgpKTsKLQkJYXBwbGljYWJsZU1ldGFDbGFzc0luZm9FQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKQotCQkJCS5hZGQodGhpcy5nZXRDbGFzc2lmaWVyKCkpOwotCQlhcnRpZmFjdEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFdvcmtQcm9kdWN0KCkpOwotCQl3b3JrUHJvZHVjdEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldENvbnRlbnRFbGVtZW50KCkpOwotCQl3b3JrUHJvZHVjdEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEZ1bGZpbGxhYmxlRWxlbWVudCgpKTsKLQkJZnVsZmlsbGFibGVFbGVtZW50RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKAotCQkJCXRoaXMuZ2V0RGVzY3JpYmFibGVFbGVtZW50KCkpOwotCQlyZXBvcnRFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRHdWlkYW5jZSgpKTsKLQkJdGVtcGxhdGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRHdWlkYW5jZSgpKTsKLQkJdG9vbE1lbnRvckVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEd1aWRhbmNlKCkpOwotCQllc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnNFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRHdWlkYW5jZSgpKTsKLQkJZGVsaXZlcmFibGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRXb3JrUHJvZHVjdCgpKTsKLQkJb3V0Y29tZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFdvcmtQcm9kdWN0KCkpOwotCQlzdGVwRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0U2VjdGlvbigpKTsKLQkJc3RlcEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFdvcmtEZWZpbml0aW9uKCkpOwotCQl3b3JrRGVmaW5pdGlvbkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldE1ldGhvZEVsZW1lbnQoKSk7Ci0JCXdoaXRlcGFwZXJFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRDb25jZXB0KCkpOwotCQl0YXNrRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0Q29udGVudEVsZW1lbnQoKSk7Ci0JCXRhc2tFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRXb3JrRGVmaW5pdGlvbigpKTsKLQkJcm9sZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldENvbnRlbnRFbGVtZW50KCkpOwotCQlyb2xlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0RnVsZmlsbGFibGVFbGVtZW50KCkpOwotCQlhcnRpZmFjdERlc2NyaXB0aW9uRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKAotCQkJCXRoaXMuZ2V0V29ya1Byb2R1Y3REZXNjcmlwdGlvbigpKTsKLQkJd29ya1Byb2R1Y3REZXNjcmlwdGlvbkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCgKLQkJCQl0aGlzLmdldENvbnRlbnREZXNjcmlwdGlvbigpKTsKLQkJZGVsaXZlcmFibGVEZXNjcmlwdGlvbkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCgKLQkJCQl0aGlzLmdldFdvcmtQcm9kdWN0RGVzY3JpcHRpb24oKSk7Ci0JCXJvbGVEZXNjcmlwdGlvbkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpCi0JCQkJLmFkZCh0aGlzLmdldENvbnRlbnREZXNjcmlwdGlvbigpKTsKLQkJdGFza0Rlc2NyaXB0aW9uRUNsYXNzLmdldEVTdXBlclR5cGVzKCkKLQkJCQkuYWRkKHRoaXMuZ2V0Q29udGVudERlc2NyaXB0aW9uKCkpOwotCQlndWlkYW5jZURlc2NyaXB0aW9uRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKAotCQkJCXRoaXMuZ2V0Q29udGVudERlc2NyaXB0aW9uKCkpOwotCQlwcmFjdGljZURlc2NyaXB0aW9uRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKAotCQkJCXRoaXMuZ2V0Q29udGVudERlc2NyaXB0aW9uKCkpOwotCQlyb2xlU2V0RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0Q29udGVudENhdGVnb3J5KCkpOwotCQljb250ZW50Q2F0ZWdvcnlFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRDb250ZW50RWxlbWVudCgpKTsKLQkJZG9tYWluRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0Q29udGVudENhdGVnb3J5KCkpOwotCQl3b3JrUHJvZHVjdFR5cGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRDb250ZW50Q2F0ZWdvcnkoKSk7Ci0JCWRpc2NpcGxpbmVHcm91cGluZ0VDbGFzcy5nZXRFU3VwZXJUeXBlcygpCi0JCQkJLmFkZCh0aGlzLmdldENvbnRlbnRDYXRlZ29yeSgpKTsKLQkJZGlzY2lwbGluZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldENvbnRlbnRDYXRlZ29yeSgpKTsKLQkJYWN0aXZpdHlFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRXb3JrQnJlYWtkb3duRWxlbWVudCgpKTsKLQkJYWN0aXZpdHlFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRGdWxmaWxsYWJsZUVsZW1lbnQoKSk7Ci0JCWFjdGl2aXR5RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0VmFyaWFiaWxpdHlFbGVtZW50KCkpOwotCQlhY3Rpdml0eUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFdvcmtEZWZpbml0aW9uKCkpOwotCQl3b3JrQnJlYWtkb3duRWxlbWVudEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCgKLQkJCQl0aGlzLmdldEJyZWFrZG93bkVsZW1lbnQoKSk7Ci0JCWJyZWFrZG93bkVsZW1lbnRFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRQcm9jZXNzRWxlbWVudCgpKTsKLQkJcHJvY2Vzc0VsZW1lbnRFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXREZXNjcmliYWJsZUVsZW1lbnQoKSk7Ci0JCXBsYW5uaW5nRGF0YUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFByb2Nlc3NFbGVtZW50KCkpOwotCQl3b3JrT3JkZXJFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRQcm9jZXNzRWxlbWVudCgpKTsKLQkJcm9hZG1hcEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEd1aWRhbmNlKCkpOwotCQl0b29sRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0Q29udGVudENhdGVnb3J5KCkpOwotCQlyb2xlU2V0R3JvdXBpbmdFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRDb250ZW50Q2F0ZWdvcnkoKSk7Ci0JCWN1c3RvbUNhdGVnb3J5RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0Q29udGVudENhdGVnb3J5KCkpOwotCQltZXRob2RQYWNrYWdlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0TWV0aG9kRWxlbWVudCgpKTsKLQkJbWV0aG9kUGFja2FnZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFBhY2thZ2UoKSk7Ci0JCWNvbnRlbnRQYWNrYWdlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0TWV0aG9kUGFja2FnZSgpKTsKLQkJbWlsZXN0b25lRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0V29ya0JyZWFrZG93bkVsZW1lbnQoKSk7Ci0JCXdvcmtQcm9kdWN0RGVzY3JpcHRvckVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldERlc2NyaXB0b3IoKSk7Ci0JCWRlc2NyaXB0b3JFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRCcmVha2Rvd25FbGVtZW50KCkpOwotCQlpdGVyYXRpb25FQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRBY3Rpdml0eSgpKTsKLQkJcGhhc2VFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRBY3Rpdml0eSgpKTsKLQkJdGVhbVByb2ZpbGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRCcmVha2Rvd25FbGVtZW50KCkpOwotCQlyb2xlRGVzY3JpcHRvckVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldERlc2NyaXB0b3IoKSk7Ci0JCXRhc2tEZXNjcmlwdG9yRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKAotCQkJCXRoaXMuZ2V0V29ya0JyZWFrZG93bkVsZW1lbnQoKSk7Ci0JCXRhc2tEZXNjcmlwdG9yRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0RGVzY3JpcHRvcigpKTsKLQkJY29tcG9zaXRlUm9sZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFJvbGVEZXNjcmlwdG9yKCkpOwotCQlkZWxpdmVyeVByb2Nlc3NFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRQcm9jZXNzKCkpOwotCQlwcm9jZXNzRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0QWN0aXZpdHkoKSk7Ci0JCWNhcGFiaWxpdHlQYXR0ZXJuRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0UHJvY2VzcygpKTsKLQkJbWV0aG9kQ29uZmlndXJhdGlvbkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldE1ldGhvZFVuaXQoKSk7Ci0JCW1ldGhvZFBsdWdpbkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldE1ldGhvZFVuaXQoKSk7Ci0JCW1ldGhvZFBsdWdpbkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFBhY2thZ2UoKSk7Ci0JCXByb2Nlc3NQbGFubmluZ1RlbXBsYXRlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0UHJvY2VzcygpKTsKLQkJcHJhY3RpY2VFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRHdWlkYW5jZSgpKTsKLQkJYnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKAotCQkJCXRoaXMuZ2V0Q29udGVudERlc2NyaXB0aW9uKCkpOwotCQlhY3Rpdml0eURlc2NyaXB0aW9uRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKAotCQkJCXRoaXMuZ2V0QnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uKCkpOwotCQlkZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCgKLQkJCQl0aGlzLmdldFByb2Nlc3NEZXNjcmlwdGlvbigpKTsKLQkJcHJvY2Vzc0Rlc2NyaXB0aW9uRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKAotCQkJCXRoaXMuZ2V0QWN0aXZpdHlEZXNjcmlwdGlvbigpKTsKLQkJZGVzY3JpcHRvckRlc2NyaXB0aW9uRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKAotCQkJCXRoaXMuZ2V0QnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uKCkpOwotCQlwcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvckVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCgKLQkJCQl0aGlzLmdldERlc2NyaXB0b3IoKSk7Ci0JCXByb2Nlc3NDb21wb25lbnRFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRQcm9jZXNzUGFja2FnZSgpKTsKLQkJcHJvY2Vzc0NvbXBvbmVudEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldE1ldGhvZFVuaXQoKSk7Ci0JCXByb2Nlc3NQYWNrYWdlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0TWV0aG9kUGFja2FnZSgpKTsKLQkJZGlhZ3JhbUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEdyYXBoTm9kZSgpKTsKLQkJZ3JhcGhOb2RlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0R3JhcGhFbGVtZW50KCkpOwotCQlncmFwaEVsZW1lbnRFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXREaWFncmFtRWxlbWVudCgpKTsKLQkJZGlhZ3JhbUVsZW1lbnRFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRNZXRob2RFbGVtZW50KCkpOwotCQlyZWZlcmVuY2VFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXREaWFncmFtRWxlbWVudCgpKTsKLQkJcHJvcGVydHlFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXREaWFncmFtRWxlbWVudCgpKTsKLQkJZGlhZ3JhbUxpbmtFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXREaWFncmFtRWxlbWVudCgpKTsKLQkJZ3JhcGhDb25uZWN0b3JFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRHcmFwaEVsZW1lbnQoKSk7Ci0JCWdyYXBoRWRnZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEdyYXBoRWxlbWVudCgpKTsKLQkJc2VtYW50aWNNb2RlbEJyaWRnZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpCi0JCQkJLmFkZCh0aGlzLmdldERpYWdyYW1FbGVtZW50KCkpOwotCQlwcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKAotCQkJCXRoaXMuZ2V0QnJlYWtkb3duRWxlbWVudCgpKTsKLQkJc2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnRFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQoCi0JCQkJdGhpcy5nZXRTZW1hbnRpY01vZGVsQnJpZGdlKCkpOwotCQl1bWFTZW1hbnRpY01vZGVsQnJpZGdlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKAotCQkJCXRoaXMuZ2V0U2VtYW50aWNNb2RlbEJyaWRnZSgpKTsKLQkJY29yZVNlbWFudGljTW9kZWxCcmlkZ2VFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQoCi0JCQkJdGhpcy5nZXRTZW1hbnRpY01vZGVsQnJpZGdlKCkpOwotCQlsZWFmRWxlbWVudEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldERpYWdyYW1FbGVtZW50KCkpOwotCQl0ZXh0RWxlbWVudEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldExlYWZFbGVtZW50KCkpOwotCQlpbWFnZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldExlYWZFbGVtZW50KCkpOwotCQlncmFwaGljUHJpbWl0aXZlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0TGVhZkVsZW1lbnQoKSk7Ci0JCXBvbHlsaW5lRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0R3JhcGhpY1ByaW1pdGl2ZSgpKTsKLQkJZWxsaXBzZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEdyYXBoaWNQcmltaXRpdmUoKSk7Ci0JCXByb2Nlc3NGYW1pbHlFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRNZXRob2RDb25maWd1cmF0aW9uKCkpOwotCQltZXRob2RMaWJyYXJ5RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0TWV0aG9kVW5pdCgpKTsKLQkJbWV0aG9kTGlicmFyeUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFBhY2thZ2UoKSk7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBjbGFzc2VzIGFuZCBmZWF0dXJlczsgYWRkIG9wZXJhdGlvbnMgYW5kIHBhcmFtZXRlcnMKLQkJaW5pdEVDbGFzcygKLQkJCQljbGFzc2lmaWVyRUNsYXNzLAotCQkJCUNsYXNzaWZpZXIuY2xhc3MsCi0JCQkJIkNsYXNzaWZpZXIiLCBJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZSgKLQkJCQlnZXRDbGFzc2lmaWVyX0lzQWJzdHJhY3QoKSwKLQkJCQl0aGlzLmdldEJvb2xlYW4oKSwKLQkJCQkiaXNBYnN0cmFjdCIsICJmYWxzZSIsIDEsIDEsIENsYXNzaWZpZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCQlpbml0RUNsYXNzKHR5cGVFQ2xhc3MsIFR5cGUuY2xhc3MsCi0JCQkJIlR5cGUiLCBJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoCi0JCQkJcGFja2FnZWFibGVFbGVtZW50RUNsYXNzLAotCQkJCVBhY2thZ2VhYmxlRWxlbWVudC5jbGFzcywKLQkJCQkiUGFja2FnZWFibGVFbGVtZW50IiwgSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKAotCQkJCW5hbWVkRWxlbWVudEVDbGFzcywKLQkJCQlOYW1lZEVsZW1lbnQuY2xhc3MsCi0JCQkJIk5hbWVkRWxlbWVudCIsIElTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKAotCQkJCWdldE5hbWVkRWxlbWVudF9OYW1lKCksCi0JCQkJdGhpcy5nZXRTdHJpbmcoKSwKLQkJCQkibmFtZSIsICIiLCAwLCAxLCBOYW1lZEVsZW1lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCQlpbml0RUNsYXNzKAotCQkJCWVsZW1lbnRFQ2xhc3MsCi0JCQkJRWxlbWVudC5jbGFzcywKLQkJCQkiRWxlbWVudCIsIElTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcygKLQkJCQlwYWNrYWdlRUNsYXNzLAotCQkJCW9yZy5lY2xpcHNlLmVwZi51bWEuUGFja2FnZS5jbGFzcywKLQkJCQkiUGFja2FnZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoCi0JCQkJbmFtZXNwYWNlRUNsYXNzLAotCQkJCU5hbWVzcGFjZS5jbGFzcywKLQkJCQkiTmFtZXNwYWNlIiwgSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKAotCQkJCWNvbnN0cmFpbnRFQ2xhc3MsCi0JCQkJQ29uc3RyYWludC5jbGFzcywKLQkJCQkiQ29uc3RyYWludCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZSgKLQkJCQlnZXRDb25zdHJhaW50X0JvZHkoKSwKLQkJCQl0aGlzLmdldFN0cmluZygpLAotCQkJCSJib2R5IiwgIiIsIDAsIDEsIENvbnN0cmFpbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCQlpbml0RUNsYXNzKAotCQkJCW1ldGhvZEVsZW1lbnRFQ2xhc3MsCi0JCQkJTWV0aG9kRWxlbWVudC5jbGFzcywKLQkJCQkiTWV0aG9kRWxlbWVudCIsIElTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKAotCQkJCWdldE1ldGhvZEVsZW1lbnRfR3VpZCgpLAotCQkJCXRoaXMuZ2V0U3RyaW5nKCksCi0JCQkJImd1aWQiLCAiIiwgMCwgMSwgTWV0aG9kRWxlbWVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWluaXRFQXR0cmlidXRlKAotCQkJCWdldE1ldGhvZEVsZW1lbnRfUHJlc2VudGF0aW9uTmFtZSgpLAotCQkJCXRoaXMuZ2V0U3RyaW5nKCksCi0JCQkJInByZXNlbnRhdGlvbk5hbWUiLCAiIiwgMCwgMSwgTWV0aG9kRWxlbWVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlpbml0RUF0dHJpYnV0ZSgKLQkJCQlnZXRNZXRob2RFbGVtZW50X0JyaWVmRGVzY3JpcHRpb24oKSwKLQkJCQl0aGlzLmdldFN0cmluZygpLAotCQkJCSJicmllZkRlc2NyaXB0aW9uIiwgIiIsIDAsIDEsIE1ldGhvZEVsZW1lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0TWV0aG9kRWxlbWVudF9Pd25lZFJ1bGVzKCksCi0JCQkJdGhpcy5nZXRDb25zdHJhaW50KCksCi0JCQkJbnVsbCwKLQkJCQkib3duZWRSdWxlcyIsIG51bGwsIDAsIC0xLCBNZXRob2RFbGVtZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldE1ldGhvZEVsZW1lbnRfTWV0aG9kRWxlbWVudFByb3BlcnR5KCksCi0JCQkJdGhpcy5nZXRNZXRob2RFbGVtZW50UHJvcGVydHkoKSwKLQkJCQludWxsLAotCQkJCSJtZXRob2RFbGVtZW50UHJvcGVydHkiLCBudWxsLCAwLCAtMSwgTWV0aG9kRWxlbWVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRNZXRob2RFbGVtZW50X0tpbmQoKSwKLQkJCQl0aGlzLmdldEtpbmQoKSwKLQkJCQludWxsLAotCQkJCSJraW5kIiwgbnVsbCwgMCwgLTEsIE1ldGhvZEVsZW1lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKAotCQkJCWdldE1ldGhvZEVsZW1lbnRfU3VwcHJlc3NlZCgpLAotCQkJCXRoaXMuZ2V0Qm9vbGVhbigpLAotCQkJCSJzdXBwcmVzc2VkIiwgImZhbHNlIiwgMSwgMSwgTWV0aG9kRWxlbWVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlpbml0RUF0dHJpYnV0ZSgKLQkJCQlnZXRNZXRob2RFbGVtZW50X09yZGVyaW5nR3VpZGUoKSwKLQkJCQl0aGlzLmdldFN0cmluZygpLAotCQkJCSJvcmRlcmluZ0d1aWRlIiwgIiIsIDAsIDEsIE1ldGhvZEVsZW1lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCQlpbml0RUNsYXNzKAotCQkJCW1ldGhvZEVsZW1lbnRQcm9wZXJ0eUVDbGFzcywKLQkJCQlNZXRob2RFbGVtZW50UHJvcGVydHkuY2xhc3MsCi0JCQkJIk1ldGhvZEVsZW1lbnRQcm9wZXJ0eSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZSgKLQkJCQlnZXRNZXRob2RFbGVtZW50UHJvcGVydHlfVmFsdWUoKSwKLQkJCQl0aGlzLmdldFN0cmluZygpLAotCQkJCSJ2YWx1ZSIsICIiLCAwLCAxLCBNZXRob2RFbGVtZW50UHJvcGVydHkuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCQlpbml0RUNsYXNzKAotCQkJCWtpbmRFQ2xhc3MsCi0JCQkJS2luZC5jbGFzcywKLQkJCQkiS2luZCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRLaW5kX0FwcGxpY2FibGVNZXRhQ2xhc3NJbmZvKCksCi0JCQkJdGhpcy5nZXRBcHBsaWNhYmxlTWV0YUNsYXNzSW5mbygpLAotCQkJCW51bGwsCi0JCQkJImFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvIiwgbnVsbCwgMCwgLTEsIEtpbmQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKAotCQkJCWNvbnRlbnRFbGVtZW50RUNsYXNzLAotCQkJCUNvbnRlbnRFbGVtZW50LmNsYXNzLAotCQkJCSJDb250ZW50RWxlbWVudCIsIElTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldENvbnRlbnRFbGVtZW50X1N1cHBvcnRpbmdNYXRlcmlhbHMoKSwKLQkJCQl0aGlzLmdldFN1cHBvcnRpbmdNYXRlcmlhbCgpLAotCQkJCW51bGwsCi0JCQkJInN1cHBvcnRpbmdNYXRlcmlhbHMiLCBudWxsLCAwLCAtMSwgQ29udGVudEVsZW1lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldENvbnRlbnRFbGVtZW50X0NvbmNlcHRzQW5kUGFwZXJzKCksCi0JCQkJdGhpcy5nZXRDb25jZXB0KCksCi0JCQkJbnVsbCwKLQkJCQkiY29uY2VwdHNBbmRQYXBlcnMiLCBudWxsLCAwLCAtMSwgQ29udGVudEVsZW1lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldENvbnRlbnRFbGVtZW50X0NoZWNrbGlzdHMoKSwKLQkJCQl0aGlzLmdldENoZWNrbGlzdCgpLAotCQkJCW51bGwsCi0JCQkJImNoZWNrbGlzdHMiLCBudWxsLCAwLCAtMSwgQ29udGVudEVsZW1lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldENvbnRlbnRFbGVtZW50X0d1aWRlbGluZXMoKSwKLQkJCQl0aGlzLmdldEd1aWRlbGluZSgpLAotCQkJCW51bGwsCi0JCQkJImd1aWRlbGluZXMiLCBudWxsLCAwLCAtMSwgQ29udGVudEVsZW1lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldENvbnRlbnRFbGVtZW50X0V4YW1wbGVzKCksCi0JCQkJdGhpcy5nZXRFeGFtcGxlKCksCi0JCQkJbnVsbCwKLQkJCQkiZXhhbXBsZXMiLCBudWxsLCAwLCAtMSwgQ29udGVudEVsZW1lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldENvbnRlbnRFbGVtZW50X0Fzc2V0cygpLAotCQkJCXRoaXMuZ2V0UmV1c2FibGVBc3NldCgpLAotCQkJCW51bGwsCi0JCQkJImFzc2V0cyIsIG51bGwsIDAsIC0xLCBDb250ZW50RWxlbWVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0Q29udGVudEVsZW1lbnRfVGVybWRlZmluaXRpb24oKSwKLQkJCQl0aGlzLmdldFRlcm1EZWZpbml0aW9uKCksCi0JCQkJbnVsbCwKLQkJCQkidGVybWRlZmluaXRpb24iLCBudWxsLCAwLCAtMSwgQ29udGVudEVsZW1lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcygKLQkJCQlkZXNjcmliYWJsZUVsZW1lbnRFQ2xhc3MsCi0JCQkJRGVzY3JpYmFibGVFbGVtZW50LmNsYXNzLAotCQkJCSJEZXNjcmliYWJsZUVsZW1lbnQiLCBJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXREZXNjcmliYWJsZUVsZW1lbnRfUHJlc2VudGF0aW9uKCksCi0JCQkJdGhpcy5nZXRDb250ZW50RGVzY3JpcHRpb24oKSwKLQkJCQludWxsLAotCQkJCSJwcmVzZW50YXRpb24iLCBudWxsLCAwLCAxLCBEZXNjcmliYWJsZUVsZW1lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoCi0JCQkJZ2V0RGVzY3JpYmFibGVFbGVtZW50X1NoYXBlaWNvbigpLAotCQkJCXRoaXMuZ2V0VXJpKCksCi0JCQkJInNoYXBlaWNvbiIsIG51bGwsIDAsIDEsIERlc2NyaWJhYmxlRWxlbWVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoCi0JCQkJZ2V0RGVzY3JpYmFibGVFbGVtZW50X05vZGVpY29uKCksCi0JCQkJdGhpcy5nZXRVcmkoKSwKLQkJCQkibm9kZWljb24iLCBudWxsLCAwLCAxLCBEZXNjcmliYWJsZUVsZW1lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcygKLQkJCQljb250ZW50RGVzY3JpcHRpb25FQ2xhc3MsCi0JCQkJQ29udGVudERlc2NyaXB0aW9uLmNsYXNzLAotCQkJCSJDb250ZW50RGVzY3JpcHRpb24iLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoCi0JCQkJZ2V0Q29udGVudERlc2NyaXB0aW9uX01haW5EZXNjcmlwdGlvbigpLAotCQkJCXRoaXMuZ2V0U3RyaW5nKCksCi0JCQkJIm1haW5EZXNjcmlwdGlvbiIsICIiLCAwLCAxLCBDb250ZW50RGVzY3JpcHRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0Q29udGVudERlc2NyaXB0aW9uX1NlY3Rpb25zKCksCi0JCQkJdGhpcy5nZXRTZWN0aW9uKCksCi0JCQkJbnVsbCwKLQkJCQkic2VjdGlvbnMiLCBudWxsLCAwLCAtMSwgQ29udGVudERlc2NyaXB0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKAotCQkJCWdldENvbnRlbnREZXNjcmlwdGlvbl9FeHRlcm5hbElkKCksCi0JCQkJdGhpcy5nZXRTdHJpbmcoKSwKLQkJCQkiZXh0ZXJuYWxJZCIsICIiLCAwLCAxLCBDb250ZW50RGVzY3JpcHRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJaW5pdEVBdHRyaWJ1dGUoCi0JCQkJZ2V0Q29udGVudERlc2NyaXB0aW9uX0tleUNvbnNpZGVyYXRpb25zKCksCi0JCQkJdGhpcy5nZXRTdHJpbmcoKSwKLQkJCQkia2V5Q29uc2lkZXJhdGlvbnMiLCAiIiwgMCwgMSwgQ29udGVudERlc2NyaXB0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWluaXRFQXR0cmlidXRlKAotCQkJCWdldENvbnRlbnREZXNjcmlwdGlvbl9Mb25nUHJlc2VudGF0aW9uTmFtZSgpLAotCQkJCXRoaXMuZ2V0U3RyaW5nKCksCi0JCQkJImxvbmdQcmVzZW50YXRpb25OYW1lIiwgbnVsbCwgMSwgMSwgQ29udGVudERlc2NyaXB0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoCi0JCQkJbWV0aG9kVW5pdEVDbGFzcywKLQkJCQlNZXRob2RVbml0LmNsYXNzLAotCQkJCSJNZXRob2RVbml0IiwgSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoCi0JCQkJZ2V0TWV0aG9kVW5pdF9BdXRob3JzKCksCi0JCQkJdGhpcy5nZXRTdHJpbmcoKSwKLQkJCQkiYXV0aG9ycyIsICIiLCAwLCAxLCBNZXRob2RVbml0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWluaXRFQXR0cmlidXRlKAotCQkJCWdldE1ldGhvZFVuaXRfQ2hhbmdlRGF0ZSgpLAotCQkJCXRoaXMuZ2V0RGF0ZSgpLAotCQkJCSJjaGFuZ2VEYXRlIiwgbnVsbCwgMCwgMSwgTWV0aG9kVW5pdC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoCi0JCQkJZ2V0TWV0aG9kVW5pdF9DaGFuZ2VEZXNjcmlwdGlvbigpLAotCQkJCXRoaXMuZ2V0U3RyaW5nKCksCi0JCQkJImNoYW5nZURlc2NyaXB0aW9uIiwgIiIsIDAsIDEsIE1ldGhvZFVuaXQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJaW5pdEVBdHRyaWJ1dGUoCi0JCQkJZ2V0TWV0aG9kVW5pdF9WZXJzaW9uKCksCi0JCQkJdGhpcy5nZXRTdHJpbmcoKSwKLQkJCQkidmVyc2lvbiIsICIiLCAwLCAxLCBNZXRob2RVbml0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldE1ldGhvZFVuaXRfQ29weXJpZ2h0U3RhdGVtZW50KCksCi0JCQkJdGhpcy5nZXRTdXBwb3J0aW5nTWF0ZXJpYWwoKSwKLQkJCQludWxsLAotCQkJCSJjb3B5cmlnaHRTdGF0ZW1lbnQiLCBudWxsLCAwLCAxLCBNZXRob2RVbml0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoCi0JCQkJc3VwcG9ydGluZ01hdGVyaWFsRUNsYXNzLAotCQkJCVN1cHBvcnRpbmdNYXRlcmlhbC5jbGFzcywKLQkJCQkiU3VwcG9ydGluZ01hdGVyaWFsIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcygKLQkJCQlndWlkYW5jZUVDbGFzcywKLQkJCQlHdWlkYW5jZS5jbGFzcywKLQkJCQkiR3VpZGFuY2UiLCBJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoCi0JCQkJc2VjdGlvbkVDbGFzcywKLQkJCQlTZWN0aW9uLmNsYXNzLAotCQkJCSJTZWN0aW9uIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKAotCQkJCWdldFNlY3Rpb25fU2VjdGlvbk5hbWUoKSwKLQkJCQl0aGlzLmdldFN0cmluZygpLAotCQkJCSJzZWN0aW9uTmFtZSIsICIiLCAwLCAxLCBTZWN0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWluaXRFQXR0cmlidXRlKAotCQkJCWdldFNlY3Rpb25fU2VjdGlvbkRlc2NyaXB0aW9uKCksCi0JCQkJdGhpcy5nZXRTdHJpbmcoKSwKLQkJCQkic2VjdGlvbkRlc2NyaXB0aW9uIiwgIiIsIDAsIDEsIFNlY3Rpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0U2VjdGlvbl9TdWJTZWN0aW9ucygpLAotCQkJCXRoaXMuZ2V0U2VjdGlvbigpLAotCQkJCW51bGwsCi0JCQkJInN1YlNlY3Rpb25zIiwgbnVsbCwgMCwgLTEsIFNlY3Rpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0U2VjdGlvbl9QcmVkZWNlc3NvcigpLAotCQkJCXRoaXMuZ2V0U2VjdGlvbigpLAotCQkJCW51bGwsCi0JCQkJInByZWRlY2Vzc29yIiwgbnVsbCwgMCwgMSwgU2VjdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKAotCQkJCXZhcmlhYmlsaXR5RWxlbWVudEVDbGFzcywKLQkJCQlWYXJpYWJpbGl0eUVsZW1lbnQuY2xhc3MsCi0JCQkJIlZhcmlhYmlsaXR5RWxlbWVudCIsIElTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKAotCQkJCWdldFZhcmlhYmlsaXR5RWxlbWVudF9WYXJpYWJpbGl0eVR5cGUoKSwKLQkJCQl0aGlzLmdldFZhcmlhYmlsaXR5VHlwZSgpLAotCQkJCSJ2YXJpYWJpbGl0eVR5cGUiLCAibmEiLCAxLCAxLCBWYXJpYWJpbGl0eUVsZW1lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0VmFyaWFiaWxpdHlFbGVtZW50X1ZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSwKLQkJCQl0aGlzLmdldFZhcmlhYmlsaXR5RWxlbWVudCgpLAotCQkJCW51bGwsCi0JCQkJInZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQiLCBudWxsLCAxLCAxLCBWYXJpYWJpbGl0eUVsZW1lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcygKLQkJCQljb25jZXB0RUNsYXNzLAotCQkJCUNvbmNlcHQuY2xhc3MsCi0JCQkJIkNvbmNlcHQiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKAotCQkJCWNoZWNrbGlzdEVDbGFzcywKLQkJCQlDaGVja2xpc3QuY2xhc3MsCi0JCQkJIkNoZWNrbGlzdCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoCi0JCQkJZ3VpZGVsaW5lRUNsYXNzLAotCQkJCUd1aWRlbGluZS5jbGFzcywKLQkJCQkiR3VpZGVsaW5lIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcygKLQkJCQlleGFtcGxlRUNsYXNzLAotCQkJCUV4YW1wbGUuY2xhc3MsCi0JCQkJIkV4YW1wbGUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKAotCQkJCXJldXNhYmxlQXNzZXRFQ2xhc3MsCi0JCQkJUmV1c2FibGVBc3NldC5jbGFzcywKLQkJCQkiUmV1c2FibGVBc3NldCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoCi0JCQkJdGVybURlZmluaXRpb25FQ2xhc3MsCi0JCQkJVGVybURlZmluaXRpb24uY2xhc3MsCi0JCQkJIlRlcm1EZWZpbml0aW9uIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcygKLQkJCQlhcHBsaWNhYmxlTWV0YUNsYXNzSW5mb0VDbGFzcywKLQkJCQlBcHBsaWNhYmxlTWV0YUNsYXNzSW5mby5jbGFzcywKLQkJCQkiQXBwbGljYWJsZU1ldGFDbGFzc0luZm8iLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoCi0JCQkJZ2V0QXBwbGljYWJsZU1ldGFDbGFzc0luZm9fSXNQcmltYXJ5RXh0ZW5zaW9uKCksCi0JCQkJdGhpcy5nZXRCb29sZWFuKCksCi0JCQkJImlzUHJpbWFyeUV4dGVuc2lvbiIsIG51bGwsIDEsIDEsIEFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoCi0JCQkJYXJ0aWZhY3RFQ2xhc3MsCi0JCQkJQXJ0aWZhY3QuY2xhc3MsCi0JCQkJIkFydGlmYWN0IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldEFydGlmYWN0X0NvbnRhaW5lckFydGlmYWN0KCksCi0JCQkJdGhpcy5nZXRBcnRpZmFjdCgpLAotCQkJCXRoaXMuZ2V0QXJ0aWZhY3RfQ29udGFpbmVkQXJ0aWZhY3RzKCksCi0JCQkJImNvbnRhaW5lckFydGlmYWN0IiwgbnVsbCwgMCwgMSwgQXJ0aWZhY3QuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldEFydGlmYWN0X0NvbnRhaW5lZEFydGlmYWN0cygpLAotCQkJCXRoaXMuZ2V0QXJ0aWZhY3QoKSwKLQkJCQl0aGlzLmdldEFydGlmYWN0X0NvbnRhaW5lckFydGlmYWN0KCksCi0JCQkJImNvbnRhaW5lZEFydGlmYWN0cyIsIG51bGwsIDAsIC0xLCBBcnRpZmFjdC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoCi0JCQkJd29ya1Byb2R1Y3RFQ2xhc3MsCi0JCQkJV29ya1Byb2R1Y3QuY2xhc3MsCi0JCQkJIldvcmtQcm9kdWN0IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldFdvcmtQcm9kdWN0X1JlcG9ydHMoKSwKLQkJCQl0aGlzLmdldFJlcG9ydCgpLAotCQkJCW51bGwsCi0JCQkJInJlcG9ydHMiLCBudWxsLCAwLCAtMSwgV29ya1Byb2R1Y3QuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldFdvcmtQcm9kdWN0X1RlbXBsYXRlcygpLAotCQkJCXRoaXMuZ2V0VGVtcGxhdGUoKSwKLQkJCQludWxsLAotCQkJCSJ0ZW1wbGF0ZXMiLCBudWxsLCAwLCAtMSwgV29ya1Byb2R1Y3QuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldFdvcmtQcm9kdWN0X1Rvb2xNZW50b3JzKCksCi0JCQkJdGhpcy5nZXRUb29sTWVudG9yKCksCi0JCQkJbnVsbCwKLQkJCQkidG9vbE1lbnRvcnMiLCBudWxsLCAwLCAtMSwgV29ya1Byb2R1Y3QuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldFdvcmtQcm9kdWN0X0VzdGltYXRpb25Db25zaWRlcmF0aW9ucygpLAotCQkJCXRoaXMuZ2V0RXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKCksCi0JCQkJbnVsbCwKLQkJCQkiZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIiwgbnVsbCwgMCwgLTEsIFdvcmtQcm9kdWN0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoCi0JCQkJZnVsZmlsbGFibGVFbGVtZW50RUNsYXNzLAotCQkJCUZ1bGZpbGxhYmxlRWxlbWVudC5jbGFzcywKLQkJCQkiRnVsZmlsbGFibGVFbGVtZW50IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldEZ1bGZpbGxhYmxlRWxlbWVudF9GdWxmaWxscygpLAotCQkJCXRoaXMuZ2V0RnVsZmlsbGFibGVFbGVtZW50KCksCi0JCQkJbnVsbCwKLQkJCQkiZnVsZmlsbHMiLCBudWxsLCAwLCAtMSwgRnVsZmlsbGFibGVFbGVtZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoCi0JCQkJcmVwb3J0RUNsYXNzLAotCQkJCVJlcG9ydC5jbGFzcywKLQkJCQkiUmVwb3J0IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcygKLQkJCQl0ZW1wbGF0ZUVDbGFzcywKLQkJCQlUZW1wbGF0ZS5jbGFzcywKLQkJCQkiVGVtcGxhdGUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKAotCQkJCXRvb2xNZW50b3JFQ2xhc3MsCi0JCQkJVG9vbE1lbnRvci5jbGFzcywKLQkJCQkiVG9vbE1lbnRvciIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoCi0JCQkJZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zRUNsYXNzLAotCQkJCUVzdGltYXRpb25Db25zaWRlcmF0aW9ucy5jbGFzcywKLQkJCQkiRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcygKLQkJCQlkZWxpdmVyYWJsZUVDbGFzcywKLQkJCQlEZWxpdmVyYWJsZS5jbGFzcywKLQkJCQkiRGVsaXZlcmFibGUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0RGVsaXZlcmFibGVfRGVsaXZlcmVkV29ya1Byb2R1Y3RzKCksCi0JCQkJdGhpcy5nZXRXb3JrUHJvZHVjdCgpLAotCQkJCW51bGwsCi0JCQkJImRlbGl2ZXJlZFdvcmtQcm9kdWN0cyIsIG51bGwsIDAsIC0xLCBEZWxpdmVyYWJsZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKAotCQkJCW91dGNvbWVFQ2xhc3MsCi0JCQkJT3V0Y29tZS5jbGFzcywKLQkJCQkiT3V0Y29tZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoCi0JCQkJc3RlcEVDbGFzcywKLQkJCQlTdGVwLmNsYXNzLAotCQkJCSJTdGVwIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcygKLQkJCQl3b3JrRGVmaW5pdGlvbkVDbGFzcywKLQkJCQlXb3JrRGVmaW5pdGlvbi5jbGFzcywKLQkJCQkiV29ya0RlZmluaXRpb24iLCBJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRXb3JrRGVmaW5pdGlvbl9QcmVjb25kaXRpb24oKSwKLQkJCQl0aGlzLmdldENvbnN0cmFpbnQoKSwKLQkJCQludWxsLAotCQkJCSJwcmVjb25kaXRpb24iLCBudWxsLCAwLCAxLCBXb3JrRGVmaW5pdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRXb3JrRGVmaW5pdGlvbl9Qb3N0Y29uZGl0aW9uKCksCi0JCQkJdGhpcy5nZXRDb25zdHJhaW50KCksCi0JCQkJbnVsbCwKLQkJCQkicG9zdGNvbmRpdGlvbiIsIG51bGwsIDAsIDEsIFdvcmtEZWZpbml0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcygKLQkJCQl3aGl0ZXBhcGVyRUNsYXNzLAotCQkJCVdoaXRlcGFwZXIuY2xhc3MsCi0JCQkJIldoaXRlcGFwZXIiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKAotCQkJCXRhc2tFQ2xhc3MsCi0JCQkJVGFzay5jbGFzcywKLQkJCQkiVGFzayIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRUYXNrX1BlcmZvcm1lZEJ5KCksCi0JCQkJdGhpcy5nZXRSb2xlKCksCi0JCQkJbnVsbCwKLQkJCQkicGVyZm9ybWVkQnkiLCBudWxsLCAwLCAtMSwgVGFzay5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0VGFza19NYW5kYXRvcnlJbnB1dCgpLAotCQkJCXRoaXMuZ2V0V29ya1Byb2R1Y3QoKSwKLQkJCQludWxsLAotCQkJCSJtYW5kYXRvcnlJbnB1dCIsIG51bGwsIDAsIC0xLCBUYXNrLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRUYXNrX091dHB1dCgpLAotCQkJCXRoaXMuZ2V0V29ya1Byb2R1Y3QoKSwKLQkJCQludWxsLAotCQkJCSJvdXRwdXQiLCBudWxsLCAwLCAtMSwgVGFzay5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0VGFza19BZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSgpLAotCQkJCXRoaXMuZ2V0Um9sZSgpLAotCQkJCW51bGwsCi0JCQkJImFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5IiwgbnVsbCwgMCwgLTEsIFRhc2suY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldFRhc2tfT3B0aW9uYWxJbnB1dCgpLAotCQkJCXRoaXMuZ2V0V29ya1Byb2R1Y3QoKSwKLQkJCQludWxsLAotCQkJCSJvcHRpb25hbElucHV0IiwgbnVsbCwgMCwgLTEsIFRhc2suY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldFRhc2tfU3RlcHMoKSwKLQkJCQl0aGlzLmdldFN0ZXAoKSwKLQkJCQludWxsLAotCQkJCSJzdGVwcyIsIG51bGwsIDAsIC0xLCBUYXNrLmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsIElTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRUYXNrX1Rvb2xNZW50b3JzKCksCi0JCQkJdGhpcy5nZXRUb29sTWVudG9yKCksCi0JCQkJbnVsbCwKLQkJCQkidG9vbE1lbnRvcnMiLCBudWxsLCAwLCAtMSwgVGFzay5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0VGFza19Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMoKSwKLQkJCQl0aGlzLmdldEVzdGltYXRpb25Db25zaWRlcmF0aW9ucygpLAotCQkJCW51bGwsCi0JCQkJImVzdGltYXRpb25Db25zaWRlcmF0aW9ucyIsIG51bGwsIDAsIC0xLCBUYXNrLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoCi0JCQkJcm9sZUVDbGFzcywKLQkJCQlSb2xlLmNsYXNzLAotCQkJCSJSb2xlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldFJvbGVfTW9kaWZpZXMoKSwKLQkJCQl0aGlzLmdldFdvcmtQcm9kdWN0KCksCi0JCQkJbnVsbCwKLQkJCQkibW9kaWZpZXMiLCBudWxsLCAwLCAtMSwgUm9sZS5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCBJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0Um9sZV9SZXNwb25zaWJsZUZvcigpLAotCQkJCXRoaXMuZ2V0V29ya1Byb2R1Y3QoKSwKLQkJCQludWxsLAotCQkJCSJyZXNwb25zaWJsZUZvciIsIG51bGwsIDAsIC0xLCBSb2xlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoCi0JCQkJYXJ0aWZhY3REZXNjcmlwdGlvbkVDbGFzcywKLQkJCQlBcnRpZmFjdERlc2NyaXB0aW9uLmNsYXNzLAotCQkJCSJBcnRpZmFjdERlc2NyaXB0aW9uIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKAotCQkJCWdldEFydGlmYWN0RGVzY3JpcHRpb25fQnJpZWZPdXRsaW5lKCksCi0JCQkJdGhpcy5nZXRTdHJpbmcoKSwKLQkJCQkiYnJpZWZPdXRsaW5lIiwgIiIsIDAsIDEsIEFydGlmYWN0RGVzY3JpcHRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJaW5pdEVBdHRyaWJ1dGUoCi0JCQkJZ2V0QXJ0aWZhY3REZXNjcmlwdGlvbl9SZXByZXNlbnRhdGlvbk9wdGlvbnMoKSwKLQkJCQl0aGlzLmdldFN0cmluZygpLAotCQkJCSJyZXByZXNlbnRhdGlvbk9wdGlvbnMiLCAiIiwgMCwgMSwgQXJ0aWZhY3REZXNjcmlwdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlpbml0RUF0dHJpYnV0ZSgKLQkJCQlnZXRBcnRpZmFjdERlc2NyaXB0aW9uX1JlcHJlc2VudGF0aW9uKCksCi0JCQkJdGhpcy5nZXRTdHJpbmcoKSwKLQkJCQkicmVwcmVzZW50YXRpb24iLCAiIiwgMCwgMSwgQXJ0aWZhY3REZXNjcmlwdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlpbml0RUF0dHJpYnV0ZSgKLQkJCQlnZXRBcnRpZmFjdERlc2NyaXB0aW9uX05vdGF0aW9uKCksCi0JCQkJdGhpcy5nZXRTdHJpbmcoKSwKLQkJCQkibm90YXRpb24iLCAiIiwgMCwgMSwgQXJ0aWZhY3REZXNjcmlwdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JCWluaXRFQ2xhc3MoCi0JCQkJd29ya1Byb2R1Y3REZXNjcmlwdGlvbkVDbGFzcywKLQkJCQlXb3JrUHJvZHVjdERlc2NyaXB0aW9uLmNsYXNzLAotCQkJCSJXb3JrUHJvZHVjdERlc2NyaXB0aW9uIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKAotCQkJCWdldFdvcmtQcm9kdWN0RGVzY3JpcHRpb25fUHVycG9zZSgpLAotCQkJCXRoaXMuZ2V0U3RyaW5nKCksCi0JCQkJInB1cnBvc2UiLCAiIiwgMCwgMSwgV29ya1Byb2R1Y3REZXNjcmlwdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlpbml0RUF0dHJpYnV0ZSgKLQkJCQlnZXRXb3JrUHJvZHVjdERlc2NyaXB0aW9uX0ltcGFjdE9mTm90SGF2aW5nKCksCi0JCQkJdGhpcy5nZXRTdHJpbmcoKSwKLQkJCQkiaW1wYWN0T2ZOb3RIYXZpbmciLCAiIiwgMCwgMSwgV29ya1Byb2R1Y3REZXNjcmlwdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlpbml0RUF0dHJpYnV0ZSgKLQkJCQlnZXRXb3JrUHJvZHVjdERlc2NyaXB0aW9uX1JlYXNvbnNGb3JOb3ROZWVkaW5nKCksCi0JCQkJdGhpcy5nZXRTdHJpbmcoKSwKLQkJCQkicmVhc29uc0Zvck5vdE5lZWRpbmciLCAiIiwgMCwgMSwgV29ya1Byb2R1Y3REZXNjcmlwdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JCWluaXRFQ2xhc3MoCi0JCQkJZGVsaXZlcmFibGVEZXNjcmlwdGlvbkVDbGFzcywKLQkJCQlEZWxpdmVyYWJsZURlc2NyaXB0aW9uLmNsYXNzLAotCQkJCSJEZWxpdmVyYWJsZURlc2NyaXB0aW9uIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKAotCQkJCWdldERlbGl2ZXJhYmxlRGVzY3JpcHRpb25fRXh0ZXJuYWxEZXNjcmlwdGlvbigpLAotCQkJCXRoaXMuZ2V0U3RyaW5nKCksCi0JCQkJImV4dGVybmFsRGVzY3JpcHRpb24iLCAiIiwgMCwgMSwgRGVsaXZlcmFibGVEZXNjcmlwdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlpbml0RUF0dHJpYnV0ZSgKLQkJCQlnZXREZWxpdmVyYWJsZURlc2NyaXB0aW9uX1BhY2thZ2luZ0d1aWRhbmNlKCksCi0JCQkJdGhpcy5nZXRTdHJpbmcoKSwKLQkJCQkicGFja2FnaW5nR3VpZGFuY2UiLCAiIiwgMCwgMSwgRGVsaXZlcmFibGVEZXNjcmlwdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JCWluaXRFQ2xhc3MoCi0JCQkJcm9sZURlc2NyaXB0aW9uRUNsYXNzLAotCQkJCVJvbGVEZXNjcmlwdGlvbi5jbGFzcywKLQkJCQkiUm9sZURlc2NyaXB0aW9uIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKAotCQkJCWdldFJvbGVEZXNjcmlwdGlvbl9Ta2lsbHMoKSwKLQkJCQl0aGlzLmdldFN0cmluZygpLAotCQkJCSJza2lsbHMiLCAiIiwgMCwgMSwgUm9sZURlc2NyaXB0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWluaXRFQXR0cmlidXRlKAotCQkJCWdldFJvbGVEZXNjcmlwdGlvbl9Bc3NpZ25tZW50QXBwcm9hY2hlcygpLAotCQkJCXRoaXMuZ2V0U3RyaW5nKCksCi0JCQkJImFzc2lnbm1lbnRBcHByb2FjaGVzIiwgIiIsIDAsIDEsIFJvbGVEZXNjcmlwdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlpbml0RUF0dHJpYnV0ZSgKLQkJCQlnZXRSb2xlRGVzY3JpcHRpb25fU3lub255bXMoKSwKLQkJCQl0aGlzLmdldFN0cmluZygpLAotCQkJCSJzeW5vbnltcyIsICIiLCAwLCAxLCBSb2xlRGVzY3JpcHRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCQlpbml0RUNsYXNzKAotCQkJCXRhc2tEZXNjcmlwdGlvbkVDbGFzcywKLQkJCQlUYXNrRGVzY3JpcHRpb24uY2xhc3MsCi0JCQkJIlRhc2tEZXNjcmlwdGlvbiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZSgKLQkJCQlnZXRUYXNrRGVzY3JpcHRpb25fUHVycG9zZSgpLAotCQkJCXRoaXMuZ2V0U3RyaW5nKCksCi0JCQkJInB1cnBvc2UiLCAiIiwgMCwgMSwgVGFza0Rlc2NyaXB0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWluaXRFQXR0cmlidXRlKAotCQkJCWdldFRhc2tEZXNjcmlwdGlvbl9BbHRlcm5hdGl2ZXMoKSwKLQkJCQl0aGlzLmdldFN0cmluZygpLAotCQkJCSJhbHRlcm5hdGl2ZXMiLCAiIiwgMCwgMSwgVGFza0Rlc2NyaXB0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkJaW5pdEVDbGFzcygKLQkJCQlndWlkYW5jZURlc2NyaXB0aW9uRUNsYXNzLAotCQkJCUd1aWRhbmNlRGVzY3JpcHRpb24uY2xhc3MsCi0JCQkJIkd1aWRhbmNlRGVzY3JpcHRpb24iLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoCi0JCQkJZ2V0R3VpZGFuY2VEZXNjcmlwdGlvbl9BdHRhY2htZW50cygpLAotCQkJCXRoaXMuZ2V0U3RyaW5nKCksCi0JCQkJImF0dGFjaG1lbnRzIiwgIiIsIDAsIDEsIEd1aWRhbmNlRGVzY3JpcHRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCQlpbml0RUNsYXNzKAotCQkJCXByYWN0aWNlRGVzY3JpcHRpb25FQ2xhc3MsCi0JCQkJUHJhY3RpY2VEZXNjcmlwdGlvbi5jbGFzcywKLQkJCQkiUHJhY3RpY2VEZXNjcmlwdGlvbiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZSgKLQkJCQlnZXRQcmFjdGljZURlc2NyaXB0aW9uX0FkZGl0aW9uYWxJbmZvKCksCi0JCQkJdGhpcy5nZXRTdHJpbmcoKSwKLQkJCQkiYWRkaXRpb25hbEluZm8iLCAiIiwgMCwgMSwgUHJhY3RpY2VEZXNjcmlwdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlpbml0RUF0dHJpYnV0ZSgKLQkJCQlnZXRQcmFjdGljZURlc2NyaXB0aW9uX1Byb2JsZW0oKSwKLQkJCQl0aGlzLmdldFN0cmluZygpLAotCQkJCSJwcm9ibGVtIiwgIiIsIDAsIDEsIFByYWN0aWNlRGVzY3JpcHRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJaW5pdEVBdHRyaWJ1dGUoCi0JCQkJZ2V0UHJhY3RpY2VEZXNjcmlwdGlvbl9CYWNrZ3JvdW5kKCksCi0JCQkJdGhpcy5nZXRTdHJpbmcoKSwKLQkJCQkiYmFja2dyb3VuZCIsICIiLCAwLCAxLCBQcmFjdGljZURlc2NyaXB0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWluaXRFQXR0cmlidXRlKAotCQkJCWdldFByYWN0aWNlRGVzY3JpcHRpb25fR29hbHMoKSwKLQkJCQl0aGlzLmdldFN0cmluZygpLAotCQkJCSJnb2FscyIsICIiLCAwLCAxLCBQcmFjdGljZURlc2NyaXB0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWluaXRFQXR0cmlidXRlKAotCQkJCWdldFByYWN0aWNlRGVzY3JpcHRpb25fQXBwbGljYXRpb24oKSwKLQkJCQl0aGlzLmdldFN0cmluZygpLAotCQkJCSJhcHBsaWNhdGlvbiIsICIiLCAwLCAxLCBQcmFjdGljZURlc2NyaXB0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWluaXRFQXR0cmlidXRlKAotCQkJCWdldFByYWN0aWNlRGVzY3JpcHRpb25fTGV2ZWxzT2ZBZG9wdGlvbigpLAotCQkJCXRoaXMuZ2V0U3RyaW5nKCksCi0JCQkJImxldmVsc09mQWRvcHRpb24iLCAiIiwgMCwgMSwgUHJhY3RpY2VEZXNjcmlwdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JCWluaXRFQ2xhc3MoCi0JCQkJcm9sZVNldEVDbGFzcywKLQkJCQlSb2xlU2V0LmNsYXNzLAotCQkJCSJSb2xlU2V0IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldFJvbGVTZXRfUm9sZXMoKSwKLQkJCQl0aGlzLmdldFJvbGUoKSwKLQkJCQludWxsLAotCQkJCSJyb2xlcyIsIG51bGwsIDAsIC0xLCBSb2xlU2V0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoCi0JCQkJY29udGVudENhdGVnb3J5RUNsYXNzLAotCQkJCUNvbnRlbnRDYXRlZ29yeS5jbGFzcywKLQkJCQkiQ29udGVudENhdGVnb3J5IiwgSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKAotCQkJCWRvbWFpbkVDbGFzcywKLQkJCQlEb21haW4uY2xhc3MsCi0JCQkJIkRvbWFpbiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXREb21haW5fV29ya1Byb2R1Y3RzKCksCi0JCQkJdGhpcy5nZXRXb3JrUHJvZHVjdCgpLAotCQkJCW51bGwsCi0JCQkJIndvcmtQcm9kdWN0cyIsIG51bGwsIDAsIC0xLCBEb21haW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldERvbWFpbl9TdWJkb21haW5zKCksCi0JCQkJdGhpcy5nZXREb21haW4oKSwKLQkJCQludWxsLAotCQkJCSJzdWJkb21haW5zIiwgbnVsbCwgMCwgLTEsIERvbWFpbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoCi0JCQkJd29ya1Byb2R1Y3RUeXBlRUNsYXNzLAotCQkJCVdvcmtQcm9kdWN0VHlwZS5jbGFzcywKLQkJCQkiV29ya1Byb2R1Y3RUeXBlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldFdvcmtQcm9kdWN0VHlwZV9Xb3JrUHJvZHVjdHMoKSwKLQkJCQl0aGlzLmdldFdvcmtQcm9kdWN0KCksCi0JCQkJbnVsbCwKLQkJCQkid29ya1Byb2R1Y3RzIiwgbnVsbCwgMCwgLTEsIFdvcmtQcm9kdWN0VHlwZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKAotCQkJCWRpc2NpcGxpbmVHcm91cGluZ0VDbGFzcywKLQkJCQlEaXNjaXBsaW5lR3JvdXBpbmcuY2xhc3MsCi0JCQkJIkRpc2NpcGxpbmVHcm91cGluZyIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXREaXNjaXBsaW5lR3JvdXBpbmdfRGlzY2lwbGluZXMoKSwKLQkJCQl0aGlzLmdldERpc2NpcGxpbmUoKSwKLQkJCQludWxsLAotCQkJCSJkaXNjaXBsaW5lcyIsIG51bGwsIDAsIC0xLCBEaXNjaXBsaW5lR3JvdXBpbmcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcygKLQkJCQlkaXNjaXBsaW5lRUNsYXNzLAotCQkJCURpc2NpcGxpbmUuY2xhc3MsCi0JCQkJIkRpc2NpcGxpbmUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0RGlzY2lwbGluZV9UYXNrcygpLAotCQkJCXRoaXMuZ2V0VGFzaygpLAotCQkJCW51bGwsCi0JCQkJInRhc2tzIiwgbnVsbCwgMCwgLTEsIERpc2NpcGxpbmUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldERpc2NpcGxpbmVfU3ViZGlzY2lwbGluZSgpLAotCQkJCXRoaXMuZ2V0RGlzY2lwbGluZSgpLAotCQkJCW51bGwsCi0JCQkJInN1YmRpc2NpcGxpbmUiLCBudWxsLCAwLCAtMSwgRGlzY2lwbGluZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXREaXNjaXBsaW5lX1JlZmVyZW5jZVdvcmtmbG93cygpLAotCQkJCXRoaXMuZ2V0QWN0aXZpdHkoKSwKLQkJCQludWxsLAotCQkJCSJyZWZlcmVuY2VXb3JrZmxvd3MiLCBudWxsLCAwLCAtMSwgRGlzY2lwbGluZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKAotCQkJCWFjdGl2aXR5RUNsYXNzLAotCQkJCUFjdGl2aXR5LmNsYXNzLAotCQkJCSJBY3Rpdml0eSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRBY3Rpdml0eV9CcmVha2Rvd25FbGVtZW50cygpLAotCQkJCXRoaXMuZ2V0QnJlYWtkb3duRWxlbWVudCgpLAotCQkJCXRoaXMuZ2V0QnJlYWtkb3duRWxlbWVudF9TdXBlckFjdGl2aXRpZXMoKSwKLQkJCQkiYnJlYWtkb3duRWxlbWVudHMiLCBudWxsLCAwLCAtMSwgQWN0aXZpdHkuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldEFjdGl2aXR5X1JvYWRtYXBzKCksCi0JCQkJdGhpcy5nZXRSb2FkbWFwKCksCi0JCQkJbnVsbCwKLQkJCQkicm9hZG1hcHMiLCBudWxsLCAwLCAtMSwgQWN0aXZpdHkuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcygKLQkJCQl3b3JrQnJlYWtkb3duRWxlbWVudEVDbGFzcywKLQkJCQlXb3JrQnJlYWtkb3duRWxlbWVudC5jbGFzcywKLQkJCQkiV29ya0JyZWFrZG93bkVsZW1lbnQiLCBJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZSgKLQkJCQlnZXRXb3JrQnJlYWtkb3duRWxlbWVudF9Jc1JlcGVhdGFibGUoKSwKLQkJCQl0aGlzLmdldEJvb2xlYW4oKSwKLQkJCQkiaXNSZXBlYXRhYmxlIiwgImZhbHNlIiwgMSwgMSwgV29ya0JyZWFrZG93bkVsZW1lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJaW5pdEVBdHRyaWJ1dGUoCi0JCQkJZ2V0V29ya0JyZWFrZG93bkVsZW1lbnRfSXNPbmdvaW5nKCksCi0JCQkJdGhpcy5nZXRCb29sZWFuKCksCi0JCQkJImlzT25nb2luZyIsICJmYWxzZSIsIDEsIDEsIFdvcmtCcmVha2Rvd25FbGVtZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWluaXRFQXR0cmlidXRlKAotCQkJCWdldFdvcmtCcmVha2Rvd25FbGVtZW50X0lzRXZlbnREcml2ZW4oKSwKLQkJCQl0aGlzLmdldEJvb2xlYW4oKSwKLQkJCQkiaXNFdmVudERyaXZlbiIsICJmYWxzZSIsIDEsIDEsIFdvcmtCcmVha2Rvd25FbGVtZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldFdvcmtCcmVha2Rvd25FbGVtZW50X0xpbmtUb1ByZWRlY2Vzc29yKCksCi0JCQkJdGhpcy5nZXRXb3JrT3JkZXIoKSwKLQkJCQludWxsLAotCQkJCSJsaW5rVG9QcmVkZWNlc3NvciIsIG51bGwsIDAsIC0xLCBXb3JrQnJlYWtkb3duRWxlbWVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKAotCQkJCWJyZWFrZG93bkVsZW1lbnRFQ2xhc3MsCi0JCQkJQnJlYWtkb3duRWxlbWVudC5jbGFzcywKLQkJCQkiQnJlYWtkb3duRWxlbWVudCIsIElTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKAotCQkJCWdldEJyZWFrZG93bkVsZW1lbnRfUHJlZml4KCksCi0JCQkJdGhpcy5nZXRTdHJpbmcoKSwKLQkJCQkicHJlZml4IiwgIiIsIDAsIDEsIEJyZWFrZG93bkVsZW1lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJaW5pdEVBdHRyaWJ1dGUoCi0JCQkJZ2V0QnJlYWtkb3duRWxlbWVudF9Jc1BsYW5uZWQoKSwKLQkJCQl0aGlzLmdldEJvb2xlYW4oKSwKLQkJCQkiaXNQbGFubmVkIiwgInRydWUiLCAxLCAxLCBCcmVha2Rvd25FbGVtZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWluaXRFQXR0cmlidXRlKAotCQkJCWdldEJyZWFrZG93bkVsZW1lbnRfSGFzTXVsdGlwbGVPY2N1cnJlbmNlcygpLAotCQkJCXRoaXMuZ2V0Qm9vbGVhbigpLAotCQkJCSJoYXNNdWx0aXBsZU9jY3VycmVuY2VzIiwgImZhbHNlIiwgMSwgMSwgQnJlYWtkb3duRWxlbWVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlpbml0RUF0dHJpYnV0ZSgKLQkJCQlnZXRCcmVha2Rvd25FbGVtZW50X0lzT3B0aW9uYWwoKSwKLQkJCQl0aGlzLmdldEJvb2xlYW4oKSwKLQkJCQkiaXNPcHRpb25hbCIsICJmYWxzZSIsIDEsIDEsIEJyZWFrZG93bkVsZW1lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0QnJlYWtkb3duRWxlbWVudF9QcmVzZW50ZWRBZnRlcigpLAotCQkJCXRoaXMuZ2V0QnJlYWtkb3duRWxlbWVudCgpLAotCQkJCW51bGwsCi0JCQkJInByZXNlbnRlZEFmdGVyIiwgbnVsbCwgMCwgMSwgQnJlYWtkb3duRWxlbWVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0QnJlYWtkb3duRWxlbWVudF9QcmVzZW50ZWRCZWZvcmUoKSwKLQkJCQl0aGlzLmdldEJyZWFrZG93bkVsZW1lbnQoKSwKLQkJCQludWxsLAotCQkJCSJwcmVzZW50ZWRCZWZvcmUiLCBudWxsLCAwLCAxLCBCcmVha2Rvd25FbGVtZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRCcmVha2Rvd25FbGVtZW50X1BsYW5uaW5nRGF0YSgpLAotCQkJCXRoaXMuZ2V0UGxhbm5pbmdEYXRhKCksCi0JCQkJbnVsbCwKLQkJCQkicGxhbm5pbmdEYXRhIiwgbnVsbCwgMCwgMSwgQnJlYWtkb3duRWxlbWVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRCcmVha2Rvd25FbGVtZW50X1N1cGVyQWN0aXZpdGllcygpLAotCQkJCXRoaXMuZ2V0QWN0aXZpdHkoKSwKLQkJCQl0aGlzLmdldEFjdGl2aXR5X0JyZWFrZG93bkVsZW1lbnRzKCksCi0JCQkJInN1cGVyQWN0aXZpdGllcyIsIG51bGwsIDEsIDEsIEJyZWFrZG93bkVsZW1lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldEJyZWFrZG93bkVsZW1lbnRfQ2hlY2tsaXN0cygpLAotCQkJCXRoaXMuZ2V0Q2hlY2tsaXN0KCksCi0JCQkJbnVsbCwKLQkJCQkiY2hlY2tsaXN0cyIsIG51bGwsIDAsIC0xLCBCcmVha2Rvd25FbGVtZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRCcmVha2Rvd25FbGVtZW50X0NvbmNlcHRzKCksCi0JCQkJdGhpcy5nZXRDb25jZXB0KCksCi0JCQkJbnVsbCwKLQkJCQkiY29uY2VwdHMiLCBudWxsLCAwLCAtMSwgQnJlYWtkb3duRWxlbWVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0QnJlYWtkb3duRWxlbWVudF9FeGFtcGxlcygpLAotCQkJCXRoaXMuZ2V0RXhhbXBsZSgpLAotCQkJCW51bGwsCi0JCQkJImV4YW1wbGVzIiwgbnVsbCwgMCwgLTEsIEJyZWFrZG93bkVsZW1lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldEJyZWFrZG93bkVsZW1lbnRfR3VpZGVsaW5lcygpLAotCQkJCXRoaXMuZ2V0R3VpZGVsaW5lKCksCi0JCQkJbnVsbCwKLQkJCQkiZ3VpZGVsaW5lcyIsIG51bGwsIDAsIC0xLCBCcmVha2Rvd25FbGVtZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRCcmVha2Rvd25FbGVtZW50X1JldXNhYmxlQXNzZXRzKCksCi0JCQkJdGhpcy5nZXRSZXVzYWJsZUFzc2V0KCksCi0JCQkJbnVsbCwKLQkJCQkicmV1c2FibGVBc3NldHMiLCBudWxsLCAwLCAtMSwgQnJlYWtkb3duRWxlbWVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0QnJlYWtkb3duRWxlbWVudF9TdXBwb3J0aW5nTWF0ZXJpYWxzKCksCi0JCQkJdGhpcy5nZXRTdXBwb3J0aW5nTWF0ZXJpYWwoKSwKLQkJCQludWxsLAotCQkJCSJzdXBwb3J0aW5nTWF0ZXJpYWxzIiwgbnVsbCwgMCwgLTEsIEJyZWFrZG93bkVsZW1lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldEJyZWFrZG93bkVsZW1lbnRfVGVtcGxhdGVzKCksCi0JCQkJdGhpcy5nZXRUZW1wbGF0ZSgpLAotCQkJCW51bGwsCi0JCQkJInRlbXBsYXRlcyIsIG51bGwsIDAsIC0xLCBCcmVha2Rvd25FbGVtZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRCcmVha2Rvd25FbGVtZW50X1JlcG9ydHMoKSwKLQkJCQl0aGlzLmdldFJlcG9ydCgpLAotCQkJCW51bGwsCi0JCQkJInJlcG9ydHMiLCBudWxsLCAwLCAtMSwgQnJlYWtkb3duRWxlbWVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0QnJlYWtkb3duRWxlbWVudF9Fc3RpbWF0aW9uY29uc2lkZXJhdGlvbnMoKSwKLQkJCQl0aGlzLmdldEVzdGltYXRpb25Db25zaWRlcmF0aW9ucygpLAotCQkJCW51bGwsCi0JCQkJImVzdGltYXRpb25jb25zaWRlcmF0aW9ucyIsIG51bGwsIDAsIC0xLCBCcmVha2Rvd25FbGVtZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRCcmVha2Rvd25FbGVtZW50X1Rvb2xtZW50b3IoKSwKLQkJCQl0aGlzLmdldFRvb2xNZW50b3IoKSwKLQkJCQludWxsLAotCQkJCSJ0b29sbWVudG9yIiwgbnVsbCwgMCwgLTEsIEJyZWFrZG93bkVsZW1lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcygKLQkJCQlwcm9jZXNzRWxlbWVudEVDbGFzcywKLQkJCQlQcm9jZXNzRWxlbWVudC5jbGFzcywKLQkJCQkiUHJvY2Vzc0VsZW1lbnQiLCBJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoCi0JCQkJcGxhbm5pbmdEYXRhRUNsYXNzLAotCQkJCVBsYW5uaW5nRGF0YS5jbGFzcywKLQkJCQkiUGxhbm5pbmdEYXRhIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKAotCQkJCWdldFBsYW5uaW5nRGF0YV9TdGFydERhdGUoKSwKLQkJCQl0aGlzLmdldERhdGUoKSwKLQkJCQkic3RhcnREYXRlIiwgbnVsbCwgMSwgMSwgUGxhbm5pbmdEYXRhLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZSgKLQkJCQlnZXRQbGFubmluZ0RhdGFfRmluaXNoRGF0ZSgpLAotCQkJCXRoaXMuZ2V0RGF0ZSgpLAotCQkJCSJmaW5pc2hEYXRlIiwgbnVsbCwgMSwgMSwgUGxhbm5pbmdEYXRhLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZSgKLQkJCQlnZXRQbGFubmluZ0RhdGFfUmFuaygpLAotCQkJCXRoaXMuZ2V0SW50ZWdlcigpLAotCQkJCSJyYW5rIiwgbnVsbCwgMSwgMSwgUGxhbm5pbmdEYXRhLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoCi0JCQkJd29ya09yZGVyRUNsYXNzLAotCQkJCVdvcmtPcmRlci5jbGFzcywKLQkJCQkiV29ya09yZGVyIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKAotCQkJCWdldFdvcmtPcmRlcl9MaW5rVHlwZSgpLAotCQkJCXRoaXMuZ2V0V29ya09yZGVyVHlwZSgpLAotCQkJCSJsaW5rVHlwZSIsICJmaW5pc2hUb1N0YXJ0IiwgMSwgMSwgV29ya09yZGVyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldFdvcmtPcmRlcl9QcmVkKCksCi0JCQkJdGhpcy5nZXRXb3JrQnJlYWtkb3duRWxlbWVudCgpLAotCQkJCW51bGwsCi0JCQkJInByZWQiLCBudWxsLCAxLCAxLCBXb3JrT3JkZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcygKLQkJCQlyb2FkbWFwRUNsYXNzLAotCQkJCVJvYWRtYXAuY2xhc3MsCi0JCQkJIlJvYWRtYXAiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKAotCQkJCXRvb2xFQ2xhc3MsCi0JCQkJVG9vbC5jbGFzcywKLQkJCQkiVG9vbCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRUb29sX1Rvb2xNZW50b3JzKCksCi0JCQkJdGhpcy5nZXRUb29sTWVudG9yKCksCi0JCQkJbnVsbCwKLQkJCQkidG9vbE1lbnRvcnMiLCBudWxsLCAwLCAtMSwgVG9vbC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKAotCQkJCXJvbGVTZXRHcm91cGluZ0VDbGFzcywKLQkJCQlSb2xlU2V0R3JvdXBpbmcuY2xhc3MsCi0JCQkJIlJvbGVTZXRHcm91cGluZyIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRSb2xlU2V0R3JvdXBpbmdfUm9sZVNldHMoKSwKLQkJCQl0aGlzLmdldFJvbGVTZXQoKSwKLQkJCQludWxsLAotCQkJCSJyb2xlU2V0cyIsIG51bGwsIDAsIC0xLCBSb2xlU2V0R3JvdXBpbmcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcygKLQkJCQljdXN0b21DYXRlZ29yeUVDbGFzcywKLQkJCQlDdXN0b21DYXRlZ29yeS5jbGFzcywKLQkJCQkiQ3VzdG9tQ2F0ZWdvcnkiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0Q3VzdG9tQ2F0ZWdvcnlfQ2F0ZWdvcml6ZWRFbGVtZW50cygpLAotCQkJCXRoaXMuZ2V0RGVzY3JpYmFibGVFbGVtZW50KCksCi0JCQkJbnVsbCwKLQkJCQkiY2F0ZWdvcml6ZWRFbGVtZW50cyIsIG51bGwsIDAsIC0xLCBDdXN0b21DYXRlZ29yeS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0Q3VzdG9tQ2F0ZWdvcnlfU3ViQ2F0ZWdvcmllcygpLAotCQkJCXRoaXMuZ2V0Q29udGVudENhdGVnb3J5KCksCi0JCQkJbnVsbCwKLQkJCQkic3ViQ2F0ZWdvcmllcyIsIG51bGwsIDAsIC0xLCBDdXN0b21DYXRlZ29yeS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKAotCQkJCW1ldGhvZFBhY2thZ2VFQ2xhc3MsCi0JCQkJTWV0aG9kUGFja2FnZS5jbGFzcywKLQkJCQkiTWV0aG9kUGFja2FnZSIsIElTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKAotCQkJCWdldE1ldGhvZFBhY2thZ2VfR2xvYmFsKCksCi0JCQkJdGhpcy5nZXRCb29sZWFuKCksCi0JCQkJImdsb2JhbCIsICJmYWxzZSIsIDEsIDEsIE1ldGhvZFBhY2thZ2UuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0TWV0aG9kUGFja2FnZV9SZXVzZWRQYWNrYWdlcygpLAotCQkJCXRoaXMuZ2V0TWV0aG9kUGFja2FnZSgpLAotCQkJCW51bGwsCi0JCQkJInJldXNlZFBhY2thZ2VzIiwgbnVsbCwgMCwgLTEsIE1ldGhvZFBhY2thZ2UuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldE1ldGhvZFBhY2thZ2VfQ2hpbGRQYWNrYWdlcygpLAotCQkJCXRoaXMuZ2V0TWV0aG9kUGFja2FnZSgpLAotCQkJCW51bGwsCi0JCQkJImNoaWxkUGFja2FnZXMiLCBudWxsLCAwLCAtMSwgTWV0aG9kUGFja2FnZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoCi0JCQkJY29udGVudFBhY2thZ2VFQ2xhc3MsCi0JCQkJQ29udGVudFBhY2thZ2UuY2xhc3MsCi0JCQkJIkNvbnRlbnRQYWNrYWdlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldENvbnRlbnRQYWNrYWdlX0NvbnRlbnRFbGVtZW50cygpLAotCQkJCXRoaXMuZ2V0Q29udGVudEVsZW1lbnQoKSwKLQkJCQludWxsLAotCQkJCSJjb250ZW50RWxlbWVudHMiLCBudWxsLCAwLCAtMSwgQ29udGVudFBhY2thZ2UuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKAotCQkJCW1pbGVzdG9uZUVDbGFzcywKLQkJCQlNaWxlc3RvbmUuY2xhc3MsCi0JCQkJIk1pbGVzdG9uZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRNaWxlc3RvbmVfUmVxdWlyZWRSZXN1bHRzKCksCi0JCQkJdGhpcy5nZXRXb3JrUHJvZHVjdERlc2NyaXB0b3IoKSwKLQkJCQludWxsLAotCQkJCSJyZXF1aXJlZFJlc3VsdHMiLCBudWxsLCAwLCAtMSwgTWlsZXN0b25lLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoCi0JCQkJd29ya1Byb2R1Y3REZXNjcmlwdG9yRUNsYXNzLAotCQkJCVdvcmtQcm9kdWN0RGVzY3JpcHRvci5jbGFzcywKLQkJCQkiV29ya1Byb2R1Y3REZXNjcmlwdG9yIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKAotCQkJCWdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9BY3Rpdml0eUVudHJ5U3RhdGUoKSwKLQkJCQl0aGlzLmdldFN0cmluZygpLAotCQkJCSJhY3Rpdml0eUVudHJ5U3RhdGUiLCAiIiwgMCwgMSwgV29ya1Byb2R1Y3REZXNjcmlwdG9yLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWluaXRFQXR0cmlidXRlKAotCQkJCWdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9BY3Rpdml0eUV4aXRTdGF0ZSgpLAotCQkJCXRoaXMuZ2V0U3RyaW5nKCksCi0JCQkJImFjdGl2aXR5RXhpdFN0YXRlIiwgIiIsIDAsIDEsIFdvcmtQcm9kdWN0RGVzY3JpcHRvci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JfV29ya1Byb2R1Y3QoKSwKLQkJCQl0aGlzLmdldFdvcmtQcm9kdWN0KCksCi0JCQkJbnVsbCwKLQkJCQkiV29ya1Byb2R1Y3QiLCBudWxsLCAwLCAxLCBXb3JrUHJvZHVjdERlc2NyaXB0b3IuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9JbXBhY3RlZEJ5KCksCi0JCQkJdGhpcy5nZXRXb3JrUHJvZHVjdERlc2NyaXB0b3IoKSwKLQkJCQl0aGlzLmdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9JbXBhY3RzKCksCi0JCQkJImltcGFjdGVkQnkiLCBudWxsLCAwLCAtMSwgV29ya1Byb2R1Y3REZXNjcmlwdG9yLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JfSW1wYWN0cygpLAotCQkJCXRoaXMuZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yKCksCi0JCQkJdGhpcy5nZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JfSW1wYWN0ZWRCeSgpLAotCQkJCSJpbXBhY3RzIiwgbnVsbCwgMCwgLTEsIFdvcmtQcm9kdWN0RGVzY3JpcHRvci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX0RlbGl2ZXJhYmxlUGFydHMoKSwKLQkJCQl0aGlzLmdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcigpLAotCQkJCW51bGwsCi0JCQkJImRlbGl2ZXJhYmxlUGFydHMiLCBudWxsLCAwLCAtMSwgV29ya1Byb2R1Y3REZXNjcmlwdG9yLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoCi0JCQkJZGVzY3JpcHRvckVDbGFzcywKLQkJCQlvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaXB0b3IuY2xhc3MsCi0JCQkJIkRlc2NyaXB0b3IiLCBJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZSgKLQkJCQlnZXREZXNjcmlwdG9yX0lzU3luY2hyb25pemVkV2l0aFNvdXJjZSgpLAotCQkJCXRoaXMuZ2V0Qm9vbGVhbigpLAotCQkJCSJpc1N5bmNocm9uaXplZFdpdGhTb3VyY2UiLCAidHJ1ZSIsIDEsIDEsIG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpcHRvci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JCWluaXRFQ2xhc3MoCi0JCQkJaXRlcmF0aW9uRUNsYXNzLAotCQkJCUl0ZXJhdGlvbi5jbGFzcywKLQkJCQkiSXRlcmF0aW9uIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcygKLQkJCQlwaGFzZUVDbGFzcywKLQkJCQlQaGFzZS5jbGFzcywKLQkJCQkiUGhhc2UiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKAotCQkJCXRlYW1Qcm9maWxlRUNsYXNzLAotCQkJCVRlYW1Qcm9maWxlLmNsYXNzLAotCQkJCSJUZWFtUHJvZmlsZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRUZWFtUHJvZmlsZV9UZWFtUm9sZXMoKSwKLQkJCQl0aGlzLmdldFJvbGVEZXNjcmlwdG9yKCksCi0JCQkJbnVsbCwKLQkJCQkidGVhbVJvbGVzIiwgbnVsbCwgMCwgLTEsIFRlYW1Qcm9maWxlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRUZWFtUHJvZmlsZV9TdXBlclRlYW0oKSwKLQkJCQl0aGlzLmdldFRlYW1Qcm9maWxlKCksCi0JCQkJdGhpcy5nZXRUZWFtUHJvZmlsZV9TdWJUZWFtKCksCi0JCQkJInN1cGVyVGVhbSIsIG51bGwsIDEsIDEsIFRlYW1Qcm9maWxlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRUZWFtUHJvZmlsZV9TdWJUZWFtKCksCi0JCQkJdGhpcy5nZXRUZWFtUHJvZmlsZSgpLAotCQkJCXRoaXMuZ2V0VGVhbVByb2ZpbGVfU3VwZXJUZWFtKCksCi0JCQkJInN1YlRlYW0iLCBudWxsLCAwLCAtMSwgVGVhbVByb2ZpbGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcygKLQkJCQlyb2xlRGVzY3JpcHRvckVDbGFzcywKLQkJCQlSb2xlRGVzY3JpcHRvci5jbGFzcywKLQkJCQkiUm9sZURlc2NyaXB0b3IiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0Um9sZURlc2NyaXB0b3JfUm9sZSgpLAotCQkJCXRoaXMuZ2V0Um9sZSgpLAotCQkJCW51bGwsCi0JCQkJIlJvbGUiLCBudWxsLCAwLCAxLCBSb2xlRGVzY3JpcHRvci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0Um9sZURlc2NyaXB0b3JfTW9kaWZpZXMoKSwKLQkJCQl0aGlzLmdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcigpLAotCQkJCW51bGwsCi0JCQkJIm1vZGlmaWVzIiwgbnVsbCwgMCwgLTEsIFJvbGVEZXNjcmlwdG9yLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCBJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0Um9sZURlc2NyaXB0b3JfUmVzcG9uc2libGVGb3IoKSwKLQkJCQl0aGlzLmdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcigpLAotCQkJCW51bGwsCi0JCQkJInJlc3BvbnNpYmxlRm9yIiwgbnVsbCwgMCwgLTEsIFJvbGVEZXNjcmlwdG9yLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoCi0JCQkJdGFza0Rlc2NyaXB0b3JFQ2xhc3MsCi0JCQkJVGFza0Rlc2NyaXB0b3IuY2xhc3MsCi0JCQkJIlRhc2tEZXNjcmlwdG9yIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldFRhc2tEZXNjcmlwdG9yX1Rhc2soKSwKLQkJCQl0aGlzLmdldFRhc2soKSwKLQkJCQludWxsLAotCQkJCSJUYXNrIiwgbnVsbCwgMCwgMSwgVGFza0Rlc2NyaXB0b3IuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldFRhc2tEZXNjcmlwdG9yX0FkZGl0aW9uYWxseVBlcmZvcm1lZEJ5KCksCi0JCQkJdGhpcy5nZXRSb2xlRGVzY3JpcHRvcigpLAotCQkJCW51bGwsCi0JCQkJImFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5IiwgbnVsbCwgMCwgLTEsIFRhc2tEZXNjcmlwdG9yLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRUYXNrRGVzY3JpcHRvcl9Bc3Npc3RlZEJ5KCksCi0JCQkJdGhpcy5nZXRSb2xlRGVzY3JpcHRvcigpLAotCQkJCW51bGwsCi0JCQkJImFzc2lzdGVkQnkiLCBudWxsLCAwLCAtMSwgVGFza0Rlc2NyaXB0b3IuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldFRhc2tEZXNjcmlwdG9yX0V4dGVybmFsSW5wdXQoKSwKLQkJCQl0aGlzLmdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcigpLAotCQkJCW51bGwsCi0JCQkJImV4dGVybmFsSW5wdXQiLCBudWxsLCAwLCAtMSwgVGFza0Rlc2NyaXB0b3IuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldFRhc2tEZXNjcmlwdG9yX01hbmRhdG9yeUlucHV0KCksCi0JCQkJdGhpcy5nZXRXb3JrUHJvZHVjdERlc2NyaXB0b3IoKSwKLQkJCQludWxsLAotCQkJCSJtYW5kYXRvcnlJbnB1dCIsIG51bGwsIDAsIC0xLCBUYXNrRGVzY3JpcHRvci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0VGFza0Rlc2NyaXB0b3JfT3B0aW9uYWxJbnB1dCgpLAotCQkJCXRoaXMuZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yKCksCi0JCQkJbnVsbCwKLQkJCQkib3B0aW9uYWxJbnB1dCIsIG51bGwsIDAsIC0xLCBUYXNrRGVzY3JpcHRvci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0VGFza0Rlc2NyaXB0b3JfT3V0cHV0KCksCi0JCQkJdGhpcy5nZXRXb3JrUHJvZHVjdERlc2NyaXB0b3IoKSwKLQkJCQludWxsLAotCQkJCSJvdXRwdXQiLCBudWxsLCAwLCAtMSwgVGFza0Rlc2NyaXB0b3IuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldFRhc2tEZXNjcmlwdG9yX1BlcmZvcm1lZFByaW1hcmlseUJ5KCksCi0JCQkJdGhpcy5nZXRSb2xlRGVzY3JpcHRvcigpLAotCQkJCW51bGwsCi0JCQkJInBlcmZvcm1lZFByaW1hcmlseUJ5IiwgbnVsbCwgMCwgLTEsIFRhc2tEZXNjcmlwdG9yLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRUYXNrRGVzY3JpcHRvcl9TZWxlY3RlZFN0ZXBzKCksCi0JCQkJdGhpcy5nZXRTZWN0aW9uKCksCi0JCQkJbnVsbCwKLQkJCQkic2VsZWN0ZWRTdGVwcyIsIG51bGwsIDAsIC0xLCBUYXNrRGVzY3JpcHRvci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKAotCQkJCWNvbXBvc2l0ZVJvbGVFQ2xhc3MsCi0JCQkJQ29tcG9zaXRlUm9sZS5jbGFzcywKLQkJCQkiQ29tcG9zaXRlUm9sZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRDb21wb3NpdGVSb2xlX0FnZ3JlZ2F0ZWRSb2xlcygpLAotCQkJCXRoaXMuZ2V0Um9sZSgpLAotCQkJCW51bGwsCi0JCQkJImFnZ3JlZ2F0ZWRSb2xlcyIsIG51bGwsIDAsIC0xLCBDb21wb3NpdGVSb2xlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoCi0JCQkJZGVsaXZlcnlQcm9jZXNzRUNsYXNzLAotCQkJCURlbGl2ZXJ5UHJvY2Vzcy5jbGFzcywKLQkJCQkiRGVsaXZlcnlQcm9jZXNzIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldERlbGl2ZXJ5UHJvY2Vzc19FZHVjYXRpb25NYXRlcmlhbHMoKSwKLQkJCQl0aGlzLmdldFN1cHBvcnRpbmdNYXRlcmlhbCgpLAotCQkJCW51bGwsCi0JCQkJImVkdWNhdGlvbk1hdGVyaWFscyIsIG51bGwsIDAsIC0xLCBEZWxpdmVyeVByb2Nlc3MuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldERlbGl2ZXJ5UHJvY2Vzc19Db21tdW5pY2F0aW9uc01hdGVyaWFscygpLAotCQkJCXRoaXMuZ2V0U3VwcG9ydGluZ01hdGVyaWFsKCksCi0JCQkJbnVsbCwKLQkJCQkiY29tbXVuaWNhdGlvbnNNYXRlcmlhbHMiLCBudWxsLCAwLCAtMSwgRGVsaXZlcnlQcm9jZXNzLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoCi0JCQkJcHJvY2Vzc0VDbGFzcywKLQkJCQlvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3MuY2xhc3MsCi0JCQkJIlByb2Nlc3MiLCBJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRQcm9jZXNzX0luY2x1ZGVzUGF0dGVybnMoKSwKLQkJCQl0aGlzLmdldENhcGFiaWxpdHlQYXR0ZXJuKCksCi0JCQkJbnVsbCwKLQkJCQkiaW5jbHVkZXNQYXR0ZXJucyIsIG51bGwsIDAsIC0xLCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3MuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldFByb2Nlc3NfRGVmYXVsdENvbnRleHQoKSwKLQkJCQl0aGlzLmdldE1ldGhvZENvbmZpZ3VyYXRpb24oKSwKLQkJCQludWxsLAotCQkJCSJkZWZhdWx0Q29udGV4dCIsIG51bGwsIDEsIDEsIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzcy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0UHJvY2Vzc19WYWxpZENvbnRleHQoKSwKLQkJCQl0aGlzLmdldE1ldGhvZENvbmZpZ3VyYXRpb24oKSwKLQkJCQludWxsLAotCQkJCSJ2YWxpZENvbnRleHQiLCBudWxsLCAwLCAtMSwgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoCi0JCQkJY2FwYWJpbGl0eVBhdHRlcm5FQ2xhc3MsCi0JCQkJQ2FwYWJpbGl0eVBhdHRlcm4uY2xhc3MsCi0JCQkJIkNhcGFiaWxpdHlQYXR0ZXJuIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcygKLQkJCQltZXRob2RDb25maWd1cmF0aW9uRUNsYXNzLAotCQkJCU1ldGhvZENvbmZpZ3VyYXRpb24uY2xhc3MsCi0JCQkJIk1ldGhvZENvbmZpZ3VyYXRpb24iLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0TWV0aG9kQ29uZmlndXJhdGlvbl9NZXRob2RQbHVnaW5TZWxlY3Rpb24oKSwKLQkJCQl0aGlzLmdldE1ldGhvZFBsdWdpbigpLAotCQkJCW51bGwsCi0JCQkJIm1ldGhvZFBsdWdpblNlbGVjdGlvbiIsIG51bGwsIDEsIC0xLCBNZXRob2RDb25maWd1cmF0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRNZXRob2RDb25maWd1cmF0aW9uX01ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKSwKLQkJCQl0aGlzLmdldE1ldGhvZFBhY2thZ2UoKSwKLQkJCQludWxsLAotCQkJCSJtZXRob2RQYWNrYWdlU2VsZWN0aW9uIiwgbnVsbCwgMSwgLTEsIE1ldGhvZENvbmZpZ3VyYXRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldE1ldGhvZENvbmZpZ3VyYXRpb25fUHJvY2Vzc1ZpZXdzKCksCi0JCQkJdGhpcy5nZXRDb250ZW50Q2F0ZWdvcnkoKSwKLQkJCQludWxsLAotCQkJCSJwcm9jZXNzVmlld3MiLCBudWxsLCAwLCAtMSwgTWV0aG9kQ29uZmlndXJhdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0TWV0aG9kQ29uZmlndXJhdGlvbl9EZWZhdWx0VmlldygpLAotCQkJCXRoaXMuZ2V0Q29udGVudENhdGVnb3J5KCksCi0JCQkJbnVsbCwKLQkJCQkiZGVmYXVsdFZpZXciLCBudWxsLCAxLCAxLCBNZXRob2RDb25maWd1cmF0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRNZXRob2RDb25maWd1cmF0aW9uX0Jhc2VDb25maWd1cmF0aW9ucygpLAotCQkJCXRoaXMuZ2V0TWV0aG9kQ29uZmlndXJhdGlvbigpLAotCQkJCW51bGwsCi0JCQkJImJhc2VDb25maWd1cmF0aW9ucyIsIG51bGwsIDAsIC0xLCBNZXRob2RDb25maWd1cmF0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRNZXRob2RDb25maWd1cmF0aW9uX1N1YnRyYWN0ZWRDYXRlZ29yeSgpLAotCQkJCXRoaXMuZ2V0Q29udGVudENhdGVnb3J5KCksCi0JCQkJbnVsbCwKLQkJCQkic3VidHJhY3RlZENhdGVnb3J5IiwgbnVsbCwgMCwgLTEsIE1ldGhvZENvbmZpZ3VyYXRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldE1ldGhvZENvbmZpZ3VyYXRpb25fQWRkZWRDYXRlZ29yeSgpLAotCQkJCXRoaXMuZ2V0Q29udGVudENhdGVnb3J5KCksCi0JCQkJbnVsbCwKLQkJCQkiYWRkZWRDYXRlZ29yeSIsIG51bGwsIDAsIC0xLCBNZXRob2RDb25maWd1cmF0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoCi0JCQkJbWV0aG9kUGx1Z2luRUNsYXNzLAotCQkJCU1ldGhvZFBsdWdpbi5jbGFzcywKLQkJCQkiTWV0aG9kUGx1Z2luIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKAotCQkJCWdldE1ldGhvZFBsdWdpbl9Vc2VyQ2hhbmdlYWJsZSgpLAotCQkJCXRoaXMuZ2V0Qm9vbGVhbigpLAotCQkJCSJ1c2VyQ2hhbmdlYWJsZSIsICJ0cnVlIiwgMSwgMSwgTWV0aG9kUGx1Z2luLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldE1ldGhvZFBsdWdpbl9NZXRob2RQYWNrYWdlcygpLAotCQkJCXRoaXMuZ2V0TWV0aG9kUGFja2FnZSgpLAotCQkJCW51bGwsCi0JCQkJIm1ldGhvZFBhY2thZ2VzIiwgbnVsbCwgMSwgLTEsIE1ldGhvZFBsdWdpbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRNZXRob2RQbHVnaW5fQmFzZXMoKSwKLQkJCQl0aGlzLmdldE1ldGhvZFBsdWdpbigpLAotCQkJCW51bGwsCi0JCQkJImJhc2VzIiwgbnVsbCwgMCwgLTEsIE1ldGhvZFBsdWdpbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoCi0JCQkJZ2V0TWV0aG9kUGx1Z2luX1N1cHBvcnRpbmcoKSwKLQkJCQllY29yZVBhY2thZ2UuZ2V0RUJvb2xlYW4oKSwKLQkJCQkic3VwcG9ydGluZyIsIG51bGwsIDAsIDEsIE1ldGhvZFBsdWdpbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoCi0JCQkJcHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGVFQ2xhc3MsCi0JCQkJUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUuY2xhc3MsCi0JCQkJIlByb2Nlc3NQbGFubmluZ1RlbXBsYXRlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldFByb2Nlc3NQbGFubmluZ1RlbXBsYXRlX0Jhc2VkT25Qcm9jZXNzZXMoKSwKLQkJCQl0aGlzLmdldFByb2Nlc3MoKSwKLQkJCQludWxsLAotCQkJCSJiYXNlZE9uUHJvY2Vzc2VzIiwgbnVsbCwgMCwgLTEsIFByb2Nlc3NQbGFubmluZ1RlbXBsYXRlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoCi0JCQkJcHJhY3RpY2VFQ2xhc3MsCi0JCQkJUHJhY3RpY2UuY2xhc3MsCi0JCQkJIlByYWN0aWNlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldFByYWN0aWNlX1N1YlByYWN0aWNlcygpLAotCQkJCXRoaXMuZ2V0UHJhY3RpY2UoKSwKLQkJCQludWxsLAotCQkJCSJzdWJQcmFjdGljZXMiLCBudWxsLCAwLCAtMSwgUHJhY3RpY2UuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0UHJhY3RpY2VfQ29udGVudFJlZmVyZW5jZXMoKSwKLQkJCQl0aGlzLmdldENvbnRlbnRFbGVtZW50KCksCi0JCQkJbnVsbCwKLQkJCQkiY29udGVudFJlZmVyZW5jZXMiLCBudWxsLCAwLCAtMSwgUHJhY3RpY2UuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldFByYWN0aWNlX0FjdGl2aXR5UmVmZXJlbmNlcygpLAotCQkJCXRoaXMuZ2V0QWN0aXZpdHkoKSwKLQkJCQludWxsLAotCQkJCSJhY3Rpdml0eVJlZmVyZW5jZXMiLCBudWxsLCAwLCAtMSwgUHJhY3RpY2UuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcygKLQkJCQlicmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb25FQ2xhc3MsCi0JCQkJQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uLmNsYXNzLAotCQkJCSJCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24iLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoCi0JCQkJZ2V0QnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uX1VzYWdlR3VpZGFuY2UoKSwKLQkJCQl0aGlzLmdldFN0cmluZygpLAotCQkJCSJ1c2FnZUd1aWRhbmNlIiwgIiIsIDAsIDEsIEJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JCWluaXRFQ2xhc3MoCi0JCQkJYWN0aXZpdHlEZXNjcmlwdGlvbkVDbGFzcywKLQkJCQlBY3Rpdml0eURlc2NyaXB0aW9uLmNsYXNzLAotCQkJCSJBY3Rpdml0eURlc2NyaXB0aW9uIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKAotCQkJCWdldEFjdGl2aXR5RGVzY3JpcHRpb25fUHVycG9zZSgpLAotCQkJCXRoaXMuZ2V0U3RyaW5nKCksCi0JCQkJInB1cnBvc2UiLCAiIiwgMCwgMSwgQWN0aXZpdHlEZXNjcmlwdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlpbml0RUF0dHJpYnV0ZSgKLQkJCQlnZXRBY3Rpdml0eURlc2NyaXB0aW9uX0FsdGVybmF0aXZlcygpLAotCQkJCXRoaXMuZ2V0U3RyaW5nKCksCi0JCQkJImFsdGVybmF0aXZlcyIsICIiLCAwLCAxLCBBY3Rpdml0eURlc2NyaXB0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWluaXRFQXR0cmlidXRlKAotCQkJCWdldEFjdGl2aXR5RGVzY3JpcHRpb25fSG93dG9TdGFmZigpLAotCQkJCXRoaXMuZ2V0U3RyaW5nKCksCi0JCQkJImhvd3RvU3RhZmYiLCAiIiwgMCwgMSwgQWN0aXZpdHlEZXNjcmlwdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JCWluaXRFQ2xhc3MoCi0JCQkJZGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25FQ2xhc3MsCi0JCQkJRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24uY2xhc3MsCi0JCQkJIkRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKAotCQkJCWdldERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX1NjYWxlKCksCi0JCQkJdGhpcy5nZXRTdHJpbmcoKSwKLQkJCQkic2NhbGUiLCAiIiwgMCwgMSwgRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJaW5pdEVBdHRyaWJ1dGUoCi0JCQkJZ2V0RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fUHJvamVjdENoYXJhY3RlcmlzdGljcygpLAotCQkJCXRoaXMuZ2V0U3RyaW5nKCksCi0JCQkJInByb2plY3RDaGFyYWN0ZXJpc3RpY3MiLCAiIiwgMCwgMSwgRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJaW5pdEVBdHRyaWJ1dGUoCi0JCQkJZ2V0RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fUmlza0xldmVsKCksCi0JCQkJdGhpcy5nZXRTdHJpbmcoKSwKLQkJCQkicmlza0xldmVsIiwgIiIsIDAsIDEsIERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWluaXRFQXR0cmlidXRlKAotCQkJCWdldERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX0VzdGltYXRpbmdUZWNobmlxdWUoKSwKLQkJCQl0aGlzLmdldFN0cmluZygpLAotCQkJCSJlc3RpbWF0aW5nVGVjaG5pcXVlIiwgIiIsIDAsIDEsIERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWluaXRFQXR0cmlidXRlKAotCQkJCWdldERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX1Byb2plY3RNZW1iZXJFeHBlcnRpc2UoKSwKLQkJCQl0aGlzLmdldFN0cmluZygpLAotCQkJCSJwcm9qZWN0TWVtYmVyRXhwZXJ0aXNlIiwgIiIsIDAsIDEsIERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWluaXRFQXR0cmlidXRlKAotCQkJCWdldERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX1R5cGVPZkNvbnRyYWN0KCksCi0JCQkJdGhpcy5nZXRTdHJpbmcoKSwKLQkJCQkidHlwZU9mQ29udHJhY3QiLCAiIiwgMCwgMSwgRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCQlpbml0RUNsYXNzKAotCQkJCXByb2Nlc3NEZXNjcmlwdGlvbkVDbGFzcywKLQkJCQlQcm9jZXNzRGVzY3JpcHRpb24uY2xhc3MsCi0JCQkJIlByb2Nlc3NEZXNjcmlwdGlvbiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZSgKLQkJCQlnZXRQcm9jZXNzRGVzY3JpcHRpb25fU2NvcGUoKSwKLQkJCQl0aGlzLmdldFN0cmluZygpLAotCQkJCSJzY29wZSIsICIiLCAwLCAxLCBQcm9jZXNzRGVzY3JpcHRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJaW5pdEVBdHRyaWJ1dGUoCi0JCQkJZ2V0UHJvY2Vzc0Rlc2NyaXB0aW9uX1VzYWdlTm90ZXMoKSwKLQkJCQl0aGlzLmdldFN0cmluZygpLAotCQkJCSJ1c2FnZU5vdGVzIiwgIiIsIDAsIDEsIFByb2Nlc3NEZXNjcmlwdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JCWluaXRFQ2xhc3MoCi0JCQkJZGVzY3JpcHRvckRlc2NyaXB0aW9uRUNsYXNzLAotCQkJCURlc2NyaXB0b3JEZXNjcmlwdGlvbi5jbGFzcywKLQkJCQkiRGVzY3JpcHRvckRlc2NyaXB0aW9uIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKAotCQkJCWdldERlc2NyaXB0b3JEZXNjcmlwdGlvbl9SZWZpbmVkRGVzY3JpcHRpb24oKSwKLQkJCQl0aGlzLmdldFN0cmluZygpLAotCQkJCSJyZWZpbmVkRGVzY3JpcHRpb24iLCAiIiwgMCwgMSwgRGVzY3JpcHRvckRlc2NyaXB0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkJaW5pdEVDbGFzcygKLQkJCQlwcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvckVDbGFzcywKLQkJCQlQcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvci5jbGFzcywKLQkJCQkiUHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3IiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0UHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3JfX3Byb2Nlc3NDb21wb25lbnQoKSwKLQkJCQl0aGlzLmdldFByb2Nlc3NDb21wb25lbnQoKSwKLQkJCQludWxsLAotCQkJCSJfcHJvY2Vzc0NvbXBvbmVudCIsIG51bGwsIDEsIDEsIFByb2Nlc3NDb21wb25lbnREZXNjcmlwdG9yLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsICFJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKAotCQkJCXByb2Nlc3NDb21wb25lbnRFQ2xhc3MsCi0JCQkJUHJvY2Vzc0NvbXBvbmVudC5jbGFzcywKLQkJCQkiUHJvY2Vzc0NvbXBvbmVudCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRQcm9jZXNzQ29tcG9uZW50X0ludGVyZmFjZXMoKSwKLQkJCQl0aGlzLmdldFByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UoKSwKLQkJCQludWxsLAotCQkJCSJpbnRlcmZhY2VzIiwgbnVsbCwgMSwgLTEsIFByb2Nlc3NDb21wb25lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldFByb2Nlc3NDb21wb25lbnRfUHJvY2VzcygpLAotCQkJCXRoaXMuZ2V0UHJvY2VzcygpLAotCQkJCW51bGwsCi0JCQkJInByb2Nlc3MiLCBudWxsLCAxLCAxLCBQcm9jZXNzQ29tcG9uZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcygKLQkJCQlwcm9jZXNzUGFja2FnZUVDbGFzcywKLQkJCQlQcm9jZXNzUGFja2FnZS5jbGFzcywKLQkJCQkiUHJvY2Vzc1BhY2thZ2UiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0UHJvY2Vzc1BhY2thZ2VfUHJvY2Vzc0VsZW1lbnRzKCksCi0JCQkJdGhpcy5nZXRQcm9jZXNzRWxlbWVudCgpLAotCQkJCW51bGwsCi0JCQkJInByb2Nlc3NFbGVtZW50cyIsIG51bGwsIDAsIC0xLCBQcm9jZXNzUGFja2FnZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRQcm9jZXNzUGFja2FnZV9EaWFncmFtcygpLAotCQkJCXRoaXMuZ2V0RGlhZ3JhbSgpLAotCQkJCW51bGwsCi0JCQkJImRpYWdyYW1zIiwgbnVsbCwgMCwgLTEsIFByb2Nlc3NQYWNrYWdlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcygKLQkJCQlkaWFncmFtRUNsYXNzLAotCQkJCURpYWdyYW0uY2xhc3MsCi0JCQkJIkRpYWdyYW0iLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0RGlhZ3JhbV9EaWFncmFtTGluaygpLAotCQkJCXRoaXMuZ2V0RGlhZ3JhbUxpbmsoKSwKLQkJCQl0aGlzLmdldERpYWdyYW1MaW5rX0RpYWdyYW0oKSwKLQkJCQkiZGlhZ3JhbUxpbmsiLCBudWxsLCAwLCAtMSwgRGlhZ3JhbS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0RGlhZ3JhbV9OYW1lc3BhY2UoKSwKLQkJCQl0aGlzLmdldFNlbWFudGljTW9kZWxCcmlkZ2UoKSwKLQkJCQl0aGlzLmdldFNlbWFudGljTW9kZWxCcmlkZ2VfRGlhZ3JhbSgpLAotCQkJCSJuYW1lc3BhY2UiLCBudWxsLCAxLCAxLCBEaWFncmFtLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKAotCQkJCWdldERpYWdyYW1fWm9vbSgpLAotCQkJCXRoaXMuZ2V0RG91YmxlKCksCi0JCQkJInpvb20iLCBudWxsLCAwLCAxLCBEaWFncmFtLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXREaWFncmFtX1ZpZXdwb2ludCgpLAotCQkJCXRoaXMuZ2V0UG9pbnQoKSwKLQkJCQludWxsLAotCQkJCSJ2aWV3cG9pbnQiLCBudWxsLCAxLCAxLCBEaWFncmFtLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoCi0JCQkJZ3JhcGhOb2RlRUNsYXNzLAotCQkJCUdyYXBoTm9kZS5jbGFzcywKLQkJCQkiR3JhcGhOb2RlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldEdyYXBoTm9kZV9TaXplKCksCi0JCQkJdGhpcy5nZXREaW1lbnNpb24oKSwKLQkJCQludWxsLAotCQkJCSJzaXplIiwgbnVsbCwgMSwgMSwgR3JhcGhOb2RlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoCi0JCQkJZ3JhcGhFbGVtZW50RUNsYXNzLAotCQkJCUdyYXBoRWxlbWVudC5jbGFzcywKLQkJCQkiR3JhcGhFbGVtZW50IiwgSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0R3JhcGhFbGVtZW50X0NvbnRhaW5lZCgpLAotCQkJCXRoaXMuZ2V0RGlhZ3JhbUVsZW1lbnQoKSwKLQkJCQl0aGlzLmdldERpYWdyYW1FbGVtZW50X0NvbnRhaW5lcigpLAotCQkJCSJjb250YWluZWQiLCBudWxsLCAwLCAtMSwgR3JhcGhFbGVtZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldEdyYXBoRWxlbWVudF9Qb3NpdGlvbigpLAotCQkJCXRoaXMuZ2V0UG9pbnQoKSwKLQkJCQludWxsLAotCQkJCSJwb3NpdGlvbiIsIG51bGwsIDEsIDEsIEdyYXBoRWxlbWVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0R3JhcGhFbGVtZW50X0xpbmsoKSwKLQkJCQl0aGlzLmdldERpYWdyYW1MaW5rKCksCi0JCQkJdGhpcy5nZXREaWFncmFtTGlua19HcmFwaEVsZW1lbnQoKSwKLQkJCQkibGluayIsIG51bGwsIDAsIC0xLCBHcmFwaEVsZW1lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0R3JhcGhFbGVtZW50X0FuY2hvcmFnZSgpLAotCQkJCXRoaXMuZ2V0R3JhcGhDb25uZWN0b3IoKSwKLQkJCQl0aGlzLmdldEdyYXBoQ29ubmVjdG9yX0dyYXBoRWxlbWVudCgpLAotCQkJCSJhbmNob3JhZ2UiLCBudWxsLCAwLCAtMSwgR3JhcGhFbGVtZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldEdyYXBoRWxlbWVudF9TZW1hbnRpY01vZGVsKCksCi0JCQkJdGhpcy5nZXRTZW1hbnRpY01vZGVsQnJpZGdlKCksCi0JCQkJdGhpcy5nZXRTZW1hbnRpY01vZGVsQnJpZGdlX0dyYXBoRWxlbWVudCgpLAotCQkJCSJzZW1hbnRpY01vZGVsIiwgbnVsbCwgMSwgMSwgR3JhcGhFbGVtZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcygKLQkJCQlkaWFncmFtRWxlbWVudEVDbGFzcywKLQkJCQlEaWFncmFtRWxlbWVudC5jbGFzcywKLQkJCQkiRGlhZ3JhbUVsZW1lbnQiLCBJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZSgKLQkJCQlnZXREaWFncmFtRWxlbWVudF9Jc1Zpc2libGUoKSwKLQkJCQl0aGlzLmdldEJvb2xlYW4oKSwKLQkJCQkiaXNWaXNpYmxlIiwgInRydWUiLCAxLCAxLCBEaWFncmFtRWxlbWVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXREaWFncmFtRWxlbWVudF9Db250YWluZXIoKSwKLQkJCQl0aGlzLmdldEdyYXBoRWxlbWVudCgpLAotCQkJCXRoaXMuZ2V0R3JhcGhFbGVtZW50X0NvbnRhaW5lZCgpLAotCQkJCSJjb250YWluZXIiLCBudWxsLCAwLCAxLCBEaWFncmFtRWxlbWVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0RGlhZ3JhbUVsZW1lbnRfUmVmZXJlbmNlKCksCi0JCQkJdGhpcy5nZXRSZWZlcmVuY2UoKSwKLQkJCQl0aGlzLmdldFJlZmVyZW5jZV9SZWZlcmVuY2VkKCksCi0JCQkJInJlZmVyZW5jZSIsIG51bGwsIDAsIC0xLCBEaWFncmFtRWxlbWVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0RGlhZ3JhbUVsZW1lbnRfUHJvcGVydHkoKSwKLQkJCQl0aGlzLmdldFByb3BlcnR5KCksCi0JCQkJbnVsbCwKLQkJCQkicHJvcGVydHkiLCBudWxsLCAwLCAtMSwgRGlhZ3JhbUVsZW1lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKAotCQkJCXJlZmVyZW5jZUVDbGFzcywKLQkJCQlSZWZlcmVuY2UuY2xhc3MsCi0JCQkJIlJlZmVyZW5jZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZSgKLQkJCQlnZXRSZWZlcmVuY2VfSXNJbmRpdmlkdWFsUmVwcmVzZW50YXRpb24oKSwKLQkJCQl0aGlzLmdldEJvb2xlYW4oKSwKLQkJCQkiaXNJbmRpdmlkdWFsUmVwcmVzZW50YXRpb24iLCAiZmFsc2UiLCAxLCAxLCBSZWZlcmVuY2UuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0UmVmZXJlbmNlX1JlZmVyZW5jZWQoKSwKLQkJCQl0aGlzLmdldERpYWdyYW1FbGVtZW50KCksCi0JCQkJdGhpcy5nZXREaWFncmFtRWxlbWVudF9SZWZlcmVuY2UoKSwKLQkJCQkicmVmZXJlbmNlZCIsIG51bGwsIDEsIDEsIFJlZmVyZW5jZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKAotCQkJCXByb3BlcnR5RUNsYXNzLAotCQkJCVByb3BlcnR5LmNsYXNzLAotCQkJCSJQcm9wZXJ0eSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZSgKLQkJCQlnZXRQcm9wZXJ0eV9LZXkoKSwKLQkJCQl0aGlzLmdldFN0cmluZygpLAotCQkJCSJrZXkiLCAiIiwgMCwgMSwgUHJvcGVydHkuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJaW5pdEVBdHRyaWJ1dGUoCi0JCQkJZ2V0UHJvcGVydHlfVmFsdWUoKSwKLQkJCQl0aGlzLmdldFN0cmluZygpLAotCQkJCSJ2YWx1ZSIsICIiLCAwLCAxLCBQcm9wZXJ0eS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JCWluaXRFQ2xhc3MoCi0JCQkJcG9pbnRFQ2xhc3MsCi0JCQkJUG9pbnQuY2xhc3MsCi0JCQkJIlBvaW50IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKAotCQkJCWdldFBvaW50X1goKSwKLQkJCQl0aGlzLmdldERvdWJsZSgpLAotCQkJCSJ4IiwgbnVsbCwgMSwgMSwgUG9pbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKAotCQkJCWdldFBvaW50X1koKSwKLQkJCQl0aGlzLmdldERvdWJsZSgpLAotCQkJCSJ5IiwgbnVsbCwgMSwgMSwgUG9pbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcygKLQkJCQlkaWFncmFtTGlua0VDbGFzcywKLQkJCQlEaWFncmFtTGluay5jbGFzcywKLQkJCQkiRGlhZ3JhbUxpbmsiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoCi0JCQkJZ2V0RGlhZ3JhbUxpbmtfWm9vbSgpLAotCQkJCXRoaXMuZ2V0RG91YmxlKCksCi0JCQkJInpvb20iLCBudWxsLCAxLCAxLCBEaWFncmFtTGluay5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0RGlhZ3JhbUxpbmtfVmlld3BvcnQoKSwKLQkJCQl0aGlzLmdldFBvaW50KCksCi0JCQkJbnVsbCwKLQkJCQkidmlld3BvcnQiLCBudWxsLCAxLCAxLCBEaWFncmFtTGluay5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0RGlhZ3JhbUxpbmtfRGlhZ3JhbSgpLAotCQkJCXRoaXMuZ2V0RGlhZ3JhbSgpLAotCQkJCXRoaXMuZ2V0RGlhZ3JhbV9EaWFncmFtTGluaygpLAotCQkJCSJkaWFncmFtIiwgbnVsbCwgMSwgMSwgRGlhZ3JhbUxpbmsuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldERpYWdyYW1MaW5rX0dyYXBoRWxlbWVudCgpLAotCQkJCXRoaXMuZ2V0R3JhcGhFbGVtZW50KCksCi0JCQkJdGhpcy5nZXRHcmFwaEVsZW1lbnRfTGluaygpLAotCQkJCSJncmFwaEVsZW1lbnQiLCBudWxsLCAxLCAxLCBEaWFncmFtTGluay5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKAotCQkJCWdyYXBoQ29ubmVjdG9yRUNsYXNzLAotCQkJCUdyYXBoQ29ubmVjdG9yLmNsYXNzLAotCQkJCSJHcmFwaENvbm5lY3RvciIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRHcmFwaENvbm5lY3Rvcl9HcmFwaEVkZ2UoKSwKLQkJCQl0aGlzLmdldEdyYXBoRWRnZSgpLAotCQkJCXRoaXMuZ2V0R3JhcGhFZGdlX0FuY2hvcigpLAotCQkJCSJncmFwaEVkZ2UiLCBudWxsLCAwLCAtMSwgR3JhcGhDb25uZWN0b3IuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldEdyYXBoQ29ubmVjdG9yX0dyYXBoRWxlbWVudCgpLAotCQkJCXRoaXMuZ2V0R3JhcGhFbGVtZW50KCksCi0JCQkJdGhpcy5nZXRHcmFwaEVsZW1lbnRfQW5jaG9yYWdlKCksCi0JCQkJImdyYXBoRWxlbWVudCIsIG51bGwsIDEsIDEsIEdyYXBoQ29ubmVjdG9yLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoCi0JCQkJZ3JhcGhFZGdlRUNsYXNzLAotCQkJCUdyYXBoRWRnZS5jbGFzcywKLQkJCQkiR3JhcGhFZGdlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldEdyYXBoRWRnZV9XYXlwb2ludHMoKSwKLQkJCQl0aGlzLmdldFBvaW50KCksCi0JCQkJbnVsbCwKLQkJCQkid2F5cG9pbnRzIiwgbnVsbCwgMiwgLTEsIEdyYXBoRWRnZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRHcmFwaEVkZ2VfQW5jaG9yKCksCi0JCQkJdGhpcy5nZXRHcmFwaENvbm5lY3RvcigpLAotCQkJCXRoaXMuZ2V0R3JhcGhDb25uZWN0b3JfR3JhcGhFZGdlKCksCi0JCQkJImFuY2hvciIsIG51bGwsIDIsIDIsIEdyYXBoRWRnZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKAotCQkJCXNlbWFudGljTW9kZWxCcmlkZ2VFQ2xhc3MsCi0JCQkJU2VtYW50aWNNb2RlbEJyaWRnZS5jbGFzcywKLQkJCQkiU2VtYW50aWNNb2RlbEJyaWRnZSIsIElTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKAotCQkJCWdldFNlbWFudGljTW9kZWxCcmlkZ2VfUHJlc2VudGF0aW9uKCksCi0JCQkJdGhpcy5nZXRTdHJpbmcoKSwKLQkJCQkicHJlc2VudGF0aW9uIiwgIiIsIDAsIDEsIFNlbWFudGljTW9kZWxCcmlkZ2UuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0U2VtYW50aWNNb2RlbEJyaWRnZV9EaWFncmFtKCksCi0JCQkJdGhpcy5nZXREaWFncmFtKCksCi0JCQkJdGhpcy5nZXREaWFncmFtX05hbWVzcGFjZSgpLAotCQkJCSJkaWFncmFtIiwgbnVsbCwgMCwgMSwgU2VtYW50aWNNb2RlbEJyaWRnZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0U2VtYW50aWNNb2RlbEJyaWRnZV9HcmFwaEVsZW1lbnQoKSwKLQkJCQl0aGlzLmdldEdyYXBoRWxlbWVudCgpLAotCQkJCXRoaXMuZ2V0R3JhcGhFbGVtZW50X1NlbWFudGljTW9kZWwoKSwKLQkJCQkiZ3JhcGhFbGVtZW50IiwgbnVsbCwgMCwgMSwgU2VtYW50aWNNb2RlbEJyaWRnZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKAotCQkJCWRpbWVuc2lvbkVDbGFzcywKLQkJCQlEaW1lbnNpb24uY2xhc3MsCi0JCQkJIkRpbWVuc2lvbiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZSgKLQkJCQlnZXREaW1lbnNpb25fV2lkdGgoKSwKLQkJCQl0aGlzLmdldERvdWJsZSgpLAotCQkJCSJ3aWR0aCIsIG51bGwsIDEsIDEsIERpbWVuc2lvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoCi0JCQkJZ2V0RGltZW5zaW9uX0hlaWdodCgpLAotCQkJCXRoaXMuZ2V0RG91YmxlKCksCi0JCQkJImhlaWdodCIsIG51bGwsIDEsIDEsIERpbWVuc2lvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKAotCQkJCXByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VFQ2xhc3MsCi0JCQkJUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZS5jbGFzcywKLQkJCQkiUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlX0ludGVyZmFjZVNwZWNpZmljYXRpb25zKCksCi0JCQkJdGhpcy5nZXRUYXNrRGVzY3JpcHRvcigpLAotCQkJCW51bGwsCi0JCQkJImludGVyZmFjZVNwZWNpZmljYXRpb25zIiwgbnVsbCwgMCwgLTEsIFByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0UHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZV9JbnRlcmZhY2VJTygpLAotCQkJCXRoaXMuZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yKCksCi0JCQkJbnVsbCwKLQkJCQkiaW50ZXJmYWNlSU8iLCBudWxsLCAwLCAtMSwgUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoCi0JCQkJc2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnRFQ2xhc3MsCi0JCQkJU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnQuY2xhc3MsCi0JCQkJIlNpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKAotCQkJCWdldFNpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50X1R5cGVJbmZvKCksCi0JCQkJdGhpcy5nZXRTdHJpbmcoKSwKLQkJCQkidHlwZUluZm8iLCAiIiwgMCwgMSwgU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCQlpbml0RUNsYXNzKAotCQkJCXVtYVNlbWFudGljTW9kZWxCcmlkZ2VFQ2xhc3MsCi0JCQkJVU1BU2VtYW50aWNNb2RlbEJyaWRnZS5jbGFzcywKLQkJCQkiVU1BU2VtYW50aWNNb2RlbEJyaWRnZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRVTUFTZW1hbnRpY01vZGVsQnJpZGdlX0VsZW1lbnQoKSwKLQkJCQl0aGlzLmdldE1ldGhvZEVsZW1lbnQoKSwKLQkJCQludWxsLAotCQkJCSJlbGVtZW50IiwgbnVsbCwgMSwgMSwgVU1BU2VtYW50aWNNb2RlbEJyaWRnZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKAotCQkJCWNvcmVTZW1hbnRpY01vZGVsQnJpZGdlRUNsYXNzLAotCQkJCUNvcmVTZW1hbnRpY01vZGVsQnJpZGdlLmNsYXNzLAotCQkJCSJDb3JlU2VtYW50aWNNb2RlbEJyaWRnZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRDb3JlU2VtYW50aWNNb2RlbEJyaWRnZV9FbGVtZW50KCksCi0JCQkJdGhpcy5nZXRFbGVtZW50KCksCi0JCQkJbnVsbCwKLQkJCQkiZWxlbWVudCIsIG51bGwsIDEsIDEsIENvcmVTZW1hbnRpY01vZGVsQnJpZGdlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoCi0JCQkJbGVhZkVsZW1lbnRFQ2xhc3MsCi0JCQkJTGVhZkVsZW1lbnQuY2xhc3MsCi0JCQkJIkxlYWZFbGVtZW50IiwgSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKAotCQkJCXRleHRFbGVtZW50RUNsYXNzLAotCQkJCVRleHRFbGVtZW50LmNsYXNzLAotCQkJCSJUZXh0RWxlbWVudCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZSgKLQkJCQlnZXRUZXh0RWxlbWVudF9UZXh0KCksCi0JCQkJdGhpcy5nZXRTdHJpbmcoKSwKLQkJCQkidGV4dCIsICIiLCAwLCAxLCBUZXh0RWxlbWVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JCWluaXRFQ2xhc3MoCi0JCQkJaW1hZ2VFQ2xhc3MsCi0JCQkJSW1hZ2UuY2xhc3MsCi0JCQkJIkltYWdlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKAotCQkJCWdldEltYWdlX1VyaSgpLAotCQkJCXRoaXMuZ2V0VXJpKCksCi0JCQkJInVyaSIsIG51bGwsIDAsIDEsIEltYWdlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZSgKLQkJCQlnZXRJbWFnZV9NaW1lVHlwZSgpLAotCQkJCXRoaXMuZ2V0U3RyaW5nKCksCi0JCQkJIm1pbWVUeXBlIiwgIiIsIDAsIDEsIEltYWdlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkJaW5pdEVDbGFzcygKLQkJCQlncmFwaGljUHJpbWl0aXZlRUNsYXNzLAotCQkJCUdyYXBoaWNQcmltaXRpdmUuY2xhc3MsCi0JCQkJIkdyYXBoaWNQcmltaXRpdmUiLCBJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoCi0JCQkJcG9seWxpbmVFQ2xhc3MsCi0JCQkJUG9seWxpbmUuY2xhc3MsCi0JCQkJIlBvbHlsaW5lIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKAotCQkJCWdldFBvbHlsaW5lX0Nsb3NlZCgpLAotCQkJCXRoaXMuZ2V0Qm9vbGVhbigpLAotCQkJCSJjbG9zZWQiLCAidHJ1ZSIsIDEsIDEsIFBvbHlsaW5lLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldFBvbHlsaW5lX1dheXBvaW50cygpLAotCQkJCXRoaXMuZ2V0UG9pbnQoKSwKLQkJCQludWxsLAotCQkJCSJ3YXlwb2ludHMiLCBudWxsLCAyLCAtMSwgUG9seWxpbmUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKAotCQkJCWVsbGlwc2VFQ2xhc3MsCi0JCQkJRWxsaXBzZS5jbGFzcywKLQkJCQkiRWxsaXBzZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRFbGxpcHNlX0NlbnRlcigpLAotCQkJCXRoaXMuZ2V0UG9pbnQoKSwKLQkJCQludWxsLAotCQkJCSJjZW50ZXIiLCBudWxsLCAxLCAxLCBFbGxpcHNlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZSgKLQkJCQlnZXRFbGxpcHNlX1JhZGl1c1goKSwKLQkJCQl0aGlzLmdldERvdWJsZSgpLAotCQkJCSJyYWRpdXNYIiwgbnVsbCwgMSwgMSwgRWxsaXBzZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoCi0JCQkJZ2V0RWxsaXBzZV9SYWRpdXNZKCksCi0JCQkJdGhpcy5nZXREb3VibGUoKSwKLQkJCQkicmFkaXVzWSIsIG51bGwsIDEsIDEsIEVsbGlwc2UuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKAotCQkJCWdldEVsbGlwc2VfUm90YXRpb24oKSwKLQkJCQl0aGlzLmdldERvdWJsZSgpLAotCQkJCSJyb3RhdGlvbiIsIG51bGwsIDEsIDEsIEVsbGlwc2UuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKAotCQkJCWdldEVsbGlwc2VfU3RhcnRBbmdsZSgpLAotCQkJCXRoaXMuZ2V0RG91YmxlKCksCi0JCQkJInN0YXJ0QW5nbGUiLCBudWxsLCAxLCAxLCBFbGxpcHNlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZSgKLQkJCQlnZXRFbGxpcHNlX0VuZEFuZ2xlKCksCi0JCQkJdGhpcy5nZXREb3VibGUoKSwKLQkJCQkiZW5kQW5nbGUiLCBudWxsLCAxLCAxLCBFbGxpcHNlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoCi0JCQkJcHJvY2Vzc0ZhbWlseUVDbGFzcywKLQkJCQlQcm9jZXNzRmFtaWx5LmNsYXNzLAotCQkJCSJQcm9jZXNzRmFtaWx5IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldFByb2Nlc3NGYW1pbHlfRGVsaXZlcnlQcm9jZXNzZXMoKSwKLQkJCQl0aGlzLmdldERlbGl2ZXJ5UHJvY2VzcygpLAotCQkJCW51bGwsCi0JCQkJImRlbGl2ZXJ5UHJvY2Vzc2VzIiwgbnVsbCwgMCwgLTEsIFByb2Nlc3NGYW1pbHkuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcygKLQkJCQltZXRob2RMaWJyYXJ5RUNsYXNzLAotCQkJCU1ldGhvZExpYnJhcnkuY2xhc3MsCi0JCQkJIk1ldGhvZExpYnJhcnkiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0TWV0aG9kTGlicmFyeV9NZXRob2RQbHVnaW5zKCksCi0JCQkJdGhpcy5nZXRNZXRob2RQbHVnaW4oKSwKLQkJCQludWxsLAotCQkJCSJtZXRob2RQbHVnaW5zIiwgbnVsbCwgMCwgLTEsIE1ldGhvZExpYnJhcnkuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0TWV0aG9kTGlicmFyeV9QcmVkZWZpbmVkQ29uZmlndXJhdGlvbnMoKSwKLQkJCQl0aGlzLmdldE1ldGhvZENvbmZpZ3VyYXRpb24oKSwKLQkJCQludWxsLAotCQkJCSJwcmVkZWZpbmVkQ29uZmlndXJhdGlvbnMiLCBudWxsLCAwLCAtMSwgTWV0aG9kTGlicmFyeS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCi0JCS8vIEluaXRpYWxpemUgZW51bXMgYW5kIGFkZCBlbnVtIGxpdGVyYWxzCi0JCWluaXRFRW51bSh2YXJpYWJpbGl0eVR5cGVFRW51bSwgVmFyaWFiaWxpdHlUeXBlLmNsYXNzLAotCQkJCSJWYXJpYWJpbGl0eVR5cGUiKTsgLy8kTk9OLU5MUy0xJAotCQlhZGRFRW51bUxpdGVyYWwodmFyaWFiaWxpdHlUeXBlRUVudW0sIFZhcmlhYmlsaXR5VHlwZS5OQSk7Ci0JCWFkZEVFbnVtTGl0ZXJhbCh2YXJpYWJpbGl0eVR5cGVFRW51bSwgVmFyaWFiaWxpdHlUeXBlLkNPTlRSSUJVVEVTKTsKLQkJYWRkRUVudW1MaXRlcmFsKHZhcmlhYmlsaXR5VHlwZUVFbnVtLCBWYXJpYWJpbGl0eVR5cGUuRVhURU5EUyk7Ci0JCWFkZEVFbnVtTGl0ZXJhbCh2YXJpYWJpbGl0eVR5cGVFRW51bSwgVmFyaWFiaWxpdHlUeXBlLlJFUExBQ0VTKTsKLQkJYWRkRUVudW1MaXRlcmFsKHZhcmlhYmlsaXR5VHlwZUVFbnVtLAotCQkJCVZhcmlhYmlsaXR5VHlwZS5MT0NBTF9DT05UUklCVVRJT04pOwotCQlhZGRFRW51bUxpdGVyYWwodmFyaWFiaWxpdHlUeXBlRUVudW0sIFZhcmlhYmlsaXR5VHlwZS5MT0NBTF9SRVBMQUNFTUVOVCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbCh2YXJpYWJpbGl0eVR5cGVFRW51bSwgVmFyaWFiaWxpdHlUeXBlLkVYVEVORFNfUkVQTEFDRVMpOwotCi0JCWluaXRFRW51bSh3b3JrT3JkZXJUeXBlRUVudW0sIFdvcmtPcmRlclR5cGUuY2xhc3MsICJXb3JrT3JkZXJUeXBlIik7IC8vJE5PTi1OTFMtMSQKLQkJYWRkRUVudW1MaXRlcmFsKHdvcmtPcmRlclR5cGVFRW51bSwgV29ya09yZGVyVHlwZS5GSU5JU0hfVE9fU1RBUlQpOwotCQlhZGRFRW51bUxpdGVyYWwod29ya09yZGVyVHlwZUVFbnVtLCBXb3JrT3JkZXJUeXBlLkZJTklTSF9UT19GSU5JU0gpOwotCQlhZGRFRW51bUxpdGVyYWwod29ya09yZGVyVHlwZUVFbnVtLCBXb3JrT3JkZXJUeXBlLlNUQVJUX1RPX1NUQVJUKTsKLQkJYWRkRUVudW1MaXRlcmFsKHdvcmtPcmRlclR5cGVFRW51bSwgV29ya09yZGVyVHlwZS5TVEFSVF9UT19GSU5JU0gpOwotCi0JCS8vIEluaXRpYWxpemUgZGF0YSB0eXBlcwotCQlpbml0RURhdGFUeXBlKHN0cmluZ0VEYXRhVHlwZSwgU3RyaW5nLmNsYXNzLAotCQkJCSJTdHJpbmciLCBJU19TRVJJQUxJWkFCTEUsICFJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFRGF0YVR5cGUoYm9vbGVhbkVEYXRhVHlwZSwgQm9vbGVhbi5jbGFzcywKLQkJCQkiQm9vbGVhbiIsIElTX1NFUklBTElaQUJMRSwgIUlTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVEYXRhVHlwZShkYXRlRURhdGFUeXBlLCBEYXRlLmNsYXNzLAotCQkJCSJEYXRlIiwgSVNfU0VSSUFMSVpBQkxFLCAhSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RURhdGFUeXBlKHVyaUVEYXRhVHlwZSwgamF2YS5uZXQuVVJJLmNsYXNzLAotCQkJCSJVcmkiLCBJU19TRVJJQUxJWkFCTEUsICFJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFRGF0YVR5cGUoc2V0RURhdGFUeXBlLCBTZXQuY2xhc3MsCi0JCQkJIlNldCIsIElTX1NFUklBTElaQUJMRSwgIUlTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVEYXRhVHlwZShzZXF1ZW5jZUVEYXRhVHlwZSwgTGlzdC5jbGFzcywKLQkJCQkiU2VxdWVuY2UiLCBJU19TRVJJQUxJWkFCTEUsICFJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFRGF0YVR5cGUoaW50ZWdlckVEYXRhVHlwZSwgaW50LmNsYXNzLAotCQkJCSJJbnRlZ2VyIiwgSVNfU0VSSUFMSVpBQkxFLCAhSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RURhdGFUeXBlKGRvdWJsZUVEYXRhVHlwZSwgRG91YmxlLmNsYXNzLAotCQkJCSJEb3VibGUiLCBJU19TRVJJQUxJWkFCTEUsICFJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0KLQkJLy8gQ3JlYXRlIHJlc291cmNlCi0JCWNyZWF0ZVJlc291cmNlKGVOU19VUkkpOwotCX0KLQotfSAvL1VtYVBhY2thZ2VJbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1ZhcmlhYmlsaXR5RWxlbWVudEltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9WYXJpYWJpbGl0eUVsZW1lbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1MGZmZjkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1ZhcmlhYmlsaXR5RWxlbWVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlUeXBlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+VmFyaWFiaWxpdHkgRWxlbWVudDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlZhcmlhYmlsaXR5RWxlbWVudEltcGwjZ2V0VmFyaWFiaWxpdHlUeXBlIDxlbT5WYXJpYWJpbGl0eSBUeXBlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVmFyaWFiaWxpdHlFbGVtZW50SW1wbCNnZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50IDxlbT5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgVmFyaWFiaWxpdHlFbGVtZW50SW1wbCBleHRlbmRzIE1ldGhvZEVsZW1lbnRJbXBsCi0JCWltcGxlbWVudHMgVmFyaWFiaWxpdHlFbGVtZW50IHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWYXJpYWJpbGl0eVR5cGUoKSA8ZW0+VmFyaWFiaWxpdHkgVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VmFyaWFiaWxpdHlUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFZhcmlhYmlsaXR5VHlwZSBWQVJJQUJJTElUWV9UWVBFX0VERUZBVUxUID0gVmFyaWFiaWxpdHlUeXBlLk5BOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmFyaWFiaWxpdHlUeXBlKCkgPGVtPlZhcmlhYmlsaXR5IFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFZhcmlhYmlsaXR5VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFZhcmlhYmlsaXR5VHlwZSB2YXJpYWJpbGl0eVR5cGUgPSBWQVJJQUJJTElUWV9UWVBFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpIDxlbT5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9lbT59JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgVmFyaWFiaWxpdHlFbGVtZW50IHZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgVmFyaWFiaWxpdHlFbGVtZW50SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQotCQkvL1VNQS0tPgotCQlyZWFzc2lnbkRlZmF1bHRWYWx1ZXMoKTsKLQkJLy9VTUE8LS0gIAotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5WQVJJQUJJTElUWV9FTEVNRU5UOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBWYXJpYWJpbGl0eVR5cGUgZ2V0VmFyaWFiaWxpdHlUeXBlKCkgewotCQlyZXR1cm4gdmFyaWFiaWxpdHlUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZhcmlhYmlsaXR5VHlwZShWYXJpYWJpbGl0eVR5cGUgbmV3VmFyaWFiaWxpdHlUeXBlKSB7Ci0JCVZhcmlhYmlsaXR5VHlwZSBvbGRWYXJpYWJpbGl0eVR5cGUgPSB2YXJpYWJpbGl0eVR5cGU7Ci0JCXZhcmlhYmlsaXR5VHlwZSA9IG5ld1ZhcmlhYmlsaXR5VHlwZSA9PSBudWxsID8gVkFSSUFCSUxJVFlfVFlQRV9FREVGQVVMVAotCQkJCTogbmV3VmFyaWFiaWxpdHlUeXBlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLlZBUklBQklMSVRZX0VMRU1FTlRfX1ZBUklBQklMSVRZX1RZUEUsCi0JCQkJCW9sZFZhcmlhYmlsaXR5VHlwZSwgdmFyaWFiaWxpdHlUeXBlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFZhcmlhYmlsaXR5RWxlbWVudCBnZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkgewotCQlpZiAodmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCAhPSBudWxsCi0JCQkJJiYgKChFT2JqZWN0KSB2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KS5lSXNQcm94eSgpKSB7Ci0JCQlJbnRlcm5hbEVPYmplY3Qgb2xkVmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCA9IChJbnRlcm5hbEVPYmplY3QpIHZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQ7Ci0JCQl2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50ID0gKFZhcmlhYmlsaXR5RWxlbWVudCkgZVJlc29sdmVQcm94eShvbGRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KTsKLQkJCWlmICh2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50ICE9IG9sZFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQpIHsKLQkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKAotCQkJCQkJCXRoaXMsCi0JCQkJCQkJTm90aWZpY2F0aW9uLlJFU09MVkUsCi0JCQkJCQkJVW1hUGFja2FnZS5WQVJJQUJJTElUWV9FTEVNRU5UX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5ULAotCQkJCQkJCW9sZFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQsCi0JCQkJCQkJdmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCkpOwotCQkJfQotCQl9Ci0JCXJldHVybiB2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBWYXJpYWJpbGl0eUVsZW1lbnQgYmFzaWNHZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkgewotCQlyZXR1cm4gdmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KAotCQkJVmFyaWFiaWxpdHlFbGVtZW50IG5ld1ZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQpIHsKLQkJVmFyaWFiaWxpdHlFbGVtZW50IG9sZFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQgPSB2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50OwotCQl2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50ID0gbmV3VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwoCi0JCQkJCXRoaXMsCi0JCQkJCU5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuVkFSSUFCSUxJVFlfRUxFTUVOVF9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVCwKLQkJCQkJb2xkVmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCwgdmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlZBUklBQklMSVRZX0VMRU1FTlRfX1ZBUklBQklMSVRZX1RZUEU6Ci0JCQlyZXR1cm4gZ2V0VmFyaWFiaWxpdHlUeXBlKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5WQVJJQUJJTElUWV9FTEVNRU5UX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UOgotCQkJaWYgKHJlc29sdmUpCi0JCQkJcmV0dXJuIGdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsKLQkJCXJldHVybiBiYXNpY0dldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuVkFSSUFCSUxJVFlfRUxFTUVOVF9fVkFSSUFCSUxJVFlfVFlQRToKLQkJCXNldFZhcmlhYmlsaXR5VHlwZSgoVmFyaWFiaWxpdHlUeXBlKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5WQVJJQUJJTElUWV9FTEVNRU5UX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UOgotCQkJc2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgoVmFyaWFiaWxpdHlFbGVtZW50KSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuVkFSSUFCSUxJVFlfRUxFTUVOVF9fVkFSSUFCSUxJVFlfVFlQRToKLQkJCXNldFZhcmlhYmlsaXR5VHlwZShWQVJJQUJJTElUWV9UWVBFX0VERUZBVUxUKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlZBUklBQklMSVRZX0VMRU1FTlRfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQ6Ci0JCQlzZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KChWYXJpYWJpbGl0eUVsZW1lbnQpIG51bGwpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCS8vVU1BLS0+Ci0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gZ2V0RmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWUoZmVhdHVyZUlEKTsKLQkJaWYgKGZlYXR1cmUgIT0gbnVsbCkgewotCQkJcmV0dXJuIGlzRmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWVTZXQoZmVhdHVyZSk7Ci0JCX0KLQkJLy9VTUE8LS0JCQotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuVkFSSUFCSUxJVFlfRUxFTUVOVF9fVkFSSUFCSUxJVFlfVFlQRToKLQkJCXJldHVybiB2YXJpYWJpbGl0eVR5cGUgIT0gVkFSSUFCSUxJVFlfVFlQRV9FREVGQVVMVDsKLQkJY2FzZSBVbWFQYWNrYWdlLlZBUklBQklMSVRZX0VMRU1FTlRfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQ6Ci0JCQlyZXR1cm4gdmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCAhPSBudWxsOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkKLQkJCXJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHZhcmlhYmlsaXR5VHlwZTogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZCh2YXJpYWJpbGl0eVR5cGUpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9WYXJpYWJpbGl0eUVsZW1lbnRJbXBsCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvV2hpdGVwYXBlckltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9XaGl0ZXBhcGVySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZDc4ZjdiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9XaGl0ZXBhcGVySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5XaGl0ZXBhcGVyOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+V2hpdGVwYXBlcjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFdoaXRlcGFwZXJJbXBsIGV4dGVuZHMgQ29uY2VwdEltcGwgaW1wbGVtZW50cyBXaGl0ZXBhcGVyIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBXaGl0ZXBhcGVySW1wbCgpIHsKLQkJc3VwZXIoKTsKLQotCQkvL1VNQS0tPgotCQlyZWFzc2lnbkRlZmF1bHRWYWx1ZXMoKTsKLQkJLy9VTUE8LS0gIAotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5XSElURVBBUEVSOwotCX0KLQotfSAvL1doaXRlcGFwZXJJbXBsCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvV29ya0JyZWFrZG93bkVsZW1lbnRJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvV29ya0JyZWFrZG93bkVsZW1lbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4MmU5ZDguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1dvcmtCcmVha2Rvd25FbGVtZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQ4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdFJlc29sdmluZ0VMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtCcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya09yZGVyOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+V29yayBCcmVha2Rvd24gRWxlbWVudDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLldvcmtCcmVha2Rvd25FbGVtZW50SW1wbCNnZXRJc1JlcGVhdGFibGUgPGVtPklzIFJlcGVhdGFibGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Xb3JrQnJlYWtkb3duRWxlbWVudEltcGwjZ2V0SXNPbmdvaW5nIDxlbT5JcyBPbmdvaW5nPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuV29ya0JyZWFrZG93bkVsZW1lbnRJbXBsI2dldElzRXZlbnREcml2ZW4gPGVtPklzIEV2ZW50IERyaXZlbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLldvcmtCcmVha2Rvd25FbGVtZW50SW1wbCNnZXRMaW5rVG9QcmVkZWNlc3NvciA8ZW0+TGluayBUbyBQcmVkZWNlc3NvcjwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFdvcmtCcmVha2Rvd25FbGVtZW50SW1wbCBleHRlbmRzIEJyZWFrZG93bkVsZW1lbnRJbXBsCi0JCWltcGxlbWVudHMgV29ya0JyZWFrZG93bkVsZW1lbnQgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElzUmVwZWF0YWJsZSgpIDxlbT5JcyBSZXBlYXRhYmxlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJc1JlcGVhdGFibGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQm9vbGVhbiBJU19SRVBFQVRBQkxFX0VERUZBVUxUID0gQm9vbGVhbi5GQUxTRTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElzUmVwZWF0YWJsZSgpIDxlbT5JcyBSZXBlYXRhYmxlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJc1JlcGVhdGFibGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCb29sZWFuIGlzUmVwZWF0YWJsZSA9IElTX1JFUEVBVEFCTEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SXNPbmdvaW5nKCkgPGVtPklzIE9uZ29pbmc8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldElzT25nb2luZygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCb29sZWFuIElTX09OR09JTkdfRURFRkFVTFQgPSBCb29sZWFuLkZBTFNFOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SXNPbmdvaW5nKCkgPGVtPklzIE9uZ29pbmc8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldElzT25nb2luZygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJvb2xlYW4gaXNPbmdvaW5nID0gSVNfT05HT0lOR19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJc0V2ZW50RHJpdmVuKCkgPGVtPklzIEV2ZW50IERyaXZlbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SXNFdmVudERyaXZlbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCb29sZWFuIElTX0VWRU5UX0RSSVZFTl9FREVGQVVMVCA9IEJvb2xlYW4uRkFMU0U7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJc0V2ZW50RHJpdmVuKCkgPGVtPklzIEV2ZW50IERyaXZlbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SXNFdmVudERyaXZlbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJvb2xlYW4gaXNFdmVudERyaXZlbiA9IElTX0VWRU5UX0RSSVZFTl9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldExpbmtUb1ByZWRlY2Vzc29yKCkgPGVtPkxpbmsgVG8gUHJlZGVjZXNzb3I8L2VtPn0nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TGlua1RvUHJlZGVjZXNzb3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxXb3JrT3JkZXI+IGxpbmtUb1ByZWRlY2Vzc29yOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFdvcmtCcmVha2Rvd25FbGVtZW50SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQotCQkvL1VNQS0tPgotCQlyZWFzc2lnbkRlZmF1bHRWYWx1ZXMoKTsKLQkJLy9VTUE8LS0gIAotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5XT1JLX0JSRUFLRE9XTl9FTEVNRU5UOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCb29sZWFuIGdldElzUmVwZWF0YWJsZSgpIHsKLQkJcmV0dXJuIGlzUmVwZWF0YWJsZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJc1JlcGVhdGFibGUoQm9vbGVhbiBuZXdJc1JlcGVhdGFibGUpIHsKLQkJQm9vbGVhbiBvbGRJc1JlcGVhdGFibGUgPSBpc1JlcGVhdGFibGU7Ci0JCWlzUmVwZWF0YWJsZSA9IG5ld0lzUmVwZWF0YWJsZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5XT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19JU19SRVBFQVRBQkxFLAotCQkJCQlvbGRJc1JlcGVhdGFibGUsIGlzUmVwZWF0YWJsZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCb29sZWFuIGdldElzT25nb2luZygpIHsKLQkJcmV0dXJuIGlzT25nb2luZzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJc09uZ29pbmcoQm9vbGVhbiBuZXdJc09uZ29pbmcpIHsKLQkJQm9vbGVhbiBvbGRJc09uZ29pbmcgPSBpc09uZ29pbmc7Ci0JCWlzT25nb2luZyA9IG5ld0lzT25nb2luZzsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5XT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19JU19PTkdPSU5HLAotCQkJCQlvbGRJc09uZ29pbmcsIGlzT25nb2luZykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCb29sZWFuIGdldElzRXZlbnREcml2ZW4oKSB7Ci0JCXJldHVybiBpc0V2ZW50RHJpdmVuOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldElzRXZlbnREcml2ZW4oQm9vbGVhbiBuZXdJc0V2ZW50RHJpdmVuKSB7Ci0JCUJvb2xlYW4gb2xkSXNFdmVudERyaXZlbiA9IGlzRXZlbnREcml2ZW47Ci0JCWlzRXZlbnREcml2ZW4gPSBuZXdJc0V2ZW50RHJpdmVuOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLldPUktfQlJFQUtET1dOX0VMRU1FTlRfX0lTX0VWRU5UX0RSSVZFTiwKLQkJCQkJb2xkSXNFdmVudERyaXZlbiwgaXNFdmVudERyaXZlbikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0PFdvcmtPcmRlcj4gZ2V0TGlua1RvUHJlZGVjZXNzb3IoKSB7Ci0JCWlmIChsaW5rVG9QcmVkZWNlc3NvciA9PSBudWxsKSB7Ci0JCQlsaW5rVG9QcmVkZWNlc3NvciA9IG5ldyBFT2JqZWN0UmVzb2x2aW5nRUxpc3Q8V29ya09yZGVyPigKLQkJCQkJV29ya09yZGVyLmNsYXNzLCB0aGlzLAotCQkJCQlVbWFQYWNrYWdlLldPUktfQlJFQUtET1dOX0VMRU1FTlRfX0xJTktfVE9fUFJFREVDRVNTT1IpOwotCQl9Ci0JCXJldHVybiBsaW5rVG9QcmVkZWNlc3NvcjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19JU19SRVBFQVRBQkxFOgotCQkJcmV0dXJuIGdldElzUmVwZWF0YWJsZSgpOwotCQljYXNlIFVtYVBhY2thZ2UuV09SS19CUkVBS0RPV05fRUxFTUVOVF9fSVNfT05HT0lORzoKLQkJCXJldHVybiBnZXRJc09uZ29pbmcoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfQlJFQUtET1dOX0VMRU1FTlRfX0lTX0VWRU5UX0RSSVZFTjoKLQkJCXJldHVybiBnZXRJc0V2ZW50RHJpdmVuKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19MSU5LX1RPX1BSRURFQ0VTU09SOgotCQkJcmV0dXJuIGdldExpbmtUb1ByZWRlY2Vzc29yKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfQlJFQUtET1dOX0VMRU1FTlRfX0lTX1JFUEVBVEFCTEU6Ci0JCQlzZXRJc1JlcGVhdGFibGUoKEJvb2xlYW4pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfQlJFQUtET1dOX0VMRU1FTlRfX0lTX09OR09JTkc6Ci0JCQlzZXRJc09uZ29pbmcoKEJvb2xlYW4pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfQlJFQUtET1dOX0VMRU1FTlRfX0lTX0VWRU5UX0RSSVZFTjoKLQkJCXNldElzRXZlbnREcml2ZW4oKEJvb2xlYW4pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfQlJFQUtET1dOX0VMRU1FTlRfX0xJTktfVE9fUFJFREVDRVNTT1I6Ci0JCQlnZXRMaW5rVG9QcmVkZWNlc3NvcigpLmNsZWFyKCk7Ci0JCQlnZXRMaW5rVG9QcmVkZWNlc3NvcigpLmFkZEFsbCgKLQkJCQkJKENvbGxlY3Rpb248PyBleHRlbmRzIFdvcmtPcmRlcj4pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19JU19SRVBFQVRBQkxFOgotCQkJc2V0SXNSZXBlYXRhYmxlKElTX1JFUEVBVEFCTEVfRURFRkFVTFQpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuV09SS19CUkVBS0RPV05fRUxFTUVOVF9fSVNfT05HT0lORzoKLQkJCXNldElzT25nb2luZyhJU19PTkdPSU5HX0VERUZBVUxUKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfQlJFQUtET1dOX0VMRU1FTlRfX0lTX0VWRU5UX0RSSVZFTjoKLQkJCXNldElzRXZlbnREcml2ZW4oSVNfRVZFTlRfRFJJVkVOX0VERUZBVUxUKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfQlJFQUtET1dOX0VMRU1FTlRfX0xJTktfVE9fUFJFREVDRVNTT1I6Ci0JCQlnZXRMaW5rVG9QcmVkZWNlc3NvcigpLmNsZWFyKCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJLy9VTUEtLT4KLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBnZXRGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZShmZWF0dXJlSUQpOwotCQlpZiAoZmVhdHVyZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gaXNGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZVNldChmZWF0dXJlKTsKLQkJfQotCQkvL1VNQTwtLQkJCi0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19JU19SRVBFQVRBQkxFOgotCQkJcmV0dXJuIElTX1JFUEVBVEFCTEVfRURFRkFVTFQgPT0gbnVsbCA/IGlzUmVwZWF0YWJsZSAhPSBudWxsCi0JCQkJCTogIUlTX1JFUEVBVEFCTEVfRURFRkFVTFQuZXF1YWxzKGlzUmVwZWF0YWJsZSk7Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19JU19PTkdPSU5HOgotCQkJcmV0dXJuIElTX09OR09JTkdfRURFRkFVTFQgPT0gbnVsbCA/IGlzT25nb2luZyAhPSBudWxsCi0JCQkJCTogIUlTX09OR09JTkdfRURFRkFVTFQuZXF1YWxzKGlzT25nb2luZyk7Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19JU19FVkVOVF9EUklWRU46Ci0JCQlyZXR1cm4gSVNfRVZFTlRfRFJJVkVOX0VERUZBVUxUID09IG51bGwgPyBpc0V2ZW50RHJpdmVuICE9IG51bGwKLQkJCQkJOiAhSVNfRVZFTlRfRFJJVkVOX0VERUZBVUxULmVxdWFscyhpc0V2ZW50RHJpdmVuKTsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfQlJFQUtET1dOX0VMRU1FTlRfX0xJTktfVE9fUFJFREVDRVNTT1I6Ci0JCQlyZXR1cm4gbGlua1RvUHJlZGVjZXNzb3IgIT0gbnVsbCAmJiAhbGlua1RvUHJlZGVjZXNzb3IuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkKLQkJCXJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGlzUmVwZWF0YWJsZTogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChpc1JlcGVhdGFibGUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGlzT25nb2luZzogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChpc09uZ29pbmcpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGlzRXZlbnREcml2ZW46ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoaXNFdmVudERyaXZlbik7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL1dvcmtCcmVha2Rvd25FbGVtZW50SW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1dvcmtEZWZpbml0aW9uSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1dvcmtEZWZpbml0aW9uSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOGZiMzRlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Xb3JrRGVmaW5pdGlvbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db25zdHJhaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtEZWZpbml0aW9uOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+V29yayBEZWZpbml0aW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuV29ya0RlZmluaXRpb25JbXBsI2dldFByZWNvbmRpdGlvbiA8ZW0+UHJlY29uZGl0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuV29ya0RlZmluaXRpb25JbXBsI2dldFBvc3Rjb25kaXRpb24gPGVtPlBvc3Rjb25kaXRpb248L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBXb3JrRGVmaW5pdGlvbkltcGwgZXh0ZW5kcyBNZXRob2RFbGVtZW50SW1wbCBpbXBsZW1lbnRzCi0JCVdvcmtEZWZpbml0aW9uIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByZWNvbmRpdGlvbigpIDxlbT5QcmVjb25kaXRpb248L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFByZWNvbmRpdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIENvbnN0cmFpbnQgcHJlY29uZGl0aW9uOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UG9zdGNvbmRpdGlvbigpIDxlbT5Qb3N0Y29uZGl0aW9uPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQb3N0Y29uZGl0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29uc3RyYWludCBwb3N0Y29uZGl0aW9uOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFdvcmtEZWZpbml0aW9uSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQotCQkvL1VNQS0tPgotCQlyZWFzc2lnbkRlZmF1bHRWYWx1ZXMoKTsKLQkJLy9VTUE8LS0gIAotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5XT1JLX0RFRklOSVRJT047Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENvbnN0cmFpbnQgZ2V0UHJlY29uZGl0aW9uKCkgewotCQlpZiAocHJlY29uZGl0aW9uICE9IG51bGwgJiYgKChFT2JqZWN0KSBwcmVjb25kaXRpb24pLmVJc1Byb3h5KCkpIHsKLQkJCUludGVybmFsRU9iamVjdCBvbGRQcmVjb25kaXRpb24gPSAoSW50ZXJuYWxFT2JqZWN0KSBwcmVjb25kaXRpb247Ci0JCQlwcmVjb25kaXRpb24gPSAoQ29uc3RyYWludCkgZVJlc29sdmVQcm94eShvbGRQcmVjb25kaXRpb24pOwotCQkJaWYgKHByZWNvbmRpdGlvbiAhPSBvbGRQcmVjb25kaXRpb24pIHsKLQkJCQlJbnRlcm5hbEVPYmplY3QgbmV3UHJlY29uZGl0aW9uID0gKEludGVybmFsRU9iamVjdCkgcHJlY29uZGl0aW9uOwotCQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBvbGRQcmVjb25kaXRpb24uZUludmVyc2VSZW1vdmUodGhpcywKLQkJCQkJCUVPUFBPU0lURV9GRUFUVVJFX0JBU0UKLQkJCQkJCQkJLSBVbWFQYWNrYWdlLldPUktfREVGSU5JVElPTl9fUFJFQ09ORElUSU9OLAotCQkJCQkJbnVsbCwgbnVsbCk7Ci0JCQkJaWYgKG5ld1ByZWNvbmRpdGlvbi5lSW50ZXJuYWxDb250YWluZXIoKSA9PSBudWxsKSB7Ci0JCQkJCW1zZ3MgPSBuZXdQcmVjb25kaXRpb24uZUludmVyc2VBZGQodGhpcywKLQkJCQkJCQlFT1BQT1NJVEVfRkVBVFVSRV9CQVNFCi0JCQkJCQkJCQktIFVtYVBhY2thZ2UuV09SS19ERUZJTklUSU9OX19QUkVDT05ESVRJT04sCi0JCQkJCQkJbnVsbCwgbXNncyk7Ci0JCQkJfQotCQkJCWlmIChtc2dzICE9IG51bGwpCi0JCQkJCW1zZ3MuZGlzcGF0Y2goKTsKLQkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLAotCQkJCQkJCVVtYVBhY2thZ2UuV09SS19ERUZJTklUSU9OX19QUkVDT05ESVRJT04sCi0JCQkJCQkJb2xkUHJlY29uZGl0aW9uLCBwcmVjb25kaXRpb24pKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcHJlY29uZGl0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb25zdHJhaW50IGJhc2ljR2V0UHJlY29uZGl0aW9uKCkgewotCQlyZXR1cm4gcHJlY29uZGl0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldFByZWNvbmRpdGlvbihDb25zdHJhaW50IG5ld1ByZWNvbmRpdGlvbiwKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJQ29uc3RyYWludCBvbGRQcmVjb25kaXRpb24gPSBwcmVjb25kaXRpb247Ci0JCXByZWNvbmRpdGlvbiA9IG5ld1ByZWNvbmRpdGlvbjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywKLQkJCQkJTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5XT1JLX0RFRklOSVRJT05fX1BSRUNPTkRJVElPTiwKLQkJCQkJb2xkUHJlY29uZGl0aW9uLCBuZXdQcmVjb25kaXRpb24pOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkKLQkJCQltc2dzID0gbm90aWZpY2F0aW9uOwotCQkJZWxzZQotCQkJCW1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHJlY29uZGl0aW9uKENvbnN0cmFpbnQgbmV3UHJlY29uZGl0aW9uKSB7Ci0JCWlmIChuZXdQcmVjb25kaXRpb24gIT0gcHJlY29uZGl0aW9uKSB7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChwcmVjb25kaXRpb24gIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpIHByZWNvbmRpdGlvbikuZUludmVyc2VSZW1vdmUodGhpcywKLQkJCQkJCUVPUFBPU0lURV9GRUFUVVJFX0JBU0UKLQkJCQkJCQkJLSBVbWFQYWNrYWdlLldPUktfREVGSU5JVElPTl9fUFJFQ09ORElUSU9OLAotCQkJCQkJbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3UHJlY29uZGl0aW9uICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KSBuZXdQcmVjb25kaXRpb24pLmVJbnZlcnNlQWRkKHRoaXMsCi0JCQkJCQlFT1BQT1NJVEVfRkVBVFVSRV9CQVNFCi0JCQkJCQkJCS0gVW1hUGFja2FnZS5XT1JLX0RFRklOSVRJT05fX1BSRUNPTkRJVElPTiwKLQkJCQkJCW51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0UHJlY29uZGl0aW9uKG5ld1ByZWNvbmRpdGlvbiwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKQotCQkJCW1zZ3MuZGlzcGF0Y2goKTsKLQkJfSBlbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuV09SS19ERUZJTklUSU9OX19QUkVDT05ESVRJT04sIG5ld1ByZWNvbmRpdGlvbiwKLQkJCQkJbmV3UHJlY29uZGl0aW9uKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENvbnN0cmFpbnQgZ2V0UG9zdGNvbmRpdGlvbigpIHsKLQkJaWYgKHBvc3Rjb25kaXRpb24gIT0gbnVsbCAmJiAoKEVPYmplY3QpIHBvc3Rjb25kaXRpb24pLmVJc1Byb3h5KCkpIHsKLQkJCUludGVybmFsRU9iamVjdCBvbGRQb3N0Y29uZGl0aW9uID0gKEludGVybmFsRU9iamVjdCkgcG9zdGNvbmRpdGlvbjsKLQkJCXBvc3Rjb25kaXRpb24gPSAoQ29uc3RyYWludCkgZVJlc29sdmVQcm94eShvbGRQb3N0Y29uZGl0aW9uKTsKLQkJCWlmIChwb3N0Y29uZGl0aW9uICE9IG9sZFBvc3Rjb25kaXRpb24pIHsKLQkJCQlJbnRlcm5hbEVPYmplY3QgbmV3UG9zdGNvbmRpdGlvbiA9IChJbnRlcm5hbEVPYmplY3QpIHBvc3Rjb25kaXRpb247Ci0JCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG9sZFBvc3Rjb25kaXRpb24uZUludmVyc2VSZW1vdmUodGhpcywKLQkJCQkJCUVPUFBPU0lURV9GRUFUVVJFX0JBU0UKLQkJCQkJCQkJLSBVbWFQYWNrYWdlLldPUktfREVGSU5JVElPTl9fUE9TVENPTkRJVElPTiwKLQkJCQkJCW51bGwsIG51bGwpOwotCQkJCWlmIChuZXdQb3N0Y29uZGl0aW9uLmVJbnRlcm5hbENvbnRhaW5lcigpID09IG51bGwpIHsKLQkJCQkJbXNncyA9IG5ld1Bvc3Rjb25kaXRpb24KLQkJCQkJCQkuZUludmVyc2VBZGQoCi0JCQkJCQkJCQl0aGlzLAotCQkJCQkJCQkJRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRQotCQkJCQkJCQkJCQktIFVtYVBhY2thZ2UuV09SS19ERUZJTklUSU9OX19QT1NUQ09ORElUSU9OLAotCQkJCQkJCQkJbnVsbCwgbXNncyk7Ci0JCQkJfQotCQkJCWlmIChtc2dzICE9IG51bGwpCi0JCQkJCW1zZ3MuZGlzcGF0Y2goKTsKLQkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLAotCQkJCQkJCVVtYVBhY2thZ2UuV09SS19ERUZJTklUSU9OX19QT1NUQ09ORElUSU9OLAotCQkJCQkJCW9sZFBvc3Rjb25kaXRpb24sIHBvc3Rjb25kaXRpb24pKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcG9zdGNvbmRpdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ29uc3RyYWludCBiYXNpY0dldFBvc3Rjb25kaXRpb24oKSB7Ci0JCXJldHVybiBwb3N0Y29uZGl0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldFBvc3Rjb25kaXRpb24oQ29uc3RyYWludCBuZXdQb3N0Y29uZGl0aW9uLAotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlDb25zdHJhaW50IG9sZFBvc3Rjb25kaXRpb24gPSBwb3N0Y29uZGl0aW9uOwotCQlwb3N0Y29uZGl0aW9uID0gbmV3UG9zdGNvbmRpdGlvbjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywKLQkJCQkJTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5XT1JLX0RFRklOSVRJT05fX1BPU1RDT05ESVRJT04sCi0JCQkJCW9sZFBvc3Rjb25kaXRpb24sIG5ld1Bvc3Rjb25kaXRpb24pOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkKLQkJCQltc2dzID0gbm90aWZpY2F0aW9uOwotCQkJZWxzZQotCQkJCW1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UG9zdGNvbmRpdGlvbihDb25zdHJhaW50IG5ld1Bvc3Rjb25kaXRpb24pIHsKLQkJaWYgKG5ld1Bvc3Rjb25kaXRpb24gIT0gcG9zdGNvbmRpdGlvbikgewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAocG9zdGNvbmRpdGlvbiAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCkgcG9zdGNvbmRpdGlvbikuZUludmVyc2VSZW1vdmUodGhpcywKLQkJCQkJCUVPUFBPU0lURV9GRUFUVVJFX0JBU0UKLQkJCQkJCQkJLSBVbWFQYWNrYWdlLldPUktfREVGSU5JVElPTl9fUE9TVENPTkRJVElPTiwKLQkJCQkJCW51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld1Bvc3Rjb25kaXRpb24gIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpIG5ld1Bvc3Rjb25kaXRpb24pLmVJbnZlcnNlQWRkKHRoaXMsCi0JCQkJCQlFT1BQT1NJVEVfRkVBVFVSRV9CQVNFCi0JCQkJCQkJCS0gVW1hUGFja2FnZS5XT1JLX0RFRklOSVRJT05fX1BPU1RDT05ESVRJT04sCi0JCQkJCQludWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldFBvc3Rjb25kaXRpb24obmV3UG9zdGNvbmRpdGlvbiwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKQotCQkJCW1zZ3MuZGlzcGF0Y2goKTsKLQkJfSBlbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuV09SS19ERUZJTklUSU9OX19QT1NUQ09ORElUSU9OLAotCQkJCQluZXdQb3N0Y29uZGl0aW9uLCBuZXdQb3N0Y29uZGl0aW9uKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwKLQkJCWludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfREVGSU5JVElPTl9fUFJFQ09ORElUSU9OOgotCQkJcmV0dXJuIGJhc2ljU2V0UHJlY29uZGl0aW9uKG51bGwsIG1zZ3MpOwotCQljYXNlIFVtYVBhY2thZ2UuV09SS19ERUZJTklUSU9OX19QT1NUQ09ORElUSU9OOgotCQkJcmV0dXJuIGJhc2ljU2V0UG9zdGNvbmRpdGlvbihudWxsLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuV09SS19ERUZJTklUSU9OX19QUkVDT05ESVRJT046Ci0JCQlpZiAocmVzb2x2ZSkKLQkJCQlyZXR1cm4gZ2V0UHJlY29uZGl0aW9uKCk7Ci0JCQlyZXR1cm4gYmFzaWNHZXRQcmVjb25kaXRpb24oKTsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfREVGSU5JVElPTl9fUE9TVENPTkRJVElPTjoKLQkJCWlmIChyZXNvbHZlKQotCQkJCXJldHVybiBnZXRQb3N0Y29uZGl0aW9uKCk7Ci0JCQlyZXR1cm4gYmFzaWNHZXRQb3N0Y29uZGl0aW9uKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfREVGSU5JVElPTl9fUFJFQ09ORElUSU9OOgotCQkJc2V0UHJlY29uZGl0aW9uKChDb25zdHJhaW50KSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX0RFRklOSVRJT05fX1BPU1RDT05ESVRJT046Ci0JCQlzZXRQb3N0Y29uZGl0aW9uKChDb25zdHJhaW50KSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuV09SS19ERUZJTklUSU9OX19QUkVDT05ESVRJT046Ci0JCQlzZXRQcmVjb25kaXRpb24oKENvbnN0cmFpbnQpIG51bGwpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuV09SS19ERUZJTklUSU9OX19QT1NUQ09ORElUSU9OOgotCQkJc2V0UG9zdGNvbmRpdGlvbigoQ29uc3RyYWludCkgbnVsbCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJLy9VTUEtLT4KLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBnZXRGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZShmZWF0dXJlSUQpOwotCQlpZiAoZmVhdHVyZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gaXNGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZVNldChmZWF0dXJlKTsKLQkJfQotCQkvL1VNQTwtLQkJCi0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX0RFRklOSVRJT05fX1BSRUNPTkRJVElPTjoKLQkJCXJldHVybiBwcmVjb25kaXRpb24gIT0gbnVsbDsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfREVGSU5JVElPTl9fUE9TVENPTkRJVElPTjoKLQkJCXJldHVybiBwb3N0Y29uZGl0aW9uICE9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotfSAvL1dvcmtEZWZpbml0aW9uSW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1dvcmtPcmRlckltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Xb3JrT3JkZXJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4MzllMzguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1dvcmtPcmRlckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya0JyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrT3JkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrT3JkZXJUeXBlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+V29yayBPcmRlcjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLldvcmtPcmRlckltcGwjZ2V0TGlua1R5cGUgPGVtPkxpbmsgVHlwZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLldvcmtPcmRlckltcGwjZ2V0UHJlZCA8ZW0+UHJlZDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFdvcmtPcmRlckltcGwgZXh0ZW5kcyBQcm9jZXNzRWxlbWVudEltcGwgaW1wbGVtZW50cyBXb3JrT3JkZXIgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldExpbmtUeXBlKCkgPGVtPkxpbmsgVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TGlua1R5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgV29ya09yZGVyVHlwZSBMSU5LX1RZUEVfRURFRkFVTFQgPSBXb3JrT3JkZXJUeXBlLkZJTklTSF9UT19TVEFSVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldExpbmtUeXBlKCkgPGVtPkxpbmsgVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TGlua1R5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBXb3JrT3JkZXJUeXBlIGxpbmtUeXBlID0gTElOS19UWVBFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJlZCgpIDxlbT5QcmVkPC9lbT59JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQcmVkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgV29ya0JyZWFrZG93bkVsZW1lbnQgcHJlZDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBXb3JrT3JkZXJJbXBsKCkgewotCQlzdXBlcigpOwotCi0JCS8vVU1BLS0+Ci0JCXJlYXNzaWduRGVmYXVsdFZhbHVlcygpOwotCQkvL1VNQTwtLSAgCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLldPUktfT1JERVI7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFdvcmtPcmRlclR5cGUgZ2V0TGlua1R5cGUoKSB7Ci0JCXJldHVybiBsaW5rVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMaW5rVHlwZShXb3JrT3JkZXJUeXBlIG5ld0xpbmtUeXBlKSB7Ci0JCVdvcmtPcmRlclR5cGUgb2xkTGlua1R5cGUgPSBsaW5rVHlwZTsKLQkJbGlua1R5cGUgPSBuZXdMaW5rVHlwZSA9PSBudWxsID8gTElOS19UWVBFX0VERUZBVUxUIDogbmV3TGlua1R5cGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuV09SS19PUkRFUl9fTElOS19UWVBFLCBvbGRMaW5rVHlwZSwgbGlua1R5cGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgV29ya0JyZWFrZG93bkVsZW1lbnQgZ2V0UHJlZCgpIHsKLQkJaWYgKHByZWQgIT0gbnVsbCAmJiAoKEVPYmplY3QpIHByZWQpLmVJc1Byb3h5KCkpIHsKLQkJCUludGVybmFsRU9iamVjdCBvbGRQcmVkID0gKEludGVybmFsRU9iamVjdCkgcHJlZDsKLQkJCXByZWQgPSAoV29ya0JyZWFrZG93bkVsZW1lbnQpIGVSZXNvbHZlUHJveHkob2xkUHJlZCk7Ci0JCQlpZiAocHJlZCAhPSBvbGRQcmVkKSB7Ci0JCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwKLQkJCQkJCQlVbWFQYWNrYWdlLldPUktfT1JERVJfX1BSRUQsIG9sZFByZWQsIHByZWQpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcHJlZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgV29ya0JyZWFrZG93bkVsZW1lbnQgYmFzaWNHZXRQcmVkKCkgewotCQlyZXR1cm4gcHJlZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQcmVkKFdvcmtCcmVha2Rvd25FbGVtZW50IG5ld1ByZWQpIHsKLQkJV29ya0JyZWFrZG93bkVsZW1lbnQgb2xkUHJlZCA9IHByZWQ7Ci0JCXByZWQgPSBuZXdQcmVkOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLldPUktfT1JERVJfX1BSRUQsIG9sZFByZWQsIHByZWQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX09SREVSX19MSU5LX1RZUEU6Ci0JCQlyZXR1cm4gZ2V0TGlua1R5cGUoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfT1JERVJfX1BSRUQ6Ci0JCQlpZiAocmVzb2x2ZSkKLQkJCQlyZXR1cm4gZ2V0UHJlZCgpOwotCQkJcmV0dXJuIGJhc2ljR2V0UHJlZCgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX09SREVSX19MSU5LX1RZUEU6Ci0JCQlzZXRMaW5rVHlwZSgoV29ya09yZGVyVHlwZSkgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuV09SS19PUkRFUl9fUFJFRDoKLQkJCXNldFByZWQoKFdvcmtCcmVha2Rvd25FbGVtZW50KSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuV09SS19PUkRFUl9fTElOS19UWVBFOgotCQkJc2V0TGlua1R5cGUoTElOS19UWVBFX0VERUZBVUxUKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfT1JERVJfX1BSRUQ6Ci0JCQlzZXRQcmVkKChXb3JrQnJlYWtkb3duRWxlbWVudCkgbnVsbCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJLy9VTUEtLT4KLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBnZXRGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZShmZWF0dXJlSUQpOwotCQlpZiAoZmVhdHVyZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gaXNGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZVNldChmZWF0dXJlKTsKLQkJfQotCQkvL1VNQTwtLQkJCi0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX09SREVSX19MSU5LX1RZUEU6Ci0JCQlyZXR1cm4gbGlua1R5cGUgIT0gTElOS19UWVBFX0VERUZBVUxUOwotCQljYXNlIFVtYVBhY2thZ2UuV09SS19PUkRFUl9fUFJFRDoKLQkJCXJldHVybiBwcmVkICE9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKQotCQkJcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAobGlua1R5cGU6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQobGlua1R5cGUpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9Xb3JrT3JkZXJJbXBsCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvV29ya1Byb2R1Y3REZXNjcmlwdGlvbkltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Xb3JrUHJvZHVjdERlc2NyaXB0aW9uSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjM2MzMWRkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Xb3JrUHJvZHVjdERlc2NyaXB0aW9uSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzA3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdGlvbjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPldvcmsgUHJvZHVjdCBEZXNjcmlwdGlvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLldvcmtQcm9kdWN0RGVzY3JpcHRpb25JbXBsI2dldFB1cnBvc2UgPGVtPlB1cnBvc2U8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Xb3JrUHJvZHVjdERlc2NyaXB0aW9uSW1wbCNnZXRJbXBhY3RPZk5vdEhhdmluZyA8ZW0+SW1wYWN0IE9mIE5vdCBIYXZpbmc8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Xb3JrUHJvZHVjdERlc2NyaXB0aW9uSW1wbCNnZXRSZWFzb25zRm9yTm90TmVlZGluZyA8ZW0+UmVhc29ucyBGb3IgTm90IE5lZWRpbmc8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBXb3JrUHJvZHVjdERlc2NyaXB0aW9uSW1wbCBleHRlbmRzIENvbnRlbnREZXNjcmlwdGlvbkltcGwKLQkJaW1wbGVtZW50cyBXb3JrUHJvZHVjdERlc2NyaXB0aW9uIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQdXJwb3NlKCkgPGVtPlB1cnBvc2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFB1cnBvc2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBVUlBPU0VfRURFRkFVTFQgPSAiIjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFB1cnBvc2UoKSA8ZW0+UHVycG9zZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UHVycG9zZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBwdXJwb3NlID0gUFVSUE9TRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJbXBhY3RPZk5vdEhhdmluZygpIDxlbT5JbXBhY3QgT2YgTm90IEhhdmluZzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SW1wYWN0T2ZOb3RIYXZpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIElNUEFDVF9PRl9OT1RfSEFWSU5HX0VERUZBVUxUID0gIiI7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJbXBhY3RPZk5vdEhhdmluZygpIDxlbT5JbXBhY3QgT2YgTm90IEhhdmluZzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SW1wYWN0T2ZOb3RIYXZpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgaW1wYWN0T2ZOb3RIYXZpbmcgPSBJTVBBQ1RfT0ZfTk9UX0hBVklOR19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZWFzb25zRm9yTm90TmVlZGluZygpIDxlbT5SZWFzb25zIEZvciBOb3QgTmVlZGluZzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmVhc29uc0Zvck5vdE5lZWRpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFJFQVNPTlNfRk9SX05PVF9ORUVESU5HX0VERUZBVUxUID0gIiI7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZWFzb25zRm9yTm90TmVlZGluZygpIDxlbT5SZWFzb25zIEZvciBOb3QgTmVlZGluZzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmVhc29uc0Zvck5vdE5lZWRpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgcmVhc29uc0Zvck5vdE5lZWRpbmcgPSBSRUFTT05TX0ZPUl9OT1RfTkVFRElOR19FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBXb3JrUHJvZHVjdERlc2NyaXB0aW9uSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQotCQkvL1VNQS0tPgotCQlyZWFzc2lnbkRlZmF1bHRWYWx1ZXMoKTsKLQkJLy9VTUE8LS0gIAotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5XT1JLX1BST0RVQ1RfREVTQ1JJUFRJT047Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQdXJwb3NlKCkgewotCQlyZXR1cm4gcHVycG9zZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQdXJwb3NlKFN0cmluZyBuZXdQdXJwb3NlKSB7Ci0JCVN0cmluZyBvbGRQdXJwb3NlID0gcHVycG9zZTsKLQkJcHVycG9zZSA9IG5ld1B1cnBvc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19QVVJQT1NFLCBvbGRQdXJwb3NlLAotCQkJCQlwdXJwb3NlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJbXBhY3RPZk5vdEhhdmluZygpIHsKLQkJcmV0dXJuIGltcGFjdE9mTm90SGF2aW5nOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEltcGFjdE9mTm90SGF2aW5nKFN0cmluZyBuZXdJbXBhY3RPZk5vdEhhdmluZykgewotCQlTdHJpbmcgb2xkSW1wYWN0T2ZOb3RIYXZpbmcgPSBpbXBhY3RPZk5vdEhhdmluZzsKLQkJaW1wYWN0T2ZOb3RIYXZpbmcgPSBuZXdJbXBhY3RPZk5vdEhhdmluZzsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX0lNUEFDVF9PRl9OT1RfSEFWSU5HLAotCQkJCQlvbGRJbXBhY3RPZk5vdEhhdmluZywgaW1wYWN0T2ZOb3RIYXZpbmcpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFJlYXNvbnNGb3JOb3ROZWVkaW5nKCkgewotCQlyZXR1cm4gcmVhc29uc0Zvck5vdE5lZWRpbmc7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmVhc29uc0Zvck5vdE5lZWRpbmcoU3RyaW5nIG5ld1JlYXNvbnNGb3JOb3ROZWVkaW5nKSB7Ci0JCVN0cmluZyBvbGRSZWFzb25zRm9yTm90TmVlZGluZyA9IHJlYXNvbnNGb3JOb3ROZWVkaW5nOwotCQlyZWFzb25zRm9yTm90TmVlZGluZyA9IG5ld1JlYXNvbnNGb3JOb3ROZWVkaW5nOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCgKLQkJCQkJdGhpcywKLQkJCQkJTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX1JFQVNPTlNfRk9SX05PVF9ORUVESU5HLAotCQkJCQlvbGRSZWFzb25zRm9yTm90TmVlZGluZywgcmVhc29uc0Zvck5vdE5lZWRpbmcpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX1BVUlBPU0U6Ci0JCQlyZXR1cm4gZ2V0UHVycG9zZSgpOwotCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19JTVBBQ1RfT0ZfTk9UX0hBVklORzoKLQkJCXJldHVybiBnZXRJbXBhY3RPZk5vdEhhdmluZygpOwotCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19SRUFTT05TX0ZPUl9OT1RfTkVFRElORzoKLQkJCXJldHVybiBnZXRSZWFzb25zRm9yTm90TmVlZGluZygpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX1BVUlBPU0U6Ci0JCQlzZXRQdXJwb3NlKChTdHJpbmcpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fSU1QQUNUX09GX05PVF9IQVZJTkc6Ci0JCQlzZXRJbXBhY3RPZk5vdEhhdmluZygoU3RyaW5nKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX1JFQVNPTlNfRk9SX05PVF9ORUVESU5HOgotCQkJc2V0UmVhc29uc0Zvck5vdE5lZWRpbmcoKFN0cmluZykgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fUFVSUE9TRToKLQkJCXNldFB1cnBvc2UoUFVSUE9TRV9FREVGQVVMVCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX0lNUEFDVF9PRl9OT1RfSEFWSU5HOgotCQkJc2V0SW1wYWN0T2ZOb3RIYXZpbmcoSU1QQUNUX09GX05PVF9IQVZJTkdfRURFRkFVTFQpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19SRUFTT05TX0ZPUl9OT1RfTkVFRElORzoKLQkJCXNldFJlYXNvbnNGb3JOb3ROZWVkaW5nKFJFQVNPTlNfRk9SX05PVF9ORUVESU5HX0VERUZBVUxUKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQkvL1VNQS0tPgotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IGdldEZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlKGZlYXR1cmVJRCk7Ci0JCWlmIChmZWF0dXJlICE9IG51bGwpIHsKLQkJCXJldHVybiBpc0ZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlU2V0KGZlYXR1cmUpOwotCQl9Ci0JCS8vVU1BPC0tCQkKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fUFVSUE9TRToKLQkJCXJldHVybiBQVVJQT1NFX0VERUZBVUxUID09IG51bGwgPyBwdXJwb3NlICE9IG51bGwKLQkJCQkJOiAhUFVSUE9TRV9FREVGQVVMVC5lcXVhbHMocHVycG9zZSk7Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX0lNUEFDVF9PRl9OT1RfSEFWSU5HOgotCQkJcmV0dXJuIElNUEFDVF9PRl9OT1RfSEFWSU5HX0VERUZBVUxUID09IG51bGwgPyBpbXBhY3RPZk5vdEhhdmluZyAhPSBudWxsCi0JCQkJCTogIUlNUEFDVF9PRl9OT1RfSEFWSU5HX0VERUZBVUxULmVxdWFscyhpbXBhY3RPZk5vdEhhdmluZyk7Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX1JFQVNPTlNfRk9SX05PVF9ORUVESU5HOgotCQkJcmV0dXJuIFJFQVNPTlNfRk9SX05PVF9ORUVESU5HX0VERUZBVUxUID09IG51bGwgPyByZWFzb25zRm9yTm90TmVlZGluZyAhPSBudWxsCi0JCQkJCTogIVJFQVNPTlNfRk9SX05PVF9ORUVESU5HX0VERUZBVUxUCi0JCQkJCQkJLmVxdWFscyhyZWFzb25zRm9yTm90TmVlZGluZyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKQotCQkJcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAocHVycG9zZTogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChwdXJwb3NlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBpbXBhY3RPZk5vdEhhdmluZzogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChpbXBhY3RPZk5vdEhhdmluZyk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcmVhc29uc0Zvck5vdE5lZWRpbmc6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQocmVhc29uc0Zvck5vdE5lZWRpbmcpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9Xb3JrUHJvZHVjdERlc2NyaXB0aW9uSW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1dvcmtQcm9kdWN0RGVzY3JpcHRvckltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Xb3JrUHJvZHVjdERlc2NyaXB0b3JJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllMTgzZjkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1dvcmtQcm9kdWN0RGVzY3JpcHRvckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdFJlc29sdmluZ0VMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RXaXRoSW52ZXJzZVJlc29sdmluZ0VMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3I7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Xb3JrIFByb2R1Y3QgRGVzY3JpcHRvcjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLldvcmtQcm9kdWN0RGVzY3JpcHRvckltcGwjZ2V0QWN0aXZpdHlFbnRyeVN0YXRlIDxlbT5BY3Rpdml0eSBFbnRyeSBTdGF0ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLldvcmtQcm9kdWN0RGVzY3JpcHRvckltcGwjZ2V0QWN0aXZpdHlFeGl0U3RhdGUgPGVtPkFjdGl2aXR5IEV4aXQgU3RhdGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Xb3JrUHJvZHVjdERlc2NyaXB0b3JJbXBsI2dldFdvcmtQcm9kdWN0IDxlbT5Xb3JrIFByb2R1Y3Q8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Xb3JrUHJvZHVjdERlc2NyaXB0b3JJbXBsI2dldEltcGFjdGVkQnkgPGVtPkltcGFjdGVkIEJ5PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuV29ya1Byb2R1Y3REZXNjcmlwdG9ySW1wbCNnZXRJbXBhY3RzIDxlbT5JbXBhY3RzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuV29ya1Byb2R1Y3REZXNjcmlwdG9ySW1wbCNnZXREZWxpdmVyYWJsZVBhcnRzIDxlbT5EZWxpdmVyYWJsZSBQYXJ0czwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFdvcmtQcm9kdWN0RGVzY3JpcHRvckltcGwgZXh0ZW5kcyBEZXNjcmlwdG9ySW1wbCBpbXBsZW1lbnRzCi0JCVdvcmtQcm9kdWN0RGVzY3JpcHRvciB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QWN0aXZpdHlFbnRyeVN0YXRlKCkgPGVtPkFjdGl2aXR5IEVudHJ5IFN0YXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBY3Rpdml0eUVudHJ5U3RhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElWSVRZX0VOVFJZX1NUQVRFX0VERUZBVUxUID0gIiI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFjdGl2aXR5RW50cnlTdGF0ZSgpIDxlbT5BY3Rpdml0eSBFbnRyeSBTdGF0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QWN0aXZpdHlFbnRyeVN0YXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGFjdGl2aXR5RW50cnlTdGF0ZSA9IEFDVElWSVRZX0VOVFJZX1NUQVRFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFjdGl2aXR5RXhpdFN0YXRlKCkgPGVtPkFjdGl2aXR5IEV4aXQgU3RhdGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFjdGl2aXR5RXhpdFN0YXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJVklUWV9FWElUX1NUQVRFX0VERUZBVUxUID0gIiI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFjdGl2aXR5RXhpdFN0YXRlKCkgPGVtPkFjdGl2aXR5IEV4aXQgU3RhdGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFjdGl2aXR5RXhpdFN0YXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGFjdGl2aXR5RXhpdFN0YXRlID0gQUNUSVZJVFlfRVhJVF9TVEFURV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFdvcmtQcm9kdWN0KCkgPGVtPldvcmsgUHJvZHVjdDwvZW0+fScgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0V29ya1Byb2R1Y3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBXb3JrUHJvZHVjdCB3b3JrUHJvZHVjdDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEltcGFjdGVkQnkoKSA8ZW0+SW1wYWN0ZWQgQnk8L2VtPn0nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SW1wYWN0ZWRCeSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PFdvcmtQcm9kdWN0RGVzY3JpcHRvcj4gaW1wYWN0ZWRCeTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEltcGFjdHMoKSA8ZW0+SW1wYWN0czwvZW0+fScgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJbXBhY3RzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8V29ya1Byb2R1Y3REZXNjcmlwdG9yPiBpbXBhY3RzOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVsaXZlcmFibGVQYXJ0cygpIDxlbT5EZWxpdmVyYWJsZSBQYXJ0czwvZW0+fScgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREZWxpdmVyYWJsZVBhcnRzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8V29ya1Byb2R1Y3REZXNjcmlwdG9yPiBkZWxpdmVyYWJsZVBhcnRzOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFdvcmtQcm9kdWN0RGVzY3JpcHRvckltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJLy9VTUEtLT4KLQkJcmVhc3NpZ25EZWZhdWx0VmFsdWVzKCk7Ci0JCS8vVU1BPC0tICAKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuV09SS19QUk9EVUNUX0RFU0NSSVBUT1I7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRBY3Rpdml0eUVudHJ5U3RhdGUoKSB7Ci0JCXJldHVybiBhY3Rpdml0eUVudHJ5U3RhdGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QWN0aXZpdHlFbnRyeVN0YXRlKFN0cmluZyBuZXdBY3Rpdml0eUVudHJ5U3RhdGUpIHsKLQkJU3RyaW5nIG9sZEFjdGl2aXR5RW50cnlTdGF0ZSA9IGFjdGl2aXR5RW50cnlTdGF0ZTsKLQkJYWN0aXZpdHlFbnRyeVN0YXRlID0gbmV3QWN0aXZpdHlFbnRyeVN0YXRlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX19BQ1RJVklUWV9FTlRSWV9TVEFURSwKLQkJCQkJb2xkQWN0aXZpdHlFbnRyeVN0YXRlLCBhY3Rpdml0eUVudHJ5U3RhdGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEFjdGl2aXR5RXhpdFN0YXRlKCkgewotCQlyZXR1cm4gYWN0aXZpdHlFeGl0U3RhdGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QWN0aXZpdHlFeGl0U3RhdGUoU3RyaW5nIG5ld0FjdGl2aXR5RXhpdFN0YXRlKSB7Ci0JCVN0cmluZyBvbGRBY3Rpdml0eUV4aXRTdGF0ZSA9IGFjdGl2aXR5RXhpdFN0YXRlOwotCQlhY3Rpdml0eUV4aXRTdGF0ZSA9IG5ld0FjdGl2aXR5RXhpdFN0YXRlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX19BQ1RJVklUWV9FWElUX1NUQVRFLAotCQkJCQlvbGRBY3Rpdml0eUV4aXRTdGF0ZSwgYWN0aXZpdHlFeGl0U3RhdGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgV29ya1Byb2R1Y3QgZ2V0V29ya1Byb2R1Y3QoKSB7Ci0JCWlmICh3b3JrUHJvZHVjdCAhPSBudWxsICYmICgoRU9iamVjdCkgd29ya1Byb2R1Y3QpLmVJc1Byb3h5KCkpIHsKLQkJCUludGVybmFsRU9iamVjdCBvbGRXb3JrUHJvZHVjdCA9IChJbnRlcm5hbEVPYmplY3QpIHdvcmtQcm9kdWN0OwotCQkJd29ya1Byb2R1Y3QgPSAoV29ya1Byb2R1Y3QpIGVSZXNvbHZlUHJveHkob2xkV29ya1Byb2R1Y3QpOwotCQkJaWYgKHdvcmtQcm9kdWN0ICE9IG9sZFdvcmtQcm9kdWN0KSB7Ci0JCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwKLQkJCQkJCQlVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX19XT1JLX1BST0RVQ1QsCi0JCQkJCQkJb2xkV29ya1Byb2R1Y3QsIHdvcmtQcm9kdWN0KSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHdvcmtQcm9kdWN0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBXb3JrUHJvZHVjdCBiYXNpY0dldFdvcmtQcm9kdWN0KCkgewotCQlyZXR1cm4gd29ya1Byb2R1Y3Q7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0V29ya1Byb2R1Y3QoV29ya1Byb2R1Y3QgbmV3V29ya1Byb2R1Y3QpIHsKLQkJV29ya1Byb2R1Y3Qgb2xkV29ya1Byb2R1Y3QgPSB3b3JrUHJvZHVjdDsKLQkJd29ya1Byb2R1Y3QgPSBuZXdXb3JrUHJvZHVjdDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fV09SS19QUk9EVUNULAotCQkJCQlvbGRXb3JrUHJvZHVjdCwgd29ya1Byb2R1Y3QpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdDxXb3JrUHJvZHVjdERlc2NyaXB0b3I+IGdldEltcGFjdGVkQnkoKSB7Ci0JCWlmIChpbXBhY3RlZEJ5ID09IG51bGwpIHsKLQkJCWltcGFjdGVkQnkgPSBuZXcgRU9iamVjdFdpdGhJbnZlcnNlUmVzb2x2aW5nRUxpc3QuTWFueUludmVyc2U8V29ya1Byb2R1Y3REZXNjcmlwdG9yPigKLQkJCQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yLmNsYXNzLCB0aGlzLAotCQkJCQlVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX19JTVBBQ1RFRF9CWSwKLQkJCQkJVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fSU1QQUNUUyk7Ci0JCX0KLQkJcmV0dXJuIGltcGFjdGVkQnk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3Q8V29ya1Byb2R1Y3REZXNjcmlwdG9yPiBnZXRJbXBhY3RzKCkgewotCQlpZiAoaW1wYWN0cyA9PSBudWxsKSB7Ci0JCQlpbXBhY3RzID0gbmV3IEVPYmplY3RXaXRoSW52ZXJzZVJlc29sdmluZ0VMaXN0Lk1hbnlJbnZlcnNlPFdvcmtQcm9kdWN0RGVzY3JpcHRvcj4oCi0JCQkJCVdvcmtQcm9kdWN0RGVzY3JpcHRvci5jbGFzcywgdGhpcywKLQkJCQkJVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fSU1QQUNUUywKLQkJCQkJVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fSU1QQUNURURfQlkpOwotCQl9Ci0JCXJldHVybiBpbXBhY3RzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0PFdvcmtQcm9kdWN0RGVzY3JpcHRvcj4gZ2V0RGVsaXZlcmFibGVQYXJ0cygpIHsKLQkJaWYgKGRlbGl2ZXJhYmxlUGFydHMgPT0gbnVsbCkgewotCQkJZGVsaXZlcmFibGVQYXJ0cyA9IG5ldyBFT2JqZWN0UmVzb2x2aW5nRUxpc3Q8V29ya1Byb2R1Y3REZXNjcmlwdG9yPigKLQkJCQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yLmNsYXNzLCB0aGlzLAotCQkJCQlVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX19ERUxJVkVSQUJMRV9QQVJUUyk7Ci0JCX0KLQkJcmV0dXJuIGRlbGl2ZXJhYmxlUGFydHM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JQE92ZXJyaWRlCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlQWRkKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwKLQkJCWludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX19JTVBBQ1RFRF9CWToKLQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8SW50ZXJuYWxFT2JqZWN0PikgKEludGVybmFsRUxpc3Q8Pz4pIGdldEltcGFjdGVkQnkoKSkKLQkJCQkJLmJhc2ljQWRkKG90aGVyRW5kLCBtc2dzKTsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX19JTVBBQ1RTOgotCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDxJbnRlcm5hbEVPYmplY3Q+KSAoSW50ZXJuYWxFTGlzdDw/PikgZ2V0SW1wYWN0cygpKQotCQkJCQkuYmFzaWNBZGQob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZUFkZChvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLAotCQkJaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0lNUEFDVEVEX0JZOgotCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PikgZ2V0SW1wYWN0ZWRCeSgpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwKLQkJCQkJbXNncyk7Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fSU1QQUNUUzoKLQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pIGdldEltcGFjdHMoKSkKLQkJCQkJLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0FDVElWSVRZX0VOVFJZX1NUQVRFOgotCQkJcmV0dXJuIGdldEFjdGl2aXR5RW50cnlTdGF0ZSgpOwotCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0FDVElWSVRZX0VYSVRfU1RBVEU6Ci0JCQlyZXR1cm4gZ2V0QWN0aXZpdHlFeGl0U3RhdGUoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX19XT1JLX1BST0RVQ1Q6Ci0JCQlpZiAocmVzb2x2ZSkKLQkJCQlyZXR1cm4gZ2V0V29ya1Byb2R1Y3QoKTsKLQkJCXJldHVybiBiYXNpY0dldFdvcmtQcm9kdWN0KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fSU1QQUNURURfQlk6Ci0JCQlyZXR1cm4gZ2V0SW1wYWN0ZWRCeSgpOwotCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0lNUEFDVFM6Ci0JCQlyZXR1cm4gZ2V0SW1wYWN0cygpOwotCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0RFTElWRVJBQkxFX1BBUlRTOgotCQkJcmV0dXJuIGdldERlbGl2ZXJhYmxlUGFydHMoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0FDVElWSVRZX0VOVFJZX1NUQVRFOgotCQkJc2V0QWN0aXZpdHlFbnRyeVN0YXRlKChTdHJpbmcpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX19BQ1RJVklUWV9FWElUX1NUQVRFOgotCQkJc2V0QWN0aXZpdHlFeGl0U3RhdGUoKFN0cmluZykgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX1dPUktfUFJPRFVDVDoKLQkJCXNldFdvcmtQcm9kdWN0KChXb3JrUHJvZHVjdCkgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0lNUEFDVEVEX0JZOgotCQkJZ2V0SW1wYWN0ZWRCeSgpLmNsZWFyKCk7Ci0JCQlnZXRJbXBhY3RlZEJ5KCkuYWRkQWxsKAotCQkJCQkoQ29sbGVjdGlvbjw/IGV4dGVuZHMgV29ya1Byb2R1Y3REZXNjcmlwdG9yPikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0lNUEFDVFM6Ci0JCQlnZXRJbXBhY3RzKCkuY2xlYXIoKTsKLQkJCWdldEltcGFjdHMoKS5hZGRBbGwoCi0JCQkJCShDb2xsZWN0aW9uPD8gZXh0ZW5kcyBXb3JrUHJvZHVjdERlc2NyaXB0b3I+KSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fREVMSVZFUkFCTEVfUEFSVFM6Ci0JCQlnZXREZWxpdmVyYWJsZVBhcnRzKCkuY2xlYXIoKTsKLQkJCWdldERlbGl2ZXJhYmxlUGFydHMoKS5hZGRBbGwoCi0JCQkJCShDb2xsZWN0aW9uPD8gZXh0ZW5kcyBXb3JrUHJvZHVjdERlc2NyaXB0b3I+KSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0FDVElWSVRZX0VOVFJZX1NUQVRFOgotCQkJc2V0QWN0aXZpdHlFbnRyeVN0YXRlKEFDVElWSVRZX0VOVFJZX1NUQVRFX0VERUZBVUxUKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX19BQ1RJVklUWV9FWElUX1NUQVRFOgotCQkJc2V0QWN0aXZpdHlFeGl0U3RhdGUoQUNUSVZJVFlfRVhJVF9TVEFURV9FREVGQVVMVCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fV09SS19QUk9EVUNUOgotCQkJc2V0V29ya1Byb2R1Y3QoKFdvcmtQcm9kdWN0KSBudWxsKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX19JTVBBQ1RFRF9CWToKLQkJCWdldEltcGFjdGVkQnkoKS5jbGVhcigpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0lNUEFDVFM6Ci0JCQlnZXRJbXBhY3RzKCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX19ERUxJVkVSQUJMRV9QQVJUUzoKLQkJCWdldERlbGl2ZXJhYmxlUGFydHMoKS5jbGVhcigpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCS8vVU1BLS0+Ci0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gZ2V0RmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWUoZmVhdHVyZUlEKTsKLQkJaWYgKGZlYXR1cmUgIT0gbnVsbCkgewotCQkJcmV0dXJuIGlzRmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWVTZXQoZmVhdHVyZSk7Ci0JCX0KLQkJLy9VTUE8LS0JCQotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0FDVElWSVRZX0VOVFJZX1NUQVRFOgotCQkJcmV0dXJuIEFDVElWSVRZX0VOVFJZX1NUQVRFX0VERUZBVUxUID09IG51bGwgPyBhY3Rpdml0eUVudHJ5U3RhdGUgIT0gbnVsbAotCQkJCQk6ICFBQ1RJVklUWV9FTlRSWV9TVEFURV9FREVGQVVMVC5lcXVhbHMoYWN0aXZpdHlFbnRyeVN0YXRlKTsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX19BQ1RJVklUWV9FWElUX1NUQVRFOgotCQkJcmV0dXJuIEFDVElWSVRZX0VYSVRfU1RBVEVfRURFRkFVTFQgPT0gbnVsbCA/IGFjdGl2aXR5RXhpdFN0YXRlICE9IG51bGwKLQkJCQkJOiAhQUNUSVZJVFlfRVhJVF9TVEFURV9FREVGQVVMVC5lcXVhbHMoYWN0aXZpdHlFeGl0U3RhdGUpOwotCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX1dPUktfUFJPRFVDVDoKLQkJCXJldHVybiB3b3JrUHJvZHVjdCAhPSBudWxsOwotCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0lNUEFDVEVEX0JZOgotCQkJcmV0dXJuIGltcGFjdGVkQnkgIT0gbnVsbCAmJiAhaW1wYWN0ZWRCeS5pc0VtcHR5KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fSU1QQUNUUzoKLQkJCXJldHVybiBpbXBhY3RzICE9IG51bGwgJiYgIWltcGFjdHMuaXNFbXB0eSgpOwotCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0RFTElWRVJBQkxFX1BBUlRTOgotCQkJcmV0dXJuIGRlbGl2ZXJhYmxlUGFydHMgIT0gbnVsbCAmJiAhZGVsaXZlcmFibGVQYXJ0cy5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKQotCQkJcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoYWN0aXZpdHlFbnRyeVN0YXRlOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGFjdGl2aXR5RW50cnlTdGF0ZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgYWN0aXZpdHlFeGl0U3RhdGU6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoYWN0aXZpdHlFeGl0U3RhdGUpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9Xb3JrUHJvZHVjdERlc2NyaXB0b3JJbXBsCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvV29ya1Byb2R1Y3RJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvV29ya1Byb2R1Y3RJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyYzc1MDkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1dvcmtQcm9kdWN0SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQ5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVW5pcXVlRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RSZXNvbHZpbmdFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkVzdGltYXRpb25Db25zaWRlcmF0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkZ1bGZpbGxhYmxlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJlcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGVtcGxhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Ub29sTWVudG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5Bc3NvY2lhdGlvbkhlbHBlcjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPldvcmsgUHJvZHVjdDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLldvcmtQcm9kdWN0SW1wbCNnZXRGdWxmaWxscyA8ZW0+RnVsZmlsbHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Xb3JrUHJvZHVjdEltcGwjZ2V0UmVwb3J0cyA8ZW0+UmVwb3J0czwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLldvcmtQcm9kdWN0SW1wbCNnZXRUZW1wbGF0ZXMgPGVtPlRlbXBsYXRlczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLldvcmtQcm9kdWN0SW1wbCNnZXRUb29sTWVudG9ycyA8ZW0+VG9vbCBNZW50b3JzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuV29ya1Byb2R1Y3RJbXBsI2dldEVzdGltYXRpb25Db25zaWRlcmF0aW9ucyA8ZW0+RXN0aW1hdGlvbiBDb25zaWRlcmF0aW9uczwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFdvcmtQcm9kdWN0SW1wbCBleHRlbmRzIENvbnRlbnRFbGVtZW50SW1wbCBpbXBsZW1lbnRzIFdvcmtQcm9kdWN0IHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEZ1bGZpbGxzKCkgPGVtPkZ1bGZpbGxzPC9lbT59JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEZ1bGZpbGxzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8RnVsZmlsbGFibGVFbGVtZW50PiBmdWxmaWxsczsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlcG9ydHMoKSA8ZW0+UmVwb3J0czwvZW0+fScgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZXBvcnRzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8UmVwb3J0PiByZXBvcnRzOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VGVtcGxhdGVzKCkgPGVtPlRlbXBsYXRlczwvZW0+fScgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUZW1wbGF0ZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxUZW1wbGF0ZT4gdGVtcGxhdGVzOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VG9vbE1lbnRvcnMoKSA8ZW0+VG9vbCBNZW50b3JzPC9lbT59JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFRvb2xNZW50b3JzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8VG9vbE1lbnRvcj4gdG9vbE1lbnRvcnM7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMoKSA8ZW0+RXN0aW1hdGlvbiBDb25zaWRlcmF0aW9uczwvZW0+fScgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnM+IGVzdGltYXRpb25Db25zaWRlcmF0aW9uczsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBXb3JrUHJvZHVjdEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJLy9VTUEtLT4KLQkJcmVhc3NpZ25EZWZhdWx0VmFsdWVzKCk7Ci0JCS8vVU1BPC0tICAKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuV09SS19QUk9EVUNUOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0PEZ1bGZpbGxhYmxlRWxlbWVudD4gZ2V0RnVsZmlsbHMoKSB7Ci0JCWlmIChmdWxmaWxscyA9PSBudWxsKSB7Ci0JCQlmdWxmaWxscyA9IG5ldyBFT2JqZWN0UmVzb2x2aW5nRUxpc3Q8RnVsZmlsbGFibGVFbGVtZW50PigKLQkJCQkJRnVsZmlsbGFibGVFbGVtZW50LmNsYXNzLCB0aGlzLAotCQkJCQlVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9fRlVMRklMTFMpOwotCQl9Ci0JCXJldHVybiBmdWxmaWxsczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdDxSZXBvcnQ+IGdldFJlcG9ydHMoKSB7Ci0JCWlmIChyZXBvcnRzID09IG51bGwpIHsKLQkJCXJlcG9ydHMgPSBuZXcgRU9iamVjdFJlc29sdmluZ0VMaXN0PFJlcG9ydD4oUmVwb3J0LmNsYXNzLCB0aGlzLAotCQkJCQlVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9fUkVQT1JUUyk7Ci0JCX0KLQkJcmV0dXJuIHJlcG9ydHM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3Q8VGVtcGxhdGU+IGdldFRlbXBsYXRlcygpIHsKLQkJaWYgKHRlbXBsYXRlcyA9PSBudWxsKSB7Ci0JCQl0ZW1wbGF0ZXMgPSBuZXcgRU9iamVjdFJlc29sdmluZ0VMaXN0PFRlbXBsYXRlPihUZW1wbGF0ZS5jbGFzcywKLQkJCQkJdGhpcywgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfX1RFTVBMQVRFUyk7Ci0JCX0KLQkJcmV0dXJuIHRlbXBsYXRlczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdDxUb29sTWVudG9yPiBnZXRUb29sTWVudG9ycygpIHsKLQkJaWYgKHRvb2xNZW50b3JzID09IG51bGwpIHsKLQkJCXRvb2xNZW50b3JzID0gbmV3IEVPYmplY3RSZXNvbHZpbmdFTGlzdDxUb29sTWVudG9yPigKLQkJCQkJVG9vbE1lbnRvci5jbGFzcywgdGhpcywKLQkJCQkJVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfX1RPT0xfTUVOVE9SUyk7Ci0JCX0KLQkJcmV0dXJuIHRvb2xNZW50b3JzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0PEVzdGltYXRpb25Db25zaWRlcmF0aW9ucz4gZ2V0RXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKCkgewotCQlpZiAoZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zID09IG51bGwpIHsKLQkJCWVzdGltYXRpb25Db25zaWRlcmF0aW9ucyA9IG5ldyBFT2JqZWN0UmVzb2x2aW5nRUxpc3Q8RXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zPigKLQkJCQkJRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zLmNsYXNzLCB0aGlzLAotCQkJCQlVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9fRVNUSU1BVElPTl9DT05TSURFUkFUSU9OUyk7Ci0JCX0KLQkJcmV0dXJuIGVzdGltYXRpb25Db25zaWRlcmF0aW9uczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfX0ZVTEZJTExTOgotCQkJcmV0dXJuIGdldEZ1bGZpbGxzKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfX1JFUE9SVFM6Ci0JCQlyZXR1cm4gZ2V0UmVwb3J0cygpOwotCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX19URU1QTEFURVM6Ci0JCQlyZXR1cm4gZ2V0VGVtcGxhdGVzKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfX1RPT0xfTUVOVE9SUzoKLQkJCXJldHVybiBnZXRUb29sTWVudG9ycygpOwotCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX19FU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TOgotCQkJcmV0dXJuIGdldEVzdGltYXRpb25Db25zaWRlcmF0aW9ucygpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfX0ZVTEZJTExTOgotCQkJZ2V0RnVsZmlsbHMoKS5jbGVhcigpOwotCQkJZ2V0RnVsZmlsbHMoKS5hZGRBbGwoCi0JCQkJCShDb2xsZWN0aW9uPD8gZXh0ZW5kcyBGdWxmaWxsYWJsZUVsZW1lbnQ+KSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfX1JFUE9SVFM6Ci0JCQlnZXRSZXBvcnRzKCkuY2xlYXIoKTsKLQkJCWdldFJlcG9ydHMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFJlcG9ydD4pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9fVEVNUExBVEVTOgotCQkJZ2V0VGVtcGxhdGVzKCkuY2xlYXIoKTsKLQkJCWdldFRlbXBsYXRlcygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgVGVtcGxhdGU+KSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfX1RPT0xfTUVOVE9SUzoKLQkJCWdldFRvb2xNZW50b3JzKCkuY2xlYXIoKTsKLQkJCWdldFRvb2xNZW50b3JzKCkKLQkJCQkJLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgVG9vbE1lbnRvcj4pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9fRVNUSU1BVElPTl9DT05TSURFUkFUSU9OUzoKLQkJCWdldEVzdGltYXRpb25Db25zaWRlcmF0aW9ucygpLmNsZWFyKCk7Ci0JCQlnZXRFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMoKS5hZGRBbGwoCi0JCQkJCShDb2xsZWN0aW9uPD8gZXh0ZW5kcyBFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnM+KSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX19GVUxGSUxMUzoKLQkJCWdldEZ1bGZpbGxzKCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9fUkVQT1JUUzoKLQkJCWdldFJlcG9ydHMoKS5jbGVhcigpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX19URU1QTEFURVM6Ci0JCQlnZXRUZW1wbGF0ZXMoKS5jbGVhcigpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX19UT09MX01FTlRPUlM6Ci0JCQlnZXRUb29sTWVudG9ycygpLmNsZWFyKCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfX0VTVElNQVRJT05fQ09OU0lERVJBVElPTlM6Ci0JCQlnZXRFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMoKS5jbGVhcigpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCS8vVU1BLS0+Ci0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gZ2V0RmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWUoZmVhdHVyZUlEKTsKLQkJaWYgKGZlYXR1cmUgIT0gbnVsbCkgewotCQkJcmV0dXJuIGlzRmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWVTZXQoZmVhdHVyZSk7Ci0JCX0KLQkJLy9VTUE8LS0JCQotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX19GVUxGSUxMUzoKLQkJCXJldHVybiBmdWxmaWxscyAhPSBudWxsICYmICFmdWxmaWxscy5pc0VtcHR5KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfX1JFUE9SVFM6Ci0JCQlyZXR1cm4gcmVwb3J0cyAhPSBudWxsICYmICFyZXBvcnRzLmlzRW1wdHkoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9fVEVNUExBVEVTOgotCQkJcmV0dXJuIHRlbXBsYXRlcyAhPSBudWxsICYmICF0ZW1wbGF0ZXMuaXNFbXB0eSgpOwotCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX19UT09MX01FTlRPUlM6Ci0JCQlyZXR1cm4gdG9vbE1lbnRvcnMgIT0gbnVsbCAmJiAhdG9vbE1lbnRvcnMuaXNFbXB0eSgpOwotCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX19FU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TOgotCQkJcmV0dXJuIGVzdGltYXRpb25Db25zaWRlcmF0aW9ucyAhPSBudWxsCi0JCQkJCSYmICFlc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgaW50IGVCYXNlU3RydWN0dXJhbEZlYXR1cmVJRChpbnQgZGVyaXZlZEZlYXR1cmVJRCwgQ2xhc3M8Pz4gYmFzZUNsYXNzKSB7Ci0JCWlmIChiYXNlQ2xhc3MgPT0gRnVsZmlsbGFibGVFbGVtZW50LmNsYXNzKSB7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfX0ZVTEZJTExTOgotCQkJCXJldHVybiBVbWFQYWNrYWdlLkZVTEZJTExBQkxFX0VMRU1FTlRfX0ZVTEZJTExTOwotCQkJZGVmYXVsdDoKLQkJCQlyZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVCYXNlU3RydWN0dXJhbEZlYXR1cmVJRChkZXJpdmVkRmVhdHVyZUlELCBiYXNlQ2xhc3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBpbnQgZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGludCBiYXNlRmVhdHVyZUlELCBDbGFzczw/PiBiYXNlQ2xhc3MpIHsKLQkJaWYgKGJhc2VDbGFzcyA9PSBGdWxmaWxsYWJsZUVsZW1lbnQuY2xhc3MpIHsKLQkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkZVTEZJTExBQkxFX0VMRU1FTlRfX0ZVTEZJTExTOgotCQkJCXJldHVybiBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9fRlVMRklMTFM7Ci0JCQlkZWZhdWx0OgotCQkJCXJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXIuZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGJhc2VGZWF0dXJlSUQsIGJhc2VDbGFzcyk7Ci0JfQotCi19IC8vV29ya1Byb2R1Y3RJbXBsCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvV29ya1Byb2R1Y3RUeXBlSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1dvcmtQcm9kdWN0VHlwZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzI1MTlhNS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvV29ya1Byb2R1Y3RUeXBlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0UmVzb2x2aW5nRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdFR5cGU7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Xb3JrIFByb2R1Y3QgVHlwZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLldvcmtQcm9kdWN0VHlwZUltcGwjZ2V0V29ya1Byb2R1Y3RzIDxlbT5Xb3JrIFByb2R1Y3RzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgV29ya1Byb2R1Y3RUeXBlSW1wbCBleHRlbmRzIENvbnRlbnRDYXRlZ29yeUltcGwgaW1wbGVtZW50cwotCQlXb3JrUHJvZHVjdFR5cGUgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0V29ya1Byb2R1Y3RzKCkgPGVtPldvcmsgUHJvZHVjdHM8L2VtPn0nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0V29ya1Byb2R1Y3RzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8V29ya1Byb2R1Y3Q+IHdvcmtQcm9kdWN0czsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBXb3JrUHJvZHVjdFR5cGVJbXBsKCkgewotCQlzdXBlcigpOwotCi0JCS8vVU1BLS0+Ci0JCXJlYXNzaWduRGVmYXVsdFZhbHVlcygpOwotCQkvL1VNQTwtLSAgCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLldPUktfUFJPRFVDVF9UWVBFOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0PFdvcmtQcm9kdWN0PiBnZXRXb3JrUHJvZHVjdHMoKSB7Ci0JCWlmICh3b3JrUHJvZHVjdHMgPT0gbnVsbCkgewotCQkJd29ya1Byb2R1Y3RzID0gbmV3IEVPYmplY3RSZXNvbHZpbmdFTGlzdDxXb3JrUHJvZHVjdD4oCi0JCQkJCVdvcmtQcm9kdWN0LmNsYXNzLCB0aGlzLAotCQkJCQlVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9UWVBFX19XT1JLX1BST0RVQ1RTKTsKLQkJfQotCQlyZXR1cm4gd29ya1Byb2R1Y3RzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9UWVBFX19XT1JLX1BST0RVQ1RTOgotCQkJcmV0dXJuIGdldFdvcmtQcm9kdWN0cygpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfVFlQRV9fV09SS19QUk9EVUNUUzoKLQkJCWdldFdvcmtQcm9kdWN0cygpLmNsZWFyKCk7Ci0JCQlnZXRXb3JrUHJvZHVjdHMoKS5hZGRBbGwoCi0JCQkJCShDb2xsZWN0aW9uPD8gZXh0ZW5kcyBXb3JrUHJvZHVjdD4pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfVFlQRV9fV09SS19QUk9EVUNUUzoKLQkJCWdldFdvcmtQcm9kdWN0cygpLmNsZWFyKCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJLy9VTUEtLT4KLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBnZXRGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZShmZWF0dXJlSUQpOwotCQlpZiAoZmVhdHVyZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gaXNGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZVNldChmZWF0dXJlKTsKLQkJfQotCQkvL1VNQTwtLQkJCi0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfVFlQRV9fV09SS19QUk9EVUNUUzoKLQkJCXJldHVybiB3b3JrUHJvZHVjdHMgIT0gbnVsbCAmJiAhd29ya1Byb2R1Y3RzLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi19IC8vV29ya1Byb2R1Y3RUeXBlSW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL3BhY2thZ2UuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmMGZiNzUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIHRoZSBpbXBsZW1lbnRhdGlvbiBmb3IgdGhlIFVNQSBtb2RlbCBvYmplY3RzLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcGFja2FnZS5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjNDQzODUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyB0aGUgaW50ZXJmYWNlcyBmb3IgdGhlIFVNQSBtb2RlbCBvYmplY3RzLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvdXRpbC9Bc3NvY2lhdGlvbkhlbHBlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS91dGlsL0Fzc29jaWF0aW9uSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkNzRlZmIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS91dGlsL0Fzc29jaWF0aW9uSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzI0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbDsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkZpZWxkOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1vZGlmaWVyOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5CYXNpY0VMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VbmlxdWVFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ2FwYWJpbGl0eVBhdHRlcm47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DaGVja2xpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db25jZXB0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DdXN0b21DYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaWJhYmxlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpc2NpcGxpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5FeGFtcGxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRnVsZmlsbGFibGVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3VpZGVsaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUmVwb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUmV1c2FibGVBc3NldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvYWRtYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuU2VjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlN1cHBvcnRpbmdNYXRlcmlhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZW1wbGF0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRvb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Ub29sTWVudG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtCcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya09yZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS5pbXBsLk11bHRpUmVzb3VyY2VFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUudXRpbC5PcHBvc2l0ZUZlYXR1cmU7Ci0KLS8qKgotICogQSBoZWxwZXIgY2xhc3MgZm9yIG5hdmlnYXRpbmcgYW5kIHF1ZXJ5aW5nIGJpZGlyZWN0aW9uYWwgYXNzb2NpYXRpb25zIGFtb25nCi0gKiB0aGUgbW9kZWwgb2JqZWN0cy4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgQXNzb2NpYXRpb25IZWxwZXIgewotCi0JLyoqCi0JICogQW4gb3Bwb3NpdGUgZmVhdHVyZSB1c2VkIGZvciByZXRyaWV2aW5nIHRoZSBkaXNjaXBsaW5lcyB3aGljaCBhIHRhc2sgaXMKLQkgKiBjYXRlZ29yaXplZCB1bmRlci4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIE9wcG9zaXRlRmVhdHVyZSBUYXNrX0Rpc2NpcGxpbmVzID0gbmV3IE9wcG9zaXRlRmVhdHVyZSgKLQkJCVRhc2suY2xhc3MsCi0JCQkiVGFza19EaXNjaXBsaW5lcyIsIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldERpc2NpcGxpbmVfVGFza3MoKSwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEFuIG9wcG9zaXRlIGZlYXR1cmUgdXNlZCBmb3IgcmV0cmlldmluZyB0aGUgdGFzayBkZXNjcmlwdG9ycyB3aGljaCBhcmUKLQkgKiBjcmVhdGVkIGZyb20gYSBzcGVjaWZpYyB0YXNrLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgT3Bwb3NpdGVGZWF0dXJlIFRhc2tfVGFza0Rlc2NyaXB0b3JzID0gbmV3IE9wcG9zaXRlRmVhdHVyZSgKLQkJCVRhc2suY2xhc3MsCi0JCQkiVGFza19UYXNrRGVzY3JpcHRvcnMiLCBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrRGVzY3JpcHRvcl9UYXNrKCksIHRydWUsIGZhbHNlKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQW4gb3Bwb3NpdGUgZmVhdHVyZSB1c2VkIGZvciByZXRyaWV2aW5nIHRoZSBkb21haW5zIHdoaWNoIGEgd29yayBwcm9kdWN0Ci0JICogaXMgY2F0ZWdvcml6ZWQgdW5kZXIuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBPcHBvc2l0ZUZlYXR1cmUgV29ya1Byb2R1Y3RfRG9tYWlucyA9IG5ldyBPcHBvc2l0ZUZlYXR1cmUoCi0JCQlXb3JrUHJvZHVjdC5jbGFzcywKLQkJCSJXb3JrUHJvZHVjdF9Eb21haW5zIiwgVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RG9tYWluX1dvcmtQcm9kdWN0cygpLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQW4gb3Bwb3NpdGUgZmVhdHVyZSB1c2VkIGZvciByZXRyaWV2aW5nIHRoZSB0YXNrcyB3aGljaCBwcm9kdWNlIGEgd29yawotCSAqIHByb2R1Y3QgYXMgYW4gb3V0cHV0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgT3Bwb3NpdGVGZWF0dXJlIFdvcmtQcm9kdWN0X091dHB1dEZyb21fVGFza3MgPSBuZXcgT3Bwb3NpdGVGZWF0dXJlKAotCQkJV29ya1Byb2R1Y3QuY2xhc3MsCi0JCQkiV29ya1Byb2R1Y3RfT3V0cHV0RnJvbV9UYXNrcyIsIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tfT3V0cHV0KCksIHRydWUpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBbiBvcHBvc2l0ZSBmZWF0dXJlIHVzZWQgZm9yIHJldHJpZXZpbmcgdGhlIHRhc2tzIHdoaWNoIHVzZSBhIHdvcmsKLQkgKiBwcm9kdWN0IGFzIGEgbWFuZGF0b3J5IGlucHV0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgT3Bwb3NpdGVGZWF0dXJlIFdvcmtQcm9kdWN0X01hbmRhdG9yeUlucHV0VG9fVGFza3MgPSBuZXcgT3Bwb3NpdGVGZWF0dXJlKAotCQkJV29ya1Byb2R1Y3QuY2xhc3MsCi0JCQkiV29ya1Byb2R1Y3RfSW5wdXRUb19UYXNrcyIsIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tfTWFuZGF0b3J5SW5wdXQoKSwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEFuIG9wcG9zaXRlIGZlYXR1cmUgdXNlZCBmb3IgcmV0cmlldmluZyB0aGUgd29yayBwcm9kdWN0IHR5cGVzIHdoaWNoIGEKLQkgKiB3b3JrIHByb2R1Y3QgaXMgY2F0ZWdvcml6ZWQgdW5kZXIuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBPcHBvc2l0ZUZlYXR1cmUgV29ya1Byb2R1Y3RfV29ya1Byb2R1Y3RUeXBlcyA9IG5ldyBPcHBvc2l0ZUZlYXR1cmUoCi0JCQlXb3JrUHJvZHVjdC5jbGFzcywKLQkJCSJXb3JrUHJvZHVjdF9Xb3JrUHJvZHVjdFR5cGVzIiwgVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V29ya1Byb2R1Y3RUeXBlX1dvcmtQcm9kdWN0cygpLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQW4gb3Bwb3NpdGUgZmVhdHVyZSB1c2VkIGZvciByZXRyaWV2aW5nIHRoZSByZXNwb25zaWJsZSByb2xlcyBmb3IgYSB3b3JrCi0JICogcHJvZHVjdC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIE9wcG9zaXRlRmVhdHVyZSBXb3JrUHJvZHVjdF9SZXNwb25zaWJsZVJvbGVzID0gbmV3IE9wcG9zaXRlRmVhdHVyZSgKLQkJCVdvcmtQcm9kdWN0LmNsYXNzLAotCQkJIldvcmtQcm9kdWN0X1Jlc3BvbnNpYmxlUm9sZXMiLCBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRSb2xlX1Jlc3BvbnNpYmxlRm9yKCksIHRydWUpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBbiBvcHBvc2l0ZSBmZWF0dXJlIHVzZWQgZm9yIHJldHJpZXZpbmcgdGhlIGRlbGl2ZXJhYmxlcyB3aGljaCBhIHdvcmsKLQkgKiBwcm9kdWN0IGlzIGNvbnRhaW5lZCBpbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIE9wcG9zaXRlRmVhdHVyZSBXb3JrUHJvZHVjdF9EZWxpdmVyYWJsZXMgPSBuZXcgT3Bwb3NpdGVGZWF0dXJlKAotCQkJV29ya1Byb2R1Y3QuY2xhc3MsCi0JCQkiV29ya1Byb2R1Y3RfRGVsaXZlcmFibGVzIiwgVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RGVsaXZlcmFibGVfRGVsaXZlcmVkV29ya1Byb2R1Y3RzKCksIHRydWUpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBbiBvcHBvc2l0ZSBmZWF0dXJlIHVzZWQgZm9yIHJldHJpZXZpbmcgdGhlIHRhc2tzIHRoYXQgdXNlIGEgd29yayBwcm9kdWN0Ci0JICogYXMgYW4gb3B0aW9uYWwgaW5wdXQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBPcHBvc2l0ZUZlYXR1cmUgV29ya1Byb2R1Y3RfT3B0aW9uYWxJbnB1dFRvX1Rhc2tzID0gbmV3IE9wcG9zaXRlRmVhdHVyZSgKLQkJCVdvcmtQcm9kdWN0LmNsYXNzLAotCQkJIldvcmtQcm9kdWN0X09wdGlvbmFsSW5wdXRUb19UYXNrcyIsIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tfT3B0aW9uYWxJbnB1dCgpLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQW4gb3Bwb3NpdGUgZmVhdHVyZSB1c2VkIGZvciByZXRyaWV2aW5nIHRoZSB3b3JrIHByb2R1Y3QgZGVzY3JpcHRvcnMKLQkgKiB3aGljaCBhcmUgY3JlYXRlZCBmcm9tIGEgd29yayBwcm9kdWN0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgT3Bwb3NpdGVGZWF0dXJlIFdvcmtQcm9kdWN0X1dvcmtQcm9kdWN0RGVzY3JpcHRvcnMgPSBuZXcgT3Bwb3NpdGVGZWF0dXJlKAotCQkJV29ya1Byb2R1Y3QuY2xhc3MsCi0JCQkiV29ya1Byb2R1Y3RfV29ya1Byb2R1Y3REZXNjcmlwdG9ycyIsIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9Xb3JrUHJvZHVjdCgpLCB0cnVlLCBmYWxzZSk7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEFuIG9wcG9zaXRlIGZlYXR1cmUgdXNlZCBmb3IgcmV0cmlldmluZyB0aGUgcHJpbWFyeSB0YXNrcyBvZiBhIHJvbGUuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBPcHBvc2l0ZUZlYXR1cmUgUm9sZV9QcmltYXJ5X1Rhc2tzID0gbmV3IE9wcG9zaXRlRmVhdHVyZSgKLQkJCVJvbGUuY2xhc3MsCi0JCQkiUm9sZV9QcmltYXJ5X1Rhc2tzIiwgVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza19QZXJmb3JtZWRCeSgpLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQW4gb3Bwb3NpdGUgZmVhdHVyZSB1c2VkIGZvciByZXRyaWV2aW5nIHRoZSBzZWNvbmRhcnkgdGFza3Mgb2YgYSByb2xlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgT3Bwb3NpdGVGZWF0dXJlIFJvbGVfU2Vjb25kYXJ5X1Rhc2tzID0gbmV3IE9wcG9zaXRlRmVhdHVyZSgKLQkJCVJvbGUuY2xhc3MsCi0JCQkiUm9sZV9TZWNvbmRhcnlfVGFza3MiLCBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrX0FkZGl0aW9uYWxseVBlcmZvcm1lZEJ5KCksIHRydWUpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBbiBvcHBvc2l0ZSBmZWF0dXJlIHVzZWQgZm9yIHJldHJpZXZpbmcgdGhlIHJvbGUgc2V0cyB3aGljaCBhIHJvbGUgaXMKLQkgKiBjYXRlZ29yaXplZCB1bmRlci4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIE9wcG9zaXRlRmVhdHVyZSBSb2xlX1JvbGVTZXRzID0gbmV3IE9wcG9zaXRlRmVhdHVyZSgKLQkJCVJvbGUuY2xhc3MsCi0JCQkiUm9sZV9Sb2xlU2V0cyIsIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFJvbGVTZXRfUm9sZXMoKSwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEFuIG9wcG9zaXRlIGZlYXR1cmUgdXNlZCBmb3IgcmV0cmlldmluZyB0aGUgY29tcG9zaXRlIHJvbGVzIHdoaWNoCi0JICogaW5jbHVkZXMgYSByb2xlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgT3Bwb3NpdGVGZWF0dXJlIFJvbGVfQ29tcG9zaXRlUm9sZXMgPSBuZXcgT3Bwb3NpdGVGZWF0dXJlKAotCQkJUm9sZS5jbGFzcywKLQkJCSJSb2xlX0NvbXBvc2l0ZVJvbGVzIiwgVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29tcG9zaXRlUm9sZV9BZ2dyZWdhdGVkUm9sZXMoKSwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEFuIG9wcG9zaXRlIGZlYXR1cmUgdXNlZCBmb3IgcmV0cmlldmluZyB0aGUgcm9sZSBkZXNjcmlwdG9ycyB3aGljaCBhcmUKLQkgKiBjcmVhdGVkIGZyb20gYSByb2xlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgT3Bwb3NpdGVGZWF0dXJlIFJvbGVfUm9sZURlc2NyaXB0b3JzID0gbmV3IE9wcG9zaXRlRmVhdHVyZSgKLQkJCVJvbGUuY2xhc3MsCi0JCQkiUm9sZV9Sb2xlRGVzY3JpcHRvcnMiLCBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRSb2xlRGVzY3JpcHRvcl9Sb2xlKCksIHRydWUsIGZhbHNlKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQW4gb3Bwb3NpdGUgZmVhdHVyZSB1c2VkIGZvciByZXRyaWV2aW5nIHRoZSBjb250ZW50IGVsZW1lbnRzIHdoaWNoIGEKLQkgKiBjaGVja2xpc3QgaXMgYXNzb2NpYXRlZCB3aXRoLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgT3Bwb3NpdGVGZWF0dXJlIENoZWNrbGlzdF9Db250ZW50RWxlbWVudHMgPSBuZXcgT3Bwb3NpdGVGZWF0dXJlKAotCQkJQ2hlY2tsaXN0LmNsYXNzLAotCQkJIkNoZWNrbGlzdF9Db250ZW50RWxlbWVudHMiLCBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb250ZW50RWxlbWVudF9DaGVja2xpc3RzKCksIHRydWUpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBbiBvcHBvc2l0ZSBmZWF0dXJlIHVzZWQgZm9yIHJldHJpZXZpbmcgdGhlIGFjdGl2aXRpZXMgd2hpY2ggYSBjaGVja2xpc3QgaXMKLQkgKiBhc3NvY2lhdGVkIHdpdGguCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBPcHBvc2l0ZUZlYXR1cmUgQ2hlY2tsaXN0X0JyZWFrZG93bkVsZW1lbnRzID0gbmV3IE9wcG9zaXRlRmVhdHVyZSgKLQkJCUNoZWNrbGlzdC5jbGFzcywKLQkJCSJDaGVja2xpc3RfQnJlYWtkb3duRWxlbWVudHMiLCBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRCcmVha2Rvd25FbGVtZW50X0NoZWNrbGlzdHMoKSwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEFuIG9wcG9zaXRlIGZlYXR1cmUgdXNlZCBmb3IgcmV0cmlldmluZyB0aGUgYWN0aXZpdGllcyB3aGljaCBhIGNvbmNlcHQgaXMKLQkgKiBhc3NvY2lhdGVkIHdpdGguCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBPcHBvc2l0ZUZlYXR1cmUgQ29uY2VwdF9CcmVha2Rvd25FbGVtZW50cyA9IG5ldyBPcHBvc2l0ZUZlYXR1cmUoCi0JCQlDb25jZXB0LmNsYXNzLAotCQkJIkNvbmNlcHRfQnJlYWtkb3duRWxlbWVudHMiLCBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRCcmVha2Rvd25FbGVtZW50X0NvbmNlcHRzKCksIHRydWUsIGZhbHNlKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQW4gb3Bwb3NpdGUgZmVhdHVyZSB1c2VkIGZvciByZXRyaWV2aW5nIHRoZSBhY3Rpdml0aWVzIHdoaWNoIGFuIGV4YW1wbGUgaXMKLQkgKiBhc3NvY2lhdGVkIHdpdGguCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBPcHBvc2l0ZUZlYXR1cmUgRXhhbXBsZV9CcmVha2Rvd25FbGVtZW50cyA9IG5ldyBPcHBvc2l0ZUZlYXR1cmUoCi0JCQlDb25jZXB0LmNsYXNzLAotCQkJIkV4YW1wbGVfQnJlYWtkb3duRWxlbWVudHMiLCBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRCcmVha2Rvd25FbGVtZW50X0V4YW1wbGVzKCksIHRydWUsIGZhbHNlKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQW4gb3Bwb3NpdGUgZmVhdHVyZSB1c2VkIGZvciByZXRyaWV2aW5nIHRoZSBhY3Rpdml0aWVzIHdoaWNoIGEgUmV1c2FibGVBc3NldCBpcwotCSAqIGFzc29jaWF0ZWQgd2l0aC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIE9wcG9zaXRlRmVhdHVyZSBSZXVzYWJsZUFzc2V0X0JyZWFrZG93bkVsZW1lbnRzID0gbmV3IE9wcG9zaXRlRmVhdHVyZSgKLQkJCUNvbmNlcHQuY2xhc3MsCi0JCQkiUmV1c2FibGVBc3NldF9CcmVha2Rvd25FbGVtZW50cyIsIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEJyZWFrZG93bkVsZW1lbnRfUmV1c2FibGVBc3NldHMoKSwgdHJ1ZSwgZmFsc2UpOyAvLyROT04tTkxTLTEkCi0KLQotCS8qKgotCSAqIEFuIG9wcG9zaXRlIGZlYXR1cmUgdXNlZCBmb3IgcmV0cmlldmluZyB0aGUgY29udGVudCBlbGVtZW50cyB3aGljaCBhCi0JICogY29uY2VwdCBpcyBhc3NvY2lhdGVkIHdpdGguCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBPcHBvc2l0ZUZlYXR1cmUgQ29uY2VwdF9Db250ZW50RWxlbWVudHMgPSBuZXcgT3Bwb3NpdGVGZWF0dXJlKAotCQkJQ29uY2VwdC5jbGFzcywKLQkJCSJDb25jZXB0X0NvbnRlbnRFbGVtZW50cyIsIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbnRlbnRFbGVtZW50X0NvbmNlcHRzQW5kUGFwZXJzKCksIHRydWUpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBbiBvcHBvc2l0ZSBmZWF0dXJlIHVzZWQgZm9yIHJldHJpZXZpbmcgdGhlIGNvbnRlbnQgZWxlbWVudHMgd2hpY2ggYW4KLQkgKiBleGFtcGxlIGlzIGFzc29jaWF0ZWQgd2l0aC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIE9wcG9zaXRlRmVhdHVyZSBFeGFtcGxlX0NvbnRlbnRFbGVtZW50cyA9IG5ldyBPcHBvc2l0ZUZlYXR1cmUoCi0JCQlFeGFtcGxlLmNsYXNzLAotCQkJIkV4YW1wbGVfQ29udGVudEVsZW1lbnRzIiwgVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29udGVudEVsZW1lbnRfRXhhbXBsZXMoKSwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEFuIG9wcG9zaXRlIGZlYXR1cmUgdXNlZCBmb3IgcmV0cmlldmluZyB0aGUgY29udGVudCBlbGVtZW50cyB3aGljaCBhCi0JICogcmVwb3J0IGlzIGFzc29jaWF0ZWQgd2l0aC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIE9wcG9zaXRlRmVhdHVyZSBSZXBvcnRfV29ya1Byb2R1Y3RzID0gbmV3IE9wcG9zaXRlRmVhdHVyZSgKLQkJCVJlcG9ydC5jbGFzcywKLQkJCSJSZXBvcnRfV29ya1Byb2R1Y3RzIiwgVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V29ya1Byb2R1Y3RfUmVwb3J0cygpLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQW4gb3Bwb3NpdGUgZmVhdHVyZSB1c2VkIGZvciByZXRyaWV2aW5nIHRoZSB0YXNrcyB3aGljaCBhCi0JICogRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIGlzIGFzc29jaWF0ZWQgd2l0aC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIE9wcG9zaXRlRmVhdHVyZSBFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnNfVGFza3MgPSBuZXcgT3Bwb3NpdGVGZWF0dXJlKAotCQkJUmVwb3J0LmNsYXNzLAotCQkJIkVzdGltYXRpb25Db25zaWRlcmF0aW9uc19UYXNrcyIsIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tfRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKCksIHRydWUpOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogQW4gb3Bwb3NpdGUgZmVhdHVyZSB1c2VkIGZvciByZXRyaWV2aW5nIHRoZSB3b3JrIHByb2R1Y3RzIHdoaWNoIGEKLQkgKiBFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMgaXMgYXNzb2NpYXRlZCB3aXRoLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgT3Bwb3NpdGVGZWF0dXJlIEVzdGltYXRpb25Db25zaWRlcmF0aW9uc19Xb3JrUHJvZHVjdHMgPSBuZXcgT3Bwb3NpdGVGZWF0dXJlKAotCQkJUmVwb3J0LmNsYXNzLAotCQkJIkVzdGltYXRpb25Db25zaWRlcmF0aW9uc19Xb3JrUHJvZHVjdHMiLCBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRXb3JrUHJvZHVjdF9Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMoKSwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEFuIG9wcG9zaXRlIGZlYXR1cmUgdXNlZCBmb3IgcmV0cmlldmluZyB0aGUgY29udGVudCBlbGVtZW50cyB3aGljaCBhCi0JICogcmV1c2FibGUgYXNzZXQgaXMgYXNzb2NpYXRlZCB3aXRoLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgT3Bwb3NpdGVGZWF0dXJlIFJldXNhYmxlQXNzZXRfQ29udGVudEVsZW1lbnRzID0gbmV3IE9wcG9zaXRlRmVhdHVyZSgKLQkJCVJldXNhYmxlQXNzZXQuY2xhc3MsCi0JCQkiUmV1c2FibGVBc3NldF9Db250ZW50RWxlbWVudHMiLCBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb250ZW50RWxlbWVudF9Bc3NldHMoKSwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEFuIG9wcG9zaXRlIGZlYXR1cmUgdXNlZCBmb3IgcmV0cmlldmluZyB0aGUgYWN0aXZpdGllcyB3aGljaCBhIHJvYWRtYXAgaXMKLQkgKiBhc3NvY2lhdGVkIHdpdGguCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBPcHBvc2l0ZUZlYXR1cmUgUm9hZG1hcF9BY3Rpdml0ZXMgPSBuZXcgT3Bwb3NpdGVGZWF0dXJlKAotCQkJUm9hZG1hcC5jbGFzcywKLQkJCSJSb2FkbWFwX0FjdGl2aXRlcyIsIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEFjdGl2aXR5X1JvYWRtYXBzKCksIHRydWUpOyAvLyROT04tTkxTLTEkCi0KLQkKLQkvKioKLQkgKiBBbiBvcHBvc2l0ZSBmZWF0dXJlIHVzZWQgZm9yIHJldHJpZXZpbmcgdGhlIGZ1bGZpbGxzIGVsZW1lbnRzIHdoaWNoIGEgd29ya3Byb2R1Y3QgaXMKLQkgKiBhc3NvY2lhdGVkIHdpdGguCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBPcHBvc2l0ZUZlYXR1cmUgRnVsRmlsbHNfRnVsbEZpbGxhYmxlRWxlbWVudHMgPSBuZXcgT3Bwb3NpdGVGZWF0dXJlKAotCQkJRnVsZmlsbGFibGVFbGVtZW50LmNsYXNzLAotCQkJIkZ1bEZpbGxzX0Z1bGxGaWxsYWJsZUVsZW1lbnRzIiwgVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RnVsZmlsbGFibGVFbGVtZW50X0Z1bGZpbGxzKCksIHRydWUpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBbiBvcHBvc2l0ZSBmZWF0dXJlIHVzZWQgZm9yIHJldHJpZXZpbmcgdGhlIGFjdGl2aXRpZXMgd2hpY2ggYSBzdXBwb3J0aW5nCi0JICogbWF0ZXJpYWwgaXMgYXNzb2NpYXRlZCB3aXRoLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgT3Bwb3NpdGVGZWF0dXJlIFN1cHBvcnRpbmdNYXRlcmlhbF9CcmVha2Rvd25FbGVtZW50cyA9IG5ldyBPcHBvc2l0ZUZlYXR1cmUoCi0JCQlTdXBwb3J0aW5nTWF0ZXJpYWwuY2xhc3MsCi0JCQkiU3VwcG9ydGluZ01hdGVyaWFsX0JyZWFrZG93bkVsZW1lbnRzIiwgVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QnJlYWtkb3duRWxlbWVudF9TdXBwb3J0aW5nTWF0ZXJpYWxzKCksIHRydWUsIGZhbHNlKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQW4gb3Bwb3NpdGUgZmVhdHVyZSB1c2VkIGZvciByZXRyaWV2aW5nIHRoZSBjb250ZW50IGVsZW1lbnRzIHdoaWNoIGEKLQkgKiBzdXBwb3J0aW5nIG1hdGVyaWFsIGlzIGFzc29jaWF0ZWQgd2l0aC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIE9wcG9zaXRlRmVhdHVyZSBTdXBwb3J0aW5nTWF0ZXJpYWxfQ29udGVudEVsZW1lbnRzID0gbmV3IE9wcG9zaXRlRmVhdHVyZSgKLQkJCVN1cHBvcnRpbmdNYXRlcmlhbC5jbGFzcywKLQkJCSJTdXBwb3J0aW5nTWF0ZXJpYWxfQ29udGVudEVsZW1lbnRzIiwgVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29udGVudEVsZW1lbnRfU3VwcG9ydGluZ01hdGVyaWFscygpLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQW4gb3Bwb3NpdGUgZmVhdHVyZSB1c2VkIGZvciByZXRyaWV2aW5nIHRoZSBkZWxpdmVyeSBwcm9jZXNzZXMgd2hpY2ggYQotCSAqIGNvbW11bmljYXRpb24gc3VwcG9ydGluZyBtYXRlcmlhbCBpcyBhc3NvY2lhdGVkIHdpdGguCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBPcHBvc2l0ZUZlYXR1cmUgU3VwcG9ydGluZ01hdGVyaWFsX0NvbW11bmljYXRpb25zX0RlbGl2ZXJ5UHJvY2Vzc2VzID0gbmV3IE9wcG9zaXRlRmVhdHVyZSgKLQkJCVN1cHBvcnRpbmdNYXRlcmlhbC5jbGFzcywKLQkJCSJTdXBwb3J0aW5nTWF0ZXJpYWxfQ29tbXVuaWNhdGlvbnNfRGVsaXZlcnlQcm9jZXNzZXMiLCBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXREZWxpdmVyeVByb2Nlc3NfQ29tbXVuaWNhdGlvbnNNYXRlcmlhbHMoKSwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEFuIG9wcG9zaXRlIGZlYXR1cmUgdXNlZCBmb3IgcmV0cmlldmluZyB0aGUgZGVsaXZlcnkgcHJvY2Vzc2VzIHdoaWNoIGFuCi0JICogZWR1Y2F0aW9uIHN1cHBvcnRpbmcgbWF0ZXJpYWwgaXMgYXNzb2NpYXRlZCB3aXRoLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgT3Bwb3NpdGVGZWF0dXJlIFN1cHBvcnRpbmdNYXRlcmlhbF9FZHVjYXRpb25fRGVsaXZlcnlQcm9jZXNzZXMgPSBuZXcgT3Bwb3NpdGVGZWF0dXJlKAotCQkJU3VwcG9ydGluZ01hdGVyaWFsLmNsYXNzLAotCQkJIlN1cHBvcnRpbmdNYXRlcmlhbF9FZHVjYXRpb25fRGVsaXZlcnlQcm9jZXNzZXMiLCBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXREZWxpdmVyeVByb2Nlc3NfRWR1Y2F0aW9uTWF0ZXJpYWxzKCksIHRydWUpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBbiBvcHBvc2l0ZSBmZWF0dXJlIHVzZWQgZm9yIHJldHJpZXZpbmcgdGhlIG1ldGhvZCB1bml0cyB3aGljaCBhCi0JICogY29weXJpZ2h0IHN1cHBvcnRpbmcgbWF0ZXJpYWwgaXMgYXNzb2NpYXRlZCB3aXRoLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgT3Bwb3NpdGVGZWF0dXJlIFN1cHBvcnRpbmdNYXRlcmlhbF9Db3B5cmlnaHRTdGF0ZW1lbnRfTWV0aG9kVW5pdHMgPSBuZXcgT3Bwb3NpdGVGZWF0dXJlKAotCQkJU3VwcG9ydGluZ01hdGVyaWFsLmNsYXNzLAotCQkJIlN1cHBvcnRpbmdNYXRlcmlhbF9Db3B5cmlnaHRTdGF0ZW1lbnRfTWV0aG9kUGx1Z2lucyIsIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE1ldGhvZFVuaXRfQ29weXJpZ2h0U3RhdGVtZW50KCksIHRydWUpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBbiBvcHBvc2l0ZSBmZWF0dXJlIHVzZWQgZm9yIHJldHJpZXZpbmcgdGhlIGNvbnRlbnQgZWxlbWVudHMgd2hpY2ggYQotCSAqIGd1aWRlbGluZSBpcyBhc3NvY2lhdGVkIHdpdGguCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBPcHBvc2l0ZUZlYXR1cmUgR3VpZGVsaW5lX0NvbnRlbnRFbGVtZW50cyA9IG5ldyBPcHBvc2l0ZUZlYXR1cmUoCi0JCQlHdWlkZWxpbmUuY2xhc3MsCi0JCQkiR3VpZGVsaW5lX0NvbnRlbnRFbGVtZW50cyIsIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbnRlbnRFbGVtZW50X0d1aWRlbGluZXMoKSwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEFuIG9wcG9zaXRlIGZlYXR1cmUgdXNlZCBmb3IgcmV0cmlldmluZyB0aGUgYWN0aXZpdGllcyB3aGljaCBhIGd1aWRlbGluZQotCSAqIGlzIGFzc29jaWF0ZWQgd2l0aC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIE9wcG9zaXRlRmVhdHVyZSBHdWlkZWxpbmVfQnJlYWtkb3duRWxlbWVudHMgPSBuZXcgT3Bwb3NpdGVGZWF0dXJlKAotCQkJR3VpZGVsaW5lLmNsYXNzLAotCQkJIkd1aWRlbGluZV9CcmVha2Rvd25FbGVtZW50cyIsIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEJyZWFrZG93bkVsZW1lbnRfR3VpZGVsaW5lcygpLCB0cnVlLCBmYWxzZSk7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEFuIG9wcG9zaXRlIGZlYXR1cmUgdXNlZCBmb3IgcmV0cmlldmluZyB0aGUgd29yayBwcm9kdWN0cyB3aGljaCBhCi0JICogdGVtcGxhdGUgaXMgYXNzb2NpYXRlZCB3aXRoLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgT3Bwb3NpdGVGZWF0dXJlIFRlbXBsYXRlX1dvcmtQcm9kdWN0cyA9IG5ldyBPcHBvc2l0ZUZlYXR1cmUoCi0JCQlUZW1wbGF0ZS5jbGFzcywKLQkJCSJUZW1wbGF0ZV9Xb3JrUHJvZHVjdHMiLCBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRXb3JrUHJvZHVjdF9UZW1wbGF0ZXMoKSwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEFuIG9wcG9zaXRlIGZlYXR1cmUgdXNlZCBmb3IgcmV0cmlldmluZyB0aGUgdG9vbCB3aGljaCBhIHRvb2wgbWVudG9yIGlzCi0JICogY2F0ZWdvcml6ZWQgdW5kZXIuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBPcHBvc2l0ZUZlYXR1cmUgVG9vbE1lbnRvcl9Ub29scyA9IG5ldyBPcHBvc2l0ZUZlYXR1cmUoCi0JCQlUb29sTWVudG9yLmNsYXNzLAotCQkJIlRvb2xNZW50b3JfVG9vbHMiLCBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUb29sX1Rvb2xNZW50b3JzKCksIHRydWUpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBbiBvcHBvc2l0ZSBmZWF0dXJlIHVzZWQgZm9yIHJldHJpZXZpbmcgdGhlIHRhc2tzIHdoaWNoIGEgdG9vbCBtZW50b3IgaXMKLQkgKiBhc3NvY2lhdGVkIHdpdGguCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBPcHBvc2l0ZUZlYXR1cmUgVG9vbE1lbnRvcl9UYXNrcyA9IG5ldyBPcHBvc2l0ZUZlYXR1cmUoCi0JCQlUb29sTWVudG9yLmNsYXNzLAotCQkJIlRvb2xNZW50b3JfVGFza3MiLCBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrX1Rvb2xNZW50b3JzKCksIHRydWUpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBbiBvcHBvc2l0ZSBmZWF0dXJlIHVzZWQgZm9yIHJldHJpZXZpbmcgdGhlIHdvcmsgcHJvZHVjdHMgd2hpY2ggYSB0b29sCi0JICogbWVudG9yIGlzIGFzc29jaWF0ZWQgd2l0aC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIE9wcG9zaXRlRmVhdHVyZSBUb29sTWVudG9yX1dvcmtQcm9kdWN0cyA9IG5ldyBPcHBvc2l0ZUZlYXR1cmUoCi0JCQlUZW1wbGF0ZS5jbGFzcywKLQkJCSJUb29sTWVudG9yX1dvcmtQcm9kdWN0cyIsIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFdvcmtQcm9kdWN0X1Rvb2xNZW50b3JzKCksIHRydWUpOyAvLyROT04tTkxTLTEkCQotCi0JLyoqCi0JICogQW4gb3Bwb3NpdGUgZmVhdHVyZSB1c2VkIGZvciByZXRyaWV2aW5nIHRoZSBjdXN0b20gY2F0ZWdvcmllcyB3aGljaCBhCi0JICogZGVzY3JpYmFibGUgZWxlbWVudCBpcyBhc3NvY2lhdGVkIHdpdGguCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBPcHBvc2l0ZUZlYXR1cmUgRGVzY3JpYmFibGVFbGVtZW50X0N1c3RvbUNhdGVnb3JpZXMgPSBuZXcgT3Bwb3NpdGVGZWF0dXJlKAotCQkJRGVzY3JpYmFibGVFbGVtZW50LmNsYXNzLAotCQkJIkNvbnRlbnRFbGVtZW50X0N1c3RvbUNhdGVnb3JpZXMiLCBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRDdXN0b21DYXRlZ29yeV9DYXRlZ29yaXplZEVsZW1lbnRzKCksIHRydWUpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBbiBvcHBvc2l0ZSBmZWF0dXJlIHVzZWQgZm9yIHJldHJpZXZpbmcgdGhlIHByYWN0aWNlcyByZWZlcmVuY2VkIGJ5IGEKLQkgKiBjb250ZW50IGVsZW1lbnQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBPcHBvc2l0ZUZlYXR1cmUgQ29udGVudEVsZW1lbnRfUHJhY3RpY2VzID0gbmV3IE9wcG9zaXRlRmVhdHVyZSgKLQkJCUNvbnRlbnRFbGVtZW50LmNsYXNzLAotCQkJIkNvbnRlbnRFbGVtZW50X1ByYWN0aWNlcyIsIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFByYWN0aWNlX0NvbnRlbnRSZWZlcmVuY2VzKCksIHRydWUpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBbiBvcHBvc2l0ZSBmZWF0dXJlIHVzZWQgZm9yIHJldHJpZXZpbmcgdGhlIG1ldGhvZCBwbHVnLWlucyByZWZlcmVuY2VkIGJ5Ci0JICogYSBtZXRob2QgcGx1Zy1pbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIE9wcG9zaXRlRmVhdHVyZSBNZXRob2RQbHVnaW5fRGlyZWN0RXh0ZW5zaW9ucyA9IG5ldyBPcHBvc2l0ZUZlYXR1cmUoCi0JCQlNZXRob2RQbHVnaW4uY2xhc3MsCi0JCQkiTWV0aG9kUGx1Z2luX0RpcmVjdEV4dGVuc2lvbnMiLCBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRNZXRob2RQbHVnaW5fQmFzZXMoKSwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEFuIG9wcG9zaXRlIGZlYXR1cmUgdXNlZCBmb3IgcmV0cmlldmluZyB0aGUgbWV0aG9kIGNvbmZpZ3VyYXRpb25zIHdoaWNoCi0JICogY29udGFpbiBhIHJlZmVyZW5jZSB0byBhIG1ldGhvZCBwbHVnLWluLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgT3Bwb3NpdGVGZWF0dXJlIE1ldGhvZFBsdWdpbl9NZXRob2RDb25maWd1cmF0aW9ucyA9IG5ldyBPcHBvc2l0ZUZlYXR1cmUoCi0JCQlNZXRob2RQbHVnaW4uY2xhc3MsCi0JCQkiTWV0aG9kUGx1Z2luX01ldGhvZENvbmZpZ3VyYXRpb25zIiwgVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWV0aG9kQ29uZmlndXJhdGlvbl9NZXRob2RQbHVnaW5TZWxlY3Rpb24oKSwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEFuIG9wcG9zaXRlIGZlYXR1cmUgdXNlZCBmb3IgcmV0cmlldmluZyB0aGUgbWV0aG9kIHBhY2thZ2VzCi0JICogdXNlZC9yZWZlcmVuY2VkIGJ5IGEgbWV0aG9kIHBhY2thZ2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBPcHBvc2l0ZUZlYXR1cmUgTWV0aG9kUGFja2FnZV9Vc2luZ1BhY2thZ2VzID0gbmV3IE9wcG9zaXRlRmVhdHVyZSgKLQkJCU1ldGhvZFBhY2thZ2UuY2xhc3MsCi0JCQkiTWV0aG9kUGFja2FnZV9Vc2luZ1BhY2thZ2VzIiwgVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWV0aG9kUGFja2FnZV9SZXVzZWRQYWNrYWdlcygpLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQW4gb3Bwb3NpdGUgZmVhdHVyZSB1c2VkIGZvciByZXRyaWV2aW5nIHRoZSBtZXRob2QgY29uZmlndXJhdGlvbnMgd2hpY2gKLQkgKiBjb250YWluIGEgcmVmZXJlbmNlIHRvIGEgbWV0aG9kIHBhY2thZ2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBPcHBvc2l0ZUZlYXR1cmUgTWV0aG9kUGFja2FnZV9NZXRob2RDb25maWd1cmF0aW9ucyA9IG5ldyBPcHBvc2l0ZUZlYXR1cmUoCi0JCQlNZXRob2RQYWNrYWdlLmNsYXNzLAotCQkJIk1ldGhvZFBhY2thZ2VfTWV0aG9kQ29uZmlndXJhdGlvbnMiLCBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRNZXRob2RDb25maWd1cmF0aW9uX01ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKSwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEFuIG9wcG9zaXRlIGZlYXR1cmUgdXNlZCBmb3IgcmV0cmlldmluZyB0aGUgbWV0aG9kIGNvbmZpZ3VyYXRpb25zIHdoaWNoCi0JICogY29udGFpbiBhIHJlZmVyZW5jZSB0byBhIEN1c3RvbUNhdGVnb3J5LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgT3Bwb3NpdGVGZWF0dXJlIEN1c3RvbUNhdGVnb3J5X01ldGhvZENvbmZpZ3VyYXRpb25zID0gbmV3IE9wcG9zaXRlRmVhdHVyZSgKLQkJCUN1c3RvbUNhdGVnb3J5LmNsYXNzLAotCQkJIkN1c3RvbUNhdGVnb3J5X01ldGhvZENvbmZpZ3VyYXRpb25zIiwgVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWV0aG9kQ29uZmlndXJhdGlvbl9Qcm9jZXNzVmlld3MoKSwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEFuIG9wcG9zaXRlIGZlYXR1cmUgdXNlZCBmb3IgcmV0cmlldmluZyB0aGUgZGlzY2lwbGluZSBncm91cGluZ3Mgd2hpY2gKLQkgKiBjb250YWluIGEgcmVmZXJlbmNlIHRvIGEgZGlzY2lwbGluZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIE9wcG9zaXRlRmVhdHVyZSBEaXNjaXBsaW5lX0Rpc2NpcGxpbmVHcm91cGluZ3MgPSBuZXcgT3Bwb3NpdGVGZWF0dXJlKAotCQkJRGlzY2lwbGluZS5jbGFzcywKLQkJCSJEaXNjaXBsaW5lX0Rpc2NpcGxpbmVHcm91cGluZ3MiLCBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXREaXNjaXBsaW5lR3JvdXBpbmdfRGlzY2lwbGluZXMoKSwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEFuIG9wcG9zaXRlIGZlYXR1cmUgdXNlZCBmb3IgcmV0cmlldmluZyB0aGUgZGlzY2lwbGluZXMgd2hpY2gKLQkgKiBjb250YWluIGEgcmVmZXJlbmNlIHRvIGEgZGlzY2lwbGluZSAoaWUsIGEgc3ViZGlzY2lwbGluZSkuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBPcHBvc2l0ZUZlYXR1cmUgU3ViZGlzY2lwbGluZV9EaXNjaXBsaW5lID0gbmV3IE9wcG9zaXRlRmVhdHVyZSgKLQkJCURpc2NpcGxpbmUuY2xhc3MsCi0JCQkiU3ViZGlzY2lwbGluZV9EaXNjaXBsaW5lIiwgVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RGlzY2lwbGluZV9TdWJkaXNjaXBsaW5lKCksIHRydWUpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBbiBvcHBvc2l0ZSBmZWF0dXJlIHVzZWQgZm9yIHJldHJpZXZpbmcgdGhlIHJvbGUgc2V0IGdyb3VwaW5ncyB3aGljaAotCSAqIGNvbnRhaW4gYSByZWZlcmVuY2UgdG8gYSByb2xlIHNldC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIE9wcG9zaXRlRmVhdHVyZSBSb2xlU2V0X1JvbGVTZXRHcm91cHBpbmdzID0gbmV3IE9wcG9zaXRlRmVhdHVyZSgKLQkJCVJvbGVTZXQuY2xhc3MsCi0JCQkiUm9sZVNldF9Sb2xlU2V0R3JvdXBwaW5ncyIsIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFJvbGVTZXRHcm91cGluZ19Sb2xlU2V0cygpLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQW4gb3Bwb3NpdGUgZmVhdHVyZSB1c2VkIGZvciByZXRyaWV2aW5nIHRoZSBzdWNjZXNzb3Igb2YgYSB3b3JrIG9yZGVyLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgT3Bwb3NpdGVGZWF0dXJlIFdvcmtPcmRlcl9TdWNjZXNzb3IgPSBuZXcgT3Bwb3NpdGVGZWF0dXJlKAotCQkJV29ya09yZGVyLmNsYXNzLAotCQkJIldvcmtPcmRlcl9TdWNjZXNzb3IiLCBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRXb3JrQnJlYWtkb3duRWxlbWVudF9MaW5rVG9QcmVkZWNlc3NvcigpLCBmYWxzZSk7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEFuIG9wcG9zaXRlIGZlYXR1cmUgdXNlZCBmb3IgcmV0cmlldmluZyB0aGUgc3VjY2Vzc29yIGxpbmsgb2YgYSB3b3JrCi0JICogYnJlYWtkb3duIGVsZW1lbnQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBPcHBvc2l0ZUZlYXR1cmUgV29ya0JyZWFrZG93bkVsZW1lbnRfTGlua1RvU3VjY2Vzc29yID0gbmV3IE9wcG9zaXRlRmVhdHVyZSgKLQkJCVdvcmtCcmVha2Rvd25FbGVtZW50LmNsYXNzLAotCQkJIldvcmtCcmVha2Rvd25FbGVtZW50X0xpbmtUb1N1Y2Nlc3NvciIsIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFdvcmtPcmRlcl9QcmVkKCksIHRydWUpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBbiBvcHBvc2l0ZSBmZWF0dXJlIHVzZWQgZm9yIHJldHJpZXZpbmcgdGhlIGltbWVkaWF0ZSB2YXJpYXRpZXMgb2YgYQotCSAqIHZhcmlhYmlsaXR5IGVsZW1lbnQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBPcHBvc2l0ZUZlYXR1cmUgVmFyaWFiaWxpdHlFbGVtZW50X0ltbWVkaWF0ZVZhcmlldGllcyA9IG5ldyBPcHBvc2l0ZUZlYXR1cmUoCi0JCQlWYXJpYWJpbGl0eUVsZW1lbnQuY2xhc3MsCi0JCQkiVmFyaWFiaWxpdHlFbGVtZW50X0ltbWVkaWF0ZVZhcmlldGllcyIsIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFZhcmlhYmlsaXR5RWxlbWVudF9WYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCksIHRydWUpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBbiBvcHBvc2l0ZSBmZWF0dXJlIHVzZWQgZm9yIHJldHJpZXZpbmcgdGhlIHN1Y2Nlc3NvcnMgdG8gYSBzZWN0aW9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgT3Bwb3NpdGVGZWF0dXJlIFNlY3Rpb25fU3VjY2Vzc29ycyA9IG5ldyBPcHBvc2l0ZUZlYXR1cmUoCi0JCQlTZWN0aW9uLmNsYXNzLAotCQkJIlNlY3Rpb25fU3VjY2Vzc29ycyIsIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFNlY3Rpb25fUHJlZGVjZXNzb3IoKSwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEFuIG9wcG9zaXRlIGZlYXR1cmUgdXNlZCBmb3IgcmV0cmlldmluZyB0aGUgdGFzayBkZXNjcmlwdG9ycyB3aGljaCBhCi0JICogc2VjdGlvbiBpcyBhc3NvY2lhdGVkIHdpdGguCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBPcHBvc2l0ZUZlYXR1cmUgU2VjdGlvbl9UYXNrRGVzY3JpcHRvcnMgPSBuZXcgT3Bwb3NpdGVGZWF0dXJlKAotCQkJU2VjdGlvbi5jbGFzcywKLQkJCSJTZWN0aW9uX1Rhc2tEZXNjcmlwdG9ycyIsIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tEZXNjcmlwdG9yX1NlbGVjdGVkU3RlcHMoKSwgdHJ1ZSwgZmFsc2UpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBbiBvcHBvc2l0ZSBmZWF0dXJlIHVzZWQgZm9yIHJldHJpZXZpbmcgdGhlIHRlYW0gcHJvZmlsZXMgd2hpY2ggaW5jbHVkZXMKLQkgKiBhIHNwZWNpZmljIHJvbGUgZGVzY3JpcHRvci4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIE9wcG9zaXRlRmVhdHVyZSBSb2xlRGVzY3JpcHRvcl9UZWFtUHJvZmlsZXMgPSBuZXcgT3Bwb3NpdGVGZWF0dXJlKAotCQkJUm9sZURlc2NyaXB0b3IuY2xhc3MsCi0JCQkiUm9sZURlc2NyaXB0b3JfVGVhbVByb2ZpbGVzIiwgVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGVhbVByb2ZpbGVfVGVhbVJvbGVzKCksIHRydWUpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBbiBvcHBvc2l0ZSBmZWF0dXJlIHVzZWQgZm9yIHJldHJpZXZpbmcgdGhlIHByaW1hcnkgdGFzayBkZXNjcmlwdG9ycwotCSAqIHBlcmZvcm1lZCBieSBhIHJvbGUgZGVzY3JpcHRvci4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIE9wcG9zaXRlRmVhdHVyZSBSb2xlRGVzY3JpcHRvcl9QcmltYXJ5VGFza0Rlc2NyaXB0b3JzID0gbmV3IE9wcG9zaXRlRmVhdHVyZSgKLQkJCVJvbGVEZXNjcmlwdG9yLmNsYXNzLAotCQkJIlJvbGVEZXNjcmlwdG9yX1ByaW1hcnlUYXNrRGVzY3JpcHRvcnMiLCBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrRGVzY3JpcHRvcl9QZXJmb3JtZWRQcmltYXJpbHlCeSgpLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQW4gb3Bwb3NpdGUgZmVhdHVyZSB1c2VkIGZvciByZXRyaWV2aW5nIHRoZSBhZGRpdGlvbmFsIHRhc2sgZGVzY3JpcHRvcnMKLQkgKiBwZXJmb3JtZWQgYnkgYSByb2xlIGRlc2NyaXB0b3IuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBPcHBvc2l0ZUZlYXR1cmUgUm9sZURlc2NyaXB0b3JfQWRkaXRpb25hbFRhc2tEZXNjcmlwdG9ycyA9IG5ldyBPcHBvc2l0ZUZlYXR1cmUoCi0JCQlSb2xlRGVzY3JpcHRvci5jbGFzcywKLQkJCSJSb2xlRGVzY3JpcHRvcl9BZGRpdGlvbmFsVGFza0Rlc2NyaXB0b3JzIiwgVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza0Rlc2NyaXB0b3JfQWRkaXRpb25hbGx5UGVyZm9ybWVkQnkoKSwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEFuIG9wcG9zaXRlIGZlYXR1cmUgdXNlZCBmb3IgcmV0cmlldmluZyB0aGUgYXNzaXN0aW5nIHRhc2sgZGVzY3JpcHRvcnMKLQkgKiBwZXJmb3JtZWQgYnkgYSByb2xlIGRlc2NyaXB0b3IuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBPcHBvc2l0ZUZlYXR1cmUgUm9sZURlc2NyaXB0b3JfQXNzaXN0c0luX1Rhc2tEZXNjcmlwdG9ycyA9IG5ldyBPcHBvc2l0ZUZlYXR1cmUoCi0JCQlSb2xlRGVzY3JpcHRvci5jbGFzcywKLQkJCSJSb2xlRGVzY3JpcHRvcl9Bc3Npc3RzSW5fVGFza0Rlc2NyaXB0b3JzIiwgVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza0Rlc2NyaXB0b3JfQXNzaXN0ZWRCeSgpLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQW4gb3Bwb3NpdGUgZmVhdHVyZSB1c2VkIGZvciByZXRyaWV2aW5nIHRoZSBkZXBlbmRlbnQgcHJvY2Vzc2VzCi0JICogcmVmZXJlbmNlZCBpbiBhIG1ldGhvZCBjb25maWd1cmF0aW9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgT3Bwb3NpdGVGZWF0dXJlIE1ldGhvZENvbmZpZ3VyYXRpb25fRGVwZW5kZW50UHJvY2Vzc2VzID0gbmV3IE9wcG9zaXRlRmVhdHVyZSgKLQkJCU1ldGhvZENvbmZpZ3VyYXRpb24uY2xhc3MsCi0JCQkiTWV0aG9kQ29uZmlndXJhdGlvbl9EZXBlbmRlbnRQcm9jZXNzZXMiLCBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRQcm9jZXNzX0RlZmF1bHRDb250ZXh0KCksIHRydWUpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBbiBvcHBvc2l0ZSBmZWF0dXJlIHVzZWQgZm9yIHJldHJpZXZpbmcgdGhlIHZhbGlkIHByb2Nlc3NlcyByZWZlcmVuY2VkIGluCi0JICogYSBtZXRob2QgY29uZmlndXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIE9wcG9zaXRlRmVhdHVyZSBNZXRob2RDb25maWd1cmF0aW9uX1ZhbGlkQ29udGV4dF9Qcm9jZXNzZXMgPSBuZXcgT3Bwb3NpdGVGZWF0dXJlKAotCQkJTWV0aG9kQ29uZmlndXJhdGlvbi5jbGFzcywKLQkJCSJNZXRob2RDb25maWd1cmF0aW9uX1ZhbGlkQ29udGV4dF9Qcm9jZXNzZXMiLCBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRQcm9jZXNzX1ZhbGlkQ29udGV4dCgpLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQW4gb3Bwb3NpdGUgZmVhdHVyZSB1c2VkIGZvciByZXRyaWV2aW5nIHRoZSB0YXNrIGRlc2NyaXB0b3JzIHdoaWNoCi0JICogcHJvZHVjZSBhIHdvcmsgcHJvZHVjdCBkZXNjcmlwdG9yIGFzIGFuIG91dHB1dC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIE9wcG9zaXRlRmVhdHVyZSBXb3JrUHJvZHVjdERlc2NyaXB0b3JfT3V0cHV0RnJvbV9UYXNrRGVzY3JpcHRvcnMgPSBuZXcgT3Bwb3NpdGVGZWF0dXJlKAotCQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yLmNsYXNzLAotCQkJIldvcmtQcm9kdWN0RGVzY3JpcHRvcl9PdXRwdXRGcm9tX1Rhc2tEZXNjcmlwdG9ycyIsIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tEZXNjcmlwdG9yX091dHB1dCgpLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQW4gb3Bwb3NpdGUgZmVhdHVyZSB1c2VkIGZvciByZXRyaWV2aW5nIHRoZSB0YXNrIGRlc2NyaXB0b3JzIHdoaWNoIHVzZSBhCi0JICogd29yayBwcm9kdWN0IGRlc2NyaXB0b3IgYXMgYW4gb3B0aW9uYWwgaW5wdXQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBPcHBvc2l0ZUZlYXR1cmUgV29ya1Byb2R1Y3REZXNjcmlwdG9yX09wdGlvbmFsSW5wdXRUb19UYXNrRGVzY3JpcHRvcnMgPSBuZXcgT3Bwb3NpdGVGZWF0dXJlKAotCQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yLmNsYXNzLAotCQkJIldvcmtQcm9kdWN0RGVzY3JpcHRvcl9PcHRpb25hbElucHV0VG9fVGFza0Rlc2NyaXB0b3JzIiwgVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza0Rlc2NyaXB0b3JfT3B0aW9uYWxJbnB1dCgpLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQW4gb3Bwb3NpdGUgZmVhdHVyZSB1c2VkIGZvciByZXRyaWV2aW5nIHRoZSB0YXNrIGRlc2NyaXB0b3JzIHdoaWNoIHVzZSBhCi0JICogd29yayBwcm9kdWN0IGRlc2NyaXB0b3IgYXMgYW4gbWFuZGF0b3J5IGlucHV0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgT3Bwb3NpdGVGZWF0dXJlIFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9NYW5kYXRvcnlJbnB1dFRvX1Rhc2tEZXNjcmlwdG9ycyA9IG5ldyBPcHBvc2l0ZUZlYXR1cmUoCi0JCQlXb3JrUHJvZHVjdERlc2NyaXB0b3IuY2xhc3MsCi0JCQkiV29ya1Byb2R1Y3REZXNjcmlwdG9yX01hbmRhdG9yeUlucHV0VG9fVGFza0Rlc2NyaXB0b3JzIiwgLy8kTk9OLU5MUy0xJAotCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza0Rlc2NyaXB0b3JfTWFuZGF0b3J5SW5wdXQoKSwgdHJ1ZSk7Ci0KLQkvKioKLQkgKiBBbiBvcHBvc2l0ZSBmZWF0dXJlIHVzZWQgZm9yIHJldHJpZXZpbmcgdGhlIHRhc2sgZGVzY3JpcHRvcnMgd2hpY2ggdXNlIGEKLQkgKiB3b3JrIHByb2R1Y3QgZGVzY3JpcHRvciBhcyBhbiBleHRlcm5hbCBpbnB1dC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIE9wcG9zaXRlRmVhdHVyZSBXb3JrUHJvZHVjdERlc2NyaXB0b3JfRXh0ZXJuYWxJbnB1dFRvX1Rhc2tEZXNjcmlwdG9ycyA9IG5ldyBPcHBvc2l0ZUZlYXR1cmUoCi0JCQlXb3JrUHJvZHVjdERlc2NyaXB0b3IuY2xhc3MsCi0JCQkiV29ya1Byb2R1Y3REZXNjcmlwdG9yX0V4dGVybmFsSW5wdXRUb19UYXNrRGVzY3JpcHRvcnMiLCAvLyROT04tTkxTLTEkCi0JCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrRGVzY3JpcHRvcl9FeHRlcm5hbElucHV0KCksIHRydWUpOwotCi0JLyoqCi0JICogQW4gb3Bwb3NpdGUgZmVhdHVyZSB1c2VkIGZvciByZXRyaWV2aW5nIHRoZSByb2xlIGRlc2NyaXB0b3JzIHdoaWNoIGFyZQotCSAqIHJlc3BvbnNpYmxlIGZvciBhIHdvcmsgcHJvZHVjdCBkZXNjcmlwdG9yLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgT3Bwb3NpdGVGZWF0dXJlIFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9SZXNwb25zaWJsZVJvbGVEZXNjcmlwdG9ycyA9IG5ldyBPcHBvc2l0ZUZlYXR1cmUoCi0JCQlXb3JrUHJvZHVjdERlc2NyaXB0b3IuY2xhc3MsCi0JCQkiV29ya1Byb2R1Y3REZXNjcmlwdG9yX1Jlc3BvbnNpYmxlUm9sZURlc2NyaXB0b3JzIiwgLy8kTk9OLU5MUy0xJAotCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Um9sZURlc2NyaXB0b3JfUmVzcG9uc2libGVGb3IoKSwgdHJ1ZSk7Ci0KLQkvKioKLQkgKiBBbiBvcHBvc2l0ZSBmZWF0dXJlIHVzZWQgZm9yIHJldHJpZXZpbmcgdGhlIGRlbGl2ZXJhYmxlIGRlc2NyaXB0b3JzIHdoaWNoCi0JICogY29udGFpbiBhIHNwZWNpZmljIHdvcmsgcHJvZHVjdCBkZXNjcmlwdG9yLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgT3Bwb3NpdGVGZWF0dXJlIFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9EZWxpdmVyYWJsZURlc2NyaXB0b3JzID0gbmV3IE9wcG9zaXRlRmVhdHVyZSgKLQkJCVdvcmtQcm9kdWN0RGVzY3JpcHRvci5jbGFzcywKLQkJCSJXb3JrUHJvZHVjdERlc2NyaXB0b3JfRGVsaXZlcmFibGVEZXNjcmlwdG9ycyIsIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9EZWxpdmVyYWJsZVBhcnRzKCksIHRydWUpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBbiBvcHBvc2l0ZSBmZWF0dXJlIHVzZWQgZm9yIHJldHJpZXZpbmcgdGhlIGRpc2NpcGxpbmVzIHdoaWNoIGFuIGFjdGl2aXR5Ci0JICogaXMgYXNzb2NpYXRlZCB3aXRoLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgT3Bwb3NpdGVGZWF0dXJlIEFjdGl2aXR5X0Rpc2NpcGxpbmVzID0gbmV3IE9wcG9zaXRlRmVhdHVyZSgKLQkJCUFjdGl2aXR5LmNsYXNzLAotCQkJIkFjdGl2aXR5X0Rpc2NpcGxpbmVzIiwgVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RGlzY2lwbGluZV9SZWZlcmVuY2VXb3JrZmxvd3MoKSwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEFuIG9wcG9zaXRlIGZlYXR1cmUgdXNlZCBmb3IgcmV0cmlldmluZyB0aGUgcHJhY3RpY2VzIHdoaWNoIGFuIGFjdGl2aXR5Ci0JICogaXMgYXNzb2NpYXRlZCB3aXRoLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgT3Bwb3NpdGVGZWF0dXJlIEFjdGl2aXR5X1ByYXRpY2VzID0gbmV3IE9wcG9zaXRlRmVhdHVyZSgKLQkJCUFjdGl2aXR5LmNsYXNzLAotCQkJIkFjdGl2aXR5X1ByYXRpY2VzIiwgVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UHJhY3RpY2VfQWN0aXZpdHlSZWZlcmVuY2VzKCksIHRydWUpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBbiBvcHBvc2l0ZSBmZWF0dXJlIHVzZWQgZm9yIHJldHJpZXZpbmcgdGhlIHByb2Nlc3MgcGxhbm5pbmcgdGVtcGxhdGVzCi0JICogd2hpY2ggYSBwcm9jZXNzIGlzIGFzc29jaWF0ZWQgd2l0aC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIE9wcG9zaXRlRmVhdHVyZSBQcm9jZXNzX1Byb2Nlc3NQbGFubmluZ1RlbXBsYXRlcyA9IG5ldyBPcHBvc2l0ZUZlYXR1cmUoCi0JCQlQcm9jZXNzLmNsYXNzLAotCQkJIlByb2Nlc3NfUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGVzIiwgVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGVfQmFzZWRPblByb2Nlc3NlcygpLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQW4gb3Bwb3NpdGUgZmVhdHVyZSB1c2VkIGZvciByZXRyaWV2aW5nIHRoZSBwcm9jZXNlc3Mgd2hpY2ggcmVmZXJlbmNlcyBhCi0JICogY2FwYWJpbGl0eSBwYXR0ZXJuLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgT3Bwb3NpdGVGZWF0dXJlIENhcGFiaWxpdHlQYXR0ZXJuX0NvbnN1bWluZ1Byb2Nlc3NlcyA9IG5ldyBPcHBvc2l0ZUZlYXR1cmUoCi0JCQlDYXBhYmlsaXR5UGF0dGVybi5jbGFzcywKLQkJCSJDYXBhYmlsaXR5UGF0dGVybl9Db25zdW1pbmdQcm9jZXNzZXMiLCBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRQcm9jZXNzX0luY2x1ZGVzUGF0dGVybnMoKSwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEFuIG9wcG9zaXRlIGZlYXR1cmUgdXNlZCBmb3IgcmV0cmlldmluZyB0aGUgYnJlYWtkb3duIGVsZW1lbnQgd2hpY2ggaXMKLQkgKiBkaXNwbGF5ZWQgYmVmb3JlIGEgYnJlYWtkb3duIGVsZW1lbnQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBPcHBvc2l0ZUZlYXR1cmUgQnJlYWtkb3duRWxlbWVudF9QcmVzZW50ZWRCZWZvcmUgPSBuZXcgT3Bwb3NpdGVGZWF0dXJlKAotCQkJQnJlYWtkb3duRWxlbWVudC5jbGFzcywKLQkJCSJCcmVha2Rvd25FbGVtZW50X1ByZXNlbnRlZEJlZm9yZSIsIC8vJE5PTi1OTFMtMSQKLQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEJyZWFrZG93bkVsZW1lbnRfUHJlc2VudGVkQWZ0ZXIoKSwgdHJ1ZSwKLQkJCWZhbHNlKTsKLQotCS8qKgotCSAqIEFuIG9wcG9zaXRlIGZlYXR1cmUgdXNlZCBmb3IgcmV0cmlldmluZyB0aGUgYnJlYWtkb3duIGVsZW1lbnQgd2hpY2ggaXMKLQkgKiBkaXNwbGF5ZWQgYWZ0ZXIgYSBicmVha2Rvd24gZWxlbWVudC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIE9wcG9zaXRlRmVhdHVyZSBCcmVha2Rvd25FbGVtZW50X1ByZXNlbnRlZEFmdGVyID0gbmV3IE9wcG9zaXRlRmVhdHVyZSgKLQkJCUJyZWFrZG93bkVsZW1lbnQuY2xhc3MsCi0JCQkiQnJlYWtkb3duRWxlbWVudF9QcmVzZW50ZWRBZnRlciIsIC8vJE5PTi1OTFMtMSQKLQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEJyZWFrZG93bkVsZW1lbnRfUHJlc2VudGVkQmVmb3JlKCksIHRydWUsCi0JCQlmYWxzZSk7Ci0KLQkvKioKLQkgKiBBbiBvcHBvc2l0ZSBmZWF0dXJlIHVzZWQgZm9yIHJldHJpZXZpbmcgdGhlIFVNQSBzZW1hdGljIG1vZGVsIGJyaWRnZXMKLQkgKiByZWZlcmVuY2VkIGJ5IGEgbWV0aG9kIGVsZW1lbnQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBPcHBvc2l0ZUZlYXR1cmUgTWV0aG9kRWxlbWVudF9VTUFTZW1hdGljTW9kZWxCcmlkZ2VzID0gbmV3IE9wcG9zaXRlRmVhdHVyZSgKLQkJCU1ldGhvZEVsZW1lbnQuY2xhc3MsCi0JCQkiTWV0aG9kRWxlbWVudF9VTUFTZW1hdGljTW9kZWxCcmlkZ2VzIiwgLy8kTk9OLU5MUy0xJAotCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VU1BU2VtYW50aWNNb2RlbEJyaWRnZV9FbGVtZW50KCksIHRydWUsCi0JCQlmYWxzZSk7Ci0KLQlwcml2YXRlIHN0YXRpYyBBcnJheUxpc3QgcHJlZGVmaW5lZE9wcG9zaXRlRmVhdHVyZXM7Ci0KLQlzdGF0aWMgewotCQlyZWdpc3RlclByZWRlZmluZWRPcHBvc2l0ZUZlYXR1cmVzKCk7Ci0JfQotCi0JLyoqCi0JICogUmVnaXN0ZXJzIHRoZSBwcmVkZWZpbmVkIG9wcG9zaXRlIGZlYXR1cmVzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgdm9pZCByZWdpc3RlclByZWRlZmluZWRPcHBvc2l0ZUZlYXR1cmVzKCkgewotCQlwcmVkZWZpbmVkT3Bwb3NpdGVGZWF0dXJlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJQXNzb2NpYXRpb25IZWxwZXIgb2JqZWN0ID0gbmV3IEFzc29jaWF0aW9uSGVscGVyKCk7Ci0JCUZpZWxkW10gZmllbGRzID0gb2JqZWN0LmdldENsYXNzKCkuZ2V0RGVjbGFyZWRGaWVsZHMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWVsZHMubGVuZ3RoOyBpKyspIHsKLQkJCUZpZWxkIGZpZWxkID0gZmllbGRzW2ldOwotCQkJaW50IG1vZCA9IGZpZWxkLmdldE1vZGlmaWVycygpOwotCQkJaWYgKE1vZGlmaWVyLmlzUHVibGljKG1vZCkgJiYgTW9kaWZpZXIuaXNTdGF0aWMobW9kKQotCQkJCQkmJiBNb2RpZmllci5pc0ZpbmFsKG1vZCkKLQkJCQkJJiYgZmllbGQuZ2V0VHlwZSgpID09IE9wcG9zaXRlRmVhdHVyZS5jbGFzcykgewotCQkJCXRyeSB7Ci0JCQkJCXByZWRlZmluZWRPcHBvc2l0ZUZlYXR1cmVzLmFkZChmaWVsZC5nZXQob2JqZWN0KSk7Ci0JCQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQl9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKLQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQkvKgotCQkgKiBTeXN0ZW0ub3V0Ci0JCSAqIC5wcmludGxuKCJBc3NvY2lhdGlvbkhlbHBlci5yZWdpc3RlclByZWRlZmluZWRPcHBvc2l0ZUZlYXR1cmVzKCk6Ci0JCSAqIGRlZmluZWQgb3Bwb3NpdGUgZmVhdHVyZXM6ICIgKyBwcmVkZWZpbmVkT3Bwb3NpdGVGZWF0dXJlcy5zaXplKCkpOwotCQkgKiAvLyROT04tTkxTLTEkIFN5c3RlbS5vdXQucHJpbnRsbihwcmVkZWZpbmVkT3Bwb3NpdGVGZWF0dXJlcyk7Ci0JCSAqLwotCi0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHByZWRlZmluZWRPcHBvc2l0ZUZlYXR1cmVzLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkuaGFzTmV4dCgpOykgewotCQkJT3Bwb3NpdGVGZWF0dXJlIGZlYXR1cmUgPSAoT3Bwb3NpdGVGZWF0dXJlKSBpdGVyLm5leHQoKTsKLQkJCU9wcG9zaXRlRmVhdHVyZS5yZWdpc3Rlck9wcG9zaXRlRmVhdHVyZShmZWF0dXJlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHByZWRlZmluZWQgb3Bwb3NpdGUgZmVhdHVyZXMuCi0JICogCi0JICogQHJldHVybiB0aGUgcHJlZGVmaW5lZCBvcHBvc2l0ZSBmZWF0dXJlcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ29sbGVjdGlvbiBnZXRQcmVkZWZpbmVkT3Bwb3NpdGVGZWF0dXJlcygpIHsKLQkJcmV0dXJuIHByZWRlZmluZWRPcHBvc2l0ZUZlYXR1cmVzOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGRlbGl2ZXJhYmxlIGRlc2NyaXB0b3JzIHdoaWNoIGNvbnRhaW4gdGhlIGdpdmVuIHdvcmsgcHJvZHVjdAotCSAqIGRlc2NyaXB0b3IuCi0JICogCi0JICogQHBhcmFtIHdwZAotCSAqICAgICAgICAgICAgYSB3b3JrIGRlc2NyaXB0b3IKLQkgKiBAcmV0dXJuIGEgbGlzdCBvZiBkZWxpdmVyYWJsZSBkZXNjcmlwdG9ycwotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXREZWxpdmVyYWJsZURlc2NyaXB0b3JzKFdvcmtQcm9kdWN0RGVzY3JpcHRvciB3cGQpIHsKLQkJcmV0dXJuIChMaXN0KSAoKE11bHRpUmVzb3VyY2VFT2JqZWN0KSB3cGQpCi0JCQkJLmdldE9wcG9zaXRlRmVhdHVyZVZhbHVlKFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9EZWxpdmVyYWJsZURlc2NyaXB0b3JzKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSB0YXNrIGRlc2NyaXB0b3JzIHdoaWNoIHVzZSBhIHdvcmsgcHJvZHVjdCBkZXNjcmlwdG9yIGFzIGFuCi0JICogZXh0ZXJuYWwgaW5wdXQuCi0JICogCi0JICogQHBhcmFtIHdwZAotCSAqICAgICAgICAgICAgYSB3b3JrIGRlc2NyaXB0b3IKLQkgKiBAcmV0dXJuIGEgbGlzdCBvZiB0YXNrIGRlc2NyaXB0b3JzCi0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0IGdldEV4dGVybmFsSW5wdXRUbyhXb3JrUHJvZHVjdERlc2NyaXB0b3Igd3BkKSB7Ci0JCXJldHVybiAoTGlzdCkgKChNdWx0aVJlc291cmNlRU9iamVjdCkgd3BkKQotCQkJCS5nZXRPcHBvc2l0ZUZlYXR1cmVWYWx1ZShXb3JrUHJvZHVjdERlc2NyaXB0b3JfRXh0ZXJuYWxJbnB1dFRvX1Rhc2tEZXNjcmlwdG9ycyk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgdGFzayBkZXNjcmlwdG9ycyB3aGljaCB1c2UgYSB3b3JrIHByb2R1Y3QgZGVzY3JpcHRvciBhcyBhCi0JICogbWFuZGF0b3J5IGlucHV0LgotCSAqIAotCSAqIEBwYXJhbSB3cGQKLQkgKiAgICAgICAgICAgIGEgd29yayBkZXNjcmlwdG9yCi0JICogQHJldHVybiBhIGxpc3Qgb2YgdGFzayBkZXNjcmlwdG9ycwotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRNYW5kYXRvcnlJbnB1dFRvKFdvcmtQcm9kdWN0RGVzY3JpcHRvciB3cGQpIHsKLQkJcmV0dXJuIChMaXN0KSAoKE11bHRpUmVzb3VyY2VFT2JqZWN0KSB3cGQpCi0JCQkJLmdldE9wcG9zaXRlRmVhdHVyZVZhbHVlKFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9NYW5kYXRvcnlJbnB1dFRvX1Rhc2tEZXNjcmlwdG9ycyk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgdGFzayBkZXNjcmlwdG9ycyB3aGljaCB1c2UgYSB3b3JrIHByb2R1Y3QgZGVzY3JpcHRvciBhcyBhbgotCSAqIG9wdGlvbmFsIGlucHV0LgotCSAqIAotCSAqIEBwYXJhbSB3cGQKLQkgKiAgICAgICAgICAgIGEgd29yayBkZXNjcmlwdG9yCi0JICogQHJldHVybiBhIGxpc3Qgb2YgdGFzayBkZXNjcmlwdG9ycwotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRPcHRpb25hbElucHV0VG8oV29ya1Byb2R1Y3REZXNjcmlwdG9yIHdwZCkgewotCQlyZXR1cm4gKExpc3QpICgoTXVsdGlSZXNvdXJjZUVPYmplY3QpIHdwZCkKLQkJCQkuZ2V0T3Bwb3NpdGVGZWF0dXJlVmFsdWUoV29ya1Byb2R1Y3REZXNjcmlwdG9yX09wdGlvbmFsSW5wdXRUb19UYXNrRGVzY3JpcHRvcnMpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHRhc2sgZGVzY3JpcHRvcnMgd2hpY2ggd2hpY2ggcHJvZHVjZSBhIHdvcmsgcHJvZHVjdCBkZXNjcmlwdG9yCi0JICogYXMgYW4gb3V0cHV0LgotCSAqIAotCSAqIEBwYXJhbSB3cGQKLQkgKiAgICAgICAgICAgIGEgd29yayBkZXNjcmlwdG9yCi0JICogQHJldHVybiBhIGxpc3Qgb2YgdGFzayBkZXNjcmlwdG9ycwotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRPdXRwdXRGcm9tKFdvcmtQcm9kdWN0RGVzY3JpcHRvciB3cGQpIHsKLQkJcmV0dXJuIChMaXN0KSAoKE11bHRpUmVzb3VyY2VFT2JqZWN0KSB3cGQpCi0JCQkJLmdldE9wcG9zaXRlRmVhdHVyZVZhbHVlKFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9PdXRwdXRGcm9tX1Rhc2tEZXNjcmlwdG9ycyk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgcm9sZSBkZXNjcmlwdG9ycyB3aGljaCBhcmUgcmVzcG9uc2libGUgZm9yIGEgd29yayBwcm9kdWN0Ci0JICogZGVzY3JpcHRvci4KLQkgKiAKLQkgKiBAcGFyYW0gd3BkCi0JICogICAgICAgICAgICBhIHdvcmsgZGVzY3JpcHRvcgotCSAqIEByZXR1cm4gYSBsaXN0IG9mIHJvbGUgZGVzY3JpcHRvcnMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3QgZ2V0UmVzcG9uc2libGVSb2xlRGVzY3JpcHRvcnMoV29ya1Byb2R1Y3REZXNjcmlwdG9yIHdwZCkgewotCQlyZXR1cm4gKExpc3QpIHdwZAotCQkJCS5nZXRPcHBvc2l0ZUZlYXR1cmVWYWx1ZShXb3JrUHJvZHVjdERlc2NyaXB0b3JfUmVzcG9uc2libGVSb2xlRGVzY3JpcHRvcnMpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHRoZSBkZXBlbmRlbnQgcHJvY2Vzc2VzIHJlZmVyZW5jZWQgaW4gYSBtZXRob2QgY29uZmlndXJhdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gZQotCSAqICAgICAgICAgICAgYSBtZXRob2QgY29uZmlndXJhdGlvbgotCSAqIEByZXR1cm4gYSBsaXN0IG9mIHByb2Nlc3NlcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXREZXBlbmRlbnRQcm9jZXNzZXMoTWV0aG9kQ29uZmlndXJhdGlvbiBlKSB7Ci0JCXJldHVybiAoTGlzdCkgKChNdWx0aVJlc291cmNlRU9iamVjdCkgZSkKLQkJCQkuZ2V0T3Bwb3NpdGVGZWF0dXJlVmFsdWUoTWV0aG9kQ29uZmlndXJhdGlvbl9EZXBlbmRlbnRQcm9jZXNzZXMpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHRlYW0gcHJvZmlsZXMgd2hpY2ggaW5jbHVkZXMgYSBzcGVjaWZpYyByb2xlIGRlc2NyaXB0b3IuCi0JICogCi0JICogQHBhcmFtIGUKLQkgKiAgICAgICAgICAgIGEgcm9sZSBkZXNjcmlwdG9yCi0JICogQHJldHVybiBhIGxpc3Qgb2YgdGVhbSBwcm9maWxlcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRUZWFtUHJvZmlsZXMoUm9sZURlc2NyaXB0b3IgZSkgewotCQlyZXR1cm4gKExpc3QpICgoTXVsdGlSZXNvdXJjZUVPYmplY3QpIGUpCi0JCQkJLmdldE9wcG9zaXRlRmVhdHVyZVZhbHVlKFJvbGVEZXNjcmlwdG9yX1RlYW1Qcm9maWxlcyk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgcHJhY3RpY2VzIHJlZmVyZW5jZWQgYnkgYSBjb250ZW50IGVsZW1lbnQuCi0JICogCi0JICogQHBhcmFtIGUKLQkgKiAgICAgICAgICAgIGEgY29udGVudCBlbGVtZW50Ci0JICogQHJldHVybiBhIGxpc3Qgb2YgcHJhY3RpY2VzCi0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0IGdldFByYWN0aWNlcyhDb250ZW50RWxlbWVudCBlKSB7Ci0JCXJldHVybiAoTGlzdCkgKChNdWx0aVJlc291cmNlRU9iamVjdCkgZSkKLQkJCQkuZ2V0T3Bwb3NpdGVGZWF0dXJlVmFsdWUoQ29udGVudEVsZW1lbnRfUHJhY3RpY2VzKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSB0b29sIHdoaWNoIGEgdG9vbCBtZW50b3IgaXMgY2F0ZWdvcml6ZWQgdW5kZXIuCi0JICogCi0JICogQHBhcmFtIGUKLQkgKiAgICAgICAgICAgIGEgdG9vbCBtZW50b3IKLQkgKiBAcmV0dXJuIGEgdG9vbAotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdDw/IGV4dGVuZHMgVG9vbE1lbnRvcj4gZ2V0VG9vbHMoVG9vbE1lbnRvciB0b29sTWVudG9yKSB7Ci0JCXJldHVybiAoTGlzdDw/IGV4dGVuZHMgVG9vbE1lbnRvcj4pICgoTXVsdGlSZXNvdXJjZUVPYmplY3QpIHRvb2xNZW50b3IpCi0JCQkJLmdldE9wcG9zaXRlRmVhdHVyZVZhbHVlKFRvb2xNZW50b3JfVG9vbHMpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHN1Y2Nlc3NvcnMgdG8gYSBzZWN0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBlCi0JICogICAgICAgICAgICBhIHNlY3Rpb24KLQkgKiBAcmV0dXJuIGEgbGlzdCBvZiBzZWN0aW9ucyB0aGF0IGFyZSBwb3N0aW9uZWQgYWZ0ZXIgdGhlIGdpdmVuIHNlY3Rpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3QgZ2V0U3VjY2Vzc29ycyhTZWN0aW9uIHNlY3Rpb24pIHsKLQkJcmV0dXJuIChMaXN0KSAoKE11bHRpUmVzb3VyY2VFT2JqZWN0KSBzZWN0aW9uKQotCQkJCS5nZXRPcHBvc2l0ZUZlYXR1cmVWYWx1ZShTZWN0aW9uX1N1Y2Nlc3NvcnMpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGltbWVkaWF0ZSB2YXJpYXRpZXMgb2YgYSB2YXJpYWJpbGl0eSBlbGVtZW50LgotCSAqIAotCSAqIEBwYXJhbSBlCi0JICogICAgICAgICAgICBhIHZhcmlhYmlsaXR5IGVsZW1lbnQKLQkgKiBAcmV0dXJuIGEgbGlzdCBvZiBpbW1lZGlhdGUgdmFyaWF0aWVzCi0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0IGdldEltbWVkaWF0ZVZhcmlldGllcyhWYXJpYWJpbGl0eUVsZW1lbnQgZSkgewotCQlyZXR1cm4gKExpc3QpICgoTXVsdGlSZXNvdXJjZUVPYmplY3QpIGUpCi0JCQkJLmdldE9wcG9zaXRlRmVhdHVyZVZhbHVlKFZhcmlhYmlsaXR5RWxlbWVudF9JbW1lZGlhdGVWYXJpZXRpZXMpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHByaW1hcnkgdGFza3Mgb2YgYSByb2xlLgotCSAqIAotCSAqIEBwYXJhbSByb2xlCi0JICogICAgICAgICAgICBhIHJvbGUKLQkgKiBAcmV0dXJuIGEgbGlzdCBvZiB0YXNrcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRQcmltYXJ5VGFza3MoUm9sZSByb2xlKSB7Ci0JCXJldHVybiAoTGlzdCkgKChNdWx0aVJlc291cmNlRU9iamVjdCkgcm9sZSkKLQkJCQkuZ2V0T3Bwb3NpdGVGZWF0dXJlVmFsdWUoUm9sZV9QcmltYXJ5X1Rhc2tzKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBzZWNvbmRhcnkgdGFza3Mgb2YgYSByb2xlLgotCSAqIAotCSAqIEBwYXJhbSByb2xlCi0JICogICAgICAgICAgICBhIHJvbGUKLQkgKiBAcmV0dXJuIGEgbGlzdCBvZiB0YXNrcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRTZWNvbmRhcnlUYXNrcyhSb2xlIHJvbGUpIHsKLQkJcmV0dXJuIChMaXN0KSAoKE11bHRpUmVzb3VyY2VFT2JqZWN0KSByb2xlKQotCQkJCS5nZXRPcHBvc2l0ZUZlYXR1cmVWYWx1ZShSb2xlX1NlY29uZGFyeV9UYXNrcyk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgc3VjY2Vzc29yIGxpbmsgb2YgYSB3b3JrIGJyZWFrZG93biBlbGVtZW50LgotCSAqIAotCSAqIEBwYXJhbSBlCi0JICogICAgICAgICAgICBhIGJyZWFrIGRvd24gZWxlbWVudAotCSAqIEByZXR1cm4gYSBsaXN0IG9mIGxpbmtzIHRvIHdvcmsgYnJlYWtkb3duIGVsZW1lbnRzCi0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0IGdldExpbmtUb1N1Y2Nlc3NvcihCcmVha2Rvd25FbGVtZW50IGUpIHsKLQkJcmV0dXJuIChMaXN0KSAoKE11bHRpUmVzb3VyY2VFT2JqZWN0KSBlKQotCQkJCS5nZXRPcHBvc2l0ZUZlYXR1cmVWYWx1ZShXb3JrQnJlYWtkb3duRWxlbWVudF9MaW5rVG9TdWNjZXNzb3IpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHN1Y2Nlc3NvciBvZiBhIHdvcmsgb3JkZXIuCi0JICogCi0JICogQHBhcmFtIHdvcmtPcmRlcgotCSAqICAgICAgICAgICAgYSB3b3JrIG9yZGVyCi0JICogQHJldHVybiBhIHdvcmsgYnJlYWtkb3duIGVsZW1lbnQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFdvcmtCcmVha2Rvd25FbGVtZW50IGdldFN1Y2Nlc3NvcihXb3JrT3JkZXIgd29ya09yZGVyKSB7Ci0JCXJldHVybiAoV29ya0JyZWFrZG93bkVsZW1lbnQpICgoTXVsdGlSZXNvdXJjZUVPYmplY3QpIHdvcmtPcmRlcikKLQkJCQkuZ2V0T3Bwb3NpdGVGZWF0dXJlVmFsdWUoV29ya09yZGVyX1N1Y2Nlc3Nvcik7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgdGFza3Mgd2hpY2ggcHJvZHVjZSBhIHdvcmsgcHJvZHVjdCBhcyBhbiBvdXRwdXQuCi0JICogCi0JICogQHBhcmFtIHdwCi0JICogICAgICAgICAgICBhIHdvcmsgcHJvZHVjdAotCSAqIEByZXR1cm4gYSBsaXN0IG9mIHRhc2tzCi0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0IGdldE91dHB1dHRpbmdUYXNrcyhXb3JrUHJvZHVjdCB3cCkgewotCQlyZXR1cm4gKExpc3QpICgoTXVsdGlSZXNvdXJjZUVPYmplY3QpIHdwKQotCQkJCS5nZXRPcHBvc2l0ZUZlYXR1cmVWYWx1ZShXb3JrUHJvZHVjdF9PdXRwdXRGcm9tX1Rhc2tzKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSB0YXNrcyB3aGljaCB1c2UgYSB3b3JrIHByb2R1Y3QgYXMgYSBtYW5kYXRvcnkgaW5wdXQuCi0JICogCi0JICogQHBhcmFtIHdwCi0JICogICAgICAgICAgICBhIHdvcmsgcHJvZHVjdAotCSAqIEByZXR1cm4gYSBsaXN0IG9mIHRhc2tzCi0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0IGdldE1hbmRhdG9yeUlucHV0VG9UYXNrcyhXb3JrUHJvZHVjdCB3cCkgewotCQlyZXR1cm4gKExpc3QpICgoTXVsdGlSZXNvdXJjZUVPYmplY3QpIHdwKQotCQkJCS5nZXRPcHBvc2l0ZUZlYXR1cmVWYWx1ZShXb3JrUHJvZHVjdF9NYW5kYXRvcnlJbnB1dFRvX1Rhc2tzKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSByZXNwb25zaWJsZSByb2xlcyBmb3IgYSB3b3JrIHByb2R1Y3QuCi0JICogCi0JICogQHBhcmFtIHdwCi0JICogICAgICAgICAgICBhIHdvcmsgcHJvZHVjdAotCSAqIEByZXR1cm4gYSBsaXN0IG9mIHJvbGVzCi0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0IGdldFJlc3BvbnNpYmxlUm9sZXMoV29ya1Byb2R1Y3Qgd3ApIHsKLQkJcmV0dXJuIChMaXN0KSB3cC5nZXRPcHBvc2l0ZUZlYXR1cmVWYWx1ZShXb3JrUHJvZHVjdF9SZXNwb25zaWJsZVJvbGVzKTsKLQl9Ci0JCi0JLyoqCi0JICogR2V0cyBsaXN0IG9mIHdvcmsgcHJvZHVjdHMgZm9yIHdoaWNoIGdpdmVuIHdvcmsgcHJvZHVjdCBmdWxmaWxscy4KLQkgKiAKLQkgKiBAcGFyYW0gd3AKLQkgKiAgICAgICAgICAgIGEgd29yayBwcm9kdWN0Ci0JICogQHJldHVybiBhIGxpc3Qgb2Ygd29yayBwcm9kdWN0cwotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRGdWxsRmlsbHMoV29ya1Byb2R1Y3Qgd3ApIHsKLQkJcmV0dXJuIChMaXN0KSB3cC5nZXRPcHBvc2l0ZUZlYXR1cmVWYWx1ZShGdWxGaWxsc19GdWxsRmlsbGFibGVFbGVtZW50cyk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgd29yayBwcm9kdWN0cyBtb2RpZmllZCBieSBhIHJvbGUuCi0JICogCi0JICogQHBhcmFtIHJvbGUKLQkgKiAgICAgICAgICAgIGEgcm9sZQotCSAqIEByZXR1cm4gYSBsaXN0IG9mIHdvcmsgcHJvZHVjdHMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3QgZ2V0TW9kaWZpZWRXb3JrUHJvZHVjdHMoUm9sZSByb2xlKSB7Ci0JCUxpc3QgcGVyZm9ybXMgPSBnZXRQcmltYXJ5VGFza3Mocm9sZSk7Ci0JCUxpc3QgbW9kaWZpZXMgPSBuZXcgQmFzaWNFTGlzdCgpOwotCQlpZiAocGVyZm9ybXMgIT0gbnVsbCAmJiBwZXJmb3Jtcy5zaXplKCkgPiAwKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGkgPSBwZXJmb3Jtcy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLQkJCQlUYXNrIHRhc2sgPSAoVGFzaykgaS5uZXh0KCk7Ci0KLQkJCQkvLyBmb3IgZWFjaCB0YXNrLCBnZXQgb3V0cHV0IHdvcmsgcHJvZHVjdDsKLQkJCQlMaXN0IG91dHB1dFdQcyA9IHRhc2suZ2V0T3V0cHV0KCk7Ci0JCQkJaWYgKG91dHB1dFdQcyAhPSBudWxsICYmIG91dHB1dFdQcy5zaXplKCkgPiAwKSB7Ci0JCQkJCWZvciAoSXRlcmF0b3IgaXQgPSBvdXRwdXRXUHMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCQkJV29ya1Byb2R1Y3Qgd3AgPSAoV29ya1Byb2R1Y3QpIGl0Lm5leHQoKTsKLQkJCQkJCWlmICh3cCAhPSBudWxsKSB7Ci0JCQkJCQkJaWYgKCFtb2RpZmllcy5jb250YWlucyh3cCkpIHsKLQkJCQkJCQkJbW9kaWZpZXMuYWRkKHdwKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG1vZGlmaWVzOwotCi0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgcm9sZXMgdGhhdCBtb2RpZnkgYSB3b3JrIHByb2R1Y3QuCi0JICogCi0JICogQHBhcmFtIHdwCi0JICogICAgICAgICAgICBhIHdvcmsgcHJvZHVjdAotCSAqIEByZXR1cm4gYSBsaXN0IG9mIHJvbGVzCi0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0IGdldE1vZGlmaWVkQnkoV29ya1Byb2R1Y3Qgd3ApIHsKLQkJTGlzdCBvdXRwdXRGcm9tID0gQXNzb2NpYXRpb25IZWxwZXIuZ2V0T3V0cHV0dGluZ1Rhc2tzKHdwKTsKLQkJVW5pcXVlRUxpc3Q8Um9sZT4gbW9kaWZpZXMgPSBuZXcgVW5pcXVlRUxpc3Q8Um9sZT4oKTsKLQkJaWYgKG91dHB1dEZyb20gIT0gbnVsbCAmJiBvdXRwdXRGcm9tLnNpemUoKSA+IDApIHsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBvdXRwdXRGcm9tLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQkvLwlmb3IgZWFjaCB0YXNrIGdldCwgZ2V0IHByaW1hcnkgcGVyZm9ybWVyIHJvbGUKLQkJCQlUYXNrIHRhc2sgPSAoVGFzaykgaXQubmV4dCgpOwotCQkJCW1vZGlmaWVzLmFkZEFsbCh0YXNrLmdldFBlcmZvcm1lZEJ5KCkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBtb2RpZmllczsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBkaXNjaXBsaW5lIGdyb3VwaW5ncyB3aGljaCBjb250YWluIGEgcmVmZXJlbmNlIHRvIGEgZGlzY2lwbGluZS4KLQkgKiAKLQkgKiBAcGFyYW0gZGlzY2lwbGluZQotCSAqICAgICAgICAgICAgYSBkaXNjaXBsaW5lCi0JICogQHJldHVybiBhIGxpc3Qgb2YgZGlzY2lwbGluZSBncm91cGluZ3MKLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3QgZ2V0RGlzY2lwbGluZUdyb3VwcyhEaXNjaXBsaW5lIGRpc2NpcGxpbmUpIHsKLQkJcmV0dXJuIChMaXN0KSAoKE11bHRpUmVzb3VyY2VFT2JqZWN0KSBkaXNjaXBsaW5lKQotCQkJCS5nZXRPcHBvc2l0ZUZlYXR1cmVWYWx1ZShEaXNjaXBsaW5lX0Rpc2NpcGxpbmVHcm91cGluZ3MpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGRpc2NpcGxpbmUgd2hpY2ggY29udGFpbiBhIHJlZmVyZW5jZSB0byBhIHN1YmRpc2NpcGxpbmUuCi0JICogCi0JICogQHBhcmFtIGRpc2NpcGxpbmUKLQkgKiAgICAgICAgICAgIGEgZGlzY2lwbGluZQotCSAqIEByZXR1cm4gYSBsaXN0IG9mIGRpc2NpcGxpbmUgZ3JvdXBpbmdzCi0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0IGdldERpc2NpcGxpbmUoRGlzY2lwbGluZSBzdWJkaXNjaXBsaW5lKSB7Ci0JCXJldHVybiAoTGlzdCkgKChNdWx0aVJlc291cmNlRU9iamVjdCkgc3ViZGlzY2lwbGluZSkKLQkJCQkuZ2V0T3Bwb3NpdGVGZWF0dXJlVmFsdWUoU3ViZGlzY2lwbGluZV9EaXNjaXBsaW5lKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBkb21haW5zIHdoaWNoIGEgd29yayBwcm9kdWN0IGlzIGNhdGVnb3JpemVkIHVuZGVyLgotCSAqIAotCSAqIEBwYXJhbSB3cAotCSAqICAgICAgICAgICAgYSB3b3JrIHByb2R1Y3QKLQkgKiBAcmV0dXJuIGEgZG9tYWluCi0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0IGdldERvbWFpbnMoV29ya1Byb2R1Y3Qgd3ApIHsKLQkJcmV0dXJuIChMaXN0KSAoKE11bHRpUmVzb3VyY2VFT2JqZWN0KSB3cCkKLQkJCQkuZ2V0T3Bwb3NpdGVGZWF0dXJlVmFsdWUoV29ya1Byb2R1Y3RfRG9tYWlucyk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgcm9sZSBzZXQgZ3JvdXBpbmdzIHdoaWNoIGNvbnRhaW4gYSByZWZlcmVuY2UgdG8gYSByb2xlIHNldC4KLQkgKiAKLQkgKiBAcGFyYW0gcm9sZVNldAotCSAqICAgICAgICAgICAgYSByb2xlIHNldAotCSAqIEByZXR1cm4gYSBsaXN0IG9mIHJvbGUgc2V0IGdyb3VwaW5ncwotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRSb2xlU2V0R3JvdXBzKFJvbGVTZXQgcm9sZVNldCkgewotCQlyZXR1cm4gKExpc3QpICgoTXVsdGlSZXNvdXJjZUVPYmplY3QpIHJvbGVTZXQpCi0JCQkJLmdldE9wcG9zaXRlRmVhdHVyZVZhbHVlKFJvbGVTZXRfUm9sZVNldEdyb3VwcGluZ3MpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHJvbGUgc2V0cyB3aGljaCBhIHJvbGUgaXMgY2F0ZWdvcml6ZWQgdW5kZXIuCi0JICogCi0JICogQHBhcmFtIHJvbGUKLQkgKiAgICAgICAgICAgIGEgcm9sZQotCSAqIEByZXR1cm4gYSBsaXN0IG9mIHJvbGUgc2V0cwotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRSb2xlU2V0cyhSb2xlIHJvbGUpIHsKLQkJcmV0dXJuIChMaXN0KSAoKE11bHRpUmVzb3VyY2VFT2JqZWN0KSByb2xlKQotCQkJCS5nZXRPcHBvc2l0ZUZlYXR1cmVWYWx1ZShSb2xlX1JvbGVTZXRzKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSB0YXNrIGRlc2NyaXB0b3JzIHdoaWNoIGhhdmUgYmVlbiBjcmVhdGVkIGZyb20gYSB0YXNrLgotCSAqIAotCSAqIEBwYXJhbSB0YXNrCi0JICogICAgICAgICAgICBhIHRhc2sKLQkgKiBAcmV0dXJuIGEgbGlzdCBvZiB0YXNrIGRlc2NyaXB0b3JzCi0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0IGdldFRhc2tEZXNjcmlwdG9ycyhUYXNrIHRhc2spIHsKLQkJcmV0dXJuIChMaXN0KSB0YXNrLmdldE9wcG9zaXRlRmVhdHVyZVZhbHVlKFRhc2tfVGFza0Rlc2NyaXB0b3JzKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBkaXNjaXBsaW5lcyB3aGljaCBhIHRhc2sgaXMgY2F0ZWdvcml6ZWQgdW5kZXIuCi0JICogCi0JICogQHBhcmFtIHRhc2sKLQkgKiAgICAgICAgICAgIGEgdGFzawotCSAqIEByZXR1cm4gYSBsaXN0IG9mIGRpc2NpcGxpbmVzCi0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0IGdldERpc2NpcGxpbmVzKFRhc2sgdGFzaykgewotCQlyZXR1cm4gKExpc3QpIHRhc2suZ2V0T3Bwb3NpdGVGZWF0dXJlVmFsdWUoVGFza19EaXNjaXBsaW5lcyk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgZGlzY2lwbGluZXMgd2hpY2ggYW4gYWN0aXZpdHkgaXMgYXNzb2NpYXRlZCB3aXRoLgotCSAqIAotCSAqIEBwYXJhbSBhY3Rpdml0eQotCSAqICAgICAgICAgICAgYW4gYWN0aXZpdHkKLQkgKiBAcmV0dXJuIGEgbGlzdCBvZiBkaXNjaXBsaW5lcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXREaXNjaXBsaW5lcyhBY3Rpdml0eSBhY3Rpdml0eSkgewotCQlyZXR1cm4gKExpc3QpIGFjdGl2aXR5LmdldE9wcG9zaXRlRmVhdHVyZVZhbHVlKEFjdGl2aXR5X0Rpc2NpcGxpbmVzKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBwcmltYXJ5IHRhc2sgZGVzY3JpcHRvcnMgcGVyZm9ybWVkIGJ5IGEgcm9sZSBkZXNjcmlwdG9yLgotCSAqIAotCSAqIEBwYXJhbSByb2xlRGVzYwotCSAqICAgICAgICAgICAgYSByb2xlIGRlc2NyaXB0b3IKLQkgKiBAcmV0dXJuIGEgbGlzdCBvZiB0YXNrIGRlc2NyaXB0b3JzCi0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0IGdldFByaW1hcnlUYXNrRGVzY3JpcHRvcnMoUm9sZURlc2NyaXB0b3Igcm9sZURlc2MpIHsKLQkJcmV0dXJuIChMaXN0KSAoKE11bHRpUmVzb3VyY2VFT2JqZWN0KSByb2xlRGVzYykKLQkJCQkuZ2V0T3Bwb3NpdGVGZWF0dXJlVmFsdWUoUm9sZURlc2NyaXB0b3JfUHJpbWFyeVRhc2tEZXNjcmlwdG9ycyk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgYWRkaXRpb25hbCB0YXNrIGRlc2NyaXB0b3JzIHBlcmZvcm1lZCBieSBhIHJvbGUgZGVzY3JpcHRvci4KLQkgKiAKLQkgKiBAcGFyYW0gcm9sZURlc2MKLQkgKiAgICAgICAgICAgIGEgcm9sZSBkZXNjcmlwdG9yCi0JICogQHJldHVybiBhIGxpc3Qgb2YgdGFzayBkZXNjcmlwdG9ycwotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRBZGRpdGlvbmFsVGFza0Rlc2NyaXB0b3JzKFJvbGVEZXNjcmlwdG9yIHJvbGVEZXNjKSB7Ci0JCXJldHVybiAoTGlzdCkgKChNdWx0aVJlc291cmNlRU9iamVjdCkgcm9sZURlc2MpCi0JCQkJLmdldE9wcG9zaXRlRmVhdHVyZVZhbHVlKFJvbGVEZXNjcmlwdG9yX0FkZGl0aW9uYWxUYXNrRGVzY3JpcHRvcnMpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGFzc2lzdGluZyB0YXNrIGRlc2NyaXB0b3JzIHBlcmZvcm1lZCBieSBhIHJvbGUgZGVzY3JpcHRvci4KLQkgKiAKLQkgKiBAcGFyYW0gcm9sZURlc2MKLQkgKiAgICAgICAgICAgIGEgcm9sZSBkZXNjcmlwdG9yCi0JICogQHJldHVybiBhIGxpc3Qgb2YgdGFzayBkZXNjcmlwdG9ycwotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRBc3Npc3RlZFRhc2tEZXNjcmlwdG9ycyhSb2xlRGVzY3JpcHRvciByb2xlRGVzYykgewotCQlyZXR1cm4gKExpc3QpICgoTXVsdGlSZXNvdXJjZUVPYmplY3QpIHJvbGVEZXNjKQotCQkJCS5nZXRPcHBvc2l0ZUZlYXR1cmVWYWx1ZShSb2xlRGVzY3JpcHRvcl9Bc3Npc3RzSW5fVGFza0Rlc2NyaXB0b3JzKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSB3b3JrIHByb2R1Y3QgdHlwZXMgd2hpY2ggYSB3b3JrIHByb2R1Y3QgaXMgY2F0ZWdvcml6ZWQgdW5kZXIuCi0JICogCi0JICogQHBhcmFtIHdwCi0JICogICAgICAgICAgICBhIHdvcmsgcHJvZHVjdAotCSAqIEByZXR1cm4gYSBsaXN0IG9mIHdvcmsgcHJvZHVjdCB0eXBlcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRXb3JrUHJvZHVjdFR5cGVzKFdvcmtQcm9kdWN0IHdwKSB7Ci0JCXJldHVybiAoTGlzdCkgKChNdWx0aVJlc291cmNlRU9iamVjdCkgd3ApCi0JCQkJLmdldE9wcG9zaXRlRmVhdHVyZVZhbHVlKFdvcmtQcm9kdWN0X1dvcmtQcm9kdWN0VHlwZXMpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGN1c3RvbSBjYXRlZ29yaWVzIHdoaWNoIGEgZGVzY3JpYmFibGUgZWxlbWVudCBpcyBhc3NvY2lhdGVkCi0JICogd2l0aC4KLQkgKiAKLQkgKiBAcGFyYW0gd3AKLQkgKiAgICAgICAgICAgIGEgZGVzY3JpYmFibGUgZWxlbWVudAotCSAqIEByZXR1cm4gYSBsaXN0IG9mIGN1c3RvbSBjYXRlZ29yaWVzCi0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0IGdldEN1c3RvbUNhdGVnb3JpZXMoRGVzY3JpYmFibGVFbGVtZW50IGVsZW1lbnQpIHsKLQkJcmV0dXJuIChMaXN0KSAoKE11bHRpUmVzb3VyY2VFT2JqZWN0KSBlbGVtZW50KQotCQkJCS5nZXRPcHBvc2l0ZUZlYXR1cmVWYWx1ZShEZXNjcmliYWJsZUVsZW1lbnRfQ3VzdG9tQ2F0ZWdvcmllcyk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgRGVsaXZlcmFibGVzIHdoaWNoIGEgV29ya1Byb2R1Y3QgZWxlbWVudCBpcyBhc3NvY2lhdGVkIHdpdGguCi0JICogCi0JICogQHBhcmFtIHdwCi0JICogICAgICAgICAgICBhIFdvcmtQcm9kdWN0IGVsZW1lbnQKLQkgKiBAcmV0dXJuIGEgbGlzdCBvZiBEZWxpdmVyYWJsZXMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3QgZ2V0RGVsaXZlcmFibGVzKFdvcmtQcm9kdWN0IGVsZW1lbnQpIHsKLQkJcmV0dXJuIChMaXN0KSAoKE11bHRpUmVzb3VyY2VFT2JqZWN0KSBlbGVtZW50KQotCQkJCS5nZXRPcHBvc2l0ZUZlYXR1cmVWYWx1ZShXb3JrUHJvZHVjdF9EZWxpdmVyYWJsZXMpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIG1ldGhvZCBwbHVnLWlucyByZWZlcmVuY2VkIGJ5IGEgbWV0aG9kIHBsdWctaW4uCi0JICogCi0JICogQHBhcmFtIHBsdWdpbgotCSAqICAgICAgICAgICAgYSBtZXRob2QgcGx1Zy1pbgotCSAqIEByZXR1cm4gYSBsaXN0IG9mIG1ldGhvZCBwbHVnLWlucwotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdDxNZXRob2RQbHVnaW4+IGdldFBsdWdpbkRpcmVjdEV4dGVuc2lvbnMoTWV0aG9kUGx1Z2luIHBsdWdpbikgewotCQlyZXR1cm4gKExpc3Q8TWV0aG9kUGx1Z2luPikgKChNdWx0aVJlc291cmNlRU9iamVjdCkgcGx1Z2luKQotCQkJCS5nZXRPcHBvc2l0ZUZlYXR1cmVWYWx1ZShNZXRob2RQbHVnaW5fRGlyZWN0RXh0ZW5zaW9ucyk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyBhbGwgdGhlIHJlZmVyZW5jZXMgdG8gYSBtZXRob2QgZWxlbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqICAgICAgICAgICAgYSBtZXRob2QgZWxlbWVudAotCSAqIEByZXR1cm4gYSBjb2xsZWN0aW9uIG9mIG1ldGhvZCBlbGVtZW50IHJlZmVyZW5jZXMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIENvbGxlY3Rpb24gZ2V0UmVmZXJlbmNlcyhNZXRob2RFbGVtZW50IGVsZW1lbnQpIHsKLQkJU2V0IHJlZmVyZW5jZXMgPSBuZXcgSGFzaFNldCgpOwotCQlNdWx0aVJlc291cmNlRU9iamVjdCBlT2JqID0gKE11bHRpUmVzb3VyY2VFT2JqZWN0KSBlbGVtZW50OwotCi0JCWlmIChlT2JqLmJhc2ljR2V0T3Bwb3NpdGVGZWF0dXJlTWFwKCkgPT0gbnVsbCkKLQkJCXJldHVybiByZWZlcmVuY2VzOwotCi0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGVPYmouZ2V0T3Bwb3NpdGVGZWF0dXJlTWFwKCkuZW50cnlTZXQoKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCU1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIGl0ZXIubmV4dCgpOwotCQkJT3Bwb3NpdGVGZWF0dXJlIG9wcG9zaXRlRmVhdHVyZSA9ICgoT3Bwb3NpdGVGZWF0dXJlKSBlbnRyeS5nZXRLZXkoKSk7Ci0JCQlvcHBvc2l0ZUZlYXR1cmUuZ2V0VGFyZ2V0RmVhdHVyZSgpOwotCQkJaWYgKG9wcG9zaXRlRmVhdHVyZS5pc01hbnkoKSkgewotCQkJCXJlZmVyZW5jZXMuYWRkQWxsKChDb2xsZWN0aW9uKSBlT2JqCi0JCQkJCQkuZ2V0T3Bwb3NpdGVGZWF0dXJlVmFsdWUob3Bwb3NpdGVGZWF0dXJlKSk7Ci0JCQl9IGVsc2UgewotCQkJCUVPYmplY3Qgb2JqID0gKEVPYmplY3QpIGVPYmoKLQkJCQkJCS5nZXRPcHBvc2l0ZUZlYXR1cmVWYWx1ZShvcHBvc2l0ZUZlYXR1cmUpOwotCQkJCWlmIChvYmogIT0gbnVsbCkgewotCQkJCQlyZWZlcmVuY2VzLmFkZChvYmopOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiByZWZlcmVuY2VzOwotCX0KLQotCS8qKgotCSAqIEdldHMgYWxsIHRoZSByZWZlcmVuY2VzIHRvIGEgbWV0aG9kIGVsZW1lbnQuCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGVsZW1lbnQKLQkgKiBAcmV0dXJuIGEgbWFwIGNvbnRhaW5pbmcgbWV0aG9kIGVsZW1lbnQgcmVmZXJlbmNlcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgTWFwPEVPYmplY3QsIENvbGxlY3Rpb248RVN0cnVjdHVyYWxGZWF0dXJlPj4gZ2V0UmVmZXJlbmNlTWFwKE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgewotCQlNYXA8RU9iamVjdCwgQ29sbGVjdGlvbjxFU3RydWN0dXJhbEZlYXR1cmU+PiBvYmplY3RUb0ZlYXR1cmVzTWFwID0gbmV3IEhhc2hNYXA8RU9iamVjdCwgQ29sbGVjdGlvbjxFU3RydWN0dXJhbEZlYXR1cmU+PigpOwotCi0JCU11bHRpUmVzb3VyY2VFT2JqZWN0IGVPYmogPSAoTXVsdGlSZXNvdXJjZUVPYmplY3QpIGVsZW1lbnQ7Ci0KLQkJaWYgKGVPYmouYmFzaWNHZXRPcHBvc2l0ZUZlYXR1cmVNYXAoKSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gb2JqZWN0VG9GZWF0dXJlc01hcDsKLQkJfQotCi0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGVPYmouZ2V0T3Bwb3NpdGVGZWF0dXJlTWFwKCkuZW50cnlTZXQoKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCU1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIGl0ZXIubmV4dCgpOwotCQkJT3Bwb3NpdGVGZWF0dXJlIG9wcG9zaXRlRmVhdHVyZSA9ICgoT3Bwb3NpdGVGZWF0dXJlKSBlbnRyeS5nZXRLZXkoKSk7Ci0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IG9wcG9zaXRlRmVhdHVyZS5nZXRUYXJnZXRGZWF0dXJlKCk7Ci0JCQlpZiAob3Bwb3NpdGVGZWF0dXJlLmlzTWFueSgpKSB7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9ICgoQ29sbGVjdGlvbikgZU9iagotCQkJCQkJLmdldE9wcG9zaXRlRmVhdHVyZVZhbHVlKG9wcG9zaXRlRmVhdHVyZSkpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yCi0JCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQlFT2JqZWN0IG9iamVjdCA9IChFT2JqZWN0KSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCUNvbGxlY3Rpb248RVN0cnVjdHVyYWxGZWF0dXJlPiBmZWF0dXJlcyA9IG9iamVjdFRvRmVhdHVyZXNNYXAKLQkJCQkJCQkuZ2V0KG9iamVjdCk7Ci0JCQkJCWlmIChmZWF0dXJlcyA9PSBudWxsKSB7Ci0JCQkJCQlmZWF0dXJlcyA9IG5ldyBBcnJheUxpc3Q8RVN0cnVjdHVyYWxGZWF0dXJlPigpOwotCQkJCQkJb2JqZWN0VG9GZWF0dXJlc01hcC5wdXQob2JqZWN0LCBmZWF0dXJlcyk7Ci0JCQkJCX0KLQkJCQkJZmVhdHVyZXMuYWRkKGZlYXR1cmUpOwotCQkJCX0KLQkJCQk7Ci0JCQl9IGVsc2UgewotCQkJCUVPYmplY3Qgb2JqZWN0ID0gKEVPYmplY3QpIGVPYmoKLQkJCQkJCS5nZXRPcHBvc2l0ZUZlYXR1cmVWYWx1ZShvcHBvc2l0ZUZlYXR1cmUpOwotCQkJCWlmIChvYmplY3QgIT0gbnVsbCkgewotCQkJCQlDb2xsZWN0aW9uPEVTdHJ1Y3R1cmFsRmVhdHVyZT4gZmVhdHVyZXMgPSBvYmplY3RUb0ZlYXR1cmVzTWFwCi0JCQkJCQkJLmdldChvYmplY3QpOwotCQkJCQlpZiAoZmVhdHVyZXMgPT0gbnVsbCkgewotCQkJCQkJZmVhdHVyZXMgPSBuZXcgQXJyYXlMaXN0PEVTdHJ1Y3R1cmFsRmVhdHVyZT4oKTsKLQkJCQkJCW9iamVjdFRvRmVhdHVyZXNNYXAucHV0KG9iamVjdCwgZmVhdHVyZXMpOwotCQkJCQl9Ci0JCQkJCWZlYXR1cmVzLmFkZChmZWF0dXJlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gb2JqZWN0VG9GZWF0dXJlc01hcDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIHZvaWQgaW5pdCgpIHsKLQl9Ci0KLQkvKioKLQkgKiBHaXZlbiBhIHNldCBvZiBlbGVtZW50cywgcmV0dXJucyB0aGUgc2V0IG9mIHRob3NlIGVsZW1lbnRzIHBsdXMgYW55Ci0JICogdmFyaWFiaWxpdHkgZWxlbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoZW0uCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnRTZXQKLQkgKiAgICAgICAgICAgIGEgc2V0IG9mIG1ldGhvZCBlbGVtZW50cyBmb3Igd2hpY2ggdG8gcmV0cmlldmUgdGhlIHZhcmlhYmlsaXR5Ci0JICogICAgICAgICAgICBlbGVtZW50cwotCSAqIEBwYXJhbSBnZXRCYXNlcwotCSAqICAgICAgICAgICAgaWYgPGNvZGU+dHJ1ZTwvY29kZT4sIHJlY3Vyc2UgaW50byB0aGUgdmFyaWFiaWxpdHkgYmFzZQotCSAqICAgICAgICAgICAgZWxlbWVudHMgKCJ1cCB0aGUgdHJlZSIpCi0JICogQHBhcmFtIGdldENoaWxkcmVuCi0JICogICAgICAgICAgICBpZiA8Y29kZT50cnVlPC9jb2RlPiwgcmVjdXJzZSBpbnRvIHRoZSB2YXJpZXRpZXMgKCJkb3duIHRoZQotCSAqICAgICAgICAgICAgdHJlZSIpCi0JICogQHJldHVybiBhIGNvbGxlY3RpdmUgc2V0IG9mIG1ldGhvZCBlbGVtZW50cyBwbHVzIHRoZSBhc3NvY2lhdGVkCi0JICogICAgICAgICB2YXJpYWJpbGl0eSBlbGVtZW50cwotCSAqLwotCXB1YmxpYyBzdGF0aWMgU2V0IGdldFZhcmlhYmlsaXR5RWxlbWVudHMoU2V0IGVsZW1lbnRTZXQsIGJvb2xlYW4gZ2V0QmFzZXMsCi0JCQlib29sZWFuIGdldENoaWxkcmVuKSB7Ci0JCWlmIChlbGVtZW50U2V0ICE9IG51bGwgJiYgIWVsZW1lbnRTZXQuaXNFbXB0eSgpKSB7Ci0JCQlTZXQgdmFyU2V0ID0gbmV3IEhhc2hTZXQoKTsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGVsZW1lbnRTZXQuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IG8gPSBpdGVyLm5leHQoKTsKLQkJCQlpZiAobyBpbnN0YW5jZW9mIFZhcmlhYmlsaXR5RWxlbWVudCkgewotCQkJCQlWYXJpYWJpbGl0eUVsZW1lbnQgZWxlbWVudCA9IChWYXJpYWJpbGl0eUVsZW1lbnQpIG87Ci0JCQkJCWlmIChnZXRDaGlsZHJlbikKLQkJCQkJCXZhclNldC5hZGRBbGwoZ2V0SW1tZWRpYXRlVmFyaWV0aWVzKGVsZW1lbnQpKTsKLQkJCQkJaWYgKGdldEJhc2VzCi0JCQkJCQkJJiYgZWxlbWVudC5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkgIT0gbnVsbCkKLQkJCQkJCXZhclNldC5hZGQoZWxlbWVudC5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkpOwotCQkJCX0KLQkJCX0KLQkJCWlmICh2YXJTZXQuaXNFbXB0eSgpKQotCQkJCXJldHVybiBlbGVtZW50U2V0OwotCQkJaWYgKGVsZW1lbnRTZXQuY29udGFpbnNBbGwodmFyU2V0KSkKLQkJCQlyZXR1cm4gZWxlbWVudFNldDsKLQkJCWVsZW1lbnRTZXQuYWRkQWxsKHZhclNldCk7Ci0JCQllbGVtZW50U2V0LmFkZEFsbChnZXRWYXJpYWJpbGl0eUVsZW1lbnRzKGVsZW1lbnRTZXQsIGdldEJhc2VzLAotCQkJCQlnZXRDaGlsZHJlbikpOwotCQl9Ci0JCXJldHVybiBlbGVtZW50U2V0OwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvdXRpbC9Db250ZW50RGVzY3JpcHRpb25GYWN0b3J5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3V0aWwvQ29udGVudERlc2NyaXB0aW9uRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMjVlNzhkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvdXRpbC9Db250ZW50RGVzY3JpcHRpb25GYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaWJhYmxlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQ29udGVudEVsZW1lbnRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Qcm9jZXNzRWxlbWVudEltcGw7Ci0KLS8qKgotICogTWFuYWdlcyB0aGUgY3JlYXRpb24gb2YgY29udGVudCBkZXNjcmlwdGlvbnMuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBDb250ZW50RGVzY3JpcHRpb25GYWN0b3J5IHsKLQotCS8vIE1hcHMgQ29udGVudEVsZW1lbnQgaW1wbGVtZW50YXRpb24gQ2xhc3MgdG8gQ29udGVudERlc2NpcHRpb25JbmZvLgotCXByaXZhdGUgc3RhdGljIGZpbmFsIE1hcDxFQ2xhc3MsIEVDbGFzcz4gY29udGVudERlc2NDbGFzc01hcCA9IG5ldyBIYXNoTWFwPEVDbGFzcywgRUNsYXNzPigpOwotCi0Jc3RhdGljIHsKLQkJY29udGVudERlc2NDbGFzc01hcC5wdXQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UHJhY3RpY2UoKSwKLQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRQcmFjdGljZURlc2NyaXB0aW9uKCkpOwotCQljb250ZW50RGVzY0NsYXNzTWFwLnB1dChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRSb2xlKCksCi0JCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Um9sZURlc2NyaXB0aW9uKCkpOwotCQljb250ZW50RGVzY0NsYXNzTWFwLnB1dChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrKCksCi0JCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza0Rlc2NyaXB0aW9uKCkpOwotCQljb250ZW50RGVzY0NsYXNzTWFwLnB1dChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUZW1wbGF0ZSgpLAotCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEd1aWRhbmNlRGVzY3JpcHRpb24oKSk7Ci0JCWNvbnRlbnREZXNjQ2xhc3NNYXAucHV0KFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEV4YW1wbGUoKSwKLQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRHdWlkYW5jZURlc2NyaXB0aW9uKCkpOwotCQljb250ZW50RGVzY0NsYXNzTWFwLnB1dChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRSZXVzYWJsZUFzc2V0KCksCi0JCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0R3VpZGFuY2VEZXNjcmlwdGlvbigpKTsKLQkJY29udGVudERlc2NDbGFzc01hcC5wdXQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V2hpdGVwYXBlcigpLAotCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEd1aWRhbmNlRGVzY3JpcHRpb24oKSk7Ci0JCWNvbnRlbnREZXNjQ2xhc3NNYXAucHV0KFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEFydGlmYWN0KCksCi0JCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QXJ0aWZhY3REZXNjcmlwdGlvbigpKTsKLQkJY29udGVudERlc2NDbGFzc01hcC5wdXQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RGVsaXZlcmFibGUoKSwKLQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXREZWxpdmVyYWJsZURlc2NyaXB0aW9uKCkpOwotCQljb250ZW50RGVzY0NsYXNzTWFwLnB1dChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRPdXRjb21lKCksCi0JCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V29ya1Byb2R1Y3REZXNjcmlwdGlvbigpKTsKLQotCQljb250ZW50RGVzY0NsYXNzTWFwLnB1dChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRSb2xlRGVzY3JpcHRvcigpLAotCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldERlc2NyaXB0b3JEZXNjcmlwdGlvbigpKTsKLQkJY29udGVudERlc2NDbGFzc01hcC5wdXQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29tcG9zaXRlUm9sZSgpLAotCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldERlc2NyaXB0b3JEZXNjcmlwdGlvbigpKTsKLQkJY29udGVudERlc2NDbGFzc01hcC5wdXQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza0Rlc2NyaXB0b3IoKSwKLQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXREZXNjcmlwdG9yRGVzY3JpcHRpb24oKSk7Ci0JCWNvbnRlbnREZXNjQ2xhc3NNYXAucHV0KAotCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcigpLAotCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldERlc2NyaXB0b3JEZXNjcmlwdGlvbigpKTsKLQotCQljb250ZW50RGVzY0NsYXNzTWFwLnB1dChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRNaWxlc3RvbmUoKSwKLQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24oKSk7Ci0JCWNvbnRlbnREZXNjQ2xhc3NNYXAucHV0KFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRlYW1Qcm9maWxlKCksCi0JCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uKCkpOwotCi0JCWNvbnRlbnREZXNjQ2xhc3NNYXAucHV0KFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEFjdGl2aXR5KCksCi0JCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QWN0aXZpdHlEZXNjcmlwdGlvbigpKTsKLQkJY29udGVudERlc2NDbGFzc01hcC5wdXQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SXRlcmF0aW9uKCksCi0JCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QWN0aXZpdHlEZXNjcmlwdGlvbigpKTsKLQkJY29udGVudERlc2NDbGFzc01hcC5wdXQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UGhhc2UoKSwKLQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRBY3Rpdml0eURlc2NyaXB0aW9uKCkpOwotCQljb250ZW50RGVzY0NsYXNzTWFwLnB1dChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRDYXBhYmlsaXR5UGF0dGVybigpLAotCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFByb2Nlc3NEZXNjcmlwdGlvbigpKTsKLQkJY29udGVudERlc2NDbGFzc01hcC5wdXQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RGVsaXZlcnlQcm9jZXNzKCksCi0JCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24oKSk7Ci0JCWNvbnRlbnREZXNjQ2xhc3NNYXAucHV0KFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldFByb2Nlc3NQbGFubmluZ1RlbXBsYXRlKCksIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldFByb2Nlc3NEZXNjcmlwdGlvbigpKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIEVDbGFzcyBnZXRDb250ZW50RGVzY3JpcHRpb25UeXBlKEVDbGFzcyBkZXNjcmliYWJsZUVsZW1lbnRUeXBlKSB7Ci0JCUVDbGFzcyB0eXBlID0gKEVDbGFzcykgY29udGVudERlc2NDbGFzc01hcC5nZXQoZGVzY3JpYmFibGVFbGVtZW50VHlwZSk7Ci0JCWlmKHR5cGUgPT0gbnVsbCAmJiBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXREZXNjcmliYWJsZUVsZW1lbnQoKS5pc1N1cGVyVHlwZU9mKGRlc2NyaWJhYmxlRWxlbWVudFR5cGUpKSB7Ci0JCQl0eXBlID0gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29udGVudERlc2NyaXB0aW9uKCk7Ci0JCX0KLQkJcmV0dXJuIHR5cGU7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDb250ZW50RGVzY3JpcHRpb24gY3JlYXRlQ29udGVudERlc2NyaXB0aW9uKAotCQkJRGVzY3JpYmFibGVFbGVtZW50IGUpIHsKLQkJRUNsYXNzIGVDbGFzcyA9IChFQ2xhc3MpIGNvbnRlbnREZXNjQ2xhc3NNYXAuZ2V0KGUuZUNsYXNzKCkpOwotCQlpZiAoZUNsYXNzID09IG51bGwpIHsKLQkJCWVDbGFzcyA9IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbnRlbnREZXNjcmlwdGlvbigpOwotCQl9Ci0JCUNvbnRlbnREZXNjcmlwdGlvbiBjb250ZW50ID0gKENvbnRlbnREZXNjcmlwdGlvbikgVW1hRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkuY3JlYXRlKGVDbGFzcyk7Ci0JCWNvbnRlbnQuc2V0TmFtZShVbWFVdGlsLmNyZWF0ZUNvbnRlbnREZXNjcmlwdGlvbk5hbWUoZSkpOwotCQljb250ZW50LnNldEd1aWQoVW1hVXRpbC5nZW5lcmF0ZUdVSUQoZS5nZXRHdWlkKCkpKTsKLQkJcmV0dXJuIGNvbnRlbnQ7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBDb250ZW50RGVzY3JpcHRpb24gb2JqZWN0IGZvciB0aGUgZ2l2ZW4gQ29udGVudEVsZW1lbnQgYW5kCi0JICogc2F2ZSBpdCB0byBhIGZpbGUKLQkgKiAKLQkgKiBAcGFyYW0gZQotCSAqIEByZXR1cm4KLQkgKiBAZGVwcmVjYXRlZCB1c2UgY3JlYXRlQ29udGVudERlc2NyaXB0aW9uKERlc2NyaWJhYmxlRWxlbWVudCBlKSBpbnN0ZWFkCi0JICovCi0JcHVibGljIHN0YXRpYyBDb250ZW50RGVzY3JpcHRpb24gY3JlYXRlQ29udGVudERlc2NyaXB0aW9uKENvbnRlbnRFbGVtZW50IGUpIHsKLQkJcmV0dXJuIGNyZWF0ZUNvbnRlbnREZXNjcmlwdGlvbihlLCBmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIGUKLQkgKiBAcGFyYW0gc2F2ZUNvbnRlbnRPbmx5Ci0JICogQHJldHVybgotCSAqIEBkZXByZWNhdGVkIHVzZSBjcmVhdGVDb250ZW50RGVzY3JpcHRpb24oRGVzY3JpYmFibGVFbGVtZW50IGUpIGluc3RlYWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIENvbnRlbnREZXNjcmlwdGlvbiBjcmVhdGVDb250ZW50RGVzY3JpcHRpb24oCi0JCQlEZXNjcmliYWJsZUVsZW1lbnQgZSwgYm9vbGVhbiBzYXZlQ29udGVudE9ubHkpIHsKLQkJLy8gaWYgKCBlIGluc3RhbmNlb2YgQ29udGVudEVsZW1lbnQpCi0JCS8vIHsKLQkJLy8gcmV0dXJuIGNyZWF0ZUNvbnRlbnREZXNjcmlwdGlvbigoQ29udGVudEVsZW1lbnQpZSwgc2F2ZUNvbnRlbnRPbmx5KTsKLQkJLy8gfQotCQkvLwkJCi0JCS8vIHJldHVybiBjcmVhdGVDb250ZW50RGVzY3JpcHRpb24oZSk7Ci0KLQkJcmV0dXJuIGNyZWF0ZUNvbnRlbnREZXNjcmlwdGlvbihlKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIENvbnRlbnREZXNjcmlwdGlvbiBjcmVhdGVDb250ZW50RGVzY3JpcHRpb24oQ29udGVudEVsZW1lbnQgZSwKLQkJCWJvb2xlYW4gc2F2ZUNvbnRlbnRPbmx5KSB7Ci0JCUNvbnRlbnREZXNjcmlwdGlvbiBkZXNjcmlwdGlvbiA9IGNyZWF0ZUNvbnRlbnREZXNjcmlwdGlvbigoRGVzY3JpYmFibGVFbGVtZW50KSBlKTsKLQotCQkvLyBTZXQgZGVzY3JpcHRpb25zID0gKFNldCkKLQkJLy8gY29udGVudERlc2NyaXB0aW9uc01hcC5nZXQoZGVzY0luZm8ucGFja2FnZU5hbWUpOwotCQkvLyBpZihkZXNjcmlwdGlvbnMgPT0gbnVsbCkgewotCQkvLyBkZXNjcmlwdGlvbnMgPSBuZXcgSGFzaFNldCgpOwotCQkvLyBjb250ZW50RGVzY3JpcHRpb25zTWFwLnB1dChkZXNjSW5mby5wYWNrYWdlTmFtZSwgZGVzY3JpcHRpb25zKTsKLQkJLy8gfQotCQkvLyBkZXNjcmlwdGlvbnMuYWRkKGRlc2NyaXB0aW9uKTsKLQotCQkvLyBzYXZpbmcgQ29udGVudERlc2NyaXB0aW9uIHJpZ2h0IGFmdGVyIGl0cyBjcmVhdGlvbiBpdCBubyBsb25nZXIKLQkJLy8gbmVlZGVkIHNpbmNlIENvbnRlbnREZXNjcmlwdGlvbiBpcwotCQkvLyBub3cgY29udGFpbmVkIGJ5IGEgRGVzY3JpYmFibGVFbGVtZW50Ci0JCS8vCi0JCS8vIGlmKGxpYlBlcnNpc3RlciAhPSBudWxsKSB7Ci0JCS8vIGxpYlBlcnNpc3Rlci5zYXZlKGUsIGRlc2NyaXB0aW9uLCBzYXZlQ29udGVudE9ubHkpOwotCQkvLyB9Ci0JCXJldHVybiBkZXNjcmlwdGlvbjsKLQl9Ci0KLQkvLyBwdWJsaWMgc3RhdGljIGZpbmFsIE1hcCBnZXRDb250ZW50RGVzY3JpcHRpb25zTWFwKCkgewotCS8vIHJldHVybiBjb250ZW50RGVzY3JpcHRpb25zTWFwOwotCS8vIH0KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBoYXNQcmVzZW50YXRpb24oTWV0aG9kRWxlbWVudCBlKSB7Ci0JCWlmIChlIGluc3RhbmNlb2YgQ29udGVudEVsZW1lbnRJbXBsKSB7Ci0JCQlyZXR1cm4gKChDb250ZW50RWxlbWVudEltcGwpIGUpLmJhc2ljR2V0UHJlc2VudGF0aW9uKCkgIT0gbnVsbDsKLQkJfSBlbHNlIGlmIChlIGluc3RhbmNlb2YgUHJvY2Vzc0VsZW1lbnRJbXBsKSB7Ci0JCQlyZXR1cm4gKChQcm9jZXNzRWxlbWVudEltcGwpIGUpLmJhc2ljR2V0UHJlc2VudGF0aW9uKCkgIT0gbnVsbDsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBFQ2xhc3MgZ2V0Q29udGVudERlc2NyaXB0aW9uRUNsYXNzKERlc2NyaWJhYmxlRWxlbWVudCBlKSB7Ci0JCXJldHVybiAoRUNsYXNzKSBjb250ZW50RGVzY0NsYXNzTWFwLmdldChlLmVDbGFzcygpKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJLy8gTWVzc2FnZURpZ2VzdCBtZDUgPSBNZXNzYWdlRGlnZXN0LmdldEluc3RhbmNlKCJNRDUiKTsKLQkJU3RyaW5nIGlucHV0ID0gYXJnc1swXTsKLQkJLy8gYnl0ZVtdIGhhc2ggPSBtZDUuZGlnZXN0KGlucHV0LmdldEJ5dGVzKCkpOwotCQlTeXN0ZW0ub3V0LnByaW50bG4oImlucHV0OiAnIiArIGlucHV0ICsgIiciKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCVN5c3RlbS5vdXQucHJpbnRsbigiSmF2YSdzIGhhc2ggY29kZTogIiArIGlucHV0Lmhhc2hDb2RlKCkpOyAvLyROT04tTkxTLTEkCi0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiaGFzaCBsZW5ndGg6ICIgKyBoYXNoLmxlbmd0aCk7Ci0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiYmFzZTY0IGVuY29kZWQ6ICIgKwotCQkvLyBEYXRhVmFsdWUuQmFzZTY0LmVuY29kZShoYXNoKSk7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigibmV3IEdVSUQ6ICIgKyBVbWFVdGlsLmdlbmVyYXRlR1VJRChpbnB1dCkpOyAvLyROT04tTkxTLTEkCi0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS91dGlsL01lc3NhZ2VFeGNlcHRpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvdXRpbC9NZXNzYWdlRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0YTg4YmIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS91dGlsL01lc3NhZ2VFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5XcmFwcGVkRXhjZXB0aW9uOwotCi0vKioKLSAqIFNpZ25hbHMgdGhhdCBhIG1ldGhvZCBsaWJyYXJ5IHBlcnNpc3RlbmNlIG9wZXJhdGlvbiBoYXMgZmFpbGVkLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTWVzc2FnZUV4Y2VwdGlvbiBleHRlbmRzIFdyYXBwZWRFeGNlcHRpb24gewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRXhjZXB0aW9uIERVTU1ZX0VYQ0VQVElPTiA9IG5ldyBFeGNlcHRpb24oKTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDM5MDQ2ODI2NTY2ODMwMTM0MzNMOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gbWVzc2FnZQotCSAqICAgICAgICAgICAgYW4gZXJyb3IgbWVzc2FnZQotCSAqLwotCXB1YmxpYyBNZXNzYWdlRXhjZXB0aW9uKFN0cmluZyBtc2cpIHsKLQkJc3VwZXIobXNnLCBEVU1NWV9FWENFUFRJT04pOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICogCi0JICogQHBhcmFtIG1lc3NhZ2UKLQkgKiAgICAgICAgICAgIGFuIGVycm9yIG1lc3NhZ2UKLQkgKiBAcGFyYW0gZXhjZXB0aW9uCi0JICogICAgICAgICAgICBhbiBleGNlcHRpb24gb2JqZWN0Ci0JICovCi0JcHVibGljIE1lc3NhZ2VFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLQkJc3VwZXIobWVzc2FnZSwgZXhjZXB0aW9uKTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3V0aWwvUmVzb3VyY2VzLnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3V0aWwvUmVzb3VyY2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3MjYxYTEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS91dGlsL1Jlc291cmNlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLQotY29weXJpZ2h0PUlCTSBDb3Jwb3JhdGlvbgotZXJyX2Nhbm5vdE1vZGlmeTA9Q2Fubm90IG1vZGlmeSAnJ3swfScnCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3V0aWwvVW1hQWRhcHRlckZhY3RvcnkuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvdXRpbC9VbWFBZGFwdGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNWQxYmZjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvdXRpbC9VbWFBZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjM3NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQXBwbGljYWJsZU1ldGFDbGFzc0luZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BcnRpZmFjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFydGlmYWN0RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ2FwYWJpbGl0eVBhdHRlcm47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DaGVja2xpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DbGFzc2lmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29tcG9zaXRlUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbmNlcHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db25zdHJhaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudENhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvcmVTZW1hbnRpY01vZGVsQnJpZGdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ3VzdG9tQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJhYmxlRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyeVByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaWJhYmxlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmlwdG9yRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpbWVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpc2NpcGxpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaXNjaXBsaW5lR3JvdXBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Eb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRWxsaXBzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkVzdGltYXRpb25Db25zaWRlcmF0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkV4YW1wbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5GdWxmaWxsYWJsZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaENvbm5lY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoRWRnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoaWNQcmltaXRpdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HdWlkYW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkd1aWRhbmNlRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HdWlkZWxpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkl0ZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLktpbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5MZWFmRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudFByb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWlsZXN0b25lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTmFtZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuT3V0Y29tZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlBhY2thZ2VhYmxlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlBoYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUGxhbm5pbmdEYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qb2x5bGluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByYWN0aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJhY3RpY2VEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NGYW1pbHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NQbGFubmluZ1RlbXBsYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvcGVydHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5SZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5SZXBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5SZXVzYWJsZUFzc2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9hZG1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlU2V0R3JvdXBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5TZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuU2VtYW50aWNNb2RlbEJyaWRnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlNpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuU3RlcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlN1cHBvcnRpbmdNYXRlcmlhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRlYW1Qcm9maWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGVtcGxhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZXJtRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRleHRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVG9vbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRvb2xNZW50b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVU1BU2VtYW50aWNNb2RlbEJyaWRnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5XaGl0ZXBhcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya0JyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtPcmRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLio7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIFRoZSA8Yj5BZGFwdGVyIEZhY3Rvcnk8L2I+IGZvciB0aGUgbW9kZWwuCi0gKiBJdCBwcm92aWRlcyBhbiBhZGFwdGVyIDxjb2RlPmNyZWF0ZVhYWDwvY29kZT4gbWV0aG9kIGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbC4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFVtYUFkYXB0ZXJGYWN0b3J5IGV4dGVuZHMgQWRhcHRlckZhY3RvcnlJbXBsIHsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgbW9kZWwgcGFja2FnZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIFVtYVBhY2thZ2UgbW9kZWxQYWNrYWdlOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgYWRhcHRlciBmYWN0b3J5LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBVbWFBZGFwdGVyRmFjdG9yeSgpIHsKLQkJaWYgKG1vZGVsUGFja2FnZSA9PSBudWxsKSB7Ci0JCQltb2RlbFBhY2thZ2UgPSBVbWFQYWNrYWdlLmVJTlNUQU5DRTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGlzIGZhY3RvcnkgaXMgYXBwbGljYWJsZSBmb3IgdGhlIHR5cGUgb2YgdGhlIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgb2JqZWN0IGlzIGVpdGhlciB0aGUgbW9kZWwncyBwYWNrYWdlIG9yIGlzIGFuIGluc3RhbmNlIG9iamVjdCBvZiB0aGUgbW9kZWwuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoaXMgZmFjdG9yeSBpcyBhcHBsaWNhYmxlIGZvciB0aGUgdHlwZSBvZiB0aGUgb2JqZWN0LgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBpc0ZhY3RvcnlGb3JUeXBlKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKG9iamVjdCA9PSBtb2RlbFBhY2thZ2UpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBFT2JqZWN0KSB7Ci0JCQlyZXR1cm4gKChFT2JqZWN0KSBvYmplY3QpLmVDbGFzcygpLmdldEVQYWNrYWdlKCkgPT0gbW9kZWxQYWNrYWdlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgc3dpdGNoIHRoZSBkZWxlZ2F0ZXMgdG8gdGhlIDxjb2RlPmNyZWF0ZVhYWDwvY29kZT4gbWV0aG9kcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgVW1hU3dpdGNoPEFkYXB0ZXI+IG1vZGVsU3dpdGNoID0gbmV3IFVtYVN3aXRjaDxBZGFwdGVyPigpIHsKLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBBZGFwdGVyIGNhc2VDbGFzc2lmaWVyKENsYXNzaWZpZXIgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlQ2xhc3NpZmllckFkYXB0ZXIoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgQWRhcHRlciBjYXNlVHlwZShUeXBlIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZVR5cGVBZGFwdGVyKCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIEFkYXB0ZXIgY2FzZVBhY2thZ2VhYmxlRWxlbWVudChQYWNrYWdlYWJsZUVsZW1lbnQgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlUGFja2FnZWFibGVFbGVtZW50QWRhcHRlcigpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBBZGFwdGVyIGNhc2VOYW1lZEVsZW1lbnQoTmFtZWRFbGVtZW50IG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZU5hbWVkRWxlbWVudEFkYXB0ZXIoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgQWRhcHRlciBjYXNlRWxlbWVudChFbGVtZW50IG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZUVsZW1lbnRBZGFwdGVyKCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIEFkYXB0ZXIgY2FzZVBhY2thZ2Uob3JnLmVjbGlwc2UuZXBmLnVtYS5QYWNrYWdlIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZVBhY2thZ2VBZGFwdGVyKCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIEFkYXB0ZXIgY2FzZU5hbWVzcGFjZShOYW1lc3BhY2Ugb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlTmFtZXNwYWNlQWRhcHRlcigpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBBZGFwdGVyIGNhc2VDb25zdHJhaW50KENvbnN0cmFpbnQgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlQ29uc3RyYWludEFkYXB0ZXIoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgQWRhcHRlciBjYXNlTWV0aG9kRWxlbWVudChNZXRob2RFbGVtZW50IG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZU1ldGhvZEVsZW1lbnRBZGFwdGVyKCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIEFkYXB0ZXIgY2FzZU1ldGhvZEVsZW1lbnRQcm9wZXJ0eShNZXRob2RFbGVtZW50UHJvcGVydHkgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlTWV0aG9kRWxlbWVudFByb3BlcnR5QWRhcHRlcigpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBBZGFwdGVyIGNhc2VLaW5kKEtpbmQgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlS2luZEFkYXB0ZXIoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgQWRhcHRlciBjYXNlQ29udGVudEVsZW1lbnQoQ29udGVudEVsZW1lbnQgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlQ29udGVudEVsZW1lbnRBZGFwdGVyKCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIEFkYXB0ZXIgY2FzZURlc2NyaWJhYmxlRWxlbWVudChEZXNjcmliYWJsZUVsZW1lbnQgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlRGVzY3JpYmFibGVFbGVtZW50QWRhcHRlcigpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBBZGFwdGVyIGNhc2VDb250ZW50RGVzY3JpcHRpb24oQ29udGVudERlc2NyaXB0aW9uIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZUNvbnRlbnREZXNjcmlwdGlvbkFkYXB0ZXIoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgQWRhcHRlciBjYXNlTWV0aG9kVW5pdChNZXRob2RVbml0IG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZU1ldGhvZFVuaXRBZGFwdGVyKCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIEFkYXB0ZXIgY2FzZVN1cHBvcnRpbmdNYXRlcmlhbChTdXBwb3J0aW5nTWF0ZXJpYWwgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlU3VwcG9ydGluZ01hdGVyaWFsQWRhcHRlcigpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBBZGFwdGVyIGNhc2VHdWlkYW5jZShHdWlkYW5jZSBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVHdWlkYW5jZUFkYXB0ZXIoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgQWRhcHRlciBjYXNlU2VjdGlvbihTZWN0aW9uIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZVNlY3Rpb25BZGFwdGVyKCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIEFkYXB0ZXIgY2FzZVZhcmlhYmlsaXR5RWxlbWVudChWYXJpYWJpbGl0eUVsZW1lbnQgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlVmFyaWFiaWxpdHlFbGVtZW50QWRhcHRlcigpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBBZGFwdGVyIGNhc2VDb25jZXB0KENvbmNlcHQgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlQ29uY2VwdEFkYXB0ZXIoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgQWRhcHRlciBjYXNlQ2hlY2tsaXN0KENoZWNrbGlzdCBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVDaGVja2xpc3RBZGFwdGVyKCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIEFkYXB0ZXIgY2FzZUd1aWRlbGluZShHdWlkZWxpbmUgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlR3VpZGVsaW5lQWRhcHRlcigpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBBZGFwdGVyIGNhc2VFeGFtcGxlKEV4YW1wbGUgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlRXhhbXBsZUFkYXB0ZXIoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgQWRhcHRlciBjYXNlUmV1c2FibGVBc3NldChSZXVzYWJsZUFzc2V0IG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZVJldXNhYmxlQXNzZXRBZGFwdGVyKCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIEFkYXB0ZXIgY2FzZVRlcm1EZWZpbml0aW9uKFRlcm1EZWZpbml0aW9uIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZVRlcm1EZWZpbml0aW9uQWRhcHRlcigpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBBZGFwdGVyIGNhc2VBcHBsaWNhYmxlTWV0YUNsYXNzSW5mbygKLQkJCQlBcHBsaWNhYmxlTWV0YUNsYXNzSW5mbyBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVBcHBsaWNhYmxlTWV0YUNsYXNzSW5mb0FkYXB0ZXIoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgQWRhcHRlciBjYXNlQXJ0aWZhY3QoQXJ0aWZhY3Qgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlQXJ0aWZhY3RBZGFwdGVyKCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIEFkYXB0ZXIgY2FzZVdvcmtQcm9kdWN0KFdvcmtQcm9kdWN0IG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZVdvcmtQcm9kdWN0QWRhcHRlcigpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBBZGFwdGVyIGNhc2VGdWxmaWxsYWJsZUVsZW1lbnQoRnVsZmlsbGFibGVFbGVtZW50IG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZUZ1bGZpbGxhYmxlRWxlbWVudEFkYXB0ZXIoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgQWRhcHRlciBjYXNlUmVwb3J0KFJlcG9ydCBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVSZXBvcnRBZGFwdGVyKCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIEFkYXB0ZXIgY2FzZVRlbXBsYXRlKFRlbXBsYXRlIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZVRlbXBsYXRlQWRhcHRlcigpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBBZGFwdGVyIGNhc2VUb29sTWVudG9yKFRvb2xNZW50b3Igb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlVG9vbE1lbnRvckFkYXB0ZXIoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgQWRhcHRlciBjYXNlRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKAotCQkJCUVzdGltYXRpb25Db25zaWRlcmF0aW9ucyBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnNBZGFwdGVyKCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIEFkYXB0ZXIgY2FzZURlbGl2ZXJhYmxlKERlbGl2ZXJhYmxlIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZURlbGl2ZXJhYmxlQWRhcHRlcigpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBBZGFwdGVyIGNhc2VPdXRjb21lKE91dGNvbWUgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlT3V0Y29tZUFkYXB0ZXIoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgQWRhcHRlciBjYXNlU3RlcChTdGVwIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZVN0ZXBBZGFwdGVyKCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIEFkYXB0ZXIgY2FzZVdvcmtEZWZpbml0aW9uKFdvcmtEZWZpbml0aW9uIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZVdvcmtEZWZpbml0aW9uQWRhcHRlcigpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBBZGFwdGVyIGNhc2VXaGl0ZXBhcGVyKFdoaXRlcGFwZXIgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlV2hpdGVwYXBlckFkYXB0ZXIoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgQWRhcHRlciBjYXNlVGFzayhUYXNrIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZVRhc2tBZGFwdGVyKCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIEFkYXB0ZXIgY2FzZVJvbGUoUm9sZSBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVSb2xlQWRhcHRlcigpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBBZGFwdGVyIGNhc2VBcnRpZmFjdERlc2NyaXB0aW9uKEFydGlmYWN0RGVzY3JpcHRpb24gb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlQXJ0aWZhY3REZXNjcmlwdGlvbkFkYXB0ZXIoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgQWRhcHRlciBjYXNlV29ya1Byb2R1Y3REZXNjcmlwdGlvbihXb3JrUHJvZHVjdERlc2NyaXB0aW9uIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZVdvcmtQcm9kdWN0RGVzY3JpcHRpb25BZGFwdGVyKCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIEFkYXB0ZXIgY2FzZURlbGl2ZXJhYmxlRGVzY3JpcHRpb24oRGVsaXZlcmFibGVEZXNjcmlwdGlvbiBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVEZWxpdmVyYWJsZURlc2NyaXB0aW9uQWRhcHRlcigpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBBZGFwdGVyIGNhc2VSb2xlRGVzY3JpcHRpb24oUm9sZURlc2NyaXB0aW9uIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZVJvbGVEZXNjcmlwdGlvbkFkYXB0ZXIoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgQWRhcHRlciBjYXNlVGFza0Rlc2NyaXB0aW9uKFRhc2tEZXNjcmlwdGlvbiBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVUYXNrRGVzY3JpcHRpb25BZGFwdGVyKCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIEFkYXB0ZXIgY2FzZUd1aWRhbmNlRGVzY3JpcHRpb24oR3VpZGFuY2VEZXNjcmlwdGlvbiBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVHdWlkYW5jZURlc2NyaXB0aW9uQWRhcHRlcigpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBBZGFwdGVyIGNhc2VQcmFjdGljZURlc2NyaXB0aW9uKFByYWN0aWNlRGVzY3JpcHRpb24gb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlUHJhY3RpY2VEZXNjcmlwdGlvbkFkYXB0ZXIoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgQWRhcHRlciBjYXNlUm9sZVNldChSb2xlU2V0IG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZVJvbGVTZXRBZGFwdGVyKCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIEFkYXB0ZXIgY2FzZUNvbnRlbnRDYXRlZ29yeShDb250ZW50Q2F0ZWdvcnkgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlQ29udGVudENhdGVnb3J5QWRhcHRlcigpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBBZGFwdGVyIGNhc2VEb21haW4oRG9tYWluIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZURvbWFpbkFkYXB0ZXIoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgQWRhcHRlciBjYXNlV29ya1Byb2R1Y3RUeXBlKFdvcmtQcm9kdWN0VHlwZSBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVXb3JrUHJvZHVjdFR5cGVBZGFwdGVyKCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIEFkYXB0ZXIgY2FzZURpc2NpcGxpbmVHcm91cGluZyhEaXNjaXBsaW5lR3JvdXBpbmcgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlRGlzY2lwbGluZUdyb3VwaW5nQWRhcHRlcigpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBBZGFwdGVyIGNhc2VEaXNjaXBsaW5lKERpc2NpcGxpbmUgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlRGlzY2lwbGluZUFkYXB0ZXIoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgQWRhcHRlciBjYXNlQWN0aXZpdHkoQWN0aXZpdHkgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlQWN0aXZpdHlBZGFwdGVyKCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIEFkYXB0ZXIgY2FzZVdvcmtCcmVha2Rvd25FbGVtZW50KFdvcmtCcmVha2Rvd25FbGVtZW50IG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZVdvcmtCcmVha2Rvd25FbGVtZW50QWRhcHRlcigpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBBZGFwdGVyIGNhc2VCcmVha2Rvd25FbGVtZW50KEJyZWFrZG93bkVsZW1lbnQgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlQnJlYWtkb3duRWxlbWVudEFkYXB0ZXIoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgQWRhcHRlciBjYXNlUHJvY2Vzc0VsZW1lbnQoUHJvY2Vzc0VsZW1lbnQgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlUHJvY2Vzc0VsZW1lbnRBZGFwdGVyKCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIEFkYXB0ZXIgY2FzZVBsYW5uaW5nRGF0YShQbGFubmluZ0RhdGEgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlUGxhbm5pbmdEYXRhQWRhcHRlcigpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBBZGFwdGVyIGNhc2VXb3JrT3JkZXIoV29ya09yZGVyIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZVdvcmtPcmRlckFkYXB0ZXIoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgQWRhcHRlciBjYXNlUm9hZG1hcChSb2FkbWFwIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZVJvYWRtYXBBZGFwdGVyKCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIEFkYXB0ZXIgY2FzZVRvb2woVG9vbCBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVUb29sQWRhcHRlcigpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBBZGFwdGVyIGNhc2VSb2xlU2V0R3JvdXBpbmcoUm9sZVNldEdyb3VwaW5nIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZVJvbGVTZXRHcm91cGluZ0FkYXB0ZXIoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgQWRhcHRlciBjYXNlQ3VzdG9tQ2F0ZWdvcnkoQ3VzdG9tQ2F0ZWdvcnkgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlQ3VzdG9tQ2F0ZWdvcnlBZGFwdGVyKCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIEFkYXB0ZXIgY2FzZU1ldGhvZFBhY2thZ2UoTWV0aG9kUGFja2FnZSBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVNZXRob2RQYWNrYWdlQWRhcHRlcigpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBBZGFwdGVyIGNhc2VDb250ZW50UGFja2FnZShDb250ZW50UGFja2FnZSBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVDb250ZW50UGFja2FnZUFkYXB0ZXIoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgQWRhcHRlciBjYXNlTWlsZXN0b25lKE1pbGVzdG9uZSBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVNaWxlc3RvbmVBZGFwdGVyKCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIEFkYXB0ZXIgY2FzZVdvcmtQcm9kdWN0RGVzY3JpcHRvcihXb3JrUHJvZHVjdERlc2NyaXB0b3Igb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlV29ya1Byb2R1Y3REZXNjcmlwdG9yQWRhcHRlcigpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBBZGFwdGVyIGNhc2VEZXNjcmlwdG9yKERlc2NyaXB0b3Igb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlRGVzY3JpcHRvckFkYXB0ZXIoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgQWRhcHRlciBjYXNlSXRlcmF0aW9uKEl0ZXJhdGlvbiBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVJdGVyYXRpb25BZGFwdGVyKCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIEFkYXB0ZXIgY2FzZVBoYXNlKFBoYXNlIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZVBoYXNlQWRhcHRlcigpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBBZGFwdGVyIGNhc2VUZWFtUHJvZmlsZShUZWFtUHJvZmlsZSBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVUZWFtUHJvZmlsZUFkYXB0ZXIoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgQWRhcHRlciBjYXNlUm9sZURlc2NyaXB0b3IoUm9sZURlc2NyaXB0b3Igb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlUm9sZURlc2NyaXB0b3JBZGFwdGVyKCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIEFkYXB0ZXIgY2FzZVRhc2tEZXNjcmlwdG9yKFRhc2tEZXNjcmlwdG9yIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZVRhc2tEZXNjcmlwdG9yQWRhcHRlcigpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBBZGFwdGVyIGNhc2VDb21wb3NpdGVSb2xlKENvbXBvc2l0ZVJvbGUgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlQ29tcG9zaXRlUm9sZUFkYXB0ZXIoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgQWRhcHRlciBjYXNlRGVsaXZlcnlQcm9jZXNzKERlbGl2ZXJ5UHJvY2VzcyBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVEZWxpdmVyeVByb2Nlc3NBZGFwdGVyKCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIEFkYXB0ZXIgY2FzZVByb2Nlc3Mob3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZVByb2Nlc3NBZGFwdGVyKCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIEFkYXB0ZXIgY2FzZUNhcGFiaWxpdHlQYXR0ZXJuKENhcGFiaWxpdHlQYXR0ZXJuIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZUNhcGFiaWxpdHlQYXR0ZXJuQWRhcHRlcigpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBBZGFwdGVyIGNhc2VNZXRob2RDb25maWd1cmF0aW9uKE1ldGhvZENvbmZpZ3VyYXRpb24gb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlTWV0aG9kQ29uZmlndXJhdGlvbkFkYXB0ZXIoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgQWRhcHRlciBjYXNlTWV0aG9kUGx1Z2luKE1ldGhvZFBsdWdpbiBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVNZXRob2RQbHVnaW5BZGFwdGVyKCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIEFkYXB0ZXIgY2FzZVByb2Nlc3NQbGFubmluZ1RlbXBsYXRlKAotCQkJCVByb2Nlc3NQbGFubmluZ1RlbXBsYXRlIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZVByb2Nlc3NQbGFubmluZ1RlbXBsYXRlQWRhcHRlcigpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBBZGFwdGVyIGNhc2VQcmFjdGljZShQcmFjdGljZSBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVQcmFjdGljZUFkYXB0ZXIoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgQWRhcHRlciBjYXNlQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uKAotCQkJCUJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbiBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb25BZGFwdGVyKCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIEFkYXB0ZXIgY2FzZUFjdGl2aXR5RGVzY3JpcHRpb24oQWN0aXZpdHlEZXNjcmlwdGlvbiBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVBY3Rpdml0eURlc2NyaXB0aW9uQWRhcHRlcigpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBBZGFwdGVyIGNhc2VEZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbigKLQkJCQlEZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbiBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVEZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbkFkYXB0ZXIoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgQWRhcHRlciBjYXNlUHJvY2Vzc0Rlc2NyaXB0aW9uKFByb2Nlc3NEZXNjcmlwdGlvbiBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVQcm9jZXNzRGVzY3JpcHRpb25BZGFwdGVyKCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIEFkYXB0ZXIgY2FzZURlc2NyaXB0b3JEZXNjcmlwdGlvbihEZXNjcmlwdG9yRGVzY3JpcHRpb24gb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlRGVzY3JpcHRvckRlc2NyaXB0aW9uQWRhcHRlcigpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBBZGFwdGVyIGNhc2VQcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvcigKLQkJCQlQcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvciBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVQcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvckFkYXB0ZXIoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgQWRhcHRlciBjYXNlUHJvY2Vzc0NvbXBvbmVudChQcm9jZXNzQ29tcG9uZW50IG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZVByb2Nlc3NDb21wb25lbnRBZGFwdGVyKCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIEFkYXB0ZXIgY2FzZVByb2Nlc3NQYWNrYWdlKFByb2Nlc3NQYWNrYWdlIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZVByb2Nlc3NQYWNrYWdlQWRhcHRlcigpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBBZGFwdGVyIGNhc2VEaWFncmFtKERpYWdyYW0gb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlRGlhZ3JhbUFkYXB0ZXIoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgQWRhcHRlciBjYXNlR3JhcGhOb2RlKEdyYXBoTm9kZSBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVHcmFwaE5vZGVBZGFwdGVyKCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIEFkYXB0ZXIgY2FzZUdyYXBoRWxlbWVudChHcmFwaEVsZW1lbnQgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlR3JhcGhFbGVtZW50QWRhcHRlcigpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBBZGFwdGVyIGNhc2VEaWFncmFtRWxlbWVudChEaWFncmFtRWxlbWVudCBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVEaWFncmFtRWxlbWVudEFkYXB0ZXIoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgQWRhcHRlciBjYXNlUmVmZXJlbmNlKFJlZmVyZW5jZSBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVSZWZlcmVuY2VBZGFwdGVyKCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIEFkYXB0ZXIgY2FzZVByb3BlcnR5KFByb3BlcnR5IG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZVByb3BlcnR5QWRhcHRlcigpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBBZGFwdGVyIGNhc2VQb2ludChQb2ludCBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVQb2ludEFkYXB0ZXIoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgQWRhcHRlciBjYXNlRGlhZ3JhbUxpbmsoRGlhZ3JhbUxpbmsgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlRGlhZ3JhbUxpbmtBZGFwdGVyKCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIEFkYXB0ZXIgY2FzZUdyYXBoQ29ubmVjdG9yKEdyYXBoQ29ubmVjdG9yIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZUdyYXBoQ29ubmVjdG9yQWRhcHRlcigpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBBZGFwdGVyIGNhc2VHcmFwaEVkZ2UoR3JhcGhFZGdlIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZUdyYXBoRWRnZUFkYXB0ZXIoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgQWRhcHRlciBjYXNlU2VtYW50aWNNb2RlbEJyaWRnZShTZW1hbnRpY01vZGVsQnJpZGdlIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZVNlbWFudGljTW9kZWxCcmlkZ2VBZGFwdGVyKCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIEFkYXB0ZXIgY2FzZURpbWVuc2lvbihEaW1lbnNpb24gb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlRGltZW5zaW9uQWRhcHRlcigpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBBZGFwdGVyIGNhc2VQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlKAotCQkJCVByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2Ugb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZUFkYXB0ZXIoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgQWRhcHRlciBjYXNlU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnQoCi0JCQkJU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnQgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnRBZGFwdGVyKCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIEFkYXB0ZXIgY2FzZVVNQVNlbWFudGljTW9kZWxCcmlkZ2UoVU1BU2VtYW50aWNNb2RlbEJyaWRnZSBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVVTUFTZW1hbnRpY01vZGVsQnJpZGdlQWRhcHRlcigpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBBZGFwdGVyIGNhc2VDb3JlU2VtYW50aWNNb2RlbEJyaWRnZSgKLQkJCQlDb3JlU2VtYW50aWNNb2RlbEJyaWRnZSBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVDb3JlU2VtYW50aWNNb2RlbEJyaWRnZUFkYXB0ZXIoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgQWRhcHRlciBjYXNlTGVhZkVsZW1lbnQoTGVhZkVsZW1lbnQgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlTGVhZkVsZW1lbnRBZGFwdGVyKCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIEFkYXB0ZXIgY2FzZVRleHRFbGVtZW50KFRleHRFbGVtZW50IG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZVRleHRFbGVtZW50QWRhcHRlcigpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBBZGFwdGVyIGNhc2VJbWFnZShJbWFnZSBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVJbWFnZUFkYXB0ZXIoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgQWRhcHRlciBjYXNlR3JhcGhpY1ByaW1pdGl2ZShHcmFwaGljUHJpbWl0aXZlIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZUdyYXBoaWNQcmltaXRpdmVBZGFwdGVyKCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIEFkYXB0ZXIgY2FzZVBvbHlsaW5lKFBvbHlsaW5lIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZVBvbHlsaW5lQWRhcHRlcigpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBBZGFwdGVyIGNhc2VFbGxpcHNlKEVsbGlwc2Ugb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlRWxsaXBzZUFkYXB0ZXIoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgQWRhcHRlciBjYXNlUHJvY2Vzc0ZhbWlseShQcm9jZXNzRmFtaWx5IG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZVByb2Nlc3NGYW1pbHlBZGFwdGVyKCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIEFkYXB0ZXIgY2FzZU1ldGhvZExpYnJhcnkoTWV0aG9kTGlicmFyeSBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVNZXRob2RMaWJyYXJ5QWRhcHRlcigpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBBZGFwdGVyIGRlZmF1bHRDYXNlKEVPYmplY3Qgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlRU9iamVjdEFkYXB0ZXIoKTsKLQkJfQotCX07Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIHRoZSA8Y29kZT50YXJnZXQ8L2NvZGU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHRhcmdldCB0aGUgb2JqZWN0IHRvIGFkYXB0LgotCSAqIEByZXR1cm4gdGhlIGFkYXB0ZXIgZm9yIHRoZSA8Y29kZT50YXJnZXQ8L2NvZGU+LgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVBZGFwdGVyKE5vdGlmaWVyIHRhcmdldCkgewotCQlyZXR1cm4gbW9kZWxTd2l0Y2guZG9Td2l0Y2goKEVPYmplY3QpIHRhcmdldCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkNsYXNzaWZpZXIgPGVtPkNsYXNzaWZpZXI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5DbGFzc2lmaWVyCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUNsYXNzaWZpZXJBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVHlwZSA8ZW0+VHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlR5cGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlVHlwZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5FbGVtZW50IDxlbT5FbGVtZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuRWxlbWVudAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVFbGVtZW50QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk5hbWVkRWxlbWVudCA8ZW0+TmFtZWQgRWxlbWVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLk5hbWVkRWxlbWVudAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVOYW1lZEVsZW1lbnRBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUGFja2FnZWFibGVFbGVtZW50IDxlbT5QYWNrYWdlYWJsZSBFbGVtZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuUGFja2FnZWFibGVFbGVtZW50Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVBhY2thZ2VhYmxlRWxlbWVudEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5QYWNrYWdlIDxlbT5QYWNrYWdlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuUGFja2FnZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVQYWNrYWdlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk5hbWVzcGFjZSA8ZW0+TmFtZXNwYWNlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuTmFtZXNwYWNlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZU5hbWVzcGFjZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50IDxlbT5NZXRob2QgRWxlbWVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlTWV0aG9kRWxlbWVudEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db25zdHJhaW50IDxlbT5Db25zdHJhaW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuQ29uc3RyYWludAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVDb25zdHJhaW50QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnRQcm9wZXJ0eSA8ZW0+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50UHJvcGVydHkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlTWV0aG9kRWxlbWVudFByb3BlcnR5QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLktpbmQgPGVtPktpbmQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5LaW5kCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUtpbmRBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudEVsZW1lbnQgPGVtPkNvbnRlbnQgRWxlbWVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRFbGVtZW50Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUNvbnRlbnRFbGVtZW50QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaWJhYmxlRWxlbWVudCA8ZW0+RGVzY3JpYmFibGUgRWxlbWVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaWJhYmxlRWxlbWVudAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVEZXNjcmliYWJsZUVsZW1lbnRBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudERlc2NyaXB0aW9uIDxlbT5Db250ZW50IERlc2NyaXB0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudERlc2NyaXB0aW9uCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUNvbnRlbnREZXNjcmlwdGlvbkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5TZWN0aW9uIDxlbT5TZWN0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuU2VjdGlvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVTZWN0aW9uQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGUgPGVtPlJvbGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVJvbGVBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3QgPGVtPldvcmsgUHJvZHVjdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVdvcmtQcm9kdWN0QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkZ1bGZpbGxhYmxlRWxlbWVudCA8ZW0+RnVsZmlsbGFibGUgRWxlbWVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkZ1bGZpbGxhYmxlRWxlbWVudAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVGdWxmaWxsYWJsZUVsZW1lbnRBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVGFzayA8ZW0+VGFzazwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2sKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlVGFza0FkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrRGVmaW5pdGlvbiA8ZW0+V29yayBEZWZpbml0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya0RlZmluaXRpb24KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlV29ya0RlZmluaXRpb25BZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuU3RlcCA8ZW0+U3RlcDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlN0ZXAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlU3RlcEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5HdWlkYW5jZSA8ZW0+R3VpZGFuY2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5HdWlkYW5jZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVHdWlkYW5jZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5BcnRpZmFjdCA8ZW0+QXJ0aWZhY3Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5BcnRpZmFjdAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVBcnRpZmFjdEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyYWJsZSA8ZW0+RGVsaXZlcmFibGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyYWJsZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVEZWxpdmVyYWJsZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5PdXRjb21lIDxlbT5PdXRjb21lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuT3V0Y29tZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVPdXRjb21lQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBhY2thZ2UgPGVtPk1ldGhvZCBQYWNrYWdlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGFja2FnZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVNZXRob2RQYWNrYWdlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRQYWNrYWdlIDxlbT5Db250ZW50IFBhY2thZ2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50UGFja2FnZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVDb250ZW50UGFja2FnZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5BcnRpZmFjdERlc2NyaXB0aW9uIDxlbT5BcnRpZmFjdCBEZXNjcmlwdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkFydGlmYWN0RGVzY3JpcHRpb24KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQXJ0aWZhY3REZXNjcmlwdGlvbkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0aW9uIDxlbT5Xb3JrIFByb2R1Y3QgRGVzY3JpcHRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0aW9uCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVdvcmtQcm9kdWN0RGVzY3JpcHRpb25BZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcmFibGVEZXNjcmlwdGlvbiA8ZW0+RGVsaXZlcmFibGUgRGVzY3JpcHRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyYWJsZURlc2NyaXB0aW9uCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZURlbGl2ZXJhYmxlRGVzY3JpcHRpb25BZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZURlc2NyaXB0aW9uIDxlbT5Sb2xlIERlc2NyaXB0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZURlc2NyaXB0aW9uCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVJvbGVEZXNjcmlwdGlvbkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRpb24gPGVtPlRhc2sgRGVzY3JpcHRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRpb24KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlVGFza0Rlc2NyaXB0aW9uQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkd1aWRhbmNlRGVzY3JpcHRpb24gPGVtPkd1aWRhbmNlIERlc2NyaXB0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuR3VpZGFuY2VEZXNjcmlwdGlvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVHdWlkYW5jZURlc2NyaXB0aW9uQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlByYWN0aWNlRGVzY3JpcHRpb24gPGVtPlByYWN0aWNlIERlc2NyaXB0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJhY3RpY2VEZXNjcmlwdGlvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVQcmFjdGljZURlc2NyaXB0aW9uQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5IDxlbT5BY3Rpdml0eTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUFjdGl2aXR5QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtCcmVha2Rvd25FbGVtZW50IDxlbT5Xb3JrIEJyZWFrZG93biBFbGVtZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya0JyZWFrZG93bkVsZW1lbnQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlV29ya0JyZWFrZG93bkVsZW1lbnRBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudCA8ZW0+QnJlYWtkb3duIEVsZW1lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUJyZWFrZG93bkVsZW1lbnRBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWlsZXN0b25lIDxlbT5NaWxlc3RvbmU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5NaWxlc3RvbmUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlTWlsZXN0b25lQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkl0ZXJhdGlvbiA8ZW0+SXRlcmF0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuSXRlcmF0aW9uCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUl0ZXJhdGlvbkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5QaGFzZSA8ZW0+UGhhc2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5QaGFzZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVQaGFzZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZWFtUHJvZmlsZSA8ZW0+VGVhbSBQcm9maWxlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVGVhbVByb2ZpbGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlVGVhbVByb2ZpbGVBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZURlc2NyaXB0b3IgPGVtPlJvbGUgRGVzY3JpcHRvcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdG9yCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVJvbGVEZXNjcmlwdG9yQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtPcmRlciA8ZW0+V29yayBPcmRlcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtPcmRlcgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVXb3JrT3JkZXJBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0VsZW1lbnQgPGVtPlByb2Nlc3MgRWxlbWVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NFbGVtZW50Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVByb2Nlc3NFbGVtZW50QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlBsYW5uaW5nRGF0YSA8ZW0+UGxhbm5pbmcgRGF0YTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlBsYW5uaW5nRGF0YQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVQbGFubmluZ0RhdGFBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpcHRvciA8ZW0+RGVzY3JpcHRvcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaXB0b3IKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRGVzY3JpcHRvckFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRvciA8ZW0+VGFzayBEZXNjcmlwdG9yPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0b3IKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlVGFza0Rlc2NyaXB0b3JBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yIDxlbT5Xb3JrIFByb2R1Y3QgRGVzY3JpcHRvcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvcgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVXb3JrUHJvZHVjdERlc2NyaXB0b3JBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQ29tcG9zaXRlUm9sZSA8ZW0+Q29tcG9zaXRlIFJvbGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db21wb3NpdGVSb2xlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUNvbXBvc2l0ZVJvbGVBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uIDxlbT5CcmVha2Rvd24gRWxlbWVudCBEZXNjcmlwdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb25BZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHlEZXNjcmlwdGlvbiA8ZW0+QWN0aXZpdHkgRGVzY3JpcHRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eURlc2NyaXB0aW9uCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUFjdGl2aXR5RGVzY3JpcHRpb25BZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24gPGVtPkRlbGl2ZXJ5IFByb2Nlc3MgRGVzY3JpcHRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVEZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzRGVzY3JpcHRpb24gPGVtPlByb2Nlc3MgRGVzY3JpcHRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzRGVzY3JpcHRpb24KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUHJvY2Vzc0Rlc2NyaXB0aW9uQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaXB0b3JEZXNjcmlwdGlvbiA8ZW0+RGVzY3JpcHRvciBEZXNjcmlwdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaXB0b3JEZXNjcmlwdGlvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVEZXNjcmlwdG9yRGVzY3JpcHRpb25BZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQ29uY2VwdCA8ZW0+Q29uY2VwdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbmNlcHQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQ29uY2VwdEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5DaGVja2xpc3QgPGVtPkNoZWNrbGlzdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkNoZWNrbGlzdAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVDaGVja2xpc3RBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRXhhbXBsZSA8ZW0+RXhhbXBsZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkV4YW1wbGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRXhhbXBsZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5HdWlkZWxpbmUgPGVtPkd1aWRlbGluZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkd1aWRlbGluZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVHdWlkZWxpbmVBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIDxlbT5Fc3RpbWF0aW9uIENvbnNpZGVyYXRpb25zPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUVzdGltYXRpb25Db25zaWRlcmF0aW9uc0FkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5SZXBvcnQgPGVtPlJlcG9ydDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlJlcG9ydAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVSZXBvcnRBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVGVtcGxhdGUgPGVtPlRlbXBsYXRlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVGVtcGxhdGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlVGVtcGxhdGVBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuU3VwcG9ydGluZ01hdGVyaWFsIDxlbT5TdXBwb3J0aW5nIE1hdGVyaWFsPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuU3VwcG9ydGluZ01hdGVyaWFsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVN1cHBvcnRpbmdNYXRlcmlhbEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Ub29sTWVudG9yIDxlbT5Ub29sIE1lbnRvcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlRvb2xNZW50b3IKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlVG9vbE1lbnRvckFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5XaGl0ZXBhcGVyIDxlbT5XaGl0ZXBhcGVyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuV2hpdGVwYXBlcgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVXaGl0ZXBhcGVyQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlRlcm1EZWZpbml0aW9uIDxlbT5UZXJtIERlZmluaXRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZXJtRGVmaW5pdGlvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVUZXJtRGVmaW5pdGlvbkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5BcHBsaWNhYmxlTWV0YUNsYXNzSW5mbyA8ZW0+QXBwbGljYWJsZSBNZXRhIENsYXNzIEluZm88L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5BcHBsaWNhYmxlTWV0YUNsYXNzSW5mbwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVBcHBsaWNhYmxlTWV0YUNsYXNzSW5mb0FkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5QcmFjdGljZSA8ZW0+UHJhY3RpY2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5QcmFjdGljZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVQcmFjdGljZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5SZXVzYWJsZUFzc2V0IDxlbT5SZXVzYWJsZSBBc3NldDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlJldXNhYmxlQXNzZXQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUmV1c2FibGVBc3NldEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaXNjaXBsaW5lIDxlbT5EaXNjaXBsaW5lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlzY2lwbGluZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVEaXNjaXBsaW5lQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRDYXRlZ29yeSA8ZW0+Q29udGVudCBDYXRlZ29yeTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRDYXRlZ29yeQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVDb250ZW50Q2F0ZWdvcnlBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZVNldCA8ZW0+Um9sZSBTZXQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlU2V0Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVJvbGVTZXRBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRG9tYWluIDxlbT5Eb21haW48L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Eb21haW4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRG9tYWluQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0VHlwZSA8ZW0+V29yayBQcm9kdWN0IFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdFR5cGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlV29ya1Byb2R1Y3RUeXBlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRpc2NpcGxpbmVHcm91cGluZyA8ZW0+RGlzY2lwbGluZSBHcm91cGluZzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkRpc2NpcGxpbmVHcm91cGluZwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVEaXNjaXBsaW5lR3JvdXBpbmdBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVG9vbCA8ZW0+VG9vbDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlRvb2wKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlVG9vbEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlU2V0R3JvdXBpbmcgPGVtPlJvbGUgU2V0IEdyb3VwaW5nPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZVNldEdyb3VwaW5nCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVJvbGVTZXRHcm91cGluZ0FkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5DdXN0b21DYXRlZ29yeSA8ZW0+Q3VzdG9tIENhdGVnb3J5PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuQ3VzdG9tQ2F0ZWdvcnkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQ3VzdG9tQ2F0ZWdvcnlBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcnlQcm9jZXNzIDxlbT5EZWxpdmVyeSBQcm9jZXNzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcnlQcm9jZXNzCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZURlbGl2ZXJ5UHJvY2Vzc0FkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzIDxlbT5Qcm9jZXNzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzcwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVQcm9jZXNzQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkNhcGFiaWxpdHlQYXR0ZXJuIDxlbT5DYXBhYmlsaXR5IFBhdHRlcm48L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5DYXBhYmlsaXR5UGF0dGVybgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVDYXBhYmlsaXR5UGF0dGVybkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSA8ZW0+UHJvY2VzcyBQbGFubmluZyBUZW1wbGF0ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NQbGFubmluZ1RlbXBsYXRlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVByb2Nlc3NQbGFubmluZ1RlbXBsYXRlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlJvYWRtYXAgPGVtPlJvYWRtYXA8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2FkbWFwCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVJvYWRtYXBBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudCA8ZW0+UHJvY2VzcyBDb21wb25lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVByb2Nlc3NDb21wb25lbnRBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc1BhY2thZ2UgPGVtPlByb2Nlc3MgUGFja2FnZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NQYWNrYWdlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVByb2Nlc3NQYWNrYWdlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UgPGVtPlByb2Nlc3MgQ29tcG9uZW50IEludGVyZmFjZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvciA8ZW0+UHJvY2VzcyBDb21wb25lbnQgRGVzY3JpcHRvcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnREZXNjcmlwdG9yCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVByb2Nlc3NDb21wb25lbnREZXNjcmlwdG9yQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbiA8ZW0+TWV0aG9kIFBsdWdpbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVNZXRob2RQbHVnaW5BZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50IDxlbT5WYXJpYWJpbGl0eSBFbGVtZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVZhcmlhYmlsaXR5RWxlbWVudEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RVbml0IDxlbT5NZXRob2QgVW5pdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFVuaXQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlTWV0aG9kVW5pdEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uIDxlbT5NZXRob2QgQ29uZmlndXJhdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb24KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlTWV0aG9kQ29uZmlndXJhdGlvbkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzRmFtaWx5IDxlbT5Qcm9jZXNzIEZhbWlseTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NGYW1pbHkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUHJvY2Vzc0ZhbWlseUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5IDxlbT5NZXRob2QgTGlicmFyeTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlTWV0aG9kTGlicmFyeUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qb2ludCA8ZW0+UG9pbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qb2ludAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVQb2ludEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaEVsZW1lbnQgPGVtPkdyYXBoIEVsZW1lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaEVsZW1lbnQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlR3JhcGhFbGVtZW50QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW1FbGVtZW50IDxlbT5EaWFncmFtIEVsZW1lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtRWxlbWVudAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVEaWFncmFtRWxlbWVudEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtTGluayA8ZW0+RGlhZ3JhbSBMaW5rPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbUxpbmsKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRGlhZ3JhbUxpbmtBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhDb25uZWN0b3IgPGVtPkdyYXBoIENvbm5lY3RvcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoQ29ubmVjdG9yCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUdyYXBoQ29ubmVjdG9yQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlNlbWFudGljTW9kZWxCcmlkZ2UgPGVtPlNlbWFudGljIE1vZGVsIEJyaWRnZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlNlbWFudGljTW9kZWxCcmlkZ2UKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlU2VtYW50aWNNb2RlbEJyaWRnZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaW1lbnNpb24gPGVtPkRpbWVuc2lvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkRpbWVuc2lvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVEaW1lbnNpb25BZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUmVmZXJlbmNlIDxlbT5SZWZlcmVuY2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5SZWZlcmVuY2UKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUmVmZXJlbmNlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlByb3BlcnR5IDxlbT5Qcm9wZXJ0eTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlByb3BlcnR5Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVByb3BlcnR5QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoRWRnZSA8ZW0+R3JhcGggRWRnZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoRWRnZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVHcmFwaEVkZ2VBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbSA8ZW0+RGlhZ3JhbTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW0KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRGlhZ3JhbUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaE5vZGUgPGVtPkdyYXBoIE5vZGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaE5vZGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlR3JhcGhOb2RlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlNpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50IDxlbT5TaW1wbGUgU2VtYW50aWMgTW9kZWwgRWxlbWVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlNpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVNpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlVNQVNlbWFudGljTW9kZWxCcmlkZ2UgPGVtPlVNQSBTZW1hbnRpYyBNb2RlbCBCcmlkZ2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VTUFTZW1hbnRpY01vZGVsQnJpZGdlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVVNQVNlbWFudGljTW9kZWxCcmlkZ2VBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQ29yZVNlbWFudGljTW9kZWxCcmlkZ2UgPGVtPkNvcmUgU2VtYW50aWMgTW9kZWwgQnJpZGdlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuQ29yZVNlbWFudGljTW9kZWxCcmlkZ2UKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQ29yZVNlbWFudGljTW9kZWxCcmlkZ2VBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTGVhZkVsZW1lbnQgPGVtPkxlYWYgRWxlbWVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkxlYWZFbGVtZW50Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUxlYWZFbGVtZW50QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlRleHRFbGVtZW50IDxlbT5UZXh0IEVsZW1lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZXh0RWxlbWVudAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVUZXh0RWxlbWVudEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5JbWFnZSA8ZW0+SW1hZ2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5JbWFnZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVJbWFnZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaGljUHJpbWl0aXZlIDxlbT5HcmFwaGljIFByaW1pdGl2ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoaWNQcmltaXRpdmUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlR3JhcGhpY1ByaW1pdGl2ZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qb2x5bGluZSA8ZW0+UG9seWxpbmU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qb2x5bGluZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVQb2x5bGluZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5FbGxpcHNlIDxlbT5FbGxpcHNlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuRWxsaXBzZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVFbGxpcHNlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciB0aGUgZGVmYXVsdCBjYXNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRU9iamVjdEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotfSAvL1VtYUFkYXB0ZXJGYWN0b3J5ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS91dGlsL1VtYVJlc291cmNlcy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS91dGlsL1VtYVJlc291cmNlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YWZjODQ3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvdXRpbC9VbWFSZXNvdXJjZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLS8qKgotICogVGhlIFVNQSByZXNvdXJjZSBidW5kbGUuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgVW1hUmVzb3VyY2VzIGV4dGVuZHMgTkxTIHsKLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBCVU5ETEVfTkFNRSA9IFVtYVJlc291cmNlcy5jbGFzcy5nZXRQYWNrYWdlKCkKLQkJCS5nZXROYW1lKCkKLQkJCSsgIi5SZXNvdXJjZXMiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIFVtYVJlc291cmNlcygpIHsKLQkJLy8gRG8gbm90IGluc3RhbnRpYXRlCi0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29weXJpZ2h0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyX2Nhbm5vdE1vZGlmeTA7Ci0KLQlzdGF0aWMgewotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBVbWFSZXNvdXJjZXMuY2xhc3MpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3V0aWwvVW1hU3dpdGNoLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3V0aWwvVW1hU3dpdGNoLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzM2JmZTMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS91dGlsL1VtYVN3aXRjaC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQzOCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BcHBsaWNhYmxlTWV0YUNsYXNzSW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFydGlmYWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQXJ0aWZhY3REZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DYXBhYmlsaXR5UGF0dGVybjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNoZWNrbGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNsYXNzaWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db21wb3NpdGVSb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29uY2VwdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnN0cmFpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50Q2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29yZVNlbWFudGljTW9kZWxCcmlkZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DdXN0b21DYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcmFibGVEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJ5UHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpYmFibGVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaXB0b3JEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW1MaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGltZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGlzY2lwbGluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpc2NpcGxpbmVHcm91cGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5FbGxpcHNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRXhhbXBsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkZ1bGZpbGxhYmxlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoQ29ubmVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhFZGdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhpY1ByaW1pdGl2ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkd1aWRhbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3VpZGFuY2VEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkd1aWRlbGluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuSXRlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuS2luZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkxlYWZFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50UHJvcGVydHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NaWxlc3RvbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5OYW1lZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5OYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5PdXRjb21lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUGFja2FnZWFibGVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUGhhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5QbGFubmluZ0RhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlBvbHlsaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJhY3RpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5QcmFjdGljZURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnREZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0ZhbWlseTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJlcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJldXNhYmxlQXNzZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2FkbWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVTZXRHcm91cGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlNlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5TZW1hbnRpY01vZGVsQnJpZGdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5TdGVwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuU3VwcG9ydGluZ01hdGVyaWFsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFzazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGVhbVByb2ZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZW1wbGF0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRlcm1EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGV4dEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Ub29sOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVG9vbE1lbnRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VTUFTZW1hbnRpY01vZGVsQnJpZGdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldoaXRlcGFwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya09yZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3RUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuKjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogVGhlIDxiPlN3aXRjaDwvYj4gZm9yIHRoZSBtb2RlbCdzIGluaGVyaXRhbmNlIGhpZXJhcmNoeS4KLSAqIEl0IHN1cHBvcnRzIHRoZSBjYWxsIHtAbGluayAjZG9Td2l0Y2goRU9iamVjdCkgZG9Td2l0Y2gob2JqZWN0KX0KLSAqIHRvIGludm9rZSB0aGUgPGNvZGU+Y2FzZVhYWDwvY29kZT4gbWV0aG9kIGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbCwKLSAqIHN0YXJ0aW5nIHdpdGggdGhlIGFjdHVhbCBjbGFzcyBvZiB0aGUgb2JqZWN0Ci0gKiBhbmQgcHJvY2VlZGluZyB1cCB0aGUgaW5oZXJpdGFuY2UgaGllcmFyY2h5Ci0gKiB1bnRpbCBhIG5vbi1udWxsIHJlc3VsdCBpcyByZXR1cm5lZCwKLSAqIHdoaWNoIGlzIHRoZSByZXN1bHQgb2YgdGhlIHN3aXRjaC4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFVtYVN3aXRjaDxUPiB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCBtb2RlbCBwYWNrYWdlCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBVbWFQYWNrYWdlIG1vZGVsUGFja2FnZTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVW1hU3dpdGNoKCkgewotCQlpZiAobW9kZWxQYWNrYWdlID09IG51bGwpIHsKLQkJCW1vZGVsUGFja2FnZSA9IFVtYVBhY2thZ2UuZUlOU1RBTkNFOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ2FsbHMgPGNvZGU+Y2FzZVhYWDwvY29kZT4gZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsIHVudGlsIG9uZSByZXR1cm5zIGEgbm9uIG51bGwgcmVzdWx0OyBpdCB5aWVsZHMgdGhhdCByZXN1bHQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBmaXJzdCBub24tbnVsbCByZXN1bHQgcmV0dXJuZWQgYnkgYSA8Y29kZT5jYXNlWFhYPC9jb2RlPiBjYWxsLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBkb1N3aXRjaChFT2JqZWN0IHRoZUVPYmplY3QpIHsKLQkJcmV0dXJuIGRvU3dpdGNoKHRoZUVPYmplY3QuZUNsYXNzKCksIHRoZUVPYmplY3QpOwotCX0KLQotCS8qKgotCSAqIENhbGxzIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbCB1bnRpbCBvbmUgcmV0dXJucyBhIG5vbiBudWxsIHJlc3VsdDsgaXQgeWllbGRzIHRoYXQgcmVzdWx0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgZmlyc3Qgbm9uLW51bGwgcmVzdWx0IHJldHVybmVkIGJ5IGEgPGNvZGU+Y2FzZVhYWDwvY29kZT4gY2FsbC4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFQgZG9Td2l0Y2goRUNsYXNzIHRoZUVDbGFzcywgRU9iamVjdCB0aGVFT2JqZWN0KSB7Ci0JCWlmICh0aGVFQ2xhc3MuZUNvbnRhaW5lcigpID09IG1vZGVsUGFja2FnZSkgewotCQkJcmV0dXJuIGRvU3dpdGNoKHRoZUVDbGFzcy5nZXRDbGFzc2lmaWVySUQoKSwgdGhlRU9iamVjdCk7Ci0JCX0gZWxzZSB7Ci0JCQlMaXN0PEVDbGFzcz4gZVN1cGVyVHlwZXMgPSB0aGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKTsKLQkJCXJldHVybiBlU3VwZXJUeXBlcy5pc0VtcHR5KCkgPyBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KSA6IGRvU3dpdGNoKAotCQkJCQllU3VwZXJUeXBlcy5nZXQoMCksIHRoZUVPYmplY3QpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ2FsbHMgPGNvZGU+Y2FzZVhYWDwvY29kZT4gZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsIHVudGlsIG9uZSByZXR1cm5zIGEgbm9uIG51bGwgcmVzdWx0OyBpdCB5aWVsZHMgdGhhdCByZXN1bHQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBmaXJzdCBub24tbnVsbCByZXN1bHQgcmV0dXJuZWQgYnkgYSA8Y29kZT5jYXNlWFhYPC9jb2RlPiBjYWxsLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgVCBkb1N3aXRjaChpbnQgY2xhc3NpZmllcklELCBFT2JqZWN0IHRoZUVPYmplY3QpIHsKLQkJc3dpdGNoIChjbGFzc2lmaWVySUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkNMQVNTSUZJRVI6IHsKLQkJCUNsYXNzaWZpZXIgY2xhc3NpZmllciA9IChDbGFzc2lmaWVyKSB0aGVFT2JqZWN0OwotCQkJVCByZXN1bHQgPSBjYXNlQ2xhc3NpZmllcihjbGFzc2lmaWVyKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlVHlwZShjbGFzc2lmaWVyKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KGNsYXNzaWZpZXIpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQoY2xhc3NpZmllcik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUVsZW1lbnQoY2xhc3NpZmllcik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWNhc2UgVW1hUGFja2FnZS5UWVBFOiB7Ci0JCQlUeXBlIHR5cGUgPSAoVHlwZSkgdGhlRU9iamVjdDsKLQkJCVQgcmVzdWx0ID0gY2FzZVR5cGUodHlwZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudCh0eXBlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KHR5cGUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KHR5cGUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuUEFDS0FHRUFCTEVfRUxFTUVOVDogewotCQkJUGFja2FnZWFibGVFbGVtZW50IHBhY2thZ2VhYmxlRWxlbWVudCA9IChQYWNrYWdlYWJsZUVsZW1lbnQpIHRoZUVPYmplY3Q7Ci0JCQlUIHJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQocGFja2FnZWFibGVFbGVtZW50KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KHBhY2thZ2VhYmxlRWxlbWVudCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUVsZW1lbnQocGFja2FnZWFibGVFbGVtZW50KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJY2FzZSBVbWFQYWNrYWdlLk5BTUVEX0VMRU1FTlQ6IHsKLQkJCU5hbWVkRWxlbWVudCBuYW1lZEVsZW1lbnQgPSAoTmFtZWRFbGVtZW50KSB0aGVFT2JqZWN0OwotCQkJVCByZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KG5hbWVkRWxlbWVudCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUVsZW1lbnQobmFtZWRFbGVtZW50KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJY2FzZSBVbWFQYWNrYWdlLkVMRU1FTlQ6IHsKLQkJCUVsZW1lbnQgZWxlbWVudCA9IChFbGVtZW50KSB0aGVFT2JqZWN0OwotCQkJVCByZXN1bHQgPSBjYXNlRWxlbWVudChlbGVtZW50KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJY2FzZSBVbWFQYWNrYWdlLlBBQ0tBR0U6IHsKLQkJCW9yZy5lY2xpcHNlLmVwZi51bWEuUGFja2FnZSBwYWNrYWdlXyA9IChvcmcuZWNsaXBzZS5lcGYudW1hLlBhY2thZ2UpIHRoZUVPYmplY3Q7Ci0JCQlUIHJlc3VsdCA9IGNhc2VQYWNrYWdlKHBhY2thZ2VfKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZXNwYWNlKHBhY2thZ2VfKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KHBhY2thZ2VfKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KHBhY2thZ2VfKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRWxlbWVudChwYWNrYWdlXyk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWNhc2UgVW1hUGFja2FnZS5OQU1FU1BBQ0U6IHsKLQkJCU5hbWVzcGFjZSBuYW1lc3BhY2UgPSAoTmFtZXNwYWNlKSB0aGVFT2JqZWN0OwotCQkJVCByZXN1bHQgPSBjYXNlTmFtZXNwYWNlKG5hbWVzcGFjZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChuYW1lc3BhY2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KG5hbWVzcGFjZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWNhc2UgVW1hUGFja2FnZS5DT05TVFJBSU5UOiB7Ci0JCQlDb25zdHJhaW50IGNvbnN0cmFpbnQgPSAoQ29uc3RyYWludCkgdGhlRU9iamVjdDsKLQkJCVQgcmVzdWx0ID0gY2FzZUNvbnN0cmFpbnQoY29uc3RyYWludCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQoY29uc3RyYWludCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChjb25zdHJhaW50KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KGNvbnN0cmFpbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KGNvbnN0cmFpbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0VMRU1FTlQ6IHsKLQkJCU1ldGhvZEVsZW1lbnQgbWV0aG9kRWxlbWVudCA9IChNZXRob2RFbGVtZW50KSB0aGVFT2JqZWN0OwotCQkJVCByZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChtZXRob2RFbGVtZW50KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KG1ldGhvZEVsZW1lbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQobWV0aG9kRWxlbWVudCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUVsZW1lbnQobWV0aG9kRWxlbWVudCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTogewotCQkJTWV0aG9kRWxlbWVudFByb3BlcnR5IG1ldGhvZEVsZW1lbnRQcm9wZXJ0eSA9IChNZXRob2RFbGVtZW50UHJvcGVydHkpIHRoZUVPYmplY3Q7Ci0JCQlUIHJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50UHJvcGVydHkobWV0aG9kRWxlbWVudFByb3BlcnR5KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KG1ldGhvZEVsZW1lbnRQcm9wZXJ0eSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChtZXRob2RFbGVtZW50UHJvcGVydHkpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KG1ldGhvZEVsZW1lbnRQcm9wZXJ0eSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWNhc2UgVW1hUGFja2FnZS5LSU5EOiB7Ci0JCQlLaW5kIGtpbmQgPSAoS2luZCkgdGhlRU9iamVjdDsKLQkJCVQgcmVzdWx0ID0gY2FzZUtpbmQoa2luZCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUNvbnRlbnRFbGVtZW50KGtpbmQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQoa2luZCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVZhcmlhYmlsaXR5RWxlbWVudChraW5kKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChraW5kKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQ2xhc3NpZmllcihraW5kKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KGtpbmQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VUeXBlKGtpbmQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQoa2luZCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUVsZW1lbnQoa2luZCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0VMRU1FTlQ6IHsKLQkJCUNvbnRlbnRFbGVtZW50IGNvbnRlbnRFbGVtZW50ID0gKENvbnRlbnRFbGVtZW50KSB0aGVFT2JqZWN0OwotCQkJVCByZXN1bHQgPSBjYXNlQ29udGVudEVsZW1lbnQoY29udGVudEVsZW1lbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQoY29udGVudEVsZW1lbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VWYXJpYWJpbGl0eUVsZW1lbnQoY29udGVudEVsZW1lbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KGNvbnRlbnRFbGVtZW50KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQ2xhc3NpZmllcihjb250ZW50RWxlbWVudCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChjb250ZW50RWxlbWVudCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVR5cGUoY29udGVudEVsZW1lbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQoY29udGVudEVsZW1lbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KGNvbnRlbnRFbGVtZW50KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJY2FzZSBVbWFQYWNrYWdlLkRFU0NSSUJBQkxFX0VMRU1FTlQ6IHsKLQkJCURlc2NyaWJhYmxlRWxlbWVudCBkZXNjcmliYWJsZUVsZW1lbnQgPSAoRGVzY3JpYmFibGVFbGVtZW50KSB0aGVFT2JqZWN0OwotCQkJVCByZXN1bHQgPSBjYXNlRGVzY3JpYmFibGVFbGVtZW50KGRlc2NyaWJhYmxlRWxlbWVudCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQoZGVzY3JpYmFibGVFbGVtZW50KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQ2xhc3NpZmllcihkZXNjcmliYWJsZUVsZW1lbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQoZGVzY3JpYmFibGVFbGVtZW50KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlVHlwZShkZXNjcmliYWJsZUVsZW1lbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQoZGVzY3JpYmFibGVFbGVtZW50KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRWxlbWVudChkZXNjcmliYWJsZUVsZW1lbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9ERVNDUklQVElPTjogewotCQkJQ29udGVudERlc2NyaXB0aW9uIGNvbnRlbnREZXNjcmlwdGlvbiA9IChDb250ZW50RGVzY3JpcHRpb24pIHRoZUVPYmplY3Q7Ci0JCQlUIHJlc3VsdCA9IGNhc2VDb250ZW50RGVzY3JpcHRpb24oY29udGVudERlc2NyaXB0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kVW5pdChjb250ZW50RGVzY3JpcHRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KGNvbnRlbnREZXNjcmlwdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChjb250ZW50RGVzY3JpcHRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQoY29udGVudERlc2NyaXB0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRWxlbWVudChjb250ZW50RGVzY3JpcHRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1VOSVQ6IHsKLQkJCU1ldGhvZFVuaXQgbWV0aG9kVW5pdCA9IChNZXRob2RVbml0KSB0aGVFT2JqZWN0OwotCQkJVCByZXN1bHQgPSBjYXNlTWV0aG9kVW5pdChtZXRob2RVbml0KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChtZXRob2RVbml0KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KG1ldGhvZFVuaXQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQobWV0aG9kVW5pdCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUVsZW1lbnQobWV0aG9kVW5pdCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWNhc2UgVW1hUGFja2FnZS5TVVBQT1JUSU5HX01BVEVSSUFMOiB7Ci0JCQlTdXBwb3J0aW5nTWF0ZXJpYWwgc3VwcG9ydGluZ01hdGVyaWFsID0gKFN1cHBvcnRpbmdNYXRlcmlhbCkgdGhlRU9iamVjdDsKLQkJCVQgcmVzdWx0ID0gY2FzZVN1cHBvcnRpbmdNYXRlcmlhbChzdXBwb3J0aW5nTWF0ZXJpYWwpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VHdWlkYW5jZShzdXBwb3J0aW5nTWF0ZXJpYWwpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VDb250ZW50RWxlbWVudChzdXBwb3J0aW5nTWF0ZXJpYWwpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQoc3VwcG9ydGluZ01hdGVyaWFsKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlVmFyaWFiaWxpdHlFbGVtZW50KHN1cHBvcnRpbmdNYXRlcmlhbCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQoc3VwcG9ydGluZ01hdGVyaWFsKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQ2xhc3NpZmllcihzdXBwb3J0aW5nTWF0ZXJpYWwpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQoc3VwcG9ydGluZ01hdGVyaWFsKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlVHlwZShzdXBwb3J0aW5nTWF0ZXJpYWwpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQoc3VwcG9ydGluZ01hdGVyaWFsKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRWxlbWVudChzdXBwb3J0aW5nTWF0ZXJpYWwpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuR1VJREFOQ0U6IHsKLQkJCUd1aWRhbmNlIGd1aWRhbmNlID0gKEd1aWRhbmNlKSB0aGVFT2JqZWN0OwotCQkJVCByZXN1bHQgPSBjYXNlR3VpZGFuY2UoZ3VpZGFuY2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VDb250ZW50RWxlbWVudChndWlkYW5jZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZURlc2NyaWJhYmxlRWxlbWVudChndWlkYW5jZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVZhcmlhYmlsaXR5RWxlbWVudChndWlkYW5jZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQoZ3VpZGFuY2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VDbGFzc2lmaWVyKGd1aWRhbmNlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KGd1aWRhbmNlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlVHlwZShndWlkYW5jZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChndWlkYW5jZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUVsZW1lbnQoZ3VpZGFuY2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuU0VDVElPTjogewotCQkJU2VjdGlvbiBzZWN0aW9uID0gKFNlY3Rpb24pIHRoZUVPYmplY3Q7Ci0JCQlUIHJlc3VsdCA9IGNhc2VTZWN0aW9uKHNlY3Rpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VWYXJpYWJpbGl0eUVsZW1lbnQoc2VjdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQoc2VjdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChzZWN0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KHNlY3Rpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KHNlY3Rpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuVkFSSUFCSUxJVFlfRUxFTUVOVDogewotCQkJVmFyaWFiaWxpdHlFbGVtZW50IHZhcmlhYmlsaXR5RWxlbWVudCA9IChWYXJpYWJpbGl0eUVsZW1lbnQpIHRoZUVPYmplY3Q7Ci0JCQlUIHJlc3VsdCA9IGNhc2VWYXJpYWJpbGl0eUVsZW1lbnQodmFyaWFiaWxpdHlFbGVtZW50KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudCh2YXJpYWJpbGl0eUVsZW1lbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQodmFyaWFiaWxpdHlFbGVtZW50KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KHZhcmlhYmlsaXR5RWxlbWVudCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUVsZW1lbnQodmFyaWFiaWxpdHlFbGVtZW50KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJY2FzZSBVbWFQYWNrYWdlLkNPTkNFUFQ6IHsKLQkJCUNvbmNlcHQgY29uY2VwdCA9IChDb25jZXB0KSB0aGVFT2JqZWN0OwotCQkJVCByZXN1bHQgPSBjYXNlQ29uY2VwdChjb25jZXB0KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlR3VpZGFuY2UoY29uY2VwdCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUNvbnRlbnRFbGVtZW50KGNvbmNlcHQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQoY29uY2VwdCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVZhcmlhYmlsaXR5RWxlbWVudChjb25jZXB0KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChjb25jZXB0KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQ2xhc3NpZmllcihjb25jZXB0KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KGNvbmNlcHQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VUeXBlKGNvbmNlcHQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQoY29uY2VwdCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUVsZW1lbnQoY29uY2VwdCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWNhc2UgVW1hUGFja2FnZS5DSEVDS0xJU1Q6IHsKLQkJCUNoZWNrbGlzdCBjaGVja2xpc3QgPSAoQ2hlY2tsaXN0KSB0aGVFT2JqZWN0OwotCQkJVCByZXN1bHQgPSBjYXNlQ2hlY2tsaXN0KGNoZWNrbGlzdCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUd1aWRhbmNlKGNoZWNrbGlzdCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUNvbnRlbnRFbGVtZW50KGNoZWNrbGlzdCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZURlc2NyaWJhYmxlRWxlbWVudChjaGVja2xpc3QpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VWYXJpYWJpbGl0eUVsZW1lbnQoY2hlY2tsaXN0KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChjaGVja2xpc3QpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VDbGFzc2lmaWVyKGNoZWNrbGlzdCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChjaGVja2xpc3QpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VUeXBlKGNoZWNrbGlzdCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChjaGVja2xpc3QpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KGNoZWNrbGlzdCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWNhc2UgVW1hUGFja2FnZS5HVUlERUxJTkU6IHsKLQkJCUd1aWRlbGluZSBndWlkZWxpbmUgPSAoR3VpZGVsaW5lKSB0aGVFT2JqZWN0OwotCQkJVCByZXN1bHQgPSBjYXNlR3VpZGVsaW5lKGd1aWRlbGluZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUd1aWRhbmNlKGd1aWRlbGluZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUNvbnRlbnRFbGVtZW50KGd1aWRlbGluZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZURlc2NyaWJhYmxlRWxlbWVudChndWlkZWxpbmUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VWYXJpYWJpbGl0eUVsZW1lbnQoZ3VpZGVsaW5lKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChndWlkZWxpbmUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VDbGFzc2lmaWVyKGd1aWRlbGluZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChndWlkZWxpbmUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VUeXBlKGd1aWRlbGluZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChndWlkZWxpbmUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KGd1aWRlbGluZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWNhc2UgVW1hUGFja2FnZS5FWEFNUExFOiB7Ci0JCQlFeGFtcGxlIGV4YW1wbGUgPSAoRXhhbXBsZSkgdGhlRU9iamVjdDsKLQkJCVQgcmVzdWx0ID0gY2FzZUV4YW1wbGUoZXhhbXBsZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUd1aWRhbmNlKGV4YW1wbGUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VDb250ZW50RWxlbWVudChleGFtcGxlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRGVzY3JpYmFibGVFbGVtZW50KGV4YW1wbGUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VWYXJpYWJpbGl0eUVsZW1lbnQoZXhhbXBsZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQoZXhhbXBsZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUNsYXNzaWZpZXIoZXhhbXBsZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChleGFtcGxlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlVHlwZShleGFtcGxlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KGV4YW1wbGUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KGV4YW1wbGUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuUkVVU0FCTEVfQVNTRVQ6IHsKLQkJCVJldXNhYmxlQXNzZXQgcmV1c2FibGVBc3NldCA9IChSZXVzYWJsZUFzc2V0KSB0aGVFT2JqZWN0OwotCQkJVCByZXN1bHQgPSBjYXNlUmV1c2FibGVBc3NldChyZXVzYWJsZUFzc2V0KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlR3VpZGFuY2UocmV1c2FibGVBc3NldCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUNvbnRlbnRFbGVtZW50KHJldXNhYmxlQXNzZXQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQocmV1c2FibGVBc3NldCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVZhcmlhYmlsaXR5RWxlbWVudChyZXVzYWJsZUFzc2V0KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChyZXVzYWJsZUFzc2V0KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQ2xhc3NpZmllcihyZXVzYWJsZUFzc2V0KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KHJldXNhYmxlQXNzZXQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VUeXBlKHJldXNhYmxlQXNzZXQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQocmV1c2FibGVBc3NldCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUVsZW1lbnQocmV1c2FibGVBc3NldCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWNhc2UgVW1hUGFja2FnZS5URVJNX0RFRklOSVRJT046IHsKLQkJCVRlcm1EZWZpbml0aW9uIHRlcm1EZWZpbml0aW9uID0gKFRlcm1EZWZpbml0aW9uKSB0aGVFT2JqZWN0OwotCQkJVCByZXN1bHQgPSBjYXNlVGVybURlZmluaXRpb24odGVybURlZmluaXRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VHdWlkYW5jZSh0ZXJtRGVmaW5pdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUNvbnRlbnRFbGVtZW50KHRlcm1EZWZpbml0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRGVzY3JpYmFibGVFbGVtZW50KHRlcm1EZWZpbml0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlVmFyaWFiaWxpdHlFbGVtZW50KHRlcm1EZWZpbml0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudCh0ZXJtRGVmaW5pdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUNsYXNzaWZpZXIodGVybURlZmluaXRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQodGVybURlZmluaXRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VUeXBlKHRlcm1EZWZpbml0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KHRlcm1EZWZpbml0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRWxlbWVudCh0ZXJtRGVmaW5pdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWNhc2UgVW1hUGFja2FnZS5BUFBMSUNBQkxFX01FVEFfQ0xBU1NfSU5GTzogewotCQkJQXBwbGljYWJsZU1ldGFDbGFzc0luZm8gYXBwbGljYWJsZU1ldGFDbGFzc0luZm8gPSAoQXBwbGljYWJsZU1ldGFDbGFzc0luZm8pIHRoZUVPYmplY3Q7Ci0JCQlUIHJlc3VsdCA9IGNhc2VBcHBsaWNhYmxlTWV0YUNsYXNzSW5mbyhhcHBsaWNhYmxlTWV0YUNsYXNzSW5mbyk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUNsYXNzaWZpZXIoYXBwbGljYWJsZU1ldGFDbGFzc0luZm8pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VUeXBlKGFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KGFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KGFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRWxlbWVudChhcHBsaWNhYmxlTWV0YUNsYXNzSW5mbyk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWNhc2UgVW1hUGFja2FnZS5BUlRJRkFDVDogewotCQkJQXJ0aWZhY3QgYXJ0aWZhY3QgPSAoQXJ0aWZhY3QpIHRoZUVPYmplY3Q7Ci0JCQlUIHJlc3VsdCA9IGNhc2VBcnRpZmFjdChhcnRpZmFjdCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVdvcmtQcm9kdWN0KGFydGlmYWN0KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQ29udGVudEVsZW1lbnQoYXJ0aWZhY3QpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VGdWxmaWxsYWJsZUVsZW1lbnQoYXJ0aWZhY3QpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQoYXJ0aWZhY3QpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VWYXJpYWJpbGl0eUVsZW1lbnQoYXJ0aWZhY3QpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KGFydGlmYWN0KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQ2xhc3NpZmllcihhcnRpZmFjdCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChhcnRpZmFjdCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVR5cGUoYXJ0aWZhY3QpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQoYXJ0aWZhY3QpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KGFydGlmYWN0KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVDogewotCQkJV29ya1Byb2R1Y3Qgd29ya1Byb2R1Y3QgPSAoV29ya1Byb2R1Y3QpIHRoZUVPYmplY3Q7Ci0JCQlUIHJlc3VsdCA9IGNhc2VXb3JrUHJvZHVjdCh3b3JrUHJvZHVjdCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUNvbnRlbnRFbGVtZW50KHdvcmtQcm9kdWN0KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRnVsZmlsbGFibGVFbGVtZW50KHdvcmtQcm9kdWN0KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRGVzY3JpYmFibGVFbGVtZW50KHdvcmtQcm9kdWN0KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlVmFyaWFiaWxpdHlFbGVtZW50KHdvcmtQcm9kdWN0KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudCh3b3JrUHJvZHVjdCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUNsYXNzaWZpZXIod29ya1Byb2R1Y3QpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQod29ya1Byb2R1Y3QpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VUeXBlKHdvcmtQcm9kdWN0KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KHdvcmtQcm9kdWN0KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRWxlbWVudCh3b3JrUHJvZHVjdCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWNhc2UgVW1hUGFja2FnZS5GVUxGSUxMQUJMRV9FTEVNRU5UOiB7Ci0JCQlGdWxmaWxsYWJsZUVsZW1lbnQgZnVsZmlsbGFibGVFbGVtZW50ID0gKEZ1bGZpbGxhYmxlRWxlbWVudCkgdGhlRU9iamVjdDsKLQkJCVQgcmVzdWx0ID0gY2FzZUZ1bGZpbGxhYmxlRWxlbWVudChmdWxmaWxsYWJsZUVsZW1lbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQoZnVsZmlsbGFibGVFbGVtZW50KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChmdWxmaWxsYWJsZUVsZW1lbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VDbGFzc2lmaWVyKGZ1bGZpbGxhYmxlRWxlbWVudCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChmdWxmaWxsYWJsZUVsZW1lbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VUeXBlKGZ1bGZpbGxhYmxlRWxlbWVudCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChmdWxmaWxsYWJsZUVsZW1lbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KGZ1bGZpbGxhYmxlRWxlbWVudCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWNhc2UgVW1hUGFja2FnZS5SRVBPUlQ6IHsKLQkJCVJlcG9ydCByZXBvcnQgPSAoUmVwb3J0KSB0aGVFT2JqZWN0OwotCQkJVCByZXN1bHQgPSBjYXNlUmVwb3J0KHJlcG9ydCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUd1aWRhbmNlKHJlcG9ydCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUNvbnRlbnRFbGVtZW50KHJlcG9ydCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZURlc2NyaWJhYmxlRWxlbWVudChyZXBvcnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VWYXJpYWJpbGl0eUVsZW1lbnQocmVwb3J0KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChyZXBvcnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VDbGFzc2lmaWVyKHJlcG9ydCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChyZXBvcnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VUeXBlKHJlcG9ydCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChyZXBvcnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KHJlcG9ydCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWNhc2UgVW1hUGFja2FnZS5URU1QTEFURTogewotCQkJVGVtcGxhdGUgdGVtcGxhdGUgPSAoVGVtcGxhdGUpIHRoZUVPYmplY3Q7Ci0JCQlUIHJlc3VsdCA9IGNhc2VUZW1wbGF0ZSh0ZW1wbGF0ZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUd1aWRhbmNlKHRlbXBsYXRlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQ29udGVudEVsZW1lbnQodGVtcGxhdGUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQodGVtcGxhdGUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VWYXJpYWJpbGl0eUVsZW1lbnQodGVtcGxhdGUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KHRlbXBsYXRlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQ2xhc3NpZmllcih0ZW1wbGF0ZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudCh0ZW1wbGF0ZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVR5cGUodGVtcGxhdGUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQodGVtcGxhdGUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KHRlbXBsYXRlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJY2FzZSBVbWFQYWNrYWdlLlRPT0xfTUVOVE9SOiB7Ci0JCQlUb29sTWVudG9yIHRvb2xNZW50b3IgPSAoVG9vbE1lbnRvcikgdGhlRU9iamVjdDsKLQkJCVQgcmVzdWx0ID0gY2FzZVRvb2xNZW50b3IodG9vbE1lbnRvcik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUd1aWRhbmNlKHRvb2xNZW50b3IpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VDb250ZW50RWxlbWVudCh0b29sTWVudG9yKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRGVzY3JpYmFibGVFbGVtZW50KHRvb2xNZW50b3IpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VWYXJpYWJpbGl0eUVsZW1lbnQodG9vbE1lbnRvcik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQodG9vbE1lbnRvcik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUNsYXNzaWZpZXIodG9vbE1lbnRvcik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudCh0b29sTWVudG9yKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlVHlwZSh0b29sTWVudG9yKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KHRvb2xNZW50b3IpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KHRvb2xNZW50b3IpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuRVNUSU1BVElPTl9DT05TSURFUkFUSU9OUzogewotCQkJRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIGVzdGltYXRpb25Db25zaWRlcmF0aW9ucyA9IChFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMpIHRoZUVPYmplY3Q7Ci0JCQlUIHJlc3VsdCA9IGNhc2VFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMoZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlR3VpZGFuY2UoZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQ29udGVudEVsZW1lbnQoZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRGVzY3JpYmFibGVFbGVtZW50KGVzdGltYXRpb25Db25zaWRlcmF0aW9ucyk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVZhcmlhYmlsaXR5RWxlbWVudChlc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KGVzdGltYXRpb25Db25zaWRlcmF0aW9ucyk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUNsYXNzaWZpZXIoZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KGVzdGltYXRpb25Db25zaWRlcmF0aW9ucyk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVR5cGUoZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KGVzdGltYXRpb25Db25zaWRlcmF0aW9ucyk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUVsZW1lbnQoZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJBQkxFOiB7Ci0JCQlEZWxpdmVyYWJsZSBkZWxpdmVyYWJsZSA9IChEZWxpdmVyYWJsZSkgdGhlRU9iamVjdDsKLQkJCVQgcmVzdWx0ID0gY2FzZURlbGl2ZXJhYmxlKGRlbGl2ZXJhYmxlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlV29ya1Byb2R1Y3QoZGVsaXZlcmFibGUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VDb250ZW50RWxlbWVudChkZWxpdmVyYWJsZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUZ1bGZpbGxhYmxlRWxlbWVudChkZWxpdmVyYWJsZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZURlc2NyaWJhYmxlRWxlbWVudChkZWxpdmVyYWJsZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVZhcmlhYmlsaXR5RWxlbWVudChkZWxpdmVyYWJsZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQoZGVsaXZlcmFibGUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VDbGFzc2lmaWVyKGRlbGl2ZXJhYmxlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KGRlbGl2ZXJhYmxlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlVHlwZShkZWxpdmVyYWJsZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChkZWxpdmVyYWJsZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUVsZW1lbnQoZGVsaXZlcmFibGUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuT1VUQ09NRTogewotCQkJT3V0Y29tZSBvdXRjb21lID0gKE91dGNvbWUpIHRoZUVPYmplY3Q7Ci0JCQlUIHJlc3VsdCA9IGNhc2VPdXRjb21lKG91dGNvbWUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VXb3JrUHJvZHVjdChvdXRjb21lKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQ29udGVudEVsZW1lbnQob3V0Y29tZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUZ1bGZpbGxhYmxlRWxlbWVudChvdXRjb21lKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRGVzY3JpYmFibGVFbGVtZW50KG91dGNvbWUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VWYXJpYWJpbGl0eUVsZW1lbnQob3V0Y29tZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQob3V0Y29tZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUNsYXNzaWZpZXIob3V0Y29tZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChvdXRjb21lKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlVHlwZShvdXRjb21lKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KG91dGNvbWUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KG91dGNvbWUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuU1RFUDogewotCQkJU3RlcCBzdGVwID0gKFN0ZXApIHRoZUVPYmplY3Q7Ci0JCQlUIHJlc3VsdCA9IGNhc2VTdGVwKHN0ZXApOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VTZWN0aW9uKHN0ZXApOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VXb3JrRGVmaW5pdGlvbihzdGVwKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlVmFyaWFiaWxpdHlFbGVtZW50KHN0ZXApOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KHN0ZXApOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQoc3RlcCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChzdGVwKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRWxlbWVudChzdGVwKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfREVGSU5JVElPTjogewotCQkJV29ya0RlZmluaXRpb24gd29ya0RlZmluaXRpb24gPSAoV29ya0RlZmluaXRpb24pIHRoZUVPYmplY3Q7Ci0JCQlUIHJlc3VsdCA9IGNhc2VXb3JrRGVmaW5pdGlvbih3b3JrRGVmaW5pdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQod29ya0RlZmluaXRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQod29ya0RlZmluaXRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQod29ya0RlZmluaXRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KHdvcmtEZWZpbml0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJY2FzZSBVbWFQYWNrYWdlLldISVRFUEFQRVI6IHsKLQkJCVdoaXRlcGFwZXIgd2hpdGVwYXBlciA9IChXaGl0ZXBhcGVyKSB0aGVFT2JqZWN0OwotCQkJVCByZXN1bHQgPSBjYXNlV2hpdGVwYXBlcih3aGl0ZXBhcGVyKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQ29uY2VwdCh3aGl0ZXBhcGVyKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlR3VpZGFuY2Uod2hpdGVwYXBlcik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUNvbnRlbnRFbGVtZW50KHdoaXRlcGFwZXIpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQod2hpdGVwYXBlcik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVZhcmlhYmlsaXR5RWxlbWVudCh3aGl0ZXBhcGVyKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudCh3aGl0ZXBhcGVyKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQ2xhc3NpZmllcih3aGl0ZXBhcGVyKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KHdoaXRlcGFwZXIpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VUeXBlKHdoaXRlcGFwZXIpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQod2hpdGVwYXBlcik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUVsZW1lbnQod2hpdGVwYXBlcik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWNhc2UgVW1hUGFja2FnZS5UQVNLOiB7Ci0JCQlUYXNrIHRhc2sgPSAoVGFzaykgdGhlRU9iamVjdDsKLQkJCVQgcmVzdWx0ID0gY2FzZVRhc2sodGFzayk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUNvbnRlbnRFbGVtZW50KHRhc2spOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VXb3JrRGVmaW5pdGlvbih0YXNrKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRGVzY3JpYmFibGVFbGVtZW50KHRhc2spOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VWYXJpYWJpbGl0eUVsZW1lbnQodGFzayk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQodGFzayk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUNsYXNzaWZpZXIodGFzayk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudCh0YXNrKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlVHlwZSh0YXNrKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KHRhc2spOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KHRhc2spOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuUk9MRTogewotCQkJUm9sZSByb2xlID0gKFJvbGUpIHRoZUVPYmplY3Q7Ci0JCQlUIHJlc3VsdCA9IGNhc2VSb2xlKHJvbGUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VDb250ZW50RWxlbWVudChyb2xlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRnVsZmlsbGFibGVFbGVtZW50KHJvbGUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQocm9sZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVZhcmlhYmlsaXR5RWxlbWVudChyb2xlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChyb2xlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQ2xhc3NpZmllcihyb2xlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KHJvbGUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VUeXBlKHJvbGUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQocm9sZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUVsZW1lbnQocm9sZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWNhc2UgVW1hUGFja2FnZS5BUlRJRkFDVF9ERVNDUklQVElPTjogewotCQkJQXJ0aWZhY3REZXNjcmlwdGlvbiBhcnRpZmFjdERlc2NyaXB0aW9uID0gKEFydGlmYWN0RGVzY3JpcHRpb24pIHRoZUVPYmplY3Q7Ci0JCQlUIHJlc3VsdCA9IGNhc2VBcnRpZmFjdERlc2NyaXB0aW9uKGFydGlmYWN0RGVzY3JpcHRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VXb3JrUHJvZHVjdERlc2NyaXB0aW9uKGFydGlmYWN0RGVzY3JpcHRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VDb250ZW50RGVzY3JpcHRpb24oYXJ0aWZhY3REZXNjcmlwdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZFVuaXQoYXJ0aWZhY3REZXNjcmlwdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQoYXJ0aWZhY3REZXNjcmlwdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChhcnRpZmFjdERlc2NyaXB0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KGFydGlmYWN0RGVzY3JpcHRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KGFydGlmYWN0RGVzY3JpcHRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OOiB7Ci0JCQlXb3JrUHJvZHVjdERlc2NyaXB0aW9uIHdvcmtQcm9kdWN0RGVzY3JpcHRpb24gPSAoV29ya1Byb2R1Y3REZXNjcmlwdGlvbikgdGhlRU9iamVjdDsKLQkJCVQgcmVzdWx0ID0gY2FzZVdvcmtQcm9kdWN0RGVzY3JpcHRpb24od29ya1Byb2R1Y3REZXNjcmlwdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUNvbnRlbnREZXNjcmlwdGlvbih3b3JrUHJvZHVjdERlc2NyaXB0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kVW5pdCh3b3JrUHJvZHVjdERlc2NyaXB0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudCh3b3JrUHJvZHVjdERlc2NyaXB0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KHdvcmtQcm9kdWN0RGVzY3JpcHRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQod29ya1Byb2R1Y3REZXNjcmlwdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUVsZW1lbnQod29ya1Byb2R1Y3REZXNjcmlwdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSQUJMRV9ERVNDUklQVElPTjogewotCQkJRGVsaXZlcmFibGVEZXNjcmlwdGlvbiBkZWxpdmVyYWJsZURlc2NyaXB0aW9uID0gKERlbGl2ZXJhYmxlRGVzY3JpcHRpb24pIHRoZUVPYmplY3Q7Ci0JCQlUIHJlc3VsdCA9IGNhc2VEZWxpdmVyYWJsZURlc2NyaXB0aW9uKGRlbGl2ZXJhYmxlRGVzY3JpcHRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VXb3JrUHJvZHVjdERlc2NyaXB0aW9uKGRlbGl2ZXJhYmxlRGVzY3JpcHRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VDb250ZW50RGVzY3JpcHRpb24oZGVsaXZlcmFibGVEZXNjcmlwdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZFVuaXQoZGVsaXZlcmFibGVEZXNjcmlwdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQoZGVsaXZlcmFibGVEZXNjcmlwdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChkZWxpdmVyYWJsZURlc2NyaXB0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KGRlbGl2ZXJhYmxlRGVzY3JpcHRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KGRlbGl2ZXJhYmxlRGVzY3JpcHRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9ERVNDUklQVElPTjogewotCQkJUm9sZURlc2NyaXB0aW9uIHJvbGVEZXNjcmlwdGlvbiA9IChSb2xlRGVzY3JpcHRpb24pIHRoZUVPYmplY3Q7Ci0JCQlUIHJlc3VsdCA9IGNhc2VSb2xlRGVzY3JpcHRpb24ocm9sZURlc2NyaXB0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQ29udGVudERlc2NyaXB0aW9uKHJvbGVEZXNjcmlwdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZFVuaXQocm9sZURlc2NyaXB0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChyb2xlRGVzY3JpcHRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQocm9sZURlc2NyaXB0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KHJvbGVEZXNjcmlwdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUVsZW1lbnQocm9sZURlc2NyaXB0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRJT046IHsKLQkJCVRhc2tEZXNjcmlwdGlvbiB0YXNrRGVzY3JpcHRpb24gPSAoVGFza0Rlc2NyaXB0aW9uKSB0aGVFT2JqZWN0OwotCQkJVCByZXN1bHQgPSBjYXNlVGFza0Rlc2NyaXB0aW9uKHRhc2tEZXNjcmlwdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUNvbnRlbnREZXNjcmlwdGlvbih0YXNrRGVzY3JpcHRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RVbml0KHRhc2tEZXNjcmlwdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQodGFza0Rlc2NyaXB0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KHRhc2tEZXNjcmlwdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudCh0YXNrRGVzY3JpcHRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KHRhc2tEZXNjcmlwdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWNhc2UgVW1hUGFja2FnZS5HVUlEQU5DRV9ERVNDUklQVElPTjogewotCQkJR3VpZGFuY2VEZXNjcmlwdGlvbiBndWlkYW5jZURlc2NyaXB0aW9uID0gKEd1aWRhbmNlRGVzY3JpcHRpb24pIHRoZUVPYmplY3Q7Ci0JCQlUIHJlc3VsdCA9IGNhc2VHdWlkYW5jZURlc2NyaXB0aW9uKGd1aWRhbmNlRGVzY3JpcHRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VDb250ZW50RGVzY3JpcHRpb24oZ3VpZGFuY2VEZXNjcmlwdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZFVuaXQoZ3VpZGFuY2VEZXNjcmlwdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQoZ3VpZGFuY2VEZXNjcmlwdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChndWlkYW5jZURlc2NyaXB0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KGd1aWRhbmNlRGVzY3JpcHRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KGd1aWRhbmNlRGVzY3JpcHRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuUFJBQ1RJQ0VfREVTQ1JJUFRJT046IHsKLQkJCVByYWN0aWNlRGVzY3JpcHRpb24gcHJhY3RpY2VEZXNjcmlwdGlvbiA9IChQcmFjdGljZURlc2NyaXB0aW9uKSB0aGVFT2JqZWN0OwotCQkJVCByZXN1bHQgPSBjYXNlUHJhY3RpY2VEZXNjcmlwdGlvbihwcmFjdGljZURlc2NyaXB0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQ29udGVudERlc2NyaXB0aW9uKHByYWN0aWNlRGVzY3JpcHRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RVbml0KHByYWN0aWNlRGVzY3JpcHRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KHByYWN0aWNlRGVzY3JpcHRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQocHJhY3RpY2VEZXNjcmlwdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChwcmFjdGljZURlc2NyaXB0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRWxlbWVudChwcmFjdGljZURlc2NyaXB0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfU0VUOiB7Ci0JCQlSb2xlU2V0IHJvbGVTZXQgPSAoUm9sZVNldCkgdGhlRU9iamVjdDsKLQkJCVQgcmVzdWx0ID0gY2FzZVJvbGVTZXQocm9sZVNldCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUNvbnRlbnRDYXRlZ29yeShyb2xlU2V0KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQ29udGVudEVsZW1lbnQocm9sZVNldCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZURlc2NyaWJhYmxlRWxlbWVudChyb2xlU2V0KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlVmFyaWFiaWxpdHlFbGVtZW50KHJvbGVTZXQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KHJvbGVTZXQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VDbGFzc2lmaWVyKHJvbGVTZXQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQocm9sZVNldCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVR5cGUocm9sZVNldCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChyb2xlU2V0KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRWxlbWVudChyb2xlU2V0KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfQ0FURUdPUlk6IHsKLQkJCUNvbnRlbnRDYXRlZ29yeSBjb250ZW50Q2F0ZWdvcnkgPSAoQ29udGVudENhdGVnb3J5KSB0aGVFT2JqZWN0OwotCQkJVCByZXN1bHQgPSBjYXNlQ29udGVudENhdGVnb3J5KGNvbnRlbnRDYXRlZ29yeSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUNvbnRlbnRFbGVtZW50KGNvbnRlbnRDYXRlZ29yeSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZURlc2NyaWJhYmxlRWxlbWVudChjb250ZW50Q2F0ZWdvcnkpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VWYXJpYWJpbGl0eUVsZW1lbnQoY29udGVudENhdGVnb3J5KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChjb250ZW50Q2F0ZWdvcnkpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VDbGFzc2lmaWVyKGNvbnRlbnRDYXRlZ29yeSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChjb250ZW50Q2F0ZWdvcnkpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VUeXBlKGNvbnRlbnRDYXRlZ29yeSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChjb250ZW50Q2F0ZWdvcnkpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KGNvbnRlbnRDYXRlZ29yeSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWNhc2UgVW1hUGFja2FnZS5ET01BSU46IHsKLQkJCURvbWFpbiBkb21haW4gPSAoRG9tYWluKSB0aGVFT2JqZWN0OwotCQkJVCByZXN1bHQgPSBjYXNlRG9tYWluKGRvbWFpbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUNvbnRlbnRDYXRlZ29yeShkb21haW4pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VDb250ZW50RWxlbWVudChkb21haW4pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQoZG9tYWluKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlVmFyaWFiaWxpdHlFbGVtZW50KGRvbWFpbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQoZG9tYWluKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQ2xhc3NpZmllcihkb21haW4pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQoZG9tYWluKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlVHlwZShkb21haW4pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQoZG9tYWluKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRWxlbWVudChkb21haW4pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX1RZUEU6IHsKLQkJCVdvcmtQcm9kdWN0VHlwZSB3b3JrUHJvZHVjdFR5cGUgPSAoV29ya1Byb2R1Y3RUeXBlKSB0aGVFT2JqZWN0OwotCQkJVCByZXN1bHQgPSBjYXNlV29ya1Byb2R1Y3RUeXBlKHdvcmtQcm9kdWN0VHlwZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUNvbnRlbnRDYXRlZ29yeSh3b3JrUHJvZHVjdFR5cGUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VDb250ZW50RWxlbWVudCh3b3JrUHJvZHVjdFR5cGUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQod29ya1Byb2R1Y3RUeXBlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlVmFyaWFiaWxpdHlFbGVtZW50KHdvcmtQcm9kdWN0VHlwZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQod29ya1Byb2R1Y3RUeXBlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQ2xhc3NpZmllcih3b3JrUHJvZHVjdFR5cGUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQod29ya1Byb2R1Y3RUeXBlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlVHlwZSh3b3JrUHJvZHVjdFR5cGUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQod29ya1Byb2R1Y3RUeXBlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRWxlbWVudCh3b3JrUHJvZHVjdFR5cGUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuRElTQ0lQTElORV9HUk9VUElORzogewotCQkJRGlzY2lwbGluZUdyb3VwaW5nIGRpc2NpcGxpbmVHcm91cGluZyA9IChEaXNjaXBsaW5lR3JvdXBpbmcpIHRoZUVPYmplY3Q7Ci0JCQlUIHJlc3VsdCA9IGNhc2VEaXNjaXBsaW5lR3JvdXBpbmcoZGlzY2lwbGluZUdyb3VwaW5nKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQ29udGVudENhdGVnb3J5KGRpc2NpcGxpbmVHcm91cGluZyk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUNvbnRlbnRFbGVtZW50KGRpc2NpcGxpbmVHcm91cGluZyk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZURlc2NyaWJhYmxlRWxlbWVudChkaXNjaXBsaW5lR3JvdXBpbmcpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VWYXJpYWJpbGl0eUVsZW1lbnQoZGlzY2lwbGluZUdyb3VwaW5nKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChkaXNjaXBsaW5lR3JvdXBpbmcpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VDbGFzc2lmaWVyKGRpc2NpcGxpbmVHcm91cGluZyk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChkaXNjaXBsaW5lR3JvdXBpbmcpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VUeXBlKGRpc2NpcGxpbmVHcm91cGluZyk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChkaXNjaXBsaW5lR3JvdXBpbmcpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KGRpc2NpcGxpbmVHcm91cGluZyk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWNhc2UgVW1hUGFja2FnZS5ESVNDSVBMSU5FOiB7Ci0JCQlEaXNjaXBsaW5lIGRpc2NpcGxpbmUgPSAoRGlzY2lwbGluZSkgdGhlRU9iamVjdDsKLQkJCVQgcmVzdWx0ID0gY2FzZURpc2NpcGxpbmUoZGlzY2lwbGluZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUNvbnRlbnRDYXRlZ29yeShkaXNjaXBsaW5lKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQ29udGVudEVsZW1lbnQoZGlzY2lwbGluZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZURlc2NyaWJhYmxlRWxlbWVudChkaXNjaXBsaW5lKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlVmFyaWFiaWxpdHlFbGVtZW50KGRpc2NpcGxpbmUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KGRpc2NpcGxpbmUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VDbGFzc2lmaWVyKGRpc2NpcGxpbmUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQoZGlzY2lwbGluZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVR5cGUoZGlzY2lwbGluZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChkaXNjaXBsaW5lKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRWxlbWVudChkaXNjaXBsaW5lKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZOiB7Ci0JCQlBY3Rpdml0eSBhY3Rpdml0eSA9IChBY3Rpdml0eSkgdGhlRU9iamVjdDsKLQkJCVQgcmVzdWx0ID0gY2FzZUFjdGl2aXR5KGFjdGl2aXR5KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlV29ya0JyZWFrZG93bkVsZW1lbnQoYWN0aXZpdHkpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VGdWxmaWxsYWJsZUVsZW1lbnQoYWN0aXZpdHkpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VWYXJpYWJpbGl0eUVsZW1lbnQoYWN0aXZpdHkpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VXb3JrRGVmaW5pdGlvbihhY3Rpdml0eSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUJyZWFrZG93bkVsZW1lbnQoYWN0aXZpdHkpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQoYWN0aXZpdHkpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KGFjdGl2aXR5KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUHJvY2Vzc0VsZW1lbnQoYWN0aXZpdHkpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VDbGFzc2lmaWVyKGFjdGl2aXR5KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KGFjdGl2aXR5KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlVHlwZShhY3Rpdml0eSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChhY3Rpdml0eSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUVsZW1lbnQoYWN0aXZpdHkpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuV09SS19CUkVBS0RPV05fRUxFTUVOVDogewotCQkJV29ya0JyZWFrZG93bkVsZW1lbnQgd29ya0JyZWFrZG93bkVsZW1lbnQgPSAoV29ya0JyZWFrZG93bkVsZW1lbnQpIHRoZUVPYmplY3Q7Ci0JCQlUIHJlc3VsdCA9IGNhc2VXb3JrQnJlYWtkb3duRWxlbWVudCh3b3JrQnJlYWtkb3duRWxlbWVudCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUJyZWFrZG93bkVsZW1lbnQod29ya0JyZWFrZG93bkVsZW1lbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQcm9jZXNzRWxlbWVudCh3b3JrQnJlYWtkb3duRWxlbWVudCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZURlc2NyaWJhYmxlRWxlbWVudCh3b3JrQnJlYWtkb3duRWxlbWVudCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQod29ya0JyZWFrZG93bkVsZW1lbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VDbGFzc2lmaWVyKHdvcmtCcmVha2Rvd25FbGVtZW50KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KHdvcmtCcmVha2Rvd25FbGVtZW50KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlVHlwZSh3b3JrQnJlYWtkb3duRWxlbWVudCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudCh3b3JrQnJlYWtkb3duRWxlbWVudCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUVsZW1lbnQod29ya0JyZWFrZG93bkVsZW1lbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlQ6IHsKLQkJCUJyZWFrZG93bkVsZW1lbnQgYnJlYWtkb3duRWxlbWVudCA9IChCcmVha2Rvd25FbGVtZW50KSB0aGVFT2JqZWN0OwotCQkJVCByZXN1bHQgPSBjYXNlQnJlYWtkb3duRWxlbWVudChicmVha2Rvd25FbGVtZW50KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUHJvY2Vzc0VsZW1lbnQoYnJlYWtkb3duRWxlbWVudCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZURlc2NyaWJhYmxlRWxlbWVudChicmVha2Rvd25FbGVtZW50KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChicmVha2Rvd25FbGVtZW50KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQ2xhc3NpZmllcihicmVha2Rvd25FbGVtZW50KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KGJyZWFrZG93bkVsZW1lbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VUeXBlKGJyZWFrZG93bkVsZW1lbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQoYnJlYWtkb3duRWxlbWVudCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUVsZW1lbnQoYnJlYWtkb3duRWxlbWVudCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0VMRU1FTlQ6IHsKLQkJCVByb2Nlc3NFbGVtZW50IHByb2Nlc3NFbGVtZW50ID0gKFByb2Nlc3NFbGVtZW50KSB0aGVFT2JqZWN0OwotCQkJVCByZXN1bHQgPSBjYXNlUHJvY2Vzc0VsZW1lbnQocHJvY2Vzc0VsZW1lbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQocHJvY2Vzc0VsZW1lbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KHByb2Nlc3NFbGVtZW50KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQ2xhc3NpZmllcihwcm9jZXNzRWxlbWVudCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChwcm9jZXNzRWxlbWVudCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVR5cGUocHJvY2Vzc0VsZW1lbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQocHJvY2Vzc0VsZW1lbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KHByb2Nlc3NFbGVtZW50KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJY2FzZSBVbWFQYWNrYWdlLlBMQU5OSU5HX0RBVEE6IHsKLQkJCVBsYW5uaW5nRGF0YSBwbGFubmluZ0RhdGEgPSAoUGxhbm5pbmdEYXRhKSB0aGVFT2JqZWN0OwotCQkJVCByZXN1bHQgPSBjYXNlUGxhbm5pbmdEYXRhKHBsYW5uaW5nRGF0YSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVByb2Nlc3NFbGVtZW50KHBsYW5uaW5nRGF0YSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZURlc2NyaWJhYmxlRWxlbWVudChwbGFubmluZ0RhdGEpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KHBsYW5uaW5nRGF0YSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUNsYXNzaWZpZXIocGxhbm5pbmdEYXRhKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KHBsYW5uaW5nRGF0YSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVR5cGUocGxhbm5pbmdEYXRhKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KHBsYW5uaW5nRGF0YSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUVsZW1lbnQocGxhbm5pbmdEYXRhKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfT1JERVI6IHsKLQkJCVdvcmtPcmRlciB3b3JrT3JkZXIgPSAoV29ya09yZGVyKSB0aGVFT2JqZWN0OwotCQkJVCByZXN1bHQgPSBjYXNlV29ya09yZGVyKHdvcmtPcmRlcik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVByb2Nlc3NFbGVtZW50KHdvcmtPcmRlcik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZURlc2NyaWJhYmxlRWxlbWVudCh3b3JrT3JkZXIpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KHdvcmtPcmRlcik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUNsYXNzaWZpZXIod29ya09yZGVyKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KHdvcmtPcmRlcik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVR5cGUod29ya09yZGVyKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KHdvcmtPcmRlcik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUVsZW1lbnQod29ya09yZGVyKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJY2FzZSBVbWFQYWNrYWdlLlJPQURNQVA6IHsKLQkJCVJvYWRtYXAgcm9hZG1hcCA9IChSb2FkbWFwKSB0aGVFT2JqZWN0OwotCQkJVCByZXN1bHQgPSBjYXNlUm9hZG1hcChyb2FkbWFwKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlR3VpZGFuY2Uocm9hZG1hcCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUNvbnRlbnRFbGVtZW50KHJvYWRtYXApOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQocm9hZG1hcCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVZhcmlhYmlsaXR5RWxlbWVudChyb2FkbWFwKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChyb2FkbWFwKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQ2xhc3NpZmllcihyb2FkbWFwKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KHJvYWRtYXApOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VUeXBlKHJvYWRtYXApOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQocm9hZG1hcCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUVsZW1lbnQocm9hZG1hcCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWNhc2UgVW1hUGFja2FnZS5UT09MOiB7Ci0JCQlUb29sIHRvb2wgPSAoVG9vbCkgdGhlRU9iamVjdDsKLQkJCVQgcmVzdWx0ID0gY2FzZVRvb2wodG9vbCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUNvbnRlbnRDYXRlZ29yeSh0b29sKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQ29udGVudEVsZW1lbnQodG9vbCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZURlc2NyaWJhYmxlRWxlbWVudCh0b29sKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlVmFyaWFiaWxpdHlFbGVtZW50KHRvb2wpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KHRvb2wpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VDbGFzc2lmaWVyKHRvb2wpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQodG9vbCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVR5cGUodG9vbCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudCh0b29sKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRWxlbWVudCh0b29sKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfU0VUX0dST1VQSU5HOiB7Ci0JCQlSb2xlU2V0R3JvdXBpbmcgcm9sZVNldEdyb3VwaW5nID0gKFJvbGVTZXRHcm91cGluZykgdGhlRU9iamVjdDsKLQkJCVQgcmVzdWx0ID0gY2FzZVJvbGVTZXRHcm91cGluZyhyb2xlU2V0R3JvdXBpbmcpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VDb250ZW50Q2F0ZWdvcnkocm9sZVNldEdyb3VwaW5nKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQ29udGVudEVsZW1lbnQocm9sZVNldEdyb3VwaW5nKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRGVzY3JpYmFibGVFbGVtZW50KHJvbGVTZXRHcm91cGluZyk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVZhcmlhYmlsaXR5RWxlbWVudChyb2xlU2V0R3JvdXBpbmcpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KHJvbGVTZXRHcm91cGluZyk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUNsYXNzaWZpZXIocm9sZVNldEdyb3VwaW5nKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KHJvbGVTZXRHcm91cGluZyk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVR5cGUocm9sZVNldEdyb3VwaW5nKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KHJvbGVTZXRHcm91cGluZyk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUVsZW1lbnQocm9sZVNldEdyb3VwaW5nKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJY2FzZSBVbWFQYWNrYWdlLkNVU1RPTV9DQVRFR09SWTogewotCQkJQ3VzdG9tQ2F0ZWdvcnkgY3VzdG9tQ2F0ZWdvcnkgPSAoQ3VzdG9tQ2F0ZWdvcnkpIHRoZUVPYmplY3Q7Ci0JCQlUIHJlc3VsdCA9IGNhc2VDdXN0b21DYXRlZ29yeShjdXN0b21DYXRlZ29yeSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUNvbnRlbnRDYXRlZ29yeShjdXN0b21DYXRlZ29yeSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUNvbnRlbnRFbGVtZW50KGN1c3RvbUNhdGVnb3J5KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRGVzY3JpYmFibGVFbGVtZW50KGN1c3RvbUNhdGVnb3J5KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlVmFyaWFiaWxpdHlFbGVtZW50KGN1c3RvbUNhdGVnb3J5KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChjdXN0b21DYXRlZ29yeSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUNsYXNzaWZpZXIoY3VzdG9tQ2F0ZWdvcnkpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQoY3VzdG9tQ2F0ZWdvcnkpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VUeXBlKGN1c3RvbUNhdGVnb3J5KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KGN1c3RvbUNhdGVnb3J5KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRWxlbWVudChjdXN0b21DYXRlZ29yeSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfUEFDS0FHRTogewotCQkJTWV0aG9kUGFja2FnZSBtZXRob2RQYWNrYWdlID0gKE1ldGhvZFBhY2thZ2UpIHRoZUVPYmplY3Q7Ci0JCQlUIHJlc3VsdCA9IGNhc2VNZXRob2RQYWNrYWdlKG1ldGhvZFBhY2thZ2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KG1ldGhvZFBhY2thZ2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQYWNrYWdlKG1ldGhvZFBhY2thZ2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQobWV0aG9kUGFja2FnZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVzcGFjZShtZXRob2RQYWNrYWdlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KG1ldGhvZFBhY2thZ2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KG1ldGhvZFBhY2thZ2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9QQUNLQUdFOiB7Ci0JCQlDb250ZW50UGFja2FnZSBjb250ZW50UGFja2FnZSA9IChDb250ZW50UGFja2FnZSkgdGhlRU9iamVjdDsKLQkJCVQgcmVzdWx0ID0gY2FzZUNvbnRlbnRQYWNrYWdlKGNvbnRlbnRQYWNrYWdlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kUGFja2FnZShjb250ZW50UGFja2FnZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQoY29udGVudFBhY2thZ2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQYWNrYWdlKGNvbnRlbnRQYWNrYWdlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KGNvbnRlbnRQYWNrYWdlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZXNwYWNlKGNvbnRlbnRQYWNrYWdlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KGNvbnRlbnRQYWNrYWdlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRWxlbWVudChjb250ZW50UGFja2FnZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWNhc2UgVW1hUGFja2FnZS5NSUxFU1RPTkU6IHsKLQkJCU1pbGVzdG9uZSBtaWxlc3RvbmUgPSAoTWlsZXN0b25lKSB0aGVFT2JqZWN0OwotCQkJVCByZXN1bHQgPSBjYXNlTWlsZXN0b25lKG1pbGVzdG9uZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVdvcmtCcmVha2Rvd25FbGVtZW50KG1pbGVzdG9uZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUJyZWFrZG93bkVsZW1lbnQobWlsZXN0b25lKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUHJvY2Vzc0VsZW1lbnQobWlsZXN0b25lKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRGVzY3JpYmFibGVFbGVtZW50KG1pbGVzdG9uZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQobWlsZXN0b25lKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQ2xhc3NpZmllcihtaWxlc3RvbmUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQobWlsZXN0b25lKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlVHlwZShtaWxlc3RvbmUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQobWlsZXN0b25lKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRWxlbWVudChtaWxlc3RvbmUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUT1I6IHsKLQkJCVdvcmtQcm9kdWN0RGVzY3JpcHRvciB3b3JrUHJvZHVjdERlc2NyaXB0b3IgPSAoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSB0aGVFT2JqZWN0OwotCQkJVCByZXN1bHQgPSBjYXNlV29ya1Byb2R1Y3REZXNjcmlwdG9yKHdvcmtQcm9kdWN0RGVzY3JpcHRvcik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZURlc2NyaXB0b3Iod29ya1Byb2R1Y3REZXNjcmlwdG9yKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQnJlYWtkb3duRWxlbWVudCh3b3JrUHJvZHVjdERlc2NyaXB0b3IpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQcm9jZXNzRWxlbWVudCh3b3JrUHJvZHVjdERlc2NyaXB0b3IpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQod29ya1Byb2R1Y3REZXNjcmlwdG9yKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudCh3b3JrUHJvZHVjdERlc2NyaXB0b3IpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VDbGFzc2lmaWVyKHdvcmtQcm9kdWN0RGVzY3JpcHRvcik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudCh3b3JrUHJvZHVjdERlc2NyaXB0b3IpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VUeXBlKHdvcmtQcm9kdWN0RGVzY3JpcHRvcik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudCh3b3JrUHJvZHVjdERlc2NyaXB0b3IpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KHdvcmtQcm9kdWN0RGVzY3JpcHRvcik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWNhc2UgVW1hUGFja2FnZS5ERVNDUklQVE9SOiB7Ci0JCQlEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSAoRGVzY3JpcHRvcikgdGhlRU9iamVjdDsKLQkJCVQgcmVzdWx0ID0gY2FzZURlc2NyaXB0b3IoZGVzY3JpcHRvcik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUJyZWFrZG93bkVsZW1lbnQoZGVzY3JpcHRvcik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVByb2Nlc3NFbGVtZW50KGRlc2NyaXB0b3IpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQoZGVzY3JpcHRvcik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQoZGVzY3JpcHRvcik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUNsYXNzaWZpZXIoZGVzY3JpcHRvcik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChkZXNjcmlwdG9yKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlVHlwZShkZXNjcmlwdG9yKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KGRlc2NyaXB0b3IpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KGRlc2NyaXB0b3IpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuSVRFUkFUSU9OOiB7Ci0JCQlJdGVyYXRpb24gaXRlcmF0aW9uID0gKEl0ZXJhdGlvbikgdGhlRU9iamVjdDsKLQkJCVQgcmVzdWx0ID0gY2FzZUl0ZXJhdGlvbihpdGVyYXRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VBY3Rpdml0eShpdGVyYXRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VXb3JrQnJlYWtkb3duRWxlbWVudChpdGVyYXRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VGdWxmaWxsYWJsZUVsZW1lbnQoaXRlcmF0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlVmFyaWFiaWxpdHlFbGVtZW50KGl0ZXJhdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVdvcmtEZWZpbml0aW9uKGl0ZXJhdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUJyZWFrZG93bkVsZW1lbnQoaXRlcmF0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRGVzY3JpYmFibGVFbGVtZW50KGl0ZXJhdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQoaXRlcmF0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUHJvY2Vzc0VsZW1lbnQoaXRlcmF0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQ2xhc3NpZmllcihpdGVyYXRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQoaXRlcmF0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlVHlwZShpdGVyYXRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQoaXRlcmF0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRWxlbWVudChpdGVyYXRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuUEhBU0U6IHsKLQkJCVBoYXNlIHBoYXNlID0gKFBoYXNlKSB0aGVFT2JqZWN0OwotCQkJVCByZXN1bHQgPSBjYXNlUGhhc2UocGhhc2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VBY3Rpdml0eShwaGFzZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVdvcmtCcmVha2Rvd25FbGVtZW50KHBoYXNlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRnVsZmlsbGFibGVFbGVtZW50KHBoYXNlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlVmFyaWFiaWxpdHlFbGVtZW50KHBoYXNlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlV29ya0RlZmluaXRpb24ocGhhc2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VCcmVha2Rvd25FbGVtZW50KHBoYXNlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRGVzY3JpYmFibGVFbGVtZW50KHBoYXNlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChwaGFzZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVByb2Nlc3NFbGVtZW50KHBoYXNlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQ2xhc3NpZmllcihwaGFzZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChwaGFzZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVR5cGUocGhhc2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQocGhhc2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KHBoYXNlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJY2FzZSBVbWFQYWNrYWdlLlRFQU1fUFJPRklMRTogewotCQkJVGVhbVByb2ZpbGUgdGVhbVByb2ZpbGUgPSAoVGVhbVByb2ZpbGUpIHRoZUVPYmplY3Q7Ci0JCQlUIHJlc3VsdCA9IGNhc2VUZWFtUHJvZmlsZSh0ZWFtUHJvZmlsZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUJyZWFrZG93bkVsZW1lbnQodGVhbVByb2ZpbGUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQcm9jZXNzRWxlbWVudCh0ZWFtUHJvZmlsZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZURlc2NyaWJhYmxlRWxlbWVudCh0ZWFtUHJvZmlsZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQodGVhbVByb2ZpbGUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VDbGFzc2lmaWVyKHRlYW1Qcm9maWxlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KHRlYW1Qcm9maWxlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlVHlwZSh0ZWFtUHJvZmlsZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudCh0ZWFtUHJvZmlsZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUVsZW1lbnQodGVhbVByb2ZpbGUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9ERVNDUklQVE9SOiB7Ci0JCQlSb2xlRGVzY3JpcHRvciByb2xlRGVzY3JpcHRvciA9IChSb2xlRGVzY3JpcHRvcikgdGhlRU9iamVjdDsKLQkJCVQgcmVzdWx0ID0gY2FzZVJvbGVEZXNjcmlwdG9yKHJvbGVEZXNjcmlwdG9yKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRGVzY3JpcHRvcihyb2xlRGVzY3JpcHRvcik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUJyZWFrZG93bkVsZW1lbnQocm9sZURlc2NyaXB0b3IpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQcm9jZXNzRWxlbWVudChyb2xlRGVzY3JpcHRvcik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZURlc2NyaWJhYmxlRWxlbWVudChyb2xlRGVzY3JpcHRvcik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQocm9sZURlc2NyaXB0b3IpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VDbGFzc2lmaWVyKHJvbGVEZXNjcmlwdG9yKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KHJvbGVEZXNjcmlwdG9yKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlVHlwZShyb2xlRGVzY3JpcHRvcik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChyb2xlRGVzY3JpcHRvcik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUVsZW1lbnQocm9sZURlc2NyaXB0b3IpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SOiB7Ci0JCQlUYXNrRGVzY3JpcHRvciB0YXNrRGVzY3JpcHRvciA9IChUYXNrRGVzY3JpcHRvcikgdGhlRU9iamVjdDsKLQkJCVQgcmVzdWx0ID0gY2FzZVRhc2tEZXNjcmlwdG9yKHRhc2tEZXNjcmlwdG9yKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlV29ya0JyZWFrZG93bkVsZW1lbnQodGFza0Rlc2NyaXB0b3IpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VEZXNjcmlwdG9yKHRhc2tEZXNjcmlwdG9yKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQnJlYWtkb3duRWxlbWVudCh0YXNrRGVzY3JpcHRvcik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVByb2Nlc3NFbGVtZW50KHRhc2tEZXNjcmlwdG9yKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRGVzY3JpYmFibGVFbGVtZW50KHRhc2tEZXNjcmlwdG9yKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudCh0YXNrRGVzY3JpcHRvcik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUNsYXNzaWZpZXIodGFza0Rlc2NyaXB0b3IpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQodGFza0Rlc2NyaXB0b3IpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VUeXBlKHRhc2tEZXNjcmlwdG9yKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KHRhc2tEZXNjcmlwdG9yKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRWxlbWVudCh0YXNrRGVzY3JpcHRvcik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWNhc2UgVW1hUGFja2FnZS5DT01QT1NJVEVfUk9MRTogewotCQkJQ29tcG9zaXRlUm9sZSBjb21wb3NpdGVSb2xlID0gKENvbXBvc2l0ZVJvbGUpIHRoZUVPYmplY3Q7Ci0JCQlUIHJlc3VsdCA9IGNhc2VDb21wb3NpdGVSb2xlKGNvbXBvc2l0ZVJvbGUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VSb2xlRGVzY3JpcHRvcihjb21wb3NpdGVSb2xlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRGVzY3JpcHRvcihjb21wb3NpdGVSb2xlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQnJlYWtkb3duRWxlbWVudChjb21wb3NpdGVSb2xlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUHJvY2Vzc0VsZW1lbnQoY29tcG9zaXRlUm9sZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZURlc2NyaWJhYmxlRWxlbWVudChjb21wb3NpdGVSb2xlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChjb21wb3NpdGVSb2xlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQ2xhc3NpZmllcihjb21wb3NpdGVSb2xlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KGNvbXBvc2l0ZVJvbGUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VUeXBlKGNvbXBvc2l0ZVJvbGUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQoY29tcG9zaXRlUm9sZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUVsZW1lbnQoY29tcG9zaXRlUm9sZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSWV9QUk9DRVNTOiB7Ci0JCQlEZWxpdmVyeVByb2Nlc3MgZGVsaXZlcnlQcm9jZXNzID0gKERlbGl2ZXJ5UHJvY2VzcykgdGhlRU9iamVjdDsKLQkJCVQgcmVzdWx0ID0gY2FzZURlbGl2ZXJ5UHJvY2VzcyhkZWxpdmVyeVByb2Nlc3MpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQcm9jZXNzKGRlbGl2ZXJ5UHJvY2Vzcyk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUFjdGl2aXR5KGRlbGl2ZXJ5UHJvY2Vzcyk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVdvcmtCcmVha2Rvd25FbGVtZW50KGRlbGl2ZXJ5UHJvY2Vzcyk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUZ1bGZpbGxhYmxlRWxlbWVudChkZWxpdmVyeVByb2Nlc3MpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VWYXJpYWJpbGl0eUVsZW1lbnQoZGVsaXZlcnlQcm9jZXNzKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlV29ya0RlZmluaXRpb24oZGVsaXZlcnlQcm9jZXNzKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQnJlYWtkb3duRWxlbWVudChkZWxpdmVyeVByb2Nlc3MpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQoZGVsaXZlcnlQcm9jZXNzKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChkZWxpdmVyeVByb2Nlc3MpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQcm9jZXNzRWxlbWVudChkZWxpdmVyeVByb2Nlc3MpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VDbGFzc2lmaWVyKGRlbGl2ZXJ5UHJvY2Vzcyk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChkZWxpdmVyeVByb2Nlc3MpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VUeXBlKGRlbGl2ZXJ5UHJvY2Vzcyk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChkZWxpdmVyeVByb2Nlc3MpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KGRlbGl2ZXJ5UHJvY2Vzcyk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTOiB7Ci0JCQlvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3MgcHJvY2VzcyA9IChvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3MpIHRoZUVPYmplY3Q7Ci0JCQlUIHJlc3VsdCA9IGNhc2VQcm9jZXNzKHByb2Nlc3MpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VBY3Rpdml0eShwcm9jZXNzKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlV29ya0JyZWFrZG93bkVsZW1lbnQocHJvY2Vzcyk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUZ1bGZpbGxhYmxlRWxlbWVudChwcm9jZXNzKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlVmFyaWFiaWxpdHlFbGVtZW50KHByb2Nlc3MpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VXb3JrRGVmaW5pdGlvbihwcm9jZXNzKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQnJlYWtkb3duRWxlbWVudChwcm9jZXNzKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRGVzY3JpYmFibGVFbGVtZW50KHByb2Nlc3MpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KHByb2Nlc3MpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQcm9jZXNzRWxlbWVudChwcm9jZXNzKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQ2xhc3NpZmllcihwcm9jZXNzKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KHByb2Nlc3MpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VUeXBlKHByb2Nlc3MpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQocHJvY2Vzcyk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUVsZW1lbnQocHJvY2Vzcyk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWNhc2UgVW1hUGFja2FnZS5DQVBBQklMSVRZX1BBVFRFUk46IHsKLQkJCUNhcGFiaWxpdHlQYXR0ZXJuIGNhcGFiaWxpdHlQYXR0ZXJuID0gKENhcGFiaWxpdHlQYXR0ZXJuKSB0aGVFT2JqZWN0OwotCQkJVCByZXN1bHQgPSBjYXNlQ2FwYWJpbGl0eVBhdHRlcm4oY2FwYWJpbGl0eVBhdHRlcm4pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQcm9jZXNzKGNhcGFiaWxpdHlQYXR0ZXJuKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQWN0aXZpdHkoY2FwYWJpbGl0eVBhdHRlcm4pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VXb3JrQnJlYWtkb3duRWxlbWVudChjYXBhYmlsaXR5UGF0dGVybik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUZ1bGZpbGxhYmxlRWxlbWVudChjYXBhYmlsaXR5UGF0dGVybik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVZhcmlhYmlsaXR5RWxlbWVudChjYXBhYmlsaXR5UGF0dGVybik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVdvcmtEZWZpbml0aW9uKGNhcGFiaWxpdHlQYXR0ZXJuKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQnJlYWtkb3duRWxlbWVudChjYXBhYmlsaXR5UGF0dGVybik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZURlc2NyaWJhYmxlRWxlbWVudChjYXBhYmlsaXR5UGF0dGVybik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQoY2FwYWJpbGl0eVBhdHRlcm4pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQcm9jZXNzRWxlbWVudChjYXBhYmlsaXR5UGF0dGVybik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUNsYXNzaWZpZXIoY2FwYWJpbGl0eVBhdHRlcm4pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQoY2FwYWJpbGl0eVBhdHRlcm4pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VUeXBlKGNhcGFiaWxpdHlQYXR0ZXJuKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KGNhcGFiaWxpdHlQYXR0ZXJuKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRWxlbWVudChjYXBhYmlsaXR5UGF0dGVybik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfQ09ORklHVVJBVElPTjogewotCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBtZXRob2RDb25maWd1cmF0aW9uID0gKE1ldGhvZENvbmZpZ3VyYXRpb24pIHRoZUVPYmplY3Q7Ci0JCQlUIHJlc3VsdCA9IGNhc2VNZXRob2RDb25maWd1cmF0aW9uKG1ldGhvZENvbmZpZ3VyYXRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RVbml0KG1ldGhvZENvbmZpZ3VyYXRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KG1ldGhvZENvbmZpZ3VyYXRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQobWV0aG9kQ29uZmlndXJhdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChtZXRob2RDb25maWd1cmF0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRWxlbWVudChtZXRob2RDb25maWd1cmF0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9QTFVHSU46IHsKLQkJCU1ldGhvZFBsdWdpbiBtZXRob2RQbHVnaW4gPSAoTWV0aG9kUGx1Z2luKSB0aGVFT2JqZWN0OwotCQkJVCByZXN1bHQgPSBjYXNlTWV0aG9kUGx1Z2luKG1ldGhvZFBsdWdpbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZFVuaXQobWV0aG9kUGx1Z2luKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUGFja2FnZShtZXRob2RQbHVnaW4pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KG1ldGhvZFBsdWdpbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVzcGFjZShtZXRob2RQbHVnaW4pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQobWV0aG9kUGx1Z2luKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KG1ldGhvZFBsdWdpbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUVsZW1lbnQobWV0aG9kUGx1Z2luKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfUExBTk5JTkdfVEVNUExBVEU6IHsKLQkJCVByb2Nlc3NQbGFubmluZ1RlbXBsYXRlIHByb2Nlc3NQbGFubmluZ1RlbXBsYXRlID0gKFByb2Nlc3NQbGFubmluZ1RlbXBsYXRlKSB0aGVFT2JqZWN0OwotCQkJVCByZXN1bHQgPSBjYXNlUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUocHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQcm9jZXNzKHByb2Nlc3NQbGFubmluZ1RlbXBsYXRlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQWN0aXZpdHkocHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VXb3JrQnJlYWtkb3duRWxlbWVudChwcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUZ1bGZpbGxhYmxlRWxlbWVudChwcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVZhcmlhYmlsaXR5RWxlbWVudChwcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVdvcmtEZWZpbml0aW9uKHByb2Nlc3NQbGFubmluZ1RlbXBsYXRlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQnJlYWtkb3duRWxlbWVudChwcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZURlc2NyaWJhYmxlRWxlbWVudChwcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQocHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQcm9jZXNzRWxlbWVudChwcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUNsYXNzaWZpZXIocHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQocHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VUeXBlKHByb2Nlc3NQbGFubmluZ1RlbXBsYXRlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KHByb2Nlc3NQbGFubmluZ1RlbXBsYXRlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRWxlbWVudChwcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWNhc2UgVW1hUGFja2FnZS5QUkFDVElDRTogewotCQkJUHJhY3RpY2UgcHJhY3RpY2UgPSAoUHJhY3RpY2UpIHRoZUVPYmplY3Q7Ci0JCQlUIHJlc3VsdCA9IGNhc2VQcmFjdGljZShwcmFjdGljZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUd1aWRhbmNlKHByYWN0aWNlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQ29udGVudEVsZW1lbnQocHJhY3RpY2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQocHJhY3RpY2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VWYXJpYWJpbGl0eUVsZW1lbnQocHJhY3RpY2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KHByYWN0aWNlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQ2xhc3NpZmllcihwcmFjdGljZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChwcmFjdGljZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVR5cGUocHJhY3RpY2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQocHJhY3RpY2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KHByYWN0aWNlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OOiB7Ci0JCQlCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24gYnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uID0gKEJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbikgdGhlRU9iamVjdDsKLQkJCVQgcmVzdWx0ID0gY2FzZUJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbihicmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VDb250ZW50RGVzY3JpcHRpb24oYnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kVW5pdChicmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KGJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChicmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQoYnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRWxlbWVudChicmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfREVTQ1JJUFRJT046IHsKLQkJCUFjdGl2aXR5RGVzY3JpcHRpb24gYWN0aXZpdHlEZXNjcmlwdGlvbiA9IChBY3Rpdml0eURlc2NyaXB0aW9uKSB0aGVFT2JqZWN0OwotCQkJVCByZXN1bHQgPSBjYXNlQWN0aXZpdHlEZXNjcmlwdGlvbihhY3Rpdml0eURlc2NyaXB0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uKGFjdGl2aXR5RGVzY3JpcHRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VDb250ZW50RGVzY3JpcHRpb24oYWN0aXZpdHlEZXNjcmlwdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZFVuaXQoYWN0aXZpdHlEZXNjcmlwdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQoYWN0aXZpdHlEZXNjcmlwdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChhY3Rpdml0eURlc2NyaXB0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KGFjdGl2aXR5RGVzY3JpcHRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KGFjdGl2aXR5RGVzY3JpcHRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTjogewotCQkJRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24gZGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24gPSAoRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24pIHRoZUVPYmplY3Q7Ci0JCQlUIHJlc3VsdCA9IGNhc2VEZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbihkZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVByb2Nlc3NEZXNjcmlwdGlvbihkZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUFjdGl2aXR5RGVzY3JpcHRpb24oZGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24oZGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VDb250ZW50RGVzY3JpcHRpb24oZGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RVbml0KGRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChkZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChkZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChkZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUVsZW1lbnQoZGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19ERVNDUklQVElPTjogewotCQkJUHJvY2Vzc0Rlc2NyaXB0aW9uIHByb2Nlc3NEZXNjcmlwdGlvbiA9IChQcm9jZXNzRGVzY3JpcHRpb24pIHRoZUVPYmplY3Q7Ci0JCQlUIHJlc3VsdCA9IGNhc2VQcm9jZXNzRGVzY3JpcHRpb24ocHJvY2Vzc0Rlc2NyaXB0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQWN0aXZpdHlEZXNjcmlwdGlvbihwcm9jZXNzRGVzY3JpcHRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24ocHJvY2Vzc0Rlc2NyaXB0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQ29udGVudERlc2NyaXB0aW9uKHByb2Nlc3NEZXNjcmlwdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZFVuaXQocHJvY2Vzc0Rlc2NyaXB0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChwcm9jZXNzRGVzY3JpcHRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQocHJvY2Vzc0Rlc2NyaXB0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KHByb2Nlc3NEZXNjcmlwdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUVsZW1lbnQocHJvY2Vzc0Rlc2NyaXB0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJY2FzZSBVbWFQYWNrYWdlLkRFU0NSSVBUT1JfREVTQ1JJUFRJT046IHsKLQkJCURlc2NyaXB0b3JEZXNjcmlwdGlvbiBkZXNjcmlwdG9yRGVzY3JpcHRpb24gPSAoRGVzY3JpcHRvckRlc2NyaXB0aW9uKSB0aGVFT2JqZWN0OwotCQkJVCByZXN1bHQgPSBjYXNlRGVzY3JpcHRvckRlc2NyaXB0aW9uKGRlc2NyaXB0b3JEZXNjcmlwdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbihkZXNjcmlwdG9yRGVzY3JpcHRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VDb250ZW50RGVzY3JpcHRpb24oZGVzY3JpcHRvckRlc2NyaXB0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kVW5pdChkZXNjcmlwdG9yRGVzY3JpcHRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KGRlc2NyaXB0b3JEZXNjcmlwdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChkZXNjcmlwdG9yRGVzY3JpcHRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQoZGVzY3JpcHRvckRlc2NyaXB0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRWxlbWVudChkZXNjcmlwdG9yRGVzY3JpcHRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfREVTQ1JJUFRPUjogewotCQkJUHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3IgcHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3IgPSAoUHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3IpIHRoZUVPYmplY3Q7Ci0JCQlUIHJlc3VsdCA9IGNhc2VQcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvcihwcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvcik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZURlc2NyaXB0b3IocHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3IpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VCcmVha2Rvd25FbGVtZW50KHByb2Nlc3NDb21wb25lbnREZXNjcmlwdG9yKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUHJvY2Vzc0VsZW1lbnQocHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3IpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQocHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3IpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KHByb2Nlc3NDb21wb25lbnREZXNjcmlwdG9yKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQ2xhc3NpZmllcihwcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvcik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChwcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvcik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVR5cGUocHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3IpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQocHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3IpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KHByb2Nlc3NDb21wb25lbnREZXNjcmlwdG9yKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UOiB7Ci0JCQlQcm9jZXNzQ29tcG9uZW50IHByb2Nlc3NDb21wb25lbnQgPSAoUHJvY2Vzc0NvbXBvbmVudCkgdGhlRU9iamVjdDsKLQkJCVQgcmVzdWx0ID0gY2FzZVByb2Nlc3NDb21wb25lbnQocHJvY2Vzc0NvbXBvbmVudCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVByb2Nlc3NQYWNrYWdlKHByb2Nlc3NDb21wb25lbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RVbml0KHByb2Nlc3NDb21wb25lbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RQYWNrYWdlKHByb2Nlc3NDb21wb25lbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KHByb2Nlc3NDb21wb25lbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQYWNrYWdlKHByb2Nlc3NDb21wb25lbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQocHJvY2Vzc0NvbXBvbmVudCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVzcGFjZShwcm9jZXNzQ29tcG9uZW50KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KHByb2Nlc3NDb21wb25lbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KHByb2Nlc3NDb21wb25lbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19QQUNLQUdFOiB7Ci0JCQlQcm9jZXNzUGFja2FnZSBwcm9jZXNzUGFja2FnZSA9IChQcm9jZXNzUGFja2FnZSkgdGhlRU9iamVjdDsKLQkJCVQgcmVzdWx0ID0gY2FzZVByb2Nlc3NQYWNrYWdlKHByb2Nlc3NQYWNrYWdlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kUGFja2FnZShwcm9jZXNzUGFja2FnZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQocHJvY2Vzc1BhY2thZ2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQYWNrYWdlKHByb2Nlc3NQYWNrYWdlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KHByb2Nlc3NQYWNrYWdlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZXNwYWNlKHByb2Nlc3NQYWNrYWdlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KHByb2Nlc3NQYWNrYWdlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRWxlbWVudChwcm9jZXNzUGFja2FnZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWNhc2UgVW1hUGFja2FnZS5ESUFHUkFNOiB7Ci0JCQlEaWFncmFtIGRpYWdyYW0gPSAoRGlhZ3JhbSkgdGhlRU9iamVjdDsKLQkJCVQgcmVzdWx0ID0gY2FzZURpYWdyYW0oZGlhZ3JhbSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUdyYXBoTm9kZShkaWFncmFtKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlR3JhcGhFbGVtZW50KGRpYWdyYW0pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VEaWFncmFtRWxlbWVudChkaWFncmFtKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChkaWFncmFtKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KGRpYWdyYW0pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQoZGlhZ3JhbSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUVsZW1lbnQoZGlhZ3JhbSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWNhc2UgVW1hUGFja2FnZS5HUkFQSF9OT0RFOiB7Ci0JCQlHcmFwaE5vZGUgZ3JhcGhOb2RlID0gKEdyYXBoTm9kZSkgdGhlRU9iamVjdDsKLQkJCVQgcmVzdWx0ID0gY2FzZUdyYXBoTm9kZShncmFwaE5vZGUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VHcmFwaEVsZW1lbnQoZ3JhcGhOb2RlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRGlhZ3JhbUVsZW1lbnQoZ3JhcGhOb2RlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChncmFwaE5vZGUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQoZ3JhcGhOb2RlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KGdyYXBoTm9kZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUVsZW1lbnQoZ3JhcGhOb2RlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJY2FzZSBVbWFQYWNrYWdlLkdSQVBIX0VMRU1FTlQ6IHsKLQkJCUdyYXBoRWxlbWVudCBncmFwaEVsZW1lbnQgPSAoR3JhcGhFbGVtZW50KSB0aGVFT2JqZWN0OwotCQkJVCByZXN1bHQgPSBjYXNlR3JhcGhFbGVtZW50KGdyYXBoRWxlbWVudCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZURpYWdyYW1FbGVtZW50KGdyYXBoRWxlbWVudCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQoZ3JhcGhFbGVtZW50KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KGdyYXBoRWxlbWVudCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChncmFwaEVsZW1lbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KGdyYXBoRWxlbWVudCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWNhc2UgVW1hUGFja2FnZS5ESUFHUkFNX0VMRU1FTlQ6IHsKLQkJCURpYWdyYW1FbGVtZW50IGRpYWdyYW1FbGVtZW50ID0gKERpYWdyYW1FbGVtZW50KSB0aGVFT2JqZWN0OwotCQkJVCByZXN1bHQgPSBjYXNlRGlhZ3JhbUVsZW1lbnQoZGlhZ3JhbUVsZW1lbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KGRpYWdyYW1FbGVtZW50KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KGRpYWdyYW1FbGVtZW50KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KGRpYWdyYW1FbGVtZW50KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRWxlbWVudChkaWFncmFtRWxlbWVudCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWNhc2UgVW1hUGFja2FnZS5SRUZFUkVOQ0U6IHsKLQkJCVJlZmVyZW5jZSByZWZlcmVuY2UgPSAoUmVmZXJlbmNlKSB0aGVFT2JqZWN0OwotCQkJVCByZXN1bHQgPSBjYXNlUmVmZXJlbmNlKHJlZmVyZW5jZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZURpYWdyYW1FbGVtZW50KHJlZmVyZW5jZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQocmVmZXJlbmNlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KHJlZmVyZW5jZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChyZWZlcmVuY2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KHJlZmVyZW5jZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9QRVJUWTogewotCQkJUHJvcGVydHkgcHJvcGVydHkgPSAoUHJvcGVydHkpIHRoZUVPYmplY3Q7Ci0JCQlUIHJlc3VsdCA9IGNhc2VQcm9wZXJ0eShwcm9wZXJ0eSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZURpYWdyYW1FbGVtZW50KHByb3BlcnR5KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChwcm9wZXJ0eSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChwcm9wZXJ0eSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChwcm9wZXJ0eSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUVsZW1lbnQocHJvcGVydHkpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuUE9JTlQ6IHsKLQkJCVBvaW50IHBvaW50ID0gKFBvaW50KSB0aGVFT2JqZWN0OwotCQkJVCByZXN1bHQgPSBjYXNlUG9pbnQocG9pbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuRElBR1JBTV9MSU5LOiB7Ci0JCQlEaWFncmFtTGluayBkaWFncmFtTGluayA9IChEaWFncmFtTGluaykgdGhlRU9iamVjdDsKLQkJCVQgcmVzdWx0ID0gY2FzZURpYWdyYW1MaW5rKGRpYWdyYW1MaW5rKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRGlhZ3JhbUVsZW1lbnQoZGlhZ3JhbUxpbmspOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KGRpYWdyYW1MaW5rKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KGRpYWdyYW1MaW5rKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KGRpYWdyYW1MaW5rKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRWxlbWVudChkaWFncmFtTGluayk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWNhc2UgVW1hUGFja2FnZS5HUkFQSF9DT05ORUNUT1I6IHsKLQkJCUdyYXBoQ29ubmVjdG9yIGdyYXBoQ29ubmVjdG9yID0gKEdyYXBoQ29ubmVjdG9yKSB0aGVFT2JqZWN0OwotCQkJVCByZXN1bHQgPSBjYXNlR3JhcGhDb25uZWN0b3IoZ3JhcGhDb25uZWN0b3IpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VHcmFwaEVsZW1lbnQoZ3JhcGhDb25uZWN0b3IpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VEaWFncmFtRWxlbWVudChncmFwaENvbm5lY3Rvcik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQoZ3JhcGhDb25uZWN0b3IpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQoZ3JhcGhDb25uZWN0b3IpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQoZ3JhcGhDb25uZWN0b3IpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KGdyYXBoQ29ubmVjdG9yKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJY2FzZSBVbWFQYWNrYWdlLkdSQVBIX0VER0U6IHsKLQkJCUdyYXBoRWRnZSBncmFwaEVkZ2UgPSAoR3JhcGhFZGdlKSB0aGVFT2JqZWN0OwotCQkJVCByZXN1bHQgPSBjYXNlR3JhcGhFZGdlKGdyYXBoRWRnZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUdyYXBoRWxlbWVudChncmFwaEVkZ2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VEaWFncmFtRWxlbWVudChncmFwaEVkZ2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KGdyYXBoRWRnZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChncmFwaEVkZ2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQoZ3JhcGhFZGdlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRWxlbWVudChncmFwaEVkZ2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuU0VNQU5USUNfTU9ERUxfQlJJREdFOiB7Ci0JCQlTZW1hbnRpY01vZGVsQnJpZGdlIHNlbWFudGljTW9kZWxCcmlkZ2UgPSAoU2VtYW50aWNNb2RlbEJyaWRnZSkgdGhlRU9iamVjdDsKLQkJCVQgcmVzdWx0ID0gY2FzZVNlbWFudGljTW9kZWxCcmlkZ2Uoc2VtYW50aWNNb2RlbEJyaWRnZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZURpYWdyYW1FbGVtZW50KHNlbWFudGljTW9kZWxCcmlkZ2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KHNlbWFudGljTW9kZWxCcmlkZ2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQoc2VtYW50aWNNb2RlbEJyaWRnZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChzZW1hbnRpY01vZGVsQnJpZGdlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRWxlbWVudChzZW1hbnRpY01vZGVsQnJpZGdlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJY2FzZSBVbWFQYWNrYWdlLkRJTUVOU0lPTjogewotCQkJRGltZW5zaW9uIGRpbWVuc2lvbiA9IChEaW1lbnNpb24pIHRoZUVPYmplY3Q7Ci0JCQlUIHJlc3VsdCA9IGNhc2VEaW1lbnNpb24oZGltZW5zaW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRTogewotCQkJUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSBwcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlID0gKFByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UpIHRoZUVPYmplY3Q7Ci0JCQlUIHJlc3VsdCA9IGNhc2VQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlKHByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VCcmVha2Rvd25FbGVtZW50KHByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQcm9jZXNzRWxlbWVudChwcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRGVzY3JpYmFibGVFbGVtZW50KHByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KHByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VDbGFzc2lmaWVyKHByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQocHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVR5cGUocHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChwcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRWxlbWVudChwcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJY2FzZSBVbWFQYWNrYWdlLlNJTVBMRV9TRU1BTlRJQ19NT0RFTF9FTEVNRU5UOiB7Ci0JCQlTaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudCBzaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudCA9IChTaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudCkgdGhlRU9iamVjdDsKLQkJCVQgcmVzdWx0ID0gY2FzZVNpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50KHNpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlU2VtYW50aWNNb2RlbEJyaWRnZShzaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZURpYWdyYW1FbGVtZW50KHNpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChzaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChzaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChzaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUVsZW1lbnQoc2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuVU1BX1NFTUFOVElDX01PREVMX0JSSURHRTogewotCQkJVU1BU2VtYW50aWNNb2RlbEJyaWRnZSB1bWFTZW1hbnRpY01vZGVsQnJpZGdlID0gKFVNQVNlbWFudGljTW9kZWxCcmlkZ2UpIHRoZUVPYmplY3Q7Ci0JCQlUIHJlc3VsdCA9IGNhc2VVTUFTZW1hbnRpY01vZGVsQnJpZGdlKHVtYVNlbWFudGljTW9kZWxCcmlkZ2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VTZW1hbnRpY01vZGVsQnJpZGdlKHVtYVNlbWFudGljTW9kZWxCcmlkZ2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VEaWFncmFtRWxlbWVudCh1bWFTZW1hbnRpY01vZGVsQnJpZGdlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudCh1bWFTZW1hbnRpY01vZGVsQnJpZGdlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KHVtYVNlbWFudGljTW9kZWxCcmlkZ2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQodW1hU2VtYW50aWNNb2RlbEJyaWRnZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUVsZW1lbnQodW1hU2VtYW50aWNNb2RlbEJyaWRnZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWNhc2UgVW1hUGFja2FnZS5DT1JFX1NFTUFOVElDX01PREVMX0JSSURHRTogewotCQkJQ29yZVNlbWFudGljTW9kZWxCcmlkZ2UgY29yZVNlbWFudGljTW9kZWxCcmlkZ2UgPSAoQ29yZVNlbWFudGljTW9kZWxCcmlkZ2UpIHRoZUVPYmplY3Q7Ci0JCQlUIHJlc3VsdCA9IGNhc2VDb3JlU2VtYW50aWNNb2RlbEJyaWRnZShjb3JlU2VtYW50aWNNb2RlbEJyaWRnZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVNlbWFudGljTW9kZWxCcmlkZ2UoY29yZVNlbWFudGljTW9kZWxCcmlkZ2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VEaWFncmFtRWxlbWVudChjb3JlU2VtYW50aWNNb2RlbEJyaWRnZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQoY29yZVNlbWFudGljTW9kZWxCcmlkZ2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQoY29yZVNlbWFudGljTW9kZWxCcmlkZ2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQoY29yZVNlbWFudGljTW9kZWxCcmlkZ2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KGNvcmVTZW1hbnRpY01vZGVsQnJpZGdlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJY2FzZSBVbWFQYWNrYWdlLkxFQUZfRUxFTUVOVDogewotCQkJTGVhZkVsZW1lbnQgbGVhZkVsZW1lbnQgPSAoTGVhZkVsZW1lbnQpIHRoZUVPYmplY3Q7Ci0JCQlUIHJlc3VsdCA9IGNhc2VMZWFmRWxlbWVudChsZWFmRWxlbWVudCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZURpYWdyYW1FbGVtZW50KGxlYWZFbGVtZW50KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChsZWFmRWxlbWVudCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChsZWFmRWxlbWVudCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChsZWFmRWxlbWVudCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUVsZW1lbnQobGVhZkVsZW1lbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuVEVYVF9FTEVNRU5UOiB7Ci0JCQlUZXh0RWxlbWVudCB0ZXh0RWxlbWVudCA9IChUZXh0RWxlbWVudCkgdGhlRU9iamVjdDsKLQkJCVQgcmVzdWx0ID0gY2FzZVRleHRFbGVtZW50KHRleHRFbGVtZW50KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTGVhZkVsZW1lbnQodGV4dEVsZW1lbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VEaWFncmFtRWxlbWVudCh0ZXh0RWxlbWVudCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQodGV4dEVsZW1lbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQodGV4dEVsZW1lbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQodGV4dEVsZW1lbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KHRleHRFbGVtZW50KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJY2FzZSBVbWFQYWNrYWdlLklNQUdFOiB7Ci0JCQlJbWFnZSBpbWFnZSA9IChJbWFnZSkgdGhlRU9iamVjdDsKLQkJCVQgcmVzdWx0ID0gY2FzZUltYWdlKGltYWdlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTGVhZkVsZW1lbnQoaW1hZ2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VEaWFncmFtRWxlbWVudChpbWFnZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQoaW1hZ2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQoaW1hZ2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQoaW1hZ2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KGltYWdlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJY2FzZSBVbWFQYWNrYWdlLkdSQVBISUNfUFJJTUlUSVZFOiB7Ci0JCQlHcmFwaGljUHJpbWl0aXZlIGdyYXBoaWNQcmltaXRpdmUgPSAoR3JhcGhpY1ByaW1pdGl2ZSkgdGhlRU9iamVjdDsKLQkJCVQgcmVzdWx0ID0gY2FzZUdyYXBoaWNQcmltaXRpdmUoZ3JhcGhpY1ByaW1pdGl2ZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUxlYWZFbGVtZW50KGdyYXBoaWNQcmltaXRpdmUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VEaWFncmFtRWxlbWVudChncmFwaGljUHJpbWl0aXZlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChncmFwaGljUHJpbWl0aXZlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KGdyYXBoaWNQcmltaXRpdmUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQoZ3JhcGhpY1ByaW1pdGl2ZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUVsZW1lbnQoZ3JhcGhpY1ByaW1pdGl2ZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWNhc2UgVW1hUGFja2FnZS5QT0xZTElORTogewotCQkJUG9seWxpbmUgcG9seWxpbmUgPSAoUG9seWxpbmUpIHRoZUVPYmplY3Q7Ci0JCQlUIHJlc3VsdCA9IGNhc2VQb2x5bGluZShwb2x5bGluZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUdyYXBoaWNQcmltaXRpdmUocG9seWxpbmUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VMZWFmRWxlbWVudChwb2x5bGluZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZURpYWdyYW1FbGVtZW50KHBvbHlsaW5lKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChwb2x5bGluZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChwb2x5bGluZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChwb2x5bGluZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUVsZW1lbnQocG9seWxpbmUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuRUxMSVBTRTogewotCQkJRWxsaXBzZSBlbGxpcHNlID0gKEVsbGlwc2UpIHRoZUVPYmplY3Q7Ci0JCQlUIHJlc3VsdCA9IGNhc2VFbGxpcHNlKGVsbGlwc2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VHcmFwaGljUHJpbWl0aXZlKGVsbGlwc2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VMZWFmRWxlbWVudChlbGxpcHNlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRGlhZ3JhbUVsZW1lbnQoZWxsaXBzZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQoZWxsaXBzZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChlbGxpcHNlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KGVsbGlwc2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KGVsbGlwc2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19GQU1JTFk6IHsKLQkJCVByb2Nlc3NGYW1pbHkgcHJvY2Vzc0ZhbWlseSA9IChQcm9jZXNzRmFtaWx5KSB0aGVFT2JqZWN0OwotCQkJVCByZXN1bHQgPSBjYXNlUHJvY2Vzc0ZhbWlseShwcm9jZXNzRmFtaWx5KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kQ29uZmlndXJhdGlvbihwcm9jZXNzRmFtaWx5KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kVW5pdChwcm9jZXNzRmFtaWx5KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChwcm9jZXNzRmFtaWx5KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KHByb2Nlc3NGYW1pbHkpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQocHJvY2Vzc0ZhbWlseSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUVsZW1lbnQocHJvY2Vzc0ZhbWlseSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfTElCUkFSWTogewotCQkJTWV0aG9kTGlicmFyeSBtZXRob2RMaWJyYXJ5ID0gKE1ldGhvZExpYnJhcnkpIHRoZUVPYmplY3Q7Ci0JCQlUIHJlc3VsdCA9IGNhc2VNZXRob2RMaWJyYXJ5KG1ldGhvZExpYnJhcnkpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RVbml0KG1ldGhvZExpYnJhcnkpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQYWNrYWdlKG1ldGhvZExpYnJhcnkpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KG1ldGhvZExpYnJhcnkpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lc3BhY2UobWV0aG9kTGlicmFyeSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChtZXRob2RMaWJyYXJ5KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KG1ldGhvZExpYnJhcnkpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KG1ldGhvZExpYnJhcnkpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQlkZWZhdWx0OgotCQkJcmV0dXJuIGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Q2xhc3NpZmllcjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkNsYXNzaWZpZXI8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VDbGFzc2lmaWVyKENsYXNzaWZpZXIgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlR5cGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5UeXBlPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlVHlwZShUeXBlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FbGVtZW50PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RWxlbWVudDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZUVsZW1lbnQoRWxlbWVudCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TmFtZWQgRWxlbWVudDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk5hbWVkIEVsZW1lbnQ8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VOYW1lZEVsZW1lbnQoTmFtZWRFbGVtZW50IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5QYWNrYWdlYWJsZSBFbGVtZW50PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UGFja2FnZWFibGUgRWxlbWVudDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZVBhY2thZ2VhYmxlRWxlbWVudChQYWNrYWdlYWJsZUVsZW1lbnQgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlBhY2thZ2U8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5QYWNrYWdlPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlUGFja2FnZShvcmcuZWNsaXBzZS5lcGYudW1hLlBhY2thZ2Ugb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk5hbWVzcGFjZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk5hbWVzcGFjZTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZU5hbWVzcGFjZShOYW1lc3BhY2Ugb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk1ldGhvZCBFbGVtZW50PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TWV0aG9kIEVsZW1lbnQ8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VNZXRob2RFbGVtZW50KE1ldGhvZEVsZW1lbnQgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkNvbnN0cmFpbnQ8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Db25zdHJhaW50PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlQ29uc3RyYWludChDb25zdHJhaW50IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlTWV0aG9kRWxlbWVudFByb3BlcnR5KE1ldGhvZEVsZW1lbnRQcm9wZXJ0eSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+S2luZDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPktpbmQ8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VLaW5kKEtpbmQgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkNvbnRlbnQgRWxlbWVudDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkNvbnRlbnQgRWxlbWVudDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZUNvbnRlbnRFbGVtZW50KENvbnRlbnRFbGVtZW50IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5EZXNjcmliYWJsZSBFbGVtZW50PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RGVzY3JpYmFibGUgRWxlbWVudDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZURlc2NyaWJhYmxlRWxlbWVudChEZXNjcmliYWJsZUVsZW1lbnQgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkNvbnRlbnQgRGVzY3JpcHRpb248L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Db250ZW50IERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlQ29udGVudERlc2NyaXB0aW9uKENvbnRlbnREZXNjcmlwdGlvbiBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+U2VjdGlvbjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlNlY3Rpb248L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VTZWN0aW9uKFNlY3Rpb24gb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlJvbGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Sb2xlPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlUm9sZShSb2xlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Xb3JrIFByb2R1Y3Q8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Xb3JrIFByb2R1Y3Q8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VXb3JrUHJvZHVjdChXb3JrUHJvZHVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RnVsZmlsbGFibGUgRWxlbWVudDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkZ1bGZpbGxhYmxlIEVsZW1lbnQ8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VGdWxmaWxsYWJsZUVsZW1lbnQoRnVsZmlsbGFibGVFbGVtZW50IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5UYXNrPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+VGFzazwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZVRhc2soVGFzayBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+V29yayBEZWZpbml0aW9uPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+V29yayBEZWZpbml0aW9uPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlV29ya0RlZmluaXRpb24oV29ya0RlZmluaXRpb24gb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlN0ZXA8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5TdGVwPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlU3RlcChTdGVwIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5HdWlkYW5jZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkd1aWRhbmNlPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlR3VpZGFuY2UoR3VpZGFuY2Ugb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkFydGlmYWN0PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+QXJ0aWZhY3Q8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VBcnRpZmFjdChBcnRpZmFjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RGVsaXZlcmFibGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5EZWxpdmVyYWJsZTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZURlbGl2ZXJhYmxlKERlbGl2ZXJhYmxlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5PdXRjb21lPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+T3V0Y29tZTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZU91dGNvbWUoT3V0Y29tZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TWV0aG9kIFBhY2thZ2U8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5NZXRob2QgUGFja2FnZTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZU1ldGhvZFBhY2thZ2UoTWV0aG9kUGFja2FnZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Q29udGVudCBQYWNrYWdlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Q29udGVudCBQYWNrYWdlPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlQ29udGVudFBhY2thZ2UoQ29udGVudFBhY2thZ2Ugb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkFydGlmYWN0IERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+QXJ0aWZhY3QgRGVzY3JpcHRpb248L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VBcnRpZmFjdERlc2NyaXB0aW9uKEFydGlmYWN0RGVzY3JpcHRpb24gb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPldvcmsgUHJvZHVjdCBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPldvcmsgUHJvZHVjdCBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZVdvcmtQcm9kdWN0RGVzY3JpcHRpb24oV29ya1Byb2R1Y3REZXNjcmlwdGlvbiBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RGVsaXZlcmFibGUgRGVzY3JpcHRpb248L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5EZWxpdmVyYWJsZSBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZURlbGl2ZXJhYmxlRGVzY3JpcHRpb24oRGVsaXZlcmFibGVEZXNjcmlwdGlvbiBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Um9sZSBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlJvbGUgRGVzY3JpcHRpb248L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VSb2xlRGVzY3JpcHRpb24oUm9sZURlc2NyaXB0aW9uIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5UYXNrIERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+VGFzayBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZVRhc2tEZXNjcmlwdGlvbihUYXNrRGVzY3JpcHRpb24gb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkd1aWRhbmNlIERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+R3VpZGFuY2UgRGVzY3JpcHRpb248L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VHdWlkYW5jZURlc2NyaXB0aW9uKEd1aWRhbmNlRGVzY3JpcHRpb24gb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlByYWN0aWNlIERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UHJhY3RpY2UgRGVzY3JpcHRpb248L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VQcmFjdGljZURlc2NyaXB0aW9uKFByYWN0aWNlRGVzY3JpcHRpb24gb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkFjdGl2aXR5PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+QWN0aXZpdHk8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VBY3Rpdml0eShBY3Rpdml0eSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+V29yayBCcmVha2Rvd24gRWxlbWVudDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPldvcmsgQnJlYWtkb3duIEVsZW1lbnQ8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VXb3JrQnJlYWtkb3duRWxlbWVudChXb3JrQnJlYWtkb3duRWxlbWVudCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+QnJlYWtkb3duIEVsZW1lbnQ8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5CcmVha2Rvd24gRWxlbWVudDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZUJyZWFrZG93bkVsZW1lbnQoQnJlYWtkb3duRWxlbWVudCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TWlsZXN0b25lPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TWlsZXN0b25lPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlTWlsZXN0b25lKE1pbGVzdG9uZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SXRlcmF0aW9uPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SXRlcmF0aW9uPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlSXRlcmF0aW9uKEl0ZXJhdGlvbiBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UGhhc2U8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5QaGFzZTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZVBoYXNlKFBoYXNlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5UZWFtIFByb2ZpbGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5UZWFtIFByb2ZpbGU8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VUZWFtUHJvZmlsZShUZWFtUHJvZmlsZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Um9sZSBEZXNjcmlwdG9yPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Um9sZSBEZXNjcmlwdG9yPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlUm9sZURlc2NyaXB0b3IoUm9sZURlc2NyaXB0b3Igb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPldvcmsgT3JkZXI8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Xb3JrIE9yZGVyPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlV29ya09yZGVyKFdvcmtPcmRlciBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UHJvY2VzcyBFbGVtZW50PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UHJvY2VzcyBFbGVtZW50PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlUHJvY2Vzc0VsZW1lbnQoUHJvY2Vzc0VsZW1lbnQgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlBsYW5uaW5nIERhdGE8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5QbGFubmluZyBEYXRhPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlUGxhbm5pbmdEYXRhKFBsYW5uaW5nRGF0YSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RGVzY3JpcHRvcjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkRlc2NyaXB0b3I8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VEZXNjcmlwdG9yKERlc2NyaXB0b3Igb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlRhc2sgRGVzY3JpcHRvcjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlRhc2sgRGVzY3JpcHRvcjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZVRhc2tEZXNjcmlwdG9yKFRhc2tEZXNjcmlwdG9yIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Xb3JrIFByb2R1Y3QgRGVzY3JpcHRvcjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPldvcmsgUHJvZHVjdCBEZXNjcmlwdG9yPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlV29ya1Byb2R1Y3REZXNjcmlwdG9yKFdvcmtQcm9kdWN0RGVzY3JpcHRvciBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Q29tcG9zaXRlIFJvbGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Db21wb3NpdGUgUm9sZTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZUNvbXBvc2l0ZVJvbGUoQ29tcG9zaXRlUm9sZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+QnJlYWtkb3duIEVsZW1lbnQgRGVzY3JpcHRpb248L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5CcmVha2Rvd24gRWxlbWVudCBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZUJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbihCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24gb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkFjdGl2aXR5IERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+QWN0aXZpdHkgRGVzY3JpcHRpb248L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VBY3Rpdml0eURlc2NyaXB0aW9uKEFjdGl2aXR5RGVzY3JpcHRpb24gb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkRlbGl2ZXJ5IFByb2Nlc3MgRGVzY3JpcHRpb248L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5EZWxpdmVyeSBQcm9jZXNzIERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24oRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24gb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlByb2Nlc3MgRGVzY3JpcHRpb248L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Qcm9jZXNzIERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlUHJvY2Vzc0Rlc2NyaXB0aW9uKFByb2Nlc3NEZXNjcmlwdGlvbiBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RGVzY3JpcHRvciBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkRlc2NyaXB0b3IgRGVzY3JpcHRpb248L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VEZXNjcmlwdG9yRGVzY3JpcHRpb24oRGVzY3JpcHRvckRlc2NyaXB0aW9uIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Db25jZXB0PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Q29uY2VwdDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZUNvbmNlcHQoQ29uY2VwdCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Q2hlY2tsaXN0PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Q2hlY2tsaXN0PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlQ2hlY2tsaXN0KENoZWNrbGlzdCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RXhhbXBsZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkV4YW1wbGU8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VFeGFtcGxlKEV4YW1wbGUgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkd1aWRlbGluZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkd1aWRlbGluZTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZUd1aWRlbGluZShHdWlkZWxpbmUgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVzdGltYXRpb24gQ29uc2lkZXJhdGlvbnM8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Fc3RpbWF0aW9uIENvbnNpZGVyYXRpb25zPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKEVzdGltYXRpb25Db25zaWRlcmF0aW9ucyBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UmVwb3J0PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UmVwb3J0PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlUmVwb3J0KFJlcG9ydCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+VGVtcGxhdGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5UZW1wbGF0ZTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZVRlbXBsYXRlKFRlbXBsYXRlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5TdXBwb3J0aW5nIE1hdGVyaWFsPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+U3VwcG9ydGluZyBNYXRlcmlhbDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZVN1cHBvcnRpbmdNYXRlcmlhbChTdXBwb3J0aW5nTWF0ZXJpYWwgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlRvb2wgTWVudG9yPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+VG9vbCBNZW50b3I8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VUb29sTWVudG9yKFRvb2xNZW50b3Igb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPldoaXRlcGFwZXI8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5XaGl0ZXBhcGVyPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlV2hpdGVwYXBlcihXaGl0ZXBhcGVyIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5UZXJtIERlZmluaXRpb248L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5UZXJtIERlZmluaXRpb248L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VUZXJtRGVmaW5pdGlvbihUZXJtRGVmaW5pdGlvbiBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+QXBwbGljYWJsZSBNZXRhIENsYXNzIEluZm88L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5BcHBsaWNhYmxlIE1ldGEgQ2xhc3MgSW5mbzwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZUFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvKEFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5QcmFjdGljZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlByYWN0aWNlPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlUHJhY3RpY2UoUHJhY3RpY2Ugb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlJldXNhYmxlIEFzc2V0PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UmV1c2FibGUgQXNzZXQ8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VSZXVzYWJsZUFzc2V0KFJldXNhYmxlQXNzZXQgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkRpc2NpcGxpbmU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5EaXNjaXBsaW5lPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlRGlzY2lwbGluZShEaXNjaXBsaW5lIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Db250ZW50IENhdGVnb3J5PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Q29udGVudCBDYXRlZ29yeTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZUNvbnRlbnRDYXRlZ29yeShDb250ZW50Q2F0ZWdvcnkgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlJvbGUgU2V0PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Um9sZSBTZXQ8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VSb2xlU2V0KFJvbGVTZXQgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkRvbWFpbjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkRvbWFpbjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZURvbWFpbihEb21haW4gb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPldvcmsgUHJvZHVjdCBUeXBlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+V29yayBQcm9kdWN0IFR5cGU8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VXb3JrUHJvZHVjdFR5cGUoV29ya1Byb2R1Y3RUeXBlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5EaXNjaXBsaW5lIEdyb3VwaW5nPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RGlzY2lwbGluZSBHcm91cGluZzwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZURpc2NpcGxpbmVHcm91cGluZyhEaXNjaXBsaW5lR3JvdXBpbmcgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlRvb2w8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Ub29sPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlVG9vbChUb29sIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Sb2xlIFNldCBHcm91cGluZzwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlJvbGUgU2V0IEdyb3VwaW5nPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlUm9sZVNldEdyb3VwaW5nKFJvbGVTZXRHcm91cGluZyBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Q3VzdG9tIENhdGVnb3J5PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Q3VzdG9tIENhdGVnb3J5PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlQ3VzdG9tQ2F0ZWdvcnkoQ3VzdG9tQ2F0ZWdvcnkgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkRlbGl2ZXJ5IFByb2Nlc3M8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5EZWxpdmVyeSBQcm9jZXNzPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlRGVsaXZlcnlQcm9jZXNzKERlbGl2ZXJ5UHJvY2VzcyBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UHJvY2VzczwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlByb2Nlc3M8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VQcm9jZXNzKG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzcyBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Q2FwYWJpbGl0eSBQYXR0ZXJuPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Q2FwYWJpbGl0eSBQYXR0ZXJuPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlQ2FwYWJpbGl0eVBhdHRlcm4oQ2FwYWJpbGl0eVBhdHRlcm4gb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlByb2Nlc3MgUGxhbm5pbmcgVGVtcGxhdGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Qcm9jZXNzIFBsYW5uaW5nIFRlbXBsYXRlPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUoUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlJvYWRtYXA8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Sb2FkbWFwPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlUm9hZG1hcChSb2FkbWFwIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Qcm9jZXNzIENvbXBvbmVudDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlByb2Nlc3MgQ29tcG9uZW50PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlUHJvY2Vzc0NvbXBvbmVudChQcm9jZXNzQ29tcG9uZW50IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Qcm9jZXNzIFBhY2thZ2U8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Qcm9jZXNzIFBhY2thZ2U8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VQcm9jZXNzUGFja2FnZShQcm9jZXNzUGFja2FnZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UHJvY2VzcyBDb21wb25lbnQgSW50ZXJmYWNlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UHJvY2VzcyBDb21wb25lbnQgSW50ZXJmYWNlPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZShQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Qcm9jZXNzIENvbXBvbmVudCBEZXNjcmlwdG9yPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UHJvY2VzcyBDb21wb25lbnQgRGVzY3JpcHRvcjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZVByb2Nlc3NDb21wb25lbnREZXNjcmlwdG9yKFByb2Nlc3NDb21wb25lbnREZXNjcmlwdG9yIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5NZXRob2QgUGx1Z2luPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TWV0aG9kIFBsdWdpbjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZU1ldGhvZFBsdWdpbihNZXRob2RQbHVnaW4gb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlZhcmlhYmlsaXR5IEVsZW1lbnQ8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5WYXJpYWJpbGl0eSBFbGVtZW50PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlVmFyaWFiaWxpdHlFbGVtZW50KFZhcmlhYmlsaXR5RWxlbWVudCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TWV0aG9kIFVuaXQ8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5NZXRob2QgVW5pdDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZU1ldGhvZFVuaXQoTWV0aG9kVW5pdCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TWV0aG9kIENvbmZpZ3VyYXRpb248L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5NZXRob2QgQ29uZmlndXJhdGlvbjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZU1ldGhvZENvbmZpZ3VyYXRpb24oTWV0aG9kQ29uZmlndXJhdGlvbiBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UHJvY2VzcyBGYW1pbHk8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Qcm9jZXNzIEZhbWlseTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZVByb2Nlc3NGYW1pbHkoUHJvY2Vzc0ZhbWlseSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TWV0aG9kIExpYnJhcnk8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5NZXRob2QgTGlicmFyeTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZU1ldGhvZExpYnJhcnkoTWV0aG9kTGlicmFyeSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UG9pbnQ8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Qb2ludDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZVBvaW50KFBvaW50IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5HcmFwaCBFbGVtZW50PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+R3JhcGggRWxlbWVudDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZUdyYXBoRWxlbWVudChHcmFwaEVsZW1lbnQgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkRpYWdyYW0gRWxlbWVudDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkRpYWdyYW0gRWxlbWVudDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZURpYWdyYW1FbGVtZW50KERpYWdyYW1FbGVtZW50IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5EaWFncmFtIExpbms8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5EaWFncmFtIExpbms8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VEaWFncmFtTGluayhEaWFncmFtTGluayBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+R3JhcGggQ29ubmVjdG9yPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+R3JhcGggQ29ubmVjdG9yPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlR3JhcGhDb25uZWN0b3IoR3JhcGhDb25uZWN0b3Igb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlNlbWFudGljIE1vZGVsIEJyaWRnZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlNlbWFudGljIE1vZGVsIEJyaWRnZTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZVNlbWFudGljTW9kZWxCcmlkZ2UoU2VtYW50aWNNb2RlbEJyaWRnZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RGltZW5zaW9uPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RGltZW5zaW9uPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlRGltZW5zaW9uKERpbWVuc2lvbiBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UmVmZXJlbmNlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UmVmZXJlbmNlPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlUmVmZXJlbmNlKFJlZmVyZW5jZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UHJvcGVydHk8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Qcm9wZXJ0eTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZVByb3BlcnR5KFByb3BlcnR5IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5HcmFwaCBFZGdlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+R3JhcGggRWRnZTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZUdyYXBoRWRnZShHcmFwaEVkZ2Ugb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkRpYWdyYW08L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5EaWFncmFtPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlRGlhZ3JhbShEaWFncmFtIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5HcmFwaCBOb2RlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+R3JhcGggTm9kZTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZUdyYXBoTm9kZShHcmFwaE5vZGUgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlNpbXBsZSBTZW1hbnRpYyBNb2RlbCBFbGVtZW50PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+U2ltcGxlIFNlbWFudGljIE1vZGVsIEVsZW1lbnQ8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VTaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudChTaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+VU1BIFNlbWFudGljIE1vZGVsIEJyaWRnZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlVNQSBTZW1hbnRpYyBNb2RlbCBCcmlkZ2U8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VVTUFTZW1hbnRpY01vZGVsQnJpZGdlKFVNQVNlbWFudGljTW9kZWxCcmlkZ2Ugb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkNvcmUgU2VtYW50aWMgTW9kZWwgQnJpZGdlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Q29yZSBTZW1hbnRpYyBNb2RlbCBCcmlkZ2U8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VDb3JlU2VtYW50aWNNb2RlbEJyaWRnZShDb3JlU2VtYW50aWNNb2RlbEJyaWRnZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TGVhZiBFbGVtZW50PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TGVhZiBFbGVtZW50PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlTGVhZkVsZW1lbnQoTGVhZkVsZW1lbnQgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlRleHQgRWxlbWVudDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlRleHQgRWxlbWVudDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZVRleHRFbGVtZW50KFRleHRFbGVtZW50IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5JbWFnZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkltYWdlPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlSW1hZ2UoSW1hZ2Ugb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkdyYXBoaWMgUHJpbWl0aXZlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+R3JhcGhpYyBQcmltaXRpdmU8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VHcmFwaGljUHJpbWl0aXZlKEdyYXBoaWNQcmltaXRpdmUgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlBvbHlsaW5lPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UG9seWxpbmU8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VQb2x5bGluZShQb2x5bGluZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RWxsaXBzZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVsbGlwc2U8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VFbGxpcHNlKEVsbGlwc2Ugb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVPYmplY3Q8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaCwgYnV0IHRoaXMgaXMgdGhlIGxhc3QgY2FzZSBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RU9iamVjdDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgZGVmYXVsdENhc2UoRU9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19IC8vVW1hU3dpdGNoClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS91dGlsL1VtYVV0aWwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvdXRpbC9VbWFVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0ZGI0MTkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS91dGlsL1VtYVV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgwNyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnNlY3VyaXR5Lk1lc3NhZ2VEaWdlc3Q7Ci1pbXBvcnQgamF2YS5zZWN1cml0eS5Ob1N1Y2hBbGdvcml0aG1FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVHJlZUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVDb250ZW50c0VMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGlzY2lwbGluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpc2NpcGxpbmVHcm91cGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkd1aWRhbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlU2V0R3JvdXBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtPcmRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3RUeXBlOwotCi0vKioKLSAqIFV0aWxpdHkgY2xhc3MgZm9yIGFjY2Vzc2luZyBhbmQgdXBkYXRpbmcgdGhlIFVNQSBtb2RlbCBvYmplY3RzLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBVbWFVdGlsIHsKLQotCS8qKgotCSAqIFJlcGxhY2VzIHRoZSBmZWF0dXJlIHZhbHVlcyBvZiBhbiBvbGQgbWV0aG9kIGVsZW1lbnQgd2l0aCB0aGUKLQkgKiBjb3JyZXNwb25kaW5nIGZlYXR1cmUgdmFsdWVzIG9mIGEgbmV3IG1ldGhvZCBlbGVtZW50LgotCSAqIDxwPgotCSAqIE5vdGU6IEFsbCBmZWF0dXJlcyBhcmUgdXBkYXRlZCBleGNlcHQgZm9yIHRoZSBHVUlEIGZlYXR1cmUuCi0JICogCi0JICogQHBhcmFtIG9sZEVsZW1lbnQKLQkgKiAgICAgICAgICAgIHRoZSBvbGQgbWV0aG9kIGVsZW1lbnQKLQkgKiBAcGFyYW0gbmV3RWxlbWVudAotCSAqICAgICAgICAgICAgdGhlIG5ldyBtZXRob2QgZWxlbWVudAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZXBsYWNlKE1ldGhvZEVsZW1lbnQgb2xkRWxlbWVudCwKLQkJCU1ldGhvZEVsZW1lbnQgbmV3RWxlbWVudCkgewotCQlMaXN0IGZlYXR1cmVzID0gb2xkRWxlbWVudC5lQ2xhc3MoKS5nZXRFQWxsU3RydWN0dXJhbEZlYXR1cmVzKCk7Ci0JCWlmIChmZWF0dXJlcyAhPSBudWxsKSB7Ci0JCQlpbnQgc2l6ZSA9IGZlYXR1cmVzLnNpemUoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSAoRVN0cnVjdHVyYWxGZWF0dXJlKSBmZWF0dXJlcwotCQkJCQkJLmdldChpKTsKLQkJCQlpZiAoZmVhdHVyZSAhPSBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRNZXRob2RFbGVtZW50X0d1aWQoKSkgewotCQkJCQkvLyBkb24ndCByZXBsYWNlIEdVSUQKLQkJCQkJT2JqZWN0IG5ld1ZhbHVlID0gbmV3RWxlbWVudC5lR2V0KGZlYXR1cmUpOwotCQkJCQlvbGRFbGVtZW50LmVTZXQoZmVhdHVyZSwgbmV3VmFsdWUpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JfQotCi0JLyoqCi0JICogQ2hlY2tzIHdoZXRoZXIgYSBtb2RlbCBvYmplY3QgaGFzIGEgZGlyZWN0IHJlc291cmNlLgotCSAqIAotCSAqIEBwYXJhbSBlCi0JICogICAgICAgICAgICBhIG1vZGVsIG9iamVjdAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHNwZWNpZmllZCBtb2RlbCBvYmplY3QgaXMgY29udGFpbmVkIGJ5Ci0JICogICAgICAgICBhIHJlc291cmNlCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGhhc0RpcmVjdFJlc291cmNlKEVPYmplY3QgZSkgewotCQlSZXNvdXJjZSByZXNvdXJjZSA9IGUuZVJlc291cmNlKCk7Ci0JCXJldHVybiAocmVzb3VyY2UgIT0gbnVsbCAmJiByZXNvdXJjZS5nZXRDb250ZW50cygpLmNvbnRhaW5zKGUpKTsKLQl9Ci0JCi0JLyoqCi0JICogR2V0cyBhbGwgcmVzb3VyY2VzIG93bmVkIGJ5IHRoZSBzcGVjaWZpZWQgb2JqZWN0LgotCSAqIAotCSAqIEBwYXJhbSBlCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ29sbGVjdGlvbjxSZXNvdXJjZT4gZ2V0UmVzb3VyY2VzKEVPYmplY3QgZSkgewotCQlIYXNoU2V0PFJlc291cmNlPiByZXNvdXJjZXMgPSBuZXcgSGFzaFNldDxSZXNvdXJjZT4oKTsKLQkJZ2V0UmVzb3VyY2VzKGUsIHJlc291cmNlcyk7Ci0JCXJldHVybiByZXNvdXJjZXM7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBnZXRSZXNvdXJjZXMoRU9iamVjdCBlLCBDb2xsZWN0aW9uPFJlc291cmNlPiByZXNvdXJjZXMpIHsKLQkJaWYgKFVtYVV0aWwuaGFzRGlyZWN0UmVzb3VyY2UoZSkpIHsKLQkJCXJlc291cmNlcy5hZGQoZS5lUmVzb3VyY2UoKSk7Ci0JCX0gZWxzZSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBlLmVDb250ZW50cygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCWdldFJlc291cmNlcygoRU9iamVjdCkgaXRlci5uZXh0KCksIHJlc291cmNlcyk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBHZXRzIGEgc3BlY2lmaWMgdHlwZSBvZiBhZGFwdGVyIGFzc29jaWF0ZWQgd2l0aCBhIG5vdGlmaWVyLgotCSAqIAotCSAqIEBwYXJhbSBlT2JqCi0JICogICAgICAgICAgICBhIG5vdGlmaWVyCi0JICogQHBhcmFtIGNscwotCSAqICAgICAgICAgICAgdGhlIGFkYXB0ZXIgY2xhc3MKLQkgKiBAcmV0dXJuIGFuIDxjb2RlPkFkYXB0ZXI8Y29kZT4gb2JqZWN0IG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBPYmplY3QgZ2V0QWRhcHRlcihFT2JqZWN0IGVPYmosIENsYXNzIGNscykgewotCQlmb3IgKEl0ZXJhdG9yIGFkYXB0ZXJzID0gZU9iai5lQWRhcHRlcnMoKS5pdGVyYXRvcigpOyBhZGFwdGVycwotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQlBZGFwdGVyIGFkYXB0ZXIgPSAoQWRhcHRlcikgYWRhcHRlcnMubmV4dCgpOwotCQkJaWYgKGNscy5pc0luc3RhbmNlKGFkYXB0ZXIpKSB7Ci0JCQkJcmV0dXJuIGFkYXB0ZXI7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qKgotCSAqIFJlbW92ZXMgYWxsIGFkYXB0ZXJzIG9mIHRoZSBzcGVjaWZpZWQgb2JqZWN0IGFuZCBhbGwgb2YgaXRzIGNoaWxkcmVuLgotCSAqIAotCSAqIEBwYXJhbSBlT2JqZWN0Ci0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZUFsbEFkYXB0ZXJzKEVPYmplY3QgZU9iamVjdCkgewotCQlmb3IgKFRyZWVJdGVyYXRvcjxFT2JqZWN0PiBpdGVyID0gZU9iamVjdC5lQWxsQ29udGVudHMoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlFT2JqZWN0IG8gPSBpdGVyLm5leHQoKTsKLQkJCW8uZUFkYXB0ZXJzKCkuY2xlYXIoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIG1ldGhvZCBwYWNrYWdlIHdpdGggYSBzcGVjaWZpYyBuYW1lLgotCSAqIAotCSAqIEBwYXJhbSBtZXRob2RQYWNrYWdlcwotCSAqICAgICAgICAgICAgYSBsaXN0IG9mIG1ldGhvZCBwYWNrYWdlcwotCSAqIEBwYXJhbSBuYW1lCi0JICogICAgICAgICAgICBhIG1ldGhvZCBwYWNrYWdlIG5hbWUKLQkgKiBAcmV0dXJuIGEgbWV0aG9kIHBhY2thZ2Ugd2l0aCB0aGUgbWF0Y2hpbmcgbmFtZSBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTWV0aG9kUGFja2FnZSBmaW5kTWV0aG9kUGFja2FnZShMaXN0IG1ldGhvZFBhY2thZ2VzLAotCQkJU3RyaW5nIG5hbWUpIHsKLQkJZm9yIChpbnQgaSA9IG1ldGhvZFBhY2thZ2VzLnNpemUoKSAtIDE7IGkgPiAtMTsgaS0tKSB7Ci0JCQlPYmplY3Qgb2JqID0gbWV0aG9kUGFja2FnZXMuZ2V0KGkpOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIE1ldGhvZFBhY2thZ2UpIHsKLQkJCQlNZXRob2RQYWNrYWdlIHBrZyA9IChNZXRob2RQYWNrYWdlKSBvYmo7Ci0JCQkJaWYgKG5hbWUuZXF1YWxzKHBrZy5nZXROYW1lKCkpKSB7Ci0JCQkJCXJldHVybiBwa2c7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIG1ldGhvZCBwYWNrYWdlIHdpdGggYSBzcGVjaWZpYyBwYXRoLgotCSAqIAotCSAqIEBwYXJhbSBtZXRob2RQbHVnaW4KLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIHBsdWctaW4KLQkgKiBAcGFyYW0gcGF0aAotCSAqICAgICAgICAgICAgYW4gYXJyYXkgb2YgbWV0aG9kIGVsZW1lbnQgcGF0aCBmcmFnbWVudHMKLQkgKiBAcmV0dXJuIGEgbWV0aG9kIHBhY2thZ2Ugd2l0aCB0aGUgbWF0Y2hpbmcgcGF0aCBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTWV0aG9kUGFja2FnZSBmaW5kTWV0aG9kUGFja2FnZShNZXRob2RQbHVnaW4gbWV0aG9kUGx1Z2luLAotCQkJU3RyaW5nW10gcGF0aCkgewotCQlNZXRob2RQYWNrYWdlIHBrZyA9IG51bGw7Ci0JCUxpc3QgbGlzdCA9IG1ldGhvZFBsdWdpbi5nZXRNZXRob2RQYWNrYWdlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHBhdGgubGVuZ3RoOyBpKyspIHsKLQkJCXBrZyA9IGZpbmRNZXRob2RQYWNrYWdlKGxpc3QsIHBhdGhbaV0pOwotCQkJaWYgKHBrZyA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCQlsaXN0ID0gcGtnLmdldENoaWxkUGFja2FnZXMoKTsKLQkJfQotCQlyZXR1cm4gcGtnOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHBhcmVudCBhY3Rpdml0eSBvZiBhIGJyZWFrZG93biBlbGVtZW50LgotCSAqIAotCSAqIEBwYXJhbSBlCi0JICogICAgICAgICAgICBhIGJyZWFrZG93biBlbGVtZW50Ci0JICogQHJldHVybiB0aGUgcGFyZW50IGFjdGl2aXR5IG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBBY3Rpdml0eSBnZXRQYXJlbnRBY3Rpdml0eShCcmVha2Rvd25FbGVtZW50IGUpIHsKLQkJcmV0dXJuIGUuZ2V0U3VwZXJBY3Rpdml0aWVzKCk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgcGFyZW50IGFjdGl2aXR5IG9mIGEgd29yayBvcmRlci4KLQkgKiAKLQkgKiBAcGFyYW0gd29ya09yZGVyCi0JICogICAgICAgICAgICBhIHdvcmsgb3JkZXIKLQkgKiBAcmV0dXJuIHRoZSBwYXJlbnQgYWN0aXZpdHkgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEFjdGl2aXR5IGdldE93bmluZ0FjdGl2aXR5KFdvcmtPcmRlciB3b3JrT3JkZXIpIHsKLQkJUHJvY2Vzc1BhY2thZ2UgcGtnID0gKFByb2Nlc3NQYWNrYWdlKSB3b3JrT3JkZXIuZUNvbnRhaW5lcigpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBwa2cuZ2V0UHJvY2Vzc0VsZW1lbnRzKCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZWxlbWVudCA9IGl0ZXIubmV4dCgpOwotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCXJldHVybiAoQWN0aXZpdHkpIGVsZW1lbnQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgY29udGVudCBwYWNrYWdlIHdpdGggYSBzcGVjaWZpYyBuYW1lLgotCSAqIAotCSAqIEBwYXJhbSBtZXRob2RQYWNrYWdlcwotCSAqICAgICAgICAgICAgYSBsaXN0IG9mIG1ldGhvZCBwYWNrYWdlcwotCSAqIEBwYXJhbSBuYW1lCi0JICogICAgICAgICAgICBhIGNvbnRlbnQgcGFja2FnZSBuYW1lCi0JICogQHJldHVybiBhIGNvbnRlbnQgcGFja2FnZSB3aXRoIHRoZSBtYXRoY2luZyBuYW1lIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBDb250ZW50UGFja2FnZSBmaW5kQ29udGVudFBhY2thZ2UoTGlzdCBtZXRob2RQYWNrYWdlcywKLQkJCVN0cmluZyBuYW1lKSB7Ci0JCWZvciAoaW50IGkgPSBtZXRob2RQYWNrYWdlcy5zaXplKCkgLSAxOyBpID4gLTE7IGktLSkgewotCQkJT2JqZWN0IG9iaiA9IG1ldGhvZFBhY2thZ2VzLmdldChpKTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBDb250ZW50UGFja2FnZSkgewotCQkJCUNvbnRlbnRQYWNrYWdlIHBrZyA9IChDb250ZW50UGFja2FnZSkgb2JqOwotCQkJCWlmIChuYW1lLmVxdWFscyhwa2cuZ2V0TmFtZSgpKSkgewotCQkJCQlyZXR1cm4gcGtnOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjb250ZW50IHBhY2thZ2Ugd2l0aCBhIHNwZWNpZmljIHBhdGguCi0JICogCi0JICogQHBhcmFtIG1ldGhvZFBsdWdpbgotCSAqICAgICAgICAgICAgYSBtZXRob2QgcGx1Zy1pbgotCSAqIEBwYXJhbSBwYXRoCi0JICogICAgICAgICAgICBhbiBhcnJheSBvZiBtZXRob2QgZWxlbWVudCBwYXRoIGZyYWdtZW50cwotCSAqIEByZXR1cm4gYSBjb250ZW50IHBhY2thZ2Ugd2l0aCB0aGUgbWF0Y2hpbmcgcGF0aCBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ29udGVudFBhY2thZ2UgZmluZENvbnRlbnRQYWNrYWdlKE1ldGhvZFBsdWdpbiBtZXRob2RQbHVnaW4sCi0JCQlTdHJpbmdbXSBwYXRoKSB7Ci0JCUNvbnRlbnRQYWNrYWdlIHBrZyA9IG51bGw7Ci0JCUxpc3QgbGlzdCA9IG1ldGhvZFBsdWdpbi5nZXRNZXRob2RQYWNrYWdlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHBhdGgubGVuZ3RoOyBpKyspIHsKLQkJCXBrZyA9IGZpbmRDb250ZW50UGFja2FnZShsaXN0LCBwYXRoW2ldKTsKLQkJCWlmIChwa2cgPT0gbnVsbCkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQkJbGlzdCA9IHBrZy5nZXRDaGlsZFBhY2thZ2VzKCk7Ci0JCX0KLQkJcmV0dXJuIHBrZzsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBwYXJlbnQgbWV0aG9kIHBsdWctaW4gb2YgYSBtZXRob2QgZWxlbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqICAgICAgICAgICAgYSBNZXRob2QgZWxlbWVudAotCSAqIEByZXR1cm4gdGhlIHBhcmVudCBtZXRob2QgcGx1Zy1pbiBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTWV0aG9kUGx1Z2luIGdldE1ldGhvZFBsdWdpbihFT2JqZWN0IGVsZW1lbnQpIHsKLQkJZm9yIChFT2JqZWN0IG9iaiA9IGVsZW1lbnQ7IG9iaiAhPSBudWxsOyBvYmogPSBvYmouZUNvbnRhaW5lcigpKSB7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luKSB7Ci0JCQkJcmV0dXJuIChNZXRob2RQbHVnaW4pIG9iajsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBwYXJlbnQgbWV0aG9kIGxpYnJhcnkgb2YgYSBtZXRob2QgZWxlbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqICAgICAgICAgICAgYSBtZXRob2QgZWxlbWVudAotCSAqIEByZXR1cm4gdGhlIHBhcmVudCBtZXRob2QgbGlicmFyeSBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTWV0aG9kTGlicmFyeSBnZXRNZXRob2RMaWJyYXJ5KEVPYmplY3QgZWxlbWVudCkgewotCQlmb3IgKEVPYmplY3Qgb2JqID0gZWxlbWVudDsgb2JqICE9IG51bGw7IG9iaiA9IG9iai5lQ29udGFpbmVyKCkpIHsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBNZXRob2RMaWJyYXJ5KSB7Ci0JCQkJcmV0dXJuIChNZXRob2RMaWJyYXJ5KSBvYmo7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgRU9iamVjdCBnZXRUb3BDb250YWluZXIoRU9iamVjdCBlbGVtZW50KSB7Ci0JCUVPYmplY3QgY29udGFpbmVyID0gbnVsbDsKLQkJZm9yIChFT2JqZWN0IG9iaiA9IGVsZW1lbnQuZUNvbnRhaW5lcigpOyBvYmogIT0gbnVsbDsgb2JqID0gb2JqLmVDb250YWluZXIoKSkgewotCQkJY29udGFpbmVyID0gb2JqOwotCQl9Ci0JCXJldHVybiBjb250YWluZXI7CQkKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBwYXJlbnQgY29udGVudCBwYWNrYWdlIG9mIGEgY29udGVudCBlbGVtZW50LgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogICAgICAgICAgICBhIGNvbnRlbnQgZWxlbWVudAotCSAqIEByZXR1cm4gdGhlIHBhcmVudCBjb250ZW50IHBhY2thZ2Ugb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIENvbnRlbnRQYWNrYWdlIGdldENvbnRlbnRQYWNrYWdlKEVPYmplY3QgZWxlbWVudCkgewotCQlmb3IgKEVPYmplY3Qgb2JqID0gZWxlbWVudDsgb2JqICE9IG51bGw7IG9iaiA9IG9iai5lQ29udGFpbmVyKCkpIHsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBDb250ZW50UGFja2FnZSkgewotCQkJCXJldHVybiAoQ29udGVudFBhY2thZ2UpIG9iajsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBwYXJlbnQgcHJvY2VzcyBwYWNrYWdlIG9mIGEgcHJvY2VzcyBlbGVtZW50LgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogICAgICAgICAgICBhIFByb2Nlc3MgZWxlbWVudAotCSAqIEByZXR1cm4gdGhlIHBhcmVudCBwcm9jZXNzIHBhY2thZ2Ugb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFByb2Nlc3NQYWNrYWdlIGdldFByb2Nlc3NQYWNrYWdlKEVPYmplY3QgZWxlbWVudCkgewotCQlmb3IgKEVPYmplY3Qgb2JqID0gZWxlbWVudDsgb2JqICE9IG51bGw7IG9iaiA9IG9iai5lQ29udGFpbmVyKCkpIHsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBQcm9jZXNzUGFja2FnZSkgewotCQkJCXJldHVybiAoUHJvY2Vzc1BhY2thZ2UpIG9iajsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBwYXJlbnQgZGlhZ3JhbSBvZiBhIGRpYWdyYW0gZWxlbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqICAgICAgICAgICAgYSBkaWFncmFtIGVsZW1lbnQKLQkgKiBAcmV0dXJuIHRoZSBwYXJlbnQgZGlhZ3JhbSBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgRGlhZ3JhbSBnZXREaWFncmFtKEVPYmplY3QgZWxlbWVudCkgewotCQlmb3IgKEVPYmplY3Qgb2JqID0gZWxlbWVudDsgb2JqICE9IG51bGw7IG9iaiA9IG9iai5lQ29udGFpbmVyKCkpIHsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBEaWFncmFtKSB7Ci0JCQkJcmV0dXJuIChEaWFncmFtKSBvYmo7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ2hlY2tzIHdoZXRoZXIgYSBtZXRob2QgZWxlbWVudCBpcyBjb250YWluZWQgYnkgYSBzcGVjaWZpYyBjb250ZW50Ci0JICogcGFja2FnZS4KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqICAgICAgICAgICAgYSBtZXRob2QgZWxlbWVudAotCSAqIEBwYXJhbSBjb250ZW50UGFja2FnZQotCSAqICAgICAgICAgICAgYSBjb250ZW50IHBhY2thZ2UKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBtZXRob2QgZWxlbWVudCBpcyBjb250YWluZWQgYnkgdGhlCi0JICogICAgICAgICBjb250ZW50IHBhY2thZ2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNDb250YWluZWRCeUNvbnRlbnRQYWNrYWdlKEVPYmplY3QgZWxlbWVudCwKLQkJCUNvbnRlbnRQYWNrYWdlIGNvbnRlbnRQYWNrYWdlKSB7Ci0JCXJldHVybiBpc0NvbnRhaW5lZEJ5KGVsZW1lbnQsIGNvbnRlbnRQYWNrYWdlKTsKLQl9Ci0KLQkvKioKLQkgKiBDaGVja3Mgd2hldGhlciBhIG1vZGVsIG9iamVjdCBpcyBjb250YWluZWQgYnkgYSBzcGVjaWZpYyBjb250YWluZXIuCi0JICogCi0JICogQHBhcmFtIGVPYmoKLQkgKiAgICAgICAgICAgIGEgbW9kZWwgb2JqZWN0Ci0JICogQHBhcmFtIGNvbnRhaW5lcgotCSAqICAgICAgICAgICAgYSBjb250YWluZXIKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBtb2RlbCBvYmplY3QgaXMgY29udGFpbmVkIGJ5IHRoZQotCSAqICAgICAgICAgY29udGFpbmVyCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzQ29udGFpbmVkQnkoRU9iamVjdCBlT2JqLCBPYmplY3QgY29udGFpbmVyKSB7Ci0JCWlmIChlT2JqID09IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlmb3IgKEVPYmplY3Qgb2JqID0gZU9iai5lQ29udGFpbmVyKCk7IG9iaiAhPSBudWxsOyBvYmogPSBvYmoKLQkJCQkuZUNvbnRhaW5lcigpKSB7Ci0JCQlpZiAob2JqID09IGNvbnRhaW5lcikgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBHZW5lcmF0ZXMgYW5kIHJldHVybnMgYSB1bmlxdWUgSUQuCi0JICogCi0JICogQHJldHVybiBhIHVuaXF1ZSBJRAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdlbmVyYXRlR1VJRCgpIHsKLQkJcmV0dXJuIEVjb3JlVXRpbC5nZW5lcmF0ZVVVSUQoKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuZCByZXR1cm5zIHRoZSBjb250ZW50IGRlc2NyaXB0aW9uIG5hbWUgb2YgYSBnaXZlbiBtZXRob2QKLQkgKiBlbGVtZW50LgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogICAgICAgICAgICBhIG1ldGhvZCBlbGVtZW50Ci0JICogQHJldHVybiBhIHN1aXRhYmxlIGNvbnRlbnQgZGVzY3JpcHRpb24gbmFtZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNyZWF0ZUNvbnRlbnREZXNjcmlwdGlvbk5hbWUoTWV0aG9kRWxlbWVudCBlKSB7Ci0JCXJldHVybiBlLmdldE5hbWUoKSArICcsJyArIGUuZ2V0R3VpZCgpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBnZXRBbGxTdXBlcnMoTGlzdCBzdXBlcnMsIFZhcmlhYmlsaXR5RWxlbWVudCBlLAotCQkJVmFyaWFiaWxpdHlUeXBlIHR5cGUpIHsKLQkJVmFyaWFiaWxpdHlFbGVtZW50IGJhc2UgPSBlLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsKLQkJaWYgKGJhc2UgIT0gbnVsbCAmJiBlLmdldFZhcmlhYmlsaXR5VHlwZSgpID09IHR5cGUKLQkJCQkmJiAhc3VwZXJzLmNvbnRhaW5zKGJhc2UpKSB7Ci0JCQlzdXBlcnMuYWRkKGJhc2UpOwotCQkJZ2V0QWxsU3VwZXJzKHN1cGVycywgYmFzZSwgdHlwZSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgZ2V0QWxsU3VwZXJzQm90aChMaXN0IHN1cGVycywgVmFyaWFiaWxpdHlFbGVtZW50IGUsCi0JCQlWYXJpYWJpbGl0eVR5cGUgdHlwZTEsIFZhcmlhYmlsaXR5VHlwZSB0eXBlMikgewotCQlWYXJpYWJpbGl0eUVsZW1lbnQgYmFzZSA9IGUuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpOwotCQlpZiAoYmFzZSAhPSBudWxsCi0JCQkJJiYgKGUuZ2V0VmFyaWFiaWxpdHlUeXBlKCkgPT0gdHlwZTEgfHwgZS5nZXRWYXJpYWJpbGl0eVR5cGUoKSA9PSB0eXBlMikKLQkJCQkmJiAhc3VwZXJzLmNvbnRhaW5zKGJhc2UpKSB7Ci0JCQlzdXBlcnMuYWRkKGJhc2UpOwotCQkJZ2V0QWxsU3VwZXJzQm90aChzdXBlcnMsIGJhc2UsIHR5cGUxLCB0eXBlMik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBjbGFzcyBvZiBhIGNvbnRlbnQgZWxlbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gY29udGVudEVsZW1lbnQKLQkgKiAgICAgICAgICAgIGEgY29udGVudCBlbGVtZW50Ci0JICogQHJldHVybiB0aGUgY29udGVudCBlbGVtZW50IGNsYXNzCi0JICovCi0JcHVibGljIHN0YXRpYyBDbGFzcyBnZXRDbGFzc09mQ29udGVudEVsZW1lbnQoQ29udGVudEVsZW1lbnQgY29udGVudEVsZW1lbnQpIHsKLQkJaWYgKGNvbnRlbnRFbGVtZW50IGluc3RhbmNlb2YgUm9sZSkKLQkJCXJldHVybiBSb2xlLmNsYXNzOwotCQlpZiAoY29udGVudEVsZW1lbnQgaW5zdGFuY2VvZiBUYXNrKQotCQkJcmV0dXJuIFRhc2suY2xhc3M7Ci0JCWlmIChjb250ZW50RWxlbWVudCBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0KQotCQkJcmV0dXJuIFdvcmtQcm9kdWN0LmNsYXNzOwotCQlpZiAoY29udGVudEVsZW1lbnQgaW5zdGFuY2VvZiBHdWlkYW5jZSkKLQkJCXJldHVybiBHdWlkYW5jZS5jbGFzczsKLQkJaWYgKGNvbnRlbnRFbGVtZW50IGluc3RhbmNlb2YgRG9tYWluKQotCQkJcmV0dXJuIERvbWFpbi5jbGFzczsKLQkJaWYgKGNvbnRlbnRFbGVtZW50IGluc3RhbmNlb2YgRGlzY2lwbGluZSkKLQkJCXJldHVybiBEaXNjaXBsaW5lLmNsYXNzOwotCQlpZiAoY29udGVudEVsZW1lbnQgaW5zdGFuY2VvZiBEaXNjaXBsaW5lR3JvdXBpbmcpCi0JCQlyZXR1cm4gRGlzY2lwbGluZUdyb3VwaW5nLmNsYXNzOwotCQlpZiAoY29udGVudEVsZW1lbnQgaW5zdGFuY2VvZiBSb2xlU2V0KQotCQkJcmV0dXJuIFJvbGVTZXQuY2xhc3M7Ci0JCWlmIChjb250ZW50RWxlbWVudCBpbnN0YW5jZW9mIFJvbGVTZXRHcm91cGluZykKLQkJCXJldHVybiBSb2xlU2V0R3JvdXBpbmcuY2xhc3M7Ci0JCWlmIChjb250ZW50RWxlbWVudCBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0VHlwZSkKLQkJCXJldHVybiBXb3JrUHJvZHVjdFR5cGUuY2xhc3M7Ci0JCXJldHVybiBPYmplY3QuY2xhc3M7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIGRlZmF1bHQgd29yayBvcmRlciBmb3IgdHdvIHdvcmsgYnJlYWtkb3duIGVsZW1lbnRzLgotCSAqIAotCSAqIEBwYXJhbSBlCi0JICogICAgICAgICAgICBhIHdvcmsgYnJlYWtkb3duIGVsZW1lbnQKLQkgKiBAcGFyYW0gcHJlZGVjZXNzb3IKLQkgKiAgICAgICAgICAgIHRoZSBwcmVkZWNlc3NvciB3b3JrIGJyZWFrZG93biBlbGVtZW50Ci0JICogQHJldHVybiB0aGUgbmV3bHkgY3JlYXRlZCB3b3JrIG9yZGVyCi0JICovCi0JcHVibGljIHN0YXRpYyBXb3JrT3JkZXIgY3JlYXRlRGVmYXVsdFdvcmtPcmRlcihXb3JrQnJlYWtkb3duRWxlbWVudCBzdWNjLAotCQkJV29ya0JyZWFrZG93bkVsZW1lbnQgcHJlZCkgewotCQlyZXR1cm4gY3JlYXRlRGVmYXVsdFdvcmtPcmRlcihzdWNjLCBwcmVkLCB0cnVlKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBXb3JrT3JkZXIgY3JlYXRlRGVmYXVsdFdvcmtPcmRlcihXb3JrQnJlYWtkb3duRWxlbWVudCBzdWNjLAotCQkJV29ya0JyZWFrZG93bkVsZW1lbnQgcHJlZCwgYm9vbGVhbiBsaW5rKSB7Ci0JCVdvcmtPcmRlciB3byA9IFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVdvcmtPcmRlcigpOwotCQl3by5zZXRQcmVkKHByZWQpOwotCQlpZihsaW5rKSB7Ci0JCQlzdWNjLmdldExpbmtUb1ByZWRlY2Vzc29yKCkuYWRkKHdvKTsKLQkJfQotCQlyZXR1cm4gd287Ci0JfQkKLQotCS8qKgotCSAqIExvY2F0ZXMgdGhlIHdvcmsgb3JkZXIgYXNzb2NpYXRlZCB3aXRoIHR3byB3b3JrIGJyZWFrZG93biBlbGVtZW50cy4KLQkgKiAKLQkgKiBAcGFyYW0gZQotCSAqICAgICAgICAgICAgYSB3b3JrIGJyZWFrZG93biBlbGVtZW50Ci0JICogQHBhcmFtIHByZWRlY2Vzc29yCi0JICogICAgICAgICAgICB0aGUgcHJlZGVjZXNzb3Igd29yayBicmVha2Rvd24gZWxlbWVudAotCSAqIEByZXR1cm4gYSB3b3JrIG9yZGVyIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBXb3JrT3JkZXIgZmluZFdvcmtPcmRlcihXb3JrQnJlYWtkb3duRWxlbWVudCBlLAotCQkJT2JqZWN0IHByZWRlY2Vzc29yKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGUuZ2V0TGlua1RvUHJlZGVjZXNzb3IoKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCVdvcmtPcmRlciB3b3JrT3JkZXIgPSAoV29ya09yZGVyKSBpdGVyLm5leHQoKTsKLQkJCWlmICh3b3JrT3JkZXIuZ2V0UHJlZCgpID09IHByZWRlY2Vzc29yKQotCQkJCXJldHVybiB3b3JrT3JkZXI7Ci0JCX0KLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogTG9jYXRlcyB0aGUgd29yayBvcmRlciBhc3NvY2lhdGVkIHdpdGggdHdvIHdvcmsgYnJlYWtkb3duIGVsZW1lbnRzLiBJZgotCSAqIGluY2x1ZGVCYXNlIGlzIHRydWUsIHdpbGwgY29sbGVjdCBXb3JrT3JkZXIgZm9yIGJhc2UgZWxlbWVudCBvZiB0aGUKLQkgKiBwcmVkZWNlc3NvciBhcyB3ZWxsLgotCSAqIAotCSAqIEBwYXJhbSBlCi0JICogQHBhcmFtIHByZWRlY2Vzc29yCi0JICogQHBhcmFtIGluY2x1ZGVCYXNlCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ29sbGVjdGlvbjxXb3JrT3JkZXI+IGZpbmRXb3JrT3JkZXIoV29ya0JyZWFrZG93bkVsZW1lbnQgZSwgV29ya0JyZWFrZG93bkVsZW1lbnQgcHJlZGVjZXNzb3IsIGJvb2xlYW4gaW5jbHVkZUJhc2UpIHsKLQkJaWYoIWluY2x1ZGVCYXNlKSB7Ci0JCQlXb3JrT3JkZXIgd28gPSBmaW5kV29ya09yZGVyKGUsIHByZWRlY2Vzc29yKTsKLQkJCXJldHVybiAoQ29sbGVjdGlvbjxXb3JrT3JkZXI+KSAod28gPT0gbnVsbCA/IENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpIDogQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdCh3bykpOwotCQl9Ci0JCUFycmF5TGlzdDxXb3JrT3JkZXI+IHdvcmtPcmRlcnMgPSBuZXcgQXJyYXlMaXN0PFdvcmtPcmRlcj4oKTsKLQkJY29sbGVjdFdvcmtPcmRlcnMod29ya09yZGVycywgZSwgcHJlZGVjZXNzb3IpOwotCQlyZXR1cm4gd29ya09yZGVyczsKLQl9Ci0JCi0JLyoqCi0JICogQ29sbGVjdHMgdGhlIFdvcmtPcmRlciBvYmplY3RzIGFzc29jaWF0ZWQgYmV0d2VlbiB0aGUgc3BlY2lmaWVkIHdvcmsKLQkgKiBicmVha2Rvd24gZWxlbWVudCA8Y29kZT5lPC9jb2RlPiBhbmQgdGhlIHByZWRlY2Vzc29yIG9yIGFueSBvZiBpdHMgYmFzZSBlbGVtZW50cy4KLQkgKiAKLQkgKiBAcGFyYW0gd29ya09yZGVycwotCSAqIEBwYXJhbSBlCi0JICogQHBhcmFtIHByZWRlY2Vzc29yCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGNvbGxlY3RXb3JrT3JkZXJzKENvbGxlY3Rpb248V29ya09yZGVyPiB3b3JrT3JkZXJzLAotCQkJV29ya0JyZWFrZG93bkVsZW1lbnQgZSwgT2JqZWN0IHByZWRlY2Vzc29yKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGUuZ2V0TGlua1RvUHJlZGVjZXNzb3IoKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCVdvcmtPcmRlciB3b3JrT3JkZXIgPSAoV29ya09yZGVyKSBpdGVyLm5leHQoKTsKLQkJCWlmICh3b3JrT3JkZXIuZ2V0UHJlZCgpID09IHByZWRlY2Vzc29yKSB7Ci0JCQkJd29ya09yZGVycy5hZGQod29ya09yZGVyKTsKLQkJCX0KLQkJfQotCQlpZihwcmVkZWNlc3NvciBpbnN0YW5jZW9mIFZhcmlhYmlsaXR5RWxlbWVudCkgewotCQkJVmFyaWFiaWxpdHlFbGVtZW50IHZlID0gKChWYXJpYWJpbGl0eUVsZW1lbnQpcHJlZGVjZXNzb3IpLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsKLQkJCWlmKHZlICE9IG51bGwpIHsKLQkJCQljb2xsZWN0V29ya09yZGVycyh3b3JrT3JkZXJzLCBlLCB2ZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmVzIHRoZSB3b3JrIG9yZGVyIGFzc29jaWF0ZWQgd2l0aCB0d28gd29yayBicmVha2Rvd24gZWxlbWVudHMuCi0JICogCi0JICogQHBhcmFtIGUKLQkgKiAgICAgICAgICAgIGEgd29yayBicmVha2Rvd24gZWxlbWVudAotCSAqIEBwYXJhbSBwcmVkZWNlc3NvcgotCSAqICAgICAgICAgICAgdGhlIHByZWRlY2Vzc29yIHdvcmsgYnJlYWtkb3duIGVsZW1lbnQKLQkgKiBAcmV0dXJuIHRoZSByZW1vdmVkIHdvcmsgb3JkZXIgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFdvcmtPcmRlciByZW1vdmVXb3JrT3JkZXIoV29ya0JyZWFrZG93bkVsZW1lbnQgZSwKLQkJCU9iamVjdCBwcmVkZWNlc3NvcikgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gZS5nZXRMaW5rVG9QcmVkZWNlc3NvcigpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCVdvcmtPcmRlciBvcmRlciA9IChXb3JrT3JkZXIpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmIChvcmRlci5nZXRQcmVkKCkgPT0gcHJlZGVjZXNzb3IpIHsKLQkJCQlpdGVyYXRvci5yZW1vdmUoKTsKLQkJCQlyZXR1cm4gb3JkZXI7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgcGFyZW50IHByb2Nlc3MgY29tcG9uZW50IG9mIGEgbWV0aG9kIGVsZW1lbnQuCi0JICogCi0JICogQHBhcmFtIGUKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGVsZW1lbnQsIHR5cGljYWxseSBhIHByb2Nlc3MgZWxlbWVudAotCSAqIEByZXR1cm4gdGhlIHBhcmVudCBwcm9jZXNzIGNvbXBvbmVudCBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgUHJvY2Vzc0NvbXBvbmVudCBnZXRQcm9jZXNzQ29tcG9uZW50KE1ldGhvZEVsZW1lbnQgZSkgewotCQlFT2JqZWN0IGNvbnRhaW5lcjsKLQkJZm9yIChjb250YWluZXIgPSBlOyBjb250YWluZXIgIT0gbnVsbAotCQkJCSYmICEoY29udGFpbmVyIGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCk7IGNvbnRhaW5lciA9IGNvbnRhaW5lcgotCQkJCS5lQ29udGFpbmVyKCkpCi0JCQk7Ci0JCWlmIChjb250YWluZXIgIT0gbnVsbCkgewotCQkJcmV0dXJuICgoUHJvY2Vzc0NvbXBvbmVudCkgY29udGFpbmVyKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBwYXJlbnQgbWV0aG9kIHVuaXQgb2YgYSBtZXRob2QgZWxlbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gZQotCSAqICAgICAgICAgICAgYSBtZXRob2QgZWxlbWVudAotCSAqIEByZXR1cm4gdGhlIHBhcmVudCBtZXRob2QgdW5pdCBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTWV0aG9kVW5pdCBnZXRNZXRob2RVbml0KE1ldGhvZEVsZW1lbnQgZSkgewotCQlFT2JqZWN0IGNvbnRhaW5lcjsKLQkJZm9yIChjb250YWluZXIgPSBlOyBjb250YWluZXIgIT0gbnVsbAotCQkJCSYmICEoY29udGFpbmVyIGluc3RhbmNlb2YgTWV0aG9kVW5pdCk7IGNvbnRhaW5lciA9IGNvbnRhaW5lcgotCQkJCS5lQ29udGFpbmVyKCkpCi0JCQk7Ci0JCWlmIChjb250YWluZXIgIT0gbnVsbCkgewotCQkJcmV0dXJuICgoTWV0aG9kVW5pdCkgY29udGFpbmVyKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQotCX0KLQotCS8qKgotCSAqIENoZWNrcyB3aGV0aGVyIGEgbWV0aG9kIHBsdWctaW4gaGFzIG1ldGhvZCBlbGVtZW50cyB0aGF0IHJlZmVyZW5jZQotCSAqIGVsZW1lbnRzIGluIGEgYmFzZSBwbHVnLWluLgotCSAqIDxwPgotCSAqIE5vdGU6IFRoaXMgaXMgYSBleHBlbnNpdmUgY2FsbCB0byBtYWtlIGZvciBhIGxhcmdlIG1ldGhvZCBwbHVnLWluLgotCSAqIAotCSAqIEBwYXJhbSBwbHVnaW4KLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIHBsdWctaW4KLQkgKiBAcGFyYW0gYmFzZQotCSAqICAgICAgICAgICAgYSBiYXNlIG1ldGhvZCBwbHVnLWluCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgc3BlY2lmaWVkIG1ldGhvZCBwbHVnLWluIGNvbnRhaW4KLQkgKiAgICAgICAgIG1ldGhvZCBlbGVtZW50cyB0aGF0IHJlZmVyZW5jZSBlbGVtZW50cyBpbiBhIGJhc2UgcGx1Zy1pbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaGFzUmVmZXJlbmNlKE1ldGhvZFBsdWdpbiBwbHVnaW4sIE1ldGhvZFBsdWdpbiBiYXNlKSB7Ci0JCWZvciAoRUNvbnRlbnRzRUxpc3QuRmVhdHVyZUl0ZXJhdG9yIGZlYXR1cmVJdGVyYXRvciA9IChFQ29udGVudHNFTGlzdC5GZWF0dXJlSXRlcmF0b3IpIHBsdWdpbgotCQkJCS5lQ3Jvc3NSZWZlcmVuY2VzKCkuaXRlcmF0b3IoKTsgZmVhdHVyZUl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCUVPYmplY3QgcmVmID0gKEVPYmplY3QpIGZlYXR1cmVJdGVyYXRvci5uZXh0KCk7Ci0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZiA9IGZlYXR1cmVJdGVyYXRvci5mZWF0dXJlKCk7Ci0KLQkJCWlmIChmICE9IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE1ldGhvZFBsdWdpbl9CYXNlcygpCi0JCQkJCSYmIFVtYVV0aWwuZ2V0TWV0aG9kUGx1Z2luKHJlZikgPT0gYmFzZSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0KLQkJZm9yIChJdGVyYXRvciBpdGVyID0gcGx1Z2luLmVBbGxDb250ZW50cygpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCUVPYmplY3QgZWxlbWVudCA9IChFT2JqZWN0KSBpdGVyLm5leHQoKTsKLQotCQkJLy8gaWdub3JlIFByb2Nlc3NFbGVtZW50IGIvYyBpdCBjYW4gcmVmZXJlbmNlcyBhbnl0aGluZwotCQkJLy8KLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgUHJvY2Vzc0VsZW1lbnQpIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQotCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGVsZW1lbnQuZUNyb3NzUmVmZXJlbmNlcygpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yCi0JCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJRU9iamVjdCByZWYgPSAoRU9iamVjdCkgaXRlcmF0b3IubmV4dCgpOwotCQkJCWlmIChnZXRNZXRob2RQbHVnaW4ocmVmKSA9PSBiYXNlKSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlcyBhbGwgZWxlbWVudCByZWZlcmVuY2VzIGluIGEgbWV0aG9kIHBsdWctaW4gdGhhdCBwb2ludCB0byBlbGVtZW50cwotCSAqIGluIGEgYmFzZSBwbHVnLWluLgotCSAqIDxwPgotCSAqIE5vdGU6IFRoaXMgaXMgYSBleHBlbnNpdmUgY2FsbCB0byBtYWtlIGZvciBhIGxhcmdlIG1ldGhvZCBwbHVnLWluLgotCSAqIAotCSAqIEBwYXJhbSBwbHVnaW4KLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIHBsdWctaW4KLQkgKiBAcGFyYW0gYmFzZQotCSAqICAgICAgICAgICAgdGhlIGJhc2UgbWV0aG9kIHBsdWctaW4KLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBvcGVyYXRpb24gaXMgc3VjY2Vzc2Z1bAotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiByZW1vdmVSZWZlcmVuY2VzKE1ldGhvZFBsdWdpbiBwbHVnaW4sCi0JCQlNZXRob2RQbHVnaW4gYmFzZSkgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBwbHVnaW4uZUFsbENvbnRlbnRzKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJRU9iamVjdCBlbGVtZW50ID0gKEVPYmplY3QpIGl0ZXIubmV4dCgpOwotCi0JCQkvLyBpZ25vcmUgUHJvY2Vzc0VsZW1lbnQgYi9jIGl0IGNhbiByZWZlcmVuY2VzIGFueXRoaW5nCi0JCQkvLwotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBQcm9jZXNzRWxlbWVudCkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCi0JCQlmb3IgKEVDb250ZW50c0VMaXN0LkZlYXR1cmVJdGVyYXRvciBmZWF0dXJlSXRlcmF0b3IgPSAoRUNvbnRlbnRzRUxpc3QuRmVhdHVyZUl0ZXJhdG9yKSBlbGVtZW50Ci0JCQkJCS5lQ3Jvc3NSZWZlcmVuY2VzKCkuaXRlcmF0b3IoKTsgZmVhdHVyZUl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCQlFT2JqZWN0IHJlZiA9IChFT2JqZWN0KSBmZWF0dXJlSXRlcmF0b3IubmV4dCgpOwotCi0JCQkJaWYgKGdldE1ldGhvZFBsdWdpbihyZWYpID09IGJhc2UpIHsKLQkJCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGYgPSBmZWF0dXJlSXRlcmF0b3IuZmVhdHVyZSgpOwotCQkJCQlpZiAoZi5pc01hbnkoKSkgewotCQkJCQkJKChDb2xsZWN0aW9uKSBlbGVtZW50LmVHZXQoZikpLnJlbW92ZShyZWYpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJZWxlbWVudC5lU2V0KGYsIG51bGwpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE1lc3NhZ2UoSVN0YXR1cyBzdGF0dXMpIHsKLQkJU3RyaW5nIG1zZyA9IHN0YXR1cy5nZXRNZXNzYWdlKCk7Ci0JCWlmIChzdGF0dXMuaXNNdWx0aVN0YXR1cygpKSB7Ci0JCQlTdHJpbmdCdWZmZXIgc3RyQnVmID0gbmV3IFN0cmluZ0J1ZmZlcihtc2cpOwotCQkJSVN0YXR1cyBzdGF0dXNlc1tdID0gc3RhdHVzLmdldENoaWxkcmVuKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHN0YXR1c2VzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJc3RyQnVmLmFwcGVuZCgnXG4nKS5hcHBlbmQoc3RhdHVzZXNbaV0uZ2V0TWVzc2FnZSgpKTsKLQkJCX0KLQkJCW1zZyA9IHN0ckJ1Zi50b1N0cmluZygpOwotCQl9Ci0JCWlmIChtc2cgIT0gbnVsbCAmJiBtc2cudHJpbSgpLmxlbmd0aCgpID09IDApIHsKLQkJCW1zZyA9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIG1zZzsKLQl9Ci0KLQkvKioKLQkgKiBHZW5lcmF0ZXMgYSBHVUlEIHVzaW5nIGEgYmFzZSBHVUlELgotCSAqIAotCSAqIEBwYXJhbSBiYXNlR1VJRAotCSAqICAgICAgICAgICAgYSBiYXNlIEdVSUQKLQkgKiBAcmV0dXJuIGEgdW5pcXVlIElECi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgZ2VuZXJhdGVHVUlEKFN0cmluZyBiYXNlR1VJRCkgewotCQlyZXR1cm4gR1VJRC5nZW5lcmF0ZShiYXNlR1VJRCk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgR1VJRCB7Ci0JCXByaXZhdGUgc3RhdGljIE1lc3NhZ2VEaWdlc3QgbWQ1ID0gbnVsbDsKLQotCQlwcml2YXRlIHN0YXRpYyBNZXNzYWdlRGlnZXN0IGdldE1ENSgpIHsKLQkJCWlmIChtZDUgPT0gbnVsbCkgewotCQkJCXN5bmNocm9uaXplZCAoR1VJRC5jbGFzcykgewotCQkJCQlpZiAobWQ1ID09IG51bGwpIHsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJbWQ1ID0gTWVzc2FnZURpZ2VzdC5nZXRJbnN0YW5jZSgiTUQ1Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCX0gY2F0Y2ggKE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBtZDU7Ci0JCX0KLQotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBnZW5lcmF0ZShTdHJpbmcgYmFzZUdVSUQpIHsKLQkJCU1lc3NhZ2VEaWdlc3QgbWQ1ID0gZ2V0TUQ1KCk7Ci0JCQltZDUudXBkYXRlKGJhc2VHVUlELmdldEJ5dGVzKCkpOwotCQkJYnl0ZVtdIGhhc2ggPSBtZDUuZGlnZXN0KCk7Ci0JCQljaGFyW10gYnVmZmVyID0gbmV3IGNoYXJbMjNdOwotCQkJYnVmZmVyWzBdID0gJy0nOwotCi0JCQkvLyBEbyBhIGJhc2UgNjQgY29udmVyc2lvbiBieSB0dXJuaW5nIGV2ZXJ5IDMgYnl0ZXMgaW50byA0IGJhc2UgNjQKLQkJCS8vIGNoYXJhY3RlcnMKLQkJCS8vCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IDU7ICsraSkgewotCQkJCWJ1ZmZlcls0ICogaSArIDFdID0gQkFTRTY0X0RJR0lUU1soaGFzaFtpICogM10gPj4gMikgJiAweDNGXTsKLQkJCQlidWZmZXJbNCAqIGkgKyAyXSA9IEJBU0U2NF9ESUdJVFNbKChoYXNoW2kgKiAzXSA8PCA0KSAmIDB4MzApCi0JCQkJCQl8ICgoaGFzaFtpICogMyArIDFdID4+IDQpICYgMHhGKV07Ci0JCQkJYnVmZmVyWzQgKiBpICsgM10gPSBCQVNFNjRfRElHSVRTWygoaGFzaFtpICogMyArIDFdIDw8IDIpICYgMHgzQykKLQkJCQkJCXwgKChoYXNoW2kgKiAzICsgMl0gPj4gNikgJiAweDMpXTsKLQkJCQlidWZmZXJbNCAqIGkgKyA0XSA9IEJBU0U2NF9ESUdJVFNbaGFzaFtpICogMyArIDJdICYgMHgzRl07Ci0JCQl9Ci0KLQkJCS8vIEhhbmRsZSB0aGUgbGFzdCBieXRlIGF0IHRoZSBlbmQuCi0JCQkvLwotCQkJYnVmZmVyWzIxXSA9IEJBU0U2NF9ESUdJVFNbKGhhc2hbMTVdID4+IDIpICYgMHgzRl07Ci0JCQlidWZmZXJbMjJdID0gQkFTRTY0X0RJR0lUU1soaGFzaFsxNV0gPDwgNCkgJiAweDMwXTsKLQotCQkJcmV0dXJuIG5ldyBTdHJpbmcoYnVmZmVyKTsKLQkJfQotCi0JCXByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXJbXSBCQVNFNjRfRElHSVRTID0geyAnQScsICdCJywgJ0MnLCAnRCcsICdFJywKLQkJCQknRicsICdHJywgJ0gnLCAnSScsICdKJywgJ0snLCAnTCcsICdNJywgJ04nLCAnTycsICdQJywgJ1EnLAotCQkJCSdSJywgJ1MnLCAnVCcsICdVJywgJ1YnLCAnVycsICdYJywgJ1knLCAnWicsICdhJywgJ2InLCAnYycsCi0JCQkJJ2QnLCAnZScsICdmJywgJ2cnLCAnaCcsICdpJywgJ2onLCAnaycsICdsJywgJ20nLCAnbicsICdvJywKLQkJCQkncCcsICdxJywgJ3InLCAncycsICd0JywgJ3UnLCAndicsICd3JywgJ3gnLCAneScsICd6JywgJzAnLAotCQkJCScxJywgJzInLCAnMycsICc0JywgJzUnLCAnNicsICc3JywgJzgnLCAnOScsICctJywgJ18nIH07Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKGdlbmVyYXRlR1VJRCgpKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS91dGlsL3BhY2thZ2UuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvdXRpbC9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzNzc2ZWIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS91dGlsL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIGltcGxlbWVudGF0aW9uIHN1cHBvcnQgZm9yIGFjY2Vzc2luZyB0aGUgVU1BIG1vZGVsIG9iamVjdHMuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnZhbGlkYXRpb24vLmNsYXNzcGF0aCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi52YWxpZGF0aW9uLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1MWM4ZjIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnZhbGlkYXRpb24vLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi52YWxpZGF0aW9uLy5vcHRpb25zIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnZhbGlkYXRpb24vLm9wdGlvbnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjODQyZmMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnZhbGlkYXRpb24vLm9wdGlvbnMKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLSMgVHVybiBvbiBkZWJ1ZyB0cmFjZSBmb3IgdGhlIENvbW1vbiBwbHVnLWluCi1vcmcuZWNsaXBzZS5lcGYudmFsaWRhdGlvbi9kZWJ1Zz10cnVlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudmFsaWRhdGlvbi8ucHJvamVjdCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi52YWxpZGF0aW9uLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMmVlMmQ0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi52YWxpZGF0aW9uLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuZXBmLnZhbGlkYXRpb248L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnZhbGlkYXRpb24vLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnZhbGlkYXRpb24vLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNzE4ZTI2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi52YWxpZGF0aW9uLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI1RodSBGZWIgMDEgMTc6MDM6NDUgUFNUIDIwMDcKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1lbmNvZGluZy8vc3JjL29yZy9lY2xpcHNlL2VwZi92YWxpZGF0aW9uL1Jlc291cmNlcy5wcm9wZXJ0aWVzPTg4NTlfMQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnZhbGlkYXRpb24vTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudmFsaWRhdGlvbi9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzhjOWNlYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudmFsaWRhdGlvbi9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5lcGYudmFsaWRhdGlvbjtzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjUuMC5xdWFsaWZpZXIKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLmVwZi52YWxpZGF0aW9uLkFjdGl2YXRvcgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLAotIG9yZy5lY2xpcHNlLmVtZi52YWxpZGF0aW9uO3Zpc2liaWxpdHk6PXJlZXhwb3J0LAotIG9yZy5lY2xpcHNlLmVwZi51bWEsCi0gb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdCwKLSBvcmcuZWNsaXBzZS51aQotRWNsaXBzZS1MYXp5U3RhcnQ6IHRydWUKLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5lcGYudmFsaWRhdGlvbiwKLSBvcmcuZWNsaXBzZS5lcGYudmFsaWRhdGlvbi5jb25zdHJhaW50cywKLSBvcmcuZWNsaXBzZS5lcGYudmFsaWRhdGlvbi51dGlsCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi52YWxpZGF0aW9uL2J1aWxkLnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudmFsaWRhdGlvbi9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZGMzNGY3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi52YWxpZGF0aW9uL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLXNvdXJjZS4uID0gc3JjLwotb3V0cHV0Li4gPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgLixcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudmFsaWRhdGlvbi9wbHVnaW4ucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi52YWxpZGF0aW9uL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OWFjZDE2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi52YWxpZGF0aW9uL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLQotIyBQbHVnLWluCi1wbHVnaW5OYW1lPUVQRiBWYWxpZGF0aW9uCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKLSAgICAgICAgICAgICAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi52YWxpZGF0aW9uL3BsdWdpbi54bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudmFsaWRhdGlvbi9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZWUxMWUzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi52YWxpZGF0aW9uL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPHBsdWdpbj4KLQotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmVtZi52YWxpZGF0aW9uLmNvbnN0cmFpbnRQcm92aWRlcnMiPgotICAgICAgPGNhdGVnb3J5Ci0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLnZhbGlkYXRpb24ubGlicmFyeS5jYXRlZ29yeSIKLSAgICAgICAgICAgIG5hbWU9Ik1ldGhvZCBMaWJyYXJ5IENvbnN0cmFpbnRzIi8+Ci0gICAgICA8Y29uc3RyYWludFByb3ZpZGVyCi0gICAgICAgICAgICBjYWNoZT0idHJ1ZSIKLSAgICAgICAgICAgID4KLSAgICAgICAgIDxwYWNrYWdlIG5hbWVzcGFjZVVyaT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC41L3VtYS5lY29yZSIvPgotICAgICAgICAgPGNvbnN0cmFpbnRzIGNhdGVnb3JpZXM9Im9yZy5lY2xpcHNlLmVwZi52YWxpZGF0aW9uLmxpYnJhcnkuY2F0ZWdvcnkiPgotICAgICAgICAgICAgPGNvbnN0cmFpbnQKLSAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYudmFsaWRhdGlvbi5jb25zdHJhaW50cy5OYW1lQ29uc3RyYWludCIKLSAgICAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYudmFsaWRhdGlvbi5jb25zdHJhaW50cy5OYW1lQ29uc3RyYWludCIKLSAgICAgICAgICAgICAgICAgIGxhbmc9IkphdmEiCi0gICAgICAgICAgICAgICAgICBtb2RlPSJCYXRjaCIKLSAgICAgICAgICAgICAgICAgIG5hbWU9Ik5hbWUgQ29uc3RyYWludCIKLSAgICAgICAgICAgICAgICAgIHNldmVyaXR5PSJFUlJPUiIKLSAgICAgICAgICAgICAgICAgIHN0YXR1c0NvZGU9IjEiPgotICAgICAgICAgICAgICAgPG1lc3NhZ2U+Ci0gICAgICAgICAgICAgICAgICBBIHswfSBoYXMgYmVlbiBmb3VuZCB0byBoYXZlIGNoaWxkcmVuIHdpdGggaW52YWxpZCBuYW1lIG9yIHByZXNlbnRhdGlvbiBuYW1lCi0gICAgICAgICAgICAgICA8L21lc3NhZ2U+Ci0gICAgICAgICAgICA8L2NvbnN0cmFpbnQ+Ci0gICAgICAgICAgICA8Y29uc3RyYWludAotICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi52YWxpZGF0aW9uLmNvbnN0cmFpbnRzLlJlbGF0aW9uc2hpcENvbnN0cmFpbnQiCi0gICAgICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLnZhbGlkYXRpb24uY29uc3RyYWludHMuUmVsYXRpb25zaGlwQ29uc3RyYWludCIKLSAgICAgICAgICAgICAgICAgIGxhbmc9IkphdmEiCi0gICAgICAgICAgICAgICAgICBtb2RlPSJCYXRjaCIKLSAgICAgICAgICAgICAgICAgIG5hbWU9IlJlbGF0aW9uc2hpcCBDb25zdHJhaW50IgotICAgICAgICAgICAgICAgICAgc2V2ZXJpdHk9IkVSUk9SIgotICAgICAgICAgICAgICAgICAgc3RhdHVzQ29kZT0iMiI+Ci0gICAgICAgICAgICAgICA8bWVzc2FnZT4KLSAgICAgICAgICAgICAgICAgIEEgezB9IGhhcyBiZWVuIGZvdW5kIHRvIGhhdmUgaW52YWxpZCByZWxhdGlvbnNoaXAKLSAgICAgICAgICAgICAgIDwvbWVzc2FnZT4KLSAgICAgICAgICAgIDwvY29uc3RyYWludD4KLSAgICAgICAgIDwvY29uc3RyYWludHM+Ci0gICAgICA8L2NvbnN0cmFpbnRQcm92aWRlcj4KLSAgIDwvZXh0ZW5zaW9uPgotCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuZW1mLnZhbGlkYXRpb24uY29uc3RyYWludEJpbmRpbmdzIj4KLSAgICAgIDxjbGllbnRDb250ZXh0Ci0gICAgICAgICAgICBkZWZhdWx0PSJ0cnVlIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi52YWxpZGF0aW9uLmxpYnJhcnkuZGVmYXVsdENsaWVudENvbnRleHQiPgotICAgICAgICAgPGVuYWJsZW1lbnQ+Ci0gICAgICAgICAgICA8aW5zdGFuY2VvZiB2YWx1ZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50Ii8+Ci0gICAgICAgICA8L2VuYWJsZW1lbnQ+Ci0gICAgICA8L2NsaWVudENvbnRleHQ+Ci0gICA8L2V4dGVuc2lvbj4KLQotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmVtZi52YWxpZGF0aW9uLnRyYXZlcnNhbCI+Ci0gICAgICA8dHJhdmVyc2FsU3RyYXRlZ3kKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYudmFsaWRhdGlvbi5jb25zdHJhaW50cy5MaWJyYXJ5VHJhdmVyc2FsU3RyYXRlZ3kiCi0gICAgICAgICAgICBuYW1lc3BhY2VVcmk9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNS91bWEuZWNvcmUiLz4KLSAgIDwvZXh0ZW5zaW9uPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnN0YXJ0dXAiPgotICAgICAgPHN0YXJ0dXAgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi52YWxpZGF0aW9uLnV0aWwuU3RhcnR1cCIvPgotICAgPC9leHRlbnNpb24+Ci0KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnZhbGlkYXRpb24vc3JjL29yZy9lY2xpcHNlL2VwZi92YWxpZGF0aW9uL0FjdGl2YXRvci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnZhbGlkYXRpb24vc3JjL29yZy9lY2xpcHNlL2VwZi92YWxpZGF0aW9uL0FjdGl2YXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNjYzM2I2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi52YWxpZGF0aW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvdmFsaWRhdGlvbi9BY3RpdmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnZhbGlkYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2luOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotCi0vKioKLSAqIFRoZSBhY3RpdmF0b3IgY2xhc3MgY29udHJvbHMgdGhlIHBsdWctaW4gbGlmZSBjeWNsZQotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZhdG9yIGV4dGVuZHMgUGx1Z2luIHsKLQotCS8vIFRoZSBwbHVnLWluIElECi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLmVwZi52YWxpZGF0aW9uIjsgLy8kTk9OLU5MUy0xJAotCi0JLy8gVGhlIHNoYXJlZCBpbnN0YW5jZQotCXByaXZhdGUgc3RhdGljIEFjdGl2YXRvciBwbHVnaW47Ci0JCi0JLyoqCi0JICogVGhlIGNvbnN0cnVjdG9yCi0JICovCi0JcHVibGljIEFjdGl2YXRvcigpIHsKLQkJcGx1Z2luID0gdGhpczsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbHVnaW5zI3N0YXJ0KG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0YXJ0KGNvbnRleHQpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsdWdpbiNzdG9wKG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcGx1Z2luID0gbnVsbDsKLQkJc3VwZXIuc3RvcChjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaGFyZWQgaW5zdGFuY2UKLQkgKgotCSAqIEByZXR1cm4gdGhlIHNoYXJlZCBpbnN0YW5jZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgQWN0aXZhdG9yIGdldERlZmF1bHQoKSB7Ci0JCXJldHVybiBwbHVnaW47Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudmFsaWRhdGlvbi9zcmMvb3JnL2VjbGlwc2UvZXBmL3ZhbGlkYXRpb24vTGlicmFyeUVWYWxpZGF0b3IuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi52YWxpZGF0aW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvdmFsaWRhdGlvbi9MaWJyYXJ5RVZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZDg0MTM3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi52YWxpZGF0aW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvdmFsaWRhdGlvbi9MaWJyYXJ5RVZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDE3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi52YWxpZGF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQmFzaWNEaWFnbm9zdGljOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5EaWFnbm9zdGljQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRURhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdFZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5BZGFwdGVyRmFjdG9yeVRyZWVJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnZhbGlkYXRpb24ubW9kZWwuQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnZhbGlkYXRpb24ubW9kZWwuRXZhbHVhdGlvbk1vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnZhbGlkYXRpb24ubW9kZWwuSUNvbnN0cmFpbnRTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnZhbGlkYXRpb24uc2VydmljZS5JQmF0Y2hWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnZhbGlkYXRpb24uc2VydmljZS5JQ29uc3RyYWludERlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnZhbGlkYXRpb24uc2VydmljZS5JQ29uc3RyYWludEZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudmFsaWRhdGlvbi5zZXJ2aWNlLk1vZGVsVmFsaWRhdGlvblNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5TdHJVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUFkYXB0ZXJGYWN0b3J5UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkRlc2NyaWJhYmxlRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLklCU0l0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb24uRGVwZW5kZW5jeUNoZWNrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLkRlcGVuZGVuY3lWYWxpZGF0aW9uTWdyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbi5JVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbi5JVmFsaWRhdG9yRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmliYWJsZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTmFtZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRlYW1Qcm9maWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudmFsaWRhdGlvbi5jb25zdHJhaW50cy5MaWJyYXJ5VHJhdmVyc2FsU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnZhbGlkYXRpb24udXRpbC5WYWxpZGF0aW9uU3RhdHVzOwotCi0vKioKLSAqIEFuIGFkYXB0ZXIgdGhhdCBwbHVncyB0aGUgRU1GIE1vZGVsIFZhbGlkYXRpb24gU2VydmljZSBBUEkgaW50byB0aGUKLSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVZhbGlkYXRvcn0gQVBJLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMQotICovCi1wdWJsaWMgY2xhc3MgTGlicmFyeUVWYWxpZGF0b3IgZXh0ZW5kcyBFT2JqZWN0VmFsaWRhdG9yIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHID0gQWN0aXZhdG9yLmdldERlZmF1bHQoKS5pc0RlYnVnZ2luZygpOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIE1hcCBmZWF0dXJlVG9Qcm9wZXJ0eU1hcCA9IGNyZWF0ZUZlYXR1cmVUb0F0dHJpYnV0ZU1hcCgpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1RYX0FEQVBURVJfRkFDVE9SWV9QUk9WSURFUiA9ICJDVFhfQURBUFRFUl9GQUNUT1JZX1BST1ZJREVSIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENUWF9ERVBFTkRFTkNZX1ZBTElEQVRJT05fTUdSID0gIkNUWF9ERVBFTkRFTkNZX1ZBTElEQVRJT05fTUdSIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENUWF9DT05TVFJBSU5UX0ZJTFRFUiA9ICJDVFhfQ09OU1RSQUlOVF9GSUxURVIiOyAvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OU1RSQUlOVF9DQVRFR09SWSA9ICJvcmcuZWNsaXBzZS5lcGYudmFsaWRhdGlvbi5saWJyYXJ5LmNhdGVnb3J5IjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgTWFwIGNyZWF0ZUZlYXR1cmVUb0F0dHJpYnV0ZU1hcCgpIHsKLQkJTWFwIG1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCW1hcC5wdXQoVW1hUGFja2FnZS5MaXRlcmFscy5OQU1FRF9FTEVNRU5UX19OQU1FLCBJQlNJdGVtUHJvdmlkZXIuQ09MX05BTUUpOwotCQltYXAucHV0KFVtYVBhY2thZ2UuTGl0ZXJhbHMuTUVUSE9EX0VMRU1FTlRfX1BSRVNFTlRBVElPTl9OQU1FLCBJQlNJdGVtUHJvdmlkZXIuQ09MX1BSRVNFTlRBVElPTl9OQU1FKTsKLQkJcmV0dXJuIG1hcDsKLQl9Ci0JCi0JLyoqCi0JICogTW9kZWwgVmFsaWRhdGlvbiBTZXJ2aWNlIGludGVyZmFjZSBmb3IgYmF0Y2ggdmFsaWRhdGlvbiBvZiBFTUYgZWxlbWVudHMuCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBJQmF0Y2hWYWxpZGF0b3IgYmF0Y2hWYWxpZGF0b3I7Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplcyBtZS4KLQkgKi8KLQlwdWJsaWMgTGlicmFyeUVWYWxpZGF0b3IoKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJYmF0Y2hWYWxpZGF0b3IgPSAoSUJhdGNoVmFsaWRhdG9yKSBNb2RlbFZhbGlkYXRpb25TZXJ2aWNlLmdldEluc3RhbmNlKCkKLQkJCQkubmV3VmFsaWRhdG9yKEV2YWx1YXRpb25Nb2RlLkJBVENIKTsKLQkJYmF0Y2hWYWxpZGF0b3Iuc2V0SW5jbHVkZUxpdmVDb25zdHJhaW50cyh0cnVlKTsKLQkJYmF0Y2hWYWxpZGF0b3Iuc2V0UmVwb3J0U3VjY2Vzc2VzKGZhbHNlKTsKLQkJYmF0Y2hWYWxpZGF0b3IuYWRkQ29uc3RyYWludEZpbHRlcihuZXcgSUNvbnN0cmFpbnRGaWx0ZXIoKSB7Ci0KLQkJCXB1YmxpYyBib29sZWFuIGFjY2VwdChJQ29uc3RyYWludERlc2NyaXB0b3IgY29uc3RyYWludCwKLQkJCQkJRU9iamVjdCB0YXJnZXQpIHsKLQkJCQlTZXQ8Q2F0ZWdvcnk+IGNhdGVnb3JpZXMgPSBjb25zdHJhaW50LmdldENhdGVnb3JpZXMoKTsKLQkJCQlpZihjYXRlZ29yaWVzICE9IG51bGwgJiYgIWNhdGVnb3JpZXMuaXNFbXB0eSgpKSB7Ci0JCQkJCWZvciAoSXRlcmF0b3I8Q2F0ZWdvcnk+IGl0ZXJhdG9yID0gY2F0ZWdvcmllcy5pdGVyYXRvcigpOyBpdGVyYXRvcgotCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlDYXRlZ29yeSBjYXRlZ29yeSA9IChDYXRlZ29yeSkgaXRlcmF0b3IubmV4dCgpOwotCQkJCQkJaWYoQ09OU1RSQUlOVF9DQVRFR09SWS5lcXVhbHMoY2F0ZWdvcnkuZ2V0SWQoKSkpIHsKLQkJCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQkKLQkJfSk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGUoRU9iamVjdCBlT2JqZWN0LCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsCi0JCQlNYXAgY29udGV4dCkgewotCQlyZXR1cm4gdmFsaWRhdGUoZU9iamVjdC5lQ2xhc3MoKSwgZU9iamVjdCwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIEltcGxlbWVudHMgdmFsaWRhdGlvbiBieSBkZWxlZ2F0aW9uIHRvIHRoZSBFTUYgdmFsaWRhdGlvbiBmcmFtZXdvcmsuCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGUoRUNsYXNzIGVDbGFzcywgRU9iamVjdCBlT2JqZWN0LAotCQkJRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQkvLyBmaXJzdCwgZG8gd2hhdGV2ZXIgdGhlIGJhc2ljIEVjb3JlVmFsaWRhdG9yIGRvZXMKLQkJLy8gc3VwZXIudmFsaWRhdGUoZUNsYXNzLCBlT2JqZWN0LCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0KLQkJSVN0YXR1cyBzdGF0dXMgPSBTdGF0dXMuT0tfU1RBVFVTOwotCi0JCWJvb2xlYW4gY2lyY3VsYXJDaGVja09rID0gdHJ1ZTsKLQkJRGVwZW5kZW5jeVZhbGlkYXRpb25NZ3IgbWdyID0gKERlcGVuZGVuY3lWYWxpZGF0aW9uTWdyKSBjb250ZXh0LmdldChDVFhfREVQRU5ERU5DWV9WQUxJREFUSU9OX01HUik7Ci0JCWlmIChEZXBlbmRlbmN5Q2hlY2tlci5uZXdDaGVjayAmJiBtZ3IgIT0gbnVsbCAmJiAKLQkJCQkoZU9iamVjdCBpbnN0YW5jZW9mIFZhcmlhYmlsaXR5RWxlbWVudCB8fCBlT2JqZWN0IGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luKSkgewotCQkJc3RhdHVzID0gbWdyLmNoZWNrQ2lyY3VsYXJEZXBlbmRuZWN5KChNZXRob2RFbGVtZW50KSBlT2JqZWN0KTsKLQkJCWlmKCFzdGF0dXMuaXNPSygpKSB7Ci0JCQkJY2lyY3VsYXJDaGVja09rID0gZmFsc2U7Ci0JCQkJU3RyaW5nIG1zZyA9IHN0YXR1cy5nZXRNZXNzYWdlKCk7Ci0JCQkJaWYoU3RyVXRpbC5pc0JsYW5rKG1zZykpIHsKLQkJCQkJLy9tc2cgPSBOTFMuYmluZChWYWxpZGF0aW9uUmVzb3VyY2VzLmNpcmN1bGFyRGVwZW5kZW5jeV9lcnJvciwgcmVmLmdldEVDb250YWluaW5nQ2xhc3MoKS5nZXROYW1lKCksIHJlZi5nZXROYW1lKCkpOwotCQkJCQltc2cgPSBWYWxpZGF0aW9uUmVzb3VyY2VzLmNpcmN1bGFyRGVwZW5kZW5jeV9lcnJvcjsKLQkJCQl9Ci0JCQkJYXBwZW5kRGlhZ25vc3RpY3Moc3RhdHVzLCBkaWFnbm9zdGljcyk7Ci0JCQl9Ci0JCX0KLQkJCi0JCS8vIG5vIHBvaW50IGluIHZhbGlkYXRpbmcgaWYgd2UgY2FuJ3QgcmVwb3J0IHJlc3VsdHMKLQkJaWYgKGRpYWdub3N0aWNzICE9IG51bGwpIHsKLQkJCS8vIGlmIEVNRiBNb2RlIFZhbGlkYXRpb24gU2VydmljZSBhbHJlYWR5IGNvdmVyZWQgdGhlIHN1Yi10cmVlLAotCQkJLy8gd2hpY2ggaXQgZG9lcyBmb3IgZWZmaWNpZW50IGNvbXB1dGF0aW9uIGFuZCBlcnJvciByZXBvcnRpbmcsCi0JCQkvLyB0aGVuIGRvbid0IHJlcGVhdCAodGhlIERpYWdub3N0aWNpYW4gZG9lcyB0aGUgcmVjdXJzaW9uCi0JCQkvLyBleHRlcm5hbGx5KS4gSWYgdGhlcmUgaXMgbm8gY29udGV4dCBtYXAsIHRoZW4gd2UgY2FuJ3QKLQkJCS8vIGhlbHAgaXQKLQkJCWlmICghaGFzUHJvY2Vzc2VkKGVPYmplY3QsIGNvbnRleHQpKSB7Ci0JCQkJaWYgKGdldFRyYXZlcnNhbFR5cGUoY29udGV4dCkgPT0gTGlicmFyeVRyYXZlcnNhbFN0cmF0ZWd5LkRFRVApIHsKLQkJCQkJYmF0Y2hWYWxpZGF0b3IKLQkJCQkJCQkuc2V0VHJhdmVyc2FsU3RyYXRlZ3koTGlicmFyeVRyYXZlcnNhbFN0cmF0ZWd5LmRlZXBUcmF2ZXJzYWxTdHJhdGVneSk7Ci0JCQkJfQotCQkJCQotCQkJCUlDb25zdHJhaW50RmlsdGVyIGZpbHRlciA9IChJQ29uc3RyYWludEZpbHRlcikgY29udGV4dC5nZXQoQ1RYX0NPTlNUUkFJTlRfRklMVEVSKTsKLQkJCQlpZihmaWx0ZXIgIT0gbnVsbCkgewotCQkJCQliYXRjaFZhbGlkYXRvci5hZGRDb25zdHJhaW50RmlsdGVyKGZpbHRlcik7Ci0JCQkJfQotCQkJCXRyeSB7Ci0JCQkJCXN0YXR1cyA9IGJhdGNoVmFsaWRhdG9yLnZhbGlkYXRlKGVPYmplY3QsCi0JCQkJCQkJbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCQkJfSBmaW5hbGx5IHsKLQkJCQkJaWYgKGZpbHRlciAhPSBudWxsKSB7Ci0JCQkJCQliYXRjaFZhbGlkYXRvci5yZW1vdmVDb25zdHJhaW50RmlsdGVyKGZpbHRlcik7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQlwcm9jZXNzZWQoZU9iamVjdCwgY29udGV4dCwgc3RhdHVzKTsKLQotCQkJCWFwcGVuZERpYWdub3N0aWNzKHN0YXR1cywgZGlhZ25vc3RpY3MpOwotCQkJfQotCQl9Ci0KLQkJaWYgKGVPYmplY3QgaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50KSB7Ci0JCQlQcm9jZXNzIHByb2MgPSAoKFByb2Nlc3NDb21wb25lbnQpIGVPYmplY3QpLmdldFByb2Nlc3MoKTsKLQkJCWlmIChwcm9jICE9IG51bGwpIHsKLQkJCQl2YWxpZGF0ZVByb2Nlc3MocHJvYywgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGNpcmN1bGFyQ2hlY2tPayAmJiBzdGF0dXMuaXNPSygpOwotCX0KLQkKLQkvKioKLQkgKiBAcGFyYW0gcHJvYwotCSAqIEBwYXJhbSBkaWFnbm9zdGljcwotCSAqIEBwYXJhbSBjb250ZXh0Ci0JICovCi0JcHVibGljIHZvaWQgdmFsaWRhdGVQcm9jZXNzKFByb2Nlc3MgcHJvYywgZmluYWwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLAotCQkJTWFwIGNvbnRleHQpIHsKLQkJT2JqZWN0IG8gPSBjb250ZXh0LmdldChDVFhfQURBUFRFUl9GQUNUT1JZX1BST1ZJREVSKTsKLQkJaWYgKCEobyBpbnN0YW5jZW9mIElBZGFwdGVyRmFjdG9yeVByb3ZpZGVyKSkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJY2xhc3MgRmlsdGVyZWRBZGFwdGVyRmFjdG9yeVRyZWVJdGVyYXRvciBleHRlbmRzIEFkYXB0ZXJGYWN0b3J5VHJlZUl0ZXJhdG9yIHsKLQkJCQotCQkJcHVibGljIEZpbHRlcmVkQWRhcHRlckZhY3RvcnlUcmVlSXRlcmF0b3IoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksIE9iamVjdCBvYmplY3QpIHsKLQkJCQlzdXBlcihhZGFwdGVyRmFjdG9yeSwgb2JqZWN0KTsKLQkJCX0KLQkJCQotCQkJcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0KE9iamVjdCBjaGlsZCkgewotCQkJCXJldHVybiBjaGlsZCBpbnN0YW5jZW9mIE5hbWVkRWxlbWVudDsKLQkJCX0KLQkJCQotCQkJLyoqCi0JCQkgKiBDb21tZW50IGZvciA8Y29kZT5zZXJpYWxWZXJzaW9uVUlEPC9jb2RlPgotCQkJICovCi0JCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAwTDsKLQotCQkJLyoKLQkJCSAqIChub24tSmF2YWRvYykKLQkJCSAqIAotCQkJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5BZGFwdGVyRmFjdG9yeVRyZWVJdGVyYXRvciNnZXRDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0KQotCQkJICovCi0JCQlwcm90ZWN0ZWQgSXRlcmF0b3IgZ2V0Q2hpbGRyZW4oT2JqZWN0IG8pIHsKLQkJCQlBcnJheUxpc3QgY2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gc3VwZXIuZ2V0Q2hpbGRyZW4obyk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQlPYmplY3QgY2hpbGQgPSBpdGVyLm5leHQoKTsKLQkJCQkJaWYgKGNoaWxkIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudAotCQkJCQkJCXx8IChjaGlsZCBpbnN0YW5jZW9mIERlc2NyaWJhYmxlRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIKLQkJCQkJCQkmJiAhKChEZXNjcmliYWJsZUVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSBjaGlsZCkuaXNSZWFkT25seSgpKSkgewotCQkJCQkJY2hpbGRyZW4uYWRkKGNoaWxkKTsKLQkJCQkJCWNoaWxkID0gVG5nVXRpbC51bndyYXAoY2hpbGQpOwotCQkJCQl9Ci0JCQkJCWlmIChhY2NlcHQoY2hpbGQpKSB7Ci0JCQkJCQl0cnkgewotCQkJCQkJCUFycmF5TGlzdCBmZWF0dXJlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJCQlmZWF0dXJlcy5hZGQoVW1hUGFja2FnZS5MaXRlcmFscy5OQU1FRF9FTEVNRU5UX19OQU1FKTsKLQkJCQkJCQlpZihjaGlsZCBpbnN0YW5jZW9mIERlc2NyaWJhYmxlRWxlbWVudCkgewotCQkJCQkJCQlmZWF0dXJlcy5hZGQoVW1hUGFja2FnZS5MaXRlcmFscy5NRVRIT0RfRUxFTUVOVF9fUFJFU0VOVEFUSU9OX05BTUUpOwotCQkJCQkJCX0KLQkJCQkJCQlOYW1lZEVsZW1lbnQgZSA9IChOYW1lZEVsZW1lbnQpIGNoaWxkOwotCQkJCQkJCWlmIChlIGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudCkgewotCQkJCQkJCQkvL2NvbnRpbnVlOwotCQkJCQkJCX0KLQkJCQkJCQlpZihERUJVRykgewotCQkJCQkJCQlTeXN0ZW0ub3V0Ci0JCQkJCQkJCQkJLnByaW50bG4oIkZpbHRlcmVkQWRhcHRlckZhY3RvcnlUcmVlSXRlcmF0b3IuZ2V0Q2hpbGRyZW4oKTogdmFsaWRhdGluZyAnIiArIGUuZ2V0TmFtZSgpICsgIiciKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQkJfQotCQkJCQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBmZWF0dXJlcy5pdGVyYXRvcigpOyBpdGVyYXRvcgotCQkJCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSAoRVN0cnVjdHVyYWxGZWF0dXJlKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCQkJCUlWYWxpZGF0b3IgdmFsaWRhdG9yID0gSVZhbGlkYXRvckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJCQkJCQkuY3JlYXRlVmFsaWRhdG9yKG8sIG51bGwsCi0JCQkJCQkJCQkJCQkoRU9iamVjdCkgY2hpbGQsIGZlYXR1cmUsCi0JCQkJCQkJCQkJCQlhZGFwdGVyRmFjdG9yeSk7Ci0JCQkJCQkJCU9iamVjdCBpdGVtUHJvdmlkZXIgPSBhZGFwdGVyRmFjdG9yeS5hZGFwdChjaGlsZCwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCQkJCQkJU3RyaW5nIHByb3AgPSAoU3RyaW5nKSBmZWF0dXJlVG9Qcm9wZXJ0eU1hcC5nZXQoZmVhdHVyZSk7Ci0JCQkJCQkJCVN0cmluZyBuYW1lOwotCQkJCQkJCQlpZihpdGVtUHJvdmlkZXIgaW5zdGFuY2VvZiBJQlNJdGVtUHJvdmlkZXIgJiYgcHJvcCAhPSBudWxsKSB7Ci0JCQkJCQkJCQluYW1lID0gKChJQlNJdGVtUHJvdmlkZXIpaXRlbVByb3ZpZGVyKS5nZXRBdHRyaWJ1dGUoY2hpbGQsIHByb3ApOwotCQkJCQkJCQl9Ci0JCQkJCQkJCWVsc2UgewotCQkJCQkJCQkJbmFtZSA9IChTdHJpbmcpIGUuZUdldChmZWF0dXJlKTsKLQkJCQkJCQkJfQotCQkJCQkJCQlTdHJpbmcgbXNnID0gdmFsaWRhdG9yLmlzVmFsaWQobmFtZSk7Ci0JCQkJCQkJCWlmIChtc2cgIT0gbnVsbCkgewotCQkJCQkJCQkJYXBwZW5kRGlhZ25vc3RpY3MobmV3IFZhbGlkYXRpb25TdGF0dXMoCi0JCQkJCQkJCQkJCUlTdGF0dXMuRVJST1IsIDAsIG1zZywgZSwgZmVhdHVyZSksCi0JCQkJCQkJCQkJCWRpYWdub3N0aWNzKTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0JCQkJCi0JCQkJcmV0dXJuIGNoaWxkcmVuLml0ZXJhdG9yKCk7Ci0JCQl9Ci0JCX07Ci0JCUlBZGFwdGVyRmFjdG9yeVByb3ZpZGVyIHByb3ZpZGVyID0gKElBZGFwdGVyRmFjdG9yeVByb3ZpZGVyKSBvOwotCQlJdGVyYXRvciBpdGVyYXRvciA9IG5ldyBGaWx0ZXJlZEFkYXB0ZXJGYWN0b3J5VHJlZUl0ZXJhdG9yKHByb3ZpZGVyCi0JCQkJLmdldFdCU0FkYXB0ZXJGYWN0b3J5KCksIHByb2MpOwotCQlmb3IgKDsgaXRlcmF0b3IuaGFzTmV4dCgpOyBpdGVyYXRvci5uZXh0KCkpCi0JCQk7Ci0JCQotCQlpdGVyYXRvciA9IG5ldyBGaWx0ZXJlZEFkYXB0ZXJGYWN0b3J5VHJlZUl0ZXJhdG9yKHByb3ZpZGVyLmdldFRCU0FkYXB0ZXJGYWN0b3J5KCksIHByb2MpIHsKLQkJCS8qKgotCQkJICogQ29tbWVudCBmb3IgPGNvZGU+c2VyaWFsVmVyc2lvblVJRDwvY29kZT4KLQkJCSAqLwotCQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkJCS8qIChub24tSmF2YWRvYykKLQkJCSAqIEBzZWUgI2FjY2VwdChqYXZhLmxhbmcuT2JqZWN0KQotCQkJICovCi0JCQlwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHQoT2JqZWN0IGNoaWxkKSB7Ci0JCQkJcmV0dXJuIGNoaWxkIGluc3RhbmNlb2YgUm9sZURlc2NyaXB0b3IgfHwgY2hpbGQgaW5zdGFuY2VvZiBUZWFtUHJvZmlsZTsKLQkJCX0KLQkJfTsKLQkJZm9yICg7IGl0ZXJhdG9yLmhhc05leHQoKTsgaXRlcmF0b3IubmV4dCgpKQotCQkJOwotCQkKLQkJaXRlcmF0b3IgPSBuZXcgRmlsdGVyZWRBZGFwdGVyRmFjdG9yeVRyZWVJdGVyYXRvcihwcm92aWRlci5nZXRXUEJTQWRhcHRlckZhY3RvcnkoKSwgcHJvYykgewotCQkJLyoqCi0JCQkgKiBDb21tZW50IGZvciA8Y29kZT5zZXJpYWxWZXJzaW9uVUlEPC9jb2RlPgotCQkJICovCi0JCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCQkJLyogKG5vbi1KYXZhZG9jKQotCQkJICogQHNlZSAjYWNjZXB0KGphdmEubGFuZy5PYmplY3QpCi0JCQkgKi8KLQkJCXByb3RlY3RlZCBib29sZWFuIGFjY2VwdChPYmplY3QgY2hpbGQpIHsKLQkJCQlyZXR1cm4gY2hpbGQgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3I7Ci0JCQl9Ci0JCX07Ci0JCWZvciAoOyBpdGVyYXRvci5oYXNOZXh0KCk7IGl0ZXJhdG9yLm5leHQoKSkKLQkJCTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBpbnQgZ2V0VHJhdmVyc2FsVHlwZShNYXAgY29udGV4dCkgewotCQlPYmplY3QgdHlwZSA9IGNvbnRleHQuZ2V0KExpYnJhcnlUcmF2ZXJzYWxTdHJhdGVneS5UUkFWRVJTQUxfVFlQRSk7Ci0JCXJldHVybiAodHlwZSBpbnN0YW5jZW9mIE51bWJlciAmJiAoKE51bWJlcikgdHlwZSkuaW50VmFsdWUoKSA9PSBMaWJyYXJ5VHJhdmVyc2FsU3RyYXRlZ3kuREVFUCkgPyBMaWJyYXJ5VHJhdmVyc2FsU3RyYXRlZ3kuREVFUAotCQkJCTogTGlicmFyeVRyYXZlcnNhbFN0cmF0ZWd5LlNIQURPVzsKLQl9Ci0KLQkvKioKLQkgKiBEaXJlY3QgdmFsaWRhdGlvbiBvZiB7QGxpbmsgRURhdGFUeXBlfXMgaXMgbm90IHN1cHBvcnRlZCBieSB0aGUgRU1GCi0JICogdmFsaWRhdGlvbiBmcmFtZXdvcms7IHRoZXkgYXJlIHZhbGlkYXRlZCBpbmRpcmVjdGx5IHZpYSB0aGUKLQkgKiB7QGxpbmsgRU9iamVjdH1zIHRoYXQgaG9sZCB0aGVpciB2YWx1ZXMuCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGUoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IHZhbHVlLAotCQkJRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlyZXR1cm4gc3VwZXIudmFsaWRhdGUoZURhdGFUeXBlLCB2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIElmIHdlIGhhdmUgYSBjb250ZXh0IG1hcCwgcmVjb3JkIHRoaXMgb2JqZWN0J3MgPGNvZGU+c3RhdHVzPC9jb2RlPiBpbgotCSAqIGl0IHNvIHRoYXQgd2Ugd2lsbCBrbm93IGxhdGVyIHRoYXQgd2UgaGF2ZSBwcm9jZXNzZWQgaXQgYW5kIGl0cyBzdWItdHJlZS4KLQkgKiAKLQkgKiBAcGFyYW0gZU9iamVjdAotCSAqICAgICAgICAgICAgYW4gZWxlbWVudCB0aGF0IHdlIGhhdmUgdmFsaWRhdGVkCi0JICogQHBhcmFtIGNvbnRleHQKLQkgKiAgICAgICAgICAgIHRoZSBjb250ZXh0IChtYXkgYmUgPGNvZGU+bnVsbDwvY29kZT4pCi0JICogQHBhcmFtIHN0YXR1cwotCSAqICAgICAgICAgICAgdGhlIGVsZW1lbnQncyB2YWxpZGF0aW9uIHN0YXR1cwotCSAqLwotCXByaXZhdGUgdm9pZCBwcm9jZXNzZWQoRU9iamVjdCBlT2JqZWN0LCBNYXAgY29udGV4dCwgSVN0YXR1cyBzdGF0dXMpIHsKLQkJaWYgKGNvbnRleHQgIT0gbnVsbCkgewotCQkJY29udGV4dC5wdXQoZU9iamVjdCwgc3RhdHVzKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIERldGVybWluZXMgd2hldGhlciB3ZSBoYXZlIHByb2Nlc3NlZCB0aGlzIDxjb2RlPmVPYmplY3Q8L2NvZGU+IGJlZm9yZSwKLQkgKiBieSBhdXRvbWF0aWMgcmVjdXJzaW9uIG9mIHRoZSBFTUYgTW9kZWwgVmFsaWRhdGlvbiBTZXJ2aWNlLiBUaGlzIGlzIG9ubHkKLQkgKiBwb3NzaWJsZSBpZiB3ZSBkbywgaW5kZWVkLCBoYXZlIGEgY29udGV4dC4KLQkgKiAKLQkgKiBAcGFyYW0gZU9iamVjdAotCSAqICAgICAgICAgICAgYW4gZWxlbWVudCB0byBiZSB2YWxpZGF0ZWQgKHdlIGhvcGUgbm90KQotCSAqIEBwYXJhbSBjb250ZXh0Ci0JICogICAgICAgICAgICB0aGUgY29udGV4dCAobWF5IGJlIDxjb2RlPm51bGw8L2NvZGU+KQotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGNvbnRleHQgaXMgbm90IDxjb2RlPm51bGw8L2NvZGU+IGFuZAotCSAqICAgICAgICAgdGhlIDxjb2RlPmVPYmplY3Q8L2NvZGU+IG9yIG9uZSBvZiBpdHMgY29udGFpbmVycyBoYXMgYWxyZWFkeQotCSAqICAgICAgICAgYmVlbiB2YWxpZGF0ZWQ7IDxjb2RlPmZhbHNlPC9jb2RlPiwgb3RoZXJ3aXNlCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGhhc1Byb2Nlc3NlZChFT2JqZWN0IGVPYmplY3QsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0KLQkJaWYgKGNvbnRleHQgIT0gbnVsbCkgewotCQkJLy8gdGhpcyBpcyBPKE5sb2dOKSBidXQgdGhlcmUncyBubyBoZWxwaW5nIGl0Ci0JCQl3aGlsZSAoZU9iamVjdCAhPSBudWxsKSB7Ci0JCQkJaWYgKGNvbnRleHQuY29udGFpbnNLZXkoZU9iamVjdCkpIHsKLQkJCQkJcmVzdWx0ID0gdHJ1ZTsKLQkJCQkJZU9iamVjdCA9IG51bGw7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJZU9iamVjdCA9IGVPYmplY3QuZUNvbnRhaW5lcigpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQ29udmVydHMgYSBzdGF0dXMgcmVzdWx0IGZyb20gdGhlIEVNRiB2YWxpZGF0aW9uIHNlcnZpY2UgdG8gZGlhZ25vc3RpY3MuCi0JICogCi0JICogQHBhcmFtIHN0YXR1cwotCSAqICAgICAgICAgICAgdGhlIEVNRiB2YWxpZGF0aW9uIHNlcnZpY2UncyBzdGF0dXMgcmVzdWx0Ci0JICogQHBhcmFtIGRpYWdub3N0aWNzCi0JICogICAgICAgICAgICBhIGRpYWdub3N0aWMgY2hhaW4gdG8gYWNjdW11bGF0ZSByZXN1bHRzIG9uCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFwcGVuZERpYWdub3N0aWNzKElTdGF0dXMgc3RhdHVzLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MpIHsKLQkJaWYgKHN0YXR1cy5pc011bHRpU3RhdHVzKCkpIHsKLQkJCUlTdGF0dXNbXSBjaGlsZHJlbiA9IHN0YXR1cy5nZXRDaGlsZHJlbigpOwotCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7Ci0JCQkJYXBwZW5kRGlhZ25vc3RpY3MoY2hpbGRyZW5baV0sIGRpYWdub3N0aWNzKTsKLQkJCX0KLQkJfSBlbHNlIGlmIChzdGF0dXMgaW5zdGFuY2VvZiBJQ29uc3RyYWludFN0YXR1cykgewotCQkJZGlhZ25vc3RpY3MuYWRkKG5ldyBCYXNpY0RpYWdub3N0aWMoc3RhdHVzLmdldFNldmVyaXR5KCksIHN0YXR1cwotCQkJCQkuZ2V0UGx1Z2luKCksIHN0YXR1cy5nZXRDb2RlKCksIHN0YXR1cy5nZXRNZXNzYWdlKCksCi0JCQkJCSgoSUNvbnN0cmFpbnRTdGF0dXMpIHN0YXR1cykuZ2V0UmVzdWx0TG9jdXMoKS50b0FycmF5KCkpKTsKLQkJfSBlbHNlIGlmIChzdGF0dXMgaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb24uVmFsaWRhdGlvblN0YXR1cykgewotCQkJZGlhZ25vc3RpY3MuYWRkKG5ldyBCYXNpY0RpYWdub3N0aWMoc3RhdHVzLmdldFNldmVyaXR5KCksIHN0YXR1cwotCQkJCQkuZ2V0UGx1Z2luKCksIHN0YXR1cy5nZXRDb2RlKCksIHN0YXR1cy5nZXRNZXNzYWdlKCksCi0JCQkJCW5ldyBPYmplY3RbXSB7ICgob3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLlZhbGlkYXRpb25TdGF0dXMpIHN0YXR1cykKLQkJCQkJCQkuZ2V0Q2hlY2tlZE9iamVjdCgpIH0pKTsKLQkJfSBlbHNlIHsKLQkJCWRpYWdub3N0aWNzLmFkZChuZXcgQmFzaWNEaWFnbm9zdGljKHN0YXR1cy5nZXRTZXZlcml0eSgpLCBzdGF0dXMKLQkJCQkJLmdldFBsdWdpbigpLCBzdGF0dXMuZ2V0Q29kZSgpLCBzdGF0dXMuZ2V0TWVzc2FnZSgpLAotCQkJCQludWxsKSk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi52YWxpZGF0aW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvdmFsaWRhdGlvbi9SZXNvdXJjZXMucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi52YWxpZGF0aW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvdmFsaWRhdGlvbi9SZXNvdXJjZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjcyYTQyNy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudmFsaWRhdGlvbi9zcmMvb3JnL2VjbGlwc2UvZXBmL3ZhbGlkYXRpb24vUmVzb3VyY2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUgotCi1jaXJjdWxhckRlcGVuZGVuY3lfZXJyb3I9Q3ljbGVzIGZvdW5kIGluIHRoZSBkZXBlbmRlbmN5IGdyYXBoIG9mIHRoZSBhc3NvY2lhdGlvbiB7MH0uezF9CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudmFsaWRhdGlvbi9zcmMvb3JnL2VjbGlwc2UvZXBmL3ZhbGlkYXRpb24vVmFsaWRhdGlvblJlc291cmNlcy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnZhbGlkYXRpb24vc3JjL29yZy9lY2xpcHNlL2VwZi92YWxpZGF0aW9uL1ZhbGlkYXRpb25SZXNvdXJjZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDNkNTQ0OS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudmFsaWRhdGlvbi9zcmMvb3JnL2VjbGlwc2UvZXBmL3ZhbGlkYXRpb24vVmFsaWRhdGlvblJlc291cmNlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudmFsaWRhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLXB1YmxpYyBjbGFzcyBWYWxpZGF0aW9uUmVzb3VyY2VzIGV4dGVuZHMgTkxTIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAib3JnLmVjbGlwc2UuZXBmLnZhbGlkYXRpb24uUmVzb3VyY2VzIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2lyY3VsYXJEZXBlbmRlbmN5X2Vycm9yOwotCXN0YXRpYyB7Ci0JCS8vIGluaXRpYWxpemUgcmVzb3VyY2UgYnVuZGxlCi0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIFZhbGlkYXRpb25SZXNvdXJjZXMuY2xhc3MpOwotCX0KLQotCXByaXZhdGUgVmFsaWRhdGlvblJlc291cmNlcygpIHsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudmFsaWRhdGlvbi9zcmMvb3JnL2VjbGlwc2UvZXBmL3ZhbGlkYXRpb24vY29uc3RyYWludHMvTGlicmFyeVRyYXZlcnNhbFN0cmF0ZWd5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudmFsaWRhdGlvbi9zcmMvb3JnL2VjbGlwc2UvZXBmL3ZhbGlkYXRpb24vY29uc3RyYWludHMvTGlicmFyeVRyYXZlcnNhbFN0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhMjM0NTEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnZhbGlkYXRpb24vc3JjL29yZy9lY2xpcHNlL2VwZi92YWxpZGF0aW9uL2NvbnN0cmFpbnRzL0xpYnJhcnlUcmF2ZXJzYWxTdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjk2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi52YWxpZGF0aW9uLmNvbnN0cmFpbnRzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRUNvbnRlbnRzRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsLkNvbnRlbnRUcmVlSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnZhbGlkYXRpb24uc2VydmljZS5BYnN0cmFjdFRyYXZlcnNhbFN0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi52YWxpZGF0aW9uLnNlcnZpY2UuSVRyYXZlcnNhbFN0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Nb2RlbFN0cnVjdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnN0cmFpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ3VzdG9tQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlICAxLjEKLSAqLwotcHVibGljIGNsYXNzIExpYnJhcnlUcmF2ZXJzYWxTdHJhdGVneSBleHRlbmRzIEFic3RyYWN0VHJhdmVyc2FsU3RyYXRlZ3kgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRSQVZFUlNBTF9UWVBFID0gIlRSQVZFUlNBTF9UWVBFIjsgLy8kTk9OLU5MUy0xJAotCS8qKgotCSAqIFRyYXZlcnNhbCBzdHJhdGVneSB0eXBlIGNvbnN0YW50IGZvciBzaGFkb3cgdHJhdmVyc2FsCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0hBRE9XID0gMDsKLQkKLQkvKioKLQkgKiBUcmF2ZXJzYWwgc3RyYXRlZ3kgdHlwZSBjb25zdGFudCBmb3IgZGVlcCB0cmF2ZXJzYWwKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERUVQID0gMTsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIElUcmF2ZXJzYWxTdHJhdGVneSBkZWVwVHJhdmVyc2FsU3RyYXRlZ3kgPSBuZXcgTGlicmFyeVRyYXZlcnNhbFN0cmF0ZWd5KERFRVApOwotCQotCXB1YmxpYyBzdGF0aWMgY2xhc3MgTGlicmFyeUl0ZXJhdG9yIGV4dGVuZHMgQ29udGVudFRyZWVJdGVyYXRvciB7Ci0JCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC0xMTc1NDI4MDI3NTAzNDQwOTcwTDsKLQkJcHJpdmF0ZSBpbnQgdHJhdmVyc2FsVHlwZSA9IERFRVA7Ci0JCQotCQlwcm90ZWN0ZWQgTGlicmFyeUl0ZXJhdG9yKENvbGxlY3Rpb24gZW1mT2JqZWN0cykgewotCQkJc3VwZXIoZW1mT2JqZWN0cyk7Ci0JCX0KLQkJCi0JCS8qKgotCQkgKiBAcGFyYW0gb2JqZWN0Ci0JCSAqIEBwYXJhbSBpc1Jlc29sdmVQcm94aWVzCi0JCSAqLwotCQlwdWJsaWMgTGlicmFyeUl0ZXJhdG9yKENvbGxlY3Rpb24gZU9iamVjdHMsIGJvb2xlYW4gaXNSZXNvbHZlUHJveGllcywgaW50IHRyYXZlcnNhbFR5cGUsIGJvb2xlYW4gZGlzam9pbnQpIHsKLQkJCXN1cGVyKGRpc2pvaW50ID8gbWFrZVRhcmdldHNEaXNqb2ludChlT2JqZWN0cykgOiBlT2JqZWN0cywgaXNSZXNvbHZlUHJveGllcyk7Ci0JCQl0aGlzLnRyYXZlcnNhbFR5cGUgID0gdHJhdmVyc2FsVHlwZTsKLQkJfQotCQkKLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBJdGVyYXRvcjw/PiBnZXRFT2JqZWN0Q2hpbGRyZW4oRU9iamVjdCBvYmplY3QpIHsKLQkJCWlmKHRyYXZlcnNhbFR5cGUgPT0gREVFUCkgewotCQkJCWlmKCEob2JqZWN0IGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkKLQkJCQkJCXx8IChvYmplY3QgaW5zdGFuY2VvZiBDb25zdHJhaW50IHx8IG9iamVjdCBpbnN0YW5jZW9mIERpYWdyYW1FbGVtZW50KSkgCi0JCQkJewotCQkJCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVC5pdGVyYXRvcigpOwotCQkJCX0KLQkJCQlyZXR1cm4gc3VwZXIuZ2V0RU9iamVjdENoaWxkcmVuKG9iamVjdCk7Ci0JCQl9Ci0JCQkKLQkJCWlmKG9iamVjdCBpbnN0YW5jZW9mIEN1c3RvbUNhdGVnb3J5KSB7Ci0JCQkJcmV0dXJuIGdldEVPYmplY3RDaGlsZHJlbigoQ3VzdG9tQ2F0ZWdvcnkpb2JqZWN0LCBVbWFQYWNrYWdlLkxpdGVyYWxzLkNVU1RPTV9DQVRFR09SWV9fQ0FURUdPUklaRURfRUxFTUVOVFMsCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkNVU1RPTV9DQVRFR09SWSk7Ci0JCQl9Ci0JCQllbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50Ci0JCQkJCXx8IG9iamVjdCBpbnN0YW5jZW9mIE1ldGhvZENvbmZpZ3VyYXRpb24KLQkJCQkJfHwgb2JqZWN0IGluc3RhbmNlb2YgQ29udGVudEVsZW1lbnQKLQkJCSkgewotCQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNULml0ZXJhdG9yKCk7Ci0JCQl9Ci0JCQllbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBNZXRob2RQYWNrYWdlKSB7Ci0JCQkJTWV0aG9kUGFja2FnZSBwa2cgPSAoTWV0aG9kUGFja2FnZSkgb2JqZWN0OwotCQkJCWlmKFRuZ1V0aWwuaXNQcmVkZWZpbmVkKHBrZykgJiYgTW9kZWxTdHJ1Y3R1cmUuQ1VTVE9NX0NBVEVHT1JZX1BBQ0tBR0VfTkFNRS5lcXVhbHMocGtnLmdldE5hbWUoKSkpIHsKLQkJCQkJLy8gdGhpcyBpcyB0aGUgY29udGVudCBwYWNrYWdlIHRoYXQgY29udGFpbnMgYWxsIHRoZSBjdXN0b20gY2F0ZWdvcmllcwotCQkJCQkvLyByZXR1cm4gcm9vdCBjdXN0b20gY2F0ZWdvcnkgYXMgaXRzIG9ubHkgY2hpbGQKLQkJCQkJLy8KLQkJCQkJQ29udGVudFBhY2thZ2UgaGlkZGVuUGtnID0gVW1hVXRpbC5maW5kQ29udGVudFBhY2thZ2UocGtnCi0JCQkJCQkJLmdldENoaWxkUGFja2FnZXMoKSwgTW9kZWxTdHJ1Y3R1cmUuSElEREVOX1BBQ0tBR0VfTkFNRSk7Ci0JCQkJCWlmIChoaWRkZW5Qa2cgIT0gbnVsbCAmJiAhaGlkZGVuUGtnLmdldENvbnRlbnRFbGVtZW50cygpLmlzRW1wdHkoKSkgewotCQkJCQkJcmV0dXJuIGhpZGRlblBrZy5nZXRDb250ZW50RWxlbWVudHMoKS5pdGVyYXRvcigpOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1QuaXRlcmF0b3IoKTsKLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJcmV0dXJuIGdldEVPYmplY3RDaGlsZHJlbihwa2csIFVtYVBhY2thZ2UuTGl0ZXJhbHMuTUVUSE9EX1BBQ0tBR0VfX0NISUxEX1BBQ0tBR0VTLCBudWxsKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBNZXRob2RMaWJyYXJ5KSB7Ci0JCQkJcmV0dXJuIGdldEVPYmplY3RDaGlsZHJlbigKLQkJCQkJCShNZXRob2RMaWJyYXJ5KSBvYmplY3QsCi0JCQkJCQluZXcgRVN0cnVjdHVyYWxGZWF0dXJlW10gewotCQkJCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLk1FVEhPRF9MSUJSQVJZX19NRVRIT0RfUExVR0lOUywKLQkJCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5NRVRIT0RfTElCUkFSWV9fUFJFREVGSU5FRF9DT05GSUdVUkFUSU9OUyB9KTsKLQkJCX0KLQkJCWVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikgewotCQkJCXJldHVybiBnZXRFT2JqZWN0Q2hpbGRyZW4oKEVPYmplY3QpIG9iamVjdCwgVW1hUGFja2FnZS5MaXRlcmFscy5NRVRIT0RfUExVR0lOX19NRVRIT0RfUEFDS0FHRVMsIG51bGwpOwotCQkJfQotCQkJZWxzZSBpZiAob2JqZWN0ID09IHRoaXMub2JqZWN0KSB7Ci0JCQkJcmV0dXJuICgoQ29sbGVjdGlvbilvYmplY3QpLml0ZXJhdG9yKCk7Ci0JCQl9Ci0JCQkKLQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNULml0ZXJhdG9yKCk7Ci0JCX0KLQkJCi0JCXByaXZhdGUgSXRlcmF0b3IgZ2V0RU9iamVjdENoaWxkcmVuKEVPYmplY3QgZU9iamVjdCwgRVN0cnVjdHVyYWxGZWF0dXJlW10gZmVhdHVyZXMpIHsKLQkJCUVDb250ZW50c0VMaXN0IGxpc3QgPSBuZXcgRUNvbnRlbnRzRUxpc3QoZU9iamVjdCwgZmVhdHVyZXMpOwotCQkJcmV0dXJuIGlzUmVzb2x2ZVByb3hpZXMoKSA/IGxpc3QuaXRlcmF0b3IoKSA6IGxpc3QuYmFzaWNJdGVyYXRvcigpOwotCQl9Ci0JCQotCQlwcml2YXRlIEl0ZXJhdG9yIGdldEVPYmplY3RDaGlsZHJlbihFT2JqZWN0IGVPYmplY3QsIEVSZWZlcmVuY2UgcmVmZXJlbmNlLCBFQ2xhc3MgZUNsYXNzKSB7Ci0JCQlJdGVyYXRvciBpdGVyOwotCQkJaWYocmVmZXJlbmNlLmlzTWFueSgpKSB7Ci0JCQkJYm9vbGVhbiByZXNvbHZlID0gaXNSZXNvbHZlUHJveGllcygpOwotCQkJCUxpc3QgbGlzdCA9IChMaXN0KSBlT2JqZWN0LmVHZXQocmVmZXJlbmNlLCByZXNvbHZlKTsKLQkJCQlpdGVyID0gIXJlc29sdmUgJiYgKGxpc3QgaW5zdGFuY2VvZiBJbnRlcm5hbEVMaXN0KSA/ICgoSW50ZXJuYWxFTGlzdClsaXN0KS5iYXNpY0l0ZXJhdG9yKCkgOiBsaXN0Lml0ZXJhdG9yKCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlPYmplY3QgdmFsdWUgPSBlT2JqZWN0LmVHZXQocmVmZXJlbmNlLCBpc1Jlc29sdmVQcm94aWVzKCkpOwotCQkJCWl0ZXIgPSB2YWx1ZSAhPSBudWxsID8gQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdCh2YWx1ZSkuaXRlcmF0b3IoKSA6IENvbGxlY3Rpb25zLkVNUFRZX0xJU1QuaXRlcmF0b3IoKTsKLQkJCX0KLQkJCWlmKGVDbGFzcyA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIGl0ZXI7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlBcnJheUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQl3aGlsZShpdGVyLmhhc05leHQoKSkgewotCQkJCQlPYmplY3QgbyA9IGl0ZXIubmV4dCgpOwotCQkJCQlpZihlQ2xhc3MuaXNJbnN0YW5jZShvKSkgewotCQkJCQkJbGlzdC5hZGQobyk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYobGlzdC5pc0VtcHR5KCkpIHsKLQkJCQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1QuaXRlcmF0b3IoKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCXJldHVybiBsaXN0Lml0ZXJhdG9yKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgaW50IGNvdW50RWxlbWVudHMoQ29sbGVjdGlvbiB0cmF2ZXJzYWxSb290cywgaW50IHRyYXZlcnNhbFR5cGUpIHsKLQkJcmV0dXJuIGNvdW50RWxlbWVudHModHJhdmVyc2FsUm9vdHMsIHRydWUsIHRyYXZlcnNhbFR5cGUpOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBpbnQgY291bnRFbGVtZW50cyhDb2xsZWN0aW9uIHRyYXZlcnNhbFJvb3RzLCBib29sZWFuIG1ha2VEaXNqb2ludCwgaW50IHRyYXZlcnNhbFR5cGUpIHsKLQkJaW50IGNvdW50ID0gMDsKLQkJZm9yKEl0ZXJhdG9yIGl0ZXIgPSBuZXcgTGlicmFyeUl0ZXJhdG9yKHRyYXZlcnNhbFJvb3RzLCB0cnVlLCB0cmF2ZXJzYWxUeXBlLCBtYWtlRGlzam9pbnQpOyBpdGVyLmhhc05leHQoKTsgY291bnQrKykgewotCQkJaXRlci5uZXh0KCk7Ci0JCX0KLQkJcmV0dXJuIGNvdW50OwotCX0KLQotCXByaXZhdGUgQ29sbGVjdGlvbiByb290czsKLQlwcml2YXRlIGJvb2xlYW4gY29udGV4dENoYW5nZWQgPSB0cnVlOwotCi0JcHJpdmF0ZSBpbnQgdHlwZSA9IERFRVA7Ci0JCi0JLyoqCi0JICogSW5pdGlhbGl6ZXMgbWUuCi0JICovCi0JcHVibGljIExpYnJhcnlUcmF2ZXJzYWxTdHJhdGVneSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JcHVibGljIExpYnJhcnlUcmF2ZXJzYWxTdHJhdGVneShpbnQgdHJhdmVyc2FsVHlwZSkgewotCQl0aGlzLnR5cGUgID0gdHJhdmVyc2FsVHlwZTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc3RhcnRUcmF2ZXJzYWwoCi0JCQlDb2xsZWN0aW9uIHRyYXZlcnNhbFJvb3RzLAotCQkJSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzc01vbml0b3IpIHsKLQkJCi0JCXJvb3RzID0gbWFrZVRhcmdldHNEaXNqb2ludCh0cmF2ZXJzYWxSb290cyk7Ci0JCQotCQlzdXBlci5zdGFydFRyYXZlcnNhbCh0cmF2ZXJzYWxSb290cywgcHJvZ3Jlc3NNb25pdG9yKTsKLQl9Ci0JCi0JcHJpdmF0ZSBDb2xsZWN0aW9uIGdldFJvb3RzKCkgewotCQlyZXR1cm4gcm9vdHM7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBJbXBsZW1lbnRzIHRoZSBpbmhlcml0ZWQgbWV0aG9kLgotCSAqLwotCXByb3RlY3RlZCBpbnQgY291bnRFbGVtZW50cyhDb2xsZWN0aW9uIGlnbm9yZWQpIHsKLQkJcmV0dXJuIGNvdW50RWxlbWVudHMoZ2V0Um9vdHMoKSwgZmFsc2UsIHR5cGUpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogSW1wbGVtZW50cyB0aGUgaW5oZXJpdGVkIG1ldGhvZC4KLQkgKi8KLQlwcm90ZWN0ZWQgSXRlcmF0b3IgY3JlYXRlSXRlcmF0b3IoQ29sbGVjdGlvbiBpZ25vcmVkKSB7Ci0JCXJldHVybiBuZXcgTGlicmFyeUl0ZXJhdG9yKGdldFJvb3RzKCksIHRydWUsIHR5cGUsIGZhbHNlKSB7Ci0JCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtNTY1MzEzNDk4OTIzNTY2Mzk3M0w7Ci0KLQkJCXB1YmxpYyBJdGVyYXRvciBnZXRDaGlsZHJlbihPYmplY3Qgb2JqKSB7Ci0JCQkJaWYgKG9iaiA9PSBnZXRSb290cygpKSB7Ci0JCQkJCXJldHVybiBuZXcgSXRlcmF0b3IoKSB7Ci0JCQkJCQlwcml2YXRlIGZpbmFsIEl0ZXJhdG9yIGRlbGVnYXRlID0KLQkJCQkJCQlnZXRSb290cygpLml0ZXJhdG9yKCk7Ci0JCQkJCQkKLQkJCQkJCXB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7Ci0JCQkJCQkJcmV0dXJuIGRlbGVnYXRlLmhhc05leHQoKTsKLQkJCQkJCX0KLQotCQkJCQkJcHVibGljIE9iamVjdCBuZXh0KCkgewotCQkJCQkJCS8vIGlmIEknbSBiZWluZyBhc2tlZCBmb3IgbXkgbmV4dCBlbGVtZW50LCB0aGVuCi0JCQkJCQkJLy8gICAgd2UgYXJlIHN0ZXBwaW5nIHRvIGFub3RoZXIgdHJhdmVyc2FsIHJvb3QKLQkJCQkJCQljb250ZXh0Q2hhbmdlZCA9IHRydWU7Ci0JCQkJCQkJCi0JCQkJCQkJcmV0dXJuIGRlbGVnYXRlLm5leHQoKTsKLQkJCQkJCX0KLQotCQkJCQkJcHVibGljIHZvaWQgcmVtb3ZlKCkgewotCQkJCQkJCWRlbGVnYXRlLnJlbW92ZSgpOwotCQkJCQkJfX07Ci0JCQkJfSBlbHNlIHsKLQkJCQkJcmV0dXJuIHN1cGVyLmdldENoaWxkcmVuKG9iaik7Ci0JCQkJfQotCQkJfQotCQkJCi0JCQlwdWJsaWMgT2JqZWN0IG5leHQoKSB7Ci0JCQkJLy8gdGhpcyB3aWxsIGJlIHNldCB0byB0cnVlIGFnYWluIHRoZSBuZXh0IHRpbWUgd2UgdGVzdCBoYXNOZXh0KCkgYXQKLQkJCQkvLyAgICB0aGUgdHJhdmVyc2FsIHJvb3QgbGV2ZWwKLQkJCQljb250ZXh0Q2hhbmdlZCA9IGZhbHNlOwotCQkJCQotCQkJCXJldHVybiBzdXBlci5uZXh0KCk7Ci0JCQl9fTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNDbGllbnRDb250ZXh0Q2hhbmdlZCgpIHsKLQkJcmV0dXJuIGNvbnRleHRDaGFuZ2VkOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFNldCBtYWtlVGFyZ2V0c0Rpc2pvaW50KENvbGxlY3Rpb24gb2JqZWN0cykgewotCQlTZXQgcmVzdWx0ID0gbmV3IGphdmEudXRpbC5IYXNoU2V0KCk7Ci0JCQotCQkvLyBlbnN1cmUgdGhhdCBhbnkgY29udGFpbmVkIChkZXNjZW5kZW50KSBlbGVtZW50cyBvZiBvdGhlciBlbGVtZW50cwotCQkvLyAgICB0aGF0IHdlIGluY2x1ZGUgYXJlIG5vdCBpbmNsdWRlZCwgYmVjYXVzZSB0aGV5IHdpbGwgYmUKLQkJLy8gICAgdHJhdmVyc2VkIGJ5IHJlY3Vyc2lvbiwgYW55d2F5Ci0JCQotCQlmb3IgKEl0ZXJhdG9yIG91dGVyID0gb2JqZWN0cy5pdGVyYXRvcigpOyBvdXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlFT2JqZWN0IG91dGVyTmV4dCA9IChFT2JqZWN0KW91dGVyLm5leHQoKTsKLQkJCQotCQkJZm9yIChJdGVyYXRvciBpbm5lciA9IHJlc3VsdC5pdGVyYXRvcigpOyBpbm5lci5oYXNOZXh0KCk7KSB7Ci0JCQkJRU9iamVjdCBpbm5lck5leHQgPSAoRU9iamVjdClpbm5lci5uZXh0KCk7Ci0JCQkJCi0JCQkJaWYgKEVjb3JlVXRpbC5pc0FuY2VzdG9yKGlubmVyTmV4dCwgb3V0ZXJOZXh0KSkgewotCQkJCQlvdXRlck5leHQgPSBudWxsOyAgLy8gZm9yZ2V0IHRoaXMgb25lCi0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJCQotCQkJaWYgKG91dGVyTmV4dCAhPSBudWxsKSB7Ci0JCQkJcmVzdWx0LmFkZChvdXRlck5leHQpOwotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gcmVzdWx0OwotCX0JCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudmFsaWRhdGlvbi9zcmMvb3JnL2VjbGlwc2UvZXBmL3ZhbGlkYXRpb24vY29uc3RyYWludHMvTmFtZUNvbnN0cmFpbnQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi52YWxpZGF0aW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvdmFsaWRhdGlvbi9jb25zdHJhaW50cy9OYW1lQ29uc3RyYWludC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYTJmNmMxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi52YWxpZGF0aW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvdmFsaWRhdGlvbi9jb25zdHJhaW50cy9OYW1lQ29uc3RyYWludC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi52YWxpZGF0aW9uLmNvbnN0cmFpbnRzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5NdWx0aVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnZhbGlkYXRpb24uQWJzdHJhY3RNb2RlbENvbnN0cmFpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnZhbGlkYXRpb24uRU1GRXZlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi52YWxpZGF0aW9uLklWYWxpZGF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLklWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLklWYWxpZGF0b3JGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbi5pbnRlcm5hbC5WYWxpZGF0b3JGYWN0b3J5LlR5cGVGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ3VzdG9tQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmliYWJsZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1pbGVzdG9uZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk5hbWVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkFzc29jaWF0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5VbWFVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi52YWxpZGF0aW9uLkFjdGl2YXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudmFsaWRhdGlvbi51dGlsLlZhbGlkYXRpb25TdGF0dXM7Ci0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjEKLSAqLwotcHVibGljIGNsYXNzIE5hbWVDb25zdHJhaW50IGV4dGVuZHMgQWJzdHJhY3RNb2RlbENvbnN0cmFpbnQgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUcgPSBBY3RpdmF0b3IuZ2V0RGVmYXVsdCgpLmlzRGVidWdnaW5nKCk7Ci0JCi0vLwlwcml2YXRlIHN0YXRpYyBmaW5hbCBFQ2xhc3NbXSBDT05URU5UX0VMRU1FTlRfVFlQRVMgPSBnZXRDb250ZW50RWxlbWVudFR5cGVzKCk7Ci0vLwotLy8JcHJpdmF0ZSBzdGF0aWMgRUNsYXNzW10gZ2V0Q29udGVudEVsZW1lbnRUeXBlcygpIHsKLS8vCQlBcnJheUxpc3QgdHlwZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0vLwkJZm9yIChJdGVyYXRvciBpdGVyID0gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RUNsYXNzaWZpZXJzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0vLwkJCU9iamVjdCB0eXBlID0gaXRlci5uZXh0KCk7Ci0vLwkJCWlmKHR5cGUgaW5zdGFuY2VvZiBFQ2xhc3MgJiYgVW1hUGFja2FnZS5MaXRlcmFscy5DT05URU5UX0VMRU1FTlQuaXNTdXBlclR5cGVPZigoRUNsYXNzKSB0eXBlKSkgewotLy8JCQkJdHlwZXMuYWRkKHR5cGUpOwotLy8JCQl9Ci0vLwkJfQotLy8JCUVDbGFzc1tdIGVDbGFzc2VzID0gbmV3IEVDbGFzc1t0eXBlcy5zaXplKCldOwotLy8JCXR5cGVzLnRvQXJyYXkoZUNsYXNzZXMpOwotLy8JCXJldHVybiBlQ2xhc3NlczsKLS8vCX0KLQkKLQlwcml2YXRlIGJvb2xlYW4gY2FuQ2hlY2soT2JqZWN0IGVPYmopIHsKLQkJcmV0dXJuIGVPYmogaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4KLQkJCQl8fCBlT2JqIGluc3RhbmNlb2YgTWV0aG9kQ29uZmlndXJhdGlvbgotCQkJCXx8IGVPYmogaW5zdGFuY2VvZiBDb250ZW50UGFja2FnZQotCQkJCXx8IGVPYmogaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50Ci0JCQkJfHwgKChlT2JqIGluc3RhbmNlb2YgUHJvY2Vzc1BhY2thZ2UgfHwgZU9iaiBpbnN0YW5jZW9mIENvbnRlbnRFbGVtZW50KSAmJiBVbWFVdGlsCi0JCQkJCQkuZ2V0UHJvY2Vzc0NvbXBvbmVudCgoTWV0aG9kRWxlbWVudCkgZU9iaikgPT0gbnVsbCk7Ci0JfQotCQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLnZhbGlkYXRpb24uQWJzdHJhY3RNb2RlbENvbnN0cmFpbnQjdmFsaWRhdGUob3JnLmVjbGlwc2UuZW1mLnZhbGlkYXRpb24uSVZhbGlkYXRpb25Db250ZXh0KQotCSAqLwotCXB1YmxpYyBJU3RhdHVzIHZhbGlkYXRlKElWYWxpZGF0aW9uQ29udGV4dCBjdHgpIHsKLQkJRU9iamVjdCBlT2JqID0gY3R4LmdldFRhcmdldCgpOwotCQlFTUZFdmVudFR5cGUgZVR5cGUgPSBjdHguZ2V0RXZlbnRUeXBlKCk7Ci0KLQkJaWYoREVCVUcpIHsKLQkJCWlmKGVPYmogaW5zdGFuY2VvZiBOYW1lZEVsZW1lbnQpIHsKLQkJCQlOYW1lZEVsZW1lbnQgZSA9IChOYW1lZEVsZW1lbnQpIGVPYmo7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJOYW1lQ29uc3RyYWludC52YWxpZGF0ZSgpOiAiICsgVG5nVXRpbC5nZXRUeXBlVGV4dChlKSArICI6ICciICsgZS5nZXROYW1lKCkgKyAiJyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJfQotCQkJaWYoZU9iaiBpbnN0YW5jZW9mIE1pbGVzdG9uZSkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigpOwotCQkJfQotCQl9Ci0JCU11bHRpU3RhdHVzIG11bHRpU3RhdHVzID0gbmV3IE11bHRpU3RhdHVzKEFjdGl2YXRvci5QTFVHSU5fSUQsIDAsICIiLCBudWxsKTsgLy8kTk9OLU5MUy0xJAotCi0JCS8vIEluIHRoZSBjYXNlIG9mIGJhdGNoIG1vZGUuCi0JCWlmIChlVHlwZSA9PSBFTUZFdmVudFR5cGUuTlVMTCkgewotCQkJaWYoKGVPYmogaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50ICYmIFRuZ1V0aWwuaXNQcmVkZWZpbmVkKChNZXRob2RFbGVtZW50KSBlT2JqKSkpCi0JCQl7Ci0JCQkJLy8gc2tpcCB2YWxpZGF0aW5nIHByZWRlZmluZWQgbWV0aG9kIGVsZW1lbnRzLCBDb250ZW50RGVzY3JpcHRpb24KLQkJCQkvLwotCQkJCXJldHVybiBjdHguY3JlYXRlU3VjY2Vzc1N0YXR1cygpOwotCQkJfQotCQkJCi0JCQkvLyB2YWxpZGF0ZSBvYmplY3QncyBuYW1lCi0JCQkvLwotCQkJaWYoZU9iaiBpbnN0YW5jZW9mIEN1c3RvbUNhdGVnb3J5KSB7Ci0JCQkJQ3VzdG9tQ2F0ZWdvcnkgY2MgPSAoQ3VzdG9tQ2F0ZWdvcnkpZU9iajsKLQkJCQlMaXN0IGxpc3QgPSBBc3NvY2lhdGlvbkhlbHBlci5nZXRDdXN0b21DYXRlZ29yaWVzKGNjKTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBsaXN0Lml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQlDdXN0b21DYXRlZ29yeSBwYXJlbnQgPSAoQ3VzdG9tQ2F0ZWdvcnkpIGl0ZXIubmV4dCgpOwotCQkJCQlJVmFsaWRhdG9yIHZhbGlkYXRvciA9IElWYWxpZGF0b3JGYWN0b3J5LklOU1RBTkNFLmNyZWF0ZU5hbWVWYWxpZGF0b3IocGFyZW50LCBjYyk7Ci0JCQkJCVN0cmluZyBtc2cgPSB2YWxpZGF0b3IuaXNWYWxpZChjYy5nZXROYW1lKCkpOwotCQkJCQlpZihtc2cgIT0gbnVsbCkgewotCQkJCQkJbXVsdGlTdGF0dXMuYWRkKG5ldyBWYWxpZGF0aW9uU3RhdHVzKElTdGF0dXMuRVJST1IsIDAsIG1zZywgY2MsIFVtYVBhY2thZ2UuTGl0ZXJhbHMuTkFNRURfRUxFTUVOVF9fTkFNRSkpOwotCQkJCQl9Ci0JCQkJCXZhbGlkYXRvciA9IElWYWxpZGF0b3JGYWN0b3J5LklOU1RBTkNFLmNyZWF0ZVByZXNlbnRhdGlvbk5hbWVWYWxpZGF0b3IocGFyZW50LCBjYyk7Ci0JCQkJCW1zZyA9IHZhbGlkYXRvci5pc1ZhbGlkKGNjLmdldFByZXNlbnRhdGlvbk5hbWUoKSk7Ci0JCQkJCWlmKG1zZyAhPSBudWxsKSB7Ci0JCQkJCQltdWx0aVN0YXR1cy5hZGQobmV3IFZhbGlkYXRpb25TdGF0dXMoSVN0YXR1cy5FUlJPUiwgMCwgbXNnLCBjYywgVW1hUGFja2FnZS5MaXRlcmFscy5NRVRIT0RfRUxFTUVOVF9fUFJFU0VOVEFUSU9OX05BTUUpKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWVsc2UgaWYoY2FuQ2hlY2soZU9iaikpIAotCQkJewotCQkJCU5hbWVkRWxlbWVudCBlID0gKE5hbWVkRWxlbWVudCllT2JqOwotCQkJCUlWYWxpZGF0b3IgdmFsaWRhdG9yID0gSVZhbGlkYXRvckZhY3RvcnkuSU5TVEFOQ0UuY3JlYXRlTmFtZVZhbGlkYXRvcihlT2JqLmVDb250YWluZXIoKSwgZSk7Ci0JCQkJU3RyaW5nIG1zZyA9IHZhbGlkYXRvci5pc1ZhbGlkKGUuZ2V0TmFtZSgpKTsKLQkJCQlpZihtc2cgIT0gbnVsbCkgewotCQkJCQltdWx0aVN0YXR1cy5hZGQobmV3IFZhbGlkYXRpb25TdGF0dXMoSVN0YXR1cy5FUlJPUiwgMCwgbXNnLCBlLCBVbWFQYWNrYWdlLkxpdGVyYWxzLk5BTUVEX0VMRU1FTlRfX05BTUUpKTsKLQkJCQl9Ci0vKgkJCQlpZihlT2JqIGluc3RhbmNlb2YgRGVzY3JpYmFibGVFbGVtZW50KSB7Ci0JCQkJCURlc2NyaWJhYmxlRWxlbWVudCBkZSA9IChEZXNjcmliYWJsZUVsZW1lbnQpIGVPYmo7Ci0JCQkJCXZhbGlkYXRvciA9IElWYWxpZGF0b3JGYWN0b3J5LklOU1RBTkNFLmNyZWF0ZVByZXNlbnRhdGlvbk5hbWVWYWxpZGF0b3IoZU9iai5lQ29udGFpbmVyKCksIGRlKTsKLQkJCQkJbXNnID0gdmFsaWRhdG9yLmlzVmFsaWQoZGUuZ2V0UHJlc2VudGF0aW9uTmFtZSgpKTsKLQkJCQkJaWYobXNnICE9IG51bGwpIHsKLQkJCQkJCW11bHRpU3RhdHVzLmFkZChuZXcgVmFsaWRhdGlvblN0YXR1cyhJU3RhdHVzLkVSUk9SLCAwLCBtc2csIGUsIFVtYVBhY2thZ2UuTGl0ZXJhbHMuTUVUSE9EX0VMRU1FTlRfX1BSRVNFTlRBVElPTl9OQU1FKSk7Ci0JCQkJCX0KLQkJCQl9Ki8KLQkJCX0KLQkJCQotLy8JCQkvLyB2YWxpZGF0ZSBuYW1lIG9mIHRoZSBjaGlsZHJlbgotLy8JCQkvLwotLy8JCQlpZihlT2JqIGluc3RhbmNlb2YgTWV0aG9kTGlicmFyeSkgewotLy8JCQkJSVN0YXR1cyBzdGF0dXMgPSBjaGVja0NoaWxkcmVuKGVPYmosIFVtYVBhY2thZ2UuTGl0ZXJhbHMuTUVUSE9EX0xJQlJBUllfX01FVEhPRF9QTFVHSU5TLCAKLS8vCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5NRVRIT0RfUExVR0lOKTsKLS8vCQkJCWlmKCFzdGF0dXMuaXNPSygpKSB7Ci0vLwkJCQkJbXVsdGlTdGF0dXMubWVyZ2Uoc3RhdHVzKTsKLS8vCQkJCX0KLS8vCQkJCXN0YXR1cyA9IGNoZWNrQ2hpbGRyZW4oZU9iaiwgVW1hUGFja2FnZS5MaXRlcmFscy5NRVRIT0RfTElCUkFSWV9fUFJFREVGSU5FRF9DT05GSUdVUkFUSU9OUywgCi0vLwkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuTUVUSE9EX0NPTkZJR1VSQVRJT04pOwotLy8JCQkJaWYoIXN0YXR1cy5pc09LKCkpIHsKLS8vCQkJCQltdWx0aVN0YXR1cy5tZXJnZShzdGF0dXMpOwotLy8JCQkJfQotLy8JCQl9Ci0vLwkJCWVsc2UgaWYoZU9iaiBpbnN0YW5jZW9mIENvbnRlbnRQYWNrYWdlKSB7Ci0vLwkJCQlDb250ZW50UGFja2FnZSBwa2cgPSAoQ29udGVudFBhY2thZ2UpIGVPYmo7Ci0vLwkJCQlib29sZWFuIGNoZWNrZWQgPSBmYWxzZTsKLS8vCQkJCWlmKFRuZ1V0aWwuaXNQcmVkZWZpbmVkKHBrZykpIHsKLS8vCQkJCQlTdHJpbmcgbmFtZSA9IHBrZy5nZXROYW1lKCk7Ci0vLwkJCQkJaWYoTW9kZWxTdHJ1Y3R1cmUuRElTQ0lQTElORV9QQUNLQUdFX05BTUUuZXF1YWxzKG5hbWUpKSB7Ci0vLwkJCQkJCUlTdGF0dXMgc3RhdHVzID0gY2hlY2tDaGlsZHJlbihlT2JqLCBVbWFQYWNrYWdlLkxpdGVyYWxzLkNPTlRFTlRfUEFDS0FHRV9fQ09OVEVOVF9FTEVNRU5UUywgCi0vLwkJCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5ESVNDSVBMSU5FKTsJCQkJCi0vLwkJCQkJCWlmKCFzdGF0dXMuaXNPSygpKSB7Ci0vLwkJCQkJCQltdWx0aVN0YXR1cy5tZXJnZShzdGF0dXMpOwotLy8JCQkJCQl9Ci0vLwkJCQkJCWNoZWNrZWQgPSB0cnVlOwotLy8JCQkJCX0KLS8vCQkJCQllbHNlIGlmIChNb2RlbFN0cnVjdHVyZS5ST0xFX1NFVF9QQUNLQUdFX05BTUUuZXF1YWxzKG5hbWUpKSB7Ci0vLwkJCQkJCUlTdGF0dXMgc3RhdHVzID0gY2hlY2tDaGlsZHJlbihlT2JqLCBVbWFQYWNrYWdlLkxpdGVyYWxzLkNPTlRFTlRfUEFDS0FHRV9fQ09OVEVOVF9FTEVNRU5UUywgCi0vLwkJCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5ST0xFX1NFVCk7CQkJCQotLy8JCQkJCQlpZighc3RhdHVzLmlzT0soKSkgewotLy8JCQkJCQkJbXVsdGlTdGF0dXMubWVyZ2Uoc3RhdHVzKTsKLS8vCQkJCQkJfQotLy8JCQkJCQljaGVja2VkID0gdHJ1ZTsKLS8vCQkJCQl9Ci0vLwkJCQkJZWxzZSBpZiAoIShNb2RlbFN0cnVjdHVyZS5DT1JFX0NPTlRFTlRfUEFDQUtHRV9OQU1FLmVxdWFscyhuYW1lKSkpIHsKLS8vCQkJCQkJY2hlY2tlZCA9IHRydWU7Ci0vLwkJCQkJfQotLy8JCQkJfQotLy8JCQkJaWYoIWNoZWNrZWQpIHsKLS8vCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IENPTlRFTlRfRUxFTUVOVF9UWVBFUy5sZW5ndGg7IGkrKykgewotLy8JCQkJCQlJU3RhdHVzIHN0YXR1cyA9IGNoZWNrQ2hpbGRyZW4oZU9iaiwgVW1hUGFja2FnZS5MaXRlcmFscy5DT05URU5UX1BBQ0tBR0VfX0NPTlRFTlRfRUxFTUVOVFMsIAotLy8JCQkJCQkJCUNPTlRFTlRfRUxFTUVOVF9UWVBFU1tpXSk7CQkJCQotLy8JCQkJCQlpZighc3RhdHVzLmlzT0soKSkgewotLy8JCQkJCQkJbXVsdGlTdGF0dXMubWVyZ2Uoc3RhdHVzKTsKLS8vCQkJCQkJfQotLy8JCQkJCX0KLS8vCQkJCX0KLS8vCQkJfQotLy8JCQllbHNlIGlmKGVPYmogaW5zdGFuY2VvZiBQcm9jZXNzUGFja2FnZSkgewotLy8JCQkJSVN0YXR1cyBzdGF0dXMgPSBjaGVja0NoaWxkcmVuKGVPYmosIFVtYVBhY2thZ2UuTGl0ZXJhbHMuTUVUSE9EX1BBQ0tBR0VfX0NISUxEX1BBQ0tBR0VTLCAKLS8vCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5QUk9DRVNTX1BBQ0tBR0UpOwotLy8JCQkJaWYoIXN0YXR1cy5pc09LKCkpIHsKLS8vCQkJCQltdWx0aVN0YXR1cy5tZXJnZShzdGF0dXMpOwotLy8JCQkJfQotLy8JCQl9Ci0JCQkKLQkJCWlmKG11bHRpU3RhdHVzLmlzT0soKSkgewotCQkJCXJldHVybiBjdHguY3JlYXRlU3VjY2Vzc1N0YXR1cygpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJcmV0dXJuIG11bHRpU3RhdHVzOwotCQkJfQotCQkJCi0JCS8vIEluIHRoZSBjYXNlIG9mIGxpdmUgbW9kZS4KLQkJfSBlbHNlIHsKLQkJCU9iamVjdCBuZXdWYWx1ZSA9IGN0eC5nZXRGZWF0dXJlTmV3VmFsdWUoKTsKLQkJCQotCQkJaWYgKG5ld1ZhbHVlID09IG51bGwgfHwgKChTdHJpbmcpbmV3VmFsdWUpLmxlbmd0aCgpID09IDApIHsKLQkJCQlyZXR1cm4gY3R4LmNyZWF0ZUZhaWx1cmVTdGF0dXMobmV3IE9iamVjdFtdIHtlT2JqLmVDbGFzcygpLmdldE5hbWUoKX0pOwotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gY3R4LmNyZWF0ZVN1Y2Nlc3NTdGF0dXMoKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBDaGlsZEZpbHRlciBleHRlbmRzIFR5cGVGaWx0ZXIgewotCi0JCXByaXZhdGUgU2V0IGNoZWNrZWRDaGlsZHJlbjsKLQotCQlwdWJsaWMgQ2hpbGRGaWx0ZXIoRUNsYXNzIGVDbGFzcywgU2V0IGNoZWNrZWRDaGlsZHJlbikgewotCQkJc3VwZXIoZUNsYXNzKTsKLQkJCXRoaXMuY2hlY2tlZENoaWxkcmVuID0gY2hlY2tlZENoaWxkcmVuOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gYWNjZXB0KE9iamVjdCBvYmopIHsKLQkJCWlmIChjaGVja2VkQ2hpbGRyZW4uY29udGFpbnMob2JqKSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCXJldHVybiBzdXBlci5hY2NlcHQob2JqKTsKLQkJfQotCX0KLQotCXByaXZhdGUgSVN0YXR1cyBjaGVja0NoaWxkcmVuKEVPYmplY3Qgb2JqZWN0LCBFUmVmZXJlbmNlIGNoaWxkRmVhdHVyZSwKLQkJCUVDbGFzcyBlQ2xhc3MpIHsKLQkJTGlzdCBzdGF0dXNMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlMaXN0IGNoaWxkcmVuID0gKExpc3QpIG9iamVjdC5lR2V0KGNoaWxkRmVhdHVyZSk7Ci0JCVNldCBjaGVja2VkQ2hpbGRyZW4gPSBuZXcgSGFzaFNldCgpOwotCQlJRmlsdGVyIGNoaWxkRmlsdGVyID0gbmV3IENoaWxkRmlsdGVyKGVDbGFzcywgY2hlY2tlZENoaWxkcmVuKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gY2hpbGRyZW4uaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlFT2JqZWN0IGNoaWxkID0gKEVPYmplY3QpIGl0ZXIubmV4dCgpOwotCQkJaWYgKGNoaWxkIGluc3RhbmNlb2YgTmFtZWRFbGVtZW50KSB7Ci0JCQkJSVZhbGlkYXRvciB2YWxpZGF0b3IgPSBJVmFsaWRhdG9yRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkJLmNyZWF0ZVZhbGlkYXRvcihvYmplY3QsIGNoaWxkRmVhdHVyZSwgY2hpbGRGaWx0ZXIsCi0JCQkJCQkJCWNoaWxkLCBVbWFQYWNrYWdlLkxpdGVyYWxzLk5BTUVEX0VMRU1FTlRfX05BTUUpOwotCQkJCU5hbWVkRWxlbWVudCBlID0gKE5hbWVkRWxlbWVudCkgY2hpbGQ7Ci0JCQkJU3RyaW5nIG1zZyA9IHZhbGlkYXRvci5pc1ZhbGlkKGUuZ2V0TmFtZSgpKTsKLQkJCQlpZiAobXNnICE9IG51bGwpIHsKLQkJCQkJc3RhdHVzTGlzdC5hZGQobmV3IFZhbGlkYXRpb25TdGF0dXMoSVN0YXR1cy5FUlJPUiwgMCwgbXNnLAotCQkJCQkJCWUsIFVtYVBhY2thZ2UuTGl0ZXJhbHMuTkFNRURfRUxFTUVOVF9fTkFNRSkpOwotCQkJCX0KLQkJCX0KLQkJCWlmIChjaGlsZCBpbnN0YW5jZW9mIERlc2NyaWJhYmxlRWxlbWVudCkgewotCQkJCUlWYWxpZGF0b3IgdmFsaWRhdG9yID0gSVZhbGlkYXRvckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJCS5jcmVhdGVWYWxpZGF0b3IoCi0JCQkJCQkJCW9iamVjdCwKLQkJCQkJCQkJY2hpbGRGZWF0dXJlLAotCQkJCQkJCQljaGlsZEZpbHRlciwKLQkJCQkJCQkJY2hpbGQsCi0JCQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuTUVUSE9EX0VMRU1FTlRfX1BSRVNFTlRBVElPTl9OQU1FKTsKLQkJCQlEZXNjcmliYWJsZUVsZW1lbnQgZSA9IChEZXNjcmliYWJsZUVsZW1lbnQpIGNoaWxkOwotCQkJCVN0cmluZyBtc2cgPSB2YWxpZGF0b3IuaXNWYWxpZChlLmdldFByZXNlbnRhdGlvbk5hbWUoKSk7Ci0JCQkJaWYgKG1zZyAhPSBudWxsKSB7Ci0JCQkJCXN0YXR1c0xpc3QKLQkJCQkJCQkuYWRkKG5ldyBWYWxpZGF0aW9uU3RhdHVzKAotCQkJCQkJCQkJSVN0YXR1cy5FUlJPUiwKLQkJCQkJCQkJCTAsCi0JCQkJCQkJCQltc2csCi0JCQkJCQkJCQllLAotCQkJCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5NRVRIT0RfRUxFTUVOVF9fUFJFU0VOVEFUSU9OX05BTUUpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKCFzdGF0dXNMaXN0LmlzRW1wdHkoKSkgewotCQkJaWYgKHN0YXR1c0xpc3Quc2l6ZSgpID09IDEpIHsKLQkJCQlyZXR1cm4gKElTdGF0dXMpIHN0YXR1c0xpc3QuZ2V0KDApOwotCQkJfSBlbHNlIHsKLQkJCQlJU3RhdHVzW10gbmV3Q2hpbGRyZW4gPSBuZXcgSVN0YXR1c1tzdGF0dXNMaXN0LnNpemUoKV07Ci0JCQkJc3RhdHVzTGlzdC50b0FycmF5KG5ld0NoaWxkcmVuKTsKLQkJCQlyZXR1cm4gbmV3IE11bHRpU3RhdHVzKEFjdGl2YXRvci5QTFVHSU5fSUQsIDAsIG5ld0NoaWxkcmVuLAotCQkJCQkJIiIsIG51bGwpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnZhbGlkYXRpb24vc3JjL29yZy9lY2xpcHNlL2VwZi92YWxpZGF0aW9uL2NvbnN0cmFpbnRzL1JlbGF0aW9uc2hpcENvbnN0cmFpbnQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi52YWxpZGF0aW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvdmFsaWRhdGlvbi9jb25zdHJhaW50cy9SZWxhdGlvbnNoaXBDb25zdHJhaW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhNWVjYTIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnZhbGlkYXRpb24vc3JjL29yZy9lY2xpcHNlL2VwZi92YWxpZGF0aW9uL2NvbnN0cmFpbnRzL1JlbGF0aW9uc2hpcENvbnN0cmFpbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudmFsaWRhdGlvbi5jb25zdHJhaW50czsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTXVsdGlTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudmFsaWRhdGlvbi5BYnN0cmFjdE1vZGVsQ29uc3RyYWludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudmFsaWRhdGlvbi5FTUZFdmVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnZhbGlkYXRpb24uSVZhbGlkYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuU3RyVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb24uRGVwZW5kZW5jeUNoZWNrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5OYW1lZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi52YWxpZGF0aW9uLkFjdGl2YXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudmFsaWRhdGlvbi5WYWxpZGF0aW9uUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi52YWxpZGF0aW9uLnV0aWwuVmFsaWRhdGlvblN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUmVsYXRpb25zaGlwQ29uc3RyYWludCBleHRlbmRzIEFic3RyYWN0TW9kZWxDb25zdHJhaW50IHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHID0gQWN0aXZhdG9yLmdldERlZmF1bHQoKS5pc0RlYnVnZ2luZygpOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ29sbGVjdGlvbiByZWZlcmVuY2VzVG9DaGVja0ZvckNpcmN1bGFyRGVwZW5kZW5jeSA9IEFycmF5cy5hc0xpc3QobmV3IE9iamVjdFtdIHsKLQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuTUVUSE9EX1BMVUdJTl9fQkFTRVMKLQkJCSwgVW1hUGFja2FnZS5MaXRlcmFscy5WQVJJQUJJTElUWV9FTEVNRU5UX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UCi0JCQksIFVtYVBhY2thZ2UuTGl0ZXJhbHMuQUNUSVZJVFlfX0JSRUFLRE9XTl9FTEVNRU5UUwotCQkJLCBVbWFQYWNrYWdlLkxpdGVyYWxzLkRFTElWRVJBQkxFX19ERUxJVkVSRURfV09SS19QUk9EVUNUUwotCQkJLCBVbWFQYWNrYWdlLkxpdGVyYWxzLkNVU1RPTV9DQVRFR09SWV9fQ0FURUdPUklaRURfRUxFTUVOVFMKLQl9KTsKLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi52YWxpZGF0aW9uLkFic3RyYWN0TW9kZWxDb25zdHJhaW50I3ZhbGlkYXRlKG9yZy5lY2xpcHNlLmVtZi52YWxpZGF0aW9uLklWYWxpZGF0aW9uQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgSVN0YXR1cyB2YWxpZGF0ZShJVmFsaWRhdGlvbkNvbnRleHQgY3R4KSB7Ci0JCWlmIChEZXBlbmRlbmN5Q2hlY2tlci5uZXdDaGVjaykgewotCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCX0KLQkJRU9iamVjdCBlT2JqID0gY3R4LmdldFRhcmdldCgpOwotCQlFTUZFdmVudFR5cGUgZVR5cGUgPSBjdHguZ2V0RXZlbnRUeXBlKCk7Ci0JCQotCQlpZihERUJVRykgewotCQkJaWYoZU9iaiBpbnN0YW5jZW9mIE5hbWVkRWxlbWVudCkgewotCQkJCU5hbWVkRWxlbWVudCBlID0gKE5hbWVkRWxlbWVudCkgZU9iajsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlJlbGF0aW9uc2hpcENvbnN0cmFpbnQudmFsaWRhdGUoKTogIiArIFRuZ1V0aWwuZ2V0VHlwZVRleHQoZSkgKyAiOiAnIiArIGUuZ2V0TmFtZSgpICsgIiciKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCX0KLQkJfQotCi0JCU11bHRpU3RhdHVzIG11bHRpU3RhdHVzID0gbmV3IE11bHRpU3RhdHVzKEFjdGl2YXRvci5QTFVHSU5fSUQsIDAsICIiLCBudWxsKTsgLy8kTk9OLU5MUy0xJAotCi0JCS8vIEluIHRoZSBjYXNlIG9mIGJhdGNoIG1vZGUuCi0JCWlmIChlVHlwZSA9PSBFTUZFdmVudFR5cGUuTlVMTCkgewotCQkJQ29sbGVjdGlvbiBmZWF0dXJlcyA9IG5ldyBBcnJheUxpc3QocmVmZXJlbmNlc1RvQ2hlY2tGb3JDaXJjdWxhckRlcGVuZGVuY3kpOwotCQkJZmVhdHVyZXMucmV0YWluQWxsKGVPYmouZUNsYXNzKCkuZ2V0RUFsbFJlZmVyZW5jZXMoKSk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBmZWF0dXJlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlFUmVmZXJlbmNlIHJlZiA9IChFUmVmZXJlbmNlKSBpdGVyLm5leHQoKTsKLQkJCQlpZihyZWYuaXNNYW55KCkpIHsKLQkJCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9ICgoTGlzdCllT2JqLmVHZXQocmVmKSkuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJCQkJT2JqZWN0IG8gPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCQlJU3RhdHVzIHN0YXR1cyA9IERlcGVuZGVuY3lDaGVja2VyLmNoZWNrQ2lyY3VsYXJEZXBlbmRlbmN5KGVPYmosIHJlZiwgbyk7Ci0JCQkJCQlpZighc3RhdHVzLmlzT0soKSkgewotCQkJCQkJCVN0cmluZyBtc2cgPSBzdGF0dXMuZ2V0TWVzc2FnZSgpOwotCQkJCQkJCWlmKFN0clV0aWwuaXNCbGFuayhtc2cpKSB7Ci0JCQkJCQkJCW1zZyA9IE5MUy5iaW5kKFZhbGlkYXRpb25SZXNvdXJjZXMuY2lyY3VsYXJEZXBlbmRlbmN5X2Vycm9yLCByZWYuZ2V0RUNvbnRhaW5pbmdDbGFzcygpLmdldE5hbWUoKSwgcmVmLmdldE5hbWUoKSk7Ci0JCQkJCQkJfQotCQkJCQkJCW11bHRpU3RhdHVzLmFkZChuZXcgVmFsaWRhdGlvblN0YXR1cyhJU3RhdHVzLkVSUk9SLCAwLCBtc2csIGVPYmosIHJlZikpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlPYmplY3QgbyA9IGVPYmouZUdldChyZWYpOwotCQkJCQlpZihvICE9IG51bGwpIHsKLQkJCQkJCUlTdGF0dXMgc3RhdHVzID0gRGVwZW5kZW5jeUNoZWNrZXIuY2hlY2tDaXJjdWxhckRlcGVuZGVuY3koZU9iaiwgcmVmLCBvKTsKLQkJCQkJCWlmKCFzdGF0dXMuaXNPSygpKSB7Ci0JCQkJCQkJU3RyaW5nIG1zZyA9IHN0YXR1cy5nZXRNZXNzYWdlKCk7Ci0JCQkJCQkJaWYoU3RyVXRpbC5pc0JsYW5rKG1zZykpIHsKLQkJCQkJCQkJbXNnID0gTkxTLmJpbmQoVmFsaWRhdGlvblJlc291cmNlcy5jaXJjdWxhckRlcGVuZGVuY3lfZXJyb3IsIHJlZi5nZXRFQ29udGFpbmluZ0NsYXNzKCkuZ2V0TmFtZSgpLCByZWYuZ2V0TmFtZSgpKTsKLQkJCQkJCQl9Ci0JCQkJCQkJbXVsdGlTdGF0dXMuYWRkKG5ldyBWYWxpZGF0aW9uU3RhdHVzKElTdGF0dXMuRVJST1IsIDAsIG1zZywgZU9iaiwgcmVmKSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmKG11bHRpU3RhdHVzLmlzT0soKSkgewotCQkJCXJldHVybiBjdHguY3JlYXRlU3VjY2Vzc1N0YXR1cygpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJcmV0dXJuIG11bHRpU3RhdHVzOwotCQkJfQkJCQotCQl9IAotCQkKLQkJcmV0dXJuIGN0eC5jcmVhdGVTdWNjZXNzU3RhdHVzKCk7Ci0JCQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnZhbGlkYXRpb24vc3JjL29yZy9lY2xpcHNlL2VwZi92YWxpZGF0aW9uL3V0aWwvU3RhcnR1cC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnZhbGlkYXRpb24vc3JjL29yZy9lY2xpcHNlL2VwZi92YWxpZGF0aW9uL3V0aWwvU3RhcnR1cC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZmMzMTc5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi52YWxpZGF0aW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvdmFsaWRhdGlvbi91dGlsL1N0YXJ0dXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi52YWxpZGF0aW9uLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnZhbGlkYXRpb24uTGlicmFyeUVWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVN0YXJ0dXA7Ci0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBTdGFydHVwIGltcGxlbWVudHMgSVN0YXJ0dXAgewotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVN0YXJ0dXAjZWFybHlTdGFydHVwKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBlYXJseVN0YXJ0dXAoKSB7Ci0JCUVWYWxpZGF0b3IuUmVnaXN0cnkuSU5TVEFOQ0UucHV0KAotCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLAotCQkJCW5ldyBMaWJyYXJ5RVZhbGlkYXRvcigpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi52YWxpZGF0aW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvdmFsaWRhdGlvbi91dGlsL1ZhbGlkYXRpb25TdGF0dXMuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi52YWxpZGF0aW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvdmFsaWRhdGlvbi91dGlsL1ZhbGlkYXRpb25TdGF0dXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGZkNDdjMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudmFsaWRhdGlvbi9zcmMvb3JnL2VjbGlwc2UvZXBmL3ZhbGlkYXRpb24vdXRpbC9WYWxpZGF0aW9uU3RhdHVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudmFsaWRhdGlvbi51dGlsOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnZhbGlkYXRpb24uQWN0aXZhdG9yOwotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgIDEuMAotICovCi1wdWJsaWMgY2xhc3MgVmFsaWRhdGlvblN0YXR1cyBleHRlbmRzIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbi5WYWxpZGF0aW9uU3RhdHVzIHsKLQotCXB1YmxpYyBWYWxpZGF0aW9uU3RhdHVzKGludCBzZXZlcml0eSwgaW50IGNvZGUsIFN0cmluZyBtZXNzYWdlLCBPYmplY3QgY2hlY2tlZE9iamVjdCwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUpIHsKLQkJc3VwZXIoQWN0aXZhdG9yLlBMVUdJTl9JRCwgc2V2ZXJpdHksIGNvZGUsIG1lc3NhZ2UsIGNoZWNrZWRPYmplY3QsIGZlYXR1cmUpOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hLy5jbGFzc3BhdGggYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYjE2NGI5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9InJ1bnRpbWUiLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvLmN2c2lnbm9yZSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjNzZhN2QuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotcnVudGltZQotYmluCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS8ucHJvamVjdCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYzMyYTlhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuZXBmLnhtbC51bWE8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZjAwMWM3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotI1RodSBNYXkgMDMgMTY6NTY6NTcgUERUIDIwMDcKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1lbmNvZGluZy8vc3JjL21vZGVsL0VQRl9TY2hlbWFfMjAwNjA5MDcxMzM0LnhzZD1VVEY4Ci1lbmNvZGluZy8vc3JjL21vZGVsL0VQRl9TY2hlbWFfMjAwNzA0MDMxNDI1LnhzZD1VVEY4Ci1lbmNvZGluZy8vc3JjL21vZGVsL1VNQS54c2Q9VVRGOApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDRiNDFjMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYTsgc2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS4yLjAucXVhbGlmaWVyCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYSwKLSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLAotIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLnV0aWwKLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUsCi0gb3JnLmVjbGlwc2UuZW1mLmVjb3JlO3Zpc2liaWxpdHk6PXJlZXhwb3J0LAotIG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWk7dmlzaWJpbGl0eTo9cmVleHBvcnQsCi0gb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnNkbwotRWNsaXBzZS1MYXp5U3RhcnQ6IHRydWUKLUltcG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnNlcnZpY2VhYmlsaXR5Ci1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL2J1aWxkLnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYmZiMTZjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0jIDxjb3B5cmlnaHQ+Ci0jIDwvY29weXJpZ2h0PgotIwotIyAkSWQ6IGJ1aWxkLnByb3BlcnRpZXMsdiAxLjEgMjAwOC8wMS8xNSAwODo1MzowNCBqdGhhbSBFeHAgJAotCi1zb3VyY2UuLiA9IHNyYy8KLW91dHB1dC4uID0gYmluLwotYmluLmluY2x1ZGVzID0gLixcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbAotCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9wbHVnaW4ucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOTgxNGYyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotIyA8Y29weXJpZ2h0PgotIyA8L2NvcHlyaWdodD4KLSMKLSMgJElkOiBwbHVnaW4ucHJvcGVydGllcyx2IDEuMSAyMDA4LzAxLzE1IDA4OjUzOjA0IGp0aGFtIEV4cCAkCi0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgVG8gY29kZSBkZXZlbG9wZXI6Ci0jICAgRG8gTk9UIGNoYW5nZSB0aGUgcHJvcGVydGllcyBiZXR3ZWVuIHRoaXMgbGluZSBhbmQgdGhlCi0jICAgIiUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJSIgbGluZS4KLSMgICBNYWtlIGEgbmV3IHByb3BlcnR5IG5hbWUsIGFwcGVuZCB0byB0aGUgZW5kIG9mIHRoZSBmaWxlIGFuZCBjaGFuZ2UKLSMgICB0aGUgY29kZSB0byB1c2UgdGhlIG5ldyBwcm9wZXJ0eS4KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyAlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUKLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSCi0KLXBsdWdpbk5hbWUgPSBFUEYgWE1MIFVNQSBNb2RlbAotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCi0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3BsdWdpbi54bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZTM1YjFkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotCi08IS0tCi0gPGNvcHlyaWdodD4KLSA8L2NvcHlyaWdodD4KLQotICRJZDogcGx1Z2luLnhtbCx2IDEuMSAyMDA4LzAxLzE1IDA4OjUzOjA0IGp0aGFtIEV4cCAkCi0tLT4KLQotPHBsdWdpbj4KLQotICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuZ2VuZXJhdGVkX3BhY2thZ2UiPgotICAgIDxwYWNrYWdlIAotICAgICAgIHVyaSA9ICJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjMiIAotICAgICAgIGNsYXNzID0gIm9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UiIC8+Ci0gIDwvZXh0ZW5zaW9uPgotCi0gIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5leHRlbnNpb25fcGFyc2VyIj4KLSAgICA8cGFyc2VyIAotICAgICAgIHR5cGU9InVtYSIgCi0gICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi54bWwudW1hLnV0aWwuVW1hUmVzb3VyY2VGYWN0b3J5SW1wbCIgLz4KLSAgPC9leHRlbnNpb24+Ci0KLTwvcGx1Z2luPgotCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvbW9kZWwvRVBGX1NjaGVtYV8yMDA2MDgzMDA3MzYueHNkIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL21vZGVsL0VQRl9TY2hlbWFfMjAwNjA4MzAwNzM2LnhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTdiYzQ1MS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvbW9kZWwvRVBGX1NjaGVtYV8yMDA2MDgzMDA3MzYueHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTM5OCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSBFUEYgVU1BIFhNTCBEYXRhIEludGVyY2hhbmdlIFNjaGVtYSAtLT4KLTx4c2Q6c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC4zIiB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiB4bWxuczp1bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuMyI+Ci0JPHhzZDpzaW1wbGVUeXBlIG5hbWU9IldvcmtPcmRlclR5cGUiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+UmVwcmVzZW50cyBhIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHR3byBCcmVha2Rvd24gRWxlbWVudCBpbiB3aGljaCBvbmUgQnJlYWtkb3duIEVsZW1lbnQgZGVwZW5kcyBvbiB0aGUgc3RhcnQgb3IgZmluaXNoIG9mIGFub3RoZXIgQnJlYWtkb3duIEVsZW1lbnQgaW4gb3JkZXIgdG8gYmVnaW4gb3IgZW5kLiBUaGlzIGVudW1lcmF0aW9uIGRlZmluZXMgdGhlIGRpZmZlcmVudCB0eXBlcyBvZiBXb3JrIE9yZGVyIHJlbGF0aW9uc2hpcHMgYXZhaWxhYmxlIGluIFVNQSBhbmQgaXMgdXNlZCB0byBwcm92aWRlIHZhbHVlcyBmb3IgV29yayBPcmRlcidzIGxpbmtUeXBlIGF0dHJpYnV0ZS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpOQ05hbWUiPgotCQkJPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iZmluaXNoVG9TdGFydCIvPgotCQkJPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iZmluaXNoVG9GaW5pc2giLz4KLQkJCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InN0YXJ0VG9TdGFydCIvPgotCQkJPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ic3RhcnRUb0ZpbmlzaCIvPgotCQk8L3hzZDpyZXN0cmljdGlvbj4KLQk8L3hzZDpzaW1wbGVUeXBlPgotCTx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJWYXJpYWJpbGl0eVR5cGUiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QW4gRW51bWVyYXRpb24gdXNlZCBmb3IgdmFsdWVzIGZvciBpbnN0YW5jZXMgb2YgVmFyaWFiaWxpdHkgRWxlbWVudCdzIGF0dHJpYnV0ZSB2YXJpYWJpbGl0eVR5cGUuICBJdCBkZWZpbmVzIHRoZSBuYXR1cmUgb2YgaG93IGEgVmFyaWFiaWxpdHkgRWxlbWVudCBleHRlbmRzIGFub3RoZXIgVmFyaWFiaWxpdHkgRWxlbWVudC4gU2VlIGVudW1lcmF0aW9uIGxpdGVyYWxzIGZvciBkZWZpbml0aW9ucyBmb3IgZWFjaCB0eXBlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOk5DTmFtZSI+Ci0JCQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJuYSIvPgotCQkJPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iY29udHJpYnV0ZXMiLz4KLQkJCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImV4dGVuZHMiLz4KLQkJCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InJlcGxhY2VzIi8+Ci0JCQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJsb2NhbENvbnRyaWJ1dGlvbiIvPgotCQkJPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ibG9jYWxSZXBsYWNlbWVudCIvPgotCQk8L3hzZDpyZXN0cmljdGlvbj4KLQk8L3hzZDpzaW1wbGVUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iRWxlbWVudCI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIFVNTCAyLjAgbWV0YS1jbGFzcyBFbGVtZW50LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJOYW1lZEVsZW1lbnQiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBVTUwgMi4wIG1ldGEtY2xhc3MgTmFtZWQgRWxlbWVudC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkVsZW1lbnQiPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJQYWNrYWdlYWJsZUVsZW1lbnQiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBVTUwgMi4wIG1ldGEtY2xhc3MgUGFja2FnYWJsZSBFbGVtZW50LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6TmFtZWRFbGVtZW50Ii8+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iTWV0aG9kRWxlbWVudCI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgcm9vdCBnZW5lcmFsaXphdGlvbiBmb3IgYWxsIFVNQSBNZXRob2QgRWxlbWVudHMuICBEZWZpbmVzIGEgY29tbW9uIHNldCBvZiBhdHRyaWJ1dGVzIGluaGVyaXRlZCBieSBhbGwgVU1BIE1ldGhvZCBFbGVtZW50cy4gIE1ldGhvZCBFbGVtZW50IGl0c2VsZiBpcyBkZXJpdmVkIGZyb20gUGFja2FnZWFibGUgRWxlbWVudCBmcm9tIHRoZSBVTUwgMi4wIEluZnJhc3RydWN0dXJlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6UGFja2FnZWFibGVFbGVtZW50Ij4KLQkJCQk8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Ik93bmVkUnVsZSIgdHlwZT0idW1hOkNvbnN0cmFpbnQiPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIHRoZSBwYWNrYWdpbmcgcnVsZXMgZm9yIHRoaXMgTWV0aG9kIEVsZW1lbnQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJPC94c2Q6Y2hvaWNlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkV2ZXJ5IGluc3RhbmNlIG9mIE1ldGhvZCBFbGVtZW50IGhhcyBhIGdsb2JhbCB1bmlxdWUgaWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0iYnJpZWZEZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5FdmVyeSBpbnN0YW5jZSBvZiBNZXRob2QgRWxlbWVudCBzaGFsbCBiZSBicmllZmx5IGRlc2NyaWJlZCB3aXRoIG9uZSBvciB0d28gc2VudGVuY2VzIHN1bW1hcml6aW5nIHRoZSBlbGVtZW50LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9InN1cHByZXNzZWQiIHR5cGU9InhzZDpib29sZWFuIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPklmIGEgVmFyaWFiaWxpdHkgRWxlbWVudCBpcyBkZXJpdmVkIGZyb20gYW5vdGhlciBWYXJpYWJpbGl0eSBFbGVtZW50IHVzaW5nIHRoZSAiZXh0ZW5kcyIgVmFyaWFiaWxpdHkgU3BlY2lhbGl6YXRpb24sIHRoZW4gdGhpcyBhdHRyaWJ1dGUgY2FuIGJlIHVzZWQgdG8gc3VwcHJlc3MgaW5oZXJpdGVkIE1ldGhvZCBFbGVtZW50cyB0aGF0IHdlcmUgcGFydCBvZiB0aGUgYmFzZWQtb24gVmFyaWFiaWxpdHkgRWxlbWVudCwgd2hpY2ggY2FuIGJlIGFueSB0eXBlIG9mIE1ldGhvZCBFbGVtZW50LiAgSW4gb3RoZXIgd29yZHMsIGlmIHRoaXMgYXR0cmlidXRlIGlzIHNldCB0byB0cnVlIG9uIGEgTWV0aG9kIEVsZW1lbnQgdGhhdCBoYXMgdGhlIHNhbWUgbmFtZSB0aGFuIGFuIGluaGVyaXRlZCBtZXRob2QgZWxlbWVudCB0aGVuIGl0IHdpbGwgbm90IGJlIHJlZ2FyZGVkIGFzIGluaGVyaXRlZCBhdCBhbGwuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0ib3JkZXJpbmdHdWlkZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5Vc2VkIGZvciBDQVNFIHRvb2wgcmVhbGl6YXRpb25zIG9mIHRoaXMgbW9kZWwgdG8gY29udGFpbiBpbmZvcm1hdGlvbiBhYm91dCBsYXlvdXQgYW5kIG9yZGVyaW5nIG9mIHRoZSBtZXRob2QgZWxlbWVudCBhbmQgaXRzIHBhcnRzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkNvbnN0cmFpbnQiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBnZW5lcmFsaXplZCBNZXRob2QgRWxlbWVudCB0aGF0IHJlcHJlc2VudHMgYSBjb25kaXRpb24gb3IgcmVzdHJpY3Rpb24gZXhwcmVzc2VkIGluIG5hdHVyYWwgbGFuZ3VhZ2UgdGV4dCBvciBpbiBhIG1hY2hpbmUgcmVhZGFibGUgbGFuZ3VhZ2UgZm9yIHRoZSBwdXJwb3NlIG9mIGRlY2xhcmluZyBzb21lIG9mIHRoZSBzZW1hbnRpY3Mgb2YgYSBNZXRob2QgRWxlbWVudC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOk1ldGhvZEVsZW1lbnQiPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9Im1haW5EZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5TdG9yZXMgdGhlIG1haW4gZGVmaW5pdGlvbiBvZiB0aGUgY29uc3RyYWludC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJTZWN0aW9uIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lhbCBNZXRob2QgRWxlbWVudCB0aGF0IHJlcHJlc2VudHMgc3RydWN0dXJhbCBzdWJzZWN0aW9ucyBvZiBhIENvbnRlbnQgRGVzY3JpcHRpb24ncyBzZWN0aW9uRGVzY3JpcHRpb24gYXR0cmlidXRlLiAgSXQgaXMgdXNlZCBmb3IgZWl0aGVyIGxhcmdlIHNjYWxlIGRvY3VtZW50YXRpb24gb2YgQ29udGVudCBFbGVtZW50cyBvcmdhbml6ZWQgaW50byBzZWN0aW9ucyBhcyB3ZWxsIGFzIHRvIGZsZXhpYmx5IGFkZCBuZXcgU2VjdGlvbnMgdG8gQ29udGVudCBFbGVtZW50cyB1c2luZyBjb250cmlidXRpb24gdmFyaWFiaWxpdHkgYWRkZWQgdG8gdGhlIFNlY3Rpb24gY29uY2VwdCBmb3IgTWV0aG9kIFBsdWctaW5zLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6TWV0aG9kRWxlbWVudCI+Ci0JCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlN1YlNlY3Rpb24iIHR5cGU9InVtYTpTZWN0aW9uIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlByZWRlY2Vzc29yIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkRlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGlzIGF0dHJpYnV0ZXMgc3RvcmUgdGhlIGRlc2NyaXB0aW9uIHRleHQgZm9yIGEgQ29udGVudCBEZXNjcmlwdGlvbidzIFNlY3Rpb24uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0ic2VjdGlvbk5hbWUiIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+RXZlcnkgU2VjdGlvbiBoYXMgYSBuYW1lIHVzZWQgZm9yIGV4dGVybmFsIHByZXNlbnRhdGlvbiBvZiB0aGUgc2VjdGlvbiwgZS5nLiB3aGVuIHB1Ymxpc2hlZCBvciB3aGVuIHNlY3Rpb24gaGVhZGluZyBhcmUgbGlzdGVkIGluIGEgdGFibGUgb2YgY29udGVudHMuICBUaGlzIGF0dHJpYnV0ZSBpcyBzaW1pbGFyIHRvIFByZXNlbnRhdGlvbiBOYW1lIGZvciBDb250ZW50IEVsZW1lbnRzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9InByZWRlY2Vzc29yIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0idmFyaWFiaWxpdHlUeXBlIiB0eXBlPSJ1bWE6VmFyaWFiaWxpdHlUeXBlIi8+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0idmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ik1ldGhvZFVuaXQiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWFsIE1ldGhvZCBFbGVtZW50IHRoYXQgc2hhbGwgYmUgbWFpbnRhaW5lZCBpbiBhIE1ldGhvZCBMaWJyYXJ5IGFzIGEgc2VwYXJhdGUgdW5pdCBvZiBjb250cm9sLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6TWV0aG9kRWxlbWVudCI+Ci0JCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkNvcHlyaWdodCIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0iYXV0aG9ycyIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5FdmVyeSBNZXRob2QgVW5pdCBpcyBiZWluZyBjcmVhdGVkIGFuZCBvd25lZCBieSBhbiBhdXRob3Igb3IgYXV0aG9yaW5nIHRlYW0uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2hhbmdlRGF0ZSIgdHlwZT0ieHNkOmRhdGVUaW1lIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBkYXRlIHRoZSBsYXN0IGNoYW5nZSB0aGF0IHJlc3VsdGVkIGludG8gdGhpcyB2ZXJzaW9uIGhhcyBiZWVuIG1hZGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2hhbmdlRGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+VGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBsYXN0IGNoYW5nZSB0aGF0IHJlc3VsdGVkIGludG8gdGhpcyB2ZXJzaW9uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9InZlcnNpb24iIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+RXZlcnkgUGFja2FnZSBoYXMgYSB2ZXJzaW9uIG51bWJlciB1c2VkIHRvIHRyYWNrIGNoYW5nZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iQ29udGVudERlc2NyaXB0aW9uIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgZ2VuZXJhbGl6ZWQgTWV0aG9kIEVsZW1lbnQgdGhhdCBpcyB1c2VkIHRvIHN0b3JlIHRoZSB0ZXh0dWFsIGRlc2NyaXB0aW9uIGZvciBhIENvbnRlbnQgRWxlbWVudC4gIEl0IGRlZmluZXMgc3RhbmRhcmQgYXR0cmlidXRlcyBhcHBsaWNhYmxlIGZvciBhbGwgQ29udGVudCBFbGVtZW50IHR5cGVzLiAgU3BlY2lmaWMgQ29udGVudCBFbGVtZW50IHN1Yi10eXBlcyBjYW4gZGVmaW5lIHRoZWlyIG93biBtYXRjaGluZyBDb250ZW50IERlc2NyaXB0aW9uIHN1Yi10eXBlcy4gPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpNZXRob2RVbml0Ij4KLQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iTWFpbkRlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5TdG9yZXMgdGhlIG1haW4gZGVzY3JpcHRpdmUgdGV4dCBmb3IgdGhlIENvbnRlbnQgRWxlbWVudC4gIEFsbCB0ZXh0IHRoYXQgaXMgbm90IHBhcnQgb2YgYW55IG9mIHRoZSBtb3JlIHNwZWNpZmljIGF0dHJpYnV0ZXMgc2hhbGwgYmUgc3RvcmVkIGhlcmUuICBJZiB0aGUgQ29udGVudCBEZXNjcmlwdGlvbiBpcyBkaXZpZGVkIGludG8gc2VjdGlvbnMgdXNpbmcgdGhlIFNlY3Rpb24gY2xhc3MsIHRoZW4gb25seSB0aGUgdGV4dCBmcm9tIHRoZSAnc3RhcnQnIG9mIHRoZSBjb250ZW50IGRlc2NyaXB0aW9uIHRvIHRoZSBmaXJzdCBzZWN0aW9uIHdpbGwgYmUgc3RvcmVkIGhlcmUgKHNpbWlsYXIgdG8gYSBub3JtYWwgZG9jdW1lbnQgd2hlcmUgeW91IGNhbiBwbGFjZSB0ZXh0IGJldHdlZW4gaXRzIGJlZ2lubmluZyB0byBpdHMgZmlyc3QgZGljdGlvbiBoZWFkaW5nKS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IktleUNvbnNpZGVyYXRpb25zIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5Qcm92aWRlcyBhZHZpc2UgYW5kIGd1aWRhbmNlIG9mIGEgY3JpdGljYWwgbmF0dXJlIGZvciB0aGUgY29udGVudCBlbGVtZW50IGFzIHdlbGwgYXMgd2FybmluZ3MsIGNhdXRpb25zLCBwaXRmYWxscywgZGFuZ2Vycy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlNlY3Rpb24iIHR5cGU9InVtYTpTZWN0aW9uIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iR3VpZGFuY2VEZXNjcmlwdGlvbiI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIGdlbmVyYWxpemVkIENvbnRlbnQgRGVzY3JpcHRpb24gdGhhdCBpcyB1c2VkIHRvIHN0b3JlIHRoZSB0ZXh0dWFsIGRlc2NyaXB0aW9uIGZvciBhIEd1aWRhbmNlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6Q29udGVudERlc2NyaXB0aW9uIj4KLQkJCQk8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQXR0YWNobWVudCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlRoaXMgZmllbGQgaXMgcHJpbWFyaWx5IHVzZWQgZm9yIGF0dGFjaG1lbnRzIGF1Z21lbnRpbmcgdGhlIGluZm9ybWF0aW9uIHByb3ZpZGVkIGZvciBndWlkYW5jZS4gIEluIHBhcnRpY3VsYXIgdGhlIGF0dHJpYnV0ZSBpcyB1c2VkIGZvciBUZW1wbGF0ZXMsIEV4YW1wbGVzLCBhbmQgUmV1c2FibGUgQXNzZXRzIHRvIGNvbnRhaW4gdGhlIGFjdHVhbCBhdHRhY2htZW50IGRlc2NyaWJlZCBpbiB0aGUgbWFpbkRlc2NyaXB0aW9uLiAgSXQgY2FuIGFkZGl0aW9uYWxseSBjb250YWluIHJlcHJlc2VudGF0aW9ucyBvZiB0aGUgZ3VpZGFuY2UgaW4ganVzdCBhIHRoaXJkIHBhcnR5IGZvcm1hdCwgZS5nLiBQREYsIE1TIFdvcmQsIG9yIFdvcmQgUGVyZmVjdC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUHJhY3RpY2VEZXNjcmlwdGlvbiI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIGdlbmVyYWxpemVkIENvbnRlbnQgRGVzY3JpcHRpb24gdGhhdCBpcyB1c2VkIHRvIHN0b3JlIHRoZSB0ZXh0dWFsIGRlc2NyaXB0aW9uIGZvciBhIFByYWN0aWNlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6Q29udGVudERlc2NyaXB0aW9uIj4KLQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQWRkaXRpb25hbEluZm8iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkFueSBhZGRpdGlvbmFsIEluZm9ybWF0aW9uIG5vdCBjb3ZlcmVkIGJ5IHRoZSBvdGhlciBhdHRyaWJ1dGVzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQXBwbGljYXRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkRlc2NyaWJlcyBob3cgdGhlIFByYWN0aWNlIGlzIGJlaW5nIGFwcGxpZWQgb3IgaW50cm9kdWNlZCBpbnRvIHRoZSBjb250ZXh0IGRlc2NyaWJlZCBpbiBiYWNrZ3JvdW5kLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQmFja2dyb3VuZCIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+RWxhYm9yYXRpb24gb24gdGhlIGJhY2tncm91bmQgYW5kIHRoZSBjb250ZXh0IGluIHdoaWNoIHRoZSBwcm9ibGVtIG9jY3VycyBhbmQgd2hlcmUgdGhlIHNvbHV0aW9uIGRlc2NyaWJlZCBieSB0aGlzIFByYWN0aWNlIHdpbGwgZml0IGluLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iR29hbHMiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3VtbWFyeSBvZiB0aGUgb3ZlcmFsbCBnb2FscyB0byBiZSBhZGRyZXNzZWQgYnkgdGhlIFByYWN0aWNlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iTGV2ZWxzT2ZBZG9wdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+T3V0bGluZXMgdGhlIGRpZmZlcmVudCBmb3JtcyBvciB2YXJpYW50cyBpbiB3aGljaCB0aGUgcHJhY3RpY2UgY291bGQgYmUgcmVhbGl6ZWQuIChlLmcuIGZ1bGwgYWRvcHRpb24gdmVydXMgYSBwYXJ0aWFsIGFkb3B0aW9uIG9mIHRoZSBQcmFjdGljZSk8L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlByb2JsZW0iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgZGVzY3JpcHRpb24gb2YgdGhlIHByb2JsZW0gdGhlIFByYWN0aWNlIGFkZHJlc3Nlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJXb3JrUHJvZHVjdERlc2NyaXB0aW9uIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgZ2VuZXJhbGl6ZWQgQ29udGVudCBEZXNjcmlwdGlvbiB0aGF0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIHRleHR1YWwgZGVzY3JpcHRpb24gZm9yIGEgV29yayBQcm9kdWN0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6Q29udGVudERlc2NyaXB0aW9uIj4KLQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iSW1wYWN0T2ZOb3RIYXZpbmciIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkRlc2NyaWJlcyB0aGUgY29uc2VxdWVuY2VzIG9mIG5vdCBwcm9kdWNpbmcgdGhlIHdvcmsgcHJvZHVjdC4gIFRoaXMgaXMgaW50ZW5kZWQgdG8gYWlkIGluIHRoZSB0YWlsb3JpbmcgdGhlIG1ldGhvZC9wcm9jZXNzIHRvIHRoZSBuZWVkcyBvZiBhIHNwZWNpZmljIHByb2plY3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJQdXJwb3NlIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5EZXNjcmliZXMgd2h5IHRoZSB3b3JrIHByb2R1Y3QgaXMgcHJvZHVjZWQgYW5kIHRvIHdoYXQgdXNlIGl0IHdpbGwgYmUgcHV0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUmVhc29uc0Zvck5vdE5lZWRpbmciIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkRlc2NyaWJlcyB0aGUgY2lyY3Vtc3RhbmNlcyBpbiB3aGljaCBpdCBpcyByZWFzb25hYmxlIG5vdCB0byBwcm9kdWNlIHRoZSB3b3JrIHByb2R1Y3QuICBUaGlzIGlzIGludGVuZGVkIHRvIGFpZCBpbiB0aGUgdGFpbG9yaW5nIG9mIHRoZSBtZXRob2QvcHJvY2VzcyB0byB0aGUgbmVlZHMgb2YgYSBzcGVjaWZpYyBwcm9qZWN0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImV4dGVybmFsSWQiIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+QW4gZXh0ZXJuYWwgdmlzaWJsZSBudW1iZXIgdGhhdCBpcyB1c2VkIHRvIHJlZmVyZW5jZSB0aGlzIGFydGlmYWN0LiBVc2VkIGxpa2UgYSBzeW5vbnltLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkFydGlmYWN0RGVzY3JpcHRpb24iPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBnZW5lcmFsaXplZCBXb3JrIFByb2R1Y3QgRGVzY3JpcHRpb24gdGhhdCBpcyB1c2VkIHRvIHN0b3JlIHRoZSB0ZXh0dWFsIGRlc2NyaXB0aW9uIGZvciBhbiBBcnRpZmFjdC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOldvcmtQcm9kdWN0RGVzY3JpcHRpb24iPgotCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJCcmllZk91dGxpbmUiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlByb3ZpZGVzIGEgYnJpZWYgZGVzY3JpcHRpb24gb2YgdGhlIGluZm9ybWF0aW9uIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoaXMgYXJ0aWZhY3QuIEZvciBleGFtcGxlLCBkaXNjdXNzZXMgdGhlIGNvbnRlbnRzIGZvciBrZXkgY2hhcHRlcnMgb2YgYSBkb2N1bWVudCBhcnRpZmFjdCBvciB0aGUga2V5IHBhY2thZ2VzIGFuZCBtb2R1bGVzIG9mIGEgbW9kZWwgYXJ0aWZhY3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJSZXByZXNlbnRhdGlvbk9wdGlvbnMiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkRpc2N1c3NlcyBkaWZmZXJlbnQgcG9zc2libGUgYWx0ZXJuYXRpdmUgcmVwcmVzZW50YXRpb25zIGZvciB0aGUgYXJ0aWZhY3QuIEZvciBleGFtcGxlIGEgZGVzaWduIG1vZGVsIGNhbiBiZSByZXByZXNlbnRlZCBhcyBhIFVNTCBtb2RlbCBvciBhbiBpbmZvcm1hbCBibG9jayBkaWFncmFtIG9yIGJ5IHRleHR1YWwgZGVzY3JpcHRpb24gb25seS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJEZWxpdmVyYWJsZURlc2NyaXB0aW9uIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgZ2VuZXJhbGl6ZWQgV29yayBQcm9kdWN0IERlc2NyaXB0aW9uIHRoYXQgaXMgdXNlZCB0byBzdG9yZSB0aGUgdGV4dHVhbCBkZXNjcmlwdGlvbiBmb3IgYSBEZWxpdmVyYWJsZS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOldvcmtQcm9kdWN0RGVzY3JpcHRpb24iPgotCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJFeHRlcm5hbERlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZGVzY3JpcHRpb24gb2YgdGhlIERlbGl2ZXJhYmxlIHVzZWQgZm9yIGNsaWVudCBkb2N1bWVudHMgKHByb3Bvc2FsLCBzdGF0ZW1lbnRzIG9mIHdvcmsgb3IgY29udHJhY3R1YWwgYWdyZWVtZW50cykuICBJdCBtaWdodCB1c2UgYSBkaWZmZXJlbnQgbGFuZ3VhZ2UgYW5kIGZvbGxvdyBsZWdhbCBjb25zdHJhaW50cy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlBhY2thZ2luZ0d1aWRhbmNlIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5Qcm92aWRlcyBndWlkYW5jZSBvbiBob3cgdG8gYXNzZW1ibGUgdGhlIGRlbGl2ZXJhYmxlIGZyb20gYWxsIGl0cyByZXF1aXJlZCBpbnB1dHMuICBUaGlzIHNlY3Rpb24gZGVzY3JpYmVzIHRoZSBtb3N0IGNvbW1vbiBjb250ZW50IG1lZGl1bSBhbmQgZm9ybWF0LiAgRGlzdHJpYnV0aW9uIG9mIHRoZSBkZWxpdmVyYWJsZSBpcyBhZGRyZXNzZWQgaW4gdGhpcyBzZWN0aW9uLCBpZiBuZWNlc3NhcnkuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUm9sZURlc2NyaXB0aW9uIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgZ2VuZXJhbGl6ZWQgQ29udGVudCBEZXNjcmlwdGlvbiB0aGF0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIHRleHR1YWwgZGVzY3JpcHRpb24gZm9yIGEgUm9sZS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkNvbnRlbnREZXNjcmlwdGlvbiI+Ci0JCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkFzc2lnbm1lbnRBcHByb2FjaGVzIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5Qcm92aWRlcyBndWlkYW5jZSBvbiBmb3IgYXNzaWduaW5nIGluZGl2aWR1YWxzIHRvIHRoZSBSb2xlIGluIHRlcm1zIG9mIHdoYXQgb3RoZXIgcm9sZXMgdGhlc2UgaW5kaXZpZHVhbHMgY291bGQgcGVyZm9ybSBhbmQgd2hhdCByZXNwb25zaWJpbGl0eSBkaWZmZXJlbnQgaW5kaXZpZHVhbHMgYXNzaWduZWQgdG8gdGhpcyByb2xlIG1pZ2h0IGhhdmUuICBUaGUgZ3VpZGFuY2UgY2FuIGFsc28gZGVzY3JpYmUgZGlmZmVyZW50IGFzc2lnbm1lbnQgYXBwcm9hY2hlcyBmb3IgZGlmZmVyZW50IHR5cGVzIG9mIHByb2plY3RzLCBlLmcuIGZvciBsYXJnZSB2ZXJzdXMgc21hbGwgdGVhbXMgd2hlcmUgaW5kaXZpZHVhbHMgY291bGQgYmUgYWxsb2NhdGVkIHRvIHJvbGVzIGZ1bGwgdGltZSB2ZXJzdXMgc2hhcmluZyByb2xlcyB3aXRoaW4gdGhlIHRlYW0uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJTa2lsbHMiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkxpc3RzIG9mIHNldCBvZiByZXF1aXJlZCBza2lsbHMgYSBwZXJzb24gbmVlZHMgdG8gcG9zc2VzcyB0byBmdWxmaWxsIHRoYXQgUm9sZS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlN5bm9ueW1zIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5MaXN0cyBzeW5vbnltcywgaS5lLiBvdGhlciBuYW1lcyB0aGUgUm9sZSBtaWdodCBiZSByZWZlcnJlZCBieS4gIFRvb2wgc3VwcG9ydCBmb3IgdGhlIG1ldGEtbW9kZWwgbWlnaHQgc3VwcG9ydCB0aGF0IGEgUm9sZSBuYW1lIGNhbiBiZSBjb25zaXN0ZW50bHkgYmUgcmVwbGFjZWQgd2l0aCBvbmUgb2YgaXRzIHN5bm9ueW1zIHRocm91Z2h0IGEgUHJvY2Vzcy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJUYXNrRGVzY3JpcHRpb24iPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBnZW5lcmFsaXplZCBDb250ZW50IERlc2NyaXB0aW9uIHRoYXQgaXMgdXNlZCB0byBzdG9yZSB0aGUgdGV4dHVhbCBkZXNjcmlwdGlvbiBmb3IgYSBUYXNrLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6Q29udGVudERlc2NyaXB0aW9uIj4KLQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQWx0ZXJuYXRpdmVzIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5Db21wcmlzZXMgb2Ygc3VtbWFyaWVzIGRlc2NyaWJpbmcgaW1wb3J0YW50IGV4Y2VwdGlvbmFsIGFuZCBub24tc3RhbmRhcmQgd2F5cyBvZiBhY2hpZXZpbmcgdGhpcyBUYXNrJ3MgZGV2ZWxvcG1lbnQgZ29hbHMgdGhhdCB3ZXJlIG5vdCBjb3ZlcmVkIGJ5IHRoZSBUYXNrJ3MgU3RlcHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJQdXJwb3NlIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5TdW1tYXJpemVzIHRoZSBtYWluIHJlYXNvbiBmb3IgcGVyZm9ybWluZyB0aGlzIFRhc2sgYW5kIHdoYXQgaXMgaW50ZW5kZWQgdG8gYmUgYWNoaWV2ZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iRGVzY3JpYmFibGVFbGVtZW50Ij4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkFuIGFic3RyYWN0IGdlbmVyYWxpemF0aW9uIG9mIE1ldGhvZCBFbGVtZW50cyBmb3Igd2hpY2ggZXh0ZXJuYWwgcHJlc2VudGF0aW9uIG5hbWVzIGFzIHdlbGwgYXMgY29udGVudCBkZXNjcmlwdGlvbnMgaGF2ZSBiZWVuIGRlZmluZWQsIHN1Y2ggYXMgUm9sZXMgb3IgV29yayBQcm9kdWN0cy4gIFByZXNlbnRhdGlvbiBOYW1lIGFuZCBDb250ZW50IERlc2NyaXB0aW9ucyBhcmUgdHlwaWNhbGx5IGxvY2FsaXplZCB1c2luZyBhIHJlc291cmNlIGFsbG9jYXRpb24gbWVjaGFuaXNtIGZvciBpdHMgU3RyaW5nIHR5cGUgYXR0cmlidXRlcy4KLVRoaXMgYWJzdHJhY3Rpb24gcmVwcmVzZW50cyBhbGwgZWxlbWVudHMgaW4gdGhlIE1ldGhvZCBDb250ZW50IGFzIHdlbGwgYXMgUHJvY2VzcyBzcGFjZSBmb3Igd2hpY2ggY29uY3JldGUgdGV4dHVhbCBkZXNjcmlwdGlvbnMgYXJlIGRlZmluZWQgaW4gdGhlIGZvcm0gb2YgZG9jdW1lbnRpbmcgYXR0cmlidXRlcyBncm91cGVkIGluIGEgbWF0Y2hpbmcgQ29udGVudCBEZXNjcmlwdGlvbiBpbnN0YW5jZS4gIERlc2NyaWJhYmxlIEVsZW1lbnRzIGFyZSBpbnRlbmRlZCB0byBiZSBwdWJsaXNoZWQgaW4gbWV0aG9kIG9yIHByb2Nlc3MgcHVibGljYXRpb25zIChzaW1pbGFyIHRvIHRoZSBJQk0gUmF0aW9uYWwgVW5pZmllZCBQcm9jZXNzIHdlYikuICBEZXNjcmliYWJsZSBFbGVtZW50IGRlZmluZXMgdGhhdCB0aGUgZWxlbWVudCBpdCByZXByZXNlbnRzIHdpbGwgaGF2ZSBjb250ZW50ICdhdHRhY2hlZCcgdG8gaXQuICBDb250ZW50IERlc2NyaXB0aW9uIGlzIHRoZSBhYnN0cmFjdGlvbiBmb3IgdGhlIGFjdHVhbCBwbGFjZXMgaW4gd2hpY2ggdGhlIGNvbnRlbnQgaXMgYmVpbmcgcmVwcmVzZW50ZWQuICBUaGlzIHNlcGFyYXRpb24gYWxsb3dzIGEgZGlzdGluY3Rpb24gYmV0d2VlbiBjb3JlIG1ldGhvZCBtb2RlbCBlbGVtZW50cyBkZXNjcmliaW5nIHRoZSBzdHJ1Y3R1cmUgb2YgdGhlIG1vZGVsIGZyb20gdGhlIGFjdHVhbCBkZXNjcmlwdGlvbiBjb250YWluZXIgcHJvdmlkaW5nLCBmb3IgZXhhbXBsZSwgdGhlIGRvY3VtZW50YXRpb24gb2YgdGhlIGNvbnRlbnQgZWxlbWVudCBpbiBkaWZmZXJlbnQgYWx0ZXJuYXRpdmVzIGxhbmd1YWdlcywgYXVkaWVuY2VzLCBsaWNlbnNpbmcgbGV2ZWxzLCBldGMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpNZXRob2RFbGVtZW50Ij4KLQkJCQk8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUHJlc2VudGF0aW9uIiB0eXBlPSJ1bWE6Q29udGVudERlc2NyaXB0aW9uIi8+Ci0JCQkJPC94c2Q6Y2hvaWNlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9InByZXNlbnRhdGlvbk5hbWUiIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+RXZlcnkgRGVzY3JpYmFibGUgRWxlbWVudCBoYXMgYSBwcmVzZW50YXRpb24gbmFtZSwgd2hpY2ggaXMgdXNlZCBmb3IgZXh0ZXJuYWwgcHJlc2VudGF0aW9uIG9mIHRoZSBlbGVtZW50LiAgRm9yIGV4YW1wbGUsIG5hbWUgKHRoZSBpbnRlcm5hbCByZXByZXNlbnRhdGlvbikgbWlnaHQgYmUgc2V0IHRvICJydXBfYXJjaGl0ZWN0dXJlX2RvY3VtZW50IiB0byBkaWZmZXJlbnRpYXRlIGZyb20gYSAiajJlZV9hcmNoaXRjdHVyZV9kb2N1bWVudCIgd2hlcmVhcyB0aGUgZXh0ZXJuYWwgcHJlc2VudGF0aW9uIHdvdWxkIGFsd2F5cyBiZSAiQXJjaGl0ZWN0dXJlIERvY3VtZW50Ii48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzaGFwZWljb24iIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+QSByZWZlcmVuY2UgdG8gYW4gaWNvbiB0aGF0IGNhbiBiZSB1c2VkIGZvciBtb2RlbGluZyB3aXRoIHNwZWNpZmljIENvbnRlbnQgRWxlbWVudCBpbnN0YW5jZXMgKGFzIGdyYXBoaWNhbCBzdGVyZW90eXBlcywgZS5nLiBhIHVzZSBjYXNlIHN5bWJvbCBmb3IgYSB1c2UgY2FzZSBhcnRpZmFjdCkgYXMgd2VsbCBhcyBwdWJsaWNhdGlvbiBvZiBjb250ZW50LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9Im5vZGVpY29uIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgcmVmZXJlbmNlIHRvIGFuIGljb24gdGhhdCBjYW4gYmUgdXNlZCBpbiB0cmVlIGJyb3dzZXIgcHJlc2VudGF0aW9ucyBhbmQgYnJlYWtkb3duIHN0cnVjdHVyZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iQ29udGVudEVsZW1lbnQiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBEZXNjcmliYWJsZSBFbGVtZW50IHRoYXQgcmVwcmVzZW50cyBhbiBhYnN0cmFjdCBnZW5lcmFsaXphdGlvbiBmb3IgYWxsIGVsZW1lbnRzIHRoYXQgYXJlIGNvbnNpZGVyZWQgdG8gYmUgYW5kIG1hbmFnZWQgYXMgTWV0aG9kIENvbnRlbnQuCi1Db250ZW50IEVsZW1lbnRzIHJlcHJlc2VudHMgcmV1c2FibGUgTWV0aG9kIENvbnRlbnQgdGhhdCBpcyBzdXBwb3NlZCB0byBiZSBtYW5hZ2VkIGluIENvbnRlbnQgUGFja2FnZXMuICBUaGUgc2VwYXJhdGlvbiBvZiBDb250ZW50IEVsZW1lbnQgZnJvbSBQcm9jZXNzIEVsZW1lbnQgYWxsb3dzIHRvIGNsZWFybHkgZGlzdGluZ3Vpc2ggYmV0d2VlbiBwdXJlIG1ldGhvZCBjb250ZW50IGZyb20gY29udGVudCB0aGF0IGlzIHJlcHJlc2VudGVkIGluIHByb2Nlc3Nlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkRlc2NyaWJhYmxlRWxlbWVudCI+Ci0JCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQ2hlY2tsaXN0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQ29uY2VwdCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkV4YW1wbGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJHdWlkZWxpbmUiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJSZXVzYWJsZUFzc2V0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iU3VwcG9ydGluZ01hdGVyaWFsIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iV2hpdGVwYXBlciIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0idmFyaWFiaWxpdHlUeXBlIiB0eXBlPSJ1bWE6VmFyaWFiaWxpdHlUeXBlIi8+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0idmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ikd1aWRhbmNlIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkd1aWRhbmNlIGlzIGFuIGFic3RyYWN0IGdlbmVyYWxpemF0aW9uIG9mIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVsYXRlZCB0byBjb250ZW50IGVsZW1lbnRzIHN1Y2ggYXMgUm9sZXMsIFRhc2tzLCBhbmQgV29yayBQcm9kdWN0cy4gIEV4YW1wbGVzIGZvciBHdWlkYW5jZSBhcmUgR3VpZGVsaW5lcywgVGVtcGxhdGVzLCBDaGVja2xpc3RzLCBUb29sIE1lbnRvcnMsIEVzdGltYXRlcywgU3VwcG9ydGluZyBNYXRlcmlhbHMsIFJlcG9ydHMsIENvbmNlcHRzLCBldGMuICBUaGlzIHBhY2thZ2Ugb25seSBjb250YWlucyB0aGUgZGVmaW5pdGlvbiBvZiB0aGUgYWJzdHJhY3QgR3VpZGFuY2UgY2xhc3MuICBUaGUgcGFja2FnZSBHdWlkYW5jZSBUeXBlcyBkZWZpbmVzIGNvbmNyZXRlIGd1aWRhbmNlIHR5cGVzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6Q29udGVudEVsZW1lbnQiLz4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJDb25jZXB0Ij4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lmaWMgdHlwZSBvZiBndWlkYW5jZSB0aGF0IG91dGxpbmVzIGtleSBpZGVhcyBhc3NvY2lhdGVkIHdpdGggYmFzaWMgcHJpbmNpcGxlcyB1bmRlcmx5aW5nIHRoZSByZWZlcmVuY2VkIGl0ZW0uIENvbmNlcHRzIG5vcm1hbGx5IGFkZHJlc3MgbW9yZSBnZW5lcmFsIHRvcGljcyB0aGFuIEd1aWRlbGluZXMgYW5kIHNwYW4gYWNyb3NzIHNldi1lcmFsIHdvcmsgcHJvZHVjdCBhbmQvb3IgdGFza3MvYWN0aXZpdGllcy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkd1aWRhbmNlIi8+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iQ2hlY2tsaXN0Ij4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lmaWMgdHlwZSBvZiBndWlkYW5jZSB0aGF0IGlkZW50aWZpZXMgYSBzZXJpZXMgb2YgaXRlbXMgdGhhdCBuZWVkIHRvIGJlIGNvbXBsZXRlZCBvciB2ZXJpLWZpZWQuICBDaGVja2xpc3RzIGFyZSBvZnRlbiB1c2VkIGluIHJldmlld3Mgc3VjaCBhcyB3YWxrdGhyb3VnaHMgb3IgaW5zcGVjdGlvbnMuIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6R3VpZGFuY2UiLz4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJFeGFtcGxlIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lmaWMgdHlwZSBvZiBHdWlkYW5jZSB0aGF0IHJlcHJlc2VudHMgYSB0eXBpY2FsLCBwYXJ0aWFsbHkgY29tcGxldGVkLCBzYW1wbGUgaW5zdGFuY2Ugb2Ygb25lIG9yIG1vcmUgd29yayBwcm9kdWN0cyBvciBzY2VuYXJpbyBsaWtlIGRlc2NyaXB0aW9ucyBvZiBob3cgVGFzayBtYXkgYmUgcGVyZm9ybWVkLiBFeGFtcGxlcyBjYW4gYmUgcmVsYXRlZCB0byBXb3JrIFByb2R1Y3RzIGFzIHdlbGwgYXMgVGFza3MgdGhhdCBwcm9kdWNlIHRoZW0gYXMgd2VsbCBhcyBhbnkgb3RoZXIgQ29udGVudCBFbGVtZW50LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6R3VpZGFuY2UiLz4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJHdWlkZWxpbmUiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWZpYyB0eXBlIG9mIGd1aWRhbmNlIHRoYXQgcHJvdmlkZXMgYWRkaXRpb25hbCBkZXRhaWwgb24gaG93IHRvIHBlcmZvcm0gYSBwYXJ0aWN1bGFyIHRhc2sgb3IgZ3JvdXBpbmcgb2YgdGFza3MgKGUuZy4gZ3JvdXBlZCB0b2dldGhlciBhcyBhY3Rpdml0aWVzKSBvciB0aGF0IHByb3ZpZGVzIGFkZGl0aW9uYWwgZGV0YWlsLCBydWxlcywgYW5kIHJlY29tbWVuZGF0aW9ucyBvbiB3b3JrIHByb2R1Y3RzIGFuZCB0aGVpciBwcm9wZXJ0aWVzLiAgQW1vbmdzdCBvdGhlcnMsIGl0IGNhbiBpbmNsdWRlIGRldGFpbHMgYWJvdXQgYmVzdCBwcmFjdGljZXMgYW5kIGRpZmZlcmVudCBhcHByb2FjaGVzIGZvciBkb2luZyB3b3JrLCBob3cgdG8gdXNlIHBhcnRpY3VsYXIgdHlwZXMgb2Ygd29yayBwcm9kdWN0cywgaW5mb3JtYXRpb24gb24gZGlmZmVyZW50IHN1YnR5cGVzIGFuZCB2YXJpYW50cyBvZiB0aGUgd29yayBwcm9kdWN0IGFuZCBob3cgdGhleSBldm9sdmUgdGhyb3VnaG91dCBhIGxpZmVjeWNsZSwgZGlzY3Vzc2lvbnMgb24gc2tpbGxzIHRoZSBwZXJmb3JtaW5nIHJvbGVzIHNob3VsZCBhY3F1aXJlIG9yIGltcHJvdmUgdXBvbiwgbWVhc3VyZW1lbnRzIGZvciBwcm9ncmVzcyBhbmQgbWF0dXJpdHksIGV0Yy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkd1aWRhbmNlIi8+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iRXN0aW1hdGUiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWZpYyB0eXBlIG9mIEd1aWRhbmNlIHRoYXQgcHJvdmlkZXMgc2l6aW5nIG1lYXN1cmVzLCBvciBzdGFuZGFyZHMgZm9yIHNpemluZyB0aGUgd29yayBlZmZvcnQgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgYSBwYXJ0aWN1bGFyIHBpZWNlIG9mIHdvcmsgYW5kIGluc3RydWN0aW9ucyBmb3IgdGhlaXIgc3VjY2Vzc2Z1bCB1c2UuIEl0IG1heSBiZSBjb21wcmlzZWQgb2YgZXN0aW1hdGlvbiBjb25zaWRlcmF0aW9ucyBhbmQgZXN0aW1hdGlvbiBtZXRyaWNzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6R3VpZGFuY2UiPgotCQkJCTx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iRXN0aW1hdGlvbk1ldHJpYyIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJPC94c2Q6Y2hvaWNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkVzdGltYXRpbmdNZXRyaWMiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWZpYyB0eXBlIG9mIEd1aWRhbmNlIHRoYXQgZGVzY3JpYmVzIGEgbWV0cmljIG9yIG1lYXN1cmUgdGhhdCBpcyBhc3NvY2lhdGVkIHdpdGggYW4gZWxlbWVudCBhbmQgd2hpY2ggaXMgdXNlZCB0byBjYWxjdWxhdGUgdGhlIHNpemUgb2YgdGhlIHdvcmsgZWZmb3J0IGFzIHdlbGwgYXMgYSByYW5nZSBvZiBwb3RlbnRpYWwgbGFib3IuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpHdWlkYW5jZSIvPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkVzdGltYXRpb25Db25zaWRlcmF0aW9ucyI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpZmljIHR5cGUgb2YgR3VpZGFuY2UgdGhhdCBxdWFsaWZpZXMgdGhlIHVzYWdlIGFuZCBhcHBsaWNhdGlvbiBvZiBlc3RpbWF0aW9uIG1ldHJpY3MgaW4gdGhlIGRldmVsb3BtZW50IG9mIGFuIGFjdHVhbCBlc3RpbWF0ZS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkd1aWRhbmNlIi8+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUm9hZG1hcCI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpZmljIHR5cGUgb2YgR3VpZGFuY2Ugd2hpY2ggaXMgb25seSByZWxhdGVkIHRvIEFjdGl2YXRlcyBhbmQgdGhlcmVmb3JlIGhhcyBiZWVuIGFkZGVkIGJ5IHRoaXMgcGFja2FnZSB0byB0aGUgbGlzdCBvZiBHdWlkYW5jZSBUeXBlcyByYXRoZXIgdGhhbiBsaXN0ZWQgaW4gdGhlIEd1aWRhbmNlIFR5cGVzIHBhY2thZ2UuICBBIFJvYWRtYXAgcmVwcmVzZW50cyBhIGxpbmVhciB3YWxrdGhyb3VnaCBvZiBhbiBBY3Rpdml0eSwgdHlwaWNhbGx5IGEgUHJvY2Vzcy4KLUFuIGluc3RhbmNlIG9mIGEgUm9hZG1hcCByZXByZXNlbnRzIGltcG9ydGFudCBkb2N1bWVudGF0aW9uIGZvciB0aGUgQWN0aXZpdHkgb3IgUHJvY2VzcyBpdCBpcyByZWxhdGVkIHRvLiAgT2Z0ZW4gYSBjb21wbGV4IEFjdGl2aXR5IHN1Y2ggYXMgYSBQcm9jZXNzIGNhbiBiZSBtdWNoIGVhc2llciB1bmRlcnN0b29kIGJ5IHByb3ZpZGluZyBhIHdhbGt0aHJvdWdoIHdpdGggYSBsaW5lYXIgdGhyZWFkIG9mIGEgdHlwaWNhbCBpbnN0YW50aWF0aW9uIG9mIHRoaXMgQWN0aXZpdHkuICBJbiBhZGRpdGlvbiB0byBtYWtpbmcgdGhlIHByb2Nlc3MgcHJhY3RpdGlvbmVyIHVuZGVyc3RhbmQgaG93IHdvcmsgaW4gdGhlIHByb2Nlc3MgaXMgYmVpbmcgcGVyZm9ybWVkLCBhIFJvYWRtYXAgcHJvdmlkZXMgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCBob3cgQWN0aXZpdGllcyBhbmQgVGFza3MgcmVsYXRlIHRvIGVhY2ggb3RoZXIgb3ZlciB0aW1lLiAgUm9hZG1hcHMgYXJlIGFsc28gdXNlZCB0byBzaG93IGhvdyBzcGVjaWZpYyBhc3BlY3RzIGFyZSBkaXN0cmlidXRlZCBvdmVyIGEgd2hvbGUgcHJvY2VzcyBwcm92aWRpbmcgYSBraW5kIG9mIGZpbHRlciBvbiB0aGUgcHJvY2VzcyBmb3IgdGhpcyBpbmZvcm1hdGlvbi48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkd1aWRhbmNlIi8+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUmVwb3J0Ij4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgcHJlZGVmaW5lZCB0ZW1wbGF0ZSBvZiBhIHJlc3VsdCB0aGF0IGlzIGdlbmVyYXRlZCBvbiB0aGUgYmFzaXMgb2Ygb3RoZXIgd29yayBwcm9kdWN0cyBhcyBhbiBvdXRwdXQgZnJvbSBzb21lIGZvcm0gb2YgdG9vbCBhdXRvbWF0aW9uLiBBbiBleGFtcGxlIGZvciBhIHJlcG9ydCB3b3VsZCBiZSBhIHVzZSBjYXNlIG1vZGVsIHN1cnZleSwgd2hpY2ggaXMgZ2VuZXJhdGVkIGJ5IGV4dHJhY3RpbmcgZGlhZ3JhbSBpbmZvcm1hdGlvbiBmcm9tIGEgZ3JhcGhpY2FsIG1vZGVsIGFuZCB0ZXh0dWFsIGluZm9ybWF0aW9uIGZyb20gZG9jdW1lbnRzIGFuZCBjb21iaW5lcyB0aGVzZSB0d28gdHlwZXMgb2YgaW5mb3JtYXRpb24gaW50byBhIHJlcG9ydC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkd1aWRhbmNlIi8+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iVGVtcGxhdGUiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWZpYyB0eXBlIG9mIGd1aWRhbmNlIHRoYXQgcHJvdmlkZXMgZm9yIGEgd29yayBwcm9kdWN0IGEgcHJlLWRlZmluZWQgdGFibGUgb2YgY29udGVudHMsIHNlY3Rpb25zLCBwYWNrYWdlcywgYW5kL29yIGhlYWRpbmdzLCBhIHN0YW5kYXJkaXplZCBmb3JtYXQsIGFzIHdlbGwgYXMgZGVzY3JpcHRpb25zIGhvdyB0aGUgc2VjdGlvbnMgYW5kIHBhY2thZ2VzIGFyZSBzdXBwb3NlZCB0byBiZSB1c2VkIGFuZCBjb21wbGV0ZWQuIFRlbXBsYXRlcyBjYW5ub3Qgb25seSBiZSBwcm92aWRlZCBmb3IgZG9jdW1lbnRzLCBidXQgYWxzbyBmb3IgY29uY2VwdHVhbCBtb2RlbHMgb3IgcGh5c2ljYWwgZGF0YSBzdG9yZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpHdWlkYW5jZSIvPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlN1cHBvcnRpbmdNYXRlcmlhbCI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIGNhdGNoYWxsIGZvciBvdGhlciB0eXBlcyBvZiBndWlkYW5jZSBub3Qgc3BlY2lmaWNhbGx5IGRlZmluZWQgZWxzZXdoZXJlLiBJdCBjYW4gYmUgcmVsYXRlZCB0byBhbGwga2luZHMgb2YgQ29udGVudCBFbGVtZW50cywgaS5lLiBpbmNsdWRpbmcgb3RoZXIgZ3VpZGFuY2UgZWxlbWVudHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpHdWlkYW5jZSIvPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlRvb2xNZW50b3IiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSAgc3BlY2lmaWMgdHlwZSBvZiBndWlkYW5jZSB0aGF0IHNob3dzIGhvdyB0byB1c2UgYSBzcGVjaWZpYyB0b29sIHRvIGFjY29tcGxpc2ggc29tZSBwaWVjZSBvZiB3b3JrIGEgV29yayBQcm9kdWN0IGVpdGhlciBpbiB0aGUgY29udGV4dCBvZiBvciBpbmRlcGVuZGVudCBmcm9tIGEgVGFzayBvciBBY3Rpdml0eS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkd1aWRhbmNlIi8+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iV2hpdGVwYXBlciI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpYWwgQ29uY2VwdCBndWlkYW5jZSB0aGF0IGhhdmUgYmVlbiBleHRlcm5hbGx5IHJldmlld2VkIG9yIHB1Ymxpc2hlZCBhbmQgY2FuIGJlIHJlYWQgYW5kIHVuZGVyc3Rvb2QgaW4gaXNvbGF0aW9uIG9mIG90aGVyIGNvbnRlbnQgZWxlbWVudHMgYW5kIGd1aWRhbmNlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6Q29uY2VwdCIvPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlRlcm1EZWZpbml0aW9uIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lmaWMgdHlwZSBvZiBndWlkYW5jZSB0aGF0IGRlZmluZXMgY29uY2VwdHMgYW5kIGFyZSB1c2VkIHRvIGJ1aWxkIHVwIHRoZSBHbG9zc2FyeS4gVGVybURlZmluaXRpb25zIGFyZSBub3QgZGlyZWN0bHkgcmVsYXRlZCB0byBDb250ZW50RWxlbWVudHMsIGJ1dCB0aGVpciByZWxhdGlvbnNoaXAgaXMgYmVpbmcgZGVyaXZlZCB3aGVuIHRoZSBUZXJtIGlzIHVzZWQgaW4gdGhlIENvbnRlbnRFbGVtZW50cyBkZXNjcmlwdGlvbiB0ZXh0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6R3VpZGFuY2UiLz4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJQcmFjdGljZSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpZmljIHR5cGUgb2YgZ3VpZGFuY2UgdGhhdCByZXByZXNlbnRzIGEgcHJvdmVuIHdheSBvciBzdHJhdGVneSBvZiBkb2luZyB3b3JrIHRvIGFjaGlldmUgYSBnb2FsIHRoYXQgaGFzIGEgcG9zaXRpdmUgaW1wYWN0IG9uIHdvcmsgcHJvZHVjdCBvciBwcm9jZXNzIHF1YWxpdHkuICBQcmFjdGljZXMgYXJlIGRlZmluZWQgb3J0aG9nb25hbCB0byBtZXRob2RzIGFuZCBwcm9jZXNzZXMuICBUaGV5IGNvdWxkIHN1bW1hcml6ZSBhc3BlY3RzIHRoYXQgaW1wYWN0IG1hbnkgZGlmZmVyZW50IHBhcnRzIG9mIGEgbWV0aG9kIG9yIHNwZWNpZmljIHByb2Nlc3Nlcy4gIEV4YW1wbGVzIGZvciBwcmFjdGljZXMgd291bGQgYmUgIk1hbmFnZSBSaXNrcyIsICJDb250aW51b3VzbHkgdmVyaWZ5IHF1YWxpdHkiLCAiQXJjaGl0ZWN0dXJlLWNlbnRyaWMgYW5kIGNvbXBvbmVudC1iYXNlZCBkZXZlbG9wbWVudCIsIGV0Yy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkd1aWRhbmNlIj4KLQkJCQk8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkFjdGl2aXR5UmVmZXJlbmNlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJDb250ZW50UmVmZXJlbmNlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJTdWJQcmFjdGljZSIgdHlwZT0idW1hOlByYWN0aWNlIi8+Ci0JCQkJPC94c2Q6Y2hvaWNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlJldXNhYmxlQXNzZXQiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWZpYyB0eXBlIG9mIGd1aWRhbmNlIHRoYXQgcHJvdmlkZXMgYSBzb2x1dGlvbiB0byBhIHByb2JsZW0gZm9yIGEgZ2l2ZW4gY29udGV4dC4gVGhlIGFzc2V0IG1heSBoYXZlIGEgdmFyaWFiaWxpdHkgcG9pbnQsIHdoaWNoIGlzIGEgbG9jYXRpb24gaW4gdGhlIGFzc2V0IHRoYXQgbWF5IGhhdmUgYSB2YWx1ZSBwcm92aWRlZCBvciBjdXN0b21pemVkIGJ5IHRoZSBhc3NldCBjb25zdW1lci4gVGhlIGFzc2V0IGhhcyBydWxlcyBmb3IgdXNhZ2Ugd2hpY2ggYXJlIHRoZSBpbnN0cnVjdGlvbnMgZGVzY3JpYmluZwotaG93IHRoZSBhc3NldCBzaG91bGQgYmUgdXNlZC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkd1aWRhbmNlIi8+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iV29ya1Byb2R1Y3QiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QW4gYWJzdHJhY3QgY2xhc3Mgd2hpY2ggcHJvdmlkZXMgYSBnZW5lcmFsaXphdGlvbiBmb3IgdGhlIGNvbnRlbnQgZWxlbWVudCB0eXBlcyBBcnRpZmFjdCwgT3V0Y29tZSwgYW5kIERlbGl2ZXJhYmxlLiAgVGhlIG1ldGEtbW9kZWwgY2xhc3MgV29yayBQcm9kdWN0IGFjdHVhbGx5IHJlcHJlc2VudHMgd29yayBwcm9kdWN0IHR5cGVzLCBpLmUuIGFuIGluc3RhbmNlIG9mIFdvcmsgUHJvZHVjdCBpcyBhIGRlc2NyaXB0aW9uIG9mIGEgc3BlY2lmaWMgdHlwZSBvZiB3b3JrIHByb2R1Y3QgYW5kIG5vdCBhbiBpbmRpdmlkdWFsIHdvcmsgcHJvZHVjdCBpbnN0YW5jZS4gIEhvd2V2ZXIsIGZvciBzaW1wbGljaXR5IHJlYXNvbnMgYW5kIGJlY2F1c2Ugb2YgbG93IHJpc2sgb2YgbWlzaW50ZXJwcmV0YXRpb24gd2UgZGlkIG5vdCBhcHBlbmQgdGhlIHdvcmQgJ3R5cGUnIHRvIGV2ZXJ5IG1ldGEtY2xhc3MuCi1BIHdvcmsgcHJvZHVjdCBpcyBhbiBhYnN0cmFjdGlvbiBmb3IgZGVzY3JpcHRpb25zIG9mIGNvbnRlbnQgZWxlbWVudHMgdGhhdCBhcmUgdXNlZCB0byBkZWZpbmUgYW55dGhpbmcgdXNlZCwgcHJvZHVjZWQsIG9yIG1vZGlmaWVkIGJ5IGEgdGFzay48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkNvbnRlbnRFbGVtZW50Ij4KLQkJCQk8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkVzdGltYXRlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlJlcG9ydCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iVGVtcGxhdGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlRvb2xNZW50b3IiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iQXJ0aWZhY3QiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBXb3JrIFByb2R1Y3QgdGhhdCBwcm92aWRlcyBhIGRlc2NyaXB0aW9uIGFuZCBkZWZpbml0aW9uIGZvciB0YW5naWJsZSB3b3JrIHByb2R1Y3QgdHlwZXMuIEFydGlmYWN0cyBtYXkgYmUgY29tcG9zZWQgb2Ygb3RoZXIgYXJ0aWZhY3RzLiBGb3IgZXhhbXBsZSwgYSBtb2RlbCBhcnRpZmFjdCBjYW4gYmUgY29tcG9zZWQgb2YgbW9kZWwgZWxlbWVudHMsIHdoaWNoIGFyZSBhbHNvIGFydGlmYWN0cy4KLUFydGlmYWN0cyBhcmUgdGFuZ2libGUgd29yayBwcm9kdWN0cyBjb25zdW1lZCwgcHJvZHVjZWQsIG9yIG1vZGlmaWVkIGJ5IFRhc2tzLiAgSXQgbWF5IHNlcnZlIGFzIGEgYmFzaXMgZm9yIGRlZmluaW5nIHJldXNhYmxlIGFzc2V0cy4gIFJvbGVzIHVzZSBBcnRpZmFjdHMgdG8gcGVyZm9ybSBUYXNrcyBhbmQgcHJvZHVjZSBBcnRpZmFjdHMgaW4gdGhlIGNvdXJzZSBvZiBwZXJmb3JtaW5nIFRhc2tzLiAgQXJ0aWZhY3RzIGFyZSB0aGUgcmVzcG9uc2liaWxpdHkgb2YgYSBzaW5nbGUgUm9sZSwgbWFraW5nIHJlc3BvbnNpYmlsaXR5IGVhc3kgdG8gaWRlbnRpZnkgYW5kIHVuZGVyc3RhbmQsIGFuZCBwcm9tb3RpbmcgdGhlIGlkZWEgdGhhdCBldmVyeSBwaWVjZSBvZiBpbmZvcm1hdGlvbiBwcm9kdWNlZCBpbiB0aGUgbWV0aG9kIHJlcXVpcmVzIHRoZSBhcHByb3ByaWF0ZSBzZXQgb2Ygc2tpbGxzLiBFdmVuIHRob3VnaCBvbmUgcm9sZSBtaWdodCAib3duIiBhIHNwZWNpZmljIHR5cGUgb2YgQXJ0aWZhY3RzLCBvdGhlciByb2xlcyBjYW4gc3RpbGwgdXNlIHRoZSBBcnRpZmFjdHM7IHBlcmhhcHMgZXZlbiB1cGRhdGUgdGhlbSBpZiB0aGUgUm9sZSBoYXMgYmVlbiBnaXZlbiBwZXJtaXNzaW9uIHRvIGRvIHNvLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6V29ya1Byb2R1Y3QiPgotCQkJCTx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQ29udGFpbmVkQXJ0aWZhY3QiIHR5cGU9InVtYTpBcnRpZmFjdCIvPgotCQkJCTwveHNkOmNob2ljZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJEZWxpdmVyYWJsZSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIFdvcmsgUHJvZHVjdCB0aGF0IHByb3ZpZGVzIGEgZGVzY3JpcHRpb24gYW5kIGRlZmluaXRpb24gZm9yIHBhY2thZ2luZyBvdGhlciBXb3JrIFByb2R1Y3RzLCBhbmQgbWF5IGJlIGRlbGl2ZXJlZCB0byBhbiBpbnRlcm5hbCBvciBleHRlcm5hbCBwYXJ0eS4gIFRoZXJlZm9yZSwgYSBEZWxpdmVyYWJsZSBhZ2dyZWdhdGVzIG90aGVyIFdvcmsgUHJvZHVjdHMuIFRoZXJlZm9yZSwgYSBEZWxpdmVyYWJsZSBhZ2dyZWdhdGVzIG90aGVyIFdvcmsgUHJvZHVjdHMuICBBIERlbGl2ZXJhYmxlIGlzIHVzZWQgdG8gcHJlLWRlZmluZSB0eXBpY2FsIG9yIHJlY29tbWVuZGVkIGNvbnRlbnQgaW4gdGhlIGZvcm0gb3Igd29yayBwcm9kdWN0cyB0aGF0IHdvdWxkIGJlIHBhY2thZ2VkIGZvciBkZWxpdmVyeS4gIFRoZSBhY3R1YWwgcGFja2FnaW5nIG9mIHRoZSBEZWxpdmVyYWJsZSBpbiBhbiBhY3R1YWwgcHJvY2VzcyBvciBldmVuIHByb2plY3QgY291bGQgYmUgYSBtb2RpZmljYXRpb24gb2YgdGhpcyByZWNvbW1lbmRhdGlvbi4gIERlbGl2ZXJhYmxlcyBhcmUgdXNlZCB0byByZXByZXNlbnQgYW4gb3V0cHV0IGZyb20gYSBwcm9jZXNzIHRoYXQgaGFzIHZhbHVlLCBtYXRlcmlhbCBvciBvdGhlcndpc2UsIHRvIGEgY2xpZW50LCBjdXN0b21lciBvciBvdGhlciBzdGFrZWhvbGRlci4gPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpXb3JrUHJvZHVjdCI+Ci0JCQkJPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJEZWxpdmVyZWRXb3JrUHJvZHVjdCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCTwveHNkOmNob2ljZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJPdXRjb21lIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgV29yayBQcm9kdWN0IHRoYXQgZGVzY3JpYmVzIGludGFuZ2libGUgd29yayBwcm9kdWN0cyB0aGF0IGFyZSBhIHJlc3VsdCBvciBzdGF0ZS4gT3V0Y29tZXMgbWF5IGFsc28gYmUgdXNlZCB0byBkZXNjcmliZSB3b3JrIHByb2R1Y3RzIHRoYXQgYXJlIG5vdCBmb3JtYWxseSBkZWZpbmVkLiAgQSBrZXkgZGlmZmVyZW50aWF0b3IgZm9yIG91dGNvbWVzIGFnYWluc3QgYXJ0aWZhY3RzIGlzIHRoYXQgb3V0Y29tZXMgYXJlIG5vdCBjYW5kaWRhdGVzIGZvciBoYXJ2ZXN0aW5nIGFzIHJldXNhYmxlIGFzc2V0cy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOldvcmtQcm9kdWN0Ii8+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUm9sZSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIENvbnRlbnQgRWxlbWVudCB0aGF0IGRlZmluZXMgYSBzZXQgb2YgcmVsYXRlZCBza2lsbHMsIGNvbXBldGVuY2llcywgYW5kIHJlc3BvbnNpYmlsaXRpZXMuICBSb2xlcyBhcmUgdXNlZCBieSBUYXNrcyB0byBkZWZpbmUgd2hvIHBlcmZvcm1zIHRoZW0gYXMgd2VsbCBhcyBkZWZpbmUgYSBzZXQgb2Ygd29yayBwcm9kdWN0cyB0aGV5IGFyZSByZXNwb25zaWJsZSBmb3IuICAKLUEgUm9sZSBkZWZpbmVzIGEgc2V0IG9mIHJlbGF0ZWQgc2tpbGxzLCBjb21wZXRlbmNpZXMsIGFuZCByZXNwb25zaWJpbGl0aWVzIG9mIGFuIGluZGl2aWR1YWwgb3IgYSBzZXQgb2YgaW5kaXZpZHVhbHMuICBSb2xlcyBhcmUgbm90IGluZGl2aWR1YWxzIG9yIHJlc291cmNlcy4gIEluZGl2aWR1YWwgbWVtYmVycyBvZiB0aGUgZGV2ZWxvcG1lbnQgb3JnYW5pemF0aW9uIHdpbGwgd2VhciBkaWZmZXJlbnQgaGF0cywgb3IgcGVyZm9ybSBkaWZmZXJlbnQgcm9sZXMuIFRoZSBtYXBwaW5nIGZyb20gaW5kaXZpZHVhbCB0byByb2xlLCBwZXJmb3JtZWQgYnkgdGhlIHByb2plY3QgbWFuYWdlciB3aGVuIHBsYW5uaW5nIGFuZCBzdGFmZmluZyBmb3IgYSBwcm9qZWN0LCBhbGxvd3MgZGlmZmVyZW50IGluZGl2aWR1YWxzIHRvIGFjdCBhcyBzZXZlcmFsIGRpZmZlcmVudCByb2xlcywgYW5kIGZvciBhIHJvbGUgdG8gYmUgcGxheWVkIGJ5IHNldmVyYWwgaW5kaXZpZHVhbHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpDb250ZW50RWxlbWVudCI+Ci0JCQkJPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJSZXNwb25zaWJsZUZvciIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCTwveHNkOmNob2ljZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJUYXNrIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgQ29udGVudCBFbGVtZW50IHRoYXQgZGVzY3JpYmVzIHdvcmsgYmVpbmcgcGVyZm9ybWVkIGJ5IFJvbGVzLiAgSXQgZGVmaW5lcyBvbmUgZGVmYXVsdCBwZXJmb3JtaW5nIFJvbGUgYXMgd2VsbCBhcyBtYW55IGFkZGl0aW9uYWwgcGVyZm9ybWVycy4gIEEgVGFzayBpcyBhc3NvY2lhdGVkIHRvIGlucHV0IGFuZCBvdXRwdXQgd29yayBwcm9kdWN0cy4gIElucHV0cyBhcmUgZGlmZmVyZW50aWF0ZWQgaW4gbWFuZGF0b3J5IHZlcnN1cyBvcHRpb25hbCBpbnB1dHMuICBUaGUgYXNzb2NpYXRpb25zIHRvIFdvcmsgUHJvZHVjdHMgYXJlIG5vdCBpbnN0YW50aWF0YWJsZS92YXJpYWJsZS1saWtlIHBhcmFtZXRlcnMuICBUaGV5IHJhdGhlciBleHByZXNzIChoeXBlci0pbGlua3MgdG8gdGhlIGRlc2NyaXB0aW9ucyBvZiB0aGUgd29yayBwcm9kdWN0cyB0eXBlcyB0aGF0IGFyZSByZWxhdGVkIHRvIHRoZSBUYXNrIGFzIGlucHV0cyBhbmQgb3V0cHV0cy4gIEluIG90aGVyIHdvcmRzLCB0aGVzZSBhc3NvY2lhdGlvbnMgYXJlIG5vdCBpbnRlbmRlZCB0byBiZSB1c2VkIHRvIGNhcHR1cmUgd2hpY2ggY29uY3JldGUgaW5zdGFuY2VzIHdpbGwgYmUgcGFzc2VkIHdoZW4gaW5zdGFudGlhdGluZyB0aGUgbWV0aG9kIGluIGEgcHJvamVjdC4gIEFsbCBvZiB0aGUgVGFzaydzIGRlZmF1bHQgYXNzb2NpYXRpb25zIGNhbiBiZSBvdmVycmlkZGVuIGluIGFuIGFjdHVhbCBwcm9jZXNzIGRlZmluaXRpb24uCi1BIFRhc2sgZGVzY3JpYmVzIGFuIGFzc2lnbmFibGUgdW5pdCBvZiB3b3JrLiAgRXZlcnkgVGFzayBpcyBhc3NpZ25lZCB0byBzcGVjaWZpYyBSb2xlcy4gIFRoZSBncmFudWxhcml0eSBvZiBhIFRhc2sgaXMgZ2VuZXJhbGx5IGEgZmV3IGhvdXJzIHRvIGEgZmV3IGRheXMuICBJdCB1c3VhbGx5IGFmZmVjdHMgb25lIG9yIG9ubHkgYSBzbWFsbCBudW1iZXIgb2Ygd29yayBwcm9kdWN0cy4gQSBUYXNrIGlzIHVzZWQgYXMgYW4gZWxlbWVudCBvZiBkZWZpbmluZyBhIHByb2Nlc3MuIFRhc2tzIGFyZSBmdXJ0aGVyIHVzZWQgZm9yIHBsYW5uaW5nIGFuZCB0cmFja2luZyBwcm9ncmVzczsgdGhlcmVmb3JlLCBpZiB0aGV5IGFyZSBkZWZpbmVkIHRvbyBmaW5lLWdyYWluZWQsIHRoZXkgd2lsbCBiZSBuZWdsZWN0ZWQsIGFuZCBpZiB0aGV5IGFyZSB0b28gbGFyZ2UsIHByb2dyZXNzIHdvdWxkIGhhdmUgdG8gYmUgZXhwcmVzc2VkIGluIHRlcm1zIG9mIGEgVGFzaydzIHBhcnRzIChlLmcuIFN0ZXBzLCB3aGljaCBpcyBub3QgcmVjb21tZW5kZWQpLiAKLUEgVGFzayBoYXMgYSBjbGVhciBwdXJwb3NlIGluIHdoaWNoIHRoZSBwZXJmb3JtaW5nIHJvbGVzIGFjaGlldmUgYSB3ZWxsIGRlZmluZWQgZ29hbC4gIEl0IHByb3ZpZGVzIGNvbXBsZXRlIHN0ZXAtYnktc3RlcCBleHBsYW5hdGlvbnMgb2YgZG9pbmcgYWxsIHRoZSB3b3JrIHRoYXQgbmVlZHMgdG8gYmUgZG9uZSB0byBhY2hpZXZlIHRoaXMgZ29hbC4gIFRoaXMgZGVzY3JpcHRpb24gaXMgY29tcGxldGUsIGluZGVwZW5kZW50IG9mIHdoZW4gaW4gYSBwcm9jZXNzIGxpZmVjeWNsZSB0aGUgd29yayB3b3VsZCBhY3R1YWxseSBiZSBkb25lLiAgSXQgdGhlcmVmb3JlIGRvZXMgbm90IGRlc2NyaWJlIHdoZW4geW91IGRvIHdoYXQgd29yayBhdCB3aGF0IHBvaW50IG9mIHRpbWUsIGJ1dCBkZXNjcmliZXMgYWxsIHRoZSB3b3JrIHRoYXQgZ2V0cyBkb25lIHRocm91Z2hvdXQgdGhlIGRldmVsb3BtZW50IGxpZmVjeWNsZSB0aGF0IGNvbnRyaWJ1dGVzIHRvIHRoZSBhY2hpZXZlbWVudCBvZiB0aGlzIGdvYWwuICBXaGVuIHRoZSBUYXNrIGlzIGJlaW5nIGFwcGxpZWQgaW4gYSBwcm9jZXNzIHRoZW4gdGhpcyBwcm9jZXNzIGFwcGxpY2F0aW9uIChkZWZpbmVkIGFzIFRhc2sgRGVzY3JpcHRvcikgcHJvdmlkZXMgdGhlIGluZm9ybWF0aW9uIG9mIHdoaWNoIHBpZWNlcyBvZiB0aGUgVGFzayB3aWxsIGFjdHVhbGx5IGJlIHBlcmZvcm1lZCBhdCBhbnkgcGFydGljdWxhciBwb2ludCBpbiB0aW1lLiBUaGlzIGFzc3VtZXMgdGhhdCB0aGUgVGFzayB3aWxsIGJlIHBlcmZvcm1lZCBpbiB0aGUgcHJvY2VzcyBvdmVyIGFuZCBvdmVyIGFnYWluLCBidXQgZWFjaCB0aW1lIHdpdGggYSBzbGlnaHRseSBkaWZmZXJlbnQgZW1waGFzaXMgb24gZGlmZmVyZW50IHN0ZXBzIG9yIGFzcGVjdHMgb2YgdGhlIHRhc2sgZGVzY3JpcHRpb24uIAotRm9yIGV4YW1wbGUsIGEgVGFzayBzdWNoIGFzICJEZXZlbG9wIFVzZSBDYXNlIE1vZGVsIiBkZXNjcmliZXMgYWxsIHRoZSB3b3JrIHRoYXQgbmVlZHMgdG8gYmUgZG9uZSB0byBkZXZlbG9wIGEgY29tcGxldGUgdXNlIGNhc2UgbW9kZWwuIFRoaXMgd291bGQgY29tcHJpc2Ugb2YgdGhlIGlkZW50aWZpY2F0aW9uIGFuZCBuYW1pbmcgb2YgdXNlIGNhc2VzIGFuZCBhY3RvcnMsIHRoZSB3cml0aW5nIG9mIGEgYnJpZWYgZGVzY3JpcHRpb24sIHRoZSBtb2RlbGluZyBvZiB1c2UgY2FzZXMgYW5kIHRoZWlyIHJlbGF0aW9uc2hpcHMgaW4gZGlhZ3JhbXMsIHRoZSBkZXRhaWxlZCBkZXNjcmlwdGlvbiBvZiBhIGJhc2ljIGZsb3csIHRoZSBkZXRhaWxlZCBkZXNjcmlwdGlvbiBvZiBhbHRlcm5hdGl2ZXMgZmxvd3MsIHBlcmZvcm1pbmcgb2Ygd2Fsa3Rocm91Z2hzIHdvcmtzaG9wcyBhbmQgcmV2aWV3cywgZXRjLiAgQWxsIG9mIHRoZXNlIHBhcnRzIGNvbnRyaWJ1dGUgdG8gdGhlIGRldmVsb3BtZW50IGdvYWwgb2YgZGV2ZWxvcGluZyB0aGUgdXNlIGNhc2UgbW9kZWwsIGJ1dCB0aGUgcGFydHMgd2lsbCBiZSBwZXJmb3JtZWQgYXQgZGlmZmVyZW50IHBvaW50cyBpbiB0aW1lIGluIGEgcHJvY2Vzcy4gIElkZW50aWZpY2F0aW9uLCBuYW1pbmcsIGFuZCBicmllZiBkZXNjcmlwdGlvbnMgd291bGQgYmUgcGVyZm9ybWVkIGVhcmx5IGluIGEgdHlwaWNhbCBkZXZlbG9wbWVudCBwcm9jZXNzIHZlcnN1cyB0aGUgd3JpdGluZyBvZiBkZXRhaWxlZCBhbHRlcm5hdGl2ZSBmbG93cyB3aGljaCB3b3VsZCBiZSBwZXJmb3JtZWQgbXVjaCBsYXRlci4gIEFsbCB0aGVzZSBwYXJ0cyBvciBzdGVwcyB3aXRoaW4gdGhlIHNhbWUgVGFzayBkZWZpbmUgdGhlICJtZXRob2QiIG9mIERldmVsb3BpbmcgYSBVc2UgQ2FzZSBNb2RlbC4gIEFwcGx5aW5nIHN1Y2ggYSBtZXRob2QgaW4gYSBsaWZlY3ljbGUgKGkuZS4gaW4gYSBwcm9jZXNzKSBpcyBkZWZpbmluZyB3aGljaCBzdGVwcyBhcmUgZG9uZSB3aGVuIGdvaW5nIGZyb20gb25lIGl0ZXJhdGlvbiB0byB0aGUgbmV4dC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkNvbnRlbnRFbGVtZW50Ij4KLQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUHJlY29uZGl0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlBvc3Rjb25kaXRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUGVyZm9ybWVkQnkiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotCQkJCQk8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJNYW5kYXRvcnlJbnB1dCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Ik91dHB1dCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iT3B0aW9uYWxJbnB1dCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkVzdGltYXRlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iVG9vbE1lbnRvciIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iV29ya0RlZmluaXRpb24iPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QW4gYWJzdHJhY3QgTWV0aG9kIEVsZW1lbnQgdGhhdCBnZW5lcmFsaXplcyBhbGwgZGVzY3JpcHRpb25zIG9mIHdvcmsgd2l0aGluIHRoZSBVbmlmaWVkIE1ldGhvZCBBcmNoaXRlY3R1cmUuICBUaGlzIHBhY2thZ2UgaW50cm9kdWNlcyB0d28gY29uY3JldGUgdHlwZXMgb2YgV29yayBEZWZpbml0aW9uczogVGFzayBhbmQgU3RlcC4gIFdvcmsgRGVmaW5pdGlvbnMgY2FuIGNvbnRhaW4gc2V0cyBvZiBwcmUtIGFuZCBwb3N0LWNvbmRpdGlvbnMgZGVmaW5pbmcgY29uc3RyYWludHMgdGhhdCBuZWVkIHRvIGJlIHZhbGlkIGJlZm9yZSB0aGUgZGVzY3JpYmVkIHdvcmsgY2FuIGJlZ2luIG9yIGJlZm9yZSBpdCBjYW4gYmUgZGVjbGFyZWQgYXMgZmluaXNoZWQuICBOb3RlIHRoYXQgZ2VuZXJhbCBvd25lZFJ1bGVzIGNhbiBiZSB1c2VkIHRvIGRlZmluZSBhZGRpdGlvbmFsIGNvbnN0cmFpbnRzIGFuZCBydWxlcyBmb3IgV29yayBEZWZpbml0aW9ucy4KLVdvcmsgRGVmaW5pdGlvbnMgcmVwcmVzZW50IGJlaGF2aW9yYWwgZGVzY3JpcHRpb25zIGZvciBkb2luZyB3b3JrLiAgVGhlc2UgYmVoYXZpb3JhbCBkZXNjcmlwdGlvbnMgYXJlIG5vdCBib3VuZCB0byBvbmUgc3BlY2lmaWMgY2xhc3NpZmllciwgYnV0IHJlcHJlc2VudCBhbiBhcmJpdHJhcnkgZGVmaW5pdGlvbiBvZiB3b3JrLiAgRm9yIGV4YW1wbGUsIGEgV29yayBEZWZpbml0aW9uIGNvdWxkIHJlcHJlc2VudCB3b3JrIHRoYXQgaXMgYmVpbmcgcGVyZm9ybWVkIGJ5IGEgc3BlY2lmaWMgUm9sZSAoZS5nLiBhIFJvbGUgcGVyZm9ybWluZyBhIHNwZWNpZmljIFRhc2sgb3IgU3RlcHMgb2YgYSBUYXNrKSwgYnkgbWFueSBSb2xlcyB3b3JraW5nIGluIGNsb3NlIGNvbGxhYm9yYXRpb24gKG1hbnkgUm9sZXMgYWxsIHdvcmtpbmcgdG9nZXRoZXIgb24gdGhlIHNhbWUgaW50ZXJkaXNjaXBsaW5hcnkgVGFzayksIG9yIGNvbXBsZXggd29yayB0aGF0IGlzIHBlcmZvcm1lZCB0aHJvdWdob3V0IHRoZSBsaWZlY3ljbGUgKGUuZy4gYSBwcm9jZXNzIGRlZmluaW5nIGEgYnJlYWtkb3duIHN0cnVjdHVyZSBmb3Igb3JnYW5pemluZyBsYXJnZXIgY29tcG9zaXRlIHVuaXRzIG9mIHdvcmsgcGVyZm9ybWVkIGJ5IG1hbnkgUm9sZXMgd29ya2luZyBpbiBjb2xsYWJvcmF0aW9uKS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOk1ldGhvZEVsZW1lbnQiPgotCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJQcmVjb25kaXRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUG9zdGNvbmRpdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iQ29udGVudENhdGVnb3J5Ij4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkFuIGFic3RyYWN0IGNsYXNzIGdlbmVyYWxpemluZyBjb250ZW50IGNhdGVnb3J5IHR5cGVzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6Q29udGVudEVsZW1lbnQiLz4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJEaXNjaXBsaW5lIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgY2F0ZWdvcml6YXRpb24gb2Ygd29yayAoaS5lLiBUYXNrcyBmb3IgTWV0aG9kIENvbnRlbnQpLCBiYXNlZCB1cG9uIHNpbWlsYXJpdHkgb2YgY29uY2VybnMgYW5kIGNvb3BlcmF0aW9uIG9mIHdvcmsgZWZmb3J0LgotQSBkaXNjaXBsaW5lIGlzIGEgY29sbGVjdGlvbiBvZiBUYXNrcyB0aGF0IGFyZSByZWxhdGVkIHRvIGEgbWFqb3IgJ2FyZWEgb2YgY29uY2Vybicgd2l0aGluIHRoZSBvdmVyYWxsIHByb2plY3QuIFRoZSBncm91cGluZyBvZiBUYXNrcyBpbnRvIGRpc2NpcGxpbmVzIGlzIG1haW5seSBhbiBhaWQgdG8gdW5kZXJzdGFuZGluZyB0aGUgcHJvamVjdCBmcm9tIGEgJ3RyYWRpdGlvbmFsJyB3YXRlcmZhbGwgcGVyc3BlY3RpdmUuIEhvd2V2ZXIsIHR5cGljYWxseSwgZm9yIGV4YW1wbGUsIGl0IGlzIG1vcmUgY29tbW9uIHRvIHBlcmZvcm0gY2VydGFpbiByZXF1aXJlbWVudHMgYWN0aXZpdGllcyBpbiBjbG9zZSBjb29yZGluYXRpb24gd2l0aCBhbmFseXNpcyBhbmQgZGVzaWduIGFjdGl2aXRpZXMuIFNlcGFyYXRpbmcgdGhlc2UgYWN0aXZpdGllcyBpbnRvIHNlcGFyYXRlIGRpc2NpcGxpbmVzIG1ha2VzIHRoZSBhY3Rpdml0aWVzIGVhc2llciB0byBjb21wcmVoZW5kLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6Q29udGVudENhdGVnb3J5Ij4KLQkJCQk8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlRhc2siIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlN1YkRpc2NpcGxpbmUiIHR5cGU9InVtYTpEaXNjaXBsaW5lIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJSZWZlcmVuY2VXb3JrZmxvdyIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCTwveHNkOmNob2ljZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJEaXNjaXBsaW5lR3JvdXBpbmciPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+VXNlZCB0byBncm91cCBEaXNjaXBsaW5lcy4gIEZvciBleGFtcGxlLCB0aGUgRGlzY2lwbGluZSBHcm91cGluZyAiU29mdHdhcmUgRGlzY2lwbGluZXMiIHdvdWxkIGJlIHRoZSBncm91cCBvZiBhbGwgZGlzY2lwbGluZXMgcmVsYXRlZCB0byBkZXZlbG9waW5nIHNvZnR3YXJlIHN1Y2ggYXMgIlJlcXVpcmVtZW50cyBNYW5hZ2VtZW50IiBvciAiVGVzdGluZyI7ICJJVCBJbmZyYXN0cnVjdHVyZSBNYW5hZ2VtZW50IiB3b3VsZCBiZSBhIERpc2NpcGxpbmVzIEdyb3VwaW5nIGZvciBkaXNjaXBsaW5lcyBzdWNoIGFzICJJVCBPcGVyYXRpb25hbCBTZXJ2aWNlcyIsICJJVCBDdXN0b21lciBSZWxhdGlvbnNoaXBzIiwgb3IgIklUIEVuYWJsaW5nIFNlcnZpY2VzIi4gIERpc2NpcGxpbmVzIGNhbiBiZSBhc3NvY2lhdGVkIHRvIG1vcmUgdGhhbiBvbmUgRGlzY2lwbGluZSBHcm91cGluZy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkNvbnRlbnRDYXRlZ29yeSI+Ci0JCQkJPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJEaXNjaXBsaW5lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJPC94c2Q6Y2hvaWNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkRvbWFpbiI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHJlZmluZWFibGUgaGllcmFyY2h5IGdyb3VwaW5nIHJlbGF0ZWQgd29yayBwcm9kdWN0cy4gIEluIG90aGVyIHdvcmRzLCBEb21haW5zIGNhbiBiZSBmdXJ0aGVyIGRpdmlkZWQgaW50byBzdWItZG9tYWlucywgd2l0aCB3b3JrIHByb2R1Y3QgZWxlbWVudHMgdG8gYmUgY2F0ZWdvcml6ZWQgb25seSBhdCB0aGUgbGVhZi1sZXZlbCBvZiB0aGlzIGhpZXJhcmNoeS4KLURvbWFpbiBpcyBhIGxvZ2ljYWwgZ3JvdXBpbmcgb2Ygd29yayBwcm9kdWN0cyB0aGF0IGhhdmUgYW4gYWZmaW5pdHkgdG8gZWFjaCBvdGhlciBiYXNlZCBvbiByZXNvdXJjZXMsIHRpbWluZywgb3IgcmVsYXRpb25zaGlwLiAgQSBEb21haW4gbWF5IGJlIGRpdmlkZWQgaW50byBzdWJkb21haW5zLiAgRm9yIGV4YW1wbGUsIEdTIE1ldGhvZCB1c2VzIHNpeCBwcmVkZWZpbmVkIERvbWFpbnMgZm9yIFdvcmsgUHJvZHVjdHM6IEFwcGxpY2F0aW9uLCBBcmNoaXRlY3R1cmUsIEJ1c2luZXNzLCBFbmdhZ2VtZW50LCBPcGVyYXRpb25zIGFuZCBPcmdhbml6YXRpb24uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpDb250ZW50Q2F0ZWdvcnkiPgotCQkJCTx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iV29ya1Byb2R1Y3QiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlN1YmRvbWFpbiIgdHlwZT0idW1hOkRvbWFpbiIvPgotCQkJCTwveHNkOmNob2ljZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJSb2xlU2V0Ij4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPk9yZ2FuaXplcyBSb2xlcyBpbnRvIGNhdGVnb3JpZXMuICBJdCBpcyB1c2VkIHRvIGdyb3VwIHJvbGVzIHRvZ2V0aGVyIHRoYXQgaGF2ZSBjZXJ0YWluIGNvbW1vbmFsaXRpZXMuICBGb3IgZXhhbXBsZSwgdGhlICJBbmFseXN0cyIgUm9sZSBTZXQgY291bGQgZ3JvdXAgdGhlICJCdXNpbmVzcyBQcm9jZXNzIEFuYWx5c3QiLCAiU3lzdGVtIEFuYWx5c3QiLCBhcyB3ZWxsIGFzICJSZXF1aXJlbWVudHMgU3BlY2lmaWVyIiByb2xlcy4gIEFsbCBvZiB0aGVzZSB3b3JrIHdpdGggc2ltaWxhciB0ZWNobmlxdWVzIGFuZCBoYXZlIG92ZXJsYXBwaW5nIHNraWxscywgYnV0IGFyZSByZXF1aXJlZCBhcyBkaXN0aW5jdCByb2xlcyBmb3IgYSBtZXRob2QgKGUuZy4gdGhlIG1ldGhvZCB0aGUgSUJNIFJhdGlvbmFsIFVuaWZpZWQgUHJvY2VzcyBpcyBiYXNlZCBvbikuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpDb250ZW50Q2F0ZWdvcnkiPgotCQkJCTx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUm9sZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCTwveHNkOmNob2ljZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJSb2xlU2V0R3JvdXBpbmciPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+Um9sZSBTZXRzIGNhbiBiZSBjYXRlZ29yaXplZCBpbnRvIFJvbGUgU2V0IEdyb3VwaW5ncy4gIEZvciBleGFtcGxlLCBkaWZmZXJlbnQgbWV0aG9kcyBtaWdodCBkZWZpbmUgc2ltaWxhciBSb2xlIFNldHMsIHdoaWNoIGhvd2V2ZXIgbmVlZCB0byBiZSBkaXN0aW5ndWlzaGVkIGZyb20gZWFjaCBvdGhlciBvbiBhIGdsb2JhbCBzY2FsZS4gIFRodXMsIFJvbGUgU2V0IEdyb3VwaW5ncyBhbGxvdyBkaXN0aW5ndWlzaGluZywgZm9yIGV4YW1wbGUsIFNvZnR3YXJlIFNlcnZpY2VzIE1hbmFnZXIgUm9sZSBTZXRzIGZyb20gU29mdHdhcmUgRGV2ZWxvcG1lbnQgT3JnYW5pemF0aW9uIE1hbmFnZXIgUm9sZSBTZXRzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6Q29udGVudENhdGVnb3J5Ij4KLQkJCQk8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlJvbGVTZXQiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iVG9vbCI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIGNvbnRhaW5lci9hZ2dyZWdhdGUgZm9yIFRvb2xNZW50b3JzLiAgSXQgY2FuIGFsc28gcHJvdmlkZSBnZW5lcmFsIGRlc2NyaXB0aW9ucyBvZiB0aGUgdG9vbCBhbmQgaXRzIGdlbmVyYWwgY2FwYWJpbGl0aWVzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6Q29udGVudENhdGVnb3J5Ij4KLQkJCQk8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlRvb2xNZW50b3IiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iV29ya1Byb2R1Y3RUeXBlIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc2Vjb25kIGNhdGVnb3J5IGZvciB3b3JrIHByb2R1Y3RzLCB3aGljaCBpbiBjb250cmFzdCB0byBEb21haW4gaXMgbW9yZSBwcmVzZW50YXRpb24gb3JpZW50ZWQuICBBIHdvcmsgcHJvZHVjdCBjYW4gaGF2ZSBtYW55IFdvcmsgUHJvZHVjdCBUeXBlcy4gIEV4YW1wbGVzLCBmb3IgYSBXb3JrIFByb2R1Y3QgVHlwZSBpcyAiQ2xhc3MgRGlhZ3JhbSIsIHdoaWNoIGNhdGVnb3JpemVzIHRoZSBBcnRpZmFjdHMgQW5hbHlzaXMgTW9kZWwsIERlc2lnbiBNb2RlbCwgVXNlciBFeHBlcmllbmNlIE1vZGVsLCBvciAiU3BlY2lmaWNhdGlvbiIsIHdoaWNoIGNhdGVnb3JpemVzIHJlcXVpcmVtZW50cyBzcGVjaWZpY2F0aW9ucyB0aGF0IGRlZmluZSBhIHN5c3RlbSB3aXRoIGEgd2VsbC1kZWZpbmVkIHN5c3RlbSBib3VuZGFyeSwgc3VjaCBhcyB1c2UgY2FzZSBvciBmdW5jdGlvbmFsIHJlcXVpcmVtZW50cyBzcGVjaWZpY2F0aW9uLiAgQSBXb3JrIFByb2R1Y3QgY2FuIGJlIGNhdGVnb3JpemVkIHRvIGJlIG9mIG1hbnkgV29yayBQcm9kdWN0IFR5cGVzLiAgRm9yIGV4YW1wbGUsIGEgdXNlIGNhc2UgbW9kZWwgY2FuIGJlIGNhdGVnb3JpemVkIGFzIGEgU3BlY2lmaWNhdGlvbiBhcyB3ZWxsIGFzIERpYWdyYW0gV29yayBQcm9kdWN0IFR5cGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpDb250ZW50Q2F0ZWdvcnkiPgotCQkJCTx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iV29ya1Byb2R1Y3QiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iQ3VzdG9tQ2F0ZWdvcnkiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBjYXRlZ29yeSBpbnRyb2R1Y2VkIGJ5IGEgbWV0aG9kIGNvbnRlbnQgYXV0aG9yIHRvIHN0cnVjdHVyZSBhbnkgbnVtYmVyIG9mIG1ldGhvZCBDb250ZW50IEVsZW1lbnRzIG9mIGFueSBzdWJ0eXBlIGJhc2VkIG9uIHVzZXItZGVmaW5lZCBjcml0ZXJpYS4gIEJlY2F1c2UgQ29udGVudCBDYXRlZ29yaWVzIChhbmQgdGhlcmVmb3JlIEN1c3RvbSBDYXRlZ29yaWVzLCB0b28pIGFyZSBDb250ZW50IEVsZW1lbnRzIHRoZW1zZWx2ZXMsIEN1c3RvbSBDYXRlZ29yaWVzIGNhbiBiZSB1c2VkIHRvIHJlY3Vyc2l2ZWx5IGNhdGVnb3JpemUgQ29udGVudCBDYXRlZ29yaWVzIGFzIHdlbGwuICBDdXN0b20gQ2F0ZWdvcmllcyBjYW4gYWxzbyBiZSBuZXN0ZWQgd2l0aCBhbnkgQ29udGVudCBDYXRlZ29yeS4gIEN1c3RvbSBjYXRlZ29yaWVzIGNhbiBiZSB1c2VkIHRvIGNhdGVnb3JpemUgY29udGVudCBiYXNlZCBvbiB0aGUgdXNlcidzIGNyaXRlcmlhIGFzIHdlbGwgYXMgdG8gZGVmaW5lIHdob2xlIHRyZWUtc3RydWN0dXJlcyBvZiBuZXN0ZWQgY2F0ZWdvcmllcyBhbGxvd2luZyB0aGUgdXNlciB0byBzeXN0ZW1hdGljYWxseSBuYXZpZ2F0ZSBhbmQgYnJvd3NlIG1ldGhvZCBjb250ZW50IGFuZCBwcm9jZXNzZXMgYmFzZWQgb24gdGhlc2UgY2F0ZWdvcmllcy4gIEZvciBleGFtcGxlLCBvbmUgY291bGQgY3JlYXRlIGEgY3VzdG9tIGNhdGVnb3J5IHRvIGxvZ2ljYWxseSBvcmdhbml6ZSBjb250ZW50IHJlbGV2YW50IGZvciB0aGUgdXNlcidzIGRldmVsb3BtZW50IG9yZ2FuaXphdGlvbiBkZXBhcnRtZW50czsgZS5nLiBhICJUZXN0aW5nIiBjYXRlZ29yeSB0aGF0IGdyb3VwcyB0b2dldGhlciBhbGwgcm9sZXMsIHdvcmsgcHJvZHVjdHMsIHRhc2tzLCBhbmQgZ3VpZGFuY2UgZWxlbWVudCByZWxldmFudCB0byB0ZXN0aW5nLiAgQW5vdGhlciBleGFtcGxlIHdvdWxkIGJlIGNhdGVnb3JpZXMgdGhhdCBleHByZXNzIGxpY2Vuc2luZyBsZXZlbHMgb2YgdGhlIGNvbnRlbnQgZ3JvdXBpbmcgZnJlZWx5IGRpc3RyaWJ1dGFibGUgbWV0aG9kIGNvbnRlbnQgdmVyc3VzIGNvbnRlbnQgdGhhdCByZXByZXNlbnQgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGFuZCByZXF1aXJlcyBhIGxpY2Vuc2UgdG8gYmUgcHVyY2hhc2VkIHRvIGJlIGFibGUgdG8gdXNlIGl0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6Q29udGVudENhdGVnb3J5Ij4KLQkJCQk8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkNhdGVnb3JpemVkRWxlbWVudCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iU3ViQ2F0ZWdvcnkiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iTWV0aG9kUGFja2FnZSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BbiBhYnN0cmFjdCBjbGFzcyBmb3IgcGFja2FnaW5nIE1ldGhvZCBFbGVtZW50cy4gIEFsbCBNZXRob2QgRWxlbWVudHMgc2hhbGwgYmUgbG9jYXRlZCBpbiBleGFjdGx5IG9uZSBvZiBNZXRob2QgUGFja2FnZSdzIGNvbmNyZXRlIHNwZWNpYWxpemF0aW9ucyAoZS5nLiBDb250ZW50IFBhY2thZ2UpLiAgIE1ldGhvZCBQYWNrYWdlIGRlZmluZXMgY29tbW9uIHByb3BlcnRpZXMgZm9yIGFsbCBvZiBpdHMgc3BlY2lhbGl6YXRpb25zLiBFbGVtZW50cyBhcmUgb3JnYW5pemVkIGluIE1ldGhvZCBQYWNrYWdlcyB0byBzdHJ1Y3R1cmUgbGFyZ2Ugc2NhbGUgb2YgbWV0aG9kIGNvbnRlbnQgYW5kIHByb2Nlc3NlcyBhcyB3ZWxsIGFzIHRvIGRlZmluZSBhIG1lY2hhbmlzbSBmb3IgcmV1c2UuICBNZXRob2QgRWxlbWVudHMgZnJvbSBvbmUgcGFja2FnZSBjYW4gcmV1c2UgZWxlbWVudCBmcm9tIG90aGVyIHBhY2thZ2VzIGJ5IGRlZmluaW5nIGEgcmV1c2VkUGFja2FnZXMgbGluay4gIEZvciBleGFtcGxlLCBhIHdvcmsgcHJvZHVjdCBkZWZpbmVkIGluIG9uZSBwYWNrYWdlIGNhbiBiZSB1c2VkIGFzIGFuIGlucHV0IGZvciBUYXNrcyBkZWZpbmVkIGluIG90aGVyIHBhY2thZ2VzLiAgQnkgcmV1c2luZyBpdCBmcm9tIG9uZSBjb21tb24gcGxhY2UgKGkuZS4gdGhlIHBhY2thZ2UgaW4gd2hpY2ggaXQgaGFzIGJlZW4gZGVmaW5lZCkgZW5zdXJlcyB0aGF0IG5vIHJlZHVuZGFudCBkZWZpbml0aW9ucyBvZiB0aGUgc2FtZSBlbGVtZW50cyBhcmUgcmVxdWlyZWQuICBBbHNvIG1haW50ZW5hbmNlIG9mIG1ldGhvZCBjb250ZW50IGlzIGdyZWF0bHkgaW1wcm92ZWQgYXMgY2hhbmdlcyBjYW4gYmUgcGVyZm9ybWVkIGluIG9ubHkgb25lIHBsYWNlLiAgTm90ZSwgdGhhdCBvdGhlciBwYWNrYWdlcyB3aWxsIGludHJvZHVjZSBtb3JlIHNwZWNpYWxpemF0aW9ucyBvZiBNZXRob2QgUGFja2FnZSwgZS5nLiBQcm9jZXNzIFBhY2thZ2UgYW5kIFByb2Nlc3MgQ29tcG9uZW50LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6TWV0aG9kRWxlbWVudCI+Ci0JCQkJPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJSZXVzZWRQYWNrYWdlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJNZXRob2RQYWNrYWdlIiB0eXBlPSJ1bWE6TWV0aG9kUGFja2FnZSIvPgotCQkJCTwveHNkOmNob2ljZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJnbG9iYWwiIHR5cGU9InhzZDpib29sZWFuIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPk1ldGhvZCBQYWNrYWdlcyBjYW4gaGF2ZSBhIGdsb2JhbCBzY29wZS4gIFRoaXMgbWVhbnMgdGhhdCBldmVyeSBlbGVtZW50IG9mIGV2ZXJ5IG90aGVyIE1ldGhvZCBQYWNrYWdlIGNhbiBzZWUgdGhlIGdsb2JhbCBwYWNrYWdlJ3MgY29udGVudHMuICBHbG9iYWwgTWV0aG9kIFBhY2thZ2VzIGFyZSBwcmltYXJpbHkgdXNlZCB0byBzdG9yZSBjb21tb25seSB1c2VkIGNhdGVnb3J5IGRlZmluaXRpb25zIHN1Y2ggYXMgZm9yIERpc2NpcGxpbmVzIG9yIERvbWFpbnMsIHdoaWNoIGFyZSB1c2VkIGJ5IG1hbnkgVGFzayBhbmQgV29yayBQcm9kdWN0cyByZXNwZWN0aXZlbHkuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iQ29udGVudFBhY2thZ2UiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWFsIE1ldGhvZCBQYWNrYWdlIHRoYXQgY29udGFpbnMgQ29udGVudCBFbGVtZW50cyBhbmQgQ29udGVudCBFbGVtZW50cywgb25seS4gIEV4YW1wbGVzIGZvciBDb250ZW50IEVsZW1lbnQgYXJlIEFydGlmYWN0cywgVGFza3MsIFJvbGVzLCBldGMuICBBIGtleSBzZXBhcmF0aW9uIG9mIGNvbmNlcm5zIGluIFVNQSBpcyB0aGUgZGlzdGluY3Rpb24gYmV0d2VlbiBNZXRob2QgQ29udGVudCBhbmQgUHJvY2Vzcy4gIFRoaXMgc2VwYXJhdGlvbiBpcyBlbmZvcmNlZCBieSBzcGVjaWFsIHBhY2thZ2UgdHlwZXMsIHdoaWNoIGRvIG5vdCBhbGxvdyB0aGUgbWl4aW5nIG9mIG1ldGhvZCBjb250ZW50IHdpdGggcHJvY2Vzc2VzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6TWV0aG9kUGFja2FnZSI+Ci0JCQkJPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJDb250ZW50RWxlbWVudCIgdHlwZT0idW1hOkNvbnRlbnRFbGVtZW50Ii8+Ci0JCQkJPC94c2Q6Y2hvaWNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkNvbnRlbnRDYXRlZ29yeVBhY2thZ2UiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWFsIE1ldGhvZCBQYWNrYWdlIHRoYXQgb25seSBjb250YWlucyBDb250ZW50IENhdGVnb3J5IEVsZW1lbnRzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6TWV0aG9kUGFja2FnZSI+Ci0JCQkJPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJDb250ZW50Q2F0ZWdvcnkiIHR5cGU9InVtYTpDb250ZW50Q2F0ZWdvcnkiLz4KLQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUHJvY2Vzc0VsZW1lbnQiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBEZXNjcmliYWJsZSBFbGVtZW50IHRoYXQgcmVwcmVzZW50cyBhbiBhYnN0cmFjdCBnZW5lcmFsaXphdGlvbiBmb3IgYWxsIGVsZW1lbnRzIGRlZmluZWQgaW4gdGhlIFByb2Nlc3MgcGFja2FnZS4KLVByb2Nlc3MgRWxlbWVudHMgcmVwcmVzZW50cyBQcm9jZXNzIHNwZWNpZmljIGVsZW1lbnRzIHRoYXQgYXJlIHN1cHBvc2VkIHRvIGJlIG1hbmFnZWQgaW4gUHJvY2VzcyBQYWNrYWdlcy4gIFRoZSBzZXBhcmF0aW9uIG9mIFByb2Nlc3MgRWxlbWVudCBmcm9tIENvbnRlbnQgRWxlbWVudCBhbGxvd3MgdG8gY2xlYXJseSBkaXN0aW5ndWlzaCBiZXR3ZWVuIHB1cmUgbWV0aG9kIGNvbnRlbnQgZnJvbSBjb250ZW50IHRoYXQgaXMgcmVwcmVzZW50ZWQgaW4gcHJvY2Vzc2VzLiA8L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkRlc2NyaWJhYmxlRWxlbWVudCIvPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlBsYW5uaW5nRGF0YSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIFByb2Nlc3MgRWxlbWVudCB0aGF0IGFkZHMgcGxhbm5pbmcgZGF0YSB0byBCcmVha2Rvd24gRWxlbWVudHMgd2hlbiBpdCBpcyB1c2VkIGZvciBhIFByb2Nlc3MgUGxhbm5pbmcgVGVtcGxhdGUuICBGb3IgRGVsaXZlcnkgUHJvY2Vzc2VzIGFuZCBDYXBhYmlsaXR5IFBhdHRlcm5zIHRoaXMgY2xhc3MgY2FuIGVpdGhlciBub3QgYmUgaW5zdGFudGlhdGVkIG9yIHBvcHVsYXRlZCB3aXRoIGRlZmF1bHQgZGF0YS4KLVBsYW5uaW5nIERhdGEgZmFjdG9ycyBvdXQgc3BlY2lmaWMgb3B0aW9uYWwgZGF0YSBuZWVkZWQgZm9yIHJlcHJlc2VudGluZyBwbGFubmluZyB0ZW1wbGF0ZXMuICBUaGlzIGFzc29jaWF0aW9uIGFsbG93cyB0byBhY2Nlc3MgcGxhbm5pbmcgZGF0YSBpZiBpdCBpcyBzdG9yZWQgZm9yIHRoZSBCcmVha2Rvd24gRWxlbWVudC4KLShOT1RFLCBUSEUgQVRUUklCVVRFUyBGT1IgVEhJUyBDTEFTUyBBUkUgTk9UIENPTVBMRVRFLCBZRVQpPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpQcm9jZXNzRWxlbWVudCI+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0ic3RhcnREYXRlIiB0eXBlPSJ4c2Q6ZGF0ZVRpbWUiPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+VGhlIGRlZmF1bHQgc3RhcnQgZGF0ZSBmb3IgYSBwbGFuZWQgVGFzay48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJmaW5pc2hEYXRlIiB0eXBlPSJ4c2Q6ZGF0ZVRpbWUiPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+VGhlIGRlZmF1bHQgZmluaXNoIGRhdGUgZm9yIGEgcGxhbmVkIFRhc2suPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0icmFuayIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZGVmYXVsdCByYW5rIGZvciBhIHBsYW5lZCBUYXNrLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkJyZWFrZG93bkVsZW1lbnQiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QW4gYWJzdHJhY3QgZ2VuZXJhbGl6YXRpb24gZm9yIGFueSB0eXBlIG9mIE1ldGhvZCBFbGVtZW50IHRoYXQgaXMgcGFydCBvZiBhIGJyZWFrZG93biBzdHJ1Y3R1cmUuICBJdCBkZWZpbmVzIGEgc2V0IG9mIHByb3BlcnRpZXMgYXZhaWxhYmxlIHRvIGFsbCBvZiBpdHMgc3BlY2lhbGl6YXRpb25zLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6UHJvY2Vzc0VsZW1lbnQiPgotCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJQcmVzZW50ZWRBZnRlciIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJQcmVzZW50ZWRCZWZvcmUiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUGxhbm5pbmdEYXRhIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlN1cGVyQWN0aXZpdHkiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9InByZWZpeCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5QcmVmaXggcmVwcmVzZW50cyBhbiBhZGRpdGlvbmFsIGxhYmVsIHRoYXQgd2lsbCBiZSBwcmVzZW50ZWQgYXMgYSBwcmVmaXggdG8gYW55IEJyZWFrZG93biBFbGVtZW50IHRvIGluZGljYXRlIGEgdXNlci1kZWZpbmVkIHN1Yi10eXBlIGZvciB0aGUgZWxlbWVudC4gIEZvciBleGFtcGxlLCBpZiB0aGUgcHJvY2VzcyBlbmdpbmVlciB3b3VsZCBsaWtlIHRvIGRpc3Rpbmd1aXNoIGhpcyBBY3Rpdml0aWVzIGJ5ICdNb2R1bGUnIChhcyBkb25lIGluIHRoZSBJQk0gUmF0aW9uYWwgU3VtbWl0IEFzY2VuZGFudCBNZXRob2QpLCBoZSBjYW4gZGVmaW5lIGEgZGlmZmVyZW50IHByZWZpeCBmb3IgZXZlcnkgbW9kZWwgdG8gYmUgdXNlZCBpbiBhZGRpdGlvbiB0byBuYW1pbmcgQWN0aXZpdGllcywgZS5nLiAiU1JBLkVzdGFibGlzaCBSZXF1aXJlbWVudHMiIHdpdGggU1JBIGluZGljYXRpbmcgdGhhdCB0aGlzIEFjdGl2aXR5IGJlbG9uZ3MgdG8gdGhlICJTb2Z0d2FyZSBSZXF1aXJlbWVudHMgQW5hbHlzaXMiIG1vZHVsZS4gIEFub3RoZXIgY29tbW9uIGFwcGxpY2F0aW9uIGZvciBwcmVmaXggaXMgdG8gcXVhbGlmeSByb2xlcyBpbiBSb2xlIERlc2NyaXB0b3JzLiAgRm9yIGV4YW1wbGUsICJDdXN0b21lci5BcmNoaXRlY3QiIHdvdWxkIGRlZmluZSBhICJDdXN0b21lciIgcHJlZml4IGZvciB0aGUgUm9sZSBEZXNjcmlwdG9yICJBcmNoaXRlY3QiIGV4cHJlc3NpbmcgdGhhdCB0aGlzIGlzIGFuIGFyY2hpdGVjdCBvbiB0aGUgY3VzdG9tZXIgc2lkZSBhbmQgbm90IHRoZSBkZXZlbG9wbWVudCB0ZWFtIHNpZGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0iaXNQbGFubmVkIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIGtleSBhcHBsaWNhdGlvbiBmb3IgRGV2ZWxvcG1lbnQgUHJvY2Vzc2VzIGV4cHJlc3NlZCB3aXRoIEJyZWFrZG93biBzdHJ1Y3R1cmVzIGlzIHRvIGdlbmVyYXRlIGEgcHJvamVjdCBwbGFuIGZyb20gaXQuICBBIHByb2Nlc3MgYXMgZGVmaW5lZCBpbiBVTUEgKGNmLiB3aXRoIFNlY3Rpb25zIFhYIGFuZCA1LjIpIGlzIGEgbXVsdGktZGltZW5zaW9uYWwgc3RydWN0dXJlIGRlZmluaW5nIHdoYXQgd29yayBpcyBiZWluZyBwZXJmb3JtZWQgYXQgd2hhdCB0aW1lIGJ5IHdoaWNoIHJvbGVzIHVzaW5nIHdoaWNoIGlucHV0IGFuZCBwcm9kdWNpbmcgd2hhdCBvdXRwdXRzLiAgQSBwcm9qZWN0IHBsYW4gYXMgaXQgaXMgcmVwcmVzZW50ZWQgaW4gcHJvamVjdCBwbGFubmluZyB0b29scyBzdWNoIGFzIElCTSBSYXRpb25hbCBQb3J0Zm9saW8gTWFuYWdlciBvciBNaWNyb3NvZnQgUHJvamVjdCBub3JtYWxseSBkb2VzIG5vdCBuZWVkIGFsbCB0aGlzIGluZm9ybWF0aW9uIGFuZCBpcyBub3JtYWxseSBsaW1pdGVkIHRvIGp1c3QgcmVwcmVzZW50aW5nIGEgc3Vic2V0LiAgRm9yIGV4YW1wbGUsIGEgdHlwaWNhbCBNUyBQcm9qZWN0IHBsYW4gb25seSByZXByZXNlbnRzIHRoZSB3b3JrIGJyZWFrZG93biBjb25zaXN0aW5nIG9mIFRhc2tzIGFuZCBBY3Rpdml0aWVzIChzb21ldGltZXMgcmVmZXJyZWQgdG8gYXMgc3VtbWFyeSB0YXNrcykuICBJdCBkb2VzIG5vdCBzaG93IHRoZSBpbnB1dCBhbmQgb3V0cHV0IFdvcmsgUHJvZHVjdHMgZm9yIGEgVGFzaywgYnV0IGl0IGNhbiBzaG93IHdoaWNoIHJvbGVzIHNoYWxsIGJlIHN0YWZmZWQgZm9yIHBlcmZvcm1pbmcgdGhlIFRhc2suICBIb3dldmVyLCBzdWNoIHJvbGUgYWxsb2NhdGlvbiBuZWVkIHRvIGJlIHJlcGxhY2VkIHdpdGggY29uY3JldGUgcmVzb3VyY2VzIHdoZW4gaW5zdGFudGlhdGluZyB0aGUgcGxhbiBmb3IgYSBjb25jcmV0ZSBwcm9qZWN0LiAgU29tZXRpbWVzIHByb2plY3QgcGxhbnMgY2FuIHRoZW4gYWdhaW4gYmUgb3JnYW5pemVkIGRpZmZlcmVudGx5IGJ5IG9yZ2FuaXppbmcgd29yayBieSBkZWxpdmVyYWJsZXMgaW4gd2hpY2ggV29yayBQcm9kdWN0cyBhcmUgbWFwcGVkIHRvIHRoZSBwbGFuJ3Mgc3VtbWFyeSB0YXNrcyBhbmQgVGFzayB0aGF0IGhhdmUgdGhlc2Ugd29yayBwcm9kdWN0cyBhcyBvdXRwdXQgbWFwcGVkIGJlbG93IHN1Y2ggYXMgc3VtbWFyeSB0YXNrLiAgVGhlcmVmb3JlLCBhIHByb2Nlc3MgY2FuIG1ha2UgcmVjb21tZW5kYXRpb25zIGFib3V0IHdoaWNoIGVsZW1lbnRzIHRvIGluY2x1ZGUgYW5kIHdoaWNoIHRvIGV4Y2x1ZGUgd2hlbiBnZW5lcmF0aW5nIGEgcGxhbi4gIFdoZW4gdGhlIGlzUGxhbm5lZCBhdHRyaWJ1dGUgaXMgc2V0IHRvIEZhbHNlIGZvciBhbiBpbnN0YW5jZSBvZiBhIEJyZWFrZG93biBFbGVtZW50LCB0aGVuIHRoaXMgZWxlbWVudCBzaGFsbCBub3QgYmUgbm90IGluY2x1ZGVkIHdoZW4gYSBjb25jcmV0ZSBwcm9qZWN0IHBsYW4gaXMgYmVpbmcgZ2VuZXJhdGVkIGZyb20gdGhlIGJyZWFrZG93biBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucyB0aGlzIGVsZW1lbnQuCi08L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJoYXNNdWx0aXBsZU9jY3VycmVuY2VzIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5KdXN0IGFzIHRoZSBpc1BsYW5uZWQgYXR0cmlidXRlIHRoZSBoYXNNdWx0aXBsZU9jY3VycmVuY2VzIGF0dHJpYnV0ZSBoYXMgYW4gaW1wYWN0IG9uIGdlbmVyYXRpbmcgcGxhbnMgZnJvbSBhIFByb2Nlc3MuICBXaGVuIHRoaXMgYXR0cmlidXRlIGlzIHNldCB0byBUcnVlIGZvciBhIEJyZWFrZG93biBFbGVtZW50IHRoZW4gaXQgd2lsbCB0eXBpY2FsbHkgb2NjdXIgbXVsdGlwbGUgdGltZXMgd2l0aGluIHRoZSBzYW1lIEFjdGl2aXR5LiAgRm9yIGV4YW1wbGUsIGEgVGFzayBzdWNoIGFzICJEZXRhaWwgVXNlIENhc2UiIHdvdWxkIGJlIHBlcmZvcm1lZCBmb3IgZXZlcnkgdXNlIGNhc2UgaWRlbnRpZmllZCBmb3IgYSBwYXJ0aWN1bGFyIEl0ZXJhdGlvbiBvciBBY3Rpdml0eS4gIEdlbmVyYXRpbmcgYSBwbGFuIHdvdWxkIGxpc3Qgb25lIFRhc2sgaW5zdGFuY2UgcGVyIHVzZSBjYXNlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImlzT3B0aW9uYWwiIHR5cGU9InhzZDpib29sZWFuIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkluZGljYXRlcyB0aGF0IHRoZSBCcmVha2Rvd24gRWxlbWVudCBkZXNjcmliZXMgd29yaywgYSB3b3JrIHJlc3VsdCwgb3IgZXZlbiB3b3JrIHJlc291cmNlcywgd2hpY2ggaW5jbHVzaW9uIGlzIG5vdCBtYW5kYXRvcnkgd2hlbiBwZXJmb3JtaW5nIGEgcHJvamVjdCB0aGF0IGlzIHBsYW5uZWQgYmFzZWQgb24gYSBwcm9jZXNzIGNvbnRhaW5pbmcgdGhpcyBlbGVtZW50LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IldvcmtPcmRlciI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5SZXByZXNlbnRzIGEgcmVsYXRpb25zaGlwIGJldHdlZW4gdHdvIEJyZWFrZG93biBFbGVtZW50cyBpbiB3aGljaCBvbmUgQnJlYWtkb3duIEVsZW1lbnRzIGRlcGVuZHMgb24gdGhlIHN0YXJ0IG9yIGZpbmlzaCBvZiBhbm90aGVyIEJyZWFrZG93biBFbGVtZW50cyBpbiBvcmRlciB0byBiZWdpbiBvciBlbmQuICAKLVRoZSBXb3JrIE9yZGVyIGNsYXNzIGRlZmluZXMgcHJlZGVjZXNzb3IgYW5kIHN1Y2Nlc3NvciByZWxhdGlvbnMgYW1vbmdzdCBCcmVha2Rvd24gRWxlbWVudHMuICBUaGlzIGluZm9ybWF0aW9uIGlzIGluIHBhcnRpY3VsYXIgY3JpdGljYWwgZm9yIHBsYW5uaW5nIGFwcGxpY2F0aW9ucy4gIFNlZSBtb3JlIGRldGFpbHMgb24gZGlmZmVyZW50IHR5cGVzIG9mIFdvcmsgT3JkZXIgcmVsYXRpb25zaGlwcyBhdCBXb3JrIE9yZGVyIFR5cGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpzaW1wbGVDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0ieHNkOnN0cmluZyI+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIGdsb2JhbCB1bmlxdWUgaWQgZm9yIGEgd29yayBvcmRlci48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJsaW5rVHlwZSIgdHlwZT0idW1hOldvcmtPcmRlclR5cGUiPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+VGhpcyBhdHRyaWJ1dGUgZXhwcmVzc2VzIHRoZSB0eXBlIG9mIHRoZSBXb3JrIE9yZGVyIHJlbGF0aW9uc2hpcCBieSBhc3NpZ25pbmcgYSB2YWx1ZSBmcm9tIHRoZSBXb3JrIE9yZGVyIFR5cGUgZW51bWVyYXRpb24uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJXb3JrQnJlYWtkb3duRWxlbWVudCI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpYWwgQnJlYWtkb3duIEVsZW1lbnQgdGhhdCBwcm92aWRlcyBzcGVjaWZpYyBwcm9wZXJ0aWVzIGZvciBCcmVha2Rvd24gRWxlbWVudHMgdGhhdCByZXByZXNlbnQgb3IgcmVmZXIgdG8gV29yayBEZWZpbml0aW9ucy4gIEZvciBleGFtcGxlIGl0cyBzdWJjbGFzcyBBY3Rpdml0eSBkZWZpbmVzIHdvcmsgYXMgaXQgaXMgYWxzbyBhIHN1YmNsYXNzIG9mIFdvcmsgRGVmaW5pdGlvbi4gIEl0cyBzdWJjbGFzcyBUYXNrIERlc2NyaXB0b3IgZG9lcyBub3QgZGVmaW5lIHdvcmsgYnkgaXRzZWxmLCBidXQgcmVmZXJzIHRvIGEgV29yayBEZWZpbml0aW9uIGFuZCB0aGVyZWZvcmUgY2FuIGhhdmUgdGhlIHNhbWUgY29tbW9uIHByb3BlcnRpZXMgYW5kIFdvcmsgQnJlYWtkb3duIEVsZW1lbnQgaGFzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6QnJlYWtkb3duRWxlbWVudCI+Ci0JCQkJPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJQcmVkZWNlc3NvciIgdHlwZT0idW1hOldvcmtPcmRlciIvPgotCQkJCTwveHNkOmNob2ljZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpc1JlcGVhdGFibGUiIHR5cGU9InhzZDpib29sZWFuIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlRoaXMgYXR0cmlidXRlIGlzIHVzZWQgdG8gZGVmaW5lIHJlcGV0aXRpb24gb2Ygd29yaywgZS5nLiBpdGVyYXRpb25zLiAgQSBQcm9jZXNzIFdvcmsgRGVmaW5pdGlvbiB3aXRoIHRoaXMgYXR0cmlidXRlIHNldCB0byBUcnVlIHNoYWxsIGJlIHJlcGVhdGVkIG1vcmUgdGhhbiBvbmNlIG9uIHRoZSBzYW1lIHNldCBvZiBhcnRpZmFjdHMuICBGb3IgZXhhbXBsZSwgZm9yIGFuIGluc3RhbmNlIG9mIEl0ZXJhdGlvbiAoZGVmaW5lZCBhcyBhIHNwZWNpYWwgUHJvY2VzcyBXb3JrIERlZmluaXRpb24gYmVsb3cpIHRoaXMgYXR0cmlidXRlIGlzIHNldCB0byBUcnVlIGJ5IGRlZmF1bHQgaW5kaWNhdGluZyB0aGF0IGV2ZXJ5IHN1Yi1BY3Rpdml0eSB3aWxsIGJlIHJlcGVhdGVkIG1vcmUgdGhhbiBvbmNlLiAgSG93ZXZlciwgYW55IFByb2Nlc3MgV29yayBEZWZpbml0aW9uIGNhbiBzZXQgdGhpcyBhdHRyaWJ1dGUgdG8gVHJ1ZSB0byBkZWZpbmUgaXRlcmF0aW9ucyAoZS5nLiB0byBpdGVyYXRlIG9uZSBBY3Rpdml0eSBjb25zaXN0aW5nIG9mIG1hbnkgc3ViLWFjdGl2aXRpZXMgb3IgZXZlbiBQaGFzZXMsIGJ1dCB0byBpdGVyYXRlIGp1c3Qgb25lIFRhc2spLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImlzT25nb2luZyIgdHlwZT0ieHNkOmJvb2xlYW4iPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+SWYgdGhlIGlzT25nb2luZyBhdHRyaWJ1dGUgaXMgc2V0IHRvIFRydWUgZm9yIGEgUHJvY2VzcyBXb3JrIERlZmluaXRpb24gaW5zdGFuY2UsIHRoZW4gdGhlIGVsZW1lbnQgZGVzY3JpYmVzIGFuIG9uZ29pbmcgcGllY2Ugb2Ygd29yayB3aXRob3V0IGEgZml4ZWQgZHVyYXRpb24gb3IgZW5kIHN0YXRlLiAgRm9yIGV4YW1wbGUsIHRoZSBQcm9jZXNzIFdvcmsgRGVmaW5pdGlvbiBjb3VsZCByZXByZXNlbnQgd29yayBvZiBhbiBhZG1pbmlzdHJhdG9yIGNvbnRpbnVvdXNseSAoZS5nLiAzaCBhIGRheSkgd29ya2luZyB0byBlbnN1cmUgdGhhdCBzeXN0ZW1zIGFyZSBrZXB0IGluIGEgY2VydGFpbiBzdGF0ZS4gIEFub3RoZXIgZXhhbXBsZSB3b3VsZCBiZSBwcm9ncmFtIG1hbmFnZW1lbnQgd29yayBvdmVyc2VlaW5nIG1hbnkgZGlmZmVyZW50IHByb2plY3RzIGJlaW5nIHNjaGVkdWxlZCBmb3Igb25lIHBhcnRpY3VsYXIgcHJvamVjdCBhdCBzcGVjaWZpYyByZW9jY3VycmluZyBpbnRlcnZhbHMgZHVyaW5nIHRoZSB3aG9sZSBsaWZlY3ljbGUgb2YgdGhlIHByb2plY3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0iaXNFdmVudERyaXZlbiIgdHlwZT0ieHNkOmJvb2xlYW4iPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+VGhlIGlzRXZlbnREcml2ZW4gYXR0cmlidXRlIGluZGljYXRlcyB0aGF0IHRoZSBQcm9jZXNzIFdvcmsgRGVmaW5pdGlvbiBkZXNjcmliZXMgYW4gaW5zdGFuY2Ugb2Ygd29yayB3aGljaCBpcyBub3Qgc3RhcnRlZCBiZWNhdXNlIGl0IGhhcyBiZWVuIHNjaGVkdWxlZCB0byBzdGFydCBhdCBhIGNlcnRhaW4gcG9pbnQgb2YgdGltZSwgYmVjYXVzZSBwcmVjZWRpbmcgd29yayBpcyBiZWluZyBjb21wbGV0ZWQsIG9yIGlucHV0IHdvcmsgcHJvZHVjdHMgYXJlIGF2YWlsYWJsZSwgYnV0IGJlY2F1c2UgYW5vdGhlciBzcGVjaWZpYyBldmVudCBoYXMgb2NjdXJyZWQuICBFeGFtcGxlcyBmb3Igc3VjaCBldmVudHMgYXJlIGV4Y2VwdGlvbnMgb3IgcHJvYmxlbSBzaXR1YXRpb25zIHdoaWNoIHJlcXVpcmUgc3BlY2lmaWMgd29yayB0byBiZSBwZXJmb3JtZWQgYXMgYSByZXN1bHQuICBBbHNvIGNoYW5nZSBtYW5hZ2VtZW50IHdvcmsgY2FuIGJlIG1vZGVsZWQgYXMgZXZlbnQgZHJpdmVuIHdvcmsgYW5hbHl6aW5nIGEgY2hhbmdlIHJlcXVlc3Qgb3IgZGVmZWN0IGFuZCBhbGxvY2F0aW5nIHdvcmsgZHluYW1pY2FsbHkgdG8gcmVzb3VyY2VzIHRvIGRlYWwgd2l0aCBpdCBmb2xsb3dpbmcgdGhlIHdvcmsgZGVzY3JpYmVkIHdpdGggc3VjaCBQcm9jZXNzIFdvcmsgRGVmaW5pdGlvbi4gIFRoZSBldmVudHMgdGhlbXNlbHZlcyBhcmUgbm90IG1vZGVsZWQgaW4gdGhpcyB2ZXJzaW9uIG9mIHRoZSBzcGVjaWZpY2F0aW9uLiAgVGhleSBzaGFsbCBiZSBkZXNjcmliZWQgYXMgcGFydCBvZiB0aGUgbm9ybWFsIGRlc2NyaXB0aW9ucyBmaWVsZHMgYXZhaWxhYmxlLgotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iTWlsZXN0b25lIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lhbCBCcmVha2Rvd24gRWxlbWVudCB0aGF0IGRlc2NyaWJlcyBhIHNpZ25pZmljYW50IGV2ZW50IGluIGEgZGV2ZWxvcG1lbnQgcHJvamVjdCwgc3VjaCBhcyBhIG1ham9yIGRlY2lzaW9uLCBjb21wbGV0aW9uIG9mIGEgZGVsaXZlcmFibGUsIG9yIG1lZXRpbmcgb2YgYSBtYWpvciBkZXBlbmRlbmN5IChsaWtlIGNvbXBsZXRpb24gb2YgYSBwcm9qZWN0IHBoYXNlKS4gIEJlY2F1c2UsIE1pbGVzdG9uZSBpcyBjb21tb25seSB1c2VkIHRvIHJlZmVyIHRvIGJvdGggdGhlIGV2ZW50IGl0c2VsZiBhbmQgdGhlIHBvaW50IGluIHRpbWUgYXQgd2hpY2ggdGhlIGV2ZW50IGlzIHNjaGVkdWxlZCB0byBoYXBwZW4sIGl0IGlzIG1vZGVsZWQgYXMgYSBCcmVha2Rvd24gRWxlbWVudCAoaS5lLiBpdCBhcHBlYXJzIGFzIHBhcnQgb2YgYSBicmVha2Rvd24gc3RydWN0dXJlKS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOldvcmtCcmVha2Rvd25FbGVtZW50Ii8+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iQWN0aXZpdHkiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBXb3JrIEJyZWFrZG93biBFbGVtZW50IGFuZCBXb3JrIERlZmluaXRpb24gd2hpY2ggc3VwcG9ydHMgdGhlIG5lc3RpbmcgYW5kIGxvZ2ljYWwgZ3JvdXBpbmcgb2YgcmVsYXRlZCBCcmVha2Rvd24gRWxlbWVudHMgZm9ybWluZyBicmVha2Rvd24gc3RydWN0dXJlcy4gIEFsdGhvdWdoIEFjdGl2aXR5IGlzIGEgY29uY3JldGUgbWV0YS1jbGFzcywgb3RoZXIgY2xhc3NlcyB3aGljaCByZXByZXNlbnQgYnJlYWtkb3duIHN0cnVjdHVyZXMgZGVyaXZlIGZyb20gaXQ7IHN1Y2ggYXMgUGhhc2UsIEl0ZXJhdGlvbiwgRGVsaXZlcnkgUHJvY2Vzcywgb3IgQ2FwYWJpbGl0eSBQYXR0ZXJuLgotQWN0aXZpdHkgcmVwcmVzZW50cyBhIGdyb3VwaW5nIGVsZW1lbnQgZm9yIG90aGVyIEJyZWFrZG93biBFbGVtZW50cyBzdWNoIGFzIEFjdGl2aXRpZXMsIERlc2NyaXB0b3JzLCBNaWxlc3RvbmVzLCBldGMuICBJdCBpcyBub3QgcGVyLXNlIGEgJ2hpZ2gtbGV2ZWwnIGdyb3VwaW5nIG9mIG9ubHkgd29yayBhcyBpbiBvdGhlciBtZXRhLW1vZGVscywgYnV0IGdyb3VwcyBhbnkga2luZCBvZiBCcmVha2Rvd24gRWxlbWVudHMuICBGb3IgZXhhbXBsZSwgb25lIGNhbiBkZWZpbmUgdmFsaWQgQWN0aXZpdGllcyB0aGF0IGdyb3VwIG9ubHkgV29yayBQcm9kdWN0cyBEZXNjcmlwdG9ycyB3aXRob3V0IGFueSBtYXRjaGluZyBUYXNrIERlc2NyaXB0b3JzLiAgQWN0aXZpdGllcyBhbHNvIGluaGVyaXQgYWxsIHByb3BlcnRpZXMgZnJvbSBXb3JrIEJyZWFrZG93biBFbGVtZW50IGFuZCBpbmRpcmVjdGx5IGZyb20gUHJvY2VzcyBFbGVtZW50OyBpLmUuIEFjdGl2aXR5IGlzIHJlYWR5IHRvIGhhdmUgYSBmdWxsIGNvbnRlbnQgZGVzY3JpcHRpb24gYXR0YWNoZWQgdG8gaXQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpXb3JrQnJlYWtkb3duRWxlbWVudCI+Ci0JCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlByZWNvbmRpdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJQb3N0Y29uZGl0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQkJPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQnJlYWtkb3duRWxlbWVudCIgdHlwZT0idW1hOkJyZWFrZG93bkVsZW1lbnQiLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJDaGVja2xpc3QiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJDb25jZXB0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iRXhhbXBsZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Ikd1aWRlbGluZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlJvYWRtYXAiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJSZXVzYWJsZUFzc2V0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iU3VwcG9ydGluZ01hdGVyaWFsIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iV2hpdGVwYXBlciIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0idmFyaWFiaWxpdHlUeXBlIiB0eXBlPSJ1bWE6VmFyaWFiaWxpdHlUeXBlIi8+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0idmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9IklzRW5hY3RhYmxlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlBoYXNlIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lhbCBBY3Rpdml0eSB3aGljaCBwcmVzY3JpYmVzIHByZS1kZWZpbmVkIHZhbHVlcyBmb3IgaXRzIGluc3RhbmNlcyBmb3IgdGhlIGF0dHJpYnV0ZXMgcHJlZml4ICgnUGhhc2UnKSBhbmQgaXNSZXBlYXRhYmxlICgnRmFsc2UnKS4gIEl0IGhhcyBiZWVuIGluY2x1ZGVkIGludG8gdGhlIG1ldGEtbW9kZWwgZm9yIGNvbnZlbmllbmNlIGFuZCB0byBwcm92aWRlIGEgc3BlY2lhbCBzdGVyZW90eXBlLCBiZWNhdXNlIGl0IHJlcHJlc2VudHMgYSB2ZXJ5IGNvbW1vbmx5IHVzZWQgQWN0aXZpdHkgdHlwZS4KLVBoYXNlIHJlcHJlc2VudCBhIHNpZ25pZmljYW50IHBlcmlvZCBpbiBhIHByb2plY3QsIGVuZGluZyB3aXRoIG1ham9yIG1hbmFnZW1lbnQgY2hlY2twb2ludCwgbWlsZXN0b25lIG9yIHNldCBvZiBEZWxpdmVyYWJsZXMuICBJdCBpcyBpbmNsdWRlZCBpbiB0aGUgbW9kZWwgYXMgYSBwcmVkZWZpbmVkIHNwZWNpYWwgQWN0aXZpdHksIGJlY2F1c2Ugb2YgaXRzIHNpZ25pZmljYW5jZSBpbiBkZWZpbmluZyBicmVha2Rvd25zLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6QWN0aXZpdHkiLz4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJJdGVyYXRpb24iPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWFsIEFjdGl2aXR5IHdoaWNoIHByZXNjcmliZXMgcHJlLWRlZmluZWQgdmFsdWVzIGZvciBpdHMgaW5zdGFuY2VzIGZvciB0aGUgYXR0cmlidXRlcyBwcmVmaXggKCdJdGVyYXRpb24nKSBhbmQgaXNSZXBlYXRhYmxlICgnVHJ1ZScpLiAgSXQgaGFzIGJlZW4gaW5jbHVkZWQgaW50byB0aGUgbWV0YS1tb2RlbCBmb3IgY29udmVuaWVuY2UgYW5kIHRvIHByb3ZpZGUgYSBzcGVjaWFsIHN0ZXJlb3R5cGUsIGJlY2F1c2UgaXQgcmVwcmVzZW50cyBhIHZlcnkgY29tbW9ubHkgdXNlZCBBY3Rpdml0eSB0eXBlLgotSXRlcmF0aW9uIGdyb3VwcyBhIHNldCBvZiBuZXN0ZWQgQWN0aXZpdGllcyB0aGF0IGFyZSByZXBlYXRlZCBtb3JlIHRoYW4gb25jZS4gIEl0IHJlcHJlc2VudHMgYW4gaW1wb3J0YW50IHN0cnVjdHVyaW5nIGVsZW1lbnQgdG8gb3JnYW5pemUgd29yayBpbiByZXBldGl0aXZlIGN5Y2xlcy4gIFRoZSBjb25jZXB0IG9mIEl0ZXJhdGlvbiBjYW4gYmUgYXNzb2NpYXRlZCB3aXRoIGRpZmZlcmVudCBydWxlcyBpbiBkaWZmZXJlbnQgbWV0aG9kcy4gIEZvciBleGFtcGxlLCB0aGUgSUJNIFJhdGlvbmFsIFVuaWZpZWQgUHJvY2VzcyBtZXRob2QgZnJhbWV3b3JrIChSVVApIGRlZmluZXMgYSBydWxlIHRoYXQgSXRlcmF0aW9ucyBhcmUgbm90IGFsbG93ZWQgdG8gc3BhbiBhY3Jvc3MgUGhhc2VzLiAgSW4gY29udHJhc3QgSUJNIEdsb2JhbCBTZXJ2aWNlcyBNZXRob2QgKEdTTWV0aG9kKSBiYXNlZCBtZXRob2QgZnJhbWV3b3JrcyB0aGlzIHJ1bGUgZG9lcyBub3QgYXBwbHkgYW5kIEl0ZXJhdGlvbiBjYW4gYmUgZGVmaW5lZCB3aGljaCBuZXN0IFBoYXNlcy4gIFJ1bGVzIGxpa2UgdGhlc2UsIHdoaWNoIHBsYXkgYW4gaW1wb3J0YW50IHJvbGUgZm9yIGVhY2ggaW5kaXZpZHVhbCBtZXRob2QgYW5kIGFyZSB0aGVyZWZvcmUgbm90IGVuZm9yY2VkIGJ5IHRoaXMgbWV0YS1tb2RlbC4gIEluc3RlYWQsIHByb2Nlc3MgYXV0aG9ycyBhcmUgZXhwZWN0ZWQgdG8gZm9sbG93IGFuZCBjaGVjayB0aGVzZSBydWxlcyBtYW51YWxseS4gIChOb3RlOiBBbnkgQnJlYWtkb3duIEVsZW1lbnQgY2FuIGJlIHJlcGVhdGVkOyBob3dldmVyLCBJdGVyYXRpb25zIGhhcyBiZWVuIGludHJvZHVjZWQgYXMgYSBzcGVjaWFsIG1ldGEtbW9kZWwgY29uY2VwdCwgYmVjYXVzZSBvZiBpdHMgaW1wb3J0YW50IHJvbGUgZm9yIG1hbnkgbWV0aG9kcy4pPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpBY3Rpdml0eSIvPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbiI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIGdlbmVyYWxpemVkIENvbnRlbnQgRGVzY3JpcHRpb24gdGhhdCBpcyB1c2VkIHRvIHN0b3JlIHRoZSB0ZXh0dWFsIGRlc2NyaXB0aW9uIGZvciBhIEJyZWFrZG93biBFbGVtZW50LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6Q29udGVudERlc2NyaXB0aW9uIj4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ1c2FnZUd1aWRhbmNlIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlByb3ZpZGVzIGluZm9ybWF0aW9uIGFuZCBndWlkYW5jZSBvbiB0aGUgbWVhbmluZyBvZiB0aGUgQm9vbGVhbiBmbGFnIHZhbHVlcyBhbmQgdW5kZXIgd2hhdCBjaXJjdW1zdGFuY2VzIHRoZXkgc2hvdWxkIGJlIG92ZXJyaWRkZW4uIEZvciBleGFtcGxlLCBpdCBkZXNjcmliZXMgd2h5IHRoZSBicmVha2Rvd24gZWxlbWVudCBpcyBvcHRpb25hbCBvciBjb25zaWRlcmF0aW9ucyBmb3IgcmVwZWF0aW5nIGl0IGFuZCBkaWZmZXJlbmNlcyBpbiB0aGUgaW5kaXZpZHVhbCBvY2N1cnJlbmNlcyBvZiB0aGlzIEJyZWFrZG93biBFbGVtZW50IGFjcm9zcyB0aGUgbGlmZWN5Y2xlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkFjdGl2aXR5RGVzY3JpcHRpb24iPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBnZW5lcmFsaXplZCBCcmVha2Rvd24gRWxlbWVudCBEZXNjcmlwdGlvbiB0aGF0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIHRleHR1YWwgZGVzY3JpcHRpb24gZm9yIGFuIEFjdGl2aXR5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6QnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uIj4KLQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQWx0ZXJuYXRpdmVzIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5Db21wcmlzZXMgb2Ygc3VtbWFyaWVzIGRlc2NyaWJpbmcgaW1wb3J0YW50IGV4Y2VwdGlvbmFsIGFuZCBub24tc3RhbmRhcmQgd2F5cyBvZiBkb2luZyB0aGUgd29yayBvZiB0aGlzIEFjdGl2aXR5IG5vdCBjb3ZlcmVkIGJ5IHRoZSBBY3Rpdml0eSdzIFRhc2tzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iSG93VG9TdGFmZiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+UHJvdmlkZXMgYmFja2dyb3VuZCBvbiB3aG8gc2hvdWxkIGJlIGludm9sdmVkIGluIHRoaXMgYWN0aXZpdHkgd2hhdCBhcmUgdGhlIHJlcXVpcmVkIHNraWxscywgZXhwZXJpZW5jZSwgIGFuZCBwZXJoYXBzIGF0dGl0dWRlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlB1cnBvc2UiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlN1bW1hcml6ZXMgdGhlIG1haW4gcmVhc29uIGZvciBwZXJmb3JtaW5nIHRoaXMgQWN0aXZpdHksIGRlc2NyaWJlcyB3aGF0IHRoZSBhY3Rpdml0eSBhcyBhIHdob2xlIGlzIGludGVuZGVkIHRvIGFjaGlldmUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iRGVzY3JpcHRvckRlc2NyaXB0aW9uIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgZ2VuZXJhbGl6ZWQgQnJlYWtkb3duIEVsZW1lbnQgRGVzY3JpcHRpb24gdGhhdCBpcyB1c2VkIHRvIHN0b3JlIHRoZSB0ZXh0dWFsIGRlc2NyaXB0aW9uIGZvciBhIERlc2NyaXB0b3IuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24iPgotCQkJCTx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJSZWZpbmVkRGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIERlc2NyaXB0b3IgbWlnaHQgYWRkIHJlZmluZW1lbnRzIHRvIHRoZSBtYWluIGRlc2NyaXB0aW9uIG9mIHRoZSBDb250ZW50IEVsZW1lbnQgaXQgcmVmZXJzIHRvLiAgRm9yIGV4YW1wbGUsIGl0IGNvdWxkIHByb3ZpZGUgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCBhIFdvcmsgUHJvZHVjdCByZWxldmFudCBmb3IgdGhlIHNwZWNpZmljIHBvaW50IGluIHRpbWUgaW4gdGhlIHByb2Nlc3MgdGhpcyBXb3JrIFByb2R1Y3QgdHlwZSBpcyBiZWluZyB1c2VkLiAgSXQgY291bGQgZGVzY3JpYmUgYWRkaXRpb25hbCBza2lsbHMgbmVlZGVkIGZvciBhIFJvbGUgYXQgdGhhdCBwYXJ0aWN1bGFyIHBvaW50IGluIHRpbWUgaW4gYSBwcm9jZXNzLCBldGMuIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCTwveHNkOmNob2ljZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJQcm9jZXNzRGVzY3JpcHRpb24iPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBnZW5lcmFsaXplZCBBY3Rpdml0eSBEZXNjcmlwdGlvbiB0aGF0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIHRleHR1YWwgZGVzY3JpcHRpb24gZm9yIGEgUHJvY2Vzcy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkFjdGl2aXR5RGVzY3JpcHRpb24iPgotCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJTY29wZSIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyB0aGUgc2NvcGUgb2YgdGhlIFByb2Nlc3MsIGkuZS4gd2hpY2ggdHlwZXMgb2YgcHJvamVjdHMgZG9lcyBpdCBhZGRyZXNzIGFuZCB3aGljaCBub3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJVc2FnZU5vdGVzIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BbnkgYWRkaXRpb25hbCBub3RlcyBvbiBob3cgdG8gYXBwbHkgYW5kIGluc3RhbnRpYXRlIHRoaXMgcHJvY2VzcyBmb3IgYSBwcm9qZWN0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImV4dGVybmFsSWQiIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+QW4gZXh0ZXJuYWwgdmlzaWJsZSBudW1iZXIgdGhhdCBpcyB1c2VkIHRvIHJlZmVyZW5jZSB0aGlzIGRlbGl2ZXJ5IHBhdHRlcm5zIGFuZCBtb2RlbHMuIEl0IGlzIHVzZWQgbGlrZSBhIHN5bm9ueW0uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24iPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBnZW5lcmFsaXplZCBQcm9jZXNzIERlc2NyaXB0aW9uIHRoYXQgaXMgdXNlZCB0byBzdG9yZSB0aGUgdGV4dHVhbCBkZXNjcmlwdGlvbiBmb3IgYSBEZWxpdmVyeSBQcm9jZXNzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6UHJvY2Vzc0Rlc2NyaXB0aW9uIj4KLQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iU2NhbGUiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPk91dGxpbmVzIGNoYXJhY3RlcmlzdGljcyBhYm91dCB0aGUgc2l6ZSBvZiBhIHR5cGljYWwgcHJvamVjdCB0aGF0IHBlcmZvcm1zIHRoaXMgcHJvamVjdCBleHByZXNzZWQgaW4gdGVhbSBzaXplLCBtYW4geWVhcnMsIGV0Yy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlByb2plY3RDaGFyYWN0ZXJpc3RpY3MiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkNoYXJhY3Rlcml6ZXMgdGhlIHByb2plY3QgdGhhdCB3b3VsZCB0eXBpY2FsbHkgcGVyZm9ybSB0aGlzIFByb2Nlc3M8L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlJpc2tMZXZlbCIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+T3V0bGluZXMgdHlwaWNhbCBwcm9qZWN0IHJpc2tzIHRoYXQgYXJlIGFkZHJlc3NlZCB3aXRoIHRoaXMgcHJvY2Vzcy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkVzdGltYXRpbmdUZWNobmlxdWUiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkRlc2NyaWJlcyB0aGUgRXN0aW1hdGlvbiBUZWNobmlxdWVzIHByb3ZpZGVkIGZvciB0aGlzIFByb2Nlc3MuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJQcm9qZWN0TWVtYmVyRXhwZXJ0aXNlIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5Qcm92aWRlcyBhIHByb2ZpbGUgb2YgYSB0eXBpY2FsIHByb2plY3QgdGVhbSwgdGhlIGRpc3RyaWJ1dGlvbiBvZiByb2xlcywgc2tpbGxzIHJlcXVpcmVkIGZvciBhIHRlYW0gcGVyZm9ybXMgYSBwcm9qZWN0IGJhc2VkIG9uIHRoaXMgcHJvY2Vzcy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlR5cGVPZkNvbnRyYWN0IiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5Qcm92aWRlcyBiYWNrZ3JvdW5kIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjb0knbSBjaGFJJ20gbnRyYWN0cyB0aGF0IG5lZWQgdG8gYmUgZXN0YWJsaXNoZWQgYmV0d2VlbiBhIHByb2plY3QgdGVhbSB0aGF0IHBlcmZvcm1zIHRoaXMgcHJvY2VzcyBhbmQgYSBjbGllbnQgKGUuZy4gZm9yIGFuIElHUyBlbmdhZ2VtZW50KS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJEZXNjcmlwdG9yIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkFuIGFic3RyYWN0IGdlbmVyYWxpemF0aW9uIGZvciBzcGVjaWFsIEJyZWFrZG93biBFbGVtZW50cyB0aGF0IHJlZmVyZW5jZXMgb25lIGNvbmNyZXRlIENvbnRlbnQgRWxlbWVudC4gIEEgZGVzY3JpcHRvciBwcm92aWRlcyBhIHJlcHJlc2VudGF0aW9uIG9mIGEgQ29udGVudCBFbGVtZW50IHdpdGhpbiBicmVha2Rvd24gc3RydWN0dXJlcy4gIEluIGFkZGl0aW9uIHRvIGp1c3QgcmVmZXJlbmNpbmcgQ29udGVudCBFbGVtZW50cyBpdCBhbGxvd3Mgb3ZlcnJpZGluZyB0aGUgQ29udGVudCBFbGVtZW50cyBzdHJ1Y3R1cmFsIHJlbGF0aW9uc2hpcHMgYnkgZGVmaW5pbmcgaXRzIG93biBzZXRzIG9mIGFzc29jaWF0aW9ucy4KLURlc2NyaXB0b3JzIGFyZSB0aGUga2V5IGNvbmNlcHQgZm9yIHJlYWxpemluZyB0aGUgc2VwYXJhdGlvbiBvZiBwcm9jZXNzZXMgZnJvbSBtZXRob2QgY29udGVudC4gIEEgRGVzY3JpcHRvciBjYW4gYmUgY2hhcmFjdGVyaXplZCBhcyBhIHJlZmVyZW5jZSBvYmplY3QgZm9yIG9uZSBwYXJ0aWN1bGFyIENvbnRlbnQgRWxlbWVudCwgd2hpY2ggaGFzIGl0cyBvd24gcmVsYXRpb25zaGlwcyBhbmQgcHJvcGVydGllcy4gIFdoZW4gYSBEZXNjcmlwdG9yIGlzIGNyZWF0ZWQgaXQgc2hhbGwgYmUgcHJvdmlkZWQgd2l0aCBjb25ncnVlbnQgY29waWVzIG9mIHRoZSByZWxhdGlvbnNoaXBzIGRlZmluZWQgZm9yIHRoZSByZWZlcmVuY2VkIGNvbnRlbnQgZWxlbWVudC4gIEhvd2V2ZXIsIGEgdXNlciBjYW4gbW9kaWZ5IHRoZXNlIHJlbGF0aW9uc2hpcHMgZm9yIHRoZSBwYXJ0aWN1bGFyIHByb2Nlc3Mgc2l0dWF0aW9uIGZvciB3aGljaCB0aGUgZGVzY3JpcHRvciBoYXMgYmVlbiBjcmVhdGVkLiA8L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkJyZWFrZG93bkVsZW1lbnQiPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImlzU3luY2hyb25pemVkV2l0aFNvdXJjZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJXb3JrUHJvZHVjdERlc2NyaXB0b3IiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWFsIERlc2NyaXB0b3IgdGhhdCByZXByZXNlbnRzIGEgV29yayBQcm9kdWN0IGluIHRoZSBjb250ZXh0IG9mIG9uZSBzcGVjaWZpYyBBY3Rpdml0eS4gIEV2ZXJ5IGJyZWFrZG93biBzdHJ1Y3R1cmUgY2FuIGRlZmluZSBkaWZmZXJlbnQgcmVsYXRpb25zaGlwcyBvZiBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvcnMgdG8gVGFzayBEZXNjcmlwdG9ycyBhbmQgUm9sZSBEZXNjcmlwdG9ycy4gIFRoZXJlZm9yZSBvbmUgV29yayBQcm9kdWN0IGNhbiBiZSByZXByZXNlbnRlZCBieSBtYW55IFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9ycyBlYWNoIHdpdGhpbiB0aGUgY29udGV4dCBvZiBhbiBBY3Rpdml0eSB3aXRoIGl0cyBvd24gc2V0IG9mIHJlbGF0aW9uc2hpcHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpEZXNjcmlwdG9yIj4KLQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iV29ya1Byb2R1Y3QiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUmVzcG9uc2libGVSb2xlIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQkJPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iRXh0ZXJuYWxJbnB1dFRvIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iSW1wYWN0ZWRCeSIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkltcGFjdHMiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJNYW5kYXRvcnlJbnB1dFRvIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iT3B0aW9uYWxJbnB1dFRvIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iT3V0cHV0RnJvbSIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkRlbGl2ZXJhYmxlUGFydHMiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJPC94c2Q6Y2hvaWNlPgotCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImFjdGl2aXR5RW50cnlTdGF0ZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5HaXZlbiB0aGF0IGFuIGluc3RhbmNlIG9mIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9yIGhhcyBiZWVuIGNyZWF0ZWQgZm9yIGEgc3BlY2lmaWMgQWN0aXZpdHksIHRoZW4gdGhlIEFjdGl2aXR5IEVudHJ5IFN0YXRlIGF0dHJpYnV0ZSBzcGVjaWZpZXMgdGhlIGRlc2lyZWQgc3RhdGUgb2YgaW5zdGFuY2VzIG9mIHRoZSByZWZlcmVuY2VkIFdvcmsgUHJvZHVjdCB3aGVuIHdvcmsgb24gdGhlIEFjdGl2aXR5IGlzIGluaXRpYXRlZCAoaS5lLiB3b3JrIG9uIHRoZSBBY3Rpdml0eSdzIFRhc2sgRGVzY3JpcHRvcnMgaXMgYmVpbmcgaW5pdGlhdGVkIHRoYXQgdXNlIHRoaXMgV29yayBQcm9kdWN0IERlc2NyaXB0b3IgYXMgaW5wdXQpLiAgCi1Gb3Igc29tZSBXb3JrIFByb2R1Y3RzIHN0YXRlIGlzIGV4cHJlc3NlZCBpbiBwZXJjZW50YWdlIG9mIGNvbXBsZXRpb24sIGNvbXBsaWFuY2UgdG8gd29yayBwcm9kdWN0IGNoZWNrbGlzdCwgaW5mb3JtYWwgc3RhdGUgZGVzY3JpcHRpb25zLCBldGMuICBPdGhlcnMgaGF2ZSB2ZXJ5IHNwZWNpZmljIHN0YXRlcyBleHByZXNzZWQgYXMgZW51bWVyYXRpb25zIHN1Y2ggYXMgW2lkZW50aWZpZWQsIGJyaWVmbHkgZGVzY3JpYmVkLCBvdXRsaW5lZCwgZGV0YWlsZWRdIGZvciB1c2UgY2FzZXMuICBPdGhlciBXb3JrIFByb2R1Y3Qgc3RhdGVzIHJlbGF0ZSB0byBzb21lIHF1YWxpdHkgbWVhc3VyZXMgb3IgbGlmZWN5Y2xlIHN0YXRlcyBzdWNoIGFzIFtyZXZpZXdlZCwgaW1wbGVtZW50ZWQsIHRlc3RlZF0uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWN0aXZpdHlFeGl0U3RhdGUiIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+R2l2ZW4gdGhhdCBhbiBpbnN0YW5jZSBvZiBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvciBoYXMgYmVlbiBjcmVhdGVkIGZvciBhIHNwZWNpZmljIEFjdGl2aXR5LCB0aGVuIHRoZSBBY3Rpdml0eSBFeGlzdCBTdGF0ZSBhdHRyaWJ1dGUgc3BlY2lmaWVzIHRoZSBkZXNpcmVkIHN0YXRlIG9mIGluc3RhbmNlcyBvZiB0aGUgcmVmZXJlbmNlZCBXb3JrIFByb2R1Y3Qgd2hlbiB3b3JrIG9uIHRoZSBBY3Rpdml0eSBpcyBmaW5pc2hlZCAoaS5lLiB3b3JrIG9uIHRoZSBBY3Rpdml0eSdzIFRhc2sgRGVzY3JpcHRvcnMgaGFzIGZpbmlzaGVkIHRoYXQgaGF2ZSB0aGlzIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9yIGFzIG91dHB1dCkuCi1Gb3Igc29tZSBXb3JrIFByb2R1Y3RzIHN0YXRlIGlzIGV4cHJlc3NlZCBpbiBwZXJjZW50YWdlIG9mIGNvbXBsZXRpb24sIGNvbXBsaWFuY2UgdG8gd29yayBwcm9kdWN0IGNoZWNrbGlzdCwgaW5mb3JtYWwgc3RhdGUgZGVzY3JpcHRpb25zLCBldGMuICBPdGhlcnMgaGF2ZSB2ZXJ5IHNwZWNpZmljIHN0YXRlcyBleHByZXNzZWQgYXMgZW51bWVyYXRpb25zIHN1Y2ggYXMgW2lkZW50aWZpZWQsIGJyaWVmbHkgZGVzY3JpYmVkLCBvdXRsaW5lZCwgZGV0YWlsZWRdIGZvciB1c2UgY2FzZXMuICBPdGhlciBXb3JrIFByb2R1Y3Qgc3RhdGVzIHJlbGF0ZSB0byBzb21lIHF1YWxpdHkgbWVhc3VyZXMgb3IgbGlmZWN5Y2xlIHN0YXRlcyBzdWNoIGFzIFtyZXZpZXdlZCwgaW1wbGVtZW50ZWQsIHRlc3RlZF0uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUm9sZURlc2NyaXB0b3IiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWFsIERlc2NyaXB0b3IgdGhhdCByZXByZXNlbnRzIGEgUm9sZSBpbiB0aGUgY29udGV4dCBvZiBvbmUgc3BlY2lmaWMgQWN0aXZpdHkuICBFdmVyeSBicmVha2Rvd24gc3RydWN0dXJlIGNhbiBkZWZpbmUgZGlmZmVyZW50IHJlbGF0aW9uc2hpcHMgb2YgUm9sZSBEZXNjcmlwdG9ycyB0byBUYXNrIERlc2NyaXB0b3JzIGFuZCBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvcnMuICBUaGVyZWZvcmUgb25lIFJvbGUgY2FuIGJlIHJlcHJlc2VudGVkIGJ5IG1hbnkgUm9sZSBEZXNjcmlwdG9ycyBlYWNoIHdpdGhpbiB0aGUgY29udGV4dCBvZiBhbiBBY3Rpdml0eSB3aXRoIGl0cyBvd24gc2V0IG9mIHJlbGF0aW9uc2hpcHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpEZXNjcmlwdG9yIj4KLQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUm9sZSIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJSZXNwb25zaWJsZUZvciIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlRhc2tEZXNjcmlwdG9yIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lhbCBEZXNjcmlwdG9yIHRoYXQgcmVwcmVzZW50cyBhIHByb3h5IGZvciBhIFRhc2sgaW4gdGhlIGNvbnRleHQgb2Ygb25lIHNwZWNpZmljIEFjdGl2aXR5LiAgRXZlcnkgYnJlYWtkb3duIHN0cnVjdHVyZSBjYW4gZGVmaW5lIGRpZmZlcmVudCByZWxhdGlvbnNoaXBzIG9mIFRhc2sgRGVzY3JpcHRvcnMgdG8gV29yayBQcm9kdWN0IERlc2NyaXB0b3JzIGFuZCBSb2xlIERlc2NyaXB0b3JzLiBUaGVyZWZvcmUgb25lIFRhc2sgY2FuIGJlIHJlcHJlc2VudGVkIGJ5IG1hbnkgVGFzayBEZXNjcmlwdG9ycyBlYWNoIHdpdGhpbiB0aGUgY29udGV4dCBvZiBhbiBBY3Rpdml0eSB3aXRoIGl0cyBvd24gc2V0IG9mIHJlbGF0aW9uc2hpcHMuCi1BIGtleSBkaWZmZXJlbmNlIGJldHdlZW4gTWV0aG9kIENvbnRlbnQgYW5kIFByb2Nlc3MgaXMgdGhhdCBhIENvbnRlbnQgRWxlbWVudCBzdWNoIGFzIFRhc2sgZGVzY3JpYmVzIGFsbCBhc3BlY3RzIG9mIGRvaW5nIHdvcmsgZGVmaW5lZCBhcm91bmQgdGhpcyBUYXNrLiAgVGhpcyBkZXNjcmlwdGlvbiBpcyBtYW5hZ2VkIGluIHN0ZXBzLCB3aGljaCBhcmUgbW9kZWxlZCBhcyBTZWN0aW9ucyBvZiB0aGUgVGFza3MnIENvbnRlbnQgRGVzY3JpcHRpb25zLiAgV2hlbiBhcHBseWluZyBhIFRhc2sgaW4gYSBQcm9jZXNzJyBBY3Rpdml0eSB3aXRoIGEgVGFzayBEZXNjcmlwdG9yIGEgUHJvY2VzcyBFbmdpbmVlciBuZWVkcyB0byBpbmRpY2F0ZSB0aGF0IGF0IHRoYXQgcGFydGljdWxhciBwb2ludCBpbiB0aW1lIGluIHRoZSBQcm9jZXNzIGRlZmluaXRpb24gZm9yIHdoaWNoIHRoZSBUYXNrIERlc2NyaXB0b3IgaGFzIGJlZW4gY3JlYXRlZCwgb25seSBhIHN1YnNldCBvZiBzdGVwcyBzaGFsbCBiZSBwZXJmb3JtZWQuICBIZSBkZWZpbmVzIHRoaXMgc2VsZWN0aW9uIHVzaW5nIHRoZSBzZWxlY3RlZFN0ZXBzIGFzc29jaWF0aW9uLiAgSWYgaGUgd2FudHMgdG8gYWRkIHN0ZXBzIHRvIGEgVGFzayBEZXNjcmlwdG9yLCBoZSBjYW4gZGVzY3JpYmUgdGhlc2UgZWl0aGVyIHByYWdtYXRpY2FsbHkgaW4gdGhlIHJlZmluZWREZXNjcmlwdGlvbiBhdHRyaWJ1dGUgb3IgJ3Byb3Blcmx5JyBjcmVhdGUgYSBjb250cmlidXRpbmcgVGFzayB0byB0aGUgVGFzayB0aGUgVGFzayBEZXNjcmlwdG9yIHJlZmVycyB0by4KLTwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6V29ya0JyZWFrZG93bkVsZW1lbnQiPgotCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJUYXNrIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlBlcmZvcm1lZFByaW1hcmlseUJ5IiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQkJPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQWRkaXRpb25hbGx5UGVyZm9ybWVkQnkiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJBc3Npc3RlZEJ5IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iRXh0ZXJuYWxJbnB1dCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Ik1hbmRhdG9yeUlucHV0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iT3B0aW9uYWxJbnB1dCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Ik91dHB1dCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJTdGVwIiB0eXBlPSJ1bWE6U2VjdGlvbiIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImlzU3luY2hyb25pemVkV2l0aFNvdXJjZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJDb21wb3NpdGVSb2xlIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lhbCBSb2xlIERlc2NyaXB0b3IgdGhhdCByZWxhdGVzIHRvIG1vcmUgdGhlbiBvbmUgUm9sZS4gIEl0IHJlcHJlc2VudHMgYSBncm91cGluZyBvZiBSb2xlcyB3aXRoIHRoZSBtYWluIHB1cnBvc2Ugb2Ygc2ltcGxpZmljYXRpb24sIGkuZS4gcmVkdWNpbmcgdGhlIG51bWJlciBvZiByb2xlcyBmb3IgYSBwcm9jZXNzLgotQSBDb21wb3NpdGUgUm9sZSBpcyBhIGdyb3VwaW5nIG9mIFJvbGVzIHRoYXQgY2FuIGJlIHVzZWQgaW4gYW4gQWN0aXZpdHkgb3IgUHJvY2VzcyB0byByZWR1Y2UgdGhlIG51bWJlciBvZiBSb2xlcy4gIEEgdHlwaWNhbCBhcHBsaWNhdGlvbiB3b3VsZCBiZSBhIHByb2Nlc3MgZm9yIGEgc21hbGwgdGVhbSBpbiB3aGljaCBhIHN0YW5kYXJkIHNldCBvZiByb2xlcyBmcm9tIHRoZSBtZXRob2QgY29udGVudCB3b3VsZCBiZSBhbGwgcGVyZm9ybWVkIGJ5IG9uZSBvciBtb3JlIHJlc291cmNlLiAgQnkgdXNpbmcgQ29tcG9zaXRlIFJvbGUgdGhlIHByb2Nlc3Mgd291bGQgc3VnZ2VzdCBhIHR5cGljYWwgY2x1c3RlcmluZyBvZiBSb2xlcyB0byBSZXNvdXJjZXMuICBBIENvbXBvc2l0ZSBSb2xlIGNvdWxkIHBlcmZvcm0gYWxsIFRhc2tzIGRlZmluZWQgZm9yIHRoZSBSb2xlcyBpdCByZWZlcnMgdG8uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpSb2xlRGVzY3JpcHRvciI+Ci0JCQkJPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJBZ2dyZWdhdGVkUm9sZSIgdHlwZT0idW1hOlJvbGUiLz4KLQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iVGVhbVByb2ZpbGUiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBCcmVha2Rvd24gRWxlbWVudCB0aGF0IGdyb3VwcyBSb2xlIERlc2NyaXB0b3JzIG9yIFJlc291cmNlIERlZmluaXRpb25zIGRlZmluaW5nIGEgbmVzdGVkIGhpZXJhcmNoeSBvZiB0ZWFtcyBhbmQgdGVhbSBtZW1iZXJzLgotV29yayBhc3NpZ25tZW50cyBhbmQgV29yayBQcm9kdWN0IHJlc3BvbnNpYmlsaXRpZXMgY2FuIGJlIGRpZmZlcmVudCBmcm9tIEFjdGl2aXR5IHRvIEFjdGl2aXR5IGluIGEgZGV2ZWxvcG1lbnQgcHJvamVjdC4gRGlmZmVyZW50IHBoYXNlcyByZXF1aXJlIGRpZmZlcmVudCBzdGFmZmluZyBwcm9maWxlcywgaS5lLiBkaWZmZXJlbnQgc2tpbGxzIGFuZCByZXNvdXJjZXMgZG9pbmcgZGlmZmVyZW50IHR5cGVzIG9mIHdvcmsuICBUaGVyZWZvcmUsIGEgcHJvY2VzcyBuZWVkcyB0byBkZWZpbmUgc3VjaCBkaWZmZXJlbnQgcHJvZmlsZXMgaW4gYSBmbGV4aWJsZSBtYW5uZXIuICBXaGVyZWFzIENvcmUgTWV0aG9kIENvbnRlbnQgZGVmaW5lcyBzdGFuZGFyZCByZXNwb25zaWJpbGl0aWVzIGFuZCBhc3NpZ25tZW50cywgYSBwcm9jZXNzIGV4cHJlc3MgYnkgYSBicmVha2Rvd24gc3RydWN0dXJlcyBuZWVkcyB0byBiZSBhYmxlIHJlZmluZSBhbmQgcmVkZWZpbmUgdGhlc2UgdGhyb3VnaG91dCBpdHMgZGVmaW5pdGlvbi4gIFJvbGUgRGVzY3JpcHRvcnMsIFJlc291cmNlIERlZmluaXRpb25zLCBhcyB3ZWxsIGFzIFRlYW0gUHJvZmlsZXMgcHJvdmlkZSB0aGUgZGF0YSBzdHJ1Y3R1cmUgbmVjZXNzYXJ5IHRvIGFjaGlldmUgdGhpcyBmbGV4aWJpbGl0eSBhbmQgdG8gcHJvdmlkZSBhIHByb2Nlc3MgdXNlciB3aXRoIHRoZSBjYXBhYmlsaXR5IHRvIGRlZmluZSBkaWZmZXJlbnQgdGVhbXMgYW5kIHJvbGUgcmVsYXRpb25zaGlwcyBmb3IgZXZlcnkgQWN0aXZpdHkgKGluY2x1ZGluZyBBY3Rpdml0aWVzIG9uIGFueSBuZXN0aW5nLWxldmVsIGFzIHdlbGwgYXMgSXRlcmF0aW9ucyBvciBQaGFzZXMpLgotSGVuY2UsIGluIGFkZGl0aW9uIHRvIHRoZSB3b3JrIGJyZWFrZG93biBhbmQgd29yayBwcm9kdWN0IGJyZWFrZG93biBzdHJ1Y3R1cmVzIGRlZmluZWQgc28gZmFyLCBUZWFtIFByb2ZpbGVzIGFyZSB1c2VkIHRvIGRlZmluZSBhIHRoaXJkIHR5cGUgb2YgYnJlYWtkb3duIHN0cnVjdHVyZTogdGVhbSBicmVha2Rvd24gc3RydWN0dXJlcy4gIFRoZXNlIGFyZSBjcmVhdGVkIGFzIGFuIEFjdGl2aXR5IHNwZWNpZmljIGhpZXJhcmNoeSBvZiBUZWFtIFByb2ZpbGVzIGNvbXByaXNpbmcgb2YgUm9sZSBEZXNjcmlwdG9ycyBhbmQgUmVzb3VyY2UgRGVmaW5pdGlvbnMuICBUaGVzZSBzdHJ1Y3R1cmVzIGNhbiBiZSBwcmVzZW50ZWQgYXMgd2VsbC1rbm93biBPcmctQ2hhcnRzLiAgSnVzdCBhcyB3aXRoIGFueSBvdGhlciBCcmVha2Rvd24gRWxlbWVudCBhbmQgRGVzY3JpcHRvcnMsIFRlYW0gUHJvZmlsZXMgY2FuIGJlIGRlZmluZWQgd2l0aGluIHRoZSBzY29wZSBvZiBhbnkgQWN0aXZpdHkgaW4gYSBicmVha2Rvd24gc3RydWN0dXJlLiAgSW4gb3RoZXIgd29yZHMgZXZlcnkgQWN0aXZpdHkgY2FuIGRlZmluZSBpdHMgb3duIFRlYW0gUHJvZmlsZXMgY29uc2lzdGluZyBvZiBBY3Rpdml0eSBzcGVjaWZpYyBSb2xlIERlc2NyaXB0b3JzIGFuZCBSZXNvdXJjZSBEZWZpbml0aW9ucy4gIFR5cGljYWxseSwgVGVhbSBQcm9maWxlcyBhcmUgZGVmaW5lZCBvbiB0aGUgbGV2ZWwgb2YgSXRlcmF0aW9ucyBvciBQaGFzZXMgb3Igb3RoZXIgaGlnaGVyLWxldmVsIEFjdGl2aXR5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6QnJlYWtkb3duRWxlbWVudCI+Ci0JCQkJPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJSb2xlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJTdXBlclRlYW0iIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlN1YlRlYW0iIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUHJvY2VzcyI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpYWwgQWN0aXZpdHkgdGhhdCBkZXNjcmliZXMgYSBzdHJ1Y3R1cmUgZm9yIHBhcnRpY3VsYXIgdHlwZXMgb2YgZGV2ZWxvcG1lbnQgcHJvamVjdHMuICBUbyBwZXJmb3JtIHN1Y2ggYSBkZXZlbG9wbWVudCBwcm9qZWN0IGEgUHJvY2Vzc2VzIHdvdWxkIGJlICdpbnN0YW50aWF0ZWQnIGFuZCBhZGFwdGVkIGZvciB0aGUgc3BlY2lmaWMgc2l0dWF0aW9uLiAgUHJvY2VzcyBpcyBhbiBhYnN0cmFjdCBjbGFzcyBhbmQgdGhpcyBtZXRhLW1vZGVsIGRlZmluZXMgZGlmZmVyZW50IHNwZWNpYWwgdHlwZXMgb2YgUHJvY2Vzc2VzIGZvciBkaWZmZXJlbnQgcHJvY2VzcyBtYW5hZ2VtZW50IGFwcGxpY2F0aW9ucyBhbmQgZGlmZmVyZW50IHNpdHVhdGlvbnMgb2YgcHJvY2VzcyByZXVzZS4gIEV2ZXJ5IFByb2Nlc3MgY29tcHJpc2VzIG9mIGFuZCBpcyB0aGUgdG9wLWxldmVsIGVsZW1lbnQgb2YgYW4gbi1sZXZlbCBicmVha2Rvd24gc3RydWN0dXJlIHVzaW5nIHRoZSBOZXN0aW5nIGFzc29jaWF0aW9uIGRlZmluZWQgb24gQWN0aXZpdHkuCi1Db3JlIE1ldGhvZCBDb250ZW50IHByb3ZpZGVzIHN0ZXAtYnktc3RlcCBleHBsYW5hdGlvbnMsIGRlc2NyaWJpbmcgaG93IHZlcnkgc3BlY2lmaWMgZGV2ZWxvcG1lbnQgZ29hbHMgYXJlIGFjaGlldmVkIGluZGVwZW5kZW50IG9mIHRoZSBwbGFjZW1lbnQgb2YgdGhlc2Ugc3RlcHMgd2l0aGluIGEgZGV2ZWxvcG1lbnQgbGlmZWN5Y2xlLiAgUHJvY2Vzc2VzIHRha2UgdGhlc2UgbWV0aG9kIGVsZW1lbnRzIGFuZCByZWxhdGUgdGhlbSBpbnRvIHNlbWktb3JkZXJlZCBzZXF1ZW5jZXMgdGhhdCBhcmUgY3VzdG9taXplZCB0byBzcGVjaWZpYyB0eXBlcyBvZiBwcm9qZWN0cy4gIFRodXMsIGEgcHJvY2VzcyBpcyBhIHNldCBvZiBwYXJ0aWFsbHkgb3JkZXJlZCB3b3JrIGRlc2NyaXB0aW9ucyBpbnRlbmRlZCB0byByZWFjaCBhIGhpZ2hlciBkZXZlbG9wbWVudCBnb2FsLCBzdWNoIGFzIHRoZSByZWxlYXNlIG9mIGEgc3BlY2lmaWMgc29mdHdhcmUgc3lzdGVtLiAgQSBwcm9jZXNzIGFuZCB0aGUgcHJvY2VzcyBtZXRhLW1vZGVsIHN0cnVjdHVyZSBkZWZpbmVkIGluIHRoaXMgc3BlY2lmaWNhdGlvbiBmb2N1c2VzIG9uIHRoZSBsaWZlY3ljbGUgYW5kIHRoZSBzZXF1ZW5jaW5nIG9mIHdvcmsgaW4gYnJlYWtkb3duIHN0cnVjdHVyZXMuICBUbyBhY2hpZXZlIHRoaXMgaXQgdXNlcyB0aGUgRGVzY3JpcHRvciBjb25jZXB0IHJlZmVyZW5jaW5nIG1ldGhvZCBjb250ZW50IGFuZCBhbGxvd2luZyBkZWZpbmluZyB0aW1lLXNwZWNpZmljIGN1c3RvbWl6YXRpb25zIG9mIHRoZSByZWZlcmVuY2VkIGNvbnRlbnQgKGUuZy4gZGVmaW5pbmcgYSBmb2N1cyBvbiBkaWZmZXJlbnQgc3RlcHMgb2YgdGhlIHNhbWUgVGFzayBhbmQgcHJvdmlkaW5nIGlucHV0IFdvcmsgUHJvZHVjdHMgaW4gZGlmZmVyZW50IHN0YXRlcyB3aXRoaW4gdGhlIGRpZmZlcmVudCBQaGFzZXMgb2YgYSBwcm9jZXNzIGxpZmVjeWNsZSBpbiB3aGljaCB0aGUgc2FtZSBUYXNrIGlzIHBlcmZvcm1lZCkuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpBY3Rpdml0eSI+Ci0JCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkluY2x1ZGVzUGF0dGVybiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iRGVmYXVsdENvbnRleHQiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iVmFsaWRDb250ZXh0IiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iRGVsaXZlcnlQcm9jZXNzIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lhbCBQcm9jZXNzIGRlc2NyaWJpbmcgYSBjb21wbGV0ZSBhbmQgaW50ZWdyYXRlZCBhcHByb2FjaCBmb3IgcGVyZm9ybWluZyBhIHNwZWNpZmljIHByb2plY3QgdHlwZS4gIEl0IGRlc2NyaWJlcyBhIGNvbXBsZXRlIHByb2plY3QgbGlmZWN5Y2xlIGVuZC10by1lbmQgYW5kIHNoYWxsIGJlIHVzZWQgYXMgYSByZWZlcmVuY2UgZm9yIHJ1bm5pbmcgcHJvamVjdHMgd2l0aCBzaW1pbGFyIGNoYXJhY3RlcmlzdGljcyBhcyBkZWZpbmVkIGZvciB0aGUgcHJvY2Vzcy4gIEEgRGVsaXZlcnkgUHJvY2VzcyBpcyByZWxhdGVkIHRvIHNwZWNpZmljIHN1cHBvcnRpbmcgaW5mb3JtYXRpb24gc3VjaCBhcyBSb2FkbWFwcyAoaW5oZXJpdGVkIHZpYSBBY3Rpdml0eSkgYXMgd2VsbCBhcyBDb21tdW5pY2F0aW9ucyBhbmQgRWR1Y2F0aW9uIE1hdGVyaWFsLgotQSBEZWxpdmVyeSBQcm9jZXNzIGlzIGEgUHJvY2VzcyB0aGF0IGNvdmVycyBhIHdob2xlIGRldmVsb3BtZW50IGxpZmVjeWNsZSBmcm9tIGJlZ2lubmluZyB0byBlbmQuICBBIERlbGl2ZXJ5IFByb2Nlc3Mgc2hhbGwgYmUgdXNlZCBhcyBhIHRlbXBsYXRlIGZvciBwbGFubmluZyBhbmQgcnVubmluZyBhIHByb2plY3QuICBJdCBwcm92aWRlcyBhIGNvbXBsZXRlIGxpZmVjeWNsZSBtb2RlbCB3aXRoIHByZWRlZmluZWQgcGhhc2VzLCBpdGVyYXRpb25zLCBhbmQgYWN0aXZpdGllcyB0aGF0IGhhdmUgYmVlbiBkZXRhaWxlZCBieSBzZXF1ZW5jaW5nIHJlZmVyZW5jaW5nIG1ldGhvZCBjb250ZW50IGluIGJyZWFrZG93biBzdHJ1Y3R1cmVzLiAgSXQgaXMgZGVmaW5lZCBvbiB0aGUgYmFzaXMgb2YgZXhwZXJpZW5jZSB3aXRoIHBhc3QgcHJvamVjdHMgb3IgZW5nYWdlbWVudHMsIGFuZC9vciB0aGUgYmVzdCBwcmFjdGljZSB1c2Ugb2YgYSBkZXZlbG9wbWVudCBvciBkZWxpdmVyeSBhcHByb2FjaC4gIEl0IGRlZmluZXMgd2hhdCBnZXRzIHByb2R1Y2VkLCBob3cgdGhvc2UgaXRlbXMgYXJlIHByb2R1Y2VkLCBhbmQgdGhlIHJlcXVpcmVkIHN0YWZmaW5nIGluIHRoZSBmb3JtIG9mIGludGVncmF0ZWQgV29yaywgV29yayBQcm9kdWN0LCBhbmQgVGVhbSBCcmVha2Rvd24gU3RydWN0dXJlcy4gIEZvciBleGFtcGxlLCBhIHByb2Nlc3MgZW5naW5lZXIgY2FuIGRlZmluZSBhbHRlcm5hdGl2ZSBEZWxpdmVyeSBQcm9jZXNzZXMgZm9yIHNvZnR3YXJlIGRldmVsb3BtZW50IHByb2plY3RzIHRoYXQgZGlmZmVyIGluIHRoZSBzY2FsZSBvZiB0aGUgZW5nYWdlbWVudCBhbmQgc3RhZmZpbmcgbmVjZXNzYXJ5LCB0aGUgdHlwZSBvZiB0aGUgc29mdHdhcmUgYXBwbGljYXRpb24gdG8gYmUgZGV2ZWxvcGVkLCB0aGUgZGV2ZWxvcG1lbnQgbWV0aG9kcyBhbmQgdGVjaG5vbG9naWVzIHRvIGJlIHVzZWQsIGV0Yy4gIEFsdGhvdWdoLCB0aGUgRGVsaXZlcnkgUHJvY2VzcyBhaW1zIHRvIGNvdmVyIGEgd2hvbGUgcHJvamVjdCBpdCBrZWVwcyBjZXJ0YWluIGRlY2lzaW9uIHRoYXQgYXJlIHRvbyBwcm9qZWN0IHNwZWNpZmljIG9wZW4uICBGb3IgZXhhbXBsZSwgdGhlIGJyZWFrZG93biBzdHJ1Y3R1cmUgZGVmaW5lcyB3aGljaCBCcmVha2Rvd24gRWxlbWVudHMgaGF2ZSBtdWx0aXBsZSBvY2N1cnJlbmNlcyBvciBpcyByZXBlYXRhYmxlIHZpYSBpdCByZXNwZWN0aXZlIGF0dHJpYnV0ZXMsIGJ1dCBkb2VzIG5vdCBzYXkgaG93IG1hbnkgb2NjdXJyZW5jZXMgYW5kIGhvdyBtYW55IHJlcGVhdHMvaXRlcmF0aW9ucyBpdCB3aWxsIGhhdmUuICBUaGVzZSBkZWNpc2lvbnMgaGF2ZSB0byBiZSBkb25lIGJ5IGEgcHJvamVjdCBtYW5hZ2VyIHdoZW4gcGxhbm5pbmcgYSBjb25jcmV0ZSBwcm9qZWN0LCBwcm9qZWN0IHBoYXNlLCBvciBwcm9qZWN0IGl0ZXJhdGlvbnMuICBBIERlbGl2ZXJ5IFByb2Nlc3MgaXMgYWx3YXlzIGEgY29tcGxldGUgZGVzY3JpcHRpb24gb2YgYSBwcm9jZXNzIGluIHRlcm1zIG9mIGNvbXBsZXRlbmVzcyBvZiB0aGUgbGlmZWN5Y2xlLCBhcyB3ZWxsIGFzIGluIHRlcm1zIG9mIGFsbCB0aHJlZSB2aWV3cyBvbiB0aGUgcHJvY2VzcyB3aGljaCBhcmUgdGhlIFdvcmsgQnJlYWtkb3duIFN0cnVjdHVyZSwgV29yayBQcm9kdWN0IEJyZWFrZG93biBTdHJ1Y3R1cmUsIGFuZCBUZWFtIEJyZWFrZG93biBTdHJ1Y3R1cmUgaGF2ZSB0byBiZSBmdWxseSBhbmQgY29uc2lzdGVudGx5IHBvcHVsYXRlZC4gIENvbnNpc3RlbmN5IG9mIGEgRGVsaXZlcnkgUHJvY2VzcyBpcyBhY3R1YWxseSBlbnN1cmVkIGJ5IHRoZSBmYWN0IHRoYXQgYWxsIHRocmVlIGJyZWFrZG93bnMgYXJlIHJlcHJlc2VudGVkIGJ5IG9uZSBzaW5nbGUgZGF0YSBzdHJ1Y3R1cmUgYW5kIG9uZSBwYXJ0aWN1bGFyIGJyZWFrZG93biBzdWNoIGFzIFRlYW0gQnJlYWtkb3duIGlzIGp1c3QgYSB2aWV3IG9uIHRoYXQgZGF0YSBzdHJ1Y3R1cmUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpQcm9jZXNzIj4KLQkJCQk8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkNvbW11bmljYXRpb25zTWF0ZXJpYWwiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkVkdWNhdGlvbk1hdGVyaWFsIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJPC94c2Q6Y2hvaWNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkNhcGFiaWxpdHlQYXR0ZXJuIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lhbCBQcm9jZXNzIHRoYXQgZGVzY3JpYmVzIGEgcmV1c2FibGUgY2x1c3RlciBvZiBkb2luZyB3b3JrIGluIGNvbW1vbiBwcm9jZXNzIGFyZWFzLiAgQ2FwYWJpbGl0aWVzIFBhdHRlcm5zIGV4cHJlc3MgYW5kIGNvbW11bmljYXRlIHByb2Nlc3Mga25vd2xlZGdlIGZvciBhIGtleSBhcmVhIG9mIGludGVyZXN0IHN1Y2ggYXMgYSBEaXNjaXBsaW5lIGFuZCBjYW4gYmUgZGlyZWN0bHkgdXNlZCBieSBwcm9jZXNzIHByYWN0aXRpb25lciB0byBndWlkZSBoaXMgd29yay4gIFRoZXkgYXJlIGFsc28gdXNlZCBhcyBidWlsZGluZyBibG9ja3MgdG8gYXNzZW1ibGUgRGVsaXZlcnkgUHJvY2Vzc2VzIG9yIGxhcmdlciBDYXBhYmlsaXR5IFBhdHRlcm5zIGVuc3VyaW5nIG9wdGltYWwgcmV1c2UgYW5kIGFwcGxpY2F0aW9uIG9mIHRoZSBrZXkgcHJhY3RpY2VzIHRoZXkgZXhwcmVzcy4KLUEgQ2FwYWJpbGl0eSBQYXR0ZXJuIGlzIGEgc3BlY2lhbCBQcm9jZXNzIHRoYXQgZGVzY3JpYmVzIGEgcmV1c2FibGUgY2x1c3RlciBvZiBkb2luZyB3b3JrIGluIGEgZ2VuZXJhbCBwcm9jZXNzIGFyZWEgdGhhdCBwcm92aWRlcyBhIGNvbnNpc3RlbnQgZGV2ZWxvcG1lbnQgYXBwcm9hY2ggdG8gY29tbW9uIHByb2JsZW1zLiAgRXhhbXBsZXMgZm9yIENhcGFiaWxpdHkgUGF0dGVybiBjb3VsZCBiZSAndXNlIGNhc2UtYmFzZWQgcmVxdWlyZW1lbnRzIG1hbmFnZW1lbnQnLCAndXNlIGNhc2UgYW5hbHlzaXMnLCBvciAndW5pdCB0ZXN0aW5nJy4gVHlwaWNhbGx5IGJ1dCBub3QgbmVjZXNzYXJpbHksIENhcGFiaWxpdHkgUGF0dGVybnMgaGF2ZSB0aGUgc2NvcGUgb2Ygb25lIGRpc2NpcGxpbmUgcHJvdmlkaW5nIGEgYnJlYWtkb3duIG9mIHJldXNhYmxlIGNvbXBsZXggQWN0aXZpdGllcywgcmVsYXRpb25zaGlwcyB0byB0aGUgUm9sZXMgd2hpY2ggcGVyZm9ybSBUYXNrcyB3aXRoaW4gdGhlc2UgQWN0aXZpdGllcywgYXMgd2VsbCBhcyB0byB0aGUgV29yayBQcm9kdWN0cyB0aGF0IGFyZSB1c2VkIGFuZCBwcm9kdWNlZC4gIEEgY2FwYWJpbGl0eSBwYXR0ZXJuIGRvZXMgbm90IHJlbGF0ZSB0byBhbnkgc3BlY2lmaWMgcGhhc2Ugb3IgaXRlcmF0aW9uIG9mIGEgZGV2ZWxvcG1lbnQgbGlmZWN5Y2xlLCBhbmQgc2hvdWxkIG5vdCBpbXBseSBhbnkuICBJbiBvdGhlciB3b3JkcywgYSBwYXR0ZXJuIHNob3VsZCBiZSBkZXNpZ25lZCBpbiBhIHdheSB0aGF0IGl0IGlzIGFwcGxpY2FibGUgYW55d2hlcmUgaW4gYSBEZWxpdmVyeSBQcm9jZXNzLiAgVGhpcyBlbmFibGVzIGl0cyBBY3Rpdml0aWVzIHRvIGJlIGZsZXhpYmx5IGFzc2lnbmVkIHRvIHdoYXRldmVyIHBoYXNlcyB0aGVyZSBhcmUgaW4gdGhlIERlbGl2ZXJ5IFByb2Nlc3MgdG8gd2hpY2ggaXQgaXMgYmVpbmcgYXBwbGllZC4gIEl0IGlzIGEgZ29vZCBwcmFjdGljZSB0byBkZXNpZ24gYSBDYXBhYmlsaXR5IFBhdHRlcm4gdG8gcHJvZHVjZSBvbmUgb3IgbW9yZSBnZW5lcmljIERlbGl2ZXJhYmxlcy4gIFRoZSB0eXBpY2FsIGNvbmZpZ3VyYXRpb24gaXMgdGhhdCBlYWNoIEFjdGl2aXR5IGluIHRoZSBDYXBhYmlsaXR5IFBhdHRlcm4gcHJvZHVjZXMgb25lIERlbGl2ZXJhYmxlLCBhbmQgdGhlIGxhc3QgVGFzayBEZXNjcmlwdG9yIGluIHRoZSBBY3Rpdml0eSBleHBsaWNpdGx5IG91dHB1dHMganVzdCB0aGlzIERlbGl2ZXJhYmxlLiAgVGhpcyBlbmFibGVzIHRoZSBwcm9jZXNzIGVuZ2luZWVyIHRvIHNlbGVjdCBQYXR0ZXJucyBvciBqdXN0IEFjdGl2aXRpZXMgYnkgZGVjaWRpbmcgd2hpY2ggRGVsaXZlcmFibGVzIGFyZSByZXF1aXJlZC4gIEl0IGFsc28gb2ZmZXJzIGEgc2ltcGxlIGludGVncmF0aW9uIGFwcHJvYWNoOiBhbiBBY3Rpdml0eSBmcm9tIGEgY2FwYWJpbGl0eSBwYXR0ZXJuIGlzIGxpbmtlZCB0byB0aGUgUGhhc2Ugb3IgSXRlcmF0aW9uIHdoaWNoIGlzIHJlcXVpcmVkIHRvIHByb2R1Y2UgdGhlIEFjdGl2aXR5J3MgRGVsaXZlcmFibGUuICBLZXkgYXBwbGljYXRpb25zIGFyZWFzIG9mIC8gYXJlYXMgb2YgcmV1c2UgZm9yIENhcGFiaWxpdHkgUGF0dGVybnMgYXJlOgotLSBUbyBzZXJ2ZSBhcyBidWlsZGluZyBibG9ja3MgZm9yIGFzc2VtYmxpbmcgRGVsaXZlcnkgUHJvY2Vzc2VzIG9yIGxhcmdlciBDYXBhYmlsaXR5IFBhdHRlcm5zLiAgTm9ybWFsbHkgZGV2ZWxvcGluZyBhIERlbGl2ZXJ5IFByb2Nlc3MgaXMgbm90IGRvbmUgZnJvbSBzY3JhdGNoIGJ1dCBieSBzeXN0ZW1hdGljYWxseSBhcHBseWluZyBhbmQgYmluZGluZyBwYXR0ZXJucy4gIEluIGFkZGl0aW9uIHRvIHRoZSBzdGFuZGFyZCBwYXR0ZXJuIGFwcGxpY2F0aW9uIG9mICdjb3B5LWFuZC1tb2RpZnknLCB3aGljaCBhbGxvd3MgdGhlIHByb2Nlc3MgZW5naW5lZXIgdG8gaW5kaXZpZHVhbGx5IGN1c3RvbWl6ZSB0aGUgcGF0dGVybidzIGNvbnRlbnQgdG8gdGhlIHBhcnRpY3VsYXIgc2l0dWF0aW9uIGl0IGlzIGFwcGxpZWQgZm9yLCB0aGUgUGx1Z2luIG1ldGEtbW9kZWwgcGFja2FnZSAoU2VjdGlvbiA2LjEpIGludHJvZHVjZXMgZXZlbiBtb3JlIHNvcGhpc3RpY2F0ZWQgaW5oZXJpdGFuY2UgcmVsYXRpb25zaGlwcyB0aGF0IHN1cHBvcnQgZHluYW1pYyBiaW5kaW5nIG9mIHBhdHRlcm5zIChpLmUuIHRoZSBwYXR0ZXJuIGlzIHJlZmVyZW5jZWQgYW5kIG5vdCBjb3BpZWQpLiAgVGhpcyB1bmlxdWUgbmV3IHdheSBvZiByZXVzaW5nIHByb2Nlc3Mga25vd2xlZGdlIGFsbG93cyB0byBmYWN0b3Igb3V0IGNvbW1vbmx5IHJlb2NjdXJyaW5nIEFjdGl2aXRpZXMgaW50byBwYXR0ZXJucyBhbmQgdG8gYXBwbHkgdGhlbSBvdmVyIGFuZCBvdmVyIGFnYWluIGZvciBhIHByb2Nlc3MuICBXaGVuIHRoZSBwYXR0ZXJuIGlzIGJlaW5nIHJldmlzZWQgb3IgdXBkYXRlZCwgYWxsIGNoYW5nZXMgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IHJlZmxlY3RlZCBpbiBhbGwgcGF0dGVybiBhcHBsaWNhdGlvbiBpbiBhbGwgcHJvY2Vzc2VzIGJlY2F1c2Ugb2YgdGhlIGR5bmFtaWMgYmluZGluZy4KLS0gVG8gc3VwcG9ydCBkaXJlY3QgZXhlY3V0aW9uIGluIGEgZGV2ZWxvcG1lbnQgcHJvamVjdCB0aGF0IGRvZXMgbm90IHdvcmsgZm9sbG93aW5nIGEgd2VsbC1kZWZpbmVkIHByb2Nlc3MsIGJ1dCB3b3JrcyBiYXNlZCBvbiBsb29zZWx5IGNvbm5lY3RlZCBwcm9jZXNzIGZyYWdtZW50cyBvZiBiZXN0IHByYWN0aWNlcyBpbiBhIGZsZXhpYmxlIG1hbm5lciAoZS5nLiBBZ2lsZSBEZXZlbG9wbWVudCkuCi0tIFRvIHN1cHBvcnQgcHJvY2VzcyBlZHVjYXRpb24gYnkgZGVzY3JpYmluZyBrbm93bGVkZ2UgZm9yIGEga2V5IGFyZWEgc3VjaCBhcyBiZXN0IHByYWN0aWNlcyBvbiBob3cgdG8gcGVyZm9ybSB0aGUgd29yayBmb3IgYSBEaXNjaXBsaW5lIChlLmcuIFJlcXVpcmVtZW50cyBNYW5hZ2VtZW50KSwgZm9yIGEgc3BlY2lmaWMgZGV2ZWxvcG1lbnQgdGVjaG5pcXVlIChhc3BlY3Qtb3JpZW50ZWQgZGV2ZWxvcG1lbnQpLCBvciBhIHNwZWNpZmljIHRlY2huaWNhbCBhcmVhIChlLmcuIHJlbGF0aW9uYWwgZGF0YWJhc2UgZGVzaWduKSwgd2hpY2ggaXMgdXNlZCBmb3IgZWR1Y2F0aW9uIGFuZCB0ZWFjaGluZy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOlByb2Nlc3MiLz4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpYWwgUHJvY2VzcyB0aGF0IGlzIHByZXBhcmVkIGZvciBpbnN0YW50aWF0aW9uIGJ5IGEgcHJvamVjdCBwbGFubmluZyB0b29sLiAgVHlwaWNhbGx5LCBpdCBpcyBjcmVhdGVkIGJhc2VkIG9uIGEgUHJvY2VzcyBzdWNoIGFzIGEgRGVsaXZlcnkgUHJvY2VzcyBhcyBhIHdob2xlIChlLmcuIGluIGNhc2Ugb2YgYSB3YXRlcmZhbGwtYmFzZWQgZGV2ZWxvcG1lbnQgYXBwcm9hY2gpIG9yIGluIHBhcnRzIChlLmcuIGluIGNhc2Ugb2YgYW4gaXRlcmF0aXZlIGRldmVsb3BtZW50IGFwcHJvYWNoKS4KLUEgUHJvY2VzcyBQbGFubmluZyBUZW1wbGF0ZSByZXByZXNlbnRzIGEgcGFydGlhbGx5IGZpbmlzaGVkIHBsYW4gZm9yIGEgY29uY3JldGUgcHJvamVjdC4gIEl0IHVzZXMgdGhlIHNhbWUgaW5mb3JtYXRpb24gc3RydWN0dXJlcyBhcyBhbGwgb3RoZXIgUHJvY2VzcyBUeXBlcyB0byByZXByZXNlbnQgdGVtcGxhdGVzIGZvciBwcm9qZWN0IHBsYW5zLiAgSG93ZXZlciwgY2VydGFpbiBwbGFubmluZyBkZWNpc2lvbnMgaGF2ZSBhbHJlYWR5IGJlZW4gYXBwbGllZCB0byB0aGUgdGVtcGxhdGUgYXMgd2VsbCBhcyBpbmZvcm1hdGlvbiBoYXMgYmVlbiByZW1vdmVkIGFuZC9vciByZWZvcm1hdHRlZCB0byBiZSByZWFkeSBmb3IgZXhwb3J0IHRvIGEgc3BlY2lmaWMgcGxhbm5pbmcgdG9vbC4gIEV4YW1wbGVzIGZvciBzdWNoIGRlY2lzaW9ucyBhcmU6IGEgdGVtcGxhdGUgaGFzIGJlZW4gY3JlYXRlZCB0byByZXByZXNlbnQgYSBwbGFuIGZvciBhIHBhcnRpY3VsYXIgSXRlcmF0aW9uIGluIGFuIGl0ZXJhdGl2ZSBkZXZlbG9wbWVudCBwcm9qZWN0LCB3aGljaCBmciBleGFtcGxlIGRpc3Rpbmd1aXNoZXMgZWFybHkgZnJvbSBsYXRlIGl0ZXJhdGlvbnMgaW4gdGhlIEVsYWJvcmF0aW9uIHBoYXNlIG9mIGEgcHJvamVjdDsgaWYgdGhlIHRhcmdldGVkIHBsYW5uaW5nIHRvb2wgY2Fubm90IHJlcHJlc2VudCBpbnB1dCBhbmQgb3V0cHV0IG9mIFRhc2ssIHRoZW4gdGhlc2UgaGF2ZSBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgc3RydWN0dXJlOyBjZXJ0YWluIHJlcGV0aXRpb25zIGhhdmUgYmVlbiBhbHJlYWR5IGFwcGxpZWQsIGUuZy4gc3RhdGluZyB0aGF0IGEgY3ljbGUgb2Ygc3BlY2lmaWMgVGFzayBncm91cGVkIGluIGFuIEFjdGl2aXR5IGhhdmUgdG8gYmUgcmVwZWF0ZWQgbi10aW1lczsgZXRjLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6UHJvY2VzcyI+Ci0JCQkJPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJCYXNlUHJvY2VzcyIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCTwveHNkOmNob2ljZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJQcm9jZXNzUGFja2FnZSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpYWwgTWV0aG9kIFBhY2thZ2UgdGhhdCBjb250YWlucyBQcm9jZXNzIEVsZW1lbnRzLCBvbmx5LgotQSBrZXkgc2VwYXJhdGlvbiBvZiBjb25jZXJucyBpbiBVTUEgaXMgdGhlIGRpc3RpbmN0aW9uIGJldHdlZW4gTWV0aG9kIENvbnRlbnQgYW5kIFByb2Nlc3MuICBUaGlzIHNlcGFyYXRpb24gaXMgZW5mb3JjZWQgYnkgc3BlY2lhbCBwYWNrYWdlIHR5cGVzLCB3aGljaCBkbyBub3QgYWxsb3cgdGhlIG1peGluZyBvZiBtZXRob2QgY29udGVudCB3aXRoIHByb2Nlc3Nlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOk1ldGhvZFBhY2thZ2UiPgotCQkJCTx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUHJvY2Vzc0VsZW1lbnQiIHR5cGU9InVtYTpQcm9jZXNzRWxlbWVudCIvPgotCQkJCTwveHNkOmNob2ljZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkNvbXByaXNlcyBvZiBhIGxpc3Qgb2YgaW50ZXJmYWNlIHNwZWNpZmljYXRpb25zIChzaW1pbGFyIHRvIG9wZXJhdGlvbiBkZWNsYXJhdGlvbnMpIHRoYXQgZXhwcmVzcyBpbnB1dHMgYW5kIG91dHB1dHMgZm9yIGEgcHJvY2VzcyBjb21wb25lbnQuICBUaGVzZSBpbnRlcmZhY2Ugc3BlY2lmaWNhdGlvbnMgYXJlIGV4cHJlc3NlZCB1c2luZyBUYXNrIERlc2NyaXB0b3JzIHdoaWNoIGFyZSBub3QgbGlua2VkIHRvIFRhc2tzIHRoYXQgYXJlIHJlbGF0ZWQgdG8gV29yayBQcm9kdWN0IERlc2NyaXB0b3JzIGFzIHdlbGwgYXMgb3B0aW9uYWwgYSBSb2xlIERlc2NyaXB0b3IuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpCcmVha2Rvd25FbGVtZW50Ij4KLQkJCQk8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkludGVyZmFjZVNwZWNpZmljYXRpb24iIHR5cGU9InVtYTpUYXNrRGVzY3JpcHRvciIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iSW50ZXJmYWNlSU8iIHR5cGU9InVtYTpXb3JrUHJvZHVjdERlc2NyaXB0b3IiLz4KLQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUHJvY2Vzc0NvbXBvbmVudCI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpYWwgUHJvY2VzcyBQYWNrYWdlIHRoYXQgYXBwbGllcyB0aGUgcHJpbmNpcGxlcyBvZiBlbmNhcHN1bGF0aW9uLiAgQSBQcm9jZXNzIENvbXBvbmVudCByZWFsaXplcyBvbmUgb3IgbW9yZSBJbnRlcmZhY2VzIHdoaWNoIHNwZWNpZnkgaW5wdXRzIGFuZCBvdXRwdXRzIG9mIHRoZSBjb21wb25lbnQuIFRoZXJlIG1pZ2h0IGJlIG1hbnkgY29tcG9uZW50cyByZWFsaXppbmcgdGhlIHNhbWUgaW50ZXJmYWNlcywgYnV0IHVzaW5nIGRpZmZlcmVudCB0ZWNobmlxdWVzIHRvIGFjaGlldmUgc2ltaWxhciBvdXRwdXRzIGZvciBzaW1pbGFyIGlucHV0cy4gIFdoZXJlYXMgdGhlIENvbXBvbmVudCBJbnRlcmZhY2VzIHJlcHJlc2VudCBjb21wb25lbnQgc3BlY2lmaWNhdGlvbnMgKGJsYWNrIGJveCBkZXNjcmlwdGlvbnMgb2YgdGhlIGNvbXBvbmVudCksIGdvb2QgY2FuZGlkYXRlcyBmb3IgY29tcG9uZW50IHJlYWxpemF0aW9ucyBjYW4gYmUgZm91bmQgaW4gQ2FwYWJpbGl0eSBQYXR0ZXJucyAod2hpdGUgYm94IGRlc2NyaXB0aW9ucyBmb3IgdGhlIGNvbXBvbmVudCkuCi1VTUEgc3VwcG9ydHMgcmVwbGFjZWFibGUgYW5kIHJldXNhYmxlIFByb2Nlc3MgQ29tcG9uZW50cyByZWFsaXppbmcgdGhlIHByaW5jaXBsZXMgb2YgZW5jYXBzdWxhdGlvbi4gQ2VydGFpbiBzaXR1YXRpb25zIGluIGEgc29mdHdhcmUgZGV2ZWxvcG1lbnQgcHJvamVjdCBtaWdodCByZXF1aXJlIHRoYXQgY29uY3JldGUgcmVhbGl6YXRpb25zIG9mIHBhcnRzIG9mIHRoZSBwcm9jZXNzIHJlbWFpbiB1bmRlY2lkZWQgb3Igd2lsbCBiZSBkZWNpZGVkIGJ5IHRoZSBleGVjdXRpbmcgdGVhbSBpdHNlbGYgKGUuZy4gaW4gb3V0c291cmNpbmcgc2l0dWF0aW9ucykuICBVTUEgcHJvdmlkZXMgYSB1bmlxdWUgY29tcG9uZW50IGNvbmNlcHQgZGVmaW5pbmcgaW50ZXJmYWNlcyBmb3Igd29yayBwcm9kdWN0IGlucHV0IGFuZCBvdXRwdXQsIGFsbG93aW5nIHRyZWF0aW5nIHRoZSBhY3R1YWwgZGVmaW5pdGlvbiBvZiB0aGUgd29yayB0aGF0IHByb2R1Y2VzIHRoZSBvdXRwdXRzIGFzIGEgImJsYWNrIGJveCIuICBBdCBhbnkgcG9pbnQgZHVyaW5nIGEgcHJvamVjdCB0aGUgY29tcG9uZW50ICJyZWFsaXphdGlvbiIgZGV0YWlsaW5nIHRoZSB3b3JrIGNhbiBiZSBhZGRlZCB0byB0aGUgcHJvY2Vzcy4gIFRoZSBjb21wb25lbnQgYXBwcm9hY2ggYWxzbyBhbGxvd3MgdGhhdCBkaWZmZXJlbnQgc3R5bGVzIG9yIHRlY2huaXF1ZXMgb2YgZG9pbmcgd29yayBjYW4gYmUgcmVwbGFjZWQgd2l0aCBvbmUgYW5vdGhlci4gIEZvciBleGFtcGxlLCBhIHNvZnR3YXJlIGNvZGUgb3V0cHV0IG9mIGEgY29tcG9uZW50IGNvdWxkIGJlIHByb2R1Y2VkIHdpdGggYSBtb2RlbC1kcml2ZW4gZGV2ZWxvcG1lbnQgb3IgYSBjb2RlLWNlbnRyaWMgdGVjaG5pcXVlLiAgVGhlIGNvbXBvbmVudCBjb25jZXB0IGVuY2Fwc3VsYXRlcyB0aGUgYWN0dWFsIHdvcmsgYW5kIGxldHMgdGhlIGRldmVsb3BtZW50IHRlYW0gY2hvb3NlIHRoZSBhcHByb3ByaWF0ZSB0ZWNobmlxdWUgYW5kIGZpbGwgdGhlIGNvbXBvbmVudCdzIHJlYWxpemF0aW9uIHdpdGggdGhlaXIgY2hvaWNlIG9mIEFjdGl2aXRpZXMgdGhhdCBwcm9kdWNlIHRoZSByZXF1aXJlZCBvdXRwdXRzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6UHJvY2Vzc1BhY2thZ2UiPgotCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJDb3B5cmlnaHQiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iSW50ZXJmYWNlIiB0eXBlPSJ1bWE6UHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJQcm9jZXNzIiB0eXBlPSJ1bWE6UHJvY2VzcyIvPgotCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImF1dGhvcnMiIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+RXZlcnkgTWV0aG9kIFVuaXQgaXMgYmVpbmcgY3JlYXRlZCBhbmQgb3duZWQgYnkgYW4gYXV0aG9yIG9yIGF1dGhvcmluZyB0ZWFtLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImNoYW5nZURhdGUiIHR5cGU9InhzZDpkYXRlVGltZSI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZGF0ZSB0aGUgbGFzdCBjaGFuZ2UgdGhhdCByZXN1bHRlZCBpbnRvIHRoaXMgdmVyc2lvbiBoYXMgYmVlbiBtYWRlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImNoYW5nZURlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgbGFzdCBjaGFuZ2UgdGhhdCByZXN1bHRlZCBpbnRvIHRoaXMgdmVyc2lvbi48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ2ZXJzaW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkV2ZXJ5IFBhY2thZ2UgaGFzIGEgdmVyc2lvbiBudW1iZXIgdXNlZCB0byB0cmFjayBjaGFuZ2VzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ik1ldGhvZFBsdWdpbiI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpYWwgTWV0aG9kIFVuaXQgdGhhdCByZXByZXNlbnRzIGEgcGh5c2ljYWwgY29udGFpbmVyIGZvciBNZXRob2QgUGFja2FnZXMuICBJdCBkZWZpbmVzIGEgZ3JhbnVsYXJpdHkgbGV2ZWwgZm9yIHRoZSBtb2R1bGFyaXphdGlvbiBhbmQgb3JnYW5pemF0aW9uIG9mIG1ldGhvZCBjb250ZW50IGFuZCBwcm9jZXNzZXMuICBBIE1ldGhvZCBQbHVnaW4gY2FuIGV4dGVuZCBtYW55IG90aGVyIE1ldGhvZCBQbHVnaW5zIGFuZCBpdCBjYW4gYmUgZXh0ZW5kZWQgYnkgbWFueSBNZXRob2QgUGx1Z2lucy4gIEl0IGNhbiBhbHNvIGJlIHVzZWQgc3RhbmQtYWxvbmUsIGkuZS4gd2l0aCBubyBFeHRlbnNpb24gcmVsYXRpb25zaGlwIHRvIG90aGVyIHBsdWctaW5zLgotTWV0aG9kIFBsdWdpbiBjb25jZXB0dWFsbHkgcmVwcmVzZW50cyBhIHVuaXQgZm9yIGNvbmZpZ3VyYXRpb24sIG1vZHVsYXJpemF0aW9uLCBleHRlbnNpb24sIHBhY2thZ2luZywgYW5kIGRlcGxveW1lbnQgb2YgbWV0aG9kIGNvbnRlbnQgYW5kIHByb2Nlc3Nlcy4gIEEgUHJvY2VzcyBFbmdpbmVlciBzaGFsbCBkZXNpZ24gaGlzIFBsdWdpbnMgYW5kIGFsbG9jYXRlIGhpcyBjb250ZW50IHRvIHRoZXNlIFBsdWdpbnMgd2l0aCByZXF1aXJlbWVudHMgZm9yIGV4dGVuc2liaWxpdHksIG1vZHVsYXJpdHksIHJldXNlLCBhbmQgbWFpbnRhaW5hYmlsaXR5IGluIG1pbmQuCi1TcGVjaWFsIGV4dGVuc2liaWxpdHkgbWVjaGFuaXNtcyBkZWZpbmVkIGZvciB0aGUgbWV0YS1jbGFzc2VzIFZhcmlhYmlsaXR5IEVsZW1lbnQgYW5kIFByb2Nlc3MgQ29udHJpYnV0aW9uIGFsbG93IFBsdWdpbiBjb250ZW50IHRvIGRpcmVjdGx5IGNvbnRyaWJ1dGUgbmV3IGNvbnRlbnQsIHJlcGxhY2UgZXhpc3RpbmcgY29udGVudCwgb3IgdG8gY3Jvc3MtcmVmZXJlbmNlIHRvIGFueSBDb250ZW50IEVsZW1lbnQgb3IgUHJvY2VzcyB3aXRoaW4gYW5vdGhlciBQbHVnaW4gdGhhdCBpdCBleHRlbmRzLiAgU2ltaWxhciB0byBVTUwgMi4wJ3MgJ3BhY2thZ2UgbWVyZ2UnIG1lY2hhbmlzbSB0cmFuc2Zvcm1hdGlvbiBpbnRlcnByZXRhdGlvbnMsIGludGVycHJldGluZyB0aGVzZSBNZXRob2QgUGx1Z2luIG1lY2hhbmlzbXMgcmVzdWx0cyBpbnRvIG5ldyBleHRlbmRlZCBNZXRob2QgQ29udGVudCBhbmQgUHJvY2Vzc2VzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6TWV0aG9kVW5pdCI+Ci0JCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlJlZmVyZW5jZWRNZXRob2RQbHVnaW4iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Ik1ldGhvZFBhY2thZ2UiIHR5cGU9InVtYTpNZXRob2RQYWNrYWdlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0idXNlckNoYW5nZWFibGUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6ZWxlbWVudCBuYW1lPSJNZXRob2RQbHVnaW4iIHR5cGU9InVtYTpNZXRob2RQbHVnaW4iPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWFsIE1ldGhvZCBVbml0IHRoYXQgcmVwcmVzZW50cyBhIHBoeXNpY2FsIGNvbnRhaW5lciBmb3IgTWV0aG9kIFBhY2thZ2VzLiAgSXQgZGVmaW5lcyBhIGdyYW51bGFyaXR5IGxldmVsIGZvciB0aGUgbW9kdWxhcml6YXRpb24gYW5kIG9yZ2FuaXphdGlvbiBvZiBtZXRob2QgY29udGVudCBhbmQgcHJvY2Vzc2VzLiAgQSBNZXRob2QgUGx1Z2luIGNhbiBleHRlbmQgbWFueSBvdGhlciBNZXRob2QgUGx1Z2lucyBhbmQgaXQgY2FuIGJlIGV4dGVuZGVkIGJ5IG1hbnkgTWV0aG9kIFBsdWdpbnMuICBJdCBjYW4gYWxzbyBiZSB1c2VkIHN0YW5kLWFsb25lLCBpLmUuIHdpdGggbm8gRXh0ZW5zaW9uIHJlbGF0aW9uc2hpcCB0byBvdGhlciBwbHVnLWlucy4KLU1ldGhvZCBQbHVnaW4gY29uY2VwdHVhbGx5IHJlcHJlc2VudHMgYSB1bml0IGZvciBjb25maWd1cmF0aW9uLCBtb2R1bGFyaXphdGlvbiwgZXh0ZW5zaW9uLCBwYWNrYWdpbmcsIGFuZCBkZXBsb3ltZW50IG9mIG1ldGhvZCBjb250ZW50IGFuZCBwcm9jZXNzZXMuICBBIFByb2Nlc3MgRW5naW5lZXIgc2hhbGwgZGVzaWduIGhpcyBQbHVnaW5zIGFuZCBhbGxvY2F0ZSBoaXMgY29udGVudCB0byB0aGVzZSBQbHVnaW5zIHdpdGggcmVxdWlyZW1lbnRzIGZvciBleHRlbnNpYmlsaXR5LCBtb2R1bGFyaXR5LCByZXVzZSwgYW5kIG1haW50YWluYWJpbGl0eSBpbiBtaW5kLgotU3BlY2lhbCBleHRlbnNpYmlsaXR5IG1lY2hhbmlzbXMgZGVmaW5lZCBmb3IgdGhlIG1ldGEtY2xhc3NlcyBWYXJpYWJpbGl0eSBFbGVtZW50IGFuZCBQcm9jZXNzIENvbnRyaWJ1dGlvbiBhbGxvdyBQbHVnaW4gY29udGVudCB0byBkaXJlY3RseSBjb250cmlidXRlIG5ldyBjb250ZW50LCByZXBsYWNlIGV4aXN0aW5nIGNvbnRlbnQsIG9yIHRvIGNyb3NzLXJlZmVyZW5jZSB0byBhbnkgQ29udGVudCBFbGVtZW50IG9yIFByb2Nlc3Mgd2l0aGluIGFub3RoZXIgUGx1Z2luIHRoYXQgaXQgZXh0ZW5kcy4gIFNpbWlsYXIgdG8gVU1MIDIuMCdzICdwYWNrYWdlIG1lcmdlJyBtZWNoYW5pc20gdHJhbnNmb3JtYXRpb24gaW50ZXJwcmV0YXRpb25zLCBpbnRlcnByZXRpbmcgdGhlc2UgTWV0aG9kIFBsdWdpbiBtZWNoYW5pc21zIHJlc3VsdHMgaW50byBuZXcgZXh0ZW5kZWQgTWV0aG9kIENvbnRlbnQgYW5kIFByb2Nlc3Nlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCTwveHNkOmVsZW1lbnQ+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJNZXRob2RDb25maWd1cmF0aW9uIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgY29sbGVjdGlvbiBvZiBzZWxlY3RlZCBNZXRob2QgTW9kZWxzIGFuZCBNZXRob2RQYWNrYWdlcy4gQSBjb25maWd1cmF0aW9uIGNhbiBiZSBleHBvcnRlZCBpbnRvIGl0cyBvd24gc3RhbmRhbG9uZSBsaWJyYXJ5IHdoZW4gaXQgaW5jbHVkZXMgdGhlIGZ1bGwgdHJhbnNpdGl2ZSBjbG9zdXJlIG9mIGFsbCBlbGVtZW50cyBhbGwgb3RoZXIgZWxlbWVudHMgZGVwZW5kIG9uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6TWV0aG9kVW5pdCI+Ci0JCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkJhc2VDb25maWd1cmF0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJNZXRob2RQbHVnaW5TZWxlY3Rpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Ik1ldGhvZFBhY2thZ2VTZWxlY3Rpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkRlZmF1bHRWaWV3IiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlByb2Nlc3NWaWV3IiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6ZWxlbWVudCBuYW1lPSJNZXRob2RDb25maWd1cmF0aW9uIiB0eXBlPSJ1bWE6TWV0aG9kQ29uZmlndXJhdGlvbiI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIGNvbGxlY3Rpb24gb2Ygc2VsZWN0ZWQgTWV0aG9kIE1vZGVscyBhbmQgTWV0aG9kUGFja2FnZXMuIEEgY29uZmlndXJhdGlvbiBjYW4gYmUgZXhwb3J0ZWQgaW50byBpdHMgb3duIHN0YW5kYWxvbmUgbGlicmFyeSB3aGVuIGl0IGluY2x1ZGVzIHRoZSBmdWxsIHRyYW5zaXRpdmUgY2xvc3VyZSBvZiBhbGwgZWxlbWVudHMgYWxsIG90aGVyIGVsZW1lbnRzIGRlcGVuZCBvbi48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCTwveHNkOmVsZW1lbnQ+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJNZXRob2RMaWJyYXJ5Ij4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgTWV0aG9kIExpYnJhcnkgaXMgYSBwaHlzaWNhbCBjb250YWluZXIgZm9yIE1ldGhvZCBQbHVnaW5zIGFuZCBNZXRob2QgQ29uZmlndXJhdGlvbiBkZWZpbml0aW9ucy4gIEFsbCBNZXRob2QgRWxlbWVudHMgYXJlIHN0b3JlZCBpbiBhIE1ldGhvZCBMaWJyYXJ5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6TWV0aG9kVW5pdCI+Ci0JCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Ik1ldGhvZFBsdWdpbiIgdHlwZT0idW1hOk1ldGhvZFBsdWdpbiIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iTWV0aG9kQ29uZmlndXJhdGlvbiIgdHlwZT0idW1hOk1ldGhvZENvbmZpZ3VyYXRpb24iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDplbGVtZW50IG5hbWU9Ik1ldGhvZExpYnJhcnkiIHR5cGU9InVtYTpNZXRob2RMaWJyYXJ5Ij4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgTWV0aG9kIExpYnJhcnkgaXMgYSBwaHlzaWNhbCBjb250YWluZXIgZm9yIE1ldGhvZCBQbHVnaW5zIGFuZCBNZXRob2QgQ29uZmlndXJhdGlvbiBkZWZpbml0aW9ucy4gIEFsbCBNZXRob2QgRWxlbWVudHMgYXJlIHN0b3JlZCBpbiBhIE1ldGhvZCBMaWJyYXJ5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JPC94c2Q6ZWxlbWVudD4KLTwveHNkOnNjaGVtYT4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9tb2RlbC9FUEZfU2NoZW1hXzIwMDYwOTA3MTMzNC54c2QgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvbW9kZWwvRVBGX1NjaGVtYV8yMDA2MDkwNzEzMzQueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZDNlNGZlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9tb2RlbC9FUEZfU2NoZW1hXzIwMDYwOTA3MTMzNC54c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxNDA5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tIEVQRiBVTUEgWE1MIERhdGEgSW50ZXJjaGFuZ2UgU2NoZW1hIC0tPgotPHhzZDpzY2hlbWEgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgeG1sbnM6dW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjMiIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC4zIj4KLQk8eHNkOnNpbXBsZVR5cGUgbmFtZT0iV29ya09yZGVyVHlwZSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5SZXByZXNlbnRzIGEgcmVsYXRpb25zaGlwIGJldHdlZW4gdHdvIEJyZWFrZG93biBFbGVtZW50IGluIHdoaWNoIG9uZSBCcmVha2Rvd24gRWxlbWVudCBkZXBlbmRzIG9uIHRoZSBzdGFydCBvciBmaW5pc2ggb2YgYW5vdGhlciBCcmVha2Rvd24gRWxlbWVudCBpbiBvcmRlciB0byBiZWdpbiBvciBlbmQuIFRoaXMgZW51bWVyYXRpb24gZGVmaW5lcyB0aGUgZGlmZmVyZW50IHR5cGVzIG9mIFdvcmsgT3JkZXIgcmVsYXRpb25zaGlwcyBhdmFpbGFibGUgaW4gVU1BIGFuZCBpcyB1c2VkIHRvIHByb3ZpZGUgdmFsdWVzIGZvciBXb3JrIE9yZGVyJ3MgbGlua1R5cGUgYXR0cmlidXRlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOk5DTmFtZSI+Ci0JCQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJmaW5pc2hUb1N0YXJ0Ii8+Ci0JCQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJmaW5pc2hUb0ZpbmlzaCIvPgotCQkJPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ic3RhcnRUb1N0YXJ0Ii8+Ci0JCQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJzdGFydFRvRmluaXNoIi8+Ci0JCTwveHNkOnJlc3RyaWN0aW9uPgotCTwveHNkOnNpbXBsZVR5cGU+Ci0JPHhzZDpzaW1wbGVUeXBlIG5hbWU9IlZhcmlhYmlsaXR5VHlwZSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BbiBFbnVtZXJhdGlvbiB1c2VkIGZvciB2YWx1ZXMgZm9yIGluc3RhbmNlcyBvZiBWYXJpYWJpbGl0eSBFbGVtZW50J3MgYXR0cmlidXRlIHZhcmlhYmlsaXR5VHlwZS4gIEl0IGRlZmluZXMgdGhlIG5hdHVyZSBvZiBob3cgYSBWYXJpYWJpbGl0eSBFbGVtZW50IGV4dGVuZHMgYW5vdGhlciBWYXJpYWJpbGl0eSBFbGVtZW50LiBTZWUgZW51bWVyYXRpb24gbGl0ZXJhbHMgZm9yIGRlZmluaXRpb25zIGZvciBlYWNoIHR5cGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6TkNOYW1lIj4KLQkJCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Im5hIi8+Ci0JCQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJjb250cmlidXRlcyIvPgotCQkJPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iZXh0ZW5kcyIvPgotCQkJPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0icmVwbGFjZXMiLz4KLQkJCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImxvY2FsQ29udHJpYnV0aW9uIi8+Ci0JCQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJsb2NhbFJlcGxhY2VtZW50Ii8+Ci0JCQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJleHRlbmRzUmVwbGFjZXMiLz4KLQkJPC94c2Q6cmVzdHJpY3Rpb24+Ci0JPC94c2Q6c2ltcGxlVHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkVsZW1lbnQiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBVTUwgMi4wIG1ldGEtY2xhc3MgRWxlbWVudC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iTmFtZWRFbGVtZW50Ij4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgVU1MIDIuMCBtZXRhLWNsYXNzIE5hbWVkIEVsZW1lbnQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpFbGVtZW50Ij4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUGFja2FnZWFibGVFbGVtZW50Ij4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgVU1MIDIuMCBtZXRhLWNsYXNzIFBhY2thZ2FibGUgRWxlbWVudC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOk5hbWVkRWxlbWVudCIvPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ik1ldGhvZEVsZW1lbnQiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+VGhlIHJvb3QgZ2VuZXJhbGl6YXRpb24gZm9yIGFsbCBVTUEgTWV0aG9kIEVsZW1lbnRzLiAgRGVmaW5lcyBhIGNvbW1vbiBzZXQgb2YgYXR0cmlidXRlcyBpbmhlcml0ZWQgYnkgYWxsIFVNQSBNZXRob2QgRWxlbWVudHMuICBNZXRob2QgRWxlbWVudCBpdHNlbGYgaXMgZGVyaXZlZCBmcm9tIFBhY2thZ2VhYmxlIEVsZW1lbnQgZnJvbSB0aGUgVU1MIDIuMCBJbmZyYXN0cnVjdHVyZS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOlBhY2thZ2VhYmxlRWxlbWVudCI+Ci0JCQkJPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJPd25lZFJ1bGUiIHR5cGU9InVtYTpDb25zdHJhaW50Ij4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyB0aGUgcGFja2FnaW5nIHJ1bGVzIGZvciB0aGlzIE1ldGhvZCBFbGVtZW50LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCTwveHNkOmNob2ljZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5FdmVyeSBpbnN0YW5jZSBvZiBNZXRob2QgRWxlbWVudCBoYXMgYSBnbG9iYWwgdW5pcXVlIGlkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImJyaWVmRGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+RXZlcnkgaW5zdGFuY2Ugb2YgTWV0aG9kIEVsZW1lbnQgc2hhbGwgYmUgYnJpZWZseSBkZXNjcmliZWQgd2l0aCBvbmUgb3IgdHdvIHNlbnRlbmNlcyBzdW1tYXJpemluZyB0aGUgZWxlbWVudC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzdXBwcmVzc2VkIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5JZiBhIFZhcmlhYmlsaXR5IEVsZW1lbnQgaXMgZGVyaXZlZCBmcm9tIGFub3RoZXIgVmFyaWFiaWxpdHkgRWxlbWVudCB1c2luZyB0aGUgImV4dGVuZHMiIFZhcmlhYmlsaXR5IFNwZWNpYWxpemF0aW9uLCB0aGVuIHRoaXMgYXR0cmlidXRlIGNhbiBiZSB1c2VkIHRvIHN1cHByZXNzIGluaGVyaXRlZCBNZXRob2QgRWxlbWVudHMgdGhhdCB3ZXJlIHBhcnQgb2YgdGhlIGJhc2VkLW9uIFZhcmlhYmlsaXR5IEVsZW1lbnQsIHdoaWNoIGNhbiBiZSBhbnkgdHlwZSBvZiBNZXRob2QgRWxlbWVudC4gIEluIG90aGVyIHdvcmRzLCBpZiB0aGlzIGF0dHJpYnV0ZSBpcyBzZXQgdG8gdHJ1ZSBvbiBhIE1ldGhvZCBFbGVtZW50IHRoYXQgaGFzIHRoZSBzYW1lIG5hbWUgdGhhbiBhbiBpbmhlcml0ZWQgbWV0aG9kIGVsZW1lbnQgdGhlbiBpdCB3aWxsIG5vdCBiZSByZWdhcmRlZCBhcyBpbmhlcml0ZWQgYXQgYWxsLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9Im9yZGVyaW5nR3VpZGUiIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+VXNlZCBmb3IgQ0FTRSB0b29sIHJlYWxpemF0aW9ucyBvZiB0aGlzIG1vZGVsIHRvIGNvbnRhaW4gaW5mb3JtYXRpb24gYWJvdXQgbGF5b3V0IGFuZCBvcmRlcmluZyBvZiB0aGUgbWV0aG9kIGVsZW1lbnQgYW5kIGl0cyBwYXJ0cy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJDb25zdHJhaW50Ij4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgZ2VuZXJhbGl6ZWQgTWV0aG9kIEVsZW1lbnQgdGhhdCByZXByZXNlbnRzIGEgY29uZGl0aW9uIG9yIHJlc3RyaWN0aW9uIGV4cHJlc3NlZCBpbiBuYXR1cmFsIGxhbmd1YWdlIHRleHQgb3IgaW4gYSBtYWNoaW5lIHJlYWRhYmxlIGxhbmd1YWdlIGZvciB0aGUgcHVycG9zZSBvZiBkZWNsYXJpbmcgc29tZSBvZiB0aGUgc2VtYW50aWNzIG9mIGEgTWV0aG9kIEVsZW1lbnQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpNZXRob2RFbGVtZW50Ij4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtYWluRGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+U3RvcmVzIHRoZSBtYWluIGRlZmluaXRpb24gb2YgdGhlIGNvbnN0cmFpbnQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iU2VjdGlvbiI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpYWwgTWV0aG9kIEVsZW1lbnQgdGhhdCByZXByZXNlbnRzIHN0cnVjdHVyYWwgc3Vic2VjdGlvbnMgb2YgYSBDb250ZW50IERlc2NyaXB0aW9uJ3Mgc2VjdGlvbkRlc2NyaXB0aW9uIGF0dHJpYnV0ZS4gIEl0IGlzIHVzZWQgZm9yIGVpdGhlciBsYXJnZSBzY2FsZSBkb2N1bWVudGF0aW9uIG9mIENvbnRlbnQgRWxlbWVudHMgb3JnYW5pemVkIGludG8gc2VjdGlvbnMgYXMgd2VsbCBhcyB0byBmbGV4aWJseSBhZGQgbmV3IFNlY3Rpb25zIHRvIENvbnRlbnQgRWxlbWVudHMgdXNpbmcgY29udHJpYnV0aW9uIHZhcmlhYmlsaXR5IGFkZGVkIHRvIHRoZSBTZWN0aW9uIGNvbmNlcHQgZm9yIE1ldGhvZCBQbHVnLWlucy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOk1ldGhvZEVsZW1lbnQiPgotCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJTdWJTZWN0aW9uIiB0eXBlPSJ1bWE6U2VjdGlvbiIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJQcmVkZWNlc3NvciIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJEZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+VGhpcyBhdHRyaWJ1dGVzIHN0b3JlIHRoZSBkZXNjcmlwdGlvbiB0ZXh0IGZvciBhIENvbnRlbnQgRGVzY3JpcHRpb24ncyBTZWN0aW9uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9InNlY3Rpb25OYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkV2ZXJ5IFNlY3Rpb24gaGFzIGEgbmFtZSB1c2VkIGZvciBleHRlcm5hbCBwcmVzZW50YXRpb24gb2YgdGhlIHNlY3Rpb24sIGUuZy4gd2hlbiBwdWJsaXNoZWQgb3Igd2hlbiBzZWN0aW9uIGhlYWRpbmcgYXJlIGxpc3RlZCBpbiBhIHRhYmxlIG9mIGNvbnRlbnRzLiAgVGhpcyBhdHRyaWJ1dGUgaXMgc2ltaWxhciB0byBQcmVzZW50YXRpb24gTmFtZSBmb3IgQ29udGVudCBFbGVtZW50cy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJwcmVkZWNlc3NvciIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9InZhcmlhYmlsaXR5VHlwZSIgdHlwZT0idW1hOlZhcmlhYmlsaXR5VHlwZSIvPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9InZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJNZXRob2RVbml0Ij4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lhbCBNZXRob2QgRWxlbWVudCB0aGF0IHNoYWxsIGJlIG1haW50YWluZWQgaW4gYSBNZXRob2QgTGlicmFyeSBhcyBhIHNlcGFyYXRlIHVuaXQgb2YgY29udHJvbC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOk1ldGhvZEVsZW1lbnQiPgotCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJDb3B5cmlnaHQiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImF1dGhvcnMiIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+RXZlcnkgTWV0aG9kIFVuaXQgaXMgYmVpbmcgY3JlYXRlZCBhbmQgb3duZWQgYnkgYW4gYXV0aG9yIG9yIGF1dGhvcmluZyB0ZWFtLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImNoYW5nZURhdGUiIHR5cGU9InhzZDpkYXRlVGltZSI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZGF0ZSB0aGUgbGFzdCBjaGFuZ2UgdGhhdCByZXN1bHRlZCBpbnRvIHRoaXMgdmVyc2lvbiBoYXMgYmVlbiBtYWRlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImNoYW5nZURlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgbGFzdCBjaGFuZ2UgdGhhdCByZXN1bHRlZCBpbnRvIHRoaXMgdmVyc2lvbi48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ2ZXJzaW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkV2ZXJ5IFBhY2thZ2UgaGFzIGEgdmVyc2lvbiBudW1iZXIgdXNlZCB0byB0cmFjayBjaGFuZ2VzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkNvbnRlbnREZXNjcmlwdGlvbiI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIGdlbmVyYWxpemVkIE1ldGhvZCBFbGVtZW50IHRoYXQgaXMgdXNlZCB0byBzdG9yZSB0aGUgdGV4dHVhbCBkZXNjcmlwdGlvbiBmb3IgYSBDb250ZW50IEVsZW1lbnQuICBJdCBkZWZpbmVzIHN0YW5kYXJkIGF0dHJpYnV0ZXMgYXBwbGljYWJsZSBmb3IgYWxsIENvbnRlbnQgRWxlbWVudCB0eXBlcy4gIFNwZWNpZmljIENvbnRlbnQgRWxlbWVudCBzdWItdHlwZXMgY2FuIGRlZmluZSB0aGVpciBvd24gbWF0Y2hpbmcgQ29udGVudCBEZXNjcmlwdGlvbiBzdWItdHlwZXMuIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6TWV0aG9kVW5pdCI+Ci0JCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Ik1haW5EZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+U3RvcmVzIHRoZSBtYWluIGRlc2NyaXB0aXZlIHRleHQgZm9yIHRoZSBDb250ZW50IEVsZW1lbnQuICBBbGwgdGV4dCB0aGF0IGlzIG5vdCBwYXJ0IG9mIGFueSBvZiB0aGUgbW9yZSBzcGVjaWZpYyBhdHRyaWJ1dGVzIHNoYWxsIGJlIHN0b3JlZCBoZXJlLiAgSWYgdGhlIENvbnRlbnQgRGVzY3JpcHRpb24gaXMgZGl2aWRlZCBpbnRvIHNlY3Rpb25zIHVzaW5nIHRoZSBTZWN0aW9uIGNsYXNzLCB0aGVuIG9ubHkgdGhlIHRleHQgZnJvbSB0aGUgJ3N0YXJ0JyBvZiB0aGUgY29udGVudCBkZXNjcmlwdGlvbiB0byB0aGUgZmlyc3Qgc2VjdGlvbiB3aWxsIGJlIHN0b3JlZCBoZXJlIChzaW1pbGFyIHRvIGEgbm9ybWFsIGRvY3VtZW50IHdoZXJlIHlvdSBjYW4gcGxhY2UgdGV4dCBiZXR3ZWVuIGl0cyBiZWdpbm5pbmcgdG8gaXRzIGZpcnN0IGRpY3Rpb24gaGVhZGluZykuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJLZXlDb25zaWRlcmF0aW9ucyIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+UHJvdmlkZXMgYWR2aXNlIGFuZCBndWlkYW5jZSBvZiBhIGNyaXRpY2FsIG5hdHVyZSBmb3IgdGhlIGNvbnRlbnQgZWxlbWVudCBhcyB3ZWxsIGFzIHdhcm5pbmdzLCBjYXV0aW9ucywgcGl0ZmFsbHMsIGRhbmdlcnMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJTZWN0aW9uIiB0eXBlPSJ1bWE6U2VjdGlvbiIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ikd1aWRhbmNlRGVzY3JpcHRpb24iPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBnZW5lcmFsaXplZCBDb250ZW50IERlc2NyaXB0aW9uIHRoYXQgaXMgdXNlZCB0byBzdG9yZSB0aGUgdGV4dHVhbCBkZXNjcmlwdGlvbiBmb3IgYSBHdWlkYW5jZS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkNvbnRlbnREZXNjcmlwdGlvbiI+Ci0JCQkJPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIj4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkF0dGFjaG1lbnQiIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGlzIGZpZWxkIGlzIHByaW1hcmlseSB1c2VkIGZvciBhdHRhY2htZW50cyBhdWdtZW50aW5nIHRoZSBpbmZvcm1hdGlvbiBwcm92aWRlZCBmb3IgZ3VpZGFuY2UuICBJbiBwYXJ0aWN1bGFyIHRoZSBhdHRyaWJ1dGUgaXMgdXNlZCBmb3IgVGVtcGxhdGVzLCBFeGFtcGxlcywgYW5kIFJldXNhYmxlIEFzc2V0cyB0byBjb250YWluIHRoZSBhY3R1YWwgYXR0YWNobWVudCBkZXNjcmliZWQgaW4gdGhlIG1haW5EZXNjcmlwdGlvbi4gIEl0IGNhbiBhZGRpdGlvbmFsbHkgY29udGFpbiByZXByZXNlbnRhdGlvbnMgb2YgdGhlIGd1aWRhbmNlIGluIGp1c3QgYSB0aGlyZCBwYXJ0eSBmb3JtYXQsIGUuZy4gUERGLCBNUyBXb3JkLCBvciBXb3JkIFBlcmZlY3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJPC94c2Q6Y2hvaWNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlByYWN0aWNlRGVzY3JpcHRpb24iPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBnZW5lcmFsaXplZCBDb250ZW50IERlc2NyaXB0aW9uIHRoYXQgaXMgdXNlZCB0byBzdG9yZSB0aGUgdGV4dHVhbCBkZXNjcmlwdGlvbiBmb3IgYSBQcmFjdGljZS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkNvbnRlbnREZXNjcmlwdGlvbiI+Ci0JCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkFkZGl0aW9uYWxJbmZvIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BbnkgYWRkaXRpb25hbCBJbmZvcm1hdGlvbiBub3QgY292ZXJlZCBieSB0aGUgb3RoZXIgYXR0cmlidXRlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkFwcGxpY2F0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5EZXNjcmliZXMgaG93IHRoZSBQcmFjdGljZSBpcyBiZWluZyBhcHBsaWVkIG9yIGludHJvZHVjZWQgaW50byB0aGUgY29udGV4dCBkZXNjcmliZWQgaW4gYmFja2dyb3VuZC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkJhY2tncm91bmQiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkVsYWJvcmF0aW9uIG9uIHRoZSBiYWNrZ3JvdW5kIGFuZCB0aGUgY29udGV4dCBpbiB3aGljaCB0aGUgcHJvYmxlbSBvY2N1cnMgYW5kIHdoZXJlIHRoZSBzb2x1dGlvbiBkZXNjcmliZWQgYnkgdGhpcyBQcmFjdGljZSB3aWxsIGZpdCBpbi48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkdvYWxzIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHN1bW1hcnkgb2YgdGhlIG92ZXJhbGwgZ29hbHMgdG8gYmUgYWRkcmVzc2VkIGJ5IHRoZSBQcmFjdGljZS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkxldmVsc09mQWRvcHRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPk91dGxpbmVzIHRoZSBkaWZmZXJlbnQgZm9ybXMgb3IgdmFyaWFudHMgaW4gd2hpY2ggdGhlIHByYWN0aWNlIGNvdWxkIGJlIHJlYWxpemVkLiAoZS5nLiBmdWxsIGFkb3B0aW9uIHZlcnVzIGEgcGFydGlhbCBhZG9wdGlvbiBvZiB0aGUgUHJhY3RpY2UpPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJQcm9ibGVtIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIGRlc2NyaXB0aW9uIG9mIHRoZSBwcm9ibGVtIHRoZSBQcmFjdGljZSBhZGRyZXNzZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iV29ya1Byb2R1Y3REZXNjcmlwdGlvbiI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIGdlbmVyYWxpemVkIENvbnRlbnQgRGVzY3JpcHRpb24gdGhhdCBpcyB1c2VkIHRvIHN0b3JlIHRoZSB0ZXh0dWFsIGRlc2NyaXB0aW9uIGZvciBhIFdvcmsgUHJvZHVjdC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkNvbnRlbnREZXNjcmlwdGlvbiI+Ci0JCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkltcGFjdE9mTm90SGF2aW5nIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5EZXNjcmliZXMgdGhlIGNvbnNlcXVlbmNlcyBvZiBub3QgcHJvZHVjaW5nIHRoZSB3b3JrIHByb2R1Y3QuICBUaGlzIGlzIGludGVuZGVkIHRvIGFpZCBpbiB0aGUgdGFpbG9yaW5nIHRoZSBtZXRob2QvcHJvY2VzcyB0byB0aGUgbmVlZHMgb2YgYSBzcGVjaWZpYyBwcm9qZWN0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUHVycG9zZSIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+RGVzY3JpYmVzIHdoeSB0aGUgd29yayBwcm9kdWN0IGlzIHByb2R1Y2VkIGFuZCB0byB3aGF0IHVzZSBpdCB3aWxsIGJlIHB1dC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlJlYXNvbnNGb3JOb3ROZWVkaW5nIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5EZXNjcmliZXMgdGhlIGNpcmN1bXN0YW5jZXMgaW4gd2hpY2ggaXQgaXMgcmVhc29uYWJsZSBub3QgdG8gcHJvZHVjZSB0aGUgd29yayBwcm9kdWN0LiAgVGhpcyBpcyBpbnRlbmRlZCB0byBhaWQgaW4gdGhlIHRhaWxvcmluZyBvZiB0aGUgbWV0aG9kL3Byb2Nlc3MgdG8gdGhlIG5lZWRzIG9mIGEgc3BlY2lmaWMgcHJvamVjdC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJleHRlcm5hbElkIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkFuIGV4dGVybmFsIHZpc2libGUgbnVtYmVyIHRoYXQgaXMgdXNlZCB0byByZWZlcmVuY2UgdGhpcyBhcnRpZmFjdC4gVXNlZCBsaWtlIGEgc3lub255bS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJBcnRpZmFjdERlc2NyaXB0aW9uIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgZ2VuZXJhbGl6ZWQgV29yayBQcm9kdWN0IERlc2NyaXB0aW9uIHRoYXQgaXMgdXNlZCB0byBzdG9yZSB0aGUgdGV4dHVhbCBkZXNjcmlwdGlvbiBmb3IgYW4gQXJ0aWZhY3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpXb3JrUHJvZHVjdERlc2NyaXB0aW9uIj4KLQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQnJpZWZPdXRsaW5lIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5Qcm92aWRlcyBhIGJyaWVmIGRlc2NyaXB0aW9uIG9mIHRoZSBpbmZvcm1hdGlvbiB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGlzIGFydGlmYWN0LiBGb3IgZXhhbXBsZSwgZGlzY3Vzc2VzIHRoZSBjb250ZW50cyBmb3Iga2V5IGNoYXB0ZXJzIG9mIGEgZG9jdW1lbnQgYXJ0aWZhY3Qgb3IgdGhlIGtleSBwYWNrYWdlcyBhbmQgbW9kdWxlcyBvZiBhIG1vZGVsIGFydGlmYWN0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUmVwcmVzZW50YXRpb25PcHRpb25zIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5EaXNjdXNzZXMgZGlmZmVyZW50IHBvc3NpYmxlIGFsdGVybmF0aXZlIHJlcHJlc2VudGF0aW9ucyBmb3IgdGhlIGFydGlmYWN0LiBGb3IgZXhhbXBsZSBhIGRlc2lnbiBtb2RlbCBjYW4gYmUgcmVwcmVzZW50ZWQgYXMgYSBVTUwgbW9kZWwgb3IgYW4gaW5mb3JtYWwgYmxvY2sgZGlhZ3JhbSBvciBieSB0ZXh0dWFsIGRlc2NyaXB0aW9uIG9ubHkuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iRGVsaXZlcmFibGVEZXNjcmlwdGlvbiI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIGdlbmVyYWxpemVkIFdvcmsgUHJvZHVjdCBEZXNjcmlwdGlvbiB0aGF0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIHRleHR1YWwgZGVzY3JpcHRpb24gZm9yIGEgRGVsaXZlcmFibGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpXb3JrUHJvZHVjdERlc2NyaXB0aW9uIj4KLQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iRXh0ZXJuYWxEZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+VGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBEZWxpdmVyYWJsZSB1c2VkIGZvciBjbGllbnQgZG9jdW1lbnRzIChwcm9wb3NhbCwgc3RhdGVtZW50cyBvZiB3b3JrIG9yIGNvbnRyYWN0dWFsIGFncmVlbWVudHMpLiAgSXQgbWlnaHQgdXNlIGEgZGlmZmVyZW50IGxhbmd1YWdlIGFuZCBmb2xsb3cgbGVnYWwgY29uc3RyYWludHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJQYWNrYWdpbmdHdWlkYW5jZSIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+UHJvdmlkZXMgZ3VpZGFuY2Ugb24gaG93IHRvIGFzc2VtYmxlIHRoZSBkZWxpdmVyYWJsZSBmcm9tIGFsbCBpdHMgcmVxdWlyZWQgaW5wdXRzLiAgVGhpcyBzZWN0aW9uIGRlc2NyaWJlcyB0aGUgbW9zdCBjb21tb24gY29udGVudCBtZWRpdW0gYW5kIGZvcm1hdC4gIERpc3RyaWJ1dGlvbiBvZiB0aGUgZGVsaXZlcmFibGUgaXMgYWRkcmVzc2VkIGluIHRoaXMgc2VjdGlvbiwgaWYgbmVjZXNzYXJ5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlJvbGVEZXNjcmlwdGlvbiI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIGdlbmVyYWxpemVkIENvbnRlbnQgRGVzY3JpcHRpb24gdGhhdCBpcyB1c2VkIHRvIHN0b3JlIHRoZSB0ZXh0dWFsIGRlc2NyaXB0aW9uIGZvciBhIFJvbGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpDb250ZW50RGVzY3JpcHRpb24iPgotCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJBc3NpZ25tZW50QXBwcm9hY2hlcyIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+UHJvdmlkZXMgZ3VpZGFuY2Ugb24gZm9yIGFzc2lnbmluZyBpbmRpdmlkdWFscyB0byB0aGUgUm9sZSBpbiB0ZXJtcyBvZiB3aGF0IG90aGVyIHJvbGVzIHRoZXNlIGluZGl2aWR1YWxzIGNvdWxkIHBlcmZvcm0gYW5kIHdoYXQgcmVzcG9uc2liaWxpdHkgZGlmZmVyZW50IGluZGl2aWR1YWxzIGFzc2lnbmVkIHRvIHRoaXMgcm9sZSBtaWdodCBoYXZlLiAgVGhlIGd1aWRhbmNlIGNhbiBhbHNvIGRlc2NyaWJlIGRpZmZlcmVudCBhc3NpZ25tZW50IGFwcHJvYWNoZXMgZm9yIGRpZmZlcmVudCB0eXBlcyBvZiBwcm9qZWN0cywgZS5nLiBmb3IgbGFyZ2UgdmVyc3VzIHNtYWxsIHRlYW1zIHdoZXJlIGluZGl2aWR1YWxzIGNvdWxkIGJlIGFsbG9jYXRlZCB0byByb2xlcyBmdWxsIHRpbWUgdmVyc3VzIHNoYXJpbmcgcm9sZXMgd2l0aGluIHRoZSB0ZWFtLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iU2tpbGxzIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5MaXN0cyBvZiBzZXQgb2YgcmVxdWlyZWQgc2tpbGxzIGEgcGVyc29uIG5lZWRzIHRvIHBvc3Nlc3MgdG8gZnVsZmlsbCB0aGF0IFJvbGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJTeW5vbnltcyIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+TGlzdHMgc3lub255bXMsIGkuZS4gb3RoZXIgbmFtZXMgdGhlIFJvbGUgbWlnaHQgYmUgcmVmZXJyZWQgYnkuICBUb29sIHN1cHBvcnQgZm9yIHRoZSBtZXRhLW1vZGVsIG1pZ2h0IHN1cHBvcnQgdGhhdCBhIFJvbGUgbmFtZSBjYW4gYmUgY29uc2lzdGVudGx5IGJlIHJlcGxhY2VkIHdpdGggb25lIG9mIGl0cyBzeW5vbnltcyB0aHJvdWdodCBhIFByb2Nlc3MuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iVGFza0Rlc2NyaXB0aW9uIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgZ2VuZXJhbGl6ZWQgQ29udGVudCBEZXNjcmlwdGlvbiB0aGF0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIHRleHR1YWwgZGVzY3JpcHRpb24gZm9yIGEgVGFzay48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkNvbnRlbnREZXNjcmlwdGlvbiI+Ci0JCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkFsdGVybmF0aXZlcyIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+Q29tcHJpc2VzIG9mIHN1bW1hcmllcyBkZXNjcmliaW5nIGltcG9ydGFudCBleGNlcHRpb25hbCBhbmQgbm9uLXN0YW5kYXJkIHdheXMgb2YgYWNoaWV2aW5nIHRoaXMgVGFzaydzIGRldmVsb3BtZW50IGdvYWxzIHRoYXQgd2VyZSBub3QgY292ZXJlZCBieSB0aGUgVGFzaydzIFN0ZXBzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUHVycG9zZSIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+U3VtbWFyaXplcyB0aGUgbWFpbiByZWFzb24gZm9yIHBlcmZvcm1pbmcgdGhpcyBUYXNrIGFuZCB3aGF0IGlzIGludGVuZGVkIHRvIGJlIGFjaGlldmVkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkRlc2NyaWJhYmxlRWxlbWVudCI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BbiBhYnN0cmFjdCBnZW5lcmFsaXphdGlvbiBvZiBNZXRob2QgRWxlbWVudHMgZm9yIHdoaWNoIGV4dGVybmFsIHByZXNlbnRhdGlvbiBuYW1lcyBhcyB3ZWxsIGFzIGNvbnRlbnQgZGVzY3JpcHRpb25zIGhhdmUgYmVlbiBkZWZpbmVkLCBzdWNoIGFzIFJvbGVzIG9yIFdvcmsgUHJvZHVjdHMuICBQcmVzZW50YXRpb24gTmFtZSBhbmQgQ29udGVudCBEZXNjcmlwdGlvbnMgYXJlIHR5cGljYWxseSBsb2NhbGl6ZWQgdXNpbmcgYSByZXNvdXJjZSBhbGxvY2F0aW9uIG1lY2hhbmlzbSBmb3IgaXRzIFN0cmluZyB0eXBlIGF0dHJpYnV0ZXMuCi1UaGlzIGFic3RyYWN0aW9uIHJlcHJlc2VudHMgYWxsIGVsZW1lbnRzIGluIHRoZSBNZXRob2QgQ29udGVudCBhcyB3ZWxsIGFzIFByb2Nlc3Mgc3BhY2UgZm9yIHdoaWNoIGNvbmNyZXRlIHRleHR1YWwgZGVzY3JpcHRpb25zIGFyZSBkZWZpbmVkIGluIHRoZSBmb3JtIG9mIGRvY3VtZW50aW5nIGF0dHJpYnV0ZXMgZ3JvdXBlZCBpbiBhIG1hdGNoaW5nIENvbnRlbnQgRGVzY3JpcHRpb24gaW5zdGFuY2UuICBEZXNjcmliYWJsZSBFbGVtZW50cyBhcmUgaW50ZW5kZWQgdG8gYmUgcHVibGlzaGVkIGluIG1ldGhvZCBvciBwcm9jZXNzIHB1YmxpY2F0aW9ucyAoc2ltaWxhciB0byB0aGUgSUJNIFJhdGlvbmFsIFVuaWZpZWQgUHJvY2VzcyB3ZWIpLiAgRGVzY3JpYmFibGUgRWxlbWVudCBkZWZpbmVzIHRoYXQgdGhlIGVsZW1lbnQgaXQgcmVwcmVzZW50cyB3aWxsIGhhdmUgY29udGVudCAnYXR0YWNoZWQnIHRvIGl0LiAgQ29udGVudCBEZXNjcmlwdGlvbiBpcyB0aGUgYWJzdHJhY3Rpb24gZm9yIHRoZSBhY3R1YWwgcGxhY2VzIGluIHdoaWNoIHRoZSBjb250ZW50IGlzIGJlaW5nIHJlcHJlc2VudGVkLiAgVGhpcyBzZXBhcmF0aW9uIGFsbG93cyBhIGRpc3RpbmN0aW9uIGJldHdlZW4gY29yZSBtZXRob2QgbW9kZWwgZWxlbWVudHMgZGVzY3JpYmluZyB0aGUgc3RydWN0dXJlIG9mIHRoZSBtb2RlbCBmcm9tIHRoZSBhY3R1YWwgZGVzY3JpcHRpb24gY29udGFpbmVyIHByb3ZpZGluZywgZm9yIGV4YW1wbGUsIHRoZSBkb2N1bWVudGF0aW9uIG9mIHRoZSBjb250ZW50IGVsZW1lbnQgaW4gZGlmZmVyZW50IGFsdGVybmF0aXZlcyBsYW5ndWFnZXMsIGF1ZGllbmNlcywgbGljZW5zaW5nIGxldmVscywgZXRjLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6TWV0aG9kRWxlbWVudCI+Ci0JCQkJPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIj4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlByZXNlbnRhdGlvbiIgdHlwZT0idW1hOkNvbnRlbnREZXNjcmlwdGlvbiIvPgotCQkJCTwveHNkOmNob2ljZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJwcmVzZW50YXRpb25OYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkV2ZXJ5IERlc2NyaWJhYmxlIEVsZW1lbnQgaGFzIGEgcHJlc2VudGF0aW9uIG5hbWUsIHdoaWNoIGlzIHVzZWQgZm9yIGV4dGVybmFsIHByZXNlbnRhdGlvbiBvZiB0aGUgZWxlbWVudC4gIEZvciBleGFtcGxlLCBuYW1lICh0aGUgaW50ZXJuYWwgcmVwcmVzZW50YXRpb24pIG1pZ2h0IGJlIHNldCB0byAicnVwX2FyY2hpdGVjdHVyZV9kb2N1bWVudCIgdG8gZGlmZmVyZW50aWF0ZSBmcm9tIGEgImoyZWVfYXJjaGl0Y3R1cmVfZG9jdW1lbnQiIHdoZXJlYXMgdGhlIGV4dGVybmFsIHByZXNlbnRhdGlvbiB3b3VsZCBhbHdheXMgYmUgIkFyY2hpdGVjdHVyZSBEb2N1bWVudCIuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0ic2hhcGVpY29uIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgcmVmZXJlbmNlIHRvIGFuIGljb24gdGhhdCBjYW4gYmUgdXNlZCBmb3IgbW9kZWxpbmcgd2l0aCBzcGVjaWZpYyBDb250ZW50IEVsZW1lbnQgaW5zdGFuY2VzIChhcyBncmFwaGljYWwgc3RlcmVvdHlwZXMsIGUuZy4gYSB1c2UgY2FzZSBzeW1ib2wgZm9yIGEgdXNlIGNhc2UgYXJ0aWZhY3QpIGFzIHdlbGwgYXMgcHVibGljYXRpb24gb2YgY29udGVudC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJub2RlaWNvbiIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHJlZmVyZW5jZSB0byBhbiBpY29uIHRoYXQgY2FuIGJlIHVzZWQgaW4gdHJlZSBicm93c2VyIHByZXNlbnRhdGlvbnMgYW5kIGJyZWFrZG93biBzdHJ1Y3R1cmVzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkNvbnRlbnRFbGVtZW50Ij4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgRGVzY3JpYmFibGUgRWxlbWVudCB0aGF0IHJlcHJlc2VudHMgYW4gYWJzdHJhY3QgZ2VuZXJhbGl6YXRpb24gZm9yIGFsbCBlbGVtZW50cyB0aGF0IGFyZSBjb25zaWRlcmVkIHRvIGJlIGFuZCBtYW5hZ2VkIGFzIE1ldGhvZCBDb250ZW50LgotQ29udGVudCBFbGVtZW50cyByZXByZXNlbnRzIHJldXNhYmxlIE1ldGhvZCBDb250ZW50IHRoYXQgaXMgc3VwcG9zZWQgdG8gYmUgbWFuYWdlZCBpbiBDb250ZW50IFBhY2thZ2VzLiAgVGhlIHNlcGFyYXRpb24gb2YgQ29udGVudCBFbGVtZW50IGZyb20gUHJvY2VzcyBFbGVtZW50IGFsbG93cyB0byBjbGVhcmx5IGRpc3Rpbmd1aXNoIGJldHdlZW4gcHVyZSBtZXRob2QgY29udGVudCBmcm9tIGNvbnRlbnQgdGhhdCBpcyByZXByZXNlbnRlZCBpbiBwcm9jZXNzZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpEZXNjcmliYWJsZUVsZW1lbnQiPgotCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCTx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkNoZWNrbGlzdCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkNvbmNlcHQiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJFeGFtcGxlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iR3VpZGVsaW5lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUmV1c2FibGVBc3NldCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlN1cHBvcnRpbmdNYXRlcmlhbCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IldoaXRlcGFwZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJPC94c2Q6Y2hvaWNlPgotCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9InZhcmlhYmlsaXR5VHlwZSIgdHlwZT0idW1hOlZhcmlhYmlsaXR5VHlwZSIvPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9InZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJHdWlkYW5jZSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5HdWlkYW5jZSBpcyBhbiBhYnN0cmFjdCBnZW5lcmFsaXphdGlvbiBvZiBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlbGF0ZWQgdG8gY29udGVudCBlbGVtZW50cyBzdWNoIGFzIFJvbGVzLCBUYXNrcywgYW5kIFdvcmsgUHJvZHVjdHMuICBFeGFtcGxlcyBmb3IgR3VpZGFuY2UgYXJlIEd1aWRlbGluZXMsIFRlbXBsYXRlcywgQ2hlY2tsaXN0cywgVG9vbCBNZW50b3JzLCBFc3RpbWF0ZXMsIFN1cHBvcnRpbmcgTWF0ZXJpYWxzLCBSZXBvcnRzLCBDb25jZXB0cywgZXRjLiAgVGhpcyBwYWNrYWdlIG9ubHkgY29udGFpbnMgdGhlIGRlZmluaXRpb24gb2YgdGhlIGFic3RyYWN0IEd1aWRhbmNlIGNsYXNzLiAgVGhlIHBhY2thZ2UgR3VpZGFuY2UgVHlwZXMgZGVmaW5lcyBjb25jcmV0ZSBndWlkYW5jZSB0eXBlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkNvbnRlbnRFbGVtZW50Ii8+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iQ29uY2VwdCI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpZmljIHR5cGUgb2YgZ3VpZGFuY2UgdGhhdCBvdXRsaW5lcyBrZXkgaWRlYXMgYXNzb2NpYXRlZCB3aXRoIGJhc2ljIHByaW5jaXBsZXMgdW5kZXJseWluZyB0aGUgcmVmZXJlbmNlZCBpdGVtLiBDb25jZXB0cyBub3JtYWxseSBhZGRyZXNzIG1vcmUgZ2VuZXJhbCB0b3BpY3MgdGhhbiBHdWlkZWxpbmVzIGFuZCBzcGFuIGFjcm9zcyBzZXYtZXJhbCB3b3JrIHByb2R1Y3QgYW5kL29yIHRhc2tzL2FjdGl2aXRpZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpHdWlkYW5jZSIvPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkNoZWNrbGlzdCI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpZmljIHR5cGUgb2YgZ3VpZGFuY2UgdGhhdCBpZGVudGlmaWVzIGEgc2VyaWVzIG9mIGl0ZW1zIHRoYXQgbmVlZCB0byBiZSBjb21wbGV0ZWQgb3IgdmVyaS1maWVkLiAgQ2hlY2tsaXN0cyBhcmUgb2Z0ZW4gdXNlZCBpbiByZXZpZXdzIHN1Y2ggYXMgd2Fsa3Rocm91Z2hzIG9yIGluc3BlY3Rpb25zLiA8L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkd1aWRhbmNlIi8+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iRXhhbXBsZSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpZmljIHR5cGUgb2YgR3VpZGFuY2UgdGhhdCByZXByZXNlbnRzIGEgdHlwaWNhbCwgcGFydGlhbGx5IGNvbXBsZXRlZCwgc2FtcGxlIGluc3RhbmNlIG9mIG9uZSBvciBtb3JlIHdvcmsgcHJvZHVjdHMgb3Igc2NlbmFyaW8gbGlrZSBkZXNjcmlwdGlvbnMgb2YgaG93IFRhc2sgbWF5IGJlIHBlcmZvcm1lZC4gRXhhbXBsZXMgY2FuIGJlIHJlbGF0ZWQgdG8gV29yayBQcm9kdWN0cyBhcyB3ZWxsIGFzIFRhc2tzIHRoYXQgcHJvZHVjZSB0aGVtIGFzIHdlbGwgYXMgYW55IG90aGVyIENvbnRlbnQgRWxlbWVudC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkd1aWRhbmNlIi8+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iR3VpZGVsaW5lIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lmaWMgdHlwZSBvZiBndWlkYW5jZSB0aGF0IHByb3ZpZGVzIGFkZGl0aW9uYWwgZGV0YWlsIG9uIGhvdyB0byBwZXJmb3JtIGEgcGFydGljdWxhciB0YXNrIG9yIGdyb3VwaW5nIG9mIHRhc2tzIChlLmcuIGdyb3VwZWQgdG9nZXRoZXIgYXMgYWN0aXZpdGllcykgb3IgdGhhdCBwcm92aWRlcyBhZGRpdGlvbmFsIGRldGFpbCwgcnVsZXMsIGFuZCByZWNvbW1lbmRhdGlvbnMgb24gd29yayBwcm9kdWN0cyBhbmQgdGhlaXIgcHJvcGVydGllcy4gIEFtb25nc3Qgb3RoZXJzLCBpdCBjYW4gaW5jbHVkZSBkZXRhaWxzIGFib3V0IGJlc3QgcHJhY3RpY2VzIGFuZCBkaWZmZXJlbnQgYXBwcm9hY2hlcyBmb3IgZG9pbmcgd29yaywgaG93IHRvIHVzZSBwYXJ0aWN1bGFyIHR5cGVzIG9mIHdvcmsgcHJvZHVjdHMsIGluZm9ybWF0aW9uIG9uIGRpZmZlcmVudCBzdWJ0eXBlcyBhbmQgdmFyaWFudHMgb2YgdGhlIHdvcmsgcHJvZHVjdCBhbmQgaG93IHRoZXkgZXZvbHZlIHRocm91Z2hvdXQgYSBsaWZlY3ljbGUsIGRpc2N1c3Npb25zIG9uIHNraWxscyB0aGUgcGVyZm9ybWluZyByb2xlcyBzaG91bGQgYWNxdWlyZSBvciBpbXByb3ZlIHVwb24sIG1lYXN1cmVtZW50cyBmb3IgcHJvZ3Jlc3MgYW5kIG1hdHVyaXR5LCBldGMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpHdWlkYW5jZSIvPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkVzdGltYXRlIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lmaWMgdHlwZSBvZiBHdWlkYW5jZSB0aGF0IHByb3ZpZGVzIHNpemluZyBtZWFzdXJlcywgb3Igc3RhbmRhcmRzIGZvciBzaXppbmcgdGhlIHdvcmsgZWZmb3J0IGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIGEgcGFydGljdWxhciBwaWVjZSBvZiB3b3JrIGFuZCBpbnN0cnVjdGlvbnMgZm9yIHRoZWlyIHN1Y2Nlc3NmdWwgdXNlLiBJdCBtYXkgYmUgY29tcHJpc2VkIG9mIGVzdGltYXRpb24gY29uc2lkZXJhdGlvbnMgYW5kIGVzdGltYXRpb24gbWV0cmljcy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkd1aWRhbmNlIj4KLQkJCQk8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkVzdGltYXRpb25NZXRyaWMiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkVzdGltYXRpb25Db25zaWRlcmF0aW9ucyIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCTwveHNkOmNob2ljZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJFc3RpbWF0aW5nTWV0cmljIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lmaWMgdHlwZSBvZiBHdWlkYW5jZSB0aGF0IGRlc2NyaWJlcyBhIG1ldHJpYyBvciBtZWFzdXJlIHRoYXQgaXMgYXNzb2NpYXRlZCB3aXRoIGFuIGVsZW1lbnQgYW5kIHdoaWNoIGlzIHVzZWQgdG8gY2FsY3VsYXRlIHRoZSBzaXplIG9mIHRoZSB3b3JrIGVmZm9ydCBhcyB3ZWxsIGFzIGEgcmFuZ2Ugb2YgcG90ZW50aWFsIGxhYm9yLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6R3VpZGFuY2UiLz4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWZpYyB0eXBlIG9mIEd1aWRhbmNlIHRoYXQgcXVhbGlmaWVzIHRoZSB1c2FnZSBhbmQgYXBwbGljYXRpb24gb2YgZXN0aW1hdGlvbiBtZXRyaWNzIGluIHRoZSBkZXZlbG9wbWVudCBvZiBhbiBhY3R1YWwgZXN0aW1hdGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpHdWlkYW5jZSIvPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlJvYWRtYXAiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWZpYyB0eXBlIG9mIEd1aWRhbmNlIHdoaWNoIGlzIG9ubHkgcmVsYXRlZCB0byBBY3RpdmF0ZXMgYW5kIHRoZXJlZm9yZSBoYXMgYmVlbiBhZGRlZCBieSB0aGlzIHBhY2thZ2UgdG8gdGhlIGxpc3Qgb2YgR3VpZGFuY2UgVHlwZXMgcmF0aGVyIHRoYW4gbGlzdGVkIGluIHRoZSBHdWlkYW5jZSBUeXBlcyBwYWNrYWdlLiAgQSBSb2FkbWFwIHJlcHJlc2VudHMgYSBsaW5lYXIgd2Fsa3Rocm91Z2ggb2YgYW4gQWN0aXZpdHksIHR5cGljYWxseSBhIFByb2Nlc3MuCi1BbiBpbnN0YW5jZSBvZiBhIFJvYWRtYXAgcmVwcmVzZW50cyBpbXBvcnRhbnQgZG9jdW1lbnRhdGlvbiBmb3IgdGhlIEFjdGl2aXR5IG9yIFByb2Nlc3MgaXQgaXMgcmVsYXRlZCB0by4gIE9mdGVuIGEgY29tcGxleCBBY3Rpdml0eSBzdWNoIGFzIGEgUHJvY2VzcyBjYW4gYmUgbXVjaCBlYXNpZXIgdW5kZXJzdG9vZCBieSBwcm92aWRpbmcgYSB3YWxrdGhyb3VnaCB3aXRoIGEgbGluZWFyIHRocmVhZCBvZiBhIHR5cGljYWwgaW5zdGFudGlhdGlvbiBvZiB0aGlzIEFjdGl2aXR5LiAgSW4gYWRkaXRpb24gdG8gbWFraW5nIHRoZSBwcm9jZXNzIHByYWN0aXRpb25lciB1bmRlcnN0YW5kIGhvdyB3b3JrIGluIHRoZSBwcm9jZXNzIGlzIGJlaW5nIHBlcmZvcm1lZCwgYSBSb2FkbWFwIHByb3ZpZGVzIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gYWJvdXQgaG93IEFjdGl2aXRpZXMgYW5kIFRhc2tzIHJlbGF0ZSB0byBlYWNoIG90aGVyIG92ZXIgdGltZS4gIFJvYWRtYXBzIGFyZSBhbHNvIHVzZWQgdG8gc2hvdyBob3cgc3BlY2lmaWMgYXNwZWN0cyBhcmUgZGlzdHJpYnV0ZWQgb3ZlciBhIHdob2xlIHByb2Nlc3MgcHJvdmlkaW5nIGEga2luZCBvZiBmaWx0ZXIgb24gdGhlIHByb2Nlc3MgZm9yIHRoaXMgaW5mb3JtYXRpb24uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpHdWlkYW5jZSIvPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlJlcG9ydCI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHByZWRlZmluZWQgdGVtcGxhdGUgb2YgYSByZXN1bHQgdGhhdCBpcyBnZW5lcmF0ZWQgb24gdGhlIGJhc2lzIG9mIG90aGVyIHdvcmsgcHJvZHVjdHMgYXMgYW4gb3V0cHV0IGZyb20gc29tZSBmb3JtIG9mIHRvb2wgYXV0b21hdGlvbi4gQW4gZXhhbXBsZSBmb3IgYSByZXBvcnQgd291bGQgYmUgYSB1c2UgY2FzZSBtb2RlbCBzdXJ2ZXksIHdoaWNoIGlzIGdlbmVyYXRlZCBieSBleHRyYWN0aW5nIGRpYWdyYW0gaW5mb3JtYXRpb24gZnJvbSBhIGdyYXBoaWNhbCBtb2RlbCBhbmQgdGV4dHVhbCBpbmZvcm1hdGlvbiBmcm9tIGRvY3VtZW50cyBhbmQgY29tYmluZXMgdGhlc2UgdHdvIHR5cGVzIG9mIGluZm9ybWF0aW9uIGludG8gYSByZXBvcnQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpHdWlkYW5jZSIvPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlRlbXBsYXRlIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lmaWMgdHlwZSBvZiBndWlkYW5jZSB0aGF0IHByb3ZpZGVzIGZvciBhIHdvcmsgcHJvZHVjdCBhIHByZS1kZWZpbmVkIHRhYmxlIG9mIGNvbnRlbnRzLCBzZWN0aW9ucywgcGFja2FnZXMsIGFuZC9vciBoZWFkaW5ncywgYSBzdGFuZGFyZGl6ZWQgZm9ybWF0LCBhcyB3ZWxsIGFzIGRlc2NyaXB0aW9ucyBob3cgdGhlIHNlY3Rpb25zIGFuZCBwYWNrYWdlcyBhcmUgc3VwcG9zZWQgdG8gYmUgdXNlZCBhbmQgY29tcGxldGVkLiBUZW1wbGF0ZXMgY2Fubm90IG9ubHkgYmUgcHJvdmlkZWQgZm9yIGRvY3VtZW50cywgYnV0IGFsc28gZm9yIGNvbmNlcHR1YWwgbW9kZWxzIG9yIHBoeXNpY2FsIGRhdGEgc3RvcmVzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6R3VpZGFuY2UiLz4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJTdXBwb3J0aW5nTWF0ZXJpYWwiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBjYXRjaGFsbCBmb3Igb3RoZXIgdHlwZXMgb2YgZ3VpZGFuY2Ugbm90IHNwZWNpZmljYWxseSBkZWZpbmVkIGVsc2V3aGVyZS4gSXQgY2FuIGJlIHJlbGF0ZWQgdG8gYWxsIGtpbmRzIG9mIENvbnRlbnQgRWxlbWVudHMsIGkuZS4gaW5jbHVkaW5nIG90aGVyIGd1aWRhbmNlIGVsZW1lbnRzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6R3VpZGFuY2UiLz4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJUb29sTWVudG9yIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgIHNwZWNpZmljIHR5cGUgb2YgZ3VpZGFuY2UgdGhhdCBzaG93cyBob3cgdG8gdXNlIGEgc3BlY2lmaWMgdG9vbCB0byBhY2NvbXBsaXNoIHNvbWUgcGllY2Ugb2Ygd29yayBhIFdvcmsgUHJvZHVjdCBlaXRoZXIgaW4gdGhlIGNvbnRleHQgb2Ygb3IgaW5kZXBlbmRlbnQgZnJvbSBhIFRhc2sgb3IgQWN0aXZpdHkuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpHdWlkYW5jZSIvPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IldoaXRlcGFwZXIiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWFsIENvbmNlcHQgZ3VpZGFuY2UgdGhhdCBoYXZlIGJlZW4gZXh0ZXJuYWxseSByZXZpZXdlZCBvciBwdWJsaXNoZWQgYW5kIGNhbiBiZSByZWFkIGFuZCB1bmRlcnN0b29kIGluIGlzb2xhdGlvbiBvZiBvdGhlciBjb250ZW50IGVsZW1lbnRzIGFuZCBndWlkYW5jZS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkNvbmNlcHQiLz4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJUZXJtRGVmaW5pdGlvbiI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpZmljIHR5cGUgb2YgZ3VpZGFuY2UgdGhhdCBkZWZpbmVzIGNvbmNlcHRzIGFuZCBhcmUgdXNlZCB0byBidWlsZCB1cCB0aGUgR2xvc3NhcnkuIFRlcm1EZWZpbml0aW9ucyBhcmUgbm90IGRpcmVjdGx5IHJlbGF0ZWQgdG8gQ29udGVudEVsZW1lbnRzLCBidXQgdGhlaXIgcmVsYXRpb25zaGlwIGlzIGJlaW5nIGRlcml2ZWQgd2hlbiB0aGUgVGVybSBpcyB1c2VkIGluIHRoZSBDb250ZW50RWxlbWVudHMgZGVzY3JpcHRpb24gdGV4dC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkd1aWRhbmNlIi8+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUHJhY3RpY2UiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWZpYyB0eXBlIG9mIGd1aWRhbmNlIHRoYXQgcmVwcmVzZW50cyBhIHByb3ZlbiB3YXkgb3Igc3RyYXRlZ3kgb2YgZG9pbmcgd29yayB0byBhY2hpZXZlIGEgZ29hbCB0aGF0IGhhcyBhIHBvc2l0aXZlIGltcGFjdCBvbiB3b3JrIHByb2R1Y3Qgb3IgcHJvY2VzcyBxdWFsaXR5LiAgUHJhY3RpY2VzIGFyZSBkZWZpbmVkIG9ydGhvZ29uYWwgdG8gbWV0aG9kcyBhbmQgcHJvY2Vzc2VzLiAgVGhleSBjb3VsZCBzdW1tYXJpemUgYXNwZWN0cyB0aGF0IGltcGFjdCBtYW55IGRpZmZlcmVudCBwYXJ0cyBvZiBhIG1ldGhvZCBvciBzcGVjaWZpYyBwcm9jZXNzZXMuICBFeGFtcGxlcyBmb3IgcHJhY3RpY2VzIHdvdWxkIGJlICJNYW5hZ2UgUmlza3MiLCAiQ29udGludW91c2x5IHZlcmlmeSBxdWFsaXR5IiwgIkFyY2hpdGVjdHVyZS1jZW50cmljIGFuZCBjb21wb25lbnQtYmFzZWQgZGV2ZWxvcG1lbnQiLCBldGMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpHdWlkYW5jZSI+Ci0JCQkJPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJBY3Rpdml0eVJlZmVyZW5jZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQ29udGVudFJlZmVyZW5jZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iU3ViUHJhY3RpY2UiIHR5cGU9InVtYTpQcmFjdGljZSIvPgotCQkJCTwveHNkOmNob2ljZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJSZXVzYWJsZUFzc2V0Ij4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lmaWMgdHlwZSBvZiBndWlkYW5jZSB0aGF0IHByb3ZpZGVzIGEgc29sdXRpb24gdG8gYSBwcm9ibGVtIGZvciBhIGdpdmVuIGNvbnRleHQuIFRoZSBhc3NldCBtYXkgaGF2ZSBhIHZhcmlhYmlsaXR5IHBvaW50LCB3aGljaCBpcyBhIGxvY2F0aW9uIGluIHRoZSBhc3NldCB0aGF0IG1heSBoYXZlIGEgdmFsdWUgcHJvdmlkZWQgb3IgY3VzdG9taXplZCBieSB0aGUgYXNzZXQgY29uc3VtZXIuIFRoZSBhc3NldCBoYXMgcnVsZXMgZm9yIHVzYWdlIHdoaWNoIGFyZSB0aGUgaW5zdHJ1Y3Rpb25zIGRlc2NyaWJpbmcKLWhvdyB0aGUgYXNzZXQgc2hvdWxkIGJlIHVzZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpHdWlkYW5jZSIvPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IldvcmtQcm9kdWN0Ij4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkFuIGFic3RyYWN0IGNsYXNzIHdoaWNoIHByb3ZpZGVzIGEgZ2VuZXJhbGl6YXRpb24gZm9yIHRoZSBjb250ZW50IGVsZW1lbnQgdHlwZXMgQXJ0aWZhY3QsIE91dGNvbWUsIGFuZCBEZWxpdmVyYWJsZS4gIFRoZSBtZXRhLW1vZGVsIGNsYXNzIFdvcmsgUHJvZHVjdCBhY3R1YWxseSByZXByZXNlbnRzIHdvcmsgcHJvZHVjdCB0eXBlcywgaS5lLiBhbiBpbnN0YW5jZSBvZiBXb3JrIFByb2R1Y3QgaXMgYSBkZXNjcmlwdGlvbiBvZiBhIHNwZWNpZmljIHR5cGUgb2Ygd29yayBwcm9kdWN0IGFuZCBub3QgYW4gaW5kaXZpZHVhbCB3b3JrIHByb2R1Y3QgaW5zdGFuY2UuICBIb3dldmVyLCBmb3Igc2ltcGxpY2l0eSByZWFzb25zIGFuZCBiZWNhdXNlIG9mIGxvdyByaXNrIG9mIG1pc2ludGVycHJldGF0aW9uIHdlIGRpZCBub3QgYXBwZW5kIHRoZSB3b3JkICd0eXBlJyB0byBldmVyeSBtZXRhLWNsYXNzLgotQSB3b3JrIHByb2R1Y3QgaXMgYW4gYWJzdHJhY3Rpb24gZm9yIGRlc2NyaXB0aW9ucyBvZiBjb250ZW50IGVsZW1lbnRzIHRoYXQgYXJlIHVzZWQgdG8gZGVmaW5lIGFueXRoaW5nIHVzZWQsIHByb2R1Y2VkLCBvciBtb2RpZmllZCBieSBhIHRhc2suPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpDb250ZW50RWxlbWVudCI+Ci0JCQkJPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJFc3RpbWF0ZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJSZXBvcnQiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlRlbXBsYXRlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJUb29sTWVudG9yIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJPC94c2Q6Y2hvaWNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkFydGlmYWN0Ij4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgV29yayBQcm9kdWN0IHRoYXQgcHJvdmlkZXMgYSBkZXNjcmlwdGlvbiBhbmQgZGVmaW5pdGlvbiBmb3IgdGFuZ2libGUgd29yayBwcm9kdWN0IHR5cGVzLiBBcnRpZmFjdHMgbWF5IGJlIGNvbXBvc2VkIG9mIG90aGVyIGFydGlmYWN0cy4gRm9yIGV4YW1wbGUsIGEgbW9kZWwgYXJ0aWZhY3QgY2FuIGJlIGNvbXBvc2VkIG9mIG1vZGVsIGVsZW1lbnRzLCB3aGljaCBhcmUgYWxzbyBhcnRpZmFjdHMuCi1BcnRpZmFjdHMgYXJlIHRhbmdpYmxlIHdvcmsgcHJvZHVjdHMgY29uc3VtZWQsIHByb2R1Y2VkLCBvciBtb2RpZmllZCBieSBUYXNrcy4gIEl0IG1heSBzZXJ2ZSBhcyBhIGJhc2lzIGZvciBkZWZpbmluZyByZXVzYWJsZSBhc3NldHMuICBSb2xlcyB1c2UgQXJ0aWZhY3RzIHRvIHBlcmZvcm0gVGFza3MgYW5kIHByb2R1Y2UgQXJ0aWZhY3RzIGluIHRoZSBjb3Vyc2Ugb2YgcGVyZm9ybWluZyBUYXNrcy4gIEFydGlmYWN0cyBhcmUgdGhlIHJlc3BvbnNpYmlsaXR5IG9mIGEgc2luZ2xlIFJvbGUsIG1ha2luZyByZXNwb25zaWJpbGl0eSBlYXN5IHRvIGlkZW50aWZ5IGFuZCB1bmRlcnN0YW5kLCBhbmQgcHJvbW90aW5nIHRoZSBpZGVhIHRoYXQgZXZlcnkgcGllY2Ugb2YgaW5mb3JtYXRpb24gcHJvZHVjZWQgaW4gdGhlIG1ldGhvZCByZXF1aXJlcyB0aGUgYXBwcm9wcmlhdGUgc2V0IG9mIHNraWxscy4gRXZlbiB0aG91Z2ggb25lIHJvbGUgbWlnaHQgIm93biIgYSBzcGVjaWZpYyB0eXBlIG9mIEFydGlmYWN0cywgb3RoZXIgcm9sZXMgY2FuIHN0aWxsIHVzZSB0aGUgQXJ0aWZhY3RzOyBwZXJoYXBzIGV2ZW4gdXBkYXRlIHRoZW0gaWYgdGhlIFJvbGUgaGFzIGJlZW4gZ2l2ZW4gcGVybWlzc2lvbiB0byBkbyBzby48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOldvcmtQcm9kdWN0Ij4KLQkJCQk8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkNvbnRhaW5lZEFydGlmYWN0IiB0eXBlPSJ1bWE6QXJ0aWZhY3QiLz4KLQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iRGVsaXZlcmFibGUiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBXb3JrIFByb2R1Y3QgdGhhdCBwcm92aWRlcyBhIGRlc2NyaXB0aW9uIGFuZCBkZWZpbml0aW9uIGZvciBwYWNrYWdpbmcgb3RoZXIgV29yayBQcm9kdWN0cywgYW5kIG1heSBiZSBkZWxpdmVyZWQgdG8gYW4gaW50ZXJuYWwgb3IgZXh0ZXJuYWwgcGFydHkuICBUaGVyZWZvcmUsIGEgRGVsaXZlcmFibGUgYWdncmVnYXRlcyBvdGhlciBXb3JrIFByb2R1Y3RzLiBUaGVyZWZvcmUsIGEgRGVsaXZlcmFibGUgYWdncmVnYXRlcyBvdGhlciBXb3JrIFByb2R1Y3RzLiAgQSBEZWxpdmVyYWJsZSBpcyB1c2VkIHRvIHByZS1kZWZpbmUgdHlwaWNhbCBvciByZWNvbW1lbmRlZCBjb250ZW50IGluIHRoZSBmb3JtIG9yIHdvcmsgcHJvZHVjdHMgdGhhdCB3b3VsZCBiZSBwYWNrYWdlZCBmb3IgZGVsaXZlcnkuICBUaGUgYWN0dWFsIHBhY2thZ2luZyBvZiB0aGUgRGVsaXZlcmFibGUgaW4gYW4gYWN0dWFsIHByb2Nlc3Mgb3IgZXZlbiBwcm9qZWN0IGNvdWxkIGJlIGEgbW9kaWZpY2F0aW9uIG9mIHRoaXMgcmVjb21tZW5kYXRpb24uICBEZWxpdmVyYWJsZXMgYXJlIHVzZWQgdG8gcmVwcmVzZW50IGFuIG91dHB1dCBmcm9tIGEgcHJvY2VzcyB0aGF0IGhhcyB2YWx1ZSwgbWF0ZXJpYWwgb3Igb3RoZXJ3aXNlLCB0byBhIGNsaWVudCwgY3VzdG9tZXIgb3Igb3RoZXIgc3Rha2Vob2xkZXIuIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6V29ya1Byb2R1Y3QiPgotCQkJCTx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iRGVsaXZlcmVkV29ya1Byb2R1Y3QiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iT3V0Y29tZSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIFdvcmsgUHJvZHVjdCB0aGF0IGRlc2NyaWJlcyBpbnRhbmdpYmxlIHdvcmsgcHJvZHVjdHMgdGhhdCBhcmUgYSByZXN1bHQgb3Igc3RhdGUuIE91dGNvbWVzIG1heSBhbHNvIGJlIHVzZWQgdG8gZGVzY3JpYmUgd29yayBwcm9kdWN0cyB0aGF0IGFyZSBub3QgZm9ybWFsbHkgZGVmaW5lZC4gIEEga2V5IGRpZmZlcmVudGlhdG9yIGZvciBvdXRjb21lcyBhZ2FpbnN0IGFydGlmYWN0cyBpcyB0aGF0IG91dGNvbWVzIGFyZSBub3QgY2FuZGlkYXRlcyBmb3IgaGFydmVzdGluZyBhcyByZXVzYWJsZSBhc3NldHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpXb3JrUHJvZHVjdCIvPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlJvbGUiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBDb250ZW50IEVsZW1lbnQgdGhhdCBkZWZpbmVzIGEgc2V0IG9mIHJlbGF0ZWQgc2tpbGxzLCBjb21wZXRlbmNpZXMsIGFuZCByZXNwb25zaWJpbGl0aWVzLiAgUm9sZXMgYXJlIHVzZWQgYnkgVGFza3MgdG8gZGVmaW5lIHdobyBwZXJmb3JtcyB0aGVtIGFzIHdlbGwgYXMgZGVmaW5lIGEgc2V0IG9mIHdvcmsgcHJvZHVjdHMgdGhleSBhcmUgcmVzcG9uc2libGUgZm9yLiAgCi1BIFJvbGUgZGVmaW5lcyBhIHNldCBvZiByZWxhdGVkIHNraWxscywgY29tcGV0ZW5jaWVzLCBhbmQgcmVzcG9uc2liaWxpdGllcyBvZiBhbiBpbmRpdmlkdWFsIG9yIGEgc2V0IG9mIGluZGl2aWR1YWxzLiAgUm9sZXMgYXJlIG5vdCBpbmRpdmlkdWFscyBvciByZXNvdXJjZXMuICBJbmRpdmlkdWFsIG1lbWJlcnMgb2YgdGhlIGRldmVsb3BtZW50IG9yZ2FuaXphdGlvbiB3aWxsIHdlYXIgZGlmZmVyZW50IGhhdHMsIG9yIHBlcmZvcm0gZGlmZmVyZW50IHJvbGVzLiBUaGUgbWFwcGluZyBmcm9tIGluZGl2aWR1YWwgdG8gcm9sZSwgcGVyZm9ybWVkIGJ5IHRoZSBwcm9qZWN0IG1hbmFnZXIgd2hlbiBwbGFubmluZyBhbmQgc3RhZmZpbmcgZm9yIGEgcHJvamVjdCwgYWxsb3dzIGRpZmZlcmVudCBpbmRpdmlkdWFscyB0byBhY3QgYXMgc2V2ZXJhbCBkaWZmZXJlbnQgcm9sZXMsIGFuZCBmb3IgYSByb2xlIHRvIGJlIHBsYXllZCBieSBzZXZlcmFsIGluZGl2aWR1YWxzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6Q29udGVudEVsZW1lbnQiPgotCQkJCTx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUmVzcG9uc2libGVGb3IiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iVGFzayI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIENvbnRlbnQgRWxlbWVudCB0aGF0IGRlc2NyaWJlcyB3b3JrIGJlaW5nIHBlcmZvcm1lZCBieSBSb2xlcy4gIEl0IGRlZmluZXMgb25lIGRlZmF1bHQgcGVyZm9ybWluZyBSb2xlIGFzIHdlbGwgYXMgbWFueSBhZGRpdGlvbmFsIHBlcmZvcm1lcnMuICBBIFRhc2sgaXMgYXNzb2NpYXRlZCB0byBpbnB1dCBhbmQgb3V0cHV0IHdvcmsgcHJvZHVjdHMuICBJbnB1dHMgYXJlIGRpZmZlcmVudGlhdGVkIGluIG1hbmRhdG9yeSB2ZXJzdXMgb3B0aW9uYWwgaW5wdXRzLiAgVGhlIGFzc29jaWF0aW9ucyB0byBXb3JrIFByb2R1Y3RzIGFyZSBub3QgaW5zdGFudGlhdGFibGUvdmFyaWFibGUtbGlrZSBwYXJhbWV0ZXJzLiAgVGhleSByYXRoZXIgZXhwcmVzcyAoaHlwZXItKWxpbmtzIHRvIHRoZSBkZXNjcmlwdGlvbnMgb2YgdGhlIHdvcmsgcHJvZHVjdHMgdHlwZXMgdGhhdCBhcmUgcmVsYXRlZCB0byB0aGUgVGFzayBhcyBpbnB1dHMgYW5kIG91dHB1dHMuICBJbiBvdGhlciB3b3JkcywgdGhlc2UgYXNzb2NpYXRpb25zIGFyZSBub3QgaW50ZW5kZWQgdG8gYmUgdXNlZCB0byBjYXB0dXJlIHdoaWNoIGNvbmNyZXRlIGluc3RhbmNlcyB3aWxsIGJlIHBhc3NlZCB3aGVuIGluc3RhbnRpYXRpbmcgdGhlIG1ldGhvZCBpbiBhIHByb2plY3QuICBBbGwgb2YgdGhlIFRhc2sncyBkZWZhdWx0IGFzc29jaWF0aW9ucyBjYW4gYmUgb3ZlcnJpZGRlbiBpbiBhbiBhY3R1YWwgcHJvY2VzcyBkZWZpbml0aW9uLgotQSBUYXNrIGRlc2NyaWJlcyBhbiBhc3NpZ25hYmxlIHVuaXQgb2Ygd29yay4gIEV2ZXJ5IFRhc2sgaXMgYXNzaWduZWQgdG8gc3BlY2lmaWMgUm9sZXMuICBUaGUgZ3JhbnVsYXJpdHkgb2YgYSBUYXNrIGlzIGdlbmVyYWxseSBhIGZldyBob3VycyB0byBhIGZldyBkYXlzLiAgSXQgdXN1YWxseSBhZmZlY3RzIG9uZSBvciBvbmx5IGEgc21hbGwgbnVtYmVyIG9mIHdvcmsgcHJvZHVjdHMuIEEgVGFzayBpcyB1c2VkIGFzIGFuIGVsZW1lbnQgb2YgZGVmaW5pbmcgYSBwcm9jZXNzLiBUYXNrcyBhcmUgZnVydGhlciB1c2VkIGZvciBwbGFubmluZyBhbmQgdHJhY2tpbmcgcHJvZ3Jlc3M7IHRoZXJlZm9yZSwgaWYgdGhleSBhcmUgZGVmaW5lZCB0b28gZmluZS1ncmFpbmVkLCB0aGV5IHdpbGwgYmUgbmVnbGVjdGVkLCBhbmQgaWYgdGhleSBhcmUgdG9vIGxhcmdlLCBwcm9ncmVzcyB3b3VsZCBoYXZlIHRvIGJlIGV4cHJlc3NlZCBpbiB0ZXJtcyBvZiBhIFRhc2sncyBwYXJ0cyAoZS5nLiBTdGVwcywgd2hpY2ggaXMgbm90IHJlY29tbWVuZGVkKS4gCi1BIFRhc2sgaGFzIGEgY2xlYXIgcHVycG9zZSBpbiB3aGljaCB0aGUgcGVyZm9ybWluZyByb2xlcyBhY2hpZXZlIGEgd2VsbCBkZWZpbmVkIGdvYWwuICBJdCBwcm92aWRlcyBjb21wbGV0ZSBzdGVwLWJ5LXN0ZXAgZXhwbGFuYXRpb25zIG9mIGRvaW5nIGFsbCB0aGUgd29yayB0aGF0IG5lZWRzIHRvIGJlIGRvbmUgdG8gYWNoaWV2ZSB0aGlzIGdvYWwuICBUaGlzIGRlc2NyaXB0aW9uIGlzIGNvbXBsZXRlLCBpbmRlcGVuZGVudCBvZiB3aGVuIGluIGEgcHJvY2VzcyBsaWZlY3ljbGUgdGhlIHdvcmsgd291bGQgYWN0dWFsbHkgYmUgZG9uZS4gIEl0IHRoZXJlZm9yZSBkb2VzIG5vdCBkZXNjcmliZSB3aGVuIHlvdSBkbyB3aGF0IHdvcmsgYXQgd2hhdCBwb2ludCBvZiB0aW1lLCBidXQgZGVzY3JpYmVzIGFsbCB0aGUgd29yayB0aGF0IGdldHMgZG9uZSB0aHJvdWdob3V0IHRoZSBkZXZlbG9wbWVudCBsaWZlY3ljbGUgdGhhdCBjb250cmlidXRlcyB0byB0aGUgYWNoaWV2ZW1lbnQgb2YgdGhpcyBnb2FsLiAgV2hlbiB0aGUgVGFzayBpcyBiZWluZyBhcHBsaWVkIGluIGEgcHJvY2VzcyB0aGVuIHRoaXMgcHJvY2VzcyBhcHBsaWNhdGlvbiAoZGVmaW5lZCBhcyBUYXNrIERlc2NyaXB0b3IpIHByb3ZpZGVzIHRoZSBpbmZvcm1hdGlvbiBvZiB3aGljaCBwaWVjZXMgb2YgdGhlIFRhc2sgd2lsbCBhY3R1YWxseSBiZSBwZXJmb3JtZWQgYXQgYW55IHBhcnRpY3VsYXIgcG9pbnQgaW4gdGltZS4gVGhpcyBhc3N1bWVzIHRoYXQgdGhlIFRhc2sgd2lsbCBiZSBwZXJmb3JtZWQgaW4gdGhlIHByb2Nlc3Mgb3ZlciBhbmQgb3ZlciBhZ2FpbiwgYnV0IGVhY2ggdGltZSB3aXRoIGEgc2xpZ2h0bHkgZGlmZmVyZW50IGVtcGhhc2lzIG9uIGRpZmZlcmVudCBzdGVwcyBvciBhc3BlY3RzIG9mIHRoZSB0YXNrIGRlc2NyaXB0aW9uLiAKLUZvciBleGFtcGxlLCBhIFRhc2sgc3VjaCBhcyAiRGV2ZWxvcCBVc2UgQ2FzZSBNb2RlbCIgZGVzY3JpYmVzIGFsbCB0aGUgd29yayB0aGF0IG5lZWRzIHRvIGJlIGRvbmUgdG8gZGV2ZWxvcCBhIGNvbXBsZXRlIHVzZSBjYXNlIG1vZGVsLiBUaGlzIHdvdWxkIGNvbXByaXNlIG9mIHRoZSBpZGVudGlmaWNhdGlvbiBhbmQgbmFtaW5nIG9mIHVzZSBjYXNlcyBhbmQgYWN0b3JzLCB0aGUgd3JpdGluZyBvZiBhIGJyaWVmIGRlc2NyaXB0aW9uLCB0aGUgbW9kZWxpbmcgb2YgdXNlIGNhc2VzIGFuZCB0aGVpciByZWxhdGlvbnNoaXBzIGluIGRpYWdyYW1zLCB0aGUgZGV0YWlsZWQgZGVzY3JpcHRpb24gb2YgYSBiYXNpYyBmbG93LCB0aGUgZGV0YWlsZWQgZGVzY3JpcHRpb24gb2YgYWx0ZXJuYXRpdmVzIGZsb3dzLCBwZXJmb3JtaW5nIG9mIHdhbGt0aHJvdWdocyB3b3Jrc2hvcHMgYW5kIHJldmlld3MsIGV0Yy4gIEFsbCBvZiB0aGVzZSBwYXJ0cyBjb250cmlidXRlIHRvIHRoZSBkZXZlbG9wbWVudCBnb2FsIG9mIGRldmVsb3BpbmcgdGhlIHVzZSBjYXNlIG1vZGVsLCBidXQgdGhlIHBhcnRzIHdpbGwgYmUgcGVyZm9ybWVkIGF0IGRpZmZlcmVudCBwb2ludHMgaW4gdGltZSBpbiBhIHByb2Nlc3MuICBJZGVudGlmaWNhdGlvbiwgbmFtaW5nLCBhbmQgYnJpZWYgZGVzY3JpcHRpb25zIHdvdWxkIGJlIHBlcmZvcm1lZCBlYXJseSBpbiBhIHR5cGljYWwgZGV2ZWxvcG1lbnQgcHJvY2VzcyB2ZXJzdXMgdGhlIHdyaXRpbmcgb2YgZGV0YWlsZWQgYWx0ZXJuYXRpdmUgZmxvd3Mgd2hpY2ggd291bGQgYmUgcGVyZm9ybWVkIG11Y2ggbGF0ZXIuICBBbGwgdGhlc2UgcGFydHMgb3Igc3RlcHMgd2l0aGluIHRoZSBzYW1lIFRhc2sgZGVmaW5lIHRoZSAibWV0aG9kIiBvZiBEZXZlbG9waW5nIGEgVXNlIENhc2UgTW9kZWwuICBBcHBseWluZyBzdWNoIGEgbWV0aG9kIGluIGEgbGlmZWN5Y2xlIChpLmUuIGluIGEgcHJvY2VzcykgaXMgZGVmaW5pbmcgd2hpY2ggc3RlcHMgYXJlIGRvbmUgd2hlbiBnb2luZyBmcm9tIG9uZSBpdGVyYXRpb24gdG8gdGhlIG5leHQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpDb250ZW50RWxlbWVudCI+Ci0JCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlByZWNvbmRpdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJQb3N0Y29uZGl0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlBlcmZvcm1lZEJ5IiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQkJPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iTWFuZGF0b3J5SW5wdXQiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJPdXRwdXQiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJBZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Ik9wdGlvbmFsSW5wdXQiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJFc3RpbWF0ZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkVzdGltYXRpb25Db25zaWRlcmF0aW9ucyIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlRvb2xNZW50b3IiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJPC94c2Q6Y2hvaWNlPgotCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IldvcmtEZWZpbml0aW9uIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkFuIGFic3RyYWN0IE1ldGhvZCBFbGVtZW50IHRoYXQgZ2VuZXJhbGl6ZXMgYWxsIGRlc2NyaXB0aW9ucyBvZiB3b3JrIHdpdGhpbiB0aGUgVW5pZmllZCBNZXRob2QgQXJjaGl0ZWN0dXJlLiAgVGhpcyBwYWNrYWdlIGludHJvZHVjZXMgdHdvIGNvbmNyZXRlIHR5cGVzIG9mIFdvcmsgRGVmaW5pdGlvbnM6IFRhc2sgYW5kIFN0ZXAuICBXb3JrIERlZmluaXRpb25zIGNhbiBjb250YWluIHNldHMgb2YgcHJlLSBhbmQgcG9zdC1jb25kaXRpb25zIGRlZmluaW5nIGNvbnN0cmFpbnRzIHRoYXQgbmVlZCB0byBiZSB2YWxpZCBiZWZvcmUgdGhlIGRlc2NyaWJlZCB3b3JrIGNhbiBiZWdpbiBvciBiZWZvcmUgaXQgY2FuIGJlIGRlY2xhcmVkIGFzIGZpbmlzaGVkLiAgTm90ZSB0aGF0IGdlbmVyYWwgb3duZWRSdWxlcyBjYW4gYmUgdXNlZCB0byBkZWZpbmUgYWRkaXRpb25hbCBjb25zdHJhaW50cyBhbmQgcnVsZXMgZm9yIFdvcmsgRGVmaW5pdGlvbnMuCi1Xb3JrIERlZmluaXRpb25zIHJlcHJlc2VudCBiZWhhdmlvcmFsIGRlc2NyaXB0aW9ucyBmb3IgZG9pbmcgd29yay4gIFRoZXNlIGJlaGF2aW9yYWwgZGVzY3JpcHRpb25zIGFyZSBub3QgYm91bmQgdG8gb25lIHNwZWNpZmljIGNsYXNzaWZpZXIsIGJ1dCByZXByZXNlbnQgYW4gYXJiaXRyYXJ5IGRlZmluaXRpb24gb2Ygd29yay4gIEZvciBleGFtcGxlLCBhIFdvcmsgRGVmaW5pdGlvbiBjb3VsZCByZXByZXNlbnQgd29yayB0aGF0IGlzIGJlaW5nIHBlcmZvcm1lZCBieSBhIHNwZWNpZmljIFJvbGUgKGUuZy4gYSBSb2xlIHBlcmZvcm1pbmcgYSBzcGVjaWZpYyBUYXNrIG9yIFN0ZXBzIG9mIGEgVGFzayksIGJ5IG1hbnkgUm9sZXMgd29ya2luZyBpbiBjbG9zZSBjb2xsYWJvcmF0aW9uIChtYW55IFJvbGVzIGFsbCB3b3JraW5nIHRvZ2V0aGVyIG9uIHRoZSBzYW1lIGludGVyZGlzY2lwbGluYXJ5IFRhc2spLCBvciBjb21wbGV4IHdvcmsgdGhhdCBpcyBwZXJmb3JtZWQgdGhyb3VnaG91dCB0aGUgbGlmZWN5Y2xlIChlLmcuIGEgcHJvY2VzcyBkZWZpbmluZyBhIGJyZWFrZG93biBzdHJ1Y3R1cmUgZm9yIG9yZ2FuaXppbmcgbGFyZ2VyIGNvbXBvc2l0ZSB1bml0cyBvZiB3b3JrIHBlcmZvcm1lZCBieSBtYW55IFJvbGVzIHdvcmtpbmcgaW4gY29sbGFib3JhdGlvbikuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpNZXRob2RFbGVtZW50Ij4KLQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUHJlY29uZGl0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlBvc3Rjb25kaXRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkNvbnRlbnRDYXRlZ29yeSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BbiBhYnN0cmFjdCBjbGFzcyBnZW5lcmFsaXppbmcgY29udGVudCBjYXRlZ29yeSB0eXBlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkNvbnRlbnRFbGVtZW50Ii8+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iRGlzY2lwbGluZSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIGNhdGVnb3JpemF0aW9uIG9mIHdvcmsgKGkuZS4gVGFza3MgZm9yIE1ldGhvZCBDb250ZW50KSwgYmFzZWQgdXBvbiBzaW1pbGFyaXR5IG9mIGNvbmNlcm5zIGFuZCBjb29wZXJhdGlvbiBvZiB3b3JrIGVmZm9ydC4KLUEgZGlzY2lwbGluZSBpcyBhIGNvbGxlY3Rpb24gb2YgVGFza3MgdGhhdCBhcmUgcmVsYXRlZCB0byBhIG1ham9yICdhcmVhIG9mIGNvbmNlcm4nIHdpdGhpbiB0aGUgb3ZlcmFsbCBwcm9qZWN0LiBUaGUgZ3JvdXBpbmcgb2YgVGFza3MgaW50byBkaXNjaXBsaW5lcyBpcyBtYWlubHkgYW4gYWlkIHRvIHVuZGVyc3RhbmRpbmcgdGhlIHByb2plY3QgZnJvbSBhICd0cmFkaXRpb25hbCcgd2F0ZXJmYWxsIHBlcnNwZWN0aXZlLiBIb3dldmVyLCB0eXBpY2FsbHksIGZvciBleGFtcGxlLCBpdCBpcyBtb3JlIGNvbW1vbiB0byBwZXJmb3JtIGNlcnRhaW4gcmVxdWlyZW1lbnRzIGFjdGl2aXRpZXMgaW4gY2xvc2UgY29vcmRpbmF0aW9uIHdpdGggYW5hbHlzaXMgYW5kIGRlc2lnbiBhY3Rpdml0aWVzLiBTZXBhcmF0aW5nIHRoZXNlIGFjdGl2aXRpZXMgaW50byBzZXBhcmF0ZSBkaXNjaXBsaW5lcyBtYWtlcyB0aGUgYWN0aXZpdGllcyBlYXNpZXIgdG8gY29tcHJlaGVuZC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkNvbnRlbnRDYXRlZ29yeSI+Ci0JCQkJPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJUYXNrIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJTdWJEaXNjaXBsaW5lIiB0eXBlPSJ1bWE6RGlzY2lwbGluZSIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUmVmZXJlbmNlV29ya2Zsb3ciIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iRGlzY2lwbGluZUdyb3VwaW5nIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPlVzZWQgdG8gZ3JvdXAgRGlzY2lwbGluZXMuICBGb3IgZXhhbXBsZSwgdGhlIERpc2NpcGxpbmUgR3JvdXBpbmcgIlNvZnR3YXJlIERpc2NpcGxpbmVzIiB3b3VsZCBiZSB0aGUgZ3JvdXAgb2YgYWxsIGRpc2NpcGxpbmVzIHJlbGF0ZWQgdG8gZGV2ZWxvcGluZyBzb2Z0d2FyZSBzdWNoIGFzICJSZXF1aXJlbWVudHMgTWFuYWdlbWVudCIgb3IgIlRlc3RpbmciOyAiSVQgSW5mcmFzdHJ1Y3R1cmUgTWFuYWdlbWVudCIgd291bGQgYmUgYSBEaXNjaXBsaW5lcyBHcm91cGluZyBmb3IgZGlzY2lwbGluZXMgc3VjaCBhcyAiSVQgT3BlcmF0aW9uYWwgU2VydmljZXMiLCAiSVQgQ3VzdG9tZXIgUmVsYXRpb25zaGlwcyIsIG9yICJJVCBFbmFibGluZyBTZXJ2aWNlcyIuICBEaXNjaXBsaW5lcyBjYW4gYmUgYXNzb2NpYXRlZCB0byBtb3JlIHRoYW4gb25lIERpc2NpcGxpbmUgR3JvdXBpbmcuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpDb250ZW50Q2F0ZWdvcnkiPgotCQkJCTx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iRGlzY2lwbGluZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCTwveHNkOmNob2ljZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJEb21haW4iPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSByZWZpbmVhYmxlIGhpZXJhcmNoeSBncm91cGluZyByZWxhdGVkIHdvcmsgcHJvZHVjdHMuICBJbiBvdGhlciB3b3JkcywgRG9tYWlucyBjYW4gYmUgZnVydGhlciBkaXZpZGVkIGludG8gc3ViLWRvbWFpbnMsIHdpdGggd29yayBwcm9kdWN0IGVsZW1lbnRzIHRvIGJlIGNhdGVnb3JpemVkIG9ubHkgYXQgdGhlIGxlYWYtbGV2ZWwgb2YgdGhpcyBoaWVyYXJjaHkuCi1Eb21haW4gaXMgYSBsb2dpY2FsIGdyb3VwaW5nIG9mIHdvcmsgcHJvZHVjdHMgdGhhdCBoYXZlIGFuIGFmZmluaXR5IHRvIGVhY2ggb3RoZXIgYmFzZWQgb24gcmVzb3VyY2VzLCB0aW1pbmcsIG9yIHJlbGF0aW9uc2hpcC4gIEEgRG9tYWluIG1heSBiZSBkaXZpZGVkIGludG8gc3ViZG9tYWlucy4gIEZvciBleGFtcGxlLCBHUyBNZXRob2QgdXNlcyBzaXggcHJlZGVmaW5lZCBEb21haW5zIGZvciBXb3JrIFByb2R1Y3RzOiBBcHBsaWNhdGlvbiwgQXJjaGl0ZWN0dXJlLCBCdXNpbmVzcywgRW5nYWdlbWVudCwgT3BlcmF0aW9ucyBhbmQgT3JnYW5pemF0aW9uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6Q29udGVudENhdGVnb3J5Ij4KLQkJCQk8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IldvcmtQcm9kdWN0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJTdWJkb21haW4iIHR5cGU9InVtYTpEb21haW4iLz4KLQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUm9sZVNldCI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5Pcmdhbml6ZXMgUm9sZXMgaW50byBjYXRlZ29yaWVzLiAgSXQgaXMgdXNlZCB0byBncm91cCByb2xlcyB0b2dldGhlciB0aGF0IGhhdmUgY2VydGFpbiBjb21tb25hbGl0aWVzLiAgRm9yIGV4YW1wbGUsIHRoZSAiQW5hbHlzdHMiIFJvbGUgU2V0IGNvdWxkIGdyb3VwIHRoZSAiQnVzaW5lc3MgUHJvY2VzcyBBbmFseXN0IiwgIlN5c3RlbSBBbmFseXN0IiwgYXMgd2VsbCBhcyAiUmVxdWlyZW1lbnRzIFNwZWNpZmllciIgcm9sZXMuICBBbGwgb2YgdGhlc2Ugd29yayB3aXRoIHNpbWlsYXIgdGVjaG5pcXVlcyBhbmQgaGF2ZSBvdmVybGFwcGluZyBza2lsbHMsIGJ1dCBhcmUgcmVxdWlyZWQgYXMgZGlzdGluY3Qgcm9sZXMgZm9yIGEgbWV0aG9kIChlLmcuIHRoZSBtZXRob2QgdGhlIElCTSBSYXRpb25hbCBVbmlmaWVkIFByb2Nlc3MgaXMgYmFzZWQgb24pLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6Q29udGVudENhdGVnb3J5Ij4KLQkJCQk8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlJvbGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUm9sZVNldEdyb3VwaW5nIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPlJvbGUgU2V0cyBjYW4gYmUgY2F0ZWdvcml6ZWQgaW50byBSb2xlIFNldCBHcm91cGluZ3MuICBGb3IgZXhhbXBsZSwgZGlmZmVyZW50IG1ldGhvZHMgbWlnaHQgZGVmaW5lIHNpbWlsYXIgUm9sZSBTZXRzLCB3aGljaCBob3dldmVyIG5lZWQgdG8gYmUgZGlzdGluZ3Vpc2hlZCBmcm9tIGVhY2ggb3RoZXIgb24gYSBnbG9iYWwgc2NhbGUuICBUaHVzLCBSb2xlIFNldCBHcm91cGluZ3MgYWxsb3cgZGlzdGluZ3Vpc2hpbmcsIGZvciBleGFtcGxlLCBTb2Z0d2FyZSBTZXJ2aWNlcyBNYW5hZ2VyIFJvbGUgU2V0cyBmcm9tIFNvZnR3YXJlIERldmVsb3BtZW50IE9yZ2FuaXphdGlvbiBNYW5hZ2VyIFJvbGUgU2V0cy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkNvbnRlbnRDYXRlZ29yeSI+Ci0JCQkJPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJSb2xlU2V0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJPC94c2Q6Y2hvaWNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlRvb2wiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBjb250YWluZXIvYWdncmVnYXRlIGZvciBUb29sTWVudG9ycy4gIEl0IGNhbiBhbHNvIHByb3ZpZGUgZ2VuZXJhbCBkZXNjcmlwdGlvbnMgb2YgdGhlIHRvb2wgYW5kIGl0cyBnZW5lcmFsIGNhcGFiaWxpdGllcy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkNvbnRlbnRDYXRlZ29yeSI+Ci0JCQkJPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJUb29sTWVudG9yIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJPC94c2Q6Y2hvaWNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IldvcmtQcm9kdWN0VHlwZSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNlY29uZCBjYXRlZ29yeSBmb3Igd29yayBwcm9kdWN0cywgd2hpY2ggaW4gY29udHJhc3QgdG8gRG9tYWluIGlzIG1vcmUgcHJlc2VudGF0aW9uIG9yaWVudGVkLiAgQSB3b3JrIHByb2R1Y3QgY2FuIGhhdmUgbWFueSBXb3JrIFByb2R1Y3QgVHlwZXMuICBFeGFtcGxlcywgZm9yIGEgV29yayBQcm9kdWN0IFR5cGUgaXMgIkNsYXNzIERpYWdyYW0iLCB3aGljaCBjYXRlZ29yaXplcyB0aGUgQXJ0aWZhY3RzIEFuYWx5c2lzIE1vZGVsLCBEZXNpZ24gTW9kZWwsIFVzZXIgRXhwZXJpZW5jZSBNb2RlbCwgb3IgIlNwZWNpZmljYXRpb24iLCB3aGljaCBjYXRlZ29yaXplcyByZXF1aXJlbWVudHMgc3BlY2lmaWNhdGlvbnMgdGhhdCBkZWZpbmUgYSBzeXN0ZW0gd2l0aCBhIHdlbGwtZGVmaW5lZCBzeXN0ZW0gYm91bmRhcnksIHN1Y2ggYXMgdXNlIGNhc2Ugb3IgZnVuY3Rpb25hbCByZXF1aXJlbWVudHMgc3BlY2lmaWNhdGlvbi4gIEEgV29yayBQcm9kdWN0IGNhbiBiZSBjYXRlZ29yaXplZCB0byBiZSBvZiBtYW55IFdvcmsgUHJvZHVjdCBUeXBlcy4gIEZvciBleGFtcGxlLCBhIHVzZSBjYXNlIG1vZGVsIGNhbiBiZSBjYXRlZ29yaXplZCBhcyBhIFNwZWNpZmljYXRpb24gYXMgd2VsbCBhcyBEaWFncmFtIFdvcmsgUHJvZHVjdCBUeXBlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6Q29udGVudENhdGVnb3J5Ij4KLQkJCQk8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IldvcmtQcm9kdWN0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJPC94c2Q6Y2hvaWNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkN1c3RvbUNhdGVnb3J5Ij4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgY2F0ZWdvcnkgaW50cm9kdWNlZCBieSBhIG1ldGhvZCBjb250ZW50IGF1dGhvciB0byBzdHJ1Y3R1cmUgYW55IG51bWJlciBvZiBtZXRob2QgQ29udGVudCBFbGVtZW50cyBvZiBhbnkgc3VidHlwZSBiYXNlZCBvbiB1c2VyLWRlZmluZWQgY3JpdGVyaWEuICBCZWNhdXNlIENvbnRlbnQgQ2F0ZWdvcmllcyAoYW5kIHRoZXJlZm9yZSBDdXN0b20gQ2F0ZWdvcmllcywgdG9vKSBhcmUgQ29udGVudCBFbGVtZW50cyB0aGVtc2VsdmVzLCBDdXN0b20gQ2F0ZWdvcmllcyBjYW4gYmUgdXNlZCB0byByZWN1cnNpdmVseSBjYXRlZ29yaXplIENvbnRlbnQgQ2F0ZWdvcmllcyBhcyB3ZWxsLiAgQ3VzdG9tIENhdGVnb3JpZXMgY2FuIGFsc28gYmUgbmVzdGVkIHdpdGggYW55IENvbnRlbnQgQ2F0ZWdvcnkuICBDdXN0b20gY2F0ZWdvcmllcyBjYW4gYmUgdXNlZCB0byBjYXRlZ29yaXplIGNvbnRlbnQgYmFzZWQgb24gdGhlIHVzZXIncyBjcml0ZXJpYSBhcyB3ZWxsIGFzIHRvIGRlZmluZSB3aG9sZSB0cmVlLXN0cnVjdHVyZXMgb2YgbmVzdGVkIGNhdGVnb3JpZXMgYWxsb3dpbmcgdGhlIHVzZXIgdG8gc3lzdGVtYXRpY2FsbHkgbmF2aWdhdGUgYW5kIGJyb3dzZSBtZXRob2QgY29udGVudCBhbmQgcHJvY2Vzc2VzIGJhc2VkIG9uIHRoZXNlIGNhdGVnb3JpZXMuICBGb3IgZXhhbXBsZSwgb25lIGNvdWxkIGNyZWF0ZSBhIGN1c3RvbSBjYXRlZ29yeSB0byBsb2dpY2FsbHkgb3JnYW5pemUgY29udGVudCByZWxldmFudCBmb3IgdGhlIHVzZXIncyBkZXZlbG9wbWVudCBvcmdhbml6YXRpb24gZGVwYXJ0bWVudHM7IGUuZy4gYSAiVGVzdGluZyIgY2F0ZWdvcnkgdGhhdCBncm91cHMgdG9nZXRoZXIgYWxsIHJvbGVzLCB3b3JrIHByb2R1Y3RzLCB0YXNrcywgYW5kIGd1aWRhbmNlIGVsZW1lbnQgcmVsZXZhbnQgdG8gdGVzdGluZy4gIEFub3RoZXIgZXhhbXBsZSB3b3VsZCBiZSBjYXRlZ29yaWVzIHRoYXQgZXhwcmVzcyBsaWNlbnNpbmcgbGV2ZWxzIG9mIHRoZSBjb250ZW50IGdyb3VwaW5nIGZyZWVseSBkaXN0cmlidXRhYmxlIG1ldGhvZCBjb250ZW50IHZlcnN1cyBjb250ZW50IHRoYXQgcmVwcmVzZW50IGludGVsbGVjdHVhbCBwcm9wZXJ0eSBhbmQgcmVxdWlyZXMgYSBsaWNlbnNlIHRvIGJlIHB1cmNoYXNlZCB0byBiZSBhYmxlIHRvIHVzZSBpdC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkNvbnRlbnRDYXRlZ29yeSI+Ci0JCQkJPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJDYXRlZ29yaXplZEVsZW1lbnQiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlN1YkNhdGVnb3J5IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJPC94c2Q6Y2hvaWNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ik1ldGhvZFBhY2thZ2UiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QW4gYWJzdHJhY3QgY2xhc3MgZm9yIHBhY2thZ2luZyBNZXRob2QgRWxlbWVudHMuICBBbGwgTWV0aG9kIEVsZW1lbnRzIHNoYWxsIGJlIGxvY2F0ZWQgaW4gZXhhY3RseSBvbmUgb2YgTWV0aG9kIFBhY2thZ2UncyBjb25jcmV0ZSBzcGVjaWFsaXphdGlvbnMgKGUuZy4gQ29udGVudCBQYWNrYWdlKS4gICBNZXRob2QgUGFja2FnZSBkZWZpbmVzIGNvbW1vbiBwcm9wZXJ0aWVzIGZvciBhbGwgb2YgaXRzIHNwZWNpYWxpemF0aW9ucy4gRWxlbWVudHMgYXJlIG9yZ2FuaXplZCBpbiBNZXRob2QgUGFja2FnZXMgdG8gc3RydWN0dXJlIGxhcmdlIHNjYWxlIG9mIG1ldGhvZCBjb250ZW50IGFuZCBwcm9jZXNzZXMgYXMgd2VsbCBhcyB0byBkZWZpbmUgYSBtZWNoYW5pc20gZm9yIHJldXNlLiAgTWV0aG9kIEVsZW1lbnRzIGZyb20gb25lIHBhY2thZ2UgY2FuIHJldXNlIGVsZW1lbnQgZnJvbSBvdGhlciBwYWNrYWdlcyBieSBkZWZpbmluZyBhIHJldXNlZFBhY2thZ2VzIGxpbmsuICBGb3IgZXhhbXBsZSwgYSB3b3JrIHByb2R1Y3QgZGVmaW5lZCBpbiBvbmUgcGFja2FnZSBjYW4gYmUgdXNlZCBhcyBhbiBpbnB1dCBmb3IgVGFza3MgZGVmaW5lZCBpbiBvdGhlciBwYWNrYWdlcy4gIEJ5IHJldXNpbmcgaXQgZnJvbSBvbmUgY29tbW9uIHBsYWNlIChpLmUuIHRoZSBwYWNrYWdlIGluIHdoaWNoIGl0IGhhcyBiZWVuIGRlZmluZWQpIGVuc3VyZXMgdGhhdCBubyByZWR1bmRhbnQgZGVmaW5pdGlvbnMgb2YgdGhlIHNhbWUgZWxlbWVudHMgYXJlIHJlcXVpcmVkLiAgQWxzbyBtYWludGVuYW5jZSBvZiBtZXRob2QgY29udGVudCBpcyBncmVhdGx5IGltcHJvdmVkIGFzIGNoYW5nZXMgY2FuIGJlIHBlcmZvcm1lZCBpbiBvbmx5IG9uZSBwbGFjZS4gIE5vdGUsIHRoYXQgb3RoZXIgcGFja2FnZXMgd2lsbCBpbnRyb2R1Y2UgbW9yZSBzcGVjaWFsaXphdGlvbnMgb2YgTWV0aG9kIFBhY2thZ2UsIGUuZy4gUHJvY2VzcyBQYWNrYWdlIGFuZCBQcm9jZXNzIENvbXBvbmVudC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOk1ldGhvZEVsZW1lbnQiPgotCQkJCTx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUmV1c2VkUGFja2FnZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iTWV0aG9kUGFja2FnZSIgdHlwZT0idW1hOk1ldGhvZFBhY2thZ2UiLz4KLQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0iZ2xvYmFsIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5NZXRob2QgUGFja2FnZXMgY2FuIGhhdmUgYSBnbG9iYWwgc2NvcGUuICBUaGlzIG1lYW5zIHRoYXQgZXZlcnkgZWxlbWVudCBvZiBldmVyeSBvdGhlciBNZXRob2QgUGFja2FnZSBjYW4gc2VlIHRoZSBnbG9iYWwgcGFja2FnZSdzIGNvbnRlbnRzLiAgR2xvYmFsIE1ldGhvZCBQYWNrYWdlcyBhcmUgcHJpbWFyaWx5IHVzZWQgdG8gc3RvcmUgY29tbW9ubHkgdXNlZCBjYXRlZ29yeSBkZWZpbml0aW9ucyBzdWNoIGFzIGZvciBEaXNjaXBsaW5lcyBvciBEb21haW5zLCB3aGljaCBhcmUgdXNlZCBieSBtYW55IFRhc2sgYW5kIFdvcmsgUHJvZHVjdHMgcmVzcGVjdGl2ZWx5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkNvbnRlbnRQYWNrYWdlIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lhbCBNZXRob2QgUGFja2FnZSB0aGF0IGNvbnRhaW5zIENvbnRlbnQgRWxlbWVudHMgYW5kIENvbnRlbnQgRWxlbWVudHMsIG9ubHkuICBFeGFtcGxlcyBmb3IgQ29udGVudCBFbGVtZW50IGFyZSBBcnRpZmFjdHMsIFRhc2tzLCBSb2xlcywgZXRjLiAgQSBrZXkgc2VwYXJhdGlvbiBvZiBjb25jZXJucyBpbiBVTUEgaXMgdGhlIGRpc3RpbmN0aW9uIGJldHdlZW4gTWV0aG9kIENvbnRlbnQgYW5kIFByb2Nlc3MuICBUaGlzIHNlcGFyYXRpb24gaXMgZW5mb3JjZWQgYnkgc3BlY2lhbCBwYWNrYWdlIHR5cGVzLCB3aGljaCBkbyBub3QgYWxsb3cgdGhlIG1peGluZyBvZiBtZXRob2QgY29udGVudCB3aXRoIHByb2Nlc3Nlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOk1ldGhvZFBhY2thZ2UiPgotCQkJCTx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQ29udGVudEVsZW1lbnQiIHR5cGU9InVtYTpDb250ZW50RWxlbWVudCIvPgotCQkJCTwveHNkOmNob2ljZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJDb250ZW50Q2F0ZWdvcnlQYWNrYWdlIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lhbCBNZXRob2QgUGFja2FnZSB0aGF0IG9ubHkgY29udGFpbnMgQ29udGVudCBDYXRlZ29yeSBFbGVtZW50cy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOk1ldGhvZFBhY2thZ2UiPgotCQkJCTx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQ29udGVudENhdGVnb3J5IiB0eXBlPSJ1bWE6Q29udGVudENhdGVnb3J5Ii8+Ci0JCQkJPC94c2Q6Y2hvaWNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlByb2Nlc3NFbGVtZW50Ij4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgRGVzY3JpYmFibGUgRWxlbWVudCB0aGF0IHJlcHJlc2VudHMgYW4gYWJzdHJhY3QgZ2VuZXJhbGl6YXRpb24gZm9yIGFsbCBlbGVtZW50cyBkZWZpbmVkIGluIHRoZSBQcm9jZXNzIHBhY2thZ2UuCi1Qcm9jZXNzIEVsZW1lbnRzIHJlcHJlc2VudHMgUHJvY2VzcyBzcGVjaWZpYyBlbGVtZW50cyB0aGF0IGFyZSBzdXBwb3NlZCB0byBiZSBtYW5hZ2VkIGluIFByb2Nlc3MgUGFja2FnZXMuICBUaGUgc2VwYXJhdGlvbiBvZiBQcm9jZXNzIEVsZW1lbnQgZnJvbSBDb250ZW50IEVsZW1lbnQgYWxsb3dzIHRvIGNsZWFybHkgZGlzdGluZ3Vpc2ggYmV0d2VlbiBwdXJlIG1ldGhvZCBjb250ZW50IGZyb20gY29udGVudCB0aGF0IGlzIHJlcHJlc2VudGVkIGluIHByb2Nlc3Nlcy4gPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpEZXNjcmliYWJsZUVsZW1lbnQiLz4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJQbGFubmluZ0RhdGEiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBQcm9jZXNzIEVsZW1lbnQgdGhhdCBhZGRzIHBsYW5uaW5nIGRhdGEgdG8gQnJlYWtkb3duIEVsZW1lbnRzIHdoZW4gaXQgaXMgdXNlZCBmb3IgYSBQcm9jZXNzIFBsYW5uaW5nIFRlbXBsYXRlLiAgRm9yIERlbGl2ZXJ5IFByb2Nlc3NlcyBhbmQgQ2FwYWJpbGl0eSBQYXR0ZXJucyB0aGlzIGNsYXNzIGNhbiBlaXRoZXIgbm90IGJlIGluc3RhbnRpYXRlZCBvciBwb3B1bGF0ZWQgd2l0aCBkZWZhdWx0IGRhdGEuCi1QbGFubmluZyBEYXRhIGZhY3RvcnMgb3V0IHNwZWNpZmljIG9wdGlvbmFsIGRhdGEgbmVlZGVkIGZvciByZXByZXNlbnRpbmcgcGxhbm5pbmcgdGVtcGxhdGVzLiAgVGhpcyBhc3NvY2lhdGlvbiBhbGxvd3MgdG8gYWNjZXNzIHBsYW5uaW5nIGRhdGEgaWYgaXQgaXMgc3RvcmVkIGZvciB0aGUgQnJlYWtkb3duIEVsZW1lbnQuCi0oTk9URSwgVEhFIEFUVFJJQlVURVMgRk9SIFRISVMgQ0xBU1MgQVJFIE5PVCBDT01QTEVURSwgWUVUKTwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6UHJvY2Vzc0VsZW1lbnQiPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9InN0YXJ0RGF0ZSIgdHlwZT0ieHNkOmRhdGVUaW1lIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBkZWZhdWx0IHN0YXJ0IGRhdGUgZm9yIGEgcGxhbmVkIFRhc2suPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0iZmluaXNoRGF0ZSIgdHlwZT0ieHNkOmRhdGVUaW1lIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBkZWZhdWx0IGZpbmlzaCBkYXRlIGZvciBhIHBsYW5lZCBUYXNrLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9InJhbmsiIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+VGhlIGRlZmF1bHQgcmFuayBmb3IgYSBwbGFuZWQgVGFzay48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJCcmVha2Rvd25FbGVtZW50Ij4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkFuIGFic3RyYWN0IGdlbmVyYWxpemF0aW9uIGZvciBhbnkgdHlwZSBvZiBNZXRob2QgRWxlbWVudCB0aGF0IGlzIHBhcnQgb2YgYSBicmVha2Rvd24gc3RydWN0dXJlLiAgSXQgZGVmaW5lcyBhIHNldCBvZiBwcm9wZXJ0aWVzIGF2YWlsYWJsZSB0byBhbGwgb2YgaXRzIHNwZWNpYWxpemF0aW9ucy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOlByb2Nlc3NFbGVtZW50Ij4KLQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUHJlc2VudGVkQWZ0ZXIiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUHJlc2VudGVkQmVmb3JlIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlBsYW5uaW5nRGF0YSIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJTdXBlckFjdGl2aXR5IiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJwcmVmaXgiIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+UHJlZml4IHJlcHJlc2VudHMgYW4gYWRkaXRpb25hbCBsYWJlbCB0aGF0IHdpbGwgYmUgcHJlc2VudGVkIGFzIGEgcHJlZml4IHRvIGFueSBCcmVha2Rvd24gRWxlbWVudCB0byBpbmRpY2F0ZSBhIHVzZXItZGVmaW5lZCBzdWItdHlwZSBmb3IgdGhlIGVsZW1lbnQuICBGb3IgZXhhbXBsZSwgaWYgdGhlIHByb2Nlc3MgZW5naW5lZXIgd291bGQgbGlrZSB0byBkaXN0aW5ndWlzaCBoaXMgQWN0aXZpdGllcyBieSAnTW9kdWxlJyAoYXMgZG9uZSBpbiB0aGUgSUJNIFJhdGlvbmFsIFN1bW1pdCBBc2NlbmRhbnQgTWV0aG9kKSwgaGUgY2FuIGRlZmluZSBhIGRpZmZlcmVudCBwcmVmaXggZm9yIGV2ZXJ5IG1vZGVsIHRvIGJlIHVzZWQgaW4gYWRkaXRpb24gdG8gbmFtaW5nIEFjdGl2aXRpZXMsIGUuZy4gIlNSQS5Fc3RhYmxpc2ggUmVxdWlyZW1lbnRzIiB3aXRoIFNSQSBpbmRpY2F0aW5nIHRoYXQgdGhpcyBBY3Rpdml0eSBiZWxvbmdzIHRvIHRoZSAiU29mdHdhcmUgUmVxdWlyZW1lbnRzIEFuYWx5c2lzIiBtb2R1bGUuICBBbm90aGVyIGNvbW1vbiBhcHBsaWNhdGlvbiBmb3IgcHJlZml4IGlzIHRvIHF1YWxpZnkgcm9sZXMgaW4gUm9sZSBEZXNjcmlwdG9ycy4gIEZvciBleGFtcGxlLCAiQ3VzdG9tZXIuQXJjaGl0ZWN0IiB3b3VsZCBkZWZpbmUgYSAiQ3VzdG9tZXIiIHByZWZpeCBmb3IgdGhlIFJvbGUgRGVzY3JpcHRvciAiQXJjaGl0ZWN0IiBleHByZXNzaW5nIHRoYXQgdGhpcyBpcyBhbiBhcmNoaXRlY3Qgb24gdGhlIGN1c3RvbWVyIHNpZGUgYW5kIG5vdCB0aGUgZGV2ZWxvcG1lbnQgdGVhbSBzaWRlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImlzUGxhbm5lZCIgdHlwZT0ieHNkOmJvb2xlYW4iPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+QSBrZXkgYXBwbGljYXRpb24gZm9yIERldmVsb3BtZW50IFByb2Nlc3NlcyBleHByZXNzZWQgd2l0aCBCcmVha2Rvd24gc3RydWN0dXJlcyBpcyB0byBnZW5lcmF0ZSBhIHByb2plY3QgcGxhbiBmcm9tIGl0LiAgQSBwcm9jZXNzIGFzIGRlZmluZWQgaW4gVU1BIChjZi4gd2l0aCBTZWN0aW9ucyBYWCBhbmQgNS4yKSBpcyBhIG11bHRpLWRpbWVuc2lvbmFsIHN0cnVjdHVyZSBkZWZpbmluZyB3aGF0IHdvcmsgaXMgYmVpbmcgcGVyZm9ybWVkIGF0IHdoYXQgdGltZSBieSB3aGljaCByb2xlcyB1c2luZyB3aGljaCBpbnB1dCBhbmQgcHJvZHVjaW5nIHdoYXQgb3V0cHV0cy4gIEEgcHJvamVjdCBwbGFuIGFzIGl0IGlzIHJlcHJlc2VudGVkIGluIHByb2plY3QgcGxhbm5pbmcgdG9vbHMgc3VjaCBhcyBJQk0gUmF0aW9uYWwgUG9ydGZvbGlvIE1hbmFnZXIgb3IgTWljcm9zb2Z0IFByb2plY3Qgbm9ybWFsbHkgZG9lcyBub3QgbmVlZCBhbGwgdGhpcyBpbmZvcm1hdGlvbiBhbmQgaXMgbm9ybWFsbHkgbGltaXRlZCB0byBqdXN0IHJlcHJlc2VudGluZyBhIHN1YnNldC4gIEZvciBleGFtcGxlLCBhIHR5cGljYWwgTVMgUHJvamVjdCBwbGFuIG9ubHkgcmVwcmVzZW50cyB0aGUgd29yayBicmVha2Rvd24gY29uc2lzdGluZyBvZiBUYXNrcyBhbmQgQWN0aXZpdGllcyAoc29tZXRpbWVzIHJlZmVycmVkIHRvIGFzIHN1bW1hcnkgdGFza3MpLiAgSXQgZG9lcyBub3Qgc2hvdyB0aGUgaW5wdXQgYW5kIG91dHB1dCBXb3JrIFByb2R1Y3RzIGZvciBhIFRhc2ssIGJ1dCBpdCBjYW4gc2hvdyB3aGljaCByb2xlcyBzaGFsbCBiZSBzdGFmZmVkIGZvciBwZXJmb3JtaW5nIHRoZSBUYXNrLiAgSG93ZXZlciwgc3VjaCByb2xlIGFsbG9jYXRpb24gbmVlZCB0byBiZSByZXBsYWNlZCB3aXRoIGNvbmNyZXRlIHJlc291cmNlcyB3aGVuIGluc3RhbnRpYXRpbmcgdGhlIHBsYW4gZm9yIGEgY29uY3JldGUgcHJvamVjdC4gIFNvbWV0aW1lcyBwcm9qZWN0IHBsYW5zIGNhbiB0aGVuIGFnYWluIGJlIG9yZ2FuaXplZCBkaWZmZXJlbnRseSBieSBvcmdhbml6aW5nIHdvcmsgYnkgZGVsaXZlcmFibGVzIGluIHdoaWNoIFdvcmsgUHJvZHVjdHMgYXJlIG1hcHBlZCB0byB0aGUgcGxhbidzIHN1bW1hcnkgdGFza3MgYW5kIFRhc2sgdGhhdCBoYXZlIHRoZXNlIHdvcmsgcHJvZHVjdHMgYXMgb3V0cHV0IG1hcHBlZCBiZWxvdyBzdWNoIGFzIHN1bW1hcnkgdGFzay4gIFRoZXJlZm9yZSwgYSBwcm9jZXNzIGNhbiBtYWtlIHJlY29tbWVuZGF0aW9ucyBhYm91dCB3aGljaCBlbGVtZW50cyB0byBpbmNsdWRlIGFuZCB3aGljaCB0byBleGNsdWRlIHdoZW4gZ2VuZXJhdGluZyBhIHBsYW4uICBXaGVuIHRoZSBpc1BsYW5uZWQgYXR0cmlidXRlIGlzIHNldCB0byBGYWxzZSBmb3IgYW4gaW5zdGFuY2Ugb2YgYSBCcmVha2Rvd24gRWxlbWVudCwgdGhlbiB0aGlzIGVsZW1lbnQgc2hhbGwgbm90IGJlIG5vdCBpbmNsdWRlZCB3aGVuIGEgY29uY3JldGUgcHJvamVjdCBwbGFuIGlzIGJlaW5nIGdlbmVyYXRlZCBmcm9tIHRoZSBicmVha2Rvd24gc3RydWN0dXJlIHRoYXQgY29udGFpbnMgdGhpcyBlbGVtZW50LgotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0iaGFzTXVsdGlwbGVPY2N1cnJlbmNlcyIgdHlwZT0ieHNkOmJvb2xlYW4iPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+SnVzdCBhcyB0aGUgaXNQbGFubmVkIGF0dHJpYnV0ZSB0aGUgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcyBhdHRyaWJ1dGUgaGFzIGFuIGltcGFjdCBvbiBnZW5lcmF0aW5nIHBsYW5zIGZyb20gYSBQcm9jZXNzLiAgV2hlbiB0aGlzIGF0dHJpYnV0ZSBpcyBzZXQgdG8gVHJ1ZSBmb3IgYSBCcmVha2Rvd24gRWxlbWVudCB0aGVuIGl0IHdpbGwgdHlwaWNhbGx5IG9jY3VyIG11bHRpcGxlIHRpbWVzIHdpdGhpbiB0aGUgc2FtZSBBY3Rpdml0eS4gIEZvciBleGFtcGxlLCBhIFRhc2sgc3VjaCBhcyAiRGV0YWlsIFVzZSBDYXNlIiB3b3VsZCBiZSBwZXJmb3JtZWQgZm9yIGV2ZXJ5IHVzZSBjYXNlIGlkZW50aWZpZWQgZm9yIGEgcGFydGljdWxhciBJdGVyYXRpb24gb3IgQWN0aXZpdHkuICBHZW5lcmF0aW5nIGEgcGxhbiB3b3VsZCBsaXN0IG9uZSBUYXNrIGluc3RhbmNlIHBlciB1c2UgY2FzZS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpc09wdGlvbmFsIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5JbmRpY2F0ZXMgdGhhdCB0aGUgQnJlYWtkb3duIEVsZW1lbnQgZGVzY3JpYmVzIHdvcmssIGEgd29yayByZXN1bHQsIG9yIGV2ZW4gd29yayByZXNvdXJjZXMsIHdoaWNoIGluY2x1c2lvbiBpcyBub3QgbWFuZGF0b3J5IHdoZW4gcGVyZm9ybWluZyBhIHByb2plY3QgdGhhdCBpcyBwbGFubmVkIGJhc2VkIG9uIGEgcHJvY2VzcyBjb250YWluaW5nIHRoaXMgZWxlbWVudC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJXb3JrT3JkZXIiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+UmVwcmVzZW50cyBhIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHR3byBCcmVha2Rvd24gRWxlbWVudHMgaW4gd2hpY2ggb25lIEJyZWFrZG93biBFbGVtZW50cyBkZXBlbmRzIG9uIHRoZSBzdGFydCBvciBmaW5pc2ggb2YgYW5vdGhlciBCcmVha2Rvd24gRWxlbWVudHMgaW4gb3JkZXIgdG8gYmVnaW4gb3IgZW5kLiAgCi1UaGUgV29yayBPcmRlciBjbGFzcyBkZWZpbmVzIHByZWRlY2Vzc29yIGFuZCBzdWNjZXNzb3IgcmVsYXRpb25zIGFtb25nc3QgQnJlYWtkb3duIEVsZW1lbnRzLiAgVGhpcyBpbmZvcm1hdGlvbiBpcyBpbiBwYXJ0aWN1bGFyIGNyaXRpY2FsIGZvciBwbGFubmluZyBhcHBsaWNhdGlvbnMuICBTZWUgbW9yZSBkZXRhaWxzIG9uIGRpZmZlcmVudCB0eXBlcyBvZiBXb3JrIE9yZGVyIHJlbGF0aW9uc2hpcHMgYXQgV29yayBPcmRlciBUeXBlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6c2ltcGxlQ29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InhzZDpzdHJpbmciPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBnbG9iYWwgdW5pcXVlIGlkIGZvciBhIHdvcmsgb3JkZXIuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0ibGlua1R5cGUiIHR5cGU9InVtYTpXb3JrT3JkZXJUeXBlIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlRoaXMgYXR0cmlidXRlIGV4cHJlc3NlcyB0aGUgdHlwZSBvZiB0aGUgV29yayBPcmRlciByZWxhdGlvbnNoaXAgYnkgYXNzaWduaW5nIGEgdmFsdWUgZnJvbSB0aGUgV29yayBPcmRlciBUeXBlIGVudW1lcmF0aW9uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpzaW1wbGVDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iV29ya0JyZWFrZG93bkVsZW1lbnQiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWFsIEJyZWFrZG93biBFbGVtZW50IHRoYXQgcHJvdmlkZXMgc3BlY2lmaWMgcHJvcGVydGllcyBmb3IgQnJlYWtkb3duIEVsZW1lbnRzIHRoYXQgcmVwcmVzZW50IG9yIHJlZmVyIHRvIFdvcmsgRGVmaW5pdGlvbnMuICBGb3IgZXhhbXBsZSBpdHMgc3ViY2xhc3MgQWN0aXZpdHkgZGVmaW5lcyB3b3JrIGFzIGl0IGlzIGFsc28gYSBzdWJjbGFzcyBvZiBXb3JrIERlZmluaXRpb24uICBJdHMgc3ViY2xhc3MgVGFzayBEZXNjcmlwdG9yIGRvZXMgbm90IGRlZmluZSB3b3JrIGJ5IGl0c2VsZiwgYnV0IHJlZmVycyB0byBhIFdvcmsgRGVmaW5pdGlvbiBhbmQgdGhlcmVmb3JlIGNhbiBoYXZlIHRoZSBzYW1lIGNvbW1vbiBwcm9wZXJ0aWVzIGFuZCBXb3JrIEJyZWFrZG93biBFbGVtZW50IGhhcy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkJyZWFrZG93bkVsZW1lbnQiPgotCQkJCTx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUHJlZGVjZXNzb3IiIHR5cGU9InVtYTpXb3JrT3JkZXIiLz4KLQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0iaXNSZXBlYXRhYmxlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGlzIGF0dHJpYnV0ZSBpcyB1c2VkIHRvIGRlZmluZSByZXBldGl0aW9uIG9mIHdvcmssIGUuZy4gaXRlcmF0aW9ucy4gIEEgUHJvY2VzcyBXb3JrIERlZmluaXRpb24gd2l0aCB0aGlzIGF0dHJpYnV0ZSBzZXQgdG8gVHJ1ZSBzaGFsbCBiZSByZXBlYXRlZCBtb3JlIHRoYW4gb25jZSBvbiB0aGUgc2FtZSBzZXQgb2YgYXJ0aWZhY3RzLiAgRm9yIGV4YW1wbGUsIGZvciBhbiBpbnN0YW5jZSBvZiBJdGVyYXRpb24gKGRlZmluZWQgYXMgYSBzcGVjaWFsIFByb2Nlc3MgV29yayBEZWZpbml0aW9uIGJlbG93KSB0aGlzIGF0dHJpYnV0ZSBpcyBzZXQgdG8gVHJ1ZSBieSBkZWZhdWx0IGluZGljYXRpbmcgdGhhdCBldmVyeSBzdWItQWN0aXZpdHkgd2lsbCBiZSByZXBlYXRlZCBtb3JlIHRoYW4gb25jZS4gIEhvd2V2ZXIsIGFueSBQcm9jZXNzIFdvcmsgRGVmaW5pdGlvbiBjYW4gc2V0IHRoaXMgYXR0cmlidXRlIHRvIFRydWUgdG8gZGVmaW5lIGl0ZXJhdGlvbnMgKGUuZy4gdG8gaXRlcmF0ZSBvbmUgQWN0aXZpdHkgY29uc2lzdGluZyBvZiBtYW55IHN1Yi1hY3Rpdml0aWVzIG9yIGV2ZW4gUGhhc2VzLCBidXQgdG8gaXRlcmF0ZSBqdXN0IG9uZSBUYXNrKS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpc09uZ29pbmciIHR5cGU9InhzZDpib29sZWFuIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPklmIHRoZSBpc09uZ29pbmcgYXR0cmlidXRlIGlzIHNldCB0byBUcnVlIGZvciBhIFByb2Nlc3MgV29yayBEZWZpbml0aW9uIGluc3RhbmNlLCB0aGVuIHRoZSBlbGVtZW50IGRlc2NyaWJlcyBhbiBvbmdvaW5nIHBpZWNlIG9mIHdvcmsgd2l0aG91dCBhIGZpeGVkIGR1cmF0aW9uIG9yIGVuZCBzdGF0ZS4gIEZvciBleGFtcGxlLCB0aGUgUHJvY2VzcyBXb3JrIERlZmluaXRpb24gY291bGQgcmVwcmVzZW50IHdvcmsgb2YgYW4gYWRtaW5pc3RyYXRvciBjb250aW51b3VzbHkgKGUuZy4gM2ggYSBkYXkpIHdvcmtpbmcgdG8gZW5zdXJlIHRoYXQgc3lzdGVtcyBhcmUga2VwdCBpbiBhIGNlcnRhaW4gc3RhdGUuICBBbm90aGVyIGV4YW1wbGUgd291bGQgYmUgcHJvZ3JhbSBtYW5hZ2VtZW50IHdvcmsgb3ZlcnNlZWluZyBtYW55IGRpZmZlcmVudCBwcm9qZWN0cyBiZWluZyBzY2hlZHVsZWQgZm9yIG9uZSBwYXJ0aWN1bGFyIHByb2plY3QgYXQgc3BlY2lmaWMgcmVvY2N1cnJpbmcgaW50ZXJ2YWxzIGR1cmluZyB0aGUgd2hvbGUgbGlmZWN5Y2xlIG9mIHRoZSBwcm9qZWN0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImlzRXZlbnREcml2ZW4iIHR5cGU9InhzZDpib29sZWFuIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBpc0V2ZW50RHJpdmVuIGF0dHJpYnV0ZSBpbmRpY2F0ZXMgdGhhdCB0aGUgUHJvY2VzcyBXb3JrIERlZmluaXRpb24gZGVzY3JpYmVzIGFuIGluc3RhbmNlIG9mIHdvcmsgd2hpY2ggaXMgbm90IHN0YXJ0ZWQgYmVjYXVzZSBpdCBoYXMgYmVlbiBzY2hlZHVsZWQgdG8gc3RhcnQgYXQgYSBjZXJ0YWluIHBvaW50IG9mIHRpbWUsIGJlY2F1c2UgcHJlY2VkaW5nIHdvcmsgaXMgYmVpbmcgY29tcGxldGVkLCBvciBpbnB1dCB3b3JrIHByb2R1Y3RzIGFyZSBhdmFpbGFibGUsIGJ1dCBiZWNhdXNlIGFub3RoZXIgc3BlY2lmaWMgZXZlbnQgaGFzIG9jY3VycmVkLiAgRXhhbXBsZXMgZm9yIHN1Y2ggZXZlbnRzIGFyZSBleGNlcHRpb25zIG9yIHByb2JsZW0gc2l0dWF0aW9ucyB3aGljaCByZXF1aXJlIHNwZWNpZmljIHdvcmsgdG8gYmUgcGVyZm9ybWVkIGFzIGEgcmVzdWx0LiAgQWxzbyBjaGFuZ2UgbWFuYWdlbWVudCB3b3JrIGNhbiBiZSBtb2RlbGVkIGFzIGV2ZW50IGRyaXZlbiB3b3JrIGFuYWx5emluZyBhIGNoYW5nZSByZXF1ZXN0IG9yIGRlZmVjdCBhbmQgYWxsb2NhdGluZyB3b3JrIGR5bmFtaWNhbGx5IHRvIHJlc291cmNlcyB0byBkZWFsIHdpdGggaXQgZm9sbG93aW5nIHRoZSB3b3JrIGRlc2NyaWJlZCB3aXRoIHN1Y2ggUHJvY2VzcyBXb3JrIERlZmluaXRpb24uICBUaGUgZXZlbnRzIHRoZW1zZWx2ZXMgYXJlIG5vdCBtb2RlbGVkIGluIHRoaXMgdmVyc2lvbiBvZiB0aGUgc3BlY2lmaWNhdGlvbi4gIFRoZXkgc2hhbGwgYmUgZGVzY3JpYmVkIGFzIHBhcnQgb2YgdGhlIG5vcm1hbCBkZXNjcmlwdGlvbnMgZmllbGRzIGF2YWlsYWJsZS4KLTwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ik1pbGVzdG9uZSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpYWwgQnJlYWtkb3duIEVsZW1lbnQgdGhhdCBkZXNjcmliZXMgYSBzaWduaWZpY2FudCBldmVudCBpbiBhIGRldmVsb3BtZW50IHByb2plY3QsIHN1Y2ggYXMgYSBtYWpvciBkZWNpc2lvbiwgY29tcGxldGlvbiBvZiBhIGRlbGl2ZXJhYmxlLCBvciBtZWV0aW5nIG9mIGEgbWFqb3IgZGVwZW5kZW5jeSAobGlrZSBjb21wbGV0aW9uIG9mIGEgcHJvamVjdCBwaGFzZSkuICBCZWNhdXNlLCBNaWxlc3RvbmUgaXMgY29tbW9ubHkgdXNlZCB0byByZWZlciB0byBib3RoIHRoZSBldmVudCBpdHNlbGYgYW5kIHRoZSBwb2ludCBpbiB0aW1lIGF0IHdoaWNoIHRoZSBldmVudCBpcyBzY2hlZHVsZWQgdG8gaGFwcGVuLCBpdCBpcyBtb2RlbGVkIGFzIGEgQnJlYWtkb3duIEVsZW1lbnQgKGkuZS4gaXQgYXBwZWFycyBhcyBwYXJ0IG9mIGEgYnJlYWtkb3duIHN0cnVjdHVyZSkuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpXb3JrQnJlYWtkb3duRWxlbWVudCIvPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkFjdGl2aXR5Ij4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgV29yayBCcmVha2Rvd24gRWxlbWVudCBhbmQgV29yayBEZWZpbml0aW9uIHdoaWNoIHN1cHBvcnRzIHRoZSBuZXN0aW5nIGFuZCBsb2dpY2FsIGdyb3VwaW5nIG9mIHJlbGF0ZWQgQnJlYWtkb3duIEVsZW1lbnRzIGZvcm1pbmcgYnJlYWtkb3duIHN0cnVjdHVyZXMuICBBbHRob3VnaCBBY3Rpdml0eSBpcyBhIGNvbmNyZXRlIG1ldGEtY2xhc3MsIG90aGVyIGNsYXNzZXMgd2hpY2ggcmVwcmVzZW50IGJyZWFrZG93biBzdHJ1Y3R1cmVzIGRlcml2ZSBmcm9tIGl0OyBzdWNoIGFzIFBoYXNlLCBJdGVyYXRpb24sIERlbGl2ZXJ5IFByb2Nlc3MsIG9yIENhcGFiaWxpdHkgUGF0dGVybi4KLUFjdGl2aXR5IHJlcHJlc2VudHMgYSBncm91cGluZyBlbGVtZW50IGZvciBvdGhlciBCcmVha2Rvd24gRWxlbWVudHMgc3VjaCBhcyBBY3Rpdml0aWVzLCBEZXNjcmlwdG9ycywgTWlsZXN0b25lcywgZXRjLiAgSXQgaXMgbm90IHBlci1zZSBhICdoaWdoLWxldmVsJyBncm91cGluZyBvZiBvbmx5IHdvcmsgYXMgaW4gb3RoZXIgbWV0YS1tb2RlbHMsIGJ1dCBncm91cHMgYW55IGtpbmQgb2YgQnJlYWtkb3duIEVsZW1lbnRzLiAgRm9yIGV4YW1wbGUsIG9uZSBjYW4gZGVmaW5lIHZhbGlkIEFjdGl2aXRpZXMgdGhhdCBncm91cCBvbmx5IFdvcmsgUHJvZHVjdHMgRGVzY3JpcHRvcnMgd2l0aG91dCBhbnkgbWF0Y2hpbmcgVGFzayBEZXNjcmlwdG9ycy4gIEFjdGl2aXRpZXMgYWxzbyBpbmhlcml0IGFsbCBwcm9wZXJ0aWVzIGZyb20gV29yayBCcmVha2Rvd24gRWxlbWVudCBhbmQgaW5kaXJlY3RseSBmcm9tIFByb2Nlc3MgRWxlbWVudDsgaS5lLiBBY3Rpdml0eSBpcyByZWFkeSB0byBoYXZlIGEgZnVsbCBjb250ZW50IGRlc2NyaXB0aW9uIGF0dGFjaGVkIHRvIGl0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6V29ya0JyZWFrZG93bkVsZW1lbnQiPgotCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJQcmVjb25kaXRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUG9zdGNvbmRpdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJCTx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkJyZWFrZG93bkVsZW1lbnQiIHR5cGU9InVtYTpCcmVha2Rvd25FbGVtZW50Ii8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQ2hlY2tsaXN0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQ29uY2VwdCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkV4YW1wbGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJHdWlkZWxpbmUiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJSb2FkbWFwIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUmV1c2FibGVBc3NldCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlN1cHBvcnRpbmdNYXRlcmlhbCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IldoaXRlcGFwZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJPC94c2Q6Y2hvaWNlPgotCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9InZhcmlhYmlsaXR5VHlwZSIgdHlwZT0idW1hOlZhcmlhYmlsaXR5VHlwZSIvPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9InZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJJc0VuYWN0YWJsZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJQaGFzZSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpYWwgQWN0aXZpdHkgd2hpY2ggcHJlc2NyaWJlcyBwcmUtZGVmaW5lZCB2YWx1ZXMgZm9yIGl0cyBpbnN0YW5jZXMgZm9yIHRoZSBhdHRyaWJ1dGVzIHByZWZpeCAoJ1BoYXNlJykgYW5kIGlzUmVwZWF0YWJsZSAoJ0ZhbHNlJykuICBJdCBoYXMgYmVlbiBpbmNsdWRlZCBpbnRvIHRoZSBtZXRhLW1vZGVsIGZvciBjb252ZW5pZW5jZSBhbmQgdG8gcHJvdmlkZSBhIHNwZWNpYWwgc3RlcmVvdHlwZSwgYmVjYXVzZSBpdCByZXByZXNlbnRzIGEgdmVyeSBjb21tb25seSB1c2VkIEFjdGl2aXR5IHR5cGUuCi1QaGFzZSByZXByZXNlbnQgYSBzaWduaWZpY2FudCBwZXJpb2QgaW4gYSBwcm9qZWN0LCBlbmRpbmcgd2l0aCBtYWpvciBtYW5hZ2VtZW50IGNoZWNrcG9pbnQsIG1pbGVzdG9uZSBvciBzZXQgb2YgRGVsaXZlcmFibGVzLiAgSXQgaXMgaW5jbHVkZWQgaW4gdGhlIG1vZGVsIGFzIGEgcHJlZGVmaW5lZCBzcGVjaWFsIEFjdGl2aXR5LCBiZWNhdXNlIG9mIGl0cyBzaWduaWZpY2FuY2UgaW4gZGVmaW5pbmcgYnJlYWtkb3ducy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkFjdGl2aXR5Ii8+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iSXRlcmF0aW9uIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lhbCBBY3Rpdml0eSB3aGljaCBwcmVzY3JpYmVzIHByZS1kZWZpbmVkIHZhbHVlcyBmb3IgaXRzIGluc3RhbmNlcyBmb3IgdGhlIGF0dHJpYnV0ZXMgcHJlZml4ICgnSXRlcmF0aW9uJykgYW5kIGlzUmVwZWF0YWJsZSAoJ1RydWUnKS4gIEl0IGhhcyBiZWVuIGluY2x1ZGVkIGludG8gdGhlIG1ldGEtbW9kZWwgZm9yIGNvbnZlbmllbmNlIGFuZCB0byBwcm92aWRlIGEgc3BlY2lhbCBzdGVyZW90eXBlLCBiZWNhdXNlIGl0IHJlcHJlc2VudHMgYSB2ZXJ5IGNvbW1vbmx5IHVzZWQgQWN0aXZpdHkgdHlwZS4KLUl0ZXJhdGlvbiBncm91cHMgYSBzZXQgb2YgbmVzdGVkIEFjdGl2aXRpZXMgdGhhdCBhcmUgcmVwZWF0ZWQgbW9yZSB0aGFuIG9uY2UuICBJdCByZXByZXNlbnRzIGFuIGltcG9ydGFudCBzdHJ1Y3R1cmluZyBlbGVtZW50IHRvIG9yZ2FuaXplIHdvcmsgaW4gcmVwZXRpdGl2ZSBjeWNsZXMuICBUaGUgY29uY2VwdCBvZiBJdGVyYXRpb24gY2FuIGJlIGFzc29jaWF0ZWQgd2l0aCBkaWZmZXJlbnQgcnVsZXMgaW4gZGlmZmVyZW50IG1ldGhvZHMuICBGb3IgZXhhbXBsZSwgdGhlIElCTSBSYXRpb25hbCBVbmlmaWVkIFByb2Nlc3MgbWV0aG9kIGZyYW1ld29yayAoUlVQKSBkZWZpbmVzIGEgcnVsZSB0aGF0IEl0ZXJhdGlvbnMgYXJlIG5vdCBhbGxvd2VkIHRvIHNwYW4gYWNyb3NzIFBoYXNlcy4gIEluIGNvbnRyYXN0IElCTSBHbG9iYWwgU2VydmljZXMgTWV0aG9kIChHU01ldGhvZCkgYmFzZWQgbWV0aG9kIGZyYW1ld29ya3MgdGhpcyBydWxlIGRvZXMgbm90IGFwcGx5IGFuZCBJdGVyYXRpb24gY2FuIGJlIGRlZmluZWQgd2hpY2ggbmVzdCBQaGFzZXMuICBSdWxlcyBsaWtlIHRoZXNlLCB3aGljaCBwbGF5IGFuIGltcG9ydGFudCByb2xlIGZvciBlYWNoIGluZGl2aWR1YWwgbWV0aG9kIGFuZCBhcmUgdGhlcmVmb3JlIG5vdCBlbmZvcmNlZCBieSB0aGlzIG1ldGEtbW9kZWwuICBJbnN0ZWFkLCBwcm9jZXNzIGF1dGhvcnMgYXJlIGV4cGVjdGVkIHRvIGZvbGxvdyBhbmQgY2hlY2sgdGhlc2UgcnVsZXMgbWFudWFsbHkuICAoTm90ZTogQW55IEJyZWFrZG93biBFbGVtZW50IGNhbiBiZSByZXBlYXRlZDsgaG93ZXZlciwgSXRlcmF0aW9ucyBoYXMgYmVlbiBpbnRyb2R1Y2VkIGFzIGEgc3BlY2lhbCBtZXRhLW1vZGVsIGNvbmNlcHQsIGJlY2F1c2Ugb2YgaXRzIGltcG9ydGFudCByb2xlIGZvciBtYW55IG1ldGhvZHMuKTwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6QWN0aXZpdHkiLz4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24iPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBnZW5lcmFsaXplZCBDb250ZW50IERlc2NyaXB0aW9uIHRoYXQgaXMgdXNlZCB0byBzdG9yZSB0aGUgdGV4dHVhbCBkZXNjcmlwdGlvbiBmb3IgYSBCcmVha2Rvd24gRWxlbWVudC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkNvbnRlbnREZXNjcmlwdGlvbiI+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0idXNhZ2VHdWlkYW5jZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5Qcm92aWRlcyBpbmZvcm1hdGlvbiBhbmQgZ3VpZGFuY2Ugb24gdGhlIG1lYW5pbmcgb2YgdGhlIEJvb2xlYW4gZmxhZyB2YWx1ZXMgYW5kIHVuZGVyIHdoYXQgY2lyY3Vtc3RhbmNlcyB0aGV5IHNob3VsZCBiZSBvdmVycmlkZGVuLiBGb3IgZXhhbXBsZSwgaXQgZGVzY3JpYmVzIHdoeSB0aGUgYnJlYWtkb3duIGVsZW1lbnQgaXMgb3B0aW9uYWwgb3IgY29uc2lkZXJhdGlvbnMgZm9yIHJlcGVhdGluZyBpdCBhbmQgZGlmZmVyZW5jZXMgaW4gdGhlIGluZGl2aWR1YWwgb2NjdXJyZW5jZXMgb2YgdGhpcyBCcmVha2Rvd24gRWxlbWVudCBhY3Jvc3MgdGhlIGxpZmVjeWNsZS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJBY3Rpdml0eURlc2NyaXB0aW9uIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgZ2VuZXJhbGl6ZWQgQnJlYWtkb3duIEVsZW1lbnQgRGVzY3JpcHRpb24gdGhhdCBpcyB1c2VkIHRvIHN0b3JlIHRoZSB0ZXh0dWFsIGRlc2NyaXB0aW9uIGZvciBhbiBBY3Rpdml0eS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbiI+Ci0JCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkFsdGVybmF0aXZlcyIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+Q29tcHJpc2VzIG9mIHN1bW1hcmllcyBkZXNjcmliaW5nIGltcG9ydGFudCBleGNlcHRpb25hbCBhbmQgbm9uLXN0YW5kYXJkIHdheXMgb2YgZG9pbmcgdGhlIHdvcmsgb2YgdGhpcyBBY3Rpdml0eSBub3QgY292ZXJlZCBieSB0aGUgQWN0aXZpdHkncyBUYXNrcy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Ikhvd1RvU3RhZmYiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlByb3ZpZGVzIGJhY2tncm91bmQgb24gd2hvIHNob3VsZCBiZSBpbnZvbHZlZCBpbiB0aGlzIGFjdGl2aXR5IHdoYXQgYXJlIHRoZSByZXF1aXJlZCBza2lsbHMsIGV4cGVyaWVuY2UsICBhbmQgcGVyaGFwcyBhdHRpdHVkZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJQdXJwb3NlIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5TdW1tYXJpemVzIHRoZSBtYWluIHJlYXNvbiBmb3IgcGVyZm9ybWluZyB0aGlzIEFjdGl2aXR5LCBkZXNjcmliZXMgd2hhdCB0aGUgYWN0aXZpdHkgYXMgYSB3aG9sZSBpcyBpbnRlbmRlZCB0byBhY2hpZXZlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkRlc2NyaXB0b3JEZXNjcmlwdGlvbiI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIGdlbmVyYWxpemVkIEJyZWFrZG93biBFbGVtZW50IERlc2NyaXB0aW9uIHRoYXQgaXMgdXNlZCB0byBzdG9yZSB0aGUgdGV4dHVhbCBkZXNjcmlwdGlvbiBmb3IgYSBEZXNjcmlwdG9yLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6QnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uIj4KLQkJCQk8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUmVmaW5lZERlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+QSBEZXNjcmlwdG9yIG1pZ2h0IGFkZCByZWZpbmVtZW50cyB0byB0aGUgbWFpbiBkZXNjcmlwdGlvbiBvZiB0aGUgQ29udGVudCBFbGVtZW50IGl0IHJlZmVycyB0by4gIEZvciBleGFtcGxlLCBpdCBjb3VsZCBwcm92aWRlIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gYWJvdXQgYSBXb3JrIFByb2R1Y3QgcmVsZXZhbnQgZm9yIHRoZSBzcGVjaWZpYyBwb2ludCBpbiB0aW1lIGluIHRoZSBwcm9jZXNzIHRoaXMgV29yayBQcm9kdWN0IHR5cGUgaXMgYmVpbmcgdXNlZC4gIEl0IGNvdWxkIGRlc2NyaWJlIGFkZGl0aW9uYWwgc2tpbGxzIG5lZWRlZCBmb3IgYSBSb2xlIGF0IHRoYXQgcGFydGljdWxhciBwb2ludCBpbiB0aW1lIGluIGEgcHJvY2VzcywgZXRjLiA8L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUHJvY2Vzc0Rlc2NyaXB0aW9uIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgZ2VuZXJhbGl6ZWQgQWN0aXZpdHkgRGVzY3JpcHRpb24gdGhhdCBpcyB1c2VkIHRvIHN0b3JlIHRoZSB0ZXh0dWFsIGRlc2NyaXB0aW9uIGZvciBhIFByb2Nlc3MuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpBY3Rpdml0eURlc2NyaXB0aW9uIj4KLQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iU2NvcGUiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgdGhlIHNjb3BlIG9mIHRoZSBQcm9jZXNzLCBpLmUuIHdoaWNoIHR5cGVzIG9mIHByb2plY3RzIGRvZXMgaXQgYWRkcmVzcyBhbmQgd2hpY2ggbm90LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iVXNhZ2VOb3RlcyIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+QW55IGFkZGl0aW9uYWwgbm90ZXMgb24gaG93IHRvIGFwcGx5IGFuZCBpbnN0YW50aWF0ZSB0aGlzIHByb2Nlc3MgZm9yIGEgcHJvamVjdC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJleHRlcm5hbElkIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkFuIGV4dGVybmFsIHZpc2libGUgbnVtYmVyIHRoYXQgaXMgdXNlZCB0byByZWZlcmVuY2UgdGhpcyBkZWxpdmVyeSBwYXR0ZXJucyBhbmQgbW9kZWxzLiBJdCBpcyB1c2VkIGxpa2UgYSBzeW5vbnltLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgZ2VuZXJhbGl6ZWQgUHJvY2VzcyBEZXNjcmlwdGlvbiB0aGF0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIHRleHR1YWwgZGVzY3JpcHRpb24gZm9yIGEgRGVsaXZlcnkgUHJvY2Vzcy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOlByb2Nlc3NEZXNjcmlwdGlvbiI+Ci0JCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlNjYWxlIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5PdXRsaW5lcyBjaGFyYWN0ZXJpc3RpY3MgYWJvdXQgdGhlIHNpemUgb2YgYSB0eXBpY2FsIHByb2plY3QgdGhhdCBwZXJmb3JtcyB0aGlzIHByb2plY3QgZXhwcmVzc2VkIGluIHRlYW0gc2l6ZSwgbWFuIHllYXJzLCBldGMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJQcm9qZWN0Q2hhcmFjdGVyaXN0aWNzIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5DaGFyYWN0ZXJpemVzIHRoZSBwcm9qZWN0IHRoYXQgd291bGQgdHlwaWNhbGx5IHBlcmZvcm0gdGhpcyBQcm9jZXNzPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJSaXNrTGV2ZWwiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPk91dGxpbmVzIHR5cGljYWwgcHJvamVjdCByaXNrcyB0aGF0IGFyZSBhZGRyZXNzZWQgd2l0aCB0aGlzIHByb2Nlc3MuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJFc3RpbWF0aW5nVGVjaG5pcXVlIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5EZXNjcmliZXMgdGhlIEVzdGltYXRpb24gVGVjaG5pcXVlcyBwcm92aWRlZCBmb3IgdGhpcyBQcm9jZXNzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUHJvamVjdE1lbWJlckV4cGVydGlzZSIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+UHJvdmlkZXMgYSBwcm9maWxlIG9mIGEgdHlwaWNhbCBwcm9qZWN0IHRlYW0sIHRoZSBkaXN0cmlidXRpb24gb2Ygcm9sZXMsIHNraWxscyByZXF1aXJlZCBmb3IgYSB0ZWFtIHBlcmZvcm1zIGEgcHJvamVjdCBiYXNlZCBvbiB0aGlzIHByb2Nlc3MuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJUeXBlT2ZDb250cmFjdCIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+UHJvdmlkZXMgYmFja2dyb3VuZCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY29JJ20gY2hhSSdtIG50cmFjdHMgdGhhdCBuZWVkIHRvIGJlIGVzdGFibGlzaGVkIGJldHdlZW4gYSBwcm9qZWN0IHRlYW0gdGhhdCBwZXJmb3JtcyB0aGlzIHByb2Nlc3MgYW5kIGEgY2xpZW50IChlLmcuIGZvciBhbiBJR1MgZW5nYWdlbWVudCkuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iRGVzY3JpcHRvciI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BbiBhYnN0cmFjdCBnZW5lcmFsaXphdGlvbiBmb3Igc3BlY2lhbCBCcmVha2Rvd24gRWxlbWVudHMgdGhhdCByZWZlcmVuY2VzIG9uZSBjb25jcmV0ZSBDb250ZW50IEVsZW1lbnQuICBBIGRlc2NyaXB0b3IgcHJvdmlkZXMgYSByZXByZXNlbnRhdGlvbiBvZiBhIENvbnRlbnQgRWxlbWVudCB3aXRoaW4gYnJlYWtkb3duIHN0cnVjdHVyZXMuICBJbiBhZGRpdGlvbiB0byBqdXN0IHJlZmVyZW5jaW5nIENvbnRlbnQgRWxlbWVudHMgaXQgYWxsb3dzIG92ZXJyaWRpbmcgdGhlIENvbnRlbnQgRWxlbWVudHMgc3RydWN0dXJhbCByZWxhdGlvbnNoaXBzIGJ5IGRlZmluaW5nIGl0cyBvd24gc2V0cyBvZiBhc3NvY2lhdGlvbnMuCi1EZXNjcmlwdG9ycyBhcmUgdGhlIGtleSBjb25jZXB0IGZvciByZWFsaXppbmcgdGhlIHNlcGFyYXRpb24gb2YgcHJvY2Vzc2VzIGZyb20gbWV0aG9kIGNvbnRlbnQuICBBIERlc2NyaXB0b3IgY2FuIGJlIGNoYXJhY3Rlcml6ZWQgYXMgYSByZWZlcmVuY2Ugb2JqZWN0IGZvciBvbmUgcGFydGljdWxhciBDb250ZW50IEVsZW1lbnQsIHdoaWNoIGhhcyBpdHMgb3duIHJlbGF0aW9uc2hpcHMgYW5kIHByb3BlcnRpZXMuICBXaGVuIGEgRGVzY3JpcHRvciBpcyBjcmVhdGVkIGl0IHNoYWxsIGJlIHByb3ZpZGVkIHdpdGggY29uZ3J1ZW50IGNvcGllcyBvZiB0aGUgcmVsYXRpb25zaGlwcyBkZWZpbmVkIGZvciB0aGUgcmVmZXJlbmNlZCBjb250ZW50IGVsZW1lbnQuICBIb3dldmVyLCBhIHVzZXIgY2FuIG1vZGlmeSB0aGVzZSByZWxhdGlvbnNoaXBzIGZvciB0aGUgcGFydGljdWxhciBwcm9jZXNzIHNpdHVhdGlvbiBmb3Igd2hpY2ggdGhlIGRlc2NyaXB0b3IgaGFzIGJlZW4gY3JlYXRlZC4gPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpCcmVha2Rvd25FbGVtZW50Ij4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpc1N5bmNocm9uaXplZFdpdGhTb3VyY2UiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iV29ya1Byb2R1Y3REZXNjcmlwdG9yIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lhbCBEZXNjcmlwdG9yIHRoYXQgcmVwcmVzZW50cyBhIFdvcmsgUHJvZHVjdCBpbiB0aGUgY29udGV4dCBvZiBvbmUgc3BlY2lmaWMgQWN0aXZpdHkuICBFdmVyeSBicmVha2Rvd24gc3RydWN0dXJlIGNhbiBkZWZpbmUgZGlmZmVyZW50IHJlbGF0aW9uc2hpcHMgb2YgV29yayBQcm9kdWN0IERlc2NyaXB0b3JzIHRvIFRhc2sgRGVzY3JpcHRvcnMgYW5kIFJvbGUgRGVzY3JpcHRvcnMuICBUaGVyZWZvcmUgb25lIFdvcmsgUHJvZHVjdCBjYW4gYmUgcmVwcmVzZW50ZWQgYnkgbWFueSBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvcnMgZWFjaCB3aXRoaW4gdGhlIGNvbnRleHQgb2YgYW4gQWN0aXZpdHkgd2l0aCBpdHMgb3duIHNldCBvZiByZWxhdGlvbnNoaXBzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6RGVzY3JpcHRvciI+Ci0JCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IldvcmtQcm9kdWN0IiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlJlc3BvbnNpYmxlUm9sZSIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJCTx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkV4dGVybmFsSW5wdXRUbyIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkltcGFjdGVkQnkiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJJbXBhY3RzIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iTWFuZGF0b3J5SW5wdXRUbyIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Ik9wdGlvbmFsSW5wdXRUbyIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Ik91dHB1dEZyb20iIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJEZWxpdmVyYWJsZVBhcnRzIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCTwveHNkOmNob2ljZT4KLQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhY3Rpdml0eUVudHJ5U3RhdGUiIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+R2l2ZW4gdGhhdCBhbiBpbnN0YW5jZSBvZiBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvciBoYXMgYmVlbiBjcmVhdGVkIGZvciBhIHNwZWNpZmljIEFjdGl2aXR5LCB0aGVuIHRoZSBBY3Rpdml0eSBFbnRyeSBTdGF0ZSBhdHRyaWJ1dGUgc3BlY2lmaWVzIHRoZSBkZXNpcmVkIHN0YXRlIG9mIGluc3RhbmNlcyBvZiB0aGUgcmVmZXJlbmNlZCBXb3JrIFByb2R1Y3Qgd2hlbiB3b3JrIG9uIHRoZSBBY3Rpdml0eSBpcyBpbml0aWF0ZWQgKGkuZS4gd29yayBvbiB0aGUgQWN0aXZpdHkncyBUYXNrIERlc2NyaXB0b3JzIGlzIGJlaW5nIGluaXRpYXRlZCB0aGF0IHVzZSB0aGlzIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9yIGFzIGlucHV0KS4gIAotRm9yIHNvbWUgV29yayBQcm9kdWN0cyBzdGF0ZSBpcyBleHByZXNzZWQgaW4gcGVyY2VudGFnZSBvZiBjb21wbGV0aW9uLCBjb21wbGlhbmNlIHRvIHdvcmsgcHJvZHVjdCBjaGVja2xpc3QsIGluZm9ybWFsIHN0YXRlIGRlc2NyaXB0aW9ucywgZXRjLiAgT3RoZXJzIGhhdmUgdmVyeSBzcGVjaWZpYyBzdGF0ZXMgZXhwcmVzc2VkIGFzIGVudW1lcmF0aW9ucyBzdWNoIGFzIFtpZGVudGlmaWVkLCBicmllZmx5IGRlc2NyaWJlZCwgb3V0bGluZWQsIGRldGFpbGVkXSBmb3IgdXNlIGNhc2VzLiAgT3RoZXIgV29yayBQcm9kdWN0IHN0YXRlcyByZWxhdGUgdG8gc29tZSBxdWFsaXR5IG1lYXN1cmVzIG9yIGxpZmVjeWNsZSBzdGF0ZXMgc3VjaCBhcyBbcmV2aWV3ZWQsIGltcGxlbWVudGVkLCB0ZXN0ZWRdLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImFjdGl2aXR5RXhpdFN0YXRlIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkdpdmVuIHRoYXQgYW4gaW5zdGFuY2Ugb2YgV29yayBQcm9kdWN0IERlc2NyaXB0b3IgaGFzIGJlZW4gY3JlYXRlZCBmb3IgYSBzcGVjaWZpYyBBY3Rpdml0eSwgdGhlbiB0aGUgQWN0aXZpdHkgRXhpc3QgU3RhdGUgYXR0cmlidXRlIHNwZWNpZmllcyB0aGUgZGVzaXJlZCBzdGF0ZSBvZiBpbnN0YW5jZXMgb2YgdGhlIHJlZmVyZW5jZWQgV29yayBQcm9kdWN0IHdoZW4gd29yayBvbiB0aGUgQWN0aXZpdHkgaXMgZmluaXNoZWQgKGkuZS4gd29yayBvbiB0aGUgQWN0aXZpdHkncyBUYXNrIERlc2NyaXB0b3JzIGhhcyBmaW5pc2hlZCB0aGF0IGhhdmUgdGhpcyBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvciBhcyBvdXRwdXQpLgotRm9yIHNvbWUgV29yayBQcm9kdWN0cyBzdGF0ZSBpcyBleHByZXNzZWQgaW4gcGVyY2VudGFnZSBvZiBjb21wbGV0aW9uLCBjb21wbGlhbmNlIHRvIHdvcmsgcHJvZHVjdCBjaGVja2xpc3QsIGluZm9ybWFsIHN0YXRlIGRlc2NyaXB0aW9ucywgZXRjLiAgT3RoZXJzIGhhdmUgdmVyeSBzcGVjaWZpYyBzdGF0ZXMgZXhwcmVzc2VkIGFzIGVudW1lcmF0aW9ucyBzdWNoIGFzIFtpZGVudGlmaWVkLCBicmllZmx5IGRlc2NyaWJlZCwgb3V0bGluZWQsIGRldGFpbGVkXSBmb3IgdXNlIGNhc2VzLiAgT3RoZXIgV29yayBQcm9kdWN0IHN0YXRlcyByZWxhdGUgdG8gc29tZSBxdWFsaXR5IG1lYXN1cmVzIG9yIGxpZmVjeWNsZSBzdGF0ZXMgc3VjaCBhcyBbcmV2aWV3ZWQsIGltcGxlbWVudGVkLCB0ZXN0ZWRdLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlJvbGVEZXNjcmlwdG9yIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lhbCBEZXNjcmlwdG9yIHRoYXQgcmVwcmVzZW50cyBhIFJvbGUgaW4gdGhlIGNvbnRleHQgb2Ygb25lIHNwZWNpZmljIEFjdGl2aXR5LiAgRXZlcnkgYnJlYWtkb3duIHN0cnVjdHVyZSBjYW4gZGVmaW5lIGRpZmZlcmVudCByZWxhdGlvbnNoaXBzIG9mIFJvbGUgRGVzY3JpcHRvcnMgdG8gVGFzayBEZXNjcmlwdG9ycyBhbmQgV29yayBQcm9kdWN0IERlc2NyaXB0b3JzLiAgVGhlcmVmb3JlIG9uZSBSb2xlIGNhbiBiZSByZXByZXNlbnRlZCBieSBtYW55IFJvbGUgRGVzY3JpcHRvcnMgZWFjaCB3aXRoaW4gdGhlIGNvbnRleHQgb2YgYW4gQWN0aXZpdHkgd2l0aCBpdHMgb3duIHNldCBvZiByZWxhdGlvbnNoaXBzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6RGVzY3JpcHRvciI+Ci0JCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlJvbGUiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUmVzcG9uc2libGVGb3IiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJUYXNrRGVzY3JpcHRvciI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpYWwgRGVzY3JpcHRvciB0aGF0IHJlcHJlc2VudHMgYSBwcm94eSBmb3IgYSBUYXNrIGluIHRoZSBjb250ZXh0IG9mIG9uZSBzcGVjaWZpYyBBY3Rpdml0eS4gIEV2ZXJ5IGJyZWFrZG93biBzdHJ1Y3R1cmUgY2FuIGRlZmluZSBkaWZmZXJlbnQgcmVsYXRpb25zaGlwcyBvZiBUYXNrIERlc2NyaXB0b3JzIHRvIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9ycyBhbmQgUm9sZSBEZXNjcmlwdG9ycy4gVGhlcmVmb3JlIG9uZSBUYXNrIGNhbiBiZSByZXByZXNlbnRlZCBieSBtYW55IFRhc2sgRGVzY3JpcHRvcnMgZWFjaCB3aXRoaW4gdGhlIGNvbnRleHQgb2YgYW4gQWN0aXZpdHkgd2l0aCBpdHMgb3duIHNldCBvZiByZWxhdGlvbnNoaXBzLgotQSBrZXkgZGlmZmVyZW5jZSBiZXR3ZWVuIE1ldGhvZCBDb250ZW50IGFuZCBQcm9jZXNzIGlzIHRoYXQgYSBDb250ZW50IEVsZW1lbnQgc3VjaCBhcyBUYXNrIGRlc2NyaWJlcyBhbGwgYXNwZWN0cyBvZiBkb2luZyB3b3JrIGRlZmluZWQgYXJvdW5kIHRoaXMgVGFzay4gIFRoaXMgZGVzY3JpcHRpb24gaXMgbWFuYWdlZCBpbiBzdGVwcywgd2hpY2ggYXJlIG1vZGVsZWQgYXMgU2VjdGlvbnMgb2YgdGhlIFRhc2tzJyBDb250ZW50IERlc2NyaXB0aW9ucy4gIFdoZW4gYXBwbHlpbmcgYSBUYXNrIGluIGEgUHJvY2VzcycgQWN0aXZpdHkgd2l0aCBhIFRhc2sgRGVzY3JpcHRvciBhIFByb2Nlc3MgRW5naW5lZXIgbmVlZHMgdG8gaW5kaWNhdGUgdGhhdCBhdCB0aGF0IHBhcnRpY3VsYXIgcG9pbnQgaW4gdGltZSBpbiB0aGUgUHJvY2VzcyBkZWZpbml0aW9uIGZvciB3aGljaCB0aGUgVGFzayBEZXNjcmlwdG9yIGhhcyBiZWVuIGNyZWF0ZWQsIG9ubHkgYSBzdWJzZXQgb2Ygc3RlcHMgc2hhbGwgYmUgcGVyZm9ybWVkLiAgSGUgZGVmaW5lcyB0aGlzIHNlbGVjdGlvbiB1c2luZyB0aGUgc2VsZWN0ZWRTdGVwcyBhc3NvY2lhdGlvbi4gIElmIGhlIHdhbnRzIHRvIGFkZCBzdGVwcyB0byBhIFRhc2sgRGVzY3JpcHRvciwgaGUgY2FuIGRlc2NyaWJlIHRoZXNlIGVpdGhlciBwcmFnbWF0aWNhbGx5IGluIHRoZSByZWZpbmVkRGVzY3JpcHRpb24gYXR0cmlidXRlIG9yICdwcm9wZXJseScgY3JlYXRlIGEgY29udHJpYnV0aW5nIFRhc2sgdG8gdGhlIFRhc2sgdGhlIFRhc2sgRGVzY3JpcHRvciByZWZlcnMgdG8uCi08L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOldvcmtCcmVha2Rvd25FbGVtZW50Ij4KLQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iVGFzayIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJQZXJmb3JtZWRQcmltYXJpbHlCeSIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJCTx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQXNzaXN0ZWRCeSIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkV4dGVybmFsSW5wdXQiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJNYW5kYXRvcnlJbnB1dCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Ik9wdGlvbmFsSW5wdXQiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJPdXRwdXQiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJPC94c2Q6Y2hvaWNlPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iU3RlcCIgdHlwZT0idW1hOlNlY3Rpb24iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpc1N5bmNocm9uaXplZFdpdGhTb3VyY2UiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iQ29tcG9zaXRlUm9sZSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpYWwgUm9sZSBEZXNjcmlwdG9yIHRoYXQgcmVsYXRlcyB0byBtb3JlIHRoZW4gb25lIFJvbGUuICBJdCByZXByZXNlbnRzIGEgZ3JvdXBpbmcgb2YgUm9sZXMgd2l0aCB0aGUgbWFpbiBwdXJwb3NlIG9mIHNpbXBsaWZpY2F0aW9uLCBpLmUuIHJlZHVjaW5nIHRoZSBudW1iZXIgb2Ygcm9sZXMgZm9yIGEgcHJvY2Vzcy4KLUEgQ29tcG9zaXRlIFJvbGUgaXMgYSBncm91cGluZyBvZiBSb2xlcyB0aGF0IGNhbiBiZSB1c2VkIGluIGFuIEFjdGl2aXR5IG9yIFByb2Nlc3MgdG8gcmVkdWNlIHRoZSBudW1iZXIgb2YgUm9sZXMuICBBIHR5cGljYWwgYXBwbGljYXRpb24gd291bGQgYmUgYSBwcm9jZXNzIGZvciBhIHNtYWxsIHRlYW0gaW4gd2hpY2ggYSBzdGFuZGFyZCBzZXQgb2Ygcm9sZXMgZnJvbSB0aGUgbWV0aG9kIGNvbnRlbnQgd291bGQgYmUgYWxsIHBlcmZvcm1lZCBieSBvbmUgb3IgbW9yZSByZXNvdXJjZS4gIEJ5IHVzaW5nIENvbXBvc2l0ZSBSb2xlIHRoZSBwcm9jZXNzIHdvdWxkIHN1Z2dlc3QgYSB0eXBpY2FsIGNsdXN0ZXJpbmcgb2YgUm9sZXMgdG8gUmVzb3VyY2VzLiAgQSBDb21wb3NpdGUgUm9sZSBjb3VsZCBwZXJmb3JtIGFsbCBUYXNrcyBkZWZpbmVkIGZvciB0aGUgUm9sZXMgaXQgcmVmZXJzIHRvLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6Um9sZURlc2NyaXB0b3IiPgotCQkJCTx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQWdncmVnYXRlZFJvbGUiIHR5cGU9InVtYTpSb2xlIi8+Ci0JCQkJPC94c2Q6Y2hvaWNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlRlYW1Qcm9maWxlIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgQnJlYWtkb3duIEVsZW1lbnQgdGhhdCBncm91cHMgUm9sZSBEZXNjcmlwdG9ycyBvciBSZXNvdXJjZSBEZWZpbml0aW9ucyBkZWZpbmluZyBhIG5lc3RlZCBoaWVyYXJjaHkgb2YgdGVhbXMgYW5kIHRlYW0gbWVtYmVycy4KLVdvcmsgYXNzaWdubWVudHMgYW5kIFdvcmsgUHJvZHVjdCByZXNwb25zaWJpbGl0aWVzIGNhbiBiZSBkaWZmZXJlbnQgZnJvbSBBY3Rpdml0eSB0byBBY3Rpdml0eSBpbiBhIGRldmVsb3BtZW50IHByb2plY3QuIERpZmZlcmVudCBwaGFzZXMgcmVxdWlyZSBkaWZmZXJlbnQgc3RhZmZpbmcgcHJvZmlsZXMsIGkuZS4gZGlmZmVyZW50IHNraWxscyBhbmQgcmVzb3VyY2VzIGRvaW5nIGRpZmZlcmVudCB0eXBlcyBvZiB3b3JrLiAgVGhlcmVmb3JlLCBhIHByb2Nlc3MgbmVlZHMgdG8gZGVmaW5lIHN1Y2ggZGlmZmVyZW50IHByb2ZpbGVzIGluIGEgZmxleGlibGUgbWFubmVyLiAgV2hlcmVhcyBDb3JlIE1ldGhvZCBDb250ZW50IGRlZmluZXMgc3RhbmRhcmQgcmVzcG9uc2liaWxpdGllcyBhbmQgYXNzaWdubWVudHMsIGEgcHJvY2VzcyBleHByZXNzIGJ5IGEgYnJlYWtkb3duIHN0cnVjdHVyZXMgbmVlZHMgdG8gYmUgYWJsZSByZWZpbmUgYW5kIHJlZGVmaW5lIHRoZXNlIHRocm91Z2hvdXQgaXRzIGRlZmluaXRpb24uICBSb2xlIERlc2NyaXB0b3JzLCBSZXNvdXJjZSBEZWZpbml0aW9ucywgYXMgd2VsbCBhcyBUZWFtIFByb2ZpbGVzIHByb3ZpZGUgdGhlIGRhdGEgc3RydWN0dXJlIG5lY2Vzc2FyeSB0byBhY2hpZXZlIHRoaXMgZmxleGliaWxpdHkgYW5kIHRvIHByb3ZpZGUgYSBwcm9jZXNzIHVzZXIgd2l0aCB0aGUgY2FwYWJpbGl0eSB0byBkZWZpbmUgZGlmZmVyZW50IHRlYW1zIGFuZCByb2xlIHJlbGF0aW9uc2hpcHMgZm9yIGV2ZXJ5IEFjdGl2aXR5IChpbmNsdWRpbmcgQWN0aXZpdGllcyBvbiBhbnkgbmVzdGluZy1sZXZlbCBhcyB3ZWxsIGFzIEl0ZXJhdGlvbnMgb3IgUGhhc2VzKS4KLUhlbmNlLCBpbiBhZGRpdGlvbiB0byB0aGUgd29yayBicmVha2Rvd24gYW5kIHdvcmsgcHJvZHVjdCBicmVha2Rvd24gc3RydWN0dXJlcyBkZWZpbmVkIHNvIGZhciwgVGVhbSBQcm9maWxlcyBhcmUgdXNlZCB0byBkZWZpbmUgYSB0aGlyZCB0eXBlIG9mIGJyZWFrZG93biBzdHJ1Y3R1cmU6IHRlYW0gYnJlYWtkb3duIHN0cnVjdHVyZXMuICBUaGVzZSBhcmUgY3JlYXRlZCBhcyBhbiBBY3Rpdml0eSBzcGVjaWZpYyBoaWVyYXJjaHkgb2YgVGVhbSBQcm9maWxlcyBjb21wcmlzaW5nIG9mIFJvbGUgRGVzY3JpcHRvcnMgYW5kIFJlc291cmNlIERlZmluaXRpb25zLiAgVGhlc2Ugc3RydWN0dXJlcyBjYW4gYmUgcHJlc2VudGVkIGFzIHdlbGwta25vd24gT3JnLUNoYXJ0cy4gIEp1c3QgYXMgd2l0aCBhbnkgb3RoZXIgQnJlYWtkb3duIEVsZW1lbnQgYW5kIERlc2NyaXB0b3JzLCBUZWFtIFByb2ZpbGVzIGNhbiBiZSBkZWZpbmVkIHdpdGhpbiB0aGUgc2NvcGUgb2YgYW55IEFjdGl2aXR5IGluIGEgYnJlYWtkb3duIHN0cnVjdHVyZS4gIEluIG90aGVyIHdvcmRzIGV2ZXJ5IEFjdGl2aXR5IGNhbiBkZWZpbmUgaXRzIG93biBUZWFtIFByb2ZpbGVzIGNvbnNpc3Rpbmcgb2YgQWN0aXZpdHkgc3BlY2lmaWMgUm9sZSBEZXNjcmlwdG9ycyBhbmQgUmVzb3VyY2UgRGVmaW5pdGlvbnMuICBUeXBpY2FsbHksIFRlYW0gUHJvZmlsZXMgYXJlIGRlZmluZWQgb24gdGhlIGxldmVsIG9mIEl0ZXJhdGlvbnMgb3IgUGhhc2VzIG9yIG90aGVyIGhpZ2hlci1sZXZlbCBBY3Rpdml0eS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkJyZWFrZG93bkVsZW1lbnQiPgotCQkJCTx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUm9sZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iU3VwZXJUZWFtIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJTdWJUZWFtIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJPC94c2Q6Y2hvaWNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlByb2Nlc3MiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWFsIEFjdGl2aXR5IHRoYXQgZGVzY3JpYmVzIGEgc3RydWN0dXJlIGZvciBwYXJ0aWN1bGFyIHR5cGVzIG9mIGRldmVsb3BtZW50IHByb2plY3RzLiAgVG8gcGVyZm9ybSBzdWNoIGEgZGV2ZWxvcG1lbnQgcHJvamVjdCBhIFByb2Nlc3NlcyB3b3VsZCBiZSAnaW5zdGFudGlhdGVkJyBhbmQgYWRhcHRlZCBmb3IgdGhlIHNwZWNpZmljIHNpdHVhdGlvbi4gIFByb2Nlc3MgaXMgYW4gYWJzdHJhY3QgY2xhc3MgYW5kIHRoaXMgbWV0YS1tb2RlbCBkZWZpbmVzIGRpZmZlcmVudCBzcGVjaWFsIHR5cGVzIG9mIFByb2Nlc3NlcyBmb3IgZGlmZmVyZW50IHByb2Nlc3MgbWFuYWdlbWVudCBhcHBsaWNhdGlvbnMgYW5kIGRpZmZlcmVudCBzaXR1YXRpb25zIG9mIHByb2Nlc3MgcmV1c2UuICBFdmVyeSBQcm9jZXNzIGNvbXByaXNlcyBvZiBhbmQgaXMgdGhlIHRvcC1sZXZlbCBlbGVtZW50IG9mIGFuIG4tbGV2ZWwgYnJlYWtkb3duIHN0cnVjdHVyZSB1c2luZyB0aGUgTmVzdGluZyBhc3NvY2lhdGlvbiBkZWZpbmVkIG9uIEFjdGl2aXR5LgotQ29yZSBNZXRob2QgQ29udGVudCBwcm92aWRlcyBzdGVwLWJ5LXN0ZXAgZXhwbGFuYXRpb25zLCBkZXNjcmliaW5nIGhvdyB2ZXJ5IHNwZWNpZmljIGRldmVsb3BtZW50IGdvYWxzIGFyZSBhY2hpZXZlZCBpbmRlcGVuZGVudCBvZiB0aGUgcGxhY2VtZW50IG9mIHRoZXNlIHN0ZXBzIHdpdGhpbiBhIGRldmVsb3BtZW50IGxpZmVjeWNsZS4gIFByb2Nlc3NlcyB0YWtlIHRoZXNlIG1ldGhvZCBlbGVtZW50cyBhbmQgcmVsYXRlIHRoZW0gaW50byBzZW1pLW9yZGVyZWQgc2VxdWVuY2VzIHRoYXQgYXJlIGN1c3RvbWl6ZWQgdG8gc3BlY2lmaWMgdHlwZXMgb2YgcHJvamVjdHMuICBUaHVzLCBhIHByb2Nlc3MgaXMgYSBzZXQgb2YgcGFydGlhbGx5IG9yZGVyZWQgd29yayBkZXNjcmlwdGlvbnMgaW50ZW5kZWQgdG8gcmVhY2ggYSBoaWdoZXIgZGV2ZWxvcG1lbnQgZ29hbCwgc3VjaCBhcyB0aGUgcmVsZWFzZSBvZiBhIHNwZWNpZmljIHNvZnR3YXJlIHN5c3RlbS4gIEEgcHJvY2VzcyBhbmQgdGhlIHByb2Nlc3MgbWV0YS1tb2RlbCBzdHJ1Y3R1cmUgZGVmaW5lZCBpbiB0aGlzIHNwZWNpZmljYXRpb24gZm9jdXNlcyBvbiB0aGUgbGlmZWN5Y2xlIGFuZCB0aGUgc2VxdWVuY2luZyBvZiB3b3JrIGluIGJyZWFrZG93biBzdHJ1Y3R1cmVzLiAgVG8gYWNoaWV2ZSB0aGlzIGl0IHVzZXMgdGhlIERlc2NyaXB0b3IgY29uY2VwdCByZWZlcmVuY2luZyBtZXRob2QgY29udGVudCBhbmQgYWxsb3dpbmcgZGVmaW5pbmcgdGltZS1zcGVjaWZpYyBjdXN0b21pemF0aW9ucyBvZiB0aGUgcmVmZXJlbmNlZCBjb250ZW50IChlLmcuIGRlZmluaW5nIGEgZm9jdXMgb24gZGlmZmVyZW50IHN0ZXBzIG9mIHRoZSBzYW1lIFRhc2sgYW5kIHByb3ZpZGluZyBpbnB1dCBXb3JrIFByb2R1Y3RzIGluIGRpZmZlcmVudCBzdGF0ZXMgd2l0aGluIHRoZSBkaWZmZXJlbnQgUGhhc2VzIG9mIGEgcHJvY2VzcyBsaWZlY3ljbGUgaW4gd2hpY2ggdGhlIHNhbWUgVGFzayBpcyBwZXJmb3JtZWQpLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6QWN0aXZpdHkiPgotCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJJbmNsdWRlc1BhdHRlcm4iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkRlZmF1bHRDb250ZXh0IiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlZhbGlkQ29udGV4dCIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImRpYWdyYW1VUkkiIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+VGhlIFVSSSBvZiB0aGUgZGlhZ3JhbSBmaWxlIGFzc29jaWF0ZWQgd2l0aCB0aGUgcHJvY2Vzcy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJEZWxpdmVyeVByb2Nlc3MiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWFsIFByb2Nlc3MgZGVzY3JpYmluZyBhIGNvbXBsZXRlIGFuZCBpbnRlZ3JhdGVkIGFwcHJvYWNoIGZvciBwZXJmb3JtaW5nIGEgc3BlY2lmaWMgcHJvamVjdCB0eXBlLiAgSXQgZGVzY3JpYmVzIGEgY29tcGxldGUgcHJvamVjdCBsaWZlY3ljbGUgZW5kLXRvLWVuZCBhbmQgc2hhbGwgYmUgdXNlZCBhcyBhIHJlZmVyZW5jZSBmb3IgcnVubmluZyBwcm9qZWN0cyB3aXRoIHNpbWlsYXIgY2hhcmFjdGVyaXN0aWNzIGFzIGRlZmluZWQgZm9yIHRoZSBwcm9jZXNzLiAgQSBEZWxpdmVyeSBQcm9jZXNzIGlzIHJlbGF0ZWQgdG8gc3BlY2lmaWMgc3VwcG9ydGluZyBpbmZvcm1hdGlvbiBzdWNoIGFzIFJvYWRtYXBzIChpbmhlcml0ZWQgdmlhIEFjdGl2aXR5KSBhcyB3ZWxsIGFzIENvbW11bmljYXRpb25zIGFuZCBFZHVjYXRpb24gTWF0ZXJpYWwuCi1BIERlbGl2ZXJ5IFByb2Nlc3MgaXMgYSBQcm9jZXNzIHRoYXQgY292ZXJzIGEgd2hvbGUgZGV2ZWxvcG1lbnQgbGlmZWN5Y2xlIGZyb20gYmVnaW5uaW5nIHRvIGVuZC4gIEEgRGVsaXZlcnkgUHJvY2VzcyBzaGFsbCBiZSB1c2VkIGFzIGEgdGVtcGxhdGUgZm9yIHBsYW5uaW5nIGFuZCBydW5uaW5nIGEgcHJvamVjdC4gIEl0IHByb3ZpZGVzIGEgY29tcGxldGUgbGlmZWN5Y2xlIG1vZGVsIHdpdGggcHJlZGVmaW5lZCBwaGFzZXMsIGl0ZXJhdGlvbnMsIGFuZCBhY3Rpdml0aWVzIHRoYXQgaGF2ZSBiZWVuIGRldGFpbGVkIGJ5IHNlcXVlbmNpbmcgcmVmZXJlbmNpbmcgbWV0aG9kIGNvbnRlbnQgaW4gYnJlYWtkb3duIHN0cnVjdHVyZXMuICBJdCBpcyBkZWZpbmVkIG9uIHRoZSBiYXNpcyBvZiBleHBlcmllbmNlIHdpdGggcGFzdCBwcm9qZWN0cyBvciBlbmdhZ2VtZW50cywgYW5kL29yIHRoZSBiZXN0IHByYWN0aWNlIHVzZSBvZiBhIGRldmVsb3BtZW50IG9yIGRlbGl2ZXJ5IGFwcHJvYWNoLiAgSXQgZGVmaW5lcyB3aGF0IGdldHMgcHJvZHVjZWQsIGhvdyB0aG9zZSBpdGVtcyBhcmUgcHJvZHVjZWQsIGFuZCB0aGUgcmVxdWlyZWQgc3RhZmZpbmcgaW4gdGhlIGZvcm0gb2YgaW50ZWdyYXRlZCBXb3JrLCBXb3JrIFByb2R1Y3QsIGFuZCBUZWFtIEJyZWFrZG93biBTdHJ1Y3R1cmVzLiAgRm9yIGV4YW1wbGUsIGEgcHJvY2VzcyBlbmdpbmVlciBjYW4gZGVmaW5lIGFsdGVybmF0aXZlIERlbGl2ZXJ5IFByb2Nlc3NlcyBmb3Igc29mdHdhcmUgZGV2ZWxvcG1lbnQgcHJvamVjdHMgdGhhdCBkaWZmZXIgaW4gdGhlIHNjYWxlIG9mIHRoZSBlbmdhZ2VtZW50IGFuZCBzdGFmZmluZyBuZWNlc3NhcnksIHRoZSB0eXBlIG9mIHRoZSBzb2Z0d2FyZSBhcHBsaWNhdGlvbiB0byBiZSBkZXZlbG9wZWQsIHRoZSBkZXZlbG9wbWVudCBtZXRob2RzIGFuZCB0ZWNobm9sb2dpZXMgdG8gYmUgdXNlZCwgZXRjLiAgQWx0aG91Z2gsIHRoZSBEZWxpdmVyeSBQcm9jZXNzIGFpbXMgdG8gY292ZXIgYSB3aG9sZSBwcm9qZWN0IGl0IGtlZXBzIGNlcnRhaW4gZGVjaXNpb24gdGhhdCBhcmUgdG9vIHByb2plY3Qgc3BlY2lmaWMgb3Blbi4gIEZvciBleGFtcGxlLCB0aGUgYnJlYWtkb3duIHN0cnVjdHVyZSBkZWZpbmVzIHdoaWNoIEJyZWFrZG93biBFbGVtZW50cyBoYXZlIG11bHRpcGxlIG9jY3VycmVuY2VzIG9yIGlzIHJlcGVhdGFibGUgdmlhIGl0IHJlc3BlY3RpdmUgYXR0cmlidXRlcywgYnV0IGRvZXMgbm90IHNheSBob3cgbWFueSBvY2N1cnJlbmNlcyBhbmQgaG93IG1hbnkgcmVwZWF0cy9pdGVyYXRpb25zIGl0IHdpbGwgaGF2ZS4gIFRoZXNlIGRlY2lzaW9ucyBoYXZlIHRvIGJlIGRvbmUgYnkgYSBwcm9qZWN0IG1hbmFnZXIgd2hlbiBwbGFubmluZyBhIGNvbmNyZXRlIHByb2plY3QsIHByb2plY3QgcGhhc2UsIG9yIHByb2plY3QgaXRlcmF0aW9ucy4gIEEgRGVsaXZlcnkgUHJvY2VzcyBpcyBhbHdheXMgYSBjb21wbGV0ZSBkZXNjcmlwdGlvbiBvZiBhIHByb2Nlc3MgaW4gdGVybXMgb2YgY29tcGxldGVuZXNzIG9mIHRoZSBsaWZlY3ljbGUsIGFzIHdlbGwgYXMgaW4gdGVybXMgb2YgYWxsIHRocmVlIHZpZXdzIG9uIHRoZSBwcm9jZXNzIHdoaWNoIGFyZSB0aGUgV29yayBCcmVha2Rvd24gU3RydWN0dXJlLCBXb3JrIFByb2R1Y3QgQnJlYWtkb3duIFN0cnVjdHVyZSwgYW5kIFRlYW0gQnJlYWtkb3duIFN0cnVjdHVyZSBoYXZlIHRvIGJlIGZ1bGx5IGFuZCBjb25zaXN0ZW50bHkgcG9wdWxhdGVkLiAgQ29uc2lzdGVuY3kgb2YgYSBEZWxpdmVyeSBQcm9jZXNzIGlzIGFjdHVhbGx5IGVuc3VyZWQgYnkgdGhlIGZhY3QgdGhhdCBhbGwgdGhyZWUgYnJlYWtkb3ducyBhcmUgcmVwcmVzZW50ZWQgYnkgb25lIHNpbmdsZSBkYXRhIHN0cnVjdHVyZSBhbmQgb25lIHBhcnRpY3VsYXIgYnJlYWtkb3duIHN1Y2ggYXMgVGVhbSBCcmVha2Rvd24gaXMganVzdCBhIHZpZXcgb24gdGhhdCBkYXRhIHN0cnVjdHVyZS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOlByb2Nlc3MiPgotCQkJCTx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQ29tbXVuaWNhdGlvbnNNYXRlcmlhbCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iRWR1Y2F0aW9uTWF0ZXJpYWwiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iQ2FwYWJpbGl0eVBhdHRlcm4iPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWFsIFByb2Nlc3MgdGhhdCBkZXNjcmliZXMgYSByZXVzYWJsZSBjbHVzdGVyIG9mIGRvaW5nIHdvcmsgaW4gY29tbW9uIHByb2Nlc3MgYXJlYXMuICBDYXBhYmlsaXRpZXMgUGF0dGVybnMgZXhwcmVzcyBhbmQgY29tbXVuaWNhdGUgcHJvY2VzcyBrbm93bGVkZ2UgZm9yIGEga2V5IGFyZWEgb2YgaW50ZXJlc3Qgc3VjaCBhcyBhIERpc2NpcGxpbmUgYW5kIGNhbiBiZSBkaXJlY3RseSB1c2VkIGJ5IHByb2Nlc3MgcHJhY3RpdGlvbmVyIHRvIGd1aWRlIGhpcyB3b3JrLiAgVGhleSBhcmUgYWxzbyB1c2VkIGFzIGJ1aWxkaW5nIGJsb2NrcyB0byBhc3NlbWJsZSBEZWxpdmVyeSBQcm9jZXNzZXMgb3IgbGFyZ2VyIENhcGFiaWxpdHkgUGF0dGVybnMgZW5zdXJpbmcgb3B0aW1hbCByZXVzZSBhbmQgYXBwbGljYXRpb24gb2YgdGhlIGtleSBwcmFjdGljZXMgdGhleSBleHByZXNzLgotQSBDYXBhYmlsaXR5IFBhdHRlcm4gaXMgYSBzcGVjaWFsIFByb2Nlc3MgdGhhdCBkZXNjcmliZXMgYSByZXVzYWJsZSBjbHVzdGVyIG9mIGRvaW5nIHdvcmsgaW4gYSBnZW5lcmFsIHByb2Nlc3MgYXJlYSB0aGF0IHByb3ZpZGVzIGEgY29uc2lzdGVudCBkZXZlbG9wbWVudCBhcHByb2FjaCB0byBjb21tb24gcHJvYmxlbXMuICBFeGFtcGxlcyBmb3IgQ2FwYWJpbGl0eSBQYXR0ZXJuIGNvdWxkIGJlICd1c2UgY2FzZS1iYXNlZCByZXF1aXJlbWVudHMgbWFuYWdlbWVudCcsICd1c2UgY2FzZSBhbmFseXNpcycsIG9yICd1bml0IHRlc3RpbmcnLiBUeXBpY2FsbHkgYnV0IG5vdCBuZWNlc3NhcmlseSwgQ2FwYWJpbGl0eSBQYXR0ZXJucyBoYXZlIHRoZSBzY29wZSBvZiBvbmUgZGlzY2lwbGluZSBwcm92aWRpbmcgYSBicmVha2Rvd24gb2YgcmV1c2FibGUgY29tcGxleCBBY3Rpdml0aWVzLCByZWxhdGlvbnNoaXBzIHRvIHRoZSBSb2xlcyB3aGljaCBwZXJmb3JtIFRhc2tzIHdpdGhpbiB0aGVzZSBBY3Rpdml0aWVzLCBhcyB3ZWxsIGFzIHRvIHRoZSBXb3JrIFByb2R1Y3RzIHRoYXQgYXJlIHVzZWQgYW5kIHByb2R1Y2VkLiAgQSBjYXBhYmlsaXR5IHBhdHRlcm4gZG9lcyBub3QgcmVsYXRlIHRvIGFueSBzcGVjaWZpYyBwaGFzZSBvciBpdGVyYXRpb24gb2YgYSBkZXZlbG9wbWVudCBsaWZlY3ljbGUsIGFuZCBzaG91bGQgbm90IGltcGx5IGFueS4gIEluIG90aGVyIHdvcmRzLCBhIHBhdHRlcm4gc2hvdWxkIGJlIGRlc2lnbmVkIGluIGEgd2F5IHRoYXQgaXQgaXMgYXBwbGljYWJsZSBhbnl3aGVyZSBpbiBhIERlbGl2ZXJ5IFByb2Nlc3MuICBUaGlzIGVuYWJsZXMgaXRzIEFjdGl2aXRpZXMgdG8gYmUgZmxleGlibHkgYXNzaWduZWQgdG8gd2hhdGV2ZXIgcGhhc2VzIHRoZXJlIGFyZSBpbiB0aGUgRGVsaXZlcnkgUHJvY2VzcyB0byB3aGljaCBpdCBpcyBiZWluZyBhcHBsaWVkLiAgSXQgaXMgYSBnb29kIHByYWN0aWNlIHRvIGRlc2lnbiBhIENhcGFiaWxpdHkgUGF0dGVybiB0byBwcm9kdWNlIG9uZSBvciBtb3JlIGdlbmVyaWMgRGVsaXZlcmFibGVzLiAgVGhlIHR5cGljYWwgY29uZmlndXJhdGlvbiBpcyB0aGF0IGVhY2ggQWN0aXZpdHkgaW4gdGhlIENhcGFiaWxpdHkgUGF0dGVybiBwcm9kdWNlcyBvbmUgRGVsaXZlcmFibGUsIGFuZCB0aGUgbGFzdCBUYXNrIERlc2NyaXB0b3IgaW4gdGhlIEFjdGl2aXR5IGV4cGxpY2l0bHkgb3V0cHV0cyBqdXN0IHRoaXMgRGVsaXZlcmFibGUuICBUaGlzIGVuYWJsZXMgdGhlIHByb2Nlc3MgZW5naW5lZXIgdG8gc2VsZWN0IFBhdHRlcm5zIG9yIGp1c3QgQWN0aXZpdGllcyBieSBkZWNpZGluZyB3aGljaCBEZWxpdmVyYWJsZXMgYXJlIHJlcXVpcmVkLiAgSXQgYWxzbyBvZmZlcnMgYSBzaW1wbGUgaW50ZWdyYXRpb24gYXBwcm9hY2g6IGFuIEFjdGl2aXR5IGZyb20gYSBjYXBhYmlsaXR5IHBhdHRlcm4gaXMgbGlua2VkIHRvIHRoZSBQaGFzZSBvciBJdGVyYXRpb24gd2hpY2ggaXMgcmVxdWlyZWQgdG8gcHJvZHVjZSB0aGUgQWN0aXZpdHkncyBEZWxpdmVyYWJsZS4gIEtleSBhcHBsaWNhdGlvbnMgYXJlYXMgb2YgLyBhcmVhcyBvZiByZXVzZSBmb3IgQ2FwYWJpbGl0eSBQYXR0ZXJucyBhcmU6Ci0tIFRvIHNlcnZlIGFzIGJ1aWxkaW5nIGJsb2NrcyBmb3IgYXNzZW1ibGluZyBEZWxpdmVyeSBQcm9jZXNzZXMgb3IgbGFyZ2VyIENhcGFiaWxpdHkgUGF0dGVybnMuICBOb3JtYWxseSBkZXZlbG9waW5nIGEgRGVsaXZlcnkgUHJvY2VzcyBpcyBub3QgZG9uZSBmcm9tIHNjcmF0Y2ggYnV0IGJ5IHN5c3RlbWF0aWNhbGx5IGFwcGx5aW5nIGFuZCBiaW5kaW5nIHBhdHRlcm5zLiAgSW4gYWRkaXRpb24gdG8gdGhlIHN0YW5kYXJkIHBhdHRlcm4gYXBwbGljYXRpb24gb2YgJ2NvcHktYW5kLW1vZGlmeScsIHdoaWNoIGFsbG93cyB0aGUgcHJvY2VzcyBlbmdpbmVlciB0byBpbmRpdmlkdWFsbHkgY3VzdG9taXplIHRoZSBwYXR0ZXJuJ3MgY29udGVudCB0byB0aGUgcGFydGljdWxhciBzaXR1YXRpb24gaXQgaXMgYXBwbGllZCBmb3IsIHRoZSBQbHVnaW4gbWV0YS1tb2RlbCBwYWNrYWdlIChTZWN0aW9uIDYuMSkgaW50cm9kdWNlcyBldmVuIG1vcmUgc29waGlzdGljYXRlZCBpbmhlcml0YW5jZSByZWxhdGlvbnNoaXBzIHRoYXQgc3VwcG9ydCBkeW5hbWljIGJpbmRpbmcgb2YgcGF0dGVybnMgKGkuZS4gdGhlIHBhdHRlcm4gaXMgcmVmZXJlbmNlZCBhbmQgbm90IGNvcGllZCkuICBUaGlzIHVuaXF1ZSBuZXcgd2F5IG9mIHJldXNpbmcgcHJvY2VzcyBrbm93bGVkZ2UgYWxsb3dzIHRvIGZhY3RvciBvdXQgY29tbW9ubHkgcmVvY2N1cnJpbmcgQWN0aXZpdGllcyBpbnRvIHBhdHRlcm5zIGFuZCB0byBhcHBseSB0aGVtIG92ZXIgYW5kIG92ZXIgYWdhaW4gZm9yIGEgcHJvY2Vzcy4gIFdoZW4gdGhlIHBhdHRlcm4gaXMgYmVpbmcgcmV2aXNlZCBvciB1cGRhdGVkLCBhbGwgY2hhbmdlcyB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgcmVmbGVjdGVkIGluIGFsbCBwYXR0ZXJuIGFwcGxpY2F0aW9uIGluIGFsbCBwcm9jZXNzZXMgYmVjYXVzZSBvZiB0aGUgZHluYW1pYyBiaW5kaW5nLgotLSBUbyBzdXBwb3J0IGRpcmVjdCBleGVjdXRpb24gaW4gYSBkZXZlbG9wbWVudCBwcm9qZWN0IHRoYXQgZG9lcyBub3Qgd29yayBmb2xsb3dpbmcgYSB3ZWxsLWRlZmluZWQgcHJvY2VzcywgYnV0IHdvcmtzIGJhc2VkIG9uIGxvb3NlbHkgY29ubmVjdGVkIHByb2Nlc3MgZnJhZ21lbnRzIG9mIGJlc3QgcHJhY3RpY2VzIGluIGEgZmxleGlibGUgbWFubmVyIChlLmcuIEFnaWxlIERldmVsb3BtZW50KS4KLS0gVG8gc3VwcG9ydCBwcm9jZXNzIGVkdWNhdGlvbiBieSBkZXNjcmliaW5nIGtub3dsZWRnZSBmb3IgYSBrZXkgYXJlYSBzdWNoIGFzIGJlc3QgcHJhY3RpY2VzIG9uIGhvdyB0byBwZXJmb3JtIHRoZSB3b3JrIGZvciBhIERpc2NpcGxpbmUgKGUuZy4gUmVxdWlyZW1lbnRzIE1hbmFnZW1lbnQpLCBmb3IgYSBzcGVjaWZpYyBkZXZlbG9wbWVudCB0ZWNobmlxdWUgKGFzcGVjdC1vcmllbnRlZCBkZXZlbG9wbWVudCksIG9yIGEgc3BlY2lmaWMgdGVjaG5pY2FsIGFyZWEgKGUuZy4gcmVsYXRpb25hbCBkYXRhYmFzZSBkZXNpZ24pLCB3aGljaCBpcyB1c2VkIGZvciBlZHVjYXRpb24gYW5kIHRlYWNoaW5nLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6UHJvY2VzcyIvPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlByb2Nlc3NQbGFubmluZ1RlbXBsYXRlIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lhbCBQcm9jZXNzIHRoYXQgaXMgcHJlcGFyZWQgZm9yIGluc3RhbnRpYXRpb24gYnkgYSBwcm9qZWN0IHBsYW5uaW5nIHRvb2wuICBUeXBpY2FsbHksIGl0IGlzIGNyZWF0ZWQgYmFzZWQgb24gYSBQcm9jZXNzIHN1Y2ggYXMgYSBEZWxpdmVyeSBQcm9jZXNzIGFzIGEgd2hvbGUgKGUuZy4gaW4gY2FzZSBvZiBhIHdhdGVyZmFsbC1iYXNlZCBkZXZlbG9wbWVudCBhcHByb2FjaCkgb3IgaW4gcGFydHMgKGUuZy4gaW4gY2FzZSBvZiBhbiBpdGVyYXRpdmUgZGV2ZWxvcG1lbnQgYXBwcm9hY2gpLgotQSBQcm9jZXNzIFBsYW5uaW5nIFRlbXBsYXRlIHJlcHJlc2VudHMgYSBwYXJ0aWFsbHkgZmluaXNoZWQgcGxhbiBmb3IgYSBjb25jcmV0ZSBwcm9qZWN0LiAgSXQgdXNlcyB0aGUgc2FtZSBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmVzIGFzIGFsbCBvdGhlciBQcm9jZXNzIFR5cGVzIHRvIHJlcHJlc2VudCB0ZW1wbGF0ZXMgZm9yIHByb2plY3QgcGxhbnMuICBIb3dldmVyLCBjZXJ0YWluIHBsYW5uaW5nIGRlY2lzaW9ucyBoYXZlIGFscmVhZHkgYmVlbiBhcHBsaWVkIHRvIHRoZSB0ZW1wbGF0ZSBhcyB3ZWxsIGFzIGluZm9ybWF0aW9uIGhhcyBiZWVuIHJlbW92ZWQgYW5kL29yIHJlZm9ybWF0dGVkIHRvIGJlIHJlYWR5IGZvciBleHBvcnQgdG8gYSBzcGVjaWZpYyBwbGFubmluZyB0b29sLiAgRXhhbXBsZXMgZm9yIHN1Y2ggZGVjaXNpb25zIGFyZTogYSB0ZW1wbGF0ZSBoYXMgYmVlbiBjcmVhdGVkIHRvIHJlcHJlc2VudCBhIHBsYW4gZm9yIGEgcGFydGljdWxhciBJdGVyYXRpb24gaW4gYW4gaXRlcmF0aXZlIGRldmVsb3BtZW50IHByb2plY3QsIHdoaWNoIGZyIGV4YW1wbGUgZGlzdGluZ3Vpc2hlcyBlYXJseSBmcm9tIGxhdGUgaXRlcmF0aW9ucyBpbiB0aGUgRWxhYm9yYXRpb24gcGhhc2Ugb2YgYSBwcm9qZWN0OyBpZiB0aGUgdGFyZ2V0ZWQgcGxhbm5pbmcgdG9vbCBjYW5ub3QgcmVwcmVzZW50IGlucHV0IGFuZCBvdXRwdXQgb2YgVGFzaywgdGhlbiB0aGVzZSBoYXZlIGJlZW4gcmVtb3ZlZCBmcm9tIHRoZSBzdHJ1Y3R1cmU7IGNlcnRhaW4gcmVwZXRpdGlvbnMgaGF2ZSBiZWVuIGFscmVhZHkgYXBwbGllZCwgZS5nLiBzdGF0aW5nIHRoYXQgYSBjeWNsZSBvZiBzcGVjaWZpYyBUYXNrIGdyb3VwZWQgaW4gYW4gQWN0aXZpdHkgaGF2ZSB0byBiZSByZXBlYXRlZCBuLXRpbWVzOyBldGMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpQcm9jZXNzIj4KLQkJCQk8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkJhc2VQcm9jZXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJPC94c2Q6Y2hvaWNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlByb2Nlc3NQYWNrYWdlIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lhbCBNZXRob2QgUGFja2FnZSB0aGF0IGNvbnRhaW5zIFByb2Nlc3MgRWxlbWVudHMsIG9ubHkuCi1BIGtleSBzZXBhcmF0aW9uIG9mIGNvbmNlcm5zIGluIFVNQSBpcyB0aGUgZGlzdGluY3Rpb24gYmV0d2VlbiBNZXRob2QgQ29udGVudCBhbmQgUHJvY2Vzcy4gIFRoaXMgc2VwYXJhdGlvbiBpcyBlbmZvcmNlZCBieSBzcGVjaWFsIHBhY2thZ2UgdHlwZXMsIHdoaWNoIGRvIG5vdCBhbGxvdyB0aGUgbWl4aW5nIG9mIG1ldGhvZCBjb250ZW50IHdpdGggcHJvY2Vzc2VzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6TWV0aG9kUGFja2FnZSI+Ci0JCQkJPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJQcm9jZXNzRWxlbWVudCIgdHlwZT0idW1hOlByb2Nlc3NFbGVtZW50Ii8+Ci0JCQkJPC94c2Q6Y2hvaWNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+Q29tcHJpc2VzIG9mIGEgbGlzdCBvZiBpbnRlcmZhY2Ugc3BlY2lmaWNhdGlvbnMgKHNpbWlsYXIgdG8gb3BlcmF0aW9uIGRlY2xhcmF0aW9ucykgdGhhdCBleHByZXNzIGlucHV0cyBhbmQgb3V0cHV0cyBmb3IgYSBwcm9jZXNzIGNvbXBvbmVudC4gIFRoZXNlIGludGVyZmFjZSBzcGVjaWZpY2F0aW9ucyBhcmUgZXhwcmVzc2VkIHVzaW5nIFRhc2sgRGVzY3JpcHRvcnMgd2hpY2ggYXJlIG5vdCBsaW5rZWQgdG8gVGFza3MgdGhhdCBhcmUgcmVsYXRlZCB0byBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvcnMgYXMgd2VsbCBhcyBvcHRpb25hbCBhIFJvbGUgRGVzY3JpcHRvci48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkJyZWFrZG93bkVsZW1lbnQiPgotCQkJCTx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iSW50ZXJmYWNlU3BlY2lmaWNhdGlvbiIgdHlwZT0idW1hOlRhc2tEZXNjcmlwdG9yIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJJbnRlcmZhY2VJTyIgdHlwZT0idW1hOldvcmtQcm9kdWN0RGVzY3JpcHRvciIvPgotCQkJCTwveHNkOmNob2ljZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJQcm9jZXNzQ29tcG9uZW50Ij4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lhbCBQcm9jZXNzIFBhY2thZ2UgdGhhdCBhcHBsaWVzIHRoZSBwcmluY2lwbGVzIG9mIGVuY2Fwc3VsYXRpb24uICBBIFByb2Nlc3MgQ29tcG9uZW50IHJlYWxpemVzIG9uZSBvciBtb3JlIEludGVyZmFjZXMgd2hpY2ggc3BlY2lmeSBpbnB1dHMgYW5kIG91dHB1dHMgb2YgdGhlIGNvbXBvbmVudC4gVGhlcmUgbWlnaHQgYmUgbWFueSBjb21wb25lbnRzIHJlYWxpemluZyB0aGUgc2FtZSBpbnRlcmZhY2VzLCBidXQgdXNpbmcgZGlmZmVyZW50IHRlY2huaXF1ZXMgdG8gYWNoaWV2ZSBzaW1pbGFyIG91dHB1dHMgZm9yIHNpbWlsYXIgaW5wdXRzLiAgV2hlcmVhcyB0aGUgQ29tcG9uZW50IEludGVyZmFjZXMgcmVwcmVzZW50IGNvbXBvbmVudCBzcGVjaWZpY2F0aW9ucyAoYmxhY2sgYm94IGRlc2NyaXB0aW9ucyBvZiB0aGUgY29tcG9uZW50KSwgZ29vZCBjYW5kaWRhdGVzIGZvciBjb21wb25lbnQgcmVhbGl6YXRpb25zIGNhbiBiZSBmb3VuZCBpbiBDYXBhYmlsaXR5IFBhdHRlcm5zICh3aGl0ZSBib3ggZGVzY3JpcHRpb25zIGZvciB0aGUgY29tcG9uZW50KS4KLVVNQSBzdXBwb3J0cyByZXBsYWNlYWJsZSBhbmQgcmV1c2FibGUgUHJvY2VzcyBDb21wb25lbnRzIHJlYWxpemluZyB0aGUgcHJpbmNpcGxlcyBvZiBlbmNhcHN1bGF0aW9uLiBDZXJ0YWluIHNpdHVhdGlvbnMgaW4gYSBzb2Z0d2FyZSBkZXZlbG9wbWVudCBwcm9qZWN0IG1pZ2h0IHJlcXVpcmUgdGhhdCBjb25jcmV0ZSByZWFsaXphdGlvbnMgb2YgcGFydHMgb2YgdGhlIHByb2Nlc3MgcmVtYWluIHVuZGVjaWRlZCBvciB3aWxsIGJlIGRlY2lkZWQgYnkgdGhlIGV4ZWN1dGluZyB0ZWFtIGl0c2VsZiAoZS5nLiBpbiBvdXRzb3VyY2luZyBzaXR1YXRpb25zKS4gIFVNQSBwcm92aWRlcyBhIHVuaXF1ZSBjb21wb25lbnQgY29uY2VwdCBkZWZpbmluZyBpbnRlcmZhY2VzIGZvciB3b3JrIHByb2R1Y3QgaW5wdXQgYW5kIG91dHB1dCwgYWxsb3dpbmcgdHJlYXRpbmcgdGhlIGFjdHVhbCBkZWZpbml0aW9uIG9mIHRoZSB3b3JrIHRoYXQgcHJvZHVjZXMgdGhlIG91dHB1dHMgYXMgYSAiYmxhY2sgYm94Ii4gIEF0IGFueSBwb2ludCBkdXJpbmcgYSBwcm9qZWN0IHRoZSBjb21wb25lbnQgInJlYWxpemF0aW9uIiBkZXRhaWxpbmcgdGhlIHdvcmsgY2FuIGJlIGFkZGVkIHRvIHRoZSBwcm9jZXNzLiAgVGhlIGNvbXBvbmVudCBhcHByb2FjaCBhbHNvIGFsbG93cyB0aGF0IGRpZmZlcmVudCBzdHlsZXMgb3IgdGVjaG5pcXVlcyBvZiBkb2luZyB3b3JrIGNhbiBiZSByZXBsYWNlZCB3aXRoIG9uZSBhbm90aGVyLiAgRm9yIGV4YW1wbGUsIGEgc29mdHdhcmUgY29kZSBvdXRwdXQgb2YgYSBjb21wb25lbnQgY291bGQgYmUgcHJvZHVjZWQgd2l0aCBhIG1vZGVsLWRyaXZlbiBkZXZlbG9wbWVudCBvciBhIGNvZGUtY2VudHJpYyB0ZWNobmlxdWUuICBUaGUgY29tcG9uZW50IGNvbmNlcHQgZW5jYXBzdWxhdGVzIHRoZSBhY3R1YWwgd29yayBhbmQgbGV0cyB0aGUgZGV2ZWxvcG1lbnQgdGVhbSBjaG9vc2UgdGhlIGFwcHJvcHJpYXRlIHRlY2huaXF1ZSBhbmQgZmlsbCB0aGUgY29tcG9uZW50J3MgcmVhbGl6YXRpb24gd2l0aCB0aGVpciBjaG9pY2Ugb2YgQWN0aXZpdGllcyB0aGF0IHByb2R1Y2UgdGhlIHJlcXVpcmVkIG91dHB1dHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpQcm9jZXNzUGFja2FnZSI+Ci0JCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkNvcHlyaWdodCIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJJbnRlcmZhY2UiIHR5cGU9InVtYTpQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlByb2Nlc3MiIHR5cGU9InVtYTpQcm9jZXNzIi8+Ci0JCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0iYXV0aG9ycyIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5FdmVyeSBNZXRob2QgVW5pdCBpcyBiZWluZyBjcmVhdGVkIGFuZCBvd25lZCBieSBhbiBhdXRob3Igb3IgYXV0aG9yaW5nIHRlYW0uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2hhbmdlRGF0ZSIgdHlwZT0ieHNkOmRhdGVUaW1lIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBkYXRlIHRoZSBsYXN0IGNoYW5nZSB0aGF0IHJlc3VsdGVkIGludG8gdGhpcyB2ZXJzaW9uIGhhcyBiZWVuIG1hZGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2hhbmdlRGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+VGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBsYXN0IGNoYW5nZSB0aGF0IHJlc3VsdGVkIGludG8gdGhpcyB2ZXJzaW9uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9InZlcnNpb24iIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+RXZlcnkgUGFja2FnZSBoYXMgYSB2ZXJzaW9uIG51bWJlciB1c2VkIHRvIHRyYWNrIGNoYW5nZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iTWV0aG9kUGx1Z2luIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lhbCBNZXRob2QgVW5pdCB0aGF0IHJlcHJlc2VudHMgYSBwaHlzaWNhbCBjb250YWluZXIgZm9yIE1ldGhvZCBQYWNrYWdlcy4gIEl0IGRlZmluZXMgYSBncmFudWxhcml0eSBsZXZlbCBmb3IgdGhlIG1vZHVsYXJpemF0aW9uIGFuZCBvcmdhbml6YXRpb24gb2YgbWV0aG9kIGNvbnRlbnQgYW5kIHByb2Nlc3Nlcy4gIEEgTWV0aG9kIFBsdWdpbiBjYW4gZXh0ZW5kIG1hbnkgb3RoZXIgTWV0aG9kIFBsdWdpbnMgYW5kIGl0IGNhbiBiZSBleHRlbmRlZCBieSBtYW55IE1ldGhvZCBQbHVnaW5zLiAgSXQgY2FuIGFsc28gYmUgdXNlZCBzdGFuZC1hbG9uZSwgaS5lLiB3aXRoIG5vIEV4dGVuc2lvbiByZWxhdGlvbnNoaXAgdG8gb3RoZXIgcGx1Zy1pbnMuCi1NZXRob2QgUGx1Z2luIGNvbmNlcHR1YWxseSByZXByZXNlbnRzIGEgdW5pdCBmb3IgY29uZmlndXJhdGlvbiwgbW9kdWxhcml6YXRpb24sIGV4dGVuc2lvbiwgcGFja2FnaW5nLCBhbmQgZGVwbG95bWVudCBvZiBtZXRob2QgY29udGVudCBhbmQgcHJvY2Vzc2VzLiAgQSBQcm9jZXNzIEVuZ2luZWVyIHNoYWxsIGRlc2lnbiBoaXMgUGx1Z2lucyBhbmQgYWxsb2NhdGUgaGlzIGNvbnRlbnQgdG8gdGhlc2UgUGx1Z2lucyB3aXRoIHJlcXVpcmVtZW50cyBmb3IgZXh0ZW5zaWJpbGl0eSwgbW9kdWxhcml0eSwgcmV1c2UsIGFuZCBtYWludGFpbmFiaWxpdHkgaW4gbWluZC4KLVNwZWNpYWwgZXh0ZW5zaWJpbGl0eSBtZWNoYW5pc21zIGRlZmluZWQgZm9yIHRoZSBtZXRhLWNsYXNzZXMgVmFyaWFiaWxpdHkgRWxlbWVudCBhbmQgUHJvY2VzcyBDb250cmlidXRpb24gYWxsb3cgUGx1Z2luIGNvbnRlbnQgdG8gZGlyZWN0bHkgY29udHJpYnV0ZSBuZXcgY29udGVudCwgcmVwbGFjZSBleGlzdGluZyBjb250ZW50LCBvciB0byBjcm9zcy1yZWZlcmVuY2UgdG8gYW55IENvbnRlbnQgRWxlbWVudCBvciBQcm9jZXNzIHdpdGhpbiBhbm90aGVyIFBsdWdpbiB0aGF0IGl0IGV4dGVuZHMuICBTaW1pbGFyIHRvIFVNTCAyLjAncyAncGFja2FnZSBtZXJnZScgbWVjaGFuaXNtIHRyYW5zZm9ybWF0aW9uIGludGVycHJldGF0aW9ucywgaW50ZXJwcmV0aW5nIHRoZXNlIE1ldGhvZCBQbHVnaW4gbWVjaGFuaXNtcyByZXN1bHRzIGludG8gbmV3IGV4dGVuZGVkIE1ldGhvZCBDb250ZW50IGFuZCBQcm9jZXNzZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpNZXRob2RVbml0Ij4KLQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUmVmZXJlbmNlZE1ldGhvZFBsdWdpbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iTWV0aG9kUGFja2FnZSIgdHlwZT0idW1hOk1ldGhvZFBhY2thZ2UiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ1c2VyQ2hhbmdlYWJsZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDplbGVtZW50IG5hbWU9Ik1ldGhvZFBsdWdpbiIgdHlwZT0idW1hOk1ldGhvZFBsdWdpbiI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpYWwgTWV0aG9kIFVuaXQgdGhhdCByZXByZXNlbnRzIGEgcGh5c2ljYWwgY29udGFpbmVyIGZvciBNZXRob2QgUGFja2FnZXMuICBJdCBkZWZpbmVzIGEgZ3JhbnVsYXJpdHkgbGV2ZWwgZm9yIHRoZSBtb2R1bGFyaXphdGlvbiBhbmQgb3JnYW5pemF0aW9uIG9mIG1ldGhvZCBjb250ZW50IGFuZCBwcm9jZXNzZXMuICBBIE1ldGhvZCBQbHVnaW4gY2FuIGV4dGVuZCBtYW55IG90aGVyIE1ldGhvZCBQbHVnaW5zIGFuZCBpdCBjYW4gYmUgZXh0ZW5kZWQgYnkgbWFueSBNZXRob2QgUGx1Z2lucy4gIEl0IGNhbiBhbHNvIGJlIHVzZWQgc3RhbmQtYWxvbmUsIGkuZS4gd2l0aCBubyBFeHRlbnNpb24gcmVsYXRpb25zaGlwIHRvIG90aGVyIHBsdWctaW5zLgotTWV0aG9kIFBsdWdpbiBjb25jZXB0dWFsbHkgcmVwcmVzZW50cyBhIHVuaXQgZm9yIGNvbmZpZ3VyYXRpb24sIG1vZHVsYXJpemF0aW9uLCBleHRlbnNpb24sIHBhY2thZ2luZywgYW5kIGRlcGxveW1lbnQgb2YgbWV0aG9kIGNvbnRlbnQgYW5kIHByb2Nlc3Nlcy4gIEEgUHJvY2VzcyBFbmdpbmVlciBzaGFsbCBkZXNpZ24gaGlzIFBsdWdpbnMgYW5kIGFsbG9jYXRlIGhpcyBjb250ZW50IHRvIHRoZXNlIFBsdWdpbnMgd2l0aCByZXF1aXJlbWVudHMgZm9yIGV4dGVuc2liaWxpdHksIG1vZHVsYXJpdHksIHJldXNlLCBhbmQgbWFpbnRhaW5hYmlsaXR5IGluIG1pbmQuCi1TcGVjaWFsIGV4dGVuc2liaWxpdHkgbWVjaGFuaXNtcyBkZWZpbmVkIGZvciB0aGUgbWV0YS1jbGFzc2VzIFZhcmlhYmlsaXR5IEVsZW1lbnQgYW5kIFByb2Nlc3MgQ29udHJpYnV0aW9uIGFsbG93IFBsdWdpbiBjb250ZW50IHRvIGRpcmVjdGx5IGNvbnRyaWJ1dGUgbmV3IGNvbnRlbnQsIHJlcGxhY2UgZXhpc3RpbmcgY29udGVudCwgb3IgdG8gY3Jvc3MtcmVmZXJlbmNlIHRvIGFueSBDb250ZW50IEVsZW1lbnQgb3IgUHJvY2VzcyB3aXRoaW4gYW5vdGhlciBQbHVnaW4gdGhhdCBpdCBleHRlbmRzLiAgU2ltaWxhciB0byBVTUwgMi4wJ3MgJ3BhY2thZ2UgbWVyZ2UnIG1lY2hhbmlzbSB0cmFuc2Zvcm1hdGlvbiBpbnRlcnByZXRhdGlvbnMsIGludGVycHJldGluZyB0aGVzZSBNZXRob2QgUGx1Z2luIG1lY2hhbmlzbXMgcmVzdWx0cyBpbnRvIG5ldyBleHRlbmRlZCBNZXRob2QgQ29udGVudCBhbmQgUHJvY2Vzc2VzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JPC94c2Q6ZWxlbWVudD4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ik1ldGhvZENvbmZpZ3VyYXRpb24iPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBjb2xsZWN0aW9uIG9mIHNlbGVjdGVkIE1ldGhvZCBNb2RlbHMgYW5kIE1ldGhvZFBhY2thZ2VzLiBBIGNvbmZpZ3VyYXRpb24gY2FuIGJlIGV4cG9ydGVkIGludG8gaXRzIG93biBzdGFuZGFsb25lIGxpYnJhcnkgd2hlbiBpdCBpbmNsdWRlcyB0aGUgZnVsbCB0cmFuc2l0aXZlIGNsb3N1cmUgb2YgYWxsIGVsZW1lbnRzIGFsbCBvdGhlciBlbGVtZW50cyBkZXBlbmQgb24uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpNZXRob2RVbml0Ij4KLQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQmFzZUNvbmZpZ3VyYXRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Ik1ldGhvZFBsdWdpblNlbGVjdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iTWV0aG9kUGFja2FnZVNlbGVjdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iRGVmYXVsdFZpZXciIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUHJvY2Vzc1ZpZXciIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDplbGVtZW50IG5hbWU9Ik1ldGhvZENvbmZpZ3VyYXRpb24iIHR5cGU9InVtYTpNZXRob2RDb25maWd1cmF0aW9uIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgY29sbGVjdGlvbiBvZiBzZWxlY3RlZCBNZXRob2QgTW9kZWxzIGFuZCBNZXRob2RQYWNrYWdlcy4gQSBjb25maWd1cmF0aW9uIGNhbiBiZSBleHBvcnRlZCBpbnRvIGl0cyBvd24gc3RhbmRhbG9uZSBsaWJyYXJ5IHdoZW4gaXQgaW5jbHVkZXMgdGhlIGZ1bGwgdHJhbnNpdGl2ZSBjbG9zdXJlIG9mIGFsbCBlbGVtZW50cyBhbGwgb3RoZXIgZWxlbWVudHMgZGVwZW5kIG9uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JPC94c2Q6ZWxlbWVudD4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ik1ldGhvZExpYnJhcnkiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBNZXRob2QgTGlicmFyeSBpcyBhIHBoeXNpY2FsIGNvbnRhaW5lciBmb3IgTWV0aG9kIFBsdWdpbnMgYW5kIE1ldGhvZCBDb25maWd1cmF0aW9uIGRlZmluaXRpb25zLiAgQWxsIE1ldGhvZCBFbGVtZW50cyBhcmUgc3RvcmVkIGluIGEgTWV0aG9kIExpYnJhcnkuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpNZXRob2RVbml0Ij4KLQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iTWV0aG9kUGx1Z2luIiB0eXBlPSJ1bWE6TWV0aG9kUGx1Z2luIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJNZXRob2RDb25maWd1cmF0aW9uIiB0eXBlPSJ1bWE6TWV0aG9kQ29uZmlndXJhdGlvbiIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9InRvb2wiIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+VGhlIHRvb2wgdGhhdCBnZW5lcmF0ZWQgdGhlIFhNTCBmaWxlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmVsZW1lbnQgbmFtZT0iTWV0aG9kTGlicmFyeSIgdHlwZT0idW1hOk1ldGhvZExpYnJhcnkiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBNZXRob2QgTGlicmFyeSBpcyBhIHBoeXNpY2FsIGNvbnRhaW5lciBmb3IgTWV0aG9kIFBsdWdpbnMgYW5kIE1ldGhvZCBDb25maWd1cmF0aW9uIGRlZmluaXRpb25zLiAgQWxsIE1ldGhvZCBFbGVtZW50cyBhcmUgc3RvcmVkIGluIGEgTWV0aG9kIExpYnJhcnkuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQk8L3hzZDplbGVtZW50PgotPC94c2Q6c2NoZW1hPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL21vZGVsL0VQRl9TY2hlbWFfMjAwNzA0MDMxNDI1LnhzZCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9tb2RlbC9FUEZfU2NoZW1hXzIwMDcwNDAzMTQyNS54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlN2IxNjMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL21vZGVsL0VQRl9TY2hlbWFfMjAwNzA0MDMxNDI1LnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDE0MTggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gRVBGIFVNQSBYTUwgRGF0YSBJbnRlcmNoYW5nZSBTY2hlbWEgLS0+Ci08eHNkOnNjaGVtYSB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiB4bWxuczp1bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuMyIgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjMiPgotCTx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJXb3JrT3JkZXJUeXBlIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPlJlcHJlc2VudHMgYSByZWxhdGlvbnNoaXAgYmV0d2VlbiB0d28gQnJlYWtkb3duIEVsZW1lbnQgaW4gd2hpY2ggb25lIEJyZWFrZG93biBFbGVtZW50IGRlcGVuZHMgb24gdGhlIHN0YXJ0IG9yIGZpbmlzaCBvZiBhbm90aGVyIEJyZWFrZG93biBFbGVtZW50IGluIG9yZGVyIHRvIGJlZ2luIG9yIGVuZC4gVGhpcyBlbnVtZXJhdGlvbiBkZWZpbmVzIHRoZSBkaWZmZXJlbnQgdHlwZXMgb2YgV29yayBPcmRlciByZWxhdGlvbnNoaXBzIGF2YWlsYWJsZSBpbiBVTUEgYW5kIGlzIHVzZWQgdG8gcHJvdmlkZSB2YWx1ZXMgZm9yIFdvcmsgT3JkZXIncyBsaW5rVHlwZSBhdHRyaWJ1dGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6TkNOYW1lIj4KLQkJCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImZpbmlzaFRvU3RhcnQiLz4KLQkJCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImZpbmlzaFRvRmluaXNoIi8+Ci0JCQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJzdGFydFRvU3RhcnQiLz4KLQkJCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InN0YXJ0VG9GaW5pc2giLz4KLQkJPC94c2Q6cmVzdHJpY3Rpb24+Ci0JPC94c2Q6c2ltcGxlVHlwZT4KLQk8eHNkOnNpbXBsZVR5cGUgbmFtZT0iVmFyaWFiaWxpdHlUeXBlIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkFuIEVudW1lcmF0aW9uIHVzZWQgZm9yIHZhbHVlcyBmb3IgaW5zdGFuY2VzIG9mIFZhcmlhYmlsaXR5IEVsZW1lbnQncyBhdHRyaWJ1dGUgdmFyaWFiaWxpdHlUeXBlLiAgSXQgZGVmaW5lcyB0aGUgbmF0dXJlIG9mIGhvdyBhIFZhcmlhYmlsaXR5IEVsZW1lbnQgZXh0ZW5kcyBhbm90aGVyIFZhcmlhYmlsaXR5IEVsZW1lbnQuIFNlZSBlbnVtZXJhdGlvbiBsaXRlcmFscyBmb3IgZGVmaW5pdGlvbnMgZm9yIGVhY2ggdHlwZS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpOQ05hbWUiPgotCQkJPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ibmEiLz4KLQkJCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImNvbnRyaWJ1dGVzIi8+Ci0JCQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJleHRlbmRzIi8+Ci0JCQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJyZXBsYWNlcyIvPgotCQkJPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ibG9jYWxDb250cmlidXRpb24iLz4KLQkJCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImxvY2FsUmVwbGFjZW1lbnQiLz4KLQkJCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImV4dGVuZHNSZXBsYWNlcyIvPgotCQk8L3hzZDpyZXN0cmljdGlvbj4KLQk8L3hzZDpzaW1wbGVUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iRWxlbWVudCI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIFVNTCAyLjAgbWV0YS1jbGFzcyBFbGVtZW50LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJOYW1lZEVsZW1lbnQiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBVTUwgMi4wIG1ldGEtY2xhc3MgTmFtZWQgRWxlbWVudC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkVsZW1lbnQiPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJQYWNrYWdlYWJsZUVsZW1lbnQiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBVTUwgMi4wIG1ldGEtY2xhc3MgUGFja2FnYWJsZSBFbGVtZW50LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6TmFtZWRFbGVtZW50Ii8+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iTWV0aG9kRWxlbWVudCI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgcm9vdCBnZW5lcmFsaXphdGlvbiBmb3IgYWxsIFVNQSBNZXRob2QgRWxlbWVudHMuICBEZWZpbmVzIGEgY29tbW9uIHNldCBvZiBhdHRyaWJ1dGVzIGluaGVyaXRlZCBieSBhbGwgVU1BIE1ldGhvZCBFbGVtZW50cy4gIE1ldGhvZCBFbGVtZW50IGl0c2VsZiBpcyBkZXJpdmVkIGZyb20gUGFja2FnZWFibGUgRWxlbWVudCBmcm9tIHRoZSBVTUwgMi4wIEluZnJhc3RydWN0dXJlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6UGFja2FnZWFibGVFbGVtZW50Ij4KLQkJCQk8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Ik93bmVkUnVsZSIgdHlwZT0idW1hOkNvbnN0cmFpbnQiPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIHRoZSBwYWNrYWdpbmcgcnVsZXMgZm9yIHRoaXMgTWV0aG9kIEVsZW1lbnQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJNZXRob2RFbGVtZW50UHJvcGVydHkiIHR5cGU9InVtYTpNZXRob2RFbGVtZW50UHJvcGVydHkiPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCTwveHNkOmNob2ljZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5FdmVyeSBpbnN0YW5jZSBvZiBNZXRob2QgRWxlbWVudCBoYXMgYSBnbG9iYWwgdW5pcXVlIGlkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImJyaWVmRGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+RXZlcnkgaW5zdGFuY2Ugb2YgTWV0aG9kIEVsZW1lbnQgc2hhbGwgYmUgYnJpZWZseSBkZXNjcmliZWQgd2l0aCBvbmUgb3IgdHdvIHNlbnRlbmNlcyBzdW1tYXJpemluZyB0aGUgZWxlbWVudC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzdXBwcmVzc2VkIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5JZiBhIFZhcmlhYmlsaXR5IEVsZW1lbnQgaXMgZGVyaXZlZCBmcm9tIGFub3RoZXIgVmFyaWFiaWxpdHkgRWxlbWVudCB1c2luZyB0aGUgImV4dGVuZHMiIFZhcmlhYmlsaXR5IFNwZWNpYWxpemF0aW9uLCB0aGVuIHRoaXMgYXR0cmlidXRlIGNhbiBiZSB1c2VkIHRvIHN1cHByZXNzIGluaGVyaXRlZCBNZXRob2QgRWxlbWVudHMgdGhhdCB3ZXJlIHBhcnQgb2YgdGhlIGJhc2VkLW9uIFZhcmlhYmlsaXR5IEVsZW1lbnQsIHdoaWNoIGNhbiBiZSBhbnkgdHlwZSBvZiBNZXRob2QgRWxlbWVudC4gIEluIG90aGVyIHdvcmRzLCBpZiB0aGlzIGF0dHJpYnV0ZSBpcyBzZXQgdG8gdHJ1ZSBvbiBhIE1ldGhvZCBFbGVtZW50IHRoYXQgaGFzIHRoZSBzYW1lIG5hbWUgdGhhbiBhbiBpbmhlcml0ZWQgbWV0aG9kIGVsZW1lbnQgdGhlbiBpdCB3aWxsIG5vdCBiZSByZWdhcmRlZCBhcyBpbmhlcml0ZWQgYXQgYWxsLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9Im9yZGVyaW5nR3VpZGUiIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+VXNlZCBmb3IgQ0FTRSB0b29sIHJlYWxpemF0aW9ucyBvZiB0aGlzIG1vZGVsIHRvIGNvbnRhaW4gaW5mb3JtYXRpb24gYWJvdXQgbGF5b3V0IGFuZCBvcmRlcmluZyBvZiB0aGUgbWV0aG9kIGVsZW1lbnQgYW5kIGl0cyBwYXJ0cy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJDb25zdHJhaW50Ij4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgZ2VuZXJhbGl6ZWQgTWV0aG9kIEVsZW1lbnQgdGhhdCByZXByZXNlbnRzIGEgY29uZGl0aW9uIG9yIHJlc3RyaWN0aW9uIGV4cHJlc3NlZCBpbiBuYXR1cmFsIGxhbmd1YWdlIHRleHQgb3IgaW4gYSBtYWNoaW5lIHJlYWRhYmxlIGxhbmd1YWdlIGZvciB0aGUgcHVycG9zZSBvZiBkZWNsYXJpbmcgc29tZSBvZiB0aGUgc2VtYW50aWNzIG9mIGEgTWV0aG9kIEVsZW1lbnQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpNZXRob2RFbGVtZW50Ij4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtYWluRGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+U3RvcmVzIHRoZSBtYWluIGRlZmluaXRpb24gb2YgdGhlIGNvbnN0cmFpbnQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJNZXRob2RFbGVtZW50UHJvcGVydHkiPgotCSAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotCSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpQYWNrYWdlYWJsZUVsZW1lbnQiPgotCSAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idmFsdWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkgICAgICA8L3hzZDpleHRlbnNpb24+Ci0JICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAJPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJTZWN0aW9uIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lhbCBNZXRob2QgRWxlbWVudCB0aGF0IHJlcHJlc2VudHMgc3RydWN0dXJhbCBzdWJzZWN0aW9ucyBvZiBhIENvbnRlbnQgRGVzY3JpcHRpb24ncyBzZWN0aW9uRGVzY3JpcHRpb24gYXR0cmlidXRlLiAgSXQgaXMgdXNlZCBmb3IgZWl0aGVyIGxhcmdlIHNjYWxlIGRvY3VtZW50YXRpb24gb2YgQ29udGVudCBFbGVtZW50cyBvcmdhbml6ZWQgaW50byBzZWN0aW9ucyBhcyB3ZWxsIGFzIHRvIGZsZXhpYmx5IGFkZCBuZXcgU2VjdGlvbnMgdG8gQ29udGVudCBFbGVtZW50cyB1c2luZyBjb250cmlidXRpb24gdmFyaWFiaWxpdHkgYWRkZWQgdG8gdGhlIFNlY3Rpb24gY29uY2VwdCBmb3IgTWV0aG9kIFBsdWctaW5zLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6TWV0aG9kRWxlbWVudCI+Ci0JCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlN1YlNlY3Rpb24iIHR5cGU9InVtYTpTZWN0aW9uIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlByZWRlY2Vzc29yIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkRlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGlzIGF0dHJpYnV0ZXMgc3RvcmUgdGhlIGRlc2NyaXB0aW9uIHRleHQgZm9yIGEgQ29udGVudCBEZXNjcmlwdGlvbidzIFNlY3Rpb24uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0ic2VjdGlvbk5hbWUiIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+RXZlcnkgU2VjdGlvbiBoYXMgYSBuYW1lIHVzZWQgZm9yIGV4dGVybmFsIHByZXNlbnRhdGlvbiBvZiB0aGUgc2VjdGlvbiwgZS5nLiB3aGVuIHB1Ymxpc2hlZCBvciB3aGVuIHNlY3Rpb24gaGVhZGluZyBhcmUgbGlzdGVkIGluIGEgdGFibGUgb2YgY29udGVudHMuICBUaGlzIGF0dHJpYnV0ZSBpcyBzaW1pbGFyIHRvIFByZXNlbnRhdGlvbiBOYW1lIGZvciBDb250ZW50IEVsZW1lbnRzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9InZhcmlhYmlsaXR5VHlwZSIgdHlwZT0idW1hOlZhcmlhYmlsaXR5VHlwZSIvPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9InZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJNZXRob2RVbml0Ij4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lhbCBNZXRob2QgRWxlbWVudCB0aGF0IHNoYWxsIGJlIG1haW50YWluZWQgaW4gYSBNZXRob2QgTGlicmFyeSBhcyBhIHNlcGFyYXRlIHVuaXQgb2YgY29udHJvbC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOk1ldGhvZEVsZW1lbnQiPgotCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJDb3B5cmlnaHQiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImF1dGhvcnMiIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+RXZlcnkgTWV0aG9kIFVuaXQgaXMgYmVpbmcgY3JlYXRlZCBhbmQgb3duZWQgYnkgYW4gYXV0aG9yIG9yIGF1dGhvcmluZyB0ZWFtLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImNoYW5nZURhdGUiIHR5cGU9InhzZDpkYXRlVGltZSI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZGF0ZSB0aGUgbGFzdCBjaGFuZ2UgdGhhdCByZXN1bHRlZCBpbnRvIHRoaXMgdmVyc2lvbiBoYXMgYmVlbiBtYWRlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImNoYW5nZURlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgbGFzdCBjaGFuZ2UgdGhhdCByZXN1bHRlZCBpbnRvIHRoaXMgdmVyc2lvbi48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ2ZXJzaW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkV2ZXJ5IFBhY2thZ2UgaGFzIGEgdmVyc2lvbiBudW1iZXIgdXNlZCB0byB0cmFjayBjaGFuZ2VzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkNvbnRlbnREZXNjcmlwdGlvbiI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIGdlbmVyYWxpemVkIE1ldGhvZCBFbGVtZW50IHRoYXQgaXMgdXNlZCB0byBzdG9yZSB0aGUgdGV4dHVhbCBkZXNjcmlwdGlvbiBmb3IgYSBDb250ZW50IEVsZW1lbnQuICBJdCBkZWZpbmVzIHN0YW5kYXJkIGF0dHJpYnV0ZXMgYXBwbGljYWJsZSBmb3IgYWxsIENvbnRlbnQgRWxlbWVudCB0eXBlcy4gIFNwZWNpZmljIENvbnRlbnQgRWxlbWVudCBzdWItdHlwZXMgY2FuIGRlZmluZSB0aGVpciBvd24gbWF0Y2hpbmcgQ29udGVudCBEZXNjcmlwdGlvbiBzdWItdHlwZXMuIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6TWV0aG9kVW5pdCI+Ci0JCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Ik1haW5EZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+U3RvcmVzIHRoZSBtYWluIGRlc2NyaXB0aXZlIHRleHQgZm9yIHRoZSBDb250ZW50IEVsZW1lbnQuICBBbGwgdGV4dCB0aGF0IGlzIG5vdCBwYXJ0IG9mIGFueSBvZiB0aGUgbW9yZSBzcGVjaWZpYyBhdHRyaWJ1dGVzIHNoYWxsIGJlIHN0b3JlZCBoZXJlLiAgSWYgdGhlIENvbnRlbnQgRGVzY3JpcHRpb24gaXMgZGl2aWRlZCBpbnRvIHNlY3Rpb25zIHVzaW5nIHRoZSBTZWN0aW9uIGNsYXNzLCB0aGVuIG9ubHkgdGhlIHRleHQgZnJvbSB0aGUgJ3N0YXJ0JyBvZiB0aGUgY29udGVudCBkZXNjcmlwdGlvbiB0byB0aGUgZmlyc3Qgc2VjdGlvbiB3aWxsIGJlIHN0b3JlZCBoZXJlIChzaW1pbGFyIHRvIGEgbm9ybWFsIGRvY3VtZW50IHdoZXJlIHlvdSBjYW4gcGxhY2UgdGV4dCBiZXR3ZWVuIGl0cyBiZWdpbm5pbmcgdG8gaXRzIGZpcnN0IGRpY3Rpb24gaGVhZGluZykuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJLZXlDb25zaWRlcmF0aW9ucyIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+UHJvdmlkZXMgYWR2aXNlIGFuZCBndWlkYW5jZSBvZiBhIGNyaXRpY2FsIG5hdHVyZSBmb3IgdGhlIGNvbnRlbnQgZWxlbWVudCBhcyB3ZWxsIGFzIHdhcm5pbmdzLCBjYXV0aW9ucywgcGl0ZmFsbHMsIGRhbmdlcnMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJTZWN0aW9uIiB0eXBlPSJ1bWE6U2VjdGlvbiIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImV4dGVybmFsSWQiIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+QW4gZXh0ZXJuYWwgdmlzaWJsZSBudW1iZXIgdGhhdCBpcyB1c2VkIHRvIHJlZmVyZW5jZSB0aGlzIGFydGlmYWN0LiBVc2VkIGxpa2UgYSBzeW5vbnltLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgkJCQkKLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJHdWlkYW5jZURlc2NyaXB0aW9uIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgZ2VuZXJhbGl6ZWQgQ29udGVudCBEZXNjcmlwdGlvbiB0aGF0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIHRleHR1YWwgZGVzY3JpcHRpb24gZm9yIGEgR3VpZGFuY2UuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpDb250ZW50RGVzY3JpcHRpb24iPgotCQkJCTx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJBdHRhY2htZW50IiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+VGhpcyBmaWVsZCBpcyBwcmltYXJpbHkgdXNlZCBmb3IgYXR0YWNobWVudHMgYXVnbWVudGluZyB0aGUgaW5mb3JtYXRpb24gcHJvdmlkZWQgZm9yIGd1aWRhbmNlLiAgSW4gcGFydGljdWxhciB0aGUgYXR0cmlidXRlIGlzIHVzZWQgZm9yIFRlbXBsYXRlcywgRXhhbXBsZXMsIGFuZCBSZXVzYWJsZSBBc3NldHMgdG8gY29udGFpbiB0aGUgYWN0dWFsIGF0dGFjaG1lbnQgZGVzY3JpYmVkIGluIHRoZSBtYWluRGVzY3JpcHRpb24uICBJdCBjYW4gYWRkaXRpb25hbGx5IGNvbnRhaW4gcmVwcmVzZW50YXRpb25zIG9mIHRoZSBndWlkYW5jZSBpbiBqdXN0IGEgdGhpcmQgcGFydHkgZm9ybWF0LCBlLmcuIFBERiwgTVMgV29yZCwgb3IgV29yZCBQZXJmZWN0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCTwveHNkOmNob2ljZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJQcmFjdGljZURlc2NyaXB0aW9uIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgZ2VuZXJhbGl6ZWQgQ29udGVudCBEZXNjcmlwdGlvbiB0aGF0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIHRleHR1YWwgZGVzY3JpcHRpb24gZm9yIGEgUHJhY3RpY2UuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpDb250ZW50RGVzY3JpcHRpb24iPgotCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJBZGRpdGlvbmFsSW5mbyIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+QW55IGFkZGl0aW9uYWwgSW5mb3JtYXRpb24gbm90IGNvdmVyZWQgYnkgdGhlIG90aGVyIGF0dHJpYnV0ZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJBcHBsaWNhdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+RGVzY3JpYmVzIGhvdyB0aGUgUHJhY3RpY2UgaXMgYmVpbmcgYXBwbGllZCBvciBpbnRyb2R1Y2VkIGludG8gdGhlIGNvbnRleHQgZGVzY3JpYmVkIGluIGJhY2tncm91bmQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJCYWNrZ3JvdW5kIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5FbGFib3JhdGlvbiBvbiB0aGUgYmFja2dyb3VuZCBhbmQgdGhlIGNvbnRleHQgaW4gd2hpY2ggdGhlIHByb2JsZW0gb2NjdXJzIGFuZCB3aGVyZSB0aGUgc29sdXRpb24gZGVzY3JpYmVkIGJ5IHRoaXMgUHJhY3RpY2Ugd2lsbCBmaXQgaW4uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJHb2FscyIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzdW1tYXJ5IG9mIHRoZSBvdmVyYWxsIGdvYWxzIHRvIGJlIGFkZHJlc3NlZCBieSB0aGUgUHJhY3RpY2UuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJMZXZlbHNPZkFkb3B0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5PdXRsaW5lcyB0aGUgZGlmZmVyZW50IGZvcm1zIG9yIHZhcmlhbnRzIGluIHdoaWNoIHRoZSBwcmFjdGljZSBjb3VsZCBiZSByZWFsaXplZC4gKGUuZy4gZnVsbCBhZG9wdGlvbiB2ZXJ1cyBhIHBhcnRpYWwgYWRvcHRpb24gb2YgdGhlIFByYWN0aWNlKTwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUHJvYmxlbSIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+QSBkZXNjcmlwdGlvbiBvZiB0aGUgcHJvYmxlbSB0aGUgUHJhY3RpY2UgYWRkcmVzc2VzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IldvcmtQcm9kdWN0RGVzY3JpcHRpb24iPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBnZW5lcmFsaXplZCBDb250ZW50IERlc2NyaXB0aW9uIHRoYXQgaXMgdXNlZCB0byBzdG9yZSB0aGUgdGV4dHVhbCBkZXNjcmlwdGlvbiBmb3IgYSBXb3JrIFByb2R1Y3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpDb250ZW50RGVzY3JpcHRpb24iPgotCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJJbXBhY3RPZk5vdEhhdmluZyIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+RGVzY3JpYmVzIHRoZSBjb25zZXF1ZW5jZXMgb2Ygbm90IHByb2R1Y2luZyB0aGUgd29yayBwcm9kdWN0LiAgVGhpcyBpcyBpbnRlbmRlZCB0byBhaWQgaW4gdGhlIHRhaWxvcmluZyB0aGUgbWV0aG9kL3Byb2Nlc3MgdG8gdGhlIG5lZWRzIG9mIGEgc3BlY2lmaWMgcHJvamVjdC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlB1cnBvc2UiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkRlc2NyaWJlcyB3aHkgdGhlIHdvcmsgcHJvZHVjdCBpcyBwcm9kdWNlZCBhbmQgdG8gd2hhdCB1c2UgaXQgd2lsbCBiZSBwdXQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJSZWFzb25zRm9yTm90TmVlZGluZyIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+RGVzY3JpYmVzIHRoZSBjaXJjdW1zdGFuY2VzIGluIHdoaWNoIGl0IGlzIHJlYXNvbmFibGUgbm90IHRvIHByb2R1Y2UgdGhlIHdvcmsgcHJvZHVjdC4gIFRoaXMgaXMgaW50ZW5kZWQgdG8gYWlkIGluIHRoZSB0YWlsb3Jpbmcgb2YgdGhlIG1ldGhvZC9wcm9jZXNzIHRvIHRoZSBuZWVkcyBvZiBhIHNwZWNpZmljIHByb2plY3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iQXJ0aWZhY3REZXNjcmlwdGlvbiI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIGdlbmVyYWxpemVkIFdvcmsgUHJvZHVjdCBEZXNjcmlwdGlvbiB0aGF0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIHRleHR1YWwgZGVzY3JpcHRpb24gZm9yIGFuIEFydGlmYWN0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6V29ya1Byb2R1Y3REZXNjcmlwdGlvbiI+Ci0JCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkJyaWVmT3V0bGluZSIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+UHJvdmlkZXMgYSBicmllZiBkZXNjcmlwdGlvbiBvZiB0aGUgaW5mb3JtYXRpb24gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhpcyBhcnRpZmFjdC4gRm9yIGV4YW1wbGUsIGRpc2N1c3NlcyB0aGUgY29udGVudHMgZm9yIGtleSBjaGFwdGVycyBvZiBhIGRvY3VtZW50IGFydGlmYWN0IG9yIHRoZSBrZXkgcGFja2FnZXMgYW5kIG1vZHVsZXMgb2YgYSBtb2RlbCBhcnRpZmFjdC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlJlcHJlc2VudGF0aW9uT3B0aW9ucyIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+RGlzY3Vzc2VzIGRpZmZlcmVudCBwb3NzaWJsZSBhbHRlcm5hdGl2ZSByZXByZXNlbnRhdGlvbnMgZm9yIHRoZSBhcnRpZmFjdC4gRm9yIGV4YW1wbGUgYSBkZXNpZ24gbW9kZWwgY2FuIGJlIHJlcHJlc2VudGVkIGFzIGEgVU1MIG1vZGVsIG9yIGFuIGluZm9ybWFsIGJsb2NrIGRpYWdyYW0gb3IgYnkgdGV4dHVhbCBkZXNjcmlwdGlvbiBvbmx5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUmVwcmVzZW50YXRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJOb3RhdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4JCQkJCQotCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkRlbGl2ZXJhYmxlRGVzY3JpcHRpb24iPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBnZW5lcmFsaXplZCBXb3JrIFByb2R1Y3QgRGVzY3JpcHRpb24gdGhhdCBpcyB1c2VkIHRvIHN0b3JlIHRoZSB0ZXh0dWFsIGRlc2NyaXB0aW9uIGZvciBhIERlbGl2ZXJhYmxlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6V29ya1Byb2R1Y3REZXNjcmlwdGlvbiI+Ci0JCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkV4dGVybmFsRGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgRGVsaXZlcmFibGUgdXNlZCBmb3IgY2xpZW50IGRvY3VtZW50cyAocHJvcG9zYWwsIHN0YXRlbWVudHMgb2Ygd29yayBvciBjb250cmFjdHVhbCBhZ3JlZW1lbnRzKS4gIEl0IG1pZ2h0IHVzZSBhIGRpZmZlcmVudCBsYW5ndWFnZSBhbmQgZm9sbG93IGxlZ2FsIGNvbnN0cmFpbnRzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUGFja2FnaW5nR3VpZGFuY2UiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlByb3ZpZGVzIGd1aWRhbmNlIG9uIGhvdyB0byBhc3NlbWJsZSB0aGUgZGVsaXZlcmFibGUgZnJvbSBhbGwgaXRzIHJlcXVpcmVkIGlucHV0cy4gIFRoaXMgc2VjdGlvbiBkZXNjcmliZXMgdGhlIG1vc3QgY29tbW9uIGNvbnRlbnQgbWVkaXVtIGFuZCBmb3JtYXQuICBEaXN0cmlidXRpb24gb2YgdGhlIGRlbGl2ZXJhYmxlIGlzIGFkZHJlc3NlZCBpbiB0aGlzIHNlY3Rpb24sIGlmIG5lY2Vzc2FyeS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJSb2xlRGVzY3JpcHRpb24iPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBnZW5lcmFsaXplZCBDb250ZW50IERlc2NyaXB0aW9uIHRoYXQgaXMgdXNlZCB0byBzdG9yZSB0aGUgdGV4dHVhbCBkZXNjcmlwdGlvbiBmb3IgYSBSb2xlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6Q29udGVudERlc2NyaXB0aW9uIj4KLQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQXNzaWdubWVudEFwcHJvYWNoZXMiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlByb3ZpZGVzIGd1aWRhbmNlIG9uIGZvciBhc3NpZ25pbmcgaW5kaXZpZHVhbHMgdG8gdGhlIFJvbGUgaW4gdGVybXMgb2Ygd2hhdCBvdGhlciByb2xlcyB0aGVzZSBpbmRpdmlkdWFscyBjb3VsZCBwZXJmb3JtIGFuZCB3aGF0IHJlc3BvbnNpYmlsaXR5IGRpZmZlcmVudCBpbmRpdmlkdWFscyBhc3NpZ25lZCB0byB0aGlzIHJvbGUgbWlnaHQgaGF2ZS4gIFRoZSBndWlkYW5jZSBjYW4gYWxzbyBkZXNjcmliZSBkaWZmZXJlbnQgYXNzaWdubWVudCBhcHByb2FjaGVzIGZvciBkaWZmZXJlbnQgdHlwZXMgb2YgcHJvamVjdHMsIGUuZy4gZm9yIGxhcmdlIHZlcnN1cyBzbWFsbCB0ZWFtcyB3aGVyZSBpbmRpdmlkdWFscyBjb3VsZCBiZSBhbGxvY2F0ZWQgdG8gcm9sZXMgZnVsbCB0aW1lIHZlcnN1cyBzaGFyaW5nIHJvbGVzIHdpdGhpbiB0aGUgdGVhbS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlNraWxscyIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+TGlzdHMgb2Ygc2V0IG9mIHJlcXVpcmVkIHNraWxscyBhIHBlcnNvbiBuZWVkcyB0byBwb3NzZXNzIHRvIGZ1bGZpbGwgdGhhdCBSb2xlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iU3lub255bXMiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkxpc3RzIHN5bm9ueW1zLCBpLmUuIG90aGVyIG5hbWVzIHRoZSBSb2xlIG1pZ2h0IGJlIHJlZmVycmVkIGJ5LiAgVG9vbCBzdXBwb3J0IGZvciB0aGUgbWV0YS1tb2RlbCBtaWdodCBzdXBwb3J0IHRoYXQgYSBSb2xlIG5hbWUgY2FuIGJlIGNvbnNpc3RlbnRseSBiZSByZXBsYWNlZCB3aXRoIG9uZSBvZiBpdHMgc3lub255bXMgdGhyb3VnaHQgYSBQcm9jZXNzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlRhc2tEZXNjcmlwdGlvbiI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIGdlbmVyYWxpemVkIENvbnRlbnQgRGVzY3JpcHRpb24gdGhhdCBpcyB1c2VkIHRvIHN0b3JlIHRoZSB0ZXh0dWFsIGRlc2NyaXB0aW9uIGZvciBhIFRhc2suPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpDb250ZW50RGVzY3JpcHRpb24iPgotCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJBbHRlcm5hdGl2ZXMiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkNvbXByaXNlcyBvZiBzdW1tYXJpZXMgZGVzY3JpYmluZyBpbXBvcnRhbnQgZXhjZXB0aW9uYWwgYW5kIG5vbi1zdGFuZGFyZCB3YXlzIG9mIGFjaGlldmluZyB0aGlzIFRhc2sncyBkZXZlbG9wbWVudCBnb2FscyB0aGF0IHdlcmUgbm90IGNvdmVyZWQgYnkgdGhlIFRhc2sncyBTdGVwcy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlB1cnBvc2UiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlN1bW1hcml6ZXMgdGhlIG1haW4gcmVhc29uIGZvciBwZXJmb3JtaW5nIHRoaXMgVGFzayBhbmQgd2hhdCBpcyBpbnRlbmRlZCB0byBiZSBhY2hpZXZlZC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJEZXNjcmliYWJsZUVsZW1lbnQiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QW4gYWJzdHJhY3QgZ2VuZXJhbGl6YXRpb24gb2YgTWV0aG9kIEVsZW1lbnRzIGZvciB3aGljaCBleHRlcm5hbCBwcmVzZW50YXRpb24gbmFtZXMgYXMgd2VsbCBhcyBjb250ZW50IGRlc2NyaXB0aW9ucyBoYXZlIGJlZW4gZGVmaW5lZCwgc3VjaCBhcyBSb2xlcyBvciBXb3JrIFByb2R1Y3RzLiAgUHJlc2VudGF0aW9uIE5hbWUgYW5kIENvbnRlbnQgRGVzY3JpcHRpb25zIGFyZSB0eXBpY2FsbHkgbG9jYWxpemVkIHVzaW5nIGEgcmVzb3VyY2UgYWxsb2NhdGlvbiBtZWNoYW5pc20gZm9yIGl0cyBTdHJpbmcgdHlwZSBhdHRyaWJ1dGVzLgotVGhpcyBhYnN0cmFjdGlvbiByZXByZXNlbnRzIGFsbCBlbGVtZW50cyBpbiB0aGUgTWV0aG9kIENvbnRlbnQgYXMgd2VsbCBhcyBQcm9jZXNzIHNwYWNlIGZvciB3aGljaCBjb25jcmV0ZSB0ZXh0dWFsIGRlc2NyaXB0aW9ucyBhcmUgZGVmaW5lZCBpbiB0aGUgZm9ybSBvZiBkb2N1bWVudGluZyBhdHRyaWJ1dGVzIGdyb3VwZWQgaW4gYSBtYXRjaGluZyBDb250ZW50IERlc2NyaXB0aW9uIGluc3RhbmNlLiAgRGVzY3JpYmFibGUgRWxlbWVudHMgYXJlIGludGVuZGVkIHRvIGJlIHB1Ymxpc2hlZCBpbiBtZXRob2Qgb3IgcHJvY2VzcyBwdWJsaWNhdGlvbnMgKHNpbWlsYXIgdG8gdGhlIElCTSBSYXRpb25hbCBVbmlmaWVkIFByb2Nlc3Mgd2ViKS4gIERlc2NyaWJhYmxlIEVsZW1lbnQgZGVmaW5lcyB0aGF0IHRoZSBlbGVtZW50IGl0IHJlcHJlc2VudHMgd2lsbCBoYXZlIGNvbnRlbnQgJ2F0dGFjaGVkJyB0byBpdC4gIENvbnRlbnQgRGVzY3JpcHRpb24gaXMgdGhlIGFic3RyYWN0aW9uIGZvciB0aGUgYWN0dWFsIHBsYWNlcyBpbiB3aGljaCB0aGUgY29udGVudCBpcyBiZWluZyByZXByZXNlbnRlZC4gIFRoaXMgc2VwYXJhdGlvbiBhbGxvd3MgYSBkaXN0aW5jdGlvbiBiZXR3ZWVuIGNvcmUgbWV0aG9kIG1vZGVsIGVsZW1lbnRzIGRlc2NyaWJpbmcgdGhlIHN0cnVjdHVyZSBvZiB0aGUgbW9kZWwgZnJvbSB0aGUgYWN0dWFsIGRlc2NyaXB0aW9uIGNvbnRhaW5lciBwcm92aWRpbmcsIGZvciBleGFtcGxlLCB0aGUgZG9jdW1lbnRhdGlvbiBvZiB0aGUgY29udGVudCBlbGVtZW50IGluIGRpZmZlcmVudCBhbHRlcm5hdGl2ZXMgbGFuZ3VhZ2VzLCBhdWRpZW5jZXMsIGxpY2Vuc2luZyBsZXZlbHMsIGV0Yy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOk1ldGhvZEVsZW1lbnQiPgotCQkJCTx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJQcmVzZW50YXRpb24iIHR5cGU9InVtYTpDb250ZW50RGVzY3JpcHRpb24iLz4KLQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0icHJlc2VudGF0aW9uTmFtZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5FdmVyeSBEZXNjcmliYWJsZSBFbGVtZW50IGhhcyBhIHByZXNlbnRhdGlvbiBuYW1lLCB3aGljaCBpcyB1c2VkIGZvciBleHRlcm5hbCBwcmVzZW50YXRpb24gb2YgdGhlIGVsZW1lbnQuICBGb3IgZXhhbXBsZSwgbmFtZSAodGhlIGludGVybmFsIHJlcHJlc2VudGF0aW9uKSBtaWdodCBiZSBzZXQgdG8gInJ1cF9hcmNoaXRlY3R1cmVfZG9jdW1lbnQiIHRvIGRpZmZlcmVudGlhdGUgZnJvbSBhICJqMmVlX2FyY2hpdGN0dXJlX2RvY3VtZW50IiB3aGVyZWFzIHRoZSBleHRlcm5hbCBwcmVzZW50YXRpb24gd291bGQgYWx3YXlzIGJlICJBcmNoaXRlY3R1cmUgRG9jdW1lbnQiLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9InNoYXBlaWNvbiIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHJlZmVyZW5jZSB0byBhbiBpY29uIHRoYXQgY2FuIGJlIHVzZWQgZm9yIG1vZGVsaW5nIHdpdGggc3BlY2lmaWMgQ29udGVudCBFbGVtZW50IGluc3RhbmNlcyAoYXMgZ3JhcGhpY2FsIHN0ZXJlb3R5cGVzLCBlLmcuIGEgdXNlIGNhc2Ugc3ltYm9sIGZvciBhIHVzZSBjYXNlIGFydGlmYWN0KSBhcyB3ZWxsIGFzIHB1YmxpY2F0aW9uIG9mIGNvbnRlbnQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0ibm9kZWljb24iIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+QSByZWZlcmVuY2UgdG8gYW4gaWNvbiB0aGF0IGNhbiBiZSB1c2VkIGluIHRyZWUgYnJvd3NlciBwcmVzZW50YXRpb25zIGFuZCBicmVha2Rvd24gc3RydWN0dXJlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJDb250ZW50RWxlbWVudCI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIERlc2NyaWJhYmxlIEVsZW1lbnQgdGhhdCByZXByZXNlbnRzIGFuIGFic3RyYWN0IGdlbmVyYWxpemF0aW9uIGZvciBhbGwgZWxlbWVudHMgdGhhdCBhcmUgY29uc2lkZXJlZCB0byBiZSBhbmQgbWFuYWdlZCBhcyBNZXRob2QgQ29udGVudC4KLUNvbnRlbnQgRWxlbWVudHMgcmVwcmVzZW50cyByZXVzYWJsZSBNZXRob2QgQ29udGVudCB0aGF0IGlzIHN1cHBvc2VkIHRvIGJlIG1hbmFnZWQgaW4gQ29udGVudCBQYWNrYWdlcy4gIFRoZSBzZXBhcmF0aW9uIG9mIENvbnRlbnQgRWxlbWVudCBmcm9tIFByb2Nlc3MgRWxlbWVudCBhbGxvd3MgdG8gY2xlYXJseSBkaXN0aW5ndWlzaCBiZXR3ZWVuIHB1cmUgbWV0aG9kIGNvbnRlbnQgZnJvbSBjb250ZW50IHRoYXQgaXMgcmVwcmVzZW50ZWQgaW4gcHJvY2Vzc2VzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6RGVzY3JpYmFibGVFbGVtZW50Ij4KLQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQk8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJDaGVja2xpc3QiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJDb25jZXB0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iRXhhbXBsZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Ikd1aWRlbGluZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlJldXNhYmxlQXNzZXQiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJTdXBwb3J0aW5nTWF0ZXJpYWwiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJXaGl0ZXBhcGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCTwveHNkOmNob2ljZT4KLQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ2YXJpYWJpbGl0eVR5cGUiIHR5cGU9InVtYTpWYXJpYWJpbGl0eVR5cGUiLz4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iR3VpZGFuY2UiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+R3VpZGFuY2UgaXMgYW4gYWJzdHJhY3QgZ2VuZXJhbGl6YXRpb24gb2YgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWxhdGVkIHRvIGNvbnRlbnQgZWxlbWVudHMgc3VjaCBhcyBSb2xlcywgVGFza3MsIGFuZCBXb3JrIFByb2R1Y3RzLiAgRXhhbXBsZXMgZm9yIEd1aWRhbmNlIGFyZSBHdWlkZWxpbmVzLCBUZW1wbGF0ZXMsIENoZWNrbGlzdHMsIFRvb2wgTWVudG9ycywgRXN0aW1hdGVzLCBTdXBwb3J0aW5nIE1hdGVyaWFscywgUmVwb3J0cywgQ29uY2VwdHMsIGV0Yy4gIFRoaXMgcGFja2FnZSBvbmx5IGNvbnRhaW5zIHRoZSBkZWZpbml0aW9uIG9mIHRoZSBhYnN0cmFjdCBHdWlkYW5jZSBjbGFzcy4gIFRoZSBwYWNrYWdlIEd1aWRhbmNlIFR5cGVzIGRlZmluZXMgY29uY3JldGUgZ3VpZGFuY2UgdHlwZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpDb250ZW50RWxlbWVudCIvPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkNvbmNlcHQiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWZpYyB0eXBlIG9mIGd1aWRhbmNlIHRoYXQgb3V0bGluZXMga2V5IGlkZWFzIGFzc29jaWF0ZWQgd2l0aCBiYXNpYyBwcmluY2lwbGVzIHVuZGVybHlpbmcgdGhlIHJlZmVyZW5jZWQgaXRlbS4gQ29uY2VwdHMgbm9ybWFsbHkgYWRkcmVzcyBtb3JlIGdlbmVyYWwgdG9waWNzIHRoYW4gR3VpZGVsaW5lcyBhbmQgc3BhbiBhY3Jvc3Mgc2V2LWVyYWwgd29yayBwcm9kdWN0IGFuZC9vciB0YXNrcy9hY3Rpdml0aWVzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6R3VpZGFuY2UiLz4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJDaGVja2xpc3QiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWZpYyB0eXBlIG9mIGd1aWRhbmNlIHRoYXQgaWRlbnRpZmllcyBhIHNlcmllcyBvZiBpdGVtcyB0aGF0IG5lZWQgdG8gYmUgY29tcGxldGVkIG9yIHZlcmktZmllZC4gIENoZWNrbGlzdHMgYXJlIG9mdGVuIHVzZWQgaW4gcmV2aWV3cyBzdWNoIGFzIHdhbGt0aHJvdWdocyBvciBpbnNwZWN0aW9ucy4gPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpHdWlkYW5jZSIvPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkV4YW1wbGUiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWZpYyB0eXBlIG9mIEd1aWRhbmNlIHRoYXQgcmVwcmVzZW50cyBhIHR5cGljYWwsIHBhcnRpYWxseSBjb21wbGV0ZWQsIHNhbXBsZSBpbnN0YW5jZSBvZiBvbmUgb3IgbW9yZSB3b3JrIHByb2R1Y3RzIG9yIHNjZW5hcmlvIGxpa2UgZGVzY3JpcHRpb25zIG9mIGhvdyBUYXNrIG1heSBiZSBwZXJmb3JtZWQuIEV4YW1wbGVzIGNhbiBiZSByZWxhdGVkIHRvIFdvcmsgUHJvZHVjdHMgYXMgd2VsbCBhcyBUYXNrcyB0aGF0IHByb2R1Y2UgdGhlbSBhcyB3ZWxsIGFzIGFueSBvdGhlciBDb250ZW50IEVsZW1lbnQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpHdWlkYW5jZSIvPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ikd1aWRlbGluZSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpZmljIHR5cGUgb2YgZ3VpZGFuY2UgdGhhdCBwcm92aWRlcyBhZGRpdGlvbmFsIGRldGFpbCBvbiBob3cgdG8gcGVyZm9ybSBhIHBhcnRpY3VsYXIgdGFzayBvciBncm91cGluZyBvZiB0YXNrcyAoZS5nLiBncm91cGVkIHRvZ2V0aGVyIGFzIGFjdGl2aXRpZXMpIG9yIHRoYXQgcHJvdmlkZXMgYWRkaXRpb25hbCBkZXRhaWwsIHJ1bGVzLCBhbmQgcmVjb21tZW5kYXRpb25zIG9uIHdvcmsgcHJvZHVjdHMgYW5kIHRoZWlyIHByb3BlcnRpZXMuICBBbW9uZ3N0IG90aGVycywgaXQgY2FuIGluY2x1ZGUgZGV0YWlscyBhYm91dCBiZXN0IHByYWN0aWNlcyBhbmQgZGlmZmVyZW50IGFwcHJvYWNoZXMgZm9yIGRvaW5nIHdvcmssIGhvdyB0byB1c2UgcGFydGljdWxhciB0eXBlcyBvZiB3b3JrIHByb2R1Y3RzLCBpbmZvcm1hdGlvbiBvbiBkaWZmZXJlbnQgc3VidHlwZXMgYW5kIHZhcmlhbnRzIG9mIHRoZSB3b3JrIHByb2R1Y3QgYW5kIGhvdyB0aGV5IGV2b2x2ZSB0aHJvdWdob3V0IGEgbGlmZWN5Y2xlLCBkaXNjdXNzaW9ucyBvbiBza2lsbHMgdGhlIHBlcmZvcm1pbmcgcm9sZXMgc2hvdWxkIGFjcXVpcmUgb3IgaW1wcm92ZSB1cG9uLCBtZWFzdXJlbWVudHMgZm9yIHByb2dyZXNzIGFuZCBtYXR1cml0eSwgZXRjLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6R3VpZGFuY2UiLz4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJFc3RpbWF0ZSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpZmljIHR5cGUgb2YgR3VpZGFuY2UgdGhhdCBwcm92aWRlcyBzaXppbmcgbWVhc3VyZXMsIG9yIHN0YW5kYXJkcyBmb3Igc2l6aW5nIHRoZSB3b3JrIGVmZm9ydCBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyBhIHBhcnRpY3VsYXIgcGllY2Ugb2Ygd29yayBhbmQgaW5zdHJ1Y3Rpb25zIGZvciB0aGVpciBzdWNjZXNzZnVsIHVzZS4gSXQgbWF5IGJlIGNvbXByaXNlZCBvZiBlc3RpbWF0aW9uIGNvbnNpZGVyYXRpb25zIGFuZCBlc3RpbWF0aW9uIG1ldHJpY3MuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpHdWlkYW5jZSI+Ci0JCQkJPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJFc3RpbWF0aW9uTWV0cmljIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iRXN0aW1hdGluZ01ldHJpYyI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpZmljIHR5cGUgb2YgR3VpZGFuY2UgdGhhdCBkZXNjcmliZXMgYSBtZXRyaWMgb3IgbWVhc3VyZSB0aGF0IGlzIGFzc29jaWF0ZWQgd2l0aCBhbiBlbGVtZW50IGFuZCB3aGljaCBpcyB1c2VkIHRvIGNhbGN1bGF0ZSB0aGUgc2l6ZSBvZiB0aGUgd29yayBlZmZvcnQgYXMgd2VsbCBhcyBhIHJhbmdlIG9mIHBvdGVudGlhbCBsYWJvci48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkd1aWRhbmNlIi8+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lmaWMgdHlwZSBvZiBHdWlkYW5jZSB0aGF0IHF1YWxpZmllcyB0aGUgdXNhZ2UgYW5kIGFwcGxpY2F0aW9uIG9mIGVzdGltYXRpb24gbWV0cmljcyBpbiB0aGUgZGV2ZWxvcG1lbnQgb2YgYW4gYWN0dWFsIGVzdGltYXRlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6R3VpZGFuY2UiLz4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJSb2FkbWFwIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lmaWMgdHlwZSBvZiBHdWlkYW5jZSB3aGljaCBpcyBvbmx5IHJlbGF0ZWQgdG8gQWN0aXZhdGVzIGFuZCB0aGVyZWZvcmUgaGFzIGJlZW4gYWRkZWQgYnkgdGhpcyBwYWNrYWdlIHRvIHRoZSBsaXN0IG9mIEd1aWRhbmNlIFR5cGVzIHJhdGhlciB0aGFuIGxpc3RlZCBpbiB0aGUgR3VpZGFuY2UgVHlwZXMgcGFja2FnZS4gIEEgUm9hZG1hcCByZXByZXNlbnRzIGEgbGluZWFyIHdhbGt0aHJvdWdoIG9mIGFuIEFjdGl2aXR5LCB0eXBpY2FsbHkgYSBQcm9jZXNzLgotQW4gaW5zdGFuY2Ugb2YgYSBSb2FkbWFwIHJlcHJlc2VudHMgaW1wb3J0YW50IGRvY3VtZW50YXRpb24gZm9yIHRoZSBBY3Rpdml0eSBvciBQcm9jZXNzIGl0IGlzIHJlbGF0ZWQgdG8uICBPZnRlbiBhIGNvbXBsZXggQWN0aXZpdHkgc3VjaCBhcyBhIFByb2Nlc3MgY2FuIGJlIG11Y2ggZWFzaWVyIHVuZGVyc3Rvb2QgYnkgcHJvdmlkaW5nIGEgd2Fsa3Rocm91Z2ggd2l0aCBhIGxpbmVhciB0aHJlYWQgb2YgYSB0eXBpY2FsIGluc3RhbnRpYXRpb24gb2YgdGhpcyBBY3Rpdml0eS4gIEluIGFkZGl0aW9uIHRvIG1ha2luZyB0aGUgcHJvY2VzcyBwcmFjdGl0aW9uZXIgdW5kZXJzdGFuZCBob3cgd29yayBpbiB0aGUgcHJvY2VzcyBpcyBiZWluZyBwZXJmb3JtZWQsIGEgUm9hZG1hcCBwcm92aWRlcyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGFib3V0IGhvdyBBY3Rpdml0aWVzIGFuZCBUYXNrcyByZWxhdGUgdG8gZWFjaCBvdGhlciBvdmVyIHRpbWUuICBSb2FkbWFwcyBhcmUgYWxzbyB1c2VkIHRvIHNob3cgaG93IHNwZWNpZmljIGFzcGVjdHMgYXJlIGRpc3RyaWJ1dGVkIG92ZXIgYSB3aG9sZSBwcm9jZXNzIHByb3ZpZGluZyBhIGtpbmQgb2YgZmlsdGVyIG9uIHRoZSBwcm9jZXNzIGZvciB0aGlzIGluZm9ybWF0aW9uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6R3VpZGFuY2UiLz4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJSZXBvcnQiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBwcmVkZWZpbmVkIHRlbXBsYXRlIG9mIGEgcmVzdWx0IHRoYXQgaXMgZ2VuZXJhdGVkIG9uIHRoZSBiYXNpcyBvZiBvdGhlciB3b3JrIHByb2R1Y3RzIGFzIGFuIG91dHB1dCBmcm9tIHNvbWUgZm9ybSBvZiB0b29sIGF1dG9tYXRpb24uIEFuIGV4YW1wbGUgZm9yIGEgcmVwb3J0IHdvdWxkIGJlIGEgdXNlIGNhc2UgbW9kZWwgc3VydmV5LCB3aGljaCBpcyBnZW5lcmF0ZWQgYnkgZXh0cmFjdGluZyBkaWFncmFtIGluZm9ybWF0aW9uIGZyb20gYSBncmFwaGljYWwgbW9kZWwgYW5kIHRleHR1YWwgaW5mb3JtYXRpb24gZnJvbSBkb2N1bWVudHMgYW5kIGNvbWJpbmVzIHRoZXNlIHR3byB0eXBlcyBvZiBpbmZvcm1hdGlvbiBpbnRvIGEgcmVwb3J0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6R3VpZGFuY2UiLz4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJUZW1wbGF0ZSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpZmljIHR5cGUgb2YgZ3VpZGFuY2UgdGhhdCBwcm92aWRlcyBmb3IgYSB3b3JrIHByb2R1Y3QgYSBwcmUtZGVmaW5lZCB0YWJsZSBvZiBjb250ZW50cywgc2VjdGlvbnMsIHBhY2thZ2VzLCBhbmQvb3IgaGVhZGluZ3MsIGEgc3RhbmRhcmRpemVkIGZvcm1hdCwgYXMgd2VsbCBhcyBkZXNjcmlwdGlvbnMgaG93IHRoZSBzZWN0aW9ucyBhbmQgcGFja2FnZXMgYXJlIHN1cHBvc2VkIHRvIGJlIHVzZWQgYW5kIGNvbXBsZXRlZC4gVGVtcGxhdGVzIGNhbm5vdCBvbmx5IGJlIHByb3ZpZGVkIGZvciBkb2N1bWVudHMsIGJ1dCBhbHNvIGZvciBjb25jZXB0dWFsIG1vZGVscyBvciBwaHlzaWNhbCBkYXRhIHN0b3Jlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkd1aWRhbmNlIi8+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iU3VwcG9ydGluZ01hdGVyaWFsIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgY2F0Y2hhbGwgZm9yIG90aGVyIHR5cGVzIG9mIGd1aWRhbmNlIG5vdCBzcGVjaWZpY2FsbHkgZGVmaW5lZCBlbHNld2hlcmUuIEl0IGNhbiBiZSByZWxhdGVkIHRvIGFsbCBraW5kcyBvZiBDb250ZW50IEVsZW1lbnRzLCBpLmUuIGluY2x1ZGluZyBvdGhlciBndWlkYW5jZSBlbGVtZW50cy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkd1aWRhbmNlIi8+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iVG9vbE1lbnRvciI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BICBzcGVjaWZpYyB0eXBlIG9mIGd1aWRhbmNlIHRoYXQgc2hvd3MgaG93IHRvIHVzZSBhIHNwZWNpZmljIHRvb2wgdG8gYWNjb21wbGlzaCBzb21lIHBpZWNlIG9mIHdvcmsgYSBXb3JrIFByb2R1Y3QgZWl0aGVyIGluIHRoZSBjb250ZXh0IG9mIG9yIGluZGVwZW5kZW50IGZyb20gYSBUYXNrIG9yIEFjdGl2aXR5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6R3VpZGFuY2UiLz4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJXaGl0ZXBhcGVyIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lhbCBDb25jZXB0IGd1aWRhbmNlIHRoYXQgaGF2ZSBiZWVuIGV4dGVybmFsbHkgcmV2aWV3ZWQgb3IgcHVibGlzaGVkIGFuZCBjYW4gYmUgcmVhZCBhbmQgdW5kZXJzdG9vZCBpbiBpc29sYXRpb24gb2Ygb3RoZXIgY29udGVudCBlbGVtZW50cyBhbmQgZ3VpZGFuY2UuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpDb25jZXB0Ii8+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iVGVybURlZmluaXRpb24iPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWZpYyB0eXBlIG9mIGd1aWRhbmNlIHRoYXQgZGVmaW5lcyBjb25jZXB0cyBhbmQgYXJlIHVzZWQgdG8gYnVpbGQgdXAgdGhlIEdsb3NzYXJ5LiBUZXJtRGVmaW5pdGlvbnMgYXJlIG5vdCBkaXJlY3RseSByZWxhdGVkIHRvIENvbnRlbnRFbGVtZW50cywgYnV0IHRoZWlyIHJlbGF0aW9uc2hpcCBpcyBiZWluZyBkZXJpdmVkIHdoZW4gdGhlIFRlcm0gaXMgdXNlZCBpbiB0aGUgQ29udGVudEVsZW1lbnRzIGRlc2NyaXB0aW9uIHRleHQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpHdWlkYW5jZSIvPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlByYWN0aWNlIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lmaWMgdHlwZSBvZiBndWlkYW5jZSB0aGF0IHJlcHJlc2VudHMgYSBwcm92ZW4gd2F5IG9yIHN0cmF0ZWd5IG9mIGRvaW5nIHdvcmsgdG8gYWNoaWV2ZSBhIGdvYWwgdGhhdCBoYXMgYSBwb3NpdGl2ZSBpbXBhY3Qgb24gd29yayBwcm9kdWN0IG9yIHByb2Nlc3MgcXVhbGl0eS4gIFByYWN0aWNlcyBhcmUgZGVmaW5lZCBvcnRob2dvbmFsIHRvIG1ldGhvZHMgYW5kIHByb2Nlc3Nlcy4gIFRoZXkgY291bGQgc3VtbWFyaXplIGFzcGVjdHMgdGhhdCBpbXBhY3QgbWFueSBkaWZmZXJlbnQgcGFydHMgb2YgYSBtZXRob2Qgb3Igc3BlY2lmaWMgcHJvY2Vzc2VzLiAgRXhhbXBsZXMgZm9yIHByYWN0aWNlcyB3b3VsZCBiZSAiTWFuYWdlIFJpc2tzIiwgIkNvbnRpbnVvdXNseSB2ZXJpZnkgcXVhbGl0eSIsICJBcmNoaXRlY3R1cmUtY2VudHJpYyBhbmQgY29tcG9uZW50LWJhc2VkIGRldmVsb3BtZW50IiwgZXRjLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6R3VpZGFuY2UiPgotCQkJCTx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQWN0aXZpdHlSZWZlcmVuY2UiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkNvbnRlbnRSZWZlcmVuY2UiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlN1YlByYWN0aWNlIiB0eXBlPSJ1bWE6UHJhY3RpY2UiLz4KLQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUmV1c2FibGVBc3NldCI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpZmljIHR5cGUgb2YgZ3VpZGFuY2UgdGhhdCBwcm92aWRlcyBhIHNvbHV0aW9uIHRvIGEgcHJvYmxlbSBmb3IgYSBnaXZlbiBjb250ZXh0LiBUaGUgYXNzZXQgbWF5IGhhdmUgYSB2YXJpYWJpbGl0eSBwb2ludCwgd2hpY2ggaXMgYSBsb2NhdGlvbiBpbiB0aGUgYXNzZXQgdGhhdCBtYXkgaGF2ZSBhIHZhbHVlIHByb3ZpZGVkIG9yIGN1c3RvbWl6ZWQgYnkgdGhlIGFzc2V0IGNvbnN1bWVyLiBUaGUgYXNzZXQgaGFzIHJ1bGVzIGZvciB1c2FnZSB3aGljaCBhcmUgdGhlIGluc3RydWN0aW9ucyBkZXNjcmliaW5nCi1ob3cgdGhlIGFzc2V0IHNob3VsZCBiZSB1c2VkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6R3VpZGFuY2UiLz4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJXb3JrUHJvZHVjdCI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BbiBhYnN0cmFjdCBjbGFzcyB3aGljaCBwcm92aWRlcyBhIGdlbmVyYWxpemF0aW9uIGZvciB0aGUgY29udGVudCBlbGVtZW50IHR5cGVzIEFydGlmYWN0LCBPdXRjb21lLCBhbmQgRGVsaXZlcmFibGUuICBUaGUgbWV0YS1tb2RlbCBjbGFzcyBXb3JrIFByb2R1Y3QgYWN0dWFsbHkgcmVwcmVzZW50cyB3b3JrIHByb2R1Y3QgdHlwZXMsIGkuZS4gYW4gaW5zdGFuY2Ugb2YgV29yayBQcm9kdWN0IGlzIGEgZGVzY3JpcHRpb24gb2YgYSBzcGVjaWZpYyB0eXBlIG9mIHdvcmsgcHJvZHVjdCBhbmQgbm90IGFuIGluZGl2aWR1YWwgd29yayBwcm9kdWN0IGluc3RhbmNlLiAgSG93ZXZlciwgZm9yIHNpbXBsaWNpdHkgcmVhc29ucyBhbmQgYmVjYXVzZSBvZiBsb3cgcmlzayBvZiBtaXNpbnRlcnByZXRhdGlvbiB3ZSBkaWQgbm90IGFwcGVuZCB0aGUgd29yZCAndHlwZScgdG8gZXZlcnkgbWV0YS1jbGFzcy4KLUEgd29yayBwcm9kdWN0IGlzIGFuIGFic3RyYWN0aW9uIGZvciBkZXNjcmlwdGlvbnMgb2YgY29udGVudCBlbGVtZW50cyB0aGF0IGFyZSB1c2VkIHRvIGRlZmluZSBhbnl0aGluZyB1c2VkLCBwcm9kdWNlZCwgb3IgbW9kaWZpZWQgYnkgYSB0YXNrLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6Q29udGVudEVsZW1lbnQiPgotCQkJCTx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iRXN0aW1hdGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkVzdGltYXRpb25Db25zaWRlcmF0aW9ucyIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUmVwb3J0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJUZW1wbGF0ZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iVG9vbE1lbnRvciIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCTwveHNkOmNob2ljZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJBcnRpZmFjdCI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIFdvcmsgUHJvZHVjdCB0aGF0IHByb3ZpZGVzIGEgZGVzY3JpcHRpb24gYW5kIGRlZmluaXRpb24gZm9yIHRhbmdpYmxlIHdvcmsgcHJvZHVjdCB0eXBlcy4gQXJ0aWZhY3RzIG1heSBiZSBjb21wb3NlZCBvZiBvdGhlciBhcnRpZmFjdHMuIEZvciBleGFtcGxlLCBhIG1vZGVsIGFydGlmYWN0IGNhbiBiZSBjb21wb3NlZCBvZiBtb2RlbCBlbGVtZW50cywgd2hpY2ggYXJlIGFsc28gYXJ0aWZhY3RzLgotQXJ0aWZhY3RzIGFyZSB0YW5naWJsZSB3b3JrIHByb2R1Y3RzIGNvbnN1bWVkLCBwcm9kdWNlZCwgb3IgbW9kaWZpZWQgYnkgVGFza3MuICBJdCBtYXkgc2VydmUgYXMgYSBiYXNpcyBmb3IgZGVmaW5pbmcgcmV1c2FibGUgYXNzZXRzLiAgUm9sZXMgdXNlIEFydGlmYWN0cyB0byBwZXJmb3JtIFRhc2tzIGFuZCBwcm9kdWNlIEFydGlmYWN0cyBpbiB0aGUgY291cnNlIG9mIHBlcmZvcm1pbmcgVGFza3MuICBBcnRpZmFjdHMgYXJlIHRoZSByZXNwb25zaWJpbGl0eSBvZiBhIHNpbmdsZSBSb2xlLCBtYWtpbmcgcmVzcG9uc2liaWxpdHkgZWFzeSB0byBpZGVudGlmeSBhbmQgdW5kZXJzdGFuZCwgYW5kIHByb21vdGluZyB0aGUgaWRlYSB0aGF0IGV2ZXJ5IHBpZWNlIG9mIGluZm9ybWF0aW9uIHByb2R1Y2VkIGluIHRoZSBtZXRob2QgcmVxdWlyZXMgdGhlIGFwcHJvcHJpYXRlIHNldCBvZiBza2lsbHMuIEV2ZW4gdGhvdWdoIG9uZSByb2xlIG1pZ2h0ICJvd24iIGEgc3BlY2lmaWMgdHlwZSBvZiBBcnRpZmFjdHMsIG90aGVyIHJvbGVzIGNhbiBzdGlsbCB1c2UgdGhlIEFydGlmYWN0czsgcGVyaGFwcyBldmVuIHVwZGF0ZSB0aGVtIGlmIHRoZSBSb2xlIGhhcyBiZWVuIGdpdmVuIHBlcm1pc3Npb24gdG8gZG8gc28uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpXb3JrUHJvZHVjdCI+Ci0JCQkJPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJDb250YWluZWRBcnRpZmFjdCIgdHlwZT0idW1hOkFydGlmYWN0Ii8+Ci0JCQkJPC94c2Q6Y2hvaWNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkRlbGl2ZXJhYmxlIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgV29yayBQcm9kdWN0IHRoYXQgcHJvdmlkZXMgYSBkZXNjcmlwdGlvbiBhbmQgZGVmaW5pdGlvbiBmb3IgcGFja2FnaW5nIG90aGVyIFdvcmsgUHJvZHVjdHMsIGFuZCBtYXkgYmUgZGVsaXZlcmVkIHRvIGFuIGludGVybmFsIG9yIGV4dGVybmFsIHBhcnR5LiAgVGhlcmVmb3JlLCBhIERlbGl2ZXJhYmxlIGFnZ3JlZ2F0ZXMgb3RoZXIgV29yayBQcm9kdWN0cy4gVGhlcmVmb3JlLCBhIERlbGl2ZXJhYmxlIGFnZ3JlZ2F0ZXMgb3RoZXIgV29yayBQcm9kdWN0cy4gIEEgRGVsaXZlcmFibGUgaXMgdXNlZCB0byBwcmUtZGVmaW5lIHR5cGljYWwgb3IgcmVjb21tZW5kZWQgY29udGVudCBpbiB0aGUgZm9ybSBvciB3b3JrIHByb2R1Y3RzIHRoYXQgd291bGQgYmUgcGFja2FnZWQgZm9yIGRlbGl2ZXJ5LiAgVGhlIGFjdHVhbCBwYWNrYWdpbmcgb2YgdGhlIERlbGl2ZXJhYmxlIGluIGFuIGFjdHVhbCBwcm9jZXNzIG9yIGV2ZW4gcHJvamVjdCBjb3VsZCBiZSBhIG1vZGlmaWNhdGlvbiBvZiB0aGlzIHJlY29tbWVuZGF0aW9uLiAgRGVsaXZlcmFibGVzIGFyZSB1c2VkIHRvIHJlcHJlc2VudCBhbiBvdXRwdXQgZnJvbSBhIHByb2Nlc3MgdGhhdCBoYXMgdmFsdWUsIG1hdGVyaWFsIG9yIG90aGVyd2lzZSwgdG8gYSBjbGllbnQsIGN1c3RvbWVyIG9yIG90aGVyIHN0YWtlaG9sZGVyLiA8L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOldvcmtQcm9kdWN0Ij4KLQkJCQk8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkRlbGl2ZXJlZFdvcmtQcm9kdWN0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJPC94c2Q6Y2hvaWNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ik91dGNvbWUiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBXb3JrIFByb2R1Y3QgdGhhdCBkZXNjcmliZXMgaW50YW5naWJsZSB3b3JrIHByb2R1Y3RzIHRoYXQgYXJlIGEgcmVzdWx0IG9yIHN0YXRlLiBPdXRjb21lcyBtYXkgYWxzbyBiZSB1c2VkIHRvIGRlc2NyaWJlIHdvcmsgcHJvZHVjdHMgdGhhdCBhcmUgbm90IGZvcm1hbGx5IGRlZmluZWQuICBBIGtleSBkaWZmZXJlbnRpYXRvciBmb3Igb3V0Y29tZXMgYWdhaW5zdCBhcnRpZmFjdHMgaXMgdGhhdCBvdXRjb21lcyBhcmUgbm90IGNhbmRpZGF0ZXMgZm9yIGhhcnZlc3RpbmcgYXMgcmV1c2FibGUgYXNzZXRzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6V29ya1Byb2R1Y3QiLz4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJSb2xlIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgQ29udGVudCBFbGVtZW50IHRoYXQgZGVmaW5lcyBhIHNldCBvZiByZWxhdGVkIHNraWxscywgY29tcGV0ZW5jaWVzLCBhbmQgcmVzcG9uc2liaWxpdGllcy4gIFJvbGVzIGFyZSB1c2VkIGJ5IFRhc2tzIHRvIGRlZmluZSB3aG8gcGVyZm9ybXMgdGhlbSBhcyB3ZWxsIGFzIGRlZmluZSBhIHNldCBvZiB3b3JrIHByb2R1Y3RzIHRoZXkgYXJlIHJlc3BvbnNpYmxlIGZvci4gIAotQSBSb2xlIGRlZmluZXMgYSBzZXQgb2YgcmVsYXRlZCBza2lsbHMsIGNvbXBldGVuY2llcywgYW5kIHJlc3BvbnNpYmlsaXRpZXMgb2YgYW4gaW5kaXZpZHVhbCBvciBhIHNldCBvZiBpbmRpdmlkdWFscy4gIFJvbGVzIGFyZSBub3QgaW5kaXZpZHVhbHMgb3IgcmVzb3VyY2VzLiAgSW5kaXZpZHVhbCBtZW1iZXJzIG9mIHRoZSBkZXZlbG9wbWVudCBvcmdhbml6YXRpb24gd2lsbCB3ZWFyIGRpZmZlcmVudCBoYXRzLCBvciBwZXJmb3JtIGRpZmZlcmVudCByb2xlcy4gVGhlIG1hcHBpbmcgZnJvbSBpbmRpdmlkdWFsIHRvIHJvbGUsIHBlcmZvcm1lZCBieSB0aGUgcHJvamVjdCBtYW5hZ2VyIHdoZW4gcGxhbm5pbmcgYW5kIHN0YWZmaW5nIGZvciBhIHByb2plY3QsIGFsbG93cyBkaWZmZXJlbnQgaW5kaXZpZHVhbHMgdG8gYWN0IGFzIHNldmVyYWwgZGlmZmVyZW50IHJvbGVzLCBhbmQgZm9yIGEgcm9sZSB0byBiZSBwbGF5ZWQgYnkgc2V2ZXJhbCBpbmRpdmlkdWFscy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkNvbnRlbnRFbGVtZW50Ij4KLQkJCQk8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlJlc3BvbnNpYmxlRm9yIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJPC94c2Q6Y2hvaWNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlRhc2siPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBDb250ZW50IEVsZW1lbnQgdGhhdCBkZXNjcmliZXMgd29yayBiZWluZyBwZXJmb3JtZWQgYnkgUm9sZXMuICBJdCBkZWZpbmVzIG9uZSBkZWZhdWx0IHBlcmZvcm1pbmcgUm9sZSBhcyB3ZWxsIGFzIG1hbnkgYWRkaXRpb25hbCBwZXJmb3JtZXJzLiAgQSBUYXNrIGlzIGFzc29jaWF0ZWQgdG8gaW5wdXQgYW5kIG91dHB1dCB3b3JrIHByb2R1Y3RzLiAgSW5wdXRzIGFyZSBkaWZmZXJlbnRpYXRlZCBpbiBtYW5kYXRvcnkgdmVyc3VzIG9wdGlvbmFsIGlucHV0cy4gIFRoZSBhc3NvY2lhdGlvbnMgdG8gV29yayBQcm9kdWN0cyBhcmUgbm90IGluc3RhbnRpYXRhYmxlL3ZhcmlhYmxlLWxpa2UgcGFyYW1ldGVycy4gIFRoZXkgcmF0aGVyIGV4cHJlc3MgKGh5cGVyLSlsaW5rcyB0byB0aGUgZGVzY3JpcHRpb25zIG9mIHRoZSB3b3JrIHByb2R1Y3RzIHR5cGVzIHRoYXQgYXJlIHJlbGF0ZWQgdG8gdGhlIFRhc2sgYXMgaW5wdXRzIGFuZCBvdXRwdXRzLiAgSW4gb3RoZXIgd29yZHMsIHRoZXNlIGFzc29jaWF0aW9ucyBhcmUgbm90IGludGVuZGVkIHRvIGJlIHVzZWQgdG8gY2FwdHVyZSB3aGljaCBjb25jcmV0ZSBpbnN0YW5jZXMgd2lsbCBiZSBwYXNzZWQgd2hlbiBpbnN0YW50aWF0aW5nIHRoZSBtZXRob2QgaW4gYSBwcm9qZWN0LiAgQWxsIG9mIHRoZSBUYXNrJ3MgZGVmYXVsdCBhc3NvY2lhdGlvbnMgY2FuIGJlIG92ZXJyaWRkZW4gaW4gYW4gYWN0dWFsIHByb2Nlc3MgZGVmaW5pdGlvbi4KLUEgVGFzayBkZXNjcmliZXMgYW4gYXNzaWduYWJsZSB1bml0IG9mIHdvcmsuICBFdmVyeSBUYXNrIGlzIGFzc2lnbmVkIHRvIHNwZWNpZmljIFJvbGVzLiAgVGhlIGdyYW51bGFyaXR5IG9mIGEgVGFzayBpcyBnZW5lcmFsbHkgYSBmZXcgaG91cnMgdG8gYSBmZXcgZGF5cy4gIEl0IHVzdWFsbHkgYWZmZWN0cyBvbmUgb3Igb25seSBhIHNtYWxsIG51bWJlciBvZiB3b3JrIHByb2R1Y3RzLiBBIFRhc2sgaXMgdXNlZCBhcyBhbiBlbGVtZW50IG9mIGRlZmluaW5nIGEgcHJvY2Vzcy4gVGFza3MgYXJlIGZ1cnRoZXIgdXNlZCBmb3IgcGxhbm5pbmcgYW5kIHRyYWNraW5nIHByb2dyZXNzOyB0aGVyZWZvcmUsIGlmIHRoZXkgYXJlIGRlZmluZWQgdG9vIGZpbmUtZ3JhaW5lZCwgdGhleSB3aWxsIGJlIG5lZ2xlY3RlZCwgYW5kIGlmIHRoZXkgYXJlIHRvbyBsYXJnZSwgcHJvZ3Jlc3Mgd291bGQgaGF2ZSB0byBiZSBleHByZXNzZWQgaW4gdGVybXMgb2YgYSBUYXNrJ3MgcGFydHMgKGUuZy4gU3RlcHMsIHdoaWNoIGlzIG5vdCByZWNvbW1lbmRlZCkuIAotQSBUYXNrIGhhcyBhIGNsZWFyIHB1cnBvc2UgaW4gd2hpY2ggdGhlIHBlcmZvcm1pbmcgcm9sZXMgYWNoaWV2ZSBhIHdlbGwgZGVmaW5lZCBnb2FsLiAgSXQgcHJvdmlkZXMgY29tcGxldGUgc3RlcC1ieS1zdGVwIGV4cGxhbmF0aW9ucyBvZiBkb2luZyBhbGwgdGhlIHdvcmsgdGhhdCBuZWVkcyB0byBiZSBkb25lIHRvIGFjaGlldmUgdGhpcyBnb2FsLiAgVGhpcyBkZXNjcmlwdGlvbiBpcyBjb21wbGV0ZSwgaW5kZXBlbmRlbnQgb2Ygd2hlbiBpbiBhIHByb2Nlc3MgbGlmZWN5Y2xlIHRoZSB3b3JrIHdvdWxkIGFjdHVhbGx5IGJlIGRvbmUuICBJdCB0aGVyZWZvcmUgZG9lcyBub3QgZGVzY3JpYmUgd2hlbiB5b3UgZG8gd2hhdCB3b3JrIGF0IHdoYXQgcG9pbnQgb2YgdGltZSwgYnV0IGRlc2NyaWJlcyBhbGwgdGhlIHdvcmsgdGhhdCBnZXRzIGRvbmUgdGhyb3VnaG91dCB0aGUgZGV2ZWxvcG1lbnQgbGlmZWN5Y2xlIHRoYXQgY29udHJpYnV0ZXMgdG8gdGhlIGFjaGlldmVtZW50IG9mIHRoaXMgZ29hbC4gIFdoZW4gdGhlIFRhc2sgaXMgYmVpbmcgYXBwbGllZCBpbiBhIHByb2Nlc3MgdGhlbiB0aGlzIHByb2Nlc3MgYXBwbGljYXRpb24gKGRlZmluZWQgYXMgVGFzayBEZXNjcmlwdG9yKSBwcm92aWRlcyB0aGUgaW5mb3JtYXRpb24gb2Ygd2hpY2ggcGllY2VzIG9mIHRoZSBUYXNrIHdpbGwgYWN0dWFsbHkgYmUgcGVyZm9ybWVkIGF0IGFueSBwYXJ0aWN1bGFyIHBvaW50IGluIHRpbWUuIFRoaXMgYXNzdW1lcyB0aGF0IHRoZSBUYXNrIHdpbGwgYmUgcGVyZm9ybWVkIGluIHRoZSBwcm9jZXNzIG92ZXIgYW5kIG92ZXIgYWdhaW4sIGJ1dCBlYWNoIHRpbWUgd2l0aCBhIHNsaWdodGx5IGRpZmZlcmVudCBlbXBoYXNpcyBvbiBkaWZmZXJlbnQgc3RlcHMgb3IgYXNwZWN0cyBvZiB0aGUgdGFzayBkZXNjcmlwdGlvbi4gCi1Gb3IgZXhhbXBsZSwgYSBUYXNrIHN1Y2ggYXMgIkRldmVsb3AgVXNlIENhc2UgTW9kZWwiIGRlc2NyaWJlcyBhbGwgdGhlIHdvcmsgdGhhdCBuZWVkcyB0byBiZSBkb25lIHRvIGRldmVsb3AgYSBjb21wbGV0ZSB1c2UgY2FzZSBtb2RlbC4gVGhpcyB3b3VsZCBjb21wcmlzZSBvZiB0aGUgaWRlbnRpZmljYXRpb24gYW5kIG5hbWluZyBvZiB1c2UgY2FzZXMgYW5kIGFjdG9ycywgdGhlIHdyaXRpbmcgb2YgYSBicmllZiBkZXNjcmlwdGlvbiwgdGhlIG1vZGVsaW5nIG9mIHVzZSBjYXNlcyBhbmQgdGhlaXIgcmVsYXRpb25zaGlwcyBpbiBkaWFncmFtcywgdGhlIGRldGFpbGVkIGRlc2NyaXB0aW9uIG9mIGEgYmFzaWMgZmxvdywgdGhlIGRldGFpbGVkIGRlc2NyaXB0aW9uIG9mIGFsdGVybmF0aXZlcyBmbG93cywgcGVyZm9ybWluZyBvZiB3YWxrdGhyb3VnaHMgd29ya3Nob3BzIGFuZCByZXZpZXdzLCBldGMuICBBbGwgb2YgdGhlc2UgcGFydHMgY29udHJpYnV0ZSB0byB0aGUgZGV2ZWxvcG1lbnQgZ29hbCBvZiBkZXZlbG9waW5nIHRoZSB1c2UgY2FzZSBtb2RlbCwgYnV0IHRoZSBwYXJ0cyB3aWxsIGJlIHBlcmZvcm1lZCBhdCBkaWZmZXJlbnQgcG9pbnRzIGluIHRpbWUgaW4gYSBwcm9jZXNzLiAgSWRlbnRpZmljYXRpb24sIG5hbWluZywgYW5kIGJyaWVmIGRlc2NyaXB0aW9ucyB3b3VsZCBiZSBwZXJmb3JtZWQgZWFybHkgaW4gYSB0eXBpY2FsIGRldmVsb3BtZW50IHByb2Nlc3MgdmVyc3VzIHRoZSB3cml0aW5nIG9mIGRldGFpbGVkIGFsdGVybmF0aXZlIGZsb3dzIHdoaWNoIHdvdWxkIGJlIHBlcmZvcm1lZCBtdWNoIGxhdGVyLiAgQWxsIHRoZXNlIHBhcnRzIG9yIHN0ZXBzIHdpdGhpbiB0aGUgc2FtZSBUYXNrIGRlZmluZSB0aGUgIm1ldGhvZCIgb2YgRGV2ZWxvcGluZyBhIFVzZSBDYXNlIE1vZGVsLiAgQXBwbHlpbmcgc3VjaCBhIG1ldGhvZCBpbiBhIGxpZmVjeWNsZSAoaS5lLiBpbiBhIHByb2Nlc3MpIGlzIGRlZmluaW5nIHdoaWNoIHN0ZXBzIGFyZSBkb25lIHdoZW4gZ29pbmcgZnJvbSBvbmUgaXRlcmF0aW9uIHRvIHRoZSBuZXh0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6Q29udGVudEVsZW1lbnQiPgotCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJQcmVjb25kaXRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUG9zdGNvbmRpdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJQZXJmb3JtZWRCeSIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJCTx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Ik1hbmRhdG9yeUlucHV0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iT3V0cHV0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQWRkaXRpb25hbGx5UGVyZm9ybWVkQnkiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJPcHRpb25hbElucHV0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iRXN0aW1hdGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJUb29sTWVudG9yIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCTwveHNkOmNob2ljZT4KLQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJXb3JrRGVmaW5pdGlvbiI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BbiBhYnN0cmFjdCBNZXRob2QgRWxlbWVudCB0aGF0IGdlbmVyYWxpemVzIGFsbCBkZXNjcmlwdGlvbnMgb2Ygd29yayB3aXRoaW4gdGhlIFVuaWZpZWQgTWV0aG9kIEFyY2hpdGVjdHVyZS4gIFRoaXMgcGFja2FnZSBpbnRyb2R1Y2VzIHR3byBjb25jcmV0ZSB0eXBlcyBvZiBXb3JrIERlZmluaXRpb25zOiBUYXNrIGFuZCBTdGVwLiAgV29yayBEZWZpbml0aW9ucyBjYW4gY29udGFpbiBzZXRzIG9mIHByZS0gYW5kIHBvc3QtY29uZGl0aW9ucyBkZWZpbmluZyBjb25zdHJhaW50cyB0aGF0IG5lZWQgdG8gYmUgdmFsaWQgYmVmb3JlIHRoZSBkZXNjcmliZWQgd29yayBjYW4gYmVnaW4gb3IgYmVmb3JlIGl0IGNhbiBiZSBkZWNsYXJlZCBhcyBmaW5pc2hlZC4gIE5vdGUgdGhhdCBnZW5lcmFsIG93bmVkUnVsZXMgY2FuIGJlIHVzZWQgdG8gZGVmaW5lIGFkZGl0aW9uYWwgY29uc3RyYWludHMgYW5kIHJ1bGVzIGZvciBXb3JrIERlZmluaXRpb25zLgotV29yayBEZWZpbml0aW9ucyByZXByZXNlbnQgYmVoYXZpb3JhbCBkZXNjcmlwdGlvbnMgZm9yIGRvaW5nIHdvcmsuICBUaGVzZSBiZWhhdmlvcmFsIGRlc2NyaXB0aW9ucyBhcmUgbm90IGJvdW5kIHRvIG9uZSBzcGVjaWZpYyBjbGFzc2lmaWVyLCBidXQgcmVwcmVzZW50IGFuIGFyYml0cmFyeSBkZWZpbml0aW9uIG9mIHdvcmsuICBGb3IgZXhhbXBsZSwgYSBXb3JrIERlZmluaXRpb24gY291bGQgcmVwcmVzZW50IHdvcmsgdGhhdCBpcyBiZWluZyBwZXJmb3JtZWQgYnkgYSBzcGVjaWZpYyBSb2xlIChlLmcuIGEgUm9sZSBwZXJmb3JtaW5nIGEgc3BlY2lmaWMgVGFzayBvciBTdGVwcyBvZiBhIFRhc2spLCBieSBtYW55IFJvbGVzIHdvcmtpbmcgaW4gY2xvc2UgY29sbGFib3JhdGlvbiAobWFueSBSb2xlcyBhbGwgd29ya2luZyB0b2dldGhlciBvbiB0aGUgc2FtZSBpbnRlcmRpc2NpcGxpbmFyeSBUYXNrKSwgb3IgY29tcGxleCB3b3JrIHRoYXQgaXMgcGVyZm9ybWVkIHRocm91Z2hvdXQgdGhlIGxpZmVjeWNsZSAoZS5nLiBhIHByb2Nlc3MgZGVmaW5pbmcgYSBicmVha2Rvd24gc3RydWN0dXJlIGZvciBvcmdhbml6aW5nIGxhcmdlciBjb21wb3NpdGUgdW5pdHMgb2Ygd29yayBwZXJmb3JtZWQgYnkgbWFueSBSb2xlcyB3b3JraW5nIGluIGNvbGxhYm9yYXRpb24pLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6TWV0aG9kRWxlbWVudCI+Ci0JCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlByZWNvbmRpdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJQb3N0Y29uZGl0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJDb250ZW50Q2F0ZWdvcnkiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QW4gYWJzdHJhY3QgY2xhc3MgZ2VuZXJhbGl6aW5nIGNvbnRlbnQgY2F0ZWdvcnkgdHlwZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpDb250ZW50RWxlbWVudCIvPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkRpc2NpcGxpbmUiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBjYXRlZ29yaXphdGlvbiBvZiB3b3JrIChpLmUuIFRhc2tzIGZvciBNZXRob2QgQ29udGVudCksIGJhc2VkIHVwb24gc2ltaWxhcml0eSBvZiBjb25jZXJucyBhbmQgY29vcGVyYXRpb24gb2Ygd29yayBlZmZvcnQuCi1BIGRpc2NpcGxpbmUgaXMgYSBjb2xsZWN0aW9uIG9mIFRhc2tzIHRoYXQgYXJlIHJlbGF0ZWQgdG8gYSBtYWpvciAnYXJlYSBvZiBjb25jZXJuJyB3aXRoaW4gdGhlIG92ZXJhbGwgcHJvamVjdC4gVGhlIGdyb3VwaW5nIG9mIFRhc2tzIGludG8gZGlzY2lwbGluZXMgaXMgbWFpbmx5IGFuIGFpZCB0byB1bmRlcnN0YW5kaW5nIHRoZSBwcm9qZWN0IGZyb20gYSAndHJhZGl0aW9uYWwnIHdhdGVyZmFsbCBwZXJzcGVjdGl2ZS4gSG93ZXZlciwgdHlwaWNhbGx5LCBmb3IgZXhhbXBsZSwgaXQgaXMgbW9yZSBjb21tb24gdG8gcGVyZm9ybSBjZXJ0YWluIHJlcXVpcmVtZW50cyBhY3Rpdml0aWVzIGluIGNsb3NlIGNvb3JkaW5hdGlvbiB3aXRoIGFuYWx5c2lzIGFuZCBkZXNpZ24gYWN0aXZpdGllcy4gU2VwYXJhdGluZyB0aGVzZSBhY3Rpdml0aWVzIGludG8gc2VwYXJhdGUgZGlzY2lwbGluZXMgbWFrZXMgdGhlIGFjdGl2aXRpZXMgZWFzaWVyIHRvIGNvbXByZWhlbmQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpDb250ZW50Q2F0ZWdvcnkiPgotCQkJCTx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iVGFzayIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iU3ViRGlzY2lwbGluZSIgdHlwZT0idW1hOkRpc2NpcGxpbmUiLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlJlZmVyZW5jZVdvcmtmbG93IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJPC94c2Q6Y2hvaWNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkRpc2NpcGxpbmVHcm91cGluZyI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5Vc2VkIHRvIGdyb3VwIERpc2NpcGxpbmVzLiAgRm9yIGV4YW1wbGUsIHRoZSBEaXNjaXBsaW5lIEdyb3VwaW5nICJTb2Z0d2FyZSBEaXNjaXBsaW5lcyIgd291bGQgYmUgdGhlIGdyb3VwIG9mIGFsbCBkaXNjaXBsaW5lcyByZWxhdGVkIHRvIGRldmVsb3Bpbmcgc29mdHdhcmUgc3VjaCBhcyAiUmVxdWlyZW1lbnRzIE1hbmFnZW1lbnQiIG9yICJUZXN0aW5nIjsgIklUIEluZnJhc3RydWN0dXJlIE1hbmFnZW1lbnQiIHdvdWxkIGJlIGEgRGlzY2lwbGluZXMgR3JvdXBpbmcgZm9yIGRpc2NpcGxpbmVzIHN1Y2ggYXMgIklUIE9wZXJhdGlvbmFsIFNlcnZpY2VzIiwgIklUIEN1c3RvbWVyIFJlbGF0aW9uc2hpcHMiLCBvciAiSVQgRW5hYmxpbmcgU2VydmljZXMiLiAgRGlzY2lwbGluZXMgY2FuIGJlIGFzc29jaWF0ZWQgdG8gbW9yZSB0aGFuIG9uZSBEaXNjaXBsaW5lIEdyb3VwaW5nLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6Q29udGVudENhdGVnb3J5Ij4KLQkJCQk8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkRpc2NpcGxpbmUiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iRG9tYWluIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgcmVmaW5lYWJsZSBoaWVyYXJjaHkgZ3JvdXBpbmcgcmVsYXRlZCB3b3JrIHByb2R1Y3RzLiAgSW4gb3RoZXIgd29yZHMsIERvbWFpbnMgY2FuIGJlIGZ1cnRoZXIgZGl2aWRlZCBpbnRvIHN1Yi1kb21haW5zLCB3aXRoIHdvcmsgcHJvZHVjdCBlbGVtZW50cyB0byBiZSBjYXRlZ29yaXplZCBvbmx5IGF0IHRoZSBsZWFmLWxldmVsIG9mIHRoaXMgaGllcmFyY2h5LgotRG9tYWluIGlzIGEgbG9naWNhbCBncm91cGluZyBvZiB3b3JrIHByb2R1Y3RzIHRoYXQgaGF2ZSBhbiBhZmZpbml0eSB0byBlYWNoIG90aGVyIGJhc2VkIG9uIHJlc291cmNlcywgdGltaW5nLCBvciByZWxhdGlvbnNoaXAuICBBIERvbWFpbiBtYXkgYmUgZGl2aWRlZCBpbnRvIHN1YmRvbWFpbnMuICBGb3IgZXhhbXBsZSwgR1MgTWV0aG9kIHVzZXMgc2l4IHByZWRlZmluZWQgRG9tYWlucyBmb3IgV29yayBQcm9kdWN0czogQXBwbGljYXRpb24sIEFyY2hpdGVjdHVyZSwgQnVzaW5lc3MsIEVuZ2FnZW1lbnQsIE9wZXJhdGlvbnMgYW5kIE9yZ2FuaXphdGlvbi48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkNvbnRlbnRDYXRlZ29yeSI+Ci0JCQkJPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJXb3JrUHJvZHVjdCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iU3ViZG9tYWluIiB0eXBlPSJ1bWE6RG9tYWluIi8+Ci0JCQkJPC94c2Q6Y2hvaWNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlJvbGVTZXQiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+T3JnYW5pemVzIFJvbGVzIGludG8gY2F0ZWdvcmllcy4gIEl0IGlzIHVzZWQgdG8gZ3JvdXAgcm9sZXMgdG9nZXRoZXIgdGhhdCBoYXZlIGNlcnRhaW4gY29tbW9uYWxpdGllcy4gIEZvciBleGFtcGxlLCB0aGUgIkFuYWx5c3RzIiBSb2xlIFNldCBjb3VsZCBncm91cCB0aGUgIkJ1c2luZXNzIFByb2Nlc3MgQW5hbHlzdCIsICJTeXN0ZW0gQW5hbHlzdCIsIGFzIHdlbGwgYXMgIlJlcXVpcmVtZW50cyBTcGVjaWZpZXIiIHJvbGVzLiAgQWxsIG9mIHRoZXNlIHdvcmsgd2l0aCBzaW1pbGFyIHRlY2huaXF1ZXMgYW5kIGhhdmUgb3ZlcmxhcHBpbmcgc2tpbGxzLCBidXQgYXJlIHJlcXVpcmVkIGFzIGRpc3RpbmN0IHJvbGVzIGZvciBhIG1ldGhvZCAoZS5nLiB0aGUgbWV0aG9kIHRoZSBJQk0gUmF0aW9uYWwgVW5pZmllZCBQcm9jZXNzIGlzIGJhc2VkIG9uKS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkNvbnRlbnRDYXRlZ29yeSI+Ci0JCQkJPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJSb2xlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJPC94c2Q6Y2hvaWNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlJvbGVTZXRHcm91cGluZyI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5Sb2xlIFNldHMgY2FuIGJlIGNhdGVnb3JpemVkIGludG8gUm9sZSBTZXQgR3JvdXBpbmdzLiAgRm9yIGV4YW1wbGUsIGRpZmZlcmVudCBtZXRob2RzIG1pZ2h0IGRlZmluZSBzaW1pbGFyIFJvbGUgU2V0cywgd2hpY2ggaG93ZXZlciBuZWVkIHRvIGJlIGRpc3Rpbmd1aXNoZWQgZnJvbSBlYWNoIG90aGVyIG9uIGEgZ2xvYmFsIHNjYWxlLiAgVGh1cywgUm9sZSBTZXQgR3JvdXBpbmdzIGFsbG93IGRpc3Rpbmd1aXNoaW5nLCBmb3IgZXhhbXBsZSwgU29mdHdhcmUgU2VydmljZXMgTWFuYWdlciBSb2xlIFNldHMgZnJvbSBTb2Z0d2FyZSBEZXZlbG9wbWVudCBPcmdhbml6YXRpb24gTWFuYWdlciBSb2xlIFNldHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpDb250ZW50Q2F0ZWdvcnkiPgotCQkJCTx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUm9sZVNldCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCTwveHNkOmNob2ljZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJUb29sIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgY29udGFpbmVyL2FnZ3JlZ2F0ZSBmb3IgVG9vbE1lbnRvcnMuICBJdCBjYW4gYWxzbyBwcm92aWRlIGdlbmVyYWwgZGVzY3JpcHRpb25zIG9mIHRoZSB0b29sIGFuZCBpdHMgZ2VuZXJhbCBjYXBhYmlsaXRpZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpDb250ZW50Q2F0ZWdvcnkiPgotCQkJCTx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iVG9vbE1lbnRvciIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCTwveHNkOmNob2ljZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJXb3JrUHJvZHVjdFR5cGUiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzZWNvbmQgY2F0ZWdvcnkgZm9yIHdvcmsgcHJvZHVjdHMsIHdoaWNoIGluIGNvbnRyYXN0IHRvIERvbWFpbiBpcyBtb3JlIHByZXNlbnRhdGlvbiBvcmllbnRlZC4gIEEgd29yayBwcm9kdWN0IGNhbiBoYXZlIG1hbnkgV29yayBQcm9kdWN0IFR5cGVzLiAgRXhhbXBsZXMsIGZvciBhIFdvcmsgUHJvZHVjdCBUeXBlIGlzICJDbGFzcyBEaWFncmFtIiwgd2hpY2ggY2F0ZWdvcml6ZXMgdGhlIEFydGlmYWN0cyBBbmFseXNpcyBNb2RlbCwgRGVzaWduIE1vZGVsLCBVc2VyIEV4cGVyaWVuY2UgTW9kZWwsIG9yICJTcGVjaWZpY2F0aW9uIiwgd2hpY2ggY2F0ZWdvcml6ZXMgcmVxdWlyZW1lbnRzIHNwZWNpZmljYXRpb25zIHRoYXQgZGVmaW5lIGEgc3lzdGVtIHdpdGggYSB3ZWxsLWRlZmluZWQgc3lzdGVtIGJvdW5kYXJ5LCBzdWNoIGFzIHVzZSBjYXNlIG9yIGZ1bmN0aW9uYWwgcmVxdWlyZW1lbnRzIHNwZWNpZmljYXRpb24uICBBIFdvcmsgUHJvZHVjdCBjYW4gYmUgY2F0ZWdvcml6ZWQgdG8gYmUgb2YgbWFueSBXb3JrIFByb2R1Y3QgVHlwZXMuICBGb3IgZXhhbXBsZSwgYSB1c2UgY2FzZSBtb2RlbCBjYW4gYmUgY2F0ZWdvcml6ZWQgYXMgYSBTcGVjaWZpY2F0aW9uIGFzIHdlbGwgYXMgRGlhZ3JhbSBXb3JrIFByb2R1Y3QgVHlwZS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkNvbnRlbnRDYXRlZ29yeSI+Ci0JCQkJPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJXb3JrUHJvZHVjdCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCTwveHNkOmNob2ljZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJDdXN0b21DYXRlZ29yeSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIGNhdGVnb3J5IGludHJvZHVjZWQgYnkgYSBtZXRob2QgY29udGVudCBhdXRob3IgdG8gc3RydWN0dXJlIGFueSBudW1iZXIgb2YgbWV0aG9kIENvbnRlbnQgRWxlbWVudHMgb2YgYW55IHN1YnR5cGUgYmFzZWQgb24gdXNlci1kZWZpbmVkIGNyaXRlcmlhLiAgQmVjYXVzZSBDb250ZW50IENhdGVnb3JpZXMgKGFuZCB0aGVyZWZvcmUgQ3VzdG9tIENhdGVnb3JpZXMsIHRvbykgYXJlIENvbnRlbnQgRWxlbWVudHMgdGhlbXNlbHZlcywgQ3VzdG9tIENhdGVnb3JpZXMgY2FuIGJlIHVzZWQgdG8gcmVjdXJzaXZlbHkgY2F0ZWdvcml6ZSBDb250ZW50IENhdGVnb3JpZXMgYXMgd2VsbC4gIEN1c3RvbSBDYXRlZ29yaWVzIGNhbiBhbHNvIGJlIG5lc3RlZCB3aXRoIGFueSBDb250ZW50IENhdGVnb3J5LiAgQ3VzdG9tIGNhdGVnb3JpZXMgY2FuIGJlIHVzZWQgdG8gY2F0ZWdvcml6ZSBjb250ZW50IGJhc2VkIG9uIHRoZSB1c2VyJ3MgY3JpdGVyaWEgYXMgd2VsbCBhcyB0byBkZWZpbmUgd2hvbGUgdHJlZS1zdHJ1Y3R1cmVzIG9mIG5lc3RlZCBjYXRlZ29yaWVzIGFsbG93aW5nIHRoZSB1c2VyIHRvIHN5c3RlbWF0aWNhbGx5IG5hdmlnYXRlIGFuZCBicm93c2UgbWV0aG9kIGNvbnRlbnQgYW5kIHByb2Nlc3NlcyBiYXNlZCBvbiB0aGVzZSBjYXRlZ29yaWVzLiAgRm9yIGV4YW1wbGUsIG9uZSBjb3VsZCBjcmVhdGUgYSBjdXN0b20gY2F0ZWdvcnkgdG8gbG9naWNhbGx5IG9yZ2FuaXplIGNvbnRlbnQgcmVsZXZhbnQgZm9yIHRoZSB1c2VyJ3MgZGV2ZWxvcG1lbnQgb3JnYW5pemF0aW9uIGRlcGFydG1lbnRzOyBlLmcuIGEgIlRlc3RpbmciIGNhdGVnb3J5IHRoYXQgZ3JvdXBzIHRvZ2V0aGVyIGFsbCByb2xlcywgd29yayBwcm9kdWN0cywgdGFza3MsIGFuZCBndWlkYW5jZSBlbGVtZW50IHJlbGV2YW50IHRvIHRlc3RpbmcuICBBbm90aGVyIGV4YW1wbGUgd291bGQgYmUgY2F0ZWdvcmllcyB0aGF0IGV4cHJlc3MgbGljZW5zaW5nIGxldmVscyBvZiB0aGUgY29udGVudCBncm91cGluZyBmcmVlbHkgZGlzdHJpYnV0YWJsZSBtZXRob2QgY29udGVudCB2ZXJzdXMgY29udGVudCB0aGF0IHJlcHJlc2VudCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgYW5kIHJlcXVpcmVzIGEgbGljZW5zZSB0byBiZSBwdXJjaGFzZWQgdG8gYmUgYWJsZSB0byB1c2UgaXQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpDb250ZW50Q2F0ZWdvcnkiPgotCQkJCTx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQ2F0ZWdvcml6ZWRFbGVtZW50IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJTdWJDYXRlZ29yeSIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCTwveHNkOmNob2ljZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJNZXRob2RQYWNrYWdlIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkFuIGFic3RyYWN0IGNsYXNzIGZvciBwYWNrYWdpbmcgTWV0aG9kIEVsZW1lbnRzLiAgQWxsIE1ldGhvZCBFbGVtZW50cyBzaGFsbCBiZSBsb2NhdGVkIGluIGV4YWN0bHkgb25lIG9mIE1ldGhvZCBQYWNrYWdlJ3MgY29uY3JldGUgc3BlY2lhbGl6YXRpb25zIChlLmcuIENvbnRlbnQgUGFja2FnZSkuICAgTWV0aG9kIFBhY2thZ2UgZGVmaW5lcyBjb21tb24gcHJvcGVydGllcyBmb3IgYWxsIG9mIGl0cyBzcGVjaWFsaXphdGlvbnMuIEVsZW1lbnRzIGFyZSBvcmdhbml6ZWQgaW4gTWV0aG9kIFBhY2thZ2VzIHRvIHN0cnVjdHVyZSBsYXJnZSBzY2FsZSBvZiBtZXRob2QgY29udGVudCBhbmQgcHJvY2Vzc2VzIGFzIHdlbGwgYXMgdG8gZGVmaW5lIGEgbWVjaGFuaXNtIGZvciByZXVzZS4gIE1ldGhvZCBFbGVtZW50cyBmcm9tIG9uZSBwYWNrYWdlIGNhbiByZXVzZSBlbGVtZW50IGZyb20gb3RoZXIgcGFja2FnZXMgYnkgZGVmaW5pbmcgYSByZXVzZWRQYWNrYWdlcyBsaW5rLiAgRm9yIGV4YW1wbGUsIGEgd29yayBwcm9kdWN0IGRlZmluZWQgaW4gb25lIHBhY2thZ2UgY2FuIGJlIHVzZWQgYXMgYW4gaW5wdXQgZm9yIFRhc2tzIGRlZmluZWQgaW4gb3RoZXIgcGFja2FnZXMuICBCeSByZXVzaW5nIGl0IGZyb20gb25lIGNvbW1vbiBwbGFjZSAoaS5lLiB0aGUgcGFja2FnZSBpbiB3aGljaCBpdCBoYXMgYmVlbiBkZWZpbmVkKSBlbnN1cmVzIHRoYXQgbm8gcmVkdW5kYW50IGRlZmluaXRpb25zIG9mIHRoZSBzYW1lIGVsZW1lbnRzIGFyZSByZXF1aXJlZC4gIEFsc28gbWFpbnRlbmFuY2Ugb2YgbWV0aG9kIGNvbnRlbnQgaXMgZ3JlYXRseSBpbXByb3ZlZCBhcyBjaGFuZ2VzIGNhbiBiZSBwZXJmb3JtZWQgaW4gb25seSBvbmUgcGxhY2UuICBOb3RlLCB0aGF0IG90aGVyIHBhY2thZ2VzIHdpbGwgaW50cm9kdWNlIG1vcmUgc3BlY2lhbGl6YXRpb25zIG9mIE1ldGhvZCBQYWNrYWdlLCBlLmcuIFByb2Nlc3MgUGFja2FnZSBhbmQgUHJvY2VzcyBDb21wb25lbnQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpNZXRob2RFbGVtZW50Ij4KLQkJCQk8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlJldXNlZFBhY2thZ2UiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Ik1ldGhvZFBhY2thZ2UiIHR5cGU9InVtYTpNZXRob2RQYWNrYWdlIi8+Ci0JCQkJPC94c2Q6Y2hvaWNlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9Imdsb2JhbCIgdHlwZT0ieHNkOmJvb2xlYW4iPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+TWV0aG9kIFBhY2thZ2VzIGNhbiBoYXZlIGEgZ2xvYmFsIHNjb3BlLiAgVGhpcyBtZWFucyB0aGF0IGV2ZXJ5IGVsZW1lbnQgb2YgZXZlcnkgb3RoZXIgTWV0aG9kIFBhY2thZ2UgY2FuIHNlZSB0aGUgZ2xvYmFsIHBhY2thZ2UncyBjb250ZW50cy4gIEdsb2JhbCBNZXRob2QgUGFja2FnZXMgYXJlIHByaW1hcmlseSB1c2VkIHRvIHN0b3JlIGNvbW1vbmx5IHVzZWQgY2F0ZWdvcnkgZGVmaW5pdGlvbnMgc3VjaCBhcyBmb3IgRGlzY2lwbGluZXMgb3IgRG9tYWlucywgd2hpY2ggYXJlIHVzZWQgYnkgbWFueSBUYXNrIGFuZCBXb3JrIFByb2R1Y3RzIHJlc3BlY3RpdmVseS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJDb250ZW50UGFja2FnZSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpYWwgTWV0aG9kIFBhY2thZ2UgdGhhdCBjb250YWlucyBDb250ZW50IEVsZW1lbnRzIGFuZCBDb250ZW50IEVsZW1lbnRzLCBvbmx5LiAgRXhhbXBsZXMgZm9yIENvbnRlbnQgRWxlbWVudCBhcmUgQXJ0aWZhY3RzLCBUYXNrcywgUm9sZXMsIGV0Yy4gIEEga2V5IHNlcGFyYXRpb24gb2YgY29uY2VybnMgaW4gVU1BIGlzIHRoZSBkaXN0aW5jdGlvbiBiZXR3ZWVuIE1ldGhvZCBDb250ZW50IGFuZCBQcm9jZXNzLiAgVGhpcyBzZXBhcmF0aW9uIGlzIGVuZm9yY2VkIGJ5IHNwZWNpYWwgcGFja2FnZSB0eXBlcywgd2hpY2ggZG8gbm90IGFsbG93IHRoZSBtaXhpbmcgb2YgbWV0aG9kIGNvbnRlbnQgd2l0aCBwcm9jZXNzZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpNZXRob2RQYWNrYWdlIj4KLQkJCQk8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkNvbnRlbnRFbGVtZW50IiB0eXBlPSJ1bWE6Q29udGVudEVsZW1lbnQiLz4KLQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iQ29udGVudENhdGVnb3J5UGFja2FnZSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpYWwgTWV0aG9kIFBhY2thZ2UgdGhhdCBvbmx5IGNvbnRhaW5zIENvbnRlbnQgQ2F0ZWdvcnkgRWxlbWVudHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpNZXRob2RQYWNrYWdlIj4KLQkJCQk8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkNvbnRlbnRDYXRlZ29yeSIgdHlwZT0idW1hOkNvbnRlbnRDYXRlZ29yeSIvPgotCQkJCTwveHNkOmNob2ljZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJQcm9jZXNzRWxlbWVudCI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIERlc2NyaWJhYmxlIEVsZW1lbnQgdGhhdCByZXByZXNlbnRzIGFuIGFic3RyYWN0IGdlbmVyYWxpemF0aW9uIGZvciBhbGwgZWxlbWVudHMgZGVmaW5lZCBpbiB0aGUgUHJvY2VzcyBwYWNrYWdlLgotUHJvY2VzcyBFbGVtZW50cyByZXByZXNlbnRzIFByb2Nlc3Mgc3BlY2lmaWMgZWxlbWVudHMgdGhhdCBhcmUgc3VwcG9zZWQgdG8gYmUgbWFuYWdlZCBpbiBQcm9jZXNzIFBhY2thZ2VzLiAgVGhlIHNlcGFyYXRpb24gb2YgUHJvY2VzcyBFbGVtZW50IGZyb20gQ29udGVudCBFbGVtZW50IGFsbG93cyB0byBjbGVhcmx5IGRpc3Rpbmd1aXNoIGJldHdlZW4gcHVyZSBtZXRob2QgY29udGVudCBmcm9tIGNvbnRlbnQgdGhhdCBpcyByZXByZXNlbnRlZCBpbiBwcm9jZXNzZXMuIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6RGVzY3JpYmFibGVFbGVtZW50Ii8+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUGxhbm5pbmdEYXRhIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgUHJvY2VzcyBFbGVtZW50IHRoYXQgYWRkcyBwbGFubmluZyBkYXRhIHRvIEJyZWFrZG93biBFbGVtZW50cyB3aGVuIGl0IGlzIHVzZWQgZm9yIGEgUHJvY2VzcyBQbGFubmluZyBUZW1wbGF0ZS4gIEZvciBEZWxpdmVyeSBQcm9jZXNzZXMgYW5kIENhcGFiaWxpdHkgUGF0dGVybnMgdGhpcyBjbGFzcyBjYW4gZWl0aGVyIG5vdCBiZSBpbnN0YW50aWF0ZWQgb3IgcG9wdWxhdGVkIHdpdGggZGVmYXVsdCBkYXRhLgotUGxhbm5pbmcgRGF0YSBmYWN0b3JzIG91dCBzcGVjaWZpYyBvcHRpb25hbCBkYXRhIG5lZWRlZCBmb3IgcmVwcmVzZW50aW5nIHBsYW5uaW5nIHRlbXBsYXRlcy4gIFRoaXMgYXNzb2NpYXRpb24gYWxsb3dzIHRvIGFjY2VzcyBwbGFubmluZyBkYXRhIGlmIGl0IGlzIHN0b3JlZCBmb3IgdGhlIEJyZWFrZG93biBFbGVtZW50LgotKE5PVEUsIFRIRSBBVFRSSUJVVEVTIEZPUiBUSElTIENMQVNTIEFSRSBOT1QgQ09NUExFVEUsIFlFVCk8L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOlByb2Nlc3NFbGVtZW50Ij4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzdGFydERhdGUiIHR5cGU9InhzZDpkYXRlVGltZSI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZGVmYXVsdCBzdGFydCBkYXRlIGZvciBhIHBsYW5lZCBUYXNrLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImZpbmlzaERhdGUiIHR5cGU9InhzZDpkYXRlVGltZSI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZGVmYXVsdCBmaW5pc2ggZGF0ZSBmb3IgYSBwbGFuZWQgVGFzay48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJyYW5rIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBkZWZhdWx0IHJhbmsgZm9yIGEgcGxhbmVkIFRhc2suPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iQnJlYWtkb3duRWxlbWVudCI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BbiBhYnN0cmFjdCBnZW5lcmFsaXphdGlvbiBmb3IgYW55IHR5cGUgb2YgTWV0aG9kIEVsZW1lbnQgdGhhdCBpcyBwYXJ0IG9mIGEgYnJlYWtkb3duIHN0cnVjdHVyZS4gIEl0IGRlZmluZXMgYSBzZXQgb2YgcHJvcGVydGllcyBhdmFpbGFibGUgdG8gYWxsIG9mIGl0cyBzcGVjaWFsaXphdGlvbnMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpQcm9jZXNzRWxlbWVudCI+Ci0JCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlByZXNlbnRlZEFmdGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlByZXNlbnRlZEJlZm9yZSIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJQbGFubmluZ0RhdGEiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iU3VwZXJBY3Rpdml0eSIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0icHJlZml4IiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlByZWZpeCByZXByZXNlbnRzIGFuIGFkZGl0aW9uYWwgbGFiZWwgdGhhdCB3aWxsIGJlIHByZXNlbnRlZCBhcyBhIHByZWZpeCB0byBhbnkgQnJlYWtkb3duIEVsZW1lbnQgdG8gaW5kaWNhdGUgYSB1c2VyLWRlZmluZWQgc3ViLXR5cGUgZm9yIHRoZSBlbGVtZW50LiAgRm9yIGV4YW1wbGUsIGlmIHRoZSBwcm9jZXNzIGVuZ2luZWVyIHdvdWxkIGxpa2UgdG8gZGlzdGluZ3Vpc2ggaGlzIEFjdGl2aXRpZXMgYnkgJ01vZHVsZScgKGFzIGRvbmUgaW4gdGhlIElCTSBSYXRpb25hbCBTdW1taXQgQXNjZW5kYW50IE1ldGhvZCksIGhlIGNhbiBkZWZpbmUgYSBkaWZmZXJlbnQgcHJlZml4IGZvciBldmVyeSBtb2RlbCB0byBiZSB1c2VkIGluIGFkZGl0aW9uIHRvIG5hbWluZyBBY3Rpdml0aWVzLCBlLmcuICJTUkEuRXN0YWJsaXNoIFJlcXVpcmVtZW50cyIgd2l0aCBTUkEgaW5kaWNhdGluZyB0aGF0IHRoaXMgQWN0aXZpdHkgYmVsb25ncyB0byB0aGUgIlNvZnR3YXJlIFJlcXVpcmVtZW50cyBBbmFseXNpcyIgbW9kdWxlLiAgQW5vdGhlciBjb21tb24gYXBwbGljYXRpb24gZm9yIHByZWZpeCBpcyB0byBxdWFsaWZ5IHJvbGVzIGluIFJvbGUgRGVzY3JpcHRvcnMuICBGb3IgZXhhbXBsZSwgIkN1c3RvbWVyLkFyY2hpdGVjdCIgd291bGQgZGVmaW5lIGEgIkN1c3RvbWVyIiBwcmVmaXggZm9yIHRoZSBSb2xlIERlc2NyaXB0b3IgIkFyY2hpdGVjdCIgZXhwcmVzc2luZyB0aGF0IHRoaXMgaXMgYW4gYXJjaGl0ZWN0IG9uIHRoZSBjdXN0b21lciBzaWRlIGFuZCBub3QgdGhlIGRldmVsb3BtZW50IHRlYW0gc2lkZS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpc1BsYW5uZWQiIHR5cGU9InhzZDpib29sZWFuIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEga2V5IGFwcGxpY2F0aW9uIGZvciBEZXZlbG9wbWVudCBQcm9jZXNzZXMgZXhwcmVzc2VkIHdpdGggQnJlYWtkb3duIHN0cnVjdHVyZXMgaXMgdG8gZ2VuZXJhdGUgYSBwcm9qZWN0IHBsYW4gZnJvbSBpdC4gIEEgcHJvY2VzcyBhcyBkZWZpbmVkIGluIFVNQSAoY2YuIHdpdGggU2VjdGlvbnMgWFggYW5kIDUuMikgaXMgYSBtdWx0aS1kaW1lbnNpb25hbCBzdHJ1Y3R1cmUgZGVmaW5pbmcgd2hhdCB3b3JrIGlzIGJlaW5nIHBlcmZvcm1lZCBhdCB3aGF0IHRpbWUgYnkgd2hpY2ggcm9sZXMgdXNpbmcgd2hpY2ggaW5wdXQgYW5kIHByb2R1Y2luZyB3aGF0IG91dHB1dHMuICBBIHByb2plY3QgcGxhbiBhcyBpdCBpcyByZXByZXNlbnRlZCBpbiBwcm9qZWN0IHBsYW5uaW5nIHRvb2xzIHN1Y2ggYXMgSUJNIFJhdGlvbmFsIFBvcnRmb2xpbyBNYW5hZ2VyIG9yIE1pY3Jvc29mdCBQcm9qZWN0IG5vcm1hbGx5IGRvZXMgbm90IG5lZWQgYWxsIHRoaXMgaW5mb3JtYXRpb24gYW5kIGlzIG5vcm1hbGx5IGxpbWl0ZWQgdG8ganVzdCByZXByZXNlbnRpbmcgYSBzdWJzZXQuICBGb3IgZXhhbXBsZSwgYSB0eXBpY2FsIE1TIFByb2plY3QgcGxhbiBvbmx5IHJlcHJlc2VudHMgdGhlIHdvcmsgYnJlYWtkb3duIGNvbnNpc3Rpbmcgb2YgVGFza3MgYW5kIEFjdGl2aXRpZXMgKHNvbWV0aW1lcyByZWZlcnJlZCB0byBhcyBzdW1tYXJ5IHRhc2tzKS4gIEl0IGRvZXMgbm90IHNob3cgdGhlIGlucHV0IGFuZCBvdXRwdXQgV29yayBQcm9kdWN0cyBmb3IgYSBUYXNrLCBidXQgaXQgY2FuIHNob3cgd2hpY2ggcm9sZXMgc2hhbGwgYmUgc3RhZmZlZCBmb3IgcGVyZm9ybWluZyB0aGUgVGFzay4gIEhvd2V2ZXIsIHN1Y2ggcm9sZSBhbGxvY2F0aW9uIG5lZWQgdG8gYmUgcmVwbGFjZWQgd2l0aCBjb25jcmV0ZSByZXNvdXJjZXMgd2hlbiBpbnN0YW50aWF0aW5nIHRoZSBwbGFuIGZvciBhIGNvbmNyZXRlIHByb2plY3QuICBTb21ldGltZXMgcHJvamVjdCBwbGFucyBjYW4gdGhlbiBhZ2FpbiBiZSBvcmdhbml6ZWQgZGlmZmVyZW50bHkgYnkgb3JnYW5pemluZyB3b3JrIGJ5IGRlbGl2ZXJhYmxlcyBpbiB3aGljaCBXb3JrIFByb2R1Y3RzIGFyZSBtYXBwZWQgdG8gdGhlIHBsYW4ncyBzdW1tYXJ5IHRhc2tzIGFuZCBUYXNrIHRoYXQgaGF2ZSB0aGVzZSB3b3JrIHByb2R1Y3RzIGFzIG91dHB1dCBtYXBwZWQgYmVsb3cgc3VjaCBhcyBzdW1tYXJ5IHRhc2suICBUaGVyZWZvcmUsIGEgcHJvY2VzcyBjYW4gbWFrZSByZWNvbW1lbmRhdGlvbnMgYWJvdXQgd2hpY2ggZWxlbWVudHMgdG8gaW5jbHVkZSBhbmQgd2hpY2ggdG8gZXhjbHVkZSB3aGVuIGdlbmVyYXRpbmcgYSBwbGFuLiAgV2hlbiB0aGUgaXNQbGFubmVkIGF0dHJpYnV0ZSBpcyBzZXQgdG8gRmFsc2UgZm9yIGFuIGluc3RhbmNlIG9mIGEgQnJlYWtkb3duIEVsZW1lbnQsIHRoZW4gdGhpcyBlbGVtZW50IHNoYWxsIG5vdCBiZSBub3QgaW5jbHVkZWQgd2hlbiBhIGNvbmNyZXRlIHByb2plY3QgcGxhbiBpcyBiZWluZyBnZW5lcmF0ZWQgZnJvbSB0aGUgYnJlYWtkb3duIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zIHRoaXMgZWxlbWVudC4KLTwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9Imhhc011bHRpcGxlT2NjdXJyZW5jZXMiIHR5cGU9InhzZDpib29sZWFuIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkp1c3QgYXMgdGhlIGlzUGxhbm5lZCBhdHRyaWJ1dGUgdGhlIGhhc011bHRpcGxlT2NjdXJyZW5jZXMgYXR0cmlidXRlIGhhcyBhbiBpbXBhY3Qgb24gZ2VuZXJhdGluZyBwbGFucyBmcm9tIGEgUHJvY2Vzcy4gIFdoZW4gdGhpcyBhdHRyaWJ1dGUgaXMgc2V0IHRvIFRydWUgZm9yIGEgQnJlYWtkb3duIEVsZW1lbnQgdGhlbiBpdCB3aWxsIHR5cGljYWxseSBvY2N1ciBtdWx0aXBsZSB0aW1lcyB3aXRoaW4gdGhlIHNhbWUgQWN0aXZpdHkuICBGb3IgZXhhbXBsZSwgYSBUYXNrIHN1Y2ggYXMgIkRldGFpbCBVc2UgQ2FzZSIgd291bGQgYmUgcGVyZm9ybWVkIGZvciBldmVyeSB1c2UgY2FzZSBpZGVudGlmaWVkIGZvciBhIHBhcnRpY3VsYXIgSXRlcmF0aW9uIG9yIEFjdGl2aXR5LiAgR2VuZXJhdGluZyBhIHBsYW4gd291bGQgbGlzdCBvbmUgVGFzayBpbnN0YW5jZSBwZXIgdXNlIGNhc2UuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0iaXNPcHRpb25hbCIgdHlwZT0ieHNkOmJvb2xlYW4iPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+SW5kaWNhdGVzIHRoYXQgdGhlIEJyZWFrZG93biBFbGVtZW50IGRlc2NyaWJlcyB3b3JrLCBhIHdvcmsgcmVzdWx0LCBvciBldmVuIHdvcmsgcmVzb3VyY2VzLCB3aGljaCBpbmNsdXNpb24gaXMgbm90IG1hbmRhdG9yeSB3aGVuIHBlcmZvcm1pbmcgYSBwcm9qZWN0IHRoYXQgaXMgcGxhbm5lZCBiYXNlZCBvbiBhIHByb2Nlc3MgY29udGFpbmluZyB0aGlzIGVsZW1lbnQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iV29ya09yZGVyIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPlJlcHJlc2VudHMgYSByZWxhdGlvbnNoaXAgYmV0d2VlbiB0d28gQnJlYWtkb3duIEVsZW1lbnRzIGluIHdoaWNoIG9uZSBCcmVha2Rvd24gRWxlbWVudHMgZGVwZW5kcyBvbiB0aGUgc3RhcnQgb3IgZmluaXNoIG9mIGFub3RoZXIgQnJlYWtkb3duIEVsZW1lbnRzIGluIG9yZGVyIHRvIGJlZ2luIG9yIGVuZC4gIAotVGhlIFdvcmsgT3JkZXIgY2xhc3MgZGVmaW5lcyBwcmVkZWNlc3NvciBhbmQgc3VjY2Vzc29yIHJlbGF0aW9ucyBhbW9uZ3N0IEJyZWFrZG93biBFbGVtZW50cy4gIFRoaXMgaW5mb3JtYXRpb24gaXMgaW4gcGFydGljdWxhciBjcml0aWNhbCBmb3IgcGxhbm5pbmcgYXBwbGljYXRpb25zLiAgU2VlIG1vcmUgZGV0YWlscyBvbiBkaWZmZXJlbnQgdHlwZXMgb2YgV29yayBPcmRlciByZWxhdGlvbnNoaXBzIGF0IFdvcmsgT3JkZXIgVHlwZS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgZ2xvYmFsIHVuaXF1ZSBpZCBmb3IgYSB3b3JrIG9yZGVyLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImxpbmtUeXBlIiB0eXBlPSJ1bWE6V29ya09yZGVyVHlwZSI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGlzIGF0dHJpYnV0ZSBleHByZXNzZXMgdGhlIHR5cGUgb2YgdGhlIFdvcmsgT3JkZXIgcmVsYXRpb25zaGlwIGJ5IGFzc2lnbmluZyBhIHZhbHVlIGZyb20gdGhlIFdvcmsgT3JkZXIgVHlwZSBlbnVtZXJhdGlvbi48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6c2ltcGxlQ29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IldvcmtCcmVha2Rvd25FbGVtZW50Ij4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lhbCBCcmVha2Rvd24gRWxlbWVudCB0aGF0IHByb3ZpZGVzIHNwZWNpZmljIHByb3BlcnRpZXMgZm9yIEJyZWFrZG93biBFbGVtZW50cyB0aGF0IHJlcHJlc2VudCBvciByZWZlciB0byBXb3JrIERlZmluaXRpb25zLiAgRm9yIGV4YW1wbGUgaXRzIHN1YmNsYXNzIEFjdGl2aXR5IGRlZmluZXMgd29yayBhcyBpdCBpcyBhbHNvIGEgc3ViY2xhc3Mgb2YgV29yayBEZWZpbml0aW9uLiAgSXRzIHN1YmNsYXNzIFRhc2sgRGVzY3JpcHRvciBkb2VzIG5vdCBkZWZpbmUgd29yayBieSBpdHNlbGYsIGJ1dCByZWZlcnMgdG8gYSBXb3JrIERlZmluaXRpb24gYW5kIHRoZXJlZm9yZSBjYW4gaGF2ZSB0aGUgc2FtZSBjb21tb24gcHJvcGVydGllcyBhbmQgV29yayBCcmVha2Rvd24gRWxlbWVudCBoYXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpCcmVha2Rvd25FbGVtZW50Ij4KLQkJCQk8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlByZWRlY2Vzc29yIiB0eXBlPSJ1bWE6V29ya09yZGVyIi8+Ci0JCQkJPC94c2Q6Y2hvaWNlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImlzUmVwZWF0YWJsZSIgdHlwZT0ieHNkOmJvb2xlYW4iPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+VGhpcyBhdHRyaWJ1dGUgaXMgdXNlZCB0byBkZWZpbmUgcmVwZXRpdGlvbiBvZiB3b3JrLCBlLmcuIGl0ZXJhdGlvbnMuICBBIFByb2Nlc3MgV29yayBEZWZpbml0aW9uIHdpdGggdGhpcyBhdHRyaWJ1dGUgc2V0IHRvIFRydWUgc2hhbGwgYmUgcmVwZWF0ZWQgbW9yZSB0aGFuIG9uY2Ugb24gdGhlIHNhbWUgc2V0IG9mIGFydGlmYWN0cy4gIEZvciBleGFtcGxlLCBmb3IgYW4gaW5zdGFuY2Ugb2YgSXRlcmF0aW9uIChkZWZpbmVkIGFzIGEgc3BlY2lhbCBQcm9jZXNzIFdvcmsgRGVmaW5pdGlvbiBiZWxvdykgdGhpcyBhdHRyaWJ1dGUgaXMgc2V0IHRvIFRydWUgYnkgZGVmYXVsdCBpbmRpY2F0aW5nIHRoYXQgZXZlcnkgc3ViLUFjdGl2aXR5IHdpbGwgYmUgcmVwZWF0ZWQgbW9yZSB0aGFuIG9uY2UuICBIb3dldmVyLCBhbnkgUHJvY2VzcyBXb3JrIERlZmluaXRpb24gY2FuIHNldCB0aGlzIGF0dHJpYnV0ZSB0byBUcnVlIHRvIGRlZmluZSBpdGVyYXRpb25zIChlLmcuIHRvIGl0ZXJhdGUgb25lIEFjdGl2aXR5IGNvbnNpc3Rpbmcgb2YgbWFueSBzdWItYWN0aXZpdGllcyBvciBldmVuIFBoYXNlcywgYnV0IHRvIGl0ZXJhdGUganVzdCBvbmUgVGFzaykuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0iaXNPbmdvaW5nIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5JZiB0aGUgaXNPbmdvaW5nIGF0dHJpYnV0ZSBpcyBzZXQgdG8gVHJ1ZSBmb3IgYSBQcm9jZXNzIFdvcmsgRGVmaW5pdGlvbiBpbnN0YW5jZSwgdGhlbiB0aGUgZWxlbWVudCBkZXNjcmliZXMgYW4gb25nb2luZyBwaWVjZSBvZiB3b3JrIHdpdGhvdXQgYSBmaXhlZCBkdXJhdGlvbiBvciBlbmQgc3RhdGUuICBGb3IgZXhhbXBsZSwgdGhlIFByb2Nlc3MgV29yayBEZWZpbml0aW9uIGNvdWxkIHJlcHJlc2VudCB3b3JrIG9mIGFuIGFkbWluaXN0cmF0b3IgY29udGludW91c2x5IChlLmcuIDNoIGEgZGF5KSB3b3JraW5nIHRvIGVuc3VyZSB0aGF0IHN5c3RlbXMgYXJlIGtlcHQgaW4gYSBjZXJ0YWluIHN0YXRlLiAgQW5vdGhlciBleGFtcGxlIHdvdWxkIGJlIHByb2dyYW0gbWFuYWdlbWVudCB3b3JrIG92ZXJzZWVpbmcgbWFueSBkaWZmZXJlbnQgcHJvamVjdHMgYmVpbmcgc2NoZWR1bGVkIGZvciBvbmUgcGFydGljdWxhciBwcm9qZWN0IGF0IHNwZWNpZmljIHJlb2NjdXJyaW5nIGludGVydmFscyBkdXJpbmcgdGhlIHdob2xlIGxpZmVjeWNsZSBvZiB0aGUgcHJvamVjdC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpc0V2ZW50RHJpdmVuIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgaXNFdmVudERyaXZlbiBhdHRyaWJ1dGUgaW5kaWNhdGVzIHRoYXQgdGhlIFByb2Nlc3MgV29yayBEZWZpbml0aW9uIGRlc2NyaWJlcyBhbiBpbnN0YW5jZSBvZiB3b3JrIHdoaWNoIGlzIG5vdCBzdGFydGVkIGJlY2F1c2UgaXQgaGFzIGJlZW4gc2NoZWR1bGVkIHRvIHN0YXJ0IGF0IGEgY2VydGFpbiBwb2ludCBvZiB0aW1lLCBiZWNhdXNlIHByZWNlZGluZyB3b3JrIGlzIGJlaW5nIGNvbXBsZXRlZCwgb3IgaW5wdXQgd29yayBwcm9kdWN0cyBhcmUgYXZhaWxhYmxlLCBidXQgYmVjYXVzZSBhbm90aGVyIHNwZWNpZmljIGV2ZW50IGhhcyBvY2N1cnJlZC4gIEV4YW1wbGVzIGZvciBzdWNoIGV2ZW50cyBhcmUgZXhjZXB0aW9ucyBvciBwcm9ibGVtIHNpdHVhdGlvbnMgd2hpY2ggcmVxdWlyZSBzcGVjaWZpYyB3b3JrIHRvIGJlIHBlcmZvcm1lZCBhcyBhIHJlc3VsdC4gIEFsc28gY2hhbmdlIG1hbmFnZW1lbnQgd29yayBjYW4gYmUgbW9kZWxlZCBhcyBldmVudCBkcml2ZW4gd29yayBhbmFseXppbmcgYSBjaGFuZ2UgcmVxdWVzdCBvciBkZWZlY3QgYW5kIGFsbG9jYXRpbmcgd29yayBkeW5hbWljYWxseSB0byByZXNvdXJjZXMgdG8gZGVhbCB3aXRoIGl0IGZvbGxvd2luZyB0aGUgd29yayBkZXNjcmliZWQgd2l0aCBzdWNoIFByb2Nlc3MgV29yayBEZWZpbml0aW9uLiAgVGhlIGV2ZW50cyB0aGVtc2VsdmVzIGFyZSBub3QgbW9kZWxlZCBpbiB0aGlzIHZlcnNpb24gb2YgdGhlIHNwZWNpZmljYXRpb24uICBUaGV5IHNoYWxsIGJlIGRlc2NyaWJlZCBhcyBwYXJ0IG9mIHRoZSBub3JtYWwgZGVzY3JpcHRpb25zIGZpZWxkcyBhdmFpbGFibGUuCi08L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJNaWxlc3RvbmUiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWFsIEJyZWFrZG93biBFbGVtZW50IHRoYXQgZGVzY3JpYmVzIGEgc2lnbmlmaWNhbnQgZXZlbnQgaW4gYSBkZXZlbG9wbWVudCBwcm9qZWN0LCBzdWNoIGFzIGEgbWFqb3IgZGVjaXNpb24sIGNvbXBsZXRpb24gb2YgYSBkZWxpdmVyYWJsZSwgb3IgbWVldGluZyBvZiBhIG1ham9yIGRlcGVuZGVuY3kgKGxpa2UgY29tcGxldGlvbiBvZiBhIHByb2plY3QgcGhhc2UpLiAgQmVjYXVzZSwgTWlsZXN0b25lIGlzIGNvbW1vbmx5IHVzZWQgdG8gcmVmZXIgdG8gYm90aCB0aGUgZXZlbnQgaXRzZWxmIGFuZCB0aGUgcG9pbnQgaW4gdGltZSBhdCB3aGljaCB0aGUgZXZlbnQgaXMgc2NoZWR1bGVkIHRvIGhhcHBlbiwgaXQgaXMgbW9kZWxlZCBhcyBhIEJyZWFrZG93biBFbGVtZW50IChpLmUuIGl0IGFwcGVhcnMgYXMgcGFydCBvZiBhIGJyZWFrZG93biBzdHJ1Y3R1cmUpLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6V29ya0JyZWFrZG93bkVsZW1lbnQiLz4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJBY3Rpdml0eSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIFdvcmsgQnJlYWtkb3duIEVsZW1lbnQgYW5kIFdvcmsgRGVmaW5pdGlvbiB3aGljaCBzdXBwb3J0cyB0aGUgbmVzdGluZyBhbmQgbG9naWNhbCBncm91cGluZyBvZiByZWxhdGVkIEJyZWFrZG93biBFbGVtZW50cyBmb3JtaW5nIGJyZWFrZG93biBzdHJ1Y3R1cmVzLiAgQWx0aG91Z2ggQWN0aXZpdHkgaXMgYSBjb25jcmV0ZSBtZXRhLWNsYXNzLCBvdGhlciBjbGFzc2VzIHdoaWNoIHJlcHJlc2VudCBicmVha2Rvd24gc3RydWN0dXJlcyBkZXJpdmUgZnJvbSBpdDsgc3VjaCBhcyBQaGFzZSwgSXRlcmF0aW9uLCBEZWxpdmVyeSBQcm9jZXNzLCBvciBDYXBhYmlsaXR5IFBhdHRlcm4uCi1BY3Rpdml0eSByZXByZXNlbnRzIGEgZ3JvdXBpbmcgZWxlbWVudCBmb3Igb3RoZXIgQnJlYWtkb3duIEVsZW1lbnRzIHN1Y2ggYXMgQWN0aXZpdGllcywgRGVzY3JpcHRvcnMsIE1pbGVzdG9uZXMsIGV0Yy4gIEl0IGlzIG5vdCBwZXItc2UgYSAnaGlnaC1sZXZlbCcgZ3JvdXBpbmcgb2Ygb25seSB3b3JrIGFzIGluIG90aGVyIG1ldGEtbW9kZWxzLCBidXQgZ3JvdXBzIGFueSBraW5kIG9mIEJyZWFrZG93biBFbGVtZW50cy4gIEZvciBleGFtcGxlLCBvbmUgY2FuIGRlZmluZSB2YWxpZCBBY3Rpdml0aWVzIHRoYXQgZ3JvdXAgb25seSBXb3JrIFByb2R1Y3RzIERlc2NyaXB0b3JzIHdpdGhvdXQgYW55IG1hdGNoaW5nIFRhc2sgRGVzY3JpcHRvcnMuICBBY3Rpdml0aWVzIGFsc28gaW5oZXJpdCBhbGwgcHJvcGVydGllcyBmcm9tIFdvcmsgQnJlYWtkb3duIEVsZW1lbnQgYW5kIGluZGlyZWN0bHkgZnJvbSBQcm9jZXNzIEVsZW1lbnQ7IGkuZS4gQWN0aXZpdHkgaXMgcmVhZHkgdG8gaGF2ZSBhIGZ1bGwgY29udGVudCBkZXNjcmlwdGlvbiBhdHRhY2hlZCB0byBpdC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOldvcmtCcmVha2Rvd25FbGVtZW50Ij4KLQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUHJlY29uZGl0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlBvc3Rjb25kaXRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotCQkJCQk8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJCcmVha2Rvd25FbGVtZW50IiB0eXBlPSJ1bWE6QnJlYWtkb3duRWxlbWVudCIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkNoZWNrbGlzdCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkNvbmNlcHQiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJFeGFtcGxlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iR3VpZGVsaW5lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUm9hZG1hcCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlJldXNhYmxlQXNzZXQiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJTdXBwb3J0aW5nTWF0ZXJpYWwiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJXaGl0ZXBhcGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCTwveHNkOmNob2ljZT4KLQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ2YXJpYWJpbGl0eVR5cGUiIHR5cGU9InVtYTpWYXJpYWJpbGl0eVR5cGUiLz4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0iSXNFbmFjdGFibGUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUGhhc2UiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWFsIEFjdGl2aXR5IHdoaWNoIHByZXNjcmliZXMgcHJlLWRlZmluZWQgdmFsdWVzIGZvciBpdHMgaW5zdGFuY2VzIGZvciB0aGUgYXR0cmlidXRlcyBwcmVmaXggKCdQaGFzZScpIGFuZCBpc1JlcGVhdGFibGUgKCdGYWxzZScpLiAgSXQgaGFzIGJlZW4gaW5jbHVkZWQgaW50byB0aGUgbWV0YS1tb2RlbCBmb3IgY29udmVuaWVuY2UgYW5kIHRvIHByb3ZpZGUgYSBzcGVjaWFsIHN0ZXJlb3R5cGUsIGJlY2F1c2UgaXQgcmVwcmVzZW50cyBhIHZlcnkgY29tbW9ubHkgdXNlZCBBY3Rpdml0eSB0eXBlLgotUGhhc2UgcmVwcmVzZW50IGEgc2lnbmlmaWNhbnQgcGVyaW9kIGluIGEgcHJvamVjdCwgZW5kaW5nIHdpdGggbWFqb3IgbWFuYWdlbWVudCBjaGVja3BvaW50LCBtaWxlc3RvbmUgb3Igc2V0IG9mIERlbGl2ZXJhYmxlcy4gIEl0IGlzIGluY2x1ZGVkIGluIHRoZSBtb2RlbCBhcyBhIHByZWRlZmluZWQgc3BlY2lhbCBBY3Rpdml0eSwgYmVjYXVzZSBvZiBpdHMgc2lnbmlmaWNhbmNlIGluIGRlZmluaW5nIGJyZWFrZG93bnMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpBY3Rpdml0eSIvPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ikl0ZXJhdGlvbiI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpYWwgQWN0aXZpdHkgd2hpY2ggcHJlc2NyaWJlcyBwcmUtZGVmaW5lZCB2YWx1ZXMgZm9yIGl0cyBpbnN0YW5jZXMgZm9yIHRoZSBhdHRyaWJ1dGVzIHByZWZpeCAoJ0l0ZXJhdGlvbicpIGFuZCBpc1JlcGVhdGFibGUgKCdUcnVlJykuICBJdCBoYXMgYmVlbiBpbmNsdWRlZCBpbnRvIHRoZSBtZXRhLW1vZGVsIGZvciBjb252ZW5pZW5jZSBhbmQgdG8gcHJvdmlkZSBhIHNwZWNpYWwgc3RlcmVvdHlwZSwgYmVjYXVzZSBpdCByZXByZXNlbnRzIGEgdmVyeSBjb21tb25seSB1c2VkIEFjdGl2aXR5IHR5cGUuCi1JdGVyYXRpb24gZ3JvdXBzIGEgc2V0IG9mIG5lc3RlZCBBY3Rpdml0aWVzIHRoYXQgYXJlIHJlcGVhdGVkIG1vcmUgdGhhbiBvbmNlLiAgSXQgcmVwcmVzZW50cyBhbiBpbXBvcnRhbnQgc3RydWN0dXJpbmcgZWxlbWVudCB0byBvcmdhbml6ZSB3b3JrIGluIHJlcGV0aXRpdmUgY3ljbGVzLiAgVGhlIGNvbmNlcHQgb2YgSXRlcmF0aW9uIGNhbiBiZSBhc3NvY2lhdGVkIHdpdGggZGlmZmVyZW50IHJ1bGVzIGluIGRpZmZlcmVudCBtZXRob2RzLiAgRm9yIGV4YW1wbGUsIHRoZSBJQk0gUmF0aW9uYWwgVW5pZmllZCBQcm9jZXNzIG1ldGhvZCBmcmFtZXdvcmsgKFJVUCkgZGVmaW5lcyBhIHJ1bGUgdGhhdCBJdGVyYXRpb25zIGFyZSBub3QgYWxsb3dlZCB0byBzcGFuIGFjcm9zcyBQaGFzZXMuICBJbiBjb250cmFzdCBJQk0gR2xvYmFsIFNlcnZpY2VzIE1ldGhvZCAoR1NNZXRob2QpIGJhc2VkIG1ldGhvZCBmcmFtZXdvcmtzIHRoaXMgcnVsZSBkb2VzIG5vdCBhcHBseSBhbmQgSXRlcmF0aW9uIGNhbiBiZSBkZWZpbmVkIHdoaWNoIG5lc3QgUGhhc2VzLiAgUnVsZXMgbGlrZSB0aGVzZSwgd2hpY2ggcGxheSBhbiBpbXBvcnRhbnQgcm9sZSBmb3IgZWFjaCBpbmRpdmlkdWFsIG1ldGhvZCBhbmQgYXJlIHRoZXJlZm9yZSBub3QgZW5mb3JjZWQgYnkgdGhpcyBtZXRhLW1vZGVsLiAgSW5zdGVhZCwgcHJvY2VzcyBhdXRob3JzIGFyZSBleHBlY3RlZCB0byBmb2xsb3cgYW5kIGNoZWNrIHRoZXNlIHJ1bGVzIG1hbnVhbGx5LiAgKE5vdGU6IEFueSBCcmVha2Rvd24gRWxlbWVudCBjYW4gYmUgcmVwZWF0ZWQ7IGhvd2V2ZXIsIEl0ZXJhdGlvbnMgaGFzIGJlZW4gaW50cm9kdWNlZCBhcyBhIHNwZWNpYWwgbWV0YS1tb2RlbCBjb25jZXB0LCBiZWNhdXNlIG9mIGl0cyBpbXBvcnRhbnQgcm9sZSBmb3IgbWFueSBtZXRob2RzLik8L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkFjdGl2aXR5Ii8+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgZ2VuZXJhbGl6ZWQgQ29udGVudCBEZXNjcmlwdGlvbiB0aGF0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIHRleHR1YWwgZGVzY3JpcHRpb24gZm9yIGEgQnJlYWtkb3duIEVsZW1lbnQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpDb250ZW50RGVzY3JpcHRpb24iPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9InVzYWdlR3VpZGFuY2UiIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+UHJvdmlkZXMgaW5mb3JtYXRpb24gYW5kIGd1aWRhbmNlIG9uIHRoZSBtZWFuaW5nIG9mIHRoZSBCb29sZWFuIGZsYWcgdmFsdWVzIGFuZCB1bmRlciB3aGF0IGNpcmN1bXN0YW5jZXMgdGhleSBzaG91bGQgYmUgb3ZlcnJpZGRlbi4gRm9yIGV4YW1wbGUsIGl0IGRlc2NyaWJlcyB3aHkgdGhlIGJyZWFrZG93biBlbGVtZW50IGlzIG9wdGlvbmFsIG9yIGNvbnNpZGVyYXRpb25zIGZvciByZXBlYXRpbmcgaXQgYW5kIGRpZmZlcmVuY2VzIGluIHRoZSBpbmRpdmlkdWFsIG9jY3VycmVuY2VzIG9mIHRoaXMgQnJlYWtkb3duIEVsZW1lbnQgYWNyb3NzIHRoZSBsaWZlY3ljbGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iQWN0aXZpdHlEZXNjcmlwdGlvbiI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIGdlbmVyYWxpemVkIEJyZWFrZG93biBFbGVtZW50IERlc2NyaXB0aW9uIHRoYXQgaXMgdXNlZCB0byBzdG9yZSB0aGUgdGV4dHVhbCBkZXNjcmlwdGlvbiBmb3IgYW4gQWN0aXZpdHkuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24iPgotCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJBbHRlcm5hdGl2ZXMiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkNvbXByaXNlcyBvZiBzdW1tYXJpZXMgZGVzY3JpYmluZyBpbXBvcnRhbnQgZXhjZXB0aW9uYWwgYW5kIG5vbi1zdGFuZGFyZCB3YXlzIG9mIGRvaW5nIHRoZSB3b3JrIG9mIHRoaXMgQWN0aXZpdHkgbm90IGNvdmVyZWQgYnkgdGhlIEFjdGl2aXR5J3MgVGFza3MuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJIb3dUb1N0YWZmIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5Qcm92aWRlcyBiYWNrZ3JvdW5kIG9uIHdobyBzaG91bGQgYmUgaW52b2x2ZWQgaW4gdGhpcyBhY3Rpdml0eSB3aGF0IGFyZSB0aGUgcmVxdWlyZWQgc2tpbGxzLCBleHBlcmllbmNlLCAgYW5kIHBlcmhhcHMgYXR0aXR1ZGVzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUHVycG9zZSIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+U3VtbWFyaXplcyB0aGUgbWFpbiByZWFzb24gZm9yIHBlcmZvcm1pbmcgdGhpcyBBY3Rpdml0eSwgZGVzY3JpYmVzIHdoYXQgdGhlIGFjdGl2aXR5IGFzIGEgd2hvbGUgaXMgaW50ZW5kZWQgdG8gYWNoaWV2ZS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJEZXNjcmlwdG9yRGVzY3JpcHRpb24iPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBnZW5lcmFsaXplZCBCcmVha2Rvd24gRWxlbWVudCBEZXNjcmlwdGlvbiB0aGF0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIHRleHR1YWwgZGVzY3JpcHRpb24gZm9yIGEgRGVzY3JpcHRvci48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbiI+Ci0JCQkJPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIj4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlJlZmluZWREZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgRGVzY3JpcHRvciBtaWdodCBhZGQgcmVmaW5lbWVudHMgdG8gdGhlIG1haW4gZGVzY3JpcHRpb24gb2YgdGhlIENvbnRlbnQgRWxlbWVudCBpdCByZWZlcnMgdG8uICBGb3IgZXhhbXBsZSwgaXQgY291bGQgcHJvdmlkZSBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGFib3V0IGEgV29yayBQcm9kdWN0IHJlbGV2YW50IGZvciB0aGUgc3BlY2lmaWMgcG9pbnQgaW4gdGltZSBpbiB0aGUgcHJvY2VzcyB0aGlzIFdvcmsgUHJvZHVjdCB0eXBlIGlzIGJlaW5nIHVzZWQuICBJdCBjb3VsZCBkZXNjcmliZSBhZGRpdGlvbmFsIHNraWxscyBuZWVkZWQgZm9yIGEgUm9sZSBhdCB0aGF0IHBhcnRpY3VsYXIgcG9pbnQgaW4gdGltZSBpbiBhIHByb2Nlc3MsIGV0Yy4gPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJPC94c2Q6Y2hvaWNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlByb2Nlc3NEZXNjcmlwdGlvbiI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIGdlbmVyYWxpemVkIEFjdGl2aXR5IERlc2NyaXB0aW9uIHRoYXQgaXMgdXNlZCB0byBzdG9yZSB0aGUgdGV4dHVhbCBkZXNjcmlwdGlvbiBmb3IgYSBQcm9jZXNzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6QWN0aXZpdHlEZXNjcmlwdGlvbiI+Ci0JCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlNjb3BlIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIHRoZSBzY29wZSBvZiB0aGUgUHJvY2VzcywgaS5lLiB3aGljaCB0eXBlcyBvZiBwcm9qZWN0cyBkb2VzIGl0IGFkZHJlc3MgYW5kIHdoaWNoIG5vdC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlVzYWdlTm90ZXMiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkFueSBhZGRpdGlvbmFsIG5vdGVzIG9uIGhvdyB0byBhcHBseSBhbmQgaW5zdGFudGlhdGUgdGhpcyBwcm9jZXNzIGZvciBhIHByb2plY3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24iPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBnZW5lcmFsaXplZCBQcm9jZXNzIERlc2NyaXB0aW9uIHRoYXQgaXMgdXNlZCB0byBzdG9yZSB0aGUgdGV4dHVhbCBkZXNjcmlwdGlvbiBmb3IgYSBEZWxpdmVyeSBQcm9jZXNzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6UHJvY2Vzc0Rlc2NyaXB0aW9uIj4KLQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iU2NhbGUiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPk91dGxpbmVzIGNoYXJhY3RlcmlzdGljcyBhYm91dCB0aGUgc2l6ZSBvZiBhIHR5cGljYWwgcHJvamVjdCB0aGF0IHBlcmZvcm1zIHRoaXMgcHJvamVjdCBleHByZXNzZWQgaW4gdGVhbSBzaXplLCBtYW4geWVhcnMsIGV0Yy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlByb2plY3RDaGFyYWN0ZXJpc3RpY3MiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkNoYXJhY3Rlcml6ZXMgdGhlIHByb2plY3QgdGhhdCB3b3VsZCB0eXBpY2FsbHkgcGVyZm9ybSB0aGlzIFByb2Nlc3M8L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlJpc2tMZXZlbCIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+T3V0bGluZXMgdHlwaWNhbCBwcm9qZWN0IHJpc2tzIHRoYXQgYXJlIGFkZHJlc3NlZCB3aXRoIHRoaXMgcHJvY2Vzcy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkVzdGltYXRpbmdUZWNobmlxdWUiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkRlc2NyaWJlcyB0aGUgRXN0aW1hdGlvbiBUZWNobmlxdWVzIHByb3ZpZGVkIGZvciB0aGlzIFByb2Nlc3MuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJQcm9qZWN0TWVtYmVyRXhwZXJ0aXNlIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5Qcm92aWRlcyBhIHByb2ZpbGUgb2YgYSB0eXBpY2FsIHByb2plY3QgdGVhbSwgdGhlIGRpc3RyaWJ1dGlvbiBvZiByb2xlcywgc2tpbGxzIHJlcXVpcmVkIGZvciBhIHRlYW0gcGVyZm9ybXMgYSBwcm9qZWN0IGJhc2VkIG9uIHRoaXMgcHJvY2Vzcy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlR5cGVPZkNvbnRyYWN0IiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5Qcm92aWRlcyBiYWNrZ3JvdW5kIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjb0knbSBjaGFJJ20gbnRyYWN0cyB0aGF0IG5lZWQgdG8gYmUgZXN0YWJsaXNoZWQgYmV0d2VlbiBhIHByb2plY3QgdGVhbSB0aGF0IHBlcmZvcm1zIHRoaXMgcHJvY2VzcyBhbmQgYSBjbGllbnQgKGUuZy4gZm9yIGFuIElHUyBlbmdhZ2VtZW50KS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJEZXNjcmlwdG9yIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkFuIGFic3RyYWN0IGdlbmVyYWxpemF0aW9uIGZvciBzcGVjaWFsIEJyZWFrZG93biBFbGVtZW50cyB0aGF0IHJlZmVyZW5jZXMgb25lIGNvbmNyZXRlIENvbnRlbnQgRWxlbWVudC4gIEEgZGVzY3JpcHRvciBwcm92aWRlcyBhIHJlcHJlc2VudGF0aW9uIG9mIGEgQ29udGVudCBFbGVtZW50IHdpdGhpbiBicmVha2Rvd24gc3RydWN0dXJlcy4gIEluIGFkZGl0aW9uIHRvIGp1c3QgcmVmZXJlbmNpbmcgQ29udGVudCBFbGVtZW50cyBpdCBhbGxvd3Mgb3ZlcnJpZGluZyB0aGUgQ29udGVudCBFbGVtZW50cyBzdHJ1Y3R1cmFsIHJlbGF0aW9uc2hpcHMgYnkgZGVmaW5pbmcgaXRzIG93biBzZXRzIG9mIGFzc29jaWF0aW9ucy4KLURlc2NyaXB0b3JzIGFyZSB0aGUga2V5IGNvbmNlcHQgZm9yIHJlYWxpemluZyB0aGUgc2VwYXJhdGlvbiBvZiBwcm9jZXNzZXMgZnJvbSBtZXRob2QgY29udGVudC4gIEEgRGVzY3JpcHRvciBjYW4gYmUgY2hhcmFjdGVyaXplZCBhcyBhIHJlZmVyZW5jZSBvYmplY3QgZm9yIG9uZSBwYXJ0aWN1bGFyIENvbnRlbnQgRWxlbWVudCwgd2hpY2ggaGFzIGl0cyBvd24gcmVsYXRpb25zaGlwcyBhbmQgcHJvcGVydGllcy4gIFdoZW4gYSBEZXNjcmlwdG9yIGlzIGNyZWF0ZWQgaXQgc2hhbGwgYmUgcHJvdmlkZWQgd2l0aCBjb25ncnVlbnQgY29waWVzIG9mIHRoZSByZWxhdGlvbnNoaXBzIGRlZmluZWQgZm9yIHRoZSByZWZlcmVuY2VkIGNvbnRlbnQgZWxlbWVudC4gIEhvd2V2ZXIsIGEgdXNlciBjYW4gbW9kaWZ5IHRoZXNlIHJlbGF0aW9uc2hpcHMgZm9yIHRoZSBwYXJ0aWN1bGFyIHByb2Nlc3Mgc2l0dWF0aW9uIGZvciB3aGljaCB0aGUgZGVzY3JpcHRvciBoYXMgYmVlbiBjcmVhdGVkLiA8L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkJyZWFrZG93bkVsZW1lbnQiPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImlzU3luY2hyb25pemVkV2l0aFNvdXJjZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJXb3JrUHJvZHVjdERlc2NyaXB0b3IiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWFsIERlc2NyaXB0b3IgdGhhdCByZXByZXNlbnRzIGEgV29yayBQcm9kdWN0IGluIHRoZSBjb250ZXh0IG9mIG9uZSBzcGVjaWZpYyBBY3Rpdml0eS4gIEV2ZXJ5IGJyZWFrZG93biBzdHJ1Y3R1cmUgY2FuIGRlZmluZSBkaWZmZXJlbnQgcmVsYXRpb25zaGlwcyBvZiBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvcnMgdG8gVGFzayBEZXNjcmlwdG9ycyBhbmQgUm9sZSBEZXNjcmlwdG9ycy4gIFRoZXJlZm9yZSBvbmUgV29yayBQcm9kdWN0IGNhbiBiZSByZXByZXNlbnRlZCBieSBtYW55IFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9ycyBlYWNoIHdpdGhpbiB0aGUgY29udGV4dCBvZiBhbiBBY3Rpdml0eSB3aXRoIGl0cyBvd24gc2V0IG9mIHJlbGF0aW9uc2hpcHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpEZXNjcmlwdG9yIj4KLQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iV29ya1Byb2R1Y3QiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUmVzcG9uc2libGVSb2xlIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQkJPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iRXh0ZXJuYWxJbnB1dFRvIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iSW1wYWN0ZWRCeSIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkltcGFjdHMiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJNYW5kYXRvcnlJbnB1dFRvIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iT3B0aW9uYWxJbnB1dFRvIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iT3V0cHV0RnJvbSIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkRlbGl2ZXJhYmxlUGFydHMiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJPC94c2Q6Y2hvaWNlPgotCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImFjdGl2aXR5RW50cnlTdGF0ZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5HaXZlbiB0aGF0IGFuIGluc3RhbmNlIG9mIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9yIGhhcyBiZWVuIGNyZWF0ZWQgZm9yIGEgc3BlY2lmaWMgQWN0aXZpdHksIHRoZW4gdGhlIEFjdGl2aXR5IEVudHJ5IFN0YXRlIGF0dHJpYnV0ZSBzcGVjaWZpZXMgdGhlIGRlc2lyZWQgc3RhdGUgb2YgaW5zdGFuY2VzIG9mIHRoZSByZWZlcmVuY2VkIFdvcmsgUHJvZHVjdCB3aGVuIHdvcmsgb24gdGhlIEFjdGl2aXR5IGlzIGluaXRpYXRlZCAoaS5lLiB3b3JrIG9uIHRoZSBBY3Rpdml0eSdzIFRhc2sgRGVzY3JpcHRvcnMgaXMgYmVpbmcgaW5pdGlhdGVkIHRoYXQgdXNlIHRoaXMgV29yayBQcm9kdWN0IERlc2NyaXB0b3IgYXMgaW5wdXQpLiAgCi1Gb3Igc29tZSBXb3JrIFByb2R1Y3RzIHN0YXRlIGlzIGV4cHJlc3NlZCBpbiBwZXJjZW50YWdlIG9mIGNvbXBsZXRpb24sIGNvbXBsaWFuY2UgdG8gd29yayBwcm9kdWN0IGNoZWNrbGlzdCwgaW5mb3JtYWwgc3RhdGUgZGVzY3JpcHRpb25zLCBldGMuICBPdGhlcnMgaGF2ZSB2ZXJ5IHNwZWNpZmljIHN0YXRlcyBleHByZXNzZWQgYXMgZW51bWVyYXRpb25zIHN1Y2ggYXMgW2lkZW50aWZpZWQsIGJyaWVmbHkgZGVzY3JpYmVkLCBvdXRsaW5lZCwgZGV0YWlsZWRdIGZvciB1c2UgY2FzZXMuICBPdGhlciBXb3JrIFByb2R1Y3Qgc3RhdGVzIHJlbGF0ZSB0byBzb21lIHF1YWxpdHkgbWVhc3VyZXMgb3IgbGlmZWN5Y2xlIHN0YXRlcyBzdWNoIGFzIFtyZXZpZXdlZCwgaW1wbGVtZW50ZWQsIHRlc3RlZF0uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWN0aXZpdHlFeGl0U3RhdGUiIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+R2l2ZW4gdGhhdCBhbiBpbnN0YW5jZSBvZiBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvciBoYXMgYmVlbiBjcmVhdGVkIGZvciBhIHNwZWNpZmljIEFjdGl2aXR5LCB0aGVuIHRoZSBBY3Rpdml0eSBFeGlzdCBTdGF0ZSBhdHRyaWJ1dGUgc3BlY2lmaWVzIHRoZSBkZXNpcmVkIHN0YXRlIG9mIGluc3RhbmNlcyBvZiB0aGUgcmVmZXJlbmNlZCBXb3JrIFByb2R1Y3Qgd2hlbiB3b3JrIG9uIHRoZSBBY3Rpdml0eSBpcyBmaW5pc2hlZCAoaS5lLiB3b3JrIG9uIHRoZSBBY3Rpdml0eSdzIFRhc2sgRGVzY3JpcHRvcnMgaGFzIGZpbmlzaGVkIHRoYXQgaGF2ZSB0aGlzIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9yIGFzIG91dHB1dCkuCi1Gb3Igc29tZSBXb3JrIFByb2R1Y3RzIHN0YXRlIGlzIGV4cHJlc3NlZCBpbiBwZXJjZW50YWdlIG9mIGNvbXBsZXRpb24sIGNvbXBsaWFuY2UgdG8gd29yayBwcm9kdWN0IGNoZWNrbGlzdCwgaW5mb3JtYWwgc3RhdGUgZGVzY3JpcHRpb25zLCBldGMuICBPdGhlcnMgaGF2ZSB2ZXJ5IHNwZWNpZmljIHN0YXRlcyBleHByZXNzZWQgYXMgZW51bWVyYXRpb25zIHN1Y2ggYXMgW2lkZW50aWZpZWQsIGJyaWVmbHkgZGVzY3JpYmVkLCBvdXRsaW5lZCwgZGV0YWlsZWRdIGZvciB1c2UgY2FzZXMuICBPdGhlciBXb3JrIFByb2R1Y3Qgc3RhdGVzIHJlbGF0ZSB0byBzb21lIHF1YWxpdHkgbWVhc3VyZXMgb3IgbGlmZWN5Y2xlIHN0YXRlcyBzdWNoIGFzIFtyZXZpZXdlZCwgaW1wbGVtZW50ZWQsIHRlc3RlZF0uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUm9sZURlc2NyaXB0b3IiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWFsIERlc2NyaXB0b3IgdGhhdCByZXByZXNlbnRzIGEgUm9sZSBpbiB0aGUgY29udGV4dCBvZiBvbmUgc3BlY2lmaWMgQWN0aXZpdHkuICBFdmVyeSBicmVha2Rvd24gc3RydWN0dXJlIGNhbiBkZWZpbmUgZGlmZmVyZW50IHJlbGF0aW9uc2hpcHMgb2YgUm9sZSBEZXNjcmlwdG9ycyB0byBUYXNrIERlc2NyaXB0b3JzIGFuZCBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvcnMuICBUaGVyZWZvcmUgb25lIFJvbGUgY2FuIGJlIHJlcHJlc2VudGVkIGJ5IG1hbnkgUm9sZSBEZXNjcmlwdG9ycyBlYWNoIHdpdGhpbiB0aGUgY29udGV4dCBvZiBhbiBBY3Rpdml0eSB3aXRoIGl0cyBvd24gc2V0IG9mIHJlbGF0aW9uc2hpcHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpEZXNjcmlwdG9yIj4KLQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUm9sZSIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJSZXNwb25zaWJsZUZvciIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlRhc2tEZXNjcmlwdG9yIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lhbCBEZXNjcmlwdG9yIHRoYXQgcmVwcmVzZW50cyBhIHByb3h5IGZvciBhIFRhc2sgaW4gdGhlIGNvbnRleHQgb2Ygb25lIHNwZWNpZmljIEFjdGl2aXR5LiAgRXZlcnkgYnJlYWtkb3duIHN0cnVjdHVyZSBjYW4gZGVmaW5lIGRpZmZlcmVudCByZWxhdGlvbnNoaXBzIG9mIFRhc2sgRGVzY3JpcHRvcnMgdG8gV29yayBQcm9kdWN0IERlc2NyaXB0b3JzIGFuZCBSb2xlIERlc2NyaXB0b3JzLiBUaGVyZWZvcmUgb25lIFRhc2sgY2FuIGJlIHJlcHJlc2VudGVkIGJ5IG1hbnkgVGFzayBEZXNjcmlwdG9ycyBlYWNoIHdpdGhpbiB0aGUgY29udGV4dCBvZiBhbiBBY3Rpdml0eSB3aXRoIGl0cyBvd24gc2V0IG9mIHJlbGF0aW9uc2hpcHMuCi1BIGtleSBkaWZmZXJlbmNlIGJldHdlZW4gTWV0aG9kIENvbnRlbnQgYW5kIFByb2Nlc3MgaXMgdGhhdCBhIENvbnRlbnQgRWxlbWVudCBzdWNoIGFzIFRhc2sgZGVzY3JpYmVzIGFsbCBhc3BlY3RzIG9mIGRvaW5nIHdvcmsgZGVmaW5lZCBhcm91bmQgdGhpcyBUYXNrLiAgVGhpcyBkZXNjcmlwdGlvbiBpcyBtYW5hZ2VkIGluIHN0ZXBzLCB3aGljaCBhcmUgbW9kZWxlZCBhcyBTZWN0aW9ucyBvZiB0aGUgVGFza3MnIENvbnRlbnQgRGVzY3JpcHRpb25zLiAgV2hlbiBhcHBseWluZyBhIFRhc2sgaW4gYSBQcm9jZXNzJyBBY3Rpdml0eSB3aXRoIGEgVGFzayBEZXNjcmlwdG9yIGEgUHJvY2VzcyBFbmdpbmVlciBuZWVkcyB0byBpbmRpY2F0ZSB0aGF0IGF0IHRoYXQgcGFydGljdWxhciBwb2ludCBpbiB0aW1lIGluIHRoZSBQcm9jZXNzIGRlZmluaXRpb24gZm9yIHdoaWNoIHRoZSBUYXNrIERlc2NyaXB0b3IgaGFzIGJlZW4gY3JlYXRlZCwgb25seSBhIHN1YnNldCBvZiBzdGVwcyBzaGFsbCBiZSBwZXJmb3JtZWQuICBIZSBkZWZpbmVzIHRoaXMgc2VsZWN0aW9uIHVzaW5nIHRoZSBzZWxlY3RlZFN0ZXBzIGFzc29jaWF0aW9uLiAgSWYgaGUgd2FudHMgdG8gYWRkIHN0ZXBzIHRvIGEgVGFzayBEZXNjcmlwdG9yLCBoZSBjYW4gZGVzY3JpYmUgdGhlc2UgZWl0aGVyIHByYWdtYXRpY2FsbHkgaW4gdGhlIHJlZmluZWREZXNjcmlwdGlvbiBhdHRyaWJ1dGUgb3IgJ3Byb3Blcmx5JyBjcmVhdGUgYSBjb250cmlidXRpbmcgVGFzayB0byB0aGUgVGFzayB0aGUgVGFzayBEZXNjcmlwdG9yIHJlZmVycyB0by4KLTwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6V29ya0JyZWFrZG93bkVsZW1lbnQiPgotCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJUYXNrIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlBlcmZvcm1lZFByaW1hcmlseUJ5IiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQkJPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQWRkaXRpb25hbGx5UGVyZm9ybWVkQnkiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJBc3Npc3RlZEJ5IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iRXh0ZXJuYWxJbnB1dCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Ik1hbmRhdG9yeUlucHV0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iT3B0aW9uYWxJbnB1dCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Ik91dHB1dCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJTdGVwIiB0eXBlPSJ1bWE6U2VjdGlvbiIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImlzU3luY2hyb25pemVkV2l0aFNvdXJjZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJDb21wb3NpdGVSb2xlIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lhbCBSb2xlIERlc2NyaXB0b3IgdGhhdCByZWxhdGVzIHRvIG1vcmUgdGhlbiBvbmUgUm9sZS4gIEl0IHJlcHJlc2VudHMgYSBncm91cGluZyBvZiBSb2xlcyB3aXRoIHRoZSBtYWluIHB1cnBvc2Ugb2Ygc2ltcGxpZmljYXRpb24sIGkuZS4gcmVkdWNpbmcgdGhlIG51bWJlciBvZiByb2xlcyBmb3IgYSBwcm9jZXNzLgotQSBDb21wb3NpdGUgUm9sZSBpcyBhIGdyb3VwaW5nIG9mIFJvbGVzIHRoYXQgY2FuIGJlIHVzZWQgaW4gYW4gQWN0aXZpdHkgb3IgUHJvY2VzcyB0byByZWR1Y2UgdGhlIG51bWJlciBvZiBSb2xlcy4gIEEgdHlwaWNhbCBhcHBsaWNhdGlvbiB3b3VsZCBiZSBhIHByb2Nlc3MgZm9yIGEgc21hbGwgdGVhbSBpbiB3aGljaCBhIHN0YW5kYXJkIHNldCBvZiByb2xlcyBmcm9tIHRoZSBtZXRob2QgY29udGVudCB3b3VsZCBiZSBhbGwgcGVyZm9ybWVkIGJ5IG9uZSBvciBtb3JlIHJlc291cmNlLiAgQnkgdXNpbmcgQ29tcG9zaXRlIFJvbGUgdGhlIHByb2Nlc3Mgd291bGQgc3VnZ2VzdCBhIHR5cGljYWwgY2x1c3RlcmluZyBvZiBSb2xlcyB0byBSZXNvdXJjZXMuICBBIENvbXBvc2l0ZSBSb2xlIGNvdWxkIHBlcmZvcm0gYWxsIFRhc2tzIGRlZmluZWQgZm9yIHRoZSBSb2xlcyBpdCByZWZlcnMgdG8uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpSb2xlRGVzY3JpcHRvciI+Ci0JCQkJPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJBZ2dyZWdhdGVkUm9sZSIgdHlwZT0idW1hOlJvbGUiLz4KLQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iVGVhbVByb2ZpbGUiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBCcmVha2Rvd24gRWxlbWVudCB0aGF0IGdyb3VwcyBSb2xlIERlc2NyaXB0b3JzIG9yIFJlc291cmNlIERlZmluaXRpb25zIGRlZmluaW5nIGEgbmVzdGVkIGhpZXJhcmNoeSBvZiB0ZWFtcyBhbmQgdGVhbSBtZW1iZXJzLgotV29yayBhc3NpZ25tZW50cyBhbmQgV29yayBQcm9kdWN0IHJlc3BvbnNpYmlsaXRpZXMgY2FuIGJlIGRpZmZlcmVudCBmcm9tIEFjdGl2aXR5IHRvIEFjdGl2aXR5IGluIGEgZGV2ZWxvcG1lbnQgcHJvamVjdC4gRGlmZmVyZW50IHBoYXNlcyByZXF1aXJlIGRpZmZlcmVudCBzdGFmZmluZyBwcm9maWxlcywgaS5lLiBkaWZmZXJlbnQgc2tpbGxzIGFuZCByZXNvdXJjZXMgZG9pbmcgZGlmZmVyZW50IHR5cGVzIG9mIHdvcmsuICBUaGVyZWZvcmUsIGEgcHJvY2VzcyBuZWVkcyB0byBkZWZpbmUgc3VjaCBkaWZmZXJlbnQgcHJvZmlsZXMgaW4gYSBmbGV4aWJsZSBtYW5uZXIuICBXaGVyZWFzIENvcmUgTWV0aG9kIENvbnRlbnQgZGVmaW5lcyBzdGFuZGFyZCByZXNwb25zaWJpbGl0aWVzIGFuZCBhc3NpZ25tZW50cywgYSBwcm9jZXNzIGV4cHJlc3MgYnkgYSBicmVha2Rvd24gc3RydWN0dXJlcyBuZWVkcyB0byBiZSBhYmxlIHJlZmluZSBhbmQgcmVkZWZpbmUgdGhlc2UgdGhyb3VnaG91dCBpdHMgZGVmaW5pdGlvbi4gIFJvbGUgRGVzY3JpcHRvcnMsIFJlc291cmNlIERlZmluaXRpb25zLCBhcyB3ZWxsIGFzIFRlYW0gUHJvZmlsZXMgcHJvdmlkZSB0aGUgZGF0YSBzdHJ1Y3R1cmUgbmVjZXNzYXJ5IHRvIGFjaGlldmUgdGhpcyBmbGV4aWJpbGl0eSBhbmQgdG8gcHJvdmlkZSBhIHByb2Nlc3MgdXNlciB3aXRoIHRoZSBjYXBhYmlsaXR5IHRvIGRlZmluZSBkaWZmZXJlbnQgdGVhbXMgYW5kIHJvbGUgcmVsYXRpb25zaGlwcyBmb3IgZXZlcnkgQWN0aXZpdHkgKGluY2x1ZGluZyBBY3Rpdml0aWVzIG9uIGFueSBuZXN0aW5nLWxldmVsIGFzIHdlbGwgYXMgSXRlcmF0aW9ucyBvciBQaGFzZXMpLgotSGVuY2UsIGluIGFkZGl0aW9uIHRvIHRoZSB3b3JrIGJyZWFrZG93biBhbmQgd29yayBwcm9kdWN0IGJyZWFrZG93biBzdHJ1Y3R1cmVzIGRlZmluZWQgc28gZmFyLCBUZWFtIFByb2ZpbGVzIGFyZSB1c2VkIHRvIGRlZmluZSBhIHRoaXJkIHR5cGUgb2YgYnJlYWtkb3duIHN0cnVjdHVyZTogdGVhbSBicmVha2Rvd24gc3RydWN0dXJlcy4gIFRoZXNlIGFyZSBjcmVhdGVkIGFzIGFuIEFjdGl2aXR5IHNwZWNpZmljIGhpZXJhcmNoeSBvZiBUZWFtIFByb2ZpbGVzIGNvbXByaXNpbmcgb2YgUm9sZSBEZXNjcmlwdG9ycyBhbmQgUmVzb3VyY2UgRGVmaW5pdGlvbnMuICBUaGVzZSBzdHJ1Y3R1cmVzIGNhbiBiZSBwcmVzZW50ZWQgYXMgd2VsbC1rbm93biBPcmctQ2hhcnRzLiAgSnVzdCBhcyB3aXRoIGFueSBvdGhlciBCcmVha2Rvd24gRWxlbWVudCBhbmQgRGVzY3JpcHRvcnMsIFRlYW0gUHJvZmlsZXMgY2FuIGJlIGRlZmluZWQgd2l0aGluIHRoZSBzY29wZSBvZiBhbnkgQWN0aXZpdHkgaW4gYSBicmVha2Rvd24gc3RydWN0dXJlLiAgSW4gb3RoZXIgd29yZHMgZXZlcnkgQWN0aXZpdHkgY2FuIGRlZmluZSBpdHMgb3duIFRlYW0gUHJvZmlsZXMgY29uc2lzdGluZyBvZiBBY3Rpdml0eSBzcGVjaWZpYyBSb2xlIERlc2NyaXB0b3JzIGFuZCBSZXNvdXJjZSBEZWZpbml0aW9ucy4gIFR5cGljYWxseSwgVGVhbSBQcm9maWxlcyBhcmUgZGVmaW5lZCBvbiB0aGUgbGV2ZWwgb2YgSXRlcmF0aW9ucyBvciBQaGFzZXMgb3Igb3RoZXIgaGlnaGVyLWxldmVsIEFjdGl2aXR5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6QnJlYWtkb3duRWxlbWVudCI+Ci0JCQkJPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJSb2xlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJTdXBlclRlYW0iIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlN1YlRlYW0iIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUHJvY2VzcyI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpYWwgQWN0aXZpdHkgdGhhdCBkZXNjcmliZXMgYSBzdHJ1Y3R1cmUgZm9yIHBhcnRpY3VsYXIgdHlwZXMgb2YgZGV2ZWxvcG1lbnQgcHJvamVjdHMuICBUbyBwZXJmb3JtIHN1Y2ggYSBkZXZlbG9wbWVudCBwcm9qZWN0IGEgUHJvY2Vzc2VzIHdvdWxkIGJlICdpbnN0YW50aWF0ZWQnIGFuZCBhZGFwdGVkIGZvciB0aGUgc3BlY2lmaWMgc2l0dWF0aW9uLiAgUHJvY2VzcyBpcyBhbiBhYnN0cmFjdCBjbGFzcyBhbmQgdGhpcyBtZXRhLW1vZGVsIGRlZmluZXMgZGlmZmVyZW50IHNwZWNpYWwgdHlwZXMgb2YgUHJvY2Vzc2VzIGZvciBkaWZmZXJlbnQgcHJvY2VzcyBtYW5hZ2VtZW50IGFwcGxpY2F0aW9ucyBhbmQgZGlmZmVyZW50IHNpdHVhdGlvbnMgb2YgcHJvY2VzcyByZXVzZS4gIEV2ZXJ5IFByb2Nlc3MgY29tcHJpc2VzIG9mIGFuZCBpcyB0aGUgdG9wLWxldmVsIGVsZW1lbnQgb2YgYW4gbi1sZXZlbCBicmVha2Rvd24gc3RydWN0dXJlIHVzaW5nIHRoZSBOZXN0aW5nIGFzc29jaWF0aW9uIGRlZmluZWQgb24gQWN0aXZpdHkuCi1Db3JlIE1ldGhvZCBDb250ZW50IHByb3ZpZGVzIHN0ZXAtYnktc3RlcCBleHBsYW5hdGlvbnMsIGRlc2NyaWJpbmcgaG93IHZlcnkgc3BlY2lmaWMgZGV2ZWxvcG1lbnQgZ29hbHMgYXJlIGFjaGlldmVkIGluZGVwZW5kZW50IG9mIHRoZSBwbGFjZW1lbnQgb2YgdGhlc2Ugc3RlcHMgd2l0aGluIGEgZGV2ZWxvcG1lbnQgbGlmZWN5Y2xlLiAgUHJvY2Vzc2VzIHRha2UgdGhlc2UgbWV0aG9kIGVsZW1lbnRzIGFuZCByZWxhdGUgdGhlbSBpbnRvIHNlbWktb3JkZXJlZCBzZXF1ZW5jZXMgdGhhdCBhcmUgY3VzdG9taXplZCB0byBzcGVjaWZpYyB0eXBlcyBvZiBwcm9qZWN0cy4gIFRodXMsIGEgcHJvY2VzcyBpcyBhIHNldCBvZiBwYXJ0aWFsbHkgb3JkZXJlZCB3b3JrIGRlc2NyaXB0aW9ucyBpbnRlbmRlZCB0byByZWFjaCBhIGhpZ2hlciBkZXZlbG9wbWVudCBnb2FsLCBzdWNoIGFzIHRoZSByZWxlYXNlIG9mIGEgc3BlY2lmaWMgc29mdHdhcmUgc3lzdGVtLiAgQSBwcm9jZXNzIGFuZCB0aGUgcHJvY2VzcyBtZXRhLW1vZGVsIHN0cnVjdHVyZSBkZWZpbmVkIGluIHRoaXMgc3BlY2lmaWNhdGlvbiBmb2N1c2VzIG9uIHRoZSBsaWZlY3ljbGUgYW5kIHRoZSBzZXF1ZW5jaW5nIG9mIHdvcmsgaW4gYnJlYWtkb3duIHN0cnVjdHVyZXMuICBUbyBhY2hpZXZlIHRoaXMgaXQgdXNlcyB0aGUgRGVzY3JpcHRvciBjb25jZXB0IHJlZmVyZW5jaW5nIG1ldGhvZCBjb250ZW50IGFuZCBhbGxvd2luZyBkZWZpbmluZyB0aW1lLXNwZWNpZmljIGN1c3RvbWl6YXRpb25zIG9mIHRoZSByZWZlcmVuY2VkIGNvbnRlbnQgKGUuZy4gZGVmaW5pbmcgYSBmb2N1cyBvbiBkaWZmZXJlbnQgc3RlcHMgb2YgdGhlIHNhbWUgVGFzayBhbmQgcHJvdmlkaW5nIGlucHV0IFdvcmsgUHJvZHVjdHMgaW4gZGlmZmVyZW50IHN0YXRlcyB3aXRoaW4gdGhlIGRpZmZlcmVudCBQaGFzZXMgb2YgYSBwcm9jZXNzIGxpZmVjeWNsZSBpbiB3aGljaCB0aGUgc2FtZSBUYXNrIGlzIHBlcmZvcm1lZCkuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpBY3Rpdml0eSI+Ci0JCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkluY2x1ZGVzUGF0dGVybiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iRGVmYXVsdENvbnRleHQiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iVmFsaWRDb250ZXh0IiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0iZGlhZ3JhbVVSSSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgVVJJIG9mIHRoZSBkaWFncmFtIGZpbGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBwcm9jZXNzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkRlbGl2ZXJ5UHJvY2VzcyI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpYWwgUHJvY2VzcyBkZXNjcmliaW5nIGEgY29tcGxldGUgYW5kIGludGVncmF0ZWQgYXBwcm9hY2ggZm9yIHBlcmZvcm1pbmcgYSBzcGVjaWZpYyBwcm9qZWN0IHR5cGUuICBJdCBkZXNjcmliZXMgYSBjb21wbGV0ZSBwcm9qZWN0IGxpZmVjeWNsZSBlbmQtdG8tZW5kIGFuZCBzaGFsbCBiZSB1c2VkIGFzIGEgcmVmZXJlbmNlIGZvciBydW5uaW5nIHByb2plY3RzIHdpdGggc2ltaWxhciBjaGFyYWN0ZXJpc3RpY3MgYXMgZGVmaW5lZCBmb3IgdGhlIHByb2Nlc3MuICBBIERlbGl2ZXJ5IFByb2Nlc3MgaXMgcmVsYXRlZCB0byBzcGVjaWZpYyBzdXBwb3J0aW5nIGluZm9ybWF0aW9uIHN1Y2ggYXMgUm9hZG1hcHMgKGluaGVyaXRlZCB2aWEgQWN0aXZpdHkpIGFzIHdlbGwgYXMgQ29tbXVuaWNhdGlvbnMgYW5kIEVkdWNhdGlvbiBNYXRlcmlhbC4KLUEgRGVsaXZlcnkgUHJvY2VzcyBpcyBhIFByb2Nlc3MgdGhhdCBjb3ZlcnMgYSB3aG9sZSBkZXZlbG9wbWVudCBsaWZlY3ljbGUgZnJvbSBiZWdpbm5pbmcgdG8gZW5kLiAgQSBEZWxpdmVyeSBQcm9jZXNzIHNoYWxsIGJlIHVzZWQgYXMgYSB0ZW1wbGF0ZSBmb3IgcGxhbm5pbmcgYW5kIHJ1bm5pbmcgYSBwcm9qZWN0LiAgSXQgcHJvdmlkZXMgYSBjb21wbGV0ZSBsaWZlY3ljbGUgbW9kZWwgd2l0aCBwcmVkZWZpbmVkIHBoYXNlcywgaXRlcmF0aW9ucywgYW5kIGFjdGl2aXRpZXMgdGhhdCBoYXZlIGJlZW4gZGV0YWlsZWQgYnkgc2VxdWVuY2luZyByZWZlcmVuY2luZyBtZXRob2QgY29udGVudCBpbiBicmVha2Rvd24gc3RydWN0dXJlcy4gIEl0IGlzIGRlZmluZWQgb24gdGhlIGJhc2lzIG9mIGV4cGVyaWVuY2Ugd2l0aCBwYXN0IHByb2plY3RzIG9yIGVuZ2FnZW1lbnRzLCBhbmQvb3IgdGhlIGJlc3QgcHJhY3RpY2UgdXNlIG9mIGEgZGV2ZWxvcG1lbnQgb3IgZGVsaXZlcnkgYXBwcm9hY2guICBJdCBkZWZpbmVzIHdoYXQgZ2V0cyBwcm9kdWNlZCwgaG93IHRob3NlIGl0ZW1zIGFyZSBwcm9kdWNlZCwgYW5kIHRoZSByZXF1aXJlZCBzdGFmZmluZyBpbiB0aGUgZm9ybSBvZiBpbnRlZ3JhdGVkIFdvcmssIFdvcmsgUHJvZHVjdCwgYW5kIFRlYW0gQnJlYWtkb3duIFN0cnVjdHVyZXMuICBGb3IgZXhhbXBsZSwgYSBwcm9jZXNzIGVuZ2luZWVyIGNhbiBkZWZpbmUgYWx0ZXJuYXRpdmUgRGVsaXZlcnkgUHJvY2Vzc2VzIGZvciBzb2Z0d2FyZSBkZXZlbG9wbWVudCBwcm9qZWN0cyB0aGF0IGRpZmZlciBpbiB0aGUgc2NhbGUgb2YgdGhlIGVuZ2FnZW1lbnQgYW5kIHN0YWZmaW5nIG5lY2Vzc2FyeSwgdGhlIHR5cGUgb2YgdGhlIHNvZnR3YXJlIGFwcGxpY2F0aW9uIHRvIGJlIGRldmVsb3BlZCwgdGhlIGRldmVsb3BtZW50IG1ldGhvZHMgYW5kIHRlY2hub2xvZ2llcyB0byBiZSB1c2VkLCBldGMuICBBbHRob3VnaCwgdGhlIERlbGl2ZXJ5IFByb2Nlc3MgYWltcyB0byBjb3ZlciBhIHdob2xlIHByb2plY3QgaXQga2VlcHMgY2VydGFpbiBkZWNpc2lvbiB0aGF0IGFyZSB0b28gcHJvamVjdCBzcGVjaWZpYyBvcGVuLiAgRm9yIGV4YW1wbGUsIHRoZSBicmVha2Rvd24gc3RydWN0dXJlIGRlZmluZXMgd2hpY2ggQnJlYWtkb3duIEVsZW1lbnRzIGhhdmUgbXVsdGlwbGUgb2NjdXJyZW5jZXMgb3IgaXMgcmVwZWF0YWJsZSB2aWEgaXQgcmVzcGVjdGl2ZSBhdHRyaWJ1dGVzLCBidXQgZG9lcyBub3Qgc2F5IGhvdyBtYW55IG9jY3VycmVuY2VzIGFuZCBob3cgbWFueSByZXBlYXRzL2l0ZXJhdGlvbnMgaXQgd2lsbCBoYXZlLiAgVGhlc2UgZGVjaXNpb25zIGhhdmUgdG8gYmUgZG9uZSBieSBhIHByb2plY3QgbWFuYWdlciB3aGVuIHBsYW5uaW5nIGEgY29uY3JldGUgcHJvamVjdCwgcHJvamVjdCBwaGFzZSwgb3IgcHJvamVjdCBpdGVyYXRpb25zLiAgQSBEZWxpdmVyeSBQcm9jZXNzIGlzIGFsd2F5cyBhIGNvbXBsZXRlIGRlc2NyaXB0aW9uIG9mIGEgcHJvY2VzcyBpbiB0ZXJtcyBvZiBjb21wbGV0ZW5lc3Mgb2YgdGhlIGxpZmVjeWNsZSwgYXMgd2VsbCBhcyBpbiB0ZXJtcyBvZiBhbGwgdGhyZWUgdmlld3Mgb24gdGhlIHByb2Nlc3Mgd2hpY2ggYXJlIHRoZSBXb3JrIEJyZWFrZG93biBTdHJ1Y3R1cmUsIFdvcmsgUHJvZHVjdCBCcmVha2Rvd24gU3RydWN0dXJlLCBhbmQgVGVhbSBCcmVha2Rvd24gU3RydWN0dXJlIGhhdmUgdG8gYmUgZnVsbHkgYW5kIGNvbnNpc3RlbnRseSBwb3B1bGF0ZWQuICBDb25zaXN0ZW5jeSBvZiBhIERlbGl2ZXJ5IFByb2Nlc3MgaXMgYWN0dWFsbHkgZW5zdXJlZCBieSB0aGUgZmFjdCB0aGF0IGFsbCB0aHJlZSBicmVha2Rvd25zIGFyZSByZXByZXNlbnRlZCBieSBvbmUgc2luZ2xlIGRhdGEgc3RydWN0dXJlIGFuZCBvbmUgcGFydGljdWxhciBicmVha2Rvd24gc3VjaCBhcyBUZWFtIEJyZWFrZG93biBpcyBqdXN0IGEgdmlldyBvbiB0aGF0IGRhdGEgc3RydWN0dXJlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6UHJvY2VzcyI+Ci0JCQkJPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJDb21tdW5pY2F0aW9uc01hdGVyaWFsIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJFZHVjYXRpb25NYXRlcmlhbCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCTwveHNkOmNob2ljZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJDYXBhYmlsaXR5UGF0dGVybiI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpYWwgUHJvY2VzcyB0aGF0IGRlc2NyaWJlcyBhIHJldXNhYmxlIGNsdXN0ZXIgb2YgZG9pbmcgd29yayBpbiBjb21tb24gcHJvY2VzcyBhcmVhcy4gIENhcGFiaWxpdGllcyBQYXR0ZXJucyBleHByZXNzIGFuZCBjb21tdW5pY2F0ZSBwcm9jZXNzIGtub3dsZWRnZSBmb3IgYSBrZXkgYXJlYSBvZiBpbnRlcmVzdCBzdWNoIGFzIGEgRGlzY2lwbGluZSBhbmQgY2FuIGJlIGRpcmVjdGx5IHVzZWQgYnkgcHJvY2VzcyBwcmFjdGl0aW9uZXIgdG8gZ3VpZGUgaGlzIHdvcmsuICBUaGV5IGFyZSBhbHNvIHVzZWQgYXMgYnVpbGRpbmcgYmxvY2tzIHRvIGFzc2VtYmxlIERlbGl2ZXJ5IFByb2Nlc3NlcyBvciBsYXJnZXIgQ2FwYWJpbGl0eSBQYXR0ZXJucyBlbnN1cmluZyBvcHRpbWFsIHJldXNlIGFuZCBhcHBsaWNhdGlvbiBvZiB0aGUga2V5IHByYWN0aWNlcyB0aGV5IGV4cHJlc3MuCi1BIENhcGFiaWxpdHkgUGF0dGVybiBpcyBhIHNwZWNpYWwgUHJvY2VzcyB0aGF0IGRlc2NyaWJlcyBhIHJldXNhYmxlIGNsdXN0ZXIgb2YgZG9pbmcgd29yayBpbiBhIGdlbmVyYWwgcHJvY2VzcyBhcmVhIHRoYXQgcHJvdmlkZXMgYSBjb25zaXN0ZW50IGRldmVsb3BtZW50IGFwcHJvYWNoIHRvIGNvbW1vbiBwcm9ibGVtcy4gIEV4YW1wbGVzIGZvciBDYXBhYmlsaXR5IFBhdHRlcm4gY291bGQgYmUgJ3VzZSBjYXNlLWJhc2VkIHJlcXVpcmVtZW50cyBtYW5hZ2VtZW50JywgJ3VzZSBjYXNlIGFuYWx5c2lzJywgb3IgJ3VuaXQgdGVzdGluZycuIFR5cGljYWxseSBidXQgbm90IG5lY2Vzc2FyaWx5LCBDYXBhYmlsaXR5IFBhdHRlcm5zIGhhdmUgdGhlIHNjb3BlIG9mIG9uZSBkaXNjaXBsaW5lIHByb3ZpZGluZyBhIGJyZWFrZG93biBvZiByZXVzYWJsZSBjb21wbGV4IEFjdGl2aXRpZXMsIHJlbGF0aW9uc2hpcHMgdG8gdGhlIFJvbGVzIHdoaWNoIHBlcmZvcm0gVGFza3Mgd2l0aGluIHRoZXNlIEFjdGl2aXRpZXMsIGFzIHdlbGwgYXMgdG8gdGhlIFdvcmsgUHJvZHVjdHMgdGhhdCBhcmUgdXNlZCBhbmQgcHJvZHVjZWQuICBBIGNhcGFiaWxpdHkgcGF0dGVybiBkb2VzIG5vdCByZWxhdGUgdG8gYW55IHNwZWNpZmljIHBoYXNlIG9yIGl0ZXJhdGlvbiBvZiBhIGRldmVsb3BtZW50IGxpZmVjeWNsZSwgYW5kIHNob3VsZCBub3QgaW1wbHkgYW55LiAgSW4gb3RoZXIgd29yZHMsIGEgcGF0dGVybiBzaG91bGQgYmUgZGVzaWduZWQgaW4gYSB3YXkgdGhhdCBpdCBpcyBhcHBsaWNhYmxlIGFueXdoZXJlIGluIGEgRGVsaXZlcnkgUHJvY2Vzcy4gIFRoaXMgZW5hYmxlcyBpdHMgQWN0aXZpdGllcyB0byBiZSBmbGV4aWJseSBhc3NpZ25lZCB0byB3aGF0ZXZlciBwaGFzZXMgdGhlcmUgYXJlIGluIHRoZSBEZWxpdmVyeSBQcm9jZXNzIHRvIHdoaWNoIGl0IGlzIGJlaW5nIGFwcGxpZWQuICBJdCBpcyBhIGdvb2QgcHJhY3RpY2UgdG8gZGVzaWduIGEgQ2FwYWJpbGl0eSBQYXR0ZXJuIHRvIHByb2R1Y2Ugb25lIG9yIG1vcmUgZ2VuZXJpYyBEZWxpdmVyYWJsZXMuICBUaGUgdHlwaWNhbCBjb25maWd1cmF0aW9uIGlzIHRoYXQgZWFjaCBBY3Rpdml0eSBpbiB0aGUgQ2FwYWJpbGl0eSBQYXR0ZXJuIHByb2R1Y2VzIG9uZSBEZWxpdmVyYWJsZSwgYW5kIHRoZSBsYXN0IFRhc2sgRGVzY3JpcHRvciBpbiB0aGUgQWN0aXZpdHkgZXhwbGljaXRseSBvdXRwdXRzIGp1c3QgdGhpcyBEZWxpdmVyYWJsZS4gIFRoaXMgZW5hYmxlcyB0aGUgcHJvY2VzcyBlbmdpbmVlciB0byBzZWxlY3QgUGF0dGVybnMgb3IganVzdCBBY3Rpdml0aWVzIGJ5IGRlY2lkaW5nIHdoaWNoIERlbGl2ZXJhYmxlcyBhcmUgcmVxdWlyZWQuICBJdCBhbHNvIG9mZmVycyBhIHNpbXBsZSBpbnRlZ3JhdGlvbiBhcHByb2FjaDogYW4gQWN0aXZpdHkgZnJvbSBhIGNhcGFiaWxpdHkgcGF0dGVybiBpcyBsaW5rZWQgdG8gdGhlIFBoYXNlIG9yIEl0ZXJhdGlvbiB3aGljaCBpcyByZXF1aXJlZCB0byBwcm9kdWNlIHRoZSBBY3Rpdml0eSdzIERlbGl2ZXJhYmxlLiAgS2V5IGFwcGxpY2F0aW9ucyBhcmVhcyBvZiAvIGFyZWFzIG9mIHJldXNlIGZvciBDYXBhYmlsaXR5IFBhdHRlcm5zIGFyZToKLS0gVG8gc2VydmUgYXMgYnVpbGRpbmcgYmxvY2tzIGZvciBhc3NlbWJsaW5nIERlbGl2ZXJ5IFByb2Nlc3NlcyBvciBsYXJnZXIgQ2FwYWJpbGl0eSBQYXR0ZXJucy4gIE5vcm1hbGx5IGRldmVsb3BpbmcgYSBEZWxpdmVyeSBQcm9jZXNzIGlzIG5vdCBkb25lIGZyb20gc2NyYXRjaCBidXQgYnkgc3lzdGVtYXRpY2FsbHkgYXBwbHlpbmcgYW5kIGJpbmRpbmcgcGF0dGVybnMuICBJbiBhZGRpdGlvbiB0byB0aGUgc3RhbmRhcmQgcGF0dGVybiBhcHBsaWNhdGlvbiBvZiAnY29weS1hbmQtbW9kaWZ5Jywgd2hpY2ggYWxsb3dzIHRoZSBwcm9jZXNzIGVuZ2luZWVyIHRvIGluZGl2aWR1YWxseSBjdXN0b21pemUgdGhlIHBhdHRlcm4ncyBjb250ZW50IHRvIHRoZSBwYXJ0aWN1bGFyIHNpdHVhdGlvbiBpdCBpcyBhcHBsaWVkIGZvciwgdGhlIFBsdWdpbiBtZXRhLW1vZGVsIHBhY2thZ2UgKFNlY3Rpb24gNi4xKSBpbnRyb2R1Y2VzIGV2ZW4gbW9yZSBzb3BoaXN0aWNhdGVkIGluaGVyaXRhbmNlIHJlbGF0aW9uc2hpcHMgdGhhdCBzdXBwb3J0IGR5bmFtaWMgYmluZGluZyBvZiBwYXR0ZXJucyAoaS5lLiB0aGUgcGF0dGVybiBpcyByZWZlcmVuY2VkIGFuZCBub3QgY29waWVkKS4gIFRoaXMgdW5pcXVlIG5ldyB3YXkgb2YgcmV1c2luZyBwcm9jZXNzIGtub3dsZWRnZSBhbGxvd3MgdG8gZmFjdG9yIG91dCBjb21tb25seSByZW9jY3VycmluZyBBY3Rpdml0aWVzIGludG8gcGF0dGVybnMgYW5kIHRvIGFwcGx5IHRoZW0gb3ZlciBhbmQgb3ZlciBhZ2FpbiBmb3IgYSBwcm9jZXNzLiAgV2hlbiB0aGUgcGF0dGVybiBpcyBiZWluZyByZXZpc2VkIG9yIHVwZGF0ZWQsIGFsbCBjaGFuZ2VzIHdpbGwgYmUgYXV0b21hdGljYWxseSByZWZsZWN0ZWQgaW4gYWxsIHBhdHRlcm4gYXBwbGljYXRpb24gaW4gYWxsIHByb2Nlc3NlcyBiZWNhdXNlIG9mIHRoZSBkeW5hbWljIGJpbmRpbmcuCi0tIFRvIHN1cHBvcnQgZGlyZWN0IGV4ZWN1dGlvbiBpbiBhIGRldmVsb3BtZW50IHByb2plY3QgdGhhdCBkb2VzIG5vdCB3b3JrIGZvbGxvd2luZyBhIHdlbGwtZGVmaW5lZCBwcm9jZXNzLCBidXQgd29ya3MgYmFzZWQgb24gbG9vc2VseSBjb25uZWN0ZWQgcHJvY2VzcyBmcmFnbWVudHMgb2YgYmVzdCBwcmFjdGljZXMgaW4gYSBmbGV4aWJsZSBtYW5uZXIgKGUuZy4gQWdpbGUgRGV2ZWxvcG1lbnQpLgotLSBUbyBzdXBwb3J0IHByb2Nlc3MgZWR1Y2F0aW9uIGJ5IGRlc2NyaWJpbmcga25vd2xlZGdlIGZvciBhIGtleSBhcmVhIHN1Y2ggYXMgYmVzdCBwcmFjdGljZXMgb24gaG93IHRvIHBlcmZvcm0gdGhlIHdvcmsgZm9yIGEgRGlzY2lwbGluZSAoZS5nLiBSZXF1aXJlbWVudHMgTWFuYWdlbWVudCksIGZvciBhIHNwZWNpZmljIGRldmVsb3BtZW50IHRlY2huaXF1ZSAoYXNwZWN0LW9yaWVudGVkIGRldmVsb3BtZW50KSwgb3IgYSBzcGVjaWZpYyB0ZWNobmljYWwgYXJlYSAoZS5nLiByZWxhdGlvbmFsIGRhdGFiYXNlIGRlc2lnbiksIHdoaWNoIGlzIHVzZWQgZm9yIGVkdWNhdGlvbiBhbmQgdGVhY2hpbmcuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpQcm9jZXNzIi8+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWFsIFByb2Nlc3MgdGhhdCBpcyBwcmVwYXJlZCBmb3IgaW5zdGFudGlhdGlvbiBieSBhIHByb2plY3QgcGxhbm5pbmcgdG9vbC4gIFR5cGljYWxseSwgaXQgaXMgY3JlYXRlZCBiYXNlZCBvbiBhIFByb2Nlc3Mgc3VjaCBhcyBhIERlbGl2ZXJ5IFByb2Nlc3MgYXMgYSB3aG9sZSAoZS5nLiBpbiBjYXNlIG9mIGEgd2F0ZXJmYWxsLWJhc2VkIGRldmVsb3BtZW50IGFwcHJvYWNoKSBvciBpbiBwYXJ0cyAoZS5nLiBpbiBjYXNlIG9mIGFuIGl0ZXJhdGl2ZSBkZXZlbG9wbWVudCBhcHByb2FjaCkuCi1BIFByb2Nlc3MgUGxhbm5pbmcgVGVtcGxhdGUgcmVwcmVzZW50cyBhIHBhcnRpYWxseSBmaW5pc2hlZCBwbGFuIGZvciBhIGNvbmNyZXRlIHByb2plY3QuICBJdCB1c2VzIHRoZSBzYW1lIGluZm9ybWF0aW9uIHN0cnVjdHVyZXMgYXMgYWxsIG90aGVyIFByb2Nlc3MgVHlwZXMgdG8gcmVwcmVzZW50IHRlbXBsYXRlcyBmb3IgcHJvamVjdCBwbGFucy4gIEhvd2V2ZXIsIGNlcnRhaW4gcGxhbm5pbmcgZGVjaXNpb25zIGhhdmUgYWxyZWFkeSBiZWVuIGFwcGxpZWQgdG8gdGhlIHRlbXBsYXRlIGFzIHdlbGwgYXMgaW5mb3JtYXRpb24gaGFzIGJlZW4gcmVtb3ZlZCBhbmQvb3IgcmVmb3JtYXR0ZWQgdG8gYmUgcmVhZHkgZm9yIGV4cG9ydCB0byBhIHNwZWNpZmljIHBsYW5uaW5nIHRvb2wuICBFeGFtcGxlcyBmb3Igc3VjaCBkZWNpc2lvbnMgYXJlOiBhIHRlbXBsYXRlIGhhcyBiZWVuIGNyZWF0ZWQgdG8gcmVwcmVzZW50IGEgcGxhbiBmb3IgYSBwYXJ0aWN1bGFyIEl0ZXJhdGlvbiBpbiBhbiBpdGVyYXRpdmUgZGV2ZWxvcG1lbnQgcHJvamVjdCwgd2hpY2ggZnIgZXhhbXBsZSBkaXN0aW5ndWlzaGVzIGVhcmx5IGZyb20gbGF0ZSBpdGVyYXRpb25zIGluIHRoZSBFbGFib3JhdGlvbiBwaGFzZSBvZiBhIHByb2plY3Q7IGlmIHRoZSB0YXJnZXRlZCBwbGFubmluZyB0b29sIGNhbm5vdCByZXByZXNlbnQgaW5wdXQgYW5kIG91dHB1dCBvZiBUYXNrLCB0aGVuIHRoZXNlIGhhdmUgYmVlbiByZW1vdmVkIGZyb20gdGhlIHN0cnVjdHVyZTsgY2VydGFpbiByZXBldGl0aW9ucyBoYXZlIGJlZW4gYWxyZWFkeSBhcHBsaWVkLCBlLmcuIHN0YXRpbmcgdGhhdCBhIGN5Y2xlIG9mIHNwZWNpZmljIFRhc2sgZ3JvdXBlZCBpbiBhbiBBY3Rpdml0eSBoYXZlIHRvIGJlIHJlcGVhdGVkIG4tdGltZXM7IGV0Yy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOlByb2Nlc3MiPgotCQkJCTx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQmFzZVByb2Nlc3MiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUHJvY2Vzc1BhY2thZ2UiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWFsIE1ldGhvZCBQYWNrYWdlIHRoYXQgY29udGFpbnMgUHJvY2VzcyBFbGVtZW50cywgb25seS4KLUEga2V5IHNlcGFyYXRpb24gb2YgY29uY2VybnMgaW4gVU1BIGlzIHRoZSBkaXN0aW5jdGlvbiBiZXR3ZWVuIE1ldGhvZCBDb250ZW50IGFuZCBQcm9jZXNzLiAgVGhpcyBzZXBhcmF0aW9uIGlzIGVuZm9yY2VkIGJ5IHNwZWNpYWwgcGFja2FnZSB0eXBlcywgd2hpY2ggZG8gbm90IGFsbG93IHRoZSBtaXhpbmcgb2YgbWV0aG9kIGNvbnRlbnQgd2l0aCBwcm9jZXNzZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpNZXRob2RQYWNrYWdlIj4KLQkJCQk8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlByb2Nlc3NFbGVtZW50IiB0eXBlPSJ1bWE6UHJvY2Vzc0VsZW1lbnQiLz4KLQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5Db21wcmlzZXMgb2YgYSBsaXN0IG9mIGludGVyZmFjZSBzcGVjaWZpY2F0aW9ucyAoc2ltaWxhciB0byBvcGVyYXRpb24gZGVjbGFyYXRpb25zKSB0aGF0IGV4cHJlc3MgaW5wdXRzIGFuZCBvdXRwdXRzIGZvciBhIHByb2Nlc3MgY29tcG9uZW50LiAgVGhlc2UgaW50ZXJmYWNlIHNwZWNpZmljYXRpb25zIGFyZSBleHByZXNzZWQgdXNpbmcgVGFzayBEZXNjcmlwdG9ycyB3aGljaCBhcmUgbm90IGxpbmtlZCB0byBUYXNrcyB0aGF0IGFyZSByZWxhdGVkIHRvIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9ycyBhcyB3ZWxsIGFzIG9wdGlvbmFsIGEgUm9sZSBEZXNjcmlwdG9yLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6QnJlYWtkb3duRWxlbWVudCI+Ci0JCQkJPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJJbnRlcmZhY2VTcGVjaWZpY2F0aW9uIiB0eXBlPSJ1bWE6VGFza0Rlc2NyaXB0b3IiLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkludGVyZmFjZUlPIiB0eXBlPSJ1bWE6V29ya1Byb2R1Y3REZXNjcmlwdG9yIi8+Ci0JCQkJPC94c2Q6Y2hvaWNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlByb2Nlc3NDb21wb25lbnQiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWFsIFByb2Nlc3MgUGFja2FnZSB0aGF0IGFwcGxpZXMgdGhlIHByaW5jaXBsZXMgb2YgZW5jYXBzdWxhdGlvbi4gIEEgUHJvY2VzcyBDb21wb25lbnQgcmVhbGl6ZXMgb25lIG9yIG1vcmUgSW50ZXJmYWNlcyB3aGljaCBzcGVjaWZ5IGlucHV0cyBhbmQgb3V0cHV0cyBvZiB0aGUgY29tcG9uZW50LiBUaGVyZSBtaWdodCBiZSBtYW55IGNvbXBvbmVudHMgcmVhbGl6aW5nIHRoZSBzYW1lIGludGVyZmFjZXMsIGJ1dCB1c2luZyBkaWZmZXJlbnQgdGVjaG5pcXVlcyB0byBhY2hpZXZlIHNpbWlsYXIgb3V0cHV0cyBmb3Igc2ltaWxhciBpbnB1dHMuICBXaGVyZWFzIHRoZSBDb21wb25lbnQgSW50ZXJmYWNlcyByZXByZXNlbnQgY29tcG9uZW50IHNwZWNpZmljYXRpb25zIChibGFjayBib3ggZGVzY3JpcHRpb25zIG9mIHRoZSBjb21wb25lbnQpLCBnb29kIGNhbmRpZGF0ZXMgZm9yIGNvbXBvbmVudCByZWFsaXphdGlvbnMgY2FuIGJlIGZvdW5kIGluIENhcGFiaWxpdHkgUGF0dGVybnMgKHdoaXRlIGJveCBkZXNjcmlwdGlvbnMgZm9yIHRoZSBjb21wb25lbnQpLgotVU1BIHN1cHBvcnRzIHJlcGxhY2VhYmxlIGFuZCByZXVzYWJsZSBQcm9jZXNzIENvbXBvbmVudHMgcmVhbGl6aW5nIHRoZSBwcmluY2lwbGVzIG9mIGVuY2Fwc3VsYXRpb24uIENlcnRhaW4gc2l0dWF0aW9ucyBpbiBhIHNvZnR3YXJlIGRldmVsb3BtZW50IHByb2plY3QgbWlnaHQgcmVxdWlyZSB0aGF0IGNvbmNyZXRlIHJlYWxpemF0aW9ucyBvZiBwYXJ0cyBvZiB0aGUgcHJvY2VzcyByZW1haW4gdW5kZWNpZGVkIG9yIHdpbGwgYmUgZGVjaWRlZCBieSB0aGUgZXhlY3V0aW5nIHRlYW0gaXRzZWxmIChlLmcuIGluIG91dHNvdXJjaW5nIHNpdHVhdGlvbnMpLiAgVU1BIHByb3ZpZGVzIGEgdW5pcXVlIGNvbXBvbmVudCBjb25jZXB0IGRlZmluaW5nIGludGVyZmFjZXMgZm9yIHdvcmsgcHJvZHVjdCBpbnB1dCBhbmQgb3V0cHV0LCBhbGxvd2luZyB0cmVhdGluZyB0aGUgYWN0dWFsIGRlZmluaXRpb24gb2YgdGhlIHdvcmsgdGhhdCBwcm9kdWNlcyB0aGUgb3V0cHV0cyBhcyBhICJibGFjayBib3giLiAgQXQgYW55IHBvaW50IGR1cmluZyBhIHByb2plY3QgdGhlIGNvbXBvbmVudCAicmVhbGl6YXRpb24iIGRldGFpbGluZyB0aGUgd29yayBjYW4gYmUgYWRkZWQgdG8gdGhlIHByb2Nlc3MuICBUaGUgY29tcG9uZW50IGFwcHJvYWNoIGFsc28gYWxsb3dzIHRoYXQgZGlmZmVyZW50IHN0eWxlcyBvciB0ZWNobmlxdWVzIG9mIGRvaW5nIHdvcmsgY2FuIGJlIHJlcGxhY2VkIHdpdGggb25lIGFub3RoZXIuICBGb3IgZXhhbXBsZSwgYSBzb2Z0d2FyZSBjb2RlIG91dHB1dCBvZiBhIGNvbXBvbmVudCBjb3VsZCBiZSBwcm9kdWNlZCB3aXRoIGEgbW9kZWwtZHJpdmVuIGRldmVsb3BtZW50IG9yIGEgY29kZS1jZW50cmljIHRlY2huaXF1ZS4gIFRoZSBjb21wb25lbnQgY29uY2VwdCBlbmNhcHN1bGF0ZXMgdGhlIGFjdHVhbCB3b3JrIGFuZCBsZXRzIHRoZSBkZXZlbG9wbWVudCB0ZWFtIGNob29zZSB0aGUgYXBwcm9wcmlhdGUgdGVjaG5pcXVlIGFuZCBmaWxsIHRoZSBjb21wb25lbnQncyByZWFsaXphdGlvbiB3aXRoIHRoZWlyIGNob2ljZSBvZiBBY3Rpdml0aWVzIHRoYXQgcHJvZHVjZSB0aGUgcmVxdWlyZWQgb3V0cHV0cy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOlByb2Nlc3NQYWNrYWdlIj4KLQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQ29weXJpZ2h0IiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkludGVyZmFjZSIgdHlwZT0idW1hOlByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UiIG1pbk9jY3Vycz0iMCIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUHJvY2VzcyIgdHlwZT0idW1hOlByb2Nlc3MiLz4KLQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhdXRob3JzIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkV2ZXJ5IE1ldGhvZCBVbml0IGlzIGJlaW5nIGNyZWF0ZWQgYW5kIG93bmVkIGJ5IGFuIGF1dGhvciBvciBhdXRob3JpbmcgdGVhbS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjaGFuZ2VEYXRlIiB0eXBlPSJ4c2Q6ZGF0ZVRpbWUiPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+VGhlIGRhdGUgdGhlIGxhc3QgY2hhbmdlIHRoYXQgcmVzdWx0ZWQgaW50byB0aGlzIHZlcnNpb24gaGFzIGJlZW4gbWFkZS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjaGFuZ2VEZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZGVzY3JpcHRpb24gb2YgdGhlIGxhc3QgY2hhbmdlIHRoYXQgcmVzdWx0ZWQgaW50byB0aGlzIHZlcnNpb24uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0idmVyc2lvbiIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5FdmVyeSBQYWNrYWdlIGhhcyBhIHZlcnNpb24gbnVtYmVyIHVzZWQgdG8gdHJhY2sgY2hhbmdlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJNZXRob2RQbHVnaW4iPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWFsIE1ldGhvZCBVbml0IHRoYXQgcmVwcmVzZW50cyBhIHBoeXNpY2FsIGNvbnRhaW5lciBmb3IgTWV0aG9kIFBhY2thZ2VzLiAgSXQgZGVmaW5lcyBhIGdyYW51bGFyaXR5IGxldmVsIGZvciB0aGUgbW9kdWxhcml6YXRpb24gYW5kIG9yZ2FuaXphdGlvbiBvZiBtZXRob2QgY29udGVudCBhbmQgcHJvY2Vzc2VzLiAgQSBNZXRob2QgUGx1Z2luIGNhbiBleHRlbmQgbWFueSBvdGhlciBNZXRob2QgUGx1Z2lucyBhbmQgaXQgY2FuIGJlIGV4dGVuZGVkIGJ5IG1hbnkgTWV0aG9kIFBsdWdpbnMuICBJdCBjYW4gYWxzbyBiZSB1c2VkIHN0YW5kLWFsb25lLCBpLmUuIHdpdGggbm8gRXh0ZW5zaW9uIHJlbGF0aW9uc2hpcCB0byBvdGhlciBwbHVnLWlucy4KLU1ldGhvZCBQbHVnaW4gY29uY2VwdHVhbGx5IHJlcHJlc2VudHMgYSB1bml0IGZvciBjb25maWd1cmF0aW9uLCBtb2R1bGFyaXphdGlvbiwgZXh0ZW5zaW9uLCBwYWNrYWdpbmcsIGFuZCBkZXBsb3ltZW50IG9mIG1ldGhvZCBjb250ZW50IGFuZCBwcm9jZXNzZXMuICBBIFByb2Nlc3MgRW5naW5lZXIgc2hhbGwgZGVzaWduIGhpcyBQbHVnaW5zIGFuZCBhbGxvY2F0ZSBoaXMgY29udGVudCB0byB0aGVzZSBQbHVnaW5zIHdpdGggcmVxdWlyZW1lbnRzIGZvciBleHRlbnNpYmlsaXR5LCBtb2R1bGFyaXR5LCByZXVzZSwgYW5kIG1haW50YWluYWJpbGl0eSBpbiBtaW5kLgotU3BlY2lhbCBleHRlbnNpYmlsaXR5IG1lY2hhbmlzbXMgZGVmaW5lZCBmb3IgdGhlIG1ldGEtY2xhc3NlcyBWYXJpYWJpbGl0eSBFbGVtZW50IGFuZCBQcm9jZXNzIENvbnRyaWJ1dGlvbiBhbGxvdyBQbHVnaW4gY29udGVudCB0byBkaXJlY3RseSBjb250cmlidXRlIG5ldyBjb250ZW50LCByZXBsYWNlIGV4aXN0aW5nIGNvbnRlbnQsIG9yIHRvIGNyb3NzLXJlZmVyZW5jZSB0byBhbnkgQ29udGVudCBFbGVtZW50IG9yIFByb2Nlc3Mgd2l0aGluIGFub3RoZXIgUGx1Z2luIHRoYXQgaXQgZXh0ZW5kcy4gIFNpbWlsYXIgdG8gVU1MIDIuMCdzICdwYWNrYWdlIG1lcmdlJyBtZWNoYW5pc20gdHJhbnNmb3JtYXRpb24gaW50ZXJwcmV0YXRpb25zLCBpbnRlcnByZXRpbmcgdGhlc2UgTWV0aG9kIFBsdWdpbiBtZWNoYW5pc21zIHJlc3VsdHMgaW50byBuZXcgZXh0ZW5kZWQgTWV0aG9kIENvbnRlbnQgYW5kIFByb2Nlc3Nlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOk1ldGhvZFVuaXQiPgotCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJSZWZlcmVuY2VkTWV0aG9kUGx1Z2luIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJNZXRob2RQYWNrYWdlIiB0eXBlPSJ1bWE6TWV0aG9kUGFja2FnZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9InVzZXJDaGFuZ2VhYmxlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmVsZW1lbnQgbmFtZT0iTWV0aG9kUGx1Z2luIiB0eXBlPSJ1bWE6TWV0aG9kUGx1Z2luIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lhbCBNZXRob2QgVW5pdCB0aGF0IHJlcHJlc2VudHMgYSBwaHlzaWNhbCBjb250YWluZXIgZm9yIE1ldGhvZCBQYWNrYWdlcy4gIEl0IGRlZmluZXMgYSBncmFudWxhcml0eSBsZXZlbCBmb3IgdGhlIG1vZHVsYXJpemF0aW9uIGFuZCBvcmdhbml6YXRpb24gb2YgbWV0aG9kIGNvbnRlbnQgYW5kIHByb2Nlc3Nlcy4gIEEgTWV0aG9kIFBsdWdpbiBjYW4gZXh0ZW5kIG1hbnkgb3RoZXIgTWV0aG9kIFBsdWdpbnMgYW5kIGl0IGNhbiBiZSBleHRlbmRlZCBieSBtYW55IE1ldGhvZCBQbHVnaW5zLiAgSXQgY2FuIGFsc28gYmUgdXNlZCBzdGFuZC1hbG9uZSwgaS5lLiB3aXRoIG5vIEV4dGVuc2lvbiByZWxhdGlvbnNoaXAgdG8gb3RoZXIgcGx1Zy1pbnMuCi1NZXRob2QgUGx1Z2luIGNvbmNlcHR1YWxseSByZXByZXNlbnRzIGEgdW5pdCBmb3IgY29uZmlndXJhdGlvbiwgbW9kdWxhcml6YXRpb24sIGV4dGVuc2lvbiwgcGFja2FnaW5nLCBhbmQgZGVwbG95bWVudCBvZiBtZXRob2QgY29udGVudCBhbmQgcHJvY2Vzc2VzLiAgQSBQcm9jZXNzIEVuZ2luZWVyIHNoYWxsIGRlc2lnbiBoaXMgUGx1Z2lucyBhbmQgYWxsb2NhdGUgaGlzIGNvbnRlbnQgdG8gdGhlc2UgUGx1Z2lucyB3aXRoIHJlcXVpcmVtZW50cyBmb3IgZXh0ZW5zaWJpbGl0eSwgbW9kdWxhcml0eSwgcmV1c2UsIGFuZCBtYWludGFpbmFiaWxpdHkgaW4gbWluZC4KLVNwZWNpYWwgZXh0ZW5zaWJpbGl0eSBtZWNoYW5pc21zIGRlZmluZWQgZm9yIHRoZSBtZXRhLWNsYXNzZXMgVmFyaWFiaWxpdHkgRWxlbWVudCBhbmQgUHJvY2VzcyBDb250cmlidXRpb24gYWxsb3cgUGx1Z2luIGNvbnRlbnQgdG8gZGlyZWN0bHkgY29udHJpYnV0ZSBuZXcgY29udGVudCwgcmVwbGFjZSBleGlzdGluZyBjb250ZW50LCBvciB0byBjcm9zcy1yZWZlcmVuY2UgdG8gYW55IENvbnRlbnQgRWxlbWVudCBvciBQcm9jZXNzIHdpdGhpbiBhbm90aGVyIFBsdWdpbiB0aGF0IGl0IGV4dGVuZHMuICBTaW1pbGFyIHRvIFVNTCAyLjAncyAncGFja2FnZSBtZXJnZScgbWVjaGFuaXNtIHRyYW5zZm9ybWF0aW9uIGludGVycHJldGF0aW9ucywgaW50ZXJwcmV0aW5nIHRoZXNlIE1ldGhvZCBQbHVnaW4gbWVjaGFuaXNtcyByZXN1bHRzIGludG8gbmV3IGV4dGVuZGVkIE1ldGhvZCBDb250ZW50IGFuZCBQcm9jZXNzZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQk8L3hzZDplbGVtZW50PgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iTWV0aG9kQ29uZmlndXJhdGlvbiI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIGNvbGxlY3Rpb24gb2Ygc2VsZWN0ZWQgTWV0aG9kIE1vZGVscyBhbmQgTWV0aG9kUGFja2FnZXMuIEEgY29uZmlndXJhdGlvbiBjYW4gYmUgZXhwb3J0ZWQgaW50byBpdHMgb3duIHN0YW5kYWxvbmUgbGlicmFyeSB3aGVuIGl0IGluY2x1ZGVzIHRoZSBmdWxsIHRyYW5zaXRpdmUgY2xvc3VyZSBvZiBhbGwgZWxlbWVudHMgYWxsIG90aGVyIGVsZW1lbnRzIGRlcGVuZCBvbi48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOk1ldGhvZFVuaXQiPgotCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJCYXNlQ29uZmlndXJhdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iTWV0aG9kUGx1Z2luU2VsZWN0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJNZXRob2RQYWNrYWdlU2VsZWN0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJEZWZhdWx0VmlldyIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJQcm9jZXNzVmlldyIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iU3VidHJhY3RlZENhdGVnb3J5IiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJBZGRlZENhdGVnb3J5IiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6ZWxlbWVudCBuYW1lPSJNZXRob2RDb25maWd1cmF0aW9uIiB0eXBlPSJ1bWE6TWV0aG9kQ29uZmlndXJhdGlvbiI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIGNvbGxlY3Rpb24gb2Ygc2VsZWN0ZWQgTWV0aG9kIE1vZGVscyBhbmQgTWV0aG9kUGFja2FnZXMuIEEgY29uZmlndXJhdGlvbiBjYW4gYmUgZXhwb3J0ZWQgaW50byBpdHMgb3duIHN0YW5kYWxvbmUgbGlicmFyeSB3aGVuIGl0IGluY2x1ZGVzIHRoZSBmdWxsIHRyYW5zaXRpdmUgY2xvc3VyZSBvZiBhbGwgZWxlbWVudHMgYWxsIG90aGVyIGVsZW1lbnRzIGRlcGVuZCBvbi48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCTwveHNkOmVsZW1lbnQ+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJNZXRob2RMaWJyYXJ5Ij4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgTWV0aG9kIExpYnJhcnkgaXMgYSBwaHlzaWNhbCBjb250YWluZXIgZm9yIE1ldGhvZCBQbHVnaW5zIGFuZCBNZXRob2QgQ29uZmlndXJhdGlvbiBkZWZpbml0aW9ucy4gIEFsbCBNZXRob2QgRWxlbWVudHMgYXJlIHN0b3JlZCBpbiBhIE1ldGhvZCBMaWJyYXJ5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6TWV0aG9kVW5pdCI+Ci0JCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Ik1ldGhvZFBsdWdpbiIgdHlwZT0idW1hOk1ldGhvZFBsdWdpbiIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iTWV0aG9kQ29uZmlndXJhdGlvbiIgdHlwZT0idW1hOk1ldGhvZENvbmZpZ3VyYXRpb24iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0b29sIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlRoZSB0b29sIHRoYXQgZ2VuZXJhdGVkIHRoZSBYTUwgZmlsZS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDplbGVtZW50IG5hbWU9Ik1ldGhvZExpYnJhcnkiIHR5cGU9InVtYTpNZXRob2RMaWJyYXJ5Ij4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgTWV0aG9kIExpYnJhcnkgaXMgYSBwaHlzaWNhbCBjb250YWluZXIgZm9yIE1ldGhvZCBQbHVnaW5zIGFuZCBNZXRob2QgQ29uZmlndXJhdGlvbiBkZWZpbml0aW9ucy4gIEFsbCBNZXRob2QgRWxlbWVudHMgYXJlIHN0b3JlZCBpbiBhIE1ldGhvZCBMaWJyYXJ5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JPC94c2Q6ZWxlbWVudD4KLTwveHNkOnNjaGVtYT4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9tb2RlbC9FUEZfU2NoZW1hXzIwMDgwMTI3MDk0Mi54c2QgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvbW9kZWwvRVBGX1NjaGVtYV8yMDA4MDEyNzA5NDIueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOWU2NDBjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9tb2RlbC9FUEZfU2NoZW1hXzIwMDgwMTI3MDk0Mi54c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxNDQxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tIEVQRiBVTUEgWE1MIERhdGEgSW50ZXJjaGFuZ2UgU2NoZW1hIC0tPgotPHhzZDpzY2hlbWEgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgeG1sbnM6dW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjUiIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC41Ij4KLQk8eHNkOnNpbXBsZVR5cGUgbmFtZT0iV29ya09yZGVyVHlwZSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5SZXByZXNlbnRzIGEgcmVsYXRpb25zaGlwIGJldHdlZW4gdHdvIEJyZWFrZG93biBFbGVtZW50IGluIHdoaWNoIG9uZSBCcmVha2Rvd24gRWxlbWVudCBkZXBlbmRzIG9uIHRoZSBzdGFydCBvciBmaW5pc2ggb2YgYW5vdGhlciBCcmVha2Rvd24gRWxlbWVudCBpbiBvcmRlciB0byBiZWdpbiBvciBlbmQuIFRoaXMgZW51bWVyYXRpb24gZGVmaW5lcyB0aGUgZGlmZmVyZW50IHR5cGVzIG9mIFdvcmsgT3JkZXIgcmVsYXRpb25zaGlwcyBhdmFpbGFibGUgaW4gVU1BIGFuZCBpcyB1c2VkIHRvIHByb3ZpZGUgdmFsdWVzIGZvciBXb3JrIE9yZGVyJ3MgbGlua1R5cGUgYXR0cmlidXRlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOk5DTmFtZSI+Ci0JCQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJmaW5pc2hUb1N0YXJ0Ii8+Ci0JCQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJmaW5pc2hUb0ZpbmlzaCIvPgotCQkJPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ic3RhcnRUb1N0YXJ0Ii8+Ci0JCQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJzdGFydFRvRmluaXNoIi8+Ci0JCTwveHNkOnJlc3RyaWN0aW9uPgotCTwveHNkOnNpbXBsZVR5cGU+Ci0JPHhzZDpzaW1wbGVUeXBlIG5hbWU9IlZhcmlhYmlsaXR5VHlwZSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BbiBFbnVtZXJhdGlvbiB1c2VkIGZvciB2YWx1ZXMgZm9yIGluc3RhbmNlcyBvZiBWYXJpYWJpbGl0eSBFbGVtZW50J3MgYXR0cmlidXRlIHZhcmlhYmlsaXR5VHlwZS4gIEl0IGRlZmluZXMgdGhlIG5hdHVyZSBvZiBob3cgYSBWYXJpYWJpbGl0eSBFbGVtZW50IGV4dGVuZHMgYW5vdGhlciBWYXJpYWJpbGl0eSBFbGVtZW50LiBTZWUgZW51bWVyYXRpb24gbGl0ZXJhbHMgZm9yIGRlZmluaXRpb25zIGZvciBlYWNoIHR5cGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6TkNOYW1lIj4KLQkJCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Im5hIi8+Ci0JCQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJjb250cmlidXRlcyIvPgotCQkJPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iZXh0ZW5kcyIvPgotCQkJPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0icmVwbGFjZXMiLz4KLQkJCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImxvY2FsQ29udHJpYnV0aW9uIi8+Ci0JCQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJsb2NhbFJlcGxhY2VtZW50Ii8+Ci0JCQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJleHRlbmRzUmVwbGFjZXMiLz4KLQkJPC94c2Q6cmVzdHJpY3Rpb24+Ci0JPC94c2Q6c2ltcGxlVHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkVsZW1lbnQiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBVTUwgMi4wIG1ldGEtY2xhc3MgRWxlbWVudC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iTmFtZWRFbGVtZW50Ij4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgVU1MIDIuMCBtZXRhLWNsYXNzIE5hbWVkIEVsZW1lbnQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpFbGVtZW50Ij4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUGFja2FnZWFibGVFbGVtZW50Ij4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgVU1MIDIuMCBtZXRhLWNsYXNzIFBhY2thZ2FibGUgRWxlbWVudC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOk5hbWVkRWxlbWVudCIvPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvIj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpQYWNrYWdlYWJsZUVsZW1lbnQiPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImlzUHJpbWFyeUV4dGVuc2lvbiIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJNZXRob2RFbGVtZW50Ij4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPlRoZSByb290IGdlbmVyYWxpemF0aW9uIGZvciBhbGwgVU1BIE1ldGhvZCBFbGVtZW50cy4gIERlZmluZXMgYSBjb21tb24gc2V0IG9mIGF0dHJpYnV0ZXMgaW5oZXJpdGVkIGJ5IGFsbCBVTUEgTWV0aG9kIEVsZW1lbnRzLiAgTWV0aG9kIEVsZW1lbnQgaXRzZWxmIGlzIGRlcml2ZWQgZnJvbSBQYWNrYWdlYWJsZSBFbGVtZW50IGZyb20gdGhlIFVNTCAyLjAgSW5mcmFzdHJ1Y3R1cmUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpQYWNrYWdlYWJsZUVsZW1lbnQiPgotCQkJCTx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iT3duZWRSdWxlIiB0eXBlPSJ1bWE6Q29uc3RyYWludCI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgdGhlIHBhY2thZ2luZyBydWxlcyBmb3IgdGhpcyBNZXRob2QgRWxlbWVudC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Ik1ldGhvZEVsZW1lbnRQcm9wZXJ0eSIgdHlwZT0idW1hOk1ldGhvZEVsZW1lbnRQcm9wZXJ0eSIvPgotCQkJCTwveHNkOmNob2ljZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5FdmVyeSBpbnN0YW5jZSBvZiBNZXRob2QgRWxlbWVudCBoYXMgYSBnbG9iYWwgdW5pcXVlIGlkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImJyaWVmRGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+RXZlcnkgaW5zdGFuY2Ugb2YgTWV0aG9kIEVsZW1lbnQgc2hhbGwgYmUgYnJpZWZseSBkZXNjcmliZWQgd2l0aCBvbmUgb3IgdHdvIHNlbnRlbmNlcyBzdW1tYXJpemluZyB0aGUgZWxlbWVudC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzdXBwcmVzc2VkIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5JZiBhIFZhcmlhYmlsaXR5IEVsZW1lbnQgaXMgZGVyaXZlZCBmcm9tIGFub3RoZXIgVmFyaWFiaWxpdHkgRWxlbWVudCB1c2luZyB0aGUgImV4dGVuZHMiIFZhcmlhYmlsaXR5IFNwZWNpYWxpemF0aW9uLCB0aGVuIHRoaXMgYXR0cmlidXRlIGNhbiBiZSB1c2VkIHRvIHN1cHByZXNzIGluaGVyaXRlZCBNZXRob2QgRWxlbWVudHMgdGhhdCB3ZXJlIHBhcnQgb2YgdGhlIGJhc2VkLW9uIFZhcmlhYmlsaXR5IEVsZW1lbnQsIHdoaWNoIGNhbiBiZSBhbnkgdHlwZSBvZiBNZXRob2QgRWxlbWVudC4gIEluIG90aGVyIHdvcmRzLCBpZiB0aGlzIGF0dHJpYnV0ZSBpcyBzZXQgdG8gdHJ1ZSBvbiBhIE1ldGhvZCBFbGVtZW50IHRoYXQgaGFzIHRoZSBzYW1lIG5hbWUgdGhhbiBhbiBpbmhlcml0ZWQgbWV0aG9kIGVsZW1lbnQgdGhlbiBpdCB3aWxsIG5vdCBiZSByZWdhcmRlZCBhcyBpbmhlcml0ZWQgYXQgYWxsLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9Im9yZGVyaW5nR3VpZGUiIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+VXNlZCBmb3IgQ0FTRSB0b29sIHJlYWxpemF0aW9ucyBvZiB0aGlzIG1vZGVsIHRvIGNvbnRhaW4gaW5mb3JtYXRpb24gYWJvdXQgbGF5b3V0IGFuZCBvcmRlcmluZyBvZiB0aGUgbWV0aG9kIGVsZW1lbnQgYW5kIGl0cyBwYXJ0cy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJwcmVzZW50YXRpb25OYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkV2ZXJ5IERlc2NyaWJhYmxlIEVsZW1lbnQgaGFzIGEgcHJlc2VudGF0aW9uIG5hbWUsIHdoaWNoIGlzIHVzZWQgZm9yIGV4dGVybmFsIHByZXNlbnRhdGlvbiBvZiB0aGUgZWxlbWVudC4gIEZvciBleGFtcGxlLCBuYW1lICh0aGUgaW50ZXJuYWwgcmVwcmVzZW50YXRpb24pIG1pZ2h0IGJlIHNldCB0byAicnVwX2FyY2hpdGVjdHVyZV9kb2N1bWVudCIgdG8gZGlmZmVyZW50aWF0ZSBmcm9tIGEgImoyZWVfYXJjaGl0Y3R1cmVfZG9jdW1lbnQiIHdoZXJlYXMgdGhlIGV4dGVybmFsIHByZXNlbnRhdGlvbiB3b3VsZCBhbHdheXMgYmUgIkFyY2hpdGVjdHVyZSBEb2N1bWVudCIuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iQ29uc3RyYWludCI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIGdlbmVyYWxpemVkIE1ldGhvZCBFbGVtZW50IHRoYXQgcmVwcmVzZW50cyBhIGNvbmRpdGlvbiBvciByZXN0cmljdGlvbiBleHByZXNzZWQgaW4gbmF0dXJhbCBsYW5ndWFnZSB0ZXh0IG9yIGluIGEgbWFjaGluZSByZWFkYWJsZSBsYW5ndWFnZSBmb3IgdGhlIHB1cnBvc2Ugb2YgZGVjbGFyaW5nIHNvbWUgb2YgdGhlIHNlbWFudGljcyBvZiBhIE1ldGhvZCBFbGVtZW50LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6TWV0aG9kRWxlbWVudCI+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWFpbkRlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlN0b3JlcyB0aGUgbWFpbiBkZWZpbml0aW9uIG9mIHRoZSBjb25zdHJhaW50LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ik1ldGhvZEVsZW1lbnRQcm9wZXJ0eSI+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6UGFja2FnZWFibGVFbGVtZW50Ij4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ2YWx1ZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlNlY3Rpb24iPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWFsIE1ldGhvZCBFbGVtZW50IHRoYXQgcmVwcmVzZW50cyBzdHJ1Y3R1cmFsIHN1YnNlY3Rpb25zIG9mIGEgQ29udGVudCBEZXNjcmlwdGlvbidzIHNlY3Rpb25EZXNjcmlwdGlvbiBhdHRyaWJ1dGUuICBJdCBpcyB1c2VkIGZvciBlaXRoZXIgbGFyZ2Ugc2NhbGUgZG9jdW1lbnRhdGlvbiBvZiBDb250ZW50IEVsZW1lbnRzIG9yZ2FuaXplZCBpbnRvIHNlY3Rpb25zIGFzIHdlbGwgYXMgdG8gZmxleGlibHkgYWRkIG5ldyBTZWN0aW9ucyB0byBDb250ZW50IEVsZW1lbnRzIHVzaW5nIGNvbnRyaWJ1dGlvbiB2YXJpYWJpbGl0eSBhZGRlZCB0byB0aGUgU2VjdGlvbiBjb25jZXB0IGZvciBNZXRob2QgUGx1Zy1pbnMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpNZXRob2RFbGVtZW50Ij4KLQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iU3ViU2VjdGlvbiIgdHlwZT0idW1hOlNlY3Rpb24iIG1pbk9jY3Vycz0iMCIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUHJlZGVjZXNzb3IiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iRGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlRoaXMgYXR0cmlidXRlcyBzdG9yZSB0aGUgZGVzY3JpcHRpb24gdGV4dCBmb3IgYSBDb250ZW50IERlc2NyaXB0aW9uJ3MgU2VjdGlvbi48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzZWN0aW9uTmFtZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5FdmVyeSBTZWN0aW9uIGhhcyBhIG5hbWUgdXNlZCBmb3IgZXh0ZXJuYWwgcHJlc2VudGF0aW9uIG9mIHRoZSBzZWN0aW9uLCBlLmcuIHdoZW4gcHVibGlzaGVkIG9yIHdoZW4gc2VjdGlvbiBoZWFkaW5nIGFyZSBsaXN0ZWQgaW4gYSB0YWJsZSBvZiBjb250ZW50cy4gIFRoaXMgYXR0cmlidXRlIGlzIHNpbWlsYXIgdG8gUHJlc2VudGF0aW9uIE5hbWUgZm9yIENvbnRlbnQgRWxlbWVudHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0idmFyaWFiaWxpdHlUeXBlIiB0eXBlPSJ1bWE6VmFyaWFiaWxpdHlUeXBlIi8+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0idmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ik1ldGhvZFVuaXQiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWFsIE1ldGhvZCBFbGVtZW50IHRoYXQgc2hhbGwgYmUgbWFpbnRhaW5lZCBpbiBhIE1ldGhvZCBMaWJyYXJ5IGFzIGEgc2VwYXJhdGUgdW5pdCBvZiBjb250cm9sLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6TWV0aG9kRWxlbWVudCI+Ci0JCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkNvcHlyaWdodCIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0iYXV0aG9ycyIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5FdmVyeSBNZXRob2QgVW5pdCBpcyBiZWluZyBjcmVhdGVkIGFuZCBvd25lZCBieSBhbiBhdXRob3Igb3IgYXV0aG9yaW5nIHRlYW0uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2hhbmdlRGF0ZSIgdHlwZT0ieHNkOmRhdGVUaW1lIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBkYXRlIHRoZSBsYXN0IGNoYW5nZSB0aGF0IHJlc3VsdGVkIGludG8gdGhpcyB2ZXJzaW9uIGhhcyBiZWVuIG1hZGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2hhbmdlRGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+VGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBsYXN0IGNoYW5nZSB0aGF0IHJlc3VsdGVkIGludG8gdGhpcyB2ZXJzaW9uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9InZlcnNpb24iIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+RXZlcnkgUGFja2FnZSBoYXMgYSB2ZXJzaW9uIG51bWJlciB1c2VkIHRvIHRyYWNrIGNoYW5nZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iQ29udGVudERlc2NyaXB0aW9uIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgZ2VuZXJhbGl6ZWQgTWV0aG9kIEVsZW1lbnQgdGhhdCBpcyB1c2VkIHRvIHN0b3JlIHRoZSB0ZXh0dWFsIGRlc2NyaXB0aW9uIGZvciBhIENvbnRlbnQgRWxlbWVudC4gIEl0IGRlZmluZXMgc3RhbmRhcmQgYXR0cmlidXRlcyBhcHBsaWNhYmxlIGZvciBhbGwgQ29udGVudCBFbGVtZW50IHR5cGVzLiAgU3BlY2lmaWMgQ29udGVudCBFbGVtZW50IHN1Yi10eXBlcyBjYW4gZGVmaW5lIHRoZWlyIG93biBtYXRjaGluZyBDb250ZW50IERlc2NyaXB0aW9uIHN1Yi10eXBlcy4gPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpNZXRob2RVbml0Ij4KLQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iTWFpbkRlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5TdG9yZXMgdGhlIG1haW4gZGVzY3JpcHRpdmUgdGV4dCBmb3IgdGhlIENvbnRlbnQgRWxlbWVudC4gIEFsbCB0ZXh0IHRoYXQgaXMgbm90IHBhcnQgb2YgYW55IG9mIHRoZSBtb3JlIHNwZWNpZmljIGF0dHJpYnV0ZXMgc2hhbGwgYmUgc3RvcmVkIGhlcmUuICBJZiB0aGUgQ29udGVudCBEZXNjcmlwdGlvbiBpcyBkaXZpZGVkIGludG8gc2VjdGlvbnMgdXNpbmcgdGhlIFNlY3Rpb24gY2xhc3MsIHRoZW4gb25seSB0aGUgdGV4dCBmcm9tIHRoZSAnc3RhcnQnIG9mIHRoZSBjb250ZW50IGRlc2NyaXB0aW9uIHRvIHRoZSBmaXJzdCBzZWN0aW9uIHdpbGwgYmUgc3RvcmVkIGhlcmUgKHNpbWlsYXIgdG8gYSBub3JtYWwgZG9jdW1lbnQgd2hlcmUgeW91IGNhbiBwbGFjZSB0ZXh0IGJldHdlZW4gaXRzIGJlZ2lubmluZyB0byBpdHMgZmlyc3QgZGljdGlvbiBoZWFkaW5nKS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IktleUNvbnNpZGVyYXRpb25zIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5Qcm92aWRlcyBhZHZpc2UgYW5kIGd1aWRhbmNlIG9mIGEgY3JpdGljYWwgbmF0dXJlIGZvciB0aGUgY29udGVudCBlbGVtZW50IGFzIHdlbGwgYXMgd2FybmluZ3MsIGNhdXRpb25zLCBwaXRmYWxscywgZGFuZ2Vycy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlNlY3Rpb24iIHR5cGU9InVtYTpTZWN0aW9uIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0iZXh0ZXJuYWxJZCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BbiBleHRlcm5hbCB2aXNpYmxlIG51bWJlciB0aGF0IGlzIHVzZWQgdG8gcmVmZXJlbmNlIHRoaXMgYXJ0aWZhY3QuIFVzZWQgbGlrZSBhIHN5bm9ueW0uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iR3VpZGFuY2VEZXNjcmlwdGlvbiI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIGdlbmVyYWxpemVkIENvbnRlbnQgRGVzY3JpcHRpb24gdGhhdCBpcyB1c2VkIHRvIHN0b3JlIHRoZSB0ZXh0dWFsIGRlc2NyaXB0aW9uIGZvciBhIEd1aWRhbmNlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6Q29udGVudERlc2NyaXB0aW9uIj4KLQkJCQk8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQXR0YWNobWVudCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlRoaXMgZmllbGQgaXMgcHJpbWFyaWx5IHVzZWQgZm9yIGF0dGFjaG1lbnRzIGF1Z21lbnRpbmcgdGhlIGluZm9ybWF0aW9uIHByb3ZpZGVkIGZvciBndWlkYW5jZS4gIEluIHBhcnRpY3VsYXIgdGhlIGF0dHJpYnV0ZSBpcyB1c2VkIGZvciBUZW1wbGF0ZXMsIEV4YW1wbGVzLCBhbmQgUmV1c2FibGUgQXNzZXRzIHRvIGNvbnRhaW4gdGhlIGFjdHVhbCBhdHRhY2htZW50IGRlc2NyaWJlZCBpbiB0aGUgbWFpbkRlc2NyaXB0aW9uLiAgSXQgY2FuIGFkZGl0aW9uYWxseSBjb250YWluIHJlcHJlc2VudGF0aW9ucyBvZiB0aGUgZ3VpZGFuY2UgaW4ganVzdCBhIHRoaXJkIHBhcnR5IGZvcm1hdCwgZS5nLiBQREYsIE1TIFdvcmQsIG9yIFdvcmQgUGVyZmVjdC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUHJhY3RpY2VEZXNjcmlwdGlvbiI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIGdlbmVyYWxpemVkIENvbnRlbnQgRGVzY3JpcHRpb24gdGhhdCBpcyB1c2VkIHRvIHN0b3JlIHRoZSB0ZXh0dWFsIGRlc2NyaXB0aW9uIGZvciBhIFByYWN0aWNlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6Q29udGVudERlc2NyaXB0aW9uIj4KLQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQWRkaXRpb25hbEluZm8iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkFueSBhZGRpdGlvbmFsIEluZm9ybWF0aW9uIG5vdCBjb3ZlcmVkIGJ5IHRoZSBvdGhlciBhdHRyaWJ1dGVzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQXBwbGljYXRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkRlc2NyaWJlcyBob3cgdGhlIFByYWN0aWNlIGlzIGJlaW5nIGFwcGxpZWQgb3IgaW50cm9kdWNlZCBpbnRvIHRoZSBjb250ZXh0IGRlc2NyaWJlZCBpbiBiYWNrZ3JvdW5kLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQmFja2dyb3VuZCIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+RWxhYm9yYXRpb24gb24gdGhlIGJhY2tncm91bmQgYW5kIHRoZSBjb250ZXh0IGluIHdoaWNoIHRoZSBwcm9ibGVtIG9jY3VycyBhbmQgd2hlcmUgdGhlIHNvbHV0aW9uIGRlc2NyaWJlZCBieSB0aGlzIFByYWN0aWNlIHdpbGwgZml0IGluLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iR29hbHMiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3VtbWFyeSBvZiB0aGUgb3ZlcmFsbCBnb2FscyB0byBiZSBhZGRyZXNzZWQgYnkgdGhlIFByYWN0aWNlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iTGV2ZWxzT2ZBZG9wdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+T3V0bGluZXMgdGhlIGRpZmZlcmVudCBmb3JtcyBvciB2YXJpYW50cyBpbiB3aGljaCB0aGUgcHJhY3RpY2UgY291bGQgYmUgcmVhbGl6ZWQuIChlLmcuIGZ1bGwgYWRvcHRpb24gdmVydXMgYSBwYXJ0aWFsIGFkb3B0aW9uIG9mIHRoZSBQcmFjdGljZSk8L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlByb2JsZW0iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgZGVzY3JpcHRpb24gb2YgdGhlIHByb2JsZW0gdGhlIFByYWN0aWNlIGFkZHJlc3Nlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJXb3JrUHJvZHVjdERlc2NyaXB0aW9uIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgZ2VuZXJhbGl6ZWQgQ29udGVudCBEZXNjcmlwdGlvbiB0aGF0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIHRleHR1YWwgZGVzY3JpcHRpb24gZm9yIGEgV29yayBQcm9kdWN0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6Q29udGVudERlc2NyaXB0aW9uIj4KLQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iSW1wYWN0T2ZOb3RIYXZpbmciIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkRlc2NyaWJlcyB0aGUgY29uc2VxdWVuY2VzIG9mIG5vdCBwcm9kdWNpbmcgdGhlIHdvcmsgcHJvZHVjdC4gIFRoaXMgaXMgaW50ZW5kZWQgdG8gYWlkIGluIHRoZSB0YWlsb3JpbmcgdGhlIG1ldGhvZC9wcm9jZXNzIHRvIHRoZSBuZWVkcyBvZiBhIHNwZWNpZmljIHByb2plY3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJQdXJwb3NlIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5EZXNjcmliZXMgd2h5IHRoZSB3b3JrIHByb2R1Y3QgaXMgcHJvZHVjZWQgYW5kIHRvIHdoYXQgdXNlIGl0IHdpbGwgYmUgcHV0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUmVhc29uc0Zvck5vdE5lZWRpbmciIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkRlc2NyaWJlcyB0aGUgY2lyY3Vtc3RhbmNlcyBpbiB3aGljaCBpdCBpcyByZWFzb25hYmxlIG5vdCB0byBwcm9kdWNlIHRoZSB3b3JrIHByb2R1Y3QuICBUaGlzIGlzIGludGVuZGVkIHRvIGFpZCBpbiB0aGUgdGFpbG9yaW5nIG9mIHRoZSBtZXRob2QvcHJvY2VzcyB0byB0aGUgbmVlZHMgb2YgYSBzcGVjaWZpYyBwcm9qZWN0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkFydGlmYWN0RGVzY3JpcHRpb24iPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBnZW5lcmFsaXplZCBXb3JrIFByb2R1Y3QgRGVzY3JpcHRpb24gdGhhdCBpcyB1c2VkIHRvIHN0b3JlIHRoZSB0ZXh0dWFsIGRlc2NyaXB0aW9uIGZvciBhbiBBcnRpZmFjdC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOldvcmtQcm9kdWN0RGVzY3JpcHRpb24iPgotCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJCcmllZk91dGxpbmUiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlByb3ZpZGVzIGEgYnJpZWYgZGVzY3JpcHRpb24gb2YgdGhlIGluZm9ybWF0aW9uIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoaXMgYXJ0aWZhY3QuIEZvciBleGFtcGxlLCBkaXNjdXNzZXMgdGhlIGNvbnRlbnRzIGZvciBrZXkgY2hhcHRlcnMgb2YgYSBkb2N1bWVudCBhcnRpZmFjdCBvciB0aGUga2V5IHBhY2thZ2VzIGFuZCBtb2R1bGVzIG9mIGEgbW9kZWwgYXJ0aWZhY3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJSZXByZXNlbnRhdGlvbk9wdGlvbnMiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkRpc2N1c3NlcyBkaWZmZXJlbnQgcG9zc2libGUgYWx0ZXJuYXRpdmUgcmVwcmVzZW50YXRpb25zIGZvciB0aGUgYXJ0aWZhY3QuIEZvciBleGFtcGxlIGEgZGVzaWduIG1vZGVsIGNhbiBiZSByZXByZXNlbnRlZCBhcyBhIFVNTCBtb2RlbCBvciBhbiBpbmZvcm1hbCBibG9jayBkaWFncmFtIG9yIGJ5IHRleHR1YWwgZGVzY3JpcHRpb24gb25seS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlJlcHJlc2VudGF0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Ik5vdGF0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJEZWxpdmVyYWJsZURlc2NyaXB0aW9uIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgZ2VuZXJhbGl6ZWQgV29yayBQcm9kdWN0IERlc2NyaXB0aW9uIHRoYXQgaXMgdXNlZCB0byBzdG9yZSB0aGUgdGV4dHVhbCBkZXNjcmlwdGlvbiBmb3IgYSBEZWxpdmVyYWJsZS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOldvcmtQcm9kdWN0RGVzY3JpcHRpb24iPgotCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJFeHRlcm5hbERlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZGVzY3JpcHRpb24gb2YgdGhlIERlbGl2ZXJhYmxlIHVzZWQgZm9yIGNsaWVudCBkb2N1bWVudHMgKHByb3Bvc2FsLCBzdGF0ZW1lbnRzIG9mIHdvcmsgb3IgY29udHJhY3R1YWwgYWdyZWVtZW50cykuICBJdCBtaWdodCB1c2UgYSBkaWZmZXJlbnQgbGFuZ3VhZ2UgYW5kIGZvbGxvdyBsZWdhbCBjb25zdHJhaW50cy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlBhY2thZ2luZ0d1aWRhbmNlIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5Qcm92aWRlcyBndWlkYW5jZSBvbiBob3cgdG8gYXNzZW1ibGUgdGhlIGRlbGl2ZXJhYmxlIGZyb20gYWxsIGl0cyByZXF1aXJlZCBpbnB1dHMuICBUaGlzIHNlY3Rpb24gZGVzY3JpYmVzIHRoZSBtb3N0IGNvbW1vbiBjb250ZW50IG1lZGl1bSBhbmQgZm9ybWF0LiAgRGlzdHJpYnV0aW9uIG9mIHRoZSBkZWxpdmVyYWJsZSBpcyBhZGRyZXNzZWQgaW4gdGhpcyBzZWN0aW9uLCBpZiBuZWNlc3NhcnkuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUm9sZURlc2NyaXB0aW9uIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgZ2VuZXJhbGl6ZWQgQ29udGVudCBEZXNjcmlwdGlvbiB0aGF0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIHRleHR1YWwgZGVzY3JpcHRpb24gZm9yIGEgUm9sZS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkNvbnRlbnREZXNjcmlwdGlvbiI+Ci0JCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkFzc2lnbm1lbnRBcHByb2FjaGVzIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5Qcm92aWRlcyBndWlkYW5jZSBvbiBmb3IgYXNzaWduaW5nIGluZGl2aWR1YWxzIHRvIHRoZSBSb2xlIGluIHRlcm1zIG9mIHdoYXQgb3RoZXIgcm9sZXMgdGhlc2UgaW5kaXZpZHVhbHMgY291bGQgcGVyZm9ybSBhbmQgd2hhdCByZXNwb25zaWJpbGl0eSBkaWZmZXJlbnQgaW5kaXZpZHVhbHMgYXNzaWduZWQgdG8gdGhpcyByb2xlIG1pZ2h0IGhhdmUuICBUaGUgZ3VpZGFuY2UgY2FuIGFsc28gZGVzY3JpYmUgZGlmZmVyZW50IGFzc2lnbm1lbnQgYXBwcm9hY2hlcyBmb3IgZGlmZmVyZW50IHR5cGVzIG9mIHByb2plY3RzLCBlLmcuIGZvciBsYXJnZSB2ZXJzdXMgc21hbGwgdGVhbXMgd2hlcmUgaW5kaXZpZHVhbHMgY291bGQgYmUgYWxsb2NhdGVkIHRvIHJvbGVzIGZ1bGwgdGltZSB2ZXJzdXMgc2hhcmluZyByb2xlcyB3aXRoaW4gdGhlIHRlYW0uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJTa2lsbHMiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkxpc3RzIG9mIHNldCBvZiByZXF1aXJlZCBza2lsbHMgYSBwZXJzb24gbmVlZHMgdG8gcG9zc2VzcyB0byBmdWxmaWxsIHRoYXQgUm9sZS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlN5bm9ueW1zIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5MaXN0cyBzeW5vbnltcywgaS5lLiBvdGhlciBuYW1lcyB0aGUgUm9sZSBtaWdodCBiZSByZWZlcnJlZCBieS4gIFRvb2wgc3VwcG9ydCBmb3IgdGhlIG1ldGEtbW9kZWwgbWlnaHQgc3VwcG9ydCB0aGF0IGEgUm9sZSBuYW1lIGNhbiBiZSBjb25zaXN0ZW50bHkgYmUgcmVwbGFjZWQgd2l0aCBvbmUgb2YgaXRzIHN5bm9ueW1zIHRocm91Z2h0IGEgUHJvY2Vzcy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJUYXNrRGVzY3JpcHRpb24iPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBnZW5lcmFsaXplZCBDb250ZW50IERlc2NyaXB0aW9uIHRoYXQgaXMgdXNlZCB0byBzdG9yZSB0aGUgdGV4dHVhbCBkZXNjcmlwdGlvbiBmb3IgYSBUYXNrLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6Q29udGVudERlc2NyaXB0aW9uIj4KLQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQWx0ZXJuYXRpdmVzIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5Db21wcmlzZXMgb2Ygc3VtbWFyaWVzIGRlc2NyaWJpbmcgaW1wb3J0YW50IGV4Y2VwdGlvbmFsIGFuZCBub24tc3RhbmRhcmQgd2F5cyBvZiBhY2hpZXZpbmcgdGhpcyBUYXNrJ3MgZGV2ZWxvcG1lbnQgZ29hbHMgdGhhdCB3ZXJlIG5vdCBjb3ZlcmVkIGJ5IHRoZSBUYXNrJ3MgU3RlcHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJQdXJwb3NlIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5TdW1tYXJpemVzIHRoZSBtYWluIHJlYXNvbiBmb3IgcGVyZm9ybWluZyB0aGlzIFRhc2sgYW5kIHdoYXQgaXMgaW50ZW5kZWQgdG8gYmUgYWNoaWV2ZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iRGVzY3JpYmFibGVFbGVtZW50Ij4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkFuIGFic3RyYWN0IGdlbmVyYWxpemF0aW9uIG9mIE1ldGhvZCBFbGVtZW50cyBmb3Igd2hpY2ggZXh0ZXJuYWwgcHJlc2VudGF0aW9uIG5hbWVzIGFzIHdlbGwgYXMgY29udGVudCBkZXNjcmlwdGlvbnMgaGF2ZSBiZWVuIGRlZmluZWQsIHN1Y2ggYXMgUm9sZXMgb3IgV29yayBQcm9kdWN0cy4gIFByZXNlbnRhdGlvbiBOYW1lIGFuZCBDb250ZW50IERlc2NyaXB0aW9ucyBhcmUgdHlwaWNhbGx5IGxvY2FsaXplZCB1c2luZyBhIHJlc291cmNlIGFsbG9jYXRpb24gbWVjaGFuaXNtIGZvciBpdHMgU3RyaW5nIHR5cGUgYXR0cmlidXRlcy4KLVRoaXMgYWJzdHJhY3Rpb24gcmVwcmVzZW50cyBhbGwgZWxlbWVudHMgaW4gdGhlIE1ldGhvZCBDb250ZW50IGFzIHdlbGwgYXMgUHJvY2VzcyBzcGFjZSBmb3Igd2hpY2ggY29uY3JldGUgdGV4dHVhbCBkZXNjcmlwdGlvbnMgYXJlIGRlZmluZWQgaW4gdGhlIGZvcm0gb2YgZG9jdW1lbnRpbmcgYXR0cmlidXRlcyBncm91cGVkIGluIGEgbWF0Y2hpbmcgQ29udGVudCBEZXNjcmlwdGlvbiBpbnN0YW5jZS4gIERlc2NyaWJhYmxlIEVsZW1lbnRzIGFyZSBpbnRlbmRlZCB0byBiZSBwdWJsaXNoZWQgaW4gbWV0aG9kIG9yIHByb2Nlc3MgcHVibGljYXRpb25zIChzaW1pbGFyIHRvIHRoZSBJQk0gUmF0aW9uYWwgVW5pZmllZCBQcm9jZXNzIHdlYikuICBEZXNjcmliYWJsZSBFbGVtZW50IGRlZmluZXMgdGhhdCB0aGUgZWxlbWVudCBpdCByZXByZXNlbnRzIHdpbGwgaGF2ZSBjb250ZW50ICdhdHRhY2hlZCcgdG8gaXQuICBDb250ZW50IERlc2NyaXB0aW9uIGlzIHRoZSBhYnN0cmFjdGlvbiBmb3IgdGhlIGFjdHVhbCBwbGFjZXMgaW4gd2hpY2ggdGhlIGNvbnRlbnQgaXMgYmVpbmcgcmVwcmVzZW50ZWQuICBUaGlzIHNlcGFyYXRpb24gYWxsb3dzIGEgZGlzdGluY3Rpb24gYmV0d2VlbiBjb3JlIG1ldGhvZCBtb2RlbCBlbGVtZW50cyBkZXNjcmliaW5nIHRoZSBzdHJ1Y3R1cmUgb2YgdGhlIG1vZGVsIGZyb20gdGhlIGFjdHVhbCBkZXNjcmlwdGlvbiBjb250YWluZXIgcHJvdmlkaW5nLCBmb3IgZXhhbXBsZSwgdGhlIGRvY3VtZW50YXRpb24gb2YgdGhlIGNvbnRlbnQgZWxlbWVudCBpbiBkaWZmZXJlbnQgYWx0ZXJuYXRpdmVzIGxhbmd1YWdlcywgYXVkaWVuY2VzLCBsaWNlbnNpbmcgbGV2ZWxzLCBldGMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpNZXRob2RFbGVtZW50Ij4KLQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQk8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlByZXNlbnRhdGlvbiIgdHlwZT0idW1hOkNvbnRlbnREZXNjcmlwdGlvbiIvPgotCQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJGdWxmaWxsIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0ic2hhcGVpY29uIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgcmVmZXJlbmNlIHRvIGFuIGljb24gdGhhdCBjYW4gYmUgdXNlZCBmb3IgbW9kZWxpbmcgd2l0aCBzcGVjaWZpYyBDb250ZW50IEVsZW1lbnQgaW5zdGFuY2VzIChhcyBncmFwaGljYWwgc3RlcmVvdHlwZXMsIGUuZy4gYSB1c2UgY2FzZSBzeW1ib2wgZm9yIGEgdXNlIGNhc2UgYXJ0aWZhY3QpIGFzIHdlbGwgYXMgcHVibGljYXRpb24gb2YgY29udGVudC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJub2RlaWNvbiIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHJlZmVyZW5jZSB0byBhbiBpY29uIHRoYXQgY2FuIGJlIHVzZWQgaW4gdHJlZSBicm93c2VyIHByZXNlbnRhdGlvbnMgYW5kIGJyZWFrZG93biBzdHJ1Y3R1cmVzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImlzQWJzdHJhY3QiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iQ29udGVudEVsZW1lbnQiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBEZXNjcmliYWJsZSBFbGVtZW50IHRoYXQgcmVwcmVzZW50cyBhbiBhYnN0cmFjdCBnZW5lcmFsaXphdGlvbiBmb3IgYWxsIGVsZW1lbnRzIHRoYXQgYXJlIGNvbnNpZGVyZWQgdG8gYmUgYW5kIG1hbmFnZWQgYXMgTWV0aG9kIENvbnRlbnQuCi1Db250ZW50IEVsZW1lbnRzIHJlcHJlc2VudHMgcmV1c2FibGUgTWV0aG9kIENvbnRlbnQgdGhhdCBpcyBzdXBwb3NlZCB0byBiZSBtYW5hZ2VkIGluIENvbnRlbnQgUGFja2FnZXMuICBUaGUgc2VwYXJhdGlvbiBvZiBDb250ZW50IEVsZW1lbnQgZnJvbSBQcm9jZXNzIEVsZW1lbnQgYWxsb3dzIHRvIGNsZWFybHkgZGlzdGluZ3Vpc2ggYmV0d2VlbiBwdXJlIG1ldGhvZCBjb250ZW50IGZyb20gY29udGVudCB0aGF0IGlzIHJlcHJlc2VudGVkIGluIHByb2Nlc3Nlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkRlc2NyaWJhYmxlRWxlbWVudCI+Ci0JCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQ2hlY2tsaXN0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQ29uY2VwdCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkV4YW1wbGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJHdWlkZWxpbmUiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJSZXVzYWJsZUFzc2V0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iU3VwcG9ydGluZ01hdGVyaWFsIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iV2hpdGVwYXBlciIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0idmFyaWFiaWxpdHlUeXBlIiB0eXBlPSJ1bWE6VmFyaWFiaWxpdHlUeXBlIi8+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0idmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IktpbmQiPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkNvbnRlbnRFbGVtZW50Ij4KLQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQXBwbGljYWJsZU1ldGFDbGFzc0luZm8iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJHdWlkYW5jZSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5HdWlkYW5jZSBpcyBhbiBhYnN0cmFjdCBnZW5lcmFsaXphdGlvbiBvZiBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlbGF0ZWQgdG8gY29udGVudCBlbGVtZW50cyBzdWNoIGFzIFJvbGVzLCBUYXNrcywgYW5kIFdvcmsgUHJvZHVjdHMuICBFeGFtcGxlcyBmb3IgR3VpZGFuY2UgYXJlIEd1aWRlbGluZXMsIFRlbXBsYXRlcywgQ2hlY2tsaXN0cywgVG9vbCBNZW50b3JzLCBFc3RpbWF0ZXMsIFN1cHBvcnRpbmcgTWF0ZXJpYWxzLCBSZXBvcnRzLCBDb25jZXB0cywgZXRjLiAgVGhpcyBwYWNrYWdlIG9ubHkgY29udGFpbnMgdGhlIGRlZmluaXRpb24gb2YgdGhlIGFic3RyYWN0IEd1aWRhbmNlIGNsYXNzLiAgVGhlIHBhY2thZ2UgR3VpZGFuY2UgVHlwZXMgZGVmaW5lcyBjb25jcmV0ZSBndWlkYW5jZSB0eXBlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkNvbnRlbnRFbGVtZW50Ii8+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iQ29uY2VwdCI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpZmljIHR5cGUgb2YgZ3VpZGFuY2UgdGhhdCBvdXRsaW5lcyBrZXkgaWRlYXMgYXNzb2NpYXRlZCB3aXRoIGJhc2ljIHByaW5jaXBsZXMgdW5kZXJseWluZyB0aGUgcmVmZXJlbmNlZCBpdGVtLiBDb25jZXB0cyBub3JtYWxseSBhZGRyZXNzIG1vcmUgZ2VuZXJhbCB0b3BpY3MgdGhhbiBHdWlkZWxpbmVzIGFuZCBzcGFuIGFjcm9zcyBzZXYtZXJhbCB3b3JrIHByb2R1Y3QgYW5kL29yIHRhc2tzL2FjdGl2aXRpZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpHdWlkYW5jZSIvPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkNoZWNrbGlzdCI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpZmljIHR5cGUgb2YgZ3VpZGFuY2UgdGhhdCBpZGVudGlmaWVzIGEgc2VyaWVzIG9mIGl0ZW1zIHRoYXQgbmVlZCB0byBiZSBjb21wbGV0ZWQgb3IgdmVyaS1maWVkLiAgQ2hlY2tsaXN0cyBhcmUgb2Z0ZW4gdXNlZCBpbiByZXZpZXdzIHN1Y2ggYXMgd2Fsa3Rocm91Z2hzIG9yIGluc3BlY3Rpb25zLiA8L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkd1aWRhbmNlIi8+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iRXhhbXBsZSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpZmljIHR5cGUgb2YgR3VpZGFuY2UgdGhhdCByZXByZXNlbnRzIGEgdHlwaWNhbCwgcGFydGlhbGx5IGNvbXBsZXRlZCwgc2FtcGxlIGluc3RhbmNlIG9mIG9uZSBvciBtb3JlIHdvcmsgcHJvZHVjdHMgb3Igc2NlbmFyaW8gbGlrZSBkZXNjcmlwdGlvbnMgb2YgaG93IFRhc2sgbWF5IGJlIHBlcmZvcm1lZC4gRXhhbXBsZXMgY2FuIGJlIHJlbGF0ZWQgdG8gV29yayBQcm9kdWN0cyBhcyB3ZWxsIGFzIFRhc2tzIHRoYXQgcHJvZHVjZSB0aGVtIGFzIHdlbGwgYXMgYW55IG90aGVyIENvbnRlbnQgRWxlbWVudC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkd1aWRhbmNlIi8+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iR3VpZGVsaW5lIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lmaWMgdHlwZSBvZiBndWlkYW5jZSB0aGF0IHByb3ZpZGVzIGFkZGl0aW9uYWwgZGV0YWlsIG9uIGhvdyB0byBwZXJmb3JtIGEgcGFydGljdWxhciB0YXNrIG9yIGdyb3VwaW5nIG9mIHRhc2tzIChlLmcuIGdyb3VwZWQgdG9nZXRoZXIgYXMgYWN0aXZpdGllcykgb3IgdGhhdCBwcm92aWRlcyBhZGRpdGlvbmFsIGRldGFpbCwgcnVsZXMsIGFuZCByZWNvbW1lbmRhdGlvbnMgb24gd29yayBwcm9kdWN0cyBhbmQgdGhlaXIgcHJvcGVydGllcy4gIEFtb25nc3Qgb3RoZXJzLCBpdCBjYW4gaW5jbHVkZSBkZXRhaWxzIGFib3V0IGJlc3QgcHJhY3RpY2VzIGFuZCBkaWZmZXJlbnQgYXBwcm9hY2hlcyBmb3IgZG9pbmcgd29yaywgaG93IHRvIHVzZSBwYXJ0aWN1bGFyIHR5cGVzIG9mIHdvcmsgcHJvZHVjdHMsIGluZm9ybWF0aW9uIG9uIGRpZmZlcmVudCBzdWJ0eXBlcyBhbmQgdmFyaWFudHMgb2YgdGhlIHdvcmsgcHJvZHVjdCBhbmQgaG93IHRoZXkgZXZvbHZlIHRocm91Z2hvdXQgYSBsaWZlY3ljbGUsIGRpc2N1c3Npb25zIG9uIHNraWxscyB0aGUgcGVyZm9ybWluZyByb2xlcyBzaG91bGQgYWNxdWlyZSBvciBpbXByb3ZlIHVwb24sIG1lYXN1cmVtZW50cyBmb3IgcHJvZ3Jlc3MgYW5kIG1hdHVyaXR5LCBldGMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpHdWlkYW5jZSIvPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkVzdGltYXRlIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lmaWMgdHlwZSBvZiBHdWlkYW5jZSB0aGF0IHByb3ZpZGVzIHNpemluZyBtZWFzdXJlcywgb3Igc3RhbmRhcmRzIGZvciBzaXppbmcgdGhlIHdvcmsgZWZmb3J0IGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIGEgcGFydGljdWxhciBwaWVjZSBvZiB3b3JrIGFuZCBpbnN0cnVjdGlvbnMgZm9yIHRoZWlyIHN1Y2Nlc3NmdWwgdXNlLiBJdCBtYXkgYmUgY29tcHJpc2VkIG9mIGVzdGltYXRpb24gY29uc2lkZXJhdGlvbnMgYW5kIGVzdGltYXRpb24gbWV0cmljcy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkd1aWRhbmNlIj4KLQkJCQk8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkVzdGltYXRpb25NZXRyaWMiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkVzdGltYXRpb25Db25zaWRlcmF0aW9ucyIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCTwveHNkOmNob2ljZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJFc3RpbWF0aW5nTWV0cmljIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lmaWMgdHlwZSBvZiBHdWlkYW5jZSB0aGF0IGRlc2NyaWJlcyBhIG1ldHJpYyBvciBtZWFzdXJlIHRoYXQgaXMgYXNzb2NpYXRlZCB3aXRoIGFuIGVsZW1lbnQgYW5kIHdoaWNoIGlzIHVzZWQgdG8gY2FsY3VsYXRlIHRoZSBzaXplIG9mIHRoZSB3b3JrIGVmZm9ydCBhcyB3ZWxsIGFzIGEgcmFuZ2Ugb2YgcG90ZW50aWFsIGxhYm9yLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6R3VpZGFuY2UiLz4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWZpYyB0eXBlIG9mIEd1aWRhbmNlIHRoYXQgcXVhbGlmaWVzIHRoZSB1c2FnZSBhbmQgYXBwbGljYXRpb24gb2YgZXN0aW1hdGlvbiBtZXRyaWNzIGluIHRoZSBkZXZlbG9wbWVudCBvZiBhbiBhY3R1YWwgZXN0aW1hdGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpHdWlkYW5jZSIvPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlJvYWRtYXAiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWZpYyB0eXBlIG9mIEd1aWRhbmNlIHdoaWNoIGlzIG9ubHkgcmVsYXRlZCB0byBBY3RpdmF0ZXMgYW5kIHRoZXJlZm9yZSBoYXMgYmVlbiBhZGRlZCBieSB0aGlzIHBhY2thZ2UgdG8gdGhlIGxpc3Qgb2YgR3VpZGFuY2UgVHlwZXMgcmF0aGVyIHRoYW4gbGlzdGVkIGluIHRoZSBHdWlkYW5jZSBUeXBlcyBwYWNrYWdlLiAgQSBSb2FkbWFwIHJlcHJlc2VudHMgYSBsaW5lYXIgd2Fsa3Rocm91Z2ggb2YgYW4gQWN0aXZpdHksIHR5cGljYWxseSBhIFByb2Nlc3MuCi1BbiBpbnN0YW5jZSBvZiBhIFJvYWRtYXAgcmVwcmVzZW50cyBpbXBvcnRhbnQgZG9jdW1lbnRhdGlvbiBmb3IgdGhlIEFjdGl2aXR5IG9yIFByb2Nlc3MgaXQgaXMgcmVsYXRlZCB0by4gIE9mdGVuIGEgY29tcGxleCBBY3Rpdml0eSBzdWNoIGFzIGEgUHJvY2VzcyBjYW4gYmUgbXVjaCBlYXNpZXIgdW5kZXJzdG9vZCBieSBwcm92aWRpbmcgYSB3YWxrdGhyb3VnaCB3aXRoIGEgbGluZWFyIHRocmVhZCBvZiBhIHR5cGljYWwgaW5zdGFudGlhdGlvbiBvZiB0aGlzIEFjdGl2aXR5LiAgSW4gYWRkaXRpb24gdG8gbWFraW5nIHRoZSBwcm9jZXNzIHByYWN0aXRpb25lciB1bmRlcnN0YW5kIGhvdyB3b3JrIGluIHRoZSBwcm9jZXNzIGlzIGJlaW5nIHBlcmZvcm1lZCwgYSBSb2FkbWFwIHByb3ZpZGVzIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gYWJvdXQgaG93IEFjdGl2aXRpZXMgYW5kIFRhc2tzIHJlbGF0ZSB0byBlYWNoIG90aGVyIG92ZXIgdGltZS4gIFJvYWRtYXBzIGFyZSBhbHNvIHVzZWQgdG8gc2hvdyBob3cgc3BlY2lmaWMgYXNwZWN0cyBhcmUgZGlzdHJpYnV0ZWQgb3ZlciBhIHdob2xlIHByb2Nlc3MgcHJvdmlkaW5nIGEga2luZCBvZiBmaWx0ZXIgb24gdGhlIHByb2Nlc3MgZm9yIHRoaXMgaW5mb3JtYXRpb24uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpHdWlkYW5jZSIvPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlJlcG9ydCI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHByZWRlZmluZWQgdGVtcGxhdGUgb2YgYSByZXN1bHQgdGhhdCBpcyBnZW5lcmF0ZWQgb24gdGhlIGJhc2lzIG9mIG90aGVyIHdvcmsgcHJvZHVjdHMgYXMgYW4gb3V0cHV0IGZyb20gc29tZSBmb3JtIG9mIHRvb2wgYXV0b21hdGlvbi4gQW4gZXhhbXBsZSBmb3IgYSByZXBvcnQgd291bGQgYmUgYSB1c2UgY2FzZSBtb2RlbCBzdXJ2ZXksIHdoaWNoIGlzIGdlbmVyYXRlZCBieSBleHRyYWN0aW5nIGRpYWdyYW0gaW5mb3JtYXRpb24gZnJvbSBhIGdyYXBoaWNhbCBtb2RlbCBhbmQgdGV4dHVhbCBpbmZvcm1hdGlvbiBmcm9tIGRvY3VtZW50cyBhbmQgY29tYmluZXMgdGhlc2UgdHdvIHR5cGVzIG9mIGluZm9ybWF0aW9uIGludG8gYSByZXBvcnQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpHdWlkYW5jZSIvPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlRlbXBsYXRlIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lmaWMgdHlwZSBvZiBndWlkYW5jZSB0aGF0IHByb3ZpZGVzIGZvciBhIHdvcmsgcHJvZHVjdCBhIHByZS1kZWZpbmVkIHRhYmxlIG9mIGNvbnRlbnRzLCBzZWN0aW9ucywgcGFja2FnZXMsIGFuZC9vciBoZWFkaW5ncywgYSBzdGFuZGFyZGl6ZWQgZm9ybWF0LCBhcyB3ZWxsIGFzIGRlc2NyaXB0aW9ucyBob3cgdGhlIHNlY3Rpb25zIGFuZCBwYWNrYWdlcyBhcmUgc3VwcG9zZWQgdG8gYmUgdXNlZCBhbmQgY29tcGxldGVkLiBUZW1wbGF0ZXMgY2Fubm90IG9ubHkgYmUgcHJvdmlkZWQgZm9yIGRvY3VtZW50cywgYnV0IGFsc28gZm9yIGNvbmNlcHR1YWwgbW9kZWxzIG9yIHBoeXNpY2FsIGRhdGEgc3RvcmVzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6R3VpZGFuY2UiLz4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJTdXBwb3J0aW5nTWF0ZXJpYWwiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBjYXRjaGFsbCBmb3Igb3RoZXIgdHlwZXMgb2YgZ3VpZGFuY2Ugbm90IHNwZWNpZmljYWxseSBkZWZpbmVkIGVsc2V3aGVyZS4gSXQgY2FuIGJlIHJlbGF0ZWQgdG8gYWxsIGtpbmRzIG9mIENvbnRlbnQgRWxlbWVudHMsIGkuZS4gaW5jbHVkaW5nIG90aGVyIGd1aWRhbmNlIGVsZW1lbnRzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6R3VpZGFuY2UiLz4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJUb29sTWVudG9yIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgIHNwZWNpZmljIHR5cGUgb2YgZ3VpZGFuY2UgdGhhdCBzaG93cyBob3cgdG8gdXNlIGEgc3BlY2lmaWMgdG9vbCB0byBhY2NvbXBsaXNoIHNvbWUgcGllY2Ugb2Ygd29yayBhIFdvcmsgUHJvZHVjdCBlaXRoZXIgaW4gdGhlIGNvbnRleHQgb2Ygb3IgaW5kZXBlbmRlbnQgZnJvbSBhIFRhc2sgb3IgQWN0aXZpdHkuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpHdWlkYW5jZSIvPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IldoaXRlcGFwZXIiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWFsIENvbmNlcHQgZ3VpZGFuY2UgdGhhdCBoYXZlIGJlZW4gZXh0ZXJuYWxseSByZXZpZXdlZCBvciBwdWJsaXNoZWQgYW5kIGNhbiBiZSByZWFkIGFuZCB1bmRlcnN0b29kIGluIGlzb2xhdGlvbiBvZiBvdGhlciBjb250ZW50IGVsZW1lbnRzIGFuZCBndWlkYW5jZS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkNvbmNlcHQiLz4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJUZXJtRGVmaW5pdGlvbiI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpZmljIHR5cGUgb2YgZ3VpZGFuY2UgdGhhdCBkZWZpbmVzIGNvbmNlcHRzIGFuZCBhcmUgdXNlZCB0byBidWlsZCB1cCB0aGUgR2xvc3NhcnkuIFRlcm1EZWZpbml0aW9ucyBhcmUgbm90IGRpcmVjdGx5IHJlbGF0ZWQgdG8gQ29udGVudEVsZW1lbnRzLCBidXQgdGhlaXIgcmVsYXRpb25zaGlwIGlzIGJlaW5nIGRlcml2ZWQgd2hlbiB0aGUgVGVybSBpcyB1c2VkIGluIHRoZSBDb250ZW50RWxlbWVudHMgZGVzY3JpcHRpb24gdGV4dC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkd1aWRhbmNlIi8+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUHJhY3RpY2UiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWZpYyB0eXBlIG9mIGd1aWRhbmNlIHRoYXQgcmVwcmVzZW50cyBhIHByb3ZlbiB3YXkgb3Igc3RyYXRlZ3kgb2YgZG9pbmcgd29yayB0byBhY2hpZXZlIGEgZ29hbCB0aGF0IGhhcyBhIHBvc2l0aXZlIGltcGFjdCBvbiB3b3JrIHByb2R1Y3Qgb3IgcHJvY2VzcyBxdWFsaXR5LiAgUHJhY3RpY2VzIGFyZSBkZWZpbmVkIG9ydGhvZ29uYWwgdG8gbWV0aG9kcyBhbmQgcHJvY2Vzc2VzLiAgVGhleSBjb3VsZCBzdW1tYXJpemUgYXNwZWN0cyB0aGF0IGltcGFjdCBtYW55IGRpZmZlcmVudCBwYXJ0cyBvZiBhIG1ldGhvZCBvciBzcGVjaWZpYyBwcm9jZXNzZXMuICBFeGFtcGxlcyBmb3IgcHJhY3RpY2VzIHdvdWxkIGJlICJNYW5hZ2UgUmlza3MiLCAiQ29udGludW91c2x5IHZlcmlmeSBxdWFsaXR5IiwgIkFyY2hpdGVjdHVyZS1jZW50cmljIGFuZCBjb21wb25lbnQtYmFzZWQgZGV2ZWxvcG1lbnQiLCBldGMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpHdWlkYW5jZSI+Ci0JCQkJPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJBY3Rpdml0eVJlZmVyZW5jZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQ29udGVudFJlZmVyZW5jZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iU3ViUHJhY3RpY2UiIHR5cGU9InVtYTpQcmFjdGljZSIvPgotCQkJCTwveHNkOmNob2ljZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJSZXVzYWJsZUFzc2V0Ij4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lmaWMgdHlwZSBvZiBndWlkYW5jZSB0aGF0IHByb3ZpZGVzIGEgc29sdXRpb24gdG8gYSBwcm9ibGVtIGZvciBhIGdpdmVuIGNvbnRleHQuIFRoZSBhc3NldCBtYXkgaGF2ZSBhIHZhcmlhYmlsaXR5IHBvaW50LCB3aGljaCBpcyBhIGxvY2F0aW9uIGluIHRoZSBhc3NldCB0aGF0IG1heSBoYXZlIGEgdmFsdWUgcHJvdmlkZWQgb3IgY3VzdG9taXplZCBieSB0aGUgYXNzZXQgY29uc3VtZXIuIFRoZSBhc3NldCBoYXMgcnVsZXMgZm9yIHVzYWdlIHdoaWNoIGFyZSB0aGUgaW5zdHJ1Y3Rpb25zIGRlc2NyaWJpbmcKLWhvdyB0aGUgYXNzZXQgc2hvdWxkIGJlIHVzZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpHdWlkYW5jZSIvPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IldvcmtQcm9kdWN0Ij4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkFuIGFic3RyYWN0IGNsYXNzIHdoaWNoIHByb3ZpZGVzIGEgZ2VuZXJhbGl6YXRpb24gZm9yIHRoZSBjb250ZW50IGVsZW1lbnQgdHlwZXMgQXJ0aWZhY3QsIE91dGNvbWUsIGFuZCBEZWxpdmVyYWJsZS4gIFRoZSBtZXRhLW1vZGVsIGNsYXNzIFdvcmsgUHJvZHVjdCBhY3R1YWxseSByZXByZXNlbnRzIHdvcmsgcHJvZHVjdCB0eXBlcywgaS5lLiBhbiBpbnN0YW5jZSBvZiBXb3JrIFByb2R1Y3QgaXMgYSBkZXNjcmlwdGlvbiBvZiBhIHNwZWNpZmljIHR5cGUgb2Ygd29yayBwcm9kdWN0IGFuZCBub3QgYW4gaW5kaXZpZHVhbCB3b3JrIHByb2R1Y3QgaW5zdGFuY2UuICBIb3dldmVyLCBmb3Igc2ltcGxpY2l0eSByZWFzb25zIGFuZCBiZWNhdXNlIG9mIGxvdyByaXNrIG9mIG1pc2ludGVycHJldGF0aW9uIHdlIGRpZCBub3QgYXBwZW5kIHRoZSB3b3JkICd0eXBlJyB0byBldmVyeSBtZXRhLWNsYXNzLgotQSB3b3JrIHByb2R1Y3QgaXMgYW4gYWJzdHJhY3Rpb24gZm9yIGRlc2NyaXB0aW9ucyBvZiBjb250ZW50IGVsZW1lbnRzIHRoYXQgYXJlIHVzZWQgdG8gZGVmaW5lIGFueXRoaW5nIHVzZWQsIHByb2R1Y2VkLCBvciBtb2RpZmllZCBieSBhIHRhc2suPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpDb250ZW50RWxlbWVudCI+Ci0JCQkJPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJFc3RpbWF0ZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJSZXBvcnQiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlRlbXBsYXRlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJUb29sTWVudG9yIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJPC94c2Q6Y2hvaWNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkFydGlmYWN0Ij4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgV29yayBQcm9kdWN0IHRoYXQgcHJvdmlkZXMgYSBkZXNjcmlwdGlvbiBhbmQgZGVmaW5pdGlvbiBmb3IgdGFuZ2libGUgd29yayBwcm9kdWN0IHR5cGVzLiBBcnRpZmFjdHMgbWF5IGJlIGNvbXBvc2VkIG9mIG90aGVyIGFydGlmYWN0cy4gRm9yIGV4YW1wbGUsIGEgbW9kZWwgYXJ0aWZhY3QgY2FuIGJlIGNvbXBvc2VkIG9mIG1vZGVsIGVsZW1lbnRzLCB3aGljaCBhcmUgYWxzbyBhcnRpZmFjdHMuCi1BcnRpZmFjdHMgYXJlIHRhbmdpYmxlIHdvcmsgcHJvZHVjdHMgY29uc3VtZWQsIHByb2R1Y2VkLCBvciBtb2RpZmllZCBieSBUYXNrcy4gIEl0IG1heSBzZXJ2ZSBhcyBhIGJhc2lzIGZvciBkZWZpbmluZyByZXVzYWJsZSBhc3NldHMuICBSb2xlcyB1c2UgQXJ0aWZhY3RzIHRvIHBlcmZvcm0gVGFza3MgYW5kIHByb2R1Y2UgQXJ0aWZhY3RzIGluIHRoZSBjb3Vyc2Ugb2YgcGVyZm9ybWluZyBUYXNrcy4gIEFydGlmYWN0cyBhcmUgdGhlIHJlc3BvbnNpYmlsaXR5IG9mIGEgc2luZ2xlIFJvbGUsIG1ha2luZyByZXNwb25zaWJpbGl0eSBlYXN5IHRvIGlkZW50aWZ5IGFuZCB1bmRlcnN0YW5kLCBhbmQgcHJvbW90aW5nIHRoZSBpZGVhIHRoYXQgZXZlcnkgcGllY2Ugb2YgaW5mb3JtYXRpb24gcHJvZHVjZWQgaW4gdGhlIG1ldGhvZCByZXF1aXJlcyB0aGUgYXBwcm9wcmlhdGUgc2V0IG9mIHNraWxscy4gRXZlbiB0aG91Z2ggb25lIHJvbGUgbWlnaHQgIm93biIgYSBzcGVjaWZpYyB0eXBlIG9mIEFydGlmYWN0cywgb3RoZXIgcm9sZXMgY2FuIHN0aWxsIHVzZSB0aGUgQXJ0aWZhY3RzOyBwZXJoYXBzIGV2ZW4gdXBkYXRlIHRoZW0gaWYgdGhlIFJvbGUgaGFzIGJlZW4gZ2l2ZW4gcGVybWlzc2lvbiB0byBkbyBzby48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOldvcmtQcm9kdWN0Ij4KLQkJCQk8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkNvbnRhaW5lZEFydGlmYWN0IiB0eXBlPSJ1bWE6QXJ0aWZhY3QiLz4KLQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iRGVsaXZlcmFibGUiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBXb3JrIFByb2R1Y3QgdGhhdCBwcm92aWRlcyBhIGRlc2NyaXB0aW9uIGFuZCBkZWZpbml0aW9uIGZvciBwYWNrYWdpbmcgb3RoZXIgV29yayBQcm9kdWN0cywgYW5kIG1heSBiZSBkZWxpdmVyZWQgdG8gYW4gaW50ZXJuYWwgb3IgZXh0ZXJuYWwgcGFydHkuICBUaGVyZWZvcmUsIGEgRGVsaXZlcmFibGUgYWdncmVnYXRlcyBvdGhlciBXb3JrIFByb2R1Y3RzLiBUaGVyZWZvcmUsIGEgRGVsaXZlcmFibGUgYWdncmVnYXRlcyBvdGhlciBXb3JrIFByb2R1Y3RzLiAgQSBEZWxpdmVyYWJsZSBpcyB1c2VkIHRvIHByZS1kZWZpbmUgdHlwaWNhbCBvciByZWNvbW1lbmRlZCBjb250ZW50IGluIHRoZSBmb3JtIG9yIHdvcmsgcHJvZHVjdHMgdGhhdCB3b3VsZCBiZSBwYWNrYWdlZCBmb3IgZGVsaXZlcnkuICBUaGUgYWN0dWFsIHBhY2thZ2luZyBvZiB0aGUgRGVsaXZlcmFibGUgaW4gYW4gYWN0dWFsIHByb2Nlc3Mgb3IgZXZlbiBwcm9qZWN0IGNvdWxkIGJlIGEgbW9kaWZpY2F0aW9uIG9mIHRoaXMgcmVjb21tZW5kYXRpb24uICBEZWxpdmVyYWJsZXMgYXJlIHVzZWQgdG8gcmVwcmVzZW50IGFuIG91dHB1dCBmcm9tIGEgcHJvY2VzcyB0aGF0IGhhcyB2YWx1ZSwgbWF0ZXJpYWwgb3Igb3RoZXJ3aXNlLCB0byBhIGNsaWVudCwgY3VzdG9tZXIgb3Igb3RoZXIgc3Rha2Vob2xkZXIuIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6V29ya1Byb2R1Y3QiPgotCQkJCTx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iRGVsaXZlcmVkV29ya1Byb2R1Y3QiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iT3V0Y29tZSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIFdvcmsgUHJvZHVjdCB0aGF0IGRlc2NyaWJlcyBpbnRhbmdpYmxlIHdvcmsgcHJvZHVjdHMgdGhhdCBhcmUgYSByZXN1bHQgb3Igc3RhdGUuIE91dGNvbWVzIG1heSBhbHNvIGJlIHVzZWQgdG8gZGVzY3JpYmUgd29yayBwcm9kdWN0cyB0aGF0IGFyZSBub3QgZm9ybWFsbHkgZGVmaW5lZC4gIEEga2V5IGRpZmZlcmVudGlhdG9yIGZvciBvdXRjb21lcyBhZ2FpbnN0IGFydGlmYWN0cyBpcyB0aGF0IG91dGNvbWVzIGFyZSBub3QgY2FuZGlkYXRlcyBmb3IgaGFydmVzdGluZyBhcyByZXVzYWJsZSBhc3NldHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpXb3JrUHJvZHVjdCIvPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlJvbGUiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBDb250ZW50IEVsZW1lbnQgdGhhdCBkZWZpbmVzIGEgc2V0IG9mIHJlbGF0ZWQgc2tpbGxzLCBjb21wZXRlbmNpZXMsIGFuZCByZXNwb25zaWJpbGl0aWVzLiAgUm9sZXMgYXJlIHVzZWQgYnkgVGFza3MgdG8gZGVmaW5lIHdobyBwZXJmb3JtcyB0aGVtIGFzIHdlbGwgYXMgZGVmaW5lIGEgc2V0IG9mIHdvcmsgcHJvZHVjdHMgdGhleSBhcmUgcmVzcG9uc2libGUgZm9yLiAgCi1BIFJvbGUgZGVmaW5lcyBhIHNldCBvZiByZWxhdGVkIHNraWxscywgY29tcGV0ZW5jaWVzLCBhbmQgcmVzcG9uc2liaWxpdGllcyBvZiBhbiBpbmRpdmlkdWFsIG9yIGEgc2V0IG9mIGluZGl2aWR1YWxzLiAgUm9sZXMgYXJlIG5vdCBpbmRpdmlkdWFscyBvciByZXNvdXJjZXMuICBJbmRpdmlkdWFsIG1lbWJlcnMgb2YgdGhlIGRldmVsb3BtZW50IG9yZ2FuaXphdGlvbiB3aWxsIHdlYXIgZGlmZmVyZW50IGhhdHMsIG9yIHBlcmZvcm0gZGlmZmVyZW50IHJvbGVzLiBUaGUgbWFwcGluZyBmcm9tIGluZGl2aWR1YWwgdG8gcm9sZSwgcGVyZm9ybWVkIGJ5IHRoZSBwcm9qZWN0IG1hbmFnZXIgd2hlbiBwbGFubmluZyBhbmQgc3RhZmZpbmcgZm9yIGEgcHJvamVjdCwgYWxsb3dzIGRpZmZlcmVudCBpbmRpdmlkdWFscyB0byBhY3QgYXMgc2V2ZXJhbCBkaWZmZXJlbnQgcm9sZXMsIGFuZCBmb3IgYSByb2xlIHRvIGJlIHBsYXllZCBieSBzZXZlcmFsIGluZGl2aWR1YWxzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6Q29udGVudEVsZW1lbnQiPgotCQkJCTx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUmVzcG9uc2libGVGb3IiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iVGFzayI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIENvbnRlbnQgRWxlbWVudCB0aGF0IGRlc2NyaWJlcyB3b3JrIGJlaW5nIHBlcmZvcm1lZCBieSBSb2xlcy4gIEl0IGRlZmluZXMgb25lIGRlZmF1bHQgcGVyZm9ybWluZyBSb2xlIGFzIHdlbGwgYXMgbWFueSBhZGRpdGlvbmFsIHBlcmZvcm1lcnMuICBBIFRhc2sgaXMgYXNzb2NpYXRlZCB0byBpbnB1dCBhbmQgb3V0cHV0IHdvcmsgcHJvZHVjdHMuICBJbnB1dHMgYXJlIGRpZmZlcmVudGlhdGVkIGluIG1hbmRhdG9yeSB2ZXJzdXMgb3B0aW9uYWwgaW5wdXRzLiAgVGhlIGFzc29jaWF0aW9ucyB0byBXb3JrIFByb2R1Y3RzIGFyZSBub3QgaW5zdGFudGlhdGFibGUvdmFyaWFibGUtbGlrZSBwYXJhbWV0ZXJzLiAgVGhleSByYXRoZXIgZXhwcmVzcyAoaHlwZXItKWxpbmtzIHRvIHRoZSBkZXNjcmlwdGlvbnMgb2YgdGhlIHdvcmsgcHJvZHVjdHMgdHlwZXMgdGhhdCBhcmUgcmVsYXRlZCB0byB0aGUgVGFzayBhcyBpbnB1dHMgYW5kIG91dHB1dHMuICBJbiBvdGhlciB3b3JkcywgdGhlc2UgYXNzb2NpYXRpb25zIGFyZSBub3QgaW50ZW5kZWQgdG8gYmUgdXNlZCB0byBjYXB0dXJlIHdoaWNoIGNvbmNyZXRlIGluc3RhbmNlcyB3aWxsIGJlIHBhc3NlZCB3aGVuIGluc3RhbnRpYXRpbmcgdGhlIG1ldGhvZCBpbiBhIHByb2plY3QuICBBbGwgb2YgdGhlIFRhc2sncyBkZWZhdWx0IGFzc29jaWF0aW9ucyBjYW4gYmUgb3ZlcnJpZGRlbiBpbiBhbiBhY3R1YWwgcHJvY2VzcyBkZWZpbml0aW9uLgotQSBUYXNrIGRlc2NyaWJlcyBhbiBhc3NpZ25hYmxlIHVuaXQgb2Ygd29yay4gIEV2ZXJ5IFRhc2sgaXMgYXNzaWduZWQgdG8gc3BlY2lmaWMgUm9sZXMuICBUaGUgZ3JhbnVsYXJpdHkgb2YgYSBUYXNrIGlzIGdlbmVyYWxseSBhIGZldyBob3VycyB0byBhIGZldyBkYXlzLiAgSXQgdXN1YWxseSBhZmZlY3RzIG9uZSBvciBvbmx5IGEgc21hbGwgbnVtYmVyIG9mIHdvcmsgcHJvZHVjdHMuIEEgVGFzayBpcyB1c2VkIGFzIGFuIGVsZW1lbnQgb2YgZGVmaW5pbmcgYSBwcm9jZXNzLiBUYXNrcyBhcmUgZnVydGhlciB1c2VkIGZvciBwbGFubmluZyBhbmQgdHJhY2tpbmcgcHJvZ3Jlc3M7IHRoZXJlZm9yZSwgaWYgdGhleSBhcmUgZGVmaW5lZCB0b28gZmluZS1ncmFpbmVkLCB0aGV5IHdpbGwgYmUgbmVnbGVjdGVkLCBhbmQgaWYgdGhleSBhcmUgdG9vIGxhcmdlLCBwcm9ncmVzcyB3b3VsZCBoYXZlIHRvIGJlIGV4cHJlc3NlZCBpbiB0ZXJtcyBvZiBhIFRhc2sncyBwYXJ0cyAoZS5nLiBTdGVwcywgd2hpY2ggaXMgbm90IHJlY29tbWVuZGVkKS4gCi1BIFRhc2sgaGFzIGEgY2xlYXIgcHVycG9zZSBpbiB3aGljaCB0aGUgcGVyZm9ybWluZyByb2xlcyBhY2hpZXZlIGEgd2VsbCBkZWZpbmVkIGdvYWwuICBJdCBwcm92aWRlcyBjb21wbGV0ZSBzdGVwLWJ5LXN0ZXAgZXhwbGFuYXRpb25zIG9mIGRvaW5nIGFsbCB0aGUgd29yayB0aGF0IG5lZWRzIHRvIGJlIGRvbmUgdG8gYWNoaWV2ZSB0aGlzIGdvYWwuICBUaGlzIGRlc2NyaXB0aW9uIGlzIGNvbXBsZXRlLCBpbmRlcGVuZGVudCBvZiB3aGVuIGluIGEgcHJvY2VzcyBsaWZlY3ljbGUgdGhlIHdvcmsgd291bGQgYWN0dWFsbHkgYmUgZG9uZS4gIEl0IHRoZXJlZm9yZSBkb2VzIG5vdCBkZXNjcmliZSB3aGVuIHlvdSBkbyB3aGF0IHdvcmsgYXQgd2hhdCBwb2ludCBvZiB0aW1lLCBidXQgZGVzY3JpYmVzIGFsbCB0aGUgd29yayB0aGF0IGdldHMgZG9uZSB0aHJvdWdob3V0IHRoZSBkZXZlbG9wbWVudCBsaWZlY3ljbGUgdGhhdCBjb250cmlidXRlcyB0byB0aGUgYWNoaWV2ZW1lbnQgb2YgdGhpcyBnb2FsLiAgV2hlbiB0aGUgVGFzayBpcyBiZWluZyBhcHBsaWVkIGluIGEgcHJvY2VzcyB0aGVuIHRoaXMgcHJvY2VzcyBhcHBsaWNhdGlvbiAoZGVmaW5lZCBhcyBUYXNrIERlc2NyaXB0b3IpIHByb3ZpZGVzIHRoZSBpbmZvcm1hdGlvbiBvZiB3aGljaCBwaWVjZXMgb2YgdGhlIFRhc2sgd2lsbCBhY3R1YWxseSBiZSBwZXJmb3JtZWQgYXQgYW55IHBhcnRpY3VsYXIgcG9pbnQgaW4gdGltZS4gVGhpcyBhc3N1bWVzIHRoYXQgdGhlIFRhc2sgd2lsbCBiZSBwZXJmb3JtZWQgaW4gdGhlIHByb2Nlc3Mgb3ZlciBhbmQgb3ZlciBhZ2FpbiwgYnV0IGVhY2ggdGltZSB3aXRoIGEgc2xpZ2h0bHkgZGlmZmVyZW50IGVtcGhhc2lzIG9uIGRpZmZlcmVudCBzdGVwcyBvciBhc3BlY3RzIG9mIHRoZSB0YXNrIGRlc2NyaXB0aW9uLiAKLUZvciBleGFtcGxlLCBhIFRhc2sgc3VjaCBhcyAiRGV2ZWxvcCBVc2UgQ2FzZSBNb2RlbCIgZGVzY3JpYmVzIGFsbCB0aGUgd29yayB0aGF0IG5lZWRzIHRvIGJlIGRvbmUgdG8gZGV2ZWxvcCBhIGNvbXBsZXRlIHVzZSBjYXNlIG1vZGVsLiBUaGlzIHdvdWxkIGNvbXByaXNlIG9mIHRoZSBpZGVudGlmaWNhdGlvbiBhbmQgbmFtaW5nIG9mIHVzZSBjYXNlcyBhbmQgYWN0b3JzLCB0aGUgd3JpdGluZyBvZiBhIGJyaWVmIGRlc2NyaXB0aW9uLCB0aGUgbW9kZWxpbmcgb2YgdXNlIGNhc2VzIGFuZCB0aGVpciByZWxhdGlvbnNoaXBzIGluIGRpYWdyYW1zLCB0aGUgZGV0YWlsZWQgZGVzY3JpcHRpb24gb2YgYSBiYXNpYyBmbG93LCB0aGUgZGV0YWlsZWQgZGVzY3JpcHRpb24gb2YgYWx0ZXJuYXRpdmVzIGZsb3dzLCBwZXJmb3JtaW5nIG9mIHdhbGt0aHJvdWdocyB3b3Jrc2hvcHMgYW5kIHJldmlld3MsIGV0Yy4gIEFsbCBvZiB0aGVzZSBwYXJ0cyBjb250cmlidXRlIHRvIHRoZSBkZXZlbG9wbWVudCBnb2FsIG9mIGRldmVsb3BpbmcgdGhlIHVzZSBjYXNlIG1vZGVsLCBidXQgdGhlIHBhcnRzIHdpbGwgYmUgcGVyZm9ybWVkIGF0IGRpZmZlcmVudCBwb2ludHMgaW4gdGltZSBpbiBhIHByb2Nlc3MuICBJZGVudGlmaWNhdGlvbiwgbmFtaW5nLCBhbmQgYnJpZWYgZGVzY3JpcHRpb25zIHdvdWxkIGJlIHBlcmZvcm1lZCBlYXJseSBpbiBhIHR5cGljYWwgZGV2ZWxvcG1lbnQgcHJvY2VzcyB2ZXJzdXMgdGhlIHdyaXRpbmcgb2YgZGV0YWlsZWQgYWx0ZXJuYXRpdmUgZmxvd3Mgd2hpY2ggd291bGQgYmUgcGVyZm9ybWVkIG11Y2ggbGF0ZXIuICBBbGwgdGhlc2UgcGFydHMgb3Igc3RlcHMgd2l0aGluIHRoZSBzYW1lIFRhc2sgZGVmaW5lIHRoZSAibWV0aG9kIiBvZiBEZXZlbG9waW5nIGEgVXNlIENhc2UgTW9kZWwuICBBcHBseWluZyBzdWNoIGEgbWV0aG9kIGluIGEgbGlmZWN5Y2xlIChpLmUuIGluIGEgcHJvY2VzcykgaXMgZGVmaW5pbmcgd2hpY2ggc3RlcHMgYXJlIGRvbmUgd2hlbiBnb2luZyBmcm9tIG9uZSBpdGVyYXRpb24gdG8gdGhlIG5leHQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpDb250ZW50RWxlbWVudCI+Ci0JCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlByZWNvbmRpdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJQb3N0Y29uZGl0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlBlcmZvcm1lZEJ5IiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJCTx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Ik1hbmRhdG9yeUlucHV0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iT3V0cHV0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQWRkaXRpb25hbGx5UGVyZm9ybWVkQnkiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJPcHRpb25hbElucHV0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iRXN0aW1hdGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJUb29sTWVudG9yIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCTwveHNkOmNob2ljZT4KLQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJXb3JrRGVmaW5pdGlvbiI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BbiBhYnN0cmFjdCBNZXRob2QgRWxlbWVudCB0aGF0IGdlbmVyYWxpemVzIGFsbCBkZXNjcmlwdGlvbnMgb2Ygd29yayB3aXRoaW4gdGhlIFVuaWZpZWQgTWV0aG9kIEFyY2hpdGVjdHVyZS4gIFRoaXMgcGFja2FnZSBpbnRyb2R1Y2VzIHR3byBjb25jcmV0ZSB0eXBlcyBvZiBXb3JrIERlZmluaXRpb25zOiBUYXNrIGFuZCBTdGVwLiAgV29yayBEZWZpbml0aW9ucyBjYW4gY29udGFpbiBzZXRzIG9mIHByZS0gYW5kIHBvc3QtY29uZGl0aW9ucyBkZWZpbmluZyBjb25zdHJhaW50cyB0aGF0IG5lZWQgdG8gYmUgdmFsaWQgYmVmb3JlIHRoZSBkZXNjcmliZWQgd29yayBjYW4gYmVnaW4gb3IgYmVmb3JlIGl0IGNhbiBiZSBkZWNsYXJlZCBhcyBmaW5pc2hlZC4gIE5vdGUgdGhhdCBnZW5lcmFsIG93bmVkUnVsZXMgY2FuIGJlIHVzZWQgdG8gZGVmaW5lIGFkZGl0aW9uYWwgY29uc3RyYWludHMgYW5kIHJ1bGVzIGZvciBXb3JrIERlZmluaXRpb25zLgotV29yayBEZWZpbml0aW9ucyByZXByZXNlbnQgYmVoYXZpb3JhbCBkZXNjcmlwdGlvbnMgZm9yIGRvaW5nIHdvcmsuICBUaGVzZSBiZWhhdmlvcmFsIGRlc2NyaXB0aW9ucyBhcmUgbm90IGJvdW5kIHRvIG9uZSBzcGVjaWZpYyBjbGFzc2lmaWVyLCBidXQgcmVwcmVzZW50IGFuIGFyYml0cmFyeSBkZWZpbml0aW9uIG9mIHdvcmsuICBGb3IgZXhhbXBsZSwgYSBXb3JrIERlZmluaXRpb24gY291bGQgcmVwcmVzZW50IHdvcmsgdGhhdCBpcyBiZWluZyBwZXJmb3JtZWQgYnkgYSBzcGVjaWZpYyBSb2xlIChlLmcuIGEgUm9sZSBwZXJmb3JtaW5nIGEgc3BlY2lmaWMgVGFzayBvciBTdGVwcyBvZiBhIFRhc2spLCBieSBtYW55IFJvbGVzIHdvcmtpbmcgaW4gY2xvc2UgY29sbGFib3JhdGlvbiAobWFueSBSb2xlcyBhbGwgd29ya2luZyB0b2dldGhlciBvbiB0aGUgc2FtZSBpbnRlcmRpc2NpcGxpbmFyeSBUYXNrKSwgb3IgY29tcGxleCB3b3JrIHRoYXQgaXMgcGVyZm9ybWVkIHRocm91Z2hvdXQgdGhlIGxpZmVjeWNsZSAoZS5nLiBhIHByb2Nlc3MgZGVmaW5pbmcgYSBicmVha2Rvd24gc3RydWN0dXJlIGZvciBvcmdhbml6aW5nIGxhcmdlciBjb21wb3NpdGUgdW5pdHMgb2Ygd29yayBwZXJmb3JtZWQgYnkgbWFueSBSb2xlcyB3b3JraW5nIGluIGNvbGxhYm9yYXRpb24pLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6TWV0aG9kRWxlbWVudCI+Ci0JCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlByZWNvbmRpdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJQb3N0Y29uZGl0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJDb250ZW50Q2F0ZWdvcnkiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QW4gYWJzdHJhY3QgY2xhc3MgZ2VuZXJhbGl6aW5nIGNvbnRlbnQgY2F0ZWdvcnkgdHlwZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpDb250ZW50RWxlbWVudCIvPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkRpc2NpcGxpbmUiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBjYXRlZ29yaXphdGlvbiBvZiB3b3JrIChpLmUuIFRhc2tzIGZvciBNZXRob2QgQ29udGVudCksIGJhc2VkIHVwb24gc2ltaWxhcml0eSBvZiBjb25jZXJucyBhbmQgY29vcGVyYXRpb24gb2Ygd29yayBlZmZvcnQuCi1BIGRpc2NpcGxpbmUgaXMgYSBjb2xsZWN0aW9uIG9mIFRhc2tzIHRoYXQgYXJlIHJlbGF0ZWQgdG8gYSBtYWpvciAnYXJlYSBvZiBjb25jZXJuJyB3aXRoaW4gdGhlIG92ZXJhbGwgcHJvamVjdC4gVGhlIGdyb3VwaW5nIG9mIFRhc2tzIGludG8gZGlzY2lwbGluZXMgaXMgbWFpbmx5IGFuIGFpZCB0byB1bmRlcnN0YW5kaW5nIHRoZSBwcm9qZWN0IGZyb20gYSAndHJhZGl0aW9uYWwnIHdhdGVyZmFsbCBwZXJzcGVjdGl2ZS4gSG93ZXZlciwgdHlwaWNhbGx5LCBmb3IgZXhhbXBsZSwgaXQgaXMgbW9yZSBjb21tb24gdG8gcGVyZm9ybSBjZXJ0YWluIHJlcXVpcmVtZW50cyBhY3Rpdml0aWVzIGluIGNsb3NlIGNvb3JkaW5hdGlvbiB3aXRoIGFuYWx5c2lzIGFuZCBkZXNpZ24gYWN0aXZpdGllcy4gU2VwYXJhdGluZyB0aGVzZSBhY3Rpdml0aWVzIGludG8gc2VwYXJhdGUgZGlzY2lwbGluZXMgbWFrZXMgdGhlIGFjdGl2aXRpZXMgZWFzaWVyIHRvIGNvbXByZWhlbmQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpDb250ZW50Q2F0ZWdvcnkiPgotCQkJCTx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iVGFzayIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iU3ViRGlzY2lwbGluZSIgdHlwZT0idW1hOkRpc2NpcGxpbmUiLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlJlZmVyZW5jZVdvcmtmbG93IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJPC94c2Q6Y2hvaWNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkRpc2NpcGxpbmVHcm91cGluZyI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5Vc2VkIHRvIGdyb3VwIERpc2NpcGxpbmVzLiAgRm9yIGV4YW1wbGUsIHRoZSBEaXNjaXBsaW5lIEdyb3VwaW5nICJTb2Z0d2FyZSBEaXNjaXBsaW5lcyIgd291bGQgYmUgdGhlIGdyb3VwIG9mIGFsbCBkaXNjaXBsaW5lcyByZWxhdGVkIHRvIGRldmVsb3Bpbmcgc29mdHdhcmUgc3VjaCBhcyAiUmVxdWlyZW1lbnRzIE1hbmFnZW1lbnQiIG9yICJUZXN0aW5nIjsgIklUIEluZnJhc3RydWN0dXJlIE1hbmFnZW1lbnQiIHdvdWxkIGJlIGEgRGlzY2lwbGluZXMgR3JvdXBpbmcgZm9yIGRpc2NpcGxpbmVzIHN1Y2ggYXMgIklUIE9wZXJhdGlvbmFsIFNlcnZpY2VzIiwgIklUIEN1c3RvbWVyIFJlbGF0aW9uc2hpcHMiLCBvciAiSVQgRW5hYmxpbmcgU2VydmljZXMiLiAgRGlzY2lwbGluZXMgY2FuIGJlIGFzc29jaWF0ZWQgdG8gbW9yZSB0aGFuIG9uZSBEaXNjaXBsaW5lIEdyb3VwaW5nLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6Q29udGVudENhdGVnb3J5Ij4KLQkJCQk8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkRpc2NpcGxpbmUiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iRG9tYWluIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgcmVmaW5lYWJsZSBoaWVyYXJjaHkgZ3JvdXBpbmcgcmVsYXRlZCB3b3JrIHByb2R1Y3RzLiAgSW4gb3RoZXIgd29yZHMsIERvbWFpbnMgY2FuIGJlIGZ1cnRoZXIgZGl2aWRlZCBpbnRvIHN1Yi1kb21haW5zLCB3aXRoIHdvcmsgcHJvZHVjdCBlbGVtZW50cyB0byBiZSBjYXRlZ29yaXplZCBvbmx5IGF0IHRoZSBsZWFmLWxldmVsIG9mIHRoaXMgaGllcmFyY2h5LgotRG9tYWluIGlzIGEgbG9naWNhbCBncm91cGluZyBvZiB3b3JrIHByb2R1Y3RzIHRoYXQgaGF2ZSBhbiBhZmZpbml0eSB0byBlYWNoIG90aGVyIGJhc2VkIG9uIHJlc291cmNlcywgdGltaW5nLCBvciByZWxhdGlvbnNoaXAuICBBIERvbWFpbiBtYXkgYmUgZGl2aWRlZCBpbnRvIHN1YmRvbWFpbnMuICBGb3IgZXhhbXBsZSwgR1MgTWV0aG9kIHVzZXMgc2l4IHByZWRlZmluZWQgRG9tYWlucyBmb3IgV29yayBQcm9kdWN0czogQXBwbGljYXRpb24sIEFyY2hpdGVjdHVyZSwgQnVzaW5lc3MsIEVuZ2FnZW1lbnQsIE9wZXJhdGlvbnMgYW5kIE9yZ2FuaXphdGlvbi48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkNvbnRlbnRDYXRlZ29yeSI+Ci0JCQkJPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJXb3JrUHJvZHVjdCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iU3ViZG9tYWluIiB0eXBlPSJ1bWE6RG9tYWluIi8+Ci0JCQkJPC94c2Q6Y2hvaWNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlJvbGVTZXQiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+T3JnYW5pemVzIFJvbGVzIGludG8gY2F0ZWdvcmllcy4gIEl0IGlzIHVzZWQgdG8gZ3JvdXAgcm9sZXMgdG9nZXRoZXIgdGhhdCBoYXZlIGNlcnRhaW4gY29tbW9uYWxpdGllcy4gIEZvciBleGFtcGxlLCB0aGUgIkFuYWx5c3RzIiBSb2xlIFNldCBjb3VsZCBncm91cCB0aGUgIkJ1c2luZXNzIFByb2Nlc3MgQW5hbHlzdCIsICJTeXN0ZW0gQW5hbHlzdCIsIGFzIHdlbGwgYXMgIlJlcXVpcmVtZW50cyBTcGVjaWZpZXIiIHJvbGVzLiAgQWxsIG9mIHRoZXNlIHdvcmsgd2l0aCBzaW1pbGFyIHRlY2huaXF1ZXMgYW5kIGhhdmUgb3ZlcmxhcHBpbmcgc2tpbGxzLCBidXQgYXJlIHJlcXVpcmVkIGFzIGRpc3RpbmN0IHJvbGVzIGZvciBhIG1ldGhvZCAoZS5nLiB0aGUgbWV0aG9kIHRoZSBJQk0gUmF0aW9uYWwgVW5pZmllZCBQcm9jZXNzIGlzIGJhc2VkIG9uKS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkNvbnRlbnRDYXRlZ29yeSI+Ci0JCQkJPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJSb2xlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJPC94c2Q6Y2hvaWNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlJvbGVTZXRHcm91cGluZyI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5Sb2xlIFNldHMgY2FuIGJlIGNhdGVnb3JpemVkIGludG8gUm9sZSBTZXQgR3JvdXBpbmdzLiAgRm9yIGV4YW1wbGUsIGRpZmZlcmVudCBtZXRob2RzIG1pZ2h0IGRlZmluZSBzaW1pbGFyIFJvbGUgU2V0cywgd2hpY2ggaG93ZXZlciBuZWVkIHRvIGJlIGRpc3Rpbmd1aXNoZWQgZnJvbSBlYWNoIG90aGVyIG9uIGEgZ2xvYmFsIHNjYWxlLiAgVGh1cywgUm9sZSBTZXQgR3JvdXBpbmdzIGFsbG93IGRpc3Rpbmd1aXNoaW5nLCBmb3IgZXhhbXBsZSwgU29mdHdhcmUgU2VydmljZXMgTWFuYWdlciBSb2xlIFNldHMgZnJvbSBTb2Z0d2FyZSBEZXZlbG9wbWVudCBPcmdhbml6YXRpb24gTWFuYWdlciBSb2xlIFNldHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpDb250ZW50Q2F0ZWdvcnkiPgotCQkJCTx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUm9sZVNldCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCTwveHNkOmNob2ljZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJUb29sIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgY29udGFpbmVyL2FnZ3JlZ2F0ZSBmb3IgVG9vbE1lbnRvcnMuICBJdCBjYW4gYWxzbyBwcm92aWRlIGdlbmVyYWwgZGVzY3JpcHRpb25zIG9mIHRoZSB0b29sIGFuZCBpdHMgZ2VuZXJhbCBjYXBhYmlsaXRpZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpDb250ZW50Q2F0ZWdvcnkiPgotCQkJCTx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iVG9vbE1lbnRvciIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCTwveHNkOmNob2ljZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJXb3JrUHJvZHVjdFR5cGUiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzZWNvbmQgY2F0ZWdvcnkgZm9yIHdvcmsgcHJvZHVjdHMsIHdoaWNoIGluIGNvbnRyYXN0IHRvIERvbWFpbiBpcyBtb3JlIHByZXNlbnRhdGlvbiBvcmllbnRlZC4gIEEgd29yayBwcm9kdWN0IGNhbiBoYXZlIG1hbnkgV29yayBQcm9kdWN0IFR5cGVzLiAgRXhhbXBsZXMsIGZvciBhIFdvcmsgUHJvZHVjdCBUeXBlIGlzICJDbGFzcyBEaWFncmFtIiwgd2hpY2ggY2F0ZWdvcml6ZXMgdGhlIEFydGlmYWN0cyBBbmFseXNpcyBNb2RlbCwgRGVzaWduIE1vZGVsLCBVc2VyIEV4cGVyaWVuY2UgTW9kZWwsIG9yICJTcGVjaWZpY2F0aW9uIiwgd2hpY2ggY2F0ZWdvcml6ZXMgcmVxdWlyZW1lbnRzIHNwZWNpZmljYXRpb25zIHRoYXQgZGVmaW5lIGEgc3lzdGVtIHdpdGggYSB3ZWxsLWRlZmluZWQgc3lzdGVtIGJvdW5kYXJ5LCBzdWNoIGFzIHVzZSBjYXNlIG9yIGZ1bmN0aW9uYWwgcmVxdWlyZW1lbnRzIHNwZWNpZmljYXRpb24uICBBIFdvcmsgUHJvZHVjdCBjYW4gYmUgY2F0ZWdvcml6ZWQgdG8gYmUgb2YgbWFueSBXb3JrIFByb2R1Y3QgVHlwZXMuICBGb3IgZXhhbXBsZSwgYSB1c2UgY2FzZSBtb2RlbCBjYW4gYmUgY2F0ZWdvcml6ZWQgYXMgYSBTcGVjaWZpY2F0aW9uIGFzIHdlbGwgYXMgRGlhZ3JhbSBXb3JrIFByb2R1Y3QgVHlwZS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkNvbnRlbnRDYXRlZ29yeSI+Ci0JCQkJPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJXb3JrUHJvZHVjdCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCTwveHNkOmNob2ljZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJDdXN0b21DYXRlZ29yeSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIGNhdGVnb3J5IGludHJvZHVjZWQgYnkgYSBtZXRob2QgY29udGVudCBhdXRob3IgdG8gc3RydWN0dXJlIGFueSBudW1iZXIgb2YgbWV0aG9kIENvbnRlbnQgRWxlbWVudHMgb2YgYW55IHN1YnR5cGUgYmFzZWQgb24gdXNlci1kZWZpbmVkIGNyaXRlcmlhLiAgQmVjYXVzZSBDb250ZW50IENhdGVnb3JpZXMgKGFuZCB0aGVyZWZvcmUgQ3VzdG9tIENhdGVnb3JpZXMsIHRvbykgYXJlIENvbnRlbnQgRWxlbWVudHMgdGhlbXNlbHZlcywgQ3VzdG9tIENhdGVnb3JpZXMgY2FuIGJlIHVzZWQgdG8gcmVjdXJzaXZlbHkgY2F0ZWdvcml6ZSBDb250ZW50IENhdGVnb3JpZXMgYXMgd2VsbC4gIEN1c3RvbSBDYXRlZ29yaWVzIGNhbiBhbHNvIGJlIG5lc3RlZCB3aXRoIGFueSBDb250ZW50IENhdGVnb3J5LiAgQ3VzdG9tIGNhdGVnb3JpZXMgY2FuIGJlIHVzZWQgdG8gY2F0ZWdvcml6ZSBjb250ZW50IGJhc2VkIG9uIHRoZSB1c2VyJ3MgY3JpdGVyaWEgYXMgd2VsbCBhcyB0byBkZWZpbmUgd2hvbGUgdHJlZS1zdHJ1Y3R1cmVzIG9mIG5lc3RlZCBjYXRlZ29yaWVzIGFsbG93aW5nIHRoZSB1c2VyIHRvIHN5c3RlbWF0aWNhbGx5IG5hdmlnYXRlIGFuZCBicm93c2UgbWV0aG9kIGNvbnRlbnQgYW5kIHByb2Nlc3NlcyBiYXNlZCBvbiB0aGVzZSBjYXRlZ29yaWVzLiAgRm9yIGV4YW1wbGUsIG9uZSBjb3VsZCBjcmVhdGUgYSBjdXN0b20gY2F0ZWdvcnkgdG8gbG9naWNhbGx5IG9yZ2FuaXplIGNvbnRlbnQgcmVsZXZhbnQgZm9yIHRoZSB1c2VyJ3MgZGV2ZWxvcG1lbnQgb3JnYW5pemF0aW9uIGRlcGFydG1lbnRzOyBlLmcuIGEgIlRlc3RpbmciIGNhdGVnb3J5IHRoYXQgZ3JvdXBzIHRvZ2V0aGVyIGFsbCByb2xlcywgd29yayBwcm9kdWN0cywgdGFza3MsIGFuZCBndWlkYW5jZSBlbGVtZW50IHJlbGV2YW50IHRvIHRlc3RpbmcuICBBbm90aGVyIGV4YW1wbGUgd291bGQgYmUgY2F0ZWdvcmllcyB0aGF0IGV4cHJlc3MgbGljZW5zaW5nIGxldmVscyBvZiB0aGUgY29udGVudCBncm91cGluZyBmcmVlbHkgZGlzdHJpYnV0YWJsZSBtZXRob2QgY29udGVudCB2ZXJzdXMgY29udGVudCB0aGF0IHJlcHJlc2VudCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgYW5kIHJlcXVpcmVzIGEgbGljZW5zZSB0byBiZSBwdXJjaGFzZWQgdG8gYmUgYWJsZSB0byB1c2UgaXQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpDb250ZW50Q2F0ZWdvcnkiPgotCQkJCTx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQ2F0ZWdvcml6ZWRFbGVtZW50IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJTdWJDYXRlZ29yeSIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCTwveHNkOmNob2ljZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJNZXRob2RQYWNrYWdlIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkFuIGFic3RyYWN0IGNsYXNzIGZvciBwYWNrYWdpbmcgTWV0aG9kIEVsZW1lbnRzLiAgQWxsIE1ldGhvZCBFbGVtZW50cyBzaGFsbCBiZSBsb2NhdGVkIGluIGV4YWN0bHkgb25lIG9mIE1ldGhvZCBQYWNrYWdlJ3MgY29uY3JldGUgc3BlY2lhbGl6YXRpb25zIChlLmcuIENvbnRlbnQgUGFja2FnZSkuICAgTWV0aG9kIFBhY2thZ2UgZGVmaW5lcyBjb21tb24gcHJvcGVydGllcyBmb3IgYWxsIG9mIGl0cyBzcGVjaWFsaXphdGlvbnMuIEVsZW1lbnRzIGFyZSBvcmdhbml6ZWQgaW4gTWV0aG9kIFBhY2thZ2VzIHRvIHN0cnVjdHVyZSBsYXJnZSBzY2FsZSBvZiBtZXRob2QgY29udGVudCBhbmQgcHJvY2Vzc2VzIGFzIHdlbGwgYXMgdG8gZGVmaW5lIGEgbWVjaGFuaXNtIGZvciByZXVzZS4gIE1ldGhvZCBFbGVtZW50cyBmcm9tIG9uZSBwYWNrYWdlIGNhbiByZXVzZSBlbGVtZW50IGZyb20gb3RoZXIgcGFja2FnZXMgYnkgZGVmaW5pbmcgYSByZXVzZWRQYWNrYWdlcyBsaW5rLiAgRm9yIGV4YW1wbGUsIGEgd29yayBwcm9kdWN0IGRlZmluZWQgaW4gb25lIHBhY2thZ2UgY2FuIGJlIHVzZWQgYXMgYW4gaW5wdXQgZm9yIFRhc2tzIGRlZmluZWQgaW4gb3RoZXIgcGFja2FnZXMuICBCeSByZXVzaW5nIGl0IGZyb20gb25lIGNvbW1vbiBwbGFjZSAoaS5lLiB0aGUgcGFja2FnZSBpbiB3aGljaCBpdCBoYXMgYmVlbiBkZWZpbmVkKSBlbnN1cmVzIHRoYXQgbm8gcmVkdW5kYW50IGRlZmluaXRpb25zIG9mIHRoZSBzYW1lIGVsZW1lbnRzIGFyZSByZXF1aXJlZC4gIEFsc28gbWFpbnRlbmFuY2Ugb2YgbWV0aG9kIGNvbnRlbnQgaXMgZ3JlYXRseSBpbXByb3ZlZCBhcyBjaGFuZ2VzIGNhbiBiZSBwZXJmb3JtZWQgaW4gb25seSBvbmUgcGxhY2UuICBOb3RlLCB0aGF0IG90aGVyIHBhY2thZ2VzIHdpbGwgaW50cm9kdWNlIG1vcmUgc3BlY2lhbGl6YXRpb25zIG9mIE1ldGhvZCBQYWNrYWdlLCBlLmcuIFByb2Nlc3MgUGFja2FnZSBhbmQgUHJvY2VzcyBDb21wb25lbnQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpNZXRob2RFbGVtZW50Ij4KLQkJCQk8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlJldXNlZFBhY2thZ2UiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Ik1ldGhvZFBhY2thZ2UiIHR5cGU9InVtYTpNZXRob2RQYWNrYWdlIi8+Ci0JCQkJPC94c2Q6Y2hvaWNlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9Imdsb2JhbCIgdHlwZT0ieHNkOmJvb2xlYW4iPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+TWV0aG9kIFBhY2thZ2VzIGNhbiBoYXZlIGEgZ2xvYmFsIHNjb3BlLiAgVGhpcyBtZWFucyB0aGF0IGV2ZXJ5IGVsZW1lbnQgb2YgZXZlcnkgb3RoZXIgTWV0aG9kIFBhY2thZ2UgY2FuIHNlZSB0aGUgZ2xvYmFsIHBhY2thZ2UncyBjb250ZW50cy4gIEdsb2JhbCBNZXRob2QgUGFja2FnZXMgYXJlIHByaW1hcmlseSB1c2VkIHRvIHN0b3JlIGNvbW1vbmx5IHVzZWQgY2F0ZWdvcnkgZGVmaW5pdGlvbnMgc3VjaCBhcyBmb3IgRGlzY2lwbGluZXMgb3IgRG9tYWlucywgd2hpY2ggYXJlIHVzZWQgYnkgbWFueSBUYXNrIGFuZCBXb3JrIFByb2R1Y3RzIHJlc3BlY3RpdmVseS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJDb250ZW50UGFja2FnZSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpYWwgTWV0aG9kIFBhY2thZ2UgdGhhdCBjb250YWlucyBDb250ZW50IEVsZW1lbnRzIGFuZCBDb250ZW50IEVsZW1lbnRzLCBvbmx5LiAgRXhhbXBsZXMgZm9yIENvbnRlbnQgRWxlbWVudCBhcmUgQXJ0aWZhY3RzLCBUYXNrcywgUm9sZXMsIGV0Yy4gIEEga2V5IHNlcGFyYXRpb24gb2YgY29uY2VybnMgaW4gVU1BIGlzIHRoZSBkaXN0aW5jdGlvbiBiZXR3ZWVuIE1ldGhvZCBDb250ZW50IGFuZCBQcm9jZXNzLiAgVGhpcyBzZXBhcmF0aW9uIGlzIGVuZm9yY2VkIGJ5IHNwZWNpYWwgcGFja2FnZSB0eXBlcywgd2hpY2ggZG8gbm90IGFsbG93IHRoZSBtaXhpbmcgb2YgbWV0aG9kIGNvbnRlbnQgd2l0aCBwcm9jZXNzZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpNZXRob2RQYWNrYWdlIj4KLQkJCQk8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkNvbnRlbnRFbGVtZW50IiB0eXBlPSJ1bWE6Q29udGVudEVsZW1lbnQiLz4KLQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iQ29udGVudENhdGVnb3J5UGFja2FnZSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpYWwgTWV0aG9kIFBhY2thZ2UgdGhhdCBvbmx5IGNvbnRhaW5zIENvbnRlbnQgQ2F0ZWdvcnkgRWxlbWVudHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpNZXRob2RQYWNrYWdlIj4KLQkJCQk8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkNvbnRlbnRDYXRlZ29yeSIgdHlwZT0idW1hOkNvbnRlbnRDYXRlZ29yeSIvPgotCQkJCTwveHNkOmNob2ljZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJQcm9jZXNzRWxlbWVudCI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIERlc2NyaWJhYmxlIEVsZW1lbnQgdGhhdCByZXByZXNlbnRzIGFuIGFic3RyYWN0IGdlbmVyYWxpemF0aW9uIGZvciBhbGwgZWxlbWVudHMgZGVmaW5lZCBpbiB0aGUgUHJvY2VzcyBwYWNrYWdlLgotUHJvY2VzcyBFbGVtZW50cyByZXByZXNlbnRzIFByb2Nlc3Mgc3BlY2lmaWMgZWxlbWVudHMgdGhhdCBhcmUgc3VwcG9zZWQgdG8gYmUgbWFuYWdlZCBpbiBQcm9jZXNzIFBhY2thZ2VzLiAgVGhlIHNlcGFyYXRpb24gb2YgUHJvY2VzcyBFbGVtZW50IGZyb20gQ29udGVudCBFbGVtZW50IGFsbG93cyB0byBjbGVhcmx5IGRpc3Rpbmd1aXNoIGJldHdlZW4gcHVyZSBtZXRob2QgY29udGVudCBmcm9tIGNvbnRlbnQgdGhhdCBpcyByZXByZXNlbnRlZCBpbiBwcm9jZXNzZXMuIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6RGVzY3JpYmFibGVFbGVtZW50Ii8+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUGxhbm5pbmdEYXRhIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgUHJvY2VzcyBFbGVtZW50IHRoYXQgYWRkcyBwbGFubmluZyBkYXRhIHRvIEJyZWFrZG93biBFbGVtZW50cyB3aGVuIGl0IGlzIHVzZWQgZm9yIGEgUHJvY2VzcyBQbGFubmluZyBUZW1wbGF0ZS4gIEZvciBEZWxpdmVyeSBQcm9jZXNzZXMgYW5kIENhcGFiaWxpdHkgUGF0dGVybnMgdGhpcyBjbGFzcyBjYW4gZWl0aGVyIG5vdCBiZSBpbnN0YW50aWF0ZWQgb3IgcG9wdWxhdGVkIHdpdGggZGVmYXVsdCBkYXRhLgotUGxhbm5pbmcgRGF0YSBmYWN0b3JzIG91dCBzcGVjaWZpYyBvcHRpb25hbCBkYXRhIG5lZWRlZCBmb3IgcmVwcmVzZW50aW5nIHBsYW5uaW5nIHRlbXBsYXRlcy4gIFRoaXMgYXNzb2NpYXRpb24gYWxsb3dzIHRvIGFjY2VzcyBwbGFubmluZyBkYXRhIGlmIGl0IGlzIHN0b3JlZCBmb3IgdGhlIEJyZWFrZG93biBFbGVtZW50LgotKE5PVEUsIFRIRSBBVFRSSUJVVEVTIEZPUiBUSElTIENMQVNTIEFSRSBOT1QgQ09NUExFVEUsIFlFVCk8L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOlByb2Nlc3NFbGVtZW50Ij4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzdGFydERhdGUiIHR5cGU9InhzZDpkYXRlVGltZSI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZGVmYXVsdCBzdGFydCBkYXRlIGZvciBhIHBsYW5lZCBUYXNrLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImZpbmlzaERhdGUiIHR5cGU9InhzZDpkYXRlVGltZSI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZGVmYXVsdCBmaW5pc2ggZGF0ZSBmb3IgYSBwbGFuZWQgVGFzay48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJyYW5rIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBkZWZhdWx0IHJhbmsgZm9yIGEgcGxhbmVkIFRhc2suPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iQnJlYWtkb3duRWxlbWVudCI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BbiBhYnN0cmFjdCBnZW5lcmFsaXphdGlvbiBmb3IgYW55IHR5cGUgb2YgTWV0aG9kIEVsZW1lbnQgdGhhdCBpcyBwYXJ0IG9mIGEgYnJlYWtkb3duIHN0cnVjdHVyZS4gIEl0IGRlZmluZXMgYSBzZXQgb2YgcHJvcGVydGllcyBhdmFpbGFibGUgdG8gYWxsIG9mIGl0cyBzcGVjaWFsaXphdGlvbnMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpQcm9jZXNzRWxlbWVudCI+Ci0JCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlByZXNlbnRlZEFmdGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlByZXNlbnRlZEJlZm9yZSIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJQbGFubmluZ0RhdGEiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iU3VwZXJBY3Rpdml0eSIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJCTx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkNoZWNrbGlzdCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkNvbmNlcHQiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJFeGFtcGxlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iR3VpZGVsaW5lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUmV1c2FibGVBc3NldCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlN1cHBvcnRpbmdNYXRlcmlhbCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IldoaXRlcGFwZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJPC94c2Q6Y2hvaWNlPgotCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9InByZWZpeCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5QcmVmaXggcmVwcmVzZW50cyBhbiBhZGRpdGlvbmFsIGxhYmVsIHRoYXQgd2lsbCBiZSBwcmVzZW50ZWQgYXMgYSBwcmVmaXggdG8gYW55IEJyZWFrZG93biBFbGVtZW50IHRvIGluZGljYXRlIGEgdXNlci1kZWZpbmVkIHN1Yi10eXBlIGZvciB0aGUgZWxlbWVudC4gIEZvciBleGFtcGxlLCBpZiB0aGUgcHJvY2VzcyBlbmdpbmVlciB3b3VsZCBsaWtlIHRvIGRpc3Rpbmd1aXNoIGhpcyBBY3Rpdml0aWVzIGJ5ICdNb2R1bGUnIChhcyBkb25lIGluIHRoZSBJQk0gUmF0aW9uYWwgU3VtbWl0IEFzY2VuZGFudCBNZXRob2QpLCBoZSBjYW4gZGVmaW5lIGEgZGlmZmVyZW50IHByZWZpeCBmb3IgZXZlcnkgbW9kZWwgdG8gYmUgdXNlZCBpbiBhZGRpdGlvbiB0byBuYW1pbmcgQWN0aXZpdGllcywgZS5nLiAiU1JBLkVzdGFibGlzaCBSZXF1aXJlbWVudHMiIHdpdGggU1JBIGluZGljYXRpbmcgdGhhdCB0aGlzIEFjdGl2aXR5IGJlbG9uZ3MgdG8gdGhlICJTb2Z0d2FyZSBSZXF1aXJlbWVudHMgQW5hbHlzaXMiIG1vZHVsZS4gIEFub3RoZXIgY29tbW9uIGFwcGxpY2F0aW9uIGZvciBwcmVmaXggaXMgdG8gcXVhbGlmeSByb2xlcyBpbiBSb2xlIERlc2NyaXB0b3JzLiAgRm9yIGV4YW1wbGUsICJDdXN0b21lci5BcmNoaXRlY3QiIHdvdWxkIGRlZmluZSBhICJDdXN0b21lciIgcHJlZml4IGZvciB0aGUgUm9sZSBEZXNjcmlwdG9yICJBcmNoaXRlY3QiIGV4cHJlc3NpbmcgdGhhdCB0aGlzIGlzIGFuIGFyY2hpdGVjdCBvbiB0aGUgY3VzdG9tZXIgc2lkZSBhbmQgbm90IHRoZSBkZXZlbG9wbWVudCB0ZWFtIHNpZGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0iaXNQbGFubmVkIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIGtleSBhcHBsaWNhdGlvbiBmb3IgRGV2ZWxvcG1lbnQgUHJvY2Vzc2VzIGV4cHJlc3NlZCB3aXRoIEJyZWFrZG93biBzdHJ1Y3R1cmVzIGlzIHRvIGdlbmVyYXRlIGEgcHJvamVjdCBwbGFuIGZyb20gaXQuICBBIHByb2Nlc3MgYXMgZGVmaW5lZCBpbiBVTUEgKGNmLiB3aXRoIFNlY3Rpb25zIFhYIGFuZCA1LjIpIGlzIGEgbXVsdGktZGltZW5zaW9uYWwgc3RydWN0dXJlIGRlZmluaW5nIHdoYXQgd29yayBpcyBiZWluZyBwZXJmb3JtZWQgYXQgd2hhdCB0aW1lIGJ5IHdoaWNoIHJvbGVzIHVzaW5nIHdoaWNoIGlucHV0IGFuZCBwcm9kdWNpbmcgd2hhdCBvdXRwdXRzLiAgQSBwcm9qZWN0IHBsYW4gYXMgaXQgaXMgcmVwcmVzZW50ZWQgaW4gcHJvamVjdCBwbGFubmluZyB0b29scyBzdWNoIGFzIElCTSBSYXRpb25hbCBQb3J0Zm9saW8gTWFuYWdlciBvciBNaWNyb3NvZnQgUHJvamVjdCBub3JtYWxseSBkb2VzIG5vdCBuZWVkIGFsbCB0aGlzIGluZm9ybWF0aW9uIGFuZCBpcyBub3JtYWxseSBsaW1pdGVkIHRvIGp1c3QgcmVwcmVzZW50aW5nIGEgc3Vic2V0LiAgRm9yIGV4YW1wbGUsIGEgdHlwaWNhbCBNUyBQcm9qZWN0IHBsYW4gb25seSByZXByZXNlbnRzIHRoZSB3b3JrIGJyZWFrZG93biBjb25zaXN0aW5nIG9mIFRhc2tzIGFuZCBBY3Rpdml0aWVzIChzb21ldGltZXMgcmVmZXJyZWQgdG8gYXMgc3VtbWFyeSB0YXNrcykuICBJdCBkb2VzIG5vdCBzaG93IHRoZSBpbnB1dCBhbmQgb3V0cHV0IFdvcmsgUHJvZHVjdHMgZm9yIGEgVGFzaywgYnV0IGl0IGNhbiBzaG93IHdoaWNoIHJvbGVzIHNoYWxsIGJlIHN0YWZmZWQgZm9yIHBlcmZvcm1pbmcgdGhlIFRhc2suICBIb3dldmVyLCBzdWNoIHJvbGUgYWxsb2NhdGlvbiBuZWVkIHRvIGJlIHJlcGxhY2VkIHdpdGggY29uY3JldGUgcmVzb3VyY2VzIHdoZW4gaW5zdGFudGlhdGluZyB0aGUgcGxhbiBmb3IgYSBjb25jcmV0ZSBwcm9qZWN0LiAgU29tZXRpbWVzIHByb2plY3QgcGxhbnMgY2FuIHRoZW4gYWdhaW4gYmUgb3JnYW5pemVkIGRpZmZlcmVudGx5IGJ5IG9yZ2FuaXppbmcgd29yayBieSBkZWxpdmVyYWJsZXMgaW4gd2hpY2ggV29yayBQcm9kdWN0cyBhcmUgbWFwcGVkIHRvIHRoZSBwbGFuJ3Mgc3VtbWFyeSB0YXNrcyBhbmQgVGFzayB0aGF0IGhhdmUgdGhlc2Ugd29yayBwcm9kdWN0cyBhcyBvdXRwdXQgbWFwcGVkIGJlbG93IHN1Y2ggYXMgc3VtbWFyeSB0YXNrLiAgVGhlcmVmb3JlLCBhIHByb2Nlc3MgY2FuIG1ha2UgcmVjb21tZW5kYXRpb25zIGFib3V0IHdoaWNoIGVsZW1lbnRzIHRvIGluY2x1ZGUgYW5kIHdoaWNoIHRvIGV4Y2x1ZGUgd2hlbiBnZW5lcmF0aW5nIGEgcGxhbi4gIFdoZW4gdGhlIGlzUGxhbm5lZCBhdHRyaWJ1dGUgaXMgc2V0IHRvIEZhbHNlIGZvciBhbiBpbnN0YW5jZSBvZiBhIEJyZWFrZG93biBFbGVtZW50LCB0aGVuIHRoaXMgZWxlbWVudCBzaGFsbCBub3QgYmUgbm90IGluY2x1ZGVkIHdoZW4gYSBjb25jcmV0ZSBwcm9qZWN0IHBsYW4gaXMgYmVpbmcgZ2VuZXJhdGVkIGZyb20gdGhlIGJyZWFrZG93biBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucyB0aGlzIGVsZW1lbnQuCi08L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJoYXNNdWx0aXBsZU9jY3VycmVuY2VzIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5KdXN0IGFzIHRoZSBpc1BsYW5uZWQgYXR0cmlidXRlIHRoZSBoYXNNdWx0aXBsZU9jY3VycmVuY2VzIGF0dHJpYnV0ZSBoYXMgYW4gaW1wYWN0IG9uIGdlbmVyYXRpbmcgcGxhbnMgZnJvbSBhIFByb2Nlc3MuICBXaGVuIHRoaXMgYXR0cmlidXRlIGlzIHNldCB0byBUcnVlIGZvciBhIEJyZWFrZG93biBFbGVtZW50IHRoZW4gaXQgd2lsbCB0eXBpY2FsbHkgb2NjdXIgbXVsdGlwbGUgdGltZXMgd2l0aGluIHRoZSBzYW1lIEFjdGl2aXR5LiAgRm9yIGV4YW1wbGUsIGEgVGFzayBzdWNoIGFzICJEZXRhaWwgVXNlIENhc2UiIHdvdWxkIGJlIHBlcmZvcm1lZCBmb3IgZXZlcnkgdXNlIGNhc2UgaWRlbnRpZmllZCBmb3IgYSBwYXJ0aWN1bGFyIEl0ZXJhdGlvbiBvciBBY3Rpdml0eS4gIEdlbmVyYXRpbmcgYSBwbGFuIHdvdWxkIGxpc3Qgb25lIFRhc2sgaW5zdGFuY2UgcGVyIHVzZSBjYXNlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImlzT3B0aW9uYWwiIHR5cGU9InhzZDpib29sZWFuIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkluZGljYXRlcyB0aGF0IHRoZSBCcmVha2Rvd24gRWxlbWVudCBkZXNjcmliZXMgd29yaywgYSB3b3JrIHJlc3VsdCwgb3IgZXZlbiB3b3JrIHJlc291cmNlcywgd2hpY2ggaW5jbHVzaW9uIGlzIG5vdCBtYW5kYXRvcnkgd2hlbiBwZXJmb3JtaW5nIGEgcHJvamVjdCB0aGF0IGlzIHBsYW5uZWQgYmFzZWQgb24gYSBwcm9jZXNzIGNvbnRhaW5pbmcgdGhpcyBlbGVtZW50LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IldvcmtPcmRlciI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5SZXByZXNlbnRzIGEgcmVsYXRpb25zaGlwIGJldHdlZW4gdHdvIEJyZWFrZG93biBFbGVtZW50cyBpbiB3aGljaCBvbmUgQnJlYWtkb3duIEVsZW1lbnRzIGRlcGVuZHMgb24gdGhlIHN0YXJ0IG9yIGZpbmlzaCBvZiBhbm90aGVyIEJyZWFrZG93biBFbGVtZW50cyBpbiBvcmRlciB0byBiZWdpbiBvciBlbmQuICAKLVRoZSBXb3JrIE9yZGVyIGNsYXNzIGRlZmluZXMgcHJlZGVjZXNzb3IgYW5kIHN1Y2Nlc3NvciByZWxhdGlvbnMgYW1vbmdzdCBCcmVha2Rvd24gRWxlbWVudHMuICBUaGlzIGluZm9ybWF0aW9uIGlzIGluIHBhcnRpY3VsYXIgY3JpdGljYWwgZm9yIHBsYW5uaW5nIGFwcGxpY2F0aW9ucy4gIFNlZSBtb3JlIGRldGFpbHMgb24gZGlmZmVyZW50IHR5cGVzIG9mIFdvcmsgT3JkZXIgcmVsYXRpb25zaGlwcyBhdCBXb3JrIE9yZGVyIFR5cGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpzaW1wbGVDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0ieHNkOnN0cmluZyI+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIGdsb2JhbCB1bmlxdWUgaWQgZm9yIGEgd29yayBvcmRlci48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJsaW5rVHlwZSIgdHlwZT0idW1hOldvcmtPcmRlclR5cGUiPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+VGhpcyBhdHRyaWJ1dGUgZXhwcmVzc2VzIHRoZSB0eXBlIG9mIHRoZSBXb3JrIE9yZGVyIHJlbGF0aW9uc2hpcCBieSBhc3NpZ25pbmcgYSB2YWx1ZSBmcm9tIHRoZSBXb3JrIE9yZGVyIFR5cGUgZW51bWVyYXRpb24uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJXb3JrQnJlYWtkb3duRWxlbWVudCI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpYWwgQnJlYWtkb3duIEVsZW1lbnQgdGhhdCBwcm92aWRlcyBzcGVjaWZpYyBwcm9wZXJ0aWVzIGZvciBCcmVha2Rvd24gRWxlbWVudHMgdGhhdCByZXByZXNlbnQgb3IgcmVmZXIgdG8gV29yayBEZWZpbml0aW9ucy4gIEZvciBleGFtcGxlIGl0cyBzdWJjbGFzcyBBY3Rpdml0eSBkZWZpbmVzIHdvcmsgYXMgaXQgaXMgYWxzbyBhIHN1YmNsYXNzIG9mIFdvcmsgRGVmaW5pdGlvbi4gIEl0cyBzdWJjbGFzcyBUYXNrIERlc2NyaXB0b3IgZG9lcyBub3QgZGVmaW5lIHdvcmsgYnkgaXRzZWxmLCBidXQgcmVmZXJzIHRvIGEgV29yayBEZWZpbml0aW9uIGFuZCB0aGVyZWZvcmUgY2FuIGhhdmUgdGhlIHNhbWUgY29tbW9uIHByb3BlcnRpZXMgYW5kIFdvcmsgQnJlYWtkb3duIEVsZW1lbnQgaGFzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6QnJlYWtkb3duRWxlbWVudCI+Ci0JCQkJPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJQcmVkZWNlc3NvciIgdHlwZT0idW1hOldvcmtPcmRlciIvPgotCQkJCTwveHNkOmNob2ljZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpc1JlcGVhdGFibGUiIHR5cGU9InhzZDpib29sZWFuIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlRoaXMgYXR0cmlidXRlIGlzIHVzZWQgdG8gZGVmaW5lIHJlcGV0aXRpb24gb2Ygd29yaywgZS5nLiBpdGVyYXRpb25zLiAgQSBQcm9jZXNzIFdvcmsgRGVmaW5pdGlvbiB3aXRoIHRoaXMgYXR0cmlidXRlIHNldCB0byBUcnVlIHNoYWxsIGJlIHJlcGVhdGVkIG1vcmUgdGhhbiBvbmNlIG9uIHRoZSBzYW1lIHNldCBvZiBhcnRpZmFjdHMuICBGb3IgZXhhbXBsZSwgZm9yIGFuIGluc3RhbmNlIG9mIEl0ZXJhdGlvbiAoZGVmaW5lZCBhcyBhIHNwZWNpYWwgUHJvY2VzcyBXb3JrIERlZmluaXRpb24gYmVsb3cpIHRoaXMgYXR0cmlidXRlIGlzIHNldCB0byBUcnVlIGJ5IGRlZmF1bHQgaW5kaWNhdGluZyB0aGF0IGV2ZXJ5IHN1Yi1BY3Rpdml0eSB3aWxsIGJlIHJlcGVhdGVkIG1vcmUgdGhhbiBvbmNlLiAgSG93ZXZlciwgYW55IFByb2Nlc3MgV29yayBEZWZpbml0aW9uIGNhbiBzZXQgdGhpcyBhdHRyaWJ1dGUgdG8gVHJ1ZSB0byBkZWZpbmUgaXRlcmF0aW9ucyAoZS5nLiB0byBpdGVyYXRlIG9uZSBBY3Rpdml0eSBjb25zaXN0aW5nIG9mIG1hbnkgc3ViLWFjdGl2aXRpZXMgb3IgZXZlbiBQaGFzZXMsIGJ1dCB0byBpdGVyYXRlIGp1c3Qgb25lIFRhc2spLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImlzT25nb2luZyIgdHlwZT0ieHNkOmJvb2xlYW4iPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+SWYgdGhlIGlzT25nb2luZyBhdHRyaWJ1dGUgaXMgc2V0IHRvIFRydWUgZm9yIGEgUHJvY2VzcyBXb3JrIERlZmluaXRpb24gaW5zdGFuY2UsIHRoZW4gdGhlIGVsZW1lbnQgZGVzY3JpYmVzIGFuIG9uZ29pbmcgcGllY2Ugb2Ygd29yayB3aXRob3V0IGEgZml4ZWQgZHVyYXRpb24gb3IgZW5kIHN0YXRlLiAgRm9yIGV4YW1wbGUsIHRoZSBQcm9jZXNzIFdvcmsgRGVmaW5pdGlvbiBjb3VsZCByZXByZXNlbnQgd29yayBvZiBhbiBhZG1pbmlzdHJhdG9yIGNvbnRpbnVvdXNseSAoZS5nLiAzaCBhIGRheSkgd29ya2luZyB0byBlbnN1cmUgdGhhdCBzeXN0ZW1zIGFyZSBrZXB0IGluIGEgY2VydGFpbiBzdGF0ZS4gIEFub3RoZXIgZXhhbXBsZSB3b3VsZCBiZSBwcm9ncmFtIG1hbmFnZW1lbnQgd29yayBvdmVyc2VlaW5nIG1hbnkgZGlmZmVyZW50IHByb2plY3RzIGJlaW5nIHNjaGVkdWxlZCBmb3Igb25lIHBhcnRpY3VsYXIgcHJvamVjdCBhdCBzcGVjaWZpYyByZW9jY3VycmluZyBpbnRlcnZhbHMgZHVyaW5nIHRoZSB3aG9sZSBsaWZlY3ljbGUgb2YgdGhlIHByb2plY3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0iaXNFdmVudERyaXZlbiIgdHlwZT0ieHNkOmJvb2xlYW4iPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+VGhlIGlzRXZlbnREcml2ZW4gYXR0cmlidXRlIGluZGljYXRlcyB0aGF0IHRoZSBQcm9jZXNzIFdvcmsgRGVmaW5pdGlvbiBkZXNjcmliZXMgYW4gaW5zdGFuY2Ugb2Ygd29yayB3aGljaCBpcyBub3Qgc3RhcnRlZCBiZWNhdXNlIGl0IGhhcyBiZWVuIHNjaGVkdWxlZCB0byBzdGFydCBhdCBhIGNlcnRhaW4gcG9pbnQgb2YgdGltZSwgYmVjYXVzZSBwcmVjZWRpbmcgd29yayBpcyBiZWluZyBjb21wbGV0ZWQsIG9yIGlucHV0IHdvcmsgcHJvZHVjdHMgYXJlIGF2YWlsYWJsZSwgYnV0IGJlY2F1c2UgYW5vdGhlciBzcGVjaWZpYyBldmVudCBoYXMgb2NjdXJyZWQuICBFeGFtcGxlcyBmb3Igc3VjaCBldmVudHMgYXJlIGV4Y2VwdGlvbnMgb3IgcHJvYmxlbSBzaXR1YXRpb25zIHdoaWNoIHJlcXVpcmUgc3BlY2lmaWMgd29yayB0byBiZSBwZXJmb3JtZWQgYXMgYSByZXN1bHQuICBBbHNvIGNoYW5nZSBtYW5hZ2VtZW50IHdvcmsgY2FuIGJlIG1vZGVsZWQgYXMgZXZlbnQgZHJpdmVuIHdvcmsgYW5hbHl6aW5nIGEgY2hhbmdlIHJlcXVlc3Qgb3IgZGVmZWN0IGFuZCBhbGxvY2F0aW5nIHdvcmsgZHluYW1pY2FsbHkgdG8gcmVzb3VyY2VzIHRvIGRlYWwgd2l0aCBpdCBmb2xsb3dpbmcgdGhlIHdvcmsgZGVzY3JpYmVkIHdpdGggc3VjaCBQcm9jZXNzIFdvcmsgRGVmaW5pdGlvbi4gIFRoZSBldmVudHMgdGhlbXNlbHZlcyBhcmUgbm90IG1vZGVsZWQgaW4gdGhpcyB2ZXJzaW9uIG9mIHRoZSBzcGVjaWZpY2F0aW9uLiAgVGhleSBzaGFsbCBiZSBkZXNjcmliZWQgYXMgcGFydCBvZiB0aGUgbm9ybWFsIGRlc2NyaXB0aW9ucyBmaWVsZHMgYXZhaWxhYmxlLgotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iTWlsZXN0b25lIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lhbCBCcmVha2Rvd24gRWxlbWVudCB0aGF0IGRlc2NyaWJlcyBhIHNpZ25pZmljYW50IGV2ZW50IGluIGEgZGV2ZWxvcG1lbnQgcHJvamVjdCwgc3VjaCBhcyBhIG1ham9yIGRlY2lzaW9uLCBjb21wbGV0aW9uIG9mIGEgZGVsaXZlcmFibGUsIG9yIG1lZXRpbmcgb2YgYSBtYWpvciBkZXBlbmRlbmN5IChsaWtlIGNvbXBsZXRpb24gb2YgYSBwcm9qZWN0IHBoYXNlKS4gIEJlY2F1c2UsIE1pbGVzdG9uZSBpcyBjb21tb25seSB1c2VkIHRvIHJlZmVyIHRvIGJvdGggdGhlIGV2ZW50IGl0c2VsZiBhbmQgdGhlIHBvaW50IGluIHRpbWUgYXQgd2hpY2ggdGhlIGV2ZW50IGlzIHNjaGVkdWxlZCB0byBoYXBwZW4sIGl0IGlzIG1vZGVsZWQgYXMgYSBCcmVha2Rvd24gRWxlbWVudCAoaS5lLiBpdCBhcHBlYXJzIGFzIHBhcnQgb2YgYSBicmVha2Rvd24gc3RydWN0dXJlKS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOldvcmtCcmVha2Rvd25FbGVtZW50Ij4KLQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUmVxdWlyZWRSZXN1bHQiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJBY3Rpdml0eSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIFdvcmsgQnJlYWtkb3duIEVsZW1lbnQgYW5kIFdvcmsgRGVmaW5pdGlvbiB3aGljaCBzdXBwb3J0cyB0aGUgbmVzdGluZyBhbmQgbG9naWNhbCBncm91cGluZyBvZiByZWxhdGVkIEJyZWFrZG93biBFbGVtZW50cyBmb3JtaW5nIGJyZWFrZG93biBzdHJ1Y3R1cmVzLiAgQWx0aG91Z2ggQWN0aXZpdHkgaXMgYSBjb25jcmV0ZSBtZXRhLWNsYXNzLCBvdGhlciBjbGFzc2VzIHdoaWNoIHJlcHJlc2VudCBicmVha2Rvd24gc3RydWN0dXJlcyBkZXJpdmUgZnJvbSBpdDsgc3VjaCBhcyBQaGFzZSwgSXRlcmF0aW9uLCBEZWxpdmVyeSBQcm9jZXNzLCBvciBDYXBhYmlsaXR5IFBhdHRlcm4uCi1BY3Rpdml0eSByZXByZXNlbnRzIGEgZ3JvdXBpbmcgZWxlbWVudCBmb3Igb3RoZXIgQnJlYWtkb3duIEVsZW1lbnRzIHN1Y2ggYXMgQWN0aXZpdGllcywgRGVzY3JpcHRvcnMsIE1pbGVzdG9uZXMsIGV0Yy4gIEl0IGlzIG5vdCBwZXItc2UgYSAnaGlnaC1sZXZlbCcgZ3JvdXBpbmcgb2Ygb25seSB3b3JrIGFzIGluIG90aGVyIG1ldGEtbW9kZWxzLCBidXQgZ3JvdXBzIGFueSBraW5kIG9mIEJyZWFrZG93biBFbGVtZW50cy4gIEZvciBleGFtcGxlLCBvbmUgY2FuIGRlZmluZSB2YWxpZCBBY3Rpdml0aWVzIHRoYXQgZ3JvdXAgb25seSBXb3JrIFByb2R1Y3RzIERlc2NyaXB0b3JzIHdpdGhvdXQgYW55IG1hdGNoaW5nIFRhc2sgRGVzY3JpcHRvcnMuICBBY3Rpdml0aWVzIGFsc28gaW5oZXJpdCBhbGwgcHJvcGVydGllcyBmcm9tIFdvcmsgQnJlYWtkb3duIEVsZW1lbnQgYW5kIGluZGlyZWN0bHkgZnJvbSBQcm9jZXNzIEVsZW1lbnQ7IGkuZS4gQWN0aXZpdHkgaXMgcmVhZHkgdG8gaGF2ZSBhIGZ1bGwgY29udGVudCBkZXNjcmlwdGlvbiBhdHRhY2hlZCB0byBpdC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOldvcmtCcmVha2Rvd25FbGVtZW50Ij4KLQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUHJlY29uZGl0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlBvc3Rjb25kaXRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotCQkJCQk8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJCcmVha2Rvd25FbGVtZW50IiB0eXBlPSJ1bWE6QnJlYWtkb3duRWxlbWVudCIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlJvYWRtYXAiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJPC94c2Q6Y2hvaWNlPgotCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9InZhcmlhYmlsaXR5VHlwZSIgdHlwZT0idW1hOlZhcmlhYmlsaXR5VHlwZSIvPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9InZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJJc0VuYWN0YWJsZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJQaGFzZSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpYWwgQWN0aXZpdHkgd2hpY2ggcHJlc2NyaWJlcyBwcmUtZGVmaW5lZCB2YWx1ZXMgZm9yIGl0cyBpbnN0YW5jZXMgZm9yIHRoZSBhdHRyaWJ1dGVzIHByZWZpeCAoJ1BoYXNlJykgYW5kIGlzUmVwZWF0YWJsZSAoJ0ZhbHNlJykuICBJdCBoYXMgYmVlbiBpbmNsdWRlZCBpbnRvIHRoZSBtZXRhLW1vZGVsIGZvciBjb252ZW5pZW5jZSBhbmQgdG8gcHJvdmlkZSBhIHNwZWNpYWwgc3RlcmVvdHlwZSwgYmVjYXVzZSBpdCByZXByZXNlbnRzIGEgdmVyeSBjb21tb25seSB1c2VkIEFjdGl2aXR5IHR5cGUuCi1QaGFzZSByZXByZXNlbnQgYSBzaWduaWZpY2FudCBwZXJpb2QgaW4gYSBwcm9qZWN0LCBlbmRpbmcgd2l0aCBtYWpvciBtYW5hZ2VtZW50IGNoZWNrcG9pbnQsIG1pbGVzdG9uZSBvciBzZXQgb2YgRGVsaXZlcmFibGVzLiAgSXQgaXMgaW5jbHVkZWQgaW4gdGhlIG1vZGVsIGFzIGEgcHJlZGVmaW5lZCBzcGVjaWFsIEFjdGl2aXR5LCBiZWNhdXNlIG9mIGl0cyBzaWduaWZpY2FuY2UgaW4gZGVmaW5pbmcgYnJlYWtkb3ducy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkFjdGl2aXR5Ii8+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iSXRlcmF0aW9uIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lhbCBBY3Rpdml0eSB3aGljaCBwcmVzY3JpYmVzIHByZS1kZWZpbmVkIHZhbHVlcyBmb3IgaXRzIGluc3RhbmNlcyBmb3IgdGhlIGF0dHJpYnV0ZXMgcHJlZml4ICgnSXRlcmF0aW9uJykgYW5kIGlzUmVwZWF0YWJsZSAoJ1RydWUnKS4gIEl0IGhhcyBiZWVuIGluY2x1ZGVkIGludG8gdGhlIG1ldGEtbW9kZWwgZm9yIGNvbnZlbmllbmNlIGFuZCB0byBwcm92aWRlIGEgc3BlY2lhbCBzdGVyZW90eXBlLCBiZWNhdXNlIGl0IHJlcHJlc2VudHMgYSB2ZXJ5IGNvbW1vbmx5IHVzZWQgQWN0aXZpdHkgdHlwZS4KLUl0ZXJhdGlvbiBncm91cHMgYSBzZXQgb2YgbmVzdGVkIEFjdGl2aXRpZXMgdGhhdCBhcmUgcmVwZWF0ZWQgbW9yZSB0aGFuIG9uY2UuICBJdCByZXByZXNlbnRzIGFuIGltcG9ydGFudCBzdHJ1Y3R1cmluZyBlbGVtZW50IHRvIG9yZ2FuaXplIHdvcmsgaW4gcmVwZXRpdGl2ZSBjeWNsZXMuICBUaGUgY29uY2VwdCBvZiBJdGVyYXRpb24gY2FuIGJlIGFzc29jaWF0ZWQgd2l0aCBkaWZmZXJlbnQgcnVsZXMgaW4gZGlmZmVyZW50IG1ldGhvZHMuICBGb3IgZXhhbXBsZSwgdGhlIElCTSBSYXRpb25hbCBVbmlmaWVkIFByb2Nlc3MgbWV0aG9kIGZyYW1ld29yayAoUlVQKSBkZWZpbmVzIGEgcnVsZSB0aGF0IEl0ZXJhdGlvbnMgYXJlIG5vdCBhbGxvd2VkIHRvIHNwYW4gYWNyb3NzIFBoYXNlcy4gIEluIGNvbnRyYXN0IElCTSBHbG9iYWwgU2VydmljZXMgTWV0aG9kIChHU01ldGhvZCkgYmFzZWQgbWV0aG9kIGZyYW1ld29ya3MgdGhpcyBydWxlIGRvZXMgbm90IGFwcGx5IGFuZCBJdGVyYXRpb24gY2FuIGJlIGRlZmluZWQgd2hpY2ggbmVzdCBQaGFzZXMuICBSdWxlcyBsaWtlIHRoZXNlLCB3aGljaCBwbGF5IGFuIGltcG9ydGFudCByb2xlIGZvciBlYWNoIGluZGl2aWR1YWwgbWV0aG9kIGFuZCBhcmUgdGhlcmVmb3JlIG5vdCBlbmZvcmNlZCBieSB0aGlzIG1ldGEtbW9kZWwuICBJbnN0ZWFkLCBwcm9jZXNzIGF1dGhvcnMgYXJlIGV4cGVjdGVkIHRvIGZvbGxvdyBhbmQgY2hlY2sgdGhlc2UgcnVsZXMgbWFudWFsbHkuICAoTm90ZTogQW55IEJyZWFrZG93biBFbGVtZW50IGNhbiBiZSByZXBlYXRlZDsgaG93ZXZlciwgSXRlcmF0aW9ucyBoYXMgYmVlbiBpbnRyb2R1Y2VkIGFzIGEgc3BlY2lhbCBtZXRhLW1vZGVsIGNvbmNlcHQsIGJlY2F1c2Ugb2YgaXRzIGltcG9ydGFudCByb2xlIGZvciBtYW55IG1ldGhvZHMuKTwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6QWN0aXZpdHkiLz4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24iPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBnZW5lcmFsaXplZCBDb250ZW50IERlc2NyaXB0aW9uIHRoYXQgaXMgdXNlZCB0byBzdG9yZSB0aGUgdGV4dHVhbCBkZXNjcmlwdGlvbiBmb3IgYSBCcmVha2Rvd24gRWxlbWVudC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkNvbnRlbnREZXNjcmlwdGlvbiI+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0idXNhZ2VHdWlkYW5jZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5Qcm92aWRlcyBpbmZvcm1hdGlvbiBhbmQgZ3VpZGFuY2Ugb24gdGhlIG1lYW5pbmcgb2YgdGhlIEJvb2xlYW4gZmxhZyB2YWx1ZXMgYW5kIHVuZGVyIHdoYXQgY2lyY3Vtc3RhbmNlcyB0aGV5IHNob3VsZCBiZSBvdmVycmlkZGVuLiBGb3IgZXhhbXBsZSwgaXQgZGVzY3JpYmVzIHdoeSB0aGUgYnJlYWtkb3duIGVsZW1lbnQgaXMgb3B0aW9uYWwgb3IgY29uc2lkZXJhdGlvbnMgZm9yIHJlcGVhdGluZyBpdCBhbmQgZGlmZmVyZW5jZXMgaW4gdGhlIGluZGl2aWR1YWwgb2NjdXJyZW5jZXMgb2YgdGhpcyBCcmVha2Rvd24gRWxlbWVudCBhY3Jvc3MgdGhlIGxpZmVjeWNsZS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJBY3Rpdml0eURlc2NyaXB0aW9uIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgZ2VuZXJhbGl6ZWQgQnJlYWtkb3duIEVsZW1lbnQgRGVzY3JpcHRpb24gdGhhdCBpcyB1c2VkIHRvIHN0b3JlIHRoZSB0ZXh0dWFsIGRlc2NyaXB0aW9uIGZvciBhbiBBY3Rpdml0eS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbiI+Ci0JCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkFsdGVybmF0aXZlcyIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+Q29tcHJpc2VzIG9mIHN1bW1hcmllcyBkZXNjcmliaW5nIGltcG9ydGFudCBleGNlcHRpb25hbCBhbmQgbm9uLXN0YW5kYXJkIHdheXMgb2YgZG9pbmcgdGhlIHdvcmsgb2YgdGhpcyBBY3Rpdml0eSBub3QgY292ZXJlZCBieSB0aGUgQWN0aXZpdHkncyBUYXNrcy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Ikhvd1RvU3RhZmYiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlByb3ZpZGVzIGJhY2tncm91bmQgb24gd2hvIHNob3VsZCBiZSBpbnZvbHZlZCBpbiB0aGlzIGFjdGl2aXR5IHdoYXQgYXJlIHRoZSByZXF1aXJlZCBza2lsbHMsIGV4cGVyaWVuY2UsICBhbmQgcGVyaGFwcyBhdHRpdHVkZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJQdXJwb3NlIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5TdW1tYXJpemVzIHRoZSBtYWluIHJlYXNvbiBmb3IgcGVyZm9ybWluZyB0aGlzIEFjdGl2aXR5LCBkZXNjcmliZXMgd2hhdCB0aGUgYWN0aXZpdHkgYXMgYSB3aG9sZSBpcyBpbnRlbmRlZCB0byBhY2hpZXZlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkRlc2NyaXB0b3JEZXNjcmlwdGlvbiI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIGdlbmVyYWxpemVkIEJyZWFrZG93biBFbGVtZW50IERlc2NyaXB0aW9uIHRoYXQgaXMgdXNlZCB0byBzdG9yZSB0aGUgdGV4dHVhbCBkZXNjcmlwdGlvbiBmb3IgYSBEZXNjcmlwdG9yLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6QnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uIj4KLQkJCQk8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUmVmaW5lZERlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+QSBEZXNjcmlwdG9yIG1pZ2h0IGFkZCByZWZpbmVtZW50cyB0byB0aGUgbWFpbiBkZXNjcmlwdGlvbiBvZiB0aGUgQ29udGVudCBFbGVtZW50IGl0IHJlZmVycyB0by4gIEZvciBleGFtcGxlLCBpdCBjb3VsZCBwcm92aWRlIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gYWJvdXQgYSBXb3JrIFByb2R1Y3QgcmVsZXZhbnQgZm9yIHRoZSBzcGVjaWZpYyBwb2ludCBpbiB0aW1lIGluIHRoZSBwcm9jZXNzIHRoaXMgV29yayBQcm9kdWN0IHR5cGUgaXMgYmVpbmcgdXNlZC4gIEl0IGNvdWxkIGRlc2NyaWJlIGFkZGl0aW9uYWwgc2tpbGxzIG5lZWRlZCBmb3IgYSBSb2xlIGF0IHRoYXQgcGFydGljdWxhciBwb2ludCBpbiB0aW1lIGluIGEgcHJvY2VzcywgZXRjLiA8L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUHJvY2Vzc0Rlc2NyaXB0aW9uIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgZ2VuZXJhbGl6ZWQgQWN0aXZpdHkgRGVzY3JpcHRpb24gdGhhdCBpcyB1c2VkIHRvIHN0b3JlIHRoZSB0ZXh0dWFsIGRlc2NyaXB0aW9uIGZvciBhIFByb2Nlc3MuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpBY3Rpdml0eURlc2NyaXB0aW9uIj4KLQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iU2NvcGUiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgdGhlIHNjb3BlIG9mIHRoZSBQcm9jZXNzLCBpLmUuIHdoaWNoIHR5cGVzIG9mIHByb2plY3RzIGRvZXMgaXQgYWRkcmVzcyBhbmQgd2hpY2ggbm90LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iVXNhZ2VOb3RlcyIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+QW55IGFkZGl0aW9uYWwgbm90ZXMgb24gaG93IHRvIGFwcGx5IGFuZCBpbnN0YW50aWF0ZSB0aGlzIHByb2Nlc3MgZm9yIGEgcHJvamVjdC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJEZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbiI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIGdlbmVyYWxpemVkIFByb2Nlc3MgRGVzY3JpcHRpb24gdGhhdCBpcyB1c2VkIHRvIHN0b3JlIHRoZSB0ZXh0dWFsIGRlc2NyaXB0aW9uIGZvciBhIERlbGl2ZXJ5IFByb2Nlc3MuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpQcm9jZXNzRGVzY3JpcHRpb24iPgotCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJTY2FsZSIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+T3V0bGluZXMgY2hhcmFjdGVyaXN0aWNzIGFib3V0IHRoZSBzaXplIG9mIGEgdHlwaWNhbCBwcm9qZWN0IHRoYXQgcGVyZm9ybXMgdGhpcyBwcm9qZWN0IGV4cHJlc3NlZCBpbiB0ZWFtIHNpemUsIG1hbiB5ZWFycywgZXRjLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUHJvamVjdENoYXJhY3RlcmlzdGljcyIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+Q2hhcmFjdGVyaXplcyB0aGUgcHJvamVjdCB0aGF0IHdvdWxkIHR5cGljYWxseSBwZXJmb3JtIHRoaXMgUHJvY2VzczwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUmlza0xldmVsIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5PdXRsaW5lcyB0eXBpY2FsIHByb2plY3Qgcmlza3MgdGhhdCBhcmUgYWRkcmVzc2VkIHdpdGggdGhpcyBwcm9jZXNzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iRXN0aW1hdGluZ1RlY2huaXF1ZSIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+RGVzY3JpYmVzIHRoZSBFc3RpbWF0aW9uIFRlY2huaXF1ZXMgcHJvdmlkZWQgZm9yIHRoaXMgUHJvY2Vzcy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlByb2plY3RNZW1iZXJFeHBlcnRpc2UiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlByb3ZpZGVzIGEgcHJvZmlsZSBvZiBhIHR5cGljYWwgcHJvamVjdCB0ZWFtLCB0aGUgZGlzdHJpYnV0aW9uIG9mIHJvbGVzLCBza2lsbHMgcmVxdWlyZWQgZm9yIGEgdGVhbSBwZXJmb3JtcyBhIHByb2plY3QgYmFzZWQgb24gdGhpcyBwcm9jZXNzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iVHlwZU9mQ29udHJhY3QiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlByb3ZpZGVzIGJhY2tncm91bmQgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGNvSSdtIGNoYUknbSBudHJhY3RzIHRoYXQgbmVlZCB0byBiZSBlc3RhYmxpc2hlZCBiZXR3ZWVuIGEgcHJvamVjdCB0ZWFtIHRoYXQgcGVyZm9ybXMgdGhpcyBwcm9jZXNzIGFuZCBhIGNsaWVudCAoZS5nLiBmb3IgYW4gSUdTIGVuZ2FnZW1lbnQpLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkRlc2NyaXB0b3IiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QW4gYWJzdHJhY3QgZ2VuZXJhbGl6YXRpb24gZm9yIHNwZWNpYWwgQnJlYWtkb3duIEVsZW1lbnRzIHRoYXQgcmVmZXJlbmNlcyBvbmUgY29uY3JldGUgQ29udGVudCBFbGVtZW50LiAgQSBkZXNjcmlwdG9yIHByb3ZpZGVzIGEgcmVwcmVzZW50YXRpb24gb2YgYSBDb250ZW50IEVsZW1lbnQgd2l0aGluIGJyZWFrZG93biBzdHJ1Y3R1cmVzLiAgSW4gYWRkaXRpb24gdG8ganVzdCByZWZlcmVuY2luZyBDb250ZW50IEVsZW1lbnRzIGl0IGFsbG93cyBvdmVycmlkaW5nIHRoZSBDb250ZW50IEVsZW1lbnRzIHN0cnVjdHVyYWwgcmVsYXRpb25zaGlwcyBieSBkZWZpbmluZyBpdHMgb3duIHNldHMgb2YgYXNzb2NpYXRpb25zLgotRGVzY3JpcHRvcnMgYXJlIHRoZSBrZXkgY29uY2VwdCBmb3IgcmVhbGl6aW5nIHRoZSBzZXBhcmF0aW9uIG9mIHByb2Nlc3NlcyBmcm9tIG1ldGhvZCBjb250ZW50LiAgQSBEZXNjcmlwdG9yIGNhbiBiZSBjaGFyYWN0ZXJpemVkIGFzIGEgcmVmZXJlbmNlIG9iamVjdCBmb3Igb25lIHBhcnRpY3VsYXIgQ29udGVudCBFbGVtZW50LCB3aGljaCBoYXMgaXRzIG93biByZWxhdGlvbnNoaXBzIGFuZCBwcm9wZXJ0aWVzLiAgV2hlbiBhIERlc2NyaXB0b3IgaXMgY3JlYXRlZCBpdCBzaGFsbCBiZSBwcm92aWRlZCB3aXRoIGNvbmdydWVudCBjb3BpZXMgb2YgdGhlIHJlbGF0aW9uc2hpcHMgZGVmaW5lZCBmb3IgdGhlIHJlZmVyZW5jZWQgY29udGVudCBlbGVtZW50LiAgSG93ZXZlciwgYSB1c2VyIGNhbiBtb2RpZnkgdGhlc2UgcmVsYXRpb25zaGlwcyBmb3IgdGhlIHBhcnRpY3VsYXIgcHJvY2VzcyBzaXR1YXRpb24gZm9yIHdoaWNoIHRoZSBkZXNjcmlwdG9yIGhhcyBiZWVuIGNyZWF0ZWQuIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6QnJlYWtkb3duRWxlbWVudCI+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0iaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IldvcmtQcm9kdWN0RGVzY3JpcHRvciI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpYWwgRGVzY3JpcHRvciB0aGF0IHJlcHJlc2VudHMgYSBXb3JrIFByb2R1Y3QgaW4gdGhlIGNvbnRleHQgb2Ygb25lIHNwZWNpZmljIEFjdGl2aXR5LiAgRXZlcnkgYnJlYWtkb3duIHN0cnVjdHVyZSBjYW4gZGVmaW5lIGRpZmZlcmVudCByZWxhdGlvbnNoaXBzIG9mIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9ycyB0byBUYXNrIERlc2NyaXB0b3JzIGFuZCBSb2xlIERlc2NyaXB0b3JzLiAgVGhlcmVmb3JlIG9uZSBXb3JrIFByb2R1Y3QgY2FuIGJlIHJlcHJlc2VudGVkIGJ5IG1hbnkgV29yayBQcm9kdWN0IERlc2NyaXB0b3JzIGVhY2ggd2l0aGluIHRoZSBjb250ZXh0IG9mIGFuIEFjdGl2aXR5IHdpdGggaXRzIG93biBzZXQgb2YgcmVsYXRpb25zaGlwcy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkRlc2NyaXB0b3IiPgotCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJXb3JrUHJvZHVjdCIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJSZXNwb25zaWJsZVJvbGUiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotCQkJCQk8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJFeHRlcm5hbElucHV0VG8iIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJJbXBhY3RlZEJ5IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iSW1wYWN0cyIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Ik1hbmRhdG9yeUlucHV0VG8iIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJPcHRpb25hbElucHV0VG8iIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJPdXRwdXRGcm9tIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iRGVsaXZlcmFibGVQYXJ0cyIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWN0aXZpdHlFbnRyeVN0YXRlIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkdpdmVuIHRoYXQgYW4gaW5zdGFuY2Ugb2YgV29yayBQcm9kdWN0IERlc2NyaXB0b3IgaGFzIGJlZW4gY3JlYXRlZCBmb3IgYSBzcGVjaWZpYyBBY3Rpdml0eSwgdGhlbiB0aGUgQWN0aXZpdHkgRW50cnkgU3RhdGUgYXR0cmlidXRlIHNwZWNpZmllcyB0aGUgZGVzaXJlZCBzdGF0ZSBvZiBpbnN0YW5jZXMgb2YgdGhlIHJlZmVyZW5jZWQgV29yayBQcm9kdWN0IHdoZW4gd29yayBvbiB0aGUgQWN0aXZpdHkgaXMgaW5pdGlhdGVkIChpLmUuIHdvcmsgb24gdGhlIEFjdGl2aXR5J3MgVGFzayBEZXNjcmlwdG9ycyBpcyBiZWluZyBpbml0aWF0ZWQgdGhhdCB1c2UgdGhpcyBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvciBhcyBpbnB1dCkuICAKLUZvciBzb21lIFdvcmsgUHJvZHVjdHMgc3RhdGUgaXMgZXhwcmVzc2VkIGluIHBlcmNlbnRhZ2Ugb2YgY29tcGxldGlvbiwgY29tcGxpYW5jZSB0byB3b3JrIHByb2R1Y3QgY2hlY2tsaXN0LCBpbmZvcm1hbCBzdGF0ZSBkZXNjcmlwdGlvbnMsIGV0Yy4gIE90aGVycyBoYXZlIHZlcnkgc3BlY2lmaWMgc3RhdGVzIGV4cHJlc3NlZCBhcyBlbnVtZXJhdGlvbnMgc3VjaCBhcyBbaWRlbnRpZmllZCwgYnJpZWZseSBkZXNjcmliZWQsIG91dGxpbmVkLCBkZXRhaWxlZF0gZm9yIHVzZSBjYXNlcy4gIE90aGVyIFdvcmsgUHJvZHVjdCBzdGF0ZXMgcmVsYXRlIHRvIHNvbWUgcXVhbGl0eSBtZWFzdXJlcyBvciBsaWZlY3ljbGUgc3RhdGVzIHN1Y2ggYXMgW3Jldmlld2VkLCBpbXBsZW1lbnRlZCwgdGVzdGVkXS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhY3Rpdml0eUV4aXRTdGF0ZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5HaXZlbiB0aGF0IGFuIGluc3RhbmNlIG9mIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9yIGhhcyBiZWVuIGNyZWF0ZWQgZm9yIGEgc3BlY2lmaWMgQWN0aXZpdHksIHRoZW4gdGhlIEFjdGl2aXR5IEV4aXN0IFN0YXRlIGF0dHJpYnV0ZSBzcGVjaWZpZXMgdGhlIGRlc2lyZWQgc3RhdGUgb2YgaW5zdGFuY2VzIG9mIHRoZSByZWZlcmVuY2VkIFdvcmsgUHJvZHVjdCB3aGVuIHdvcmsgb24gdGhlIEFjdGl2aXR5IGlzIGZpbmlzaGVkIChpLmUuIHdvcmsgb24gdGhlIEFjdGl2aXR5J3MgVGFzayBEZXNjcmlwdG9ycyBoYXMgZmluaXNoZWQgdGhhdCBoYXZlIHRoaXMgV29yayBQcm9kdWN0IERlc2NyaXB0b3IgYXMgb3V0cHV0KS4KLUZvciBzb21lIFdvcmsgUHJvZHVjdHMgc3RhdGUgaXMgZXhwcmVzc2VkIGluIHBlcmNlbnRhZ2Ugb2YgY29tcGxldGlvbiwgY29tcGxpYW5jZSB0byB3b3JrIHByb2R1Y3QgY2hlY2tsaXN0LCBpbmZvcm1hbCBzdGF0ZSBkZXNjcmlwdGlvbnMsIGV0Yy4gIE90aGVycyBoYXZlIHZlcnkgc3BlY2lmaWMgc3RhdGVzIGV4cHJlc3NlZCBhcyBlbnVtZXJhdGlvbnMgc3VjaCBhcyBbaWRlbnRpZmllZCwgYnJpZWZseSBkZXNjcmliZWQsIG91dGxpbmVkLCBkZXRhaWxlZF0gZm9yIHVzZSBjYXNlcy4gIE90aGVyIFdvcmsgUHJvZHVjdCBzdGF0ZXMgcmVsYXRlIHRvIHNvbWUgcXVhbGl0eSBtZWFzdXJlcyBvciBsaWZlY3ljbGUgc3RhdGVzIHN1Y2ggYXMgW3Jldmlld2VkLCBpbXBsZW1lbnRlZCwgdGVzdGVkXS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJSb2xlRGVzY3JpcHRvciI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpYWwgRGVzY3JpcHRvciB0aGF0IHJlcHJlc2VudHMgYSBSb2xlIGluIHRoZSBjb250ZXh0IG9mIG9uZSBzcGVjaWZpYyBBY3Rpdml0eS4gIEV2ZXJ5IGJyZWFrZG93biBzdHJ1Y3R1cmUgY2FuIGRlZmluZSBkaWZmZXJlbnQgcmVsYXRpb25zaGlwcyBvZiBSb2xlIERlc2NyaXB0b3JzIHRvIFRhc2sgRGVzY3JpcHRvcnMgYW5kIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9ycy4gIFRoZXJlZm9yZSBvbmUgUm9sZSBjYW4gYmUgcmVwcmVzZW50ZWQgYnkgbWFueSBSb2xlIERlc2NyaXB0b3JzIGVhY2ggd2l0aGluIHRoZSBjb250ZXh0IG9mIGFuIEFjdGl2aXR5IHdpdGggaXRzIG93biBzZXQgb2YgcmVsYXRpb25zaGlwcy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkRlc2NyaXB0b3IiPgotCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJSb2xlIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlJlc3BvbnNpYmxlRm9yIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iVGFza0Rlc2NyaXB0b3IiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWFsIERlc2NyaXB0b3IgdGhhdCByZXByZXNlbnRzIGEgcHJveHkgZm9yIGEgVGFzayBpbiB0aGUgY29udGV4dCBvZiBvbmUgc3BlY2lmaWMgQWN0aXZpdHkuICBFdmVyeSBicmVha2Rvd24gc3RydWN0dXJlIGNhbiBkZWZpbmUgZGlmZmVyZW50IHJlbGF0aW9uc2hpcHMgb2YgVGFzayBEZXNjcmlwdG9ycyB0byBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvcnMgYW5kIFJvbGUgRGVzY3JpcHRvcnMuIFRoZXJlZm9yZSBvbmUgVGFzayBjYW4gYmUgcmVwcmVzZW50ZWQgYnkgbWFueSBUYXNrIERlc2NyaXB0b3JzIGVhY2ggd2l0aGluIHRoZSBjb250ZXh0IG9mIGFuIEFjdGl2aXR5IHdpdGggaXRzIG93biBzZXQgb2YgcmVsYXRpb25zaGlwcy4KLUEga2V5IGRpZmZlcmVuY2UgYmV0d2VlbiBNZXRob2QgQ29udGVudCBhbmQgUHJvY2VzcyBpcyB0aGF0IGEgQ29udGVudCBFbGVtZW50IHN1Y2ggYXMgVGFzayBkZXNjcmliZXMgYWxsIGFzcGVjdHMgb2YgZG9pbmcgd29yayBkZWZpbmVkIGFyb3VuZCB0aGlzIFRhc2suICBUaGlzIGRlc2NyaXB0aW9uIGlzIG1hbmFnZWQgaW4gc3RlcHMsIHdoaWNoIGFyZSBtb2RlbGVkIGFzIFNlY3Rpb25zIG9mIHRoZSBUYXNrcycgQ29udGVudCBEZXNjcmlwdGlvbnMuICBXaGVuIGFwcGx5aW5nIGEgVGFzayBpbiBhIFByb2Nlc3MnIEFjdGl2aXR5IHdpdGggYSBUYXNrIERlc2NyaXB0b3IgYSBQcm9jZXNzIEVuZ2luZWVyIG5lZWRzIHRvIGluZGljYXRlIHRoYXQgYXQgdGhhdCBwYXJ0aWN1bGFyIHBvaW50IGluIHRpbWUgaW4gdGhlIFByb2Nlc3MgZGVmaW5pdGlvbiBmb3Igd2hpY2ggdGhlIFRhc2sgRGVzY3JpcHRvciBoYXMgYmVlbiBjcmVhdGVkLCBvbmx5IGEgc3Vic2V0IG9mIHN0ZXBzIHNoYWxsIGJlIHBlcmZvcm1lZC4gIEhlIGRlZmluZXMgdGhpcyBzZWxlY3Rpb24gdXNpbmcgdGhlIHNlbGVjdGVkU3RlcHMgYXNzb2NpYXRpb24uICBJZiBoZSB3YW50cyB0byBhZGQgc3RlcHMgdG8gYSBUYXNrIERlc2NyaXB0b3IsIGhlIGNhbiBkZXNjcmliZSB0aGVzZSBlaXRoZXIgcHJhZ21hdGljYWxseSBpbiB0aGUgcmVmaW5lZERlc2NyaXB0aW9uIGF0dHJpYnV0ZSBvciAncHJvcGVybHknIGNyZWF0ZSBhIGNvbnRyaWJ1dGluZyBUYXNrIHRvIHRoZSBUYXNrIHRoZSBUYXNrIERlc2NyaXB0b3IgcmVmZXJzIHRvLgotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpXb3JrQnJlYWtkb3duRWxlbWVudCI+Ci0JCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlRhc2siIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUGVyZm9ybWVkUHJpbWFyaWx5QnkiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotCQkJCQk8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJBZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkFzc2lzdGVkQnkiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJFeHRlcm5hbElucHV0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iTWFuZGF0b3J5SW5wdXQiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJPcHRpb25hbElucHV0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iT3V0cHV0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCTwveHNkOmNob2ljZT4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlN0ZXAiIHR5cGU9InVtYTpTZWN0aW9uIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0iaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkNvbXBvc2l0ZVJvbGUiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWFsIFJvbGUgRGVzY3JpcHRvciB0aGF0IHJlbGF0ZXMgdG8gbW9yZSB0aGVuIG9uZSBSb2xlLiAgSXQgcmVwcmVzZW50cyBhIGdyb3VwaW5nIG9mIFJvbGVzIHdpdGggdGhlIG1haW4gcHVycG9zZSBvZiBzaW1wbGlmaWNhdGlvbiwgaS5lLiByZWR1Y2luZyB0aGUgbnVtYmVyIG9mIHJvbGVzIGZvciBhIHByb2Nlc3MuCi1BIENvbXBvc2l0ZSBSb2xlIGlzIGEgZ3JvdXBpbmcgb2YgUm9sZXMgdGhhdCBjYW4gYmUgdXNlZCBpbiBhbiBBY3Rpdml0eSBvciBQcm9jZXNzIHRvIHJlZHVjZSB0aGUgbnVtYmVyIG9mIFJvbGVzLiAgQSB0eXBpY2FsIGFwcGxpY2F0aW9uIHdvdWxkIGJlIGEgcHJvY2VzcyBmb3IgYSBzbWFsbCB0ZWFtIGluIHdoaWNoIGEgc3RhbmRhcmQgc2V0IG9mIHJvbGVzIGZyb20gdGhlIG1ldGhvZCBjb250ZW50IHdvdWxkIGJlIGFsbCBwZXJmb3JtZWQgYnkgb25lIG9yIG1vcmUgcmVzb3VyY2UuICBCeSB1c2luZyBDb21wb3NpdGUgUm9sZSB0aGUgcHJvY2VzcyB3b3VsZCBzdWdnZXN0IGEgdHlwaWNhbCBjbHVzdGVyaW5nIG9mIFJvbGVzIHRvIFJlc291cmNlcy4gIEEgQ29tcG9zaXRlIFJvbGUgY291bGQgcGVyZm9ybSBhbGwgVGFza3MgZGVmaW5lZCBmb3IgdGhlIFJvbGVzIGl0IHJlZmVycyB0by48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOlJvbGVEZXNjcmlwdG9yIj4KLQkJCQk8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkFnZ3JlZ2F0ZWRSb2xlIiB0eXBlPSJ1bWE6Um9sZSIvPgotCQkJCTwveHNkOmNob2ljZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJUZWFtUHJvZmlsZSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIEJyZWFrZG93biBFbGVtZW50IHRoYXQgZ3JvdXBzIFJvbGUgRGVzY3JpcHRvcnMgb3IgUmVzb3VyY2UgRGVmaW5pdGlvbnMgZGVmaW5pbmcgYSBuZXN0ZWQgaGllcmFyY2h5IG9mIHRlYW1zIGFuZCB0ZWFtIG1lbWJlcnMuCi1Xb3JrIGFzc2lnbm1lbnRzIGFuZCBXb3JrIFByb2R1Y3QgcmVzcG9uc2liaWxpdGllcyBjYW4gYmUgZGlmZmVyZW50IGZyb20gQWN0aXZpdHkgdG8gQWN0aXZpdHkgaW4gYSBkZXZlbG9wbWVudCBwcm9qZWN0LiBEaWZmZXJlbnQgcGhhc2VzIHJlcXVpcmUgZGlmZmVyZW50IHN0YWZmaW5nIHByb2ZpbGVzLCBpLmUuIGRpZmZlcmVudCBza2lsbHMgYW5kIHJlc291cmNlcyBkb2luZyBkaWZmZXJlbnQgdHlwZXMgb2Ygd29yay4gIFRoZXJlZm9yZSwgYSBwcm9jZXNzIG5lZWRzIHRvIGRlZmluZSBzdWNoIGRpZmZlcmVudCBwcm9maWxlcyBpbiBhIGZsZXhpYmxlIG1hbm5lci4gIFdoZXJlYXMgQ29yZSBNZXRob2QgQ29udGVudCBkZWZpbmVzIHN0YW5kYXJkIHJlc3BvbnNpYmlsaXRpZXMgYW5kIGFzc2lnbm1lbnRzLCBhIHByb2Nlc3MgZXhwcmVzcyBieSBhIGJyZWFrZG93biBzdHJ1Y3R1cmVzIG5lZWRzIHRvIGJlIGFibGUgcmVmaW5lIGFuZCByZWRlZmluZSB0aGVzZSB0aHJvdWdob3V0IGl0cyBkZWZpbml0aW9uLiAgUm9sZSBEZXNjcmlwdG9ycywgUmVzb3VyY2UgRGVmaW5pdGlvbnMsIGFzIHdlbGwgYXMgVGVhbSBQcm9maWxlcyBwcm92aWRlIHRoZSBkYXRhIHN0cnVjdHVyZSBuZWNlc3NhcnkgdG8gYWNoaWV2ZSB0aGlzIGZsZXhpYmlsaXR5IGFuZCB0byBwcm92aWRlIGEgcHJvY2VzcyB1c2VyIHdpdGggdGhlIGNhcGFiaWxpdHkgdG8gZGVmaW5lIGRpZmZlcmVudCB0ZWFtcyBhbmQgcm9sZSByZWxhdGlvbnNoaXBzIGZvciBldmVyeSBBY3Rpdml0eSAoaW5jbHVkaW5nIEFjdGl2aXRpZXMgb24gYW55IG5lc3RpbmctbGV2ZWwgYXMgd2VsbCBhcyBJdGVyYXRpb25zIG9yIFBoYXNlcykuCi1IZW5jZSwgaW4gYWRkaXRpb24gdG8gdGhlIHdvcmsgYnJlYWtkb3duIGFuZCB3b3JrIHByb2R1Y3QgYnJlYWtkb3duIHN0cnVjdHVyZXMgZGVmaW5lZCBzbyBmYXIsIFRlYW0gUHJvZmlsZXMgYXJlIHVzZWQgdG8gZGVmaW5lIGEgdGhpcmQgdHlwZSBvZiBicmVha2Rvd24gc3RydWN0dXJlOiB0ZWFtIGJyZWFrZG93biBzdHJ1Y3R1cmVzLiAgVGhlc2UgYXJlIGNyZWF0ZWQgYXMgYW4gQWN0aXZpdHkgc3BlY2lmaWMgaGllcmFyY2h5IG9mIFRlYW0gUHJvZmlsZXMgY29tcHJpc2luZyBvZiBSb2xlIERlc2NyaXB0b3JzIGFuZCBSZXNvdXJjZSBEZWZpbml0aW9ucy4gIFRoZXNlIHN0cnVjdHVyZXMgY2FuIGJlIHByZXNlbnRlZCBhcyB3ZWxsLWtub3duIE9yZy1DaGFydHMuICBKdXN0IGFzIHdpdGggYW55IG90aGVyIEJyZWFrZG93biBFbGVtZW50IGFuZCBEZXNjcmlwdG9ycywgVGVhbSBQcm9maWxlcyBjYW4gYmUgZGVmaW5lZCB3aXRoaW4gdGhlIHNjb3BlIG9mIGFueSBBY3Rpdml0eSBpbiBhIGJyZWFrZG93biBzdHJ1Y3R1cmUuICBJbiBvdGhlciB3b3JkcyBldmVyeSBBY3Rpdml0eSBjYW4gZGVmaW5lIGl0cyBvd24gVGVhbSBQcm9maWxlcyBjb25zaXN0aW5nIG9mIEFjdGl2aXR5IHNwZWNpZmljIFJvbGUgRGVzY3JpcHRvcnMgYW5kIFJlc291cmNlIERlZmluaXRpb25zLiAgVHlwaWNhbGx5LCBUZWFtIFByb2ZpbGVzIGFyZSBkZWZpbmVkIG9uIHRoZSBsZXZlbCBvZiBJdGVyYXRpb25zIG9yIFBoYXNlcyBvciBvdGhlciBoaWdoZXItbGV2ZWwgQWN0aXZpdHkuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpCcmVha2Rvd25FbGVtZW50Ij4KLQkJCQk8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlJvbGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlN1cGVyVGVhbSIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iU3ViVGVhbSIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCTwveHNkOmNob2ljZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJQcm9jZXNzIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lhbCBBY3Rpdml0eSB0aGF0IGRlc2NyaWJlcyBhIHN0cnVjdHVyZSBmb3IgcGFydGljdWxhciB0eXBlcyBvZiBkZXZlbG9wbWVudCBwcm9qZWN0cy4gIFRvIHBlcmZvcm0gc3VjaCBhIGRldmVsb3BtZW50IHByb2plY3QgYSBQcm9jZXNzZXMgd291bGQgYmUgJ2luc3RhbnRpYXRlZCcgYW5kIGFkYXB0ZWQgZm9yIHRoZSBzcGVjaWZpYyBzaXR1YXRpb24uICBQcm9jZXNzIGlzIGFuIGFic3RyYWN0IGNsYXNzIGFuZCB0aGlzIG1ldGEtbW9kZWwgZGVmaW5lcyBkaWZmZXJlbnQgc3BlY2lhbCB0eXBlcyBvZiBQcm9jZXNzZXMgZm9yIGRpZmZlcmVudCBwcm9jZXNzIG1hbmFnZW1lbnQgYXBwbGljYXRpb25zIGFuZCBkaWZmZXJlbnQgc2l0dWF0aW9ucyBvZiBwcm9jZXNzIHJldXNlLiAgRXZlcnkgUHJvY2VzcyBjb21wcmlzZXMgb2YgYW5kIGlzIHRoZSB0b3AtbGV2ZWwgZWxlbWVudCBvZiBhbiBuLWxldmVsIGJyZWFrZG93biBzdHJ1Y3R1cmUgdXNpbmcgdGhlIE5lc3RpbmcgYXNzb2NpYXRpb24gZGVmaW5lZCBvbiBBY3Rpdml0eS4KLUNvcmUgTWV0aG9kIENvbnRlbnQgcHJvdmlkZXMgc3RlcC1ieS1zdGVwIGV4cGxhbmF0aW9ucywgZGVzY3JpYmluZyBob3cgdmVyeSBzcGVjaWZpYyBkZXZlbG9wbWVudCBnb2FscyBhcmUgYWNoaWV2ZWQgaW5kZXBlbmRlbnQgb2YgdGhlIHBsYWNlbWVudCBvZiB0aGVzZSBzdGVwcyB3aXRoaW4gYSBkZXZlbG9wbWVudCBsaWZlY3ljbGUuICBQcm9jZXNzZXMgdGFrZSB0aGVzZSBtZXRob2QgZWxlbWVudHMgYW5kIHJlbGF0ZSB0aGVtIGludG8gc2VtaS1vcmRlcmVkIHNlcXVlbmNlcyB0aGF0IGFyZSBjdXN0b21pemVkIHRvIHNwZWNpZmljIHR5cGVzIG9mIHByb2plY3RzLiAgVGh1cywgYSBwcm9jZXNzIGlzIGEgc2V0IG9mIHBhcnRpYWxseSBvcmRlcmVkIHdvcmsgZGVzY3JpcHRpb25zIGludGVuZGVkIHRvIHJlYWNoIGEgaGlnaGVyIGRldmVsb3BtZW50IGdvYWwsIHN1Y2ggYXMgdGhlIHJlbGVhc2Ugb2YgYSBzcGVjaWZpYyBzb2Z0d2FyZSBzeXN0ZW0uICBBIHByb2Nlc3MgYW5kIHRoZSBwcm9jZXNzIG1ldGEtbW9kZWwgc3RydWN0dXJlIGRlZmluZWQgaW4gdGhpcyBzcGVjaWZpY2F0aW9uIGZvY3VzZXMgb24gdGhlIGxpZmVjeWNsZSBhbmQgdGhlIHNlcXVlbmNpbmcgb2Ygd29yayBpbiBicmVha2Rvd24gc3RydWN0dXJlcy4gIFRvIGFjaGlldmUgdGhpcyBpdCB1c2VzIHRoZSBEZXNjcmlwdG9yIGNvbmNlcHQgcmVmZXJlbmNpbmcgbWV0aG9kIGNvbnRlbnQgYW5kIGFsbG93aW5nIGRlZmluaW5nIHRpbWUtc3BlY2lmaWMgY3VzdG9taXphdGlvbnMgb2YgdGhlIHJlZmVyZW5jZWQgY29udGVudCAoZS5nLiBkZWZpbmluZyBhIGZvY3VzIG9uIGRpZmZlcmVudCBzdGVwcyBvZiB0aGUgc2FtZSBUYXNrIGFuZCBwcm92aWRpbmcgaW5wdXQgV29yayBQcm9kdWN0cyBpbiBkaWZmZXJlbnQgc3RhdGVzIHdpdGhpbiB0aGUgZGlmZmVyZW50IFBoYXNlcyBvZiBhIHByb2Nlc3MgbGlmZWN5Y2xlIGluIHdoaWNoIHRoZSBzYW1lIFRhc2sgaXMgcGVyZm9ybWVkKS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkFjdGl2aXR5Ij4KLQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iSW5jbHVkZXNQYXR0ZXJuIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJEZWZhdWx0Q29udGV4dCIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJWYWxpZENvbnRleHQiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJkaWFncmFtVVJJIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBVUkkgb2YgdGhlIGRpYWdyYW0gZmlsZSBhc3NvY2lhdGVkIHdpdGggdGhlIHByb2Nlc3MuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iRGVsaXZlcnlQcm9jZXNzIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lhbCBQcm9jZXNzIGRlc2NyaWJpbmcgYSBjb21wbGV0ZSBhbmQgaW50ZWdyYXRlZCBhcHByb2FjaCBmb3IgcGVyZm9ybWluZyBhIHNwZWNpZmljIHByb2plY3QgdHlwZS4gIEl0IGRlc2NyaWJlcyBhIGNvbXBsZXRlIHByb2plY3QgbGlmZWN5Y2xlIGVuZC10by1lbmQgYW5kIHNoYWxsIGJlIHVzZWQgYXMgYSByZWZlcmVuY2UgZm9yIHJ1bm5pbmcgcHJvamVjdHMgd2l0aCBzaW1pbGFyIGNoYXJhY3RlcmlzdGljcyBhcyBkZWZpbmVkIGZvciB0aGUgcHJvY2Vzcy4gIEEgRGVsaXZlcnkgUHJvY2VzcyBpcyByZWxhdGVkIHRvIHNwZWNpZmljIHN1cHBvcnRpbmcgaW5mb3JtYXRpb24gc3VjaCBhcyBSb2FkbWFwcyAoaW5oZXJpdGVkIHZpYSBBY3Rpdml0eSkgYXMgd2VsbCBhcyBDb21tdW5pY2F0aW9ucyBhbmQgRWR1Y2F0aW9uIE1hdGVyaWFsLgotQSBEZWxpdmVyeSBQcm9jZXNzIGlzIGEgUHJvY2VzcyB0aGF0IGNvdmVycyBhIHdob2xlIGRldmVsb3BtZW50IGxpZmVjeWNsZSBmcm9tIGJlZ2lubmluZyB0byBlbmQuICBBIERlbGl2ZXJ5IFByb2Nlc3Mgc2hhbGwgYmUgdXNlZCBhcyBhIHRlbXBsYXRlIGZvciBwbGFubmluZyBhbmQgcnVubmluZyBhIHByb2plY3QuICBJdCBwcm92aWRlcyBhIGNvbXBsZXRlIGxpZmVjeWNsZSBtb2RlbCB3aXRoIHByZWRlZmluZWQgcGhhc2VzLCBpdGVyYXRpb25zLCBhbmQgYWN0aXZpdGllcyB0aGF0IGhhdmUgYmVlbiBkZXRhaWxlZCBieSBzZXF1ZW5jaW5nIHJlZmVyZW5jaW5nIG1ldGhvZCBjb250ZW50IGluIGJyZWFrZG93biBzdHJ1Y3R1cmVzLiAgSXQgaXMgZGVmaW5lZCBvbiB0aGUgYmFzaXMgb2YgZXhwZXJpZW5jZSB3aXRoIHBhc3QgcHJvamVjdHMgb3IgZW5nYWdlbWVudHMsIGFuZC9vciB0aGUgYmVzdCBwcmFjdGljZSB1c2Ugb2YgYSBkZXZlbG9wbWVudCBvciBkZWxpdmVyeSBhcHByb2FjaC4gIEl0IGRlZmluZXMgd2hhdCBnZXRzIHByb2R1Y2VkLCBob3cgdGhvc2UgaXRlbXMgYXJlIHByb2R1Y2VkLCBhbmQgdGhlIHJlcXVpcmVkIHN0YWZmaW5nIGluIHRoZSBmb3JtIG9mIGludGVncmF0ZWQgV29yaywgV29yayBQcm9kdWN0LCBhbmQgVGVhbSBCcmVha2Rvd24gU3RydWN0dXJlcy4gIEZvciBleGFtcGxlLCBhIHByb2Nlc3MgZW5naW5lZXIgY2FuIGRlZmluZSBhbHRlcm5hdGl2ZSBEZWxpdmVyeSBQcm9jZXNzZXMgZm9yIHNvZnR3YXJlIGRldmVsb3BtZW50IHByb2plY3RzIHRoYXQgZGlmZmVyIGluIHRoZSBzY2FsZSBvZiB0aGUgZW5nYWdlbWVudCBhbmQgc3RhZmZpbmcgbmVjZXNzYXJ5LCB0aGUgdHlwZSBvZiB0aGUgc29mdHdhcmUgYXBwbGljYXRpb24gdG8gYmUgZGV2ZWxvcGVkLCB0aGUgZGV2ZWxvcG1lbnQgbWV0aG9kcyBhbmQgdGVjaG5vbG9naWVzIHRvIGJlIHVzZWQsIGV0Yy4gIEFsdGhvdWdoLCB0aGUgRGVsaXZlcnkgUHJvY2VzcyBhaW1zIHRvIGNvdmVyIGEgd2hvbGUgcHJvamVjdCBpdCBrZWVwcyBjZXJ0YWluIGRlY2lzaW9uIHRoYXQgYXJlIHRvbyBwcm9qZWN0IHNwZWNpZmljIG9wZW4uICBGb3IgZXhhbXBsZSwgdGhlIGJyZWFrZG93biBzdHJ1Y3R1cmUgZGVmaW5lcyB3aGljaCBCcmVha2Rvd24gRWxlbWVudHMgaGF2ZSBtdWx0aXBsZSBvY2N1cnJlbmNlcyBvciBpcyByZXBlYXRhYmxlIHZpYSBpdCByZXNwZWN0aXZlIGF0dHJpYnV0ZXMsIGJ1dCBkb2VzIG5vdCBzYXkgaG93IG1hbnkgb2NjdXJyZW5jZXMgYW5kIGhvdyBtYW55IHJlcGVhdHMvaXRlcmF0aW9ucyBpdCB3aWxsIGhhdmUuICBUaGVzZSBkZWNpc2lvbnMgaGF2ZSB0byBiZSBkb25lIGJ5IGEgcHJvamVjdCBtYW5hZ2VyIHdoZW4gcGxhbm5pbmcgYSBjb25jcmV0ZSBwcm9qZWN0LCBwcm9qZWN0IHBoYXNlLCBvciBwcm9qZWN0IGl0ZXJhdGlvbnMuICBBIERlbGl2ZXJ5IFByb2Nlc3MgaXMgYWx3YXlzIGEgY29tcGxldGUgZGVzY3JpcHRpb24gb2YgYSBwcm9jZXNzIGluIHRlcm1zIG9mIGNvbXBsZXRlbmVzcyBvZiB0aGUgbGlmZWN5Y2xlLCBhcyB3ZWxsIGFzIGluIHRlcm1zIG9mIGFsbCB0aHJlZSB2aWV3cyBvbiB0aGUgcHJvY2VzcyB3aGljaCBhcmUgdGhlIFdvcmsgQnJlYWtkb3duIFN0cnVjdHVyZSwgV29yayBQcm9kdWN0IEJyZWFrZG93biBTdHJ1Y3R1cmUsIGFuZCBUZWFtIEJyZWFrZG93biBTdHJ1Y3R1cmUgaGF2ZSB0byBiZSBmdWxseSBhbmQgY29uc2lzdGVudGx5IHBvcHVsYXRlZC4gIENvbnNpc3RlbmN5IG9mIGEgRGVsaXZlcnkgUHJvY2VzcyBpcyBhY3R1YWxseSBlbnN1cmVkIGJ5IHRoZSBmYWN0IHRoYXQgYWxsIHRocmVlIGJyZWFrZG93bnMgYXJlIHJlcHJlc2VudGVkIGJ5IG9uZSBzaW5nbGUgZGF0YSBzdHJ1Y3R1cmUgYW5kIG9uZSBwYXJ0aWN1bGFyIGJyZWFrZG93biBzdWNoIGFzIFRlYW0gQnJlYWtkb3duIGlzIGp1c3QgYSB2aWV3IG9uIHRoYXQgZGF0YSBzdHJ1Y3R1cmUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpQcm9jZXNzIj4KLQkJCQk8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkNvbW11bmljYXRpb25zTWF0ZXJpYWwiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkVkdWNhdGlvbk1hdGVyaWFsIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJPC94c2Q6Y2hvaWNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkNhcGFiaWxpdHlQYXR0ZXJuIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lhbCBQcm9jZXNzIHRoYXQgZGVzY3JpYmVzIGEgcmV1c2FibGUgY2x1c3RlciBvZiBkb2luZyB3b3JrIGluIGNvbW1vbiBwcm9jZXNzIGFyZWFzLiAgQ2FwYWJpbGl0aWVzIFBhdHRlcm5zIGV4cHJlc3MgYW5kIGNvbW11bmljYXRlIHByb2Nlc3Mga25vd2xlZGdlIGZvciBhIGtleSBhcmVhIG9mIGludGVyZXN0IHN1Y2ggYXMgYSBEaXNjaXBsaW5lIGFuZCBjYW4gYmUgZGlyZWN0bHkgdXNlZCBieSBwcm9jZXNzIHByYWN0aXRpb25lciB0byBndWlkZSBoaXMgd29yay4gIFRoZXkgYXJlIGFsc28gdXNlZCBhcyBidWlsZGluZyBibG9ja3MgdG8gYXNzZW1ibGUgRGVsaXZlcnkgUHJvY2Vzc2VzIG9yIGxhcmdlciBDYXBhYmlsaXR5IFBhdHRlcm5zIGVuc3VyaW5nIG9wdGltYWwgcmV1c2UgYW5kIGFwcGxpY2F0aW9uIG9mIHRoZSBrZXkgcHJhY3RpY2VzIHRoZXkgZXhwcmVzcy4KLUEgQ2FwYWJpbGl0eSBQYXR0ZXJuIGlzIGEgc3BlY2lhbCBQcm9jZXNzIHRoYXQgZGVzY3JpYmVzIGEgcmV1c2FibGUgY2x1c3RlciBvZiBkb2luZyB3b3JrIGluIGEgZ2VuZXJhbCBwcm9jZXNzIGFyZWEgdGhhdCBwcm92aWRlcyBhIGNvbnNpc3RlbnQgZGV2ZWxvcG1lbnQgYXBwcm9hY2ggdG8gY29tbW9uIHByb2JsZW1zLiAgRXhhbXBsZXMgZm9yIENhcGFiaWxpdHkgUGF0dGVybiBjb3VsZCBiZSAndXNlIGNhc2UtYmFzZWQgcmVxdWlyZW1lbnRzIG1hbmFnZW1lbnQnLCAndXNlIGNhc2UgYW5hbHlzaXMnLCBvciAndW5pdCB0ZXN0aW5nJy4gVHlwaWNhbGx5IGJ1dCBub3QgbmVjZXNzYXJpbHksIENhcGFiaWxpdHkgUGF0dGVybnMgaGF2ZSB0aGUgc2NvcGUgb2Ygb25lIGRpc2NpcGxpbmUgcHJvdmlkaW5nIGEgYnJlYWtkb3duIG9mIHJldXNhYmxlIGNvbXBsZXggQWN0aXZpdGllcywgcmVsYXRpb25zaGlwcyB0byB0aGUgUm9sZXMgd2hpY2ggcGVyZm9ybSBUYXNrcyB3aXRoaW4gdGhlc2UgQWN0aXZpdGllcywgYXMgd2VsbCBhcyB0byB0aGUgV29yayBQcm9kdWN0cyB0aGF0IGFyZSB1c2VkIGFuZCBwcm9kdWNlZC4gIEEgY2FwYWJpbGl0eSBwYXR0ZXJuIGRvZXMgbm90IHJlbGF0ZSB0byBhbnkgc3BlY2lmaWMgcGhhc2Ugb3IgaXRlcmF0aW9uIG9mIGEgZGV2ZWxvcG1lbnQgbGlmZWN5Y2xlLCBhbmQgc2hvdWxkIG5vdCBpbXBseSBhbnkuICBJbiBvdGhlciB3b3JkcywgYSBwYXR0ZXJuIHNob3VsZCBiZSBkZXNpZ25lZCBpbiBhIHdheSB0aGF0IGl0IGlzIGFwcGxpY2FibGUgYW55d2hlcmUgaW4gYSBEZWxpdmVyeSBQcm9jZXNzLiAgVGhpcyBlbmFibGVzIGl0cyBBY3Rpdml0aWVzIHRvIGJlIGZsZXhpYmx5IGFzc2lnbmVkIHRvIHdoYXRldmVyIHBoYXNlcyB0aGVyZSBhcmUgaW4gdGhlIERlbGl2ZXJ5IFByb2Nlc3MgdG8gd2hpY2ggaXQgaXMgYmVpbmcgYXBwbGllZC4gIEl0IGlzIGEgZ29vZCBwcmFjdGljZSB0byBkZXNpZ24gYSBDYXBhYmlsaXR5IFBhdHRlcm4gdG8gcHJvZHVjZSBvbmUgb3IgbW9yZSBnZW5lcmljIERlbGl2ZXJhYmxlcy4gIFRoZSB0eXBpY2FsIGNvbmZpZ3VyYXRpb24gaXMgdGhhdCBlYWNoIEFjdGl2aXR5IGluIHRoZSBDYXBhYmlsaXR5IFBhdHRlcm4gcHJvZHVjZXMgb25lIERlbGl2ZXJhYmxlLCBhbmQgdGhlIGxhc3QgVGFzayBEZXNjcmlwdG9yIGluIHRoZSBBY3Rpdml0eSBleHBsaWNpdGx5IG91dHB1dHMganVzdCB0aGlzIERlbGl2ZXJhYmxlLiAgVGhpcyBlbmFibGVzIHRoZSBwcm9jZXNzIGVuZ2luZWVyIHRvIHNlbGVjdCBQYXR0ZXJucyBvciBqdXN0IEFjdGl2aXRpZXMgYnkgZGVjaWRpbmcgd2hpY2ggRGVsaXZlcmFibGVzIGFyZSByZXF1aXJlZC4gIEl0IGFsc28gb2ZmZXJzIGEgc2ltcGxlIGludGVncmF0aW9uIGFwcHJvYWNoOiBhbiBBY3Rpdml0eSBmcm9tIGEgY2FwYWJpbGl0eSBwYXR0ZXJuIGlzIGxpbmtlZCB0byB0aGUgUGhhc2Ugb3IgSXRlcmF0aW9uIHdoaWNoIGlzIHJlcXVpcmVkIHRvIHByb2R1Y2UgdGhlIEFjdGl2aXR5J3MgRGVsaXZlcmFibGUuICBLZXkgYXBwbGljYXRpb25zIGFyZWFzIG9mIC8gYXJlYXMgb2YgcmV1c2UgZm9yIENhcGFiaWxpdHkgUGF0dGVybnMgYXJlOgotLSBUbyBzZXJ2ZSBhcyBidWlsZGluZyBibG9ja3MgZm9yIGFzc2VtYmxpbmcgRGVsaXZlcnkgUHJvY2Vzc2VzIG9yIGxhcmdlciBDYXBhYmlsaXR5IFBhdHRlcm5zLiAgTm9ybWFsbHkgZGV2ZWxvcGluZyBhIERlbGl2ZXJ5IFByb2Nlc3MgaXMgbm90IGRvbmUgZnJvbSBzY3JhdGNoIGJ1dCBieSBzeXN0ZW1hdGljYWxseSBhcHBseWluZyBhbmQgYmluZGluZyBwYXR0ZXJucy4gIEluIGFkZGl0aW9uIHRvIHRoZSBzdGFuZGFyZCBwYXR0ZXJuIGFwcGxpY2F0aW9uIG9mICdjb3B5LWFuZC1tb2RpZnknLCB3aGljaCBhbGxvd3MgdGhlIHByb2Nlc3MgZW5naW5lZXIgdG8gaW5kaXZpZHVhbGx5IGN1c3RvbWl6ZSB0aGUgcGF0dGVybidzIGNvbnRlbnQgdG8gdGhlIHBhcnRpY3VsYXIgc2l0dWF0aW9uIGl0IGlzIGFwcGxpZWQgZm9yLCB0aGUgUGx1Z2luIG1ldGEtbW9kZWwgcGFja2FnZSAoU2VjdGlvbiA2LjEpIGludHJvZHVjZXMgZXZlbiBtb3JlIHNvcGhpc3RpY2F0ZWQgaW5oZXJpdGFuY2UgcmVsYXRpb25zaGlwcyB0aGF0IHN1cHBvcnQgZHluYW1pYyBiaW5kaW5nIG9mIHBhdHRlcm5zIChpLmUuIHRoZSBwYXR0ZXJuIGlzIHJlZmVyZW5jZWQgYW5kIG5vdCBjb3BpZWQpLiAgVGhpcyB1bmlxdWUgbmV3IHdheSBvZiByZXVzaW5nIHByb2Nlc3Mga25vd2xlZGdlIGFsbG93cyB0byBmYWN0b3Igb3V0IGNvbW1vbmx5IHJlb2NjdXJyaW5nIEFjdGl2aXRpZXMgaW50byBwYXR0ZXJucyBhbmQgdG8gYXBwbHkgdGhlbSBvdmVyIGFuZCBvdmVyIGFnYWluIGZvciBhIHByb2Nlc3MuICBXaGVuIHRoZSBwYXR0ZXJuIGlzIGJlaW5nIHJldmlzZWQgb3IgdXBkYXRlZCwgYWxsIGNoYW5nZXMgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IHJlZmxlY3RlZCBpbiBhbGwgcGF0dGVybiBhcHBsaWNhdGlvbiBpbiBhbGwgcHJvY2Vzc2VzIGJlY2F1c2Ugb2YgdGhlIGR5bmFtaWMgYmluZGluZy4KLS0gVG8gc3VwcG9ydCBkaXJlY3QgZXhlY3V0aW9uIGluIGEgZGV2ZWxvcG1lbnQgcHJvamVjdCB0aGF0IGRvZXMgbm90IHdvcmsgZm9sbG93aW5nIGEgd2VsbC1kZWZpbmVkIHByb2Nlc3MsIGJ1dCB3b3JrcyBiYXNlZCBvbiBsb29zZWx5IGNvbm5lY3RlZCBwcm9jZXNzIGZyYWdtZW50cyBvZiBiZXN0IHByYWN0aWNlcyBpbiBhIGZsZXhpYmxlIG1hbm5lciAoZS5nLiBBZ2lsZSBEZXZlbG9wbWVudCkuCi0tIFRvIHN1cHBvcnQgcHJvY2VzcyBlZHVjYXRpb24gYnkgZGVzY3JpYmluZyBrbm93bGVkZ2UgZm9yIGEga2V5IGFyZWEgc3VjaCBhcyBiZXN0IHByYWN0aWNlcyBvbiBob3cgdG8gcGVyZm9ybSB0aGUgd29yayBmb3IgYSBEaXNjaXBsaW5lIChlLmcuIFJlcXVpcmVtZW50cyBNYW5hZ2VtZW50KSwgZm9yIGEgc3BlY2lmaWMgZGV2ZWxvcG1lbnQgdGVjaG5pcXVlIChhc3BlY3Qtb3JpZW50ZWQgZGV2ZWxvcG1lbnQpLCBvciBhIHNwZWNpZmljIHRlY2huaWNhbCBhcmVhIChlLmcuIHJlbGF0aW9uYWwgZGF0YWJhc2UgZGVzaWduKSwgd2hpY2ggaXMgdXNlZCBmb3IgZWR1Y2F0aW9uIGFuZCB0ZWFjaGluZy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOlByb2Nlc3MiLz4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpYWwgUHJvY2VzcyB0aGF0IGlzIHByZXBhcmVkIGZvciBpbnN0YW50aWF0aW9uIGJ5IGEgcHJvamVjdCBwbGFubmluZyB0b29sLiAgVHlwaWNhbGx5LCBpdCBpcyBjcmVhdGVkIGJhc2VkIG9uIGEgUHJvY2VzcyBzdWNoIGFzIGEgRGVsaXZlcnkgUHJvY2VzcyBhcyBhIHdob2xlIChlLmcuIGluIGNhc2Ugb2YgYSB3YXRlcmZhbGwtYmFzZWQgZGV2ZWxvcG1lbnQgYXBwcm9hY2gpIG9yIGluIHBhcnRzIChlLmcuIGluIGNhc2Ugb2YgYW4gaXRlcmF0aXZlIGRldmVsb3BtZW50IGFwcHJvYWNoKS4KLUEgUHJvY2VzcyBQbGFubmluZyBUZW1wbGF0ZSByZXByZXNlbnRzIGEgcGFydGlhbGx5IGZpbmlzaGVkIHBsYW4gZm9yIGEgY29uY3JldGUgcHJvamVjdC4gIEl0IHVzZXMgdGhlIHNhbWUgaW5mb3JtYXRpb24gc3RydWN0dXJlcyBhcyBhbGwgb3RoZXIgUHJvY2VzcyBUeXBlcyB0byByZXByZXNlbnQgdGVtcGxhdGVzIGZvciBwcm9qZWN0IHBsYW5zLiAgSG93ZXZlciwgY2VydGFpbiBwbGFubmluZyBkZWNpc2lvbnMgaGF2ZSBhbHJlYWR5IGJlZW4gYXBwbGllZCB0byB0aGUgdGVtcGxhdGUgYXMgd2VsbCBhcyBpbmZvcm1hdGlvbiBoYXMgYmVlbiByZW1vdmVkIGFuZC9vciByZWZvcm1hdHRlZCB0byBiZSByZWFkeSBmb3IgZXhwb3J0IHRvIGEgc3BlY2lmaWMgcGxhbm5pbmcgdG9vbC4gIEV4YW1wbGVzIGZvciBzdWNoIGRlY2lzaW9ucyBhcmU6IGEgdGVtcGxhdGUgaGFzIGJlZW4gY3JlYXRlZCB0byByZXByZXNlbnQgYSBwbGFuIGZvciBhIHBhcnRpY3VsYXIgSXRlcmF0aW9uIGluIGFuIGl0ZXJhdGl2ZSBkZXZlbG9wbWVudCBwcm9qZWN0LCB3aGljaCBmciBleGFtcGxlIGRpc3Rpbmd1aXNoZXMgZWFybHkgZnJvbSBsYXRlIGl0ZXJhdGlvbnMgaW4gdGhlIEVsYWJvcmF0aW9uIHBoYXNlIG9mIGEgcHJvamVjdDsgaWYgdGhlIHRhcmdldGVkIHBsYW5uaW5nIHRvb2wgY2Fubm90IHJlcHJlc2VudCBpbnB1dCBhbmQgb3V0cHV0IG9mIFRhc2ssIHRoZW4gdGhlc2UgaGF2ZSBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgc3RydWN0dXJlOyBjZXJ0YWluIHJlcGV0aXRpb25zIGhhdmUgYmVlbiBhbHJlYWR5IGFwcGxpZWQsIGUuZy4gc3RhdGluZyB0aGF0IGEgY3ljbGUgb2Ygc3BlY2lmaWMgVGFzayBncm91cGVkIGluIGFuIEFjdGl2aXR5IGhhdmUgdG8gYmUgcmVwZWF0ZWQgbi10aW1lczsgZXRjLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6UHJvY2VzcyI+Ci0JCQkJPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJCYXNlUHJvY2VzcyIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCTwveHNkOmNob2ljZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJQcm9jZXNzUGFja2FnZSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpYWwgTWV0aG9kIFBhY2thZ2UgdGhhdCBjb250YWlucyBQcm9jZXNzIEVsZW1lbnRzLCBvbmx5LgotQSBrZXkgc2VwYXJhdGlvbiBvZiBjb25jZXJucyBpbiBVTUEgaXMgdGhlIGRpc3RpbmN0aW9uIGJldHdlZW4gTWV0aG9kIENvbnRlbnQgYW5kIFByb2Nlc3MuICBUaGlzIHNlcGFyYXRpb24gaXMgZW5mb3JjZWQgYnkgc3BlY2lhbCBwYWNrYWdlIHR5cGVzLCB3aGljaCBkbyBub3QgYWxsb3cgdGhlIG1peGluZyBvZiBtZXRob2QgY29udGVudCB3aXRoIHByb2Nlc3Nlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOk1ldGhvZFBhY2thZ2UiPgotCQkJCTx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUHJvY2Vzc0VsZW1lbnQiIHR5cGU9InVtYTpQcm9jZXNzRWxlbWVudCIvPgotCQkJCTwveHNkOmNob2ljZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkNvbXByaXNlcyBvZiBhIGxpc3Qgb2YgaW50ZXJmYWNlIHNwZWNpZmljYXRpb25zIChzaW1pbGFyIHRvIG9wZXJhdGlvbiBkZWNsYXJhdGlvbnMpIHRoYXQgZXhwcmVzcyBpbnB1dHMgYW5kIG91dHB1dHMgZm9yIGEgcHJvY2VzcyBjb21wb25lbnQuICBUaGVzZSBpbnRlcmZhY2Ugc3BlY2lmaWNhdGlvbnMgYXJlIGV4cHJlc3NlZCB1c2luZyBUYXNrIERlc2NyaXB0b3JzIHdoaWNoIGFyZSBub3QgbGlua2VkIHRvIFRhc2tzIHRoYXQgYXJlIHJlbGF0ZWQgdG8gV29yayBQcm9kdWN0IERlc2NyaXB0b3JzIGFzIHdlbGwgYXMgb3B0aW9uYWwgYSBSb2xlIERlc2NyaXB0b3IuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpCcmVha2Rvd25FbGVtZW50Ij4KLQkJCQk8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkludGVyZmFjZVNwZWNpZmljYXRpb24iIHR5cGU9InVtYTpUYXNrRGVzY3JpcHRvciIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iSW50ZXJmYWNlSU8iIHR5cGU9InVtYTpXb3JrUHJvZHVjdERlc2NyaXB0b3IiLz4KLQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUHJvY2Vzc0NvbXBvbmVudCI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpYWwgUHJvY2VzcyBQYWNrYWdlIHRoYXQgYXBwbGllcyB0aGUgcHJpbmNpcGxlcyBvZiBlbmNhcHN1bGF0aW9uLiAgQSBQcm9jZXNzIENvbXBvbmVudCByZWFsaXplcyBvbmUgb3IgbW9yZSBJbnRlcmZhY2VzIHdoaWNoIHNwZWNpZnkgaW5wdXRzIGFuZCBvdXRwdXRzIG9mIHRoZSBjb21wb25lbnQuIFRoZXJlIG1pZ2h0IGJlIG1hbnkgY29tcG9uZW50cyByZWFsaXppbmcgdGhlIHNhbWUgaW50ZXJmYWNlcywgYnV0IHVzaW5nIGRpZmZlcmVudCB0ZWNobmlxdWVzIHRvIGFjaGlldmUgc2ltaWxhciBvdXRwdXRzIGZvciBzaW1pbGFyIGlucHV0cy4gIFdoZXJlYXMgdGhlIENvbXBvbmVudCBJbnRlcmZhY2VzIHJlcHJlc2VudCBjb21wb25lbnQgc3BlY2lmaWNhdGlvbnMgKGJsYWNrIGJveCBkZXNjcmlwdGlvbnMgb2YgdGhlIGNvbXBvbmVudCksIGdvb2QgY2FuZGlkYXRlcyBmb3IgY29tcG9uZW50IHJlYWxpemF0aW9ucyBjYW4gYmUgZm91bmQgaW4gQ2FwYWJpbGl0eSBQYXR0ZXJucyAod2hpdGUgYm94IGRlc2NyaXB0aW9ucyBmb3IgdGhlIGNvbXBvbmVudCkuCi1VTUEgc3VwcG9ydHMgcmVwbGFjZWFibGUgYW5kIHJldXNhYmxlIFByb2Nlc3MgQ29tcG9uZW50cyByZWFsaXppbmcgdGhlIHByaW5jaXBsZXMgb2YgZW5jYXBzdWxhdGlvbi4gQ2VydGFpbiBzaXR1YXRpb25zIGluIGEgc29mdHdhcmUgZGV2ZWxvcG1lbnQgcHJvamVjdCBtaWdodCByZXF1aXJlIHRoYXQgY29uY3JldGUgcmVhbGl6YXRpb25zIG9mIHBhcnRzIG9mIHRoZSBwcm9jZXNzIHJlbWFpbiB1bmRlY2lkZWQgb3Igd2lsbCBiZSBkZWNpZGVkIGJ5IHRoZSBleGVjdXRpbmcgdGVhbSBpdHNlbGYgKGUuZy4gaW4gb3V0c291cmNpbmcgc2l0dWF0aW9ucykuICBVTUEgcHJvdmlkZXMgYSB1bmlxdWUgY29tcG9uZW50IGNvbmNlcHQgZGVmaW5pbmcgaW50ZXJmYWNlcyBmb3Igd29yayBwcm9kdWN0IGlucHV0IGFuZCBvdXRwdXQsIGFsbG93aW5nIHRyZWF0aW5nIHRoZSBhY3R1YWwgZGVmaW5pdGlvbiBvZiB0aGUgd29yayB0aGF0IHByb2R1Y2VzIHRoZSBvdXRwdXRzIGFzIGEgImJsYWNrIGJveCIuICBBdCBhbnkgcG9pbnQgZHVyaW5nIGEgcHJvamVjdCB0aGUgY29tcG9uZW50ICJyZWFsaXphdGlvbiIgZGV0YWlsaW5nIHRoZSB3b3JrIGNhbiBiZSBhZGRlZCB0byB0aGUgcHJvY2Vzcy4gIFRoZSBjb21wb25lbnQgYXBwcm9hY2ggYWxzbyBhbGxvd3MgdGhhdCBkaWZmZXJlbnQgc3R5bGVzIG9yIHRlY2huaXF1ZXMgb2YgZG9pbmcgd29yayBjYW4gYmUgcmVwbGFjZWQgd2l0aCBvbmUgYW5vdGhlci4gIEZvciBleGFtcGxlLCBhIHNvZnR3YXJlIGNvZGUgb3V0cHV0IG9mIGEgY29tcG9uZW50IGNvdWxkIGJlIHByb2R1Y2VkIHdpdGggYSBtb2RlbC1kcml2ZW4gZGV2ZWxvcG1lbnQgb3IgYSBjb2RlLWNlbnRyaWMgdGVjaG5pcXVlLiAgVGhlIGNvbXBvbmVudCBjb25jZXB0IGVuY2Fwc3VsYXRlcyB0aGUgYWN0dWFsIHdvcmsgYW5kIGxldHMgdGhlIGRldmVsb3BtZW50IHRlYW0gY2hvb3NlIHRoZSBhcHByb3ByaWF0ZSB0ZWNobmlxdWUgYW5kIGZpbGwgdGhlIGNvbXBvbmVudCdzIHJlYWxpemF0aW9uIHdpdGggdGhlaXIgY2hvaWNlIG9mIEFjdGl2aXRpZXMgdGhhdCBwcm9kdWNlIHRoZSByZXF1aXJlZCBvdXRwdXRzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6UHJvY2Vzc1BhY2thZ2UiPgotCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJDb3B5cmlnaHQiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iSW50ZXJmYWNlIiB0eXBlPSJ1bWE6UHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJQcm9jZXNzIiB0eXBlPSJ1bWE6UHJvY2VzcyIvPgotCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImF1dGhvcnMiIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+RXZlcnkgTWV0aG9kIFVuaXQgaXMgYmVpbmcgY3JlYXRlZCBhbmQgb3duZWQgYnkgYW4gYXV0aG9yIG9yIGF1dGhvcmluZyB0ZWFtLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImNoYW5nZURhdGUiIHR5cGU9InhzZDpkYXRlVGltZSI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZGF0ZSB0aGUgbGFzdCBjaGFuZ2UgdGhhdCByZXN1bHRlZCBpbnRvIHRoaXMgdmVyc2lvbiBoYXMgYmVlbiBtYWRlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImNoYW5nZURlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgbGFzdCBjaGFuZ2UgdGhhdCByZXN1bHRlZCBpbnRvIHRoaXMgdmVyc2lvbi48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ2ZXJzaW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkV2ZXJ5IFBhY2thZ2UgaGFzIGEgdmVyc2lvbiBudW1iZXIgdXNlZCB0byB0cmFjayBjaGFuZ2VzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ik1ldGhvZFBsdWdpbiI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpYWwgTWV0aG9kIFVuaXQgdGhhdCByZXByZXNlbnRzIGEgcGh5c2ljYWwgY29udGFpbmVyIGZvciBNZXRob2QgUGFja2FnZXMuICBJdCBkZWZpbmVzIGEgZ3JhbnVsYXJpdHkgbGV2ZWwgZm9yIHRoZSBtb2R1bGFyaXphdGlvbiBhbmQgb3JnYW5pemF0aW9uIG9mIG1ldGhvZCBjb250ZW50IGFuZCBwcm9jZXNzZXMuICBBIE1ldGhvZCBQbHVnaW4gY2FuIGV4dGVuZCBtYW55IG90aGVyIE1ldGhvZCBQbHVnaW5zIGFuZCBpdCBjYW4gYmUgZXh0ZW5kZWQgYnkgbWFueSBNZXRob2QgUGx1Z2lucy4gIEl0IGNhbiBhbHNvIGJlIHVzZWQgc3RhbmQtYWxvbmUsIGkuZS4gd2l0aCBubyBFeHRlbnNpb24gcmVsYXRpb25zaGlwIHRvIG90aGVyIHBsdWctaW5zLgotTWV0aG9kIFBsdWdpbiBjb25jZXB0dWFsbHkgcmVwcmVzZW50cyBhIHVuaXQgZm9yIGNvbmZpZ3VyYXRpb24sIG1vZHVsYXJpemF0aW9uLCBleHRlbnNpb24sIHBhY2thZ2luZywgYW5kIGRlcGxveW1lbnQgb2YgbWV0aG9kIGNvbnRlbnQgYW5kIHByb2Nlc3Nlcy4gIEEgUHJvY2VzcyBFbmdpbmVlciBzaGFsbCBkZXNpZ24gaGlzIFBsdWdpbnMgYW5kIGFsbG9jYXRlIGhpcyBjb250ZW50IHRvIHRoZXNlIFBsdWdpbnMgd2l0aCByZXF1aXJlbWVudHMgZm9yIGV4dGVuc2liaWxpdHksIG1vZHVsYXJpdHksIHJldXNlLCBhbmQgbWFpbnRhaW5hYmlsaXR5IGluIG1pbmQuCi1TcGVjaWFsIGV4dGVuc2liaWxpdHkgbWVjaGFuaXNtcyBkZWZpbmVkIGZvciB0aGUgbWV0YS1jbGFzc2VzIFZhcmlhYmlsaXR5IEVsZW1lbnQgYW5kIFByb2Nlc3MgQ29udHJpYnV0aW9uIGFsbG93IFBsdWdpbiBjb250ZW50IHRvIGRpcmVjdGx5IGNvbnRyaWJ1dGUgbmV3IGNvbnRlbnQsIHJlcGxhY2UgZXhpc3RpbmcgY29udGVudCwgb3IgdG8gY3Jvc3MtcmVmZXJlbmNlIHRvIGFueSBDb250ZW50IEVsZW1lbnQgb3IgUHJvY2VzcyB3aXRoaW4gYW5vdGhlciBQbHVnaW4gdGhhdCBpdCBleHRlbmRzLiAgU2ltaWxhciB0byBVTUwgMi4wJ3MgJ3BhY2thZ2UgbWVyZ2UnIG1lY2hhbmlzbSB0cmFuc2Zvcm1hdGlvbiBpbnRlcnByZXRhdGlvbnMsIGludGVycHJldGluZyB0aGVzZSBNZXRob2QgUGx1Z2luIG1lY2hhbmlzbXMgcmVzdWx0cyBpbnRvIG5ldyBleHRlbmRlZCBNZXRob2QgQ29udGVudCBhbmQgUHJvY2Vzc2VzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6TWV0aG9kVW5pdCI+Ci0JCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlJlZmVyZW5jZWRNZXRob2RQbHVnaW4iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Ik1ldGhvZFBhY2thZ2UiIHR5cGU9InVtYTpNZXRob2RQYWNrYWdlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0idXNlckNoYW5nZWFibGUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6ZWxlbWVudCBuYW1lPSJNZXRob2RQbHVnaW4iIHR5cGU9InVtYTpNZXRob2RQbHVnaW4iPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWFsIE1ldGhvZCBVbml0IHRoYXQgcmVwcmVzZW50cyBhIHBoeXNpY2FsIGNvbnRhaW5lciBmb3IgTWV0aG9kIFBhY2thZ2VzLiAgSXQgZGVmaW5lcyBhIGdyYW51bGFyaXR5IGxldmVsIGZvciB0aGUgbW9kdWxhcml6YXRpb24gYW5kIG9yZ2FuaXphdGlvbiBvZiBtZXRob2QgY29udGVudCBhbmQgcHJvY2Vzc2VzLiAgQSBNZXRob2QgUGx1Z2luIGNhbiBleHRlbmQgbWFueSBvdGhlciBNZXRob2QgUGx1Z2lucyBhbmQgaXQgY2FuIGJlIGV4dGVuZGVkIGJ5IG1hbnkgTWV0aG9kIFBsdWdpbnMuICBJdCBjYW4gYWxzbyBiZSB1c2VkIHN0YW5kLWFsb25lLCBpLmUuIHdpdGggbm8gRXh0ZW5zaW9uIHJlbGF0aW9uc2hpcCB0byBvdGhlciBwbHVnLWlucy4KLU1ldGhvZCBQbHVnaW4gY29uY2VwdHVhbGx5IHJlcHJlc2VudHMgYSB1bml0IGZvciBjb25maWd1cmF0aW9uLCBtb2R1bGFyaXphdGlvbiwgZXh0ZW5zaW9uLCBwYWNrYWdpbmcsIGFuZCBkZXBsb3ltZW50IG9mIG1ldGhvZCBjb250ZW50IGFuZCBwcm9jZXNzZXMuICBBIFByb2Nlc3MgRW5naW5lZXIgc2hhbGwgZGVzaWduIGhpcyBQbHVnaW5zIGFuZCBhbGxvY2F0ZSBoaXMgY29udGVudCB0byB0aGVzZSBQbHVnaW5zIHdpdGggcmVxdWlyZW1lbnRzIGZvciBleHRlbnNpYmlsaXR5LCBtb2R1bGFyaXR5LCByZXVzZSwgYW5kIG1haW50YWluYWJpbGl0eSBpbiBtaW5kLgotU3BlY2lhbCBleHRlbnNpYmlsaXR5IG1lY2hhbmlzbXMgZGVmaW5lZCBmb3IgdGhlIG1ldGEtY2xhc3NlcyBWYXJpYWJpbGl0eSBFbGVtZW50IGFuZCBQcm9jZXNzIENvbnRyaWJ1dGlvbiBhbGxvdyBQbHVnaW4gY29udGVudCB0byBkaXJlY3RseSBjb250cmlidXRlIG5ldyBjb250ZW50LCByZXBsYWNlIGV4aXN0aW5nIGNvbnRlbnQsIG9yIHRvIGNyb3NzLXJlZmVyZW5jZSB0byBhbnkgQ29udGVudCBFbGVtZW50IG9yIFByb2Nlc3Mgd2l0aGluIGFub3RoZXIgUGx1Z2luIHRoYXQgaXQgZXh0ZW5kcy4gIFNpbWlsYXIgdG8gVU1MIDIuMCdzICdwYWNrYWdlIG1lcmdlJyBtZWNoYW5pc20gdHJhbnNmb3JtYXRpb24gaW50ZXJwcmV0YXRpb25zLCBpbnRlcnByZXRpbmcgdGhlc2UgTWV0aG9kIFBsdWdpbiBtZWNoYW5pc21zIHJlc3VsdHMgaW50byBuZXcgZXh0ZW5kZWQgTWV0aG9kIENvbnRlbnQgYW5kIFByb2Nlc3Nlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCTwveHNkOmVsZW1lbnQ+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJNZXRob2RDb25maWd1cmF0aW9uIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgY29sbGVjdGlvbiBvZiBzZWxlY3RlZCBNZXRob2QgTW9kZWxzIGFuZCBNZXRob2RQYWNrYWdlcy4gQSBjb25maWd1cmF0aW9uIGNhbiBiZSBleHBvcnRlZCBpbnRvIGl0cyBvd24gc3RhbmRhbG9uZSBsaWJyYXJ5IHdoZW4gaXQgaW5jbHVkZXMgdGhlIGZ1bGwgdHJhbnNpdGl2ZSBjbG9zdXJlIG9mIGFsbCBlbGVtZW50cyBhbGwgb3RoZXIgZWxlbWVudHMgZGVwZW5kIG9uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6TWV0aG9kVW5pdCI+Ci0JCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkJhc2VDb25maWd1cmF0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJNZXRob2RQbHVnaW5TZWxlY3Rpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Ik1ldGhvZFBhY2thZ2VTZWxlY3Rpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkRlZmF1bHRWaWV3IiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlByb2Nlc3NWaWV3IiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJTdWJ0cmFjdGVkQ2F0ZWdvcnkiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkFkZGVkQ2F0ZWdvcnkiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDplbGVtZW50IG5hbWU9Ik1ldGhvZENvbmZpZ3VyYXRpb24iIHR5cGU9InVtYTpNZXRob2RDb25maWd1cmF0aW9uIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgY29sbGVjdGlvbiBvZiBzZWxlY3RlZCBNZXRob2QgTW9kZWxzIGFuZCBNZXRob2RQYWNrYWdlcy4gQSBjb25maWd1cmF0aW9uIGNhbiBiZSBleHBvcnRlZCBpbnRvIGl0cyBvd24gc3RhbmRhbG9uZSBsaWJyYXJ5IHdoZW4gaXQgaW5jbHVkZXMgdGhlIGZ1bGwgdHJhbnNpdGl2ZSBjbG9zdXJlIG9mIGFsbCBlbGVtZW50cyBhbGwgb3RoZXIgZWxlbWVudHMgZGVwZW5kIG9uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JPC94c2Q6ZWxlbWVudD4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ik1ldGhvZExpYnJhcnkiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBNZXRob2QgTGlicmFyeSBpcyBhIHBoeXNpY2FsIGNvbnRhaW5lciBmb3IgTWV0aG9kIFBsdWdpbnMgYW5kIE1ldGhvZCBDb25maWd1cmF0aW9uIGRlZmluaXRpb25zLiAgQWxsIE1ldGhvZCBFbGVtZW50cyBhcmUgc3RvcmVkIGluIGEgTWV0aG9kIExpYnJhcnkuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpNZXRob2RVbml0Ij4KLQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iTWV0aG9kUGx1Z2luIiB0eXBlPSJ1bWE6TWV0aG9kUGx1Z2luIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJNZXRob2RDb25maWd1cmF0aW9uIiB0eXBlPSJ1bWE6TWV0aG9kQ29uZmlndXJhdGlvbiIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9InRvb2wiIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+VGhlIHRvb2wgdGhhdCBnZW5lcmF0ZWQgdGhlIFhNTCBmaWxlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmVsZW1lbnQgbmFtZT0iTWV0aG9kTGlicmFyeSIgdHlwZT0idW1hOk1ldGhvZExpYnJhcnkiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBNZXRob2QgTGlicmFyeSBpcyBhIHBoeXNpY2FsIGNvbnRhaW5lciBmb3IgTWV0aG9kIFBsdWdpbnMgYW5kIE1ldGhvZCBDb25maWd1cmF0aW9uIGRlZmluaXRpb25zLiAgQWxsIE1ldGhvZCBFbGVtZW50cyBhcmUgc3RvcmVkIGluIGEgTWV0aG9kIExpYnJhcnkuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQk8L3hzZDplbGVtZW50PgotPC94c2Q6c2NoZW1hPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL21vZGVsL1VNQS5lY29yZSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9tb2RlbC9VTUEuZWNvcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4MzM1OTQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL21vZGVsL1VNQS5lY29yZQorKysgL2Rldi9udWxsCkBAIC0xLDI4MzcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxlY29yZTpFUGFja2FnZSB4bWk6dmVyc2lvbj0iMi4wIgotICAgIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgICB4bWxuczplY29yZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSIgbmFtZT0idW1hIgotICAgIG5zVVJJPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjUiIG5zUHJlZml4PSJ1bWEiPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkFjdGl2aXR5IiBlU3VwZXJUeXBlcz0iIy8vV29ya0JyZWFrZG93bkVsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgV29yayBCcmVha2Rvd24gRWxlbWVudCBhbmQgV29yayBEZWZpbml0aW9uIHdoaWNoIHN1cHBvcnRzIHRoZSBuZXN0aW5nIGFuZCBsb2dpY2FsIGdyb3VwaW5nIG9mIHJlbGF0ZWQgQnJlYWtkb3duIEVsZW1lbnRzIGZvcm1pbmcgYnJlYWtkb3duIHN0cnVjdHVyZXMuICBBbHRob3VnaCBBY3Rpdml0eSBpcyBhIGNvbmNyZXRlIG1ldGEtY2xhc3MsIG90aGVyIGNsYXNzZXMgd2hpY2ggcmVwcmVzZW50IGJyZWFrZG93biBzdHJ1Y3R1cmVzIGRlcml2ZSBmcm9tIGl0OyBzdWNoIGFzIFBoYXNlLCBJdGVyYXRpb24sIERlbGl2ZXJ5IFByb2Nlc3MsIG9yIENhcGFiaWxpdHkgUGF0dGVybi4mI3hEOyYjeEE7QWN0aXZpdHkgcmVwcmVzZW50cyBhIGdyb3VwaW5nIGVsZW1lbnQgZm9yIG90aGVyIEJyZWFrZG93biBFbGVtZW50cyBzdWNoIGFzIEFjdGl2aXRpZXMsIERlc2NyaXB0b3JzLCBNaWxlc3RvbmVzLCBldGMuICBJdCBpcyBub3QgcGVyLXNlIGEgJ2hpZ2gtbGV2ZWwnIGdyb3VwaW5nIG9mIG9ubHkgd29yayBhcyBpbiBvdGhlciBtZXRhLW1vZGVscywgYnV0IGdyb3VwcyBhbnkga2luZCBvZiBCcmVha2Rvd24gRWxlbWVudHMuICBGb3IgZXhhbXBsZSwgb25lIGNhbiBkZWZpbmUgdmFsaWQgQWN0aXZpdGllcyB0aGF0IGdyb3VwIG9ubHkgV29yayBQcm9kdWN0cyBEZXNjcmlwdG9ycyB3aXRob3V0IGFueSBtYXRjaGluZyBUYXNrIERlc2NyaXB0b3JzLiAgQWN0aXZpdGllcyBhbHNvIGluaGVyaXQgYWxsIHByb3BlcnRpZXMgZnJvbSBXb3JrIEJyZWFrZG93biBFbGVtZW50IGFuZCBpbmRpcmVjdGx5IGZyb20gUHJvY2VzcyBFbGVtZW50OyBpLmUuIEFjdGl2aXR5IGlzIHJlYWR5IHRvIGhhdmUgYSBmdWxsIGNvbnRlbnQgZGVzY3JpcHRpb24gYXR0YWNoZWQgdG8gaXQuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJBY3Rpdml0eSIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icHJlY29uZGl0aW9uIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJQcmVjb25kaXRpb24iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icG9zdGNvbmRpdGlvbiIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUG9zdGNvbmRpdGlvbiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJncm91cDMiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FRmVhdHVyZU1hcEVudHJ5Ij4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJncm91cCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJncm91cDozNyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJicmVha2Rvd25FbGVtZW50IiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL0JyZWFrZG93bkVsZW1lbnQiIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIGRlcml2ZWQ9InRydWUiCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQnJlYWtkb3duRWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Imdyb3VwIiB2YWx1ZT0iI2dyb3VwOjM3Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJvYWRtYXAiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIKLSAgICAgICAgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJSb2FkbWFwIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZ3JvdXAiIHZhbHVlPSIjZ3JvdXA6MzciLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaXNFbmFjdGFibGUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iYXR0cmlidXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IklzRW5hY3RhYmxlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJhdHRyaWJ1dGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0idmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ2YXJpYWJpbGl0eVR5cGUiIGVUeXBlPSIjLy9WYXJpYWJpbGl0eVR5cGUiCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9Im5hIiB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJhdHRyaWJ1dGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0idmFyaWFiaWxpdHlUeXBlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkFjdGl2aXR5RGVzY3JpcHRpb24iIGVTdXBlclR5cGVzPSIjLy9CcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24iPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgZ2VuZXJhbGl6ZWQgQnJlYWtkb3duIEVsZW1lbnQgRGVzY3JpcHRpb24gdGhhdCBpcyB1c2VkIHRvIHN0b3JlIHRoZSB0ZXh0dWFsIGRlc2NyaXB0aW9uIGZvciBhbiBBY3Rpdml0eS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkFjdGl2aXR5RGVzY3JpcHRpb24iLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFsdGVybmF0aXZlcyIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJDb21wcmlzZXMgb2Ygc3VtbWFyaWVzIGRlc2NyaWJpbmcgaW1wb3J0YW50IGV4Y2VwdGlvbmFsIGFuZCBub24tc3RhbmRhcmQgd2F5cyBvZiBkb2luZyB0aGUgd29yayBvZiB0aGlzIEFjdGl2aXR5IG5vdCBjb3ZlcmVkIGJ5IHRoZSBBY3Rpdml0eSdzIFRhc2tzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJBbHRlcm5hdGl2ZXMiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaG93VG9TdGFmZiIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJQcm92aWRlcyBiYWNrZ3JvdW5kIG9uIHdobyBzaG91bGQgYmUgaW52b2x2ZWQgaW4gdGhpcyBhY3Rpdml0eSB3aGF0IGFyZSB0aGUgcmVxdWlyZWQgc2tpbGxzLCBleHBlcmllbmNlLCAgYW5kIHBlcmhhcHMgYXR0aXR1ZGVzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJIb3dUb1N0YWZmIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InB1cnBvc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iU3VtbWFyaXplcyB0aGUgbWFpbiByZWFzb24gZm9yIHBlcmZvcm1pbmcgdGhpcyBBY3Rpdml0eSwgZGVzY3JpYmVzIHdoYXQgdGhlIGFjdGl2aXR5IGFzIGEgd2hvbGUgaXMgaW50ZW5kZWQgdG8gYWNoaWV2ZS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUHVycG9zZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJBcHBsaWNhYmxlTWV0YUNsYXNzSW5mbyIgZVN1cGVyVHlwZXM9IiMvL1BhY2thZ2VhYmxlRWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJBcHBsaWNhYmxlTWV0YUNsYXNzSW5mbyIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZW1wdHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaXNQcmltYXJ5RXh0ZW5zaW9uIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImF0dHJpYnV0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJpc1ByaW1hcnlFeHRlbnNpb24iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQXJ0aWZhY3QiIGVTdXBlclR5cGVzPSIjLy9Xb3JrUHJvZHVjdCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBXb3JrIFByb2R1Y3QgdGhhdCBwcm92aWRlcyBhIGRlc2NyaXB0aW9uIGFuZCBkZWZpbml0aW9uIGZvciB0YW5naWJsZSB3b3JrIHByb2R1Y3QgdHlwZXMuIEFydGlmYWN0cyBtYXkgYmUgY29tcG9zZWQgb2Ygb3RoZXIgYXJ0aWZhY3RzLiBGb3IgZXhhbXBsZSwgYSBtb2RlbCBhcnRpZmFjdCBjYW4gYmUgY29tcG9zZWQgb2YgbW9kZWwgZWxlbWVudHMsIHdoaWNoIGFyZSBhbHNvIGFydGlmYWN0cy4mI3hEOyYjeEE7QXJ0aWZhY3RzIGFyZSB0YW5naWJsZSB3b3JrIHByb2R1Y3RzIGNvbnN1bWVkLCBwcm9kdWNlZCwgb3IgbW9kaWZpZWQgYnkgVGFza3MuICBJdCBtYXkgc2VydmUgYXMgYSBiYXNpcyBmb3IgZGVmaW5pbmcgcmV1c2FibGUgYXNzZXRzLiAgUm9sZXMgdXNlIEFydGlmYWN0cyB0byBwZXJmb3JtIFRhc2tzIGFuZCBwcm9kdWNlIEFydGlmYWN0cyBpbiB0aGUgY291cnNlIG9mIHBlcmZvcm1pbmcgVGFza3MuICBBcnRpZmFjdHMgYXJlIHRoZSByZXNwb25zaWJpbGl0eSBvZiBhIHNpbmdsZSBSb2xlLCBtYWtpbmcgcmVzcG9uc2liaWxpdHkgZWFzeSB0byBpZGVudGlmeSBhbmQgdW5kZXJzdGFuZCwgYW5kIHByb21vdGluZyB0aGUgaWRlYSB0aGF0IGV2ZXJ5IHBpZWNlIG9mIGluZm9ybWF0aW9uIHByb2R1Y2VkIGluIHRoZSBtZXRob2QgcmVxdWlyZXMgdGhlIGFwcHJvcHJpYXRlIHNldCBvZiBza2lsbHMuIEV2ZW4gdGhvdWdoIG9uZSByb2xlIG1pZ2h0ICZxdW90O293biZxdW90OyBhIHNwZWNpZmljIHR5cGUgb2YgQXJ0aWZhY3RzLCBvdGhlciByb2xlcyBjYW4gc3RpbGwgdXNlIHRoZSBBcnRpZmFjdHM7IHBlcmhhcHMgZXZlbiB1cGRhdGUgdGhlbSBpZiB0aGUgUm9sZSBoYXMgYmVlbiBnaXZlbiBwZXJtaXNzaW9uIHRvIGRvIHNvLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQXJ0aWZhY3QiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Imdyb3VwMyIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VGZWF0dXJlTWFwRW50cnkiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9Imdyb3VwIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Imdyb3VwOjMwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImNvbnRhaW5lZEFydGlmYWN0IiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL0FydGlmYWN0IiB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIiBjb250YWlubWVudD0idHJ1ZSIKLSAgICAgICAgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkNvbnRhaW5lZEFydGlmYWN0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZ3JvdXAiIHZhbHVlPSIjZ3JvdXA6MzAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQXJ0aWZhY3REZXNjcmlwdGlvbiIgZVN1cGVyVHlwZXM9IiMvL1dvcmtQcm9kdWN0RGVzY3JpcHRpb24iPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgZ2VuZXJhbGl6ZWQgV29yayBQcm9kdWN0IERlc2NyaXB0aW9uIHRoYXQgaXMgdXNlZCB0byBzdG9yZSB0aGUgdGV4dHVhbCBkZXNjcmlwdGlvbiBmb3IgYW4gQXJ0aWZhY3QuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJBcnRpZmFjdERlc2NyaXB0aW9uIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJicmllZk91dGxpbmUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iUHJvdmlkZXMgYSBicmllZiBkZXNjcmlwdGlvbiBvZiB0aGUgaW5mb3JtYXRpb24gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhpcyBhcnRpZmFjdC4gRm9yIGV4YW1wbGUsIGRpc2N1c3NlcyB0aGUgY29udGVudHMgZm9yIGtleSBjaGFwdGVycyBvZiBhIGRvY3VtZW50IGFydGlmYWN0IG9yIHRoZSBrZXkgcGFja2FnZXMgYW5kIG1vZHVsZXMgb2YgYSBtb2RlbCBhcnRpZmFjdC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQnJpZWZPdXRsaW5lIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJlcHJlc2VudGF0aW9uT3B0aW9ucyIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJEaXNjdXNzZXMgZGlmZmVyZW50IHBvc3NpYmxlIGFsdGVybmF0aXZlIHJlcHJlc2VudGF0aW9ucyBmb3IgdGhlIGFydGlmYWN0LiBGb3IgZXhhbXBsZSBhIGRlc2lnbiBtb2RlbCBjYW4gYmUgcmVwcmVzZW50ZWQgYXMgYSBVTUwgbW9kZWwgb3IgYW4gaW5mb3JtYWwgYmxvY2sgZGlhZ3JhbSBvciBieSB0ZXh0dWFsIGRlc2NyaXB0aW9uIG9ubHkuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlJlcHJlc2VudGF0aW9uT3B0aW9ucyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyZXByZXNlbnRhdGlvbiIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUmVwcmVzZW50YXRpb24iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibm90YXRpb24iIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik5vdGF0aW9uIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkJyZWFrZG93bkVsZW1lbnQiIGVTdXBlclR5cGVzPSIjLy9Qcm9jZXNzRWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQW4gYWJzdHJhY3QgZ2VuZXJhbGl6YXRpb24gZm9yIGFueSB0eXBlIG9mIE1ldGhvZCBFbGVtZW50IHRoYXQgaXMgcGFydCBvZiBhIGJyZWFrZG93biBzdHJ1Y3R1cmUuICBJdCBkZWZpbmVzIGEgc2V0IG9mIHByb3BlcnRpZXMgYXZhaWxhYmxlIHRvIGFsbCBvZiBpdHMgc3BlY2lhbGl6YXRpb25zLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQnJlYWtkb3duRWxlbWVudCIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icHJlc2VudGVkQWZ0ZXIiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlByZXNlbnRlZEFmdGVyIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InByZXNlbnRlZEJlZm9yZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUHJlc2VudGVkQmVmb3JlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InBsYW5uaW5nRGF0YSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUGxhbm5pbmdEYXRhIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InN1cGVyQWN0aXZpdHkiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlN1cGVyQWN0aXZpdHkiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZ3JvdXAxIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUZlYXR1cmVNYXBFbnRyeSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZ3JvdXAiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iZ3JvdXA6MTgiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY2hlY2tsaXN0IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciCi0gICAgICAgIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIGRlcml2ZWQ9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ2hlY2tsaXN0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZ3JvdXAiIHZhbHVlPSIjZ3JvdXA6MTgiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY29uY2VwdCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIgotICAgICAgICB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkNvbmNlcHQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJncm91cCIgdmFsdWU9IiNncm91cDoxOCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJleGFtcGxlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciCi0gICAgICAgIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIGRlcml2ZWQ9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRXhhbXBsZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Imdyb3VwIiB2YWx1ZT0iI2dyb3VwOjE4Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Imd1aWRlbGluZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIgotICAgICAgICB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ikd1aWRlbGluZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Imdyb3VwIiB2YWx1ZT0iI2dyb3VwOjE4Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJldXNhYmxlQXNzZXQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIKLSAgICAgICAgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJSZXVzYWJsZUFzc2V0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZ3JvdXAiIHZhbHVlPSIjZ3JvdXA6MTgiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic3VwcG9ydGluZ01hdGVyaWFsIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciCi0gICAgICAgIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIGRlcml2ZWQ9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iU3VwcG9ydGluZ01hdGVyaWFsIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZ3JvdXAiIHZhbHVlPSIjZ3JvdXA6MTgiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0id2hpdGVwYXBlciIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIgotICAgICAgICB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IldoaXRlcGFwZXIiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJncm91cCIgdmFsdWU9IiNncm91cDoxOCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJoYXNNdWx0aXBsZU9jY3VycmVuY2VzIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJKdXN0IGFzIHRoZSBpc1BsYW5uZWQgYXR0cmlidXRlIHRoZSBoYXNNdWx0aXBsZU9jY3VycmVuY2VzIGF0dHJpYnV0ZSBoYXMgYW4gaW1wYWN0IG9uIGdlbmVyYXRpbmcgcGxhbnMgZnJvbSBhIFByb2Nlc3MuICBXaGVuIHRoaXMgYXR0cmlidXRlIGlzIHNldCB0byBUcnVlIGZvciBhIEJyZWFrZG93biBFbGVtZW50IHRoZW4gaXQgd2lsbCB0eXBpY2FsbHkgb2NjdXIgbXVsdGlwbGUgdGltZXMgd2l0aGluIHRoZSBzYW1lIEFjdGl2aXR5LiAgRm9yIGV4YW1wbGUsIGEgVGFzayBzdWNoIGFzICZxdW90O0RldGFpbCBVc2UgQ2FzZSZxdW90OyB3b3VsZCBiZSBwZXJmb3JtZWQgZm9yIGV2ZXJ5IHVzZSBjYXNlIGlkZW50aWZpZWQgZm9yIGEgcGFydGljdWxhciBJdGVyYXRpb24gb3IgQWN0aXZpdHkuICBHZW5lcmF0aW5nIGEgcGxhbiB3b3VsZCBsaXN0IG9uZSBUYXNrIGluc3RhbmNlIHBlciB1c2UgY2FzZS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImF0dHJpYnV0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJoYXNNdWx0aXBsZU9jY3VycmVuY2VzIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImlzT3B0aW9uYWwiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkluZGljYXRlcyB0aGF0IHRoZSBCcmVha2Rvd24gRWxlbWVudCBkZXNjcmliZXMgd29yaywgYSB3b3JrIHJlc3VsdCwgb3IgZXZlbiB3b3JrIHJlc291cmNlcywgd2hpY2ggaW5jbHVzaW9uIGlzIG5vdCBtYW5kYXRvcnkgd2hlbiBwZXJmb3JtaW5nIGEgcHJvamVjdCB0aGF0IGlzIHBsYW5uZWQgYmFzZWQgb24gYSBwcm9jZXNzIGNvbnRhaW5pbmcgdGhpcyBlbGVtZW50LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iYXR0cmlidXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9ImlzT3B0aW9uYWwiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaXNQbGFubmVkIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIGtleSBhcHBsaWNhdGlvbiBmb3IgRGV2ZWxvcG1lbnQgUHJvY2Vzc2VzIGV4cHJlc3NlZCB3aXRoIEJyZWFrZG93biBzdHJ1Y3R1cmVzIGlzIHRvIGdlbmVyYXRlIGEgcHJvamVjdCBwbGFuIGZyb20gaXQuICBBIHByb2Nlc3MgYXMgZGVmaW5lZCBpbiBVTUEgKGNmLiB3aXRoIFNlY3Rpb25zIFhYIGFuZCA1LjIpIGlzIGEgbXVsdGktZGltZW5zaW9uYWwgc3RydWN0dXJlIGRlZmluaW5nIHdoYXQgd29yayBpcyBiZWluZyBwZXJmb3JtZWQgYXQgd2hhdCB0aW1lIGJ5IHdoaWNoIHJvbGVzIHVzaW5nIHdoaWNoIGlucHV0IGFuZCBwcm9kdWNpbmcgd2hhdCBvdXRwdXRzLiAgQSBwcm9qZWN0IHBsYW4gYXMgaXQgaXMgcmVwcmVzZW50ZWQgaW4gcHJvamVjdCBwbGFubmluZyB0b29scyBzdWNoIGFzIElCTSBSYXRpb25hbCBQb3J0Zm9saW8gTWFuYWdlciBvciBNaWNyb3NvZnQgUHJvamVjdCBub3JtYWxseSBkb2VzIG5vdCBuZWVkIGFsbCB0aGlzIGluZm9ybWF0aW9uIGFuZCBpcyBub3JtYWxseSBsaW1pdGVkIHRvIGp1c3QgcmVwcmVzZW50aW5nIGEgc3Vic2V0LiAgRm9yIGV4YW1wbGUsIGEgdHlwaWNhbCBNUyBQcm9qZWN0IHBsYW4gb25seSByZXByZXNlbnRzIHRoZSB3b3JrIGJyZWFrZG93biBjb25zaXN0aW5nIG9mIFRhc2tzIGFuZCBBY3Rpdml0aWVzIChzb21ldGltZXMgcmVmZXJyZWQgdG8gYXMgc3VtbWFyeSB0YXNrcykuICBJdCBkb2VzIG5vdCBzaG93IHRoZSBpbnB1dCBhbmQgb3V0cHV0IFdvcmsgUHJvZHVjdHMgZm9yIGEgVGFzaywgYnV0IGl0IGNhbiBzaG93IHdoaWNoIHJvbGVzIHNoYWxsIGJlIHN0YWZmZWQgZm9yIHBlcmZvcm1pbmcgdGhlIFRhc2suICBIb3dldmVyLCBzdWNoIHJvbGUgYWxsb2NhdGlvbiBuZWVkIHRvIGJlIHJlcGxhY2VkIHdpdGggY29uY3JldGUgcmVzb3VyY2VzIHdoZW4gaW5zdGFudGlhdGluZyB0aGUgcGxhbiBmb3IgYSBjb25jcmV0ZSBwcm9qZWN0LiAgU29tZXRpbWVzIHByb2plY3QgcGxhbnMgY2FuIHRoZW4gYWdhaW4gYmUgb3JnYW5pemVkIGRpZmZlcmVudGx5IGJ5IG9yZ2FuaXppbmcgd29yayBieSBkZWxpdmVyYWJsZXMgaW4gd2hpY2ggV29yayBQcm9kdWN0cyBhcmUgbWFwcGVkIHRvIHRoZSBwbGFuJ3Mgc3VtbWFyeSB0YXNrcyBhbmQgVGFzayB0aGF0IGhhdmUgdGhlc2Ugd29yayBwcm9kdWN0cyBhcyBvdXRwdXQgbWFwcGVkIGJlbG93IHN1Y2ggYXMgc3VtbWFyeSB0YXNrLiAgVGhlcmVmb3JlLCBhIHByb2Nlc3MgY2FuIG1ha2UgcmVjb21tZW5kYXRpb25zIGFib3V0IHdoaWNoIGVsZW1lbnRzIHRvIGluY2x1ZGUgYW5kIHdoaWNoIHRvIGV4Y2x1ZGUgd2hlbiBnZW5lcmF0aW5nIGEgcGxhbi4gIFdoZW4gdGhlIGlzUGxhbm5lZCBhdHRyaWJ1dGUgaXMgc2V0IHRvIEZhbHNlIGZvciBhbiBpbnN0YW5jZSBvZiBhIEJyZWFrZG93biBFbGVtZW50LCB0aGVuIHRoaXMgZWxlbWVudCBzaGFsbCBub3QgYmUgbm90IGluY2x1ZGVkIHdoZW4gYSBjb25jcmV0ZSBwcm9qZWN0IHBsYW4gaXMgYmVpbmcgZ2VuZXJhdGVkIGZyb20gdGhlIGJyZWFrZG93biBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucyB0aGlzIGVsZW1lbnQuJiN4RDsmI3hBOyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iYXR0cmlidXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9ImlzUGxhbm5lZCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwcmVmaXgiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iUHJlZml4IHJlcHJlc2VudHMgYW4gYWRkaXRpb25hbCBsYWJlbCB0aGF0IHdpbGwgYmUgcHJlc2VudGVkIGFzIGEgcHJlZml4IHRvIGFueSBCcmVha2Rvd24gRWxlbWVudCB0byBpbmRpY2F0ZSBhIHVzZXItZGVmaW5lZCBzdWItdHlwZSBmb3IgdGhlIGVsZW1lbnQuICBGb3IgZXhhbXBsZSwgaWYgdGhlIHByb2Nlc3MgZW5naW5lZXIgd291bGQgbGlrZSB0byBkaXN0aW5ndWlzaCBoaXMgQWN0aXZpdGllcyBieSAnTW9kdWxlJyAoYXMgZG9uZSBpbiB0aGUgSUJNIFJhdGlvbmFsIFN1bW1pdCBBc2NlbmRhbnQgTWV0aG9kKSwgaGUgY2FuIGRlZmluZSBhIGRpZmZlcmVudCBwcmVmaXggZm9yIGV2ZXJ5IG1vZGVsIHRvIGJlIHVzZWQgaW4gYWRkaXRpb24gdG8gbmFtaW5nIEFjdGl2aXRpZXMsIGUuZy4gJnF1b3Q7U1JBLkVzdGFibGlzaCBSZXF1aXJlbWVudHMmcXVvdDsgd2l0aCBTUkEgaW5kaWNhdGluZyB0aGF0IHRoaXMgQWN0aXZpdHkgYmVsb25ncyB0byB0aGUgJnF1b3Q7U29mdHdhcmUgUmVxdWlyZW1lbnRzIEFuYWx5c2lzJnF1b3Q7IG1vZHVsZS4gIEFub3RoZXIgY29tbW9uIGFwcGxpY2F0aW9uIGZvciBwcmVmaXggaXMgdG8gcXVhbGlmeSByb2xlcyBpbiBSb2xlIERlc2NyaXB0b3JzLiAgRm9yIGV4YW1wbGUsICZxdW90O0N1c3RvbWVyLkFyY2hpdGVjdCZxdW90OyB3b3VsZCBkZWZpbmUgYSAmcXVvdDtDdXN0b21lciZxdW90OyBwcmVmaXggZm9yIHRoZSBSb2xlIERlc2NyaXB0b3IgJnF1b3Q7QXJjaGl0ZWN0JnF1b3Q7IGV4cHJlc3NpbmcgdGhhdCB0aGlzIGlzIGFuIGFyY2hpdGVjdCBvbiB0aGUgY3VzdG9tZXIgc2lkZSBhbmQgbm90IHRoZSBkZXZlbG9wbWVudCB0ZWFtIHNpZGUuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJhdHRyaWJ1dGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0icHJlZml4Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbiIgZVN1cGVyVHlwZXM9IiMvL0NvbnRlbnREZXNjcmlwdGlvbiI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBnZW5lcmFsaXplZCBDb250ZW50IERlc2NyaXB0aW9uIHRoYXQgaXMgdXNlZCB0byBzdG9yZSB0aGUgdGV4dHVhbCBkZXNjcmlwdGlvbiBmb3IgYSBCcmVha2Rvd24gRWxlbWVudC4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbiIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idXNhZ2VHdWlkYW5jZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJQcm92aWRlcyBpbmZvcm1hdGlvbiBhbmQgZ3VpZGFuY2Ugb24gdGhlIG1lYW5pbmcgb2YgdGhlIEJvb2xlYW4gZmxhZyB2YWx1ZXMgYW5kIHVuZGVyIHdoYXQgY2lyY3Vtc3RhbmNlcyB0aGV5IHNob3VsZCBiZSBvdmVycmlkZGVuLiBGb3IgZXhhbXBsZSwgaXQgZGVzY3JpYmVzIHdoeSB0aGUgYnJlYWtkb3duIGVsZW1lbnQgaXMgb3B0aW9uYWwgb3IgY29uc2lkZXJhdGlvbnMgZm9yIHJlcGVhdGluZyBpdCBhbmQgZGlmZmVyZW5jZXMgaW4gdGhlIGluZGl2aWR1YWwgb2NjdXJyZW5jZXMgb2YgdGhpcyBCcmVha2Rvd24gRWxlbWVudCBhY3Jvc3MgdGhlIGxpZmVjeWNsZS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImF0dHJpYnV0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJ1c2FnZUd1aWRhbmNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkNhcGFiaWxpdHlQYXR0ZXJuIiBlU3VwZXJUeXBlcz0iIy8vUHJvY2VzcyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBzcGVjaWFsIFByb2Nlc3MgdGhhdCBkZXNjcmliZXMgYSByZXVzYWJsZSBjbHVzdGVyIG9mIGRvaW5nIHdvcmsgaW4gY29tbW9uIHByb2Nlc3MgYXJlYXMuICBDYXBhYmlsaXRpZXMgUGF0dGVybnMgZXhwcmVzcyBhbmQgY29tbXVuaWNhdGUgcHJvY2VzcyBrbm93bGVkZ2UgZm9yIGEga2V5IGFyZWEgb2YgaW50ZXJlc3Qgc3VjaCBhcyBhIERpc2NpcGxpbmUgYW5kIGNhbiBiZSBkaXJlY3RseSB1c2VkIGJ5IHByb2Nlc3MgcHJhY3RpdGlvbmVyIHRvIGd1aWRlIGhpcyB3b3JrLiAgVGhleSBhcmUgYWxzbyB1c2VkIGFzIGJ1aWxkaW5nIGJsb2NrcyB0byBhc3NlbWJsZSBEZWxpdmVyeSBQcm9jZXNzZXMgb3IgbGFyZ2VyIENhcGFiaWxpdHkgUGF0dGVybnMgZW5zdXJpbmcgb3B0aW1hbCByZXVzZSBhbmQgYXBwbGljYXRpb24gb2YgdGhlIGtleSBwcmFjdGljZXMgdGhleSBleHByZXNzLiYjeEQ7JiN4QTtBIENhcGFiaWxpdHkgUGF0dGVybiBpcyBhIHNwZWNpYWwgUHJvY2VzcyB0aGF0IGRlc2NyaWJlcyBhIHJldXNhYmxlIGNsdXN0ZXIgb2YgZG9pbmcgd29yayBpbiBhIGdlbmVyYWwgcHJvY2VzcyBhcmVhIHRoYXQgcHJvdmlkZXMgYSBjb25zaXN0ZW50IGRldmVsb3BtZW50IGFwcHJvYWNoIHRvIGNvbW1vbiBwcm9ibGVtcy4gIEV4YW1wbGVzIGZvciBDYXBhYmlsaXR5IFBhdHRlcm4gY291bGQgYmUgJ3VzZSBjYXNlLWJhc2VkIHJlcXVpcmVtZW50cyBtYW5hZ2VtZW50JywgJ3VzZSBjYXNlIGFuYWx5c2lzJywgb3IgJ3VuaXQgdGVzdGluZycuIFR5cGljYWxseSBidXQgbm90IG5lY2Vzc2FyaWx5LCBDYXBhYmlsaXR5IFBhdHRlcm5zIGhhdmUgdGhlIHNjb3BlIG9mIG9uZSBkaXNjaXBsaW5lIHByb3ZpZGluZyBhIGJyZWFrZG93biBvZiByZXVzYWJsZSBjb21wbGV4IEFjdGl2aXRpZXMsIHJlbGF0aW9uc2hpcHMgdG8gdGhlIFJvbGVzIHdoaWNoIHBlcmZvcm0gVGFza3Mgd2l0aGluIHRoZXNlIEFjdGl2aXRpZXMsIGFzIHdlbGwgYXMgdG8gdGhlIFdvcmsgUHJvZHVjdHMgdGhhdCBhcmUgdXNlZCBhbmQgcHJvZHVjZWQuICBBIGNhcGFiaWxpdHkgcGF0dGVybiBkb2VzIG5vdCByZWxhdGUgdG8gYW55IHNwZWNpZmljIHBoYXNlIG9yIGl0ZXJhdGlvbiBvZiBhIGRldmVsb3BtZW50IGxpZmVjeWNsZSwgYW5kIHNob3VsZCBub3QgaW1wbHkgYW55LiAgSW4gb3RoZXIgd29yZHMsIGEgcGF0dGVybiBzaG91bGQgYmUgZGVzaWduZWQgaW4gYSB3YXkgdGhhdCBpdCBpcyBhcHBsaWNhYmxlIGFueXdoZXJlIGluIGEgRGVsaXZlcnkgUHJvY2Vzcy4gIFRoaXMgZW5hYmxlcyBpdHMgQWN0aXZpdGllcyB0byBiZSBmbGV4aWJseSBhc3NpZ25lZCB0byB3aGF0ZXZlciBwaGFzZXMgdGhlcmUgYXJlIGluIHRoZSBEZWxpdmVyeSBQcm9jZXNzIHRvIHdoaWNoIGl0IGlzIGJlaW5nIGFwcGxpZWQuICBJdCBpcyBhIGdvb2QgcHJhY3RpY2UgdG8gZGVzaWduIGEgQ2FwYWJpbGl0eSBQYXR0ZXJuIHRvIHByb2R1Y2Ugb25lIG9yIG1vcmUgZ2VuZXJpYyBEZWxpdmVyYWJsZXMuICBUaGUgdHlwaWNhbCBjb25maWd1cmF0aW9uIGlzIHRoYXQgZWFjaCBBY3Rpdml0eSBpbiB0aGUgQ2FwYWJpbGl0eSBQYXR0ZXJuIHByb2R1Y2VzIG9uZSBEZWxpdmVyYWJsZSwgYW5kIHRoZSBsYXN0IFRhc2sgRGVzY3JpcHRvciBpbiB0aGUgQWN0aXZpdHkgZXhwbGljaXRseSBvdXRwdXRzIGp1c3QgdGhpcyBEZWxpdmVyYWJsZS4gIFRoaXMgZW5hYmxlcyB0aGUgcHJvY2VzcyBlbmdpbmVlciB0byBzZWxlY3QgUGF0dGVybnMgb3IganVzdCBBY3Rpdml0aWVzIGJ5IGRlY2lkaW5nIHdoaWNoIERlbGl2ZXJhYmxlcyBhcmUgcmVxdWlyZWQuICBJdCBhbHNvIG9mZmVycyBhIHNpbXBsZSBpbnRlZ3JhdGlvbiBhcHByb2FjaDogYW4gQWN0aXZpdHkgZnJvbSBhIGNhcGFiaWxpdHkgcGF0dGVybiBpcyBsaW5rZWQgdG8gdGhlIFBoYXNlIG9yIEl0ZXJhdGlvbiB3aGljaCBpcyByZXF1aXJlZCB0byBwcm9kdWNlIHRoZSBBY3Rpdml0eSdzIERlbGl2ZXJhYmxlLiAgS2V5IGFwcGxpY2F0aW9ucyBhcmVhcyBvZiAvIGFyZWFzIG9mIHJldXNlIGZvciBDYXBhYmlsaXR5IFBhdHRlcm5zIGFyZTomI3hEOyYjeEE7LSBUbyBzZXJ2ZSBhcyBidWlsZGluZyBibG9ja3MgZm9yIGFzc2VtYmxpbmcgRGVsaXZlcnkgUHJvY2Vzc2VzIG9yIGxhcmdlciBDYXBhYmlsaXR5IFBhdHRlcm5zLiAgTm9ybWFsbHkgZGV2ZWxvcGluZyBhIERlbGl2ZXJ5IFByb2Nlc3MgaXMgbm90IGRvbmUgZnJvbSBzY3JhdGNoIGJ1dCBieSBzeXN0ZW1hdGljYWxseSBhcHBseWluZyBhbmQgYmluZGluZyBwYXR0ZXJucy4gIEluIGFkZGl0aW9uIHRvIHRoZSBzdGFuZGFyZCBwYXR0ZXJuIGFwcGxpY2F0aW9uIG9mICdjb3B5LWFuZC1tb2RpZnknLCB3aGljaCBhbGxvd3MgdGhlIHByb2Nlc3MgZW5naW5lZXIgdG8gaW5kaXZpZHVhbGx5IGN1c3RvbWl6ZSB0aGUgcGF0dGVybidzIGNvbnRlbnQgdG8gdGhlIHBhcnRpY3VsYXIgc2l0dWF0aW9uIGl0IGlzIGFwcGxpZWQgZm9yLCB0aGUgUGx1Z2luIG1ldGEtbW9kZWwgcGFja2FnZSAoU2VjdGlvbiA2LjEpIGludHJvZHVjZXMgZXZlbiBtb3JlIHNvcGhpc3RpY2F0ZWQgaW5oZXJpdGFuY2UgcmVsYXRpb25zaGlwcyB0aGF0IHN1cHBvcnQgZHluYW1pYyBiaW5kaW5nIG9mIHBhdHRlcm5zIChpLmUuIHRoZSBwYXR0ZXJuIGlzIHJlZmVyZW5jZWQgYW5kIG5vdCBjb3BpZWQpLiAgVGhpcyB1bmlxdWUgbmV3IHdheSBvZiByZXVzaW5nIHByb2Nlc3Mga25vd2xlZGdlIGFsbG93cyB0byBmYWN0b3Igb3V0IGNvbW1vbmx5IHJlb2NjdXJyaW5nIEFjdGl2aXRpZXMgaW50byBwYXR0ZXJucyBhbmQgdG8gYXBwbHkgdGhlbSBvdmVyIGFuZCBvdmVyIGFnYWluIGZvciBhIHByb2Nlc3MuICBXaGVuIHRoZSBwYXR0ZXJuIGlzIGJlaW5nIHJldmlzZWQgb3IgdXBkYXRlZCwgYWxsIGNoYW5nZXMgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IHJlZmxlY3RlZCBpbiBhbGwgcGF0dGVybiBhcHBsaWNhdGlvbiBpbiBhbGwgcHJvY2Vzc2VzIGJlY2F1c2Ugb2YgdGhlIGR5bmFtaWMgYmluZGluZy4mI3hEOyYjeEE7LSBUbyBzdXBwb3J0IGRpcmVjdCBleGVjdXRpb24gaW4gYSBkZXZlbG9wbWVudCBwcm9qZWN0IHRoYXQgZG9lcyBub3Qgd29yayBmb2xsb3dpbmcgYSB3ZWxsLWRlZmluZWQgcHJvY2VzcywgYnV0IHdvcmtzIGJhc2VkIG9uIGxvb3NlbHkgY29ubmVjdGVkIHByb2Nlc3MgZnJhZ21lbnRzIG9mIGJlc3QgcHJhY3RpY2VzIGluIGEgZmxleGlibGUgbWFubmVyIChlLmcuIEFnaWxlIERldmVsb3BtZW50KS4mI3hEOyYjeEE7LSBUbyBzdXBwb3J0IHByb2Nlc3MgZWR1Y2F0aW9uIGJ5IGRlc2NyaWJpbmcga25vd2xlZGdlIGZvciBhIGtleSBhcmVhIHN1Y2ggYXMgYmVzdCBwcmFjdGljZXMgb24gaG93IHRvIHBlcmZvcm0gdGhlIHdvcmsgZm9yIGEgRGlzY2lwbGluZSAoZS5nLiBSZXF1aXJlbWVudHMgTWFuYWdlbWVudCksIGZvciBhIHNwZWNpZmljIGRldmVsb3BtZW50IHRlY2huaXF1ZSAoYXNwZWN0LW9yaWVudGVkIGRldmVsb3BtZW50KSwgb3IgYSBzcGVjaWZpYyB0ZWNobmljYWwgYXJlYSAoZS5nLiByZWxhdGlvbmFsIGRhdGFiYXNlIGRlc2lnbiksIHdoaWNoIGlzIHVzZWQgZm9yIGVkdWNhdGlvbiBhbmQgdGVhY2hpbmcuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDYXBhYmlsaXR5UGF0dGVybiIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQ2hlY2tsaXN0IiBlU3VwZXJUeXBlcz0iIy8vR3VpZGFuY2UiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgc3BlY2lmaWMgdHlwZSBvZiBndWlkYW5jZSB0aGF0IGlkZW50aWZpZXMgYSBzZXJpZXMgb2YgaXRlbXMgdGhhdCBuZWVkIHRvIGJlIGNvbXBsZXRlZCBvciB2ZXJpLWZpZWQuICBDaGVja2xpc3RzIGFyZSBvZnRlbiB1c2VkIGluIHJldmlld3Mgc3VjaCBhcyB3YWxrdGhyb3VnaHMgb3IgaW5zcGVjdGlvbnMuICIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ2hlY2tsaXN0Ii8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJDb21wb3NpdGVSb2xlIiBlU3VwZXJUeXBlcz0iIy8vUm9sZURlc2NyaXB0b3IiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgc3BlY2lhbCBSb2xlIERlc2NyaXB0b3IgdGhhdCByZWxhdGVzIHRvIG1vcmUgdGhlbiBvbmUgUm9sZS4gIEl0IHJlcHJlc2VudHMgYSBncm91cGluZyBvZiBSb2xlcyB3aXRoIHRoZSBtYWluIHB1cnBvc2Ugb2Ygc2ltcGxpZmljYXRpb24sIGkuZS4gcmVkdWNpbmcgdGhlIG51bWJlciBvZiByb2xlcyBmb3IgYSBwcm9jZXNzLiYjeEQ7JiN4QTtBIENvbXBvc2l0ZSBSb2xlIGlzIGEgZ3JvdXBpbmcgb2YgUm9sZXMgdGhhdCBjYW4gYmUgdXNlZCBpbiBhbiBBY3Rpdml0eSBvciBQcm9jZXNzIHRvIHJlZHVjZSB0aGUgbnVtYmVyIG9mIFJvbGVzLiAgQSB0eXBpY2FsIGFwcGxpY2F0aW9uIHdvdWxkIGJlIGEgcHJvY2VzcyBmb3IgYSBzbWFsbCB0ZWFtIGluIHdoaWNoIGEgc3RhbmRhcmQgc2V0IG9mIHJvbGVzIGZyb20gdGhlIG1ldGhvZCBjb250ZW50IHdvdWxkIGJlIGFsbCBwZXJmb3JtZWQgYnkgb25lIG9yIG1vcmUgcmVzb3VyY2UuICBCeSB1c2luZyBDb21wb3NpdGUgUm9sZSB0aGUgcHJvY2VzcyB3b3VsZCBzdWdnZXN0IGEgdHlwaWNhbCBjbHVzdGVyaW5nIG9mIFJvbGVzIHRvIFJlc291cmNlcy4gIEEgQ29tcG9zaXRlIFJvbGUgY291bGQgcGVyZm9ybSBhbGwgVGFza3MgZGVmaW5lZCBmb3IgdGhlIFJvbGVzIGl0IHJlZmVycyB0by4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkNvbXBvc2l0ZVJvbGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Imdyb3VwMiIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VGZWF0dXJlTWFwRW50cnkiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9Imdyb3VwIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Imdyb3VwOjMzIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImFnZ3JlZ2F0ZWRSb2xlIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL1JvbGUiIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIGRlcml2ZWQ9InRydWUiIGNvbnRhaW5tZW50PSJ0cnVlIgotICAgICAgICByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQWdncmVnYXRlZFJvbGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJncm91cCIgdmFsdWU9IiNncm91cDozMyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJDb25jZXB0IiBlU3VwZXJUeXBlcz0iIy8vR3VpZGFuY2UiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgc3BlY2lmaWMgdHlwZSBvZiBndWlkYW5jZSB0aGF0IG91dGxpbmVzIGtleSBpZGVhcyBhc3NvY2lhdGVkIHdpdGggYmFzaWMgcHJpbmNpcGxlcyB1bmRlcmx5aW5nIHRoZSByZWZlcmVuY2VkIGl0ZW0uIENvbmNlcHRzIG5vcm1hbGx5IGFkZHJlc3MgbW9yZSBnZW5lcmFsIHRvcGljcyB0aGFuIEd1aWRlbGluZXMgYW5kIHNwYW4gYWNyb3NzIHNldi1lcmFsIHdvcmsgcHJvZHVjdCBhbmQvb3IgdGFza3MvYWN0aXZpdGllcy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkNvbmNlcHQiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkNvbnN0cmFpbnQiIGVTdXBlclR5cGVzPSIjLy9NZXRob2RFbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIGdlbmVyYWxpemVkIE1ldGhvZCBFbGVtZW50IHRoYXQgcmVwcmVzZW50cyBhIGNvbmRpdGlvbiBvciByZXN0cmljdGlvbiBleHByZXNzZWQgaW4gbmF0dXJhbCBsYW5ndWFnZSB0ZXh0IG9yIGluIGEgbWFjaGluZSByZWFkYWJsZSBsYW5ndWFnZSBmb3IgdGhlIHB1cnBvc2Ugb2YgZGVjbGFyaW5nIHNvbWUgb2YgdGhlIHNlbWFudGljcyBvZiBhIE1ldGhvZCBFbGVtZW50LiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ29uc3RyYWludCIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibWFpbkRlc2NyaXB0aW9uIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlN0b3JlcyB0aGUgbWFpbiBkZWZpbml0aW9uIG9mIHRoZSBjb25zdHJhaW50LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iYXR0cmlidXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Im1haW5EZXNjcmlwdGlvbiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJDb250ZW50Q2F0ZWdvcnkiIGVTdXBlclR5cGVzPSIjLy9Db250ZW50RWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQW4gYWJzdHJhY3QgY2xhc3MgZ2VuZXJhbGl6aW5nIGNvbnRlbnQgY2F0ZWdvcnkgdHlwZXMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDb250ZW50Q2F0ZWdvcnkiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkNvbnRlbnRDYXRlZ29yeVBhY2thZ2UiIGVTdXBlclR5cGVzPSIjLy9NZXRob2RQYWNrYWdlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIHNwZWNpYWwgTWV0aG9kIFBhY2thZ2UgdGhhdCBvbmx5IGNvbnRhaW5zIENvbnRlbnQgQ2F0ZWdvcnkgRWxlbWVudHMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDb250ZW50Q2F0ZWdvcnlQYWNrYWdlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJncm91cDIiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FRmVhdHVyZU1hcEVudHJ5Ij4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJncm91cCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJncm91cDoxMyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJjb250ZW50Q2F0ZWdvcnkiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vQ29udGVudENhdGVnb3J5IiB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkNvbnRlbnRDYXRlZ29yeSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Imdyb3VwIiB2YWx1ZT0iI2dyb3VwOjEzIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkNvbnRlbnREZXNjcmlwdGlvbiIgZVN1cGVyVHlwZXM9IiMvL01ldGhvZFVuaXQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgZ2VuZXJhbGl6ZWQgTWV0aG9kIEVsZW1lbnQgdGhhdCBpcyB1c2VkIHRvIHN0b3JlIHRoZSB0ZXh0dWFsIGRlc2NyaXB0aW9uIGZvciBhIENvbnRlbnQgRWxlbWVudC4gIEl0IGRlZmluZXMgc3RhbmRhcmQgYXR0cmlidXRlcyBhcHBsaWNhYmxlIGZvciBhbGwgQ29udGVudCBFbGVtZW50IHR5cGVzLiAgU3BlY2lmaWMgQ29udGVudCBFbGVtZW50IHN1Yi10eXBlcyBjYW4gZGVmaW5lIHRoZWlyIG93biBtYXRjaGluZyBDb250ZW50IERlc2NyaXB0aW9uIHN1Yi10eXBlcy4gIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDb250ZW50RGVzY3JpcHRpb24iLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im1haW5EZXNjcmlwdGlvbiIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJTdG9yZXMgdGhlIG1haW4gZGVzY3JpcHRpdmUgdGV4dCBmb3IgdGhlIENvbnRlbnQgRWxlbWVudC4gIEFsbCB0ZXh0IHRoYXQgaXMgbm90IHBhcnQgb2YgYW55IG9mIHRoZSBtb3JlIHNwZWNpZmljIGF0dHJpYnV0ZXMgc2hhbGwgYmUgc3RvcmVkIGhlcmUuICBJZiB0aGUgQ29udGVudCBEZXNjcmlwdGlvbiBpcyBkaXZpZGVkIGludG8gc2VjdGlvbnMgdXNpbmcgdGhlIFNlY3Rpb24gY2xhc3MsIHRoZW4gb25seSB0aGUgdGV4dCBmcm9tIHRoZSAnc3RhcnQnIG9mIHRoZSBjb250ZW50IGRlc2NyaXB0aW9uIHRvIHRoZSBmaXJzdCBzZWN0aW9uIHdpbGwgYmUgc3RvcmVkIGhlcmUgKHNpbWlsYXIgdG8gYSBub3JtYWwgZG9jdW1lbnQgd2hlcmUgeW91IGNhbiBwbGFjZSB0ZXh0IGJldHdlZW4gaXRzIGJlZ2lubmluZyB0byBpdHMgZmlyc3QgZGljdGlvbiBoZWFkaW5nKS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTWFpbkRlc2NyaXB0aW9uIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImtleUNvbnNpZGVyYXRpb25zIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlByb3ZpZGVzIGFkdmlzZSBhbmQgZ3VpZGFuY2Ugb2YgYSBjcml0aWNhbCBuYXR1cmUgZm9yIHRoZSBjb250ZW50IGVsZW1lbnQgYXMgd2VsbCBhcyB3YXJuaW5ncywgY2F1dGlvbnMsIHBpdGZhbGxzLCBkYW5nZXJzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJLZXlDb25zaWRlcmF0aW9ucyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJzZWN0aW9uIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL1NlY3Rpb24iIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iU2VjdGlvbiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJleHRlcm5hbElkIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkFuIGV4dGVybmFsIHZpc2libGUgbnVtYmVyIHRoYXQgaXMgdXNlZCB0byByZWZlcmVuY2UgdGhpcyBhcnRpZmFjdC4gVXNlZCBsaWtlIGEgc3lub255bS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImF0dHJpYnV0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJleHRlcm5hbElkIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkNvbnRlbnRFbGVtZW50IiBlU3VwZXJUeXBlcz0iIy8vRGVzY3JpYmFibGVFbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIERlc2NyaWJhYmxlIEVsZW1lbnQgdGhhdCByZXByZXNlbnRzIGFuIGFic3RyYWN0IGdlbmVyYWxpemF0aW9uIGZvciBhbGwgZWxlbWVudHMgdGhhdCBhcmUgY29uc2lkZXJlZCB0byBiZSBhbmQgbWFuYWdlZCBhcyBNZXRob2QgQ29udGVudC4mI3hEOyYjeEE7Q29udGVudCBFbGVtZW50cyByZXByZXNlbnRzIHJldXNhYmxlIE1ldGhvZCBDb250ZW50IHRoYXQgaXMgc3VwcG9zZWQgdG8gYmUgbWFuYWdlZCBpbiBDb250ZW50IFBhY2thZ2VzLiAgVGhlIHNlcGFyYXRpb24gb2YgQ29udGVudCBFbGVtZW50IGZyb20gUHJvY2VzcyBFbGVtZW50IGFsbG93cyB0byBjbGVhcmx5IGRpc3Rpbmd1aXNoIGJldHdlZW4gcHVyZSBtZXRob2QgY29udGVudCBmcm9tIGNvbnRlbnQgdGhhdCBpcyByZXByZXNlbnRlZCBpbiBwcm9jZXNzZXMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDb250ZW50RWxlbWVudCIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZ3JvdXAxIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUZlYXR1cmVNYXBFbnRyeSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZ3JvdXAiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iZ3JvdXA6MTQiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY2hlY2tsaXN0IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciCi0gICAgICAgIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIGRlcml2ZWQ9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ2hlY2tsaXN0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZ3JvdXAiIHZhbHVlPSIjZ3JvdXA6MTQiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY29uY2VwdCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIgotICAgICAgICB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkNvbmNlcHQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJncm91cCIgdmFsdWU9IiNncm91cDoxNCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJleGFtcGxlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciCi0gICAgICAgIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIGRlcml2ZWQ9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRXhhbXBsZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Imdyb3VwIiB2YWx1ZT0iI2dyb3VwOjE0Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Imd1aWRlbGluZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIgotICAgICAgICB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ikd1aWRlbGluZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Imdyb3VwIiB2YWx1ZT0iI2dyb3VwOjE0Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJldXNhYmxlQXNzZXQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIKLSAgICAgICAgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJSZXVzYWJsZUFzc2V0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZ3JvdXAiIHZhbHVlPSIjZ3JvdXA6MTQiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic3VwcG9ydGluZ01hdGVyaWFsIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciCi0gICAgICAgIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIGRlcml2ZWQ9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iU3VwcG9ydGluZ01hdGVyaWFsIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZ3JvdXAiIHZhbHVlPSIjZ3JvdXA6MTQiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0id2hpdGVwYXBlciIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIgotICAgICAgICB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IldoaXRlcGFwZXIiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJncm91cCIgdmFsdWU9IiNncm91cDoxNCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50IgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iYXR0cmlidXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9InZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idmFyaWFiaWxpdHlUeXBlIiBlVHlwZT0iIy8vVmFyaWFiaWxpdHlUeXBlIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSJuYSIgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iYXR0cmlidXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9InZhcmlhYmlsaXR5VHlwZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJDb250ZW50UGFja2FnZSIgZVN1cGVyVHlwZXM9IiMvL01ldGhvZFBhY2thZ2UiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgc3BlY2lhbCBNZXRob2QgUGFja2FnZSB0aGF0IGNvbnRhaW5zIENvbnRlbnQgRWxlbWVudHMgYW5kIENvbnRlbnQgRWxlbWVudHMsIG9ubHkuICBFeGFtcGxlcyBmb3IgQ29udGVudCBFbGVtZW50IGFyZSBBcnRpZmFjdHMsIFRhc2tzLCBSb2xlcywgZXRjLiAgQSBrZXkgc2VwYXJhdGlvbiBvZiBjb25jZXJucyBpbiBVTUEgaXMgdGhlIGRpc3RpbmN0aW9uIGJldHdlZW4gTWV0aG9kIENvbnRlbnQgYW5kIFByb2Nlc3MuICBUaGlzIHNlcGFyYXRpb24gaXMgZW5mb3JjZWQgYnkgc3BlY2lhbCBwYWNrYWdlIHR5cGVzLCB3aGljaCBkbyBub3QgYWxsb3cgdGhlIG1peGluZyBvZiBtZXRob2QgY29udGVudCB3aXRoIHByb2Nlc3Nlcy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkNvbnRlbnRQYWNrYWdlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJncm91cDIiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FRmVhdHVyZU1hcEVudHJ5Ij4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJncm91cCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJncm91cDoxMyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJjb250ZW50RWxlbWVudCIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9Db250ZW50RWxlbWVudCIgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDb250ZW50RWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Imdyb3VwIiB2YWx1ZT0iI2dyb3VwOjEzIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkN1c3RvbUNhdGVnb3J5IiBlU3VwZXJUeXBlcz0iIy8vQ29udGVudENhdGVnb3J5Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIGNhdGVnb3J5IGludHJvZHVjZWQgYnkgYSBtZXRob2QgY29udGVudCBhdXRob3IgdG8gc3RydWN0dXJlIGFueSBudW1iZXIgb2YgbWV0aG9kIENvbnRlbnQgRWxlbWVudHMgb2YgYW55IHN1YnR5cGUgYmFzZWQgb24gdXNlci1kZWZpbmVkIGNyaXRlcmlhLiAgQmVjYXVzZSBDb250ZW50IENhdGVnb3JpZXMgKGFuZCB0aGVyZWZvcmUgQ3VzdG9tIENhdGVnb3JpZXMsIHRvbykgYXJlIENvbnRlbnQgRWxlbWVudHMgdGhlbXNlbHZlcywgQ3VzdG9tIENhdGVnb3JpZXMgY2FuIGJlIHVzZWQgdG8gcmVjdXJzaXZlbHkgY2F0ZWdvcml6ZSBDb250ZW50IENhdGVnb3JpZXMgYXMgd2VsbC4gIEN1c3RvbSBDYXRlZ29yaWVzIGNhbiBhbHNvIGJlIG5lc3RlZCB3aXRoIGFueSBDb250ZW50IENhdGVnb3J5LiAgQ3VzdG9tIGNhdGVnb3JpZXMgY2FuIGJlIHVzZWQgdG8gY2F0ZWdvcml6ZSBjb250ZW50IGJhc2VkIG9uIHRoZSB1c2VyJ3MgY3JpdGVyaWEgYXMgd2VsbCBhcyB0byBkZWZpbmUgd2hvbGUgdHJlZS1zdHJ1Y3R1cmVzIG9mIG5lc3RlZCBjYXRlZ29yaWVzIGFsbG93aW5nIHRoZSB1c2VyIHRvIHN5c3RlbWF0aWNhbGx5IG5hdmlnYXRlIGFuZCBicm93c2UgbWV0aG9kIGNvbnRlbnQgYW5kIHByb2Nlc3NlcyBiYXNlZCBvbiB0aGVzZSBjYXRlZ29yaWVzLiAgRm9yIGV4YW1wbGUsIG9uZSBjb3VsZCBjcmVhdGUgYSBjdXN0b20gY2F0ZWdvcnkgdG8gbG9naWNhbGx5IG9yZ2FuaXplIGNvbnRlbnQgcmVsZXZhbnQgZm9yIHRoZSB1c2VyJ3MgZGV2ZWxvcG1lbnQgb3JnYW5pemF0aW9uIGRlcGFydG1lbnRzOyBlLmcuIGEgJnF1b3Q7VGVzdGluZyZxdW90OyBjYXRlZ29yeSB0aGF0IGdyb3VwcyB0b2dldGhlciBhbGwgcm9sZXMsIHdvcmsgcHJvZHVjdHMsIHRhc2tzLCBhbmQgZ3VpZGFuY2UgZWxlbWVudCByZWxldmFudCB0byB0ZXN0aW5nLiAgQW5vdGhlciBleGFtcGxlIHdvdWxkIGJlIGNhdGVnb3JpZXMgdGhhdCBleHByZXNzIGxpY2Vuc2luZyBsZXZlbHMgb2YgdGhlIGNvbnRlbnQgZ3JvdXBpbmcgZnJlZWx5IGRpc3RyaWJ1dGFibGUgbWV0aG9kIGNvbnRlbnQgdmVyc3VzIGNvbnRlbnQgdGhhdCByZXByZXNlbnQgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGFuZCByZXF1aXJlcyBhIGxpY2Vuc2UgdG8gYmUgcHVyY2hhc2VkIHRvIGJlIGFibGUgdG8gdXNlIGl0LiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ3VzdG9tQ2F0ZWdvcnkiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Imdyb3VwMiIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VGZWF0dXJlTWFwRW50cnkiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9Imdyb3VwIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Imdyb3VwOjI0Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNhdGVnb3JpemVkRWxlbWVudCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIgotICAgICAgICB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkNhdGVnb3JpemVkRWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Imdyb3VwIiB2YWx1ZT0iI2dyb3VwOjI0Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InN1YkNhdGVnb3J5IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciCi0gICAgICAgIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIGRlcml2ZWQ9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iU3ViQ2F0ZWdvcnkiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJncm91cCIgdmFsdWU9IiNncm91cDoyNCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJEZWxpdmVyYWJsZSIgZVN1cGVyVHlwZXM9IiMvL1dvcmtQcm9kdWN0Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIFdvcmsgUHJvZHVjdCB0aGF0IHByb3ZpZGVzIGEgZGVzY3JpcHRpb24gYW5kIGRlZmluaXRpb24gZm9yIHBhY2thZ2luZyBvdGhlciBXb3JrIFByb2R1Y3RzLCBhbmQgbWF5IGJlIGRlbGl2ZXJlZCB0byBhbiBpbnRlcm5hbCBvciBleHRlcm5hbCBwYXJ0eS4gIFRoZXJlZm9yZSwgYSBEZWxpdmVyYWJsZSBhZ2dyZWdhdGVzIG90aGVyIFdvcmsgUHJvZHVjdHMuIFRoZXJlZm9yZSwgYSBEZWxpdmVyYWJsZSBhZ2dyZWdhdGVzIG90aGVyIFdvcmsgUHJvZHVjdHMuICBBIERlbGl2ZXJhYmxlIGlzIHVzZWQgdG8gcHJlLWRlZmluZSB0eXBpY2FsIG9yIHJlY29tbWVuZGVkIGNvbnRlbnQgaW4gdGhlIGZvcm0gb3Igd29yayBwcm9kdWN0cyB0aGF0IHdvdWxkIGJlIHBhY2thZ2VkIGZvciBkZWxpdmVyeS4gIFRoZSBhY3R1YWwgcGFja2FnaW5nIG9mIHRoZSBEZWxpdmVyYWJsZSBpbiBhbiBhY3R1YWwgcHJvY2VzcyBvciBldmVuIHByb2plY3QgY291bGQgYmUgYSBtb2RpZmljYXRpb24gb2YgdGhpcyByZWNvbW1lbmRhdGlvbi4gIERlbGl2ZXJhYmxlcyBhcmUgdXNlZCB0byByZXByZXNlbnQgYW4gb3V0cHV0IGZyb20gYSBwcm9jZXNzIHRoYXQgaGFzIHZhbHVlLCBtYXRlcmlhbCBvciBvdGhlcndpc2UsIHRvIGEgY2xpZW50LCBjdXN0b21lciBvciBvdGhlciBzdGFrZWhvbGRlci4gIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJEZWxpdmVyYWJsZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZ3JvdXAzIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUZlYXR1cmVNYXBFbnRyeSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZ3JvdXAiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iZ3JvdXA6MzAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZGVsaXZlcmVkV29ya1Byb2R1Y3QiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIKLSAgICAgICAgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJEZWxpdmVyZWRXb3JrUHJvZHVjdCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Imdyb3VwIiB2YWx1ZT0iI2dyb3VwOjMwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkRlbGl2ZXJhYmxlRGVzY3JpcHRpb24iIGVTdXBlclR5cGVzPSIjLy9Xb3JrUHJvZHVjdERlc2NyaXB0aW9uIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIGdlbmVyYWxpemVkIFdvcmsgUHJvZHVjdCBEZXNjcmlwdGlvbiB0aGF0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIHRleHR1YWwgZGVzY3JpcHRpb24gZm9yIGEgRGVsaXZlcmFibGUuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJEZWxpdmVyYWJsZURlc2NyaXB0aW9uIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJleHRlcm5hbERlc2NyaXB0aW9uIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgRGVsaXZlcmFibGUgdXNlZCBmb3IgY2xpZW50IGRvY3VtZW50cyAocHJvcG9zYWwsIHN0YXRlbWVudHMgb2Ygd29yayBvciBjb250cmFjdHVhbCBhZ3JlZW1lbnRzKS4gIEl0IG1pZ2h0IHVzZSBhIGRpZmZlcmVudCBsYW5ndWFnZSBhbmQgZm9sbG93IGxlZ2FsIGNvbnN0cmFpbnRzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJFeHRlcm5hbERlc2NyaXB0aW9uIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InBhY2thZ2luZ0d1aWRhbmNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlByb3ZpZGVzIGd1aWRhbmNlIG9uIGhvdyB0byBhc3NlbWJsZSB0aGUgZGVsaXZlcmFibGUgZnJvbSBhbGwgaXRzIHJlcXVpcmVkIGlucHV0cy4gIFRoaXMgc2VjdGlvbiBkZXNjcmliZXMgdGhlIG1vc3QgY29tbW9uIGNvbnRlbnQgbWVkaXVtIGFuZCBmb3JtYXQuICBEaXN0cmlidXRpb24gb2YgdGhlIGRlbGl2ZXJhYmxlIGlzIGFkZHJlc3NlZCBpbiB0aGlzIHNlY3Rpb24sIGlmIG5lY2Vzc2FyeS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUGFja2FnaW5nR3VpZGFuY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRGVsaXZlcnlQcm9jZXNzIiBlU3VwZXJUeXBlcz0iIy8vUHJvY2VzcyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBzcGVjaWFsIFByb2Nlc3MgZGVzY3JpYmluZyBhIGNvbXBsZXRlIGFuZCBpbnRlZ3JhdGVkIGFwcHJvYWNoIGZvciBwZXJmb3JtaW5nIGEgc3BlY2lmaWMgcHJvamVjdCB0eXBlLiAgSXQgZGVzY3JpYmVzIGEgY29tcGxldGUgcHJvamVjdCBsaWZlY3ljbGUgZW5kLXRvLWVuZCBhbmQgc2hhbGwgYmUgdXNlZCBhcyBhIHJlZmVyZW5jZSBmb3IgcnVubmluZyBwcm9qZWN0cyB3aXRoIHNpbWlsYXIgY2hhcmFjdGVyaXN0aWNzIGFzIGRlZmluZWQgZm9yIHRoZSBwcm9jZXNzLiAgQSBEZWxpdmVyeSBQcm9jZXNzIGlzIHJlbGF0ZWQgdG8gc3BlY2lmaWMgc3VwcG9ydGluZyBpbmZvcm1hdGlvbiBzdWNoIGFzIFJvYWRtYXBzIChpbmhlcml0ZWQgdmlhIEFjdGl2aXR5KSBhcyB3ZWxsIGFzIENvbW11bmljYXRpb25zIGFuZCBFZHVjYXRpb24gTWF0ZXJpYWwuJiN4RDsmI3hBO0EgRGVsaXZlcnkgUHJvY2VzcyBpcyBhIFByb2Nlc3MgdGhhdCBjb3ZlcnMgYSB3aG9sZSBkZXZlbG9wbWVudCBsaWZlY3ljbGUgZnJvbSBiZWdpbm5pbmcgdG8gZW5kLiAgQSBEZWxpdmVyeSBQcm9jZXNzIHNoYWxsIGJlIHVzZWQgYXMgYSB0ZW1wbGF0ZSBmb3IgcGxhbm5pbmcgYW5kIHJ1bm5pbmcgYSBwcm9qZWN0LiAgSXQgcHJvdmlkZXMgYSBjb21wbGV0ZSBsaWZlY3ljbGUgbW9kZWwgd2l0aCBwcmVkZWZpbmVkIHBoYXNlcywgaXRlcmF0aW9ucywgYW5kIGFjdGl2aXRpZXMgdGhhdCBoYXZlIGJlZW4gZGV0YWlsZWQgYnkgc2VxdWVuY2luZyByZWZlcmVuY2luZyBtZXRob2QgY29udGVudCBpbiBicmVha2Rvd24gc3RydWN0dXJlcy4gIEl0IGlzIGRlZmluZWQgb24gdGhlIGJhc2lzIG9mIGV4cGVyaWVuY2Ugd2l0aCBwYXN0IHByb2plY3RzIG9yIGVuZ2FnZW1lbnRzLCBhbmQvb3IgdGhlIGJlc3QgcHJhY3RpY2UgdXNlIG9mIGEgZGV2ZWxvcG1lbnQgb3IgZGVsaXZlcnkgYXBwcm9hY2guICBJdCBkZWZpbmVzIHdoYXQgZ2V0cyBwcm9kdWNlZCwgaG93IHRob3NlIGl0ZW1zIGFyZSBwcm9kdWNlZCwgYW5kIHRoZSByZXF1aXJlZCBzdGFmZmluZyBpbiB0aGUgZm9ybSBvZiBpbnRlZ3JhdGVkIFdvcmssIFdvcmsgUHJvZHVjdCwgYW5kIFRlYW0gQnJlYWtkb3duIFN0cnVjdHVyZXMuICBGb3IgZXhhbXBsZSwgYSBwcm9jZXNzIGVuZ2luZWVyIGNhbiBkZWZpbmUgYWx0ZXJuYXRpdmUgRGVsaXZlcnkgUHJvY2Vzc2VzIGZvciBzb2Z0d2FyZSBkZXZlbG9wbWVudCBwcm9qZWN0cyB0aGF0IGRpZmZlciBpbiB0aGUgc2NhbGUgb2YgdGhlIGVuZ2FnZW1lbnQgYW5kIHN0YWZmaW5nIG5lY2Vzc2FyeSwgdGhlIHR5cGUgb2YgdGhlIHNvZnR3YXJlIGFwcGxpY2F0aW9uIHRvIGJlIGRldmVsb3BlZCwgdGhlIGRldmVsb3BtZW50IG1ldGhvZHMgYW5kIHRlY2hub2xvZ2llcyB0byBiZSB1c2VkLCBldGMuICBBbHRob3VnaCwgdGhlIERlbGl2ZXJ5IFByb2Nlc3MgYWltcyB0byBjb3ZlciBhIHdob2xlIHByb2plY3QgaXQga2VlcHMgY2VydGFpbiBkZWNpc2lvbiB0aGF0IGFyZSB0b28gcHJvamVjdCBzcGVjaWZpYyBvcGVuLiAgRm9yIGV4YW1wbGUsIHRoZSBicmVha2Rvd24gc3RydWN0dXJlIGRlZmluZXMgd2hpY2ggQnJlYWtkb3duIEVsZW1lbnRzIGhhdmUgbXVsdGlwbGUgb2NjdXJyZW5jZXMgb3IgaXMgcmVwZWF0YWJsZSB2aWEgaXQgcmVzcGVjdGl2ZSBhdHRyaWJ1dGVzLCBidXQgZG9lcyBub3Qgc2F5IGhvdyBtYW55IG9jY3VycmVuY2VzIGFuZCBob3cgbWFueSByZXBlYXRzL2l0ZXJhdGlvbnMgaXQgd2lsbCBoYXZlLiAgVGhlc2UgZGVjaXNpb25zIGhhdmUgdG8gYmUgZG9uZSBieSBhIHByb2plY3QgbWFuYWdlciB3aGVuIHBsYW5uaW5nIGEgY29uY3JldGUgcHJvamVjdCwgcHJvamVjdCBwaGFzZSwgb3IgcHJvamVjdCBpdGVyYXRpb25zLiAgQSBEZWxpdmVyeSBQcm9jZXNzIGlzIGFsd2F5cyBhIGNvbXBsZXRlIGRlc2NyaXB0aW9uIG9mIGEgcHJvY2VzcyBpbiB0ZXJtcyBvZiBjb21wbGV0ZW5lc3Mgb2YgdGhlIGxpZmVjeWNsZSwgYXMgd2VsbCBhcyBpbiB0ZXJtcyBvZiBhbGwgdGhyZWUgdmlld3Mgb24gdGhlIHByb2Nlc3Mgd2hpY2ggYXJlIHRoZSBXb3JrIEJyZWFrZG93biBTdHJ1Y3R1cmUsIFdvcmsgUHJvZHVjdCBCcmVha2Rvd24gU3RydWN0dXJlLCBhbmQgVGVhbSBCcmVha2Rvd24gU3RydWN0dXJlIGhhdmUgdG8gYmUgZnVsbHkgYW5kIGNvbnNpc3RlbnRseSBwb3B1bGF0ZWQuICBDb25zaXN0ZW5jeSBvZiBhIERlbGl2ZXJ5IFByb2Nlc3MgaXMgYWN0dWFsbHkgZW5zdXJlZCBieSB0aGUgZmFjdCB0aGF0IGFsbCB0aHJlZSBicmVha2Rvd25zIGFyZSByZXByZXNlbnRlZCBieSBvbmUgc2luZ2xlIGRhdGEgc3RydWN0dXJlIGFuZCBvbmUgcGFydGljdWxhciBicmVha2Rvd24gc3VjaCBhcyBUZWFtIEJyZWFrZG93biBpcyBqdXN0IGEgdmlldyBvbiB0aGF0IGRhdGEgc3RydWN0dXJlLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRGVsaXZlcnlQcm9jZXNzIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJncm91cDQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FRmVhdHVyZU1hcEVudHJ5Ij4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJncm91cCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJncm91cDo0NyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjb21tdW5pY2F0aW9uc01hdGVyaWFsIgotICAgICAgICB1bmlxdWU9ImZhbHNlIiB1cHBlckJvdW5kPSItMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciCi0gICAgICAgIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIGRlcml2ZWQ9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ29tbXVuaWNhdGlvbnNNYXRlcmlhbCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Imdyb3VwIiB2YWx1ZT0iI2dyb3VwOjQ3Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImVkdWNhdGlvbk1hdGVyaWFsIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciCi0gICAgICAgIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIGRlcml2ZWQ9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRWR1Y2F0aW9uTWF0ZXJpYWwiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJncm91cCIgdmFsdWU9IiNncm91cDo0NyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJEZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbiIgZVN1cGVyVHlwZXM9IiMvL1Byb2Nlc3NEZXNjcmlwdGlvbiI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBnZW5lcmFsaXplZCBQcm9jZXNzIERlc2NyaXB0aW9uIHRoYXQgaXMgdXNlZCB0byBzdG9yZSB0aGUgdGV4dHVhbCBkZXNjcmlwdGlvbiBmb3IgYSBEZWxpdmVyeSBQcm9jZXNzLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24iLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InNjYWxlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9Ik91dGxpbmVzIGNoYXJhY3RlcmlzdGljcyBhYm91dCB0aGUgc2l6ZSBvZiBhIHR5cGljYWwgcHJvamVjdCB0aGF0IHBlcmZvcm1zIHRoaXMgcHJvamVjdCBleHByZXNzZWQgaW4gdGVhbSBzaXplLCBtYW4geWVhcnMsIGV0Yy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iU2NhbGUiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icHJvamVjdENoYXJhY3RlcmlzdGljcyIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJDaGFyYWN0ZXJpemVzIHRoZSBwcm9qZWN0IHRoYXQgd291bGQgdHlwaWNhbGx5IHBlcmZvcm0gdGhpcyBQcm9jZXNzIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlByb2plY3RDaGFyYWN0ZXJpc3RpY3MiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmlza0xldmVsIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9Ik91dGxpbmVzIHR5cGljYWwgcHJvamVjdCByaXNrcyB0aGF0IGFyZSBhZGRyZXNzZWQgd2l0aCB0aGlzIHByb2Nlc3MuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlJpc2tMZXZlbCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJlc3RpbWF0aW5nVGVjaG5pcXVlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkRlc2NyaWJlcyB0aGUgRXN0aW1hdGlvbiBUZWNobmlxdWVzIHByb3ZpZGVkIGZvciB0aGlzIFByb2Nlc3MuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkVzdGltYXRpbmdUZWNobmlxdWUiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icHJvamVjdE1lbWJlckV4cGVydGlzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJQcm92aWRlcyBhIHByb2ZpbGUgb2YgYSB0eXBpY2FsIHByb2plY3QgdGVhbSwgdGhlIGRpc3RyaWJ1dGlvbiBvZiByb2xlcywgc2tpbGxzIHJlcXVpcmVkIGZvciBhIHRlYW0gcGVyZm9ybXMgYSBwcm9qZWN0IGJhc2VkIG9uIHRoaXMgcHJvY2Vzcy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUHJvamVjdE1lbWJlckV4cGVydGlzZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ0eXBlT2ZDb250cmFjdCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJQcm92aWRlcyBiYWNrZ3JvdW5kIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjb0knbSBjaGFJJ20gbnRyYWN0cyB0aGF0IG5lZWQgdG8gYmUgZXN0YWJsaXNoZWQgYmV0d2VlbiBhIHByb2plY3QgdGVhbSB0aGF0IHBlcmZvcm1zIHRoaXMgcHJvY2VzcyBhbmQgYSBjbGllbnQgKGUuZy4gZm9yIGFuIElHUyBlbmdhZ2VtZW50KS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVHlwZU9mQ29udHJhY3QiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRGVzY3JpYmFibGVFbGVtZW50IiBlU3VwZXJUeXBlcz0iIy8vTWV0aG9kRWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQW4gYWJzdHJhY3QgZ2VuZXJhbGl6YXRpb24gb2YgTWV0aG9kIEVsZW1lbnRzIGZvciB3aGljaCBleHRlcm5hbCBwcmVzZW50YXRpb24gbmFtZXMgYXMgd2VsbCBhcyBjb250ZW50IGRlc2NyaXB0aW9ucyBoYXZlIGJlZW4gZGVmaW5lZCwgc3VjaCBhcyBSb2xlcyBvciBXb3JrIFByb2R1Y3RzLiAgUHJlc2VudGF0aW9uIE5hbWUgYW5kIENvbnRlbnQgRGVzY3JpcHRpb25zIGFyZSB0eXBpY2FsbHkgbG9jYWxpemVkIHVzaW5nIGEgcmVzb3VyY2UgYWxsb2NhdGlvbiBtZWNoYW5pc20gZm9yIGl0cyBTdHJpbmcgdHlwZSBhdHRyaWJ1dGVzLiYjeEQ7JiN4QTtUaGlzIGFic3RyYWN0aW9uIHJlcHJlc2VudHMgYWxsIGVsZW1lbnRzIGluIHRoZSBNZXRob2QgQ29udGVudCBhcyB3ZWxsIGFzIFByb2Nlc3Mgc3BhY2UgZm9yIHdoaWNoIGNvbmNyZXRlIHRleHR1YWwgZGVzY3JpcHRpb25zIGFyZSBkZWZpbmVkIGluIHRoZSBmb3JtIG9mIGRvY3VtZW50aW5nIGF0dHJpYnV0ZXMgZ3JvdXBlZCBpbiBhIG1hdGNoaW5nIENvbnRlbnQgRGVzY3JpcHRpb24gaW5zdGFuY2UuICBEZXNjcmliYWJsZSBFbGVtZW50cyBhcmUgaW50ZW5kZWQgdG8gYmUgcHVibGlzaGVkIGluIG1ldGhvZCBvciBwcm9jZXNzIHB1YmxpY2F0aW9ucyAoc2ltaWxhciB0byB0aGUgSUJNIFJhdGlvbmFsIFVuaWZpZWQgUHJvY2VzcyB3ZWIpLiAgRGVzY3JpYmFibGUgRWxlbWVudCBkZWZpbmVzIHRoYXQgdGhlIGVsZW1lbnQgaXQgcmVwcmVzZW50cyB3aWxsIGhhdmUgY29udGVudCAnYXR0YWNoZWQnIHRvIGl0LiAgQ29udGVudCBEZXNjcmlwdGlvbiBpcyB0aGUgYWJzdHJhY3Rpb24gZm9yIHRoZSBhY3R1YWwgcGxhY2VzIGluIHdoaWNoIHRoZSBjb250ZW50IGlzIGJlaW5nIHJlcHJlc2VudGVkLiAgVGhpcyBzZXBhcmF0aW9uIGFsbG93cyBhIGRpc3RpbmN0aW9uIGJldHdlZW4gY29yZSBtZXRob2QgbW9kZWwgZWxlbWVudHMgZGVzY3JpYmluZyB0aGUgc3RydWN0dXJlIG9mIHRoZSBtb2RlbCBmcm9tIHRoZSBhY3R1YWwgZGVzY3JpcHRpb24gY29udGFpbmVyIHByb3ZpZGluZywgZm9yIGV4YW1wbGUsIHRoZSBkb2N1bWVudGF0aW9uIG9mIHRoZSBjb250ZW50IGVsZW1lbnQgaW4gZGlmZmVyZW50IGFsdGVybmF0aXZlcyBsYW5ndWFnZXMsIGF1ZGllbmNlcywgbGljZW5zaW5nIGxldmVscywgZXRjLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRGVzY3JpYmFibGVFbGVtZW50Ii8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJwcmVzZW50YXRpb24iIGVUeXBlPSIjLy9Db250ZW50RGVzY3JpcHRpb24iCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUHJlc2VudGF0aW9uIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImZ1bGZpbGwiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJGdWxmaWxsIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImlzQWJzdHJhY3QiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iYXR0cmlidXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9ImlzQWJzdHJhY3QiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibm9kZWljb24iIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSByZWZlcmVuY2UgdG8gYW4gaWNvbiB0aGF0IGNhbiBiZSB1c2VkIGluIHRyZWUgYnJvd3NlciBwcmVzZW50YXRpb25zIGFuZCBicmVha2Rvd24gc3RydWN0dXJlcy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImF0dHJpYnV0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJub2RlaWNvbiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzaGFwZWljb24iIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSByZWZlcmVuY2UgdG8gYW4gaWNvbiB0aGF0IGNhbiBiZSB1c2VkIGZvciBtb2RlbGluZyB3aXRoIHNwZWNpZmljIENvbnRlbnQgRWxlbWVudCBpbnN0YW5jZXMgKGFzIGdyYXBoaWNhbCBzdGVyZW90eXBlcywgZS5nLiBhIHVzZSBjYXNlIHN5bWJvbCBmb3IgYSB1c2UgY2FzZSBhcnRpZmFjdCkgYXMgd2VsbCBhcyBwdWJsaWNhdGlvbiBvZiBjb250ZW50LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iYXR0cmlidXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9InNoYXBlaWNvbiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJEZXNjcmlwdG9yIiBlU3VwZXJUeXBlcz0iIy8vQnJlYWtkb3duRWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQW4gYWJzdHJhY3QgZ2VuZXJhbGl6YXRpb24gZm9yIHNwZWNpYWwgQnJlYWtkb3duIEVsZW1lbnRzIHRoYXQgcmVmZXJlbmNlcyBvbmUgY29uY3JldGUgQ29udGVudCBFbGVtZW50LiAgQSBkZXNjcmlwdG9yIHByb3ZpZGVzIGEgcmVwcmVzZW50YXRpb24gb2YgYSBDb250ZW50IEVsZW1lbnQgd2l0aGluIGJyZWFrZG93biBzdHJ1Y3R1cmVzLiAgSW4gYWRkaXRpb24gdG8ganVzdCByZWZlcmVuY2luZyBDb250ZW50IEVsZW1lbnRzIGl0IGFsbG93cyBvdmVycmlkaW5nIHRoZSBDb250ZW50IEVsZW1lbnRzIHN0cnVjdHVyYWwgcmVsYXRpb25zaGlwcyBieSBkZWZpbmluZyBpdHMgb3duIHNldHMgb2YgYXNzb2NpYXRpb25zLiYjeEQ7JiN4QTtEZXNjcmlwdG9ycyBhcmUgdGhlIGtleSBjb25jZXB0IGZvciByZWFsaXppbmcgdGhlIHNlcGFyYXRpb24gb2YgcHJvY2Vzc2VzIGZyb20gbWV0aG9kIGNvbnRlbnQuICBBIERlc2NyaXB0b3IgY2FuIGJlIGNoYXJhY3Rlcml6ZWQgYXMgYSByZWZlcmVuY2Ugb2JqZWN0IGZvciBvbmUgcGFydGljdWxhciBDb250ZW50IEVsZW1lbnQsIHdoaWNoIGhhcyBpdHMgb3duIHJlbGF0aW9uc2hpcHMgYW5kIHByb3BlcnRpZXMuICBXaGVuIGEgRGVzY3JpcHRvciBpcyBjcmVhdGVkIGl0IHNoYWxsIGJlIHByb3ZpZGVkIHdpdGggY29uZ3J1ZW50IGNvcGllcyBvZiB0aGUgcmVsYXRpb25zaGlwcyBkZWZpbmVkIGZvciB0aGUgcmVmZXJlbmNlZCBjb250ZW50IGVsZW1lbnQuICBIb3dldmVyLCBhIHVzZXIgY2FuIG1vZGlmeSB0aGVzZSByZWxhdGlvbnNoaXBzIGZvciB0aGUgcGFydGljdWxhciBwcm9jZXNzIHNpdHVhdGlvbiBmb3Igd2hpY2ggdGhlIGRlc2NyaXB0b3IgaGFzIGJlZW4gY3JlYXRlZC4gIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJEZXNjcmlwdG9yIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpc1N5bmNocm9uaXplZFdpdGhTb3VyY2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iYXR0cmlidXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9ImlzU3luY2hyb25pemVkV2l0aFNvdXJjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJEZXNjcmlwdG9yRGVzY3JpcHRpb24iIGVTdXBlclR5cGVzPSIjLy9CcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24iPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgZ2VuZXJhbGl6ZWQgQnJlYWtkb3duIEVsZW1lbnQgRGVzY3JpcHRpb24gdGhhdCBpcyB1c2VkIHRvIHN0b3JlIHRoZSB0ZXh0dWFsIGRlc2NyaXB0aW9uIGZvciBhIERlc2NyaXB0b3IuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJEZXNjcmlwdG9yRGVzY3JpcHRpb24iLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJlZmluZWREZXNjcmlwdGlvbiIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIERlc2NyaXB0b3IgbWlnaHQgYWRkIHJlZmluZW1lbnRzIHRvIHRoZSBtYWluIGRlc2NyaXB0aW9uIG9mIHRoZSBDb250ZW50IEVsZW1lbnQgaXQgcmVmZXJzIHRvLiAgRm9yIGV4YW1wbGUsIGl0IGNvdWxkIHByb3ZpZGUgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCBhIFdvcmsgUHJvZHVjdCByZWxldmFudCBmb3IgdGhlIHNwZWNpZmljIHBvaW50IGluIHRpbWUgaW4gdGhlIHByb2Nlc3MgdGhpcyBXb3JrIFByb2R1Y3QgdHlwZSBpcyBiZWluZyB1c2VkLiAgSXQgY291bGQgZGVzY3JpYmUgYWRkaXRpb25hbCBza2lsbHMgbmVlZGVkIGZvciBhIFJvbGUgYXQgdGhhdCBwYXJ0aWN1bGFyIHBvaW50IGluIHRpbWUgaW4gYSBwcm9jZXNzLCBldGMuICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJSZWZpbmVkRGVzY3JpcHRpb24iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRGlzY2lwbGluZSIgZVN1cGVyVHlwZXM9IiMvL0NvbnRlbnRDYXRlZ29yeSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBjYXRlZ29yaXphdGlvbiBvZiB3b3JrIChpLmUuIFRhc2tzIGZvciBNZXRob2QgQ29udGVudCksIGJhc2VkIHVwb24gc2ltaWxhcml0eSBvZiBjb25jZXJucyBhbmQgY29vcGVyYXRpb24gb2Ygd29yayBlZmZvcnQuJiN4RDsmI3hBO0EgZGlzY2lwbGluZSBpcyBhIGNvbGxlY3Rpb24gb2YgVGFza3MgdGhhdCBhcmUgcmVsYXRlZCB0byBhIG1ham9yICdhcmVhIG9mIGNvbmNlcm4nIHdpdGhpbiB0aGUgb3ZlcmFsbCBwcm9qZWN0LiBUaGUgZ3JvdXBpbmcgb2YgVGFza3MgaW50byBkaXNjaXBsaW5lcyBpcyBtYWlubHkgYW4gYWlkIHRvIHVuZGVyc3RhbmRpbmcgdGhlIHByb2plY3QgZnJvbSBhICd0cmFkaXRpb25hbCcgd2F0ZXJmYWxsIHBlcnNwZWN0aXZlLiBIb3dldmVyLCB0eXBpY2FsbHksIGZvciBleGFtcGxlLCBpdCBpcyBtb3JlIGNvbW1vbiB0byBwZXJmb3JtIGNlcnRhaW4gcmVxdWlyZW1lbnRzIGFjdGl2aXRpZXMgaW4gY2xvc2UgY29vcmRpbmF0aW9uIHdpdGggYW5hbHlzaXMgYW5kIGRlc2lnbiBhY3Rpdml0aWVzLiBTZXBhcmF0aW5nIHRoZXNlIGFjdGl2aXRpZXMgaW50byBzZXBhcmF0ZSBkaXNjaXBsaW5lcyBtYWtlcyB0aGUgYWN0aXZpdGllcyBlYXNpZXIgdG8gY29tcHJlaGVuZC4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkRpc2NpcGxpbmUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Imdyb3VwMiIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VGZWF0dXJlTWFwRW50cnkiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9Imdyb3VwIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Imdyb3VwOjI0Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InRhc2siIHVuaXF1ZT0iZmFsc2UiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIgdm9sYXRpbGU9InRydWUiCi0gICAgICAgIHRyYW5zaWVudD0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJUYXNrIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZ3JvdXAiIHZhbHVlPSIjZ3JvdXA6MjQiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ic3ViRGlzY2lwbGluZSIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9EaXNjaXBsaW5lIiB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIiBjb250YWlubWVudD0idHJ1ZSIKLSAgICAgICAgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlN1YkRpc2NpcGxpbmUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJncm91cCIgdmFsdWU9IiNncm91cDoyNCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyZWZlcmVuY2VXb3JrZmxvdyIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIgotICAgICAgICB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlJlZmVyZW5jZVdvcmtmbG93Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZ3JvdXAiIHZhbHVlPSIjZ3JvdXA6MjQiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRGlzY2lwbGluZUdyb3VwaW5nIiBlU3VwZXJUeXBlcz0iIy8vQ29udGVudENhdGVnb3J5Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJVc2VkIHRvIGdyb3VwIERpc2NpcGxpbmVzLiAgRm9yIGV4YW1wbGUsIHRoZSBEaXNjaXBsaW5lIEdyb3VwaW5nICZxdW90O1NvZnR3YXJlIERpc2NpcGxpbmVzJnF1b3Q7IHdvdWxkIGJlIHRoZSBncm91cCBvZiBhbGwgZGlzY2lwbGluZXMgcmVsYXRlZCB0byBkZXZlbG9waW5nIHNvZnR3YXJlIHN1Y2ggYXMgJnF1b3Q7UmVxdWlyZW1lbnRzIE1hbmFnZW1lbnQmcXVvdDsgb3IgJnF1b3Q7VGVzdGluZyZxdW90OzsgJnF1b3Q7SVQgSW5mcmFzdHJ1Y3R1cmUgTWFuYWdlbWVudCZxdW90OyB3b3VsZCBiZSBhIERpc2NpcGxpbmVzIEdyb3VwaW5nIGZvciBkaXNjaXBsaW5lcyBzdWNoIGFzICZxdW90O0lUIE9wZXJhdGlvbmFsIFNlcnZpY2VzJnF1b3Q7LCAmcXVvdDtJVCBDdXN0b21lciBSZWxhdGlvbnNoaXBzJnF1b3Q7LCBvciAmcXVvdDtJVCBFbmFibGluZyBTZXJ2aWNlcyZxdW90Oy4gIERpc2NpcGxpbmVzIGNhbiBiZSBhc3NvY2lhdGVkIHRvIG1vcmUgdGhhbiBvbmUgRGlzY2lwbGluZSBHcm91cGluZy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkRpc2NpcGxpbmVHcm91cGluZyIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZ3JvdXAyIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUZlYXR1cmVNYXBFbnRyeSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZ3JvdXAiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iZ3JvdXA6MjQiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZGlzY2lwbGluZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIgotICAgICAgICB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkRpc2NpcGxpbmUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJncm91cCIgdmFsdWU9IiNncm91cDoyNCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJEb2N1bWVudFJvb3QiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJtaXhlZCIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJtaXhlZCIgdW5pcXVlPSJmYWxzZSIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VGZWF0dXJlTWFwRW50cnkiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRXaWxkY2FyZCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSI6bWl4ZWQiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ieE1MTlNQcmVmaXhNYXAiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iZWNvcmU6RUNsYXNzIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nVG9TdHJpbmdNYXBFbnRyeSIKLSAgICAgICAgdHJhbnNpZW50PSJ0cnVlIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJhdHRyaWJ1dGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0ieG1sbnM6cHJlZml4Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InhTSVNjaGVtYUxvY2F0aW9uIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVDbGFzcyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZ1RvU3RyaW5nTWFwRW50cnkiCi0gICAgICAgIHRyYW5zaWVudD0idHJ1ZSIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iYXR0cmlidXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9InhzaTpzY2hlbWFMb2NhdGlvbiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJtZXRob2RDb25maWd1cmF0aW9uIiB1cHBlckJvdW5kPSItMiIKLSAgICAgICAgZVR5cGU9IiMvL01ldGhvZENvbmZpZ3VyYXRpb24iIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIGRlcml2ZWQ9InRydWUiCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIGNvbGxlY3Rpb24gb2Ygc2VsZWN0ZWQgTWV0aG9kIE1vZGVscyBhbmQgTWV0aG9kUGFja2FnZXMuIEEgY29uZmlndXJhdGlvbiBjYW4gYmUgZXhwb3J0ZWQgaW50byBpdHMgb3duIHN0YW5kYWxvbmUgbGlicmFyeSB3aGVuIGl0IGluY2x1ZGVzIHRoZSBmdWxsIHRyYW5zaXRpdmUgY2xvc3VyZSBvZiBhbGwgZWxlbWVudHMgYWxsIG90aGVyIGVsZW1lbnRzIGRlcGVuZCBvbi4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTWV0aG9kQ29uZmlndXJhdGlvbiIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im1ldGhvZExpYnJhcnkiIHVwcGVyQm91bmQ9Ii0yIgotICAgICAgICBlVHlwZT0iIy8vTWV0aG9kTGlicmFyeSIgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIgY29udGFpbm1lbnQ9InRydWUiCi0gICAgICAgIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgTWV0aG9kIExpYnJhcnkgaXMgYSBwaHlzaWNhbCBjb250YWluZXIgZm9yIE1ldGhvZCBQbHVnaW5zIGFuZCBNZXRob2QgQ29uZmlndXJhdGlvbiBkZWZpbml0aW9ucy4gIEFsbCBNZXRob2QgRWxlbWVudHMgYXJlIHN0b3JlZCBpbiBhIE1ldGhvZCBMaWJyYXJ5LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJNZXRob2RMaWJyYXJ5Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ibWV0aG9kUGx1Z2luIiB1cHBlckJvdW5kPSItMiIKLSAgICAgICAgZVR5cGU9IiMvL01ldGhvZFBsdWdpbiIgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIgY29udGFpbm1lbnQ9InRydWUiCi0gICAgICAgIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgc3BlY2lhbCBNZXRob2QgVW5pdCB0aGF0IHJlcHJlc2VudHMgYSBwaHlzaWNhbCBjb250YWluZXIgZm9yIE1ldGhvZCBQYWNrYWdlcy4gIEl0IGRlZmluZXMgYSBncmFudWxhcml0eSBsZXZlbCBmb3IgdGhlIG1vZHVsYXJpemF0aW9uIGFuZCBvcmdhbml6YXRpb24gb2YgbWV0aG9kIGNvbnRlbnQgYW5kIHByb2Nlc3Nlcy4gIEEgTWV0aG9kIFBsdWdpbiBjYW4gZXh0ZW5kIG1hbnkgb3RoZXIgTWV0aG9kIFBsdWdpbnMgYW5kIGl0IGNhbiBiZSBleHRlbmRlZCBieSBtYW55IE1ldGhvZCBQbHVnaW5zLiAgSXQgY2FuIGFsc28gYmUgdXNlZCBzdGFuZC1hbG9uZSwgaS5lLiB3aXRoIG5vIEV4dGVuc2lvbiByZWxhdGlvbnNoaXAgdG8gb3RoZXIgcGx1Zy1pbnMuJiN4RDsmI3hBO01ldGhvZCBQbHVnaW4gY29uY2VwdHVhbGx5IHJlcHJlc2VudHMgYSB1bml0IGZvciBjb25maWd1cmF0aW9uLCBtb2R1bGFyaXphdGlvbiwgZXh0ZW5zaW9uLCBwYWNrYWdpbmcsIGFuZCBkZXBsb3ltZW50IG9mIG1ldGhvZCBjb250ZW50IGFuZCBwcm9jZXNzZXMuICBBIFByb2Nlc3MgRW5naW5lZXIgc2hhbGwgZGVzaWduIGhpcyBQbHVnaW5zIGFuZCBhbGxvY2F0ZSBoaXMgY29udGVudCB0byB0aGVzZSBQbHVnaW5zIHdpdGggcmVxdWlyZW1lbnRzIGZvciBleHRlbnNpYmlsaXR5LCBtb2R1bGFyaXR5LCByZXVzZSwgYW5kIG1haW50YWluYWJpbGl0eSBpbiBtaW5kLiYjeEQ7JiN4QTtTcGVjaWFsIGV4dGVuc2liaWxpdHkgbWVjaGFuaXNtcyBkZWZpbmVkIGZvciB0aGUgbWV0YS1jbGFzc2VzIFZhcmlhYmlsaXR5IEVsZW1lbnQgYW5kIFByb2Nlc3MgQ29udHJpYnV0aW9uIGFsbG93IFBsdWdpbiBjb250ZW50IHRvIGRpcmVjdGx5IGNvbnRyaWJ1dGUgbmV3IGNvbnRlbnQsIHJlcGxhY2UgZXhpc3RpbmcgY29udGVudCwgb3IgdG8gY3Jvc3MtcmVmZXJlbmNlIHRvIGFueSBDb250ZW50IEVsZW1lbnQgb3IgUHJvY2VzcyB3aXRoaW4gYW5vdGhlciBQbHVnaW4gdGhhdCBpdCBleHRlbmRzLiAgU2ltaWxhciB0byBVTUwgMi4wJ3MgJ3BhY2thZ2UgbWVyZ2UnIG1lY2hhbmlzbSB0cmFuc2Zvcm1hdGlvbiBpbnRlcnByZXRhdGlvbnMsIGludGVycHJldGluZyB0aGVzZSBNZXRob2QgUGx1Z2luIG1lY2hhbmlzbXMgcmVzdWx0cyBpbnRvIG5ldyBleHRlbmRlZCBNZXRob2QgQ29udGVudCBhbmQgUHJvY2Vzc2VzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJNZXRob2RQbHVnaW4iLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJEb21haW4iIGVTdXBlclR5cGVzPSIjLy9Db250ZW50Q2F0ZWdvcnkiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgcmVmaW5lYWJsZSBoaWVyYXJjaHkgZ3JvdXBpbmcgcmVsYXRlZCB3b3JrIHByb2R1Y3RzLiAgSW4gb3RoZXIgd29yZHMsIERvbWFpbnMgY2FuIGJlIGZ1cnRoZXIgZGl2aWRlZCBpbnRvIHN1Yi1kb21haW5zLCB3aXRoIHdvcmsgcHJvZHVjdCBlbGVtZW50cyB0byBiZSBjYXRlZ29yaXplZCBvbmx5IGF0IHRoZSBsZWFmLWxldmVsIG9mIHRoaXMgaGllcmFyY2h5LiYjeEQ7JiN4QTtEb21haW4gaXMgYSBsb2dpY2FsIGdyb3VwaW5nIG9mIHdvcmsgcHJvZHVjdHMgdGhhdCBoYXZlIGFuIGFmZmluaXR5IHRvIGVhY2ggb3RoZXIgYmFzZWQgb24gcmVzb3VyY2VzLCB0aW1pbmcsIG9yIHJlbGF0aW9uc2hpcC4gIEEgRG9tYWluIG1heSBiZSBkaXZpZGVkIGludG8gc3ViZG9tYWlucy4gIEZvciBleGFtcGxlLCBHUyBNZXRob2QgdXNlcyBzaXggcHJlZGVmaW5lZCBEb21haW5zIGZvciBXb3JrIFByb2R1Y3RzOiBBcHBsaWNhdGlvbiwgQXJjaGl0ZWN0dXJlLCBCdXNpbmVzcywgRW5nYWdlbWVudCwgT3BlcmF0aW9ucyBhbmQgT3JnYW5pemF0aW9uLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRG9tYWluIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJncm91cDIiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FRmVhdHVyZU1hcEVudHJ5Ij4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJncm91cCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJncm91cDoyNCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ3b3JrUHJvZHVjdCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIgotICAgICAgICB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IldvcmtQcm9kdWN0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZ3JvdXAiIHZhbHVlPSIjZ3JvdXA6MjQiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ic3ViZG9tYWluIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL0RvbWFpbiIgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIgY29udGFpbm1lbnQ9InRydWUiCi0gICAgICAgIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJTdWJkb21haW4iLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJncm91cCIgdmFsdWU9IiNncm91cDoyNCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJFbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIFVNTCAyLjAgbWV0YS1jbGFzcyBFbGVtZW50LiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRWxlbWVudCIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZW1wdHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRXN0aW1hdGUiIGVTdXBlclR5cGVzPSIjLy9HdWlkYW5jZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBzcGVjaWZpYyB0eXBlIG9mIEd1aWRhbmNlIHRoYXQgcHJvdmlkZXMgc2l6aW5nIG1lYXN1cmVzLCBvciBzdGFuZGFyZHMgZm9yIHNpemluZyB0aGUgd29yayBlZmZvcnQgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgYSBwYXJ0aWN1bGFyIHBpZWNlIG9mIHdvcmsgYW5kIGluc3RydWN0aW9ucyBmb3IgdGhlaXIgc3VjY2Vzc2Z1bCB1c2UuIEl0IG1heSBiZSBjb21wcmlzZWQgb2YgZXN0aW1hdGlvbiBjb25zaWRlcmF0aW9ucyBhbmQgZXN0aW1hdGlvbiBtZXRyaWNzLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRXN0aW1hdGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Imdyb3VwMiIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VGZWF0dXJlTWFwRW50cnkiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9Imdyb3VwIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Imdyb3VwOjI0Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImVzdGltYXRpb25NZXRyaWMiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIKLSAgICAgICAgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJFc3RpbWF0aW9uTWV0cmljIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZ3JvdXAiIHZhbHVlPSIjZ3JvdXA6MjQiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIgotICAgICAgICB1bmlxdWU9ImZhbHNlIiB1cHBlckJvdW5kPSItMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciCi0gICAgICAgIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIGRlcml2ZWQ9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZ3JvdXAiIHZhbHVlPSIjZ3JvdXA6MjQiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRXN0aW1hdGluZ01ldHJpYyIgZVN1cGVyVHlwZXM9IiMvL0d1aWRhbmNlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIHNwZWNpZmljIHR5cGUgb2YgR3VpZGFuY2UgdGhhdCBkZXNjcmliZXMgYSBtZXRyaWMgb3IgbWVhc3VyZSB0aGF0IGlzIGFzc29jaWF0ZWQgd2l0aCBhbiBlbGVtZW50IGFuZCB3aGljaCBpcyB1c2VkIHRvIGNhbGN1bGF0ZSB0aGUgc2l6ZSBvZiB0aGUgd29yayBlZmZvcnQgYXMgd2VsbCBhcyBhIHJhbmdlIG9mIHBvdGVudGlhbCBsYWJvci4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkVzdGltYXRpbmdNZXRyaWMiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkVzdGltYXRpb25Db25zaWRlcmF0aW9ucyIgZVN1cGVyVHlwZXM9IiMvL0d1aWRhbmNlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIHNwZWNpZmljIHR5cGUgb2YgR3VpZGFuY2UgdGhhdCBxdWFsaWZpZXMgdGhlIHVzYWdlIGFuZCBhcHBsaWNhdGlvbiBvZiBlc3RpbWF0aW9uIG1ldHJpY3MgaW4gdGhlIGRldmVsb3BtZW50IG9mIGFuIGFjdHVhbCBlc3RpbWF0ZS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkVzdGltYXRpb25Db25zaWRlcmF0aW9ucyIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRXhhbXBsZSIgZVN1cGVyVHlwZXM9IiMvL0d1aWRhbmNlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIHNwZWNpZmljIHR5cGUgb2YgR3VpZGFuY2UgdGhhdCByZXByZXNlbnRzIGEgdHlwaWNhbCwgcGFydGlhbGx5IGNvbXBsZXRlZCwgc2FtcGxlIGluc3RhbmNlIG9mIG9uZSBvciBtb3JlIHdvcmsgcHJvZHVjdHMgb3Igc2NlbmFyaW8gbGlrZSBkZXNjcmlwdGlvbnMgb2YgaG93IFRhc2sgbWF5IGJlIHBlcmZvcm1lZC4gRXhhbXBsZXMgY2FuIGJlIHJlbGF0ZWQgdG8gV29yayBQcm9kdWN0cyBhcyB3ZWxsIGFzIFRhc2tzIHRoYXQgcHJvZHVjZSB0aGVtIGFzIHdlbGwgYXMgYW55IG90aGVyIENvbnRlbnQgRWxlbWVudC4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkV4YW1wbGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ikd1aWRhbmNlIiBlU3VwZXJUeXBlcz0iIy8vQ29udGVudEVsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9Ikd1aWRhbmNlIGlzIGFuIGFic3RyYWN0IGdlbmVyYWxpemF0aW9uIG9mIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVsYXRlZCB0byBjb250ZW50IGVsZW1lbnRzIHN1Y2ggYXMgUm9sZXMsIFRhc2tzLCBhbmQgV29yayBQcm9kdWN0cy4gIEV4YW1wbGVzIGZvciBHdWlkYW5jZSBhcmUgR3VpZGVsaW5lcywgVGVtcGxhdGVzLCBDaGVja2xpc3RzLCBUb29sIE1lbnRvcnMsIEVzdGltYXRlcywgU3VwcG9ydGluZyBNYXRlcmlhbHMsIFJlcG9ydHMsIENvbmNlcHRzLCBldGMuICBUaGlzIHBhY2thZ2Ugb25seSBjb250YWlucyB0aGUgZGVmaW5pdGlvbiBvZiB0aGUgYWJzdHJhY3QgR3VpZGFuY2UgY2xhc3MuICBUaGUgcGFja2FnZSBHdWlkYW5jZSBUeXBlcyBkZWZpbmVzIGNvbmNyZXRlIGd1aWRhbmNlIHR5cGVzLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iR3VpZGFuY2UiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ikd1aWRhbmNlRGVzY3JpcHRpb24iIGVTdXBlclR5cGVzPSIjLy9Db250ZW50RGVzY3JpcHRpb24iPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgZ2VuZXJhbGl6ZWQgQ29udGVudCBEZXNjcmlwdGlvbiB0aGF0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIHRleHR1YWwgZGVzY3JpcHRpb24gZm9yIGEgR3VpZGFuY2UuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJHdWlkYW5jZURlc2NyaXB0aW9uIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhdHRhY2htZW50IiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoaXMgZmllbGQgaXMgcHJpbWFyaWx5IHVzZWQgZm9yIGF0dGFjaG1lbnRzIGF1Z21lbnRpbmcgdGhlIGluZm9ybWF0aW9uIHByb3ZpZGVkIGZvciBndWlkYW5jZS4gIEluIHBhcnRpY3VsYXIgdGhlIGF0dHJpYnV0ZSBpcyB1c2VkIGZvciBUZW1wbGF0ZXMsIEV4YW1wbGVzLCBhbmQgUmV1c2FibGUgQXNzZXRzIHRvIGNvbnRhaW4gdGhlIGFjdHVhbCBhdHRhY2htZW50IGRlc2NyaWJlZCBpbiB0aGUgbWFpbkRlc2NyaXB0aW9uLiAgSXQgY2FuIGFkZGl0aW9uYWxseSBjb250YWluIHJlcHJlc2VudGF0aW9ucyBvZiB0aGUgZ3VpZGFuY2UgaW4ganVzdCBhIHRoaXJkIHBhcnR5IGZvcm1hdCwgZS5nLiBQREYsIE1TIFdvcmQsIG9yIFdvcmQgUGVyZmVjdC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQXR0YWNobWVudCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJHdWlkZWxpbmUiIGVTdXBlclR5cGVzPSIjLy9HdWlkYW5jZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBzcGVjaWZpYyB0eXBlIG9mIGd1aWRhbmNlIHRoYXQgcHJvdmlkZXMgYWRkaXRpb25hbCBkZXRhaWwgb24gaG93IHRvIHBlcmZvcm0gYSBwYXJ0aWN1bGFyIHRhc2sgb3IgZ3JvdXBpbmcgb2YgdGFza3MgKGUuZy4gZ3JvdXBlZCB0b2dldGhlciBhcyBhY3Rpdml0aWVzKSBvciB0aGF0IHByb3ZpZGVzIGFkZGl0aW9uYWwgZGV0YWlsLCBydWxlcywgYW5kIHJlY29tbWVuZGF0aW9ucyBvbiB3b3JrIHByb2R1Y3RzIGFuZCB0aGVpciBwcm9wZXJ0aWVzLiAgQW1vbmdzdCBvdGhlcnMsIGl0IGNhbiBpbmNsdWRlIGRldGFpbHMgYWJvdXQgYmVzdCBwcmFjdGljZXMgYW5kIGRpZmZlcmVudCBhcHByb2FjaGVzIGZvciBkb2luZyB3b3JrLCBob3cgdG8gdXNlIHBhcnRpY3VsYXIgdHlwZXMgb2Ygd29yayBwcm9kdWN0cywgaW5mb3JtYXRpb24gb24gZGlmZmVyZW50IHN1YnR5cGVzIGFuZCB2YXJpYW50cyBvZiB0aGUgd29yayBwcm9kdWN0IGFuZCBob3cgdGhleSBldm9sdmUgdGhyb3VnaG91dCBhIGxpZmVjeWNsZSwgZGlzY3Vzc2lvbnMgb24gc2tpbGxzIHRoZSBwZXJmb3JtaW5nIHJvbGVzIHNob3VsZCBhY3F1aXJlIG9yIGltcHJvdmUgdXBvbiwgbWVhc3VyZW1lbnRzIGZvciBwcm9ncmVzcyBhbmQgbWF0dXJpdHksIGV0Yy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ikd1aWRlbGluZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iSXRlcmF0aW9uIiBlU3VwZXJUeXBlcz0iIy8vQWN0aXZpdHkiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgc3BlY2lhbCBBY3Rpdml0eSB3aGljaCBwcmVzY3JpYmVzIHByZS1kZWZpbmVkIHZhbHVlcyBmb3IgaXRzIGluc3RhbmNlcyBmb3IgdGhlIGF0dHJpYnV0ZXMgcHJlZml4ICgnSXRlcmF0aW9uJykgYW5kIGlzUmVwZWF0YWJsZSAoJ1RydWUnKS4gIEl0IGhhcyBiZWVuIGluY2x1ZGVkIGludG8gdGhlIG1ldGEtbW9kZWwgZm9yIGNvbnZlbmllbmNlIGFuZCB0byBwcm92aWRlIGEgc3BlY2lhbCBzdGVyZW90eXBlLCBiZWNhdXNlIGl0IHJlcHJlc2VudHMgYSB2ZXJ5IGNvbW1vbmx5IHVzZWQgQWN0aXZpdHkgdHlwZS4mI3hEOyYjeEE7SXRlcmF0aW9uIGdyb3VwcyBhIHNldCBvZiBuZXN0ZWQgQWN0aXZpdGllcyB0aGF0IGFyZSByZXBlYXRlZCBtb3JlIHRoYW4gb25jZS4gIEl0IHJlcHJlc2VudHMgYW4gaW1wb3J0YW50IHN0cnVjdHVyaW5nIGVsZW1lbnQgdG8gb3JnYW5pemUgd29yayBpbiByZXBldGl0aXZlIGN5Y2xlcy4gIFRoZSBjb25jZXB0IG9mIEl0ZXJhdGlvbiBjYW4gYmUgYXNzb2NpYXRlZCB3aXRoIGRpZmZlcmVudCBydWxlcyBpbiBkaWZmZXJlbnQgbWV0aG9kcy4gIEZvciBleGFtcGxlLCB0aGUgSUJNIFJhdGlvbmFsIFVuaWZpZWQgUHJvY2VzcyBtZXRob2QgZnJhbWV3b3JrIChSVVApIGRlZmluZXMgYSBydWxlIHRoYXQgSXRlcmF0aW9ucyBhcmUgbm90IGFsbG93ZWQgdG8gc3BhbiBhY3Jvc3MgUGhhc2VzLiAgSW4gY29udHJhc3QgSUJNIEdsb2JhbCBTZXJ2aWNlcyBNZXRob2QgKEdTTWV0aG9kKSBiYXNlZCBtZXRob2QgZnJhbWV3b3JrcyB0aGlzIHJ1bGUgZG9lcyBub3QgYXBwbHkgYW5kIEl0ZXJhdGlvbiBjYW4gYmUgZGVmaW5lZCB3aGljaCBuZXN0IFBoYXNlcy4gIFJ1bGVzIGxpa2UgdGhlc2UsIHdoaWNoIHBsYXkgYW4gaW1wb3J0YW50IHJvbGUgZm9yIGVhY2ggaW5kaXZpZHVhbCBtZXRob2QgYW5kIGFyZSB0aGVyZWZvcmUgbm90IGVuZm9yY2VkIGJ5IHRoaXMgbWV0YS1tb2RlbC4gIEluc3RlYWQsIHByb2Nlc3MgYXV0aG9ycyBhcmUgZXhwZWN0ZWQgdG8gZm9sbG93IGFuZCBjaGVjayB0aGVzZSBydWxlcyBtYW51YWxseS4gIChOb3RlOiBBbnkgQnJlYWtkb3duIEVsZW1lbnQgY2FuIGJlIHJlcGVhdGVkOyBob3dldmVyLCBJdGVyYXRpb25zIGhhcyBiZWVuIGludHJvZHVjZWQgYXMgYSBzcGVjaWFsIG1ldGEtbW9kZWwgY29uY2VwdCwgYmVjYXVzZSBvZiBpdHMgaW1wb3J0YW50IHJvbGUgZm9yIG1hbnkgbWV0aG9kcy4pIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJJdGVyYXRpb24iLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IktpbmQiIGVTdXBlclR5cGVzPSIjLy9Db250ZW50RWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJLaW5kIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhcHBsaWNhYmxlTWV0YUNsYXNzSW5mbyIKLSAgICAgICAgdW5pcXVlPSJmYWxzZSIgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ik1ldGhvZENvbmZpZ3VyYXRpb24iIGVTdXBlclR5cGVzPSIjLy9NZXRob2RVbml0Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIGNvbGxlY3Rpb24gb2Ygc2VsZWN0ZWQgTWV0aG9kIE1vZGVscyBhbmQgTWV0aG9kUGFja2FnZXMuIEEgY29uZmlndXJhdGlvbiBjYW4gYmUgZXhwb3J0ZWQgaW50byBpdHMgb3duIHN0YW5kYWxvbmUgbGlicmFyeSB3aGVuIGl0IGluY2x1ZGVzIHRoZSBmdWxsIHRyYW5zaXRpdmUgY2xvc3VyZSBvZiBhbGwgZWxlbWVudHMgYWxsIG90aGVyIGVsZW1lbnRzIGRlcGVuZCBvbi4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik1ldGhvZENvbmZpZ3VyYXRpb24iLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImJhc2VDb25maWd1cmF0aW9uIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQmFzZUNvbmZpZ3VyYXRpb24iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibWV0aG9kUGx1Z2luU2VsZWN0aW9uIgotICAgICAgICB1bmlxdWU9ImZhbHNlIiB1cHBlckJvdW5kPSItMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTWV0aG9kUGx1Z2luU2VsZWN0aW9uIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im1ldGhvZFBhY2thZ2VTZWxlY3Rpb24iCi0gICAgICAgIHVuaXF1ZT0iZmFsc2UiIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJNZXRob2RQYWNrYWdlU2VsZWN0aW9uIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImRlZmF1bHRWaWV3IiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJEZWZhdWx0VmlldyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwcm9jZXNzVmlldyIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlByb2Nlc3NWaWV3Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InN1YnRyYWN0ZWRDYXRlZ29yeSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlN1YnRyYWN0ZWRDYXRlZ29yeSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhZGRlZENhdGVnb3J5IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQWRkZWRDYXRlZ29yeSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJNZXRob2RFbGVtZW50IiBlU3VwZXJUeXBlcz0iIy8vUGFja2FnZWFibGVFbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgcm9vdCBnZW5lcmFsaXphdGlvbiBmb3IgYWxsIFVNQSBNZXRob2QgRWxlbWVudHMuICBEZWZpbmVzIGEgY29tbW9uIHNldCBvZiBhdHRyaWJ1dGVzIGluaGVyaXRlZCBieSBhbGwgVU1BIE1ldGhvZCBFbGVtZW50cy4gIE1ldGhvZCBFbGVtZW50IGl0c2VsZiBpcyBkZXJpdmVkIGZyb20gUGFja2FnZWFibGUgRWxlbWVudCBmcm9tIHRoZSBVTUwgMi4wIEluZnJhc3RydWN0dXJlLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTWV0aG9kRWxlbWVudCIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZ3JvdXAiIHVuaXF1ZT0iZmFsc2UiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FRmVhdHVyZU1hcEVudHJ5Ij4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJncm91cCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJncm91cDoxIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im93bmVkUnVsZSIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9Db25zdHJhaW50IiB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIiBjb250YWlubWVudD0idHJ1ZSIKLSAgICAgICAgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRGVmaW5lcyB0aGUgcGFja2FnaW5nIHJ1bGVzIGZvciB0aGlzIE1ldGhvZCBFbGVtZW50LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJPd25lZFJ1bGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJncm91cCIgdmFsdWU9IiNncm91cDoxIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im1ldGhvZEVsZW1lbnRQcm9wZXJ0eSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9NZXRob2RFbGVtZW50UHJvcGVydHkiIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiCi0gICAgICAgIGRlcml2ZWQ9InRydWUiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTWV0aG9kRWxlbWVudFByb3BlcnR5Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZ3JvdXAiIHZhbHVlPSIjZ3JvdXA6MSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJicmllZkRlc2NyaXB0aW9uIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkV2ZXJ5IGluc3RhbmNlIG9mIE1ldGhvZCBFbGVtZW50IHNoYWxsIGJlIGJyaWVmbHkgZGVzY3JpYmVkIHdpdGggb25lIG9yIHR3byBzZW50ZW5jZXMgc3VtbWFyaXppbmcgdGhlIGVsZW1lbnQuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJhdHRyaWJ1dGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iYnJpZWZEZXNjcmlwdGlvbiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpZCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJFdmVyeSBpbnN0YW5jZSBvZiBNZXRob2QgRWxlbWVudCBoYXMgYSBnbG9iYWwgdW5pcXVlIGlkLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iYXR0cmlidXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9ImlkIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im9yZGVyaW5nR3VpZGUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVXNlZCBmb3IgQ0FTRSB0b29sIHJlYWxpemF0aW9ucyBvZiB0aGlzIG1vZGVsIHRvIGNvbnRhaW4gaW5mb3JtYXRpb24gYWJvdXQgbGF5b3V0IGFuZCBvcmRlcmluZyBvZiB0aGUgbWV0aG9kIGVsZW1lbnQgYW5kIGl0cyBwYXJ0cy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImF0dHJpYnV0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJvcmRlcmluZ0d1aWRlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InByZXNlbnRhdGlvbk5hbWUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRXZlcnkgRGVzY3JpYmFibGUgRWxlbWVudCBoYXMgYSBwcmVzZW50YXRpb24gbmFtZSwgd2hpY2ggaXMgdXNlZCBmb3IgZXh0ZXJuYWwgcHJlc2VudGF0aW9uIG9mIHRoZSBlbGVtZW50LiAgRm9yIGV4YW1wbGUsIG5hbWUgKHRoZSBpbnRlcm5hbCByZXByZXNlbnRhdGlvbikgbWlnaHQgYmUgc2V0IHRvICZxdW90O3J1cF9hcmNoaXRlY3R1cmVfZG9jdW1lbnQmcXVvdDsgdG8gZGlmZmVyZW50aWF0ZSBmcm9tIGEgJnF1b3Q7ajJlZV9hcmNoaXRjdHVyZV9kb2N1bWVudCZxdW90OyB3aGVyZWFzIHRoZSBleHRlcm5hbCBwcmVzZW50YXRpb24gd291bGQgYWx3YXlzIGJlICZxdW90O0FyY2hpdGVjdHVyZSBEb2N1bWVudCZxdW90Oy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImF0dHJpYnV0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJwcmVzZW50YXRpb25OYW1lIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InN1cHByZXNzZWQiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IklmIGEgVmFyaWFiaWxpdHkgRWxlbWVudCBpcyBkZXJpdmVkIGZyb20gYW5vdGhlciBWYXJpYWJpbGl0eSBFbGVtZW50IHVzaW5nIHRoZSAmcXVvdDtleHRlbmRzJnF1b3Q7IFZhcmlhYmlsaXR5IFNwZWNpYWxpemF0aW9uLCB0aGVuIHRoaXMgYXR0cmlidXRlIGNhbiBiZSB1c2VkIHRvIHN1cHByZXNzIGluaGVyaXRlZCBNZXRob2QgRWxlbWVudHMgdGhhdCB3ZXJlIHBhcnQgb2YgdGhlIGJhc2VkLW9uIFZhcmlhYmlsaXR5IEVsZW1lbnQsIHdoaWNoIGNhbiBiZSBhbnkgdHlwZSBvZiBNZXRob2QgRWxlbWVudC4gIEluIG90aGVyIHdvcmRzLCBpZiB0aGlzIGF0dHJpYnV0ZSBpcyBzZXQgdG8gdHJ1ZSBvbiBhIE1ldGhvZCBFbGVtZW50IHRoYXQgaGFzIHRoZSBzYW1lIG5hbWUgdGhhbiBhbiBpbmhlcml0ZWQgbWV0aG9kIGVsZW1lbnQgdGhlbiBpdCB3aWxsIG5vdCBiZSByZWdhcmRlZCBhcyBpbmhlcml0ZWQgYXQgYWxsLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iYXR0cmlidXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9InN1cHByZXNzZWQiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iTWV0aG9kRWxlbWVudFByb3BlcnR5IiBlU3VwZXJUeXBlcz0iIy8vUGFja2FnZWFibGVFbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik1ldGhvZEVsZW1lbnRQcm9wZXJ0eSIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZW1wdHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idmFsdWUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJhdHRyaWJ1dGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0idmFsdWUiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iTWV0aG9kTGlicmFyeSIgZVN1cGVyVHlwZXM9IiMvL01ldGhvZFVuaXQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgTWV0aG9kIExpYnJhcnkgaXMgYSBwaHlzaWNhbCBjb250YWluZXIgZm9yIE1ldGhvZCBQbHVnaW5zIGFuZCBNZXRob2QgQ29uZmlndXJhdGlvbiBkZWZpbml0aW9ucy4gIEFsbCBNZXRob2QgRWxlbWVudHMgYXJlIHN0b3JlZCBpbiBhIE1ldGhvZCBMaWJyYXJ5LiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTWV0aG9kTGlicmFyeSIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ibWV0aG9kUGx1Z2luIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL01ldGhvZFBsdWdpbiIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJNZXRob2RQbHVnaW4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ibWV0aG9kQ29uZmlndXJhdGlvbiIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9NZXRob2RDb25maWd1cmF0aW9uIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik1ldGhvZENvbmZpZ3VyYXRpb24iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idG9vbCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdG9vbCB0aGF0IGdlbmVyYXRlZCB0aGUgWE1MIGZpbGUuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJhdHRyaWJ1dGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0idG9vbCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJNZXRob2RQYWNrYWdlIiBlU3VwZXJUeXBlcz0iIy8vTWV0aG9kRWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQW4gYWJzdHJhY3QgY2xhc3MgZm9yIHBhY2thZ2luZyBNZXRob2QgRWxlbWVudHMuICBBbGwgTWV0aG9kIEVsZW1lbnRzIHNoYWxsIGJlIGxvY2F0ZWQgaW4gZXhhY3RseSBvbmUgb2YgTWV0aG9kIFBhY2thZ2UncyBjb25jcmV0ZSBzcGVjaWFsaXphdGlvbnMgKGUuZy4gQ29udGVudCBQYWNrYWdlKS4gICBNZXRob2QgUGFja2FnZSBkZWZpbmVzIGNvbW1vbiBwcm9wZXJ0aWVzIGZvciBhbGwgb2YgaXRzIHNwZWNpYWxpemF0aW9ucy4gRWxlbWVudHMgYXJlIG9yZ2FuaXplZCBpbiBNZXRob2QgUGFja2FnZXMgdG8gc3RydWN0dXJlIGxhcmdlIHNjYWxlIG9mIG1ldGhvZCBjb250ZW50IGFuZCBwcm9jZXNzZXMgYXMgd2VsbCBhcyB0byBkZWZpbmUgYSBtZWNoYW5pc20gZm9yIHJldXNlLiAgTWV0aG9kIEVsZW1lbnRzIGZyb20gb25lIHBhY2thZ2UgY2FuIHJldXNlIGVsZW1lbnQgZnJvbSBvdGhlciBwYWNrYWdlcyBieSBkZWZpbmluZyBhIHJldXNlZFBhY2thZ2VzIGxpbmsuICBGb3IgZXhhbXBsZSwgYSB3b3JrIHByb2R1Y3QgZGVmaW5lZCBpbiBvbmUgcGFja2FnZSBjYW4gYmUgdXNlZCBhcyBhbiBpbnB1dCBmb3IgVGFza3MgZGVmaW5lZCBpbiBvdGhlciBwYWNrYWdlcy4gIEJ5IHJldXNpbmcgaXQgZnJvbSBvbmUgY29tbW9uIHBsYWNlIChpLmUuIHRoZSBwYWNrYWdlIGluIHdoaWNoIGl0IGhhcyBiZWVuIGRlZmluZWQpIGVuc3VyZXMgdGhhdCBubyByZWR1bmRhbnQgZGVmaW5pdGlvbnMgb2YgdGhlIHNhbWUgZWxlbWVudHMgYXJlIHJlcXVpcmVkLiAgQWxzbyBtYWludGVuYW5jZSBvZiBtZXRob2QgY29udGVudCBpcyBncmVhdGx5IGltcHJvdmVkIGFzIGNoYW5nZXMgY2FuIGJlIHBlcmZvcm1lZCBpbiBvbmx5IG9uZSBwbGFjZS4gIE5vdGUsIHRoYXQgb3RoZXIgcGFja2FnZXMgd2lsbCBpbnRyb2R1Y2UgbW9yZSBzcGVjaWFsaXphdGlvbnMgb2YgTWV0aG9kIFBhY2thZ2UsIGUuZy4gUHJvY2VzcyBQYWNrYWdlIGFuZCBQcm9jZXNzIENvbXBvbmVudC4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik1ldGhvZFBhY2thZ2UiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Imdyb3VwMSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VGZWF0dXJlTWFwRW50cnkiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9Imdyb3VwIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Imdyb3VwOjkiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmV1c2VkUGFja2FnZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIgotICAgICAgICB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlJldXNlZFBhY2thZ2UiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJncm91cCIgdmFsdWU9IiNncm91cDo5Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im1ldGhvZFBhY2thZ2UiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vTWV0aG9kUGFja2FnZSIgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIgY29udGFpbm1lbnQ9InRydWUiCi0gICAgICAgIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJNZXRob2RQYWNrYWdlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZ3JvdXAiIHZhbHVlPSIjZ3JvdXA6OSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJnbG9iYWwiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9Ik1ldGhvZCBQYWNrYWdlcyBjYW4gaGF2ZSBhIGdsb2JhbCBzY29wZS4gIFRoaXMgbWVhbnMgdGhhdCBldmVyeSBlbGVtZW50IG9mIGV2ZXJ5IG90aGVyIE1ldGhvZCBQYWNrYWdlIGNhbiBzZWUgdGhlIGdsb2JhbCBwYWNrYWdlJ3MgY29udGVudHMuICBHbG9iYWwgTWV0aG9kIFBhY2thZ2VzIGFyZSBwcmltYXJpbHkgdXNlZCB0byBzdG9yZSBjb21tb25seSB1c2VkIGNhdGVnb3J5IGRlZmluaXRpb25zIHN1Y2ggYXMgZm9yIERpc2NpcGxpbmVzIG9yIERvbWFpbnMsIHdoaWNoIGFyZSB1c2VkIGJ5IG1hbnkgVGFzayBhbmQgV29yayBQcm9kdWN0cyByZXNwZWN0aXZlbHkuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJhdHRyaWJ1dGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iZ2xvYmFsIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ik1ldGhvZFBsdWdpbiIgZVN1cGVyVHlwZXM9IiMvL01ldGhvZFVuaXQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgc3BlY2lhbCBNZXRob2QgVW5pdCB0aGF0IHJlcHJlc2VudHMgYSBwaHlzaWNhbCBjb250YWluZXIgZm9yIE1ldGhvZCBQYWNrYWdlcy4gIEl0IGRlZmluZXMgYSBncmFudWxhcml0eSBsZXZlbCBmb3IgdGhlIG1vZHVsYXJpemF0aW9uIGFuZCBvcmdhbml6YXRpb24gb2YgbWV0aG9kIGNvbnRlbnQgYW5kIHByb2Nlc3Nlcy4gIEEgTWV0aG9kIFBsdWdpbiBjYW4gZXh0ZW5kIG1hbnkgb3RoZXIgTWV0aG9kIFBsdWdpbnMgYW5kIGl0IGNhbiBiZSBleHRlbmRlZCBieSBtYW55IE1ldGhvZCBQbHVnaW5zLiAgSXQgY2FuIGFsc28gYmUgdXNlZCBzdGFuZC1hbG9uZSwgaS5lLiB3aXRoIG5vIEV4dGVuc2lvbiByZWxhdGlvbnNoaXAgdG8gb3RoZXIgcGx1Zy1pbnMuJiN4RDsmI3hBO01ldGhvZCBQbHVnaW4gY29uY2VwdHVhbGx5IHJlcHJlc2VudHMgYSB1bml0IGZvciBjb25maWd1cmF0aW9uLCBtb2R1bGFyaXphdGlvbiwgZXh0ZW5zaW9uLCBwYWNrYWdpbmcsIGFuZCBkZXBsb3ltZW50IG9mIG1ldGhvZCBjb250ZW50IGFuZCBwcm9jZXNzZXMuICBBIFByb2Nlc3MgRW5naW5lZXIgc2hhbGwgZGVzaWduIGhpcyBQbHVnaW5zIGFuZCBhbGxvY2F0ZSBoaXMgY29udGVudCB0byB0aGVzZSBQbHVnaW5zIHdpdGggcmVxdWlyZW1lbnRzIGZvciBleHRlbnNpYmlsaXR5LCBtb2R1bGFyaXR5LCByZXVzZSwgYW5kIG1haW50YWluYWJpbGl0eSBpbiBtaW5kLiYjeEQ7JiN4QTtTcGVjaWFsIGV4dGVuc2liaWxpdHkgbWVjaGFuaXNtcyBkZWZpbmVkIGZvciB0aGUgbWV0YS1jbGFzc2VzIFZhcmlhYmlsaXR5IEVsZW1lbnQgYW5kIFByb2Nlc3MgQ29udHJpYnV0aW9uIGFsbG93IFBsdWdpbiBjb250ZW50IHRvIGRpcmVjdGx5IGNvbnRyaWJ1dGUgbmV3IGNvbnRlbnQsIHJlcGxhY2UgZXhpc3RpbmcgY29udGVudCwgb3IgdG8gY3Jvc3MtcmVmZXJlbmNlIHRvIGFueSBDb250ZW50IEVsZW1lbnQgb3IgUHJvY2VzcyB3aXRoaW4gYW5vdGhlciBQbHVnaW4gdGhhdCBpdCBleHRlbmRzLiAgU2ltaWxhciB0byBVTUwgMi4wJ3MgJ3BhY2thZ2UgbWVyZ2UnIG1lY2hhbmlzbSB0cmFuc2Zvcm1hdGlvbiBpbnRlcnByZXRhdGlvbnMsIGludGVycHJldGluZyB0aGVzZSBNZXRob2QgUGx1Z2luIG1lY2hhbmlzbXMgcmVzdWx0cyBpbnRvIG5ldyBleHRlbmRlZCBNZXRob2QgQ29udGVudCBhbmQgUHJvY2Vzc2VzLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTWV0aG9kUGx1Z2luIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyZWZlcmVuY2VkTWV0aG9kUGx1Z2luIgotICAgICAgICB1bmlxdWU9ImZhbHNlIiB1cHBlckJvdW5kPSItMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUmVmZXJlbmNlZE1ldGhvZFBsdWdpbiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJtZXRob2RQYWNrYWdlIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL01ldGhvZFBhY2thZ2UiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTWV0aG9kUGFja2FnZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ1c2VyQ2hhbmdlYWJsZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJhdHRyaWJ1dGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0idXNlckNoYW5nZWFibGUiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iTWV0aG9kVW5pdCIgZVN1cGVyVHlwZXM9IiMvL01ldGhvZEVsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgc3BlY2lhbCBNZXRob2QgRWxlbWVudCB0aGF0IHNoYWxsIGJlIG1haW50YWluZWQgaW4gYSBNZXRob2QgTGlicmFyeSBhcyBhIHNlcGFyYXRlIHVuaXQgb2YgY29udHJvbC4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik1ldGhvZFVuaXQiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNvcHlyaWdodCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ29weXJpZ2h0Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImF1dGhvcnMiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRXZlcnkgTWV0aG9kIFVuaXQgaXMgYmVpbmcgY3JlYXRlZCBhbmQgb3duZWQgYnkgYW4gYXV0aG9yIG9yIGF1dGhvcmluZyB0ZWFtLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iYXR0cmlidXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9ImF1dGhvcnMiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY2hhbmdlRGF0ZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EYXRlVGltZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBkYXRlIHRoZSBsYXN0IGNoYW5nZSB0aGF0IHJlc3VsdGVkIGludG8gdGhpcyB2ZXJzaW9uIGhhcyBiZWVuIG1hZGUuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJhdHRyaWJ1dGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iY2hhbmdlRGF0ZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjaGFuZ2VEZXNjcmlwdGlvbiIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZGVzY3JpcHRpb24gb2YgdGhlIGxhc3QgY2hhbmdlIHRoYXQgcmVzdWx0ZWQgaW50byB0aGlzIHZlcnNpb24uIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJhdHRyaWJ1dGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iY2hhbmdlRGVzY3JpcHRpb24iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idmVyc2lvbiIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJFdmVyeSBQYWNrYWdlIGhhcyBhIHZlcnNpb24gbnVtYmVyIHVzZWQgdG8gdHJhY2sgY2hhbmdlcy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImF0dHJpYnV0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJ2ZXJzaW9uIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ik1pbGVzdG9uZSIgZVN1cGVyVHlwZXM9IiMvL1dvcmtCcmVha2Rvd25FbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIHNwZWNpYWwgQnJlYWtkb3duIEVsZW1lbnQgdGhhdCBkZXNjcmliZXMgYSBzaWduaWZpY2FudCBldmVudCBpbiBhIGRldmVsb3BtZW50IHByb2plY3QsIHN1Y2ggYXMgYSBtYWpvciBkZWNpc2lvbiwgY29tcGxldGlvbiBvZiBhIGRlbGl2ZXJhYmxlLCBvciBtZWV0aW5nIG9mIGEgbWFqb3IgZGVwZW5kZW5jeSAobGlrZSBjb21wbGV0aW9uIG9mIGEgcHJvamVjdCBwaGFzZSkuICBCZWNhdXNlLCBNaWxlc3RvbmUgaXMgY29tbW9ubHkgdXNlZCB0byByZWZlciB0byBib3RoIHRoZSBldmVudCBpdHNlbGYgYW5kIHRoZSBwb2ludCBpbiB0aW1lIGF0IHdoaWNoIHRoZSBldmVudCBpcyBzY2hlZHVsZWQgdG8gaGFwcGVuLCBpdCBpcyBtb2RlbGVkIGFzIGEgQnJlYWtkb3duIEVsZW1lbnQgKGkuZS4gaXQgYXBwZWFycyBhcyBwYXJ0IG9mIGEgYnJlYWtkb3duIHN0cnVjdHVyZSkuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJNaWxlc3RvbmUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJlcXVpcmVkUmVzdWx0IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUmVxdWlyZWRSZXN1bHQiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iTmFtZWRFbGVtZW50IiBlU3VwZXJUeXBlcz0iIy8vRWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBVTUwgMi4wIG1ldGEtY2xhc3MgTmFtZWQgRWxlbWVudC4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik5hbWVkRWxlbWVudCIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZW1wdHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibmFtZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImF0dHJpYnV0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJuYW1lIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ik91dGNvbWUiIGVTdXBlclR5cGVzPSIjLy9Xb3JrUHJvZHVjdCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBXb3JrIFByb2R1Y3QgdGhhdCBkZXNjcmliZXMgaW50YW5naWJsZSB3b3JrIHByb2R1Y3RzIHRoYXQgYXJlIGEgcmVzdWx0IG9yIHN0YXRlLiBPdXRjb21lcyBtYXkgYWxzbyBiZSB1c2VkIHRvIGRlc2NyaWJlIHdvcmsgcHJvZHVjdHMgdGhhdCBhcmUgbm90IGZvcm1hbGx5IGRlZmluZWQuICBBIGtleSBkaWZmZXJlbnRpYXRvciBmb3Igb3V0Y29tZXMgYWdhaW5zdCBhcnRpZmFjdHMgaXMgdGhhdCBvdXRjb21lcyBhcmUgbm90IGNhbmRpZGF0ZXMgZm9yIGhhcnZlc3RpbmcgYXMgcmV1c2FibGUgYXNzZXRzLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iT3V0Y29tZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUGFja2FnZWFibGVFbGVtZW50IiBlU3VwZXJUeXBlcz0iIy8vTmFtZWRFbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIFVNTCAyLjAgbWV0YS1jbGFzcyBQYWNrYWdhYmxlIEVsZW1lbnQuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJQYWNrYWdlYWJsZUVsZW1lbnQiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVtcHR5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlBoYXNlIiBlU3VwZXJUeXBlcz0iIy8vQWN0aXZpdHkiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgc3BlY2lhbCBBY3Rpdml0eSB3aGljaCBwcmVzY3JpYmVzIHByZS1kZWZpbmVkIHZhbHVlcyBmb3IgaXRzIGluc3RhbmNlcyBmb3IgdGhlIGF0dHJpYnV0ZXMgcHJlZml4ICgnUGhhc2UnKSBhbmQgaXNSZXBlYXRhYmxlICgnRmFsc2UnKS4gIEl0IGhhcyBiZWVuIGluY2x1ZGVkIGludG8gdGhlIG1ldGEtbW9kZWwgZm9yIGNvbnZlbmllbmNlIGFuZCB0byBwcm92aWRlIGEgc3BlY2lhbCBzdGVyZW90eXBlLCBiZWNhdXNlIGl0IHJlcHJlc2VudHMgYSB2ZXJ5IGNvbW1vbmx5IHVzZWQgQWN0aXZpdHkgdHlwZS4mI3hEOyYjeEE7UGhhc2UgcmVwcmVzZW50IGEgc2lnbmlmaWNhbnQgcGVyaW9kIGluIGEgcHJvamVjdCwgZW5kaW5nIHdpdGggbWFqb3IgbWFuYWdlbWVudCBjaGVja3BvaW50LCBtaWxlc3RvbmUgb3Igc2V0IG9mIERlbGl2ZXJhYmxlcy4gIEl0IGlzIGluY2x1ZGVkIGluIHRoZSBtb2RlbCBhcyBhIHByZWRlZmluZWQgc3BlY2lhbCBBY3Rpdml0eSwgYmVjYXVzZSBvZiBpdHMgc2lnbmlmaWNhbmNlIGluIGRlZmluaW5nIGJyZWFrZG93bnMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJQaGFzZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUGxhbm5pbmdEYXRhIiBlU3VwZXJUeXBlcz0iIy8vUHJvY2Vzc0VsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgUHJvY2VzcyBFbGVtZW50IHRoYXQgYWRkcyBwbGFubmluZyBkYXRhIHRvIEJyZWFrZG93biBFbGVtZW50cyB3aGVuIGl0IGlzIHVzZWQgZm9yIGEgUHJvY2VzcyBQbGFubmluZyBUZW1wbGF0ZS4gIEZvciBEZWxpdmVyeSBQcm9jZXNzZXMgYW5kIENhcGFiaWxpdHkgUGF0dGVybnMgdGhpcyBjbGFzcyBjYW4gZWl0aGVyIG5vdCBiZSBpbnN0YW50aWF0ZWQgb3IgcG9wdWxhdGVkIHdpdGggZGVmYXVsdCBkYXRhLiYjeEQ7JiN4QTtQbGFubmluZyBEYXRhIGZhY3RvcnMgb3V0IHNwZWNpZmljIG9wdGlvbmFsIGRhdGEgbmVlZGVkIGZvciByZXByZXNlbnRpbmcgcGxhbm5pbmcgdGVtcGxhdGVzLiAgVGhpcyBhc3NvY2lhdGlvbiBhbGxvd3MgdG8gYWNjZXNzIHBsYW5uaW5nIGRhdGEgaWYgaXQgaXMgc3RvcmVkIGZvciB0aGUgQnJlYWtkb3duIEVsZW1lbnQuJiN4RDsmI3hBOyhOT1RFLCBUSEUgQVRUUklCVVRFUyBGT1IgVEhJUyBDTEFTUyBBUkUgTk9UIENPTVBMRVRFLCBZRVQpIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJQbGFubmluZ0RhdGEiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImZpbmlzaERhdGUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGF0ZVRpbWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZGVmYXVsdCBmaW5pc2ggZGF0ZSBmb3IgYSBwbGFuZWQgVGFzay4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImF0dHJpYnV0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJmaW5pc2hEYXRlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJhbmsiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGRlZmF1bHQgcmFuayBmb3IgYSBwbGFuZWQgVGFzay4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImF0dHJpYnV0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJyYW5rIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InN0YXJ0RGF0ZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EYXRlVGltZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBkZWZhdWx0IHN0YXJ0IGRhdGUgZm9yIGEgcGxhbmVkIFRhc2suIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJhdHRyaWJ1dGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0ic3RhcnREYXRlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlByYWN0aWNlIiBlU3VwZXJUeXBlcz0iIy8vR3VpZGFuY2UiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgc3BlY2lmaWMgdHlwZSBvZiBndWlkYW5jZSB0aGF0IHJlcHJlc2VudHMgYSBwcm92ZW4gd2F5IG9yIHN0cmF0ZWd5IG9mIGRvaW5nIHdvcmsgdG8gYWNoaWV2ZSBhIGdvYWwgdGhhdCBoYXMgYSBwb3NpdGl2ZSBpbXBhY3Qgb24gd29yayBwcm9kdWN0IG9yIHByb2Nlc3MgcXVhbGl0eS4gIFByYWN0aWNlcyBhcmUgZGVmaW5lZCBvcnRob2dvbmFsIHRvIG1ldGhvZHMgYW5kIHByb2Nlc3Nlcy4gIFRoZXkgY291bGQgc3VtbWFyaXplIGFzcGVjdHMgdGhhdCBpbXBhY3QgbWFueSBkaWZmZXJlbnQgcGFydHMgb2YgYSBtZXRob2Qgb3Igc3BlY2lmaWMgcHJvY2Vzc2VzLiAgRXhhbXBsZXMgZm9yIHByYWN0aWNlcyB3b3VsZCBiZSAmcXVvdDtNYW5hZ2UgUmlza3MmcXVvdDssICZxdW90O0NvbnRpbnVvdXNseSB2ZXJpZnkgcXVhbGl0eSZxdW90OywgJnF1b3Q7QXJjaGl0ZWN0dXJlLWNlbnRyaWMgYW5kIGNvbXBvbmVudC1iYXNlZCBkZXZlbG9wbWVudCZxdW90OywgZXRjLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUHJhY3RpY2UiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Imdyb3VwMiIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VGZWF0dXJlTWFwRW50cnkiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9Imdyb3VwIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Imdyb3VwOjI0Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFjdGl2aXR5UmVmZXJlbmNlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciCi0gICAgICAgIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIGRlcml2ZWQ9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQWN0aXZpdHlSZWZlcmVuY2UiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJncm91cCIgdmFsdWU9IiNncm91cDoyNCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjb250ZW50UmVmZXJlbmNlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciCi0gICAgICAgIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIGRlcml2ZWQ9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ29udGVudFJlZmVyZW5jZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Imdyb3VwIiB2YWx1ZT0iI2dyb3VwOjI0Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InN1YlByYWN0aWNlIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL1ByYWN0aWNlIiB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIiBjb250YWlubWVudD0idHJ1ZSIKLSAgICAgICAgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlN1YlByYWN0aWNlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZ3JvdXAiIHZhbHVlPSIjZ3JvdXA6MjQiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUHJhY3RpY2VEZXNjcmlwdGlvbiIgZVN1cGVyVHlwZXM9IiMvL0NvbnRlbnREZXNjcmlwdGlvbiI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBnZW5lcmFsaXplZCBDb250ZW50IERlc2NyaXB0aW9uIHRoYXQgaXMgdXNlZCB0byBzdG9yZSB0aGUgdGV4dHVhbCBkZXNjcmlwdGlvbiBmb3IgYSBQcmFjdGljZS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlByYWN0aWNlRGVzY3JpcHRpb24iLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFkZGl0aW9uYWxJbmZvIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkFueSBhZGRpdGlvbmFsIEluZm9ybWF0aW9uIG5vdCBjb3ZlcmVkIGJ5IHRoZSBvdGhlciBhdHRyaWJ1dGVzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJBZGRpdGlvbmFsSW5mbyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhcHBsaWNhdGlvbiIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJEZXNjcmliZXMgaG93IHRoZSBQcmFjdGljZSBpcyBiZWluZyBhcHBsaWVkIG9yIGludHJvZHVjZWQgaW50byB0aGUgY29udGV4dCBkZXNjcmliZWQgaW4gYmFja2dyb3VuZC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQXBwbGljYXRpb24iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYmFja2dyb3VuZCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJFbGFib3JhdGlvbiBvbiB0aGUgYmFja2dyb3VuZCBhbmQgdGhlIGNvbnRleHQgaW4gd2hpY2ggdGhlIHByb2JsZW0gb2NjdXJzIGFuZCB3aGVyZSB0aGUgc29sdXRpb24gZGVzY3JpYmVkIGJ5IHRoaXMgUHJhY3RpY2Ugd2lsbCBmaXQgaW4uIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkJhY2tncm91bmQiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZ29hbHMiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBzdW1tYXJ5IG9mIHRoZSBvdmVyYWxsIGdvYWxzIHRvIGJlIGFkZHJlc3NlZCBieSB0aGUgUHJhY3RpY2UuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkdvYWxzIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImxldmVsc09mQWRvcHRpb24iIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iT3V0bGluZXMgdGhlIGRpZmZlcmVudCBmb3JtcyBvciB2YXJpYW50cyBpbiB3aGljaCB0aGUgcHJhY3RpY2UgY291bGQgYmUgcmVhbGl6ZWQuIChlLmcuIGZ1bGwgYWRvcHRpb24gdmVydXMgYSBwYXJ0aWFsIGFkb3B0aW9uIG9mIHRoZSBQcmFjdGljZSkiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTGV2ZWxzT2ZBZG9wdGlvbiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwcm9ibGVtIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgZGVzY3JpcHRpb24gb2YgdGhlIHByb2JsZW0gdGhlIFByYWN0aWNlIGFkZHJlc3Nlcy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUHJvYmxlbSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQcm9jZXNzIiBlU3VwZXJUeXBlcz0iIy8vQWN0aXZpdHkiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgc3BlY2lhbCBBY3Rpdml0eSB0aGF0IGRlc2NyaWJlcyBhIHN0cnVjdHVyZSBmb3IgcGFydGljdWxhciB0eXBlcyBvZiBkZXZlbG9wbWVudCBwcm9qZWN0cy4gIFRvIHBlcmZvcm0gc3VjaCBhIGRldmVsb3BtZW50IHByb2plY3QgYSBQcm9jZXNzZXMgd291bGQgYmUgJ2luc3RhbnRpYXRlZCcgYW5kIGFkYXB0ZWQgZm9yIHRoZSBzcGVjaWZpYyBzaXR1YXRpb24uICBQcm9jZXNzIGlzIGFuIGFic3RyYWN0IGNsYXNzIGFuZCB0aGlzIG1ldGEtbW9kZWwgZGVmaW5lcyBkaWZmZXJlbnQgc3BlY2lhbCB0eXBlcyBvZiBQcm9jZXNzZXMgZm9yIGRpZmZlcmVudCBwcm9jZXNzIG1hbmFnZW1lbnQgYXBwbGljYXRpb25zIGFuZCBkaWZmZXJlbnQgc2l0dWF0aW9ucyBvZiBwcm9jZXNzIHJldXNlLiAgRXZlcnkgUHJvY2VzcyBjb21wcmlzZXMgb2YgYW5kIGlzIHRoZSB0b3AtbGV2ZWwgZWxlbWVudCBvZiBhbiBuLWxldmVsIGJyZWFrZG93biBzdHJ1Y3R1cmUgdXNpbmcgdGhlIE5lc3RpbmcgYXNzb2NpYXRpb24gZGVmaW5lZCBvbiBBY3Rpdml0eS4mI3hEOyYjeEE7Q29yZSBNZXRob2QgQ29udGVudCBwcm92aWRlcyBzdGVwLWJ5LXN0ZXAgZXhwbGFuYXRpb25zLCBkZXNjcmliaW5nIGhvdyB2ZXJ5IHNwZWNpZmljIGRldmVsb3BtZW50IGdvYWxzIGFyZSBhY2hpZXZlZCBpbmRlcGVuZGVudCBvZiB0aGUgcGxhY2VtZW50IG9mIHRoZXNlIHN0ZXBzIHdpdGhpbiBhIGRldmVsb3BtZW50IGxpZmVjeWNsZS4gIFByb2Nlc3NlcyB0YWtlIHRoZXNlIG1ldGhvZCBlbGVtZW50cyBhbmQgcmVsYXRlIHRoZW0gaW50byBzZW1pLW9yZGVyZWQgc2VxdWVuY2VzIHRoYXQgYXJlIGN1c3RvbWl6ZWQgdG8gc3BlY2lmaWMgdHlwZXMgb2YgcHJvamVjdHMuICBUaHVzLCBhIHByb2Nlc3MgaXMgYSBzZXQgb2YgcGFydGlhbGx5IG9yZGVyZWQgd29yayBkZXNjcmlwdGlvbnMgaW50ZW5kZWQgdG8gcmVhY2ggYSBoaWdoZXIgZGV2ZWxvcG1lbnQgZ29hbCwgc3VjaCBhcyB0aGUgcmVsZWFzZSBvZiBhIHNwZWNpZmljIHNvZnR3YXJlIHN5c3RlbS4gIEEgcHJvY2VzcyBhbmQgdGhlIHByb2Nlc3MgbWV0YS1tb2RlbCBzdHJ1Y3R1cmUgZGVmaW5lZCBpbiB0aGlzIHNwZWNpZmljYXRpb24gZm9jdXNlcyBvbiB0aGUgbGlmZWN5Y2xlIGFuZCB0aGUgc2VxdWVuY2luZyBvZiB3b3JrIGluIGJyZWFrZG93biBzdHJ1Y3R1cmVzLiAgVG8gYWNoaWV2ZSB0aGlzIGl0IHVzZXMgdGhlIERlc2NyaXB0b3IgY29uY2VwdCByZWZlcmVuY2luZyBtZXRob2QgY29udGVudCBhbmQgYWxsb3dpbmcgZGVmaW5pbmcgdGltZS1zcGVjaWZpYyBjdXN0b21pemF0aW9ucyBvZiB0aGUgcmVmZXJlbmNlZCBjb250ZW50IChlLmcuIGRlZmluaW5nIGEgZm9jdXMgb24gZGlmZmVyZW50IHN0ZXBzIG9mIHRoZSBzYW1lIFRhc2sgYW5kIHByb3ZpZGluZyBpbnB1dCBXb3JrIFByb2R1Y3RzIGluIGRpZmZlcmVudCBzdGF0ZXMgd2l0aGluIHRoZSBkaWZmZXJlbnQgUGhhc2VzIG9mIGEgcHJvY2VzcyBsaWZlY3ljbGUgaW4gd2hpY2ggdGhlIHNhbWUgVGFzayBpcyBwZXJmb3JtZWQpLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUHJvY2VzcyIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaW5jbHVkZXNQYXR0ZXJuIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iSW5jbHVkZXNQYXR0ZXJuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImRlZmF1bHRDb250ZXh0IiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJEZWZhdWx0Q29udGV4dCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ2YWxpZENvbnRleHQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJWYWxpZENvbnRleHQiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZGlhZ3JhbVVSSSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgVVJJIG9mIHRoZSBkaWFncmFtIGZpbGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBwcm9jZXNzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iYXR0cmlidXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9ImRpYWdyYW1VUkkiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUHJvY2Vzc0NvbXBvbmVudCIgZVN1cGVyVHlwZXM9IiMvL1Byb2Nlc3NQYWNrYWdlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIHNwZWNpYWwgUHJvY2VzcyBQYWNrYWdlIHRoYXQgYXBwbGllcyB0aGUgcHJpbmNpcGxlcyBvZiBlbmNhcHN1bGF0aW9uLiAgQSBQcm9jZXNzIENvbXBvbmVudCByZWFsaXplcyBvbmUgb3IgbW9yZSBJbnRlcmZhY2VzIHdoaWNoIHNwZWNpZnkgaW5wdXRzIGFuZCBvdXRwdXRzIG9mIHRoZSBjb21wb25lbnQuIFRoZXJlIG1pZ2h0IGJlIG1hbnkgY29tcG9uZW50cyByZWFsaXppbmcgdGhlIHNhbWUgaW50ZXJmYWNlcywgYnV0IHVzaW5nIGRpZmZlcmVudCB0ZWNobmlxdWVzIHRvIGFjaGlldmUgc2ltaWxhciBvdXRwdXRzIGZvciBzaW1pbGFyIGlucHV0cy4gIFdoZXJlYXMgdGhlIENvbXBvbmVudCBJbnRlcmZhY2VzIHJlcHJlc2VudCBjb21wb25lbnQgc3BlY2lmaWNhdGlvbnMgKGJsYWNrIGJveCBkZXNjcmlwdGlvbnMgb2YgdGhlIGNvbXBvbmVudCksIGdvb2QgY2FuZGlkYXRlcyBmb3IgY29tcG9uZW50IHJlYWxpemF0aW9ucyBjYW4gYmUgZm91bmQgaW4gQ2FwYWJpbGl0eSBQYXR0ZXJucyAod2hpdGUgYm94IGRlc2NyaXB0aW9ucyBmb3IgdGhlIGNvbXBvbmVudCkuJiN4RDsmI3hBO1VNQSBzdXBwb3J0cyByZXBsYWNlYWJsZSBhbmQgcmV1c2FibGUgUHJvY2VzcyBDb21wb25lbnRzIHJlYWxpemluZyB0aGUgcHJpbmNpcGxlcyBvZiBlbmNhcHN1bGF0aW9uLiBDZXJ0YWluIHNpdHVhdGlvbnMgaW4gYSBzb2Z0d2FyZSBkZXZlbG9wbWVudCBwcm9qZWN0IG1pZ2h0IHJlcXVpcmUgdGhhdCBjb25jcmV0ZSByZWFsaXphdGlvbnMgb2YgcGFydHMgb2YgdGhlIHByb2Nlc3MgcmVtYWluIHVuZGVjaWRlZCBvciB3aWxsIGJlIGRlY2lkZWQgYnkgdGhlIGV4ZWN1dGluZyB0ZWFtIGl0c2VsZiAoZS5nLiBpbiBvdXRzb3VyY2luZyBzaXR1YXRpb25zKS4gIFVNQSBwcm92aWRlcyBhIHVuaXF1ZSBjb21wb25lbnQgY29uY2VwdCBkZWZpbmluZyBpbnRlcmZhY2VzIGZvciB3b3JrIHByb2R1Y3QgaW5wdXQgYW5kIG91dHB1dCwgYWxsb3dpbmcgdHJlYXRpbmcgdGhlIGFjdHVhbCBkZWZpbml0aW9uIG9mIHRoZSB3b3JrIHRoYXQgcHJvZHVjZXMgdGhlIG91dHB1dHMgYXMgYSAmcXVvdDtibGFjayBib3gmcXVvdDsuICBBdCBhbnkgcG9pbnQgZHVyaW5nIGEgcHJvamVjdCB0aGUgY29tcG9uZW50ICZxdW90O3JlYWxpemF0aW9uJnF1b3Q7IGRldGFpbGluZyB0aGUgd29yayBjYW4gYmUgYWRkZWQgdG8gdGhlIHByb2Nlc3MuICBUaGUgY29tcG9uZW50IGFwcHJvYWNoIGFsc28gYWxsb3dzIHRoYXQgZGlmZmVyZW50IHN0eWxlcyBvciB0ZWNobmlxdWVzIG9mIGRvaW5nIHdvcmsgY2FuIGJlIHJlcGxhY2VkIHdpdGggb25lIGFub3RoZXIuICBGb3IgZXhhbXBsZSwgYSBzb2Z0d2FyZSBjb2RlIG91dHB1dCBvZiBhIGNvbXBvbmVudCBjb3VsZCBiZSBwcm9kdWNlZCB3aXRoIGEgbW9kZWwtZHJpdmVuIGRldmVsb3BtZW50IG9yIGEgY29kZS1jZW50cmljIHRlY2huaXF1ZS4gIFRoZSBjb21wb25lbnQgY29uY2VwdCBlbmNhcHN1bGF0ZXMgdGhlIGFjdHVhbCB3b3JrIGFuZCBsZXRzIHRoZSBkZXZlbG9wbWVudCB0ZWFtIGNob29zZSB0aGUgYXBwcm9wcmlhdGUgdGVjaG5pcXVlIGFuZCBmaWxsIHRoZSBjb21wb25lbnQncyByZWFsaXphdGlvbiB3aXRoIHRoZWlyIGNob2ljZSBvZiBBY3Rpdml0aWVzIHRoYXQgcHJvZHVjZSB0aGUgcmVxdWlyZWQgb3V0cHV0cy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlByb2Nlc3NDb21wb25lbnQiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNvcHlyaWdodCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ29weXJpZ2h0Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImludGVyZmFjZSIgZVR5cGU9IiMvL1Byb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UiCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iSW50ZXJmYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InByb2Nlc3MiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSIjLy9Qcm9jZXNzIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlByb2Nlc3MiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYXV0aG9ycyIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJFdmVyeSBNZXRob2QgVW5pdCBpcyBiZWluZyBjcmVhdGVkIGFuZCBvd25lZCBieSBhbiBhdXRob3Igb3IgYXV0aG9yaW5nIHRlYW0uIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJhdHRyaWJ1dGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iYXV0aG9ycyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjaGFuZ2VEYXRlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RhdGVUaW1lIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGRhdGUgdGhlIGxhc3QgY2hhbmdlIHRoYXQgcmVzdWx0ZWQgaW50byB0aGlzIHZlcnNpb24gaGFzIGJlZW4gbWFkZS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImF0dHJpYnV0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJjaGFuZ2VEYXRlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNoYW5nZURlc2NyaXB0aW9uIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgbGFzdCBjaGFuZ2UgdGhhdCByZXN1bHRlZCBpbnRvIHRoaXMgdmVyc2lvbi4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImF0dHJpYnV0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJjaGFuZ2VEZXNjcmlwdGlvbiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ2ZXJzaW9uIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkV2ZXJ5IFBhY2thZ2UgaGFzIGEgdmVyc2lvbiBudW1iZXIgdXNlZCB0byB0cmFjayBjaGFuZ2VzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iYXR0cmlidXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9InZlcnNpb24iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSIgZVN1cGVyVHlwZXM9IiMvL0JyZWFrZG93bkVsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkNvbXByaXNlcyBvZiBhIGxpc3Qgb2YgaW50ZXJmYWNlIHNwZWNpZmljYXRpb25zIChzaW1pbGFyIHRvIG9wZXJhdGlvbiBkZWNsYXJhdGlvbnMpIHRoYXQgZXhwcmVzcyBpbnB1dHMgYW5kIG91dHB1dHMgZm9yIGEgcHJvY2VzcyBjb21wb25lbnQuICBUaGVzZSBpbnRlcmZhY2Ugc3BlY2lmaWNhdGlvbnMgYXJlIGV4cHJlc3NlZCB1c2luZyBUYXNrIERlc2NyaXB0b3JzIHdoaWNoIGFyZSBub3QgbGlua2VkIHRvIFRhc2tzIHRoYXQgYXJlIHJlbGF0ZWQgdG8gV29yayBQcm9kdWN0IERlc2NyaXB0b3JzIGFzIHdlbGwgYXMgb3B0aW9uYWwgYSBSb2xlIERlc2NyaXB0b3IuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJncm91cDIiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FRmVhdHVyZU1hcEVudHJ5Ij4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJncm91cCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJncm91cDozMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJpbnRlcmZhY2VTcGVjaWZpY2F0aW9uIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1Rhc2tEZXNjcmlwdG9yIiB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIgotICAgICAgICBkZXJpdmVkPSJ0cnVlIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkludGVyZmFjZVNwZWNpZmljYXRpb24iLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJncm91cCIgdmFsdWU9IiNncm91cDozMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJpbnRlcmZhY2VJTyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9Xb3JrUHJvZHVjdERlc2NyaXB0b3IiIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIGRlcml2ZWQ9InRydWUiCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iSW50ZXJmYWNlSU8iLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJncm91cCIgdmFsdWU9IiNncm91cDozMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQcm9jZXNzRGVzY3JpcHRpb24iIGVTdXBlclR5cGVzPSIjLy9BY3Rpdml0eURlc2NyaXB0aW9uIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIGdlbmVyYWxpemVkIEFjdGl2aXR5IERlc2NyaXB0aW9uIHRoYXQgaXMgdXNlZCB0byBzdG9yZSB0aGUgdGV4dHVhbCBkZXNjcmlwdGlvbiBmb3IgYSBQcm9jZXNzLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUHJvY2Vzc0Rlc2NyaXB0aW9uIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzY29wZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJEZWZpbmVzIHRoZSBzY29wZSBvZiB0aGUgUHJvY2VzcywgaS5lLiB3aGljaCB0eXBlcyBvZiBwcm9qZWN0cyBkb2VzIGl0IGFkZHJlc3MgYW5kIHdoaWNoIG5vdC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iU2NvcGUiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idXNhZ2VOb3RlcyIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBbnkgYWRkaXRpb25hbCBub3RlcyBvbiBob3cgdG8gYXBwbHkgYW5kIGluc3RhbnRpYXRlIHRoaXMgcHJvY2VzcyBmb3IgYSBwcm9qZWN0LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJVc2FnZU5vdGVzIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlByb2Nlc3NFbGVtZW50IiBlU3VwZXJUeXBlcz0iIy8vRGVzY3JpYmFibGVFbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIERlc2NyaWJhYmxlIEVsZW1lbnQgdGhhdCByZXByZXNlbnRzIGFuIGFic3RyYWN0IGdlbmVyYWxpemF0aW9uIGZvciBhbGwgZWxlbWVudHMgZGVmaW5lZCBpbiB0aGUgUHJvY2VzcyBwYWNrYWdlLiYjeEQ7JiN4QTtQcm9jZXNzIEVsZW1lbnRzIHJlcHJlc2VudHMgUHJvY2VzcyBzcGVjaWZpYyBlbGVtZW50cyB0aGF0IGFyZSBzdXBwb3NlZCB0byBiZSBtYW5hZ2VkIGluIFByb2Nlc3MgUGFja2FnZXMuICBUaGUgc2VwYXJhdGlvbiBvZiBQcm9jZXNzIEVsZW1lbnQgZnJvbSBDb250ZW50IEVsZW1lbnQgYWxsb3dzIHRvIGNsZWFybHkgZGlzdGluZ3Vpc2ggYmV0d2VlbiBwdXJlIG1ldGhvZCBjb250ZW50IGZyb20gY29udGVudCB0aGF0IGlzIHJlcHJlc2VudGVkIGluIHByb2Nlc3Nlcy4gIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJQcm9jZXNzRWxlbWVudCIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUHJvY2Vzc1BhY2thZ2UiIGVTdXBlclR5cGVzPSIjLy9NZXRob2RQYWNrYWdlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIHNwZWNpYWwgTWV0aG9kIFBhY2thZ2UgdGhhdCBjb250YWlucyBQcm9jZXNzIEVsZW1lbnRzLCBvbmx5LiYjeEQ7JiN4QTtBIGtleSBzZXBhcmF0aW9uIG9mIGNvbmNlcm5zIGluIFVNQSBpcyB0aGUgZGlzdGluY3Rpb24gYmV0d2VlbiBNZXRob2QgQ29udGVudCBhbmQgUHJvY2Vzcy4gIFRoaXMgc2VwYXJhdGlvbiBpcyBlbmZvcmNlZCBieSBzcGVjaWFsIHBhY2thZ2UgdHlwZXMsIHdoaWNoIGRvIG5vdCBhbGxvdyB0aGUgbWl4aW5nIG9mIG1ldGhvZCBjb250ZW50IHdpdGggcHJvY2Vzc2VzLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUHJvY2Vzc1BhY2thZ2UiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Imdyb3VwMiIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VGZWF0dXJlTWFwRW50cnkiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9Imdyb3VwIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Imdyb3VwOjEzIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InByb2Nlc3NFbGVtZW50IiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL1Byb2Nlc3NFbGVtZW50IiB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlByb2Nlc3NFbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZ3JvdXAiIHZhbHVlPSIjZ3JvdXA6MTMiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUiIGVTdXBlclR5cGVzPSIjLy9Qcm9jZXNzIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIHNwZWNpYWwgUHJvY2VzcyB0aGF0IGlzIHByZXBhcmVkIGZvciBpbnN0YW50aWF0aW9uIGJ5IGEgcHJvamVjdCBwbGFubmluZyB0b29sLiAgVHlwaWNhbGx5LCBpdCBpcyBjcmVhdGVkIGJhc2VkIG9uIGEgUHJvY2VzcyBzdWNoIGFzIGEgRGVsaXZlcnkgUHJvY2VzcyBhcyBhIHdob2xlIChlLmcuIGluIGNhc2Ugb2YgYSB3YXRlcmZhbGwtYmFzZWQgZGV2ZWxvcG1lbnQgYXBwcm9hY2gpIG9yIGluIHBhcnRzIChlLmcuIGluIGNhc2Ugb2YgYW4gaXRlcmF0aXZlIGRldmVsb3BtZW50IGFwcHJvYWNoKS4mI3hEOyYjeEE7QSBQcm9jZXNzIFBsYW5uaW5nIFRlbXBsYXRlIHJlcHJlc2VudHMgYSBwYXJ0aWFsbHkgZmluaXNoZWQgcGxhbiBmb3IgYSBjb25jcmV0ZSBwcm9qZWN0LiAgSXQgdXNlcyB0aGUgc2FtZSBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmVzIGFzIGFsbCBvdGhlciBQcm9jZXNzIFR5cGVzIHRvIHJlcHJlc2VudCB0ZW1wbGF0ZXMgZm9yIHByb2plY3QgcGxhbnMuICBIb3dldmVyLCBjZXJ0YWluIHBsYW5uaW5nIGRlY2lzaW9ucyBoYXZlIGFscmVhZHkgYmVlbiBhcHBsaWVkIHRvIHRoZSB0ZW1wbGF0ZSBhcyB3ZWxsIGFzIGluZm9ybWF0aW9uIGhhcyBiZWVuIHJlbW92ZWQgYW5kL29yIHJlZm9ybWF0dGVkIHRvIGJlIHJlYWR5IGZvciBleHBvcnQgdG8gYSBzcGVjaWZpYyBwbGFubmluZyB0b29sLiAgRXhhbXBsZXMgZm9yIHN1Y2ggZGVjaXNpb25zIGFyZTogYSB0ZW1wbGF0ZSBoYXMgYmVlbiBjcmVhdGVkIHRvIHJlcHJlc2VudCBhIHBsYW4gZm9yIGEgcGFydGljdWxhciBJdGVyYXRpb24gaW4gYW4gaXRlcmF0aXZlIGRldmVsb3BtZW50IHByb2plY3QsIHdoaWNoIGZyIGV4YW1wbGUgZGlzdGluZ3Vpc2hlcyBlYXJseSBmcm9tIGxhdGUgaXRlcmF0aW9ucyBpbiB0aGUgRWxhYm9yYXRpb24gcGhhc2Ugb2YgYSBwcm9qZWN0OyBpZiB0aGUgdGFyZ2V0ZWQgcGxhbm5pbmcgdG9vbCBjYW5ub3QgcmVwcmVzZW50IGlucHV0IGFuZCBvdXRwdXQgb2YgVGFzaywgdGhlbiB0aGVzZSBoYXZlIGJlZW4gcmVtb3ZlZCBmcm9tIHRoZSBzdHJ1Y3R1cmU7IGNlcnRhaW4gcmVwZXRpdGlvbnMgaGF2ZSBiZWVuIGFscmVhZHkgYXBwbGllZCwgZS5nLiBzdGF0aW5nIHRoYXQgYSBjeWNsZSBvZiBzcGVjaWZpYyBUYXNrIGdyb3VwZWQgaW4gYW4gQWN0aXZpdHkgaGF2ZSB0byBiZSByZXBlYXRlZCBuLXRpbWVzOyBldGMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZ3JvdXA0IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUZlYXR1cmVNYXBFbnRyeSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZ3JvdXAiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iZ3JvdXA6NDciLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYmFzZVByb2Nlc3MiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIKLSAgICAgICAgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJCYXNlUHJvY2VzcyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Imdyb3VwIiB2YWx1ZT0iI2dyb3VwOjQ3Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlJlcG9ydCIgZVN1cGVyVHlwZXM9IiMvL0d1aWRhbmNlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIHByZWRlZmluZWQgdGVtcGxhdGUgb2YgYSByZXN1bHQgdGhhdCBpcyBnZW5lcmF0ZWQgb24gdGhlIGJhc2lzIG9mIG90aGVyIHdvcmsgcHJvZHVjdHMgYXMgYW4gb3V0cHV0IGZyb20gc29tZSBmb3JtIG9mIHRvb2wgYXV0b21hdGlvbi4gQW4gZXhhbXBsZSBmb3IgYSByZXBvcnQgd291bGQgYmUgYSB1c2UgY2FzZSBtb2RlbCBzdXJ2ZXksIHdoaWNoIGlzIGdlbmVyYXRlZCBieSBleHRyYWN0aW5nIGRpYWdyYW0gaW5mb3JtYXRpb24gZnJvbSBhIGdyYXBoaWNhbCBtb2RlbCBhbmQgdGV4dHVhbCBpbmZvcm1hdGlvbiBmcm9tIGRvY3VtZW50cyBhbmQgY29tYmluZXMgdGhlc2UgdHdvIHR5cGVzIG9mIGluZm9ybWF0aW9uIGludG8gYSByZXBvcnQuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJSZXBvcnQiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlJldXNhYmxlQXNzZXQiIGVTdXBlclR5cGVzPSIjLy9HdWlkYW5jZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBzcGVjaWZpYyB0eXBlIG9mIGd1aWRhbmNlIHRoYXQgcHJvdmlkZXMgYSBzb2x1dGlvbiB0byBhIHByb2JsZW0gZm9yIGEgZ2l2ZW4gY29udGV4dC4gVGhlIGFzc2V0IG1heSBoYXZlIGEgdmFyaWFiaWxpdHkgcG9pbnQsIHdoaWNoIGlzIGEgbG9jYXRpb24gaW4gdGhlIGFzc2V0IHRoYXQgbWF5IGhhdmUgYSB2YWx1ZSBwcm92aWRlZCBvciBjdXN0b21pemVkIGJ5IHRoZSBhc3NldCBjb25zdW1lci4gVGhlIGFzc2V0IGhhcyBydWxlcyBmb3IgdXNhZ2Ugd2hpY2ggYXJlIHRoZSBpbnN0cnVjdGlvbnMgZGVzY3JpYmluZyYjeEQ7JiN4QTtob3cgdGhlIGFzc2V0IHNob3VsZCBiZSB1c2VkLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUmV1c2FibGVBc3NldCIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUm9hZG1hcCIgZVN1cGVyVHlwZXM9IiMvL0d1aWRhbmNlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIHNwZWNpZmljIHR5cGUgb2YgR3VpZGFuY2Ugd2hpY2ggaXMgb25seSByZWxhdGVkIHRvIEFjdGl2YXRlcyBhbmQgdGhlcmVmb3JlIGhhcyBiZWVuIGFkZGVkIGJ5IHRoaXMgcGFja2FnZSB0byB0aGUgbGlzdCBvZiBHdWlkYW5jZSBUeXBlcyByYXRoZXIgdGhhbiBsaXN0ZWQgaW4gdGhlIEd1aWRhbmNlIFR5cGVzIHBhY2thZ2UuICBBIFJvYWRtYXAgcmVwcmVzZW50cyBhIGxpbmVhciB3YWxrdGhyb3VnaCBvZiBhbiBBY3Rpdml0eSwgdHlwaWNhbGx5IGEgUHJvY2Vzcy4mI3hEOyYjeEE7QW4gaW5zdGFuY2Ugb2YgYSBSb2FkbWFwIHJlcHJlc2VudHMgaW1wb3J0YW50IGRvY3VtZW50YXRpb24gZm9yIHRoZSBBY3Rpdml0eSBvciBQcm9jZXNzIGl0IGlzIHJlbGF0ZWQgdG8uICBPZnRlbiBhIGNvbXBsZXggQWN0aXZpdHkgc3VjaCBhcyBhIFByb2Nlc3MgY2FuIGJlIG11Y2ggZWFzaWVyIHVuZGVyc3Rvb2QgYnkgcHJvdmlkaW5nIGEgd2Fsa3Rocm91Z2ggd2l0aCBhIGxpbmVhciB0aHJlYWQgb2YgYSB0eXBpY2FsIGluc3RhbnRpYXRpb24gb2YgdGhpcyBBY3Rpdml0eS4gIEluIGFkZGl0aW9uIHRvIG1ha2luZyB0aGUgcHJvY2VzcyBwcmFjdGl0aW9uZXIgdW5kZXJzdGFuZCBob3cgd29yayBpbiB0aGUgcHJvY2VzcyBpcyBiZWluZyBwZXJmb3JtZWQsIGEgUm9hZG1hcCBwcm92aWRlcyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGFib3V0IGhvdyBBY3Rpdml0aWVzIGFuZCBUYXNrcyByZWxhdGUgdG8gZWFjaCBvdGhlciBvdmVyIHRpbWUuICBSb2FkbWFwcyBhcmUgYWxzbyB1c2VkIHRvIHNob3cgaG93IHNwZWNpZmljIGFzcGVjdHMgYXJlIGRpc3RyaWJ1dGVkIG92ZXIgYSB3aG9sZSBwcm9jZXNzIHByb3ZpZGluZyBhIGtpbmQgb2YgZmlsdGVyIG9uIHRoZSBwcm9jZXNzIGZvciB0aGlzIGluZm9ybWF0aW9uLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUm9hZG1hcCIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUm9sZSIgZVN1cGVyVHlwZXM9IiMvL0NvbnRlbnRFbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIENvbnRlbnQgRWxlbWVudCB0aGF0IGRlZmluZXMgYSBzZXQgb2YgcmVsYXRlZCBza2lsbHMsIGNvbXBldGVuY2llcywgYW5kIHJlc3BvbnNpYmlsaXRpZXMuICBSb2xlcyBhcmUgdXNlZCBieSBUYXNrcyB0byBkZWZpbmUgd2hvIHBlcmZvcm1zIHRoZW0gYXMgd2VsbCBhcyBkZWZpbmUgYSBzZXQgb2Ygd29yayBwcm9kdWN0cyB0aGV5IGFyZSByZXNwb25zaWJsZSBmb3IuICAmI3hEOyYjeEE7QSBSb2xlIGRlZmluZXMgYSBzZXQgb2YgcmVsYXRlZCBza2lsbHMsIGNvbXBldGVuY2llcywgYW5kIHJlc3BvbnNpYmlsaXRpZXMgb2YgYW4gaW5kaXZpZHVhbCBvciBhIHNldCBvZiBpbmRpdmlkdWFscy4gIFJvbGVzIGFyZSBub3QgaW5kaXZpZHVhbHMgb3IgcmVzb3VyY2VzLiAgSW5kaXZpZHVhbCBtZW1iZXJzIG9mIHRoZSBkZXZlbG9wbWVudCBvcmdhbml6YXRpb24gd2lsbCB3ZWFyIGRpZmZlcmVudCBoYXRzLCBvciBwZXJmb3JtIGRpZmZlcmVudCByb2xlcy4gVGhlIG1hcHBpbmcgZnJvbSBpbmRpdmlkdWFsIHRvIHJvbGUsIHBlcmZvcm1lZCBieSB0aGUgcHJvamVjdCBtYW5hZ2VyIHdoZW4gcGxhbm5pbmcgYW5kIHN0YWZmaW5nIGZvciBhIHByb2plY3QsIGFsbG93cyBkaWZmZXJlbnQgaW5kaXZpZHVhbHMgdG8gYWN0IGFzIHNldmVyYWwgZGlmZmVyZW50IHJvbGVzLCBhbmQgZm9yIGEgcm9sZSB0byBiZSBwbGF5ZWQgYnkgc2V2ZXJhbCBpbmRpdmlkdWFscy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlJvbGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Imdyb3VwMiIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VGZWF0dXJlTWFwRW50cnkiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9Imdyb3VwIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Imdyb3VwOjI0Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJlc3BvbnNpYmxlRm9yIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciCi0gICAgICAgIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIGRlcml2ZWQ9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUmVzcG9uc2libGVGb3IiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJncm91cCIgdmFsdWU9IiNncm91cDoyNCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJSb2xlRGVzY3JpcHRpb24iIGVTdXBlclR5cGVzPSIjLy9Db250ZW50RGVzY3JpcHRpb24iPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgZ2VuZXJhbGl6ZWQgQ29udGVudCBEZXNjcmlwdGlvbiB0aGF0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIHRleHR1YWwgZGVzY3JpcHRpb24gZm9yIGEgUm9sZS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlJvbGVEZXNjcmlwdGlvbiIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYXNzaWdubWVudEFwcHJvYWNoZXMiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iUHJvdmlkZXMgZ3VpZGFuY2Ugb24gZm9yIGFzc2lnbmluZyBpbmRpdmlkdWFscyB0byB0aGUgUm9sZSBpbiB0ZXJtcyBvZiB3aGF0IG90aGVyIHJvbGVzIHRoZXNlIGluZGl2aWR1YWxzIGNvdWxkIHBlcmZvcm0gYW5kIHdoYXQgcmVzcG9uc2liaWxpdHkgZGlmZmVyZW50IGluZGl2aWR1YWxzIGFzc2lnbmVkIHRvIHRoaXMgcm9sZSBtaWdodCBoYXZlLiAgVGhlIGd1aWRhbmNlIGNhbiBhbHNvIGRlc2NyaWJlIGRpZmZlcmVudCBhc3NpZ25tZW50IGFwcHJvYWNoZXMgZm9yIGRpZmZlcmVudCB0eXBlcyBvZiBwcm9qZWN0cywgZS5nLiBmb3IgbGFyZ2UgdmVyc3VzIHNtYWxsIHRlYW1zIHdoZXJlIGluZGl2aWR1YWxzIGNvdWxkIGJlIGFsbG9jYXRlZCB0byByb2xlcyBmdWxsIHRpbWUgdmVyc3VzIHNoYXJpbmcgcm9sZXMgd2l0aGluIHRoZSB0ZWFtLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJBc3NpZ25tZW50QXBwcm9hY2hlcyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJza2lsbHMiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iTGlzdHMgb2Ygc2V0IG9mIHJlcXVpcmVkIHNraWxscyBhIHBlcnNvbiBuZWVkcyB0byBwb3NzZXNzIHRvIGZ1bGZpbGwgdGhhdCBSb2xlLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJTa2lsbHMiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic3lub255bXMiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iTGlzdHMgc3lub255bXMsIGkuZS4gb3RoZXIgbmFtZXMgdGhlIFJvbGUgbWlnaHQgYmUgcmVmZXJyZWQgYnkuICBUb29sIHN1cHBvcnQgZm9yIHRoZSBtZXRhLW1vZGVsIG1pZ2h0IHN1cHBvcnQgdGhhdCBhIFJvbGUgbmFtZSBjYW4gYmUgY29uc2lzdGVudGx5IGJlIHJlcGxhY2VkIHdpdGggb25lIG9mIGl0cyBzeW5vbnltcyB0aHJvdWdodCBhIFByb2Nlc3MuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlN5bm9ueW1zIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlJvbGVEZXNjcmlwdG9yIiBlU3VwZXJUeXBlcz0iIy8vRGVzY3JpcHRvciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBzcGVjaWFsIERlc2NyaXB0b3IgdGhhdCByZXByZXNlbnRzIGEgUm9sZSBpbiB0aGUgY29udGV4dCBvZiBvbmUgc3BlY2lmaWMgQWN0aXZpdHkuICBFdmVyeSBicmVha2Rvd24gc3RydWN0dXJlIGNhbiBkZWZpbmUgZGlmZmVyZW50IHJlbGF0aW9uc2hpcHMgb2YgUm9sZSBEZXNjcmlwdG9ycyB0byBUYXNrIERlc2NyaXB0b3JzIGFuZCBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvcnMuICBUaGVyZWZvcmUgb25lIFJvbGUgY2FuIGJlIHJlcHJlc2VudGVkIGJ5IG1hbnkgUm9sZSBEZXNjcmlwdG9ycyBlYWNoIHdpdGhpbiB0aGUgY29udGV4dCBvZiBhbiBBY3Rpdml0eSB3aXRoIGl0cyBvd24gc2V0IG9mIHJlbGF0aW9uc2hpcHMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJSb2xlRGVzY3JpcHRvciIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icm9sZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUm9sZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyZXNwb25zaWJsZUZvciIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlJlc3BvbnNpYmxlRm9yIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlJvbGVTZXQiIGVTdXBlclR5cGVzPSIjLy9Db250ZW50Q2F0ZWdvcnkiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9Ik9yZ2FuaXplcyBSb2xlcyBpbnRvIGNhdGVnb3JpZXMuICBJdCBpcyB1c2VkIHRvIGdyb3VwIHJvbGVzIHRvZ2V0aGVyIHRoYXQgaGF2ZSBjZXJ0YWluIGNvbW1vbmFsaXRpZXMuICBGb3IgZXhhbXBsZSwgdGhlICZxdW90O0FuYWx5c3RzJnF1b3Q7IFJvbGUgU2V0IGNvdWxkIGdyb3VwIHRoZSAmcXVvdDtCdXNpbmVzcyBQcm9jZXNzIEFuYWx5c3QmcXVvdDssICZxdW90O1N5c3RlbSBBbmFseXN0JnF1b3Q7LCBhcyB3ZWxsIGFzICZxdW90O1JlcXVpcmVtZW50cyBTcGVjaWZpZXImcXVvdDsgcm9sZXMuICBBbGwgb2YgdGhlc2Ugd29yayB3aXRoIHNpbWlsYXIgdGVjaG5pcXVlcyBhbmQgaGF2ZSBvdmVybGFwcGluZyBza2lsbHMsIGJ1dCBhcmUgcmVxdWlyZWQgYXMgZGlzdGluY3Qgcm9sZXMgZm9yIGEgbWV0aG9kIChlLmcuIHRoZSBtZXRob2QgdGhlIElCTSBSYXRpb25hbCBVbmlmaWVkIFByb2Nlc3MgaXMgYmFzZWQgb24pLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUm9sZVNldCIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZ3JvdXAyIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUZlYXR1cmVNYXBFbnRyeSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZ3JvdXAiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iZ3JvdXA6MjQiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icm9sZSIgdW5pcXVlPSJmYWxzZSIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIiB2b2xhdGlsZT0idHJ1ZSIKLSAgICAgICAgdHJhbnNpZW50PSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlJvbGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJncm91cCIgdmFsdWU9IiNncm91cDoyNCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJSb2xlU2V0R3JvdXBpbmciIGVTdXBlclR5cGVzPSIjLy9Db250ZW50Q2F0ZWdvcnkiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlJvbGUgU2V0cyBjYW4gYmUgY2F0ZWdvcml6ZWQgaW50byBSb2xlIFNldCBHcm91cGluZ3MuICBGb3IgZXhhbXBsZSwgZGlmZmVyZW50IG1ldGhvZHMgbWlnaHQgZGVmaW5lIHNpbWlsYXIgUm9sZSBTZXRzLCB3aGljaCBob3dldmVyIG5lZWQgdG8gYmUgZGlzdGluZ3Vpc2hlZCBmcm9tIGVhY2ggb3RoZXIgb24gYSBnbG9iYWwgc2NhbGUuICBUaHVzLCBSb2xlIFNldCBHcm91cGluZ3MgYWxsb3cgZGlzdGluZ3Vpc2hpbmcsIGZvciBleGFtcGxlLCBTb2Z0d2FyZSBTZXJ2aWNlcyBNYW5hZ2VyIFJvbGUgU2V0cyBmcm9tIFNvZnR3YXJlIERldmVsb3BtZW50IE9yZ2FuaXphdGlvbiBNYW5hZ2VyIFJvbGUgU2V0cy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlJvbGVTZXRHcm91cGluZyIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZ3JvdXAyIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUZlYXR1cmVNYXBFbnRyeSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZ3JvdXAiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iZ3JvdXA6MjQiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icm9sZVNldCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIgotICAgICAgICB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlJvbGVTZXQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJncm91cCIgdmFsdWU9IiNncm91cDoyNCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJTZWN0aW9uIiBlU3VwZXJUeXBlcz0iIy8vTWV0aG9kRWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBzcGVjaWFsIE1ldGhvZCBFbGVtZW50IHRoYXQgcmVwcmVzZW50cyBzdHJ1Y3R1cmFsIHN1YnNlY3Rpb25zIG9mIGEgQ29udGVudCBEZXNjcmlwdGlvbidzIHNlY3Rpb25EZXNjcmlwdGlvbiBhdHRyaWJ1dGUuICBJdCBpcyB1c2VkIGZvciBlaXRoZXIgbGFyZ2Ugc2NhbGUgZG9jdW1lbnRhdGlvbiBvZiBDb250ZW50IEVsZW1lbnRzIG9yZ2FuaXplZCBpbnRvIHNlY3Rpb25zIGFzIHdlbGwgYXMgdG8gZmxleGlibHkgYWRkIG5ldyBTZWN0aW9ucyB0byBDb250ZW50IEVsZW1lbnRzIHVzaW5nIGNvbnRyaWJ1dGlvbiB2YXJpYWJpbGl0eSBhZGRlZCB0byB0aGUgU2VjdGlvbiBjb25jZXB0IGZvciBNZXRob2QgUGx1Zy1pbnMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJTZWN0aW9uIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJzdWJTZWN0aW9uIiBlVHlwZT0iIy8vU2VjdGlvbiIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJTdWJTZWN0aW9uIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InByZWRlY2Vzc29yIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJQcmVkZWNlc3NvciIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJkZXNjcmlwdGlvbiIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGlzIGF0dHJpYnV0ZXMgc3RvcmUgdGhlIGRlc2NyaXB0aW9uIHRleHQgZm9yIGEgQ29udGVudCBEZXNjcmlwdGlvbidzIFNlY3Rpb24uIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkRlc2NyaXB0aW9uIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InNlY3Rpb25OYW1lIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkV2ZXJ5IFNlY3Rpb24gaGFzIGEgbmFtZSB1c2VkIGZvciBleHRlcm5hbCBwcmVzZW50YXRpb24gb2YgdGhlIHNlY3Rpb24sIGUuZy4gd2hlbiBwdWJsaXNoZWQgb3Igd2hlbiBzZWN0aW9uIGhlYWRpbmcgYXJlIGxpc3RlZCBpbiBhIHRhYmxlIG9mIGNvbnRlbnRzLiAgVGhpcyBhdHRyaWJ1dGUgaXMgc2ltaWxhciB0byBQcmVzZW50YXRpb24gTmFtZSBmb3IgQ29udGVudCBFbGVtZW50cy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImF0dHJpYnV0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJzZWN0aW9uTmFtZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50IgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iYXR0cmlidXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9InZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idmFyaWFiaWxpdHlUeXBlIiBlVHlwZT0iIy8vVmFyaWFiaWxpdHlUeXBlIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSJuYSIgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iYXR0cmlidXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9InZhcmlhYmlsaXR5VHlwZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJTdXBwb3J0aW5nTWF0ZXJpYWwiIGVTdXBlclR5cGVzPSIjLy9HdWlkYW5jZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBjYXRjaGFsbCBmb3Igb3RoZXIgdHlwZXMgb2YgZ3VpZGFuY2Ugbm90IHNwZWNpZmljYWxseSBkZWZpbmVkIGVsc2V3aGVyZS4gSXQgY2FuIGJlIHJlbGF0ZWQgdG8gYWxsIGtpbmRzIG9mIENvbnRlbnQgRWxlbWVudHMsIGkuZS4gaW5jbHVkaW5nIG90aGVyIGd1aWRhbmNlIGVsZW1lbnRzLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iU3VwcG9ydGluZ01hdGVyaWFsIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJUYXNrIiBlU3VwZXJUeXBlcz0iIy8vQ29udGVudEVsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgQ29udGVudCBFbGVtZW50IHRoYXQgZGVzY3JpYmVzIHdvcmsgYmVpbmcgcGVyZm9ybWVkIGJ5IFJvbGVzLiAgSXQgZGVmaW5lcyBvbmUgZGVmYXVsdCBwZXJmb3JtaW5nIFJvbGUgYXMgd2VsbCBhcyBtYW55IGFkZGl0aW9uYWwgcGVyZm9ybWVycy4gIEEgVGFzayBpcyBhc3NvY2lhdGVkIHRvIGlucHV0IGFuZCBvdXRwdXQgd29yayBwcm9kdWN0cy4gIElucHV0cyBhcmUgZGlmZmVyZW50aWF0ZWQgaW4gbWFuZGF0b3J5IHZlcnN1cyBvcHRpb25hbCBpbnB1dHMuICBUaGUgYXNzb2NpYXRpb25zIHRvIFdvcmsgUHJvZHVjdHMgYXJlIG5vdCBpbnN0YW50aWF0YWJsZS92YXJpYWJsZS1saWtlIHBhcmFtZXRlcnMuICBUaGV5IHJhdGhlciBleHByZXNzIChoeXBlci0pbGlua3MgdG8gdGhlIGRlc2NyaXB0aW9ucyBvZiB0aGUgd29yayBwcm9kdWN0cyB0eXBlcyB0aGF0IGFyZSByZWxhdGVkIHRvIHRoZSBUYXNrIGFzIGlucHV0cyBhbmQgb3V0cHV0cy4gIEluIG90aGVyIHdvcmRzLCB0aGVzZSBhc3NvY2lhdGlvbnMgYXJlIG5vdCBpbnRlbmRlZCB0byBiZSB1c2VkIHRvIGNhcHR1cmUgd2hpY2ggY29uY3JldGUgaW5zdGFuY2VzIHdpbGwgYmUgcGFzc2VkIHdoZW4gaW5zdGFudGlhdGluZyB0aGUgbWV0aG9kIGluIGEgcHJvamVjdC4gIEFsbCBvZiB0aGUgVGFzaydzIGRlZmF1bHQgYXNzb2NpYXRpb25zIGNhbiBiZSBvdmVycmlkZGVuIGluIGFuIGFjdHVhbCBwcm9jZXNzIGRlZmluaXRpb24uJiN4RDsmI3hBO0EgVGFzayBkZXNjcmliZXMgYW4gYXNzaWduYWJsZSB1bml0IG9mIHdvcmsuICBFdmVyeSBUYXNrIGlzIGFzc2lnbmVkIHRvIHNwZWNpZmljIFJvbGVzLiAgVGhlIGdyYW51bGFyaXR5IG9mIGEgVGFzayBpcyBnZW5lcmFsbHkgYSBmZXcgaG91cnMgdG8gYSBmZXcgZGF5cy4gIEl0IHVzdWFsbHkgYWZmZWN0cyBvbmUgb3Igb25seSBhIHNtYWxsIG51bWJlciBvZiB3b3JrIHByb2R1Y3RzLiBBIFRhc2sgaXMgdXNlZCBhcyBhbiBlbGVtZW50IG9mIGRlZmluaW5nIGEgcHJvY2Vzcy4gVGFza3MgYXJlIGZ1cnRoZXIgdXNlZCBmb3IgcGxhbm5pbmcgYW5kIHRyYWNraW5nIHByb2dyZXNzOyB0aGVyZWZvcmUsIGlmIHRoZXkgYXJlIGRlZmluZWQgdG9vIGZpbmUtZ3JhaW5lZCwgdGhleSB3aWxsIGJlIG5lZ2xlY3RlZCwgYW5kIGlmIHRoZXkgYXJlIHRvbyBsYXJnZSwgcHJvZ3Jlc3Mgd291bGQgaGF2ZSB0byBiZSBleHByZXNzZWQgaW4gdGVybXMgb2YgYSBUYXNrJ3MgcGFydHMgKGUuZy4gU3RlcHMsIHdoaWNoIGlzIG5vdCByZWNvbW1lbmRlZCkuICYjeEQ7JiN4QTtBIFRhc2sgaGFzIGEgY2xlYXIgcHVycG9zZSBpbiB3aGljaCB0aGUgcGVyZm9ybWluZyByb2xlcyBhY2hpZXZlIGEgd2VsbCBkZWZpbmVkIGdvYWwuICBJdCBwcm92aWRlcyBjb21wbGV0ZSBzdGVwLWJ5LXN0ZXAgZXhwbGFuYXRpb25zIG9mIGRvaW5nIGFsbCB0aGUgd29yayB0aGF0IG5lZWRzIHRvIGJlIGRvbmUgdG8gYWNoaWV2ZSB0aGlzIGdvYWwuICBUaGlzIGRlc2NyaXB0aW9uIGlzIGNvbXBsZXRlLCBpbmRlcGVuZGVudCBvZiB3aGVuIGluIGEgcHJvY2VzcyBsaWZlY3ljbGUgdGhlIHdvcmsgd291bGQgYWN0dWFsbHkgYmUgZG9uZS4gIEl0IHRoZXJlZm9yZSBkb2VzIG5vdCBkZXNjcmliZSB3aGVuIHlvdSBkbyB3aGF0IHdvcmsgYXQgd2hhdCBwb2ludCBvZiB0aW1lLCBidXQgZGVzY3JpYmVzIGFsbCB0aGUgd29yayB0aGF0IGdldHMgZG9uZSB0aHJvdWdob3V0IHRoZSBkZXZlbG9wbWVudCBsaWZlY3ljbGUgdGhhdCBjb250cmlidXRlcyB0byB0aGUgYWNoaWV2ZW1lbnQgb2YgdGhpcyBnb2FsLiAgV2hlbiB0aGUgVGFzayBpcyBiZWluZyBhcHBsaWVkIGluIGEgcHJvY2VzcyB0aGVuIHRoaXMgcHJvY2VzcyBhcHBsaWNhdGlvbiAoZGVmaW5lZCBhcyBUYXNrIERlc2NyaXB0b3IpIHByb3ZpZGVzIHRoZSBpbmZvcm1hdGlvbiBvZiB3aGljaCBwaWVjZXMgb2YgdGhlIFRhc2sgd2lsbCBhY3R1YWxseSBiZSBwZXJmb3JtZWQgYXQgYW55IHBhcnRpY3VsYXIgcG9pbnQgaW4gdGltZS4gVGhpcyBhc3N1bWVzIHRoYXQgdGhlIFRhc2sgd2lsbCBiZSBwZXJmb3JtZWQgaW4gdGhlIHByb2Nlc3Mgb3ZlciBhbmQgb3ZlciBhZ2FpbiwgYnV0IGVhY2ggdGltZSB3aXRoIGEgc2xpZ2h0bHkgZGlmZmVyZW50IGVtcGhhc2lzIG9uIGRpZmZlcmVudCBzdGVwcyBvciBhc3BlY3RzIG9mIHRoZSB0YXNrIGRlc2NyaXB0aW9uLiAmI3hEOyYjeEE7Rm9yIGV4YW1wbGUsIGEgVGFzayBzdWNoIGFzICZxdW90O0RldmVsb3AgVXNlIENhc2UgTW9kZWwmcXVvdDsgZGVzY3JpYmVzIGFsbCB0aGUgd29yayB0aGF0IG5lZWRzIHRvIGJlIGRvbmUgdG8gZGV2ZWxvcCBhIGNvbXBsZXRlIHVzZSBjYXNlIG1vZGVsLiBUaGlzIHdvdWxkIGNvbXByaXNlIG9mIHRoZSBpZGVudGlmaWNhdGlvbiBhbmQgbmFtaW5nIG9mIHVzZSBjYXNlcyBhbmQgYWN0b3JzLCB0aGUgd3JpdGluZyBvZiBhIGJyaWVmIGRlc2NyaXB0aW9uLCB0aGUgbW9kZWxpbmcgb2YgdXNlIGNhc2VzIGFuZCB0aGVpciByZWxhdGlvbnNoaXBzIGluIGRpYWdyYW1zLCB0aGUgZGV0YWlsZWQgZGVzY3JpcHRpb24gb2YgYSBiYXNpYyBmbG93LCB0aGUgZGV0YWlsZWQgZGVzY3JpcHRpb24gb2YgYWx0ZXJuYXRpdmVzIGZsb3dzLCBwZXJmb3JtaW5nIG9mIHdhbGt0aHJvdWdocyB3b3Jrc2hvcHMgYW5kIHJldmlld3MsIGV0Yy4gIEFsbCBvZiB0aGVzZSBwYXJ0cyBjb250cmlidXRlIHRvIHRoZSBkZXZlbG9wbWVudCBnb2FsIG9mIGRldmVsb3BpbmcgdGhlIHVzZSBjYXNlIG1vZGVsLCBidXQgdGhlIHBhcnRzIHdpbGwgYmUgcGVyZm9ybWVkIGF0IGRpZmZlcmVudCBwb2ludHMgaW4gdGltZSBpbiBhIHByb2Nlc3MuICBJZGVudGlmaWNhdGlvbiwgbmFtaW5nLCBhbmQgYnJpZWYgZGVzY3JpcHRpb25zIHdvdWxkIGJlIHBlcmZvcm1lZCBlYXJseSBpbiBhIHR5cGljYWwgZGV2ZWxvcG1lbnQgcHJvY2VzcyB2ZXJzdXMgdGhlIHdyaXRpbmcgb2YgZGV0YWlsZWQgYWx0ZXJuYXRpdmUgZmxvd3Mgd2hpY2ggd291bGQgYmUgcGVyZm9ybWVkIG11Y2ggbGF0ZXIuICBBbGwgdGhlc2UgcGFydHMgb3Igc3RlcHMgd2l0aGluIHRoZSBzYW1lIFRhc2sgZGVmaW5lIHRoZSAmcXVvdDttZXRob2QmcXVvdDsgb2YgRGV2ZWxvcGluZyBhIFVzZSBDYXNlIE1vZGVsLiAgQXBwbHlpbmcgc3VjaCBhIG1ldGhvZCBpbiBhIGxpZmVjeWNsZSAoaS5lLiBpbiBhIHByb2Nlc3MpIGlzIGRlZmluaW5nIHdoaWNoIHN0ZXBzIGFyZSBkb25lIHdoZW4gZ29pbmcgZnJvbSBvbmUgaXRlcmF0aW9uIHRvIHRoZSBuZXh0LiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVGFzayIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icHJlY29uZGl0aW9uIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJQcmVjb25kaXRpb24iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icG9zdGNvbmRpdGlvbiIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUG9zdGNvbmRpdGlvbiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwZXJmb3JtZWRCeSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlBlcmZvcm1lZEJ5Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Imdyb3VwMiIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VGZWF0dXJlTWFwRW50cnkiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9Imdyb3VwIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Imdyb3VwOjI3Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im1hbmRhdG9yeUlucHV0IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciCi0gICAgICAgIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIGRlcml2ZWQ9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTWFuZGF0b3J5SW5wdXQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJncm91cCIgdmFsdWU9IiNncm91cDoyNyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJvdXRwdXQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIKLSAgICAgICAgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJPdXRwdXQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJncm91cCIgdmFsdWU9IiNncm91cDoyNyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSIKLSAgICAgICAgdW5pcXVlPSJmYWxzZSIgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIgotICAgICAgICB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZ3JvdXAiIHZhbHVlPSIjZ3JvdXA6MjciLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ib3B0aW9uYWxJbnB1dCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIgotICAgICAgICB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik9wdGlvbmFsSW5wdXQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJncm91cCIgdmFsdWU9IiNncm91cDoyNyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJlc3RpbWF0ZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIgotICAgICAgICB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkVzdGltYXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZ3JvdXAiIHZhbHVlPSIjZ3JvdXA6MjciLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIgotICAgICAgICB1bmlxdWU9ImZhbHNlIiB1cHBlckJvdW5kPSItMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciCi0gICAgICAgIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIGRlcml2ZWQ9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZ3JvdXAiIHZhbHVlPSIjZ3JvdXA6MjciLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idG9vbE1lbnRvciIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIgotICAgICAgICB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlRvb2xNZW50b3IiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJncm91cCIgdmFsdWU9IiNncm91cDoyNyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJUYXNrRGVzY3JpcHRpb24iIGVTdXBlclR5cGVzPSIjLy9Db250ZW50RGVzY3JpcHRpb24iPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgZ2VuZXJhbGl6ZWQgQ29udGVudCBEZXNjcmlwdGlvbiB0aGF0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIHRleHR1YWwgZGVzY3JpcHRpb24gZm9yIGEgVGFzay4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlRhc2tEZXNjcmlwdGlvbiIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYWx0ZXJuYXRpdmVzIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkNvbXByaXNlcyBvZiBzdW1tYXJpZXMgZGVzY3JpYmluZyBpbXBvcnRhbnQgZXhjZXB0aW9uYWwgYW5kIG5vbi1zdGFuZGFyZCB3YXlzIG9mIGFjaGlldmluZyB0aGlzIFRhc2sncyBkZXZlbG9wbWVudCBnb2FscyB0aGF0IHdlcmUgbm90IGNvdmVyZWQgYnkgdGhlIFRhc2sncyBTdGVwcy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQWx0ZXJuYXRpdmVzIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InB1cnBvc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iU3VtbWFyaXplcyB0aGUgbWFpbiByZWFzb24gZm9yIHBlcmZvcm1pbmcgdGhpcyBUYXNrIGFuZCB3aGF0IGlzIGludGVuZGVkIHRvIGJlIGFjaGlldmVkLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJQdXJwb3NlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlRhc2tEZXNjcmlwdG9yIiBlU3VwZXJUeXBlcz0iIy8vV29ya0JyZWFrZG93bkVsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgc3BlY2lhbCBEZXNjcmlwdG9yIHRoYXQgcmVwcmVzZW50cyBhIHByb3h5IGZvciBhIFRhc2sgaW4gdGhlIGNvbnRleHQgb2Ygb25lIHNwZWNpZmljIEFjdGl2aXR5LiAgRXZlcnkgYnJlYWtkb3duIHN0cnVjdHVyZSBjYW4gZGVmaW5lIGRpZmZlcmVudCByZWxhdGlvbnNoaXBzIG9mIFRhc2sgRGVzY3JpcHRvcnMgdG8gV29yayBQcm9kdWN0IERlc2NyaXB0b3JzIGFuZCBSb2xlIERlc2NyaXB0b3JzLiBUaGVyZWZvcmUgb25lIFRhc2sgY2FuIGJlIHJlcHJlc2VudGVkIGJ5IG1hbnkgVGFzayBEZXNjcmlwdG9ycyBlYWNoIHdpdGhpbiB0aGUgY29udGV4dCBvZiBhbiBBY3Rpdml0eSB3aXRoIGl0cyBvd24gc2V0IG9mIHJlbGF0aW9uc2hpcHMuJiN4RDsmI3hBO0Ega2V5IGRpZmZlcmVuY2UgYmV0d2VlbiBNZXRob2QgQ29udGVudCBhbmQgUHJvY2VzcyBpcyB0aGF0IGEgQ29udGVudCBFbGVtZW50IHN1Y2ggYXMgVGFzayBkZXNjcmliZXMgYWxsIGFzcGVjdHMgb2YgZG9pbmcgd29yayBkZWZpbmVkIGFyb3VuZCB0aGlzIFRhc2suICBUaGlzIGRlc2NyaXB0aW9uIGlzIG1hbmFnZWQgaW4gc3RlcHMsIHdoaWNoIGFyZSBtb2RlbGVkIGFzIFNlY3Rpb25zIG9mIHRoZSBUYXNrcycgQ29udGVudCBEZXNjcmlwdGlvbnMuICBXaGVuIGFwcGx5aW5nIGEgVGFzayBpbiBhIFByb2Nlc3MnIEFjdGl2aXR5IHdpdGggYSBUYXNrIERlc2NyaXB0b3IgYSBQcm9jZXNzIEVuZ2luZWVyIG5lZWRzIHRvIGluZGljYXRlIHRoYXQgYXQgdGhhdCBwYXJ0aWN1bGFyIHBvaW50IGluIHRpbWUgaW4gdGhlIFByb2Nlc3MgZGVmaW5pdGlvbiBmb3Igd2hpY2ggdGhlIFRhc2sgRGVzY3JpcHRvciBoYXMgYmVlbiBjcmVhdGVkLCBvbmx5IGEgc3Vic2V0IG9mIHN0ZXBzIHNoYWxsIGJlIHBlcmZvcm1lZC4gIEhlIGRlZmluZXMgdGhpcyBzZWxlY3Rpb24gdXNpbmcgdGhlIHNlbGVjdGVkU3RlcHMgYXNzb2NpYXRpb24uICBJZiBoZSB3YW50cyB0byBhZGQgc3RlcHMgdG8gYSBUYXNrIERlc2NyaXB0b3IsIGhlIGNhbiBkZXNjcmliZSB0aGVzZSBlaXRoZXIgcHJhZ21hdGljYWxseSBpbiB0aGUgcmVmaW5lZERlc2NyaXB0aW9uIGF0dHJpYnV0ZSBvciAncHJvcGVybHknIGNyZWF0ZSBhIGNvbnRyaWJ1dGluZyBUYXNrIHRvIHRoZSBUYXNrIHRoZSBUYXNrIERlc2NyaXB0b3IgcmVmZXJzIHRvLiYjeEQ7JiN4QTsiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlRhc2tEZXNjcmlwdG9yIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ0YXNrIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJUYXNrIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InBlcmZvcm1lZFByaW1hcmlseUJ5IiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJQZXJmb3JtZWRQcmltYXJpbHlCeSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJncm91cDMiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FRmVhdHVyZU1hcEVudHJ5Ij4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJncm91cCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJncm91cDozNyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSIKLSAgICAgICAgdW5pcXVlPSJmYWxzZSIgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIgotICAgICAgICB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZ3JvdXAiIHZhbHVlPSIjZ3JvdXA6MzciLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYXNzaXN0ZWRCeSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIgotICAgICAgICB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkFzc2lzdGVkQnkiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJncm91cCIgdmFsdWU9IiNncm91cDozNyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJleHRlcm5hbElucHV0IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciCi0gICAgICAgIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIGRlcml2ZWQ9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRXh0ZXJuYWxJbnB1dCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Imdyb3VwIiB2YWx1ZT0iI2dyb3VwOjM3Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im1hbmRhdG9yeUlucHV0IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciCi0gICAgICAgIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIGRlcml2ZWQ9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTWFuZGF0b3J5SW5wdXQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJncm91cCIgdmFsdWU9IiNncm91cDozNyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJvcHRpb25hbElucHV0IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciCi0gICAgICAgIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIGRlcml2ZWQ9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iT3B0aW9uYWxJbnB1dCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Imdyb3VwIiB2YWx1ZT0iI2dyb3VwOjM3Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im91dHB1dCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIgotICAgICAgICB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik91dHB1dCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Imdyb3VwIiB2YWx1ZT0iI2dyb3VwOjM3Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InN0ZXAiIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vU2VjdGlvbiIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJTdGVwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImlzU3luY2hyb25pemVkV2l0aFNvdXJjZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJhdHRyaWJ1dGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlRlYW1Qcm9maWxlIiBlU3VwZXJUeXBlcz0iIy8vQnJlYWtkb3duRWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBCcmVha2Rvd24gRWxlbWVudCB0aGF0IGdyb3VwcyBSb2xlIERlc2NyaXB0b3JzIG9yIFJlc291cmNlIERlZmluaXRpb25zIGRlZmluaW5nIGEgbmVzdGVkIGhpZXJhcmNoeSBvZiB0ZWFtcyBhbmQgdGVhbSBtZW1iZXJzLiYjeEQ7JiN4QTtXb3JrIGFzc2lnbm1lbnRzIGFuZCBXb3JrIFByb2R1Y3QgcmVzcG9uc2liaWxpdGllcyBjYW4gYmUgZGlmZmVyZW50IGZyb20gQWN0aXZpdHkgdG8gQWN0aXZpdHkgaW4gYSBkZXZlbG9wbWVudCBwcm9qZWN0LiBEaWZmZXJlbnQgcGhhc2VzIHJlcXVpcmUgZGlmZmVyZW50IHN0YWZmaW5nIHByb2ZpbGVzLCBpLmUuIGRpZmZlcmVudCBza2lsbHMgYW5kIHJlc291cmNlcyBkb2luZyBkaWZmZXJlbnQgdHlwZXMgb2Ygd29yay4gIFRoZXJlZm9yZSwgYSBwcm9jZXNzIG5lZWRzIHRvIGRlZmluZSBzdWNoIGRpZmZlcmVudCBwcm9maWxlcyBpbiBhIGZsZXhpYmxlIG1hbm5lci4gIFdoZXJlYXMgQ29yZSBNZXRob2QgQ29udGVudCBkZWZpbmVzIHN0YW5kYXJkIHJlc3BvbnNpYmlsaXRpZXMgYW5kIGFzc2lnbm1lbnRzLCBhIHByb2Nlc3MgZXhwcmVzcyBieSBhIGJyZWFrZG93biBzdHJ1Y3R1cmVzIG5lZWRzIHRvIGJlIGFibGUgcmVmaW5lIGFuZCByZWRlZmluZSB0aGVzZSB0aHJvdWdob3V0IGl0cyBkZWZpbml0aW9uLiAgUm9sZSBEZXNjcmlwdG9ycywgUmVzb3VyY2UgRGVmaW5pdGlvbnMsIGFzIHdlbGwgYXMgVGVhbSBQcm9maWxlcyBwcm92aWRlIHRoZSBkYXRhIHN0cnVjdHVyZSBuZWNlc3NhcnkgdG8gYWNoaWV2ZSB0aGlzIGZsZXhpYmlsaXR5IGFuZCB0byBwcm92aWRlIGEgcHJvY2VzcyB1c2VyIHdpdGggdGhlIGNhcGFiaWxpdHkgdG8gZGVmaW5lIGRpZmZlcmVudCB0ZWFtcyBhbmQgcm9sZSByZWxhdGlvbnNoaXBzIGZvciBldmVyeSBBY3Rpdml0eSAoaW5jbHVkaW5nIEFjdGl2aXRpZXMgb24gYW55IG5lc3RpbmctbGV2ZWwgYXMgd2VsbCBhcyBJdGVyYXRpb25zIG9yIFBoYXNlcykuJiN4RDsmI3hBO0hlbmNlLCBpbiBhZGRpdGlvbiB0byB0aGUgd29yayBicmVha2Rvd24gYW5kIHdvcmsgcHJvZHVjdCBicmVha2Rvd24gc3RydWN0dXJlcyBkZWZpbmVkIHNvIGZhciwgVGVhbSBQcm9maWxlcyBhcmUgdXNlZCB0byBkZWZpbmUgYSB0aGlyZCB0eXBlIG9mIGJyZWFrZG93biBzdHJ1Y3R1cmU6IHRlYW0gYnJlYWtkb3duIHN0cnVjdHVyZXMuICBUaGVzZSBhcmUgY3JlYXRlZCBhcyBhbiBBY3Rpdml0eSBzcGVjaWZpYyBoaWVyYXJjaHkgb2YgVGVhbSBQcm9maWxlcyBjb21wcmlzaW5nIG9mIFJvbGUgRGVzY3JpcHRvcnMgYW5kIFJlc291cmNlIERlZmluaXRpb25zLiAgVGhlc2Ugc3RydWN0dXJlcyBjYW4gYmUgcHJlc2VudGVkIGFzIHdlbGwta25vd24gT3JnLUNoYXJ0cy4gIEp1c3QgYXMgd2l0aCBhbnkgb3RoZXIgQnJlYWtkb3duIEVsZW1lbnQgYW5kIERlc2NyaXB0b3JzLCBUZWFtIFByb2ZpbGVzIGNhbiBiZSBkZWZpbmVkIHdpdGhpbiB0aGUgc2NvcGUgb2YgYW55IEFjdGl2aXR5IGluIGEgYnJlYWtkb3duIHN0cnVjdHVyZS4gIEluIG90aGVyIHdvcmRzIGV2ZXJ5IEFjdGl2aXR5IGNhbiBkZWZpbmUgaXRzIG93biBUZWFtIFByb2ZpbGVzIGNvbnNpc3Rpbmcgb2YgQWN0aXZpdHkgc3BlY2lmaWMgUm9sZSBEZXNjcmlwdG9ycyBhbmQgUmVzb3VyY2UgRGVmaW5pdGlvbnMuICBUeXBpY2FsbHksIFRlYW0gUHJvZmlsZXMgYXJlIGRlZmluZWQgb24gdGhlIGxldmVsIG9mIEl0ZXJhdGlvbnMgb3IgUGhhc2VzIG9yIG90aGVyIGhpZ2hlci1sZXZlbCBBY3Rpdml0eS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlRlYW1Qcm9maWxlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJncm91cDIiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FRmVhdHVyZU1hcEVudHJ5Ij4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJncm91cCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJncm91cDozMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyb2xlIiB1bmlxdWU9ImZhbHNlIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciIHZvbGF0aWxlPSJ0cnVlIgotICAgICAgICB0cmFuc2llbnQ9InRydWUiIGRlcml2ZWQ9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUm9sZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Imdyb3VwIiB2YWx1ZT0iI2dyb3VwOjMwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InN1cGVyVGVhbSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIgotICAgICAgICB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlN1cGVyVGVhbSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Imdyb3VwIiB2YWx1ZT0iI2dyb3VwOjMwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InN1YlRlYW0iIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIKLSAgICAgICAgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJTdWJUZWFtIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZ3JvdXAiIHZhbHVlPSIjZ3JvdXA6MzAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iVGVtcGxhdGUiIGVTdXBlclR5cGVzPSIjLy9HdWlkYW5jZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBzcGVjaWZpYyB0eXBlIG9mIGd1aWRhbmNlIHRoYXQgcHJvdmlkZXMgZm9yIGEgd29yayBwcm9kdWN0IGEgcHJlLWRlZmluZWQgdGFibGUgb2YgY29udGVudHMsIHNlY3Rpb25zLCBwYWNrYWdlcywgYW5kL29yIGhlYWRpbmdzLCBhIHN0YW5kYXJkaXplZCBmb3JtYXQsIGFzIHdlbGwgYXMgZGVzY3JpcHRpb25zIGhvdyB0aGUgc2VjdGlvbnMgYW5kIHBhY2thZ2VzIGFyZSBzdXBwb3NlZCB0byBiZSB1c2VkIGFuZCBjb21wbGV0ZWQuIFRlbXBsYXRlcyBjYW5ub3Qgb25seSBiZSBwcm92aWRlZCBmb3IgZG9jdW1lbnRzLCBidXQgYWxzbyBmb3IgY29uY2VwdHVhbCBtb2RlbHMgb3IgcGh5c2ljYWwgZGF0YSBzdG9yZXMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJUZW1wbGF0ZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iVGVybURlZmluaXRpb24iIGVTdXBlclR5cGVzPSIjLy9HdWlkYW5jZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBzcGVjaWZpYyB0eXBlIG9mIGd1aWRhbmNlIHRoYXQgZGVmaW5lcyBjb25jZXB0cyBhbmQgYXJlIHVzZWQgdG8gYnVpbGQgdXAgdGhlIEdsb3NzYXJ5LiBUZXJtRGVmaW5pdGlvbnMgYXJlIG5vdCBkaXJlY3RseSByZWxhdGVkIHRvIENvbnRlbnRFbGVtZW50cywgYnV0IHRoZWlyIHJlbGF0aW9uc2hpcCBpcyBiZWluZyBkZXJpdmVkIHdoZW4gdGhlIFRlcm0gaXMgdXNlZCBpbiB0aGUgQ29udGVudEVsZW1lbnRzIGRlc2NyaXB0aW9uIHRleHQuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJUZXJtRGVmaW5pdGlvbiIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iVG9vbCIgZVN1cGVyVHlwZXM9IiMvL0NvbnRlbnRDYXRlZ29yeSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBjb250YWluZXIvYWdncmVnYXRlIGZvciBUb29sTWVudG9ycy4gIEl0IGNhbiBhbHNvIHByb3ZpZGUgZ2VuZXJhbCBkZXNjcmlwdGlvbnMgb2YgdGhlIHRvb2wgYW5kIGl0cyBnZW5lcmFsIGNhcGFiaWxpdGllcy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlRvb2wiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Imdyb3VwMiIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VGZWF0dXJlTWFwRW50cnkiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9Imdyb3VwIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Imdyb3VwOjI0Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InRvb2xNZW50b3IiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIKLSAgICAgICAgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJUb29sTWVudG9yIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZ3JvdXAiIHZhbHVlPSIjZ3JvdXA6MjQiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iVG9vbE1lbnRvciIgZVN1cGVyVHlwZXM9IiMvL0d1aWRhbmNlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBICBzcGVjaWZpYyB0eXBlIG9mIGd1aWRhbmNlIHRoYXQgc2hvd3MgaG93IHRvIHVzZSBhIHNwZWNpZmljIHRvb2wgdG8gYWNjb21wbGlzaCBzb21lIHBpZWNlIG9mIHdvcmsgYSBXb3JrIFByb2R1Y3QgZWl0aGVyIGluIHRoZSBjb250ZXh0IG9mIG9yIGluZGVwZW5kZW50IGZyb20gYSBUYXNrIG9yIEFjdGl2aXR5LiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVG9vbE1lbnRvciIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVFbnVtIiBuYW1lPSJWYXJpYWJpbGl0eVR5cGUiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkFuIEVudW1lcmF0aW9uIHVzZWQgZm9yIHZhbHVlcyBmb3IgaW5zdGFuY2VzIG9mIFZhcmlhYmlsaXR5IEVsZW1lbnQncyBhdHRyaWJ1dGUgdmFyaWFiaWxpdHlUeXBlLiAgSXQgZGVmaW5lcyB0aGUgbmF0dXJlIG9mIGhvdyBhIFZhcmlhYmlsaXR5IEVsZW1lbnQgZXh0ZW5kcyBhbm90aGVyIFZhcmlhYmlsaXR5IEVsZW1lbnQuIFNlZSBlbnVtZXJhdGlvbiBsaXRlcmFscyBmb3IgZGVmaW5pdGlvbnMgZm9yIGVhY2ggdHlwZS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlZhcmlhYmlsaXR5VHlwZSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0ibmEiLz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9ImNvbnRyaWJ1dGVzIiB2YWx1ZT0iMSIvPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iZXh0ZW5kcyIgdmFsdWU9IjIiLz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9InJlcGxhY2VzIiB2YWx1ZT0iMyIvPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0ibG9jYWxDb250cmlidXRpb24iIHZhbHVlPSI0Ii8+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJsb2NhbFJlcGxhY2VtZW50IiB2YWx1ZT0iNSIvPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iZXh0ZW5kc1JlcGxhY2VzIiB2YWx1ZT0iNiIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJWYXJpYWJpbGl0eVR5cGVPYmplY3QiIGluc3RhbmNlQ2xhc3NOYW1lPSJvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRW51bWVyYXRvciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJWYXJpYWJpbGl0eVR5cGU6T2JqZWN0Ii8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iVmFyaWFiaWxpdHlUeXBlIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IldoaXRlcGFwZXIiIGVTdXBlclR5cGVzPSIjLy9Db25jZXB0Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIHNwZWNpYWwgQ29uY2VwdCBndWlkYW5jZSB0aGF0IGhhdmUgYmVlbiBleHRlcm5hbGx5IHJldmlld2VkIG9yIHB1Ymxpc2hlZCBhbmQgY2FuIGJlIHJlYWQgYW5kIHVuZGVyc3Rvb2QgaW4gaXNvbGF0aW9uIG9mIG90aGVyIGNvbnRlbnQgZWxlbWVudHMgYW5kIGd1aWRhbmNlLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iV2hpdGVwYXBlciIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iV29ya0JyZWFrZG93bkVsZW1lbnQiIGVTdXBlclR5cGVzPSIjLy9CcmVha2Rvd25FbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIHNwZWNpYWwgQnJlYWtkb3duIEVsZW1lbnQgdGhhdCBwcm92aWRlcyBzcGVjaWZpYyBwcm9wZXJ0aWVzIGZvciBCcmVha2Rvd24gRWxlbWVudHMgdGhhdCByZXByZXNlbnQgb3IgcmVmZXIgdG8gV29yayBEZWZpbml0aW9ucy4gIEZvciBleGFtcGxlIGl0cyBzdWJjbGFzcyBBY3Rpdml0eSBkZWZpbmVzIHdvcmsgYXMgaXQgaXMgYWxzbyBhIHN1YmNsYXNzIG9mIFdvcmsgRGVmaW5pdGlvbi4gIEl0cyBzdWJjbGFzcyBUYXNrIERlc2NyaXB0b3IgZG9lcyBub3QgZGVmaW5lIHdvcmsgYnkgaXRzZWxmLCBidXQgcmVmZXJzIHRvIGEgV29yayBEZWZpbml0aW9uIGFuZCB0aGVyZWZvcmUgY2FuIGhhdmUgdGhlIHNhbWUgY29tbW9uIHByb3BlcnRpZXMgYW5kIFdvcmsgQnJlYWtkb3duIEVsZW1lbnQgaGFzLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iV29ya0JyZWFrZG93bkVsZW1lbnQiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Imdyb3VwMiIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VGZWF0dXJlTWFwRW50cnkiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9Imdyb3VwIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Imdyb3VwOjMwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InByZWRlY2Vzc29yIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL1dvcmtPcmRlciIgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIgY29udGFpbm1lbnQ9InRydWUiCi0gICAgICAgIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJQcmVkZWNlc3NvciIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Imdyb3VwIiB2YWx1ZT0iI2dyb3VwOjMwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImlzRXZlbnREcml2ZW4iIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBpc0V2ZW50RHJpdmVuIGF0dHJpYnV0ZSBpbmRpY2F0ZXMgdGhhdCB0aGUgUHJvY2VzcyBXb3JrIERlZmluaXRpb24gZGVzY3JpYmVzIGFuIGluc3RhbmNlIG9mIHdvcmsgd2hpY2ggaXMgbm90IHN0YXJ0ZWQgYmVjYXVzZSBpdCBoYXMgYmVlbiBzY2hlZHVsZWQgdG8gc3RhcnQgYXQgYSBjZXJ0YWluIHBvaW50IG9mIHRpbWUsIGJlY2F1c2UgcHJlY2VkaW5nIHdvcmsgaXMgYmVpbmcgY29tcGxldGVkLCBvciBpbnB1dCB3b3JrIHByb2R1Y3RzIGFyZSBhdmFpbGFibGUsIGJ1dCBiZWNhdXNlIGFub3RoZXIgc3BlY2lmaWMgZXZlbnQgaGFzIG9jY3VycmVkLiAgRXhhbXBsZXMgZm9yIHN1Y2ggZXZlbnRzIGFyZSBleGNlcHRpb25zIG9yIHByb2JsZW0gc2l0dWF0aW9ucyB3aGljaCByZXF1aXJlIHNwZWNpZmljIHdvcmsgdG8gYmUgcGVyZm9ybWVkIGFzIGEgcmVzdWx0LiAgQWxzbyBjaGFuZ2UgbWFuYWdlbWVudCB3b3JrIGNhbiBiZSBtb2RlbGVkIGFzIGV2ZW50IGRyaXZlbiB3b3JrIGFuYWx5emluZyBhIGNoYW5nZSByZXF1ZXN0IG9yIGRlZmVjdCBhbmQgYWxsb2NhdGluZyB3b3JrIGR5bmFtaWNhbGx5IHRvIHJlc291cmNlcyB0byBkZWFsIHdpdGggaXQgZm9sbG93aW5nIHRoZSB3b3JrIGRlc2NyaWJlZCB3aXRoIHN1Y2ggUHJvY2VzcyBXb3JrIERlZmluaXRpb24uICBUaGUgZXZlbnRzIHRoZW1zZWx2ZXMgYXJlIG5vdCBtb2RlbGVkIGluIHRoaXMgdmVyc2lvbiBvZiB0aGUgc3BlY2lmaWNhdGlvbi4gIFRoZXkgc2hhbGwgYmUgZGVzY3JpYmVkIGFzIHBhcnQgb2YgdGhlIG5vcm1hbCBkZXNjcmlwdGlvbnMgZmllbGRzIGF2YWlsYWJsZS4mI3hEOyYjeEE7Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJhdHRyaWJ1dGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iaXNFdmVudERyaXZlbiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpc09uZ29pbmciIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IklmIHRoZSBpc09uZ29pbmcgYXR0cmlidXRlIGlzIHNldCB0byBUcnVlIGZvciBhIFByb2Nlc3MgV29yayBEZWZpbml0aW9uIGluc3RhbmNlLCB0aGVuIHRoZSBlbGVtZW50IGRlc2NyaWJlcyBhbiBvbmdvaW5nIHBpZWNlIG9mIHdvcmsgd2l0aG91dCBhIGZpeGVkIGR1cmF0aW9uIG9yIGVuZCBzdGF0ZS4gIEZvciBleGFtcGxlLCB0aGUgUHJvY2VzcyBXb3JrIERlZmluaXRpb24gY291bGQgcmVwcmVzZW50IHdvcmsgb2YgYW4gYWRtaW5pc3RyYXRvciBjb250aW51b3VzbHkgKGUuZy4gM2ggYSBkYXkpIHdvcmtpbmcgdG8gZW5zdXJlIHRoYXQgc3lzdGVtcyBhcmUga2VwdCBpbiBhIGNlcnRhaW4gc3RhdGUuICBBbm90aGVyIGV4YW1wbGUgd291bGQgYmUgcHJvZ3JhbSBtYW5hZ2VtZW50IHdvcmsgb3ZlcnNlZWluZyBtYW55IGRpZmZlcmVudCBwcm9qZWN0cyBiZWluZyBzY2hlZHVsZWQgZm9yIG9uZSBwYXJ0aWN1bGFyIHByb2plY3QgYXQgc3BlY2lmaWMgcmVvY2N1cnJpbmcgaW50ZXJ2YWxzIGR1cmluZyB0aGUgd2hvbGUgbGlmZWN5Y2xlIG9mIHRoZSBwcm9qZWN0LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iYXR0cmlidXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9ImlzT25nb2luZyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpc1JlcGVhdGFibGUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoaXMgYXR0cmlidXRlIGlzIHVzZWQgdG8gZGVmaW5lIHJlcGV0aXRpb24gb2Ygd29yaywgZS5nLiBpdGVyYXRpb25zLiAgQSBQcm9jZXNzIFdvcmsgRGVmaW5pdGlvbiB3aXRoIHRoaXMgYXR0cmlidXRlIHNldCB0byBUcnVlIHNoYWxsIGJlIHJlcGVhdGVkIG1vcmUgdGhhbiBvbmNlIG9uIHRoZSBzYW1lIHNldCBvZiBhcnRpZmFjdHMuICBGb3IgZXhhbXBsZSwgZm9yIGFuIGluc3RhbmNlIG9mIEl0ZXJhdGlvbiAoZGVmaW5lZCBhcyBhIHNwZWNpYWwgUHJvY2VzcyBXb3JrIERlZmluaXRpb24gYmVsb3cpIHRoaXMgYXR0cmlidXRlIGlzIHNldCB0byBUcnVlIGJ5IGRlZmF1bHQgaW5kaWNhdGluZyB0aGF0IGV2ZXJ5IHN1Yi1BY3Rpdml0eSB3aWxsIGJlIHJlcGVhdGVkIG1vcmUgdGhhbiBvbmNlLiAgSG93ZXZlciwgYW55IFByb2Nlc3MgV29yayBEZWZpbml0aW9uIGNhbiBzZXQgdGhpcyBhdHRyaWJ1dGUgdG8gVHJ1ZSB0byBkZWZpbmUgaXRlcmF0aW9ucyAoZS5nLiB0byBpdGVyYXRlIG9uZSBBY3Rpdml0eSBjb25zaXN0aW5nIG9mIG1hbnkgc3ViLWFjdGl2aXRpZXMgb3IgZXZlbiBQaGFzZXMsIGJ1dCB0byBpdGVyYXRlIGp1c3Qgb25lIFRhc2spLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iYXR0cmlidXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9ImlzUmVwZWF0YWJsZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJXb3JrRGVmaW5pdGlvbiIgZVN1cGVyVHlwZXM9IiMvL01ldGhvZEVsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkFuIGFic3RyYWN0IE1ldGhvZCBFbGVtZW50IHRoYXQgZ2VuZXJhbGl6ZXMgYWxsIGRlc2NyaXB0aW9ucyBvZiB3b3JrIHdpdGhpbiB0aGUgVW5pZmllZCBNZXRob2QgQXJjaGl0ZWN0dXJlLiAgVGhpcyBwYWNrYWdlIGludHJvZHVjZXMgdHdvIGNvbmNyZXRlIHR5cGVzIG9mIFdvcmsgRGVmaW5pdGlvbnM6IFRhc2sgYW5kIFN0ZXAuICBXb3JrIERlZmluaXRpb25zIGNhbiBjb250YWluIHNldHMgb2YgcHJlLSBhbmQgcG9zdC1jb25kaXRpb25zIGRlZmluaW5nIGNvbnN0cmFpbnRzIHRoYXQgbmVlZCB0byBiZSB2YWxpZCBiZWZvcmUgdGhlIGRlc2NyaWJlZCB3b3JrIGNhbiBiZWdpbiBvciBiZWZvcmUgaXQgY2FuIGJlIGRlY2xhcmVkIGFzIGZpbmlzaGVkLiAgTm90ZSB0aGF0IGdlbmVyYWwgb3duZWRSdWxlcyBjYW4gYmUgdXNlZCB0byBkZWZpbmUgYWRkaXRpb25hbCBjb25zdHJhaW50cyBhbmQgcnVsZXMgZm9yIFdvcmsgRGVmaW5pdGlvbnMuJiN4RDsmI3hBO1dvcmsgRGVmaW5pdGlvbnMgcmVwcmVzZW50IGJlaGF2aW9yYWwgZGVzY3JpcHRpb25zIGZvciBkb2luZyB3b3JrLiAgVGhlc2UgYmVoYXZpb3JhbCBkZXNjcmlwdGlvbnMgYXJlIG5vdCBib3VuZCB0byBvbmUgc3BlY2lmaWMgY2xhc3NpZmllciwgYnV0IHJlcHJlc2VudCBhbiBhcmJpdHJhcnkgZGVmaW5pdGlvbiBvZiB3b3JrLiAgRm9yIGV4YW1wbGUsIGEgV29yayBEZWZpbml0aW9uIGNvdWxkIHJlcHJlc2VudCB3b3JrIHRoYXQgaXMgYmVpbmcgcGVyZm9ybWVkIGJ5IGEgc3BlY2lmaWMgUm9sZSAoZS5nLiBhIFJvbGUgcGVyZm9ybWluZyBhIHNwZWNpZmljIFRhc2sgb3IgU3RlcHMgb2YgYSBUYXNrKSwgYnkgbWFueSBSb2xlcyB3b3JraW5nIGluIGNsb3NlIGNvbGxhYm9yYXRpb24gKG1hbnkgUm9sZXMgYWxsIHdvcmtpbmcgdG9nZXRoZXIgb24gdGhlIHNhbWUgaW50ZXJkaXNjaXBsaW5hcnkgVGFzayksIG9yIGNvbXBsZXggd29yayB0aGF0IGlzIHBlcmZvcm1lZCB0aHJvdWdob3V0IHRoZSBsaWZlY3ljbGUgKGUuZy4gYSBwcm9jZXNzIGRlZmluaW5nIGEgYnJlYWtkb3duIHN0cnVjdHVyZSBmb3Igb3JnYW5pemluZyBsYXJnZXIgY29tcG9zaXRlIHVuaXRzIG9mIHdvcmsgcGVyZm9ybWVkIGJ5IG1hbnkgUm9sZXMgd29ya2luZyBpbiBjb2xsYWJvcmF0aW9uKS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IldvcmtEZWZpbml0aW9uIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwcmVjb25kaXRpb24iIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlByZWNvbmRpdGlvbiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwb3N0Y29uZGl0aW9uIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJQb3N0Y29uZGl0aW9uIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IldvcmtPcmRlciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iUmVwcmVzZW50cyBhIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHR3byBCcmVha2Rvd24gRWxlbWVudHMgaW4gd2hpY2ggb25lIEJyZWFrZG93biBFbGVtZW50cyBkZXBlbmRzIG9uIHRoZSBzdGFydCBvciBmaW5pc2ggb2YgYW5vdGhlciBCcmVha2Rvd24gRWxlbWVudHMgaW4gb3JkZXIgdG8gYmVnaW4gb3IgZW5kLiAgJiN4RDsmI3hBO1RoZSBXb3JrIE9yZGVyIGNsYXNzIGRlZmluZXMgcHJlZGVjZXNzb3IgYW5kIHN1Y2Nlc3NvciByZWxhdGlvbnMgYW1vbmdzdCBCcmVha2Rvd24gRWxlbWVudHMuICBUaGlzIGluZm9ybWF0aW9uIGlzIGluIHBhcnRpY3VsYXIgY3JpdGljYWwgZm9yIHBsYW5uaW5nIGFwcGxpY2F0aW9ucy4gIFNlZSBtb3JlIGRldGFpbHMgb24gZGlmZmVyZW50IHR5cGVzIG9mIFdvcmsgT3JkZXIgcmVsYXRpb25zaGlwcyBhdCBXb3JrIE9yZGVyIFR5cGUuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJXb3JrT3JkZXIiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9InNpbXBsZSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ2YWx1ZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IjowIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9InNpbXBsZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpZCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJEZWZpbmVzIGEgZ2xvYmFsIHVuaXF1ZSBpZCBmb3IgYSB3b3JrIG9yZGVyLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iYXR0cmlidXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9ImlkIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImxpbmtUeXBlIiBlVHlwZT0iIy8vV29ya09yZGVyVHlwZSIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmluaXNoVG9TdGFydCIgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoaXMgYXR0cmlidXRlIGV4cHJlc3NlcyB0aGUgdHlwZSBvZiB0aGUgV29yayBPcmRlciByZWxhdGlvbnNoaXAgYnkgYXNzaWduaW5nIGEgdmFsdWUgZnJvbSB0aGUgV29yayBPcmRlciBUeXBlIGVudW1lcmF0aW9uLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iYXR0cmlidXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9ImxpbmtUeXBlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRW51bSIgbmFtZT0iV29ya09yZGVyVHlwZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iUmVwcmVzZW50cyBhIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHR3byBCcmVha2Rvd24gRWxlbWVudCBpbiB3aGljaCBvbmUgQnJlYWtkb3duIEVsZW1lbnQgZGVwZW5kcyBvbiB0aGUgc3RhcnQgb3IgZmluaXNoIG9mIGFub3RoZXIgQnJlYWtkb3duIEVsZW1lbnQgaW4gb3JkZXIgdG8gYmVnaW4gb3IgZW5kLiBUaGlzIGVudW1lcmF0aW9uIGRlZmluZXMgdGhlIGRpZmZlcmVudCB0eXBlcyBvZiBXb3JrIE9yZGVyIHJlbGF0aW9uc2hpcHMgYXZhaWxhYmxlIGluIFVNQSBhbmQgaXMgdXNlZCB0byBwcm92aWRlIHZhbHVlcyBmb3IgV29yayBPcmRlcidzIGxpbmtUeXBlIGF0dHJpYnV0ZS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IldvcmtPcmRlclR5cGUiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9ImZpbmlzaFRvU3RhcnQiLz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9ImZpbmlzaFRvRmluaXNoIiB2YWx1ZT0iMSIvPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0ic3RhcnRUb1N0YXJ0IiB2YWx1ZT0iMiIvPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0ic3RhcnRUb0ZpbmlzaCIgdmFsdWU9IjMiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iV29ya09yZGVyVHlwZU9iamVjdCIgaW5zdGFuY2VDbGFzc05hbWU9Im9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FbnVtZXJhdG9yIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IldvcmtPcmRlclR5cGU6T2JqZWN0Ii8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iV29ya09yZGVyVHlwZSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJXb3JrUHJvZHVjdCIgZVN1cGVyVHlwZXM9IiMvL0NvbnRlbnRFbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBbiBhYnN0cmFjdCBjbGFzcyB3aGljaCBwcm92aWRlcyBhIGdlbmVyYWxpemF0aW9uIGZvciB0aGUgY29udGVudCBlbGVtZW50IHR5cGVzIEFydGlmYWN0LCBPdXRjb21lLCBhbmQgRGVsaXZlcmFibGUuICBUaGUgbWV0YS1tb2RlbCBjbGFzcyBXb3JrIFByb2R1Y3QgYWN0dWFsbHkgcmVwcmVzZW50cyB3b3JrIHByb2R1Y3QgdHlwZXMsIGkuZS4gYW4gaW5zdGFuY2Ugb2YgV29yayBQcm9kdWN0IGlzIGEgZGVzY3JpcHRpb24gb2YgYSBzcGVjaWZpYyB0eXBlIG9mIHdvcmsgcHJvZHVjdCBhbmQgbm90IGFuIGluZGl2aWR1YWwgd29yayBwcm9kdWN0IGluc3RhbmNlLiAgSG93ZXZlciwgZm9yIHNpbXBsaWNpdHkgcmVhc29ucyBhbmQgYmVjYXVzZSBvZiBsb3cgcmlzayBvZiBtaXNpbnRlcnByZXRhdGlvbiB3ZSBkaWQgbm90IGFwcGVuZCB0aGUgd29yZCAndHlwZScgdG8gZXZlcnkgbWV0YS1jbGFzcy4mI3hEOyYjeEE7QSB3b3JrIHByb2R1Y3QgaXMgYW4gYWJzdHJhY3Rpb24gZm9yIGRlc2NyaXB0aW9ucyBvZiBjb250ZW50IGVsZW1lbnRzIHRoYXQgYXJlIHVzZWQgdG8gZGVmaW5lIGFueXRoaW5nIHVzZWQsIHByb2R1Y2VkLCBvciBtb2RpZmllZCBieSBhIHRhc2suIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJXb3JrUHJvZHVjdCIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZ3JvdXAyIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUZlYXR1cmVNYXBFbnRyeSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZ3JvdXAiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iZ3JvdXA6MjQiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZXN0aW1hdGUiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIKLSAgICAgICAgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJFc3RpbWF0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Imdyb3VwIiB2YWx1ZT0iI2dyb3VwOjI0Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImVzdGltYXRpb25Db25zaWRlcmF0aW9ucyIKLSAgICAgICAgdW5pcXVlPSJmYWxzZSIgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIgotICAgICAgICB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkVzdGltYXRpb25Db25zaWRlcmF0aW9ucyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Imdyb3VwIiB2YWx1ZT0iI2dyb3VwOjI0Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJlcG9ydCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIgotICAgICAgICB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlJlcG9ydCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Imdyb3VwIiB2YWx1ZT0iI2dyb3VwOjI0Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InRlbXBsYXRlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciCi0gICAgICAgIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIGRlcml2ZWQ9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVGVtcGxhdGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJncm91cCIgdmFsdWU9IiNncm91cDoyNCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ0b29sTWVudG9yIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciCi0gICAgICAgIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIGRlcml2ZWQ9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVG9vbE1lbnRvciIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Imdyb3VwIiB2YWx1ZT0iI2dyb3VwOjI0Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IldvcmtQcm9kdWN0RGVzY3JpcHRpb24iIGVTdXBlclR5cGVzPSIjLy9Db250ZW50RGVzY3JpcHRpb24iPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgZ2VuZXJhbGl6ZWQgQ29udGVudCBEZXNjcmlwdGlvbiB0aGF0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIHRleHR1YWwgZGVzY3JpcHRpb24gZm9yIGEgV29yayBQcm9kdWN0LiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iV29ya1Byb2R1Y3REZXNjcmlwdGlvbiIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaW1wYWN0T2ZOb3RIYXZpbmciIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRGVzY3JpYmVzIHRoZSBjb25zZXF1ZW5jZXMgb2Ygbm90IHByb2R1Y2luZyB0aGUgd29yayBwcm9kdWN0LiAgVGhpcyBpcyBpbnRlbmRlZCB0byBhaWQgaW4gdGhlIHRhaWxvcmluZyB0aGUgbWV0aG9kL3Byb2Nlc3MgdG8gdGhlIG5lZWRzIG9mIGEgc3BlY2lmaWMgcHJvamVjdC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iSW1wYWN0T2ZOb3RIYXZpbmciLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icHVycG9zZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJEZXNjcmliZXMgd2h5IHRoZSB3b3JrIHByb2R1Y3QgaXMgcHJvZHVjZWQgYW5kIHRvIHdoYXQgdXNlIGl0IHdpbGwgYmUgcHV0LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJQdXJwb3NlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJlYXNvbnNGb3JOb3ROZWVkaW5nIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkRlc2NyaWJlcyB0aGUgY2lyY3Vtc3RhbmNlcyBpbiB3aGljaCBpdCBpcyByZWFzb25hYmxlIG5vdCB0byBwcm9kdWNlIHRoZSB3b3JrIHByb2R1Y3QuICBUaGlzIGlzIGludGVuZGVkIHRvIGFpZCBpbiB0aGUgdGFpbG9yaW5nIG9mIHRoZSBtZXRob2QvcHJvY2VzcyB0byB0aGUgbmVlZHMgb2YgYSBzcGVjaWZpYyBwcm9qZWN0LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJSZWFzb25zRm9yTm90TmVlZGluZyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJXb3JrUHJvZHVjdERlc2NyaXB0b3IiIGVTdXBlclR5cGVzPSIjLy9EZXNjcmlwdG9yIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIHNwZWNpYWwgRGVzY3JpcHRvciB0aGF0IHJlcHJlc2VudHMgYSBXb3JrIFByb2R1Y3QgaW4gdGhlIGNvbnRleHQgb2Ygb25lIHNwZWNpZmljIEFjdGl2aXR5LiAgRXZlcnkgYnJlYWtkb3duIHN0cnVjdHVyZSBjYW4gZGVmaW5lIGRpZmZlcmVudCByZWxhdGlvbnNoaXBzIG9mIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9ycyB0byBUYXNrIERlc2NyaXB0b3JzIGFuZCBSb2xlIERlc2NyaXB0b3JzLiAgVGhlcmVmb3JlIG9uZSBXb3JrIFByb2R1Y3QgY2FuIGJlIHJlcHJlc2VudGVkIGJ5IG1hbnkgV29yayBQcm9kdWN0IERlc2NyaXB0b3JzIGVhY2ggd2l0aGluIHRoZSBjb250ZXh0IG9mIGFuIEFjdGl2aXR5IHdpdGggaXRzIG93biBzZXQgb2YgcmVsYXRpb25zaGlwcy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IldvcmtQcm9kdWN0RGVzY3JpcHRvciIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0id29ya1Byb2R1Y3QiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IldvcmtQcm9kdWN0Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJlc3BvbnNpYmxlUm9sZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUmVzcG9uc2libGVSb2xlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Imdyb3VwMiIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VGZWF0dXJlTWFwRW50cnkiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9Imdyb3VwIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Imdyb3VwOjMzIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImV4dGVybmFsSW5wdXRUbyIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIgotICAgICAgICB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkV4dGVybmFsSW5wdXRUbyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Imdyb3VwIiB2YWx1ZT0iI2dyb3VwOjMzIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImltcGFjdGVkQnkiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIKLSAgICAgICAgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJJbXBhY3RlZEJ5Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZ3JvdXAiIHZhbHVlPSIjZ3JvdXA6MzMiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaW1wYWN0cyIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIgotICAgICAgICB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkltcGFjdHMiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJncm91cCIgdmFsdWU9IiNncm91cDozMyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJtYW5kYXRvcnlJbnB1dFRvIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciCi0gICAgICAgIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIGRlcml2ZWQ9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTWFuZGF0b3J5SW5wdXRUbyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Imdyb3VwIiB2YWx1ZT0iI2dyb3VwOjMzIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im9wdGlvbmFsSW5wdXRUbyIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIgotICAgICAgICB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik9wdGlvbmFsSW5wdXRUbyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Imdyb3VwIiB2YWx1ZT0iI2dyb3VwOjMzIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im91dHB1dEZyb20iIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIKLSAgICAgICAgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJPdXRwdXRGcm9tIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZ3JvdXAiIHZhbHVlPSIjZ3JvdXA6MzMiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZGVsaXZlcmFibGVQYXJ0cyIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIgotICAgICAgICB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkRlbGl2ZXJhYmxlUGFydHMiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJncm91cCIgdmFsdWU9IiNncm91cDozMyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhY3Rpdml0eUVudHJ5U3RhdGUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iR2l2ZW4gdGhhdCBhbiBpbnN0YW5jZSBvZiBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvciBoYXMgYmVlbiBjcmVhdGVkIGZvciBhIHNwZWNpZmljIEFjdGl2aXR5LCB0aGVuIHRoZSBBY3Rpdml0eSBFbnRyeSBTdGF0ZSBhdHRyaWJ1dGUgc3BlY2lmaWVzIHRoZSBkZXNpcmVkIHN0YXRlIG9mIGluc3RhbmNlcyBvZiB0aGUgcmVmZXJlbmNlZCBXb3JrIFByb2R1Y3Qgd2hlbiB3b3JrIG9uIHRoZSBBY3Rpdml0eSBpcyBpbml0aWF0ZWQgKGkuZS4gd29yayBvbiB0aGUgQWN0aXZpdHkncyBUYXNrIERlc2NyaXB0b3JzIGlzIGJlaW5nIGluaXRpYXRlZCB0aGF0IHVzZSB0aGlzIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9yIGFzIGlucHV0KS4gICYjeEQ7JiN4QTtGb3Igc29tZSBXb3JrIFByb2R1Y3RzIHN0YXRlIGlzIGV4cHJlc3NlZCBpbiBwZXJjZW50YWdlIG9mIGNvbXBsZXRpb24sIGNvbXBsaWFuY2UgdG8gd29yayBwcm9kdWN0IGNoZWNrbGlzdCwgaW5mb3JtYWwgc3RhdGUgZGVzY3JpcHRpb25zLCBldGMuICBPdGhlcnMgaGF2ZSB2ZXJ5IHNwZWNpZmljIHN0YXRlcyBleHByZXNzZWQgYXMgZW51bWVyYXRpb25zIHN1Y2ggYXMgW2lkZW50aWZpZWQsIGJyaWVmbHkgZGVzY3JpYmVkLCBvdXRsaW5lZCwgZGV0YWlsZWRdIGZvciB1c2UgY2FzZXMuICBPdGhlciBXb3JrIFByb2R1Y3Qgc3RhdGVzIHJlbGF0ZSB0byBzb21lIHF1YWxpdHkgbWVhc3VyZXMgb3IgbGlmZWN5Y2xlIHN0YXRlcyBzdWNoIGFzIFtyZXZpZXdlZCwgaW1wbGVtZW50ZWQsIHRlc3RlZF0uIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJhdHRyaWJ1dGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iYWN0aXZpdHlFbnRyeVN0YXRlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFjdGl2aXR5RXhpdFN0YXRlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkdpdmVuIHRoYXQgYW4gaW5zdGFuY2Ugb2YgV29yayBQcm9kdWN0IERlc2NyaXB0b3IgaGFzIGJlZW4gY3JlYXRlZCBmb3IgYSBzcGVjaWZpYyBBY3Rpdml0eSwgdGhlbiB0aGUgQWN0aXZpdHkgRXhpc3QgU3RhdGUgYXR0cmlidXRlIHNwZWNpZmllcyB0aGUgZGVzaXJlZCBzdGF0ZSBvZiBpbnN0YW5jZXMgb2YgdGhlIHJlZmVyZW5jZWQgV29yayBQcm9kdWN0IHdoZW4gd29yayBvbiB0aGUgQWN0aXZpdHkgaXMgZmluaXNoZWQgKGkuZS4gd29yayBvbiB0aGUgQWN0aXZpdHkncyBUYXNrIERlc2NyaXB0b3JzIGhhcyBmaW5pc2hlZCB0aGF0IGhhdmUgdGhpcyBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvciBhcyBvdXRwdXQpLiYjeEQ7JiN4QTtGb3Igc29tZSBXb3JrIFByb2R1Y3RzIHN0YXRlIGlzIGV4cHJlc3NlZCBpbiBwZXJjZW50YWdlIG9mIGNvbXBsZXRpb24sIGNvbXBsaWFuY2UgdG8gd29yayBwcm9kdWN0IGNoZWNrbGlzdCwgaW5mb3JtYWwgc3RhdGUgZGVzY3JpcHRpb25zLCBldGMuICBPdGhlcnMgaGF2ZSB2ZXJ5IHNwZWNpZmljIHN0YXRlcyBleHByZXNzZWQgYXMgZW51bWVyYXRpb25zIHN1Y2ggYXMgW2lkZW50aWZpZWQsIGJyaWVmbHkgZGVzY3JpYmVkLCBvdXRsaW5lZCwgZGV0YWlsZWRdIGZvciB1c2UgY2FzZXMuICBPdGhlciBXb3JrIFByb2R1Y3Qgc3RhdGVzIHJlbGF0ZSB0byBzb21lIHF1YWxpdHkgbWVhc3VyZXMgb3IgbGlmZWN5Y2xlIHN0YXRlcyBzdWNoIGFzIFtyZXZpZXdlZCwgaW1wbGVtZW50ZWQsIHRlc3RlZF0uIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJhdHRyaWJ1dGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iYWN0aXZpdHlFeGl0U3RhdGUiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iV29ya1Byb2R1Y3RUeXBlIiBlU3VwZXJUeXBlcz0iIy8vQ29udGVudENhdGVnb3J5Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIHNlY29uZCBjYXRlZ29yeSBmb3Igd29yayBwcm9kdWN0cywgd2hpY2ggaW4gY29udHJhc3QgdG8gRG9tYWluIGlzIG1vcmUgcHJlc2VudGF0aW9uIG9yaWVudGVkLiAgQSB3b3JrIHByb2R1Y3QgY2FuIGhhdmUgbWFueSBXb3JrIFByb2R1Y3QgVHlwZXMuICBFeGFtcGxlcywgZm9yIGEgV29yayBQcm9kdWN0IFR5cGUgaXMgJnF1b3Q7Q2xhc3MgRGlhZ3JhbSZxdW90Oywgd2hpY2ggY2F0ZWdvcml6ZXMgdGhlIEFydGlmYWN0cyBBbmFseXNpcyBNb2RlbCwgRGVzaWduIE1vZGVsLCBVc2VyIEV4cGVyaWVuY2UgTW9kZWwsIG9yICZxdW90O1NwZWNpZmljYXRpb24mcXVvdDssIHdoaWNoIGNhdGVnb3JpemVzIHJlcXVpcmVtZW50cyBzcGVjaWZpY2F0aW9ucyB0aGF0IGRlZmluZSBhIHN5c3RlbSB3aXRoIGEgd2VsbC1kZWZpbmVkIHN5c3RlbSBib3VuZGFyeSwgc3VjaCBhcyB1c2UgY2FzZSBvciBmdW5jdGlvbmFsIHJlcXVpcmVtZW50cyBzcGVjaWZpY2F0aW9uLiAgQSBXb3JrIFByb2R1Y3QgY2FuIGJlIGNhdGVnb3JpemVkIHRvIGJlIG9mIG1hbnkgV29yayBQcm9kdWN0IFR5cGVzLiAgRm9yIGV4YW1wbGUsIGEgdXNlIGNhc2UgbW9kZWwgY2FuIGJlIGNhdGVnb3JpemVkIGFzIGEgU3BlY2lmaWNhdGlvbiBhcyB3ZWxsIGFzIERpYWdyYW0gV29yayBQcm9kdWN0IFR5cGUuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJXb3JrUHJvZHVjdFR5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Imdyb3VwMiIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VGZWF0dXJlTWFwRW50cnkiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9Imdyb3VwIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Imdyb3VwOjI0Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9IndvcmtQcm9kdWN0IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciCi0gICAgICAgIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIGRlcml2ZWQ9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iV29ya1Byb2R1Y3QiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJncm91cCIgdmFsdWU9IiNncm91cDoyNCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLTwvZWNvcmU6RVBhY2thZ2U+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvbW9kZWwvVU1BLmdlbm1vZGVsIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL21vZGVsL1VNQS5nZW5tb2RlbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDJhZmUyZi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvbW9kZWwvVU1BLmdlbm1vZGVsCisrKyAvZGV2L251bGwKQEAgLTEsNDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Z2VubW9kZWw6R2VuTW9kZWwgeG1pOnZlcnNpb249IjIuMCIKLSAgICB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOmVjb3JlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIgotICAgIHhtbG5zOmdlbm1vZGVsPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIiBtb2RlbERpcmVjdG9yeT0iL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYyIKLSAgICBlZGl0RGlyZWN0b3J5PSIvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuZWRpdC9zcmMiIGVkaXRvckRpcmVjdG9yeT0iL29yZy5lY2xpcHNlLmVwZi54bWwudW1hLmVkaXRvci9zcmMiCi0gICAgbW9kZWxQbHVnaW5JRD0ib3JnLmVjbGlwc2UuZXBmLnhtbC51bWEiIHRlbXBsYXRlRGlyZWN0b3J5PSIiIG1vZGVsTmFtZT0iVU1BIiBlZGl0UGx1Z2luQ2xhc3M9Im9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmVkaXQuVU1BRWRpdFBsdWdpbiIKLSAgICBlZGl0b3JQbHVnaW5DbGFzcz0ib3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuZWRpdG9yLlVNQUVkaXRvclBsdWdpbiIgcm9vdEV4dGVuZHNJbnRlcmZhY2U9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5zZG8uRURhdGFPYmplY3QiCi0gICAgcm9vdEV4dGVuZHNDbGFzcz0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnNkby5pbXBsLkVEYXRhT2JqZWN0SW1wbCIgcm9vdEltcGxlbWVudHNJbnRlcmZhY2U9IiIKLSAgICB0ZXN0U3VpdGVDbGFzcz0ib3JnLmVjbGlwc2UuZXBmLnhtbC51bWEudGVzdHMuVU1BQWxsVGVzdHMiIGltcG9ydGVySUQ9Im9yZy5lY2xpcHNlLnhzZC5lY29yZS5pbXBvcnRlciIKLSAgICBjb21wbGlhbmNlTGV2ZWw9IjUuMCI+Ci0gIDxmb3JlaWduTW9kZWw+RVBGX1NjaGVtYV8yMDA4MDEyNzA5NDIueHNkPC9mb3JlaWduTW9kZWw+Ci0gIDxnZW5QYWNrYWdlcyBwcmVmaXg9IlVtYSIgYmFzZVBhY2thZ2U9Im9yZy5lY2xpcHNlLmVwZi54bWwiIHJlc291cmNlPSJYTUwiIGRpc3Bvc2FibGVQcm92aWRlckZhY3Rvcnk9InRydWUiCi0gICAgICBlY29yZVBhY2thZ2U9IlVNQS5lY29yZSMvIj4KLSAgICA8Z2VuRW51bXMgdHlwZVNhZmVFbnVtQ29tcGF0aWJsZT0iZmFsc2UiIGVjb3JlRW51bT0iVU1BLmVjb3JlIy8vVmFyaWFiaWxpdHlUeXBlIj4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0iVU1BLmVjb3JlIy8vVmFyaWFiaWxpdHlUeXBlL25hIi8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9IlVNQS5lY29yZSMvL1ZhcmlhYmlsaXR5VHlwZS9jb250cmlidXRlcyIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJVTUEuZWNvcmUjLy9WYXJpYWJpbGl0eVR5cGUvZXh0ZW5kcyIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJVTUEuZWNvcmUjLy9WYXJpYWJpbGl0eVR5cGUvcmVwbGFjZXMiLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0iVU1BLmVjb3JlIy8vVmFyaWFiaWxpdHlUeXBlL2xvY2FsQ29udHJpYnV0aW9uIi8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9IlVNQS5lY29yZSMvL1ZhcmlhYmlsaXR5VHlwZS9sb2NhbFJlcGxhY2VtZW50Ii8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9IlVNQS5lY29yZSMvL1ZhcmlhYmlsaXR5VHlwZS9leHRlbmRzUmVwbGFjZXMiLz4KLSAgICA8L2dlbkVudW1zPgotICAgIDxnZW5FbnVtcyB0eXBlU2FmZUVudW1Db21wYXRpYmxlPSJmYWxzZSIgZWNvcmVFbnVtPSJVTUEuZWNvcmUjLy9Xb3JrT3JkZXJUeXBlIj4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0iVU1BLmVjb3JlIy8vV29ya09yZGVyVHlwZS9maW5pc2hUb1N0YXJ0Ii8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9IlVNQS5lY29yZSMvL1dvcmtPcmRlclR5cGUvZmluaXNoVG9GaW5pc2giLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0iVU1BLmVjb3JlIy8vV29ya09yZGVyVHlwZS9zdGFydFRvU3RhcnQiLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0iVU1BLmVjb3JlIy8vV29ya09yZGVyVHlwZS9zdGFydFRvRmluaXNoIi8+Ci0gICAgPC9nZW5FbnVtcz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9IlVNQS5lY29yZSMvL1ZhcmlhYmlsaXR5VHlwZU9iamVjdCIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0iVU1BLmVjb3JlIy8vV29ya09yZGVyVHlwZU9iamVjdCIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IlVNQS5lY29yZSMvL0FjdGl2aXR5Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9BY3Rpdml0eS9wcmVjb25kaXRpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9BY3Rpdml0eS9wb3N0Y29uZGl0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL0FjdGl2aXR5L2dyb3VwMyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBVTUEuZWNvcmUjLy9BY3Rpdml0eS9icmVha2Rvd25FbGVtZW50Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vQWN0aXZpdHkvcm9hZG1hcCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL0FjdGl2aXR5L2lzRW5hY3RhYmxlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vQWN0aXZpdHkvdmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL0FjdGl2aXR5L3ZhcmlhYmlsaXR5VHlwZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJVTUEuZWNvcmUjLy9BY3Rpdml0eURlc2NyaXB0aW9uIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9BY3Rpdml0eURlc2NyaXB0aW9uL2FsdGVybmF0aXZlcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL0FjdGl2aXR5RGVzY3JpcHRpb24vaG93VG9TdGFmZiIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL0FjdGl2aXR5RGVzY3JpcHRpb24vcHVycG9zZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJVTUEuZWNvcmUjLy9BcHBsaWNhYmxlTWV0YUNsYXNzSW5mbyI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vQXBwbGljYWJsZU1ldGFDbGFzc0luZm8vaXNQcmltYXJ5RXh0ZW5zaW9uIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IlVNQS5lY29yZSMvL0FydGlmYWN0Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vQXJ0aWZhY3QvZ3JvdXAzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIFVNQS5lY29yZSMvL0FydGlmYWN0L2NvbnRhaW5lZEFydGlmYWN0Ii8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IlVNQS5lY29yZSMvL0FydGlmYWN0RGVzY3JpcHRpb24iPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL0FydGlmYWN0RGVzY3JpcHRpb24vYnJpZWZPdXRsaW5lIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vQXJ0aWZhY3REZXNjcmlwdGlvbi9yZXByZXNlbnRhdGlvbk9wdGlvbnMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9BcnRpZmFjdERlc2NyaXB0aW9uL3JlcHJlc2VudGF0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vQXJ0aWZhY3REZXNjcmlwdGlvbi9ub3RhdGlvbiIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJVTUEuZWNvcmUjLy9CcmVha2Rvd25FbGVtZW50Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9CcmVha2Rvd25FbGVtZW50L3ByZXNlbnRlZEFmdGVyIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vQnJlYWtkb3duRWxlbWVudC9wcmVzZW50ZWRCZWZvcmUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9CcmVha2Rvd25FbGVtZW50L3BsYW5uaW5nRGF0YSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL0JyZWFrZG93bkVsZW1lbnQvc3VwZXJBY3Rpdml0eSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9CcmVha2Rvd25FbGVtZW50L2dyb3VwMSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL0JyZWFrZG93bkVsZW1lbnQvY2hlY2tsaXN0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vQnJlYWtkb3duRWxlbWVudC9jb25jZXB0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vQnJlYWtkb3duRWxlbWVudC9leGFtcGxlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vQnJlYWtkb3duRWxlbWVudC9ndWlkZWxpbmUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9CcmVha2Rvd25FbGVtZW50L3JldXNhYmxlQXNzZXQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9CcmVha2Rvd25FbGVtZW50L3N1cHBvcnRpbmdNYXRlcmlhbCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL0JyZWFrZG93bkVsZW1lbnQvd2hpdGVwYXBlciIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL0JyZWFrZG93bkVsZW1lbnQvaGFzTXVsdGlwbGVPY2N1cnJlbmNlcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL0JyZWFrZG93bkVsZW1lbnQvaXNPcHRpb25hbCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL0JyZWFrZG93bkVsZW1lbnQvaXNQbGFubmVkIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vQnJlYWtkb3duRWxlbWVudC9wcmVmaXgiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iVU1BLmVjb3JlIy8vQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9CcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24vdXNhZ2VHdWlkYW5jZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJVTUEuZWNvcmUjLy9DYXBhYmlsaXR5UGF0dGVybiIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IlVNQS5lY29yZSMvL0NoZWNrbGlzdCIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IlVNQS5lY29yZSMvL0NvbXBvc2l0ZVJvbGUiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9Db21wb3NpdGVSb2xlL2dyb3VwMiIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBVTUEuZWNvcmUjLy9Db21wb3NpdGVSb2xlL2FnZ3JlZ2F0ZWRSb2xlIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IlVNQS5lY29yZSMvL0NvbmNlcHQiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJVTUEuZWNvcmUjLy9Db25zdHJhaW50Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9Db25zdHJhaW50L21haW5EZXNjcmlwdGlvbiIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJVTUEuZWNvcmUjLy9Db250ZW50Q2F0ZWdvcnkiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJVTUEuZWNvcmUjLy9Db250ZW50Q2F0ZWdvcnlQYWNrYWdlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vQ29udGVudENhdGVnb3J5UGFja2FnZS9ncm91cDIiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgVU1BLmVjb3JlIy8vQ29udGVudENhdGVnb3J5UGFja2FnZS9jb250ZW50Q2F0ZWdvcnkiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iVU1BLmVjb3JlIy8vQ29udGVudERlc2NyaXB0aW9uIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9Db250ZW50RGVzY3JpcHRpb24vbWFpbkRlc2NyaXB0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vQ29udGVudERlc2NyaXB0aW9uL2tleUNvbnNpZGVyYXRpb25zIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIFVNQS5lY29yZSMvL0NvbnRlbnREZXNjcmlwdGlvbi9zZWN0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vQ29udGVudERlc2NyaXB0aW9uL2V4dGVybmFsSWQiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iVU1BLmVjb3JlIy8vQ29udGVudEVsZW1lbnQiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9Db250ZW50RWxlbWVudC9ncm91cDEiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9Db250ZW50RWxlbWVudC9jaGVja2xpc3QiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9Db250ZW50RWxlbWVudC9jb25jZXB0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vQ29udGVudEVsZW1lbnQvZXhhbXBsZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL0NvbnRlbnRFbGVtZW50L2d1aWRlbGluZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL0NvbnRlbnRFbGVtZW50L3JldXNhYmxlQXNzZXQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9Db250ZW50RWxlbWVudC9zdXBwb3J0aW5nTWF0ZXJpYWwiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9Db250ZW50RWxlbWVudC93aGl0ZXBhcGVyIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vQ29udGVudEVsZW1lbnQvdmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL0NvbnRlbnRFbGVtZW50L3ZhcmlhYmlsaXR5VHlwZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJVTUEuZWNvcmUjLy9Db250ZW50UGFja2FnZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL0NvbnRlbnRQYWNrYWdlL2dyb3VwMiIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBVTUEuZWNvcmUjLy9Db250ZW50UGFja2FnZS9jb250ZW50RWxlbWVudCIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJVTUEuZWNvcmUjLy9DdXN0b21DYXRlZ29yeSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL0N1c3RvbUNhdGVnb3J5L2dyb3VwMiIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL0N1c3RvbUNhdGVnb3J5L2NhdGVnb3JpemVkRWxlbWVudCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL0N1c3RvbUNhdGVnb3J5L3N1YkNhdGVnb3J5Ii8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IlVNQS5lY29yZSMvL0RlbGl2ZXJhYmxlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vRGVsaXZlcmFibGUvZ3JvdXAzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vRGVsaXZlcmFibGUvZGVsaXZlcmVkV29ya1Byb2R1Y3QiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iVU1BLmVjb3JlIy8vRGVsaXZlcmFibGVEZXNjcmlwdGlvbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vRGVsaXZlcmFibGVEZXNjcmlwdGlvbi9leHRlcm5hbERlc2NyaXB0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vRGVsaXZlcmFibGVEZXNjcmlwdGlvbi9wYWNrYWdpbmdHdWlkYW5jZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJVTUEuZWNvcmUjLy9EZWxpdmVyeVByb2Nlc3MiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9EZWxpdmVyeVByb2Nlc3MvZ3JvdXA0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vRGVsaXZlcnlQcm9jZXNzL2NvbW11bmljYXRpb25zTWF0ZXJpYWwiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9EZWxpdmVyeVByb2Nlc3MvZWR1Y2F0aW9uTWF0ZXJpYWwiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iVU1BLmVjb3JlIy8vRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24iPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uL3NjYWxlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24vcHJvamVjdENoYXJhY3RlcmlzdGljcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uL3Jpc2tMZXZlbCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uL2VzdGltYXRpbmdUZWNobmlxdWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbi9wcm9qZWN0TWVtYmVyRXhwZXJ0aXNlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24vdHlwZU9mQ29udHJhY3QiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iVU1BLmVjb3JlIy8vRGVzY3JpYmFibGVFbGVtZW50Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgVU1BLmVjb3JlIy8vRGVzY3JpYmFibGVFbGVtZW50L3ByZXNlbnRhdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL0Rlc2NyaWJhYmxlRWxlbWVudC9mdWxmaWxsIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vRGVzY3JpYmFibGVFbGVtZW50L2lzQWJzdHJhY3QiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9EZXNjcmliYWJsZUVsZW1lbnQvbm9kZWljb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9EZXNjcmliYWJsZUVsZW1lbnQvc2hhcGVpY29uIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IlVNQS5lY29yZSMvL0Rlc2NyaXB0b3IiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL0Rlc2NyaXB0b3IvaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IlVNQS5lY29yZSMvL0Rlc2NyaXB0b3JEZXNjcmlwdGlvbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vRGVzY3JpcHRvckRlc2NyaXB0aW9uL3JlZmluZWREZXNjcmlwdGlvbiIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJVTUEuZWNvcmUjLy9EaXNjaXBsaW5lIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vRGlzY2lwbGluZS9ncm91cDIiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9EaXNjaXBsaW5lL3Rhc2siLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgVU1BLmVjb3JlIy8vRGlzY2lwbGluZS9zdWJEaXNjaXBsaW5lIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vRGlzY2lwbGluZS9yZWZlcmVuY2VXb3JrZmxvdyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJVTUEuZWNvcmUjLy9EaXNjaXBsaW5lR3JvdXBpbmciPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9EaXNjaXBsaW5lR3JvdXBpbmcvZ3JvdXAyIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vRGlzY2lwbGluZUdyb3VwaW5nL2Rpc2NpcGxpbmUiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iVU1BLmVjb3JlIy8vRG9jdW1lbnRSb290Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vRG9jdW1lbnRSb290L21peGVkIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIFVNQS5lY29yZSMvL0RvY3VtZW50Um9vdC94TUxOU1ByZWZpeE1hcCIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBVTUEuZWNvcmUjLy9Eb2N1bWVudFJvb3QveFNJU2NoZW1hTG9jYXRpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgVU1BLmVjb3JlIy8vRG9jdW1lbnRSb290L21ldGhvZENvbmZpZ3VyYXRpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgVU1BLmVjb3JlIy8vRG9jdW1lbnRSb290L21ldGhvZExpYnJhcnkiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgVU1BLmVjb3JlIy8vRG9jdW1lbnRSb290L21ldGhvZFBsdWdpbiIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJVTUEuZWNvcmUjLy9Eb21haW4iPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9Eb21haW4vZ3JvdXAyIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vRG9tYWluL3dvcmtQcm9kdWN0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIFVNQS5lY29yZSMvL0RvbWFpbi9zdWJkb21haW4iLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iVU1BLmVjb3JlIy8vRWxlbWVudCIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IlVNQS5lY29yZSMvL0VzdGltYXRlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vRXN0aW1hdGUvZ3JvdXAyIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vRXN0aW1hdGUvZXN0aW1hdGlvbk1ldHJpYyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL0VzdGltYXRlL2VzdGltYXRpb25Db25zaWRlcmF0aW9ucyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJVTUEuZWNvcmUjLy9Fc3RpbWF0aW5nTWV0cmljIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iVU1BLmVjb3JlIy8vRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iVU1BLmVjb3JlIy8vRXhhbXBsZSIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IlVNQS5lY29yZSMvL0d1aWRhbmNlIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iVU1BLmVjb3JlIy8vR3VpZGFuY2VEZXNjcmlwdGlvbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vR3VpZGFuY2VEZXNjcmlwdGlvbi9hdHRhY2htZW50Ii8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IlVNQS5lY29yZSMvL0d1aWRlbGluZSIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IlVNQS5lY29yZSMvL0l0ZXJhdGlvbiIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IlVNQS5lY29yZSMvL0tpbmQiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL0tpbmQvYXBwbGljYWJsZU1ldGFDbGFzc0luZm8iLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iVU1BLmVjb3JlIy8vTWV0aG9kQ29uZmlndXJhdGlvbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vTWV0aG9kQ29uZmlndXJhdGlvbi9iYXNlQ29uZmlndXJhdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL01ldGhvZENvbmZpZ3VyYXRpb24vbWV0aG9kUGx1Z2luU2VsZWN0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vTWV0aG9kQ29uZmlndXJhdGlvbi9tZXRob2RQYWNrYWdlU2VsZWN0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vTWV0aG9kQ29uZmlndXJhdGlvbi9kZWZhdWx0VmlldyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL01ldGhvZENvbmZpZ3VyYXRpb24vcHJvY2Vzc1ZpZXciLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9NZXRob2RDb25maWd1cmF0aW9uL3N1YnRyYWN0ZWRDYXRlZ29yeSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL01ldGhvZENvbmZpZ3VyYXRpb24vYWRkZWRDYXRlZ29yeSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJVTUEuZWNvcmUjLy9NZXRob2RFbGVtZW50Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vTWV0aG9kRWxlbWVudC9ncm91cCIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBVTUEuZWNvcmUjLy9NZXRob2RFbGVtZW50L293bmVkUnVsZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBVTUEuZWNvcmUjLy9NZXRob2RFbGVtZW50L21ldGhvZEVsZW1lbnRQcm9wZXJ0eSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL01ldGhvZEVsZW1lbnQvYnJpZWZEZXNjcmlwdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL01ldGhvZEVsZW1lbnQvaWQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9NZXRob2RFbGVtZW50L29yZGVyaW5nR3VpZGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9NZXRob2RFbGVtZW50L3ByZXNlbnRhdGlvbk5hbWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9NZXRob2RFbGVtZW50L3N1cHByZXNzZWQiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iVU1BLmVjb3JlIy8vTWV0aG9kRWxlbWVudFByb3BlcnR5Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9NZXRob2RFbGVtZW50UHJvcGVydHkvdmFsdWUiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iVU1BLmVjb3JlIy8vTWV0aG9kTGlicmFyeSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIFVNQS5lY29yZSMvL01ldGhvZExpYnJhcnkvbWV0aG9kUGx1Z2luIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIFVNQS5lY29yZSMvL01ldGhvZExpYnJhcnkvbWV0aG9kQ29uZmlndXJhdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL01ldGhvZExpYnJhcnkvdG9vbCIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJVTUEuZWNvcmUjLy9NZXRob2RQYWNrYWdlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vTWV0aG9kUGFja2FnZS9ncm91cDEiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9NZXRob2RQYWNrYWdlL3JldXNlZFBhY2thZ2UiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgVU1BLmVjb3JlIy8vTWV0aG9kUGFja2FnZS9tZXRob2RQYWNrYWdlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vTWV0aG9kUGFja2FnZS9nbG9iYWwiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iVU1BLmVjb3JlIy8vTWV0aG9kUGx1Z2luIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9NZXRob2RQbHVnaW4vcmVmZXJlbmNlZE1ldGhvZFBsdWdpbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBVTUEuZWNvcmUjLy9NZXRob2RQbHVnaW4vbWV0aG9kUGFja2FnZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL01ldGhvZFBsdWdpbi91c2VyQ2hhbmdlYWJsZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJVTUEuZWNvcmUjLy9NZXRob2RVbml0Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9NZXRob2RVbml0L2NvcHlyaWdodCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL01ldGhvZFVuaXQvYXV0aG9ycyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL01ldGhvZFVuaXQvY2hhbmdlRGF0ZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL01ldGhvZFVuaXQvY2hhbmdlRGVzY3JpcHRpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9NZXRob2RVbml0L3ZlcnNpb24iLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iVU1BLmVjb3JlIy8vTWlsZXN0b25lIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9NaWxlc3RvbmUvcmVxdWlyZWRSZXN1bHQiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iVU1BLmVjb3JlIy8vTmFtZWRFbGVtZW50Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9OYW1lZEVsZW1lbnQvbmFtZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJVTUEuZWNvcmUjLy9PdXRjb21lIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iVU1BLmVjb3JlIy8vUGFja2FnZWFibGVFbGVtZW50Ii8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iVU1BLmVjb3JlIy8vUGhhc2UiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJVTUEuZWNvcmUjLy9QbGFubmluZ0RhdGEiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL1BsYW5uaW5nRGF0YS9maW5pc2hEYXRlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vUGxhbm5pbmdEYXRhL3JhbmsiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9QbGFubmluZ0RhdGEvc3RhcnREYXRlIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IlVNQS5lY29yZSMvL1ByYWN0aWNlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vUHJhY3RpY2UvZ3JvdXAyIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vUHJhY3RpY2UvYWN0aXZpdHlSZWZlcmVuY2UiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9QcmFjdGljZS9jb250ZW50UmVmZXJlbmNlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIFVNQS5lY29yZSMvL1ByYWN0aWNlL3N1YlByYWN0aWNlIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IlVNQS5lY29yZSMvL1ByYWN0aWNlRGVzY3JpcHRpb24iPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL1ByYWN0aWNlRGVzY3JpcHRpb24vYWRkaXRpb25hbEluZm8iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9QcmFjdGljZURlc2NyaXB0aW9uL2FwcGxpY2F0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vUHJhY3RpY2VEZXNjcmlwdGlvbi9iYWNrZ3JvdW5kIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vUHJhY3RpY2VEZXNjcmlwdGlvbi9nb2FscyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL1ByYWN0aWNlRGVzY3JpcHRpb24vbGV2ZWxzT2ZBZG9wdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL1ByYWN0aWNlRGVzY3JpcHRpb24vcHJvYmxlbSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJVTUEuZWNvcmUjLy9Qcm9jZXNzIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9Qcm9jZXNzL2luY2x1ZGVzUGF0dGVybiIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL1Byb2Nlc3MvZGVmYXVsdENvbnRleHQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9Qcm9jZXNzL3ZhbGlkQ29udGV4dCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL1Byb2Nlc3MvZGlhZ3JhbVVSSSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJVTUEuZWNvcmUjLy9Qcm9jZXNzQ29tcG9uZW50Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9Qcm9jZXNzQ29tcG9uZW50L2NvcHlyaWdodCIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBVTUEuZWNvcmUjLy9Qcm9jZXNzQ29tcG9uZW50L2ludGVyZmFjZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBVTUEuZWNvcmUjLy9Qcm9jZXNzQ29tcG9uZW50L3Byb2Nlc3MiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9Qcm9jZXNzQ29tcG9uZW50L2F1dGhvcnMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9Qcm9jZXNzQ29tcG9uZW50L2NoYW5nZURhdGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9Qcm9jZXNzQ29tcG9uZW50L2NoYW5nZURlc2NyaXB0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vUHJvY2Vzc0NvbXBvbmVudC92ZXJzaW9uIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IlVNQS5lY29yZSMvL1Byb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlL2dyb3VwMiIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBVTUEuZWNvcmUjLy9Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlL2ludGVyZmFjZVNwZWNpZmljYXRpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgVU1BLmVjb3JlIy8vUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZS9pbnRlcmZhY2VJTyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJVTUEuZWNvcmUjLy9Qcm9jZXNzRGVzY3JpcHRpb24iPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL1Byb2Nlc3NEZXNjcmlwdGlvbi9zY29wZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL1Byb2Nlc3NEZXNjcmlwdGlvbi91c2FnZU5vdGVzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IlVNQS5lY29yZSMvL1Byb2Nlc3NFbGVtZW50Ii8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iVU1BLmVjb3JlIy8vUHJvY2Vzc1BhY2thZ2UiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9Qcm9jZXNzUGFja2FnZS9ncm91cDIiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgVU1BLmVjb3JlIy8vUHJvY2Vzc1BhY2thZ2UvcHJvY2Vzc0VsZW1lbnQiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iVU1BLmVjb3JlIy8vUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9Qcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZS9ncm91cDQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9Qcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZS9iYXNlUHJvY2VzcyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJVTUEuZWNvcmUjLy9SZXBvcnQiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJVTUEuZWNvcmUjLy9SZXVzYWJsZUFzc2V0Ii8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iVU1BLmVjb3JlIy8vUm9hZG1hcCIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IlVNQS5lY29yZSMvL1JvbGUiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9Sb2xlL2dyb3VwMiIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL1JvbGUvcmVzcG9uc2libGVGb3IiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iVU1BLmVjb3JlIy8vUm9sZURlc2NyaXB0aW9uIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9Sb2xlRGVzY3JpcHRpb24vYXNzaWdubWVudEFwcHJvYWNoZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9Sb2xlRGVzY3JpcHRpb24vc2tpbGxzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vUm9sZURlc2NyaXB0aW9uL3N5bm9ueW1zIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IlVNQS5lY29yZSMvL1JvbGVEZXNjcmlwdG9yIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9Sb2xlRGVzY3JpcHRvci9yb2xlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vUm9sZURlc2NyaXB0b3IvcmVzcG9uc2libGVGb3IiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iVU1BLmVjb3JlIy8vUm9sZVNldCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL1JvbGVTZXQvZ3JvdXAyIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vUm9sZVNldC9yb2xlIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IlVNQS5lY29yZSMvL1JvbGVTZXRHcm91cGluZyI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL1JvbGVTZXRHcm91cGluZy9ncm91cDIiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9Sb2xlU2V0R3JvdXBpbmcvcm9sZVNldCIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJVTUEuZWNvcmUjLy9TZWN0aW9uIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgVU1BLmVjb3JlIy8vU2VjdGlvbi9zdWJTZWN0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vU2VjdGlvbi9wcmVkZWNlc3NvciIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL1NlY3Rpb24vZGVzY3JpcHRpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9TZWN0aW9uL3NlY3Rpb25OYW1lIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vU2VjdGlvbi92YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vU2VjdGlvbi92YXJpYWJpbGl0eVR5cGUiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iVU1BLmVjb3JlIy8vU3VwcG9ydGluZ01hdGVyaWFsIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iVU1BLmVjb3JlIy8vVGFzayI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vVGFzay9wcmVjb25kaXRpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9UYXNrL3Bvc3Rjb25kaXRpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9UYXNrL3BlcmZvcm1lZEJ5Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL1Rhc2svZ3JvdXAyIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vVGFzay9tYW5kYXRvcnlJbnB1dCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL1Rhc2svb3V0cHV0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vVGFzay9hZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL1Rhc2svb3B0aW9uYWxJbnB1dCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL1Rhc2svZXN0aW1hdGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9UYXNrL2VzdGltYXRpb25Db25zaWRlcmF0aW9ucyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL1Rhc2svdG9vbE1lbnRvciIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJVTUEuZWNvcmUjLy9UYXNrRGVzY3JpcHRpb24iPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL1Rhc2tEZXNjcmlwdGlvbi9hbHRlcm5hdGl2ZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9UYXNrRGVzY3JpcHRpb24vcHVycG9zZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJVTUEuZWNvcmUjLy9UYXNrRGVzY3JpcHRvciI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vVGFza0Rlc2NyaXB0b3IvdGFzayIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL1Rhc2tEZXNjcmlwdG9yL3BlcmZvcm1lZFByaW1hcmlseUJ5Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL1Rhc2tEZXNjcmlwdG9yL2dyb3VwMyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL1Rhc2tEZXNjcmlwdG9yL2FkZGl0aW9uYWxseVBlcmZvcm1lZEJ5Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vVGFza0Rlc2NyaXB0b3IvYXNzaXN0ZWRCeSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL1Rhc2tEZXNjcmlwdG9yL2V4dGVybmFsSW5wdXQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9UYXNrRGVzY3JpcHRvci9tYW5kYXRvcnlJbnB1dCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL1Rhc2tEZXNjcmlwdG9yL29wdGlvbmFsSW5wdXQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9UYXNrRGVzY3JpcHRvci9vdXRwdXQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgVU1BLmVjb3JlIy8vVGFza0Rlc2NyaXB0b3Ivc3RlcCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL1Rhc2tEZXNjcmlwdG9yL2lzU3luY2hyb25pemVkV2l0aFNvdXJjZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJVTUEuZWNvcmUjLy9UZWFtUHJvZmlsZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL1RlYW1Qcm9maWxlL2dyb3VwMiIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL1RlYW1Qcm9maWxlL3JvbGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9UZWFtUHJvZmlsZS9zdXBlclRlYW0iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9UZWFtUHJvZmlsZS9zdWJUZWFtIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IlVNQS5lY29yZSMvL1RlbXBsYXRlIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iVU1BLmVjb3JlIy8vVGVybURlZmluaXRpb24iLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJVTUEuZWNvcmUjLy9Ub29sIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vVG9vbC9ncm91cDIiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9Ub29sL3Rvb2xNZW50b3IiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iVU1BLmVjb3JlIy8vVG9vbE1lbnRvciIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IlVNQS5lY29yZSMvL1doaXRlcGFwZXIiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJVTUEuZWNvcmUjLy9Xb3JrQnJlYWtkb3duRWxlbWVudCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL1dvcmtCcmVha2Rvd25FbGVtZW50L2dyb3VwMiIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBVTUEuZWNvcmUjLy9Xb3JrQnJlYWtkb3duRWxlbWVudC9wcmVkZWNlc3NvciIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL1dvcmtCcmVha2Rvd25FbGVtZW50L2lzRXZlbnREcml2ZW4iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9Xb3JrQnJlYWtkb3duRWxlbWVudC9pc09uZ29pbmciLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9Xb3JrQnJlYWtkb3duRWxlbWVudC9pc1JlcGVhdGFibGUiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iVU1BLmVjb3JlIy8vV29ya0RlZmluaXRpb24iPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL1dvcmtEZWZpbml0aW9uL3ByZWNvbmRpdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL1dvcmtEZWZpbml0aW9uL3Bvc3Rjb25kaXRpb24iLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iVU1BLmVjb3JlIy8vV29ya09yZGVyIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9Xb3JrT3JkZXIvdmFsdWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9Xb3JrT3JkZXIvaWQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9Xb3JrT3JkZXIvbGlua1R5cGUiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iVU1BLmVjb3JlIy8vV29ya1Byb2R1Y3QiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9Xb3JrUHJvZHVjdC9ncm91cDIiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9Xb3JrUHJvZHVjdC9lc3RpbWF0ZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL1dvcmtQcm9kdWN0L2VzdGltYXRpb25Db25zaWRlcmF0aW9ucyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL1dvcmtQcm9kdWN0L3JlcG9ydCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL1dvcmtQcm9kdWN0L3RlbXBsYXRlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vV29ya1Byb2R1Y3QvdG9vbE1lbnRvciIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJVTUEuZWNvcmUjLy9Xb3JrUHJvZHVjdERlc2NyaXB0aW9uIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9Xb3JrUHJvZHVjdERlc2NyaXB0aW9uL2ltcGFjdE9mTm90SGF2aW5nIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vV29ya1Byb2R1Y3REZXNjcmlwdGlvbi9wdXJwb3NlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vV29ya1Byb2R1Y3REZXNjcmlwdGlvbi9yZWFzb25zRm9yTm90TmVlZGluZyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJVTUEuZWNvcmUjLy9Xb3JrUHJvZHVjdERlc2NyaXB0b3IiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL1dvcmtQcm9kdWN0RGVzY3JpcHRvci93b3JrUHJvZHVjdCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL1dvcmtQcm9kdWN0RGVzY3JpcHRvci9yZXNwb25zaWJsZVJvbGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vV29ya1Byb2R1Y3REZXNjcmlwdG9yL2dyb3VwMiIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL1dvcmtQcm9kdWN0RGVzY3JpcHRvci9leHRlcm5hbElucHV0VG8iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9Xb3JrUHJvZHVjdERlc2NyaXB0b3IvaW1wYWN0ZWRCeSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL1dvcmtQcm9kdWN0RGVzY3JpcHRvci9pbXBhY3RzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vV29ya1Byb2R1Y3REZXNjcmlwdG9yL21hbmRhdG9yeUlucHV0VG8iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9Xb3JrUHJvZHVjdERlc2NyaXB0b3Ivb3B0aW9uYWxJbnB1dFRvIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vV29ya1Byb2R1Y3REZXNjcmlwdG9yL291dHB1dEZyb20iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9Xb3JrUHJvZHVjdERlc2NyaXB0b3IvZGVsaXZlcmFibGVQYXJ0cyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL1dvcmtQcm9kdWN0RGVzY3JpcHRvci9hY3Rpdml0eUVudHJ5U3RhdGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9Xb3JrUHJvZHVjdERlc2NyaXB0b3IvYWN0aXZpdHlFeGl0U3RhdGUiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iVU1BLmVjb3JlIy8vV29ya1Byb2R1Y3RUeXBlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vV29ya1Byb2R1Y3RUeXBlL2dyb3VwMiIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL1dvcmtQcm9kdWN0VHlwZS93b3JrUHJvZHVjdCIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgPC9nZW5QYWNrYWdlcz4KLTwvZ2VubW9kZWw6R2VuTW9kZWw+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvbW9kZWwvVU1BLnhzZCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9tb2RlbC9VTUEueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YjhlODdlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9tb2RlbC9VTUEueHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTM4NyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSBFUEYgVU1BIFhNTCBEYXRhIEludGVyY2hhbmdlIFNjaGVtYSAtLT4KLTx4c2Q6c2NoZW1hIHhtbG5zOnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC4zIiB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuMyI+Ci0JPHhzZDpzaW1wbGVUeXBlIG5hbWU9IldvcmtPcmRlclR5cGUiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+UmVwcmVzZW50cyBhIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHR3byBCcmVha2Rvd24gRWxlbWVudCBpbiB3aGljaCBvbmUgQnJlYWtkb3duIEVsZW1lbnQgZGVwZW5kcyBvbiB0aGUgc3RhcnQgb3IgZmluaXNoIG9mIGFub3RoZXIgQnJlYWtkb3duIEVsZW1lbnQgaW4gb3JkZXIgdG8gYmVnaW4gb3IgZW5kLiBUaGlzIGVudW1lcmF0aW9uIGRlZmluZXMgdGhlIGRpZmZlcmVudCB0eXBlcyBvZiBXb3JrIE9yZGVyIHJlbGF0aW9uc2hpcHMgYXZhaWxhYmxlIGluIFVNQSBhbmQgaXMgdXNlZCB0byBwcm92aWRlIHZhbHVlcyBmb3IgV29yayBPcmRlcidzIGxpbmtUeXBlIGF0dHJpYnV0ZS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpOQ05hbWUiPgotCQkJPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iZmluaXNoVG9TdGFydCIvPgotCQkJPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iZmluaXNoVG9GaW5pc2giLz4KLQkJCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InN0YXJ0VG9TdGFydCIvPgotCQkJPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ic3RhcnRUb0ZpbmlzaCIvPgotCQk8L3hzZDpyZXN0cmljdGlvbj4KLQk8L3hzZDpzaW1wbGVUeXBlPgotCTx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJWYXJpYWJpbGl0eVR5cGUiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QW4gRW51bWVyYXRpb24gdXNlZCBmb3IgdmFsdWVzIGZvciBpbnN0YW5jZXMgb2YgVmFyaWFiaWxpdHkgRWxlbWVudCdzIGF0dHJpYnV0ZSB2YXJpYWJpbGl0eVR5cGUuICBJdCBkZWZpbmVzIHRoZSBuYXR1cmUgb2YgaG93IGEgVmFyaWFiaWxpdHkgRWxlbWVudCBleHRlbmRzIGFub3RoZXIgVmFyaWFiaWxpdHkgRWxlbWVudC4gU2VlIGVudW1lcmF0aW9uIGxpdGVyYWxzIGZvciBkZWZpbml0aW9ucyBmb3IgZWFjaCB0eXBlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOk5DTmFtZSI+Ci0JCQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJuYSIvPgotCQkJPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iY29udHJpYnV0ZXMiLz4KLQkJCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImV4dGVuZHMiLz4KLQkJCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InJlcGxhY2VzIi8+Ci0JCQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJsb2NhbENvbnRyaWJ1dGlvbiIvPgotCQkJPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ibG9jYWxSZXBsYWNlbWVudCIvPgotCQk8L3hzZDpyZXN0cmljdGlvbj4KLQk8L3hzZDpzaW1wbGVUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iRWxlbWVudCI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIFVNTCAyLjAgbWV0YS1jbGFzcyBFbGVtZW50LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJOYW1lZEVsZW1lbnQiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBVTUwgMi4wIG1ldGEtY2xhc3MgTmFtZWQgRWxlbWVudC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkVsZW1lbnQiPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJQYWNrYWdlYWJsZUVsZW1lbnQiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBVTUwgMi4wIG1ldGEtY2xhc3MgUGFja2FnYWJsZSBFbGVtZW50LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6TmFtZWRFbGVtZW50Ii8+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iTWV0aG9kRWxlbWVudCI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgcm9vdCBnZW5lcmFsaXphdGlvbiBmb3IgYWxsIFVNQSBNZXRob2QgRWxlbWVudHMuICBEZWZpbmVzIGEgY29tbW9uIHNldCBvZiBhdHRyaWJ1dGVzIGluaGVyaXRlZCBieSBhbGwgVU1BIE1ldGhvZCBFbGVtZW50cy4gIE1ldGhvZCBFbGVtZW50IGl0c2VsZiBpcyBkZXJpdmVkIGZyb20gUGFja2FnZWFibGUgRWxlbWVudCBmcm9tIHRoZSBVTUwgMi4wIEluZnJhc3RydWN0dXJlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6UGFja2FnZWFibGVFbGVtZW50Ij4KLQkJCQk8eHNkOmNob2ljZSBtYXhPY2N1cnM9InVuYm91bmRlZCIgbWluT2NjdXJzPSIwIj4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Ik93bmVkUnVsZSIgdHlwZT0idW1hOkNvbnN0cmFpbnQiPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIHRoZSBwYWNrYWdpbmcgcnVsZXMgZm9yIHRoaXMgTWV0aG9kIEVsZW1lbnQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJPC94c2Q6Y2hvaWNlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkV2ZXJ5IGluc3RhbmNlIG9mIE1ldGhvZCBFbGVtZW50IGhhcyBhIGdsb2JhbCB1bmlxdWUgaWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0iYnJpZWZEZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5FdmVyeSBpbnN0YW5jZSBvZiBNZXRob2QgRWxlbWVudCBzaGFsbCBiZSBicmllZmx5IGRlc2NyaWJlZCB3aXRoIG9uZSBvciB0d28gc2VudGVuY2VzIHN1bW1hcml6aW5nIHRoZSBlbGVtZW50LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9InN1cHByZXNzZWQiIHR5cGU9InhzZDpib29sZWFuIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPklmIGEgVmFyaWFiaWxpdHkgRWxlbWVudCBpcyBkZXJpdmVkIGZyb20gYW5vdGhlciBWYXJpYWJpbGl0eSBFbGVtZW50IHVzaW5nIHRoZSAiZXh0ZW5kcyIgVmFyaWFiaWxpdHkgU3BlY2lhbGl6YXRpb24sIHRoZW4gdGhpcyBhdHRyaWJ1dGUgY2FuIGJlIHVzZWQgdG8gc3VwcHJlc3MgaW5oZXJpdGVkIE1ldGhvZCBFbGVtZW50cyB0aGF0IHdlcmUgcGFydCBvZiB0aGUgYmFzZWQtb24gVmFyaWFiaWxpdHkgRWxlbWVudCwgd2hpY2ggY2FuIGJlIGFueSB0eXBlIG9mIE1ldGhvZCBFbGVtZW50LiAgSW4gb3RoZXIgd29yZHMsIGlmIHRoaXMgYXR0cmlidXRlIGlzIHNldCB0byB0cnVlIG9uIGEgTWV0aG9kIEVsZW1lbnQgdGhhdCBoYXMgdGhlIHNhbWUgbmFtZSB0aGFuIGFuIGluaGVyaXRlZCBtZXRob2QgZWxlbWVudCB0aGVuIGl0IHdpbGwgbm90IGJlIHJlZ2FyZGVkIGFzIGluaGVyaXRlZCBhdCBhbGwuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0ib3JkZXJpbmdHdWlkZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5Vc2VkIGZvciBDQVNFIHRvb2wgcmVhbGl6YXRpb25zIG9mIHRoaXMgbW9kZWwgdG8gY29udGFpbiBpbmZvcm1hdGlvbiBhYm91dCBsYXlvdXQgYW5kIG9yZGVyaW5nIG9mIHRoZSBtZXRob2QgZWxlbWVudCBhbmQgaXRzIHBhcnRzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkNvbnN0cmFpbnQiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBnZW5lcmFsaXplZCBNZXRob2QgRWxlbWVudCB0aGF0IHJlcHJlc2VudHMgYSBjb25kaXRpb24gb3IgcmVzdHJpY3Rpb24gZXhwcmVzc2VkIGluIG5hdHVyYWwgbGFuZ3VhZ2UgdGV4dCBvciBpbiBhIG1hY2hpbmUgcmVhZGFibGUgbGFuZ3VhZ2UgZm9yIHRoZSBwdXJwb3NlIG9mIGRlY2xhcmluZyBzb21lIG9mIHRoZSBzZW1hbnRpY3Mgb2YgYSBNZXRob2QgRWxlbWVudC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOk1ldGhvZEVsZW1lbnQiPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9Im1haW5EZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5TdG9yZXMgdGhlIG1haW4gZGVmaW5pdGlvbiBvZiB0aGUgY29uc3RyYWludC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJTZWN0aW9uIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lhbCBNZXRob2QgRWxlbWVudCB0aGF0IHJlcHJlc2VudHMgc3RydWN0dXJhbCBzdWJzZWN0aW9ucyBvZiBhIENvbnRlbnQgRGVzY3JpcHRpb24ncyBzZWN0aW9uRGVzY3JpcHRpb24gYXR0cmlidXRlLiAgSXQgaXMgdXNlZCBmb3IgZWl0aGVyIGxhcmdlIHNjYWxlIGRvY3VtZW50YXRpb24gb2YgQ29udGVudCBFbGVtZW50cyBvcmdhbml6ZWQgaW50byBzZWN0aW9ucyBhcyB3ZWxsIGFzIHRvIGZsZXhpYmx5IGFkZCBuZXcgU2VjdGlvbnMgdG8gQ29udGVudCBFbGVtZW50cyB1c2luZyBjb250cmlidXRpb24gdmFyaWFiaWxpdHkgYWRkZWQgdG8gdGhlIFNlY3Rpb24gY29uY2VwdCBmb3IgTWV0aG9kIFBsdWctaW5zLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6TWV0aG9kRWxlbWVudCI+Ci0JCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iU3ViU2VjdGlvbiIgdHlwZT0idW1hOlNlY3Rpb24iLz4KLQkJCQkJPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iUHJlZGVjZXNzb3IiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iRGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGlzIGF0dHJpYnV0ZXMgc3RvcmUgdGhlIGRlc2NyaXB0aW9uIHRleHQgZm9yIGEgQ29udGVudCBEZXNjcmlwdGlvbidzIFNlY3Rpb24uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0ic2VjdGlvbk5hbWUiIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+RXZlcnkgU2VjdGlvbiBoYXMgYSBuYW1lIHVzZWQgZm9yIGV4dGVybmFsIHByZXNlbnRhdGlvbiBvZiB0aGUgc2VjdGlvbiwgZS5nLiB3aGVuIHB1Ymxpc2hlZCBvciB3aGVuIHNlY3Rpb24gaGVhZGluZyBhcmUgbGlzdGVkIGluIGEgdGFibGUgb2YgY29udGVudHMuICBUaGlzIGF0dHJpYnV0ZSBpcyBzaW1pbGFyIHRvIFByZXNlbnRhdGlvbiBOYW1lIGZvciBDb250ZW50IEVsZW1lbnRzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9InZhcmlhYmlsaXR5VHlwZSIgdHlwZT0idW1hOlZhcmlhYmlsaXR5VHlwZSIvPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9InZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJNZXRob2RVbml0Ij4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lhbCBNZXRob2QgRWxlbWVudCB0aGF0IHNoYWxsIGJlIG1haW50YWluZWQgaW4gYSBNZXRob2QgTGlicmFyeSBhcyBhIHNlcGFyYXRlIHVuaXQgb2YgY29udHJvbC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOk1ldGhvZEVsZW1lbnQiPgotCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkNvcHlyaWdodCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImF1dGhvcnMiIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+RXZlcnkgTWV0aG9kIFVuaXQgaXMgYmVpbmcgY3JlYXRlZCBhbmQgb3duZWQgYnkgYW4gYXV0aG9yIG9yIGF1dGhvcmluZyB0ZWFtLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImNoYW5nZURhdGUiIHR5cGU9InhzZDpkYXRlVGltZSI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZGF0ZSB0aGUgbGFzdCBjaGFuZ2UgdGhhdCByZXN1bHRlZCBpbnRvIHRoaXMgdmVyc2lvbiBoYXMgYmVlbiBtYWRlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImNoYW5nZURlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgbGFzdCBjaGFuZ2UgdGhhdCByZXN1bHRlZCBpbnRvIHRoaXMgdmVyc2lvbi48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ2ZXJzaW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkV2ZXJ5IFBhY2thZ2UgaGFzIGEgdmVyc2lvbiBudW1iZXIgdXNlZCB0byB0cmFjayBjaGFuZ2VzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkNvbnRlbnREZXNjcmlwdGlvbiI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIGdlbmVyYWxpemVkIE1ldGhvZCBFbGVtZW50IHRoYXQgaXMgdXNlZCB0byBzdG9yZSB0aGUgdGV4dHVhbCBkZXNjcmlwdGlvbiBmb3IgYSBDb250ZW50IEVsZW1lbnQuICBJdCBkZWZpbmVzIHN0YW5kYXJkIGF0dHJpYnV0ZXMgYXBwbGljYWJsZSBmb3IgYWxsIENvbnRlbnQgRWxlbWVudCB0eXBlcy4gIFNwZWNpZmljIENvbnRlbnQgRWxlbWVudCBzdWItdHlwZXMgY2FuIGRlZmluZSB0aGVpciBvd24gbWF0Y2hpbmcgQ29udGVudCBEZXNjcmlwdGlvbiBzdWItdHlwZXMuIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6TWV0aG9kVW5pdCI+Ci0JCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iTWFpbkRlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+U3RvcmVzIHRoZSBtYWluIGRlc2NyaXB0aXZlIHRleHQgZm9yIHRoZSBDb250ZW50IEVsZW1lbnQuICBBbGwgdGV4dCB0aGF0IGlzIG5vdCBwYXJ0IG9mIGFueSBvZiB0aGUgbW9yZSBzcGVjaWZpYyBhdHRyaWJ1dGVzIHNoYWxsIGJlIHN0b3JlZCBoZXJlLiAgSWYgdGhlIENvbnRlbnQgRGVzY3JpcHRpb24gaXMgZGl2aWRlZCBpbnRvIHNlY3Rpb25zIHVzaW5nIHRoZSBTZWN0aW9uIGNsYXNzLCB0aGVuIG9ubHkgdGhlIHRleHQgZnJvbSB0aGUgJ3N0YXJ0JyBvZiB0aGUgY29udGVudCBkZXNjcmlwdGlvbiB0byB0aGUgZmlyc3Qgc2VjdGlvbiB3aWxsIGJlIHN0b3JlZCBoZXJlIChzaW1pbGFyIHRvIGEgbm9ybWFsIGRvY3VtZW50IHdoZXJlIHlvdSBjYW4gcGxhY2UgdGV4dCBiZXR3ZWVuIGl0cyBiZWdpbm5pbmcgdG8gaXRzIGZpcnN0IGRpY3Rpb24gaGVhZGluZykuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IktleUNvbnNpZGVyYXRpb25zIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+UHJvdmlkZXMgYWR2aXNlIGFuZCBndWlkYW5jZSBvZiBhIGNyaXRpY2FsIG5hdHVyZSBmb3IgdGhlIGNvbnRlbnQgZWxlbWVudCBhcyB3ZWxsIGFzIHdhcm5pbmdzLCBjYXV0aW9ucywgcGl0ZmFsbHMsIGRhbmdlcnMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBtYXhPY2N1cnM9InVuYm91bmRlZCIgbWluT2NjdXJzPSIwIiBuYW1lPSJTZWN0aW9uIiB0eXBlPSJ1bWE6U2VjdGlvbiIvPgotCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ikd1aWRhbmNlRGVzY3JpcHRpb24iPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBnZW5lcmFsaXplZCBDb250ZW50IERlc2NyaXB0aW9uIHRoYXQgaXMgdXNlZCB0byBzdG9yZSB0aGUgdGV4dHVhbCBkZXNjcmlwdGlvbiBmb3IgYSBHdWlkYW5jZS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkNvbnRlbnREZXNjcmlwdGlvbiI+Ci0JCQkJPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIj4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkF0dGFjaG1lbnQiIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGlzIGZpZWxkIGlzIHByaW1hcmlseSB1c2VkIGZvciBhdHRhY2htZW50cyBhdWdtZW50aW5nIHRoZSBpbmZvcm1hdGlvbiBwcm92aWRlZCBmb3IgZ3VpZGFuY2UuICBJbiBwYXJ0aWN1bGFyIHRoZSBhdHRyaWJ1dGUgaXMgdXNlZCBmb3IgVGVtcGxhdGVzLCBFeGFtcGxlcywgYW5kIFJldXNhYmxlIEFzc2V0cyB0byBjb250YWluIHRoZSBhY3R1YWwgYXR0YWNobWVudCBkZXNjcmliZWQgaW4gdGhlIG1haW5EZXNjcmlwdGlvbi4gIEl0IGNhbiBhZGRpdGlvbmFsbHkgY29udGFpbiByZXByZXNlbnRhdGlvbnMgb2YgdGhlIGd1aWRhbmNlIGluIGp1c3QgYSB0aGlyZCBwYXJ0eSBmb3JtYXQsIGUuZy4gUERGLCBNUyBXb3JkLCBvciBXb3JkIFBlcmZlY3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJPC94c2Q6Y2hvaWNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlByYWN0aWNlRGVzY3JpcHRpb24iPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBnZW5lcmFsaXplZCBDb250ZW50IERlc2NyaXB0aW9uIHRoYXQgaXMgdXNlZCB0byBzdG9yZSB0aGUgdGV4dHVhbCBkZXNjcmlwdGlvbiBmb3IgYSBQcmFjdGljZS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkNvbnRlbnREZXNjcmlwdGlvbiI+Ci0JCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iQWRkaXRpb25hbEluZm8iIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BbnkgYWRkaXRpb25hbCBJbmZvcm1hdGlvbiBub3QgY292ZXJlZCBieSB0aGUgb3RoZXIgYXR0cmlidXRlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iQXBwbGljYXRpb24iIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5EZXNjcmliZXMgaG93IHRoZSBQcmFjdGljZSBpcyBiZWluZyBhcHBsaWVkIG9yIGludHJvZHVjZWQgaW50byB0aGUgY29udGV4dCBkZXNjcmliZWQgaW4gYmFja2dyb3VuZC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iQmFja2dyb3VuZCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkVsYWJvcmF0aW9uIG9uIHRoZSBiYWNrZ3JvdW5kIGFuZCB0aGUgY29udGV4dCBpbiB3aGljaCB0aGUgcHJvYmxlbSBvY2N1cnMgYW5kIHdoZXJlIHRoZSBzb2x1dGlvbiBkZXNjcmliZWQgYnkgdGhpcyBQcmFjdGljZSB3aWxsIGZpdCBpbi48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iR29hbHMiIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHN1bW1hcnkgb2YgdGhlIG92ZXJhbGwgZ29hbHMgdG8gYmUgYWRkcmVzc2VkIGJ5IHRoZSBQcmFjdGljZS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iTGV2ZWxzT2ZBZG9wdGlvbiIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPk91dGxpbmVzIHRoZSBkaWZmZXJlbnQgZm9ybXMgb3IgdmFyaWFudHMgaW4gd2hpY2ggdGhlIHByYWN0aWNlIGNvdWxkIGJlIHJlYWxpemVkLiAoZS5nLiBmdWxsIGFkb3B0aW9uIHZlcnVzIGEgcGFydGlhbCBhZG9wdGlvbiBvZiB0aGUgUHJhY3RpY2UpPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlByb2JsZW0iIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIGRlc2NyaXB0aW9uIG9mIHRoZSBwcm9ibGVtIHRoZSBQcmFjdGljZSBhZGRyZXNzZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iV29ya1Byb2R1Y3REZXNjcmlwdGlvbiI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIGdlbmVyYWxpemVkIENvbnRlbnQgRGVzY3JpcHRpb24gdGhhdCBpcyB1c2VkIHRvIHN0b3JlIHRoZSB0ZXh0dWFsIGRlc2NyaXB0aW9uIGZvciBhIFdvcmsgUHJvZHVjdC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkNvbnRlbnREZXNjcmlwdGlvbiI+Ci0JCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iSW1wYWN0T2ZOb3RIYXZpbmciIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5EZXNjcmliZXMgdGhlIGNvbnNlcXVlbmNlcyBvZiBub3QgcHJvZHVjaW5nIHRoZSB3b3JrIHByb2R1Y3QuICBUaGlzIGlzIGludGVuZGVkIHRvIGFpZCBpbiB0aGUgdGFpbG9yaW5nIHRoZSBtZXRob2QvcHJvY2VzcyB0byB0aGUgbmVlZHMgb2YgYSBzcGVjaWZpYyBwcm9qZWN0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQk8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJQdXJwb3NlIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+RGVzY3JpYmVzIHdoeSB0aGUgd29yayBwcm9kdWN0IGlzIHByb2R1Y2VkIGFuZCB0byB3aGF0IHVzZSBpdCB3aWxsIGJlIHB1dC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iUmVhc29uc0Zvck5vdE5lZWRpbmciIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5EZXNjcmliZXMgdGhlIGNpcmN1bXN0YW5jZXMgaW4gd2hpY2ggaXQgaXMgcmVhc29uYWJsZSBub3QgdG8gcHJvZHVjZSB0aGUgd29yayBwcm9kdWN0LiAgVGhpcyBpcyBpbnRlbmRlZCB0byBhaWQgaW4gdGhlIHRhaWxvcmluZyBvZiB0aGUgbWV0aG9kL3Byb2Nlc3MgdG8gdGhlIG5lZWRzIG9mIGEgc3BlY2lmaWMgcHJvamVjdC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJleHRlcm5hbElkIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkFuIGV4dGVybmFsIHZpc2libGUgbnVtYmVyIHRoYXQgaXMgdXNlZCB0byByZWZlcmVuY2UgdGhpcyBhcnRpZmFjdC4gVXNlZCBsaWtlIGEgc3lub255bS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJBcnRpZmFjdERlc2NyaXB0aW9uIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgZ2VuZXJhbGl6ZWQgV29yayBQcm9kdWN0IERlc2NyaXB0aW9uIHRoYXQgaXMgdXNlZCB0byBzdG9yZSB0aGUgdGV4dHVhbCBkZXNjcmlwdGlvbiBmb3IgYW4gQXJ0aWZhY3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpXb3JrUHJvZHVjdERlc2NyaXB0aW9uIj4KLQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQk8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJCcmllZk91dGxpbmUiIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5Qcm92aWRlcyBhIGJyaWVmIGRlc2NyaXB0aW9uIG9mIHRoZSBpbmZvcm1hdGlvbiB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGlzIGFydGlmYWN0LiBGb3IgZXhhbXBsZSwgZGlzY3Vzc2VzIHRoZSBjb250ZW50cyBmb3Iga2V5IGNoYXB0ZXJzIG9mIGEgZG9jdW1lbnQgYXJ0aWZhY3Qgb3IgdGhlIGtleSBwYWNrYWdlcyBhbmQgbW9kdWxlcyBvZiBhIG1vZGVsIGFydGlmYWN0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQk8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJSZXByZXNlbnRhdGlvbk9wdGlvbnMiIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5EaXNjdXNzZXMgZGlmZmVyZW50IHBvc3NpYmxlIGFsdGVybmF0aXZlIHJlcHJlc2VudGF0aW9ucyBmb3IgdGhlIGFydGlmYWN0LiBGb3IgZXhhbXBsZSBhIGRlc2lnbiBtb2RlbCBjYW4gYmUgcmVwcmVzZW50ZWQgYXMgYSBVTUwgbW9kZWwgb3IgYW4gaW5mb3JtYWwgYmxvY2sgZGlhZ3JhbSBvciBieSB0ZXh0dWFsIGRlc2NyaXB0aW9uIG9ubHkuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iRGVsaXZlcmFibGVEZXNjcmlwdGlvbiI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIGdlbmVyYWxpemVkIFdvcmsgUHJvZHVjdCBEZXNjcmlwdGlvbiB0aGF0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIHRleHR1YWwgZGVzY3JpcHRpb24gZm9yIGEgRGVsaXZlcmFibGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpXb3JrUHJvZHVjdERlc2NyaXB0aW9uIj4KLQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQk8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJFeHRlcm5hbERlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+VGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBEZWxpdmVyYWJsZSB1c2VkIGZvciBjbGllbnQgZG9jdW1lbnRzIChwcm9wb3NhbCwgc3RhdGVtZW50cyBvZiB3b3JrIG9yIGNvbnRyYWN0dWFsIGFncmVlbWVudHMpLiAgSXQgbWlnaHQgdXNlIGEgZGlmZmVyZW50IGxhbmd1YWdlIGFuZCBmb2xsb3cgbGVnYWwgY29uc3RyYWludHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlBhY2thZ2luZ0d1aWRhbmNlIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+UHJvdmlkZXMgZ3VpZGFuY2Ugb24gaG93IHRvIGFzc2VtYmxlIHRoZSBkZWxpdmVyYWJsZSBmcm9tIGFsbCBpdHMgcmVxdWlyZWQgaW5wdXRzLiAgVGhpcyBzZWN0aW9uIGRlc2NyaWJlcyB0aGUgbW9zdCBjb21tb24gY29udGVudCBtZWRpdW0gYW5kIGZvcm1hdC4gIERpc3RyaWJ1dGlvbiBvZiB0aGUgZGVsaXZlcmFibGUgaXMgYWRkcmVzc2VkIGluIHRoaXMgc2VjdGlvbiwgaWYgbmVjZXNzYXJ5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlJvbGVEZXNjcmlwdGlvbiI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIGdlbmVyYWxpemVkIENvbnRlbnQgRGVzY3JpcHRpb24gdGhhdCBpcyB1c2VkIHRvIHN0b3JlIHRoZSB0ZXh0dWFsIGRlc2NyaXB0aW9uIGZvciBhIFJvbGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpDb250ZW50RGVzY3JpcHRpb24iPgotCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkFzc2lnbm1lbnRBcHByb2FjaGVzIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+UHJvdmlkZXMgZ3VpZGFuY2Ugb24gZm9yIGFzc2lnbmluZyBpbmRpdmlkdWFscyB0byB0aGUgUm9sZSBpbiB0ZXJtcyBvZiB3aGF0IG90aGVyIHJvbGVzIHRoZXNlIGluZGl2aWR1YWxzIGNvdWxkIHBlcmZvcm0gYW5kIHdoYXQgcmVzcG9uc2liaWxpdHkgZGlmZmVyZW50IGluZGl2aWR1YWxzIGFzc2lnbmVkIHRvIHRoaXMgcm9sZSBtaWdodCBoYXZlLiAgVGhlIGd1aWRhbmNlIGNhbiBhbHNvIGRlc2NyaWJlIGRpZmZlcmVudCBhc3NpZ25tZW50IGFwcHJvYWNoZXMgZm9yIGRpZmZlcmVudCB0eXBlcyBvZiBwcm9qZWN0cywgZS5nLiBmb3IgbGFyZ2UgdmVyc3VzIHNtYWxsIHRlYW1zIHdoZXJlIGluZGl2aWR1YWxzIGNvdWxkIGJlIGFsbG9jYXRlZCB0byByb2xlcyBmdWxsIHRpbWUgdmVyc3VzIHNoYXJpbmcgcm9sZXMgd2l0aGluIHRoZSB0ZWFtLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQk8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJTa2lsbHMiIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5MaXN0cyBvZiBzZXQgb2YgcmVxdWlyZWQgc2tpbGxzIGEgcGVyc29uIG5lZWRzIHRvIHBvc3Nlc3MgdG8gZnVsZmlsbCB0aGF0IFJvbGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlN5bm9ueW1zIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+TGlzdHMgc3lub255bXMsIGkuZS4gb3RoZXIgbmFtZXMgdGhlIFJvbGUgbWlnaHQgYmUgcmVmZXJyZWQgYnkuICBUb29sIHN1cHBvcnQgZm9yIHRoZSBtZXRhLW1vZGVsIG1pZ2h0IHN1cHBvcnQgdGhhdCBhIFJvbGUgbmFtZSBjYW4gYmUgY29uc2lzdGVudGx5IGJlIHJlcGxhY2VkIHdpdGggb25lIG9mIGl0cyBzeW5vbnltcyB0aHJvdWdodCBhIFByb2Nlc3MuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iVGFza0Rlc2NyaXB0aW9uIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgZ2VuZXJhbGl6ZWQgQ29udGVudCBEZXNjcmlwdGlvbiB0aGF0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIHRleHR1YWwgZGVzY3JpcHRpb24gZm9yIGEgVGFzay48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkNvbnRlbnREZXNjcmlwdGlvbiI+Ci0JCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iQWx0ZXJuYXRpdmVzIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+Q29tcHJpc2VzIG9mIHN1bW1hcmllcyBkZXNjcmliaW5nIGltcG9ydGFudCBleGNlcHRpb25hbCBhbmQgbm9uLXN0YW5kYXJkIHdheXMgb2YgYWNoaWV2aW5nIHRoaXMgVGFzaydzIGRldmVsb3BtZW50IGdvYWxzIHRoYXQgd2VyZSBub3QgY292ZXJlZCBieSB0aGUgVGFzaydzIFN0ZXBzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQk8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJQdXJwb3NlIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+U3VtbWFyaXplcyB0aGUgbWFpbiByZWFzb24gZm9yIHBlcmZvcm1pbmcgdGhpcyBUYXNrIGFuZCB3aGF0IGlzIGludGVuZGVkIHRvIGJlIGFjaGlldmVkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkRlc2NyaWJhYmxlRWxlbWVudCI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BbiBhYnN0cmFjdCBnZW5lcmFsaXphdGlvbiBvZiBNZXRob2QgRWxlbWVudHMgZm9yIHdoaWNoIGV4dGVybmFsIHByZXNlbnRhdGlvbiBuYW1lcyBhcyB3ZWxsIGFzIGNvbnRlbnQgZGVzY3JpcHRpb25zIGhhdmUgYmVlbiBkZWZpbmVkLCBzdWNoIGFzIFJvbGVzIG9yIFdvcmsgUHJvZHVjdHMuICBQcmVzZW50YXRpb24gTmFtZSBhbmQgQ29udGVudCBEZXNjcmlwdGlvbnMgYXJlIHR5cGljYWxseSBsb2NhbGl6ZWQgdXNpbmcgYSByZXNvdXJjZSBhbGxvY2F0aW9uIG1lY2hhbmlzbSBmb3IgaXRzIFN0cmluZyB0eXBlIGF0dHJpYnV0ZXMuCi1UaGlzIGFic3RyYWN0aW9uIHJlcHJlc2VudHMgYWxsIGVsZW1lbnRzIGluIHRoZSBNZXRob2QgQ29udGVudCBhcyB3ZWxsIGFzIFByb2Nlc3Mgc3BhY2UgZm9yIHdoaWNoIGNvbmNyZXRlIHRleHR1YWwgZGVzY3JpcHRpb25zIGFyZSBkZWZpbmVkIGluIHRoZSBmb3JtIG9mIGRvY3VtZW50aW5nIGF0dHJpYnV0ZXMgZ3JvdXBlZCBpbiBhIG1hdGNoaW5nIENvbnRlbnQgRGVzY3JpcHRpb24gaW5zdGFuY2UuICBEZXNjcmliYWJsZSBFbGVtZW50cyBhcmUgaW50ZW5kZWQgdG8gYmUgcHVibGlzaGVkIGluIG1ldGhvZCBvciBwcm9jZXNzIHB1YmxpY2F0aW9ucyAoc2ltaWxhciB0byB0aGUgSUJNIFJhdGlvbmFsIFVuaWZpZWQgUHJvY2VzcyB3ZWIpLiAgRGVzY3JpYmFibGUgRWxlbWVudCBkZWZpbmVzIHRoYXQgdGhlIGVsZW1lbnQgaXQgcmVwcmVzZW50cyB3aWxsIGhhdmUgY29udGVudCAnYXR0YWNoZWQnIHRvIGl0LiAgQ29udGVudCBEZXNjcmlwdGlvbiBpcyB0aGUgYWJzdHJhY3Rpb24gZm9yIHRoZSBhY3R1YWwgcGxhY2VzIGluIHdoaWNoIHRoZSBjb250ZW50IGlzIGJlaW5nIHJlcHJlc2VudGVkLiAgVGhpcyBzZXBhcmF0aW9uIGFsbG93cyBhIGRpc3RpbmN0aW9uIGJldHdlZW4gY29yZSBtZXRob2QgbW9kZWwgZWxlbWVudHMgZGVzY3JpYmluZyB0aGUgc3RydWN0dXJlIG9mIHRoZSBtb2RlbCBmcm9tIHRoZSBhY3R1YWwgZGVzY3JpcHRpb24gY29udGFpbmVyIHByb3ZpZGluZywgZm9yIGV4YW1wbGUsIHRoZSBkb2N1bWVudGF0aW9uIG9mIHRoZSBjb250ZW50IGVsZW1lbnQgaW4gZGlmZmVyZW50IGFsdGVybmF0aXZlcyBsYW5ndWFnZXMsIGF1ZGllbmNlcywgbGljZW5zaW5nIGxldmVscywgZXRjLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6TWV0aG9kRWxlbWVudCI+Ci0JCQkJPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIj4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlByZXNlbnRhdGlvbiIgdHlwZT0idW1hOkNvbnRlbnREZXNjcmlwdGlvbiIvPgotCQkJCTwveHNkOmNob2ljZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJwcmVzZW50YXRpb25OYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkV2ZXJ5IERlc2NyaWJhYmxlIEVsZW1lbnQgaGFzIGEgcHJlc2VudGF0aW9uIG5hbWUsIHdoaWNoIGlzIHVzZWQgZm9yIGV4dGVybmFsIHByZXNlbnRhdGlvbiBvZiB0aGUgZWxlbWVudC4gIEZvciBleGFtcGxlLCBuYW1lICh0aGUgaW50ZXJuYWwgcmVwcmVzZW50YXRpb24pIG1pZ2h0IGJlIHNldCB0byAicnVwX2FyY2hpdGVjdHVyZV9kb2N1bWVudCIgdG8gZGlmZmVyZW50aWF0ZSBmcm9tIGEgImoyZWVfYXJjaGl0Y3R1cmVfZG9jdW1lbnQiIHdoZXJlYXMgdGhlIGV4dGVybmFsIHByZXNlbnRhdGlvbiB3b3VsZCBhbHdheXMgYmUgIkFyY2hpdGVjdHVyZSBEb2N1bWVudCIuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0ic2hhcGVpY29uIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgcmVmZXJlbmNlIHRvIGFuIGljb24gdGhhdCBjYW4gYmUgdXNlZCBmb3IgbW9kZWxpbmcgd2l0aCBzcGVjaWZpYyBDb250ZW50IEVsZW1lbnQgaW5zdGFuY2VzIChhcyBncmFwaGljYWwgc3RlcmVvdHlwZXMsIGUuZy4gYSB1c2UgY2FzZSBzeW1ib2wgZm9yIGEgdXNlIGNhc2UgYXJ0aWZhY3QpIGFzIHdlbGwgYXMgcHVibGljYXRpb24gb2YgY29udGVudC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJub2RlaWNvbiIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHJlZmVyZW5jZSB0byBhbiBpY29uIHRoYXQgY2FuIGJlIHVzZWQgaW4gdHJlZSBicm93c2VyIHByZXNlbnRhdGlvbnMgYW5kIGJyZWFrZG93biBzdHJ1Y3R1cmVzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkNvbnRlbnRFbGVtZW50Ij4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgRGVzY3JpYmFibGUgRWxlbWVudCB0aGF0IHJlcHJlc2VudHMgYW4gYWJzdHJhY3QgZ2VuZXJhbGl6YXRpb24gZm9yIGFsbCBlbGVtZW50cyB0aGF0IGFyZSBjb25zaWRlcmVkIHRvIGJlIGFuZCBtYW5hZ2VkIGFzIE1ldGhvZCBDb250ZW50LgotQ29udGVudCBFbGVtZW50cyByZXByZXNlbnRzIHJldXNhYmxlIE1ldGhvZCBDb250ZW50IHRoYXQgaXMgc3VwcG9zZWQgdG8gYmUgbWFuYWdlZCBpbiBDb250ZW50IFBhY2thZ2VzLiAgVGhlIHNlcGFyYXRpb24gb2YgQ29udGVudCBFbGVtZW50IGZyb20gUHJvY2VzcyBFbGVtZW50IGFsbG93cyB0byBjbGVhcmx5IGRpc3Rpbmd1aXNoIGJldHdlZW4gcHVyZSBtZXRob2QgY29udGVudCBmcm9tIGNvbnRlbnQgdGhhdCBpcyByZXByZXNlbnRlZCBpbiBwcm9jZXNzZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpEZXNjcmliYWJsZUVsZW1lbnQiPgotCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCTx4c2Q6Y2hvaWNlIG1heE9jY3Vycz0idW5ib3VuZGVkIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkNoZWNrbGlzdCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkNvbmNlcHQiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJFeGFtcGxlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iR3VpZGVsaW5lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUmV1c2FibGVBc3NldCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlN1cHBvcnRpbmdNYXRlcmlhbCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IldoaXRlcGFwZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJPC94c2Q6Y2hvaWNlPgotCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9InZhcmlhYmlsaXR5VHlwZSIgdHlwZT0idW1hOlZhcmlhYmlsaXR5VHlwZSIvPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9InZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJHdWlkYW5jZSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5HdWlkYW5jZSBpcyBhbiBhYnN0cmFjdCBnZW5lcmFsaXphdGlvbiBvZiBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlbGF0ZWQgdG8gY29udGVudCBlbGVtZW50cyBzdWNoIGFzIFJvbGVzLCBUYXNrcywgYW5kIFdvcmsgUHJvZHVjdHMuICBFeGFtcGxlcyBmb3IgR3VpZGFuY2UgYXJlIEd1aWRlbGluZXMsIFRlbXBsYXRlcywgQ2hlY2tsaXN0cywgVG9vbCBNZW50b3JzLCBFc3RpbWF0ZXMsIFN1cHBvcnRpbmcgTWF0ZXJpYWxzLCBSZXBvcnRzLCBDb25jZXB0cywgZXRjLiAgVGhpcyBwYWNrYWdlIG9ubHkgY29udGFpbnMgdGhlIGRlZmluaXRpb24gb2YgdGhlIGFic3RyYWN0IEd1aWRhbmNlIGNsYXNzLiAgVGhlIHBhY2thZ2UgR3VpZGFuY2UgVHlwZXMgZGVmaW5lcyBjb25jcmV0ZSBndWlkYW5jZSB0eXBlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkNvbnRlbnRFbGVtZW50Ii8+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iQ29uY2VwdCI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpZmljIHR5cGUgb2YgZ3VpZGFuY2UgdGhhdCBvdXRsaW5lcyBrZXkgaWRlYXMgYXNzb2NpYXRlZCB3aXRoIGJhc2ljIHByaW5jaXBsZXMgdW5kZXJseWluZyB0aGUgcmVmZXJlbmNlZCBpdGVtLiBDb25jZXB0cyBub3JtYWxseSBhZGRyZXNzIG1vcmUgZ2VuZXJhbCB0b3BpY3MgdGhhbiBHdWlkZWxpbmVzIGFuZCBzcGFuIGFjcm9zcyBzZXYtZXJhbCB3b3JrIHByb2R1Y3QgYW5kL29yIHRhc2tzL2FjdGl2aXRpZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpHdWlkYW5jZSIvPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkNoZWNrbGlzdCI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpZmljIHR5cGUgb2YgZ3VpZGFuY2UgdGhhdCBpZGVudGlmaWVzIGEgc2VyaWVzIG9mIGl0ZW1zIHRoYXQgbmVlZCB0byBiZSBjb21wbGV0ZWQgb3IgdmVyaS1maWVkLiAgQ2hlY2tsaXN0cyBhcmUgb2Z0ZW4gdXNlZCBpbiByZXZpZXdzIHN1Y2ggYXMgd2Fsa3Rocm91Z2hzIG9yIGluc3BlY3Rpb25zLiA8L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkd1aWRhbmNlIi8+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iRXhhbXBsZSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpZmljIHR5cGUgb2YgR3VpZGFuY2UgdGhhdCByZXByZXNlbnRzIGEgdHlwaWNhbCwgcGFydGlhbGx5IGNvbXBsZXRlZCwgc2FtcGxlIGluc3RhbmNlIG9mIG9uZSBvciBtb3JlIHdvcmsgcHJvZHVjdHMgb3Igc2NlbmFyaW8gbGlrZSBkZXNjcmlwdGlvbnMgb2YgaG93IFRhc2sgbWF5IGJlIHBlcmZvcm1lZC4gRXhhbXBsZXMgY2FuIGJlIHJlbGF0ZWQgdG8gV29yayBQcm9kdWN0cyBhcyB3ZWxsIGFzIFRhc2tzIHRoYXQgcHJvZHVjZSB0aGVtIGFzIHdlbGwgYXMgYW55IG90aGVyIENvbnRlbnQgRWxlbWVudC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkd1aWRhbmNlIi8+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iR3VpZGVsaW5lIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lmaWMgdHlwZSBvZiBndWlkYW5jZSB0aGF0IHByb3ZpZGVzIGFkZGl0aW9uYWwgZGV0YWlsIG9uIGhvdyB0byBwZXJmb3JtIGEgcGFydGljdWxhciB0YXNrIG9yIGdyb3VwaW5nIG9mIHRhc2tzIChlLmcuIGdyb3VwZWQgdG9nZXRoZXIgYXMgYWN0aXZpdGllcykgb3IgdGhhdCBwcm92aWRlcyBhZGRpdGlvbmFsIGRldGFpbCwgcnVsZXMsIGFuZCByZWNvbW1lbmRhdGlvbnMgb24gd29yayBwcm9kdWN0cyBhbmQgdGhlaXIgcHJvcGVydGllcy4gIEFtb25nc3Qgb3RoZXJzLCBpdCBjYW4gaW5jbHVkZSBkZXRhaWxzIGFib3V0IGJlc3QgcHJhY3RpY2VzIGFuZCBkaWZmZXJlbnQgYXBwcm9hY2hlcyBmb3IgZG9pbmcgd29yaywgaG93IHRvIHVzZSBwYXJ0aWN1bGFyIHR5cGVzIG9mIHdvcmsgcHJvZHVjdHMsIGluZm9ybWF0aW9uIG9uIGRpZmZlcmVudCBzdWJ0eXBlcyBhbmQgdmFyaWFudHMgb2YgdGhlIHdvcmsgcHJvZHVjdCBhbmQgaG93IHRoZXkgZXZvbHZlIHRocm91Z2hvdXQgYSBsaWZlY3ljbGUsIGRpc2N1c3Npb25zIG9uIHNraWxscyB0aGUgcGVyZm9ybWluZyByb2xlcyBzaG91bGQgYWNxdWlyZSBvciBpbXByb3ZlIHVwb24sIG1lYXN1cmVtZW50cyBmb3IgcHJvZ3Jlc3MgYW5kIG1hdHVyaXR5LCBldGMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpHdWlkYW5jZSIvPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkVzdGltYXRlIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lmaWMgdHlwZSBvZiBHdWlkYW5jZSB0aGF0IHByb3ZpZGVzIHNpemluZyBtZWFzdXJlcywgb3Igc3RhbmRhcmRzIGZvciBzaXppbmcgdGhlIHdvcmsgZWZmb3J0IGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIGEgcGFydGljdWxhciBwaWVjZSBvZiB3b3JrIGFuZCBpbnN0cnVjdGlvbnMgZm9yIHRoZWlyIHN1Y2Nlc3NmdWwgdXNlLiBJdCBtYXkgYmUgY29tcHJpc2VkIG9mIGVzdGltYXRpb24gY29uc2lkZXJhdGlvbnMgYW5kIGVzdGltYXRpb24gbWV0cmljcy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkd1aWRhbmNlIj4KLQkJCQk8eHNkOmNob2ljZSBtYXhPY2N1cnM9InVuYm91bmRlZCIgbWluT2NjdXJzPSIwIj4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkVzdGltYXRpb25NZXRyaWMiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkVzdGltYXRpb25Db25zaWRlcmF0aW9ucyIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCTwveHNkOmNob2ljZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJFc3RpbWF0aW5nTWV0cmljIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lmaWMgdHlwZSBvZiBHdWlkYW5jZSB0aGF0IGRlc2NyaWJlcyBhIG1ldHJpYyBvciBtZWFzdXJlIHRoYXQgaXMgYXNzb2NpYXRlZCB3aXRoIGFuIGVsZW1lbnQgYW5kIHdoaWNoIGlzIHVzZWQgdG8gY2FsY3VsYXRlIHRoZSBzaXplIG9mIHRoZSB3b3JrIGVmZm9ydCBhcyB3ZWxsIGFzIGEgcmFuZ2Ugb2YgcG90ZW50aWFsIGxhYm9yLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6R3VpZGFuY2UiLz4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWZpYyB0eXBlIG9mIEd1aWRhbmNlIHRoYXQgcXVhbGlmaWVzIHRoZSB1c2FnZSBhbmQgYXBwbGljYXRpb24gb2YgZXN0aW1hdGlvbiBtZXRyaWNzIGluIHRoZSBkZXZlbG9wbWVudCBvZiBhbiBhY3R1YWwgZXN0aW1hdGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpHdWlkYW5jZSIvPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlJvYWRtYXAiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWZpYyB0eXBlIG9mIEd1aWRhbmNlIHdoaWNoIGlzIG9ubHkgcmVsYXRlZCB0byBBY3RpdmF0ZXMgYW5kIHRoZXJlZm9yZSBoYXMgYmVlbiBhZGRlZCBieSB0aGlzIHBhY2thZ2UgdG8gdGhlIGxpc3Qgb2YgR3VpZGFuY2UgVHlwZXMgcmF0aGVyIHRoYW4gbGlzdGVkIGluIHRoZSBHdWlkYW5jZSBUeXBlcyBwYWNrYWdlLiAgQSBSb2FkbWFwIHJlcHJlc2VudHMgYSBsaW5lYXIgd2Fsa3Rocm91Z2ggb2YgYW4gQWN0aXZpdHksIHR5cGljYWxseSBhIFByb2Nlc3MuCi1BbiBpbnN0YW5jZSBvZiBhIFJvYWRtYXAgcmVwcmVzZW50cyBpbXBvcnRhbnQgZG9jdW1lbnRhdGlvbiBmb3IgdGhlIEFjdGl2aXR5IG9yIFByb2Nlc3MgaXQgaXMgcmVsYXRlZCB0by4gIE9mdGVuIGEgY29tcGxleCBBY3Rpdml0eSBzdWNoIGFzIGEgUHJvY2VzcyBjYW4gYmUgbXVjaCBlYXNpZXIgdW5kZXJzdG9vZCBieSBwcm92aWRpbmcgYSB3YWxrdGhyb3VnaCB3aXRoIGEgbGluZWFyIHRocmVhZCBvZiBhIHR5cGljYWwgaW5zdGFudGlhdGlvbiBvZiB0aGlzIEFjdGl2aXR5LiAgSW4gYWRkaXRpb24gdG8gbWFraW5nIHRoZSBwcm9jZXNzIHByYWN0aXRpb25lciB1bmRlcnN0YW5kIGhvdyB3b3JrIGluIHRoZSBwcm9jZXNzIGlzIGJlaW5nIHBlcmZvcm1lZCwgYSBSb2FkbWFwIHByb3ZpZGVzIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gYWJvdXQgaG93IEFjdGl2aXRpZXMgYW5kIFRhc2tzIHJlbGF0ZSB0byBlYWNoIG90aGVyIG92ZXIgdGltZS4gIFJvYWRtYXBzIGFyZSBhbHNvIHVzZWQgdG8gc2hvdyBob3cgc3BlY2lmaWMgYXNwZWN0cyBhcmUgZGlzdHJpYnV0ZWQgb3ZlciBhIHdob2xlIHByb2Nlc3MgcHJvdmlkaW5nIGEga2luZCBvZiBmaWx0ZXIgb24gdGhlIHByb2Nlc3MgZm9yIHRoaXMgaW5mb3JtYXRpb24uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpHdWlkYW5jZSIvPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlJlcG9ydCI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHByZWRlZmluZWQgdGVtcGxhdGUgb2YgYSByZXN1bHQgdGhhdCBpcyBnZW5lcmF0ZWQgb24gdGhlIGJhc2lzIG9mIG90aGVyIHdvcmsgcHJvZHVjdHMgYXMgYW4gb3V0cHV0IGZyb20gc29tZSBmb3JtIG9mIHRvb2wgYXV0b21hdGlvbi4gQW4gZXhhbXBsZSBmb3IgYSByZXBvcnQgd291bGQgYmUgYSB1c2UgY2FzZSBtb2RlbCBzdXJ2ZXksIHdoaWNoIGlzIGdlbmVyYXRlZCBieSBleHRyYWN0aW5nIGRpYWdyYW0gaW5mb3JtYXRpb24gZnJvbSBhIGdyYXBoaWNhbCBtb2RlbCBhbmQgdGV4dHVhbCBpbmZvcm1hdGlvbiBmcm9tIGRvY3VtZW50cyBhbmQgY29tYmluZXMgdGhlc2UgdHdvIHR5cGVzIG9mIGluZm9ybWF0aW9uIGludG8gYSByZXBvcnQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpHdWlkYW5jZSIvPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlRlbXBsYXRlIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lmaWMgdHlwZSBvZiBndWlkYW5jZSB0aGF0IHByb3ZpZGVzIGZvciBhIHdvcmsgcHJvZHVjdCBhIHByZS1kZWZpbmVkIHRhYmxlIG9mIGNvbnRlbnRzLCBzZWN0aW9ucywgcGFja2FnZXMsIGFuZC9vciBoZWFkaW5ncywgYSBzdGFuZGFyZGl6ZWQgZm9ybWF0LCBhcyB3ZWxsIGFzIGRlc2NyaXB0aW9ucyBob3cgdGhlIHNlY3Rpb25zIGFuZCBwYWNrYWdlcyBhcmUgc3VwcG9zZWQgdG8gYmUgdXNlZCBhbmQgY29tcGxldGVkLiBUZW1wbGF0ZXMgY2Fubm90IG9ubHkgYmUgcHJvdmlkZWQgZm9yIGRvY3VtZW50cywgYnV0IGFsc28gZm9yIGNvbmNlcHR1YWwgbW9kZWxzIG9yIHBoeXNpY2FsIGRhdGEgc3RvcmVzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6R3VpZGFuY2UiLz4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJTdXBwb3J0aW5nTWF0ZXJpYWwiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBjYXRjaGFsbCBmb3Igb3RoZXIgdHlwZXMgb2YgZ3VpZGFuY2Ugbm90IHNwZWNpZmljYWxseSBkZWZpbmVkIGVsc2V3aGVyZS4gSXQgY2FuIGJlIHJlbGF0ZWQgdG8gYWxsIGtpbmRzIG9mIENvbnRlbnQgRWxlbWVudHMsIGkuZS4gaW5jbHVkaW5nIG90aGVyIGd1aWRhbmNlIGVsZW1lbnRzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6R3VpZGFuY2UiLz4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJUb29sTWVudG9yIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgIHNwZWNpZmljIHR5cGUgb2YgZ3VpZGFuY2UgdGhhdCBzaG93cyBob3cgdG8gdXNlIGEgc3BlY2lmaWMgdG9vbCB0byBhY2NvbXBsaXNoIHNvbWUgcGllY2Ugb2Ygd29yayBhIFdvcmsgUHJvZHVjdCBlaXRoZXIgaW4gdGhlIGNvbnRleHQgb2Ygb3IgaW5kZXBlbmRlbnQgZnJvbSBhIFRhc2sgb3IgQWN0aXZpdHkuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpHdWlkYW5jZSIvPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IldoaXRlcGFwZXIiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWFsIENvbmNlcHQgZ3VpZGFuY2UgdGhhdCBoYXZlIGJlZW4gZXh0ZXJuYWxseSByZXZpZXdlZCBvciBwdWJsaXNoZWQgYW5kIGNhbiBiZSByZWFkIGFuZCB1bmRlcnN0b29kIGluIGlzb2xhdGlvbiBvZiBvdGhlciBjb250ZW50IGVsZW1lbnRzIGFuZCBndWlkYW5jZS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkNvbmNlcHQiLz4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJUZXJtRGVmaW5pdGlvbiI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpZmljIHR5cGUgb2YgZ3VpZGFuY2UgdGhhdCBkZWZpbmVzIGNvbmNlcHRzIGFuZCBhcmUgdXNlZCB0byBidWlsZCB1cCB0aGUgR2xvc3NhcnkuIFRlcm1EZWZpbml0aW9ucyBhcmUgbm90IGRpcmVjdGx5IHJlbGF0ZWQgdG8gQ29udGVudEVsZW1lbnRzLCBidXQgdGhlaXIgcmVsYXRpb25zaGlwIGlzIGJlaW5nIGRlcml2ZWQgd2hlbiB0aGUgVGVybSBpcyB1c2VkIGluIHRoZSBDb250ZW50RWxlbWVudHMgZGVzY3JpcHRpb24gdGV4dC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkd1aWRhbmNlIi8+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUHJhY3RpY2UiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWZpYyB0eXBlIG9mIGd1aWRhbmNlIHRoYXQgcmVwcmVzZW50cyBhIHByb3ZlbiB3YXkgb3Igc3RyYXRlZ3kgb2YgZG9pbmcgd29yayB0byBhY2hpZXZlIGEgZ29hbCB0aGF0IGhhcyBhIHBvc2l0aXZlIGltcGFjdCBvbiB3b3JrIHByb2R1Y3Qgb3IgcHJvY2VzcyBxdWFsaXR5LiAgUHJhY3RpY2VzIGFyZSBkZWZpbmVkIG9ydGhvZ29uYWwgdG8gbWV0aG9kcyBhbmQgcHJvY2Vzc2VzLiAgVGhleSBjb3VsZCBzdW1tYXJpemUgYXNwZWN0cyB0aGF0IGltcGFjdCBtYW55IGRpZmZlcmVudCBwYXJ0cyBvZiBhIG1ldGhvZCBvciBzcGVjaWZpYyBwcm9jZXNzZXMuICBFeGFtcGxlcyBmb3IgcHJhY3RpY2VzIHdvdWxkIGJlICJNYW5hZ2UgUmlza3MiLCAiQ29udGludW91c2x5IHZlcmlmeSBxdWFsaXR5IiwgIkFyY2hpdGVjdHVyZS1jZW50cmljIGFuZCBjb21wb25lbnQtYmFzZWQgZGV2ZWxvcG1lbnQiLCBldGMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpHdWlkYW5jZSI+Ci0JCQkJPHhzZDpjaG9pY2UgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJBY3Rpdml0eVJlZmVyZW5jZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQ29udGVudFJlZmVyZW5jZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iU3ViUHJhY3RpY2UiIHR5cGU9InVtYTpQcmFjdGljZSIvPgotCQkJCTwveHNkOmNob2ljZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJSZXVzYWJsZUFzc2V0Ij4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lmaWMgdHlwZSBvZiBndWlkYW5jZSB0aGF0IHByb3ZpZGVzIGEgc29sdXRpb24gdG8gYSBwcm9ibGVtIGZvciBhIGdpdmVuIGNvbnRleHQuIFRoZSBhc3NldCBtYXkgaGF2ZSBhIHZhcmlhYmlsaXR5IHBvaW50LCB3aGljaCBpcyBhIGxvY2F0aW9uIGluIHRoZSBhc3NldCB0aGF0IG1heSBoYXZlIGEgdmFsdWUgcHJvdmlkZWQgb3IgY3VzdG9taXplZCBieSB0aGUgYXNzZXQgY29uc3VtZXIuIFRoZSBhc3NldCBoYXMgcnVsZXMgZm9yIHVzYWdlIHdoaWNoIGFyZSB0aGUgaW5zdHJ1Y3Rpb25zIGRlc2NyaWJpbmcKLWhvdyB0aGUgYXNzZXQgc2hvdWxkIGJlIHVzZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpHdWlkYW5jZSIvPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IldvcmtQcm9kdWN0Ij4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkFuIGFic3RyYWN0IGNsYXNzIHdoaWNoIHByb3ZpZGVzIGEgZ2VuZXJhbGl6YXRpb24gZm9yIHRoZSBjb250ZW50IGVsZW1lbnQgdHlwZXMgQXJ0aWZhY3QsIE91dGNvbWUsIGFuZCBEZWxpdmVyYWJsZS4gIFRoZSBtZXRhLW1vZGVsIGNsYXNzIFdvcmsgUHJvZHVjdCBhY3R1YWxseSByZXByZXNlbnRzIHdvcmsgcHJvZHVjdCB0eXBlcywgaS5lLiBhbiBpbnN0YW5jZSBvZiBXb3JrIFByb2R1Y3QgaXMgYSBkZXNjcmlwdGlvbiBvZiBhIHNwZWNpZmljIHR5cGUgb2Ygd29yayBwcm9kdWN0IGFuZCBub3QgYW4gaW5kaXZpZHVhbCB3b3JrIHByb2R1Y3QgaW5zdGFuY2UuICBIb3dldmVyLCBmb3Igc2ltcGxpY2l0eSByZWFzb25zIGFuZCBiZWNhdXNlIG9mIGxvdyByaXNrIG9mIG1pc2ludGVycHJldGF0aW9uIHdlIGRpZCBub3QgYXBwZW5kIHRoZSB3b3JkICd0eXBlJyB0byBldmVyeSBtZXRhLWNsYXNzLgotQSB3b3JrIHByb2R1Y3QgaXMgYW4gYWJzdHJhY3Rpb24gZm9yIGRlc2NyaXB0aW9ucyBvZiBjb250ZW50IGVsZW1lbnRzIHRoYXQgYXJlIHVzZWQgdG8gZGVmaW5lIGFueXRoaW5nIHVzZWQsIHByb2R1Y2VkLCBvciBtb2RpZmllZCBieSBhIHRhc2suPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpDb250ZW50RWxlbWVudCI+Ci0JCQkJPHhzZDpjaG9pY2UgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJFc3RpbWF0ZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJSZXBvcnQiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlRlbXBsYXRlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJUb29sTWVudG9yIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJPC94c2Q6Y2hvaWNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkFydGlmYWN0Ij4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgV29yayBQcm9kdWN0IHRoYXQgcHJvdmlkZXMgYSBkZXNjcmlwdGlvbiBhbmQgZGVmaW5pdGlvbiBmb3IgdGFuZ2libGUgd29yayBwcm9kdWN0IHR5cGVzLiBBcnRpZmFjdHMgbWF5IGJlIGNvbXBvc2VkIG9mIG90aGVyIGFydGlmYWN0cy4gRm9yIGV4YW1wbGUsIGEgbW9kZWwgYXJ0aWZhY3QgY2FuIGJlIGNvbXBvc2VkIG9mIG1vZGVsIGVsZW1lbnRzLCB3aGljaCBhcmUgYWxzbyBhcnRpZmFjdHMuCi1BcnRpZmFjdHMgYXJlIHRhbmdpYmxlIHdvcmsgcHJvZHVjdHMgY29uc3VtZWQsIHByb2R1Y2VkLCBvciBtb2RpZmllZCBieSBUYXNrcy4gIEl0IG1heSBzZXJ2ZSBhcyBhIGJhc2lzIGZvciBkZWZpbmluZyByZXVzYWJsZSBhc3NldHMuICBSb2xlcyB1c2UgQXJ0aWZhY3RzIHRvIHBlcmZvcm0gVGFza3MgYW5kIHByb2R1Y2UgQXJ0aWZhY3RzIGluIHRoZSBjb3Vyc2Ugb2YgcGVyZm9ybWluZyBUYXNrcy4gIEFydGlmYWN0cyBhcmUgdGhlIHJlc3BvbnNpYmlsaXR5IG9mIGEgc2luZ2xlIFJvbGUsIG1ha2luZyByZXNwb25zaWJpbGl0eSBlYXN5IHRvIGlkZW50aWZ5IGFuZCB1bmRlcnN0YW5kLCBhbmQgcHJvbW90aW5nIHRoZSBpZGVhIHRoYXQgZXZlcnkgcGllY2Ugb2YgaW5mb3JtYXRpb24gcHJvZHVjZWQgaW4gdGhlIG1ldGhvZCByZXF1aXJlcyB0aGUgYXBwcm9wcmlhdGUgc2V0IG9mIHNraWxscy4gRXZlbiB0aG91Z2ggb25lIHJvbGUgbWlnaHQgIm93biIgYSBzcGVjaWZpYyB0eXBlIG9mIEFydGlmYWN0cywgb3RoZXIgcm9sZXMgY2FuIHN0aWxsIHVzZSB0aGUgQXJ0aWZhY3RzOyBwZXJoYXBzIGV2ZW4gdXBkYXRlIHRoZW0gaWYgdGhlIFJvbGUgaGFzIGJlZW4gZ2l2ZW4gcGVybWlzc2lvbiB0byBkbyBzby48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOldvcmtQcm9kdWN0Ij4KLQkJCQk8eHNkOmNob2ljZSBtYXhPY2N1cnM9InVuYm91bmRlZCIgbWluT2NjdXJzPSIwIj4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkNvbnRhaW5lZEFydGlmYWN0IiB0eXBlPSJ1bWE6QXJ0aWZhY3QiLz4KLQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iRGVsaXZlcmFibGUiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBXb3JrIFByb2R1Y3QgdGhhdCBwcm92aWRlcyBhIGRlc2NyaXB0aW9uIGFuZCBkZWZpbml0aW9uIGZvciBwYWNrYWdpbmcgb3RoZXIgV29yayBQcm9kdWN0cywgYW5kIG1heSBiZSBkZWxpdmVyZWQgdG8gYW4gaW50ZXJuYWwgb3IgZXh0ZXJuYWwgcGFydHkuICBUaGVyZWZvcmUsIGEgRGVsaXZlcmFibGUgYWdncmVnYXRlcyBvdGhlciBXb3JrIFByb2R1Y3RzLiBUaGVyZWZvcmUsIGEgRGVsaXZlcmFibGUgYWdncmVnYXRlcyBvdGhlciBXb3JrIFByb2R1Y3RzLiAgQSBEZWxpdmVyYWJsZSBpcyB1c2VkIHRvIHByZS1kZWZpbmUgdHlwaWNhbCBvciByZWNvbW1lbmRlZCBjb250ZW50IGluIHRoZSBmb3JtIG9yIHdvcmsgcHJvZHVjdHMgdGhhdCB3b3VsZCBiZSBwYWNrYWdlZCBmb3IgZGVsaXZlcnkuICBUaGUgYWN0dWFsIHBhY2thZ2luZyBvZiB0aGUgRGVsaXZlcmFibGUgaW4gYW4gYWN0dWFsIHByb2Nlc3Mgb3IgZXZlbiBwcm9qZWN0IGNvdWxkIGJlIGEgbW9kaWZpY2F0aW9uIG9mIHRoaXMgcmVjb21tZW5kYXRpb24uICBEZWxpdmVyYWJsZXMgYXJlIHVzZWQgdG8gcmVwcmVzZW50IGFuIG91dHB1dCBmcm9tIGEgcHJvY2VzcyB0aGF0IGhhcyB2YWx1ZSwgbWF0ZXJpYWwgb3Igb3RoZXJ3aXNlLCB0byBhIGNsaWVudCwgY3VzdG9tZXIgb3Igb3RoZXIgc3Rha2Vob2xkZXIuIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6V29ya1Byb2R1Y3QiPgotCQkJCTx4c2Q6Y2hvaWNlIG1heE9jY3Vycz0idW5ib3VuZGVkIiBtaW5PY2N1cnM9IjAiPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iRGVsaXZlcmVkV29ya1Byb2R1Y3QiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iT3V0Y29tZSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIFdvcmsgUHJvZHVjdCB0aGF0IGRlc2NyaWJlcyBpbnRhbmdpYmxlIHdvcmsgcHJvZHVjdHMgdGhhdCBhcmUgYSByZXN1bHQgb3Igc3RhdGUuIE91dGNvbWVzIG1heSBhbHNvIGJlIHVzZWQgdG8gZGVzY3JpYmUgd29yayBwcm9kdWN0cyB0aGF0IGFyZSBub3QgZm9ybWFsbHkgZGVmaW5lZC4gIEEga2V5IGRpZmZlcmVudGlhdG9yIGZvciBvdXRjb21lcyBhZ2FpbnN0IGFydGlmYWN0cyBpcyB0aGF0IG91dGNvbWVzIGFyZSBub3QgY2FuZGlkYXRlcyBmb3IgaGFydmVzdGluZyBhcyByZXVzYWJsZSBhc3NldHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpXb3JrUHJvZHVjdCIvPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlJvbGUiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBDb250ZW50IEVsZW1lbnQgdGhhdCBkZWZpbmVzIGEgc2V0IG9mIHJlbGF0ZWQgc2tpbGxzLCBjb21wZXRlbmNpZXMsIGFuZCByZXNwb25zaWJpbGl0aWVzLiAgUm9sZXMgYXJlIHVzZWQgYnkgVGFza3MgdG8gZGVmaW5lIHdobyBwZXJmb3JtcyB0aGVtIGFzIHdlbGwgYXMgZGVmaW5lIGEgc2V0IG9mIHdvcmsgcHJvZHVjdHMgdGhleSBhcmUgcmVzcG9uc2libGUgZm9yLiAgCi1BIFJvbGUgZGVmaW5lcyBhIHNldCBvZiByZWxhdGVkIHNraWxscywgY29tcGV0ZW5jaWVzLCBhbmQgcmVzcG9uc2liaWxpdGllcyBvZiBhbiBpbmRpdmlkdWFsIG9yIGEgc2V0IG9mIGluZGl2aWR1YWxzLiAgUm9sZXMgYXJlIG5vdCBpbmRpdmlkdWFscyBvciByZXNvdXJjZXMuICBJbmRpdmlkdWFsIG1lbWJlcnMgb2YgdGhlIGRldmVsb3BtZW50IG9yZ2FuaXphdGlvbiB3aWxsIHdlYXIgZGlmZmVyZW50IGhhdHMsIG9yIHBlcmZvcm0gZGlmZmVyZW50IHJvbGVzLiBUaGUgbWFwcGluZyBmcm9tIGluZGl2aWR1YWwgdG8gcm9sZSwgcGVyZm9ybWVkIGJ5IHRoZSBwcm9qZWN0IG1hbmFnZXIgd2hlbiBwbGFubmluZyBhbmQgc3RhZmZpbmcgZm9yIGEgcHJvamVjdCwgYWxsb3dzIGRpZmZlcmVudCBpbmRpdmlkdWFscyB0byBhY3QgYXMgc2V2ZXJhbCBkaWZmZXJlbnQgcm9sZXMsIGFuZCBmb3IgYSByb2xlIHRvIGJlIHBsYXllZCBieSBzZXZlcmFsIGluZGl2aWR1YWxzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6Q29udGVudEVsZW1lbnQiPgotCQkJCTx4c2Q6Y2hvaWNlIG1heE9jY3Vycz0idW5ib3VuZGVkIiBtaW5PY2N1cnM9IjAiPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUmVzcG9uc2libGVGb3IiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iVGFzayI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIENvbnRlbnQgRWxlbWVudCB0aGF0IGRlc2NyaWJlcyB3b3JrIGJlaW5nIHBlcmZvcm1lZCBieSBSb2xlcy4gIEl0IGRlZmluZXMgb25lIGRlZmF1bHQgcGVyZm9ybWluZyBSb2xlIGFzIHdlbGwgYXMgbWFueSBhZGRpdGlvbmFsIHBlcmZvcm1lcnMuICBBIFRhc2sgaXMgYXNzb2NpYXRlZCB0byBpbnB1dCBhbmQgb3V0cHV0IHdvcmsgcHJvZHVjdHMuICBJbnB1dHMgYXJlIGRpZmZlcmVudGlhdGVkIGluIG1hbmRhdG9yeSB2ZXJzdXMgb3B0aW9uYWwgaW5wdXRzLiAgVGhlIGFzc29jaWF0aW9ucyB0byBXb3JrIFByb2R1Y3RzIGFyZSBub3QgaW5zdGFudGlhdGFibGUvdmFyaWFibGUtbGlrZSBwYXJhbWV0ZXJzLiAgVGhleSByYXRoZXIgZXhwcmVzcyAoaHlwZXItKWxpbmtzIHRvIHRoZSBkZXNjcmlwdGlvbnMgb2YgdGhlIHdvcmsgcHJvZHVjdHMgdHlwZXMgdGhhdCBhcmUgcmVsYXRlZCB0byB0aGUgVGFzayBhcyBpbnB1dHMgYW5kIG91dHB1dHMuICBJbiBvdGhlciB3b3JkcywgdGhlc2UgYXNzb2NpYXRpb25zIGFyZSBub3QgaW50ZW5kZWQgdG8gYmUgdXNlZCB0byBjYXB0dXJlIHdoaWNoIGNvbmNyZXRlIGluc3RhbmNlcyB3aWxsIGJlIHBhc3NlZCB3aGVuIGluc3RhbnRpYXRpbmcgdGhlIG1ldGhvZCBpbiBhIHByb2plY3QuICBBbGwgb2YgdGhlIFRhc2sncyBkZWZhdWx0IGFzc29jaWF0aW9ucyBjYW4gYmUgb3ZlcnJpZGRlbiBpbiBhbiBhY3R1YWwgcHJvY2VzcyBkZWZpbml0aW9uLgotQSBUYXNrIGRlc2NyaWJlcyBhbiBhc3NpZ25hYmxlIHVuaXQgb2Ygd29yay4gIEV2ZXJ5IFRhc2sgaXMgYXNzaWduZWQgdG8gc3BlY2lmaWMgUm9sZXMuICBUaGUgZ3JhbnVsYXJpdHkgb2YgYSBUYXNrIGlzIGdlbmVyYWxseSBhIGZldyBob3VycyB0byBhIGZldyBkYXlzLiAgSXQgdXN1YWxseSBhZmZlY3RzIG9uZSBvciBvbmx5IGEgc21hbGwgbnVtYmVyIG9mIHdvcmsgcHJvZHVjdHMuIEEgVGFzayBpcyB1c2VkIGFzIGFuIGVsZW1lbnQgb2YgZGVmaW5pbmcgYSBwcm9jZXNzLiBUYXNrcyBhcmUgZnVydGhlciB1c2VkIGZvciBwbGFubmluZyBhbmQgdHJhY2tpbmcgcHJvZ3Jlc3M7IHRoZXJlZm9yZSwgaWYgdGhleSBhcmUgZGVmaW5lZCB0b28gZmluZS1ncmFpbmVkLCB0aGV5IHdpbGwgYmUgbmVnbGVjdGVkLCBhbmQgaWYgdGhleSBhcmUgdG9vIGxhcmdlLCBwcm9ncmVzcyB3b3VsZCBoYXZlIHRvIGJlIGV4cHJlc3NlZCBpbiB0ZXJtcyBvZiBhIFRhc2sncyBwYXJ0cyAoZS5nLiBTdGVwcywgd2hpY2ggaXMgbm90IHJlY29tbWVuZGVkKS4gCi1BIFRhc2sgaGFzIGEgY2xlYXIgcHVycG9zZSBpbiB3aGljaCB0aGUgcGVyZm9ybWluZyByb2xlcyBhY2hpZXZlIGEgd2VsbCBkZWZpbmVkIGdvYWwuICBJdCBwcm92aWRlcyBjb21wbGV0ZSBzdGVwLWJ5LXN0ZXAgZXhwbGFuYXRpb25zIG9mIGRvaW5nIGFsbCB0aGUgd29yayB0aGF0IG5lZWRzIHRvIGJlIGRvbmUgdG8gYWNoaWV2ZSB0aGlzIGdvYWwuICBUaGlzIGRlc2NyaXB0aW9uIGlzIGNvbXBsZXRlLCBpbmRlcGVuZGVudCBvZiB3aGVuIGluIGEgcHJvY2VzcyBsaWZlY3ljbGUgdGhlIHdvcmsgd291bGQgYWN0dWFsbHkgYmUgZG9uZS4gIEl0IHRoZXJlZm9yZSBkb2VzIG5vdCBkZXNjcmliZSB3aGVuIHlvdSBkbyB3aGF0IHdvcmsgYXQgd2hhdCBwb2ludCBvZiB0aW1lLCBidXQgZGVzY3JpYmVzIGFsbCB0aGUgd29yayB0aGF0IGdldHMgZG9uZSB0aHJvdWdob3V0IHRoZSBkZXZlbG9wbWVudCBsaWZlY3ljbGUgdGhhdCBjb250cmlidXRlcyB0byB0aGUgYWNoaWV2ZW1lbnQgb2YgdGhpcyBnb2FsLiAgV2hlbiB0aGUgVGFzayBpcyBiZWluZyBhcHBsaWVkIGluIGEgcHJvY2VzcyB0aGVuIHRoaXMgcHJvY2VzcyBhcHBsaWNhdGlvbiAoZGVmaW5lZCBhcyBUYXNrIERlc2NyaXB0b3IpIHByb3ZpZGVzIHRoZSBpbmZvcm1hdGlvbiBvZiB3aGljaCBwaWVjZXMgb2YgdGhlIFRhc2sgd2lsbCBhY3R1YWxseSBiZSBwZXJmb3JtZWQgYXQgYW55IHBhcnRpY3VsYXIgcG9pbnQgaW4gdGltZS4gVGhpcyBhc3N1bWVzIHRoYXQgdGhlIFRhc2sgd2lsbCBiZSBwZXJmb3JtZWQgaW4gdGhlIHByb2Nlc3Mgb3ZlciBhbmQgb3ZlciBhZ2FpbiwgYnV0IGVhY2ggdGltZSB3aXRoIGEgc2xpZ2h0bHkgZGlmZmVyZW50IGVtcGhhc2lzIG9uIGRpZmZlcmVudCBzdGVwcyBvciBhc3BlY3RzIG9mIHRoZSB0YXNrIGRlc2NyaXB0aW9uLiAKLUZvciBleGFtcGxlLCBhIFRhc2sgc3VjaCBhcyAiRGV2ZWxvcCBVc2UgQ2FzZSBNb2RlbCIgZGVzY3JpYmVzIGFsbCB0aGUgd29yayB0aGF0IG5lZWRzIHRvIGJlIGRvbmUgdG8gZGV2ZWxvcCBhIGNvbXBsZXRlIHVzZSBjYXNlIG1vZGVsLiBUaGlzIHdvdWxkIGNvbXByaXNlIG9mIHRoZSBpZGVudGlmaWNhdGlvbiBhbmQgbmFtaW5nIG9mIHVzZSBjYXNlcyBhbmQgYWN0b3JzLCB0aGUgd3JpdGluZyBvZiBhIGJyaWVmIGRlc2NyaXB0aW9uLCB0aGUgbW9kZWxpbmcgb2YgdXNlIGNhc2VzIGFuZCB0aGVpciByZWxhdGlvbnNoaXBzIGluIGRpYWdyYW1zLCB0aGUgZGV0YWlsZWQgZGVzY3JpcHRpb24gb2YgYSBiYXNpYyBmbG93LCB0aGUgZGV0YWlsZWQgZGVzY3JpcHRpb24gb2YgYWx0ZXJuYXRpdmVzIGZsb3dzLCBwZXJmb3JtaW5nIG9mIHdhbGt0aHJvdWdocyB3b3Jrc2hvcHMgYW5kIHJldmlld3MsIGV0Yy4gIEFsbCBvZiB0aGVzZSBwYXJ0cyBjb250cmlidXRlIHRvIHRoZSBkZXZlbG9wbWVudCBnb2FsIG9mIGRldmVsb3BpbmcgdGhlIHVzZSBjYXNlIG1vZGVsLCBidXQgdGhlIHBhcnRzIHdpbGwgYmUgcGVyZm9ybWVkIGF0IGRpZmZlcmVudCBwb2ludHMgaW4gdGltZSBpbiBhIHByb2Nlc3MuICBJZGVudGlmaWNhdGlvbiwgbmFtaW5nLCBhbmQgYnJpZWYgZGVzY3JpcHRpb25zIHdvdWxkIGJlIHBlcmZvcm1lZCBlYXJseSBpbiBhIHR5cGljYWwgZGV2ZWxvcG1lbnQgcHJvY2VzcyB2ZXJzdXMgdGhlIHdyaXRpbmcgb2YgZGV0YWlsZWQgYWx0ZXJuYXRpdmUgZmxvd3Mgd2hpY2ggd291bGQgYmUgcGVyZm9ybWVkIG11Y2ggbGF0ZXIuICBBbGwgdGhlc2UgcGFydHMgb3Igc3RlcHMgd2l0aGluIHRoZSBzYW1lIFRhc2sgZGVmaW5lIHRoZSAibWV0aG9kIiBvZiBEZXZlbG9waW5nIGEgVXNlIENhc2UgTW9kZWwuICBBcHBseWluZyBzdWNoIGEgbWV0aG9kIGluIGEgbGlmZWN5Y2xlIChpLmUuIGluIGEgcHJvY2VzcykgaXMgZGVmaW5pbmcgd2hpY2ggc3RlcHMgYXJlIGRvbmUgd2hlbiBnb2luZyBmcm9tIG9uZSBpdGVyYXRpb24gdG8gdGhlIG5leHQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpDb250ZW50RWxlbWVudCI+Ci0JCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iUHJlY29uZGl0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlBvc3Rjb25kaXRpb24iIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iUGVyZm9ybWVkQnkiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJPHhzZDpjaG9pY2UgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iTWFuZGF0b3J5SW5wdXQiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJPdXRwdXQiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJBZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Ik9wdGlvbmFsSW5wdXQiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJFc3RpbWF0ZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkVzdGltYXRpb25Db25zaWRlcmF0aW9ucyIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlRvb2xNZW50b3IiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJPC94c2Q6Y2hvaWNlPgotCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IldvcmtEZWZpbml0aW9uIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkFuIGFic3RyYWN0IE1ldGhvZCBFbGVtZW50IHRoYXQgZ2VuZXJhbGl6ZXMgYWxsIGRlc2NyaXB0aW9ucyBvZiB3b3JrIHdpdGhpbiB0aGUgVW5pZmllZCBNZXRob2QgQXJjaGl0ZWN0dXJlLiAgVGhpcyBwYWNrYWdlIGludHJvZHVjZXMgdHdvIGNvbmNyZXRlIHR5cGVzIG9mIFdvcmsgRGVmaW5pdGlvbnM6IFRhc2sgYW5kIFN0ZXAuICBXb3JrIERlZmluaXRpb25zIGNhbiBjb250YWluIHNldHMgb2YgcHJlLSBhbmQgcG9zdC1jb25kaXRpb25zIGRlZmluaW5nIGNvbnN0cmFpbnRzIHRoYXQgbmVlZCB0byBiZSB2YWxpZCBiZWZvcmUgdGhlIGRlc2NyaWJlZCB3b3JrIGNhbiBiZWdpbiBvciBiZWZvcmUgaXQgY2FuIGJlIGRlY2xhcmVkIGFzIGZpbmlzaGVkLiAgTm90ZSB0aGF0IGdlbmVyYWwgb3duZWRSdWxlcyBjYW4gYmUgdXNlZCB0byBkZWZpbmUgYWRkaXRpb25hbCBjb25zdHJhaW50cyBhbmQgcnVsZXMgZm9yIFdvcmsgRGVmaW5pdGlvbnMuCi1Xb3JrIERlZmluaXRpb25zIHJlcHJlc2VudCBiZWhhdmlvcmFsIGRlc2NyaXB0aW9ucyBmb3IgZG9pbmcgd29yay4gIFRoZXNlIGJlaGF2aW9yYWwgZGVzY3JpcHRpb25zIGFyZSBub3QgYm91bmQgdG8gb25lIHNwZWNpZmljIGNsYXNzaWZpZXIsIGJ1dCByZXByZXNlbnQgYW4gYXJiaXRyYXJ5IGRlZmluaXRpb24gb2Ygd29yay4gIEZvciBleGFtcGxlLCBhIFdvcmsgRGVmaW5pdGlvbiBjb3VsZCByZXByZXNlbnQgd29yayB0aGF0IGlzIGJlaW5nIHBlcmZvcm1lZCBieSBhIHNwZWNpZmljIFJvbGUgKGUuZy4gYSBSb2xlIHBlcmZvcm1pbmcgYSBzcGVjaWZpYyBUYXNrIG9yIFN0ZXBzIG9mIGEgVGFzayksIGJ5IG1hbnkgUm9sZXMgd29ya2luZyBpbiBjbG9zZSBjb2xsYWJvcmF0aW9uIChtYW55IFJvbGVzIGFsbCB3b3JraW5nIHRvZ2V0aGVyIG9uIHRoZSBzYW1lIGludGVyZGlzY2lwbGluYXJ5IFRhc2spLCBvciBjb21wbGV4IHdvcmsgdGhhdCBpcyBwZXJmb3JtZWQgdGhyb3VnaG91dCB0aGUgbGlmZWN5Y2xlIChlLmcuIGEgcHJvY2VzcyBkZWZpbmluZyBhIGJyZWFrZG93biBzdHJ1Y3R1cmUgZm9yIG9yZ2FuaXppbmcgbGFyZ2VyIGNvbXBvc2l0ZSB1bml0cyBvZiB3b3JrIHBlcmZvcm1lZCBieSBtYW55IFJvbGVzIHdvcmtpbmcgaW4gY29sbGFib3JhdGlvbikuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpNZXRob2RFbGVtZW50Ij4KLQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQk8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJQcmVjb25kaXRpb24iIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iUG9zdGNvbmRpdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkNvbnRlbnRDYXRlZ29yeSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BbiBhYnN0cmFjdCBjbGFzcyBnZW5lcmFsaXppbmcgY29udGVudCBjYXRlZ29yeSB0eXBlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkNvbnRlbnRFbGVtZW50Ii8+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iRGlzY2lwbGluZSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIGNhdGVnb3JpemF0aW9uIG9mIHdvcmsgKGkuZS4gVGFza3MgZm9yIE1ldGhvZCBDb250ZW50KSwgYmFzZWQgdXBvbiBzaW1pbGFyaXR5IG9mIGNvbmNlcm5zIGFuZCBjb29wZXJhdGlvbiBvZiB3b3JrIGVmZm9ydC4KLUEgZGlzY2lwbGluZSBpcyBhIGNvbGxlY3Rpb24gb2YgVGFza3MgdGhhdCBhcmUgcmVsYXRlZCB0byBhIG1ham9yICdhcmVhIG9mIGNvbmNlcm4nIHdpdGhpbiB0aGUgb3ZlcmFsbCBwcm9qZWN0LiBUaGUgZ3JvdXBpbmcgb2YgVGFza3MgaW50byBkaXNjaXBsaW5lcyBpcyBtYWlubHkgYW4gYWlkIHRvIHVuZGVyc3RhbmRpbmcgdGhlIHByb2plY3QgZnJvbSBhICd0cmFkaXRpb25hbCcgd2F0ZXJmYWxsIHBlcnNwZWN0aXZlLiBIb3dldmVyLCB0eXBpY2FsbHksIGZvciBleGFtcGxlLCBpdCBpcyBtb3JlIGNvbW1vbiB0byBwZXJmb3JtIGNlcnRhaW4gcmVxdWlyZW1lbnRzIGFjdGl2aXRpZXMgaW4gY2xvc2UgY29vcmRpbmF0aW9uIHdpdGggYW5hbHlzaXMgYW5kIGRlc2lnbiBhY3Rpdml0aWVzLiBTZXBhcmF0aW5nIHRoZXNlIGFjdGl2aXRpZXMgaW50byBzZXBhcmF0ZSBkaXNjaXBsaW5lcyBtYWtlcyB0aGUgYWN0aXZpdGllcyBlYXNpZXIgdG8gY29tcHJlaGVuZC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkNvbnRlbnRDYXRlZ29yeSI+Ci0JCQkJPHhzZDpjaG9pY2UgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJUYXNrIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJTdWJEaXNjaXBsaW5lIiB0eXBlPSJ1bWE6RGlzY2lwbGluZSIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUmVmZXJlbmNlV29ya2Zsb3ciIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iRGlzY2lwbGluZUdyb3VwaW5nIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPlVzZWQgdG8gZ3JvdXAgRGlzY2lwbGluZXMuICBGb3IgZXhhbXBsZSwgdGhlIERpc2NpcGxpbmUgR3JvdXBpbmcgIlNvZnR3YXJlIERpc2NpcGxpbmVzIiB3b3VsZCBiZSB0aGUgZ3JvdXAgb2YgYWxsIGRpc2NpcGxpbmVzIHJlbGF0ZWQgdG8gZGV2ZWxvcGluZyBzb2Z0d2FyZSBzdWNoIGFzICJSZXF1aXJlbWVudHMgTWFuYWdlbWVudCIgb3IgIlRlc3RpbmciOyAiSVQgSW5mcmFzdHJ1Y3R1cmUgTWFuYWdlbWVudCIgd291bGQgYmUgYSBEaXNjaXBsaW5lcyBHcm91cGluZyBmb3IgZGlzY2lwbGluZXMgc3VjaCBhcyAiSVQgT3BlcmF0aW9uYWwgU2VydmljZXMiLCAiSVQgQ3VzdG9tZXIgUmVsYXRpb25zaGlwcyIsIG9yICJJVCBFbmFibGluZyBTZXJ2aWNlcyIuICBEaXNjaXBsaW5lcyBjYW4gYmUgYXNzb2NpYXRlZCB0byBtb3JlIHRoYW4gb25lIERpc2NpcGxpbmUgR3JvdXBpbmcuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpDb250ZW50Q2F0ZWdvcnkiPgotCQkJCTx4c2Q6Y2hvaWNlIG1heE9jY3Vycz0idW5ib3VuZGVkIiBtaW5PY2N1cnM9IjAiPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iRGlzY2lwbGluZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCTwveHNkOmNob2ljZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJEb21haW4iPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSByZWZpbmVhYmxlIGhpZXJhcmNoeSBncm91cGluZyByZWxhdGVkIHdvcmsgcHJvZHVjdHMuICBJbiBvdGhlciB3b3JkcywgRG9tYWlucyBjYW4gYmUgZnVydGhlciBkaXZpZGVkIGludG8gc3ViLWRvbWFpbnMsIHdpdGggd29yayBwcm9kdWN0IGVsZW1lbnRzIHRvIGJlIGNhdGVnb3JpemVkIG9ubHkgYXQgdGhlIGxlYWYtbGV2ZWwgb2YgdGhpcyBoaWVyYXJjaHkuCi1Eb21haW4gaXMgYSBsb2dpY2FsIGdyb3VwaW5nIG9mIHdvcmsgcHJvZHVjdHMgdGhhdCBoYXZlIGFuIGFmZmluaXR5IHRvIGVhY2ggb3RoZXIgYmFzZWQgb24gcmVzb3VyY2VzLCB0aW1pbmcsIG9yIHJlbGF0aW9uc2hpcC4gIEEgRG9tYWluIG1heSBiZSBkaXZpZGVkIGludG8gc3ViZG9tYWlucy4gIEZvciBleGFtcGxlLCBHUyBNZXRob2QgdXNlcyBzaXggcHJlZGVmaW5lZCBEb21haW5zIGZvciBXb3JrIFByb2R1Y3RzOiBBcHBsaWNhdGlvbiwgQXJjaGl0ZWN0dXJlLCBCdXNpbmVzcywgRW5nYWdlbWVudCwgT3BlcmF0aW9ucyBhbmQgT3JnYW5pemF0aW9uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6Q29udGVudENhdGVnb3J5Ij4KLQkJCQk8eHNkOmNob2ljZSBtYXhPY2N1cnM9InVuYm91bmRlZCIgbWluT2NjdXJzPSIwIj4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IldvcmtQcm9kdWN0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJTdWJkb21haW4iIHR5cGU9InVtYTpEb21haW4iLz4KLQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUm9sZVNldCI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5Pcmdhbml6ZXMgUm9sZXMgaW50byBjYXRlZ29yaWVzLiAgSXQgaXMgdXNlZCB0byBncm91cCByb2xlcyB0b2dldGhlciB0aGF0IGhhdmUgY2VydGFpbiBjb21tb25hbGl0aWVzLiAgRm9yIGV4YW1wbGUsIHRoZSAiQW5hbHlzdHMiIFJvbGUgU2V0IGNvdWxkIGdyb3VwIHRoZSAiQnVzaW5lc3MgUHJvY2VzcyBBbmFseXN0IiwgIlN5c3RlbSBBbmFseXN0IiwgYXMgd2VsbCBhcyAiUmVxdWlyZW1lbnRzIFNwZWNpZmllciIgcm9sZXMuICBBbGwgb2YgdGhlc2Ugd29yayB3aXRoIHNpbWlsYXIgdGVjaG5pcXVlcyBhbmQgaGF2ZSBvdmVybGFwcGluZyBza2lsbHMsIGJ1dCBhcmUgcmVxdWlyZWQgYXMgZGlzdGluY3Qgcm9sZXMgZm9yIGEgbWV0aG9kIChlLmcuIHRoZSBtZXRob2QgdGhlIElCTSBSYXRpb25hbCBVbmlmaWVkIFByb2Nlc3MgaXMgYmFzZWQgb24pLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6Q29udGVudENhdGVnb3J5Ij4KLQkJCQk8eHNkOmNob2ljZSBtYXhPY2N1cnM9InVuYm91bmRlZCIgbWluT2NjdXJzPSIwIj4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlJvbGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUm9sZVNldEdyb3VwaW5nIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPlJvbGUgU2V0cyBjYW4gYmUgY2F0ZWdvcml6ZWQgaW50byBSb2xlIFNldCBHcm91cGluZ3MuICBGb3IgZXhhbXBsZSwgZGlmZmVyZW50IG1ldGhvZHMgbWlnaHQgZGVmaW5lIHNpbWlsYXIgUm9sZSBTZXRzLCB3aGljaCBob3dldmVyIG5lZWQgdG8gYmUgZGlzdGluZ3Vpc2hlZCBmcm9tIGVhY2ggb3RoZXIgb24gYSBnbG9iYWwgc2NhbGUuICBUaHVzLCBSb2xlIFNldCBHcm91cGluZ3MgYWxsb3cgZGlzdGluZ3Vpc2hpbmcsIGZvciBleGFtcGxlLCBTb2Z0d2FyZSBTZXJ2aWNlcyBNYW5hZ2VyIFJvbGUgU2V0cyBmcm9tIFNvZnR3YXJlIERldmVsb3BtZW50IE9yZ2FuaXphdGlvbiBNYW5hZ2VyIFJvbGUgU2V0cy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkNvbnRlbnRDYXRlZ29yeSI+Ci0JCQkJPHhzZDpjaG9pY2UgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJSb2xlU2V0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJPC94c2Q6Y2hvaWNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlRvb2wiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBjb250YWluZXIvYWdncmVnYXRlIGZvciBUb29sTWVudG9ycy4gIEl0IGNhbiBhbHNvIHByb3ZpZGUgZ2VuZXJhbCBkZXNjcmlwdGlvbnMgb2YgdGhlIHRvb2wgYW5kIGl0cyBnZW5lcmFsIGNhcGFiaWxpdGllcy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkNvbnRlbnRDYXRlZ29yeSI+Ci0JCQkJPHhzZDpjaG9pY2UgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJUb29sTWVudG9yIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJPC94c2Q6Y2hvaWNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IldvcmtQcm9kdWN0VHlwZSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNlY29uZCBjYXRlZ29yeSBmb3Igd29yayBwcm9kdWN0cywgd2hpY2ggaW4gY29udHJhc3QgdG8gRG9tYWluIGlzIG1vcmUgcHJlc2VudGF0aW9uIG9yaWVudGVkLiAgQSB3b3JrIHByb2R1Y3QgY2FuIGhhdmUgbWFueSBXb3JrIFByb2R1Y3QgVHlwZXMuICBFeGFtcGxlcywgZm9yIGEgV29yayBQcm9kdWN0IFR5cGUgaXMgIkNsYXNzIERpYWdyYW0iLCB3aGljaCBjYXRlZ29yaXplcyB0aGUgQXJ0aWZhY3RzIEFuYWx5c2lzIE1vZGVsLCBEZXNpZ24gTW9kZWwsIFVzZXIgRXhwZXJpZW5jZSBNb2RlbCwgb3IgIlNwZWNpZmljYXRpb24iLCB3aGljaCBjYXRlZ29yaXplcyByZXF1aXJlbWVudHMgc3BlY2lmaWNhdGlvbnMgdGhhdCBkZWZpbmUgYSBzeXN0ZW0gd2l0aCBhIHdlbGwtZGVmaW5lZCBzeXN0ZW0gYm91bmRhcnksIHN1Y2ggYXMgdXNlIGNhc2Ugb3IgZnVuY3Rpb25hbCByZXF1aXJlbWVudHMgc3BlY2lmaWNhdGlvbi4gIEEgV29yayBQcm9kdWN0IGNhbiBiZSBjYXRlZ29yaXplZCB0byBiZSBvZiBtYW55IFdvcmsgUHJvZHVjdCBUeXBlcy4gIEZvciBleGFtcGxlLCBhIHVzZSBjYXNlIG1vZGVsIGNhbiBiZSBjYXRlZ29yaXplZCBhcyBhIFNwZWNpZmljYXRpb24gYXMgd2VsbCBhcyBEaWFncmFtIFdvcmsgUHJvZHVjdCBUeXBlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6Q29udGVudENhdGVnb3J5Ij4KLQkJCQk8eHNkOmNob2ljZSBtYXhPY2N1cnM9InVuYm91bmRlZCIgbWluT2NjdXJzPSIwIj4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IldvcmtQcm9kdWN0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJPC94c2Q6Y2hvaWNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkN1c3RvbUNhdGVnb3J5Ij4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgY2F0ZWdvcnkgaW50cm9kdWNlZCBieSBhIG1ldGhvZCBjb250ZW50IGF1dGhvciB0byBzdHJ1Y3R1cmUgYW55IG51bWJlciBvZiBtZXRob2QgQ29udGVudCBFbGVtZW50cyBvZiBhbnkgc3VidHlwZSBiYXNlZCBvbiB1c2VyLWRlZmluZWQgY3JpdGVyaWEuICBCZWNhdXNlIENvbnRlbnQgQ2F0ZWdvcmllcyAoYW5kIHRoZXJlZm9yZSBDdXN0b20gQ2F0ZWdvcmllcywgdG9vKSBhcmUgQ29udGVudCBFbGVtZW50cyB0aGVtc2VsdmVzLCBDdXN0b20gQ2F0ZWdvcmllcyBjYW4gYmUgdXNlZCB0byByZWN1cnNpdmVseSBjYXRlZ29yaXplIENvbnRlbnQgQ2F0ZWdvcmllcyBhcyB3ZWxsLiAgQ3VzdG9tIENhdGVnb3JpZXMgY2FuIGFsc28gYmUgbmVzdGVkIHdpdGggYW55IENvbnRlbnQgQ2F0ZWdvcnkuICBDdXN0b20gY2F0ZWdvcmllcyBjYW4gYmUgdXNlZCB0byBjYXRlZ29yaXplIGNvbnRlbnQgYmFzZWQgb24gdGhlIHVzZXIncyBjcml0ZXJpYSBhcyB3ZWxsIGFzIHRvIGRlZmluZSB3aG9sZSB0cmVlLXN0cnVjdHVyZXMgb2YgbmVzdGVkIGNhdGVnb3JpZXMgYWxsb3dpbmcgdGhlIHVzZXIgdG8gc3lzdGVtYXRpY2FsbHkgbmF2aWdhdGUgYW5kIGJyb3dzZSBtZXRob2QgY29udGVudCBhbmQgcHJvY2Vzc2VzIGJhc2VkIG9uIHRoZXNlIGNhdGVnb3JpZXMuICBGb3IgZXhhbXBsZSwgb25lIGNvdWxkIGNyZWF0ZSBhIGN1c3RvbSBjYXRlZ29yeSB0byBsb2dpY2FsbHkgb3JnYW5pemUgY29udGVudCByZWxldmFudCBmb3IgdGhlIHVzZXIncyBkZXZlbG9wbWVudCBvcmdhbml6YXRpb24gZGVwYXJ0bWVudHM7IGUuZy4gYSAiVGVzdGluZyIgY2F0ZWdvcnkgdGhhdCBncm91cHMgdG9nZXRoZXIgYWxsIHJvbGVzLCB3b3JrIHByb2R1Y3RzLCB0YXNrcywgYW5kIGd1aWRhbmNlIGVsZW1lbnQgcmVsZXZhbnQgdG8gdGVzdGluZy4gIEFub3RoZXIgZXhhbXBsZSB3b3VsZCBiZSBjYXRlZ29yaWVzIHRoYXQgZXhwcmVzcyBsaWNlbnNpbmcgbGV2ZWxzIG9mIHRoZSBjb250ZW50IGdyb3VwaW5nIGZyZWVseSBkaXN0cmlidXRhYmxlIG1ldGhvZCBjb250ZW50IHZlcnN1cyBjb250ZW50IHRoYXQgcmVwcmVzZW50IGludGVsbGVjdHVhbCBwcm9wZXJ0eSBhbmQgcmVxdWlyZXMgYSBsaWNlbnNlIHRvIGJlIHB1cmNoYXNlZCB0byBiZSBhYmxlIHRvIHVzZSBpdC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkNvbnRlbnRDYXRlZ29yeSI+Ci0JCQkJPHhzZDpjaG9pY2UgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJDYXRlZ29yaXplZEVsZW1lbnQiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlN1YkNhdGVnb3J5IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJPC94c2Q6Y2hvaWNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ik1ldGhvZFBhY2thZ2UiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QW4gYWJzdHJhY3QgY2xhc3MgZm9yIHBhY2thZ2luZyBNZXRob2QgRWxlbWVudHMuICBBbGwgTWV0aG9kIEVsZW1lbnRzIHNoYWxsIGJlIGxvY2F0ZWQgaW4gZXhhY3RseSBvbmUgb2YgTWV0aG9kIFBhY2thZ2UncyBjb25jcmV0ZSBzcGVjaWFsaXphdGlvbnMgKGUuZy4gQ29udGVudCBQYWNrYWdlKS4gICBNZXRob2QgUGFja2FnZSBkZWZpbmVzIGNvbW1vbiBwcm9wZXJ0aWVzIGZvciBhbGwgb2YgaXRzIHNwZWNpYWxpemF0aW9ucy4gRWxlbWVudHMgYXJlIG9yZ2FuaXplZCBpbiBNZXRob2QgUGFja2FnZXMgdG8gc3RydWN0dXJlIGxhcmdlIHNjYWxlIG9mIG1ldGhvZCBjb250ZW50IGFuZCBwcm9jZXNzZXMgYXMgd2VsbCBhcyB0byBkZWZpbmUgYSBtZWNoYW5pc20gZm9yIHJldXNlLiAgTWV0aG9kIEVsZW1lbnRzIGZyb20gb25lIHBhY2thZ2UgY2FuIHJldXNlIGVsZW1lbnQgZnJvbSBvdGhlciBwYWNrYWdlcyBieSBkZWZpbmluZyBhIHJldXNlZFBhY2thZ2VzIGxpbmsuICBGb3IgZXhhbXBsZSwgYSB3b3JrIHByb2R1Y3QgZGVmaW5lZCBpbiBvbmUgcGFja2FnZSBjYW4gYmUgdXNlZCBhcyBhbiBpbnB1dCBmb3IgVGFza3MgZGVmaW5lZCBpbiBvdGhlciBwYWNrYWdlcy4gIEJ5IHJldXNpbmcgaXQgZnJvbSBvbmUgY29tbW9uIHBsYWNlIChpLmUuIHRoZSBwYWNrYWdlIGluIHdoaWNoIGl0IGhhcyBiZWVuIGRlZmluZWQpIGVuc3VyZXMgdGhhdCBubyByZWR1bmRhbnQgZGVmaW5pdGlvbnMgb2YgdGhlIHNhbWUgZWxlbWVudHMgYXJlIHJlcXVpcmVkLiAgQWxzbyBtYWludGVuYW5jZSBvZiBtZXRob2QgY29udGVudCBpcyBncmVhdGx5IGltcHJvdmVkIGFzIGNoYW5nZXMgY2FuIGJlIHBlcmZvcm1lZCBpbiBvbmx5IG9uZSBwbGFjZS4gIE5vdGUsIHRoYXQgb3RoZXIgcGFja2FnZXMgd2lsbCBpbnRyb2R1Y2UgbW9yZSBzcGVjaWFsaXphdGlvbnMgb2YgTWV0aG9kIFBhY2thZ2UsIGUuZy4gUHJvY2VzcyBQYWNrYWdlIGFuZCBQcm9jZXNzIENvbXBvbmVudC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOk1ldGhvZEVsZW1lbnQiPgotCQkJCTx4c2Q6Y2hvaWNlIG1heE9jY3Vycz0idW5ib3VuZGVkIiBtaW5PY2N1cnM9IjAiPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUmV1c2VkUGFja2FnZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iTWV0aG9kUGFja2FnZSIgdHlwZT0idW1hOk1ldGhvZFBhY2thZ2UiLz4KLQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0iZ2xvYmFsIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5NZXRob2QgUGFja2FnZXMgY2FuIGhhdmUgYSBnbG9iYWwgc2NvcGUuICBUaGlzIG1lYW5zIHRoYXQgZXZlcnkgZWxlbWVudCBvZiBldmVyeSBvdGhlciBNZXRob2QgUGFja2FnZSBjYW4gc2VlIHRoZSBnbG9iYWwgcGFja2FnZSdzIGNvbnRlbnRzLiAgR2xvYmFsIE1ldGhvZCBQYWNrYWdlcyBhcmUgcHJpbWFyaWx5IHVzZWQgdG8gc3RvcmUgY29tbW9ubHkgdXNlZCBjYXRlZ29yeSBkZWZpbml0aW9ucyBzdWNoIGFzIGZvciBEaXNjaXBsaW5lcyBvciBEb21haW5zLCB3aGljaCBhcmUgdXNlZCBieSBtYW55IFRhc2sgYW5kIFdvcmsgUHJvZHVjdHMgcmVzcGVjdGl2ZWx5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkNvbnRlbnRQYWNrYWdlIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lhbCBNZXRob2QgUGFja2FnZSB0aGF0IGNvbnRhaW5zIENvbnRlbnQgRWxlbWVudHMgYW5kIENvbnRlbnQgRWxlbWVudHMsIG9ubHkuICBFeGFtcGxlcyBmb3IgQ29udGVudCBFbGVtZW50IGFyZSBBcnRpZmFjdHMsIFRhc2tzLCBSb2xlcywgZXRjLiAgQSBrZXkgc2VwYXJhdGlvbiBvZiBjb25jZXJucyBpbiBVTUEgaXMgdGhlIGRpc3RpbmN0aW9uIGJldHdlZW4gTWV0aG9kIENvbnRlbnQgYW5kIFByb2Nlc3MuICBUaGlzIHNlcGFyYXRpb24gaXMgZW5mb3JjZWQgYnkgc3BlY2lhbCBwYWNrYWdlIHR5cGVzLCB3aGljaCBkbyBub3QgYWxsb3cgdGhlIG1peGluZyBvZiBtZXRob2QgY29udGVudCB3aXRoIHByb2Nlc3Nlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOk1ldGhvZFBhY2thZ2UiPgotCQkJCTx4c2Q6Y2hvaWNlIG1heE9jY3Vycz0idW5ib3VuZGVkIiBtaW5PY2N1cnM9IjAiPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQ29udGVudEVsZW1lbnQiIHR5cGU9InVtYTpDb250ZW50RWxlbWVudCIvPgotCQkJCTwveHNkOmNob2ljZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJDb250ZW50Q2F0ZWdvcnlQYWNrYWdlIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lhbCBNZXRob2QgUGFja2FnZSB0aGF0IG9ubHkgY29udGFpbnMgQ29udGVudCBDYXRlZ29yeSBFbGVtZW50cy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOk1ldGhvZFBhY2thZ2UiPgotCQkJCTx4c2Q6Y2hvaWNlIG1heE9jY3Vycz0idW5ib3VuZGVkIiBtaW5PY2N1cnM9IjAiPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQ29udGVudENhdGVnb3J5IiB0eXBlPSJ1bWE6Q29udGVudENhdGVnb3J5Ii8+Ci0JCQkJPC94c2Q6Y2hvaWNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlByb2Nlc3NFbGVtZW50Ij4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgRGVzY3JpYmFibGUgRWxlbWVudCB0aGF0IHJlcHJlc2VudHMgYW4gYWJzdHJhY3QgZ2VuZXJhbGl6YXRpb24gZm9yIGFsbCBlbGVtZW50cyBkZWZpbmVkIGluIHRoZSBQcm9jZXNzIHBhY2thZ2UuCi1Qcm9jZXNzIEVsZW1lbnRzIHJlcHJlc2VudHMgUHJvY2VzcyBzcGVjaWZpYyBlbGVtZW50cyB0aGF0IGFyZSBzdXBwb3NlZCB0byBiZSBtYW5hZ2VkIGluIFByb2Nlc3MgUGFja2FnZXMuICBUaGUgc2VwYXJhdGlvbiBvZiBQcm9jZXNzIEVsZW1lbnQgZnJvbSBDb250ZW50IEVsZW1lbnQgYWxsb3dzIHRvIGNsZWFybHkgZGlzdGluZ3Vpc2ggYmV0d2VlbiBwdXJlIG1ldGhvZCBjb250ZW50IGZyb20gY29udGVudCB0aGF0IGlzIHJlcHJlc2VudGVkIGluIHByb2Nlc3Nlcy4gPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpEZXNjcmliYWJsZUVsZW1lbnQiLz4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJQbGFubmluZ0RhdGEiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBQcm9jZXNzIEVsZW1lbnQgdGhhdCBhZGRzIHBsYW5uaW5nIGRhdGEgdG8gQnJlYWtkb3duIEVsZW1lbnRzIHdoZW4gaXQgaXMgdXNlZCBmb3IgYSBQcm9jZXNzIFBsYW5uaW5nIFRlbXBsYXRlLiAgRm9yIERlbGl2ZXJ5IFByb2Nlc3NlcyBhbmQgQ2FwYWJpbGl0eSBQYXR0ZXJucyB0aGlzIGNsYXNzIGNhbiBlaXRoZXIgbm90IGJlIGluc3RhbnRpYXRlZCBvciBwb3B1bGF0ZWQgd2l0aCBkZWZhdWx0IGRhdGEuCi1QbGFubmluZyBEYXRhIGZhY3RvcnMgb3V0IHNwZWNpZmljIG9wdGlvbmFsIGRhdGEgbmVlZGVkIGZvciByZXByZXNlbnRpbmcgcGxhbm5pbmcgdGVtcGxhdGVzLiAgVGhpcyBhc3NvY2lhdGlvbiBhbGxvd3MgdG8gYWNjZXNzIHBsYW5uaW5nIGRhdGEgaWYgaXQgaXMgc3RvcmVkIGZvciB0aGUgQnJlYWtkb3duIEVsZW1lbnQuCi0oTk9URSwgVEhFIEFUVFJJQlVURVMgRk9SIFRISVMgQ0xBU1MgQVJFIE5PVCBDT01QTEVURSwgWUVUKTwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6UHJvY2Vzc0VsZW1lbnQiPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9InN0YXJ0RGF0ZSIgdHlwZT0ieHNkOmRhdGVUaW1lIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBkZWZhdWx0IHN0YXJ0IGRhdGUgZm9yIGEgcGxhbmVkIFRhc2suPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0iZmluaXNoRGF0ZSIgdHlwZT0ieHNkOmRhdGVUaW1lIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBkZWZhdWx0IGZpbmlzaCBkYXRlIGZvciBhIHBsYW5lZCBUYXNrLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9InJhbmsiIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+VGhlIGRlZmF1bHQgcmFuayBmb3IgYSBwbGFuZWQgVGFzay48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJCcmVha2Rvd25FbGVtZW50Ij4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkFuIGFic3RyYWN0IGdlbmVyYWxpemF0aW9uIGZvciBhbnkgdHlwZSBvZiBNZXRob2QgRWxlbWVudCB0aGF0IGlzIHBhcnQgb2YgYSBicmVha2Rvd24gc3RydWN0dXJlLiAgSXQgZGVmaW5lcyBhIHNldCBvZiBwcm9wZXJ0aWVzIGF2YWlsYWJsZSB0byBhbGwgb2YgaXRzIHNwZWNpYWxpemF0aW9ucy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOlByb2Nlc3NFbGVtZW50Ij4KLQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQk8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJQcmVzZW50ZWRBZnRlciIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJQcmVzZW50ZWRCZWZvcmUiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iUGxhbm5pbmdEYXRhIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJTdXBlckFjdGl2aXR5IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0icHJlZml4IiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlByZWZpeCByZXByZXNlbnRzIGFuIGFkZGl0aW9uYWwgbGFiZWwgdGhhdCB3aWxsIGJlIHByZXNlbnRlZCBhcyBhIHByZWZpeCB0byBhbnkgQnJlYWtkb3duIEVsZW1lbnQgdG8gaW5kaWNhdGUgYSB1c2VyLWRlZmluZWQgc3ViLXR5cGUgZm9yIHRoZSBlbGVtZW50LiAgRm9yIGV4YW1wbGUsIGlmIHRoZSBwcm9jZXNzIGVuZ2luZWVyIHdvdWxkIGxpa2UgdG8gZGlzdGluZ3Vpc2ggaGlzIEFjdGl2aXRpZXMgYnkgJ01vZHVsZScgKGFzIGRvbmUgaW4gdGhlIElCTSBSYXRpb25hbCBTdW1taXQgQXNjZW5kYW50IE1ldGhvZCksIGhlIGNhbiBkZWZpbmUgYSBkaWZmZXJlbnQgcHJlZml4IGZvciBldmVyeSBtb2RlbCB0byBiZSB1c2VkIGluIGFkZGl0aW9uIHRvIG5hbWluZyBBY3Rpdml0aWVzLCBlLmcuICJTUkEuRXN0YWJsaXNoIFJlcXVpcmVtZW50cyIgd2l0aCBTUkEgaW5kaWNhdGluZyB0aGF0IHRoaXMgQWN0aXZpdHkgYmVsb25ncyB0byB0aGUgIlNvZnR3YXJlIFJlcXVpcmVtZW50cyBBbmFseXNpcyIgbW9kdWxlLiAgQW5vdGhlciBjb21tb24gYXBwbGljYXRpb24gZm9yIHByZWZpeCBpcyB0byBxdWFsaWZ5IHJvbGVzIGluIFJvbGUgRGVzY3JpcHRvcnMuICBGb3IgZXhhbXBsZSwgIkN1c3RvbWVyLkFyY2hpdGVjdCIgd291bGQgZGVmaW5lIGEgIkN1c3RvbWVyIiBwcmVmaXggZm9yIHRoZSBSb2xlIERlc2NyaXB0b3IgIkFyY2hpdGVjdCIgZXhwcmVzc2luZyB0aGF0IHRoaXMgaXMgYW4gYXJjaGl0ZWN0IG9uIHRoZSBjdXN0b21lciBzaWRlIGFuZCBub3QgdGhlIGRldmVsb3BtZW50IHRlYW0gc2lkZS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpc1BsYW5uZWQiIHR5cGU9InhzZDpib29sZWFuIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEga2V5IGFwcGxpY2F0aW9uIGZvciBEZXZlbG9wbWVudCBQcm9jZXNzZXMgZXhwcmVzc2VkIHdpdGggQnJlYWtkb3duIHN0cnVjdHVyZXMgaXMgdG8gZ2VuZXJhdGUgYSBwcm9qZWN0IHBsYW4gZnJvbSBpdC4gIEEgcHJvY2VzcyBhcyBkZWZpbmVkIGluIFVNQSAoY2YuIHdpdGggU2VjdGlvbnMgWFggYW5kIDUuMikgaXMgYSBtdWx0aS1kaW1lbnNpb25hbCBzdHJ1Y3R1cmUgZGVmaW5pbmcgd2hhdCB3b3JrIGlzIGJlaW5nIHBlcmZvcm1lZCBhdCB3aGF0IHRpbWUgYnkgd2hpY2ggcm9sZXMgdXNpbmcgd2hpY2ggaW5wdXQgYW5kIHByb2R1Y2luZyB3aGF0IG91dHB1dHMuICBBIHByb2plY3QgcGxhbiBhcyBpdCBpcyByZXByZXNlbnRlZCBpbiBwcm9qZWN0IHBsYW5uaW5nIHRvb2xzIHN1Y2ggYXMgSUJNIFJhdGlvbmFsIFBvcnRmb2xpbyBNYW5hZ2VyIG9yIE1pY3Jvc29mdCBQcm9qZWN0IG5vcm1hbGx5IGRvZXMgbm90IG5lZWQgYWxsIHRoaXMgaW5mb3JtYXRpb24gYW5kIGlzIG5vcm1hbGx5IGxpbWl0ZWQgdG8ganVzdCByZXByZXNlbnRpbmcgYSBzdWJzZXQuICBGb3IgZXhhbXBsZSwgYSB0eXBpY2FsIE1TIFByb2plY3QgcGxhbiBvbmx5IHJlcHJlc2VudHMgdGhlIHdvcmsgYnJlYWtkb3duIGNvbnNpc3Rpbmcgb2YgVGFza3MgYW5kIEFjdGl2aXRpZXMgKHNvbWV0aW1lcyByZWZlcnJlZCB0byBhcyBzdW1tYXJ5IHRhc2tzKS4gIEl0IGRvZXMgbm90IHNob3cgdGhlIGlucHV0IGFuZCBvdXRwdXQgV29yayBQcm9kdWN0cyBmb3IgYSBUYXNrLCBidXQgaXQgY2FuIHNob3cgd2hpY2ggcm9sZXMgc2hhbGwgYmUgc3RhZmZlZCBmb3IgcGVyZm9ybWluZyB0aGUgVGFzay4gIEhvd2V2ZXIsIHN1Y2ggcm9sZSBhbGxvY2F0aW9uIG5lZWQgdG8gYmUgcmVwbGFjZWQgd2l0aCBjb25jcmV0ZSByZXNvdXJjZXMgd2hlbiBpbnN0YW50aWF0aW5nIHRoZSBwbGFuIGZvciBhIGNvbmNyZXRlIHByb2plY3QuICBTb21ldGltZXMgcHJvamVjdCBwbGFucyBjYW4gdGhlbiBhZ2FpbiBiZSBvcmdhbml6ZWQgZGlmZmVyZW50bHkgYnkgb3JnYW5pemluZyB3b3JrIGJ5IGRlbGl2ZXJhYmxlcyBpbiB3aGljaCBXb3JrIFByb2R1Y3RzIGFyZSBtYXBwZWQgdG8gdGhlIHBsYW4ncyBzdW1tYXJ5IHRhc2tzIGFuZCBUYXNrIHRoYXQgaGF2ZSB0aGVzZSB3b3JrIHByb2R1Y3RzIGFzIG91dHB1dCBtYXBwZWQgYmVsb3cgc3VjaCBhcyBzdW1tYXJ5IHRhc2suICBUaGVyZWZvcmUsIGEgcHJvY2VzcyBjYW4gbWFrZSByZWNvbW1lbmRhdGlvbnMgYWJvdXQgd2hpY2ggZWxlbWVudHMgdG8gaW5jbHVkZSBhbmQgd2hpY2ggdG8gZXhjbHVkZSB3aGVuIGdlbmVyYXRpbmcgYSBwbGFuLiAgV2hlbiB0aGUgaXNQbGFubmVkIGF0dHJpYnV0ZSBpcyBzZXQgdG8gRmFsc2UgZm9yIGFuIGluc3RhbmNlIG9mIGEgQnJlYWtkb3duIEVsZW1lbnQsIHRoZW4gdGhpcyBlbGVtZW50IHNoYWxsIG5vdCBiZSBub3QgaW5jbHVkZWQgd2hlbiBhIGNvbmNyZXRlIHByb2plY3QgcGxhbiBpcyBiZWluZyBnZW5lcmF0ZWQgZnJvbSB0aGUgYnJlYWtkb3duIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zIHRoaXMgZWxlbWVudC4KLTwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9Imhhc011bHRpcGxlT2NjdXJyZW5jZXMiIHR5cGU9InhzZDpib29sZWFuIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkp1c3QgYXMgdGhlIGlzUGxhbm5lZCBhdHRyaWJ1dGUgdGhlIGhhc011bHRpcGxlT2NjdXJyZW5jZXMgYXR0cmlidXRlIGhhcyBhbiBpbXBhY3Qgb24gZ2VuZXJhdGluZyBwbGFucyBmcm9tIGEgUHJvY2Vzcy4gIFdoZW4gdGhpcyBhdHRyaWJ1dGUgaXMgc2V0IHRvIFRydWUgZm9yIGEgQnJlYWtkb3duIEVsZW1lbnQgdGhlbiBpdCB3aWxsIHR5cGljYWxseSBvY2N1ciBtdWx0aXBsZSB0aW1lcyB3aXRoaW4gdGhlIHNhbWUgQWN0aXZpdHkuICBGb3IgZXhhbXBsZSwgYSBUYXNrIHN1Y2ggYXMgIkRldGFpbCBVc2UgQ2FzZSIgd291bGQgYmUgcGVyZm9ybWVkIGZvciBldmVyeSB1c2UgY2FzZSBpZGVudGlmaWVkIGZvciBhIHBhcnRpY3VsYXIgSXRlcmF0aW9uIG9yIEFjdGl2aXR5LiAgR2VuZXJhdGluZyBhIHBsYW4gd291bGQgbGlzdCBvbmUgVGFzayBpbnN0YW5jZSBwZXIgdXNlIGNhc2UuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0iaXNPcHRpb25hbCIgdHlwZT0ieHNkOmJvb2xlYW4iPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+SW5kaWNhdGVzIHRoYXQgdGhlIEJyZWFrZG93biBFbGVtZW50IGRlc2NyaWJlcyB3b3JrLCBhIHdvcmsgcmVzdWx0LCBvciBldmVuIHdvcmsgcmVzb3VyY2VzLCB3aGljaCBpbmNsdXNpb24gaXMgbm90IG1hbmRhdG9yeSB3aGVuIHBlcmZvcm1pbmcgYSBwcm9qZWN0IHRoYXQgaXMgcGxhbm5lZCBiYXNlZCBvbiBhIHByb2Nlc3MgY29udGFpbmluZyB0aGlzIGVsZW1lbnQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iV29ya09yZGVyIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPlJlcHJlc2VudHMgYSByZWxhdGlvbnNoaXAgYmV0d2VlbiB0d28gQnJlYWtkb3duIEVsZW1lbnRzIGluIHdoaWNoIG9uZSBCcmVha2Rvd24gRWxlbWVudHMgZGVwZW5kcyBvbiB0aGUgc3RhcnQgb3IgZmluaXNoIG9mIGFub3RoZXIgQnJlYWtkb3duIEVsZW1lbnRzIGluIG9yZGVyIHRvIGJlZ2luIG9yIGVuZC4gIAotVGhlIFdvcmsgT3JkZXIgY2xhc3MgZGVmaW5lcyBwcmVkZWNlc3NvciBhbmQgc3VjY2Vzc29yIHJlbGF0aW9ucyBhbW9uZ3N0IEJyZWFrZG93biBFbGVtZW50cy4gIFRoaXMgaW5mb3JtYXRpb24gaXMgaW4gcGFydGljdWxhciBjcml0aWNhbCBmb3IgcGxhbm5pbmcgYXBwbGljYXRpb25zLiAgU2VlIG1vcmUgZGV0YWlscyBvbiBkaWZmZXJlbnQgdHlwZXMgb2YgV29yayBPcmRlciByZWxhdGlvbnNoaXBzIGF0IFdvcmsgT3JkZXIgVHlwZS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJsaW5rVHlwZSIgdHlwZT0idW1hOldvcmtPcmRlclR5cGUiPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+VGhpcyBhdHRyaWJ1dGUgZXhwcmVzc2VzIHRoZSB0eXBlIG9mIHRoZSBXb3JrIE9yZGVyIHJlbGF0aW9uc2hpcCBieSBhc3NpZ25pbmcgYSB2YWx1ZSBmcm9tIHRoZSBXb3JrIE9yZGVyIFR5cGUgZW51bWVyYXRpb24uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJXb3JrQnJlYWtkb3duRWxlbWVudCI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpYWwgQnJlYWtkb3duIEVsZW1lbnQgdGhhdCBwcm92aWRlcyBzcGVjaWZpYyBwcm9wZXJ0aWVzIGZvciBCcmVha2Rvd24gRWxlbWVudHMgdGhhdCByZXByZXNlbnQgb3IgcmVmZXIgdG8gV29yayBEZWZpbml0aW9ucy4gIEZvciBleGFtcGxlIGl0cyBzdWJjbGFzcyBBY3Rpdml0eSBkZWZpbmVzIHdvcmsgYXMgaXQgaXMgYWxzbyBhIHN1YmNsYXNzIG9mIFdvcmsgRGVmaW5pdGlvbi4gIEl0cyBzdWJjbGFzcyBUYXNrIERlc2NyaXB0b3IgZG9lcyBub3QgZGVmaW5lIHdvcmsgYnkgaXRzZWxmLCBidXQgcmVmZXJzIHRvIGEgV29yayBEZWZpbml0aW9uIGFuZCB0aGVyZWZvcmUgY2FuIGhhdmUgdGhlIHNhbWUgY29tbW9uIHByb3BlcnRpZXMgYW5kIFdvcmsgQnJlYWtkb3duIEVsZW1lbnQgaGFzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6QnJlYWtkb3duRWxlbWVudCI+Ci0JCQkJPHhzZDpjaG9pY2UgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJQcmVkZWNlc3NvciIgdHlwZT0idW1hOldvcmtPcmRlciIvPgotCQkJCTwveHNkOmNob2ljZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpc1JlcGVhdGFibGUiIHR5cGU9InhzZDpib29sZWFuIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlRoaXMgYXR0cmlidXRlIGlzIHVzZWQgdG8gZGVmaW5lIHJlcGV0aXRpb24gb2Ygd29yaywgZS5nLiBpdGVyYXRpb25zLiAgQSBQcm9jZXNzIFdvcmsgRGVmaW5pdGlvbiB3aXRoIHRoaXMgYXR0cmlidXRlIHNldCB0byBUcnVlIHNoYWxsIGJlIHJlcGVhdGVkIG1vcmUgdGhhbiBvbmNlIG9uIHRoZSBzYW1lIHNldCBvZiBhcnRpZmFjdHMuICBGb3IgZXhhbXBsZSwgZm9yIGFuIGluc3RhbmNlIG9mIEl0ZXJhdGlvbiAoZGVmaW5lZCBhcyBhIHNwZWNpYWwgUHJvY2VzcyBXb3JrIERlZmluaXRpb24gYmVsb3cpIHRoaXMgYXR0cmlidXRlIGlzIHNldCB0byBUcnVlIGJ5IGRlZmF1bHQgaW5kaWNhdGluZyB0aGF0IGV2ZXJ5IHN1Yi1BY3Rpdml0eSB3aWxsIGJlIHJlcGVhdGVkIG1vcmUgdGhhbiBvbmNlLiAgSG93ZXZlciwgYW55IFByb2Nlc3MgV29yayBEZWZpbml0aW9uIGNhbiBzZXQgdGhpcyBhdHRyaWJ1dGUgdG8gVHJ1ZSB0byBkZWZpbmUgaXRlcmF0aW9ucyAoZS5nLiB0byBpdGVyYXRlIG9uZSBBY3Rpdml0eSBjb25zaXN0aW5nIG9mIG1hbnkgc3ViLWFjdGl2aXRpZXMgb3IgZXZlbiBQaGFzZXMsIGJ1dCB0byBpdGVyYXRlIGp1c3Qgb25lIFRhc2spLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImlzT25nb2luZyIgdHlwZT0ieHNkOmJvb2xlYW4iPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+SWYgdGhlIGlzT25nb2luZyBhdHRyaWJ1dGUgaXMgc2V0IHRvIFRydWUgZm9yIGEgUHJvY2VzcyBXb3JrIERlZmluaXRpb24gaW5zdGFuY2UsIHRoZW4gdGhlIGVsZW1lbnQgZGVzY3JpYmVzIGFuIG9uZ29pbmcgcGllY2Ugb2Ygd29yayB3aXRob3V0IGEgZml4ZWQgZHVyYXRpb24gb3IgZW5kIHN0YXRlLiAgRm9yIGV4YW1wbGUsIHRoZSBQcm9jZXNzIFdvcmsgRGVmaW5pdGlvbiBjb3VsZCByZXByZXNlbnQgd29yayBvZiBhbiBhZG1pbmlzdHJhdG9yIGNvbnRpbnVvdXNseSAoZS5nLiAzaCBhIGRheSkgd29ya2luZyB0byBlbnN1cmUgdGhhdCBzeXN0ZW1zIGFyZSBrZXB0IGluIGEgY2VydGFpbiBzdGF0ZS4gIEFub3RoZXIgZXhhbXBsZSB3b3VsZCBiZSBwcm9ncmFtIG1hbmFnZW1lbnQgd29yayBvdmVyc2VlaW5nIG1hbnkgZGlmZmVyZW50IHByb2plY3RzIGJlaW5nIHNjaGVkdWxlZCBmb3Igb25lIHBhcnRpY3VsYXIgcHJvamVjdCBhdCBzcGVjaWZpYyByZW9jY3VycmluZyBpbnRlcnZhbHMgZHVyaW5nIHRoZSB3aG9sZSBsaWZlY3ljbGUgb2YgdGhlIHByb2plY3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0iaXNFdmVudERyaXZlbiIgdHlwZT0ieHNkOmJvb2xlYW4iPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+VGhlIGlzRXZlbnREcml2ZW4gYXR0cmlidXRlIGluZGljYXRlcyB0aGF0IHRoZSBQcm9jZXNzIFdvcmsgRGVmaW5pdGlvbiBkZXNjcmliZXMgYW4gaW5zdGFuY2Ugb2Ygd29yayB3aGljaCBpcyBub3Qgc3RhcnRlZCBiZWNhdXNlIGl0IGhhcyBiZWVuIHNjaGVkdWxlZCB0byBzdGFydCBhdCBhIGNlcnRhaW4gcG9pbnQgb2YgdGltZSwgYmVjYXVzZSBwcmVjZWRpbmcgd29yayBpcyBiZWluZyBjb21wbGV0ZWQsIG9yIGlucHV0IHdvcmsgcHJvZHVjdHMgYXJlIGF2YWlsYWJsZSwgYnV0IGJlY2F1c2UgYW5vdGhlciBzcGVjaWZpYyBldmVudCBoYXMgb2NjdXJyZWQuICBFeGFtcGxlcyBmb3Igc3VjaCBldmVudHMgYXJlIGV4Y2VwdGlvbnMgb3IgcHJvYmxlbSBzaXR1YXRpb25zIHdoaWNoIHJlcXVpcmUgc3BlY2lmaWMgd29yayB0byBiZSBwZXJmb3JtZWQgYXMgYSByZXN1bHQuICBBbHNvIGNoYW5nZSBtYW5hZ2VtZW50IHdvcmsgY2FuIGJlIG1vZGVsZWQgYXMgZXZlbnQgZHJpdmVuIHdvcmsgYW5hbHl6aW5nIGEgY2hhbmdlIHJlcXVlc3Qgb3IgZGVmZWN0IGFuZCBhbGxvY2F0aW5nIHdvcmsgZHluYW1pY2FsbHkgdG8gcmVzb3VyY2VzIHRvIGRlYWwgd2l0aCBpdCBmb2xsb3dpbmcgdGhlIHdvcmsgZGVzY3JpYmVkIHdpdGggc3VjaCBQcm9jZXNzIFdvcmsgRGVmaW5pdGlvbi4gIFRoZSBldmVudHMgdGhlbXNlbHZlcyBhcmUgbm90IG1vZGVsZWQgaW4gdGhpcyB2ZXJzaW9uIG9mIHRoZSBzcGVjaWZpY2F0aW9uLiAgVGhleSBzaGFsbCBiZSBkZXNjcmliZWQgYXMgcGFydCBvZiB0aGUgbm9ybWFsIGRlc2NyaXB0aW9ucyBmaWVsZHMgYXZhaWxhYmxlLgotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iTWlsZXN0b25lIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lhbCBCcmVha2Rvd24gRWxlbWVudCB0aGF0IGRlc2NyaWJlcyBhIHNpZ25pZmljYW50IGV2ZW50IGluIGEgZGV2ZWxvcG1lbnQgcHJvamVjdCwgc3VjaCBhcyBhIG1ham9yIGRlY2lzaW9uLCBjb21wbGV0aW9uIG9mIGEgZGVsaXZlcmFibGUsIG9yIG1lZXRpbmcgb2YgYSBtYWpvciBkZXBlbmRlbmN5IChsaWtlIGNvbXBsZXRpb24gb2YgYSBwcm9qZWN0IHBoYXNlKS4gIEJlY2F1c2UsIE1pbGVzdG9uZSBpcyBjb21tb25seSB1c2VkIHRvIHJlZmVyIHRvIGJvdGggdGhlIGV2ZW50IGl0c2VsZiBhbmQgdGhlIHBvaW50IGluIHRpbWUgYXQgd2hpY2ggdGhlIGV2ZW50IGlzIHNjaGVkdWxlZCB0byBoYXBwZW4sIGl0IGlzIG1vZGVsZWQgYXMgYSBCcmVha2Rvd24gRWxlbWVudCAoaS5lLiBpdCBhcHBlYXJzIGFzIHBhcnQgb2YgYSBicmVha2Rvd24gc3RydWN0dXJlKS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOldvcmtCcmVha2Rvd25FbGVtZW50Ii8+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iQWN0aXZpdHkiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBXb3JrIEJyZWFrZG93biBFbGVtZW50IGFuZCBXb3JrIERlZmluaXRpb24gd2hpY2ggc3VwcG9ydHMgdGhlIG5lc3RpbmcgYW5kIGxvZ2ljYWwgZ3JvdXBpbmcgb2YgcmVsYXRlZCBCcmVha2Rvd24gRWxlbWVudHMgZm9ybWluZyBicmVha2Rvd24gc3RydWN0dXJlcy4gIEFsdGhvdWdoIEFjdGl2aXR5IGlzIGEgY29uY3JldGUgbWV0YS1jbGFzcywgb3RoZXIgY2xhc3NlcyB3aGljaCByZXByZXNlbnQgYnJlYWtkb3duIHN0cnVjdHVyZXMgZGVyaXZlIGZyb20gaXQ7IHN1Y2ggYXMgUGhhc2UsIEl0ZXJhdGlvbiwgRGVsaXZlcnkgUHJvY2Vzcywgb3IgQ2FwYWJpbGl0eSBQYXR0ZXJuLgotQWN0aXZpdHkgcmVwcmVzZW50cyBhIGdyb3VwaW5nIGVsZW1lbnQgZm9yIG90aGVyIEJyZWFrZG93biBFbGVtZW50cyBzdWNoIGFzIEFjdGl2aXRpZXMsIERlc2NyaXB0b3JzLCBNaWxlc3RvbmVzLCBldGMuICBJdCBpcyBub3QgcGVyLXNlIGEgJ2hpZ2gtbGV2ZWwnIGdyb3VwaW5nIG9mIG9ubHkgd29yayBhcyBpbiBvdGhlciBtZXRhLW1vZGVscywgYnV0IGdyb3VwcyBhbnkga2luZCBvZiBCcmVha2Rvd24gRWxlbWVudHMuICBGb3IgZXhhbXBsZSwgb25lIGNhbiBkZWZpbmUgdmFsaWQgQWN0aXZpdGllcyB0aGF0IGdyb3VwIG9ubHkgV29yayBQcm9kdWN0cyBEZXNjcmlwdG9ycyB3aXRob3V0IGFueSBtYXRjaGluZyBUYXNrIERlc2NyaXB0b3JzLiAgQWN0aXZpdGllcyBhbHNvIGluaGVyaXQgYWxsIHByb3BlcnRpZXMgZnJvbSBXb3JrIEJyZWFrZG93biBFbGVtZW50IGFuZCBpbmRpcmVjdGx5IGZyb20gUHJvY2VzcyBFbGVtZW50OyBpLmUuIEFjdGl2aXR5IGlzIHJlYWR5IHRvIGhhdmUgYSBmdWxsIGNvbnRlbnQgZGVzY3JpcHRpb24gYXR0YWNoZWQgdG8gaXQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpXb3JrQnJlYWtkb3duRWxlbWVudCI+Ci0JCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iUHJlY29uZGl0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlBvc3Rjb25kaXRpb24iIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJPHhzZDpjaG9pY2UgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQnJlYWtkb3duRWxlbWVudCIgdHlwZT0idW1hOkJyZWFrZG93bkVsZW1lbnQiLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJDaGVja2xpc3QiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJDb25jZXB0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iRXhhbXBsZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Ikd1aWRlbGluZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlJvYWRtYXAiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJSZXVzYWJsZUFzc2V0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iU3VwcG9ydGluZ01hdGVyaWFsIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iV2hpdGVwYXBlciIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0idmFyaWFiaWxpdHlUeXBlIiB0eXBlPSJ1bWE6VmFyaWFiaWxpdHlUeXBlIi8+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0idmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9IklzRW5hY3RhYmxlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlBoYXNlIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lhbCBBY3Rpdml0eSB3aGljaCBwcmVzY3JpYmVzIHByZS1kZWZpbmVkIHZhbHVlcyBmb3IgaXRzIGluc3RhbmNlcyBmb3IgdGhlIGF0dHJpYnV0ZXMgcHJlZml4ICgnUGhhc2UnKSBhbmQgaXNSZXBlYXRhYmxlICgnRmFsc2UnKS4gIEl0IGhhcyBiZWVuIGluY2x1ZGVkIGludG8gdGhlIG1ldGEtbW9kZWwgZm9yIGNvbnZlbmllbmNlIGFuZCB0byBwcm92aWRlIGEgc3BlY2lhbCBzdGVyZW90eXBlLCBiZWNhdXNlIGl0IHJlcHJlc2VudHMgYSB2ZXJ5IGNvbW1vbmx5IHVzZWQgQWN0aXZpdHkgdHlwZS4KLVBoYXNlIHJlcHJlc2VudCBhIHNpZ25pZmljYW50IHBlcmlvZCBpbiBhIHByb2plY3QsIGVuZGluZyB3aXRoIG1ham9yIG1hbmFnZW1lbnQgY2hlY2twb2ludCwgbWlsZXN0b25lIG9yIHNldCBvZiBEZWxpdmVyYWJsZXMuICBJdCBpcyBpbmNsdWRlZCBpbiB0aGUgbW9kZWwgYXMgYSBwcmVkZWZpbmVkIHNwZWNpYWwgQWN0aXZpdHksIGJlY2F1c2Ugb2YgaXRzIHNpZ25pZmljYW5jZSBpbiBkZWZpbmluZyBicmVha2Rvd25zLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6QWN0aXZpdHkiLz4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJJdGVyYXRpb24iPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWFsIEFjdGl2aXR5IHdoaWNoIHByZXNjcmliZXMgcHJlLWRlZmluZWQgdmFsdWVzIGZvciBpdHMgaW5zdGFuY2VzIGZvciB0aGUgYXR0cmlidXRlcyBwcmVmaXggKCdJdGVyYXRpb24nKSBhbmQgaXNSZXBlYXRhYmxlICgnVHJ1ZScpLiAgSXQgaGFzIGJlZW4gaW5jbHVkZWQgaW50byB0aGUgbWV0YS1tb2RlbCBmb3IgY29udmVuaWVuY2UgYW5kIHRvIHByb3ZpZGUgYSBzcGVjaWFsIHN0ZXJlb3R5cGUsIGJlY2F1c2UgaXQgcmVwcmVzZW50cyBhIHZlcnkgY29tbW9ubHkgdXNlZCBBY3Rpdml0eSB0eXBlLgotSXRlcmF0aW9uIGdyb3VwcyBhIHNldCBvZiBuZXN0ZWQgQWN0aXZpdGllcyB0aGF0IGFyZSByZXBlYXRlZCBtb3JlIHRoYW4gb25jZS4gIEl0IHJlcHJlc2VudHMgYW4gaW1wb3J0YW50IHN0cnVjdHVyaW5nIGVsZW1lbnQgdG8gb3JnYW5pemUgd29yayBpbiByZXBldGl0aXZlIGN5Y2xlcy4gIFRoZSBjb25jZXB0IG9mIEl0ZXJhdGlvbiBjYW4gYmUgYXNzb2NpYXRlZCB3aXRoIGRpZmZlcmVudCBydWxlcyBpbiBkaWZmZXJlbnQgbWV0aG9kcy4gIEZvciBleGFtcGxlLCB0aGUgSUJNIFJhdGlvbmFsIFVuaWZpZWQgUHJvY2VzcyBtZXRob2QgZnJhbWV3b3JrIChSVVApIGRlZmluZXMgYSBydWxlIHRoYXQgSXRlcmF0aW9ucyBhcmUgbm90IGFsbG93ZWQgdG8gc3BhbiBhY3Jvc3MgUGhhc2VzLiAgSW4gY29udHJhc3QgSUJNIEdsb2JhbCBTZXJ2aWNlcyBNZXRob2QgKEdTTWV0aG9kKSBiYXNlZCBtZXRob2QgZnJhbWV3b3JrcyB0aGlzIHJ1bGUgZG9lcyBub3QgYXBwbHkgYW5kIEl0ZXJhdGlvbiBjYW4gYmUgZGVmaW5lZCB3aGljaCBuZXN0IFBoYXNlcy4gIFJ1bGVzIGxpa2UgdGhlc2UsIHdoaWNoIHBsYXkgYW4gaW1wb3J0YW50IHJvbGUgZm9yIGVhY2ggaW5kaXZpZHVhbCBtZXRob2QgYW5kIGFyZSB0aGVyZWZvcmUgbm90IGVuZm9yY2VkIGJ5IHRoaXMgbWV0YS1tb2RlbC4gIEluc3RlYWQsIHByb2Nlc3MgYXV0aG9ycyBhcmUgZXhwZWN0ZWQgdG8gZm9sbG93IGFuZCBjaGVjayB0aGVzZSBydWxlcyBtYW51YWxseS4gIChOb3RlOiBBbnkgQnJlYWtkb3duIEVsZW1lbnQgY2FuIGJlIHJlcGVhdGVkOyBob3dldmVyLCBJdGVyYXRpb25zIGhhcyBiZWVuIGludHJvZHVjZWQgYXMgYSBzcGVjaWFsIG1ldGEtbW9kZWwgY29uY2VwdCwgYmVjYXVzZSBvZiBpdHMgaW1wb3J0YW50IHJvbGUgZm9yIG1hbnkgbWV0aG9kcy4pPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpBY3Rpdml0eSIvPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbiI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIGdlbmVyYWxpemVkIENvbnRlbnQgRGVzY3JpcHRpb24gdGhhdCBpcyB1c2VkIHRvIHN0b3JlIHRoZSB0ZXh0dWFsIGRlc2NyaXB0aW9uIGZvciBhIEJyZWFrZG93biBFbGVtZW50LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6Q29udGVudERlc2NyaXB0aW9uIj4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ1c2FnZUd1aWRhbmNlIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlByb3ZpZGVzIGluZm9ybWF0aW9uIGFuZCBndWlkYW5jZSBvbiB0aGUgbWVhbmluZyBvZiB0aGUgQm9vbGVhbiBmbGFnIHZhbHVlcyBhbmQgdW5kZXIgd2hhdCBjaXJjdW1zdGFuY2VzIHRoZXkgc2hvdWxkIGJlIG92ZXJyaWRkZW4uIEZvciBleGFtcGxlLCBpdCBkZXNjcmliZXMgd2h5IHRoZSBicmVha2Rvd24gZWxlbWVudCBpcyBvcHRpb25hbCBvciBjb25zaWRlcmF0aW9ucyBmb3IgcmVwZWF0aW5nIGl0IGFuZCBkaWZmZXJlbmNlcyBpbiB0aGUgaW5kaXZpZHVhbCBvY2N1cnJlbmNlcyBvZiB0aGlzIEJyZWFrZG93biBFbGVtZW50IGFjcm9zcyB0aGUgbGlmZWN5Y2xlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkFjdGl2aXR5RGVzY3JpcHRpb24iPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBnZW5lcmFsaXplZCBCcmVha2Rvd24gRWxlbWVudCBEZXNjcmlwdGlvbiB0aGF0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIHRleHR1YWwgZGVzY3JpcHRpb24gZm9yIGFuIEFjdGl2aXR5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6QnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uIj4KLQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQk8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJBbHRlcm5hdGl2ZXMiIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5Db21wcmlzZXMgb2Ygc3VtbWFyaWVzIGRlc2NyaWJpbmcgaW1wb3J0YW50IGV4Y2VwdGlvbmFsIGFuZCBub24tc3RhbmRhcmQgd2F5cyBvZiBkb2luZyB0aGUgd29yayBvZiB0aGlzIEFjdGl2aXR5IG5vdCBjb3ZlcmVkIGJ5IHRoZSBBY3Rpdml0eSdzIFRhc2tzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQk8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJIb3dUb1N0YWZmIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+UHJvdmlkZXMgYmFja2dyb3VuZCBvbiB3aG8gc2hvdWxkIGJlIGludm9sdmVkIGluIHRoaXMgYWN0aXZpdHkgd2hhdCBhcmUgdGhlIHJlcXVpcmVkIHNraWxscywgZXhwZXJpZW5jZSwgIGFuZCBwZXJoYXBzIGF0dGl0dWRlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iUHVycG9zZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlN1bW1hcml6ZXMgdGhlIG1haW4gcmVhc29uIGZvciBwZXJmb3JtaW5nIHRoaXMgQWN0aXZpdHksIGRlc2NyaWJlcyB3aGF0IHRoZSBhY3Rpdml0eSBhcyBhIHdob2xlIGlzIGludGVuZGVkIHRvIGFjaGlldmUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iRGVzY3JpcHRvckRlc2NyaXB0aW9uIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgZ2VuZXJhbGl6ZWQgQnJlYWtkb3duIEVsZW1lbnQgRGVzY3JpcHRpb24gdGhhdCBpcyB1c2VkIHRvIHN0b3JlIHRoZSB0ZXh0dWFsIGRlc2NyaXB0aW9uIGZvciBhIERlc2NyaXB0b3IuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24iPgotCQkJCTx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJSZWZpbmVkRGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIERlc2NyaXB0b3IgbWlnaHQgYWRkIHJlZmluZW1lbnRzIHRvIHRoZSBtYWluIGRlc2NyaXB0aW9uIG9mIHRoZSBDb250ZW50IEVsZW1lbnQgaXQgcmVmZXJzIHRvLiAgRm9yIGV4YW1wbGUsIGl0IGNvdWxkIHByb3ZpZGUgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCBhIFdvcmsgUHJvZHVjdCByZWxldmFudCBmb3IgdGhlIHNwZWNpZmljIHBvaW50IGluIHRpbWUgaW4gdGhlIHByb2Nlc3MgdGhpcyBXb3JrIFByb2R1Y3QgdHlwZSBpcyBiZWluZyB1c2VkLiAgSXQgY291bGQgZGVzY3JpYmUgYWRkaXRpb25hbCBza2lsbHMgbmVlZGVkIGZvciBhIFJvbGUgYXQgdGhhdCBwYXJ0aWN1bGFyIHBvaW50IGluIHRpbWUgaW4gYSBwcm9jZXNzLCBldGMuIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCTwveHNkOmNob2ljZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJQcm9jZXNzRGVzY3JpcHRpb24iPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBnZW5lcmFsaXplZCBBY3Rpdml0eSBEZXNjcmlwdGlvbiB0aGF0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIHRleHR1YWwgZGVzY3JpcHRpb24gZm9yIGEgUHJvY2Vzcy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkFjdGl2aXR5RGVzY3JpcHRpb24iPgotCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlNjb3BlIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyB0aGUgc2NvcGUgb2YgdGhlIFByb2Nlc3MsIGkuZS4gd2hpY2ggdHlwZXMgb2YgcHJvamVjdHMgZG9lcyBpdCBhZGRyZXNzIGFuZCB3aGljaCBub3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlVzYWdlTm90ZXMiIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BbnkgYWRkaXRpb25hbCBub3RlcyBvbiBob3cgdG8gYXBwbHkgYW5kIGluc3RhbnRpYXRlIHRoaXMgcHJvY2VzcyBmb3IgYSBwcm9qZWN0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImV4dGVybmFsSWQiIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+QW4gZXh0ZXJuYWwgdmlzaWJsZSBudW1iZXIgdGhhdCBpcyB1c2VkIHRvIHJlZmVyZW5jZSB0aGlzIGRlbGl2ZXJ5IHBhdHRlcm5zIGFuZCBtb2RlbHMuIEl0IGlzIHVzZWQgbGlrZSBhIHN5bm9ueW0uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24iPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBnZW5lcmFsaXplZCBQcm9jZXNzIERlc2NyaXB0aW9uIHRoYXQgaXMgdXNlZCB0byBzdG9yZSB0aGUgdGV4dHVhbCBkZXNjcmlwdGlvbiBmb3IgYSBEZWxpdmVyeSBQcm9jZXNzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6UHJvY2Vzc0Rlc2NyaXB0aW9uIj4KLQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQk8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJTY2FsZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPk91dGxpbmVzIGNoYXJhY3RlcmlzdGljcyBhYm91dCB0aGUgc2l6ZSBvZiBhIHR5cGljYWwgcHJvamVjdCB0aGF0IHBlcmZvcm1zIHRoaXMgcHJvamVjdCBleHByZXNzZWQgaW4gdGVhbSBzaXplLCBtYW4geWVhcnMsIGV0Yy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iUHJvamVjdENoYXJhY3RlcmlzdGljcyIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkNoYXJhY3Rlcml6ZXMgdGhlIHByb2plY3QgdGhhdCB3b3VsZCB0eXBpY2FsbHkgcGVyZm9ybSB0aGlzIFByb2Nlc3M8L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iUmlza0xldmVsIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+T3V0bGluZXMgdHlwaWNhbCBwcm9qZWN0IHJpc2tzIHRoYXQgYXJlIGFkZHJlc3NlZCB3aXRoIHRoaXMgcHJvY2Vzcy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iRXN0aW1hdGluZ1RlY2huaXF1ZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkRlc2NyaWJlcyB0aGUgRXN0aW1hdGlvbiBUZWNobmlxdWVzIHByb3ZpZGVkIGZvciB0aGlzIFByb2Nlc3MuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlByb2plY3RNZW1iZXJFeHBlcnRpc2UiIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5Qcm92aWRlcyBhIHByb2ZpbGUgb2YgYSB0eXBpY2FsIHByb2plY3QgdGVhbSwgdGhlIGRpc3RyaWJ1dGlvbiBvZiByb2xlcywgc2tpbGxzIHJlcXVpcmVkIGZvciBhIHRlYW0gcGVyZm9ybXMgYSBwcm9qZWN0IGJhc2VkIG9uIHRoaXMgcHJvY2Vzcy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iVHlwZU9mQ29udHJhY3QiIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5Qcm92aWRlcyBiYWNrZ3JvdW5kIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjb0knbSBjaGFJJ20gbnRyYWN0cyB0aGF0IG5lZWQgdG8gYmUgZXN0YWJsaXNoZWQgYmV0d2VlbiBhIHByb2plY3QgdGVhbSB0aGF0IHBlcmZvcm1zIHRoaXMgcHJvY2VzcyBhbmQgYSBjbGllbnQgKGUuZy4gZm9yIGFuIElHUyBlbmdhZ2VtZW50KS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJEZXNjcmlwdG9yIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkFuIGFic3RyYWN0IGdlbmVyYWxpemF0aW9uIGZvciBzcGVjaWFsIEJyZWFrZG93biBFbGVtZW50cyB0aGF0IHJlZmVyZW5jZXMgb25lIGNvbmNyZXRlIENvbnRlbnQgRWxlbWVudC4gIEEgZGVzY3JpcHRvciBwcm92aWRlcyBhIHJlcHJlc2VudGF0aW9uIG9mIGEgQ29udGVudCBFbGVtZW50IHdpdGhpbiBicmVha2Rvd24gc3RydWN0dXJlcy4gIEluIGFkZGl0aW9uIHRvIGp1c3QgcmVmZXJlbmNpbmcgQ29udGVudCBFbGVtZW50cyBpdCBhbGxvd3Mgb3ZlcnJpZGluZyB0aGUgQ29udGVudCBFbGVtZW50cyBzdHJ1Y3R1cmFsIHJlbGF0aW9uc2hpcHMgYnkgZGVmaW5pbmcgaXRzIG93biBzZXRzIG9mIGFzc29jaWF0aW9ucy4KLURlc2NyaXB0b3JzIGFyZSB0aGUga2V5IGNvbmNlcHQgZm9yIHJlYWxpemluZyB0aGUgc2VwYXJhdGlvbiBvZiBwcm9jZXNzZXMgZnJvbSBtZXRob2QgY29udGVudC4gIEEgRGVzY3JpcHRvciBjYW4gYmUgY2hhcmFjdGVyaXplZCBhcyBhIHJlZmVyZW5jZSBvYmplY3QgZm9yIG9uZSBwYXJ0aWN1bGFyIENvbnRlbnQgRWxlbWVudCwgd2hpY2ggaGFzIGl0cyBvd24gcmVsYXRpb25zaGlwcyBhbmQgcHJvcGVydGllcy4gIFdoZW4gYSBEZXNjcmlwdG9yIGlzIGNyZWF0ZWQgaXQgc2hhbGwgYmUgcHJvdmlkZWQgd2l0aCBjb25ncnVlbnQgY29waWVzIG9mIHRoZSByZWxhdGlvbnNoaXBzIGRlZmluZWQgZm9yIHRoZSByZWZlcmVuY2VkIGNvbnRlbnQgZWxlbWVudC4gIEhvd2V2ZXIsIGEgdXNlciBjYW4gbW9kaWZ5IHRoZXNlIHJlbGF0aW9uc2hpcHMgZm9yIHRoZSBwYXJ0aWN1bGFyIHByb2Nlc3Mgc2l0dWF0aW9uIGZvciB3aGljaCB0aGUgZGVzY3JpcHRvciBoYXMgYmVlbiBjcmVhdGVkLiA8L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkJyZWFrZG93bkVsZW1lbnQiPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImlzU3luY2hyb25pemVkV2l0aFNvdXJjZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJXb3JrUHJvZHVjdERlc2NyaXB0b3IiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWFsIERlc2NyaXB0b3IgdGhhdCByZXByZXNlbnRzIGEgV29yayBQcm9kdWN0IGluIHRoZSBjb250ZXh0IG9mIG9uZSBzcGVjaWZpYyBBY3Rpdml0eS4gIEV2ZXJ5IGJyZWFrZG93biBzdHJ1Y3R1cmUgY2FuIGRlZmluZSBkaWZmZXJlbnQgcmVsYXRpb25zaGlwcyBvZiBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvcnMgdG8gVGFzayBEZXNjcmlwdG9ycyBhbmQgUm9sZSBEZXNjcmlwdG9ycy4gIFRoZXJlZm9yZSBvbmUgV29yayBQcm9kdWN0IGNhbiBiZSByZXByZXNlbnRlZCBieSBtYW55IFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9ycyBlYWNoIHdpdGhpbiB0aGUgY29udGV4dCBvZiBhbiBBY3Rpdml0eSB3aXRoIGl0cyBvd24gc2V0IG9mIHJlbGF0aW9uc2hpcHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpEZXNjcmlwdG9yIj4KLQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQk8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJXb3JrUHJvZHVjdCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQk8eHNkOmNob2ljZSBtYXhPY2N1cnM9InVuYm91bmRlZCIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJJbXBhY3RlZEJ5IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iSW1wYWN0cyIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkRlbGl2ZXJhYmxlUGFydHMiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJPC94c2Q6Y2hvaWNlPgotCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImFjdGl2aXR5RW50cnlTdGF0ZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5HaXZlbiB0aGF0IGFuIGluc3RhbmNlIG9mIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9yIGhhcyBiZWVuIGNyZWF0ZWQgZm9yIGEgc3BlY2lmaWMgQWN0aXZpdHksIHRoZW4gdGhlIEFjdGl2aXR5IEVudHJ5IFN0YXRlIGF0dHJpYnV0ZSBzcGVjaWZpZXMgdGhlIGRlc2lyZWQgc3RhdGUgb2YgaW5zdGFuY2VzIG9mIHRoZSByZWZlcmVuY2VkIFdvcmsgUHJvZHVjdCB3aGVuIHdvcmsgb24gdGhlIEFjdGl2aXR5IGlzIGluaXRpYXRlZCAoaS5lLiB3b3JrIG9uIHRoZSBBY3Rpdml0eSdzIFRhc2sgRGVzY3JpcHRvcnMgaXMgYmVpbmcgaW5pdGlhdGVkIHRoYXQgdXNlIHRoaXMgV29yayBQcm9kdWN0IERlc2NyaXB0b3IgYXMgaW5wdXQpLiAgCi1Gb3Igc29tZSBXb3JrIFByb2R1Y3RzIHN0YXRlIGlzIGV4cHJlc3NlZCBpbiBwZXJjZW50YWdlIG9mIGNvbXBsZXRpb24sIGNvbXBsaWFuY2UgdG8gd29yayBwcm9kdWN0IGNoZWNrbGlzdCwgaW5mb3JtYWwgc3RhdGUgZGVzY3JpcHRpb25zLCBldGMuICBPdGhlcnMgaGF2ZSB2ZXJ5IHNwZWNpZmljIHN0YXRlcyBleHByZXNzZWQgYXMgZW51bWVyYXRpb25zIHN1Y2ggYXMgW2lkZW50aWZpZWQsIGJyaWVmbHkgZGVzY3JpYmVkLCBvdXRsaW5lZCwgZGV0YWlsZWRdIGZvciB1c2UgY2FzZXMuICBPdGhlciBXb3JrIFByb2R1Y3Qgc3RhdGVzIHJlbGF0ZSB0byBzb21lIHF1YWxpdHkgbWVhc3VyZXMgb3IgbGlmZWN5Y2xlIHN0YXRlcyBzdWNoIGFzIFtyZXZpZXdlZCwgaW1wbGVtZW50ZWQsIHRlc3RlZF0uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWN0aXZpdHlFeGl0U3RhdGUiIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+R2l2ZW4gdGhhdCBhbiBpbnN0YW5jZSBvZiBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvciBoYXMgYmVlbiBjcmVhdGVkIGZvciBhIHNwZWNpZmljIEFjdGl2aXR5LCB0aGVuIHRoZSBBY3Rpdml0eSBFeGlzdCBTdGF0ZSBhdHRyaWJ1dGUgc3BlY2lmaWVzIHRoZSBkZXNpcmVkIHN0YXRlIG9mIGluc3RhbmNlcyBvZiB0aGUgcmVmZXJlbmNlZCBXb3JrIFByb2R1Y3Qgd2hlbiB3b3JrIG9uIHRoZSBBY3Rpdml0eSBpcyBmaW5pc2hlZCAoaS5lLiB3b3JrIG9uIHRoZSBBY3Rpdml0eSdzIFRhc2sgRGVzY3JpcHRvcnMgaGFzIGZpbmlzaGVkIHRoYXQgaGF2ZSB0aGlzIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9yIGFzIG91dHB1dCkuCi1Gb3Igc29tZSBXb3JrIFByb2R1Y3RzIHN0YXRlIGlzIGV4cHJlc3NlZCBpbiBwZXJjZW50YWdlIG9mIGNvbXBsZXRpb24sIGNvbXBsaWFuY2UgdG8gd29yayBwcm9kdWN0IGNoZWNrbGlzdCwgaW5mb3JtYWwgc3RhdGUgZGVzY3JpcHRpb25zLCBldGMuICBPdGhlcnMgaGF2ZSB2ZXJ5IHNwZWNpZmljIHN0YXRlcyBleHByZXNzZWQgYXMgZW51bWVyYXRpb25zIHN1Y2ggYXMgW2lkZW50aWZpZWQsIGJyaWVmbHkgZGVzY3JpYmVkLCBvdXRsaW5lZCwgZGV0YWlsZWRdIGZvciB1c2UgY2FzZXMuICBPdGhlciBXb3JrIFByb2R1Y3Qgc3RhdGVzIHJlbGF0ZSB0byBzb21lIHF1YWxpdHkgbWVhc3VyZXMgb3IgbGlmZWN5Y2xlIHN0YXRlcyBzdWNoIGFzIFtyZXZpZXdlZCwgaW1wbGVtZW50ZWQsIHRlc3RlZF0uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUm9sZURlc2NyaXB0b3IiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWFsIERlc2NyaXB0b3IgdGhhdCByZXByZXNlbnRzIGEgUm9sZSBpbiB0aGUgY29udGV4dCBvZiBvbmUgc3BlY2lmaWMgQWN0aXZpdHkuICBFdmVyeSBicmVha2Rvd24gc3RydWN0dXJlIGNhbiBkZWZpbmUgZGlmZmVyZW50IHJlbGF0aW9uc2hpcHMgb2YgUm9sZSBEZXNjcmlwdG9ycyB0byBUYXNrIERlc2NyaXB0b3JzIGFuZCBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvcnMuICBUaGVyZWZvcmUgb25lIFJvbGUgY2FuIGJlIHJlcHJlc2VudGVkIGJ5IG1hbnkgUm9sZSBEZXNjcmlwdG9ycyBlYWNoIHdpdGhpbiB0aGUgY29udGV4dCBvZiBhbiBBY3Rpdml0eSB3aXRoIGl0cyBvd24gc2V0IG9mIHJlbGF0aW9uc2hpcHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpEZXNjcmlwdG9yIj4KLQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQk8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJSb2xlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBtYXhPY2N1cnM9InVuYm91bmRlZCIgbWluT2NjdXJzPSIwIiBuYW1lPSJSZXNwb25zaWJsZUZvciIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlRhc2tEZXNjcmlwdG9yIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lhbCBEZXNjcmlwdG9yIHRoYXQgcmVwcmVzZW50cyBhIHByb3h5IGZvciBhIFRhc2sgaW4gdGhlIGNvbnRleHQgb2Ygb25lIHNwZWNpZmljIEFjdGl2aXR5LiAgRXZlcnkgYnJlYWtkb3duIHN0cnVjdHVyZSBjYW4gZGVmaW5lIGRpZmZlcmVudCByZWxhdGlvbnNoaXBzIG9mIFRhc2sgRGVzY3JpcHRvcnMgdG8gV29yayBQcm9kdWN0IERlc2NyaXB0b3JzIGFuZCBSb2xlIERlc2NyaXB0b3JzLiBUaGVyZWZvcmUgb25lIFRhc2sgY2FuIGJlIHJlcHJlc2VudGVkIGJ5IG1hbnkgVGFzayBEZXNjcmlwdG9ycyBlYWNoIHdpdGhpbiB0aGUgY29udGV4dCBvZiBhbiBBY3Rpdml0eSB3aXRoIGl0cyBvd24gc2V0IG9mIHJlbGF0aW9uc2hpcHMuCi1BIGtleSBkaWZmZXJlbmNlIGJldHdlZW4gTWV0aG9kIENvbnRlbnQgYW5kIFByb2Nlc3MgaXMgdGhhdCBhIENvbnRlbnQgRWxlbWVudCBzdWNoIGFzIFRhc2sgZGVzY3JpYmVzIGFsbCBhc3BlY3RzIG9mIGRvaW5nIHdvcmsgZGVmaW5lZCBhcm91bmQgdGhpcyBUYXNrLiAgVGhpcyBkZXNjcmlwdGlvbiBpcyBtYW5hZ2VkIGluIHN0ZXBzLCB3aGljaCBhcmUgbW9kZWxlZCBhcyBTZWN0aW9ucyBvZiB0aGUgVGFza3MnIENvbnRlbnQgRGVzY3JpcHRpb25zLiAgV2hlbiBhcHBseWluZyBhIFRhc2sgaW4gYSBQcm9jZXNzJyBBY3Rpdml0eSB3aXRoIGEgVGFzayBEZXNjcmlwdG9yIGEgUHJvY2VzcyBFbmdpbmVlciBuZWVkcyB0byBpbmRpY2F0ZSB0aGF0IGF0IHRoYXQgcGFydGljdWxhciBwb2ludCBpbiB0aW1lIGluIHRoZSBQcm9jZXNzIGRlZmluaXRpb24gZm9yIHdoaWNoIHRoZSBUYXNrIERlc2NyaXB0b3IgaGFzIGJlZW4gY3JlYXRlZCwgb25seSBhIHN1YnNldCBvZiBzdGVwcyBzaGFsbCBiZSBwZXJmb3JtZWQuICBIZSBkZWZpbmVzIHRoaXMgc2VsZWN0aW9uIHVzaW5nIHRoZSBzZWxlY3RlZFN0ZXBzIGFzc29jaWF0aW9uLiAgSWYgaGUgd2FudHMgdG8gYWRkIHN0ZXBzIHRvIGEgVGFzayBEZXNjcmlwdG9yLCBoZSBjYW4gZGVzY3JpYmUgdGhlc2UgZWl0aGVyIHByYWdtYXRpY2FsbHkgaW4gdGhlIHJlZmluZWREZXNjcmlwdGlvbiBhdHRyaWJ1dGUgb3IgJ3Byb3Blcmx5JyBjcmVhdGUgYSBjb250cmlidXRpbmcgVGFzayB0byB0aGUgVGFzayB0aGUgVGFzayBEZXNjcmlwdG9yIHJlZmVycyB0by4KLTwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6V29ya0JyZWFrZG93bkVsZW1lbnQiPgotCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlRhc2siIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iUGVyZm9ybWVkUHJpbWFyaWx5QnkiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJPHhzZDpjaG9pY2UgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQWRkaXRpb25hbGx5UGVyZm9ybWVkQnkiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJBc3Npc3RlZEJ5IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iRXh0ZXJuYWxJbnB1dCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Ik1hbmRhdG9yeUlucHV0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iT3B0aW9uYWxJbnB1dCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Ik91dHB1dCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBtYXhPY2N1cnM9InVuYm91bmRlZCIgbWluT2NjdXJzPSIwIiBuYW1lPSJTdGVwIiB0eXBlPSJ1bWE6U2VjdGlvbiIvPgotCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImlzU3luY2hyb25pemVkV2l0aFNvdXJjZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJDb21wb3NpdGVSb2xlIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lhbCBSb2xlIERlc2NyaXB0b3IgdGhhdCByZWxhdGVzIHRvIG1vcmUgdGhlbiBvbmUgUm9sZS4gIEl0IHJlcHJlc2VudHMgYSBncm91cGluZyBvZiBSb2xlcyB3aXRoIHRoZSBtYWluIHB1cnBvc2Ugb2Ygc2ltcGxpZmljYXRpb24sIGkuZS4gcmVkdWNpbmcgdGhlIG51bWJlciBvZiByb2xlcyBmb3IgYSBwcm9jZXNzLgotQSBDb21wb3NpdGUgUm9sZSBpcyBhIGdyb3VwaW5nIG9mIFJvbGVzIHRoYXQgY2FuIGJlIHVzZWQgaW4gYW4gQWN0aXZpdHkgb3IgUHJvY2VzcyB0byByZWR1Y2UgdGhlIG51bWJlciBvZiBSb2xlcy4gIEEgdHlwaWNhbCBhcHBsaWNhdGlvbiB3b3VsZCBiZSBhIHByb2Nlc3MgZm9yIGEgc21hbGwgdGVhbSBpbiB3aGljaCBhIHN0YW5kYXJkIHNldCBvZiByb2xlcyBmcm9tIHRoZSBtZXRob2QgY29udGVudCB3b3VsZCBiZSBhbGwgcGVyZm9ybWVkIGJ5IG9uZSBvciBtb3JlIHJlc291cmNlLiAgQnkgdXNpbmcgQ29tcG9zaXRlIFJvbGUgdGhlIHByb2Nlc3Mgd291bGQgc3VnZ2VzdCBhIHR5cGljYWwgY2x1c3RlcmluZyBvZiBSb2xlcyB0byBSZXNvdXJjZXMuICBBIENvbXBvc2l0ZSBSb2xlIGNvdWxkIHBlcmZvcm0gYWxsIFRhc2tzIGRlZmluZWQgZm9yIHRoZSBSb2xlcyBpdCByZWZlcnMgdG8uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpSb2xlRGVzY3JpcHRvciI+Ci0JCQkJPHhzZDpjaG9pY2UgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJBZ2dyZWdhdGVkUm9sZSIgdHlwZT0idW1hOlJvbGUiLz4KLQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iVGVhbVByb2ZpbGUiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBCcmVha2Rvd24gRWxlbWVudCB0aGF0IGdyb3VwcyBSb2xlIERlc2NyaXB0b3JzIG9yIFJlc291cmNlIERlZmluaXRpb25zIGRlZmluaW5nIGEgbmVzdGVkIGhpZXJhcmNoeSBvZiB0ZWFtcyBhbmQgdGVhbSBtZW1iZXJzLgotV29yayBhc3NpZ25tZW50cyBhbmQgV29yayBQcm9kdWN0IHJlc3BvbnNpYmlsaXRpZXMgY2FuIGJlIGRpZmZlcmVudCBmcm9tIEFjdGl2aXR5IHRvIEFjdGl2aXR5IGluIGEgZGV2ZWxvcG1lbnQgcHJvamVjdC4gRGlmZmVyZW50IHBoYXNlcyByZXF1aXJlIGRpZmZlcmVudCBzdGFmZmluZyBwcm9maWxlcywgaS5lLiBkaWZmZXJlbnQgc2tpbGxzIGFuZCByZXNvdXJjZXMgZG9pbmcgZGlmZmVyZW50IHR5cGVzIG9mIHdvcmsuICBUaGVyZWZvcmUsIGEgcHJvY2VzcyBuZWVkcyB0byBkZWZpbmUgc3VjaCBkaWZmZXJlbnQgcHJvZmlsZXMgaW4gYSBmbGV4aWJsZSBtYW5uZXIuICBXaGVyZWFzIENvcmUgTWV0aG9kIENvbnRlbnQgZGVmaW5lcyBzdGFuZGFyZCByZXNwb25zaWJpbGl0aWVzIGFuZCBhc3NpZ25tZW50cywgYSBwcm9jZXNzIGV4cHJlc3MgYnkgYSBicmVha2Rvd24gc3RydWN0dXJlcyBuZWVkcyB0byBiZSBhYmxlIHJlZmluZSBhbmQgcmVkZWZpbmUgdGhlc2UgdGhyb3VnaG91dCBpdHMgZGVmaW5pdGlvbi4gIFJvbGUgRGVzY3JpcHRvcnMsIFJlc291cmNlIERlZmluaXRpb25zLCBhcyB3ZWxsIGFzIFRlYW0gUHJvZmlsZXMgcHJvdmlkZSB0aGUgZGF0YSBzdHJ1Y3R1cmUgbmVjZXNzYXJ5IHRvIGFjaGlldmUgdGhpcyBmbGV4aWJpbGl0eSBhbmQgdG8gcHJvdmlkZSBhIHByb2Nlc3MgdXNlciB3aXRoIHRoZSBjYXBhYmlsaXR5IHRvIGRlZmluZSBkaWZmZXJlbnQgdGVhbXMgYW5kIHJvbGUgcmVsYXRpb25zaGlwcyBmb3IgZXZlcnkgQWN0aXZpdHkgKGluY2x1ZGluZyBBY3Rpdml0aWVzIG9uIGFueSBuZXN0aW5nLWxldmVsIGFzIHdlbGwgYXMgSXRlcmF0aW9ucyBvciBQaGFzZXMpLgotSGVuY2UsIGluIGFkZGl0aW9uIHRvIHRoZSB3b3JrIGJyZWFrZG93biBhbmQgd29yayBwcm9kdWN0IGJyZWFrZG93biBzdHJ1Y3R1cmVzIGRlZmluZWQgc28gZmFyLCBUZWFtIFByb2ZpbGVzIGFyZSB1c2VkIHRvIGRlZmluZSBhIHRoaXJkIHR5cGUgb2YgYnJlYWtkb3duIHN0cnVjdHVyZTogdGVhbSBicmVha2Rvd24gc3RydWN0dXJlcy4gIFRoZXNlIGFyZSBjcmVhdGVkIGFzIGFuIEFjdGl2aXR5IHNwZWNpZmljIGhpZXJhcmNoeSBvZiBUZWFtIFByb2ZpbGVzIGNvbXByaXNpbmcgb2YgUm9sZSBEZXNjcmlwdG9ycyBhbmQgUmVzb3VyY2UgRGVmaW5pdGlvbnMuICBUaGVzZSBzdHJ1Y3R1cmVzIGNhbiBiZSBwcmVzZW50ZWQgYXMgd2VsbC1rbm93biBPcmctQ2hhcnRzLiAgSnVzdCBhcyB3aXRoIGFueSBvdGhlciBCcmVha2Rvd24gRWxlbWVudCBhbmQgRGVzY3JpcHRvcnMsIFRlYW0gUHJvZmlsZXMgY2FuIGJlIGRlZmluZWQgd2l0aGluIHRoZSBzY29wZSBvZiBhbnkgQWN0aXZpdHkgaW4gYSBicmVha2Rvd24gc3RydWN0dXJlLiAgSW4gb3RoZXIgd29yZHMgZXZlcnkgQWN0aXZpdHkgY2FuIGRlZmluZSBpdHMgb3duIFRlYW0gUHJvZmlsZXMgY29uc2lzdGluZyBvZiBBY3Rpdml0eSBzcGVjaWZpYyBSb2xlIERlc2NyaXB0b3JzIGFuZCBSZXNvdXJjZSBEZWZpbml0aW9ucy4gIFR5cGljYWxseSwgVGVhbSBQcm9maWxlcyBhcmUgZGVmaW5lZCBvbiB0aGUgbGV2ZWwgb2YgSXRlcmF0aW9ucyBvciBQaGFzZXMgb3Igb3RoZXIgaGlnaGVyLWxldmVsIEFjdGl2aXR5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6QnJlYWtkb3duRWxlbWVudCI+Ci0JCQkJPHhzZDpjaG9pY2UgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJSb2xlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJTdXBlclRlYW0iIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlN1YlRlYW0iIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUHJvY2VzcyI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpYWwgQWN0aXZpdHkgdGhhdCBkZXNjcmliZXMgYSBzdHJ1Y3R1cmUgZm9yIHBhcnRpY3VsYXIgdHlwZXMgb2YgZGV2ZWxvcG1lbnQgcHJvamVjdHMuICBUbyBwZXJmb3JtIHN1Y2ggYSBkZXZlbG9wbWVudCBwcm9qZWN0IGEgUHJvY2Vzc2VzIHdvdWxkIGJlICdpbnN0YW50aWF0ZWQnIGFuZCBhZGFwdGVkIGZvciB0aGUgc3BlY2lmaWMgc2l0dWF0aW9uLiAgUHJvY2VzcyBpcyBhbiBhYnN0cmFjdCBjbGFzcyBhbmQgdGhpcyBtZXRhLW1vZGVsIGRlZmluZXMgZGlmZmVyZW50IHNwZWNpYWwgdHlwZXMgb2YgUHJvY2Vzc2VzIGZvciBkaWZmZXJlbnQgcHJvY2VzcyBtYW5hZ2VtZW50IGFwcGxpY2F0aW9ucyBhbmQgZGlmZmVyZW50IHNpdHVhdGlvbnMgb2YgcHJvY2VzcyByZXVzZS4gIEV2ZXJ5IFByb2Nlc3MgY29tcHJpc2VzIG9mIGFuZCBpcyB0aGUgdG9wLWxldmVsIGVsZW1lbnQgb2YgYW4gbi1sZXZlbCBicmVha2Rvd24gc3RydWN0dXJlIHVzaW5nIHRoZSBOZXN0aW5nIGFzc29jaWF0aW9uIGRlZmluZWQgb24gQWN0aXZpdHkuCi1Db3JlIE1ldGhvZCBDb250ZW50IHByb3ZpZGVzIHN0ZXAtYnktc3RlcCBleHBsYW5hdGlvbnMsIGRlc2NyaWJpbmcgaG93IHZlcnkgc3BlY2lmaWMgZGV2ZWxvcG1lbnQgZ29hbHMgYXJlIGFjaGlldmVkIGluZGVwZW5kZW50IG9mIHRoZSBwbGFjZW1lbnQgb2YgdGhlc2Ugc3RlcHMgd2l0aGluIGEgZGV2ZWxvcG1lbnQgbGlmZWN5Y2xlLiAgUHJvY2Vzc2VzIHRha2UgdGhlc2UgbWV0aG9kIGVsZW1lbnRzIGFuZCByZWxhdGUgdGhlbSBpbnRvIHNlbWktb3JkZXJlZCBzZXF1ZW5jZXMgdGhhdCBhcmUgY3VzdG9taXplZCB0byBzcGVjaWZpYyB0eXBlcyBvZiBwcm9qZWN0cy4gIFRodXMsIGEgcHJvY2VzcyBpcyBhIHNldCBvZiBwYXJ0aWFsbHkgb3JkZXJlZCB3b3JrIGRlc2NyaXB0aW9ucyBpbnRlbmRlZCB0byByZWFjaCBhIGhpZ2hlciBkZXZlbG9wbWVudCBnb2FsLCBzdWNoIGFzIHRoZSByZWxlYXNlIG9mIGEgc3BlY2lmaWMgc29mdHdhcmUgc3lzdGVtLiAgQSBwcm9jZXNzIGFuZCB0aGUgcHJvY2VzcyBtZXRhLW1vZGVsIHN0cnVjdHVyZSBkZWZpbmVkIGluIHRoaXMgc3BlY2lmaWNhdGlvbiBmb2N1c2VzIG9uIHRoZSBsaWZlY3ljbGUgYW5kIHRoZSBzZXF1ZW5jaW5nIG9mIHdvcmsgaW4gYnJlYWtkb3duIHN0cnVjdHVyZXMuICBUbyBhY2hpZXZlIHRoaXMgaXQgdXNlcyB0aGUgRGVzY3JpcHRvciBjb25jZXB0IHJlZmVyZW5jaW5nIG1ldGhvZCBjb250ZW50IGFuZCBhbGxvd2luZyBkZWZpbmluZyB0aW1lLXNwZWNpZmljIGN1c3RvbWl6YXRpb25zIG9mIHRoZSByZWZlcmVuY2VkIGNvbnRlbnQgKGUuZy4gZGVmaW5pbmcgYSBmb2N1cyBvbiBkaWZmZXJlbnQgc3RlcHMgb2YgdGhlIHNhbWUgVGFzayBhbmQgcHJvdmlkaW5nIGlucHV0IFdvcmsgUHJvZHVjdHMgaW4gZGlmZmVyZW50IHN0YXRlcyB3aXRoaW4gdGhlIGRpZmZlcmVudCBQaGFzZXMgb2YgYSBwcm9jZXNzIGxpZmVjeWNsZSBpbiB3aGljaCB0aGUgc2FtZSBUYXNrIGlzIHBlcmZvcm1lZCkuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpBY3Rpdml0eSI+Ci0JCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJPHhzZDplbGVtZW50IG1heE9jY3Vycz0idW5ib3VuZGVkIiBtaW5PY2N1cnM9IjAiIG5hbWU9IkluY2x1ZGVzUGF0dGVybiIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJEZWZhdWx0Q29udGV4dCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG1pbk9jY3Vycz0iMCIgbmFtZT0iVmFsaWRDb250ZXh0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iRGVsaXZlcnlQcm9jZXNzIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lhbCBQcm9jZXNzIGRlc2NyaWJpbmcgYSBjb21wbGV0ZSBhbmQgaW50ZWdyYXRlZCBhcHByb2FjaCBmb3IgcGVyZm9ybWluZyBhIHNwZWNpZmljIHByb2plY3QgdHlwZS4gIEl0IGRlc2NyaWJlcyBhIGNvbXBsZXRlIHByb2plY3QgbGlmZWN5Y2xlIGVuZC10by1lbmQgYW5kIHNoYWxsIGJlIHVzZWQgYXMgYSByZWZlcmVuY2UgZm9yIHJ1bm5pbmcgcHJvamVjdHMgd2l0aCBzaW1pbGFyIGNoYXJhY3RlcmlzdGljcyBhcyBkZWZpbmVkIGZvciB0aGUgcHJvY2Vzcy4gIEEgRGVsaXZlcnkgUHJvY2VzcyBpcyByZWxhdGVkIHRvIHNwZWNpZmljIHN1cHBvcnRpbmcgaW5mb3JtYXRpb24gc3VjaCBhcyBSb2FkbWFwcyAoaW5oZXJpdGVkIHZpYSBBY3Rpdml0eSkgYXMgd2VsbCBhcyBDb21tdW5pY2F0aW9ucyBhbmQgRWR1Y2F0aW9uIE1hdGVyaWFsLgotQSBEZWxpdmVyeSBQcm9jZXNzIGlzIGEgUHJvY2VzcyB0aGF0IGNvdmVycyBhIHdob2xlIGRldmVsb3BtZW50IGxpZmVjeWNsZSBmcm9tIGJlZ2lubmluZyB0byBlbmQuICBBIERlbGl2ZXJ5IFByb2Nlc3Mgc2hhbGwgYmUgdXNlZCBhcyBhIHRlbXBsYXRlIGZvciBwbGFubmluZyBhbmQgcnVubmluZyBhIHByb2plY3QuICBJdCBwcm92aWRlcyBhIGNvbXBsZXRlIGxpZmVjeWNsZSBtb2RlbCB3aXRoIHByZWRlZmluZWQgcGhhc2VzLCBpdGVyYXRpb25zLCBhbmQgYWN0aXZpdGllcyB0aGF0IGhhdmUgYmVlbiBkZXRhaWxlZCBieSBzZXF1ZW5jaW5nIHJlZmVyZW5jaW5nIG1ldGhvZCBjb250ZW50IGluIGJyZWFrZG93biBzdHJ1Y3R1cmVzLiAgSXQgaXMgZGVmaW5lZCBvbiB0aGUgYmFzaXMgb2YgZXhwZXJpZW5jZSB3aXRoIHBhc3QgcHJvamVjdHMgb3IgZW5nYWdlbWVudHMsIGFuZC9vciB0aGUgYmVzdCBwcmFjdGljZSB1c2Ugb2YgYSBkZXZlbG9wbWVudCBvciBkZWxpdmVyeSBhcHByb2FjaC4gIEl0IGRlZmluZXMgd2hhdCBnZXRzIHByb2R1Y2VkLCBob3cgdGhvc2UgaXRlbXMgYXJlIHByb2R1Y2VkLCBhbmQgdGhlIHJlcXVpcmVkIHN0YWZmaW5nIGluIHRoZSBmb3JtIG9mIGludGVncmF0ZWQgV29yaywgV29yayBQcm9kdWN0LCBhbmQgVGVhbSBCcmVha2Rvd24gU3RydWN0dXJlcy4gIEZvciBleGFtcGxlLCBhIHByb2Nlc3MgZW5naW5lZXIgY2FuIGRlZmluZSBhbHRlcm5hdGl2ZSBEZWxpdmVyeSBQcm9jZXNzZXMgZm9yIHNvZnR3YXJlIGRldmVsb3BtZW50IHByb2plY3RzIHRoYXQgZGlmZmVyIGluIHRoZSBzY2FsZSBvZiB0aGUgZW5nYWdlbWVudCBhbmQgc3RhZmZpbmcgbmVjZXNzYXJ5LCB0aGUgdHlwZSBvZiB0aGUgc29mdHdhcmUgYXBwbGljYXRpb24gdG8gYmUgZGV2ZWxvcGVkLCB0aGUgZGV2ZWxvcG1lbnQgbWV0aG9kcyBhbmQgdGVjaG5vbG9naWVzIHRvIGJlIHVzZWQsIGV0Yy4gIEFsdGhvdWdoLCB0aGUgRGVsaXZlcnkgUHJvY2VzcyBhaW1zIHRvIGNvdmVyIGEgd2hvbGUgcHJvamVjdCBpdCBrZWVwcyBjZXJ0YWluIGRlY2lzaW9uIHRoYXQgYXJlIHRvbyBwcm9qZWN0IHNwZWNpZmljIG9wZW4uICBGb3IgZXhhbXBsZSwgdGhlIGJyZWFrZG93biBzdHJ1Y3R1cmUgZGVmaW5lcyB3aGljaCBCcmVha2Rvd24gRWxlbWVudHMgaGF2ZSBtdWx0aXBsZSBvY2N1cnJlbmNlcyBvciBpcyByZXBlYXRhYmxlIHZpYSBpdCByZXNwZWN0aXZlIGF0dHJpYnV0ZXMsIGJ1dCBkb2VzIG5vdCBzYXkgaG93IG1hbnkgb2NjdXJyZW5jZXMgYW5kIGhvdyBtYW55IHJlcGVhdHMvaXRlcmF0aW9ucyBpdCB3aWxsIGhhdmUuICBUaGVzZSBkZWNpc2lvbnMgaGF2ZSB0byBiZSBkb25lIGJ5IGEgcHJvamVjdCBtYW5hZ2VyIHdoZW4gcGxhbm5pbmcgYSBjb25jcmV0ZSBwcm9qZWN0LCBwcm9qZWN0IHBoYXNlLCBvciBwcm9qZWN0IGl0ZXJhdGlvbnMuICBBIERlbGl2ZXJ5IFByb2Nlc3MgaXMgYWx3YXlzIGEgY29tcGxldGUgZGVzY3JpcHRpb24gb2YgYSBwcm9jZXNzIGluIHRlcm1zIG9mIGNvbXBsZXRlbmVzcyBvZiB0aGUgbGlmZWN5Y2xlLCBhcyB3ZWxsIGFzIGluIHRlcm1zIG9mIGFsbCB0aHJlZSB2aWV3cyBvbiB0aGUgcHJvY2VzcyB3aGljaCBhcmUgdGhlIFdvcmsgQnJlYWtkb3duIFN0cnVjdHVyZSwgV29yayBQcm9kdWN0IEJyZWFrZG93biBTdHJ1Y3R1cmUsIGFuZCBUZWFtIEJyZWFrZG93biBTdHJ1Y3R1cmUgaGF2ZSB0byBiZSBmdWxseSBhbmQgY29uc2lzdGVudGx5IHBvcHVsYXRlZC4gIENvbnNpc3RlbmN5IG9mIGEgRGVsaXZlcnkgUHJvY2VzcyBpcyBhY3R1YWxseSBlbnN1cmVkIGJ5IHRoZSBmYWN0IHRoYXQgYWxsIHRocmVlIGJyZWFrZG93bnMgYXJlIHJlcHJlc2VudGVkIGJ5IG9uZSBzaW5nbGUgZGF0YSBzdHJ1Y3R1cmUgYW5kIG9uZSBwYXJ0aWN1bGFyIGJyZWFrZG93biBzdWNoIGFzIFRlYW0gQnJlYWtkb3duIGlzIGp1c3QgYSB2aWV3IG9uIHRoYXQgZGF0YSBzdHJ1Y3R1cmUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpQcm9jZXNzIj4KLQkJCQk8eHNkOmNob2ljZSBtYXhPY2N1cnM9InVuYm91bmRlZCIgbWluT2NjdXJzPSIwIj4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkNvbW11bmljYXRpb25zTWF0ZXJpYWwiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkVkdWNhdGlvbk1hdGVyaWFsIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJPC94c2Q6Y2hvaWNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkNhcGFiaWxpdHlQYXR0ZXJuIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lhbCBQcm9jZXNzIHRoYXQgZGVzY3JpYmVzIGEgcmV1c2FibGUgY2x1c3RlciBvZiBkb2luZyB3b3JrIGluIGNvbW1vbiBwcm9jZXNzIGFyZWFzLiAgQ2FwYWJpbGl0aWVzIFBhdHRlcm5zIGV4cHJlc3MgYW5kIGNvbW11bmljYXRlIHByb2Nlc3Mga25vd2xlZGdlIGZvciBhIGtleSBhcmVhIG9mIGludGVyZXN0IHN1Y2ggYXMgYSBEaXNjaXBsaW5lIGFuZCBjYW4gYmUgZGlyZWN0bHkgdXNlZCBieSBwcm9jZXNzIHByYWN0aXRpb25lciB0byBndWlkZSBoaXMgd29yay4gIFRoZXkgYXJlIGFsc28gdXNlZCBhcyBidWlsZGluZyBibG9ja3MgdG8gYXNzZW1ibGUgRGVsaXZlcnkgUHJvY2Vzc2VzIG9yIGxhcmdlciBDYXBhYmlsaXR5IFBhdHRlcm5zIGVuc3VyaW5nIG9wdGltYWwgcmV1c2UgYW5kIGFwcGxpY2F0aW9uIG9mIHRoZSBrZXkgcHJhY3RpY2VzIHRoZXkgZXhwcmVzcy4KLUEgQ2FwYWJpbGl0eSBQYXR0ZXJuIGlzIGEgc3BlY2lhbCBQcm9jZXNzIHRoYXQgZGVzY3JpYmVzIGEgcmV1c2FibGUgY2x1c3RlciBvZiBkb2luZyB3b3JrIGluIGEgZ2VuZXJhbCBwcm9jZXNzIGFyZWEgdGhhdCBwcm92aWRlcyBhIGNvbnNpc3RlbnQgZGV2ZWxvcG1lbnQgYXBwcm9hY2ggdG8gY29tbW9uIHByb2JsZW1zLiAgRXhhbXBsZXMgZm9yIENhcGFiaWxpdHkgUGF0dGVybiBjb3VsZCBiZSAndXNlIGNhc2UtYmFzZWQgcmVxdWlyZW1lbnRzIG1hbmFnZW1lbnQnLCAndXNlIGNhc2UgYW5hbHlzaXMnLCBvciAndW5pdCB0ZXN0aW5nJy4gVHlwaWNhbGx5IGJ1dCBub3QgbmVjZXNzYXJpbHksIENhcGFiaWxpdHkgUGF0dGVybnMgaGF2ZSB0aGUgc2NvcGUgb2Ygb25lIGRpc2NpcGxpbmUgcHJvdmlkaW5nIGEgYnJlYWtkb3duIG9mIHJldXNhYmxlIGNvbXBsZXggQWN0aXZpdGllcywgcmVsYXRpb25zaGlwcyB0byB0aGUgUm9sZXMgd2hpY2ggcGVyZm9ybSBUYXNrcyB3aXRoaW4gdGhlc2UgQWN0aXZpdGllcywgYXMgd2VsbCBhcyB0byB0aGUgV29yayBQcm9kdWN0cyB0aGF0IGFyZSB1c2VkIGFuZCBwcm9kdWNlZC4gIEEgY2FwYWJpbGl0eSBwYXR0ZXJuIGRvZXMgbm90IHJlbGF0ZSB0byBhbnkgc3BlY2lmaWMgcGhhc2Ugb3IgaXRlcmF0aW9uIG9mIGEgZGV2ZWxvcG1lbnQgbGlmZWN5Y2xlLCBhbmQgc2hvdWxkIG5vdCBpbXBseSBhbnkuICBJbiBvdGhlciB3b3JkcywgYSBwYXR0ZXJuIHNob3VsZCBiZSBkZXNpZ25lZCBpbiBhIHdheSB0aGF0IGl0IGlzIGFwcGxpY2FibGUgYW55d2hlcmUgaW4gYSBEZWxpdmVyeSBQcm9jZXNzLiAgVGhpcyBlbmFibGVzIGl0cyBBY3Rpdml0aWVzIHRvIGJlIGZsZXhpYmx5IGFzc2lnbmVkIHRvIHdoYXRldmVyIHBoYXNlcyB0aGVyZSBhcmUgaW4gdGhlIERlbGl2ZXJ5IFByb2Nlc3MgdG8gd2hpY2ggaXQgaXMgYmVpbmcgYXBwbGllZC4gIEl0IGlzIGEgZ29vZCBwcmFjdGljZSB0byBkZXNpZ24gYSBDYXBhYmlsaXR5IFBhdHRlcm4gdG8gcHJvZHVjZSBvbmUgb3IgbW9yZSBnZW5lcmljIERlbGl2ZXJhYmxlcy4gIFRoZSB0eXBpY2FsIGNvbmZpZ3VyYXRpb24gaXMgdGhhdCBlYWNoIEFjdGl2aXR5IGluIHRoZSBDYXBhYmlsaXR5IFBhdHRlcm4gcHJvZHVjZXMgb25lIERlbGl2ZXJhYmxlLCBhbmQgdGhlIGxhc3QgVGFzayBEZXNjcmlwdG9yIGluIHRoZSBBY3Rpdml0eSBleHBsaWNpdGx5IG91dHB1dHMganVzdCB0aGlzIERlbGl2ZXJhYmxlLiAgVGhpcyBlbmFibGVzIHRoZSBwcm9jZXNzIGVuZ2luZWVyIHRvIHNlbGVjdCBQYXR0ZXJucyBvciBqdXN0IEFjdGl2aXRpZXMgYnkgZGVjaWRpbmcgd2hpY2ggRGVsaXZlcmFibGVzIGFyZSByZXF1aXJlZC4gIEl0IGFsc28gb2ZmZXJzIGEgc2ltcGxlIGludGVncmF0aW9uIGFwcHJvYWNoOiBhbiBBY3Rpdml0eSBmcm9tIGEgY2FwYWJpbGl0eSBwYXR0ZXJuIGlzIGxpbmtlZCB0byB0aGUgUGhhc2Ugb3IgSXRlcmF0aW9uIHdoaWNoIGlzIHJlcXVpcmVkIHRvIHByb2R1Y2UgdGhlIEFjdGl2aXR5J3MgRGVsaXZlcmFibGUuICBLZXkgYXBwbGljYXRpb25zIGFyZWFzIG9mIC8gYXJlYXMgb2YgcmV1c2UgZm9yIENhcGFiaWxpdHkgUGF0dGVybnMgYXJlOgotLSBUbyBzZXJ2ZSBhcyBidWlsZGluZyBibG9ja3MgZm9yIGFzc2VtYmxpbmcgRGVsaXZlcnkgUHJvY2Vzc2VzIG9yIGxhcmdlciBDYXBhYmlsaXR5IFBhdHRlcm5zLiAgTm9ybWFsbHkgZGV2ZWxvcGluZyBhIERlbGl2ZXJ5IFByb2Nlc3MgaXMgbm90IGRvbmUgZnJvbSBzY3JhdGNoIGJ1dCBieSBzeXN0ZW1hdGljYWxseSBhcHBseWluZyBhbmQgYmluZGluZyBwYXR0ZXJucy4gIEluIGFkZGl0aW9uIHRvIHRoZSBzdGFuZGFyZCBwYXR0ZXJuIGFwcGxpY2F0aW9uIG9mICdjb3B5LWFuZC1tb2RpZnknLCB3aGljaCBhbGxvd3MgdGhlIHByb2Nlc3MgZW5naW5lZXIgdG8gaW5kaXZpZHVhbGx5IGN1c3RvbWl6ZSB0aGUgcGF0dGVybidzIGNvbnRlbnQgdG8gdGhlIHBhcnRpY3VsYXIgc2l0dWF0aW9uIGl0IGlzIGFwcGxpZWQgZm9yLCB0aGUgUGx1Z2luIG1ldGEtbW9kZWwgcGFja2FnZSAoU2VjdGlvbiA2LjEpIGludHJvZHVjZXMgZXZlbiBtb3JlIHNvcGhpc3RpY2F0ZWQgaW5oZXJpdGFuY2UgcmVsYXRpb25zaGlwcyB0aGF0IHN1cHBvcnQgZHluYW1pYyBiaW5kaW5nIG9mIHBhdHRlcm5zIChpLmUuIHRoZSBwYXR0ZXJuIGlzIHJlZmVyZW5jZWQgYW5kIG5vdCBjb3BpZWQpLiAgVGhpcyB1bmlxdWUgbmV3IHdheSBvZiByZXVzaW5nIHByb2Nlc3Mga25vd2xlZGdlIGFsbG93cyB0byBmYWN0b3Igb3V0IGNvbW1vbmx5IHJlb2NjdXJyaW5nIEFjdGl2aXRpZXMgaW50byBwYXR0ZXJucyBhbmQgdG8gYXBwbHkgdGhlbSBvdmVyIGFuZCBvdmVyIGFnYWluIGZvciBhIHByb2Nlc3MuICBXaGVuIHRoZSBwYXR0ZXJuIGlzIGJlaW5nIHJldmlzZWQgb3IgdXBkYXRlZCwgYWxsIGNoYW5nZXMgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IHJlZmxlY3RlZCBpbiBhbGwgcGF0dGVybiBhcHBsaWNhdGlvbiBpbiBhbGwgcHJvY2Vzc2VzIGJlY2F1c2Ugb2YgdGhlIGR5bmFtaWMgYmluZGluZy4KLS0gVG8gc3VwcG9ydCBkaXJlY3QgZXhlY3V0aW9uIGluIGEgZGV2ZWxvcG1lbnQgcHJvamVjdCB0aGF0IGRvZXMgbm90IHdvcmsgZm9sbG93aW5nIGEgd2VsbC1kZWZpbmVkIHByb2Nlc3MsIGJ1dCB3b3JrcyBiYXNlZCBvbiBsb29zZWx5IGNvbm5lY3RlZCBwcm9jZXNzIGZyYWdtZW50cyBvZiBiZXN0IHByYWN0aWNlcyBpbiBhIGZsZXhpYmxlIG1hbm5lciAoZS5nLiBBZ2lsZSBEZXZlbG9wbWVudCkuCi0tIFRvIHN1cHBvcnQgcHJvY2VzcyBlZHVjYXRpb24gYnkgZGVzY3JpYmluZyBrbm93bGVkZ2UgZm9yIGEga2V5IGFyZWEgc3VjaCBhcyBiZXN0IHByYWN0aWNlcyBvbiBob3cgdG8gcGVyZm9ybSB0aGUgd29yayBmb3IgYSBEaXNjaXBsaW5lIChlLmcuIFJlcXVpcmVtZW50cyBNYW5hZ2VtZW50KSwgZm9yIGEgc3BlY2lmaWMgZGV2ZWxvcG1lbnQgdGVjaG5pcXVlIChhc3BlY3Qtb3JpZW50ZWQgZGV2ZWxvcG1lbnQpLCBvciBhIHNwZWNpZmljIHRlY2huaWNhbCBhcmVhIChlLmcuIHJlbGF0aW9uYWwgZGF0YWJhc2UgZGVzaWduKSwgd2hpY2ggaXMgdXNlZCBmb3IgZWR1Y2F0aW9uIGFuZCB0ZWFjaGluZy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOlByb2Nlc3MiLz4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpYWwgUHJvY2VzcyB0aGF0IGlzIHByZXBhcmVkIGZvciBpbnN0YW50aWF0aW9uIGJ5IGEgcHJvamVjdCBwbGFubmluZyB0b29sLiAgVHlwaWNhbGx5LCBpdCBpcyBjcmVhdGVkIGJhc2VkIG9uIGEgUHJvY2VzcyBzdWNoIGFzIGEgRGVsaXZlcnkgUHJvY2VzcyBhcyBhIHdob2xlIChlLmcuIGluIGNhc2Ugb2YgYSB3YXRlcmZhbGwtYmFzZWQgZGV2ZWxvcG1lbnQgYXBwcm9hY2gpIG9yIGluIHBhcnRzIChlLmcuIGluIGNhc2Ugb2YgYW4gaXRlcmF0aXZlIGRldmVsb3BtZW50IGFwcHJvYWNoKS4KLUEgUHJvY2VzcyBQbGFubmluZyBUZW1wbGF0ZSByZXByZXNlbnRzIGEgcGFydGlhbGx5IGZpbmlzaGVkIHBsYW4gZm9yIGEgY29uY3JldGUgcHJvamVjdC4gIEl0IHVzZXMgdGhlIHNhbWUgaW5mb3JtYXRpb24gc3RydWN0dXJlcyBhcyBhbGwgb3RoZXIgUHJvY2VzcyBUeXBlcyB0byByZXByZXNlbnQgdGVtcGxhdGVzIGZvciBwcm9qZWN0IHBsYW5zLiAgSG93ZXZlciwgY2VydGFpbiBwbGFubmluZyBkZWNpc2lvbnMgaGF2ZSBhbHJlYWR5IGJlZW4gYXBwbGllZCB0byB0aGUgdGVtcGxhdGUgYXMgd2VsbCBhcyBpbmZvcm1hdGlvbiBoYXMgYmVlbiByZW1vdmVkIGFuZC9vciByZWZvcm1hdHRlZCB0byBiZSByZWFkeSBmb3IgZXhwb3J0IHRvIGEgc3BlY2lmaWMgcGxhbm5pbmcgdG9vbC4gIEV4YW1wbGVzIGZvciBzdWNoIGRlY2lzaW9ucyBhcmU6IGEgdGVtcGxhdGUgaGFzIGJlZW4gY3JlYXRlZCB0byByZXByZXNlbnQgYSBwbGFuIGZvciBhIHBhcnRpY3VsYXIgSXRlcmF0aW9uIGluIGFuIGl0ZXJhdGl2ZSBkZXZlbG9wbWVudCBwcm9qZWN0LCB3aGljaCBmciBleGFtcGxlIGRpc3Rpbmd1aXNoZXMgZWFybHkgZnJvbSBsYXRlIGl0ZXJhdGlvbnMgaW4gdGhlIEVsYWJvcmF0aW9uIHBoYXNlIG9mIGEgcHJvamVjdDsgaWYgdGhlIHRhcmdldGVkIHBsYW5uaW5nIHRvb2wgY2Fubm90IHJlcHJlc2VudCBpbnB1dCBhbmQgb3V0cHV0IG9mIFRhc2ssIHRoZW4gdGhlc2UgaGF2ZSBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgc3RydWN0dXJlOyBjZXJ0YWluIHJlcGV0aXRpb25zIGhhdmUgYmVlbiBhbHJlYWR5IGFwcGxpZWQsIGUuZy4gc3RhdGluZyB0aGF0IGEgY3ljbGUgb2Ygc3BlY2lmaWMgVGFzayBncm91cGVkIGluIGFuIEFjdGl2aXR5IGhhdmUgdG8gYmUgcmVwZWF0ZWQgbi10aW1lczsgZXRjLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6UHJvY2VzcyI+Ci0JCQkJPHhzZDpjaG9pY2UgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJCYXNlUHJvY2VzcyIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCTwveHNkOmNob2ljZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJQcm9jZXNzUGFja2FnZSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpYWwgTWV0aG9kIFBhY2thZ2UgdGhhdCBjb250YWlucyBQcm9jZXNzIEVsZW1lbnRzLCBvbmx5LgotQSBrZXkgc2VwYXJhdGlvbiBvZiBjb25jZXJucyBpbiBVTUEgaXMgdGhlIGRpc3RpbmN0aW9uIGJldHdlZW4gTWV0aG9kIENvbnRlbnQgYW5kIFByb2Nlc3MuICBUaGlzIHNlcGFyYXRpb24gaXMgZW5mb3JjZWQgYnkgc3BlY2lhbCBwYWNrYWdlIHR5cGVzLCB3aGljaCBkbyBub3QgYWxsb3cgdGhlIG1peGluZyBvZiBtZXRob2QgY29udGVudCB3aXRoIHByb2Nlc3Nlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOk1ldGhvZFBhY2thZ2UiPgotCQkJCTx4c2Q6Y2hvaWNlIG1heE9jY3Vycz0idW5ib3VuZGVkIiBtaW5PY2N1cnM9IjAiPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUHJvY2Vzc0VsZW1lbnQiIHR5cGU9InVtYTpQcm9jZXNzRWxlbWVudCIvPgotCQkJCTwveHNkOmNob2ljZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkNvbXByaXNlcyBvZiBhIGxpc3Qgb2YgaW50ZXJmYWNlIHNwZWNpZmljYXRpb25zIChzaW1pbGFyIHRvIG9wZXJhdGlvbiBkZWNsYXJhdGlvbnMpIHRoYXQgZXhwcmVzcyBpbnB1dHMgYW5kIG91dHB1dHMgZm9yIGEgcHJvY2VzcyBjb21wb25lbnQuICBUaGVzZSBpbnRlcmZhY2Ugc3BlY2lmaWNhdGlvbnMgYXJlIGV4cHJlc3NlZCB1c2luZyBUYXNrIERlc2NyaXB0b3JzIHdoaWNoIGFyZSBub3QgbGlua2VkIHRvIFRhc2tzIHRoYXQgYXJlIHJlbGF0ZWQgdG8gV29yayBQcm9kdWN0IERlc2NyaXB0b3JzIGFzIHdlbGwgYXMgb3B0aW9uYWwgYSBSb2xlIERlc2NyaXB0b3IuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpCcmVha2Rvd25FbGVtZW50Ij4KLQkJCQk8eHNkOmNob2ljZSBtYXhPY2N1cnM9InVuYm91bmRlZCIgbWluT2NjdXJzPSIwIj4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkludGVyZmFjZVNwZWNpZmljYXRpb24iIHR5cGU9InVtYTpUYXNrRGVzY3JpcHRvciIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iSW50ZXJmYWNlSU8iIHR5cGU9InVtYTpXb3JrUHJvZHVjdERlc2NyaXB0b3IiLz4KLQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUHJvY2Vzc0NvbXBvbmVudCI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpYWwgUHJvY2VzcyBQYWNrYWdlIHRoYXQgYXBwbGllcyB0aGUgcHJpbmNpcGxlcyBvZiBlbmNhcHN1bGF0aW9uLiAgQSBQcm9jZXNzIENvbXBvbmVudCByZWFsaXplcyBvbmUgb3IgbW9yZSBJbnRlcmZhY2VzIHdoaWNoIHNwZWNpZnkgaW5wdXRzIGFuZCBvdXRwdXRzIG9mIHRoZSBjb21wb25lbnQuIFRoZXJlIG1pZ2h0IGJlIG1hbnkgY29tcG9uZW50cyByZWFsaXppbmcgdGhlIHNhbWUgaW50ZXJmYWNlcywgYnV0IHVzaW5nIGRpZmZlcmVudCB0ZWNobmlxdWVzIHRvIGFjaGlldmUgc2ltaWxhciBvdXRwdXRzIGZvciBzaW1pbGFyIGlucHV0cy4gIFdoZXJlYXMgdGhlIENvbXBvbmVudCBJbnRlcmZhY2VzIHJlcHJlc2VudCBjb21wb25lbnQgc3BlY2lmaWNhdGlvbnMgKGJsYWNrIGJveCBkZXNjcmlwdGlvbnMgb2YgdGhlIGNvbXBvbmVudCksIGdvb2QgY2FuZGlkYXRlcyBmb3IgY29tcG9uZW50IHJlYWxpemF0aW9ucyBjYW4gYmUgZm91bmQgaW4gQ2FwYWJpbGl0eSBQYXR0ZXJucyAod2hpdGUgYm94IGRlc2NyaXB0aW9ucyBmb3IgdGhlIGNvbXBvbmVudCkuCi1VTUEgc3VwcG9ydHMgcmVwbGFjZWFibGUgYW5kIHJldXNhYmxlIFByb2Nlc3MgQ29tcG9uZW50cyByZWFsaXppbmcgdGhlIHByaW5jaXBsZXMgb2YgZW5jYXBzdWxhdGlvbi4gQ2VydGFpbiBzaXR1YXRpb25zIGluIGEgc29mdHdhcmUgZGV2ZWxvcG1lbnQgcHJvamVjdCBtaWdodCByZXF1aXJlIHRoYXQgY29uY3JldGUgcmVhbGl6YXRpb25zIG9mIHBhcnRzIG9mIHRoZSBwcm9jZXNzIHJlbWFpbiB1bmRlY2lkZWQgb3Igd2lsbCBiZSBkZWNpZGVkIGJ5IHRoZSBleGVjdXRpbmcgdGVhbSBpdHNlbGYgKGUuZy4gaW4gb3V0c291cmNpbmcgc2l0dWF0aW9ucykuICBVTUEgcHJvdmlkZXMgYSB1bmlxdWUgY29tcG9uZW50IGNvbmNlcHQgZGVmaW5pbmcgaW50ZXJmYWNlcyBmb3Igd29yayBwcm9kdWN0IGlucHV0IGFuZCBvdXRwdXQsIGFsbG93aW5nIHRyZWF0aW5nIHRoZSBhY3R1YWwgZGVmaW5pdGlvbiBvZiB0aGUgd29yayB0aGF0IHByb2R1Y2VzIHRoZSBvdXRwdXRzIGFzIGEgImJsYWNrIGJveCIuICBBdCBhbnkgcG9pbnQgZHVyaW5nIGEgcHJvamVjdCB0aGUgY29tcG9uZW50ICJyZWFsaXphdGlvbiIgZGV0YWlsaW5nIHRoZSB3b3JrIGNhbiBiZSBhZGRlZCB0byB0aGUgcHJvY2Vzcy4gIFRoZSBjb21wb25lbnQgYXBwcm9hY2ggYWxzbyBhbGxvd3MgdGhhdCBkaWZmZXJlbnQgc3R5bGVzIG9yIHRlY2huaXF1ZXMgb2YgZG9pbmcgd29yayBjYW4gYmUgcmVwbGFjZWQgd2l0aCBvbmUgYW5vdGhlci4gIEZvciBleGFtcGxlLCBhIHNvZnR3YXJlIGNvZGUgb3V0cHV0IG9mIGEgY29tcG9uZW50IGNvdWxkIGJlIHByb2R1Y2VkIHdpdGggYSBtb2RlbC1kcml2ZW4gZGV2ZWxvcG1lbnQgb3IgYSBjb2RlLWNlbnRyaWMgdGVjaG5pcXVlLiAgVGhlIGNvbXBvbmVudCBjb25jZXB0IGVuY2Fwc3VsYXRlcyB0aGUgYWN0dWFsIHdvcmsgYW5kIGxldHMgdGhlIGRldmVsb3BtZW50IHRlYW0gY2hvb3NlIHRoZSBhcHByb3ByaWF0ZSB0ZWNobmlxdWUgYW5kIGZpbGwgdGhlIGNvbXBvbmVudCdzIHJlYWxpemF0aW9uIHdpdGggdGhlaXIgY2hvaWNlIG9mIEFjdGl2aXRpZXMgdGhhdCBwcm9kdWNlIHRoZSByZXF1aXJlZCBvdXRwdXRzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6UHJvY2Vzc1BhY2thZ2UiPgotCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkNvcHlyaWdodCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJJbnRlcmZhY2UiIHR5cGU9InVtYTpQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJQcm9jZXNzIiB0eXBlPSJ1bWE6UHJvY2VzcyIvPgotCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImF1dGhvcnMiIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+RXZlcnkgTWV0aG9kIFVuaXQgaXMgYmVpbmcgY3JlYXRlZCBhbmQgb3duZWQgYnkgYW4gYXV0aG9yIG9yIGF1dGhvcmluZyB0ZWFtLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImNoYW5nZURhdGUiIHR5cGU9InhzZDpkYXRlVGltZSI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZGF0ZSB0aGUgbGFzdCBjaGFuZ2UgdGhhdCByZXN1bHRlZCBpbnRvIHRoaXMgdmVyc2lvbiBoYXMgYmVlbiBtYWRlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImNoYW5nZURlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgbGFzdCBjaGFuZ2UgdGhhdCByZXN1bHRlZCBpbnRvIHRoaXMgdmVyc2lvbi48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ2ZXJzaW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkV2ZXJ5IFBhY2thZ2UgaGFzIGEgdmVyc2lvbiBudW1iZXIgdXNlZCB0byB0cmFjayBjaGFuZ2VzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ik1ldGhvZFBsdWdpbiI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpYWwgTWV0aG9kIFVuaXQgdGhhdCByZXByZXNlbnRzIGEgcGh5c2ljYWwgY29udGFpbmVyIGZvciBNZXRob2QgUGFja2FnZXMuICBJdCBkZWZpbmVzIGEgZ3JhbnVsYXJpdHkgbGV2ZWwgZm9yIHRoZSBtb2R1bGFyaXphdGlvbiBhbmQgb3JnYW5pemF0aW9uIG9mIG1ldGhvZCBjb250ZW50IGFuZCBwcm9jZXNzZXMuICBBIE1ldGhvZCBQbHVnaW4gY2FuIGV4dGVuZCBtYW55IG90aGVyIE1ldGhvZCBQbHVnaW5zIGFuZCBpdCBjYW4gYmUgZXh0ZW5kZWQgYnkgbWFueSBNZXRob2QgUGx1Z2lucy4gIEl0IGNhbiBhbHNvIGJlIHVzZWQgc3RhbmQtYWxvbmUsIGkuZS4gd2l0aCBubyBFeHRlbnNpb24gcmVsYXRpb25zaGlwIHRvIG90aGVyIHBsdWctaW5zLgotTWV0aG9kIFBsdWdpbiBjb25jZXB0dWFsbHkgcmVwcmVzZW50cyBhIHVuaXQgZm9yIGNvbmZpZ3VyYXRpb24sIG1vZHVsYXJpemF0aW9uLCBleHRlbnNpb24sIHBhY2thZ2luZywgYW5kIGRlcGxveW1lbnQgb2YgbWV0aG9kIGNvbnRlbnQgYW5kIHByb2Nlc3Nlcy4gIEEgUHJvY2VzcyBFbmdpbmVlciBzaGFsbCBkZXNpZ24gaGlzIFBsdWdpbnMgYW5kIGFsbG9jYXRlIGhpcyBjb250ZW50IHRvIHRoZXNlIFBsdWdpbnMgd2l0aCByZXF1aXJlbWVudHMgZm9yIGV4dGVuc2liaWxpdHksIG1vZHVsYXJpdHksIHJldXNlLCBhbmQgbWFpbnRhaW5hYmlsaXR5IGluIG1pbmQuCi1TcGVjaWFsIGV4dGVuc2liaWxpdHkgbWVjaGFuaXNtcyBkZWZpbmVkIGZvciB0aGUgbWV0YS1jbGFzc2VzIFZhcmlhYmlsaXR5IEVsZW1lbnQgYW5kIFByb2Nlc3MgQ29udHJpYnV0aW9uIGFsbG93IFBsdWdpbiBjb250ZW50IHRvIGRpcmVjdGx5IGNvbnRyaWJ1dGUgbmV3IGNvbnRlbnQsIHJlcGxhY2UgZXhpc3RpbmcgY29udGVudCwgb3IgdG8gY3Jvc3MtcmVmZXJlbmNlIHRvIGFueSBDb250ZW50IEVsZW1lbnQgb3IgUHJvY2VzcyB3aXRoaW4gYW5vdGhlciBQbHVnaW4gdGhhdCBpdCBleHRlbmRzLiAgU2ltaWxhciB0byBVTUwgMi4wJ3MgJ3BhY2thZ2UgbWVyZ2UnIG1lY2hhbmlzbSB0cmFuc2Zvcm1hdGlvbiBpbnRlcnByZXRhdGlvbnMsIGludGVycHJldGluZyB0aGVzZSBNZXRob2QgUGx1Z2luIG1lY2hhbmlzbXMgcmVzdWx0cyBpbnRvIG5ldyBleHRlbmRlZCBNZXRob2QgQ29udGVudCBhbmQgUHJvY2Vzc2VzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6TWV0aG9kVW5pdCI+Ci0JCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJPHhzZDplbGVtZW50IG1heE9jY3Vycz0idW5ib3VuZGVkIiBtaW5PY2N1cnM9IjAiIG5hbWU9IlJlZmVyZW5jZWRNZXRob2RQbHVnaW4iIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJPHhzZDplbGVtZW50IG1heE9jY3Vycz0idW5ib3VuZGVkIiBtaW5PY2N1cnM9IjAiIG5hbWU9Ik1ldGhvZFBhY2thZ2UiIHR5cGU9InVtYTpNZXRob2RQYWNrYWdlIi8+Ci0JCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0idXNlckNoYW5nZWFibGUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6ZWxlbWVudCBuYW1lPSJNZXRob2RQbHVnaW4iIHR5cGU9InVtYTpNZXRob2RQbHVnaW4iPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWFsIE1ldGhvZCBVbml0IHRoYXQgcmVwcmVzZW50cyBhIHBoeXNpY2FsIGNvbnRhaW5lciBmb3IgTWV0aG9kIFBhY2thZ2VzLiAgSXQgZGVmaW5lcyBhIGdyYW51bGFyaXR5IGxldmVsIGZvciB0aGUgbW9kdWxhcml6YXRpb24gYW5kIG9yZ2FuaXphdGlvbiBvZiBtZXRob2QgY29udGVudCBhbmQgcHJvY2Vzc2VzLiAgQSBNZXRob2QgUGx1Z2luIGNhbiBleHRlbmQgbWFueSBvdGhlciBNZXRob2QgUGx1Z2lucyBhbmQgaXQgY2FuIGJlIGV4dGVuZGVkIGJ5IG1hbnkgTWV0aG9kIFBsdWdpbnMuICBJdCBjYW4gYWxzbyBiZSB1c2VkIHN0YW5kLWFsb25lLCBpLmUuIHdpdGggbm8gRXh0ZW5zaW9uIHJlbGF0aW9uc2hpcCB0byBvdGhlciBwbHVnLWlucy4KLU1ldGhvZCBQbHVnaW4gY29uY2VwdHVhbGx5IHJlcHJlc2VudHMgYSB1bml0IGZvciBjb25maWd1cmF0aW9uLCBtb2R1bGFyaXphdGlvbiwgZXh0ZW5zaW9uLCBwYWNrYWdpbmcsIGFuZCBkZXBsb3ltZW50IG9mIG1ldGhvZCBjb250ZW50IGFuZCBwcm9jZXNzZXMuICBBIFByb2Nlc3MgRW5naW5lZXIgc2hhbGwgZGVzaWduIGhpcyBQbHVnaW5zIGFuZCBhbGxvY2F0ZSBoaXMgY29udGVudCB0byB0aGVzZSBQbHVnaW5zIHdpdGggcmVxdWlyZW1lbnRzIGZvciBleHRlbnNpYmlsaXR5LCBtb2R1bGFyaXR5LCByZXVzZSwgYW5kIG1haW50YWluYWJpbGl0eSBpbiBtaW5kLgotU3BlY2lhbCBleHRlbnNpYmlsaXR5IG1lY2hhbmlzbXMgZGVmaW5lZCBmb3IgdGhlIG1ldGEtY2xhc3NlcyBWYXJpYWJpbGl0eSBFbGVtZW50IGFuZCBQcm9jZXNzIENvbnRyaWJ1dGlvbiBhbGxvdyBQbHVnaW4gY29udGVudCB0byBkaXJlY3RseSBjb250cmlidXRlIG5ldyBjb250ZW50LCByZXBsYWNlIGV4aXN0aW5nIGNvbnRlbnQsIG9yIHRvIGNyb3NzLXJlZmVyZW5jZSB0byBhbnkgQ29udGVudCBFbGVtZW50IG9yIFByb2Nlc3Mgd2l0aGluIGFub3RoZXIgUGx1Z2luIHRoYXQgaXQgZXh0ZW5kcy4gIFNpbWlsYXIgdG8gVU1MIDIuMCdzICdwYWNrYWdlIG1lcmdlJyBtZWNoYW5pc20gdHJhbnNmb3JtYXRpb24gaW50ZXJwcmV0YXRpb25zLCBpbnRlcnByZXRpbmcgdGhlc2UgTWV0aG9kIFBsdWdpbiBtZWNoYW5pc21zIHJlc3VsdHMgaW50byBuZXcgZXh0ZW5kZWQgTWV0aG9kIENvbnRlbnQgYW5kIFByb2Nlc3Nlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCTwveHNkOmVsZW1lbnQ+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJNZXRob2RDb25maWd1cmF0aW9uIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgY29sbGVjdGlvbiBvZiBzZWxlY3RlZCBNZXRob2QgTW9kZWxzIGFuZCBNZXRob2RQYWNrYWdlcy4gQSBjb25maWd1cmF0aW9uIGNhbiBiZSBleHBvcnRlZCBpbnRvIGl0cyBvd24gc3RhbmRhbG9uZSBsaWJyYXJ5IHdoZW4gaXQgaW5jbHVkZXMgdGhlIGZ1bGwgdHJhbnNpdGl2ZSBjbG9zdXJlIG9mIGFsbCBlbGVtZW50cyBhbGwgb3RoZXIgZWxlbWVudHMgZGVwZW5kIG9uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6TWV0aG9kVW5pdCI+Ci0JCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJPHhzZDplbGVtZW50IG1heE9jY3Vycz0idW5ib3VuZGVkIiBtaW5PY2N1cnM9IjAiIG5hbWU9IkJhc2VDb25maWd1cmF0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBtYXhPY2N1cnM9InVuYm91bmRlZCIgbWluT2NjdXJzPSIwIiBuYW1lPSJNZXRob2RQbHVnaW5TZWxlY3Rpb24iIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJPHhzZDplbGVtZW50IG1heE9jY3Vycz0idW5ib3VuZGVkIiBtaW5PY2N1cnM9IjAiIG5hbWU9Ik1ldGhvZFBhY2thZ2VTZWxlY3Rpb24iIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iRGVmYXVsdFZpZXciIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJPHhzZDplbGVtZW50IG1heE9jY3Vycz0idW5ib3VuZGVkIiBtaW5PY2N1cnM9IjAiIG5hbWU9IlByb2Nlc3NWaWV3IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6ZWxlbWVudCBuYW1lPSJNZXRob2RDb25maWd1cmF0aW9uIiB0eXBlPSJ1bWE6TWV0aG9kQ29uZmlndXJhdGlvbiI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIGNvbGxlY3Rpb24gb2Ygc2VsZWN0ZWQgTWV0aG9kIE1vZGVscyBhbmQgTWV0aG9kUGFja2FnZXMuIEEgY29uZmlndXJhdGlvbiBjYW4gYmUgZXhwb3J0ZWQgaW50byBpdHMgb3duIHN0YW5kYWxvbmUgbGlicmFyeSB3aGVuIGl0IGluY2x1ZGVzIHRoZSBmdWxsIHRyYW5zaXRpdmUgY2xvc3VyZSBvZiBhbGwgZWxlbWVudHMgYWxsIG90aGVyIGVsZW1lbnRzIGRlcGVuZCBvbi48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCTwveHNkOmVsZW1lbnQ+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJNZXRob2RMaWJyYXJ5Ij4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgTWV0aG9kIExpYnJhcnkgaXMgYSBwaHlzaWNhbCBjb250YWluZXIgZm9yIE1ldGhvZCBQbHVnaW5zIGFuZCBNZXRob2QgQ29uZmlndXJhdGlvbiBkZWZpbml0aW9ucy4gIEFsbCBNZXRob2QgRWxlbWVudHMgYXJlIHN0b3JlZCBpbiBhIE1ldGhvZCBMaWJyYXJ5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6TWV0aG9kVW5pdCI+Ci0JCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJPHhzZDplbGVtZW50IG1heE9jY3Vycz0idW5ib3VuZGVkIiBtaW5PY2N1cnM9IjAiIG5hbWU9Ik1ldGhvZFBsdWdpbiIgdHlwZT0idW1hOk1ldGhvZFBsdWdpbiIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG1pbk9jY3Vycz0iMCIgbmFtZT0iTWV0aG9kQ29uZmlndXJhdGlvbiIgdHlwZT0idW1hOk1ldGhvZENvbmZpZ3VyYXRpb24iLz4KLQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDplbGVtZW50IG5hbWU9Ik1ldGhvZExpYnJhcnkiIHR5cGU9InVtYTpNZXRob2RMaWJyYXJ5Ij4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgTWV0aG9kIExpYnJhcnkgaXMgYSBwaHlzaWNhbCBjb250YWluZXIgZm9yIE1ldGhvZCBQbHVnaW5zIGFuZCBNZXRob2QgQ29uZmlndXJhdGlvbiBkZWZpbml0aW9ucy4gIEFsbCBNZXRob2QgRWxlbWVudHMgYXJlIHN0b3JlZCBpbiBhIE1ldGhvZCBMaWJyYXJ5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JPC94c2Q6ZWxlbWVudD4KLTwveHNkOnNjaGVtYT4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9BY3Rpdml0eS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0FjdGl2aXR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhMGE1Y2IuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0FjdGl2aXR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODUgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBBY3Rpdml0eS5qYXZhLHYgMS4yIDIwMDgvMDEvMzAgMDA6NDE6NDgga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXA7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkFjdGl2aXR5PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQSBXb3JrIEJyZWFrZG93biBFbGVtZW50IGFuZCBXb3JrIERlZmluaXRpb24gd2hpY2ggc3VwcG9ydHMgdGhlIG5lc3RpbmcgYW5kIGxvZ2ljYWwgZ3JvdXBpbmcgb2YgcmVsYXRlZCBCcmVha2Rvd24gRWxlbWVudHMgZm9ybWluZyBicmVha2Rvd24gc3RydWN0dXJlcy4gIEFsdGhvdWdoIEFjdGl2aXR5IGlzIGEgY29uY3JldGUgbWV0YS1jbGFzcywgb3RoZXIgY2xhc3NlcyB3aGljaCByZXByZXNlbnQgYnJlYWtkb3duIHN0cnVjdHVyZXMgZGVyaXZlIGZyb20gaXQ7IHN1Y2ggYXMgUGhhc2UsIEl0ZXJhdGlvbiwgRGVsaXZlcnkgUHJvY2Vzcywgb3IgQ2FwYWJpbGl0eSBQYXR0ZXJuLgotICogQWN0aXZpdHkgcmVwcmVzZW50cyBhIGdyb3VwaW5nIGVsZW1lbnQgZm9yIG90aGVyIEJyZWFrZG93biBFbGVtZW50cyBzdWNoIGFzIEFjdGl2aXRpZXMsIERlc2NyaXB0b3JzLCBNaWxlc3RvbmVzLCBldGMuICBJdCBpcyBub3QgcGVyLXNlIGEgJ2hpZ2gtbGV2ZWwnIGdyb3VwaW5nIG9mIG9ubHkgd29yayBhcyBpbiBvdGhlciBtZXRhLW1vZGVscywgYnV0IGdyb3VwcyBhbnkga2luZCBvZiBCcmVha2Rvd24gRWxlbWVudHMuICBGb3IgZXhhbXBsZSwgb25lIGNhbiBkZWZpbmUgdmFsaWQgQWN0aXZpdGllcyB0aGF0IGdyb3VwIG9ubHkgV29yayBQcm9kdWN0cyBEZXNjcmlwdG9ycyB3aXRob3V0IGFueSBtYXRjaGluZyBUYXNrIERlc2NyaXB0b3JzLiAgQWN0aXZpdGllcyBhbHNvIGluaGVyaXQgYWxsIHByb3BlcnRpZXMgZnJvbSBXb3JrIEJyZWFrZG93biBFbGVtZW50IGFuZCBpbmRpcmVjdGx5IGZyb20gUHJvY2VzcyBFbGVtZW50OyBpLmUuIEFjdGl2aXR5IGlzIHJlYWR5IHRvIGhhdmUgYSBmdWxsIGNvbnRlbnQgZGVzY3JpcHRpb24gYXR0YWNoZWQgdG8gaXQuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQWN0aXZpdHkjZ2V0UHJlY29uZGl0aW9uIDxlbT5QcmVjb25kaXRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFjdGl2aXR5I2dldFBvc3Rjb25kaXRpb24gPGVtPlBvc3Rjb25kaXRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFjdGl2aXR5I2dldEdyb3VwMyA8ZW0+R3JvdXAzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5BY3Rpdml0eSNnZXRCcmVha2Rvd25FbGVtZW50IDxlbT5CcmVha2Rvd24gRWxlbWVudDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQWN0aXZpdHkjZ2V0Um9hZG1hcCA8ZW0+Um9hZG1hcDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQWN0aXZpdHkjaXNJc0VuYWN0YWJsZSA8ZW0+SXMgRW5hY3RhYmxlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5BY3Rpdml0eSNnZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50IDxlbT5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5BY3Rpdml0eSNnZXRWYXJpYWJpbGl0eVR5cGUgPGVtPlZhcmlhYmlsaXR5IFR5cGU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0QWN0aXZpdHkoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J0FjdGl2aXR5JyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQWN0aXZpdHkgZXh0ZW5kcyBXb3JrQnJlYWtkb3duRWxlbWVudCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UHJlY29uZGl0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5QcmVjb25kaXRpb248L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UHJlY29uZGl0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRQcmVjb25kaXRpb24oU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRBY3Rpdml0eV9QcmVjb25kaXRpb24oKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nUHJlY29uZGl0aW9uJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFByZWNvbmRpdGlvbigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQWN0aXZpdHkjZ2V0UHJlY29uZGl0aW9uIDxlbT5QcmVjb25kaXRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlByZWNvbmRpdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UHJlY29uZGl0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRQcmVjb25kaXRpb24oU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlBvc3Rjb25kaXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlBvc3Rjb25kaXRpb248L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UG9zdGNvbmRpdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UG9zdGNvbmRpdGlvbihTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldEFjdGl2aXR5X1Bvc3Rjb25kaXRpb24oKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nUG9zdGNvbmRpdGlvbiciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRQb3N0Y29uZGl0aW9uKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5BY3Rpdml0eSNnZXRQb3N0Y29uZGl0aW9uIDxlbT5Qb3N0Y29uZGl0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Qb3N0Y29uZGl0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRQb3N0Y29uZGl0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRQb3N0Y29uZGl0aW9uKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Hcm91cDM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwLkVudHJ5fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkdyb3VwMzwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkdyb3VwMzwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0QWN0aXZpdHlfR3JvdXAzKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRmVhdHVyZU1hcEVudHJ5IiBtYW55PSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdncm91cCcgbmFtZT0nZ3JvdXA6MzcnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlGZWF0dXJlTWFwIGdldEdyb3VwMygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QnJlYWtkb3duIEVsZW1lbnQ8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5CcmVha2Rvd25FbGVtZW50fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkJyZWFrZG93biBFbGVtZW50PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QnJlYWtkb3duIEVsZW1lbnQ8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldEFjdGl2aXR5X0JyZWFrZG93bkVsZW1lbnQoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQnJlYWtkb3duRWxlbWVudCcgZ3JvdXA9JyNncm91cDozNyciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0PEJyZWFrZG93bkVsZW1lbnQ+IGdldEJyZWFrZG93bkVsZW1lbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJvYWRtYXA8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlJvYWRtYXA8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Sb2FkbWFwPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRBY3Rpdml0eV9Sb2FkbWFwKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciIHRyYW5zaWVudD0idHJ1ZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1JvYWRtYXAnIGdyb3VwPScjZ3JvdXA6MzcnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdDxTdHJpbmc+IGdldFJvYWRtYXAoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPklzIEVuYWN0YWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SXMgRW5hY3RhYmxlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPklzIEVuYWN0YWJsZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRJc0VuYWN0YWJsZSgpCi0JICogQHNlZSAjdW5zZXRJc0VuYWN0YWJsZSgpCi0JICogQHNlZSAjc2V0SXNFbmFjdGFibGUoYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0QWN0aXZpdHlfSXNFbmFjdGFibGUoKQotCSAqIEBtb2RlbCB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW4iCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2F0dHJpYnV0ZScgbmFtZT0nSXNFbmFjdGFibGUnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzSXNFbmFjdGFibGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFjdGl2aXR5I2lzSXNFbmFjdGFibGUgPGVtPklzIEVuYWN0YWJsZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SXMgRW5hY3RhYmxlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldElzRW5hY3RhYmxlKCkKLQkgKiBAc2VlICN1bnNldElzRW5hY3RhYmxlKCkKLQkgKiBAc2VlICNpc0lzRW5hY3RhYmxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRJc0VuYWN0YWJsZShib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQWN0aXZpdHkjaXNJc0VuYWN0YWJsZSA8ZW0+SXMgRW5hY3RhYmxlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldElzRW5hY3RhYmxlKCkKLQkgKiBAc2VlICNpc0lzRW5hY3RhYmxlKCkKLQkgKiBAc2VlICNzZXRJc0VuYWN0YWJsZShib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0SXNFbmFjdGFibGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQWN0aXZpdHkjaXNJc0VuYWN0YWJsZSA8ZW0+SXMgRW5hY3RhYmxlPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JcyBFbmFjdGFibGU8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldElzRW5hY3RhYmxlKCkKLQkgKiBAc2VlICNpc0lzRW5hY3RhYmxlKCkKLQkgKiBAc2VlICNzZXRJc0VuYWN0YWJsZShib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0SXNFbmFjdGFibGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldEFjdGl2aXR5X1ZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nYXR0cmlidXRlJyBuYW1lPSd2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50JyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFjdGl2aXR5I2dldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQgPGVtPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4ibmEiPC9jb2RlPi4KLQkgKiBUaGUgbGl0ZXJhbHMgYXJlIGZyb20gdGhlIGVudW1lcmF0aW9uIHtAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5WYXJpYWJpbGl0eVR5cGV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VmFyaWFiaWxpdHkgVHlwZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5WYXJpYWJpbGl0eSBUeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlZhcmlhYmlsaXR5VHlwZQotCSAqIEBzZWUgI2lzU2V0VmFyaWFiaWxpdHlUeXBlKCkKLQkgKiBAc2VlICN1bnNldFZhcmlhYmlsaXR5VHlwZSgpCi0JICogQHNlZSAjc2V0VmFyaWFiaWxpdHlUeXBlKFZhcmlhYmlsaXR5VHlwZSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0QWN0aXZpdHlfVmFyaWFiaWxpdHlUeXBlKCkKLQkgKiBAbW9kZWwgZGVmYXVsdD0ibmEiIHVuc2V0dGFibGU9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2F0dHJpYnV0ZScgbmFtZT0ndmFyaWFiaWxpdHlUeXBlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JVmFyaWFiaWxpdHlUeXBlIGdldFZhcmlhYmlsaXR5VHlwZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQWN0aXZpdHkjZ2V0VmFyaWFiaWxpdHlUeXBlIDxlbT5WYXJpYWJpbGl0eSBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5WYXJpYWJpbGl0eSBUeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlZhcmlhYmlsaXR5VHlwZQotCSAqIEBzZWUgI2lzU2V0VmFyaWFiaWxpdHlUeXBlKCkKLQkgKiBAc2VlICN1bnNldFZhcmlhYmlsaXR5VHlwZSgpCi0JICogQHNlZSAjZ2V0VmFyaWFiaWxpdHlUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRWYXJpYWJpbGl0eVR5cGUoVmFyaWFiaWxpdHlUeXBlIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQWN0aXZpdHkjZ2V0VmFyaWFiaWxpdHlUeXBlIDxlbT5WYXJpYWJpbGl0eSBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldFZhcmlhYmlsaXR5VHlwZSgpCi0JICogQHNlZSAjZ2V0VmFyaWFiaWxpdHlUeXBlKCkKLQkgKiBAc2VlICNzZXRWYXJpYWJpbGl0eVR5cGUoVmFyaWFiaWxpdHlUeXBlKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0VmFyaWFiaWxpdHlUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFjdGl2aXR5I2dldFZhcmlhYmlsaXR5VHlwZSA8ZW0+VmFyaWFiaWxpdHkgVHlwZTwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VmFyaWFiaWxpdHkgVHlwZTwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0VmFyaWFiaWxpdHlUeXBlKCkKLQkgKiBAc2VlICNnZXRWYXJpYWJpbGl0eVR5cGUoKQotCSAqIEBzZWUgI3NldFZhcmlhYmlsaXR5VHlwZShWYXJpYWJpbGl0eVR5cGUpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRWYXJpYWJpbGl0eVR5cGUoKTsKLQotfSAvLyBBY3Rpdml0eQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9BY3Rpdml0eURlc2NyaXB0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvQWN0aXZpdHlEZXNjcmlwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOWMzOTE3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9BY3Rpdml0eURlc2NyaXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTEgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBBY3Rpdml0eURlc2NyaXB0aW9uLmphdmEsdiAxLjIgMjAwOC8wMS8zMCAwMDo0MTo0OCBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWE7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+QWN0aXZpdHkgRGVzY3JpcHRpb248L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIGdlbmVyYWxpemVkIEJyZWFrZG93biBFbGVtZW50IERlc2NyaXB0aW9uIHRoYXQgaXMgdXNlZCB0byBzdG9yZSB0aGUgdGV4dHVhbCBkZXNjcmlwdGlvbiBmb3IgYW4gQWN0aXZpdHkuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQWN0aXZpdHlEZXNjcmlwdGlvbiNnZXRBbHRlcm5hdGl2ZXMgPGVtPkFsdGVybmF0aXZlczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQWN0aXZpdHlEZXNjcmlwdGlvbiNnZXRIb3dUb1N0YWZmIDxlbT5Ib3cgVG8gU3RhZmY8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFjdGl2aXR5RGVzY3JpcHRpb24jZ2V0UHVycG9zZSA8ZW0+UHVycG9zZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRBY3Rpdml0eURlc2NyaXB0aW9uKCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdBY3Rpdml0eURlc2NyaXB0aW9uJyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQWN0aXZpdHlEZXNjcmlwdGlvbiBleHRlbmRzIEJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbiB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QWx0ZXJuYXRpdmVzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBDb21wcmlzZXMgb2Ygc3VtbWFyaWVzIGRlc2NyaWJpbmcgaW1wb3J0YW50IGV4Y2VwdGlvbmFsIGFuZCBub24tc3RhbmRhcmQgd2F5cyBvZiBkb2luZyB0aGUgd29yayBvZiB0aGlzIEFjdGl2aXR5IG5vdCBjb3ZlcmVkIGJ5IHRoZSBBY3Rpdml0eSdzIFRhc2tzLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BbHRlcm5hdGl2ZXM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEFsdGVybmF0aXZlcyhTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldEFjdGl2aXR5RGVzY3JpcHRpb25fQWx0ZXJuYXRpdmVzKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0FsdGVybmF0aXZlcyciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRBbHRlcm5hdGl2ZXMoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFjdGl2aXR5RGVzY3JpcHRpb24jZ2V0QWx0ZXJuYXRpdmVzIDxlbT5BbHRlcm5hdGl2ZXM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkFsdGVybmF0aXZlczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0QWx0ZXJuYXRpdmVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRBbHRlcm5hdGl2ZXMoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkhvdyBUbyBTdGFmZjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogUHJvdmlkZXMgYmFja2dyb3VuZCBvbiB3aG8gc2hvdWxkIGJlIGludm9sdmVkIGluIHRoaXMgYWN0aXZpdHkgd2hhdCBhcmUgdGhlIHJlcXVpcmVkIHNraWxscywgZXhwZXJpZW5jZSwgIGFuZCBwZXJoYXBzIGF0dGl0dWRlcy4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SG93IFRvIFN0YWZmPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRIb3dUb1N0YWZmKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0QWN0aXZpdHlEZXNjcmlwdGlvbl9Ib3dUb1N0YWZmKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0hvd1RvU3RhZmYnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0SG93VG9TdGFmZigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQWN0aXZpdHlEZXNjcmlwdGlvbiNnZXRIb3dUb1N0YWZmIDxlbT5Ib3cgVG8gU3RhZmY8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkhvdyBUbyBTdGFmZjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0SG93VG9TdGFmZigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0SG93VG9TdGFmZihTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UHVycG9zZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogU3VtbWFyaXplcyB0aGUgbWFpbiByZWFzb24gZm9yIHBlcmZvcm1pbmcgdGhpcyBBY3Rpdml0eSwgZGVzY3JpYmVzIHdoYXQgdGhlIGFjdGl2aXR5IGFzIGEgd2hvbGUgaXMgaW50ZW5kZWQgdG8gYWNoaWV2ZS4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UHVycG9zZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UHVycG9zZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldEFjdGl2aXR5RGVzY3JpcHRpb25fUHVycG9zZSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdQdXJwb3NlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFB1cnBvc2UoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFjdGl2aXR5RGVzY3JpcHRpb24jZ2V0UHVycG9zZSA8ZW0+UHVycG9zZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UHVycG9zZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UHVycG9zZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UHVycG9zZShTdHJpbmcgdmFsdWUpOwotCi19IC8vIEFjdGl2aXR5RGVzY3JpcHRpb24KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvQXBwbGljYWJsZU1ldGFDbGFzc0luZm8uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9BcHBsaWNhYmxlTWV0YUNsYXNzSW5mby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ODJiNTkzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9BcHBsaWNhYmxlTWV0YUNsYXNzSW5mby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBBcHBsaWNhYmxlTWV0YUNsYXNzSW5mby5qYXZhLHYgMS4xIDIwMDgvMDEvMzAgMDA6NDE6NDgga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkFwcGxpY2FibGUgTWV0YSBDbGFzcyBJbmZvPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvI2lzSXNQcmltYXJ5RXh0ZW5zaW9uIDxlbT5JcyBQcmltYXJ5IEV4dGVuc2lvbjwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRBcHBsaWNhYmxlTWV0YUNsYXNzSW5mbygpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nQXBwbGljYWJsZU1ldGFDbGFzc0luZm8nIGtpbmQ9J2VtcHR5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBBcHBsaWNhYmxlTWV0YUNsYXNzSW5mbyBleHRlbmRzIFBhY2thZ2VhYmxlRWxlbWVudCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SXMgUHJpbWFyeSBFeHRlbnNpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPklzIFByaW1hcnkgRXh0ZW5zaW9uPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPklzIFByaW1hcnkgRXh0ZW5zaW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldElzUHJpbWFyeUV4dGVuc2lvbigpCi0JICogQHNlZSAjdW5zZXRJc1ByaW1hcnlFeHRlbnNpb24oKQotCSAqIEBzZWUgI3NldElzUHJpbWFyeUV4dGVuc2lvbihib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRBcHBsaWNhYmxlTWV0YUNsYXNzSW5mb19Jc1ByaW1hcnlFeHRlbnNpb24oKQotCSAqIEBtb2RlbCB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW4iCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2F0dHJpYnV0ZScgbmFtZT0naXNQcmltYXJ5RXh0ZW5zaW9uJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc0lzUHJpbWFyeUV4dGVuc2lvbigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQXBwbGljYWJsZU1ldGFDbGFzc0luZm8jaXNJc1ByaW1hcnlFeHRlbnNpb24gPGVtPklzIFByaW1hcnkgRXh0ZW5zaW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5JcyBQcmltYXJ5IEV4dGVuc2lvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRJc1ByaW1hcnlFeHRlbnNpb24oKQotCSAqIEBzZWUgI3Vuc2V0SXNQcmltYXJ5RXh0ZW5zaW9uKCkKLQkgKiBAc2VlICNpc0lzUHJpbWFyeUV4dGVuc2lvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0SXNQcmltYXJ5RXh0ZW5zaW9uKGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5BcHBsaWNhYmxlTWV0YUNsYXNzSW5mbyNpc0lzUHJpbWFyeUV4dGVuc2lvbiA8ZW0+SXMgUHJpbWFyeSBFeHRlbnNpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0SXNQcmltYXJ5RXh0ZW5zaW9uKCkKLQkgKiBAc2VlICNpc0lzUHJpbWFyeUV4dGVuc2lvbigpCi0JICogQHNlZSAjc2V0SXNQcmltYXJ5RXh0ZW5zaW9uKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRJc1ByaW1hcnlFeHRlbnNpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQXBwbGljYWJsZU1ldGFDbGFzc0luZm8jaXNJc1ByaW1hcnlFeHRlbnNpb24gPGVtPklzIFByaW1hcnkgRXh0ZW5zaW9uPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JcyBQcmltYXJ5IEV4dGVuc2lvbjwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0SXNQcmltYXJ5RXh0ZW5zaW9uKCkKLQkgKiBAc2VlICNpc0lzUHJpbWFyeUV4dGVuc2lvbigpCi0JICogQHNlZSAjc2V0SXNQcmltYXJ5RXh0ZW5zaW9uKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRJc1ByaW1hcnlFeHRlbnNpb24oKTsKLQotfSAvLyBBcHBsaWNhYmxlTWV0YUNsYXNzSW5mbwpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0FydGlmYWN0LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvQXJ0aWZhY3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWJkM2FlNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvQXJ0aWZhY3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogQXJ0aWZhY3QuamF2YSx2IDEuMiAyMDA4LzAxLzMwIDAwOjQxOjQ4IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5BcnRpZmFjdDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEEgV29yayBQcm9kdWN0IHRoYXQgcHJvdmlkZXMgYSBkZXNjcmlwdGlvbiBhbmQgZGVmaW5pdGlvbiBmb3IgdGFuZ2libGUgd29yayBwcm9kdWN0IHR5cGVzLiBBcnRpZmFjdHMgbWF5IGJlIGNvbXBvc2VkIG9mIG90aGVyIGFydGlmYWN0cy4gRm9yIGV4YW1wbGUsIGEgbW9kZWwgYXJ0aWZhY3QgY2FuIGJlIGNvbXBvc2VkIG9mIG1vZGVsIGVsZW1lbnRzLCB3aGljaCBhcmUgYWxzbyBhcnRpZmFjdHMuCi0gKiBBcnRpZmFjdHMgYXJlIHRhbmdpYmxlIHdvcmsgcHJvZHVjdHMgY29uc3VtZWQsIHByb2R1Y2VkLCBvciBtb2RpZmllZCBieSBUYXNrcy4gIEl0IG1heSBzZXJ2ZSBhcyBhIGJhc2lzIGZvciBkZWZpbmluZyByZXVzYWJsZSBhc3NldHMuICBSb2xlcyB1c2UgQXJ0aWZhY3RzIHRvIHBlcmZvcm0gVGFza3MgYW5kIHByb2R1Y2UgQXJ0aWZhY3RzIGluIHRoZSBjb3Vyc2Ugb2YgcGVyZm9ybWluZyBUYXNrcy4gIEFydGlmYWN0cyBhcmUgdGhlIHJlc3BvbnNpYmlsaXR5IG9mIGEgc2luZ2xlIFJvbGUsIG1ha2luZyByZXNwb25zaWJpbGl0eSBlYXN5IHRvIGlkZW50aWZ5IGFuZCB1bmRlcnN0YW5kLCBhbmQgcHJvbW90aW5nIHRoZSBpZGVhIHRoYXQgZXZlcnkgcGllY2Ugb2YgaW5mb3JtYXRpb24gcHJvZHVjZWQgaW4gdGhlIG1ldGhvZCByZXF1aXJlcyB0aGUgYXBwcm9wcmlhdGUgc2V0IG9mIHNraWxscy4gRXZlbiB0aG91Z2ggb25lIHJvbGUgbWlnaHQgIm93biIgYSBzcGVjaWZpYyB0eXBlIG9mIEFydGlmYWN0cywgb3RoZXIgcm9sZXMgY2FuIHN0aWxsIHVzZSB0aGUgQXJ0aWZhY3RzOyBwZXJoYXBzIGV2ZW4gdXBkYXRlIHRoZW0gaWYgdGhlIFJvbGUgaGFzIGJlZW4gZ2l2ZW4gcGVybWlzc2lvbiB0byBkbyBzby4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5BcnRpZmFjdCNnZXRHcm91cDMgPGVtPkdyb3VwMzwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQXJ0aWZhY3QjZ2V0Q29udGFpbmVkQXJ0aWZhY3QgPGVtPkNvbnRhaW5lZCBBcnRpZmFjdDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRBcnRpZmFjdCgpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nQXJ0aWZhY3QnIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBBcnRpZmFjdCBleHRlbmRzIFdvcmtQcm9kdWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Hcm91cDM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwLkVudHJ5fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkdyb3VwMzwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkdyb3VwMzwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0QXJ0aWZhY3RfR3JvdXAzKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRmVhdHVyZU1hcEVudHJ5IiBtYW55PSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdncm91cCcgbmFtZT0nZ3JvdXA6MzAnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlGZWF0dXJlTWFwIGdldEdyb3VwMygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q29udGFpbmVkIEFydGlmYWN0PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQXJ0aWZhY3R9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q29udGFpbmVkIEFydGlmYWN0PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q29udGFpbmVkIEFydGlmYWN0PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRBcnRpZmFjdF9Db250YWluZWRBcnRpZmFjdCgpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIHZvbGF0aWxlPSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdDb250YWluZWRBcnRpZmFjdCcgZ3JvdXA9JyNncm91cDozMCciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0PEFydGlmYWN0PiBnZXRDb250YWluZWRBcnRpZmFjdCgpOwotCi19IC8vIEFydGlmYWN0ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0FydGlmYWN0RGVzY3JpcHRpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9BcnRpZmFjdERlc2NyaXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4OTczNWMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0FydGlmYWN0RGVzY3JpcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MCArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IEFydGlmYWN0RGVzY3JpcHRpb24uamF2YSx2IDEuMiAyMDA4LzAxLzMwIDAwOjQxOjQ4IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYTsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5BcnRpZmFjdCBEZXNjcmlwdGlvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEEgZ2VuZXJhbGl6ZWQgV29yayBQcm9kdWN0IERlc2NyaXB0aW9uIHRoYXQgaXMgdXNlZCB0byBzdG9yZSB0aGUgdGV4dHVhbCBkZXNjcmlwdGlvbiBmb3IgYW4gQXJ0aWZhY3QuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQXJ0aWZhY3REZXNjcmlwdGlvbiNnZXRCcmllZk91dGxpbmUgPGVtPkJyaWVmIE91dGxpbmU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFydGlmYWN0RGVzY3JpcHRpb24jZ2V0UmVwcmVzZW50YXRpb25PcHRpb25zIDxlbT5SZXByZXNlbnRhdGlvbiBPcHRpb25zPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5BcnRpZmFjdERlc2NyaXB0aW9uI2dldFJlcHJlc2VudGF0aW9uIDxlbT5SZXByZXNlbnRhdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQXJ0aWZhY3REZXNjcmlwdGlvbiNnZXROb3RhdGlvbiA8ZW0+Tm90YXRpb248L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0QXJ0aWZhY3REZXNjcmlwdGlvbigpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nQXJ0aWZhY3REZXNjcmlwdGlvbicga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEFydGlmYWN0RGVzY3JpcHRpb24gZXh0ZW5kcyBXb3JrUHJvZHVjdERlc2NyaXB0aW9uIHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5CcmllZiBPdXRsaW5lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBQcm92aWRlcyBhIGJyaWVmIGRlc2NyaXB0aW9uIG9mIHRoZSBpbmZvcm1hdGlvbiB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGlzIGFydGlmYWN0LiBGb3IgZXhhbXBsZSwgZGlzY3Vzc2VzIHRoZSBjb250ZW50cyBmb3Iga2V5IGNoYXB0ZXJzIG9mIGEgZG9jdW1lbnQgYXJ0aWZhY3Qgb3IgdGhlIGtleSBwYWNrYWdlcyBhbmQgbW9kdWxlcyBvZiBhIG1vZGVsIGFydGlmYWN0LgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5CcmllZiBPdXRsaW5lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRCcmllZk91dGxpbmUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRBcnRpZmFjdERlc2NyaXB0aW9uX0JyaWVmT3V0bGluZSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdCcmllZk91dGxpbmUnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0QnJpZWZPdXRsaW5lKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5BcnRpZmFjdERlc2NyaXB0aW9uI2dldEJyaWVmT3V0bGluZSA8ZW0+QnJpZWYgT3V0bGluZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QnJpZWYgT3V0bGluZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0QnJpZWZPdXRsaW5lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRCcmllZk91dGxpbmUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJlcHJlc2VudGF0aW9uIE9wdGlvbnM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIERpc2N1c3NlcyBkaWZmZXJlbnQgcG9zc2libGUgYWx0ZXJuYXRpdmUgcmVwcmVzZW50YXRpb25zIGZvciB0aGUgYXJ0aWZhY3QuIEZvciBleGFtcGxlIGEgZGVzaWduIG1vZGVsIGNhbiBiZSByZXByZXNlbnRlZCBhcyBhIFVNTCBtb2RlbCBvciBhbiBpbmZvcm1hbCBibG9jayBkaWFncmFtIG9yIGJ5IHRleHR1YWwgZGVzY3JpcHRpb24gb25seS4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmVwcmVzZW50YXRpb24gT3B0aW9uczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UmVwcmVzZW50YXRpb25PcHRpb25zKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0QXJ0aWZhY3REZXNjcmlwdGlvbl9SZXByZXNlbnRhdGlvbk9wdGlvbnMoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nUmVwcmVzZW50YXRpb25PcHRpb25zJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFJlcHJlc2VudGF0aW9uT3B0aW9ucygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQXJ0aWZhY3REZXNjcmlwdGlvbiNnZXRSZXByZXNlbnRhdGlvbk9wdGlvbnMgPGVtPlJlcHJlc2VudGF0aW9uIE9wdGlvbnM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlJlcHJlc2VudGF0aW9uIE9wdGlvbnM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFJlcHJlc2VudGF0aW9uT3B0aW9ucygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UmVwcmVzZW50YXRpb25PcHRpb25zKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SZXByZXNlbnRhdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UmVwcmVzZW50YXRpb248L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmVwcmVzZW50YXRpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFJlcHJlc2VudGF0aW9uKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0QXJ0aWZhY3REZXNjcmlwdGlvbl9SZXByZXNlbnRhdGlvbigpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdSZXByZXNlbnRhdGlvbiciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRSZXByZXNlbnRhdGlvbigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQXJ0aWZhY3REZXNjcmlwdGlvbiNnZXRSZXByZXNlbnRhdGlvbiA8ZW0+UmVwcmVzZW50YXRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlJlcHJlc2VudGF0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRSZXByZXNlbnRhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UmVwcmVzZW50YXRpb24oU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk5vdGF0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Ob3RhdGlvbjwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Ob3RhdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0Tm90YXRpb24oU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRBcnRpZmFjdERlc2NyaXB0aW9uX05vdGF0aW9uKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J05vdGF0aW9uJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldE5vdGF0aW9uKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5BcnRpZmFjdERlc2NyaXB0aW9uI2dldE5vdGF0aW9uIDxlbT5Ob3RhdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Tm90YXRpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldE5vdGF0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXROb3RhdGlvbihTdHJpbmcgdmFsdWUpOwotCi19IC8vIEFydGlmYWN0RGVzY3JpcHRpb24KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvQnJlYWtkb3duRWxlbWVudC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0JyZWFrZG93bkVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzYyZTZmZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvQnJlYWtkb3duRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDc5ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogQnJlYWtkb3duRWxlbWVudC5qYXZhLHYgMS4yIDIwMDgvMDEvMzAgMDA6NDE6NDgga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXA7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+QnJlYWtkb3duIEVsZW1lbnQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBbiBhYnN0cmFjdCBnZW5lcmFsaXphdGlvbiBmb3IgYW55IHR5cGUgb2YgTWV0aG9kIEVsZW1lbnQgdGhhdCBpcyBwYXJ0IG9mIGEgYnJlYWtkb3duIHN0cnVjdHVyZS4gIEl0IGRlZmluZXMgYSBzZXQgb2YgcHJvcGVydGllcyBhdmFpbGFibGUgdG8gYWxsIG9mIGl0cyBzcGVjaWFsaXphdGlvbnMuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQnJlYWtkb3duRWxlbWVudCNnZXRQcmVzZW50ZWRBZnRlciA8ZW0+UHJlc2VudGVkIEFmdGVyPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5CcmVha2Rvd25FbGVtZW50I2dldFByZXNlbnRlZEJlZm9yZSA8ZW0+UHJlc2VudGVkIEJlZm9yZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQnJlYWtkb3duRWxlbWVudCNnZXRQbGFubmluZ0RhdGEgPGVtPlBsYW5uaW5nIERhdGE8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkJyZWFrZG93bkVsZW1lbnQjZ2V0U3VwZXJBY3Rpdml0eSA8ZW0+U3VwZXIgQWN0aXZpdHk8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkJyZWFrZG93bkVsZW1lbnQjZ2V0R3JvdXAxIDxlbT5Hcm91cDE8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkJyZWFrZG93bkVsZW1lbnQjZ2V0Q2hlY2tsaXN0IDxlbT5DaGVja2xpc3Q8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkJyZWFrZG93bkVsZW1lbnQjZ2V0Q29uY2VwdCA8ZW0+Q29uY2VwdDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQnJlYWtkb3duRWxlbWVudCNnZXRFeGFtcGxlIDxlbT5FeGFtcGxlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5CcmVha2Rvd25FbGVtZW50I2dldEd1aWRlbGluZSA8ZW0+R3VpZGVsaW5lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5CcmVha2Rvd25FbGVtZW50I2dldFJldXNhYmxlQXNzZXQgPGVtPlJldXNhYmxlIEFzc2V0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5CcmVha2Rvd25FbGVtZW50I2dldFN1cHBvcnRpbmdNYXRlcmlhbCA8ZW0+U3VwcG9ydGluZyBNYXRlcmlhbDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQnJlYWtkb3duRWxlbWVudCNnZXRXaGl0ZXBhcGVyIDxlbT5XaGl0ZXBhcGVyPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5CcmVha2Rvd25FbGVtZW50I2lzSGFzTXVsdGlwbGVPY2N1cnJlbmNlcyA8ZW0+SGFzIE11bHRpcGxlIE9jY3VycmVuY2VzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5CcmVha2Rvd25FbGVtZW50I2lzSXNPcHRpb25hbCA8ZW0+SXMgT3B0aW9uYWw8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkJyZWFrZG93bkVsZW1lbnQjaXNJc1BsYW5uZWQgPGVtPklzIFBsYW5uZWQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkJyZWFrZG93bkVsZW1lbnQjZ2V0UHJlZml4IDxlbT5QcmVmaXg8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0QnJlYWtkb3duRWxlbWVudCgpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nQnJlYWtkb3duRWxlbWVudCcga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEJyZWFrZG93bkVsZW1lbnQgZXh0ZW5kcyBQcm9jZXNzRWxlbWVudCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UHJlc2VudGVkIEFmdGVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5QcmVzZW50ZWQgQWZ0ZXI8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UHJlc2VudGVkIEFmdGVyPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRQcmVzZW50ZWRBZnRlcihTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldEJyZWFrZG93bkVsZW1lbnRfUHJlc2VudGVkQWZ0ZXIoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nUHJlc2VudGVkQWZ0ZXInIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0UHJlc2VudGVkQWZ0ZXIoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkJyZWFrZG93bkVsZW1lbnQjZ2V0UHJlc2VudGVkQWZ0ZXIgPGVtPlByZXNlbnRlZCBBZnRlcjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UHJlc2VudGVkIEFmdGVyPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRQcmVzZW50ZWRBZnRlcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UHJlc2VudGVkQWZ0ZXIoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlByZXNlbnRlZCBCZWZvcmU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlByZXNlbnRlZCBCZWZvcmU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UHJlc2VudGVkIEJlZm9yZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UHJlc2VudGVkQmVmb3JlKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0QnJlYWtkb3duRWxlbWVudF9QcmVzZW50ZWRCZWZvcmUoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nUHJlc2VudGVkQmVmb3JlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFByZXNlbnRlZEJlZm9yZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQnJlYWtkb3duRWxlbWVudCNnZXRQcmVzZW50ZWRCZWZvcmUgPGVtPlByZXNlbnRlZCBCZWZvcmU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlByZXNlbnRlZCBCZWZvcmU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFByZXNlbnRlZEJlZm9yZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UHJlc2VudGVkQmVmb3JlKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QbGFubmluZyBEYXRhPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5QbGFubmluZyBEYXRhPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlBsYW5uaW5nIERhdGE8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFBsYW5uaW5nRGF0YShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldEJyZWFrZG93bkVsZW1lbnRfUGxhbm5pbmdEYXRhKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1BsYW5uaW5nRGF0YSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRQbGFubmluZ0RhdGEoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkJyZWFrZG93bkVsZW1lbnQjZ2V0UGxhbm5pbmdEYXRhIDxlbT5QbGFubmluZyBEYXRhPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5QbGFubmluZyBEYXRhPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRQbGFubmluZ0RhdGEoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFBsYW5uaW5nRGF0YShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U3VwZXIgQWN0aXZpdHk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlN1cGVyIEFjdGl2aXR5PC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlN1cGVyIEFjdGl2aXR5PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRTdXBlckFjdGl2aXR5KFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0QnJlYWtkb3duRWxlbWVudF9TdXBlckFjdGl2aXR5KCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1N1cGVyQWN0aXZpdHknIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0U3VwZXJBY3Rpdml0eSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQnJlYWtkb3duRWxlbWVudCNnZXRTdXBlckFjdGl2aXR5IDxlbT5TdXBlciBBY3Rpdml0eTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U3VwZXIgQWN0aXZpdHk8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFN1cGVyQWN0aXZpdHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFN1cGVyQWN0aXZpdHkoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkdyb3VwMTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXAuRW50cnl9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+R3JvdXAxPC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+R3JvdXAxPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRCcmVha2Rvd25FbGVtZW50X0dyb3VwMSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUZlYXR1cmVNYXBFbnRyeSIgbWFueT0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZ3JvdXAnIG5hbWU9J2dyb3VwOjE4JyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRmVhdHVyZU1hcCBnZXRHcm91cDEoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNoZWNrbGlzdDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q2hlY2tsaXN0PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q2hlY2tsaXN0PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRCcmVha2Rvd25FbGVtZW50X0NoZWNrbGlzdCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIiB0cmFuc2llbnQ9InRydWUiIHZvbGF0aWxlPSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdDaGVja2xpc3QnIGdyb3VwPScjZ3JvdXA6MTgnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdDxTdHJpbmc+IGdldENoZWNrbGlzdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q29uY2VwdDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q29uY2VwdDwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNvbmNlcHQ8L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldEJyZWFrZG93bkVsZW1lbnRfQ29uY2VwdCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIiB0cmFuc2llbnQ9InRydWUiIHZvbGF0aWxlPSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdDb25jZXB0JyBncm91cD0nI2dyb3VwOjE4JyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3Q8U3RyaW5nPiBnZXRDb25jZXB0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FeGFtcGxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5FeGFtcGxlPC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RXhhbXBsZTwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0QnJlYWtkb3duRWxlbWVudF9FeGFtcGxlKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciIHRyYW5zaWVudD0idHJ1ZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0V4YW1wbGUnIGdyb3VwPScjZ3JvdXA6MTgnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdDxTdHJpbmc+IGdldEV4YW1wbGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkd1aWRlbGluZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+R3VpZGVsaW5lPC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+R3VpZGVsaW5lPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRCcmVha2Rvd25FbGVtZW50X0d1aWRlbGluZSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIiB0cmFuc2llbnQ9InRydWUiIHZvbGF0aWxlPSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdHdWlkZWxpbmUnIGdyb3VwPScjZ3JvdXA6MTgnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdDxTdHJpbmc+IGdldEd1aWRlbGluZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmV1c2FibGUgQXNzZXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlJldXNhYmxlIEFzc2V0PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmV1c2FibGUgQXNzZXQ8L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldEJyZWFrZG93bkVsZW1lbnRfUmV1c2FibGVBc3NldCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIiB0cmFuc2llbnQ9InRydWUiIHZvbGF0aWxlPSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdSZXVzYWJsZUFzc2V0JyBncm91cD0nI2dyb3VwOjE4JyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3Q8U3RyaW5nPiBnZXRSZXVzYWJsZUFzc2V0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TdXBwb3J0aW5nIE1hdGVyaWFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5TdXBwb3J0aW5nIE1hdGVyaWFsPC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U3VwcG9ydGluZyBNYXRlcmlhbDwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0QnJlYWtkb3duRWxlbWVudF9TdXBwb3J0aW5nTWF0ZXJpYWwoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nU3VwcG9ydGluZ01hdGVyaWFsJyBncm91cD0nI2dyb3VwOjE4JyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3Q8U3RyaW5nPiBnZXRTdXBwb3J0aW5nTWF0ZXJpYWwoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPldoaXRlcGFwZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPldoaXRlcGFwZXI8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5XaGl0ZXBhcGVyPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRCcmVha2Rvd25FbGVtZW50X1doaXRlcGFwZXIoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nV2hpdGVwYXBlcicgZ3JvdXA9JyNncm91cDoxOCciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0PFN0cmluZz4gZ2V0V2hpdGVwYXBlcigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SGFzIE11bHRpcGxlIE9jY3VycmVuY2VzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBKdXN0IGFzIHRoZSBpc1BsYW5uZWQgYXR0cmlidXRlIHRoZSBoYXNNdWx0aXBsZU9jY3VycmVuY2VzIGF0dHJpYnV0ZSBoYXMgYW4gaW1wYWN0IG9uIGdlbmVyYXRpbmcgcGxhbnMgZnJvbSBhIFByb2Nlc3MuICBXaGVuIHRoaXMgYXR0cmlidXRlIGlzIHNldCB0byBUcnVlIGZvciBhIEJyZWFrZG93biBFbGVtZW50IHRoZW4gaXQgd2lsbCB0eXBpY2FsbHkgb2NjdXIgbXVsdGlwbGUgdGltZXMgd2l0aGluIHRoZSBzYW1lIEFjdGl2aXR5LiAgRm9yIGV4YW1wbGUsIGEgVGFzayBzdWNoIGFzICJEZXRhaWwgVXNlIENhc2UiIHdvdWxkIGJlIHBlcmZvcm1lZCBmb3IgZXZlcnkgdXNlIGNhc2UgaWRlbnRpZmllZCBmb3IgYSBwYXJ0aWN1bGFyIEl0ZXJhdGlvbiBvciBBY3Rpdml0eS4gIEdlbmVyYXRpbmcgYSBwbGFuIHdvdWxkIGxpc3Qgb25lIFRhc2sgaW5zdGFuY2UgcGVyIHVzZSBjYXNlLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5IYXMgTXVsdGlwbGUgT2NjdXJyZW5jZXM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0SGFzTXVsdGlwbGVPY2N1cnJlbmNlcygpCi0JICogQHNlZSAjdW5zZXRIYXNNdWx0aXBsZU9jY3VycmVuY2VzKCkKLQkgKiBAc2VlICNzZXRIYXNNdWx0aXBsZU9jY3VycmVuY2VzKGJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldEJyZWFrZG93bkVsZW1lbnRfSGFzTXVsdGlwbGVPY2N1cnJlbmNlcygpCi0JICogQG1vZGVsIHVuc2V0dGFibGU9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbiIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nYXR0cmlidXRlJyBuYW1lPSdoYXNNdWx0aXBsZU9jY3VycmVuY2VzJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc0hhc011bHRpcGxlT2NjdXJyZW5jZXMoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkJyZWFrZG93bkVsZW1lbnQjaXNIYXNNdWx0aXBsZU9jY3VycmVuY2VzIDxlbT5IYXMgTXVsdGlwbGUgT2NjdXJyZW5jZXM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkhhcyBNdWx0aXBsZSBPY2N1cnJlbmNlczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRIYXNNdWx0aXBsZU9jY3VycmVuY2VzKCkKLQkgKiBAc2VlICN1bnNldEhhc011bHRpcGxlT2NjdXJyZW5jZXMoKQotCSAqIEBzZWUgI2lzSGFzTXVsdGlwbGVPY2N1cnJlbmNlcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0SGFzTXVsdGlwbGVPY2N1cnJlbmNlcyhib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQnJlYWtkb3duRWxlbWVudCNpc0hhc011bHRpcGxlT2NjdXJyZW5jZXMgPGVtPkhhcyBNdWx0aXBsZSBPY2N1cnJlbmNlczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRIYXNNdWx0aXBsZU9jY3VycmVuY2VzKCkKLQkgKiBAc2VlICNpc0hhc011bHRpcGxlT2NjdXJyZW5jZXMoKQotCSAqIEBzZWUgI3NldEhhc011bHRpcGxlT2NjdXJyZW5jZXMoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldEhhc011bHRpcGxlT2NjdXJyZW5jZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQnJlYWtkb3duRWxlbWVudCNpc0hhc011bHRpcGxlT2NjdXJyZW5jZXMgPGVtPkhhcyBNdWx0aXBsZSBPY2N1cnJlbmNlczwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SGFzIE11bHRpcGxlIE9jY3VycmVuY2VzPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRIYXNNdWx0aXBsZU9jY3VycmVuY2VzKCkKLQkgKiBAc2VlICNpc0hhc011bHRpcGxlT2NjdXJyZW5jZXMoKQotCSAqIEBzZWUgI3NldEhhc011bHRpcGxlT2NjdXJyZW5jZXMoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldEhhc011bHRpcGxlT2NjdXJyZW5jZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPklzIE9wdGlvbmFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBJbmRpY2F0ZXMgdGhhdCB0aGUgQnJlYWtkb3duIEVsZW1lbnQgZGVzY3JpYmVzIHdvcmssIGEgd29yayByZXN1bHQsIG9yIGV2ZW4gd29yayByZXNvdXJjZXMsIHdoaWNoIGluY2x1c2lvbiBpcyBub3QgbWFuZGF0b3J5IHdoZW4gcGVyZm9ybWluZyBhIHByb2plY3QgdGhhdCBpcyBwbGFubmVkIGJhc2VkIG9uIGEgcHJvY2VzcyBjb250YWluaW5nIHRoaXMgZWxlbWVudC4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SXMgT3B0aW9uYWw8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0SXNPcHRpb25hbCgpCi0JICogQHNlZSAjdW5zZXRJc09wdGlvbmFsKCkKLQkgKiBAc2VlICNzZXRJc09wdGlvbmFsKGJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldEJyZWFrZG93bkVsZW1lbnRfSXNPcHRpb25hbCgpCi0JICogQG1vZGVsIHVuc2V0dGFibGU9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbiIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nYXR0cmlidXRlJyBuYW1lPSdpc09wdGlvbmFsJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc0lzT3B0aW9uYWwoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkJyZWFrZG93bkVsZW1lbnQjaXNJc09wdGlvbmFsIDxlbT5JcyBPcHRpb25hbDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SXMgT3B0aW9uYWw8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0SXNPcHRpb25hbCgpCi0JICogQHNlZSAjdW5zZXRJc09wdGlvbmFsKCkKLQkgKiBAc2VlICNpc0lzT3B0aW9uYWwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldElzT3B0aW9uYWwoYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkJyZWFrZG93bkVsZW1lbnQjaXNJc09wdGlvbmFsIDxlbT5JcyBPcHRpb25hbDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRJc09wdGlvbmFsKCkKLQkgKiBAc2VlICNpc0lzT3B0aW9uYWwoKQotCSAqIEBzZWUgI3NldElzT3B0aW9uYWwoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldElzT3B0aW9uYWwoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQnJlYWtkb3duRWxlbWVudCNpc0lzT3B0aW9uYWwgPGVtPklzIE9wdGlvbmFsPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JcyBPcHRpb25hbDwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0SXNPcHRpb25hbCgpCi0JICogQHNlZSAjaXNJc09wdGlvbmFsKCkKLQkgKiBAc2VlICNzZXRJc09wdGlvbmFsKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRJc09wdGlvbmFsKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JcyBQbGFubmVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBBIGtleSBhcHBsaWNhdGlvbiBmb3IgRGV2ZWxvcG1lbnQgUHJvY2Vzc2VzIGV4cHJlc3NlZCB3aXRoIEJyZWFrZG93biBzdHJ1Y3R1cmVzIGlzIHRvIGdlbmVyYXRlIGEgcHJvamVjdCBwbGFuIGZyb20gaXQuICBBIHByb2Nlc3MgYXMgZGVmaW5lZCBpbiBVTUEgKGNmLiB3aXRoIFNlY3Rpb25zIFhYIGFuZCA1LjIpIGlzIGEgbXVsdGktZGltZW5zaW9uYWwgc3RydWN0dXJlIGRlZmluaW5nIHdoYXQgd29yayBpcyBiZWluZyBwZXJmb3JtZWQgYXQgd2hhdCB0aW1lIGJ5IHdoaWNoIHJvbGVzIHVzaW5nIHdoaWNoIGlucHV0IGFuZCBwcm9kdWNpbmcgd2hhdCBvdXRwdXRzLiAgQSBwcm9qZWN0IHBsYW4gYXMgaXQgaXMgcmVwcmVzZW50ZWQgaW4gcHJvamVjdCBwbGFubmluZyB0b29scyBzdWNoIGFzIElCTSBSYXRpb25hbCBQb3J0Zm9saW8gTWFuYWdlciBvciBNaWNyb3NvZnQgUHJvamVjdCBub3JtYWxseSBkb2VzIG5vdCBuZWVkIGFsbCB0aGlzIGluZm9ybWF0aW9uIGFuZCBpcyBub3JtYWxseSBsaW1pdGVkIHRvIGp1c3QgcmVwcmVzZW50aW5nIGEgc3Vic2V0LiAgRm9yIGV4YW1wbGUsIGEgdHlwaWNhbCBNUyBQcm9qZWN0IHBsYW4gb25seSByZXByZXNlbnRzIHRoZSB3b3JrIGJyZWFrZG93biBjb25zaXN0aW5nIG9mIFRhc2tzIGFuZCBBY3Rpdml0aWVzIChzb21ldGltZXMgcmVmZXJyZWQgdG8gYXMgc3VtbWFyeSB0YXNrcykuICBJdCBkb2VzIG5vdCBzaG93IHRoZSBpbnB1dCBhbmQgb3V0cHV0IFdvcmsgUHJvZHVjdHMgZm9yIGEgVGFzaywgYnV0IGl0IGNhbiBzaG93IHdoaWNoIHJvbGVzIHNoYWxsIGJlIHN0YWZmZWQgZm9yIHBlcmZvcm1pbmcgdGhlIFRhc2suICBIb3dldmVyLCBzdWNoIHJvbGUgYWxsb2NhdGlvbiBuZWVkIHRvIGJlIHJlcGxhY2VkIHdpdGggY29uY3JldGUgcmVzb3VyY2VzIHdoZW4gaW5zdGFudGlhdGluZyB0aGUgcGxhbiBmb3IgYSBjb25jcmV0ZSBwcm9qZWN0LiAgU29tZXRpbWVzIHByb2plY3QgcGxhbnMgY2FuIHRoZW4gYWdhaW4gYmUgb3JnYW5pemVkIGRpZmZlcmVudGx5IGJ5IG9yZ2FuaXppbmcgd29yayBieSBkZWxpdmVyYWJsZXMgaW4gd2hpY2ggV29yayBQcm9kdWN0cyBhcmUgbWFwcGVkIHRvIHRoZSBwbGFuJ3Mgc3VtbWFyeSB0YXNrcyBhbmQgVGFzayB0aGF0IGhhdmUgdGhlc2Ugd29yayBwcm9kdWN0cyBhcyBvdXRwdXQgbWFwcGVkIGJlbG93IHN1Y2ggYXMgc3VtbWFyeSB0YXNrLiAgVGhlcmVmb3JlLCBhIHByb2Nlc3MgY2FuIG1ha2UgcmVjb21tZW5kYXRpb25zIGFib3V0IHdoaWNoIGVsZW1lbnRzIHRvIGluY2x1ZGUgYW5kIHdoaWNoIHRvIGV4Y2x1ZGUgd2hlbiBnZW5lcmF0aW5nIGEgcGxhbi4gIFdoZW4gdGhlIGlzUGxhbm5lZCBhdHRyaWJ1dGUgaXMgc2V0IHRvIEZhbHNlIGZvciBhbiBpbnN0YW5jZSBvZiBhIEJyZWFrZG93biBFbGVtZW50LCB0aGVuIHRoaXMgZWxlbWVudCBzaGFsbCBub3QgYmUgbm90IGluY2x1ZGVkIHdoZW4gYSBjb25jcmV0ZSBwcm9qZWN0IHBsYW4gaXMgYmVpbmcgZ2VuZXJhdGVkIGZyb20gdGhlIGJyZWFrZG93biBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucyB0aGlzIGVsZW1lbnQuCi0JICogCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPklzIFBsYW5uZWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0SXNQbGFubmVkKCkKLQkgKiBAc2VlICN1bnNldElzUGxhbm5lZCgpCi0JICogQHNlZSAjc2V0SXNQbGFubmVkKGJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldEJyZWFrZG93bkVsZW1lbnRfSXNQbGFubmVkKCkKLQkgKiBAbW9kZWwgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdhdHRyaWJ1dGUnIG5hbWU9J2lzUGxhbm5lZCciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNJc1BsYW5uZWQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkJyZWFrZG93bkVsZW1lbnQjaXNJc1BsYW5uZWQgPGVtPklzIFBsYW5uZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPklzIFBsYW5uZWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0SXNQbGFubmVkKCkKLQkgKiBAc2VlICN1bnNldElzUGxhbm5lZCgpCi0JICogQHNlZSAjaXNJc1BsYW5uZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldElzUGxhbm5lZChib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQnJlYWtkb3duRWxlbWVudCNpc0lzUGxhbm5lZCA8ZW0+SXMgUGxhbm5lZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRJc1BsYW5uZWQoKQotCSAqIEBzZWUgI2lzSXNQbGFubmVkKCkKLQkgKiBAc2VlICNzZXRJc1BsYW5uZWQoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldElzUGxhbm5lZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5CcmVha2Rvd25FbGVtZW50I2lzSXNQbGFubmVkIDxlbT5JcyBQbGFubmVkPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JcyBQbGFubmVkPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRJc1BsYW5uZWQoKQotCSAqIEBzZWUgI2lzSXNQbGFubmVkKCkKLQkgKiBAc2VlICNzZXRJc1BsYW5uZWQoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldElzUGxhbm5lZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UHJlZml4PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBQcmVmaXggcmVwcmVzZW50cyBhbiBhZGRpdGlvbmFsIGxhYmVsIHRoYXQgd2lsbCBiZSBwcmVzZW50ZWQgYXMgYSBwcmVmaXggdG8gYW55IEJyZWFrZG93biBFbGVtZW50IHRvIGluZGljYXRlIGEgdXNlci1kZWZpbmVkIHN1Yi10eXBlIGZvciB0aGUgZWxlbWVudC4gIEZvciBleGFtcGxlLCBpZiB0aGUgcHJvY2VzcyBlbmdpbmVlciB3b3VsZCBsaWtlIHRvIGRpc3Rpbmd1aXNoIGhpcyBBY3Rpdml0aWVzIGJ5ICdNb2R1bGUnIChhcyBkb25lIGluIHRoZSBJQk0gUmF0aW9uYWwgU3VtbWl0IEFzY2VuZGFudCBNZXRob2QpLCBoZSBjYW4gZGVmaW5lIGEgZGlmZmVyZW50IHByZWZpeCBmb3IgZXZlcnkgbW9kZWwgdG8gYmUgdXNlZCBpbiBhZGRpdGlvbiB0byBuYW1pbmcgQWN0aXZpdGllcywgZS5nLiAiU1JBLkVzdGFibGlzaCBSZXF1aXJlbWVudHMiIHdpdGggU1JBIGluZGljYXRpbmcgdGhhdCB0aGlzIEFjdGl2aXR5IGJlbG9uZ3MgdG8gdGhlICJTb2Z0d2FyZSBSZXF1aXJlbWVudHMgQW5hbHlzaXMiIG1vZHVsZS4gIEFub3RoZXIgY29tbW9uIGFwcGxpY2F0aW9uIGZvciBwcmVmaXggaXMgdG8gcXVhbGlmeSByb2xlcyBpbiBSb2xlIERlc2NyaXB0b3JzLiAgRm9yIGV4YW1wbGUsICJDdXN0b21lci5BcmNoaXRlY3QiIHdvdWxkIGRlZmluZSBhICJDdXN0b21lciIgcHJlZml4IGZvciB0aGUgUm9sZSBEZXNjcmlwdG9yICJBcmNoaXRlY3QiIGV4cHJlc3NpbmcgdGhhdCB0aGlzIGlzIGFuIGFyY2hpdGVjdCBvbiB0aGUgY3VzdG9tZXIgc2lkZSBhbmQgbm90IHRoZSBkZXZlbG9wbWVudCB0ZWFtIHNpZGUuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlByZWZpeDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UHJlZml4KFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0QnJlYWtkb3duRWxlbWVudF9QcmVmaXgoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nYXR0cmlidXRlJyBuYW1lPSdwcmVmaXgnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0UHJlZml4KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5CcmVha2Rvd25FbGVtZW50I2dldFByZWZpeCA8ZW0+UHJlZml4PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5QcmVmaXg8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFByZWZpeCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UHJlZml4KFN0cmluZyB2YWx1ZSk7Ci0KLX0gLy8gQnJlYWtkb3duRWxlbWVudApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9CcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9CcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWVkYzQ5NS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IEJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbi5qYXZhLHYgMS4yIDIwMDgvMDEvMzAgMDA6NDE6NDcga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkJyZWFrZG93biBFbGVtZW50IERlc2NyaXB0aW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQSBnZW5lcmFsaXplZCBDb250ZW50IERlc2NyaXB0aW9uIHRoYXQgaXMgdXNlZCB0byBzdG9yZSB0aGUgdGV4dHVhbCBkZXNjcmlwdGlvbiBmb3IgYSBCcmVha2Rvd24gRWxlbWVudC4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5CcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24jZ2V0VXNhZ2VHdWlkYW5jZSA8ZW0+VXNhZ2UgR3VpZGFuY2U8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0QnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uKCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24nIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24gZXh0ZW5kcyBDb250ZW50RGVzY3JpcHRpb24gewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlVzYWdlIEd1aWRhbmNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBQcm92aWRlcyBpbmZvcm1hdGlvbiBhbmQgZ3VpZGFuY2Ugb24gdGhlIG1lYW5pbmcgb2YgdGhlIEJvb2xlYW4gZmxhZyB2YWx1ZXMgYW5kIHVuZGVyIHdoYXQgY2lyY3Vtc3RhbmNlcyB0aGV5IHNob3VsZCBiZSBvdmVycmlkZGVuLiBGb3IgZXhhbXBsZSwgaXQgZGVzY3JpYmVzIHdoeSB0aGUgYnJlYWtkb3duIGVsZW1lbnQgaXMgb3B0aW9uYWwgb3IgY29uc2lkZXJhdGlvbnMgZm9yIHJlcGVhdGluZyBpdCBhbmQgZGlmZmVyZW5jZXMgaW4gdGhlIGluZGl2aWR1YWwgb2NjdXJyZW5jZXMgb2YgdGhpcyBCcmVha2Rvd24gRWxlbWVudCBhY3Jvc3MgdGhlIGxpZmVjeWNsZS4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VXNhZ2UgR3VpZGFuY2U8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFVzYWdlR3VpZGFuY2UoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb25fVXNhZ2VHdWlkYW5jZSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdhdHRyaWJ1dGUnIG5hbWU9J3VzYWdlR3VpZGFuY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0VXNhZ2VHdWlkYW5jZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uI2dldFVzYWdlR3VpZGFuY2UgPGVtPlVzYWdlIEd1aWRhbmNlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Vc2FnZSBHdWlkYW5jZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0VXNhZ2VHdWlkYW5jZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VXNhZ2VHdWlkYW5jZShTdHJpbmcgdmFsdWUpOwotCi19IC8vIEJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9DYXBhYmlsaXR5UGF0dGVybi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0NhcGFiaWxpdHlQYXR0ZXJuLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxZTcxZTIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0NhcGFiaWxpdHlQYXR0ZXJuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IENhcGFiaWxpdHlQYXR0ZXJuLmphdmEsdiAxLjEgMjAwOC8wMS8xNSAwODo1MjowNyBqdGhhbSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkNhcGFiaWxpdHkgUGF0dGVybjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEEgc3BlY2lhbCBQcm9jZXNzIHRoYXQgZGVzY3JpYmVzIGEgcmV1c2FibGUgY2x1c3RlciBvZiBkb2luZyB3b3JrIGluIGNvbW1vbiBwcm9jZXNzIGFyZWFzLiAgQ2FwYWJpbGl0aWVzIFBhdHRlcm5zIGV4cHJlc3MgYW5kIGNvbW11bmljYXRlIHByb2Nlc3Mga25vd2xlZGdlIGZvciBhIGtleSBhcmVhIG9mIGludGVyZXN0IHN1Y2ggYXMgYSBEaXNjaXBsaW5lIGFuZCBjYW4gYmUgZGlyZWN0bHkgdXNlZCBieSBwcm9jZXNzIHByYWN0aXRpb25lciB0byBndWlkZSBoaXMgd29yay4gIFRoZXkgYXJlIGFsc28gdXNlZCBhcyBidWlsZGluZyBibG9ja3MgdG8gYXNzZW1ibGUgRGVsaXZlcnkgUHJvY2Vzc2VzIG9yIGxhcmdlciBDYXBhYmlsaXR5IFBhdHRlcm5zIGVuc3VyaW5nIG9wdGltYWwgcmV1c2UgYW5kIGFwcGxpY2F0aW9uIG9mIHRoZSBrZXkgcHJhY3RpY2VzIHRoZXkgZXhwcmVzcy4KLSAqIEEgQ2FwYWJpbGl0eSBQYXR0ZXJuIGlzIGEgc3BlY2lhbCBQcm9jZXNzIHRoYXQgZGVzY3JpYmVzIGEgcmV1c2FibGUgY2x1c3RlciBvZiBkb2luZyB3b3JrIGluIGEgZ2VuZXJhbCBwcm9jZXNzIGFyZWEgdGhhdCBwcm92aWRlcyBhIGNvbnNpc3RlbnQgZGV2ZWxvcG1lbnQgYXBwcm9hY2ggdG8gY29tbW9uIHByb2JsZW1zLiAgRXhhbXBsZXMgZm9yIENhcGFiaWxpdHkgUGF0dGVybiBjb3VsZCBiZSAndXNlIGNhc2UtYmFzZWQgcmVxdWlyZW1lbnRzIG1hbmFnZW1lbnQnLCAndXNlIGNhc2UgYW5hbHlzaXMnLCBvciAndW5pdCB0ZXN0aW5nJy4gVHlwaWNhbGx5IGJ1dCBub3QgbmVjZXNzYXJpbHksIENhcGFiaWxpdHkgUGF0dGVybnMgaGF2ZSB0aGUgc2NvcGUgb2Ygb25lIGRpc2NpcGxpbmUgcHJvdmlkaW5nIGEgYnJlYWtkb3duIG9mIHJldXNhYmxlIGNvbXBsZXggQWN0aXZpdGllcywgcmVsYXRpb25zaGlwcyB0byB0aGUgUm9sZXMgd2hpY2ggcGVyZm9ybSBUYXNrcyB3aXRoaW4gdGhlc2UgQWN0aXZpdGllcywgYXMgd2VsbCBhcyB0byB0aGUgV29yayBQcm9kdWN0cyB0aGF0IGFyZSB1c2VkIGFuZCBwcm9kdWNlZC4gIEEgY2FwYWJpbGl0eSBwYXR0ZXJuIGRvZXMgbm90IHJlbGF0ZSB0byBhbnkgc3BlY2lmaWMgcGhhc2Ugb3IgaXRlcmF0aW9uIG9mIGEgZGV2ZWxvcG1lbnQgbGlmZWN5Y2xlLCBhbmQgc2hvdWxkIG5vdCBpbXBseSBhbnkuICBJbiBvdGhlciB3b3JkcywgYSBwYXR0ZXJuIHNob3VsZCBiZSBkZXNpZ25lZCBpbiBhIHdheSB0aGF0IGl0IGlzIGFwcGxpY2FibGUgYW55d2hlcmUgaW4gYSBEZWxpdmVyeSBQcm9jZXNzLiAgVGhpcyBlbmFibGVzIGl0cyBBY3Rpdml0aWVzIHRvIGJlIGZsZXhpYmx5IGFzc2lnbmVkIHRvIHdoYXRldmVyIHBoYXNlcyB0aGVyZSBhcmUgaW4gdGhlIERlbGl2ZXJ5IFByb2Nlc3MgdG8gd2hpY2ggaXQgaXMgYmVpbmcgYXBwbGllZC4gIEl0IGlzIGEgZ29vZCBwcmFjdGljZSB0byBkZXNpZ24gYSBDYXBhYmlsaXR5IFBhdHRlcm4gdG8gcHJvZHVjZSBvbmUgb3IgbW9yZSBnZW5lcmljIERlbGl2ZXJhYmxlcy4gIFRoZSB0eXBpY2FsIGNvbmZpZ3VyYXRpb24gaXMgdGhhdCBlYWNoIEFjdGl2aXR5IGluIHRoZSBDYXBhYmlsaXR5IFBhdHRlcm4gcHJvZHVjZXMgb25lIERlbGl2ZXJhYmxlLCBhbmQgdGhlIGxhc3QgVGFzayBEZXNjcmlwdG9yIGluIHRoZSBBY3Rpdml0eSBleHBsaWNpdGx5IG91dHB1dHMganVzdCB0aGlzIERlbGl2ZXJhYmxlLiAgVGhpcyBlbmFibGVzIHRoZSBwcm9jZXNzIGVuZ2luZWVyIHRvIHNlbGVjdCBQYXR0ZXJucyBvciBqdXN0IEFjdGl2aXRpZXMgYnkgZGVjaWRpbmcgd2hpY2ggRGVsaXZlcmFibGVzIGFyZSByZXF1aXJlZC4gIEl0IGFsc28gb2ZmZXJzIGEgc2ltcGxlIGludGVncmF0aW9uIGFwcHJvYWNoOiBhbiBBY3Rpdml0eSBmcm9tIGEgY2FwYWJpbGl0eSBwYXR0ZXJuIGlzIGxpbmtlZCB0byB0aGUgUGhhc2Ugb3IgSXRlcmF0aW9uIHdoaWNoIGlzIHJlcXVpcmVkIHRvIHByb2R1Y2UgdGhlIEFjdGl2aXR5J3MgRGVsaXZlcmFibGUuICBLZXkgYXBwbGljYXRpb25zIGFyZWFzIG9mIC8gYXJlYXMgb2YgcmV1c2UgZm9yIENhcGFiaWxpdHkgUGF0dGVybnMgYXJlOgotICogLSBUbyBzZXJ2ZSBhcyBidWlsZGluZyBibG9ja3MgZm9yIGFzc2VtYmxpbmcgRGVsaXZlcnkgUHJvY2Vzc2VzIG9yIGxhcmdlciBDYXBhYmlsaXR5IFBhdHRlcm5zLiAgTm9ybWFsbHkgZGV2ZWxvcGluZyBhIERlbGl2ZXJ5IFByb2Nlc3MgaXMgbm90IGRvbmUgZnJvbSBzY3JhdGNoIGJ1dCBieSBzeXN0ZW1hdGljYWxseSBhcHBseWluZyBhbmQgYmluZGluZyBwYXR0ZXJucy4gIEluIGFkZGl0aW9uIHRvIHRoZSBzdGFuZGFyZCBwYXR0ZXJuIGFwcGxpY2F0aW9uIG9mICdjb3B5LWFuZC1tb2RpZnknLCB3aGljaCBhbGxvd3MgdGhlIHByb2Nlc3MgZW5naW5lZXIgdG8gaW5kaXZpZHVhbGx5IGN1c3RvbWl6ZSB0aGUgcGF0dGVybidzIGNvbnRlbnQgdG8gdGhlIHBhcnRpY3VsYXIgc2l0dWF0aW9uIGl0IGlzIGFwcGxpZWQgZm9yLCB0aGUgUGx1Z2luIG1ldGEtbW9kZWwgcGFja2FnZSAoU2VjdGlvbiA2LjEpIGludHJvZHVjZXMgZXZlbiBtb3JlIHNvcGhpc3RpY2F0ZWQgaW5oZXJpdGFuY2UgcmVsYXRpb25zaGlwcyB0aGF0IHN1cHBvcnQgZHluYW1pYyBiaW5kaW5nIG9mIHBhdHRlcm5zIChpLmUuIHRoZSBwYXR0ZXJuIGlzIHJlZmVyZW5jZWQgYW5kIG5vdCBjb3BpZWQpLiAgVGhpcyB1bmlxdWUgbmV3IHdheSBvZiByZXVzaW5nIHByb2Nlc3Mga25vd2xlZGdlIGFsbG93cyB0byBmYWN0b3Igb3V0IGNvbW1vbmx5IHJlb2NjdXJyaW5nIEFjdGl2aXRpZXMgaW50byBwYXR0ZXJucyBhbmQgdG8gYXBwbHkgdGhlbSBvdmVyIGFuZCBvdmVyIGFnYWluIGZvciBhIHByb2Nlc3MuICBXaGVuIHRoZSBwYXR0ZXJuIGlzIGJlaW5nIHJldmlzZWQgb3IgdXBkYXRlZCwgYWxsIGNoYW5nZXMgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IHJlZmxlY3RlZCBpbiBhbGwgcGF0dGVybiBhcHBsaWNhdGlvbiBpbiBhbGwgcHJvY2Vzc2VzIGJlY2F1c2Ugb2YgdGhlIGR5bmFtaWMgYmluZGluZy4KLSAqIC0gVG8gc3VwcG9ydCBkaXJlY3QgZXhlY3V0aW9uIGluIGEgZGV2ZWxvcG1lbnQgcHJvamVjdCB0aGF0IGRvZXMgbm90IHdvcmsgZm9sbG93aW5nIGEgd2VsbC1kZWZpbmVkIHByb2Nlc3MsIGJ1dCB3b3JrcyBiYXNlZCBvbiBsb29zZWx5IGNvbm5lY3RlZCBwcm9jZXNzIGZyYWdtZW50cyBvZiBiZXN0IHByYWN0aWNlcyBpbiBhIGZsZXhpYmxlIG1hbm5lciAoZS5nLiBBZ2lsZSBEZXZlbG9wbWVudCkuCi0gKiAtIFRvIHN1cHBvcnQgcHJvY2VzcyBlZHVjYXRpb24gYnkgZGVzY3JpYmluZyBrbm93bGVkZ2UgZm9yIGEga2V5IGFyZWEgc3VjaCBhcyBiZXN0IHByYWN0aWNlcyBvbiBob3cgdG8gcGVyZm9ybSB0aGUgd29yayBmb3IgYSBEaXNjaXBsaW5lIChlLmcuIFJlcXVpcmVtZW50cyBNYW5hZ2VtZW50KSwgZm9yIGEgc3BlY2lmaWMgZGV2ZWxvcG1lbnQgdGVjaG5pcXVlIChhc3BlY3Qtb3JpZW50ZWQgZGV2ZWxvcG1lbnQpLCBvciBhIHNwZWNpZmljIHRlY2huaWNhbCBhcmVhIChlLmcuIHJlbGF0aW9uYWwgZGF0YWJhc2UgZGVzaWduKSwgd2hpY2ggaXMgdXNlZCBmb3IgZWR1Y2F0aW9uIGFuZCB0ZWFjaGluZy4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldENhcGFiaWxpdHlQYXR0ZXJuKCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdDYXBhYmlsaXR5UGF0dGVybicga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIENhcGFiaWxpdHlQYXR0ZXJuIGV4dGVuZHMgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2VzcyB7Ci19IC8vIENhcGFiaWxpdHlQYXR0ZXJuClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0NoZWNrbGlzdC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0NoZWNrbGlzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZWVkN2RmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9DaGVja2xpc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogQ2hlY2tsaXN0LmphdmEsdiAxLjEgMjAwOC8wMS8xNSAwODo1MjowNyBqdGhhbSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkNoZWNrbGlzdDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEEgc3BlY2lmaWMgdHlwZSBvZiBndWlkYW5jZSB0aGF0IGlkZW50aWZpZXMgYSBzZXJpZXMgb2YgaXRlbXMgdGhhdCBuZWVkIHRvIGJlIGNvbXBsZXRlZCBvciB2ZXJpLWZpZWQuICBDaGVja2xpc3RzIGFyZSBvZnRlbiB1c2VkIGluIHJldmlld3Mgc3VjaCBhcyB3YWxrdGhyb3VnaHMgb3IgaW5zcGVjdGlvbnMuIAotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0Q2hlY2tsaXN0KCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdDaGVja2xpc3QnIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBDaGVja2xpc3QgZXh0ZW5kcyBHdWlkYW5jZSB7Ci19IC8vIENoZWNrbGlzdApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9Db21wb3NpdGVSb2xlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvQ29tcG9zaXRlUm9sZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOTMwNzQyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9Db21wb3NpdGVSb2xlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IENvbXBvc2l0ZVJvbGUuamF2YSx2IDEuMiAyMDA4LzAxLzMwIDAwOjQxOjQ4IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Db21wb3NpdGUgUm9sZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEEgc3BlY2lhbCBSb2xlIERlc2NyaXB0b3IgdGhhdCByZWxhdGVzIHRvIG1vcmUgdGhlbiBvbmUgUm9sZS4gIEl0IHJlcHJlc2VudHMgYSBncm91cGluZyBvZiBSb2xlcyB3aXRoIHRoZSBtYWluIHB1cnBvc2Ugb2Ygc2ltcGxpZmljYXRpb24sIGkuZS4gcmVkdWNpbmcgdGhlIG51bWJlciBvZiByb2xlcyBmb3IgYSBwcm9jZXNzLgotICogQSBDb21wb3NpdGUgUm9sZSBpcyBhIGdyb3VwaW5nIG9mIFJvbGVzIHRoYXQgY2FuIGJlIHVzZWQgaW4gYW4gQWN0aXZpdHkgb3IgUHJvY2VzcyB0byByZWR1Y2UgdGhlIG51bWJlciBvZiBSb2xlcy4gIEEgdHlwaWNhbCBhcHBsaWNhdGlvbiB3b3VsZCBiZSBhIHByb2Nlc3MgZm9yIGEgc21hbGwgdGVhbSBpbiB3aGljaCBhIHN0YW5kYXJkIHNldCBvZiByb2xlcyBmcm9tIHRoZSBtZXRob2QgY29udGVudCB3b3VsZCBiZSBhbGwgcGVyZm9ybWVkIGJ5IG9uZSBvciBtb3JlIHJlc291cmNlLiAgQnkgdXNpbmcgQ29tcG9zaXRlIFJvbGUgdGhlIHByb2Nlc3Mgd291bGQgc3VnZ2VzdCBhIHR5cGljYWwgY2x1c3RlcmluZyBvZiBSb2xlcyB0byBSZXNvdXJjZXMuICBBIENvbXBvc2l0ZSBSb2xlIGNvdWxkIHBlcmZvcm0gYWxsIFRhc2tzIGRlZmluZWQgZm9yIHRoZSBSb2xlcyBpdCByZWZlcnMgdG8uCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29tcG9zaXRlUm9sZSNnZXRHcm91cDIgPGVtPkdyb3VwMjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29tcG9zaXRlUm9sZSNnZXRBZ2dyZWdhdGVkUm9sZSA8ZW0+QWdncmVnYXRlZCBSb2xlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldENvbXBvc2l0ZVJvbGUoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J0NvbXBvc2l0ZVJvbGUnIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBDb21wb3NpdGVSb2xlIGV4dGVuZHMgUm9sZURlc2NyaXB0b3IgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkdyb3VwMjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXAuRW50cnl9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+R3JvdXAyPC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+R3JvdXAyPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRDb21wb3NpdGVSb2xlX0dyb3VwMigpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUZlYXR1cmVNYXBFbnRyeSIgbWFueT0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZ3JvdXAnIG5hbWU9J2dyb3VwOjMzJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRmVhdHVyZU1hcCBnZXRHcm91cDIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkFnZ3JlZ2F0ZWQgUm9sZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJvbGV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+QWdncmVnYXRlZCBSb2xlPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QWdncmVnYXRlZCBSb2xlPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRDb21wb3NpdGVSb2xlX0FnZ3JlZ2F0ZWRSb2xlKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0FnZ3JlZ2F0ZWRSb2xlJyBncm91cD0nI2dyb3VwOjMzJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3Q8Um9sZT4gZ2V0QWdncmVnYXRlZFJvbGUoKTsKLQotfSAvLyBDb21wb3NpdGVSb2xlClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0NvbmNlcHQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9Db25jZXB0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyYTMyMmUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0NvbmNlcHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogQ29uY2VwdC5qYXZhLHYgMS4xIDIwMDgvMDEvMTUgMDg6NTI6MDcganRoYW0gRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYTsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Db25jZXB0PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQSBzcGVjaWZpYyB0eXBlIG9mIGd1aWRhbmNlIHRoYXQgb3V0bGluZXMga2V5IGlkZWFzIGFzc29jaWF0ZWQgd2l0aCBiYXNpYyBwcmluY2lwbGVzIHVuZGVybHlpbmcgdGhlIHJlZmVyZW5jZWQgaXRlbS4gQ29uY2VwdHMgbm9ybWFsbHkgYWRkcmVzcyBtb3JlIGdlbmVyYWwgdG9waWNzIHRoYW4gR3VpZGVsaW5lcyBhbmQgc3BhbiBhY3Jvc3Mgc2V2LWVyYWwgd29yayBwcm9kdWN0IGFuZC9vciB0YXNrcy9hY3Rpdml0aWVzLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0Q29uY2VwdCgpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nQ29uY2VwdCcga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIENvbmNlcHQgZXh0ZW5kcyBHdWlkYW5jZSB7Ci19IC8vIENvbmNlcHQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvQ29uc3RyYWludC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0NvbnN0cmFpbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTc1NGVmNS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvQ29uc3RyYWludC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBDb25zdHJhaW50LmphdmEsdiAxLjIgMjAwOC8wMS8zMCAwMDo0MTo0OCBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWE7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Q29uc3RyYWludDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEEgZ2VuZXJhbGl6ZWQgTWV0aG9kIEVsZW1lbnQgdGhhdCByZXByZXNlbnRzIGEgY29uZGl0aW9uIG9yIHJlc3RyaWN0aW9uIGV4cHJlc3NlZCBpbiBuYXR1cmFsIGxhbmd1YWdlIHRleHQgb3IgaW4gYSBtYWNoaW5lIHJlYWRhYmxlIGxhbmd1YWdlIGZvciB0aGUgcHVycG9zZSBvZiBkZWNsYXJpbmcgc29tZSBvZiB0aGUgc2VtYW50aWNzIG9mIGEgTWV0aG9kIEVsZW1lbnQuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29uc3RyYWludCNnZXRNYWluRGVzY3JpcHRpb24gPGVtPk1haW4gRGVzY3JpcHRpb248L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0Q29uc3RyYWludCgpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nQ29uc3RyYWludCcga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIENvbnN0cmFpbnQgZXh0ZW5kcyBNZXRob2RFbGVtZW50IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5NYWluIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBTdG9yZXMgdGhlIG1haW4gZGVmaW5pdGlvbiBvZiB0aGUgY29uc3RyYWludC4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TWFpbiBEZXNjcmlwdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0TWFpbkRlc2NyaXB0aW9uKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0Q29uc3RyYWludF9NYWluRGVzY3JpcHRpb24oKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nYXR0cmlidXRlJyBuYW1lPSdtYWluRGVzY3JpcHRpb24nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0TWFpbkRlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db25zdHJhaW50I2dldE1haW5EZXNjcmlwdGlvbiA8ZW0+TWFpbiBEZXNjcmlwdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TWFpbiBEZXNjcmlwdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0TWFpbkRlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRNYWluRGVzY3JpcHRpb24oU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBDb25zdHJhaW50ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0NvbnRlbnRDYXRlZ29yeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0NvbnRlbnRDYXRlZ29yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMWM3ODE3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9Db250ZW50Q2F0ZWdvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogQ29udGVudENhdGVnb3J5LmphdmEsdiAxLjEgMjAwOC8wMS8xNSAwODo1MjowNiBqdGhhbSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkNvbnRlbnQgQ2F0ZWdvcnk8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBbiBhYnN0cmFjdCBjbGFzcyBnZW5lcmFsaXppbmcgY29udGVudCBjYXRlZ29yeSB0eXBlcy4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldENvbnRlbnRDYXRlZ29yeSgpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nQ29udGVudENhdGVnb3J5JyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ29udGVudENhdGVnb3J5IGV4dGVuZHMgQ29udGVudEVsZW1lbnQgewotfSAvLyBDb250ZW50Q2F0ZWdvcnkKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvQ29udGVudENhdGVnb3J5UGFja2FnZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0NvbnRlbnRDYXRlZ29yeVBhY2thZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2JkNDQ1NC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvQ29udGVudENhdGVnb3J5UGFja2FnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBDb250ZW50Q2F0ZWdvcnlQYWNrYWdlLmphdmEsdiAxLjIgMjAwOC8wMS8zMCAwMDo0MTo0OCBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Q29udGVudCBDYXRlZ29yeSBQYWNrYWdlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQSBzcGVjaWFsIE1ldGhvZCBQYWNrYWdlIHRoYXQgb25seSBjb250YWlucyBDb250ZW50IENhdGVnb3J5IEVsZW1lbnRzLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnRDYXRlZ29yeVBhY2thZ2UjZ2V0R3JvdXAyIDxlbT5Hcm91cDI8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnRDYXRlZ29yeVBhY2thZ2UjZ2V0Q29udGVudENhdGVnb3J5IDxlbT5Db250ZW50IENhdGVnb3J5PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldENvbnRlbnRDYXRlZ29yeVBhY2thZ2UoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J0NvbnRlbnRDYXRlZ29yeVBhY2thZ2UnIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBDb250ZW50Q2F0ZWdvcnlQYWNrYWdlIGV4dGVuZHMgTWV0aG9kUGFja2FnZSB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+R3JvdXAyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcC5FbnRyeX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Hcm91cDI8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Hcm91cDI8L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldENvbnRlbnRDYXRlZ29yeVBhY2thZ2VfR3JvdXAyKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRmVhdHVyZU1hcEVudHJ5IiBtYW55PSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdncm91cCcgbmFtZT0nZ3JvdXA6MTMnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlGZWF0dXJlTWFwIGdldEdyb3VwMigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q29udGVudCBDYXRlZ29yeTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnRDYXRlZ29yeX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Db250ZW50IENhdGVnb3J5PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q29udGVudCBDYXRlZ29yeTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0Q29udGVudENhdGVnb3J5UGFja2FnZV9Db250ZW50Q2F0ZWdvcnkoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQ29udGVudENhdGVnb3J5JyBncm91cD0nI2dyb3VwOjEzJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3Q8Q29udGVudENhdGVnb3J5PiBnZXRDb250ZW50Q2F0ZWdvcnkoKTsKLQotfSAvLyBDb250ZW50Q2F0ZWdvcnlQYWNrYWdlClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0NvbnRlbnREZXNjcmlwdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0NvbnRlbnREZXNjcmlwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NGY3NDRkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9Db250ZW50RGVzY3JpcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMCArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IENvbnRlbnREZXNjcmlwdGlvbi5qYXZhLHYgMS4yIDIwMDgvMDEvMzAgMDA6NDE6NDgga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Db250ZW50IERlc2NyaXB0aW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQSBnZW5lcmFsaXplZCBNZXRob2QgRWxlbWVudCB0aGF0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIHRleHR1YWwgZGVzY3JpcHRpb24gZm9yIGEgQ29udGVudCBFbGVtZW50LiAgSXQgZGVmaW5lcyBzdGFuZGFyZCBhdHRyaWJ1dGVzIGFwcGxpY2FibGUgZm9yIGFsbCBDb250ZW50IEVsZW1lbnQgdHlwZXMuICBTcGVjaWZpYyBDb250ZW50IEVsZW1lbnQgc3ViLXR5cGVzIGNhbiBkZWZpbmUgdGhlaXIgb3duIG1hdGNoaW5nIENvbnRlbnQgRGVzY3JpcHRpb24gc3ViLXR5cGVzLiAKLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db250ZW50RGVzY3JpcHRpb24jZ2V0TWFpbkRlc2NyaXB0aW9uIDxlbT5NYWluIERlc2NyaXB0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db250ZW50RGVzY3JpcHRpb24jZ2V0S2V5Q29uc2lkZXJhdGlvbnMgPGVtPktleSBDb25zaWRlcmF0aW9uczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudERlc2NyaXB0aW9uI2dldFNlY3Rpb24gPGVtPlNlY3Rpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnREZXNjcmlwdGlvbiNnZXRFeHRlcm5hbElkIDxlbT5FeHRlcm5hbCBJZDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRDb250ZW50RGVzY3JpcHRpb24oKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J0NvbnRlbnREZXNjcmlwdGlvbicga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIENvbnRlbnREZXNjcmlwdGlvbiBleHRlbmRzIE1ldGhvZFVuaXQgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1haW4gRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFN0b3JlcyB0aGUgbWFpbiBkZXNjcmlwdGl2ZSB0ZXh0IGZvciB0aGUgQ29udGVudCBFbGVtZW50LiAgQWxsIHRleHQgdGhhdCBpcyBub3QgcGFydCBvZiBhbnkgb2YgdGhlIG1vcmUgc3BlY2lmaWMgYXR0cmlidXRlcyBzaGFsbCBiZSBzdG9yZWQgaGVyZS4gIElmIHRoZSBDb250ZW50IERlc2NyaXB0aW9uIGlzIGRpdmlkZWQgaW50byBzZWN0aW9ucyB1c2luZyB0aGUgU2VjdGlvbiBjbGFzcywgdGhlbiBvbmx5IHRoZSB0ZXh0IGZyb20gdGhlICdzdGFydCcgb2YgdGhlIGNvbnRlbnQgZGVzY3JpcHRpb24gdG8gdGhlIGZpcnN0IHNlY3Rpb24gd2lsbCBiZSBzdG9yZWQgaGVyZSAoc2ltaWxhciB0byBhIG5vcm1hbCBkb2N1bWVudCB3aGVyZSB5b3UgY2FuIHBsYWNlIHRleHQgYmV0d2VlbiBpdHMgYmVnaW5uaW5nIHRvIGl0cyBmaXJzdCBkaWN0aW9uIGhlYWRpbmcpLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NYWluIERlc2NyaXB0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRNYWluRGVzY3JpcHRpb24oU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRDb250ZW50RGVzY3JpcHRpb25fTWFpbkRlc2NyaXB0aW9uKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J01haW5EZXNjcmlwdGlvbiciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRNYWluRGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnREZXNjcmlwdGlvbiNnZXRNYWluRGVzY3JpcHRpb24gPGVtPk1haW4gRGVzY3JpcHRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk1haW4gRGVzY3JpcHRpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldE1haW5EZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TWFpbkRlc2NyaXB0aW9uKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5LZXkgQ29uc2lkZXJhdGlvbnM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFByb3ZpZGVzIGFkdmlzZSBhbmQgZ3VpZGFuY2Ugb2YgYSBjcml0aWNhbCBuYXR1cmUgZm9yIHRoZSBjb250ZW50IGVsZW1lbnQgYXMgd2VsbCBhcyB3YXJuaW5ncywgY2F1dGlvbnMsIHBpdGZhbGxzLCBkYW5nZXJzLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5LZXkgQ29uc2lkZXJhdGlvbnM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEtleUNvbnNpZGVyYXRpb25zKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0Q29udGVudERlc2NyaXB0aW9uX0tleUNvbnNpZGVyYXRpb25zKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0tleUNvbnNpZGVyYXRpb25zJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldEtleUNvbnNpZGVyYXRpb25zKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db250ZW50RGVzY3JpcHRpb24jZ2V0S2V5Q29uc2lkZXJhdGlvbnMgPGVtPktleSBDb25zaWRlcmF0aW9uczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+S2V5IENvbnNpZGVyYXRpb25zPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRLZXlDb25zaWRlcmF0aW9ucygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0S2V5Q29uc2lkZXJhdGlvbnMoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlNlY3Rpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5TZWN0aW9ufS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlNlY3Rpb248L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TZWN0aW9uPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRDb250ZW50RGVzY3JpcHRpb25fU2VjdGlvbigpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdTZWN0aW9uJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3Q8U2VjdGlvbj4gZ2V0U2VjdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RXh0ZXJuYWwgSWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIEFuIGV4dGVybmFsIHZpc2libGUgbnVtYmVyIHRoYXQgaXMgdXNlZCB0byByZWZlcmVuY2UgdGhpcyBhcnRpZmFjdC4gVXNlZCBsaWtlIGEgc3lub255bS4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RXh0ZXJuYWwgSWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEV4dGVybmFsSWQoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRDb250ZW50RGVzY3JpcHRpb25fRXh0ZXJuYWxJZCgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdhdHRyaWJ1dGUnIG5hbWU9J2V4dGVybmFsSWQnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0RXh0ZXJuYWxJZCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudERlc2NyaXB0aW9uI2dldEV4dGVybmFsSWQgPGVtPkV4dGVybmFsIElkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5FeHRlcm5hbCBJZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0RXh0ZXJuYWxJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RXh0ZXJuYWxJZChTdHJpbmcgdmFsdWUpOwotCi19IC8vIENvbnRlbnREZXNjcmlwdGlvbgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9Db250ZW50RWxlbWVudC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0NvbnRlbnRFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkMDYyOGQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0NvbnRlbnRFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjQgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBDb250ZW50RWxlbWVudC5qYXZhLHYgMS4yIDIwMDgvMDEvMzAgMDA6NDE6NDgga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXA7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkNvbnRlbnQgRWxlbWVudDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEEgRGVzY3JpYmFibGUgRWxlbWVudCB0aGF0IHJlcHJlc2VudHMgYW4gYWJzdHJhY3QgZ2VuZXJhbGl6YXRpb24gZm9yIGFsbCBlbGVtZW50cyB0aGF0IGFyZSBjb25zaWRlcmVkIHRvIGJlIGFuZCBtYW5hZ2VkIGFzIE1ldGhvZCBDb250ZW50LgotICogQ29udGVudCBFbGVtZW50cyByZXByZXNlbnRzIHJldXNhYmxlIE1ldGhvZCBDb250ZW50IHRoYXQgaXMgc3VwcG9zZWQgdG8gYmUgbWFuYWdlZCBpbiBDb250ZW50IFBhY2thZ2VzLiAgVGhlIHNlcGFyYXRpb24gb2YgQ29udGVudCBFbGVtZW50IGZyb20gUHJvY2VzcyBFbGVtZW50IGFsbG93cyB0byBjbGVhcmx5IGRpc3Rpbmd1aXNoIGJldHdlZW4gcHVyZSBtZXRob2QgY29udGVudCBmcm9tIGNvbnRlbnQgdGhhdCBpcyByZXByZXNlbnRlZCBpbiBwcm9jZXNzZXMuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudEVsZW1lbnQjZ2V0R3JvdXAxIDxlbT5Hcm91cDE8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnRFbGVtZW50I2dldENoZWNrbGlzdCA8ZW0+Q2hlY2tsaXN0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db250ZW50RWxlbWVudCNnZXRDb25jZXB0IDxlbT5Db25jZXB0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db250ZW50RWxlbWVudCNnZXRFeGFtcGxlIDxlbT5FeGFtcGxlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db250ZW50RWxlbWVudCNnZXRHdWlkZWxpbmUgPGVtPkd1aWRlbGluZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudEVsZW1lbnQjZ2V0UmV1c2FibGVBc3NldCA8ZW0+UmV1c2FibGUgQXNzZXQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnRFbGVtZW50I2dldFN1cHBvcnRpbmdNYXRlcmlhbCA8ZW0+U3VwcG9ydGluZyBNYXRlcmlhbDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudEVsZW1lbnQjZ2V0V2hpdGVwYXBlciA8ZW0+V2hpdGVwYXBlcjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudEVsZW1lbnQjZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCA8ZW0+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudEVsZW1lbnQjZ2V0VmFyaWFiaWxpdHlUeXBlIDxlbT5WYXJpYWJpbGl0eSBUeXBlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldENvbnRlbnRFbGVtZW50KCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdDb250ZW50RWxlbWVudCcga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIENvbnRlbnRFbGVtZW50IGV4dGVuZHMgRGVzY3JpYmFibGVFbGVtZW50IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Hcm91cDE8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwLkVudHJ5fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkdyb3VwMTwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkdyb3VwMTwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0Q29udGVudEVsZW1lbnRfR3JvdXAxKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRmVhdHVyZU1hcEVudHJ5IiBtYW55PSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdncm91cCcgbmFtZT0nZ3JvdXA6MTQnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlGZWF0dXJlTWFwIGdldEdyb3VwMSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q2hlY2tsaXN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5DaGVja2xpc3Q8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5DaGVja2xpc3Q8L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldENvbnRlbnRFbGVtZW50X0NoZWNrbGlzdCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIiB0cmFuc2llbnQ9InRydWUiIHZvbGF0aWxlPSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdDaGVja2xpc3QnIGdyb3VwPScjZ3JvdXA6MTQnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdDxTdHJpbmc+IGdldENoZWNrbGlzdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q29uY2VwdDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q29uY2VwdDwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNvbmNlcHQ8L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldENvbnRlbnRFbGVtZW50X0NvbmNlcHQoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQ29uY2VwdCcgZ3JvdXA9JyNncm91cDoxNCciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0PFN0cmluZz4gZ2V0Q29uY2VwdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RXhhbXBsZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RXhhbXBsZTwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkV4YW1wbGU8L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldENvbnRlbnRFbGVtZW50X0V4YW1wbGUoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nRXhhbXBsZScgZ3JvdXA9JyNncm91cDoxNCciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0PFN0cmluZz4gZ2V0RXhhbXBsZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+R3VpZGVsaW5lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5HdWlkZWxpbmU8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5HdWlkZWxpbmU8L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldENvbnRlbnRFbGVtZW50X0d1aWRlbGluZSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIiB0cmFuc2llbnQ9InRydWUiIHZvbGF0aWxlPSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdHdWlkZWxpbmUnIGdyb3VwPScjZ3JvdXA6MTQnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdDxTdHJpbmc+IGdldEd1aWRlbGluZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmV1c2FibGUgQXNzZXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlJldXNhYmxlIEFzc2V0PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmV1c2FibGUgQXNzZXQ8L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldENvbnRlbnRFbGVtZW50X1JldXNhYmxlQXNzZXQoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nUmV1c2FibGVBc3NldCcgZ3JvdXA9JyNncm91cDoxNCciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0PFN0cmluZz4gZ2V0UmV1c2FibGVBc3NldCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U3VwcG9ydGluZyBNYXRlcmlhbDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U3VwcG9ydGluZyBNYXRlcmlhbDwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlN1cHBvcnRpbmcgTWF0ZXJpYWw8L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldENvbnRlbnRFbGVtZW50X1N1cHBvcnRpbmdNYXRlcmlhbCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIiB0cmFuc2llbnQ9InRydWUiIHZvbGF0aWxlPSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdTdXBwb3J0aW5nTWF0ZXJpYWwnIGdyb3VwPScjZ3JvdXA6MTQnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdDxTdHJpbmc+IGdldFN1cHBvcnRpbmdNYXRlcmlhbCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+V2hpdGVwYXBlcjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+V2hpdGVwYXBlcjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPldoaXRlcGFwZXI8L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldENvbnRlbnRFbGVtZW50X1doaXRlcGFwZXIoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nV2hpdGVwYXBlcicgZ3JvdXA9JyNncm91cDoxNCciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0PFN0cmluZz4gZ2V0V2hpdGVwYXBlcigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0Q29udGVudEVsZW1lbnRfVmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdhdHRyaWJ1dGUnIG5hbWU9J3ZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudEVsZW1lbnQjZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCA8ZW0+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudChTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiJuYSI8L2NvZGU+LgotCSAqIFRoZSBsaXRlcmFscyBhcmUgZnJvbSB0aGUgZW51bWVyYXRpb24ge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlZhcmlhYmlsaXR5VHlwZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5WYXJpYWJpbGl0eSBUeXBlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlZhcmlhYmlsaXR5IFR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVmFyaWFiaWxpdHlUeXBlCi0JICogQHNlZSAjaXNTZXRWYXJpYWJpbGl0eVR5cGUoKQotCSAqIEBzZWUgI3Vuc2V0VmFyaWFiaWxpdHlUeXBlKCkKLQkgKiBAc2VlICNzZXRWYXJpYWJpbGl0eVR5cGUoVmFyaWFiaWxpdHlUeXBlKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRDb250ZW50RWxlbWVudF9WYXJpYWJpbGl0eVR5cGUoKQotCSAqIEBtb2RlbCBkZWZhdWx0PSJuYSIgdW5zZXR0YWJsZT0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nYXR0cmlidXRlJyBuYW1lPSd2YXJpYWJpbGl0eVR5cGUnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlWYXJpYWJpbGl0eVR5cGUgZ2V0VmFyaWFiaWxpdHlUeXBlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db250ZW50RWxlbWVudCNnZXRWYXJpYWJpbGl0eVR5cGUgPGVtPlZhcmlhYmlsaXR5IFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlZhcmlhYmlsaXR5IFR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVmFyaWFiaWxpdHlUeXBlCi0JICogQHNlZSAjaXNTZXRWYXJpYWJpbGl0eVR5cGUoKQotCSAqIEBzZWUgI3Vuc2V0VmFyaWFiaWxpdHlUeXBlKCkKLQkgKiBAc2VlICNnZXRWYXJpYWJpbGl0eVR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFZhcmlhYmlsaXR5VHlwZShWYXJpYWJpbGl0eVR5cGUgdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db250ZW50RWxlbWVudCNnZXRWYXJpYWJpbGl0eVR5cGUgPGVtPlZhcmlhYmlsaXR5IFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0VmFyaWFiaWxpdHlUeXBlKCkKLQkgKiBAc2VlICNnZXRWYXJpYWJpbGl0eVR5cGUoKQotCSAqIEBzZWUgI3NldFZhcmlhYmlsaXR5VHlwZShWYXJpYWJpbGl0eVR5cGUpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRWYXJpYWJpbGl0eVR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudEVsZW1lbnQjZ2V0VmFyaWFiaWxpdHlUeXBlIDxlbT5WYXJpYWJpbGl0eSBUeXBlPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5WYXJpYWJpbGl0eSBUeXBlPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRWYXJpYWJpbGl0eVR5cGUoKQotCSAqIEBzZWUgI2dldFZhcmlhYmlsaXR5VHlwZSgpCi0JICogQHNlZSAjc2V0VmFyaWFiaWxpdHlUeXBlKFZhcmlhYmlsaXR5VHlwZSkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldFZhcmlhYmlsaXR5VHlwZSgpOwotCi19IC8vIENvbnRlbnRFbGVtZW50ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0NvbnRlbnRQYWNrYWdlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvQ29udGVudFBhY2thZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjhlZmFiNS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvQ29udGVudFBhY2thZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogQ29udGVudFBhY2thZ2UuamF2YSx2IDEuMiAyMDA4LzAxLzMwIDAwOjQxOjQ4IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Db250ZW50IFBhY2thZ2U8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIHNwZWNpYWwgTWV0aG9kIFBhY2thZ2UgdGhhdCBjb250YWlucyBDb250ZW50IEVsZW1lbnRzIGFuZCBDb250ZW50IEVsZW1lbnRzLCBvbmx5LiAgRXhhbXBsZXMgZm9yIENvbnRlbnQgRWxlbWVudCBhcmUgQXJ0aWZhY3RzLCBUYXNrcywgUm9sZXMsIGV0Yy4gIEEga2V5IHNlcGFyYXRpb24gb2YgY29uY2VybnMgaW4gVU1BIGlzIHRoZSBkaXN0aW5jdGlvbiBiZXR3ZWVuIE1ldGhvZCBDb250ZW50IGFuZCBQcm9jZXNzLiAgVGhpcyBzZXBhcmF0aW9uIGlzIGVuZm9yY2VkIGJ5IHNwZWNpYWwgcGFja2FnZSB0eXBlcywgd2hpY2ggZG8gbm90IGFsbG93IHRoZSBtaXhpbmcgb2YgbWV0aG9kIGNvbnRlbnQgd2l0aCBwcm9jZXNzZXMuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudFBhY2thZ2UjZ2V0R3JvdXAyIDxlbT5Hcm91cDI8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnRQYWNrYWdlI2dldENvbnRlbnRFbGVtZW50IDxlbT5Db250ZW50IEVsZW1lbnQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0Q29udGVudFBhY2thZ2UoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J0NvbnRlbnRQYWNrYWdlJyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ29udGVudFBhY2thZ2UgZXh0ZW5kcyBNZXRob2RQYWNrYWdlIHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Hcm91cDI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwLkVudHJ5fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkdyb3VwMjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkdyb3VwMjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0Q29udGVudFBhY2thZ2VfR3JvdXAyKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRmVhdHVyZU1hcEVudHJ5IiBtYW55PSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdncm91cCcgbmFtZT0nZ3JvdXA6MTMnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlGZWF0dXJlTWFwIGdldEdyb3VwMigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q29udGVudCBFbGVtZW50PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudEVsZW1lbnR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q29udGVudCBFbGVtZW50PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q29udGVudCBFbGVtZW50PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRDb250ZW50UGFja2FnZV9Db250ZW50RWxlbWVudCgpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIHZvbGF0aWxlPSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdDb250ZW50RWxlbWVudCcgZ3JvdXA9JyNncm91cDoxMyciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0PENvbnRlbnRFbGVtZW50PiBnZXRDb250ZW50RWxlbWVudCgpOwotCi19IC8vIENvbnRlbnRQYWNrYWdlClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0N1c3RvbUNhdGVnb3J5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvQ3VzdG9tQ2F0ZWdvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjEzOTg4NC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvQ3VzdG9tQ2F0ZWdvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogQ3VzdG9tQ2F0ZWdvcnkuamF2YSx2IDEuMiAyMDA4LzAxLzMwIDAwOjQxOjQ4IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5DdXN0b20gQ2F0ZWdvcnk8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIGNhdGVnb3J5IGludHJvZHVjZWQgYnkgYSBtZXRob2QgY29udGVudCBhdXRob3IgdG8gc3RydWN0dXJlIGFueSBudW1iZXIgb2YgbWV0aG9kIENvbnRlbnQgRWxlbWVudHMgb2YgYW55IHN1YnR5cGUgYmFzZWQgb24gdXNlci1kZWZpbmVkIGNyaXRlcmlhLiAgQmVjYXVzZSBDb250ZW50IENhdGVnb3JpZXMgKGFuZCB0aGVyZWZvcmUgQ3VzdG9tIENhdGVnb3JpZXMsIHRvbykgYXJlIENvbnRlbnQgRWxlbWVudHMgdGhlbXNlbHZlcywgQ3VzdG9tIENhdGVnb3JpZXMgY2FuIGJlIHVzZWQgdG8gcmVjdXJzaXZlbHkgY2F0ZWdvcml6ZSBDb250ZW50IENhdGVnb3JpZXMgYXMgd2VsbC4gIEN1c3RvbSBDYXRlZ29yaWVzIGNhbiBhbHNvIGJlIG5lc3RlZCB3aXRoIGFueSBDb250ZW50IENhdGVnb3J5LiAgQ3VzdG9tIGNhdGVnb3JpZXMgY2FuIGJlIHVzZWQgdG8gY2F0ZWdvcml6ZSBjb250ZW50IGJhc2VkIG9uIHRoZSB1c2VyJ3MgY3JpdGVyaWEgYXMgd2VsbCBhcyB0byBkZWZpbmUgd2hvbGUgdHJlZS1zdHJ1Y3R1cmVzIG9mIG5lc3RlZCBjYXRlZ29yaWVzIGFsbG93aW5nIHRoZSB1c2VyIHRvIHN5c3RlbWF0aWNhbGx5IG5hdmlnYXRlIGFuZCBicm93c2UgbWV0aG9kIGNvbnRlbnQgYW5kIHByb2Nlc3NlcyBiYXNlZCBvbiB0aGVzZSBjYXRlZ29yaWVzLiAgRm9yIGV4YW1wbGUsIG9uZSBjb3VsZCBjcmVhdGUgYSBjdXN0b20gY2F0ZWdvcnkgdG8gbG9naWNhbGx5IG9yZ2FuaXplIGNvbnRlbnQgcmVsZXZhbnQgZm9yIHRoZSB1c2VyJ3MgZGV2ZWxvcG1lbnQgb3JnYW5pemF0aW9uIGRlcGFydG1lbnRzOyBlLmcuIGEgIlRlc3RpbmciIGNhdGVnb3J5IHRoYXQgZ3JvdXBzIHRvZ2V0aGVyIGFsbCByb2xlcywgd29yayBwcm9kdWN0cywgdGFza3MsIGFuZCBndWlkYW5jZSBlbGVtZW50IHJlbGV2YW50IHRvIHRlc3RpbmcuICBBbm90aGVyIGV4YW1wbGUgd291bGQgYmUgY2F0ZWdvcmllcyB0aGF0IGV4cHJlc3MgbGljZW5zaW5nIGxldmVscyBvZiB0aGUgY29udGVudCBncm91cGluZyBmcmVlbHkgZGlzdHJpYnV0YWJsZSBtZXRob2QgY29udGVudCB2ZXJzdXMgY29udGVudCB0aGF0IHJlcHJlc2VudCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgYW5kIHJlcXVpcmVzIGEgbGljZW5zZSB0byBiZSBwdXJjaGFzZWQgdG8gYmUgYWJsZSB0byB1c2UgaXQuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ3VzdG9tQ2F0ZWdvcnkjZ2V0R3JvdXAyIDxlbT5Hcm91cDI8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkN1c3RvbUNhdGVnb3J5I2dldENhdGVnb3JpemVkRWxlbWVudCA8ZW0+Q2F0ZWdvcml6ZWQgRWxlbWVudDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ3VzdG9tQ2F0ZWdvcnkjZ2V0U3ViQ2F0ZWdvcnkgPGVtPlN1YiBDYXRlZ29yeTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRDdXN0b21DYXRlZ29yeSgpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nQ3VzdG9tQ2F0ZWdvcnknIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBDdXN0b21DYXRlZ29yeSBleHRlbmRzIENvbnRlbnRDYXRlZ29yeSB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+R3JvdXAyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcC5FbnRyeX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Hcm91cDI8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Hcm91cDI8L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldEN1c3RvbUNhdGVnb3J5X0dyb3VwMigpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUZlYXR1cmVNYXBFbnRyeSIgbWFueT0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZ3JvdXAnIG5hbWU9J2dyb3VwOjI0JyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRmVhdHVyZU1hcCBnZXRHcm91cDIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNhdGVnb3JpemVkIEVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNhdGVnb3JpemVkIEVsZW1lbnQ8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5DYXRlZ29yaXplZCBFbGVtZW50PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRDdXN0b21DYXRlZ29yeV9DYXRlZ29yaXplZEVsZW1lbnQoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQ2F0ZWdvcml6ZWRFbGVtZW50JyBncm91cD0nI2dyb3VwOjI0JyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3Q8U3RyaW5nPiBnZXRDYXRlZ29yaXplZEVsZW1lbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlN1YiBDYXRlZ29yeTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U3ViIENhdGVnb3J5PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U3ViIENhdGVnb3J5PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRDdXN0b21DYXRlZ29yeV9TdWJDYXRlZ29yeSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIiB0cmFuc2llbnQ9InRydWUiIHZvbGF0aWxlPSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdTdWJDYXRlZ29yeScgZ3JvdXA9JyNncm91cDoyNCciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0PFN0cmluZz4gZ2V0U3ViQ2F0ZWdvcnkoKTsKLQotfSAvLyBDdXN0b21DYXRlZ29yeQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9EZWxpdmVyYWJsZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0RlbGl2ZXJhYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4Zjc3MjYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0RlbGl2ZXJhYmxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IERlbGl2ZXJhYmxlLmphdmEsdiAxLjIgMjAwOC8wMS8zMCAwMDo0MTo0OCBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RGVsaXZlcmFibGU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIFdvcmsgUHJvZHVjdCB0aGF0IHByb3ZpZGVzIGEgZGVzY3JpcHRpb24gYW5kIGRlZmluaXRpb24gZm9yIHBhY2thZ2luZyBvdGhlciBXb3JrIFByb2R1Y3RzLCBhbmQgbWF5IGJlIGRlbGl2ZXJlZCB0byBhbiBpbnRlcm5hbCBvciBleHRlcm5hbCBwYXJ0eS4gIFRoZXJlZm9yZSwgYSBEZWxpdmVyYWJsZSBhZ2dyZWdhdGVzIG90aGVyIFdvcmsgUHJvZHVjdHMuIFRoZXJlZm9yZSwgYSBEZWxpdmVyYWJsZSBhZ2dyZWdhdGVzIG90aGVyIFdvcmsgUHJvZHVjdHMuICBBIERlbGl2ZXJhYmxlIGlzIHVzZWQgdG8gcHJlLWRlZmluZSB0eXBpY2FsIG9yIHJlY29tbWVuZGVkIGNvbnRlbnQgaW4gdGhlIGZvcm0gb3Igd29yayBwcm9kdWN0cyB0aGF0IHdvdWxkIGJlIHBhY2thZ2VkIGZvciBkZWxpdmVyeS4gIFRoZSBhY3R1YWwgcGFja2FnaW5nIG9mIHRoZSBEZWxpdmVyYWJsZSBpbiBhbiBhY3R1YWwgcHJvY2VzcyBvciBldmVuIHByb2plY3QgY291bGQgYmUgYSBtb2RpZmljYXRpb24gb2YgdGhpcyByZWNvbW1lbmRhdGlvbi4gIERlbGl2ZXJhYmxlcyBhcmUgdXNlZCB0byByZXByZXNlbnQgYW4gb3V0cHV0IGZyb20gYSBwcm9jZXNzIHRoYXQgaGFzIHZhbHVlLCBtYXRlcmlhbCBvciBvdGhlcndpc2UsIHRvIGEgY2xpZW50LCBjdXN0b21lciBvciBvdGhlciBzdGFrZWhvbGRlci4gCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVsaXZlcmFibGUjZ2V0R3JvdXAzIDxlbT5Hcm91cDM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlbGl2ZXJhYmxlI2dldERlbGl2ZXJlZFdvcmtQcm9kdWN0IDxlbT5EZWxpdmVyZWQgV29yayBQcm9kdWN0PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldERlbGl2ZXJhYmxlKCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdEZWxpdmVyYWJsZScga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIERlbGl2ZXJhYmxlIGV4dGVuZHMgV29ya1Byb2R1Y3QgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkdyb3VwMzwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXAuRW50cnl9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+R3JvdXAzPC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+R3JvdXAzPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXREZWxpdmVyYWJsZV9Hcm91cDMoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVGZWF0dXJlTWFwRW50cnkiIG1hbnk9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2dyb3VwJyBuYW1lPSdncm91cDozMCciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUZlYXR1cmVNYXAgZ2V0R3JvdXAzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EZWxpdmVyZWQgV29yayBQcm9kdWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5EZWxpdmVyZWQgV29yayBQcm9kdWN0PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGVsaXZlcmVkIFdvcmsgUHJvZHVjdDwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0RGVsaXZlcmFibGVfRGVsaXZlcmVkV29ya1Byb2R1Y3QoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nRGVsaXZlcmVkV29ya1Byb2R1Y3QnIGdyb3VwPScjZ3JvdXA6MzAnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdDxTdHJpbmc+IGdldERlbGl2ZXJlZFdvcmtQcm9kdWN0KCk7Ci0KLX0gLy8gRGVsaXZlcmFibGUKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvRGVsaXZlcmFibGVEZXNjcmlwdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0RlbGl2ZXJhYmxlRGVzY3JpcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzc1NmM5NS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvRGVsaXZlcmFibGVEZXNjcmlwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBEZWxpdmVyYWJsZURlc2NyaXB0aW9uLmphdmEsdiAxLjIgMjAwOC8wMS8zMCAwMDo0MTo0OCBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWE7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RGVsaXZlcmFibGUgRGVzY3JpcHRpb248L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIGdlbmVyYWxpemVkIFdvcmsgUHJvZHVjdCBEZXNjcmlwdGlvbiB0aGF0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIHRleHR1YWwgZGVzY3JpcHRpb24gZm9yIGEgRGVsaXZlcmFibGUuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVsaXZlcmFibGVEZXNjcmlwdGlvbiNnZXRFeHRlcm5hbERlc2NyaXB0aW9uIDxlbT5FeHRlcm5hbCBEZXNjcmlwdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVsaXZlcmFibGVEZXNjcmlwdGlvbiNnZXRQYWNrYWdpbmdHdWlkYW5jZSA8ZW0+UGFja2FnaW5nIEd1aWRhbmNlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldERlbGl2ZXJhYmxlRGVzY3JpcHRpb24oKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J0RlbGl2ZXJhYmxlRGVzY3JpcHRpb24nIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBEZWxpdmVyYWJsZURlc2NyaXB0aW9uIGV4dGVuZHMgV29ya1Byb2R1Y3REZXNjcmlwdGlvbiB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RXh0ZXJuYWwgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgRGVsaXZlcmFibGUgdXNlZCBmb3IgY2xpZW50IGRvY3VtZW50cyAocHJvcG9zYWwsIHN0YXRlbWVudHMgb2Ygd29yayBvciBjb250cmFjdHVhbCBhZ3JlZW1lbnRzKS4gIEl0IG1pZ2h0IHVzZSBhIGRpZmZlcmVudCBsYW5ndWFnZSBhbmQgZm9sbG93IGxlZ2FsIGNvbnN0cmFpbnRzLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FeHRlcm5hbCBEZXNjcmlwdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0RXh0ZXJuYWxEZXNjcmlwdGlvbihTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldERlbGl2ZXJhYmxlRGVzY3JpcHRpb25fRXh0ZXJuYWxEZXNjcmlwdGlvbigpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdFeHRlcm5hbERlc2NyaXB0aW9uJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldEV4dGVybmFsRGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlbGl2ZXJhYmxlRGVzY3JpcHRpb24jZ2V0RXh0ZXJuYWxEZXNjcmlwdGlvbiA8ZW0+RXh0ZXJuYWwgRGVzY3JpcHRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkV4dGVybmFsIERlc2NyaXB0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRFeHRlcm5hbERlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRFeHRlcm5hbERlc2NyaXB0aW9uKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QYWNrYWdpbmcgR3VpZGFuY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFByb3ZpZGVzIGd1aWRhbmNlIG9uIGhvdyB0byBhc3NlbWJsZSB0aGUgZGVsaXZlcmFibGUgZnJvbSBhbGwgaXRzIHJlcXVpcmVkIGlucHV0cy4gIFRoaXMgc2VjdGlvbiBkZXNjcmliZXMgdGhlIG1vc3QgY29tbW9uIGNvbnRlbnQgbWVkaXVtIGFuZCBmb3JtYXQuICBEaXN0cmlidXRpb24gb2YgdGhlIGRlbGl2ZXJhYmxlIGlzIGFkZHJlc3NlZCBpbiB0aGlzIHNlY3Rpb24sIGlmIG5lY2Vzc2FyeS4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UGFja2FnaW5nIEd1aWRhbmNlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRQYWNrYWdpbmdHdWlkYW5jZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldERlbGl2ZXJhYmxlRGVzY3JpcHRpb25fUGFja2FnaW5nR3VpZGFuY2UoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nUGFja2FnaW5nR3VpZGFuY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0UGFja2FnaW5nR3VpZGFuY2UoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlbGl2ZXJhYmxlRGVzY3JpcHRpb24jZ2V0UGFja2FnaW5nR3VpZGFuY2UgPGVtPlBhY2thZ2luZyBHdWlkYW5jZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UGFja2FnaW5nIEd1aWRhbmNlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRQYWNrYWdpbmdHdWlkYW5jZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UGFja2FnaW5nR3VpZGFuY2UoU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBEZWxpdmVyYWJsZURlc2NyaXB0aW9uClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0RlbGl2ZXJ5UHJvY2Vzcy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0RlbGl2ZXJ5UHJvY2Vzcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMTQ0YzkwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9EZWxpdmVyeVByb2Nlc3MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogRGVsaXZlcnlQcm9jZXNzLmphdmEsdiAxLjIgMjAwOC8wMS8zMCAwMDo0MTo0OCBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RGVsaXZlcnkgUHJvY2VzczwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEEgc3BlY2lhbCBQcm9jZXNzIGRlc2NyaWJpbmcgYSBjb21wbGV0ZSBhbmQgaW50ZWdyYXRlZCBhcHByb2FjaCBmb3IgcGVyZm9ybWluZyBhIHNwZWNpZmljIHByb2plY3QgdHlwZS4gIEl0IGRlc2NyaWJlcyBhIGNvbXBsZXRlIHByb2plY3QgbGlmZWN5Y2xlIGVuZC10by1lbmQgYW5kIHNoYWxsIGJlIHVzZWQgYXMgYSByZWZlcmVuY2UgZm9yIHJ1bm5pbmcgcHJvamVjdHMgd2l0aCBzaW1pbGFyIGNoYXJhY3RlcmlzdGljcyBhcyBkZWZpbmVkIGZvciB0aGUgcHJvY2Vzcy4gIEEgRGVsaXZlcnkgUHJvY2VzcyBpcyByZWxhdGVkIHRvIHNwZWNpZmljIHN1cHBvcnRpbmcgaW5mb3JtYXRpb24gc3VjaCBhcyBSb2FkbWFwcyAoaW5oZXJpdGVkIHZpYSBBY3Rpdml0eSkgYXMgd2VsbCBhcyBDb21tdW5pY2F0aW9ucyBhbmQgRWR1Y2F0aW9uIE1hdGVyaWFsLgotICogQSBEZWxpdmVyeSBQcm9jZXNzIGlzIGEgUHJvY2VzcyB0aGF0IGNvdmVycyBhIHdob2xlIGRldmVsb3BtZW50IGxpZmVjeWNsZSBmcm9tIGJlZ2lubmluZyB0byBlbmQuICBBIERlbGl2ZXJ5IFByb2Nlc3Mgc2hhbGwgYmUgdXNlZCBhcyBhIHRlbXBsYXRlIGZvciBwbGFubmluZyBhbmQgcnVubmluZyBhIHByb2plY3QuICBJdCBwcm92aWRlcyBhIGNvbXBsZXRlIGxpZmVjeWNsZSBtb2RlbCB3aXRoIHByZWRlZmluZWQgcGhhc2VzLCBpdGVyYXRpb25zLCBhbmQgYWN0aXZpdGllcyB0aGF0IGhhdmUgYmVlbiBkZXRhaWxlZCBieSBzZXF1ZW5jaW5nIHJlZmVyZW5jaW5nIG1ldGhvZCBjb250ZW50IGluIGJyZWFrZG93biBzdHJ1Y3R1cmVzLiAgSXQgaXMgZGVmaW5lZCBvbiB0aGUgYmFzaXMgb2YgZXhwZXJpZW5jZSB3aXRoIHBhc3QgcHJvamVjdHMgb3IgZW5nYWdlbWVudHMsIGFuZC9vciB0aGUgYmVzdCBwcmFjdGljZSB1c2Ugb2YgYSBkZXZlbG9wbWVudCBvciBkZWxpdmVyeSBhcHByb2FjaC4gIEl0IGRlZmluZXMgd2hhdCBnZXRzIHByb2R1Y2VkLCBob3cgdGhvc2UgaXRlbXMgYXJlIHByb2R1Y2VkLCBhbmQgdGhlIHJlcXVpcmVkIHN0YWZmaW5nIGluIHRoZSBmb3JtIG9mIGludGVncmF0ZWQgV29yaywgV29yayBQcm9kdWN0LCBhbmQgVGVhbSBCcmVha2Rvd24gU3RydWN0dXJlcy4gIEZvciBleGFtcGxlLCBhIHByb2Nlc3MgZW5naW5lZXIgY2FuIGRlZmluZSBhbHRlcm5hdGl2ZSBEZWxpdmVyeSBQcm9jZXNzZXMgZm9yIHNvZnR3YXJlIGRldmVsb3BtZW50IHByb2plY3RzIHRoYXQgZGlmZmVyIGluIHRoZSBzY2FsZSBvZiB0aGUgZW5nYWdlbWVudCBhbmQgc3RhZmZpbmcgbmVjZXNzYXJ5LCB0aGUgdHlwZSBvZiB0aGUgc29mdHdhcmUgYXBwbGljYXRpb24gdG8gYmUgZGV2ZWxvcGVkLCB0aGUgZGV2ZWxvcG1lbnQgbWV0aG9kcyBhbmQgdGVjaG5vbG9naWVzIHRvIGJlIHVzZWQsIGV0Yy4gIEFsdGhvdWdoLCB0aGUgRGVsaXZlcnkgUHJvY2VzcyBhaW1zIHRvIGNvdmVyIGEgd2hvbGUgcHJvamVjdCBpdCBrZWVwcyBjZXJ0YWluIGRlY2lzaW9uIHRoYXQgYXJlIHRvbyBwcm9qZWN0IHNwZWNpZmljIG9wZW4uICBGb3IgZXhhbXBsZSwgdGhlIGJyZWFrZG93biBzdHJ1Y3R1cmUgZGVmaW5lcyB3aGljaCBCcmVha2Rvd24gRWxlbWVudHMgaGF2ZSBtdWx0aXBsZSBvY2N1cnJlbmNlcyBvciBpcyByZXBlYXRhYmxlIHZpYSBpdCByZXNwZWN0aXZlIGF0dHJpYnV0ZXMsIGJ1dCBkb2VzIG5vdCBzYXkgaG93IG1hbnkgb2NjdXJyZW5jZXMgYW5kIGhvdyBtYW55IHJlcGVhdHMvaXRlcmF0aW9ucyBpdCB3aWxsIGhhdmUuICBUaGVzZSBkZWNpc2lvbnMgaGF2ZSB0byBiZSBkb25lIGJ5IGEgcHJvamVjdCBtYW5hZ2VyIHdoZW4gcGxhbm5pbmcgYSBjb25jcmV0ZSBwcm9qZWN0LCBwcm9qZWN0IHBoYXNlLCBvciBwcm9qZWN0IGl0ZXJhdGlvbnMuICBBIERlbGl2ZXJ5IFByb2Nlc3MgaXMgYWx3YXlzIGEgY29tcGxldGUgZGVzY3JpcHRpb24gb2YgYSBwcm9jZXNzIGluIHRlcm1zIG9mIGNvbXBsZXRlbmVzcyBvZiB0aGUgbGlmZWN5Y2xlLCBhcyB3ZWxsIGFzIGluIHRlcm1zIG9mIGFsbCB0aHJlZSB2aWV3cyBvbiB0aGUgcHJvY2VzcyB3aGljaCBhcmUgdGhlIFdvcmsgQnJlYWtkb3duIFN0cnVjdHVyZSwgV29yayBQcm9kdWN0IEJyZWFrZG93biBTdHJ1Y3R1cmUsIGFuZCBUZWFtIEJyZWFrZG93biBTdHJ1Y3R1cmUgaGF2ZSB0byBiZSBmdWxseSBhbmQgY29uc2lzdGVudGx5IHBvcHVsYXRlZC4gIENvbnNpc3RlbmN5IG9mIGEgRGVsaXZlcnkgUHJvY2VzcyBpcyBhY3R1YWxseSBlbnN1cmVkIGJ5IHRoZSBmYWN0IHRoYXQgYWxsIHRocmVlIGJyZWFrZG93bnMgYXJlIHJlcHJlc2VudGVkIGJ5IG9uZSBzaW5nbGUgZGF0YSBzdHJ1Y3R1cmUgYW5kIG9uZSBwYXJ0aWN1bGFyIGJyZWFrZG93biBzdWNoIGFzIFRlYW0gQnJlYWtkb3duIGlzIGp1c3QgYSB2aWV3IG9uIHRoYXQgZGF0YSBzdHJ1Y3R1cmUuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVsaXZlcnlQcm9jZXNzI2dldEdyb3VwNCA8ZW0+R3JvdXA0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZWxpdmVyeVByb2Nlc3MjZ2V0Q29tbXVuaWNhdGlvbnNNYXRlcmlhbCA8ZW0+Q29tbXVuaWNhdGlvbnMgTWF0ZXJpYWw8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlbGl2ZXJ5UHJvY2VzcyNnZXRFZHVjYXRpb25NYXRlcmlhbCA8ZW0+RWR1Y2F0aW9uIE1hdGVyaWFsPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldERlbGl2ZXJ5UHJvY2VzcygpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nRGVsaXZlcnlQcm9jZXNzJyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRGVsaXZlcnlQcm9jZXNzIGV4dGVuZHMgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2VzcyB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+R3JvdXA0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcC5FbnRyeX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Hcm91cDQ8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Hcm91cDQ8L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldERlbGl2ZXJ5UHJvY2Vzc19Hcm91cDQoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVGZWF0dXJlTWFwRW50cnkiIG1hbnk9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2dyb3VwJyBuYW1lPSdncm91cDo0NyciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUZlYXR1cmVNYXAgZ2V0R3JvdXA0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Db21tdW5pY2F0aW9ucyBNYXRlcmlhbDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q29tbXVuaWNhdGlvbnMgTWF0ZXJpYWw8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Db21tdW5pY2F0aW9ucyBNYXRlcmlhbDwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0RGVsaXZlcnlQcm9jZXNzX0NvbW11bmljYXRpb25zTWF0ZXJpYWwoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQ29tbXVuaWNhdGlvbnNNYXRlcmlhbCcgZ3JvdXA9JyNncm91cDo0NyciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0PFN0cmluZz4gZ2V0Q29tbXVuaWNhdGlvbnNNYXRlcmlhbCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RWR1Y2F0aW9uIE1hdGVyaWFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5FZHVjYXRpb24gTWF0ZXJpYWw8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FZHVjYXRpb24gTWF0ZXJpYWw8L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldERlbGl2ZXJ5UHJvY2Vzc19FZHVjYXRpb25NYXRlcmlhbCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIiB0cmFuc2llbnQ9InRydWUiIHZvbGF0aWxlPSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdFZHVjYXRpb25NYXRlcmlhbCcgZ3JvdXA9JyNncm91cDo0NyciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0PFN0cmluZz4gZ2V0RWR1Y2F0aW9uTWF0ZXJpYWwoKTsKLQotfSAvLyBEZWxpdmVyeVByb2Nlc3MKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NTA2YzY5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkyICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24uamF2YSx2IDEuMiAyMDA4LzAxLzMwIDAwOjQxOjQ4IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYTsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5EZWxpdmVyeSBQcm9jZXNzIERlc2NyaXB0aW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQSBnZW5lcmFsaXplZCBQcm9jZXNzIERlc2NyaXB0aW9uIHRoYXQgaXMgdXNlZCB0byBzdG9yZSB0aGUgdGV4dHVhbCBkZXNjcmlwdGlvbiBmb3IgYSBEZWxpdmVyeSBQcm9jZXNzLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uI2dldFNjYWxlIDxlbT5TY2FsZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24jZ2V0UHJvamVjdENoYXJhY3RlcmlzdGljcyA8ZW0+UHJvamVjdCBDaGFyYWN0ZXJpc3RpY3M8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uI2dldFJpc2tMZXZlbCA8ZW0+UmlzayBMZXZlbDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24jZ2V0RXN0aW1hdGluZ1RlY2huaXF1ZSA8ZW0+RXN0aW1hdGluZyBUZWNobmlxdWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uI2dldFByb2plY3RNZW1iZXJFeHBlcnRpc2UgPGVtPlByb2plY3QgTWVtYmVyIEV4cGVydGlzZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24jZ2V0VHlwZU9mQ29udHJhY3QgPGVtPlR5cGUgT2YgQ29udHJhY3Q8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24oKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uJyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24gZXh0ZW5kcyBQcm9jZXNzRGVzY3JpcHRpb24gewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlNjYWxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBPdXRsaW5lcyBjaGFyYWN0ZXJpc3RpY3MgYWJvdXQgdGhlIHNpemUgb2YgYSB0eXBpY2FsIHByb2plY3QgdGhhdCBwZXJmb3JtcyB0aGlzIHByb2plY3QgZXhwcmVzc2VkIGluIHRlYW0gc2l6ZSwgbWFuIHllYXJzLCBldGMuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlNjYWxlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRTY2FsZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX1NjYWxlKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1NjYWxlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFNjYWxlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbiNnZXRTY2FsZSA8ZW0+U2NhbGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlNjYWxlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRTY2FsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0U2NhbGUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlByb2plY3QgQ2hhcmFjdGVyaXN0aWNzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBDaGFyYWN0ZXJpemVzIHRoZSBwcm9qZWN0IHRoYXQgd291bGQgdHlwaWNhbGx5IHBlcmZvcm0gdGhpcyBQcm9jZXNzCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlByb2plY3QgQ2hhcmFjdGVyaXN0aWNzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRQcm9qZWN0Q2hhcmFjdGVyaXN0aWNzKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fUHJvamVjdENoYXJhY3RlcmlzdGljcygpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdQcm9qZWN0Q2hhcmFjdGVyaXN0aWNzJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFByb2plY3RDaGFyYWN0ZXJpc3RpY3MoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uI2dldFByb2plY3RDaGFyYWN0ZXJpc3RpY3MgPGVtPlByb2plY3QgQ2hhcmFjdGVyaXN0aWNzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Qcm9qZWN0IENoYXJhY3RlcmlzdGljczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UHJvamVjdENoYXJhY3RlcmlzdGljcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UHJvamVjdENoYXJhY3RlcmlzdGljcyhTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmlzayBMZXZlbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogT3V0bGluZXMgdHlwaWNhbCBwcm9qZWN0IHJpc2tzIHRoYXQgYXJlIGFkZHJlc3NlZCB3aXRoIHRoaXMgcHJvY2Vzcy4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmlzayBMZXZlbDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0Umlza0xldmVsKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fUmlza0xldmVsKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1Jpc2tMZXZlbCciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRSaXNrTGV2ZWwoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uI2dldFJpc2tMZXZlbCA8ZW0+UmlzayBMZXZlbDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UmlzayBMZXZlbDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0Umlza0xldmVsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRSaXNrTGV2ZWwoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkVzdGltYXRpbmcgVGVjaG5pcXVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBEZXNjcmliZXMgdGhlIEVzdGltYXRpb24gVGVjaG5pcXVlcyBwcm92aWRlZCBmb3IgdGhpcyBQcm9jZXNzLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Fc3RpbWF0aW5nIFRlY2huaXF1ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0RXN0aW1hdGluZ1RlY2huaXF1ZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX0VzdGltYXRpbmdUZWNobmlxdWUoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nRXN0aW1hdGluZ1RlY2huaXF1ZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRFc3RpbWF0aW5nVGVjaG5pcXVlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbiNnZXRFc3RpbWF0aW5nVGVjaG5pcXVlIDxlbT5Fc3RpbWF0aW5nIFRlY2huaXF1ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RXN0aW1hdGluZyBUZWNobmlxdWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEVzdGltYXRpbmdUZWNobmlxdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEVzdGltYXRpbmdUZWNobmlxdWUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlByb2plY3QgTWVtYmVyIEV4cGVydGlzZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogUHJvdmlkZXMgYSBwcm9maWxlIG9mIGEgdHlwaWNhbCBwcm9qZWN0IHRlYW0sIHRoZSBkaXN0cmlidXRpb24gb2Ygcm9sZXMsIHNraWxscyByZXF1aXJlZCBmb3IgYSB0ZWFtIHBlcmZvcm1zIGEgcHJvamVjdCBiYXNlZCBvbiB0aGlzIHByb2Nlc3MuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlByb2plY3QgTWVtYmVyIEV4cGVydGlzZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UHJvamVjdE1lbWJlckV4cGVydGlzZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX1Byb2plY3RNZW1iZXJFeHBlcnRpc2UoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nUHJvamVjdE1lbWJlckV4cGVydGlzZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRQcm9qZWN0TWVtYmVyRXhwZXJ0aXNlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbiNnZXRQcm9qZWN0TWVtYmVyRXhwZXJ0aXNlIDxlbT5Qcm9qZWN0IE1lbWJlciBFeHBlcnRpc2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlByb2plY3QgTWVtYmVyIEV4cGVydGlzZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UHJvamVjdE1lbWJlckV4cGVydGlzZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UHJvamVjdE1lbWJlckV4cGVydGlzZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VHlwZSBPZiBDb250cmFjdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogUHJvdmlkZXMgYmFja2dyb3VuZCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY29JJ20gY2hhSSdtIG50cmFjdHMgdGhhdCBuZWVkIHRvIGJlIGVzdGFibGlzaGVkIGJldHdlZW4gYSBwcm9qZWN0IHRlYW0gdGhhdCBwZXJmb3JtcyB0aGlzIHByb2Nlc3MgYW5kIGEgY2xpZW50IChlLmcuIGZvciBhbiBJR1MgZW5nYWdlbWVudCkuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlR5cGUgT2YgQ29udHJhY3Q8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFR5cGVPZkNvbnRyYWN0KFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fVHlwZU9mQ29udHJhY3QoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nVHlwZU9mQ29udHJhY3QnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0VHlwZU9mQ29udHJhY3QoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uI2dldFR5cGVPZkNvbnRyYWN0IDxlbT5UeXBlIE9mIENvbnRyYWN0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5UeXBlIE9mIENvbnRyYWN0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRUeXBlT2ZDb250cmFjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VHlwZU9mQ29udHJhY3QoU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBEZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9EZXNjcmliYWJsZUVsZW1lbnQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9EZXNjcmliYWJsZUVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTIzODlhNS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvRGVzY3JpYmFibGVFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODggKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBEZXNjcmliYWJsZUVsZW1lbnQuamF2YSx2IDEuMiAyMDA4LzAxLzMwIDAwOjQxOjQ4IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5EZXNjcmliYWJsZSBFbGVtZW50PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQW4gYWJzdHJhY3QgZ2VuZXJhbGl6YXRpb24gb2YgTWV0aG9kIEVsZW1lbnRzIGZvciB3aGljaCBleHRlcm5hbCBwcmVzZW50YXRpb24gbmFtZXMgYXMgd2VsbCBhcyBjb250ZW50IGRlc2NyaXB0aW9ucyBoYXZlIGJlZW4gZGVmaW5lZCwgc3VjaCBhcyBSb2xlcyBvciBXb3JrIFByb2R1Y3RzLiAgUHJlc2VudGF0aW9uIE5hbWUgYW5kIENvbnRlbnQgRGVzY3JpcHRpb25zIGFyZSB0eXBpY2FsbHkgbG9jYWxpemVkIHVzaW5nIGEgcmVzb3VyY2UgYWxsb2NhdGlvbiBtZWNoYW5pc20gZm9yIGl0cyBTdHJpbmcgdHlwZSBhdHRyaWJ1dGVzLgotICogVGhpcyBhYnN0cmFjdGlvbiByZXByZXNlbnRzIGFsbCBlbGVtZW50cyBpbiB0aGUgTWV0aG9kIENvbnRlbnQgYXMgd2VsbCBhcyBQcm9jZXNzIHNwYWNlIGZvciB3aGljaCBjb25jcmV0ZSB0ZXh0dWFsIGRlc2NyaXB0aW9ucyBhcmUgZGVmaW5lZCBpbiB0aGUgZm9ybSBvZiBkb2N1bWVudGluZyBhdHRyaWJ1dGVzIGdyb3VwZWQgaW4gYSBtYXRjaGluZyBDb250ZW50IERlc2NyaXB0aW9uIGluc3RhbmNlLiAgRGVzY3JpYmFibGUgRWxlbWVudHMgYXJlIGludGVuZGVkIHRvIGJlIHB1Ymxpc2hlZCBpbiBtZXRob2Qgb3IgcHJvY2VzcyBwdWJsaWNhdGlvbnMgKHNpbWlsYXIgdG8gdGhlIElCTSBSYXRpb25hbCBVbmlmaWVkIFByb2Nlc3Mgd2ViKS4gIERlc2NyaWJhYmxlIEVsZW1lbnQgZGVmaW5lcyB0aGF0IHRoZSBlbGVtZW50IGl0IHJlcHJlc2VudHMgd2lsbCBoYXZlIGNvbnRlbnQgJ2F0dGFjaGVkJyB0byBpdC4gIENvbnRlbnQgRGVzY3JpcHRpb24gaXMgdGhlIGFic3RyYWN0aW9uIGZvciB0aGUgYWN0dWFsIHBsYWNlcyBpbiB3aGljaCB0aGUgY29udGVudCBpcyBiZWluZyByZXByZXNlbnRlZC4gIFRoaXMgc2VwYXJhdGlvbiBhbGxvd3MgYSBkaXN0aW5jdGlvbiBiZXR3ZWVuIGNvcmUgbWV0aG9kIG1vZGVsIGVsZW1lbnRzIGRlc2NyaWJpbmcgdGhlIHN0cnVjdHVyZSBvZiB0aGUgbW9kZWwgZnJvbSB0aGUgYWN0dWFsIGRlc2NyaXB0aW9uIGNvbnRhaW5lciBwcm92aWRpbmcsIGZvciBleGFtcGxlLCB0aGUgZG9jdW1lbnRhdGlvbiBvZiB0aGUgY29udGVudCBlbGVtZW50IGluIGRpZmZlcmVudCBhbHRlcm5hdGl2ZXMgbGFuZ3VhZ2VzLCBhdWRpZW5jZXMsIGxpY2Vuc2luZyBsZXZlbHMsIGV0Yy4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZXNjcmliYWJsZUVsZW1lbnQjZ2V0UHJlc2VudGF0aW9uIDxlbT5QcmVzZW50YXRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlc2NyaWJhYmxlRWxlbWVudCNnZXRGdWxmaWxsIDxlbT5GdWxmaWxsPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZXNjcmliYWJsZUVsZW1lbnQjaXNJc0Fic3RyYWN0IDxlbT5JcyBBYnN0cmFjdDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVzY3JpYmFibGVFbGVtZW50I2dldE5vZGVpY29uIDxlbT5Ob2RlaWNvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVzY3JpYmFibGVFbGVtZW50I2dldFNoYXBlaWNvbiA8ZW0+U2hhcGVpY29uPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldERlc2NyaWJhYmxlRWxlbWVudCgpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nRGVzY3JpYmFibGVFbGVtZW50JyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRGVzY3JpYmFibGVFbGVtZW50IGV4dGVuZHMgTWV0aG9kRWxlbWVudCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5QcmVzZW50YXRpb248L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UHJlc2VudGF0aW9uPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRQcmVzZW50YXRpb24oQ29udGVudERlc2NyaXB0aW9uKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXREZXNjcmliYWJsZUVsZW1lbnRfUHJlc2VudGF0aW9uKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1ByZXNlbnRhdGlvbiciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUNvbnRlbnREZXNjcmlwdGlvbiBnZXRQcmVzZW50YXRpb24oKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlc2NyaWJhYmxlRWxlbWVudCNnZXRQcmVzZW50YXRpb24gPGVtPlByZXNlbnRhdGlvbjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UHJlc2VudGF0aW9uPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRQcmVzZW50YXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFByZXNlbnRhdGlvbihDb250ZW50RGVzY3JpcHRpb24gdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RnVsZmlsbDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RnVsZmlsbDwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkZ1bGZpbGw8L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldERlc2NyaWJhYmxlRWxlbWVudF9GdWxmaWxsKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0Z1bGZpbGwnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdDxTdHJpbmc+IGdldEZ1bGZpbGwoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPklzIEFic3RyYWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5JcyBBYnN0cmFjdDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JcyBBYnN0cmFjdDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRJc0Fic3RyYWN0KCkKLQkgKiBAc2VlICN1bnNldElzQWJzdHJhY3QoKQotCSAqIEBzZWUgI3NldElzQWJzdHJhY3QoYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0RGVzY3JpYmFibGVFbGVtZW50X0lzQWJzdHJhY3QoKQotCSAqIEBtb2RlbCB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW4iCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2F0dHJpYnV0ZScgbmFtZT0naXNBYnN0cmFjdCciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNJc0Fic3RyYWN0KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZXNjcmliYWJsZUVsZW1lbnQjaXNJc0Fic3RyYWN0IDxlbT5JcyBBYnN0cmFjdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SXMgQWJzdHJhY3Q8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0SXNBYnN0cmFjdCgpCi0JICogQHNlZSAjdW5zZXRJc0Fic3RyYWN0KCkKLQkgKiBAc2VlICNpc0lzQWJzdHJhY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldElzQWJzdHJhY3QoYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlc2NyaWJhYmxlRWxlbWVudCNpc0lzQWJzdHJhY3QgPGVtPklzIEFic3RyYWN0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldElzQWJzdHJhY3QoKQotCSAqIEBzZWUgI2lzSXNBYnN0cmFjdCgpCi0JICogQHNlZSAjc2V0SXNBYnN0cmFjdChib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0SXNBYnN0cmFjdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZXNjcmliYWJsZUVsZW1lbnQjaXNJc0Fic3RyYWN0IDxlbT5JcyBBYnN0cmFjdDwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SXMgQWJzdHJhY3Q8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldElzQWJzdHJhY3QoKQotCSAqIEBzZWUgI2lzSXNBYnN0cmFjdCgpCi0JICogQHNlZSAjc2V0SXNBYnN0cmFjdChib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0SXNBYnN0cmFjdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Tm9kZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIEEgcmVmZXJlbmNlIHRvIGFuIGljb24gdGhhdCBjYW4gYmUgdXNlZCBpbiB0cmVlIGJyb3dzZXIgcHJlc2VudGF0aW9ucyBhbmQgYnJlYWtkb3duIHN0cnVjdHVyZXMuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk5vZGVpY29uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXROb2RlaWNvbihTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldERlc2NyaWJhYmxlRWxlbWVudF9Ob2RlaWNvbigpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdhdHRyaWJ1dGUnIG5hbWU9J25vZGVpY29uJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldE5vZGVpY29uKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZXNjcmliYWJsZUVsZW1lbnQjZ2V0Tm9kZWljb24gPGVtPk5vZGVpY29uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Ob2RlaWNvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0Tm9kZWljb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldE5vZGVpY29uKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TaGFwZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIEEgcmVmZXJlbmNlIHRvIGFuIGljb24gdGhhdCBjYW4gYmUgdXNlZCBmb3IgbW9kZWxpbmcgd2l0aCBzcGVjaWZpYyBDb250ZW50IEVsZW1lbnQgaW5zdGFuY2VzIChhcyBncmFwaGljYWwgc3RlcmVvdHlwZXMsIGUuZy4gYSB1c2UgY2FzZSBzeW1ib2wgZm9yIGEgdXNlIGNhc2UgYXJ0aWZhY3QpIGFzIHdlbGwgYXMgcHVibGljYXRpb24gb2YgY29udGVudC4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U2hhcGVpY29uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRTaGFwZWljb24oU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXREZXNjcmliYWJsZUVsZW1lbnRfU2hhcGVpY29uKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2F0dHJpYnV0ZScgbmFtZT0nc2hhcGVpY29uJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFNoYXBlaWNvbigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVzY3JpYmFibGVFbGVtZW50I2dldFNoYXBlaWNvbiA8ZW0+U2hhcGVpY29uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TaGFwZWljb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFNoYXBlaWNvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0U2hhcGVpY29uKFN0cmluZyB2YWx1ZSk7Ci0KLX0gLy8gRGVzY3JpYmFibGVFbGVtZW50ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0Rlc2NyaXB0b3IuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9EZXNjcmlwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5MWZjYjQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0Rlc2NyaXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogRGVzY3JpcHRvci5qYXZhLHYgMS4yIDIwMDgvMDEvMzAgMDA6NDE6NDgga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkRlc2NyaXB0b3I8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBbiBhYnN0cmFjdCBnZW5lcmFsaXphdGlvbiBmb3Igc3BlY2lhbCBCcmVha2Rvd24gRWxlbWVudHMgdGhhdCByZWZlcmVuY2VzIG9uZSBjb25jcmV0ZSBDb250ZW50IEVsZW1lbnQuICBBIGRlc2NyaXB0b3IgcHJvdmlkZXMgYSByZXByZXNlbnRhdGlvbiBvZiBhIENvbnRlbnQgRWxlbWVudCB3aXRoaW4gYnJlYWtkb3duIHN0cnVjdHVyZXMuICBJbiBhZGRpdGlvbiB0byBqdXN0IHJlZmVyZW5jaW5nIENvbnRlbnQgRWxlbWVudHMgaXQgYWxsb3dzIG92ZXJyaWRpbmcgdGhlIENvbnRlbnQgRWxlbWVudHMgc3RydWN0dXJhbCByZWxhdGlvbnNoaXBzIGJ5IGRlZmluaW5nIGl0cyBvd24gc2V0cyBvZiBhc3NvY2lhdGlvbnMuCi0gKiBEZXNjcmlwdG9ycyBhcmUgdGhlIGtleSBjb25jZXB0IGZvciByZWFsaXppbmcgdGhlIHNlcGFyYXRpb24gb2YgcHJvY2Vzc2VzIGZyb20gbWV0aG9kIGNvbnRlbnQuICBBIERlc2NyaXB0b3IgY2FuIGJlIGNoYXJhY3Rlcml6ZWQgYXMgYSByZWZlcmVuY2Ugb2JqZWN0IGZvciBvbmUgcGFydGljdWxhciBDb250ZW50IEVsZW1lbnQsIHdoaWNoIGhhcyBpdHMgb3duIHJlbGF0aW9uc2hpcHMgYW5kIHByb3BlcnRpZXMuICBXaGVuIGEgRGVzY3JpcHRvciBpcyBjcmVhdGVkIGl0IHNoYWxsIGJlIHByb3ZpZGVkIHdpdGggY29uZ3J1ZW50IGNvcGllcyBvZiB0aGUgcmVsYXRpb25zaGlwcyBkZWZpbmVkIGZvciB0aGUgcmVmZXJlbmNlZCBjb250ZW50IGVsZW1lbnQuICBIb3dldmVyLCBhIHVzZXIgY2FuIG1vZGlmeSB0aGVzZSByZWxhdGlvbnNoaXBzIGZvciB0aGUgcGFydGljdWxhciBwcm9jZXNzIHNpdHVhdGlvbiBmb3Igd2hpY2ggdGhlIGRlc2NyaXB0b3IgaGFzIGJlZW4gY3JlYXRlZC4gCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVzY3JpcHRvciNpc0lzU3luY2hyb25pemVkV2l0aFNvdXJjZSA8ZW0+SXMgU3luY2hyb25pemVkIFdpdGggU291cmNlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldERlc2NyaXB0b3IoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J0Rlc2NyaXB0b3InIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBEZXNjcmlwdG9yIGV4dGVuZHMgQnJlYWtkb3duRWxlbWVudCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SXMgU3luY2hyb25pemVkIFdpdGggU291cmNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5JcyBTeW5jaHJvbml6ZWQgV2l0aCBTb3VyY2U8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SXMgU3luY2hyb25pemVkIFdpdGggU291cmNlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldElzU3luY2hyb25pemVkV2l0aFNvdXJjZSgpCi0JICogQHNlZSAjdW5zZXRJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UoKQotCSAqIEBzZWUgI3NldElzU3luY2hyb25pemVkV2l0aFNvdXJjZShib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXREZXNjcmlwdG9yX0lzU3luY2hyb25pemVkV2l0aFNvdXJjZSgpCi0JICogQG1vZGVsIHVuc2V0dGFibGU9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbiIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nYXR0cmlidXRlJyBuYW1lPSdpc1N5bmNocm9uaXplZFdpdGhTb3VyY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzSXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZXNjcmlwdG9yI2lzSXNTeW5jaHJvbml6ZWRXaXRoU291cmNlIDxlbT5JcyBTeW5jaHJvbml6ZWQgV2l0aCBTb3VyY2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPklzIFN5bmNocm9uaXplZCBXaXRoIFNvdXJjZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UoKQotCSAqIEBzZWUgI3Vuc2V0SXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKCkKLQkgKiBAc2VlICNpc0lzU3luY2hyb25pemVkV2l0aFNvdXJjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0SXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZXNjcmlwdG9yI2lzSXNTeW5jaHJvbml6ZWRXaXRoU291cmNlIDxlbT5JcyBTeW5jaHJvbml6ZWQgV2l0aCBTb3VyY2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0SXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKCkKLQkgKiBAc2VlICNpc0lzU3luY2hyb25pemVkV2l0aFNvdXJjZSgpCi0JICogQHNlZSAjc2V0SXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVzY3JpcHRvciNpc0lzU3luY2hyb25pemVkV2l0aFNvdXJjZSA8ZW0+SXMgU3luY2hyb25pemVkIFdpdGggU291cmNlPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JcyBTeW5jaHJvbml6ZWQgV2l0aCBTb3VyY2U8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldElzU3luY2hyb25pemVkV2l0aFNvdXJjZSgpCi0JICogQHNlZSAjaXNJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UoKQotCSAqIEBzZWUgI3NldElzU3luY2hyb25pemVkV2l0aFNvdXJjZShib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0SXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKCk7Ci0KLX0gLy8gRGVzY3JpcHRvcgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9EZXNjcmlwdG9yRGVzY3JpcHRpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9EZXNjcmlwdG9yRGVzY3JpcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjVkZmE0Zi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvRGVzY3JpcHRvckRlc2NyaXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IERlc2NyaXB0b3JEZXNjcmlwdGlvbi5qYXZhLHYgMS4yIDIwMDgvMDEvMzAgMDA6NDE6NDgga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkRlc2NyaXB0b3IgRGVzY3JpcHRpb248L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIGdlbmVyYWxpemVkIEJyZWFrZG93biBFbGVtZW50IERlc2NyaXB0aW9uIHRoYXQgaXMgdXNlZCB0byBzdG9yZSB0aGUgdGV4dHVhbCBkZXNjcmlwdGlvbiBmb3IgYSBEZXNjcmlwdG9yLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlc2NyaXB0b3JEZXNjcmlwdGlvbiNnZXRSZWZpbmVkRGVzY3JpcHRpb24gPGVtPlJlZmluZWQgRGVzY3JpcHRpb248L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0RGVzY3JpcHRvckRlc2NyaXB0aW9uKCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdEZXNjcmlwdG9yRGVzY3JpcHRpb24nIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBEZXNjcmlwdG9yRGVzY3JpcHRpb24gZXh0ZW5kcyBCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24gewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJlZmluZWQgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIEEgRGVzY3JpcHRvciBtaWdodCBhZGQgcmVmaW5lbWVudHMgdG8gdGhlIG1haW4gZGVzY3JpcHRpb24gb2YgdGhlIENvbnRlbnQgRWxlbWVudCBpdCByZWZlcnMgdG8uICBGb3IgZXhhbXBsZSwgaXQgY291bGQgcHJvdmlkZSBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGFib3V0IGEgV29yayBQcm9kdWN0IHJlbGV2YW50IGZvciB0aGUgc3BlY2lmaWMgcG9pbnQgaW4gdGltZSBpbiB0aGUgcHJvY2VzcyB0aGlzIFdvcmsgUHJvZHVjdCB0eXBlIGlzIGJlaW5nIHVzZWQuICBJdCBjb3VsZCBkZXNjcmliZSBhZGRpdGlvbmFsIHNraWxscyBuZWVkZWQgZm9yIGEgUm9sZSBhdCB0aGF0IHBhcnRpY3VsYXIgcG9pbnQgaW4gdGltZSBpbiBhIHByb2Nlc3MsIGV0Yy4gCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJlZmluZWQgRGVzY3JpcHRpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFJlZmluZWREZXNjcmlwdGlvbihTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldERlc2NyaXB0b3JEZXNjcmlwdGlvbl9SZWZpbmVkRGVzY3JpcHRpb24oKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nUmVmaW5lZERlc2NyaXB0aW9uJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFJlZmluZWREZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVzY3JpcHRvckRlc2NyaXB0aW9uI2dldFJlZmluZWREZXNjcmlwdGlvbiA8ZW0+UmVmaW5lZCBEZXNjcmlwdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UmVmaW5lZCBEZXNjcmlwdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UmVmaW5lZERlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRSZWZpbmVkRGVzY3JpcHRpb24oU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBEZXNjcmlwdG9yRGVzY3JpcHRpb24KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvRGlzY2lwbGluZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0Rpc2NpcGxpbmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWE2OGE4Yy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvRGlzY2lwbGluZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA1ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogRGlzY2lwbGluZS5qYXZhLHYgMS4yIDIwMDgvMDEvMzAgMDA6NDE6NDgga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXA7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkRpc2NpcGxpbmU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIGNhdGVnb3JpemF0aW9uIG9mIHdvcmsgKGkuZS4gVGFza3MgZm9yIE1ldGhvZCBDb250ZW50KSwgYmFzZWQgdXBvbiBzaW1pbGFyaXR5IG9mIGNvbmNlcm5zIGFuZCBjb29wZXJhdGlvbiBvZiB3b3JrIGVmZm9ydC4KLSAqIEEgZGlzY2lwbGluZSBpcyBhIGNvbGxlY3Rpb24gb2YgVGFza3MgdGhhdCBhcmUgcmVsYXRlZCB0byBhIG1ham9yICdhcmVhIG9mIGNvbmNlcm4nIHdpdGhpbiB0aGUgb3ZlcmFsbCBwcm9qZWN0LiBUaGUgZ3JvdXBpbmcgb2YgVGFza3MgaW50byBkaXNjaXBsaW5lcyBpcyBtYWlubHkgYW4gYWlkIHRvIHVuZGVyc3RhbmRpbmcgdGhlIHByb2plY3QgZnJvbSBhICd0cmFkaXRpb25hbCcgd2F0ZXJmYWxsIHBlcnNwZWN0aXZlLiBIb3dldmVyLCB0eXBpY2FsbHksIGZvciBleGFtcGxlLCBpdCBpcyBtb3JlIGNvbW1vbiB0byBwZXJmb3JtIGNlcnRhaW4gcmVxdWlyZW1lbnRzIGFjdGl2aXRpZXMgaW4gY2xvc2UgY29vcmRpbmF0aW9uIHdpdGggYW5hbHlzaXMgYW5kIGRlc2lnbiBhY3Rpdml0aWVzLiBTZXBhcmF0aW5nIHRoZXNlIGFjdGl2aXRpZXMgaW50byBzZXBhcmF0ZSBkaXNjaXBsaW5lcyBtYWtlcyB0aGUgYWN0aXZpdGllcyBlYXNpZXIgdG8gY29tcHJlaGVuZC4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EaXNjaXBsaW5lI2dldEdyb3VwMiA8ZW0+R3JvdXAyPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EaXNjaXBsaW5lI2dldFRhc2sgPGVtPlRhc2s8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRpc2NpcGxpbmUjZ2V0U3ViRGlzY2lwbGluZSA8ZW0+U3ViIERpc2NpcGxpbmU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRpc2NpcGxpbmUjZ2V0UmVmZXJlbmNlV29ya2Zsb3cgPGVtPlJlZmVyZW5jZSBXb3JrZmxvdzwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXREaXNjaXBsaW5lKCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdEaXNjaXBsaW5lJyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRGlzY2lwbGluZSBleHRlbmRzIENvbnRlbnRDYXRlZ29yeSB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+R3JvdXAyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcC5FbnRyeX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Hcm91cDI8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Hcm91cDI8L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldERpc2NpcGxpbmVfR3JvdXAyKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRmVhdHVyZU1hcEVudHJ5IiBtYW55PSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdncm91cCcgbmFtZT0nZ3JvdXA6MjQnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlGZWF0dXJlTWFwIGdldEdyb3VwMigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VGFzazwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VGFzazwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlRhc2s8L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldERpc2NpcGxpbmVfVGFzaygpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIiB0cmFuc2llbnQ9InRydWUiIHZvbGF0aWxlPSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdUYXNrJyBncm91cD0nI2dyb3VwOjI0JyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3Q8U3RyaW5nPiBnZXRUYXNrKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TdWIgRGlzY2lwbGluZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRpc2NpcGxpbmV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U3ViIERpc2NpcGxpbmU8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TdWIgRGlzY2lwbGluZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0RGlzY2lwbGluZV9TdWJEaXNjaXBsaW5lKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1N1YkRpc2NpcGxpbmUnIGdyb3VwPScjZ3JvdXA6MjQnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdDxEaXNjaXBsaW5lPiBnZXRTdWJEaXNjaXBsaW5lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SZWZlcmVuY2UgV29ya2Zsb3c8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlJlZmVyZW5jZSBXb3JrZmxvdzwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJlZmVyZW5jZSBXb3JrZmxvdzwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0RGlzY2lwbGluZV9SZWZlcmVuY2VXb3JrZmxvdygpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIiB0cmFuc2llbnQ9InRydWUiIHZvbGF0aWxlPSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdSZWZlcmVuY2VXb3JrZmxvdycgZ3JvdXA9JyNncm91cDoyNCciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0PFN0cmluZz4gZ2V0UmVmZXJlbmNlV29ya2Zsb3coKTsKLQotfSAvLyBEaXNjaXBsaW5lClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0Rpc2NpcGxpbmVHcm91cGluZy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0Rpc2NpcGxpbmVHcm91cGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YmFlYmNmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9EaXNjaXBsaW5lR3JvdXBpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogRGlzY2lwbGluZUdyb3VwaW5nLmphdmEsdiAxLjIgMjAwOC8wMS8zMCAwMDo0MTo0OCBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RGlzY2lwbGluZSBHcm91cGluZzwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIFVzZWQgdG8gZ3JvdXAgRGlzY2lwbGluZXMuICBGb3IgZXhhbXBsZSwgdGhlIERpc2NpcGxpbmUgR3JvdXBpbmcgIlNvZnR3YXJlIERpc2NpcGxpbmVzIiB3b3VsZCBiZSB0aGUgZ3JvdXAgb2YgYWxsIGRpc2NpcGxpbmVzIHJlbGF0ZWQgdG8gZGV2ZWxvcGluZyBzb2Z0d2FyZSBzdWNoIGFzICJSZXF1aXJlbWVudHMgTWFuYWdlbWVudCIgb3IgIlRlc3RpbmciOyAiSVQgSW5mcmFzdHJ1Y3R1cmUgTWFuYWdlbWVudCIgd291bGQgYmUgYSBEaXNjaXBsaW5lcyBHcm91cGluZyBmb3IgZGlzY2lwbGluZXMgc3VjaCBhcyAiSVQgT3BlcmF0aW9uYWwgU2VydmljZXMiLCAiSVQgQ3VzdG9tZXIgUmVsYXRpb25zaGlwcyIsIG9yICJJVCBFbmFibGluZyBTZXJ2aWNlcyIuICBEaXNjaXBsaW5lcyBjYW4gYmUgYXNzb2NpYXRlZCB0byBtb3JlIHRoYW4gb25lIERpc2NpcGxpbmUgR3JvdXBpbmcuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGlzY2lwbGluZUdyb3VwaW5nI2dldEdyb3VwMiA8ZW0+R3JvdXAyPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EaXNjaXBsaW5lR3JvdXBpbmcjZ2V0RGlzY2lwbGluZSA8ZW0+RGlzY2lwbGluZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXREaXNjaXBsaW5lR3JvdXBpbmcoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J0Rpc2NpcGxpbmVHcm91cGluZycga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIERpc2NpcGxpbmVHcm91cGluZyBleHRlbmRzIENvbnRlbnRDYXRlZ29yeSB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+R3JvdXAyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcC5FbnRyeX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Hcm91cDI8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Hcm91cDI8L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldERpc2NpcGxpbmVHcm91cGluZ19Hcm91cDIoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVGZWF0dXJlTWFwRW50cnkiIG1hbnk9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2dyb3VwJyBuYW1lPSdncm91cDoyNCciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUZlYXR1cmVNYXAgZ2V0R3JvdXAyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EaXNjaXBsaW5lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5EaXNjaXBsaW5lPC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGlzY2lwbGluZTwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0RGlzY2lwbGluZUdyb3VwaW5nX0Rpc2NpcGxpbmUoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nRGlzY2lwbGluZScgZ3JvdXA9JyNncm91cDoyNCciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0PFN0cmluZz4gZ2V0RGlzY2lwbGluZSgpOwotCi19IC8vIERpc2NpcGxpbmVHcm91cGluZwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9Eb2N1bWVudFJvb3QuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9Eb2N1bWVudFJvb3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTg1NWMzYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvRG9jdW1lbnRSb290LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjkgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBEb2N1bWVudFJvb3QuamF2YSx2IDEuMiAyMDA4LzAxLzMwIDAwOjQxOjQ4IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5zZG8uRURhdGFPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RG9jdW1lbnQgUm9vdDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Eb2N1bWVudFJvb3QjZ2V0TWl4ZWQgPGVtPk1peGVkPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Eb2N1bWVudFJvb3QjZ2V0WE1MTlNQcmVmaXhNYXAgPGVtPlhNTE5TIFByZWZpeCBNYXA8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRvY3VtZW50Um9vdCNnZXRYU0lTY2hlbWFMb2NhdGlvbiA8ZW0+WFNJIFNjaGVtYSBMb2NhdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRG9jdW1lbnRSb290I2dldE1ldGhvZENvbmZpZ3VyYXRpb24gPGVtPk1ldGhvZCBDb25maWd1cmF0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Eb2N1bWVudFJvb3QjZ2V0TWV0aG9kTGlicmFyeSA8ZW0+TWV0aG9kIExpYnJhcnk8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRvY3VtZW50Um9vdCNnZXRNZXRob2RQbHVnaW4gPGVtPk1ldGhvZCBQbHVnaW48L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0RG9jdW1lbnRSb290KCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPScnIGtpbmQ9J21peGVkJyIKLSAqIEBleHRlbmRzIEVEYXRhT2JqZWN0Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRG9jdW1lbnRSb290IGV4dGVuZHMgRURhdGFPYmplY3QgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1peGVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcC5FbnRyeX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5NaXhlZDwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1peGVkPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXREb2N1bWVudFJvb3RfTWl4ZWQoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVGZWF0dXJlTWFwRW50cnkiIG1hbnk9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnRXaWxkY2FyZCcgbmFtZT0nOm1peGVkJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRmVhdHVyZU1hcCBnZXRNaXhlZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+WE1MTlMgUHJlZml4IE1hcDwvYj48L2VtPicgbWFwLgotCSAqIFRoZSBrZXkgaXMgb2YgdHlwZSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30sCi0JICogYW5kIHRoZSB2YWx1ZSBpcyBvZiB0eXBlIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfSwKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlhNTE5TIFByZWZpeCBNYXA8L2VtPicgbWFwIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+WE1MTlMgUHJlZml4IE1hcDwvZW0+JyBtYXAuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldERvY3VtZW50Um9vdF9YTUxOU1ByZWZpeE1hcCgpCi0JICogQG1vZGVsIG1hcFR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RyaW5nVG9TdHJpbmdNYXBFbnRyeTxvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cmluZywgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJpbmc+IiB0cmFuc2llbnQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2F0dHJpYnV0ZScgbmFtZT0neG1sbnM6cHJlZml4JyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRU1hcDxTdHJpbmcsIFN0cmluZz4gZ2V0WE1MTlNQcmVmaXhNYXAoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlhTSSBTY2hlbWEgTG9jYXRpb248L2I+PC9lbT4nIG1hcC4KLQkgKiBUaGUga2V5IGlzIG9mIHR5cGUge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9LAotCSAqIGFuZCB0aGUgdmFsdWUgaXMgb2YgdHlwZSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30sCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5YU0kgU2NoZW1hIExvY2F0aW9uPC9lbT4nIG1hcCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlhTSSBTY2hlbWEgTG9jYXRpb248L2VtPicgbWFwLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXREb2N1bWVudFJvb3RfWFNJU2NoZW1hTG9jYXRpb24oKQotCSAqIEBtb2RlbCBtYXBUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cmluZ1RvU3RyaW5nTWFwRW50cnk8b3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJpbmcsIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RyaW5nPiIgdHJhbnNpZW50PSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdhdHRyaWJ1dGUnIG5hbWU9J3hzaTpzY2hlbWFMb2NhdGlvbiciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVNYXA8U3RyaW5nLCBTdHJpbmc+IGdldFhTSVNjaGVtYUxvY2F0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5NZXRob2QgQ29uZmlndXJhdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogQSBjb2xsZWN0aW9uIG9mIHNlbGVjdGVkIE1ldGhvZCBNb2RlbHMgYW5kIE1ldGhvZFBhY2thZ2VzLiBBIGNvbmZpZ3VyYXRpb24gY2FuIGJlIGV4cG9ydGVkIGludG8gaXRzIG93biBzdGFuZGFsb25lIGxpYnJhcnkgd2hlbiBpdCBpbmNsdWRlcyB0aGUgZnVsbCB0cmFuc2l0aXZlIGNsb3N1cmUgb2YgYWxsIGVsZW1lbnRzIGFsbCBvdGhlciBlbGVtZW50cyBkZXBlbmQgb24uCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1ldGhvZCBDb25maWd1cmF0aW9uPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRNZXRob2RDb25maWd1cmF0aW9uKE1ldGhvZENvbmZpZ3VyYXRpb24pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldERvY3VtZW50Um9vdF9NZXRob2RDb25maWd1cmF0aW9uKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiIHVwcGVyPSItMiIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nTWV0aG9kQ29uZmlndXJhdGlvbicgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU1ldGhvZENvbmZpZ3VyYXRpb24gZ2V0TWV0aG9kQ29uZmlndXJhdGlvbigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRG9jdW1lbnRSb290I2dldE1ldGhvZENvbmZpZ3VyYXRpb24gPGVtPk1ldGhvZCBDb25maWd1cmF0aW9uPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5NZXRob2QgQ29uZmlndXJhdGlvbjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0TWV0aG9kQ29uZmlndXJhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TWV0aG9kQ29uZmlndXJhdGlvbihNZXRob2RDb25maWd1cmF0aW9uIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1ldGhvZCBMaWJyYXJ5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBBIE1ldGhvZCBMaWJyYXJ5IGlzIGEgcGh5c2ljYWwgY29udGFpbmVyIGZvciBNZXRob2QgUGx1Z2lucyBhbmQgTWV0aG9kIENvbmZpZ3VyYXRpb24gZGVmaW5pdGlvbnMuICBBbGwgTWV0aG9kIEVsZW1lbnRzIGFyZSBzdG9yZWQgaW4gYSBNZXRob2QgTGlicmFyeS4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TWV0aG9kIExpYnJhcnk8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldE1ldGhvZExpYnJhcnkoTWV0aG9kTGlicmFyeSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0RG9jdW1lbnRSb290X01ldGhvZExpYnJhcnkoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIgdXBwZXI9Ii0yIiB0cmFuc2llbnQ9InRydWUiIHZvbGF0aWxlPSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdNZXRob2RMaWJyYXJ5JyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTWV0aG9kTGlicmFyeSBnZXRNZXRob2RMaWJyYXJ5KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Eb2N1bWVudFJvb3QjZ2V0TWV0aG9kTGlicmFyeSA8ZW0+TWV0aG9kIExpYnJhcnk8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk1ldGhvZCBMaWJyYXJ5PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRNZXRob2RMaWJyYXJ5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRNZXRob2RMaWJyYXJ5KE1ldGhvZExpYnJhcnkgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TWV0aG9kIFBsdWdpbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogQSBzcGVjaWFsIE1ldGhvZCBVbml0IHRoYXQgcmVwcmVzZW50cyBhIHBoeXNpY2FsIGNvbnRhaW5lciBmb3IgTWV0aG9kIFBhY2thZ2VzLiAgSXQgZGVmaW5lcyBhIGdyYW51bGFyaXR5IGxldmVsIGZvciB0aGUgbW9kdWxhcml6YXRpb24gYW5kIG9yZ2FuaXphdGlvbiBvZiBtZXRob2QgY29udGVudCBhbmQgcHJvY2Vzc2VzLiAgQSBNZXRob2QgUGx1Z2luIGNhbiBleHRlbmQgbWFueSBvdGhlciBNZXRob2QgUGx1Z2lucyBhbmQgaXQgY2FuIGJlIGV4dGVuZGVkIGJ5IG1hbnkgTWV0aG9kIFBsdWdpbnMuICBJdCBjYW4gYWxzbyBiZSB1c2VkIHN0YW5kLWFsb25lLCBpLmUuIHdpdGggbm8gRXh0ZW5zaW9uIHJlbGF0aW9uc2hpcCB0byBvdGhlciBwbHVnLWlucy4KLQkgKiBNZXRob2QgUGx1Z2luIGNvbmNlcHR1YWxseSByZXByZXNlbnRzIGEgdW5pdCBmb3IgY29uZmlndXJhdGlvbiwgbW9kdWxhcml6YXRpb24sIGV4dGVuc2lvbiwgcGFja2FnaW5nLCBhbmQgZGVwbG95bWVudCBvZiBtZXRob2QgY29udGVudCBhbmQgcHJvY2Vzc2VzLiAgQSBQcm9jZXNzIEVuZ2luZWVyIHNoYWxsIGRlc2lnbiBoaXMgUGx1Z2lucyBhbmQgYWxsb2NhdGUgaGlzIGNvbnRlbnQgdG8gdGhlc2UgUGx1Z2lucyB3aXRoIHJlcXVpcmVtZW50cyBmb3IgZXh0ZW5zaWJpbGl0eSwgbW9kdWxhcml0eSwgcmV1c2UsIGFuZCBtYWludGFpbmFiaWxpdHkgaW4gbWluZC4KLQkgKiBTcGVjaWFsIGV4dGVuc2liaWxpdHkgbWVjaGFuaXNtcyBkZWZpbmVkIGZvciB0aGUgbWV0YS1jbGFzc2VzIFZhcmlhYmlsaXR5IEVsZW1lbnQgYW5kIFByb2Nlc3MgQ29udHJpYnV0aW9uIGFsbG93IFBsdWdpbiBjb250ZW50IHRvIGRpcmVjdGx5IGNvbnRyaWJ1dGUgbmV3IGNvbnRlbnQsIHJlcGxhY2UgZXhpc3RpbmcgY29udGVudCwgb3IgdG8gY3Jvc3MtcmVmZXJlbmNlIHRvIGFueSBDb250ZW50IEVsZW1lbnQgb3IgUHJvY2VzcyB3aXRoaW4gYW5vdGhlciBQbHVnaW4gdGhhdCBpdCBleHRlbmRzLiAgU2ltaWxhciB0byBVTUwgMi4wJ3MgJ3BhY2thZ2UgbWVyZ2UnIG1lY2hhbmlzbSB0cmFuc2Zvcm1hdGlvbiBpbnRlcnByZXRhdGlvbnMsIGludGVycHJldGluZyB0aGVzZSBNZXRob2QgUGx1Z2luIG1lY2hhbmlzbXMgcmVzdWx0cyBpbnRvIG5ldyBleHRlbmRlZCBNZXRob2QgQ29udGVudCBhbmQgUHJvY2Vzc2VzLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NZXRob2QgUGx1Z2luPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRNZXRob2RQbHVnaW4oTWV0aG9kUGx1Z2luKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXREb2N1bWVudFJvb3RfTWV0aG9kUGx1Z2luKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiIHVwcGVyPSItMiIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nTWV0aG9kUGx1Z2luJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTWV0aG9kUGx1Z2luIGdldE1ldGhvZFBsdWdpbigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRG9jdW1lbnRSb290I2dldE1ldGhvZFBsdWdpbiA8ZW0+TWV0aG9kIFBsdWdpbjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TWV0aG9kIFBsdWdpbjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0TWV0aG9kUGx1Z2luKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRNZXRob2RQbHVnaW4oTWV0aG9kUGx1Z2luIHZhbHVlKTsKLQotfSAvLyBEb2N1bWVudFJvb3QKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvRG9tYWluLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvRG9tYWluLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2ZjU1MjcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0RvbWFpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODcgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBEb21haW4uamF2YSx2IDEuMiAyMDA4LzAxLzMwIDAwOjQxOjQ4IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Eb21haW48L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIHJlZmluZWFibGUgaGllcmFyY2h5IGdyb3VwaW5nIHJlbGF0ZWQgd29yayBwcm9kdWN0cy4gIEluIG90aGVyIHdvcmRzLCBEb21haW5zIGNhbiBiZSBmdXJ0aGVyIGRpdmlkZWQgaW50byBzdWItZG9tYWlucywgd2l0aCB3b3JrIHByb2R1Y3QgZWxlbWVudHMgdG8gYmUgY2F0ZWdvcml6ZWQgb25seSBhdCB0aGUgbGVhZi1sZXZlbCBvZiB0aGlzIGhpZXJhcmNoeS4KLSAqIERvbWFpbiBpcyBhIGxvZ2ljYWwgZ3JvdXBpbmcgb2Ygd29yayBwcm9kdWN0cyB0aGF0IGhhdmUgYW4gYWZmaW5pdHkgdG8gZWFjaCBvdGhlciBiYXNlZCBvbiByZXNvdXJjZXMsIHRpbWluZywgb3IgcmVsYXRpb25zaGlwLiAgQSBEb21haW4gbWF5IGJlIGRpdmlkZWQgaW50byBzdWJkb21haW5zLiAgRm9yIGV4YW1wbGUsIEdTIE1ldGhvZCB1c2VzIHNpeCBwcmVkZWZpbmVkIERvbWFpbnMgZm9yIFdvcmsgUHJvZHVjdHM6IEFwcGxpY2F0aW9uLCBBcmNoaXRlY3R1cmUsIEJ1c2luZXNzLCBFbmdhZ2VtZW50LCBPcGVyYXRpb25zIGFuZCBPcmdhbml6YXRpb24uCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRG9tYWluI2dldEdyb3VwMiA8ZW0+R3JvdXAyPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Eb21haW4jZ2V0V29ya1Byb2R1Y3QgPGVtPldvcmsgUHJvZHVjdDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRG9tYWluI2dldFN1YmRvbWFpbiA8ZW0+U3ViZG9tYWluPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldERvbWFpbigpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nRG9tYWluJyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRG9tYWluIGV4dGVuZHMgQ29udGVudENhdGVnb3J5IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Hcm91cDI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwLkVudHJ5fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkdyb3VwMjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkdyb3VwMjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0RG9tYWluX0dyb3VwMigpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUZlYXR1cmVNYXBFbnRyeSIgbWFueT0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZ3JvdXAnIG5hbWU9J2dyb3VwOjI0JyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRmVhdHVyZU1hcCBnZXRHcm91cDIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPldvcmsgUHJvZHVjdDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+V29yayBQcm9kdWN0PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+V29yayBQcm9kdWN0PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXREb21haW5fV29ya1Byb2R1Y3QoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nV29ya1Byb2R1Y3QnIGdyb3VwPScjZ3JvdXA6MjQnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdDxTdHJpbmc+IGdldFdvcmtQcm9kdWN0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TdWJkb21haW48L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Eb21haW59LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U3ViZG9tYWluPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U3ViZG9tYWluPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXREb21haW5fU3ViZG9tYWluKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1N1YmRvbWFpbicgZ3JvdXA9JyNncm91cDoyNCciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0PERvbWFpbj4gZ2V0U3ViZG9tYWluKCk7Ci0KLX0gLy8gRG9tYWluClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0VsZW1lbnQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9FbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2Njk5YjQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0VsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogRWxlbWVudC5qYXZhLHYgMS4xIDIwMDgvMDEvMTUgMDg6NTI6MDcganRoYW0gRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5zZG8uRURhdGFPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkVsZW1lbnQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIFVNTCAyLjAgbWV0YS1jbGFzcyBFbGVtZW50LgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0RWxlbWVudCgpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nRWxlbWVudCcga2luZD0nZW1wdHknIgotICogQGV4dGVuZHMgRURhdGFPYmplY3QKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBFbGVtZW50IGV4dGVuZHMgRURhdGFPYmplY3QgewotfSAvLyBFbGVtZW50ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0VzdGltYXRlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvRXN0aW1hdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDM4ZjAzZi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvRXN0aW1hdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogRXN0aW1hdGUuamF2YSx2IDEuMiAyMDA4LzAxLzMwIDAwOjQxOjQ4IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Fc3RpbWF0ZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEEgc3BlY2lmaWMgdHlwZSBvZiBHdWlkYW5jZSB0aGF0IHByb3ZpZGVzIHNpemluZyBtZWFzdXJlcywgb3Igc3RhbmRhcmRzIGZvciBzaXppbmcgdGhlIHdvcmsgZWZmb3J0IGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIGEgcGFydGljdWxhciBwaWVjZSBvZiB3b3JrIGFuZCBpbnN0cnVjdGlvbnMgZm9yIHRoZWlyIHN1Y2Nlc3NmdWwgdXNlLiBJdCBtYXkgYmUgY29tcHJpc2VkIG9mIGVzdGltYXRpb24gY29uc2lkZXJhdGlvbnMgYW5kIGVzdGltYXRpb24gbWV0cmljcy4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Fc3RpbWF0ZSNnZXRHcm91cDIgPGVtPkdyb3VwMjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRXN0aW1hdGUjZ2V0RXN0aW1hdGlvbk1ldHJpYyA8ZW0+RXN0aW1hdGlvbiBNZXRyaWM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkVzdGltYXRlI2dldEVzdGltYXRpb25Db25zaWRlcmF0aW9ucyA8ZW0+RXN0aW1hdGlvbiBDb25zaWRlcmF0aW9uczwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRFc3RpbWF0ZSgpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nRXN0aW1hdGUnIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBFc3RpbWF0ZSBleHRlbmRzIEd1aWRhbmNlIHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Hcm91cDI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwLkVudHJ5fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkdyb3VwMjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkdyb3VwMjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0RXN0aW1hdGVfR3JvdXAyKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRmVhdHVyZU1hcEVudHJ5IiBtYW55PSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdncm91cCcgbmFtZT0nZ3JvdXA6MjQnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlGZWF0dXJlTWFwIGdldEdyb3VwMigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RXN0aW1hdGlvbiBNZXRyaWM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkVzdGltYXRpb24gTWV0cmljPC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RXN0aW1hdGlvbiBNZXRyaWM8L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldEVzdGltYXRlX0VzdGltYXRpb25NZXRyaWMoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nRXN0aW1hdGlvbk1ldHJpYycgZ3JvdXA9JyNncm91cDoyNCciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0PFN0cmluZz4gZ2V0RXN0aW1hdGlvbk1ldHJpYygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RXN0aW1hdGlvbiBDb25zaWRlcmF0aW9uczwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RXN0aW1hdGlvbiBDb25zaWRlcmF0aW9uczwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkVzdGltYXRpb24gQ29uc2lkZXJhdGlvbnM8L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldEVzdGltYXRlX0VzdGltYXRpb25Db25zaWRlcmF0aW9ucygpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIiB0cmFuc2llbnQ9InRydWUiIHZvbGF0aWxlPSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMnIGdyb3VwPScjZ3JvdXA6MjQnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdDxTdHJpbmc+IGdldEVzdGltYXRpb25Db25zaWRlcmF0aW9ucygpOwotCi19IC8vIEVzdGltYXRlClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0VzdGltYXRpbmdNZXRyaWMuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9Fc3RpbWF0aW5nTWV0cmljLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwNDlhOWEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0VzdGltYXRpbmdNZXRyaWMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogRXN0aW1hdGluZ01ldHJpYy5qYXZhLHYgMS4xIDIwMDgvMDEvMTUgMDg6NTI6MDcganRoYW0gRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYTsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Fc3RpbWF0aW5nIE1ldHJpYzwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEEgc3BlY2lmaWMgdHlwZSBvZiBHdWlkYW5jZSB0aGF0IGRlc2NyaWJlcyBhIG1ldHJpYyBvciBtZWFzdXJlIHRoYXQgaXMgYXNzb2NpYXRlZCB3aXRoIGFuIGVsZW1lbnQgYW5kIHdoaWNoIGlzIHVzZWQgdG8gY2FsY3VsYXRlIHRoZSBzaXplIG9mIHRoZSB3b3JrIGVmZm9ydCBhcyB3ZWxsIGFzIGEgcmFuZ2Ugb2YgcG90ZW50aWFsIGxhYm9yLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0RXN0aW1hdGluZ01ldHJpYygpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nRXN0aW1hdGluZ01ldHJpYycga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEVzdGltYXRpbmdNZXRyaWMgZXh0ZW5kcyBHdWlkYW5jZSB7Ci19IC8vIEVzdGltYXRpbmdNZXRyaWMKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzYmUyYmUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0VzdGltYXRpb25Db25zaWRlcmF0aW9ucy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMuamF2YSx2IDEuMSAyMDA4LzAxLzE1IDA4OjUyOjA3IGp0aGFtIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWE7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RXN0aW1hdGlvbiBDb25zaWRlcmF0aW9uczwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEEgc3BlY2lmaWMgdHlwZSBvZiBHdWlkYW5jZSB0aGF0IHF1YWxpZmllcyB0aGUgdXNhZ2UgYW5kIGFwcGxpY2F0aW9uIG9mIGVzdGltYXRpb24gbWV0cmljcyBpbiB0aGUgZGV2ZWxvcG1lbnQgb2YgYW4gYWN0dWFsIGVzdGltYXRlLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0RXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMnIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMgZXh0ZW5kcyBHdWlkYW5jZSB7Ci19IC8vIEVzdGltYXRpb25Db25zaWRlcmF0aW9ucwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9FeGFtcGxlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvRXhhbXBsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NmIyMDRmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9FeGFtcGxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IEV4YW1wbGUuamF2YSx2IDEuMSAyMDA4LzAxLzE1IDA4OjUyOjA2IGp0aGFtIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWE7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RXhhbXBsZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEEgc3BlY2lmaWMgdHlwZSBvZiBHdWlkYW5jZSB0aGF0IHJlcHJlc2VudHMgYSB0eXBpY2FsLCBwYXJ0aWFsbHkgY29tcGxldGVkLCBzYW1wbGUgaW5zdGFuY2Ugb2Ygb25lIG9yIG1vcmUgd29yayBwcm9kdWN0cyBvciBzY2VuYXJpbyBsaWtlIGRlc2NyaXB0aW9ucyBvZiBob3cgVGFzayBtYXkgYmUgcGVyZm9ybWVkLiBFeGFtcGxlcyBjYW4gYmUgcmVsYXRlZCB0byBXb3JrIFByb2R1Y3RzIGFzIHdlbGwgYXMgVGFza3MgdGhhdCBwcm9kdWNlIHRoZW0gYXMgd2VsbCBhcyBhbnkgb3RoZXIgQ29udGVudCBFbGVtZW50LgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0RXhhbXBsZSgpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nRXhhbXBsZScga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEV4YW1wbGUgZXh0ZW5kcyBHdWlkYW5jZSB7Ci19IC8vIEV4YW1wbGUKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvR3VpZGFuY2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9HdWlkYW5jZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZTFkMDExLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9HdWlkYW5jZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBHdWlkYW5jZS5qYXZhLHYgMS4xIDIwMDgvMDEvMTUgMDg6NTI6MDcganRoYW0gRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYTsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5HdWlkYW5jZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEd1aWRhbmNlIGlzIGFuIGFic3RyYWN0IGdlbmVyYWxpemF0aW9uIG9mIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVsYXRlZCB0byBjb250ZW50IGVsZW1lbnRzIHN1Y2ggYXMgUm9sZXMsIFRhc2tzLCBhbmQgV29yayBQcm9kdWN0cy4gIEV4YW1wbGVzIGZvciBHdWlkYW5jZSBhcmUgR3VpZGVsaW5lcywgVGVtcGxhdGVzLCBDaGVja2xpc3RzLCBUb29sIE1lbnRvcnMsIEVzdGltYXRlcywgU3VwcG9ydGluZyBNYXRlcmlhbHMsIFJlcG9ydHMsIENvbmNlcHRzLCBldGMuICBUaGlzIHBhY2thZ2Ugb25seSBjb250YWlucyB0aGUgZGVmaW5pdGlvbiBvZiB0aGUgYWJzdHJhY3QgR3VpZGFuY2UgY2xhc3MuICBUaGUgcGFja2FnZSBHdWlkYW5jZSBUeXBlcyBkZWZpbmVzIGNvbmNyZXRlIGd1aWRhbmNlIHR5cGVzLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0R3VpZGFuY2UoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J0d1aWRhbmNlJyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgR3VpZGFuY2UgZXh0ZW5kcyBDb250ZW50RWxlbWVudCB7Ci19IC8vIEd1aWRhbmNlClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0d1aWRhbmNlRGVzY3JpcHRpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9HdWlkYW5jZURlc2NyaXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxMDRkY2EuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0d1aWRhbmNlRGVzY3JpcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogR3VpZGFuY2VEZXNjcmlwdGlvbi5qYXZhLHYgMS4yIDIwMDgvMDEvMzAgMDA6NDE6NDgga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkd1aWRhbmNlIERlc2NyaXB0aW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQSBnZW5lcmFsaXplZCBDb250ZW50IERlc2NyaXB0aW9uIHRoYXQgaXMgdXNlZCB0byBzdG9yZSB0aGUgdGV4dHVhbCBkZXNjcmlwdGlvbiBmb3IgYSBHdWlkYW5jZS4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5HdWlkYW5jZURlc2NyaXB0aW9uI2dldEF0dGFjaG1lbnQgPGVtPkF0dGFjaG1lbnQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0R3VpZGFuY2VEZXNjcmlwdGlvbigpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nR3VpZGFuY2VEZXNjcmlwdGlvbicga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEd1aWRhbmNlRGVzY3JpcHRpb24gZXh0ZW5kcyBDb250ZW50RGVzY3JpcHRpb24gewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkF0dGFjaG1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoaXMgZmllbGQgaXMgcHJpbWFyaWx5IHVzZWQgZm9yIGF0dGFjaG1lbnRzIGF1Z21lbnRpbmcgdGhlIGluZm9ybWF0aW9uIHByb3ZpZGVkIGZvciBndWlkYW5jZS4gIEluIHBhcnRpY3VsYXIgdGhlIGF0dHJpYnV0ZSBpcyB1c2VkIGZvciBUZW1wbGF0ZXMsIEV4YW1wbGVzLCBhbmQgUmV1c2FibGUgQXNzZXRzIHRvIGNvbnRhaW4gdGhlIGFjdHVhbCBhdHRhY2htZW50IGRlc2NyaWJlZCBpbiB0aGUgbWFpbkRlc2NyaXB0aW9uLiAgSXQgY2FuIGFkZGl0aW9uYWxseSBjb250YWluIHJlcHJlc2VudGF0aW9ucyBvZiB0aGUgZ3VpZGFuY2UgaW4ganVzdCBhIHRoaXJkIHBhcnR5IGZvcm1hdCwgZS5nLiBQREYsIE1TIFdvcmQsIG9yIFdvcmQgUGVyZmVjdC4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QXR0YWNobWVudDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0QXR0YWNobWVudChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldEd1aWRhbmNlRGVzY3JpcHRpb25fQXR0YWNobWVudCgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdBdHRhY2htZW50JyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldEF0dGFjaG1lbnQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkd1aWRhbmNlRGVzY3JpcHRpb24jZ2V0QXR0YWNobWVudCA8ZW0+QXR0YWNobWVudDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QXR0YWNobWVudDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0QXR0YWNobWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0QXR0YWNobWVudChTdHJpbmcgdmFsdWUpOwotCi19IC8vIEd1aWRhbmNlRGVzY3JpcHRpb24KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvR3VpZGVsaW5lLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvR3VpZGVsaW5lLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmYjkwNjguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0d1aWRlbGluZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBHdWlkZWxpbmUuamF2YSx2IDEuMSAyMDA4LzAxLzE1IDA4OjUyOjA3IGp0aGFtIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWE7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+R3VpZGVsaW5lPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQSBzcGVjaWZpYyB0eXBlIG9mIGd1aWRhbmNlIHRoYXQgcHJvdmlkZXMgYWRkaXRpb25hbCBkZXRhaWwgb24gaG93IHRvIHBlcmZvcm0gYSBwYXJ0aWN1bGFyIHRhc2sgb3IgZ3JvdXBpbmcgb2YgdGFza3MgKGUuZy4gZ3JvdXBlZCB0b2dldGhlciBhcyBhY3Rpdml0aWVzKSBvciB0aGF0IHByb3ZpZGVzIGFkZGl0aW9uYWwgZGV0YWlsLCBydWxlcywgYW5kIHJlY29tbWVuZGF0aW9ucyBvbiB3b3JrIHByb2R1Y3RzIGFuZCB0aGVpciBwcm9wZXJ0aWVzLiAgQW1vbmdzdCBvdGhlcnMsIGl0IGNhbiBpbmNsdWRlIGRldGFpbHMgYWJvdXQgYmVzdCBwcmFjdGljZXMgYW5kIGRpZmZlcmVudCBhcHByb2FjaGVzIGZvciBkb2luZyB3b3JrLCBob3cgdG8gdXNlIHBhcnRpY3VsYXIgdHlwZXMgb2Ygd29yayBwcm9kdWN0cywgaW5mb3JtYXRpb24gb24gZGlmZmVyZW50IHN1YnR5cGVzIGFuZCB2YXJpYW50cyBvZiB0aGUgd29yayBwcm9kdWN0IGFuZCBob3cgdGhleSBldm9sdmUgdGhyb3VnaG91dCBhIGxpZmVjeWNsZSwgZGlzY3Vzc2lvbnMgb24gc2tpbGxzIHRoZSBwZXJmb3JtaW5nIHJvbGVzIHNob3VsZCBhY3F1aXJlIG9yIGltcHJvdmUgdXBvbiwgbWVhc3VyZW1lbnRzIGZvciBwcm9ncmVzcyBhbmQgbWF0dXJpdHksIGV0Yy4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldEd1aWRlbGluZSgpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nR3VpZGVsaW5lJyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgR3VpZGVsaW5lIGV4dGVuZHMgR3VpZGFuY2UgewotfSAvLyBHdWlkZWxpbmUKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvSXRlcmF0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvSXRlcmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5ZDg1YjcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0l0ZXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBJdGVyYXRpb24uamF2YSx2IDEuMSAyMDA4LzAxLzE1IDA4OjUyOjA3IGp0aGFtIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWE7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+SXRlcmF0aW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQSBzcGVjaWFsIEFjdGl2aXR5IHdoaWNoIHByZXNjcmliZXMgcHJlLWRlZmluZWQgdmFsdWVzIGZvciBpdHMgaW5zdGFuY2VzIGZvciB0aGUgYXR0cmlidXRlcyBwcmVmaXggKCdJdGVyYXRpb24nKSBhbmQgaXNSZXBlYXRhYmxlICgnVHJ1ZScpLiAgSXQgaGFzIGJlZW4gaW5jbHVkZWQgaW50byB0aGUgbWV0YS1tb2RlbCBmb3IgY29udmVuaWVuY2UgYW5kIHRvIHByb3ZpZGUgYSBzcGVjaWFsIHN0ZXJlb3R5cGUsIGJlY2F1c2UgaXQgcmVwcmVzZW50cyBhIHZlcnkgY29tbW9ubHkgdXNlZCBBY3Rpdml0eSB0eXBlLgotICogSXRlcmF0aW9uIGdyb3VwcyBhIHNldCBvZiBuZXN0ZWQgQWN0aXZpdGllcyB0aGF0IGFyZSByZXBlYXRlZCBtb3JlIHRoYW4gb25jZS4gIEl0IHJlcHJlc2VudHMgYW4gaW1wb3J0YW50IHN0cnVjdHVyaW5nIGVsZW1lbnQgdG8gb3JnYW5pemUgd29yayBpbiByZXBldGl0aXZlIGN5Y2xlcy4gIFRoZSBjb25jZXB0IG9mIEl0ZXJhdGlvbiBjYW4gYmUgYXNzb2NpYXRlZCB3aXRoIGRpZmZlcmVudCBydWxlcyBpbiBkaWZmZXJlbnQgbWV0aG9kcy4gIEZvciBleGFtcGxlLCB0aGUgSUJNIFJhdGlvbmFsIFVuaWZpZWQgUHJvY2VzcyBtZXRob2QgZnJhbWV3b3JrIChSVVApIGRlZmluZXMgYSBydWxlIHRoYXQgSXRlcmF0aW9ucyBhcmUgbm90IGFsbG93ZWQgdG8gc3BhbiBhY3Jvc3MgUGhhc2VzLiAgSW4gY29udHJhc3QgSUJNIEdsb2JhbCBTZXJ2aWNlcyBNZXRob2QgKEdTTWV0aG9kKSBiYXNlZCBtZXRob2QgZnJhbWV3b3JrcyB0aGlzIHJ1bGUgZG9lcyBub3QgYXBwbHkgYW5kIEl0ZXJhdGlvbiBjYW4gYmUgZGVmaW5lZCB3aGljaCBuZXN0IFBoYXNlcy4gIFJ1bGVzIGxpa2UgdGhlc2UsIHdoaWNoIHBsYXkgYW4gaW1wb3J0YW50IHJvbGUgZm9yIGVhY2ggaW5kaXZpZHVhbCBtZXRob2QgYW5kIGFyZSB0aGVyZWZvcmUgbm90IGVuZm9yY2VkIGJ5IHRoaXMgbWV0YS1tb2RlbC4gIEluc3RlYWQsIHByb2Nlc3MgYXV0aG9ycyBhcmUgZXhwZWN0ZWQgdG8gZm9sbG93IGFuZCBjaGVjayB0aGVzZSBydWxlcyBtYW51YWxseS4gIChOb3RlOiBBbnkgQnJlYWtkb3duIEVsZW1lbnQgY2FuIGJlIHJlcGVhdGVkOyBob3dldmVyLCBJdGVyYXRpb25zIGhhcyBiZWVuIGludHJvZHVjZWQgYXMgYSBzcGVjaWFsIG1ldGEtbW9kZWwgY29uY2VwdCwgYmVjYXVzZSBvZiBpdHMgaW1wb3J0YW50IHJvbGUgZm9yIG1hbnkgbWV0aG9kcy4pCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRJdGVyYXRpb24oKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J0l0ZXJhdGlvbicga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEl0ZXJhdGlvbiBleHRlbmRzIEFjdGl2aXR5IHsKLX0gLy8gSXRlcmF0aW9uClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0tpbmQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9LaW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyNjk3NTUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0tpbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogS2luZC5qYXZhLHYgMS4xIDIwMDgvMDEvMzAgMDA6NDE6NDgga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5LaW5kPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLktpbmQjZ2V0QXBwbGljYWJsZU1ldGFDbGFzc0luZm8gPGVtPkFwcGxpY2FibGUgTWV0YSBDbGFzcyBJbmZvPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldEtpbmQoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J0tpbmQnIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBLaW5kIGV4dGVuZHMgQ29udGVudEVsZW1lbnQgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkFwcGxpY2FibGUgTWV0YSBDbGFzcyBJbmZvPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5BcHBsaWNhYmxlIE1ldGEgQ2xhc3MgSW5mbzwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkFwcGxpY2FibGUgTWV0YSBDbGFzcyBJbmZvPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRLaW5kX0FwcGxpY2FibGVNZXRhQ2xhc3NJbmZvKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0FwcGxpY2FibGVNZXRhQ2xhc3NJbmZvJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3Q8U3RyaW5nPiBnZXRBcHBsaWNhYmxlTWV0YUNsYXNzSW5mbygpOwotCi19IC8vIEtpbmQKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9NZXRob2RDb25maWd1cmF0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvTWV0aG9kQ29uZmlndXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOGI5NzM4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9NZXRob2RDb25maWd1cmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjcgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBNZXRob2RDb25maWd1cmF0aW9uLmphdmEsdiAxLjIgMjAwOC8wMS8zMCAwMDo0MTo0OCBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk1ldGhvZCBDb25maWd1cmF0aW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQSBjb2xsZWN0aW9uIG9mIHNlbGVjdGVkIE1ldGhvZCBNb2RlbHMgYW5kIE1ldGhvZFBhY2thZ2VzLiBBIGNvbmZpZ3VyYXRpb24gY2FuIGJlIGV4cG9ydGVkIGludG8gaXRzIG93biBzdGFuZGFsb25lIGxpYnJhcnkgd2hlbiBpdCBpbmNsdWRlcyB0aGUgZnVsbCB0cmFuc2l0aXZlIGNsb3N1cmUgb2YgYWxsIGVsZW1lbnRzIGFsbCBvdGhlciBlbGVtZW50cyBkZXBlbmQgb24uCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kQ29uZmlndXJhdGlvbiNnZXRCYXNlQ29uZmlndXJhdGlvbiA8ZW0+QmFzZSBDb25maWd1cmF0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RDb25maWd1cmF0aW9uI2dldE1ldGhvZFBsdWdpblNlbGVjdGlvbiA8ZW0+TWV0aG9kIFBsdWdpbiBTZWxlY3Rpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZENvbmZpZ3VyYXRpb24jZ2V0TWV0aG9kUGFja2FnZVNlbGVjdGlvbiA8ZW0+TWV0aG9kIFBhY2thZ2UgU2VsZWN0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RDb25maWd1cmF0aW9uI2dldERlZmF1bHRWaWV3IDxlbT5EZWZhdWx0IFZpZXc8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZENvbmZpZ3VyYXRpb24jZ2V0UHJvY2Vzc1ZpZXcgPGVtPlByb2Nlc3MgVmlldzwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kQ29uZmlndXJhdGlvbiNnZXRTdWJ0cmFjdGVkQ2F0ZWdvcnkgPGVtPlN1YnRyYWN0ZWQgQ2F0ZWdvcnk8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZENvbmZpZ3VyYXRpb24jZ2V0QWRkZWRDYXRlZ29yeSA8ZW0+QWRkZWQgQ2F0ZWdvcnk8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0TWV0aG9kQ29uZmlndXJhdGlvbigpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nTWV0aG9kQ29uZmlndXJhdGlvbicga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIE1ldGhvZENvbmZpZ3VyYXRpb24gZXh0ZW5kcyBNZXRob2RVbml0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5CYXNlIENvbmZpZ3VyYXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkJhc2UgQ29uZmlndXJhdGlvbjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkJhc2UgQ29uZmlndXJhdGlvbjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0TWV0aG9kQ29uZmlndXJhdGlvbl9CYXNlQ29uZmlndXJhdGlvbigpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdCYXNlQ29uZmlndXJhdGlvbiciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0PFN0cmluZz4gZ2V0QmFzZUNvbmZpZ3VyYXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1ldGhvZCBQbHVnaW4gU2VsZWN0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5NZXRob2QgUGx1Z2luIFNlbGVjdGlvbjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1ldGhvZCBQbHVnaW4gU2VsZWN0aW9uPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRNZXRob2RDb25maWd1cmF0aW9uX01ldGhvZFBsdWdpblNlbGVjdGlvbigpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdNZXRob2RQbHVnaW5TZWxlY3Rpb24nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdDxTdHJpbmc+IGdldE1ldGhvZFBsdWdpblNlbGVjdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TWV0aG9kIFBhY2thZ2UgU2VsZWN0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5NZXRob2QgUGFja2FnZSBTZWxlY3Rpb248L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NZXRob2QgUGFja2FnZSBTZWxlY3Rpb248L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldE1ldGhvZENvbmZpZ3VyYXRpb25fTWV0aG9kUGFja2FnZVNlbGVjdGlvbigpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdNZXRob2RQYWNrYWdlU2VsZWN0aW9uJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3Q8U3RyaW5nPiBnZXRNZXRob2RQYWNrYWdlU2VsZWN0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EZWZhdWx0IFZpZXc8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkRlZmF1bHQgVmlldzwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EZWZhdWx0IFZpZXc8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldERlZmF1bHRWaWV3KFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0TWV0aG9kQ29uZmlndXJhdGlvbl9EZWZhdWx0VmlldygpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdEZWZhdWx0VmlldyciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXREZWZhdWx0VmlldygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kQ29uZmlndXJhdGlvbiNnZXREZWZhdWx0VmlldyA8ZW0+RGVmYXVsdCBWaWV3PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5EZWZhdWx0IFZpZXc8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldERlZmF1bHRWaWV3KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXREZWZhdWx0VmlldyhTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UHJvY2VzcyBWaWV3PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Qcm9jZXNzIFZpZXc8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Qcm9jZXNzIFZpZXc8L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldE1ldGhvZENvbmZpZ3VyYXRpb25fUHJvY2Vzc1ZpZXcoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nUHJvY2Vzc1ZpZXcnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdDxTdHJpbmc+IGdldFByb2Nlc3NWaWV3KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TdWJ0cmFjdGVkIENhdGVnb3J5PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5TdWJ0cmFjdGVkIENhdGVnb3J5PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U3VidHJhY3RlZCBDYXRlZ29yeTwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0TWV0aG9kQ29uZmlndXJhdGlvbl9TdWJ0cmFjdGVkQ2F0ZWdvcnkoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nU3VidHJhY3RlZENhdGVnb3J5JyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3Q8U3RyaW5nPiBnZXRTdWJ0cmFjdGVkQ2F0ZWdvcnkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkFkZGVkIENhdGVnb3J5PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5BZGRlZCBDYXRlZ29yeTwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkFkZGVkIENhdGVnb3J5PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRNZXRob2RDb25maWd1cmF0aW9uX0FkZGVkQ2F0ZWdvcnkoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQWRkZWRDYXRlZ29yeSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0PFN0cmluZz4gZ2V0QWRkZWRDYXRlZ29yeSgpOwotCi19IC8vIE1ldGhvZENvbmZpZ3VyYXRpb24KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvTWV0aG9kRWxlbWVudC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL01ldGhvZEVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDE4MWE2Yy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvTWV0aG9kRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQ3ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogTWV0aG9kRWxlbWVudC5qYXZhLHYgMS4yIDIwMDgvMDEvMzAgMDA6NDE6NDgga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXA7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk1ldGhvZCBFbGVtZW50PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogVGhlIHJvb3QgZ2VuZXJhbGl6YXRpb24gZm9yIGFsbCBVTUEgTWV0aG9kIEVsZW1lbnRzLiAgRGVmaW5lcyBhIGNvbW1vbiBzZXQgb2YgYXR0cmlidXRlcyBpbmhlcml0ZWQgYnkgYWxsIFVNQSBNZXRob2QgRWxlbWVudHMuICBNZXRob2QgRWxlbWVudCBpdHNlbGYgaXMgZGVyaXZlZCBmcm9tIFBhY2thZ2VhYmxlIEVsZW1lbnQgZnJvbSB0aGUgVU1MIDIuMCBJbmZyYXN0cnVjdHVyZS4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RFbGVtZW50I2dldEdyb3VwIDxlbT5Hcm91cDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kRWxlbWVudCNnZXRPd25lZFJ1bGUgPGVtPk93bmVkIFJ1bGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZEVsZW1lbnQjZ2V0TWV0aG9kRWxlbWVudFByb3BlcnR5IDxlbT5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kRWxlbWVudCNnZXRCcmllZkRlc2NyaXB0aW9uIDxlbT5CcmllZiBEZXNjcmlwdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kRWxlbWVudCNnZXRJZCA8ZW0+SWQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZEVsZW1lbnQjZ2V0T3JkZXJpbmdHdWlkZSA8ZW0+T3JkZXJpbmcgR3VpZGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZEVsZW1lbnQjZ2V0UHJlc2VudGF0aW9uTmFtZSA8ZW0+UHJlc2VudGF0aW9uIE5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZEVsZW1lbnQjaXNTdXBwcmVzc2VkIDxlbT5TdXBwcmVzc2VkPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldE1ldGhvZEVsZW1lbnQoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J01ldGhvZEVsZW1lbnQnIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBNZXRob2RFbGVtZW50IGV4dGVuZHMgUGFja2FnZWFibGVFbGVtZW50IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Hcm91cDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXAuRW50cnl9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+R3JvdXA8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Hcm91cDwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0TWV0aG9kRWxlbWVudF9Hcm91cCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUZlYXR1cmVNYXBFbnRyeSIgbWFueT0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZ3JvdXAnIG5hbWU9J2dyb3VwOjEnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlGZWF0dXJlTWFwIGdldEdyb3VwKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29uc3RyYWludH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBEZWZpbmVzIHRoZSBwYWNrYWdpbmcgcnVsZXMgZm9yIHRoaXMgTWV0aG9kIEVsZW1lbnQuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk93bmVkIFJ1bGU8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldE1ldGhvZEVsZW1lbnRfT3duZWRSdWxlKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J093bmVkUnVsZScgZ3JvdXA9JyNncm91cDoxJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3Q8Q29uc3RyYWludD4gZ2V0T3duZWRSdWxlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZEVsZW1lbnRQcm9wZXJ0eX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRNZXRob2RFbGVtZW50X01ldGhvZEVsZW1lbnRQcm9wZXJ0eSgpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIHZvbGF0aWxlPSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdNZXRob2RFbGVtZW50UHJvcGVydHknIGdyb3VwPScjZ3JvdXA6MSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0PE1ldGhvZEVsZW1lbnRQcm9wZXJ0eT4gZ2V0TWV0aG9kRWxlbWVudFByb3BlcnR5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogRXZlcnkgaW5zdGFuY2Ugb2YgTWV0aG9kIEVsZW1lbnQgc2hhbGwgYmUgYnJpZWZseSBkZXNjcmliZWQgd2l0aCBvbmUgb3IgdHdvIHNlbnRlbmNlcyBzdW1tYXJpemluZyB0aGUgZWxlbWVudC4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QnJpZWYgRGVzY3JpcHRpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEJyaWVmRGVzY3JpcHRpb24oU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRNZXRob2RFbGVtZW50X0JyaWVmRGVzY3JpcHRpb24oKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nYXR0cmlidXRlJyBuYW1lPSdicmllZkRlc2NyaXB0aW9uJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldEJyaWVmRGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZEVsZW1lbnQjZ2V0QnJpZWZEZXNjcmlwdGlvbiA8ZW0+QnJpZWYgRGVzY3JpcHRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkJyaWVmIERlc2NyaXB0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRCcmllZkRlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRCcmllZkRlc2NyaXB0aW9uKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogRXZlcnkgaW5zdGFuY2Ugb2YgTWV0aG9kIEVsZW1lbnQgaGFzIGEgZ2xvYmFsIHVuaXF1ZSBpZC4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldElkKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0TWV0aG9kRWxlbWVudF9JZCgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdhdHRyaWJ1dGUnIG5hbWU9J2lkJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldElkKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RFbGVtZW50I2dldElkIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRJZChTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFVzZWQgZm9yIENBU0UgdG9vbCByZWFsaXphdGlvbnMgb2YgdGhpcyBtb2RlbCB0byBjb250YWluIGluZm9ybWF0aW9uIGFib3V0IGxheW91dCBhbmQgb3JkZXJpbmcgb2YgdGhlIG1ldGhvZCBlbGVtZW50IGFuZCBpdHMgcGFydHMuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk9yZGVyaW5nIEd1aWRlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRPcmRlcmluZ0d1aWRlKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0TWV0aG9kRWxlbWVudF9PcmRlcmluZ0d1aWRlKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2F0dHJpYnV0ZScgbmFtZT0nb3JkZXJpbmdHdWlkZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRPcmRlcmluZ0d1aWRlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RFbGVtZW50I2dldE9yZGVyaW5nR3VpZGUgPGVtPk9yZGVyaW5nIEd1aWRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5PcmRlcmluZyBHdWlkZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0T3JkZXJpbmdHdWlkZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0T3JkZXJpbmdHdWlkZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIEV2ZXJ5IERlc2NyaWJhYmxlIEVsZW1lbnQgaGFzIGEgcHJlc2VudGF0aW9uIG5hbWUsIHdoaWNoIGlzIHVzZWQgZm9yIGV4dGVybmFsIHByZXNlbnRhdGlvbiBvZiB0aGUgZWxlbWVudC4gIEZvciBleGFtcGxlLCBuYW1lICh0aGUgaW50ZXJuYWwgcmVwcmVzZW50YXRpb24pIG1pZ2h0IGJlIHNldCB0byAicnVwX2FyY2hpdGVjdHVyZV9kb2N1bWVudCIgdG8gZGlmZmVyZW50aWF0ZSBmcm9tIGEgImoyZWVfYXJjaGl0Y3R1cmVfZG9jdW1lbnQiIHdoZXJlYXMgdGhlIGV4dGVybmFsIHByZXNlbnRhdGlvbiB3b3VsZCBhbHdheXMgYmUgIkFyY2hpdGVjdHVyZSBEb2N1bWVudCIuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlByZXNlbnRhdGlvbiBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRQcmVzZW50YXRpb25OYW1lKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0TWV0aG9kRWxlbWVudF9QcmVzZW50YXRpb25OYW1lKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2F0dHJpYnV0ZScgbmFtZT0ncHJlc2VudGF0aW9uTmFtZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRQcmVzZW50YXRpb25OYW1lKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RFbGVtZW50I2dldFByZXNlbnRhdGlvbk5hbWUgPGVtPlByZXNlbnRhdGlvbiBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5QcmVzZW50YXRpb24gTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UHJlc2VudGF0aW9uTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UHJlc2VudGF0aW9uTmFtZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogSWYgYSBWYXJpYWJpbGl0eSBFbGVtZW50IGlzIGRlcml2ZWQgZnJvbSBhbm90aGVyIFZhcmlhYmlsaXR5IEVsZW1lbnQgdXNpbmcgdGhlICJleHRlbmRzIiBWYXJpYWJpbGl0eSBTcGVjaWFsaXphdGlvbiwgdGhlbiB0aGlzIGF0dHJpYnV0ZSBjYW4gYmUgdXNlZCB0byBzdXBwcmVzcyBpbmhlcml0ZWQgTWV0aG9kIEVsZW1lbnRzIHRoYXQgd2VyZSBwYXJ0IG9mIHRoZSBiYXNlZC1vbiBWYXJpYWJpbGl0eSBFbGVtZW50LCB3aGljaCBjYW4gYmUgYW55IHR5cGUgb2YgTWV0aG9kIEVsZW1lbnQuICBJbiBvdGhlciB3b3JkcywgaWYgdGhpcyBhdHRyaWJ1dGUgaXMgc2V0IHRvIHRydWUgb24gYSBNZXRob2QgRWxlbWVudCB0aGF0IGhhcyB0aGUgc2FtZSBuYW1lIHRoYW4gYW4gaW5oZXJpdGVkIG1ldGhvZCBlbGVtZW50IHRoZW4gaXQgd2lsbCBub3QgYmUgcmVnYXJkZWQgYXMgaW5oZXJpdGVkIGF0IGFsbC4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U3VwcHJlc3NlZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRTdXBwcmVzc2VkKCkKLQkgKiBAc2VlICN1bnNldFN1cHByZXNzZWQoKQotCSAqIEBzZWUgI3NldFN1cHByZXNzZWQoYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0TWV0aG9kRWxlbWVudF9TdXBwcmVzc2VkKCkKLQkgKiBAbW9kZWwgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdhdHRyaWJ1dGUnIG5hbWU9J3N1cHByZXNzZWQnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU3VwcHJlc3NlZCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kRWxlbWVudCNpc1N1cHByZXNzZWQgPGVtPlN1cHByZXNzZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlN1cHByZXNzZWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0U3VwcHJlc3NlZCgpCi0JICogQHNlZSAjdW5zZXRTdXBwcmVzc2VkKCkKLQkgKiBAc2VlICNpc1N1cHByZXNzZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFN1cHByZXNzZWQoYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZEVsZW1lbnQjaXNTdXBwcmVzc2VkIDxlbT5TdXBwcmVzc2VkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldFN1cHByZXNzZWQoKQotCSAqIEBzZWUgI2lzU3VwcHJlc3NlZCgpCi0JICogQHNlZSAjc2V0U3VwcHJlc3NlZChib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0U3VwcHJlc3NlZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RFbGVtZW50I2lzU3VwcHJlc3NlZCA8ZW0+U3VwcHJlc3NlZDwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U3VwcHJlc3NlZDwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0U3VwcHJlc3NlZCgpCi0JICogQHNlZSAjaXNTdXBwcmVzc2VkKCkKLQkgKiBAc2VlICNzZXRTdXBwcmVzc2VkKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRTdXBwcmVzc2VkKCk7Ci0KLX0gLy8gTWV0aG9kRWxlbWVudApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9NZXRob2RFbGVtZW50UHJvcGVydHkuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9NZXRob2RFbGVtZW50UHJvcGVydHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGM0MzIxNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvTWV0aG9kRWxlbWVudFByb3BlcnR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IE1ldGhvZEVsZW1lbnRQcm9wZXJ0eS5qYXZhLHYgMS4yIDIwMDgvMDEvMzAgMDA6NDE6NDgga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZEVsZW1lbnRQcm9wZXJ0eSNnZXRWYWx1ZSA8ZW0+VmFsdWU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0TWV0aG9kRWxlbWVudFByb3BlcnR5KCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdNZXRob2RFbGVtZW50UHJvcGVydHknIGtpbmQ9J2VtcHR5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBNZXRob2RFbGVtZW50UHJvcGVydHkgZXh0ZW5kcyBQYWNrYWdlYWJsZUVsZW1lbnQgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5WYWx1ZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5WYWx1ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0VmFsdWUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRNZXRob2RFbGVtZW50UHJvcGVydHlfVmFsdWUoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nYXR0cmlidXRlJyBuYW1lPSd2YWx1ZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRWYWx1ZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kRWxlbWVudFByb3BlcnR5I2dldFZhbHVlIDxlbT5WYWx1ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VmFsdWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFZhbHVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRWYWx1ZShTdHJpbmcgdmFsdWUpOwotCi19IC8vIE1ldGhvZEVsZW1lbnRQcm9wZXJ0eQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9NZXRob2RMaWJyYXJ5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvTWV0aG9kTGlicmFyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmM2YwZjcwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9NZXRob2RMaWJyYXJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IE1ldGhvZExpYnJhcnkuamF2YSx2IDEuMiAyMDA4LzAxLzMwIDAwOjQxOjQ3IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+TWV0aG9kIExpYnJhcnk8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIE1ldGhvZCBMaWJyYXJ5IGlzIGEgcGh5c2ljYWwgY29udGFpbmVyIGZvciBNZXRob2QgUGx1Z2lucyBhbmQgTWV0aG9kIENvbmZpZ3VyYXRpb24gZGVmaW5pdGlvbnMuICBBbGwgTWV0aG9kIEVsZW1lbnRzIGFyZSBzdG9yZWQgaW4gYSBNZXRob2QgTGlicmFyeS4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RMaWJyYXJ5I2dldE1ldGhvZFBsdWdpbiA8ZW0+TWV0aG9kIFBsdWdpbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kTGlicmFyeSNnZXRNZXRob2RDb25maWd1cmF0aW9uIDxlbT5NZXRob2QgQ29uZmlndXJhdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kTGlicmFyeSNnZXRUb29sIDxlbT5Ub29sPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldE1ldGhvZExpYnJhcnkoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J01ldGhvZExpYnJhcnknIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBNZXRob2RMaWJyYXJ5IGV4dGVuZHMgTWV0aG9kVW5pdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TWV0aG9kIFBsdWdpbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZFBsdWdpbn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5NZXRob2QgUGx1Z2luPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TWV0aG9kIFBsdWdpbjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0TWV0aG9kTGlicmFyeV9NZXRob2RQbHVnaW4oKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nTWV0aG9kUGx1Z2luJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3Q8TWV0aG9kUGx1Z2luPiBnZXRNZXRob2RQbHVnaW4oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1ldGhvZCBDb25maWd1cmF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kQ29uZmlndXJhdGlvbn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5NZXRob2QgQ29uZmlndXJhdGlvbjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1ldGhvZCBDb25maWd1cmF0aW9uPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRNZXRob2RMaWJyYXJ5X01ldGhvZENvbmZpZ3VyYXRpb24oKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nTWV0aG9kQ29uZmlndXJhdGlvbiciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0PE1ldGhvZENvbmZpZ3VyYXRpb24+IGdldE1ldGhvZENvbmZpZ3VyYXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlRvb2w8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlRvb2w8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHRvb2wgdGhhdCBnZW5lcmF0ZWQgdGhlIFhNTCBmaWxlLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Ub29sPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRUb29sKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0TWV0aG9kTGlicmFyeV9Ub29sKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2F0dHJpYnV0ZScgbmFtZT0ndG9vbCciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRUb29sKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RMaWJyYXJ5I2dldFRvb2wgPGVtPlRvb2w8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlRvb2w8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFRvb2woKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFRvb2woU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBNZXRob2RMaWJyYXJ5ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL01ldGhvZFBhY2thZ2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9NZXRob2RQYWNrYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmOWRlZDQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL01ldGhvZFBhY2thZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MCArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IE1ldGhvZFBhY2thZ2UuamF2YSx2IDEuMiAyMDA4LzAxLzMwIDAwOjQxOjQ4IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5NZXRob2QgUGFja2FnZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEFuIGFic3RyYWN0IGNsYXNzIGZvciBwYWNrYWdpbmcgTWV0aG9kIEVsZW1lbnRzLiAgQWxsIE1ldGhvZCBFbGVtZW50cyBzaGFsbCBiZSBsb2NhdGVkIGluIGV4YWN0bHkgb25lIG9mIE1ldGhvZCBQYWNrYWdlJ3MgY29uY3JldGUgc3BlY2lhbGl6YXRpb25zIChlLmcuIENvbnRlbnQgUGFja2FnZSkuICAgTWV0aG9kIFBhY2thZ2UgZGVmaW5lcyBjb21tb24gcHJvcGVydGllcyBmb3IgYWxsIG9mIGl0cyBzcGVjaWFsaXphdGlvbnMuIEVsZW1lbnRzIGFyZSBvcmdhbml6ZWQgaW4gTWV0aG9kIFBhY2thZ2VzIHRvIHN0cnVjdHVyZSBsYXJnZSBzY2FsZSBvZiBtZXRob2QgY29udGVudCBhbmQgcHJvY2Vzc2VzIGFzIHdlbGwgYXMgdG8gZGVmaW5lIGEgbWVjaGFuaXNtIGZvciByZXVzZS4gIE1ldGhvZCBFbGVtZW50cyBmcm9tIG9uZSBwYWNrYWdlIGNhbiByZXVzZSBlbGVtZW50IGZyb20gb3RoZXIgcGFja2FnZXMgYnkgZGVmaW5pbmcgYSByZXVzZWRQYWNrYWdlcyBsaW5rLiAgRm9yIGV4YW1wbGUsIGEgd29yayBwcm9kdWN0IGRlZmluZWQgaW4gb25lIHBhY2thZ2UgY2FuIGJlIHVzZWQgYXMgYW4gaW5wdXQgZm9yIFRhc2tzIGRlZmluZWQgaW4gb3RoZXIgcGFja2FnZXMuICBCeSByZXVzaW5nIGl0IGZyb20gb25lIGNvbW1vbiBwbGFjZSAoaS5lLiB0aGUgcGFja2FnZSBpbiB3aGljaCBpdCBoYXMgYmVlbiBkZWZpbmVkKSBlbnN1cmVzIHRoYXQgbm8gcmVkdW5kYW50IGRlZmluaXRpb25zIG9mIHRoZSBzYW1lIGVsZW1lbnRzIGFyZSByZXF1aXJlZC4gIEFsc28gbWFpbnRlbmFuY2Ugb2YgbWV0aG9kIGNvbnRlbnQgaXMgZ3JlYXRseSBpbXByb3ZlZCBhcyBjaGFuZ2VzIGNhbiBiZSBwZXJmb3JtZWQgaW4gb25seSBvbmUgcGxhY2UuICBOb3RlLCB0aGF0IG90aGVyIHBhY2thZ2VzIHdpbGwgaW50cm9kdWNlIG1vcmUgc3BlY2lhbGl6YXRpb25zIG9mIE1ldGhvZCBQYWNrYWdlLCBlLmcuIFByb2Nlc3MgUGFja2FnZSBhbmQgUHJvY2VzcyBDb21wb25lbnQuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kUGFja2FnZSNnZXRHcm91cDEgPGVtPkdyb3VwMTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kUGFja2FnZSNnZXRSZXVzZWRQYWNrYWdlIDxlbT5SZXVzZWQgUGFja2FnZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kUGFja2FnZSNnZXRNZXRob2RQYWNrYWdlIDxlbT5NZXRob2QgUGFja2FnZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kUGFja2FnZSNpc0dsb2JhbCA8ZW0+R2xvYmFsPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldE1ldGhvZFBhY2thZ2UoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J01ldGhvZFBhY2thZ2UnIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBNZXRob2RQYWNrYWdlIGV4dGVuZHMgTWV0aG9kRWxlbWVudCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+R3JvdXAxPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcC5FbnRyeX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Hcm91cDE8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Hcm91cDE8L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldE1ldGhvZFBhY2thZ2VfR3JvdXAxKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRmVhdHVyZU1hcEVudHJ5IiBtYW55PSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdncm91cCcgbmFtZT0nZ3JvdXA6OSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUZlYXR1cmVNYXAgZ2V0R3JvdXAxKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SZXVzZWQgUGFja2FnZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UmV1c2VkIFBhY2thZ2U8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZXVzZWQgUGFja2FnZTwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0TWV0aG9kUGFja2FnZV9SZXVzZWRQYWNrYWdlKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciIHRyYW5zaWVudD0idHJ1ZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1JldXNlZFBhY2thZ2UnIGdyb3VwPScjZ3JvdXA6OSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0PFN0cmluZz4gZ2V0UmV1c2VkUGFja2FnZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TWV0aG9kIFBhY2thZ2U8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RQYWNrYWdlfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk1ldGhvZCBQYWNrYWdlPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TWV0aG9kIFBhY2thZ2U8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldE1ldGhvZFBhY2thZ2VfTWV0aG9kUGFja2FnZSgpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIHZvbGF0aWxlPSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdNZXRob2RQYWNrYWdlJyBncm91cD0nI2dyb3VwOjknIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdDxNZXRob2RQYWNrYWdlPiBnZXRNZXRob2RQYWNrYWdlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5HbG9iYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIE1ldGhvZCBQYWNrYWdlcyBjYW4gaGF2ZSBhIGdsb2JhbCBzY29wZS4gIFRoaXMgbWVhbnMgdGhhdCBldmVyeSBlbGVtZW50IG9mIGV2ZXJ5IG90aGVyIE1ldGhvZCBQYWNrYWdlIGNhbiBzZWUgdGhlIGdsb2JhbCBwYWNrYWdlJ3MgY29udGVudHMuICBHbG9iYWwgTWV0aG9kIFBhY2thZ2VzIGFyZSBwcmltYXJpbHkgdXNlZCB0byBzdG9yZSBjb21tb25seSB1c2VkIGNhdGVnb3J5IGRlZmluaXRpb25zIHN1Y2ggYXMgZm9yIERpc2NpcGxpbmVzIG9yIERvbWFpbnMsIHdoaWNoIGFyZSB1c2VkIGJ5IG1hbnkgVGFzayBhbmQgV29yayBQcm9kdWN0cyByZXNwZWN0aXZlbHkuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkdsb2JhbDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRHbG9iYWwoKQotCSAqIEBzZWUgI3Vuc2V0R2xvYmFsKCkKLQkgKiBAc2VlICNzZXRHbG9iYWwoYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0TWV0aG9kUGFja2FnZV9HbG9iYWwoKQotCSAqIEBtb2RlbCB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW4iCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2F0dHJpYnV0ZScgbmFtZT0nZ2xvYmFsJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc0dsb2JhbCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kUGFja2FnZSNpc0dsb2JhbCA8ZW0+R2xvYmFsPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5HbG9iYWw8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0R2xvYmFsKCkKLQkgKiBAc2VlICN1bnNldEdsb2JhbCgpCi0JICogQHNlZSAjaXNHbG9iYWwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEdsb2JhbChib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kUGFja2FnZSNpc0dsb2JhbCA8ZW0+R2xvYmFsPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldEdsb2JhbCgpCi0JICogQHNlZSAjaXNHbG9iYWwoKQotCSAqIEBzZWUgI3NldEdsb2JhbChib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0R2xvYmFsKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZFBhY2thZ2UjaXNHbG9iYWwgPGVtPkdsb2JhbDwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+R2xvYmFsPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRHbG9iYWwoKQotCSAqIEBzZWUgI2lzR2xvYmFsKCkKLQkgKiBAc2VlICNzZXRHbG9iYWwoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldEdsb2JhbCgpOwotCi19IC8vIE1ldGhvZFBhY2thZ2UKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvTWV0aG9kUGx1Z2luLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvTWV0aG9kUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3ZDQwNmUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL01ldGhvZFBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI0ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogTWV0aG9kUGx1Z2luLmphdmEsdiAxLjIgMjAwOC8wMS8zMCAwMDo0MTo0OCBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk1ldGhvZCBQbHVnaW48L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIHNwZWNpYWwgTWV0aG9kIFVuaXQgdGhhdCByZXByZXNlbnRzIGEgcGh5c2ljYWwgY29udGFpbmVyIGZvciBNZXRob2QgUGFja2FnZXMuICBJdCBkZWZpbmVzIGEgZ3JhbnVsYXJpdHkgbGV2ZWwgZm9yIHRoZSBtb2R1bGFyaXphdGlvbiBhbmQgb3JnYW5pemF0aW9uIG9mIG1ldGhvZCBjb250ZW50IGFuZCBwcm9jZXNzZXMuICBBIE1ldGhvZCBQbHVnaW4gY2FuIGV4dGVuZCBtYW55IG90aGVyIE1ldGhvZCBQbHVnaW5zIGFuZCBpdCBjYW4gYmUgZXh0ZW5kZWQgYnkgbWFueSBNZXRob2QgUGx1Z2lucy4gIEl0IGNhbiBhbHNvIGJlIHVzZWQgc3RhbmQtYWxvbmUsIGkuZS4gd2l0aCBubyBFeHRlbnNpb24gcmVsYXRpb25zaGlwIHRvIG90aGVyIHBsdWctaW5zLgotICogTWV0aG9kIFBsdWdpbiBjb25jZXB0dWFsbHkgcmVwcmVzZW50cyBhIHVuaXQgZm9yIGNvbmZpZ3VyYXRpb24sIG1vZHVsYXJpemF0aW9uLCBleHRlbnNpb24sIHBhY2thZ2luZywgYW5kIGRlcGxveW1lbnQgb2YgbWV0aG9kIGNvbnRlbnQgYW5kIHByb2Nlc3Nlcy4gIEEgUHJvY2VzcyBFbmdpbmVlciBzaGFsbCBkZXNpZ24gaGlzIFBsdWdpbnMgYW5kIGFsbG9jYXRlIGhpcyBjb250ZW50IHRvIHRoZXNlIFBsdWdpbnMgd2l0aCByZXF1aXJlbWVudHMgZm9yIGV4dGVuc2liaWxpdHksIG1vZHVsYXJpdHksIHJldXNlLCBhbmQgbWFpbnRhaW5hYmlsaXR5IGluIG1pbmQuCi0gKiBTcGVjaWFsIGV4dGVuc2liaWxpdHkgbWVjaGFuaXNtcyBkZWZpbmVkIGZvciB0aGUgbWV0YS1jbGFzc2VzIFZhcmlhYmlsaXR5IEVsZW1lbnQgYW5kIFByb2Nlc3MgQ29udHJpYnV0aW9uIGFsbG93IFBsdWdpbiBjb250ZW50IHRvIGRpcmVjdGx5IGNvbnRyaWJ1dGUgbmV3IGNvbnRlbnQsIHJlcGxhY2UgZXhpc3RpbmcgY29udGVudCwgb3IgdG8gY3Jvc3MtcmVmZXJlbmNlIHRvIGFueSBDb250ZW50IEVsZW1lbnQgb3IgUHJvY2VzcyB3aXRoaW4gYW5vdGhlciBQbHVnaW4gdGhhdCBpdCBleHRlbmRzLiAgU2ltaWxhciB0byBVTUwgMi4wJ3MgJ3BhY2thZ2UgbWVyZ2UnIG1lY2hhbmlzbSB0cmFuc2Zvcm1hdGlvbiBpbnRlcnByZXRhdGlvbnMsIGludGVycHJldGluZyB0aGVzZSBNZXRob2QgUGx1Z2luIG1lY2hhbmlzbXMgcmVzdWx0cyBpbnRvIG5ldyBleHRlbmRlZCBNZXRob2QgQ29udGVudCBhbmQgUHJvY2Vzc2VzLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZFBsdWdpbiNnZXRSZWZlcmVuY2VkTWV0aG9kUGx1Z2luIDxlbT5SZWZlcmVuY2VkIE1ldGhvZCBQbHVnaW48L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZFBsdWdpbiNnZXRNZXRob2RQYWNrYWdlIDxlbT5NZXRob2QgUGFja2FnZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kUGx1Z2luI2lzVXNlckNoYW5nZWFibGUgPGVtPlVzZXIgQ2hhbmdlYWJsZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRNZXRob2RQbHVnaW4oKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J01ldGhvZFBsdWdpbicga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIE1ldGhvZFBsdWdpbiBleHRlbmRzIE1ldGhvZFVuaXQgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJlZmVyZW5jZWQgTWV0aG9kIFBsdWdpbjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UmVmZXJlbmNlZCBNZXRob2QgUGx1Z2luPC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmVmZXJlbmNlZCBNZXRob2QgUGx1Z2luPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRNZXRob2RQbHVnaW5fUmVmZXJlbmNlZE1ldGhvZFBsdWdpbigpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdSZWZlcmVuY2VkTWV0aG9kUGx1Z2luJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3Q8U3RyaW5nPiBnZXRSZWZlcmVuY2VkTWV0aG9kUGx1Z2luKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5NZXRob2QgUGFja2FnZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZFBhY2thZ2V9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TWV0aG9kIFBhY2thZ2U8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NZXRob2QgUGFja2FnZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0TWV0aG9kUGx1Z2luX01ldGhvZFBhY2thZ2UoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nTWV0aG9kUGFja2FnZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0PE1ldGhvZFBhY2thZ2U+IGdldE1ldGhvZFBhY2thZ2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlVzZXIgQ2hhbmdlYWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VXNlciBDaGFuZ2VhYmxlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlVzZXIgQ2hhbmdlYWJsZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRVc2VyQ2hhbmdlYWJsZSgpCi0JICogQHNlZSAjdW5zZXRVc2VyQ2hhbmdlYWJsZSgpCi0JICogQHNlZSAjc2V0VXNlckNoYW5nZWFibGUoYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0TWV0aG9kUGx1Z2luX1VzZXJDaGFuZ2VhYmxlKCkKLQkgKiBAbW9kZWwgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdhdHRyaWJ1dGUnIG5hbWU9J3VzZXJDaGFuZ2VhYmxlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1VzZXJDaGFuZ2VhYmxlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RQbHVnaW4jaXNVc2VyQ2hhbmdlYWJsZSA8ZW0+VXNlciBDaGFuZ2VhYmxlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Vc2VyIENoYW5nZWFibGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0VXNlckNoYW5nZWFibGUoKQotCSAqIEBzZWUgI3Vuc2V0VXNlckNoYW5nZWFibGUoKQotCSAqIEBzZWUgI2lzVXNlckNoYW5nZWFibGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFVzZXJDaGFuZ2VhYmxlKGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RQbHVnaW4jaXNVc2VyQ2hhbmdlYWJsZSA8ZW0+VXNlciBDaGFuZ2VhYmxlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldFVzZXJDaGFuZ2VhYmxlKCkKLQkgKiBAc2VlICNpc1VzZXJDaGFuZ2VhYmxlKCkKLQkgKiBAc2VlICNzZXRVc2VyQ2hhbmdlYWJsZShib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0VXNlckNoYW5nZWFibGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kUGx1Z2luI2lzVXNlckNoYW5nZWFibGUgPGVtPlVzZXIgQ2hhbmdlYWJsZTwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VXNlciBDaGFuZ2VhYmxlPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRVc2VyQ2hhbmdlYWJsZSgpCi0JICogQHNlZSAjaXNVc2VyQ2hhbmdlYWJsZSgpCi0JICogQHNlZSAjc2V0VXNlckNoYW5nZWFibGUoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldFVzZXJDaGFuZ2VhYmxlKCk7Ci0KLX0gLy8gTWV0aG9kUGx1Z2luClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL01ldGhvZFVuaXQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9NZXRob2RVbml0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliMTA1NjcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL01ldGhvZFVuaXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2OCArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IE1ldGhvZFVuaXQuamF2YSx2IDEuMiAyMDA4LzAxLzMwIDAwOjQxOjQ4IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYTsKLQotaW1wb3J0IGphdmF4LnhtbC5kYXRhdHlwZS5YTUxHcmVnb3JpYW5DYWxlbmRhcjsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5NZXRob2QgVW5pdDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEEgc3BlY2lhbCBNZXRob2QgRWxlbWVudCB0aGF0IHNoYWxsIGJlIG1haW50YWluZWQgaW4gYSBNZXRob2QgTGlicmFyeSBhcyBhIHNlcGFyYXRlIHVuaXQgb2YgY29udHJvbC4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RVbml0I2dldENvcHlyaWdodCA8ZW0+Q29weXJpZ2h0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RVbml0I2dldEF1dGhvcnMgPGVtPkF1dGhvcnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZFVuaXQjZ2V0Q2hhbmdlRGF0ZSA8ZW0+Q2hhbmdlIERhdGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZFVuaXQjZ2V0Q2hhbmdlRGVzY3JpcHRpb24gPGVtPkNoYW5nZSBEZXNjcmlwdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kVW5pdCNnZXRWZXJzaW9uIDxlbT5WZXJzaW9uPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldE1ldGhvZFVuaXQoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J01ldGhvZFVuaXQnIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBNZXRob2RVbml0IGV4dGVuZHMgTWV0aG9kRWxlbWVudCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q29weXJpZ2h0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Db3B5cmlnaHQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q29weXJpZ2h0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRDb3B5cmlnaHQoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRNZXRob2RVbml0X0NvcHlyaWdodCgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdDb3B5cmlnaHQnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0Q29weXJpZ2h0KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RVbml0I2dldENvcHlyaWdodCA8ZW0+Q29weXJpZ2h0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Db3B5cmlnaHQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldENvcHlyaWdodCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Q29weXJpZ2h0KFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BdXRob3JzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBFdmVyeSBNZXRob2QgVW5pdCBpcyBiZWluZyBjcmVhdGVkIGFuZCBvd25lZCBieSBhbiBhdXRob3Igb3IgYXV0aG9yaW5nIHRlYW0uCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkF1dGhvcnM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEF1dGhvcnMoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRNZXRob2RVbml0X0F1dGhvcnMoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nYXR0cmlidXRlJyBuYW1lPSdhdXRob3JzJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldEF1dGhvcnMoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZFVuaXQjZ2V0QXV0aG9ycyA8ZW0+QXV0aG9yczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QXV0aG9yczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0QXV0aG9ycygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0QXV0aG9ycyhTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q2hhbmdlIERhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBkYXRlIHRoZSBsYXN0IGNoYW5nZSB0aGF0IHJlc3VsdGVkIGludG8gdGhpcyB2ZXJzaW9uIGhhcyBiZWVuIG1hZGUuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNoYW5nZSBEYXRlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRDaGFuZ2VEYXRlKFhNTEdyZWdvcmlhbkNhbGVuZGFyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRNZXRob2RVbml0X0NoYW5nZURhdGUoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkRhdGVUaW1lIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdhdHRyaWJ1dGUnIG5hbWU9J2NoYW5nZURhdGUnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlYTUxHcmVnb3JpYW5DYWxlbmRhciBnZXRDaGFuZ2VEYXRlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RVbml0I2dldENoYW5nZURhdGUgPGVtPkNoYW5nZSBEYXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5DaGFuZ2UgRGF0ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0Q2hhbmdlRGF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Q2hhbmdlRGF0ZShYTUxHcmVnb3JpYW5DYWxlbmRhciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5DaGFuZ2UgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgbGFzdCBjaGFuZ2UgdGhhdCByZXN1bHRlZCBpbnRvIHRoaXMgdmVyc2lvbi4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q2hhbmdlIERlc2NyaXB0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRDaGFuZ2VEZXNjcmlwdGlvbihTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldE1ldGhvZFVuaXRfQ2hhbmdlRGVzY3JpcHRpb24oKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nYXR0cmlidXRlJyBuYW1lPSdjaGFuZ2VEZXNjcmlwdGlvbiciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRDaGFuZ2VEZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kVW5pdCNnZXRDaGFuZ2VEZXNjcmlwdGlvbiA8ZW0+Q2hhbmdlIERlc2NyaXB0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5DaGFuZ2UgRGVzY3JpcHRpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldENoYW5nZURlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRDaGFuZ2VEZXNjcmlwdGlvbihTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VmVyc2lvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogRXZlcnkgUGFja2FnZSBoYXMgYSB2ZXJzaW9uIG51bWJlciB1c2VkIHRvIHRyYWNrIGNoYW5nZXMuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlZlcnNpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFZlcnNpb24oU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRNZXRob2RVbml0X1ZlcnNpb24oKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nYXR0cmlidXRlJyBuYW1lPSd2ZXJzaW9uJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFZlcnNpb24oKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZFVuaXQjZ2V0VmVyc2lvbiA8ZW0+VmVyc2lvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VmVyc2lvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0VmVyc2lvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VmVyc2lvbihTdHJpbmcgdmFsdWUpOwotCi19IC8vIE1ldGhvZFVuaXQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvTWlsZXN0b25lLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvTWlsZXN0b25lLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3ODBiODcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL01pbGVzdG9uZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBNaWxlc3RvbmUuamF2YSx2IDEuMiAyMDA4LzAxLzMwIDAwOjQxOjQ3IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5NaWxlc3RvbmU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIHNwZWNpYWwgQnJlYWtkb3duIEVsZW1lbnQgdGhhdCBkZXNjcmliZXMgYSBzaWduaWZpY2FudCBldmVudCBpbiBhIGRldmVsb3BtZW50IHByb2plY3QsIHN1Y2ggYXMgYSBtYWpvciBkZWNpc2lvbiwgY29tcGxldGlvbiBvZiBhIGRlbGl2ZXJhYmxlLCBvciBtZWV0aW5nIG9mIGEgbWFqb3IgZGVwZW5kZW5jeSAobGlrZSBjb21wbGV0aW9uIG9mIGEgcHJvamVjdCBwaGFzZSkuICBCZWNhdXNlLCBNaWxlc3RvbmUgaXMgY29tbW9ubHkgdXNlZCB0byByZWZlciB0byBib3RoIHRoZSBldmVudCBpdHNlbGYgYW5kIHRoZSBwb2ludCBpbiB0aW1lIGF0IHdoaWNoIHRoZSBldmVudCBpcyBzY2hlZHVsZWQgdG8gaGFwcGVuLCBpdCBpcyBtb2RlbGVkIGFzIGEgQnJlYWtkb3duIEVsZW1lbnQgKGkuZS4gaXQgYXBwZWFycyBhcyBwYXJ0IG9mIGEgYnJlYWtkb3duIHN0cnVjdHVyZSkuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWlsZXN0b25lI2dldFJlcXVpcmVkUmVzdWx0IDxlbT5SZXF1aXJlZCBSZXN1bHQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0TWlsZXN0b25lKCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdNaWxlc3RvbmUnIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBNaWxlc3RvbmUgZXh0ZW5kcyBXb3JrQnJlYWtkb3duRWxlbWVudCB7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SZXF1aXJlZCBSZXN1bHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlJlcXVpcmVkIFJlc3VsdDwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJlcXVpcmVkIFJlc3VsdDwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0TWlsZXN0b25lX1JlcXVpcmVkUmVzdWx0KCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1JlcXVpcmVkUmVzdWx0JyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3Q8U3RyaW5nPiBnZXRSZXF1aXJlZFJlc3VsdCgpOwotfSAvLyBNaWxlc3RvbmUKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvTmFtZWRFbGVtZW50LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvTmFtZWRFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjYWQ1ZDMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL05hbWVkRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBOYW1lZEVsZW1lbnQuamF2YSx2IDEuMiAyMDA4LzAxLzMwIDAwOjQxOjQ4IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYTsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5OYW1lZCBFbGVtZW50PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQSBVTUwgMi4wIG1ldGEtY2xhc3MgTmFtZWQgRWxlbWVudC4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5OYW1lZEVsZW1lbnQjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXROYW1lZEVsZW1lbnQoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J05hbWVkRWxlbWVudCcga2luZD0nZW1wdHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIE5hbWVkRWxlbWVudCBleHRlbmRzIEVsZW1lbnQgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0TmFtZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldE5hbWVkRWxlbWVudF9OYW1lKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2F0dHJpYnV0ZScgbmFtZT0nbmFtZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXROYW1lKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5OYW1lZEVsZW1lbnQjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TmFtZShTdHJpbmcgdmFsdWUpOwotCi19IC8vIE5hbWVkRWxlbWVudApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9PdXRjb21lLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvT3V0Y29tZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNDE5ZDFjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9PdXRjb21lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IE91dGNvbWUuamF2YSx2IDEuMSAyMDA4LzAxLzE1IDA4OjUyOjA3IGp0aGFtIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWE7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+T3V0Y29tZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEEgV29yayBQcm9kdWN0IHRoYXQgZGVzY3JpYmVzIGludGFuZ2libGUgd29yayBwcm9kdWN0cyB0aGF0IGFyZSBhIHJlc3VsdCBvciBzdGF0ZS4gT3V0Y29tZXMgbWF5IGFsc28gYmUgdXNlZCB0byBkZXNjcmliZSB3b3JrIHByb2R1Y3RzIHRoYXQgYXJlIG5vdCBmb3JtYWxseSBkZWZpbmVkLiAgQSBrZXkgZGlmZmVyZW50aWF0b3IgZm9yIG91dGNvbWVzIGFnYWluc3QgYXJ0aWZhY3RzIGlzIHRoYXQgb3V0Y29tZXMgYXJlIG5vdCBjYW5kaWRhdGVzIGZvciBoYXJ2ZXN0aW5nIGFzIHJldXNhYmxlIGFzc2V0cy4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldE91dGNvbWUoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J091dGNvbWUnIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBPdXRjb21lIGV4dGVuZHMgV29ya1Byb2R1Y3QgewotfSAvLyBPdXRjb21lClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1BhY2thZ2VhYmxlRWxlbWVudC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1BhY2thZ2VhYmxlRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ODg1N2FhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9QYWNrYWdlYWJsZUVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogUGFja2FnZWFibGVFbGVtZW50LmphdmEsdiAxLjEgMjAwOC8wMS8xNSAwODo1MjowOCBqdGhhbSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlBhY2thZ2VhYmxlIEVsZW1lbnQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIFVNTCAyLjAgbWV0YS1jbGFzcyBQYWNrYWdhYmxlIEVsZW1lbnQuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRQYWNrYWdlYWJsZUVsZW1lbnQoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J1BhY2thZ2VhYmxlRWxlbWVudCcga2luZD0nZW1wdHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFBhY2thZ2VhYmxlRWxlbWVudCBleHRlbmRzIE5hbWVkRWxlbWVudCB7Ci19IC8vIFBhY2thZ2VhYmxlRWxlbWVudApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9QaGFzZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1BoYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkNTIyZWMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1BoYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFBoYXNlLmphdmEsdiAxLjEgMjAwOC8wMS8xNSAwODo1MjowNyBqdGhhbSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlBoYXNlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQSBzcGVjaWFsIEFjdGl2aXR5IHdoaWNoIHByZXNjcmliZXMgcHJlLWRlZmluZWQgdmFsdWVzIGZvciBpdHMgaW5zdGFuY2VzIGZvciB0aGUgYXR0cmlidXRlcyBwcmVmaXggKCdQaGFzZScpIGFuZCBpc1JlcGVhdGFibGUgKCdGYWxzZScpLiAgSXQgaGFzIGJlZW4gaW5jbHVkZWQgaW50byB0aGUgbWV0YS1tb2RlbCBmb3IgY29udmVuaWVuY2UgYW5kIHRvIHByb3ZpZGUgYSBzcGVjaWFsIHN0ZXJlb3R5cGUsIGJlY2F1c2UgaXQgcmVwcmVzZW50cyBhIHZlcnkgY29tbW9ubHkgdXNlZCBBY3Rpdml0eSB0eXBlLgotICogUGhhc2UgcmVwcmVzZW50IGEgc2lnbmlmaWNhbnQgcGVyaW9kIGluIGEgcHJvamVjdCwgZW5kaW5nIHdpdGggbWFqb3IgbWFuYWdlbWVudCBjaGVja3BvaW50LCBtaWxlc3RvbmUgb3Igc2V0IG9mIERlbGl2ZXJhYmxlcy4gIEl0IGlzIGluY2x1ZGVkIGluIHRoZSBtb2RlbCBhcyBhIHByZWRlZmluZWQgc3BlY2lhbCBBY3Rpdml0eSwgYmVjYXVzZSBvZiBpdHMgc2lnbmlmaWNhbmNlIGluIGRlZmluaW5nIGJyZWFrZG93bnMuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRQaGFzZSgpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nUGhhc2UnIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBQaGFzZSBleHRlbmRzIEFjdGl2aXR5IHsKLX0gLy8gUGhhc2UKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvUGxhbm5pbmdEYXRhLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvUGxhbm5pbmdEYXRhLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkZjE0YzAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1BsYW5uaW5nRGF0YS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE1ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogUGxhbm5pbmdEYXRhLmphdmEsdiAxLjIgMjAwOC8wMS8zMCAwMDo0MTo0OCBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWE7Ci0KLWltcG9ydCBqYXZheC54bWwuZGF0YXR5cGUuWE1MR3JlZ29yaWFuQ2FsZW5kYXI7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UGxhbm5pbmcgRGF0YTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEEgUHJvY2VzcyBFbGVtZW50IHRoYXQgYWRkcyBwbGFubmluZyBkYXRhIHRvIEJyZWFrZG93biBFbGVtZW50cyB3aGVuIGl0IGlzIHVzZWQgZm9yIGEgUHJvY2VzcyBQbGFubmluZyBUZW1wbGF0ZS4gIEZvciBEZWxpdmVyeSBQcm9jZXNzZXMgYW5kIENhcGFiaWxpdHkgUGF0dGVybnMgdGhpcyBjbGFzcyBjYW4gZWl0aGVyIG5vdCBiZSBpbnN0YW50aWF0ZWQgb3IgcG9wdWxhdGVkIHdpdGggZGVmYXVsdCBkYXRhLgotICogUGxhbm5pbmcgRGF0YSBmYWN0b3JzIG91dCBzcGVjaWZpYyBvcHRpb25hbCBkYXRhIG5lZWRlZCBmb3IgcmVwcmVzZW50aW5nIHBsYW5uaW5nIHRlbXBsYXRlcy4gIFRoaXMgYXNzb2NpYXRpb24gYWxsb3dzIHRvIGFjY2VzcyBwbGFubmluZyBkYXRhIGlmIGl0IGlzIHN0b3JlZCBmb3IgdGhlIEJyZWFrZG93biBFbGVtZW50LgotICogKE5PVEUsIFRIRSBBVFRSSUJVVEVTIEZPUiBUSElTIENMQVNTIEFSRSBOT1QgQ09NUExFVEUsIFlFVCkKLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5QbGFubmluZ0RhdGEjZ2V0RmluaXNoRGF0ZSA8ZW0+RmluaXNoIERhdGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlBsYW5uaW5nRGF0YSNnZXRSYW5rIDxlbT5SYW5rPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5QbGFubmluZ0RhdGEjZ2V0U3RhcnREYXRlIDxlbT5TdGFydCBEYXRlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFBsYW5uaW5nRGF0YSgpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nUGxhbm5pbmdEYXRhJyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUGxhbm5pbmdEYXRhIGV4dGVuZHMgUHJvY2Vzc0VsZW1lbnQgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkZpbmlzaCBEYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgZGVmYXVsdCBmaW5pc2ggZGF0ZSBmb3IgYSBwbGFuZWQgVGFzay4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RmluaXNoIERhdGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEZpbmlzaERhdGUoWE1MR3JlZ29yaWFuQ2FsZW5kYXIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFBsYW5uaW5nRGF0YV9GaW5pc2hEYXRlKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EYXRlVGltZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nYXR0cmlidXRlJyBuYW1lPSdmaW5pc2hEYXRlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JWE1MR3JlZ29yaWFuQ2FsZW5kYXIgZ2V0RmluaXNoRGF0ZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUGxhbm5pbmdEYXRhI2dldEZpbmlzaERhdGUgPGVtPkZpbmlzaCBEYXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5GaW5pc2ggRGF0ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0RmluaXNoRGF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RmluaXNoRGF0ZShYTUxHcmVnb3JpYW5DYWxlbmRhciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SYW5rPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgZGVmYXVsdCByYW5rIGZvciBhIHBsYW5lZCBUYXNrLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SYW5rPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRSYW5rKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0UGxhbm5pbmdEYXRhX1JhbmsoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nYXR0cmlidXRlJyBuYW1lPSdyYW5rJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFJhbmsoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlBsYW5uaW5nRGF0YSNnZXRSYW5rIDxlbT5SYW5rPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5SYW5rPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRSYW5rKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRSYW5rKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TdGFydCBEYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgZGVmYXVsdCBzdGFydCBkYXRlIGZvciBhIHBsYW5lZCBUYXNrLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TdGFydCBEYXRlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRTdGFydERhdGUoWE1MR3JlZ29yaWFuQ2FsZW5kYXIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFBsYW5uaW5nRGF0YV9TdGFydERhdGUoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkRhdGVUaW1lIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdhdHRyaWJ1dGUnIG5hbWU9J3N0YXJ0RGF0ZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVhNTEdyZWdvcmlhbkNhbGVuZGFyIGdldFN0YXJ0RGF0ZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUGxhbm5pbmdEYXRhI2dldFN0YXJ0RGF0ZSA8ZW0+U3RhcnQgRGF0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U3RhcnQgRGF0ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0U3RhcnREYXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRTdGFydERhdGUoWE1MR3JlZ29yaWFuQ2FsZW5kYXIgdmFsdWUpOwotCi19IC8vIFBsYW5uaW5nRGF0YQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9QcmFjdGljZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1ByYWN0aWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0NDY5YzcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1ByYWN0aWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBQcmFjdGljZS5qYXZhLHYgMS4yIDIwMDgvMDEvMzAgMDA6NDE6NDgga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXA7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlByYWN0aWNlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQSBzcGVjaWZpYyB0eXBlIG9mIGd1aWRhbmNlIHRoYXQgcmVwcmVzZW50cyBhIHByb3ZlbiB3YXkgb3Igc3RyYXRlZ3kgb2YgZG9pbmcgd29yayB0byBhY2hpZXZlIGEgZ29hbCB0aGF0IGhhcyBhIHBvc2l0aXZlIGltcGFjdCBvbiB3b3JrIHByb2R1Y3Qgb3IgcHJvY2VzcyBxdWFsaXR5LiAgUHJhY3RpY2VzIGFyZSBkZWZpbmVkIG9ydGhvZ29uYWwgdG8gbWV0aG9kcyBhbmQgcHJvY2Vzc2VzLiAgVGhleSBjb3VsZCBzdW1tYXJpemUgYXNwZWN0cyB0aGF0IGltcGFjdCBtYW55IGRpZmZlcmVudCBwYXJ0cyBvZiBhIG1ldGhvZCBvciBzcGVjaWZpYyBwcm9jZXNzZXMuICBFeGFtcGxlcyBmb3IgcHJhY3RpY2VzIHdvdWxkIGJlICJNYW5hZ2UgUmlza3MiLCAiQ29udGludW91c2x5IHZlcmlmeSBxdWFsaXR5IiwgIkFyY2hpdGVjdHVyZS1jZW50cmljIGFuZCBjb21wb25lbnQtYmFzZWQgZGV2ZWxvcG1lbnQiLCBldGMuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJhY3RpY2UjZ2V0R3JvdXAyIDxlbT5Hcm91cDI8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByYWN0aWNlI2dldEFjdGl2aXR5UmVmZXJlbmNlIDxlbT5BY3Rpdml0eSBSZWZlcmVuY2U8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByYWN0aWNlI2dldENvbnRlbnRSZWZlcmVuY2UgPGVtPkNvbnRlbnQgUmVmZXJlbmNlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5QcmFjdGljZSNnZXRTdWJQcmFjdGljZSA8ZW0+U3ViIFByYWN0aWNlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFByYWN0aWNlKCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdQcmFjdGljZScga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFByYWN0aWNlIGV4dGVuZHMgR3VpZGFuY2UgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkdyb3VwMjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXAuRW50cnl9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+R3JvdXAyPC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+R3JvdXAyPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRQcmFjdGljZV9Hcm91cDIoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVGZWF0dXJlTWFwRW50cnkiIG1hbnk9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2dyb3VwJyBuYW1lPSdncm91cDoyNCciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUZlYXR1cmVNYXAgZ2V0R3JvdXAyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BY3Rpdml0eSBSZWZlcmVuY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkFjdGl2aXR5IFJlZmVyZW5jZTwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkFjdGl2aXR5IFJlZmVyZW5jZTwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0UHJhY3RpY2VfQWN0aXZpdHlSZWZlcmVuY2UoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQWN0aXZpdHlSZWZlcmVuY2UnIGdyb3VwPScjZ3JvdXA6MjQnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdDxTdHJpbmc+IGdldEFjdGl2aXR5UmVmZXJlbmNlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Db250ZW50IFJlZmVyZW5jZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q29udGVudCBSZWZlcmVuY2U8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Db250ZW50IFJlZmVyZW5jZTwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0UHJhY3RpY2VfQ29udGVudFJlZmVyZW5jZSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIiB0cmFuc2llbnQ9InRydWUiIHZvbGF0aWxlPSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdDb250ZW50UmVmZXJlbmNlJyBncm91cD0nI2dyb3VwOjI0JyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3Q8U3RyaW5nPiBnZXRDb250ZW50UmVmZXJlbmNlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TdWIgUHJhY3RpY2U8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5QcmFjdGljZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5TdWIgUHJhY3RpY2U8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TdWIgUHJhY3RpY2U8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFByYWN0aWNlX1N1YlByYWN0aWNlKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1N1YlByYWN0aWNlJyBncm91cD0nI2dyb3VwOjI0JyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3Q8UHJhY3RpY2U+IGdldFN1YlByYWN0aWNlKCk7Ci0KLX0gLy8gUHJhY3RpY2UKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvUHJhY3RpY2VEZXNjcmlwdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1ByYWN0aWNlRGVzY3JpcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2E4YjhlOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvUHJhY3RpY2VEZXNjcmlwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkyICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogUHJhY3RpY2VEZXNjcmlwdGlvbi5qYXZhLHYgMS4yIDIwMDgvMDEvMzAgMDA6NDE6NDgga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlByYWN0aWNlIERlc2NyaXB0aW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQSBnZW5lcmFsaXplZCBDb250ZW50IERlc2NyaXB0aW9uIHRoYXQgaXMgdXNlZCB0byBzdG9yZSB0aGUgdGV4dHVhbCBkZXNjcmlwdGlvbiBmb3IgYSBQcmFjdGljZS4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5QcmFjdGljZURlc2NyaXB0aW9uI2dldEFkZGl0aW9uYWxJbmZvIDxlbT5BZGRpdGlvbmFsIEluZm88L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByYWN0aWNlRGVzY3JpcHRpb24jZ2V0QXBwbGljYXRpb24gPGVtPkFwcGxpY2F0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5QcmFjdGljZURlc2NyaXB0aW9uI2dldEJhY2tncm91bmQgPGVtPkJhY2tncm91bmQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByYWN0aWNlRGVzY3JpcHRpb24jZ2V0R29hbHMgPGVtPkdvYWxzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5QcmFjdGljZURlc2NyaXB0aW9uI2dldExldmVsc09mQWRvcHRpb24gPGVtPkxldmVscyBPZiBBZG9wdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJhY3RpY2VEZXNjcmlwdGlvbiNnZXRQcm9ibGVtIDxlbT5Qcm9ibGVtPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFByYWN0aWNlRGVzY3JpcHRpb24oKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J1ByYWN0aWNlRGVzY3JpcHRpb24nIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBQcmFjdGljZURlc2NyaXB0aW9uIGV4dGVuZHMgQ29udGVudERlc2NyaXB0aW9uIHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BZGRpdGlvbmFsIEluZm88L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIEFueSBhZGRpdGlvbmFsIEluZm9ybWF0aW9uIG5vdCBjb3ZlcmVkIGJ5IHRoZSBvdGhlciBhdHRyaWJ1dGVzLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BZGRpdGlvbmFsIEluZm88L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEFkZGl0aW9uYWxJbmZvKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0UHJhY3RpY2VEZXNjcmlwdGlvbl9BZGRpdGlvbmFsSW5mbygpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdBZGRpdGlvbmFsSW5mbyciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRBZGRpdGlvbmFsSW5mbygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJhY3RpY2VEZXNjcmlwdGlvbiNnZXRBZGRpdGlvbmFsSW5mbyA8ZW0+QWRkaXRpb25hbCBJbmZvPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BZGRpdGlvbmFsIEluZm88L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEFkZGl0aW9uYWxJbmZvKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRBZGRpdGlvbmFsSW5mbyhTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QXBwbGljYXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIERlc2NyaWJlcyBob3cgdGhlIFByYWN0aWNlIGlzIGJlaW5nIGFwcGxpZWQgb3IgaW50cm9kdWNlZCBpbnRvIHRoZSBjb250ZXh0IGRlc2NyaWJlZCBpbiBiYWNrZ3JvdW5kLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BcHBsaWNhdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0QXBwbGljYXRpb24oU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRQcmFjdGljZURlc2NyaXB0aW9uX0FwcGxpY2F0aW9uKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0FwcGxpY2F0aW9uJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldEFwcGxpY2F0aW9uKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5QcmFjdGljZURlc2NyaXB0aW9uI2dldEFwcGxpY2F0aW9uIDxlbT5BcHBsaWNhdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QXBwbGljYXRpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEFwcGxpY2F0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRBcHBsaWNhdGlvbihTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QmFja2dyb3VuZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogRWxhYm9yYXRpb24gb24gdGhlIGJhY2tncm91bmQgYW5kIHRoZSBjb250ZXh0IGluIHdoaWNoIHRoZSBwcm9ibGVtIG9jY3VycyBhbmQgd2hlcmUgdGhlIHNvbHV0aW9uIGRlc2NyaWJlZCBieSB0aGlzIFByYWN0aWNlIHdpbGwgZml0IGluLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5CYWNrZ3JvdW5kPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRCYWNrZ3JvdW5kKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0UHJhY3RpY2VEZXNjcmlwdGlvbl9CYWNrZ3JvdW5kKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0JhY2tncm91bmQnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0QmFja2dyb3VuZCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJhY3RpY2VEZXNjcmlwdGlvbiNnZXRCYWNrZ3JvdW5kIDxlbT5CYWNrZ3JvdW5kPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5CYWNrZ3JvdW5kPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRCYWNrZ3JvdW5kKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRCYWNrZ3JvdW5kKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Hb2FsczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogQSBzdW1tYXJ5IG9mIHRoZSBvdmVyYWxsIGdvYWxzIHRvIGJlIGFkZHJlc3NlZCBieSB0aGUgUHJhY3RpY2UuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkdvYWxzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRHb2FscyhTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFByYWN0aWNlRGVzY3JpcHRpb25fR29hbHMoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nR29hbHMnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0R29hbHMoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByYWN0aWNlRGVzY3JpcHRpb24jZ2V0R29hbHMgPGVtPkdvYWxzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Hb2FsczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0R29hbHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEdvYWxzKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5MZXZlbHMgT2YgQWRvcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIE91dGxpbmVzIHRoZSBkaWZmZXJlbnQgZm9ybXMgb3IgdmFyaWFudHMgaW4gd2hpY2ggdGhlIHByYWN0aWNlIGNvdWxkIGJlIHJlYWxpemVkLiAoZS5nLiBmdWxsIGFkb3B0aW9uIHZlcnVzIGEgcGFydGlhbCBhZG9wdGlvbiBvZiB0aGUgUHJhY3RpY2UpCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkxldmVscyBPZiBBZG9wdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0TGV2ZWxzT2ZBZG9wdGlvbihTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFByYWN0aWNlRGVzY3JpcHRpb25fTGV2ZWxzT2ZBZG9wdGlvbigpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdMZXZlbHNPZkFkb3B0aW9uJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldExldmVsc09mQWRvcHRpb24oKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByYWN0aWNlRGVzY3JpcHRpb24jZ2V0TGV2ZWxzT2ZBZG9wdGlvbiA8ZW0+TGV2ZWxzIE9mIEFkb3B0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5MZXZlbHMgT2YgQWRvcHRpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldExldmVsc09mQWRvcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldExldmVsc09mQWRvcHRpb24oU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlByb2JsZW08L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIEEgZGVzY3JpcHRpb24gb2YgdGhlIHByb2JsZW0gdGhlIFByYWN0aWNlIGFkZHJlc3Nlcy4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UHJvYmxlbTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UHJvYmxlbShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFByYWN0aWNlRGVzY3JpcHRpb25fUHJvYmxlbSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdQcm9ibGVtJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFByb2JsZW0oKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByYWN0aWNlRGVzY3JpcHRpb24jZ2V0UHJvYmxlbSA8ZW0+UHJvYmxlbTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UHJvYmxlbTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UHJvYmxlbSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UHJvYmxlbShTdHJpbmcgdmFsdWUpOwotCi19IC8vIFByYWN0aWNlRGVzY3JpcHRpb24KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvUHJvY2Vzcy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1Byb2Nlc3MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTA4NmMwZi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvUHJvY2Vzcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIzICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogUHJvY2Vzcy5qYXZhLHYgMS4yIDIwMDgvMDEvMzAgMDA6NDE6NDgga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Qcm9jZXNzPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQSBzcGVjaWFsIEFjdGl2aXR5IHRoYXQgZGVzY3JpYmVzIGEgc3RydWN0dXJlIGZvciBwYXJ0aWN1bGFyIHR5cGVzIG9mIGRldmVsb3BtZW50IHByb2plY3RzLiAgVG8gcGVyZm9ybSBzdWNoIGEgZGV2ZWxvcG1lbnQgcHJvamVjdCBhIFByb2Nlc3NlcyB3b3VsZCBiZSAnaW5zdGFudGlhdGVkJyBhbmQgYWRhcHRlZCBmb3IgdGhlIHNwZWNpZmljIHNpdHVhdGlvbi4gIFByb2Nlc3MgaXMgYW4gYWJzdHJhY3QgY2xhc3MgYW5kIHRoaXMgbWV0YS1tb2RlbCBkZWZpbmVzIGRpZmZlcmVudCBzcGVjaWFsIHR5cGVzIG9mIFByb2Nlc3NlcyBmb3IgZGlmZmVyZW50IHByb2Nlc3MgbWFuYWdlbWVudCBhcHBsaWNhdGlvbnMgYW5kIGRpZmZlcmVudCBzaXR1YXRpb25zIG9mIHByb2Nlc3MgcmV1c2UuICBFdmVyeSBQcm9jZXNzIGNvbXByaXNlcyBvZiBhbmQgaXMgdGhlIHRvcC1sZXZlbCBlbGVtZW50IG9mIGFuIG4tbGV2ZWwgYnJlYWtkb3duIHN0cnVjdHVyZSB1c2luZyB0aGUgTmVzdGluZyBhc3NvY2lhdGlvbiBkZWZpbmVkIG9uIEFjdGl2aXR5LgotICogQ29yZSBNZXRob2QgQ29udGVudCBwcm92aWRlcyBzdGVwLWJ5LXN0ZXAgZXhwbGFuYXRpb25zLCBkZXNjcmliaW5nIGhvdyB2ZXJ5IHNwZWNpZmljIGRldmVsb3BtZW50IGdvYWxzIGFyZSBhY2hpZXZlZCBpbmRlcGVuZGVudCBvZiB0aGUgcGxhY2VtZW50IG9mIHRoZXNlIHN0ZXBzIHdpdGhpbiBhIGRldmVsb3BtZW50IGxpZmVjeWNsZS4gIFByb2Nlc3NlcyB0YWtlIHRoZXNlIG1ldGhvZCBlbGVtZW50cyBhbmQgcmVsYXRlIHRoZW0gaW50byBzZW1pLW9yZGVyZWQgc2VxdWVuY2VzIHRoYXQgYXJlIGN1c3RvbWl6ZWQgdG8gc3BlY2lmaWMgdHlwZXMgb2YgcHJvamVjdHMuICBUaHVzLCBhIHByb2Nlc3MgaXMgYSBzZXQgb2YgcGFydGlhbGx5IG9yZGVyZWQgd29yayBkZXNjcmlwdGlvbnMgaW50ZW5kZWQgdG8gcmVhY2ggYSBoaWdoZXIgZGV2ZWxvcG1lbnQgZ29hbCwgc3VjaCBhcyB0aGUgcmVsZWFzZSBvZiBhIHNwZWNpZmljIHNvZnR3YXJlIHN5c3RlbS4gIEEgcHJvY2VzcyBhbmQgdGhlIHByb2Nlc3MgbWV0YS1tb2RlbCBzdHJ1Y3R1cmUgZGVmaW5lZCBpbiB0aGlzIHNwZWNpZmljYXRpb24gZm9jdXNlcyBvbiB0aGUgbGlmZWN5Y2xlIGFuZCB0aGUgc2VxdWVuY2luZyBvZiB3b3JrIGluIGJyZWFrZG93biBzdHJ1Y3R1cmVzLiAgVG8gYWNoaWV2ZSB0aGlzIGl0IHVzZXMgdGhlIERlc2NyaXB0b3IgY29uY2VwdCByZWZlcmVuY2luZyBtZXRob2QgY29udGVudCBhbmQgYWxsb3dpbmcgZGVmaW5pbmcgdGltZS1zcGVjaWZpYyBjdXN0b21pemF0aW9ucyBvZiB0aGUgcmVmZXJlbmNlZCBjb250ZW50IChlLmcuIGRlZmluaW5nIGEgZm9jdXMgb24gZGlmZmVyZW50IHN0ZXBzIG9mIHRoZSBzYW1lIFRhc2sgYW5kIHByb3ZpZGluZyBpbnB1dCBXb3JrIFByb2R1Y3RzIGluIGRpZmZlcmVudCBzdGF0ZXMgd2l0aGluIHRoZSBkaWZmZXJlbnQgUGhhc2VzIG9mIGEgcHJvY2VzcyBsaWZlY3ljbGUgaW4gd2hpY2ggdGhlIHNhbWUgVGFzayBpcyBwZXJmb3JtZWQpLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3MjZ2V0SW5jbHVkZXNQYXR0ZXJuIDxlbT5JbmNsdWRlcyBQYXR0ZXJuPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzI2dldERlZmF1bHRDb250ZXh0IDxlbT5EZWZhdWx0IENvbnRleHQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3MjZ2V0VmFsaWRDb250ZXh0IDxlbT5WYWxpZCBDb250ZXh0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzI2dldERpYWdyYW1VUkkgPGVtPkRpYWdyYW0gVVJJPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFByb2Nlc3MoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J1Byb2Nlc3MnIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBQcm9jZXNzIGV4dGVuZHMgQWN0aXZpdHkgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkluY2x1ZGVzIFBhdHRlcm48L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkluY2x1ZGVzIFBhdHRlcm48L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JbmNsdWRlcyBQYXR0ZXJuPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRQcm9jZXNzX0luY2x1ZGVzUGF0dGVybigpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdJbmNsdWRlc1BhdHRlcm4nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdDxTdHJpbmc+IGdldEluY2x1ZGVzUGF0dGVybigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGVmYXVsdCBDb250ZXh0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5EZWZhdWx0IENvbnRleHQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGVmYXVsdCBDb250ZXh0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXREZWZhdWx0Q29udGV4dChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFByb2Nlc3NfRGVmYXVsdENvbnRleHQoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nRGVmYXVsdENvbnRleHQnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0RGVmYXVsdENvbnRleHQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3MjZ2V0RGVmYXVsdENvbnRleHQgPGVtPkRlZmF1bHQgQ29udGV4dDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RGVmYXVsdCBDb250ZXh0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXREZWZhdWx0Q29udGV4dCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RGVmYXVsdENvbnRleHQoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlZhbGlkIENvbnRleHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlZhbGlkIENvbnRleHQ8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5WYWxpZCBDb250ZXh0PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRQcm9jZXNzX1ZhbGlkQ29udGV4dCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdWYWxpZENvbnRleHQnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdDxTdHJpbmc+IGdldFZhbGlkQ29udGV4dCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGlhZ3JhbSBVUkk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBVUkkgb2YgdGhlIGRpYWdyYW0gZmlsZSBhc3NvY2lhdGVkIHdpdGggdGhlIHByb2Nlc3MuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRpYWdyYW0gVVJJPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXREaWFncmFtVVJJKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0UHJvY2Vzc19EaWFncmFtVVJJKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2F0dHJpYnV0ZScgbmFtZT0nZGlhZ3JhbVVSSSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXREaWFncmFtVVJJKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzI2dldERpYWdyYW1VUkkgPGVtPkRpYWdyYW0gVVJJPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5EaWFncmFtIFVSSTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0RGlhZ3JhbVVSSSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RGlhZ3JhbVVSSShTdHJpbmcgdmFsdWUpOwotCi19IC8vIFByb2Nlc3MKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvUHJvY2Vzc0NvbXBvbmVudC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1Byb2Nlc3NDb21wb25lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDg4ZDIyNS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvUHJvY2Vzc0NvbXBvbmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI1ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogUHJvY2Vzc0NvbXBvbmVudC5qYXZhLHYgMS4yIDIwMDgvMDEvMzAgMDA6NDE6NDcga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hOwotCi1pbXBvcnQgamF2YXgueG1sLmRhdGF0eXBlLlhNTEdyZWdvcmlhbkNhbGVuZGFyOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlByb2Nlc3MgQ29tcG9uZW50PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQSBzcGVjaWFsIFByb2Nlc3MgUGFja2FnZSB0aGF0IGFwcGxpZXMgdGhlIHByaW5jaXBsZXMgb2YgZW5jYXBzdWxhdGlvbi4gIEEgUHJvY2VzcyBDb21wb25lbnQgcmVhbGl6ZXMgb25lIG9yIG1vcmUgSW50ZXJmYWNlcyB3aGljaCBzcGVjaWZ5IGlucHV0cyBhbmQgb3V0cHV0cyBvZiB0aGUgY29tcG9uZW50LiBUaGVyZSBtaWdodCBiZSBtYW55IGNvbXBvbmVudHMgcmVhbGl6aW5nIHRoZSBzYW1lIGludGVyZmFjZXMsIGJ1dCB1c2luZyBkaWZmZXJlbnQgdGVjaG5pcXVlcyB0byBhY2hpZXZlIHNpbWlsYXIgb3V0cHV0cyBmb3Igc2ltaWxhciBpbnB1dHMuICBXaGVyZWFzIHRoZSBDb21wb25lbnQgSW50ZXJmYWNlcyByZXByZXNlbnQgY29tcG9uZW50IHNwZWNpZmljYXRpb25zIChibGFjayBib3ggZGVzY3JpcHRpb25zIG9mIHRoZSBjb21wb25lbnQpLCBnb29kIGNhbmRpZGF0ZXMgZm9yIGNvbXBvbmVudCByZWFsaXphdGlvbnMgY2FuIGJlIGZvdW5kIGluIENhcGFiaWxpdHkgUGF0dGVybnMgKHdoaXRlIGJveCBkZXNjcmlwdGlvbnMgZm9yIHRoZSBjb21wb25lbnQpLgotICogVU1BIHN1cHBvcnRzIHJlcGxhY2VhYmxlIGFuZCByZXVzYWJsZSBQcm9jZXNzIENvbXBvbmVudHMgcmVhbGl6aW5nIHRoZSBwcmluY2lwbGVzIG9mIGVuY2Fwc3VsYXRpb24uIENlcnRhaW4gc2l0dWF0aW9ucyBpbiBhIHNvZnR3YXJlIGRldmVsb3BtZW50IHByb2plY3QgbWlnaHQgcmVxdWlyZSB0aGF0IGNvbmNyZXRlIHJlYWxpemF0aW9ucyBvZiBwYXJ0cyBvZiB0aGUgcHJvY2VzcyByZW1haW4gdW5kZWNpZGVkIG9yIHdpbGwgYmUgZGVjaWRlZCBieSB0aGUgZXhlY3V0aW5nIHRlYW0gaXRzZWxmIChlLmcuIGluIG91dHNvdXJjaW5nIHNpdHVhdGlvbnMpLiAgVU1BIHByb3ZpZGVzIGEgdW5pcXVlIGNvbXBvbmVudCBjb25jZXB0IGRlZmluaW5nIGludGVyZmFjZXMgZm9yIHdvcmsgcHJvZHVjdCBpbnB1dCBhbmQgb3V0cHV0LCBhbGxvd2luZyB0cmVhdGluZyB0aGUgYWN0dWFsIGRlZmluaXRpb24gb2YgdGhlIHdvcmsgdGhhdCBwcm9kdWNlcyB0aGUgb3V0cHV0cyBhcyBhICJibGFjayBib3giLiAgQXQgYW55IHBvaW50IGR1cmluZyBhIHByb2plY3QgdGhlIGNvbXBvbmVudCAicmVhbGl6YXRpb24iIGRldGFpbGluZyB0aGUgd29yayBjYW4gYmUgYWRkZWQgdG8gdGhlIHByb2Nlc3MuICBUaGUgY29tcG9uZW50IGFwcHJvYWNoIGFsc28gYWxsb3dzIHRoYXQgZGlmZmVyZW50IHN0eWxlcyBvciB0ZWNobmlxdWVzIG9mIGRvaW5nIHdvcmsgY2FuIGJlIHJlcGxhY2VkIHdpdGggb25lIGFub3RoZXIuICBGb3IgZXhhbXBsZSwgYSBzb2Z0d2FyZSBjb2RlIG91dHB1dCBvZiBhIGNvbXBvbmVudCBjb3VsZCBiZSBwcm9kdWNlZCB3aXRoIGEgbW9kZWwtZHJpdmVuIGRldmVsb3BtZW50IG9yIGEgY29kZS1jZW50cmljIHRlY2huaXF1ZS4gIFRoZSBjb21wb25lbnQgY29uY2VwdCBlbmNhcHN1bGF0ZXMgdGhlIGFjdHVhbCB3b3JrIGFuZCBsZXRzIHRoZSBkZXZlbG9wbWVudCB0ZWFtIGNob29zZSB0aGUgYXBwcm9wcmlhdGUgdGVjaG5pcXVlIGFuZCBmaWxsIHRoZSBjb21wb25lbnQncyByZWFsaXphdGlvbiB3aXRoIHRoZWlyIGNob2ljZSBvZiBBY3Rpdml0aWVzIHRoYXQgcHJvZHVjZSB0aGUgcmVxdWlyZWQgb3V0cHV0cy4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzQ29tcG9uZW50I2dldENvcHlyaWdodCA8ZW0+Q29weXJpZ2h0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzQ29tcG9uZW50I2dldEludGVyZmFjZSA8ZW0+SW50ZXJmYWNlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzQ29tcG9uZW50I2dldFByb2Nlc3MgPGVtPlByb2Nlc3M8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NDb21wb25lbnQjZ2V0QXV0aG9ycyA8ZW0+QXV0aG9yczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc0NvbXBvbmVudCNnZXRDaGFuZ2VEYXRlIDxlbT5DaGFuZ2UgRGF0ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc0NvbXBvbmVudCNnZXRDaGFuZ2VEZXNjcmlwdGlvbiA8ZW0+Q2hhbmdlIERlc2NyaXB0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzQ29tcG9uZW50I2dldFZlcnNpb24gPGVtPlZlcnNpb248L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0UHJvY2Vzc0NvbXBvbmVudCgpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nUHJvY2Vzc0NvbXBvbmVudCcga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFByb2Nlc3NDb21wb25lbnQgZXh0ZW5kcyBQcm9jZXNzUGFja2FnZSB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q29weXJpZ2h0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Db3B5cmlnaHQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q29weXJpZ2h0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRDb3B5cmlnaHQoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRQcm9jZXNzQ29tcG9uZW50X0NvcHlyaWdodCgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdDb3B5cmlnaHQnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0Q29weXJpZ2h0KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzQ29tcG9uZW50I2dldENvcHlyaWdodCA8ZW0+Q29weXJpZ2h0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Db3B5cmlnaHQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldENvcHlyaWdodCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Q29weXJpZ2h0KFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JbnRlcmZhY2U8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkludGVyZmFjZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JbnRlcmZhY2U8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldEludGVyZmFjZShQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRQcm9jZXNzQ29tcG9uZW50X0ludGVyZmFjZSgpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdJbnRlcmZhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlIGdldEludGVyZmFjZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc0NvbXBvbmVudCNnZXRJbnRlcmZhY2UgPGVtPkludGVyZmFjZTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SW50ZXJmYWNlPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRJbnRlcmZhY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEludGVyZmFjZShQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlByb2Nlc3M8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlByb2Nlc3M8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UHJvY2VzczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0UHJvY2VzcyhvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRQcm9jZXNzQ29tcG9uZW50X1Byb2Nlc3MoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIgcmVxdWlyZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1Byb2Nlc3MnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzIGdldFByb2Nlc3MoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NDb21wb25lbnQjZ2V0UHJvY2VzcyA8ZW0+UHJvY2VzczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UHJvY2VzczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0UHJvY2VzcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UHJvY2VzcyhvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkF1dGhvcnM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIEV2ZXJ5IE1ldGhvZCBVbml0IGlzIGJlaW5nIGNyZWF0ZWQgYW5kIG93bmVkIGJ5IGFuIGF1dGhvciBvciBhdXRob3JpbmcgdGVhbS4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QXV0aG9yczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0QXV0aG9ycyhTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFByb2Nlc3NDb21wb25lbnRfQXV0aG9ycygpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdhdHRyaWJ1dGUnIG5hbWU9J2F1dGhvcnMnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0QXV0aG9ycygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc0NvbXBvbmVudCNnZXRBdXRob3JzIDxlbT5BdXRob3JzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BdXRob3JzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRBdXRob3JzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRBdXRob3JzKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5DaGFuZ2UgRGF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGRhdGUgdGhlIGxhc3QgY2hhbmdlIHRoYXQgcmVzdWx0ZWQgaW50byB0aGlzIHZlcnNpb24gaGFzIGJlZW4gbWFkZS4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q2hhbmdlIERhdGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldENoYW5nZURhdGUoWE1MR3JlZ29yaWFuQ2FsZW5kYXIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFByb2Nlc3NDb21wb25lbnRfQ2hhbmdlRGF0ZSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRGF0ZVRpbWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2F0dHJpYnV0ZScgbmFtZT0nY2hhbmdlRGF0ZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVhNTEdyZWdvcmlhbkNhbGVuZGFyIGdldENoYW5nZURhdGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NDb21wb25lbnQjZ2V0Q2hhbmdlRGF0ZSA8ZW0+Q2hhbmdlIERhdGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNoYW5nZSBEYXRlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRDaGFuZ2VEYXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRDaGFuZ2VEYXRlKFhNTEdyZWdvcmlhbkNhbGVuZGFyIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNoYW5nZSBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBsYXN0IGNoYW5nZSB0aGF0IHJlc3VsdGVkIGludG8gdGhpcyB2ZXJzaW9uLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5DaGFuZ2UgRGVzY3JpcHRpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldENoYW5nZURlc2NyaXB0aW9uKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0UHJvY2Vzc0NvbXBvbmVudF9DaGFuZ2VEZXNjcmlwdGlvbigpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdhdHRyaWJ1dGUnIG5hbWU9J2NoYW5nZURlc2NyaXB0aW9uJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldENoYW5nZURlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzQ29tcG9uZW50I2dldENoYW5nZURlc2NyaXB0aW9uIDxlbT5DaGFuZ2UgRGVzY3JpcHRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNoYW5nZSBEZXNjcmlwdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0Q2hhbmdlRGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldENoYW5nZURlc2NyaXB0aW9uKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5WZXJzaW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBFdmVyeSBQYWNrYWdlIGhhcyBhIHZlcnNpb24gbnVtYmVyIHVzZWQgdG8gdHJhY2sgY2hhbmdlcy4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VmVyc2lvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0VmVyc2lvbihTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFByb2Nlc3NDb21wb25lbnRfVmVyc2lvbigpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdhdHRyaWJ1dGUnIG5hbWU9J3ZlcnNpb24nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0VmVyc2lvbigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc0NvbXBvbmVudCNnZXRWZXJzaW9uIDxlbT5WZXJzaW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5WZXJzaW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRWZXJzaW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRWZXJzaW9uKFN0cmluZyB2YWx1ZSk7Ci0KLX0gLy8gUHJvY2Vzc0NvbXBvbmVudApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYjIyNjJjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UuamF2YSx2IDEuMiAyMDA4LzAxLzMwIDAwOjQxOjQ4IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Qcm9jZXNzIENvbXBvbmVudCBJbnRlcmZhY2U8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBDb21wcmlzZXMgb2YgYSBsaXN0IG9mIGludGVyZmFjZSBzcGVjaWZpY2F0aW9ucyAoc2ltaWxhciB0byBvcGVyYXRpb24gZGVjbGFyYXRpb25zKSB0aGF0IGV4cHJlc3MgaW5wdXRzIGFuZCBvdXRwdXRzIGZvciBhIHByb2Nlc3MgY29tcG9uZW50LiAgVGhlc2UgaW50ZXJmYWNlIHNwZWNpZmljYXRpb25zIGFyZSBleHByZXNzZWQgdXNpbmcgVGFzayBEZXNjcmlwdG9ycyB3aGljaCBhcmUgbm90IGxpbmtlZCB0byBUYXNrcyB0aGF0IGFyZSByZWxhdGVkIHRvIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9ycyBhcyB3ZWxsIGFzIG9wdGlvbmFsIGEgUm9sZSBEZXNjcmlwdG9yLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UjZ2V0R3JvdXAyIDxlbT5Hcm91cDI8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UjZ2V0SW50ZXJmYWNlU3BlY2lmaWNhdGlvbiA8ZW0+SW50ZXJmYWNlIFNwZWNpZmljYXRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UjZ2V0SW50ZXJmYWNlSU8gPGVtPkludGVyZmFjZSBJTzwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlKCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlJyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSBleHRlbmRzIEJyZWFrZG93bkVsZW1lbnQgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkdyb3VwMjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXAuRW50cnl9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+R3JvdXAyPC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+R3JvdXAyPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlX0dyb3VwMigpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUZlYXR1cmVNYXBFbnRyeSIgbWFueT0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZ3JvdXAnIG5hbWU9J2dyb3VwOjMwJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRmVhdHVyZU1hcCBnZXRHcm91cDIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkludGVyZmFjZSBTcGVjaWZpY2F0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFza0Rlc2NyaXB0b3J9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SW50ZXJmYWNlIFNwZWNpZmljYXRpb248L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JbnRlcmZhY2UgU3BlY2lmaWNhdGlvbjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0UHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZV9JbnRlcmZhY2VTcGVjaWZpY2F0aW9uKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0ludGVyZmFjZVNwZWNpZmljYXRpb24nIGdyb3VwPScjZ3JvdXA6MzAnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdDxUYXNrRGVzY3JpcHRvcj4gZ2V0SW50ZXJmYWNlU3BlY2lmaWNhdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SW50ZXJmYWNlIElPPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkludGVyZmFjZSBJTzwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkludGVyZmFjZSBJTzwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0UHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZV9JbnRlcmZhY2VJTygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIHZvbGF0aWxlPSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdJbnRlcmZhY2VJTycgZ3JvdXA9JyNncm91cDozMCciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0PFdvcmtQcm9kdWN0RGVzY3JpcHRvcj4gZ2V0SW50ZXJmYWNlSU8oKTsKLQotfSAvLyBQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1Byb2Nlc3NEZXNjcmlwdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1Byb2Nlc3NEZXNjcmlwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYzExZmQ1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9Qcm9jZXNzRGVzY3JpcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogUHJvY2Vzc0Rlc2NyaXB0aW9uLmphdmEsdiAxLjIgMjAwOC8wMS8zMCAwMDo0MTo0OCBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWE7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UHJvY2VzcyBEZXNjcmlwdGlvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEEgZ2VuZXJhbGl6ZWQgQWN0aXZpdHkgRGVzY3JpcHRpb24gdGhhdCBpcyB1c2VkIHRvIHN0b3JlIHRoZSB0ZXh0dWFsIGRlc2NyaXB0aW9uIGZvciBhIFByb2Nlc3MuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc0Rlc2NyaXB0aW9uI2dldFNjb3BlIDxlbT5TY29wZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc0Rlc2NyaXB0aW9uI2dldFVzYWdlTm90ZXMgPGVtPlVzYWdlIE5vdGVzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFByb2Nlc3NEZXNjcmlwdGlvbigpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nUHJvY2Vzc0Rlc2NyaXB0aW9uJyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUHJvY2Vzc0Rlc2NyaXB0aW9uIGV4dGVuZHMgQWN0aXZpdHlEZXNjcmlwdGlvbiB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U2NvcGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIERlZmluZXMgdGhlIHNjb3BlIG9mIHRoZSBQcm9jZXNzLCBpLmUuIHdoaWNoIHR5cGVzIG9mIHByb2plY3RzIGRvZXMgaXQgYWRkcmVzcyBhbmQgd2hpY2ggbm90LgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TY29wZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0U2NvcGUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRQcm9jZXNzRGVzY3JpcHRpb25fU2NvcGUoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nU2NvcGUnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0U2NvcGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NEZXNjcmlwdGlvbiNnZXRTY29wZSA8ZW0+U2NvcGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlNjb3BlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRTY29wZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0U2NvcGUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlVzYWdlIE5vdGVzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBBbnkgYWRkaXRpb25hbCBub3RlcyBvbiBob3cgdG8gYXBwbHkgYW5kIGluc3RhbnRpYXRlIHRoaXMgcHJvY2VzcyBmb3IgYSBwcm9qZWN0LgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Vc2FnZSBOb3RlczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0VXNhZ2VOb3RlcyhTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFByb2Nlc3NEZXNjcmlwdGlvbl9Vc2FnZU5vdGVzKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1VzYWdlTm90ZXMnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0VXNhZ2VOb3RlcygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc0Rlc2NyaXB0aW9uI2dldFVzYWdlTm90ZXMgPGVtPlVzYWdlIE5vdGVzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Vc2FnZSBOb3RlczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0VXNhZ2VOb3RlcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VXNhZ2VOb3RlcyhTdHJpbmcgdmFsdWUpOwotCi19IC8vIFByb2Nlc3NEZXNjcmlwdGlvbgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9Qcm9jZXNzRWxlbWVudC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1Byb2Nlc3NFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwNWEzNmQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1Byb2Nlc3NFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFByb2Nlc3NFbGVtZW50LmphdmEsdiAxLjEgMjAwOC8wMS8xNSAwODo1MjowNyBqdGhhbSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlByb2Nlc3MgRWxlbWVudDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEEgRGVzY3JpYmFibGUgRWxlbWVudCB0aGF0IHJlcHJlc2VudHMgYW4gYWJzdHJhY3QgZ2VuZXJhbGl6YXRpb24gZm9yIGFsbCBlbGVtZW50cyBkZWZpbmVkIGluIHRoZSBQcm9jZXNzIHBhY2thZ2UuCi0gKiBQcm9jZXNzIEVsZW1lbnRzIHJlcHJlc2VudHMgUHJvY2VzcyBzcGVjaWZpYyBlbGVtZW50cyB0aGF0IGFyZSBzdXBwb3NlZCB0byBiZSBtYW5hZ2VkIGluIFByb2Nlc3MgUGFja2FnZXMuICBUaGUgc2VwYXJhdGlvbiBvZiBQcm9jZXNzIEVsZW1lbnQgZnJvbSBDb250ZW50IEVsZW1lbnQgYWxsb3dzIHRvIGNsZWFybHkgZGlzdGluZ3Vpc2ggYmV0d2VlbiBwdXJlIG1ldGhvZCBjb250ZW50IGZyb20gY29udGVudCB0aGF0IGlzIHJlcHJlc2VudGVkIGluIHByb2Nlc3Nlcy4gCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRQcm9jZXNzRWxlbWVudCgpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nUHJvY2Vzc0VsZW1lbnQnIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBQcm9jZXNzRWxlbWVudCBleHRlbmRzIERlc2NyaWJhYmxlRWxlbWVudCB7Ci19IC8vIFByb2Nlc3NFbGVtZW50ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1Byb2Nlc3NQYWNrYWdlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvUHJvY2Vzc1BhY2thZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjQ0ZjNkZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvUHJvY2Vzc1BhY2thZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogUHJvY2Vzc1BhY2thZ2UuamF2YSx2IDEuMiAyMDA4LzAxLzMwIDAwOjQxOjQ4IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Qcm9jZXNzIFBhY2thZ2U8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIHNwZWNpYWwgTWV0aG9kIFBhY2thZ2UgdGhhdCBjb250YWlucyBQcm9jZXNzIEVsZW1lbnRzLCBvbmx5LgotICogQSBrZXkgc2VwYXJhdGlvbiBvZiBjb25jZXJucyBpbiBVTUEgaXMgdGhlIGRpc3RpbmN0aW9uIGJldHdlZW4gTWV0aG9kIENvbnRlbnQgYW5kIFByb2Nlc3MuICBUaGlzIHNlcGFyYXRpb24gaXMgZW5mb3JjZWQgYnkgc3BlY2lhbCBwYWNrYWdlIHR5cGVzLCB3aGljaCBkbyBub3QgYWxsb3cgdGhlIG1peGluZyBvZiBtZXRob2QgY29udGVudCB3aXRoIHByb2Nlc3Nlcy4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzUGFja2FnZSNnZXRHcm91cDIgPGVtPkdyb3VwMjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc1BhY2thZ2UjZ2V0UHJvY2Vzc0VsZW1lbnQgPGVtPlByb2Nlc3MgRWxlbWVudDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRQcm9jZXNzUGFja2FnZSgpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nUHJvY2Vzc1BhY2thZ2UnIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBQcm9jZXNzUGFja2FnZSBleHRlbmRzIE1ldGhvZFBhY2thZ2UgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkdyb3VwMjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXAuRW50cnl9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+R3JvdXAyPC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+R3JvdXAyPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRQcm9jZXNzUGFja2FnZV9Hcm91cDIoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVGZWF0dXJlTWFwRW50cnkiIG1hbnk9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2dyb3VwJyBuYW1lPSdncm91cDoxMyciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUZlYXR1cmVNYXAgZ2V0R3JvdXAyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Qcm9jZXNzIEVsZW1lbnQ8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzRWxlbWVudH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Qcm9jZXNzIEVsZW1lbnQ8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Qcm9jZXNzIEVsZW1lbnQ8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFByb2Nlc3NQYWNrYWdlX1Byb2Nlc3NFbGVtZW50KCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1Byb2Nlc3NFbGVtZW50JyBncm91cD0nI2dyb3VwOjEzJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3Q8UHJvY2Vzc0VsZW1lbnQ+IGdldFByb2Nlc3NFbGVtZW50KCk7Ci0KLX0gLy8gUHJvY2Vzc1BhY2thZ2UKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9Qcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNjY4YzEyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9Qcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZS5qYXZhLHYgMS4yIDIwMDgvMDEvMzAgMDA6NDE6NDgga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXA7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlByb2Nlc3MgUGxhbm5pbmcgVGVtcGxhdGU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIHNwZWNpYWwgUHJvY2VzcyB0aGF0IGlzIHByZXBhcmVkIGZvciBpbnN0YW50aWF0aW9uIGJ5IGEgcHJvamVjdCBwbGFubmluZyB0b29sLiAgVHlwaWNhbGx5LCBpdCBpcyBjcmVhdGVkIGJhc2VkIG9uIGEgUHJvY2VzcyBzdWNoIGFzIGEgRGVsaXZlcnkgUHJvY2VzcyBhcyBhIHdob2xlIChlLmcuIGluIGNhc2Ugb2YgYSB3YXRlcmZhbGwtYmFzZWQgZGV2ZWxvcG1lbnQgYXBwcm9hY2gpIG9yIGluIHBhcnRzIChlLmcuIGluIGNhc2Ugb2YgYW4gaXRlcmF0aXZlIGRldmVsb3BtZW50IGFwcHJvYWNoKS4KLSAqIEEgUHJvY2VzcyBQbGFubmluZyBUZW1wbGF0ZSByZXByZXNlbnRzIGEgcGFydGlhbGx5IGZpbmlzaGVkIHBsYW4gZm9yIGEgY29uY3JldGUgcHJvamVjdC4gIEl0IHVzZXMgdGhlIHNhbWUgaW5mb3JtYXRpb24gc3RydWN0dXJlcyBhcyBhbGwgb3RoZXIgUHJvY2VzcyBUeXBlcyB0byByZXByZXNlbnQgdGVtcGxhdGVzIGZvciBwcm9qZWN0IHBsYW5zLiAgSG93ZXZlciwgY2VydGFpbiBwbGFubmluZyBkZWNpc2lvbnMgaGF2ZSBhbHJlYWR5IGJlZW4gYXBwbGllZCB0byB0aGUgdGVtcGxhdGUgYXMgd2VsbCBhcyBpbmZvcm1hdGlvbiBoYXMgYmVlbiByZW1vdmVkIGFuZC9vciByZWZvcm1hdHRlZCB0byBiZSByZWFkeSBmb3IgZXhwb3J0IHRvIGEgc3BlY2lmaWMgcGxhbm5pbmcgdG9vbC4gIEV4YW1wbGVzIGZvciBzdWNoIGRlY2lzaW9ucyBhcmU6IGEgdGVtcGxhdGUgaGFzIGJlZW4gY3JlYXRlZCB0byByZXByZXNlbnQgYSBwbGFuIGZvciBhIHBhcnRpY3VsYXIgSXRlcmF0aW9uIGluIGFuIGl0ZXJhdGl2ZSBkZXZlbG9wbWVudCBwcm9qZWN0LCB3aGljaCBmciBleGFtcGxlIGRpc3Rpbmd1aXNoZXMgZWFybHkgZnJvbSBsYXRlIGl0ZXJhdGlvbnMgaW4gdGhlIEVsYWJvcmF0aW9uIHBoYXNlIG9mIGEgcHJvamVjdDsgaWYgdGhlIHRhcmdldGVkIHBsYW5uaW5nIHRvb2wgY2Fubm90IHJlcHJlc2VudCBpbnB1dCBhbmQgb3V0cHV0IG9mIFRhc2ssIHRoZW4gdGhlc2UgaGF2ZSBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgc3RydWN0dXJlOyBjZXJ0YWluIHJlcGV0aXRpb25zIGhhdmUgYmVlbiBhbHJlYWR5IGFwcGxpZWQsIGUuZy4gc3RhdGluZyB0aGF0IGEgY3ljbGUgb2Ygc3BlY2lmaWMgVGFzayBncm91cGVkIGluIGFuIEFjdGl2aXR5IGhhdmUgdG8gYmUgcmVwZWF0ZWQgbi10aW1lczsgZXRjLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NQbGFubmluZ1RlbXBsYXRlI2dldEdyb3VwNCA8ZW0+R3JvdXA0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSNnZXRCYXNlUHJvY2VzcyA8ZW0+QmFzZSBQcm9jZXNzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFByb2Nlc3NQbGFubmluZ1RlbXBsYXRlKCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZScga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFByb2Nlc3NQbGFubmluZ1RlbXBsYXRlIGV4dGVuZHMgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2VzcyB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+R3JvdXA0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcC5FbnRyeX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Hcm91cDQ8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Hcm91cDQ8L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFByb2Nlc3NQbGFubmluZ1RlbXBsYXRlX0dyb3VwNCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUZlYXR1cmVNYXBFbnRyeSIgbWFueT0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZ3JvdXAnIG5hbWU9J2dyb3VwOjQ3JyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRmVhdHVyZU1hcCBnZXRHcm91cDQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkJhc2UgUHJvY2VzczwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+QmFzZSBQcm9jZXNzPC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QmFzZSBQcm9jZXNzPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZV9CYXNlUHJvY2VzcygpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIiB0cmFuc2llbnQ9InRydWUiIHZvbGF0aWxlPSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdCYXNlUHJvY2VzcycgZ3JvdXA9JyNncm91cDo0NyciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0PFN0cmluZz4gZ2V0QmFzZVByb2Nlc3MoKTsKLQotfSAvLyBQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9SZXBvcnQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9SZXBvcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWI0ODg4Yi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvUmVwb3J0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFJlcG9ydC5qYXZhLHYgMS4xIDIwMDgvMDEvMTUgMDg6NTI6MDcganRoYW0gRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYTsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5SZXBvcnQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIHByZWRlZmluZWQgdGVtcGxhdGUgb2YgYSByZXN1bHQgdGhhdCBpcyBnZW5lcmF0ZWQgb24gdGhlIGJhc2lzIG9mIG90aGVyIHdvcmsgcHJvZHVjdHMgYXMgYW4gb3V0cHV0IGZyb20gc29tZSBmb3JtIG9mIHRvb2wgYXV0b21hdGlvbi4gQW4gZXhhbXBsZSBmb3IgYSByZXBvcnQgd291bGQgYmUgYSB1c2UgY2FzZSBtb2RlbCBzdXJ2ZXksIHdoaWNoIGlzIGdlbmVyYXRlZCBieSBleHRyYWN0aW5nIGRpYWdyYW0gaW5mb3JtYXRpb24gZnJvbSBhIGdyYXBoaWNhbCBtb2RlbCBhbmQgdGV4dHVhbCBpbmZvcm1hdGlvbiBmcm9tIGRvY3VtZW50cyBhbmQgY29tYmluZXMgdGhlc2UgdHdvIHR5cGVzIG9mIGluZm9ybWF0aW9uIGludG8gYSByZXBvcnQuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRSZXBvcnQoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J1JlcG9ydCcga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFJlcG9ydCBleHRlbmRzIEd1aWRhbmNlIHsKLX0gLy8gUmVwb3J0ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1JldXNhYmxlQXNzZXQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9SZXVzYWJsZUFzc2V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0NDk2MWQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1JldXNhYmxlQXNzZXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogUmV1c2FibGVBc3NldC5qYXZhLHYgMS4xIDIwMDgvMDEvMTUgMDg6NTI6MDcganRoYW0gRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYTsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5SZXVzYWJsZSBBc3NldDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEEgc3BlY2lmaWMgdHlwZSBvZiBndWlkYW5jZSB0aGF0IHByb3ZpZGVzIGEgc29sdXRpb24gdG8gYSBwcm9ibGVtIGZvciBhIGdpdmVuIGNvbnRleHQuIFRoZSBhc3NldCBtYXkgaGF2ZSBhIHZhcmlhYmlsaXR5IHBvaW50LCB3aGljaCBpcyBhIGxvY2F0aW9uIGluIHRoZSBhc3NldCB0aGF0IG1heSBoYXZlIGEgdmFsdWUgcHJvdmlkZWQgb3IgY3VzdG9taXplZCBieSB0aGUgYXNzZXQgY29uc3VtZXIuIFRoZSBhc3NldCBoYXMgcnVsZXMgZm9yIHVzYWdlIHdoaWNoIGFyZSB0aGUgaW5zdHJ1Y3Rpb25zIGRlc2NyaWJpbmcKLSAqIGhvdyB0aGUgYXNzZXQgc2hvdWxkIGJlIHVzZWQuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRSZXVzYWJsZUFzc2V0KCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdSZXVzYWJsZUFzc2V0JyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUmV1c2FibGVBc3NldCBleHRlbmRzIEd1aWRhbmNlIHsKLX0gLy8gUmV1c2FibGVBc3NldApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9Sb2FkbWFwLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvUm9hZG1hcC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDA2Nzg0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9Sb2FkbWFwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFJvYWRtYXAuamF2YSx2IDEuMSAyMDA4LzAxLzE1IDA4OjUyOjA3IGp0aGFtIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWE7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Um9hZG1hcDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEEgc3BlY2lmaWMgdHlwZSBvZiBHdWlkYW5jZSB3aGljaCBpcyBvbmx5IHJlbGF0ZWQgdG8gQWN0aXZhdGVzIGFuZCB0aGVyZWZvcmUgaGFzIGJlZW4gYWRkZWQgYnkgdGhpcyBwYWNrYWdlIHRvIHRoZSBsaXN0IG9mIEd1aWRhbmNlIFR5cGVzIHJhdGhlciB0aGFuIGxpc3RlZCBpbiB0aGUgR3VpZGFuY2UgVHlwZXMgcGFja2FnZS4gIEEgUm9hZG1hcCByZXByZXNlbnRzIGEgbGluZWFyIHdhbGt0aHJvdWdoIG9mIGFuIEFjdGl2aXR5LCB0eXBpY2FsbHkgYSBQcm9jZXNzLgotICogQW4gaW5zdGFuY2Ugb2YgYSBSb2FkbWFwIHJlcHJlc2VudHMgaW1wb3J0YW50IGRvY3VtZW50YXRpb24gZm9yIHRoZSBBY3Rpdml0eSBvciBQcm9jZXNzIGl0IGlzIHJlbGF0ZWQgdG8uICBPZnRlbiBhIGNvbXBsZXggQWN0aXZpdHkgc3VjaCBhcyBhIFByb2Nlc3MgY2FuIGJlIG11Y2ggZWFzaWVyIHVuZGVyc3Rvb2QgYnkgcHJvdmlkaW5nIGEgd2Fsa3Rocm91Z2ggd2l0aCBhIGxpbmVhciB0aHJlYWQgb2YgYSB0eXBpY2FsIGluc3RhbnRpYXRpb24gb2YgdGhpcyBBY3Rpdml0eS4gIEluIGFkZGl0aW9uIHRvIG1ha2luZyB0aGUgcHJvY2VzcyBwcmFjdGl0aW9uZXIgdW5kZXJzdGFuZCBob3cgd29yayBpbiB0aGUgcHJvY2VzcyBpcyBiZWluZyBwZXJmb3JtZWQsIGEgUm9hZG1hcCBwcm92aWRlcyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGFib3V0IGhvdyBBY3Rpdml0aWVzIGFuZCBUYXNrcyByZWxhdGUgdG8gZWFjaCBvdGhlciBvdmVyIHRpbWUuICBSb2FkbWFwcyBhcmUgYWxzbyB1c2VkIHRvIHNob3cgaG93IHNwZWNpZmljIGFzcGVjdHMgYXJlIGRpc3RyaWJ1dGVkIG92ZXIgYSB3aG9sZSBwcm9jZXNzIHByb3ZpZGluZyBhIGtpbmQgb2YgZmlsdGVyIG9uIHRoZSBwcm9jZXNzIGZvciB0aGlzIGluZm9ybWF0aW9uLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0Um9hZG1hcCgpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nUm9hZG1hcCcga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFJvYWRtYXAgZXh0ZW5kcyBHdWlkYW5jZSB7Ci19IC8vIFJvYWRtYXAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvUm9sZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1JvbGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDFiYmExNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvUm9sZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBSb2xlLmphdmEsdiAxLjIgMjAwOC8wMS8zMCAwMDo0MTo0OCBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Um9sZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEEgQ29udGVudCBFbGVtZW50IHRoYXQgZGVmaW5lcyBhIHNldCBvZiByZWxhdGVkIHNraWxscywgY29tcGV0ZW5jaWVzLCBhbmQgcmVzcG9uc2liaWxpdGllcy4gIFJvbGVzIGFyZSB1c2VkIGJ5IFRhc2tzIHRvIGRlZmluZSB3aG8gcGVyZm9ybXMgdGhlbSBhcyB3ZWxsIGFzIGRlZmluZSBhIHNldCBvZiB3b3JrIHByb2R1Y3RzIHRoZXkgYXJlIHJlc3BvbnNpYmxlIGZvci4gIAotICogQSBSb2xlIGRlZmluZXMgYSBzZXQgb2YgcmVsYXRlZCBza2lsbHMsIGNvbXBldGVuY2llcywgYW5kIHJlc3BvbnNpYmlsaXRpZXMgb2YgYW4gaW5kaXZpZHVhbCBvciBhIHNldCBvZiBpbmRpdmlkdWFscy4gIFJvbGVzIGFyZSBub3QgaW5kaXZpZHVhbHMgb3IgcmVzb3VyY2VzLiAgSW5kaXZpZHVhbCBtZW1iZXJzIG9mIHRoZSBkZXZlbG9wbWVudCBvcmdhbml6YXRpb24gd2lsbCB3ZWFyIGRpZmZlcmVudCBoYXRzLCBvciBwZXJmb3JtIGRpZmZlcmVudCByb2xlcy4gVGhlIG1hcHBpbmcgZnJvbSBpbmRpdmlkdWFsIHRvIHJvbGUsIHBlcmZvcm1lZCBieSB0aGUgcHJvamVjdCBtYW5hZ2VyIHdoZW4gcGxhbm5pbmcgYW5kIHN0YWZmaW5nIGZvciBhIHByb2plY3QsIGFsbG93cyBkaWZmZXJlbnQgaW5kaXZpZHVhbHMgdG8gYWN0IGFzIHNldmVyYWwgZGlmZmVyZW50IHJvbGVzLCBhbmQgZm9yIGEgcm9sZSB0byBiZSBwbGF5ZWQgYnkgc2V2ZXJhbCBpbmRpdmlkdWFscy4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Sb2xlI2dldEdyb3VwMiA8ZW0+R3JvdXAyPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Sb2xlI2dldFJlc3BvbnNpYmxlRm9yIDxlbT5SZXNwb25zaWJsZSBGb3I8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0Um9sZSgpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nUm9sZScga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFJvbGUgZXh0ZW5kcyBDb250ZW50RWxlbWVudCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+R3JvdXAyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcC5FbnRyeX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Hcm91cDI8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Hcm91cDI8L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFJvbGVfR3JvdXAyKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRmVhdHVyZU1hcEVudHJ5IiBtYW55PSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdncm91cCcgbmFtZT0nZ3JvdXA6MjQnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlGZWF0dXJlTWFwIGdldEdyb3VwMigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmVzcG9uc2libGUgRm9yPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5SZXNwb25zaWJsZSBGb3I8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZXNwb25zaWJsZSBGb3I8L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFJvbGVfUmVzcG9uc2libGVGb3IoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nUmVzcG9uc2libGVGb3InIGdyb3VwPScjZ3JvdXA6MjQnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdDxTdHJpbmc+IGdldFJlc3BvbnNpYmxlRm9yKCk7Ci0KLX0gLy8gUm9sZQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9Sb2xlRGVzY3JpcHRpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9Sb2xlRGVzY3JpcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTk4YjIyYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvUm9sZURlc2NyaXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTEgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBSb2xlRGVzY3JpcHRpb24uamF2YSx2IDEuMiAyMDA4LzAxLzMwIDAwOjQxOjQ3IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYTsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Sb2xlIERlc2NyaXB0aW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQSBnZW5lcmFsaXplZCBDb250ZW50IERlc2NyaXB0aW9uIHRoYXQgaXMgdXNlZCB0byBzdG9yZSB0aGUgdGV4dHVhbCBkZXNjcmlwdGlvbiBmb3IgYSBSb2xlLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJvbGVEZXNjcmlwdGlvbiNnZXRBc3NpZ25tZW50QXBwcm9hY2hlcyA8ZW0+QXNzaWdubWVudCBBcHByb2FjaGVzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Sb2xlRGVzY3JpcHRpb24jZ2V0U2tpbGxzIDxlbT5Ta2lsbHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJvbGVEZXNjcmlwdGlvbiNnZXRTeW5vbnltcyA8ZW0+U3lub255bXM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0Um9sZURlc2NyaXB0aW9uKCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdSb2xlRGVzY3JpcHRpb24nIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBSb2xlRGVzY3JpcHRpb24gZXh0ZW5kcyBDb250ZW50RGVzY3JpcHRpb24gewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkFzc2lnbm1lbnQgQXBwcm9hY2hlczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogUHJvdmlkZXMgZ3VpZGFuY2Ugb24gZm9yIGFzc2lnbmluZyBpbmRpdmlkdWFscyB0byB0aGUgUm9sZSBpbiB0ZXJtcyBvZiB3aGF0IG90aGVyIHJvbGVzIHRoZXNlIGluZGl2aWR1YWxzIGNvdWxkIHBlcmZvcm0gYW5kIHdoYXQgcmVzcG9uc2liaWxpdHkgZGlmZmVyZW50IGluZGl2aWR1YWxzIGFzc2lnbmVkIHRvIHRoaXMgcm9sZSBtaWdodCBoYXZlLiAgVGhlIGd1aWRhbmNlIGNhbiBhbHNvIGRlc2NyaWJlIGRpZmZlcmVudCBhc3NpZ25tZW50IGFwcHJvYWNoZXMgZm9yIGRpZmZlcmVudCB0eXBlcyBvZiBwcm9qZWN0cywgZS5nLiBmb3IgbGFyZ2UgdmVyc3VzIHNtYWxsIHRlYW1zIHdoZXJlIGluZGl2aWR1YWxzIGNvdWxkIGJlIGFsbG9jYXRlZCB0byByb2xlcyBmdWxsIHRpbWUgdmVyc3VzIHNoYXJpbmcgcm9sZXMgd2l0aGluIHRoZSB0ZWFtLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Bc3NpZ25tZW50IEFwcHJvYWNoZXM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEFzc2lnbm1lbnRBcHByb2FjaGVzKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0Um9sZURlc2NyaXB0aW9uX0Fzc2lnbm1lbnRBcHByb2FjaGVzKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0Fzc2lnbm1lbnRBcHByb2FjaGVzJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldEFzc2lnbm1lbnRBcHByb2FjaGVzKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Sb2xlRGVzY3JpcHRpb24jZ2V0QXNzaWdubWVudEFwcHJvYWNoZXMgPGVtPkFzc2lnbm1lbnQgQXBwcm9hY2hlczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QXNzaWdubWVudCBBcHByb2FjaGVzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRBc3NpZ25tZW50QXBwcm9hY2hlcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0QXNzaWdubWVudEFwcHJvYWNoZXMoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlNraWxsczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogTGlzdHMgb2Ygc2V0IG9mIHJlcXVpcmVkIHNraWxscyBhIHBlcnNvbiBuZWVkcyB0byBwb3NzZXNzIHRvIGZ1bGZpbGwgdGhhdCBSb2xlLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Ta2lsbHM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFNraWxscyhTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFJvbGVEZXNjcmlwdGlvbl9Ta2lsbHMoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nU2tpbGxzJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFNraWxscygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUm9sZURlc2NyaXB0aW9uI2dldFNraWxscyA8ZW0+U2tpbGxzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Ta2lsbHM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFNraWxscygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0U2tpbGxzKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TeW5vbnltczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogTGlzdHMgc3lub255bXMsIGkuZS4gb3RoZXIgbmFtZXMgdGhlIFJvbGUgbWlnaHQgYmUgcmVmZXJyZWQgYnkuICBUb29sIHN1cHBvcnQgZm9yIHRoZSBtZXRhLW1vZGVsIG1pZ2h0IHN1cHBvcnQgdGhhdCBhIFJvbGUgbmFtZSBjYW4gYmUgY29uc2lzdGVudGx5IGJlIHJlcGxhY2VkIHdpdGggb25lIG9mIGl0cyBzeW5vbnltcyB0aHJvdWdodCBhIFByb2Nlc3MuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlN5bm9ueW1zPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRTeW5vbnltcyhTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFJvbGVEZXNjcmlwdGlvbl9TeW5vbnltcygpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdTeW5vbnltcyciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRTeW5vbnltcygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUm9sZURlc2NyaXB0aW9uI2dldFN5bm9ueW1zIDxlbT5TeW5vbnltczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U3lub255bXM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFN5bm9ueW1zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRTeW5vbnltcyhTdHJpbmcgdmFsdWUpOwotCi19IC8vIFJvbGVEZXNjcmlwdGlvbgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9Sb2xlRGVzY3JpcHRvci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1JvbGVEZXNjcmlwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyMGZlNDMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1JvbGVEZXNjcmlwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFJvbGVEZXNjcmlwdG9yLmphdmEsdiAxLjIgMjAwOC8wMS8zMCAwMDo0MTo0OCBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlJvbGUgRGVzY3JpcHRvcjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEEgc3BlY2lhbCBEZXNjcmlwdG9yIHRoYXQgcmVwcmVzZW50cyBhIFJvbGUgaW4gdGhlIGNvbnRleHQgb2Ygb25lIHNwZWNpZmljIEFjdGl2aXR5LiAgRXZlcnkgYnJlYWtkb3duIHN0cnVjdHVyZSBjYW4gZGVmaW5lIGRpZmZlcmVudCByZWxhdGlvbnNoaXBzIG9mIFJvbGUgRGVzY3JpcHRvcnMgdG8gVGFzayBEZXNjcmlwdG9ycyBhbmQgV29yayBQcm9kdWN0IERlc2NyaXB0b3JzLiAgVGhlcmVmb3JlIG9uZSBSb2xlIGNhbiBiZSByZXByZXNlbnRlZCBieSBtYW55IFJvbGUgRGVzY3JpcHRvcnMgZWFjaCB3aXRoaW4gdGhlIGNvbnRleHQgb2YgYW4gQWN0aXZpdHkgd2l0aCBpdHMgb3duIHNldCBvZiByZWxhdGlvbnNoaXBzLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJvbGVEZXNjcmlwdG9yI2dldFJvbGUgPGVtPlJvbGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJvbGVEZXNjcmlwdG9yI2dldFJlc3BvbnNpYmxlRm9yIDxlbT5SZXNwb25zaWJsZSBGb3I8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0Um9sZURlc2NyaXB0b3IoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J1JvbGVEZXNjcmlwdG9yJyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUm9sZURlc2NyaXB0b3IgZXh0ZW5kcyBEZXNjcmlwdG9yIHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Sb2xlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Sb2xlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJvbGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFJvbGUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRSb2xlRGVzY3JpcHRvcl9Sb2xlKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1JvbGUnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0Um9sZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUm9sZURlc2NyaXB0b3IjZ2V0Um9sZSA8ZW0+Um9sZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Um9sZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0Um9sZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Um9sZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmVzcG9uc2libGUgRm9yPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5SZXNwb25zaWJsZSBGb3I8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZXNwb25zaWJsZSBGb3I8L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFJvbGVEZXNjcmlwdG9yX1Jlc3BvbnNpYmxlRm9yKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1Jlc3BvbnNpYmxlRm9yJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3Q8U3RyaW5nPiBnZXRSZXNwb25zaWJsZUZvcigpOwotCi19IC8vIFJvbGVEZXNjcmlwdG9yClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1JvbGVTZXQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9Sb2xlU2V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhNDgzYmIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1JvbGVTZXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogUm9sZVNldC5qYXZhLHYgMS4yIDIwMDgvMDEvMzAgMDA6NDE6NDgga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXA7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlJvbGUgU2V0PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogT3JnYW5pemVzIFJvbGVzIGludG8gY2F0ZWdvcmllcy4gIEl0IGlzIHVzZWQgdG8gZ3JvdXAgcm9sZXMgdG9nZXRoZXIgdGhhdCBoYXZlIGNlcnRhaW4gY29tbW9uYWxpdGllcy4gIEZvciBleGFtcGxlLCB0aGUgIkFuYWx5c3RzIiBSb2xlIFNldCBjb3VsZCBncm91cCB0aGUgIkJ1c2luZXNzIFByb2Nlc3MgQW5hbHlzdCIsICJTeXN0ZW0gQW5hbHlzdCIsIGFzIHdlbGwgYXMgIlJlcXVpcmVtZW50cyBTcGVjaWZpZXIiIHJvbGVzLiAgQWxsIG9mIHRoZXNlIHdvcmsgd2l0aCBzaW1pbGFyIHRlY2huaXF1ZXMgYW5kIGhhdmUgb3ZlcmxhcHBpbmcgc2tpbGxzLCBidXQgYXJlIHJlcXVpcmVkIGFzIGRpc3RpbmN0IHJvbGVzIGZvciBhIG1ldGhvZCAoZS5nLiB0aGUgbWV0aG9kIHRoZSBJQk0gUmF0aW9uYWwgVW5pZmllZCBQcm9jZXNzIGlzIGJhc2VkIG9uKS4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Sb2xlU2V0I2dldEdyb3VwMiA8ZW0+R3JvdXAyPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Sb2xlU2V0I2dldFJvbGUgPGVtPlJvbGU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0Um9sZVNldCgpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nUm9sZVNldCcga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFJvbGVTZXQgZXh0ZW5kcyBDb250ZW50Q2F0ZWdvcnkgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkdyb3VwMjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXAuRW50cnl9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+R3JvdXAyPC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+R3JvdXAyPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRSb2xlU2V0X0dyb3VwMigpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUZlYXR1cmVNYXBFbnRyeSIgbWFueT0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZ3JvdXAnIG5hbWU9J2dyb3VwOjI0JyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRmVhdHVyZU1hcCBnZXRHcm91cDIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJvbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlJvbGU8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Sb2xlPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRSb2xlU2V0X1JvbGUoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nUm9sZScgZ3JvdXA9JyNncm91cDoyNCciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0PFN0cmluZz4gZ2V0Um9sZSgpOwotCi19IC8vIFJvbGVTZXQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvUm9sZVNldEdyb3VwaW5nLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvUm9sZVNldEdyb3VwaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5MzRhYzIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1JvbGVTZXRHcm91cGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBSb2xlU2V0R3JvdXBpbmcuamF2YSx2IDEuMiAyMDA4LzAxLzMwIDAwOjQxOjQ4IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Sb2xlIFNldCBHcm91cGluZzwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIFJvbGUgU2V0cyBjYW4gYmUgY2F0ZWdvcml6ZWQgaW50byBSb2xlIFNldCBHcm91cGluZ3MuICBGb3IgZXhhbXBsZSwgZGlmZmVyZW50IG1ldGhvZHMgbWlnaHQgZGVmaW5lIHNpbWlsYXIgUm9sZSBTZXRzLCB3aGljaCBob3dldmVyIG5lZWQgdG8gYmUgZGlzdGluZ3Vpc2hlZCBmcm9tIGVhY2ggb3RoZXIgb24gYSBnbG9iYWwgc2NhbGUuICBUaHVzLCBSb2xlIFNldCBHcm91cGluZ3MgYWxsb3cgZGlzdGluZ3Vpc2hpbmcsIGZvciBleGFtcGxlLCBTb2Z0d2FyZSBTZXJ2aWNlcyBNYW5hZ2VyIFJvbGUgU2V0cyBmcm9tIFNvZnR3YXJlIERldmVsb3BtZW50IE9yZ2FuaXphdGlvbiBNYW5hZ2VyIFJvbGUgU2V0cy4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Sb2xlU2V0R3JvdXBpbmcjZ2V0R3JvdXAyIDxlbT5Hcm91cDI8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJvbGVTZXRHcm91cGluZyNnZXRSb2xlU2V0IDxlbT5Sb2xlIFNldDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRSb2xlU2V0R3JvdXBpbmcoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J1JvbGVTZXRHcm91cGluZycga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFJvbGVTZXRHcm91cGluZyBleHRlbmRzIENvbnRlbnRDYXRlZ29yeSB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+R3JvdXAyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcC5FbnRyeX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Hcm91cDI8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Hcm91cDI8L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFJvbGVTZXRHcm91cGluZ19Hcm91cDIoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVGZWF0dXJlTWFwRW50cnkiIG1hbnk9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2dyb3VwJyBuYW1lPSdncm91cDoyNCciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUZlYXR1cmVNYXAgZ2V0R3JvdXAyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Sb2xlIFNldDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Um9sZSBTZXQ8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Sb2xlIFNldDwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0Um9sZVNldEdyb3VwaW5nX1JvbGVTZXQoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nUm9sZVNldCcgZ3JvdXA9JyNncm91cDoyNCciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0PFN0cmluZz4gZ2V0Um9sZVNldCgpOwotCi19IC8vIFJvbGVTZXRHcm91cGluZwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9TZWN0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvU2VjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMDA2NzhhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9TZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjcgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBTZWN0aW9uLmphdmEsdiAxLjIgMjAwOC8wMS8zMCAwMDo0MTo0OCBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWE7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+U2VjdGlvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEEgc3BlY2lhbCBNZXRob2QgRWxlbWVudCB0aGF0IHJlcHJlc2VudHMgc3RydWN0dXJhbCBzdWJzZWN0aW9ucyBvZiBhIENvbnRlbnQgRGVzY3JpcHRpb24ncyBzZWN0aW9uRGVzY3JpcHRpb24gYXR0cmlidXRlLiAgSXQgaXMgdXNlZCBmb3IgZWl0aGVyIGxhcmdlIHNjYWxlIGRvY3VtZW50YXRpb24gb2YgQ29udGVudCBFbGVtZW50cyBvcmdhbml6ZWQgaW50byBzZWN0aW9ucyBhcyB3ZWxsIGFzIHRvIGZsZXhpYmx5IGFkZCBuZXcgU2VjdGlvbnMgdG8gQ29udGVudCBFbGVtZW50cyB1c2luZyBjb250cmlidXRpb24gdmFyaWFiaWxpdHkgYWRkZWQgdG8gdGhlIFNlY3Rpb24gY29uY2VwdCBmb3IgTWV0aG9kIFBsdWctaW5zLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlNlY3Rpb24jZ2V0U3ViU2VjdGlvbiA8ZW0+U3ViIFNlY3Rpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlNlY3Rpb24jZ2V0UHJlZGVjZXNzb3IgPGVtPlByZWRlY2Vzc29yPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5TZWN0aW9uI2dldERlc2NyaXB0aW9uIDxlbT5EZXNjcmlwdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuU2VjdGlvbiNnZXRTZWN0aW9uTmFtZSA8ZW0+U2VjdGlvbiBOYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5TZWN0aW9uI2dldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQgPGVtPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlNlY3Rpb24jZ2V0VmFyaWFiaWxpdHlUeXBlIDxlbT5WYXJpYWJpbGl0eSBUeXBlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFNlY3Rpb24oKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J1NlY3Rpb24nIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBTZWN0aW9uIGV4dGVuZHMgTWV0aG9kRWxlbWVudCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U3ViIFNlY3Rpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlN1YiBTZWN0aW9uPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlN1YiBTZWN0aW9uPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRTdWJTZWN0aW9uKFNlY3Rpb24pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFNlY3Rpb25fU3ViU2VjdGlvbigpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdTdWJTZWN0aW9uJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU2VjdGlvbiBnZXRTdWJTZWN0aW9uKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5TZWN0aW9uI2dldFN1YlNlY3Rpb24gPGVtPlN1YiBTZWN0aW9uPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TdWIgU2VjdGlvbjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0U3ViU2VjdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0U3ViU2VjdGlvbihTZWN0aW9uIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlByZWRlY2Vzc29yPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5QcmVkZWNlc3NvcjwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QcmVkZWNlc3NvcjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UHJlZGVjZXNzb3IoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRTZWN0aW9uX1ByZWRlY2Vzc29yKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1ByZWRlY2Vzc29yJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFByZWRlY2Vzc29yKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5TZWN0aW9uI2dldFByZWRlY2Vzc29yIDxlbT5QcmVkZWNlc3NvcjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UHJlZGVjZXNzb3I8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFByZWRlY2Vzc29yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRQcmVkZWNlc3NvcihTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoaXMgYXR0cmlidXRlcyBzdG9yZSB0aGUgZGVzY3JpcHRpb24gdGV4dCBmb3IgYSBDb250ZW50IERlc2NyaXB0aW9uJ3MgU2VjdGlvbi4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldERlc2NyaXB0aW9uKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0U2VjdGlvbl9EZXNjcmlwdGlvbigpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdEZXNjcmlwdGlvbiciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXREZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuU2VjdGlvbiNnZXREZXNjcmlwdGlvbiA8ZW0+RGVzY3JpcHRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXREZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RGVzY3JpcHRpb24oU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlNlY3Rpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogRXZlcnkgU2VjdGlvbiBoYXMgYSBuYW1lIHVzZWQgZm9yIGV4dGVybmFsIHByZXNlbnRhdGlvbiBvZiB0aGUgc2VjdGlvbiwgZS5nLiB3aGVuIHB1Ymxpc2hlZCBvciB3aGVuIHNlY3Rpb24gaGVhZGluZyBhcmUgbGlzdGVkIGluIGEgdGFibGUgb2YgY29udGVudHMuICBUaGlzIGF0dHJpYnV0ZSBpcyBzaW1pbGFyIHRvIFByZXNlbnRhdGlvbiBOYW1lIGZvciBDb250ZW50IEVsZW1lbnRzLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TZWN0aW9uIE5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFNlY3Rpb25OYW1lKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0U2VjdGlvbl9TZWN0aW9uTmFtZSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdhdHRyaWJ1dGUnIG5hbWU9J3NlY3Rpb25OYW1lJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFNlY3Rpb25OYW1lKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5TZWN0aW9uI2dldFNlY3Rpb25OYW1lIDxlbT5TZWN0aW9uIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlNlY3Rpb24gTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0U2VjdGlvbk5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFNlY3Rpb25OYW1lKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRTZWN0aW9uX1ZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nYXR0cmlidXRlJyBuYW1lPSd2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50JyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlNlY3Rpb24jZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCA8ZW0+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudChTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiJuYSI8L2NvZGU+LgotCSAqIFRoZSBsaXRlcmFscyBhcmUgZnJvbSB0aGUgZW51bWVyYXRpb24ge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlZhcmlhYmlsaXR5VHlwZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5WYXJpYWJpbGl0eSBUeXBlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlZhcmlhYmlsaXR5IFR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVmFyaWFiaWxpdHlUeXBlCi0JICogQHNlZSAjaXNTZXRWYXJpYWJpbGl0eVR5cGUoKQotCSAqIEBzZWUgI3Vuc2V0VmFyaWFiaWxpdHlUeXBlKCkKLQkgKiBAc2VlICNzZXRWYXJpYWJpbGl0eVR5cGUoVmFyaWFiaWxpdHlUeXBlKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRTZWN0aW9uX1ZhcmlhYmlsaXR5VHlwZSgpCi0JICogQG1vZGVsIGRlZmF1bHQ9Im5hIiB1bnNldHRhYmxlPSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdhdHRyaWJ1dGUnIG5hbWU9J3ZhcmlhYmlsaXR5VHlwZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVZhcmlhYmlsaXR5VHlwZSBnZXRWYXJpYWJpbGl0eVR5cGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlNlY3Rpb24jZ2V0VmFyaWFiaWxpdHlUeXBlIDxlbT5WYXJpYWJpbGl0eSBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5WYXJpYWJpbGl0eSBUeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlZhcmlhYmlsaXR5VHlwZQotCSAqIEBzZWUgI2lzU2V0VmFyaWFiaWxpdHlUeXBlKCkKLQkgKiBAc2VlICN1bnNldFZhcmlhYmlsaXR5VHlwZSgpCi0JICogQHNlZSAjZ2V0VmFyaWFiaWxpdHlUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRWYXJpYWJpbGl0eVR5cGUoVmFyaWFiaWxpdHlUeXBlIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuU2VjdGlvbiNnZXRWYXJpYWJpbGl0eVR5cGUgPGVtPlZhcmlhYmlsaXR5IFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0VmFyaWFiaWxpdHlUeXBlKCkKLQkgKiBAc2VlICNnZXRWYXJpYWJpbGl0eVR5cGUoKQotCSAqIEBzZWUgI3NldFZhcmlhYmlsaXR5VHlwZShWYXJpYWJpbGl0eVR5cGUpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRWYXJpYWJpbGl0eVR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuU2VjdGlvbiNnZXRWYXJpYWJpbGl0eVR5cGUgPGVtPlZhcmlhYmlsaXR5IFR5cGU8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlZhcmlhYmlsaXR5IFR5cGU8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldFZhcmlhYmlsaXR5VHlwZSgpCi0JICogQHNlZSAjZ2V0VmFyaWFiaWxpdHlUeXBlKCkKLQkgKiBAc2VlICNzZXRWYXJpYWJpbGl0eVR5cGUoVmFyaWFiaWxpdHlUeXBlKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0VmFyaWFiaWxpdHlUeXBlKCk7Ci0KLX0gLy8gU2VjdGlvbgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9TdXBwb3J0aW5nTWF0ZXJpYWwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9TdXBwb3J0aW5nTWF0ZXJpYWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWFiOTQyNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvU3VwcG9ydGluZ01hdGVyaWFsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFN1cHBvcnRpbmdNYXRlcmlhbC5qYXZhLHYgMS4xIDIwMDgvMDEvMTUgMDg6NTI6MDcganRoYW0gRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYTsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5TdXBwb3J0aW5nIE1hdGVyaWFsPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQSBjYXRjaGFsbCBmb3Igb3RoZXIgdHlwZXMgb2YgZ3VpZGFuY2Ugbm90IHNwZWNpZmljYWxseSBkZWZpbmVkIGVsc2V3aGVyZS4gSXQgY2FuIGJlIHJlbGF0ZWQgdG8gYWxsIGtpbmRzIG9mIENvbnRlbnQgRWxlbWVudHMsIGkuZS4gaW5jbHVkaW5nIG90aGVyIGd1aWRhbmNlIGVsZW1lbnRzLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0U3VwcG9ydGluZ01hdGVyaWFsKCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdTdXBwb3J0aW5nTWF0ZXJpYWwnIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBTdXBwb3J0aW5nTWF0ZXJpYWwgZXh0ZW5kcyBHdWlkYW5jZSB7Ci19IC8vIFN1cHBvcnRpbmdNYXRlcmlhbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9UYXNrLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvVGFzay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OGRkZTU5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9UYXNrLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTMgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBUYXNrLmphdmEsdiAxLjIgMjAwOC8wMS8zMCAwMDo0MTo0OCBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+VGFzazwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEEgQ29udGVudCBFbGVtZW50IHRoYXQgZGVzY3JpYmVzIHdvcmsgYmVpbmcgcGVyZm9ybWVkIGJ5IFJvbGVzLiAgSXQgZGVmaW5lcyBvbmUgZGVmYXVsdCBwZXJmb3JtaW5nIFJvbGUgYXMgd2VsbCBhcyBtYW55IGFkZGl0aW9uYWwgcGVyZm9ybWVycy4gIEEgVGFzayBpcyBhc3NvY2lhdGVkIHRvIGlucHV0IGFuZCBvdXRwdXQgd29yayBwcm9kdWN0cy4gIElucHV0cyBhcmUgZGlmZmVyZW50aWF0ZWQgaW4gbWFuZGF0b3J5IHZlcnN1cyBvcHRpb25hbCBpbnB1dHMuICBUaGUgYXNzb2NpYXRpb25zIHRvIFdvcmsgUHJvZHVjdHMgYXJlIG5vdCBpbnN0YW50aWF0YWJsZS92YXJpYWJsZS1saWtlIHBhcmFtZXRlcnMuICBUaGV5IHJhdGhlciBleHByZXNzIChoeXBlci0pbGlua3MgdG8gdGhlIGRlc2NyaXB0aW9ucyBvZiB0aGUgd29yayBwcm9kdWN0cyB0eXBlcyB0aGF0IGFyZSByZWxhdGVkIHRvIHRoZSBUYXNrIGFzIGlucHV0cyBhbmQgb3V0cHV0cy4gIEluIG90aGVyIHdvcmRzLCB0aGVzZSBhc3NvY2lhdGlvbnMgYXJlIG5vdCBpbnRlbmRlZCB0byBiZSB1c2VkIHRvIGNhcHR1cmUgd2hpY2ggY29uY3JldGUgaW5zdGFuY2VzIHdpbGwgYmUgcGFzc2VkIHdoZW4gaW5zdGFudGlhdGluZyB0aGUgbWV0aG9kIGluIGEgcHJvamVjdC4gIEFsbCBvZiB0aGUgVGFzaydzIGRlZmF1bHQgYXNzb2NpYXRpb25zIGNhbiBiZSBvdmVycmlkZGVuIGluIGFuIGFjdHVhbCBwcm9jZXNzIGRlZmluaXRpb24uCi0gKiBBIFRhc2sgZGVzY3JpYmVzIGFuIGFzc2lnbmFibGUgdW5pdCBvZiB3b3JrLiAgRXZlcnkgVGFzayBpcyBhc3NpZ25lZCB0byBzcGVjaWZpYyBSb2xlcy4gIFRoZSBncmFudWxhcml0eSBvZiBhIFRhc2sgaXMgZ2VuZXJhbGx5IGEgZmV3IGhvdXJzIHRvIGEgZmV3IGRheXMuICBJdCB1c3VhbGx5IGFmZmVjdHMgb25lIG9yIG9ubHkgYSBzbWFsbCBudW1iZXIgb2Ygd29yayBwcm9kdWN0cy4gQSBUYXNrIGlzIHVzZWQgYXMgYW4gZWxlbWVudCBvZiBkZWZpbmluZyBhIHByb2Nlc3MuIFRhc2tzIGFyZSBmdXJ0aGVyIHVzZWQgZm9yIHBsYW5uaW5nIGFuZCB0cmFja2luZyBwcm9ncmVzczsgdGhlcmVmb3JlLCBpZiB0aGV5IGFyZSBkZWZpbmVkIHRvbyBmaW5lLWdyYWluZWQsIHRoZXkgd2lsbCBiZSBuZWdsZWN0ZWQsIGFuZCBpZiB0aGV5IGFyZSB0b28gbGFyZ2UsIHByb2dyZXNzIHdvdWxkIGhhdmUgdG8gYmUgZXhwcmVzc2VkIGluIHRlcm1zIG9mIGEgVGFzaydzIHBhcnRzIChlLmcuIFN0ZXBzLCB3aGljaCBpcyBub3QgcmVjb21tZW5kZWQpLiAKLSAqIEEgVGFzayBoYXMgYSBjbGVhciBwdXJwb3NlIGluIHdoaWNoIHRoZSBwZXJmb3JtaW5nIHJvbGVzIGFjaGlldmUgYSB3ZWxsIGRlZmluZWQgZ29hbC4gIEl0IHByb3ZpZGVzIGNvbXBsZXRlIHN0ZXAtYnktc3RlcCBleHBsYW5hdGlvbnMgb2YgZG9pbmcgYWxsIHRoZSB3b3JrIHRoYXQgbmVlZHMgdG8gYmUgZG9uZSB0byBhY2hpZXZlIHRoaXMgZ29hbC4gIFRoaXMgZGVzY3JpcHRpb24gaXMgY29tcGxldGUsIGluZGVwZW5kZW50IG9mIHdoZW4gaW4gYSBwcm9jZXNzIGxpZmVjeWNsZSB0aGUgd29yayB3b3VsZCBhY3R1YWxseSBiZSBkb25lLiAgSXQgdGhlcmVmb3JlIGRvZXMgbm90IGRlc2NyaWJlIHdoZW4geW91IGRvIHdoYXQgd29yayBhdCB3aGF0IHBvaW50IG9mIHRpbWUsIGJ1dCBkZXNjcmliZXMgYWxsIHRoZSB3b3JrIHRoYXQgZ2V0cyBkb25lIHRocm91Z2hvdXQgdGhlIGRldmVsb3BtZW50IGxpZmVjeWNsZSB0aGF0IGNvbnRyaWJ1dGVzIHRvIHRoZSBhY2hpZXZlbWVudCBvZiB0aGlzIGdvYWwuICBXaGVuIHRoZSBUYXNrIGlzIGJlaW5nIGFwcGxpZWQgaW4gYSBwcm9jZXNzIHRoZW4gdGhpcyBwcm9jZXNzIGFwcGxpY2F0aW9uIChkZWZpbmVkIGFzIFRhc2sgRGVzY3JpcHRvcikgcHJvdmlkZXMgdGhlIGluZm9ybWF0aW9uIG9mIHdoaWNoIHBpZWNlcyBvZiB0aGUgVGFzayB3aWxsIGFjdHVhbGx5IGJlIHBlcmZvcm1lZCBhdCBhbnkgcGFydGljdWxhciBwb2ludCBpbiB0aW1lLiBUaGlzIGFzc3VtZXMgdGhhdCB0aGUgVGFzayB3aWxsIGJlIHBlcmZvcm1lZCBpbiB0aGUgcHJvY2VzcyBvdmVyIGFuZCBvdmVyIGFnYWluLCBidXQgZWFjaCB0aW1lIHdpdGggYSBzbGlnaHRseSBkaWZmZXJlbnQgZW1waGFzaXMgb24gZGlmZmVyZW50IHN0ZXBzIG9yIGFzcGVjdHMgb2YgdGhlIHRhc2sgZGVzY3JpcHRpb24uIAotICogRm9yIGV4YW1wbGUsIGEgVGFzayBzdWNoIGFzICJEZXZlbG9wIFVzZSBDYXNlIE1vZGVsIiBkZXNjcmliZXMgYWxsIHRoZSB3b3JrIHRoYXQgbmVlZHMgdG8gYmUgZG9uZSB0byBkZXZlbG9wIGEgY29tcGxldGUgdXNlIGNhc2UgbW9kZWwuIFRoaXMgd291bGQgY29tcHJpc2Ugb2YgdGhlIGlkZW50aWZpY2F0aW9uIGFuZCBuYW1pbmcgb2YgdXNlIGNhc2VzIGFuZCBhY3RvcnMsIHRoZSB3cml0aW5nIG9mIGEgYnJpZWYgZGVzY3JpcHRpb24sIHRoZSBtb2RlbGluZyBvZiB1c2UgY2FzZXMgYW5kIHRoZWlyIHJlbGF0aW9uc2hpcHMgaW4gZGlhZ3JhbXMsIHRoZSBkZXRhaWxlZCBkZXNjcmlwdGlvbiBvZiBhIGJhc2ljIGZsb3csIHRoZSBkZXRhaWxlZCBkZXNjcmlwdGlvbiBvZiBhbHRlcm5hdGl2ZXMgZmxvd3MsIHBlcmZvcm1pbmcgb2Ygd2Fsa3Rocm91Z2hzIHdvcmtzaG9wcyBhbmQgcmV2aWV3cywgZXRjLiAgQWxsIG9mIHRoZXNlIHBhcnRzIGNvbnRyaWJ1dGUgdG8gdGhlIGRldmVsb3BtZW50IGdvYWwgb2YgZGV2ZWxvcGluZyB0aGUgdXNlIGNhc2UgbW9kZWwsIGJ1dCB0aGUgcGFydHMgd2lsbCBiZSBwZXJmb3JtZWQgYXQgZGlmZmVyZW50IHBvaW50cyBpbiB0aW1lIGluIGEgcHJvY2Vzcy4gIElkZW50aWZpY2F0aW9uLCBuYW1pbmcsIGFuZCBicmllZiBkZXNjcmlwdGlvbnMgd291bGQgYmUgcGVyZm9ybWVkIGVhcmx5IGluIGEgdHlwaWNhbCBkZXZlbG9wbWVudCBwcm9jZXNzIHZlcnN1cyB0aGUgd3JpdGluZyBvZiBkZXRhaWxlZCBhbHRlcm5hdGl2ZSBmbG93cyB3aGljaCB3b3VsZCBiZSBwZXJmb3JtZWQgbXVjaCBsYXRlci4gIEFsbCB0aGVzZSBwYXJ0cyBvciBzdGVwcyB3aXRoaW4gdGhlIHNhbWUgVGFzayBkZWZpbmUgdGhlICJtZXRob2QiIG9mIERldmVsb3BpbmcgYSBVc2UgQ2FzZSBNb2RlbC4gIEFwcGx5aW5nIHN1Y2ggYSBtZXRob2QgaW4gYSBsaWZlY3ljbGUgKGkuZS4gaW4gYSBwcm9jZXNzKSBpcyBkZWZpbmluZyB3aGljaCBzdGVwcyBhcmUgZG9uZSB3aGVuIGdvaW5nIGZyb20gb25lIGl0ZXJhdGlvbiB0byB0aGUgbmV4dC4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UYXNrI2dldFByZWNvbmRpdGlvbiA8ZW0+UHJlY29uZGl0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UYXNrI2dldFBvc3Rjb25kaXRpb24gPGVtPlBvc3Rjb25kaXRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRhc2sjZ2V0UGVyZm9ybWVkQnkgPGVtPlBlcmZvcm1lZCBCeTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFzayNnZXRHcm91cDIgPGVtPkdyb3VwMjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFzayNnZXRNYW5kYXRvcnlJbnB1dCA8ZW0+TWFuZGF0b3J5IElucHV0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UYXNrI2dldE91dHB1dCA8ZW0+T3V0cHV0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UYXNrI2dldEFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5IDxlbT5BZGRpdGlvbmFsbHkgUGVyZm9ybWVkIEJ5PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UYXNrI2dldE9wdGlvbmFsSW5wdXQgPGVtPk9wdGlvbmFsIElucHV0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UYXNrI2dldEVzdGltYXRlIDxlbT5Fc3RpbWF0ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFzayNnZXRFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMgPGVtPkVzdGltYXRpb24gQ29uc2lkZXJhdGlvbnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRhc2sjZ2V0VG9vbE1lbnRvciA8ZW0+VG9vbCBNZW50b3I8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0VGFzaygpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nVGFzaycga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFRhc2sgZXh0ZW5kcyBDb250ZW50RWxlbWVudCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UHJlY29uZGl0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5QcmVjb25kaXRpb248L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UHJlY29uZGl0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRQcmVjb25kaXRpb24oU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRUYXNrX1ByZWNvbmRpdGlvbigpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdQcmVjb25kaXRpb24nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0UHJlY29uZGl0aW9uKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UYXNrI2dldFByZWNvbmRpdGlvbiA8ZW0+UHJlY29uZGl0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5QcmVjb25kaXRpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFByZWNvbmRpdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UHJlY29uZGl0aW9uKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Qb3N0Y29uZGl0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Qb3N0Y29uZGl0aW9uPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlBvc3Rjb25kaXRpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFBvc3Rjb25kaXRpb24oU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRUYXNrX1Bvc3Rjb25kaXRpb24oKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nUG9zdGNvbmRpdGlvbiciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRQb3N0Y29uZGl0aW9uKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UYXNrI2dldFBvc3Rjb25kaXRpb24gPGVtPlBvc3Rjb25kaXRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlBvc3Rjb25kaXRpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFBvc3Rjb25kaXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFBvc3Rjb25kaXRpb24oU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlBlcmZvcm1lZCBCeTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UGVyZm9ybWVkIEJ5PC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlBlcmZvcm1lZCBCeTwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0VGFza19QZXJmb3JtZWRCeSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdQZXJmb3JtZWRCeSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0PFN0cmluZz4gZ2V0UGVyZm9ybWVkQnkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkdyb3VwMjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXAuRW50cnl9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+R3JvdXAyPC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+R3JvdXAyPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRUYXNrX0dyb3VwMigpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUZlYXR1cmVNYXBFbnRyeSIgbWFueT0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZ3JvdXAnIG5hbWU9J2dyb3VwOjI3JyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRmVhdHVyZU1hcCBnZXRHcm91cDIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1hbmRhdG9yeSBJbnB1dDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TWFuZGF0b3J5IElucHV0PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TWFuZGF0b3J5IElucHV0PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRUYXNrX01hbmRhdG9yeUlucHV0KCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciIHRyYW5zaWVudD0idHJ1ZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J01hbmRhdG9yeUlucHV0JyBncm91cD0nI2dyb3VwOjI3JyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3Q8U3RyaW5nPiBnZXRNYW5kYXRvcnlJbnB1dCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+T3V0cHV0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5PdXRwdXQ8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5PdXRwdXQ8L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFRhc2tfT3V0cHV0KCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciIHRyYW5zaWVudD0idHJ1ZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J091dHB1dCcgZ3JvdXA9JyNncm91cDoyNyciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0PFN0cmluZz4gZ2V0T3V0cHV0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BZGRpdGlvbmFsbHkgUGVyZm9ybWVkIEJ5PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5BZGRpdGlvbmFsbHkgUGVyZm9ybWVkIEJ5PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QWRkaXRpb25hbGx5IFBlcmZvcm1lZCBCeTwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0VGFza19BZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIiB0cmFuc2llbnQ9InRydWUiIHZvbGF0aWxlPSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdBZGRpdGlvbmFsbHlQZXJmb3JtZWRCeScgZ3JvdXA9JyNncm91cDoyNyciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0PFN0cmluZz4gZ2V0QWRkaXRpb25hbGx5UGVyZm9ybWVkQnkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk9wdGlvbmFsIElucHV0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5PcHRpb25hbCBJbnB1dDwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk9wdGlvbmFsIElucHV0PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRUYXNrX09wdGlvbmFsSW5wdXQoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nT3B0aW9uYWxJbnB1dCcgZ3JvdXA9JyNncm91cDoyNyciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0PFN0cmluZz4gZ2V0T3B0aW9uYWxJbnB1dCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RXN0aW1hdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkVzdGltYXRlPC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RXN0aW1hdGU8L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFRhc2tfRXN0aW1hdGUoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nRXN0aW1hdGUnIGdyb3VwPScjZ3JvdXA6MjcnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdDxTdHJpbmc+IGdldEVzdGltYXRlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Fc3RpbWF0aW9uIENvbnNpZGVyYXRpb25zPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Fc3RpbWF0aW9uIENvbnNpZGVyYXRpb25zPC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RXN0aW1hdGlvbiBDb25zaWRlcmF0aW9uczwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0VGFza19Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zJyBncm91cD0nI2dyb3VwOjI3JyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3Q8U3RyaW5nPiBnZXRFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlRvb2wgTWVudG9yPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Ub29sIE1lbnRvcjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlRvb2wgTWVudG9yPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRUYXNrX1Rvb2xNZW50b3IoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nVG9vbE1lbnRvcicgZ3JvdXA9JyNncm91cDoyNyciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0PFN0cmluZz4gZ2V0VG9vbE1lbnRvcigpOwotCi19IC8vIFRhc2sKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvVGFza0Rlc2NyaXB0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvVGFza0Rlc2NyaXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwNGMyMGMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1Rhc2tEZXNjcmlwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBUYXNrRGVzY3JpcHRpb24uamF2YSx2IDEuMiAyMDA4LzAxLzMwIDAwOjQxOjQ4IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYTsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5UYXNrIERlc2NyaXB0aW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQSBnZW5lcmFsaXplZCBDb250ZW50IERlc2NyaXB0aW9uIHRoYXQgaXMgdXNlZCB0byBzdG9yZSB0aGUgdGV4dHVhbCBkZXNjcmlwdGlvbiBmb3IgYSBUYXNrLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRhc2tEZXNjcmlwdGlvbiNnZXRBbHRlcm5hdGl2ZXMgPGVtPkFsdGVybmF0aXZlczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFza0Rlc2NyaXB0aW9uI2dldFB1cnBvc2UgPGVtPlB1cnBvc2U8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0VGFza0Rlc2NyaXB0aW9uKCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdUYXNrRGVzY3JpcHRpb24nIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBUYXNrRGVzY3JpcHRpb24gZXh0ZW5kcyBDb250ZW50RGVzY3JpcHRpb24gewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkFsdGVybmF0aXZlczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogQ29tcHJpc2VzIG9mIHN1bW1hcmllcyBkZXNjcmliaW5nIGltcG9ydGFudCBleGNlcHRpb25hbCBhbmQgbm9uLXN0YW5kYXJkIHdheXMgb2YgYWNoaWV2aW5nIHRoaXMgVGFzaydzIGRldmVsb3BtZW50IGdvYWxzIHRoYXQgd2VyZSBub3QgY292ZXJlZCBieSB0aGUgVGFzaydzIFN0ZXBzLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BbHRlcm5hdGl2ZXM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEFsdGVybmF0aXZlcyhTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFRhc2tEZXNjcmlwdGlvbl9BbHRlcm5hdGl2ZXMoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQWx0ZXJuYXRpdmVzJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldEFsdGVybmF0aXZlcygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFza0Rlc2NyaXB0aW9uI2dldEFsdGVybmF0aXZlcyA8ZW0+QWx0ZXJuYXRpdmVzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BbHRlcm5hdGl2ZXM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEFsdGVybmF0aXZlcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0QWx0ZXJuYXRpdmVzKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QdXJwb3NlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBTdW1tYXJpemVzIHRoZSBtYWluIHJlYXNvbiBmb3IgcGVyZm9ybWluZyB0aGlzIFRhc2sgYW5kIHdoYXQgaXMgaW50ZW5kZWQgdG8gYmUgYWNoaWV2ZWQuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlB1cnBvc2U8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFB1cnBvc2UoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRUYXNrRGVzY3JpcHRpb25fUHVycG9zZSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdQdXJwb3NlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFB1cnBvc2UoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRhc2tEZXNjcmlwdGlvbiNnZXRQdXJwb3NlIDxlbT5QdXJwb3NlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5QdXJwb3NlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRQdXJwb3NlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRQdXJwb3NlKFN0cmluZyB2YWx1ZSk7Ci0KLX0gLy8gVGFza0Rlc2NyaXB0aW9uClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1Rhc2tEZXNjcmlwdG9yLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvVGFza0Rlc2NyaXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDljY2RkNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvVGFza0Rlc2NyaXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4OSArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFRhc2tEZXNjcmlwdG9yLmphdmEsdiAxLjIgMjAwOC8wMS8zMCAwMDo0MTo0NyBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+VGFzayBEZXNjcmlwdG9yPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQSBzcGVjaWFsIERlc2NyaXB0b3IgdGhhdCByZXByZXNlbnRzIGEgcHJveHkgZm9yIGEgVGFzayBpbiB0aGUgY29udGV4dCBvZiBvbmUgc3BlY2lmaWMgQWN0aXZpdHkuICBFdmVyeSBicmVha2Rvd24gc3RydWN0dXJlIGNhbiBkZWZpbmUgZGlmZmVyZW50IHJlbGF0aW9uc2hpcHMgb2YgVGFzayBEZXNjcmlwdG9ycyB0byBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvcnMgYW5kIFJvbGUgRGVzY3JpcHRvcnMuIFRoZXJlZm9yZSBvbmUgVGFzayBjYW4gYmUgcmVwcmVzZW50ZWQgYnkgbWFueSBUYXNrIERlc2NyaXB0b3JzIGVhY2ggd2l0aGluIHRoZSBjb250ZXh0IG9mIGFuIEFjdGl2aXR5IHdpdGggaXRzIG93biBzZXQgb2YgcmVsYXRpb25zaGlwcy4KLSAqIEEga2V5IGRpZmZlcmVuY2UgYmV0d2VlbiBNZXRob2QgQ29udGVudCBhbmQgUHJvY2VzcyBpcyB0aGF0IGEgQ29udGVudCBFbGVtZW50IHN1Y2ggYXMgVGFzayBkZXNjcmliZXMgYWxsIGFzcGVjdHMgb2YgZG9pbmcgd29yayBkZWZpbmVkIGFyb3VuZCB0aGlzIFRhc2suICBUaGlzIGRlc2NyaXB0aW9uIGlzIG1hbmFnZWQgaW4gc3RlcHMsIHdoaWNoIGFyZSBtb2RlbGVkIGFzIFNlY3Rpb25zIG9mIHRoZSBUYXNrcycgQ29udGVudCBEZXNjcmlwdGlvbnMuICBXaGVuIGFwcGx5aW5nIGEgVGFzayBpbiBhIFByb2Nlc3MnIEFjdGl2aXR5IHdpdGggYSBUYXNrIERlc2NyaXB0b3IgYSBQcm9jZXNzIEVuZ2luZWVyIG5lZWRzIHRvIGluZGljYXRlIHRoYXQgYXQgdGhhdCBwYXJ0aWN1bGFyIHBvaW50IGluIHRpbWUgaW4gdGhlIFByb2Nlc3MgZGVmaW5pdGlvbiBmb3Igd2hpY2ggdGhlIFRhc2sgRGVzY3JpcHRvciBoYXMgYmVlbiBjcmVhdGVkLCBvbmx5IGEgc3Vic2V0IG9mIHN0ZXBzIHNoYWxsIGJlIHBlcmZvcm1lZC4gIEhlIGRlZmluZXMgdGhpcyBzZWxlY3Rpb24gdXNpbmcgdGhlIHNlbGVjdGVkU3RlcHMgYXNzb2NpYXRpb24uICBJZiBoZSB3YW50cyB0byBhZGQgc3RlcHMgdG8gYSBUYXNrIERlc2NyaXB0b3IsIGhlIGNhbiBkZXNjcmliZSB0aGVzZSBlaXRoZXIgcHJhZ21hdGljYWxseSBpbiB0aGUgcmVmaW5lZERlc2NyaXB0aW9uIGF0dHJpYnV0ZSBvciAncHJvcGVybHknIGNyZWF0ZSBhIGNvbnRyaWJ1dGluZyBUYXNrIHRvIHRoZSBUYXNrIHRoZSBUYXNrIERlc2NyaXB0b3IgcmVmZXJzIHRvLgotICogCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFza0Rlc2NyaXB0b3IjZ2V0VGFzayA8ZW0+VGFzazwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFza0Rlc2NyaXB0b3IjZ2V0UGVyZm9ybWVkUHJpbWFyaWx5QnkgPGVtPlBlcmZvcm1lZCBQcmltYXJpbHkgQnk8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRhc2tEZXNjcmlwdG9yI2dldEdyb3VwMyA8ZW0+R3JvdXAzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UYXNrRGVzY3JpcHRvciNnZXRBZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSA8ZW0+QWRkaXRpb25hbGx5IFBlcmZvcm1lZCBCeTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFza0Rlc2NyaXB0b3IjZ2V0QXNzaXN0ZWRCeSA8ZW0+QXNzaXN0ZWQgQnk8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRhc2tEZXNjcmlwdG9yI2dldEV4dGVybmFsSW5wdXQgPGVtPkV4dGVybmFsIElucHV0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UYXNrRGVzY3JpcHRvciNnZXRNYW5kYXRvcnlJbnB1dCA8ZW0+TWFuZGF0b3J5IElucHV0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UYXNrRGVzY3JpcHRvciNnZXRPcHRpb25hbElucHV0IDxlbT5PcHRpb25hbCBJbnB1dDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFza0Rlc2NyaXB0b3IjZ2V0T3V0cHV0IDxlbT5PdXRwdXQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRhc2tEZXNjcmlwdG9yI2dldFN0ZXAgPGVtPlN0ZXA8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRhc2tEZXNjcmlwdG9yI2lzSXNTeW5jaHJvbml6ZWRXaXRoU291cmNlIDxlbT5JcyBTeW5jaHJvbml6ZWQgV2l0aCBTb3VyY2U8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0VGFza0Rlc2NyaXB0b3IoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J1Rhc2tEZXNjcmlwdG9yJyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgVGFza0Rlc2NyaXB0b3IgZXh0ZW5kcyBXb3JrQnJlYWtkb3duRWxlbWVudCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VGFzazwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VGFzazwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5UYXNrPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRUYXNrKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0VGFza0Rlc2NyaXB0b3JfVGFzaygpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdUYXNrJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFRhc2soKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRhc2tEZXNjcmlwdG9yI2dldFRhc2sgPGVtPlRhc2s8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlRhc2s8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFRhc2soU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlBlcmZvcm1lZCBQcmltYXJpbHkgQnk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlBlcmZvcm1lZCBQcmltYXJpbHkgQnk8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UGVyZm9ybWVkIFByaW1hcmlseSBCeTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UGVyZm9ybWVkUHJpbWFyaWx5QnkoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRUYXNrRGVzY3JpcHRvcl9QZXJmb3JtZWRQcmltYXJpbHlCeSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdQZXJmb3JtZWRQcmltYXJpbHlCeSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRQZXJmb3JtZWRQcmltYXJpbHlCeSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFza0Rlc2NyaXB0b3IjZ2V0UGVyZm9ybWVkUHJpbWFyaWx5QnkgPGVtPlBlcmZvcm1lZCBQcmltYXJpbHkgQnk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlBlcmZvcm1lZCBQcmltYXJpbHkgQnk8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFBlcmZvcm1lZFByaW1hcmlseUJ5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRQZXJmb3JtZWRQcmltYXJpbHlCeShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+R3JvdXAzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcC5FbnRyeX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Hcm91cDM8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Hcm91cDM8L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFRhc2tEZXNjcmlwdG9yX0dyb3VwMygpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUZlYXR1cmVNYXBFbnRyeSIgbWFueT0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZ3JvdXAnIG5hbWU9J2dyb3VwOjM3JyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRmVhdHVyZU1hcCBnZXRHcm91cDMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkFkZGl0aW9uYWxseSBQZXJmb3JtZWQgQnk8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkFkZGl0aW9uYWxseSBQZXJmb3JtZWQgQnk8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BZGRpdGlvbmFsbHkgUGVyZm9ybWVkIEJ5PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRUYXNrRGVzY3JpcHRvcl9BZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIiB0cmFuc2llbnQ9InRydWUiIHZvbGF0aWxlPSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdBZGRpdGlvbmFsbHlQZXJmb3JtZWRCeScgZ3JvdXA9JyNncm91cDozNyciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0PFN0cmluZz4gZ2V0QWRkaXRpb25hbGx5UGVyZm9ybWVkQnkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkFzc2lzdGVkIEJ5PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Bc3Npc3RlZCBCeTwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkFzc2lzdGVkIEJ5PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRUYXNrRGVzY3JpcHRvcl9Bc3Npc3RlZEJ5KCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciIHRyYW5zaWVudD0idHJ1ZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0Fzc2lzdGVkQnknIGdyb3VwPScjZ3JvdXA6MzcnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdDxTdHJpbmc+IGdldEFzc2lzdGVkQnkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkV4dGVybmFsIElucHV0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5FeHRlcm5hbCBJbnB1dDwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkV4dGVybmFsIElucHV0PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRUYXNrRGVzY3JpcHRvcl9FeHRlcm5hbElucHV0KCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciIHRyYW5zaWVudD0idHJ1ZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0V4dGVybmFsSW5wdXQnIGdyb3VwPScjZ3JvdXA6MzcnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdDxTdHJpbmc+IGdldEV4dGVybmFsSW5wdXQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1hbmRhdG9yeSBJbnB1dDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TWFuZGF0b3J5IElucHV0PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TWFuZGF0b3J5IElucHV0PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRUYXNrRGVzY3JpcHRvcl9NYW5kYXRvcnlJbnB1dCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIiB0cmFuc2llbnQ9InRydWUiIHZvbGF0aWxlPSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdNYW5kYXRvcnlJbnB1dCcgZ3JvdXA9JyNncm91cDozNyciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0PFN0cmluZz4gZ2V0TWFuZGF0b3J5SW5wdXQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk9wdGlvbmFsIElucHV0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5PcHRpb25hbCBJbnB1dDwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk9wdGlvbmFsIElucHV0PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRUYXNrRGVzY3JpcHRvcl9PcHRpb25hbElucHV0KCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciIHRyYW5zaWVudD0idHJ1ZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J09wdGlvbmFsSW5wdXQnIGdyb3VwPScjZ3JvdXA6MzcnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdDxTdHJpbmc+IGdldE9wdGlvbmFsSW5wdXQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk91dHB1dDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+T3V0cHV0PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+T3V0cHV0PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRUYXNrRGVzY3JpcHRvcl9PdXRwdXQoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nT3V0cHV0JyBncm91cD0nI2dyb3VwOjM3JyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3Q8U3RyaW5nPiBnZXRPdXRwdXQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlN0ZXA8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5TZWN0aW9ufS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlN0ZXA8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TdGVwPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRUYXNrRGVzY3JpcHRvcl9TdGVwKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1N0ZXAnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdDxTZWN0aW9uPiBnZXRTdGVwKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JcyBTeW5jaHJvbml6ZWQgV2l0aCBTb3VyY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPklzIFN5bmNocm9uaXplZCBXaXRoIFNvdXJjZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JcyBTeW5jaHJvbml6ZWQgV2l0aCBTb3VyY2U8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0SXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKCkKLQkgKiBAc2VlICN1bnNldElzU3luY2hyb25pemVkV2l0aFNvdXJjZSgpCi0JICogQHNlZSAjc2V0SXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKGJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFRhc2tEZXNjcmlwdG9yX0lzU3luY2hyb25pemVkV2l0aFNvdXJjZSgpCi0JICogQG1vZGVsIHVuc2V0dGFibGU9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbiIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nYXR0cmlidXRlJyBuYW1lPSdpc1N5bmNocm9uaXplZFdpdGhTb3VyY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzSXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UYXNrRGVzY3JpcHRvciNpc0lzU3luY2hyb25pemVkV2l0aFNvdXJjZSA8ZW0+SXMgU3luY2hyb25pemVkIFdpdGggU291cmNlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5JcyBTeW5jaHJvbml6ZWQgV2l0aCBTb3VyY2U8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0SXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKCkKLQkgKiBAc2VlICN1bnNldElzU3luY2hyb25pemVkV2l0aFNvdXJjZSgpCi0JICogQHNlZSAjaXNJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldElzU3luY2hyb25pemVkV2l0aFNvdXJjZShib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFza0Rlc2NyaXB0b3IjaXNJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UgPGVtPklzIFN5bmNocm9uaXplZCBXaXRoIFNvdXJjZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UoKQotCSAqIEBzZWUgI2lzSXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKCkKLQkgKiBAc2VlICNzZXRJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldElzU3luY2hyb25pemVkV2l0aFNvdXJjZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UYXNrRGVzY3JpcHRvciNpc0lzU3luY2hyb25pemVkV2l0aFNvdXJjZSA8ZW0+SXMgU3luY2hyb25pemVkIFdpdGggU291cmNlPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JcyBTeW5jaHJvbml6ZWQgV2l0aCBTb3VyY2U8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldElzU3luY2hyb25pemVkV2l0aFNvdXJjZSgpCi0JICogQHNlZSAjaXNJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UoKQotCSAqIEBzZWUgI3NldElzU3luY2hyb25pemVkV2l0aFNvdXJjZShib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0SXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKCk7Ci0KLX0gLy8gVGFza0Rlc2NyaXB0b3IKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvVGVhbVByb2ZpbGUuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9UZWFtUHJvZmlsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NGUyNzU1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9UZWFtUHJvZmlsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA2ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogVGVhbVByb2ZpbGUuamF2YSx2IDEuMiAyMDA4LzAxLzMwIDAwOjQxOjQ4IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5UZWFtIFByb2ZpbGU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIEJyZWFrZG93biBFbGVtZW50IHRoYXQgZ3JvdXBzIFJvbGUgRGVzY3JpcHRvcnMgb3IgUmVzb3VyY2UgRGVmaW5pdGlvbnMgZGVmaW5pbmcgYSBuZXN0ZWQgaGllcmFyY2h5IG9mIHRlYW1zIGFuZCB0ZWFtIG1lbWJlcnMuCi0gKiBXb3JrIGFzc2lnbm1lbnRzIGFuZCBXb3JrIFByb2R1Y3QgcmVzcG9uc2liaWxpdGllcyBjYW4gYmUgZGlmZmVyZW50IGZyb20gQWN0aXZpdHkgdG8gQWN0aXZpdHkgaW4gYSBkZXZlbG9wbWVudCBwcm9qZWN0LiBEaWZmZXJlbnQgcGhhc2VzIHJlcXVpcmUgZGlmZmVyZW50IHN0YWZmaW5nIHByb2ZpbGVzLCBpLmUuIGRpZmZlcmVudCBza2lsbHMgYW5kIHJlc291cmNlcyBkb2luZyBkaWZmZXJlbnQgdHlwZXMgb2Ygd29yay4gIFRoZXJlZm9yZSwgYSBwcm9jZXNzIG5lZWRzIHRvIGRlZmluZSBzdWNoIGRpZmZlcmVudCBwcm9maWxlcyBpbiBhIGZsZXhpYmxlIG1hbm5lci4gIFdoZXJlYXMgQ29yZSBNZXRob2QgQ29udGVudCBkZWZpbmVzIHN0YW5kYXJkIHJlc3BvbnNpYmlsaXRpZXMgYW5kIGFzc2lnbm1lbnRzLCBhIHByb2Nlc3MgZXhwcmVzcyBieSBhIGJyZWFrZG93biBzdHJ1Y3R1cmVzIG5lZWRzIHRvIGJlIGFibGUgcmVmaW5lIGFuZCByZWRlZmluZSB0aGVzZSB0aHJvdWdob3V0IGl0cyBkZWZpbml0aW9uLiAgUm9sZSBEZXNjcmlwdG9ycywgUmVzb3VyY2UgRGVmaW5pdGlvbnMsIGFzIHdlbGwgYXMgVGVhbSBQcm9maWxlcyBwcm92aWRlIHRoZSBkYXRhIHN0cnVjdHVyZSBuZWNlc3NhcnkgdG8gYWNoaWV2ZSB0aGlzIGZsZXhpYmlsaXR5IGFuZCB0byBwcm92aWRlIGEgcHJvY2VzcyB1c2VyIHdpdGggdGhlIGNhcGFiaWxpdHkgdG8gZGVmaW5lIGRpZmZlcmVudCB0ZWFtcyBhbmQgcm9sZSByZWxhdGlvbnNoaXBzIGZvciBldmVyeSBBY3Rpdml0eSAoaW5jbHVkaW5nIEFjdGl2aXRpZXMgb24gYW55IG5lc3RpbmctbGV2ZWwgYXMgd2VsbCBhcyBJdGVyYXRpb25zIG9yIFBoYXNlcykuCi0gKiBIZW5jZSwgaW4gYWRkaXRpb24gdG8gdGhlIHdvcmsgYnJlYWtkb3duIGFuZCB3b3JrIHByb2R1Y3QgYnJlYWtkb3duIHN0cnVjdHVyZXMgZGVmaW5lZCBzbyBmYXIsIFRlYW0gUHJvZmlsZXMgYXJlIHVzZWQgdG8gZGVmaW5lIGEgdGhpcmQgdHlwZSBvZiBicmVha2Rvd24gc3RydWN0dXJlOiB0ZWFtIGJyZWFrZG93biBzdHJ1Y3R1cmVzLiAgVGhlc2UgYXJlIGNyZWF0ZWQgYXMgYW4gQWN0aXZpdHkgc3BlY2lmaWMgaGllcmFyY2h5IG9mIFRlYW0gUHJvZmlsZXMgY29tcHJpc2luZyBvZiBSb2xlIERlc2NyaXB0b3JzIGFuZCBSZXNvdXJjZSBEZWZpbml0aW9ucy4gIFRoZXNlIHN0cnVjdHVyZXMgY2FuIGJlIHByZXNlbnRlZCBhcyB3ZWxsLWtub3duIE9yZy1DaGFydHMuICBKdXN0IGFzIHdpdGggYW55IG90aGVyIEJyZWFrZG93biBFbGVtZW50IGFuZCBEZXNjcmlwdG9ycywgVGVhbSBQcm9maWxlcyBjYW4gYmUgZGVmaW5lZCB3aXRoaW4gdGhlIHNjb3BlIG9mIGFueSBBY3Rpdml0eSBpbiBhIGJyZWFrZG93biBzdHJ1Y3R1cmUuICBJbiBvdGhlciB3b3JkcyBldmVyeSBBY3Rpdml0eSBjYW4gZGVmaW5lIGl0cyBvd24gVGVhbSBQcm9maWxlcyBjb25zaXN0aW5nIG9mIEFjdGl2aXR5IHNwZWNpZmljIFJvbGUgRGVzY3JpcHRvcnMgYW5kIFJlc291cmNlIERlZmluaXRpb25zLiAgVHlwaWNhbGx5LCBUZWFtIFByb2ZpbGVzIGFyZSBkZWZpbmVkIG9uIHRoZSBsZXZlbCBvZiBJdGVyYXRpb25zIG9yIFBoYXNlcyBvciBvdGhlciBoaWdoZXItbGV2ZWwgQWN0aXZpdHkuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGVhbVByb2ZpbGUjZ2V0R3JvdXAyIDxlbT5Hcm91cDI8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRlYW1Qcm9maWxlI2dldFJvbGUgPGVtPlJvbGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRlYW1Qcm9maWxlI2dldFN1cGVyVGVhbSA8ZW0+U3VwZXIgVGVhbTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGVhbVByb2ZpbGUjZ2V0U3ViVGVhbSA8ZW0+U3ViIFRlYW08L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0VGVhbVByb2ZpbGUoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J1RlYW1Qcm9maWxlJyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgVGVhbVByb2ZpbGUgZXh0ZW5kcyBCcmVha2Rvd25FbGVtZW50IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Hcm91cDI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwLkVudHJ5fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkdyb3VwMjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkdyb3VwMjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0VGVhbVByb2ZpbGVfR3JvdXAyKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRmVhdHVyZU1hcEVudHJ5IiBtYW55PSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdncm91cCcgbmFtZT0nZ3JvdXA6MzAnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlGZWF0dXJlTWFwIGdldEdyb3VwMigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Um9sZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Um9sZTwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJvbGU8L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFRlYW1Qcm9maWxlX1JvbGUoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nUm9sZScgZ3JvdXA9JyNncm91cDozMCciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0PFN0cmluZz4gZ2V0Um9sZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U3VwZXIgVGVhbTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U3VwZXIgVGVhbTwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlN1cGVyIFRlYW08L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFRlYW1Qcm9maWxlX1N1cGVyVGVhbSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIiB0cmFuc2llbnQ9InRydWUiIHZvbGF0aWxlPSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdTdXBlclRlYW0nIGdyb3VwPScjZ3JvdXA6MzAnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdDxTdHJpbmc+IGdldFN1cGVyVGVhbSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U3ViIFRlYW08L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlN1YiBUZWFtPC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U3ViIFRlYW08L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFRlYW1Qcm9maWxlX1N1YlRlYW0oKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nU3ViVGVhbScgZ3JvdXA9JyNncm91cDozMCciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0PFN0cmluZz4gZ2V0U3ViVGVhbSgpOwotCi19IC8vIFRlYW1Qcm9maWxlClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1RlbXBsYXRlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvVGVtcGxhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmNjZGFhYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvVGVtcGxhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogVGVtcGxhdGUuamF2YSx2IDEuMSAyMDA4LzAxLzE1IDA4OjUyOjA3IGp0aGFtIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWE7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+VGVtcGxhdGU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIHNwZWNpZmljIHR5cGUgb2YgZ3VpZGFuY2UgdGhhdCBwcm92aWRlcyBmb3IgYSB3b3JrIHByb2R1Y3QgYSBwcmUtZGVmaW5lZCB0YWJsZSBvZiBjb250ZW50cywgc2VjdGlvbnMsIHBhY2thZ2VzLCBhbmQvb3IgaGVhZGluZ3MsIGEgc3RhbmRhcmRpemVkIGZvcm1hdCwgYXMgd2VsbCBhcyBkZXNjcmlwdGlvbnMgaG93IHRoZSBzZWN0aW9ucyBhbmQgcGFja2FnZXMgYXJlIHN1cHBvc2VkIHRvIGJlIHVzZWQgYW5kIGNvbXBsZXRlZC4gVGVtcGxhdGVzIGNhbm5vdCBvbmx5IGJlIHByb3ZpZGVkIGZvciBkb2N1bWVudHMsIGJ1dCBhbHNvIGZvciBjb25jZXB0dWFsIG1vZGVscyBvciBwaHlzaWNhbCBkYXRhIHN0b3Jlcy4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFRlbXBsYXRlKCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdUZW1wbGF0ZScga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFRlbXBsYXRlIGV4dGVuZHMgR3VpZGFuY2UgewotfSAvLyBUZW1wbGF0ZQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9UZXJtRGVmaW5pdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1Rlcm1EZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhMmU1NmYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1Rlcm1EZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFRlcm1EZWZpbml0aW9uLmphdmEsdiAxLjEgMjAwOC8wMS8xNSAwODo1MjowNyBqdGhhbSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlRlcm0gRGVmaW5pdGlvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEEgc3BlY2lmaWMgdHlwZSBvZiBndWlkYW5jZSB0aGF0IGRlZmluZXMgY29uY2VwdHMgYW5kIGFyZSB1c2VkIHRvIGJ1aWxkIHVwIHRoZSBHbG9zc2FyeS4gVGVybURlZmluaXRpb25zIGFyZSBub3QgZGlyZWN0bHkgcmVsYXRlZCB0byBDb250ZW50RWxlbWVudHMsIGJ1dCB0aGVpciByZWxhdGlvbnNoaXAgaXMgYmVpbmcgZGVyaXZlZCB3aGVuIHRoZSBUZXJtIGlzIHVzZWQgaW4gdGhlIENvbnRlbnRFbGVtZW50cyBkZXNjcmlwdGlvbiB0ZXh0LgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0VGVybURlZmluaXRpb24oKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J1Rlcm1EZWZpbml0aW9uJyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgVGVybURlZmluaXRpb24gZXh0ZW5kcyBHdWlkYW5jZSB7Ci19IC8vIFRlcm1EZWZpbml0aW9uClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1Rvb2wuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9Ub29sLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwODlhMzIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1Rvb2wuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogVG9vbC5qYXZhLHYgMS4yIDIwMDgvMDEvMzAgMDA6NDE6NDgga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXA7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlRvb2w8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIGNvbnRhaW5lci9hZ2dyZWdhdGUgZm9yIFRvb2xNZW50b3JzLiAgSXQgY2FuIGFsc28gcHJvdmlkZSBnZW5lcmFsIGRlc2NyaXB0aW9ucyBvZiB0aGUgdG9vbCBhbmQgaXRzIGdlbmVyYWwgY2FwYWJpbGl0aWVzLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRvb2wjZ2V0R3JvdXAyIDxlbT5Hcm91cDI8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRvb2wjZ2V0VG9vbE1lbnRvciA8ZW0+VG9vbCBNZW50b3I8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0VG9vbCgpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nVG9vbCcga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFRvb2wgZXh0ZW5kcyBDb250ZW50Q2F0ZWdvcnkgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkdyb3VwMjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXAuRW50cnl9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+R3JvdXAyPC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+R3JvdXAyPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRUb29sX0dyb3VwMigpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUZlYXR1cmVNYXBFbnRyeSIgbWFueT0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZ3JvdXAnIG5hbWU9J2dyb3VwOjI0JyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRmVhdHVyZU1hcCBnZXRHcm91cDIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlRvb2wgTWVudG9yPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Ub29sIE1lbnRvcjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlRvb2wgTWVudG9yPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRUb29sX1Rvb2xNZW50b3IoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nVG9vbE1lbnRvcicgZ3JvdXA9JyNncm91cDoyNCciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0PFN0cmluZz4gZ2V0VG9vbE1lbnRvcigpOwotCi19IC8vIFRvb2wKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvVG9vbE1lbnRvci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1Rvb2xNZW50b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDg0Zjc5My4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvVG9vbE1lbnRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBUb29sTWVudG9yLmphdmEsdiAxLjEgMjAwOC8wMS8xNSAwODo1MjowNyBqdGhhbSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlRvb2wgTWVudG9yPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQSAgc3BlY2lmaWMgdHlwZSBvZiBndWlkYW5jZSB0aGF0IHNob3dzIGhvdyB0byB1c2UgYSBzcGVjaWZpYyB0b29sIHRvIGFjY29tcGxpc2ggc29tZSBwaWVjZSBvZiB3b3JrIGEgV29yayBQcm9kdWN0IGVpdGhlciBpbiB0aGUgY29udGV4dCBvZiBvciBpbmRlcGVuZGVudCBmcm9tIGEgVGFzayBvciBBY3Rpdml0eS4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFRvb2xNZW50b3IoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J1Rvb2xNZW50b3InIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBUb29sTWVudG9yIGV4dGVuZHMgR3VpZGFuY2UgewotfSAvLyBUb29sTWVudG9yClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1VtYUZhY3RvcnkuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9VbWFGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzNWFkNWYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1VtYUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgyMCArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFVtYUZhY3RvcnkuamF2YSx2IDEuMiAyMDA4LzAxLzMwIDAwOjQxOjQ4IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRmFjdG9yeTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogVGhlIDxiPkZhY3Rvcnk8L2I+IGZvciB0aGUgbW9kZWwuCi0gKiBJdCBwcm92aWRlcyBhIGNyZWF0ZSBtZXRob2QgZm9yIGVhY2ggbm9uLWFic3RyYWN0IGNsYXNzIG9mIHRoZSBtb2RlbC4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgVW1hRmFjdG9yeSBleHRlbmRzIEVGYWN0b3J5IHsKLQkvKioKLQkgKiBUaGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBmYWN0b3J5LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCVVtYUZhY3RvcnkgZUlOU1RBTkNFID0gb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFGYWN0b3J5SW1wbC5pbml0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkFjdGl2aXR5PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5BY3Rpdml0eTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQWN0aXZpdHkgY3JlYXRlQWN0aXZpdHkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+QWN0aXZpdHkgRGVzY3JpcHRpb248L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkFjdGl2aXR5IERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlBY3Rpdml0eURlc2NyaXB0aW9uIGNyZWF0ZUFjdGl2aXR5RGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+QXBwbGljYWJsZSBNZXRhIENsYXNzIEluZm88L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkFwcGxpY2FibGUgTWV0YSBDbGFzcyBJbmZvPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlBcHBsaWNhYmxlTWV0YUNsYXNzSW5mbyBjcmVhdGVBcHBsaWNhYmxlTWV0YUNsYXNzSW5mbygpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5BcnRpZmFjdDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+QXJ0aWZhY3Q8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUFydGlmYWN0IGNyZWF0ZUFydGlmYWN0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkFydGlmYWN0IERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5BcnRpZmFjdCBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQXJ0aWZhY3REZXNjcmlwdGlvbiBjcmVhdGVBcnRpZmFjdERlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkJyZWFrZG93biBFbGVtZW50PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5CcmVha2Rvd24gRWxlbWVudDwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQnJlYWtkb3duRWxlbWVudCBjcmVhdGVCcmVha2Rvd25FbGVtZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkJyZWFrZG93biBFbGVtZW50IERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5CcmVha2Rvd24gRWxlbWVudCBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uIGNyZWF0ZUJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5DYXBhYmlsaXR5IFBhdHRlcm48L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkNhcGFiaWxpdHkgUGF0dGVybjwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQ2FwYWJpbGl0eVBhdHRlcm4gY3JlYXRlQ2FwYWJpbGl0eVBhdHRlcm4oKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+Q2hlY2tsaXN0PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5DaGVja2xpc3Q8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUNoZWNrbGlzdCBjcmVhdGVDaGVja2xpc3QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+Q29tcG9zaXRlIFJvbGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkNvbXBvc2l0ZSBSb2xlPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlDb21wb3NpdGVSb2xlIGNyZWF0ZUNvbXBvc2l0ZVJvbGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+Q29uY2VwdDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+Q29uY2VwdDwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQ29uY2VwdCBjcmVhdGVDb25jZXB0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkNvbnN0cmFpbnQ8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkNvbnN0cmFpbnQ8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUNvbnN0cmFpbnQgY3JlYXRlQ29uc3RyYWludCgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Db250ZW50IENhdGVnb3J5PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Db250ZW50IENhdGVnb3J5PC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlDb250ZW50Q2F0ZWdvcnkgY3JlYXRlQ29udGVudENhdGVnb3J5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkNvbnRlbnQgQ2F0ZWdvcnkgUGFja2FnZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+Q29udGVudCBDYXRlZ29yeSBQYWNrYWdlPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlDb250ZW50Q2F0ZWdvcnlQYWNrYWdlIGNyZWF0ZUNvbnRlbnRDYXRlZ29yeVBhY2thZ2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+Q29udGVudCBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+Q29udGVudCBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQ29udGVudERlc2NyaXB0aW9uIGNyZWF0ZUNvbnRlbnREZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Db250ZW50IEVsZW1lbnQ8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkNvbnRlbnQgRWxlbWVudDwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQ29udGVudEVsZW1lbnQgY3JlYXRlQ29udGVudEVsZW1lbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+Q29udGVudCBQYWNrYWdlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Db250ZW50IFBhY2thZ2U8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUNvbnRlbnRQYWNrYWdlIGNyZWF0ZUNvbnRlbnRQYWNrYWdlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkN1c3RvbSBDYXRlZ29yeTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+Q3VzdG9tIENhdGVnb3J5PC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlDdXN0b21DYXRlZ29yeSBjcmVhdGVDdXN0b21DYXRlZ29yeSgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5EZWxpdmVyYWJsZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RGVsaXZlcmFibGU8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCURlbGl2ZXJhYmxlIGNyZWF0ZURlbGl2ZXJhYmxlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkRlbGl2ZXJhYmxlIERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5EZWxpdmVyYWJsZSBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRGVsaXZlcmFibGVEZXNjcmlwdGlvbiBjcmVhdGVEZWxpdmVyYWJsZURlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkRlbGl2ZXJ5IFByb2Nlc3M8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkRlbGl2ZXJ5IFByb2Nlc3M8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCURlbGl2ZXJ5UHJvY2VzcyBjcmVhdGVEZWxpdmVyeVByb2Nlc3MoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RGVsaXZlcnkgUHJvY2VzcyBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RGVsaXZlcnkgUHJvY2VzcyBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24gY3JlYXRlRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RGVzY3JpYmFibGUgRWxlbWVudDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RGVzY3JpYmFibGUgRWxlbWVudDwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRGVzY3JpYmFibGVFbGVtZW50IGNyZWF0ZURlc2NyaWJhYmxlRWxlbWVudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5EZXNjcmlwdG9yPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5EZXNjcmlwdG9yPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlEZXNjcmlwdG9yIGNyZWF0ZURlc2NyaXB0b3IoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RGVzY3JpcHRvciBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RGVzY3JpcHRvciBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRGVzY3JpcHRvckRlc2NyaXB0aW9uIGNyZWF0ZURlc2NyaXB0b3JEZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5EaXNjaXBsaW5lPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5EaXNjaXBsaW5lPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlEaXNjaXBsaW5lIGNyZWF0ZURpc2NpcGxpbmUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RGlzY2lwbGluZSBHcm91cGluZzwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RGlzY2lwbGluZSBHcm91cGluZzwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRGlzY2lwbGluZUdyb3VwaW5nIGNyZWF0ZURpc2NpcGxpbmVHcm91cGluZygpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Eb2N1bWVudCBSb290PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Eb2N1bWVudCBSb290PC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlEb2N1bWVudFJvb3QgY3JlYXRlRG9jdW1lbnRSb290KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkRvbWFpbjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RG9tYWluPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlEb21haW4gY3JlYXRlRG9tYWluKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkVsZW1lbnQ8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkVsZW1lbnQ8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVsZW1lbnQgY3JlYXRlRWxlbWVudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Fc3RpbWF0ZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RXN0aW1hdGU8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVzdGltYXRlIGNyZWF0ZUVzdGltYXRlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkVzdGltYXRpbmcgTWV0cmljPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Fc3RpbWF0aW5nIE1ldHJpYzwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRXN0aW1hdGluZ01ldHJpYyBjcmVhdGVFc3RpbWF0aW5nTWV0cmljKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkVzdGltYXRpb24gQ29uc2lkZXJhdGlvbnM8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkVzdGltYXRpb24gQ29uc2lkZXJhdGlvbnM8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVzdGltYXRpb25Db25zaWRlcmF0aW9ucyBjcmVhdGVFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RXhhbXBsZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RXhhbXBsZTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRXhhbXBsZSBjcmVhdGVFeGFtcGxlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkd1aWRhbmNlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5HdWlkYW5jZTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JR3VpZGFuY2UgY3JlYXRlR3VpZGFuY2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+R3VpZGFuY2UgRGVzY3JpcHRpb248L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkd1aWRhbmNlIERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlHdWlkYW5jZURlc2NyaXB0aW9uIGNyZWF0ZUd1aWRhbmNlRGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+R3VpZGVsaW5lPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5HdWlkZWxpbmU8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUd1aWRlbGluZSBjcmVhdGVHdWlkZWxpbmUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+SXRlcmF0aW9uPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5JdGVyYXRpb248L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUl0ZXJhdGlvbiBjcmVhdGVJdGVyYXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+S2luZDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+S2luZDwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JS2luZCBjcmVhdGVLaW5kKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPk1ldGhvZCBDb25maWd1cmF0aW9uPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5NZXRob2QgQ29uZmlndXJhdGlvbjwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTWV0aG9kQ29uZmlndXJhdGlvbiBjcmVhdGVNZXRob2RDb25maWd1cmF0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPk1ldGhvZCBFbGVtZW50PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5NZXRob2QgRWxlbWVudDwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTWV0aG9kRWxlbWVudCBjcmVhdGVNZXRob2RFbGVtZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTWV0aG9kRWxlbWVudFByb3BlcnR5IGNyZWF0ZU1ldGhvZEVsZW1lbnRQcm9wZXJ0eSgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5NZXRob2QgTGlicmFyeTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+TWV0aG9kIExpYnJhcnk8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU1ldGhvZExpYnJhcnkgY3JlYXRlTWV0aG9kTGlicmFyeSgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5NZXRob2QgUGFja2FnZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+TWV0aG9kIFBhY2thZ2U8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU1ldGhvZFBhY2thZ2UgY3JlYXRlTWV0aG9kUGFja2FnZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5NZXRob2QgUGx1Z2luPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5NZXRob2QgUGx1Z2luPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlNZXRob2RQbHVnaW4gY3JlYXRlTWV0aG9kUGx1Z2luKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPk1ldGhvZCBVbml0PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5NZXRob2QgVW5pdDwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTWV0aG9kVW5pdCBjcmVhdGVNZXRob2RVbml0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPk1pbGVzdG9uZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+TWlsZXN0b25lPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlNaWxlc3RvbmUgY3JlYXRlTWlsZXN0b25lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPk5hbWVkIEVsZW1lbnQ8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPk5hbWVkIEVsZW1lbnQ8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU5hbWVkRWxlbWVudCBjcmVhdGVOYW1lZEVsZW1lbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+T3V0Y29tZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+T3V0Y29tZTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JT3V0Y29tZSBjcmVhdGVPdXRjb21lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlBhY2thZ2VhYmxlIEVsZW1lbnQ8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlBhY2thZ2VhYmxlIEVsZW1lbnQ8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVBhY2thZ2VhYmxlRWxlbWVudCBjcmVhdGVQYWNrYWdlYWJsZUVsZW1lbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UGhhc2U8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlBoYXNlPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlQaGFzZSBjcmVhdGVQaGFzZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5QbGFubmluZyBEYXRhPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5QbGFubmluZyBEYXRhPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlQbGFubmluZ0RhdGEgY3JlYXRlUGxhbm5pbmdEYXRhKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlByYWN0aWNlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5QcmFjdGljZTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUHJhY3RpY2UgY3JlYXRlUHJhY3RpY2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UHJhY3RpY2UgRGVzY3JpcHRpb248L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlByYWN0aWNlIERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlQcmFjdGljZURlc2NyaXB0aW9uIGNyZWF0ZVByYWN0aWNlRGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UHJvY2VzczwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UHJvY2VzczwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2VzcyBjcmVhdGVQcm9jZXNzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlByb2Nlc3MgQ29tcG9uZW50PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Qcm9jZXNzIENvbXBvbmVudDwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUHJvY2Vzc0NvbXBvbmVudCBjcmVhdGVQcm9jZXNzQ29tcG9uZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlByb2Nlc3MgQ29tcG9uZW50IEludGVyZmFjZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UHJvY2VzcyBDb21wb25lbnQgSW50ZXJmYWNlPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlIGNyZWF0ZVByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UHJvY2VzcyBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UHJvY2VzcyBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUHJvY2Vzc0Rlc2NyaXB0aW9uIGNyZWF0ZVByb2Nlc3NEZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Qcm9jZXNzIEVsZW1lbnQ8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlByb2Nlc3MgRWxlbWVudDwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUHJvY2Vzc0VsZW1lbnQgY3JlYXRlUHJvY2Vzc0VsZW1lbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UHJvY2VzcyBQYWNrYWdlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Qcm9jZXNzIFBhY2thZ2U8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVByb2Nlc3NQYWNrYWdlIGNyZWF0ZVByb2Nlc3NQYWNrYWdlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlByb2Nlc3MgUGxhbm5pbmcgVGVtcGxhdGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlByb2Nlc3MgUGxhbm5pbmcgVGVtcGxhdGU8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVByb2Nlc3NQbGFubmluZ1RlbXBsYXRlIGNyZWF0ZVByb2Nlc3NQbGFubmluZ1RlbXBsYXRlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlJlcG9ydDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UmVwb3J0PC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlSZXBvcnQgY3JlYXRlUmVwb3J0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlJldXNhYmxlIEFzc2V0PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5SZXVzYWJsZSBBc3NldDwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUmV1c2FibGVBc3NldCBjcmVhdGVSZXVzYWJsZUFzc2V0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlJvYWRtYXA8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlJvYWRtYXA8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVJvYWRtYXAgY3JlYXRlUm9hZG1hcCgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Sb2xlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Sb2xlPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlSb2xlIGNyZWF0ZVJvbGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+Um9sZSBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+Um9sZSBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUm9sZURlc2NyaXB0aW9uIGNyZWF0ZVJvbGVEZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Sb2xlIERlc2NyaXB0b3I8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlJvbGUgRGVzY3JpcHRvcjwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUm9sZURlc2NyaXB0b3IgY3JlYXRlUm9sZURlc2NyaXB0b3IoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+Um9sZSBTZXQ8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlJvbGUgU2V0PC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlSb2xlU2V0IGNyZWF0ZVJvbGVTZXQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+Um9sZSBTZXQgR3JvdXBpbmc8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlJvbGUgU2V0IEdyb3VwaW5nPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlSb2xlU2V0R3JvdXBpbmcgY3JlYXRlUm9sZVNldEdyb3VwaW5nKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlNlY3Rpb248L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlNlY3Rpb248L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVNlY3Rpb24gY3JlYXRlU2VjdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5TdXBwb3J0aW5nIE1hdGVyaWFsPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5TdXBwb3J0aW5nIE1hdGVyaWFsPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdXBwb3J0aW5nTWF0ZXJpYWwgY3JlYXRlU3VwcG9ydGluZ01hdGVyaWFsKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlRhc2s8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlRhc2s8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVRhc2sgY3JlYXRlVGFzaygpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5UYXNrIERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5UYXNrIERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlUYXNrRGVzY3JpcHRpb24gY3JlYXRlVGFza0Rlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlRhc2sgRGVzY3JpcHRvcjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+VGFzayBEZXNjcmlwdG9yPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlUYXNrRGVzY3JpcHRvciBjcmVhdGVUYXNrRGVzY3JpcHRvcigpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5UZWFtIFByb2ZpbGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlRlYW0gUHJvZmlsZTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JVGVhbVByb2ZpbGUgY3JlYXRlVGVhbVByb2ZpbGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+VGVtcGxhdGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlRlbXBsYXRlPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlUZW1wbGF0ZSBjcmVhdGVUZW1wbGF0ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5UZXJtIERlZmluaXRpb248L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlRlcm0gRGVmaW5pdGlvbjwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JVGVybURlZmluaXRpb24gY3JlYXRlVGVybURlZmluaXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+VG9vbDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+VG9vbDwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JVG9vbCBjcmVhdGVUb29sKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlRvb2wgTWVudG9yPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Ub29sIE1lbnRvcjwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JVG9vbE1lbnRvciBjcmVhdGVUb29sTWVudG9yKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPldoaXRlcGFwZXI8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPldoaXRlcGFwZXI8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVdoaXRlcGFwZXIgY3JlYXRlV2hpdGVwYXBlcigpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Xb3JrIEJyZWFrZG93biBFbGVtZW50PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Xb3JrIEJyZWFrZG93biBFbGVtZW50PC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlXb3JrQnJlYWtkb3duRWxlbWVudCBjcmVhdGVXb3JrQnJlYWtkb3duRWxlbWVudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Xb3JrIERlZmluaXRpb248L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPldvcmsgRGVmaW5pdGlvbjwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JV29ya0RlZmluaXRpb24gY3JlYXRlV29ya0RlZmluaXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+V29yayBPcmRlcjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+V29yayBPcmRlcjwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JV29ya09yZGVyIGNyZWF0ZVdvcmtPcmRlcigpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Xb3JrIFByb2R1Y3Q8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPldvcmsgUHJvZHVjdDwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JV29ya1Byb2R1Y3QgY3JlYXRlV29ya1Byb2R1Y3QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+V29yayBQcm9kdWN0IERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Xb3JrIFByb2R1Y3QgRGVzY3JpcHRpb248L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVdvcmtQcm9kdWN0RGVzY3JpcHRpb24gY3JlYXRlV29ya1Byb2R1Y3REZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Xb3JrIFByb2R1Y3QgRGVzY3JpcHRvcjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+V29yayBQcm9kdWN0IERlc2NyaXB0b3I8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVdvcmtQcm9kdWN0RGVzY3JpcHRvciBjcmVhdGVXb3JrUHJvZHVjdERlc2NyaXB0b3IoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+V29yayBQcm9kdWN0IFR5cGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPldvcmsgUHJvZHVjdCBUeXBlPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlXb3JrUHJvZHVjdFR5cGUgY3JlYXRlV29ya1Byb2R1Y3RUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwYWNrYWdlIHN1cHBvcnRlZCBieSB0aGlzIGZhY3RvcnkuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBwYWNrYWdlIHN1cHBvcnRlZCBieSB0aGlzIGZhY3RvcnkuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVVtYVBhY2thZ2UgZ2V0VW1hUGFja2FnZSgpOwotCi19IC8vVW1hRmFjdG9yeQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1VtYVBhY2thZ2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9VbWFQYWNrYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2M2RmNTkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1VtYVBhY2thZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3MTg4ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogVW1hUGFja2FnZS5qYXZhLHYgMS4yIDIwMDgvMDEvMzAgMDA6NDE6NDcga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRURhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRW51bTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIFRoZSA8Yj5QYWNrYWdlPC9iPiBmb3IgdGhlIG1vZGVsLgotICogSXQgY29udGFpbnMgYWNjZXNzb3JzIGZvciB0aGUgbWV0YSBvYmplY3RzIHRvIHJlcHJlc2VudAotICogPHVsPgotICogICA8bGk+ZWFjaCBjbGFzcyw8L2xpPgotICogICA8bGk+ZWFjaCBmZWF0dXJlIG9mIGVhY2ggY2xhc3MsPC9saT4KLSAqICAgPGxpPmVhY2ggZW51bSw8L2xpPgotICogICA8bGk+YW5kIGVhY2ggZGF0YSB0eXBlPC9saT4KLSAqIDwvdWw+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hRmFjdG9yeQotICogQG1vZGVsIGtpbmQ9InBhY2thZ2UiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgVW1hUGFja2FnZSBleHRlbmRzIEVQYWNrYWdlIHsKLQkvKioKLQkgKiBUaGUgcGFja2FnZSBuYW1lLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBlTkFNRSA9ICJ1bWEiOwotCi0JLyoqCi0JICogVGhlIHBhY2thZ2UgbmFtZXNwYWNlIFVSSS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZU5TX1VSSSA9ICJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjUiOwotCi0JLyoqCi0JICogVGhlIHBhY2thZ2UgbmFtZXNwYWNlIG5hbWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGVOU19QUkVGSVggPSAidW1hIjsKLQotCS8qKgotCSAqIFRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIHBhY2thZ2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JVW1hUGFja2FnZSBlSU5TVEFOQ0UgPSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsLmluaXQoKTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5FbGVtZW50SW1wbCA8ZW0+RWxlbWVudDwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuRWxlbWVudEltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0RWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBFTEVNRU5UID0gMjk7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+RWxlbWVudDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFTEVNRU5UX0ZFQVRVUkVfQ09VTlQgPSAwOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLk5hbWVkRWxlbWVudEltcGwgPGVtPk5hbWVkIEVsZW1lbnQ8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLk5hbWVkRWxlbWVudEltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0TmFtZWRFbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IE5BTUVEX0VMRU1FTlQgPSA0NzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTkFNRURfRUxFTUVOVF9fTkFNRSA9IEVMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+TmFtZWQgRWxlbWVudDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBOQU1FRF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgPSBFTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlBhY2thZ2VhYmxlRWxlbWVudEltcGwgPGVtPlBhY2thZ2VhYmxlIEVsZW1lbnQ8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlBhY2thZ2VhYmxlRWxlbWVudEltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0UGFja2FnZWFibGVFbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFBBQ0tBR0VBQkxFX0VMRU1FTlQgPSA0OTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUEFDS0FHRUFCTEVfRUxFTUVOVF9fTkFNRSA9IE5BTUVEX0VMRU1FTlRfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+UGFja2FnZWFibGUgRWxlbWVudDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQQUNLQUdFQUJMRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgPSBOQU1FRF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLk1ldGhvZEVsZW1lbnRJbXBsIDxlbT5NZXRob2QgRWxlbWVudDwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuTWV0aG9kRWxlbWVudEltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0TWV0aG9kRWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBNRVRIT0RfRUxFTUVOVCA9IDQwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfRUxFTUVOVF9fTkFNRSA9IFBBQ0tBR0VBQkxFX0VMRU1FTlRfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXA8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9FTEVNRU5UX19HUk9VUCA9IFBBQ0tBR0VBQkxFX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX0VMRU1FTlRfX09XTkVEX1JVTEUgPSBQQUNLQUdFQUJMRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfRUxFTUVOVF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBQQUNLQUdFQUJMRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX0VMRU1FTlRfX0JSSUVGX0RFU0NSSVBUSU9OID0gUEFDS0FHRUFCTEVfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9FTEVNRU5UX19JRCA9IFBBQ0tBR0VBQkxFX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfRUxFTUVOVF9fT1JERVJJTkdfR1VJREUgPSBQQUNLQUdFQUJMRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX0VMRU1FTlRfX1BSRVNFTlRBVElPTl9OQU1FID0gUEFDS0FHRUFCTEVfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgNjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX0VMRU1FTlRfX1NVUFBSRVNTRUQgPSBQQUNLQUdFQUJMRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA3OwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPk1ldGhvZCBFbGVtZW50PC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgPSBQQUNLQUdFQUJMRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA4OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkRlc2NyaWJhYmxlRWxlbWVudEltcGwgPGVtPkRlc2NyaWJhYmxlIEVsZW1lbnQ8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkRlc2NyaWJhYmxlRWxlbWVudEltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0RGVzY3JpYmFibGVFbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IERFU0NSSUJBQkxFX0VMRU1FTlQgPSAyMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJQkFCTEVfRUxFTUVOVF9fTkFNRSA9IE1FVEhPRF9FTEVNRU5UX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklCQUJMRV9FTEVNRU5UX19HUk9VUCA9IE1FVEhPRF9FTEVNRU5UX19HUk9VUDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklCQUJMRV9FTEVNRU5UX19PV05FRF9SVUxFID0gTUVUSE9EX0VMRU1FTlRfX09XTkVEX1JVTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSUJBQkxFX0VMRU1FTlRfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gTUVUSE9EX0VMRU1FTlRfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJQkFCTEVfRUxFTUVOVF9fQlJJRUZfREVTQ1JJUFRJT04gPSBNRVRIT0RfRUxFTUVOVF9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklCQUJMRV9FTEVNRU5UX19JRCA9IE1FVEhPRF9FTEVNRU5UX19JRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSUJBQkxFX0VMRU1FTlRfX09SREVSSU5HX0dVSURFID0gTUVUSE9EX0VMRU1FTlRfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJQkFCTEVfRUxFTUVOVF9fUFJFU0VOVEFUSU9OX05BTUUgPSBNRVRIT0RfRUxFTUVOVF9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSUJBQkxFX0VMRU1FTlRfX1NVUFBSRVNTRUQgPSBNRVRIT0RfRUxFTUVOVF9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklCQUJMRV9FTEVNRU5UX19QUkVTRU5UQVRJT04gPSBNRVRIT0RfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GdWxmaWxsPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklCQUJMRV9FTEVNRU5UX19GVUxGSUxMID0gTUVUSE9EX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgQWJzdHJhY3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklCQUJMRV9FTEVNRU5UX19JU19BQlNUUkFDVCA9IE1FVEhPRF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJQkFCTEVfRUxFTUVOVF9fTk9ERUlDT04gPSBNRVRIT0RfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TaGFwZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklCQUJMRV9FTEVNRU5UX19TSEFQRUlDT04gPSBNRVRIT0RfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgNDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5EZXNjcmliYWJsZSBFbGVtZW50PC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSUJBQkxFX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCA9IE1FVEhPRF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA1OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlByb2Nlc3NFbGVtZW50SW1wbCA8ZW0+UHJvY2VzcyBFbGVtZW50PC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Qcm9jZXNzRWxlbWVudEltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0UHJvY2Vzc0VsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19FTEVNRU5UID0gNTg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfRUxFTUVOVF9fTkFNRSA9IERFU0NSSUJBQkxFX0VMRU1FTlRfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXA8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfRUxFTUVOVF9fR1JPVVAgPSBERVNDUklCQUJMRV9FTEVNRU5UX19HUk9VUDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0VMRU1FTlRfX09XTkVEX1JVTEUgPSBERVNDUklCQUJMRV9FTEVNRU5UX19PV05FRF9SVUxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0VMRU1FTlRfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gREVTQ1JJQkFCTEVfRUxFTUVOVF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0VMRU1FTlRfX0JSSUVGX0RFU0NSSVBUSU9OID0gREVTQ1JJQkFCTEVfRUxFTUVOVF9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0VMRU1FTlRfX0lEID0gREVTQ1JJQkFCTEVfRUxFTUVOVF9fSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0VMRU1FTlRfX09SREVSSU5HX0dVSURFID0gREVTQ1JJQkFCTEVfRUxFTUVOVF9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0VMRU1FTlRfX1BSRVNFTlRBVElPTl9OQU1FID0gREVTQ1JJQkFCTEVfRUxFTUVOVF9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfRUxFTUVOVF9fU1VQUFJFU1NFRCA9IERFU0NSSUJBQkxFX0VMRU1FTlRfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19FTEVNRU5UX19QUkVTRU5UQVRJT04gPSBERVNDUklCQUJMRV9FTEVNRU5UX19QUkVTRU5UQVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RnVsZmlsbDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19FTEVNRU5UX19GVUxGSUxMID0gREVTQ1JJQkFCTEVfRUxFTUVOVF9fRlVMRklMTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBBYnN0cmFjdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfRUxFTUVOVF9fSVNfQUJTVFJBQ1QgPSBERVNDUklCQUJMRV9FTEVNRU5UX19JU19BQlNUUkFDVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob2RlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfRUxFTUVOVF9fTk9ERUlDT04gPSBERVNDUklCQUJMRV9FTEVNRU5UX19OT0RFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TaGFwZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0VMRU1FTlRfX1NIQVBFSUNPTiA9IERFU0NSSUJBQkxFX0VMRU1FTlRfX1NIQVBFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Qcm9jZXNzIEVsZW1lbnQ8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgPSBERVNDUklCQUJMRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkJyZWFrZG93bkVsZW1lbnRJbXBsIDxlbT5CcmVha2Rvd24gRWxlbWVudDwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQnJlYWtkb3duRWxlbWVudEltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0QnJlYWtkb3duRWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBCUkVBS0RPV05fRUxFTUVOVCA9IDU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJSRUFLRE9XTl9FTEVNRU5UX19OQU1FID0gUFJPQ0VTU19FTEVNRU5UX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCUkVBS0RPV05fRUxFTUVOVF9fR1JPVVAgPSBQUk9DRVNTX0VMRU1FTlRfX0dST1VQOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJSRUFLRE9XTl9FTEVNRU5UX19PV05FRF9SVUxFID0gUFJPQ0VTU19FTEVNRU5UX19PV05FRF9SVUxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCUkVBS0RPV05fRUxFTUVOVF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBQUk9DRVNTX0VMRU1FTlRfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQlJFQUtET1dOX0VMRU1FTlRfX0JSSUVGX0RFU0NSSVBUSU9OID0gUFJPQ0VTU19FTEVNRU5UX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJSRUFLRE9XTl9FTEVNRU5UX19JRCA9IFBST0NFU1NfRUxFTUVOVF9fSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCUkVBS0RPV05fRUxFTUVOVF9fT1JERVJJTkdfR1VJREUgPSBQUk9DRVNTX0VMRU1FTlRfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQlJFQUtET1dOX0VMRU1FTlRfX1BSRVNFTlRBVElPTl9OQU1FID0gUFJPQ0VTU19FTEVNRU5UX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQlJFQUtET1dOX0VMRU1FTlRfX1NVUFBSRVNTRUQgPSBQUk9DRVNTX0VMRU1FTlRfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQlJFQUtET1dOX0VMRU1FTlRfX1BSRVNFTlRBVElPTiA9IFBST0NFU1NfRUxFTUVOVF9fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZ1bGZpbGw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJSRUFLRE9XTl9FTEVNRU5UX19GVUxGSUxMID0gUFJPQ0VTU19FTEVNRU5UX19GVUxGSUxMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIEFic3RyYWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQlJFQUtET1dOX0VMRU1FTlRfX0lTX0FCU1RSQUNUID0gUFJPQ0VTU19FTEVNRU5UX19JU19BQlNUUkFDVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob2RlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJSRUFLRE9XTl9FTEVNRU5UX19OT0RFSUNPTiA9IFBST0NFU1NfRUxFTUVOVF9fTk9ERUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2hhcGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQlJFQUtET1dOX0VMRU1FTlRfX1NIQVBFSUNPTiA9IFBST0NFU1NfRUxFTUVOVF9fU0hBUEVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRlZCBBZnRlcjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJSRUFLRE9XTl9FTEVNRU5UX19QUkVTRU5URURfQUZURVIgPSBQUk9DRVNTX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGVkIEJlZm9yZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJSRUFLRE9XTl9FTEVNRU5UX19QUkVTRU5URURfQkVGT1JFID0gUFJPQ0VTU19FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBsYW5uaW5nIERhdGE8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCUkVBS0RPV05fRUxFTUVOVF9fUExBTk5JTkdfREFUQSA9IFBST0NFU1NfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBlciBBY3Rpdml0eTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJSRUFLRE9XTl9FTEVNRU5UX19TVVBFUl9BQ1RJVklUWSA9IFBST0NFU1NfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDE8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJSRUFLRE9XTl9FTEVNRU5UX19HUk9VUDEgPSBQUk9DRVNTX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hlY2tsaXN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCUkVBS0RPV05fRUxFTUVOVF9fQ0hFQ0tMSVNUID0gUFJPQ0VTU19FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbmNlcHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJSRUFLRE9XTl9FTEVNRU5UX19DT05DRVBUID0gUFJPQ0VTU19FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA2OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4YW1wbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJSRUFLRE9XTl9FTEVNRU5UX19FWEFNUExFID0gUFJPQ0VTU19FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA3OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWRlbGluZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQlJFQUtET1dOX0VMRU1FTlRfX0dVSURFTElORSA9IFBST0NFU1NfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgODsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXVzYWJsZSBBc3NldDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQlJFQUtET1dOX0VMRU1FTlRfX1JFVVNBQkxFX0FTU0VUID0gUFJPQ0VTU19FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA5OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHBvcnRpbmcgTWF0ZXJpYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJSRUFLRE9XTl9FTEVNRU5UX19TVVBQT1JUSU5HX01BVEVSSUFMID0gUFJPQ0VTU19FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5XaGl0ZXBhcGVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCUkVBS0RPV05fRUxFTUVOVF9fV0hJVEVQQVBFUiA9IFBST0NFU1NfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMTE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SGFzIE11bHRpcGxlIE9jY3VycmVuY2VzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQlJFQUtET1dOX0VMRU1FTlRfX0hBU19NVUxUSVBMRV9PQ0NVUlJFTkNFUyA9IFBST0NFU1NfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMTI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgT3B0aW9uYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCUkVBS0RPV05fRUxFTUVOVF9fSVNfT1BUSU9OQUwgPSBQUk9DRVNTX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDEzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIFBsYW5uZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCUkVBS0RPV05fRUxFTUVOVF9fSVNfUExBTk5FRCA9IFBST0NFU1NfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMTQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlZml4PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQlJFQUtET1dOX0VMRU1FTlRfX1BSRUZJWCA9IFBST0NFU1NfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMTU7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+QnJlYWtkb3duIEVsZW1lbnQ8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQlJFQUtET1dOX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCA9IFBST0NFU1NfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMTY7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuV29ya0JyZWFrZG93bkVsZW1lbnRJbXBsIDxlbT5Xb3JrIEJyZWFrZG93biBFbGVtZW50PC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Xb3JrQnJlYWtkb3duRWxlbWVudEltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0V29ya0JyZWFrZG93bkVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgV09SS19CUkVBS0RPV05fRUxFTUVOVCA9IDgwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19OQU1FID0gQlJFQUtET1dOX0VMRU1FTlRfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXA8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0dST1VQID0gQlJFQUtET1dOX0VMRU1FTlRfX0dST1VQOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX09XTkVEX1JVTEUgPSBCUkVBS0RPV05fRUxFTUVOVF9fT1dORURfUlVMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19CUkVBS0RPV05fRUxFTUVOVF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBCUkVBS0RPV05fRUxFTUVOVF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19CUklFRl9ERVNDUklQVElPTiA9IEJSRUFLRE9XTl9FTEVNRU5UX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0lEID0gQlJFQUtET1dOX0VMRU1FTlRfX0lEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19CUkVBS0RPV05fRUxFTUVOVF9fT1JERVJJTkdfR1VJREUgPSBCUkVBS0RPV05fRUxFTUVOVF9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19QUkVTRU5UQVRJT05fTkFNRSA9IEJSRUFLRE9XTl9FTEVNRU5UX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19CUkVBS0RPV05fRUxFTUVOVF9fU1VQUFJFU1NFRCA9IEJSRUFLRE9XTl9FTEVNRU5UX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX1BSRVNFTlRBVElPTiA9IEJSRUFLRE9XTl9FTEVNRU5UX19QUkVTRU5UQVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RnVsZmlsbDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19CUkVBS0RPV05fRUxFTUVOVF9fRlVMRklMTCA9IEJSRUFLRE9XTl9FTEVNRU5UX19GVUxGSUxMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIEFic3RyYWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19CUkVBS0RPV05fRUxFTUVOVF9fSVNfQUJTVFJBQ1QgPSBCUkVBS0RPV05fRUxFTUVOVF9fSVNfQUJTVFJBQ1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm9kZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19OT0RFSUNPTiA9IEJSRUFLRE9XTl9FTEVNRU5UX19OT0RFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TaGFwZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19TSEFQRUlDT04gPSBCUkVBS0RPV05fRUxFTUVOVF9fU0hBUEVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRlZCBBZnRlcjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX1BSRVNFTlRFRF9BRlRFUiA9IEJSRUFLRE9XTl9FTEVNRU5UX19QUkVTRU5URURfQUZURVI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGVkIEJlZm9yZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX1BSRVNFTlRFRF9CRUZPUkUgPSBCUkVBS0RPV05fRUxFTUVOVF9fUFJFU0VOVEVEX0JFRk9SRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QbGFubmluZyBEYXRhPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19CUkVBS0RPV05fRUxFTUVOVF9fUExBTk5JTkdfREFUQSA9IEJSRUFLRE9XTl9FTEVNRU5UX19QTEFOTklOR19EQVRBOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cGVyIEFjdGl2aXR5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19CUkVBS0RPV05fRUxFTUVOVF9fU1VQRVJfQUNUSVZJVFkgPSBCUkVBS0RPV05fRUxFTUVOVF9fU1VQRVJfQUNUSVZJVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAxPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19HUk9VUDEgPSBCUkVBS0RPV05fRUxFTUVOVF9fR1JPVVAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoZWNrbGlzdDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19CUkVBS0RPV05fRUxFTUVOVF9fQ0hFQ0tMSVNUID0gQlJFQUtET1dOX0VMRU1FTlRfX0NIRUNLTElTVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db25jZXB0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19DT05DRVBUID0gQlJFQUtET1dOX0VMRU1FTlRfX0NPTkNFUFQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXhhbXBsZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19CUkVBS0RPV05fRUxFTUVOVF9fRVhBTVBMRSA9IEJSRUFLRE9XTl9FTEVNRU5UX19FWEFNUExFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWRlbGluZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19CUkVBS0RPV05fRUxFTUVOVF9fR1VJREVMSU5FID0gQlJFQUtET1dOX0VMRU1FTlRfX0dVSURFTElORTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXVzYWJsZSBBc3NldDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19CUkVBS0RPV05fRUxFTUVOVF9fUkVVU0FCTEVfQVNTRVQgPSBCUkVBS0RPV05fRUxFTUVOVF9fUkVVU0FCTEVfQVNTRVQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcG9ydGluZyBNYXRlcmlhbDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19CUkVBS0RPV05fRUxFTUVOVF9fU1VQUE9SVElOR19NQVRFUklBTCA9IEJSRUFLRE9XTl9FTEVNRU5UX19TVVBQT1JUSU5HX01BVEVSSUFMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldoaXRlcGFwZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX1dISVRFUEFQRVIgPSBCUkVBS0RPV05fRUxFTUVOVF9fV0hJVEVQQVBFUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5IYXMgTXVsdGlwbGUgT2NjdXJyZW5jZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19IQVNfTVVMVElQTEVfT0NDVVJSRU5DRVMgPSBCUkVBS0RPV05fRUxFTUVOVF9fSEFTX01VTFRJUExFX09DQ1VSUkVOQ0VTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIE9wdGlvbmFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19CUkVBS0RPV05fRUxFTUVOVF9fSVNfT1BUSU9OQUwgPSBCUkVBS0RPV05fRUxFTUVOVF9fSVNfT1BUSU9OQUw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgUGxhbm5lZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0lTX1BMQU5ORUQgPSBCUkVBS0RPV05fRUxFTUVOVF9fSVNfUExBTk5FRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVmaXg8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19QUkVGSVggPSBCUkVBS0RPV05fRUxFTUVOVF9fUFJFRklYOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19CUkVBS0RPV05fRUxFTUVOVF9fR1JPVVAyID0gQlJFQUtET1dOX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlZGVjZXNzb3I8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX1BSRURFQ0VTU09SID0gQlJFQUtET1dOX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgRXZlbnQgRHJpdmVuPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19CUkVBS0RPV05fRUxFTUVOVF9fSVNfRVZFTlRfRFJJVkVOID0gQlJFQUtET1dOX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgT25nb2luZzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0lTX09OR09JTkcgPSBCUkVBS0RPV05fRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBSZXBlYXRhYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19CUkVBS0RPV05fRUxFTUVOVF9fSVNfUkVQRUFUQUJMRSA9IEJSRUFLRE9XTl9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA0OwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPldvcmsgQnJlYWtkb3duIEVsZW1lbnQ8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19CUkVBS0RPV05fRUxFTUVOVF9GRUFUVVJFX0NPVU5UID0gQlJFQUtET1dOX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDU7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQWN0aXZpdHlJbXBsIDxlbT5BY3Rpdml0eTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQWN0aXZpdHlJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldEFjdGl2aXR5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IEFDVElWSVRZID0gMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfX05BTUUgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9fR1JPVVAgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19HUk9VUDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9fT1dORURfUlVMRSA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX09XTkVEX1JVTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfX0JSSUVGX0RFU0NSSVBUSU9OID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9fSUQgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19JRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX19PUkRFUklOR19HVUlERSA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfX1BSRVNFTlRBVElPTl9OQU1FID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX19TVVBQUkVTU0VEID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9fUFJFU0VOVEFUSU9OID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZ1bGZpbGw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX19GVUxGSUxMID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fRlVMRklMTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBBYnN0cmFjdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX19JU19BQlNUUkFDVCA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0lTX0FCU1RSQUNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfX05PREVJQ09OID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fTk9ERUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2hhcGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfX1NIQVBFSUNPTiA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX1NIQVBFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50ZWQgQWZ0ZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9fUFJFU0VOVEVEX0FGVEVSID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fUFJFU0VOVEVEX0FGVEVSOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRlZCBCZWZvcmU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9fUFJFU0VOVEVEX0JFRk9SRSA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX1BSRVNFTlRFRF9CRUZPUkU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UGxhbm5pbmcgRGF0YTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX19QTEFOTklOR19EQVRBID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fUExBTk5JTkdfREFUQTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBlciBBY3Rpdml0eTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX19TVVBFUl9BQ1RJVklUWSA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX1NVUEVSX0FDVElWSVRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfX0dST1VQMSA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0dST1VQMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGVja2xpc3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX19DSEVDS0xJU1QgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19DSEVDS0xJU1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29uY2VwdDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfX0NPTkNFUFQgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19DT05DRVBUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4YW1wbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX19FWEFNUExFID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fRVhBTVBMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkZWxpbmU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX19HVUlERUxJTkUgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19HVUlERUxJTkU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmV1c2FibGUgQXNzZXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX19SRVVTQUJMRV9BU1NFVCA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX1JFVVNBQkxFX0FTU0VUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHBvcnRpbmcgTWF0ZXJpYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX19TVVBQT1JUSU5HX01BVEVSSUFMID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fU1VQUE9SVElOR19NQVRFUklBTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5XaGl0ZXBhcGVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9fV0hJVEVQQVBFUiA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX1dISVRFUEFQRVI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SGFzIE11bHRpcGxlIE9jY3VycmVuY2VzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfX0hBU19NVUxUSVBMRV9PQ0NVUlJFTkNFUyA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0hBU19NVUxUSVBMRV9PQ0NVUlJFTkNFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBPcHRpb25hbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX19JU19PUFRJT05BTCA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0lTX09QVElPTkFMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIFBsYW5uZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9fSVNfUExBTk5FRCA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0lTX1BMQU5ORUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlZml4PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfX1BSRUZJWCA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX1BSRUZJWDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX19HUk9VUDIgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19HUk9VUDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlZGVjZXNzb3I8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX19QUkVERUNFU1NPUiA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX1BSRURFQ0VTU09SOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIEV2ZW50IERyaXZlbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX19JU19FVkVOVF9EUklWRU4gPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19JU19FVkVOVF9EUklWRU47Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgT25nb2luZzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX19JU19PTkdPSU5HID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fSVNfT05HT0lORzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBSZXBlYXRhYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfX0lTX1JFUEVBVEFCTEUgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19JU19SRVBFQVRBQkxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZWNvbmRpdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX19QUkVDT05ESVRJT04gPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBvc3Rjb25kaXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9fUE9TVENPTkRJVElPTiA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9fR1JPVVAzID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmVha2Rvd24gRWxlbWVudDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfX0JSRUFLRE9XTl9FTEVNRU5UID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Sb2FkbWFwPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9fUk9BRE1BUCA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgRW5hY3RhYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfX0lTX0VOQUNUQUJMRSA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgNjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfX1ZBUklBQklMSVRZX1RZUEUgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA3OwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkFjdGl2aXR5PC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX0ZFQVRVUkVfQ09VTlQgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA4OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLk1ldGhvZFVuaXRJbXBsIDxlbT5NZXRob2QgVW5pdDwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuTWV0aG9kVW5pdEltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0TWV0aG9kVW5pdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBNRVRIT0RfVU5JVCA9IDQ1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfVU5JVF9fTkFNRSA9IE1FVEhPRF9FTEVNRU5UX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfVU5JVF9fR1JPVVAgPSBNRVRIT0RfRUxFTUVOVF9fR1JPVVA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX1VOSVRfX09XTkVEX1JVTEUgPSBNRVRIT0RfRUxFTUVOVF9fT1dORURfUlVMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX1VOSVRfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gTUVUSE9EX0VMRU1FTlRfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX1VOSVRfX0JSSUVGX0RFU0NSSVBUSU9OID0gTUVUSE9EX0VMRU1FTlRfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX1VOSVRfX0lEID0gTUVUSE9EX0VMRU1FTlRfX0lEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX1VOSVRfX09SREVSSU5HX0dVSURFID0gTUVUSE9EX0VMRU1FTlRfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX1VOSVRfX1BSRVNFTlRBVElPTl9OQU1FID0gTUVUSE9EX0VMRU1FTlRfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfVU5JVF9fU1VQUFJFU1NFRCA9IE1FVEhPRF9FTEVNRU5UX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvcHlyaWdodDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9VTklUX19DT1BZUklHSFQgPSBNRVRIT0RfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BdXRob3JzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX1VOSVRfX0FVVEhPUlMgPSBNRVRIT0RfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGFuZ2UgRGF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9VTklUX19DSEFOR0VfREFURSA9IE1FVEhPRF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoYW5nZSBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9VTklUX19DSEFOR0VfREVTQ1JJUFRJT04gPSBNRVRIT0RfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WZXJzaW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX1VOSVRfX1ZFUlNJT04gPSBNRVRIT0RfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgNDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5NZXRob2QgVW5pdDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfVU5JVF9GRUFUVVJFX0NPVU5UID0gTUVUSE9EX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDU7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQ29udGVudERlc2NyaXB0aW9uSW1wbCA8ZW0+Q29udGVudCBEZXNjcmlwdGlvbjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQ29udGVudERlc2NyaXB0aW9uSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRDb250ZW50RGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9ERVNDUklQVElPTiA9IDE0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0RFU0NSSVBUSU9OX19OQU1FID0gTUVUSE9EX1VOSVRfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXA8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfREVTQ1JJUFRJT05fX0dST1VQID0gTUVUSE9EX1VOSVRfX0dST1VQOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfREVTQ1JJUFRJT05fX09XTkVEX1JVTEUgPSBNRVRIT0RfVU5JVF9fT1dORURfUlVMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9ERVNDUklQVElPTl9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBNRVRIT0RfVU5JVF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0RFU0NSSVBUSU9OX19CUklFRl9ERVNDUklQVElPTiA9IE1FVEhPRF9VTklUX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfREVTQ1JJUFRJT05fX0lEID0gTUVUSE9EX1VOSVRfX0lEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9ERVNDUklQVElPTl9fT1JERVJJTkdfR1VJREUgPSBNRVRIT0RfVU5JVF9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0RFU0NSSVBUSU9OX19QUkVTRU5UQVRJT05fTkFNRSA9IE1FVEhPRF9VTklUX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9ERVNDUklQVElPTl9fU1VQUFJFU1NFRCA9IE1FVEhPRF9VTklUX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvcHlyaWdodDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfREVTQ1JJUFRJT05fX0NPUFlSSUdIVCA9IE1FVEhPRF9VTklUX19DT1BZUklHSFQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXV0aG9yczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfREVTQ1JJUFRJT05fX0FVVEhPUlMgPSBNRVRIT0RfVU5JVF9fQVVUSE9SUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGFuZ2UgRGF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfREVTQ1JJUFRJT05fX0NIQU5HRV9EQVRFID0gTUVUSE9EX1VOSVRfX0NIQU5HRV9EQVRFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoYW5nZSBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfREVTQ1JJUFRJT05fX0NIQU5HRV9ERVNDUklQVElPTiA9IE1FVEhPRF9VTklUX19DSEFOR0VfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmVyc2lvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfREVTQ1JJUFRJT05fX1ZFUlNJT04gPSBNRVRIT0RfVU5JVF9fVkVSU0lPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYWluIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9ERVNDUklQVElPTl9fTUFJTl9ERVNDUklQVElPTiA9IE1FVEhPRF9VTklUX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPktleSBDb25zaWRlcmF0aW9uczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfREVTQ1JJUFRJT05fX0tFWV9DT05TSURFUkFUSU9OUyA9IE1FVEhPRF9VTklUX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNlY3Rpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfREVTQ1JJUFRJT05fX1NFQ1RJT04gPSBNRVRIT0RfVU5JVF9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeHRlcm5hbCBJZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfREVTQ1JJUFRJT05fX0VYVEVSTkFMX0lEID0gTUVUSE9EX1VOSVRfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+Q29udGVudCBEZXNjcmlwdGlvbjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0RFU0NSSVBUSU9OX0ZFQVRVUkVfQ09VTlQgPSBNRVRIT0RfVU5JVF9GRUFUVVJFX0NPVU5UICsgNDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5CcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb25JbXBsIDxlbT5CcmVha2Rvd24gRWxlbWVudCBEZXNjcmlwdGlvbjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT04gPSA2OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fTkFNRSA9IENPTlRFTlRfREVTQ1JJUFRJT05fX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXA8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19HUk9VUCA9IENPTlRFTlRfREVTQ1JJUFRJT05fX0dST1VQOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19PV05FRF9SVUxFID0gQ09OVEVOVF9ERVNDUklQVElPTl9fT1dORURfUlVMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gQ09OVEVOVF9ERVNDUklQVElPTl9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fQlJJRUZfREVTQ1JJUFRJT04gPSBDT05URU5UX0RFU0NSSVBUSU9OX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19JRCA9IENPTlRFTlRfREVTQ1JJUFRJT05fX0lEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX09SREVSSU5HX0dVSURFID0gQ09OVEVOVF9ERVNDUklQVElPTl9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fUFJFU0VOVEFUSU9OX05BTUUgPSBDT05URU5UX0RFU0NSSVBUSU9OX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX1NVUFBSRVNTRUQgPSBDT05URU5UX0RFU0NSSVBUSU9OX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvcHlyaWdodDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19DT1BZUklHSFQgPSBDT05URU5UX0RFU0NSSVBUSU9OX19DT1BZUklHSFQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXV0aG9yczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19BVVRIT1JTID0gQ09OVEVOVF9ERVNDUklQVElPTl9fQVVUSE9SUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGFuZ2UgRGF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19DSEFOR0VfREFURSA9IENPTlRFTlRfREVTQ1JJUFRJT05fX0NIQU5HRV9EQVRFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoYW5nZSBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19DSEFOR0VfREVTQ1JJUFRJT04gPSBDT05URU5UX0RFU0NSSVBUSU9OX19DSEFOR0VfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmVyc2lvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19WRVJTSU9OID0gQ09OVEVOVF9ERVNDUklQVElPTl9fVkVSU0lPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYWluIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX01BSU5fREVTQ1JJUFRJT04gPSBDT05URU5UX0RFU0NSSVBUSU9OX19NQUlOX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPktleSBDb25zaWRlcmF0aW9uczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19LRVlfQ09OU0lERVJBVElPTlMgPSBDT05URU5UX0RFU0NSSVBUSU9OX19LRVlfQ09OU0lERVJBVElPTlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2VjdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX1NFQ1RJT04gPSBDT05URU5UX0RFU0NSSVBUSU9OX19TRUNUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4dGVybmFsIElkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX0VYVEVSTkFMX0lEID0gQ09OVEVOVF9ERVNDUklQVElPTl9fRVhURVJOQUxfSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VXNhZ2UgR3VpZGFuY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fVVNBR0VfR1VJREFOQ0UgPSBDT05URU5UX0RFU0NSSVBUSU9OX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkJyZWFrZG93biBFbGVtZW50IERlc2NyaXB0aW9uPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX0ZFQVRVUkVfQ09VTlQgPSBDT05URU5UX0RFU0NSSVBUSU9OX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkFjdGl2aXR5RGVzY3JpcHRpb25JbXBsIDxlbT5BY3Rpdml0eSBEZXNjcmlwdGlvbjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQWN0aXZpdHlEZXNjcmlwdGlvbkltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0QWN0aXZpdHlEZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBBQ1RJVklUWV9ERVNDUklQVElPTiA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX0RFU0NSSVBUSU9OX19OQU1FID0gQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXA8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX0RFU0NSSVBUSU9OX19HUk9VUCA9IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19HUk9VUDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9ERVNDUklQVElPTl9fT1dORURfUlVMRSA9IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19PV05FRF9SVUxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9ERVNDUklQVElPTl9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9ERVNDUklQVElPTl9fQlJJRUZfREVTQ1JJUFRJT04gPSBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9ERVNDUklQVElPTl9fSUQgPSBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9ERVNDUklQVElPTl9fT1JERVJJTkdfR1VJREUgPSBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9ERVNDUklQVElPTl9fUFJFU0VOVEFUSU9OX05BTUUgPSBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX0RFU0NSSVBUSU9OX19TVVBQUkVTU0VEID0gQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29weXJpZ2h0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfREVTQ1JJUFRJT05fX0NPUFlSSUdIVCA9IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19DT1BZUklHSFQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXV0aG9yczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX0RFU0NSSVBUSU9OX19BVVRIT1JTID0gQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX0FVVEhPUlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hhbmdlIERhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9ERVNDUklQVElPTl9fQ0hBTkdFX0RBVEUgPSBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fQ0hBTkdFX0RBVEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hhbmdlIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfREVTQ1JJUFRJT05fX0NIQU5HRV9ERVNDUklQVElPTiA9IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19DSEFOR0VfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmVyc2lvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX0RFU0NSSVBUSU9OX19WRVJTSU9OID0gQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX1ZFUlNJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWFpbiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX0RFU0NSSVBUSU9OX19NQUlOX0RFU0NSSVBUSU9OID0gQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX01BSU5fREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+S2V5IENvbnNpZGVyYXRpb25zPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfREVTQ1JJUFRJT05fX0tFWV9DT05TSURFUkFUSU9OUyA9IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19LRVlfQ09OU0lERVJBVElPTlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2VjdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfREVTQ1JJUFRJT05fX1NFQ1RJT04gPSBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fU0VDVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeHRlcm5hbCBJZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX0RFU0NSSVBUSU9OX19FWFRFUk5BTF9JRCA9IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19FWFRFUk5BTF9JRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Vc2FnZSBHdWlkYW5jZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX0RFU0NSSVBUSU9OX19VU0FHRV9HVUlEQU5DRSA9IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19VU0FHRV9HVUlEQU5DRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BbHRlcm5hdGl2ZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9ERVNDUklQVElPTl9fQUxURVJOQVRJVkVTID0gQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SG93IFRvIFN0YWZmPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfREVTQ1JJUFRJT05fX0hPV19UT19TVEFGRiA9IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlB1cnBvc2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9ERVNDUklQVElPTl9fUFVSUE9TRSA9IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkFjdGl2aXR5IERlc2NyaXB0aW9uPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX0RFU0NSSVBUSU9OX0ZFQVRVUkVfQ09VTlQgPSBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9GRUFUVVJFX0NPVU5UICsgMzsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5BcHBsaWNhYmxlTWV0YUNsYXNzSW5mb0ltcGwgPGVtPkFwcGxpY2FibGUgTWV0YSBDbGFzcyBJbmZvPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5BcHBsaWNhYmxlTWV0YUNsYXNzSW5mb0ltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0QXBwbGljYWJsZU1ldGFDbGFzc0luZm8oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgQVBQTElDQUJMRV9NRVRBX0NMQVNTX0lORk8gPSAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUFBMSUNBQkxFX01FVEFfQ0xBU1NfSU5GT19fTkFNRSA9IFBBQ0tBR0VBQkxFX0VMRU1FTlRfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgUHJpbWFyeSBFeHRlbnNpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUFBMSUNBQkxFX01FVEFfQ0xBU1NfSU5GT19fSVNfUFJJTUFSWV9FWFRFTlNJT04gPSBQQUNLQUdFQUJMRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkFwcGxpY2FibGUgTWV0YSBDbGFzcyBJbmZvPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFQUExJQ0FCTEVfTUVUQV9DTEFTU19JTkZPX0ZFQVRVUkVfQ09VTlQgPSBQQUNLQUdFQUJMRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkNvbnRlbnRFbGVtZW50SW1wbCA8ZW0+Q29udGVudCBFbGVtZW50PC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Db250ZW50RWxlbWVudEltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0Q29udGVudEVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9FTEVNRU5UID0gMTU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfRUxFTUVOVF9fTkFNRSA9IERFU0NSSUJBQkxFX0VMRU1FTlRfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXA8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfRUxFTUVOVF9fR1JPVVAgPSBERVNDUklCQUJMRV9FTEVNRU5UX19HUk9VUDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0VMRU1FTlRfX09XTkVEX1JVTEUgPSBERVNDUklCQUJMRV9FTEVNRU5UX19PV05FRF9SVUxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0VMRU1FTlRfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gREVTQ1JJQkFCTEVfRUxFTUVOVF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0VMRU1FTlRfX0JSSUVGX0RFU0NSSVBUSU9OID0gREVTQ1JJQkFCTEVfRUxFTUVOVF9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0VMRU1FTlRfX0lEID0gREVTQ1JJQkFCTEVfRUxFTUVOVF9fSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0VMRU1FTlRfX09SREVSSU5HX0dVSURFID0gREVTQ1JJQkFCTEVfRUxFTUVOVF9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0VMRU1FTlRfX1BSRVNFTlRBVElPTl9OQU1FID0gREVTQ1JJQkFCTEVfRUxFTUVOVF9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfRUxFTUVOVF9fU1VQUFJFU1NFRCA9IERFU0NSSUJBQkxFX0VMRU1FTlRfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9FTEVNRU5UX19QUkVTRU5UQVRJT04gPSBERVNDUklCQUJMRV9FTEVNRU5UX19QUkVTRU5UQVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RnVsZmlsbDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9FTEVNRU5UX19GVUxGSUxMID0gREVTQ1JJQkFCTEVfRUxFTUVOVF9fRlVMRklMTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBBYnN0cmFjdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfRUxFTUVOVF9fSVNfQUJTVFJBQ1QgPSBERVNDUklCQUJMRV9FTEVNRU5UX19JU19BQlNUUkFDVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob2RlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfRUxFTUVOVF9fTk9ERUlDT04gPSBERVNDUklCQUJMRV9FTEVNRU5UX19OT0RFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TaGFwZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0VMRU1FTlRfX1NIQVBFSUNPTiA9IERFU0NSSUJBQkxFX0VMRU1FTlRfX1NIQVBFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDE8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfRUxFTUVOVF9fR1JPVVAxID0gREVTQ1JJQkFCTEVfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGVja2xpc3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfRUxFTUVOVF9fQ0hFQ0tMSVNUID0gREVTQ1JJQkFCTEVfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db25jZXB0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0VMRU1FTlRfX0NPTkNFUFQgPSBERVNDUklCQUJMRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4YW1wbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfRUxFTUVOVF9fRVhBTVBMRSA9IERFU0NSSUJBQkxFX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZGVsaW5lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0VMRU1FTlRfX0dVSURFTElORSA9IERFU0NSSUJBQkxFX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmV1c2FibGUgQXNzZXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfRUxFTUVOVF9fUkVVU0FCTEVfQVNTRVQgPSBERVNDUklCQUJMRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHBvcnRpbmcgTWF0ZXJpYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfRUxFTUVOVF9fU1VQUE9SVElOR19NQVRFUklBTCA9IERFU0NSSUJBQkxFX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDY7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+V2hpdGVwYXBlcjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9FTEVNRU5UX19XSElURVBBUEVSID0gREVTQ1JJQkFCTEVfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgNzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9FTEVNRU5UX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UID0gREVTQ1JJQkFCTEVfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgODsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9FTEVNRU5UX19WQVJJQUJJTElUWV9UWVBFID0gREVTQ1JJQkFCTEVfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgOTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Db250ZW50IEVsZW1lbnQ8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgPSBERVNDUklCQUJMRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxMDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Xb3JrUHJvZHVjdEltcGwgPGVtPldvcmsgUHJvZHVjdDwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuV29ya1Byb2R1Y3RJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFdvcmtQcm9kdWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVCA9IDgzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfX05BTUUgPSBDT05URU5UX0VMRU1FTlRfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXA8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9fR1JPVVAgPSBDT05URU5UX0VMRU1FTlRfX0dST1VQOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9fT1dORURfUlVMRSA9IENPTlRFTlRfRUxFTUVOVF9fT1dORURfUlVMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IENPTlRFTlRfRUxFTUVOVF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfX0JSSUVGX0RFU0NSSVBUSU9OID0gQ09OVEVOVF9FTEVNRU5UX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9fSUQgPSBDT05URU5UX0VMRU1FTlRfX0lEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX19PUkRFUklOR19HVUlERSA9IENPTlRFTlRfRUxFTUVOVF9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfX1BSRVNFTlRBVElPTl9OQU1FID0gQ09OVEVOVF9FTEVNRU5UX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX19TVVBQUkVTU0VEID0gQ09OVEVOVF9FTEVNRU5UX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9fUFJFU0VOVEFUSU9OID0gQ09OVEVOVF9FTEVNRU5UX19QUkVTRU5UQVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RnVsZmlsbDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX19GVUxGSUxMID0gQ09OVEVOVF9FTEVNRU5UX19GVUxGSUxMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIEFic3RyYWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX19JU19BQlNUUkFDVCA9IENPTlRFTlRfRUxFTUVOVF9fSVNfQUJTVFJBQ1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm9kZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfX05PREVJQ09OID0gQ09OVEVOVF9FTEVNRU5UX19OT0RFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TaGFwZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfX1NIQVBFSUNPTiA9IENPTlRFTlRfRUxFTUVOVF9fU0hBUEVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX19HUk9VUDEgPSBDT05URU5UX0VMRU1FTlRfX0dST1VQMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGVja2xpc3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9fQ0hFQ0tMSVNUID0gQ09OVEVOVF9FTEVNRU5UX19DSEVDS0xJU1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29uY2VwdDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX19DT05DRVBUID0gQ09OVEVOVF9FTEVNRU5UX19DT05DRVBUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4YW1wbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9fRVhBTVBMRSA9IENPTlRFTlRfRUxFTUVOVF9fRVhBTVBMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkZWxpbmU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9fR1VJREVMSU5FID0gQ09OVEVOVF9FTEVNRU5UX19HVUlERUxJTkU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmV1c2FibGUgQXNzZXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9fUkVVU0FCTEVfQVNTRVQgPSBDT05URU5UX0VMRU1FTlRfX1JFVVNBQkxFX0FTU0VUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHBvcnRpbmcgTWF0ZXJpYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9fU1VQUE9SVElOR19NQVRFUklBTCA9IENPTlRFTlRfRUxFTUVOVF9fU1VQUE9SVElOR19NQVRFUklBTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5XaGl0ZXBhcGVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfX1dISVRFUEFQRVIgPSBDT05URU5UX0VMRU1FTlRfX1dISVRFUEFQRVI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVCA9IENPTlRFTlRfRUxFTUVOVF9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX19WQVJJQUJJTElUWV9UWVBFID0gQ09OVEVOVF9FTEVNRU5UX19WQVJJQUJJTElUWV9UWVBFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX19HUk9VUDIgPSBDT05URU5UX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXN0aW1hdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9fRVNUSU1BVEUgPSBDT05URU5UX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXN0aW1hdGlvbiBDb25zaWRlcmF0aW9uczwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX19FU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TID0gQ09OVEVOVF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlcG9ydDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX19SRVBPUlQgPSBDT05URU5UX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGVtcGxhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9fVEVNUExBVEUgPSBDT05URU5UX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VG9vbCBNZW50b3I8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9fVE9PTF9NRU5UT1IgPSBDT05URU5UX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDU7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+V29yayBQcm9kdWN0PC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9GRUFUVVJFX0NPVU5UID0gQ09OVEVOVF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA2OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkFydGlmYWN0SW1wbCA8ZW0+QXJ0aWZhY3Q8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkFydGlmYWN0SW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRBcnRpZmFjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBBUlRJRkFDVCA9IDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSVElGQUNUX19OQU1FID0gV09SS19QUk9EVUNUX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlRJRkFDVF9fR1JPVVAgPSBXT1JLX1BST0RVQ1RfX0dST1VQOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSVElGQUNUX19PV05FRF9SVUxFID0gV09SS19QUk9EVUNUX19PV05FRF9SVUxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlRJRkFDVF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBXT1JLX1BST0RVQ1RfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1RfX0JSSUVGX0RFU0NSSVBUSU9OID0gV09SS19QUk9EVUNUX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSVElGQUNUX19JRCA9IFdPUktfUFJPRFVDVF9fSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlRJRkFDVF9fT1JERVJJTkdfR1VJREUgPSBXT1JLX1BST0RVQ1RfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1RfX1BSRVNFTlRBVElPTl9OQU1FID0gV09SS19QUk9EVUNUX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1RfX1NVUFBSRVNTRUQgPSBXT1JLX1BST0RVQ1RfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1RfX1BSRVNFTlRBVElPTiA9IFdPUktfUFJPRFVDVF9fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZ1bGZpbGw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSVElGQUNUX19GVUxGSUxMID0gV09SS19QUk9EVUNUX19GVUxGSUxMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIEFic3RyYWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1RfX0lTX0FCU1RSQUNUID0gV09SS19QUk9EVUNUX19JU19BQlNUUkFDVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob2RlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSVElGQUNUX19OT0RFSUNPTiA9IFdPUktfUFJPRFVDVF9fTk9ERUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2hhcGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1RfX1NIQVBFSUNPTiA9IFdPUktfUFJPRFVDVF9fU0hBUEVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1RfX0dST1VQMSA9IFdPUktfUFJPRFVDVF9fR1JPVVAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoZWNrbGlzdDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1RfX0NIRUNLTElTVCA9IFdPUktfUFJPRFVDVF9fQ0hFQ0tMSVNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbmNlcHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSVElGQUNUX19DT05DRVBUID0gV09SS19QUk9EVUNUX19DT05DRVBUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4YW1wbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSVElGQUNUX19FWEFNUExFID0gV09SS19QUk9EVUNUX19FWEFNUExFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWRlbGluZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1RfX0dVSURFTElORSA9IFdPUktfUFJPRFVDVF9fR1VJREVMSU5FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJldXNhYmxlIEFzc2V0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlRJRkFDVF9fUkVVU0FCTEVfQVNTRVQgPSBXT1JLX1BST0RVQ1RfX1JFVVNBQkxFX0FTU0VUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHBvcnRpbmcgTWF0ZXJpYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSVElGQUNUX19TVVBQT1JUSU5HX01BVEVSSUFMID0gV09SS19QUk9EVUNUX19TVVBQT1JUSU5HX01BVEVSSUFMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldoaXRlcGFwZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSVElGQUNUX19XSElURVBBUEVSID0gV09SS19QUk9EVUNUX19XSElURVBBUEVSOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlRJRkFDVF9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVCA9IFdPUktfUFJPRFVDVF9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1RfX1ZBUklBQklMSVRZX1RZUEUgPSBXT1JLX1BST0RVQ1RfX1ZBUklBQklMSVRZX1RZUEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlRJRkFDVF9fR1JPVVAyID0gV09SS19QUk9EVUNUX19HUk9VUDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXN0aW1hdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSVElGQUNUX19FU1RJTUFURSA9IFdPUktfUFJPRFVDVF9fRVNUSU1BVEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXN0aW1hdGlvbiBDb25zaWRlcmF0aW9uczwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1RfX0VTVElNQVRJT05fQ09OU0lERVJBVElPTlMgPSBXT1JLX1BST0RVQ1RfX0VTVElNQVRJT05fQ09OU0lERVJBVElPTlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVwb3J0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlRJRkFDVF9fUkVQT1JUID0gV09SS19QUk9EVUNUX19SRVBPUlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGVtcGxhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSVElGQUNUX19URU1QTEFURSA9IFdPUktfUFJPRFVDVF9fVEVNUExBVEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VG9vbCBNZW50b3I8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSVElGQUNUX19UT09MX01FTlRPUiA9IFdPUktfUFJPRFVDVF9fVE9PTF9NRU5UT1I7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlRJRkFDVF9fR1JPVVAzID0gV09SS19QUk9EVUNUX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbnRhaW5lZCBBcnRpZmFjdDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1RfX0NPTlRBSU5FRF9BUlRJRkFDVCA9IFdPUktfUFJPRFVDVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5BcnRpZmFjdDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlRJRkFDVF9GRUFUVVJFX0NPVU5UID0gV09SS19QUk9EVUNUX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLldvcmtQcm9kdWN0RGVzY3JpcHRpb25JbXBsIDxlbT5Xb3JrIFByb2R1Y3QgRGVzY3JpcHRpb248L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLldvcmtQcm9kdWN0RGVzY3JpcHRpb25JbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFdvcmtQcm9kdWN0RGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OID0gODQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fTkFNRSA9IENPTlRFTlRfREVTQ1JJUFRJT05fX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXA8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fR1JPVVAgPSBDT05URU5UX0RFU0NSSVBUSU9OX19HUk9VUDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX09XTkVEX1JVTEUgPSBDT05URU5UX0RFU0NSSVBUSU9OX19PV05FRF9SVUxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gQ09OVEVOVF9ERVNDUklQVElPTl9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX0JSSUVGX0RFU0NSSVBUSU9OID0gQ09OVEVOVF9ERVNDUklQVElPTl9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX0lEID0gQ09OVEVOVF9ERVNDUklQVElPTl9fSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX09SREVSSU5HX0dVSURFID0gQ09OVEVOVF9ERVNDUklQVElPTl9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX1BSRVNFTlRBVElPTl9OQU1FID0gQ09OVEVOVF9ERVNDUklQVElPTl9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fU1VQUFJFU1NFRCA9IENPTlRFTlRfREVTQ1JJUFRJT05fX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29weXJpZ2h0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19DT1BZUklHSFQgPSBDT05URU5UX0RFU0NSSVBUSU9OX19DT1BZUklHSFQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXV0aG9yczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fQVVUSE9SUyA9IENPTlRFTlRfREVTQ1JJUFRJT05fX0FVVEhPUlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hhbmdlIERhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX0NIQU5HRV9EQVRFID0gQ09OVEVOVF9ERVNDUklQVElPTl9fQ0hBTkdFX0RBVEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hhbmdlIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19DSEFOR0VfREVTQ1JJUFRJT04gPSBDT05URU5UX0RFU0NSSVBUSU9OX19DSEFOR0VfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmVyc2lvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fVkVSU0lPTiA9IENPTlRFTlRfREVTQ1JJUFRJT05fX1ZFUlNJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWFpbiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fTUFJTl9ERVNDUklQVElPTiA9IENPTlRFTlRfREVTQ1JJUFRJT05fX01BSU5fREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+S2V5IENvbnNpZGVyYXRpb25zPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19LRVlfQ09OU0lERVJBVElPTlMgPSBDT05URU5UX0RFU0NSSVBUSU9OX19LRVlfQ09OU0lERVJBVElPTlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2VjdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19TRUNUSU9OID0gQ09OVEVOVF9ERVNDUklQVElPTl9fU0VDVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeHRlcm5hbCBJZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fRVhURVJOQUxfSUQgPSBDT05URU5UX0RFU0NSSVBUSU9OX19FWFRFUk5BTF9JRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbXBhY3QgT2YgTm90IEhhdmluZzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fSU1QQUNUX09GX05PVF9IQVZJTkcgPSBDT05URU5UX0RFU0NSSVBUSU9OX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlB1cnBvc2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX1BVUlBPU0UgPSBDT05URU5UX0RFU0NSSVBUSU9OX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlYXNvbnMgRm9yIE5vdCBOZWVkaW5nPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19SRUFTT05TX0ZPUl9OT1RfTkVFRElORyA9IENPTlRFTlRfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+V29yayBQcm9kdWN0IERlc2NyaXB0aW9uPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9GRUFUVVJFX0NPVU5UID0gQ09OVEVOVF9ERVNDUklQVElPTl9GRUFUVVJFX0NPVU5UICsgMzsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5BcnRpZmFjdERlc2NyaXB0aW9uSW1wbCA8ZW0+QXJ0aWZhY3QgRGVzY3JpcHRpb248L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkFydGlmYWN0RGVzY3JpcHRpb25JbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldEFydGlmYWN0RGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1RfREVTQ1JJUFRJT04gPSA0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlRJRkFDVF9ERVNDUklQVElPTl9fTkFNRSA9IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1RfREVTQ1JJUFRJT05fX0dST1VQID0gV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19HUk9VUDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlRJRkFDVF9ERVNDUklQVElPTl9fT1dORURfUlVMRSA9IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fT1dORURfUlVMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1RfREVTQ1JJUFRJT05fX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSVElGQUNUX0RFU0NSSVBUSU9OX19CUklFRl9ERVNDUklQVElPTiA9IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlRJRkFDVF9ERVNDUklQVElPTl9fSUQgPSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX0lEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1RfREVTQ1JJUFRJT05fX09SREVSSU5HX0dVSURFID0gV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSVElGQUNUX0RFU0NSSVBUSU9OX19QUkVTRU5UQVRJT05fTkFNRSA9IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSVElGQUNUX0RFU0NSSVBUSU9OX19TVVBQUkVTU0VEID0gV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvcHlyaWdodDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSVElGQUNUX0RFU0NSSVBUSU9OX19DT1BZUklHSFQgPSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX0NPUFlSSUdIVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BdXRob3JzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1RfREVTQ1JJUFRJT05fX0FVVEhPUlMgPSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX0FVVEhPUlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hhbmdlIERhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlRJRkFDVF9ERVNDUklQVElPTl9fQ0hBTkdFX0RBVEUgPSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX0NIQU5HRV9EQVRFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoYW5nZSBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSVElGQUNUX0RFU0NSSVBUSU9OX19DSEFOR0VfREVTQ1JJUFRJT04gPSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX0NIQU5HRV9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WZXJzaW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1RfREVTQ1JJUFRJT05fX1ZFUlNJT04gPSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX1ZFUlNJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWFpbiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSVElGQUNUX0RFU0NSSVBUSU9OX19NQUlOX0RFU0NSSVBUSU9OID0gV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19NQUlOX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPktleSBDb25zaWRlcmF0aW9uczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSVElGQUNUX0RFU0NSSVBUSU9OX19LRVlfQ09OU0lERVJBVElPTlMgPSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX0tFWV9DT05TSURFUkFUSU9OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TZWN0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlRJRkFDVF9ERVNDUklQVElPTl9fU0VDVElPTiA9IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fU0VDVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeHRlcm5hbCBJZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSVElGQUNUX0RFU0NSSVBUSU9OX19FWFRFUk5BTF9JRCA9IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fRVhURVJOQUxfSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW1wYWN0IE9mIE5vdCBIYXZpbmc8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlRJRkFDVF9ERVNDUklQVElPTl9fSU1QQUNUX09GX05PVF9IQVZJTkcgPSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX0lNUEFDVF9PRl9OT1RfSEFWSU5HOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlB1cnBvc2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlRJRkFDVF9ERVNDUklQVElPTl9fUFVSUE9TRSA9IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fUFVSUE9TRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZWFzb25zIEZvciBOb3QgTmVlZGluZzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSVElGQUNUX0RFU0NSSVBUSU9OX19SRUFTT05TX0ZPUl9OT1RfTkVFRElORyA9IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fUkVBU09OU19GT1JfTk9UX05FRURJTkc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgT3V0bGluZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSVElGQUNUX0RFU0NSSVBUSU9OX19CUklFRl9PVVRMSU5FID0gV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlcHJlc2VudGF0aW9uIE9wdGlvbnM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlRJRkFDVF9ERVNDUklQVElPTl9fUkVQUkVTRU5UQVRJT05fT1BUSU9OUyA9IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXByZXNlbnRhdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSVElGQUNUX0RFU0NSSVBUSU9OX19SRVBSRVNFTlRBVElPTiA9IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob3RhdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSVElGQUNUX0RFU0NSSVBUSU9OX19OT1RBVElPTiA9IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9GRUFUVVJFX0NPVU5UICsgMzsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5BcnRpZmFjdCBEZXNjcmlwdGlvbjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlRJRkFDVF9ERVNDUklQVElPTl9GRUFUVVJFX0NPVU5UID0gV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX0ZFQVRVUkVfQ09VTlQgKyA0OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlByb2Nlc3NJbXBsIDxlbT5Qcm9jZXNzPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Qcm9jZXNzSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRQcm9jZXNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFBST0NFU1MgPSA1NDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19fTkFNRSA9IEFDVElWSVRZX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX19HUk9VUCA9IEFDVElWSVRZX19HUk9VUDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX19PV05FRF9SVUxFID0gQUNUSVZJVFlfX09XTkVEX1JVTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gQUNUSVZJVFlfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19fQlJJRUZfREVTQ1JJUFRJT04gPSBBQ1RJVklUWV9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX19JRCA9IEFDVElWSVRZX19JRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfX09SREVSSU5HX0dVSURFID0gQUNUSVZJVFlfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19fUFJFU0VOVEFUSU9OX05BTUUgPSBBQ1RJVklUWV9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfX1NVUFBSRVNTRUQgPSBBQ1RJVklUWV9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX19QUkVTRU5UQVRJT04gPSBBQ1RJVklUWV9fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZ1bGZpbGw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfX0ZVTEZJTEwgPSBBQ1RJVklUWV9fRlVMRklMTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBBYnN0cmFjdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfX0lTX0FCU1RSQUNUID0gQUNUSVZJVFlfX0lTX0FCU1RSQUNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19fTk9ERUlDT04gPSBBQ1RJVklUWV9fTk9ERUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2hhcGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19fU0hBUEVJQ09OID0gQUNUSVZJVFlfX1NIQVBFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50ZWQgQWZ0ZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX19QUkVTRU5URURfQUZURVIgPSBBQ1RJVklUWV9fUFJFU0VOVEVEX0FGVEVSOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRlZCBCZWZvcmU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX19QUkVTRU5URURfQkVGT1JFID0gQUNUSVZJVFlfX1BSRVNFTlRFRF9CRUZPUkU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UGxhbm5pbmcgRGF0YTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfX1BMQU5OSU5HX0RBVEEgPSBBQ1RJVklUWV9fUExBTk5JTkdfREFUQTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBlciBBY3Rpdml0eTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfX1NVUEVSX0FDVElWSVRZID0gQUNUSVZJVFlfX1NVUEVSX0FDVElWSVRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19fR1JPVVAxID0gQUNUSVZJVFlfX0dST1VQMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGVja2xpc3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfX0NIRUNLTElTVCA9IEFDVElWSVRZX19DSEVDS0xJU1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29uY2VwdDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19fQ09OQ0VQVCA9IEFDVElWSVRZX19DT05DRVBUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4YW1wbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfX0VYQU1QTEUgPSBBQ1RJVklUWV9fRVhBTVBMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkZWxpbmU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfX0dVSURFTElORSA9IEFDVElWSVRZX19HVUlERUxJTkU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmV1c2FibGUgQXNzZXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfX1JFVVNBQkxFX0FTU0VUID0gQUNUSVZJVFlfX1JFVVNBQkxFX0FTU0VUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHBvcnRpbmcgTWF0ZXJpYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfX1NVUFBPUlRJTkdfTUFURVJJQUwgPSBBQ1RJVklUWV9fU1VQUE9SVElOR19NQVRFUklBTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5XaGl0ZXBhcGVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX19XSElURVBBUEVSID0gQUNUSVZJVFlfX1dISVRFUEFQRVI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SGFzIE11bHRpcGxlIE9jY3VycmVuY2VzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19fSEFTX01VTFRJUExFX09DQ1VSUkVOQ0VTID0gQUNUSVZJVFlfX0hBU19NVUxUSVBMRV9PQ0NVUlJFTkNFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBPcHRpb25hbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfX0lTX09QVElPTkFMID0gQUNUSVZJVFlfX0lTX09QVElPTkFMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIFBsYW5uZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX19JU19QTEFOTkVEID0gQUNUSVZJVFlfX0lTX1BMQU5ORUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlZml4PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19fUFJFRklYID0gQUNUSVZJVFlfX1BSRUZJWDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfX0dST1VQMiA9IEFDVElWSVRZX19HUk9VUDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlZGVjZXNzb3I8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfX1BSRURFQ0VTU09SID0gQUNUSVZJVFlfX1BSRURFQ0VTU09SOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIEV2ZW50IERyaXZlbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfX0lTX0VWRU5UX0RSSVZFTiA9IEFDVElWSVRZX19JU19FVkVOVF9EUklWRU47Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgT25nb2luZzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfX0lTX09OR09JTkcgPSBBQ1RJVklUWV9fSVNfT05HT0lORzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBSZXBlYXRhYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19fSVNfUkVQRUFUQUJMRSA9IEFDVElWSVRZX19JU19SRVBFQVRBQkxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZWNvbmRpdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfX1BSRUNPTkRJVElPTiA9IEFDVElWSVRZX19QUkVDT05ESVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UG9zdGNvbmRpdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfX1BPU1RDT05ESVRJT04gPSBBQ1RJVklUWV9fUE9TVENPTkRJVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfX0dST1VQMyA9IEFDVElWSVRZX19HUk9VUDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJlYWtkb3duIEVsZW1lbnQ8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfX0JSRUFLRE9XTl9FTEVNRU5UID0gQUNUSVZJVFlfX0JSRUFLRE9XTl9FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJvYWRtYXA8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfX1JPQURNQVAgPSBBQ1RJVklUWV9fUk9BRE1BUDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBFbmFjdGFibGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX19JU19FTkFDVEFCTEUgPSBBQ1RJVklUWV9fSVNfRU5BQ1RBQkxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UID0gQUNUSVZJVFlfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfX1ZBUklBQklMSVRZX1RZUEUgPSBBQ1RJVklUWV9fVkFSSUFCSUxJVFlfVFlQRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbmNsdWRlcyBQYXR0ZXJuPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX19JTkNMVURFU19QQVRURVJOID0gQUNUSVZJVFlfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVmYXVsdCBDb250ZXh0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19fREVGQVVMVF9DT05URVhUID0gQUNUSVZJVFlfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFsaWQgQ29udGV4dDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19fVkFMSURfQ09OVEVYVCA9IEFDVElWSVRZX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRpYWdyYW0gVVJJPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19fRElBR1JBTV9VUkkgPSBBQ1RJVklUWV9GRUFUVVJFX0NPVU5UICsgMzsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Qcm9jZXNzPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfRkVBVFVSRV9DT1VOVCA9IEFDVElWSVRZX0ZFQVRVUkVfQ09VTlQgKyA0OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkNhcGFiaWxpdHlQYXR0ZXJuSW1wbCA8ZW0+Q2FwYWJpbGl0eSBQYXR0ZXJuPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5DYXBhYmlsaXR5UGF0dGVybkltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0Q2FwYWJpbGl0eVBhdHRlcm4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgQ0FQQUJJTElUWV9QQVRURVJOID0gNzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0FQQUJJTElUWV9QQVRURVJOX19OQU1FID0gUFJPQ0VTU19fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0FQQUJJTElUWV9QQVRURVJOX19HUk9VUCA9IFBST0NFU1NfX0dST1VQOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENBUEFCSUxJVFlfUEFUVEVSTl9fT1dORURfUlVMRSA9IFBST0NFU1NfX09XTkVEX1JVTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENBUEFCSUxJVFlfUEFUVEVSTl9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBQUk9DRVNTX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENBUEFCSUxJVFlfUEFUVEVSTl9fQlJJRUZfREVTQ1JJUFRJT04gPSBQUk9DRVNTX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENBUEFCSUxJVFlfUEFUVEVSTl9fSUQgPSBQUk9DRVNTX19JRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENBUEFCSUxJVFlfUEFUVEVSTl9fT1JERVJJTkdfR1VJREUgPSBQUk9DRVNTX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENBUEFCSUxJVFlfUEFUVEVSTl9fUFJFU0VOVEFUSU9OX05BTUUgPSBQUk9DRVNTX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0FQQUJJTElUWV9QQVRURVJOX19TVVBQUkVTU0VEID0gUFJPQ0VTU19fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDQVBBQklMSVRZX1BBVFRFUk5fX1BSRVNFTlRBVElPTiA9IFBST0NFU1NfX1BSRVNFTlRBVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GdWxmaWxsPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDQVBBQklMSVRZX1BBVFRFUk5fX0ZVTEZJTEwgPSBQUk9DRVNTX19GVUxGSUxMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIEFic3RyYWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0FQQUJJTElUWV9QQVRURVJOX19JU19BQlNUUkFDVCA9IFBST0NFU1NfX0lTX0FCU1RSQUNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0FQQUJJTElUWV9QQVRURVJOX19OT0RFSUNPTiA9IFBST0NFU1NfX05PREVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNoYXBlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENBUEFCSUxJVFlfUEFUVEVSTl9fU0hBUEVJQ09OID0gUFJPQ0VTU19fU0hBUEVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRlZCBBZnRlcjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENBUEFCSUxJVFlfUEFUVEVSTl9fUFJFU0VOVEVEX0FGVEVSID0gUFJPQ0VTU19fUFJFU0VOVEVEX0FGVEVSOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRlZCBCZWZvcmU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDQVBBQklMSVRZX1BBVFRFUk5fX1BSRVNFTlRFRF9CRUZPUkUgPSBQUk9DRVNTX19QUkVTRU5URURfQkVGT1JFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBsYW5uaW5nIERhdGE8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDQVBBQklMSVRZX1BBVFRFUk5fX1BMQU5OSU5HX0RBVEEgPSBQUk9DRVNTX19QTEFOTklOR19EQVRBOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cGVyIEFjdGl2aXR5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0FQQUJJTElUWV9QQVRURVJOX19TVVBFUl9BQ1RJVklUWSA9IFBST0NFU1NfX1NVUEVSX0FDVElWSVRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0FQQUJJTElUWV9QQVRURVJOX19HUk9VUDEgPSBQUk9DRVNTX19HUk9VUDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hlY2tsaXN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDQVBBQklMSVRZX1BBVFRFUk5fX0NIRUNLTElTVCA9IFBST0NFU1NfX0NIRUNLTElTVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db25jZXB0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDQVBBQklMSVRZX1BBVFRFUk5fX0NPTkNFUFQgPSBQUk9DRVNTX19DT05DRVBUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4YW1wbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENBUEFCSUxJVFlfUEFUVEVSTl9fRVhBTVBMRSA9IFBST0NFU1NfX0VYQU1QTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZGVsaW5lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDQVBBQklMSVRZX1BBVFRFUk5fX0dVSURFTElORSA9IFBST0NFU1NfX0dVSURFTElORTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXVzYWJsZSBBc3NldDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0FQQUJJTElUWV9QQVRURVJOX19SRVVTQUJMRV9BU1NFVCA9IFBST0NFU1NfX1JFVVNBQkxFX0FTU0VUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHBvcnRpbmcgTWF0ZXJpYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENBUEFCSUxJVFlfUEFUVEVSTl9fU1VQUE9SVElOR19NQVRFUklBTCA9IFBST0NFU1NfX1NVUFBPUlRJTkdfTUFURVJJQUw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+V2hpdGVwYXBlcjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0FQQUJJTElUWV9QQVRURVJOX19XSElURVBBUEVSID0gUFJPQ0VTU19fV0hJVEVQQVBFUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5IYXMgTXVsdGlwbGUgT2NjdXJyZW5jZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDQVBBQklMSVRZX1BBVFRFUk5fX0hBU19NVUxUSVBMRV9PQ0NVUlJFTkNFUyA9IFBST0NFU1NfX0hBU19NVUxUSVBMRV9PQ0NVUlJFTkNFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBPcHRpb25hbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENBUEFCSUxJVFlfUEFUVEVSTl9fSVNfT1BUSU9OQUwgPSBQUk9DRVNTX19JU19PUFRJT05BTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBQbGFubmVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0FQQUJJTElUWV9QQVRURVJOX19JU19QTEFOTkVEID0gUFJPQ0VTU19fSVNfUExBTk5FRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVmaXg8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDQVBBQklMSVRZX1BBVFRFUk5fX1BSRUZJWCA9IFBST0NFU1NfX1BSRUZJWDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENBUEFCSUxJVFlfUEFUVEVSTl9fR1JPVVAyID0gUFJPQ0VTU19fR1JPVVAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZWRlY2Vzc29yPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDQVBBQklMSVRZX1BBVFRFUk5fX1BSRURFQ0VTU09SID0gUFJPQ0VTU19fUFJFREVDRVNTT1I7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgRXZlbnQgRHJpdmVuPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0FQQUJJTElUWV9QQVRURVJOX19JU19FVkVOVF9EUklWRU4gPSBQUk9DRVNTX19JU19FVkVOVF9EUklWRU47Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgT25nb2luZzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENBUEFCSUxJVFlfUEFUVEVSTl9fSVNfT05HT0lORyA9IFBST0NFU1NfX0lTX09OR09JTkc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgUmVwZWF0YWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENBUEFCSUxJVFlfUEFUVEVSTl9fSVNfUkVQRUFUQUJMRSA9IFBST0NFU1NfX0lTX1JFUEVBVEFCTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlY29uZGl0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0FQQUJJTElUWV9QQVRURVJOX19QUkVDT05ESVRJT04gPSBQUk9DRVNTX19QUkVDT05ESVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UG9zdGNvbmRpdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENBUEFCSUxJVFlfUEFUVEVSTl9fUE9TVENPTkRJVElPTiA9IFBST0NFU1NfX1BPU1RDT05ESVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDQVBBQklMSVRZX1BBVFRFUk5fX0dST1VQMyA9IFBST0NFU1NfX0dST1VQMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmVha2Rvd24gRWxlbWVudDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0FQQUJJTElUWV9QQVRURVJOX19CUkVBS0RPV05fRUxFTUVOVCA9IFBST0NFU1NfX0JSRUFLRE9XTl9FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJvYWRtYXA8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENBUEFCSUxJVFlfUEFUVEVSTl9fUk9BRE1BUCA9IFBST0NFU1NfX1JPQURNQVA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgRW5hY3RhYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0FQQUJJTElUWV9QQVRURVJOX19JU19FTkFDVEFCTEUgPSBQUk9DRVNTX19JU19FTkFDVEFCTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENBUEFCSUxJVFlfUEFUVEVSTl9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVCA9IFBST0NFU1NfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENBUEFCSUxJVFlfUEFUVEVSTl9fVkFSSUFCSUxJVFlfVFlQRSA9IFBST0NFU1NfX1ZBUklBQklMSVRZX1RZUEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW5jbHVkZXMgUGF0dGVybjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0FQQUJJTElUWV9QQVRURVJOX19JTkNMVURFU19QQVRURVJOID0gUFJPQ0VTU19fSU5DTFVERVNfUEFUVEVSTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZWZhdWx0IENvbnRleHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDQVBBQklMSVRZX1BBVFRFUk5fX0RFRkFVTFRfQ09OVEVYVCA9IFBST0NFU1NfX0RFRkFVTFRfQ09OVEVYVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYWxpZCBDb250ZXh0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDQVBBQklMSVRZX1BBVFRFUk5fX1ZBTElEX0NPTlRFWFQgPSBQUk9DRVNTX19WQUxJRF9DT05URVhUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRpYWdyYW0gVVJJPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0FQQUJJTElUWV9QQVRURVJOX19ESUFHUkFNX1VSSSA9IFBST0NFU1NfX0RJQUdSQU1fVVJJOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkNhcGFiaWxpdHkgUGF0dGVybjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDQVBBQklMSVRZX1BBVFRFUk5fRkVBVFVSRV9DT1VOVCA9IFBST0NFU1NfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuR3VpZGFuY2VJbXBsIDxlbT5HdWlkYW5jZTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuR3VpZGFuY2VJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldEd1aWRhbmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IEdVSURBTkNFID0gMzQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURBTkNFX19OQU1FID0gQ09OVEVOVF9FTEVNRU5UX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHVUlEQU5DRV9fR1JPVVAgPSBDT05URU5UX0VMRU1FTlRfX0dST1VQOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURBTkNFX19PV05FRF9SVUxFID0gQ09OVEVOVF9FTEVNRU5UX19PV05FRF9SVUxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHVUlEQU5DRV9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBDT05URU5UX0VMRU1FTlRfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREFOQ0VfX0JSSUVGX0RFU0NSSVBUSU9OID0gQ09OVEVOVF9FTEVNRU5UX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURBTkNFX19JRCA9IENPTlRFTlRfRUxFTUVOVF9fSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHVUlEQU5DRV9fT1JERVJJTkdfR1VJREUgPSBDT05URU5UX0VMRU1FTlRfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREFOQ0VfX1BSRVNFTlRBVElPTl9OQU1FID0gQ09OVEVOVF9FTEVNRU5UX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREFOQ0VfX1NVUFBSRVNTRUQgPSBDT05URU5UX0VMRU1FTlRfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREFOQ0VfX1BSRVNFTlRBVElPTiA9IENPTlRFTlRfRUxFTUVOVF9fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZ1bGZpbGw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURBTkNFX19GVUxGSUxMID0gQ09OVEVOVF9FTEVNRU5UX19GVUxGSUxMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIEFic3RyYWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREFOQ0VfX0lTX0FCU1RSQUNUID0gQ09OVEVOVF9FTEVNRU5UX19JU19BQlNUUkFDVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob2RlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURBTkNFX19OT0RFSUNPTiA9IENPTlRFTlRfRUxFTUVOVF9fTk9ERUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2hhcGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREFOQ0VfX1NIQVBFSUNPTiA9IENPTlRFTlRfRUxFTUVOVF9fU0hBUEVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREFOQ0VfX0dST1VQMSA9IENPTlRFTlRfRUxFTUVOVF9fR1JPVVAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoZWNrbGlzdDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREFOQ0VfX0NIRUNLTElTVCA9IENPTlRFTlRfRUxFTUVOVF9fQ0hFQ0tMSVNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbmNlcHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURBTkNFX19DT05DRVBUID0gQ09OVEVOVF9FTEVNRU5UX19DT05DRVBUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4YW1wbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURBTkNFX19FWEFNUExFID0gQ09OVEVOVF9FTEVNRU5UX19FWEFNUExFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWRlbGluZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREFOQ0VfX0dVSURFTElORSA9IENPTlRFTlRfRUxFTUVOVF9fR1VJREVMSU5FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJldXNhYmxlIEFzc2V0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHVUlEQU5DRV9fUkVVU0FCTEVfQVNTRVQgPSBDT05URU5UX0VMRU1FTlRfX1JFVVNBQkxFX0FTU0VUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHBvcnRpbmcgTWF0ZXJpYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURBTkNFX19TVVBQT1JUSU5HX01BVEVSSUFMID0gQ09OVEVOVF9FTEVNRU5UX19TVVBQT1JUSU5HX01BVEVSSUFMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldoaXRlcGFwZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURBTkNFX19XSElURVBBUEVSID0gQ09OVEVOVF9FTEVNRU5UX19XSElURVBBUEVSOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHVUlEQU5DRV9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVCA9IENPTlRFTlRfRUxFTUVOVF9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREFOQ0VfX1ZBUklBQklMSVRZX1RZUEUgPSBDT05URU5UX0VMRU1FTlRfX1ZBUklBQklMSVRZX1RZUEU7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+R3VpZGFuY2U8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREFOQ0VfRkVBVFVSRV9DT1VOVCA9IENPTlRFTlRfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5DaGVja2xpc3RJbXBsIDxlbT5DaGVja2xpc3Q8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkNoZWNrbGlzdEltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0Q2hlY2tsaXN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IENIRUNLTElTVCA9IDg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENIRUNLTElTVF9fTkFNRSA9IEdVSURBTkNFX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDSEVDS0xJU1RfX0dST1VQID0gR1VJREFOQ0VfX0dST1VQOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENIRUNLTElTVF9fT1dORURfUlVMRSA9IEdVSURBTkNFX19PV05FRF9SVUxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDSEVDS0xJU1RfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gR1VJREFOQ0VfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0hFQ0tMSVNUX19CUklFRl9ERVNDUklQVElPTiA9IEdVSURBTkNFX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENIRUNLTElTVF9fSUQgPSBHVUlEQU5DRV9fSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDSEVDS0xJU1RfX09SREVSSU5HX0dVSURFID0gR1VJREFOQ0VfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0hFQ0tMSVNUX19QUkVTRU5UQVRJT05fTkFNRSA9IEdVSURBTkNFX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0hFQ0tMSVNUX19TVVBQUkVTU0VEID0gR1VJREFOQ0VfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0hFQ0tMSVNUX19QUkVTRU5UQVRJT04gPSBHVUlEQU5DRV9fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZ1bGZpbGw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENIRUNLTElTVF9fRlVMRklMTCA9IEdVSURBTkNFX19GVUxGSUxMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIEFic3RyYWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0hFQ0tMSVNUX19JU19BQlNUUkFDVCA9IEdVSURBTkNFX19JU19BQlNUUkFDVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob2RlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENIRUNLTElTVF9fTk9ERUlDT04gPSBHVUlEQU5DRV9fTk9ERUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2hhcGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0hFQ0tMSVNUX19TSEFQRUlDT04gPSBHVUlEQU5DRV9fU0hBUEVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0hFQ0tMSVNUX19HUk9VUDEgPSBHVUlEQU5DRV9fR1JPVVAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoZWNrbGlzdDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0hFQ0tMSVNUX19DSEVDS0xJU1QgPSBHVUlEQU5DRV9fQ0hFQ0tMSVNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbmNlcHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENIRUNLTElTVF9fQ09OQ0VQVCA9IEdVSURBTkNFX19DT05DRVBUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4YW1wbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENIRUNLTElTVF9fRVhBTVBMRSA9IEdVSURBTkNFX19FWEFNUExFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWRlbGluZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0hFQ0tMSVNUX19HVUlERUxJTkUgPSBHVUlEQU5DRV9fR1VJREVMSU5FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJldXNhYmxlIEFzc2V0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDSEVDS0xJU1RfX1JFVVNBQkxFX0FTU0VUID0gR1VJREFOQ0VfX1JFVVNBQkxFX0FTU0VUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHBvcnRpbmcgTWF0ZXJpYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENIRUNLTElTVF9fU1VQUE9SVElOR19NQVRFUklBTCA9IEdVSURBTkNFX19TVVBQT1JUSU5HX01BVEVSSUFMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldoaXRlcGFwZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENIRUNLTElTVF9fV0hJVEVQQVBFUiA9IEdVSURBTkNFX19XSElURVBBUEVSOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDSEVDS0xJU1RfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQgPSBHVUlEQU5DRV9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0hFQ0tMSVNUX19WQVJJQUJJTElUWV9UWVBFID0gR1VJREFOQ0VfX1ZBUklBQklMSVRZX1RZUEU7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+Q2hlY2tsaXN0PC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENIRUNLTElTVF9GRUFUVVJFX0NPVU5UID0gR1VJREFOQ0VfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuRGVzY3JpcHRvckltcGwgPGVtPkRlc2NyaXB0b3I8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkRlc2NyaXB0b3JJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldERlc2NyaXB0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgREVTQ1JJUFRPUiA9IDIzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklQVE9SX19OQU1FID0gQlJFQUtET1dOX0VMRU1FTlRfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXA8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSVBUT1JfX0dST1VQID0gQlJFQUtET1dOX0VMRU1FTlRfX0dST1VQOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSVBUT1JfX09XTkVEX1JVTEUgPSBCUkVBS0RPV05fRUxFTUVOVF9fT1dORURfUlVMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJUFRPUl9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBCUkVBS0RPV05fRUxFTUVOVF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklQVE9SX19CUklFRl9ERVNDUklQVElPTiA9IEJSRUFLRE9XTl9FTEVNRU5UX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSVBUT1JfX0lEID0gQlJFQUtET1dOX0VMRU1FTlRfX0lEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJUFRPUl9fT1JERVJJTkdfR1VJREUgPSBCUkVBS0RPV05fRUxFTUVOVF9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklQVE9SX19QUkVTRU5UQVRJT05fTkFNRSA9IEJSRUFLRE9XTl9FTEVNRU5UX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJUFRPUl9fU1VQUFJFU1NFRCA9IEJSRUFLRE9XTl9FTEVNRU5UX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSVBUT1JfX1BSRVNFTlRBVElPTiA9IEJSRUFLRE9XTl9FTEVNRU5UX19QUkVTRU5UQVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RnVsZmlsbDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJUFRPUl9fRlVMRklMTCA9IEJSRUFLRE9XTl9FTEVNRU5UX19GVUxGSUxMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIEFic3RyYWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJUFRPUl9fSVNfQUJTVFJBQ1QgPSBCUkVBS0RPV05fRUxFTUVOVF9fSVNfQUJTVFJBQ1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm9kZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklQVE9SX19OT0RFSUNPTiA9IEJSRUFLRE9XTl9FTEVNRU5UX19OT0RFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TaGFwZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklQVE9SX19TSEFQRUlDT04gPSBCUkVBS0RPV05fRUxFTUVOVF9fU0hBUEVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRlZCBBZnRlcjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSVBUT1JfX1BSRVNFTlRFRF9BRlRFUiA9IEJSRUFLRE9XTl9FTEVNRU5UX19QUkVTRU5URURfQUZURVI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGVkIEJlZm9yZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSVBUT1JfX1BSRVNFTlRFRF9CRUZPUkUgPSBCUkVBS0RPV05fRUxFTUVOVF9fUFJFU0VOVEVEX0JFRk9SRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QbGFubmluZyBEYXRhPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJUFRPUl9fUExBTk5JTkdfREFUQSA9IEJSRUFLRE9XTl9FTEVNRU5UX19QTEFOTklOR19EQVRBOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cGVyIEFjdGl2aXR5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJUFRPUl9fU1VQRVJfQUNUSVZJVFkgPSBCUkVBS0RPV05fRUxFTUVOVF9fU1VQRVJfQUNUSVZJVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAxPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklQVE9SX19HUk9VUDEgPSBCUkVBS0RPV05fRUxFTUVOVF9fR1JPVVAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoZWNrbGlzdDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJUFRPUl9fQ0hFQ0tMSVNUID0gQlJFQUtET1dOX0VMRU1FTlRfX0NIRUNLTElTVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db25jZXB0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklQVE9SX19DT05DRVBUID0gQlJFQUtET1dOX0VMRU1FTlRfX0NPTkNFUFQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXhhbXBsZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJUFRPUl9fRVhBTVBMRSA9IEJSRUFLRE9XTl9FTEVNRU5UX19FWEFNUExFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWRlbGluZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJUFRPUl9fR1VJREVMSU5FID0gQlJFQUtET1dOX0VMRU1FTlRfX0dVSURFTElORTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXVzYWJsZSBBc3NldDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJUFRPUl9fUkVVU0FCTEVfQVNTRVQgPSBCUkVBS0RPV05fRUxFTUVOVF9fUkVVU0FCTEVfQVNTRVQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcG9ydGluZyBNYXRlcmlhbDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJUFRPUl9fU1VQUE9SVElOR19NQVRFUklBTCA9IEJSRUFLRE9XTl9FTEVNRU5UX19TVVBQT1JUSU5HX01BVEVSSUFMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldoaXRlcGFwZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSVBUT1JfX1dISVRFUEFQRVIgPSBCUkVBS0RPV05fRUxFTUVOVF9fV0hJVEVQQVBFUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5IYXMgTXVsdGlwbGUgT2NjdXJyZW5jZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklQVE9SX19IQVNfTVVMVElQTEVfT0NDVVJSRU5DRVMgPSBCUkVBS0RPV05fRUxFTUVOVF9fSEFTX01VTFRJUExFX09DQ1VSUkVOQ0VTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIE9wdGlvbmFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJUFRPUl9fSVNfT1BUSU9OQUwgPSBCUkVBS0RPV05fRUxFTUVOVF9fSVNfT1BUSU9OQUw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgUGxhbm5lZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSVBUT1JfX0lTX1BMQU5ORUQgPSBCUkVBS0RPV05fRUxFTUVOVF9fSVNfUExBTk5FRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVmaXg8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklQVE9SX19QUkVGSVggPSBCUkVBS0RPV05fRUxFTUVOVF9fUFJFRklYOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIFN5bmNocm9uaXplZCBXaXRoIFNvdXJjZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSVBUT1JfX0lTX1NZTkNIUk9OSVpFRF9XSVRIX1NPVVJDRSA9IEJSRUFLRE9XTl9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkRlc2NyaXB0b3I8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJUFRPUl9GRUFUVVJFX0NPVU5UID0gQlJFQUtET1dOX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUm9sZURlc2NyaXB0b3JJbXBsIDxlbT5Sb2xlIERlc2NyaXB0b3I8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlJvbGVEZXNjcmlwdG9ySW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRSb2xlRGVzY3JpcHRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBST0xFX0RFU0NSSVBUT1IgPSA2NjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9ERVNDUklQVE9SX19OQU1FID0gREVTQ1JJUFRPUl9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9ERVNDUklQVE9SX19HUk9VUCA9IERFU0NSSVBUT1JfX0dST1VQOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfREVTQ1JJUFRPUl9fT1dORURfUlVMRSA9IERFU0NSSVBUT1JfX09XTkVEX1JVTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfREVTQ1JJUFRPUl9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBERVNDUklQVE9SX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfREVTQ1JJUFRPUl9fQlJJRUZfREVTQ1JJUFRJT04gPSBERVNDUklQVE9SX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfREVTQ1JJUFRPUl9fSUQgPSBERVNDUklQVE9SX19JRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfREVTQ1JJUFRPUl9fT1JERVJJTkdfR1VJREUgPSBERVNDUklQVE9SX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfREVTQ1JJUFRPUl9fUFJFU0VOVEFUSU9OX05BTUUgPSBERVNDUklQVE9SX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9ERVNDUklQVE9SX19TVVBQUkVTU0VEID0gREVTQ1JJUFRPUl9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX0RFU0NSSVBUT1JfX1BSRVNFTlRBVElPTiA9IERFU0NSSVBUT1JfX1BSRVNFTlRBVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GdWxmaWxsPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX0RFU0NSSVBUT1JfX0ZVTEZJTEwgPSBERVNDUklQVE9SX19GVUxGSUxMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIEFic3RyYWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9ERVNDUklQVE9SX19JU19BQlNUUkFDVCA9IERFU0NSSVBUT1JfX0lTX0FCU1RSQUNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9ERVNDUklQVE9SX19OT0RFSUNPTiA9IERFU0NSSVBUT1JfX05PREVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNoYXBlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfREVTQ1JJUFRPUl9fU0hBUEVJQ09OID0gREVTQ1JJUFRPUl9fU0hBUEVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRlZCBBZnRlcjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfREVTQ1JJUFRPUl9fUFJFU0VOVEVEX0FGVEVSID0gREVTQ1JJUFRPUl9fUFJFU0VOVEVEX0FGVEVSOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRlZCBCZWZvcmU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX0RFU0NSSVBUT1JfX1BSRVNFTlRFRF9CRUZPUkUgPSBERVNDUklQVE9SX19QUkVTRU5URURfQkVGT1JFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBsYW5uaW5nIERhdGE8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX0RFU0NSSVBUT1JfX1BMQU5OSU5HX0RBVEEgPSBERVNDUklQVE9SX19QTEFOTklOR19EQVRBOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cGVyIEFjdGl2aXR5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9ERVNDUklQVE9SX19TVVBFUl9BQ1RJVklUWSA9IERFU0NSSVBUT1JfX1NVUEVSX0FDVElWSVRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9ERVNDUklQVE9SX19HUk9VUDEgPSBERVNDUklQVE9SX19HUk9VUDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hlY2tsaXN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX0RFU0NSSVBUT1JfX0NIRUNLTElTVCA9IERFU0NSSVBUT1JfX0NIRUNLTElTVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db25jZXB0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX0RFU0NSSVBUT1JfX0NPTkNFUFQgPSBERVNDUklQVE9SX19DT05DRVBUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4YW1wbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfREVTQ1JJUFRPUl9fRVhBTVBMRSA9IERFU0NSSVBUT1JfX0VYQU1QTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZGVsaW5lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX0RFU0NSSVBUT1JfX0dVSURFTElORSA9IERFU0NSSVBUT1JfX0dVSURFTElORTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXVzYWJsZSBBc3NldDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9ERVNDUklQVE9SX19SRVVTQUJMRV9BU1NFVCA9IERFU0NSSVBUT1JfX1JFVVNBQkxFX0FTU0VUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHBvcnRpbmcgTWF0ZXJpYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfREVTQ1JJUFRPUl9fU1VQUE9SVElOR19NQVRFUklBTCA9IERFU0NSSVBUT1JfX1NVUFBPUlRJTkdfTUFURVJJQUw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+V2hpdGVwYXBlcjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9ERVNDUklQVE9SX19XSElURVBBUEVSID0gREVTQ1JJUFRPUl9fV0hJVEVQQVBFUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5IYXMgTXVsdGlwbGUgT2NjdXJyZW5jZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX0RFU0NSSVBUT1JfX0hBU19NVUxUSVBMRV9PQ0NVUlJFTkNFUyA9IERFU0NSSVBUT1JfX0hBU19NVUxUSVBMRV9PQ0NVUlJFTkNFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBPcHRpb25hbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfREVTQ1JJUFRPUl9fSVNfT1BUSU9OQUwgPSBERVNDUklQVE9SX19JU19PUFRJT05BTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBQbGFubmVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9ERVNDUklQVE9SX19JU19QTEFOTkVEID0gREVTQ1JJUFRPUl9fSVNfUExBTk5FRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVmaXg8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX0RFU0NSSVBUT1JfX1BSRUZJWCA9IERFU0NSSVBUT1JfX1BSRUZJWDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBTeW5jaHJvbml6ZWQgV2l0aCBTb3VyY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX0RFU0NSSVBUT1JfX0lTX1NZTkNIUk9OSVpFRF9XSVRIX1NPVVJDRSA9IERFU0NSSVBUT1JfX0lTX1NZTkNIUk9OSVpFRF9XSVRIX1NPVVJDRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Sb2xlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9ERVNDUklQVE9SX19ST0xFID0gREVTQ1JJUFRPUl9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXNwb25zaWJsZSBGb3I8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfREVTQ1JJUFRPUl9fUkVTUE9OU0lCTEVfRk9SID0gREVTQ1JJUFRPUl9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Sb2xlIERlc2NyaXB0b3I8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9ERVNDUklQVE9SX0ZFQVRVUkVfQ09VTlQgPSBERVNDUklQVE9SX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkNvbXBvc2l0ZVJvbGVJbXBsIDxlbT5Db21wb3NpdGUgUm9sZTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQ29tcG9zaXRlUm9sZUltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0Q29tcG9zaXRlUm9sZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBDT01QT1NJVEVfUk9MRSA9IDk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTVBPU0lURV9ST0xFX19OQU1FID0gUk9MRV9ERVNDUklQVE9SX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT01QT1NJVEVfUk9MRV9fR1JPVVAgPSBST0xFX0RFU0NSSVBUT1JfX0dST1VQOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTVBPU0lURV9ST0xFX19PV05FRF9SVUxFID0gUk9MRV9ERVNDUklQVE9SX19PV05FRF9SVUxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT01QT1NJVEVfUk9MRV9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBST0xFX0RFU0NSSVBUT1JfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09NUE9TSVRFX1JPTEVfX0JSSUVGX0RFU0NSSVBUSU9OID0gUk9MRV9ERVNDUklQVE9SX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTVBPU0lURV9ST0xFX19JRCA9IFJPTEVfREVTQ1JJUFRPUl9fSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT01QT1NJVEVfUk9MRV9fT1JERVJJTkdfR1VJREUgPSBST0xFX0RFU0NSSVBUT1JfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09NUE9TSVRFX1JPTEVfX1BSRVNFTlRBVElPTl9OQU1FID0gUk9MRV9ERVNDUklQVE9SX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09NUE9TSVRFX1JPTEVfX1NVUFBSRVNTRUQgPSBST0xFX0RFU0NSSVBUT1JfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09NUE9TSVRFX1JPTEVfX1BSRVNFTlRBVElPTiA9IFJPTEVfREVTQ1JJUFRPUl9fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZ1bGZpbGw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTVBPU0lURV9ST0xFX19GVUxGSUxMID0gUk9MRV9ERVNDUklQVE9SX19GVUxGSUxMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIEFic3RyYWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09NUE9TSVRFX1JPTEVfX0lTX0FCU1RSQUNUID0gUk9MRV9ERVNDUklQVE9SX19JU19BQlNUUkFDVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob2RlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTVBPU0lURV9ST0xFX19OT0RFSUNPTiA9IFJPTEVfREVTQ1JJUFRPUl9fTk9ERUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2hhcGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09NUE9TSVRFX1JPTEVfX1NIQVBFSUNPTiA9IFJPTEVfREVTQ1JJUFRPUl9fU0hBUEVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRlZCBBZnRlcjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTVBPU0lURV9ST0xFX19QUkVTRU5URURfQUZURVIgPSBST0xFX0RFU0NSSVBUT1JfX1BSRVNFTlRFRF9BRlRFUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50ZWQgQmVmb3JlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09NUE9TSVRFX1JPTEVfX1BSRVNFTlRFRF9CRUZPUkUgPSBST0xFX0RFU0NSSVBUT1JfX1BSRVNFTlRFRF9CRUZPUkU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UGxhbm5pbmcgRGF0YTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTVBPU0lURV9ST0xFX19QTEFOTklOR19EQVRBID0gUk9MRV9ERVNDUklQVE9SX19QTEFOTklOR19EQVRBOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cGVyIEFjdGl2aXR5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09NUE9TSVRFX1JPTEVfX1NVUEVSX0FDVElWSVRZID0gUk9MRV9ERVNDUklQVE9SX19TVVBFUl9BQ1RJVklUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDE8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTVBPU0lURV9ST0xFX19HUk9VUDEgPSBST0xFX0RFU0NSSVBUT1JfX0dST1VQMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGVja2xpc3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTVBPU0lURV9ST0xFX19DSEVDS0xJU1QgPSBST0xFX0RFU0NSSVBUT1JfX0NIRUNLTElTVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db25jZXB0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT01QT1NJVEVfUk9MRV9fQ09OQ0VQVCA9IFJPTEVfREVTQ1JJUFRPUl9fQ09OQ0VQVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeGFtcGxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT01QT1NJVEVfUk9MRV9fRVhBTVBMRSA9IFJPTEVfREVTQ1JJUFRPUl9fRVhBTVBMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkZWxpbmU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTVBPU0lURV9ST0xFX19HVUlERUxJTkUgPSBST0xFX0RFU0NSSVBUT1JfX0dVSURFTElORTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXVzYWJsZSBBc3NldDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09NUE9TSVRFX1JPTEVfX1JFVVNBQkxFX0FTU0VUID0gUk9MRV9ERVNDUklQVE9SX19SRVVTQUJMRV9BU1NFVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwb3J0aW5nIE1hdGVyaWFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT01QT1NJVEVfUk9MRV9fU1VQUE9SVElOR19NQVRFUklBTCA9IFJPTEVfREVTQ1JJUFRPUl9fU1VQUE9SVElOR19NQVRFUklBTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5XaGl0ZXBhcGVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT01QT1NJVEVfUk9MRV9fV0hJVEVQQVBFUiA9IFJPTEVfREVTQ1JJUFRPUl9fV0hJVEVQQVBFUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5IYXMgTXVsdGlwbGUgT2NjdXJyZW5jZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT01QT1NJVEVfUk9MRV9fSEFTX01VTFRJUExFX09DQ1VSUkVOQ0VTID0gUk9MRV9ERVNDUklQVE9SX19IQVNfTVVMVElQTEVfT0NDVVJSRU5DRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgT3B0aW9uYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT01QT1NJVEVfUk9MRV9fSVNfT1BUSU9OQUwgPSBST0xFX0RFU0NSSVBUT1JfX0lTX09QVElPTkFMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIFBsYW5uZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT01QT1NJVEVfUk9MRV9fSVNfUExBTk5FRCA9IFJPTEVfREVTQ1JJUFRPUl9fSVNfUExBTk5FRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVmaXg8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT01QT1NJVEVfUk9MRV9fUFJFRklYID0gUk9MRV9ERVNDUklQVE9SX19QUkVGSVg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgU3luY2hyb25pemVkIFdpdGggU291cmNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09NUE9TSVRFX1JPTEVfX0lTX1NZTkNIUk9OSVpFRF9XSVRIX1NPVVJDRSA9IFJPTEVfREVTQ1JJUFRPUl9fSVNfU1lOQ0hST05JWkVEX1dJVEhfU09VUkNFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJvbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT01QT1NJVEVfUk9MRV9fUk9MRSA9IFJPTEVfREVTQ1JJUFRPUl9fUk9MRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXNwb25zaWJsZSBGb3I8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTVBPU0lURV9ST0xFX19SRVNQT05TSUJMRV9GT1IgPSBST0xFX0RFU0NSSVBUT1JfX1JFU1BPTlNJQkxFX0ZPUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTVBPU0lURV9ST0xFX19HUk9VUDIgPSBST0xFX0RFU0NSSVBUT1JfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWdncmVnYXRlZCBSb2xlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT01QT1NJVEVfUk9MRV9fQUdHUkVHQVRFRF9ST0xFID0gUk9MRV9ERVNDUklQVE9SX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkNvbXBvc2l0ZSBSb2xlPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTVBPU0lURV9ST0xFX0ZFQVRVUkVfQ09VTlQgPSBST0xFX0RFU0NSSVBUT1JfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQ29uY2VwdEltcGwgPGVtPkNvbmNlcHQ8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkNvbmNlcHRJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldENvbmNlcHQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgQ09OQ0VQVCA9IDEwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05DRVBUX19OQU1FID0gR1VJREFOQ0VfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXA8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTkNFUFRfX0dST1VQID0gR1VJREFOQ0VfX0dST1VQOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTkNFUFRfX09XTkVEX1JVTEUgPSBHVUlEQU5DRV9fT1dORURfUlVMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OQ0VQVF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBHVUlEQU5DRV9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05DRVBUX19CUklFRl9ERVNDUklQVElPTiA9IEdVSURBTkNFX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTkNFUFRfX0lEID0gR1VJREFOQ0VfX0lEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OQ0VQVF9fT1JERVJJTkdfR1VJREUgPSBHVUlEQU5DRV9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05DRVBUX19QUkVTRU5UQVRJT05fTkFNRSA9IEdVSURBTkNFX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OQ0VQVF9fU1VQUFJFU1NFRCA9IEdVSURBTkNFX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTkNFUFRfX1BSRVNFTlRBVElPTiA9IEdVSURBTkNFX19QUkVTRU5UQVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RnVsZmlsbDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OQ0VQVF9fRlVMRklMTCA9IEdVSURBTkNFX19GVUxGSUxMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIEFic3RyYWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OQ0VQVF9fSVNfQUJTVFJBQ1QgPSBHVUlEQU5DRV9fSVNfQUJTVFJBQ1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm9kZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05DRVBUX19OT0RFSUNPTiA9IEdVSURBTkNFX19OT0RFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TaGFwZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05DRVBUX19TSEFQRUlDT04gPSBHVUlEQU5DRV9fU0hBUEVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OQ0VQVF9fR1JPVVAxID0gR1VJREFOQ0VfX0dST1VQMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGVja2xpc3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTkNFUFRfX0NIRUNLTElTVCA9IEdVSURBTkNFX19DSEVDS0xJU1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29uY2VwdDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OQ0VQVF9fQ09OQ0VQVCA9IEdVSURBTkNFX19DT05DRVBUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4YW1wbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTkNFUFRfX0VYQU1QTEUgPSBHVUlEQU5DRV9fRVhBTVBMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkZWxpbmU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTkNFUFRfX0dVSURFTElORSA9IEdVSURBTkNFX19HVUlERUxJTkU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmV1c2FibGUgQXNzZXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTkNFUFRfX1JFVVNBQkxFX0FTU0VUID0gR1VJREFOQ0VfX1JFVVNBQkxFX0FTU0VUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHBvcnRpbmcgTWF0ZXJpYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTkNFUFRfX1NVUFBPUlRJTkdfTUFURVJJQUwgPSBHVUlEQU5DRV9fU1VQUE9SVElOR19NQVRFUklBTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5XaGl0ZXBhcGVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05DRVBUX19XSElURVBBUEVSID0gR1VJREFOQ0VfX1dISVRFUEFQRVI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTkNFUFRfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQgPSBHVUlEQU5DRV9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OQ0VQVF9fVkFSSUFCSUxJVFlfVFlQRSA9IEdVSURBTkNFX19WQVJJQUJJTElUWV9UWVBFOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkNvbmNlcHQ8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OQ0VQVF9GRUFUVVJFX0NPVU5UID0gR1VJREFOQ0VfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQ29uc3RyYWludEltcGwgPGVtPkNvbnN0cmFpbnQ8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkNvbnN0cmFpbnRJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldENvbnN0cmFpbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgQ09OU1RSQUlOVCA9IDExOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05TVFJBSU5UX19OQU1FID0gTUVUSE9EX0VMRU1FTlRfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXA8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlNUUkFJTlRfX0dST1VQID0gTUVUSE9EX0VMRU1FTlRfX0dST1VQOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlNUUkFJTlRfX09XTkVEX1JVTEUgPSBNRVRIT0RfRUxFTUVOVF9fT1dORURfUlVMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OU1RSQUlOVF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBNRVRIT0RfRUxFTUVOVF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05TVFJBSU5UX19CUklFRl9ERVNDUklQVElPTiA9IE1FVEhPRF9FTEVNRU5UX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlNUUkFJTlRfX0lEID0gTUVUSE9EX0VMRU1FTlRfX0lEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OU1RSQUlOVF9fT1JERVJJTkdfR1VJREUgPSBNRVRIT0RfRUxFTUVOVF9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05TVFJBSU5UX19QUkVTRU5UQVRJT05fTkFNRSA9IE1FVEhPRF9FTEVNRU5UX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OU1RSQUlOVF9fU1VQUFJFU1NFRCA9IE1FVEhPRF9FTEVNRU5UX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1haW4gRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05TVFJBSU5UX19NQUlOX0RFU0NSSVBUSU9OID0gTUVUSE9EX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+Q29uc3RyYWludDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05TVFJBSU5UX0ZFQVRVUkVfQ09VTlQgPSBNRVRIT0RfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Db250ZW50Q2F0ZWdvcnlJbXBsIDxlbT5Db250ZW50IENhdGVnb3J5PC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Db250ZW50Q2F0ZWdvcnlJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldENvbnRlbnRDYXRlZ29yeSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBDT05URU5UX0NBVEVHT1JZID0gMTI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfQ0FURUdPUllfX05BTUUgPSBDT05URU5UX0VMRU1FTlRfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXA8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfQ0FURUdPUllfX0dST1VQID0gQ09OVEVOVF9FTEVNRU5UX19HUk9VUDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0NBVEVHT1JZX19PV05FRF9SVUxFID0gQ09OVEVOVF9FTEVNRU5UX19PV05FRF9SVUxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0NBVEVHT1JZX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IENPTlRFTlRfRUxFTUVOVF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0NBVEVHT1JZX19CUklFRl9ERVNDUklQVElPTiA9IENPTlRFTlRfRUxFTUVOVF9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0NBVEVHT1JZX19JRCA9IENPTlRFTlRfRUxFTUVOVF9fSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0NBVEVHT1JZX19PUkRFUklOR19HVUlERSA9IENPTlRFTlRfRUxFTUVOVF9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0NBVEVHT1JZX19QUkVTRU5UQVRJT05fTkFNRSA9IENPTlRFTlRfRUxFTUVOVF9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfQ0FURUdPUllfX1NVUFBSRVNTRUQgPSBDT05URU5UX0VMRU1FTlRfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9DQVRFR09SWV9fUFJFU0VOVEFUSU9OID0gQ09OVEVOVF9FTEVNRU5UX19QUkVTRU5UQVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RnVsZmlsbDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9DQVRFR09SWV9fRlVMRklMTCA9IENPTlRFTlRfRUxFTUVOVF9fRlVMRklMTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBBYnN0cmFjdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfQ0FURUdPUllfX0lTX0FCU1RSQUNUID0gQ09OVEVOVF9FTEVNRU5UX19JU19BQlNUUkFDVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob2RlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfQ0FURUdPUllfX05PREVJQ09OID0gQ09OVEVOVF9FTEVNRU5UX19OT0RFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TaGFwZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0NBVEVHT1JZX19TSEFQRUlDT04gPSBDT05URU5UX0VMRU1FTlRfX1NIQVBFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDE8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfQ0FURUdPUllfX0dST1VQMSA9IENPTlRFTlRfRUxFTUVOVF9fR1JPVVAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoZWNrbGlzdDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9DQVRFR09SWV9fQ0hFQ0tMSVNUID0gQ09OVEVOVF9FTEVNRU5UX19DSEVDS0xJU1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29uY2VwdDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9DQVRFR09SWV9fQ09OQ0VQVCA9IENPTlRFTlRfRUxFTUVOVF9fQ09OQ0VQVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeGFtcGxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0NBVEVHT1JZX19FWEFNUExFID0gQ09OVEVOVF9FTEVNRU5UX19FWEFNUExFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWRlbGluZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9DQVRFR09SWV9fR1VJREVMSU5FID0gQ09OVEVOVF9FTEVNRU5UX19HVUlERUxJTkU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmV1c2FibGUgQXNzZXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfQ0FURUdPUllfX1JFVVNBQkxFX0FTU0VUID0gQ09OVEVOVF9FTEVNRU5UX19SRVVTQUJMRV9BU1NFVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwb3J0aW5nIE1hdGVyaWFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0NBVEVHT1JZX19TVVBQT1JUSU5HX01BVEVSSUFMID0gQ09OVEVOVF9FTEVNRU5UX19TVVBQT1JUSU5HX01BVEVSSUFMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldoaXRlcGFwZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfQ0FURUdPUllfX1dISVRFUEFQRVIgPSBDT05URU5UX0VMRU1FTlRfX1dISVRFUEFQRVI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfQ0FURUdPUllfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQgPSBDT05URU5UX0VMRU1FTlRfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfQ0FURUdPUllfX1ZBUklBQklMSVRZX1RZUEUgPSBDT05URU5UX0VMRU1FTlRfX1ZBUklBQklMSVRZX1RZUEU7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+Q29udGVudCBDYXRlZ29yeTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0NBVEVHT1JZX0ZFQVRVUkVfQ09VTlQgPSBDT05URU5UX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuTWV0aG9kUGFja2FnZUltcGwgPGVtPk1ldGhvZCBQYWNrYWdlPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5NZXRob2RQYWNrYWdlSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRNZXRob2RQYWNrYWdlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IE1FVEhPRF9QQUNLQUdFID0gNDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9QQUNLQUdFX19OQU1FID0gTUVUSE9EX0VMRU1FTlRfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXA8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9QQUNLQUdFX19HUk9VUCA9IE1FVEhPRF9FTEVNRU5UX19HUk9VUDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfUEFDS0FHRV9fT1dORURfUlVMRSA9IE1FVEhPRF9FTEVNRU5UX19PV05FRF9SVUxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfUEFDS0FHRV9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBNRVRIT0RfRUxFTUVOVF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfUEFDS0FHRV9fQlJJRUZfREVTQ1JJUFRJT04gPSBNRVRIT0RfRUxFTUVOVF9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfUEFDS0FHRV9fSUQgPSBNRVRIT0RfRUxFTUVOVF9fSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfUEFDS0FHRV9fT1JERVJJTkdfR1VJREUgPSBNRVRIT0RfRUxFTUVOVF9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfUEFDS0FHRV9fUFJFU0VOVEFUSU9OX05BTUUgPSBNRVRIT0RfRUxFTUVOVF9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9QQUNLQUdFX19TVVBQUkVTU0VEID0gTUVUSE9EX0VMRU1FTlRfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAxPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfUEFDS0FHRV9fR1JPVVAxID0gTUVUSE9EX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmV1c2VkIFBhY2thZ2U8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9QQUNLQUdFX19SRVVTRURfUEFDS0FHRSA9IE1FVEhPRF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBQYWNrYWdlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfUEFDS0FHRV9fTUVUSE9EX1BBQ0tBR0UgPSBNRVRIT0RfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HbG9iYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfUEFDS0FHRV9fR0xPQkFMID0gTUVUSE9EX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+TWV0aG9kIFBhY2thZ2U8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX1BBQ0tBR0VfRkVBVFVSRV9DT1VOVCA9IE1FVEhPRF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA0OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkNvbnRlbnRDYXRlZ29yeVBhY2thZ2VJbXBsIDxlbT5Db250ZW50IENhdGVnb3J5IFBhY2thZ2U8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkNvbnRlbnRDYXRlZ29yeVBhY2thZ2VJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldENvbnRlbnRDYXRlZ29yeVBhY2thZ2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9DQVRFR09SWV9QQUNLQUdFID0gMTM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfQ0FURUdPUllfUEFDS0FHRV9fTkFNRSA9IE1FVEhPRF9QQUNLQUdFX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0NBVEVHT1JZX1BBQ0tBR0VfX0dST1VQID0gTUVUSE9EX1BBQ0tBR0VfX0dST1VQOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfQ0FURUdPUllfUEFDS0FHRV9fT1dORURfUlVMRSA9IE1FVEhPRF9QQUNLQUdFX19PV05FRF9SVUxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0NBVEVHT1JZX1BBQ0tBR0VfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gTUVUSE9EX1BBQ0tBR0VfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9DQVRFR09SWV9QQUNLQUdFX19CUklFRl9ERVNDUklQVElPTiA9IE1FVEhPRF9QQUNLQUdFX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfQ0FURUdPUllfUEFDS0FHRV9fSUQgPSBNRVRIT0RfUEFDS0FHRV9fSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0NBVEVHT1JZX1BBQ0tBR0VfX09SREVSSU5HX0dVSURFID0gTUVUSE9EX1BBQ0tBR0VfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9DQVRFR09SWV9QQUNLQUdFX19QUkVTRU5UQVRJT05fTkFNRSA9IE1FVEhPRF9QQUNLQUdFX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9DQVRFR09SWV9QQUNLQUdFX19TVVBQUkVTU0VEID0gTUVUSE9EX1BBQ0tBR0VfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAxPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0NBVEVHT1JZX1BBQ0tBR0VfX0dST1VQMSA9IE1FVEhPRF9QQUNLQUdFX19HUk9VUDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmV1c2VkIFBhY2thZ2U8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfQ0FURUdPUllfUEFDS0FHRV9fUkVVU0VEX1BBQ0tBR0UgPSBNRVRIT0RfUEFDS0FHRV9fUkVVU0VEX1BBQ0tBR0U7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIFBhY2thZ2U8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfQ0FURUdPUllfUEFDS0FHRV9fTUVUSE9EX1BBQ0tBR0UgPSBNRVRIT0RfUEFDS0FHRV9fTUVUSE9EX1BBQ0tBR0U7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R2xvYmFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9DQVRFR09SWV9QQUNLQUdFX19HTE9CQUwgPSBNRVRIT0RfUEFDS0FHRV9fR0xPQkFMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9DQVRFR09SWV9QQUNLQUdFX19HUk9VUDIgPSBNRVRIT0RfUEFDS0FHRV9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db250ZW50IENhdGVnb3J5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0NBVEVHT1JZX1BBQ0tBR0VfX0NPTlRFTlRfQ0FURUdPUlkgPSBNRVRIT0RfUEFDS0FHRV9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Db250ZW50IENhdGVnb3J5IFBhY2thZ2U8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9DQVRFR09SWV9QQUNLQUdFX0ZFQVRVUkVfQ09VTlQgPSBNRVRIT0RfUEFDS0FHRV9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Db250ZW50UGFja2FnZUltcGwgPGVtPkNvbnRlbnQgUGFja2FnZTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQ29udGVudFBhY2thZ2VJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldENvbnRlbnRQYWNrYWdlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IENPTlRFTlRfUEFDS0FHRSA9IDE2OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX1BBQ0tBR0VfX05BTUUgPSBNRVRIT0RfUEFDS0FHRV9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9QQUNLQUdFX19HUk9VUCA9IE1FVEhPRF9QQUNLQUdFX19HUk9VUDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX1BBQ0tBR0VfX09XTkVEX1JVTEUgPSBNRVRIT0RfUEFDS0FHRV9fT1dORURfUlVMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9QQUNLQUdFX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IE1FVEhPRF9QQUNLQUdFX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfUEFDS0FHRV9fQlJJRUZfREVTQ1JJUFRJT04gPSBNRVRIT0RfUEFDS0FHRV9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX1BBQ0tBR0VfX0lEID0gTUVUSE9EX1BBQ0tBR0VfX0lEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9QQUNLQUdFX19PUkRFUklOR19HVUlERSA9IE1FVEhPRF9QQUNLQUdFX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfUEFDS0FHRV9fUFJFU0VOVEFUSU9OX05BTUUgPSBNRVRIT0RfUEFDS0FHRV9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfUEFDS0FHRV9fU1VQUFJFU1NFRCA9IE1FVEhPRF9QQUNLQUdFX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9QQUNLQUdFX19HUk9VUDEgPSBNRVRIT0RfUEFDS0FHRV9fR1JPVVAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJldXNlZCBQYWNrYWdlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX1BBQ0tBR0VfX1JFVVNFRF9QQUNLQUdFID0gTUVUSE9EX1BBQ0tBR0VfX1JFVVNFRF9QQUNLQUdFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBQYWNrYWdlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX1BBQ0tBR0VfX01FVEhPRF9QQUNLQUdFID0gTUVUSE9EX1BBQ0tBR0VfX01FVEhPRF9QQUNLQUdFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdsb2JhbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfUEFDS0FHRV9fR0xPQkFMID0gTUVUSE9EX1BBQ0tBR0VfX0dMT0JBTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfUEFDS0FHRV9fR1JPVVAyID0gTUVUSE9EX1BBQ0tBR0VfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29udGVudCBFbGVtZW50PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX1BBQ0tBR0VfX0NPTlRFTlRfRUxFTUVOVCA9IE1FVEhPRF9QQUNLQUdFX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkNvbnRlbnQgUGFja2FnZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX1BBQ0tBR0VfRkVBVFVSRV9DT1VOVCA9IE1FVEhPRF9QQUNLQUdFX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkN1c3RvbUNhdGVnb3J5SW1wbCA8ZW0+Q3VzdG9tIENhdGVnb3J5PC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5DdXN0b21DYXRlZ29yeUltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0Q3VzdG9tQ2F0ZWdvcnkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgQ1VTVE9NX0NBVEVHT1JZID0gMTc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENVU1RPTV9DQVRFR09SWV9fTkFNRSA9IENPTlRFTlRfQ0FURUdPUllfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXA8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENVU1RPTV9DQVRFR09SWV9fR1JPVVAgPSBDT05URU5UX0NBVEVHT1JZX19HUk9VUDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDVVNUT01fQ0FURUdPUllfX09XTkVEX1JVTEUgPSBDT05URU5UX0NBVEVHT1JZX19PV05FRF9SVUxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDVVNUT01fQ0FURUdPUllfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gQ09OVEVOVF9DQVRFR09SWV9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDVVNUT01fQ0FURUdPUllfX0JSSUVGX0RFU0NSSVBUSU9OID0gQ09OVEVOVF9DQVRFR09SWV9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDVVNUT01fQ0FURUdPUllfX0lEID0gQ09OVEVOVF9DQVRFR09SWV9fSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDVVNUT01fQ0FURUdPUllfX09SREVSSU5HX0dVSURFID0gQ09OVEVOVF9DQVRFR09SWV9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDVVNUT01fQ0FURUdPUllfX1BSRVNFTlRBVElPTl9OQU1FID0gQ09OVEVOVF9DQVRFR09SWV9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENVU1RPTV9DQVRFR09SWV9fU1VQUFJFU1NFRCA9IENPTlRFTlRfQ0FURUdPUllfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ1VTVE9NX0NBVEVHT1JZX19QUkVTRU5UQVRJT04gPSBDT05URU5UX0NBVEVHT1JZX19QUkVTRU5UQVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RnVsZmlsbDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ1VTVE9NX0NBVEVHT1JZX19GVUxGSUxMID0gQ09OVEVOVF9DQVRFR09SWV9fRlVMRklMTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBBYnN0cmFjdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENVU1RPTV9DQVRFR09SWV9fSVNfQUJTVFJBQ1QgPSBDT05URU5UX0NBVEVHT1JZX19JU19BQlNUUkFDVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob2RlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENVU1RPTV9DQVRFR09SWV9fTk9ERUlDT04gPSBDT05URU5UX0NBVEVHT1JZX19OT0RFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TaGFwZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDVVNUT01fQ0FURUdPUllfX1NIQVBFSUNPTiA9IENPTlRFTlRfQ0FURUdPUllfX1NIQVBFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDE8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENVU1RPTV9DQVRFR09SWV9fR1JPVVAxID0gQ09OVEVOVF9DQVRFR09SWV9fR1JPVVAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoZWNrbGlzdDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ1VTVE9NX0NBVEVHT1JZX19DSEVDS0xJU1QgPSBDT05URU5UX0NBVEVHT1JZX19DSEVDS0xJU1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29uY2VwdDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ1VTVE9NX0NBVEVHT1JZX19DT05DRVBUID0gQ09OVEVOVF9DQVRFR09SWV9fQ09OQ0VQVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeGFtcGxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDVVNUT01fQ0FURUdPUllfX0VYQU1QTEUgPSBDT05URU5UX0NBVEVHT1JZX19FWEFNUExFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWRlbGluZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ1VTVE9NX0NBVEVHT1JZX19HVUlERUxJTkUgPSBDT05URU5UX0NBVEVHT1JZX19HVUlERUxJTkU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmV1c2FibGUgQXNzZXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENVU1RPTV9DQVRFR09SWV9fUkVVU0FCTEVfQVNTRVQgPSBDT05URU5UX0NBVEVHT1JZX19SRVVTQUJMRV9BU1NFVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwb3J0aW5nIE1hdGVyaWFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDVVNUT01fQ0FURUdPUllfX1NVUFBPUlRJTkdfTUFURVJJQUwgPSBDT05URU5UX0NBVEVHT1JZX19TVVBQT1JUSU5HX01BVEVSSUFMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldoaXRlcGFwZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENVU1RPTV9DQVRFR09SWV9fV0hJVEVQQVBFUiA9IENPTlRFTlRfQ0FURUdPUllfX1dISVRFUEFQRVI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENVU1RPTV9DQVRFR09SWV9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVCA9IENPTlRFTlRfQ0FURUdPUllfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENVU1RPTV9DQVRFR09SWV9fVkFSSUFCSUxJVFlfVFlQRSA9IENPTlRFTlRfQ0FURUdPUllfX1ZBUklBQklMSVRZX1RZUEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDVVNUT01fQ0FURUdPUllfX0dST1VQMiA9IENPTlRFTlRfQ0FURUdPUllfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2F0ZWdvcml6ZWQgRWxlbWVudDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ1VTVE9NX0NBVEVHT1JZX19DQVRFR09SSVpFRF9FTEVNRU5UID0gQ09OVEVOVF9DQVRFR09SWV9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdWIgQ2F0ZWdvcnk8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENVU1RPTV9DQVRFR09SWV9fU1VCX0NBVEVHT1JZID0gQ09OVEVOVF9DQVRFR09SWV9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5DdXN0b20gQ2F0ZWdvcnk8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ1VTVE9NX0NBVEVHT1JZX0ZFQVRVUkVfQ09VTlQgPSBDT05URU5UX0NBVEVHT1JZX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkRlbGl2ZXJhYmxlSW1wbCA8ZW0+RGVsaXZlcmFibGU8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkRlbGl2ZXJhYmxlSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXREZWxpdmVyYWJsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBERUxJVkVSQUJMRSA9IDE4OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSQUJMRV9fTkFNRSA9IFdPUktfUFJPRFVDVF9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUkFCTEVfX0dST1VQID0gV09SS19QUk9EVUNUX19HUk9VUDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSQUJMRV9fT1dORURfUlVMRSA9IFdPUktfUFJPRFVDVF9fT1dORURfUlVMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUkFCTEVfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gV09SS19QUk9EVUNUX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJBQkxFX19CUklFRl9ERVNDUklQVElPTiA9IFdPUktfUFJPRFVDVF9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSQUJMRV9fSUQgPSBXT1JLX1BST0RVQ1RfX0lEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUkFCTEVfX09SREVSSU5HX0dVSURFID0gV09SS19QUk9EVUNUX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJBQkxFX19QUkVTRU5UQVRJT05fTkFNRSA9IFdPUktfUFJPRFVDVF9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJBQkxFX19TVVBQUkVTU0VEID0gV09SS19QUk9EVUNUX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJBQkxFX19QUkVTRU5UQVRJT04gPSBXT1JLX1BST0RVQ1RfX1BSRVNFTlRBVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GdWxmaWxsPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSQUJMRV9fRlVMRklMTCA9IFdPUktfUFJPRFVDVF9fRlVMRklMTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBBYnN0cmFjdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJBQkxFX19JU19BQlNUUkFDVCA9IFdPUktfUFJPRFVDVF9fSVNfQUJTVFJBQ1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm9kZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSQUJMRV9fTk9ERUlDT04gPSBXT1JLX1BST0RVQ1RfX05PREVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNoYXBlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJBQkxFX19TSEFQRUlDT04gPSBXT1JLX1BST0RVQ1RfX1NIQVBFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDE8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJBQkxFX19HUk9VUDEgPSBXT1JLX1BST0RVQ1RfX0dST1VQMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGVja2xpc3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJBQkxFX19DSEVDS0xJU1QgPSBXT1JLX1BST0RVQ1RfX0NIRUNLTElTVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db25jZXB0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSQUJMRV9fQ09OQ0VQVCA9IFdPUktfUFJPRFVDVF9fQ09OQ0VQVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeGFtcGxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSQUJMRV9fRVhBTVBMRSA9IFdPUktfUFJPRFVDVF9fRVhBTVBMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkZWxpbmU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJBQkxFX19HVUlERUxJTkUgPSBXT1JLX1BST0RVQ1RfX0dVSURFTElORTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXVzYWJsZSBBc3NldDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUkFCTEVfX1JFVVNBQkxFX0FTU0VUID0gV09SS19QUk9EVUNUX19SRVVTQUJMRV9BU1NFVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwb3J0aW5nIE1hdGVyaWFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSQUJMRV9fU1VQUE9SVElOR19NQVRFUklBTCA9IFdPUktfUFJPRFVDVF9fU1VQUE9SVElOR19NQVRFUklBTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5XaGl0ZXBhcGVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSQUJMRV9fV0hJVEVQQVBFUiA9IFdPUktfUFJPRFVDVF9fV0hJVEVQQVBFUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUkFCTEVfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQgPSBXT1JLX1BST0RVQ1RfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJBQkxFX19WQVJJQUJJTElUWV9UWVBFID0gV09SS19QUk9EVUNUX19WQVJJQUJJTElUWV9UWVBFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUkFCTEVfX0dST1VQMiA9IFdPUktfUFJPRFVDVF9fR1JPVVAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVzdGltYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSQUJMRV9fRVNUSU1BVEUgPSBXT1JLX1BST0RVQ1RfX0VTVElNQVRFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVzdGltYXRpb24gQ29uc2lkZXJhdGlvbnM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJBQkxFX19FU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TID0gV09SS19QUk9EVUNUX19FU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlcG9ydDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUkFCTEVfX1JFUE9SVCA9IFdPUktfUFJPRFVDVF9fUkVQT1JUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRlbXBsYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSQUJMRV9fVEVNUExBVEUgPSBXT1JLX1BST0RVQ1RfX1RFTVBMQVRFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRvb2wgTWVudG9yPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSQUJMRV9fVE9PTF9NRU5UT1IgPSBXT1JLX1BST0RVQ1RfX1RPT0xfTUVOVE9SOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMzwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUkFCTEVfX0dST1VQMyA9IFdPUktfUFJPRFVDVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZWxpdmVyZWQgV29yayBQcm9kdWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSQUJMRV9fREVMSVZFUkVEX1dPUktfUFJPRFVDVCA9IFdPUktfUFJPRFVDVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5EZWxpdmVyYWJsZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSQUJMRV9GRUFUVVJFX0NPVU5UID0gV09SS19QUk9EVUNUX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkRlbGl2ZXJhYmxlRGVzY3JpcHRpb25JbXBsIDxlbT5EZWxpdmVyYWJsZSBEZXNjcmlwdGlvbjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuRGVsaXZlcmFibGVEZXNjcmlwdGlvbkltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0RGVsaXZlcmFibGVEZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBERUxJVkVSQUJMRV9ERVNDUklQVElPTiA9IDE5OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSQUJMRV9ERVNDUklQVElPTl9fTkFNRSA9IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUkFCTEVfREVTQ1JJUFRJT05fX0dST1VQID0gV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19HUk9VUDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSQUJMRV9ERVNDUklQVElPTl9fT1dORURfUlVMRSA9IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fT1dORURfUlVMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUkFCTEVfREVTQ1JJUFRJT05fX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJBQkxFX0RFU0NSSVBUSU9OX19CUklFRl9ERVNDUklQVElPTiA9IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSQUJMRV9ERVNDUklQVElPTl9fSUQgPSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX0lEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUkFCTEVfREVTQ1JJUFRJT05fX09SREVSSU5HX0dVSURFID0gV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJBQkxFX0RFU0NSSVBUSU9OX19QUkVTRU5UQVRJT05fTkFNRSA9IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJBQkxFX0RFU0NSSVBUSU9OX19TVVBQUkVTU0VEID0gV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvcHlyaWdodDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJBQkxFX0RFU0NSSVBUSU9OX19DT1BZUklHSFQgPSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX0NPUFlSSUdIVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BdXRob3JzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUkFCTEVfREVTQ1JJUFRJT05fX0FVVEhPUlMgPSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX0FVVEhPUlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hhbmdlIERhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSQUJMRV9ERVNDUklQVElPTl9fQ0hBTkdFX0RBVEUgPSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX0NIQU5HRV9EQVRFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoYW5nZSBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJBQkxFX0RFU0NSSVBUSU9OX19DSEFOR0VfREVTQ1JJUFRJT04gPSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX0NIQU5HRV9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WZXJzaW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUkFCTEVfREVTQ1JJUFRJT05fX1ZFUlNJT04gPSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX1ZFUlNJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWFpbiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJBQkxFX0RFU0NSSVBUSU9OX19NQUlOX0RFU0NSSVBUSU9OID0gV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19NQUlOX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPktleSBDb25zaWRlcmF0aW9uczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJBQkxFX0RFU0NSSVBUSU9OX19LRVlfQ09OU0lERVJBVElPTlMgPSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX0tFWV9DT05TSURFUkFUSU9OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TZWN0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSQUJMRV9ERVNDUklQVElPTl9fU0VDVElPTiA9IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fU0VDVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeHRlcm5hbCBJZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJBQkxFX0RFU0NSSVBUSU9OX19FWFRFUk5BTF9JRCA9IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fRVhURVJOQUxfSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW1wYWN0IE9mIE5vdCBIYXZpbmc8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSQUJMRV9ERVNDUklQVElPTl9fSU1QQUNUX09GX05PVF9IQVZJTkcgPSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX0lNUEFDVF9PRl9OT1RfSEFWSU5HOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlB1cnBvc2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSQUJMRV9ERVNDUklQVElPTl9fUFVSUE9TRSA9IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fUFVSUE9TRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZWFzb25zIEZvciBOb3QgTmVlZGluZzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJBQkxFX0RFU0NSSVBUSU9OX19SRUFTT05TX0ZPUl9OT1RfTkVFRElORyA9IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fUkVBU09OU19GT1JfTk9UX05FRURJTkc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXh0ZXJuYWwgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSQUJMRV9ERVNDUklQVElPTl9fRVhURVJOQUxfREVTQ1JJUFRJT04gPSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UGFja2FnaW5nIEd1aWRhbmNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUkFCTEVfREVTQ1JJUFRJT05fX1BBQ0tBR0lOR19HVUlEQU5DRSA9IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5EZWxpdmVyYWJsZSBEZXNjcmlwdGlvbjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSQUJMRV9ERVNDUklQVElPTl9GRUFUVVJFX0NPVU5UID0gV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkRlbGl2ZXJ5UHJvY2Vzc0ltcGwgPGVtPkRlbGl2ZXJ5IFByb2Nlc3M8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkRlbGl2ZXJ5UHJvY2Vzc0ltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0RGVsaXZlcnlQcm9jZXNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1MgPSAyMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19fTkFNRSA9IFBST0NFU1NfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXA8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfX0dST1VQID0gUFJPQ0VTU19fR1JPVVA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19fT1dORURfUlVMRSA9IFBST0NFU1NfX09XTkVEX1JVTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gUFJPQ0VTU19fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX19CUklFRl9ERVNDUklQVElPTiA9IFBST0NFU1NfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19fSUQgPSBQUk9DRVNTX19JRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfX09SREVSSU5HX0dVSURFID0gUFJPQ0VTU19fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX19QUkVTRU5UQVRJT05fTkFNRSA9IFBST0NFU1NfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX19TVVBQUkVTU0VEID0gUFJPQ0VTU19fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX19QUkVTRU5UQVRJT04gPSBQUk9DRVNTX19QUkVTRU5UQVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RnVsZmlsbDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19fRlVMRklMTCA9IFBST0NFU1NfX0ZVTEZJTEw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgQWJzdHJhY3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX19JU19BQlNUUkFDVCA9IFBST0NFU1NfX0lTX0FCU1RSQUNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19fTk9ERUlDT04gPSBQUk9DRVNTX19OT0RFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TaGFwZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX19TSEFQRUlDT04gPSBQUk9DRVNTX19TSEFQRUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGVkIEFmdGVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19fUFJFU0VOVEVEX0FGVEVSID0gUFJPQ0VTU19fUFJFU0VOVEVEX0FGVEVSOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRlZCBCZWZvcmU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX19QUkVTRU5URURfQkVGT1JFID0gUFJPQ0VTU19fUFJFU0VOVEVEX0JFRk9SRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QbGFubmluZyBEYXRhPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19fUExBTk5JTkdfREFUQSA9IFBST0NFU1NfX1BMQU5OSU5HX0RBVEE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwZXIgQWN0aXZpdHk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX19TVVBFUl9BQ1RJVklUWSA9IFBST0NFU1NfX1NVUEVSX0FDVElWSVRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19fR1JPVVAxID0gUFJPQ0VTU19fR1JPVVAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoZWNrbGlzdDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19fQ0hFQ0tMSVNUID0gUFJPQ0VTU19fQ0hFQ0tMSVNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbmNlcHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfX0NPTkNFUFQgPSBQUk9DRVNTX19DT05DRVBUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4YW1wbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfX0VYQU1QTEUgPSBQUk9DRVNTX19FWEFNUExFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWRlbGluZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19fR1VJREVMSU5FID0gUFJPQ0VTU19fR1VJREVMSU5FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJldXNhYmxlIEFzc2V0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX19SRVVTQUJMRV9BU1NFVCA9IFBST0NFU1NfX1JFVVNBQkxFX0FTU0VUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHBvcnRpbmcgTWF0ZXJpYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfX1NVUFBPUlRJTkdfTUFURVJJQUwgPSBQUk9DRVNTX19TVVBQT1JUSU5HX01BVEVSSUFMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldoaXRlcGFwZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfX1dISVRFUEFQRVIgPSBQUk9DRVNTX19XSElURVBBUEVSOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkhhcyBNdWx0aXBsZSBPY2N1cnJlbmNlczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfX0hBU19NVUxUSVBMRV9PQ0NVUlJFTkNFUyA9IFBST0NFU1NfX0hBU19NVUxUSVBMRV9PQ0NVUlJFTkNFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBPcHRpb25hbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfX0lTX09QVElPTkFMID0gUFJPQ0VTU19fSVNfT1BUSU9OQUw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgUGxhbm5lZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfX0lTX1BMQU5ORUQgPSBQUk9DRVNTX19JU19QTEFOTkVEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZWZpeDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfX1BSRUZJWCA9IFBST0NFU1NfX1BSRUZJWDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfX0dST1VQMiA9IFBST0NFU1NfX0dST1VQMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVkZWNlc3NvcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19fUFJFREVDRVNTT1IgPSBQUk9DRVNTX19QUkVERUNFU1NPUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBFdmVudCBEcml2ZW48L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX19JU19FVkVOVF9EUklWRU4gPSBQUk9DRVNTX19JU19FVkVOVF9EUklWRU47Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgT25nb2luZzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfX0lTX09OR09JTkcgPSBQUk9DRVNTX19JU19PTkdPSU5HOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIFJlcGVhdGFibGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX19JU19SRVBFQVRBQkxFID0gUFJPQ0VTU19fSVNfUkVQRUFUQUJMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVjb25kaXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX19QUkVDT05ESVRJT04gPSBQUk9DRVNTX19QUkVDT05ESVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UG9zdGNvbmRpdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfX1BPU1RDT05ESVRJT04gPSBQUk9DRVNTX19QT1NUQ09ORElUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMzwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19fR1JPVVAzID0gUFJPQ0VTU19fR1JPVVAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyZWFrZG93biBFbGVtZW50PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX19CUkVBS0RPV05fRUxFTUVOVCA9IFBST0NFU1NfX0JSRUFLRE9XTl9FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJvYWRtYXA8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfX1JPQURNQVAgPSBQUk9DRVNTX19ST0FETUFQOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIEVuYWN0YWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfX0lTX0VOQUNUQUJMRSA9IFBST0NFU1NfX0lTX0VOQUNUQUJMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVCA9IFBST0NFU1NfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfX1ZBUklBQklMSVRZX1RZUEUgPSBQUk9DRVNTX19WQVJJQUJJTElUWV9UWVBFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkluY2x1ZGVzIFBhdHRlcm48L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfX0lOQ0xVREVTX1BBVFRFUk4gPSBQUk9DRVNTX19JTkNMVURFU19QQVRURVJOOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlZmF1bHQgQ29udGV4dDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfX0RFRkFVTFRfQ09OVEVYVCA9IFBST0NFU1NfX0RFRkFVTFRfQ09OVEVYVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYWxpZCBDb250ZXh0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX19WQUxJRF9DT05URVhUID0gUFJPQ0VTU19fVkFMSURfQ09OVEVYVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EaWFncmFtIFVSSTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfX0RJQUdSQU1fVVJJID0gUFJPQ0VTU19fRElBR1JBTV9VUkk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXA0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX19HUk9VUDQgPSBQUk9DRVNTX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbW11bmljYXRpb25zIE1hdGVyaWFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX19DT01NVU5JQ0FUSU9OU19NQVRFUklBTCA9IFBST0NFU1NfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RWR1Y2F0aW9uIE1hdGVyaWFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX19FRFVDQVRJT05fTUFURVJJQUwgPSBQUk9DRVNTX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkRlbGl2ZXJ5IFByb2Nlc3M8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19GRUFUVVJFX0NPVU5UID0gUFJPQ0VTU19GRUFUVVJFX0NPVU5UICsgMzsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Qcm9jZXNzRGVzY3JpcHRpb25JbXBsIDxlbT5Qcm9jZXNzIERlc2NyaXB0aW9uPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Qcm9jZXNzRGVzY3JpcHRpb25JbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFByb2Nlc3NEZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBQUk9DRVNTX0RFU0NSSVBUSU9OID0gNTc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfREVTQ1JJUFRJT05fX05BTUUgPSBBQ1RJVklUWV9ERVNDUklQVElPTl9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19ERVNDUklQVElPTl9fR1JPVVAgPSBBQ1RJVklUWV9ERVNDUklQVElPTl9fR1JPVVA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19ERVNDUklQVElPTl9fT1dORURfUlVMRSA9IEFDVElWSVRZX0RFU0NSSVBUSU9OX19PV05FRF9SVUxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0RFU0NSSVBUSU9OX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IEFDVElWSVRZX0RFU0NSSVBUSU9OX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfREVTQ1JJUFRJT05fX0JSSUVGX0RFU0NSSVBUSU9OID0gQUNUSVZJVFlfREVTQ1JJUFRJT05fX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19ERVNDUklQVElPTl9fSUQgPSBBQ1RJVklUWV9ERVNDUklQVElPTl9fSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0RFU0NSSVBUSU9OX19PUkRFUklOR19HVUlERSA9IEFDVElWSVRZX0RFU0NSSVBUSU9OX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfREVTQ1JJUFRJT05fX1BSRVNFTlRBVElPTl9OQU1FID0gQUNUSVZJVFlfREVTQ1JJUFRJT05fX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0RFU0NSSVBUSU9OX19TVVBQUkVTU0VEID0gQUNUSVZJVFlfREVTQ1JJUFRJT05fX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29weXJpZ2h0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19ERVNDUklQVElPTl9fQ09QWVJJR0hUID0gQUNUSVZJVFlfREVTQ1JJUFRJT05fX0NPUFlSSUdIVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BdXRob3JzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19ERVNDUklQVElPTl9fQVVUSE9SUyA9IEFDVElWSVRZX0RFU0NSSVBUSU9OX19BVVRIT1JTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoYW5nZSBEYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19ERVNDUklQVElPTl9fQ0hBTkdFX0RBVEUgPSBBQ1RJVklUWV9ERVNDUklQVElPTl9fQ0hBTkdFX0RBVEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hhbmdlIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19ERVNDUklQVElPTl9fQ0hBTkdFX0RFU0NSSVBUSU9OID0gQUNUSVZJVFlfREVTQ1JJUFRJT05fX0NIQU5HRV9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WZXJzaW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19ERVNDUklQVElPTl9fVkVSU0lPTiA9IEFDVElWSVRZX0RFU0NSSVBUSU9OX19WRVJTSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1haW4gRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0RFU0NSSVBUSU9OX19NQUlOX0RFU0NSSVBUSU9OID0gQUNUSVZJVFlfREVTQ1JJUFRJT05fX01BSU5fREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+S2V5IENvbnNpZGVyYXRpb25zPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19ERVNDUklQVElPTl9fS0VZX0NPTlNJREVSQVRJT05TID0gQUNUSVZJVFlfREVTQ1JJUFRJT05fX0tFWV9DT05TSURFUkFUSU9OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TZWN0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0RFU0NSSVBUSU9OX19TRUNUSU9OID0gQUNUSVZJVFlfREVTQ1JJUFRJT05fX1NFQ1RJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXh0ZXJuYWwgSWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0RFU0NSSVBUSU9OX19FWFRFUk5BTF9JRCA9IEFDVElWSVRZX0RFU0NSSVBUSU9OX19FWFRFUk5BTF9JRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Vc2FnZSBHdWlkYW5jZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfREVTQ1JJUFRJT05fX1VTQUdFX0dVSURBTkNFID0gQUNUSVZJVFlfREVTQ1JJUFRJT05fX1VTQUdFX0dVSURBTkNFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFsdGVybmF0aXZlczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfREVTQ1JJUFRJT05fX0FMVEVSTkFUSVZFUyA9IEFDVElWSVRZX0RFU0NSSVBUSU9OX19BTFRFUk5BVElWRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SG93IFRvIFN0YWZmPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19ERVNDUklQVElPTl9fSE9XX1RPX1NUQUZGID0gQUNUSVZJVFlfREVTQ1JJUFRJT05fX0hPV19UT19TVEFGRjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QdXJwb3NlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19ERVNDUklQVElPTl9fUFVSUE9TRSA9IEFDVElWSVRZX0RFU0NSSVBUSU9OX19QVVJQT1NFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNjb3BlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19ERVNDUklQVElPTl9fU0NPUEUgPSBBQ1RJVklUWV9ERVNDUklQVElPTl9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Vc2FnZSBOb3RlczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfREVTQ1JJUFRJT05fX1VTQUdFX05PVEVTID0gQUNUSVZJVFlfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+UHJvY2VzcyBEZXNjcmlwdGlvbjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0RFU0NSSVBUSU9OX0ZFQVRVUkVfQ09VTlQgPSBBQ1RJVklUWV9ERVNDUklQVElPTl9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbkltcGwgPGVtPkRlbGl2ZXJ5IFByb2Nlc3MgRGVzY3JpcHRpb248L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXREZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OID0gMjE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX05BTUUgPSBQUk9DRVNTX0RFU0NSSVBUSU9OX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19HUk9VUCA9IFBST0NFU1NfREVTQ1JJUFRJT05fX0dST1VQOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX09XTkVEX1JVTEUgPSBQUk9DRVNTX0RFU0NSSVBUSU9OX19PV05FRF9SVUxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IFBST0NFU1NfREVTQ1JJUFRJT05fX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fQlJJRUZfREVTQ1JJUFRJT04gPSBQUk9DRVNTX0RFU0NSSVBUSU9OX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX0lEID0gUFJPQ0VTU19ERVNDUklQVElPTl9fSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19PUkRFUklOR19HVUlERSA9IFBST0NFU1NfREVTQ1JJUFRJT05fX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fUFJFU0VOVEFUSU9OX05BTUUgPSBQUk9DRVNTX0RFU0NSSVBUSU9OX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fU1VQUFJFU1NFRCA9IFBST0NFU1NfREVTQ1JJUFRJT05fX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29weXJpZ2h0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fQ09QWVJJR0hUID0gUFJPQ0VTU19ERVNDUklQVElPTl9fQ09QWVJJR0hUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkF1dGhvcnM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19BVVRIT1JTID0gUFJPQ0VTU19ERVNDUklQVElPTl9fQVVUSE9SUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGFuZ2UgRGF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX0NIQU5HRV9EQVRFID0gUFJPQ0VTU19ERVNDUklQVElPTl9fQ0hBTkdFX0RBVEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hhbmdlIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fQ0hBTkdFX0RFU0NSSVBUSU9OID0gUFJPQ0VTU19ERVNDUklQVElPTl9fQ0hBTkdFX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZlcnNpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19WRVJTSU9OID0gUFJPQ0VTU19ERVNDUklQVElPTl9fVkVSU0lPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYWluIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fTUFJTl9ERVNDUklQVElPTiA9IFBST0NFU1NfREVTQ1JJUFRJT05fX01BSU5fREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+S2V5IENvbnNpZGVyYXRpb25zPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fS0VZX0NPTlNJREVSQVRJT05TID0gUFJPQ0VTU19ERVNDUklQVElPTl9fS0VZX0NPTlNJREVSQVRJT05TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNlY3Rpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1NFQ1RJT04gPSBQUk9DRVNTX0RFU0NSSVBUSU9OX19TRUNUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4dGVybmFsIElkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fRVhURVJOQUxfSUQgPSBQUk9DRVNTX0RFU0NSSVBUSU9OX19FWFRFUk5BTF9JRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Vc2FnZSBHdWlkYW5jZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1VTQUdFX0dVSURBTkNFID0gUFJPQ0VTU19ERVNDUklQVElPTl9fVVNBR0VfR1VJREFOQ0U7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWx0ZXJuYXRpdmVzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fQUxURVJOQVRJVkVTID0gUFJPQ0VTU19ERVNDUklQVElPTl9fQUxURVJOQVRJVkVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkhvdyBUbyBTdGFmZjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX0hPV19UT19TVEFGRiA9IFBST0NFU1NfREVTQ1JJUFRJT05fX0hPV19UT19TVEFGRjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QdXJwb3NlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fUFVSUE9TRSA9IFBST0NFU1NfREVTQ1JJUFRJT05fX1BVUlBPU0U7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2NvcGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19TQ09QRSA9IFBST0NFU1NfREVTQ1JJUFRJT05fX1NDT1BFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVzYWdlIE5vdGVzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fVVNBR0VfTk9URVMgPSBQUk9DRVNTX0RFU0NSSVBUSU9OX19VU0FHRV9OT1RFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TY2FsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1NDQUxFID0gUFJPQ0VTU19ERVNDUklQVElPTl9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qcm9qZWN0IENoYXJhY3RlcmlzdGljczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1BST0pFQ1RfQ0hBUkFDVEVSSVNUSUNTID0gUFJPQ0VTU19ERVNDUklQVElPTl9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SaXNrIExldmVsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fUklTS19MRVZFTCA9IFBST0NFU1NfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXN0aW1hdGluZyBUZWNobmlxdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19FU1RJTUFUSU5HX1RFQ0hOSVFVRSA9IFBST0NFU1NfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJvamVjdCBNZW1iZXIgRXhwZXJ0aXNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fUFJPSkVDVF9NRU1CRVJfRVhQRVJUSVNFID0gUFJPQ0VTU19ERVNDUklQVElPTl9GRUFUVVJFX0NPVU5UICsgNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UeXBlIE9mIENvbnRyYWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fVFlQRV9PRl9DT05UUkFDVCA9IFBST0NFU1NfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCArIDU7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+RGVsaXZlcnkgUHJvY2VzcyBEZXNjcmlwdGlvbjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX0ZFQVRVUkVfQ09VTlQgPSBQUk9DRVNTX0RFU0NSSVBUSU9OX0ZFQVRVUkVfQ09VTlQgKyA2OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkRlc2NyaXB0b3JEZXNjcmlwdGlvbkltcGwgPGVtPkRlc2NyaXB0b3IgRGVzY3JpcHRpb248L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkRlc2NyaXB0b3JEZXNjcmlwdGlvbkltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0RGVzY3JpcHRvckRlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IERFU0NSSVBUT1JfREVTQ1JJUFRJT04gPSAyNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJUFRPUl9ERVNDUklQVElPTl9fTkFNRSA9IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklQVE9SX0RFU0NSSVBUSU9OX19HUk9VUCA9IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19HUk9VUDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklQVE9SX0RFU0NSSVBUSU9OX19PV05FRF9SVUxFID0gQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX09XTkVEX1JVTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSVBUT1JfREVTQ1JJUFRJT05fX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJUFRPUl9ERVNDUklQVElPTl9fQlJJRUZfREVTQ1JJUFRJT04gPSBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklQVE9SX0RFU0NSSVBUSU9OX19JRCA9IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19JRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSVBUT1JfREVTQ1JJUFRJT05fX09SREVSSU5HX0dVSURFID0gQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJUFRPUl9ERVNDUklQVElPTl9fUFJFU0VOVEFUSU9OX05BTUUgPSBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSVBUT1JfREVTQ1JJUFRJT05fX1NVUFBSRVNTRUQgPSBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db3B5cmlnaHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklQVE9SX0RFU0NSSVBUSU9OX19DT1BZUklHSFQgPSBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fQ09QWVJJR0hUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkF1dGhvcnM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklQVE9SX0RFU0NSSVBUSU9OX19BVVRIT1JTID0gQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX0FVVEhPUlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hhbmdlIERhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklQVE9SX0RFU0NSSVBUSU9OX19DSEFOR0VfREFURSA9IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19DSEFOR0VfREFURTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGFuZ2UgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklQVE9SX0RFU0NSSVBUSU9OX19DSEFOR0VfREVTQ1JJUFRJT04gPSBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fQ0hBTkdFX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZlcnNpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklQVE9SX0RFU0NSSVBUSU9OX19WRVJTSU9OID0gQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX1ZFUlNJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWFpbiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSVBUT1JfREVTQ1JJUFRJT05fX01BSU5fREVTQ1JJUFRJT04gPSBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fTUFJTl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5LZXkgQ29uc2lkZXJhdGlvbnM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklQVE9SX0RFU0NSSVBUSU9OX19LRVlfQ09OU0lERVJBVElPTlMgPSBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fS0VZX0NPTlNJREVSQVRJT05TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNlY3Rpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSVBUT1JfREVTQ1JJUFRJT05fX1NFQ1RJT04gPSBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fU0VDVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeHRlcm5hbCBJZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSVBUT1JfREVTQ1JJUFRJT05fX0VYVEVSTkFMX0lEID0gQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX0VYVEVSTkFMX0lEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVzYWdlIEd1aWRhbmNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJUFRPUl9ERVNDUklQVElPTl9fVVNBR0VfR1VJREFOQ0UgPSBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fVVNBR0VfR1VJREFOQ0U7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVmaW5lZCBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSVBUT1JfREVTQ1JJUFRJT05fX1JFRklORURfREVTQ1JJUFRJT04gPSBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5EZXNjcmlwdG9yIERlc2NyaXB0aW9uPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSVBUT1JfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCA9IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkRpc2NpcGxpbmVJbXBsIDxlbT5EaXNjaXBsaW5lPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5EaXNjaXBsaW5lSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXREaXNjaXBsaW5lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IERJU0NJUExJTkUgPSAyNTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElTQ0lQTElORV9fTkFNRSA9IENPTlRFTlRfQ0FURUdPUllfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXA8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJU0NJUExJTkVfX0dST1VQID0gQ09OVEVOVF9DQVRFR09SWV9fR1JPVVA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElTQ0lQTElORV9fT1dORURfUlVMRSA9IENPTlRFTlRfQ0FURUdPUllfX09XTkVEX1JVTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJU0NJUExJTkVfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gQ09OVEVOVF9DQVRFR09SWV9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESVNDSVBMSU5FX19CUklFRl9ERVNDUklQVElPTiA9IENPTlRFTlRfQ0FURUdPUllfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElTQ0lQTElORV9fSUQgPSBDT05URU5UX0NBVEVHT1JZX19JRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJU0NJUExJTkVfX09SREVSSU5HX0dVSURFID0gQ09OVEVOVF9DQVRFR09SWV9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESVNDSVBMSU5FX19QUkVTRU5UQVRJT05fTkFNRSA9IENPTlRFTlRfQ0FURUdPUllfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESVNDSVBMSU5FX19TVVBQUkVTU0VEID0gQ09OVEVOVF9DQVRFR09SWV9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESVNDSVBMSU5FX19QUkVTRU5UQVRJT04gPSBDT05URU5UX0NBVEVHT1JZX19QUkVTRU5UQVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RnVsZmlsbDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElTQ0lQTElORV9fRlVMRklMTCA9IENPTlRFTlRfQ0FURUdPUllfX0ZVTEZJTEw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgQWJzdHJhY3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESVNDSVBMSU5FX19JU19BQlNUUkFDVCA9IENPTlRFTlRfQ0FURUdPUllfX0lTX0FCU1RSQUNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElTQ0lQTElORV9fTk9ERUlDT04gPSBDT05URU5UX0NBVEVHT1JZX19OT0RFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TaGFwZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESVNDSVBMSU5FX19TSEFQRUlDT04gPSBDT05URU5UX0NBVEVHT1JZX19TSEFQRUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAxPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESVNDSVBMSU5FX19HUk9VUDEgPSBDT05URU5UX0NBVEVHT1JZX19HUk9VUDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hlY2tsaXN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESVNDSVBMSU5FX19DSEVDS0xJU1QgPSBDT05URU5UX0NBVEVHT1JZX19DSEVDS0xJU1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29uY2VwdDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElTQ0lQTElORV9fQ09OQ0VQVCA9IENPTlRFTlRfQ0FURUdPUllfX0NPTkNFUFQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXhhbXBsZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElTQ0lQTElORV9fRVhBTVBMRSA9IENPTlRFTlRfQ0FURUdPUllfX0VYQU1QTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZGVsaW5lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESVNDSVBMSU5FX19HVUlERUxJTkUgPSBDT05URU5UX0NBVEVHT1JZX19HVUlERUxJTkU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmV1c2FibGUgQXNzZXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJU0NJUExJTkVfX1JFVVNBQkxFX0FTU0VUID0gQ09OVEVOVF9DQVRFR09SWV9fUkVVU0FCTEVfQVNTRVQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcG9ydGluZyBNYXRlcmlhbDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElTQ0lQTElORV9fU1VQUE9SVElOR19NQVRFUklBTCA9IENPTlRFTlRfQ0FURUdPUllfX1NVUFBPUlRJTkdfTUFURVJJQUw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+V2hpdGVwYXBlcjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElTQ0lQTElORV9fV0hJVEVQQVBFUiA9IENPTlRFTlRfQ0FURUdPUllfX1dISVRFUEFQRVI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJU0NJUExJTkVfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQgPSBDT05URU5UX0NBVEVHT1JZX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESVNDSVBMSU5FX19WQVJJQUJJTElUWV9UWVBFID0gQ09OVEVOVF9DQVRFR09SWV9fVkFSSUFCSUxJVFlfVFlQRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJU0NJUExJTkVfX0dST1VQMiA9IENPTlRFTlRfQ0FURUdPUllfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGFzazwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElTQ0lQTElORV9fVEFTSyA9IENPTlRFTlRfQ0FURUdPUllfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3ViIERpc2NpcGxpbmU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJU0NJUExJTkVfX1NVQl9ESVNDSVBMSU5FID0gQ09OVEVOVF9DQVRFR09SWV9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZWZlcmVuY2UgV29ya2Zsb3c8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJU0NJUExJTkVfX1JFRkVSRU5DRV9XT1JLRkxPVyA9IENPTlRFTlRfQ0FURUdPUllfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+RGlzY2lwbGluZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESVNDSVBMSU5FX0ZFQVRVUkVfQ09VTlQgPSBDT05URU5UX0NBVEVHT1JZX0ZFQVRVUkVfQ09VTlQgKyA0OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkRpc2NpcGxpbmVHcm91cGluZ0ltcGwgPGVtPkRpc2NpcGxpbmUgR3JvdXBpbmc8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkRpc2NpcGxpbmVHcm91cGluZ0ltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0RGlzY2lwbGluZUdyb3VwaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IERJU0NJUExJTkVfR1JPVVBJTkcgPSAyNjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElTQ0lQTElORV9HUk9VUElOR19fTkFNRSA9IENPTlRFTlRfQ0FURUdPUllfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXA8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJU0NJUExJTkVfR1JPVVBJTkdfX0dST1VQID0gQ09OVEVOVF9DQVRFR09SWV9fR1JPVVA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElTQ0lQTElORV9HUk9VUElOR19fT1dORURfUlVMRSA9IENPTlRFTlRfQ0FURUdPUllfX09XTkVEX1JVTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJU0NJUExJTkVfR1JPVVBJTkdfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gQ09OVEVOVF9DQVRFR09SWV9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESVNDSVBMSU5FX0dST1VQSU5HX19CUklFRl9ERVNDUklQVElPTiA9IENPTlRFTlRfQ0FURUdPUllfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElTQ0lQTElORV9HUk9VUElOR19fSUQgPSBDT05URU5UX0NBVEVHT1JZX19JRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJU0NJUExJTkVfR1JPVVBJTkdfX09SREVSSU5HX0dVSURFID0gQ09OVEVOVF9DQVRFR09SWV9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESVNDSVBMSU5FX0dST1VQSU5HX19QUkVTRU5UQVRJT05fTkFNRSA9IENPTlRFTlRfQ0FURUdPUllfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESVNDSVBMSU5FX0dST1VQSU5HX19TVVBQUkVTU0VEID0gQ09OVEVOVF9DQVRFR09SWV9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESVNDSVBMSU5FX0dST1VQSU5HX19QUkVTRU5UQVRJT04gPSBDT05URU5UX0NBVEVHT1JZX19QUkVTRU5UQVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RnVsZmlsbDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElTQ0lQTElORV9HUk9VUElOR19fRlVMRklMTCA9IENPTlRFTlRfQ0FURUdPUllfX0ZVTEZJTEw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgQWJzdHJhY3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESVNDSVBMSU5FX0dST1VQSU5HX19JU19BQlNUUkFDVCA9IENPTlRFTlRfQ0FURUdPUllfX0lTX0FCU1RSQUNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElTQ0lQTElORV9HUk9VUElOR19fTk9ERUlDT04gPSBDT05URU5UX0NBVEVHT1JZX19OT0RFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TaGFwZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESVNDSVBMSU5FX0dST1VQSU5HX19TSEFQRUlDT04gPSBDT05URU5UX0NBVEVHT1JZX19TSEFQRUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAxPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESVNDSVBMSU5FX0dST1VQSU5HX19HUk9VUDEgPSBDT05URU5UX0NBVEVHT1JZX19HUk9VUDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hlY2tsaXN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESVNDSVBMSU5FX0dST1VQSU5HX19DSEVDS0xJU1QgPSBDT05URU5UX0NBVEVHT1JZX19DSEVDS0xJU1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29uY2VwdDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElTQ0lQTElORV9HUk9VUElOR19fQ09OQ0VQVCA9IENPTlRFTlRfQ0FURUdPUllfX0NPTkNFUFQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXhhbXBsZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElTQ0lQTElORV9HUk9VUElOR19fRVhBTVBMRSA9IENPTlRFTlRfQ0FURUdPUllfX0VYQU1QTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZGVsaW5lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESVNDSVBMSU5FX0dST1VQSU5HX19HVUlERUxJTkUgPSBDT05URU5UX0NBVEVHT1JZX19HVUlERUxJTkU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmV1c2FibGUgQXNzZXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJU0NJUExJTkVfR1JPVVBJTkdfX1JFVVNBQkxFX0FTU0VUID0gQ09OVEVOVF9DQVRFR09SWV9fUkVVU0FCTEVfQVNTRVQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcG9ydGluZyBNYXRlcmlhbDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElTQ0lQTElORV9HUk9VUElOR19fU1VQUE9SVElOR19NQVRFUklBTCA9IENPTlRFTlRfQ0FURUdPUllfX1NVUFBPUlRJTkdfTUFURVJJQUw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+V2hpdGVwYXBlcjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElTQ0lQTElORV9HUk9VUElOR19fV0hJVEVQQVBFUiA9IENPTlRFTlRfQ0FURUdPUllfX1dISVRFUEFQRVI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJU0NJUExJTkVfR1JPVVBJTkdfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQgPSBDT05URU5UX0NBVEVHT1JZX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESVNDSVBMSU5FX0dST1VQSU5HX19WQVJJQUJJTElUWV9UWVBFID0gQ09OVEVOVF9DQVRFR09SWV9fVkFSSUFCSUxJVFlfVFlQRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJU0NJUExJTkVfR1JPVVBJTkdfX0dST1VQMiA9IENPTlRFTlRfQ0FURUdPUllfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGlzY2lwbGluZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElTQ0lQTElORV9HUk9VUElOR19fRElTQ0lQTElORSA9IENPTlRFTlRfQ0FURUdPUllfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+RGlzY2lwbGluZSBHcm91cGluZzwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESVNDSVBMSU5FX0dST1VQSU5HX0ZFQVRVUkVfQ09VTlQgPSBDT05URU5UX0NBVEVHT1JZX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkRvY3VtZW50Um9vdEltcGwgPGVtPkRvY3VtZW50IFJvb3Q8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkRvY3VtZW50Um9vdEltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0RG9jdW1lbnRSb290KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IERPQ1VNRU5UX1JPT1QgPSAyNzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NaXhlZDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRE9DVU1FTlRfUk9PVF9fTUlYRUQgPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlhNTE5TIFByZWZpeCBNYXA8L2I+PC9lbT4nIG1hcC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBET0NVTUVOVF9ST09UX19YTUxOU19QUkVGSVhfTUFQID0gMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5YU0kgU2NoZW1hIExvY2F0aW9uPC9iPjwvZW0+JyBtYXAuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRE9DVU1FTlRfUk9PVF9fWFNJX1NDSEVNQV9MT0NBVElPTiA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIENvbmZpZ3VyYXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBET0NVTUVOVF9ST09UX19NRVRIT0RfQ09ORklHVVJBVElPTiA9IDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIExpYnJhcnk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBET0NVTUVOVF9ST09UX19NRVRIT0RfTElCUkFSWSA9IDQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIFBsdWdpbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERPQ1VNRU5UX1JPT1RfX01FVEhPRF9QTFVHSU4gPSA1OwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkRvY3VtZW50IFJvb3Q8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRE9DVU1FTlRfUk9PVF9GRUFUVVJFX0NPVU5UID0gNjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Eb21haW5JbXBsIDxlbT5Eb21haW48L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkRvbWFpbkltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0RG9tYWluKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IERPTUFJTiA9IDI4OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBET01BSU5fX05BTUUgPSBDT05URU5UX0NBVEVHT1JZX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBET01BSU5fX0dST1VQID0gQ09OVEVOVF9DQVRFR09SWV9fR1JPVVA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRE9NQUlOX19PV05FRF9SVUxFID0gQ09OVEVOVF9DQVRFR09SWV9fT1dORURfUlVMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRE9NQUlOX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IENPTlRFTlRfQ0FURUdPUllfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRE9NQUlOX19CUklFRl9ERVNDUklQVElPTiA9IENPTlRFTlRfQ0FURUdPUllfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRE9NQUlOX19JRCA9IENPTlRFTlRfQ0FURUdPUllfX0lEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRE9NQUlOX19PUkRFUklOR19HVUlERSA9IENPTlRFTlRfQ0FURUdPUllfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRE9NQUlOX19QUkVTRU5UQVRJT05fTkFNRSA9IENPTlRFTlRfQ0FURUdPUllfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBET01BSU5fX1NVUFBSRVNTRUQgPSBDT05URU5UX0NBVEVHT1JZX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERPTUFJTl9fUFJFU0VOVEFUSU9OID0gQ09OVEVOVF9DQVRFR09SWV9fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZ1bGZpbGw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERPTUFJTl9fRlVMRklMTCA9IENPTlRFTlRfQ0FURUdPUllfX0ZVTEZJTEw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgQWJzdHJhY3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBET01BSU5fX0lTX0FCU1RSQUNUID0gQ09OVEVOVF9DQVRFR09SWV9fSVNfQUJTVFJBQ1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm9kZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBET01BSU5fX05PREVJQ09OID0gQ09OVEVOVF9DQVRFR09SWV9fTk9ERUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2hhcGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRE9NQUlOX19TSEFQRUlDT04gPSBDT05URU5UX0NBVEVHT1JZX19TSEFQRUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAxPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBET01BSU5fX0dST1VQMSA9IENPTlRFTlRfQ0FURUdPUllfX0dST1VQMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGVja2xpc3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERPTUFJTl9fQ0hFQ0tMSVNUID0gQ09OVEVOVF9DQVRFR09SWV9fQ0hFQ0tMSVNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbmNlcHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERPTUFJTl9fQ09OQ0VQVCA9IENPTlRFTlRfQ0FURUdPUllfX0NPTkNFUFQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXhhbXBsZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRE9NQUlOX19FWEFNUExFID0gQ09OVEVOVF9DQVRFR09SWV9fRVhBTVBMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkZWxpbmU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERPTUFJTl9fR1VJREVMSU5FID0gQ09OVEVOVF9DQVRFR09SWV9fR1VJREVMSU5FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJldXNhYmxlIEFzc2V0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBET01BSU5fX1JFVVNBQkxFX0FTU0VUID0gQ09OVEVOVF9DQVRFR09SWV9fUkVVU0FCTEVfQVNTRVQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcG9ydGluZyBNYXRlcmlhbDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRE9NQUlOX19TVVBQT1JUSU5HX01BVEVSSUFMID0gQ09OVEVOVF9DQVRFR09SWV9fU1VQUE9SVElOR19NQVRFUklBTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5XaGl0ZXBhcGVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBET01BSU5fX1dISVRFUEFQRVIgPSBDT05URU5UX0NBVEVHT1JZX19XSElURVBBUEVSOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBET01BSU5fX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQgPSBDT05URU5UX0NBVEVHT1JZX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBET01BSU5fX1ZBUklBQklMSVRZX1RZUEUgPSBDT05URU5UX0NBVEVHT1JZX19WQVJJQUJJTElUWV9UWVBFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRE9NQUlOX19HUk9VUDIgPSBDT05URU5UX0NBVEVHT1JZX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldvcmsgUHJvZHVjdDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRE9NQUlOX19XT1JLX1BST0RVQ1QgPSBDT05URU5UX0NBVEVHT1JZX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1YmRvbWFpbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRE9NQUlOX19TVUJET01BSU4gPSBDT05URU5UX0NBVEVHT1JZX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkRvbWFpbjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBET01BSU5fRkVBVFVSRV9DT1VOVCA9IENPTlRFTlRfQ0FURUdPUllfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuRXN0aW1hdGVJbXBsIDxlbT5Fc3RpbWF0ZTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuRXN0aW1hdGVJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldEVzdGltYXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IEVTVElNQVRFID0gMzA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVTVElNQVRFX19OQU1FID0gR1VJREFOQ0VfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXA8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVTVElNQVRFX19HUk9VUCA9IEdVSURBTkNFX19HUk9VUDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFU1RJTUFURV9fT1dORURfUlVMRSA9IEdVSURBTkNFX19PV05FRF9SVUxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFU1RJTUFURV9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBHVUlEQU5DRV9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFU1RJTUFURV9fQlJJRUZfREVTQ1JJUFRJT04gPSBHVUlEQU5DRV9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFU1RJTUFURV9fSUQgPSBHVUlEQU5DRV9fSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFU1RJTUFURV9fT1JERVJJTkdfR1VJREUgPSBHVUlEQU5DRV9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFU1RJTUFURV9fUFJFU0VOVEFUSU9OX05BTUUgPSBHVUlEQU5DRV9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVTVElNQVRFX19TVVBQUkVTU0VEID0gR1VJREFOQ0VfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVNUSU1BVEVfX1BSRVNFTlRBVElPTiA9IEdVSURBTkNFX19QUkVTRU5UQVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RnVsZmlsbDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVNUSU1BVEVfX0ZVTEZJTEwgPSBHVUlEQU5DRV9fRlVMRklMTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBBYnN0cmFjdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVTVElNQVRFX19JU19BQlNUUkFDVCA9IEdVSURBTkNFX19JU19BQlNUUkFDVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob2RlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVTVElNQVRFX19OT0RFSUNPTiA9IEdVSURBTkNFX19OT0RFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TaGFwZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFU1RJTUFURV9fU0hBUEVJQ09OID0gR1VJREFOQ0VfX1NIQVBFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDE8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVTVElNQVRFX19HUk9VUDEgPSBHVUlEQU5DRV9fR1JPVVAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoZWNrbGlzdDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVNUSU1BVEVfX0NIRUNLTElTVCA9IEdVSURBTkNFX19DSEVDS0xJU1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29uY2VwdDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVNUSU1BVEVfX0NPTkNFUFQgPSBHVUlEQU5DRV9fQ09OQ0VQVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeGFtcGxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFU1RJTUFURV9fRVhBTVBMRSA9IEdVSURBTkNFX19FWEFNUExFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWRlbGluZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVNUSU1BVEVfX0dVSURFTElORSA9IEdVSURBTkNFX19HVUlERUxJTkU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmV1c2FibGUgQXNzZXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVTVElNQVRFX19SRVVTQUJMRV9BU1NFVCA9IEdVSURBTkNFX19SRVVTQUJMRV9BU1NFVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwb3J0aW5nIE1hdGVyaWFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFU1RJTUFURV9fU1VQUE9SVElOR19NQVRFUklBTCA9IEdVSURBTkNFX19TVVBQT1JUSU5HX01BVEVSSUFMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldoaXRlcGFwZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVTVElNQVRFX19XSElURVBBUEVSID0gR1VJREFOQ0VfX1dISVRFUEFQRVI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVTVElNQVRFX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UID0gR1VJREFOQ0VfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVTVElNQVRFX19WQVJJQUJJTElUWV9UWVBFID0gR1VJREFOQ0VfX1ZBUklBQklMSVRZX1RZUEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFU1RJTUFURV9fR1JPVVAyID0gR1VJREFOQ0VfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXN0aW1hdGlvbiBNZXRyaWM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVTVElNQVRFX19FU1RJTUFUSU9OX01FVFJJQyA9IEdVSURBTkNFX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVzdGltYXRpb24gQ29uc2lkZXJhdGlvbnM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVTVElNQVRFX19FU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TID0gR1VJREFOQ0VfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+RXN0aW1hdGU8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVNUSU1BVEVfRkVBVFVSRV9DT1VOVCA9IEdVSURBTkNFX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkVzdGltYXRpbmdNZXRyaWNJbXBsIDxlbT5Fc3RpbWF0aW5nIE1ldHJpYzwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuRXN0aW1hdGluZ01ldHJpY0ltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0RXN0aW1hdGluZ01ldHJpYygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBFU1RJTUFUSU5HX01FVFJJQyA9IDMxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFU1RJTUFUSU5HX01FVFJJQ19fTkFNRSA9IEdVSURBTkNFX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFU1RJTUFUSU5HX01FVFJJQ19fR1JPVVAgPSBHVUlEQU5DRV9fR1JPVVA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVNUSU1BVElOR19NRVRSSUNfX09XTkVEX1JVTEUgPSBHVUlEQU5DRV9fT1dORURfUlVMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVNUSU1BVElOR19NRVRSSUNfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gR1VJREFOQ0VfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVNUSU1BVElOR19NRVRSSUNfX0JSSUVGX0RFU0NSSVBUSU9OID0gR1VJREFOQ0VfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVNUSU1BVElOR19NRVRSSUNfX0lEID0gR1VJREFOQ0VfX0lEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVNUSU1BVElOR19NRVRSSUNfX09SREVSSU5HX0dVSURFID0gR1VJREFOQ0VfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVNUSU1BVElOR19NRVRSSUNfX1BSRVNFTlRBVElPTl9OQU1FID0gR1VJREFOQ0VfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFU1RJTUFUSU5HX01FVFJJQ19fU1VQUFJFU1NFRCA9IEdVSURBTkNFX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVTVElNQVRJTkdfTUVUUklDX19QUkVTRU5UQVRJT04gPSBHVUlEQU5DRV9fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZ1bGZpbGw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVTVElNQVRJTkdfTUVUUklDX19GVUxGSUxMID0gR1VJREFOQ0VfX0ZVTEZJTEw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgQWJzdHJhY3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFU1RJTUFUSU5HX01FVFJJQ19fSVNfQUJTVFJBQ1QgPSBHVUlEQU5DRV9fSVNfQUJTVFJBQ1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm9kZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFU1RJTUFUSU5HX01FVFJJQ19fTk9ERUlDT04gPSBHVUlEQU5DRV9fTk9ERUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2hhcGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVNUSU1BVElOR19NRVRSSUNfX1NIQVBFSUNPTiA9IEdVSURBTkNFX19TSEFQRUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAxPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFU1RJTUFUSU5HX01FVFJJQ19fR1JPVVAxID0gR1VJREFOQ0VfX0dST1VQMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGVja2xpc3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVTVElNQVRJTkdfTUVUUklDX19DSEVDS0xJU1QgPSBHVUlEQU5DRV9fQ0hFQ0tMSVNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbmNlcHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVTVElNQVRJTkdfTUVUUklDX19DT05DRVBUID0gR1VJREFOQ0VfX0NPTkNFUFQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXhhbXBsZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVNUSU1BVElOR19NRVRSSUNfX0VYQU1QTEUgPSBHVUlEQU5DRV9fRVhBTVBMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkZWxpbmU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVTVElNQVRJTkdfTUVUUklDX19HVUlERUxJTkUgPSBHVUlEQU5DRV9fR1VJREVMSU5FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJldXNhYmxlIEFzc2V0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFU1RJTUFUSU5HX01FVFJJQ19fUkVVU0FCTEVfQVNTRVQgPSBHVUlEQU5DRV9fUkVVU0FCTEVfQVNTRVQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcG9ydGluZyBNYXRlcmlhbDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVNUSU1BVElOR19NRVRSSUNfX1NVUFBPUlRJTkdfTUFURVJJQUwgPSBHVUlEQU5DRV9fU1VQUE9SVElOR19NQVRFUklBTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5XaGl0ZXBhcGVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFU1RJTUFUSU5HX01FVFJJQ19fV0hJVEVQQVBFUiA9IEdVSURBTkNFX19XSElURVBBUEVSOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFU1RJTUFUSU5HX01FVFJJQ19fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVCA9IEdVSURBTkNFX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFU1RJTUFUSU5HX01FVFJJQ19fVkFSSUFCSUxJVFlfVFlQRSA9IEdVSURBTkNFX19WQVJJQUJJTElUWV9UWVBFOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkVzdGltYXRpbmcgTWV0cmljPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVTVElNQVRJTkdfTUVUUklDX0ZFQVRVUkVfQ09VTlQgPSBHVUlEQU5DRV9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnNJbXBsIDxlbT5Fc3RpbWF0aW9uIENvbnNpZGVyYXRpb25zPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnNJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldEVzdGltYXRpb25Db25zaWRlcmF0aW9ucygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBFU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TID0gMzI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVTVElNQVRJT05fQ09OU0lERVJBVElPTlNfX05BTUUgPSBHVUlEQU5DRV9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVNUSU1BVElPTl9DT05TSURFUkFUSU9OU19fR1JPVVAgPSBHVUlEQU5DRV9fR1JPVVA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVNUSU1BVElPTl9DT05TSURFUkFUSU9OU19fT1dORURfUlVMRSA9IEdVSURBTkNFX19PV05FRF9SVUxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IEdVSURBTkNFX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVTVElNQVRJT05fQ09OU0lERVJBVElPTlNfX0JSSUVGX0RFU0NSSVBUSU9OID0gR1VJREFOQ0VfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVNUSU1BVElPTl9DT05TSURFUkFUSU9OU19fSUQgPSBHVUlEQU5DRV9fSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TX19PUkRFUklOR19HVUlERSA9IEdVSURBTkNFX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVTVElNQVRJT05fQ09OU0lERVJBVElPTlNfX1BSRVNFTlRBVElPTl9OQU1FID0gR1VJREFOQ0VfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TX19TVVBQUkVTU0VEID0gR1VJREFOQ0VfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVNUSU1BVElPTl9DT05TSURFUkFUSU9OU19fUFJFU0VOVEFUSU9OID0gR1VJREFOQ0VfX1BSRVNFTlRBVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GdWxmaWxsPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TX19GVUxGSUxMID0gR1VJREFOQ0VfX0ZVTEZJTEw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgQWJzdHJhY3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TX19JU19BQlNUUkFDVCA9IEdVSURBTkNFX19JU19BQlNUUkFDVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob2RlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVTVElNQVRJT05fQ09OU0lERVJBVElPTlNfX05PREVJQ09OID0gR1VJREFOQ0VfX05PREVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNoYXBlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVTVElNQVRJT05fQ09OU0lERVJBVElPTlNfX1NIQVBFSUNPTiA9IEdVSURBTkNFX19TSEFQRUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAxPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TX19HUk9VUDEgPSBHVUlEQU5DRV9fR1JPVVAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoZWNrbGlzdDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVNUSU1BVElPTl9DT05TSURFUkFUSU9OU19fQ0hFQ0tMSVNUID0gR1VJREFOQ0VfX0NIRUNLTElTVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db25jZXB0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TX19DT05DRVBUID0gR1VJREFOQ0VfX0NPTkNFUFQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXhhbXBsZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVNUSU1BVElPTl9DT05TSURFUkFUSU9OU19fRVhBTVBMRSA9IEdVSURBTkNFX19FWEFNUExFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWRlbGluZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVNUSU1BVElPTl9DT05TSURFUkFUSU9OU19fR1VJREVMSU5FID0gR1VJREFOQ0VfX0dVSURFTElORTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXVzYWJsZSBBc3NldDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVNUSU1BVElPTl9DT05TSURFUkFUSU9OU19fUkVVU0FCTEVfQVNTRVQgPSBHVUlEQU5DRV9fUkVVU0FCTEVfQVNTRVQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcG9ydGluZyBNYXRlcmlhbDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVNUSU1BVElPTl9DT05TSURFUkFUSU9OU19fU1VQUE9SVElOR19NQVRFUklBTCA9IEdVSURBTkNFX19TVVBQT1JUSU5HX01BVEVSSUFMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldoaXRlcGFwZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVTVElNQVRJT05fQ09OU0lERVJBVElPTlNfX1dISVRFUEFQRVIgPSBHVUlEQU5DRV9fV0hJVEVQQVBFUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVNUSU1BVElPTl9DT05TSURFUkFUSU9OU19fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVCA9IEdVSURBTkNFX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TX19WQVJJQUJJTElUWV9UWVBFID0gR1VJREFOQ0VfX1ZBUklBQklMSVRZX1RZUEU7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+RXN0aW1hdGlvbiBDb25zaWRlcmF0aW9uczwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TX0ZFQVRVUkVfQ09VTlQgPSBHVUlEQU5DRV9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5FeGFtcGxlSW1wbCA8ZW0+RXhhbXBsZTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuRXhhbXBsZUltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0RXhhbXBsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBFWEFNUExFID0gMzM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVYQU1QTEVfX05BTUUgPSBHVUlEQU5DRV9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVhBTVBMRV9fR1JPVVAgPSBHVUlEQU5DRV9fR1JPVVA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVhBTVBMRV9fT1dORURfUlVMRSA9IEdVSURBTkNFX19PV05FRF9SVUxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFWEFNUExFX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IEdVSURBTkNFX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVYQU1QTEVfX0JSSUVGX0RFU0NSSVBUSU9OID0gR1VJREFOQ0VfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVhBTVBMRV9fSUQgPSBHVUlEQU5DRV9fSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFWEFNUExFX19PUkRFUklOR19HVUlERSA9IEdVSURBTkNFX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVYQU1QTEVfX1BSRVNFTlRBVElPTl9OQU1FID0gR1VJREFOQ0VfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFWEFNUExFX19TVVBQUkVTU0VEID0gR1VJREFOQ0VfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVhBTVBMRV9fUFJFU0VOVEFUSU9OID0gR1VJREFOQ0VfX1BSRVNFTlRBVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GdWxmaWxsPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFWEFNUExFX19GVUxGSUxMID0gR1VJREFOQ0VfX0ZVTEZJTEw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgQWJzdHJhY3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFWEFNUExFX19JU19BQlNUUkFDVCA9IEdVSURBTkNFX19JU19BQlNUUkFDVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob2RlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVYQU1QTEVfX05PREVJQ09OID0gR1VJREFOQ0VfX05PREVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNoYXBlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVYQU1QTEVfX1NIQVBFSUNPTiA9IEdVSURBTkNFX19TSEFQRUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAxPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFWEFNUExFX19HUk9VUDEgPSBHVUlEQU5DRV9fR1JPVVAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoZWNrbGlzdDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVhBTVBMRV9fQ0hFQ0tMSVNUID0gR1VJREFOQ0VfX0NIRUNLTElTVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db25jZXB0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFWEFNUExFX19DT05DRVBUID0gR1VJREFOQ0VfX0NPTkNFUFQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXhhbXBsZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVhBTVBMRV9fRVhBTVBMRSA9IEdVSURBTkNFX19FWEFNUExFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWRlbGluZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVhBTVBMRV9fR1VJREVMSU5FID0gR1VJREFOQ0VfX0dVSURFTElORTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXVzYWJsZSBBc3NldDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVhBTVBMRV9fUkVVU0FCTEVfQVNTRVQgPSBHVUlEQU5DRV9fUkVVU0FCTEVfQVNTRVQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcG9ydGluZyBNYXRlcmlhbDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVhBTVBMRV9fU1VQUE9SVElOR19NQVRFUklBTCA9IEdVSURBTkNFX19TVVBQT1JUSU5HX01BVEVSSUFMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldoaXRlcGFwZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVYQU1QTEVfX1dISVRFUEFQRVIgPSBHVUlEQU5DRV9fV0hJVEVQQVBFUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVhBTVBMRV9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVCA9IEdVSURBTkNFX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFWEFNUExFX19WQVJJQUJJTElUWV9UWVBFID0gR1VJREFOQ0VfX1ZBUklBQklMSVRZX1RZUEU7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+RXhhbXBsZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFWEFNUExFX0ZFQVRVUkVfQ09VTlQgPSBHVUlEQU5DRV9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5HdWlkYW5jZURlc2NyaXB0aW9uSW1wbCA8ZW0+R3VpZGFuY2UgRGVzY3JpcHRpb248L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkd1aWRhbmNlRGVzY3JpcHRpb25JbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldEd1aWRhbmNlRGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgR1VJREFOQ0VfREVTQ1JJUFRJT04gPSAzNTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREFOQ0VfREVTQ1JJUFRJT05fX05BTUUgPSBDT05URU5UX0RFU0NSSVBUSU9OX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHVUlEQU5DRV9ERVNDUklQVElPTl9fR1JPVVAgPSBDT05URU5UX0RFU0NSSVBUSU9OX19HUk9VUDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHVUlEQU5DRV9ERVNDUklQVElPTl9fT1dORURfUlVMRSA9IENPTlRFTlRfREVTQ1JJUFRJT05fX09XTkVEX1JVTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURBTkNFX0RFU0NSSVBUSU9OX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IENPTlRFTlRfREVTQ1JJUFRJT05fX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREFOQ0VfREVTQ1JJUFRJT05fX0JSSUVGX0RFU0NSSVBUSU9OID0gQ09OVEVOVF9ERVNDUklQVElPTl9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHVUlEQU5DRV9ERVNDUklQVElPTl9fSUQgPSBDT05URU5UX0RFU0NSSVBUSU9OX19JRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURBTkNFX0RFU0NSSVBUSU9OX19PUkRFUklOR19HVUlERSA9IENPTlRFTlRfREVTQ1JJUFRJT05fX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREFOQ0VfREVTQ1JJUFRJT05fX1BSRVNFTlRBVElPTl9OQU1FID0gQ09OVEVOVF9ERVNDUklQVElPTl9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURBTkNFX0RFU0NSSVBUSU9OX19TVVBQUkVTU0VEID0gQ09OVEVOVF9ERVNDUklQVElPTl9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db3B5cmlnaHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHVUlEQU5DRV9ERVNDUklQVElPTl9fQ09QWVJJR0hUID0gQ09OVEVOVF9ERVNDUklQVElPTl9fQ09QWVJJR0hUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkF1dGhvcnM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHVUlEQU5DRV9ERVNDUklQVElPTl9fQVVUSE9SUyA9IENPTlRFTlRfREVTQ1JJUFRJT05fX0FVVEhPUlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hhbmdlIERhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHVUlEQU5DRV9ERVNDUklQVElPTl9fQ0hBTkdFX0RBVEUgPSBDT05URU5UX0RFU0NSSVBUSU9OX19DSEFOR0VfREFURTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGFuZ2UgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHVUlEQU5DRV9ERVNDUklQVElPTl9fQ0hBTkdFX0RFU0NSSVBUSU9OID0gQ09OVEVOVF9ERVNDUklQVElPTl9fQ0hBTkdFX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZlcnNpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHVUlEQU5DRV9ERVNDUklQVElPTl9fVkVSU0lPTiA9IENPTlRFTlRfREVTQ1JJUFRJT05fX1ZFUlNJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWFpbiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURBTkNFX0RFU0NSSVBUSU9OX19NQUlOX0RFU0NSSVBUSU9OID0gQ09OVEVOVF9ERVNDUklQVElPTl9fTUFJTl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5LZXkgQ29uc2lkZXJhdGlvbnM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHVUlEQU5DRV9ERVNDUklQVElPTl9fS0VZX0NPTlNJREVSQVRJT05TID0gQ09OVEVOVF9ERVNDUklQVElPTl9fS0VZX0NPTlNJREVSQVRJT05TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNlY3Rpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURBTkNFX0RFU0NSSVBUSU9OX19TRUNUSU9OID0gQ09OVEVOVF9ERVNDUklQVElPTl9fU0VDVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeHRlcm5hbCBJZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURBTkNFX0RFU0NSSVBUSU9OX19FWFRFUk5BTF9JRCA9IENPTlRFTlRfREVTQ1JJUFRJT05fX0VYVEVSTkFMX0lEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkF0dGFjaG1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHVUlEQU5DRV9ERVNDUklQVElPTl9fQVRUQUNITUVOVCA9IENPTlRFTlRfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+R3VpZGFuY2UgRGVzY3JpcHRpb248L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREFOQ0VfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCA9IENPTlRFTlRfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuR3VpZGVsaW5lSW1wbCA8ZW0+R3VpZGVsaW5lPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5HdWlkZWxpbmVJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldEd1aWRlbGluZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBHVUlERUxJTkUgPSAzNjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREVMSU5FX19OQU1FID0gR1VJREFOQ0VfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXA8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURFTElORV9fR1JPVVAgPSBHVUlEQU5DRV9fR1JPVVA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREVMSU5FX19PV05FRF9SVUxFID0gR1VJREFOQ0VfX09XTkVEX1JVTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURFTElORV9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBHVUlEQU5DRV9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHVUlERUxJTkVfX0JSSUVGX0RFU0NSSVBUSU9OID0gR1VJREFOQ0VfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREVMSU5FX19JRCA9IEdVSURBTkNFX19JRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURFTElORV9fT1JERVJJTkdfR1VJREUgPSBHVUlEQU5DRV9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHVUlERUxJTkVfX1BSRVNFTlRBVElPTl9OQU1FID0gR1VJREFOQ0VfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHVUlERUxJTkVfX1NVUFBSRVNTRUQgPSBHVUlEQU5DRV9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHVUlERUxJTkVfX1BSRVNFTlRBVElPTiA9IEdVSURBTkNFX19QUkVTRU5UQVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RnVsZmlsbDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREVMSU5FX19GVUxGSUxMID0gR1VJREFOQ0VfX0ZVTEZJTEw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgQWJzdHJhY3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHVUlERUxJTkVfX0lTX0FCU1RSQUNUID0gR1VJREFOQ0VfX0lTX0FCU1RSQUNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREVMSU5FX19OT0RFSUNPTiA9IEdVSURBTkNFX19OT0RFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TaGFwZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHVUlERUxJTkVfX1NIQVBFSUNPTiA9IEdVSURBTkNFX19TSEFQRUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAxPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHVUlERUxJTkVfX0dST1VQMSA9IEdVSURBTkNFX19HUk9VUDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hlY2tsaXN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHVUlERUxJTkVfX0NIRUNLTElTVCA9IEdVSURBTkNFX19DSEVDS0xJU1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29uY2VwdDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREVMSU5FX19DT05DRVBUID0gR1VJREFOQ0VfX0NPTkNFUFQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXhhbXBsZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREVMSU5FX19FWEFNUExFID0gR1VJREFOQ0VfX0VYQU1QTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZGVsaW5lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHVUlERUxJTkVfX0dVSURFTElORSA9IEdVSURBTkNFX19HVUlERUxJTkU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmV1c2FibGUgQXNzZXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURFTElORV9fUkVVU0FCTEVfQVNTRVQgPSBHVUlEQU5DRV9fUkVVU0FCTEVfQVNTRVQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcG9ydGluZyBNYXRlcmlhbDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREVMSU5FX19TVVBQT1JUSU5HX01BVEVSSUFMID0gR1VJREFOQ0VfX1NVUFBPUlRJTkdfTUFURVJJQUw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+V2hpdGVwYXBlcjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREVMSU5FX19XSElURVBBUEVSID0gR1VJREFOQ0VfX1dISVRFUEFQRVI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURFTElORV9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVCA9IEdVSURBTkNFX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHVUlERUxJTkVfX1ZBUklBQklMSVRZX1RZUEUgPSBHVUlEQU5DRV9fVkFSSUFCSUxJVFlfVFlQRTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5HdWlkZWxpbmU8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREVMSU5FX0ZFQVRVUkVfQ09VTlQgPSBHVUlEQU5DRV9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5JdGVyYXRpb25JbXBsIDxlbT5JdGVyYXRpb248L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkl0ZXJhdGlvbkltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0SXRlcmF0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IElURVJBVElPTiA9IDM3OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJVEVSQVRJT05fX05BTUUgPSBBQ1RJVklUWV9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSVRFUkFUSU9OX19HUk9VUCA9IEFDVElWSVRZX19HUk9VUDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJVEVSQVRJT05fX09XTkVEX1JVTEUgPSBBQ1RJVklUWV9fT1dORURfUlVMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSVRFUkFUSU9OX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IEFDVElWSVRZX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElURVJBVElPTl9fQlJJRUZfREVTQ1JJUFRJT04gPSBBQ1RJVklUWV9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJVEVSQVRJT05fX0lEID0gQUNUSVZJVFlfX0lEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSVRFUkFUSU9OX19PUkRFUklOR19HVUlERSA9IEFDVElWSVRZX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElURVJBVElPTl9fUFJFU0VOVEFUSU9OX05BTUUgPSBBQ1RJVklUWV9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElURVJBVElPTl9fU1VQUFJFU1NFRCA9IEFDVElWSVRZX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElURVJBVElPTl9fUFJFU0VOVEFUSU9OID0gQUNUSVZJVFlfX1BSRVNFTlRBVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GdWxmaWxsPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJVEVSQVRJT05fX0ZVTEZJTEwgPSBBQ1RJVklUWV9fRlVMRklMTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBBYnN0cmFjdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElURVJBVElPTl9fSVNfQUJTVFJBQ1QgPSBBQ1RJVklUWV9fSVNfQUJTVFJBQ1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm9kZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJVEVSQVRJT05fX05PREVJQ09OID0gQUNUSVZJVFlfX05PREVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNoYXBlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElURVJBVElPTl9fU0hBUEVJQ09OID0gQUNUSVZJVFlfX1NIQVBFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50ZWQgQWZ0ZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJVEVSQVRJT05fX1BSRVNFTlRFRF9BRlRFUiA9IEFDVElWSVRZX19QUkVTRU5URURfQUZURVI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGVkIEJlZm9yZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElURVJBVElPTl9fUFJFU0VOVEVEX0JFRk9SRSA9IEFDVElWSVRZX19QUkVTRU5URURfQkVGT1JFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBsYW5uaW5nIERhdGE8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJVEVSQVRJT05fX1BMQU5OSU5HX0RBVEEgPSBBQ1RJVklUWV9fUExBTk5JTkdfREFUQTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBlciBBY3Rpdml0eTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElURVJBVElPTl9fU1VQRVJfQUNUSVZJVFkgPSBBQ1RJVklUWV9fU1VQRVJfQUNUSVZJVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAxPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJVEVSQVRJT05fX0dST1VQMSA9IEFDVElWSVRZX19HUk9VUDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hlY2tsaXN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJVEVSQVRJT05fX0NIRUNLTElTVCA9IEFDVElWSVRZX19DSEVDS0xJU1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29uY2VwdDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSVRFUkFUSU9OX19DT05DRVBUID0gQUNUSVZJVFlfX0NPTkNFUFQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXhhbXBsZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSVRFUkFUSU9OX19FWEFNUExFID0gQUNUSVZJVFlfX0VYQU1QTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZGVsaW5lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJVEVSQVRJT05fX0dVSURFTElORSA9IEFDVElWSVRZX19HVUlERUxJTkU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmV1c2FibGUgQXNzZXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElURVJBVElPTl9fUkVVU0FCTEVfQVNTRVQgPSBBQ1RJVklUWV9fUkVVU0FCTEVfQVNTRVQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcG9ydGluZyBNYXRlcmlhbDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSVRFUkFUSU9OX19TVVBQT1JUSU5HX01BVEVSSUFMID0gQUNUSVZJVFlfX1NVUFBPUlRJTkdfTUFURVJJQUw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+V2hpdGVwYXBlcjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSVRFUkFUSU9OX19XSElURVBBUEVSID0gQUNUSVZJVFlfX1dISVRFUEFQRVI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SGFzIE11bHRpcGxlIE9jY3VycmVuY2VzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSVRFUkFUSU9OX19IQVNfTVVMVElQTEVfT0NDVVJSRU5DRVMgPSBBQ1RJVklUWV9fSEFTX01VTFRJUExFX09DQ1VSUkVOQ0VTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIE9wdGlvbmFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSVRFUkFUSU9OX19JU19PUFRJT05BTCA9IEFDVElWSVRZX19JU19PUFRJT05BTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBQbGFubmVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSVRFUkFUSU9OX19JU19QTEFOTkVEID0gQUNUSVZJVFlfX0lTX1BMQU5ORUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlZml4PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSVRFUkFUSU9OX19QUkVGSVggPSBBQ1RJVklUWV9fUFJFRklYOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSVRFUkFUSU9OX19HUk9VUDIgPSBBQ1RJVklUWV9fR1JPVVAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZWRlY2Vzc29yPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJVEVSQVRJT05fX1BSRURFQ0VTU09SID0gQUNUSVZJVFlfX1BSRURFQ0VTU09SOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIEV2ZW50IERyaXZlbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElURVJBVElPTl9fSVNfRVZFTlRfRFJJVkVOID0gQUNUSVZJVFlfX0lTX0VWRU5UX0RSSVZFTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBPbmdvaW5nPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSVRFUkFUSU9OX19JU19PTkdPSU5HID0gQUNUSVZJVFlfX0lTX09OR09JTkc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgUmVwZWF0YWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElURVJBVElPTl9fSVNfUkVQRUFUQUJMRSA9IEFDVElWSVRZX19JU19SRVBFQVRBQkxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZWNvbmRpdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElURVJBVElPTl9fUFJFQ09ORElUSU9OID0gQUNUSVZJVFlfX1BSRUNPTkRJVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qb3N0Y29uZGl0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSVRFUkFUSU9OX19QT1NUQ09ORElUSU9OID0gQUNUSVZJVFlfX1BPU1RDT05ESVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJVEVSQVRJT05fX0dST1VQMyA9IEFDVElWSVRZX19HUk9VUDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJlYWtkb3duIEVsZW1lbnQ8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElURVJBVElPTl9fQlJFQUtET1dOX0VMRU1FTlQgPSBBQ1RJVklUWV9fQlJFQUtET1dOX0VMRU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Um9hZG1hcDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSVRFUkFUSU9OX19ST0FETUFQID0gQUNUSVZJVFlfX1JPQURNQVA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgRW5hY3RhYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSVRFUkFUSU9OX19JU19FTkFDVEFCTEUgPSBBQ1RJVklUWV9fSVNfRU5BQ1RBQkxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJVEVSQVRJT05fX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQgPSBBQ1RJVklUWV9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSVRFUkFUSU9OX19WQVJJQUJJTElUWV9UWVBFID0gQUNUSVZJVFlfX1ZBUklBQklMSVRZX1RZUEU7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+SXRlcmF0aW9uPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElURVJBVElPTl9GRUFUVVJFX0NPVU5UID0gQUNUSVZJVFlfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuS2luZEltcGwgPGVtPktpbmQ8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLktpbmRJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldEtpbmQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgS0lORCA9IDM4OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBLSU5EX19OQU1FID0gQ09OVEVOVF9FTEVNRU5UX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBLSU5EX19HUk9VUCA9IENPTlRFTlRfRUxFTUVOVF9fR1JPVVA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgS0lORF9fT1dORURfUlVMRSA9IENPTlRFTlRfRUxFTUVOVF9fT1dORURfUlVMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgS0lORF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBDT05URU5UX0VMRU1FTlRfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgS0lORF9fQlJJRUZfREVTQ1JJUFRJT04gPSBDT05URU5UX0VMRU1FTlRfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgS0lORF9fSUQgPSBDT05URU5UX0VMRU1FTlRfX0lEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgS0lORF9fT1JERVJJTkdfR1VJREUgPSBDT05URU5UX0VMRU1FTlRfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgS0lORF9fUFJFU0VOVEFUSU9OX05BTUUgPSBDT05URU5UX0VMRU1FTlRfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBLSU5EX19TVVBQUkVTU0VEID0gQ09OVEVOVF9FTEVNRU5UX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEtJTkRfX1BSRVNFTlRBVElPTiA9IENPTlRFTlRfRUxFTUVOVF9fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZ1bGZpbGw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEtJTkRfX0ZVTEZJTEwgPSBDT05URU5UX0VMRU1FTlRfX0ZVTEZJTEw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgQWJzdHJhY3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBLSU5EX19JU19BQlNUUkFDVCA9IENPTlRFTlRfRUxFTUVOVF9fSVNfQUJTVFJBQ1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm9kZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBLSU5EX19OT0RFSUNPTiA9IENPTlRFTlRfRUxFTUVOVF9fTk9ERUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2hhcGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgS0lORF9fU0hBUEVJQ09OID0gQ09OVEVOVF9FTEVNRU5UX19TSEFQRUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAxPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBLSU5EX19HUk9VUDEgPSBDT05URU5UX0VMRU1FTlRfX0dST1VQMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGVja2xpc3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEtJTkRfX0NIRUNLTElTVCA9IENPTlRFTlRfRUxFTUVOVF9fQ0hFQ0tMSVNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbmNlcHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEtJTkRfX0NPTkNFUFQgPSBDT05URU5UX0VMRU1FTlRfX0NPTkNFUFQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXhhbXBsZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgS0lORF9fRVhBTVBMRSA9IENPTlRFTlRfRUxFTUVOVF9fRVhBTVBMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkZWxpbmU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEtJTkRfX0dVSURFTElORSA9IENPTlRFTlRfRUxFTUVOVF9fR1VJREVMSU5FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJldXNhYmxlIEFzc2V0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBLSU5EX19SRVVTQUJMRV9BU1NFVCA9IENPTlRFTlRfRUxFTUVOVF9fUkVVU0FCTEVfQVNTRVQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcG9ydGluZyBNYXRlcmlhbDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgS0lORF9fU1VQUE9SVElOR19NQVRFUklBTCA9IENPTlRFTlRfRUxFTUVOVF9fU1VQUE9SVElOR19NQVRFUklBTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5XaGl0ZXBhcGVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBLSU5EX19XSElURVBBUEVSID0gQ09OVEVOVF9FTEVNRU5UX19XSElURVBBUEVSOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBLSU5EX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UID0gQ09OVEVOVF9FTEVNRU5UX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBLSU5EX19WQVJJQUJJTElUWV9UWVBFID0gQ09OVEVOVF9FTEVNRU5UX19WQVJJQUJJTElUWV9UWVBFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFwcGxpY2FibGUgTWV0YSBDbGFzcyBJbmZvPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBLSU5EX19BUFBMSUNBQkxFX01FVEFfQ0xBU1NfSU5GTyA9IENPTlRFTlRfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5LaW5kPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEtJTkRfRkVBVFVSRV9DT1VOVCA9IENPTlRFTlRfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5NZXRob2RDb25maWd1cmF0aW9uSW1wbCA8ZW0+TWV0aG9kIENvbmZpZ3VyYXRpb248L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLk1ldGhvZENvbmZpZ3VyYXRpb25JbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldE1ldGhvZENvbmZpZ3VyYXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgTUVUSE9EX0NPTkZJR1VSQVRJT04gPSAzOTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX0NPTkZJR1VSQVRJT05fX05BTUUgPSBNRVRIT0RfVU5JVF9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX0NPTkZJR1VSQVRJT05fX0dST1VQID0gTUVUSE9EX1VOSVRfX0dST1VQOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9DT05GSUdVUkFUSU9OX19PV05FRF9SVUxFID0gTUVUSE9EX1VOSVRfX09XTkVEX1JVTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9DT05GSUdVUkFUSU9OX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IE1FVEhPRF9VTklUX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9DT05GSUdVUkFUSU9OX19CUklFRl9ERVNDUklQVElPTiA9IE1FVEhPRF9VTklUX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9DT05GSUdVUkFUSU9OX19JRCA9IE1FVEhPRF9VTklUX19JRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9DT05GSUdVUkFUSU9OX19PUkRFUklOR19HVUlERSA9IE1FVEhPRF9VTklUX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9DT05GSUdVUkFUSU9OX19QUkVTRU5UQVRJT05fTkFNRSA9IE1FVEhPRF9VTklUX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX0NPTkZJR1VSQVRJT05fX1NVUFBSRVNTRUQgPSBNRVRIT0RfVU5JVF9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db3B5cmlnaHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfQ09ORklHVVJBVElPTl9fQ09QWVJJR0hUID0gTUVUSE9EX1VOSVRfX0NPUFlSSUdIVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BdXRob3JzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX0NPTkZJR1VSQVRJT05fX0FVVEhPUlMgPSBNRVRIT0RfVU5JVF9fQVVUSE9SUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGFuZ2UgRGF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9DT05GSUdVUkFUSU9OX19DSEFOR0VfREFURSA9IE1FVEhPRF9VTklUX19DSEFOR0VfREFURTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGFuZ2UgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfQ09ORklHVVJBVElPTl9fQ0hBTkdFX0RFU0NSSVBUSU9OID0gTUVUSE9EX1VOSVRfX0NIQU5HRV9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WZXJzaW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX0NPTkZJR1VSQVRJT05fX1ZFUlNJT04gPSBNRVRIT0RfVU5JVF9fVkVSU0lPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CYXNlIENvbmZpZ3VyYXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9DT05GSUdVUkFUSU9OX19CQVNFX0NPTkZJR1VSQVRJT04gPSBNRVRIT0RfVU5JVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgUGx1Z2luIFNlbGVjdGlvbjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX0NPTkZJR1VSQVRJT05fX01FVEhPRF9QTFVHSU5fU0VMRUNUSU9OID0gTUVUSE9EX1VOSVRfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIFBhY2thZ2UgU2VsZWN0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfQ09ORklHVVJBVElPTl9fTUVUSE9EX1BBQ0tBR0VfU0VMRUNUSU9OID0gTUVUSE9EX1VOSVRfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVmYXVsdCBWaWV3PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX0NPTkZJR1VSQVRJT05fX0RFRkFVTFRfVklFVyA9IE1FVEhPRF9VTklUX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByb2Nlc3MgVmlldzwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX0NPTkZJR1VSQVRJT05fX1BST0NFU1NfVklFVyA9IE1FVEhPRF9VTklUX0ZFQVRVUkVfQ09VTlQgKyA0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1YnRyYWN0ZWQgQ2F0ZWdvcnk8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9DT05GSUdVUkFUSU9OX19TVUJUUkFDVEVEX0NBVEVHT1JZID0gTUVUSE9EX1VOSVRfRkVBVFVSRV9DT1VOVCArIDU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWRkZWQgQ2F0ZWdvcnk8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9DT05GSUdVUkFUSU9OX19BRERFRF9DQVRFR09SWSA9IE1FVEhPRF9VTklUX0ZFQVRVUkVfQ09VTlQgKyA2OwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPk1ldGhvZCBDb25maWd1cmF0aW9uPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9DT05GSUdVUkFUSU9OX0ZFQVRVUkVfQ09VTlQgPSBNRVRIT0RfVU5JVF9GRUFUVVJFX0NPVU5UICsgNzsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5NZXRob2RFbGVtZW50UHJvcGVydHlJbXBsIDxlbT5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuTWV0aG9kRWxlbWVudFByb3BlcnR5SW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRNZXRob2RFbGVtZW50UHJvcGVydHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSA0MTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFlfX05BTUUgPSBQQUNLQUdFQUJMRV9FTEVNRU5UX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFlfX1ZBTFVFID0gUEFDS0FHRUFCTEVfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfRUxFTUVOVF9QUk9QRVJUWV9GRUFUVVJFX0NPVU5UID0gUEFDS0FHRUFCTEVfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5NZXRob2RMaWJyYXJ5SW1wbCA8ZW0+TWV0aG9kIExpYnJhcnk8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLk1ldGhvZExpYnJhcnlJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldE1ldGhvZExpYnJhcnkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgTUVUSE9EX0xJQlJBUlkgPSA0MjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX0xJQlJBUllfX05BTUUgPSBNRVRIT0RfVU5JVF9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX0xJQlJBUllfX0dST1VQID0gTUVUSE9EX1VOSVRfX0dST1VQOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9MSUJSQVJZX19PV05FRF9SVUxFID0gTUVUSE9EX1VOSVRfX09XTkVEX1JVTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9MSUJSQVJZX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IE1FVEhPRF9VTklUX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9MSUJSQVJZX19CUklFRl9ERVNDUklQVElPTiA9IE1FVEhPRF9VTklUX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9MSUJSQVJZX19JRCA9IE1FVEhPRF9VTklUX19JRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9MSUJSQVJZX19PUkRFUklOR19HVUlERSA9IE1FVEhPRF9VTklUX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9MSUJSQVJZX19QUkVTRU5UQVRJT05fTkFNRSA9IE1FVEhPRF9VTklUX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX0xJQlJBUllfX1NVUFBSRVNTRUQgPSBNRVRIT0RfVU5JVF9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db3B5cmlnaHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfTElCUkFSWV9fQ09QWVJJR0hUID0gTUVUSE9EX1VOSVRfX0NPUFlSSUdIVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BdXRob3JzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX0xJQlJBUllfX0FVVEhPUlMgPSBNRVRIT0RfVU5JVF9fQVVUSE9SUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGFuZ2UgRGF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9MSUJSQVJZX19DSEFOR0VfREFURSA9IE1FVEhPRF9VTklUX19DSEFOR0VfREFURTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGFuZ2UgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfTElCUkFSWV9fQ0hBTkdFX0RFU0NSSVBUSU9OID0gTUVUSE9EX1VOSVRfX0NIQU5HRV9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WZXJzaW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX0xJQlJBUllfX1ZFUlNJT04gPSBNRVRIT0RfVU5JVF9fVkVSU0lPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgUGx1Z2luPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfTElCUkFSWV9fTUVUSE9EX1BMVUdJTiA9IE1FVEhPRF9VTklUX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBDb25maWd1cmF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfTElCUkFSWV9fTUVUSE9EX0NPTkZJR1VSQVRJT04gPSBNRVRIT0RfVU5JVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ub29sPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX0xJQlJBUllfX1RPT0wgPSBNRVRIT0RfVU5JVF9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5NZXRob2QgTGlicmFyeTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfTElCUkFSWV9GRUFUVVJFX0NPVU5UID0gTUVUSE9EX1VOSVRfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuTWV0aG9kUGx1Z2luSW1wbCA8ZW0+TWV0aG9kIFBsdWdpbjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuTWV0aG9kUGx1Z2luSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRNZXRob2RQbHVnaW4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgTUVUSE9EX1BMVUdJTiA9IDQ0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfUExVR0lOX19OQU1FID0gTUVUSE9EX1VOSVRfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXA8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9QTFVHSU5fX0dST1VQID0gTUVUSE9EX1VOSVRfX0dST1VQOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9QTFVHSU5fX09XTkVEX1JVTEUgPSBNRVRIT0RfVU5JVF9fT1dORURfUlVMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX1BMVUdJTl9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBNRVRIT0RfVU5JVF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfUExVR0lOX19CUklFRl9ERVNDUklQVElPTiA9IE1FVEhPRF9VTklUX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9QTFVHSU5fX0lEID0gTUVUSE9EX1VOSVRfX0lEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX1BMVUdJTl9fT1JERVJJTkdfR1VJREUgPSBNRVRIT0RfVU5JVF9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfUExVR0lOX19QUkVTRU5UQVRJT05fTkFNRSA9IE1FVEhPRF9VTklUX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX1BMVUdJTl9fU1VQUFJFU1NFRCA9IE1FVEhPRF9VTklUX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvcHlyaWdodDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9QTFVHSU5fX0NPUFlSSUdIVCA9IE1FVEhPRF9VTklUX19DT1BZUklHSFQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXV0aG9yczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9QTFVHSU5fX0FVVEhPUlMgPSBNRVRIT0RfVU5JVF9fQVVUSE9SUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGFuZ2UgRGF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9QTFVHSU5fX0NIQU5HRV9EQVRFID0gTUVUSE9EX1VOSVRfX0NIQU5HRV9EQVRFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoYW5nZSBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9QTFVHSU5fX0NIQU5HRV9ERVNDUklQVElPTiA9IE1FVEhPRF9VTklUX19DSEFOR0VfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmVyc2lvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9QTFVHSU5fX1ZFUlNJT04gPSBNRVRIT0RfVU5JVF9fVkVSU0lPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZWZlcmVuY2VkIE1ldGhvZCBQbHVnaW48L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9QTFVHSU5fX1JFRkVSRU5DRURfTUVUSE9EX1BMVUdJTiA9IE1FVEhPRF9VTklUX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBQYWNrYWdlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfUExVR0lOX19NRVRIT0RfUEFDS0FHRSA9IE1FVEhPRF9VTklUX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVzZXIgQ2hhbmdlYWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9QTFVHSU5fX1VTRVJfQ0hBTkdFQUJMRSA9IE1FVEhPRF9VTklUX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPk1ldGhvZCBQbHVnaW48L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX1BMVUdJTl9GRUFUVVJFX0NPVU5UID0gTUVUSE9EX1VOSVRfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuTWlsZXN0b25lSW1wbCA8ZW0+TWlsZXN0b25lPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5NaWxlc3RvbmVJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldE1pbGVzdG9uZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBNSUxFU1RPTkUgPSA0NjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUlMRVNUT05FX19OQU1FID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUlMRVNUT05FX19HUk9VUCA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0dST1VQOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1JTEVTVE9ORV9fT1dORURfUlVMRSA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX09XTkVEX1JVTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1JTEVTVE9ORV9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1JTEVTVE9ORV9fQlJJRUZfREVTQ1JJUFRJT04gPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1JTEVTVE9ORV9fSUQgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19JRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1JTEVTVE9ORV9fT1JERVJJTkdfR1VJREUgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1JTEVTVE9ORV9fUFJFU0VOVEFUSU9OX05BTUUgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUlMRVNUT05FX19TVVBQUkVTU0VEID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNSUxFU1RPTkVfX1BSRVNFTlRBVElPTiA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX1BSRVNFTlRBVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GdWxmaWxsPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNSUxFU1RPTkVfX0ZVTEZJTEwgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19GVUxGSUxMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIEFic3RyYWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUlMRVNUT05FX19JU19BQlNUUkFDVCA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0lTX0FCU1RSQUNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUlMRVNUT05FX19OT0RFSUNPTiA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX05PREVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNoYXBlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1JTEVTVE9ORV9fU0hBUEVJQ09OID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fU0hBUEVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRlZCBBZnRlcjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1JTEVTVE9ORV9fUFJFU0VOVEVEX0FGVEVSID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fUFJFU0VOVEVEX0FGVEVSOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRlZCBCZWZvcmU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNSUxFU1RPTkVfX1BSRVNFTlRFRF9CRUZPUkUgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19QUkVTRU5URURfQkVGT1JFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBsYW5uaW5nIERhdGE8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNSUxFU1RPTkVfX1BMQU5OSU5HX0RBVEEgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19QTEFOTklOR19EQVRBOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cGVyIEFjdGl2aXR5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUlMRVNUT05FX19TVVBFUl9BQ1RJVklUWSA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX1NVUEVSX0FDVElWSVRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUlMRVNUT05FX19HUk9VUDEgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19HUk9VUDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hlY2tsaXN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNSUxFU1RPTkVfX0NIRUNLTElTVCA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0NIRUNLTElTVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db25jZXB0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNSUxFU1RPTkVfX0NPTkNFUFQgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19DT05DRVBUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4YW1wbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1JTEVTVE9ORV9fRVhBTVBMRSA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0VYQU1QTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZGVsaW5lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNSUxFU1RPTkVfX0dVSURFTElORSA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0dVSURFTElORTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXVzYWJsZSBBc3NldDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUlMRVNUT05FX19SRVVTQUJMRV9BU1NFVCA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX1JFVVNBQkxFX0FTU0VUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHBvcnRpbmcgTWF0ZXJpYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1JTEVTVE9ORV9fU1VQUE9SVElOR19NQVRFUklBTCA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX1NVUFBPUlRJTkdfTUFURVJJQUw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+V2hpdGVwYXBlcjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUlMRVNUT05FX19XSElURVBBUEVSID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fV0hJVEVQQVBFUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5IYXMgTXVsdGlwbGUgT2NjdXJyZW5jZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNSUxFU1RPTkVfX0hBU19NVUxUSVBMRV9PQ0NVUlJFTkNFUyA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0hBU19NVUxUSVBMRV9PQ0NVUlJFTkNFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBPcHRpb25hbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1JTEVTVE9ORV9fSVNfT1BUSU9OQUwgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19JU19PUFRJT05BTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBQbGFubmVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUlMRVNUT05FX19JU19QTEFOTkVEID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fSVNfUExBTk5FRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVmaXg8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNSUxFU1RPTkVfX1BSRUZJWCA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX1BSRUZJWDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1JTEVTVE9ORV9fR1JPVVAyID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fR1JPVVAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZWRlY2Vzc29yPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNSUxFU1RPTkVfX1BSRURFQ0VTU09SID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fUFJFREVDRVNTT1I7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgRXZlbnQgRHJpdmVuPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUlMRVNUT05FX19JU19FVkVOVF9EUklWRU4gPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19JU19FVkVOVF9EUklWRU47Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgT25nb2luZzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1JTEVTVE9ORV9fSVNfT05HT0lORyA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0lTX09OR09JTkc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgUmVwZWF0YWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1JTEVTVE9ORV9fSVNfUkVQRUFUQUJMRSA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0lTX1JFUEVBVEFCTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVxdWlyZWQgUmVzdWx0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNSUxFU1RPTkVfX1JFUVVJUkVEX1JFU1VMVCA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+TWlsZXN0b25lPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1JTEVTVE9ORV9GRUFUVVJFX0NPVU5UID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5PdXRjb21lSW1wbCA8ZW0+T3V0Y29tZTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuT3V0Y29tZUltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0T3V0Y29tZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBPVVRDT01FID0gNDg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE9VVENPTUVfX05BTUUgPSBXT1JLX1BST0RVQ1RfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXA8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE9VVENPTUVfX0dST1VQID0gV09SS19QUk9EVUNUX19HUk9VUDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBPVVRDT01FX19PV05FRF9SVUxFID0gV09SS19QUk9EVUNUX19PV05FRF9SVUxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBPVVRDT01FX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IFdPUktfUFJPRFVDVF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBPVVRDT01FX19CUklFRl9ERVNDUklQVElPTiA9IFdPUktfUFJPRFVDVF9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBPVVRDT01FX19JRCA9IFdPUktfUFJPRFVDVF9fSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBPVVRDT01FX19PUkRFUklOR19HVUlERSA9IFdPUktfUFJPRFVDVF9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBPVVRDT01FX19QUkVTRU5UQVRJT05fTkFNRSA9IFdPUktfUFJPRFVDVF9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE9VVENPTUVfX1NVUFBSRVNTRUQgPSBXT1JLX1BST0RVQ1RfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgT1VUQ09NRV9fUFJFU0VOVEFUSU9OID0gV09SS19QUk9EVUNUX19QUkVTRU5UQVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RnVsZmlsbDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgT1VUQ09NRV9fRlVMRklMTCA9IFdPUktfUFJPRFVDVF9fRlVMRklMTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBBYnN0cmFjdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE9VVENPTUVfX0lTX0FCU1RSQUNUID0gV09SS19QUk9EVUNUX19JU19BQlNUUkFDVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob2RlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE9VVENPTUVfX05PREVJQ09OID0gV09SS19QUk9EVUNUX19OT0RFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TaGFwZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBPVVRDT01FX19TSEFQRUlDT04gPSBXT1JLX1BST0RVQ1RfX1NIQVBFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDE8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE9VVENPTUVfX0dST1VQMSA9IFdPUktfUFJPRFVDVF9fR1JPVVAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoZWNrbGlzdDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgT1VUQ09NRV9fQ0hFQ0tMSVNUID0gV09SS19QUk9EVUNUX19DSEVDS0xJU1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29uY2VwdDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgT1VUQ09NRV9fQ09OQ0VQVCA9IFdPUktfUFJPRFVDVF9fQ09OQ0VQVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeGFtcGxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBPVVRDT01FX19FWEFNUExFID0gV09SS19QUk9EVUNUX19FWEFNUExFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWRlbGluZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgT1VUQ09NRV9fR1VJREVMSU5FID0gV09SS19QUk9EVUNUX19HVUlERUxJTkU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmV1c2FibGUgQXNzZXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE9VVENPTUVfX1JFVVNBQkxFX0FTU0VUID0gV09SS19QUk9EVUNUX19SRVVTQUJMRV9BU1NFVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwb3J0aW5nIE1hdGVyaWFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBPVVRDT01FX19TVVBQT1JUSU5HX01BVEVSSUFMID0gV09SS19QUk9EVUNUX19TVVBQT1JUSU5HX01BVEVSSUFMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldoaXRlcGFwZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE9VVENPTUVfX1dISVRFUEFQRVIgPSBXT1JLX1BST0RVQ1RfX1dISVRFUEFQRVI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE9VVENPTUVfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQgPSBXT1JLX1BST0RVQ1RfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE9VVENPTUVfX1ZBUklBQklMSVRZX1RZUEUgPSBXT1JLX1BST0RVQ1RfX1ZBUklBQklMSVRZX1RZUEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBPVVRDT01FX19HUk9VUDIgPSBXT1JLX1BST0RVQ1RfX0dST1VQMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Fc3RpbWF0ZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgT1VUQ09NRV9fRVNUSU1BVEUgPSBXT1JLX1BST0RVQ1RfX0VTVElNQVRFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVzdGltYXRpb24gQ29uc2lkZXJhdGlvbnM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE9VVENPTUVfX0VTVElNQVRJT05fQ09OU0lERVJBVElPTlMgPSBXT1JLX1BST0RVQ1RfX0VTVElNQVRJT05fQ09OU0lERVJBVElPTlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVwb3J0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBPVVRDT01FX19SRVBPUlQgPSBXT1JLX1BST0RVQ1RfX1JFUE9SVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UZW1wbGF0ZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgT1VUQ09NRV9fVEVNUExBVEUgPSBXT1JLX1BST0RVQ1RfX1RFTVBMQVRFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRvb2wgTWVudG9yPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBPVVRDT01FX19UT09MX01FTlRPUiA9IFdPUktfUFJPRFVDVF9fVE9PTF9NRU5UT1I7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+T3V0Y29tZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBPVVRDT01FX0ZFQVRVUkVfQ09VTlQgPSBXT1JLX1BST0RVQ1RfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUGhhc2VJbXBsIDxlbT5QaGFzZTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUGhhc2VJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFBoYXNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFBIQVNFID0gNTA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBIQVNFX19OQU1FID0gQUNUSVZJVFlfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXA8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBIQVNFX19HUk9VUCA9IEFDVElWSVRZX19HUk9VUDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQSEFTRV9fT1dORURfUlVMRSA9IEFDVElWSVRZX19PV05FRF9SVUxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQSEFTRV9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBBQ1RJVklUWV9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQSEFTRV9fQlJJRUZfREVTQ1JJUFRJT04gPSBBQ1RJVklUWV9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQSEFTRV9fSUQgPSBBQ1RJVklUWV9fSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQSEFTRV9fT1JERVJJTkdfR1VJREUgPSBBQ1RJVklUWV9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQSEFTRV9fUFJFU0VOVEFUSU9OX05BTUUgPSBBQ1RJVklUWV9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBIQVNFX19TVVBQUkVTU0VEID0gQUNUSVZJVFlfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUEhBU0VfX1BSRVNFTlRBVElPTiA9IEFDVElWSVRZX19QUkVTRU5UQVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RnVsZmlsbDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUEhBU0VfX0ZVTEZJTEwgPSBBQ1RJVklUWV9fRlVMRklMTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBBYnN0cmFjdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBIQVNFX19JU19BQlNUUkFDVCA9IEFDVElWSVRZX19JU19BQlNUUkFDVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob2RlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBIQVNFX19OT0RFSUNPTiA9IEFDVElWSVRZX19OT0RFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TaGFwZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQSEFTRV9fU0hBUEVJQ09OID0gQUNUSVZJVFlfX1NIQVBFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50ZWQgQWZ0ZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQSEFTRV9fUFJFU0VOVEVEX0FGVEVSID0gQUNUSVZJVFlfX1BSRVNFTlRFRF9BRlRFUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50ZWQgQmVmb3JlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUEhBU0VfX1BSRVNFTlRFRF9CRUZPUkUgPSBBQ1RJVklUWV9fUFJFU0VOVEVEX0JFRk9SRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QbGFubmluZyBEYXRhPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUEhBU0VfX1BMQU5OSU5HX0RBVEEgPSBBQ1RJVklUWV9fUExBTk5JTkdfREFUQTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBlciBBY3Rpdml0eTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBIQVNFX19TVVBFUl9BQ1RJVklUWSA9IEFDVElWSVRZX19TVVBFUl9BQ1RJVklUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDE8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBIQVNFX19HUk9VUDEgPSBBQ1RJVklUWV9fR1JPVVAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoZWNrbGlzdDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUEhBU0VfX0NIRUNLTElTVCA9IEFDVElWSVRZX19DSEVDS0xJU1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29uY2VwdDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUEhBU0VfX0NPTkNFUFQgPSBBQ1RJVklUWV9fQ09OQ0VQVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeGFtcGxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQSEFTRV9fRVhBTVBMRSA9IEFDVElWSVRZX19FWEFNUExFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWRlbGluZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUEhBU0VfX0dVSURFTElORSA9IEFDVElWSVRZX19HVUlERUxJTkU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmV1c2FibGUgQXNzZXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBIQVNFX19SRVVTQUJMRV9BU1NFVCA9IEFDVElWSVRZX19SRVVTQUJMRV9BU1NFVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwb3J0aW5nIE1hdGVyaWFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQSEFTRV9fU1VQUE9SVElOR19NQVRFUklBTCA9IEFDVElWSVRZX19TVVBQT1JUSU5HX01BVEVSSUFMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldoaXRlcGFwZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBIQVNFX19XSElURVBBUEVSID0gQUNUSVZJVFlfX1dISVRFUEFQRVI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SGFzIE11bHRpcGxlIE9jY3VycmVuY2VzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUEhBU0VfX0hBU19NVUxUSVBMRV9PQ0NVUlJFTkNFUyA9IEFDVElWSVRZX19IQVNfTVVMVElQTEVfT0NDVVJSRU5DRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgT3B0aW9uYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQSEFTRV9fSVNfT1BUSU9OQUwgPSBBQ1RJVklUWV9fSVNfT1BUSU9OQUw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgUGxhbm5lZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBIQVNFX19JU19QTEFOTkVEID0gQUNUSVZJVFlfX0lTX1BMQU5ORUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlZml4PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUEhBU0VfX1BSRUZJWCA9IEFDVElWSVRZX19QUkVGSVg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQSEFTRV9fR1JPVVAyID0gQUNUSVZJVFlfX0dST1VQMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVkZWNlc3NvcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUEhBU0VfX1BSRURFQ0VTU09SID0gQUNUSVZJVFlfX1BSRURFQ0VTU09SOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIEV2ZW50IERyaXZlbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBIQVNFX19JU19FVkVOVF9EUklWRU4gPSBBQ1RJVklUWV9fSVNfRVZFTlRfRFJJVkVOOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIE9uZ29pbmc8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQSEFTRV9fSVNfT05HT0lORyA9IEFDVElWSVRZX19JU19PTkdPSU5HOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIFJlcGVhdGFibGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQSEFTRV9fSVNfUkVQRUFUQUJMRSA9IEFDVElWSVRZX19JU19SRVBFQVRBQkxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZWNvbmRpdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBIQVNFX19QUkVDT05ESVRJT04gPSBBQ1RJVklUWV9fUFJFQ09ORElUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBvc3Rjb25kaXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQSEFTRV9fUE9TVENPTkRJVElPTiA9IEFDVElWSVRZX19QT1NUQ09ORElUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMzwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUEhBU0VfX0dST1VQMyA9IEFDVElWSVRZX19HUk9VUDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJlYWtkb3duIEVsZW1lbnQ8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBIQVNFX19CUkVBS0RPV05fRUxFTUVOVCA9IEFDVElWSVRZX19CUkVBS0RPV05fRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Sb2FkbWFwPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQSEFTRV9fUk9BRE1BUCA9IEFDVElWSVRZX19ST0FETUFQOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIEVuYWN0YWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBIQVNFX19JU19FTkFDVEFCTEUgPSBBQ1RJVklUWV9fSVNfRU5BQ1RBQkxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQSEFTRV9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVCA9IEFDVElWSVRZX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQSEFTRV9fVkFSSUFCSUxJVFlfVFlQRSA9IEFDVElWSVRZX19WQVJJQUJJTElUWV9UWVBFOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlBoYXNlPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBIQVNFX0ZFQVRVUkVfQ09VTlQgPSBBQ1RJVklUWV9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5QbGFubmluZ0RhdGFJbXBsIDxlbT5QbGFubmluZyBEYXRhPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5QbGFubmluZ0RhdGFJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFBsYW5uaW5nRGF0YSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBQTEFOTklOR19EQVRBID0gNTE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBMQU5OSU5HX0RBVEFfX05BTUUgPSBQUk9DRVNTX0VMRU1FTlRfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXA8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBMQU5OSU5HX0RBVEFfX0dST1VQID0gUFJPQ0VTU19FTEVNRU5UX19HUk9VUDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQTEFOTklOR19EQVRBX19PV05FRF9SVUxFID0gUFJPQ0VTU19FTEVNRU5UX19PV05FRF9SVUxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQTEFOTklOR19EQVRBX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IFBST0NFU1NfRUxFTUVOVF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQTEFOTklOR19EQVRBX19CUklFRl9ERVNDUklQVElPTiA9IFBST0NFU1NfRUxFTUVOVF9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQTEFOTklOR19EQVRBX19JRCA9IFBST0NFU1NfRUxFTUVOVF9fSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQTEFOTklOR19EQVRBX19PUkRFUklOR19HVUlERSA9IFBST0NFU1NfRUxFTUVOVF9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQTEFOTklOR19EQVRBX19QUkVTRU5UQVRJT05fTkFNRSA9IFBST0NFU1NfRUxFTUVOVF9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBMQU5OSU5HX0RBVEFfX1NVUFBSRVNTRUQgPSBQUk9DRVNTX0VMRU1FTlRfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUExBTk5JTkdfREFUQV9fUFJFU0VOVEFUSU9OID0gUFJPQ0VTU19FTEVNRU5UX19QUkVTRU5UQVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RnVsZmlsbDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUExBTk5JTkdfREFUQV9fRlVMRklMTCA9IFBST0NFU1NfRUxFTUVOVF9fRlVMRklMTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBBYnN0cmFjdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBMQU5OSU5HX0RBVEFfX0lTX0FCU1RSQUNUID0gUFJPQ0VTU19FTEVNRU5UX19JU19BQlNUUkFDVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob2RlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBMQU5OSU5HX0RBVEFfX05PREVJQ09OID0gUFJPQ0VTU19FTEVNRU5UX19OT0RFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TaGFwZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQTEFOTklOR19EQVRBX19TSEFQRUlDT04gPSBQUk9DRVNTX0VMRU1FTlRfX1NIQVBFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GaW5pc2ggRGF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBMQU5OSU5HX0RBVEFfX0ZJTklTSF9EQVRFID0gUFJPQ0VTU19FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJhbms8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQTEFOTklOR19EQVRBX19SQU5LID0gUFJPQ0VTU19FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN0YXJ0IERhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQTEFOTklOR19EQVRBX19TVEFSVF9EQVRFID0gUFJPQ0VTU19FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlBsYW5uaW5nIERhdGE8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUExBTk5JTkdfREFUQV9GRUFUVVJFX0NPVU5UID0gUFJPQ0VTU19FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlByYWN0aWNlSW1wbCA8ZW0+UHJhY3RpY2U8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlByYWN0aWNlSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRQcmFjdGljZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBQUkFDVElDRSA9IDUyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUkFDVElDRV9fTkFNRSA9IEdVSURBTkNFX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUkFDVElDRV9fR1JPVVAgPSBHVUlEQU5DRV9fR1JPVVA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJBQ1RJQ0VfX09XTkVEX1JVTEUgPSBHVUlEQU5DRV9fT1dORURfUlVMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJBQ1RJQ0VfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gR1VJREFOQ0VfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJBQ1RJQ0VfX0JSSUVGX0RFU0NSSVBUSU9OID0gR1VJREFOQ0VfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJBQ1RJQ0VfX0lEID0gR1VJREFOQ0VfX0lEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJBQ1RJQ0VfX09SREVSSU5HX0dVSURFID0gR1VJREFOQ0VfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJBQ1RJQ0VfX1BSRVNFTlRBVElPTl9OQU1FID0gR1VJREFOQ0VfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUkFDVElDRV9fU1VQUFJFU1NFRCA9IEdVSURBTkNFX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBSQUNUSUNFX19QUkVTRU5UQVRJT04gPSBHVUlEQU5DRV9fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZ1bGZpbGw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBSQUNUSUNFX19GVUxGSUxMID0gR1VJREFOQ0VfX0ZVTEZJTEw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgQWJzdHJhY3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUkFDVElDRV9fSVNfQUJTVFJBQ1QgPSBHVUlEQU5DRV9fSVNfQUJTVFJBQ1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm9kZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUkFDVElDRV9fTk9ERUlDT04gPSBHVUlEQU5DRV9fTk9ERUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2hhcGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJBQ1RJQ0VfX1NIQVBFSUNPTiA9IEdVSURBTkNFX19TSEFQRUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAxPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUkFDVElDRV9fR1JPVVAxID0gR1VJREFOQ0VfX0dST1VQMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGVja2xpc3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBSQUNUSUNFX19DSEVDS0xJU1QgPSBHVUlEQU5DRV9fQ0hFQ0tMSVNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbmNlcHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBSQUNUSUNFX19DT05DRVBUID0gR1VJREFOQ0VfX0NPTkNFUFQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXhhbXBsZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJBQ1RJQ0VfX0VYQU1QTEUgPSBHVUlEQU5DRV9fRVhBTVBMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkZWxpbmU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBSQUNUSUNFX19HVUlERUxJTkUgPSBHVUlEQU5DRV9fR1VJREVMSU5FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJldXNhYmxlIEFzc2V0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUkFDVElDRV9fUkVVU0FCTEVfQVNTRVQgPSBHVUlEQU5DRV9fUkVVU0FCTEVfQVNTRVQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcG9ydGluZyBNYXRlcmlhbDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJBQ1RJQ0VfX1NVUFBPUlRJTkdfTUFURVJJQUwgPSBHVUlEQU5DRV9fU1VQUE9SVElOR19NQVRFUklBTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5XaGl0ZXBhcGVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUkFDVElDRV9fV0hJVEVQQVBFUiA9IEdVSURBTkNFX19XSElURVBBUEVSOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUkFDVElDRV9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVCA9IEdVSURBTkNFX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUkFDVElDRV9fVkFSSUFCSUxJVFlfVFlQRSA9IEdVSURBTkNFX19WQVJJQUJJTElUWV9UWVBFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJBQ1RJQ0VfX0dST1VQMiA9IEdVSURBTkNFX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFjdGl2aXR5IFJlZmVyZW5jZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJBQ1RJQ0VfX0FDVElWSVRZX1JFRkVSRU5DRSA9IEdVSURBTkNFX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbnRlbnQgUmVmZXJlbmNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUkFDVElDRV9fQ09OVEVOVF9SRUZFUkVOQ0UgPSBHVUlEQU5DRV9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdWIgUHJhY3RpY2U8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBSQUNUSUNFX19TVUJfUFJBQ1RJQ0UgPSBHVUlEQU5DRV9GRUFUVVJFX0NPVU5UICsgMzsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5QcmFjdGljZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUkFDVElDRV9GRUFUVVJFX0NPVU5UID0gR1VJREFOQ0VfRkVBVFVSRV9DT1VOVCArIDQ7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUHJhY3RpY2VEZXNjcmlwdGlvbkltcGwgPGVtPlByYWN0aWNlIERlc2NyaXB0aW9uPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5QcmFjdGljZURlc2NyaXB0aW9uSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRQcmFjdGljZURlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFBSQUNUSUNFX0RFU0NSSVBUSU9OID0gNTM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBSQUNUSUNFX0RFU0NSSVBUSU9OX19OQU1FID0gQ09OVEVOVF9ERVNDUklQVElPTl9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0dST1VQID0gQ09OVEVOVF9ERVNDUklQVElPTl9fR1JPVVA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX09XTkVEX1JVTEUgPSBDT05URU5UX0RFU0NSSVBUSU9OX19PV05FRF9SVUxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUkFDVElDRV9ERVNDUklQVElPTl9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBDT05URU5UX0RFU0NSSVBUSU9OX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBSQUNUSUNFX0RFU0NSSVBUSU9OX19CUklFRl9ERVNDUklQVElPTiA9IENPTlRFTlRfREVTQ1JJUFRJT05fX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0lEID0gQ09OVEVOVF9ERVNDUklQVElPTl9fSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUkFDVElDRV9ERVNDUklQVElPTl9fT1JERVJJTkdfR1VJREUgPSBDT05URU5UX0RFU0NSSVBUSU9OX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBSQUNUSUNFX0RFU0NSSVBUSU9OX19QUkVTRU5UQVRJT05fTkFNRSA9IENPTlRFTlRfREVTQ1JJUFRJT05fX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUkFDVElDRV9ERVNDUklQVElPTl9fU1VQUFJFU1NFRCA9IENPTlRFTlRfREVTQ1JJUFRJT05fX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29weXJpZ2h0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0NPUFlSSUdIVCA9IENPTlRFTlRfREVTQ1JJUFRJT05fX0NPUFlSSUdIVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BdXRob3JzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0FVVEhPUlMgPSBDT05URU5UX0RFU0NSSVBUSU9OX19BVVRIT1JTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoYW5nZSBEYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0NIQU5HRV9EQVRFID0gQ09OVEVOVF9ERVNDUklQVElPTl9fQ0hBTkdFX0RBVEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hhbmdlIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0NIQU5HRV9ERVNDUklQVElPTiA9IENPTlRFTlRfREVTQ1JJUFRJT05fX0NIQU5HRV9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WZXJzaW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX1ZFUlNJT04gPSBDT05URU5UX0RFU0NSSVBUSU9OX19WRVJTSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1haW4gRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUkFDVElDRV9ERVNDUklQVElPTl9fTUFJTl9ERVNDUklQVElPTiA9IENPTlRFTlRfREVTQ1JJUFRJT05fX01BSU5fREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+S2V5IENvbnNpZGVyYXRpb25zPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0tFWV9DT05TSURFUkFUSU9OUyA9IENPTlRFTlRfREVTQ1JJUFRJT05fX0tFWV9DT05TSURFUkFUSU9OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TZWN0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUkFDVElDRV9ERVNDUklQVElPTl9fU0VDVElPTiA9IENPTlRFTlRfREVTQ1JJUFRJT05fX1NFQ1RJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXh0ZXJuYWwgSWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUkFDVElDRV9ERVNDUklQVElPTl9fRVhURVJOQUxfSUQgPSBDT05URU5UX0RFU0NSSVBUSU9OX19FWFRFUk5BTF9JRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BZGRpdGlvbmFsIEluZm88L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUkFDVElDRV9ERVNDUklQVElPTl9fQURESVRJT05BTF9JTkZPID0gQ09OVEVOVF9ERVNDUklQVElPTl9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BcHBsaWNhdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBSQUNUSUNFX0RFU0NSSVBUSU9OX19BUFBMSUNBVElPTiA9IENPTlRFTlRfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QmFja2dyb3VuZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBSQUNUSUNFX0RFU0NSSVBUSU9OX19CQUNLR1JPVU5EID0gQ09OVEVOVF9ERVNDUklQVElPTl9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hb2FsczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBSQUNUSUNFX0RFU0NSSVBUSU9OX19HT0FMUyA9IENPTlRFTlRfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TGV2ZWxzIE9mIEFkb3B0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0xFVkVMU19PRl9BRE9QVElPTiA9IENPTlRFTlRfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCArIDQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJvYmxlbTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBSQUNUSUNFX0RFU0NSSVBUSU9OX19QUk9CTEVNID0gQ09OVEVOVF9ERVNDUklQVElPTl9GRUFUVVJFX0NPVU5UICsgNTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5QcmFjdGljZSBEZXNjcmlwdGlvbjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUkFDVElDRV9ERVNDUklQVElPTl9GRUFUVVJFX0NPVU5UID0gQ09OVEVOVF9ERVNDUklQVElPTl9GRUFUVVJFX0NPVU5UICsgNjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Qcm9jZXNzUGFja2FnZUltcGwgPGVtPlByb2Nlc3MgUGFja2FnZTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUHJvY2Vzc1BhY2thZ2VJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFByb2Nlc3NQYWNrYWdlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFBST0NFU1NfUEFDS0FHRSA9IDU5OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BBQ0tBR0VfX05BTUUgPSBNRVRIT0RfUEFDS0FHRV9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QQUNLQUdFX19HUk9VUCA9IE1FVEhPRF9QQUNLQUdFX19HUk9VUDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BBQ0tBR0VfX09XTkVEX1JVTEUgPSBNRVRIT0RfUEFDS0FHRV9fT1dORURfUlVMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QQUNLQUdFX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IE1FVEhPRF9QQUNLQUdFX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUEFDS0FHRV9fQlJJRUZfREVTQ1JJUFRJT04gPSBNRVRIT0RfUEFDS0FHRV9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BBQ0tBR0VfX0lEID0gTUVUSE9EX1BBQ0tBR0VfX0lEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QQUNLQUdFX19PUkRFUklOR19HVUlERSA9IE1FVEhPRF9QQUNLQUdFX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUEFDS0FHRV9fUFJFU0VOVEFUSU9OX05BTUUgPSBNRVRIT0RfUEFDS0FHRV9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUEFDS0FHRV9fU1VQUFJFU1NFRCA9IE1FVEhPRF9QQUNLQUdFX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QQUNLQUdFX19HUk9VUDEgPSBNRVRIT0RfUEFDS0FHRV9fR1JPVVAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJldXNlZCBQYWNrYWdlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BBQ0tBR0VfX1JFVVNFRF9QQUNLQUdFID0gTUVUSE9EX1BBQ0tBR0VfX1JFVVNFRF9QQUNLQUdFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBQYWNrYWdlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BBQ0tBR0VfX01FVEhPRF9QQUNLQUdFID0gTUVUSE9EX1BBQ0tBR0VfX01FVEhPRF9QQUNLQUdFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdsb2JhbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUEFDS0FHRV9fR0xPQkFMID0gTUVUSE9EX1BBQ0tBR0VfX0dMT0JBTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUEFDS0FHRV9fR1JPVVAyID0gTUVUSE9EX1BBQ0tBR0VfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJvY2VzcyBFbGVtZW50PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BBQ0tBR0VfX1BST0NFU1NfRUxFTUVOVCA9IE1FVEhPRF9QQUNLQUdFX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlByb2Nlc3MgUGFja2FnZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BBQ0tBR0VfRkVBVFVSRV9DT1VOVCA9IE1FVEhPRF9QQUNLQUdFX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlByb2Nlc3NDb21wb25lbnRJbXBsIDxlbT5Qcm9jZXNzIENvbXBvbmVudDwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUHJvY2Vzc0NvbXBvbmVudEltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0UHJvY2Vzc0NvbXBvbmVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVCA9IDU1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9fTkFNRSA9IFBST0NFU1NfUEFDS0FHRV9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfX0dST1VQID0gUFJPQ0VTU19QQUNLQUdFX19HUk9VUDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9fT1dORURfUlVMRSA9IFBST0NFU1NfUEFDS0FHRV9fT1dORURfUlVMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gUFJPQ0VTU19QQUNLQUdFX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX19CUklFRl9ERVNDUklQVElPTiA9IFBST0NFU1NfUEFDS0FHRV9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9fSUQgPSBQUk9DRVNTX1BBQ0tBR0VfX0lEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfX09SREVSSU5HX0dVSURFID0gUFJPQ0VTU19QQUNLQUdFX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX19QUkVTRU5UQVRJT05fTkFNRSA9IFBST0NFU1NfUEFDS0FHRV9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX19TVVBQUkVTU0VEID0gUFJPQ0VTU19QQUNLQUdFX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfX0dST1VQMSA9IFBST0NFU1NfUEFDS0FHRV9fR1JPVVAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJldXNlZCBQYWNrYWdlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9fUkVVU0VEX1BBQ0tBR0UgPSBQUk9DRVNTX1BBQ0tBR0VfX1JFVVNFRF9QQUNLQUdFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBQYWNrYWdlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9fTUVUSE9EX1BBQ0tBR0UgPSBQUk9DRVNTX1BBQ0tBR0VfX01FVEhPRF9QQUNLQUdFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdsb2JhbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX19HTE9CQUwgPSBQUk9DRVNTX1BBQ0tBR0VfX0dMT0JBTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX19HUk9VUDIgPSBQUk9DRVNTX1BBQ0tBR0VfX0dST1VQMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qcm9jZXNzIEVsZW1lbnQ8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX19QUk9DRVNTX0VMRU1FTlQgPSBQUk9DRVNTX1BBQ0tBR0VfX1BST0NFU1NfRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db3B5cmlnaHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9fQ09QWVJJR0hUID0gUFJPQ0VTU19QQUNLQUdFX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkludGVyZmFjZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX19JTlRFUkZBQ0UgPSBQUk9DRVNTX1BBQ0tBR0VfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJvY2VzczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX19QUk9DRVNTID0gUFJPQ0VTU19QQUNLQUdFX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkF1dGhvcnM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9fQVVUSE9SUyA9IFBST0NFU1NfUEFDS0FHRV9GRUFUVVJFX0NPVU5UICsgMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGFuZ2UgRGF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX19DSEFOR0VfREFURSA9IFBST0NFU1NfUEFDS0FHRV9GRUFUVVJFX0NPVU5UICsgNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGFuZ2UgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9fQ0hBTkdFX0RFU0NSSVBUSU9OID0gUFJPQ0VTU19QQUNLQUdFX0ZFQVRVUkVfQ09VTlQgKyA1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZlcnNpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9fVkVSU0lPTiA9IFBST0NFU1NfUEFDS0FHRV9GRUFUVVJFX0NPVU5UICsgNjsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Qcm9jZXNzIENvbXBvbmVudDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9GRUFUVVJFX0NPVU5UID0gUFJPQ0VTU19QQUNLQUdFX0ZFQVRVUkVfQ09VTlQgKyA3OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VJbXBsIDxlbT5Qcm9jZXNzIENvbXBvbmVudCBJbnRlcmZhY2U8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfSU5URVJGQUNFID0gNTY7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRV9fTkFNRSA9IEJSRUFLRE9XTl9FTEVNRU5UX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfX0dST1VQID0gQlJFQUtET1dOX0VMRU1FTlRfX0dST1VQOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRV9fT1dORURfUlVMRSA9IEJSRUFLRE9XTl9FTEVNRU5UX19PV05FRF9SVUxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gQlJFQUtET1dOX0VMRU1FTlRfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfSU5URVJGQUNFX19CUklFRl9ERVNDUklQVElPTiA9IEJSRUFLRE9XTl9FTEVNRU5UX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRV9fSUQgPSBCUkVBS0RPV05fRUxFTUVOVF9fSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfX09SREVSSU5HX0dVSURFID0gQlJFQUtET1dOX0VMRU1FTlRfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfSU5URVJGQUNFX19QUkVTRU5UQVRJT05fTkFNRSA9IEJSRUFLRE9XTl9FTEVNRU5UX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfSU5URVJGQUNFX19TVVBQUkVTU0VEID0gQlJFQUtET1dOX0VMRU1FTlRfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfSU5URVJGQUNFX19QUkVTRU5UQVRJT04gPSBCUkVBS0RPV05fRUxFTUVOVF9fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZ1bGZpbGw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRV9fRlVMRklMTCA9IEJSRUFLRE9XTl9FTEVNRU5UX19GVUxGSUxMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIEFic3RyYWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfSU5URVJGQUNFX19JU19BQlNUUkFDVCA9IEJSRUFLRE9XTl9FTEVNRU5UX19JU19BQlNUUkFDVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob2RlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRV9fTk9ERUlDT04gPSBCUkVBS0RPV05fRUxFTUVOVF9fTk9ERUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2hhcGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfSU5URVJGQUNFX19TSEFQRUlDT04gPSBCUkVBS0RPV05fRUxFTUVOVF9fU0hBUEVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRlZCBBZnRlcjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRV9fUFJFU0VOVEVEX0FGVEVSID0gQlJFQUtET1dOX0VMRU1FTlRfX1BSRVNFTlRFRF9BRlRFUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50ZWQgQmVmb3JlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfSU5URVJGQUNFX19QUkVTRU5URURfQkVGT1JFID0gQlJFQUtET1dOX0VMRU1FTlRfX1BSRVNFTlRFRF9CRUZPUkU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UGxhbm5pbmcgRGF0YTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRV9fUExBTk5JTkdfREFUQSA9IEJSRUFLRE9XTl9FTEVNRU5UX19QTEFOTklOR19EQVRBOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cGVyIEFjdGl2aXR5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfSU5URVJGQUNFX19TVVBFUl9BQ1RJVklUWSA9IEJSRUFLRE9XTl9FTEVNRU5UX19TVVBFUl9BQ1RJVklUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDE8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRV9fR1JPVVAxID0gQlJFQUtET1dOX0VMRU1FTlRfX0dST1VQMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGVja2xpc3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRV9fQ0hFQ0tMSVNUID0gQlJFQUtET1dOX0VMRU1FTlRfX0NIRUNLTElTVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db25jZXB0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfX0NPTkNFUFQgPSBCUkVBS0RPV05fRUxFTUVOVF9fQ09OQ0VQVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeGFtcGxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfX0VYQU1QTEUgPSBCUkVBS0RPV05fRUxFTUVOVF9fRVhBTVBMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkZWxpbmU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRV9fR1VJREVMSU5FID0gQlJFQUtET1dOX0VMRU1FTlRfX0dVSURFTElORTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXVzYWJsZSBBc3NldDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfSU5URVJGQUNFX19SRVVTQUJMRV9BU1NFVCA9IEJSRUFLRE9XTl9FTEVNRU5UX19SRVVTQUJMRV9BU1NFVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwb3J0aW5nIE1hdGVyaWFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfX1NVUFBPUlRJTkdfTUFURVJJQUwgPSBCUkVBS0RPV05fRUxFTUVOVF9fU1VQUE9SVElOR19NQVRFUklBTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5XaGl0ZXBhcGVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfX1dISVRFUEFQRVIgPSBCUkVBS0RPV05fRUxFTUVOVF9fV0hJVEVQQVBFUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5IYXMgTXVsdGlwbGUgT2NjdXJyZW5jZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfX0hBU19NVUxUSVBMRV9PQ0NVUlJFTkNFUyA9IEJSRUFLRE9XTl9FTEVNRU5UX19IQVNfTVVMVElQTEVfT0NDVVJSRU5DRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgT3B0aW9uYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfX0lTX09QVElPTkFMID0gQlJFQUtET1dOX0VMRU1FTlRfX0lTX09QVElPTkFMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIFBsYW5uZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfX0lTX1BMQU5ORUQgPSBCUkVBS0RPV05fRUxFTUVOVF9fSVNfUExBTk5FRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVmaXg8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfX1BSRUZJWCA9IEJSRUFLRE9XTl9FTEVNRU5UX19QUkVGSVg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfX0dST1VQMiA9IEJSRUFLRE9XTl9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkludGVyZmFjZSBTcGVjaWZpY2F0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfX0lOVEVSRkFDRV9TUEVDSUZJQ0FUSU9OID0gQlJFQUtET1dOX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW50ZXJmYWNlIElPPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfX0lOVEVSRkFDRV9JTyA9IEJSRUFLRE9XTl9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlByb2Nlc3MgQ29tcG9uZW50IEludGVyZmFjZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfRkVBVFVSRV9DT1VOVCA9IEJSRUFLRE9XTl9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlByb2Nlc3NQbGFubmluZ1RlbXBsYXRlSW1wbCA8ZW0+UHJvY2VzcyBQbGFubmluZyBUZW1wbGF0ZTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGVJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFByb2Nlc3NQbGFubmluZ1RlbXBsYXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFBST0NFU1NfUExBTk5JTkdfVEVNUExBVEUgPSA2MDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QTEFOTklOR19URU1QTEFURV9fTkFNRSA9IFBST0NFU1NfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXA8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX0dST1VQID0gUFJPQ0VTU19fR1JPVVA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QTEFOTklOR19URU1QTEFURV9fT1dORURfUlVMRSA9IFBST0NFU1NfX09XTkVEX1JVTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gUFJPQ0VTU19fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19CUklFRl9ERVNDUklQVElPTiA9IFBST0NFU1NfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QTEFOTklOR19URU1QTEFURV9fSUQgPSBQUk9DRVNTX19JRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX09SREVSSU5HX0dVSURFID0gUFJPQ0VTU19fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19QUkVTRU5UQVRJT05fTkFNRSA9IFBST0NFU1NfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19TVVBQUkVTU0VEID0gUFJPQ0VTU19fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19QUkVTRU5UQVRJT04gPSBQUk9DRVNTX19QUkVTRU5UQVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RnVsZmlsbDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QTEFOTklOR19URU1QTEFURV9fRlVMRklMTCA9IFBST0NFU1NfX0ZVTEZJTEw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgQWJzdHJhY3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19JU19BQlNUUkFDVCA9IFBST0NFU1NfX0lTX0FCU1RSQUNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QTEFOTklOR19URU1QTEFURV9fTk9ERUlDT04gPSBQUk9DRVNTX19OT0RFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TaGFwZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19TSEFQRUlDT04gPSBQUk9DRVNTX19TSEFQRUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGVkIEFmdGVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QTEFOTklOR19URU1QTEFURV9fUFJFU0VOVEVEX0FGVEVSID0gUFJPQ0VTU19fUFJFU0VOVEVEX0FGVEVSOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRlZCBCZWZvcmU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19QUkVTRU5URURfQkVGT1JFID0gUFJPQ0VTU19fUFJFU0VOVEVEX0JFRk9SRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QbGFubmluZyBEYXRhPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QTEFOTklOR19URU1QTEFURV9fUExBTk5JTkdfREFUQSA9IFBST0NFU1NfX1BMQU5OSU5HX0RBVEE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwZXIgQWN0aXZpdHk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19TVVBFUl9BQ1RJVklUWSA9IFBST0NFU1NfX1NVUEVSX0FDVElWSVRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QTEFOTklOR19URU1QTEFURV9fR1JPVVAxID0gUFJPQ0VTU19fR1JPVVAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoZWNrbGlzdDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QTEFOTklOR19URU1QTEFURV9fQ0hFQ0tMSVNUID0gUFJPQ0VTU19fQ0hFQ0tMSVNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbmNlcHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX0NPTkNFUFQgPSBQUk9DRVNTX19DT05DRVBUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4YW1wbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX0VYQU1QTEUgPSBQUk9DRVNTX19FWEFNUExFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWRlbGluZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QTEFOTklOR19URU1QTEFURV9fR1VJREVMSU5FID0gUFJPQ0VTU19fR1VJREVMSU5FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJldXNhYmxlIEFzc2V0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19SRVVTQUJMRV9BU1NFVCA9IFBST0NFU1NfX1JFVVNBQkxFX0FTU0VUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHBvcnRpbmcgTWF0ZXJpYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX1NVUFBPUlRJTkdfTUFURVJJQUwgPSBQUk9DRVNTX19TVVBQT1JUSU5HX01BVEVSSUFMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldoaXRlcGFwZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX1dISVRFUEFQRVIgPSBQUk9DRVNTX19XSElURVBBUEVSOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkhhcyBNdWx0aXBsZSBPY2N1cnJlbmNlczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX0hBU19NVUxUSVBMRV9PQ0NVUlJFTkNFUyA9IFBST0NFU1NfX0hBU19NVUxUSVBMRV9PQ0NVUlJFTkNFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBPcHRpb25hbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX0lTX09QVElPTkFMID0gUFJPQ0VTU19fSVNfT1BUSU9OQUw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgUGxhbm5lZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX0lTX1BMQU5ORUQgPSBQUk9DRVNTX19JU19QTEFOTkVEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZWZpeDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX1BSRUZJWCA9IFBST0NFU1NfX1BSRUZJWDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX0dST1VQMiA9IFBST0NFU1NfX0dST1VQMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVkZWNlc3NvcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QTEFOTklOR19URU1QTEFURV9fUFJFREVDRVNTT1IgPSBQUk9DRVNTX19QUkVERUNFU1NPUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBFdmVudCBEcml2ZW48L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19JU19FVkVOVF9EUklWRU4gPSBQUk9DRVNTX19JU19FVkVOVF9EUklWRU47Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgT25nb2luZzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX0lTX09OR09JTkcgPSBQUk9DRVNTX19JU19PTkdPSU5HOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIFJlcGVhdGFibGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19JU19SRVBFQVRBQkxFID0gUFJPQ0VTU19fSVNfUkVQRUFUQUJMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVjb25kaXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19QUkVDT05ESVRJT04gPSBQUk9DRVNTX19QUkVDT05ESVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UG9zdGNvbmRpdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX1BPU1RDT05ESVRJT04gPSBQUk9DRVNTX19QT1NUQ09ORElUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMzwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QTEFOTklOR19URU1QTEFURV9fR1JPVVAzID0gUFJPQ0VTU19fR1JPVVAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyZWFrZG93biBFbGVtZW50PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19CUkVBS0RPV05fRUxFTUVOVCA9IFBST0NFU1NfX0JSRUFLRE9XTl9FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJvYWRtYXA8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX1JPQURNQVAgPSBQUk9DRVNTX19ST0FETUFQOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIEVuYWN0YWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX0lTX0VOQUNUQUJMRSA9IFBST0NFU1NfX0lTX0VOQUNUQUJMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QTEFOTklOR19URU1QTEFURV9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVCA9IFBST0NFU1NfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX1ZBUklBQklMSVRZX1RZUEUgPSBQUk9DRVNTX19WQVJJQUJJTElUWV9UWVBFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkluY2x1ZGVzIFBhdHRlcm48L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX0lOQ0xVREVTX1BBVFRFUk4gPSBQUk9DRVNTX19JTkNMVURFU19QQVRURVJOOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlZmF1bHQgQ29udGV4dDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX0RFRkFVTFRfQ09OVEVYVCA9IFBST0NFU1NfX0RFRkFVTFRfQ09OVEVYVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYWxpZCBDb250ZXh0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19WQUxJRF9DT05URVhUID0gUFJPQ0VTU19fVkFMSURfQ09OVEVYVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EaWFncmFtIFVSSTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX0RJQUdSQU1fVVJJID0gUFJPQ0VTU19fRElBR1JBTV9VUkk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXA0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19HUk9VUDQgPSBQUk9DRVNTX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJhc2UgUHJvY2VzczwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QTEFOTklOR19URU1QTEFURV9fQkFTRV9QUk9DRVNTID0gUFJPQ0VTU19GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Qcm9jZXNzIFBsYW5uaW5nIFRlbXBsYXRlPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfRkVBVFVSRV9DT1VOVCA9IFBST0NFU1NfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUmVwb3J0SW1wbCA8ZW0+UmVwb3J0PC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5SZXBvcnRJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFJlcG9ydCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBSRVBPUlQgPSA2MTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVQT1JUX19OQU1FID0gR1VJREFOQ0VfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXA8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFUE9SVF9fR1JPVVAgPSBHVUlEQU5DRV9fR1JPVVA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVQT1JUX19PV05FRF9SVUxFID0gR1VJREFOQ0VfX09XTkVEX1JVTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFUE9SVF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBHVUlEQU5DRV9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVBPUlRfX0JSSUVGX0RFU0NSSVBUSU9OID0gR1VJREFOQ0VfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVQT1JUX19JRCA9IEdVSURBTkNFX19JRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFUE9SVF9fT1JERVJJTkdfR1VJREUgPSBHVUlEQU5DRV9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVBPUlRfX1BSRVNFTlRBVElPTl9OQU1FID0gR1VJREFOQ0VfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVBPUlRfX1NVUFBSRVNTRUQgPSBHVUlEQU5DRV9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVBPUlRfX1BSRVNFTlRBVElPTiA9IEdVSURBTkNFX19QUkVTRU5UQVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RnVsZmlsbDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVQT1JUX19GVUxGSUxMID0gR1VJREFOQ0VfX0ZVTEZJTEw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgQWJzdHJhY3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVBPUlRfX0lTX0FCU1RSQUNUID0gR1VJREFOQ0VfX0lTX0FCU1RSQUNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVQT1JUX19OT0RFSUNPTiA9IEdVSURBTkNFX19OT0RFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TaGFwZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVBPUlRfX1NIQVBFSUNPTiA9IEdVSURBTkNFX19TSEFQRUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAxPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVBPUlRfX0dST1VQMSA9IEdVSURBTkNFX19HUk9VUDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hlY2tsaXN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVBPUlRfX0NIRUNLTElTVCA9IEdVSURBTkNFX19DSEVDS0xJU1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29uY2VwdDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVQT1JUX19DT05DRVBUID0gR1VJREFOQ0VfX0NPTkNFUFQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXhhbXBsZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVQT1JUX19FWEFNUExFID0gR1VJREFOQ0VfX0VYQU1QTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZGVsaW5lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVBPUlRfX0dVSURFTElORSA9IEdVSURBTkNFX19HVUlERUxJTkU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmV1c2FibGUgQXNzZXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFUE9SVF9fUkVVU0FCTEVfQVNTRVQgPSBHVUlEQU5DRV9fUkVVU0FCTEVfQVNTRVQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcG9ydGluZyBNYXRlcmlhbDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVQT1JUX19TVVBQT1JUSU5HX01BVEVSSUFMID0gR1VJREFOQ0VfX1NVUFBPUlRJTkdfTUFURVJJQUw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+V2hpdGVwYXBlcjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVQT1JUX19XSElURVBBUEVSID0gR1VJREFOQ0VfX1dISVRFUEFQRVI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFUE9SVF9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVCA9IEdVSURBTkNFX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVBPUlRfX1ZBUklBQklMSVRZX1RZUEUgPSBHVUlEQU5DRV9fVkFSSUFCSUxJVFlfVFlQRTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5SZXBvcnQ8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVQT1JUX0ZFQVRVUkVfQ09VTlQgPSBHVUlEQU5DRV9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5SZXVzYWJsZUFzc2V0SW1wbCA8ZW0+UmV1c2FibGUgQXNzZXQ8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlJldXNhYmxlQXNzZXRJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFJldXNhYmxlQXNzZXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgUkVVU0FCTEVfQVNTRVQgPSA2MjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVVU0FCTEVfQVNTRVRfX05BTUUgPSBHVUlEQU5DRV9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVVU0FCTEVfQVNTRVRfX0dST1VQID0gR1VJREFOQ0VfX0dST1VQOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFVVNBQkxFX0FTU0VUX19PV05FRF9SVUxFID0gR1VJREFOQ0VfX09XTkVEX1JVTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFVVNBQkxFX0FTU0VUX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IEdVSURBTkNFX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFVVNBQkxFX0FTU0VUX19CUklFRl9ERVNDUklQVElPTiA9IEdVSURBTkNFX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFVVNBQkxFX0FTU0VUX19JRCA9IEdVSURBTkNFX19JRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFVVNBQkxFX0FTU0VUX19PUkRFUklOR19HVUlERSA9IEdVSURBTkNFX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFVVNBQkxFX0FTU0VUX19QUkVTRU5UQVRJT05fTkFNRSA9IEdVSURBTkNFX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVVU0FCTEVfQVNTRVRfX1NVUFBSRVNTRUQgPSBHVUlEQU5DRV9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVVTQUJMRV9BU1NFVF9fUFJFU0VOVEFUSU9OID0gR1VJREFOQ0VfX1BSRVNFTlRBVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GdWxmaWxsPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVVTQUJMRV9BU1NFVF9fRlVMRklMTCA9IEdVSURBTkNFX19GVUxGSUxMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIEFic3RyYWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVVU0FCTEVfQVNTRVRfX0lTX0FCU1RSQUNUID0gR1VJREFOQ0VfX0lTX0FCU1RSQUNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVVU0FCTEVfQVNTRVRfX05PREVJQ09OID0gR1VJREFOQ0VfX05PREVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNoYXBlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFVVNBQkxFX0FTU0VUX19TSEFQRUlDT04gPSBHVUlEQU5DRV9fU0hBUEVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVVU0FCTEVfQVNTRVRfX0dST1VQMSA9IEdVSURBTkNFX19HUk9VUDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hlY2tsaXN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVVTQUJMRV9BU1NFVF9fQ0hFQ0tMSVNUID0gR1VJREFOQ0VfX0NIRUNLTElTVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db25jZXB0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVVTQUJMRV9BU1NFVF9fQ09OQ0VQVCA9IEdVSURBTkNFX19DT05DRVBUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4YW1wbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFVVNBQkxFX0FTU0VUX19FWEFNUExFID0gR1VJREFOQ0VfX0VYQU1QTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZGVsaW5lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVVTQUJMRV9BU1NFVF9fR1VJREVMSU5FID0gR1VJREFOQ0VfX0dVSURFTElORTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXVzYWJsZSBBc3NldDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVVU0FCTEVfQVNTRVRfX1JFVVNBQkxFX0FTU0VUID0gR1VJREFOQ0VfX1JFVVNBQkxFX0FTU0VUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHBvcnRpbmcgTWF0ZXJpYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFVVNBQkxFX0FTU0VUX19TVVBQT1JUSU5HX01BVEVSSUFMID0gR1VJREFOQ0VfX1NVUFBPUlRJTkdfTUFURVJJQUw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+V2hpdGVwYXBlcjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVVU0FCTEVfQVNTRVRfX1dISVRFUEFQRVIgPSBHVUlEQU5DRV9fV0hJVEVQQVBFUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVVU0FCTEVfQVNTRVRfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQgPSBHVUlEQU5DRV9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVVU0FCTEVfQVNTRVRfX1ZBUklBQklMSVRZX1RZUEUgPSBHVUlEQU5DRV9fVkFSSUFCSUxJVFlfVFlQRTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5SZXVzYWJsZSBBc3NldDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVVTQUJMRV9BU1NFVF9GRUFUVVJFX0NPVU5UID0gR1VJREFOQ0VfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUm9hZG1hcEltcGwgPGVtPlJvYWRtYXA8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlJvYWRtYXBJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFJvYWRtYXAoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgUk9BRE1BUCA9IDYzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0FETUFQX19OQU1FID0gR1VJREFOQ0VfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXA8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPQURNQVBfX0dST1VQID0gR1VJREFOQ0VfX0dST1VQOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPQURNQVBfX09XTkVEX1JVTEUgPSBHVUlEQU5DRV9fT1dORURfUlVMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9BRE1BUF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBHVUlEQU5DRV9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0FETUFQX19CUklFRl9ERVNDUklQVElPTiA9IEdVSURBTkNFX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPQURNQVBfX0lEID0gR1VJREFOQ0VfX0lEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9BRE1BUF9fT1JERVJJTkdfR1VJREUgPSBHVUlEQU5DRV9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0FETUFQX19QUkVTRU5UQVRJT05fTkFNRSA9IEdVSURBTkNFX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9BRE1BUF9fU1VQUFJFU1NFRCA9IEdVSURBTkNFX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPQURNQVBfX1BSRVNFTlRBVElPTiA9IEdVSURBTkNFX19QUkVTRU5UQVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RnVsZmlsbDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9BRE1BUF9fRlVMRklMTCA9IEdVSURBTkNFX19GVUxGSUxMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIEFic3RyYWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9BRE1BUF9fSVNfQUJTVFJBQ1QgPSBHVUlEQU5DRV9fSVNfQUJTVFJBQ1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm9kZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0FETUFQX19OT0RFSUNPTiA9IEdVSURBTkNFX19OT0RFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TaGFwZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0FETUFQX19TSEFQRUlDT04gPSBHVUlEQU5DRV9fU0hBUEVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9BRE1BUF9fR1JPVVAxID0gR1VJREFOQ0VfX0dST1VQMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGVja2xpc3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPQURNQVBfX0NIRUNLTElTVCA9IEdVSURBTkNFX19DSEVDS0xJU1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29uY2VwdDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9BRE1BUF9fQ09OQ0VQVCA9IEdVSURBTkNFX19DT05DRVBUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4YW1wbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPQURNQVBfX0VYQU1QTEUgPSBHVUlEQU5DRV9fRVhBTVBMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkZWxpbmU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPQURNQVBfX0dVSURFTElORSA9IEdVSURBTkNFX19HVUlERUxJTkU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmV1c2FibGUgQXNzZXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPQURNQVBfX1JFVVNBQkxFX0FTU0VUID0gR1VJREFOQ0VfX1JFVVNBQkxFX0FTU0VUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHBvcnRpbmcgTWF0ZXJpYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPQURNQVBfX1NVUFBPUlRJTkdfTUFURVJJQUwgPSBHVUlEQU5DRV9fU1VQUE9SVElOR19NQVRFUklBTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5XaGl0ZXBhcGVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0FETUFQX19XSElURVBBUEVSID0gR1VJREFOQ0VfX1dISVRFUEFQRVI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPQURNQVBfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQgPSBHVUlEQU5DRV9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9BRE1BUF9fVkFSSUFCSUxJVFlfVFlQRSA9IEdVSURBTkNFX19WQVJJQUJJTElUWV9UWVBFOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlJvYWRtYXA8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9BRE1BUF9GRUFUVVJFX0NPVU5UID0gR1VJREFOQ0VfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUm9sZUltcGwgPGVtPlJvbGU8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlJvbGVJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFJvbGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgUk9MRSA9IDY0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX19OQU1FID0gQ09OVEVOVF9FTEVNRU5UX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX19HUk9VUCA9IENPTlRFTlRfRUxFTUVOVF9fR1JPVVA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9fT1dORURfUlVMRSA9IENPTlRFTlRfRUxFTUVOVF9fT1dORURfUlVMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBDT05URU5UX0VMRU1FTlRfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9fQlJJRUZfREVTQ1JJUFRJT04gPSBDT05URU5UX0VMRU1FTlRfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9fSUQgPSBDT05URU5UX0VMRU1FTlRfX0lEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9fT1JERVJJTkdfR1VJREUgPSBDT05URU5UX0VMRU1FTlRfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9fUFJFU0VOVEFUSU9OX05BTUUgPSBDT05URU5UX0VMRU1FTlRfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX19TVVBQUkVTU0VEID0gQ09OVEVOVF9FTEVNRU5UX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfX1BSRVNFTlRBVElPTiA9IENPTlRFTlRfRUxFTUVOVF9fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZ1bGZpbGw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfX0ZVTEZJTEwgPSBDT05URU5UX0VMRU1FTlRfX0ZVTEZJTEw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgQWJzdHJhY3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX19JU19BQlNUUkFDVCA9IENPTlRFTlRfRUxFTUVOVF9fSVNfQUJTVFJBQ1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm9kZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX19OT0RFSUNPTiA9IENPTlRFTlRfRUxFTUVOVF9fTk9ERUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2hhcGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9fU0hBUEVJQ09OID0gQ09OVEVOVF9FTEVNRU5UX19TSEFQRUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAxPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX19HUk9VUDEgPSBDT05URU5UX0VMRU1FTlRfX0dST1VQMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGVja2xpc3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfX0NIRUNLTElTVCA9IENPTlRFTlRfRUxFTUVOVF9fQ0hFQ0tMSVNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbmNlcHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfX0NPTkNFUFQgPSBDT05URU5UX0VMRU1FTlRfX0NPTkNFUFQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXhhbXBsZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9fRVhBTVBMRSA9IENPTlRFTlRfRUxFTUVOVF9fRVhBTVBMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkZWxpbmU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfX0dVSURFTElORSA9IENPTlRFTlRfRUxFTUVOVF9fR1VJREVMSU5FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJldXNhYmxlIEFzc2V0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX19SRVVTQUJMRV9BU1NFVCA9IENPTlRFTlRfRUxFTUVOVF9fUkVVU0FCTEVfQVNTRVQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcG9ydGluZyBNYXRlcmlhbDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9fU1VQUE9SVElOR19NQVRFUklBTCA9IENPTlRFTlRfRUxFTUVOVF9fU1VQUE9SVElOR19NQVRFUklBTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5XaGl0ZXBhcGVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX19XSElURVBBUEVSID0gQ09OVEVOVF9FTEVNRU5UX19XSElURVBBUEVSOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UID0gQ09OVEVOVF9FTEVNRU5UX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX19WQVJJQUJJTElUWV9UWVBFID0gQ09OVEVOVF9FTEVNRU5UX19WQVJJQUJJTElUWV9UWVBFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9fR1JPVVAyID0gQ09OVEVOVF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlc3BvbnNpYmxlIEZvcjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9fUkVTUE9OU0lCTEVfRk9SID0gQ09OVEVOVF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlJvbGU8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9GRUFUVVJFX0NPVU5UID0gQ09OVEVOVF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlJvbGVEZXNjcmlwdGlvbkltcGwgPGVtPlJvbGUgRGVzY3JpcHRpb248L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlJvbGVEZXNjcmlwdGlvbkltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0Um9sZURlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFJPTEVfREVTQ1JJUFRJT04gPSA2NTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9ERVNDUklQVElPTl9fTkFNRSA9IENPTlRFTlRfREVTQ1JJUFRJT05fX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXA8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfREVTQ1JJUFRJT05fX0dST1VQID0gQ09OVEVOVF9ERVNDUklQVElPTl9fR1JPVVA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9ERVNDUklQVElPTl9fT1dORURfUlVMRSA9IENPTlRFTlRfREVTQ1JJUFRJT05fX09XTkVEX1JVTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfREVTQ1JJUFRJT05fX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gQ09OVEVOVF9ERVNDUklQVElPTl9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX0RFU0NSSVBUSU9OX19CUklFRl9ERVNDUklQVElPTiA9IENPTlRFTlRfREVTQ1JJUFRJT05fX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9ERVNDUklQVElPTl9fSUQgPSBDT05URU5UX0RFU0NSSVBUSU9OX19JRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfREVTQ1JJUFRJT05fX09SREVSSU5HX0dVSURFID0gQ09OVEVOVF9ERVNDUklQVElPTl9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX0RFU0NSSVBUSU9OX19QUkVTRU5UQVRJT05fTkFNRSA9IENPTlRFTlRfREVTQ1JJUFRJT05fX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX0RFU0NSSVBUSU9OX19TVVBQUkVTU0VEID0gQ09OVEVOVF9ERVNDUklQVElPTl9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db3B5cmlnaHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX0RFU0NSSVBUSU9OX19DT1BZUklHSFQgPSBDT05URU5UX0RFU0NSSVBUSU9OX19DT1BZUklHSFQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXV0aG9yczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfREVTQ1JJUFRJT05fX0FVVEhPUlMgPSBDT05URU5UX0RFU0NSSVBUSU9OX19BVVRIT1JTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoYW5nZSBEYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9ERVNDUklQVElPTl9fQ0hBTkdFX0RBVEUgPSBDT05URU5UX0RFU0NSSVBUSU9OX19DSEFOR0VfREFURTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGFuZ2UgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX0RFU0NSSVBUSU9OX19DSEFOR0VfREVTQ1JJUFRJT04gPSBDT05URU5UX0RFU0NSSVBUSU9OX19DSEFOR0VfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmVyc2lvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfREVTQ1JJUFRJT05fX1ZFUlNJT04gPSBDT05URU5UX0RFU0NSSVBUSU9OX19WRVJTSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1haW4gRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX0RFU0NSSVBUSU9OX19NQUlOX0RFU0NSSVBUSU9OID0gQ09OVEVOVF9ERVNDUklQVElPTl9fTUFJTl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5LZXkgQ29uc2lkZXJhdGlvbnM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX0RFU0NSSVBUSU9OX19LRVlfQ09OU0lERVJBVElPTlMgPSBDT05URU5UX0RFU0NSSVBUSU9OX19LRVlfQ09OU0lERVJBVElPTlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2VjdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9ERVNDUklQVElPTl9fU0VDVElPTiA9IENPTlRFTlRfREVTQ1JJUFRJT05fX1NFQ1RJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXh0ZXJuYWwgSWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX0RFU0NSSVBUSU9OX19FWFRFUk5BTF9JRCA9IENPTlRFTlRfREVTQ1JJUFRJT05fX0VYVEVSTkFMX0lEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFzc2lnbm1lbnQgQXBwcm9hY2hlczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfREVTQ1JJUFRJT05fX0FTU0lHTk1FTlRfQVBQUk9BQ0hFUyA9IENPTlRFTlRfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2tpbGxzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9ERVNDUklQVElPTl9fU0tJTExTID0gQ09OVEVOVF9ERVNDUklQVElPTl9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TeW5vbnltczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfREVTQ1JJUFRJT05fX1NZTk9OWU1TID0gQ09OVEVOVF9ERVNDUklQVElPTl9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Sb2xlIERlc2NyaXB0aW9uPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCA9IENPTlRFTlRfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUm9sZVNldEltcGwgPGVtPlJvbGUgU2V0PC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Sb2xlU2V0SW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRSb2xlU2V0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFJPTEVfU0VUID0gNjc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfU0VUX19OQU1FID0gQ09OVEVOVF9DQVRFR09SWV9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9TRVRfX0dST1VQID0gQ09OVEVOVF9DQVRFR09SWV9fR1JPVVA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9TRVRfX09XTkVEX1JVTEUgPSBDT05URU5UX0NBVEVHT1JZX19PV05FRF9SVUxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX1NFVF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBDT05URU5UX0NBVEVHT1JZX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfU0VUX19CUklFRl9ERVNDUklQVElPTiA9IENPTlRFTlRfQ0FURUdPUllfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9TRVRfX0lEID0gQ09OVEVOVF9DQVRFR09SWV9fSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX1NFVF9fT1JERVJJTkdfR1VJREUgPSBDT05URU5UX0NBVEVHT1JZX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfU0VUX19QUkVTRU5UQVRJT05fTkFNRSA9IENPTlRFTlRfQ0FURUdPUllfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX1NFVF9fU1VQUFJFU1NFRCA9IENPTlRFTlRfQ0FURUdPUllfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9TRVRfX1BSRVNFTlRBVElPTiA9IENPTlRFTlRfQ0FURUdPUllfX1BSRVNFTlRBVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GdWxmaWxsPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX1NFVF9fRlVMRklMTCA9IENPTlRFTlRfQ0FURUdPUllfX0ZVTEZJTEw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgQWJzdHJhY3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX1NFVF9fSVNfQUJTVFJBQ1QgPSBDT05URU5UX0NBVEVHT1JZX19JU19BQlNUUkFDVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob2RlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfU0VUX19OT0RFSUNPTiA9IENPTlRFTlRfQ0FURUdPUllfX05PREVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNoYXBlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfU0VUX19TSEFQRUlDT04gPSBDT05URU5UX0NBVEVHT1JZX19TSEFQRUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAxPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX1NFVF9fR1JPVVAxID0gQ09OVEVOVF9DQVRFR09SWV9fR1JPVVAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoZWNrbGlzdDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9TRVRfX0NIRUNLTElTVCA9IENPTlRFTlRfQ0FURUdPUllfX0NIRUNLTElTVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db25jZXB0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX1NFVF9fQ09OQ0VQVCA9IENPTlRFTlRfQ0FURUdPUllfX0NPTkNFUFQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXhhbXBsZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9TRVRfX0VYQU1QTEUgPSBDT05URU5UX0NBVEVHT1JZX19FWEFNUExFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWRlbGluZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9TRVRfX0dVSURFTElORSA9IENPTlRFTlRfQ0FURUdPUllfX0dVSURFTElORTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXVzYWJsZSBBc3NldDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9TRVRfX1JFVVNBQkxFX0FTU0VUID0gQ09OVEVOVF9DQVRFR09SWV9fUkVVU0FCTEVfQVNTRVQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcG9ydGluZyBNYXRlcmlhbDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9TRVRfX1NVUFBPUlRJTkdfTUFURVJJQUwgPSBDT05URU5UX0NBVEVHT1JZX19TVVBQT1JUSU5HX01BVEVSSUFMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldoaXRlcGFwZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfU0VUX19XSElURVBBUEVSID0gQ09OVEVOVF9DQVRFR09SWV9fV0hJVEVQQVBFUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9TRVRfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQgPSBDT05URU5UX0NBVEVHT1JZX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX1NFVF9fVkFSSUFCSUxJVFlfVFlQRSA9IENPTlRFTlRfQ0FURUdPUllfX1ZBUklBQklMSVRZX1RZUEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX1NFVF9fR1JPVVAyID0gQ09OVEVOVF9DQVRFR09SWV9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Sb2xlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX1NFVF9fUk9MRSA9IENPTlRFTlRfQ0FURUdPUllfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+Um9sZSBTZXQ8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9TRVRfRkVBVFVSRV9DT1VOVCA9IENPTlRFTlRfQ0FURUdPUllfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUm9sZVNldEdyb3VwaW5nSW1wbCA8ZW0+Um9sZSBTZXQgR3JvdXBpbmc8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlJvbGVTZXRHcm91cGluZ0ltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0Um9sZVNldEdyb3VwaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFJPTEVfU0VUX0dST1VQSU5HID0gNjg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfU0VUX0dST1VQSU5HX19OQU1FID0gQ09OVEVOVF9DQVRFR09SWV9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9TRVRfR1JPVVBJTkdfX0dST1VQID0gQ09OVEVOVF9DQVRFR09SWV9fR1JPVVA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9TRVRfR1JPVVBJTkdfX09XTkVEX1JVTEUgPSBDT05URU5UX0NBVEVHT1JZX19PV05FRF9SVUxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX1NFVF9HUk9VUElOR19fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBDT05URU5UX0NBVEVHT1JZX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfU0VUX0dST1VQSU5HX19CUklFRl9ERVNDUklQVElPTiA9IENPTlRFTlRfQ0FURUdPUllfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9TRVRfR1JPVVBJTkdfX0lEID0gQ09OVEVOVF9DQVRFR09SWV9fSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX1NFVF9HUk9VUElOR19fT1JERVJJTkdfR1VJREUgPSBDT05URU5UX0NBVEVHT1JZX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfU0VUX0dST1VQSU5HX19QUkVTRU5UQVRJT05fTkFNRSA9IENPTlRFTlRfQ0FURUdPUllfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX1NFVF9HUk9VUElOR19fU1VQUFJFU1NFRCA9IENPTlRFTlRfQ0FURUdPUllfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9TRVRfR1JPVVBJTkdfX1BSRVNFTlRBVElPTiA9IENPTlRFTlRfQ0FURUdPUllfX1BSRVNFTlRBVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GdWxmaWxsPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX1NFVF9HUk9VUElOR19fRlVMRklMTCA9IENPTlRFTlRfQ0FURUdPUllfX0ZVTEZJTEw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgQWJzdHJhY3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX1NFVF9HUk9VUElOR19fSVNfQUJTVFJBQ1QgPSBDT05URU5UX0NBVEVHT1JZX19JU19BQlNUUkFDVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob2RlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfU0VUX0dST1VQSU5HX19OT0RFSUNPTiA9IENPTlRFTlRfQ0FURUdPUllfX05PREVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNoYXBlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfU0VUX0dST1VQSU5HX19TSEFQRUlDT04gPSBDT05URU5UX0NBVEVHT1JZX19TSEFQRUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAxPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX1NFVF9HUk9VUElOR19fR1JPVVAxID0gQ09OVEVOVF9DQVRFR09SWV9fR1JPVVAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoZWNrbGlzdDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9TRVRfR1JPVVBJTkdfX0NIRUNLTElTVCA9IENPTlRFTlRfQ0FURUdPUllfX0NIRUNLTElTVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db25jZXB0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX1NFVF9HUk9VUElOR19fQ09OQ0VQVCA9IENPTlRFTlRfQ0FURUdPUllfX0NPTkNFUFQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXhhbXBsZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9TRVRfR1JPVVBJTkdfX0VYQU1QTEUgPSBDT05URU5UX0NBVEVHT1JZX19FWEFNUExFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWRlbGluZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9TRVRfR1JPVVBJTkdfX0dVSURFTElORSA9IENPTlRFTlRfQ0FURUdPUllfX0dVSURFTElORTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXVzYWJsZSBBc3NldDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9TRVRfR1JPVVBJTkdfX1JFVVNBQkxFX0FTU0VUID0gQ09OVEVOVF9DQVRFR09SWV9fUkVVU0FCTEVfQVNTRVQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcG9ydGluZyBNYXRlcmlhbDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9TRVRfR1JPVVBJTkdfX1NVUFBPUlRJTkdfTUFURVJJQUwgPSBDT05URU5UX0NBVEVHT1JZX19TVVBQT1JUSU5HX01BVEVSSUFMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldoaXRlcGFwZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfU0VUX0dST1VQSU5HX19XSElURVBBUEVSID0gQ09OVEVOVF9DQVRFR09SWV9fV0hJVEVQQVBFUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9TRVRfR1JPVVBJTkdfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQgPSBDT05URU5UX0NBVEVHT1JZX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX1NFVF9HUk9VUElOR19fVkFSSUFCSUxJVFlfVFlQRSA9IENPTlRFTlRfQ0FURUdPUllfX1ZBUklBQklMSVRZX1RZUEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX1NFVF9HUk9VUElOR19fR1JPVVAyID0gQ09OVEVOVF9DQVRFR09SWV9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Sb2xlIFNldDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9TRVRfR1JPVVBJTkdfX1JPTEVfU0VUID0gQ09OVEVOVF9DQVRFR09SWV9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Sb2xlIFNldCBHcm91cGluZzwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX1NFVF9HUk9VUElOR19GRUFUVVJFX0NPVU5UID0gQ09OVEVOVF9DQVRFR09SWV9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5TZWN0aW9uSW1wbCA8ZW0+U2VjdGlvbjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuU2VjdGlvbkltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0U2VjdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBTRUNUSU9OID0gNjk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNFQ1RJT05fX05BTUUgPSBNRVRIT0RfRUxFTUVOVF9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0VDVElPTl9fR1JPVVAgPSBNRVRIT0RfRUxFTUVOVF9fR1JPVVA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0VDVElPTl9fT1dORURfUlVMRSA9IE1FVEhPRF9FTEVNRU5UX19PV05FRF9SVUxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTRUNUSU9OX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IE1FVEhPRF9FTEVNRU5UX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNFQ1RJT05fX0JSSUVGX0RFU0NSSVBUSU9OID0gTUVUSE9EX0VMRU1FTlRfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0VDVElPTl9fSUQgPSBNRVRIT0RfRUxFTUVOVF9fSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTRUNUSU9OX19PUkRFUklOR19HVUlERSA9IE1FVEhPRF9FTEVNRU5UX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNFQ1RJT05fX1BSRVNFTlRBVElPTl9OQU1FID0gTUVUSE9EX0VMRU1FTlRfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTRUNUSU9OX19TVVBQUkVTU0VEID0gTUVUSE9EX0VMRU1FTlRfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3ViIFNlY3Rpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTRUNUSU9OX19TVUJfU0VDVElPTiA9IE1FVEhPRF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZWRlY2Vzc29yPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0VDVElPTl9fUFJFREVDRVNTT1IgPSBNRVRIT0RfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNFQ1RJT05fX0RFU0NSSVBUSU9OID0gTUVUSE9EX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2VjdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0VDVElPTl9fU0VDVElPTl9OQU1FID0gTUVUSE9EX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNFQ1RJT05fX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQgPSBNRVRIT0RfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0VDVElPTl9fVkFSSUFCSUxJVFlfVFlQRSA9IE1FVEhPRF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA1OwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlNlY3Rpb248L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0VDVElPTl9GRUFUVVJFX0NPVU5UID0gTUVUSE9EX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDY7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuU3VwcG9ydGluZ01hdGVyaWFsSW1wbCA8ZW0+U3VwcG9ydGluZyBNYXRlcmlhbDwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuU3VwcG9ydGluZ01hdGVyaWFsSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRTdXBwb3J0aW5nTWF0ZXJpYWwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgU1VQUE9SVElOR19NQVRFUklBTCA9IDcwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTVVBQT1JUSU5HX01BVEVSSUFMX19OQU1FID0gR1VJREFOQ0VfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXA8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNVUFBPUlRJTkdfTUFURVJJQUxfX0dST1VQID0gR1VJREFOQ0VfX0dST1VQOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNVUFBPUlRJTkdfTUFURVJJQUxfX09XTkVEX1JVTEUgPSBHVUlEQU5DRV9fT1dORURfUlVMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU1VQUE9SVElOR19NQVRFUklBTF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBHVUlEQU5DRV9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTVVBQT1JUSU5HX01BVEVSSUFMX19CUklFRl9ERVNDUklQVElPTiA9IEdVSURBTkNFX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNVUFBPUlRJTkdfTUFURVJJQUxfX0lEID0gR1VJREFOQ0VfX0lEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU1VQUE9SVElOR19NQVRFUklBTF9fT1JERVJJTkdfR1VJREUgPSBHVUlEQU5DRV9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTVVBQT1JUSU5HX01BVEVSSUFMX19QUkVTRU5UQVRJT05fTkFNRSA9IEdVSURBTkNFX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU1VQUE9SVElOR19NQVRFUklBTF9fU1VQUFJFU1NFRCA9IEdVSURBTkNFX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNVUFBPUlRJTkdfTUFURVJJQUxfX1BSRVNFTlRBVElPTiA9IEdVSURBTkNFX19QUkVTRU5UQVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RnVsZmlsbDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU1VQUE9SVElOR19NQVRFUklBTF9fRlVMRklMTCA9IEdVSURBTkNFX19GVUxGSUxMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIEFic3RyYWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU1VQUE9SVElOR19NQVRFUklBTF9fSVNfQUJTVFJBQ1QgPSBHVUlEQU5DRV9fSVNfQUJTVFJBQ1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm9kZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTVVBQT1JUSU5HX01BVEVSSUFMX19OT0RFSUNPTiA9IEdVSURBTkNFX19OT0RFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TaGFwZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTVVBQT1JUSU5HX01BVEVSSUFMX19TSEFQRUlDT04gPSBHVUlEQU5DRV9fU0hBUEVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU1VQUE9SVElOR19NQVRFUklBTF9fR1JPVVAxID0gR1VJREFOQ0VfX0dST1VQMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGVja2xpc3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNVUFBPUlRJTkdfTUFURVJJQUxfX0NIRUNLTElTVCA9IEdVSURBTkNFX19DSEVDS0xJU1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29uY2VwdDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU1VQUE9SVElOR19NQVRFUklBTF9fQ09OQ0VQVCA9IEdVSURBTkNFX19DT05DRVBUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4YW1wbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNVUFBPUlRJTkdfTUFURVJJQUxfX0VYQU1QTEUgPSBHVUlEQU5DRV9fRVhBTVBMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkZWxpbmU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNVUFBPUlRJTkdfTUFURVJJQUxfX0dVSURFTElORSA9IEdVSURBTkNFX19HVUlERUxJTkU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmV1c2FibGUgQXNzZXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNVUFBPUlRJTkdfTUFURVJJQUxfX1JFVVNBQkxFX0FTU0VUID0gR1VJREFOQ0VfX1JFVVNBQkxFX0FTU0VUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHBvcnRpbmcgTWF0ZXJpYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNVUFBPUlRJTkdfTUFURVJJQUxfX1NVUFBPUlRJTkdfTUFURVJJQUwgPSBHVUlEQU5DRV9fU1VQUE9SVElOR19NQVRFUklBTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5XaGl0ZXBhcGVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTVVBQT1JUSU5HX01BVEVSSUFMX19XSElURVBBUEVSID0gR1VJREFOQ0VfX1dISVRFUEFQRVI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNVUFBPUlRJTkdfTUFURVJJQUxfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQgPSBHVUlEQU5DRV9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU1VQUE9SVElOR19NQVRFUklBTF9fVkFSSUFCSUxJVFlfVFlQRSA9IEdVSURBTkNFX19WQVJJQUJJTElUWV9UWVBFOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlN1cHBvcnRpbmcgTWF0ZXJpYWw8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU1VQUE9SVElOR19NQVRFUklBTF9GRUFUVVJFX0NPVU5UID0gR1VJREFOQ0VfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVGFza0ltcGwgPGVtPlRhc2s8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlRhc2tJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgVEFTSyA9IDcxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19OQU1FID0gQ09OVEVOVF9FTEVNRU5UX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19HUk9VUCA9IENPTlRFTlRfRUxFTUVOVF9fR1JPVVA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fT1dORURfUlVMRSA9IENPTlRFTlRfRUxFTUVOVF9fT1dORURfUlVMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBDT05URU5UX0VMRU1FTlRfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fQlJJRUZfREVTQ1JJUFRJT04gPSBDT05URU5UX0VMRU1FTlRfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fSUQgPSBDT05URU5UX0VMRU1FTlRfX0lEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fT1JERVJJTkdfR1VJREUgPSBDT05URU5UX0VMRU1FTlRfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fUFJFU0VOVEFUSU9OX05BTUUgPSBDT05URU5UX0VMRU1FTlRfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19TVVBQUkVTU0VEID0gQ09OVEVOVF9FTEVNRU5UX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX1BSRVNFTlRBVElPTiA9IENPTlRFTlRfRUxFTUVOVF9fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZ1bGZpbGw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX0ZVTEZJTEwgPSBDT05URU5UX0VMRU1FTlRfX0ZVTEZJTEw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgQWJzdHJhY3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19JU19BQlNUUkFDVCA9IENPTlRFTlRfRUxFTUVOVF9fSVNfQUJTVFJBQ1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm9kZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19OT0RFSUNPTiA9IENPTlRFTlRfRUxFTUVOVF9fTk9ERUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2hhcGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fU0hBUEVJQ09OID0gQ09OVEVOVF9FTEVNRU5UX19TSEFQRUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAxPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19HUk9VUDEgPSBDT05URU5UX0VMRU1FTlRfX0dST1VQMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGVja2xpc3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX0NIRUNLTElTVCA9IENPTlRFTlRfRUxFTUVOVF9fQ0hFQ0tMSVNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbmNlcHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX0NPTkNFUFQgPSBDT05URU5UX0VMRU1FTlRfX0NPTkNFUFQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXhhbXBsZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fRVhBTVBMRSA9IENPTlRFTlRfRUxFTUVOVF9fRVhBTVBMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkZWxpbmU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX0dVSURFTElORSA9IENPTlRFTlRfRUxFTUVOVF9fR1VJREVMSU5FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJldXNhYmxlIEFzc2V0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19SRVVTQUJMRV9BU1NFVCA9IENPTlRFTlRfRUxFTUVOVF9fUkVVU0FCTEVfQVNTRVQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcG9ydGluZyBNYXRlcmlhbDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fU1VQUE9SVElOR19NQVRFUklBTCA9IENPTlRFTlRfRUxFTUVOVF9fU1VQUE9SVElOR19NQVRFUklBTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5XaGl0ZXBhcGVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19XSElURVBBUEVSID0gQ09OVEVOVF9FTEVNRU5UX19XSElURVBBUEVSOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UID0gQ09OVEVOVF9FTEVNRU5UX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19WQVJJQUJJTElUWV9UWVBFID0gQ09OVEVOVF9FTEVNRU5UX19WQVJJQUJJTElUWV9UWVBFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZWNvbmRpdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX1BSRUNPTkRJVElPTiA9IENPTlRFTlRfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qb3N0Y29uZGl0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fUE9TVENPTkRJVElPTiA9IENPTlRFTlRfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QZXJmb3JtZWQgQnk8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX1BFUkZPUk1FRF9CWSA9IENPTlRFTlRfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX0dST1VQMiA9IENPTlRFTlRfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYW5kYXRvcnkgSW5wdXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX01BTkRBVE9SWV9JTlBVVCA9IENPTlRFTlRfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PdXRwdXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX09VVFBVVCA9IENPTlRFTlRfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgNTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BZGRpdGlvbmFsbHkgUGVyZm9ybWVkIEJ5PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19BRERJVElPTkFMTFlfUEVSRk9STUVEX0JZID0gQ09OVEVOVF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA2OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9wdGlvbmFsIElucHV0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19PUFRJT05BTF9JTlBVVCA9IENPTlRFTlRfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgNzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Fc3RpbWF0ZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fRVNUSU1BVEUgPSBDT05URU5UX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXN0aW1hdGlvbiBDb25zaWRlcmF0aW9uczwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fRVNUSU1BVElPTl9DT05TSURFUkFUSU9OUyA9IENPTlRFTlRfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgOTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ub29sIE1lbnRvcjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fVE9PTF9NRU5UT1IgPSBDT05URU5UX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDEwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlRhc2s8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19GRUFUVVJFX0NPVU5UID0gQ09OVEVOVF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxMTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5UYXNrRGVzY3JpcHRpb25JbXBsIDxlbT5UYXNrIERlc2NyaXB0aW9uPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5UYXNrRGVzY3JpcHRpb25JbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFRhc2tEZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUSU9OID0gNzI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRJT05fX05BTUUgPSBDT05URU5UX0RFU0NSSVBUSU9OX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUSU9OX19HUk9VUCA9IENPTlRFTlRfREVTQ1JJUFRJT05fX0dST1VQOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRJT05fX09XTkVEX1JVTEUgPSBDT05URU5UX0RFU0NSSVBUSU9OX19PV05FRF9SVUxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUSU9OX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IENPTlRFTlRfREVTQ1JJUFRJT05fX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVElPTl9fQlJJRUZfREVTQ1JJUFRJT04gPSBDT05URU5UX0RFU0NSSVBUSU9OX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRJT05fX0lEID0gQ09OVEVOVF9ERVNDUklQVElPTl9fSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUSU9OX19PUkRFUklOR19HVUlERSA9IENPTlRFTlRfREVTQ1JJUFRJT05fX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVElPTl9fUFJFU0VOVEFUSU9OX05BTUUgPSBDT05URU5UX0RFU0NSSVBUSU9OX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVElPTl9fU1VQUFJFU1NFRCA9IENPTlRFTlRfREVTQ1JJUFRJT05fX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29weXJpZ2h0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVElPTl9fQ09QWVJJR0hUID0gQ09OVEVOVF9ERVNDUklQVElPTl9fQ09QWVJJR0hUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkF1dGhvcnM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUSU9OX19BVVRIT1JTID0gQ09OVEVOVF9ERVNDUklQVElPTl9fQVVUSE9SUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGFuZ2UgRGF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRJT05fX0NIQU5HRV9EQVRFID0gQ09OVEVOVF9ERVNDUklQVElPTl9fQ0hBTkdFX0RBVEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hhbmdlIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVElPTl9fQ0hBTkdFX0RFU0NSSVBUSU9OID0gQ09OVEVOVF9ERVNDUklQVElPTl9fQ0hBTkdFX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZlcnNpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUSU9OX19WRVJTSU9OID0gQ09OVEVOVF9ERVNDUklQVElPTl9fVkVSU0lPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYWluIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVElPTl9fTUFJTl9ERVNDUklQVElPTiA9IENPTlRFTlRfREVTQ1JJUFRJT05fX01BSU5fREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+S2V5IENvbnNpZGVyYXRpb25zPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVElPTl9fS0VZX0NPTlNJREVSQVRJT05TID0gQ09OVEVOVF9ERVNDUklQVElPTl9fS0VZX0NPTlNJREVSQVRJT05TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNlY3Rpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRJT05fX1NFQ1RJT04gPSBDT05URU5UX0RFU0NSSVBUSU9OX19TRUNUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4dGVybmFsIElkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVElPTl9fRVhURVJOQUxfSUQgPSBDT05URU5UX0RFU0NSSVBUSU9OX19FWFRFUk5BTF9JRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BbHRlcm5hdGl2ZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUSU9OX19BTFRFUk5BVElWRVMgPSBDT05URU5UX0RFU0NSSVBUSU9OX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlB1cnBvc2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUSU9OX19QVVJQT1NFID0gQ09OVEVOVF9ERVNDUklQVElPTl9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5UYXNrIERlc2NyaXB0aW9uPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCA9IENPTlRFTlRfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVGFza0Rlc2NyaXB0b3JJbXBsIDxlbT5UYXNrIERlc2NyaXB0b3I8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlRhc2tEZXNjcmlwdG9ySW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRUYXNrRGVzY3JpcHRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUT1IgPSA3MzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVE9SX19OQU1FID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVE9SX19HUk9VUCA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0dST1VQOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRPUl9fT1dORURfUlVMRSA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX09XTkVEX1JVTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRPUl9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRPUl9fQlJJRUZfREVTQ1JJUFRJT04gPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRPUl9fSUQgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19JRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRPUl9fT1JERVJJTkdfR1VJREUgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRPUl9fUFJFU0VOVEFUSU9OX05BTUUgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVE9SX19TVVBQUkVTU0VEID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUT1JfX1BSRVNFTlRBVElPTiA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX1BSRVNFTlRBVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GdWxmaWxsPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUT1JfX0ZVTEZJTEwgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19GVUxGSUxMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIEFic3RyYWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVE9SX19JU19BQlNUUkFDVCA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0lTX0FCU1RSQUNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVE9SX19OT0RFSUNPTiA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX05PREVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNoYXBlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRPUl9fU0hBUEVJQ09OID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fU0hBUEVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRlZCBBZnRlcjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRPUl9fUFJFU0VOVEVEX0FGVEVSID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fUFJFU0VOVEVEX0FGVEVSOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRlZCBCZWZvcmU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUT1JfX1BSRVNFTlRFRF9CRUZPUkUgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19QUkVTRU5URURfQkVGT1JFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBsYW5uaW5nIERhdGE8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUT1JfX1BMQU5OSU5HX0RBVEEgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19QTEFOTklOR19EQVRBOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cGVyIEFjdGl2aXR5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVE9SX19TVVBFUl9BQ1RJVklUWSA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX1NVUEVSX0FDVElWSVRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVE9SX19HUk9VUDEgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19HUk9VUDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hlY2tsaXN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUT1JfX0NIRUNLTElTVCA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0NIRUNLTElTVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db25jZXB0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUT1JfX0NPTkNFUFQgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19DT05DRVBUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4YW1wbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRPUl9fRVhBTVBMRSA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0VYQU1QTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZGVsaW5lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUT1JfX0dVSURFTElORSA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0dVSURFTElORTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXVzYWJsZSBBc3NldDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVE9SX19SRVVTQUJMRV9BU1NFVCA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX1JFVVNBQkxFX0FTU0VUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHBvcnRpbmcgTWF0ZXJpYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRPUl9fU1VQUE9SVElOR19NQVRFUklBTCA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX1NVUFBPUlRJTkdfTUFURVJJQUw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+V2hpdGVwYXBlcjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVE9SX19XSElURVBBUEVSID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fV0hJVEVQQVBFUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5IYXMgTXVsdGlwbGUgT2NjdXJyZW5jZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUT1JfX0hBU19NVUxUSVBMRV9PQ0NVUlJFTkNFUyA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0hBU19NVUxUSVBMRV9PQ0NVUlJFTkNFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBPcHRpb25hbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRPUl9fSVNfT1BUSU9OQUwgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19JU19PUFRJT05BTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBQbGFubmVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVE9SX19JU19QTEFOTkVEID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fSVNfUExBTk5FRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVmaXg8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUT1JfX1BSRUZJWCA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX1BSRUZJWDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRPUl9fR1JPVVAyID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fR1JPVVAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZWRlY2Vzc29yPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUT1JfX1BSRURFQ0VTU09SID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fUFJFREVDRVNTT1I7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgRXZlbnQgRHJpdmVuPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVE9SX19JU19FVkVOVF9EUklWRU4gPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19JU19FVkVOVF9EUklWRU47Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgT25nb2luZzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRPUl9fSVNfT05HT0lORyA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0lTX09OR09JTkc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgUmVwZWF0YWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRPUl9fSVNfUkVQRUFUQUJMRSA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0lTX1JFUEVBVEFCTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGFzazwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRPUl9fVEFTSyA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UGVyZm9ybWVkIFByaW1hcmlseSBCeTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRPUl9fUEVSRk9STUVEX1BSSU1BUklMWV9CWSA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUT1JfX0dST1VQMyA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWRkaXRpb25hbGx5IFBlcmZvcm1lZCBCeTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVE9SX19BRERJVElPTkFMTFlfUEVSRk9STUVEX0JZID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Bc3Npc3RlZCBCeTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVE9SX19BU1NJU1RFRF9CWSA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXh0ZXJuYWwgSW5wdXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRPUl9fRVhURVJOQUxfSU5QVVQgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1hbmRhdG9yeSBJbnB1dDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVE9SX19NQU5EQVRPUllfSU5QVVQgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA2OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9wdGlvbmFsIElucHV0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUT1JfX09QVElPTkFMX0lOUFVUID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgNzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PdXRwdXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRPUl9fT1VUUFVUID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgODsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdGVwPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUT1JfX1NURVAgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA5OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIFN5bmNocm9uaXplZCBXaXRoIFNvdXJjZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRPUl9fSVNfU1lOQ0hST05JWkVEX1dJVEhfU09VUkNFID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMTA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+VGFzayBEZXNjcmlwdG9yPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRPUl9GRUFUVVJFX0NPVU5UID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMTE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVGVhbVByb2ZpbGVJbXBsIDxlbT5UZWFtIFByb2ZpbGU8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlRlYW1Qcm9maWxlSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRUZWFtUHJvZmlsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBURUFNX1BST0ZJTEUgPSA3NDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVBTV9QUk9GSUxFX19OQU1FID0gQlJFQUtET1dOX0VMRU1FTlRfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXA8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFQU1fUFJPRklMRV9fR1JPVVAgPSBCUkVBS0RPV05fRUxFTUVOVF9fR1JPVVA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVBTV9QUk9GSUxFX19PV05FRF9SVUxFID0gQlJFQUtET1dOX0VMRU1FTlRfX09XTkVEX1JVTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFQU1fUFJPRklMRV9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBCUkVBS0RPV05fRUxFTUVOVF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURUFNX1BST0ZJTEVfX0JSSUVGX0RFU0NSSVBUSU9OID0gQlJFQUtET1dOX0VMRU1FTlRfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVBTV9QUk9GSUxFX19JRCA9IEJSRUFLRE9XTl9FTEVNRU5UX19JRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFQU1fUFJPRklMRV9fT1JERVJJTkdfR1VJREUgPSBCUkVBS0RPV05fRUxFTUVOVF9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURUFNX1BST0ZJTEVfX1BSRVNFTlRBVElPTl9OQU1FID0gQlJFQUtET1dOX0VMRU1FTlRfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURUFNX1BST0ZJTEVfX1NVUFBSRVNTRUQgPSBCUkVBS0RPV05fRUxFTUVOVF9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURUFNX1BST0ZJTEVfX1BSRVNFTlRBVElPTiA9IEJSRUFLRE9XTl9FTEVNRU5UX19QUkVTRU5UQVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RnVsZmlsbDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVBTV9QUk9GSUxFX19GVUxGSUxMID0gQlJFQUtET1dOX0VMRU1FTlRfX0ZVTEZJTEw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgQWJzdHJhY3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURUFNX1BST0ZJTEVfX0lTX0FCU1RSQUNUID0gQlJFQUtET1dOX0VMRU1FTlRfX0lTX0FCU1RSQUNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVBTV9QUk9GSUxFX19OT0RFSUNPTiA9IEJSRUFLRE9XTl9FTEVNRU5UX19OT0RFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TaGFwZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURUFNX1BST0ZJTEVfX1NIQVBFSUNPTiA9IEJSRUFLRE9XTl9FTEVNRU5UX19TSEFQRUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGVkIEFmdGVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVBTV9QUk9GSUxFX19QUkVTRU5URURfQUZURVIgPSBCUkVBS0RPV05fRUxFTUVOVF9fUFJFU0VOVEVEX0FGVEVSOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRlZCBCZWZvcmU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURUFNX1BST0ZJTEVfX1BSRVNFTlRFRF9CRUZPUkUgPSBCUkVBS0RPV05fRUxFTUVOVF9fUFJFU0VOVEVEX0JFRk9SRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QbGFubmluZyBEYXRhPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVBTV9QUk9GSUxFX19QTEFOTklOR19EQVRBID0gQlJFQUtET1dOX0VMRU1FTlRfX1BMQU5OSU5HX0RBVEE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwZXIgQWN0aXZpdHk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURUFNX1BST0ZJTEVfX1NVUEVSX0FDVElWSVRZID0gQlJFQUtET1dOX0VMRU1FTlRfX1NVUEVSX0FDVElWSVRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVBTV9QUk9GSUxFX19HUk9VUDEgPSBCUkVBS0RPV05fRUxFTUVOVF9fR1JPVVAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoZWNrbGlzdDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVBTV9QUk9GSUxFX19DSEVDS0xJU1QgPSBCUkVBS0RPV05fRUxFTUVOVF9fQ0hFQ0tMSVNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbmNlcHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFQU1fUFJPRklMRV9fQ09OQ0VQVCA9IEJSRUFLRE9XTl9FTEVNRU5UX19DT05DRVBUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4YW1wbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFQU1fUFJPRklMRV9fRVhBTVBMRSA9IEJSRUFLRE9XTl9FTEVNRU5UX19FWEFNUExFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWRlbGluZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVBTV9QUk9GSUxFX19HVUlERUxJTkUgPSBCUkVBS0RPV05fRUxFTUVOVF9fR1VJREVMSU5FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJldXNhYmxlIEFzc2V0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURUFNX1BST0ZJTEVfX1JFVVNBQkxFX0FTU0VUID0gQlJFQUtET1dOX0VMRU1FTlRfX1JFVVNBQkxFX0FTU0VUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHBvcnRpbmcgTWF0ZXJpYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFQU1fUFJPRklMRV9fU1VQUE9SVElOR19NQVRFUklBTCA9IEJSRUFLRE9XTl9FTEVNRU5UX19TVVBQT1JUSU5HX01BVEVSSUFMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldoaXRlcGFwZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFQU1fUFJPRklMRV9fV0hJVEVQQVBFUiA9IEJSRUFLRE9XTl9FTEVNRU5UX19XSElURVBBUEVSOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkhhcyBNdWx0aXBsZSBPY2N1cnJlbmNlczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFQU1fUFJPRklMRV9fSEFTX01VTFRJUExFX09DQ1VSUkVOQ0VTID0gQlJFQUtET1dOX0VMRU1FTlRfX0hBU19NVUxUSVBMRV9PQ0NVUlJFTkNFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBPcHRpb25hbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFQU1fUFJPRklMRV9fSVNfT1BUSU9OQUwgPSBCUkVBS0RPV05fRUxFTUVOVF9fSVNfT1BUSU9OQUw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgUGxhbm5lZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFQU1fUFJPRklMRV9fSVNfUExBTk5FRCA9IEJSRUFLRE9XTl9FTEVNRU5UX19JU19QTEFOTkVEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZWZpeDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFQU1fUFJPRklMRV9fUFJFRklYID0gQlJFQUtET1dOX0VMRU1FTlRfX1BSRUZJWDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFQU1fUFJPRklMRV9fR1JPVVAyID0gQlJFQUtET1dOX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Um9sZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVBTV9QUk9GSUxFX19ST0xFID0gQlJFQUtET1dOX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwZXIgVGVhbTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVBTV9QUk9GSUxFX19TVVBFUl9URUFNID0gQlJFQUtET1dOX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3ViIFRlYW08L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFQU1fUFJPRklMRV9fU1VCX1RFQU0gPSBCUkVBS0RPV05fRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMzsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5UZWFtIFByb2ZpbGU8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVBTV9QUk9GSUxFX0ZFQVRVUkVfQ09VTlQgPSBCUkVBS0RPV05fRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgNDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5UZW1wbGF0ZUltcGwgPGVtPlRlbXBsYXRlPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5UZW1wbGF0ZUltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0VGVtcGxhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgVEVNUExBVEUgPSA3NTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVNUExBVEVfX05BTUUgPSBHVUlEQU5DRV9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVNUExBVEVfX0dST1VQID0gR1VJREFOQ0VfX0dST1VQOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFTVBMQVRFX19PV05FRF9SVUxFID0gR1VJREFOQ0VfX09XTkVEX1JVTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFTVBMQVRFX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IEdVSURBTkNFX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFTVBMQVRFX19CUklFRl9ERVNDUklQVElPTiA9IEdVSURBTkNFX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFTVBMQVRFX19JRCA9IEdVSURBTkNFX19JRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFTVBMQVRFX19PUkRFUklOR19HVUlERSA9IEdVSURBTkNFX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFTVBMQVRFX19QUkVTRU5UQVRJT05fTkFNRSA9IEdVSURBTkNFX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVNUExBVEVfX1NVUFBSRVNTRUQgPSBHVUlEQU5DRV9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURU1QTEFURV9fUFJFU0VOVEFUSU9OID0gR1VJREFOQ0VfX1BSRVNFTlRBVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GdWxmaWxsPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURU1QTEFURV9fRlVMRklMTCA9IEdVSURBTkNFX19GVUxGSUxMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIEFic3RyYWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVNUExBVEVfX0lTX0FCU1RSQUNUID0gR1VJREFOQ0VfX0lTX0FCU1RSQUNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVNUExBVEVfX05PREVJQ09OID0gR1VJREFOQ0VfX05PREVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNoYXBlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFTVBMQVRFX19TSEFQRUlDT04gPSBHVUlEQU5DRV9fU0hBUEVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVNUExBVEVfX0dST1VQMSA9IEdVSURBTkNFX19HUk9VUDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hlY2tsaXN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURU1QTEFURV9fQ0hFQ0tMSVNUID0gR1VJREFOQ0VfX0NIRUNLTElTVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db25jZXB0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURU1QTEFURV9fQ09OQ0VQVCA9IEdVSURBTkNFX19DT05DRVBUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4YW1wbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFTVBMQVRFX19FWEFNUExFID0gR1VJREFOQ0VfX0VYQU1QTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZGVsaW5lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURU1QTEFURV9fR1VJREVMSU5FID0gR1VJREFOQ0VfX0dVSURFTElORTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXVzYWJsZSBBc3NldDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVNUExBVEVfX1JFVVNBQkxFX0FTU0VUID0gR1VJREFOQ0VfX1JFVVNBQkxFX0FTU0VUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHBvcnRpbmcgTWF0ZXJpYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFTVBMQVRFX19TVVBQT1JUSU5HX01BVEVSSUFMID0gR1VJREFOQ0VfX1NVUFBPUlRJTkdfTUFURVJJQUw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+V2hpdGVwYXBlcjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVNUExBVEVfX1dISVRFUEFQRVIgPSBHVUlEQU5DRV9fV0hJVEVQQVBFUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVNUExBVEVfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQgPSBHVUlEQU5DRV9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVNUExBVEVfX1ZBUklBQklMSVRZX1RZUEUgPSBHVUlEQU5DRV9fVkFSSUFCSUxJVFlfVFlQRTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5UZW1wbGF0ZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURU1QTEFURV9GRUFUVVJFX0NPVU5UID0gR1VJREFOQ0VfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVGVybURlZmluaXRpb25JbXBsIDxlbT5UZXJtIERlZmluaXRpb248L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlRlcm1EZWZpbml0aW9uSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRUZXJtRGVmaW5pdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBURVJNX0RFRklOSVRJT04gPSA3NjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVSTV9ERUZJTklUSU9OX19OQU1FID0gR1VJREFOQ0VfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXA8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFUk1fREVGSU5JVElPTl9fR1JPVVAgPSBHVUlEQU5DRV9fR1JPVVA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVSTV9ERUZJTklUSU9OX19PV05FRF9SVUxFID0gR1VJREFOQ0VfX09XTkVEX1JVTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFUk1fREVGSU5JVElPTl9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBHVUlEQU5DRV9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURVJNX0RFRklOSVRJT05fX0JSSUVGX0RFU0NSSVBUSU9OID0gR1VJREFOQ0VfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVSTV9ERUZJTklUSU9OX19JRCA9IEdVSURBTkNFX19JRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFUk1fREVGSU5JVElPTl9fT1JERVJJTkdfR1VJREUgPSBHVUlEQU5DRV9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURVJNX0RFRklOSVRJT05fX1BSRVNFTlRBVElPTl9OQU1FID0gR1VJREFOQ0VfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURVJNX0RFRklOSVRJT05fX1NVUFBSRVNTRUQgPSBHVUlEQU5DRV9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURVJNX0RFRklOSVRJT05fX1BSRVNFTlRBVElPTiA9IEdVSURBTkNFX19QUkVTRU5UQVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RnVsZmlsbDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVSTV9ERUZJTklUSU9OX19GVUxGSUxMID0gR1VJREFOQ0VfX0ZVTEZJTEw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgQWJzdHJhY3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURVJNX0RFRklOSVRJT05fX0lTX0FCU1RSQUNUID0gR1VJREFOQ0VfX0lTX0FCU1RSQUNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVSTV9ERUZJTklUSU9OX19OT0RFSUNPTiA9IEdVSURBTkNFX19OT0RFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TaGFwZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURVJNX0RFRklOSVRJT05fX1NIQVBFSUNPTiA9IEdVSURBTkNFX19TSEFQRUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAxPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURVJNX0RFRklOSVRJT05fX0dST1VQMSA9IEdVSURBTkNFX19HUk9VUDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hlY2tsaXN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURVJNX0RFRklOSVRJT05fX0NIRUNLTElTVCA9IEdVSURBTkNFX19DSEVDS0xJU1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29uY2VwdDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVSTV9ERUZJTklUSU9OX19DT05DRVBUID0gR1VJREFOQ0VfX0NPTkNFUFQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXhhbXBsZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVSTV9ERUZJTklUSU9OX19FWEFNUExFID0gR1VJREFOQ0VfX0VYQU1QTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZGVsaW5lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURVJNX0RFRklOSVRJT05fX0dVSURFTElORSA9IEdVSURBTkNFX19HVUlERUxJTkU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmV1c2FibGUgQXNzZXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFUk1fREVGSU5JVElPTl9fUkVVU0FCTEVfQVNTRVQgPSBHVUlEQU5DRV9fUkVVU0FCTEVfQVNTRVQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcG9ydGluZyBNYXRlcmlhbDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVSTV9ERUZJTklUSU9OX19TVVBQT1JUSU5HX01BVEVSSUFMID0gR1VJREFOQ0VfX1NVUFBPUlRJTkdfTUFURVJJQUw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+V2hpdGVwYXBlcjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVSTV9ERUZJTklUSU9OX19XSElURVBBUEVSID0gR1VJREFOQ0VfX1dISVRFUEFQRVI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFUk1fREVGSU5JVElPTl9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVCA9IEdVSURBTkNFX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURVJNX0RFRklOSVRJT05fX1ZBUklBQklMSVRZX1RZUEUgPSBHVUlEQU5DRV9fVkFSSUFCSUxJVFlfVFlQRTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5UZXJtIERlZmluaXRpb248L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVSTV9ERUZJTklUSU9OX0ZFQVRVUkVfQ09VTlQgPSBHVUlEQU5DRV9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Ub29sSW1wbCA8ZW0+VG9vbDwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVG9vbEltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0VG9vbCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBUT09MID0gNzc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRPT0xfX05BTUUgPSBDT05URU5UX0NBVEVHT1JZX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUT09MX19HUk9VUCA9IENPTlRFTlRfQ0FURUdPUllfX0dST1VQOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRPT0xfX09XTkVEX1JVTEUgPSBDT05URU5UX0NBVEVHT1JZX19PV05FRF9SVUxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUT09MX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IENPTlRFTlRfQ0FURUdPUllfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVE9PTF9fQlJJRUZfREVTQ1JJUFRJT04gPSBDT05URU5UX0NBVEVHT1JZX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRPT0xfX0lEID0gQ09OVEVOVF9DQVRFR09SWV9fSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUT09MX19PUkRFUklOR19HVUlERSA9IENPTlRFTlRfQ0FURUdPUllfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVE9PTF9fUFJFU0VOVEFUSU9OX05BTUUgPSBDT05URU5UX0NBVEVHT1JZX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVE9PTF9fU1VQUFJFU1NFRCA9IENPTlRFTlRfQ0FURUdPUllfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVE9PTF9fUFJFU0VOVEFUSU9OID0gQ09OVEVOVF9DQVRFR09SWV9fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZ1bGZpbGw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRPT0xfX0ZVTEZJTEwgPSBDT05URU5UX0NBVEVHT1JZX19GVUxGSUxMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIEFic3RyYWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVE9PTF9fSVNfQUJTVFJBQ1QgPSBDT05URU5UX0NBVEVHT1JZX19JU19BQlNUUkFDVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob2RlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRPT0xfX05PREVJQ09OID0gQ09OVEVOVF9DQVRFR09SWV9fTk9ERUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2hhcGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVE9PTF9fU0hBUEVJQ09OID0gQ09OVEVOVF9DQVRFR09SWV9fU0hBUEVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVE9PTF9fR1JPVVAxID0gQ09OVEVOVF9DQVRFR09SWV9fR1JPVVAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoZWNrbGlzdDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVE9PTF9fQ0hFQ0tMSVNUID0gQ09OVEVOVF9DQVRFR09SWV9fQ0hFQ0tMSVNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbmNlcHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRPT0xfX0NPTkNFUFQgPSBDT05URU5UX0NBVEVHT1JZX19DT05DRVBUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4YW1wbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRPT0xfX0VYQU1QTEUgPSBDT05URU5UX0NBVEVHT1JZX19FWEFNUExFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWRlbGluZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVE9PTF9fR1VJREVMSU5FID0gQ09OVEVOVF9DQVRFR09SWV9fR1VJREVMSU5FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJldXNhYmxlIEFzc2V0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUT09MX19SRVVTQUJMRV9BU1NFVCA9IENPTlRFTlRfQ0FURUdPUllfX1JFVVNBQkxFX0FTU0VUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHBvcnRpbmcgTWF0ZXJpYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRPT0xfX1NVUFBPUlRJTkdfTUFURVJJQUwgPSBDT05URU5UX0NBVEVHT1JZX19TVVBQT1JUSU5HX01BVEVSSUFMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldoaXRlcGFwZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRPT0xfX1dISVRFUEFQRVIgPSBDT05URU5UX0NBVEVHT1JZX19XSElURVBBUEVSOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUT09MX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UID0gQ09OVEVOVF9DQVRFR09SWV9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVE9PTF9fVkFSSUFCSUxJVFlfVFlQRSA9IENPTlRFTlRfQ0FURUdPUllfX1ZBUklBQklMSVRZX1RZUEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUT09MX19HUk9VUDIgPSBDT05URU5UX0NBVEVHT1JZX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRvb2wgTWVudG9yPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUT09MX19UT09MX01FTlRPUiA9IENPTlRFTlRfQ0FURUdPUllfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+VG9vbDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUT09MX0ZFQVRVUkVfQ09VTlQgPSBDT05URU5UX0NBVEVHT1JZX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlRvb2xNZW50b3JJbXBsIDxlbT5Ub29sIE1lbnRvcjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVG9vbE1lbnRvckltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0VG9vbE1lbnRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBUT09MX01FTlRPUiA9IDc4OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUT09MX01FTlRPUl9fTkFNRSA9IEdVSURBTkNFX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUT09MX01FTlRPUl9fR1JPVVAgPSBHVUlEQU5DRV9fR1JPVVA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVE9PTF9NRU5UT1JfX09XTkVEX1JVTEUgPSBHVUlEQU5DRV9fT1dORURfUlVMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVE9PTF9NRU5UT1JfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gR1VJREFOQ0VfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVE9PTF9NRU5UT1JfX0JSSUVGX0RFU0NSSVBUSU9OID0gR1VJREFOQ0VfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVE9PTF9NRU5UT1JfX0lEID0gR1VJREFOQ0VfX0lEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVE9PTF9NRU5UT1JfX09SREVSSU5HX0dVSURFID0gR1VJREFOQ0VfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVE9PTF9NRU5UT1JfX1BSRVNFTlRBVElPTl9OQU1FID0gR1VJREFOQ0VfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUT09MX01FTlRPUl9fU1VQUFJFU1NFRCA9IEdVSURBTkNFX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRPT0xfTUVOVE9SX19QUkVTRU5UQVRJT04gPSBHVUlEQU5DRV9fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZ1bGZpbGw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRPT0xfTUVOVE9SX19GVUxGSUxMID0gR1VJREFOQ0VfX0ZVTEZJTEw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgQWJzdHJhY3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUT09MX01FTlRPUl9fSVNfQUJTVFJBQ1QgPSBHVUlEQU5DRV9fSVNfQUJTVFJBQ1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm9kZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUT09MX01FTlRPUl9fTk9ERUlDT04gPSBHVUlEQU5DRV9fTk9ERUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2hhcGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVE9PTF9NRU5UT1JfX1NIQVBFSUNPTiA9IEdVSURBTkNFX19TSEFQRUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAxPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUT09MX01FTlRPUl9fR1JPVVAxID0gR1VJREFOQ0VfX0dST1VQMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGVja2xpc3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRPT0xfTUVOVE9SX19DSEVDS0xJU1QgPSBHVUlEQU5DRV9fQ0hFQ0tMSVNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbmNlcHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRPT0xfTUVOVE9SX19DT05DRVBUID0gR1VJREFOQ0VfX0NPTkNFUFQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXhhbXBsZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVE9PTF9NRU5UT1JfX0VYQU1QTEUgPSBHVUlEQU5DRV9fRVhBTVBMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkZWxpbmU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRPT0xfTUVOVE9SX19HVUlERUxJTkUgPSBHVUlEQU5DRV9fR1VJREVMSU5FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJldXNhYmxlIEFzc2V0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUT09MX01FTlRPUl9fUkVVU0FCTEVfQVNTRVQgPSBHVUlEQU5DRV9fUkVVU0FCTEVfQVNTRVQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcG9ydGluZyBNYXRlcmlhbDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVE9PTF9NRU5UT1JfX1NVUFBPUlRJTkdfTUFURVJJQUwgPSBHVUlEQU5DRV9fU1VQUE9SVElOR19NQVRFUklBTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5XaGl0ZXBhcGVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUT09MX01FTlRPUl9fV0hJVEVQQVBFUiA9IEdVSURBTkNFX19XSElURVBBUEVSOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUT09MX01FTlRPUl9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVCA9IEdVSURBTkNFX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUT09MX01FTlRPUl9fVkFSSUFCSUxJVFlfVFlQRSA9IEdVSURBTkNFX19WQVJJQUJJTElUWV9UWVBFOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlRvb2wgTWVudG9yPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRPT0xfTUVOVE9SX0ZFQVRVUkVfQ09VTlQgPSBHVUlEQU5DRV9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5XaGl0ZXBhcGVySW1wbCA8ZW0+V2hpdGVwYXBlcjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuV2hpdGVwYXBlckltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0V2hpdGVwYXBlcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBXSElURVBBUEVSID0gNzk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdISVRFUEFQRVJfX05BTUUgPSBDT05DRVBUX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXSElURVBBUEVSX19HUk9VUCA9IENPTkNFUFRfX0dST1VQOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdISVRFUEFQRVJfX09XTkVEX1JVTEUgPSBDT05DRVBUX19PV05FRF9SVUxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXSElURVBBUEVSX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IENPTkNFUFRfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV0hJVEVQQVBFUl9fQlJJRUZfREVTQ1JJUFRJT04gPSBDT05DRVBUX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdISVRFUEFQRVJfX0lEID0gQ09OQ0VQVF9fSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXSElURVBBUEVSX19PUkRFUklOR19HVUlERSA9IENPTkNFUFRfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV0hJVEVQQVBFUl9fUFJFU0VOVEFUSU9OX05BTUUgPSBDT05DRVBUX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV0hJVEVQQVBFUl9fU1VQUFJFU1NFRCA9IENPTkNFUFRfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV0hJVEVQQVBFUl9fUFJFU0VOVEFUSU9OID0gQ09OQ0VQVF9fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZ1bGZpbGw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdISVRFUEFQRVJfX0ZVTEZJTEwgPSBDT05DRVBUX19GVUxGSUxMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIEFic3RyYWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV0hJVEVQQVBFUl9fSVNfQUJTVFJBQ1QgPSBDT05DRVBUX19JU19BQlNUUkFDVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob2RlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdISVRFUEFQRVJfX05PREVJQ09OID0gQ09OQ0VQVF9fTk9ERUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2hhcGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV0hJVEVQQVBFUl9fU0hBUEVJQ09OID0gQ09OQ0VQVF9fU0hBUEVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV0hJVEVQQVBFUl9fR1JPVVAxID0gQ09OQ0VQVF9fR1JPVVAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoZWNrbGlzdDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV0hJVEVQQVBFUl9fQ0hFQ0tMSVNUID0gQ09OQ0VQVF9fQ0hFQ0tMSVNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbmNlcHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdISVRFUEFQRVJfX0NPTkNFUFQgPSBDT05DRVBUX19DT05DRVBUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4YW1wbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdISVRFUEFQRVJfX0VYQU1QTEUgPSBDT05DRVBUX19FWEFNUExFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWRlbGluZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV0hJVEVQQVBFUl9fR1VJREVMSU5FID0gQ09OQ0VQVF9fR1VJREVMSU5FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJldXNhYmxlIEFzc2V0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXSElURVBBUEVSX19SRVVTQUJMRV9BU1NFVCA9IENPTkNFUFRfX1JFVVNBQkxFX0FTU0VUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHBvcnRpbmcgTWF0ZXJpYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdISVRFUEFQRVJfX1NVUFBPUlRJTkdfTUFURVJJQUwgPSBDT05DRVBUX19TVVBQT1JUSU5HX01BVEVSSUFMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldoaXRlcGFwZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdISVRFUEFQRVJfX1dISVRFUEFQRVIgPSBDT05DRVBUX19XSElURVBBUEVSOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXSElURVBBUEVSX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UID0gQ09OQ0VQVF9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV0hJVEVQQVBFUl9fVkFSSUFCSUxJVFlfVFlQRSA9IENPTkNFUFRfX1ZBUklBQklMSVRZX1RZUEU7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+V2hpdGVwYXBlcjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXSElURVBBUEVSX0ZFQVRVUkVfQ09VTlQgPSBDT05DRVBUX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLldvcmtEZWZpbml0aW9uSW1wbCA8ZW0+V29yayBEZWZpbml0aW9uPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Xb3JrRGVmaW5pdGlvbkltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0V29ya0RlZmluaXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgV09SS19ERUZJTklUSU9OID0gODE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfREVGSU5JVElPTl9fTkFNRSA9IE1FVEhPRF9FTEVNRU5UX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX0RFRklOSVRJT05fX0dST1VQID0gTUVUSE9EX0VMRU1FTlRfX0dST1VQOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfREVGSU5JVElPTl9fT1dORURfUlVMRSA9IE1FVEhPRF9FTEVNRU5UX19PV05FRF9SVUxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX0RFRklOSVRJT05fX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gTUVUSE9EX0VMRU1FTlRfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19ERUZJTklUSU9OX19CUklFRl9ERVNDUklQVElPTiA9IE1FVEhPRF9FTEVNRU5UX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfREVGSU5JVElPTl9fSUQgPSBNRVRIT0RfRUxFTUVOVF9fSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX0RFRklOSVRJT05fX09SREVSSU5HX0dVSURFID0gTUVUSE9EX0VMRU1FTlRfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19ERUZJTklUSU9OX19QUkVTRU5UQVRJT05fTkFNRSA9IE1FVEhPRF9FTEVNRU5UX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19ERUZJTklUSU9OX19TVVBQUkVTU0VEID0gTUVUSE9EX0VMRU1FTlRfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlY29uZGl0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19ERUZJTklUSU9OX19QUkVDT05ESVRJT04gPSBNRVRIT0RfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qb3N0Y29uZGl0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19ERUZJTklUSU9OX19QT1NUQ09ORElUSU9OID0gTUVUSE9EX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+V29yayBEZWZpbml0aW9uPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfREVGSU5JVElPTl9GRUFUVVJFX0NPVU5UID0gTUVUSE9EX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuV29ya09yZGVySW1wbCA8ZW0+V29yayBPcmRlcjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuV29ya09yZGVySW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRXb3JrT3JkZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgV09SS19PUkRFUiA9IDgyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19PUkRFUl9fVkFMVUUgPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19PUkRFUl9fSUQgPSAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxpbmsgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfT1JERVJfX0xJTktfVFlQRSA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+V29yayBPcmRlcjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX09SREVSX0ZFQVRVUkVfQ09VTlQgPSAzOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLldvcmtQcm9kdWN0RGVzY3JpcHRvckltcGwgPGVtPldvcmsgUHJvZHVjdCBEZXNjcmlwdG9yPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Xb3JrUHJvZHVjdERlc2NyaXB0b3JJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFdvcmtQcm9kdWN0RGVzY3JpcHRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUiA9IDg1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fTkFNRSA9IERFU0NSSVBUT1JfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXA8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVE9SX19HUk9VUCA9IERFU0NSSVBUT1JfX0dST1VQOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVE9SX19PV05FRF9SVUxFID0gREVTQ1JJUFRPUl9fT1dORURfUlVMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gREVTQ1JJUFRPUl9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fQlJJRUZfREVTQ1JJUFRJT04gPSBERVNDUklQVE9SX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVE9SX19JRCA9IERFU0NSSVBUT1JfX0lEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX09SREVSSU5HX0dVSURFID0gREVTQ1JJUFRPUl9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fUFJFU0VOVEFUSU9OX05BTUUgPSBERVNDUklQVE9SX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX1NVUFBSRVNTRUQgPSBERVNDUklQVE9SX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVE9SX19QUkVTRU5UQVRJT04gPSBERVNDUklQVE9SX19QUkVTRU5UQVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RnVsZmlsbDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0ZVTEZJTEwgPSBERVNDUklQVE9SX19GVUxGSUxMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIEFic3RyYWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0lTX0FCU1RSQUNUID0gREVTQ1JJUFRPUl9fSVNfQUJTVFJBQ1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm9kZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fTk9ERUlDT04gPSBERVNDUklQVE9SX19OT0RFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TaGFwZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fU0hBUEVJQ09OID0gREVTQ1JJUFRPUl9fU0hBUEVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRlZCBBZnRlcjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVE9SX19QUkVTRU5URURfQUZURVIgPSBERVNDUklQVE9SX19QUkVTRU5URURfQUZURVI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGVkIEJlZm9yZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVE9SX19QUkVTRU5URURfQkVGT1JFID0gREVTQ1JJUFRPUl9fUFJFU0VOVEVEX0JFRk9SRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QbGFubmluZyBEYXRhPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX1BMQU5OSU5HX0RBVEEgPSBERVNDUklQVE9SX19QTEFOTklOR19EQVRBOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cGVyIEFjdGl2aXR5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX1NVUEVSX0FDVElWSVRZID0gREVTQ1JJUFRPUl9fU1VQRVJfQUNUSVZJVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAxPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fR1JPVVAxID0gREVTQ1JJUFRPUl9fR1JPVVAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoZWNrbGlzdDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0NIRUNLTElTVCA9IERFU0NSSVBUT1JfX0NIRUNLTElTVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db25jZXB0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fQ09OQ0VQVCA9IERFU0NSSVBUT1JfX0NPTkNFUFQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXhhbXBsZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0VYQU1QTEUgPSBERVNDUklQVE9SX19FWEFNUExFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWRlbGluZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0dVSURFTElORSA9IERFU0NSSVBUT1JfX0dVSURFTElORTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXVzYWJsZSBBc3NldDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX1JFVVNBQkxFX0FTU0VUID0gREVTQ1JJUFRPUl9fUkVVU0FCTEVfQVNTRVQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcG9ydGluZyBNYXRlcmlhbDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX1NVUFBPUlRJTkdfTUFURVJJQUwgPSBERVNDUklQVE9SX19TVVBQT1JUSU5HX01BVEVSSUFMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldoaXRlcGFwZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVE9SX19XSElURVBBUEVSID0gREVTQ1JJUFRPUl9fV0hJVEVQQVBFUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5IYXMgTXVsdGlwbGUgT2NjdXJyZW5jZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fSEFTX01VTFRJUExFX09DQ1VSUkVOQ0VTID0gREVTQ1JJUFRPUl9fSEFTX01VTFRJUExFX09DQ1VSUkVOQ0VTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIE9wdGlvbmFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0lTX09QVElPTkFMID0gREVTQ1JJUFRPUl9fSVNfT1BUSU9OQUw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgUGxhbm5lZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVE9SX19JU19QTEFOTkVEID0gREVTQ1JJUFRPUl9fSVNfUExBTk5FRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVmaXg8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fUFJFRklYID0gREVTQ1JJUFRPUl9fUFJFRklYOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIFN5bmNocm9uaXplZCBXaXRoIFNvdXJjZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVE9SX19JU19TWU5DSFJPTklaRURfV0lUSF9TT1VSQ0UgPSBERVNDUklQVE9SX19JU19TWU5DSFJPTklaRURfV0lUSF9TT1VSQ0U7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+V29yayBQcm9kdWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX1dPUktfUFJPRFVDVCA9IERFU0NSSVBUT1JfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVzcG9uc2libGUgUm9sZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVE9SX19SRVNQT05TSUJMRV9ST0xFID0gREVTQ1JJUFRPUl9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVE9SX19HUk9VUDIgPSBERVNDUklQVE9SX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4dGVybmFsIElucHV0IFRvPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fRVhURVJOQUxfSU5QVVRfVE8gPSBERVNDUklQVE9SX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkltcGFjdGVkIEJ5PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fSU1QQUNURURfQlkgPSBERVNDUklQVE9SX0ZFQVRVUkVfQ09VTlQgKyA0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkltcGFjdHM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVE9SX19JTVBBQ1RTID0gREVTQ1JJUFRPUl9GRUFUVVJFX0NPVU5UICsgNTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYW5kYXRvcnkgSW5wdXQgVG88L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVE9SX19NQU5EQVRPUllfSU5QVVRfVE8gPSBERVNDUklQVE9SX0ZFQVRVUkVfQ09VTlQgKyA2OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9wdGlvbmFsIElucHV0IFRvPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fT1BUSU9OQUxfSU5QVVRfVE8gPSBERVNDUklQVE9SX0ZFQVRVUkVfQ09VTlQgKyA3OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk91dHB1dCBGcm9tPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fT1VUUFVUX0ZST00gPSBERVNDUklQVE9SX0ZFQVRVUkVfQ09VTlQgKyA4OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlbGl2ZXJhYmxlIFBhcnRzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fREVMSVZFUkFCTEVfUEFSVFMgPSBERVNDUklQVE9SX0ZFQVRVUkVfQ09VTlQgKyA5OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFjdGl2aXR5IEVudHJ5IFN0YXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0FDVElWSVRZX0VOVFJZX1NUQVRFID0gREVTQ1JJUFRPUl9GRUFUVVJFX0NPVU5UICsgMTA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWN0aXZpdHkgRXhpdCBTdGF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVE9SX19BQ1RJVklUWV9FWElUX1NUQVRFID0gREVTQ1JJUFRPUl9GRUFUVVJFX0NPVU5UICsgMTE7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+V29yayBQcm9kdWN0IERlc2NyaXB0b3I8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfRkVBVFVSRV9DT1VOVCA9IERFU0NSSVBUT1JfRkVBVFVSRV9DT1VOVCArIDEyOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLldvcmtQcm9kdWN0VHlwZUltcGwgPGVtPldvcmsgUHJvZHVjdCBUeXBlPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Xb3JrUHJvZHVjdFR5cGVJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFdvcmtQcm9kdWN0VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfVFlQRSA9IDg2OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfVFlQRV9fTkFNRSA9IENPTlRFTlRfQ0FURUdPUllfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXA8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9UWVBFX19HUk9VUCA9IENPTlRFTlRfQ0FURUdPUllfX0dST1VQOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9UWVBFX19PV05FRF9SVUxFID0gQ09OVEVOVF9DQVRFR09SWV9fT1dORURfUlVMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX1RZUEVfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gQ09OVEVOVF9DQVRFR09SWV9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfVFlQRV9fQlJJRUZfREVTQ1JJUFRJT04gPSBDT05URU5UX0NBVEVHT1JZX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9UWVBFX19JRCA9IENPTlRFTlRfQ0FURUdPUllfX0lEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX1RZUEVfX09SREVSSU5HX0dVSURFID0gQ09OVEVOVF9DQVRFR09SWV9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfVFlQRV9fUFJFU0VOVEFUSU9OX05BTUUgPSBDT05URU5UX0NBVEVHT1JZX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX1RZUEVfX1NVUFBSRVNTRUQgPSBDT05URU5UX0NBVEVHT1JZX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9UWVBFX19QUkVTRU5UQVRJT04gPSBDT05URU5UX0NBVEVHT1JZX19QUkVTRU5UQVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RnVsZmlsbDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX1RZUEVfX0ZVTEZJTEwgPSBDT05URU5UX0NBVEVHT1JZX19GVUxGSUxMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIEFic3RyYWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX1RZUEVfX0lTX0FCU1RSQUNUID0gQ09OVEVOVF9DQVRFR09SWV9fSVNfQUJTVFJBQ1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm9kZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfVFlQRV9fTk9ERUlDT04gPSBDT05URU5UX0NBVEVHT1JZX19OT0RFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TaGFwZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfVFlQRV9fU0hBUEVJQ09OID0gQ09OVEVOVF9DQVRFR09SWV9fU0hBUEVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX1RZUEVfX0dST1VQMSA9IENPTlRFTlRfQ0FURUdPUllfX0dST1VQMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGVja2xpc3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9UWVBFX19DSEVDS0xJU1QgPSBDT05URU5UX0NBVEVHT1JZX19DSEVDS0xJU1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29uY2VwdDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX1RZUEVfX0NPTkNFUFQgPSBDT05URU5UX0NBVEVHT1JZX19DT05DRVBUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4YW1wbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9UWVBFX19FWEFNUExFID0gQ09OVEVOVF9DQVRFR09SWV9fRVhBTVBMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkZWxpbmU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9UWVBFX19HVUlERUxJTkUgPSBDT05URU5UX0NBVEVHT1JZX19HVUlERUxJTkU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmV1c2FibGUgQXNzZXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9UWVBFX19SRVVTQUJMRV9BU1NFVCA9IENPTlRFTlRfQ0FURUdPUllfX1JFVVNBQkxFX0FTU0VUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHBvcnRpbmcgTWF0ZXJpYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9UWVBFX19TVVBQT1JUSU5HX01BVEVSSUFMID0gQ09OVEVOVF9DQVRFR09SWV9fU1VQUE9SVElOR19NQVRFUklBTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5XaGl0ZXBhcGVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfVFlQRV9fV0hJVEVQQVBFUiA9IENPTlRFTlRfQ0FURUdPUllfX1dISVRFUEFQRVI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9UWVBFX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UID0gQ09OVEVOVF9DQVRFR09SWV9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX1RZUEVfX1ZBUklBQklMSVRZX1RZUEUgPSBDT05URU5UX0NBVEVHT1JZX19WQVJJQUJJTElUWV9UWVBFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX1RZUEVfX0dST1VQMiA9IENPTlRFTlRfQ0FURUdPUllfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+V29yayBQcm9kdWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfVFlQRV9fV09SS19QUk9EVUNUID0gQ09OVEVOVF9DQVRFR09SWV9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Xb3JrIFByb2R1Y3QgVHlwZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfVFlQRV9GRUFUVVJFX0NPVU5UID0gQ09OVEVOVF9DQVRFR09SWV9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVmFyaWFiaWxpdHlUeXBlIDxlbT5WYXJpYWJpbGl0eSBUeXBlPC9lbT59JyBlbnVtLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5WYXJpYWJpbGl0eVR5cGUKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0VmFyaWFiaWxpdHlUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFZBUklBQklMSVRZX1RZUEUgPSA4NzsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya09yZGVyVHlwZSA8ZW0+V29yayBPcmRlciBUeXBlPC9lbT59JyBlbnVtLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrT3JkZXJUeXBlCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFdvcmtPcmRlclR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgV09SS19PUkRFUl9UWVBFID0gODg7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPlZhcmlhYmlsaXR5IFR5cGUgT2JqZWN0PC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVmFyaWFiaWxpdHlUeXBlCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFZhcmlhYmlsaXR5VHlwZU9iamVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBWQVJJQUJJTElUWV9UWVBFX09CSkVDVCA9IDg5OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5Xb3JrIE9yZGVyIFR5cGUgT2JqZWN0PC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya09yZGVyVHlwZQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRXb3JrT3JkZXJUeXBlT2JqZWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFdPUktfT1JERVJfVFlQRV9PQkpFQ1QgPSA5MDsKLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQWN0aXZpdHkgPGVtPkFjdGl2aXR5PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkFjdGl2aXR5PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQWN0aXZpdHkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldEFjdGl2aXR5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFjdGl2aXR5I2dldFByZWNvbmRpdGlvbiA8ZW0+UHJlY29uZGl0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UHJlY29uZGl0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQWN0aXZpdHkjZ2V0UHJlY29uZGl0aW9uKCkKLQkgKiBAc2VlICNnZXRBY3Rpdml0eSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QWN0aXZpdHlfUHJlY29uZGl0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFjdGl2aXR5I2dldFBvc3Rjb25kaXRpb24gPGVtPlBvc3Rjb25kaXRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Qb3N0Y29uZGl0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQWN0aXZpdHkjZ2V0UG9zdGNvbmRpdGlvbigpCi0JICogQHNlZSAjZ2V0QWN0aXZpdHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEFjdGl2aXR5X1Bvc3Rjb25kaXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5BY3Rpdml0eSNnZXRHcm91cDMgPGVtPkdyb3VwMzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+R3JvdXAzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQWN0aXZpdHkjZ2V0R3JvdXAzKCkKLQkgKiBAc2VlICNnZXRBY3Rpdml0eSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QWN0aXZpdHlfR3JvdXAzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQWN0aXZpdHkjZ2V0QnJlYWtkb3duRWxlbWVudCA8ZW0+QnJlYWtkb3duIEVsZW1lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkJyZWFrZG93biBFbGVtZW50PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQWN0aXZpdHkjZ2V0QnJlYWtkb3duRWxlbWVudCgpCi0JICogQHNlZSAjZ2V0QWN0aXZpdHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldEFjdGl2aXR5X0JyZWFrZG93bkVsZW1lbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5BY3Rpdml0eSNnZXRSb2FkbWFwIDxlbT5Sb2FkbWFwPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5Sb2FkbWFwPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQWN0aXZpdHkjZ2V0Um9hZG1hcCgpCi0JICogQHNlZSAjZ2V0QWN0aXZpdHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEFjdGl2aXR5X1JvYWRtYXAoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQWN0aXZpdHkjaXNJc0VuYWN0YWJsZSA8ZW0+SXMgRW5hY3RhYmxlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SXMgRW5hY3RhYmxlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQWN0aXZpdHkjaXNJc0VuYWN0YWJsZSgpCi0JICogQHNlZSAjZ2V0QWN0aXZpdHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEFjdGl2aXR5X0lzRW5hY3RhYmxlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFjdGl2aXR5I2dldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQgPGVtPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQWN0aXZpdHkjZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpCi0JICogQHNlZSAjZ2V0QWN0aXZpdHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEFjdGl2aXR5X1ZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQWN0aXZpdHkjZ2V0VmFyaWFiaWxpdHlUeXBlIDxlbT5WYXJpYWJpbGl0eSBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VmFyaWFiaWxpdHkgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFjdGl2aXR5I2dldFZhcmlhYmlsaXR5VHlwZSgpCi0JICogQHNlZSAjZ2V0QWN0aXZpdHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEFjdGl2aXR5X1ZhcmlhYmlsaXR5VHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQWN0aXZpdHlEZXNjcmlwdGlvbiA8ZW0+QWN0aXZpdHkgRGVzY3JpcHRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+QWN0aXZpdHkgRGVzY3JpcHRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5BY3Rpdml0eURlc2NyaXB0aW9uCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRBY3Rpdml0eURlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFjdGl2aXR5RGVzY3JpcHRpb24jZ2V0QWx0ZXJuYXRpdmVzIDxlbT5BbHRlcm5hdGl2ZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5BbHRlcm5hdGl2ZXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5BY3Rpdml0eURlc2NyaXB0aW9uI2dldEFsdGVybmF0aXZlcygpCi0JICogQHNlZSAjZ2V0QWN0aXZpdHlEZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QWN0aXZpdHlEZXNjcmlwdGlvbl9BbHRlcm5hdGl2ZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQWN0aXZpdHlEZXNjcmlwdGlvbiNnZXRIb3dUb1N0YWZmIDxlbT5Ib3cgVG8gU3RhZmY8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Ib3cgVG8gU3RhZmY8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5BY3Rpdml0eURlc2NyaXB0aW9uI2dldEhvd1RvU3RhZmYoKQotCSAqIEBzZWUgI2dldEFjdGl2aXR5RGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEFjdGl2aXR5RGVzY3JpcHRpb25fSG93VG9TdGFmZigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5BY3Rpdml0eURlc2NyaXB0aW9uI2dldFB1cnBvc2UgPGVtPlB1cnBvc2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5QdXJwb3NlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQWN0aXZpdHlEZXNjcmlwdGlvbiNnZXRQdXJwb3NlKCkKLQkgKiBAc2VlICNnZXRBY3Rpdml0eURlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRBY3Rpdml0eURlc2NyaXB0aW9uX1B1cnBvc2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvIDxlbT5BcHBsaWNhYmxlIE1ldGEgQ2xhc3MgSW5mbzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5BcHBsaWNhYmxlIE1ldGEgQ2xhc3MgSW5mbzwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRBcHBsaWNhYmxlTWV0YUNsYXNzSW5mbygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5BcHBsaWNhYmxlTWV0YUNsYXNzSW5mbyNpc0lzUHJpbWFyeUV4dGVuc2lvbiA8ZW0+SXMgUHJpbWFyeSBFeHRlbnNpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5JcyBQcmltYXJ5IEV4dGVuc2lvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvI2lzSXNQcmltYXJ5RXh0ZW5zaW9uKCkKLQkgKiBAc2VlICNnZXRBcHBsaWNhYmxlTWV0YUNsYXNzSW5mbygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QXBwbGljYWJsZU1ldGFDbGFzc0luZm9fSXNQcmltYXJ5RXh0ZW5zaW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5BcnRpZmFjdCA8ZW0+QXJ0aWZhY3Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+QXJ0aWZhY3Q8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5BcnRpZmFjdAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0QXJ0aWZhY3QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5BcnRpZmFjdCNnZXRHcm91cDMgPGVtPkdyb3VwMzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+R3JvdXAzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQXJ0aWZhY3QjZ2V0R3JvdXAzKCkKLQkgKiBAc2VlICNnZXRBcnRpZmFjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QXJ0aWZhY3RfR3JvdXAzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQXJ0aWZhY3QjZ2V0Q29udGFpbmVkQXJ0aWZhY3QgPGVtPkNvbnRhaW5lZCBBcnRpZmFjdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+Q29udGFpbmVkIEFydGlmYWN0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQXJ0aWZhY3QjZ2V0Q29udGFpbmVkQXJ0aWZhY3QoKQotCSAqIEBzZWUgI2dldEFydGlmYWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRBcnRpZmFjdF9Db250YWluZWRBcnRpZmFjdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQXJ0aWZhY3REZXNjcmlwdGlvbiA8ZW0+QXJ0aWZhY3QgRGVzY3JpcHRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+QXJ0aWZhY3QgRGVzY3JpcHRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5BcnRpZmFjdERlc2NyaXB0aW9uCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRBcnRpZmFjdERlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFydGlmYWN0RGVzY3JpcHRpb24jZ2V0QnJpZWZPdXRsaW5lIDxlbT5CcmllZiBPdXRsaW5lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+QnJpZWYgT3V0bGluZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFydGlmYWN0RGVzY3JpcHRpb24jZ2V0QnJpZWZPdXRsaW5lKCkKLQkgKiBAc2VlICNnZXRBcnRpZmFjdERlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRBcnRpZmFjdERlc2NyaXB0aW9uX0JyaWVmT3V0bGluZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5BcnRpZmFjdERlc2NyaXB0aW9uI2dldFJlcHJlc2VudGF0aW9uT3B0aW9ucyA8ZW0+UmVwcmVzZW50YXRpb24gT3B0aW9uczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlJlcHJlc2VudGF0aW9uIE9wdGlvbnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5BcnRpZmFjdERlc2NyaXB0aW9uI2dldFJlcHJlc2VudGF0aW9uT3B0aW9ucygpCi0JICogQHNlZSAjZ2V0QXJ0aWZhY3REZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QXJ0aWZhY3REZXNjcmlwdGlvbl9SZXByZXNlbnRhdGlvbk9wdGlvbnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQXJ0aWZhY3REZXNjcmlwdGlvbiNnZXRSZXByZXNlbnRhdGlvbiA8ZW0+UmVwcmVzZW50YXRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5SZXByZXNlbnRhdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFydGlmYWN0RGVzY3JpcHRpb24jZ2V0UmVwcmVzZW50YXRpb24oKQotCSAqIEBzZWUgI2dldEFydGlmYWN0RGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEFydGlmYWN0RGVzY3JpcHRpb25fUmVwcmVzZW50YXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQXJ0aWZhY3REZXNjcmlwdGlvbiNnZXROb3RhdGlvbiA8ZW0+Tm90YXRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Ob3RhdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFydGlmYWN0RGVzY3JpcHRpb24jZ2V0Tm90YXRpb24oKQotCSAqIEBzZWUgI2dldEFydGlmYWN0RGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEFydGlmYWN0RGVzY3JpcHRpb25fTm90YXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkJyZWFrZG93bkVsZW1lbnQgPGVtPkJyZWFrZG93biBFbGVtZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkJyZWFrZG93biBFbGVtZW50PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQnJlYWtkb3duRWxlbWVudAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0QnJlYWtkb3duRWxlbWVudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5CcmVha2Rvd25FbGVtZW50I2dldFByZXNlbnRlZEFmdGVyIDxlbT5QcmVzZW50ZWQgQWZ0ZXI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5QcmVzZW50ZWQgQWZ0ZXI8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5CcmVha2Rvd25FbGVtZW50I2dldFByZXNlbnRlZEFmdGVyKCkKLQkgKiBAc2VlICNnZXRCcmVha2Rvd25FbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRCcmVha2Rvd25FbGVtZW50X1ByZXNlbnRlZEFmdGVyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkJyZWFrZG93bkVsZW1lbnQjZ2V0UHJlc2VudGVkQmVmb3JlIDxlbT5QcmVzZW50ZWQgQmVmb3JlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UHJlc2VudGVkIEJlZm9yZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkJyZWFrZG93bkVsZW1lbnQjZ2V0UHJlc2VudGVkQmVmb3JlKCkKLQkgKiBAc2VlICNnZXRCcmVha2Rvd25FbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRCcmVha2Rvd25FbGVtZW50X1ByZXNlbnRlZEJlZm9yZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5CcmVha2Rvd25FbGVtZW50I2dldFBsYW5uaW5nRGF0YSA8ZW0+UGxhbm5pbmcgRGF0YTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlBsYW5uaW5nIERhdGE8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5CcmVha2Rvd25FbGVtZW50I2dldFBsYW5uaW5nRGF0YSgpCi0JICogQHNlZSAjZ2V0QnJlYWtkb3duRWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QnJlYWtkb3duRWxlbWVudF9QbGFubmluZ0RhdGEoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQnJlYWtkb3duRWxlbWVudCNnZXRTdXBlckFjdGl2aXR5IDxlbT5TdXBlciBBY3Rpdml0eTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlN1cGVyIEFjdGl2aXR5PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQnJlYWtkb3duRWxlbWVudCNnZXRTdXBlckFjdGl2aXR5KCkKLQkgKiBAc2VlICNnZXRCcmVha2Rvd25FbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRCcmVha2Rvd25FbGVtZW50X1N1cGVyQWN0aXZpdHkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5CcmVha2Rvd25FbGVtZW50I2dldEdyb3VwMSA8ZW0+R3JvdXAxPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5Hcm91cDE8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5CcmVha2Rvd25FbGVtZW50I2dldEdyb3VwMSgpCi0JICogQHNlZSAjZ2V0QnJlYWtkb3duRWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QnJlYWtkb3duRWxlbWVudF9Hcm91cDEoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5CcmVha2Rvd25FbGVtZW50I2dldENoZWNrbGlzdCA8ZW0+Q2hlY2tsaXN0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5DaGVja2xpc3Q8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5CcmVha2Rvd25FbGVtZW50I2dldENoZWNrbGlzdCgpCi0JICogQHNlZSAjZ2V0QnJlYWtkb3duRWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QnJlYWtkb3duRWxlbWVudF9DaGVja2xpc3QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5CcmVha2Rvd25FbGVtZW50I2dldENvbmNlcHQgPGVtPkNvbmNlcHQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPkNvbmNlcHQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5CcmVha2Rvd25FbGVtZW50I2dldENvbmNlcHQoKQotCSAqIEBzZWUgI2dldEJyZWFrZG93bkVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEJyZWFrZG93bkVsZW1lbnRfQ29uY2VwdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkJyZWFrZG93bkVsZW1lbnQjZ2V0RXhhbXBsZSA8ZW0+RXhhbXBsZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+RXhhbXBsZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkJyZWFrZG93bkVsZW1lbnQjZ2V0RXhhbXBsZSgpCi0JICogQHNlZSAjZ2V0QnJlYWtkb3duRWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QnJlYWtkb3duRWxlbWVudF9FeGFtcGxlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQnJlYWtkb3duRWxlbWVudCNnZXRHdWlkZWxpbmUgPGVtPkd1aWRlbGluZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+R3VpZGVsaW5lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQnJlYWtkb3duRWxlbWVudCNnZXRHdWlkZWxpbmUoKQotCSAqIEBzZWUgI2dldEJyZWFrZG93bkVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEJyZWFrZG93bkVsZW1lbnRfR3VpZGVsaW5lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQnJlYWtkb3duRWxlbWVudCNnZXRSZXVzYWJsZUFzc2V0IDxlbT5SZXVzYWJsZSBBc3NldDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+UmV1c2FibGUgQXNzZXQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5CcmVha2Rvd25FbGVtZW50I2dldFJldXNhYmxlQXNzZXQoKQotCSAqIEBzZWUgI2dldEJyZWFrZG93bkVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEJyZWFrZG93bkVsZW1lbnRfUmV1c2FibGVBc3NldCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkJyZWFrZG93bkVsZW1lbnQjZ2V0U3VwcG9ydGluZ01hdGVyaWFsIDxlbT5TdXBwb3J0aW5nIE1hdGVyaWFsPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5TdXBwb3J0aW5nIE1hdGVyaWFsPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQnJlYWtkb3duRWxlbWVudCNnZXRTdXBwb3J0aW5nTWF0ZXJpYWwoKQotCSAqIEBzZWUgI2dldEJyZWFrZG93bkVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEJyZWFrZG93bkVsZW1lbnRfU3VwcG9ydGluZ01hdGVyaWFsKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQnJlYWtkb3duRWxlbWVudCNnZXRXaGl0ZXBhcGVyIDxlbT5XaGl0ZXBhcGVyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5XaGl0ZXBhcGVyPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQnJlYWtkb3duRWxlbWVudCNnZXRXaGl0ZXBhcGVyKCkKLQkgKiBAc2VlICNnZXRCcmVha2Rvd25FbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRCcmVha2Rvd25FbGVtZW50X1doaXRlcGFwZXIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQnJlYWtkb3duRWxlbWVudCNpc0hhc011bHRpcGxlT2NjdXJyZW5jZXMgPGVtPkhhcyBNdWx0aXBsZSBPY2N1cnJlbmNlczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkhhcyBNdWx0aXBsZSBPY2N1cnJlbmNlczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkJyZWFrZG93bkVsZW1lbnQjaXNIYXNNdWx0aXBsZU9jY3VycmVuY2VzKCkKLQkgKiBAc2VlICNnZXRCcmVha2Rvd25FbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRCcmVha2Rvd25FbGVtZW50X0hhc011bHRpcGxlT2NjdXJyZW5jZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQnJlYWtkb3duRWxlbWVudCNpc0lzT3B0aW9uYWwgPGVtPklzIE9wdGlvbmFsPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SXMgT3B0aW9uYWw8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5CcmVha2Rvd25FbGVtZW50I2lzSXNPcHRpb25hbCgpCi0JICogQHNlZSAjZ2V0QnJlYWtkb3duRWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QnJlYWtkb3duRWxlbWVudF9Jc09wdGlvbmFsKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkJyZWFrZG93bkVsZW1lbnQjaXNJc1BsYW5uZWQgPGVtPklzIFBsYW5uZWQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5JcyBQbGFubmVkPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQnJlYWtkb3duRWxlbWVudCNpc0lzUGxhbm5lZCgpCi0JICogQHNlZSAjZ2V0QnJlYWtkb3duRWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QnJlYWtkb3duRWxlbWVudF9Jc1BsYW5uZWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQnJlYWtkb3duRWxlbWVudCNnZXRQcmVmaXggPGVtPlByZWZpeDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlByZWZpeDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkJyZWFrZG93bkVsZW1lbnQjZ2V0UHJlZml4KCkKLQkgKiBAc2VlICNnZXRCcmVha2Rvd25FbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRCcmVha2Rvd25FbGVtZW50X1ByZWZpeCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uIDxlbT5CcmVha2Rvd24gRWxlbWVudCBEZXNjcmlwdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5CcmVha2Rvd24gRWxlbWVudCBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0QnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbiNnZXRVc2FnZUd1aWRhbmNlIDxlbT5Vc2FnZSBHdWlkYW5jZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlVzYWdlIEd1aWRhbmNlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uI2dldFVzYWdlR3VpZGFuY2UoKQotCSAqIEBzZWUgI2dldEJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uX1VzYWdlR3VpZGFuY2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNhcGFiaWxpdHlQYXR0ZXJuIDxlbT5DYXBhYmlsaXR5IFBhdHRlcm48L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+Q2FwYWJpbGl0eSBQYXR0ZXJuPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ2FwYWJpbGl0eVBhdHRlcm4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldENhcGFiaWxpdHlQYXR0ZXJuKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5DaGVja2xpc3QgPGVtPkNoZWNrbGlzdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5DaGVja2xpc3Q8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5DaGVja2xpc3QKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldENoZWNrbGlzdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29tcG9zaXRlUm9sZSA8ZW0+Q29tcG9zaXRlIFJvbGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+Q29tcG9zaXRlIFJvbGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db21wb3NpdGVSb2xlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRDb21wb3NpdGVSb2xlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29tcG9zaXRlUm9sZSNnZXRHcm91cDIgPGVtPkdyb3VwMjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+R3JvdXAyPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29tcG9zaXRlUm9sZSNnZXRHcm91cDIoKQotCSAqIEBzZWUgI2dldENvbXBvc2l0ZVJvbGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldENvbXBvc2l0ZVJvbGVfR3JvdXAyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29tcG9zaXRlUm9sZSNnZXRBZ2dyZWdhdGVkUm9sZSA8ZW0+QWdncmVnYXRlZCBSb2xlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5BZ2dyZWdhdGVkIFJvbGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db21wb3NpdGVSb2xlI2dldEFnZ3JlZ2F0ZWRSb2xlKCkKLQkgKiBAc2VlICNnZXRDb21wb3NpdGVSb2xlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRDb21wb3NpdGVSb2xlX0FnZ3JlZ2F0ZWRSb2xlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db25jZXB0IDxlbT5Db25jZXB0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkNvbmNlcHQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db25jZXB0Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRDb25jZXB0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db25zdHJhaW50IDxlbT5Db25zdHJhaW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkNvbnN0cmFpbnQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db25zdHJhaW50Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRDb25zdHJhaW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnN0cmFpbnQjZ2V0TWFpbkRlc2NyaXB0aW9uIDxlbT5NYWluIERlc2NyaXB0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TWFpbiBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnN0cmFpbnQjZ2V0TWFpbkRlc2NyaXB0aW9uKCkKLQkgKiBAc2VlICNnZXRDb25zdHJhaW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRDb25zdHJhaW50X01haW5EZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudENhdGVnb3J5IDxlbT5Db250ZW50IENhdGVnb3J5PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkNvbnRlbnQgQ2F0ZWdvcnk8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db250ZW50Q2F0ZWdvcnkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldENvbnRlbnRDYXRlZ29yeSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudENhdGVnb3J5UGFja2FnZSA8ZW0+Q29udGVudCBDYXRlZ29yeSBQYWNrYWdlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkNvbnRlbnQgQ2F0ZWdvcnkgUGFja2FnZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnRDYXRlZ29yeVBhY2thZ2UKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldENvbnRlbnRDYXRlZ29yeVBhY2thZ2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db250ZW50Q2F0ZWdvcnlQYWNrYWdlI2dldEdyb3VwMiA8ZW0+R3JvdXAyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5Hcm91cDI8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db250ZW50Q2F0ZWdvcnlQYWNrYWdlI2dldEdyb3VwMigpCi0JICogQHNlZSAjZ2V0Q29udGVudENhdGVnb3J5UGFja2FnZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0Q29udGVudENhdGVnb3J5UGFja2FnZV9Hcm91cDIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db250ZW50Q2F0ZWdvcnlQYWNrYWdlI2dldENvbnRlbnRDYXRlZ29yeSA8ZW0+Q29udGVudCBDYXRlZ29yeTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+Q29udGVudCBDYXRlZ29yeTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnRDYXRlZ29yeVBhY2thZ2UjZ2V0Q29udGVudENhdGVnb3J5KCkKLQkgKiBAc2VlICNnZXRDb250ZW50Q2F0ZWdvcnlQYWNrYWdlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRDb250ZW50Q2F0ZWdvcnlQYWNrYWdlX0NvbnRlbnRDYXRlZ29yeSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudERlc2NyaXB0aW9uIDxlbT5Db250ZW50IERlc2NyaXB0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkNvbnRlbnQgRGVzY3JpcHRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db250ZW50RGVzY3JpcHRpb24KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldENvbnRlbnREZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db250ZW50RGVzY3JpcHRpb24jZ2V0TWFpbkRlc2NyaXB0aW9uIDxlbT5NYWluIERlc2NyaXB0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TWFpbiBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnREZXNjcmlwdGlvbiNnZXRNYWluRGVzY3JpcHRpb24oKQotCSAqIEBzZWUgI2dldENvbnRlbnREZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0Q29udGVudERlc2NyaXB0aW9uX01haW5EZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db250ZW50RGVzY3JpcHRpb24jZ2V0S2V5Q29uc2lkZXJhdGlvbnMgPGVtPktleSBDb25zaWRlcmF0aW9uczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPktleSBDb25zaWRlcmF0aW9uczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnREZXNjcmlwdGlvbiNnZXRLZXlDb25zaWRlcmF0aW9ucygpCi0JICogQHNlZSAjZ2V0Q29udGVudERlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRDb250ZW50RGVzY3JpcHRpb25fS2V5Q29uc2lkZXJhdGlvbnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db250ZW50RGVzY3JpcHRpb24jZ2V0U2VjdGlvbiA8ZW0+U2VjdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+U2VjdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnREZXNjcmlwdGlvbiNnZXRTZWN0aW9uKCkKLQkgKiBAc2VlICNnZXRDb250ZW50RGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldENvbnRlbnREZXNjcmlwdGlvbl9TZWN0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnREZXNjcmlwdGlvbiNnZXRFeHRlcm5hbElkIDxlbT5FeHRlcm5hbCBJZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkV4dGVybmFsIElkPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudERlc2NyaXB0aW9uI2dldEV4dGVybmFsSWQoKQotCSAqIEBzZWUgI2dldENvbnRlbnREZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0Q29udGVudERlc2NyaXB0aW9uX0V4dGVybmFsSWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnRFbGVtZW50IDxlbT5Db250ZW50IEVsZW1lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+Q29udGVudCBFbGVtZW50PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudEVsZW1lbnQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldENvbnRlbnRFbGVtZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudEVsZW1lbnQjZ2V0R3JvdXAxIDxlbT5Hcm91cDE8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPkdyb3VwMTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnRFbGVtZW50I2dldEdyb3VwMSgpCi0JICogQHNlZSAjZ2V0Q29udGVudEVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldENvbnRlbnRFbGVtZW50X0dyb3VwMSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnRFbGVtZW50I2dldENoZWNrbGlzdCA8ZW0+Q2hlY2tsaXN0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5DaGVja2xpc3Q8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db250ZW50RWxlbWVudCNnZXRDaGVja2xpc3QoKQotCSAqIEBzZWUgI2dldENvbnRlbnRFbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRDb250ZW50RWxlbWVudF9DaGVja2xpc3QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db250ZW50RWxlbWVudCNnZXRDb25jZXB0IDxlbT5Db25jZXB0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5Db25jZXB0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudEVsZW1lbnQjZ2V0Q29uY2VwdCgpCi0JICogQHNlZSAjZ2V0Q29udGVudEVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldENvbnRlbnRFbGVtZW50X0NvbmNlcHQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db250ZW50RWxlbWVudCNnZXRFeGFtcGxlIDxlbT5FeGFtcGxlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5FeGFtcGxlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudEVsZW1lbnQjZ2V0RXhhbXBsZSgpCi0JICogQHNlZSAjZ2V0Q29udGVudEVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldENvbnRlbnRFbGVtZW50X0V4YW1wbGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db250ZW50RWxlbWVudCNnZXRHdWlkZWxpbmUgPGVtPkd1aWRlbGluZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+R3VpZGVsaW5lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudEVsZW1lbnQjZ2V0R3VpZGVsaW5lKCkKLQkgKiBAc2VlICNnZXRDb250ZW50RWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0Q29udGVudEVsZW1lbnRfR3VpZGVsaW5lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudEVsZW1lbnQjZ2V0UmV1c2FibGVBc3NldCA8ZW0+UmV1c2FibGUgQXNzZXQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPlJldXNhYmxlIEFzc2V0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudEVsZW1lbnQjZ2V0UmV1c2FibGVBc3NldCgpCi0JICogQHNlZSAjZ2V0Q29udGVudEVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldENvbnRlbnRFbGVtZW50X1JldXNhYmxlQXNzZXQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db250ZW50RWxlbWVudCNnZXRTdXBwb3J0aW5nTWF0ZXJpYWwgPGVtPlN1cHBvcnRpbmcgTWF0ZXJpYWw8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPlN1cHBvcnRpbmcgTWF0ZXJpYWw8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db250ZW50RWxlbWVudCNnZXRTdXBwb3J0aW5nTWF0ZXJpYWwoKQotCSAqIEBzZWUgI2dldENvbnRlbnRFbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRDb250ZW50RWxlbWVudF9TdXBwb3J0aW5nTWF0ZXJpYWwoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db250ZW50RWxlbWVudCNnZXRXaGl0ZXBhcGVyIDxlbT5XaGl0ZXBhcGVyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5XaGl0ZXBhcGVyPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudEVsZW1lbnQjZ2V0V2hpdGVwYXBlcigpCi0JICogQHNlZSAjZ2V0Q29udGVudEVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldENvbnRlbnRFbGVtZW50X1doaXRlcGFwZXIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudEVsZW1lbnQjZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCA8ZW0+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db250ZW50RWxlbWVudCNnZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkKLQkgKiBAc2VlICNnZXRDb250ZW50RWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0Q29udGVudEVsZW1lbnRfVmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db250ZW50RWxlbWVudCNnZXRWYXJpYWJpbGl0eVR5cGUgPGVtPlZhcmlhYmlsaXR5IFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5WYXJpYWJpbGl0eSBUeXBlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudEVsZW1lbnQjZ2V0VmFyaWFiaWxpdHlUeXBlKCkKLQkgKiBAc2VlICNnZXRDb250ZW50RWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0Q29udGVudEVsZW1lbnRfVmFyaWFiaWxpdHlUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db250ZW50UGFja2FnZSA8ZW0+Q29udGVudCBQYWNrYWdlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkNvbnRlbnQgUGFja2FnZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnRQYWNrYWdlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRDb250ZW50UGFja2FnZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnRQYWNrYWdlI2dldEdyb3VwMiA8ZW0+R3JvdXAyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5Hcm91cDI8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db250ZW50UGFja2FnZSNnZXRHcm91cDIoKQotCSAqIEBzZWUgI2dldENvbnRlbnRQYWNrYWdlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRDb250ZW50UGFja2FnZV9Hcm91cDIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db250ZW50UGFja2FnZSNnZXRDb250ZW50RWxlbWVudCA8ZW0+Q29udGVudCBFbGVtZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5Db250ZW50IEVsZW1lbnQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db250ZW50UGFja2FnZSNnZXRDb250ZW50RWxlbWVudCgpCi0JICogQHNlZSAjZ2V0Q29udGVudFBhY2thZ2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldENvbnRlbnRQYWNrYWdlX0NvbnRlbnRFbGVtZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5DdXN0b21DYXRlZ29yeSA8ZW0+Q3VzdG9tIENhdGVnb3J5PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkN1c3RvbSBDYXRlZ29yeTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkN1c3RvbUNhdGVnb3J5Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRDdXN0b21DYXRlZ29yeSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkN1c3RvbUNhdGVnb3J5I2dldEdyb3VwMiA8ZW0+R3JvdXAyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5Hcm91cDI8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5DdXN0b21DYXRlZ29yeSNnZXRHcm91cDIoKQotCSAqIEBzZWUgI2dldEN1c3RvbUNhdGVnb3J5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRDdXN0b21DYXRlZ29yeV9Hcm91cDIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5DdXN0b21DYXRlZ29yeSNnZXRDYXRlZ29yaXplZEVsZW1lbnQgPGVtPkNhdGVnb3JpemVkIEVsZW1lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPkNhdGVnb3JpemVkIEVsZW1lbnQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5DdXN0b21DYXRlZ29yeSNnZXRDYXRlZ29yaXplZEVsZW1lbnQoKQotCSAqIEBzZWUgI2dldEN1c3RvbUNhdGVnb3J5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRDdXN0b21DYXRlZ29yeV9DYXRlZ29yaXplZEVsZW1lbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5DdXN0b21DYXRlZ29yeSNnZXRTdWJDYXRlZ29yeSA8ZW0+U3ViIENhdGVnb3J5PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5TdWIgQ2F0ZWdvcnk8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5DdXN0b21DYXRlZ29yeSNnZXRTdWJDYXRlZ29yeSgpCi0JICogQHNlZSAjZ2V0Q3VzdG9tQ2F0ZWdvcnkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEN1c3RvbUNhdGVnb3J5X1N1YkNhdGVnb3J5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZWxpdmVyYWJsZSA8ZW0+RGVsaXZlcmFibGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+RGVsaXZlcmFibGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZWxpdmVyYWJsZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0RGVsaXZlcmFibGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZWxpdmVyYWJsZSNnZXRHcm91cDMgPGVtPkdyb3VwMzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+R3JvdXAzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVsaXZlcmFibGUjZ2V0R3JvdXAzKCkKLQkgKiBAc2VlICNnZXREZWxpdmVyYWJsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RGVsaXZlcmFibGVfR3JvdXAzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVsaXZlcmFibGUjZ2V0RGVsaXZlcmVkV29ya1Byb2R1Y3QgPGVtPkRlbGl2ZXJlZCBXb3JrIFByb2R1Y3Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPkRlbGl2ZXJlZCBXb3JrIFByb2R1Y3Q8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZWxpdmVyYWJsZSNnZXREZWxpdmVyZWRXb3JrUHJvZHVjdCgpCi0JICogQHNlZSAjZ2V0RGVsaXZlcmFibGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldERlbGl2ZXJhYmxlX0RlbGl2ZXJlZFdvcmtQcm9kdWN0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZWxpdmVyYWJsZURlc2NyaXB0aW9uIDxlbT5EZWxpdmVyYWJsZSBEZXNjcmlwdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5EZWxpdmVyYWJsZSBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlbGl2ZXJhYmxlRGVzY3JpcHRpb24KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldERlbGl2ZXJhYmxlRGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVsaXZlcmFibGVEZXNjcmlwdGlvbiNnZXRFeHRlcm5hbERlc2NyaXB0aW9uIDxlbT5FeHRlcm5hbCBEZXNjcmlwdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkV4dGVybmFsIERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVsaXZlcmFibGVEZXNjcmlwdGlvbiNnZXRFeHRlcm5hbERlc2NyaXB0aW9uKCkKLQkgKiBAc2VlICNnZXREZWxpdmVyYWJsZURlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXREZWxpdmVyYWJsZURlc2NyaXB0aW9uX0V4dGVybmFsRGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVsaXZlcmFibGVEZXNjcmlwdGlvbiNnZXRQYWNrYWdpbmdHdWlkYW5jZSA8ZW0+UGFja2FnaW5nIEd1aWRhbmNlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UGFja2FnaW5nIEd1aWRhbmNlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVsaXZlcmFibGVEZXNjcmlwdGlvbiNnZXRQYWNrYWdpbmdHdWlkYW5jZSgpCi0JICogQHNlZSAjZ2V0RGVsaXZlcmFibGVEZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RGVsaXZlcmFibGVEZXNjcmlwdGlvbl9QYWNrYWdpbmdHdWlkYW5jZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVsaXZlcnlQcm9jZXNzIDxlbT5EZWxpdmVyeSBQcm9jZXNzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkRlbGl2ZXJ5IFByb2Nlc3M8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZWxpdmVyeVByb2Nlc3MKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldERlbGl2ZXJ5UHJvY2VzcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlbGl2ZXJ5UHJvY2VzcyNnZXRHcm91cDQgPGVtPkdyb3VwNDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+R3JvdXA0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVsaXZlcnlQcm9jZXNzI2dldEdyb3VwNCgpCi0JICogQHNlZSAjZ2V0RGVsaXZlcnlQcm9jZXNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXREZWxpdmVyeVByb2Nlc3NfR3JvdXA0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVsaXZlcnlQcm9jZXNzI2dldENvbW11bmljYXRpb25zTWF0ZXJpYWwgPGVtPkNvbW11bmljYXRpb25zIE1hdGVyaWFsPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5Db21tdW5pY2F0aW9ucyBNYXRlcmlhbDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlbGl2ZXJ5UHJvY2VzcyNnZXRDb21tdW5pY2F0aW9uc01hdGVyaWFsKCkKLQkgKiBAc2VlICNnZXREZWxpdmVyeVByb2Nlc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldERlbGl2ZXJ5UHJvY2Vzc19Db21tdW5pY2F0aW9uc01hdGVyaWFsKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVsaXZlcnlQcm9jZXNzI2dldEVkdWNhdGlvbk1hdGVyaWFsIDxlbT5FZHVjYXRpb24gTWF0ZXJpYWw8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPkVkdWNhdGlvbiBNYXRlcmlhbDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlbGl2ZXJ5UHJvY2VzcyNnZXRFZHVjYXRpb25NYXRlcmlhbCgpCi0JICogQHNlZSAjZ2V0RGVsaXZlcnlQcm9jZXNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXREZWxpdmVyeVByb2Nlc3NfRWR1Y2F0aW9uTWF0ZXJpYWwoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uIDxlbT5EZWxpdmVyeSBQcm9jZXNzIERlc2NyaXB0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkRlbGl2ZXJ5IFByb2Nlc3MgRGVzY3JpcHRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24jZ2V0U2NhbGUgPGVtPlNjYWxlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+U2NhbGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbiNnZXRTY2FsZSgpCi0JICogQHNlZSAjZ2V0RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX1NjYWxlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uI2dldFByb2plY3RDaGFyYWN0ZXJpc3RpY3MgPGVtPlByb2plY3QgQ2hhcmFjdGVyaXN0aWNzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UHJvamVjdCBDaGFyYWN0ZXJpc3RpY3M8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbiNnZXRQcm9qZWN0Q2hhcmFjdGVyaXN0aWNzKCkKLQkgKiBAc2VlICNnZXREZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fUHJvamVjdENoYXJhY3RlcmlzdGljcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbiNnZXRSaXNrTGV2ZWwgPGVtPlJpc2sgTGV2ZWw8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5SaXNrIExldmVsPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24jZ2V0Umlza0xldmVsKCkKLQkgKiBAc2VlICNnZXREZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fUmlza0xldmVsKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uI2dldEVzdGltYXRpbmdUZWNobmlxdWUgPGVtPkVzdGltYXRpbmcgVGVjaG5pcXVlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RXN0aW1hdGluZyBUZWNobmlxdWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbiNnZXRFc3RpbWF0aW5nVGVjaG5pcXVlKCkKLQkgKiBAc2VlICNnZXREZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fRXN0aW1hdGluZ1RlY2huaXF1ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbiNnZXRQcm9qZWN0TWVtYmVyRXhwZXJ0aXNlIDxlbT5Qcm9qZWN0IE1lbWJlciBFeHBlcnRpc2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Qcm9qZWN0IE1lbWJlciBFeHBlcnRpc2U8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbiNnZXRQcm9qZWN0TWVtYmVyRXhwZXJ0aXNlKCkKLQkgKiBAc2VlICNnZXREZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fUHJvamVjdE1lbWJlckV4cGVydGlzZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbiNnZXRUeXBlT2ZDb250cmFjdCA8ZW0+VHlwZSBPZiBDb250cmFjdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlR5cGUgT2YgQ29udHJhY3Q8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbiNnZXRUeXBlT2ZDb250cmFjdCgpCi0JICogQHNlZSAjZ2V0RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX1R5cGVPZkNvbnRyYWN0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZXNjcmliYWJsZUVsZW1lbnQgPGVtPkRlc2NyaWJhYmxlIEVsZW1lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+RGVzY3JpYmFibGUgRWxlbWVudDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlc2NyaWJhYmxlRWxlbWVudAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0RGVzY3JpYmFibGVFbGVtZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlc2NyaWJhYmxlRWxlbWVudCNnZXRQcmVzZW50YXRpb24gPGVtPlByZXNlbnRhdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPlByZXNlbnRhdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlc2NyaWJhYmxlRWxlbWVudCNnZXRQcmVzZW50YXRpb24oKQotCSAqIEBzZWUgI2dldERlc2NyaWJhYmxlRWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0RGVzY3JpYmFibGVFbGVtZW50X1ByZXNlbnRhdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlc2NyaWJhYmxlRWxlbWVudCNnZXRGdWxmaWxsIDxlbT5GdWxmaWxsPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5GdWxmaWxsPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVzY3JpYmFibGVFbGVtZW50I2dldEZ1bGZpbGwoKQotCSAqIEBzZWUgI2dldERlc2NyaWJhYmxlRWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RGVzY3JpYmFibGVFbGVtZW50X0Z1bGZpbGwoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVzY3JpYmFibGVFbGVtZW50I2lzSXNBYnN0cmFjdCA8ZW0+SXMgQWJzdHJhY3Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5JcyBBYnN0cmFjdDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlc2NyaWJhYmxlRWxlbWVudCNpc0lzQWJzdHJhY3QoKQotCSAqIEBzZWUgI2dldERlc2NyaWJhYmxlRWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RGVzY3JpYmFibGVFbGVtZW50X0lzQWJzdHJhY3QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVzY3JpYmFibGVFbGVtZW50I2dldE5vZGVpY29uIDxlbT5Ob2RlaWNvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk5vZGVpY29uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVzY3JpYmFibGVFbGVtZW50I2dldE5vZGVpY29uKCkKLQkgKiBAc2VlICNnZXREZXNjcmliYWJsZUVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldERlc2NyaWJhYmxlRWxlbWVudF9Ob2RlaWNvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZXNjcmliYWJsZUVsZW1lbnQjZ2V0U2hhcGVpY29uIDxlbT5TaGFwZWljb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5TaGFwZWljb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZXNjcmliYWJsZUVsZW1lbnQjZ2V0U2hhcGVpY29uKCkKLQkgKiBAc2VlICNnZXREZXNjcmliYWJsZUVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldERlc2NyaWJhYmxlRWxlbWVudF9TaGFwZWljb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlc2NyaXB0b3IgPGVtPkRlc2NyaXB0b3I8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+RGVzY3JpcHRvcjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlc2NyaXB0b3IKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldERlc2NyaXB0b3IoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVzY3JpcHRvciNpc0lzU3luY2hyb25pemVkV2l0aFNvdXJjZSA8ZW0+SXMgU3luY2hyb25pemVkIFdpdGggU291cmNlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SXMgU3luY2hyb25pemVkIFdpdGggU291cmNlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVzY3JpcHRvciNpc0lzU3luY2hyb25pemVkV2l0aFNvdXJjZSgpCi0JICogQHNlZSAjZ2V0RGVzY3JpcHRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RGVzY3JpcHRvcl9Jc1N5bmNocm9uaXplZFdpdGhTb3VyY2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlc2NyaXB0b3JEZXNjcmlwdGlvbiA8ZW0+RGVzY3JpcHRvciBEZXNjcmlwdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5EZXNjcmlwdG9yIERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVzY3JpcHRvckRlc2NyaXB0aW9uCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXREZXNjcmlwdG9yRGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVzY3JpcHRvckRlc2NyaXB0aW9uI2dldFJlZmluZWREZXNjcmlwdGlvbiA8ZW0+UmVmaW5lZCBEZXNjcmlwdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlJlZmluZWQgRGVzY3JpcHRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZXNjcmlwdG9yRGVzY3JpcHRpb24jZ2V0UmVmaW5lZERlc2NyaXB0aW9uKCkKLQkgKiBAc2VlICNnZXREZXNjcmlwdG9yRGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldERlc2NyaXB0b3JEZXNjcmlwdGlvbl9SZWZpbmVkRGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRpc2NpcGxpbmUgPGVtPkRpc2NpcGxpbmU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+RGlzY2lwbGluZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRpc2NpcGxpbmUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldERpc2NpcGxpbmUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EaXNjaXBsaW5lI2dldEdyb3VwMiA8ZW0+R3JvdXAyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5Hcm91cDI8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EaXNjaXBsaW5lI2dldEdyb3VwMigpCi0JICogQHNlZSAjZ2V0RGlzY2lwbGluZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RGlzY2lwbGluZV9Hcm91cDIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EaXNjaXBsaW5lI2dldFRhc2sgPGVtPlRhc2s8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPlRhc2s8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EaXNjaXBsaW5lI2dldFRhc2soKQotCSAqIEBzZWUgI2dldERpc2NpcGxpbmUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldERpc2NpcGxpbmVfVGFzaygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRpc2NpcGxpbmUjZ2V0U3ViRGlzY2lwbGluZSA8ZW0+U3ViIERpc2NpcGxpbmU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPlN1YiBEaXNjaXBsaW5lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGlzY2lwbGluZSNnZXRTdWJEaXNjaXBsaW5lKCkKLQkgKiBAc2VlICNnZXREaXNjaXBsaW5lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXREaXNjaXBsaW5lX1N1YkRpc2NpcGxpbmUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EaXNjaXBsaW5lI2dldFJlZmVyZW5jZVdvcmtmbG93IDxlbT5SZWZlcmVuY2UgV29ya2Zsb3c8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPlJlZmVyZW5jZSBXb3JrZmxvdzwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRpc2NpcGxpbmUjZ2V0UmVmZXJlbmNlV29ya2Zsb3coKQotCSAqIEBzZWUgI2dldERpc2NpcGxpbmUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldERpc2NpcGxpbmVfUmVmZXJlbmNlV29ya2Zsb3coKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRpc2NpcGxpbmVHcm91cGluZyA8ZW0+RGlzY2lwbGluZSBHcm91cGluZzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5EaXNjaXBsaW5lIEdyb3VwaW5nPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGlzY2lwbGluZUdyb3VwaW5nCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXREaXNjaXBsaW5lR3JvdXBpbmcoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EaXNjaXBsaW5lR3JvdXBpbmcjZ2V0R3JvdXAyIDxlbT5Hcm91cDI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPkdyb3VwMjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRpc2NpcGxpbmVHcm91cGluZyNnZXRHcm91cDIoKQotCSAqIEBzZWUgI2dldERpc2NpcGxpbmVHcm91cGluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RGlzY2lwbGluZUdyb3VwaW5nX0dyb3VwMigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRpc2NpcGxpbmVHcm91cGluZyNnZXREaXNjaXBsaW5lIDxlbT5EaXNjaXBsaW5lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5EaXNjaXBsaW5lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGlzY2lwbGluZUdyb3VwaW5nI2dldERpc2NpcGxpbmUoKQotCSAqIEBzZWUgI2dldERpc2NpcGxpbmVHcm91cGluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RGlzY2lwbGluZUdyb3VwaW5nX0Rpc2NpcGxpbmUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRvY3VtZW50Um9vdCA8ZW0+RG9jdW1lbnQgUm9vdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Eb2N1bWVudCBSb290PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRG9jdW1lbnRSb290Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXREb2N1bWVudFJvb3QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Eb2N1bWVudFJvb3QjZ2V0TWl4ZWQgPGVtPk1peGVkPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5NaXhlZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRvY3VtZW50Um9vdCNnZXRNaXhlZCgpCi0JICogQHNlZSAjZ2V0RG9jdW1lbnRSb290KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXREb2N1bWVudFJvb3RfTWl4ZWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgbWFwICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRG9jdW1lbnRSb290I2dldFhNTE5TUHJlZml4TWFwIDxlbT5YTUxOUyBQcmVmaXggTWFwPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgbWFwICc8ZW0+WE1MTlMgUHJlZml4IE1hcDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRvY3VtZW50Um9vdCNnZXRYTUxOU1ByZWZpeE1hcCgpCi0JICogQHNlZSAjZ2V0RG9jdW1lbnRSb290KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXREb2N1bWVudFJvb3RfWE1MTlNQcmVmaXhNYXAoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgbWFwICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRG9jdW1lbnRSb290I2dldFhTSVNjaGVtYUxvY2F0aW9uIDxlbT5YU0kgU2NoZW1hIExvY2F0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgbWFwICc8ZW0+WFNJIFNjaGVtYSBMb2NhdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRvY3VtZW50Um9vdCNnZXRYU0lTY2hlbWFMb2NhdGlvbigpCi0JICogQHNlZSAjZ2V0RG9jdW1lbnRSb290KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXREb2N1bWVudFJvb3RfWFNJU2NoZW1hTG9jYXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRG9jdW1lbnRSb290I2dldE1ldGhvZENvbmZpZ3VyYXRpb24gPGVtPk1ldGhvZCBDb25maWd1cmF0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+TWV0aG9kIENvbmZpZ3VyYXRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Eb2N1bWVudFJvb3QjZ2V0TWV0aG9kQ29uZmlndXJhdGlvbigpCi0JICogQHNlZSAjZ2V0RG9jdW1lbnRSb290KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXREb2N1bWVudFJvb3RfTWV0aG9kQ29uZmlndXJhdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Eb2N1bWVudFJvb3QjZ2V0TWV0aG9kTGlicmFyeSA8ZW0+TWV0aG9kIExpYnJhcnk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5NZXRob2QgTGlicmFyeTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRvY3VtZW50Um9vdCNnZXRNZXRob2RMaWJyYXJ5KCkKLQkgKiBAc2VlICNnZXREb2N1bWVudFJvb3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldERvY3VtZW50Um9vdF9NZXRob2RMaWJyYXJ5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRvY3VtZW50Um9vdCNnZXRNZXRob2RQbHVnaW4gPGVtPk1ldGhvZCBQbHVnaW48L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5NZXRob2QgUGx1Z2luPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRG9jdW1lbnRSb290I2dldE1ldGhvZFBsdWdpbigpCi0JICogQHNlZSAjZ2V0RG9jdW1lbnRSb290KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXREb2N1bWVudFJvb3RfTWV0aG9kUGx1Z2luKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Eb21haW4gPGVtPkRvbWFpbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Eb21haW48L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Eb21haW4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldERvbWFpbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRvbWFpbiNnZXRHcm91cDIgPGVtPkdyb3VwMjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+R3JvdXAyPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRG9tYWluI2dldEdyb3VwMigpCi0JICogQHNlZSAjZ2V0RG9tYWluKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXREb21haW5fR3JvdXAyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRG9tYWluI2dldFdvcmtQcm9kdWN0IDxlbT5Xb3JrIFByb2R1Y3Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPldvcmsgUHJvZHVjdDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRvbWFpbiNnZXRXb3JrUHJvZHVjdCgpCi0JICogQHNlZSAjZ2V0RG9tYWluKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXREb21haW5fV29ya1Byb2R1Y3QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Eb21haW4jZ2V0U3ViZG9tYWluIDxlbT5TdWJkb21haW48L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPlN1YmRvbWFpbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRvbWFpbiNnZXRTdWJkb21haW4oKQotCSAqIEBzZWUgI2dldERvbWFpbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0RG9tYWluX1N1YmRvbWFpbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRWxlbWVudCA8ZW0+RWxlbWVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5FbGVtZW50PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRWxlbWVudAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0RWxlbWVudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRXN0aW1hdGUgPGVtPkVzdGltYXRlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkVzdGltYXRlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRXN0aW1hdGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldEVzdGltYXRlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRXN0aW1hdGUjZ2V0R3JvdXAyIDxlbT5Hcm91cDI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPkdyb3VwMjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkVzdGltYXRlI2dldEdyb3VwMigpCi0JICogQHNlZSAjZ2V0RXN0aW1hdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEVzdGltYXRlX0dyb3VwMigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkVzdGltYXRlI2dldEVzdGltYXRpb25NZXRyaWMgPGVtPkVzdGltYXRpb24gTWV0cmljPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5Fc3RpbWF0aW9uIE1ldHJpYzwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkVzdGltYXRlI2dldEVzdGltYXRpb25NZXRyaWMoKQotCSAqIEBzZWUgI2dldEVzdGltYXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRFc3RpbWF0ZV9Fc3RpbWF0aW9uTWV0cmljKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRXN0aW1hdGUjZ2V0RXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIDxlbT5Fc3RpbWF0aW9uIENvbnNpZGVyYXRpb25zPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5Fc3RpbWF0aW9uIENvbnNpZGVyYXRpb25zPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRXN0aW1hdGUjZ2V0RXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKCkKLQkgKiBAc2VlICNnZXRFc3RpbWF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RXN0aW1hdGVfRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Fc3RpbWF0aW5nTWV0cmljIDxlbT5Fc3RpbWF0aW5nIE1ldHJpYzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Fc3RpbWF0aW5nIE1ldHJpYzwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkVzdGltYXRpbmdNZXRyaWMKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldEVzdGltYXRpbmdNZXRyaWMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkVzdGltYXRpb25Db25zaWRlcmF0aW9ucyA8ZW0+RXN0aW1hdGlvbiBDb25zaWRlcmF0aW9uczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Fc3RpbWF0aW9uIENvbnNpZGVyYXRpb25zPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkV4YW1wbGUgPGVtPkV4YW1wbGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+RXhhbXBsZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkV4YW1wbGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldEV4YW1wbGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkd1aWRhbmNlIDxlbT5HdWlkYW5jZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5HdWlkYW5jZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkd1aWRhbmNlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRHdWlkYW5jZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuR3VpZGFuY2VEZXNjcmlwdGlvbiA8ZW0+R3VpZGFuY2UgRGVzY3JpcHRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+R3VpZGFuY2UgRGVzY3JpcHRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5HdWlkYW5jZURlc2NyaXB0aW9uCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRHdWlkYW5jZURlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkd1aWRhbmNlRGVzY3JpcHRpb24jZ2V0QXR0YWNobWVudCA8ZW0+QXR0YWNobWVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkF0dGFjaG1lbnQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5HdWlkYW5jZURlc2NyaXB0aW9uI2dldEF0dGFjaG1lbnQoKQotCSAqIEBzZWUgI2dldEd1aWRhbmNlRGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEd1aWRhbmNlRGVzY3JpcHRpb25fQXR0YWNobWVudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuR3VpZGVsaW5lIDxlbT5HdWlkZWxpbmU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+R3VpZGVsaW5lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuR3VpZGVsaW5lCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRHdWlkZWxpbmUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkl0ZXJhdGlvbiA8ZW0+SXRlcmF0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkl0ZXJhdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkl0ZXJhdGlvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0SXRlcmF0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5LaW5kIDxlbT5LaW5kPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPktpbmQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5LaW5kCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRLaW5kKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuS2luZCNnZXRBcHBsaWNhYmxlTWV0YUNsYXNzSW5mbyA8ZW0+QXBwbGljYWJsZSBNZXRhIENsYXNzIEluZm88L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPkFwcGxpY2FibGUgTWV0YSBDbGFzcyBJbmZvPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuS2luZCNnZXRBcHBsaWNhYmxlTWV0YUNsYXNzSW5mbygpCi0JICogQHNlZSAjZ2V0S2luZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0S2luZF9BcHBsaWNhYmxlTWV0YUNsYXNzSW5mbygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kQ29uZmlndXJhdGlvbiA8ZW0+TWV0aG9kIENvbmZpZ3VyYXRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+TWV0aG9kIENvbmZpZ3VyYXRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RDb25maWd1cmF0aW9uCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRNZXRob2RDb25maWd1cmF0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kQ29uZmlndXJhdGlvbiNnZXRCYXNlQ29uZmlndXJhdGlvbiA8ZW0+QmFzZSBDb25maWd1cmF0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5CYXNlIENvbmZpZ3VyYXRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RDb25maWd1cmF0aW9uI2dldEJhc2VDb25maWd1cmF0aW9uKCkKLQkgKiBAc2VlICNnZXRNZXRob2RDb25maWd1cmF0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRNZXRob2RDb25maWd1cmF0aW9uX0Jhc2VDb25maWd1cmF0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kQ29uZmlndXJhdGlvbiNnZXRNZXRob2RQbHVnaW5TZWxlY3Rpb24gPGVtPk1ldGhvZCBQbHVnaW4gU2VsZWN0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5NZXRob2QgUGx1Z2luIFNlbGVjdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZENvbmZpZ3VyYXRpb24jZ2V0TWV0aG9kUGx1Z2luU2VsZWN0aW9uKCkKLQkgKiBAc2VlICNnZXRNZXRob2RDb25maWd1cmF0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRNZXRob2RDb25maWd1cmF0aW9uX01ldGhvZFBsdWdpblNlbGVjdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZENvbmZpZ3VyYXRpb24jZ2V0TWV0aG9kUGFja2FnZVNlbGVjdGlvbiA8ZW0+TWV0aG9kIFBhY2thZ2UgU2VsZWN0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5NZXRob2QgUGFja2FnZSBTZWxlY3Rpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RDb25maWd1cmF0aW9uI2dldE1ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKQotCSAqIEBzZWUgI2dldE1ldGhvZENvbmZpZ3VyYXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldE1ldGhvZENvbmZpZ3VyYXRpb25fTWV0aG9kUGFja2FnZVNlbGVjdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RDb25maWd1cmF0aW9uI2dldERlZmF1bHRWaWV3IDxlbT5EZWZhdWx0IFZpZXc8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5EZWZhdWx0IFZpZXc8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RDb25maWd1cmF0aW9uI2dldERlZmF1bHRWaWV3KCkKLQkgKiBAc2VlICNnZXRNZXRob2RDb25maWd1cmF0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRNZXRob2RDb25maWd1cmF0aW9uX0RlZmF1bHRWaWV3KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kQ29uZmlndXJhdGlvbiNnZXRQcm9jZXNzVmlldyA8ZW0+UHJvY2VzcyBWaWV3PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5Qcm9jZXNzIFZpZXc8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RDb25maWd1cmF0aW9uI2dldFByb2Nlc3NWaWV3KCkKLQkgKiBAc2VlICNnZXRNZXRob2RDb25maWd1cmF0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRNZXRob2RDb25maWd1cmF0aW9uX1Byb2Nlc3NWaWV3KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kQ29uZmlndXJhdGlvbiNnZXRTdWJ0cmFjdGVkQ2F0ZWdvcnkgPGVtPlN1YnRyYWN0ZWQgQ2F0ZWdvcnk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPlN1YnRyYWN0ZWQgQ2F0ZWdvcnk8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RDb25maWd1cmF0aW9uI2dldFN1YnRyYWN0ZWRDYXRlZ29yeSgpCi0JICogQHNlZSAjZ2V0TWV0aG9kQ29uZmlndXJhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0TWV0aG9kQ29uZmlndXJhdGlvbl9TdWJ0cmFjdGVkQ2F0ZWdvcnkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RDb25maWd1cmF0aW9uI2dldEFkZGVkQ2F0ZWdvcnkgPGVtPkFkZGVkIENhdGVnb3J5PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5BZGRlZCBDYXRlZ29yeTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZENvbmZpZ3VyYXRpb24jZ2V0QWRkZWRDYXRlZ29yeSgpCi0JICogQHNlZSAjZ2V0TWV0aG9kQ29uZmlndXJhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0TWV0aG9kQ29uZmlndXJhdGlvbl9BZGRlZENhdGVnb3J5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RFbGVtZW50IDxlbT5NZXRob2QgRWxlbWVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5NZXRob2QgRWxlbWVudDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZEVsZW1lbnQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldE1ldGhvZEVsZW1lbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RFbGVtZW50I2dldEdyb3VwIDxlbT5Hcm91cDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+R3JvdXA8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RFbGVtZW50I2dldEdyb3VwKCkKLQkgKiBAc2VlICNnZXRNZXRob2RFbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRNZXRob2RFbGVtZW50X0dyb3VwKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kRWxlbWVudCNnZXRPd25lZFJ1bGUgPGVtPk93bmVkIFJ1bGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPk93bmVkIFJ1bGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RFbGVtZW50I2dldE93bmVkUnVsZSgpCi0JICogQHNlZSAjZ2V0TWV0aG9kRWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0TWV0aG9kRWxlbWVudF9Pd25lZFJ1bGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RFbGVtZW50I2dldE1ldGhvZEVsZW1lbnRQcm9wZXJ0eSA8ZW0+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kRWxlbWVudCNnZXRNZXRob2RFbGVtZW50UHJvcGVydHkoKQotCSAqIEBzZWUgI2dldE1ldGhvZEVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldE1ldGhvZEVsZW1lbnRfTWV0aG9kRWxlbWVudFByb3BlcnR5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZEVsZW1lbnQjZ2V0QnJpZWZEZXNjcmlwdGlvbiA8ZW0+QnJpZWYgRGVzY3JpcHRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5CcmllZiBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZEVsZW1lbnQjZ2V0QnJpZWZEZXNjcmlwdGlvbigpCi0JICogQHNlZSAjZ2V0TWV0aG9kRWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0TWV0aG9kRWxlbWVudF9CcmllZkRlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZEVsZW1lbnQjZ2V0SWQgPGVtPklkPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SWQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RFbGVtZW50I2dldElkKCkKLQkgKiBAc2VlICNnZXRNZXRob2RFbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRNZXRob2RFbGVtZW50X0lkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZEVsZW1lbnQjZ2V0T3JkZXJpbmdHdWlkZSA8ZW0+T3JkZXJpbmcgR3VpZGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5PcmRlcmluZyBHdWlkZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZEVsZW1lbnQjZ2V0T3JkZXJpbmdHdWlkZSgpCi0JICogQHNlZSAjZ2V0TWV0aG9kRWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0TWV0aG9kRWxlbWVudF9PcmRlcmluZ0d1aWRlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZEVsZW1lbnQjZ2V0UHJlc2VudGF0aW9uTmFtZSA8ZW0+UHJlc2VudGF0aW9uIE5hbWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5QcmVzZW50YXRpb24gTmFtZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZEVsZW1lbnQjZ2V0UHJlc2VudGF0aW9uTmFtZSgpCi0JICogQHNlZSAjZ2V0TWV0aG9kRWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0TWV0aG9kRWxlbWVudF9QcmVzZW50YXRpb25OYW1lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZEVsZW1lbnQjaXNTdXBwcmVzc2VkIDxlbT5TdXBwcmVzc2VkPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+U3VwcHJlc3NlZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZEVsZW1lbnQjaXNTdXBwcmVzc2VkKCkKLQkgKiBAc2VlICNnZXRNZXRob2RFbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRNZXRob2RFbGVtZW50X1N1cHByZXNzZWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZEVsZW1lbnRQcm9wZXJ0eSA8ZW0+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RFbGVtZW50UHJvcGVydHkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldE1ldGhvZEVsZW1lbnRQcm9wZXJ0eSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RFbGVtZW50UHJvcGVydHkjZ2V0VmFsdWUgPGVtPlZhbHVlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VmFsdWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RFbGVtZW50UHJvcGVydHkjZ2V0VmFsdWUoKQotCSAqIEBzZWUgI2dldE1ldGhvZEVsZW1lbnRQcm9wZXJ0eSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0TWV0aG9kRWxlbWVudFByb3BlcnR5X1ZhbHVlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RMaWJyYXJ5IDxlbT5NZXRob2QgTGlicmFyeTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5NZXRob2QgTGlicmFyeTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZExpYnJhcnkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldE1ldGhvZExpYnJhcnkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RMaWJyYXJ5I2dldE1ldGhvZFBsdWdpbiA8ZW0+TWV0aG9kIFBsdWdpbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+TWV0aG9kIFBsdWdpbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZExpYnJhcnkjZ2V0TWV0aG9kUGx1Z2luKCkKLQkgKiBAc2VlICNnZXRNZXRob2RMaWJyYXJ5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRNZXRob2RMaWJyYXJ5X01ldGhvZFBsdWdpbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZExpYnJhcnkjZ2V0TWV0aG9kQ29uZmlndXJhdGlvbiA8ZW0+TWV0aG9kIENvbmZpZ3VyYXRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPk1ldGhvZCBDb25maWd1cmF0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kTGlicmFyeSNnZXRNZXRob2RDb25maWd1cmF0aW9uKCkKLQkgKiBAc2VlICNnZXRNZXRob2RMaWJyYXJ5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRNZXRob2RMaWJyYXJ5X01ldGhvZENvbmZpZ3VyYXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kTGlicmFyeSNnZXRUb29sIDxlbT5Ub29sPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VG9vbDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZExpYnJhcnkjZ2V0VG9vbCgpCi0JICogQHNlZSAjZ2V0TWV0aG9kTGlicmFyeSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0TWV0aG9kTGlicmFyeV9Ub29sKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RQYWNrYWdlIDxlbT5NZXRob2QgUGFja2FnZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5NZXRob2QgUGFja2FnZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZFBhY2thZ2UKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldE1ldGhvZFBhY2thZ2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RQYWNrYWdlI2dldEdyb3VwMSA8ZW0+R3JvdXAxPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5Hcm91cDE8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RQYWNrYWdlI2dldEdyb3VwMSgpCi0JICogQHNlZSAjZ2V0TWV0aG9kUGFja2FnZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0TWV0aG9kUGFja2FnZV9Hcm91cDEoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RQYWNrYWdlI2dldFJldXNlZFBhY2thZ2UgPGVtPlJldXNlZCBQYWNrYWdlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5SZXVzZWQgUGFja2FnZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZFBhY2thZ2UjZ2V0UmV1c2VkUGFja2FnZSgpCi0JICogQHNlZSAjZ2V0TWV0aG9kUGFja2FnZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0TWV0aG9kUGFja2FnZV9SZXVzZWRQYWNrYWdlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kUGFja2FnZSNnZXRNZXRob2RQYWNrYWdlIDxlbT5NZXRob2QgUGFja2FnZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+TWV0aG9kIFBhY2thZ2U8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RQYWNrYWdlI2dldE1ldGhvZFBhY2thZ2UoKQotCSAqIEBzZWUgI2dldE1ldGhvZFBhY2thZ2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldE1ldGhvZFBhY2thZ2VfTWV0aG9kUGFja2FnZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RQYWNrYWdlI2lzR2xvYmFsIDxlbT5HbG9iYWw8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5HbG9iYWw8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RQYWNrYWdlI2lzR2xvYmFsKCkKLQkgKiBAc2VlICNnZXRNZXRob2RQYWNrYWdlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRNZXRob2RQYWNrYWdlX0dsb2JhbCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kUGx1Z2luIDxlbT5NZXRob2QgUGx1Z2luPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPk1ldGhvZCBQbHVnaW48L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RQbHVnaW4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldE1ldGhvZFBsdWdpbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZFBsdWdpbiNnZXRSZWZlcmVuY2VkTWV0aG9kUGx1Z2luIDxlbT5SZWZlcmVuY2VkIE1ldGhvZCBQbHVnaW48L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPlJlZmVyZW5jZWQgTWV0aG9kIFBsdWdpbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZFBsdWdpbiNnZXRSZWZlcmVuY2VkTWV0aG9kUGx1Z2luKCkKLQkgKiBAc2VlICNnZXRNZXRob2RQbHVnaW4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldE1ldGhvZFBsdWdpbl9SZWZlcmVuY2VkTWV0aG9kUGx1Z2luKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kUGx1Z2luI2dldE1ldGhvZFBhY2thZ2UgPGVtPk1ldGhvZCBQYWNrYWdlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5NZXRob2QgUGFja2FnZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZFBsdWdpbiNnZXRNZXRob2RQYWNrYWdlKCkKLQkgKiBAc2VlICNnZXRNZXRob2RQbHVnaW4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldE1ldGhvZFBsdWdpbl9NZXRob2RQYWNrYWdlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZFBsdWdpbiNpc1VzZXJDaGFuZ2VhYmxlIDxlbT5Vc2VyIENoYW5nZWFibGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Vc2VyIENoYW5nZWFibGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RQbHVnaW4jaXNVc2VyQ2hhbmdlYWJsZSgpCi0JICogQHNlZSAjZ2V0TWV0aG9kUGx1Z2luKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRNZXRob2RQbHVnaW5fVXNlckNoYW5nZWFibGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZFVuaXQgPGVtPk1ldGhvZCBVbml0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPk1ldGhvZCBVbml0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kVW5pdAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0TWV0aG9kVW5pdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RVbml0I2dldENvcHlyaWdodCA8ZW0+Q29weXJpZ2h0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Q29weXJpZ2h0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kVW5pdCNnZXRDb3B5cmlnaHQoKQotCSAqIEBzZWUgI2dldE1ldGhvZFVuaXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldE1ldGhvZFVuaXRfQ29weXJpZ2h0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZFVuaXQjZ2V0QXV0aG9ycyA8ZW0+QXV0aG9yczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkF1dGhvcnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RVbml0I2dldEF1dGhvcnMoKQotCSAqIEBzZWUgI2dldE1ldGhvZFVuaXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldE1ldGhvZFVuaXRfQXV0aG9ycygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RVbml0I2dldENoYW5nZURhdGUgPGVtPkNoYW5nZSBEYXRlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Q2hhbmdlIERhdGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RVbml0I2dldENoYW5nZURhdGUoKQotCSAqIEBzZWUgI2dldE1ldGhvZFVuaXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldE1ldGhvZFVuaXRfQ2hhbmdlRGF0ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RVbml0I2dldENoYW5nZURlc2NyaXB0aW9uIDxlbT5DaGFuZ2UgRGVzY3JpcHRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5DaGFuZ2UgRGVzY3JpcHRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RVbml0I2dldENoYW5nZURlc2NyaXB0aW9uKCkKLQkgKiBAc2VlICNnZXRNZXRob2RVbml0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRNZXRob2RVbml0X0NoYW5nZURlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZFVuaXQjZ2V0VmVyc2lvbiA8ZW0+VmVyc2lvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlZlcnNpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RVbml0I2dldFZlcnNpb24oKQotCSAqIEBzZWUgI2dldE1ldGhvZFVuaXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldE1ldGhvZFVuaXRfVmVyc2lvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWlsZXN0b25lIDxlbT5NaWxlc3RvbmU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+TWlsZXN0b25lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWlsZXN0b25lCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRNaWxlc3RvbmUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NaWxlc3RvbmUjZ2V0UmVxdWlyZWRSZXN1bHQgPGVtPlJlcXVpcmVkIFJlc3VsdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+UmVxdWlyZWQgUmVzdWx0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWlsZXN0b25lI2dldFJlcXVpcmVkUmVzdWx0KCkKLQkgKiBAc2VlICNnZXRNaWxlc3RvbmUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldE1pbGVzdG9uZV9SZXF1aXJlZFJlc3VsdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTmFtZWRFbGVtZW50IDxlbT5OYW1lZCBFbGVtZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPk5hbWVkIEVsZW1lbnQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5OYW1lZEVsZW1lbnQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldE5hbWVkRWxlbWVudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5OYW1lZEVsZW1lbnQjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk5hbWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5OYW1lZEVsZW1lbnQjZ2V0TmFtZSgpCi0JICogQHNlZSAjZ2V0TmFtZWRFbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXROYW1lZEVsZW1lbnRfTmFtZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuT3V0Y29tZSA8ZW0+T3V0Y29tZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5PdXRjb21lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuT3V0Y29tZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0T3V0Y29tZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUGFja2FnZWFibGVFbGVtZW50IDxlbT5QYWNrYWdlYWJsZSBFbGVtZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlBhY2thZ2VhYmxlIEVsZW1lbnQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5QYWNrYWdlYWJsZUVsZW1lbnQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFBhY2thZ2VhYmxlRWxlbWVudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUGhhc2UgPGVtPlBoYXNlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlBoYXNlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUGhhc2UKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFBoYXNlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5QbGFubmluZ0RhdGEgPGVtPlBsYW5uaW5nIERhdGE8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+UGxhbm5pbmcgRGF0YTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlBsYW5uaW5nRGF0YQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0UGxhbm5pbmdEYXRhKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlBsYW5uaW5nRGF0YSNnZXRGaW5pc2hEYXRlIDxlbT5GaW5pc2ggRGF0ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkZpbmlzaCBEYXRlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUGxhbm5pbmdEYXRhI2dldEZpbmlzaERhdGUoKQotCSAqIEBzZWUgI2dldFBsYW5uaW5nRGF0YSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UGxhbm5pbmdEYXRhX0ZpbmlzaERhdGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUGxhbm5pbmdEYXRhI2dldFJhbmsgPGVtPlJhbms8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5SYW5rPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUGxhbm5pbmdEYXRhI2dldFJhbmsoKQotCSAqIEBzZWUgI2dldFBsYW5uaW5nRGF0YSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UGxhbm5pbmdEYXRhX1JhbmsoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUGxhbm5pbmdEYXRhI2dldFN0YXJ0RGF0ZSA8ZW0+U3RhcnQgRGF0ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlN0YXJ0IERhdGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5QbGFubmluZ0RhdGEjZ2V0U3RhcnREYXRlKCkKLQkgKiBAc2VlICNnZXRQbGFubmluZ0RhdGEoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFBsYW5uaW5nRGF0YV9TdGFydERhdGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByYWN0aWNlIDxlbT5QcmFjdGljZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5QcmFjdGljZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByYWN0aWNlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRQcmFjdGljZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByYWN0aWNlI2dldEdyb3VwMiA8ZW0+R3JvdXAyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5Hcm91cDI8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5QcmFjdGljZSNnZXRHcm91cDIoKQotCSAqIEBzZWUgI2dldFByYWN0aWNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcmFjdGljZV9Hcm91cDIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5QcmFjdGljZSNnZXRBY3Rpdml0eVJlZmVyZW5jZSA8ZW0+QWN0aXZpdHkgUmVmZXJlbmNlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5BY3Rpdml0eSBSZWZlcmVuY2U8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5QcmFjdGljZSNnZXRBY3Rpdml0eVJlZmVyZW5jZSgpCi0JICogQHNlZSAjZ2V0UHJhY3RpY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFByYWN0aWNlX0FjdGl2aXR5UmVmZXJlbmNlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJhY3RpY2UjZ2V0Q29udGVudFJlZmVyZW5jZSA8ZW0+Q29udGVudCBSZWZlcmVuY2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPkNvbnRlbnQgUmVmZXJlbmNlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJhY3RpY2UjZ2V0Q29udGVudFJlZmVyZW5jZSgpCi0JICogQHNlZSAjZ2V0UHJhY3RpY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFByYWN0aWNlX0NvbnRlbnRSZWZlcmVuY2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5QcmFjdGljZSNnZXRTdWJQcmFjdGljZSA8ZW0+U3ViIFByYWN0aWNlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5TdWIgUHJhY3RpY2U8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5QcmFjdGljZSNnZXRTdWJQcmFjdGljZSgpCi0JICogQHNlZSAjZ2V0UHJhY3RpY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFByYWN0aWNlX1N1YlByYWN0aWNlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5QcmFjdGljZURlc2NyaXB0aW9uIDxlbT5QcmFjdGljZSBEZXNjcmlwdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5QcmFjdGljZSBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByYWN0aWNlRGVzY3JpcHRpb24KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFByYWN0aWNlRGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJhY3RpY2VEZXNjcmlwdGlvbiNnZXRBZGRpdGlvbmFsSW5mbyA8ZW0+QWRkaXRpb25hbCBJbmZvPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+QWRkaXRpb25hbCBJbmZvPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJhY3RpY2VEZXNjcmlwdGlvbiNnZXRBZGRpdGlvbmFsSW5mbygpCi0JICogQHNlZSAjZ2V0UHJhY3RpY2VEZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UHJhY3RpY2VEZXNjcmlwdGlvbl9BZGRpdGlvbmFsSW5mbygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5QcmFjdGljZURlc2NyaXB0aW9uI2dldEFwcGxpY2F0aW9uIDxlbT5BcHBsaWNhdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkFwcGxpY2F0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJhY3RpY2VEZXNjcmlwdGlvbiNnZXRBcHBsaWNhdGlvbigpCi0JICogQHNlZSAjZ2V0UHJhY3RpY2VEZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UHJhY3RpY2VEZXNjcmlwdGlvbl9BcHBsaWNhdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5QcmFjdGljZURlc2NyaXB0aW9uI2dldEJhY2tncm91bmQgPGVtPkJhY2tncm91bmQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5CYWNrZ3JvdW5kPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJhY3RpY2VEZXNjcmlwdGlvbiNnZXRCYWNrZ3JvdW5kKCkKLQkgKiBAc2VlICNnZXRQcmFjdGljZURlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcmFjdGljZURlc2NyaXB0aW9uX0JhY2tncm91bmQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJhY3RpY2VEZXNjcmlwdGlvbiNnZXRHb2FscyA8ZW0+R29hbHM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Hb2FsczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByYWN0aWNlRGVzY3JpcHRpb24jZ2V0R29hbHMoKQotCSAqIEBzZWUgI2dldFByYWN0aWNlRGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFByYWN0aWNlRGVzY3JpcHRpb25fR29hbHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJhY3RpY2VEZXNjcmlwdGlvbiNnZXRMZXZlbHNPZkFkb3B0aW9uIDxlbT5MZXZlbHMgT2YgQWRvcHRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5MZXZlbHMgT2YgQWRvcHRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5QcmFjdGljZURlc2NyaXB0aW9uI2dldExldmVsc09mQWRvcHRpb24oKQotCSAqIEBzZWUgI2dldFByYWN0aWNlRGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFByYWN0aWNlRGVzY3JpcHRpb25fTGV2ZWxzT2ZBZG9wdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5QcmFjdGljZURlc2NyaXB0aW9uI2dldFByb2JsZW0gPGVtPlByb2JsZW08L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Qcm9ibGVtPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJhY3RpY2VEZXNjcmlwdGlvbiNnZXRQcm9ibGVtKCkKLQkgKiBAc2VlICNnZXRQcmFjdGljZURlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcmFjdGljZURlc2NyaXB0aW9uX1Byb2JsZW0oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3MgPGVtPlByb2Nlc3M8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+UHJvY2VzczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3MKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFByb2Nlc3MoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzI2dldEluY2x1ZGVzUGF0dGVybiA8ZW0+SW5jbHVkZXMgUGF0dGVybjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+SW5jbHVkZXMgUGF0dGVybjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3MjZ2V0SW5jbHVkZXNQYXR0ZXJuKCkKLQkgKiBAc2VlICNnZXRQcm9jZXNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcm9jZXNzX0luY2x1ZGVzUGF0dGVybigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzI2dldERlZmF1bHRDb250ZXh0IDxlbT5EZWZhdWx0IENvbnRleHQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5EZWZhdWx0IENvbnRleHQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzI2dldERlZmF1bHRDb250ZXh0KCkKLQkgKiBAc2VlICNnZXRQcm9jZXNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcm9jZXNzX0RlZmF1bHRDb250ZXh0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2VzcyNnZXRWYWxpZENvbnRleHQgPGVtPlZhbGlkIENvbnRleHQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPlZhbGlkIENvbnRleHQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzI2dldFZhbGlkQ29udGV4dCgpCi0JICogQHNlZSAjZ2V0UHJvY2VzcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UHJvY2Vzc19WYWxpZENvbnRleHQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2VzcyNnZXREaWFncmFtVVJJIDxlbT5EaWFncmFtIFVSSTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkRpYWdyYW0gVVJJPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2VzcyNnZXREaWFncmFtVVJJKCkKLQkgKiBAc2VlICNnZXRQcm9jZXNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcm9jZXNzX0RpYWdyYW1VUkkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NDb21wb25lbnQgPGVtPlByb2Nlc3MgQ29tcG9uZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlByb2Nlc3MgQ29tcG9uZW50PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc0NvbXBvbmVudAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0UHJvY2Vzc0NvbXBvbmVudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzQ29tcG9uZW50I2dldENvcHlyaWdodCA8ZW0+Q29weXJpZ2h0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Q29weXJpZ2h0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc0NvbXBvbmVudCNnZXRDb3B5cmlnaHQoKQotCSAqIEBzZWUgI2dldFByb2Nlc3NDb21wb25lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFByb2Nlc3NDb21wb25lbnRfQ29weXJpZ2h0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NDb21wb25lbnQjZ2V0SW50ZXJmYWNlIDxlbT5JbnRlcmZhY2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5JbnRlcmZhY2U8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzQ29tcG9uZW50I2dldEludGVyZmFjZSgpCi0JICogQHNlZSAjZ2V0UHJvY2Vzc0NvbXBvbmVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0UHJvY2Vzc0NvbXBvbmVudF9JbnRlcmZhY2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc0NvbXBvbmVudCNnZXRQcm9jZXNzIDxlbT5Qcm9jZXNzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+UHJvY2VzczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NDb21wb25lbnQjZ2V0UHJvY2VzcygpCi0JICogQHNlZSAjZ2V0UHJvY2Vzc0NvbXBvbmVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0UHJvY2Vzc0NvbXBvbmVudF9Qcm9jZXNzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NDb21wb25lbnQjZ2V0QXV0aG9ycyA8ZW0+QXV0aG9yczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkF1dGhvcnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzQ29tcG9uZW50I2dldEF1dGhvcnMoKQotCSAqIEBzZWUgI2dldFByb2Nlc3NDb21wb25lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFByb2Nlc3NDb21wb25lbnRfQXV0aG9ycygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzQ29tcG9uZW50I2dldENoYW5nZURhdGUgPGVtPkNoYW5nZSBEYXRlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Q2hhbmdlIERhdGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzQ29tcG9uZW50I2dldENoYW5nZURhdGUoKQotCSAqIEBzZWUgI2dldFByb2Nlc3NDb21wb25lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFByb2Nlc3NDb21wb25lbnRfQ2hhbmdlRGF0ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzQ29tcG9uZW50I2dldENoYW5nZURlc2NyaXB0aW9uIDxlbT5DaGFuZ2UgRGVzY3JpcHRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5DaGFuZ2UgRGVzY3JpcHRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzQ29tcG9uZW50I2dldENoYW5nZURlc2NyaXB0aW9uKCkKLQkgKiBAc2VlICNnZXRQcm9jZXNzQ29tcG9uZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcm9jZXNzQ29tcG9uZW50X0NoYW5nZURlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NDb21wb25lbnQjZ2V0VmVyc2lvbiA8ZW0+VmVyc2lvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlZlcnNpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzQ29tcG9uZW50I2dldFZlcnNpb24oKQotCSAqIEBzZWUgI2dldFByb2Nlc3NDb21wb25lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFByb2Nlc3NDb21wb25lbnRfVmVyc2lvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSA8ZW0+UHJvY2VzcyBDb21wb25lbnQgSW50ZXJmYWNlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlByb2Nlc3MgQ29tcG9uZW50IEludGVyZmFjZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlI2dldEdyb3VwMiA8ZW0+R3JvdXAyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5Hcm91cDI8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlI2dldEdyb3VwMigpCi0JICogQHNlZSAjZ2V0UHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZV9Hcm91cDIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlI2dldEludGVyZmFjZVNwZWNpZmljYXRpb24gPGVtPkludGVyZmFjZSBTcGVjaWZpY2F0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5JbnRlcmZhY2UgU3BlY2lmaWNhdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UjZ2V0SW50ZXJmYWNlU3BlY2lmaWNhdGlvbigpCi0JICogQHNlZSAjZ2V0UHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0UHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZV9JbnRlcmZhY2VTcGVjaWZpY2F0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSNnZXRJbnRlcmZhY2VJTyA8ZW0+SW50ZXJmYWNlIElPPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5JbnRlcmZhY2UgSU88L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlI2dldEludGVyZmFjZUlPKCkKLQkgKiBAc2VlICNnZXRQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlX0ludGVyZmFjZUlPKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzRGVzY3JpcHRpb24gPGVtPlByb2Nlc3MgRGVzY3JpcHRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+UHJvY2VzcyBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NEZXNjcmlwdGlvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0UHJvY2Vzc0Rlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NEZXNjcmlwdGlvbiNnZXRTY29wZSA8ZW0+U2NvcGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5TY29wZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NEZXNjcmlwdGlvbiNnZXRTY29wZSgpCi0JICogQHNlZSAjZ2V0UHJvY2Vzc0Rlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcm9jZXNzRGVzY3JpcHRpb25fU2NvcGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc0Rlc2NyaXB0aW9uI2dldFVzYWdlTm90ZXMgPGVtPlVzYWdlIE5vdGVzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VXNhZ2UgTm90ZXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzRGVzY3JpcHRpb24jZ2V0VXNhZ2VOb3RlcygpCi0JICogQHNlZSAjZ2V0UHJvY2Vzc0Rlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcm9jZXNzRGVzY3JpcHRpb25fVXNhZ2VOb3RlcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc0VsZW1lbnQgPGVtPlByb2Nlc3MgRWxlbWVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Qcm9jZXNzIEVsZW1lbnQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzRWxlbWVudAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0UHJvY2Vzc0VsZW1lbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NQYWNrYWdlIDxlbT5Qcm9jZXNzIFBhY2thZ2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+UHJvY2VzcyBQYWNrYWdlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc1BhY2thZ2UKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFByb2Nlc3NQYWNrYWdlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc1BhY2thZ2UjZ2V0R3JvdXAyIDxlbT5Hcm91cDI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPkdyb3VwMjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NQYWNrYWdlI2dldEdyb3VwMigpCi0JICogQHNlZSAjZ2V0UHJvY2Vzc1BhY2thZ2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFByb2Nlc3NQYWNrYWdlX0dyb3VwMigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NQYWNrYWdlI2dldFByb2Nlc3NFbGVtZW50IDxlbT5Qcm9jZXNzIEVsZW1lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPlByb2Nlc3MgRWxlbWVudDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NQYWNrYWdlI2dldFByb2Nlc3NFbGVtZW50KCkKLQkgKiBAc2VlICNnZXRQcm9jZXNzUGFja2FnZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0UHJvY2Vzc1BhY2thZ2VfUHJvY2Vzc0VsZW1lbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NQbGFubmluZ1RlbXBsYXRlIDxlbT5Qcm9jZXNzIFBsYW5uaW5nIFRlbXBsYXRlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlByb2Nlc3MgUGxhbm5pbmcgVGVtcGxhdGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0UHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSNnZXRHcm91cDQgPGVtPkdyb3VwNDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+R3JvdXA0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUjZ2V0R3JvdXA0KCkKLQkgKiBAc2VlICNnZXRQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGVfR3JvdXA0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUjZ2V0QmFzZVByb2Nlc3MgPGVtPkJhc2UgUHJvY2VzczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+QmFzZSBQcm9jZXNzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUjZ2V0QmFzZVByb2Nlc3MoKQotCSAqIEBzZWUgI2dldFByb2Nlc3NQbGFubmluZ1RlbXBsYXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZV9CYXNlUHJvY2VzcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUmVwb3J0IDxlbT5SZXBvcnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+UmVwb3J0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUmVwb3J0Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRSZXBvcnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJldXNhYmxlQXNzZXQgPGVtPlJldXNhYmxlIEFzc2V0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlJldXNhYmxlIEFzc2V0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUmV1c2FibGVBc3NldAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0UmV1c2FibGVBc3NldCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUm9hZG1hcCA8ZW0+Um9hZG1hcDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Sb2FkbWFwPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUm9hZG1hcAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0Um9hZG1hcCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUm9sZSA8ZW0+Um9sZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Sb2xlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUm9sZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0Um9sZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJvbGUjZ2V0R3JvdXAyIDxlbT5Hcm91cDI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPkdyb3VwMjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJvbGUjZ2V0R3JvdXAyKCkKLQkgKiBAc2VlICNnZXRSb2xlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRSb2xlX0dyb3VwMigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJvbGUjZ2V0UmVzcG9uc2libGVGb3IgPGVtPlJlc3BvbnNpYmxlIEZvcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+UmVzcG9uc2libGUgRm9yPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUm9sZSNnZXRSZXNwb25zaWJsZUZvcigpCi0JICogQHNlZSAjZ2V0Um9sZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0Um9sZV9SZXNwb25zaWJsZUZvcigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUm9sZURlc2NyaXB0aW9uIDxlbT5Sb2xlIERlc2NyaXB0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlJvbGUgRGVzY3JpcHRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Sb2xlRGVzY3JpcHRpb24KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFJvbGVEZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Sb2xlRGVzY3JpcHRpb24jZ2V0QXNzaWdubWVudEFwcHJvYWNoZXMgPGVtPkFzc2lnbm1lbnQgQXBwcm9hY2hlczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkFzc2lnbm1lbnQgQXBwcm9hY2hlczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJvbGVEZXNjcmlwdGlvbiNnZXRBc3NpZ25tZW50QXBwcm9hY2hlcygpCi0JICogQHNlZSAjZ2V0Um9sZURlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRSb2xlRGVzY3JpcHRpb25fQXNzaWdubWVudEFwcHJvYWNoZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUm9sZURlc2NyaXB0aW9uI2dldFNraWxscyA8ZW0+U2tpbGxzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+U2tpbGxzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUm9sZURlc2NyaXB0aW9uI2dldFNraWxscygpCi0JICogQHNlZSAjZ2V0Um9sZURlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRSb2xlRGVzY3JpcHRpb25fU2tpbGxzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJvbGVEZXNjcmlwdGlvbiNnZXRTeW5vbnltcyA8ZW0+U3lub255bXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5TeW5vbnltczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJvbGVEZXNjcmlwdGlvbiNnZXRTeW5vbnltcygpCi0JICogQHNlZSAjZ2V0Um9sZURlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRSb2xlRGVzY3JpcHRpb25fU3lub255bXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJvbGVEZXNjcmlwdG9yIDxlbT5Sb2xlIERlc2NyaXB0b3I8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+Um9sZSBEZXNjcmlwdG9yPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUm9sZURlc2NyaXB0b3IKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFJvbGVEZXNjcmlwdG9yKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJvbGVEZXNjcmlwdG9yI2dldFJvbGUgPGVtPlJvbGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Sb2xlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUm9sZURlc2NyaXB0b3IjZ2V0Um9sZSgpCi0JICogQHNlZSAjZ2V0Um9sZURlc2NyaXB0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFJvbGVEZXNjcmlwdG9yX1JvbGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Sb2xlRGVzY3JpcHRvciNnZXRSZXNwb25zaWJsZUZvciA8ZW0+UmVzcG9uc2libGUgRm9yPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5SZXNwb25zaWJsZSBGb3I8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Sb2xlRGVzY3JpcHRvciNnZXRSZXNwb25zaWJsZUZvcigpCi0JICogQHNlZSAjZ2V0Um9sZURlc2NyaXB0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFJvbGVEZXNjcmlwdG9yX1Jlc3BvbnNpYmxlRm9yKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Sb2xlU2V0IDxlbT5Sb2xlIFNldDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Sb2xlIFNldDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJvbGVTZXQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFJvbGVTZXQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Sb2xlU2V0I2dldEdyb3VwMiA8ZW0+R3JvdXAyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5Hcm91cDI8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Sb2xlU2V0I2dldEdyb3VwMigpCi0JICogQHNlZSAjZ2V0Um9sZVNldCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0Um9sZVNldF9Hcm91cDIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Sb2xlU2V0I2dldFJvbGUgPGVtPlJvbGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPlJvbGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Sb2xlU2V0I2dldFJvbGUoKQotCSAqIEBzZWUgI2dldFJvbGVTZXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFJvbGVTZXRfUm9sZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUm9sZVNldEdyb3VwaW5nIDxlbT5Sb2xlIFNldCBHcm91cGluZzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Sb2xlIFNldCBHcm91cGluZzwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJvbGVTZXRHcm91cGluZwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0Um9sZVNldEdyb3VwaW5nKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUm9sZVNldEdyb3VwaW5nI2dldEdyb3VwMiA8ZW0+R3JvdXAyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5Hcm91cDI8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Sb2xlU2V0R3JvdXBpbmcjZ2V0R3JvdXAyKCkKLQkgKiBAc2VlICNnZXRSb2xlU2V0R3JvdXBpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFJvbGVTZXRHcm91cGluZ19Hcm91cDIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Sb2xlU2V0R3JvdXBpbmcjZ2V0Um9sZVNldCA8ZW0+Um9sZSBTZXQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPlJvbGUgU2V0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUm9sZVNldEdyb3VwaW5nI2dldFJvbGVTZXQoKQotCSAqIEBzZWUgI2dldFJvbGVTZXRHcm91cGluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0Um9sZVNldEdyb3VwaW5nX1JvbGVTZXQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlNlY3Rpb24gPGVtPlNlY3Rpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+U2VjdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlNlY3Rpb24KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFNlY3Rpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuU2VjdGlvbiNnZXRTdWJTZWN0aW9uIDxlbT5TdWIgU2VjdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPlN1YiBTZWN0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuU2VjdGlvbiNnZXRTdWJTZWN0aW9uKCkKLQkgKiBAc2VlICNnZXRTZWN0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRTZWN0aW9uX1N1YlNlY3Rpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuU2VjdGlvbiNnZXRQcmVkZWNlc3NvciA8ZW0+UHJlZGVjZXNzb3I8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5QcmVkZWNlc3NvcjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlNlY3Rpb24jZ2V0UHJlZGVjZXNzb3IoKQotCSAqIEBzZWUgI2dldFNlY3Rpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFNlY3Rpb25fUHJlZGVjZXNzb3IoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuU2VjdGlvbiNnZXREZXNjcmlwdGlvbiA8ZW0+RGVzY3JpcHRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5EZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlNlY3Rpb24jZ2V0RGVzY3JpcHRpb24oKQotCSAqIEBzZWUgI2dldFNlY3Rpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFNlY3Rpb25fRGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuU2VjdGlvbiNnZXRTZWN0aW9uTmFtZSA8ZW0+U2VjdGlvbiBOYW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+U2VjdGlvbiBOYW1lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuU2VjdGlvbiNnZXRTZWN0aW9uTmFtZSgpCi0JICogQHNlZSAjZ2V0U2VjdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0U2VjdGlvbl9TZWN0aW9uTmFtZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5TZWN0aW9uI2dldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQgPGVtPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuU2VjdGlvbiNnZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkKLQkgKiBAc2VlICNnZXRTZWN0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRTZWN0aW9uX1ZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuU2VjdGlvbiNnZXRWYXJpYWJpbGl0eVR5cGUgPGVtPlZhcmlhYmlsaXR5IFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5WYXJpYWJpbGl0eSBUeXBlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuU2VjdGlvbiNnZXRWYXJpYWJpbGl0eVR5cGUoKQotCSAqIEBzZWUgI2dldFNlY3Rpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFNlY3Rpb25fVmFyaWFiaWxpdHlUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5TdXBwb3J0aW5nTWF0ZXJpYWwgPGVtPlN1cHBvcnRpbmcgTWF0ZXJpYWw8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+U3VwcG9ydGluZyBNYXRlcmlhbDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlN1cHBvcnRpbmdNYXRlcmlhbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0U3VwcG9ydGluZ01hdGVyaWFsKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UYXNrIDxlbT5UYXNrPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlRhc2s8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UYXNrCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRUYXNrKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRhc2sjZ2V0UHJlY29uZGl0aW9uIDxlbT5QcmVjb25kaXRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5QcmVjb25kaXRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UYXNrI2dldFByZWNvbmRpdGlvbigpCi0JICogQHNlZSAjZ2V0VGFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGFza19QcmVjb25kaXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFzayNnZXRQb3N0Y29uZGl0aW9uIDxlbT5Qb3N0Y29uZGl0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UG9zdGNvbmRpdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRhc2sjZ2V0UG9zdGNvbmRpdGlvbigpCi0JICogQHNlZSAjZ2V0VGFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGFza19Qb3N0Y29uZGl0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFzayNnZXRQZXJmb3JtZWRCeSA8ZW0+UGVyZm9ybWVkIEJ5PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5QZXJmb3JtZWQgQnk8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UYXNrI2dldFBlcmZvcm1lZEJ5KCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrX1BlcmZvcm1lZEJ5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFzayNnZXRHcm91cDIgPGVtPkdyb3VwMjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+R3JvdXAyPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFzayNnZXRHcm91cDIoKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tfR3JvdXAyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFzayNnZXRNYW5kYXRvcnlJbnB1dCA8ZW0+TWFuZGF0b3J5IElucHV0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5NYW5kYXRvcnkgSW5wdXQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UYXNrI2dldE1hbmRhdG9yeUlucHV0KCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrX01hbmRhdG9yeUlucHV0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFzayNnZXRPdXRwdXQgPGVtPk91dHB1dDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+T3V0cHV0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFzayNnZXRPdXRwdXQoKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tfT3V0cHV0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFzayNnZXRBZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSA8ZW0+QWRkaXRpb25hbGx5IFBlcmZvcm1lZCBCeTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+QWRkaXRpb25hbGx5IFBlcmZvcm1lZCBCeTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRhc2sjZ2V0QWRkaXRpb25hbGx5UGVyZm9ybWVkQnkoKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tfQWRkaXRpb25hbGx5UGVyZm9ybWVkQnkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UYXNrI2dldE9wdGlvbmFsSW5wdXQgPGVtPk9wdGlvbmFsIElucHV0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5PcHRpb25hbCBJbnB1dDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRhc2sjZ2V0T3B0aW9uYWxJbnB1dCgpCi0JICogQHNlZSAjZ2V0VGFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGFza19PcHRpb25hbElucHV0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFzayNnZXRFc3RpbWF0ZSA8ZW0+RXN0aW1hdGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPkVzdGltYXRlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFzayNnZXRFc3RpbWF0ZSgpCi0JICogQHNlZSAjZ2V0VGFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGFza19Fc3RpbWF0ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRhc2sjZ2V0RXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIDxlbT5Fc3RpbWF0aW9uIENvbnNpZGVyYXRpb25zPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5Fc3RpbWF0aW9uIENvbnNpZGVyYXRpb25zPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFzayNnZXRFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMoKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tfRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFzayNnZXRUb29sTWVudG9yIDxlbT5Ub29sIE1lbnRvcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+VG9vbCBNZW50b3I8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UYXNrI2dldFRvb2xNZW50b3IoKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tfVG9vbE1lbnRvcigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFza0Rlc2NyaXB0aW9uIDxlbT5UYXNrIERlc2NyaXB0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlRhc2sgRGVzY3JpcHRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UYXNrRGVzY3JpcHRpb24KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFRhc2tEZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UYXNrRGVzY3JpcHRpb24jZ2V0QWx0ZXJuYXRpdmVzIDxlbT5BbHRlcm5hdGl2ZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5BbHRlcm5hdGl2ZXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UYXNrRGVzY3JpcHRpb24jZ2V0QWx0ZXJuYXRpdmVzKCkKLQkgKiBAc2VlICNnZXRUYXNrRGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tEZXNjcmlwdGlvbl9BbHRlcm5hdGl2ZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFza0Rlc2NyaXB0aW9uI2dldFB1cnBvc2UgPGVtPlB1cnBvc2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5QdXJwb3NlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFza0Rlc2NyaXB0aW9uI2dldFB1cnBvc2UoKQotCSAqIEBzZWUgI2dldFRhc2tEZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGFza0Rlc2NyaXB0aW9uX1B1cnBvc2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRhc2tEZXNjcmlwdG9yIDxlbT5UYXNrIERlc2NyaXB0b3I8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+VGFzayBEZXNjcmlwdG9yPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFza0Rlc2NyaXB0b3IKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFRhc2tEZXNjcmlwdG9yKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRhc2tEZXNjcmlwdG9yI2dldFRhc2sgPGVtPlRhc2s8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5UYXNrPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFza0Rlc2NyaXB0b3IjZ2V0VGFzaygpCi0JICogQHNlZSAjZ2V0VGFza0Rlc2NyaXB0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tEZXNjcmlwdG9yX1Rhc2soKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFza0Rlc2NyaXB0b3IjZ2V0UGVyZm9ybWVkUHJpbWFyaWx5QnkgPGVtPlBlcmZvcm1lZCBQcmltYXJpbHkgQnk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5QZXJmb3JtZWQgUHJpbWFyaWx5IEJ5PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFza0Rlc2NyaXB0b3IjZ2V0UGVyZm9ybWVkUHJpbWFyaWx5QnkoKQotCSAqIEBzZWUgI2dldFRhc2tEZXNjcmlwdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrRGVzY3JpcHRvcl9QZXJmb3JtZWRQcmltYXJpbHlCeSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRhc2tEZXNjcmlwdG9yI2dldEdyb3VwMyA8ZW0+R3JvdXAzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5Hcm91cDM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UYXNrRGVzY3JpcHRvciNnZXRHcm91cDMoKQotCSAqIEBzZWUgI2dldFRhc2tEZXNjcmlwdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrRGVzY3JpcHRvcl9Hcm91cDMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UYXNrRGVzY3JpcHRvciNnZXRBZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSA8ZW0+QWRkaXRpb25hbGx5IFBlcmZvcm1lZCBCeTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+QWRkaXRpb25hbGx5IFBlcmZvcm1lZCBCeTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRhc2tEZXNjcmlwdG9yI2dldEFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5KCkKLQkgKiBAc2VlICNnZXRUYXNrRGVzY3JpcHRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGFza0Rlc2NyaXB0b3JfQWRkaXRpb25hbGx5UGVyZm9ybWVkQnkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UYXNrRGVzY3JpcHRvciNnZXRBc3Npc3RlZEJ5IDxlbT5Bc3Npc3RlZCBCeTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+QXNzaXN0ZWQgQnk8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UYXNrRGVzY3JpcHRvciNnZXRBc3Npc3RlZEJ5KCkKLQkgKiBAc2VlICNnZXRUYXNrRGVzY3JpcHRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGFza0Rlc2NyaXB0b3JfQXNzaXN0ZWRCeSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRhc2tEZXNjcmlwdG9yI2dldEV4dGVybmFsSW5wdXQgPGVtPkV4dGVybmFsIElucHV0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5FeHRlcm5hbCBJbnB1dDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRhc2tEZXNjcmlwdG9yI2dldEV4dGVybmFsSW5wdXQoKQotCSAqIEBzZWUgI2dldFRhc2tEZXNjcmlwdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrRGVzY3JpcHRvcl9FeHRlcm5hbElucHV0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFza0Rlc2NyaXB0b3IjZ2V0TWFuZGF0b3J5SW5wdXQgPGVtPk1hbmRhdG9yeSBJbnB1dDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+TWFuZGF0b3J5IElucHV0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFza0Rlc2NyaXB0b3IjZ2V0TWFuZGF0b3J5SW5wdXQoKQotCSAqIEBzZWUgI2dldFRhc2tEZXNjcmlwdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrRGVzY3JpcHRvcl9NYW5kYXRvcnlJbnB1dCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRhc2tEZXNjcmlwdG9yI2dldE9wdGlvbmFsSW5wdXQgPGVtPk9wdGlvbmFsIElucHV0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5PcHRpb25hbCBJbnB1dDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRhc2tEZXNjcmlwdG9yI2dldE9wdGlvbmFsSW5wdXQoKQotCSAqIEBzZWUgI2dldFRhc2tEZXNjcmlwdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrRGVzY3JpcHRvcl9PcHRpb25hbElucHV0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFza0Rlc2NyaXB0b3IjZ2V0T3V0cHV0IDxlbT5PdXRwdXQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPk91dHB1dDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRhc2tEZXNjcmlwdG9yI2dldE91dHB1dCgpCi0JICogQHNlZSAjZ2V0VGFza0Rlc2NyaXB0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tEZXNjcmlwdG9yX091dHB1dCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRhc2tEZXNjcmlwdG9yI2dldFN0ZXAgPGVtPlN0ZXA8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPlN0ZXA8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UYXNrRGVzY3JpcHRvciNnZXRTdGVwKCkKLQkgKiBAc2VlICNnZXRUYXNrRGVzY3JpcHRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0VGFza0Rlc2NyaXB0b3JfU3RlcCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UYXNrRGVzY3JpcHRvciNpc0lzU3luY2hyb25pemVkV2l0aFNvdXJjZSA8ZW0+SXMgU3luY2hyb25pemVkIFdpdGggU291cmNlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SXMgU3luY2hyb25pemVkIFdpdGggU291cmNlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFza0Rlc2NyaXB0b3IjaXNJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UoKQotCSAqIEBzZWUgI2dldFRhc2tEZXNjcmlwdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrRGVzY3JpcHRvcl9Jc1N5bmNocm9uaXplZFdpdGhTb3VyY2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRlYW1Qcm9maWxlIDxlbT5UZWFtIFByb2ZpbGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+VGVhbSBQcm9maWxlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGVhbVByb2ZpbGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFRlYW1Qcm9maWxlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGVhbVByb2ZpbGUjZ2V0R3JvdXAyIDxlbT5Hcm91cDI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPkdyb3VwMjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRlYW1Qcm9maWxlI2dldEdyb3VwMigpCi0JICogQHNlZSAjZ2V0VGVhbVByb2ZpbGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRlYW1Qcm9maWxlX0dyb3VwMigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRlYW1Qcm9maWxlI2dldFJvbGUgPGVtPlJvbGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPlJvbGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UZWFtUHJvZmlsZSNnZXRSb2xlKCkKLQkgKiBAc2VlICNnZXRUZWFtUHJvZmlsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGVhbVByb2ZpbGVfUm9sZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRlYW1Qcm9maWxlI2dldFN1cGVyVGVhbSA8ZW0+U3VwZXIgVGVhbTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+U3VwZXIgVGVhbTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRlYW1Qcm9maWxlI2dldFN1cGVyVGVhbSgpCi0JICogQHNlZSAjZ2V0VGVhbVByb2ZpbGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRlYW1Qcm9maWxlX1N1cGVyVGVhbSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRlYW1Qcm9maWxlI2dldFN1YlRlYW0gPGVtPlN1YiBUZWFtPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5TdWIgVGVhbTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRlYW1Qcm9maWxlI2dldFN1YlRlYW0oKQotCSAqIEBzZWUgI2dldFRlYW1Qcm9maWxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUZWFtUHJvZmlsZV9TdWJUZWFtKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UZW1wbGF0ZSA8ZW0+VGVtcGxhdGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+VGVtcGxhdGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UZW1wbGF0ZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0VGVtcGxhdGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRlcm1EZWZpbml0aW9uIDxlbT5UZXJtIERlZmluaXRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+VGVybSBEZWZpbml0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGVybURlZmluaXRpb24KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFRlcm1EZWZpbml0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Ub29sIDxlbT5Ub29sPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlRvb2w8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Ub29sCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRUb29sKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVG9vbCNnZXRHcm91cDIgPGVtPkdyb3VwMjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+R3JvdXAyPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVG9vbCNnZXRHcm91cDIoKQotCSAqIEBzZWUgI2dldFRvb2woKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRvb2xfR3JvdXAyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVG9vbCNnZXRUb29sTWVudG9yIDxlbT5Ub29sIE1lbnRvcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+VG9vbCBNZW50b3I8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Ub29sI2dldFRvb2xNZW50b3IoKQotCSAqIEBzZWUgI2dldFRvb2woKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRvb2xfVG9vbE1lbnRvcigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVG9vbE1lbnRvciA8ZW0+VG9vbCBNZW50b3I8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+VG9vbCBNZW50b3I8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Ub29sTWVudG9yCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRUb29sTWVudG9yKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5XaGl0ZXBhcGVyIDxlbT5XaGl0ZXBhcGVyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPldoaXRlcGFwZXI8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5XaGl0ZXBhcGVyCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRXaGl0ZXBhcGVyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrQnJlYWtkb3duRWxlbWVudCA8ZW0+V29yayBCcmVha2Rvd24gRWxlbWVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Xb3JrIEJyZWFrZG93biBFbGVtZW50PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya0JyZWFrZG93bkVsZW1lbnQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFdvcmtCcmVha2Rvd25FbGVtZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya0JyZWFrZG93bkVsZW1lbnQjZ2V0R3JvdXAyIDxlbT5Hcm91cDI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPkdyb3VwMjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtCcmVha2Rvd25FbGVtZW50I2dldEdyb3VwMigpCi0JICogQHNlZSAjZ2V0V29ya0JyZWFrZG93bkVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFdvcmtCcmVha2Rvd25FbGVtZW50X0dyb3VwMigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtCcmVha2Rvd25FbGVtZW50I2dldFByZWRlY2Vzc29yIDxlbT5QcmVkZWNlc3NvcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+UHJlZGVjZXNzb3I8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrQnJlYWtkb3duRWxlbWVudCNnZXRQcmVkZWNlc3NvcigpCi0JICogQHNlZSAjZ2V0V29ya0JyZWFrZG93bkVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFdvcmtCcmVha2Rvd25FbGVtZW50X1ByZWRlY2Vzc29yKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtCcmVha2Rvd25FbGVtZW50I2lzSXNFdmVudERyaXZlbiA8ZW0+SXMgRXZlbnQgRHJpdmVuPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SXMgRXZlbnQgRHJpdmVuPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya0JyZWFrZG93bkVsZW1lbnQjaXNJc0V2ZW50RHJpdmVuKCkKLQkgKiBAc2VlICNnZXRXb3JrQnJlYWtkb3duRWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0V29ya0JyZWFrZG93bkVsZW1lbnRfSXNFdmVudERyaXZlbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrQnJlYWtkb3duRWxlbWVudCNpc0lzT25nb2luZyA8ZW0+SXMgT25nb2luZzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPklzIE9uZ29pbmc8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrQnJlYWtkb3duRWxlbWVudCNpc0lzT25nb2luZygpCi0JICogQHNlZSAjZ2V0V29ya0JyZWFrZG93bkVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFdvcmtCcmVha2Rvd25FbGVtZW50X0lzT25nb2luZygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrQnJlYWtkb3duRWxlbWVudCNpc0lzUmVwZWF0YWJsZSA8ZW0+SXMgUmVwZWF0YWJsZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPklzIFJlcGVhdGFibGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrQnJlYWtkb3duRWxlbWVudCNpc0lzUmVwZWF0YWJsZSgpCi0JICogQHNlZSAjZ2V0V29ya0JyZWFrZG93bkVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFdvcmtCcmVha2Rvd25FbGVtZW50X0lzUmVwZWF0YWJsZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya0RlZmluaXRpb24gPGVtPldvcmsgRGVmaW5pdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Xb3JrIERlZmluaXRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrRGVmaW5pdGlvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0V29ya0RlZmluaXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya0RlZmluaXRpb24jZ2V0UHJlY29uZGl0aW9uIDxlbT5QcmVjb25kaXRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5QcmVjb25kaXRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrRGVmaW5pdGlvbiNnZXRQcmVjb25kaXRpb24oKQotCSAqIEBzZWUgI2dldFdvcmtEZWZpbml0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRXb3JrRGVmaW5pdGlvbl9QcmVjb25kaXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya0RlZmluaXRpb24jZ2V0UG9zdGNvbmRpdGlvbiA8ZW0+UG9zdGNvbmRpdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlBvc3Rjb25kaXRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrRGVmaW5pdGlvbiNnZXRQb3N0Y29uZGl0aW9uKCkKLQkgKiBAc2VlICNnZXRXb3JrRGVmaW5pdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0V29ya0RlZmluaXRpb25fUG9zdGNvbmRpdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya09yZGVyIDxlbT5Xb3JrIE9yZGVyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPldvcmsgT3JkZXI8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrT3JkZXIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFdvcmtPcmRlcigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrT3JkZXIjZ2V0VmFsdWUgPGVtPlZhbHVlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VmFsdWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrT3JkZXIjZ2V0VmFsdWUoKQotCSAqIEBzZWUgI2dldFdvcmtPcmRlcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0V29ya09yZGVyX1ZhbHVlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtPcmRlciNnZXRJZCA8ZW0+SWQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5JZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtPcmRlciNnZXRJZCgpCi0JICogQHNlZSAjZ2V0V29ya09yZGVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRXb3JrT3JkZXJfSWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya09yZGVyI2dldExpbmtUeXBlIDxlbT5MaW5rIFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5MaW5rIFR5cGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrT3JkZXIjZ2V0TGlua1R5cGUoKQotCSAqIEBzZWUgI2dldFdvcmtPcmRlcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0V29ya09yZGVyX0xpbmtUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdCA8ZW0+V29yayBQcm9kdWN0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPldvcmsgUHJvZHVjdDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtQcm9kdWN0Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRXb3JrUHJvZHVjdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtQcm9kdWN0I2dldEdyb3VwMiA8ZW0+R3JvdXAyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5Hcm91cDI8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdCNnZXRHcm91cDIoKQotCSAqIEBzZWUgI2dldFdvcmtQcm9kdWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRXb3JrUHJvZHVjdF9Hcm91cDIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdCNnZXRFc3RpbWF0ZSA8ZW0+RXN0aW1hdGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPkVzdGltYXRlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya1Byb2R1Y3QjZ2V0RXN0aW1hdGUoKQotCSAqIEBzZWUgI2dldFdvcmtQcm9kdWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRXb3JrUHJvZHVjdF9Fc3RpbWF0ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtQcm9kdWN0I2dldEVzdGltYXRpb25Db25zaWRlcmF0aW9ucyA8ZW0+RXN0aW1hdGlvbiBDb25zaWRlcmF0aW9uczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+RXN0aW1hdGlvbiBDb25zaWRlcmF0aW9uczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtQcm9kdWN0I2dldEVzdGltYXRpb25Db25zaWRlcmF0aW9ucygpCi0JICogQHNlZSAjZ2V0V29ya1Byb2R1Y3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFdvcmtQcm9kdWN0X0VzdGltYXRpb25Db25zaWRlcmF0aW9ucygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtQcm9kdWN0I2dldFJlcG9ydCA8ZW0+UmVwb3J0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5SZXBvcnQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdCNnZXRSZXBvcnQoKQotCSAqIEBzZWUgI2dldFdvcmtQcm9kdWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRXb3JrUHJvZHVjdF9SZXBvcnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdCNnZXRUZW1wbGF0ZSA8ZW0+VGVtcGxhdGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPlRlbXBsYXRlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya1Byb2R1Y3QjZ2V0VGVtcGxhdGUoKQotCSAqIEBzZWUgI2dldFdvcmtQcm9kdWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRXb3JrUHJvZHVjdF9UZW1wbGF0ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtQcm9kdWN0I2dldFRvb2xNZW50b3IgPGVtPlRvb2wgTWVudG9yPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5Ub29sIE1lbnRvcjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtQcm9kdWN0I2dldFRvb2xNZW50b3IoKQotCSAqIEBzZWUgI2dldFdvcmtQcm9kdWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRXb3JrUHJvZHVjdF9Ub29sTWVudG9yKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0aW9uIDxlbT5Xb3JrIFByb2R1Y3QgRGVzY3JpcHRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+V29yayBQcm9kdWN0IERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya1Byb2R1Y3REZXNjcmlwdGlvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0V29ya1Byb2R1Y3REZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0aW9uI2dldEltcGFjdE9mTm90SGF2aW5nIDxlbT5JbXBhY3QgT2YgTm90IEhhdmluZzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkltcGFjdCBPZiBOb3QgSGF2aW5nPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya1Byb2R1Y3REZXNjcmlwdGlvbiNnZXRJbXBhY3RPZk5vdEhhdmluZygpCi0JICogQHNlZSAjZ2V0V29ya1Byb2R1Y3REZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0V29ya1Byb2R1Y3REZXNjcmlwdGlvbl9JbXBhY3RPZk5vdEhhdmluZygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0aW9uI2dldFB1cnBvc2UgPGVtPlB1cnBvc2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5QdXJwb3NlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya1Byb2R1Y3REZXNjcmlwdGlvbiNnZXRQdXJwb3NlKCkKLQkgKiBAc2VlICNnZXRXb3JrUHJvZHVjdERlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRXb3JrUHJvZHVjdERlc2NyaXB0aW9uX1B1cnBvc2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya1Byb2R1Y3REZXNjcmlwdGlvbiNnZXRSZWFzb25zRm9yTm90TmVlZGluZyA8ZW0+UmVhc29ucyBGb3IgTm90IE5lZWRpbmc8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5SZWFzb25zIEZvciBOb3QgTmVlZGluZzwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRpb24jZ2V0UmVhc29uc0Zvck5vdE5lZWRpbmcoKQotCSAqIEBzZWUgI2dldFdvcmtQcm9kdWN0RGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFdvcmtQcm9kdWN0RGVzY3JpcHRpb25fUmVhc29uc0Zvck5vdE5lZWRpbmcoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvciA8ZW0+V29yayBQcm9kdWN0IERlc2NyaXB0b3I8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+V29yayBQcm9kdWN0IERlc2NyaXB0b3I8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3IKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3IjZ2V0V29ya1Byb2R1Y3QgPGVtPldvcmsgUHJvZHVjdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPldvcmsgUHJvZHVjdDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvciNnZXRXb3JrUHJvZHVjdCgpCi0JICogQHNlZSAjZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JfV29ya1Byb2R1Y3QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yI2dldFJlc3BvbnNpYmxlUm9sZSA8ZW0+UmVzcG9uc2libGUgUm9sZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlJlc3BvbnNpYmxlIFJvbGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3IjZ2V0UmVzcG9uc2libGVSb2xlKCkKLQkgKiBAc2VlICNnZXRXb3JrUHJvZHVjdERlc2NyaXB0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9SZXNwb25zaWJsZVJvbGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3IjZ2V0R3JvdXAyIDxlbT5Hcm91cDI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPkdyb3VwMjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvciNnZXRHcm91cDIoKQotCSAqIEBzZWUgI2dldFdvcmtQcm9kdWN0RGVzY3JpcHRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX0dyb3VwMigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvciNnZXRFeHRlcm5hbElucHV0VG8gPGVtPkV4dGVybmFsIElucHV0IFRvPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5FeHRlcm5hbCBJbnB1dCBUbzwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvciNnZXRFeHRlcm5hbElucHV0VG8oKQotCSAqIEBzZWUgI2dldFdvcmtQcm9kdWN0RGVzY3JpcHRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX0V4dGVybmFsSW5wdXRUbygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvciNnZXRJbXBhY3RlZEJ5IDxlbT5JbXBhY3RlZCBCeTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+SW1wYWN0ZWQgQnk8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3IjZ2V0SW1wYWN0ZWRCeSgpCi0JICogQHNlZSAjZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JfSW1wYWN0ZWRCeSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvciNnZXRJbXBhY3RzIDxlbT5JbXBhY3RzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5JbXBhY3RzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yI2dldEltcGFjdHMoKQotCSAqIEBzZWUgI2dldFdvcmtQcm9kdWN0RGVzY3JpcHRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX0ltcGFjdHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3IjZ2V0TWFuZGF0b3J5SW5wdXRUbyA8ZW0+TWFuZGF0b3J5IElucHV0IFRvPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5NYW5kYXRvcnkgSW5wdXQgVG88L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3IjZ2V0TWFuZGF0b3J5SW5wdXRUbygpCi0JICogQHNlZSAjZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JfTWFuZGF0b3J5SW5wdXRUbygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvciNnZXRPcHRpb25hbElucHV0VG8gPGVtPk9wdGlvbmFsIElucHV0IFRvPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5PcHRpb25hbCBJbnB1dCBUbzwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvciNnZXRPcHRpb25hbElucHV0VG8oKQotCSAqIEBzZWUgI2dldFdvcmtQcm9kdWN0RGVzY3JpcHRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX09wdGlvbmFsSW5wdXRUbygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvciNnZXRPdXRwdXRGcm9tIDxlbT5PdXRwdXQgRnJvbTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+T3V0cHV0IEZyb208L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3IjZ2V0T3V0cHV0RnJvbSgpCi0JICogQHNlZSAjZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JfT3V0cHV0RnJvbSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvciNnZXREZWxpdmVyYWJsZVBhcnRzIDxlbT5EZWxpdmVyYWJsZSBQYXJ0czwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+RGVsaXZlcmFibGUgUGFydHM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3IjZ2V0RGVsaXZlcmFibGVQYXJ0cygpCi0JICogQHNlZSAjZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JfRGVsaXZlcmFibGVQYXJ0cygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3IjZ2V0QWN0aXZpdHlFbnRyeVN0YXRlIDxlbT5BY3Rpdml0eSBFbnRyeSBTdGF0ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkFjdGl2aXR5IEVudHJ5IFN0YXRlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yI2dldEFjdGl2aXR5RW50cnlTdGF0ZSgpCi0JICogQHNlZSAjZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JfQWN0aXZpdHlFbnRyeVN0YXRlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvciNnZXRBY3Rpdml0eUV4aXRTdGF0ZSA8ZW0+QWN0aXZpdHkgRXhpdCBTdGF0ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkFjdGl2aXR5IEV4aXQgU3RhdGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3IjZ2V0QWN0aXZpdHlFeGl0U3RhdGUoKQotCSAqIEBzZWUgI2dldFdvcmtQcm9kdWN0RGVzY3JpcHRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX0FjdGl2aXR5RXhpdFN0YXRlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdFR5cGUgPGVtPldvcmsgUHJvZHVjdCBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPldvcmsgUHJvZHVjdCBUeXBlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya1Byb2R1Y3RUeXBlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRXb3JrUHJvZHVjdFR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdFR5cGUjZ2V0R3JvdXAyIDxlbT5Hcm91cDI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPkdyb3VwMjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtQcm9kdWN0VHlwZSNnZXRHcm91cDIoKQotCSAqIEBzZWUgI2dldFdvcmtQcm9kdWN0VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0V29ya1Byb2R1Y3RUeXBlX0dyb3VwMigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtQcm9kdWN0VHlwZSNnZXRXb3JrUHJvZHVjdCA8ZW0+V29yayBQcm9kdWN0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5Xb3JrIFByb2R1Y3Q8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdFR5cGUjZ2V0V29ya1Byb2R1Y3QoKQotCSAqIEBzZWUgI2dldFdvcmtQcm9kdWN0VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0V29ya1Byb2R1Y3RUeXBlX1dvcmtQcm9kdWN0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZW51bSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlZhcmlhYmlsaXR5VHlwZSA8ZW0+VmFyaWFiaWxpdHkgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZW51bSAnPGVtPlZhcmlhYmlsaXR5IFR5cGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5WYXJpYWJpbGl0eVR5cGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUVudW0gZ2V0VmFyaWFiaWxpdHlUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZW51bSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtPcmRlclR5cGUgPGVtPldvcmsgT3JkZXIgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZW51bSAnPGVtPldvcmsgT3JkZXIgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtPcmRlclR5cGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUVudW0gZ2V0V29ya09yZGVyVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlZhcmlhYmlsaXR5VHlwZSA8ZW0+VmFyaWFiaWxpdHkgVHlwZSBPYmplY3Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPlZhcmlhYmlsaXR5IFR5cGUgT2JqZWN0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVmFyaWFiaWxpdHlUeXBlCi0JICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9Im9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlZhcmlhYmlsaXR5VHlwZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nVmFyaWFiaWxpdHlUeXBlOk9iamVjdCcgYmFzZVR5cGU9J1ZhcmlhYmlsaXR5VHlwZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXRWYXJpYWJpbGl0eVR5cGVPYmplY3QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrT3JkZXJUeXBlIDxlbT5Xb3JrIE9yZGVyIFR5cGUgT2JqZWN0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5Xb3JrIE9yZGVyIFR5cGUgT2JqZWN0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya09yZGVyVHlwZQotCSAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrT3JkZXJUeXBlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdXb3JrT3JkZXJUeXBlOk9iamVjdCcgYmFzZVR5cGU9J1dvcmtPcmRlclR5cGUnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRGF0YVR5cGUgZ2V0V29ya09yZGVyVHlwZU9iamVjdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZmFjdG9yeSB0aGF0IGNyZWF0ZXMgdGhlIGluc3RhbmNlcyBvZiB0aGUgbW9kZWwuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBmYWN0b3J5IHRoYXQgY3JlYXRlcyB0aGUgaW5zdGFuY2VzIG9mIHRoZSBtb2RlbC4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JVW1hRmFjdG9yeSBnZXRVbWFGYWN0b3J5KCk7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIERlZmluZXMgbGl0ZXJhbHMgZm9yIHRoZSBtZXRhIG9iamVjdHMgdGhhdCByZXByZXNlbnQKLQkgKiA8dWw+Ci0JICogICA8bGk+ZWFjaCBjbGFzcyw8L2xpPgotCSAqICAgPGxpPmVhY2ggZmVhdHVyZSBvZiBlYWNoIGNsYXNzLDwvbGk+Ci0JICogICA8bGk+ZWFjaCBlbnVtLDwvbGk+Ci0JICogICA8bGk+YW5kIGVhY2ggZGF0YSB0eXBlPC9saT4KLQkgKiA8L3VsPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnRlcmZhY2UgTGl0ZXJhbHMgIHsKLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkFjdGl2aXR5SW1wbCA8ZW0+QWN0aXZpdHk8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkFjdGl2aXR5SW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0QWN0aXZpdHkoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgQUNUSVZJVFkgPSBlSU5TVEFOQ0UuZ2V0QWN0aXZpdHkoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlByZWNvbmRpdGlvbjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEFDVElWSVRZX19QUkVDT05ESVRJT04gPSBlSU5TVEFOQ0UuZ2V0QWN0aXZpdHlfUHJlY29uZGl0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Qb3N0Y29uZGl0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgQUNUSVZJVFlfX1BPU1RDT05ESVRJT04gPSBlSU5TVEFOQ0UuZ2V0QWN0aXZpdHlfUG9zdGNvbmRpdGlvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBBQ1RJVklUWV9fR1JPVVAzID0gZUlOU1RBTkNFLmdldEFjdGl2aXR5X0dyb3VwMygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+QnJlYWtkb3duIEVsZW1lbnQ8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIEFDVElWSVRZX19CUkVBS0RPV05fRUxFTUVOVCA9IGVJTlNUQU5DRS5nZXRBY3Rpdml0eV9CcmVha2Rvd25FbGVtZW50KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Sb2FkbWFwPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBBQ1RJVklUWV9fUk9BRE1BUCA9IGVJTlNUQU5DRS5nZXRBY3Rpdml0eV9Sb2FkbWFwKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JcyBFbmFjdGFibGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBBQ1RJVklUWV9fSVNfRU5BQ1RBQkxFID0gZUlOU1RBTkNFLmdldEFjdGl2aXR5X0lzRW5hY3RhYmxlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgQUNUSVZJVFlfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQgPSBlSU5TVEFOQ0UuZ2V0QWN0aXZpdHlfVmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEFDVElWSVRZX19WQVJJQUJJTElUWV9UWVBFID0gZUlOU1RBTkNFLmdldEFjdGl2aXR5X1ZhcmlhYmlsaXR5VHlwZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5BY3Rpdml0eURlc2NyaXB0aW9uSW1wbCA8ZW0+QWN0aXZpdHkgRGVzY3JpcHRpb248L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkFjdGl2aXR5RGVzY3JpcHRpb25JbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRBY3Rpdml0eURlc2NyaXB0aW9uKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIEFDVElWSVRZX0RFU0NSSVBUSU9OID0gZUlOU1RBTkNFLmdldEFjdGl2aXR5RGVzY3JpcHRpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkFsdGVybmF0aXZlczwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEFDVElWSVRZX0RFU0NSSVBUSU9OX19BTFRFUk5BVElWRVMgPSBlSU5TVEFOQ0UuZ2V0QWN0aXZpdHlEZXNjcmlwdGlvbl9BbHRlcm5hdGl2ZXMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkhvdyBUbyBTdGFmZjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEFDVElWSVRZX0RFU0NSSVBUSU9OX19IT1dfVE9fU1RBRkYgPSBlSU5TVEFOQ0UuZ2V0QWN0aXZpdHlEZXNjcmlwdGlvbl9Ib3dUb1N0YWZmKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5QdXJwb3NlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgQUNUSVZJVFlfREVTQ1JJUFRJT05fX1BVUlBPU0UgPSBlSU5TVEFOQ0UuZ2V0QWN0aXZpdHlEZXNjcmlwdGlvbl9QdXJwb3NlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvSW1wbCA8ZW0+QXBwbGljYWJsZSBNZXRhIENsYXNzIEluZm88L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0QXBwbGljYWJsZU1ldGFDbGFzc0luZm8oKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgQVBQTElDQUJMRV9NRVRBX0NMQVNTX0lORk8gPSBlSU5TVEFOQ0UuZ2V0QXBwbGljYWJsZU1ldGFDbGFzc0luZm8oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPklzIFByaW1hcnkgRXh0ZW5zaW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgQVBQTElDQUJMRV9NRVRBX0NMQVNTX0lORk9fX0lTX1BSSU1BUllfRVhURU5TSU9OID0gZUlOU1RBTkNFLmdldEFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvX0lzUHJpbWFyeUV4dGVuc2lvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5BcnRpZmFjdEltcGwgPGVtPkFydGlmYWN0PC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5BcnRpZmFjdEltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldEFydGlmYWN0KCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIEFSVElGQUNUID0gZUlOU1RBTkNFLmdldEFydGlmYWN0KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Hcm91cDM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEFSVElGQUNUX19HUk9VUDMgPSBlSU5TVEFOQ0UuZ2V0QXJ0aWZhY3RfR3JvdXAzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Db250YWluZWQgQXJ0aWZhY3Q8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIEFSVElGQUNUX19DT05UQUlORURfQVJUSUZBQ1QgPSBlSU5TVEFOQ0UuZ2V0QXJ0aWZhY3RfQ29udGFpbmVkQXJ0aWZhY3QoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQXJ0aWZhY3REZXNjcmlwdGlvbkltcGwgPGVtPkFydGlmYWN0IERlc2NyaXB0aW9uPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5BcnRpZmFjdERlc2NyaXB0aW9uSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0QXJ0aWZhY3REZXNjcmlwdGlvbigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBBUlRJRkFDVF9ERVNDUklQVElPTiA9IGVJTlNUQU5DRS5nZXRBcnRpZmFjdERlc2NyaXB0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5CcmllZiBPdXRsaW5lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgQVJUSUZBQ1RfREVTQ1JJUFRJT05fX0JSSUVGX09VVExJTkUgPSBlSU5TVEFOQ0UuZ2V0QXJ0aWZhY3REZXNjcmlwdGlvbl9CcmllZk91dGxpbmUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlJlcHJlc2VudGF0aW9uIE9wdGlvbnM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBBUlRJRkFDVF9ERVNDUklQVElPTl9fUkVQUkVTRU5UQVRJT05fT1BUSU9OUyA9IGVJTlNUQU5DRS5nZXRBcnRpZmFjdERlc2NyaXB0aW9uX1JlcHJlc2VudGF0aW9uT3B0aW9ucygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UmVwcmVzZW50YXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBBUlRJRkFDVF9ERVNDUklQVElPTl9fUkVQUkVTRU5UQVRJT04gPSBlSU5TVEFOQ0UuZ2V0QXJ0aWZhY3REZXNjcmlwdGlvbl9SZXByZXNlbnRhdGlvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Tm90YXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBBUlRJRkFDVF9ERVNDUklQVElPTl9fTk9UQVRJT04gPSBlSU5TVEFOQ0UuZ2V0QXJ0aWZhY3REZXNjcmlwdGlvbl9Ob3RhdGlvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5CcmVha2Rvd25FbGVtZW50SW1wbCA8ZW0+QnJlYWtkb3duIEVsZW1lbnQ8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkJyZWFrZG93bkVsZW1lbnRJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRCcmVha2Rvd25FbGVtZW50KCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIEJSRUFLRE9XTl9FTEVNRU5UID0gZUlOU1RBTkNFLmdldEJyZWFrZG93bkVsZW1lbnQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRlZCBBZnRlcjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEJSRUFLRE9XTl9FTEVNRU5UX19QUkVTRU5URURfQUZURVIgPSBlSU5TVEFOQ0UuZ2V0QnJlYWtkb3duRWxlbWVudF9QcmVzZW50ZWRBZnRlcigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGVkIEJlZm9yZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEJSRUFLRE9XTl9FTEVNRU5UX19QUkVTRU5URURfQkVGT1JFID0gZUlOU1RBTkNFLmdldEJyZWFrZG93bkVsZW1lbnRfUHJlc2VudGVkQmVmb3JlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5QbGFubmluZyBEYXRhPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgQlJFQUtET1dOX0VMRU1FTlRfX1BMQU5OSU5HX0RBVEEgPSBlSU5TVEFOQ0UuZ2V0QnJlYWtkb3duRWxlbWVudF9QbGFubmluZ0RhdGEoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlN1cGVyIEFjdGl2aXR5PC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgQlJFQUtET1dOX0VMRU1FTlRfX1NVUEVSX0FDVElWSVRZID0gZUlOU1RBTkNFLmdldEJyZWFrZG93bkVsZW1lbnRfU3VwZXJBY3Rpdml0eSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAxPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBCUkVBS0RPV05fRUxFTUVOVF9fR1JPVVAxID0gZUlOU1RBTkNFLmdldEJyZWFrZG93bkVsZW1lbnRfR3JvdXAxKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5DaGVja2xpc3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEJSRUFLRE9XTl9FTEVNRU5UX19DSEVDS0xJU1QgPSBlSU5TVEFOQ0UuZ2V0QnJlYWtkb3duRWxlbWVudF9DaGVja2xpc3QoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkNvbmNlcHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEJSRUFLRE9XTl9FTEVNRU5UX19DT05DRVBUID0gZUlOU1RBTkNFLmdldEJyZWFrZG93bkVsZW1lbnRfQ29uY2VwdCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RXhhbXBsZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgQlJFQUtET1dOX0VMRU1FTlRfX0VYQU1QTEUgPSBlSU5TVEFOQ0UuZ2V0QnJlYWtkb3duRWxlbWVudF9FeGFtcGxlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5HdWlkZWxpbmU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEJSRUFLRE9XTl9FTEVNRU5UX19HVUlERUxJTkUgPSBlSU5TVEFOQ0UuZ2V0QnJlYWtkb3duRWxlbWVudF9HdWlkZWxpbmUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlJldXNhYmxlIEFzc2V0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBCUkVBS0RPV05fRUxFTUVOVF9fUkVVU0FCTEVfQVNTRVQgPSBlSU5TVEFOQ0UuZ2V0QnJlYWtkb3duRWxlbWVudF9SZXVzYWJsZUFzc2V0KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TdXBwb3J0aW5nIE1hdGVyaWFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBCUkVBS0RPV05fRUxFTUVOVF9fU1VQUE9SVElOR19NQVRFUklBTCA9IGVJTlNUQU5DRS5nZXRCcmVha2Rvd25FbGVtZW50X1N1cHBvcnRpbmdNYXRlcmlhbCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+V2hpdGVwYXBlcjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgQlJFQUtET1dOX0VMRU1FTlRfX1dISVRFUEFQRVIgPSBlSU5TVEFOQ0UuZ2V0QnJlYWtkb3duRWxlbWVudF9XaGl0ZXBhcGVyKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5IYXMgTXVsdGlwbGUgT2NjdXJyZW5jZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBCUkVBS0RPV05fRUxFTUVOVF9fSEFTX01VTFRJUExFX09DQ1VSUkVOQ0VTID0gZUlOU1RBTkNFLmdldEJyZWFrZG93bkVsZW1lbnRfSGFzTXVsdGlwbGVPY2N1cnJlbmNlcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SXMgT3B0aW9uYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBCUkVBS0RPV05fRUxFTUVOVF9fSVNfT1BUSU9OQUwgPSBlSU5TVEFOQ0UuZ2V0QnJlYWtkb3duRWxlbWVudF9Jc09wdGlvbmFsKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JcyBQbGFubmVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgQlJFQUtET1dOX0VMRU1FTlRfX0lTX1BMQU5ORUQgPSBlSU5TVEFOQ0UuZ2V0QnJlYWtkb3duRWxlbWVudF9Jc1BsYW5uZWQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlByZWZpeDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEJSRUFLRE9XTl9FTEVNRU5UX19QUkVGSVggPSBlSU5TVEFOQ0UuZ2V0QnJlYWtkb3duRWxlbWVudF9QcmVmaXgoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uSW1wbCA8ZW0+QnJlYWtkb3duIEVsZW1lbnQgRGVzY3JpcHRpb248L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbkltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldEJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTiA9IGVJTlNUQU5DRS5nZXRCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlVzYWdlIEd1aWRhbmNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX1VTQUdFX0dVSURBTkNFID0gZUlOU1RBTkNFLmdldEJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbl9Vc2FnZUd1aWRhbmNlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkNhcGFiaWxpdHlQYXR0ZXJuSW1wbCA8ZW0+Q2FwYWJpbGl0eSBQYXR0ZXJuPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5DYXBhYmlsaXR5UGF0dGVybkltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldENhcGFiaWxpdHlQYXR0ZXJuKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIENBUEFCSUxJVFlfUEFUVEVSTiA9IGVJTlNUQU5DRS5nZXRDYXBhYmlsaXR5UGF0dGVybigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5DaGVja2xpc3RJbXBsIDxlbT5DaGVja2xpc3Q8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkNoZWNrbGlzdEltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldENoZWNrbGlzdCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBDSEVDS0xJU1QgPSBlSU5TVEFOQ0UuZ2V0Q2hlY2tsaXN0KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkNvbXBvc2l0ZVJvbGVJbXBsIDxlbT5Db21wb3NpdGUgUm9sZTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQ29tcG9zaXRlUm9sZUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldENvbXBvc2l0ZVJvbGUoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgQ09NUE9TSVRFX1JPTEUgPSBlSU5TVEFOQ0UuZ2V0Q29tcG9zaXRlUm9sZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBDT01QT1NJVEVfUk9MRV9fR1JPVVAyID0gZUlOU1RBTkNFLmdldENvbXBvc2l0ZVJvbGVfR3JvdXAyKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5BZ2dyZWdhdGVkIFJvbGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIENPTVBPU0lURV9ST0xFX19BR0dSRUdBVEVEX1JPTEUgPSBlSU5TVEFOQ0UuZ2V0Q29tcG9zaXRlUm9sZV9BZ2dyZWdhdGVkUm9sZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Db25jZXB0SW1wbCA8ZW0+Q29uY2VwdDwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQ29uY2VwdEltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldENvbmNlcHQoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgQ09OQ0VQVCA9IGVJTlNUQU5DRS5nZXRDb25jZXB0KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkNvbnN0cmFpbnRJbXBsIDxlbT5Db25zdHJhaW50PC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Db25zdHJhaW50SW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0Q29uc3RyYWludCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBDT05TVFJBSU5UID0gZUlOU1RBTkNFLmdldENvbnN0cmFpbnQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk1haW4gRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBDT05TVFJBSU5UX19NQUlOX0RFU0NSSVBUSU9OID0gZUlOU1RBTkNFLmdldENvbnN0cmFpbnRfTWFpbkRlc2NyaXB0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkNvbnRlbnRDYXRlZ29yeUltcGwgPGVtPkNvbnRlbnQgQ2F0ZWdvcnk8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkNvbnRlbnRDYXRlZ29yeUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldENvbnRlbnRDYXRlZ29yeSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBDT05URU5UX0NBVEVHT1JZID0gZUlOU1RBTkNFLmdldENvbnRlbnRDYXRlZ29yeSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Db250ZW50Q2F0ZWdvcnlQYWNrYWdlSW1wbCA8ZW0+Q29udGVudCBDYXRlZ29yeSBQYWNrYWdlPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Db250ZW50Q2F0ZWdvcnlQYWNrYWdlSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0Q29udGVudENhdGVnb3J5UGFja2FnZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBDT05URU5UX0NBVEVHT1JZX1BBQ0tBR0UgPSBlSU5TVEFOQ0UuZ2V0Q29udGVudENhdGVnb3J5UGFja2FnZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBDT05URU5UX0NBVEVHT1JZX1BBQ0tBR0VfX0dST1VQMiA9IGVJTlNUQU5DRS5nZXRDb250ZW50Q2F0ZWdvcnlQYWNrYWdlX0dyb3VwMigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Q29udGVudCBDYXRlZ29yeTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgQ09OVEVOVF9DQVRFR09SWV9QQUNLQUdFX19DT05URU5UX0NBVEVHT1JZID0gZUlOU1RBTkNFLmdldENvbnRlbnRDYXRlZ29yeVBhY2thZ2VfQ29udGVudENhdGVnb3J5KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkNvbnRlbnREZXNjcmlwdGlvbkltcGwgPGVtPkNvbnRlbnQgRGVzY3JpcHRpb248L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkNvbnRlbnREZXNjcmlwdGlvbkltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldENvbnRlbnREZXNjcmlwdGlvbigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBDT05URU5UX0RFU0NSSVBUSU9OID0gZUlOU1RBTkNFLmdldENvbnRlbnREZXNjcmlwdGlvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TWFpbiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIENPTlRFTlRfREVTQ1JJUFRJT05fX01BSU5fREVTQ1JJUFRJT04gPSBlSU5TVEFOQ0UuZ2V0Q29udGVudERlc2NyaXB0aW9uX01haW5EZXNjcmlwdGlvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+S2V5IENvbnNpZGVyYXRpb25zPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgQ09OVEVOVF9ERVNDUklQVElPTl9fS0VZX0NPTlNJREVSQVRJT05TID0gZUlOU1RBTkNFLmdldENvbnRlbnREZXNjcmlwdGlvbl9LZXlDb25zaWRlcmF0aW9ucygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U2VjdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgQ09OVEVOVF9ERVNDUklQVElPTl9fU0VDVElPTiA9IGVJTlNUQU5DRS5nZXRDb250ZW50RGVzY3JpcHRpb25fU2VjdGlvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RXh0ZXJuYWwgSWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBDT05URU5UX0RFU0NSSVBUSU9OX19FWFRFUk5BTF9JRCA9IGVJTlNUQU5DRS5nZXRDb250ZW50RGVzY3JpcHRpb25fRXh0ZXJuYWxJZCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Db250ZW50RWxlbWVudEltcGwgPGVtPkNvbnRlbnQgRWxlbWVudDwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQ29udGVudEVsZW1lbnRJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRDb250ZW50RWxlbWVudCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBDT05URU5UX0VMRU1FTlQgPSBlSU5TVEFOQ0UuZ2V0Q29udGVudEVsZW1lbnQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgQ09OVEVOVF9FTEVNRU5UX19HUk9VUDEgPSBlSU5TVEFOQ0UuZ2V0Q29udGVudEVsZW1lbnRfR3JvdXAxKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5DaGVja2xpc3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIENPTlRFTlRfRUxFTUVOVF9fQ0hFQ0tMSVNUID0gZUlOU1RBTkNFLmdldENvbnRlbnRFbGVtZW50X0NoZWNrbGlzdCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Q29uY2VwdDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgQ09OVEVOVF9FTEVNRU5UX19DT05DRVBUID0gZUlOU1RBTkNFLmdldENvbnRlbnRFbGVtZW50X0NvbmNlcHQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkV4YW1wbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIENPTlRFTlRfRUxFTUVOVF9fRVhBTVBMRSA9IGVJTlNUQU5DRS5nZXRDb250ZW50RWxlbWVudF9FeGFtcGxlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5HdWlkZWxpbmU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIENPTlRFTlRfRUxFTUVOVF9fR1VJREVMSU5FID0gZUlOU1RBTkNFLmdldENvbnRlbnRFbGVtZW50X0d1aWRlbGluZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UmV1c2FibGUgQXNzZXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIENPTlRFTlRfRUxFTUVOVF9fUkVVU0FCTEVfQVNTRVQgPSBlSU5TVEFOQ0UuZ2V0Q29udGVudEVsZW1lbnRfUmV1c2FibGVBc3NldCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U3VwcG9ydGluZyBNYXRlcmlhbDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgQ09OVEVOVF9FTEVNRU5UX19TVVBQT1JUSU5HX01BVEVSSUFMID0gZUlOU1RBTkNFLmdldENvbnRlbnRFbGVtZW50X1N1cHBvcnRpbmdNYXRlcmlhbCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+V2hpdGVwYXBlcjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgQ09OVEVOVF9FTEVNRU5UX19XSElURVBBUEVSID0gZUlOU1RBTkNFLmdldENvbnRlbnRFbGVtZW50X1doaXRlcGFwZXIoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBDT05URU5UX0VMRU1FTlRfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQgPSBlSU5TVEFOQ0UuZ2V0Q29udGVudEVsZW1lbnRfVmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIENPTlRFTlRfRUxFTUVOVF9fVkFSSUFCSUxJVFlfVFlQRSA9IGVJTlNUQU5DRS5nZXRDb250ZW50RWxlbWVudF9WYXJpYWJpbGl0eVR5cGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQ29udGVudFBhY2thZ2VJbXBsIDxlbT5Db250ZW50IFBhY2thZ2U8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkNvbnRlbnRQYWNrYWdlSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0Q29udGVudFBhY2thZ2UoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgQ09OVEVOVF9QQUNLQUdFID0gZUlOU1RBTkNFLmdldENvbnRlbnRQYWNrYWdlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Hcm91cDI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIENPTlRFTlRfUEFDS0FHRV9fR1JPVVAyID0gZUlOU1RBTkNFLmdldENvbnRlbnRQYWNrYWdlX0dyb3VwMigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Q29udGVudCBFbGVtZW50PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBDT05URU5UX1BBQ0tBR0VfX0NPTlRFTlRfRUxFTUVOVCA9IGVJTlNUQU5DRS5nZXRDb250ZW50UGFja2FnZV9Db250ZW50RWxlbWVudCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5DdXN0b21DYXRlZ29yeUltcGwgPGVtPkN1c3RvbSBDYXRlZ29yeTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQ3VzdG9tQ2F0ZWdvcnlJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRDdXN0b21DYXRlZ29yeSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBDVVNUT01fQ0FURUdPUlkgPSBlSU5TVEFOQ0UuZ2V0Q3VzdG9tQ2F0ZWdvcnkoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgQ1VTVE9NX0NBVEVHT1JZX19HUk9VUDIgPSBlSU5TVEFOQ0UuZ2V0Q3VzdG9tQ2F0ZWdvcnlfR3JvdXAyKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5DYXRlZ29yaXplZCBFbGVtZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBDVVNUT01fQ0FURUdPUllfX0NBVEVHT1JJWkVEX0VMRU1FTlQgPSBlSU5TVEFOQ0UuZ2V0Q3VzdG9tQ2F0ZWdvcnlfQ2F0ZWdvcml6ZWRFbGVtZW50KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TdWIgQ2F0ZWdvcnk8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIENVU1RPTV9DQVRFR09SWV9fU1VCX0NBVEVHT1JZID0gZUlOU1RBTkNFLmdldEN1c3RvbUNhdGVnb3J5X1N1YkNhdGVnb3J5KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkRlbGl2ZXJhYmxlSW1wbCA8ZW0+RGVsaXZlcmFibGU8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkRlbGl2ZXJhYmxlSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0RGVsaXZlcmFibGUoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgREVMSVZFUkFCTEUgPSBlSU5TVEFOQ0UuZ2V0RGVsaXZlcmFibGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMzwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgREVMSVZFUkFCTEVfX0dST1VQMyA9IGVJTlNUQU5DRS5nZXREZWxpdmVyYWJsZV9Hcm91cDMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkRlbGl2ZXJlZCBXb3JrIFByb2R1Y3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIERFTElWRVJBQkxFX19ERUxJVkVSRURfV09SS19QUk9EVUNUID0gZUlOU1RBTkNFLmdldERlbGl2ZXJhYmxlX0RlbGl2ZXJlZFdvcmtQcm9kdWN0KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkRlbGl2ZXJhYmxlRGVzY3JpcHRpb25JbXBsIDxlbT5EZWxpdmVyYWJsZSBEZXNjcmlwdGlvbjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuRGVsaXZlcmFibGVEZXNjcmlwdGlvbkltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldERlbGl2ZXJhYmxlRGVzY3JpcHRpb24oKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgREVMSVZFUkFCTEVfREVTQ1JJUFRJT04gPSBlSU5TVEFOQ0UuZ2V0RGVsaXZlcmFibGVEZXNjcmlwdGlvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RXh0ZXJuYWwgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBERUxJVkVSQUJMRV9ERVNDUklQVElPTl9fRVhURVJOQUxfREVTQ1JJUFRJT04gPSBlSU5TVEFOQ0UuZ2V0RGVsaXZlcmFibGVEZXNjcmlwdGlvbl9FeHRlcm5hbERlc2NyaXB0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5QYWNrYWdpbmcgR3VpZGFuY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBERUxJVkVSQUJMRV9ERVNDUklQVElPTl9fUEFDS0FHSU5HX0dVSURBTkNFID0gZUlOU1RBTkNFLmdldERlbGl2ZXJhYmxlRGVzY3JpcHRpb25fUGFja2FnaW5nR3VpZGFuY2UoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuRGVsaXZlcnlQcm9jZXNzSW1wbCA8ZW0+RGVsaXZlcnkgUHJvY2VzczwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuRGVsaXZlcnlQcm9jZXNzSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0RGVsaXZlcnlQcm9jZXNzKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIERFTElWRVJZX1BST0NFU1MgPSBlSU5TVEFOQ0UuZ2V0RGVsaXZlcnlQcm9jZXNzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Hcm91cDQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIERFTElWRVJZX1BST0NFU1NfX0dST1VQNCA9IGVJTlNUQU5DRS5nZXREZWxpdmVyeVByb2Nlc3NfR3JvdXA0KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Db21tdW5pY2F0aW9ucyBNYXRlcmlhbDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgREVMSVZFUllfUFJPQ0VTU19fQ09NTVVOSUNBVElPTlNfTUFURVJJQUwgPSBlSU5TVEFOQ0UuZ2V0RGVsaXZlcnlQcm9jZXNzX0NvbW11bmljYXRpb25zTWF0ZXJpYWwoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkVkdWNhdGlvbiBNYXRlcmlhbDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgREVMSVZFUllfUFJPQ0VTU19fRURVQ0FUSU9OX01BVEVSSUFMID0gZUlOU1RBTkNFLmdldERlbGl2ZXJ5UHJvY2Vzc19FZHVjYXRpb25NYXRlcmlhbCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbkltcGwgPGVtPkRlbGl2ZXJ5IFByb2Nlc3MgRGVzY3JpcHRpb248L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24oKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTiA9IGVJTlNUQU5DRS5nZXREZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U2NhbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19TQ0FMRSA9IGVJTlNUQU5DRS5nZXREZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl9TY2FsZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UHJvamVjdCBDaGFyYWN0ZXJpc3RpY3M8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19QUk9KRUNUX0NIQVJBQ1RFUklTVElDUyA9IGVJTlNUQU5DRS5nZXREZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl9Qcm9qZWN0Q2hhcmFjdGVyaXN0aWNzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5SaXNrIExldmVsPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fUklTS19MRVZFTCA9IGVJTlNUQU5DRS5nZXREZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl9SaXNrTGV2ZWwoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkVzdGltYXRpbmcgVGVjaG5pcXVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fRVNUSU1BVElOR19URUNITklRVUUgPSBlSU5TVEFOQ0UuZ2V0RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fRXN0aW1hdGluZ1RlY2huaXF1ZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UHJvamVjdCBNZW1iZXIgRXhwZXJ0aXNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fUFJPSkVDVF9NRU1CRVJfRVhQRVJUSVNFID0gZUlOU1RBTkNFLmdldERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX1Byb2plY3RNZW1iZXJFeHBlcnRpc2UoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlR5cGUgT2YgQ29udHJhY3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19UWVBFX09GX0NPTlRSQUNUID0gZUlOU1RBTkNFLmdldERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX1R5cGVPZkNvbnRyYWN0KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkRlc2NyaWJhYmxlRWxlbWVudEltcGwgPGVtPkRlc2NyaWJhYmxlIEVsZW1lbnQ8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkRlc2NyaWJhYmxlRWxlbWVudEltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldERlc2NyaWJhYmxlRWxlbWVudCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBERVNDUklCQUJMRV9FTEVNRU5UID0gZUlOU1RBTkNFLmdldERlc2NyaWJhYmxlRWxlbWVudCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgREVTQ1JJQkFCTEVfRUxFTUVOVF9fUFJFU0VOVEFUSU9OID0gZUlOU1RBTkNFLmdldERlc2NyaWJhYmxlRWxlbWVudF9QcmVzZW50YXRpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkZ1bGZpbGw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIERFU0NSSUJBQkxFX0VMRU1FTlRfX0ZVTEZJTEwgPSBlSU5TVEFOQ0UuZ2V0RGVzY3JpYmFibGVFbGVtZW50X0Z1bGZpbGwoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPklzIEFic3RyYWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgREVTQ1JJQkFCTEVfRUxFTUVOVF9fSVNfQUJTVFJBQ1QgPSBlSU5TVEFOQ0UuZ2V0RGVzY3JpYmFibGVFbGVtZW50X0lzQWJzdHJhY3QoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk5vZGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgREVTQ1JJQkFCTEVfRUxFTUVOVF9fTk9ERUlDT04gPSBlSU5TVEFOQ0UuZ2V0RGVzY3JpYmFibGVFbGVtZW50X05vZGVpY29uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TaGFwZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBERVNDUklCQUJMRV9FTEVNRU5UX19TSEFQRUlDT04gPSBlSU5TVEFOQ0UuZ2V0RGVzY3JpYmFibGVFbGVtZW50X1NoYXBlaWNvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5EZXNjcmlwdG9ySW1wbCA8ZW0+RGVzY3JpcHRvcjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuRGVzY3JpcHRvckltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldERlc2NyaXB0b3IoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgREVTQ1JJUFRPUiA9IGVJTlNUQU5DRS5nZXREZXNjcmlwdG9yKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JcyBTeW5jaHJvbml6ZWQgV2l0aCBTb3VyY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBERVNDUklQVE9SX19JU19TWU5DSFJPTklaRURfV0lUSF9TT1VSQ0UgPSBlSU5TVEFOQ0UuZ2V0RGVzY3JpcHRvcl9Jc1N5bmNocm9uaXplZFdpdGhTb3VyY2UoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuRGVzY3JpcHRvckRlc2NyaXB0aW9uSW1wbCA8ZW0+RGVzY3JpcHRvciBEZXNjcmlwdGlvbjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuRGVzY3JpcHRvckRlc2NyaXB0aW9uSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0RGVzY3JpcHRvckRlc2NyaXB0aW9uKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIERFU0NSSVBUT1JfREVTQ1JJUFRJT04gPSBlSU5TVEFOQ0UuZ2V0RGVzY3JpcHRvckRlc2NyaXB0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5SZWZpbmVkIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgREVTQ1JJUFRPUl9ERVNDUklQVElPTl9fUkVGSU5FRF9ERVNDUklQVElPTiA9IGVJTlNUQU5DRS5nZXREZXNjcmlwdG9yRGVzY3JpcHRpb25fUmVmaW5lZERlc2NyaXB0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkRpc2NpcGxpbmVJbXBsIDxlbT5EaXNjaXBsaW5lPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5EaXNjaXBsaW5lSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0RGlzY2lwbGluZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBESVNDSVBMSU5FID0gZUlOU1RBTkNFLmdldERpc2NpcGxpbmUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgRElTQ0lQTElORV9fR1JPVVAyID0gZUlOU1RBTkNFLmdldERpc2NpcGxpbmVfR3JvdXAyKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5UYXNrPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBESVNDSVBMSU5FX19UQVNLID0gZUlOU1RBTkNFLmdldERpc2NpcGxpbmVfVGFzaygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U3ViIERpc2NpcGxpbmU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIERJU0NJUExJTkVfX1NVQl9ESVNDSVBMSU5FID0gZUlOU1RBTkNFLmdldERpc2NpcGxpbmVfU3ViRGlzY2lwbGluZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UmVmZXJlbmNlIFdvcmtmbG93PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBESVNDSVBMSU5FX19SRUZFUkVOQ0VfV09SS0ZMT1cgPSBlSU5TVEFOQ0UuZ2V0RGlzY2lwbGluZV9SZWZlcmVuY2VXb3JrZmxvdygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5EaXNjaXBsaW5lR3JvdXBpbmdJbXBsIDxlbT5EaXNjaXBsaW5lIEdyb3VwaW5nPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5EaXNjaXBsaW5lR3JvdXBpbmdJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXREaXNjaXBsaW5lR3JvdXBpbmcoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgRElTQ0lQTElORV9HUk9VUElORyA9IGVJTlNUQU5DRS5nZXREaXNjaXBsaW5lR3JvdXBpbmcoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgRElTQ0lQTElORV9HUk9VUElOR19fR1JPVVAyID0gZUlOU1RBTkNFLmdldERpc2NpcGxpbmVHcm91cGluZ19Hcm91cDIoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkRpc2NpcGxpbmU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIERJU0NJUExJTkVfR1JPVVBJTkdfX0RJU0NJUExJTkUgPSBlSU5TVEFOQ0UuZ2V0RGlzY2lwbGluZUdyb3VwaW5nX0Rpc2NpcGxpbmUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuRG9jdW1lbnRSb290SW1wbCA8ZW0+RG9jdW1lbnQgUm9vdDwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuRG9jdW1lbnRSb290SW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0RG9jdW1lbnRSb290KCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIERPQ1VNRU5UX1JPT1QgPSBlSU5TVEFOQ0UuZ2V0RG9jdW1lbnRSb290KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5NaXhlZDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgRE9DVU1FTlRfUk9PVF9fTUlYRUQgPSBlSU5TVEFOQ0UuZ2V0RG9jdW1lbnRSb290X01peGVkKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5YTUxOUyBQcmVmaXggTWFwPC9iPjwvZW0+JyBtYXAgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgRE9DVU1FTlRfUk9PVF9fWE1MTlNfUFJFRklYX01BUCA9IGVJTlNUQU5DRS5nZXREb2N1bWVudFJvb3RfWE1MTlNQcmVmaXhNYXAoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlhTSSBTY2hlbWEgTG9jYXRpb248L2I+PC9lbT4nIG1hcCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBET0NVTUVOVF9ST09UX19YU0lfU0NIRU1BX0xPQ0FUSU9OID0gZUlOU1RBTkNFLmdldERvY3VtZW50Um9vdF9YU0lTY2hlbWFMb2NhdGlvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIENvbmZpZ3VyYXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBET0NVTUVOVF9ST09UX19NRVRIT0RfQ09ORklHVVJBVElPTiA9IGVJTlNUQU5DRS5nZXREb2N1bWVudFJvb3RfTWV0aG9kQ29uZmlndXJhdGlvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIExpYnJhcnk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBET0NVTUVOVF9ST09UX19NRVRIT0RfTElCUkFSWSA9IGVJTlNUQU5DRS5nZXREb2N1bWVudFJvb3RfTWV0aG9kTGlicmFyeSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIFBsdWdpbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIERPQ1VNRU5UX1JPT1RfX01FVEhPRF9QTFVHSU4gPSBlSU5TVEFOQ0UuZ2V0RG9jdW1lbnRSb290X01ldGhvZFBsdWdpbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Eb21haW5JbXBsIDxlbT5Eb21haW48L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkRvbWFpbkltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldERvbWFpbigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBET01BSU4gPSBlSU5TVEFOQ0UuZ2V0RG9tYWluKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Hcm91cDI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIERPTUFJTl9fR1JPVVAyID0gZUlOU1RBTkNFLmdldERvbWFpbl9Hcm91cDIoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPldvcmsgUHJvZHVjdDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgRE9NQUlOX19XT1JLX1BST0RVQ1QgPSBlSU5TVEFOQ0UuZ2V0RG9tYWluX1dvcmtQcm9kdWN0KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TdWJkb21haW48L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIERPTUFJTl9fU1VCRE9NQUlOID0gZUlOU1RBTkNFLmdldERvbWFpbl9TdWJkb21haW4oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuRWxlbWVudEltcGwgPGVtPkVsZW1lbnQ8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkVsZW1lbnRJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRFbGVtZW50KCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIEVMRU1FTlQgPSBlSU5TVEFOQ0UuZ2V0RWxlbWVudCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Fc3RpbWF0ZUltcGwgPGVtPkVzdGltYXRlPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Fc3RpbWF0ZUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldEVzdGltYXRlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIEVTVElNQVRFID0gZUlOU1RBTkNFLmdldEVzdGltYXRlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Hcm91cDI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEVTVElNQVRFX19HUk9VUDIgPSBlSU5TVEFOQ0UuZ2V0RXN0aW1hdGVfR3JvdXAyKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Fc3RpbWF0aW9uIE1ldHJpYzwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgRVNUSU1BVEVfX0VTVElNQVRJT05fTUVUUklDID0gZUlOU1RBTkNFLmdldEVzdGltYXRlX0VzdGltYXRpb25NZXRyaWMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkVzdGltYXRpb24gQ29uc2lkZXJhdGlvbnM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEVTVElNQVRFX19FU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TID0gZUlOU1RBTkNFLmdldEVzdGltYXRlX0VzdGltYXRpb25Db25zaWRlcmF0aW9ucygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Fc3RpbWF0aW5nTWV0cmljSW1wbCA8ZW0+RXN0aW1hdGluZyBNZXRyaWM8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkVzdGltYXRpbmdNZXRyaWNJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRFc3RpbWF0aW5nTWV0cmljKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIEVTVElNQVRJTkdfTUVUUklDID0gZUlOU1RBTkNFLmdldEVzdGltYXRpbmdNZXRyaWMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zSW1wbCA8ZW0+RXN0aW1hdGlvbiBDb25zaWRlcmF0aW9uczwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0RXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIEVTVElNQVRJT05fQ09OU0lERVJBVElPTlMgPSBlSU5TVEFOQ0UuZ2V0RXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkV4YW1wbGVJbXBsIDxlbT5FeGFtcGxlPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5FeGFtcGxlSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0RXhhbXBsZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBFWEFNUExFID0gZUlOU1RBTkNFLmdldEV4YW1wbGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuR3VpZGFuY2VJbXBsIDxlbT5HdWlkYW5jZTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuR3VpZGFuY2VJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRHdWlkYW5jZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBHVUlEQU5DRSA9IGVJTlNUQU5DRS5nZXRHdWlkYW5jZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5HdWlkYW5jZURlc2NyaXB0aW9uSW1wbCA8ZW0+R3VpZGFuY2UgRGVzY3JpcHRpb248L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkd1aWRhbmNlRGVzY3JpcHRpb25JbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRHdWlkYW5jZURlc2NyaXB0aW9uKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIEdVSURBTkNFX0RFU0NSSVBUSU9OID0gZUlOU1RBTkNFLmdldEd1aWRhbmNlRGVzY3JpcHRpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkF0dGFjaG1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBHVUlEQU5DRV9ERVNDUklQVElPTl9fQVRUQUNITUVOVCA9IGVJTlNUQU5DRS5nZXRHdWlkYW5jZURlc2NyaXB0aW9uX0F0dGFjaG1lbnQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuR3VpZGVsaW5lSW1wbCA8ZW0+R3VpZGVsaW5lPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5HdWlkZWxpbmVJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRHdWlkZWxpbmUoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgR1VJREVMSU5FID0gZUlOU1RBTkNFLmdldEd1aWRlbGluZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5JdGVyYXRpb25JbXBsIDxlbT5JdGVyYXRpb248L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkl0ZXJhdGlvbkltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldEl0ZXJhdGlvbigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBJVEVSQVRJT04gPSBlSU5TVEFOQ0UuZ2V0SXRlcmF0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLktpbmRJbXBsIDxlbT5LaW5kPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5LaW5kSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0S2luZCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBLSU5EID0gZUlOU1RBTkNFLmdldEtpbmQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkFwcGxpY2FibGUgTWV0YSBDbGFzcyBJbmZvPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBLSU5EX19BUFBMSUNBQkxFX01FVEFfQ0xBU1NfSU5GTyA9IGVJTlNUQU5DRS5nZXRLaW5kX0FwcGxpY2FibGVNZXRhQ2xhc3NJbmZvKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLk1ldGhvZENvbmZpZ3VyYXRpb25JbXBsIDxlbT5NZXRob2QgQ29uZmlndXJhdGlvbjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuTWV0aG9kQ29uZmlndXJhdGlvbkltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldE1ldGhvZENvbmZpZ3VyYXRpb24oKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgTUVUSE9EX0NPTkZJR1VSQVRJT04gPSBlSU5TVEFOQ0UuZ2V0TWV0aG9kQ29uZmlndXJhdGlvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+QmFzZSBDb25maWd1cmF0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBNRVRIT0RfQ09ORklHVVJBVElPTl9fQkFTRV9DT05GSUdVUkFUSU9OID0gZUlOU1RBTkNFLmdldE1ldGhvZENvbmZpZ3VyYXRpb25fQmFzZUNvbmZpZ3VyYXRpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBQbHVnaW4gU2VsZWN0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBNRVRIT0RfQ09ORklHVVJBVElPTl9fTUVUSE9EX1BMVUdJTl9TRUxFQ1RJT04gPSBlSU5TVEFOQ0UuZ2V0TWV0aG9kQ29uZmlndXJhdGlvbl9NZXRob2RQbHVnaW5TZWxlY3Rpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBQYWNrYWdlIFNlbGVjdGlvbjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgTUVUSE9EX0NPTkZJR1VSQVRJT05fX01FVEhPRF9QQUNLQUdFX1NFTEVDVElPTiA9IGVJTlNUQU5DRS5nZXRNZXRob2RDb25maWd1cmF0aW9uX01ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkRlZmF1bHQgVmlldzwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIE1FVEhPRF9DT05GSUdVUkFUSU9OX19ERUZBVUxUX1ZJRVcgPSBlSU5TVEFOQ0UuZ2V0TWV0aG9kQ29uZmlndXJhdGlvbl9EZWZhdWx0VmlldygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UHJvY2VzcyBWaWV3PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBNRVRIT0RfQ09ORklHVVJBVElPTl9fUFJPQ0VTU19WSUVXID0gZUlOU1RBTkNFLmdldE1ldGhvZENvbmZpZ3VyYXRpb25fUHJvY2Vzc1ZpZXcoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlN1YnRyYWN0ZWQgQ2F0ZWdvcnk8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIE1FVEhPRF9DT05GSUdVUkFUSU9OX19TVUJUUkFDVEVEX0NBVEVHT1JZID0gZUlOU1RBTkNFLmdldE1ldGhvZENvbmZpZ3VyYXRpb25fU3VidHJhY3RlZENhdGVnb3J5KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5BZGRlZCBDYXRlZ29yeTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgTUVUSE9EX0NPTkZJR1VSQVRJT05fX0FEREVEX0NBVEVHT1JZID0gZUlOU1RBTkNFLmdldE1ldGhvZENvbmZpZ3VyYXRpb25fQWRkZWRDYXRlZ29yeSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5NZXRob2RFbGVtZW50SW1wbCA8ZW0+TWV0aG9kIEVsZW1lbnQ8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLk1ldGhvZEVsZW1lbnRJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRNZXRob2RFbGVtZW50KCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIE1FVEhPRF9FTEVNRU5UID0gZUlOU1RBTkNFLmdldE1ldGhvZEVsZW1lbnQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkdyb3VwPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBNRVRIT0RfRUxFTUVOVF9fR1JPVVAgPSBlSU5TVEFOQ0UuZ2V0TWV0aG9kRWxlbWVudF9Hcm91cCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgTUVUSE9EX0VMRU1FTlRfX09XTkVEX1JVTEUgPSBlSU5TVEFOQ0UuZ2V0TWV0aG9kRWxlbWVudF9Pd25lZFJ1bGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBNRVRIT0RfRUxFTUVOVF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBlSU5TVEFOQ0UuZ2V0TWV0aG9kRWxlbWVudF9NZXRob2RFbGVtZW50UHJvcGVydHkoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgTUVUSE9EX0VMRU1FTlRfX0JSSUVGX0RFU0NSSVBUSU9OID0gZUlOU1RBTkNFLmdldE1ldGhvZEVsZW1lbnRfQnJpZWZEZXNjcmlwdGlvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBNRVRIT0RfRUxFTUVOVF9fSUQgPSBlSU5TVEFOQ0UuZ2V0TWV0aG9kRWxlbWVudF9JZCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBNRVRIT0RfRUxFTUVOVF9fT1JERVJJTkdfR1VJREUgPSBlSU5TVEFOQ0UuZ2V0TWV0aG9kRWxlbWVudF9PcmRlcmluZ0d1aWRlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIE1FVEhPRF9FTEVNRU5UX19QUkVTRU5UQVRJT05fTkFNRSA9IGVJTlNUQU5DRS5nZXRNZXRob2RFbGVtZW50X1ByZXNlbnRhdGlvbk5hbWUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBNRVRIT0RfRUxFTUVOVF9fU1VQUFJFU1NFRCA9IGVJTlNUQU5DRS5nZXRNZXRob2RFbGVtZW50X1N1cHByZXNzZWQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuTWV0aG9kRWxlbWVudFByb3BlcnR5SW1wbCA8ZW0+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLk1ldGhvZEVsZW1lbnRQcm9wZXJ0eUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldE1ldGhvZEVsZW1lbnRQcm9wZXJ0eSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBNRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IGVJTlNUQU5DRS5nZXRNZXRob2RFbGVtZW50UHJvcGVydHkoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFlfX1ZBTFVFID0gZUlOU1RBTkNFLmdldE1ldGhvZEVsZW1lbnRQcm9wZXJ0eV9WYWx1ZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5NZXRob2RMaWJyYXJ5SW1wbCA8ZW0+TWV0aG9kIExpYnJhcnk8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLk1ldGhvZExpYnJhcnlJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRNZXRob2RMaWJyYXJ5KCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIE1FVEhPRF9MSUJSQVJZID0gZUlOU1RBTkNFLmdldE1ldGhvZExpYnJhcnkoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBQbHVnaW48L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIE1FVEhPRF9MSUJSQVJZX19NRVRIT0RfUExVR0lOID0gZUlOU1RBTkNFLmdldE1ldGhvZExpYnJhcnlfTWV0aG9kUGx1Z2luKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgQ29uZmlndXJhdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgTUVUSE9EX0xJQlJBUllfX01FVEhPRF9DT05GSUdVUkFUSU9OID0gZUlOU1RBTkNFLmdldE1ldGhvZExpYnJhcnlfTWV0aG9kQ29uZmlndXJhdGlvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VG9vbDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIE1FVEhPRF9MSUJSQVJZX19UT09MID0gZUlOU1RBTkNFLmdldE1ldGhvZExpYnJhcnlfVG9vbCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5NZXRob2RQYWNrYWdlSW1wbCA8ZW0+TWV0aG9kIFBhY2thZ2U8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLk1ldGhvZFBhY2thZ2VJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRNZXRob2RQYWNrYWdlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIE1FVEhPRF9QQUNLQUdFID0gZUlOU1RBTkNFLmdldE1ldGhvZFBhY2thZ2UoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgTUVUSE9EX1BBQ0tBR0VfX0dST1VQMSA9IGVJTlNUQU5DRS5nZXRNZXRob2RQYWNrYWdlX0dyb3VwMSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UmV1c2VkIFBhY2thZ2U8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIE1FVEhPRF9QQUNLQUdFX19SRVVTRURfUEFDS0FHRSA9IGVJTlNUQU5DRS5nZXRNZXRob2RQYWNrYWdlX1JldXNlZFBhY2thZ2UoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBQYWNrYWdlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBNRVRIT0RfUEFDS0FHRV9fTUVUSE9EX1BBQ0tBR0UgPSBlSU5TVEFOQ0UuZ2V0TWV0aG9kUGFja2FnZV9NZXRob2RQYWNrYWdlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5HbG9iYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBNRVRIT0RfUEFDS0FHRV9fR0xPQkFMID0gZUlOU1RBTkNFLmdldE1ldGhvZFBhY2thZ2VfR2xvYmFsKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLk1ldGhvZFBsdWdpbkltcGwgPGVtPk1ldGhvZCBQbHVnaW48L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLk1ldGhvZFBsdWdpbkltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldE1ldGhvZFBsdWdpbigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBNRVRIT0RfUExVR0lOID0gZUlOU1RBTkNFLmdldE1ldGhvZFBsdWdpbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UmVmZXJlbmNlZCBNZXRob2QgUGx1Z2luPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBNRVRIT0RfUExVR0lOX19SRUZFUkVOQ0VEX01FVEhPRF9QTFVHSU4gPSBlSU5TVEFOQ0UuZ2V0TWV0aG9kUGx1Z2luX1JlZmVyZW5jZWRNZXRob2RQbHVnaW4oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBQYWNrYWdlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBNRVRIT0RfUExVR0lOX19NRVRIT0RfUEFDS0FHRSA9IGVJTlNUQU5DRS5nZXRNZXRob2RQbHVnaW5fTWV0aG9kUGFja2FnZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VXNlciBDaGFuZ2VhYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgTUVUSE9EX1BMVUdJTl9fVVNFUl9DSEFOR0VBQkxFID0gZUlOU1RBTkNFLmdldE1ldGhvZFBsdWdpbl9Vc2VyQ2hhbmdlYWJsZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5NZXRob2RVbml0SW1wbCA8ZW0+TWV0aG9kIFVuaXQ8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLk1ldGhvZFVuaXRJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRNZXRob2RVbml0KCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIE1FVEhPRF9VTklUID0gZUlOU1RBTkNFLmdldE1ldGhvZFVuaXQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkNvcHlyaWdodDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIE1FVEhPRF9VTklUX19DT1BZUklHSFQgPSBlSU5TVEFOQ0UuZ2V0TWV0aG9kVW5pdF9Db3B5cmlnaHQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkF1dGhvcnM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBNRVRIT0RfVU5JVF9fQVVUSE9SUyA9IGVJTlNUQU5DRS5nZXRNZXRob2RVbml0X0F1dGhvcnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkNoYW5nZSBEYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgTUVUSE9EX1VOSVRfX0NIQU5HRV9EQVRFID0gZUlOU1RBTkNFLmdldE1ldGhvZFVuaXRfQ2hhbmdlRGF0ZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Q2hhbmdlIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgTUVUSE9EX1VOSVRfX0NIQU5HRV9ERVNDUklQVElPTiA9IGVJTlNUQU5DRS5nZXRNZXRob2RVbml0X0NoYW5nZURlc2NyaXB0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5WZXJzaW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgTUVUSE9EX1VOSVRfX1ZFUlNJT04gPSBlSU5TVEFOQ0UuZ2V0TWV0aG9kVW5pdF9WZXJzaW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLk1pbGVzdG9uZUltcGwgPGVtPk1pbGVzdG9uZTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuTWlsZXN0b25lSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0TWlsZXN0b25lKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIE1JTEVTVE9ORSA9IGVJTlNUQU5DRS5nZXRNaWxlc3RvbmUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlJlcXVpcmVkIFJlc3VsdDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgTUlMRVNUT05FX19SRVFVSVJFRF9SRVNVTFQgPSBlSU5TVEFOQ0UuZ2V0TWlsZXN0b25lX1JlcXVpcmVkUmVzdWx0KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLk5hbWVkRWxlbWVudEltcGwgPGVtPk5hbWVkIEVsZW1lbnQ8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLk5hbWVkRWxlbWVudEltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldE5hbWVkRWxlbWVudCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBOQU1FRF9FTEVNRU5UID0gZUlOU1RBTkNFLmdldE5hbWVkRWxlbWVudCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIE5BTUVEX0VMRU1FTlRfX05BTUUgPSBlSU5TVEFOQ0UuZ2V0TmFtZWRFbGVtZW50X05hbWUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuT3V0Y29tZUltcGwgPGVtPk91dGNvbWU8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLk91dGNvbWVJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRPdXRjb21lKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIE9VVENPTUUgPSBlSU5TVEFOQ0UuZ2V0T3V0Y29tZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5QYWNrYWdlYWJsZUVsZW1lbnRJbXBsIDxlbT5QYWNrYWdlYWJsZSBFbGVtZW50PC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5QYWNrYWdlYWJsZUVsZW1lbnRJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRQYWNrYWdlYWJsZUVsZW1lbnQoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgUEFDS0FHRUFCTEVfRUxFTUVOVCA9IGVJTlNUQU5DRS5nZXRQYWNrYWdlYWJsZUVsZW1lbnQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUGhhc2VJbXBsIDxlbT5QaGFzZTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUGhhc2VJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRQaGFzZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBQSEFTRSA9IGVJTlNUQU5DRS5nZXRQaGFzZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5QbGFubmluZ0RhdGFJbXBsIDxlbT5QbGFubmluZyBEYXRhPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5QbGFubmluZ0RhdGFJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRQbGFubmluZ0RhdGEoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgUExBTk5JTkdfREFUQSA9IGVJTlNUQU5DRS5nZXRQbGFubmluZ0RhdGEoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkZpbmlzaCBEYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgUExBTk5JTkdfREFUQV9fRklOSVNIX0RBVEUgPSBlSU5TVEFOQ0UuZ2V0UGxhbm5pbmdEYXRhX0ZpbmlzaERhdGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlJhbms8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBQTEFOTklOR19EQVRBX19SQU5LID0gZUlOU1RBTkNFLmdldFBsYW5uaW5nRGF0YV9SYW5rKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TdGFydCBEYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgUExBTk5JTkdfREFUQV9fU1RBUlRfREFURSA9IGVJTlNUQU5DRS5nZXRQbGFubmluZ0RhdGFfU3RhcnREYXRlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlByYWN0aWNlSW1wbCA8ZW0+UHJhY3RpY2U8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlByYWN0aWNlSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0UHJhY3RpY2UoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgUFJBQ1RJQ0UgPSBlSU5TVEFOQ0UuZ2V0UHJhY3RpY2UoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgUFJBQ1RJQ0VfX0dST1VQMiA9IGVJTlNUQU5DRS5nZXRQcmFjdGljZV9Hcm91cDIoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkFjdGl2aXR5IFJlZmVyZW5jZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgUFJBQ1RJQ0VfX0FDVElWSVRZX1JFRkVSRU5DRSA9IGVJTlNUQU5DRS5nZXRQcmFjdGljZV9BY3Rpdml0eVJlZmVyZW5jZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Q29udGVudCBSZWZlcmVuY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFBSQUNUSUNFX19DT05URU5UX1JFRkVSRU5DRSA9IGVJTlNUQU5DRS5nZXRQcmFjdGljZV9Db250ZW50UmVmZXJlbmNlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TdWIgUHJhY3RpY2U8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFBSQUNUSUNFX19TVUJfUFJBQ1RJQ0UgPSBlSU5TVEFOQ0UuZ2V0UHJhY3RpY2VfU3ViUHJhY3RpY2UoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUHJhY3RpY2VEZXNjcmlwdGlvbkltcGwgPGVtPlByYWN0aWNlIERlc2NyaXB0aW9uPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5QcmFjdGljZURlc2NyaXB0aW9uSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0UHJhY3RpY2VEZXNjcmlwdGlvbigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBQUkFDVElDRV9ERVNDUklQVElPTiA9IGVJTlNUQU5DRS5nZXRQcmFjdGljZURlc2NyaXB0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5BZGRpdGlvbmFsIEluZm88L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBQUkFDVElDRV9ERVNDUklQVElPTl9fQURESVRJT05BTF9JTkZPID0gZUlOU1RBTkNFLmdldFByYWN0aWNlRGVzY3JpcHRpb25fQWRkaXRpb25hbEluZm8oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkFwcGxpY2F0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0FQUExJQ0FUSU9OID0gZUlOU1RBTkNFLmdldFByYWN0aWNlRGVzY3JpcHRpb25fQXBwbGljYXRpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkJhY2tncm91bmQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBQUkFDVElDRV9ERVNDUklQVElPTl9fQkFDS0dST1VORCA9IGVJTlNUQU5DRS5nZXRQcmFjdGljZURlc2NyaXB0aW9uX0JhY2tncm91bmQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkdvYWxzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0dPQUxTID0gZUlOU1RBTkNFLmdldFByYWN0aWNlRGVzY3JpcHRpb25fR29hbHMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkxldmVscyBPZiBBZG9wdGlvbjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFBSQUNUSUNFX0RFU0NSSVBUSU9OX19MRVZFTFNfT0ZfQURPUFRJT04gPSBlSU5TVEFOQ0UuZ2V0UHJhY3RpY2VEZXNjcmlwdGlvbl9MZXZlbHNPZkFkb3B0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Qcm9ibGVtPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX1BST0JMRU0gPSBlSU5TVEFOQ0UuZ2V0UHJhY3RpY2VEZXNjcmlwdGlvbl9Qcm9ibGVtKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlByb2Nlc3NJbXBsIDxlbT5Qcm9jZXNzPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Qcm9jZXNzSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0UHJvY2VzcygpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBQUk9DRVNTID0gZUlOU1RBTkNFLmdldFByb2Nlc3MoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkluY2x1ZGVzIFBhdHRlcm48L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFBST0NFU1NfX0lOQ0xVREVTX1BBVFRFUk4gPSBlSU5TVEFOQ0UuZ2V0UHJvY2Vzc19JbmNsdWRlc1BhdHRlcm4oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkRlZmF1bHQgQ29udGV4dDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFBST0NFU1NfX0RFRkFVTFRfQ09OVEVYVCA9IGVJTlNUQU5DRS5nZXRQcm9jZXNzX0RlZmF1bHRDb250ZXh0KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5WYWxpZCBDb250ZXh0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBQUk9DRVNTX19WQUxJRF9DT05URVhUID0gZUlOU1RBTkNFLmdldFByb2Nlc3NfVmFsaWRDb250ZXh0KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5EaWFncmFtIFVSSTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFBST0NFU1NfX0RJQUdSQU1fVVJJID0gZUlOU1RBTkNFLmdldFByb2Nlc3NfRGlhZ3JhbVVSSSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Qcm9jZXNzQ29tcG9uZW50SW1wbCA8ZW0+UHJvY2VzcyBDb21wb25lbnQ8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlByb2Nlc3NDb21wb25lbnRJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRQcm9jZXNzQ29tcG9uZW50KCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFBST0NFU1NfQ09NUE9ORU5UID0gZUlOU1RBTkNFLmdldFByb2Nlc3NDb21wb25lbnQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkNvcHlyaWdodDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFBST0NFU1NfQ09NUE9ORU5UX19DT1BZUklHSFQgPSBlSU5TVEFOQ0UuZ2V0UHJvY2Vzc0NvbXBvbmVudF9Db3B5cmlnaHQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkludGVyZmFjZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFBST0NFU1NfQ09NUE9ORU5UX19JTlRFUkZBQ0UgPSBlSU5TVEFOQ0UuZ2V0UHJvY2Vzc0NvbXBvbmVudF9JbnRlcmZhY2UoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlByb2Nlc3M8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBQUk9DRVNTX0NPTVBPTkVOVF9fUFJPQ0VTUyA9IGVJTlNUQU5DRS5nZXRQcm9jZXNzQ29tcG9uZW50X1Byb2Nlc3MoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkF1dGhvcnM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBQUk9DRVNTX0NPTVBPTkVOVF9fQVVUSE9SUyA9IGVJTlNUQU5DRS5nZXRQcm9jZXNzQ29tcG9uZW50X0F1dGhvcnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkNoYW5nZSBEYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgUFJPQ0VTU19DT01QT05FTlRfX0NIQU5HRV9EQVRFID0gZUlOU1RBTkNFLmdldFByb2Nlc3NDb21wb25lbnRfQ2hhbmdlRGF0ZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Q2hhbmdlIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgUFJPQ0VTU19DT01QT05FTlRfX0NIQU5HRV9ERVNDUklQVElPTiA9IGVJTlNUQU5DRS5nZXRQcm9jZXNzQ29tcG9uZW50X0NoYW5nZURlc2NyaXB0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5WZXJzaW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgUFJPQ0VTU19DT01QT05FTlRfX1ZFUlNJT04gPSBlSU5TVEFOQ0UuZ2V0UHJvY2Vzc0NvbXBvbmVudF9WZXJzaW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VJbXBsIDxlbT5Qcm9jZXNzIENvbXBvbmVudCBJbnRlcmZhY2U8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRSA9IGVJTlNUQU5DRS5nZXRQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Hcm91cDI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRV9fR1JPVVAyID0gZUlOU1RBTkNFLmdldFByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VfR3JvdXAyKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JbnRlcmZhY2UgU3BlY2lmaWNhdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgUFJPQ0VTU19DT01QT05FTlRfSU5URVJGQUNFX19JTlRFUkZBQ0VfU1BFQ0lGSUNBVElPTiA9IGVJTlNUQU5DRS5nZXRQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlX0ludGVyZmFjZVNwZWNpZmljYXRpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkludGVyZmFjZSBJTzwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgUFJPQ0VTU19DT01QT05FTlRfSU5URVJGQUNFX19JTlRFUkZBQ0VfSU8gPSBlSU5TVEFOQ0UuZ2V0UHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZV9JbnRlcmZhY2VJTygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Qcm9jZXNzRGVzY3JpcHRpb25JbXBsIDxlbT5Qcm9jZXNzIERlc2NyaXB0aW9uPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Qcm9jZXNzRGVzY3JpcHRpb25JbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRQcm9jZXNzRGVzY3JpcHRpb24oKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgUFJPQ0VTU19ERVNDUklQVElPTiA9IGVJTlNUQU5DRS5nZXRQcm9jZXNzRGVzY3JpcHRpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlNjb3BlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgUFJPQ0VTU19ERVNDUklQVElPTl9fU0NPUEUgPSBlSU5TVEFOQ0UuZ2V0UHJvY2Vzc0Rlc2NyaXB0aW9uX1Njb3BlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Vc2FnZSBOb3RlczwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFBST0NFU1NfREVTQ1JJUFRJT05fX1VTQUdFX05PVEVTID0gZUlOU1RBTkNFLmdldFByb2Nlc3NEZXNjcmlwdGlvbl9Vc2FnZU5vdGVzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlByb2Nlc3NFbGVtZW50SW1wbCA8ZW0+UHJvY2VzcyBFbGVtZW50PC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Qcm9jZXNzRWxlbWVudEltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFByb2Nlc3NFbGVtZW50KCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFBST0NFU1NfRUxFTUVOVCA9IGVJTlNUQU5DRS5nZXRQcm9jZXNzRWxlbWVudCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Qcm9jZXNzUGFja2FnZUltcGwgPGVtPlByb2Nlc3MgUGFja2FnZTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUHJvY2Vzc1BhY2thZ2VJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRQcm9jZXNzUGFja2FnZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBQUk9DRVNTX1BBQ0tBR0UgPSBlSU5TVEFOQ0UuZ2V0UHJvY2Vzc1BhY2thZ2UoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgUFJPQ0VTU19QQUNLQUdFX19HUk9VUDIgPSBlSU5TVEFOQ0UuZ2V0UHJvY2Vzc1BhY2thZ2VfR3JvdXAyKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Qcm9jZXNzIEVsZW1lbnQ8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFBST0NFU1NfUEFDS0FHRV9fUFJPQ0VTU19FTEVNRU5UID0gZUlOU1RBTkNFLmdldFByb2Nlc3NQYWNrYWdlX1Byb2Nlc3NFbGVtZW50KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlByb2Nlc3NQbGFubmluZ1RlbXBsYXRlSW1wbCA8ZW0+UHJvY2VzcyBQbGFubmluZyBUZW1wbGF0ZTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGVJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFID0gZUlOU1RBTkNFLmdldFByb2Nlc3NQbGFubmluZ1RlbXBsYXRlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Hcm91cDQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX0dST1VQNCA9IGVJTlNUQU5DRS5nZXRQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZV9Hcm91cDQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkJhc2UgUHJvY2VzczwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgUFJPQ0VTU19QTEFOTklOR19URU1QTEFURV9fQkFTRV9QUk9DRVNTID0gZUlOU1RBTkNFLmdldFByb2Nlc3NQbGFubmluZ1RlbXBsYXRlX0Jhc2VQcm9jZXNzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlJlcG9ydEltcGwgPGVtPlJlcG9ydDwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUmVwb3J0SW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0UmVwb3J0KCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFJFUE9SVCA9IGVJTlNUQU5DRS5nZXRSZXBvcnQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUmV1c2FibGVBc3NldEltcGwgPGVtPlJldXNhYmxlIEFzc2V0PC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5SZXVzYWJsZUFzc2V0SW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0UmV1c2FibGVBc3NldCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBSRVVTQUJMRV9BU1NFVCA9IGVJTlNUQU5DRS5nZXRSZXVzYWJsZUFzc2V0KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlJvYWRtYXBJbXBsIDxlbT5Sb2FkbWFwPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Sb2FkbWFwSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0Um9hZG1hcCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBST0FETUFQID0gZUlOU1RBTkNFLmdldFJvYWRtYXAoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUm9sZUltcGwgPGVtPlJvbGU8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlJvbGVJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRSb2xlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFJPTEUgPSBlSU5TVEFOQ0UuZ2V0Um9sZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBST0xFX19HUk9VUDIgPSBlSU5TVEFOQ0UuZ2V0Um9sZV9Hcm91cDIoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlJlc3BvbnNpYmxlIEZvcjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgUk9MRV9fUkVTUE9OU0lCTEVfRk9SID0gZUlOU1RBTkNFLmdldFJvbGVfUmVzcG9uc2libGVGb3IoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUm9sZURlc2NyaXB0aW9uSW1wbCA8ZW0+Um9sZSBEZXNjcmlwdGlvbjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUm9sZURlc2NyaXB0aW9uSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0Um9sZURlc2NyaXB0aW9uKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFJPTEVfREVTQ1JJUFRJT04gPSBlSU5TVEFOQ0UuZ2V0Um9sZURlc2NyaXB0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Bc3NpZ25tZW50IEFwcHJvYWNoZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBST0xFX0RFU0NSSVBUSU9OX19BU1NJR05NRU5UX0FQUFJPQUNIRVMgPSBlSU5TVEFOQ0UuZ2V0Um9sZURlc2NyaXB0aW9uX0Fzc2lnbm1lbnRBcHByb2FjaGVzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Ta2lsbHM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBST0xFX0RFU0NSSVBUSU9OX19TS0lMTFMgPSBlSU5TVEFOQ0UuZ2V0Um9sZURlc2NyaXB0aW9uX1NraWxscygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U3lub255bXM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBST0xFX0RFU0NSSVBUSU9OX19TWU5PTllNUyA9IGVJTlNUQU5DRS5nZXRSb2xlRGVzY3JpcHRpb25fU3lub255bXMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUm9sZURlc2NyaXB0b3JJbXBsIDxlbT5Sb2xlIERlc2NyaXB0b3I8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlJvbGVEZXNjcmlwdG9ySW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0Um9sZURlc2NyaXB0b3IoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgUk9MRV9ERVNDUklQVE9SID0gZUlOU1RBTkNFLmdldFJvbGVEZXNjcmlwdG9yKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Sb2xlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgUk9MRV9ERVNDUklQVE9SX19ST0xFID0gZUlOU1RBTkNFLmdldFJvbGVEZXNjcmlwdG9yX1JvbGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlJlc3BvbnNpYmxlIEZvcjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgUk9MRV9ERVNDUklQVE9SX19SRVNQT05TSUJMRV9GT1IgPSBlSU5TVEFOQ0UuZ2V0Um9sZURlc2NyaXB0b3JfUmVzcG9uc2libGVGb3IoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUm9sZVNldEltcGwgPGVtPlJvbGUgU2V0PC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Sb2xlU2V0SW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0Um9sZVNldCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBST0xFX1NFVCA9IGVJTlNUQU5DRS5nZXRSb2xlU2V0KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Hcm91cDI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFJPTEVfU0VUX19HUk9VUDIgPSBlSU5TVEFOQ0UuZ2V0Um9sZVNldF9Hcm91cDIoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlJvbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFJPTEVfU0VUX19ST0xFID0gZUlOU1RBTkNFLmdldFJvbGVTZXRfUm9sZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Sb2xlU2V0R3JvdXBpbmdJbXBsIDxlbT5Sb2xlIFNldCBHcm91cGluZzwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUm9sZVNldEdyb3VwaW5nSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0Um9sZVNldEdyb3VwaW5nKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFJPTEVfU0VUX0dST1VQSU5HID0gZUlOU1RBTkNFLmdldFJvbGVTZXRHcm91cGluZygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBST0xFX1NFVF9HUk9VUElOR19fR1JPVVAyID0gZUlOU1RBTkNFLmdldFJvbGVTZXRHcm91cGluZ19Hcm91cDIoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlJvbGUgU2V0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBST0xFX1NFVF9HUk9VUElOR19fUk9MRV9TRVQgPSBlSU5TVEFOQ0UuZ2V0Um9sZVNldEdyb3VwaW5nX1JvbGVTZXQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuU2VjdGlvbkltcGwgPGVtPlNlY3Rpb248L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlNlY3Rpb25JbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRTZWN0aW9uKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFNFQ1RJT04gPSBlSU5TVEFOQ0UuZ2V0U2VjdGlvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U3ViIFNlY3Rpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBTRUNUSU9OX19TVUJfU0VDVElPTiA9IGVJTlNUQU5DRS5nZXRTZWN0aW9uX1N1YlNlY3Rpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlByZWRlY2Vzc29yPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgU0VDVElPTl9fUFJFREVDRVNTT1IgPSBlSU5TVEFOQ0UuZ2V0U2VjdGlvbl9QcmVkZWNlc3NvcigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBTRUNUSU9OX19ERVNDUklQVElPTiA9IGVJTlNUQU5DRS5nZXRTZWN0aW9uX0Rlc2NyaXB0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TZWN0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBTRUNUSU9OX19TRUNUSU9OX05BTUUgPSBlSU5TVEFOQ0UuZ2V0U2VjdGlvbl9TZWN0aW9uTmFtZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFNFQ1RJT05fX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQgPSBlSU5TVEFOQ0UuZ2V0U2VjdGlvbl9WYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgU0VDVElPTl9fVkFSSUFCSUxJVFlfVFlQRSA9IGVJTlNUQU5DRS5nZXRTZWN0aW9uX1ZhcmlhYmlsaXR5VHlwZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5TdXBwb3J0aW5nTWF0ZXJpYWxJbXBsIDxlbT5TdXBwb3J0aW5nIE1hdGVyaWFsPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5TdXBwb3J0aW5nTWF0ZXJpYWxJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRTdXBwb3J0aW5nTWF0ZXJpYWwoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgU1VQUE9SVElOR19NQVRFUklBTCA9IGVJTlNUQU5DRS5nZXRTdXBwb3J0aW5nTWF0ZXJpYWwoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVGFza0ltcGwgPGVtPlRhc2s8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlRhc2tJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRUYXNrKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFRBU0sgPSBlSU5TVEFOQ0UuZ2V0VGFzaygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UHJlY29uZGl0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgVEFTS19fUFJFQ09ORElUSU9OID0gZUlOU1RBTkNFLmdldFRhc2tfUHJlY29uZGl0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Qb3N0Y29uZGl0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgVEFTS19fUE9TVENPTkRJVElPTiA9IGVJTlNUQU5DRS5nZXRUYXNrX1Bvc3Rjb25kaXRpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlBlcmZvcm1lZCBCeTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgVEFTS19fUEVSRk9STUVEX0JZID0gZUlOU1RBTkNFLmdldFRhc2tfUGVyZm9ybWVkQnkoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgVEFTS19fR1JPVVAyID0gZUlOU1RBTkNFLmdldFRhc2tfR3JvdXAyKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5NYW5kYXRvcnkgSW5wdXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFRBU0tfX01BTkRBVE9SWV9JTlBVVCA9IGVJTlNUQU5DRS5nZXRUYXNrX01hbmRhdG9yeUlucHV0KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5PdXRwdXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFRBU0tfX09VVFBVVCA9IGVJTlNUQU5DRS5nZXRUYXNrX091dHB1dCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+QWRkaXRpb25hbGx5IFBlcmZvcm1lZCBCeTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgVEFTS19fQURESVRJT05BTExZX1BFUkZPUk1FRF9CWSA9IGVJTlNUQU5DRS5nZXRUYXNrX0FkZGl0aW9uYWxseVBlcmZvcm1lZEJ5KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5PcHRpb25hbCBJbnB1dDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgVEFTS19fT1BUSU9OQUxfSU5QVVQgPSBlSU5TVEFOQ0UuZ2V0VGFza19PcHRpb25hbElucHV0KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Fc3RpbWF0ZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgVEFTS19fRVNUSU1BVEUgPSBlSU5TVEFOQ0UuZ2V0VGFza19Fc3RpbWF0ZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RXN0aW1hdGlvbiBDb25zaWRlcmF0aW9uczwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgVEFTS19fRVNUSU1BVElPTl9DT05TSURFUkFUSU9OUyA9IGVJTlNUQU5DRS5nZXRUYXNrX0VzdGltYXRpb25Db25zaWRlcmF0aW9ucygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VG9vbCBNZW50b3I8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFRBU0tfX1RPT0xfTUVOVE9SID0gZUlOU1RBTkNFLmdldFRhc2tfVG9vbE1lbnRvcigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5UYXNrRGVzY3JpcHRpb25JbXBsIDxlbT5UYXNrIERlc2NyaXB0aW9uPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5UYXNrRGVzY3JpcHRpb25JbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRUYXNrRGVzY3JpcHRpb24oKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgVEFTS19ERVNDUklQVElPTiA9IGVJTlNUQU5DRS5nZXRUYXNrRGVzY3JpcHRpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkFsdGVybmF0aXZlczwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFRBU0tfREVTQ1JJUFRJT05fX0FMVEVSTkFUSVZFUyA9IGVJTlNUQU5DRS5nZXRUYXNrRGVzY3JpcHRpb25fQWx0ZXJuYXRpdmVzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5QdXJwb3NlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgVEFTS19ERVNDUklQVElPTl9fUFVSUE9TRSA9IGVJTlNUQU5DRS5nZXRUYXNrRGVzY3JpcHRpb25fUHVycG9zZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5UYXNrRGVzY3JpcHRvckltcGwgPGVtPlRhc2sgRGVzY3JpcHRvcjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVGFza0Rlc2NyaXB0b3JJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRUYXNrRGVzY3JpcHRvcigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBUQVNLX0RFU0NSSVBUT1IgPSBlSU5TVEFOQ0UuZ2V0VGFza0Rlc2NyaXB0b3IoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlRhc2s8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBUQVNLX0RFU0NSSVBUT1JfX1RBU0sgPSBlSU5TVEFOQ0UuZ2V0VGFza0Rlc2NyaXB0b3JfVGFzaygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UGVyZm9ybWVkIFByaW1hcmlseSBCeTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFRBU0tfREVTQ1JJUFRPUl9fUEVSRk9STUVEX1BSSU1BUklMWV9CWSA9IGVJTlNUQU5DRS5nZXRUYXNrRGVzY3JpcHRvcl9QZXJmb3JtZWRQcmltYXJpbHlCeSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBUQVNLX0RFU0NSSVBUT1JfX0dST1VQMyA9IGVJTlNUQU5DRS5nZXRUYXNrRGVzY3JpcHRvcl9Hcm91cDMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkFkZGl0aW9uYWxseSBQZXJmb3JtZWQgQnk8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFRBU0tfREVTQ1JJUFRPUl9fQURESVRJT05BTExZX1BFUkZPUk1FRF9CWSA9IGVJTlNUQU5DRS5nZXRUYXNrRGVzY3JpcHRvcl9BZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+QXNzaXN0ZWQgQnk8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFRBU0tfREVTQ1JJUFRPUl9fQVNTSVNURURfQlkgPSBlSU5TVEFOQ0UuZ2V0VGFza0Rlc2NyaXB0b3JfQXNzaXN0ZWRCeSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RXh0ZXJuYWwgSW5wdXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFRBU0tfREVTQ1JJUFRPUl9fRVhURVJOQUxfSU5QVVQgPSBlSU5TVEFOQ0UuZ2V0VGFza0Rlc2NyaXB0b3JfRXh0ZXJuYWxJbnB1dCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TWFuZGF0b3J5IElucHV0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBUQVNLX0RFU0NSSVBUT1JfX01BTkRBVE9SWV9JTlBVVCA9IGVJTlNUQU5DRS5nZXRUYXNrRGVzY3JpcHRvcl9NYW5kYXRvcnlJbnB1dCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+T3B0aW9uYWwgSW5wdXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFRBU0tfREVTQ1JJUFRPUl9fT1BUSU9OQUxfSU5QVVQgPSBlSU5TVEFOQ0UuZ2V0VGFza0Rlc2NyaXB0b3JfT3B0aW9uYWxJbnB1dCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+T3V0cHV0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBUQVNLX0RFU0NSSVBUT1JfX09VVFBVVCA9IGVJTlNUQU5DRS5nZXRUYXNrRGVzY3JpcHRvcl9PdXRwdXQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlN0ZXA8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFRBU0tfREVTQ1JJUFRPUl9fU1RFUCA9IGVJTlNUQU5DRS5nZXRUYXNrRGVzY3JpcHRvcl9TdGVwKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JcyBTeW5jaHJvbml6ZWQgV2l0aCBTb3VyY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBUQVNLX0RFU0NSSVBUT1JfX0lTX1NZTkNIUk9OSVpFRF9XSVRIX1NPVVJDRSA9IGVJTlNUQU5DRS5nZXRUYXNrRGVzY3JpcHRvcl9Jc1N5bmNocm9uaXplZFdpdGhTb3VyY2UoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVGVhbVByb2ZpbGVJbXBsIDxlbT5UZWFtIFByb2ZpbGU8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlRlYW1Qcm9maWxlSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0VGVhbVByb2ZpbGUoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgVEVBTV9QUk9GSUxFID0gZUlOU1RBTkNFLmdldFRlYW1Qcm9maWxlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Hcm91cDI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFRFQU1fUFJPRklMRV9fR1JPVVAyID0gZUlOU1RBTkNFLmdldFRlYW1Qcm9maWxlX0dyb3VwMigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Um9sZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgVEVBTV9QUk9GSUxFX19ST0xFID0gZUlOU1RBTkNFLmdldFRlYW1Qcm9maWxlX1JvbGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlN1cGVyIFRlYW08L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFRFQU1fUFJPRklMRV9fU1VQRVJfVEVBTSA9IGVJTlNUQU5DRS5nZXRUZWFtUHJvZmlsZV9TdXBlclRlYW0oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlN1YiBUZWFtPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBURUFNX1BST0ZJTEVfX1NVQl9URUFNID0gZUlOU1RBTkNFLmdldFRlYW1Qcm9maWxlX1N1YlRlYW0oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVGVtcGxhdGVJbXBsIDxlbT5UZW1wbGF0ZTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVGVtcGxhdGVJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRUZW1wbGF0ZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBURU1QTEFURSA9IGVJTlNUQU5DRS5nZXRUZW1wbGF0ZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5UZXJtRGVmaW5pdGlvbkltcGwgPGVtPlRlcm0gRGVmaW5pdGlvbjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVGVybURlZmluaXRpb25JbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRUZXJtRGVmaW5pdGlvbigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBURVJNX0RFRklOSVRJT04gPSBlSU5TVEFOQ0UuZ2V0VGVybURlZmluaXRpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVG9vbEltcGwgPGVtPlRvb2w8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlRvb2xJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRUb29sKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFRPT0wgPSBlSU5TVEFOQ0UuZ2V0VG9vbCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBUT09MX19HUk9VUDIgPSBlSU5TVEFOQ0UuZ2V0VG9vbF9Hcm91cDIoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlRvb2wgTWVudG9yPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBUT09MX19UT09MX01FTlRPUiA9IGVJTlNUQU5DRS5nZXRUb29sX1Rvb2xNZW50b3IoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVG9vbE1lbnRvckltcGwgPGVtPlRvb2wgTWVudG9yPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Ub29sTWVudG9ySW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0VG9vbE1lbnRvcigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBUT09MX01FTlRPUiA9IGVJTlNUQU5DRS5nZXRUb29sTWVudG9yKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLldoaXRlcGFwZXJJbXBsIDxlbT5XaGl0ZXBhcGVyPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5XaGl0ZXBhcGVySW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0V2hpdGVwYXBlcigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBXSElURVBBUEVSID0gZUlOU1RBTkNFLmdldFdoaXRlcGFwZXIoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuV29ya0JyZWFrZG93bkVsZW1lbnRJbXBsIDxlbT5Xb3JrIEJyZWFrZG93biBFbGVtZW50PC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Xb3JrQnJlYWtkb3duRWxlbWVudEltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFdvcmtCcmVha2Rvd25FbGVtZW50KCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFdPUktfQlJFQUtET1dOX0VMRU1FTlQgPSBlSU5TVEFOQ0UuZ2V0V29ya0JyZWFrZG93bkVsZW1lbnQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgV09SS19CUkVBS0RPV05fRUxFTUVOVF9fR1JPVVAyID0gZUlOU1RBTkNFLmdldFdvcmtCcmVha2Rvd25FbGVtZW50X0dyb3VwMigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UHJlZGVjZXNzb3I8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX1BSRURFQ0VTU09SID0gZUlOU1RBTkNFLmdldFdvcmtCcmVha2Rvd25FbGVtZW50X1ByZWRlY2Vzc29yKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JcyBFdmVudCBEcml2ZW48L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19JU19FVkVOVF9EUklWRU4gPSBlSU5TVEFOQ0UuZ2V0V29ya0JyZWFrZG93bkVsZW1lbnRfSXNFdmVudERyaXZlbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SXMgT25nb2luZzwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0lTX09OR09JTkcgPSBlSU5TVEFOQ0UuZ2V0V29ya0JyZWFrZG93bkVsZW1lbnRfSXNPbmdvaW5nKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JcyBSZXBlYXRhYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgV09SS19CUkVBS0RPV05fRUxFTUVOVF9fSVNfUkVQRUFUQUJMRSA9IGVJTlNUQU5DRS5nZXRXb3JrQnJlYWtkb3duRWxlbWVudF9Jc1JlcGVhdGFibGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuV29ya0RlZmluaXRpb25JbXBsIDxlbT5Xb3JrIERlZmluaXRpb248L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLldvcmtEZWZpbml0aW9uSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0V29ya0RlZmluaXRpb24oKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgV09SS19ERUZJTklUSU9OID0gZUlOU1RBTkNFLmdldFdvcmtEZWZpbml0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5QcmVjb25kaXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBXT1JLX0RFRklOSVRJT05fX1BSRUNPTkRJVElPTiA9IGVJTlNUQU5DRS5nZXRXb3JrRGVmaW5pdGlvbl9QcmVjb25kaXRpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlBvc3Rjb25kaXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBXT1JLX0RFRklOSVRJT05fX1BPU1RDT05ESVRJT04gPSBlSU5TVEFOQ0UuZ2V0V29ya0RlZmluaXRpb25fUG9zdGNvbmRpdGlvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Xb3JrT3JkZXJJbXBsIDxlbT5Xb3JrIE9yZGVyPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Xb3JrT3JkZXJJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRXb3JrT3JkZXIoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgV09SS19PUkRFUiA9IGVJTlNUQU5DRS5nZXRXb3JrT3JkZXIoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgV09SS19PUkRFUl9fVkFMVUUgPSBlSU5TVEFOQ0UuZ2V0V29ya09yZGVyX1ZhbHVlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFdPUktfT1JERVJfX0lEID0gZUlOU1RBTkNFLmdldFdvcmtPcmRlcl9JZCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TGluayBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgV09SS19PUkRFUl9fTElOS19UWVBFID0gZUlOU1RBTkNFLmdldFdvcmtPcmRlcl9MaW5rVHlwZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Xb3JrUHJvZHVjdEltcGwgPGVtPldvcmsgUHJvZHVjdDwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuV29ya1Byb2R1Y3RJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRXb3JrUHJvZHVjdCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBXT1JLX1BST0RVQ1QgPSBlSU5TVEFOQ0UuZ2V0V29ya1Byb2R1Y3QoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgV09SS19QUk9EVUNUX19HUk9VUDIgPSBlSU5TVEFOQ0UuZ2V0V29ya1Byb2R1Y3RfR3JvdXAyKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Fc3RpbWF0ZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgV09SS19QUk9EVUNUX19FU1RJTUFURSA9IGVJTlNUQU5DRS5nZXRXb3JrUHJvZHVjdF9Fc3RpbWF0ZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RXN0aW1hdGlvbiBDb25zaWRlcmF0aW9uczwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgV09SS19QUk9EVUNUX19FU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TID0gZUlOU1RBTkNFLmdldFdvcmtQcm9kdWN0X0VzdGltYXRpb25Db25zaWRlcmF0aW9ucygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UmVwb3J0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBXT1JLX1BST0RVQ1RfX1JFUE9SVCA9IGVJTlNUQU5DRS5nZXRXb3JrUHJvZHVjdF9SZXBvcnQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlRlbXBsYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBXT1JLX1BST0RVQ1RfX1RFTVBMQVRFID0gZUlOU1RBTkNFLmdldFdvcmtQcm9kdWN0X1RlbXBsYXRlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Ub29sIE1lbnRvcjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgV09SS19QUk9EVUNUX19UT09MX01FTlRPUiA9IGVJTlNUQU5DRS5nZXRXb3JrUHJvZHVjdF9Ub29sTWVudG9yKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLldvcmtQcm9kdWN0RGVzY3JpcHRpb25JbXBsIDxlbT5Xb3JrIFByb2R1Y3QgRGVzY3JpcHRpb248L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLldvcmtQcm9kdWN0RGVzY3JpcHRpb25JbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRXb3JrUHJvZHVjdERlc2NyaXB0aW9uKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFdPUktfUFJPRFVDVF9ERVNDUklQVElPTiA9IGVJTlNUQU5DRS5nZXRXb3JrUHJvZHVjdERlc2NyaXB0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JbXBhY3QgT2YgTm90IEhhdmluZzwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fSU1QQUNUX09GX05PVF9IQVZJTkcgPSBlSU5TVEFOQ0UuZ2V0V29ya1Byb2R1Y3REZXNjcmlwdGlvbl9JbXBhY3RPZk5vdEhhdmluZygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UHVycG9zZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fUFVSUE9TRSA9IGVJTlNUQU5DRS5nZXRXb3JrUHJvZHVjdERlc2NyaXB0aW9uX1B1cnBvc2UoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlJlYXNvbnMgRm9yIE5vdCBOZWVkaW5nPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19SRUFTT05TX0ZPUl9OT1RfTkVFRElORyA9IGVJTlNUQU5DRS5nZXRXb3JrUHJvZHVjdERlc2NyaXB0aW9uX1JlYXNvbnNGb3JOb3ROZWVkaW5nKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLldvcmtQcm9kdWN0RGVzY3JpcHRvckltcGwgPGVtPldvcmsgUHJvZHVjdCBEZXNjcmlwdG9yPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Xb3JrUHJvZHVjdERlc2NyaXB0b3JJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRXb3JrUHJvZHVjdERlc2NyaXB0b3IoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgV09SS19QUk9EVUNUX0RFU0NSSVBUT1IgPSBlSU5TVEFOQ0UuZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Xb3JrIFByb2R1Y3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fV09SS19QUk9EVUNUID0gZUlOU1RBTkNFLmdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9Xb3JrUHJvZHVjdCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UmVzcG9uc2libGUgUm9sZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFdPUktfUFJPRFVDVF9ERVNDUklQVE9SX19SRVNQT05TSUJMRV9ST0xFID0gZUlOU1RBTkNFLmdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9SZXNwb25zaWJsZVJvbGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0dST1VQMiA9IGVJTlNUQU5DRS5nZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JfR3JvdXAyKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5FeHRlcm5hbCBJbnB1dCBUbzwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0VYVEVSTkFMX0lOUFVUX1RPID0gZUlOU1RBTkNFLmdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9FeHRlcm5hbElucHV0VG8oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkltcGFjdGVkIEJ5PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fSU1QQUNURURfQlkgPSBlSU5TVEFOQ0UuZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX0ltcGFjdGVkQnkoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkltcGFjdHM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFdPUktfUFJPRFVDVF9ERVNDUklQVE9SX19JTVBBQ1RTID0gZUlOU1RBTkNFLmdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9JbXBhY3RzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5NYW5kYXRvcnkgSW5wdXQgVG88L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFdPUktfUFJPRFVDVF9ERVNDUklQVE9SX19NQU5EQVRPUllfSU5QVVRfVE8gPSBlSU5TVEFOQ0UuZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX01hbmRhdG9yeUlucHV0VG8oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk9wdGlvbmFsIElucHV0IFRvPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fT1BUSU9OQUxfSU5QVVRfVE8gPSBlSU5TVEFOQ0UuZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX09wdGlvbmFsSW5wdXRUbygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+T3V0cHV0IEZyb208L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFdPUktfUFJPRFVDVF9ERVNDUklQVE9SX19PVVRQVVRfRlJPTSA9IGVJTlNUQU5DRS5nZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JfT3V0cHV0RnJvbSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RGVsaXZlcmFibGUgUGFydHM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFdPUktfUFJPRFVDVF9ERVNDUklQVE9SX19ERUxJVkVSQUJMRV9QQVJUUyA9IGVJTlNUQU5DRS5nZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JfRGVsaXZlcmFibGVQYXJ0cygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+QWN0aXZpdHkgRW50cnkgU3RhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fQUNUSVZJVFlfRU5UUllfU1RBVEUgPSBlSU5TVEFOQ0UuZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX0FjdGl2aXR5RW50cnlTdGF0ZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+QWN0aXZpdHkgRXhpdCBTdGF0ZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFdPUktfUFJPRFVDVF9ERVNDUklQVE9SX19BQ1RJVklUWV9FWElUX1NUQVRFID0gZUlOU1RBTkNFLmdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9BY3Rpdml0eUV4aXRTdGF0ZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Xb3JrUHJvZHVjdFR5cGVJbXBsIDxlbT5Xb3JrIFByb2R1Y3QgVHlwZTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuV29ya1Byb2R1Y3RUeXBlSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0V29ya1Byb2R1Y3RUeXBlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFdPUktfUFJPRFVDVF9UWVBFID0gZUlOU1RBTkNFLmdldFdvcmtQcm9kdWN0VHlwZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBXT1JLX1BST0RVQ1RfVFlQRV9fR1JPVVAyID0gZUlOU1RBTkNFLmdldFdvcmtQcm9kdWN0VHlwZV9Hcm91cDIoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPldvcmsgUHJvZHVjdDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgV09SS19QUk9EVUNUX1RZUEVfX1dPUktfUFJPRFVDVCA9IGVJTlNUQU5DRS5nZXRXb3JrUHJvZHVjdFR5cGVfV29ya1Byb2R1Y3QoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlZhcmlhYmlsaXR5VHlwZSA8ZW0+VmFyaWFiaWxpdHkgVHlwZTwvZW0+fScgZW51bS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVmFyaWFiaWxpdHlUeXBlCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRWYXJpYWJpbGl0eVR5cGUoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFRW51bSBWQVJJQUJJTElUWV9UWVBFID0gZUlOU1RBTkNFLmdldFZhcmlhYmlsaXR5VHlwZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya09yZGVyVHlwZSA8ZW0+V29yayBPcmRlciBUeXBlPC9lbT59JyBlbnVtLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrT3JkZXJUeXBlCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRXb3JrT3JkZXJUeXBlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUVudW0gV09SS19PUkRFUl9UWVBFID0gZUlOU1RBTkNFLmdldFdvcmtPcmRlclR5cGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPlZhcmlhYmlsaXR5IFR5cGUgT2JqZWN0PC9lbT4nIGRhdGEgdHlwZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVmFyaWFiaWxpdHlUeXBlCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRWYXJpYWJpbGl0eVR5cGVPYmplY3QoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFRGF0YVR5cGUgVkFSSUFCSUxJVFlfVFlQRV9PQkpFQ1QgPSBlSU5TVEFOQ0UuZ2V0VmFyaWFiaWxpdHlUeXBlT2JqZWN0KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT5Xb3JrIE9yZGVyIFR5cGUgT2JqZWN0PC9lbT4nIGRhdGEgdHlwZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya09yZGVyVHlwZQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0V29ya09yZGVyVHlwZU9iamVjdCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVEYXRhVHlwZSBXT1JLX09SREVSX1RZUEVfT0JKRUNUID0gZUlOU1RBTkNFLmdldFdvcmtPcmRlclR5cGVPYmplY3QoKTsKLQotCX0KLQotfSAvL1VtYVBhY2thZ2UKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9WYXJpYWJpbGl0eVR5cGUuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9WYXJpYWJpbGl0eVR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjMwN2ViMS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvVmFyaWFiaWxpdHlUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNDMgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBWYXJpYWJpbGl0eVR5cGUuamF2YSx2IDEuMiAyMDA4LzAxLzMwIDAwOjQxOjQ4IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVudW1lcmF0b3I7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIGxpdGVyYWxzIG9mIHRoZSBlbnVtZXJhdGlvbiAnPGVtPjxiPlZhcmlhYmlsaXR5IFR5cGU8L2I+PC9lbT4nLAotICogYW5kIHV0aWxpdHkgbWV0aG9kcyBmb3Igd29ya2luZyB3aXRoIHRoZW0uCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQW4gRW51bWVyYXRpb24gdXNlZCBmb3IgdmFsdWVzIGZvciBpbnN0YW5jZXMgb2YgVmFyaWFiaWxpdHkgRWxlbWVudCdzIGF0dHJpYnV0ZSB2YXJpYWJpbGl0eVR5cGUuICBJdCBkZWZpbmVzIHRoZSBuYXR1cmUgb2YgaG93IGEgVmFyaWFiaWxpdHkgRWxlbWVudCBleHRlbmRzIGFub3RoZXIgVmFyaWFiaWxpdHkgRWxlbWVudC4gU2VlIGVudW1lcmF0aW9uIGxpdGVyYWxzIGZvciBkZWZpbml0aW9ucyBmb3IgZWFjaCB0eXBlLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFZhcmlhYmlsaXR5VHlwZSgpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nVmFyaWFiaWxpdHlUeXBlJyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGVudW0gVmFyaWFiaWxpdHlUeXBlIGltcGxlbWVudHMgRW51bWVyYXRvcgotewotCS8qKgotCSAqIFRoZSAnPGVtPjxiPk5hPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI05BX1ZBTFVFCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JTkEoMCwgIm5hIiwgIm5hIiksCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+Q29udHJpYnV0ZXM8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjQ09OVFJJQlVURVNfVkFMVUUKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlDT05UUklCVVRFUygxLCAiY29udHJpYnV0ZXMiLCAiY29udHJpYnV0ZXMiKSwKLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5FeHRlbmRzPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0VYVEVORFNfVkFMVUUKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlFWFRFTkRTKDIsICJleHRlbmRzIiwgImV4dGVuZHMiKSwKLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5SZXBsYWNlczwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNSRVBMQUNFU19WQUxVRQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCVJFUExBQ0VTKDMsICJyZXBsYWNlcyIsICJyZXBsYWNlcyIpLAotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkxvY2FsIENvbnRyaWJ1dGlvbjwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNMT0NBTF9DT05UUklCVVRJT05fVkFMVUUKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlMT0NBTF9DT05UUklCVVRJT04oNCwgImxvY2FsQ29udHJpYnV0aW9uIiwgImxvY2FsQ29udHJpYnV0aW9uIiksCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+TG9jYWwgUmVwbGFjZW1lbnQ8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjTE9DQUxfUkVQTEFDRU1FTlRfVkFMVUUKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlMT0NBTF9SRVBMQUNFTUVOVCg1LCAibG9jYWxSZXBsYWNlbWVudCIsICJsb2NhbFJlcGxhY2VtZW50IiksCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+RXh0ZW5kcyBSZXBsYWNlczwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNFWFRFTkRTX1JFUExBQ0VTX1ZBTFVFCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JRVhURU5EU19SRVBMQUNFUyg2LCAiZXh0ZW5kc1JlcGxhY2VzIiwgImV4dGVuZHNSZXBsYWNlcyIpOwotCS8qKgotCSAqIFRoZSAnPGVtPjxiPk5hPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5OYTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNOQQotCSAqIEBtb2RlbCBuYW1lPSJuYSIKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOQV9WQUxVRSA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5Db250cmlidXRlczwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+Q29udHJpYnV0ZXM8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjQ09OVFJJQlVURVMKLQkgKiBAbW9kZWwgbmFtZT0iY29udHJpYnV0ZXMiCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09OVFJJQlVURVNfVkFMVUUgPSAxOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+RXh0ZW5kczwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+RXh0ZW5kczwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNFWFRFTkRTCi0JICogQG1vZGVsIG5hbWU9ImV4dGVuZHMiCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVhURU5EU19WQUxVRSA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5SZXBsYWNlczwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+UmVwbGFjZXM8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjUkVQTEFDRVMKLQkgKiBAbW9kZWwgbmFtZT0icmVwbGFjZXMiCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVQTEFDRVNfVkFMVUUgPSAzOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+TG9jYWwgQ29udHJpYnV0aW9uPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5Mb2NhbCBDb250cmlidXRpb248L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjTE9DQUxfQ09OVFJJQlVUSU9OCi0JICogQG1vZGVsIG5hbWU9ImxvY2FsQ29udHJpYnV0aW9uIgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExPQ0FMX0NPTlRSSUJVVElPTl9WQUxVRSA9IDQ7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5Mb2NhbCBSZXBsYWNlbWVudDwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+TG9jYWwgUmVwbGFjZW1lbnQ8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjTE9DQUxfUkVQTEFDRU1FTlQKLQkgKiBAbW9kZWwgbmFtZT0ibG9jYWxSZXBsYWNlbWVudCIKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBMT0NBTF9SRVBMQUNFTUVOVF9WQUxVRSA9IDU7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5FeHRlbmRzIFJlcGxhY2VzPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5FeHRlbmRzIFJlcGxhY2VzPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0VYVEVORFNfUkVQTEFDRVMKLQkgKiBAbW9kZWwgbmFtZT0iZXh0ZW5kc1JlcGxhY2VzIgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVYVEVORFNfUkVQTEFDRVNfVkFMVUUgPSA2OwotCi0JLyoqCi0JICogQW4gYXJyYXkgb2YgYWxsIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IFR5cGU8L2I+PC9lbT4nIGVudW1lcmF0b3JzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFZhcmlhYmlsaXR5VHlwZVtdIFZBTFVFU19BUlJBWSA9Ci0JCW5ldyBWYXJpYWJpbGl0eVR5cGVbXSB7Ci0JCQlOQSwKLQkJCUNPTlRSSUJVVEVTLAotCQkJRVhURU5EUywKLQkJCVJFUExBQ0VTLAotCQkJTE9DQUxfQ09OVFJJQlVUSU9OLAotCQkJTE9DQUxfUkVQTEFDRU1FTlQsCi0JCQlFWFRFTkRTX1JFUExBQ0VTLAotCQl9OwotCi0JLyoqCi0JICogQSBwdWJsaWMgcmVhZC1vbmx5IGxpc3Qgb2YgYWxsIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IFR5cGU8L2I+PC9lbT4nIGVudW1lcmF0b3JzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgTGlzdDxWYXJpYWJpbGl0eVR5cGU+IFZBTFVFUyA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoQXJyYXlzLmFzTGlzdChWQUxVRVNfQVJSQVkpKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgVHlwZTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFZhcmlhYmlsaXR5VHlwZSBnZXQoU3RyaW5nIGxpdGVyYWwpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBWQUxVRVNfQVJSQVkubGVuZ3RoOyArK2kpIHsKLQkJCVZhcmlhYmlsaXR5VHlwZSByZXN1bHQgPSBWQUxVRVNfQVJSQVlbaV07Ci0JCQlpZiAocmVzdWx0LnRvU3RyaW5nKCkuZXF1YWxzKGxpdGVyYWwpKSB7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IFR5cGU8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBWYXJpYWJpbGl0eVR5cGUgZ2V0QnlOYW1lKFN0cmluZyBuYW1lKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgVkFMVUVTX0FSUkFZLmxlbmd0aDsgKytpKSB7Ci0JCQlWYXJpYWJpbGl0eVR5cGUgcmVzdWx0ID0gVkFMVUVTX0FSUkFZW2ldOwotCQkJaWYgKHJlc3VsdC5nZXROYW1lKCkuZXF1YWxzKG5hbWUpKSB7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IFR5cGU8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIGludGVnZXIgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBWYXJpYWJpbGl0eVR5cGUgZ2V0KGludCB2YWx1ZSkgewotCQlzd2l0Y2ggKHZhbHVlKSB7Ci0JCQljYXNlIE5BX1ZBTFVFOiByZXR1cm4gTkE7Ci0JCQljYXNlIENPTlRSSUJVVEVTX1ZBTFVFOiByZXR1cm4gQ09OVFJJQlVURVM7Ci0JCQljYXNlIEVYVEVORFNfVkFMVUU6IHJldHVybiBFWFRFTkRTOwotCQkJY2FzZSBSRVBMQUNFU19WQUxVRTogcmV0dXJuIFJFUExBQ0VTOwotCQkJY2FzZSBMT0NBTF9DT05UUklCVVRJT05fVkFMVUU6IHJldHVybiBMT0NBTF9DT05UUklCVVRJT047Ci0JCQljYXNlIExPQ0FMX1JFUExBQ0VNRU5UX1ZBTFVFOiByZXR1cm4gTE9DQUxfUkVQTEFDRU1FTlQ7Ci0JCQljYXNlIEVYVEVORFNfUkVQTEFDRVNfVkFMVUU6IHJldHVybiBFWFRFTkRTX1JFUExBQ0VTOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgZmluYWwgaW50IHZhbHVlOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbmFtZTsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgZmluYWwgU3RyaW5nIGxpdGVyYWw7Ci0KLQkvKioKLQkgKiBPbmx5IHRoaXMgY2xhc3MgY2FuIGNvbnN0cnVjdCBpbnN0YW5jZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBWYXJpYWJpbGl0eVR5cGUoaW50IHZhbHVlLCBTdHJpbmcgbmFtZSwgU3RyaW5nIGxpdGVyYWwpIHsKLQkJdGhpcy52YWx1ZSA9IHZhbHVlOwotCQl0aGlzLm5hbWUgPSBuYW1lOwotCQl0aGlzLmxpdGVyYWwgPSBsaXRlcmFsOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0VmFsdWUoKSB7Ci0JICByZXR1cm4gdmFsdWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCSAgcmV0dXJuIG5hbWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMaXRlcmFsKCkgewotCSAgcmV0dXJuIGxpdGVyYWw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbGl0ZXJhbCB2YWx1ZSBvZiB0aGUgZW51bWVyYXRvciwgd2hpY2ggaXMgaXRzIHN0cmluZyByZXByZXNlbnRhdGlvbi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gbGl0ZXJhbDsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvV2hpdGVwYXBlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1doaXRlcGFwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTAzZWE3NC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvV2hpdGVwYXBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBXaGl0ZXBhcGVyLmphdmEsdiAxLjEgMjAwOC8wMS8xNSAwODo1MjowNyBqdGhhbSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPldoaXRlcGFwZXI8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIHNwZWNpYWwgQ29uY2VwdCBndWlkYW5jZSB0aGF0IGhhdmUgYmVlbiBleHRlcm5hbGx5IHJldmlld2VkIG9yIHB1Ymxpc2hlZCBhbmQgY2FuIGJlIHJlYWQgYW5kIHVuZGVyc3Rvb2QgaW4gaXNvbGF0aW9uIG9mIG90aGVyIGNvbnRlbnQgZWxlbWVudHMgYW5kIGd1aWRhbmNlLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0V2hpdGVwYXBlcigpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nV2hpdGVwYXBlcicga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFdoaXRlcGFwZXIgZXh0ZW5kcyBDb25jZXB0IHsKLX0gLy8gV2hpdGVwYXBlcgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9Xb3JrQnJlYWtkb3duRWxlbWVudC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1dvcmtCcmVha2Rvd25FbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViOGY4OGEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1dvcmtCcmVha2Rvd25FbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzEgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBXb3JrQnJlYWtkb3duRWxlbWVudC5qYXZhLHYgMS4yIDIwMDgvMDEvMzAgMDA6NDE6NDgga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXA7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPldvcmsgQnJlYWtkb3duIEVsZW1lbnQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIHNwZWNpYWwgQnJlYWtkb3duIEVsZW1lbnQgdGhhdCBwcm92aWRlcyBzcGVjaWZpYyBwcm9wZXJ0aWVzIGZvciBCcmVha2Rvd24gRWxlbWVudHMgdGhhdCByZXByZXNlbnQgb3IgcmVmZXIgdG8gV29yayBEZWZpbml0aW9ucy4gIEZvciBleGFtcGxlIGl0cyBzdWJjbGFzcyBBY3Rpdml0eSBkZWZpbmVzIHdvcmsgYXMgaXQgaXMgYWxzbyBhIHN1YmNsYXNzIG9mIFdvcmsgRGVmaW5pdGlvbi4gIEl0cyBzdWJjbGFzcyBUYXNrIERlc2NyaXB0b3IgZG9lcyBub3QgZGVmaW5lIHdvcmsgYnkgaXRzZWxmLCBidXQgcmVmZXJzIHRvIGEgV29yayBEZWZpbml0aW9uIGFuZCB0aGVyZWZvcmUgY2FuIGhhdmUgdGhlIHNhbWUgY29tbW9uIHByb3BlcnRpZXMgYW5kIFdvcmsgQnJlYWtkb3duIEVsZW1lbnQgaGFzLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtCcmVha2Rvd25FbGVtZW50I2dldEdyb3VwMiA8ZW0+R3JvdXAyPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrQnJlYWtkb3duRWxlbWVudCNnZXRQcmVkZWNlc3NvciA8ZW0+UHJlZGVjZXNzb3I8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtCcmVha2Rvd25FbGVtZW50I2lzSXNFdmVudERyaXZlbiA8ZW0+SXMgRXZlbnQgRHJpdmVuPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrQnJlYWtkb3duRWxlbWVudCNpc0lzT25nb2luZyA8ZW0+SXMgT25nb2luZzwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya0JyZWFrZG93bkVsZW1lbnQjaXNJc1JlcGVhdGFibGUgPGVtPklzIFJlcGVhdGFibGU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0V29ya0JyZWFrZG93bkVsZW1lbnQoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J1dvcmtCcmVha2Rvd25FbGVtZW50JyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgV29ya0JyZWFrZG93bkVsZW1lbnQgZXh0ZW5kcyBCcmVha2Rvd25FbGVtZW50IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Hcm91cDI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwLkVudHJ5fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkdyb3VwMjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkdyb3VwMjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0V29ya0JyZWFrZG93bkVsZW1lbnRfR3JvdXAyKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRmVhdHVyZU1hcEVudHJ5IiBtYW55PSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdncm91cCcgbmFtZT0nZ3JvdXA6MzAnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlGZWF0dXJlTWFwIGdldEdyb3VwMigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UHJlZGVjZXNzb3I8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrT3JkZXJ9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UHJlZGVjZXNzb3I8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QcmVkZWNlc3NvcjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0V29ya0JyZWFrZG93bkVsZW1lbnRfUHJlZGVjZXNzb3IoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nUHJlZGVjZXNzb3InIGdyb3VwPScjZ3JvdXA6MzAnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdDxXb3JrT3JkZXI+IGdldFByZWRlY2Vzc29yKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JcyBFdmVudCBEcml2ZW48L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBpc0V2ZW50RHJpdmVuIGF0dHJpYnV0ZSBpbmRpY2F0ZXMgdGhhdCB0aGUgUHJvY2VzcyBXb3JrIERlZmluaXRpb24gZGVzY3JpYmVzIGFuIGluc3RhbmNlIG9mIHdvcmsgd2hpY2ggaXMgbm90IHN0YXJ0ZWQgYmVjYXVzZSBpdCBoYXMgYmVlbiBzY2hlZHVsZWQgdG8gc3RhcnQgYXQgYSBjZXJ0YWluIHBvaW50IG9mIHRpbWUsIGJlY2F1c2UgcHJlY2VkaW5nIHdvcmsgaXMgYmVpbmcgY29tcGxldGVkLCBvciBpbnB1dCB3b3JrIHByb2R1Y3RzIGFyZSBhdmFpbGFibGUsIGJ1dCBiZWNhdXNlIGFub3RoZXIgc3BlY2lmaWMgZXZlbnQgaGFzIG9jY3VycmVkLiAgRXhhbXBsZXMgZm9yIHN1Y2ggZXZlbnRzIGFyZSBleGNlcHRpb25zIG9yIHByb2JsZW0gc2l0dWF0aW9ucyB3aGljaCByZXF1aXJlIHNwZWNpZmljIHdvcmsgdG8gYmUgcGVyZm9ybWVkIGFzIGEgcmVzdWx0LiAgQWxzbyBjaGFuZ2UgbWFuYWdlbWVudCB3b3JrIGNhbiBiZSBtb2RlbGVkIGFzIGV2ZW50IGRyaXZlbiB3b3JrIGFuYWx5emluZyBhIGNoYW5nZSByZXF1ZXN0IG9yIGRlZmVjdCBhbmQgYWxsb2NhdGluZyB3b3JrIGR5bmFtaWNhbGx5IHRvIHJlc291cmNlcyB0byBkZWFsIHdpdGggaXQgZm9sbG93aW5nIHRoZSB3b3JrIGRlc2NyaWJlZCB3aXRoIHN1Y2ggUHJvY2VzcyBXb3JrIERlZmluaXRpb24uICBUaGUgZXZlbnRzIHRoZW1zZWx2ZXMgYXJlIG5vdCBtb2RlbGVkIGluIHRoaXMgdmVyc2lvbiBvZiB0aGUgc3BlY2lmaWNhdGlvbi4gIFRoZXkgc2hhbGwgYmUgZGVzY3JpYmVkIGFzIHBhcnQgb2YgdGhlIG5vcm1hbCBkZXNjcmlwdGlvbnMgZmllbGRzIGF2YWlsYWJsZS4KLQkgKiAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SXMgRXZlbnQgRHJpdmVuPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldElzRXZlbnREcml2ZW4oKQotCSAqIEBzZWUgI3Vuc2V0SXNFdmVudERyaXZlbigpCi0JICogQHNlZSAjc2V0SXNFdmVudERyaXZlbihib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRXb3JrQnJlYWtkb3duRWxlbWVudF9Jc0V2ZW50RHJpdmVuKCkKLQkgKiBAbW9kZWwgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdhdHRyaWJ1dGUnIG5hbWU9J2lzRXZlbnREcml2ZW4nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzSXNFdmVudERyaXZlbigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya0JyZWFrZG93bkVsZW1lbnQjaXNJc0V2ZW50RHJpdmVuIDxlbT5JcyBFdmVudCBEcml2ZW48L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPklzIEV2ZW50IERyaXZlbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRJc0V2ZW50RHJpdmVuKCkKLQkgKiBAc2VlICN1bnNldElzRXZlbnREcml2ZW4oKQotCSAqIEBzZWUgI2lzSXNFdmVudERyaXZlbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0SXNFdmVudERyaXZlbihib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya0JyZWFrZG93bkVsZW1lbnQjaXNJc0V2ZW50RHJpdmVuIDxlbT5JcyBFdmVudCBEcml2ZW48L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0SXNFdmVudERyaXZlbigpCi0JICogQHNlZSAjaXNJc0V2ZW50RHJpdmVuKCkKLQkgKiBAc2VlICNzZXRJc0V2ZW50RHJpdmVuKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRJc0V2ZW50RHJpdmVuKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtCcmVha2Rvd25FbGVtZW50I2lzSXNFdmVudERyaXZlbiA8ZW0+SXMgRXZlbnQgRHJpdmVuPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JcyBFdmVudCBEcml2ZW48L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldElzRXZlbnREcml2ZW4oKQotCSAqIEBzZWUgI2lzSXNFdmVudERyaXZlbigpCi0JICogQHNlZSAjc2V0SXNFdmVudERyaXZlbihib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0SXNFdmVudERyaXZlbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SXMgT25nb2luZzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogSWYgdGhlIGlzT25nb2luZyBhdHRyaWJ1dGUgaXMgc2V0IHRvIFRydWUgZm9yIGEgUHJvY2VzcyBXb3JrIERlZmluaXRpb24gaW5zdGFuY2UsIHRoZW4gdGhlIGVsZW1lbnQgZGVzY3JpYmVzIGFuIG9uZ29pbmcgcGllY2Ugb2Ygd29yayB3aXRob3V0IGEgZml4ZWQgZHVyYXRpb24gb3IgZW5kIHN0YXRlLiAgRm9yIGV4YW1wbGUsIHRoZSBQcm9jZXNzIFdvcmsgRGVmaW5pdGlvbiBjb3VsZCByZXByZXNlbnQgd29yayBvZiBhbiBhZG1pbmlzdHJhdG9yIGNvbnRpbnVvdXNseSAoZS5nLiAzaCBhIGRheSkgd29ya2luZyB0byBlbnN1cmUgdGhhdCBzeXN0ZW1zIGFyZSBrZXB0IGluIGEgY2VydGFpbiBzdGF0ZS4gIEFub3RoZXIgZXhhbXBsZSB3b3VsZCBiZSBwcm9ncmFtIG1hbmFnZW1lbnQgd29yayBvdmVyc2VlaW5nIG1hbnkgZGlmZmVyZW50IHByb2plY3RzIGJlaW5nIHNjaGVkdWxlZCBmb3Igb25lIHBhcnRpY3VsYXIgcHJvamVjdCBhdCBzcGVjaWZpYyByZW9jY3VycmluZyBpbnRlcnZhbHMgZHVyaW5nIHRoZSB3aG9sZSBsaWZlY3ljbGUgb2YgdGhlIHByb2plY3QuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPklzIE9uZ29pbmc8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0SXNPbmdvaW5nKCkKLQkgKiBAc2VlICN1bnNldElzT25nb2luZygpCi0JICogQHNlZSAjc2V0SXNPbmdvaW5nKGJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFdvcmtCcmVha2Rvd25FbGVtZW50X0lzT25nb2luZygpCi0JICogQG1vZGVsIHVuc2V0dGFibGU9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbiIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nYXR0cmlidXRlJyBuYW1lPSdpc09uZ29pbmcnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzSXNPbmdvaW5nKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrQnJlYWtkb3duRWxlbWVudCNpc0lzT25nb2luZyA8ZW0+SXMgT25nb2luZzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SXMgT25nb2luZzwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRJc09uZ29pbmcoKQotCSAqIEBzZWUgI3Vuc2V0SXNPbmdvaW5nKCkKLQkgKiBAc2VlICNpc0lzT25nb2luZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0SXNPbmdvaW5nKGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrQnJlYWtkb3duRWxlbWVudCNpc0lzT25nb2luZyA8ZW0+SXMgT25nb2luZzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRJc09uZ29pbmcoKQotCSAqIEBzZWUgI2lzSXNPbmdvaW5nKCkKLQkgKiBAc2VlICNzZXRJc09uZ29pbmcoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldElzT25nb2luZygpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrQnJlYWtkb3duRWxlbWVudCNpc0lzT25nb2luZyA8ZW0+SXMgT25nb2luZzwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SXMgT25nb2luZzwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0SXNPbmdvaW5nKCkKLQkgKiBAc2VlICNpc0lzT25nb2luZygpCi0JICogQHNlZSAjc2V0SXNPbmdvaW5nKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRJc09uZ29pbmcoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPklzIFJlcGVhdGFibGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoaXMgYXR0cmlidXRlIGlzIHVzZWQgdG8gZGVmaW5lIHJlcGV0aXRpb24gb2Ygd29yaywgZS5nLiBpdGVyYXRpb25zLiAgQSBQcm9jZXNzIFdvcmsgRGVmaW5pdGlvbiB3aXRoIHRoaXMgYXR0cmlidXRlIHNldCB0byBUcnVlIHNoYWxsIGJlIHJlcGVhdGVkIG1vcmUgdGhhbiBvbmNlIG9uIHRoZSBzYW1lIHNldCBvZiBhcnRpZmFjdHMuICBGb3IgZXhhbXBsZSwgZm9yIGFuIGluc3RhbmNlIG9mIEl0ZXJhdGlvbiAoZGVmaW5lZCBhcyBhIHNwZWNpYWwgUHJvY2VzcyBXb3JrIERlZmluaXRpb24gYmVsb3cpIHRoaXMgYXR0cmlidXRlIGlzIHNldCB0byBUcnVlIGJ5IGRlZmF1bHQgaW5kaWNhdGluZyB0aGF0IGV2ZXJ5IHN1Yi1BY3Rpdml0eSB3aWxsIGJlIHJlcGVhdGVkIG1vcmUgdGhhbiBvbmNlLiAgSG93ZXZlciwgYW55IFByb2Nlc3MgV29yayBEZWZpbml0aW9uIGNhbiBzZXQgdGhpcyBhdHRyaWJ1dGUgdG8gVHJ1ZSB0byBkZWZpbmUgaXRlcmF0aW9ucyAoZS5nLiB0byBpdGVyYXRlIG9uZSBBY3Rpdml0eSBjb25zaXN0aW5nIG9mIG1hbnkgc3ViLWFjdGl2aXRpZXMgb3IgZXZlbiBQaGFzZXMsIGJ1dCB0byBpdGVyYXRlIGp1c3Qgb25lIFRhc2spLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JcyBSZXBlYXRhYmxlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldElzUmVwZWF0YWJsZSgpCi0JICogQHNlZSAjdW5zZXRJc1JlcGVhdGFibGUoKQotCSAqIEBzZWUgI3NldElzUmVwZWF0YWJsZShib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRXb3JrQnJlYWtkb3duRWxlbWVudF9Jc1JlcGVhdGFibGUoKQotCSAqIEBtb2RlbCB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW4iCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2F0dHJpYnV0ZScgbmFtZT0naXNSZXBlYXRhYmxlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc0lzUmVwZWF0YWJsZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya0JyZWFrZG93bkVsZW1lbnQjaXNJc1JlcGVhdGFibGUgPGVtPklzIFJlcGVhdGFibGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPklzIFJlcGVhdGFibGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0SXNSZXBlYXRhYmxlKCkKLQkgKiBAc2VlICN1bnNldElzUmVwZWF0YWJsZSgpCi0JICogQHNlZSAjaXNJc1JlcGVhdGFibGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldElzUmVwZWF0YWJsZShib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya0JyZWFrZG93bkVsZW1lbnQjaXNJc1JlcGVhdGFibGUgPGVtPklzIFJlcGVhdGFibGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0SXNSZXBlYXRhYmxlKCkKLQkgKiBAc2VlICNpc0lzUmVwZWF0YWJsZSgpCi0JICogQHNlZSAjc2V0SXNSZXBlYXRhYmxlKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRJc1JlcGVhdGFibGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya0JyZWFrZG93bkVsZW1lbnQjaXNJc1JlcGVhdGFibGUgPGVtPklzIFJlcGVhdGFibGU8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPklzIFJlcGVhdGFibGU8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldElzUmVwZWF0YWJsZSgpCi0JICogQHNlZSAjaXNJc1JlcGVhdGFibGUoKQotCSAqIEBzZWUgI3NldElzUmVwZWF0YWJsZShib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0SXNSZXBlYXRhYmxlKCk7Ci0KLX0gLy8gV29ya0JyZWFrZG93bkVsZW1lbnQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvV29ya0RlZmluaXRpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9Xb3JrRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMjkyYWFjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9Xb3JrRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODcgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBXb3JrRGVmaW5pdGlvbi5qYXZhLHYgMS4yIDIwMDgvMDEvMzAgMDA6NDE6NDgga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPldvcmsgRGVmaW5pdGlvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEFuIGFic3RyYWN0IE1ldGhvZCBFbGVtZW50IHRoYXQgZ2VuZXJhbGl6ZXMgYWxsIGRlc2NyaXB0aW9ucyBvZiB3b3JrIHdpdGhpbiB0aGUgVW5pZmllZCBNZXRob2QgQXJjaGl0ZWN0dXJlLiAgVGhpcyBwYWNrYWdlIGludHJvZHVjZXMgdHdvIGNvbmNyZXRlIHR5cGVzIG9mIFdvcmsgRGVmaW5pdGlvbnM6IFRhc2sgYW5kIFN0ZXAuICBXb3JrIERlZmluaXRpb25zIGNhbiBjb250YWluIHNldHMgb2YgcHJlLSBhbmQgcG9zdC1jb25kaXRpb25zIGRlZmluaW5nIGNvbnN0cmFpbnRzIHRoYXQgbmVlZCB0byBiZSB2YWxpZCBiZWZvcmUgdGhlIGRlc2NyaWJlZCB3b3JrIGNhbiBiZWdpbiBvciBiZWZvcmUgaXQgY2FuIGJlIGRlY2xhcmVkIGFzIGZpbmlzaGVkLiAgTm90ZSB0aGF0IGdlbmVyYWwgb3duZWRSdWxlcyBjYW4gYmUgdXNlZCB0byBkZWZpbmUgYWRkaXRpb25hbCBjb25zdHJhaW50cyBhbmQgcnVsZXMgZm9yIFdvcmsgRGVmaW5pdGlvbnMuCi0gKiBXb3JrIERlZmluaXRpb25zIHJlcHJlc2VudCBiZWhhdmlvcmFsIGRlc2NyaXB0aW9ucyBmb3IgZG9pbmcgd29yay4gIFRoZXNlIGJlaGF2aW9yYWwgZGVzY3JpcHRpb25zIGFyZSBub3QgYm91bmQgdG8gb25lIHNwZWNpZmljIGNsYXNzaWZpZXIsIGJ1dCByZXByZXNlbnQgYW4gYXJiaXRyYXJ5IGRlZmluaXRpb24gb2Ygd29yay4gIEZvciBleGFtcGxlLCBhIFdvcmsgRGVmaW5pdGlvbiBjb3VsZCByZXByZXNlbnQgd29yayB0aGF0IGlzIGJlaW5nIHBlcmZvcm1lZCBieSBhIHNwZWNpZmljIFJvbGUgKGUuZy4gYSBSb2xlIHBlcmZvcm1pbmcgYSBzcGVjaWZpYyBUYXNrIG9yIFN0ZXBzIG9mIGEgVGFzayksIGJ5IG1hbnkgUm9sZXMgd29ya2luZyBpbiBjbG9zZSBjb2xsYWJvcmF0aW9uIChtYW55IFJvbGVzIGFsbCB3b3JraW5nIHRvZ2V0aGVyIG9uIHRoZSBzYW1lIGludGVyZGlzY2lwbGluYXJ5IFRhc2spLCBvciBjb21wbGV4IHdvcmsgdGhhdCBpcyBwZXJmb3JtZWQgdGhyb3VnaG91dCB0aGUgbGlmZWN5Y2xlIChlLmcuIGEgcHJvY2VzcyBkZWZpbmluZyBhIGJyZWFrZG93biBzdHJ1Y3R1cmUgZm9yIG9yZ2FuaXppbmcgbGFyZ2VyIGNvbXBvc2l0ZSB1bml0cyBvZiB3b3JrIHBlcmZvcm1lZCBieSBtYW55IFJvbGVzIHdvcmtpbmcgaW4gY29sbGFib3JhdGlvbikuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya0RlZmluaXRpb24jZ2V0UHJlY29uZGl0aW9uIDxlbT5QcmVjb25kaXRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtEZWZpbml0aW9uI2dldFBvc3Rjb25kaXRpb24gPGVtPlBvc3Rjb25kaXRpb248L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0V29ya0RlZmluaXRpb24oKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J1dvcmtEZWZpbml0aW9uJyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgV29ya0RlZmluaXRpb24gZXh0ZW5kcyBNZXRob2RFbGVtZW50IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QcmVjb25kaXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlByZWNvbmRpdGlvbjwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QcmVjb25kaXRpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFByZWNvbmRpdGlvbihTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFdvcmtEZWZpbml0aW9uX1ByZWNvbmRpdGlvbigpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdQcmVjb25kaXRpb24nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0UHJlY29uZGl0aW9uKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrRGVmaW5pdGlvbiNnZXRQcmVjb25kaXRpb24gPGVtPlByZWNvbmRpdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UHJlY29uZGl0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRQcmVjb25kaXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFByZWNvbmRpdGlvbihTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UG9zdGNvbmRpdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UG9zdGNvbmRpdGlvbjwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Qb3N0Y29uZGl0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRQb3N0Y29uZGl0aW9uKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0V29ya0RlZmluaXRpb25fUG9zdGNvbmRpdGlvbigpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdQb3N0Y29uZGl0aW9uJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFBvc3Rjb25kaXRpb24oKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtEZWZpbml0aW9uI2dldFBvc3Rjb25kaXRpb24gPGVtPlBvc3Rjb25kaXRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlBvc3Rjb25kaXRpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFBvc3Rjb25kaXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFBvc3Rjb25kaXRpb24oU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBXb3JrRGVmaW5pdGlvbgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9Xb3JrT3JkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9Xb3JrT3JkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzFhNGI2ZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvV29ya09yZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDYgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBXb3JrT3JkZXIuamF2YSx2IDEuMiAyMDA4LzAxLzMwIDAwOjQxOjQ4IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5zZG8uRURhdGFPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPldvcmsgT3JkZXI8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBSZXByZXNlbnRzIGEgcmVsYXRpb25zaGlwIGJldHdlZW4gdHdvIEJyZWFrZG93biBFbGVtZW50cyBpbiB3aGljaCBvbmUgQnJlYWtkb3duIEVsZW1lbnRzIGRlcGVuZHMgb24gdGhlIHN0YXJ0IG9yIGZpbmlzaCBvZiBhbm90aGVyIEJyZWFrZG93biBFbGVtZW50cyBpbiBvcmRlciB0byBiZWdpbiBvciBlbmQuICAKLSAqIFRoZSBXb3JrIE9yZGVyIGNsYXNzIGRlZmluZXMgcHJlZGVjZXNzb3IgYW5kIHN1Y2Nlc3NvciByZWxhdGlvbnMgYW1vbmdzdCBCcmVha2Rvd24gRWxlbWVudHMuICBUaGlzIGluZm9ybWF0aW9uIGlzIGluIHBhcnRpY3VsYXIgY3JpdGljYWwgZm9yIHBsYW5uaW5nIGFwcGxpY2F0aW9ucy4gIFNlZSBtb3JlIGRldGFpbHMgb24gZGlmZmVyZW50IHR5cGVzIG9mIFdvcmsgT3JkZXIgcmVsYXRpb25zaGlwcyBhdCBXb3JrIE9yZGVyIFR5cGUuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya09yZGVyI2dldFZhbHVlIDxlbT5WYWx1ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya09yZGVyI2dldElkIDxlbT5JZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya09yZGVyI2dldExpbmtUeXBlIDxlbT5MaW5rIFR5cGU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0V29ya09yZGVyKCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdXb3JrT3JkZXInIGtpbmQ9J3NpbXBsZSciCi0gKiBAZXh0ZW5kcyBFRGF0YU9iamVjdAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFdvcmtPcmRlciBleHRlbmRzIEVEYXRhT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5WYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VmFsdWU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VmFsdWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFZhbHVlKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0V29ya09yZGVyX1ZhbHVlKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9JzowJyBraW5kPSdzaW1wbGUnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0VmFsdWUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtPcmRlciNnZXRWYWx1ZSA8ZW0+VmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlZhbHVlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRWYWx1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VmFsdWUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBEZWZpbmVzIGEgZ2xvYmFsIHVuaXF1ZSBpZCBmb3IgYSB3b3JrIG9yZGVyLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0SWQoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRXb3JrT3JkZXJfSWQoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nYXR0cmlidXRlJyBuYW1lPSdpZCciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRJZCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya09yZGVyI2dldElkIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRJZChTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TGluayBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+ImZpbmlzaFRvU3RhcnQiPC9jb2RlPi4KLQkgKiBUaGUgbGl0ZXJhbHMgYXJlIGZyb20gdGhlIGVudW1lcmF0aW9uIHtAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrT3JkZXJUeXBlfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoaXMgYXR0cmlidXRlIGV4cHJlc3NlcyB0aGUgdHlwZSBvZiB0aGUgV29yayBPcmRlciByZWxhdGlvbnNoaXAgYnkgYXNzaWduaW5nIGEgdmFsdWUgZnJvbSB0aGUgV29yayBPcmRlciBUeXBlIGVudW1lcmF0aW9uLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5MaW5rIFR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya09yZGVyVHlwZQotCSAqIEBzZWUgI2lzU2V0TGlua1R5cGUoKQotCSAqIEBzZWUgI3Vuc2V0TGlua1R5cGUoKQotCSAqIEBzZWUgI3NldExpbmtUeXBlKFdvcmtPcmRlclR5cGUpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFdvcmtPcmRlcl9MaW5rVHlwZSgpCi0JICogQG1vZGVsIGRlZmF1bHQ9ImZpbmlzaFRvU3RhcnQiIHVuc2V0dGFibGU9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2F0dHJpYnV0ZScgbmFtZT0nbGlua1R5cGUnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlXb3JrT3JkZXJUeXBlIGdldExpbmtUeXBlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrT3JkZXIjZ2V0TGlua1R5cGUgPGVtPkxpbmsgVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TGluayBUeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtPcmRlclR5cGUKLQkgKiBAc2VlICNpc1NldExpbmtUeXBlKCkKLQkgKiBAc2VlICN1bnNldExpbmtUeXBlKCkKLQkgKiBAc2VlICNnZXRMaW5rVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TGlua1R5cGUoV29ya09yZGVyVHlwZSB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtPcmRlciNnZXRMaW5rVHlwZSA8ZW0+TGluayBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldExpbmtUeXBlKCkKLQkgKiBAc2VlICNnZXRMaW5rVHlwZSgpCi0JICogQHNlZSAjc2V0TGlua1R5cGUoV29ya09yZGVyVHlwZSkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldExpbmtUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtPcmRlciNnZXRMaW5rVHlwZSA8ZW0+TGluayBUeXBlPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5MaW5rIFR5cGU8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldExpbmtUeXBlKCkKLQkgKiBAc2VlICNnZXRMaW5rVHlwZSgpCi0JICogQHNlZSAjc2V0TGlua1R5cGUoV29ya09yZGVyVHlwZSkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldExpbmtUeXBlKCk7Ci0KLX0gLy8gV29ya09yZGVyClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1dvcmtPcmRlclR5cGUuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9Xb3JrT3JkZXJUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzNTIzY2EuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1dvcmtPcmRlclR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2NSArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFdvcmtPcmRlclR5cGUuamF2YSx2IDEuMiAyMDA4LzAxLzMwIDAwOjQxOjQ4IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVudW1lcmF0b3I7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIGxpdGVyYWxzIG9mIHRoZSBlbnVtZXJhdGlvbiAnPGVtPjxiPldvcmsgT3JkZXIgVHlwZTwvYj48L2VtPicsCi0gKiBhbmQgdXRpbGl0eSBtZXRob2RzIGZvciB3b3JraW5nIHdpdGggdGhlbS4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBSZXByZXNlbnRzIGEgcmVsYXRpb25zaGlwIGJldHdlZW4gdHdvIEJyZWFrZG93biBFbGVtZW50IGluIHdoaWNoIG9uZSBCcmVha2Rvd24gRWxlbWVudCBkZXBlbmRzIG9uIHRoZSBzdGFydCBvciBmaW5pc2ggb2YgYW5vdGhlciBCcmVha2Rvd24gRWxlbWVudCBpbiBvcmRlciB0byBiZWdpbiBvciBlbmQuIFRoaXMgZW51bWVyYXRpb24gZGVmaW5lcyB0aGUgZGlmZmVyZW50IHR5cGVzIG9mIFdvcmsgT3JkZXIgcmVsYXRpb25zaGlwcyBhdmFpbGFibGUgaW4gVU1BIGFuZCBpcyB1c2VkIHRvIHByb3ZpZGUgdmFsdWVzIGZvciBXb3JrIE9yZGVyJ3MgbGlua1R5cGUgYXR0cmlidXRlLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFdvcmtPcmRlclR5cGUoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J1dvcmtPcmRlclR5cGUnIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgZW51bSBXb3JrT3JkZXJUeXBlIGltcGxlbWVudHMgRW51bWVyYXRvcgotewotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkZpbmlzaCBUbyBTdGFydDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNGSU5JU0hfVE9fU1RBUlRfVkFMVUUKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlGSU5JU0hfVE9fU1RBUlQoMCwgImZpbmlzaFRvU3RhcnQiLCAiZmluaXNoVG9TdGFydCIpLAotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkZpbmlzaCBUbyBGaW5pc2g8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjRklOSVNIX1RPX0ZJTklTSF9WQUxVRQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCUZJTklTSF9UT19GSU5JU0goMSwgImZpbmlzaFRvRmluaXNoIiwgImZpbmlzaFRvRmluaXNoIiksCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+U3RhcnQgVG8gU3RhcnQ8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjU1RBUlRfVE9fU1RBUlRfVkFMVUUKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlTVEFSVF9UT19TVEFSVCgyLCAic3RhcnRUb1N0YXJ0IiwgInN0YXJ0VG9TdGFydCIpLAotCS8qKgotCSAqIFRoZSAnPGVtPjxiPlN0YXJ0IFRvIEZpbmlzaDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNTVEFSVF9UT19GSU5JU0hfVkFMVUUKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlTVEFSVF9UT19GSU5JU0goMywgInN0YXJ0VG9GaW5pc2giLCAic3RhcnRUb0ZpbmlzaCIpOwotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkZpbmlzaCBUbyBTdGFydDwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+RmluaXNoIFRvIFN0YXJ0PC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0ZJTklTSF9UT19TVEFSVAotCSAqIEBtb2RlbCBuYW1lPSJmaW5pc2hUb1N0YXJ0IgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZJTklTSF9UT19TVEFSVF9WQUxVRSA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5GaW5pc2ggVG8gRmluaXNoPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5GaW5pc2ggVG8gRmluaXNoPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0ZJTklTSF9UT19GSU5JU0gKLQkgKiBAbW9kZWwgbmFtZT0iZmluaXNoVG9GaW5pc2giCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRklOSVNIX1RPX0ZJTklTSF9WQUxVRSA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5TdGFydCBUbyBTdGFydDwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+U3RhcnQgVG8gU3RhcnQ8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjU1RBUlRfVE9fU1RBUlQKLQkgKiBAbW9kZWwgbmFtZT0ic3RhcnRUb1N0YXJ0IgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVJUX1RPX1NUQVJUX1ZBTFVFID0gMjsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPlN0YXJ0IFRvIEZpbmlzaDwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+U3RhcnQgVG8gRmluaXNoPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI1NUQVJUX1RPX0ZJTklTSAotCSAqIEBtb2RlbCBuYW1lPSJzdGFydFRvRmluaXNoIgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVJUX1RPX0ZJTklTSF9WQUxVRSA9IDM7Ci0KLQkvKioKLQkgKiBBbiBhcnJheSBvZiBhbGwgdGhlICc8ZW0+PGI+V29yayBPcmRlciBUeXBlPC9iPjwvZW0+JyBlbnVtZXJhdG9ycy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBXb3JrT3JkZXJUeXBlW10gVkFMVUVTX0FSUkFZID0KLQkJbmV3IFdvcmtPcmRlclR5cGVbXSB7Ci0JCQlGSU5JU0hfVE9fU1RBUlQsCi0JCQlGSU5JU0hfVE9fRklOSVNILAotCQkJU1RBUlRfVE9fU1RBUlQsCi0JCQlTVEFSVF9UT19GSU5JU0gsCi0JCX07Ci0KLQkvKioKLQkgKiBBIHB1YmxpYyByZWFkLW9ubHkgbGlzdCBvZiBhbGwgdGhlICc8ZW0+PGI+V29yayBPcmRlciBUeXBlPC9iPjwvZW0+JyBlbnVtZXJhdG9ycy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIExpc3Q8V29ya09yZGVyVHlwZT4gVkFMVUVTID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChBcnJheXMuYXNMaXN0KFZBTFVFU19BUlJBWSkpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5Xb3JrIE9yZGVyIFR5cGU8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBXb3JrT3JkZXJUeXBlIGdldChTdHJpbmcgbGl0ZXJhbCkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IFZBTFVFU19BUlJBWS5sZW5ndGg7ICsraSkgewotCQkJV29ya09yZGVyVHlwZSByZXN1bHQgPSBWQUxVRVNfQVJSQVlbaV07Ci0JCQlpZiAocmVzdWx0LnRvU3RyaW5nKCkuZXF1YWxzKGxpdGVyYWwpKSB7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPldvcmsgT3JkZXIgVHlwZTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFdvcmtPcmRlclR5cGUgZ2V0QnlOYW1lKFN0cmluZyBuYW1lKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgVkFMVUVTX0FSUkFZLmxlbmd0aDsgKytpKSB7Ci0JCQlXb3JrT3JkZXJUeXBlIHJlc3VsdCA9IFZBTFVFU19BUlJBWVtpXTsKLQkJCWlmIChyZXN1bHQuZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSkgewotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5Xb3JrIE9yZGVyIFR5cGU8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIGludGVnZXIgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBXb3JrT3JkZXJUeXBlIGdldChpbnQgdmFsdWUpIHsKLQkJc3dpdGNoICh2YWx1ZSkgewotCQkJY2FzZSBGSU5JU0hfVE9fU1RBUlRfVkFMVUU6IHJldHVybiBGSU5JU0hfVE9fU1RBUlQ7Ci0JCQljYXNlIEZJTklTSF9UT19GSU5JU0hfVkFMVUU6IHJldHVybiBGSU5JU0hfVE9fRklOSVNIOwotCQkJY2FzZSBTVEFSVF9UT19TVEFSVF9WQUxVRTogcmV0dXJuIFNUQVJUX1RPX1NUQVJUOwotCQkJY2FzZSBTVEFSVF9UT19GSU5JU0hfVkFMVUU6IHJldHVybiBTVEFSVF9UT19GSU5JU0g7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBpbnQgdmFsdWU7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIGZpbmFsIFN0cmluZyBuYW1lOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbGl0ZXJhbDsKLQotCS8qKgotCSAqIE9ubHkgdGhpcyBjbGFzcyBjYW4gY29uc3RydWN0IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIFdvcmtPcmRlclR5cGUoaW50IHZhbHVlLCBTdHJpbmcgbmFtZSwgU3RyaW5nIGxpdGVyYWwpIHsKLQkJdGhpcy52YWx1ZSA9IHZhbHVlOwotCQl0aGlzLm5hbWUgPSBuYW1lOwotCQl0aGlzLmxpdGVyYWwgPSBsaXRlcmFsOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0VmFsdWUoKSB7Ci0JICByZXR1cm4gdmFsdWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCSAgcmV0dXJuIG5hbWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMaXRlcmFsKCkgewotCSAgcmV0dXJuIGxpdGVyYWw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbGl0ZXJhbCB2YWx1ZSBvZiB0aGUgZW51bWVyYXRvciwgd2hpY2ggaXMgaXRzIHN0cmluZyByZXByZXNlbnRhdGlvbi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gbGl0ZXJhbDsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvV29ya1Byb2R1Y3QuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9Xb3JrUHJvZHVjdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNGRjYmZmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9Xb3JrUHJvZHVjdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQxICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogV29ya1Byb2R1Y3QuamF2YSx2IDEuMiAyMDA4LzAxLzMwIDAwOjQxOjQ4IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Xb3JrIFByb2R1Y3Q8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBbiBhYnN0cmFjdCBjbGFzcyB3aGljaCBwcm92aWRlcyBhIGdlbmVyYWxpemF0aW9uIGZvciB0aGUgY29udGVudCBlbGVtZW50IHR5cGVzIEFydGlmYWN0LCBPdXRjb21lLCBhbmQgRGVsaXZlcmFibGUuICBUaGUgbWV0YS1tb2RlbCBjbGFzcyBXb3JrIFByb2R1Y3QgYWN0dWFsbHkgcmVwcmVzZW50cyB3b3JrIHByb2R1Y3QgdHlwZXMsIGkuZS4gYW4gaW5zdGFuY2Ugb2YgV29yayBQcm9kdWN0IGlzIGEgZGVzY3JpcHRpb24gb2YgYSBzcGVjaWZpYyB0eXBlIG9mIHdvcmsgcHJvZHVjdCBhbmQgbm90IGFuIGluZGl2aWR1YWwgd29yayBwcm9kdWN0IGluc3RhbmNlLiAgSG93ZXZlciwgZm9yIHNpbXBsaWNpdHkgcmVhc29ucyBhbmQgYmVjYXVzZSBvZiBsb3cgcmlzayBvZiBtaXNpbnRlcnByZXRhdGlvbiB3ZSBkaWQgbm90IGFwcGVuZCB0aGUgd29yZCAndHlwZScgdG8gZXZlcnkgbWV0YS1jbGFzcy4KLSAqIEEgd29yayBwcm9kdWN0IGlzIGFuIGFic3RyYWN0aW9uIGZvciBkZXNjcmlwdGlvbnMgb2YgY29udGVudCBlbGVtZW50cyB0aGF0IGFyZSB1c2VkIHRvIGRlZmluZSBhbnl0aGluZyB1c2VkLCBwcm9kdWNlZCwgb3IgbW9kaWZpZWQgYnkgYSB0YXNrLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtQcm9kdWN0I2dldEdyb3VwMiA8ZW0+R3JvdXAyPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdCNnZXRFc3RpbWF0ZSA8ZW0+RXN0aW1hdGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtQcm9kdWN0I2dldEVzdGltYXRpb25Db25zaWRlcmF0aW9ucyA8ZW0+RXN0aW1hdGlvbiBDb25zaWRlcmF0aW9uczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya1Byb2R1Y3QjZ2V0UmVwb3J0IDxlbT5SZXBvcnQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtQcm9kdWN0I2dldFRlbXBsYXRlIDxlbT5UZW1wbGF0ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya1Byb2R1Y3QjZ2V0VG9vbE1lbnRvciA8ZW0+VG9vbCBNZW50b3I8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0V29ya1Byb2R1Y3QoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J1dvcmtQcm9kdWN0JyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgV29ya1Byb2R1Y3QgZXh0ZW5kcyBDb250ZW50RWxlbWVudCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+R3JvdXAyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcC5FbnRyeX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Hcm91cDI8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Hcm91cDI8L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFdvcmtQcm9kdWN0X0dyb3VwMigpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUZlYXR1cmVNYXBFbnRyeSIgbWFueT0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZ3JvdXAnIG5hbWU9J2dyb3VwOjI0JyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRmVhdHVyZU1hcCBnZXRHcm91cDIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkVzdGltYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Fc3RpbWF0ZTwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkVzdGltYXRlPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRXb3JrUHJvZHVjdF9Fc3RpbWF0ZSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIiB0cmFuc2llbnQ9InRydWUiIHZvbGF0aWxlPSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdFc3RpbWF0ZScgZ3JvdXA9JyNncm91cDoyNCciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0PFN0cmluZz4gZ2V0RXN0aW1hdGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkVzdGltYXRpb24gQ29uc2lkZXJhdGlvbnM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkVzdGltYXRpb24gQ29uc2lkZXJhdGlvbnM8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Fc3RpbWF0aW9uIENvbnNpZGVyYXRpb25zPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRXb3JrUHJvZHVjdF9Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zJyBncm91cD0nI2dyb3VwOjI0JyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3Q8U3RyaW5nPiBnZXRFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJlcG9ydDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UmVwb3J0PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmVwb3J0PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRXb3JrUHJvZHVjdF9SZXBvcnQoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nUmVwb3J0JyBncm91cD0nI2dyb3VwOjI0JyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3Q8U3RyaW5nPiBnZXRSZXBvcnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlRlbXBsYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5UZW1wbGF0ZTwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlRlbXBsYXRlPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRXb3JrUHJvZHVjdF9UZW1wbGF0ZSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIiB0cmFuc2llbnQ9InRydWUiIHZvbGF0aWxlPSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdUZW1wbGF0ZScgZ3JvdXA9JyNncm91cDoyNCciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0PFN0cmluZz4gZ2V0VGVtcGxhdGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlRvb2wgTWVudG9yPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Ub29sIE1lbnRvcjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlRvb2wgTWVudG9yPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRXb3JrUHJvZHVjdF9Ub29sTWVudG9yKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciIHRyYW5zaWVudD0idHJ1ZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1Rvb2xNZW50b3InIGdyb3VwPScjZ3JvdXA6MjQnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdDxTdHJpbmc+IGdldFRvb2xNZW50b3IoKTsKLQotfSAvLyBXb3JrUHJvZHVjdApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9Xb3JrUHJvZHVjdERlc2NyaXB0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvV29ya1Byb2R1Y3REZXNjcmlwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MDY0YzAwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9Xb3JrUHJvZHVjdERlc2NyaXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTEgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBXb3JrUHJvZHVjdERlc2NyaXB0aW9uLmphdmEsdiAxLjIgMjAwOC8wMS8zMCAwMDo0MTo0OCBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWE7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+V29yayBQcm9kdWN0IERlc2NyaXB0aW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQSBnZW5lcmFsaXplZCBDb250ZW50IERlc2NyaXB0aW9uIHRoYXQgaXMgdXNlZCB0byBzdG9yZSB0aGUgdGV4dHVhbCBkZXNjcmlwdGlvbiBmb3IgYSBXb3JrIFByb2R1Y3QuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya1Byb2R1Y3REZXNjcmlwdGlvbiNnZXRJbXBhY3RPZk5vdEhhdmluZyA8ZW0+SW1wYWN0IE9mIE5vdCBIYXZpbmc8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRpb24jZ2V0UHVycG9zZSA8ZW0+UHVycG9zZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya1Byb2R1Y3REZXNjcmlwdGlvbiNnZXRSZWFzb25zRm9yTm90TmVlZGluZyA8ZW0+UmVhc29ucyBGb3IgTm90IE5lZWRpbmc8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0V29ya1Byb2R1Y3REZXNjcmlwdGlvbigpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nV29ya1Byb2R1Y3REZXNjcmlwdGlvbicga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFdvcmtQcm9kdWN0RGVzY3JpcHRpb24gZXh0ZW5kcyBDb250ZW50RGVzY3JpcHRpb24gewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkltcGFjdCBPZiBOb3QgSGF2aW5nPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBEZXNjcmliZXMgdGhlIGNvbnNlcXVlbmNlcyBvZiBub3QgcHJvZHVjaW5nIHRoZSB3b3JrIHByb2R1Y3QuICBUaGlzIGlzIGludGVuZGVkIHRvIGFpZCBpbiB0aGUgdGFpbG9yaW5nIHRoZSBtZXRob2QvcHJvY2VzcyB0byB0aGUgbmVlZHMgb2YgYSBzcGVjaWZpYyBwcm9qZWN0LgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JbXBhY3QgT2YgTm90IEhhdmluZzwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0SW1wYWN0T2ZOb3RIYXZpbmcoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRXb3JrUHJvZHVjdERlc2NyaXB0aW9uX0ltcGFjdE9mTm90SGF2aW5nKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0ltcGFjdE9mTm90SGF2aW5nJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldEltcGFjdE9mTm90SGF2aW5nKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0aW9uI2dldEltcGFjdE9mTm90SGF2aW5nIDxlbT5JbXBhY3QgT2YgTm90IEhhdmluZzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SW1wYWN0IE9mIE5vdCBIYXZpbmc8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEltcGFjdE9mTm90SGF2aW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRJbXBhY3RPZk5vdEhhdmluZyhTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UHVycG9zZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogRGVzY3JpYmVzIHdoeSB0aGUgd29yayBwcm9kdWN0IGlzIHByb2R1Y2VkIGFuZCB0byB3aGF0IHVzZSBpdCB3aWxsIGJlIHB1dC4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UHVycG9zZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UHVycG9zZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFdvcmtQcm9kdWN0RGVzY3JpcHRpb25fUHVycG9zZSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdQdXJwb3NlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFB1cnBvc2UoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRpb24jZ2V0UHVycG9zZSA8ZW0+UHVycG9zZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UHVycG9zZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UHVycG9zZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UHVycG9zZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmVhc29ucyBGb3IgTm90IE5lZWRpbmc8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIERlc2NyaWJlcyB0aGUgY2lyY3Vtc3RhbmNlcyBpbiB3aGljaCBpdCBpcyByZWFzb25hYmxlIG5vdCB0byBwcm9kdWNlIHRoZSB3b3JrIHByb2R1Y3QuICBUaGlzIGlzIGludGVuZGVkIHRvIGFpZCBpbiB0aGUgdGFpbG9yaW5nIG9mIHRoZSBtZXRob2QvcHJvY2VzcyB0byB0aGUgbmVlZHMgb2YgYSBzcGVjaWZpYyBwcm9qZWN0LgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZWFzb25zIEZvciBOb3QgTmVlZGluZzwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UmVhc29uc0Zvck5vdE5lZWRpbmcoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRXb3JrUHJvZHVjdERlc2NyaXB0aW9uX1JlYXNvbnNGb3JOb3ROZWVkaW5nKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1JlYXNvbnNGb3JOb3ROZWVkaW5nJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFJlYXNvbnNGb3JOb3ROZWVkaW5nKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0aW9uI2dldFJlYXNvbnNGb3JOb3ROZWVkaW5nIDxlbT5SZWFzb25zIEZvciBOb3QgTmVlZGluZzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UmVhc29ucyBGb3IgTm90IE5lZWRpbmc8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFJlYXNvbnNGb3JOb3ROZWVkaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRSZWFzb25zRm9yTm90TmVlZGluZyhTdHJpbmcgdmFsdWUpOwotCi19IC8vIFdvcmtQcm9kdWN0RGVzY3JpcHRpb24KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvV29ya1Byb2R1Y3REZXNjcmlwdG9yLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvV29ya1Byb2R1Y3REZXNjcmlwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1YTNkZjQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1dvcmtQcm9kdWN0RGVzY3JpcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjg5ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogV29ya1Byb2R1Y3REZXNjcmlwdG9yLmphdmEsdiAxLjIgMjAwOC8wMS8zMCAwMDo0MTo0OCBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Xb3JrIFByb2R1Y3QgRGVzY3JpcHRvcjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEEgc3BlY2lhbCBEZXNjcmlwdG9yIHRoYXQgcmVwcmVzZW50cyBhIFdvcmsgUHJvZHVjdCBpbiB0aGUgY29udGV4dCBvZiBvbmUgc3BlY2lmaWMgQWN0aXZpdHkuICBFdmVyeSBicmVha2Rvd24gc3RydWN0dXJlIGNhbiBkZWZpbmUgZGlmZmVyZW50IHJlbGF0aW9uc2hpcHMgb2YgV29yayBQcm9kdWN0IERlc2NyaXB0b3JzIHRvIFRhc2sgRGVzY3JpcHRvcnMgYW5kIFJvbGUgRGVzY3JpcHRvcnMuICBUaGVyZWZvcmUgb25lIFdvcmsgUHJvZHVjdCBjYW4gYmUgcmVwcmVzZW50ZWQgYnkgbWFueSBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvcnMgZWFjaCB3aXRoaW4gdGhlIGNvbnRleHQgb2YgYW4gQWN0aXZpdHkgd2l0aCBpdHMgb3duIHNldCBvZiByZWxhdGlvbnNoaXBzLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvciNnZXRXb3JrUHJvZHVjdCA8ZW0+V29yayBQcm9kdWN0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3IjZ2V0UmVzcG9uc2libGVSb2xlIDxlbT5SZXNwb25zaWJsZSBSb2xlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3IjZ2V0R3JvdXAyIDxlbT5Hcm91cDI8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvciNnZXRFeHRlcm5hbElucHV0VG8gPGVtPkV4dGVybmFsIElucHV0IFRvPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3IjZ2V0SW1wYWN0ZWRCeSA8ZW0+SW1wYWN0ZWQgQnk8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvciNnZXRJbXBhY3RzIDxlbT5JbXBhY3RzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3IjZ2V0TWFuZGF0b3J5SW5wdXRUbyA8ZW0+TWFuZGF0b3J5IElucHV0IFRvPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3IjZ2V0T3B0aW9uYWxJbnB1dFRvIDxlbT5PcHRpb25hbCBJbnB1dCBUbzwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yI2dldE91dHB1dEZyb20gPGVtPk91dHB1dCBGcm9tPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3IjZ2V0RGVsaXZlcmFibGVQYXJ0cyA8ZW0+RGVsaXZlcmFibGUgUGFydHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvciNnZXRBY3Rpdml0eUVudHJ5U3RhdGUgPGVtPkFjdGl2aXR5IEVudHJ5IFN0YXRlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3IjZ2V0QWN0aXZpdHlFeGl0U3RhdGUgPGVtPkFjdGl2aXR5IEV4aXQgU3RhdGU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yKCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdXb3JrUHJvZHVjdERlc2NyaXB0b3InIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBXb3JrUHJvZHVjdERlc2NyaXB0b3IgZXh0ZW5kcyBEZXNjcmlwdG9yIHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Xb3JrIFByb2R1Y3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPldvcmsgUHJvZHVjdDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Xb3JrIFByb2R1Y3Q8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFdvcmtQcm9kdWN0KFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX1dvcmtQcm9kdWN0KCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1dvcmtQcm9kdWN0JyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFdvcmtQcm9kdWN0KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3IjZ2V0V29ya1Byb2R1Y3QgPGVtPldvcmsgUHJvZHVjdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+V29yayBQcm9kdWN0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRXb3JrUHJvZHVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0V29ya1Byb2R1Y3QoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJlc3BvbnNpYmxlIFJvbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlJlc3BvbnNpYmxlIFJvbGU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmVzcG9uc2libGUgUm9sZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UmVzcG9uc2libGVSb2xlKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX1Jlc3BvbnNpYmxlUm9sZSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdSZXNwb25zaWJsZVJvbGUnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0UmVzcG9uc2libGVSb2xlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3IjZ2V0UmVzcG9uc2libGVSb2xlIDxlbT5SZXNwb25zaWJsZSBSb2xlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5SZXNwb25zaWJsZSBSb2xlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRSZXNwb25zaWJsZVJvbGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFJlc3BvbnNpYmxlUm9sZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+R3JvdXAyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcC5FbnRyeX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Hcm91cDI8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Hcm91cDI8L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9Hcm91cDIoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVGZWF0dXJlTWFwRW50cnkiIG1hbnk9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2dyb3VwJyBuYW1lPSdncm91cDozMyciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUZlYXR1cmVNYXAgZ2V0R3JvdXAyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FeHRlcm5hbCBJbnB1dCBUbzwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RXh0ZXJuYWwgSW5wdXQgVG88L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FeHRlcm5hbCBJbnB1dCBUbzwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX0V4dGVybmFsSW5wdXRUbygpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIiB0cmFuc2llbnQ9InRydWUiIHZvbGF0aWxlPSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdFeHRlcm5hbElucHV0VG8nIGdyb3VwPScjZ3JvdXA6MzMnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdDxTdHJpbmc+IGdldEV4dGVybmFsSW5wdXRUbygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SW1wYWN0ZWQgQnk8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkltcGFjdGVkIEJ5PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SW1wYWN0ZWQgQnk8L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9JbXBhY3RlZEJ5KCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciIHRyYW5zaWVudD0idHJ1ZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0ltcGFjdGVkQnknIGdyb3VwPScjZ3JvdXA6MzMnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdDxTdHJpbmc+IGdldEltcGFjdGVkQnkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkltcGFjdHM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkltcGFjdHM8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JbXBhY3RzPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JfSW1wYWN0cygpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIiB0cmFuc2llbnQ9InRydWUiIHZvbGF0aWxlPSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdJbXBhY3RzJyBncm91cD0nI2dyb3VwOjMzJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3Q8U3RyaW5nPiBnZXRJbXBhY3RzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5NYW5kYXRvcnkgSW5wdXQgVG88L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk1hbmRhdG9yeSBJbnB1dCBUbzwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1hbmRhdG9yeSBJbnB1dCBUbzwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX01hbmRhdG9yeUlucHV0VG8oKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nTWFuZGF0b3J5SW5wdXRUbycgZ3JvdXA9JyNncm91cDozMyciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0PFN0cmluZz4gZ2V0TWFuZGF0b3J5SW5wdXRUbygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+T3B0aW9uYWwgSW5wdXQgVG88L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk9wdGlvbmFsIElucHV0IFRvPC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+T3B0aW9uYWwgSW5wdXQgVG88L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9PcHRpb25hbElucHV0VG8oKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nT3B0aW9uYWxJbnB1dFRvJyBncm91cD0nI2dyb3VwOjMzJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3Q8U3RyaW5nPiBnZXRPcHRpb25hbElucHV0VG8oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk91dHB1dCBGcm9tPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5PdXRwdXQgRnJvbTwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk91dHB1dCBGcm9tPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JfT3V0cHV0RnJvbSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIiB0cmFuc2llbnQ9InRydWUiIHZvbGF0aWxlPSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdPdXRwdXRGcm9tJyBncm91cD0nI2dyb3VwOjMzJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3Q8U3RyaW5nPiBnZXRPdXRwdXRGcm9tKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EZWxpdmVyYWJsZSBQYXJ0czwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RGVsaXZlcmFibGUgUGFydHM8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EZWxpdmVyYWJsZSBQYXJ0czwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX0RlbGl2ZXJhYmxlUGFydHMoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nRGVsaXZlcmFibGVQYXJ0cycgZ3JvdXA9JyNncm91cDozMyciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0PFN0cmluZz4gZ2V0RGVsaXZlcmFibGVQYXJ0cygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QWN0aXZpdHkgRW50cnkgU3RhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIEdpdmVuIHRoYXQgYW4gaW5zdGFuY2Ugb2YgV29yayBQcm9kdWN0IERlc2NyaXB0b3IgaGFzIGJlZW4gY3JlYXRlZCBmb3IgYSBzcGVjaWZpYyBBY3Rpdml0eSwgdGhlbiB0aGUgQWN0aXZpdHkgRW50cnkgU3RhdGUgYXR0cmlidXRlIHNwZWNpZmllcyB0aGUgZGVzaXJlZCBzdGF0ZSBvZiBpbnN0YW5jZXMgb2YgdGhlIHJlZmVyZW5jZWQgV29yayBQcm9kdWN0IHdoZW4gd29yayBvbiB0aGUgQWN0aXZpdHkgaXMgaW5pdGlhdGVkIChpLmUuIHdvcmsgb24gdGhlIEFjdGl2aXR5J3MgVGFzayBEZXNjcmlwdG9ycyBpcyBiZWluZyBpbml0aWF0ZWQgdGhhdCB1c2UgdGhpcyBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvciBhcyBpbnB1dCkuICAKLQkgKiBGb3Igc29tZSBXb3JrIFByb2R1Y3RzIHN0YXRlIGlzIGV4cHJlc3NlZCBpbiBwZXJjZW50YWdlIG9mIGNvbXBsZXRpb24sIGNvbXBsaWFuY2UgdG8gd29yayBwcm9kdWN0IGNoZWNrbGlzdCwgaW5mb3JtYWwgc3RhdGUgZGVzY3JpcHRpb25zLCBldGMuICBPdGhlcnMgaGF2ZSB2ZXJ5IHNwZWNpZmljIHN0YXRlcyBleHByZXNzZWQgYXMgZW51bWVyYXRpb25zIHN1Y2ggYXMgW2lkZW50aWZpZWQsIGJyaWVmbHkgZGVzY3JpYmVkLCBvdXRsaW5lZCwgZGV0YWlsZWRdIGZvciB1c2UgY2FzZXMuICBPdGhlciBXb3JrIFByb2R1Y3Qgc3RhdGVzIHJlbGF0ZSB0byBzb21lIHF1YWxpdHkgbWVhc3VyZXMgb3IgbGlmZWN5Y2xlIHN0YXRlcyBzdWNoIGFzIFtyZXZpZXdlZCwgaW1wbGVtZW50ZWQsIHRlc3RlZF0uCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkFjdGl2aXR5IEVudHJ5IFN0YXRlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRBY3Rpdml0eUVudHJ5U3RhdGUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JfQWN0aXZpdHlFbnRyeVN0YXRlKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2F0dHJpYnV0ZScgbmFtZT0nYWN0aXZpdHlFbnRyeVN0YXRlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldEFjdGl2aXR5RW50cnlTdGF0ZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yI2dldEFjdGl2aXR5RW50cnlTdGF0ZSA8ZW0+QWN0aXZpdHkgRW50cnkgU3RhdGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkFjdGl2aXR5IEVudHJ5IFN0YXRlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRBY3Rpdml0eUVudHJ5U3RhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEFjdGl2aXR5RW50cnlTdGF0ZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QWN0aXZpdHkgRXhpdCBTdGF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogR2l2ZW4gdGhhdCBhbiBpbnN0YW5jZSBvZiBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvciBoYXMgYmVlbiBjcmVhdGVkIGZvciBhIHNwZWNpZmljIEFjdGl2aXR5LCB0aGVuIHRoZSBBY3Rpdml0eSBFeGlzdCBTdGF0ZSBhdHRyaWJ1dGUgc3BlY2lmaWVzIHRoZSBkZXNpcmVkIHN0YXRlIG9mIGluc3RhbmNlcyBvZiB0aGUgcmVmZXJlbmNlZCBXb3JrIFByb2R1Y3Qgd2hlbiB3b3JrIG9uIHRoZSBBY3Rpdml0eSBpcyBmaW5pc2hlZCAoaS5lLiB3b3JrIG9uIHRoZSBBY3Rpdml0eSdzIFRhc2sgRGVzY3JpcHRvcnMgaGFzIGZpbmlzaGVkIHRoYXQgaGF2ZSB0aGlzIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9yIGFzIG91dHB1dCkuCi0JICogRm9yIHNvbWUgV29yayBQcm9kdWN0cyBzdGF0ZSBpcyBleHByZXNzZWQgaW4gcGVyY2VudGFnZSBvZiBjb21wbGV0aW9uLCBjb21wbGlhbmNlIHRvIHdvcmsgcHJvZHVjdCBjaGVja2xpc3QsIGluZm9ybWFsIHN0YXRlIGRlc2NyaXB0aW9ucywgZXRjLiAgT3RoZXJzIGhhdmUgdmVyeSBzcGVjaWZpYyBzdGF0ZXMgZXhwcmVzc2VkIGFzIGVudW1lcmF0aW9ucyBzdWNoIGFzIFtpZGVudGlmaWVkLCBicmllZmx5IGRlc2NyaWJlZCwgb3V0bGluZWQsIGRldGFpbGVkXSBmb3IgdXNlIGNhc2VzLiAgT3RoZXIgV29yayBQcm9kdWN0IHN0YXRlcyByZWxhdGUgdG8gc29tZSBxdWFsaXR5IG1lYXN1cmVzIG9yIGxpZmVjeWNsZSBzdGF0ZXMgc3VjaCBhcyBbcmV2aWV3ZWQsIGltcGxlbWVudGVkLCB0ZXN0ZWRdLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BY3Rpdml0eSBFeGl0IFN0YXRlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRBY3Rpdml0eUV4aXRTdGF0ZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9BY3Rpdml0eUV4aXRTdGF0ZSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdhdHRyaWJ1dGUnIG5hbWU9J2FjdGl2aXR5RXhpdFN0YXRlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldEFjdGl2aXR5RXhpdFN0YXRlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3IjZ2V0QWN0aXZpdHlFeGl0U3RhdGUgPGVtPkFjdGl2aXR5IEV4aXQgU3RhdGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkFjdGl2aXR5IEV4aXQgU3RhdGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEFjdGl2aXR5RXhpdFN0YXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRBY3Rpdml0eUV4aXRTdGF0ZShTdHJpbmcgdmFsdWUpOwotCi19IC8vIFdvcmtQcm9kdWN0RGVzY3JpcHRvcgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9Xb3JrUHJvZHVjdFR5cGUuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9Xb3JrUHJvZHVjdFR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjA5ZGJhZi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvV29ya1Byb2R1Y3RUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFdvcmtQcm9kdWN0VHlwZS5qYXZhLHYgMS4yIDIwMDgvMDEvMzAgMDA6NDE6NDgga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXA7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPldvcmsgUHJvZHVjdCBUeXBlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQSBzZWNvbmQgY2F0ZWdvcnkgZm9yIHdvcmsgcHJvZHVjdHMsIHdoaWNoIGluIGNvbnRyYXN0IHRvIERvbWFpbiBpcyBtb3JlIHByZXNlbnRhdGlvbiBvcmllbnRlZC4gIEEgd29yayBwcm9kdWN0IGNhbiBoYXZlIG1hbnkgV29yayBQcm9kdWN0IFR5cGVzLiAgRXhhbXBsZXMsIGZvciBhIFdvcmsgUHJvZHVjdCBUeXBlIGlzICJDbGFzcyBEaWFncmFtIiwgd2hpY2ggY2F0ZWdvcml6ZXMgdGhlIEFydGlmYWN0cyBBbmFseXNpcyBNb2RlbCwgRGVzaWduIE1vZGVsLCBVc2VyIEV4cGVyaWVuY2UgTW9kZWwsIG9yICJTcGVjaWZpY2F0aW9uIiwgd2hpY2ggY2F0ZWdvcml6ZXMgcmVxdWlyZW1lbnRzIHNwZWNpZmljYXRpb25zIHRoYXQgZGVmaW5lIGEgc3lzdGVtIHdpdGggYSB3ZWxsLWRlZmluZWQgc3lzdGVtIGJvdW5kYXJ5LCBzdWNoIGFzIHVzZSBjYXNlIG9yIGZ1bmN0aW9uYWwgcmVxdWlyZW1lbnRzIHNwZWNpZmljYXRpb24uICBBIFdvcmsgUHJvZHVjdCBjYW4gYmUgY2F0ZWdvcml6ZWQgdG8gYmUgb2YgbWFueSBXb3JrIFByb2R1Y3QgVHlwZXMuICBGb3IgZXhhbXBsZSwgYSB1c2UgY2FzZSBtb2RlbCBjYW4gYmUgY2F0ZWdvcml6ZWQgYXMgYSBTcGVjaWZpY2F0aW9uIGFzIHdlbGwgYXMgRGlhZ3JhbSBXb3JrIFByb2R1Y3QgVHlwZS4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdFR5cGUjZ2V0R3JvdXAyIDxlbT5Hcm91cDI8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtQcm9kdWN0VHlwZSNnZXRXb3JrUHJvZHVjdCA8ZW0+V29yayBQcm9kdWN0PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFdvcmtQcm9kdWN0VHlwZSgpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nV29ya1Byb2R1Y3RUeXBlJyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgV29ya1Byb2R1Y3RUeXBlIGV4dGVuZHMgQ29udGVudENhdGVnb3J5IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Hcm91cDI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwLkVudHJ5fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkdyb3VwMjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkdyb3VwMjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0V29ya1Byb2R1Y3RUeXBlX0dyb3VwMigpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUZlYXR1cmVNYXBFbnRyeSIgbWFueT0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZ3JvdXAnIG5hbWU9J2dyb3VwOjI0JyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRmVhdHVyZU1hcCBnZXRHcm91cDIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPldvcmsgUHJvZHVjdDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+V29yayBQcm9kdWN0PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+V29yayBQcm9kdWN0PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRXb3JrUHJvZHVjdFR5cGVfV29ya1Byb2R1Y3QoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nV29ya1Byb2R1Y3QnIGdyb3VwPScjZ3JvdXA6MjQnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdDxTdHJpbmc+IGdldFdvcmtQcm9kdWN0KCk7Ci0KLX0gLy8gV29ya1Byb2R1Y3RUeXBlClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvQWN0aXZpdHlEZXNjcmlwdGlvbkltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0FjdGl2aXR5RGVzY3JpcHRpb25JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlMWY3OTIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvQWN0aXZpdHlEZXNjcmlwdGlvbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3MSArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IEFjdGl2aXR5RGVzY3JpcHRpb25JbXBsLmphdmEsdiAxLjIgMjAwOC8wMS8zMCAwMDo0MTo0NyBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFjdGl2aXR5RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkFjdGl2aXR5IERlc2NyaXB0aW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkFjdGl2aXR5RGVzY3JpcHRpb25JbXBsI2dldEFsdGVybmF0aXZlcyA8ZW0+QWx0ZXJuYXRpdmVzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkFjdGl2aXR5RGVzY3JpcHRpb25JbXBsI2dldEhvd1RvU3RhZmYgPGVtPkhvdyBUbyBTdGFmZjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5BY3Rpdml0eURlc2NyaXB0aW9uSW1wbCNnZXRQdXJwb3NlIDxlbT5QdXJwb3NlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZpdHlEZXNjcmlwdGlvbkltcGwgZXh0ZW5kcyBCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb25JbXBsIGltcGxlbWVudHMgQWN0aXZpdHlEZXNjcmlwdGlvbiB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFsdGVybmF0aXZlcygpIDxlbT5BbHRlcm5hdGl2ZXM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFsdGVybmF0aXZlcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUxURVJOQVRJVkVTX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFsdGVybmF0aXZlcygpIDxlbT5BbHRlcm5hdGl2ZXM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFsdGVybmF0aXZlcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBhbHRlcm5hdGl2ZXMgPSBBTFRFUk5BVElWRVNfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SG93VG9TdGFmZigpIDxlbT5Ib3cgVG8gU3RhZmY8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEhvd1RvU3RhZmYoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEhPV19UT19TVEFGRl9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRIb3dUb1N0YWZmKCkgPGVtPkhvdyBUbyBTdGFmZjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SG93VG9TdGFmZigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBob3dUb1N0YWZmID0gSE9XX1RPX1NUQUZGX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFB1cnBvc2UoKSA8ZW0+UHVycG9zZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UHVycG9zZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFVSUE9TRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQdXJwb3NlKCkgPGVtPlB1cnBvc2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFB1cnBvc2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgcHVycG9zZSA9IFBVUlBPU0VfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQWN0aXZpdHlEZXNjcmlwdGlvbkltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLkFDVElWSVRZX0RFU0NSSVBUSU9OOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0QWx0ZXJuYXRpdmVzKCkgewotCQlyZXR1cm4gYWx0ZXJuYXRpdmVzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFsdGVybmF0aXZlcyhTdHJpbmcgbmV3QWx0ZXJuYXRpdmVzKSB7Ci0JCVN0cmluZyBvbGRBbHRlcm5hdGl2ZXMgPSBhbHRlcm5hdGl2ZXM7Ci0JCWFsdGVybmF0aXZlcyA9IG5ld0FsdGVybmF0aXZlczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5BQ1RJVklUWV9ERVNDUklQVElPTl9fQUxURVJOQVRJVkVTLCBvbGRBbHRlcm5hdGl2ZXMsIGFsdGVybmF0aXZlcykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SG93VG9TdGFmZigpIHsKLQkJcmV0dXJuIGhvd1RvU3RhZmY7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SG93VG9TdGFmZihTdHJpbmcgbmV3SG93VG9TdGFmZikgewotCQlTdHJpbmcgb2xkSG93VG9TdGFmZiA9IGhvd1RvU3RhZmY7Ci0JCWhvd1RvU3RhZmYgPSBuZXdIb3dUb1N0YWZmOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLkFDVElWSVRZX0RFU0NSSVBUSU9OX19IT1dfVE9fU1RBRkYsIG9sZEhvd1RvU3RhZmYsIGhvd1RvU3RhZmYpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFB1cnBvc2UoKSB7Ci0JCXJldHVybiBwdXJwb3NlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFB1cnBvc2UoU3RyaW5nIG5ld1B1cnBvc2UpIHsKLQkJU3RyaW5nIG9sZFB1cnBvc2UgPSBwdXJwb3NlOwotCQlwdXJwb3NlID0gbmV3UHVycG9zZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5BQ1RJVklUWV9ERVNDUklQVElPTl9fUFVSUE9TRSwgb2xkUHVycG9zZSwgcHVycG9zZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9ERVNDUklQVElPTl9fQUxURVJOQVRJVkVTOgotCQkJCXJldHVybiBnZXRBbHRlcm5hdGl2ZXMoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9ERVNDUklQVElPTl9fSE9XX1RPX1NUQUZGOgotCQkJCXJldHVybiBnZXRIb3dUb1N0YWZmKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfREVTQ1JJUFRJT05fX1BVUlBPU0U6Ci0JCQkJcmV0dXJuIGdldFB1cnBvc2UoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX0RFU0NSSVBUSU9OX19BTFRFUk5BVElWRVM6Ci0JCQkJc2V0QWx0ZXJuYXRpdmVzKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9ERVNDUklQVElPTl9fSE9XX1RPX1NUQUZGOgotCQkJCXNldEhvd1RvU3RhZmYoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX0RFU0NSSVBUSU9OX19QVVJQT1NFOgotCQkJCXNldFB1cnBvc2UoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9ERVNDUklQVElPTl9fQUxURVJOQVRJVkVTOgotCQkJCXNldEFsdGVybmF0aXZlcyhBTFRFUk5BVElWRVNfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9ERVNDUklQVElPTl9fSE9XX1RPX1NUQUZGOgotCQkJCXNldEhvd1RvU3RhZmYoSE9XX1RPX1NUQUZGX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfREVTQ1JJUFRJT05fX1BVUlBPU0U6Ci0JCQkJc2V0UHVycG9zZShQVVJQT1NFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9ERVNDUklQVElPTl9fQUxURVJOQVRJVkVTOgotCQkJCXJldHVybiBBTFRFUk5BVElWRVNfRURFRkFVTFQgPT0gbnVsbCA/IGFsdGVybmF0aXZlcyAhPSBudWxsIDogIUFMVEVSTkFUSVZFU19FREVGQVVMVC5lcXVhbHMoYWx0ZXJuYXRpdmVzKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9ERVNDUklQVElPTl9fSE9XX1RPX1NUQUZGOgotCQkJCXJldHVybiBIT1dfVE9fU1RBRkZfRURFRkFVTFQgPT0gbnVsbCA/IGhvd1RvU3RhZmYgIT0gbnVsbCA6ICFIT1dfVE9fU1RBRkZfRURFRkFVTFQuZXF1YWxzKGhvd1RvU3RhZmYpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX0RFU0NSSVBUSU9OX19QVVJQT1NFOgotCQkJCXJldHVybiBQVVJQT1NFX0VERUZBVUxUID09IG51bGwgPyBwdXJwb3NlICE9IG51bGwgOiAhUFVSUE9TRV9FREVGQVVMVC5lcXVhbHMocHVycG9zZSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChhbHRlcm5hdGl2ZXM6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGFsdGVybmF0aXZlcyk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgaG93VG9TdGFmZjogIik7Ci0JCXJlc3VsdC5hcHBlbmQoaG93VG9TdGFmZik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcHVycG9zZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQocHVycG9zZSk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL0FjdGl2aXR5RGVzY3JpcHRpb25JbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvQWN0aXZpdHlJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9BY3Rpdml0eUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWUzOTMxZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9BY3Rpdml0eUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1MiArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IEFjdGl2aXR5SW1wbC5qYXZhLHYgMS4yIDIwMDgvMDEvMzAgMDA6NDE6NDcga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkJhc2ljRmVhdHVyZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlZhcmlhYmlsaXR5VHlwZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkFjdGl2aXR5PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkFjdGl2aXR5SW1wbCNnZXRQcmVjb25kaXRpb24gPGVtPlByZWNvbmRpdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5BY3Rpdml0eUltcGwjZ2V0UG9zdGNvbmRpdGlvbiA8ZW0+UG9zdGNvbmRpdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5BY3Rpdml0eUltcGwjZ2V0R3JvdXAzIDxlbT5Hcm91cDM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQWN0aXZpdHlJbXBsI2dldEJyZWFrZG93bkVsZW1lbnQgPGVtPkJyZWFrZG93biBFbGVtZW50PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkFjdGl2aXR5SW1wbCNnZXRSb2FkbWFwIDxlbT5Sb2FkbWFwPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkFjdGl2aXR5SW1wbCNpc0lzRW5hY3RhYmxlIDxlbT5JcyBFbmFjdGFibGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQWN0aXZpdHlJbXBsI2dldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQgPGVtPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQWN0aXZpdHlJbXBsI2dldFZhcmlhYmlsaXR5VHlwZSA8ZW0+VmFyaWFiaWxpdHkgVHlwZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXR5SW1wbCBleHRlbmRzIFdvcmtCcmVha2Rvd25FbGVtZW50SW1wbCBpbXBsZW1lbnRzIEFjdGl2aXR5IHsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJlY29uZGl0aW9uKCkgPGVtPlByZWNvbmRpdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UHJlY29uZGl0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVDT05ESVRJT05fRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJlY29uZGl0aW9uKCkgPGVtPlByZWNvbmRpdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UHJlY29uZGl0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHByZWNvbmRpdGlvbiA9IFBSRUNPTkRJVElPTl9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQb3N0Y29uZGl0aW9uKCkgPGVtPlBvc3Rjb25kaXRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFBvc3Rjb25kaXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBPU1RDT05ESVRJT05fRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UG9zdGNvbmRpdGlvbigpIDxlbT5Qb3N0Y29uZGl0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQb3N0Y29uZGl0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHBvc3Rjb25kaXRpb24gPSBQT1NUQ09ORElUSU9OX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0R3JvdXAzKCkgPGVtPkdyb3VwMzwvZW0+fScgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRHcm91cDMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBGZWF0dXJlTWFwIGdyb3VwMzsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0lzRW5hY3RhYmxlKCkgPGVtPklzIEVuYWN0YWJsZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNJc0VuYWN0YWJsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIElTX0VOQUNUQUJMRV9FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNJc0VuYWN0YWJsZSgpIDxlbT5JcyBFbmFjdGFibGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzSXNFbmFjdGFibGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzRW5hY3RhYmxlID0gSVNfRU5BQ1RBQkxFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBJcyBFbmFjdGFibGUgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzRW5hY3RhYmxlRVNldDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkgPGVtPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlRfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpIDxlbT5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQgPSBWQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZhcmlhYmlsaXR5VHlwZSgpIDxlbT5WYXJpYWJpbGl0eSBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRWYXJpYWJpbGl0eVR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgVmFyaWFiaWxpdHlUeXBlIFZBUklBQklMSVRZX1RZUEVfRURFRkFVTFQgPSBWYXJpYWJpbGl0eVR5cGUuTkE7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWYXJpYWJpbGl0eVR5cGUoKSA8ZW0+VmFyaWFiaWxpdHkgVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VmFyaWFiaWxpdHlUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgVmFyaWFiaWxpdHlUeXBlIHZhcmlhYmlsaXR5VHlwZSA9IFZBUklBQklMSVRZX1RZUEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIFZhcmlhYmlsaXR5IFR5cGUgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHZhcmlhYmlsaXR5VHlwZUVTZXQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQWN0aXZpdHlJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5BQ1RJVklUWTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFByZWNvbmRpdGlvbigpIHsKLQkJcmV0dXJuIHByZWNvbmRpdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQcmVjb25kaXRpb24oU3RyaW5nIG5ld1ByZWNvbmRpdGlvbikgewotCQlTdHJpbmcgb2xkUHJlY29uZGl0aW9uID0gcHJlY29uZGl0aW9uOwotCQlwcmVjb25kaXRpb24gPSBuZXdQcmVjb25kaXRpb247Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuQUNUSVZJVFlfX1BSRUNPTkRJVElPTiwgb2xkUHJlY29uZGl0aW9uLCBwcmVjb25kaXRpb24pKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFBvc3Rjb25kaXRpb24oKSB7Ci0JCXJldHVybiBwb3N0Y29uZGl0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBvc3Rjb25kaXRpb24oU3RyaW5nIG5ld1Bvc3Rjb25kaXRpb24pIHsKLQkJU3RyaW5nIG9sZFBvc3Rjb25kaXRpb24gPSBwb3N0Y29uZGl0aW9uOwotCQlwb3N0Y29uZGl0aW9uID0gbmV3UG9zdGNvbmRpdGlvbjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5BQ1RJVklUWV9fUE9TVENPTkRJVElPTiwgb2xkUG9zdGNvbmRpdGlvbiwgcG9zdGNvbmRpdGlvbikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBGZWF0dXJlTWFwIGdldEdyb3VwMygpIHsKLQkJaWYgKGdyb3VwMyA9PSBudWxsKSB7Ci0JCQlncm91cDMgPSBuZXcgQmFzaWNGZWF0dXJlTWFwKHRoaXMsIFVtYVBhY2thZ2UuQUNUSVZJVFlfX0dST1VQMyk7Ci0JCX0KLQkJcmV0dXJuIGdyb3VwMzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8QnJlYWtkb3duRWxlbWVudD4gZ2V0QnJlYWtkb3duRWxlbWVudCgpIHsKLQkJcmV0dXJuIGdldEdyb3VwMygpLmxpc3QoVW1hUGFja2FnZS5MaXRlcmFscy5BQ1RJVklUWV9fQlJFQUtET1dOX0VMRU1FTlQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxTdHJpbmc+IGdldFJvYWRtYXAoKSB7Ci0JCXJldHVybiBnZXRHcm91cDMoKS5saXN0KFVtYVBhY2thZ2UuTGl0ZXJhbHMuQUNUSVZJVFlfX1JPQURNQVApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzSXNFbmFjdGFibGUoKSB7Ci0JCXJldHVybiBpc0VuYWN0YWJsZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJc0VuYWN0YWJsZShib29sZWFuIG5ld0lzRW5hY3RhYmxlKSB7Ci0JCWJvb2xlYW4gb2xkSXNFbmFjdGFibGUgPSBpc0VuYWN0YWJsZTsKLQkJaXNFbmFjdGFibGUgPSBuZXdJc0VuYWN0YWJsZTsKLQkJYm9vbGVhbiBvbGRJc0VuYWN0YWJsZUVTZXQgPSBpc0VuYWN0YWJsZUVTZXQ7Ci0JCWlzRW5hY3RhYmxlRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuQUNUSVZJVFlfX0lTX0VOQUNUQUJMRSwgb2xkSXNFbmFjdGFibGUsIGlzRW5hY3RhYmxlLCAhb2xkSXNFbmFjdGFibGVFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRJc0VuYWN0YWJsZSgpIHsKLQkJYm9vbGVhbiBvbGRJc0VuYWN0YWJsZSA9IGlzRW5hY3RhYmxlOwotCQlib29sZWFuIG9sZElzRW5hY3RhYmxlRVNldCA9IGlzRW5hY3RhYmxlRVNldDsKLQkJaXNFbmFjdGFibGUgPSBJU19FTkFDVEFCTEVfRURFRkFVTFQ7Ci0JCWlzRW5hY3RhYmxlRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIFVtYVBhY2thZ2UuQUNUSVZJVFlfX0lTX0VOQUNUQUJMRSwgb2xkSXNFbmFjdGFibGUsIElTX0VOQUNUQUJMRV9FREVGQVVMVCwgb2xkSXNFbmFjdGFibGVFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRJc0VuYWN0YWJsZSgpIHsKLQkJcmV0dXJuIGlzRW5hY3RhYmxlRVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSB7Ci0JCXJldHVybiB2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoU3RyaW5nIG5ld1ZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQpIHsKLQkJU3RyaW5nIG9sZFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQgPSB2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50OwotCQl2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50ID0gbmV3VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5BQ1RJVklUWV9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVCwgb2xkVmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCwgdmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBWYXJpYWJpbGl0eVR5cGUgZ2V0VmFyaWFiaWxpdHlUeXBlKCkgewotCQlyZXR1cm4gdmFyaWFiaWxpdHlUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZhcmlhYmlsaXR5VHlwZShWYXJpYWJpbGl0eVR5cGUgbmV3VmFyaWFiaWxpdHlUeXBlKSB7Ci0JCVZhcmlhYmlsaXR5VHlwZSBvbGRWYXJpYWJpbGl0eVR5cGUgPSB2YXJpYWJpbGl0eVR5cGU7Ci0JCXZhcmlhYmlsaXR5VHlwZSA9IG5ld1ZhcmlhYmlsaXR5VHlwZSA9PSBudWxsID8gVkFSSUFCSUxJVFlfVFlQRV9FREVGQVVMVCA6IG5ld1ZhcmlhYmlsaXR5VHlwZTsKLQkJYm9vbGVhbiBvbGRWYXJpYWJpbGl0eVR5cGVFU2V0ID0gdmFyaWFiaWxpdHlUeXBlRVNldDsKLQkJdmFyaWFiaWxpdHlUeXBlRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuQUNUSVZJVFlfX1ZBUklBQklMSVRZX1RZUEUsIG9sZFZhcmlhYmlsaXR5VHlwZSwgdmFyaWFiaWxpdHlUeXBlLCAhb2xkVmFyaWFiaWxpdHlUeXBlRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0VmFyaWFiaWxpdHlUeXBlKCkgewotCQlWYXJpYWJpbGl0eVR5cGUgb2xkVmFyaWFiaWxpdHlUeXBlID0gdmFyaWFiaWxpdHlUeXBlOwotCQlib29sZWFuIG9sZFZhcmlhYmlsaXR5VHlwZUVTZXQgPSB2YXJpYWJpbGl0eVR5cGVFU2V0OwotCQl2YXJpYWJpbGl0eVR5cGUgPSBWQVJJQUJJTElUWV9UWVBFX0VERUZBVUxUOwotCQl2YXJpYWJpbGl0eVR5cGVFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgVW1hUGFja2FnZS5BQ1RJVklUWV9fVkFSSUFCSUxJVFlfVFlQRSwgb2xkVmFyaWFiaWxpdHlUeXBlLCBWQVJJQUJJTElUWV9UWVBFX0VERUZBVUxULCBvbGRWYXJpYWJpbGl0eVR5cGVFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRWYXJpYWJpbGl0eVR5cGUoKSB7Ci0JCXJldHVybiB2YXJpYWJpbGl0eVR5cGVFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9fR1JPVVAzOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0R3JvdXAzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9fQlJFQUtET1dOX0VMRU1FTlQ6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRCcmVha2Rvd25FbGVtZW50KCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX19QUkVDT05ESVRJT046Ci0JCQkJcmV0dXJuIGdldFByZWNvbmRpdGlvbigpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX19QT1NUQ09ORElUSU9OOgotCQkJCXJldHVybiBnZXRQb3N0Y29uZGl0aW9uKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX0dST1VQMzoKLQkJCQlpZiAoY29yZVR5cGUpIHJldHVybiBnZXRHcm91cDMoKTsKLQkJCQlyZXR1cm4gKChGZWF0dXJlTWFwLkludGVybmFsKWdldEdyb3VwMygpKS5nZXRXcmFwcGVyKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX0JSRUFLRE9XTl9FTEVNRU5UOgotCQkJCXJldHVybiBnZXRCcmVha2Rvd25FbGVtZW50KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX1JPQURNQVA6Ci0JCQkJcmV0dXJuIGdldFJvYWRtYXAoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9fSVNfRU5BQ1RBQkxFOgotCQkJCXJldHVybiBpc0lzRW5hY3RhYmxlKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UOgotCQkJCXJldHVybiBnZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX1ZBUklBQklMSVRZX1RZUEU6Ci0JCQkJcmV0dXJuIGdldFZhcmlhYmlsaXR5VHlwZSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX19QUkVDT05ESVRJT046Ci0JCQkJc2V0UHJlY29uZGl0aW9uKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9fUE9TVENPTkRJVElPTjoKLQkJCQlzZXRQb3N0Y29uZGl0aW9uKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9fR1JPVVAzOgotCQkJCSgoRmVhdHVyZU1hcC5JbnRlcm5hbClnZXRHcm91cDMoKSkuc2V0KG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX0JSRUFLRE9XTl9FTEVNRU5UOgotCQkJCWdldEJyZWFrZG93bkVsZW1lbnQoKS5jbGVhcigpOwotCQkJCWdldEJyZWFrZG93bkVsZW1lbnQoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIEJyZWFrZG93bkVsZW1lbnQ+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX1JPQURNQVA6Ci0JCQkJZ2V0Um9hZG1hcCgpLmNsZWFyKCk7Ci0JCQkJZ2V0Um9hZG1hcCgpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgU3RyaW5nPiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX19JU19FTkFDVEFCTEU6Ci0JCQkJc2V0SXNFbmFjdGFibGUoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UOgotCQkJCXNldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX19WQVJJQUJJTElUWV9UWVBFOgotCQkJCXNldFZhcmlhYmlsaXR5VHlwZSgoVmFyaWFiaWxpdHlUeXBlKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX19QUkVDT05ESVRJT046Ci0JCQkJc2V0UHJlY29uZGl0aW9uKFBSRUNPTkRJVElPTl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX19QT1NUQ09ORElUSU9OOgotCQkJCXNldFBvc3Rjb25kaXRpb24oUE9TVENPTkRJVElPTl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX19HUk9VUDM6Ci0JCQkJZ2V0R3JvdXAzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX0JSRUFLRE9XTl9FTEVNRU5UOgotCQkJCWdldEJyZWFrZG93bkVsZW1lbnQoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9fUk9BRE1BUDoKLQkJCQlnZXRSb2FkbWFwKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX0lTX0VOQUNUQUJMRToKLQkJCQl1bnNldElzRW5hY3RhYmxlKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UOgotCQkJCXNldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX19WQVJJQUJJTElUWV9UWVBFOgotCQkJCXVuc2V0VmFyaWFiaWxpdHlUeXBlKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX1BSRUNPTkRJVElPTjoKLQkJCQlyZXR1cm4gUFJFQ09ORElUSU9OX0VERUZBVUxUID09IG51bGwgPyBwcmVjb25kaXRpb24gIT0gbnVsbCA6ICFQUkVDT05ESVRJT05fRURFRkFVTFQuZXF1YWxzKHByZWNvbmRpdGlvbik7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX1BPU1RDT05ESVRJT046Ci0JCQkJcmV0dXJuIFBPU1RDT05ESVRJT05fRURFRkFVTFQgPT0gbnVsbCA/IHBvc3Rjb25kaXRpb24gIT0gbnVsbCA6ICFQT1NUQ09ORElUSU9OX0VERUZBVUxULmVxdWFscyhwb3N0Y29uZGl0aW9uKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9fR1JPVVAzOgotCQkJCXJldHVybiBncm91cDMgIT0gbnVsbCAmJiAhZ3JvdXAzLmlzRW1wdHkoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9fQlJFQUtET1dOX0VMRU1FTlQ6Ci0JCQkJcmV0dXJuICFnZXRCcmVha2Rvd25FbGVtZW50KCkuaXNFbXB0eSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX19ST0FETUFQOgotCQkJCXJldHVybiAhZ2V0Um9hZG1hcCgpLmlzRW1wdHkoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9fSVNfRU5BQ1RBQkxFOgotCQkJCXJldHVybiBpc1NldElzRW5hY3RhYmxlKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQ6Ci0JCQkJcmV0dXJuIFZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlRfRURFRkFVTFQgPT0gbnVsbCA/IHZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQgIT0gbnVsbCA6ICFWQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UX0VERUZBVUxULmVxdWFscyh2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KTsKLQkJCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9fVkFSSUFCSUxJVFlfVFlQRToKLQkJCQlyZXR1cm4gaXNTZXRWYXJpYWJpbGl0eVR5cGUoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHByZWNvbmRpdGlvbjogIik7Ci0JCXJlc3VsdC5hcHBlbmQocHJlY29uZGl0aW9uKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBwb3N0Y29uZGl0aW9uOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChwb3N0Y29uZGl0aW9uKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBncm91cDM6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGdyb3VwMyk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgaXNFbmFjdGFibGU6ICIpOwotCQlpZiAoaXNFbmFjdGFibGVFU2V0KSByZXN1bHQuYXBwZW5kKGlzRW5hY3RhYmxlKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgdmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudDogIik7Ci0JCXJlc3VsdC5hcHBlbmQodmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgdmFyaWFiaWxpdHlUeXBlOiAiKTsKLQkJaWYgKHZhcmlhYmlsaXR5VHlwZUVTZXQpIHJlc3VsdC5hcHBlbmQodmFyaWFiaWxpdHlUeXBlKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL0FjdGl2aXR5SW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0FwcGxpY2FibGVNZXRhQ2xhc3NJbmZvSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvQXBwbGljYWJsZU1ldGFDbGFzc0luZm9JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkMTI5MGQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvQXBwbGljYWJsZU1ldGFDbGFzc0luZm9JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDAgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBBcHBsaWNhYmxlTWV0YUNsYXNzSW5mb0ltcGwuamF2YSx2IDEuMSAyMDA4LzAxLzMwIDAwOjQxOjQ3IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQXBwbGljYWJsZU1ldGFDbGFzc0luZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkFwcGxpY2FibGUgTWV0YSBDbGFzcyBJbmZvPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvSW1wbCNpc0lzUHJpbWFyeUV4dGVuc2lvbiA8ZW0+SXMgUHJpbWFyeSBFeHRlbnNpb248L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBBcHBsaWNhYmxlTWV0YUNsYXNzSW5mb0ltcGwgZXh0ZW5kcyBQYWNrYWdlYWJsZUVsZW1lbnRJbXBsIGltcGxlbWVudHMgQXBwbGljYWJsZU1ldGFDbGFzc0luZm8gewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0lzUHJpbWFyeUV4dGVuc2lvbigpIDxlbT5JcyBQcmltYXJ5IEV4dGVuc2lvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNJc1ByaW1hcnlFeHRlbnNpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBJU19QUklNQVJZX0VYVEVOU0lPTl9FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNJc1ByaW1hcnlFeHRlbnNpb24oKSA8ZW0+SXMgUHJpbWFyeSBFeHRlbnNpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzSXNQcmltYXJ5RXh0ZW5zaW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1ByaW1hcnlFeHRlbnNpb24gPSBJU19QUklNQVJZX0VYVEVOU0lPTl9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgSXMgUHJpbWFyeSBFeHRlbnNpb24gYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzUHJpbWFyeUV4dGVuc2lvbkVTZXQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQXBwbGljYWJsZU1ldGFDbGFzc0luZm9JbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5BUFBMSUNBQkxFX01FVEFfQ0xBU1NfSU5GTzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0lzUHJpbWFyeUV4dGVuc2lvbigpIHsKLQkJcmV0dXJuIGlzUHJpbWFyeUV4dGVuc2lvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJc1ByaW1hcnlFeHRlbnNpb24oYm9vbGVhbiBuZXdJc1ByaW1hcnlFeHRlbnNpb24pIHsKLQkJYm9vbGVhbiBvbGRJc1ByaW1hcnlFeHRlbnNpb24gPSBpc1ByaW1hcnlFeHRlbnNpb247Ci0JCWlzUHJpbWFyeUV4dGVuc2lvbiA9IG5ld0lzUHJpbWFyeUV4dGVuc2lvbjsKLQkJYm9vbGVhbiBvbGRJc1ByaW1hcnlFeHRlbnNpb25FU2V0ID0gaXNQcmltYXJ5RXh0ZW5zaW9uRVNldDsKLQkJaXNQcmltYXJ5RXh0ZW5zaW9uRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuQVBQTElDQUJMRV9NRVRBX0NMQVNTX0lORk9fX0lTX1BSSU1BUllfRVhURU5TSU9OLCBvbGRJc1ByaW1hcnlFeHRlbnNpb24sIGlzUHJpbWFyeUV4dGVuc2lvbiwgIW9sZElzUHJpbWFyeUV4dGVuc2lvbkVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldElzUHJpbWFyeUV4dGVuc2lvbigpIHsKLQkJYm9vbGVhbiBvbGRJc1ByaW1hcnlFeHRlbnNpb24gPSBpc1ByaW1hcnlFeHRlbnNpb247Ci0JCWJvb2xlYW4gb2xkSXNQcmltYXJ5RXh0ZW5zaW9uRVNldCA9IGlzUHJpbWFyeUV4dGVuc2lvbkVTZXQ7Ci0JCWlzUHJpbWFyeUV4dGVuc2lvbiA9IElTX1BSSU1BUllfRVhURU5TSU9OX0VERUZBVUxUOwotCQlpc1ByaW1hcnlFeHRlbnNpb25FU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgVW1hUGFja2FnZS5BUFBMSUNBQkxFX01FVEFfQ0xBU1NfSU5GT19fSVNfUFJJTUFSWV9FWFRFTlNJT04sIG9sZElzUHJpbWFyeUV4dGVuc2lvbiwgSVNfUFJJTUFSWV9FWFRFTlNJT05fRURFRkFVTFQsIG9sZElzUHJpbWFyeUV4dGVuc2lvbkVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldElzUHJpbWFyeUV4dGVuc2lvbigpIHsKLQkJcmV0dXJuIGlzUHJpbWFyeUV4dGVuc2lvbkVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkFQUExJQ0FCTEVfTUVUQV9DTEFTU19JTkZPX19JU19QUklNQVJZX0VYVEVOU0lPTjoKLQkJCQlyZXR1cm4gaXNJc1ByaW1hcnlFeHRlbnNpb24oKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5BUFBMSUNBQkxFX01FVEFfQ0xBU1NfSU5GT19fSVNfUFJJTUFSWV9FWFRFTlNJT046Ci0JCQkJc2V0SXNQcmltYXJ5RXh0ZW5zaW9uKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQVBQTElDQUJMRV9NRVRBX0NMQVNTX0lORk9fX0lTX1BSSU1BUllfRVhURU5TSU9OOgotCQkJCXVuc2V0SXNQcmltYXJ5RXh0ZW5zaW9uKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQVBQTElDQUJMRV9NRVRBX0NMQVNTX0lORk9fX0lTX1BSSU1BUllfRVhURU5TSU9OOgotCQkJCXJldHVybiBpc1NldElzUHJpbWFyeUV4dGVuc2lvbigpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoaXNQcmltYXJ5RXh0ZW5zaW9uOiAiKTsKLQkJaWYgKGlzUHJpbWFyeUV4dGVuc2lvbkVTZXQpIHJlc3VsdC5hcHBlbmQoaXNQcmltYXJ5RXh0ZW5zaW9uKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL0FwcGxpY2FibGVNZXRhQ2xhc3NJbmZvSW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvQXJ0aWZhY3REZXNjcmlwdGlvbkltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0FydGlmYWN0RGVzY3JpcHRpb25JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzYmE5YzUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvQXJ0aWZhY3REZXNjcmlwdGlvbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyNSArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IEFydGlmYWN0RGVzY3JpcHRpb25JbXBsLmphdmEsdiAxLjIgMjAwOC8wMS8zMCAwMDo0MTo0NyBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFydGlmYWN0RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkFydGlmYWN0IERlc2NyaXB0aW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkFydGlmYWN0RGVzY3JpcHRpb25JbXBsI2dldEJyaWVmT3V0bGluZSA8ZW0+QnJpZWYgT3V0bGluZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5BcnRpZmFjdERlc2NyaXB0aW9uSW1wbCNnZXRSZXByZXNlbnRhdGlvbk9wdGlvbnMgPGVtPlJlcHJlc2VudGF0aW9uIE9wdGlvbnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQXJ0aWZhY3REZXNjcmlwdGlvbkltcGwjZ2V0UmVwcmVzZW50YXRpb24gPGVtPlJlcHJlc2VudGF0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkFydGlmYWN0RGVzY3JpcHRpb25JbXBsI2dldE5vdGF0aW9uIDxlbT5Ob3RhdGlvbjwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEFydGlmYWN0RGVzY3JpcHRpb25JbXBsIGV4dGVuZHMgV29ya1Byb2R1Y3REZXNjcmlwdGlvbkltcGwgaW1wbGVtZW50cyBBcnRpZmFjdERlc2NyaXB0aW9uIHsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QnJpZWZPdXRsaW5lKCkgPGVtPkJyaWVmIE91dGxpbmU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEJyaWVmT3V0bGluZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlJJRUZfT1VUTElORV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRCcmllZk91dGxpbmUoKSA8ZW0+QnJpZWYgT3V0bGluZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QnJpZWZPdXRsaW5lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGJyaWVmT3V0bGluZSA9IEJSSUVGX09VVExJTkVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVwcmVzZW50YXRpb25PcHRpb25zKCkgPGVtPlJlcHJlc2VudGF0aW9uIE9wdGlvbnM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJlcHJlc2VudGF0aW9uT3B0aW9ucygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVQUkVTRU5UQVRJT05fT1BUSU9OU19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZXByZXNlbnRhdGlvbk9wdGlvbnMoKSA8ZW0+UmVwcmVzZW50YXRpb24gT3B0aW9uczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmVwcmVzZW50YXRpb25PcHRpb25zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHJlcHJlc2VudGF0aW9uT3B0aW9ucyA9IFJFUFJFU0VOVEFUSU9OX09QVElPTlNfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVwcmVzZW50YXRpb24oKSA8ZW0+UmVwcmVzZW50YXRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJlcHJlc2VudGF0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBSRVBSRVNFTlRBVElPTl9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZXByZXNlbnRhdGlvbigpIDxlbT5SZXByZXNlbnRhdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmVwcmVzZW50YXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgcmVwcmVzZW50YXRpb24gPSBSRVBSRVNFTlRBVElPTl9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROb3RhdGlvbigpIDxlbT5Ob3RhdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Tm90YXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE5PVEFUSU9OX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5vdGF0aW9uKCkgPGVtPk5vdGF0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROb3RhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBub3RhdGlvbiA9IE5PVEFUSU9OX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEFydGlmYWN0RGVzY3JpcHRpb25JbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5BUlRJRkFDVF9ERVNDUklQVElPTjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEJyaWVmT3V0bGluZSgpIHsKLQkJcmV0dXJuIGJyaWVmT3V0bGluZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRCcmllZk91dGxpbmUoU3RyaW5nIG5ld0JyaWVmT3V0bGluZSkgewotCQlTdHJpbmcgb2xkQnJpZWZPdXRsaW5lID0gYnJpZWZPdXRsaW5lOwotCQlicmllZk91dGxpbmUgPSBuZXdCcmllZk91dGxpbmU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuQVJUSUZBQ1RfREVTQ1JJUFRJT05fX0JSSUVGX09VVExJTkUsIG9sZEJyaWVmT3V0bGluZSwgYnJpZWZPdXRsaW5lKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRSZXByZXNlbnRhdGlvbk9wdGlvbnMoKSB7Ci0JCXJldHVybiByZXByZXNlbnRhdGlvbk9wdGlvbnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmVwcmVzZW50YXRpb25PcHRpb25zKFN0cmluZyBuZXdSZXByZXNlbnRhdGlvbk9wdGlvbnMpIHsKLQkJU3RyaW5nIG9sZFJlcHJlc2VudGF0aW9uT3B0aW9ucyA9IHJlcHJlc2VudGF0aW9uT3B0aW9uczsKLQkJcmVwcmVzZW50YXRpb25PcHRpb25zID0gbmV3UmVwcmVzZW50YXRpb25PcHRpb25zOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLkFSVElGQUNUX0RFU0NSSVBUSU9OX19SRVBSRVNFTlRBVElPTl9PUFRJT05TLCBvbGRSZXByZXNlbnRhdGlvbk9wdGlvbnMsIHJlcHJlc2VudGF0aW9uT3B0aW9ucykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UmVwcmVzZW50YXRpb24oKSB7Ci0JCXJldHVybiByZXByZXNlbnRhdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZXByZXNlbnRhdGlvbihTdHJpbmcgbmV3UmVwcmVzZW50YXRpb24pIHsKLQkJU3RyaW5nIG9sZFJlcHJlc2VudGF0aW9uID0gcmVwcmVzZW50YXRpb247Ci0JCXJlcHJlc2VudGF0aW9uID0gbmV3UmVwcmVzZW50YXRpb247Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuQVJUSUZBQ1RfREVTQ1JJUFRJT05fX1JFUFJFU0VOVEFUSU9OLCBvbGRSZXByZXNlbnRhdGlvbiwgcmVwcmVzZW50YXRpb24pKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5vdGF0aW9uKCkgewotCQlyZXR1cm4gbm90YXRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Tm90YXRpb24oU3RyaW5nIG5ld05vdGF0aW9uKSB7Ci0JCVN0cmluZyBvbGROb3RhdGlvbiA9IG5vdGF0aW9uOwotCQlub3RhdGlvbiA9IG5ld05vdGF0aW9uOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLkFSVElGQUNUX0RFU0NSSVBUSU9OX19OT1RBVElPTiwgb2xkTm90YXRpb24sIG5vdGF0aW9uKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkFSVElGQUNUX0RFU0NSSVBUSU9OX19CUklFRl9PVVRMSU5FOgotCQkJCXJldHVybiBnZXRCcmllZk91dGxpbmUoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5BUlRJRkFDVF9ERVNDUklQVElPTl9fUkVQUkVTRU5UQVRJT05fT1BUSU9OUzoKLQkJCQlyZXR1cm4gZ2V0UmVwcmVzZW50YXRpb25PcHRpb25zKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQVJUSUZBQ1RfREVTQ1JJUFRJT05fX1JFUFJFU0VOVEFUSU9OOgotCQkJCXJldHVybiBnZXRSZXByZXNlbnRhdGlvbigpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkFSVElGQUNUX0RFU0NSSVBUSU9OX19OT1RBVElPTjoKLQkJCQlyZXR1cm4gZ2V0Tm90YXRpb24oKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkFSVElGQUNUX0RFU0NSSVBUSU9OX19CUklFRl9PVVRMSU5FOgotCQkJCXNldEJyaWVmT3V0bGluZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuQVJUSUZBQ1RfREVTQ1JJUFRJT05fX1JFUFJFU0VOVEFUSU9OX09QVElPTlM6Ci0JCQkJc2V0UmVwcmVzZW50YXRpb25PcHRpb25zKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5BUlRJRkFDVF9ERVNDUklQVElPTl9fUkVQUkVTRU5UQVRJT046Ci0JCQkJc2V0UmVwcmVzZW50YXRpb24oKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkFSVElGQUNUX0RFU0NSSVBUSU9OX19OT1RBVElPTjoKLQkJCQlzZXROb3RhdGlvbigoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkFSVElGQUNUX0RFU0NSSVBUSU9OX19CUklFRl9PVVRMSU5FOgotCQkJCXNldEJyaWVmT3V0bGluZShCUklFRl9PVVRMSU5FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuQVJUSUZBQ1RfREVTQ1JJUFRJT05fX1JFUFJFU0VOVEFUSU9OX09QVElPTlM6Ci0JCQkJc2V0UmVwcmVzZW50YXRpb25PcHRpb25zKFJFUFJFU0VOVEFUSU9OX09QVElPTlNfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5BUlRJRkFDVF9ERVNDUklQVElPTl9fUkVQUkVTRU5UQVRJT046Ci0JCQkJc2V0UmVwcmVzZW50YXRpb24oUkVQUkVTRU5UQVRJT05fRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5BUlRJRkFDVF9ERVNDUklQVElPTl9fTk9UQVRJT046Ci0JCQkJc2V0Tm90YXRpb24oTk9UQVRJT05fRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkFSVElGQUNUX0RFU0NSSVBUSU9OX19CUklFRl9PVVRMSU5FOgotCQkJCXJldHVybiBCUklFRl9PVVRMSU5FX0VERUZBVUxUID09IG51bGwgPyBicmllZk91dGxpbmUgIT0gbnVsbCA6ICFCUklFRl9PVVRMSU5FX0VERUZBVUxULmVxdWFscyhicmllZk91dGxpbmUpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkFSVElGQUNUX0RFU0NSSVBUSU9OX19SRVBSRVNFTlRBVElPTl9PUFRJT05TOgotCQkJCXJldHVybiBSRVBSRVNFTlRBVElPTl9PUFRJT05TX0VERUZBVUxUID09IG51bGwgPyByZXByZXNlbnRhdGlvbk9wdGlvbnMgIT0gbnVsbCA6ICFSRVBSRVNFTlRBVElPTl9PUFRJT05TX0VERUZBVUxULmVxdWFscyhyZXByZXNlbnRhdGlvbk9wdGlvbnMpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkFSVElGQUNUX0RFU0NSSVBUSU9OX19SRVBSRVNFTlRBVElPTjoKLQkJCQlyZXR1cm4gUkVQUkVTRU5UQVRJT05fRURFRkFVTFQgPT0gbnVsbCA/IHJlcHJlc2VudGF0aW9uICE9IG51bGwgOiAhUkVQUkVTRU5UQVRJT05fRURFRkFVTFQuZXF1YWxzKHJlcHJlc2VudGF0aW9uKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5BUlRJRkFDVF9ERVNDUklQVElPTl9fTk9UQVRJT046Ci0JCQkJcmV0dXJuIE5PVEFUSU9OX0VERUZBVUxUID09IG51bGwgPyBub3RhdGlvbiAhPSBudWxsIDogIU5PVEFUSU9OX0VERUZBVUxULmVxdWFscyhub3RhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChicmllZk91dGxpbmU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGJyaWVmT3V0bGluZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcmVwcmVzZW50YXRpb25PcHRpb25zOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChyZXByZXNlbnRhdGlvbk9wdGlvbnMpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHJlcHJlc2VudGF0aW9uOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChyZXByZXNlbnRhdGlvbik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgbm90YXRpb246ICIpOwotCQlyZXN1bHQuYXBwZW5kKG5vdGF0aW9uKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vQXJ0aWZhY3REZXNjcmlwdGlvbkltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9BcnRpZmFjdEltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0FydGlmYWN0SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OGRlY2E1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0FydGlmYWN0SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg5ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogQXJ0aWZhY3RJbXBsLmphdmEsdiAxLjIgMjAwOC8wMS8zMCAwMDo0MTo0NyBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5CYXNpY0ZlYXR1cmVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFydGlmYWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5BcnRpZmFjdDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5BcnRpZmFjdEltcGwjZ2V0R3JvdXAzIDxlbT5Hcm91cDM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQXJ0aWZhY3RJbXBsI2dldENvbnRhaW5lZEFydGlmYWN0IDxlbT5Db250YWluZWQgQXJ0aWZhY3Q8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBBcnRpZmFjdEltcGwgZXh0ZW5kcyBXb3JrUHJvZHVjdEltcGwgaW1wbGVtZW50cyBBcnRpZmFjdCB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0R3JvdXAzKCkgPGVtPkdyb3VwMzwvZW0+fScgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRHcm91cDMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBGZWF0dXJlTWFwIGdyb3VwMzsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBBcnRpZmFjdEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLkFSVElGQUNUOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBGZWF0dXJlTWFwIGdldEdyb3VwMygpIHsKLQkJaWYgKGdyb3VwMyA9PSBudWxsKSB7Ci0JCQlncm91cDMgPSBuZXcgQmFzaWNGZWF0dXJlTWFwKHRoaXMsIFVtYVBhY2thZ2UuQVJUSUZBQ1RfX0dST1VQMyk7Ci0JCX0KLQkJcmV0dXJuIGdyb3VwMzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8QXJ0aWZhY3Q+IGdldENvbnRhaW5lZEFydGlmYWN0KCkgewotCQlyZXR1cm4gZ2V0R3JvdXAzKCkubGlzdChVbWFQYWNrYWdlLkxpdGVyYWxzLkFSVElGQUNUX19DT05UQUlORURfQVJUSUZBQ1QpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5BUlRJRkFDVF9fR1JPVVAzOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0R3JvdXAzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5BUlRJRkFDVF9fQ09OVEFJTkVEX0FSVElGQUNUOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0Q29udGFpbmVkQXJ0aWZhY3QoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQVJUSUZBQ1RfX0dST1VQMzoKLQkJCQlpZiAoY29yZVR5cGUpIHJldHVybiBnZXRHcm91cDMoKTsKLQkJCQlyZXR1cm4gKChGZWF0dXJlTWFwLkludGVybmFsKWdldEdyb3VwMygpKS5nZXRXcmFwcGVyKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQVJUSUZBQ1RfX0NPTlRBSU5FRF9BUlRJRkFDVDoKLQkJCQlyZXR1cm4gZ2V0Q29udGFpbmVkQXJ0aWZhY3QoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5BUlRJRkFDVF9fR1JPVVAzOgotCQkJCSgoRmVhdHVyZU1hcC5JbnRlcm5hbClnZXRHcm91cDMoKSkuc2V0KG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuQVJUSUZBQ1RfX0NPTlRBSU5FRF9BUlRJRkFDVDoKLQkJCQlnZXRDb250YWluZWRBcnRpZmFjdCgpLmNsZWFyKCk7Ci0JCQkJZ2V0Q29udGFpbmVkQXJ0aWZhY3QoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIEFydGlmYWN0PiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5BUlRJRkFDVF9fR1JPVVAzOgotCQkJCWdldEdyb3VwMygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkFSVElGQUNUX19DT05UQUlORURfQVJUSUZBQ1Q6Ci0JCQkJZ2V0Q29udGFpbmVkQXJ0aWZhY3QoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkFSVElGQUNUX19HUk9VUDM6Ci0JCQkJcmV0dXJuIGdyb3VwMyAhPSBudWxsICYmICFncm91cDMuaXNFbXB0eSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkFSVElGQUNUX19DT05UQUlORURfQVJUSUZBQ1Q6Ci0JCQkJcmV0dXJuICFnZXRDb250YWluZWRBcnRpZmFjdCgpLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGdyb3VwMzogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZ3JvdXAzKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vQXJ0aWZhY3RJbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MzUxNDI3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0JyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MyArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IEJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbkltcGwuamF2YSx2IDEuMiAyMDA4LzAxLzMwIDAwOjQxOjQ3IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5CcmVha2Rvd24gRWxlbWVudCBEZXNjcmlwdGlvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5CcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb25JbXBsI2dldFVzYWdlR3VpZGFuY2UgPGVtPlVzYWdlIEd1aWRhbmNlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uSW1wbCBleHRlbmRzIENvbnRlbnREZXNjcmlwdGlvbkltcGwgaW1wbGVtZW50cyBCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24gewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRVc2FnZUd1aWRhbmNlKCkgPGVtPlVzYWdlIEd1aWRhbmNlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRVc2FnZUd1aWRhbmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBVU0FHRV9HVUlEQU5DRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRVc2FnZUd1aWRhbmNlKCkgPGVtPlVzYWdlIEd1aWRhbmNlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRVc2FnZUd1aWRhbmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHVzYWdlR3VpZGFuY2UgPSBVU0FHRV9HVUlEQU5DRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb25JbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5CUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFVzYWdlR3VpZGFuY2UoKSB7Ci0JCXJldHVybiB1c2FnZUd1aWRhbmNlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFVzYWdlR3VpZGFuY2UoU3RyaW5nIG5ld1VzYWdlR3VpZGFuY2UpIHsKLQkJU3RyaW5nIG9sZFVzYWdlR3VpZGFuY2UgPSB1c2FnZUd1aWRhbmNlOwotCQl1c2FnZUd1aWRhbmNlID0gbmV3VXNhZ2VHdWlkYW5jZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fVVNBR0VfR1VJREFOQ0UsIG9sZFVzYWdlR3VpZGFuY2UsIHVzYWdlR3VpZGFuY2UpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX1VTQUdFX0dVSURBTkNFOgotCQkJCXJldHVybiBnZXRVc2FnZUd1aWRhbmNlKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fVVNBR0VfR1VJREFOQ0U6Ci0JCQkJc2V0VXNhZ2VHdWlkYW5jZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19VU0FHRV9HVUlEQU5DRToKLQkJCQlzZXRVc2FnZUd1aWRhbmNlKFVTQUdFX0dVSURBTkNFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fVVNBR0VfR1VJREFOQ0U6Ci0JCQkJcmV0dXJuIFVTQUdFX0dVSURBTkNFX0VERUZBVUxUID09IG51bGwgPyB1c2FnZUd1aWRhbmNlICE9IG51bGwgOiAhVVNBR0VfR1VJREFOQ0VfRURFRkFVTFQuZXF1YWxzKHVzYWdlR3VpZGFuY2UpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAodXNhZ2VHdWlkYW5jZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQodXNhZ2VHdWlkYW5jZSk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL0JyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbkltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9CcmVha2Rvd25FbGVtZW50SW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvQnJlYWtkb3duRWxlbWVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDI2ZGUwYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9CcmVha2Rvd25FbGVtZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODQ4ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogQnJlYWtkb3duRWxlbWVudEltcGwuamF2YSx2IDEuMiAyMDA4LzAxLzMwIDAwOjQxOjQ3IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuQmFzaWNGZWF0dXJlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5CcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5CcmVha2Rvd24gRWxlbWVudDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5CcmVha2Rvd25FbGVtZW50SW1wbCNnZXRQcmVzZW50ZWRBZnRlciA8ZW0+UHJlc2VudGVkIEFmdGVyPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkJyZWFrZG93bkVsZW1lbnRJbXBsI2dldFByZXNlbnRlZEJlZm9yZSA8ZW0+UHJlc2VudGVkIEJlZm9yZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5CcmVha2Rvd25FbGVtZW50SW1wbCNnZXRQbGFubmluZ0RhdGEgPGVtPlBsYW5uaW5nIERhdGE8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQnJlYWtkb3duRWxlbWVudEltcGwjZ2V0U3VwZXJBY3Rpdml0eSA8ZW0+U3VwZXIgQWN0aXZpdHk8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQnJlYWtkb3duRWxlbWVudEltcGwjZ2V0R3JvdXAxIDxlbT5Hcm91cDE8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQnJlYWtkb3duRWxlbWVudEltcGwjZ2V0Q2hlY2tsaXN0IDxlbT5DaGVja2xpc3Q8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQnJlYWtkb3duRWxlbWVudEltcGwjZ2V0Q29uY2VwdCA8ZW0+Q29uY2VwdDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5CcmVha2Rvd25FbGVtZW50SW1wbCNnZXRFeGFtcGxlIDxlbT5FeGFtcGxlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkJyZWFrZG93bkVsZW1lbnRJbXBsI2dldEd1aWRlbGluZSA8ZW0+R3VpZGVsaW5lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkJyZWFrZG93bkVsZW1lbnRJbXBsI2dldFJldXNhYmxlQXNzZXQgPGVtPlJldXNhYmxlIEFzc2V0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkJyZWFrZG93bkVsZW1lbnRJbXBsI2dldFN1cHBvcnRpbmdNYXRlcmlhbCA8ZW0+U3VwcG9ydGluZyBNYXRlcmlhbDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5CcmVha2Rvd25FbGVtZW50SW1wbCNnZXRXaGl0ZXBhcGVyIDxlbT5XaGl0ZXBhcGVyPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkJyZWFrZG93bkVsZW1lbnRJbXBsI2lzSGFzTXVsdGlwbGVPY2N1cnJlbmNlcyA8ZW0+SGFzIE11bHRpcGxlIE9jY3VycmVuY2VzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkJyZWFrZG93bkVsZW1lbnRJbXBsI2lzSXNPcHRpb25hbCA8ZW0+SXMgT3B0aW9uYWw8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQnJlYWtkb3duRWxlbWVudEltcGwjaXNJc1BsYW5uZWQgPGVtPklzIFBsYW5uZWQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQnJlYWtkb3duRWxlbWVudEltcGwjZ2V0UHJlZml4IDxlbT5QcmVmaXg8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBCcmVha2Rvd25FbGVtZW50SW1wbCBleHRlbmRzIFByb2Nlc3NFbGVtZW50SW1wbCBpbXBsZW1lbnRzIEJyZWFrZG93bkVsZW1lbnQgewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQcmVzZW50ZWRBZnRlcigpIDxlbT5QcmVzZW50ZWQgQWZ0ZXI8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFByZXNlbnRlZEFmdGVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVTRU5URURfQUZURVJfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJlc2VudGVkQWZ0ZXIoKSA8ZW0+UHJlc2VudGVkIEFmdGVyPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQcmVzZW50ZWRBZnRlcigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBwcmVzZW50ZWRBZnRlciA9IFBSRVNFTlRFRF9BRlRFUl9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQcmVzZW50ZWRCZWZvcmUoKSA8ZW0+UHJlc2VudGVkIEJlZm9yZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UHJlc2VudGVkQmVmb3JlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVTRU5URURfQkVGT1JFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByZXNlbnRlZEJlZm9yZSgpIDxlbT5QcmVzZW50ZWQgQmVmb3JlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQcmVzZW50ZWRCZWZvcmUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgcHJlc2VudGVkQmVmb3JlID0gUFJFU0VOVEVEX0JFRk9SRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQbGFubmluZ0RhdGEoKSA8ZW0+UGxhbm5pbmcgRGF0YTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UGxhbm5pbmdEYXRhKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQTEFOTklOR19EQVRBX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBsYW5uaW5nRGF0YSgpIDxlbT5QbGFubmluZyBEYXRhPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQbGFubmluZ0RhdGEoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgcGxhbm5pbmdEYXRhID0gUExBTk5JTkdfREFUQV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTdXBlckFjdGl2aXR5KCkgPGVtPlN1cGVyIEFjdGl2aXR5PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTdXBlckFjdGl2aXR5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBTVVBFUl9BQ1RJVklUWV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTdXBlckFjdGl2aXR5KCkgPGVtPlN1cGVyIEFjdGl2aXR5PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTdXBlckFjdGl2aXR5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHN1cGVyQWN0aXZpdHkgPSBTVVBFUl9BQ1RJVklUWV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEdyb3VwMSgpIDxlbT5Hcm91cDE8L2VtPn0nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0R3JvdXAxKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRmVhdHVyZU1hcCBncm91cDE7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNIYXNNdWx0aXBsZU9jY3VycmVuY2VzKCkgPGVtPkhhcyBNdWx0aXBsZSBPY2N1cnJlbmNlczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNIYXNNdWx0aXBsZU9jY3VycmVuY2VzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gSEFTX01VTFRJUExFX09DQ1VSUkVOQ0VTX0VERUZBVUxUID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0hhc011bHRpcGxlT2NjdXJyZW5jZXMoKSA8ZW0+SGFzIE11bHRpcGxlIE9jY3VycmVuY2VzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0hhc011bHRpcGxlT2NjdXJyZW5jZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGhhc011bHRpcGxlT2NjdXJyZW5jZXMgPSBIQVNfTVVMVElQTEVfT0NDVVJSRU5DRVNfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIEhhcyBNdWx0aXBsZSBPY2N1cnJlbmNlcyBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaGFzTXVsdGlwbGVPY2N1cnJlbmNlc0VTZXQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNJc09wdGlvbmFsKCkgPGVtPklzIE9wdGlvbmFsPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0lzT3B0aW9uYWwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBJU19PUFRJT05BTF9FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNJc09wdGlvbmFsKCkgPGVtPklzIE9wdGlvbmFsPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0lzT3B0aW9uYWwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzT3B0aW9uYWwgPSBJU19PUFRJT05BTF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgSXMgT3B0aW9uYWwgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzT3B0aW9uYWxFU2V0OwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzSXNQbGFubmVkKCkgPGVtPklzIFBsYW5uZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzSXNQbGFubmVkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gSVNfUExBTk5FRF9FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNJc1BsYW5uZWQoKSA8ZW0+SXMgUGxhbm5lZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNJc1BsYW5uZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzUGxhbm5lZCA9IElTX1BMQU5ORURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIElzIFBsYW5uZWQgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzUGxhbm5lZEVTZXQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJlZml4KCkgPGVtPlByZWZpeDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UHJlZml4KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGSVhfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJlZml4KCkgPGVtPlByZWZpeDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UHJlZml4KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHByZWZpeCA9IFBSRUZJWF9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBCcmVha2Rvd25FbGVtZW50SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuQlJFQUtET1dOX0VMRU1FTlQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQcmVzZW50ZWRBZnRlcigpIHsKLQkJcmV0dXJuIHByZXNlbnRlZEFmdGVyOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFByZXNlbnRlZEFmdGVyKFN0cmluZyBuZXdQcmVzZW50ZWRBZnRlcikgewotCQlTdHJpbmcgb2xkUHJlc2VudGVkQWZ0ZXIgPSBwcmVzZW50ZWRBZnRlcjsKLQkJcHJlc2VudGVkQWZ0ZXIgPSBuZXdQcmVzZW50ZWRBZnRlcjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fUFJFU0VOVEVEX0FGVEVSLCBvbGRQcmVzZW50ZWRBZnRlciwgcHJlc2VudGVkQWZ0ZXIpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFByZXNlbnRlZEJlZm9yZSgpIHsKLQkJcmV0dXJuIHByZXNlbnRlZEJlZm9yZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQcmVzZW50ZWRCZWZvcmUoU3RyaW5nIG5ld1ByZXNlbnRlZEJlZm9yZSkgewotCQlTdHJpbmcgb2xkUHJlc2VudGVkQmVmb3JlID0gcHJlc2VudGVkQmVmb3JlOwotCQlwcmVzZW50ZWRCZWZvcmUgPSBuZXdQcmVzZW50ZWRCZWZvcmU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX1BSRVNFTlRFRF9CRUZPUkUsIG9sZFByZXNlbnRlZEJlZm9yZSwgcHJlc2VudGVkQmVmb3JlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQbGFubmluZ0RhdGEoKSB7Ci0JCXJldHVybiBwbGFubmluZ0RhdGE7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UGxhbm5pbmdEYXRhKFN0cmluZyBuZXdQbGFubmluZ0RhdGEpIHsKLQkJU3RyaW5nIG9sZFBsYW5uaW5nRGF0YSA9IHBsYW5uaW5nRGF0YTsKLQkJcGxhbm5pbmdEYXRhID0gbmV3UGxhbm5pbmdEYXRhOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19QTEFOTklOR19EQVRBLCBvbGRQbGFubmluZ0RhdGEsIHBsYW5uaW5nRGF0YSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U3VwZXJBY3Rpdml0eSgpIHsKLQkJcmV0dXJuIHN1cGVyQWN0aXZpdHk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0U3VwZXJBY3Rpdml0eShTdHJpbmcgbmV3U3VwZXJBY3Rpdml0eSkgewotCQlTdHJpbmcgb2xkU3VwZXJBY3Rpdml0eSA9IHN1cGVyQWN0aXZpdHk7Ci0JCXN1cGVyQWN0aXZpdHkgPSBuZXdTdXBlckFjdGl2aXR5OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19TVVBFUl9BQ1RJVklUWSwgb2xkU3VwZXJBY3Rpdml0eSwgc3VwZXJBY3Rpdml0eSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBGZWF0dXJlTWFwIGdldEdyb3VwMSgpIHsKLQkJaWYgKGdyb3VwMSA9PSBudWxsKSB7Ci0JCQlncm91cDEgPSBuZXcgQmFzaWNGZWF0dXJlTWFwKHRoaXMsIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX0dST1VQMSk7Ci0JCX0KLQkJcmV0dXJuIGdyb3VwMTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8U3RyaW5nPiBnZXRDaGVja2xpc3QoKSB7Ci0JCXJldHVybiBnZXRHcm91cDEoKS5saXN0KFVtYVBhY2thZ2UuTGl0ZXJhbHMuQlJFQUtET1dOX0VMRU1FTlRfX0NIRUNLTElTVCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFN0cmluZz4gZ2V0Q29uY2VwdCgpIHsKLQkJcmV0dXJuIGdldEdyb3VwMSgpLmxpc3QoVW1hUGFja2FnZS5MaXRlcmFscy5CUkVBS0RPV05fRUxFTUVOVF9fQ09OQ0VQVCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFN0cmluZz4gZ2V0RXhhbXBsZSgpIHsKLQkJcmV0dXJuIGdldEdyb3VwMSgpLmxpc3QoVW1hUGFja2FnZS5MaXRlcmFscy5CUkVBS0RPV05fRUxFTUVOVF9fRVhBTVBMRSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFN0cmluZz4gZ2V0R3VpZGVsaW5lKCkgewotCQlyZXR1cm4gZ2V0R3JvdXAxKCkubGlzdChVbWFQYWNrYWdlLkxpdGVyYWxzLkJSRUFLRE9XTl9FTEVNRU5UX19HVUlERUxJTkUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxTdHJpbmc+IGdldFJldXNhYmxlQXNzZXQoKSB7Ci0JCXJldHVybiBnZXRHcm91cDEoKS5saXN0KFVtYVBhY2thZ2UuTGl0ZXJhbHMuQlJFQUtET1dOX0VMRU1FTlRfX1JFVVNBQkxFX0FTU0VUKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8U3RyaW5nPiBnZXRTdXBwb3J0aW5nTWF0ZXJpYWwoKSB7Ci0JCXJldHVybiBnZXRHcm91cDEoKS5saXN0KFVtYVBhY2thZ2UuTGl0ZXJhbHMuQlJFQUtET1dOX0VMRU1FTlRfX1NVUFBPUlRJTkdfTUFURVJJQUwpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxTdHJpbmc+IGdldFdoaXRlcGFwZXIoKSB7Ci0JCXJldHVybiBnZXRHcm91cDEoKS5saXN0KFVtYVBhY2thZ2UuTGl0ZXJhbHMuQlJFQUtET1dOX0VMRU1FTlRfX1dISVRFUEFQRVIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzSGFzTXVsdGlwbGVPY2N1cnJlbmNlcygpIHsKLQkJcmV0dXJuIGhhc011bHRpcGxlT2NjdXJyZW5jZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SGFzTXVsdGlwbGVPY2N1cnJlbmNlcyhib29sZWFuIG5ld0hhc011bHRpcGxlT2NjdXJyZW5jZXMpIHsKLQkJYm9vbGVhbiBvbGRIYXNNdWx0aXBsZU9jY3VycmVuY2VzID0gaGFzTXVsdGlwbGVPY2N1cnJlbmNlczsKLQkJaGFzTXVsdGlwbGVPY2N1cnJlbmNlcyA9IG5ld0hhc011bHRpcGxlT2NjdXJyZW5jZXM7Ci0JCWJvb2xlYW4gb2xkSGFzTXVsdGlwbGVPY2N1cnJlbmNlc0VTZXQgPSBoYXNNdWx0aXBsZU9jY3VycmVuY2VzRVNldDsKLQkJaGFzTXVsdGlwbGVPY2N1cnJlbmNlc0VTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19IQVNfTVVMVElQTEVfT0NDVVJSRU5DRVMsIG9sZEhhc011bHRpcGxlT2NjdXJyZW5jZXMsIGhhc011bHRpcGxlT2NjdXJyZW5jZXMsICFvbGRIYXNNdWx0aXBsZU9jY3VycmVuY2VzRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0SGFzTXVsdGlwbGVPY2N1cnJlbmNlcygpIHsKLQkJYm9vbGVhbiBvbGRIYXNNdWx0aXBsZU9jY3VycmVuY2VzID0gaGFzTXVsdGlwbGVPY2N1cnJlbmNlczsKLQkJYm9vbGVhbiBvbGRIYXNNdWx0aXBsZU9jY3VycmVuY2VzRVNldCA9IGhhc011bHRpcGxlT2NjdXJyZW5jZXNFU2V0OwotCQloYXNNdWx0aXBsZU9jY3VycmVuY2VzID0gSEFTX01VTFRJUExFX09DQ1VSUkVOQ0VTX0VERUZBVUxUOwotCQloYXNNdWx0aXBsZU9jY3VycmVuY2VzRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX0hBU19NVUxUSVBMRV9PQ0NVUlJFTkNFUywgb2xkSGFzTXVsdGlwbGVPY2N1cnJlbmNlcywgSEFTX01VTFRJUExFX09DQ1VSUkVOQ0VTX0VERUZBVUxULCBvbGRIYXNNdWx0aXBsZU9jY3VycmVuY2VzRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0SGFzTXVsdGlwbGVPY2N1cnJlbmNlcygpIHsKLQkJcmV0dXJuIGhhc011bHRpcGxlT2NjdXJyZW5jZXNFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzSXNPcHRpb25hbCgpIHsKLQkJcmV0dXJuIGlzT3B0aW9uYWw7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SXNPcHRpb25hbChib29sZWFuIG5ld0lzT3B0aW9uYWwpIHsKLQkJYm9vbGVhbiBvbGRJc09wdGlvbmFsID0gaXNPcHRpb25hbDsKLQkJaXNPcHRpb25hbCA9IG5ld0lzT3B0aW9uYWw7Ci0JCWJvb2xlYW4gb2xkSXNPcHRpb25hbEVTZXQgPSBpc09wdGlvbmFsRVNldDsKLQkJaXNPcHRpb25hbEVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19JU19PUFRJT05BTCwgb2xkSXNPcHRpb25hbCwgaXNPcHRpb25hbCwgIW9sZElzT3B0aW9uYWxFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRJc09wdGlvbmFsKCkgewotCQlib29sZWFuIG9sZElzT3B0aW9uYWwgPSBpc09wdGlvbmFsOwotCQlib29sZWFuIG9sZElzT3B0aW9uYWxFU2V0ID0gaXNPcHRpb25hbEVTZXQ7Ci0JCWlzT3B0aW9uYWwgPSBJU19PUFRJT05BTF9FREVGQVVMVDsKLQkJaXNPcHRpb25hbEVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19JU19PUFRJT05BTCwgb2xkSXNPcHRpb25hbCwgSVNfT1BUSU9OQUxfRURFRkFVTFQsIG9sZElzT3B0aW9uYWxFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRJc09wdGlvbmFsKCkgewotCQlyZXR1cm4gaXNPcHRpb25hbEVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNJc1BsYW5uZWQoKSB7Ci0JCXJldHVybiBpc1BsYW5uZWQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SXNQbGFubmVkKGJvb2xlYW4gbmV3SXNQbGFubmVkKSB7Ci0JCWJvb2xlYW4gb2xkSXNQbGFubmVkID0gaXNQbGFubmVkOwotCQlpc1BsYW5uZWQgPSBuZXdJc1BsYW5uZWQ7Ci0JCWJvb2xlYW4gb2xkSXNQbGFubmVkRVNldCA9IGlzUGxhbm5lZEVTZXQ7Ci0JCWlzUGxhbm5lZEVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19JU19QTEFOTkVELCBvbGRJc1BsYW5uZWQsIGlzUGxhbm5lZCwgIW9sZElzUGxhbm5lZEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldElzUGxhbm5lZCgpIHsKLQkJYm9vbGVhbiBvbGRJc1BsYW5uZWQgPSBpc1BsYW5uZWQ7Ci0JCWJvb2xlYW4gb2xkSXNQbGFubmVkRVNldCA9IGlzUGxhbm5lZEVTZXQ7Ci0JCWlzUGxhbm5lZCA9IElTX1BMQU5ORURfRURFRkFVTFQ7Ci0JCWlzUGxhbm5lZEVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19JU19QTEFOTkVELCBvbGRJc1BsYW5uZWQsIElTX1BMQU5ORURfRURFRkFVTFQsIG9sZElzUGxhbm5lZEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldElzUGxhbm5lZCgpIHsKLQkJcmV0dXJuIGlzUGxhbm5lZEVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQcmVmaXgoKSB7Ci0JCXJldHVybiBwcmVmaXg7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHJlZml4KFN0cmluZyBuZXdQcmVmaXgpIHsKLQkJU3RyaW5nIG9sZFByZWZpeCA9IHByZWZpeDsKLQkJcHJlZml4ID0gbmV3UHJlZml4OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19QUkVGSVgsIG9sZFByZWZpeCwgcHJlZml4KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19HUk9VUDE6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRHcm91cDEoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX1BSRVNFTlRFRF9BRlRFUjoKLQkJCQlyZXR1cm4gZ2V0UHJlc2VudGVkQWZ0ZXIoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fUFJFU0VOVEVEX0JFRk9SRToKLQkJCQlyZXR1cm4gZ2V0UHJlc2VudGVkQmVmb3JlKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX1BMQU5OSU5HX0RBVEE6Ci0JCQkJcmV0dXJuIGdldFBsYW5uaW5nRGF0YSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19TVVBFUl9BQ1RJVklUWToKLQkJCQlyZXR1cm4gZ2V0U3VwZXJBY3Rpdml0eSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19HUk9VUDE6Ci0JCQkJaWYgKGNvcmVUeXBlKSByZXR1cm4gZ2V0R3JvdXAxKCk7Ci0JCQkJcmV0dXJuICgoRmVhdHVyZU1hcC5JbnRlcm5hbClnZXRHcm91cDEoKSkuZ2V0V3JhcHBlcigpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19DSEVDS0xJU1Q6Ci0JCQkJcmV0dXJuIGdldENoZWNrbGlzdCgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19DT05DRVBUOgotCQkJCXJldHVybiBnZXRDb25jZXB0KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX0VYQU1QTEU6Ci0JCQkJcmV0dXJuIGdldEV4YW1wbGUoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fR1VJREVMSU5FOgotCQkJCXJldHVybiBnZXRHdWlkZWxpbmUoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fUkVVU0FCTEVfQVNTRVQ6Ci0JCQkJcmV0dXJuIGdldFJldXNhYmxlQXNzZXQoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fU1VQUE9SVElOR19NQVRFUklBTDoKLQkJCQlyZXR1cm4gZ2V0U3VwcG9ydGluZ01hdGVyaWFsKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX1dISVRFUEFQRVI6Ci0JCQkJcmV0dXJuIGdldFdoaXRlcGFwZXIoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fSEFTX01VTFRJUExFX09DQ1VSUkVOQ0VTOgotCQkJCXJldHVybiBpc0hhc011bHRpcGxlT2NjdXJyZW5jZXMoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX0lTX09QVElPTkFMOgotCQkJCXJldHVybiBpc0lzT3B0aW9uYWwoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX0lTX1BMQU5ORUQ6Ci0JCQkJcmV0dXJuIGlzSXNQbGFubmVkKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19QUkVGSVg6Ci0JCQkJcmV0dXJuIGdldFByZWZpeCgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19QUkVTRU5URURfQUZURVI6Ci0JCQkJc2V0UHJlc2VudGVkQWZ0ZXIoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19QUkVTRU5URURfQkVGT1JFOgotCQkJCXNldFByZXNlbnRlZEJlZm9yZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX1BMQU5OSU5HX0RBVEE6Ci0JCQkJc2V0UGxhbm5pbmdEYXRhKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fU1VQRVJfQUNUSVZJVFk6Ci0JCQkJc2V0U3VwZXJBY3Rpdml0eSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX0dST1VQMToKLQkJCQkoKEZlYXR1cmVNYXAuSW50ZXJuYWwpZ2V0R3JvdXAxKCkpLnNldChuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19DSEVDS0xJU1Q6Ci0JCQkJZ2V0Q2hlY2tsaXN0KCkuY2xlYXIoKTsKLQkJCQlnZXRDaGVja2xpc3QoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFN0cmluZz4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fQ09OQ0VQVDoKLQkJCQlnZXRDb25jZXB0KCkuY2xlYXIoKTsKLQkJCQlnZXRDb25jZXB0KCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBTdHJpbmc+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX0VYQU1QTEU6Ci0JCQkJZ2V0RXhhbXBsZSgpLmNsZWFyKCk7Ci0JCQkJZ2V0RXhhbXBsZSgpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgU3RyaW5nPiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19HVUlERUxJTkU6Ci0JCQkJZ2V0R3VpZGVsaW5lKCkuY2xlYXIoKTsKLQkJCQlnZXRHdWlkZWxpbmUoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFN0cmluZz4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fUkVVU0FCTEVfQVNTRVQ6Ci0JCQkJZ2V0UmV1c2FibGVBc3NldCgpLmNsZWFyKCk7Ci0JCQkJZ2V0UmV1c2FibGVBc3NldCgpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgU3RyaW5nPiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19TVVBQT1JUSU5HX01BVEVSSUFMOgotCQkJCWdldFN1cHBvcnRpbmdNYXRlcmlhbCgpLmNsZWFyKCk7Ci0JCQkJZ2V0U3VwcG9ydGluZ01hdGVyaWFsKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBTdHJpbmc+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX1dISVRFUEFQRVI6Ci0JCQkJZ2V0V2hpdGVwYXBlcigpLmNsZWFyKCk7Ci0JCQkJZ2V0V2hpdGVwYXBlcigpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgU3RyaW5nPiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19IQVNfTVVMVElQTEVfT0NDVVJSRU5DRVM6Ci0JCQkJc2V0SGFzTXVsdGlwbGVPY2N1cnJlbmNlcygoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX0lTX09QVElPTkFMOgotCQkJCXNldElzT3B0aW9uYWwoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19JU19QTEFOTkVEOgotCQkJCXNldElzUGxhbm5lZCgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX1BSRUZJWDoKLQkJCQlzZXRQcmVmaXgoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fUFJFU0VOVEVEX0FGVEVSOgotCQkJCXNldFByZXNlbnRlZEFmdGVyKFBSRVNFTlRFRF9BRlRFUl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19QUkVTRU5URURfQkVGT1JFOgotCQkJCXNldFByZXNlbnRlZEJlZm9yZShQUkVTRU5URURfQkVGT1JFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX1BMQU5OSU5HX0RBVEE6Ci0JCQkJc2V0UGxhbm5pbmdEYXRhKFBMQU5OSU5HX0RBVEFfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fU1VQRVJfQUNUSVZJVFk6Ci0JCQkJc2V0U3VwZXJBY3Rpdml0eShTVVBFUl9BQ1RJVklUWV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19HUk9VUDE6Ci0JCQkJZ2V0R3JvdXAxKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX0NIRUNLTElTVDoKLQkJCQlnZXRDaGVja2xpc3QoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fQ09OQ0VQVDoKLQkJCQlnZXRDb25jZXB0KCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX0VYQU1QTEU6Ci0JCQkJZ2V0RXhhbXBsZSgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19HVUlERUxJTkU6Ci0JCQkJZ2V0R3VpZGVsaW5lKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX1JFVVNBQkxFX0FTU0VUOgotCQkJCWdldFJldXNhYmxlQXNzZXQoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fU1VQUE9SVElOR19NQVRFUklBTDoKLQkJCQlnZXRTdXBwb3J0aW5nTWF0ZXJpYWwoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fV0hJVEVQQVBFUjoKLQkJCQlnZXRXaGl0ZXBhcGVyKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX0hBU19NVUxUSVBMRV9PQ0NVUlJFTkNFUzoKLQkJCQl1bnNldEhhc011bHRpcGxlT2NjdXJyZW5jZXMoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX0lTX09QVElPTkFMOgotCQkJCXVuc2V0SXNPcHRpb25hbCgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fSVNfUExBTk5FRDoKLQkJCQl1bnNldElzUGxhbm5lZCgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fUFJFRklYOgotCQkJCXNldFByZWZpeChQUkVGSVhfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19QUkVTRU5URURfQUZURVI6Ci0JCQkJcmV0dXJuIFBSRVNFTlRFRF9BRlRFUl9FREVGQVVMVCA9PSBudWxsID8gcHJlc2VudGVkQWZ0ZXIgIT0gbnVsbCA6ICFQUkVTRU5URURfQUZURVJfRURFRkFVTFQuZXF1YWxzKHByZXNlbnRlZEFmdGVyKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fUFJFU0VOVEVEX0JFRk9SRToKLQkJCQlyZXR1cm4gUFJFU0VOVEVEX0JFRk9SRV9FREVGQVVMVCA9PSBudWxsID8gcHJlc2VudGVkQmVmb3JlICE9IG51bGwgOiAhUFJFU0VOVEVEX0JFRk9SRV9FREVGQVVMVC5lcXVhbHMocHJlc2VudGVkQmVmb3JlKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fUExBTk5JTkdfREFUQToKLQkJCQlyZXR1cm4gUExBTk5JTkdfREFUQV9FREVGQVVMVCA9PSBudWxsID8gcGxhbm5pbmdEYXRhICE9IG51bGwgOiAhUExBTk5JTkdfREFUQV9FREVGQVVMVC5lcXVhbHMocGxhbm5pbmdEYXRhKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fU1VQRVJfQUNUSVZJVFk6Ci0JCQkJcmV0dXJuIFNVUEVSX0FDVElWSVRZX0VERUZBVUxUID09IG51bGwgPyBzdXBlckFjdGl2aXR5ICE9IG51bGwgOiAhU1VQRVJfQUNUSVZJVFlfRURFRkFVTFQuZXF1YWxzKHN1cGVyQWN0aXZpdHkpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19HUk9VUDE6Ci0JCQkJcmV0dXJuIGdyb3VwMSAhPSBudWxsICYmICFncm91cDEuaXNFbXB0eSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19DSEVDS0xJU1Q6Ci0JCQkJcmV0dXJuICFnZXRDaGVja2xpc3QoKS5pc0VtcHR5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX0NPTkNFUFQ6Ci0JCQkJcmV0dXJuICFnZXRDb25jZXB0KCkuaXNFbXB0eSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19FWEFNUExFOgotCQkJCXJldHVybiAhZ2V0RXhhbXBsZSgpLmlzRW1wdHkoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fR1VJREVMSU5FOgotCQkJCXJldHVybiAhZ2V0R3VpZGVsaW5lKCkuaXNFbXB0eSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19SRVVTQUJMRV9BU1NFVDoKLQkJCQlyZXR1cm4gIWdldFJldXNhYmxlQXNzZXQoKS5pc0VtcHR5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX1NVUFBPUlRJTkdfTUFURVJJQUw6Ci0JCQkJcmV0dXJuICFnZXRTdXBwb3J0aW5nTWF0ZXJpYWwoKS5pc0VtcHR5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX1dISVRFUEFQRVI6Ci0JCQkJcmV0dXJuICFnZXRXaGl0ZXBhcGVyKCkuaXNFbXB0eSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19IQVNfTVVMVElQTEVfT0NDVVJSRU5DRVM6Ci0JCQkJcmV0dXJuIGlzU2V0SGFzTXVsdGlwbGVPY2N1cnJlbmNlcygpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19JU19PUFRJT05BTDoKLQkJCQlyZXR1cm4gaXNTZXRJc09wdGlvbmFsKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX0lTX1BMQU5ORUQ6Ci0JCQkJcmV0dXJuIGlzU2V0SXNQbGFubmVkKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX1BSRUZJWDoKLQkJCQlyZXR1cm4gUFJFRklYX0VERUZBVUxUID09IG51bGwgPyBwcmVmaXggIT0gbnVsbCA6ICFQUkVGSVhfRURFRkFVTFQuZXF1YWxzKHByZWZpeCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChwcmVzZW50ZWRBZnRlcjogIik7Ci0JCXJlc3VsdC5hcHBlbmQocHJlc2VudGVkQWZ0ZXIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHByZXNlbnRlZEJlZm9yZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQocHJlc2VudGVkQmVmb3JlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBwbGFubmluZ0RhdGE6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHBsYW5uaW5nRGF0YSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgc3VwZXJBY3Rpdml0eTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoc3VwZXJBY3Rpdml0eSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZ3JvdXAxOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChncm91cDEpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGhhc011bHRpcGxlT2NjdXJyZW5jZXM6ICIpOwotCQlpZiAoaGFzTXVsdGlwbGVPY2N1cnJlbmNlc0VTZXQpIHJlc3VsdC5hcHBlbmQoaGFzTXVsdGlwbGVPY2N1cnJlbmNlcyk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGlzT3B0aW9uYWw6ICIpOwotCQlpZiAoaXNPcHRpb25hbEVTZXQpIHJlc3VsdC5hcHBlbmQoaXNPcHRpb25hbCk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGlzUGxhbm5lZDogIik7Ci0JCWlmIChpc1BsYW5uZWRFU2V0KSByZXN1bHQuYXBwZW5kKGlzUGxhbm5lZCk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHByZWZpeDogIik7Ci0JCXJlc3VsdC5hcHBlbmQocHJlZml4KTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vQnJlYWtkb3duRWxlbWVudEltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9DYXBhYmlsaXR5UGF0dGVybkltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0NhcGFiaWxpdHlQYXR0ZXJuSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNmNiZTk5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0NhcGFiaWxpdHlQYXR0ZXJuSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBDYXBhYmlsaXR5UGF0dGVybkltcGwuamF2YSx2IDEuMiAyMDA4LzAxLzMwIDAwOjQxOjQ3IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5DYXBhYmlsaXR5UGF0dGVybjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Q2FwYWJpbGl0eSBQYXR0ZXJuPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQ2FwYWJpbGl0eVBhdHRlcm5JbXBsIGV4dGVuZHMgUHJvY2Vzc0ltcGwgaW1wbGVtZW50cyBDYXBhYmlsaXR5UGF0dGVybiB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENhcGFiaWxpdHlQYXR0ZXJuSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuQ0FQQUJJTElUWV9QQVRURVJOOwotCX0KLQotfSAvL0NhcGFiaWxpdHlQYXR0ZXJuSW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0NoZWNrbGlzdEltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0NoZWNrbGlzdEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjUyMTE1NS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9DaGVja2xpc3RJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IENoZWNrbGlzdEltcGwuamF2YSx2IDEuMiAyMDA4LzAxLzMwIDAwOjQxOjQ3IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5DaGVja2xpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkNoZWNrbGlzdDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIENoZWNrbGlzdEltcGwgZXh0ZW5kcyBHdWlkYW5jZUltcGwgaW1wbGVtZW50cyBDaGVja2xpc3QgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDaGVja2xpc3RJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5DSEVDS0xJU1Q7Ci0JfQotCi19IC8vQ2hlY2tsaXN0SW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0NvbXBvc2l0ZVJvbGVJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9Db21wb3NpdGVSb2xlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNjlhNDc3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0NvbXBvc2l0ZVJvbGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODkgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBDb21wb3NpdGVSb2xlSW1wbC5qYXZhLHYgMS4yIDIwMDgvMDEvMzAgMDA6NDE6NDcga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuQmFzaWNGZWF0dXJlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db21wb3NpdGVSb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkNvbXBvc2l0ZSBSb2xlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkNvbXBvc2l0ZVJvbGVJbXBsI2dldEdyb3VwMiA8ZW0+R3JvdXAyPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkNvbXBvc2l0ZVJvbGVJbXBsI2dldEFnZ3JlZ2F0ZWRSb2xlIDxlbT5BZ2dyZWdhdGVkIFJvbGU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBDb21wb3NpdGVSb2xlSW1wbCBleHRlbmRzIFJvbGVEZXNjcmlwdG9ySW1wbCBpbXBsZW1lbnRzIENvbXBvc2l0ZVJvbGUgewotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEdyb3VwMigpIDxlbT5Hcm91cDI8L2VtPn0nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0R3JvdXAyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRmVhdHVyZU1hcCBncm91cDI7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbXBvc2l0ZVJvbGVJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5DT01QT1NJVEVfUk9MRTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRmVhdHVyZU1hcCBnZXRHcm91cDIoKSB7Ci0JCWlmIChncm91cDIgPT0gbnVsbCkgewotCQkJZ3JvdXAyID0gbmV3IEJhc2ljRmVhdHVyZU1hcCh0aGlzLCBVbWFQYWNrYWdlLkNPTVBPU0lURV9ST0xFX19HUk9VUDIpOwotCQl9Ci0JCXJldHVybiBncm91cDI7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFJvbGU+IGdldEFnZ3JlZ2F0ZWRSb2xlKCkgewotCQlyZXR1cm4gZ2V0R3JvdXAyKCkubGlzdChVbWFQYWNrYWdlLkxpdGVyYWxzLkNPTVBPU0lURV9ST0xFX19BR0dSRUdBVEVEX1JPTEUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5DT01QT1NJVEVfUk9MRV9fR1JPVVAyOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0R3JvdXAyKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5DT01QT1NJVEVfUk9MRV9fQUdHUkVHQVRFRF9ST0xFOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0QWdncmVnYXRlZFJvbGUoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ09NUE9TSVRFX1JPTEVfX0dST1VQMjoKLQkJCQlpZiAoY29yZVR5cGUpIHJldHVybiBnZXRHcm91cDIoKTsKLQkJCQlyZXR1cm4gKChGZWF0dXJlTWFwLkludGVybmFsKWdldEdyb3VwMigpKS5nZXRXcmFwcGVyKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ09NUE9TSVRFX1JPTEVfX0FHR1JFR0FURURfUk9MRToKLQkJCQlyZXR1cm4gZ2V0QWdncmVnYXRlZFJvbGUoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5DT01QT1NJVEVfUk9MRV9fR1JPVVAyOgotCQkJCSgoRmVhdHVyZU1hcC5JbnRlcm5hbClnZXRHcm91cDIoKSkuc2V0KG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ09NUE9TSVRFX1JPTEVfX0FHR1JFR0FURURfUk9MRToKLQkJCQlnZXRBZ2dyZWdhdGVkUm9sZSgpLmNsZWFyKCk7Ci0JCQkJZ2V0QWdncmVnYXRlZFJvbGUoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFJvbGU+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkNPTVBPU0lURV9ST0xFX19HUk9VUDI6Ci0JCQkJZ2V0R3JvdXAyKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ09NUE9TSVRFX1JPTEVfX0FHR1JFR0FURURfUk9MRToKLQkJCQlnZXRBZ2dyZWdhdGVkUm9sZSgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ09NUE9TSVRFX1JPTEVfX0dST1VQMjoKLQkJCQlyZXR1cm4gZ3JvdXAyICE9IG51bGwgJiYgIWdyb3VwMi5pc0VtcHR5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ09NUE9TSVRFX1JPTEVfX0FHR1JFR0FURURfUk9MRToKLQkJCQlyZXR1cm4gIWdldEFnZ3JlZ2F0ZWRSb2xlKCkuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoZ3JvdXAyOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChncm91cDIpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9Db21wb3NpdGVSb2xlSW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0NvbmNlcHRJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9Db25jZXB0SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OTI2N2VkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0NvbmNlcHRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IENvbmNlcHRJbXBsLmphdmEsdiAxLjIgMjAwOC8wMS8zMCAwMDo0MTo0NyBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29uY2VwdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Q29uY2VwdDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIENvbmNlcHRJbXBsIGV4dGVuZHMgR3VpZGFuY2VJbXBsIGltcGxlbWVudHMgQ29uY2VwdCB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbmNlcHRJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5DT05DRVBUOwotCX0KLQotfSAvL0NvbmNlcHRJbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvQ29uc3RyYWludEltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0NvbnN0cmFpbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxNDUyNDIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvQ29uc3RyYWludEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MyArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IENvbnN0cmFpbnRJbXBsLmphdmEsdiAxLjIgMjAwOC8wMS8zMCAwMDo0MTo0NyBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnN0cmFpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkNvbnN0cmFpbnQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQ29uc3RyYWludEltcGwjZ2V0TWFpbkRlc2NyaXB0aW9uIDxlbT5NYWluIERlc2NyaXB0aW9uPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQ29uc3RyYWludEltcGwgZXh0ZW5kcyBNZXRob2RFbGVtZW50SW1wbCBpbXBsZW1lbnRzIENvbnN0cmFpbnQgewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNYWluRGVzY3JpcHRpb24oKSA8ZW0+TWFpbiBEZXNjcmlwdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TWFpbkRlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBNQUlOX0RFU0NSSVBUSU9OX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1haW5EZXNjcmlwdGlvbigpIDxlbT5NYWluIERlc2NyaXB0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRNYWluRGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgbWFpbkRlc2NyaXB0aW9uID0gTUFJTl9ERVNDUklQVElPTl9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb25zdHJhaW50SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuQ09OU1RSQUlOVDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE1haW5EZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIG1haW5EZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNYWluRGVzY3JpcHRpb24oU3RyaW5nIG5ld01haW5EZXNjcmlwdGlvbikgewotCQlTdHJpbmcgb2xkTWFpbkRlc2NyaXB0aW9uID0gbWFpbkRlc2NyaXB0aW9uOwotCQltYWluRGVzY3JpcHRpb24gPSBuZXdNYWluRGVzY3JpcHRpb247Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuQ09OU1RSQUlOVF9fTUFJTl9ERVNDUklQVElPTiwgb2xkTWFpbkRlc2NyaXB0aW9uLCBtYWluRGVzY3JpcHRpb24pKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ09OU1RSQUlOVF9fTUFJTl9ERVNDUklQVElPTjoKLQkJCQlyZXR1cm4gZ2V0TWFpbkRlc2NyaXB0aW9uKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5DT05TVFJBSU5UX19NQUlOX0RFU0NSSVBUSU9OOgotCQkJCXNldE1haW5EZXNjcmlwdGlvbigoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkNPTlNUUkFJTlRfX01BSU5fREVTQ1JJUFRJT046Ci0JCQkJc2V0TWFpbkRlc2NyaXB0aW9uKE1BSU5fREVTQ1JJUFRJT05fRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkNPTlNUUkFJTlRfX01BSU5fREVTQ1JJUFRJT046Ci0JCQkJcmV0dXJuIE1BSU5fREVTQ1JJUFRJT05fRURFRkFVTFQgPT0gbnVsbCA/IG1haW5EZXNjcmlwdGlvbiAhPSBudWxsIDogIU1BSU5fREVTQ1JJUFRJT05fRURFRkFVTFQuZXF1YWxzKG1haW5EZXNjcmlwdGlvbik7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChtYWluRGVzY3JpcHRpb246ICIpOwotCQlyZXN1bHQuYXBwZW5kKG1haW5EZXNjcmlwdGlvbik7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL0NvbnN0cmFpbnRJbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvQ29udGVudENhdGVnb3J5SW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvQ29udGVudENhdGVnb3J5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MjA2YzZmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0NvbnRlbnRDYXRlZ29yeUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogQ29udGVudENhdGVnb3J5SW1wbC5qYXZhLHYgMS4yIDIwMDgvMDEvMzAgMDA6NDE6NDcga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnRDYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Q29udGVudCBDYXRlZ29yeTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIENvbnRlbnRDYXRlZ29yeUltcGwgZXh0ZW5kcyBDb250ZW50RWxlbWVudEltcGwgaW1wbGVtZW50cyBDb250ZW50Q2F0ZWdvcnkgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb250ZW50Q2F0ZWdvcnlJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5DT05URU5UX0NBVEVHT1JZOwotCX0KLQotfSAvL0NvbnRlbnRDYXRlZ29yeUltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9Db250ZW50Q2F0ZWdvcnlQYWNrYWdlSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvQ29udGVudENhdGVnb3J5UGFja2FnZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGE0YWZmYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9Db250ZW50Q2F0ZWdvcnlQYWNrYWdlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkwICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogQ29udGVudENhdGVnb3J5UGFja2FnZUltcGwuamF2YSx2IDEuMiAyMDA4LzAxLzMwIDAwOjQxOjQ3IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkJhc2ljRmVhdHVyZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudENhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnRDYXRlZ29yeVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkNvbnRlbnQgQ2F0ZWdvcnkgUGFja2FnZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Db250ZW50Q2F0ZWdvcnlQYWNrYWdlSW1wbCNnZXRHcm91cDIgPGVtPkdyb3VwMjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Db250ZW50Q2F0ZWdvcnlQYWNrYWdlSW1wbCNnZXRDb250ZW50Q2F0ZWdvcnkgPGVtPkNvbnRlbnQgQ2F0ZWdvcnk8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBDb250ZW50Q2F0ZWdvcnlQYWNrYWdlSW1wbCBleHRlbmRzIE1ldGhvZFBhY2thZ2VJbXBsIGltcGxlbWVudHMgQ29udGVudENhdGVnb3J5UGFja2FnZSB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0R3JvdXAyKCkgPGVtPkdyb3VwMjwvZW0+fScgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRHcm91cDIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBGZWF0dXJlTWFwIGdyb3VwMjsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb250ZW50Q2F0ZWdvcnlQYWNrYWdlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuQ09OVEVOVF9DQVRFR09SWV9QQUNLQUdFOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBGZWF0dXJlTWFwIGdldEdyb3VwMigpIHsKLQkJaWYgKGdyb3VwMiA9PSBudWxsKSB7Ci0JCQlncm91cDIgPSBuZXcgQmFzaWNGZWF0dXJlTWFwKHRoaXMsIFVtYVBhY2thZ2UuQ09OVEVOVF9DQVRFR09SWV9QQUNLQUdFX19HUk9VUDIpOwotCQl9Ci0JCXJldHVybiBncm91cDI7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PENvbnRlbnRDYXRlZ29yeT4gZ2V0Q29udGVudENhdGVnb3J5KCkgewotCQlyZXR1cm4gZ2V0R3JvdXAyKCkubGlzdChVbWFQYWNrYWdlLkxpdGVyYWxzLkNPTlRFTlRfQ0FURUdPUllfUEFDS0FHRV9fQ09OVEVOVF9DQVRFR09SWSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfQ0FURUdPUllfUEFDS0FHRV9fR1JPVVAyOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0R3JvdXAyKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0NBVEVHT1JZX1BBQ0tBR0VfX0NPTlRFTlRfQ0FURUdPUlk6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRDb250ZW50Q2F0ZWdvcnkoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9DQVRFR09SWV9QQUNLQUdFX19HUk9VUDI6Ci0JCQkJaWYgKGNvcmVUeXBlKSByZXR1cm4gZ2V0R3JvdXAyKCk7Ci0JCQkJcmV0dXJuICgoRmVhdHVyZU1hcC5JbnRlcm5hbClnZXRHcm91cDIoKSkuZ2V0V3JhcHBlcigpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfQ0FURUdPUllfUEFDS0FHRV9fQ09OVEVOVF9DQVRFR09SWToKLQkJCQlyZXR1cm4gZ2V0Q29udGVudENhdGVnb3J5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9DQVRFR09SWV9QQUNLQUdFX19HUk9VUDI6Ci0JCQkJKChGZWF0dXJlTWFwLkludGVybmFsKWdldEdyb3VwMigpKS5zZXQobmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0NBVEVHT1JZX1BBQ0tBR0VfX0NPTlRFTlRfQ0FURUdPUlk6Ci0JCQkJZ2V0Q29udGVudENhdGVnb3J5KCkuY2xlYXIoKTsKLQkJCQlnZXRDb250ZW50Q2F0ZWdvcnkoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIENvbnRlbnRDYXRlZ29yeT4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9DQVRFR09SWV9QQUNLQUdFX19HUk9VUDI6Ci0JCQkJZ2V0R3JvdXAyKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9DQVRFR09SWV9QQUNLQUdFX19DT05URU5UX0NBVEVHT1JZOgotCQkJCWdldENvbnRlbnRDYXRlZ29yeSgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9DQVRFR09SWV9QQUNLQUdFX19HUk9VUDI6Ci0JCQkJcmV0dXJuIGdyb3VwMiAhPSBudWxsICYmICFncm91cDIuaXNFbXB0eSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfQ0FURUdPUllfUEFDS0FHRV9fQ09OVEVOVF9DQVRFR09SWToKLQkJCQlyZXR1cm4gIWdldENvbnRlbnRDYXRlZ29yeSgpLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGdyb3VwMjogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZ3JvdXAyKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vQ29udGVudENhdGVnb3J5UGFja2FnZUltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9Db250ZW50RGVzY3JpcHRpb25JbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9Db250ZW50RGVzY3JpcHRpb25JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyNzgwNTguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvQ29udGVudERlc2NyaXB0aW9uSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzI4ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogQ29udGVudERlc2NyaXB0aW9uSW1wbC5qYXZhLHYgMS4yIDIwMDgvMDEvMzAgMDA6NDE6NDcga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlNlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkNvbnRlbnQgRGVzY3JpcHRpb248L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQ29udGVudERlc2NyaXB0aW9uSW1wbCNnZXRNYWluRGVzY3JpcHRpb24gPGVtPk1haW4gRGVzY3JpcHRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQ29udGVudERlc2NyaXB0aW9uSW1wbCNnZXRLZXlDb25zaWRlcmF0aW9ucyA8ZW0+S2V5IENvbnNpZGVyYXRpb25zPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkNvbnRlbnREZXNjcmlwdGlvbkltcGwjZ2V0U2VjdGlvbiA8ZW0+U2VjdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Db250ZW50RGVzY3JpcHRpb25JbXBsI2dldEV4dGVybmFsSWQgPGVtPkV4dGVybmFsIElkPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQ29udGVudERlc2NyaXB0aW9uSW1wbCBleHRlbmRzIE1ldGhvZFVuaXRJbXBsIGltcGxlbWVudHMgQ29udGVudERlc2NyaXB0aW9uIHsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWFpbkRlc2NyaXB0aW9uKCkgPGVtPk1haW4gRGVzY3JpcHRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE1haW5EZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFJTl9ERVNDUklQVElPTl9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNYWluRGVzY3JpcHRpb24oKSA8ZW0+TWFpbiBEZXNjcmlwdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TWFpbkRlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIG1haW5EZXNjcmlwdGlvbiA9IE1BSU5fREVTQ1JJUFRJT05fRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0S2V5Q29uc2lkZXJhdGlvbnMoKSA8ZW0+S2V5IENvbnNpZGVyYXRpb25zPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRLZXlDb25zaWRlcmF0aW9ucygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0NPTlNJREVSQVRJT05TX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEtleUNvbnNpZGVyYXRpb25zKCkgPGVtPktleSBDb25zaWRlcmF0aW9uczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0S2V5Q29uc2lkZXJhdGlvbnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcga2V5Q29uc2lkZXJhdGlvbnMgPSBLRVlfQ09OU0lERVJBVElPTlNfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTZWN0aW9uKCkgPGVtPlNlY3Rpb248L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U2VjdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PFNlY3Rpb24+IHNlY3Rpb247Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RXh0ZXJuYWxJZCgpIDxlbT5FeHRlcm5hbCBJZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RXh0ZXJuYWxJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhURVJOQUxfSURfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RXh0ZXJuYWxJZCgpIDxlbT5FeHRlcm5hbCBJZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RXh0ZXJuYWxJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBleHRlcm5hbElkID0gRVhURVJOQUxfSURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29udGVudERlc2NyaXB0aW9uSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuQ09OVEVOVF9ERVNDUklQVElPTjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE1haW5EZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIG1haW5EZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNYWluRGVzY3JpcHRpb24oU3RyaW5nIG5ld01haW5EZXNjcmlwdGlvbikgewotCQlTdHJpbmcgb2xkTWFpbkRlc2NyaXB0aW9uID0gbWFpbkRlc2NyaXB0aW9uOwotCQltYWluRGVzY3JpcHRpb24gPSBuZXdNYWluRGVzY3JpcHRpb247Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuQ09OVEVOVF9ERVNDUklQVElPTl9fTUFJTl9ERVNDUklQVElPTiwgb2xkTWFpbkRlc2NyaXB0aW9uLCBtYWluRGVzY3JpcHRpb24pKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEtleUNvbnNpZGVyYXRpb25zKCkgewotCQlyZXR1cm4ga2V5Q29uc2lkZXJhdGlvbnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0S2V5Q29uc2lkZXJhdGlvbnMoU3RyaW5nIG5ld0tleUNvbnNpZGVyYXRpb25zKSB7Ci0JCVN0cmluZyBvbGRLZXlDb25zaWRlcmF0aW9ucyA9IGtleUNvbnNpZGVyYXRpb25zOwotCQlrZXlDb25zaWRlcmF0aW9ucyA9IG5ld0tleUNvbnNpZGVyYXRpb25zOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLkNPTlRFTlRfREVTQ1JJUFRJT05fX0tFWV9DT05TSURFUkFUSU9OUywgb2xkS2V5Q29uc2lkZXJhdGlvbnMsIGtleUNvbnNpZGVyYXRpb25zKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFNlY3Rpb24+IGdldFNlY3Rpb24oKSB7Ci0JCWlmIChzZWN0aW9uID09IG51bGwpIHsKLQkJCXNlY3Rpb24gPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8U2VjdGlvbj4oU2VjdGlvbi5jbGFzcywgdGhpcywgVW1hUGFja2FnZS5DT05URU5UX0RFU0NSSVBUSU9OX19TRUNUSU9OKTsKLQkJfQotCQlyZXR1cm4gc2VjdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEV4dGVybmFsSWQoKSB7Ci0JCXJldHVybiBleHRlcm5hbElkOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEV4dGVybmFsSWQoU3RyaW5nIG5ld0V4dGVybmFsSWQpIHsKLQkJU3RyaW5nIG9sZEV4dGVybmFsSWQgPSBleHRlcm5hbElkOwotCQlleHRlcm5hbElkID0gbmV3RXh0ZXJuYWxJZDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5DT05URU5UX0RFU0NSSVBUSU9OX19FWFRFUk5BTF9JRCwgb2xkRXh0ZXJuYWxJZCwgZXh0ZXJuYWxJZCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0RFU0NSSVBUSU9OX19TRUNUSU9OOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0U2VjdGlvbigpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0RFU0NSSVBUSU9OX19NQUlOX0RFU0NSSVBUSU9OOgotCQkJCXJldHVybiBnZXRNYWluRGVzY3JpcHRpb24oKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0RFU0NSSVBUSU9OX19LRVlfQ09OU0lERVJBVElPTlM6Ci0JCQkJcmV0dXJuIGdldEtleUNvbnNpZGVyYXRpb25zKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9ERVNDUklQVElPTl9fU0VDVElPTjoKLQkJCQlyZXR1cm4gZ2V0U2VjdGlvbigpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfREVTQ1JJUFRJT05fX0VYVEVSTkFMX0lEOgotCQkJCXJldHVybiBnZXRFeHRlcm5hbElkKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9ERVNDUklQVElPTl9fTUFJTl9ERVNDUklQVElPTjoKLQkJCQlzZXRNYWluRGVzY3JpcHRpb24oKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfREVTQ1JJUFRJT05fX0tFWV9DT05TSURFUkFUSU9OUzoKLQkJCQlzZXRLZXlDb25zaWRlcmF0aW9ucygoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9ERVNDUklQVElPTl9fU0VDVElPTjoKLQkJCQlnZXRTZWN0aW9uKCkuY2xlYXIoKTsKLQkJCQlnZXRTZWN0aW9uKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBTZWN0aW9uPiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfREVTQ1JJUFRJT05fX0VYVEVSTkFMX0lEOgotCQkJCXNldEV4dGVybmFsSWQoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0RFU0NSSVBUSU9OX19NQUlOX0RFU0NSSVBUSU9OOgotCQkJCXNldE1haW5EZXNjcmlwdGlvbihNQUlOX0RFU0NSSVBUSU9OX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9ERVNDUklQVElPTl9fS0VZX0NPTlNJREVSQVRJT05TOgotCQkJCXNldEtleUNvbnNpZGVyYXRpb25zKEtFWV9DT05TSURFUkFUSU9OU19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfREVTQ1JJUFRJT05fX1NFQ1RJT046Ci0JCQkJZ2V0U2VjdGlvbigpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfREVTQ1JJUFRJT05fX0VYVEVSTkFMX0lEOgotCQkJCXNldEV4dGVybmFsSWQoRVhURVJOQUxfSURfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfREVTQ1JJUFRJT05fX01BSU5fREVTQ1JJUFRJT046Ci0JCQkJcmV0dXJuIE1BSU5fREVTQ1JJUFRJT05fRURFRkFVTFQgPT0gbnVsbCA/IG1haW5EZXNjcmlwdGlvbiAhPSBudWxsIDogIU1BSU5fREVTQ1JJUFRJT05fRURFRkFVTFQuZXF1YWxzKG1haW5EZXNjcmlwdGlvbik7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9ERVNDUklQVElPTl9fS0VZX0NPTlNJREVSQVRJT05TOgotCQkJCXJldHVybiBLRVlfQ09OU0lERVJBVElPTlNfRURFRkFVTFQgPT0gbnVsbCA/IGtleUNvbnNpZGVyYXRpb25zICE9IG51bGwgOiAhS0VZX0NPTlNJREVSQVRJT05TX0VERUZBVUxULmVxdWFscyhrZXlDb25zaWRlcmF0aW9ucyk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9ERVNDUklQVElPTl9fU0VDVElPTjoKLQkJCQlyZXR1cm4gc2VjdGlvbiAhPSBudWxsICYmICFzZWN0aW9uLmlzRW1wdHkoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0RFU0NSSVBUSU9OX19FWFRFUk5BTF9JRDoKLQkJCQlyZXR1cm4gRVhURVJOQUxfSURfRURFRkFVTFQgPT0gbnVsbCA/IGV4dGVybmFsSWQgIT0gbnVsbCA6ICFFWFRFUk5BTF9JRF9FREVGQVVMVC5lcXVhbHMoZXh0ZXJuYWxJZCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChtYWluRGVzY3JpcHRpb246ICIpOwotCQlyZXN1bHQuYXBwZW5kKG1haW5EZXNjcmlwdGlvbik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwga2V5Q29uc2lkZXJhdGlvbnM6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGtleUNvbnNpZGVyYXRpb25zKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBleHRlcm5hbElkOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChleHRlcm5hbElkKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vQ29udGVudERlc2NyaXB0aW9uSW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0NvbnRlbnRFbGVtZW50SW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvQ29udGVudEVsZW1lbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmMGIyNDMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvQ29udGVudEVsZW1lbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NTggKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBDb250ZW50RWxlbWVudEltcGwuamF2YSx2IDEuMiAyMDA4LzAxLzMwIDAwOjQxOjQ3IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5CYXNpY0ZlYXR1cmVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVmFyaWFiaWxpdHlUeXBlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Q29udGVudCBFbGVtZW50PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkNvbnRlbnRFbGVtZW50SW1wbCNnZXRHcm91cDEgPGVtPkdyb3VwMTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Db250ZW50RWxlbWVudEltcGwjZ2V0Q2hlY2tsaXN0IDxlbT5DaGVja2xpc3Q8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQ29udGVudEVsZW1lbnRJbXBsI2dldENvbmNlcHQgPGVtPkNvbmNlcHQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQ29udGVudEVsZW1lbnRJbXBsI2dldEV4YW1wbGUgPGVtPkV4YW1wbGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQ29udGVudEVsZW1lbnRJbXBsI2dldEd1aWRlbGluZSA8ZW0+R3VpZGVsaW5lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkNvbnRlbnRFbGVtZW50SW1wbCNnZXRSZXVzYWJsZUFzc2V0IDxlbT5SZXVzYWJsZSBBc3NldDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Db250ZW50RWxlbWVudEltcGwjZ2V0U3VwcG9ydGluZ01hdGVyaWFsIDxlbT5TdXBwb3J0aW5nIE1hdGVyaWFsPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkNvbnRlbnRFbGVtZW50SW1wbCNnZXRXaGl0ZXBhcGVyIDxlbT5XaGl0ZXBhcGVyPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkNvbnRlbnRFbGVtZW50SW1wbCNnZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50IDxlbT5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkNvbnRlbnRFbGVtZW50SW1wbCNnZXRWYXJpYWJpbGl0eVR5cGUgPGVtPlZhcmlhYmlsaXR5IFR5cGU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBDb250ZW50RWxlbWVudEltcGwgZXh0ZW5kcyBEZXNjcmliYWJsZUVsZW1lbnRJbXBsIGltcGxlbWVudHMgQ29udGVudEVsZW1lbnQgewotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEdyb3VwMSgpIDxlbT5Hcm91cDE8L2VtPn0nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0R3JvdXAxKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRmVhdHVyZU1hcCBncm91cDE7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpIDxlbT5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBWQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSA8ZW0+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyB2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50ID0gVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWYXJpYWJpbGl0eVR5cGUoKSA8ZW0+VmFyaWFiaWxpdHkgVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VmFyaWFiaWxpdHlUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFZhcmlhYmlsaXR5VHlwZSBWQVJJQUJJTElUWV9UWVBFX0VERUZBVUxUID0gVmFyaWFiaWxpdHlUeXBlLk5BOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmFyaWFiaWxpdHlUeXBlKCkgPGVtPlZhcmlhYmlsaXR5IFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFZhcmlhYmlsaXR5VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFZhcmlhYmlsaXR5VHlwZSB2YXJpYWJpbGl0eVR5cGUgPSBWQVJJQUJJTElUWV9UWVBFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBWYXJpYWJpbGl0eSBUeXBlIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiB2YXJpYWJpbGl0eVR5cGVFU2V0OwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbnRlbnRFbGVtZW50SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuQ09OVEVOVF9FTEVNRU5UOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBGZWF0dXJlTWFwIGdldEdyb3VwMSgpIHsKLQkJaWYgKGdyb3VwMSA9PSBudWxsKSB7Ci0JCQlncm91cDEgPSBuZXcgQmFzaWNGZWF0dXJlTWFwKHRoaXMsIFVtYVBhY2thZ2UuQ09OVEVOVF9FTEVNRU5UX19HUk9VUDEpOwotCQl9Ci0JCXJldHVybiBncm91cDE7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFN0cmluZz4gZ2V0Q2hlY2tsaXN0KCkgewotCQlyZXR1cm4gZ2V0R3JvdXAxKCkubGlzdChVbWFQYWNrYWdlLkxpdGVyYWxzLkNPTlRFTlRfRUxFTUVOVF9fQ0hFQ0tMSVNUKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8U3RyaW5nPiBnZXRDb25jZXB0KCkgewotCQlyZXR1cm4gZ2V0R3JvdXAxKCkubGlzdChVbWFQYWNrYWdlLkxpdGVyYWxzLkNPTlRFTlRfRUxFTUVOVF9fQ09OQ0VQVCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFN0cmluZz4gZ2V0RXhhbXBsZSgpIHsKLQkJcmV0dXJuIGdldEdyb3VwMSgpLmxpc3QoVW1hUGFja2FnZS5MaXRlcmFscy5DT05URU5UX0VMRU1FTlRfX0VYQU1QTEUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxTdHJpbmc+IGdldEd1aWRlbGluZSgpIHsKLQkJcmV0dXJuIGdldEdyb3VwMSgpLmxpc3QoVW1hUGFja2FnZS5MaXRlcmFscy5DT05URU5UX0VMRU1FTlRfX0dVSURFTElORSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFN0cmluZz4gZ2V0UmV1c2FibGVBc3NldCgpIHsKLQkJcmV0dXJuIGdldEdyb3VwMSgpLmxpc3QoVW1hUGFja2FnZS5MaXRlcmFscy5DT05URU5UX0VMRU1FTlRfX1JFVVNBQkxFX0FTU0VUKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8U3RyaW5nPiBnZXRTdXBwb3J0aW5nTWF0ZXJpYWwoKSB7Ci0JCXJldHVybiBnZXRHcm91cDEoKS5saXN0KFVtYVBhY2thZ2UuTGl0ZXJhbHMuQ09OVEVOVF9FTEVNRU5UX19TVVBQT1JUSU5HX01BVEVSSUFMKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8U3RyaW5nPiBnZXRXaGl0ZXBhcGVyKCkgewotCQlyZXR1cm4gZ2V0R3JvdXAxKCkubGlzdChVbWFQYWNrYWdlLkxpdGVyYWxzLkNPTlRFTlRfRUxFTUVOVF9fV0hJVEVQQVBFUik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkgewotCQlyZXR1cm4gdmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KFN0cmluZyBuZXdWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KSB7Ci0JCVN0cmluZyBvbGRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50ID0gdmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudDsKLQkJdmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCA9IG5ld1ZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuQ09OVEVOVF9FTEVNRU5UX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5ULCBvbGRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50LCB2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFZhcmlhYmlsaXR5VHlwZSBnZXRWYXJpYWJpbGl0eVR5cGUoKSB7Ci0JCXJldHVybiB2YXJpYWJpbGl0eVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmFyaWFiaWxpdHlUeXBlKFZhcmlhYmlsaXR5VHlwZSBuZXdWYXJpYWJpbGl0eVR5cGUpIHsKLQkJVmFyaWFiaWxpdHlUeXBlIG9sZFZhcmlhYmlsaXR5VHlwZSA9IHZhcmlhYmlsaXR5VHlwZTsKLQkJdmFyaWFiaWxpdHlUeXBlID0gbmV3VmFyaWFiaWxpdHlUeXBlID09IG51bGwgPyBWQVJJQUJJTElUWV9UWVBFX0VERUZBVUxUIDogbmV3VmFyaWFiaWxpdHlUeXBlOwotCQlib29sZWFuIG9sZFZhcmlhYmlsaXR5VHlwZUVTZXQgPSB2YXJpYWJpbGl0eVR5cGVFU2V0OwotCQl2YXJpYWJpbGl0eVR5cGVFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5DT05URU5UX0VMRU1FTlRfX1ZBUklBQklMSVRZX1RZUEUsIG9sZFZhcmlhYmlsaXR5VHlwZSwgdmFyaWFiaWxpdHlUeXBlLCAhb2xkVmFyaWFiaWxpdHlUeXBlRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0VmFyaWFiaWxpdHlUeXBlKCkgewotCQlWYXJpYWJpbGl0eVR5cGUgb2xkVmFyaWFiaWxpdHlUeXBlID0gdmFyaWFiaWxpdHlUeXBlOwotCQlib29sZWFuIG9sZFZhcmlhYmlsaXR5VHlwZUVTZXQgPSB2YXJpYWJpbGl0eVR5cGVFU2V0OwotCQl2YXJpYWJpbGl0eVR5cGUgPSBWQVJJQUJJTElUWV9UWVBFX0VERUZBVUxUOwotCQl2YXJpYWJpbGl0eVR5cGVFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgVW1hUGFja2FnZS5DT05URU5UX0VMRU1FTlRfX1ZBUklBQklMSVRZX1RZUEUsIG9sZFZhcmlhYmlsaXR5VHlwZSwgVkFSSUFCSUxJVFlfVFlQRV9FREVGQVVMVCwgb2xkVmFyaWFiaWxpdHlUeXBlRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0VmFyaWFiaWxpdHlUeXBlKCkgewotCQlyZXR1cm4gdmFyaWFiaWxpdHlUeXBlRVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9FTEVNRU5UX19HUk9VUDE6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRHcm91cDEoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9FTEVNRU5UX19HUk9VUDE6Ci0JCQkJaWYgKGNvcmVUeXBlKSByZXR1cm4gZ2V0R3JvdXAxKCk7Ci0JCQkJcmV0dXJuICgoRmVhdHVyZU1hcC5JbnRlcm5hbClnZXRHcm91cDEoKSkuZ2V0V3JhcHBlcigpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfRUxFTUVOVF9fQ0hFQ0tMSVNUOgotCQkJCXJldHVybiBnZXRDaGVja2xpc3QoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0VMRU1FTlRfX0NPTkNFUFQ6Ci0JCQkJcmV0dXJuIGdldENvbmNlcHQoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0VMRU1FTlRfX0VYQU1QTEU6Ci0JCQkJcmV0dXJuIGdldEV4YW1wbGUoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0VMRU1FTlRfX0dVSURFTElORToKLQkJCQlyZXR1cm4gZ2V0R3VpZGVsaW5lKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9FTEVNRU5UX19SRVVTQUJMRV9BU1NFVDoKLQkJCQlyZXR1cm4gZ2V0UmV1c2FibGVBc3NldCgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfRUxFTUVOVF9fU1VQUE9SVElOR19NQVRFUklBTDoKLQkJCQlyZXR1cm4gZ2V0U3VwcG9ydGluZ01hdGVyaWFsKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9FTEVNRU5UX19XSElURVBBUEVSOgotCQkJCXJldHVybiBnZXRXaGl0ZXBhcGVyKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9FTEVNRU5UX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UOgotCQkJCXJldHVybiBnZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9FTEVNRU5UX19WQVJJQUJJTElUWV9UWVBFOgotCQkJCXJldHVybiBnZXRWYXJpYWJpbGl0eVR5cGUoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0VMRU1FTlRfX0dST1VQMToKLQkJCQkoKEZlYXR1cmVNYXAuSW50ZXJuYWwpZ2V0R3JvdXAxKCkpLnNldChuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfRUxFTUVOVF9fQ0hFQ0tMSVNUOgotCQkJCWdldENoZWNrbGlzdCgpLmNsZWFyKCk7Ci0JCQkJZ2V0Q2hlY2tsaXN0KCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBTdHJpbmc+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9FTEVNRU5UX19DT05DRVBUOgotCQkJCWdldENvbmNlcHQoKS5jbGVhcigpOwotCQkJCWdldENvbmNlcHQoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFN0cmluZz4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0VMRU1FTlRfX0VYQU1QTEU6Ci0JCQkJZ2V0RXhhbXBsZSgpLmNsZWFyKCk7Ci0JCQkJZ2V0RXhhbXBsZSgpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgU3RyaW5nPiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfRUxFTUVOVF9fR1VJREVMSU5FOgotCQkJCWdldEd1aWRlbGluZSgpLmNsZWFyKCk7Ci0JCQkJZ2V0R3VpZGVsaW5lKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBTdHJpbmc+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9FTEVNRU5UX19SRVVTQUJMRV9BU1NFVDoKLQkJCQlnZXRSZXVzYWJsZUFzc2V0KCkuY2xlYXIoKTsKLQkJCQlnZXRSZXVzYWJsZUFzc2V0KCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBTdHJpbmc+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9FTEVNRU5UX19TVVBQT1JUSU5HX01BVEVSSUFMOgotCQkJCWdldFN1cHBvcnRpbmdNYXRlcmlhbCgpLmNsZWFyKCk7Ci0JCQkJZ2V0U3VwcG9ydGluZ01hdGVyaWFsKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBTdHJpbmc+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9FTEVNRU5UX19XSElURVBBUEVSOgotCQkJCWdldFdoaXRlcGFwZXIoKS5jbGVhcigpOwotCQkJCWdldFdoaXRlcGFwZXIoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFN0cmluZz4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0VMRU1FTlRfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQ6Ci0JCQkJc2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9FTEVNRU5UX19WQVJJQUJJTElUWV9UWVBFOgotCQkJCXNldFZhcmlhYmlsaXR5VHlwZSgoVmFyaWFiaWxpdHlUeXBlKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfRUxFTUVOVF9fR1JPVVAxOgotCQkJCWdldEdyb3VwMSgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfRUxFTUVOVF9fQ0hFQ0tMSVNUOgotCQkJCWdldENoZWNrbGlzdCgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfRUxFTUVOVF9fQ09OQ0VQVDoKLQkJCQlnZXRDb25jZXB0KCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9FTEVNRU5UX19FWEFNUExFOgotCQkJCWdldEV4YW1wbGUoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0VMRU1FTlRfX0dVSURFTElORToKLQkJCQlnZXRHdWlkZWxpbmUoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0VMRU1FTlRfX1JFVVNBQkxFX0FTU0VUOgotCQkJCWdldFJldXNhYmxlQXNzZXQoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0VMRU1FTlRfX1NVUFBPUlRJTkdfTUFURVJJQUw6Ci0JCQkJZ2V0U3VwcG9ydGluZ01hdGVyaWFsKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9FTEVNRU5UX19XSElURVBBUEVSOgotCQkJCWdldFdoaXRlcGFwZXIoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0VMRU1FTlRfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQ6Ci0JCQkJc2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudChWQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9FTEVNRU5UX19WQVJJQUJJTElUWV9UWVBFOgotCQkJCXVuc2V0VmFyaWFiaWxpdHlUeXBlKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9FTEVNRU5UX19HUk9VUDE6Ci0JCQkJcmV0dXJuIGdyb3VwMSAhPSBudWxsICYmICFncm91cDEuaXNFbXB0eSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfRUxFTUVOVF9fQ0hFQ0tMSVNUOgotCQkJCXJldHVybiAhZ2V0Q2hlY2tsaXN0KCkuaXNFbXB0eSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfRUxFTUVOVF9fQ09OQ0VQVDoKLQkJCQlyZXR1cm4gIWdldENvbmNlcHQoKS5pc0VtcHR5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9FTEVNRU5UX19FWEFNUExFOgotCQkJCXJldHVybiAhZ2V0RXhhbXBsZSgpLmlzRW1wdHkoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0VMRU1FTlRfX0dVSURFTElORToKLQkJCQlyZXR1cm4gIWdldEd1aWRlbGluZSgpLmlzRW1wdHkoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0VMRU1FTlRfX1JFVVNBQkxFX0FTU0VUOgotCQkJCXJldHVybiAhZ2V0UmV1c2FibGVBc3NldCgpLmlzRW1wdHkoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0VMRU1FTlRfX1NVUFBPUlRJTkdfTUFURVJJQUw6Ci0JCQkJcmV0dXJuICFnZXRTdXBwb3J0aW5nTWF0ZXJpYWwoKS5pc0VtcHR5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9FTEVNRU5UX19XSElURVBBUEVSOgotCQkJCXJldHVybiAhZ2V0V2hpdGVwYXBlcigpLmlzRW1wdHkoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0VMRU1FTlRfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQ6Ci0JCQkJcmV0dXJuIFZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlRfRURFRkFVTFQgPT0gbnVsbCA/IHZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQgIT0gbnVsbCA6ICFWQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UX0VERUZBVUxULmVxdWFscyh2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KTsKLQkJCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0VMRU1FTlRfX1ZBUklBQklMSVRZX1RZUEU6Ci0JCQkJcmV0dXJuIGlzU2V0VmFyaWFiaWxpdHlUeXBlKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChncm91cDE6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGdyb3VwMSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgdmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudDogIik7Ci0JCXJlc3VsdC5hcHBlbmQodmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgdmFyaWFiaWxpdHlUeXBlOiAiKTsKLQkJaWYgKHZhcmlhYmlsaXR5VHlwZUVTZXQpIHJlc3VsdC5hcHBlbmQodmFyaWFiaWxpdHlUeXBlKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL0NvbnRlbnRFbGVtZW50SW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0NvbnRlbnRQYWNrYWdlSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvQ29udGVudFBhY2thZ2VJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkOGFiYjkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvQ29udGVudFBhY2thZ2VJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTAgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBDb250ZW50UGFja2FnZUltcGwuamF2YSx2IDEuMiAyMDA4LzAxLzMwIDAwOjQxOjQ3IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkJhc2ljRmVhdHVyZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkNvbnRlbnQgUGFja2FnZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Db250ZW50UGFja2FnZUltcGwjZ2V0R3JvdXAyIDxlbT5Hcm91cDI8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQ29udGVudFBhY2thZ2VJbXBsI2dldENvbnRlbnRFbGVtZW50IDxlbT5Db250ZW50IEVsZW1lbnQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBDb250ZW50UGFja2FnZUltcGwgZXh0ZW5kcyBNZXRob2RQYWNrYWdlSW1wbCBpbXBsZW1lbnRzIENvbnRlbnRQYWNrYWdlIHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRHcm91cDIoKSA8ZW0+R3JvdXAyPC9lbT59JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEdyb3VwMigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEZlYXR1cmVNYXAgZ3JvdXAyOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbnRlbnRQYWNrYWdlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuQ09OVEVOVF9QQUNLQUdFOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBGZWF0dXJlTWFwIGdldEdyb3VwMigpIHsKLQkJaWYgKGdyb3VwMiA9PSBudWxsKSB7Ci0JCQlncm91cDIgPSBuZXcgQmFzaWNGZWF0dXJlTWFwKHRoaXMsIFVtYVBhY2thZ2UuQ09OVEVOVF9QQUNLQUdFX19HUk9VUDIpOwotCQl9Ci0JCXJldHVybiBncm91cDI7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PENvbnRlbnRFbGVtZW50PiBnZXRDb250ZW50RWxlbWVudCgpIHsKLQkJcmV0dXJuIGdldEdyb3VwMigpLmxpc3QoVW1hUGFja2FnZS5MaXRlcmFscy5DT05URU5UX1BBQ0tBR0VfX0NPTlRFTlRfRUxFTUVOVCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfUEFDS0FHRV9fR1JPVVAyOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0R3JvdXAyKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX1BBQ0tBR0VfX0NPTlRFTlRfRUxFTUVOVDoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldENvbnRlbnRFbGVtZW50KCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfUEFDS0FHRV9fR1JPVVAyOgotCQkJCWlmIChjb3JlVHlwZSkgcmV0dXJuIGdldEdyb3VwMigpOwotCQkJCXJldHVybiAoKEZlYXR1cmVNYXAuSW50ZXJuYWwpZ2V0R3JvdXAyKCkpLmdldFdyYXBwZXIoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX1BBQ0tBR0VfX0NPTlRFTlRfRUxFTUVOVDoKLQkJCQlyZXR1cm4gZ2V0Q29udGVudEVsZW1lbnQoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX1BBQ0tBR0VfX0dST1VQMjoKLQkJCQkoKEZlYXR1cmVNYXAuSW50ZXJuYWwpZ2V0R3JvdXAyKCkpLnNldChuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfUEFDS0FHRV9fQ09OVEVOVF9FTEVNRU5UOgotCQkJCWdldENvbnRlbnRFbGVtZW50KCkuY2xlYXIoKTsKLQkJCQlnZXRDb250ZW50RWxlbWVudCgpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgQ29udGVudEVsZW1lbnQ+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfUEFDS0FHRV9fR1JPVVAyOgotCQkJCWdldEdyb3VwMigpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfUEFDS0FHRV9fQ09OVEVOVF9FTEVNRU5UOgotCQkJCWdldENvbnRlbnRFbGVtZW50KCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX1BBQ0tBR0VfX0dST1VQMjoKLQkJCQlyZXR1cm4gZ3JvdXAyICE9IG51bGwgJiYgIWdyb3VwMi5pc0VtcHR5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9QQUNLQUdFX19DT05URU5UX0VMRU1FTlQ6Ci0JCQkJcmV0dXJuICFnZXRDb250ZW50RWxlbWVudCgpLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGdyb3VwMjogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZ3JvdXAyKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vQ29udGVudFBhY2thZ2VJbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvQ3VzdG9tQ2F0ZWdvcnlJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9DdXN0b21DYXRlZ29yeUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDY3NjczOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9DdXN0b21DYXRlZ29yeUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwOCArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IEN1c3RvbUNhdGVnb3J5SW1wbC5qYXZhLHYgMS4yIDIwMDgvMDEvMzAgMDA6NDE6NDcga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuQmFzaWNGZWF0dXJlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5DdXN0b21DYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Q3VzdG9tIENhdGVnb3J5PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkN1c3RvbUNhdGVnb3J5SW1wbCNnZXRHcm91cDIgPGVtPkdyb3VwMjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5DdXN0b21DYXRlZ29yeUltcGwjZ2V0Q2F0ZWdvcml6ZWRFbGVtZW50IDxlbT5DYXRlZ29yaXplZCBFbGVtZW50PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkN1c3RvbUNhdGVnb3J5SW1wbCNnZXRTdWJDYXRlZ29yeSA8ZW0+U3ViIENhdGVnb3J5PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQ3VzdG9tQ2F0ZWdvcnlJbXBsIGV4dGVuZHMgQ29udGVudENhdGVnb3J5SW1wbCBpbXBsZW1lbnRzIEN1c3RvbUNhdGVnb3J5IHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRHcm91cDIoKSA8ZW0+R3JvdXAyPC9lbT59JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEdyb3VwMigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEZlYXR1cmVNYXAgZ3JvdXAyOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEN1c3RvbUNhdGVnb3J5SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuQ1VTVE9NX0NBVEVHT1JZOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBGZWF0dXJlTWFwIGdldEdyb3VwMigpIHsKLQkJaWYgKGdyb3VwMiA9PSBudWxsKSB7Ci0JCQlncm91cDIgPSBuZXcgQmFzaWNGZWF0dXJlTWFwKHRoaXMsIFVtYVBhY2thZ2UuQ1VTVE9NX0NBVEVHT1JZX19HUk9VUDIpOwotCQl9Ci0JCXJldHVybiBncm91cDI7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFN0cmluZz4gZ2V0Q2F0ZWdvcml6ZWRFbGVtZW50KCkgewotCQlyZXR1cm4gZ2V0R3JvdXAyKCkubGlzdChVbWFQYWNrYWdlLkxpdGVyYWxzLkNVU1RPTV9DQVRFR09SWV9fQ0FURUdPUklaRURfRUxFTUVOVCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFN0cmluZz4gZ2V0U3ViQ2F0ZWdvcnkoKSB7Ci0JCXJldHVybiBnZXRHcm91cDIoKS5saXN0KFVtYVBhY2thZ2UuTGl0ZXJhbHMuQ1VTVE9NX0NBVEVHT1JZX19TVUJfQ0FURUdPUlkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5DVVNUT01fQ0FURUdPUllfX0dST1VQMjoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldEdyb3VwMigpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5DVVNUT01fQ0FURUdPUllfX0dST1VQMjoKLQkJCQlpZiAoY29yZVR5cGUpIHJldHVybiBnZXRHcm91cDIoKTsKLQkJCQlyZXR1cm4gKChGZWF0dXJlTWFwLkludGVybmFsKWdldEdyb3VwMigpKS5nZXRXcmFwcGVyKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ1VTVE9NX0NBVEVHT1JZX19DQVRFR09SSVpFRF9FTEVNRU5UOgotCQkJCXJldHVybiBnZXRDYXRlZ29yaXplZEVsZW1lbnQoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5DVVNUT01fQ0FURUdPUllfX1NVQl9DQVRFR09SWToKLQkJCQlyZXR1cm4gZ2V0U3ViQ2F0ZWdvcnkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5DVVNUT01fQ0FURUdPUllfX0dST1VQMjoKLQkJCQkoKEZlYXR1cmVNYXAuSW50ZXJuYWwpZ2V0R3JvdXAyKCkpLnNldChuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkNVU1RPTV9DQVRFR09SWV9fQ0FURUdPUklaRURfRUxFTUVOVDoKLQkJCQlnZXRDYXRlZ29yaXplZEVsZW1lbnQoKS5jbGVhcigpOwotCQkJCWdldENhdGVnb3JpemVkRWxlbWVudCgpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgU3RyaW5nPiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkNVU1RPTV9DQVRFR09SWV9fU1VCX0NBVEVHT1JZOgotCQkJCWdldFN1YkNhdGVnb3J5KCkuY2xlYXIoKTsKLQkJCQlnZXRTdWJDYXRlZ29yeSgpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgU3RyaW5nPiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5DVVNUT01fQ0FURUdPUllfX0dST1VQMjoKLQkJCQlnZXRHcm91cDIoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5DVVNUT01fQ0FURUdPUllfX0NBVEVHT1JJWkVEX0VMRU1FTlQ6Ci0JCQkJZ2V0Q2F0ZWdvcml6ZWRFbGVtZW50KCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ1VTVE9NX0NBVEVHT1JZX19TVUJfQ0FURUdPUlk6Ci0JCQkJZ2V0U3ViQ2F0ZWdvcnkoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkNVU1RPTV9DQVRFR09SWV9fR1JPVVAyOgotCQkJCXJldHVybiBncm91cDIgIT0gbnVsbCAmJiAhZ3JvdXAyLmlzRW1wdHkoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5DVVNUT01fQ0FURUdPUllfX0NBVEVHT1JJWkVEX0VMRU1FTlQ6Ci0JCQkJcmV0dXJuICFnZXRDYXRlZ29yaXplZEVsZW1lbnQoKS5pc0VtcHR5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ1VTVE9NX0NBVEVHT1JZX19TVUJfQ0FURUdPUlk6Ci0JCQkJcmV0dXJuICFnZXRTdWJDYXRlZ29yeSgpLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGdyb3VwMjogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZ3JvdXAyKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vQ3VzdG9tQ2F0ZWdvcnlJbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvRGVsaXZlcmFibGVEZXNjcmlwdGlvbkltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0RlbGl2ZXJhYmxlRGVzY3JpcHRpb25JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5M2NhNTguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvRGVsaXZlcmFibGVEZXNjcmlwdGlvbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxNyArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IERlbGl2ZXJhYmxlRGVzY3JpcHRpb25JbXBsLmphdmEsdiAxLjIgMjAwOC8wMS8zMCAwMDo0MTo0NyBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlbGl2ZXJhYmxlRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkRlbGl2ZXJhYmxlIERlc2NyaXB0aW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkRlbGl2ZXJhYmxlRGVzY3JpcHRpb25JbXBsI2dldEV4dGVybmFsRGVzY3JpcHRpb24gPGVtPkV4dGVybmFsIERlc2NyaXB0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkRlbGl2ZXJhYmxlRGVzY3JpcHRpb25JbXBsI2dldFBhY2thZ2luZ0d1aWRhbmNlIDxlbT5QYWNrYWdpbmcgR3VpZGFuY2U8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEZWxpdmVyYWJsZURlc2NyaXB0aW9uSW1wbCBleHRlbmRzIFdvcmtQcm9kdWN0RGVzY3JpcHRpb25JbXBsIGltcGxlbWVudHMgRGVsaXZlcmFibGVEZXNjcmlwdGlvbiB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEV4dGVybmFsRGVzY3JpcHRpb24oKSA8ZW0+RXh0ZXJuYWwgRGVzY3JpcHRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEV4dGVybmFsRGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVEVSTkFMX0RFU0NSSVBUSU9OX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEV4dGVybmFsRGVzY3JpcHRpb24oKSA8ZW0+RXh0ZXJuYWwgRGVzY3JpcHRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEV4dGVybmFsRGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZXh0ZXJuYWxEZXNjcmlwdGlvbiA9IEVYVEVSTkFMX0RFU0NSSVBUSU9OX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBhY2thZ2luZ0d1aWRhbmNlKCkgPGVtPlBhY2thZ2luZyBHdWlkYW5jZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UGFja2FnaW5nR3VpZGFuY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBBQ0tBR0lOR19HVUlEQU5DRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQYWNrYWdpbmdHdWlkYW5jZSgpIDxlbT5QYWNrYWdpbmcgR3VpZGFuY2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFBhY2thZ2luZ0d1aWRhbmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHBhY2thZ2luZ0d1aWRhbmNlID0gUEFDS0FHSU5HX0dVSURBTkNFX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIERlbGl2ZXJhYmxlRGVzY3JpcHRpb25JbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5ERUxJVkVSQUJMRV9ERVNDUklQVElPTjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEV4dGVybmFsRGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBleHRlcm5hbERlc2NyaXB0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEV4dGVybmFsRGVzY3JpcHRpb24oU3RyaW5nIG5ld0V4dGVybmFsRGVzY3JpcHRpb24pIHsKLQkJU3RyaW5nIG9sZEV4dGVybmFsRGVzY3JpcHRpb24gPSBleHRlcm5hbERlc2NyaXB0aW9uOwotCQlleHRlcm5hbERlc2NyaXB0aW9uID0gbmV3RXh0ZXJuYWxEZXNjcmlwdGlvbjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5ERUxJVkVSQUJMRV9ERVNDUklQVElPTl9fRVhURVJOQUxfREVTQ1JJUFRJT04sIG9sZEV4dGVybmFsRGVzY3JpcHRpb24sIGV4dGVybmFsRGVzY3JpcHRpb24pKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFBhY2thZ2luZ0d1aWRhbmNlKCkgewotCQlyZXR1cm4gcGFja2FnaW5nR3VpZGFuY2U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UGFja2FnaW5nR3VpZGFuY2UoU3RyaW5nIG5ld1BhY2thZ2luZ0d1aWRhbmNlKSB7Ci0JCVN0cmluZyBvbGRQYWNrYWdpbmdHdWlkYW5jZSA9IHBhY2thZ2luZ0d1aWRhbmNlOwotCQlwYWNrYWdpbmdHdWlkYW5jZSA9IG5ld1BhY2thZ2luZ0d1aWRhbmNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLkRFTElWRVJBQkxFX0RFU0NSSVBUSU9OX19QQUNLQUdJTkdfR1VJREFOQ0UsIG9sZFBhY2thZ2luZ0d1aWRhbmNlLCBwYWNrYWdpbmdHdWlkYW5jZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSQUJMRV9ERVNDUklQVElPTl9fRVhURVJOQUxfREVTQ1JJUFRJT046Ci0JCQkJcmV0dXJuIGdldEV4dGVybmFsRGVzY3JpcHRpb24oKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSQUJMRV9ERVNDUklQVElPTl9fUEFDS0FHSU5HX0dVSURBTkNFOgotCQkJCXJldHVybiBnZXRQYWNrYWdpbmdHdWlkYW5jZSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUkFCTEVfREVTQ1JJUFRJT05fX0VYVEVSTkFMX0RFU0NSSVBUSU9OOgotCQkJCXNldEV4dGVybmFsRGVzY3JpcHRpb24oKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJBQkxFX0RFU0NSSVBUSU9OX19QQUNLQUdJTkdfR1VJREFOQ0U6Ci0JCQkJc2V0UGFja2FnaW5nR3VpZGFuY2UoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSQUJMRV9ERVNDUklQVElPTl9fRVhURVJOQUxfREVTQ1JJUFRJT046Ci0JCQkJc2V0RXh0ZXJuYWxEZXNjcmlwdGlvbihFWFRFUk5BTF9ERVNDUklQVElPTl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJBQkxFX0RFU0NSSVBUSU9OX19QQUNLQUdJTkdfR1VJREFOQ0U6Ci0JCQkJc2V0UGFja2FnaW5nR3VpZGFuY2UoUEFDS0FHSU5HX0dVSURBTkNFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSQUJMRV9ERVNDUklQVElPTl9fRVhURVJOQUxfREVTQ1JJUFRJT046Ci0JCQkJcmV0dXJuIEVYVEVSTkFMX0RFU0NSSVBUSU9OX0VERUZBVUxUID09IG51bGwgPyBleHRlcm5hbERlc2NyaXB0aW9uICE9IG51bGwgOiAhRVhURVJOQUxfREVTQ1JJUFRJT05fRURFRkFVTFQuZXF1YWxzKGV4dGVybmFsRGVzY3JpcHRpb24pOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJBQkxFX0RFU0NSSVBUSU9OX19QQUNLQUdJTkdfR1VJREFOQ0U6Ci0JCQkJcmV0dXJuIFBBQ0tBR0lOR19HVUlEQU5DRV9FREVGQVVMVCA9PSBudWxsID8gcGFja2FnaW5nR3VpZGFuY2UgIT0gbnVsbCA6ICFQQUNLQUdJTkdfR1VJREFOQ0VfRURFRkFVTFQuZXF1YWxzKHBhY2thZ2luZ0d1aWRhbmNlKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGV4dGVybmFsRGVzY3JpcHRpb246ICIpOwotCQlyZXN1bHQuYXBwZW5kKGV4dGVybmFsRGVzY3JpcHRpb24pOwotCQlyZXN1bHQuYXBwZW5kKCIsIHBhY2thZ2luZ0d1aWRhbmNlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChwYWNrYWdpbmdHdWlkYW5jZSk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL0RlbGl2ZXJhYmxlRGVzY3JpcHRpb25JbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvRGVsaXZlcmFibGVJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9EZWxpdmVyYWJsZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjJjYjQ1My4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9EZWxpdmVyYWJsZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NyArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IERlbGl2ZXJhYmxlSW1wbC5qYXZhLHYgMS4yIDIwMDgvMDEvMzAgMDA6NDE6NDcga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuQmFzaWNGZWF0dXJlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZWxpdmVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RGVsaXZlcmFibGU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuRGVsaXZlcmFibGVJbXBsI2dldEdyb3VwMyA8ZW0+R3JvdXAzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkRlbGl2ZXJhYmxlSW1wbCNnZXREZWxpdmVyZWRXb3JrUHJvZHVjdCA8ZW0+RGVsaXZlcmVkIFdvcmsgUHJvZHVjdDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERlbGl2ZXJhYmxlSW1wbCBleHRlbmRzIFdvcmtQcm9kdWN0SW1wbCBpbXBsZW1lbnRzIERlbGl2ZXJhYmxlIHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRHcm91cDMoKSA8ZW0+R3JvdXAzPC9lbT59JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEdyb3VwMygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEZlYXR1cmVNYXAgZ3JvdXAzOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIERlbGl2ZXJhYmxlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuREVMSVZFUkFCTEU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEZlYXR1cmVNYXAgZ2V0R3JvdXAzKCkgewotCQlpZiAoZ3JvdXAzID09IG51bGwpIHsKLQkJCWdyb3VwMyA9IG5ldyBCYXNpY0ZlYXR1cmVNYXAodGhpcywgVW1hUGFja2FnZS5ERUxJVkVSQUJMRV9fR1JPVVAzKTsKLQkJfQotCQlyZXR1cm4gZ3JvdXAzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxTdHJpbmc+IGdldERlbGl2ZXJlZFdvcmtQcm9kdWN0KCkgewotCQlyZXR1cm4gZ2V0R3JvdXAzKCkubGlzdChVbWFQYWNrYWdlLkxpdGVyYWxzLkRFTElWRVJBQkxFX19ERUxJVkVSRURfV09SS19QUk9EVUNUKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUkFCTEVfX0dST1VQMzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldEdyb3VwMygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSQUJMRV9fR1JPVVAzOgotCQkJCWlmIChjb3JlVHlwZSkgcmV0dXJuIGdldEdyb3VwMygpOwotCQkJCXJldHVybiAoKEZlYXR1cmVNYXAuSW50ZXJuYWwpZ2V0R3JvdXAzKCkpLmdldFdyYXBwZXIoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSQUJMRV9fREVMSVZFUkVEX1dPUktfUFJPRFVDVDoKLQkJCQlyZXR1cm4gZ2V0RGVsaXZlcmVkV29ya1Byb2R1Y3QoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSQUJMRV9fR1JPVVAzOgotCQkJCSgoRmVhdHVyZU1hcC5JbnRlcm5hbClnZXRHcm91cDMoKSkuc2V0KG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUkFCTEVfX0RFTElWRVJFRF9XT1JLX1BST0RVQ1Q6Ci0JCQkJZ2V0RGVsaXZlcmVkV29ya1Byb2R1Y3QoKS5jbGVhcigpOwotCQkJCWdldERlbGl2ZXJlZFdvcmtQcm9kdWN0KCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBTdHJpbmc+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJBQkxFX19HUk9VUDM6Ci0JCQkJZ2V0R3JvdXAzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUkFCTEVfX0RFTElWRVJFRF9XT1JLX1BST0RVQ1Q6Ci0JCQkJZ2V0RGVsaXZlcmVkV29ya1Byb2R1Y3QoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJBQkxFX19HUk9VUDM6Ci0JCQkJcmV0dXJuIGdyb3VwMyAhPSBudWxsICYmICFncm91cDMuaXNFbXB0eSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJBQkxFX19ERUxJVkVSRURfV09SS19QUk9EVUNUOgotCQkJCXJldHVybiAhZ2V0RGVsaXZlcmVkV29ya1Byb2R1Y3QoKS5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChncm91cDM6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGdyb3VwMyk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL0RlbGl2ZXJhYmxlSW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkZmFiNTQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MzMgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBEZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbkltcGwuamF2YSx2IDEuMiAyMDA4LzAxLzMwIDAwOjQxOjQ3IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkRlbGl2ZXJ5IFByb2Nlc3MgRGVzY3JpcHRpb248L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25JbXBsI2dldFNjYWxlIDxlbT5TY2FsZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbkltcGwjZ2V0UHJvamVjdENoYXJhY3RlcmlzdGljcyA8ZW0+UHJvamVjdCBDaGFyYWN0ZXJpc3RpY3M8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25JbXBsI2dldFJpc2tMZXZlbCA8ZW0+UmlzayBMZXZlbDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbkltcGwjZ2V0RXN0aW1hdGluZ1RlY2huaXF1ZSA8ZW0+RXN0aW1hdGluZyBUZWNobmlxdWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25JbXBsI2dldFByb2plY3RNZW1iZXJFeHBlcnRpc2UgPGVtPlByb2plY3QgTWVtYmVyIEV4cGVydGlzZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbkltcGwjZ2V0VHlwZU9mQ29udHJhY3QgPGVtPlR5cGUgT2YgQ29udHJhY3Q8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbkltcGwgZXh0ZW5kcyBQcm9jZXNzRGVzY3JpcHRpb25JbXBsIGltcGxlbWVudHMgRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24gewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTY2FsZSgpIDxlbT5TY2FsZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U2NhbGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFNDQUxFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNjYWxlKCkgPGVtPlNjYWxlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTY2FsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBzY2FsZSA9IFNDQUxFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByb2plY3RDaGFyYWN0ZXJpc3RpY3MoKSA8ZW0+UHJvamVjdCBDaGFyYWN0ZXJpc3RpY3M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFByb2plY3RDaGFyYWN0ZXJpc3RpY3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0pFQ1RfQ0hBUkFDVEVSSVNUSUNTX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByb2plY3RDaGFyYWN0ZXJpc3RpY3MoKSA8ZW0+UHJvamVjdCBDaGFyYWN0ZXJpc3RpY3M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFByb2plY3RDaGFyYWN0ZXJpc3RpY3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgcHJvamVjdENoYXJhY3RlcmlzdGljcyA9IFBST0pFQ1RfQ0hBUkFDVEVSSVNUSUNTX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJpc2tMZXZlbCgpIDxlbT5SaXNrIExldmVsPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSaXNrTGV2ZWwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFJJU0tfTEVWRUxfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Umlza0xldmVsKCkgPGVtPlJpc2sgTGV2ZWw8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJpc2tMZXZlbCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyByaXNrTGV2ZWwgPSBSSVNLX0xFVkVMX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEVzdGltYXRpbmdUZWNobmlxdWUoKSA8ZW0+RXN0aW1hdGluZyBUZWNobmlxdWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEVzdGltYXRpbmdUZWNobmlxdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEVTVElNQVRJTkdfVEVDSE5JUVVFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEVzdGltYXRpbmdUZWNobmlxdWUoKSA8ZW0+RXN0aW1hdGluZyBUZWNobmlxdWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEVzdGltYXRpbmdUZWNobmlxdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZXN0aW1hdGluZ1RlY2huaXF1ZSA9IEVTVElNQVRJTkdfVEVDSE5JUVVFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByb2plY3RNZW1iZXJFeHBlcnRpc2UoKSA8ZW0+UHJvamVjdCBNZW1iZXIgRXhwZXJ0aXNlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQcm9qZWN0TWVtYmVyRXhwZXJ0aXNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9KRUNUX01FTUJFUl9FWFBFUlRJU0VfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJvamVjdE1lbWJlckV4cGVydGlzZSgpIDxlbT5Qcm9qZWN0IE1lbWJlciBFeHBlcnRpc2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFByb2plY3RNZW1iZXJFeHBlcnRpc2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgcHJvamVjdE1lbWJlckV4cGVydGlzZSA9IFBST0pFQ1RfTUVNQkVSX0VYUEVSVElTRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUeXBlT2ZDb250cmFjdCgpIDxlbT5UeXBlIE9mIENvbnRyYWN0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUeXBlT2ZDb250cmFjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQRV9PRl9DT05UUkFDVF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUeXBlT2ZDb250cmFjdCgpIDxlbT5UeXBlIE9mIENvbnRyYWN0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUeXBlT2ZDb250cmFjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyB0eXBlT2ZDb250cmFjdCA9IFRZUEVfT0ZfQ09OVFJBQ1RfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25JbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5ERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U2NhbGUoKSB7Ci0JCXJldHVybiBzY2FsZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTY2FsZShTdHJpbmcgbmV3U2NhbGUpIHsKLQkJU3RyaW5nIG9sZFNjYWxlID0gc2NhbGU7Ci0JCXNjYWxlID0gbmV3U2NhbGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fU0NBTEUsIG9sZFNjYWxlLCBzY2FsZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UHJvamVjdENoYXJhY3RlcmlzdGljcygpIHsKLQkJcmV0dXJuIHByb2plY3RDaGFyYWN0ZXJpc3RpY3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHJvamVjdENoYXJhY3RlcmlzdGljcyhTdHJpbmcgbmV3UHJvamVjdENoYXJhY3RlcmlzdGljcykgewotCQlTdHJpbmcgb2xkUHJvamVjdENoYXJhY3RlcmlzdGljcyA9IHByb2plY3RDaGFyYWN0ZXJpc3RpY3M7Ci0JCXByb2plY3RDaGFyYWN0ZXJpc3RpY3MgPSBuZXdQcm9qZWN0Q2hhcmFjdGVyaXN0aWNzOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLkRFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1BST0pFQ1RfQ0hBUkFDVEVSSVNUSUNTLCBvbGRQcm9qZWN0Q2hhcmFjdGVyaXN0aWNzLCBwcm9qZWN0Q2hhcmFjdGVyaXN0aWNzKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRSaXNrTGV2ZWwoKSB7Ci0JCXJldHVybiByaXNrTGV2ZWw7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Umlza0xldmVsKFN0cmluZyBuZXdSaXNrTGV2ZWwpIHsKLQkJU3RyaW5nIG9sZFJpc2tMZXZlbCA9IHJpc2tMZXZlbDsKLQkJcmlza0xldmVsID0gbmV3Umlza0xldmVsOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLkRFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1JJU0tfTEVWRUwsIG9sZFJpc2tMZXZlbCwgcmlza0xldmVsKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRFc3RpbWF0aW5nVGVjaG5pcXVlKCkgewotCQlyZXR1cm4gZXN0aW1hdGluZ1RlY2huaXF1ZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFc3RpbWF0aW5nVGVjaG5pcXVlKFN0cmluZyBuZXdFc3RpbWF0aW5nVGVjaG5pcXVlKSB7Ci0JCVN0cmluZyBvbGRFc3RpbWF0aW5nVGVjaG5pcXVlID0gZXN0aW1hdGluZ1RlY2huaXF1ZTsKLQkJZXN0aW1hdGluZ1RlY2huaXF1ZSA9IG5ld0VzdGltYXRpbmdUZWNobmlxdWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fRVNUSU1BVElOR19URUNITklRVUUsIG9sZEVzdGltYXRpbmdUZWNobmlxdWUsIGVzdGltYXRpbmdUZWNobmlxdWUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFByb2plY3RNZW1iZXJFeHBlcnRpc2UoKSB7Ci0JCXJldHVybiBwcm9qZWN0TWVtYmVyRXhwZXJ0aXNlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFByb2plY3RNZW1iZXJFeHBlcnRpc2UoU3RyaW5nIG5ld1Byb2plY3RNZW1iZXJFeHBlcnRpc2UpIHsKLQkJU3RyaW5nIG9sZFByb2plY3RNZW1iZXJFeHBlcnRpc2UgPSBwcm9qZWN0TWVtYmVyRXhwZXJ0aXNlOwotCQlwcm9qZWN0TWVtYmVyRXhwZXJ0aXNlID0gbmV3UHJvamVjdE1lbWJlckV4cGVydGlzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5ERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19QUk9KRUNUX01FTUJFUl9FWFBFUlRJU0UsIG9sZFByb2plY3RNZW1iZXJFeHBlcnRpc2UsIHByb2plY3RNZW1iZXJFeHBlcnRpc2UpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGVPZkNvbnRyYWN0KCkgewotCQlyZXR1cm4gdHlwZU9mQ29udHJhY3Q7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VHlwZU9mQ29udHJhY3QoU3RyaW5nIG5ld1R5cGVPZkNvbnRyYWN0KSB7Ci0JCVN0cmluZyBvbGRUeXBlT2ZDb250cmFjdCA9IHR5cGVPZkNvbnRyYWN0OwotCQl0eXBlT2ZDb250cmFjdCA9IG5ld1R5cGVPZkNvbnRyYWN0OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLkRFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1RZUEVfT0ZfQ09OVFJBQ1QsIG9sZFR5cGVPZkNvbnRyYWN0LCB0eXBlT2ZDb250cmFjdCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19TQ0FMRToKLQkJCQlyZXR1cm4gZ2V0U2NhbGUoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19QUk9KRUNUX0NIQVJBQ1RFUklTVElDUzoKLQkJCQlyZXR1cm4gZ2V0UHJvamVjdENoYXJhY3RlcmlzdGljcygpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1JJU0tfTEVWRUw6Ci0JCQkJcmV0dXJuIGdldFJpc2tMZXZlbCgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX0VTVElNQVRJTkdfVEVDSE5JUVVFOgotCQkJCXJldHVybiBnZXRFc3RpbWF0aW5nVGVjaG5pcXVlKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fUFJPSkVDVF9NRU1CRVJfRVhQRVJUSVNFOgotCQkJCXJldHVybiBnZXRQcm9qZWN0TWVtYmVyRXhwZXJ0aXNlKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fVFlQRV9PRl9DT05UUkFDVDoKLQkJCQlyZXR1cm4gZ2V0VHlwZU9mQ29udHJhY3QoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1NDQUxFOgotCQkJCXNldFNjYWxlKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19QUk9KRUNUX0NIQVJBQ1RFUklTVElDUzoKLQkJCQlzZXRQcm9qZWN0Q2hhcmFjdGVyaXN0aWNzKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19SSVNLX0xFVkVMOgotCQkJCXNldFJpc2tMZXZlbCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fRVNUSU1BVElOR19URUNITklRVUU6Ci0JCQkJc2V0RXN0aW1hdGluZ1RlY2huaXF1ZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fUFJPSkVDVF9NRU1CRVJfRVhQRVJUSVNFOgotCQkJCXNldFByb2plY3RNZW1iZXJFeHBlcnRpc2UoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1RZUEVfT0ZfQ09OVFJBQ1Q6Ci0JCQkJc2V0VHlwZU9mQ29udHJhY3QoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19TQ0FMRToKLQkJCQlzZXRTY2FsZShTQ0FMRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1BST0pFQ1RfQ0hBUkFDVEVSSVNUSUNTOgotCQkJCXNldFByb2plY3RDaGFyYWN0ZXJpc3RpY3MoUFJPSkVDVF9DSEFSQUNURVJJU1RJQ1NfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19SSVNLX0xFVkVMOgotCQkJCXNldFJpc2tMZXZlbChSSVNLX0xFVkVMX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fRVNUSU1BVElOR19URUNITklRVUU6Ci0JCQkJc2V0RXN0aW1hdGluZ1RlY2huaXF1ZShFU1RJTUFUSU5HX1RFQ0hOSVFVRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1BST0pFQ1RfTUVNQkVSX0VYUEVSVElTRToKLQkJCQlzZXRQcm9qZWN0TWVtYmVyRXhwZXJ0aXNlKFBST0pFQ1RfTUVNQkVSX0VYUEVSVElTRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1RZUEVfT0ZfQ09OVFJBQ1Q6Ci0JCQkJc2V0VHlwZU9mQ29udHJhY3QoVFlQRV9PRl9DT05UUkFDVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fU0NBTEU6Ci0JCQkJcmV0dXJuIFNDQUxFX0VERUZBVUxUID09IG51bGwgPyBzY2FsZSAhPSBudWxsIDogIVNDQUxFX0VERUZBVUxULmVxdWFscyhzY2FsZSk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fUFJPSkVDVF9DSEFSQUNURVJJU1RJQ1M6Ci0JCQkJcmV0dXJuIFBST0pFQ1RfQ0hBUkFDVEVSSVNUSUNTX0VERUZBVUxUID09IG51bGwgPyBwcm9qZWN0Q2hhcmFjdGVyaXN0aWNzICE9IG51bGwgOiAhUFJPSkVDVF9DSEFSQUNURVJJU1RJQ1NfRURFRkFVTFQuZXF1YWxzKHByb2plY3RDaGFyYWN0ZXJpc3RpY3MpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1JJU0tfTEVWRUw6Ci0JCQkJcmV0dXJuIFJJU0tfTEVWRUxfRURFRkFVTFQgPT0gbnVsbCA/IHJpc2tMZXZlbCAhPSBudWxsIDogIVJJU0tfTEVWRUxfRURFRkFVTFQuZXF1YWxzKHJpc2tMZXZlbCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fRVNUSU1BVElOR19URUNITklRVUU6Ci0JCQkJcmV0dXJuIEVTVElNQVRJTkdfVEVDSE5JUVVFX0VERUZBVUxUID09IG51bGwgPyBlc3RpbWF0aW5nVGVjaG5pcXVlICE9IG51bGwgOiAhRVNUSU1BVElOR19URUNITklRVUVfRURFRkFVTFQuZXF1YWxzKGVzdGltYXRpbmdUZWNobmlxdWUpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1BST0pFQ1RfTUVNQkVSX0VYUEVSVElTRToKLQkJCQlyZXR1cm4gUFJPSkVDVF9NRU1CRVJfRVhQRVJUSVNFX0VERUZBVUxUID09IG51bGwgPyBwcm9qZWN0TWVtYmVyRXhwZXJ0aXNlICE9IG51bGwgOiAhUFJPSkVDVF9NRU1CRVJfRVhQRVJUSVNFX0VERUZBVUxULmVxdWFscyhwcm9qZWN0TWVtYmVyRXhwZXJ0aXNlKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19UWVBFX09GX0NPTlRSQUNUOgotCQkJCXJldHVybiBUWVBFX09GX0NPTlRSQUNUX0VERUZBVUxUID09IG51bGwgPyB0eXBlT2ZDb250cmFjdCAhPSBudWxsIDogIVRZUEVfT0ZfQ09OVFJBQ1RfRURFRkFVTFQuZXF1YWxzKHR5cGVPZkNvbnRyYWN0KTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHNjYWxlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChzY2FsZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcHJvamVjdENoYXJhY3RlcmlzdGljczogIik7Ci0JCXJlc3VsdC5hcHBlbmQocHJvamVjdENoYXJhY3RlcmlzdGljcyk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcmlza0xldmVsOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChyaXNrTGV2ZWwpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGVzdGltYXRpbmdUZWNobmlxdWU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGVzdGltYXRpbmdUZWNobmlxdWUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHByb2plY3RNZW1iZXJFeHBlcnRpc2U6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHByb2plY3RNZW1iZXJFeHBlcnRpc2UpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHR5cGVPZkNvbnRyYWN0OiAiKTsKLQkJcmVzdWx0LmFwcGVuZCh0eXBlT2ZDb250cmFjdCk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uSW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0RlbGl2ZXJ5UHJvY2Vzc0ltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0RlbGl2ZXJ5UHJvY2Vzc0ltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGM1ZmYzZi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9EZWxpdmVyeVByb2Nlc3NJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDcgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBEZWxpdmVyeVByb2Nlc3NJbXBsLmphdmEsdiAxLjIgMjAwOC8wMS8zMCAwMDo0MTo0NyBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5CYXNpY0ZlYXR1cmVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlbGl2ZXJ5UHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RGVsaXZlcnkgUHJvY2VzczwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5EZWxpdmVyeVByb2Nlc3NJbXBsI2dldEdyb3VwNCA8ZW0+R3JvdXA0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkRlbGl2ZXJ5UHJvY2Vzc0ltcGwjZ2V0Q29tbXVuaWNhdGlvbnNNYXRlcmlhbCA8ZW0+Q29tbXVuaWNhdGlvbnMgTWF0ZXJpYWw8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuRGVsaXZlcnlQcm9jZXNzSW1wbCNnZXRFZHVjYXRpb25NYXRlcmlhbCA8ZW0+RWR1Y2F0aW9uIE1hdGVyaWFsPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRGVsaXZlcnlQcm9jZXNzSW1wbCBleHRlbmRzIFByb2Nlc3NJbXBsIGltcGxlbWVudHMgRGVsaXZlcnlQcm9jZXNzIHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRHcm91cDQoKSA8ZW0+R3JvdXA0PC9lbT59JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEdyb3VwNCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEZlYXR1cmVNYXAgZ3JvdXA0OwotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBEZWxpdmVyeVByb2Nlc3NJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5ERUxJVkVSWV9QUk9DRVNTOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBGZWF0dXJlTWFwIGdldEdyb3VwNCgpIHsKLQkJaWYgKGdyb3VwNCA9PSBudWxsKSB7Ci0JCQlncm91cDQgPSBuZXcgQmFzaWNGZWF0dXJlTWFwKHRoaXMsIFVtYVBhY2thZ2UuREVMSVZFUllfUFJPQ0VTU19fR1JPVVA0KTsKLQkJfQotCQlyZXR1cm4gZ3JvdXA0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxTdHJpbmc+IGdldENvbW11bmljYXRpb25zTWF0ZXJpYWwoKSB7Ci0JCXJldHVybiBnZXRHcm91cDQoKS5saXN0KFVtYVBhY2thZ2UuTGl0ZXJhbHMuREVMSVZFUllfUFJPQ0VTU19fQ09NTVVOSUNBVElPTlNfTUFURVJJQUwpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxTdHJpbmc+IGdldEVkdWNhdGlvbk1hdGVyaWFsKCkgewotCQlyZXR1cm4gZ2V0R3JvdXA0KCkubGlzdChVbWFQYWNrYWdlLkxpdGVyYWxzLkRFTElWRVJZX1BST0NFU1NfX0VEVUNBVElPTl9NQVRFUklBTCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJZX1BST0NFU1NfX0dST1VQNDoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldEdyb3VwNCgpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSWV9QUk9DRVNTX19HUk9VUDQ6Ci0JCQkJaWYgKGNvcmVUeXBlKSByZXR1cm4gZ2V0R3JvdXA0KCk7Ci0JCQkJcmV0dXJuICgoRmVhdHVyZU1hcC5JbnRlcm5hbClnZXRHcm91cDQoKSkuZ2V0V3JhcHBlcigpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJZX1BST0NFU1NfX0NPTU1VTklDQVRJT05TX01BVEVSSUFMOgotCQkJCXJldHVybiBnZXRDb21tdW5pY2F0aW9uc01hdGVyaWFsKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUllfUFJPQ0VTU19fRURVQ0FUSU9OX01BVEVSSUFMOgotCQkJCXJldHVybiBnZXRFZHVjYXRpb25NYXRlcmlhbCgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJZX1BST0NFU1NfX0dST1VQNDoKLQkJCQkoKEZlYXR1cmVNYXAuSW50ZXJuYWwpZ2V0R3JvdXA0KCkpLnNldChuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJZX1BST0NFU1NfX0NPTU1VTklDQVRJT05TX01BVEVSSUFMOgotCQkJCWdldENvbW11bmljYXRpb25zTWF0ZXJpYWwoKS5jbGVhcigpOwotCQkJCWdldENvbW11bmljYXRpb25zTWF0ZXJpYWwoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFN0cmluZz4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSWV9QUk9DRVNTX19FRFVDQVRJT05fTUFURVJJQUw6Ci0JCQkJZ2V0RWR1Y2F0aW9uTWF0ZXJpYWwoKS5jbGVhcigpOwotCQkJCWdldEVkdWNhdGlvbk1hdGVyaWFsKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBTdHJpbmc+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJZX1BST0NFU1NfX0dST1VQNDoKLQkJCQlnZXRHcm91cDQoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSWV9QUk9DRVNTX19DT01NVU5JQ0FUSU9OU19NQVRFUklBTDoKLQkJCQlnZXRDb21tdW5pY2F0aW9uc01hdGVyaWFsKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUllfUFJPQ0VTU19fRURVQ0FUSU9OX01BVEVSSUFMOgotCQkJCWdldEVkdWNhdGlvbk1hdGVyaWFsKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSWV9QUk9DRVNTX19HUk9VUDQ6Ci0JCQkJcmV0dXJuIGdyb3VwNCAhPSBudWxsICYmICFncm91cDQuaXNFbXB0eSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJZX1BST0NFU1NfX0NPTU1VTklDQVRJT05TX01BVEVSSUFMOgotCQkJCXJldHVybiAhZ2V0Q29tbXVuaWNhdGlvbnNNYXRlcmlhbCgpLmlzRW1wdHkoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSWV9QUk9DRVNTX19FRFVDQVRJT05fTUFURVJJQUw6Ci0JCQkJcmV0dXJuICFnZXRFZHVjYXRpb25NYXRlcmlhbCgpLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGdyb3VwNDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZ3JvdXA0KTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vRGVsaXZlcnlQcm9jZXNzSW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0Rlc2NyaWJhYmxlRWxlbWVudEltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0Rlc2NyaWJhYmxlRWxlbWVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjEzNzBjMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9EZXNjcmliYWJsZUVsZW1lbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MjYgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBEZXNjcmliYWJsZUVsZW1lbnRJbXBsLmphdmEsdiAxLjIgMjAwOC8wMS8zMCAwMDo0MTo0NyBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVEYXRhVHlwZUVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZXNjcmliYWJsZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkRlc2NyaWJhYmxlIEVsZW1lbnQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuRGVzY3JpYmFibGVFbGVtZW50SW1wbCNnZXRQcmVzZW50YXRpb24gPGVtPlByZXNlbnRhdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5EZXNjcmliYWJsZUVsZW1lbnRJbXBsI2dldEZ1bGZpbGwgPGVtPkZ1bGZpbGw8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuRGVzY3JpYmFibGVFbGVtZW50SW1wbCNpc0lzQWJzdHJhY3QgPGVtPklzIEFic3RyYWN0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkRlc2NyaWJhYmxlRWxlbWVudEltcGwjZ2V0Tm9kZWljb24gPGVtPk5vZGVpY29uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkRlc2NyaWJhYmxlRWxlbWVudEltcGwjZ2V0U2hhcGVpY29uIDxlbT5TaGFwZWljb248L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEZXNjcmliYWJsZUVsZW1lbnRJbXBsIGV4dGVuZHMgTWV0aG9kRWxlbWVudEltcGwgaW1wbGVtZW50cyBEZXNjcmliYWJsZUVsZW1lbnQgewotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByZXNlbnRhdGlvbigpIDxlbT5QcmVzZW50YXRpb248L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFByZXNlbnRhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIENvbnRlbnREZXNjcmlwdGlvbiBwcmVzZW50YXRpb247Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRGdWxmaWxsKCkgPGVtPkZ1bGZpbGw8L2VtPn0nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RnVsZmlsbCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PFN0cmluZz4gZnVsZmlsbDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0lzQWJzdHJhY3QoKSA8ZW0+SXMgQWJzdHJhY3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzSXNBYnN0cmFjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIElTX0FCU1RSQUNUX0VERUZBVUxUID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0lzQWJzdHJhY3QoKSA8ZW0+SXMgQWJzdHJhY3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzSXNBYnN0cmFjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNBYnN0cmFjdCA9IElTX0FCU1RSQUNUX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBJcyBBYnN0cmFjdCBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNBYnN0cmFjdEVTZXQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Tm9kZWljb24oKSA8ZW0+Tm9kZWljb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE5vZGVpY29uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBOT0RFSUNPTl9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROb2RlaWNvbigpIDxlbT5Ob2RlaWNvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Tm9kZWljb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgbm9kZWljb24gPSBOT0RFSUNPTl9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTaGFwZWljb24oKSA8ZW0+U2hhcGVpY29uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTaGFwZWljb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFNIQVBFSUNPTl9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTaGFwZWljb24oKSA8ZW0+U2hhcGVpY29uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTaGFwZWljb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgc2hhcGVpY29uID0gU0hBUEVJQ09OX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIERlc2NyaWJhYmxlRWxlbWVudEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLkRFU0NSSUJBQkxFX0VMRU1FTlQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENvbnRlbnREZXNjcmlwdGlvbiBnZXRQcmVzZW50YXRpb24oKSB7Ci0JCXJldHVybiBwcmVzZW50YXRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0UHJlc2VudGF0aW9uKENvbnRlbnREZXNjcmlwdGlvbiBuZXdQcmVzZW50YXRpb24sIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJQ29udGVudERlc2NyaXB0aW9uIG9sZFByZXNlbnRhdGlvbiA9IHByZXNlbnRhdGlvbjsKLQkJcHJlc2VudGF0aW9uID0gbmV3UHJlc2VudGF0aW9uOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLkRFU0NSSUJBQkxFX0VMRU1FTlRfX1BSRVNFTlRBVElPTiwgb2xkUHJlc2VudGF0aW9uLCBuZXdQcmVzZW50YXRpb24pOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFByZXNlbnRhdGlvbihDb250ZW50RGVzY3JpcHRpb24gbmV3UHJlc2VudGF0aW9uKSB7Ci0JCWlmIChuZXdQcmVzZW50YXRpb24gIT0gcHJlc2VudGF0aW9uKSB7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChwcmVzZW50YXRpb24gIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpcHJlc2VudGF0aW9uKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gVW1hUGFja2FnZS5ERVNDUklCQUJMRV9FTEVNRU5UX19QUkVTRU5UQVRJT04sIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld1ByZXNlbnRhdGlvbiAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdQcmVzZW50YXRpb24pLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBVbWFQYWNrYWdlLkRFU0NSSUJBQkxFX0VMRU1FTlRfX1BSRVNFTlRBVElPTiwgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRQcmVzZW50YXRpb24obmV3UHJlc2VudGF0aW9uLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuREVTQ1JJQkFCTEVfRUxFTUVOVF9fUFJFU0VOVEFUSU9OLCBuZXdQcmVzZW50YXRpb24sIG5ld1ByZXNlbnRhdGlvbikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxTdHJpbmc+IGdldEZ1bGZpbGwoKSB7Ci0JCWlmIChmdWxmaWxsID09IG51bGwpIHsKLQkJCWZ1bGZpbGwgPSBuZXcgRURhdGFUeXBlRUxpc3Q8U3RyaW5nPihTdHJpbmcuY2xhc3MsIHRoaXMsIFVtYVBhY2thZ2UuREVTQ1JJQkFCTEVfRUxFTUVOVF9fRlVMRklMTCk7Ci0JCX0KLQkJcmV0dXJuIGZ1bGZpbGw7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNJc0Fic3RyYWN0KCkgewotCQlyZXR1cm4gaXNBYnN0cmFjdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJc0Fic3RyYWN0KGJvb2xlYW4gbmV3SXNBYnN0cmFjdCkgewotCQlib29sZWFuIG9sZElzQWJzdHJhY3QgPSBpc0Fic3RyYWN0OwotCQlpc0Fic3RyYWN0ID0gbmV3SXNBYnN0cmFjdDsKLQkJYm9vbGVhbiBvbGRJc0Fic3RyYWN0RVNldCA9IGlzQWJzdHJhY3RFU2V0OwotCQlpc0Fic3RyYWN0RVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuREVTQ1JJQkFCTEVfRUxFTUVOVF9fSVNfQUJTVFJBQ1QsIG9sZElzQWJzdHJhY3QsIGlzQWJzdHJhY3QsICFvbGRJc0Fic3RyYWN0RVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0SXNBYnN0cmFjdCgpIHsKLQkJYm9vbGVhbiBvbGRJc0Fic3RyYWN0ID0gaXNBYnN0cmFjdDsKLQkJYm9vbGVhbiBvbGRJc0Fic3RyYWN0RVNldCA9IGlzQWJzdHJhY3RFU2V0OwotCQlpc0Fic3RyYWN0ID0gSVNfQUJTVFJBQ1RfRURFRkFVTFQ7Ci0JCWlzQWJzdHJhY3RFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgVW1hUGFja2FnZS5ERVNDUklCQUJMRV9FTEVNRU5UX19JU19BQlNUUkFDVCwgb2xkSXNBYnN0cmFjdCwgSVNfQUJTVFJBQ1RfRURFRkFVTFQsIG9sZElzQWJzdHJhY3RFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRJc0Fic3RyYWN0KCkgewotCQlyZXR1cm4gaXNBYnN0cmFjdEVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROb2RlaWNvbigpIHsKLQkJcmV0dXJuIG5vZGVpY29uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE5vZGVpY29uKFN0cmluZyBuZXdOb2RlaWNvbikgewotCQlTdHJpbmcgb2xkTm9kZWljb24gPSBub2RlaWNvbjsKLQkJbm9kZWljb24gPSBuZXdOb2RlaWNvbjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5ERVNDUklCQUJMRV9FTEVNRU5UX19OT0RFSUNPTiwgb2xkTm9kZWljb24sIG5vZGVpY29uKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTaGFwZWljb24oKSB7Ci0JCXJldHVybiBzaGFwZWljb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2hhcGVpY29uKFN0cmluZyBuZXdTaGFwZWljb24pIHsKLQkJU3RyaW5nIG9sZFNoYXBlaWNvbiA9IHNoYXBlaWNvbjsKLQkJc2hhcGVpY29uID0gbmV3U2hhcGVpY29uOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLkRFU0NSSUJBQkxFX0VMRU1FTlRfX1NIQVBFSUNPTiwgb2xkU2hhcGVpY29uLCBzaGFwZWljb24pKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuREVTQ1JJQkFCTEVfRUxFTUVOVF9fUFJFU0VOVEFUSU9OOgotCQkJCXJldHVybiBiYXNpY1NldFByZXNlbnRhdGlvbihudWxsLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkRFU0NSSUJBQkxFX0VMRU1FTlRfX1BSRVNFTlRBVElPTjoKLQkJCQlyZXR1cm4gZ2V0UHJlc2VudGF0aW9uKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuREVTQ1JJQkFCTEVfRUxFTUVOVF9fRlVMRklMTDoKLQkJCQlyZXR1cm4gZ2V0RnVsZmlsbCgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRFU0NSSUJBQkxFX0VMRU1FTlRfX0lTX0FCU1RSQUNUOgotCQkJCXJldHVybiBpc0lzQWJzdHJhY3QoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIFVtYVBhY2thZ2UuREVTQ1JJQkFCTEVfRUxFTUVOVF9fTk9ERUlDT046Ci0JCQkJcmV0dXJuIGdldE5vZGVpY29uKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuREVTQ1JJQkFCTEVfRUxFTUVOVF9fU0hBUEVJQ09OOgotCQkJCXJldHVybiBnZXRTaGFwZWljb24oKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5ERVNDUklCQUJMRV9FTEVNRU5UX19QUkVTRU5UQVRJT046Ci0JCQkJc2V0UHJlc2VudGF0aW9uKChDb250ZW50RGVzY3JpcHRpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5ERVNDUklCQUJMRV9FTEVNRU5UX19GVUxGSUxMOgotCQkJCWdldEZ1bGZpbGwoKS5jbGVhcigpOwotCQkJCWdldEZ1bGZpbGwoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFN0cmluZz4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5ERVNDUklCQUJMRV9FTEVNRU5UX19JU19BQlNUUkFDVDoKLQkJCQlzZXRJc0Fic3RyYWN0KCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5ERVNDUklCQUJMRV9FTEVNRU5UX19OT0RFSUNPTjoKLQkJCQlzZXROb2RlaWNvbigoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuREVTQ1JJQkFCTEVfRUxFTUVOVF9fU0hBUEVJQ09OOgotCQkJCXNldFNoYXBlaWNvbigoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkRFU0NSSUJBQkxFX0VMRU1FTlRfX1BSRVNFTlRBVElPTjoKLQkJCQlzZXRQcmVzZW50YXRpb24oKENvbnRlbnREZXNjcmlwdGlvbiludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuREVTQ1JJQkFCTEVfRUxFTUVOVF9fRlVMRklMTDoKLQkJCQlnZXRGdWxmaWxsKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuREVTQ1JJQkFCTEVfRUxFTUVOVF9fSVNfQUJTVFJBQ1Q6Ci0JCQkJdW5zZXRJc0Fic3RyYWN0KCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRFU0NSSUJBQkxFX0VMRU1FTlRfX05PREVJQ09OOgotCQkJCXNldE5vZGVpY29uKE5PREVJQ09OX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuREVTQ1JJQkFCTEVfRUxFTUVOVF9fU0hBUEVJQ09OOgotCQkJCXNldFNoYXBlaWNvbihTSEFQRUlDT05fRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkRFU0NSSUJBQkxFX0VMRU1FTlRfX1BSRVNFTlRBVElPTjoKLQkJCQlyZXR1cm4gcHJlc2VudGF0aW9uICE9IG51bGw7Ci0JCQljYXNlIFVtYVBhY2thZ2UuREVTQ1JJQkFCTEVfRUxFTUVOVF9fRlVMRklMTDoKLQkJCQlyZXR1cm4gZnVsZmlsbCAhPSBudWxsICYmICFmdWxmaWxsLmlzRW1wdHkoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5ERVNDUklCQUJMRV9FTEVNRU5UX19JU19BQlNUUkFDVDoKLQkJCQlyZXR1cm4gaXNTZXRJc0Fic3RyYWN0KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuREVTQ1JJQkFCTEVfRUxFTUVOVF9fTk9ERUlDT046Ci0JCQkJcmV0dXJuIE5PREVJQ09OX0VERUZBVUxUID09IG51bGwgPyBub2RlaWNvbiAhPSBudWxsIDogIU5PREVJQ09OX0VERUZBVUxULmVxdWFscyhub2RlaWNvbik7Ci0JCQljYXNlIFVtYVBhY2thZ2UuREVTQ1JJQkFCTEVfRUxFTUVOVF9fU0hBUEVJQ09OOgotCQkJCXJldHVybiBTSEFQRUlDT05fRURFRkFVTFQgPT0gbnVsbCA/IHNoYXBlaWNvbiAhPSBudWxsIDogIVNIQVBFSUNPTl9FREVGQVVMVC5lcXVhbHMoc2hhcGVpY29uKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGZ1bGZpbGw6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGZ1bGZpbGwpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGlzQWJzdHJhY3Q6ICIpOwotCQlpZiAoaXNBYnN0cmFjdEVTZXQpIHJlc3VsdC5hcHBlbmQoaXNBYnN0cmFjdCk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIG5vZGVpY29uOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChub2RlaWNvbik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgc2hhcGVpY29uOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChzaGFwZWljb24pOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9EZXNjcmliYWJsZUVsZW1lbnRJbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvRGVzY3JpcHRvckRlc2NyaXB0aW9uSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvRGVzY3JpcHRvckRlc2NyaXB0aW9uSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZDVlODMxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0Rlc2NyaXB0b3JEZXNjcmlwdGlvbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MyArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IERlc2NyaXB0b3JEZXNjcmlwdGlvbkltcGwuamF2YSx2IDEuMiAyMDA4LzAxLzMwIDAwOjQxOjQ3IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVzY3JpcHRvckRlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5EZXNjcmlwdG9yIERlc2NyaXB0aW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkRlc2NyaXB0b3JEZXNjcmlwdGlvbkltcGwjZ2V0UmVmaW5lZERlc2NyaXB0aW9uIDxlbT5SZWZpbmVkIERlc2NyaXB0aW9uPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRGVzY3JpcHRvckRlc2NyaXB0aW9uSW1wbCBleHRlbmRzIEJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbkltcGwgaW1wbGVtZW50cyBEZXNjcmlwdG9yRGVzY3JpcHRpb24gewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZWZpbmVkRGVzY3JpcHRpb24oKSA8ZW0+UmVmaW5lZCBEZXNjcmlwdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmVmaW5lZERlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBSRUZJTkVEX0RFU0NSSVBUSU9OX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlZmluZWREZXNjcmlwdGlvbigpIDxlbT5SZWZpbmVkIERlc2NyaXB0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZWZpbmVkRGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgcmVmaW5lZERlc2NyaXB0aW9uID0gUkVGSU5FRF9ERVNDUklQVElPTl9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBEZXNjcmlwdG9yRGVzY3JpcHRpb25JbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5ERVNDUklQVE9SX0RFU0NSSVBUSU9OOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UmVmaW5lZERlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gcmVmaW5lZERlc2NyaXB0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlZmluZWREZXNjcmlwdGlvbihTdHJpbmcgbmV3UmVmaW5lZERlc2NyaXB0aW9uKSB7Ci0JCVN0cmluZyBvbGRSZWZpbmVkRGVzY3JpcHRpb24gPSByZWZpbmVkRGVzY3JpcHRpb247Ci0JCXJlZmluZWREZXNjcmlwdGlvbiA9IG5ld1JlZmluZWREZXNjcmlwdGlvbjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5ERVNDUklQVE9SX0RFU0NSSVBUSU9OX19SRUZJTkVEX0RFU0NSSVBUSU9OLCBvbGRSZWZpbmVkRGVzY3JpcHRpb24sIHJlZmluZWREZXNjcmlwdGlvbikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5ERVNDUklQVE9SX0RFU0NSSVBUSU9OX19SRUZJTkVEX0RFU0NSSVBUSU9OOgotCQkJCXJldHVybiBnZXRSZWZpbmVkRGVzY3JpcHRpb24oKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkRFU0NSSVBUT1JfREVTQ1JJUFRJT05fX1JFRklORURfREVTQ1JJUFRJT046Ci0JCQkJc2V0UmVmaW5lZERlc2NyaXB0aW9uKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuREVTQ1JJUFRPUl9ERVNDUklQVElPTl9fUkVGSU5FRF9ERVNDUklQVElPTjoKLQkJCQlzZXRSZWZpbmVkRGVzY3JpcHRpb24oUkVGSU5FRF9ERVNDUklQVElPTl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuREVTQ1JJUFRPUl9ERVNDUklQVElPTl9fUkVGSU5FRF9ERVNDUklQVElPTjoKLQkJCQlyZXR1cm4gUkVGSU5FRF9ERVNDUklQVElPTl9FREVGQVVMVCA9PSBudWxsID8gcmVmaW5lZERlc2NyaXB0aW9uICE9IG51bGwgOiAhUkVGSU5FRF9ERVNDUklQVElPTl9FREVGQVVMVC5lcXVhbHMocmVmaW5lZERlc2NyaXB0aW9uKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHJlZmluZWREZXNjcmlwdGlvbjogIik7Ci0JCXJlc3VsdC5hcHBlbmQocmVmaW5lZERlc2NyaXB0aW9uKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vRGVzY3JpcHRvckRlc2NyaXB0aW9uSW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0Rlc2NyaXB0b3JJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9EZXNjcmlwdG9ySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNGI0NzI5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0Rlc2NyaXB0b3JJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTcgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBEZXNjcmlwdG9ySW1wbC5qYXZhLHYgMS4yIDIwMDgvMDEvMzAgMDA6NDE6NDcga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5EZXNjcmlwdG9yPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkRlc2NyaXB0b3JJbXBsI2lzSXNTeW5jaHJvbml6ZWRXaXRoU291cmNlIDxlbT5JcyBTeW5jaHJvbml6ZWQgV2l0aCBTb3VyY2U8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEZXNjcmlwdG9ySW1wbCBleHRlbmRzIEJyZWFrZG93bkVsZW1lbnRJbXBsIGltcGxlbWVudHMgRGVzY3JpcHRvciB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzSXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKCkgPGVtPklzIFN5bmNocm9uaXplZCBXaXRoIFNvdXJjZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBJU19TWU5DSFJPTklaRURfV0lUSF9TT1VSQ0VfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzSXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKCkgPGVtPklzIFN5bmNocm9uaXplZCBXaXRoIFNvdXJjZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZSA9IElTX1NZTkNIUk9OSVpFRF9XSVRIX1NPVVJDRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgSXMgU3luY2hyb25pemVkIFdpdGggU291cmNlIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2VFU2V0OwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIERlc2NyaXB0b3JJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5ERVNDUklQVE9SOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzSXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKCkgewotCQlyZXR1cm4gaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldElzU3luY2hyb25pemVkV2l0aFNvdXJjZShib29sZWFuIG5ld0lzU3luY2hyb25pemVkV2l0aFNvdXJjZSkgewotCQlib29sZWFuIG9sZElzU3luY2hyb25pemVkV2l0aFNvdXJjZSA9IGlzU3luY2hyb25pemVkV2l0aFNvdXJjZTsKLQkJaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlID0gbmV3SXNTeW5jaHJvbml6ZWRXaXRoU291cmNlOwotCQlib29sZWFuIG9sZElzU3luY2hyb25pemVkV2l0aFNvdXJjZUVTZXQgPSBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2VFU2V0OwotCQlpc1N5bmNocm9uaXplZFdpdGhTb3VyY2VFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5ERVNDUklQVE9SX19JU19TWU5DSFJPTklaRURfV0lUSF9TT1VSQ0UsIG9sZElzU3luY2hyb25pemVkV2l0aFNvdXJjZSwgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlLCAhb2xkSXNTeW5jaHJvbml6ZWRXaXRoU291cmNlRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0SXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKCkgewotCQlib29sZWFuIG9sZElzU3luY2hyb25pemVkV2l0aFNvdXJjZSA9IGlzU3luY2hyb25pemVkV2l0aFNvdXJjZTsKLQkJYm9vbGVhbiBvbGRJc1N5bmNocm9uaXplZFdpdGhTb3VyY2VFU2V0ID0gaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlRVNldDsKLQkJaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlID0gSVNfU1lOQ0hST05JWkVEX1dJVEhfU09VUkNFX0VERUZBVUxUOwotCQlpc1N5bmNocm9uaXplZFdpdGhTb3VyY2VFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgVW1hUGFja2FnZS5ERVNDUklQVE9SX19JU19TWU5DSFJPTklaRURfV0lUSF9TT1VSQ0UsIG9sZElzU3luY2hyb25pemVkV2l0aFNvdXJjZSwgSVNfU1lOQ0hST05JWkVEX1dJVEhfU09VUkNFX0VERUZBVUxULCBvbGRJc1N5bmNocm9uaXplZFdpdGhTb3VyY2VFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UoKSB7Ci0JCXJldHVybiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2VFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5ERVNDUklQVE9SX19JU19TWU5DSFJPTklaRURfV0lUSF9TT1VSQ0U6Ci0JCQkJcmV0dXJuIGlzSXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuREVTQ1JJUFRPUl9fSVNfU1lOQ0hST05JWkVEX1dJVEhfU09VUkNFOgotCQkJCXNldElzU3luY2hyb25pemVkV2l0aFNvdXJjZSgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkRFU0NSSVBUT1JfX0lTX1NZTkNIUk9OSVpFRF9XSVRIX1NPVVJDRToKLQkJCQl1bnNldElzU3luY2hyb25pemVkV2l0aFNvdXJjZSgpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkRFU0NSSVBUT1JfX0lTX1NZTkNIUk9OSVpFRF9XSVRIX1NPVVJDRToKLQkJCQlyZXR1cm4gaXNTZXRJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGlzU3luY2hyb25pemVkV2l0aFNvdXJjZTogIik7Ci0JCWlmIChpc1N5bmNocm9uaXplZFdpdGhTb3VyY2VFU2V0KSByZXN1bHQuYXBwZW5kKGlzU3luY2hyb25pemVkV2l0aFNvdXJjZSk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9EZXNjcmlwdG9ySW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0Rpc2NpcGxpbmVHcm91cGluZ0ltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0Rpc2NpcGxpbmVHcm91cGluZ0ltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmQ4ODVhOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9EaXNjaXBsaW5lR3JvdXBpbmdJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODcgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBEaXNjaXBsaW5lR3JvdXBpbmdJbXBsLmphdmEsdiAxLjIgMjAwOC8wMS8zMCAwMDo0MTo0NyBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5CYXNpY0ZlYXR1cmVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRpc2NpcGxpbmVHcm91cGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RGlzY2lwbGluZSBHcm91cGluZzwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5EaXNjaXBsaW5lR3JvdXBpbmdJbXBsI2dldEdyb3VwMiA8ZW0+R3JvdXAyPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkRpc2NpcGxpbmVHcm91cGluZ0ltcGwjZ2V0RGlzY2lwbGluZSA8ZW0+RGlzY2lwbGluZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERpc2NpcGxpbmVHcm91cGluZ0ltcGwgZXh0ZW5kcyBDb250ZW50Q2F0ZWdvcnlJbXBsIGltcGxlbWVudHMgRGlzY2lwbGluZUdyb3VwaW5nIHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRHcm91cDIoKSA8ZW0+R3JvdXAyPC9lbT59JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEdyb3VwMigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEZlYXR1cmVNYXAgZ3JvdXAyOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIERpc2NpcGxpbmVHcm91cGluZ0ltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLkRJU0NJUExJTkVfR1JPVVBJTkc7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEZlYXR1cmVNYXAgZ2V0R3JvdXAyKCkgewotCQlpZiAoZ3JvdXAyID09IG51bGwpIHsKLQkJCWdyb3VwMiA9IG5ldyBCYXNpY0ZlYXR1cmVNYXAodGhpcywgVW1hUGFja2FnZS5ESVNDSVBMSU5FX0dST1VQSU5HX19HUk9VUDIpOwotCQl9Ci0JCXJldHVybiBncm91cDI7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFN0cmluZz4gZ2V0RGlzY2lwbGluZSgpIHsKLQkJcmV0dXJuIGdldEdyb3VwMigpLmxpc3QoVW1hUGFja2FnZS5MaXRlcmFscy5ESVNDSVBMSU5FX0dST1VQSU5HX19ESVNDSVBMSU5FKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuRElTQ0lQTElORV9HUk9VUElOR19fR1JPVVAyOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0R3JvdXAyKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkRJU0NJUExJTkVfR1JPVVBJTkdfX0dST1VQMjoKLQkJCQlpZiAoY29yZVR5cGUpIHJldHVybiBnZXRHcm91cDIoKTsKLQkJCQlyZXR1cm4gKChGZWF0dXJlTWFwLkludGVybmFsKWdldEdyb3VwMigpKS5nZXRXcmFwcGVyKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuRElTQ0lQTElORV9HUk9VUElOR19fRElTQ0lQTElORToKLQkJCQlyZXR1cm4gZ2V0RGlzY2lwbGluZSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkRJU0NJUExJTkVfR1JPVVBJTkdfX0dST1VQMjoKLQkJCQkoKEZlYXR1cmVNYXAuSW50ZXJuYWwpZ2V0R3JvdXAyKCkpLnNldChuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRJU0NJUExJTkVfR1JPVVBJTkdfX0RJU0NJUExJTkU6Ci0JCQkJZ2V0RGlzY2lwbGluZSgpLmNsZWFyKCk7Ci0JCQkJZ2V0RGlzY2lwbGluZSgpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgU3RyaW5nPiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5ESVNDSVBMSU5FX0dST1VQSU5HX19HUk9VUDI6Ci0JCQkJZ2V0R3JvdXAyKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuRElTQ0lQTElORV9HUk9VUElOR19fRElTQ0lQTElORToKLQkJCQlnZXREaXNjaXBsaW5lKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5ESVNDSVBMSU5FX0dST1VQSU5HX19HUk9VUDI6Ci0JCQkJcmV0dXJuIGdyb3VwMiAhPSBudWxsICYmICFncm91cDIuaXNFbXB0eSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRJU0NJUExJTkVfR1JPVVBJTkdfX0RJU0NJUExJTkU6Ci0JCQkJcmV0dXJuICFnZXREaXNjaXBsaW5lKCkuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoZ3JvdXAyOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChncm91cDIpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9EaXNjaXBsaW5lR3JvdXBpbmdJbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvRGlzY2lwbGluZUltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0Rpc2NpcGxpbmVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4MzE2ODUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvRGlzY2lwbGluZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzMSArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IERpc2NpcGxpbmVJbXBsLmphdmEsdiAxLjIgMjAwOC8wMS8zMCAwMDo0MTo0NyBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5CYXNpY0ZlYXR1cmVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRpc2NpcGxpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkRpc2NpcGxpbmU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuRGlzY2lwbGluZUltcGwjZ2V0R3JvdXAyIDxlbT5Hcm91cDI8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuRGlzY2lwbGluZUltcGwjZ2V0VGFzayA8ZW0+VGFzazwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5EaXNjaXBsaW5lSW1wbCNnZXRTdWJEaXNjaXBsaW5lIDxlbT5TdWIgRGlzY2lwbGluZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5EaXNjaXBsaW5lSW1wbCNnZXRSZWZlcmVuY2VXb3JrZmxvdyA8ZW0+UmVmZXJlbmNlIFdvcmtmbG93PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRGlzY2lwbGluZUltcGwgZXh0ZW5kcyBDb250ZW50Q2F0ZWdvcnlJbXBsIGltcGxlbWVudHMgRGlzY2lwbGluZSB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0R3JvdXAyKCkgPGVtPkdyb3VwMjwvZW0+fScgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRHcm91cDIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBGZWF0dXJlTWFwIGdyb3VwMjsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBEaXNjaXBsaW5lSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuRElTQ0lQTElORTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRmVhdHVyZU1hcCBnZXRHcm91cDIoKSB7Ci0JCWlmIChncm91cDIgPT0gbnVsbCkgewotCQkJZ3JvdXAyID0gbmV3IEJhc2ljRmVhdHVyZU1hcCh0aGlzLCBVbWFQYWNrYWdlLkRJU0NJUExJTkVfX0dST1VQMik7Ci0JCX0KLQkJcmV0dXJuIGdyb3VwMjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8U3RyaW5nPiBnZXRUYXNrKCkgewotCQlyZXR1cm4gZ2V0R3JvdXAyKCkubGlzdChVbWFQYWNrYWdlLkxpdGVyYWxzLkRJU0NJUExJTkVfX1RBU0spOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxEaXNjaXBsaW5lPiBnZXRTdWJEaXNjaXBsaW5lKCkgewotCQlyZXR1cm4gZ2V0R3JvdXAyKCkubGlzdChVbWFQYWNrYWdlLkxpdGVyYWxzLkRJU0NJUExJTkVfX1NVQl9ESVNDSVBMSU5FKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8U3RyaW5nPiBnZXRSZWZlcmVuY2VXb3JrZmxvdygpIHsKLQkJcmV0dXJuIGdldEdyb3VwMigpLmxpc3QoVW1hUGFja2FnZS5MaXRlcmFscy5ESVNDSVBMSU5FX19SRUZFUkVOQ0VfV09SS0ZMT1cpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5ESVNDSVBMSU5FX19HUk9VUDI6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRHcm91cDIoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRJU0NJUExJTkVfX1NVQl9ESVNDSVBMSU5FOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0U3ViRGlzY2lwbGluZSgpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5ESVNDSVBMSU5FX19HUk9VUDI6Ci0JCQkJaWYgKGNvcmVUeXBlKSByZXR1cm4gZ2V0R3JvdXAyKCk7Ci0JCQkJcmV0dXJuICgoRmVhdHVyZU1hcC5JbnRlcm5hbClnZXRHcm91cDIoKSkuZ2V0V3JhcHBlcigpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRJU0NJUExJTkVfX1RBU0s6Ci0JCQkJcmV0dXJuIGdldFRhc2soKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5ESVNDSVBMSU5FX19TVUJfRElTQ0lQTElORToKLQkJCQlyZXR1cm4gZ2V0U3ViRGlzY2lwbGluZSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRJU0NJUExJTkVfX1JFRkVSRU5DRV9XT1JLRkxPVzoKLQkJCQlyZXR1cm4gZ2V0UmVmZXJlbmNlV29ya2Zsb3coKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5ESVNDSVBMSU5FX19HUk9VUDI6Ci0JCQkJKChGZWF0dXJlTWFwLkludGVybmFsKWdldEdyb3VwMigpKS5zZXQobmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5ESVNDSVBMSU5FX19UQVNLOgotCQkJCWdldFRhc2soKS5jbGVhcigpOwotCQkJCWdldFRhc2soKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFN0cmluZz4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5ESVNDSVBMSU5FX19TVUJfRElTQ0lQTElORToKLQkJCQlnZXRTdWJEaXNjaXBsaW5lKCkuY2xlYXIoKTsKLQkJCQlnZXRTdWJEaXNjaXBsaW5lKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBEaXNjaXBsaW5lPiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRJU0NJUExJTkVfX1JFRkVSRU5DRV9XT1JLRkxPVzoKLQkJCQlnZXRSZWZlcmVuY2VXb3JrZmxvdygpLmNsZWFyKCk7Ci0JCQkJZ2V0UmVmZXJlbmNlV29ya2Zsb3coKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFN0cmluZz4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuRElTQ0lQTElORV9fR1JPVVAyOgotCQkJCWdldEdyb3VwMigpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRJU0NJUExJTkVfX1RBU0s6Ci0JCQkJZ2V0VGFzaygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRJU0NJUExJTkVfX1NVQl9ESVNDSVBMSU5FOgotCQkJCWdldFN1YkRpc2NpcGxpbmUoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5ESVNDSVBMSU5FX19SRUZFUkVOQ0VfV09SS0ZMT1c6Ci0JCQkJZ2V0UmVmZXJlbmNlV29ya2Zsb3coKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkRJU0NJUExJTkVfX0dST1VQMjoKLQkJCQlyZXR1cm4gZ3JvdXAyICE9IG51bGwgJiYgIWdyb3VwMi5pc0VtcHR5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuRElTQ0lQTElORV9fVEFTSzoKLQkJCQlyZXR1cm4gIWdldFRhc2soKS5pc0VtcHR5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuRElTQ0lQTElORV9fU1VCX0RJU0NJUExJTkU6Ci0JCQkJcmV0dXJuICFnZXRTdWJEaXNjaXBsaW5lKCkuaXNFbXB0eSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRJU0NJUExJTkVfX1JFRkVSRU5DRV9XT1JLRkxPVzoKLQkJCQlyZXR1cm4gIWdldFJlZmVyZW5jZVdvcmtmbG93KCkuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoZ3JvdXAyOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChncm91cDIpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9EaXNjaXBsaW5lSW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0RvY3VtZW50Um9vdEltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0RvY3VtZW50Um9vdEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDQ2MjFiNy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9Eb2N1bWVudFJvb3RJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNjMgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBEb2N1bWVudFJvb3RJbXBsLmphdmEsdiAxLjIgMjAwOC8wMS8zMCAwMDo0MTo0NyBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRWNvcmVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRVN0cmluZ1RvU3RyaW5nTWFwRW50cnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5zZG8uaW1wbC5FRGF0YU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuQmFzaWNGZWF0dXJlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlRU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRG9jdW1lbnRSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkRvY3VtZW50IFJvb3Q8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuRG9jdW1lbnRSb290SW1wbCNnZXRNaXhlZCA8ZW0+TWl4ZWQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuRG9jdW1lbnRSb290SW1wbCNnZXRYTUxOU1ByZWZpeE1hcCA8ZW0+WE1MTlMgUHJlZml4IE1hcDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Eb2N1bWVudFJvb3RJbXBsI2dldFhTSVNjaGVtYUxvY2F0aW9uIDxlbT5YU0kgU2NoZW1hIExvY2F0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkRvY3VtZW50Um9vdEltcGwjZ2V0TWV0aG9kQ29uZmlndXJhdGlvbiA8ZW0+TWV0aG9kIENvbmZpZ3VyYXRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuRG9jdW1lbnRSb290SW1wbCNnZXRNZXRob2RMaWJyYXJ5IDxlbT5NZXRob2QgTGlicmFyeTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Eb2N1bWVudFJvb3RJbXBsI2dldE1ldGhvZFBsdWdpbiA8ZW0+TWV0aG9kIFBsdWdpbjwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERvY3VtZW50Um9vdEltcGwgZXh0ZW5kcyBFRGF0YU9iamVjdEltcGwgaW1wbGVtZW50cyBEb2N1bWVudFJvb3QgewotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1peGVkKCkgPGVtPk1peGVkPC9lbT59JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE1peGVkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRmVhdHVyZU1hcCBtaXhlZDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFhNTE5TUHJlZml4TWFwKCkgPGVtPlhNTE5TIFByZWZpeCBNYXA8L2VtPn0nIG1hcC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFhNTE5TUHJlZml4TWFwKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRU1hcDxTdHJpbmcsIFN0cmluZz4geE1MTlNQcmVmaXhNYXA7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRYU0lTY2hlbWFMb2NhdGlvbigpIDxlbT5YU0kgU2NoZW1hIExvY2F0aW9uPC9lbT59JyBtYXAuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRYU0lTY2hlbWFMb2NhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVNYXA8U3RyaW5nLCBTdHJpbmc+IHhTSVNjaGVtYUxvY2F0aW9uOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIERvY3VtZW50Um9vdEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLkRPQ1VNRU5UX1JPT1Q7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEZlYXR1cmVNYXAgZ2V0TWl4ZWQoKSB7Ci0JCWlmIChtaXhlZCA9PSBudWxsKSB7Ci0JCQltaXhlZCA9IG5ldyBCYXNpY0ZlYXR1cmVNYXAodGhpcywgVW1hUGFja2FnZS5ET0NVTUVOVF9ST09UX19NSVhFRCk7Ci0JCX0KLQkJcmV0dXJuIG1peGVkOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTWFwPFN0cmluZywgU3RyaW5nPiBnZXRYTUxOU1ByZWZpeE1hcCgpIHsKLQkJaWYgKHhNTE5TUHJlZml4TWFwID09IG51bGwpIHsKLQkJCXhNTE5TUHJlZml4TWFwID0gbmV3IEVjb3JlRU1hcDxTdHJpbmcsU3RyaW5nPihFY29yZVBhY2thZ2UuTGl0ZXJhbHMuRVNUUklOR19UT19TVFJJTkdfTUFQX0VOVFJZLCBFU3RyaW5nVG9TdHJpbmdNYXBFbnRyeUltcGwuY2xhc3MsIHRoaXMsIFVtYVBhY2thZ2UuRE9DVU1FTlRfUk9PVF9fWE1MTlNfUFJFRklYX01BUCk7Ci0JCX0KLQkJcmV0dXJuIHhNTE5TUHJlZml4TWFwOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTWFwPFN0cmluZywgU3RyaW5nPiBnZXRYU0lTY2hlbWFMb2NhdGlvbigpIHsKLQkJaWYgKHhTSVNjaGVtYUxvY2F0aW9uID09IG51bGwpIHsKLQkJCXhTSVNjaGVtYUxvY2F0aW9uID0gbmV3IEVjb3JlRU1hcDxTdHJpbmcsU3RyaW5nPihFY29yZVBhY2thZ2UuTGl0ZXJhbHMuRVNUUklOR19UT19TVFJJTkdfTUFQX0VOVFJZLCBFU3RyaW5nVG9TdHJpbmdNYXBFbnRyeUltcGwuY2xhc3MsIHRoaXMsIFVtYVBhY2thZ2UuRE9DVU1FTlRfUk9PVF9fWFNJX1NDSEVNQV9MT0NBVElPTik7Ci0JCX0KLQkJcmV0dXJuIHhTSVNjaGVtYUxvY2F0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBNZXRob2RDb25maWd1cmF0aW9uIGdldE1ldGhvZENvbmZpZ3VyYXRpb24oKSB7Ci0JCXJldHVybiAoTWV0aG9kQ29uZmlndXJhdGlvbilnZXRNaXhlZCgpLmdldChVbWFQYWNrYWdlLkxpdGVyYWxzLkRPQ1VNRU5UX1JPT1RfX01FVEhPRF9DT05GSUdVUkFUSU9OLCB0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRNZXRob2RDb25maWd1cmF0aW9uKE1ldGhvZENvbmZpZ3VyYXRpb24gbmV3TWV0aG9kQ29uZmlndXJhdGlvbiwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlyZXR1cm4gKChGZWF0dXJlTWFwLkludGVybmFsKWdldE1peGVkKCkpLmJhc2ljQWRkKFVtYVBhY2thZ2UuTGl0ZXJhbHMuRE9DVU1FTlRfUk9PVF9fTUVUSE9EX0NPTkZJR1VSQVRJT04sIG5ld01ldGhvZENvbmZpZ3VyYXRpb24sIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1ldGhvZENvbmZpZ3VyYXRpb24oTWV0aG9kQ29uZmlndXJhdGlvbiBuZXdNZXRob2RDb25maWd1cmF0aW9uKSB7Ci0JCSgoRmVhdHVyZU1hcC5JbnRlcm5hbClnZXRNaXhlZCgpKS5zZXQoVW1hUGFja2FnZS5MaXRlcmFscy5ET0NVTUVOVF9ST09UX19NRVRIT0RfQ09ORklHVVJBVElPTiwgbmV3TWV0aG9kQ29uZmlndXJhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE1ldGhvZExpYnJhcnkgZ2V0TWV0aG9kTGlicmFyeSgpIHsKLQkJcmV0dXJuIChNZXRob2RMaWJyYXJ5KWdldE1peGVkKCkuZ2V0KFVtYVBhY2thZ2UuTGl0ZXJhbHMuRE9DVU1FTlRfUk9PVF9fTUVUSE9EX0xJQlJBUlksIHRydWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldE1ldGhvZExpYnJhcnkoTWV0aG9kTGlicmFyeSBuZXdNZXRob2RMaWJyYXJ5LCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXJldHVybiAoKEZlYXR1cmVNYXAuSW50ZXJuYWwpZ2V0TWl4ZWQoKSkuYmFzaWNBZGQoVW1hUGFja2FnZS5MaXRlcmFscy5ET0NVTUVOVF9ST09UX19NRVRIT0RfTElCUkFSWSwgbmV3TWV0aG9kTGlicmFyeSwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TWV0aG9kTGlicmFyeShNZXRob2RMaWJyYXJ5IG5ld01ldGhvZExpYnJhcnkpIHsKLQkJKChGZWF0dXJlTWFwLkludGVybmFsKWdldE1peGVkKCkpLnNldChVbWFQYWNrYWdlLkxpdGVyYWxzLkRPQ1VNRU5UX1JPT1RfX01FVEhPRF9MSUJSQVJZLCBuZXdNZXRob2RMaWJyYXJ5KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTWV0aG9kUGx1Z2luIGdldE1ldGhvZFBsdWdpbigpIHsKLQkJcmV0dXJuIChNZXRob2RQbHVnaW4pZ2V0TWl4ZWQoKS5nZXQoVW1hUGFja2FnZS5MaXRlcmFscy5ET0NVTUVOVF9ST09UX19NRVRIT0RfUExVR0lOLCB0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRNZXRob2RQbHVnaW4oTWV0aG9kUGx1Z2luIG5ld01ldGhvZFBsdWdpbiwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlyZXR1cm4gKChGZWF0dXJlTWFwLkludGVybmFsKWdldE1peGVkKCkpLmJhc2ljQWRkKFVtYVBhY2thZ2UuTGl0ZXJhbHMuRE9DVU1FTlRfUk9PVF9fTUVUSE9EX1BMVUdJTiwgbmV3TWV0aG9kUGx1Z2luLCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNZXRob2RQbHVnaW4oTWV0aG9kUGx1Z2luIG5ld01ldGhvZFBsdWdpbikgewotCQkoKEZlYXR1cmVNYXAuSW50ZXJuYWwpZ2V0TWl4ZWQoKSkuc2V0KFVtYVBhY2thZ2UuTGl0ZXJhbHMuRE9DVU1FTlRfUk9PVF9fTUVUSE9EX1BMVUdJTiwgbmV3TWV0aG9kUGx1Z2luKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuRE9DVU1FTlRfUk9PVF9fTUlYRUQ6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRNaXhlZCgpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuRE9DVU1FTlRfUk9PVF9fWE1MTlNfUFJFRklYX01BUDoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldFhNTE5TUHJlZml4TWFwKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5ET0NVTUVOVF9ST09UX19YU0lfU0NIRU1BX0xPQ0FUSU9OOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0WFNJU2NoZW1hTG9jYXRpb24oKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRPQ1VNRU5UX1JPT1RfX01FVEhPRF9DT05GSUdVUkFUSU9OOgotCQkJCXJldHVybiBiYXNpY1NldE1ldGhvZENvbmZpZ3VyYXRpb24obnVsbCwgbXNncyk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuRE9DVU1FTlRfUk9PVF9fTUVUSE9EX0xJQlJBUlk6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0TWV0aG9kTGlicmFyeShudWxsLCBtc2dzKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5ET0NVTUVOVF9ST09UX19NRVRIT0RfUExVR0lOOgotCQkJCXJldHVybiBiYXNpY1NldE1ldGhvZFBsdWdpbihudWxsLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkRPQ1VNRU5UX1JPT1RfX01JWEVEOgotCQkJCWlmIChjb3JlVHlwZSkgcmV0dXJuIGdldE1peGVkKCk7Ci0JCQkJcmV0dXJuICgoRmVhdHVyZU1hcC5JbnRlcm5hbClnZXRNaXhlZCgpKS5nZXRXcmFwcGVyKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuRE9DVU1FTlRfUk9PVF9fWE1MTlNfUFJFRklYX01BUDoKLQkJCQlpZiAoY29yZVR5cGUpIHJldHVybiBnZXRYTUxOU1ByZWZpeE1hcCgpOwotCQkJCWVsc2UgcmV0dXJuIGdldFhNTE5TUHJlZml4TWFwKCkubWFwKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuRE9DVU1FTlRfUk9PVF9fWFNJX1NDSEVNQV9MT0NBVElPTjoKLQkJCQlpZiAoY29yZVR5cGUpIHJldHVybiBnZXRYU0lTY2hlbWFMb2NhdGlvbigpOwotCQkJCWVsc2UgcmV0dXJuIGdldFhTSVNjaGVtYUxvY2F0aW9uKCkubWFwKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuRE9DVU1FTlRfUk9PVF9fTUVUSE9EX0NPTkZJR1VSQVRJT046Ci0JCQkJcmV0dXJuIGdldE1ldGhvZENvbmZpZ3VyYXRpb24oKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5ET0NVTUVOVF9ST09UX19NRVRIT0RfTElCUkFSWToKLQkJCQlyZXR1cm4gZ2V0TWV0aG9kTGlicmFyeSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRPQ1VNRU5UX1JPT1RfX01FVEhPRF9QTFVHSU46Ci0JCQkJcmV0dXJuIGdldE1ldGhvZFBsdWdpbigpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuRE9DVU1FTlRfUk9PVF9fTUlYRUQ6Ci0JCQkJKChGZWF0dXJlTWFwLkludGVybmFsKWdldE1peGVkKCkpLnNldChuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRPQ1VNRU5UX1JPT1RfX1hNTE5TX1BSRUZJWF9NQVA6Ci0JCQkJKChFU3RydWN0dXJhbEZlYXR1cmUuU2V0dGluZylnZXRYTUxOU1ByZWZpeE1hcCgpKS5zZXQobmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5ET0NVTUVOVF9ST09UX19YU0lfU0NIRU1BX0xPQ0FUSU9OOgotCQkJCSgoRVN0cnVjdHVyYWxGZWF0dXJlLlNldHRpbmcpZ2V0WFNJU2NoZW1hTG9jYXRpb24oKSkuc2V0KG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuRE9DVU1FTlRfUk9PVF9fTUVUSE9EX0NPTkZJR1VSQVRJT046Ci0JCQkJc2V0TWV0aG9kQ29uZmlndXJhdGlvbigoTWV0aG9kQ29uZmlndXJhdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRPQ1VNRU5UX1JPT1RfX01FVEhPRF9MSUJSQVJZOgotCQkJCXNldE1ldGhvZExpYnJhcnkoKE1ldGhvZExpYnJhcnkpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5ET0NVTUVOVF9ST09UX19NRVRIT0RfUExVR0lOOgotCQkJCXNldE1ldGhvZFBsdWdpbigoTWV0aG9kUGx1Z2luKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkRPQ1VNRU5UX1JPT1RfX01JWEVEOgotCQkJCWdldE1peGVkKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuRE9DVU1FTlRfUk9PVF9fWE1MTlNfUFJFRklYX01BUDoKLQkJCQlnZXRYTUxOU1ByZWZpeE1hcCgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRPQ1VNRU5UX1JPT1RfX1hTSV9TQ0hFTUFfTE9DQVRJT046Ci0JCQkJZ2V0WFNJU2NoZW1hTG9jYXRpb24oKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5ET0NVTUVOVF9ST09UX19NRVRIT0RfQ09ORklHVVJBVElPTjoKLQkJCQlzZXRNZXRob2RDb25maWd1cmF0aW9uKChNZXRob2RDb25maWd1cmF0aW9uKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5ET0NVTUVOVF9ST09UX19NRVRIT0RfTElCUkFSWToKLQkJCQlzZXRNZXRob2RMaWJyYXJ5KChNZXRob2RMaWJyYXJ5KW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5ET0NVTUVOVF9ST09UX19NRVRIT0RfUExVR0lOOgotCQkJCXNldE1ldGhvZFBsdWdpbigoTWV0aG9kUGx1Z2luKW51bGwpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkRPQ1VNRU5UX1JPT1RfX01JWEVEOgotCQkJCXJldHVybiBtaXhlZCAhPSBudWxsICYmICFtaXhlZC5pc0VtcHR5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuRE9DVU1FTlRfUk9PVF9fWE1MTlNfUFJFRklYX01BUDoKLQkJCQlyZXR1cm4geE1MTlNQcmVmaXhNYXAgIT0gbnVsbCAmJiAheE1MTlNQcmVmaXhNYXAuaXNFbXB0eSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRPQ1VNRU5UX1JPT1RfX1hTSV9TQ0hFTUFfTE9DQVRJT046Ci0JCQkJcmV0dXJuIHhTSVNjaGVtYUxvY2F0aW9uICE9IG51bGwgJiYgIXhTSVNjaGVtYUxvY2F0aW9uLmlzRW1wdHkoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5ET0NVTUVOVF9ST09UX19NRVRIT0RfQ09ORklHVVJBVElPTjoKLQkJCQlyZXR1cm4gZ2V0TWV0aG9kQ29uZmlndXJhdGlvbigpICE9IG51bGw7Ci0JCQljYXNlIFVtYVBhY2thZ2UuRE9DVU1FTlRfUk9PVF9fTUVUSE9EX0xJQlJBUlk6Ci0JCQkJcmV0dXJuIGdldE1ldGhvZExpYnJhcnkoKSAhPSBudWxsOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRPQ1VNRU5UX1JPT1RfX01FVEhPRF9QTFVHSU46Ci0JCQkJcmV0dXJuIGdldE1ldGhvZFBsdWdpbigpICE9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChtaXhlZDogIik7Ci0JCXJlc3VsdC5hcHBlbmQobWl4ZWQpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9Eb2N1bWVudFJvb3RJbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvRG9tYWluSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvRG9tYWluSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NmNmNjUyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0RvbWFpbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxMCArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IERvbWFpbkltcGwuamF2YSx2IDEuMiAyMDA4LzAxLzMwIDAwOjQxOjQ3IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkJhc2ljRmVhdHVyZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Eb21haW48L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuRG9tYWluSW1wbCNnZXRHcm91cDIgPGVtPkdyb3VwMjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Eb21haW5JbXBsI2dldFdvcmtQcm9kdWN0IDxlbT5Xb3JrIFByb2R1Y3Q8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuRG9tYWluSW1wbCNnZXRTdWJkb21haW4gPGVtPlN1YmRvbWFpbjwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERvbWFpbkltcGwgZXh0ZW5kcyBDb250ZW50Q2F0ZWdvcnlJbXBsIGltcGxlbWVudHMgRG9tYWluIHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRHcm91cDIoKSA8ZW0+R3JvdXAyPC9lbT59JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEdyb3VwMigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEZlYXR1cmVNYXAgZ3JvdXAyOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIERvbWFpbkltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLkRPTUFJTjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRmVhdHVyZU1hcCBnZXRHcm91cDIoKSB7Ci0JCWlmIChncm91cDIgPT0gbnVsbCkgewotCQkJZ3JvdXAyID0gbmV3IEJhc2ljRmVhdHVyZU1hcCh0aGlzLCBVbWFQYWNrYWdlLkRPTUFJTl9fR1JPVVAyKTsKLQkJfQotCQlyZXR1cm4gZ3JvdXAyOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxTdHJpbmc+IGdldFdvcmtQcm9kdWN0KCkgewotCQlyZXR1cm4gZ2V0R3JvdXAyKCkubGlzdChVbWFQYWNrYWdlLkxpdGVyYWxzLkRPTUFJTl9fV09SS19QUk9EVUNUKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8RG9tYWluPiBnZXRTdWJkb21haW4oKSB7Ci0JCXJldHVybiBnZXRHcm91cDIoKS5saXN0KFVtYVBhY2thZ2UuTGl0ZXJhbHMuRE9NQUlOX19TVUJET01BSU4pOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5ET01BSU5fX0dST1VQMjoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldEdyb3VwMigpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuRE9NQUlOX19TVUJET01BSU46Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRTdWJkb21haW4oKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuRE9NQUlOX19HUk9VUDI6Ci0JCQkJaWYgKGNvcmVUeXBlKSByZXR1cm4gZ2V0R3JvdXAyKCk7Ci0JCQkJcmV0dXJuICgoRmVhdHVyZU1hcC5JbnRlcm5hbClnZXRHcm91cDIoKSkuZ2V0V3JhcHBlcigpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRPTUFJTl9fV09SS19QUk9EVUNUOgotCQkJCXJldHVybiBnZXRXb3JrUHJvZHVjdCgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRPTUFJTl9fU1VCRE9NQUlOOgotCQkJCXJldHVybiBnZXRTdWJkb21haW4oKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5ET01BSU5fX0dST1VQMjoKLQkJCQkoKEZlYXR1cmVNYXAuSW50ZXJuYWwpZ2V0R3JvdXAyKCkpLnNldChuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRPTUFJTl9fV09SS19QUk9EVUNUOgotCQkJCWdldFdvcmtQcm9kdWN0KCkuY2xlYXIoKTsKLQkJCQlnZXRXb3JrUHJvZHVjdCgpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgU3RyaW5nPiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRPTUFJTl9fU1VCRE9NQUlOOgotCQkJCWdldFN1YmRvbWFpbigpLmNsZWFyKCk7Ci0JCQkJZ2V0U3ViZG9tYWluKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBEb21haW4+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkRPTUFJTl9fR1JPVVAyOgotCQkJCWdldEdyb3VwMigpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRPTUFJTl9fV09SS19QUk9EVUNUOgotCQkJCWdldFdvcmtQcm9kdWN0KCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuRE9NQUlOX19TVUJET01BSU46Ci0JCQkJZ2V0U3ViZG9tYWluKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5ET01BSU5fX0dST1VQMjoKLQkJCQlyZXR1cm4gZ3JvdXAyICE9IG51bGwgJiYgIWdyb3VwMi5pc0VtcHR5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuRE9NQUlOX19XT1JLX1BST0RVQ1Q6Ci0JCQkJcmV0dXJuICFnZXRXb3JrUHJvZHVjdCgpLmlzRW1wdHkoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5ET01BSU5fX1NVQkRPTUFJTjoKLQkJCQlyZXR1cm4gIWdldFN1YmRvbWFpbigpLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGdyb3VwMjogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZ3JvdXAyKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vRG9tYWluSW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0VsZW1lbnRJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9FbGVtZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ODM4YjM1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0VsZW1lbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IEVsZW1lbnRJbXBsLmphdmEsdiAxLjIgMjAwOC8wMS8zMCAwMDo0MTo0NyBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnNkby5pbXBsLkVEYXRhT2JqZWN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5FbGVtZW50PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRWxlbWVudEltcGwgZXh0ZW5kcyBFRGF0YU9iamVjdEltcGwgaW1wbGVtZW50cyBFbGVtZW50IHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRWxlbWVudEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLkVMRU1FTlQ7Ci0JfQotCi19IC8vRWxlbWVudEltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9Fc3RpbWF0ZUltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0VzdGltYXRlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZTJlYjhkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0VzdGltYXRlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA4ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogRXN0aW1hdGVJbXBsLmphdmEsdiAxLjIgMjAwOC8wMS8zMCAwMDo0MTo0NyBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5CYXNpY0ZlYXR1cmVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkVzdGltYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Fc3RpbWF0ZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Fc3RpbWF0ZUltcGwjZ2V0R3JvdXAyIDxlbT5Hcm91cDI8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuRXN0aW1hdGVJbXBsI2dldEVzdGltYXRpb25NZXRyaWMgPGVtPkVzdGltYXRpb24gTWV0cmljPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkVzdGltYXRlSW1wbCNnZXRFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMgPGVtPkVzdGltYXRpb24gQ29uc2lkZXJhdGlvbnM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBFc3RpbWF0ZUltcGwgZXh0ZW5kcyBHdWlkYW5jZUltcGwgaW1wbGVtZW50cyBFc3RpbWF0ZSB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0R3JvdXAyKCkgPGVtPkdyb3VwMjwvZW0+fScgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRHcm91cDIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBGZWF0dXJlTWFwIGdyb3VwMjsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFc3RpbWF0ZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLkVTVElNQVRFOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBGZWF0dXJlTWFwIGdldEdyb3VwMigpIHsKLQkJaWYgKGdyb3VwMiA9PSBudWxsKSB7Ci0JCQlncm91cDIgPSBuZXcgQmFzaWNGZWF0dXJlTWFwKHRoaXMsIFVtYVBhY2thZ2UuRVNUSU1BVEVfX0dST1VQMik7Ci0JCX0KLQkJcmV0dXJuIGdyb3VwMjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8U3RyaW5nPiBnZXRFc3RpbWF0aW9uTWV0cmljKCkgewotCQlyZXR1cm4gZ2V0R3JvdXAyKCkubGlzdChVbWFQYWNrYWdlLkxpdGVyYWxzLkVTVElNQVRFX19FU1RJTUFUSU9OX01FVFJJQyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFN0cmluZz4gZ2V0RXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKCkgewotCQlyZXR1cm4gZ2V0R3JvdXAyKCkubGlzdChVbWFQYWNrYWdlLkxpdGVyYWxzLkVTVElNQVRFX19FU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuRVNUSU1BVEVfX0dST1VQMjoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldEdyb3VwMigpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5FU1RJTUFURV9fR1JPVVAyOgotCQkJCWlmIChjb3JlVHlwZSkgcmV0dXJuIGdldEdyb3VwMigpOwotCQkJCXJldHVybiAoKEZlYXR1cmVNYXAuSW50ZXJuYWwpZ2V0R3JvdXAyKCkpLmdldFdyYXBwZXIoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5FU1RJTUFURV9fRVNUSU1BVElPTl9NRVRSSUM6Ci0JCQkJcmV0dXJuIGdldEVzdGltYXRpb25NZXRyaWMoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5FU1RJTUFURV9fRVNUSU1BVElPTl9DT05TSURFUkFUSU9OUzoKLQkJCQlyZXR1cm4gZ2V0RXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuRVNUSU1BVEVfX0dST1VQMjoKLQkJCQkoKEZlYXR1cmVNYXAuSW50ZXJuYWwpZ2V0R3JvdXAyKCkpLnNldChuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkVTVElNQVRFX19FU1RJTUFUSU9OX01FVFJJQzoKLQkJCQlnZXRFc3RpbWF0aW9uTWV0cmljKCkuY2xlYXIoKTsKLQkJCQlnZXRFc3RpbWF0aW9uTWV0cmljKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBTdHJpbmc+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuRVNUSU1BVEVfX0VTVElNQVRJT05fQ09OU0lERVJBVElPTlM6Ci0JCQkJZ2V0RXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKCkuY2xlYXIoKTsKLQkJCQlnZXRFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFN0cmluZz4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuRVNUSU1BVEVfX0dST1VQMjoKLQkJCQlnZXRHcm91cDIoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5FU1RJTUFURV9fRVNUSU1BVElPTl9NRVRSSUM6Ci0JCQkJZ2V0RXN0aW1hdGlvbk1ldHJpYygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkVTVElNQVRFX19FU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TOgotCQkJCWdldEVzdGltYXRpb25Db25zaWRlcmF0aW9ucygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuRVNUSU1BVEVfX0dST1VQMjoKLQkJCQlyZXR1cm4gZ3JvdXAyICE9IG51bGwgJiYgIWdyb3VwMi5pc0VtcHR5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuRVNUSU1BVEVfX0VTVElNQVRJT05fTUVUUklDOgotCQkJCXJldHVybiAhZ2V0RXN0aW1hdGlvbk1ldHJpYygpLmlzRW1wdHkoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5FU1RJTUFURV9fRVNUSU1BVElPTl9DT05TSURFUkFUSU9OUzoKLQkJCQlyZXR1cm4gIWdldEVzdGltYXRpb25Db25zaWRlcmF0aW9ucygpLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGdyb3VwMjogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZ3JvdXAyKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vRXN0aW1hdGVJbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvRXN0aW1hdGluZ01ldHJpY0ltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0VzdGltYXRpbmdNZXRyaWNJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5N2NhY2MuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvRXN0aW1hdGluZ01ldHJpY0ltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogRXN0aW1hdGluZ01ldHJpY0ltcGwuamF2YSx2IDEuMiAyMDA4LzAxLzMwIDAwOjQxOjQ3IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Fc3RpbWF0aW5nTWV0cmljOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Fc3RpbWF0aW5nIE1ldHJpYzwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEVzdGltYXRpbmdNZXRyaWNJbXBsIGV4dGVuZHMgR3VpZGFuY2VJbXBsIGltcGxlbWVudHMgRXN0aW1hdGluZ01ldHJpYyB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVzdGltYXRpbmdNZXRyaWNJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5FU1RJTUFUSU5HX01FVFJJQzsKLQl9Ci0KLX0gLy9Fc3RpbWF0aW5nTWV0cmljSW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0VzdGltYXRpb25Db25zaWRlcmF0aW9uc0ltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0VzdGltYXRpb25Db25zaWRlcmF0aW9uc0ltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmY3OGUyNS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnNJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IEVzdGltYXRpb25Db25zaWRlcmF0aW9uc0ltcGwuamF2YSx2IDEuMiAyMDA4LzAxLzMwIDAwOjQxOjQ3IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkVzdGltYXRpb24gQ29uc2lkZXJhdGlvbnM8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnNJbXBsIGV4dGVuZHMgR3VpZGFuY2VJbXBsIGltcGxlbWVudHMgRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuRVNUSU1BVElPTl9DT05TSURFUkFUSU9OUzsKLQl9Ci0KLX0gLy9Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnNJbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvRXhhbXBsZUltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0V4YW1wbGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2OWY1MGQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvRXhhbXBsZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogRXhhbXBsZUltcGwuamF2YSx2IDEuMiAyMDA4LzAxLzMwIDAwOjQxOjQ3IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5FeGFtcGxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5FeGFtcGxlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRXhhbXBsZUltcGwgZXh0ZW5kcyBHdWlkYW5jZUltcGwgaW1wbGVtZW50cyBFeGFtcGxlIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRXhhbXBsZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLkVYQU1QTEU7Ci0JfQotCi19IC8vRXhhbXBsZUltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9HdWlkYW5jZURlc2NyaXB0aW9uSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvR3VpZGFuY2VEZXNjcmlwdGlvbkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTk1ZDY3OC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9HdWlkYW5jZURlc2NyaXB0aW9uSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYzICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogR3VpZGFuY2VEZXNjcmlwdGlvbkltcGwuamF2YSx2IDEuMiAyMDA4LzAxLzMwIDAwOjQxOjQ3IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuR3VpZGFuY2VEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+R3VpZGFuY2UgRGVzY3JpcHRpb248L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuR3VpZGFuY2VEZXNjcmlwdGlvbkltcGwjZ2V0QXR0YWNobWVudCA8ZW0+QXR0YWNobWVudDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEd1aWRhbmNlRGVzY3JpcHRpb25JbXBsIGV4dGVuZHMgQ29udGVudERlc2NyaXB0aW9uSW1wbCBpbXBsZW1lbnRzIEd1aWRhbmNlRGVzY3JpcHRpb24gewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBdHRhY2htZW50KCkgPGVtPkF0dGFjaG1lbnQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEF0dGFjaG1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVEFDSE1FTlRfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QXR0YWNobWVudCgpIDxlbT5BdHRhY2htZW50PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBdHRhY2htZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGF0dGFjaG1lbnQgPSBBVFRBQ0hNRU5UX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEd1aWRhbmNlRGVzY3JpcHRpb25JbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5HVUlEQU5DRV9ERVNDUklQVElPTjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEF0dGFjaG1lbnQoKSB7Ci0JCXJldHVybiBhdHRhY2htZW50OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEF0dGFjaG1lbnQoU3RyaW5nIG5ld0F0dGFjaG1lbnQpIHsKLQkJU3RyaW5nIG9sZEF0dGFjaG1lbnQgPSBhdHRhY2htZW50OwotCQlhdHRhY2htZW50ID0gbmV3QXR0YWNobWVudDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5HVUlEQU5DRV9ERVNDUklQVElPTl9fQVRUQUNITUVOVCwgb2xkQXR0YWNobWVudCwgYXR0YWNobWVudCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5HVUlEQU5DRV9ERVNDUklQVElPTl9fQVRUQUNITUVOVDoKLQkJCQlyZXR1cm4gZ2V0QXR0YWNobWVudCgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuR1VJREFOQ0VfREVTQ1JJUFRJT05fX0FUVEFDSE1FTlQ6Ci0JCQkJc2V0QXR0YWNobWVudCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkdVSURBTkNFX0RFU0NSSVBUSU9OX19BVFRBQ0hNRU5UOgotCQkJCXNldEF0dGFjaG1lbnQoQVRUQUNITUVOVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuR1VJREFOQ0VfREVTQ1JJUFRJT05fX0FUVEFDSE1FTlQ6Ci0JCQkJcmV0dXJuIEFUVEFDSE1FTlRfRURFRkFVTFQgPT0gbnVsbCA/IGF0dGFjaG1lbnQgIT0gbnVsbCA6ICFBVFRBQ0hNRU5UX0VERUZBVUxULmVxdWFscyhhdHRhY2htZW50KTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGF0dGFjaG1lbnQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGF0dGFjaG1lbnQpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9HdWlkYW5jZURlc2NyaXB0aW9uSW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0d1aWRhbmNlSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvR3VpZGFuY2VJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxZDQ4MzkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvR3VpZGFuY2VJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IEd1aWRhbmNlSW1wbC5qYXZhLHYgMS4yIDIwMDgvMDEvMzAgMDA6NDE6NDcga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkd1aWRhbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5HdWlkYW5jZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEd1aWRhbmNlSW1wbCBleHRlbmRzIENvbnRlbnRFbGVtZW50SW1wbCBpbXBsZW1lbnRzIEd1aWRhbmNlIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgR3VpZGFuY2VJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5HVUlEQU5DRTsKLQl9Ci0KLX0gLy9HdWlkYW5jZUltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9HdWlkZWxpbmVJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9HdWlkZWxpbmVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllMzA5YzMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvR3VpZGVsaW5lSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBHdWlkZWxpbmVJbXBsLmphdmEsdiAxLjIgMjAwOC8wMS8zMCAwMDo0MTo0NyBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuR3VpZGVsaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5HdWlkZWxpbmU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBHdWlkZWxpbmVJbXBsIGV4dGVuZHMgR3VpZGFuY2VJbXBsIGltcGxlbWVudHMgR3VpZGVsaW5lIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgR3VpZGVsaW5lSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuR1VJREVMSU5FOwotCX0KLQotfSAvL0d1aWRlbGluZUltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9JdGVyYXRpb25JbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9JdGVyYXRpb25JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiZjlkZGUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvSXRlcmF0aW9uSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBJdGVyYXRpb25JbXBsLmphdmEsdiAxLjIgMjAwOC8wMS8zMCAwMDo0MTo0NyBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuSXRlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5JdGVyYXRpb248L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBJdGVyYXRpb25JbXBsIGV4dGVuZHMgQWN0aXZpdHlJbXBsIGltcGxlbWVudHMgSXRlcmF0aW9uIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSXRlcmF0aW9uSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuSVRFUkFUSU9OOwotCX0KLQotfSAvL0l0ZXJhdGlvbkltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9LaW5kSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvS2luZEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTUxODIwOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9LaW5kSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUxICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogS2luZEltcGwuamF2YSx2IDEuMSAyMDA4LzAxLzMwIDAwOjQxOjQ3IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRURhdGFUeXBlRUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5LaW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5LaW5kPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLktpbmRJbXBsI2dldEFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvIDxlbT5BcHBsaWNhYmxlIE1ldGEgQ2xhc3MgSW5mbzwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEtpbmRJbXBsIGV4dGVuZHMgQ29udGVudEVsZW1lbnRJbXBsIGltcGxlbWVudHMgS2luZCB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QXBwbGljYWJsZU1ldGFDbGFzc0luZm8oKSA8ZW0+QXBwbGljYWJsZSBNZXRhIENsYXNzIEluZm88L2VtPn0nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QXBwbGljYWJsZU1ldGFDbGFzc0luZm8oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxTdHJpbmc+IGFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEtpbmRJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5LSU5EOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxTdHJpbmc+IGdldEFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvKCkgewotCQlpZiAoYXBwbGljYWJsZU1ldGFDbGFzc0luZm8gPT0gbnVsbCkgewotCQkJYXBwbGljYWJsZU1ldGFDbGFzc0luZm8gPSBuZXcgRURhdGFUeXBlRUxpc3Q8U3RyaW5nPihTdHJpbmcuY2xhc3MsIHRoaXMsIFVtYVBhY2thZ2UuS0lORF9fQVBQTElDQUJMRV9NRVRBX0NMQVNTX0lORk8pOwotCQl9Ci0JCXJldHVybiBhcHBsaWNhYmxlTWV0YUNsYXNzSW5mbzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuS0lORF9fQVBQTElDQUJMRV9NRVRBX0NMQVNTX0lORk86Ci0JCQkJcmV0dXJuIGdldEFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuS0lORF9fQVBQTElDQUJMRV9NRVRBX0NMQVNTX0lORk86Ci0JCQkJZ2V0QXBwbGljYWJsZU1ldGFDbGFzc0luZm8oKS5jbGVhcigpOwotCQkJCWdldEFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBTdHJpbmc+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLktJTkRfX0FQUExJQ0FCTEVfTUVUQV9DTEFTU19JTkZPOgotCQkJCWdldEFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5LSU5EX19BUFBMSUNBQkxFX01FVEFfQ0xBU1NfSU5GTzoKLQkJCQlyZXR1cm4gYXBwbGljYWJsZU1ldGFDbGFzc0luZm8gIT0gbnVsbCAmJiAhYXBwbGljYWJsZU1ldGFDbGFzc0luZm8uaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoYXBwbGljYWJsZU1ldGFDbGFzc0luZm86ICIpOwotCQlyZXN1bHQuYXBwZW5kKGFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vS2luZEltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL01ldGhvZENvbmZpZ3VyYXRpb25JbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9NZXRob2RDb25maWd1cmF0aW9uSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MmM4ODZmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL01ldGhvZENvbmZpZ3VyYXRpb25JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzODkgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBNZXRob2RDb25maWd1cmF0aW9uSW1wbC5qYXZhLHYgMS4yIDIwMDgvMDEvMzAgMDA6NDE6NDcga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVEYXRhVHlwZUVMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+TWV0aG9kIENvbmZpZ3VyYXRpb248L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuTWV0aG9kQ29uZmlndXJhdGlvbkltcGwjZ2V0QmFzZUNvbmZpZ3VyYXRpb24gPGVtPkJhc2UgQ29uZmlndXJhdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5NZXRob2RDb25maWd1cmF0aW9uSW1wbCNnZXRNZXRob2RQbHVnaW5TZWxlY3Rpb24gPGVtPk1ldGhvZCBQbHVnaW4gU2VsZWN0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLk1ldGhvZENvbmZpZ3VyYXRpb25JbXBsI2dldE1ldGhvZFBhY2thZ2VTZWxlY3Rpb24gPGVtPk1ldGhvZCBQYWNrYWdlIFNlbGVjdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5NZXRob2RDb25maWd1cmF0aW9uSW1wbCNnZXREZWZhdWx0VmlldyA8ZW0+RGVmYXVsdCBWaWV3PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLk1ldGhvZENvbmZpZ3VyYXRpb25JbXBsI2dldFByb2Nlc3NWaWV3IDxlbT5Qcm9jZXNzIFZpZXc8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuTWV0aG9kQ29uZmlndXJhdGlvbkltcGwjZ2V0U3VidHJhY3RlZENhdGVnb3J5IDxlbT5TdWJ0cmFjdGVkIENhdGVnb3J5PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLk1ldGhvZENvbmZpZ3VyYXRpb25JbXBsI2dldEFkZGVkQ2F0ZWdvcnkgPGVtPkFkZGVkIENhdGVnb3J5PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgTWV0aG9kQ29uZmlndXJhdGlvbkltcGwgZXh0ZW5kcyBNZXRob2RVbml0SW1wbCBpbXBsZW1lbnRzIE1ldGhvZENvbmZpZ3VyYXRpb24gewotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEJhc2VDb25maWd1cmF0aW9uKCkgPGVtPkJhc2UgQ29uZmlndXJhdGlvbjwvZW0+fScgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRCYXNlQ29uZmlndXJhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PFN0cmluZz4gYmFzZUNvbmZpZ3VyYXRpb247Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNZXRob2RQbHVnaW5TZWxlY3Rpb24oKSA8ZW0+TWV0aG9kIFBsdWdpbiBTZWxlY3Rpb248L2VtPn0nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TWV0aG9kUGx1Z2luU2VsZWN0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8U3RyaW5nPiBtZXRob2RQbHVnaW5TZWxlY3Rpb247Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNZXRob2RQYWNrYWdlU2VsZWN0aW9uKCkgPGVtPk1ldGhvZCBQYWNrYWdlIFNlbGVjdGlvbjwvZW0+fScgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRNZXRob2RQYWNrYWdlU2VsZWN0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8U3RyaW5nPiBtZXRob2RQYWNrYWdlU2VsZWN0aW9uOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlZmF1bHRWaWV3KCkgPGVtPkRlZmF1bHQgVmlldzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGVmYXVsdFZpZXcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfVklFV19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZWZhdWx0VmlldygpIDxlbT5EZWZhdWx0IFZpZXc8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERlZmF1bHRWaWV3KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGRlZmF1bHRWaWV3ID0gREVGQVVMVF9WSUVXX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJvY2Vzc1ZpZXcoKSA8ZW0+UHJvY2VzcyBWaWV3PC9lbT59JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFByb2Nlc3NWaWV3KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8U3RyaW5nPiBwcm9jZXNzVmlldzsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFN1YnRyYWN0ZWRDYXRlZ29yeSgpIDxlbT5TdWJ0cmFjdGVkIENhdGVnb3J5PC9lbT59JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFN1YnRyYWN0ZWRDYXRlZ29yeSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PFN0cmluZz4gc3VidHJhY3RlZENhdGVnb3J5OwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QWRkZWRDYXRlZ29yeSgpIDxlbT5BZGRlZCBDYXRlZ29yeTwvZW0+fScgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBZGRlZENhdGVnb3J5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8U3RyaW5nPiBhZGRlZENhdGVnb3J5OwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE1ldGhvZENvbmZpZ3VyYXRpb25JbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5NRVRIT0RfQ09ORklHVVJBVElPTjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8U3RyaW5nPiBnZXRCYXNlQ29uZmlndXJhdGlvbigpIHsKLQkJaWYgKGJhc2VDb25maWd1cmF0aW9uID09IG51bGwpIHsKLQkJCWJhc2VDb25maWd1cmF0aW9uID0gbmV3IEVEYXRhVHlwZUVMaXN0PFN0cmluZz4oU3RyaW5nLmNsYXNzLCB0aGlzLCBVbWFQYWNrYWdlLk1FVEhPRF9DT05GSUdVUkFUSU9OX19CQVNFX0NPTkZJR1VSQVRJT04pOwotCQl9Ci0JCXJldHVybiBiYXNlQ29uZmlndXJhdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8U3RyaW5nPiBnZXRNZXRob2RQbHVnaW5TZWxlY3Rpb24oKSB7Ci0JCWlmIChtZXRob2RQbHVnaW5TZWxlY3Rpb24gPT0gbnVsbCkgewotCQkJbWV0aG9kUGx1Z2luU2VsZWN0aW9uID0gbmV3IEVEYXRhVHlwZUVMaXN0PFN0cmluZz4oU3RyaW5nLmNsYXNzLCB0aGlzLCBVbWFQYWNrYWdlLk1FVEhPRF9DT05GSUdVUkFUSU9OX19NRVRIT0RfUExVR0lOX1NFTEVDVElPTik7Ci0JCX0KLQkJcmV0dXJuIG1ldGhvZFBsdWdpblNlbGVjdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8U3RyaW5nPiBnZXRNZXRob2RQYWNrYWdlU2VsZWN0aW9uKCkgewotCQlpZiAobWV0aG9kUGFja2FnZVNlbGVjdGlvbiA9PSBudWxsKSB7Ci0JCQltZXRob2RQYWNrYWdlU2VsZWN0aW9uID0gbmV3IEVEYXRhVHlwZUVMaXN0PFN0cmluZz4oU3RyaW5nLmNsYXNzLCB0aGlzLCBVbWFQYWNrYWdlLk1FVEhPRF9DT05GSUdVUkFUSU9OX19NRVRIT0RfUEFDS0FHRV9TRUxFQ1RJT04pOwotCQl9Ci0JCXJldHVybiBtZXRob2RQYWNrYWdlU2VsZWN0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFZpZXcoKSB7Ci0JCXJldHVybiBkZWZhdWx0VmlldzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZWZhdWx0VmlldyhTdHJpbmcgbmV3RGVmYXVsdFZpZXcpIHsKLQkJU3RyaW5nIG9sZERlZmF1bHRWaWV3ID0gZGVmYXVsdFZpZXc7Ci0JCWRlZmF1bHRWaWV3ID0gbmV3RGVmYXVsdFZpZXc7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuTUVUSE9EX0NPTkZJR1VSQVRJT05fX0RFRkFVTFRfVklFVywgb2xkRGVmYXVsdFZpZXcsIGRlZmF1bHRWaWV3KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFN0cmluZz4gZ2V0UHJvY2Vzc1ZpZXcoKSB7Ci0JCWlmIChwcm9jZXNzVmlldyA9PSBudWxsKSB7Ci0JCQlwcm9jZXNzVmlldyA9IG5ldyBFRGF0YVR5cGVFTGlzdDxTdHJpbmc+KFN0cmluZy5jbGFzcywgdGhpcywgVW1hUGFja2FnZS5NRVRIT0RfQ09ORklHVVJBVElPTl9fUFJPQ0VTU19WSUVXKTsKLQkJfQotCQlyZXR1cm4gcHJvY2Vzc1ZpZXc7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFN0cmluZz4gZ2V0U3VidHJhY3RlZENhdGVnb3J5KCkgewotCQlpZiAoc3VidHJhY3RlZENhdGVnb3J5ID09IG51bGwpIHsKLQkJCXN1YnRyYWN0ZWRDYXRlZ29yeSA9IG5ldyBFRGF0YVR5cGVFTGlzdDxTdHJpbmc+KFN0cmluZy5jbGFzcywgdGhpcywgVW1hUGFja2FnZS5NRVRIT0RfQ09ORklHVVJBVElPTl9fU1VCVFJBQ1RFRF9DQVRFR09SWSk7Ci0JCX0KLQkJcmV0dXJuIHN1YnRyYWN0ZWRDYXRlZ29yeTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8U3RyaW5nPiBnZXRBZGRlZENhdGVnb3J5KCkgewotCQlpZiAoYWRkZWRDYXRlZ29yeSA9PSBudWxsKSB7Ci0JCQlhZGRlZENhdGVnb3J5ID0gbmV3IEVEYXRhVHlwZUVMaXN0PFN0cmluZz4oU3RyaW5nLmNsYXNzLCB0aGlzLCBVbWFQYWNrYWdlLk1FVEhPRF9DT05GSUdVUkFUSU9OX19BRERFRF9DQVRFR09SWSk7Ci0JCX0KLQkJcmV0dXJuIGFkZGVkQ2F0ZWdvcnk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9DT05GSUdVUkFUSU9OX19CQVNFX0NPTkZJR1VSQVRJT046Ci0JCQkJcmV0dXJuIGdldEJhc2VDb25maWd1cmF0aW9uKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0NPTkZJR1VSQVRJT05fX01FVEhPRF9QTFVHSU5fU0VMRUNUSU9OOgotCQkJCXJldHVybiBnZXRNZXRob2RQbHVnaW5TZWxlY3Rpb24oKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfQ09ORklHVVJBVElPTl9fTUVUSE9EX1BBQ0tBR0VfU0VMRUNUSU9OOgotCQkJCXJldHVybiBnZXRNZXRob2RQYWNrYWdlU2VsZWN0aW9uKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0NPTkZJR1VSQVRJT05fX0RFRkFVTFRfVklFVzoKLQkJCQlyZXR1cm4gZ2V0RGVmYXVsdFZpZXcoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfQ09ORklHVVJBVElPTl9fUFJPQ0VTU19WSUVXOgotCQkJCXJldHVybiBnZXRQcm9jZXNzVmlldygpOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9DT05GSUdVUkFUSU9OX19TVUJUUkFDVEVEX0NBVEVHT1JZOgotCQkJCXJldHVybiBnZXRTdWJ0cmFjdGVkQ2F0ZWdvcnkoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfQ09ORklHVVJBVElPTl9fQURERURfQ0FURUdPUlk6Ci0JCQkJcmV0dXJuIGdldEFkZGVkQ2F0ZWdvcnkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfQ09ORklHVVJBVElPTl9fQkFTRV9DT05GSUdVUkFUSU9OOgotCQkJCWdldEJhc2VDb25maWd1cmF0aW9uKCkuY2xlYXIoKTsKLQkJCQlnZXRCYXNlQ29uZmlndXJhdGlvbigpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgU3RyaW5nPiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9DT05GSUdVUkFUSU9OX19NRVRIT0RfUExVR0lOX1NFTEVDVElPTjoKLQkJCQlnZXRNZXRob2RQbHVnaW5TZWxlY3Rpb24oKS5jbGVhcigpOwotCQkJCWdldE1ldGhvZFBsdWdpblNlbGVjdGlvbigpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgU3RyaW5nPiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9DT05GSUdVUkFUSU9OX19NRVRIT0RfUEFDS0FHRV9TRUxFQ1RJT046Ci0JCQkJZ2V0TWV0aG9kUGFja2FnZVNlbGVjdGlvbigpLmNsZWFyKCk7Ci0JCQkJZ2V0TWV0aG9kUGFja2FnZVNlbGVjdGlvbigpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgU3RyaW5nPiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9DT05GSUdVUkFUSU9OX19ERUZBVUxUX1ZJRVc6Ci0JCQkJc2V0RGVmYXVsdFZpZXcoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9DT05GSUdVUkFUSU9OX19QUk9DRVNTX1ZJRVc6Ci0JCQkJZ2V0UHJvY2Vzc1ZpZXcoKS5jbGVhcigpOwotCQkJCWdldFByb2Nlc3NWaWV3KCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBTdHJpbmc+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0NPTkZJR1VSQVRJT05fX1NVQlRSQUNURURfQ0FURUdPUlk6Ci0JCQkJZ2V0U3VidHJhY3RlZENhdGVnb3J5KCkuY2xlYXIoKTsKLQkJCQlnZXRTdWJ0cmFjdGVkQ2F0ZWdvcnkoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFN0cmluZz4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfQ09ORklHVVJBVElPTl9fQURERURfQ0FURUdPUlk6Ci0JCQkJZ2V0QWRkZWRDYXRlZ29yeSgpLmNsZWFyKCk7Ci0JCQkJZ2V0QWRkZWRDYXRlZ29yeSgpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgU3RyaW5nPiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfQ09ORklHVVJBVElPTl9fQkFTRV9DT05GSUdVUkFUSU9OOgotCQkJCWdldEJhc2VDb25maWd1cmF0aW9uKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0NPTkZJR1VSQVRJT05fX01FVEhPRF9QTFVHSU5fU0VMRUNUSU9OOgotCQkJCWdldE1ldGhvZFBsdWdpblNlbGVjdGlvbigpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9DT05GSUdVUkFUSU9OX19NRVRIT0RfUEFDS0FHRV9TRUxFQ1RJT046Ci0JCQkJZ2V0TWV0aG9kUGFja2FnZVNlbGVjdGlvbigpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9DT05GSUdVUkFUSU9OX19ERUZBVUxUX1ZJRVc6Ci0JCQkJc2V0RGVmYXVsdFZpZXcoREVGQVVMVF9WSUVXX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0NPTkZJR1VSQVRJT05fX1BST0NFU1NfVklFVzoKLQkJCQlnZXRQcm9jZXNzVmlldygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9DT05GSUdVUkFUSU9OX19TVUJUUkFDVEVEX0NBVEVHT1JZOgotCQkJCWdldFN1YnRyYWN0ZWRDYXRlZ29yeSgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9DT05GSUdVUkFUSU9OX19BRERFRF9DQVRFR09SWToKLQkJCQlnZXRBZGRlZENhdGVnb3J5KCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfQ09ORklHVVJBVElPTl9fQkFTRV9DT05GSUdVUkFUSU9OOgotCQkJCXJldHVybiBiYXNlQ29uZmlndXJhdGlvbiAhPSBudWxsICYmICFiYXNlQ29uZmlndXJhdGlvbi5pc0VtcHR5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0NPTkZJR1VSQVRJT05fX01FVEhPRF9QTFVHSU5fU0VMRUNUSU9OOgotCQkJCXJldHVybiBtZXRob2RQbHVnaW5TZWxlY3Rpb24gIT0gbnVsbCAmJiAhbWV0aG9kUGx1Z2luU2VsZWN0aW9uLmlzRW1wdHkoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfQ09ORklHVVJBVElPTl9fTUVUSE9EX1BBQ0tBR0VfU0VMRUNUSU9OOgotCQkJCXJldHVybiBtZXRob2RQYWNrYWdlU2VsZWN0aW9uICE9IG51bGwgJiYgIW1ldGhvZFBhY2thZ2VTZWxlY3Rpb24uaXNFbXB0eSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9DT05GSUdVUkFUSU9OX19ERUZBVUxUX1ZJRVc6Ci0JCQkJcmV0dXJuIERFRkFVTFRfVklFV19FREVGQVVMVCA9PSBudWxsID8gZGVmYXVsdFZpZXcgIT0gbnVsbCA6ICFERUZBVUxUX1ZJRVdfRURFRkFVTFQuZXF1YWxzKGRlZmF1bHRWaWV3KTsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfQ09ORklHVVJBVElPTl9fUFJPQ0VTU19WSUVXOgotCQkJCXJldHVybiBwcm9jZXNzVmlldyAhPSBudWxsICYmICFwcm9jZXNzVmlldy5pc0VtcHR5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0NPTkZJR1VSQVRJT05fX1NVQlRSQUNURURfQ0FURUdPUlk6Ci0JCQkJcmV0dXJuIHN1YnRyYWN0ZWRDYXRlZ29yeSAhPSBudWxsICYmICFzdWJ0cmFjdGVkQ2F0ZWdvcnkuaXNFbXB0eSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9DT05GSUdVUkFUSU9OX19BRERFRF9DQVRFR09SWToKLQkJCQlyZXR1cm4gYWRkZWRDYXRlZ29yeSAhPSBudWxsICYmICFhZGRlZENhdGVnb3J5LmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGJhc2VDb25maWd1cmF0aW9uOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChiYXNlQ29uZmlndXJhdGlvbik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgbWV0aG9kUGx1Z2luU2VsZWN0aW9uOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChtZXRob2RQbHVnaW5TZWxlY3Rpb24pOwotCQlyZXN1bHQuYXBwZW5kKCIsIG1ldGhvZFBhY2thZ2VTZWxlY3Rpb246ICIpOwotCQlyZXN1bHQuYXBwZW5kKG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24pOwotCQlyZXN1bHQuYXBwZW5kKCIsIGRlZmF1bHRWaWV3OiAiKTsKLQkJcmVzdWx0LmFwcGVuZChkZWZhdWx0Vmlldyk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcHJvY2Vzc1ZpZXc6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHByb2Nlc3NWaWV3KTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBzdWJ0cmFjdGVkQ2F0ZWdvcnk6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHN1YnRyYWN0ZWRDYXRlZ29yeSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgYWRkZWRDYXRlZ29yeTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoYWRkZWRDYXRlZ29yeSk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL01ldGhvZENvbmZpZ3VyYXRpb25JbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvTWV0aG9kRWxlbWVudEltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL01ldGhvZEVsZW1lbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1MGQ0OGIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvTWV0aG9kRWxlbWVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyMCArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IE1ldGhvZEVsZW1lbnRJbXBsLmphdmEsdiAxLjIgMjAwOC8wMS8zMCAwMDo0MTo0NyBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuQmFzaWNGZWF0dXJlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db25zdHJhaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kRWxlbWVudFByb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5NZXRob2QgRWxlbWVudDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5NZXRob2RFbGVtZW50SW1wbCNnZXRHcm91cCA8ZW0+R3JvdXA8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuTWV0aG9kRWxlbWVudEltcGwjZ2V0T3duZWRSdWxlIDxlbT5Pd25lZCBSdWxlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLk1ldGhvZEVsZW1lbnRJbXBsI2dldE1ldGhvZEVsZW1lbnRQcm9wZXJ0eSA8ZW0+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuTWV0aG9kRWxlbWVudEltcGwjZ2V0QnJpZWZEZXNjcmlwdGlvbiA8ZW0+QnJpZWYgRGVzY3JpcHRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuTWV0aG9kRWxlbWVudEltcGwjZ2V0SWQgPGVtPklkPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLk1ldGhvZEVsZW1lbnRJbXBsI2dldE9yZGVyaW5nR3VpZGUgPGVtPk9yZGVyaW5nIEd1aWRlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLk1ldGhvZEVsZW1lbnRJbXBsI2dldFByZXNlbnRhdGlvbk5hbWUgPGVtPlByZXNlbnRhdGlvbiBOYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLk1ldGhvZEVsZW1lbnRJbXBsI2lzU3VwcHJlc3NlZCA8ZW0+U3VwcHJlc3NlZDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIE1ldGhvZEVsZW1lbnRJbXBsIGV4dGVuZHMgUGFja2FnZWFibGVFbGVtZW50SW1wbCBpbXBsZW1lbnRzIE1ldGhvZEVsZW1lbnQgewotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEdyb3VwKCkgPGVtPkdyb3VwPC9lbT59JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEdyb3VwKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRmVhdHVyZU1hcCBncm91cDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRCcmllZkRlc2NyaXB0aW9uKCkgPGVtPkJyaWVmIERlc2NyaXB0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRCcmllZkRlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBCUklFRl9ERVNDUklQVElPTl9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRCcmllZkRlc2NyaXB0aW9uKCkgPGVtPkJyaWVmIERlc2NyaXB0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRCcmllZkRlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGJyaWVmRGVzY3JpcHRpb24gPSBCUklFRl9ERVNDUklQVElPTl9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJZCgpIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIElEX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElkKCkgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBpZCA9IElEX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE9yZGVyaW5nR3VpZGUoKSA8ZW0+T3JkZXJpbmcgR3VpZGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE9yZGVyaW5nR3VpZGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE9SREVSSU5HX0dVSURFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE9yZGVyaW5nR3VpZGUoKSA8ZW0+T3JkZXJpbmcgR3VpZGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE9yZGVyaW5nR3VpZGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgb3JkZXJpbmdHdWlkZSA9IE9SREVSSU5HX0dVSURFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByZXNlbnRhdGlvbk5hbWUoKSA8ZW0+UHJlc2VudGF0aW9uIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFByZXNlbnRhdGlvbk5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRVNFTlRBVElPTl9OQU1FX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByZXNlbnRhdGlvbk5hbWUoKSA8ZW0+UHJlc2VudGF0aW9uIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFByZXNlbnRhdGlvbk5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgcHJlc2VudGF0aW9uTmFtZSA9IFBSRVNFTlRBVElPTl9OQU1FX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzU3VwcHJlc3NlZCgpIDxlbT5TdXBwcmVzc2VkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1N1cHByZXNzZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBTVVBQUkVTU0VEX0VERUZBVUxUID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1N1cHByZXNzZWQoKSA8ZW0+U3VwcHJlc3NlZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTdXBwcmVzc2VkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBzdXBwcmVzc2VkID0gU1VQUFJFU1NFRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgU3VwcHJlc3NlZCBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gc3VwcHJlc3NlZEVTZXQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTWV0aG9kRWxlbWVudEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLk1FVEhPRF9FTEVNRU5UOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBGZWF0dXJlTWFwIGdldEdyb3VwKCkgewotCQlpZiAoZ3JvdXAgPT0gbnVsbCkgewotCQkJZ3JvdXAgPSBuZXcgQmFzaWNGZWF0dXJlTWFwKHRoaXMsIFVtYVBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfX0dST1VQKTsKLQkJfQotCQlyZXR1cm4gZ3JvdXA7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PENvbnN0cmFpbnQ+IGdldE93bmVkUnVsZSgpIHsKLQkJcmV0dXJuIGdldEdyb3VwKCkubGlzdChVbWFQYWNrYWdlLkxpdGVyYWxzLk1FVEhPRF9FTEVNRU5UX19PV05FRF9SVUxFKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8TWV0aG9kRWxlbWVudFByb3BlcnR5PiBnZXRNZXRob2RFbGVtZW50UHJvcGVydHkoKSB7Ci0JCXJldHVybiBnZXRHcm91cCgpLmxpc3QoVW1hUGFja2FnZS5MaXRlcmFscy5NRVRIT0RfRUxFTUVOVF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0QnJpZWZEZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIGJyaWVmRGVzY3JpcHRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QnJpZWZEZXNjcmlwdGlvbihTdHJpbmcgbmV3QnJpZWZEZXNjcmlwdGlvbikgewotCQlTdHJpbmcgb2xkQnJpZWZEZXNjcmlwdGlvbiA9IGJyaWVmRGVzY3JpcHRpb247Ci0JCWJyaWVmRGVzY3JpcHRpb24gPSBuZXdCcmllZkRlc2NyaXB0aW9uOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19CUklFRl9ERVNDUklQVElPTiwgb2xkQnJpZWZEZXNjcmlwdGlvbiwgYnJpZWZEZXNjcmlwdGlvbikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCXJldHVybiBpZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJZChTdHJpbmcgbmV3SWQpIHsKLQkJU3RyaW5nIG9sZElkID0gaWQ7Ci0JCWlkID0gbmV3SWQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfX0lELCBvbGRJZCwgaWQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE9yZGVyaW5nR3VpZGUoKSB7Ci0JCXJldHVybiBvcmRlcmluZ0d1aWRlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE9yZGVyaW5nR3VpZGUoU3RyaW5nIG5ld09yZGVyaW5nR3VpZGUpIHsKLQkJU3RyaW5nIG9sZE9yZGVyaW5nR3VpZGUgPSBvcmRlcmluZ0d1aWRlOwotCQlvcmRlcmluZ0d1aWRlID0gbmV3T3JkZXJpbmdHdWlkZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9fT1JERVJJTkdfR1VJREUsIG9sZE9yZGVyaW5nR3VpZGUsIG9yZGVyaW5nR3VpZGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFByZXNlbnRhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBwcmVzZW50YXRpb25OYW1lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFByZXNlbnRhdGlvbk5hbWUoU3RyaW5nIG5ld1ByZXNlbnRhdGlvbk5hbWUpIHsKLQkJU3RyaW5nIG9sZFByZXNlbnRhdGlvbk5hbWUgPSBwcmVzZW50YXRpb25OYW1lOwotCQlwcmVzZW50YXRpb25OYW1lID0gbmV3UHJlc2VudGF0aW9uTmFtZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9fUFJFU0VOVEFUSU9OX05BTUUsIG9sZFByZXNlbnRhdGlvbk5hbWUsIHByZXNlbnRhdGlvbk5hbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1N1cHByZXNzZWQoKSB7Ci0JCXJldHVybiBzdXBwcmVzc2VkOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFN1cHByZXNzZWQoYm9vbGVhbiBuZXdTdXBwcmVzc2VkKSB7Ci0JCWJvb2xlYW4gb2xkU3VwcHJlc3NlZCA9IHN1cHByZXNzZWQ7Ci0JCXN1cHByZXNzZWQgPSBuZXdTdXBwcmVzc2VkOwotCQlib29sZWFuIG9sZFN1cHByZXNzZWRFU2V0ID0gc3VwcHJlc3NlZEVTZXQ7Ci0JCXN1cHByZXNzZWRFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9fU1VQUFJFU1NFRCwgb2xkU3VwcHJlc3NlZCwgc3VwcHJlc3NlZCwgIW9sZFN1cHByZXNzZWRFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRTdXBwcmVzc2VkKCkgewotCQlib29sZWFuIG9sZFN1cHByZXNzZWQgPSBzdXBwcmVzc2VkOwotCQlib29sZWFuIG9sZFN1cHByZXNzZWRFU2V0ID0gc3VwcHJlc3NlZEVTZXQ7Ci0JCXN1cHByZXNzZWQgPSBTVVBQUkVTU0VEX0VERUZBVUxUOwotCQlzdXBwcmVzc2VkRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIFVtYVBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfX1NVUFBSRVNTRUQsIG9sZFN1cHByZXNzZWQsIFNVUFBSRVNTRURfRURFRkFVTFQsIG9sZFN1cHByZXNzZWRFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRTdXBwcmVzc2VkKCkgewotCQlyZXR1cm4gc3VwcHJlc3NlZEVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19HUk9VUDoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldEdyb3VwKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9fT1dORURfUlVMRToKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldE93bmVkUnVsZSgpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0TWV0aG9kRWxlbWVudFByb3BlcnR5KCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19HUk9VUDoKLQkJCQlpZiAoY29yZVR5cGUpIHJldHVybiBnZXRHcm91cCgpOwotCQkJCXJldHVybiAoKEZlYXR1cmVNYXAuSW50ZXJuYWwpZ2V0R3JvdXAoKSkuZ2V0V3JhcHBlcigpOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19PV05FRF9SVUxFOgotCQkJCXJldHVybiBnZXRPd25lZFJ1bGUoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk6Ci0JCQkJcmV0dXJuIGdldE1ldGhvZEVsZW1lbnRQcm9wZXJ0eSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19CUklFRl9ERVNDUklQVElPTjoKLQkJCQlyZXR1cm4gZ2V0QnJpZWZEZXNjcmlwdGlvbigpOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19JRDoKLQkJCQlyZXR1cm4gZ2V0SWQoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9fT1JERVJJTkdfR1VJREU6Ci0JCQkJcmV0dXJuIGdldE9yZGVyaW5nR3VpZGUoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9fUFJFU0VOVEFUSU9OX05BTUU6Ci0JCQkJcmV0dXJuIGdldFByZXNlbnRhdGlvbk5hbWUoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9fU1VQUFJFU1NFRDoKLQkJCQlyZXR1cm4gaXNTdXBwcmVzc2VkKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19HUk9VUDoKLQkJCQkoKEZlYXR1cmVNYXAuSW50ZXJuYWwpZ2V0R3JvdXAoKSkuc2V0KG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfX09XTkVEX1JVTEU6Ci0JCQkJZ2V0T3duZWRSdWxlKCkuY2xlYXIoKTsKLQkJCQlnZXRPd25lZFJ1bGUoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIENvbnN0cmFpbnQ+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOgotCQkJCWdldE1ldGhvZEVsZW1lbnRQcm9wZXJ0eSgpLmNsZWFyKCk7Ci0JCQkJZ2V0TWV0aG9kRWxlbWVudFByb3BlcnR5KCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBNZXRob2RFbGVtZW50UHJvcGVydHk+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfX0JSSUVGX0RFU0NSSVBUSU9OOgotCQkJCXNldEJyaWVmRGVzY3JpcHRpb24oKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19JRDoKLQkJCQlzZXRJZCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfX09SREVSSU5HX0dVSURFOgotCQkJCXNldE9yZGVyaW5nR3VpZGUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19QUkVTRU5UQVRJT05fTkFNRToKLQkJCQlzZXRQcmVzZW50YXRpb25OYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9fU1VQUFJFU1NFRDoKLQkJCQlzZXRTdXBwcmVzc2VkKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfX0dST1VQOgotCQkJCWdldEdyb3VwKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfX09XTkVEX1JVTEU6Ci0JCQkJZ2V0T3duZWRSdWxlKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOgotCQkJCWdldE1ldGhvZEVsZW1lbnRQcm9wZXJ0eSgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19CUklFRl9ERVNDUklQVElPTjoKLQkJCQlzZXRCcmllZkRlc2NyaXB0aW9uKEJSSUVGX0RFU0NSSVBUSU9OX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfX0lEOgotCQkJCXNldElkKElEX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfX09SREVSSU5HX0dVSURFOgotCQkJCXNldE9yZGVyaW5nR3VpZGUoT1JERVJJTkdfR1VJREVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9fUFJFU0VOVEFUSU9OX05BTUU6Ci0JCQkJc2V0UHJlc2VudGF0aW9uTmFtZShQUkVTRU5UQVRJT05fTkFNRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19TVVBQUkVTU0VEOgotCQkJCXVuc2V0U3VwcHJlc3NlZCgpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19HUk9VUDoKLQkJCQlyZXR1cm4gZ3JvdXAgIT0gbnVsbCAmJiAhZ3JvdXAuaXNFbXB0eSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19PV05FRF9SVUxFOgotCQkJCXJldHVybiAhZ2V0T3duZWRSdWxlKCkuaXNFbXB0eSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWToKLQkJCQlyZXR1cm4gIWdldE1ldGhvZEVsZW1lbnRQcm9wZXJ0eSgpLmlzRW1wdHkoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9fQlJJRUZfREVTQ1JJUFRJT046Ci0JCQkJcmV0dXJuIEJSSUVGX0RFU0NSSVBUSU9OX0VERUZBVUxUID09IG51bGwgPyBicmllZkRlc2NyaXB0aW9uICE9IG51bGwgOiAhQlJJRUZfREVTQ1JJUFRJT05fRURFRkFVTFQuZXF1YWxzKGJyaWVmRGVzY3JpcHRpb24pOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19JRDoKLQkJCQlyZXR1cm4gSURfRURFRkFVTFQgPT0gbnVsbCA/IGlkICE9IG51bGwgOiAhSURfRURFRkFVTFQuZXF1YWxzKGlkKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9fT1JERVJJTkdfR1VJREU6Ci0JCQkJcmV0dXJuIE9SREVSSU5HX0dVSURFX0VERUZBVUxUID09IG51bGwgPyBvcmRlcmluZ0d1aWRlICE9IG51bGwgOiAhT1JERVJJTkdfR1VJREVfRURFRkFVTFQuZXF1YWxzKG9yZGVyaW5nR3VpZGUpOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19QUkVTRU5UQVRJT05fTkFNRToKLQkJCQlyZXR1cm4gUFJFU0VOVEFUSU9OX05BTUVfRURFRkFVTFQgPT0gbnVsbCA/IHByZXNlbnRhdGlvbk5hbWUgIT0gbnVsbCA6ICFQUkVTRU5UQVRJT05fTkFNRV9FREVGQVVMVC5lcXVhbHMocHJlc2VudGF0aW9uTmFtZSk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfX1NVUFBSRVNTRUQ6Ci0JCQkJcmV0dXJuIGlzU2V0U3VwcHJlc3NlZCgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoZ3JvdXA6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGdyb3VwKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBicmllZkRlc2NyaXB0aW9uOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChicmllZkRlc2NyaXB0aW9uKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBpZDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoaWQpOwotCQlyZXN1bHQuYXBwZW5kKCIsIG9yZGVyaW5nR3VpZGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKG9yZGVyaW5nR3VpZGUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHByZXNlbnRhdGlvbk5hbWU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHByZXNlbnRhdGlvbk5hbWUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHN1cHByZXNzZWQ6ICIpOwotCQlpZiAoc3VwcHJlc3NlZEVTZXQpIHJlc3VsdC5hcHBlbmQoc3VwcHJlc3NlZCk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9NZXRob2RFbGVtZW50SW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL01ldGhvZEVsZW1lbnRQcm9wZXJ0eUltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL01ldGhvZEVsZW1lbnRQcm9wZXJ0eUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmU5NDBmZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9NZXRob2RFbGVtZW50UHJvcGVydHlJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjYgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBNZXRob2RFbGVtZW50UHJvcGVydHlJbXBsLmphdmEsdiAxLjIgMjAwOC8wMS8zMCAwMDo0MTo0NyBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZEVsZW1lbnRQcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuTWV0aG9kRWxlbWVudFByb3BlcnR5SW1wbCNnZXRWYWx1ZSA8ZW0+VmFsdWU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXRob2RFbGVtZW50UHJvcGVydHlJbXBsIGV4dGVuZHMgUGFja2FnZWFibGVFbGVtZW50SW1wbCBpbXBsZW1lbnRzIE1ldGhvZEVsZW1lbnRQcm9wZXJ0eSB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZhbHVlKCkgPGVtPlZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRWYWx1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMVUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmFsdWUoKSA8ZW0+VmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFZhbHVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHZhbHVlID0gVkFMVUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTWV0aG9kRWxlbWVudFByb3BlcnR5SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpIHsKLQkJcmV0dXJuIHZhbHVlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyBuZXdWYWx1ZSkgewotCQlTdHJpbmcgb2xkVmFsdWUgPSB2YWx1ZTsKLQkJdmFsdWUgPSBuZXdWYWx1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWV9fVkFMVUUsIG9sZFZhbHVlLCB2YWx1ZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWV9fVkFMVUU6Ci0JCQkJcmV0dXJuIGdldFZhbHVlKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWV9fVkFMVUU6Ci0JCQkJc2V0VmFsdWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWV9fVkFMVUU6Ci0JCQkJc2V0VmFsdWUoVkFMVUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX1BST1BFUlRZX19WQUxVRToKLQkJCQlyZXR1cm4gVkFMVUVfRURFRkFVTFQgPT0gbnVsbCA/IHZhbHVlICE9IG51bGwgOiAhVkFMVUVfRURFRkFVTFQuZXF1YWxzKHZhbHVlKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHZhbHVlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZCh2YWx1ZSk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL01ldGhvZEVsZW1lbnRQcm9wZXJ0eUltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9NZXRob2RMaWJyYXJ5SW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvTWV0aG9kTGlicmFyeUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGQ1NWI5NC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9NZXRob2RMaWJyYXJ5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjU4ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogTWV0aG9kTGlicmFyeUltcGwuamF2YSx2IDEuMiAyMDA4LzAxLzMwIDAwOjQxOjQ3IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RMaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+TWV0aG9kIExpYnJhcnk8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuTWV0aG9kTGlicmFyeUltcGwjZ2V0TWV0aG9kUGx1Z2luIDxlbT5NZXRob2QgUGx1Z2luPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLk1ldGhvZExpYnJhcnlJbXBsI2dldE1ldGhvZENvbmZpZ3VyYXRpb24gPGVtPk1ldGhvZCBDb25maWd1cmF0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLk1ldGhvZExpYnJhcnlJbXBsI2dldFRvb2wgPGVtPlRvb2w8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXRob2RMaWJyYXJ5SW1wbCBleHRlbmRzIE1ldGhvZFVuaXRJbXBsIGltcGxlbWVudHMgTWV0aG9kTGlicmFyeSB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWV0aG9kUGx1Z2luKCkgPGVtPk1ldGhvZCBQbHVnaW48L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TWV0aG9kUGx1Z2luKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8TWV0aG9kUGx1Z2luPiBtZXRob2RQbHVnaW47Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNZXRob2RDb25maWd1cmF0aW9uKCkgPGVtPk1ldGhvZCBDb25maWd1cmF0aW9uPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE1ldGhvZENvbmZpZ3VyYXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxNZXRob2RDb25maWd1cmF0aW9uPiBtZXRob2RDb25maWd1cmF0aW9uOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFRvb2woKSA8ZW0+VG9vbDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VG9vbCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVE9PTF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUb29sKCkgPGVtPlRvb2w8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFRvb2woKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgdG9vbCA9IFRPT0xfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTWV0aG9kTGlicmFyeUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLk1FVEhPRF9MSUJSQVJZOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxNZXRob2RQbHVnaW4+IGdldE1ldGhvZFBsdWdpbigpIHsKLQkJaWYgKG1ldGhvZFBsdWdpbiA9PSBudWxsKSB7Ci0JCQltZXRob2RQbHVnaW4gPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8TWV0aG9kUGx1Z2luPihNZXRob2RQbHVnaW4uY2xhc3MsIHRoaXMsIFVtYVBhY2thZ2UuTUVUSE9EX0xJQlJBUllfX01FVEhPRF9QTFVHSU4pOwotCQl9Ci0JCXJldHVybiBtZXRob2RQbHVnaW47Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PE1ldGhvZENvbmZpZ3VyYXRpb24+IGdldE1ldGhvZENvbmZpZ3VyYXRpb24oKSB7Ci0JCWlmIChtZXRob2RDb25maWd1cmF0aW9uID09IG51bGwpIHsKLQkJCW1ldGhvZENvbmZpZ3VyYXRpb24gPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8TWV0aG9kQ29uZmlndXJhdGlvbj4oTWV0aG9kQ29uZmlndXJhdGlvbi5jbGFzcywgdGhpcywgVW1hUGFja2FnZS5NRVRIT0RfTElCUkFSWV9fTUVUSE9EX0NPTkZJR1VSQVRJT04pOwotCQl9Ci0JCXJldHVybiBtZXRob2RDb25maWd1cmF0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VG9vbCgpIHsKLQkJcmV0dXJuIHRvb2w7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VG9vbChTdHJpbmcgbmV3VG9vbCkgewotCQlTdHJpbmcgb2xkVG9vbCA9IHRvb2w7Ci0JCXRvb2wgPSBuZXdUb29sOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLk1FVEhPRF9MSUJSQVJZX19UT09MLCBvbGRUb29sLCB0b29sKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9MSUJSQVJZX19NRVRIT0RfUExVR0lOOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0TWV0aG9kUGx1Z2luKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfTElCUkFSWV9fTUVUSE9EX0NPTkZJR1VSQVRJT046Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRNZXRob2RDb25maWd1cmF0aW9uKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9MSUJSQVJZX19NRVRIT0RfUExVR0lOOgotCQkJCXJldHVybiBnZXRNZXRob2RQbHVnaW4oKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfTElCUkFSWV9fTUVUSE9EX0NPTkZJR1VSQVRJT046Ci0JCQkJcmV0dXJuIGdldE1ldGhvZENvbmZpZ3VyYXRpb24oKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfTElCUkFSWV9fVE9PTDoKLQkJCQlyZXR1cm4gZ2V0VG9vbCgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9MSUJSQVJZX19NRVRIT0RfUExVR0lOOgotCQkJCWdldE1ldGhvZFBsdWdpbigpLmNsZWFyKCk7Ci0JCQkJZ2V0TWV0aG9kUGx1Z2luKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBNZXRob2RQbHVnaW4+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0xJQlJBUllfX01FVEhPRF9DT05GSUdVUkFUSU9OOgotCQkJCWdldE1ldGhvZENvbmZpZ3VyYXRpb24oKS5jbGVhcigpOwotCQkJCWdldE1ldGhvZENvbmZpZ3VyYXRpb24oKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIE1ldGhvZENvbmZpZ3VyYXRpb24+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0xJQlJBUllfX1RPT0w6Ci0JCQkJc2V0VG9vbCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9MSUJSQVJZX19NRVRIT0RfUExVR0lOOgotCQkJCWdldE1ldGhvZFBsdWdpbigpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9MSUJSQVJZX19NRVRIT0RfQ09ORklHVVJBVElPTjoKLQkJCQlnZXRNZXRob2RDb25maWd1cmF0aW9uKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0xJQlJBUllfX1RPT0w6Ci0JCQkJc2V0VG9vbChUT09MX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfTElCUkFSWV9fTUVUSE9EX1BMVUdJTjoKLQkJCQlyZXR1cm4gbWV0aG9kUGx1Z2luICE9IG51bGwgJiYgIW1ldGhvZFBsdWdpbi5pc0VtcHR5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0xJQlJBUllfX01FVEhPRF9DT05GSUdVUkFUSU9OOgotCQkJCXJldHVybiBtZXRob2RDb25maWd1cmF0aW9uICE9IG51bGwgJiYgIW1ldGhvZENvbmZpZ3VyYXRpb24uaXNFbXB0eSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9MSUJSQVJZX19UT09MOgotCQkJCXJldHVybiBUT09MX0VERUZBVUxUID09IG51bGwgPyB0b29sICE9IG51bGwgOiAhVE9PTF9FREVGQVVMVC5lcXVhbHModG9vbCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiICh0b29sOiAiKTsKLQkJcmVzdWx0LmFwcGVuZCh0b29sKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vTWV0aG9kTGlicmFyeUltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9NZXRob2RQYWNrYWdlSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvTWV0aG9kUGFja2FnZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODFlMTlkYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9NZXRob2RQYWNrYWdlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAwICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogTWV0aG9kUGFja2FnZUltcGwuamF2YSx2IDEuMiAyMDA4LzAxLzMwIDAwOjQxOjQ3IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5CYXNpY0ZlYXR1cmVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk1ldGhvZCBQYWNrYWdlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLk1ldGhvZFBhY2thZ2VJbXBsI2dldEdyb3VwMSA8ZW0+R3JvdXAxPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLk1ldGhvZFBhY2thZ2VJbXBsI2dldFJldXNlZFBhY2thZ2UgPGVtPlJldXNlZCBQYWNrYWdlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLk1ldGhvZFBhY2thZ2VJbXBsI2dldE1ldGhvZFBhY2thZ2UgPGVtPk1ldGhvZCBQYWNrYWdlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLk1ldGhvZFBhY2thZ2VJbXBsI2lzR2xvYmFsIDxlbT5HbG9iYWw8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXRob2RQYWNrYWdlSW1wbCBleHRlbmRzIE1ldGhvZEVsZW1lbnRJbXBsIGltcGxlbWVudHMgTWV0aG9kUGFja2FnZSB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0R3JvdXAxKCkgPGVtPkdyb3VwMTwvZW0+fScgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRHcm91cDEoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBGZWF0dXJlTWFwIGdyb3VwMTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0dsb2JhbCgpIDxlbT5HbG9iYWw8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzR2xvYmFsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gR0xPQkFMX0VERUZBVUxUID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0dsb2JhbCgpIDxlbT5HbG9iYWw8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzR2xvYmFsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBnbG9iYWwgPSBHTE9CQUxfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIEdsb2JhbCBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gZ2xvYmFsRVNldDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBNZXRob2RQYWNrYWdlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuTUVUSE9EX1BBQ0tBR0U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEZlYXR1cmVNYXAgZ2V0R3JvdXAxKCkgewotCQlpZiAoZ3JvdXAxID09IG51bGwpIHsKLQkJCWdyb3VwMSA9IG5ldyBCYXNpY0ZlYXR1cmVNYXAodGhpcywgVW1hUGFja2FnZS5NRVRIT0RfUEFDS0FHRV9fR1JPVVAxKTsKLQkJfQotCQlyZXR1cm4gZ3JvdXAxOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxTdHJpbmc+IGdldFJldXNlZFBhY2thZ2UoKSB7Ci0JCXJldHVybiBnZXRHcm91cDEoKS5saXN0KFVtYVBhY2thZ2UuTGl0ZXJhbHMuTUVUSE9EX1BBQ0tBR0VfX1JFVVNFRF9QQUNLQUdFKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8TWV0aG9kUGFja2FnZT4gZ2V0TWV0aG9kUGFja2FnZSgpIHsKLQkJcmV0dXJuIGdldEdyb3VwMSgpLmxpc3QoVW1hUGFja2FnZS5MaXRlcmFscy5NRVRIT0RfUEFDS0FHRV9fTUVUSE9EX1BBQ0tBR0UpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzR2xvYmFsKCkgewotCQlyZXR1cm4gZ2xvYmFsOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEdsb2JhbChib29sZWFuIG5ld0dsb2JhbCkgewotCQlib29sZWFuIG9sZEdsb2JhbCA9IGdsb2JhbDsKLQkJZ2xvYmFsID0gbmV3R2xvYmFsOwotCQlib29sZWFuIG9sZEdsb2JhbEVTZXQgPSBnbG9iYWxFU2V0OwotCQlnbG9iYWxFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5NRVRIT0RfUEFDS0FHRV9fR0xPQkFMLCBvbGRHbG9iYWwsIGdsb2JhbCwgIW9sZEdsb2JhbEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldEdsb2JhbCgpIHsKLQkJYm9vbGVhbiBvbGRHbG9iYWwgPSBnbG9iYWw7Ci0JCWJvb2xlYW4gb2xkR2xvYmFsRVNldCA9IGdsb2JhbEVTZXQ7Ci0JCWdsb2JhbCA9IEdMT0JBTF9FREVGQVVMVDsKLQkJZ2xvYmFsRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIFVtYVBhY2thZ2UuTUVUSE9EX1BBQ0tBR0VfX0dMT0JBTCwgb2xkR2xvYmFsLCBHTE9CQUxfRURFRkFVTFQsIG9sZEdsb2JhbEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldEdsb2JhbCgpIHsKLQkJcmV0dXJuIGdsb2JhbEVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9QQUNLQUdFX19HUk9VUDE6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRHcm91cDEoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9QQUNLQUdFX19NRVRIT0RfUEFDS0FHRToKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldE1ldGhvZFBhY2thZ2UoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1BBQ0tBR0VfX0dST1VQMToKLQkJCQlpZiAoY29yZVR5cGUpIHJldHVybiBnZXRHcm91cDEoKTsKLQkJCQlyZXR1cm4gKChGZWF0dXJlTWFwLkludGVybmFsKWdldEdyb3VwMSgpKS5nZXRXcmFwcGVyKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1BBQ0tBR0VfX1JFVVNFRF9QQUNLQUdFOgotCQkJCXJldHVybiBnZXRSZXVzZWRQYWNrYWdlKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1BBQ0tBR0VfX01FVEhPRF9QQUNLQUdFOgotCQkJCXJldHVybiBnZXRNZXRob2RQYWNrYWdlKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1BBQ0tBR0VfX0dMT0JBTDoKLQkJCQlyZXR1cm4gaXNHbG9iYWwoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1BBQ0tBR0VfX0dST1VQMToKLQkJCQkoKEZlYXR1cmVNYXAuSW50ZXJuYWwpZ2V0R3JvdXAxKCkpLnNldChuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9QQUNLQUdFX19SRVVTRURfUEFDS0FHRToKLQkJCQlnZXRSZXVzZWRQYWNrYWdlKCkuY2xlYXIoKTsKLQkJCQlnZXRSZXVzZWRQYWNrYWdlKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBTdHJpbmc+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1BBQ0tBR0VfX01FVEhPRF9QQUNLQUdFOgotCQkJCWdldE1ldGhvZFBhY2thZ2UoKS5jbGVhcigpOwotCQkJCWdldE1ldGhvZFBhY2thZ2UoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIE1ldGhvZFBhY2thZ2U+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1BBQ0tBR0VfX0dMT0JBTDoKLQkJCQlzZXRHbG9iYWwoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfUEFDS0FHRV9fR1JPVVAxOgotCQkJCWdldEdyb3VwMSgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9QQUNLQUdFX19SRVVTRURfUEFDS0FHRToKLQkJCQlnZXRSZXVzZWRQYWNrYWdlKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1BBQ0tBR0VfX01FVEhPRF9QQUNLQUdFOgotCQkJCWdldE1ldGhvZFBhY2thZ2UoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfUEFDS0FHRV9fR0xPQkFMOgotCQkJCXVuc2V0R2xvYmFsKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1BBQ0tBR0VfX0dST1VQMToKLQkJCQlyZXR1cm4gZ3JvdXAxICE9IG51bGwgJiYgIWdyb3VwMS5pc0VtcHR5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1BBQ0tBR0VfX1JFVVNFRF9QQUNLQUdFOgotCQkJCXJldHVybiAhZ2V0UmV1c2VkUGFja2FnZSgpLmlzRW1wdHkoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfUEFDS0FHRV9fTUVUSE9EX1BBQ0tBR0U6Ci0JCQkJcmV0dXJuICFnZXRNZXRob2RQYWNrYWdlKCkuaXNFbXB0eSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9QQUNLQUdFX19HTE9CQUw6Ci0JCQkJcmV0dXJuIGlzU2V0R2xvYmFsKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChncm91cDE6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGdyb3VwMSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZ2xvYmFsOiAiKTsKLQkJaWYgKGdsb2JhbEVTZXQpIHJlc3VsdC5hcHBlbmQoZ2xvYmFsKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL01ldGhvZFBhY2thZ2VJbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvTWV0aG9kUGx1Z2luSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvTWV0aG9kUGx1Z2luSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YzIzYjU0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL01ldGhvZFBsdWdpbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5MSArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IE1ldGhvZFBsdWdpbkltcGwuamF2YSx2IDEuMiAyMDA4LzAxLzMwIDAwOjQxOjQ3IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FRGF0YVR5cGVFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5NZXRob2QgUGx1Z2luPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLk1ldGhvZFBsdWdpbkltcGwjZ2V0UmVmZXJlbmNlZE1ldGhvZFBsdWdpbiA8ZW0+UmVmZXJlbmNlZCBNZXRob2QgUGx1Z2luPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLk1ldGhvZFBsdWdpbkltcGwjZ2V0TWV0aG9kUGFja2FnZSA8ZW0+TWV0aG9kIFBhY2thZ2U8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuTWV0aG9kUGx1Z2luSW1wbCNpc1VzZXJDaGFuZ2VhYmxlIDxlbT5Vc2VyIENoYW5nZWFibGU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXRob2RQbHVnaW5JbXBsIGV4dGVuZHMgTWV0aG9kVW5pdEltcGwgaW1wbGVtZW50cyBNZXRob2RQbHVnaW4gewotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlZmVyZW5jZWRNZXRob2RQbHVnaW4oKSA8ZW0+UmVmZXJlbmNlZCBNZXRob2QgUGx1Z2luPC9lbT59JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJlZmVyZW5jZWRNZXRob2RQbHVnaW4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxTdHJpbmc+IHJlZmVyZW5jZWRNZXRob2RQbHVnaW47Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNZXRob2RQYWNrYWdlKCkgPGVtPk1ldGhvZCBQYWNrYWdlPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE1ldGhvZFBhY2thZ2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxNZXRob2RQYWNrYWdlPiBtZXRob2RQYWNrYWdlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzVXNlckNoYW5nZWFibGUoKSA8ZW0+VXNlciBDaGFuZ2VhYmxlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1VzZXJDaGFuZ2VhYmxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gVVNFUl9DSEFOR0VBQkxFX0VERUZBVUxUID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1VzZXJDaGFuZ2VhYmxlKCkgPGVtPlVzZXIgQ2hhbmdlYWJsZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNVc2VyQ2hhbmdlYWJsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gdXNlckNoYW5nZWFibGUgPSBVU0VSX0NIQU5HRUFCTEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIFVzZXIgQ2hhbmdlYWJsZSBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gdXNlckNoYW5nZWFibGVFU2V0OwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE1ldGhvZFBsdWdpbkltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLk1FVEhPRF9QTFVHSU47Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFN0cmluZz4gZ2V0UmVmZXJlbmNlZE1ldGhvZFBsdWdpbigpIHsKLQkJaWYgKHJlZmVyZW5jZWRNZXRob2RQbHVnaW4gPT0gbnVsbCkgewotCQkJcmVmZXJlbmNlZE1ldGhvZFBsdWdpbiA9IG5ldyBFRGF0YVR5cGVFTGlzdDxTdHJpbmc+KFN0cmluZy5jbGFzcywgdGhpcywgVW1hUGFja2FnZS5NRVRIT0RfUExVR0lOX19SRUZFUkVOQ0VEX01FVEhPRF9QTFVHSU4pOwotCQl9Ci0JCXJldHVybiByZWZlcmVuY2VkTWV0aG9kUGx1Z2luOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxNZXRob2RQYWNrYWdlPiBnZXRNZXRob2RQYWNrYWdlKCkgewotCQlpZiAobWV0aG9kUGFja2FnZSA9PSBudWxsKSB7Ci0JCQltZXRob2RQYWNrYWdlID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PE1ldGhvZFBhY2thZ2U+KE1ldGhvZFBhY2thZ2UuY2xhc3MsIHRoaXMsIFVtYVBhY2thZ2UuTUVUSE9EX1BMVUdJTl9fTUVUSE9EX1BBQ0tBR0UpOwotCQl9Ci0JCXJldHVybiBtZXRob2RQYWNrYWdlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzVXNlckNoYW5nZWFibGUoKSB7Ci0JCXJldHVybiB1c2VyQ2hhbmdlYWJsZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRVc2VyQ2hhbmdlYWJsZShib29sZWFuIG5ld1VzZXJDaGFuZ2VhYmxlKSB7Ci0JCWJvb2xlYW4gb2xkVXNlckNoYW5nZWFibGUgPSB1c2VyQ2hhbmdlYWJsZTsKLQkJdXNlckNoYW5nZWFibGUgPSBuZXdVc2VyQ2hhbmdlYWJsZTsKLQkJYm9vbGVhbiBvbGRVc2VyQ2hhbmdlYWJsZUVTZXQgPSB1c2VyQ2hhbmdlYWJsZUVTZXQ7Ci0JCXVzZXJDaGFuZ2VhYmxlRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuTUVUSE9EX1BMVUdJTl9fVVNFUl9DSEFOR0VBQkxFLCBvbGRVc2VyQ2hhbmdlYWJsZSwgdXNlckNoYW5nZWFibGUsICFvbGRVc2VyQ2hhbmdlYWJsZUVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldFVzZXJDaGFuZ2VhYmxlKCkgewotCQlib29sZWFuIG9sZFVzZXJDaGFuZ2VhYmxlID0gdXNlckNoYW5nZWFibGU7Ci0JCWJvb2xlYW4gb2xkVXNlckNoYW5nZWFibGVFU2V0ID0gdXNlckNoYW5nZWFibGVFU2V0OwotCQl1c2VyQ2hhbmdlYWJsZSA9IFVTRVJfQ0hBTkdFQUJMRV9FREVGQVVMVDsKLQkJdXNlckNoYW5nZWFibGVFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgVW1hUGFja2FnZS5NRVRIT0RfUExVR0lOX19VU0VSX0NIQU5HRUFCTEUsIG9sZFVzZXJDaGFuZ2VhYmxlLCBVU0VSX0NIQU5HRUFCTEVfRURFRkFVTFQsIG9sZFVzZXJDaGFuZ2VhYmxlRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0VXNlckNoYW5nZWFibGUoKSB7Ci0JCXJldHVybiB1c2VyQ2hhbmdlYWJsZUVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9QTFVHSU5fX01FVEhPRF9QQUNLQUdFOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0TWV0aG9kUGFja2FnZSgpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfUExVR0lOX19SRUZFUkVOQ0VEX01FVEhPRF9QTFVHSU46Ci0JCQkJcmV0dXJuIGdldFJlZmVyZW5jZWRNZXRob2RQbHVnaW4oKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfUExVR0lOX19NRVRIT0RfUEFDS0FHRToKLQkJCQlyZXR1cm4gZ2V0TWV0aG9kUGFja2FnZSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9QTFVHSU5fX1VTRVJfQ0hBTkdFQUJMRToKLQkJCQlyZXR1cm4gaXNVc2VyQ2hhbmdlYWJsZSgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfUExVR0lOX19SRUZFUkVOQ0VEX01FVEhPRF9QTFVHSU46Ci0JCQkJZ2V0UmVmZXJlbmNlZE1ldGhvZFBsdWdpbigpLmNsZWFyKCk7Ci0JCQkJZ2V0UmVmZXJlbmNlZE1ldGhvZFBsdWdpbigpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgU3RyaW5nPiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9QTFVHSU5fX01FVEhPRF9QQUNLQUdFOgotCQkJCWdldE1ldGhvZFBhY2thZ2UoKS5jbGVhcigpOwotCQkJCWdldE1ldGhvZFBhY2thZ2UoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIE1ldGhvZFBhY2thZ2U+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1BMVUdJTl9fVVNFUl9DSEFOR0VBQkxFOgotCQkJCXNldFVzZXJDaGFuZ2VhYmxlKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1BMVUdJTl9fUkVGRVJFTkNFRF9NRVRIT0RfUExVR0lOOgotCQkJCWdldFJlZmVyZW5jZWRNZXRob2RQbHVnaW4oKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfUExVR0lOX19NRVRIT0RfUEFDS0FHRToKLQkJCQlnZXRNZXRob2RQYWNrYWdlKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1BMVUdJTl9fVVNFUl9DSEFOR0VBQkxFOgotCQkJCXVuc2V0VXNlckNoYW5nZWFibGUoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfUExVR0lOX19SRUZFUkVOQ0VEX01FVEhPRF9QTFVHSU46Ci0JCQkJcmV0dXJuIHJlZmVyZW5jZWRNZXRob2RQbHVnaW4gIT0gbnVsbCAmJiAhcmVmZXJlbmNlZE1ldGhvZFBsdWdpbi5pc0VtcHR5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1BMVUdJTl9fTUVUSE9EX1BBQ0tBR0U6Ci0JCQkJcmV0dXJuIG1ldGhvZFBhY2thZ2UgIT0gbnVsbCAmJiAhbWV0aG9kUGFja2FnZS5pc0VtcHR5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1BMVUdJTl9fVVNFUl9DSEFOR0VBQkxFOgotCQkJCXJldHVybiBpc1NldFVzZXJDaGFuZ2VhYmxlKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChyZWZlcmVuY2VkTWV0aG9kUGx1Z2luOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChyZWZlcmVuY2VkTWV0aG9kUGx1Z2luKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCB1c2VyQ2hhbmdlYWJsZTogIik7Ci0JCWlmICh1c2VyQ2hhbmdlYWJsZUVTZXQpIHJlc3VsdC5hcHBlbmQodXNlckNoYW5nZWFibGUpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vTWV0aG9kUGx1Z2luSW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL01ldGhvZFVuaXRJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9NZXRob2RVbml0SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZTM1ZjliLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL01ldGhvZFVuaXRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzODAgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBNZXRob2RVbml0SW1wbC5qYXZhLHYgMS4yIDIwMDgvMDEvMzAgMDA6NDE6NDcga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGw7Ci0KLWltcG9ydCBqYXZheC54bWwuZGF0YXR5cGUuWE1MR3JlZ29yaWFuQ2FsZW5kYXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+TWV0aG9kIFVuaXQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuTWV0aG9kVW5pdEltcGwjZ2V0Q29weXJpZ2h0IDxlbT5Db3B5cmlnaHQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuTWV0aG9kVW5pdEltcGwjZ2V0QXV0aG9ycyA8ZW0+QXV0aG9yczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5NZXRob2RVbml0SW1wbCNnZXRDaGFuZ2VEYXRlIDxlbT5DaGFuZ2UgRGF0ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5NZXRob2RVbml0SW1wbCNnZXRDaGFuZ2VEZXNjcmlwdGlvbiA8ZW0+Q2hhbmdlIERlc2NyaXB0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLk1ldGhvZFVuaXRJbXBsI2dldFZlcnNpb24gPGVtPlZlcnNpb248L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXRob2RVbml0SW1wbCBleHRlbmRzIE1ldGhvZEVsZW1lbnRJbXBsIGltcGxlbWVudHMgTWV0aG9kVW5pdCB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENvcHlyaWdodCgpIDxlbT5Db3B5cmlnaHQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENvcHlyaWdodCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09QWVJJR0hUX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENvcHlyaWdodCgpIDxlbT5Db3B5cmlnaHQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENvcHlyaWdodCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBjb3B5cmlnaHQgPSBDT1BZUklHSFRfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QXV0aG9ycygpIDxlbT5BdXRob3JzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBdXRob3JzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBBVVRIT1JTX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEF1dGhvcnMoKSA8ZW0+QXV0aG9yczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QXV0aG9ycygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBhdXRob3JzID0gQVVUSE9SU19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDaGFuZ2VEYXRlKCkgPGVtPkNoYW5nZSBEYXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDaGFuZ2VEYXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFhNTEdyZWdvcmlhbkNhbGVuZGFyIENIQU5HRV9EQVRFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENoYW5nZURhdGUoKSA8ZW0+Q2hhbmdlIERhdGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENoYW5nZURhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBYTUxHcmVnb3JpYW5DYWxlbmRhciBjaGFuZ2VEYXRlID0gQ0hBTkdFX0RBVEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q2hhbmdlRGVzY3JpcHRpb24oKSA8ZW0+Q2hhbmdlIERlc2NyaXB0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDaGFuZ2VEZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hBTkdFX0RFU0NSSVBUSU9OX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENoYW5nZURlc2NyaXB0aW9uKCkgPGVtPkNoYW5nZSBEZXNjcmlwdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q2hhbmdlRGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgY2hhbmdlRGVzY3JpcHRpb24gPSBDSEFOR0VfREVTQ1JJUFRJT05fRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmVyc2lvbigpIDxlbT5WZXJzaW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRWZXJzaW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBWRVJTSU9OX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZlcnNpb24oKSA8ZW0+VmVyc2lvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VmVyc2lvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyB2ZXJzaW9uID0gVkVSU0lPTl9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBNZXRob2RVbml0SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuTUVUSE9EX1VOSVQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDb3B5cmlnaHQoKSB7Ci0JCXJldHVybiBjb3B5cmlnaHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29weXJpZ2h0KFN0cmluZyBuZXdDb3B5cmlnaHQpIHsKLQkJU3RyaW5nIG9sZENvcHlyaWdodCA9IGNvcHlyaWdodDsKLQkJY29weXJpZ2h0ID0gbmV3Q29weXJpZ2h0OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLk1FVEhPRF9VTklUX19DT1BZUklHSFQsIG9sZENvcHlyaWdodCwgY29weXJpZ2h0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRBdXRob3JzKCkgewotCQlyZXR1cm4gYXV0aG9yczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBdXRob3JzKFN0cmluZyBuZXdBdXRob3JzKSB7Ci0JCVN0cmluZyBvbGRBdXRob3JzID0gYXV0aG9yczsKLQkJYXV0aG9ycyA9IG5ld0F1dGhvcnM7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuTUVUSE9EX1VOSVRfX0FVVEhPUlMsIG9sZEF1dGhvcnMsIGF1dGhvcnMpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWE1MR3JlZ29yaWFuQ2FsZW5kYXIgZ2V0Q2hhbmdlRGF0ZSgpIHsKLQkJcmV0dXJuIGNoYW5nZURhdGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q2hhbmdlRGF0ZShYTUxHcmVnb3JpYW5DYWxlbmRhciBuZXdDaGFuZ2VEYXRlKSB7Ci0JCVhNTEdyZWdvcmlhbkNhbGVuZGFyIG9sZENoYW5nZURhdGUgPSBjaGFuZ2VEYXRlOwotCQljaGFuZ2VEYXRlID0gbmV3Q2hhbmdlRGF0ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5NRVRIT0RfVU5JVF9fQ0hBTkdFX0RBVEUsIG9sZENoYW5nZURhdGUsIGNoYW5nZURhdGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENoYW5nZURlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gY2hhbmdlRGVzY3JpcHRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q2hhbmdlRGVzY3JpcHRpb24oU3RyaW5nIG5ld0NoYW5nZURlc2NyaXB0aW9uKSB7Ci0JCVN0cmluZyBvbGRDaGFuZ2VEZXNjcmlwdGlvbiA9IGNoYW5nZURlc2NyaXB0aW9uOwotCQljaGFuZ2VEZXNjcmlwdGlvbiA9IG5ld0NoYW5nZURlc2NyaXB0aW9uOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLk1FVEhPRF9VTklUX19DSEFOR0VfREVTQ1JJUFRJT04sIG9sZENoYW5nZURlc2NyaXB0aW9uLCBjaGFuZ2VEZXNjcmlwdGlvbikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VmVyc2lvbigpIHsKLQkJcmV0dXJuIHZlcnNpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmVyc2lvbihTdHJpbmcgbmV3VmVyc2lvbikgewotCQlTdHJpbmcgb2xkVmVyc2lvbiA9IHZlcnNpb247Ci0JCXZlcnNpb24gPSBuZXdWZXJzaW9uOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLk1FVEhPRF9VTklUX19WRVJTSU9OLCBvbGRWZXJzaW9uLCB2ZXJzaW9uKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9VTklUX19DT1BZUklHSFQ6Ci0JCQkJcmV0dXJuIGdldENvcHlyaWdodCgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9VTklUX19BVVRIT1JTOgotCQkJCXJldHVybiBnZXRBdXRob3JzKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1VOSVRfX0NIQU5HRV9EQVRFOgotCQkJCXJldHVybiBnZXRDaGFuZ2VEYXRlKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1VOSVRfX0NIQU5HRV9ERVNDUklQVElPTjoKLQkJCQlyZXR1cm4gZ2V0Q2hhbmdlRGVzY3JpcHRpb24oKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfVU5JVF9fVkVSU0lPTjoKLQkJCQlyZXR1cm4gZ2V0VmVyc2lvbigpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1VOSVRfX0NPUFlSSUdIVDoKLQkJCQlzZXRDb3B5cmlnaHQoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9VTklUX19BVVRIT1JTOgotCQkJCXNldEF1dGhvcnMoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9VTklUX19DSEFOR0VfREFURToKLQkJCQlzZXRDaGFuZ2VEYXRlKChYTUxHcmVnb3JpYW5DYWxlbmRhciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9VTklUX19DSEFOR0VfREVTQ1JJUFRJT046Ci0JCQkJc2V0Q2hhbmdlRGVzY3JpcHRpb24oKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9VTklUX19WRVJTSU9OOgotCQkJCXNldFZlcnNpb24oKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfVU5JVF9fQ09QWVJJR0hUOgotCQkJCXNldENvcHlyaWdodChDT1BZUklHSFRfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfVU5JVF9fQVVUSE9SUzoKLQkJCQlzZXRBdXRob3JzKEFVVEhPUlNfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfVU5JVF9fQ0hBTkdFX0RBVEU6Ci0JCQkJc2V0Q2hhbmdlRGF0ZShDSEFOR0VfREFURV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9VTklUX19DSEFOR0VfREVTQ1JJUFRJT046Ci0JCQkJc2V0Q2hhbmdlRGVzY3JpcHRpb24oQ0hBTkdFX0RFU0NSSVBUSU9OX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1VOSVRfX1ZFUlNJT046Ci0JCQkJc2V0VmVyc2lvbihWRVJTSU9OX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfVU5JVF9fQ09QWVJJR0hUOgotCQkJCXJldHVybiBDT1BZUklHSFRfRURFRkFVTFQgPT0gbnVsbCA/IGNvcHlyaWdodCAhPSBudWxsIDogIUNPUFlSSUdIVF9FREVGQVVMVC5lcXVhbHMoY29weXJpZ2h0KTsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfVU5JVF9fQVVUSE9SUzoKLQkJCQlyZXR1cm4gQVVUSE9SU19FREVGQVVMVCA9PSBudWxsID8gYXV0aG9ycyAhPSBudWxsIDogIUFVVEhPUlNfRURFRkFVTFQuZXF1YWxzKGF1dGhvcnMpOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9VTklUX19DSEFOR0VfREFURToKLQkJCQlyZXR1cm4gQ0hBTkdFX0RBVEVfRURFRkFVTFQgPT0gbnVsbCA/IGNoYW5nZURhdGUgIT0gbnVsbCA6ICFDSEFOR0VfREFURV9FREVGQVVMVC5lcXVhbHMoY2hhbmdlRGF0ZSk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1VOSVRfX0NIQU5HRV9ERVNDUklQVElPTjoKLQkJCQlyZXR1cm4gQ0hBTkdFX0RFU0NSSVBUSU9OX0VERUZBVUxUID09IG51bGwgPyBjaGFuZ2VEZXNjcmlwdGlvbiAhPSBudWxsIDogIUNIQU5HRV9ERVNDUklQVElPTl9FREVGQVVMVC5lcXVhbHMoY2hhbmdlRGVzY3JpcHRpb24pOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9VTklUX19WRVJTSU9OOgotCQkJCXJldHVybiBWRVJTSU9OX0VERUZBVUxUID09IG51bGwgPyB2ZXJzaW9uICE9IG51bGwgOiAhVkVSU0lPTl9FREVGQVVMVC5lcXVhbHModmVyc2lvbik7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChjb3B5cmlnaHQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGNvcHlyaWdodCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgYXV0aG9yczogIik7Ci0JCXJlc3VsdC5hcHBlbmQoYXV0aG9ycyk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgY2hhbmdlRGF0ZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoY2hhbmdlRGF0ZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgY2hhbmdlRGVzY3JpcHRpb246ICIpOwotCQlyZXN1bHQuYXBwZW5kKGNoYW5nZURlc2NyaXB0aW9uKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCB2ZXJzaW9uOiAiKTsKLQkJcmVzdWx0LmFwcGVuZCh2ZXJzaW9uKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vTWV0aG9kVW5pdEltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9NaWxlc3RvbmVJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9NaWxlc3RvbmVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1NTdmZTcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvTWlsZXN0b25lSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ3ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogTWlsZXN0b25lSW1wbC5qYXZhLHYgMS4yIDIwMDgvMDEvMzAgMDA6NDE6NDcga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FRGF0YVR5cGVFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NaWxlc3RvbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk1pbGVzdG9uZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5NaWxlc3RvbmVJbXBsI2dldFJlcXVpcmVkUmVzdWx0IDxlbT5SZXF1aXJlZCBSZXN1bHQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBNaWxlc3RvbmVJbXBsIGV4dGVuZHMgV29ya0JyZWFrZG93bkVsZW1lbnRJbXBsIGltcGxlbWVudHMgTWlsZXN0b25lIHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZXF1aXJlZFJlc3VsdCgpIDxlbT5SZXF1aXJlZCBSZXN1bHQ8L2VtPn0nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmVxdWlyZWRSZXN1bHQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxTdHJpbmc+IHJlcXVpcmVkUmVzdWx0OwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE1pbGVzdG9uZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLk1JTEVTVE9ORTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8U3RyaW5nPiBnZXRSZXF1aXJlZFJlc3VsdCgpIHsKLQkJaWYgKHJlcXVpcmVkUmVzdWx0ID09IG51bGwpIHsKLQkJCXJlcXVpcmVkUmVzdWx0ID0gbmV3IEVEYXRhVHlwZUVMaXN0PFN0cmluZz4oU3RyaW5nLmNsYXNzLCB0aGlzLCBVbWFQYWNrYWdlLk1JTEVTVE9ORV9fUkVRVUlSRURfUkVTVUxUKTsKLQkJfQotCQlyZXR1cm4gcmVxdWlyZWRSZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLk1JTEVTVE9ORV9fUkVRVUlSRURfUkVTVUxUOgotCQkJCXJldHVybiBnZXRSZXF1aXJlZFJlc3VsdCgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLk1JTEVTVE9ORV9fUkVRVUlSRURfUkVTVUxUOgotCQkJCWdldFJlcXVpcmVkUmVzdWx0KCkuY2xlYXIoKTsKLQkJCQlnZXRSZXF1aXJlZFJlc3VsdCgpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgU3RyaW5nPiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5NSUxFU1RPTkVfX1JFUVVJUkVEX1JFU1VMVDoKLQkJCQlnZXRSZXF1aXJlZFJlc3VsdCgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUlMRVNUT05FX19SRVFVSVJFRF9SRVNVTFQ6Ci0JCQkJcmV0dXJuIHJlcXVpcmVkUmVzdWx0ICE9IG51bGwgJiYgIXJlcXVpcmVkUmVzdWx0LmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHJlcXVpcmVkUmVzdWx0OiAiKTsKLQkJcmVzdWx0LmFwcGVuZChyZXF1aXJlZFJlc3VsdCk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL01pbGVzdG9uZUltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9OYW1lZEVsZW1lbnRJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9OYW1lZEVsZW1lbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1Zjc5NGQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvTmFtZWRFbGVtZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYzICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogTmFtZWRFbGVtZW50SW1wbC5qYXZhLHYgMS4yIDIwMDgvMDEvMzAgMDA6NDE6NDcga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5OYW1lZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk5hbWVkIEVsZW1lbnQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuTmFtZWRFbGVtZW50SW1wbCNnZXROYW1lIDxlbT5OYW1lPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgTmFtZWRFbGVtZW50SW1wbCBleHRlbmRzIEVsZW1lbnRJbXBsIGltcGxlbWVudHMgTmFtZWRFbGVtZW50IHsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZSgpIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWUoKSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBuYW1lID0gTkFNRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBOYW1lZEVsZW1lbnRJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5OQU1FRF9FTEVNRU5UOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmV3TmFtZSkgewotCQlTdHJpbmcgb2xkTmFtZSA9IG5hbWU7Ci0JCW5hbWUgPSBuZXdOYW1lOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLk5BTUVEX0VMRU1FTlRfX05BTUUsIG9sZE5hbWUsIG5hbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuTkFNRURfRUxFTUVOVF9fTkFNRToKLQkJCQlyZXR1cm4gZ2V0TmFtZSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuTkFNRURfRUxFTUVOVF9fTkFNRToKLQkJCQlzZXROYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuTkFNRURfRUxFTUVOVF9fTkFNRToKLQkJCQlzZXROYW1lKE5BTUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLk5BTUVEX0VMRU1FTlRfX05BTUU6Ci0JCQkJcmV0dXJuIE5BTUVfRURFRkFVTFQgPT0gbnVsbCA/IG5hbWUgIT0gbnVsbCA6ICFOQU1FX0VERUZBVUxULmVxdWFscyhuYW1lKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKG5hbWU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKG5hbWUpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9OYW1lZEVsZW1lbnRJbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvT3V0Y29tZUltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL091dGNvbWVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2ZmE0YWMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvT3V0Y29tZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogT3V0Y29tZUltcGwuamF2YSx2IDEuMiAyMDA4LzAxLzMwIDAwOjQxOjQ3IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5PdXRjb21lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5PdXRjb21lPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgT3V0Y29tZUltcGwgZXh0ZW5kcyBXb3JrUHJvZHVjdEltcGwgaW1wbGVtZW50cyBPdXRjb21lIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT3V0Y29tZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLk9VVENPTUU7Ci0JfQotCi19IC8vT3V0Y29tZUltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9QYWNrYWdlYWJsZUVsZW1lbnRJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9QYWNrYWdlYWJsZUVsZW1lbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwNDdiN2MuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvUGFja2FnZWFibGVFbGVtZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBQYWNrYWdlYWJsZUVsZW1lbnRJbXBsLmphdmEsdiAxLjIgMjAwOC8wMS8zMCAwMDo0MTo0NyBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUGFja2FnZWFibGVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5QYWNrYWdlYWJsZSBFbGVtZW50PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUGFja2FnZWFibGVFbGVtZW50SW1wbCBleHRlbmRzIE5hbWVkRWxlbWVudEltcGwgaW1wbGVtZW50cyBQYWNrYWdlYWJsZUVsZW1lbnQgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBQYWNrYWdlYWJsZUVsZW1lbnRJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5QQUNLQUdFQUJMRV9FTEVNRU5UOwotCX0KLQotfSAvL1BhY2thZ2VhYmxlRWxlbWVudEltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9QaGFzZUltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1BoYXNlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYmFhNzk5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1BoYXNlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBQaGFzZUltcGwuamF2YSx2IDEuMiAyMDA4LzAxLzMwIDAwOjQxOjQ3IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5QaGFzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UGhhc2U8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBQaGFzZUltcGwgZXh0ZW5kcyBBY3Rpdml0eUltcGwgaW1wbGVtZW50cyBQaGFzZSB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFBoYXNlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuUEhBU0U7Ci0JfQotCi19IC8vUGhhc2VJbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvUGxhbm5pbmdEYXRhSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvUGxhbm5pbmdEYXRhSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5M2Y4NTgyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1BsYW5uaW5nRGF0YUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3MiArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFBsYW5uaW5nRGF0YUltcGwuamF2YSx2IDEuMiAyMDA4LzAxLzMwIDAwOjQxOjQ3IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsOwotCi1pbXBvcnQgamF2YXgueG1sLmRhdGF0eXBlLlhNTEdyZWdvcmlhbkNhbGVuZGFyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlBsYW5uaW5nRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UGxhbm5pbmcgRGF0YTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5QbGFubmluZ0RhdGFJbXBsI2dldEZpbmlzaERhdGUgPGVtPkZpbmlzaCBEYXRlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlBsYW5uaW5nRGF0YUltcGwjZ2V0UmFuayA8ZW0+UmFuazwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5QbGFubmluZ0RhdGFJbXBsI2dldFN0YXJ0RGF0ZSA8ZW0+U3RhcnQgRGF0ZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFBsYW5uaW5nRGF0YUltcGwgZXh0ZW5kcyBQcm9jZXNzRWxlbWVudEltcGwgaW1wbGVtZW50cyBQbGFubmluZ0RhdGEgewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRGaW5pc2hEYXRlKCkgPGVtPkZpbmlzaCBEYXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRGaW5pc2hEYXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFhNTEdyZWdvcmlhbkNhbGVuZGFyIEZJTklTSF9EQVRFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEZpbmlzaERhdGUoKSA8ZW0+RmluaXNoIERhdGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEZpbmlzaERhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBYTUxHcmVnb3JpYW5DYWxlbmRhciBmaW5pc2hEYXRlID0gRklOSVNIX0RBVEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmFuaygpIDxlbT5SYW5rPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSYW5rKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBSQU5LX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJhbmsoKSA8ZW0+UmFuazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmFuaygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyByYW5rID0gUkFOS19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTdGFydERhdGUoKSA8ZW0+U3RhcnQgRGF0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U3RhcnREYXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFhNTEdyZWdvcmlhbkNhbGVuZGFyIFNUQVJUX0RBVEVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U3RhcnREYXRlKCkgPGVtPlN0YXJ0IERhdGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFN0YXJ0RGF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFhNTEdyZWdvcmlhbkNhbGVuZGFyIHN0YXJ0RGF0ZSA9IFNUQVJUX0RBVEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUGxhbm5pbmdEYXRhSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuUExBTk5JTkdfREFUQTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWE1MR3JlZ29yaWFuQ2FsZW5kYXIgZ2V0RmluaXNoRGF0ZSgpIHsKLQkJcmV0dXJuIGZpbmlzaERhdGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RmluaXNoRGF0ZShYTUxHcmVnb3JpYW5DYWxlbmRhciBuZXdGaW5pc2hEYXRlKSB7Ci0JCVhNTEdyZWdvcmlhbkNhbGVuZGFyIG9sZEZpbmlzaERhdGUgPSBmaW5pc2hEYXRlOwotCQlmaW5pc2hEYXRlID0gbmV3RmluaXNoRGF0ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5QTEFOTklOR19EQVRBX19GSU5JU0hfREFURSwgb2xkRmluaXNoRGF0ZSwgZmluaXNoRGF0ZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UmFuaygpIHsKLQkJcmV0dXJuIHJhbms7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmFuayhTdHJpbmcgbmV3UmFuaykgewotCQlTdHJpbmcgb2xkUmFuayA9IHJhbms7Ci0JCXJhbmsgPSBuZXdSYW5rOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLlBMQU5OSU5HX0RBVEFfX1JBTkssIG9sZFJhbmssIHJhbmspKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWE1MR3JlZ29yaWFuQ2FsZW5kYXIgZ2V0U3RhcnREYXRlKCkgewotCQlyZXR1cm4gc3RhcnREYXRlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFN0YXJ0RGF0ZShYTUxHcmVnb3JpYW5DYWxlbmRhciBuZXdTdGFydERhdGUpIHsKLQkJWE1MR3JlZ29yaWFuQ2FsZW5kYXIgb2xkU3RhcnREYXRlID0gc3RhcnREYXRlOwotCQlzdGFydERhdGUgPSBuZXdTdGFydERhdGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuUExBTk5JTkdfREFUQV9fU1RBUlRfREFURSwgb2xkU3RhcnREYXRlLCBzdGFydERhdGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUExBTk5JTkdfREFUQV9fRklOSVNIX0RBVEU6Ci0JCQkJcmV0dXJuIGdldEZpbmlzaERhdGUoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5QTEFOTklOR19EQVRBX19SQU5LOgotCQkJCXJldHVybiBnZXRSYW5rKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUExBTk5JTkdfREFUQV9fU1RBUlRfREFURToKLQkJCQlyZXR1cm4gZ2V0U3RhcnREYXRlKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5QTEFOTklOR19EQVRBX19GSU5JU0hfREFURToKLQkJCQlzZXRGaW5pc2hEYXRlKChYTUxHcmVnb3JpYW5DYWxlbmRhciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBMQU5OSU5HX0RBVEFfX1JBTks6Ci0JCQkJc2V0UmFuaygoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuUExBTk5JTkdfREFUQV9fU1RBUlRfREFURToKLQkJCQlzZXRTdGFydERhdGUoKFhNTEdyZWdvcmlhbkNhbGVuZGFyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlBMQU5OSU5HX0RBVEFfX0ZJTklTSF9EQVRFOgotCQkJCXNldEZpbmlzaERhdGUoRklOSVNIX0RBVEVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5QTEFOTklOR19EQVRBX19SQU5LOgotCQkJCXNldFJhbmsoUkFOS19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBMQU5OSU5HX0RBVEFfX1NUQVJUX0RBVEU6Ci0JCQkJc2V0U3RhcnREYXRlKFNUQVJUX0RBVEVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlBMQU5OSU5HX0RBVEFfX0ZJTklTSF9EQVRFOgotCQkJCXJldHVybiBGSU5JU0hfREFURV9FREVGQVVMVCA9PSBudWxsID8gZmluaXNoRGF0ZSAhPSBudWxsIDogIUZJTklTSF9EQVRFX0VERUZBVUxULmVxdWFscyhmaW5pc2hEYXRlKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5QTEFOTklOR19EQVRBX19SQU5LOgotCQkJCXJldHVybiBSQU5LX0VERUZBVUxUID09IG51bGwgPyByYW5rICE9IG51bGwgOiAhUkFOS19FREVGQVVMVC5lcXVhbHMocmFuayk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUExBTk5JTkdfREFUQV9fU1RBUlRfREFURToKLQkJCQlyZXR1cm4gU1RBUlRfREFURV9FREVGQVVMVCA9PSBudWxsID8gc3RhcnREYXRlICE9IG51bGwgOiAhU1RBUlRfREFURV9FREVGQVVMVC5lcXVhbHMoc3RhcnREYXRlKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGZpbmlzaERhdGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGZpbmlzaERhdGUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHJhbms6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHJhbmspOwotCQlyZXN1bHQuYXBwZW5kKCIsIHN0YXJ0RGF0ZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoc3RhcnREYXRlKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vUGxhbm5pbmdEYXRhSW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1ByYWN0aWNlRGVzY3JpcHRpb25JbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9QcmFjdGljZURlc2NyaXB0aW9uSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MWViNjVlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1ByYWN0aWNlRGVzY3JpcHRpb25JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MzMgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBQcmFjdGljZURlc2NyaXB0aW9uSW1wbC5qYXZhLHYgMS4yIDIwMDgvMDEvMzAgMDA6NDE6NDcga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5QcmFjdGljZURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5QcmFjdGljZSBEZXNjcmlwdGlvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5QcmFjdGljZURlc2NyaXB0aW9uSW1wbCNnZXRBZGRpdGlvbmFsSW5mbyA8ZW0+QWRkaXRpb25hbCBJbmZvPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlByYWN0aWNlRGVzY3JpcHRpb25JbXBsI2dldEFwcGxpY2F0aW9uIDxlbT5BcHBsaWNhdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5QcmFjdGljZURlc2NyaXB0aW9uSW1wbCNnZXRCYWNrZ3JvdW5kIDxlbT5CYWNrZ3JvdW5kPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlByYWN0aWNlRGVzY3JpcHRpb25JbXBsI2dldEdvYWxzIDxlbT5Hb2FsczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5QcmFjdGljZURlc2NyaXB0aW9uSW1wbCNnZXRMZXZlbHNPZkFkb3B0aW9uIDxlbT5MZXZlbHMgT2YgQWRvcHRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUHJhY3RpY2VEZXNjcmlwdGlvbkltcGwjZ2V0UHJvYmxlbSA8ZW0+UHJvYmxlbTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFByYWN0aWNlRGVzY3JpcHRpb25JbXBsIGV4dGVuZHMgQ29udGVudERlc2NyaXB0aW9uSW1wbCBpbXBsZW1lbnRzIFByYWN0aWNlRGVzY3JpcHRpb24gewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBZGRpdGlvbmFsSW5mbygpIDxlbT5BZGRpdGlvbmFsIEluZm88L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFkZGl0aW9uYWxJbmZvKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBBRERJVElPTkFMX0lORk9fRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QWRkaXRpb25hbEluZm8oKSA8ZW0+QWRkaXRpb25hbCBJbmZvPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBZGRpdGlvbmFsSW5mbygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBhZGRpdGlvbmFsSW5mbyA9IEFERElUSU9OQUxfSU5GT19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBcHBsaWNhdGlvbigpIDxlbT5BcHBsaWNhdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QXBwbGljYXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEFQUExJQ0FUSU9OX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFwcGxpY2F0aW9uKCkgPGVtPkFwcGxpY2F0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBcHBsaWNhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBhcHBsaWNhdGlvbiA9IEFQUExJQ0FUSU9OX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEJhY2tncm91bmQoKSA8ZW0+QmFja2dyb3VuZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QmFja2dyb3VuZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkFDS0dST1VORF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRCYWNrZ3JvdW5kKCkgPGVtPkJhY2tncm91bmQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEJhY2tncm91bmQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgYmFja2dyb3VuZCA9IEJBQ0tHUk9VTkRfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0R29hbHMoKSA8ZW0+R29hbHM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEdvYWxzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBHT0FMU19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRHb2FscygpIDxlbT5Hb2FsczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0R29hbHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ29hbHMgPSBHT0FMU19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRMZXZlbHNPZkFkb3B0aW9uKCkgPGVtPkxldmVscyBPZiBBZG9wdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TGV2ZWxzT2ZBZG9wdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEVWRUxTX09GX0FET1BUSU9OX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldExldmVsc09mQWRvcHRpb24oKSA8ZW0+TGV2ZWxzIE9mIEFkb3B0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRMZXZlbHNPZkFkb3B0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGxldmVsc09mQWRvcHRpb24gPSBMRVZFTFNfT0ZfQURPUFRJT05fRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJvYmxlbSgpIDxlbT5Qcm9ibGVtPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQcm9ibGVtKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9CTEVNX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByb2JsZW0oKSA8ZW0+UHJvYmxlbTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UHJvYmxlbSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBwcm9ibGVtID0gUFJPQkxFTV9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBQcmFjdGljZURlc2NyaXB0aW9uSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuUFJBQ1RJQ0VfREVTQ1JJUFRJT047Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRBZGRpdGlvbmFsSW5mbygpIHsKLQkJcmV0dXJuIGFkZGl0aW9uYWxJbmZvOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFkZGl0aW9uYWxJbmZvKFN0cmluZyBuZXdBZGRpdGlvbmFsSW5mbykgewotCQlTdHJpbmcgb2xkQWRkaXRpb25hbEluZm8gPSBhZGRpdGlvbmFsSW5mbzsKLQkJYWRkaXRpb25hbEluZm8gPSBuZXdBZGRpdGlvbmFsSW5mbzsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5QUkFDVElDRV9ERVNDUklQVElPTl9fQURESVRJT05BTF9JTkZPLCBvbGRBZGRpdGlvbmFsSW5mbywgYWRkaXRpb25hbEluZm8pKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEFwcGxpY2F0aW9uKCkgewotCQlyZXR1cm4gYXBwbGljYXRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QXBwbGljYXRpb24oU3RyaW5nIG5ld0FwcGxpY2F0aW9uKSB7Ci0JCVN0cmluZyBvbGRBcHBsaWNhdGlvbiA9IGFwcGxpY2F0aW9uOwotCQlhcHBsaWNhdGlvbiA9IG5ld0FwcGxpY2F0aW9uOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLlBSQUNUSUNFX0RFU0NSSVBUSU9OX19BUFBMSUNBVElPTiwgb2xkQXBwbGljYXRpb24sIGFwcGxpY2F0aW9uKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRCYWNrZ3JvdW5kKCkgewotCQlyZXR1cm4gYmFja2dyb3VuZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRCYWNrZ3JvdW5kKFN0cmluZyBuZXdCYWNrZ3JvdW5kKSB7Ci0JCVN0cmluZyBvbGRCYWNrZ3JvdW5kID0gYmFja2dyb3VuZDsKLQkJYmFja2dyb3VuZCA9IG5ld0JhY2tncm91bmQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0JBQ0tHUk9VTkQsIG9sZEJhY2tncm91bmQsIGJhY2tncm91bmQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEdvYWxzKCkgewotCQlyZXR1cm4gZ29hbHM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0R29hbHMoU3RyaW5nIG5ld0dvYWxzKSB7Ci0JCVN0cmluZyBvbGRHb2FscyA9IGdvYWxzOwotCQlnb2FscyA9IG5ld0dvYWxzOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLlBSQUNUSUNFX0RFU0NSSVBUSU9OX19HT0FMUywgb2xkR29hbHMsIGdvYWxzKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMZXZlbHNPZkFkb3B0aW9uKCkgewotCQlyZXR1cm4gbGV2ZWxzT2ZBZG9wdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMZXZlbHNPZkFkb3B0aW9uKFN0cmluZyBuZXdMZXZlbHNPZkFkb3B0aW9uKSB7Ci0JCVN0cmluZyBvbGRMZXZlbHNPZkFkb3B0aW9uID0gbGV2ZWxzT2ZBZG9wdGlvbjsKLQkJbGV2ZWxzT2ZBZG9wdGlvbiA9IG5ld0xldmVsc09mQWRvcHRpb247Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0xFVkVMU19PRl9BRE9QVElPTiwgb2xkTGV2ZWxzT2ZBZG9wdGlvbiwgbGV2ZWxzT2ZBZG9wdGlvbikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UHJvYmxlbSgpIHsKLQkJcmV0dXJuIHByb2JsZW07Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHJvYmxlbShTdHJpbmcgbmV3UHJvYmxlbSkgewotCQlTdHJpbmcgb2xkUHJvYmxlbSA9IHByb2JsZW07Ci0JCXByb2JsZW0gPSBuZXdQcm9ibGVtOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLlBSQUNUSUNFX0RFU0NSSVBUSU9OX19QUk9CTEVNLCBvbGRQcm9ibGVtLCBwcm9ibGVtKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlBSQUNUSUNFX0RFU0NSSVBUSU9OX19BRERJVElPTkFMX0lORk86Ci0JCQkJcmV0dXJuIGdldEFkZGl0aW9uYWxJbmZvKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0FQUExJQ0FUSU9OOgotCQkJCXJldHVybiBnZXRBcHBsaWNhdGlvbigpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBSQUNUSUNFX0RFU0NSSVBUSU9OX19CQUNLR1JPVU5EOgotCQkJCXJldHVybiBnZXRCYWNrZ3JvdW5kKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0dPQUxTOgotCQkJCXJldHVybiBnZXRHb2FscygpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBSQUNUSUNFX0RFU0NSSVBUSU9OX19MRVZFTFNfT0ZfQURPUFRJT046Ci0JCQkJcmV0dXJuIGdldExldmVsc09mQWRvcHRpb24oKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUkFDVElDRV9ERVNDUklQVElPTl9fUFJPQkxFTToKLQkJCQlyZXR1cm4gZ2V0UHJvYmxlbSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0FERElUSU9OQUxfSU5GTzoKLQkJCQlzZXRBZGRpdGlvbmFsSW5mbygoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0FQUExJQ0FUSU9OOgotCQkJCXNldEFwcGxpY2F0aW9uKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUkFDVElDRV9ERVNDUklQVElPTl9fQkFDS0dST1VORDoKLQkJCQlzZXRCYWNrZ3JvdW5kKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUkFDVElDRV9ERVNDUklQVElPTl9fR09BTFM6Ci0JCQkJc2V0R29hbHMoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBSQUNUSUNFX0RFU0NSSVBUSU9OX19MRVZFTFNfT0ZfQURPUFRJT046Ci0JCQkJc2V0TGV2ZWxzT2ZBZG9wdGlvbigoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX1BST0JMRU06Ci0JCQkJc2V0UHJvYmxlbSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlBSQUNUSUNFX0RFU0NSSVBUSU9OX19BRERJVElPTkFMX0lORk86Ci0JCQkJc2V0QWRkaXRpb25hbEluZm8oQURESVRJT05BTF9JTkZPX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0FQUExJQ0FUSU9OOgotCQkJCXNldEFwcGxpY2F0aW9uKEFQUExJQ0FUSU9OX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0JBQ0tHUk9VTkQ6Ci0JCQkJc2V0QmFja2dyb3VuZChCQUNLR1JPVU5EX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0dPQUxTOgotCQkJCXNldEdvYWxzKEdPQUxTX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0xFVkVMU19PRl9BRE9QVElPTjoKLQkJCQlzZXRMZXZlbHNPZkFkb3B0aW9uKExFVkVMU19PRl9BRE9QVElPTl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBSQUNUSUNFX0RFU0NSSVBUSU9OX19QUk9CTEVNOgotCQkJCXNldFByb2JsZW0oUFJPQkxFTV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0FERElUSU9OQUxfSU5GTzoKLQkJCQlyZXR1cm4gQURESVRJT05BTF9JTkZPX0VERUZBVUxUID09IG51bGwgPyBhZGRpdGlvbmFsSW5mbyAhPSBudWxsIDogIUFERElUSU9OQUxfSU5GT19FREVGQVVMVC5lcXVhbHMoYWRkaXRpb25hbEluZm8pOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBSQUNUSUNFX0RFU0NSSVBUSU9OX19BUFBMSUNBVElPTjoKLQkJCQlyZXR1cm4gQVBQTElDQVRJT05fRURFRkFVTFQgPT0gbnVsbCA/IGFwcGxpY2F0aW9uICE9IG51bGwgOiAhQVBQTElDQVRJT05fRURFRkFVTFQuZXF1YWxzKGFwcGxpY2F0aW9uKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUkFDVElDRV9ERVNDUklQVElPTl9fQkFDS0dST1VORDoKLQkJCQlyZXR1cm4gQkFDS0dST1VORF9FREVGQVVMVCA9PSBudWxsID8gYmFja2dyb3VuZCAhPSBudWxsIDogIUJBQ0tHUk9VTkRfRURFRkFVTFQuZXF1YWxzKGJhY2tncm91bmQpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBSQUNUSUNFX0RFU0NSSVBUSU9OX19HT0FMUzoKLQkJCQlyZXR1cm4gR09BTFNfRURFRkFVTFQgPT0gbnVsbCA/IGdvYWxzICE9IG51bGwgOiAhR09BTFNfRURFRkFVTFQuZXF1YWxzKGdvYWxzKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUkFDVElDRV9ERVNDUklQVElPTl9fTEVWRUxTX09GX0FET1BUSU9OOgotCQkJCXJldHVybiBMRVZFTFNfT0ZfQURPUFRJT05fRURFRkFVTFQgPT0gbnVsbCA/IGxldmVsc09mQWRvcHRpb24gIT0gbnVsbCA6ICFMRVZFTFNfT0ZfQURPUFRJT05fRURFRkFVTFQuZXF1YWxzKGxldmVsc09mQWRvcHRpb24pOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBSQUNUSUNFX0RFU0NSSVBUSU9OX19QUk9CTEVNOgotCQkJCXJldHVybiBQUk9CTEVNX0VERUZBVUxUID09IG51bGwgPyBwcm9ibGVtICE9IG51bGwgOiAhUFJPQkxFTV9FREVGQVVMVC5lcXVhbHMocHJvYmxlbSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChhZGRpdGlvbmFsSW5mbzogIik7Ci0JCXJlc3VsdC5hcHBlbmQoYWRkaXRpb25hbEluZm8pOwotCQlyZXN1bHQuYXBwZW5kKCIsIGFwcGxpY2F0aW9uOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChhcHBsaWNhdGlvbik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgYmFja2dyb3VuZDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoYmFja2dyb3VuZCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZ29hbHM6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGdvYWxzKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBsZXZlbHNPZkFkb3B0aW9uOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChsZXZlbHNPZkFkb3B0aW9uKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBwcm9ibGVtOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChwcm9ibGVtKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vUHJhY3RpY2VEZXNjcmlwdGlvbkltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9QcmFjdGljZUltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1ByYWN0aWNlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOWRiYWQzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1ByYWN0aWNlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMxICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogUHJhY3RpY2VJbXBsLmphdmEsdiAxLjIgMjAwOC8wMS8zMCAwMDo0MTo0NyBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5CYXNpY0ZlYXR1cmVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByYWN0aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5QcmFjdGljZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5QcmFjdGljZUltcGwjZ2V0R3JvdXAyIDxlbT5Hcm91cDI8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUHJhY3RpY2VJbXBsI2dldEFjdGl2aXR5UmVmZXJlbmNlIDxlbT5BY3Rpdml0eSBSZWZlcmVuY2U8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUHJhY3RpY2VJbXBsI2dldENvbnRlbnRSZWZlcmVuY2UgPGVtPkNvbnRlbnQgUmVmZXJlbmNlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlByYWN0aWNlSW1wbCNnZXRTdWJQcmFjdGljZSA8ZW0+U3ViIFByYWN0aWNlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUHJhY3RpY2VJbXBsIGV4dGVuZHMgR3VpZGFuY2VJbXBsIGltcGxlbWVudHMgUHJhY3RpY2UgewotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEdyb3VwMigpIDxlbT5Hcm91cDI8L2VtPn0nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0R3JvdXAyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRmVhdHVyZU1hcCBncm91cDI7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUHJhY3RpY2VJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5QUkFDVElDRTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRmVhdHVyZU1hcCBnZXRHcm91cDIoKSB7Ci0JCWlmIChncm91cDIgPT0gbnVsbCkgewotCQkJZ3JvdXAyID0gbmV3IEJhc2ljRmVhdHVyZU1hcCh0aGlzLCBVbWFQYWNrYWdlLlBSQUNUSUNFX19HUk9VUDIpOwotCQl9Ci0JCXJldHVybiBncm91cDI7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFN0cmluZz4gZ2V0QWN0aXZpdHlSZWZlcmVuY2UoKSB7Ci0JCXJldHVybiBnZXRHcm91cDIoKS5saXN0KFVtYVBhY2thZ2UuTGl0ZXJhbHMuUFJBQ1RJQ0VfX0FDVElWSVRZX1JFRkVSRU5DRSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFN0cmluZz4gZ2V0Q29udGVudFJlZmVyZW5jZSgpIHsKLQkJcmV0dXJuIGdldEdyb3VwMigpLmxpc3QoVW1hUGFja2FnZS5MaXRlcmFscy5QUkFDVElDRV9fQ09OVEVOVF9SRUZFUkVOQ0UpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxQcmFjdGljZT4gZ2V0U3ViUHJhY3RpY2UoKSB7Ci0JCXJldHVybiBnZXRHcm91cDIoKS5saXN0KFVtYVBhY2thZ2UuTGl0ZXJhbHMuUFJBQ1RJQ0VfX1NVQl9QUkFDVElDRSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlBSQUNUSUNFX19HUk9VUDI6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRHcm91cDIoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBSQUNUSUNFX19TVUJfUFJBQ1RJQ0U6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRTdWJQcmFjdGljZSgpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUkFDVElDRV9fR1JPVVAyOgotCQkJCWlmIChjb3JlVHlwZSkgcmV0dXJuIGdldEdyb3VwMigpOwotCQkJCXJldHVybiAoKEZlYXR1cmVNYXAuSW50ZXJuYWwpZ2V0R3JvdXAyKCkpLmdldFdyYXBwZXIoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUkFDVElDRV9fQUNUSVZJVFlfUkVGRVJFTkNFOgotCQkJCXJldHVybiBnZXRBY3Rpdml0eVJlZmVyZW5jZSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBSQUNUSUNFX19DT05URU5UX1JFRkVSRU5DRToKLQkJCQlyZXR1cm4gZ2V0Q29udGVudFJlZmVyZW5jZSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBSQUNUSUNFX19TVUJfUFJBQ1RJQ0U6Ci0JCQkJcmV0dXJuIGdldFN1YlByYWN0aWNlKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJBQ1RJQ0VfX0dST1VQMjoKLQkJCQkoKEZlYXR1cmVNYXAuSW50ZXJuYWwpZ2V0R3JvdXAyKCkpLnNldChuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBSQUNUSUNFX19BQ1RJVklUWV9SRUZFUkVOQ0U6Ci0JCQkJZ2V0QWN0aXZpdHlSZWZlcmVuY2UoKS5jbGVhcigpOwotCQkJCWdldEFjdGl2aXR5UmVmZXJlbmNlKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBTdHJpbmc+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJBQ1RJQ0VfX0NPTlRFTlRfUkVGRVJFTkNFOgotCQkJCWdldENvbnRlbnRSZWZlcmVuY2UoKS5jbGVhcigpOwotCQkJCWdldENvbnRlbnRSZWZlcmVuY2UoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFN0cmluZz4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUkFDVElDRV9fU1VCX1BSQUNUSUNFOgotCQkJCWdldFN1YlByYWN0aWNlKCkuY2xlYXIoKTsKLQkJCQlnZXRTdWJQcmFjdGljZSgpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgUHJhY3RpY2U+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlBSQUNUSUNFX19HUk9VUDI6Ci0JCQkJZ2V0R3JvdXAyKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJBQ1RJQ0VfX0FDVElWSVRZX1JFRkVSRU5DRToKLQkJCQlnZXRBY3Rpdml0eVJlZmVyZW5jZSgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBSQUNUSUNFX19DT05URU5UX1JFRkVSRU5DRToKLQkJCQlnZXRDb250ZW50UmVmZXJlbmNlKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJBQ1RJQ0VfX1NVQl9QUkFDVElDRToKLQkJCQlnZXRTdWJQcmFjdGljZSgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJBQ1RJQ0VfX0dST1VQMjoKLQkJCQlyZXR1cm4gZ3JvdXAyICE9IG51bGwgJiYgIWdyb3VwMi5pc0VtcHR5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJBQ1RJQ0VfX0FDVElWSVRZX1JFRkVSRU5DRToKLQkJCQlyZXR1cm4gIWdldEFjdGl2aXR5UmVmZXJlbmNlKCkuaXNFbXB0eSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBSQUNUSUNFX19DT05URU5UX1JFRkVSRU5DRToKLQkJCQlyZXR1cm4gIWdldENvbnRlbnRSZWZlcmVuY2UoKS5pc0VtcHR5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJBQ1RJQ0VfX1NVQl9QUkFDVElDRToKLQkJCQlyZXR1cm4gIWdldFN1YlByYWN0aWNlKCkuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoZ3JvdXAyOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChncm91cDIpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9QcmFjdGljZUltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9Qcm9jZXNzQ29tcG9uZW50SW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvUHJvY2Vzc0NvbXBvbmVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTc0ZDY0Yy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9Qcm9jZXNzQ29tcG9uZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTI3ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogUHJvY2Vzc0NvbXBvbmVudEltcGwuamF2YSx2IDEuMiAyMDA4LzAxLzMwIDAwOjQxOjQ3IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsOwotCi1pbXBvcnQgamF2YXgueG1sLmRhdGF0eXBlLlhNTEdyZWdvcmlhbkNhbGVuZGFyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc0NvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Qcm9jZXNzIENvbXBvbmVudDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Qcm9jZXNzQ29tcG9uZW50SW1wbCNnZXRDb3B5cmlnaHQgPGVtPkNvcHlyaWdodDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Qcm9jZXNzQ29tcG9uZW50SW1wbCNnZXRJbnRlcmZhY2UgPGVtPkludGVyZmFjZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Qcm9jZXNzQ29tcG9uZW50SW1wbCNnZXRQcm9jZXNzIDxlbT5Qcm9jZXNzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlByb2Nlc3NDb21wb25lbnRJbXBsI2dldEF1dGhvcnMgPGVtPkF1dGhvcnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUHJvY2Vzc0NvbXBvbmVudEltcGwjZ2V0Q2hhbmdlRGF0ZSA8ZW0+Q2hhbmdlIERhdGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUHJvY2Vzc0NvbXBvbmVudEltcGwjZ2V0Q2hhbmdlRGVzY3JpcHRpb24gPGVtPkNoYW5nZSBEZXNjcmlwdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Qcm9jZXNzQ29tcG9uZW50SW1wbCNnZXRWZXJzaW9uIDxlbT5WZXJzaW9uPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUHJvY2Vzc0NvbXBvbmVudEltcGwgZXh0ZW5kcyBQcm9jZXNzUGFja2FnZUltcGwgaW1wbGVtZW50cyBQcm9jZXNzQ29tcG9uZW50IHsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q29weXJpZ2h0KCkgPGVtPkNvcHlyaWdodDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q29weXJpZ2h0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBDT1BZUklHSFRfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q29weXJpZ2h0KCkgPGVtPkNvcHlyaWdodDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q29weXJpZ2h0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGNvcHlyaWdodCA9IENPUFlSSUdIVF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEludGVyZmFjZSgpIDxlbT5JbnRlcmZhY2U8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEludGVyZmFjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UgaW50ZXJmYWNlXzsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByb2Nlc3MoKSA8ZW0+UHJvY2VzczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UHJvY2VzcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3MgcHJvY2VzczsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBdXRob3JzKCkgPGVtPkF1dGhvcnM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEF1dGhvcnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEFVVEhPUlNfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QXV0aG9ycygpIDxlbT5BdXRob3JzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBdXRob3JzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGF1dGhvcnMgPSBBVVRIT1JTX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENoYW5nZURhdGUoKSA8ZW0+Q2hhbmdlIERhdGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENoYW5nZURhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgWE1MR3JlZ29yaWFuQ2FsZW5kYXIgQ0hBTkdFX0RBVEVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q2hhbmdlRGF0ZSgpIDxlbT5DaGFuZ2UgRGF0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q2hhbmdlRGF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFhNTEdyZWdvcmlhbkNhbGVuZGFyIGNoYW5nZURhdGUgPSBDSEFOR0VfREFURV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDaGFuZ2VEZXNjcmlwdGlvbigpIDxlbT5DaGFuZ2UgRGVzY3JpcHRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENoYW5nZURlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBDSEFOR0VfREVTQ1JJUFRJT05fRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q2hhbmdlRGVzY3JpcHRpb24oKSA8ZW0+Q2hhbmdlIERlc2NyaXB0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDaGFuZ2VEZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBjaGFuZ2VEZXNjcmlwdGlvbiA9IENIQU5HRV9ERVNDUklQVElPTl9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWZXJzaW9uKCkgPGVtPlZlcnNpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFZlcnNpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFZFUlNJT05fRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmVyc2lvbigpIDxlbT5WZXJzaW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRWZXJzaW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHZlcnNpb24gPSBWRVJTSU9OX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFByb2Nlc3NDb21wb25lbnRJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5QUk9DRVNTX0NPTVBPTkVOVDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENvcHlyaWdodCgpIHsKLQkJcmV0dXJuIGNvcHlyaWdodDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb3B5cmlnaHQoU3RyaW5nIG5ld0NvcHlyaWdodCkgewotCQlTdHJpbmcgb2xkQ29weXJpZ2h0ID0gY29weXJpZ2h0OwotCQljb3B5cmlnaHQgPSBuZXdDb3B5cmlnaHQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfX0NPUFlSSUdIVCwgb2xkQ29weXJpZ2h0LCBjb3B5cmlnaHQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSBnZXRJbnRlcmZhY2UoKSB7Ci0JCXJldHVybiBpbnRlcmZhY2VfOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldEludGVyZmFjZShQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlIG5ld0ludGVyZmFjZSwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlIG9sZEludGVyZmFjZSA9IGludGVyZmFjZV87Ci0JCWludGVyZmFjZV8gPSBuZXdJbnRlcmZhY2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfX0lOVEVSRkFDRSwgb2xkSW50ZXJmYWNlLCBuZXdJbnRlcmZhY2UpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEludGVyZmFjZShQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlIG5ld0ludGVyZmFjZSkgewotCQlpZiAobmV3SW50ZXJmYWNlICE9IGludGVyZmFjZV8pIHsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGludGVyZmFjZV8gIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpaW50ZXJmYWNlXykuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfX0lOVEVSRkFDRSwgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3SW50ZXJmYWNlICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld0ludGVyZmFjZSkuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfX0lOVEVSRkFDRSwgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRJbnRlcmZhY2UobmV3SW50ZXJmYWNlLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfX0lOVEVSRkFDRSwgbmV3SW50ZXJmYWNlLCBuZXdJbnRlcmZhY2UpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2VzcyBnZXRQcm9jZXNzKCkgewotCQlyZXR1cm4gcHJvY2VzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRQcm9jZXNzKG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3MgbmV3UHJvY2VzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzIG9sZFByb2Nlc3MgPSBwcm9jZXNzOwotCQlwcm9jZXNzID0gbmV3UHJvY2VzczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9fUFJPQ0VTUywgb2xkUHJvY2VzcywgbmV3UHJvY2Vzcyk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHJvY2VzcyhvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzIG5ld1Byb2Nlc3MpIHsKLQkJaWYgKG5ld1Byb2Nlc3MgIT0gcHJvY2VzcykgewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAocHJvY2VzcyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClwcm9jZXNzKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9fUFJPQ0VTUywgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3UHJvY2VzcyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdQcm9jZXNzKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9fUFJPQ0VTUywgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRQcm9jZXNzKG5ld1Byb2Nlc3MsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9fUFJPQ0VTUywgbmV3UHJvY2VzcywgbmV3UHJvY2VzcykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0QXV0aG9ycygpIHsKLQkJcmV0dXJuIGF1dGhvcnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QXV0aG9ycyhTdHJpbmcgbmV3QXV0aG9ycykgewotCQlTdHJpbmcgb2xkQXV0aG9ycyA9IGF1dGhvcnM7Ci0JCWF1dGhvcnMgPSBuZXdBdXRob3JzOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX19BVVRIT1JTLCBvbGRBdXRob3JzLCBhdXRob3JzKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhNTEdyZWdvcmlhbkNhbGVuZGFyIGdldENoYW5nZURhdGUoKSB7Ci0JCXJldHVybiBjaGFuZ2VEYXRlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENoYW5nZURhdGUoWE1MR3JlZ29yaWFuQ2FsZW5kYXIgbmV3Q2hhbmdlRGF0ZSkgewotCQlYTUxHcmVnb3JpYW5DYWxlbmRhciBvbGRDaGFuZ2VEYXRlID0gY2hhbmdlRGF0ZTsKLQkJY2hhbmdlRGF0ZSA9IG5ld0NoYW5nZURhdGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfX0NIQU5HRV9EQVRFLCBvbGRDaGFuZ2VEYXRlLCBjaGFuZ2VEYXRlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDaGFuZ2VEZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIGNoYW5nZURlc2NyaXB0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENoYW5nZURlc2NyaXB0aW9uKFN0cmluZyBuZXdDaGFuZ2VEZXNjcmlwdGlvbikgewotCQlTdHJpbmcgb2xkQ2hhbmdlRGVzY3JpcHRpb24gPSBjaGFuZ2VEZXNjcmlwdGlvbjsKLQkJY2hhbmdlRGVzY3JpcHRpb24gPSBuZXdDaGFuZ2VEZXNjcmlwdGlvbjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9fQ0hBTkdFX0RFU0NSSVBUSU9OLCBvbGRDaGFuZ2VEZXNjcmlwdGlvbiwgY2hhbmdlRGVzY3JpcHRpb24pKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFZlcnNpb24oKSB7Ci0JCXJldHVybiB2ZXJzaW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZlcnNpb24oU3RyaW5nIG5ld1ZlcnNpb24pIHsKLQkJU3RyaW5nIG9sZFZlcnNpb24gPSB2ZXJzaW9uOwotCQl2ZXJzaW9uID0gbmV3VmVyc2lvbjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9fVkVSU0lPTiwgb2xkVmVyc2lvbiwgdmVyc2lvbikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9fSU5URVJGQUNFOgotCQkJCXJldHVybiBiYXNpY1NldEludGVyZmFjZShudWxsLCBtc2dzKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9fUFJPQ0VTUzoKLQkJCQlyZXR1cm4gYmFzaWNTZXRQcm9jZXNzKG51bGwsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfX0NPUFlSSUdIVDoKLQkJCQlyZXR1cm4gZ2V0Q29weXJpZ2h0KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfX0lOVEVSRkFDRToKLQkJCQlyZXR1cm4gZ2V0SW50ZXJmYWNlKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfX1BST0NFU1M6Ci0JCQkJcmV0dXJuIGdldFByb2Nlc3MoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9fQVVUSE9SUzoKLQkJCQlyZXR1cm4gZ2V0QXV0aG9ycygpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX19DSEFOR0VfREFURToKLQkJCQlyZXR1cm4gZ2V0Q2hhbmdlRGF0ZSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX19DSEFOR0VfREVTQ1JJUFRJT046Ci0JCQkJcmV0dXJuIGdldENoYW5nZURlc2NyaXB0aW9uKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfX1ZFUlNJT046Ci0JCQkJcmV0dXJuIGdldFZlcnNpb24oKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX19DT1BZUklHSFQ6Ci0JCQkJc2V0Q29weXJpZ2h0KChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9fSU5URVJGQUNFOgotCQkJCXNldEludGVyZmFjZSgoUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX19QUk9DRVNTOgotCQkJCXNldFByb2Nlc3MoKG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3MpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9fQVVUSE9SUzoKLQkJCQlzZXRBdXRob3JzKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9fQ0hBTkdFX0RBVEU6Ci0JCQkJc2V0Q2hhbmdlRGF0ZSgoWE1MR3JlZ29yaWFuQ2FsZW5kYXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9fQ0hBTkdFX0RFU0NSSVBUSU9OOgotCQkJCXNldENoYW5nZURlc2NyaXB0aW9uKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9fVkVSU0lPTjoKLQkJCQlzZXRWZXJzaW9uKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfX0NPUFlSSUdIVDoKLQkJCQlzZXRDb3B5cmlnaHQoQ09QWVJJR0hUX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfX0lOVEVSRkFDRToKLQkJCQlzZXRJbnRlcmZhY2UoKFByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX19QUk9DRVNTOgotCQkJCXNldFByb2Nlc3MoKG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3MpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX19BVVRIT1JTOgotCQkJCXNldEF1dGhvcnMoQVVUSE9SU19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX19DSEFOR0VfREFURToKLQkJCQlzZXRDaGFuZ2VEYXRlKENIQU5HRV9EQVRFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfX0NIQU5HRV9ERVNDUklQVElPTjoKLQkJCQlzZXRDaGFuZ2VEZXNjcmlwdGlvbihDSEFOR0VfREVTQ1JJUFRJT05fRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9fVkVSU0lPTjoKLQkJCQlzZXRWZXJzaW9uKFZFUlNJT05fRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX19DT1BZUklHSFQ6Ci0JCQkJcmV0dXJuIENPUFlSSUdIVF9FREVGQVVMVCA9PSBudWxsID8gY29weXJpZ2h0ICE9IG51bGwgOiAhQ09QWVJJR0hUX0VERUZBVUxULmVxdWFscyhjb3B5cmlnaHQpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX19JTlRFUkZBQ0U6Ci0JCQkJcmV0dXJuIGludGVyZmFjZV8gIT0gbnVsbDsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9fUFJPQ0VTUzoKLQkJCQlyZXR1cm4gcHJvY2VzcyAhPSBudWxsOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX19BVVRIT1JTOgotCQkJCXJldHVybiBBVVRIT1JTX0VERUZBVUxUID09IG51bGwgPyBhdXRob3JzICE9IG51bGwgOiAhQVVUSE9SU19FREVGQVVMVC5lcXVhbHMoYXV0aG9ycyk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfX0NIQU5HRV9EQVRFOgotCQkJCXJldHVybiBDSEFOR0VfREFURV9FREVGQVVMVCA9PSBudWxsID8gY2hhbmdlRGF0ZSAhPSBudWxsIDogIUNIQU5HRV9EQVRFX0VERUZBVUxULmVxdWFscyhjaGFuZ2VEYXRlKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9fQ0hBTkdFX0RFU0NSSVBUSU9OOgotCQkJCXJldHVybiBDSEFOR0VfREVTQ1JJUFRJT05fRURFRkFVTFQgPT0gbnVsbCA/IGNoYW5nZURlc2NyaXB0aW9uICE9IG51bGwgOiAhQ0hBTkdFX0RFU0NSSVBUSU9OX0VERUZBVUxULmVxdWFscyhjaGFuZ2VEZXNjcmlwdGlvbik7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfX1ZFUlNJT046Ci0JCQkJcmV0dXJuIFZFUlNJT05fRURFRkFVTFQgPT0gbnVsbCA/IHZlcnNpb24gIT0gbnVsbCA6ICFWRVJTSU9OX0VERUZBVUxULmVxdWFscyh2ZXJzaW9uKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGNvcHlyaWdodDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoY29weXJpZ2h0KTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBhdXRob3JzOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChhdXRob3JzKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBjaGFuZ2VEYXRlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChjaGFuZ2VEYXRlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBjaGFuZ2VEZXNjcmlwdGlvbjogIik7Ci0JCXJlc3VsdC5hcHBlbmQoY2hhbmdlRGVzY3JpcHRpb24pOwotCQlyZXN1bHQuYXBwZW5kKCIsIHZlcnNpb246ICIpOwotCQlyZXN1bHQuYXBwZW5kKHZlcnNpb24pOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9Qcm9jZXNzQ29tcG9uZW50SW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1Byb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NWZjNzFkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1Byb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTMgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlSW1wbC5qYXZhLHYgMS4yIDIwMDgvMDEvMzAgMDA6NDE6NDcga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuQmFzaWNGZWF0dXJlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRhc2tEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UHJvY2VzcyBDb21wb25lbnQgSW50ZXJmYWNlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VJbXBsI2dldEdyb3VwMiA8ZW0+R3JvdXAyPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VJbXBsI2dldEludGVyZmFjZVNwZWNpZmljYXRpb24gPGVtPkludGVyZmFjZSBTcGVjaWZpY2F0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VJbXBsI2dldEludGVyZmFjZUlPIDxlbT5JbnRlcmZhY2UgSU88L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlSW1wbCBleHRlbmRzIEJyZWFrZG93bkVsZW1lbnRJbXBsIGltcGxlbWVudHMgUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0R3JvdXAyKCkgPGVtPkdyb3VwMjwvZW0+fScgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRHcm91cDIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBGZWF0dXJlTWFwIGdyb3VwMjsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLlBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRmVhdHVyZU1hcCBnZXRHcm91cDIoKSB7Ci0JCWlmIChncm91cDIgPT0gbnVsbCkgewotCQkJZ3JvdXAyID0gbmV3IEJhc2ljRmVhdHVyZU1hcCh0aGlzLCBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRV9fR1JPVVAyKTsKLQkJfQotCQlyZXR1cm4gZ3JvdXAyOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxUYXNrRGVzY3JpcHRvcj4gZ2V0SW50ZXJmYWNlU3BlY2lmaWNhdGlvbigpIHsKLQkJcmV0dXJuIGdldEdyb3VwMigpLmxpc3QoVW1hUGFja2FnZS5MaXRlcmFscy5QUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfX0lOVEVSRkFDRV9TUEVDSUZJQ0FUSU9OKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8V29ya1Byb2R1Y3REZXNjcmlwdG9yPiBnZXRJbnRlcmZhY2VJTygpIHsKLQkJcmV0dXJuIGdldEdyb3VwMigpLmxpc3QoVW1hUGFja2FnZS5MaXRlcmFscy5QUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfX0lOVEVSRkFDRV9JTyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRV9fR1JPVVAyOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0R3JvdXAyKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfX0lOVEVSRkFDRV9TUEVDSUZJQ0FUSU9OOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0SW50ZXJmYWNlU3BlY2lmaWNhdGlvbigpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfSU5URVJGQUNFX19JTlRFUkZBQ0VfSU86Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRJbnRlcmZhY2VJTygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfX0dST1VQMjoKLQkJCQlpZiAoY29yZVR5cGUpIHJldHVybiBnZXRHcm91cDIoKTsKLQkJCQlyZXR1cm4gKChGZWF0dXJlTWFwLkludGVybmFsKWdldEdyb3VwMigpKS5nZXRXcmFwcGVyKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfSU5URVJGQUNFX19JTlRFUkZBQ0VfU1BFQ0lGSUNBVElPTjoKLQkJCQlyZXR1cm4gZ2V0SW50ZXJmYWNlU3BlY2lmaWNhdGlvbigpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRV9fSU5URVJGQUNFX0lPOgotCQkJCXJldHVybiBnZXRJbnRlcmZhY2VJTygpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRV9fR1JPVVAyOgotCQkJCSgoRmVhdHVyZU1hcC5JbnRlcm5hbClnZXRHcm91cDIoKSkuc2V0KG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfSU5URVJGQUNFX19JTlRFUkZBQ0VfU1BFQ0lGSUNBVElPTjoKLQkJCQlnZXRJbnRlcmZhY2VTcGVjaWZpY2F0aW9uKCkuY2xlYXIoKTsKLQkJCQlnZXRJbnRlcmZhY2VTcGVjaWZpY2F0aW9uKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBUYXNrRGVzY3JpcHRvcj4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfX0lOVEVSRkFDRV9JTzoKLQkJCQlnZXRJbnRlcmZhY2VJTygpLmNsZWFyKCk7Ci0JCQkJZ2V0SW50ZXJmYWNlSU8oKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFdvcmtQcm9kdWN0RGVzY3JpcHRvcj4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfSU5URVJGQUNFX19HUk9VUDI6Ci0JCQkJZ2V0R3JvdXAyKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfSU5URVJGQUNFX19JTlRFUkZBQ0VfU1BFQ0lGSUNBVElPTjoKLQkJCQlnZXRJbnRlcmZhY2VTcGVjaWZpY2F0aW9uKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfSU5URVJGQUNFX19JTlRFUkZBQ0VfSU86Ci0JCQkJZ2V0SW50ZXJmYWNlSU8oKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRV9fR1JPVVAyOgotCQkJCXJldHVybiBncm91cDIgIT0gbnVsbCAmJiAhZ3JvdXAyLmlzRW1wdHkoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfX0lOVEVSRkFDRV9TUEVDSUZJQ0FUSU9OOgotCQkJCXJldHVybiAhZ2V0SW50ZXJmYWNlU3BlY2lmaWNhdGlvbigpLmlzRW1wdHkoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfX0lOVEVSRkFDRV9JTzoKLQkJCQlyZXR1cm4gIWdldEludGVyZmFjZUlPKCkuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoZ3JvdXAyOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChncm91cDIpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlSW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1Byb2Nlc3NEZXNjcmlwdGlvbkltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1Byb2Nlc3NEZXNjcmlwdGlvbkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzJjMTNmNy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9Qcm9jZXNzRGVzY3JpcHRpb25JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTcgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBQcm9jZXNzRGVzY3JpcHRpb25JbXBsLmphdmEsdiAxLjIgMjAwOC8wMS8zMCAwMDo0MTo0NyBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UHJvY2VzcyBEZXNjcmlwdGlvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Qcm9jZXNzRGVzY3JpcHRpb25JbXBsI2dldFNjb3BlIDxlbT5TY29wZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Qcm9jZXNzRGVzY3JpcHRpb25JbXBsI2dldFVzYWdlTm90ZXMgPGVtPlVzYWdlIE5vdGVzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUHJvY2Vzc0Rlc2NyaXB0aW9uSW1wbCBleHRlbmRzIEFjdGl2aXR5RGVzY3JpcHRpb25JbXBsIGltcGxlbWVudHMgUHJvY2Vzc0Rlc2NyaXB0aW9uIHsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U2NvcGUoKSA8ZW0+U2NvcGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFNjb3BlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBTQ09QRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTY29wZSgpIDxlbT5TY29wZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U2NvcGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgc2NvcGUgPSBTQ09QRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRVc2FnZU5vdGVzKCkgPGVtPlVzYWdlIE5vdGVzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRVc2FnZU5vdGVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBVU0FHRV9OT1RFU19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRVc2FnZU5vdGVzKCkgPGVtPlVzYWdlIE5vdGVzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRVc2FnZU5vdGVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHVzYWdlTm90ZXMgPSBVU0FHRV9OT1RFU19FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBQcm9jZXNzRGVzY3JpcHRpb25JbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5QUk9DRVNTX0RFU0NSSVBUSU9OOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U2NvcGUoKSB7Ci0JCXJldHVybiBzY29wZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTY29wZShTdHJpbmcgbmV3U2NvcGUpIHsKLQkJU3RyaW5nIG9sZFNjb3BlID0gc2NvcGU7Ci0JCXNjb3BlID0gbmV3U2NvcGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuUFJPQ0VTU19ERVNDUklQVElPTl9fU0NPUEUsIG9sZFNjb3BlLCBzY29wZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VXNhZ2VOb3RlcygpIHsKLQkJcmV0dXJuIHVzYWdlTm90ZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VXNhZ2VOb3RlcyhTdHJpbmcgbmV3VXNhZ2VOb3RlcykgewotCQlTdHJpbmcgb2xkVXNhZ2VOb3RlcyA9IHVzYWdlTm90ZXM7Ci0JCXVzYWdlTm90ZXMgPSBuZXdVc2FnZU5vdGVzOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLlBST0NFU1NfREVTQ1JJUFRJT05fX1VTQUdFX05PVEVTLCBvbGRVc2FnZU5vdGVzLCB1c2FnZU5vdGVzKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfREVTQ1JJUFRJT05fX1NDT1BFOgotCQkJCXJldHVybiBnZXRTY29wZSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfREVTQ1JJUFRJT05fX1VTQUdFX05PVEVTOgotCQkJCXJldHVybiBnZXRVc2FnZU5vdGVzKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0RFU0NSSVBUSU9OX19TQ09QRToKLQkJCQlzZXRTY29wZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19ERVNDUklQVElPTl9fVVNBR0VfTk9URVM6Ci0JCQkJc2V0VXNhZ2VOb3RlcygoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfREVTQ1JJUFRJT05fX1NDT1BFOgotCQkJCXNldFNjb3BlKFNDT1BFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19ERVNDUklQVElPTl9fVVNBR0VfTk9URVM6Ci0JCQkJc2V0VXNhZ2VOb3RlcyhVU0FHRV9OT1RFU19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19ERVNDUklQVElPTl9fU0NPUEU6Ci0JCQkJcmV0dXJuIFNDT1BFX0VERUZBVUxUID09IG51bGwgPyBzY29wZSAhPSBudWxsIDogIVNDT1BFX0VERUZBVUxULmVxdWFscyhzY29wZSk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19ERVNDUklQVElPTl9fVVNBR0VfTk9URVM6Ci0JCQkJcmV0dXJuIFVTQUdFX05PVEVTX0VERUZBVUxUID09IG51bGwgPyB1c2FnZU5vdGVzICE9IG51bGwgOiAhVVNBR0VfTk9URVNfRURFRkFVTFQuZXF1YWxzKHVzYWdlTm90ZXMpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoc2NvcGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHNjb3BlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCB1c2FnZU5vdGVzOiAiKTsKLQkJcmVzdWx0LmFwcGVuZCh1c2FnZU5vdGVzKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vUHJvY2Vzc0Rlc2NyaXB0aW9uSW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1Byb2Nlc3NFbGVtZW50SW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvUHJvY2Vzc0VsZW1lbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3YmJjYTAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvUHJvY2Vzc0VsZW1lbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFByb2Nlc3NFbGVtZW50SW1wbC5qYXZhLHYgMS4yIDIwMDgvMDEvMzAgMDA6NDE6NDcga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Qcm9jZXNzIEVsZW1lbnQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9jZXNzRWxlbWVudEltcGwgZXh0ZW5kcyBEZXNjcmliYWJsZUVsZW1lbnRJbXBsIGltcGxlbWVudHMgUHJvY2Vzc0VsZW1lbnQgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBQcm9jZXNzRWxlbWVudEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLlBST0NFU1NfRUxFTUVOVDsKLQl9Ci0KLX0gLy9Qcm9jZXNzRWxlbWVudEltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9Qcm9jZXNzSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvUHJvY2Vzc0ltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDViNzM4MS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9Qcm9jZXNzSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjk4ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogUHJvY2Vzc0ltcGwuamF2YSx2IDEuMiAyMDA4LzAxLzMwIDAwOjQxOjQ3IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FRGF0YVR5cGVFTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Qcm9jZXNzPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlByb2Nlc3NJbXBsI2dldEluY2x1ZGVzUGF0dGVybiA8ZW0+SW5jbHVkZXMgUGF0dGVybjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Qcm9jZXNzSW1wbCNnZXREZWZhdWx0Q29udGV4dCA8ZW0+RGVmYXVsdCBDb250ZXh0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlByb2Nlc3NJbXBsI2dldFZhbGlkQ29udGV4dCA8ZW0+VmFsaWQgQ29udGV4dDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Qcm9jZXNzSW1wbCNnZXREaWFncmFtVVJJIDxlbT5EaWFncmFtIFVSSTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFByb2Nlc3NJbXBsIGV4dGVuZHMgQWN0aXZpdHlJbXBsIGltcGxlbWVudHMgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2VzcyB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SW5jbHVkZXNQYXR0ZXJuKCkgPGVtPkluY2x1ZGVzIFBhdHRlcm48L2VtPn0nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SW5jbHVkZXNQYXR0ZXJuKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8U3RyaW5nPiBpbmNsdWRlc1BhdHRlcm47Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVmYXVsdENvbnRleHQoKSA8ZW0+RGVmYXVsdCBDb250ZXh0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREZWZhdWx0Q29udGV4dCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9DT05URVhUX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlZmF1bHRDb250ZXh0KCkgPGVtPkRlZmF1bHQgQ29udGV4dDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGVmYXVsdENvbnRleHQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZGVmYXVsdENvbnRleHQgPSBERUZBVUxUX0NPTlRFWFRfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWYWxpZENvbnRleHQoKSA8ZW0+VmFsaWQgQ29udGV4dDwvZW0+fScgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRWYWxpZENvbnRleHQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxTdHJpbmc+IHZhbGlkQ29udGV4dDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREaWFncmFtVVJJKCkgPGVtPkRpYWdyYW0gVVJJPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREaWFncmFtVVJJKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBESUFHUkFNX1VSSV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREaWFncmFtVVJJKCkgPGVtPkRpYWdyYW0gVVJJPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREaWFncmFtVVJJKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGRpYWdyYW1VUkkgPSBESUFHUkFNX1VSSV9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBQcm9jZXNzSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuUFJPQ0VTUzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8U3RyaW5nPiBnZXRJbmNsdWRlc1BhdHRlcm4oKSB7Ci0JCWlmIChpbmNsdWRlc1BhdHRlcm4gPT0gbnVsbCkgewotCQkJaW5jbHVkZXNQYXR0ZXJuID0gbmV3IEVEYXRhVHlwZUVMaXN0PFN0cmluZz4oU3RyaW5nLmNsYXNzLCB0aGlzLCBVbWFQYWNrYWdlLlBST0NFU1NfX0lOQ0xVREVTX1BBVFRFUk4pOwotCQl9Ci0JCXJldHVybiBpbmNsdWRlc1BhdHRlcm47Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0Q29udGV4dCgpIHsKLQkJcmV0dXJuIGRlZmF1bHRDb250ZXh0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlZmF1bHRDb250ZXh0KFN0cmluZyBuZXdEZWZhdWx0Q29udGV4dCkgewotCQlTdHJpbmcgb2xkRGVmYXVsdENvbnRleHQgPSBkZWZhdWx0Q29udGV4dDsKLQkJZGVmYXVsdENvbnRleHQgPSBuZXdEZWZhdWx0Q29udGV4dDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5QUk9DRVNTX19ERUZBVUxUX0NPTlRFWFQsIG9sZERlZmF1bHRDb250ZXh0LCBkZWZhdWx0Q29udGV4dCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxTdHJpbmc+IGdldFZhbGlkQ29udGV4dCgpIHsKLQkJaWYgKHZhbGlkQ29udGV4dCA9PSBudWxsKSB7Ci0JCQl2YWxpZENvbnRleHQgPSBuZXcgRURhdGFUeXBlRUxpc3Q8U3RyaW5nPihTdHJpbmcuY2xhc3MsIHRoaXMsIFVtYVBhY2thZ2UuUFJPQ0VTU19fVkFMSURfQ09OVEVYVCk7Ci0JCX0KLQkJcmV0dXJuIHZhbGlkQ29udGV4dDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERpYWdyYW1VUkkoKSB7Ci0JCXJldHVybiBkaWFncmFtVVJJOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldERpYWdyYW1VUkkoU3RyaW5nIG5ld0RpYWdyYW1VUkkpIHsKLQkJU3RyaW5nIG9sZERpYWdyYW1VUkkgPSBkaWFncmFtVVJJOwotCQlkaWFncmFtVVJJID0gbmV3RGlhZ3JhbVVSSTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5QUk9DRVNTX19ESUFHUkFNX1VSSSwgb2xkRGlhZ3JhbVVSSSwgZGlhZ3JhbVVSSSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX19JTkNMVURFU19QQVRURVJOOgotCQkJCXJldHVybiBnZXRJbmNsdWRlc1BhdHRlcm4oKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX19ERUZBVUxUX0NPTlRFWFQ6Ci0JCQkJcmV0dXJuIGdldERlZmF1bHRDb250ZXh0KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19fVkFMSURfQ09OVEVYVDoKLQkJCQlyZXR1cm4gZ2V0VmFsaWRDb250ZXh0KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19fRElBR1JBTV9VUkk6Ci0JCQkJcmV0dXJuIGdldERpYWdyYW1VUkkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX19JTkNMVURFU19QQVRURVJOOgotCQkJCWdldEluY2x1ZGVzUGF0dGVybigpLmNsZWFyKCk7Ci0JCQkJZ2V0SW5jbHVkZXNQYXR0ZXJuKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBTdHJpbmc+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19fREVGQVVMVF9DT05URVhUOgotCQkJCXNldERlZmF1bHRDb250ZXh0KChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX19WQUxJRF9DT05URVhUOgotCQkJCWdldFZhbGlkQ29udGV4dCgpLmNsZWFyKCk7Ci0JCQkJZ2V0VmFsaWRDb250ZXh0KCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBTdHJpbmc+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19fRElBR1JBTV9VUkk6Ci0JCQkJc2V0RGlhZ3JhbVVSSSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfX0lOQ0xVREVTX1BBVFRFUk46Ci0JCQkJZ2V0SW5jbHVkZXNQYXR0ZXJuKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19fREVGQVVMVF9DT05URVhUOgotCQkJCXNldERlZmF1bHRDb250ZXh0KERFRkFVTFRfQ09OVEVYVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfX1ZBTElEX0NPTlRFWFQ6Ci0JCQkJZ2V0VmFsaWRDb250ZXh0KCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19fRElBR1JBTV9VUkk6Ci0JCQkJc2V0RGlhZ3JhbVVSSShESUFHUkFNX1VSSV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19fSU5DTFVERVNfUEFUVEVSTjoKLQkJCQlyZXR1cm4gaW5jbHVkZXNQYXR0ZXJuICE9IG51bGwgJiYgIWluY2x1ZGVzUGF0dGVybi5pc0VtcHR5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19fREVGQVVMVF9DT05URVhUOgotCQkJCXJldHVybiBERUZBVUxUX0NPTlRFWFRfRURFRkFVTFQgPT0gbnVsbCA/IGRlZmF1bHRDb250ZXh0ICE9IG51bGwgOiAhREVGQVVMVF9DT05URVhUX0VERUZBVUxULmVxdWFscyhkZWZhdWx0Q29udGV4dCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19fVkFMSURfQ09OVEVYVDoKLQkJCQlyZXR1cm4gdmFsaWRDb250ZXh0ICE9IG51bGwgJiYgIXZhbGlkQ29udGV4dC5pc0VtcHR5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19fRElBR1JBTV9VUkk6Ci0JCQkJcmV0dXJuIERJQUdSQU1fVVJJX0VERUZBVUxUID09IG51bGwgPyBkaWFncmFtVVJJICE9IG51bGwgOiAhRElBR1JBTV9VUklfRURFRkFVTFQuZXF1YWxzKGRpYWdyYW1VUkkpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoaW5jbHVkZXNQYXR0ZXJuOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChpbmNsdWRlc1BhdHRlcm4pOwotCQlyZXN1bHQuYXBwZW5kKCIsIGRlZmF1bHRDb250ZXh0OiAiKTsKLQkJcmVzdWx0LmFwcGVuZChkZWZhdWx0Q29udGV4dCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgdmFsaWRDb250ZXh0OiAiKTsKLQkJcmVzdWx0LmFwcGVuZCh2YWxpZENvbnRleHQpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGRpYWdyYW1VUkk6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGRpYWdyYW1VUkkpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9Qcm9jZXNzSW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1Byb2Nlc3NQYWNrYWdlSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvUHJvY2Vzc1BhY2thZ2VJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxZGZhOWIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvUHJvY2Vzc1BhY2thZ2VJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTAgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBQcm9jZXNzUGFja2FnZUltcGwuamF2YSx2IDEuMiAyMDA4LzAxLzMwIDAwOjQxOjQ3IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkJhc2ljRmVhdHVyZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc0VsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc1BhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlByb2Nlc3MgUGFja2FnZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Qcm9jZXNzUGFja2FnZUltcGwjZ2V0R3JvdXAyIDxlbT5Hcm91cDI8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUHJvY2Vzc1BhY2thZ2VJbXBsI2dldFByb2Nlc3NFbGVtZW50IDxlbT5Qcm9jZXNzIEVsZW1lbnQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9jZXNzUGFja2FnZUltcGwgZXh0ZW5kcyBNZXRob2RQYWNrYWdlSW1wbCBpbXBsZW1lbnRzIFByb2Nlc3NQYWNrYWdlIHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRHcm91cDIoKSA8ZW0+R3JvdXAyPC9lbT59JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEdyb3VwMigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEZlYXR1cmVNYXAgZ3JvdXAyOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFByb2Nlc3NQYWNrYWdlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuUFJPQ0VTU19QQUNLQUdFOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBGZWF0dXJlTWFwIGdldEdyb3VwMigpIHsKLQkJaWYgKGdyb3VwMiA9PSBudWxsKSB7Ci0JCQlncm91cDIgPSBuZXcgQmFzaWNGZWF0dXJlTWFwKHRoaXMsIFVtYVBhY2thZ2UuUFJPQ0VTU19QQUNLQUdFX19HUk9VUDIpOwotCQl9Ci0JCXJldHVybiBncm91cDI7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFByb2Nlc3NFbGVtZW50PiBnZXRQcm9jZXNzRWxlbWVudCgpIHsKLQkJcmV0dXJuIGdldEdyb3VwMigpLmxpc3QoVW1hUGFja2FnZS5MaXRlcmFscy5QUk9DRVNTX1BBQ0tBR0VfX1BST0NFU1NfRUxFTUVOVCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfUEFDS0FHRV9fR1JPVVAyOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0R3JvdXAyKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX1BBQ0tBR0VfX1BST0NFU1NfRUxFTUVOVDoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldFByb2Nlc3NFbGVtZW50KCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfUEFDS0FHRV9fR1JPVVAyOgotCQkJCWlmIChjb3JlVHlwZSkgcmV0dXJuIGdldEdyb3VwMigpOwotCQkJCXJldHVybiAoKEZlYXR1cmVNYXAuSW50ZXJuYWwpZ2V0R3JvdXAyKCkpLmdldFdyYXBwZXIoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX1BBQ0tBR0VfX1BST0NFU1NfRUxFTUVOVDoKLQkJCQlyZXR1cm4gZ2V0UHJvY2Vzc0VsZW1lbnQoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX1BBQ0tBR0VfX0dST1VQMjoKLQkJCQkoKEZlYXR1cmVNYXAuSW50ZXJuYWwpZ2V0R3JvdXAyKCkpLnNldChuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfUEFDS0FHRV9fUFJPQ0VTU19FTEVNRU5UOgotCQkJCWdldFByb2Nlc3NFbGVtZW50KCkuY2xlYXIoKTsKLQkJCQlnZXRQcm9jZXNzRWxlbWVudCgpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgUHJvY2Vzc0VsZW1lbnQ+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfUEFDS0FHRV9fR1JPVVAyOgotCQkJCWdldEdyb3VwMigpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfUEFDS0FHRV9fUFJPQ0VTU19FTEVNRU5UOgotCQkJCWdldFByb2Nlc3NFbGVtZW50KCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX1BBQ0tBR0VfX0dST1VQMjoKLQkJCQlyZXR1cm4gZ3JvdXAyICE9IG51bGwgJiYgIWdyb3VwMi5pc0VtcHR5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19QQUNLQUdFX19QUk9DRVNTX0VMRU1FTlQ6Ci0JCQkJcmV0dXJuICFnZXRQcm9jZXNzRWxlbWVudCgpLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGdyb3VwMjogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZ3JvdXAyKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vUHJvY2Vzc1BhY2thZ2VJbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGVJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9Qcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDE1OWNjNy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9Qcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NiArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFByb2Nlc3NQbGFubmluZ1RlbXBsYXRlSW1wbC5qYXZhLHYgMS4yIDIwMDgvMDEvMzAgMDA6NDE6NDcga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuQmFzaWNGZWF0dXJlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UHJvY2VzcyBQbGFubmluZyBUZW1wbGF0ZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Qcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZUltcGwjZ2V0R3JvdXA0IDxlbT5Hcm91cDQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGVJbXBsI2dldEJhc2VQcm9jZXNzIDxlbT5CYXNlIFByb2Nlc3M8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZUltcGwgZXh0ZW5kcyBQcm9jZXNzSW1wbCBpbXBsZW1lbnRzIFByb2Nlc3NQbGFubmluZ1RlbXBsYXRlIHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRHcm91cDQoKSA8ZW0+R3JvdXA0PC9lbT59JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEdyb3VwNCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEZlYXR1cmVNYXAgZ3JvdXA0OwotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLlBST0NFU1NfUExBTk5JTkdfVEVNUExBVEU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEZlYXR1cmVNYXAgZ2V0R3JvdXA0KCkgewotCQlpZiAoZ3JvdXA0ID09IG51bGwpIHsKLQkJCWdyb3VwNCA9IG5ldyBCYXNpY0ZlYXR1cmVNYXAodGhpcywgVW1hUGFja2FnZS5QUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19HUk9VUDQpOwotCQl9Ci0JCXJldHVybiBncm91cDQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFN0cmluZz4gZ2V0QmFzZVByb2Nlc3MoKSB7Ci0JCXJldHVybiBnZXRHcm91cDQoKS5saXN0KFVtYVBhY2thZ2UuTGl0ZXJhbHMuUFJPQ0VTU19QTEFOTklOR19URU1QTEFURV9fQkFTRV9QUk9DRVNTKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19QTEFOTklOR19URU1QTEFURV9fR1JPVVA0OgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0R3JvdXA0KCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX0dST1VQNDoKLQkJCQlpZiAoY29yZVR5cGUpIHJldHVybiBnZXRHcm91cDQoKTsKLQkJCQlyZXR1cm4gKChGZWF0dXJlTWFwLkludGVybmFsKWdldEdyb3VwNCgpKS5nZXRXcmFwcGVyKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19QTEFOTklOR19URU1QTEFURV9fQkFTRV9QUk9DRVNTOgotCQkJCXJldHVybiBnZXRCYXNlUHJvY2VzcygpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX0dST1VQNDoKLQkJCQkoKEZlYXR1cmVNYXAuSW50ZXJuYWwpZ2V0R3JvdXA0KCkpLnNldChuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX0JBU0VfUFJPQ0VTUzoKLQkJCQlnZXRCYXNlUHJvY2VzcygpLmNsZWFyKCk7Ci0JCQkJZ2V0QmFzZVByb2Nlc3MoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFN0cmluZz4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19QTEFOTklOR19URU1QTEFURV9fR1JPVVA0OgotCQkJCWdldEdyb3VwNCgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX0JBU0VfUFJPQ0VTUzoKLQkJCQlnZXRCYXNlUHJvY2VzcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19QTEFOTklOR19URU1QTEFURV9fR1JPVVA0OgotCQkJCXJldHVybiBncm91cDQgIT0gbnVsbCAmJiAhZ3JvdXA0LmlzRW1wdHkoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19CQVNFX1BST0NFU1M6Ci0JCQkJcmV0dXJuICFnZXRCYXNlUHJvY2VzcygpLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGdyb3VwNDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZ3JvdXA0KTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGVJbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvUmVwb3J0SW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvUmVwb3J0SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYjBiNTUxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1JlcG9ydEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogUmVwb3J0SW1wbC5qYXZhLHYgMS4yIDIwMDgvMDEvMzAgMDA6NDE6NDcga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJlcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UmVwb3J0PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUmVwb3J0SW1wbCBleHRlbmRzIEd1aWRhbmNlSW1wbCBpbXBsZW1lbnRzIFJlcG9ydCB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFJlcG9ydEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLlJFUE9SVDsKLQl9Ci0KLX0gLy9SZXBvcnRJbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvUmV1c2FibGVBc3NldEltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1JldXNhYmxlQXNzZXRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3MzU3ZDIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvUmV1c2FibGVBc3NldEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogUmV1c2FibGVBc3NldEltcGwuamF2YSx2IDEuMiAyMDA4LzAxLzMwIDAwOjQxOjQ3IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5SZXVzYWJsZUFzc2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5SZXVzYWJsZSBBc3NldDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFJldXNhYmxlQXNzZXRJbXBsIGV4dGVuZHMgR3VpZGFuY2VJbXBsIGltcGxlbWVudHMgUmV1c2FibGVBc3NldCB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFJldXNhYmxlQXNzZXRJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5SRVVTQUJMRV9BU1NFVDsKLQl9Ci0KLX0gLy9SZXVzYWJsZUFzc2V0SW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1JvYWRtYXBJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9Sb2FkbWFwSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZWUxOWRjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1JvYWRtYXBJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFJvYWRtYXBJbXBsLmphdmEsdiAxLjIgMjAwOC8wMS8zMCAwMDo0MTo0NyBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUm9hZG1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Um9hZG1hcDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFJvYWRtYXBJbXBsIGV4dGVuZHMgR3VpZGFuY2VJbXBsIGltcGxlbWVudHMgUm9hZG1hcCB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFJvYWRtYXBJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5ST0FETUFQOwotCX0KLQotfSAvL1JvYWRtYXBJbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvUm9sZURlc2NyaXB0aW9uSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvUm9sZURlc2NyaXB0aW9uSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YjgyY2ExLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1JvbGVEZXNjcmlwdGlvbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3MSArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFJvbGVEZXNjcmlwdGlvbkltcGwuamF2YSx2IDEuMiAyMDA4LzAxLzMwIDAwOjQxOjQ3IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUm9sZURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Sb2xlIERlc2NyaXB0aW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlJvbGVEZXNjcmlwdGlvbkltcGwjZ2V0QXNzaWdubWVudEFwcHJvYWNoZXMgPGVtPkFzc2lnbm1lbnQgQXBwcm9hY2hlczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Sb2xlRGVzY3JpcHRpb25JbXBsI2dldFNraWxscyA8ZW0+U2tpbGxzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlJvbGVEZXNjcmlwdGlvbkltcGwjZ2V0U3lub255bXMgPGVtPlN5bm9ueW1zPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUm9sZURlc2NyaXB0aW9uSW1wbCBleHRlbmRzIENvbnRlbnREZXNjcmlwdGlvbkltcGwgaW1wbGVtZW50cyBSb2xlRGVzY3JpcHRpb24gewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBc3NpZ25tZW50QXBwcm9hY2hlcygpIDxlbT5Bc3NpZ25tZW50IEFwcHJvYWNoZXM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFzc2lnbm1lbnRBcHByb2FjaGVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBBU1NJR05NRU5UX0FQUFJPQUNIRVNfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QXNzaWdubWVudEFwcHJvYWNoZXMoKSA8ZW0+QXNzaWdubWVudCBBcHByb2FjaGVzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBc3NpZ25tZW50QXBwcm9hY2hlcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBhc3NpZ25tZW50QXBwcm9hY2hlcyA9IEFTU0lHTk1FTlRfQVBQUk9BQ0hFU19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTa2lsbHMoKSA8ZW0+U2tpbGxzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTa2lsbHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFNLSUxMU19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTa2lsbHMoKSA8ZW0+U2tpbGxzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTa2lsbHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgc2tpbGxzID0gU0tJTExTX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFN5bm9ueW1zKCkgPGVtPlN5bm9ueW1zPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTeW5vbnltcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1lOT05ZTVNfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U3lub255bXMoKSA8ZW0+U3lub255bXM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFN5bm9ueW1zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHN5bm9ueW1zID0gU1lOT05ZTVNfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUm9sZURlc2NyaXB0aW9uSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuUk9MRV9ERVNDUklQVElPTjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEFzc2lnbm1lbnRBcHByb2FjaGVzKCkgewotCQlyZXR1cm4gYXNzaWdubWVudEFwcHJvYWNoZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QXNzaWdubWVudEFwcHJvYWNoZXMoU3RyaW5nIG5ld0Fzc2lnbm1lbnRBcHByb2FjaGVzKSB7Ci0JCVN0cmluZyBvbGRBc3NpZ25tZW50QXBwcm9hY2hlcyA9IGFzc2lnbm1lbnRBcHByb2FjaGVzOwotCQlhc3NpZ25tZW50QXBwcm9hY2hlcyA9IG5ld0Fzc2lnbm1lbnRBcHByb2FjaGVzOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLlJPTEVfREVTQ1JJUFRJT05fX0FTU0lHTk1FTlRfQVBQUk9BQ0hFUywgb2xkQXNzaWdubWVudEFwcHJvYWNoZXMsIGFzc2lnbm1lbnRBcHByb2FjaGVzKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTa2lsbHMoKSB7Ci0JCXJldHVybiBza2lsbHM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2tpbGxzKFN0cmluZyBuZXdTa2lsbHMpIHsKLQkJU3RyaW5nIG9sZFNraWxscyA9IHNraWxsczsKLQkJc2tpbGxzID0gbmV3U2tpbGxzOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLlJPTEVfREVTQ1JJUFRJT05fX1NLSUxMUywgb2xkU2tpbGxzLCBza2lsbHMpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFN5bm9ueW1zKCkgewotCQlyZXR1cm4gc3lub255bXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0U3lub255bXMoU3RyaW5nIG5ld1N5bm9ueW1zKSB7Ci0JCVN0cmluZyBvbGRTeW5vbnltcyA9IHN5bm9ueW1zOwotCQlzeW5vbnltcyA9IG5ld1N5bm9ueW1zOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLlJPTEVfREVTQ1JJUFRJT05fX1NZTk9OWU1TLCBvbGRTeW5vbnltcywgc3lub255bXMpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9ERVNDUklQVElPTl9fQVNTSUdOTUVOVF9BUFBST0FDSEVTOgotCQkJCXJldHVybiBnZXRBc3NpZ25tZW50QXBwcm9hY2hlcygpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfREVTQ1JJUFRJT05fX1NLSUxMUzoKLQkJCQlyZXR1cm4gZ2V0U2tpbGxzKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9ERVNDUklQVElPTl9fU1lOT05ZTVM6Ci0JCQkJcmV0dXJuIGdldFN5bm9ueW1zKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5ST0xFX0RFU0NSSVBUSU9OX19BU1NJR05NRU5UX0FQUFJPQUNIRVM6Ci0JCQkJc2V0QXNzaWdubWVudEFwcHJvYWNoZXMoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfREVTQ1JJUFRJT05fX1NLSUxMUzoKLQkJCQlzZXRTa2lsbHMoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfREVTQ1JJUFRJT05fX1NZTk9OWU1TOgotCQkJCXNldFN5bm9ueW1zKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9ERVNDUklQVElPTl9fQVNTSUdOTUVOVF9BUFBST0FDSEVTOgotCQkJCXNldEFzc2lnbm1lbnRBcHByb2FjaGVzKEFTU0lHTk1FTlRfQVBQUk9BQ0hFU19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfREVTQ1JJUFRJT05fX1NLSUxMUzoKLQkJCQlzZXRTa2lsbHMoU0tJTExTX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9ERVNDUklQVElPTl9fU1lOT05ZTVM6Ci0JCQkJc2V0U3lub255bXMoU1lOT05ZTVNfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfREVTQ1JJUFRJT05fX0FTU0lHTk1FTlRfQVBQUk9BQ0hFUzoKLQkJCQlyZXR1cm4gQVNTSUdOTUVOVF9BUFBST0FDSEVTX0VERUZBVUxUID09IG51bGwgPyBhc3NpZ25tZW50QXBwcm9hY2hlcyAhPSBudWxsIDogIUFTU0lHTk1FTlRfQVBQUk9BQ0hFU19FREVGQVVMVC5lcXVhbHMoYXNzaWdubWVudEFwcHJvYWNoZXMpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfREVTQ1JJUFRJT05fX1NLSUxMUzoKLQkJCQlyZXR1cm4gU0tJTExTX0VERUZBVUxUID09IG51bGwgPyBza2lsbHMgIT0gbnVsbCA6ICFTS0lMTFNfRURFRkFVTFQuZXF1YWxzKHNraWxscyk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9ERVNDUklQVElPTl9fU1lOT05ZTVM6Ci0JCQkJcmV0dXJuIFNZTk9OWU1TX0VERUZBVUxUID09IG51bGwgPyBzeW5vbnltcyAhPSBudWxsIDogIVNZTk9OWU1TX0VERUZBVUxULmVxdWFscyhzeW5vbnltcyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChhc3NpZ25tZW50QXBwcm9hY2hlczogIik7Ci0JCXJlc3VsdC5hcHBlbmQoYXNzaWdubWVudEFwcHJvYWNoZXMpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHNraWxsczogIik7Ci0JCXJlc3VsdC5hcHBlbmQoc2tpbGxzKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBzeW5vbnltczogIik7Ci0JCXJlc3VsdC5hcHBlbmQoc3lub255bXMpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9Sb2xlRGVzY3JpcHRpb25JbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvUm9sZURlc2NyaXB0b3JJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9Sb2xlRGVzY3JpcHRvckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODA4ZWZmMy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9Sb2xlRGVzY3JpcHRvckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwNCArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFJvbGVEZXNjcmlwdG9ySW1wbC5qYXZhLHYgMS4yIDIwMDgvMDEvMzAgMDA6NDE6NDcga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FRGF0YVR5cGVFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Sb2xlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Um9sZSBEZXNjcmlwdG9yPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlJvbGVEZXNjcmlwdG9ySW1wbCNnZXRSb2xlIDxlbT5Sb2xlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlJvbGVEZXNjcmlwdG9ySW1wbCNnZXRSZXNwb25zaWJsZUZvciA8ZW0+UmVzcG9uc2libGUgRm9yPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUm9sZURlc2NyaXB0b3JJbXBsIGV4dGVuZHMgRGVzY3JpcHRvckltcGwgaW1wbGVtZW50cyBSb2xlRGVzY3JpcHRvciB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJvbGUoKSA8ZW0+Um9sZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Um9sZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUk9MRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSb2xlKCkgPGVtPlJvbGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJvbGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgcm9sZSA9IFJPTEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZXNwb25zaWJsZUZvcigpIDxlbT5SZXNwb25zaWJsZSBGb3I8L2VtPn0nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmVzcG9uc2libGVGb3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxTdHJpbmc+IHJlc3BvbnNpYmxlRm9yOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFJvbGVEZXNjcmlwdG9ySW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuUk9MRV9ERVNDUklQVE9SOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Um9sZSgpIHsKLQkJcmV0dXJuIHJvbGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Um9sZShTdHJpbmcgbmV3Um9sZSkgewotCQlTdHJpbmcgb2xkUm9sZSA9IHJvbGU7Ci0JCXJvbGUgPSBuZXdSb2xlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLlJPTEVfREVTQ1JJUFRPUl9fUk9MRSwgb2xkUm9sZSwgcm9sZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxTdHJpbmc+IGdldFJlc3BvbnNpYmxlRm9yKCkgewotCQlpZiAocmVzcG9uc2libGVGb3IgPT0gbnVsbCkgewotCQkJcmVzcG9uc2libGVGb3IgPSBuZXcgRURhdGFUeXBlRUxpc3Q8U3RyaW5nPihTdHJpbmcuY2xhc3MsIHRoaXMsIFVtYVBhY2thZ2UuUk9MRV9ERVNDUklQVE9SX19SRVNQT05TSUJMRV9GT1IpOwotCQl9Ci0JCXJldHVybiByZXNwb25zaWJsZUZvcjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9ERVNDUklQVE9SX19ST0xFOgotCQkJCXJldHVybiBnZXRSb2xlKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9ERVNDUklQVE9SX19SRVNQT05TSUJMRV9GT1I6Ci0JCQkJcmV0dXJuIGdldFJlc3BvbnNpYmxlRm9yKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9ERVNDUklQVE9SX19ST0xFOgotCQkJCXNldFJvbGUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfREVTQ1JJUFRPUl9fUkVTUE9OU0lCTEVfRk9SOgotCQkJCWdldFJlc3BvbnNpYmxlRm9yKCkuY2xlYXIoKTsKLQkJCQlnZXRSZXNwb25zaWJsZUZvcigpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgU3RyaW5nPiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5ST0xFX0RFU0NSSVBUT1JfX1JPTEU6Ci0JCQkJc2V0Um9sZShST0xFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9ERVNDUklQVE9SX19SRVNQT05TSUJMRV9GT1I6Ci0JCQkJZ2V0UmVzcG9uc2libGVGb3IoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfREVTQ1JJUFRPUl9fUk9MRToKLQkJCQlyZXR1cm4gUk9MRV9FREVGQVVMVCA9PSBudWxsID8gcm9sZSAhPSBudWxsIDogIVJPTEVfRURFRkFVTFQuZXF1YWxzKHJvbGUpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfREVTQ1JJUFRPUl9fUkVTUE9OU0lCTEVfRk9SOgotCQkJCXJldHVybiByZXNwb25zaWJsZUZvciAhPSBudWxsICYmICFyZXNwb25zaWJsZUZvci5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChyb2xlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChyb2xlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCByZXNwb25zaWJsZUZvcjogIik7Ci0JCXJlc3VsdC5hcHBlbmQocmVzcG9uc2libGVGb3IpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9Sb2xlRGVzY3JpcHRvckltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9Sb2xlSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvUm9sZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2I3MTc3ZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9Sb2xlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg3ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogUm9sZUltcGwuamF2YSx2IDEuMiAyMDA4LzAxLzMwIDAwOjQxOjQ3IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkJhc2ljRmVhdHVyZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Um9sZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Sb2xlSW1wbCNnZXRHcm91cDIgPGVtPkdyb3VwMjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Sb2xlSW1wbCNnZXRSZXNwb25zaWJsZUZvciA8ZW0+UmVzcG9uc2libGUgRm9yPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUm9sZUltcGwgZXh0ZW5kcyBDb250ZW50RWxlbWVudEltcGwgaW1wbGVtZW50cyBSb2xlIHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRHcm91cDIoKSA8ZW0+R3JvdXAyPC9lbT59JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEdyb3VwMigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEZlYXR1cmVNYXAgZ3JvdXAyOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFJvbGVJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5ST0xFOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBGZWF0dXJlTWFwIGdldEdyb3VwMigpIHsKLQkJaWYgKGdyb3VwMiA9PSBudWxsKSB7Ci0JCQlncm91cDIgPSBuZXcgQmFzaWNGZWF0dXJlTWFwKHRoaXMsIFVtYVBhY2thZ2UuUk9MRV9fR1JPVVAyKTsKLQkJfQotCQlyZXR1cm4gZ3JvdXAyOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxTdHJpbmc+IGdldFJlc3BvbnNpYmxlRm9yKCkgewotCQlyZXR1cm4gZ2V0R3JvdXAyKCkubGlzdChVbWFQYWNrYWdlLkxpdGVyYWxzLlJPTEVfX1JFU1BPTlNJQkxFX0ZPUik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfX0dST1VQMjoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldEdyb3VwMigpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5ST0xFX19HUk9VUDI6Ci0JCQkJaWYgKGNvcmVUeXBlKSByZXR1cm4gZ2V0R3JvdXAyKCk7Ci0JCQkJcmV0dXJuICgoRmVhdHVyZU1hcC5JbnRlcm5hbClnZXRHcm91cDIoKSkuZ2V0V3JhcHBlcigpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfX1JFU1BPTlNJQkxFX0ZPUjoKLQkJCQlyZXR1cm4gZ2V0UmVzcG9uc2libGVGb3IoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5ST0xFX19HUk9VUDI6Ci0JCQkJKChGZWF0dXJlTWFwLkludGVybmFsKWdldEdyb3VwMigpKS5zZXQobmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5ST0xFX19SRVNQT05TSUJMRV9GT1I6Ci0JCQkJZ2V0UmVzcG9uc2libGVGb3IoKS5jbGVhcigpOwotCQkJCWdldFJlc3BvbnNpYmxlRm9yKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBTdHJpbmc+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfX0dST1VQMjoKLQkJCQlnZXRHcm91cDIoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5ST0xFX19SRVNQT05TSUJMRV9GT1I6Ci0JCQkJZ2V0UmVzcG9uc2libGVGb3IoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfX0dST1VQMjoKLQkJCQlyZXR1cm4gZ3JvdXAyICE9IG51bGwgJiYgIWdyb3VwMi5pc0VtcHR5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9fUkVTUE9OU0lCTEVfRk9SOgotCQkJCXJldHVybiAhZ2V0UmVzcG9uc2libGVGb3IoKS5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChncm91cDI6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGdyb3VwMik7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL1JvbGVJbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvUm9sZVNldEdyb3VwaW5nSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvUm9sZVNldEdyb3VwaW5nSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYjNkMDkyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1JvbGVTZXRHcm91cGluZ0ltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NyArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFJvbGVTZXRHcm91cGluZ0ltcGwuamF2YSx2IDEuMiAyMDA4LzAxLzMwIDAwOjQxOjQ3IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkJhc2ljRmVhdHVyZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUm9sZVNldEdyb3VwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Sb2xlIFNldCBHcm91cGluZzwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Sb2xlU2V0R3JvdXBpbmdJbXBsI2dldEdyb3VwMiA8ZW0+R3JvdXAyPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlJvbGVTZXRHcm91cGluZ0ltcGwjZ2V0Um9sZVNldCA8ZW0+Um9sZSBTZXQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBSb2xlU2V0R3JvdXBpbmdJbXBsIGV4dGVuZHMgQ29udGVudENhdGVnb3J5SW1wbCBpbXBsZW1lbnRzIFJvbGVTZXRHcm91cGluZyB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0R3JvdXAyKCkgPGVtPkdyb3VwMjwvZW0+fScgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRHcm91cDIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBGZWF0dXJlTWFwIGdyb3VwMjsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBSb2xlU2V0R3JvdXBpbmdJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5ST0xFX1NFVF9HUk9VUElORzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRmVhdHVyZU1hcCBnZXRHcm91cDIoKSB7Ci0JCWlmIChncm91cDIgPT0gbnVsbCkgewotCQkJZ3JvdXAyID0gbmV3IEJhc2ljRmVhdHVyZU1hcCh0aGlzLCBVbWFQYWNrYWdlLlJPTEVfU0VUX0dST1VQSU5HX19HUk9VUDIpOwotCQl9Ci0JCXJldHVybiBncm91cDI7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFN0cmluZz4gZ2V0Um9sZVNldCgpIHsKLQkJcmV0dXJuIGdldEdyb3VwMigpLmxpc3QoVW1hUGFja2FnZS5MaXRlcmFscy5ST0xFX1NFVF9HUk9VUElOR19fUk9MRV9TRVQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5ST0xFX1NFVF9HUk9VUElOR19fR1JPVVAyOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0R3JvdXAyKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfU0VUX0dST1VQSU5HX19HUk9VUDI6Ci0JCQkJaWYgKGNvcmVUeXBlKSByZXR1cm4gZ2V0R3JvdXAyKCk7Ci0JCQkJcmV0dXJuICgoRmVhdHVyZU1hcC5JbnRlcm5hbClnZXRHcm91cDIoKSkuZ2V0V3JhcHBlcigpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfU0VUX0dST1VQSU5HX19ST0xFX1NFVDoKLQkJCQlyZXR1cm4gZ2V0Um9sZVNldCgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfU0VUX0dST1VQSU5HX19HUk9VUDI6Ci0JCQkJKChGZWF0dXJlTWFwLkludGVybmFsKWdldEdyb3VwMigpKS5zZXQobmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5ST0xFX1NFVF9HUk9VUElOR19fUk9MRV9TRVQ6Ci0JCQkJZ2V0Um9sZVNldCgpLmNsZWFyKCk7Ci0JCQkJZ2V0Um9sZVNldCgpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgU3RyaW5nPiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5ST0xFX1NFVF9HUk9VUElOR19fR1JPVVAyOgotCQkJCWdldEdyb3VwMigpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfU0VUX0dST1VQSU5HX19ST0xFX1NFVDoKLQkJCQlnZXRSb2xlU2V0KCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5ST0xFX1NFVF9HUk9VUElOR19fR1JPVVAyOgotCQkJCXJldHVybiBncm91cDIgIT0gbnVsbCAmJiAhZ3JvdXAyLmlzRW1wdHkoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5ST0xFX1NFVF9HUk9VUElOR19fUk9MRV9TRVQ6Ci0JCQkJcmV0dXJuICFnZXRSb2xlU2V0KCkuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoZ3JvdXAyOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChncm91cDIpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9Sb2xlU2V0R3JvdXBpbmdJbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvUm9sZVNldEltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1JvbGVTZXRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4NDU2ZTAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvUm9sZVNldEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NyArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFJvbGVTZXRJbXBsLmphdmEsdiAxLjIgMjAwOC8wMS8zMCAwMDo0MTo0NyBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5CYXNpY0ZlYXR1cmVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJvbGVTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlJvbGUgU2V0PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlJvbGVTZXRJbXBsI2dldEdyb3VwMiA8ZW0+R3JvdXAyPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlJvbGVTZXRJbXBsI2dldFJvbGUgPGVtPlJvbGU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBSb2xlU2V0SW1wbCBleHRlbmRzIENvbnRlbnRDYXRlZ29yeUltcGwgaW1wbGVtZW50cyBSb2xlU2V0IHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRHcm91cDIoKSA8ZW0+R3JvdXAyPC9lbT59JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEdyb3VwMigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEZlYXR1cmVNYXAgZ3JvdXAyOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFJvbGVTZXRJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5ST0xFX1NFVDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRmVhdHVyZU1hcCBnZXRHcm91cDIoKSB7Ci0JCWlmIChncm91cDIgPT0gbnVsbCkgewotCQkJZ3JvdXAyID0gbmV3IEJhc2ljRmVhdHVyZU1hcCh0aGlzLCBVbWFQYWNrYWdlLlJPTEVfU0VUX19HUk9VUDIpOwotCQl9Ci0JCXJldHVybiBncm91cDI7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFN0cmluZz4gZ2V0Um9sZSgpIHsKLQkJcmV0dXJuIGdldEdyb3VwMigpLmxpc3QoVW1hUGFja2FnZS5MaXRlcmFscy5ST0xFX1NFVF9fUk9MRSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfU0VUX19HUk9VUDI6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRHcm91cDIoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9TRVRfX0dST1VQMjoKLQkJCQlpZiAoY29yZVR5cGUpIHJldHVybiBnZXRHcm91cDIoKTsKLQkJCQlyZXR1cm4gKChGZWF0dXJlTWFwLkludGVybmFsKWdldEdyb3VwMigpKS5nZXRXcmFwcGVyKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9TRVRfX1JPTEU6Ci0JCQkJcmV0dXJuIGdldFJvbGUoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5ST0xFX1NFVF9fR1JPVVAyOgotCQkJCSgoRmVhdHVyZU1hcC5JbnRlcm5hbClnZXRHcm91cDIoKSkuc2V0KG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9TRVRfX1JPTEU6Ci0JCQkJZ2V0Um9sZSgpLmNsZWFyKCk7Ci0JCQkJZ2V0Um9sZSgpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgU3RyaW5nPiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5ST0xFX1NFVF9fR1JPVVAyOgotCQkJCWdldEdyb3VwMigpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfU0VUX19ST0xFOgotCQkJCWdldFJvbGUoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfU0VUX19HUk9VUDI6Ci0JCQkJcmV0dXJuIGdyb3VwMiAhPSBudWxsICYmICFncm91cDIuaXNFbXB0eSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfU0VUX19ST0xFOgotCQkJCXJldHVybiAhZ2V0Um9sZSgpLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGdyb3VwMjogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZ3JvdXAyKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vUm9sZVNldEltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9TZWN0aW9uSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvU2VjdGlvbkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmMyY2FlZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9TZWN0aW9uSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDk3ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogU2VjdGlvbkltcGwuamF2YSx2IDEuMiAyMDA4LzAxLzMwIDAwOjQxOjQ3IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5TZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVmFyaWFiaWxpdHlUeXBlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+U2VjdGlvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5TZWN0aW9uSW1wbCNnZXRTdWJTZWN0aW9uIDxlbT5TdWIgU2VjdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5TZWN0aW9uSW1wbCNnZXRQcmVkZWNlc3NvciA8ZW0+UHJlZGVjZXNzb3I8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuU2VjdGlvbkltcGwjZ2V0RGVzY3JpcHRpb24gPGVtPkRlc2NyaXB0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlNlY3Rpb25JbXBsI2dldFNlY3Rpb25OYW1lIDxlbT5TZWN0aW9uIE5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuU2VjdGlvbkltcGwjZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCA8ZW0+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5TZWN0aW9uSW1wbCNnZXRWYXJpYWJpbGl0eVR5cGUgPGVtPlZhcmlhYmlsaXR5IFR5cGU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBTZWN0aW9uSW1wbCBleHRlbmRzIE1ldGhvZEVsZW1lbnRJbXBsIGltcGxlbWVudHMgU2VjdGlvbiB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U3ViU2VjdGlvbigpIDxlbT5TdWIgU2VjdGlvbjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U3ViU2VjdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFNlY3Rpb24gc3ViU2VjdGlvbjsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQcmVkZWNlc3NvcigpIDxlbT5QcmVkZWNlc3NvcjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UHJlZGVjZXNzb3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRURFQ0VTU09SX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByZWRlY2Vzc29yKCkgPGVtPlByZWRlY2Vzc29yPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQcmVkZWNlc3NvcigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBwcmVkZWNlc3NvciA9IFBSRURFQ0VTU09SX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlc2NyaXB0aW9uKCkgPGVtPkRlc2NyaXB0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVTQ1JJUFRJT05fRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVzY3JpcHRpb24oKSA8ZW0+RGVzY3JpcHRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGRlc2NyaXB0aW9uID0gREVTQ1JJUFRJT05fRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U2VjdGlvbk5hbWUoKSA8ZW0+U2VjdGlvbiBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTZWN0aW9uTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VDVElPTl9OQU1FX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNlY3Rpb25OYW1lKCkgPGVtPlNlY3Rpb24gTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U2VjdGlvbk5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgc2VjdGlvbk5hbWUgPSBTRUNUSU9OX05BTUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpIDxlbT5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBWQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSA8ZW0+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyB2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50ID0gVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWYXJpYWJpbGl0eVR5cGUoKSA8ZW0+VmFyaWFiaWxpdHkgVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VmFyaWFiaWxpdHlUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFZhcmlhYmlsaXR5VHlwZSBWQVJJQUJJTElUWV9UWVBFX0VERUZBVUxUID0gVmFyaWFiaWxpdHlUeXBlLk5BOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmFyaWFiaWxpdHlUeXBlKCkgPGVtPlZhcmlhYmlsaXR5IFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFZhcmlhYmlsaXR5VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFZhcmlhYmlsaXR5VHlwZSB2YXJpYWJpbGl0eVR5cGUgPSBWQVJJQUJJTElUWV9UWVBFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBWYXJpYWJpbGl0eSBUeXBlIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiB2YXJpYWJpbGl0eVR5cGVFU2V0OwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFNlY3Rpb25JbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5TRUNUSU9OOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTZWN0aW9uIGdldFN1YlNlY3Rpb24oKSB7Ci0JCXJldHVybiBzdWJTZWN0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldFN1YlNlY3Rpb24oU2VjdGlvbiBuZXdTdWJTZWN0aW9uLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCVNlY3Rpb24gb2xkU3ViU2VjdGlvbiA9IHN1YlNlY3Rpb247Ci0JCXN1YlNlY3Rpb24gPSBuZXdTdWJTZWN0aW9uOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLlNFQ1RJT05fX1NVQl9TRUNUSU9OLCBvbGRTdWJTZWN0aW9uLCBuZXdTdWJTZWN0aW9uKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTdWJTZWN0aW9uKFNlY3Rpb24gbmV3U3ViU2VjdGlvbikgewotCQlpZiAobmV3U3ViU2VjdGlvbiAhPSBzdWJTZWN0aW9uKSB7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChzdWJTZWN0aW9uICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KXN1YlNlY3Rpb24pLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBVbWFQYWNrYWdlLlNFQ1RJT05fX1NVQl9TRUNUSU9OLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdTdWJTZWN0aW9uICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld1N1YlNlY3Rpb24pLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBVbWFQYWNrYWdlLlNFQ1RJT05fX1NVQl9TRUNUSU9OLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldFN1YlNlY3Rpb24obmV3U3ViU2VjdGlvbiwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLlNFQ1RJT05fX1NVQl9TRUNUSU9OLCBuZXdTdWJTZWN0aW9uLCBuZXdTdWJTZWN0aW9uKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQcmVkZWNlc3NvcigpIHsKLQkJcmV0dXJuIHByZWRlY2Vzc29yOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFByZWRlY2Vzc29yKFN0cmluZyBuZXdQcmVkZWNlc3NvcikgewotCQlTdHJpbmcgb2xkUHJlZGVjZXNzb3IgPSBwcmVkZWNlc3NvcjsKLQkJcHJlZGVjZXNzb3IgPSBuZXdQcmVkZWNlc3NvcjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5TRUNUSU9OX19QUkVERUNFU1NPUiwgb2xkUHJlZGVjZXNzb3IsIHByZWRlY2Vzc29yKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIGRlc2NyaXB0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyBuZXdEZXNjcmlwdGlvbikgewotCQlTdHJpbmcgb2xkRGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjsKLQkJZGVzY3JpcHRpb24gPSBuZXdEZXNjcmlwdGlvbjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5TRUNUSU9OX19ERVNDUklQVElPTiwgb2xkRGVzY3JpcHRpb24sIGRlc2NyaXB0aW9uKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTZWN0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIHNlY3Rpb25OYW1lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNlY3Rpb25OYW1lKFN0cmluZyBuZXdTZWN0aW9uTmFtZSkgewotCQlTdHJpbmcgb2xkU2VjdGlvbk5hbWUgPSBzZWN0aW9uTmFtZTsKLQkJc2VjdGlvbk5hbWUgPSBuZXdTZWN0aW9uTmFtZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5TRUNUSU9OX19TRUNUSU9OX05BTUUsIG9sZFNlY3Rpb25OYW1lLCBzZWN0aW9uTmFtZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpIHsKLQkJcmV0dXJuIHZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudChTdHJpbmcgbmV3VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCkgewotCQlTdHJpbmcgb2xkVmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCA9IHZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQ7Ci0JCXZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQgPSBuZXdWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLlNFQ1RJT05fX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQsIG9sZFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQsIHZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVmFyaWFiaWxpdHlUeXBlIGdldFZhcmlhYmlsaXR5VHlwZSgpIHsKLQkJcmV0dXJuIHZhcmlhYmlsaXR5VHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWYXJpYWJpbGl0eVR5cGUoVmFyaWFiaWxpdHlUeXBlIG5ld1ZhcmlhYmlsaXR5VHlwZSkgewotCQlWYXJpYWJpbGl0eVR5cGUgb2xkVmFyaWFiaWxpdHlUeXBlID0gdmFyaWFiaWxpdHlUeXBlOwotCQl2YXJpYWJpbGl0eVR5cGUgPSBuZXdWYXJpYWJpbGl0eVR5cGUgPT0gbnVsbCA/IFZBUklBQklMSVRZX1RZUEVfRURFRkFVTFQgOiBuZXdWYXJpYWJpbGl0eVR5cGU7Ci0JCWJvb2xlYW4gb2xkVmFyaWFiaWxpdHlUeXBlRVNldCA9IHZhcmlhYmlsaXR5VHlwZUVTZXQ7Ci0JCXZhcmlhYmlsaXR5VHlwZUVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLlNFQ1RJT05fX1ZBUklBQklMSVRZX1RZUEUsIG9sZFZhcmlhYmlsaXR5VHlwZSwgdmFyaWFiaWxpdHlUeXBlLCAhb2xkVmFyaWFiaWxpdHlUeXBlRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0VmFyaWFiaWxpdHlUeXBlKCkgewotCQlWYXJpYWJpbGl0eVR5cGUgb2xkVmFyaWFiaWxpdHlUeXBlID0gdmFyaWFiaWxpdHlUeXBlOwotCQlib29sZWFuIG9sZFZhcmlhYmlsaXR5VHlwZUVTZXQgPSB2YXJpYWJpbGl0eVR5cGVFU2V0OwotCQl2YXJpYWJpbGl0eVR5cGUgPSBWQVJJQUJJTElUWV9UWVBFX0VERUZBVUxUOwotCQl2YXJpYWJpbGl0eVR5cGVFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgVW1hUGFja2FnZS5TRUNUSU9OX19WQVJJQUJJTElUWV9UWVBFLCBvbGRWYXJpYWJpbGl0eVR5cGUsIFZBUklBQklMSVRZX1RZUEVfRURFRkFVTFQsIG9sZFZhcmlhYmlsaXR5VHlwZUVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldFZhcmlhYmlsaXR5VHlwZSgpIHsKLQkJcmV0dXJuIHZhcmlhYmlsaXR5VHlwZUVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlNFQ1RJT05fX1NVQl9TRUNUSU9OOgotCQkJCXJldHVybiBiYXNpY1NldFN1YlNlY3Rpb24obnVsbCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5TRUNUSU9OX19TVUJfU0VDVElPTjoKLQkJCQlyZXR1cm4gZ2V0U3ViU2VjdGlvbigpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlNFQ1RJT05fX1BSRURFQ0VTU09SOgotCQkJCXJldHVybiBnZXRQcmVkZWNlc3NvcigpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlNFQ1RJT05fX0RFU0NSSVBUSU9OOgotCQkJCXJldHVybiBnZXREZXNjcmlwdGlvbigpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlNFQ1RJT05fX1NFQ1RJT05fTkFNRToKLQkJCQlyZXR1cm4gZ2V0U2VjdGlvbk5hbWUoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5TRUNUSU9OX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UOgotCQkJCXJldHVybiBnZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuU0VDVElPTl9fVkFSSUFCSUxJVFlfVFlQRToKLQkJCQlyZXR1cm4gZ2V0VmFyaWFiaWxpdHlUeXBlKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5TRUNUSU9OX19TVUJfU0VDVElPTjoKLQkJCQlzZXRTdWJTZWN0aW9uKChTZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuU0VDVElPTl9fUFJFREVDRVNTT1I6Ci0JCQkJc2V0UHJlZGVjZXNzb3IoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlNFQ1RJT05fX0RFU0NSSVBUSU9OOgotCQkJCXNldERlc2NyaXB0aW9uKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5TRUNUSU9OX19TRUNUSU9OX05BTUU6Ci0JCQkJc2V0U2VjdGlvbk5hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlNFQ1RJT05fX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQ6Ci0JCQkJc2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuU0VDVElPTl9fVkFSSUFCSUxJVFlfVFlQRToKLQkJCQlzZXRWYXJpYWJpbGl0eVR5cGUoKFZhcmlhYmlsaXR5VHlwZSluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5TRUNUSU9OX19TVUJfU0VDVElPTjoKLQkJCQlzZXRTdWJTZWN0aW9uKChTZWN0aW9uKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5TRUNUSU9OX19QUkVERUNFU1NPUjoKLQkJCQlzZXRQcmVkZWNlc3NvcihQUkVERUNFU1NPUl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlNFQ1RJT05fX0RFU0NSSVBUSU9OOgotCQkJCXNldERlc2NyaXB0aW9uKERFU0NSSVBUSU9OX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuU0VDVElPTl9fU0VDVElPTl9OQU1FOgotCQkJCXNldFNlY3Rpb25OYW1lKFNFQ1RJT05fTkFNRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlNFQ1RJT05fX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQ6Ci0JCQkJc2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudChWQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuU0VDVElPTl9fVkFSSUFCSUxJVFlfVFlQRToKLQkJCQl1bnNldFZhcmlhYmlsaXR5VHlwZSgpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlNFQ1RJT05fX1NVQl9TRUNUSU9OOgotCQkJCXJldHVybiBzdWJTZWN0aW9uICE9IG51bGw7Ci0JCQljYXNlIFVtYVBhY2thZ2UuU0VDVElPTl9fUFJFREVDRVNTT1I6Ci0JCQkJcmV0dXJuIFBSRURFQ0VTU09SX0VERUZBVUxUID09IG51bGwgPyBwcmVkZWNlc3NvciAhPSBudWxsIDogIVBSRURFQ0VTU09SX0VERUZBVUxULmVxdWFscyhwcmVkZWNlc3Nvcik7Ci0JCQljYXNlIFVtYVBhY2thZ2UuU0VDVElPTl9fREVTQ1JJUFRJT046Ci0JCQkJcmV0dXJuIERFU0NSSVBUSU9OX0VERUZBVUxUID09IG51bGwgPyBkZXNjcmlwdGlvbiAhPSBudWxsIDogIURFU0NSSVBUSU9OX0VERUZBVUxULmVxdWFscyhkZXNjcmlwdGlvbik7Ci0JCQljYXNlIFVtYVBhY2thZ2UuU0VDVElPTl9fU0VDVElPTl9OQU1FOgotCQkJCXJldHVybiBTRUNUSU9OX05BTUVfRURFRkFVTFQgPT0gbnVsbCA/IHNlY3Rpb25OYW1lICE9IG51bGwgOiAhU0VDVElPTl9OQU1FX0VERUZBVUxULmVxdWFscyhzZWN0aW9uTmFtZSk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuU0VDVElPTl9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVDoKLQkJCQlyZXR1cm4gVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVF9FREVGQVVMVCA9PSBudWxsID8gdmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCAhPSBudWxsIDogIVZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlRfRURFRkFVTFQuZXF1YWxzKHZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlNFQ1RJT05fX1ZBUklBQklMSVRZX1RZUEU6Ci0JCQkJcmV0dXJuIGlzU2V0VmFyaWFiaWxpdHlUeXBlKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChwcmVkZWNlc3NvcjogIik7Ci0JCXJlc3VsdC5hcHBlbmQocHJlZGVjZXNzb3IpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGRlc2NyaXB0aW9uOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChkZXNjcmlwdGlvbik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgc2VjdGlvbk5hbWU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHNlY3Rpb25OYW1lKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCB2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50OiAiKTsKLQkJcmVzdWx0LmFwcGVuZCh2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KTsKLQkJcmVzdWx0LmFwcGVuZCgiLCB2YXJpYWJpbGl0eVR5cGU6ICIpOwotCQlpZiAodmFyaWFiaWxpdHlUeXBlRVNldCkgcmVzdWx0LmFwcGVuZCh2YXJpYWJpbGl0eVR5cGUpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vU2VjdGlvbkltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9TdXBwb3J0aW5nTWF0ZXJpYWxJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9TdXBwb3J0aW5nTWF0ZXJpYWxJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwYTQyZmIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvU3VwcG9ydGluZ01hdGVyaWFsSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBTdXBwb3J0aW5nTWF0ZXJpYWxJbXBsLmphdmEsdiAxLjIgMjAwOC8wMS8zMCAwMDo0MTo0NyBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuU3VwcG9ydGluZ01hdGVyaWFsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5TdXBwb3J0aW5nIE1hdGVyaWFsPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgU3VwcG9ydGluZ01hdGVyaWFsSW1wbCBleHRlbmRzIEd1aWRhbmNlSW1wbCBpbXBsZW1lbnRzIFN1cHBvcnRpbmdNYXRlcmlhbCB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFN1cHBvcnRpbmdNYXRlcmlhbEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLlNVUFBPUlRJTkdfTUFURVJJQUw7Ci0JfQotCi19IC8vU3VwcG9ydGluZ01hdGVyaWFsSW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1Rhc2tEZXNjcmlwdGlvbkltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1Rhc2tEZXNjcmlwdGlvbkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODY3NzJjZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9UYXNrRGVzY3JpcHRpb25JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTcgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBUYXNrRGVzY3JpcHRpb25JbXBsLmphdmEsdiAxLjIgMjAwOC8wMS8zMCAwMDo0MTo0NyBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRhc2tEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+VGFzayBEZXNjcmlwdGlvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5UYXNrRGVzY3JpcHRpb25JbXBsI2dldEFsdGVybmF0aXZlcyA8ZW0+QWx0ZXJuYXRpdmVzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlRhc2tEZXNjcmlwdGlvbkltcGwjZ2V0UHVycG9zZSA8ZW0+UHVycG9zZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFRhc2tEZXNjcmlwdGlvbkltcGwgZXh0ZW5kcyBDb250ZW50RGVzY3JpcHRpb25JbXBsIGltcGxlbWVudHMgVGFza0Rlc2NyaXB0aW9uIHsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QWx0ZXJuYXRpdmVzKCkgPGVtPkFsdGVybmF0aXZlczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QWx0ZXJuYXRpdmVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBBTFRFUk5BVElWRVNfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QWx0ZXJuYXRpdmVzKCkgPGVtPkFsdGVybmF0aXZlczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QWx0ZXJuYXRpdmVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGFsdGVybmF0aXZlcyA9IEFMVEVSTkFUSVZFU19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQdXJwb3NlKCkgPGVtPlB1cnBvc2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFB1cnBvc2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBVUlBPU0VfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHVycG9zZSgpIDxlbT5QdXJwb3NlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQdXJwb3NlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHB1cnBvc2UgPSBQVVJQT1NFX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFRhc2tEZXNjcmlwdGlvbkltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLlRBU0tfREVTQ1JJUFRJT047Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRBbHRlcm5hdGl2ZXMoKSB7Ci0JCXJldHVybiBhbHRlcm5hdGl2ZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QWx0ZXJuYXRpdmVzKFN0cmluZyBuZXdBbHRlcm5hdGl2ZXMpIHsKLQkJU3RyaW5nIG9sZEFsdGVybmF0aXZlcyA9IGFsdGVybmF0aXZlczsKLQkJYWx0ZXJuYXRpdmVzID0gbmV3QWx0ZXJuYXRpdmVzOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRJT05fX0FMVEVSTkFUSVZFUywgb2xkQWx0ZXJuYXRpdmVzLCBhbHRlcm5hdGl2ZXMpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFB1cnBvc2UoKSB7Ci0JCXJldHVybiBwdXJwb3NlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFB1cnBvc2UoU3RyaW5nIG5ld1B1cnBvc2UpIHsKLQkJU3RyaW5nIG9sZFB1cnBvc2UgPSBwdXJwb3NlOwotCQlwdXJwb3NlID0gbmV3UHVycG9zZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUSU9OX19QVVJQT1NFLCBvbGRQdXJwb3NlLCBwdXJwb3NlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRJT05fX0FMVEVSTkFUSVZFUzoKLQkJCQlyZXR1cm4gZ2V0QWx0ZXJuYXRpdmVzKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVElPTl9fUFVSUE9TRToKLQkJCQlyZXR1cm4gZ2V0UHVycG9zZSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVElPTl9fQUxURVJOQVRJVkVTOgotCQkJCXNldEFsdGVybmF0aXZlcygoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVElPTl9fUFVSUE9TRToKLQkJCQlzZXRQdXJwb3NlKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVElPTl9fQUxURVJOQVRJVkVTOgotCQkJCXNldEFsdGVybmF0aXZlcyhBTFRFUk5BVElWRVNfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUSU9OX19QVVJQT1NFOgotCQkJCXNldFB1cnBvc2UoUFVSUE9TRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVElPTl9fQUxURVJOQVRJVkVTOgotCQkJCXJldHVybiBBTFRFUk5BVElWRVNfRURFRkFVTFQgPT0gbnVsbCA/IGFsdGVybmF0aXZlcyAhPSBudWxsIDogIUFMVEVSTkFUSVZFU19FREVGQVVMVC5lcXVhbHMoYWx0ZXJuYXRpdmVzKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUSU9OX19QVVJQT1NFOgotCQkJCXJldHVybiBQVVJQT1NFX0VERUZBVUxUID09IG51bGwgPyBwdXJwb3NlICE9IG51bGwgOiAhUFVSUE9TRV9FREVGQVVMVC5lcXVhbHMocHVycG9zZSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChhbHRlcm5hdGl2ZXM6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGFsdGVybmF0aXZlcyk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcHVycG9zZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQocHVycG9zZSk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL1Rhc2tEZXNjcmlwdGlvbkltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9UYXNrRGVzY3JpcHRvckltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1Rhc2tEZXNjcmlwdG9ySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MGYwMmQ0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1Rhc2tEZXNjcmlwdG9ySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTI4ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogVGFza0Rlc2NyaXB0b3JJbXBsLmphdmEsdiAxLjIgMjAwOC8wMS8zMCAwMDo0MTo0NyBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuQmFzaWNGZWF0dXJlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5TZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRhc2tEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5UYXNrIERlc2NyaXB0b3I8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVGFza0Rlc2NyaXB0b3JJbXBsI2dldFRhc2sgPGVtPlRhc2s8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVGFza0Rlc2NyaXB0b3JJbXBsI2dldFBlcmZvcm1lZFByaW1hcmlseUJ5IDxlbT5QZXJmb3JtZWQgUHJpbWFyaWx5IEJ5PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlRhc2tEZXNjcmlwdG9ySW1wbCNnZXRHcm91cDMgPGVtPkdyb3VwMzwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5UYXNrRGVzY3JpcHRvckltcGwjZ2V0QWRkaXRpb25hbGx5UGVyZm9ybWVkQnkgPGVtPkFkZGl0aW9uYWxseSBQZXJmb3JtZWQgQnk8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVGFza0Rlc2NyaXB0b3JJbXBsI2dldEFzc2lzdGVkQnkgPGVtPkFzc2lzdGVkIEJ5PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlRhc2tEZXNjcmlwdG9ySW1wbCNnZXRFeHRlcm5hbElucHV0IDxlbT5FeHRlcm5hbCBJbnB1dDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5UYXNrRGVzY3JpcHRvckltcGwjZ2V0TWFuZGF0b3J5SW5wdXQgPGVtPk1hbmRhdG9yeSBJbnB1dDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5UYXNrRGVzY3JpcHRvckltcGwjZ2V0T3B0aW9uYWxJbnB1dCA8ZW0+T3B0aW9uYWwgSW5wdXQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVGFza0Rlc2NyaXB0b3JJbXBsI2dldE91dHB1dCA8ZW0+T3V0cHV0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlRhc2tEZXNjcmlwdG9ySW1wbCNnZXRTdGVwIDxlbT5TdGVwPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlRhc2tEZXNjcmlwdG9ySW1wbCNpc0lzU3luY2hyb25pemVkV2l0aFNvdXJjZSA8ZW0+SXMgU3luY2hyb25pemVkIFdpdGggU291cmNlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgVGFza0Rlc2NyaXB0b3JJbXBsIGV4dGVuZHMgV29ya0JyZWFrZG93bkVsZW1lbnRJbXBsIGltcGxlbWVudHMgVGFza0Rlc2NyaXB0b3IgewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUYXNrKCkgPGVtPlRhc2s8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFRBU0tfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VGFzaygpIDxlbT5UYXNrPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHRhc2sgPSBUQVNLX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBlcmZvcm1lZFByaW1hcmlseUJ5KCkgPGVtPlBlcmZvcm1lZCBQcmltYXJpbHkgQnk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFBlcmZvcm1lZFByaW1hcmlseUJ5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQRVJGT1JNRURfUFJJTUFSSUxZX0JZX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBlcmZvcm1lZFByaW1hcmlseUJ5KCkgPGVtPlBlcmZvcm1lZCBQcmltYXJpbHkgQnk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFBlcmZvcm1lZFByaW1hcmlseUJ5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHBlcmZvcm1lZFByaW1hcmlseUJ5ID0gUEVSRk9STUVEX1BSSU1BUklMWV9CWV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEdyb3VwMygpIDxlbT5Hcm91cDM8L2VtPn0nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0R3JvdXAzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRmVhdHVyZU1hcCBncm91cDM7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTdGVwKCkgPGVtPlN0ZXA8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U3RlcCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PFNlY3Rpb24+IHN0ZXA7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UoKSA8ZW0+SXMgU3luY2hyb25pemVkIFdpdGggU291cmNlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0lzU3luY2hyb25pemVkV2l0aFNvdXJjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIElTX1NZTkNIUk9OSVpFRF9XSVRIX1NPVVJDRV9FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UoKSA8ZW0+SXMgU3luY2hyb25pemVkIFdpdGggU291cmNlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0lzU3luY2hyb25pemVkV2l0aFNvdXJjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlID0gSVNfU1lOQ0hST05JWkVEX1dJVEhfU09VUkNFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBJcyBTeW5jaHJvbml6ZWQgV2l0aCBTb3VyY2UgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZUVTZXQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgVGFza0Rlc2NyaXB0b3JJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5UQVNLX0RFU0NSSVBUT1I7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUYXNrKCkgewotCQlyZXR1cm4gdGFzazsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUYXNrKFN0cmluZyBuZXdUYXNrKSB7Ci0JCVN0cmluZyBvbGRUYXNrID0gdGFzazsKLQkJdGFzayA9IG5ld1Rhc2s7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19UQVNLLCBvbGRUYXNrLCB0YXNrKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQZXJmb3JtZWRQcmltYXJpbHlCeSgpIHsKLQkJcmV0dXJuIHBlcmZvcm1lZFByaW1hcmlseUJ5OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBlcmZvcm1lZFByaW1hcmlseUJ5KFN0cmluZyBuZXdQZXJmb3JtZWRQcmltYXJpbHlCeSkgewotCQlTdHJpbmcgb2xkUGVyZm9ybWVkUHJpbWFyaWx5QnkgPSBwZXJmb3JtZWRQcmltYXJpbHlCeTsKLQkJcGVyZm9ybWVkUHJpbWFyaWx5QnkgPSBuZXdQZXJmb3JtZWRQcmltYXJpbHlCeTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX1BFUkZPUk1FRF9QUklNQVJJTFlfQlksIG9sZFBlcmZvcm1lZFByaW1hcmlseUJ5LCBwZXJmb3JtZWRQcmltYXJpbHlCeSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBGZWF0dXJlTWFwIGdldEdyb3VwMygpIHsKLQkJaWYgKGdyb3VwMyA9PSBudWxsKSB7Ci0JCQlncm91cDMgPSBuZXcgQmFzaWNGZWF0dXJlTWFwKHRoaXMsIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19HUk9VUDMpOwotCQl9Ci0JCXJldHVybiBncm91cDM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFN0cmluZz4gZ2V0QWRkaXRpb25hbGx5UGVyZm9ybWVkQnkoKSB7Ci0JCXJldHVybiBnZXRHcm91cDMoKS5saXN0KFVtYVBhY2thZ2UuTGl0ZXJhbHMuVEFTS19ERVNDUklQVE9SX19BRERJVElPTkFMTFlfUEVSRk9STUVEX0JZKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8U3RyaW5nPiBnZXRBc3Npc3RlZEJ5KCkgewotCQlyZXR1cm4gZ2V0R3JvdXAzKCkubGlzdChVbWFQYWNrYWdlLkxpdGVyYWxzLlRBU0tfREVTQ1JJUFRPUl9fQVNTSVNURURfQlkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxTdHJpbmc+IGdldEV4dGVybmFsSW5wdXQoKSB7Ci0JCXJldHVybiBnZXRHcm91cDMoKS5saXN0KFVtYVBhY2thZ2UuTGl0ZXJhbHMuVEFTS19ERVNDUklQVE9SX19FWFRFUk5BTF9JTlBVVCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFN0cmluZz4gZ2V0TWFuZGF0b3J5SW5wdXQoKSB7Ci0JCXJldHVybiBnZXRHcm91cDMoKS5saXN0KFVtYVBhY2thZ2UuTGl0ZXJhbHMuVEFTS19ERVNDUklQVE9SX19NQU5EQVRPUllfSU5QVVQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxTdHJpbmc+IGdldE9wdGlvbmFsSW5wdXQoKSB7Ci0JCXJldHVybiBnZXRHcm91cDMoKS5saXN0KFVtYVBhY2thZ2UuTGl0ZXJhbHMuVEFTS19ERVNDUklQVE9SX19PUFRJT05BTF9JTlBVVCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFN0cmluZz4gZ2V0T3V0cHV0KCkgewotCQlyZXR1cm4gZ2V0R3JvdXAzKCkubGlzdChVbWFQYWNrYWdlLkxpdGVyYWxzLlRBU0tfREVTQ1JJUFRPUl9fT1VUUFVUKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8U2VjdGlvbj4gZ2V0U3RlcCgpIHsKLQkJaWYgKHN0ZXAgPT0gbnVsbCkgewotCQkJc3RlcCA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxTZWN0aW9uPihTZWN0aW9uLmNsYXNzLCB0aGlzLCBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fU1RFUCk7Ci0JCX0KLQkJcmV0dXJuIHN0ZXA7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UoKSB7Ci0JCXJldHVybiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKGJvb2xlYW4gbmV3SXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKSB7Ci0JCWJvb2xlYW4gb2xkSXNTeW5jaHJvbml6ZWRXaXRoU291cmNlID0gaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlOwotCQlpc1N5bmNocm9uaXplZFdpdGhTb3VyY2UgPSBuZXdJc1N5bmNocm9uaXplZFdpdGhTb3VyY2U7Ci0JCWJvb2xlYW4gb2xkSXNTeW5jaHJvbml6ZWRXaXRoU291cmNlRVNldCA9IGlzU3luY2hyb25pemVkV2l0aFNvdXJjZUVTZXQ7Ci0JCWlzU3luY2hyb25pemVkV2l0aFNvdXJjZUVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fSVNfU1lOQ0hST05JWkVEX1dJVEhfU09VUkNFLCBvbGRJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UsIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZSwgIW9sZElzU3luY2hyb25pemVkV2l0aFNvdXJjZUVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldElzU3luY2hyb25pemVkV2l0aFNvdXJjZSgpIHsKLQkJYm9vbGVhbiBvbGRJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UgPSBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U7Ci0JCWJvb2xlYW4gb2xkSXNTeW5jaHJvbml6ZWRXaXRoU291cmNlRVNldCA9IGlzU3luY2hyb25pemVkV2l0aFNvdXJjZUVTZXQ7Ci0JCWlzU3luY2hyb25pemVkV2l0aFNvdXJjZSA9IElTX1NZTkNIUk9OSVpFRF9XSVRIX1NPVVJDRV9FREVGQVVMVDsKLQkJaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19JU19TWU5DSFJPTklaRURfV0lUSF9TT1VSQ0UsIG9sZElzU3luY2hyb25pemVkV2l0aFNvdXJjZSwgSVNfU1lOQ0hST05JWkVEX1dJVEhfU09VUkNFX0VERUZBVUxULCBvbGRJc1N5bmNocm9uaXplZFdpdGhTb3VyY2VFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UoKSB7Ci0JCXJldHVybiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2VFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX0dST1VQMzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldEdyb3VwMygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19TVEVQOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0U3RlcCgpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX1RBU0s6Ci0JCQkJcmV0dXJuIGdldFRhc2soKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX1BFUkZPUk1FRF9QUklNQVJJTFlfQlk6Ci0JCQkJcmV0dXJuIGdldFBlcmZvcm1lZFByaW1hcmlseUJ5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19HUk9VUDM6Ci0JCQkJaWYgKGNvcmVUeXBlKSByZXR1cm4gZ2V0R3JvdXAzKCk7Ci0JCQkJcmV0dXJuICgoRmVhdHVyZU1hcC5JbnRlcm5hbClnZXRHcm91cDMoKSkuZ2V0V3JhcHBlcigpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fQURESVRJT05BTExZX1BFUkZPUk1FRF9CWToKLQkJCQlyZXR1cm4gZ2V0QWRkaXRpb25hbGx5UGVyZm9ybWVkQnkoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX0FTU0lTVEVEX0JZOgotCQkJCXJldHVybiBnZXRBc3Npc3RlZEJ5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19FWFRFUk5BTF9JTlBVVDoKLQkJCQlyZXR1cm4gZ2V0RXh0ZXJuYWxJbnB1dCgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fTUFOREFUT1JZX0lOUFVUOgotCQkJCXJldHVybiBnZXRNYW5kYXRvcnlJbnB1dCgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fT1BUSU9OQUxfSU5QVVQ6Ci0JCQkJcmV0dXJuIGdldE9wdGlvbmFsSW5wdXQoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX09VVFBVVDoKLQkJCQlyZXR1cm4gZ2V0T3V0cHV0KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19TVEVQOgotCQkJCXJldHVybiBnZXRTdGVwKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19JU19TWU5DSFJPTklaRURfV0lUSF9TT1VSQ0U6Ci0JCQkJcmV0dXJuIGlzSXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fVEFTSzoKLQkJCQlzZXRUYXNrKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX1BFUkZPUk1FRF9QUklNQVJJTFlfQlk6Ci0JCQkJc2V0UGVyZm9ybWVkUHJpbWFyaWx5QnkoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fR1JPVVAzOgotCQkJCSgoRmVhdHVyZU1hcC5JbnRlcm5hbClnZXRHcm91cDMoKSkuc2V0KG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19BRERJVElPTkFMTFlfUEVSRk9STUVEX0JZOgotCQkJCWdldEFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5KCkuY2xlYXIoKTsKLQkJCQlnZXRBZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSgpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgU3RyaW5nPiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fQVNTSVNURURfQlk6Ci0JCQkJZ2V0QXNzaXN0ZWRCeSgpLmNsZWFyKCk7Ci0JCQkJZ2V0QXNzaXN0ZWRCeSgpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgU3RyaW5nPiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fRVhURVJOQUxfSU5QVVQ6Ci0JCQkJZ2V0RXh0ZXJuYWxJbnB1dCgpLmNsZWFyKCk7Ci0JCQkJZ2V0RXh0ZXJuYWxJbnB1dCgpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgU3RyaW5nPiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fTUFOREFUT1JZX0lOUFVUOgotCQkJCWdldE1hbmRhdG9yeUlucHV0KCkuY2xlYXIoKTsKLQkJCQlnZXRNYW5kYXRvcnlJbnB1dCgpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgU3RyaW5nPiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fT1BUSU9OQUxfSU5QVVQ6Ci0JCQkJZ2V0T3B0aW9uYWxJbnB1dCgpLmNsZWFyKCk7Ci0JCQkJZ2V0T3B0aW9uYWxJbnB1dCgpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgU3RyaW5nPiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fT1VUUFVUOgotCQkJCWdldE91dHB1dCgpLmNsZWFyKCk7Ci0JCQkJZ2V0T3V0cHV0KCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBTdHJpbmc+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19TVEVQOgotCQkJCWdldFN0ZXAoKS5jbGVhcigpOwotCQkJCWdldFN0ZXAoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFNlY3Rpb24+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19JU19TWU5DSFJPTklaRURfV0lUSF9TT1VSQ0U6Ci0JCQkJc2V0SXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19UQVNLOgotCQkJCXNldFRhc2soVEFTS19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fUEVSRk9STUVEX1BSSU1BUklMWV9CWToKLQkJCQlzZXRQZXJmb3JtZWRQcmltYXJpbHlCeShQRVJGT1JNRURfUFJJTUFSSUxZX0JZX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19HUk9VUDM6Ci0JCQkJZ2V0R3JvdXAzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19BRERJVElPTkFMTFlfUEVSRk9STUVEX0JZOgotCQkJCWdldEFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5KCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19BU1NJU1RFRF9CWToKLQkJCQlnZXRBc3Npc3RlZEJ5KCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19FWFRFUk5BTF9JTlBVVDoKLQkJCQlnZXRFeHRlcm5hbElucHV0KCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19NQU5EQVRPUllfSU5QVVQ6Ci0JCQkJZ2V0TWFuZGF0b3J5SW5wdXQoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX09QVElPTkFMX0lOUFVUOgotCQkJCWdldE9wdGlvbmFsSW5wdXQoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX09VVFBVVDoKLQkJCQlnZXRPdXRwdXQoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX1NURVA6Ci0JCQkJZ2V0U3RlcCgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fSVNfU1lOQ0hST05JWkVEX1dJVEhfU09VUkNFOgotCQkJCXVuc2V0SXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19UQVNLOgotCQkJCXJldHVybiBUQVNLX0VERUZBVUxUID09IG51bGwgPyB0YXNrICE9IG51bGwgOiAhVEFTS19FREVGQVVMVC5lcXVhbHModGFzayk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19QRVJGT1JNRURfUFJJTUFSSUxZX0JZOgotCQkJCXJldHVybiBQRVJGT1JNRURfUFJJTUFSSUxZX0JZX0VERUZBVUxUID09IG51bGwgPyBwZXJmb3JtZWRQcmltYXJpbHlCeSAhPSBudWxsIDogIVBFUkZPUk1FRF9QUklNQVJJTFlfQllfRURFRkFVTFQuZXF1YWxzKHBlcmZvcm1lZFByaW1hcmlseUJ5KTsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX0dST1VQMzoKLQkJCQlyZXR1cm4gZ3JvdXAzICE9IG51bGwgJiYgIWdyb3VwMy5pc0VtcHR5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19BRERJVElPTkFMTFlfUEVSRk9STUVEX0JZOgotCQkJCXJldHVybiAhZ2V0QWRkaXRpb25hbGx5UGVyZm9ybWVkQnkoKS5pc0VtcHR5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19BU1NJU1RFRF9CWToKLQkJCQlyZXR1cm4gIWdldEFzc2lzdGVkQnkoKS5pc0VtcHR5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19FWFRFUk5BTF9JTlBVVDoKLQkJCQlyZXR1cm4gIWdldEV4dGVybmFsSW5wdXQoKS5pc0VtcHR5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19NQU5EQVRPUllfSU5QVVQ6Ci0JCQkJcmV0dXJuICFnZXRNYW5kYXRvcnlJbnB1dCgpLmlzRW1wdHkoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX09QVElPTkFMX0lOUFVUOgotCQkJCXJldHVybiAhZ2V0T3B0aW9uYWxJbnB1dCgpLmlzRW1wdHkoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX09VVFBVVDoKLQkJCQlyZXR1cm4gIWdldE91dHB1dCgpLmlzRW1wdHkoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX1NURVA6Ci0JCQkJcmV0dXJuIHN0ZXAgIT0gbnVsbCAmJiAhc3RlcC5pc0VtcHR5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19JU19TWU5DSFJPTklaRURfV0lUSF9TT1VSQ0U6Ci0JCQkJcmV0dXJuIGlzU2V0SXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiICh0YXNrOiAiKTsKLQkJcmVzdWx0LmFwcGVuZCh0YXNrKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBwZXJmb3JtZWRQcmltYXJpbHlCeTogIik7Ci0JCXJlc3VsdC5hcHBlbmQocGVyZm9ybWVkUHJpbWFyaWx5QnkpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGdyb3VwMzogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZ3JvdXAzKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U6ICIpOwotCQlpZiAoaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlRVNldCkgcmVzdWx0LmFwcGVuZChpc1N5bmNocm9uaXplZFdpdGhTb3VyY2UpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vVGFza0Rlc2NyaXB0b3JJbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvVGFza0ltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1Rhc2tJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzYmQxMWIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvVGFza0ltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2MCArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFRhc2tJbXBsLmphdmEsdiAxLjIgMjAwOC8wMS8zMCAwMDo0MTo0NyBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuQmFzaWNGZWF0dXJlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVEYXRhVHlwZUVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UYXNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5UYXNrPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlRhc2tJbXBsI2dldFByZWNvbmRpdGlvbiA8ZW0+UHJlY29uZGl0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlRhc2tJbXBsI2dldFBvc3Rjb25kaXRpb24gPGVtPlBvc3Rjb25kaXRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVGFza0ltcGwjZ2V0UGVyZm9ybWVkQnkgPGVtPlBlcmZvcm1lZCBCeTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5UYXNrSW1wbCNnZXRHcm91cDIgPGVtPkdyb3VwMjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5UYXNrSW1wbCNnZXRNYW5kYXRvcnlJbnB1dCA8ZW0+TWFuZGF0b3J5IElucHV0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlRhc2tJbXBsI2dldE91dHB1dCA8ZW0+T3V0cHV0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlRhc2tJbXBsI2dldEFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5IDxlbT5BZGRpdGlvbmFsbHkgUGVyZm9ybWVkIEJ5PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlRhc2tJbXBsI2dldE9wdGlvbmFsSW5wdXQgPGVtPk9wdGlvbmFsIElucHV0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlRhc2tJbXBsI2dldEVzdGltYXRlIDxlbT5Fc3RpbWF0ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5UYXNrSW1wbCNnZXRFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMgPGVtPkVzdGltYXRpb24gQ29uc2lkZXJhdGlvbnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVGFza0ltcGwjZ2V0VG9vbE1lbnRvciA8ZW0+VG9vbCBNZW50b3I8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBUYXNrSW1wbCBleHRlbmRzIENvbnRlbnRFbGVtZW50SW1wbCBpbXBsZW1lbnRzIFRhc2sgewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQcmVjb25kaXRpb24oKSA8ZW0+UHJlY29uZGl0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQcmVjb25kaXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUNPTkRJVElPTl9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQcmVjb25kaXRpb24oKSA8ZW0+UHJlY29uZGl0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQcmVjb25kaXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgcHJlY29uZGl0aW9uID0gUFJFQ09ORElUSU9OX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBvc3Rjb25kaXRpb24oKSA8ZW0+UG9zdGNvbmRpdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UG9zdGNvbmRpdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUE9TVENPTkRJVElPTl9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQb3N0Y29uZGl0aW9uKCkgPGVtPlBvc3Rjb25kaXRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFBvc3Rjb25kaXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgcG9zdGNvbmRpdGlvbiA9IFBPU1RDT05ESVRJT05fRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQZXJmb3JtZWRCeSgpIDxlbT5QZXJmb3JtZWQgQnk8L2VtPn0nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UGVyZm9ybWVkQnkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxTdHJpbmc+IHBlcmZvcm1lZEJ5OwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0R3JvdXAyKCkgPGVtPkdyb3VwMjwvZW0+fScgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRHcm91cDIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBGZWF0dXJlTWFwIGdyb3VwMjsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBUYXNrSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuVEFTSzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFByZWNvbmRpdGlvbigpIHsKLQkJcmV0dXJuIHByZWNvbmRpdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQcmVjb25kaXRpb24oU3RyaW5nIG5ld1ByZWNvbmRpdGlvbikgewotCQlTdHJpbmcgb2xkUHJlY29uZGl0aW9uID0gcHJlY29uZGl0aW9uOwotCQlwcmVjb25kaXRpb24gPSBuZXdQcmVjb25kaXRpb247Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuVEFTS19fUFJFQ09ORElUSU9OLCBvbGRQcmVjb25kaXRpb24sIHByZWNvbmRpdGlvbikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UG9zdGNvbmRpdGlvbigpIHsKLQkJcmV0dXJuIHBvc3Rjb25kaXRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UG9zdGNvbmRpdGlvbihTdHJpbmcgbmV3UG9zdGNvbmRpdGlvbikgewotCQlTdHJpbmcgb2xkUG9zdGNvbmRpdGlvbiA9IHBvc3Rjb25kaXRpb247Ci0JCXBvc3Rjb25kaXRpb24gPSBuZXdQb3N0Y29uZGl0aW9uOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLlRBU0tfX1BPU1RDT05ESVRJT04sIG9sZFBvc3Rjb25kaXRpb24sIHBvc3Rjb25kaXRpb24pKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8U3RyaW5nPiBnZXRQZXJmb3JtZWRCeSgpIHsKLQkJaWYgKHBlcmZvcm1lZEJ5ID09IG51bGwpIHsKLQkJCXBlcmZvcm1lZEJ5ID0gbmV3IEVEYXRhVHlwZUVMaXN0PFN0cmluZz4oU3RyaW5nLmNsYXNzLCB0aGlzLCBVbWFQYWNrYWdlLlRBU0tfX1BFUkZPUk1FRF9CWSk7Ci0JCX0KLQkJcmV0dXJuIHBlcmZvcm1lZEJ5OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBGZWF0dXJlTWFwIGdldEdyb3VwMigpIHsKLQkJaWYgKGdyb3VwMiA9PSBudWxsKSB7Ci0JCQlncm91cDIgPSBuZXcgQmFzaWNGZWF0dXJlTWFwKHRoaXMsIFVtYVBhY2thZ2UuVEFTS19fR1JPVVAyKTsKLQkJfQotCQlyZXR1cm4gZ3JvdXAyOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxTdHJpbmc+IGdldE1hbmRhdG9yeUlucHV0KCkgewotCQlyZXR1cm4gZ2V0R3JvdXAyKCkubGlzdChVbWFQYWNrYWdlLkxpdGVyYWxzLlRBU0tfX01BTkRBVE9SWV9JTlBVVCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFN0cmluZz4gZ2V0T3V0cHV0KCkgewotCQlyZXR1cm4gZ2V0R3JvdXAyKCkubGlzdChVbWFQYWNrYWdlLkxpdGVyYWxzLlRBU0tfX09VVFBVVCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFN0cmluZz4gZ2V0QWRkaXRpb25hbGx5UGVyZm9ybWVkQnkoKSB7Ci0JCXJldHVybiBnZXRHcm91cDIoKS5saXN0KFVtYVBhY2thZ2UuTGl0ZXJhbHMuVEFTS19fQURESVRJT05BTExZX1BFUkZPUk1FRF9CWSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFN0cmluZz4gZ2V0T3B0aW9uYWxJbnB1dCgpIHsKLQkJcmV0dXJuIGdldEdyb3VwMigpLmxpc3QoVW1hUGFja2FnZS5MaXRlcmFscy5UQVNLX19PUFRJT05BTF9JTlBVVCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFN0cmluZz4gZ2V0RXN0aW1hdGUoKSB7Ci0JCXJldHVybiBnZXRHcm91cDIoKS5saXN0KFVtYVBhY2thZ2UuTGl0ZXJhbHMuVEFTS19fRVNUSU1BVEUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxTdHJpbmc+IGdldEVzdGltYXRpb25Db25zaWRlcmF0aW9ucygpIHsKLQkJcmV0dXJuIGdldEdyb3VwMigpLmxpc3QoVW1hUGFja2FnZS5MaXRlcmFscy5UQVNLX19FU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8U3RyaW5nPiBnZXRUb29sTWVudG9yKCkgewotCQlyZXR1cm4gZ2V0R3JvdXAyKCkubGlzdChVbWFQYWNrYWdlLkxpdGVyYWxzLlRBU0tfX1RPT0xfTUVOVE9SKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19fR1JPVVAyOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0R3JvdXAyKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfX1BSRUNPTkRJVElPTjoKLQkJCQlyZXR1cm4gZ2V0UHJlY29uZGl0aW9uKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19fUE9TVENPTkRJVElPTjoKLQkJCQlyZXR1cm4gZ2V0UG9zdGNvbmRpdGlvbigpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfX1BFUkZPUk1FRF9CWToKLQkJCQlyZXR1cm4gZ2V0UGVyZm9ybWVkQnkoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX19HUk9VUDI6Ci0JCQkJaWYgKGNvcmVUeXBlKSByZXR1cm4gZ2V0R3JvdXAyKCk7Ci0JCQkJcmV0dXJuICgoRmVhdHVyZU1hcC5JbnRlcm5hbClnZXRHcm91cDIoKSkuZ2V0V3JhcHBlcigpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfX01BTkRBVE9SWV9JTlBVVDoKLQkJCQlyZXR1cm4gZ2V0TWFuZGF0b3J5SW5wdXQoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX19PVVRQVVQ6Ci0JCQkJcmV0dXJuIGdldE91dHB1dCgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfX0FERElUSU9OQUxMWV9QRVJGT1JNRURfQlk6Ci0JCQkJcmV0dXJuIGdldEFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19fT1BUSU9OQUxfSU5QVVQ6Ci0JCQkJcmV0dXJuIGdldE9wdGlvbmFsSW5wdXQoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX19FU1RJTUFURToKLQkJCQlyZXR1cm4gZ2V0RXN0aW1hdGUoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX19FU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TOgotCQkJCXJldHVybiBnZXRFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX19UT09MX01FTlRPUjoKLQkJCQlyZXR1cm4gZ2V0VG9vbE1lbnRvcigpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfX1BSRUNPTkRJVElPTjoKLQkJCQlzZXRQcmVjb25kaXRpb24oKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfX1BPU1RDT05ESVRJT046Ci0JCQkJc2V0UG9zdGNvbmRpdGlvbigoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19fUEVSRk9STUVEX0JZOgotCQkJCWdldFBlcmZvcm1lZEJ5KCkuY2xlYXIoKTsKLQkJCQlnZXRQZXJmb3JtZWRCeSgpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgU3RyaW5nPiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfX0dST1VQMjoKLQkJCQkoKEZlYXR1cmVNYXAuSW50ZXJuYWwpZ2V0R3JvdXAyKCkpLnNldChuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfX01BTkRBVE9SWV9JTlBVVDoKLQkJCQlnZXRNYW5kYXRvcnlJbnB1dCgpLmNsZWFyKCk7Ci0JCQkJZ2V0TWFuZGF0b3J5SW5wdXQoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFN0cmluZz4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX19PVVRQVVQ6Ci0JCQkJZ2V0T3V0cHV0KCkuY2xlYXIoKTsKLQkJCQlnZXRPdXRwdXQoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFN0cmluZz4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX19BRERJVElPTkFMTFlfUEVSRk9STUVEX0JZOgotCQkJCWdldEFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5KCkuY2xlYXIoKTsKLQkJCQlnZXRBZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSgpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgU3RyaW5nPiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfX09QVElPTkFMX0lOUFVUOgotCQkJCWdldE9wdGlvbmFsSW5wdXQoKS5jbGVhcigpOwotCQkJCWdldE9wdGlvbmFsSW5wdXQoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFN0cmluZz4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX19FU1RJTUFURToKLQkJCQlnZXRFc3RpbWF0ZSgpLmNsZWFyKCk7Ci0JCQkJZ2V0RXN0aW1hdGUoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFN0cmluZz4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX19FU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TOgotCQkJCWdldEVzdGltYXRpb25Db25zaWRlcmF0aW9ucygpLmNsZWFyKCk7Ci0JCQkJZ2V0RXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBTdHJpbmc+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19fVE9PTF9NRU5UT1I6Ci0JCQkJZ2V0VG9vbE1lbnRvcigpLmNsZWFyKCk7Ci0JCQkJZ2V0VG9vbE1lbnRvcigpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgU3RyaW5nPiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX19QUkVDT05ESVRJT046Ci0JCQkJc2V0UHJlY29uZGl0aW9uKFBSRUNPTkRJVElPTl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfX1BPU1RDT05ESVRJT046Ci0JCQkJc2V0UG9zdGNvbmRpdGlvbihQT1NUQ09ORElUSU9OX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19fUEVSRk9STUVEX0JZOgotCQkJCWdldFBlcmZvcm1lZEJ5KCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19fR1JPVVAyOgotCQkJCWdldEdyb3VwMigpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfX01BTkRBVE9SWV9JTlBVVDoKLQkJCQlnZXRNYW5kYXRvcnlJbnB1dCgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfX09VVFBVVDoKLQkJCQlnZXRPdXRwdXQoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX19BRERJVElPTkFMTFlfUEVSRk9STUVEX0JZOgotCQkJCWdldEFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5KCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19fT1BUSU9OQUxfSU5QVVQ6Ci0JCQkJZ2V0T3B0aW9uYWxJbnB1dCgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfX0VTVElNQVRFOgotCQkJCWdldEVzdGltYXRlKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19fRVNUSU1BVElPTl9DT05TSURFUkFUSU9OUzoKLQkJCQlnZXRFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX19UT09MX01FTlRPUjoKLQkJCQlnZXRUb29sTWVudG9yKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX19QUkVDT05ESVRJT046Ci0JCQkJcmV0dXJuIFBSRUNPTkRJVElPTl9FREVGQVVMVCA9PSBudWxsID8gcHJlY29uZGl0aW9uICE9IG51bGwgOiAhUFJFQ09ORElUSU9OX0VERUZBVUxULmVxdWFscyhwcmVjb25kaXRpb24pOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfX1BPU1RDT05ESVRJT046Ci0JCQkJcmV0dXJuIFBPU1RDT05ESVRJT05fRURFRkFVTFQgPT0gbnVsbCA/IHBvc3Rjb25kaXRpb24gIT0gbnVsbCA6ICFQT1NUQ09ORElUSU9OX0VERUZBVUxULmVxdWFscyhwb3N0Y29uZGl0aW9uKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX19QRVJGT1JNRURfQlk6Ci0JCQkJcmV0dXJuIHBlcmZvcm1lZEJ5ICE9IG51bGwgJiYgIXBlcmZvcm1lZEJ5LmlzRW1wdHkoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX19HUk9VUDI6Ci0JCQkJcmV0dXJuIGdyb3VwMiAhPSBudWxsICYmICFncm91cDIuaXNFbXB0eSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfX01BTkRBVE9SWV9JTlBVVDoKLQkJCQlyZXR1cm4gIWdldE1hbmRhdG9yeUlucHV0KCkuaXNFbXB0eSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfX09VVFBVVDoKLQkJCQlyZXR1cm4gIWdldE91dHB1dCgpLmlzRW1wdHkoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX19BRERJVElPTkFMTFlfUEVSRk9STUVEX0JZOgotCQkJCXJldHVybiAhZ2V0QWRkaXRpb25hbGx5UGVyZm9ybWVkQnkoKS5pc0VtcHR5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19fT1BUSU9OQUxfSU5QVVQ6Ci0JCQkJcmV0dXJuICFnZXRPcHRpb25hbElucHV0KCkuaXNFbXB0eSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfX0VTVElNQVRFOgotCQkJCXJldHVybiAhZ2V0RXN0aW1hdGUoKS5pc0VtcHR5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19fRVNUSU1BVElPTl9DT05TSURFUkFUSU9OUzoKLQkJCQlyZXR1cm4gIWdldEVzdGltYXRpb25Db25zaWRlcmF0aW9ucygpLmlzRW1wdHkoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX19UT09MX01FTlRPUjoKLQkJCQlyZXR1cm4gIWdldFRvb2xNZW50b3IoKS5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChwcmVjb25kaXRpb246ICIpOwotCQlyZXN1bHQuYXBwZW5kKHByZWNvbmRpdGlvbik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcG9zdGNvbmRpdGlvbjogIik7Ci0JCXJlc3VsdC5hcHBlbmQocG9zdGNvbmRpdGlvbik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcGVyZm9ybWVkQnk6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHBlcmZvcm1lZEJ5KTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBncm91cDI6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGdyb3VwMik7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL1Rhc2tJbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvVGVhbVByb2ZpbGVJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9UZWFtUHJvZmlsZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2YyZjJhNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9UZWFtUHJvZmlsZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyOCArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFRlYW1Qcm9maWxlSW1wbC5qYXZhLHYgMS4yIDIwMDgvMDEvMzAgMDA6NDE6NDcga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuQmFzaWNGZWF0dXJlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UZWFtUHJvZmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+VGVhbSBQcm9maWxlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlRlYW1Qcm9maWxlSW1wbCNnZXRHcm91cDIgPGVtPkdyb3VwMjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5UZWFtUHJvZmlsZUltcGwjZ2V0Um9sZSA8ZW0+Um9sZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5UZWFtUHJvZmlsZUltcGwjZ2V0U3VwZXJUZWFtIDxlbT5TdXBlciBUZWFtPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlRlYW1Qcm9maWxlSW1wbCNnZXRTdWJUZWFtIDxlbT5TdWIgVGVhbTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFRlYW1Qcm9maWxlSW1wbCBleHRlbmRzIEJyZWFrZG93bkVsZW1lbnRJbXBsIGltcGxlbWVudHMgVGVhbVByb2ZpbGUgewotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEdyb3VwMigpIDxlbT5Hcm91cDI8L2VtPn0nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0R3JvdXAyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRmVhdHVyZU1hcCBncm91cDI7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFRlYW1Qcm9maWxlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuVEVBTV9QUk9GSUxFOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBGZWF0dXJlTWFwIGdldEdyb3VwMigpIHsKLQkJaWYgKGdyb3VwMiA9PSBudWxsKSB7Ci0JCQlncm91cDIgPSBuZXcgQmFzaWNGZWF0dXJlTWFwKHRoaXMsIFVtYVBhY2thZ2UuVEVBTV9QUk9GSUxFX19HUk9VUDIpOwotCQl9Ci0JCXJldHVybiBncm91cDI7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFN0cmluZz4gZ2V0Um9sZSgpIHsKLQkJcmV0dXJuIGdldEdyb3VwMigpLmxpc3QoVW1hUGFja2FnZS5MaXRlcmFscy5URUFNX1BST0ZJTEVfX1JPTEUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxTdHJpbmc+IGdldFN1cGVyVGVhbSgpIHsKLQkJcmV0dXJuIGdldEdyb3VwMigpLmxpc3QoVW1hUGFja2FnZS5MaXRlcmFscy5URUFNX1BST0ZJTEVfX1NVUEVSX1RFQU0pOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxTdHJpbmc+IGdldFN1YlRlYW0oKSB7Ci0JCXJldHVybiBnZXRHcm91cDIoKS5saXN0KFVtYVBhY2thZ2UuTGl0ZXJhbHMuVEVBTV9QUk9GSUxFX19TVUJfVEVBTSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlRFQU1fUFJPRklMRV9fR1JPVVAyOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0R3JvdXAyKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlRFQU1fUFJPRklMRV9fR1JPVVAyOgotCQkJCWlmIChjb3JlVHlwZSkgcmV0dXJuIGdldEdyb3VwMigpOwotCQkJCXJldHVybiAoKEZlYXR1cmVNYXAuSW50ZXJuYWwpZ2V0R3JvdXAyKCkpLmdldFdyYXBwZXIoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5URUFNX1BST0ZJTEVfX1JPTEU6Ci0JCQkJcmV0dXJuIGdldFJvbGUoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5URUFNX1BST0ZJTEVfX1NVUEVSX1RFQU06Ci0JCQkJcmV0dXJuIGdldFN1cGVyVGVhbSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRFQU1fUFJPRklMRV9fU1VCX1RFQU06Ci0JCQkJcmV0dXJuIGdldFN1YlRlYW0oKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5URUFNX1BST0ZJTEVfX0dST1VQMjoKLQkJCQkoKEZlYXR1cmVNYXAuSW50ZXJuYWwpZ2V0R3JvdXAyKCkpLnNldChuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRFQU1fUFJPRklMRV9fUk9MRToKLQkJCQlnZXRSb2xlKCkuY2xlYXIoKTsKLQkJCQlnZXRSb2xlKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBTdHJpbmc+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEVBTV9QUk9GSUxFX19TVVBFUl9URUFNOgotCQkJCWdldFN1cGVyVGVhbSgpLmNsZWFyKCk7Ci0JCQkJZ2V0U3VwZXJUZWFtKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBTdHJpbmc+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEVBTV9QUk9GSUxFX19TVUJfVEVBTToKLQkJCQlnZXRTdWJUZWFtKCkuY2xlYXIoKTsKLQkJCQlnZXRTdWJUZWFtKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBTdHJpbmc+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlRFQU1fUFJPRklMRV9fR1JPVVAyOgotCQkJCWdldEdyb3VwMigpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRFQU1fUFJPRklMRV9fUk9MRToKLQkJCQlnZXRSb2xlKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEVBTV9QUk9GSUxFX19TVVBFUl9URUFNOgotCQkJCWdldFN1cGVyVGVhbSgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRFQU1fUFJPRklMRV9fU1VCX1RFQU06Ci0JCQkJZ2V0U3ViVGVhbSgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEVBTV9QUk9GSUxFX19HUk9VUDI6Ci0JCQkJcmV0dXJuIGdyb3VwMiAhPSBudWxsICYmICFncm91cDIuaXNFbXB0eSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRFQU1fUFJPRklMRV9fUk9MRToKLQkJCQlyZXR1cm4gIWdldFJvbGUoKS5pc0VtcHR5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEVBTV9QUk9GSUxFX19TVVBFUl9URUFNOgotCQkJCXJldHVybiAhZ2V0U3VwZXJUZWFtKCkuaXNFbXB0eSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRFQU1fUFJPRklMRV9fU1VCX1RFQU06Ci0JCQkJcmV0dXJuICFnZXRTdWJUZWFtKCkuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoZ3JvdXAyOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChncm91cDIpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9UZWFtUHJvZmlsZUltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9UZW1wbGF0ZUltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1RlbXBsYXRlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNzMxMDZlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1RlbXBsYXRlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBUZW1wbGF0ZUltcGwuamF2YSx2IDEuMiAyMDA4LzAxLzMwIDAwOjQxOjQ3IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UZW1wbGF0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+VGVtcGxhdGU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBUZW1wbGF0ZUltcGwgZXh0ZW5kcyBHdWlkYW5jZUltcGwgaW1wbGVtZW50cyBUZW1wbGF0ZSB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFRlbXBsYXRlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuVEVNUExBVEU7Ci0JfQotCi19IC8vVGVtcGxhdGVJbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvVGVybURlZmluaXRpb25JbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9UZXJtRGVmaW5pdGlvbkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTE1NDdhZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9UZXJtRGVmaW5pdGlvbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogVGVybURlZmluaXRpb25JbXBsLmphdmEsdiAxLjIgMjAwOC8wMS8zMCAwMDo0MTo0NyBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGVybURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlRlcm0gRGVmaW5pdGlvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFRlcm1EZWZpbml0aW9uSW1wbCBleHRlbmRzIEd1aWRhbmNlSW1wbCBpbXBsZW1lbnRzIFRlcm1EZWZpbml0aW9uIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgVGVybURlZmluaXRpb25JbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5URVJNX0RFRklOSVRJT047Ci0JfQotCi19IC8vVGVybURlZmluaXRpb25JbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvVG9vbEltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1Rvb2xJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1NWI1YWQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvVG9vbEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NyArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFRvb2xJbXBsLmphdmEsdiAxLjIgMjAwOC8wMS8zMCAwMDo0MTo0NyBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5CYXNpY0ZlYXR1cmVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRvb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlRvb2w8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVG9vbEltcGwjZ2V0R3JvdXAyIDxlbT5Hcm91cDI8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVG9vbEltcGwjZ2V0VG9vbE1lbnRvciA8ZW0+VG9vbCBNZW50b3I8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBUb29sSW1wbCBleHRlbmRzIENvbnRlbnRDYXRlZ29yeUltcGwgaW1wbGVtZW50cyBUb29sIHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRHcm91cDIoKSA8ZW0+R3JvdXAyPC9lbT59JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEdyb3VwMigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEZlYXR1cmVNYXAgZ3JvdXAyOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFRvb2xJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5UT09MOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBGZWF0dXJlTWFwIGdldEdyb3VwMigpIHsKLQkJaWYgKGdyb3VwMiA9PSBudWxsKSB7Ci0JCQlncm91cDIgPSBuZXcgQmFzaWNGZWF0dXJlTWFwKHRoaXMsIFVtYVBhY2thZ2UuVE9PTF9fR1JPVVAyKTsKLQkJfQotCQlyZXR1cm4gZ3JvdXAyOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxTdHJpbmc+IGdldFRvb2xNZW50b3IoKSB7Ci0JCXJldHVybiBnZXRHcm91cDIoKS5saXN0KFVtYVBhY2thZ2UuTGl0ZXJhbHMuVE9PTF9fVE9PTF9NRU5UT1IpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5UT09MX19HUk9VUDI6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRHcm91cDIoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuVE9PTF9fR1JPVVAyOgotCQkJCWlmIChjb3JlVHlwZSkgcmV0dXJuIGdldEdyb3VwMigpOwotCQkJCXJldHVybiAoKEZlYXR1cmVNYXAuSW50ZXJuYWwpZ2V0R3JvdXAyKCkpLmdldFdyYXBwZXIoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5UT09MX19UT09MX01FTlRPUjoKLQkJCQlyZXR1cm4gZ2V0VG9vbE1lbnRvcigpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlRPT0xfX0dST1VQMjoKLQkJCQkoKEZlYXR1cmVNYXAuSW50ZXJuYWwpZ2V0R3JvdXAyKCkpLnNldChuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRPT0xfX1RPT0xfTUVOVE9SOgotCQkJCWdldFRvb2xNZW50b3IoKS5jbGVhcigpOwotCQkJCWdldFRvb2xNZW50b3IoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFN0cmluZz4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuVE9PTF9fR1JPVVAyOgotCQkJCWdldEdyb3VwMigpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRPT0xfX1RPT0xfTUVOVE9SOgotCQkJCWdldFRvb2xNZW50b3IoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlRPT0xfX0dST1VQMjoKLQkJCQlyZXR1cm4gZ3JvdXAyICE9IG51bGwgJiYgIWdyb3VwMi5pc0VtcHR5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuVE9PTF9fVE9PTF9NRU5UT1I6Ci0JCQkJcmV0dXJuICFnZXRUb29sTWVudG9yKCkuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoZ3JvdXAyOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChncm91cDIpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9Ub29sSW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1Rvb2xNZW50b3JJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9Ub29sTWVudG9ySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MGZjM2YyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1Rvb2xNZW50b3JJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFRvb2xNZW50b3JJbXBsLmphdmEsdiAxLjIgMjAwOC8wMS8zMCAwMDo0MTo0NyBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVG9vbE1lbnRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+VG9vbCBNZW50b3I8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBUb29sTWVudG9ySW1wbCBleHRlbmRzIEd1aWRhbmNlSW1wbCBpbXBsZW1lbnRzIFRvb2xNZW50b3IgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBUb29sTWVudG9ySW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuVE9PTF9NRU5UT1I7Ci0JfQotCi19IC8vVG9vbE1lbnRvckltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9VbWFGYWN0b3J5SW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvVW1hRmFjdG9yeUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTM3MjFlZi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9VbWFGYWN0b3J5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI1MCArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFVtYUZhY3RvcnlJbXBsLmphdmEsdiAxLjIgMjAwOC8wMS8zMCAwMDo0MTo0NyBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVEYXRhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRUZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5wbHVnaW4uRWNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQWN0aXZpdHlEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5BcHBsaWNhYmxlTWV0YUNsYXNzSW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5BcnRpZmFjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5BcnRpZmFjdERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkJyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNhcGFiaWxpdHlQYXR0ZXJuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNoZWNrbGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db21wb3NpdGVSb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbmNlcHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29uc3RyYWludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db250ZW50Q2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudENhdGVnb3J5UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db250ZW50RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ3VzdG9tQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVsaXZlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVsaXZlcmFibGVEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZWxpdmVyeVByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVzY3JpYmFibGVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVzY3JpcHRvckRlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRpc2NpcGxpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGlzY2lwbGluZUdyb3VwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRvY3VtZW50Um9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Eb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Fc3RpbWF0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Fc3RpbWF0aW5nTWV0cmljOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkVzdGltYXRpb25Db25zaWRlcmF0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5FeGFtcGxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkd1aWRhbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkd1aWRhbmNlRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuR3VpZGVsaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkl0ZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5LaW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RFbGVtZW50UHJvcGVydHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1pbGVzdG9uZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5OYW1lZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuT3V0Y29tZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5QYWNrYWdlYWJsZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUGhhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUGxhbm5pbmdEYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByYWN0aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByYWN0aWNlRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc0NvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5SZXBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUmV1c2FibGVBc3NldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Sb2FkbWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUm9sZURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJvbGVEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJvbGVTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUm9sZVNldEdyb3VwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlNlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuU3VwcG9ydGluZ01hdGVyaWFsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRhc2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFza0Rlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRhc2tEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRlYW1Qcm9maWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRlbXBsYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRlcm1EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRvb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVG9vbE1lbnRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVmFyaWFiaWxpdHlUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldoaXRlcGFwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya0JyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya09yZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtPcmRlclR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya1Byb2R1Y3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya1Byb2R1Y3REZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya1Byb2R1Y3RUeXBlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgPGI+RmFjdG9yeTwvYj4uCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFVtYUZhY3RvcnlJbXBsIGV4dGVuZHMgRUZhY3RvcnlJbXBsIGltcGxlbWVudHMgVW1hRmFjdG9yeSB7Ci0JLyoqCi0JICogQ3JlYXRlcyB0aGUgZGVmYXVsdCBmYWN0b3J5IGltcGxlbWVudGF0aW9uLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgVW1hRmFjdG9yeSBpbml0KCkgewotCQl0cnkgewotCQkJVW1hRmFjdG9yeSB0aGVVbWFGYWN0b3J5ID0gKFVtYUZhY3RvcnkpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RUZhY3RvcnkoImh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNSIpOyAKLQkJCWlmICh0aGVVbWFGYWN0b3J5ICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gdGhlVW1hRmFjdG9yeTsKLQkJCX0KLQkJfQotCQljYXRjaCAoRXhjZXB0aW9uIGV4Y2VwdGlvbikgewotCQkJRWNvcmVQbHVnaW4uSU5TVEFOQ0UubG9nKGV4Y2VwdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG5ldyBVbWFGYWN0b3J5SW1wbCgpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGZhY3RvcnkuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFVtYUZhY3RvcnlJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBFT2JqZWN0IGNyZWF0ZShFQ2xhc3MgZUNsYXNzKSB7Ci0JCXN3aXRjaCAoZUNsYXNzLmdldENsYXNzaWZpZXJJRCgpKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFk6IHJldHVybiAoRU9iamVjdCljcmVhdGVBY3Rpdml0eSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX0RFU0NSSVBUSU9OOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlQWN0aXZpdHlEZXNjcmlwdGlvbigpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkFQUExJQ0FCTEVfTUVUQV9DTEFTU19JTkZPOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlQXBwbGljYWJsZU1ldGFDbGFzc0luZm8oKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5BUlRJRkFDVDogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZUFydGlmYWN0KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQVJUSUZBQ1RfREVTQ1JJUFRJT046IHJldHVybiAoRU9iamVjdCljcmVhdGVBcnRpZmFjdERlc2NyaXB0aW9uKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlQ6IHJldHVybiAoRU9iamVjdCljcmVhdGVCcmVha2Rvd25FbGVtZW50KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT046IHJldHVybiAoRU9iamVjdCljcmVhdGVCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24oKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5DQVBBQklMSVRZX1BBVFRFUk46IHJldHVybiAoRU9iamVjdCljcmVhdGVDYXBhYmlsaXR5UGF0dGVybigpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkNIRUNLTElTVDogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZUNoZWNrbGlzdCgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkNPTVBPU0lURV9ST0xFOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlQ29tcG9zaXRlUm9sZSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkNPTkNFUFQ6IHJldHVybiAoRU9iamVjdCljcmVhdGVDb25jZXB0KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ09OU1RSQUlOVDogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZUNvbnN0cmFpbnQoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0NBVEVHT1JZOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlQ29udGVudENhdGVnb3J5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9DQVRFR09SWV9QQUNLQUdFOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlQ29udGVudENhdGVnb3J5UGFja2FnZSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfREVTQ1JJUFRJT046IHJldHVybiAoRU9iamVjdCljcmVhdGVDb250ZW50RGVzY3JpcHRpb24oKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0VMRU1FTlQ6IHJldHVybiAoRU9iamVjdCljcmVhdGVDb250ZW50RWxlbWVudCgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfUEFDS0FHRTogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZUNvbnRlbnRQYWNrYWdlKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ1VTVE9NX0NBVEVHT1JZOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlQ3VzdG9tQ2F0ZWdvcnkoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSQUJMRTogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZURlbGl2ZXJhYmxlKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUkFCTEVfREVTQ1JJUFRJT046IHJldHVybiAoRU9iamVjdCljcmVhdGVEZWxpdmVyYWJsZURlc2NyaXB0aW9uKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUllfUFJPQ0VTUzogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZURlbGl2ZXJ5UHJvY2VzcygpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT046IHJldHVybiAoRU9iamVjdCljcmVhdGVEZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbigpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRFU0NSSUJBQkxFX0VMRU1FTlQ6IHJldHVybiAoRU9iamVjdCljcmVhdGVEZXNjcmliYWJsZUVsZW1lbnQoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5ERVNDUklQVE9SOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlRGVzY3JpcHRvcigpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRFU0NSSVBUT1JfREVTQ1JJUFRJT046IHJldHVybiAoRU9iamVjdCljcmVhdGVEZXNjcmlwdG9yRGVzY3JpcHRpb24oKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5ESVNDSVBMSU5FOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlRGlzY2lwbGluZSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRJU0NJUExJTkVfR1JPVVBJTkc6IHJldHVybiAoRU9iamVjdCljcmVhdGVEaXNjaXBsaW5lR3JvdXBpbmcoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5ET0NVTUVOVF9ST09UOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlRG9jdW1lbnRSb290KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuRE9NQUlOOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlRG9tYWluKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuRUxFTUVOVDogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZUVsZW1lbnQoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5FU1RJTUFURTogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZUVzdGltYXRlKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuRVNUSU1BVElOR19NRVRSSUM6IHJldHVybiAoRU9iamVjdCljcmVhdGVFc3RpbWF0aW5nTWV0cmljKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuRVNUSU1BVElPTl9DT05TSURFUkFUSU9OUzogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZUVzdGltYXRpb25Db25zaWRlcmF0aW9ucygpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkVYQU1QTEU6IHJldHVybiAoRU9iamVjdCljcmVhdGVFeGFtcGxlKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuR1VJREFOQ0U6IHJldHVybiAoRU9iamVjdCljcmVhdGVHdWlkYW5jZSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkdVSURBTkNFX0RFU0NSSVBUSU9OOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlR3VpZGFuY2VEZXNjcmlwdGlvbigpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkdVSURFTElORTogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZUd1aWRlbGluZSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLklURVJBVElPTjogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZUl0ZXJhdGlvbigpOwotCQkJY2FzZSBVbWFQYWNrYWdlLktJTkQ6IHJldHVybiAoRU9iamVjdCljcmVhdGVLaW5kKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0NPTkZJR1VSQVRJT046IHJldHVybiAoRU9iamVjdCljcmVhdGVNZXRob2RDb25maWd1cmF0aW9uKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0VMRU1FTlQ6IHJldHVybiAoRU9iamVjdCljcmVhdGVNZXRob2RFbGVtZW50KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk6IHJldHVybiAoRU9iamVjdCljcmVhdGVNZXRob2RFbGVtZW50UHJvcGVydHkoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfTElCUkFSWTogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZU1ldGhvZExpYnJhcnkoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfUEFDS0FHRTogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZU1ldGhvZFBhY2thZ2UoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfUExVR0lOOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlTWV0aG9kUGx1Z2luKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1VOSVQ6IHJldHVybiAoRU9iamVjdCljcmVhdGVNZXRob2RVbml0KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUlMRVNUT05FOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlTWlsZXN0b25lKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuTkFNRURfRUxFTUVOVDogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZU5hbWVkRWxlbWVudCgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLk9VVENPTUU6IHJldHVybiAoRU9iamVjdCljcmVhdGVPdXRjb21lKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUEFDS0FHRUFCTEVfRUxFTUVOVDogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVBhY2thZ2VhYmxlRWxlbWVudCgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBIQVNFOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlUGhhc2UoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5QTEFOTklOR19EQVRBOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlUGxhbm5pbmdEYXRhKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJBQ1RJQ0U6IHJldHVybiAoRU9iamVjdCljcmVhdGVQcmFjdGljZSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBSQUNUSUNFX0RFU0NSSVBUSU9OOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlUHJhY3RpY2VEZXNjcmlwdGlvbigpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1M6IHJldHVybiAoRU9iamVjdCljcmVhdGVQcm9jZXNzKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlQ6IHJldHVybiAoRU9iamVjdCljcmVhdGVQcm9jZXNzQ29tcG9uZW50KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfSU5URVJGQUNFOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfREVTQ1JJUFRJT046IHJldHVybiAoRU9iamVjdCljcmVhdGVQcm9jZXNzRGVzY3JpcHRpb24oKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0VMRU1FTlQ6IHJldHVybiAoRU9iamVjdCljcmVhdGVQcm9jZXNzRWxlbWVudCgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfUEFDS0FHRTogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVByb2Nlc3NQYWNrYWdlKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19QTEFOTklOR19URU1QTEFURTogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVByb2Nlc3NQbGFubmluZ1RlbXBsYXRlKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUkVQT1JUOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlUmVwb3J0KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUkVVU0FCTEVfQVNTRVQ6IHJldHVybiAoRU9iamVjdCljcmVhdGVSZXVzYWJsZUFzc2V0KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUk9BRE1BUDogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVJvYWRtYXAoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5ST0xFOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlUm9sZSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfREVTQ1JJUFRJT046IHJldHVybiAoRU9iamVjdCljcmVhdGVSb2xlRGVzY3JpcHRpb24oKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5ST0xFX0RFU0NSSVBUT1I6IHJldHVybiAoRU9iamVjdCljcmVhdGVSb2xlRGVzY3JpcHRvcigpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfU0VUOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlUm9sZVNldCgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfU0VUX0dST1VQSU5HOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlUm9sZVNldEdyb3VwaW5nKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuU0VDVElPTjogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVNlY3Rpb24oKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5TVVBQT1JUSU5HX01BVEVSSUFMOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlU3VwcG9ydGluZ01hdGVyaWFsKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTSzogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVRhc2soKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUSU9OOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlVGFza0Rlc2NyaXB0aW9uKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlVGFza0Rlc2NyaXB0b3IoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5URUFNX1BST0ZJTEU6IHJldHVybiAoRU9iamVjdCljcmVhdGVUZWFtUHJvZmlsZSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRFTVBMQVRFOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlVGVtcGxhdGUoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5URVJNX0RFRklOSVRJT046IHJldHVybiAoRU9iamVjdCljcmVhdGVUZXJtRGVmaW5pdGlvbigpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRPT0w6IHJldHVybiAoRU9iamVjdCljcmVhdGVUb29sKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuVE9PTF9NRU5UT1I6IHJldHVybiAoRU9iamVjdCljcmVhdGVUb29sTWVudG9yKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuV0hJVEVQQVBFUjogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVdoaXRlcGFwZXIoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX0JSRUFLRE9XTl9FTEVNRU5UOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlV29ya0JyZWFrZG93bkVsZW1lbnQoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX0RFRklOSVRJT046IHJldHVybiAoRU9iamVjdCljcmVhdGVXb3JrRGVmaW5pdGlvbigpOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfT1JERVI6IHJldHVybiAoRU9iamVjdCljcmVhdGVXb3JrT3JkZXIoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1Q6IHJldHVybiAoRU9iamVjdCljcmVhdGVXb3JrUHJvZHVjdCgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVElPTjogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVdvcmtQcm9kdWN0RGVzY3JpcHRpb24oKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUjogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVdvcmtQcm9kdWN0RGVzY3JpcHRvcigpOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9UWVBFOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlV29ya1Byb2R1Y3RUeXBlKCk7Ci0JCQlkZWZhdWx0OgotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBjbGFzcyAnIiArIGVDbGFzcy5nZXROYW1lKCkgKyAiJyBpcyBub3QgYSB2YWxpZCBjbGFzc2lmaWVyIik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGNyZWF0ZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlzd2l0Y2ggKGVEYXRhVHlwZS5nZXRDbGFzc2lmaWVySUQoKSkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlZBUklBQklMSVRZX1RZUEU6Ci0JCQkJcmV0dXJuIGNyZWF0ZVZhcmlhYmlsaXR5VHlwZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfT1JERVJfVFlQRToKLQkJCQlyZXR1cm4gY3JlYXRlV29ya09yZGVyVHlwZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlZBUklBQklMSVRZX1RZUEVfT0JKRUNUOgotCQkJCXJldHVybiBjcmVhdGVWYXJpYWJpbGl0eVR5cGVPYmplY3RGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX09SREVSX1RZUEVfT0JKRUNUOgotCQkJCXJldHVybiBjcmVhdGVXb3JrT3JkZXJUeXBlT2JqZWN0RnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQlkZWZhdWx0OgotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBkYXRhdHlwZSAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyBpcyBub3QgYSB2YWxpZCBjbGFzc2lmaWVyIik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlzd2l0Y2ggKGVEYXRhVHlwZS5nZXRDbGFzc2lmaWVySUQoKSkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlZBUklBQklMSVRZX1RZUEU6Ci0JCQkJcmV0dXJuIGNvbnZlcnRWYXJpYWJpbGl0eVR5cGVUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfT1JERVJfVFlQRToKLQkJCQlyZXR1cm4gY29udmVydFdvcmtPcmRlclR5cGVUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlZBUklBQklMSVRZX1RZUEVfT0JKRUNUOgotCQkJCXJldHVybiBjb252ZXJ0VmFyaWFiaWxpdHlUeXBlT2JqZWN0VG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX09SREVSX1RZUEVfT0JKRUNUOgotCQkJCXJldHVybiBjb252ZXJ0V29ya09yZGVyVHlwZU9iamVjdFRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQlkZWZhdWx0OgotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBkYXRhdHlwZSAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyBpcyBub3QgYSB2YWxpZCBjbGFzc2lmaWVyIik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWN0aXZpdHkgY3JlYXRlQWN0aXZpdHkoKSB7Ci0JCUFjdGl2aXR5SW1wbCBhY3Rpdml0eSA9IG5ldyBBY3Rpdml0eUltcGwoKTsKLQkJcmV0dXJuIGFjdGl2aXR5OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBY3Rpdml0eURlc2NyaXB0aW9uIGNyZWF0ZUFjdGl2aXR5RGVzY3JpcHRpb24oKSB7Ci0JCUFjdGl2aXR5RGVzY3JpcHRpb25JbXBsIGFjdGl2aXR5RGVzY3JpcHRpb24gPSBuZXcgQWN0aXZpdHlEZXNjcmlwdGlvbkltcGwoKTsKLQkJcmV0dXJuIGFjdGl2aXR5RGVzY3JpcHRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvIGNyZWF0ZUFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvKCkgewotCQlBcHBsaWNhYmxlTWV0YUNsYXNzSW5mb0ltcGwgYXBwbGljYWJsZU1ldGFDbGFzc0luZm8gPSBuZXcgQXBwbGljYWJsZU1ldGFDbGFzc0luZm9JbXBsKCk7Ci0JCXJldHVybiBhcHBsaWNhYmxlTWV0YUNsYXNzSW5mbzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQXJ0aWZhY3QgY3JlYXRlQXJ0aWZhY3QoKSB7Ci0JCUFydGlmYWN0SW1wbCBhcnRpZmFjdCA9IG5ldyBBcnRpZmFjdEltcGwoKTsKLQkJcmV0dXJuIGFydGlmYWN0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBcnRpZmFjdERlc2NyaXB0aW9uIGNyZWF0ZUFydGlmYWN0RGVzY3JpcHRpb24oKSB7Ci0JCUFydGlmYWN0RGVzY3JpcHRpb25JbXBsIGFydGlmYWN0RGVzY3JpcHRpb24gPSBuZXcgQXJ0aWZhY3REZXNjcmlwdGlvbkltcGwoKTsKLQkJcmV0dXJuIGFydGlmYWN0RGVzY3JpcHRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJyZWFrZG93bkVsZW1lbnQgY3JlYXRlQnJlYWtkb3duRWxlbWVudCgpIHsKLQkJQnJlYWtkb3duRWxlbWVudEltcGwgYnJlYWtkb3duRWxlbWVudCA9IG5ldyBCcmVha2Rvd25FbGVtZW50SW1wbCgpOwotCQlyZXR1cm4gYnJlYWtkb3duRWxlbWVudDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uIGNyZWF0ZUJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbigpIHsKLQkJQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uSW1wbCBicmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24gPSBuZXcgQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uSW1wbCgpOwotCQlyZXR1cm4gYnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDYXBhYmlsaXR5UGF0dGVybiBjcmVhdGVDYXBhYmlsaXR5UGF0dGVybigpIHsKLQkJQ2FwYWJpbGl0eVBhdHRlcm5JbXBsIGNhcGFiaWxpdHlQYXR0ZXJuID0gbmV3IENhcGFiaWxpdHlQYXR0ZXJuSW1wbCgpOwotCQlyZXR1cm4gY2FwYWJpbGl0eVBhdHRlcm47Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENoZWNrbGlzdCBjcmVhdGVDaGVja2xpc3QoKSB7Ci0JCUNoZWNrbGlzdEltcGwgY2hlY2tsaXN0ID0gbmV3IENoZWNrbGlzdEltcGwoKTsKLQkJcmV0dXJuIGNoZWNrbGlzdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ29tcG9zaXRlUm9sZSBjcmVhdGVDb21wb3NpdGVSb2xlKCkgewotCQlDb21wb3NpdGVSb2xlSW1wbCBjb21wb3NpdGVSb2xlID0gbmV3IENvbXBvc2l0ZVJvbGVJbXBsKCk7Ci0JCXJldHVybiBjb21wb3NpdGVSb2xlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb25jZXB0IGNyZWF0ZUNvbmNlcHQoKSB7Ci0JCUNvbmNlcHRJbXBsIGNvbmNlcHQgPSBuZXcgQ29uY2VwdEltcGwoKTsKLQkJcmV0dXJuIGNvbmNlcHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENvbnN0cmFpbnQgY3JlYXRlQ29uc3RyYWludCgpIHsKLQkJQ29uc3RyYWludEltcGwgY29uc3RyYWludCA9IG5ldyBDb25zdHJhaW50SW1wbCgpOwotCQlyZXR1cm4gY29uc3RyYWludDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ29udGVudENhdGVnb3J5IGNyZWF0ZUNvbnRlbnRDYXRlZ29yeSgpIHsKLQkJQ29udGVudENhdGVnb3J5SW1wbCBjb250ZW50Q2F0ZWdvcnkgPSBuZXcgQ29udGVudENhdGVnb3J5SW1wbCgpOwotCQlyZXR1cm4gY29udGVudENhdGVnb3J5OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb250ZW50Q2F0ZWdvcnlQYWNrYWdlIGNyZWF0ZUNvbnRlbnRDYXRlZ29yeVBhY2thZ2UoKSB7Ci0JCUNvbnRlbnRDYXRlZ29yeVBhY2thZ2VJbXBsIGNvbnRlbnRDYXRlZ29yeVBhY2thZ2UgPSBuZXcgQ29udGVudENhdGVnb3J5UGFja2FnZUltcGwoKTsKLQkJcmV0dXJuIGNvbnRlbnRDYXRlZ29yeVBhY2thZ2U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENvbnRlbnREZXNjcmlwdGlvbiBjcmVhdGVDb250ZW50RGVzY3JpcHRpb24oKSB7Ci0JCUNvbnRlbnREZXNjcmlwdGlvbkltcGwgY29udGVudERlc2NyaXB0aW9uID0gbmV3IENvbnRlbnREZXNjcmlwdGlvbkltcGwoKTsKLQkJcmV0dXJuIGNvbnRlbnREZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ29udGVudEVsZW1lbnQgY3JlYXRlQ29udGVudEVsZW1lbnQoKSB7Ci0JCUNvbnRlbnRFbGVtZW50SW1wbCBjb250ZW50RWxlbWVudCA9IG5ldyBDb250ZW50RWxlbWVudEltcGwoKTsKLQkJcmV0dXJuIGNvbnRlbnRFbGVtZW50OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb250ZW50UGFja2FnZSBjcmVhdGVDb250ZW50UGFja2FnZSgpIHsKLQkJQ29udGVudFBhY2thZ2VJbXBsIGNvbnRlbnRQYWNrYWdlID0gbmV3IENvbnRlbnRQYWNrYWdlSW1wbCgpOwotCQlyZXR1cm4gY29udGVudFBhY2thZ2U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEN1c3RvbUNhdGVnb3J5IGNyZWF0ZUN1c3RvbUNhdGVnb3J5KCkgewotCQlDdXN0b21DYXRlZ29yeUltcGwgY3VzdG9tQ2F0ZWdvcnkgPSBuZXcgQ3VzdG9tQ2F0ZWdvcnlJbXBsKCk7Ci0JCXJldHVybiBjdXN0b21DYXRlZ29yeTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRGVsaXZlcmFibGUgY3JlYXRlRGVsaXZlcmFibGUoKSB7Ci0JCURlbGl2ZXJhYmxlSW1wbCBkZWxpdmVyYWJsZSA9IG5ldyBEZWxpdmVyYWJsZUltcGwoKTsKLQkJcmV0dXJuIGRlbGl2ZXJhYmxlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEZWxpdmVyYWJsZURlc2NyaXB0aW9uIGNyZWF0ZURlbGl2ZXJhYmxlRGVzY3JpcHRpb24oKSB7Ci0JCURlbGl2ZXJhYmxlRGVzY3JpcHRpb25JbXBsIGRlbGl2ZXJhYmxlRGVzY3JpcHRpb24gPSBuZXcgRGVsaXZlcmFibGVEZXNjcmlwdGlvbkltcGwoKTsKLQkJcmV0dXJuIGRlbGl2ZXJhYmxlRGVzY3JpcHRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERlbGl2ZXJ5UHJvY2VzcyBjcmVhdGVEZWxpdmVyeVByb2Nlc3MoKSB7Ci0JCURlbGl2ZXJ5UHJvY2Vzc0ltcGwgZGVsaXZlcnlQcm9jZXNzID0gbmV3IERlbGl2ZXJ5UHJvY2Vzc0ltcGwoKTsKLQkJcmV0dXJuIGRlbGl2ZXJ5UHJvY2VzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24gY3JlYXRlRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24oKSB7Ci0JCURlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uSW1wbCBkZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbiA9IG5ldyBEZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbkltcGwoKTsKLQkJcmV0dXJuIGRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEZXNjcmliYWJsZUVsZW1lbnQgY3JlYXRlRGVzY3JpYmFibGVFbGVtZW50KCkgewotCQlEZXNjcmliYWJsZUVsZW1lbnRJbXBsIGRlc2NyaWJhYmxlRWxlbWVudCA9IG5ldyBEZXNjcmliYWJsZUVsZW1lbnRJbXBsKCk7Ci0JCXJldHVybiBkZXNjcmliYWJsZUVsZW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERlc2NyaXB0b3IgY3JlYXRlRGVzY3JpcHRvcigpIHsKLQkJRGVzY3JpcHRvckltcGwgZGVzY3JpcHRvciA9IG5ldyBEZXNjcmlwdG9ySW1wbCgpOwotCQlyZXR1cm4gZGVzY3JpcHRvcjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRGVzY3JpcHRvckRlc2NyaXB0aW9uIGNyZWF0ZURlc2NyaXB0b3JEZXNjcmlwdGlvbigpIHsKLQkJRGVzY3JpcHRvckRlc2NyaXB0aW9uSW1wbCBkZXNjcmlwdG9yRGVzY3JpcHRpb24gPSBuZXcgRGVzY3JpcHRvckRlc2NyaXB0aW9uSW1wbCgpOwotCQlyZXR1cm4gZGVzY3JpcHRvckRlc2NyaXB0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEaXNjaXBsaW5lIGNyZWF0ZURpc2NpcGxpbmUoKSB7Ci0JCURpc2NpcGxpbmVJbXBsIGRpc2NpcGxpbmUgPSBuZXcgRGlzY2lwbGluZUltcGwoKTsKLQkJcmV0dXJuIGRpc2NpcGxpbmU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERpc2NpcGxpbmVHcm91cGluZyBjcmVhdGVEaXNjaXBsaW5lR3JvdXBpbmcoKSB7Ci0JCURpc2NpcGxpbmVHcm91cGluZ0ltcGwgZGlzY2lwbGluZUdyb3VwaW5nID0gbmV3IERpc2NpcGxpbmVHcm91cGluZ0ltcGwoKTsKLQkJcmV0dXJuIGRpc2NpcGxpbmVHcm91cGluZzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRG9jdW1lbnRSb290IGNyZWF0ZURvY3VtZW50Um9vdCgpIHsKLQkJRG9jdW1lbnRSb290SW1wbCBkb2N1bWVudFJvb3QgPSBuZXcgRG9jdW1lbnRSb290SW1wbCgpOwotCQlyZXR1cm4gZG9jdW1lbnRSb290OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEb21haW4gY3JlYXRlRG9tYWluKCkgewotCQlEb21haW5JbXBsIGRvbWFpbiA9IG5ldyBEb21haW5JbXBsKCk7Ci0JCXJldHVybiBkb21haW47Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVsZW1lbnQgY3JlYXRlRWxlbWVudCgpIHsKLQkJRWxlbWVudEltcGwgZWxlbWVudCA9IG5ldyBFbGVtZW50SW1wbCgpOwotCQlyZXR1cm4gZWxlbWVudDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRXN0aW1hdGUgY3JlYXRlRXN0aW1hdGUoKSB7Ci0JCUVzdGltYXRlSW1wbCBlc3RpbWF0ZSA9IG5ldyBFc3RpbWF0ZUltcGwoKTsKLQkJcmV0dXJuIGVzdGltYXRlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFc3RpbWF0aW5nTWV0cmljIGNyZWF0ZUVzdGltYXRpbmdNZXRyaWMoKSB7Ci0JCUVzdGltYXRpbmdNZXRyaWNJbXBsIGVzdGltYXRpbmdNZXRyaWMgPSBuZXcgRXN0aW1hdGluZ01ldHJpY0ltcGwoKTsKLQkJcmV0dXJuIGVzdGltYXRpbmdNZXRyaWM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVzdGltYXRpb25Db25zaWRlcmF0aW9ucyBjcmVhdGVFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMoKSB7Ci0JCUVzdGltYXRpb25Db25zaWRlcmF0aW9uc0ltcGwgZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zID0gbmV3IEVzdGltYXRpb25Db25zaWRlcmF0aW9uc0ltcGwoKTsKLQkJcmV0dXJuIGVzdGltYXRpb25Db25zaWRlcmF0aW9uczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRXhhbXBsZSBjcmVhdGVFeGFtcGxlKCkgewotCQlFeGFtcGxlSW1wbCBleGFtcGxlID0gbmV3IEV4YW1wbGVJbXBsKCk7Ci0JCXJldHVybiBleGFtcGxlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBHdWlkYW5jZSBjcmVhdGVHdWlkYW5jZSgpIHsKLQkJR3VpZGFuY2VJbXBsIGd1aWRhbmNlID0gbmV3IEd1aWRhbmNlSW1wbCgpOwotCQlyZXR1cm4gZ3VpZGFuY2U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEd1aWRhbmNlRGVzY3JpcHRpb24gY3JlYXRlR3VpZGFuY2VEZXNjcmlwdGlvbigpIHsKLQkJR3VpZGFuY2VEZXNjcmlwdGlvbkltcGwgZ3VpZGFuY2VEZXNjcmlwdGlvbiA9IG5ldyBHdWlkYW5jZURlc2NyaXB0aW9uSW1wbCgpOwotCQlyZXR1cm4gZ3VpZGFuY2VEZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgR3VpZGVsaW5lIGNyZWF0ZUd1aWRlbGluZSgpIHsKLQkJR3VpZGVsaW5lSW1wbCBndWlkZWxpbmUgPSBuZXcgR3VpZGVsaW5lSW1wbCgpOwotCQlyZXR1cm4gZ3VpZGVsaW5lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJdGVyYXRpb24gY3JlYXRlSXRlcmF0aW9uKCkgewotCQlJdGVyYXRpb25JbXBsIGl0ZXJhdGlvbiA9IG5ldyBJdGVyYXRpb25JbXBsKCk7Ci0JCXJldHVybiBpdGVyYXRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEtpbmQgY3JlYXRlS2luZCgpIHsKLQkJS2luZEltcGwga2luZCA9IG5ldyBLaW5kSW1wbCgpOwotCQlyZXR1cm4ga2luZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTWV0aG9kQ29uZmlndXJhdGlvbiBjcmVhdGVNZXRob2RDb25maWd1cmF0aW9uKCkgewotCQlNZXRob2RDb25maWd1cmF0aW9uSW1wbCBtZXRob2RDb25maWd1cmF0aW9uID0gbmV3IE1ldGhvZENvbmZpZ3VyYXRpb25JbXBsKCk7Ci0JCXJldHVybiBtZXRob2RDb25maWd1cmF0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBNZXRob2RFbGVtZW50IGNyZWF0ZU1ldGhvZEVsZW1lbnQoKSB7Ci0JCU1ldGhvZEVsZW1lbnRJbXBsIG1ldGhvZEVsZW1lbnQgPSBuZXcgTWV0aG9kRWxlbWVudEltcGwoKTsKLQkJcmV0dXJuIG1ldGhvZEVsZW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE1ldGhvZEVsZW1lbnRQcm9wZXJ0eSBjcmVhdGVNZXRob2RFbGVtZW50UHJvcGVydHkoKSB7Ci0JCU1ldGhvZEVsZW1lbnRQcm9wZXJ0eUltcGwgbWV0aG9kRWxlbWVudFByb3BlcnR5ID0gbmV3IE1ldGhvZEVsZW1lbnRQcm9wZXJ0eUltcGwoKTsKLQkJcmV0dXJuIG1ldGhvZEVsZW1lbnRQcm9wZXJ0eTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTWV0aG9kTGlicmFyeSBjcmVhdGVNZXRob2RMaWJyYXJ5KCkgewotCQlNZXRob2RMaWJyYXJ5SW1wbCBtZXRob2RMaWJyYXJ5ID0gbmV3IE1ldGhvZExpYnJhcnlJbXBsKCk7Ci0JCXJldHVybiBtZXRob2RMaWJyYXJ5OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBNZXRob2RQYWNrYWdlIGNyZWF0ZU1ldGhvZFBhY2thZ2UoKSB7Ci0JCU1ldGhvZFBhY2thZ2VJbXBsIG1ldGhvZFBhY2thZ2UgPSBuZXcgTWV0aG9kUGFja2FnZUltcGwoKTsKLQkJcmV0dXJuIG1ldGhvZFBhY2thZ2U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE1ldGhvZFBsdWdpbiBjcmVhdGVNZXRob2RQbHVnaW4oKSB7Ci0JCU1ldGhvZFBsdWdpbkltcGwgbWV0aG9kUGx1Z2luID0gbmV3IE1ldGhvZFBsdWdpbkltcGwoKTsKLQkJcmV0dXJuIG1ldGhvZFBsdWdpbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTWV0aG9kVW5pdCBjcmVhdGVNZXRob2RVbml0KCkgewotCQlNZXRob2RVbml0SW1wbCBtZXRob2RVbml0ID0gbmV3IE1ldGhvZFVuaXRJbXBsKCk7Ci0JCXJldHVybiBtZXRob2RVbml0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBNaWxlc3RvbmUgY3JlYXRlTWlsZXN0b25lKCkgewotCQlNaWxlc3RvbmVJbXBsIG1pbGVzdG9uZSA9IG5ldyBNaWxlc3RvbmVJbXBsKCk7Ci0JCXJldHVybiBtaWxlc3RvbmU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5hbWVkRWxlbWVudCBjcmVhdGVOYW1lZEVsZW1lbnQoKSB7Ci0JCU5hbWVkRWxlbWVudEltcGwgbmFtZWRFbGVtZW50ID0gbmV3IE5hbWVkRWxlbWVudEltcGwoKTsKLQkJcmV0dXJuIG5hbWVkRWxlbWVudDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT3V0Y29tZSBjcmVhdGVPdXRjb21lKCkgewotCQlPdXRjb21lSW1wbCBvdXRjb21lID0gbmV3IE91dGNvbWVJbXBsKCk7Ci0JCXJldHVybiBvdXRjb21lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQYWNrYWdlYWJsZUVsZW1lbnQgY3JlYXRlUGFja2FnZWFibGVFbGVtZW50KCkgewotCQlQYWNrYWdlYWJsZUVsZW1lbnRJbXBsIHBhY2thZ2VhYmxlRWxlbWVudCA9IG5ldyBQYWNrYWdlYWJsZUVsZW1lbnRJbXBsKCk7Ci0JCXJldHVybiBwYWNrYWdlYWJsZUVsZW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFBoYXNlIGNyZWF0ZVBoYXNlKCkgewotCQlQaGFzZUltcGwgcGhhc2UgPSBuZXcgUGhhc2VJbXBsKCk7Ci0JCXJldHVybiBwaGFzZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUGxhbm5pbmdEYXRhIGNyZWF0ZVBsYW5uaW5nRGF0YSgpIHsKLQkJUGxhbm5pbmdEYXRhSW1wbCBwbGFubmluZ0RhdGEgPSBuZXcgUGxhbm5pbmdEYXRhSW1wbCgpOwotCQlyZXR1cm4gcGxhbm5pbmdEYXRhOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQcmFjdGljZSBjcmVhdGVQcmFjdGljZSgpIHsKLQkJUHJhY3RpY2VJbXBsIHByYWN0aWNlID0gbmV3IFByYWN0aWNlSW1wbCgpOwotCQlyZXR1cm4gcHJhY3RpY2U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFByYWN0aWNlRGVzY3JpcHRpb24gY3JlYXRlUHJhY3RpY2VEZXNjcmlwdGlvbigpIHsKLQkJUHJhY3RpY2VEZXNjcmlwdGlvbkltcGwgcHJhY3RpY2VEZXNjcmlwdGlvbiA9IG5ldyBQcmFjdGljZURlc2NyaXB0aW9uSW1wbCgpOwotCQlyZXR1cm4gcHJhY3RpY2VEZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2VzcyBjcmVhdGVQcm9jZXNzKCkgewotCQlQcm9jZXNzSW1wbCBwcm9jZXNzID0gbmV3IFByb2Nlc3NJbXBsKCk7Ci0JCXJldHVybiBwcm9jZXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQcm9jZXNzQ29tcG9uZW50IGNyZWF0ZVByb2Nlc3NDb21wb25lbnQoKSB7Ci0JCVByb2Nlc3NDb21wb25lbnRJbXBsIHByb2Nlc3NDb21wb25lbnQgPSBuZXcgUHJvY2Vzc0NvbXBvbmVudEltcGwoKTsKLQkJcmV0dXJuIHByb2Nlc3NDb21wb25lbnQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UgY3JlYXRlUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSgpIHsKLQkJUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZUltcGwgcHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSA9IG5ldyBQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlSW1wbCgpOwotCQlyZXR1cm4gcHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUHJvY2Vzc0Rlc2NyaXB0aW9uIGNyZWF0ZVByb2Nlc3NEZXNjcmlwdGlvbigpIHsKLQkJUHJvY2Vzc0Rlc2NyaXB0aW9uSW1wbCBwcm9jZXNzRGVzY3JpcHRpb24gPSBuZXcgUHJvY2Vzc0Rlc2NyaXB0aW9uSW1wbCgpOwotCQlyZXR1cm4gcHJvY2Vzc0Rlc2NyaXB0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQcm9jZXNzRWxlbWVudCBjcmVhdGVQcm9jZXNzRWxlbWVudCgpIHsKLQkJUHJvY2Vzc0VsZW1lbnRJbXBsIHByb2Nlc3NFbGVtZW50ID0gbmV3IFByb2Nlc3NFbGVtZW50SW1wbCgpOwotCQlyZXR1cm4gcHJvY2Vzc0VsZW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFByb2Nlc3NQYWNrYWdlIGNyZWF0ZVByb2Nlc3NQYWNrYWdlKCkgewotCQlQcm9jZXNzUGFja2FnZUltcGwgcHJvY2Vzc1BhY2thZ2UgPSBuZXcgUHJvY2Vzc1BhY2thZ2VJbXBsKCk7Ci0JCXJldHVybiBwcm9jZXNzUGFja2FnZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUgY3JlYXRlUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUoKSB7Ci0JCVByb2Nlc3NQbGFubmluZ1RlbXBsYXRlSW1wbCBwcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSA9IG5ldyBQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZUltcGwoKTsKLQkJcmV0dXJuIHByb2Nlc3NQbGFubmluZ1RlbXBsYXRlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZXBvcnQgY3JlYXRlUmVwb3J0KCkgewotCQlSZXBvcnRJbXBsIHJlcG9ydCA9IG5ldyBSZXBvcnRJbXBsKCk7Ci0JCXJldHVybiByZXBvcnQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJldXNhYmxlQXNzZXQgY3JlYXRlUmV1c2FibGVBc3NldCgpIHsKLQkJUmV1c2FibGVBc3NldEltcGwgcmV1c2FibGVBc3NldCA9IG5ldyBSZXVzYWJsZUFzc2V0SW1wbCgpOwotCQlyZXR1cm4gcmV1c2FibGVBc3NldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUm9hZG1hcCBjcmVhdGVSb2FkbWFwKCkgewotCQlSb2FkbWFwSW1wbCByb2FkbWFwID0gbmV3IFJvYWRtYXBJbXBsKCk7Ci0JCXJldHVybiByb2FkbWFwOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSb2xlIGNyZWF0ZVJvbGUoKSB7Ci0JCVJvbGVJbXBsIHJvbGUgPSBuZXcgUm9sZUltcGwoKTsKLQkJcmV0dXJuIHJvbGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJvbGVEZXNjcmlwdGlvbiBjcmVhdGVSb2xlRGVzY3JpcHRpb24oKSB7Ci0JCVJvbGVEZXNjcmlwdGlvbkltcGwgcm9sZURlc2NyaXB0aW9uID0gbmV3IFJvbGVEZXNjcmlwdGlvbkltcGwoKTsKLQkJcmV0dXJuIHJvbGVEZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUm9sZURlc2NyaXB0b3IgY3JlYXRlUm9sZURlc2NyaXB0b3IoKSB7Ci0JCVJvbGVEZXNjcmlwdG9ySW1wbCByb2xlRGVzY3JpcHRvciA9IG5ldyBSb2xlRGVzY3JpcHRvckltcGwoKTsKLQkJcmV0dXJuIHJvbGVEZXNjcmlwdG9yOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSb2xlU2V0IGNyZWF0ZVJvbGVTZXQoKSB7Ci0JCVJvbGVTZXRJbXBsIHJvbGVTZXQgPSBuZXcgUm9sZVNldEltcGwoKTsKLQkJcmV0dXJuIHJvbGVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJvbGVTZXRHcm91cGluZyBjcmVhdGVSb2xlU2V0R3JvdXBpbmcoKSB7Ci0JCVJvbGVTZXRHcm91cGluZ0ltcGwgcm9sZVNldEdyb3VwaW5nID0gbmV3IFJvbGVTZXRHcm91cGluZ0ltcGwoKTsKLQkJcmV0dXJuIHJvbGVTZXRHcm91cGluZzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU2VjdGlvbiBjcmVhdGVTZWN0aW9uKCkgewotCQlTZWN0aW9uSW1wbCBzZWN0aW9uID0gbmV3IFNlY3Rpb25JbXBsKCk7Ci0JCXJldHVybiBzZWN0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdXBwb3J0aW5nTWF0ZXJpYWwgY3JlYXRlU3VwcG9ydGluZ01hdGVyaWFsKCkgewotCQlTdXBwb3J0aW5nTWF0ZXJpYWxJbXBsIHN1cHBvcnRpbmdNYXRlcmlhbCA9IG5ldyBTdXBwb3J0aW5nTWF0ZXJpYWxJbXBsKCk7Ci0JCXJldHVybiBzdXBwb3J0aW5nTWF0ZXJpYWw7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFRhc2sgY3JlYXRlVGFzaygpIHsKLQkJVGFza0ltcGwgdGFzayA9IG5ldyBUYXNrSW1wbCgpOwotCQlyZXR1cm4gdGFzazsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVGFza0Rlc2NyaXB0aW9uIGNyZWF0ZVRhc2tEZXNjcmlwdGlvbigpIHsKLQkJVGFza0Rlc2NyaXB0aW9uSW1wbCB0YXNrRGVzY3JpcHRpb24gPSBuZXcgVGFza0Rlc2NyaXB0aW9uSW1wbCgpOwotCQlyZXR1cm4gdGFza0Rlc2NyaXB0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUYXNrRGVzY3JpcHRvciBjcmVhdGVUYXNrRGVzY3JpcHRvcigpIHsKLQkJVGFza0Rlc2NyaXB0b3JJbXBsIHRhc2tEZXNjcmlwdG9yID0gbmV3IFRhc2tEZXNjcmlwdG9ySW1wbCgpOwotCQlyZXR1cm4gdGFza0Rlc2NyaXB0b3I7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFRlYW1Qcm9maWxlIGNyZWF0ZVRlYW1Qcm9maWxlKCkgewotCQlUZWFtUHJvZmlsZUltcGwgdGVhbVByb2ZpbGUgPSBuZXcgVGVhbVByb2ZpbGVJbXBsKCk7Ci0JCXJldHVybiB0ZWFtUHJvZmlsZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVGVtcGxhdGUgY3JlYXRlVGVtcGxhdGUoKSB7Ci0JCVRlbXBsYXRlSW1wbCB0ZW1wbGF0ZSA9IG5ldyBUZW1wbGF0ZUltcGwoKTsKLQkJcmV0dXJuIHRlbXBsYXRlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUZXJtRGVmaW5pdGlvbiBjcmVhdGVUZXJtRGVmaW5pdGlvbigpIHsKLQkJVGVybURlZmluaXRpb25JbXBsIHRlcm1EZWZpbml0aW9uID0gbmV3IFRlcm1EZWZpbml0aW9uSW1wbCgpOwotCQlyZXR1cm4gdGVybURlZmluaXRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFRvb2wgY3JlYXRlVG9vbCgpIHsKLQkJVG9vbEltcGwgdG9vbCA9IG5ldyBUb29sSW1wbCgpOwotCQlyZXR1cm4gdG9vbDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVG9vbE1lbnRvciBjcmVhdGVUb29sTWVudG9yKCkgewotCQlUb29sTWVudG9ySW1wbCB0b29sTWVudG9yID0gbmV3IFRvb2xNZW50b3JJbXBsKCk7Ci0JCXJldHVybiB0b29sTWVudG9yOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBXaGl0ZXBhcGVyIGNyZWF0ZVdoaXRlcGFwZXIoKSB7Ci0JCVdoaXRlcGFwZXJJbXBsIHdoaXRlcGFwZXIgPSBuZXcgV2hpdGVwYXBlckltcGwoKTsKLQkJcmV0dXJuIHdoaXRlcGFwZXI7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFdvcmtCcmVha2Rvd25FbGVtZW50IGNyZWF0ZVdvcmtCcmVha2Rvd25FbGVtZW50KCkgewotCQlXb3JrQnJlYWtkb3duRWxlbWVudEltcGwgd29ya0JyZWFrZG93bkVsZW1lbnQgPSBuZXcgV29ya0JyZWFrZG93bkVsZW1lbnRJbXBsKCk7Ci0JCXJldHVybiB3b3JrQnJlYWtkb3duRWxlbWVudDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgV29ya0RlZmluaXRpb24gY3JlYXRlV29ya0RlZmluaXRpb24oKSB7Ci0JCVdvcmtEZWZpbml0aW9uSW1wbCB3b3JrRGVmaW5pdGlvbiA9IG5ldyBXb3JrRGVmaW5pdGlvbkltcGwoKTsKLQkJcmV0dXJuIHdvcmtEZWZpbml0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBXb3JrT3JkZXIgY3JlYXRlV29ya09yZGVyKCkgewotCQlXb3JrT3JkZXJJbXBsIHdvcmtPcmRlciA9IG5ldyBXb3JrT3JkZXJJbXBsKCk7Ci0JCXJldHVybiB3b3JrT3JkZXI7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFdvcmtQcm9kdWN0IGNyZWF0ZVdvcmtQcm9kdWN0KCkgewotCQlXb3JrUHJvZHVjdEltcGwgd29ya1Byb2R1Y3QgPSBuZXcgV29ya1Byb2R1Y3RJbXBsKCk7Ci0JCXJldHVybiB3b3JrUHJvZHVjdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgV29ya1Byb2R1Y3REZXNjcmlwdGlvbiBjcmVhdGVXb3JrUHJvZHVjdERlc2NyaXB0aW9uKCkgewotCQlXb3JrUHJvZHVjdERlc2NyaXB0aW9uSW1wbCB3b3JrUHJvZHVjdERlc2NyaXB0aW9uID0gbmV3IFdvcmtQcm9kdWN0RGVzY3JpcHRpb25JbXBsKCk7Ci0JCXJldHVybiB3b3JrUHJvZHVjdERlc2NyaXB0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBXb3JrUHJvZHVjdERlc2NyaXB0b3IgY3JlYXRlV29ya1Byb2R1Y3REZXNjcmlwdG9yKCkgewotCQlXb3JrUHJvZHVjdERlc2NyaXB0b3JJbXBsIHdvcmtQcm9kdWN0RGVzY3JpcHRvciA9IG5ldyBXb3JrUHJvZHVjdERlc2NyaXB0b3JJbXBsKCk7Ci0JCXJldHVybiB3b3JrUHJvZHVjdERlc2NyaXB0b3I7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFdvcmtQcm9kdWN0VHlwZSBjcmVhdGVXb3JrUHJvZHVjdFR5cGUoKSB7Ci0JCVdvcmtQcm9kdWN0VHlwZUltcGwgd29ya1Byb2R1Y3RUeXBlID0gbmV3IFdvcmtQcm9kdWN0VHlwZUltcGwoKTsKLQkJcmV0dXJuIHdvcmtQcm9kdWN0VHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVmFyaWFiaWxpdHlUeXBlIGNyZWF0ZVZhcmlhYmlsaXR5VHlwZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlWYXJpYWJpbGl0eVR5cGUgcmVzdWx0ID0gVmFyaWFiaWxpdHlUeXBlLmdldChpbml0aWFsVmFsdWUpOwotCQlpZiAocmVzdWx0ID09IG51bGwpIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSB2YWx1ZSAnIiArIGluaXRpYWxWYWx1ZSArICInIGlzIG5vdCBhIHZhbGlkIGVudW1lcmF0b3Igb2YgJyIgKyBlRGF0YVR5cGUuZ2V0TmFtZSgpICsgIiciKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRWYXJpYWJpbGl0eVR5cGVUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gaW5zdGFuY2VWYWx1ZSA9PSBudWxsID8gbnVsbCA6IGluc3RhbmNlVmFsdWUudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgV29ya09yZGVyVHlwZSBjcmVhdGVXb3JrT3JkZXJUeXBlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCVdvcmtPcmRlclR5cGUgcmVzdWx0ID0gV29ya09yZGVyVHlwZS5nZXQoaW5pdGlhbFZhbHVlKTsKLQkJaWYgKHJlc3VsdCA9PSBudWxsKSB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgdmFsdWUgJyIgKyBpbml0aWFsVmFsdWUgKyAiJyBpcyBub3QgYSB2YWxpZCBlbnVtZXJhdG9yIG9mICciICsgZURhdGFUeXBlLmdldE5hbWUoKSArICInIik7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0V29ya09yZGVyVHlwZVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBpbnN0YW5jZVZhbHVlID09IG51bGwgPyBudWxsIDogaW5zdGFuY2VWYWx1ZS50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBWYXJpYWJpbGl0eVR5cGUgY3JlYXRlVmFyaWFiaWxpdHlUeXBlT2JqZWN0RnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiBjcmVhdGVWYXJpYWJpbGl0eVR5cGVGcm9tU3RyaW5nKFVtYVBhY2thZ2UuTGl0ZXJhbHMuVkFSSUFCSUxJVFlfVFlQRSwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRWYXJpYWJpbGl0eVR5cGVPYmplY3RUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gY29udmVydFZhcmlhYmlsaXR5VHlwZVRvU3RyaW5nKFVtYVBhY2thZ2UuTGl0ZXJhbHMuVkFSSUFCSUxJVFlfVFlQRSwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFdvcmtPcmRlclR5cGUgY3JlYXRlV29ya09yZGVyVHlwZU9iamVjdEZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlyZXR1cm4gY3JlYXRlV29ya09yZGVyVHlwZUZyb21TdHJpbmcoVW1hUGFja2FnZS5MaXRlcmFscy5XT1JLX09SREVSX1RZUEUsIGluaXRpYWxWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0V29ya09yZGVyVHlwZU9iamVjdFRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBjb252ZXJ0V29ya09yZGVyVHlwZVRvU3RyaW5nKFVtYVBhY2thZ2UuTGl0ZXJhbHMuV09SS19PUkRFUl9UWVBFLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVW1hUGFja2FnZSBnZXRVbWFQYWNrYWdlKCkgewotCQlyZXR1cm4gKFVtYVBhY2thZ2UpZ2V0RVBhY2thZ2UoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBkZXByZWNhdGVkCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUBEZXByZWNhdGVkCi0JcHVibGljIHN0YXRpYyBVbWFQYWNrYWdlIGdldFBhY2thZ2UoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLmVJTlNUQU5DRTsKLQl9Ci0KLX0gLy9VbWFGYWN0b3J5SW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvVW1hUGFja2FnZUltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1VtYVBhY2thZ2VJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1NTc2NTIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvVW1hUGFja2FnZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczMTAgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBVbWFQYWNrYWdlSW1wbC5qYXZhLHYgMS4yIDIwMDgvMDEvMzAgMDA6NDE6NDcga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVFbnVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVQYWNrYWdlSW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5YTUxUeXBlUGFja2FnZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFjdGl2aXR5RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQXBwbGljYWJsZU1ldGFDbGFzc0luZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQXJ0aWZhY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQXJ0aWZhY3REZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5CcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5DYXBhYmlsaXR5UGF0dGVybjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5DaGVja2xpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29tcG9zaXRlUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db25jZXB0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnN0cmFpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudENhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnRDYXRlZ29yeVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkN1c3RvbUNhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlbGl2ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlbGl2ZXJhYmxlRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVsaXZlcnlQcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlc2NyaWJhYmxlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZXNjcmlwdG9yRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGlzY2lwbGluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EaXNjaXBsaW5lR3JvdXBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRG9jdW1lbnRSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkVzdGltYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkVzdGltYXRpbmdNZXRyaWM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkV4YW1wbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuR3VpZGFuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuR3VpZGFuY2VEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5HdWlkZWxpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuSXRlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLktpbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZEVsZW1lbnRQcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RMaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZFVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWlsZXN0b25lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk5hbWVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5PdXRjb21lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlBhY2thZ2VhYmxlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5QaGFzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5QbGFubmluZ0RhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJhY3RpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJhY3RpY2VEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc0Rlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NQbGFubmluZ1RlbXBsYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJlcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5SZXVzYWJsZUFzc2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJvYWRtYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Sb2xlRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUm9sZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUm9sZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Sb2xlU2V0R3JvdXBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuU2VjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5TdXBwb3J0aW5nTWF0ZXJpYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFzazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UYXNrRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFza0Rlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGVhbVByb2ZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGVtcGxhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGVybURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVG9vbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Ub29sTWVudG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5WYXJpYWJpbGl0eVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV2hpdGVwYXBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrT3JkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya09yZGVyVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdFR5cGU7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCA8Yj5QYWNrYWdlPC9iPi4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgVW1hUGFja2FnZUltcGwgZXh0ZW5kcyBFUGFja2FnZUltcGwgaW1wbGVtZW50cyBVbWFQYWNrYWdlIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBhY3Rpdml0eUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBhY3Rpdml0eURlc2NyaXB0aW9uRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGFydGlmYWN0RUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGFydGlmYWN0RGVzY3JpcHRpb25FQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgYnJlYWtkb3duRWxlbWVudEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBicmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb25FQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgY2FwYWJpbGl0eVBhdHRlcm5FQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgY2hlY2tsaXN0RUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGNvbXBvc2l0ZVJvbGVFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgY29uY2VwdEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBjb25zdHJhaW50RUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGNvbnRlbnRDYXRlZ29yeUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBjb250ZW50Q2F0ZWdvcnlQYWNrYWdlRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGNvbnRlbnREZXNjcmlwdGlvbkVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBjb250ZW50RWxlbWVudEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBjb250ZW50UGFja2FnZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBjdXN0b21DYXRlZ29yeUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBkZWxpdmVyYWJsZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBkZWxpdmVyYWJsZURlc2NyaXB0aW9uRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGRlbGl2ZXJ5UHJvY2Vzc0VDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBkZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbkVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBkZXNjcmliYWJsZUVsZW1lbnRFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgZGVzY3JpcHRvckVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBkZXNjcmlwdG9yRGVzY3JpcHRpb25FQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgZGlzY2lwbGluZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBkaXNjaXBsaW5lR3JvdXBpbmdFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgZG9jdW1lbnRSb290RUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGRvbWFpbkVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBlbGVtZW50RUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGVzdGltYXRlRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGVzdGltYXRpbmdNZXRyaWNFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGV4YW1wbGVFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgZ3VpZGFuY2VFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgZ3VpZGFuY2VEZXNjcmlwdGlvbkVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBndWlkZWxpbmVFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgaXRlcmF0aW9uRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGtpbmRFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgbWV0aG9kQ29uZmlndXJhdGlvbkVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBtZXRob2RFbGVtZW50RUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIG1ldGhvZEVsZW1lbnRQcm9wZXJ0eUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBtZXRob2RMaWJyYXJ5RUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIG1ldGhvZFBhY2thZ2VFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgbWV0aG9kUGx1Z2luRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIG1ldGhvZFVuaXRFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgbWlsZXN0b25lRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIG5hbWVkRWxlbWVudEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBvdXRjb21lRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHBhY2thZ2VhYmxlRWxlbWVudEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBwaGFzZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBwbGFubmluZ0RhdGFFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgcHJhY3RpY2VFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgcHJhY3RpY2VEZXNjcmlwdGlvbkVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBwcm9jZXNzRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHByb2Nlc3NDb21wb25lbnRFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgcHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBwcm9jZXNzRGVzY3JpcHRpb25FQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgcHJvY2Vzc0VsZW1lbnRFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgcHJvY2Vzc1BhY2thZ2VFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgcHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGVFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgcmVwb3J0RUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHJldXNhYmxlQXNzZXRFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3Mgcm9hZG1hcEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyByb2xlRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHJvbGVEZXNjcmlwdGlvbkVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyByb2xlRGVzY3JpcHRvckVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyByb2xlU2V0RUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHJvbGVTZXRHcm91cGluZ0VDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBzZWN0aW9uRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHN1cHBvcnRpbmdNYXRlcmlhbEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB0YXNrRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHRhc2tEZXNjcmlwdGlvbkVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB0YXNrRGVzY3JpcHRvckVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB0ZWFtUHJvZmlsZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB0ZW1wbGF0ZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB0ZXJtRGVmaW5pdGlvbkVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB0b29sRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHRvb2xNZW50b3JFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3Mgd2hpdGVwYXBlckVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB3b3JrQnJlYWtkb3duRWxlbWVudEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB3b3JrRGVmaW5pdGlvbkVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB3b3JrT3JkZXJFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3Mgd29ya1Byb2R1Y3RFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3Mgd29ya1Byb2R1Y3REZXNjcmlwdGlvbkVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB3b3JrUHJvZHVjdERlc2NyaXB0b3JFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3Mgd29ya1Byb2R1Y3RUeXBlRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUVudW0gdmFyaWFiaWxpdHlUeXBlRUVudW0gPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRW51bSB3b3JrT3JkZXJUeXBlRUVudW0gPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgdmFyaWFiaWxpdHlUeXBlT2JqZWN0RURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIHdvcmtPcmRlclR5cGVPYmplY3RFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgbW9kZWwgPGI+UGFja2FnZTwvYj4sIHJlZ2lzdGVyZWQgd2l0aAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2UuUmVnaXN0cnkgRVBhY2thZ2UuUmVnaXN0cnl9IGJ5IHRoZSBwYWNrYWdlCi0JICogcGFja2FnZSBVUkkgdmFsdWUuCi0JICogPHA+Tm90ZTogdGhlIGNvcnJlY3Qgd2F5IHRvIGNyZWF0ZSB0aGUgcGFja2FnZSBpcyB2aWEgdGhlIHN0YXRpYwotCSAqIGZhY3RvcnkgbWV0aG9kIHtAbGluayAjaW5pdCBpbml0KCl9LCB3aGljaCBhbHNvIHBlcmZvcm1zCi0JICogaW5pdGlhbGl6YXRpb24gb2YgdGhlIHBhY2thZ2UsIG9yIHJldHVybnMgdGhlIHJlZ2lzdGVyZWQgcGFja2FnZSwKLQkgKiBpZiBvbmUgYWxyZWFkeSBleGlzdHMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZS5SZWdpc3RyeQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNlTlNfVVJJCi0JICogQHNlZSAjaW5pdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgVW1hUGFja2FnZUltcGwoKSB7Ci0JCXN1cGVyKGVOU19VUkksIFVtYUZhY3RvcnkuZUlOU1RBTkNFKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzSW5pdGVkID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBDcmVhdGVzLCByZWdpc3RlcnMsIGFuZCBpbml0aWFsaXplcyB0aGUgPGI+UGFja2FnZTwvYj4gZm9yIHRoaXMKLQkgKiBtb2RlbCwgYW5kIGZvciBhbnkgb3RoZXJzIHVwb24gd2hpY2ggaXQgZGVwZW5kcy4gIFNpbXBsZQotCSAqIGRlcGVuZGVuY2llcyBhcmUgc2F0aXNmaWVkIGJ5IGNhbGxpbmcgdGhpcyBtZXRob2Qgb24gYWxsCi0JICogZGVwZW5kZW50IHBhY2thZ2VzIGJlZm9yZSBkb2luZyBhbnl0aGluZyBlbHNlLiAgVGhpcyBtZXRob2QgZHJpdmVzCi0JICogaW5pdGlhbGl6YXRpb24gZm9yIGludGVyZGVwZW5kZW50IHBhY2thZ2VzIGRpcmVjdGx5LCBpbiBwYXJhbGxlbAotCSAqIHdpdGggdGhpcyBwYWNrYWdlLCBpdHNlbGYuCi0JICogPHA+T2YgdGhpcyBwYWNrYWdlIGFuZCBpdHMgaW50ZXJkZXBlbmRlbmNpZXMsIGFsbCBwYWNrYWdlcyB3aGljaAotCSAqIGhhdmUgbm90IHlldCBiZWVuIHJlZ2lzdGVyZWQgYnkgdGhlaXIgVVJJIHZhbHVlcyBhcmUgZmlyc3QgY3JlYXRlZAotCSAqIGFuZCByZWdpc3RlcmVkLiAgVGhlIHBhY2thZ2VzIGFyZSB0aGVuIGluaXRpYWxpemVkIGluIHR3byBzdGVwczoKLQkgKiBtZXRhLW1vZGVsIG9iamVjdHMgZm9yIGFsbCBvZiB0aGUgcGFja2FnZXMgYXJlIGNyZWF0ZWQgYmVmb3JlIGFueQotCSAqIGFyZSBpbml0aWFsaXplZCwgc2luY2Ugb25lIHBhY2thZ2UncyBtZXRhLW1vZGVsIG9iamVjdHMgbWF5IHJlZmVyIHRvCi0JICogdGhvc2Ugb2YgYW5vdGhlci4KLQkgKiA8cD5JbnZvY2F0aW9uIG9mIHRoaXMgbWV0aG9kIHdpbGwgbm90IGFmZmVjdCBhbnkgcGFja2FnZXMgdGhhdCBoYXZlCi0JICogYWxyZWFkeSBiZWVuIGluaXRpYWxpemVkLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZU5TX1VSSQotCSAqIEBzZWUgI2NyZWF0ZVBhY2thZ2VDb250ZW50cygpCi0JICogQHNlZSAjaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgVW1hUGFja2FnZSBpbml0KCkgewotCQlpZiAoaXNJbml0ZWQpIHJldHVybiAoVW1hUGFja2FnZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShVbWFQYWNrYWdlLmVOU19VUkkpOwotCi0JCS8vIE9idGFpbiBvciBjcmVhdGUgYW5kIHJlZ2lzdGVyIHBhY2thZ2UKLQkJVW1hUGFja2FnZUltcGwgdGhlVW1hUGFja2FnZSA9IChVbWFQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoZU5TX1VSSSkgaW5zdGFuY2VvZiBVbWFQYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKGVOU19VUkkpIDogbmV3IFVtYVBhY2thZ2VJbXBsKCkpOwotCi0JCWlzSW5pdGVkID0gdHJ1ZTsKLQotCQkvLyBJbml0aWFsaXplIHNpbXBsZSBkZXBlbmRlbmNpZXMKLQkJWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmVDbGFzcygpOwotCi0JCS8vIENyZWF0ZSBwYWNrYWdlIG1ldGEtZGF0YSBvYmplY3RzCi0JCXRoZVVtYVBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBjcmVhdGVkIG1ldGEtZGF0YQotCQl0aGVVbWFQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQotCQkvLyBNYXJrIG1ldGEtZGF0YSB0byBpbmRpY2F0ZSBpdCBjYW4ndCBiZSBjaGFuZ2VkCi0JCXRoZVVtYVBhY2thZ2UuZnJlZXplKCk7Ci0KLQkJcmV0dXJuIHRoZVVtYVBhY2thZ2U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRBY3Rpdml0eSgpIHsKLQkJcmV0dXJuIGFjdGl2aXR5RUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEFjdGl2aXR5X1ByZWNvbmRpdGlvbigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWFjdGl2aXR5RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QWN0aXZpdHlfUG9zdGNvbmRpdGlvbigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWFjdGl2aXR5RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QWN0aXZpdHlfR3JvdXAzKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpYWN0aXZpdHlFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRBY3Rpdml0eV9CcmVha2Rvd25FbGVtZW50KCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpYWN0aXZpdHlFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBY3Rpdml0eV9Sb2FkbWFwKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpYWN0aXZpdHlFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBY3Rpdml0eV9Jc0VuYWN0YWJsZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWFjdGl2aXR5RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QWN0aXZpdHlfVmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWFjdGl2aXR5RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QWN0aXZpdHlfVmFyaWFiaWxpdHlUeXBlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpYWN0aXZpdHlFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg3KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldEFjdGl2aXR5RGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBhY3Rpdml0eURlc2NyaXB0aW9uRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEFjdGl2aXR5RGVzY3JpcHRpb25fQWx0ZXJuYXRpdmVzKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpYWN0aXZpdHlEZXNjcmlwdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEFjdGl2aXR5RGVzY3JpcHRpb25fSG93VG9TdGFmZigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWFjdGl2aXR5RGVzY3JpcHRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBY3Rpdml0eURlc2NyaXB0aW9uX1B1cnBvc2UoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlhY3Rpdml0eURlc2NyaXB0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRBcHBsaWNhYmxlTWV0YUNsYXNzSW5mbygpIHsKLQkJcmV0dXJuIGFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvX0lzUHJpbWFyeUV4dGVuc2lvbigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRBcnRpZmFjdCgpIHsKLQkJcmV0dXJuIGFydGlmYWN0RUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEFydGlmYWN0X0dyb3VwMygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWFydGlmYWN0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0QXJ0aWZhY3RfQ29udGFpbmVkQXJ0aWZhY3QoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlhcnRpZmFjdEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0QXJ0aWZhY3REZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIGFydGlmYWN0RGVzY3JpcHRpb25FQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QXJ0aWZhY3REZXNjcmlwdGlvbl9CcmllZk91dGxpbmUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlhcnRpZmFjdERlc2NyaXB0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QXJ0aWZhY3REZXNjcmlwdGlvbl9SZXByZXNlbnRhdGlvbk9wdGlvbnMoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlhcnRpZmFjdERlc2NyaXB0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QXJ0aWZhY3REZXNjcmlwdGlvbl9SZXByZXNlbnRhdGlvbigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWFydGlmYWN0RGVzY3JpcHRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBcnRpZmFjdERlc2NyaXB0aW9uX05vdGF0aW9uKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpYXJ0aWZhY3REZXNjcmlwdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0QnJlYWtkb3duRWxlbWVudCgpIHsKLQkJcmV0dXJuIGJyZWFrZG93bkVsZW1lbnRFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QnJlYWtkb3duRWxlbWVudF9QcmVzZW50ZWRBZnRlcigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWJyZWFrZG93bkVsZW1lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRCcmVha2Rvd25FbGVtZW50X1ByZXNlbnRlZEJlZm9yZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWJyZWFrZG93bkVsZW1lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRCcmVha2Rvd25FbGVtZW50X1BsYW5uaW5nRGF0YSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWJyZWFrZG93bkVsZW1lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRCcmVha2Rvd25FbGVtZW50X1N1cGVyQWN0aXZpdHkoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlicmVha2Rvd25FbGVtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QnJlYWtkb3duRWxlbWVudF9Hcm91cDEoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlicmVha2Rvd25FbGVtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QnJlYWtkb3duRWxlbWVudF9DaGVja2xpc3QoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlicmVha2Rvd25FbGVtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QnJlYWtkb3duRWxlbWVudF9Db25jZXB0KCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpYnJlYWtkb3duRWxlbWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDYpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEJyZWFrZG93bkVsZW1lbnRfRXhhbXBsZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWJyZWFrZG93bkVsZW1lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg3KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRCcmVha2Rvd25FbGVtZW50X0d1aWRlbGluZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWJyZWFrZG93bkVsZW1lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg4KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRCcmVha2Rvd25FbGVtZW50X1JldXNhYmxlQXNzZXQoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlicmVha2Rvd25FbGVtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoOSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QnJlYWtkb3duRWxlbWVudF9TdXBwb3J0aW5nTWF0ZXJpYWwoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlicmVha2Rvd25FbGVtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEJyZWFrZG93bkVsZW1lbnRfV2hpdGVwYXBlcigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWJyZWFrZG93bkVsZW1lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QnJlYWtkb3duRWxlbWVudF9IYXNNdWx0aXBsZU9jY3VycmVuY2VzKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpYnJlYWtkb3duRWxlbWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRCcmVha2Rvd25FbGVtZW50X0lzT3B0aW9uYWwoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlicmVha2Rvd25FbGVtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEJyZWFrZG93bkVsZW1lbnRfSXNQbGFubmVkKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpYnJlYWtkb3duRWxlbWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDE0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRCcmVha2Rvd25FbGVtZW50X1ByZWZpeCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWJyZWFrZG93bkVsZW1lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxNSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBicmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb25FQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uX1VzYWdlR3VpZGFuY2UoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlicmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldENhcGFiaWxpdHlQYXR0ZXJuKCkgewotCQlyZXR1cm4gY2FwYWJpbGl0eVBhdHRlcm5FQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRDaGVja2xpc3QoKSB7Ci0JCXJldHVybiBjaGVja2xpc3RFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRDb21wb3NpdGVSb2xlKCkgewotCQlyZXR1cm4gY29tcG9zaXRlUm9sZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRDb21wb3NpdGVSb2xlX0dyb3VwMigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWNvbXBvc2l0ZVJvbGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRDb21wb3NpdGVSb2xlX0FnZ3JlZ2F0ZWRSb2xlKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpY29tcG9zaXRlUm9sZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0Q29uY2VwdCgpIHsKLQkJcmV0dXJuIGNvbmNlcHRFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRDb25zdHJhaW50KCkgewotCQlyZXR1cm4gY29uc3RyYWludEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRDb25zdHJhaW50X01haW5EZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWNvbnN0cmFpbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldENvbnRlbnRDYXRlZ29yeSgpIHsKLQkJcmV0dXJuIGNvbnRlbnRDYXRlZ29yeUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldENvbnRlbnRDYXRlZ29yeVBhY2thZ2UoKSB7Ci0JCXJldHVybiBjb250ZW50Q2F0ZWdvcnlQYWNrYWdlRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldENvbnRlbnRDYXRlZ29yeVBhY2thZ2VfR3JvdXAyKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpY29udGVudENhdGVnb3J5UGFja2FnZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldENvbnRlbnRDYXRlZ29yeVBhY2thZ2VfQ29udGVudENhdGVnb3J5KCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpY29udGVudENhdGVnb3J5UGFja2FnZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0Q29udGVudERlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gY29udGVudERlc2NyaXB0aW9uRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldENvbnRlbnREZXNjcmlwdGlvbl9NYWluRGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSljb250ZW50RGVzY3JpcHRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRDb250ZW50RGVzY3JpcHRpb25fS2V5Q29uc2lkZXJhdGlvbnMoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSljb250ZW50RGVzY3JpcHRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRDb250ZW50RGVzY3JpcHRpb25fU2VjdGlvbigpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWNvbnRlbnREZXNjcmlwdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldENvbnRlbnREZXNjcmlwdGlvbl9FeHRlcm5hbElkKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpY29udGVudERlc2NyaXB0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRDb250ZW50RWxlbWVudCgpIHsKLQkJcmV0dXJuIGNvbnRlbnRFbGVtZW50RUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldENvbnRlbnRFbGVtZW50X0dyb3VwMSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWNvbnRlbnRFbGVtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0Q29udGVudEVsZW1lbnRfQ2hlY2tsaXN0KCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpY29udGVudEVsZW1lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRDb250ZW50RWxlbWVudF9Db25jZXB0KCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpY29udGVudEVsZW1lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRDb250ZW50RWxlbWVudF9FeGFtcGxlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpY29udGVudEVsZW1lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRDb250ZW50RWxlbWVudF9HdWlkZWxpbmUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSljb250ZW50RWxlbWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldENvbnRlbnRFbGVtZW50X1JldXNhYmxlQXNzZXQoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSljb250ZW50RWxlbWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldENvbnRlbnRFbGVtZW50X1N1cHBvcnRpbmdNYXRlcmlhbCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWNvbnRlbnRFbGVtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0Q29udGVudEVsZW1lbnRfV2hpdGVwYXBlcigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWNvbnRlbnRFbGVtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0Q29udGVudEVsZW1lbnRfVmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWNvbnRlbnRFbGVtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoOCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0Q29udGVudEVsZW1lbnRfVmFyaWFiaWxpdHlUeXBlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpY29udGVudEVsZW1lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg5KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldENvbnRlbnRQYWNrYWdlKCkgewotCQlyZXR1cm4gY29udGVudFBhY2thZ2VFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0Q29udGVudFBhY2thZ2VfR3JvdXAyKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpY29udGVudFBhY2thZ2VFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRDb250ZW50UGFja2FnZV9Db250ZW50RWxlbWVudCgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWNvbnRlbnRQYWNrYWdlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRDdXN0b21DYXRlZ29yeSgpIHsKLQkJcmV0dXJuIGN1c3RvbUNhdGVnb3J5RUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEN1c3RvbUNhdGVnb3J5X0dyb3VwMigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWN1c3RvbUNhdGVnb3J5RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0Q3VzdG9tQ2F0ZWdvcnlfQ2F0ZWdvcml6ZWRFbGVtZW50KCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpY3VzdG9tQ2F0ZWdvcnlFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRDdXN0b21DYXRlZ29yeV9TdWJDYXRlZ29yeSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWN1c3RvbUNhdGVnb3J5RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXREZWxpdmVyYWJsZSgpIHsKLQkJcmV0dXJuIGRlbGl2ZXJhYmxlRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldERlbGl2ZXJhYmxlX0dyb3VwMygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWRlbGl2ZXJhYmxlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RGVsaXZlcmFibGVfRGVsaXZlcmVkV29ya1Byb2R1Y3QoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlkZWxpdmVyYWJsZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0RGVsaXZlcmFibGVEZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIGRlbGl2ZXJhYmxlRGVzY3JpcHRpb25FQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RGVsaXZlcmFibGVEZXNjcmlwdGlvbl9FeHRlcm5hbERlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZGVsaXZlcmFibGVEZXNjcmlwdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldERlbGl2ZXJhYmxlRGVzY3JpcHRpb25fUGFja2FnaW5nR3VpZGFuY2UoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlkZWxpdmVyYWJsZURlc2NyaXB0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXREZWxpdmVyeVByb2Nlc3MoKSB7Ci0JCXJldHVybiBkZWxpdmVyeVByb2Nlc3NFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RGVsaXZlcnlQcm9jZXNzX0dyb3VwNCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWRlbGl2ZXJ5UHJvY2Vzc0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldERlbGl2ZXJ5UHJvY2Vzc19Db21tdW5pY2F0aW9uc01hdGVyaWFsKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZGVsaXZlcnlQcm9jZXNzRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RGVsaXZlcnlQcm9jZXNzX0VkdWNhdGlvbk1hdGVyaWFsKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZGVsaXZlcnlQcm9jZXNzRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXREZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIGRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX1NjYWxlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXREZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl9Qcm9qZWN0Q2hhcmFjdGVyaXN0aWNzKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXREZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl9SaXNrTGV2ZWwoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlkZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX0VzdGltYXRpbmdUZWNobmlxdWUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlkZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX1Byb2plY3RNZW1iZXJFeHBlcnRpc2UoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlkZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX1R5cGVPZkNvbnRyYWN0KCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldERlc2NyaWJhYmxlRWxlbWVudCgpIHsKLQkJcmV0dXJuIGRlc2NyaWJhYmxlRWxlbWVudEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXREZXNjcmliYWJsZUVsZW1lbnRfUHJlc2VudGF0aW9uKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpZGVzY3JpYmFibGVFbGVtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RGVzY3JpYmFibGVFbGVtZW50X0Z1bGZpbGwoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlkZXNjcmliYWJsZUVsZW1lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXREZXNjcmliYWJsZUVsZW1lbnRfSXNBYnN0cmFjdCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWRlc2NyaWJhYmxlRWxlbWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldERlc2NyaWJhYmxlRWxlbWVudF9Ob2RlaWNvbigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWRlc2NyaWJhYmxlRWxlbWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldERlc2NyaWJhYmxlRWxlbWVudF9TaGFwZWljb24oKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlkZXNjcmliYWJsZUVsZW1lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldERlc2NyaXB0b3IoKSB7Ci0JCXJldHVybiBkZXNjcmlwdG9yRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldERlc2NyaXB0b3JfSXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZGVzY3JpcHRvckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0RGVzY3JpcHRvckRlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gZGVzY3JpcHRvckRlc2NyaXB0aW9uRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldERlc2NyaXB0b3JEZXNjcmlwdGlvbl9SZWZpbmVkRGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlkZXNjcmlwdG9yRGVzY3JpcHRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldERpc2NpcGxpbmUoKSB7Ci0JCXJldHVybiBkaXNjaXBsaW5lRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldERpc2NpcGxpbmVfR3JvdXAyKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZGlzY2lwbGluZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldERpc2NpcGxpbmVfVGFzaygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWRpc2NpcGxpbmVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXREaXNjaXBsaW5lX1N1YkRpc2NpcGxpbmUoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlkaXNjaXBsaW5lRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RGlzY2lwbGluZV9SZWZlcmVuY2VXb3JrZmxvdygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWRpc2NpcGxpbmVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldERpc2NpcGxpbmVHcm91cGluZygpIHsKLQkJcmV0dXJuIGRpc2NpcGxpbmVHcm91cGluZ0VDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXREaXNjaXBsaW5lR3JvdXBpbmdfR3JvdXAyKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZGlzY2lwbGluZUdyb3VwaW5nRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RGlzY2lwbGluZUdyb3VwaW5nX0Rpc2NpcGxpbmUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlkaXNjaXBsaW5lR3JvdXBpbmdFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldERvY3VtZW50Um9vdCgpIHsKLQkJcmV0dXJuIGRvY3VtZW50Um9vdEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXREb2N1bWVudFJvb3RfTWl4ZWQoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlkb2N1bWVudFJvb3RFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXREb2N1bWVudFJvb3RfWE1MTlNQcmVmaXhNYXAoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlkb2N1bWVudFJvb3RFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXREb2N1bWVudFJvb3RfWFNJU2NoZW1hTG9jYXRpb24oKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlkb2N1bWVudFJvb3RFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXREb2N1bWVudFJvb3RfTWV0aG9kQ29uZmlndXJhdGlvbigpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWRvY3VtZW50Um9vdEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldERvY3VtZW50Um9vdF9NZXRob2RMaWJyYXJ5KCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpZG9jdW1lbnRSb290RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0RG9jdW1lbnRSb290X01ldGhvZFBsdWdpbigpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWRvY3VtZW50Um9vdEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0RG9tYWluKCkgewotCQlyZXR1cm4gZG9tYWluRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldERvbWFpbl9Hcm91cDIoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlkb21haW5FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXREb21haW5fV29ya1Byb2R1Y3QoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlkb21haW5FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXREb21haW5fU3ViZG9tYWluKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpZG9tYWluRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRFbGVtZW50KCkgewotCQlyZXR1cm4gZWxlbWVudEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldEVzdGltYXRlKCkgewotCQlyZXR1cm4gZXN0aW1hdGVFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RXN0aW1hdGVfR3JvdXAyKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZXN0aW1hdGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRFc3RpbWF0ZV9Fc3RpbWF0aW9uTWV0cmljKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZXN0aW1hdGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRFc3RpbWF0ZV9Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSllc3RpbWF0ZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0RXN0aW1hdGluZ01ldHJpYygpIHsKLQkJcmV0dXJuIGVzdGltYXRpbmdNZXRyaWNFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMoKSB7Ci0JCXJldHVybiBlc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnNFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRFeGFtcGxlKCkgewotCQlyZXR1cm4gZXhhbXBsZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldEd1aWRhbmNlKCkgewotCQlyZXR1cm4gZ3VpZGFuY2VFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRHdWlkYW5jZURlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gZ3VpZGFuY2VEZXNjcmlwdGlvbkVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRHdWlkYW5jZURlc2NyaXB0aW9uX0F0dGFjaG1lbnQoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlndWlkYW5jZURlc2NyaXB0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRHdWlkZWxpbmUoKSB7Ci0JCXJldHVybiBndWlkZWxpbmVFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRJdGVyYXRpb24oKSB7Ci0JCXJldHVybiBpdGVyYXRpb25FQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRLaW5kKCkgewotCQlyZXR1cm4ga2luZEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRLaW5kX0FwcGxpY2FibGVNZXRhQ2xhc3NJbmZvKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpa2luZEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0TWV0aG9kQ29uZmlndXJhdGlvbigpIHsKLQkJcmV0dXJuIG1ldGhvZENvbmZpZ3VyYXRpb25FQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0TWV0aG9kQ29uZmlndXJhdGlvbl9CYXNlQ29uZmlndXJhdGlvbigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKW1ldGhvZENvbmZpZ3VyYXRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRNZXRob2RDb25maWd1cmF0aW9uX01ldGhvZFBsdWdpblNlbGVjdGlvbigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKW1ldGhvZENvbmZpZ3VyYXRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRNZXRob2RDb25maWd1cmF0aW9uX01ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSltZXRob2RDb25maWd1cmF0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0TWV0aG9kQ29uZmlndXJhdGlvbl9EZWZhdWx0VmlldygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKW1ldGhvZENvbmZpZ3VyYXRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRNZXRob2RDb25maWd1cmF0aW9uX1Byb2Nlc3NWaWV3KCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpbWV0aG9kQ29uZmlndXJhdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldE1ldGhvZENvbmZpZ3VyYXRpb25fU3VidHJhY3RlZENhdGVnb3J5KCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpbWV0aG9kQ29uZmlndXJhdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldE1ldGhvZENvbmZpZ3VyYXRpb25fQWRkZWRDYXRlZ29yeSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKW1ldGhvZENvbmZpZ3VyYXRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg2KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldE1ldGhvZEVsZW1lbnQoKSB7Ci0JCXJldHVybiBtZXRob2RFbGVtZW50RUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldE1ldGhvZEVsZW1lbnRfR3JvdXAoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSltZXRob2RFbGVtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0TWV0aG9kRWxlbWVudF9Pd25lZFJ1bGUoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSltZXRob2RFbGVtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0TWV0aG9kRWxlbWVudF9NZXRob2RFbGVtZW50UHJvcGVydHkoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSltZXRob2RFbGVtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0TWV0aG9kRWxlbWVudF9CcmllZkRlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpbWV0aG9kRWxlbWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldE1ldGhvZEVsZW1lbnRfSWQoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSltZXRob2RFbGVtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0TWV0aG9kRWxlbWVudF9PcmRlcmluZ0d1aWRlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpbWV0aG9kRWxlbWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldE1ldGhvZEVsZW1lbnRfUHJlc2VudGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKW1ldGhvZEVsZW1lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg2KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRNZXRob2RFbGVtZW50X1N1cHByZXNzZWQoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSltZXRob2RFbGVtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRNZXRob2RFbGVtZW50UHJvcGVydHkoKSB7Ci0JCXJldHVybiBtZXRob2RFbGVtZW50UHJvcGVydHlFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0TWV0aG9kRWxlbWVudFByb3BlcnR5X1ZhbHVlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpbWV0aG9kRWxlbWVudFByb3BlcnR5RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRNZXRob2RMaWJyYXJ5KCkgewotCQlyZXR1cm4gbWV0aG9kTGlicmFyeUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRNZXRob2RMaWJyYXJ5X01ldGhvZFBsdWdpbigpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKW1ldGhvZExpYnJhcnlFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRNZXRob2RMaWJyYXJ5X01ldGhvZENvbmZpZ3VyYXRpb24oKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSltZXRob2RMaWJyYXJ5RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0TWV0aG9kTGlicmFyeV9Ub29sKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpbWV0aG9kTGlicmFyeUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0TWV0aG9kUGFja2FnZSgpIHsKLQkJcmV0dXJuIG1ldGhvZFBhY2thZ2VFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0TWV0aG9kUGFja2FnZV9Hcm91cDEoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSltZXRob2RQYWNrYWdlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0TWV0aG9kUGFja2FnZV9SZXVzZWRQYWNrYWdlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpbWV0aG9kUGFja2FnZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldE1ldGhvZFBhY2thZ2VfTWV0aG9kUGFja2FnZSgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKW1ldGhvZFBhY2thZ2VFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRNZXRob2RQYWNrYWdlX0dsb2JhbCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKW1ldGhvZFBhY2thZ2VFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldE1ldGhvZFBsdWdpbigpIHsKLQkJcmV0dXJuIG1ldGhvZFBsdWdpbkVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRNZXRob2RQbHVnaW5fUmVmZXJlbmNlZE1ldGhvZFBsdWdpbigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKW1ldGhvZFBsdWdpbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldE1ldGhvZFBsdWdpbl9NZXRob2RQYWNrYWdlKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpbWV0aG9kUGx1Z2luRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0TWV0aG9kUGx1Z2luX1VzZXJDaGFuZ2VhYmxlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpbWV0aG9kUGx1Z2luRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRNZXRob2RVbml0KCkgewotCQlyZXR1cm4gbWV0aG9kVW5pdEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRNZXRob2RVbml0X0NvcHlyaWdodCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKW1ldGhvZFVuaXRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRNZXRob2RVbml0X0F1dGhvcnMoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSltZXRob2RVbml0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0TWV0aG9kVW5pdF9DaGFuZ2VEYXRlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpbWV0aG9kVW5pdEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldE1ldGhvZFVuaXRfQ2hhbmdlRGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSltZXRob2RVbml0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0TWV0aG9kVW5pdF9WZXJzaW9uKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpbWV0aG9kVW5pdEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0TWlsZXN0b25lKCkgewotCQlyZXR1cm4gbWlsZXN0b25lRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldE1pbGVzdG9uZV9SZXF1aXJlZFJlc3VsdCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKW1pbGVzdG9uZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0TmFtZWRFbGVtZW50KCkgewotCQlyZXR1cm4gbmFtZWRFbGVtZW50RUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldE5hbWVkRWxlbWVudF9OYW1lKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpbmFtZWRFbGVtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRPdXRjb21lKCkgewotCQlyZXR1cm4gb3V0Y29tZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFBhY2thZ2VhYmxlRWxlbWVudCgpIHsKLQkJcmV0dXJuIHBhY2thZ2VhYmxlRWxlbWVudEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFBoYXNlKCkgewotCQlyZXR1cm4gcGhhc2VFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRQbGFubmluZ0RhdGEoKSB7Ci0JCXJldHVybiBwbGFubmluZ0RhdGFFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UGxhbm5pbmdEYXRhX0ZpbmlzaERhdGUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlwbGFubmluZ0RhdGFFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQbGFubmluZ0RhdGFfUmFuaygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXBsYW5uaW5nRGF0YUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFBsYW5uaW5nRGF0YV9TdGFydERhdGUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlwbGFubmluZ0RhdGFFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFByYWN0aWNlKCkgewotCQlyZXR1cm4gcHJhY3RpY2VFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJhY3RpY2VfR3JvdXAyKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcHJhY3RpY2VFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQcmFjdGljZV9BY3Rpdml0eVJlZmVyZW5jZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXByYWN0aWNlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJhY3RpY2VfQ29udGVudFJlZmVyZW5jZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXByYWN0aWNlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0UHJhY3RpY2VfU3ViUHJhY3RpY2UoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlwcmFjdGljZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0UHJhY3RpY2VEZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIHByYWN0aWNlRGVzY3JpcHRpb25FQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJhY3RpY2VEZXNjcmlwdGlvbl9BZGRpdGlvbmFsSW5mbygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXByYWN0aWNlRGVzY3JpcHRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQcmFjdGljZURlc2NyaXB0aW9uX0FwcGxpY2F0aW9uKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcHJhY3RpY2VEZXNjcmlwdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByYWN0aWNlRGVzY3JpcHRpb25fQmFja2dyb3VuZCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXByYWN0aWNlRGVzY3JpcHRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQcmFjdGljZURlc2NyaXB0aW9uX0dvYWxzKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcHJhY3RpY2VEZXNjcmlwdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByYWN0aWNlRGVzY3JpcHRpb25fTGV2ZWxzT2ZBZG9wdGlvbigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXByYWN0aWNlRGVzY3JpcHRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQcmFjdGljZURlc2NyaXB0aW9uX1Byb2JsZW0oKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlwcmFjdGljZURlc2NyaXB0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRQcm9jZXNzKCkgewotCQlyZXR1cm4gcHJvY2Vzc0VDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQcm9jZXNzX0luY2x1ZGVzUGF0dGVybigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXByb2Nlc3NFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQcm9jZXNzX0RlZmF1bHRDb250ZXh0KCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcHJvY2Vzc0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByb2Nlc3NfVmFsaWRDb250ZXh0KCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcHJvY2Vzc0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByb2Nlc3NfRGlhZ3JhbVVSSSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXByb2Nlc3NFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFByb2Nlc3NDb21wb25lbnQoKSB7Ci0JCXJldHVybiBwcm9jZXNzQ29tcG9uZW50RUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByb2Nlc3NDb21wb25lbnRfQ29weXJpZ2h0KCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcHJvY2Vzc0NvbXBvbmVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFByb2Nlc3NDb21wb25lbnRfSW50ZXJmYWNlKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpcHJvY2Vzc0NvbXBvbmVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFByb2Nlc3NDb21wb25lbnRfUHJvY2VzcygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXByb2Nlc3NDb21wb25lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQcm9jZXNzQ29tcG9uZW50X0F1dGhvcnMoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlwcm9jZXNzQ29tcG9uZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJvY2Vzc0NvbXBvbmVudF9DaGFuZ2VEYXRlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcHJvY2Vzc0NvbXBvbmVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByb2Nlc3NDb21wb25lbnRfQ2hhbmdlRGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlwcm9jZXNzQ29tcG9uZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJvY2Vzc0NvbXBvbmVudF9WZXJzaW9uKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcHJvY2Vzc0NvbXBvbmVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDYpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0UHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSgpIHsKLQkJcmV0dXJuIHByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZV9Hcm91cDIoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlwcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0UHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZV9JbnRlcmZhY2VTcGVjaWZpY2F0aW9uKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpcHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VfSW50ZXJmYWNlSU8oKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlwcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRQcm9jZXNzRGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBwcm9jZXNzRGVzY3JpcHRpb25FQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJvY2Vzc0Rlc2NyaXB0aW9uX1Njb3BlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcHJvY2Vzc0Rlc2NyaXB0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJvY2Vzc0Rlc2NyaXB0aW9uX1VzYWdlTm90ZXMoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlwcm9jZXNzRGVzY3JpcHRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFByb2Nlc3NFbGVtZW50KCkgewotCQlyZXR1cm4gcHJvY2Vzc0VsZW1lbnRFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRQcm9jZXNzUGFja2FnZSgpIHsKLQkJcmV0dXJuIHByb2Nlc3NQYWNrYWdlRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByb2Nlc3NQYWNrYWdlX0dyb3VwMigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXByb2Nlc3NQYWNrYWdlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0UHJvY2Vzc1BhY2thZ2VfUHJvY2Vzc0VsZW1lbnQoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlwcm9jZXNzUGFja2FnZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0UHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUoKSB7Ci0JCXJldHVybiBwcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZV9Hcm91cDQoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlwcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByb2Nlc3NQbGFubmluZ1RlbXBsYXRlX0Jhc2VQcm9jZXNzKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFJlcG9ydCgpIHsKLQkJcmV0dXJuIHJlcG9ydEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFJldXNhYmxlQXNzZXQoKSB7Ci0JCXJldHVybiByZXVzYWJsZUFzc2V0RUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0Um9hZG1hcCgpIHsKLQkJcmV0dXJuIHJvYWRtYXBFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRSb2xlKCkgewotCQlyZXR1cm4gcm9sZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRSb2xlX0dyb3VwMigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXJvbGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRSb2xlX1Jlc3BvbnNpYmxlRm9yKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcm9sZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0Um9sZURlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gcm9sZURlc2NyaXB0aW9uRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFJvbGVEZXNjcmlwdGlvbl9Bc3NpZ25tZW50QXBwcm9hY2hlcygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXJvbGVEZXNjcmlwdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFJvbGVEZXNjcmlwdGlvbl9Ta2lsbHMoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlyb2xlRGVzY3JpcHRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRSb2xlRGVzY3JpcHRpb25fU3lub255bXMoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlyb2xlRGVzY3JpcHRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFJvbGVEZXNjcmlwdG9yKCkgewotCQlyZXR1cm4gcm9sZURlc2NyaXB0b3JFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0Um9sZURlc2NyaXB0b3JfUm9sZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXJvbGVEZXNjcmlwdG9yRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0Um9sZURlc2NyaXB0b3JfUmVzcG9uc2libGVGb3IoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlyb2xlRGVzY3JpcHRvckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0Um9sZVNldCgpIHsKLQkJcmV0dXJuIHJvbGVTZXRFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0Um9sZVNldF9Hcm91cDIoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlyb2xlU2V0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0Um9sZVNldF9Sb2xlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcm9sZVNldEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0Um9sZVNldEdyb3VwaW5nKCkgewotCQlyZXR1cm4gcm9sZVNldEdyb3VwaW5nRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFJvbGVTZXRHcm91cGluZ19Hcm91cDIoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlyb2xlU2V0R3JvdXBpbmdFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRSb2xlU2V0R3JvdXBpbmdfUm9sZVNldCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXJvbGVTZXRHcm91cGluZ0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0U2VjdGlvbigpIHsKLQkJcmV0dXJuIHNlY3Rpb25FQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0U2VjdGlvbl9TdWJTZWN0aW9uKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2Upc2VjdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFNlY3Rpb25fUHJlZGVjZXNzb3IoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlzZWN0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0U2VjdGlvbl9EZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXNlY3Rpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRTZWN0aW9uX1NlY3Rpb25OYW1lKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpc2VjdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFNlY3Rpb25fVmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXNlY3Rpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRTZWN0aW9uX1ZhcmlhYmlsaXR5VHlwZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXNlY3Rpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFN1cHBvcnRpbmdNYXRlcmlhbCgpIHsKLQkJcmV0dXJuIHN1cHBvcnRpbmdNYXRlcmlhbEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFRhc2soKSB7Ci0JCXJldHVybiB0YXNrRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhc2tfUHJlY29uZGl0aW9uKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpdGFza0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhc2tfUG9zdGNvbmRpdGlvbigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXRhc2tFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrX1BlcmZvcm1lZEJ5KCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpdGFza0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhc2tfR3JvdXAyKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpdGFza0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhc2tfTWFuZGF0b3J5SW5wdXQoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl0YXNrRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFza19PdXRwdXQoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl0YXNrRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFza19BZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXRhc2tFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg2KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrX09wdGlvbmFsSW5wdXQoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl0YXNrRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFza19Fc3RpbWF0ZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXRhc2tFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg4KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrX0VzdGltYXRpb25Db25zaWRlcmF0aW9ucygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXRhc2tFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg5KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrX1Rvb2xNZW50b3IoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl0YXNrRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0VGFza0Rlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gdGFza0Rlc2NyaXB0aW9uRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhc2tEZXNjcmlwdGlvbl9BbHRlcm5hdGl2ZXMoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl0YXNrRGVzY3JpcHRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrRGVzY3JpcHRpb25fUHVycG9zZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXRhc2tEZXNjcmlwdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0VGFza0Rlc2NyaXB0b3IoKSB7Ci0JCXJldHVybiB0YXNrRGVzY3JpcHRvckVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrRGVzY3JpcHRvcl9UYXNrKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpdGFza0Rlc2NyaXB0b3JFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrRGVzY3JpcHRvcl9QZXJmb3JtZWRQcmltYXJpbHlCeSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXRhc2tEZXNjcmlwdG9yRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFza0Rlc2NyaXB0b3JfR3JvdXAzKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpdGFza0Rlc2NyaXB0b3JFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrRGVzY3JpcHRvcl9BZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXRhc2tEZXNjcmlwdG9yRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFza0Rlc2NyaXB0b3JfQXNzaXN0ZWRCeSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXRhc2tEZXNjcmlwdG9yRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFza0Rlc2NyaXB0b3JfRXh0ZXJuYWxJbnB1dCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXRhc2tEZXNjcmlwdG9yRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFza0Rlc2NyaXB0b3JfTWFuZGF0b3J5SW5wdXQoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl0YXNrRGVzY3JpcHRvckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDYpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhc2tEZXNjcmlwdG9yX09wdGlvbmFsSW5wdXQoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl0YXNrRGVzY3JpcHRvckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDcpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhc2tEZXNjcmlwdG9yX091dHB1dCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXRhc2tEZXNjcmlwdG9yRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoOCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0VGFza0Rlc2NyaXB0b3JfU3RlcCgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXRhc2tEZXNjcmlwdG9yRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoOSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFza0Rlc2NyaXB0b3JfSXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpdGFza0Rlc2NyaXB0b3JFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRUZWFtUHJvZmlsZSgpIHsKLQkJcmV0dXJuIHRlYW1Qcm9maWxlRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRlYW1Qcm9maWxlX0dyb3VwMigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXRlYW1Qcm9maWxlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGVhbVByb2ZpbGVfUm9sZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXRlYW1Qcm9maWxlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGVhbVByb2ZpbGVfU3VwZXJUZWFtKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpdGVhbVByb2ZpbGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUZWFtUHJvZmlsZV9TdWJUZWFtKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpdGVhbVByb2ZpbGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFRlbXBsYXRlKCkgewotCQlyZXR1cm4gdGVtcGxhdGVFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRUZXJtRGVmaW5pdGlvbigpIHsKLQkJcmV0dXJuIHRlcm1EZWZpbml0aW9uRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0VG9vbCgpIHsKLQkJcmV0dXJuIHRvb2xFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VG9vbF9Hcm91cDIoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl0b29sRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VG9vbF9Ub29sTWVudG9yKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpdG9vbEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0VG9vbE1lbnRvcigpIHsKLQkJcmV0dXJuIHRvb2xNZW50b3JFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRXaGl0ZXBhcGVyKCkgewotCQlyZXR1cm4gd2hpdGVwYXBlckVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFdvcmtCcmVha2Rvd25FbGVtZW50KCkgewotCQlyZXR1cm4gd29ya0JyZWFrZG93bkVsZW1lbnRFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0V29ya0JyZWFrZG93bkVsZW1lbnRfR3JvdXAyKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpd29ya0JyZWFrZG93bkVsZW1lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRXb3JrQnJlYWtkb3duRWxlbWVudF9QcmVkZWNlc3NvcigpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXdvcmtCcmVha2Rvd25FbGVtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0V29ya0JyZWFrZG93bkVsZW1lbnRfSXNFdmVudERyaXZlbigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXdvcmtCcmVha2Rvd25FbGVtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0V29ya0JyZWFrZG93bkVsZW1lbnRfSXNPbmdvaW5nKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpd29ya0JyZWFrZG93bkVsZW1lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRXb3JrQnJlYWtkb3duRWxlbWVudF9Jc1JlcGVhdGFibGUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl3b3JrQnJlYWtkb3duRWxlbWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0V29ya0RlZmluaXRpb24oKSB7Ci0JCXJldHVybiB3b3JrRGVmaW5pdGlvbkVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRXb3JrRGVmaW5pdGlvbl9QcmVjb25kaXRpb24oKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl3b3JrRGVmaW5pdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFdvcmtEZWZpbml0aW9uX1Bvc3Rjb25kaXRpb24oKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl3b3JrRGVmaW5pdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0V29ya09yZGVyKCkgewotCQlyZXR1cm4gd29ya09yZGVyRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFdvcmtPcmRlcl9WYWx1ZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXdvcmtPcmRlckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFdvcmtPcmRlcl9JZCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXdvcmtPcmRlckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFdvcmtPcmRlcl9MaW5rVHlwZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXdvcmtPcmRlckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0V29ya1Byb2R1Y3QoKSB7Ci0JCXJldHVybiB3b3JrUHJvZHVjdEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRXb3JrUHJvZHVjdF9Hcm91cDIoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl3b3JrUHJvZHVjdEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFdvcmtQcm9kdWN0X0VzdGltYXRlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpd29ya1Byb2R1Y3RFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRXb3JrUHJvZHVjdF9Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl3b3JrUHJvZHVjdEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFdvcmtQcm9kdWN0X1JlcG9ydCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXdvcmtQcm9kdWN0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0V29ya1Byb2R1Y3RfVGVtcGxhdGUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl3b3JrUHJvZHVjdEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFdvcmtQcm9kdWN0X1Rvb2xNZW50b3IoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl3b3JrUHJvZHVjdEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0V29ya1Byb2R1Y3REZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIHdvcmtQcm9kdWN0RGVzY3JpcHRpb25FQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0V29ya1Byb2R1Y3REZXNjcmlwdGlvbl9JbXBhY3RPZk5vdEhhdmluZygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXdvcmtQcm9kdWN0RGVzY3JpcHRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRXb3JrUHJvZHVjdERlc2NyaXB0aW9uX1B1cnBvc2UoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl3b3JrUHJvZHVjdERlc2NyaXB0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0V29ya1Byb2R1Y3REZXNjcmlwdGlvbl9SZWFzb25zRm9yTm90TmVlZGluZygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXdvcmtQcm9kdWN0RGVzY3JpcHRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcigpIHsKLQkJcmV0dXJuIHdvcmtQcm9kdWN0RGVzY3JpcHRvckVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JfV29ya1Byb2R1Y3QoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl3b3JrUHJvZHVjdERlc2NyaXB0b3JFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JfUmVzcG9uc2libGVSb2xlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpd29ya1Byb2R1Y3REZXNjcmlwdG9yRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX0dyb3VwMigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXdvcmtQcm9kdWN0RGVzY3JpcHRvckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9FeHRlcm5hbElucHV0VG8oKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl3b3JrUHJvZHVjdERlc2NyaXB0b3JFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JfSW1wYWN0ZWRCeSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXdvcmtQcm9kdWN0RGVzY3JpcHRvckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9JbXBhY3RzKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpd29ya1Byb2R1Y3REZXNjcmlwdG9yRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX01hbmRhdG9yeUlucHV0VG8oKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl3b3JrUHJvZHVjdERlc2NyaXB0b3JFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg2KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JfT3B0aW9uYWxJbnB1dFRvKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpd29ya1Byb2R1Y3REZXNjcmlwdG9yRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX091dHB1dEZyb20oKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl3b3JrUHJvZHVjdERlc2NyaXB0b3JFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg4KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JfRGVsaXZlcmFibGVQYXJ0cygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXdvcmtQcm9kdWN0RGVzY3JpcHRvckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9BY3Rpdml0eUVudHJ5U3RhdGUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl3b3JrUHJvZHVjdERlc2NyaXB0b3JFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX0FjdGl2aXR5RXhpdFN0YXRlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpd29ya1Byb2R1Y3REZXNjcmlwdG9yRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0V29ya1Byb2R1Y3RUeXBlKCkgewotCQlyZXR1cm4gd29ya1Byb2R1Y3RUeXBlRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFdvcmtQcm9kdWN0VHlwZV9Hcm91cDIoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl3b3JrUHJvZHVjdFR5cGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRXb3JrUHJvZHVjdFR5cGVfV29ya1Byb2R1Y3QoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl3b3JrUHJvZHVjdFR5cGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUVudW0gZ2V0VmFyaWFiaWxpdHlUeXBlKCkgewotCQlyZXR1cm4gdmFyaWFiaWxpdHlUeXBlRUVudW07Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVFbnVtIGdldFdvcmtPcmRlclR5cGUoKSB7Ci0JCXJldHVybiB3b3JrT3JkZXJUeXBlRUVudW07Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXRWYXJpYWJpbGl0eVR5cGVPYmplY3QoKSB7Ci0JCXJldHVybiB2YXJpYWJpbGl0eVR5cGVPYmplY3RFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXRXb3JrT3JkZXJUeXBlT2JqZWN0KCkgewotCQlyZXR1cm4gd29ya09yZGVyVHlwZU9iamVjdEVEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVW1hRmFjdG9yeSBnZXRVbWFGYWN0b3J5KCkgewotCQlyZXR1cm4gKFVtYUZhY3RvcnkpZ2V0RUZhY3RvcnlJbnN0YW5jZSgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc0NyZWF0ZWQgPSBmYWxzZTsKLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIG1ldGEtbW9kZWwgb2JqZWN0cyBmb3IgdGhlIHBhY2thZ2UuICBUaGlzIG1ldGhvZCBpcwotCSAqIGd1YXJkZWQgdG8gaGF2ZSBubyBhZmZlY3Qgb24gYW55IGludm9jYXRpb24gYnV0IGl0cyBmaXJzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVQYWNrYWdlQ29udGVudHMoKSB7Ci0JCWlmIChpc0NyZWF0ZWQpIHJldHVybjsKLQkJaXNDcmVhdGVkID0gdHJ1ZTsKLQotCQkvLyBDcmVhdGUgY2xhc3NlcyBhbmQgdGhlaXIgZmVhdHVyZXMKLQkJYWN0aXZpdHlFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoQUNUSVZJVFkpOwotCQljcmVhdGVFQXR0cmlidXRlKGFjdGl2aXR5RUNsYXNzLCBBQ1RJVklUWV9fUFJFQ09ORElUSU9OKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShhY3Rpdml0eUVDbGFzcywgQUNUSVZJVFlfX1BPU1RDT05ESVRJT04pOwotCQljcmVhdGVFQXR0cmlidXRlKGFjdGl2aXR5RUNsYXNzLCBBQ1RJVklUWV9fR1JPVVAzKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShhY3Rpdml0eUVDbGFzcywgQUNUSVZJVFlfX0JSRUFLRE9XTl9FTEVNRU5UKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShhY3Rpdml0eUVDbGFzcywgQUNUSVZJVFlfX1JPQURNQVApOwotCQljcmVhdGVFQXR0cmlidXRlKGFjdGl2aXR5RUNsYXNzLCBBQ1RJVklUWV9fSVNfRU5BQ1RBQkxFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShhY3Rpdml0eUVDbGFzcywgQUNUSVZJVFlfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQpOwotCQljcmVhdGVFQXR0cmlidXRlKGFjdGl2aXR5RUNsYXNzLCBBQ1RJVklUWV9fVkFSSUFCSUxJVFlfVFlQRSk7Ci0KLQkJYWN0aXZpdHlEZXNjcmlwdGlvbkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhBQ1RJVklUWV9ERVNDUklQVElPTik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoYWN0aXZpdHlEZXNjcmlwdGlvbkVDbGFzcywgQUNUSVZJVFlfREVTQ1JJUFRJT05fX0FMVEVSTkFUSVZFUyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoYWN0aXZpdHlEZXNjcmlwdGlvbkVDbGFzcywgQUNUSVZJVFlfREVTQ1JJUFRJT05fX0hPV19UT19TVEFGRik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoYWN0aXZpdHlEZXNjcmlwdGlvbkVDbGFzcywgQUNUSVZJVFlfREVTQ1JJUFRJT05fX1BVUlBPU0UpOwotCi0JCWFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvRUNsYXNzID0gY3JlYXRlRUNsYXNzKEFQUExJQ0FCTEVfTUVUQV9DTEFTU19JTkZPKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShhcHBsaWNhYmxlTWV0YUNsYXNzSW5mb0VDbGFzcywgQVBQTElDQUJMRV9NRVRBX0NMQVNTX0lORk9fX0lTX1BSSU1BUllfRVhURU5TSU9OKTsKLQotCQlhcnRpZmFjdEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhBUlRJRkFDVCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoYXJ0aWZhY3RFQ2xhc3MsIEFSVElGQUNUX19HUk9VUDMpOwotCQljcmVhdGVFUmVmZXJlbmNlKGFydGlmYWN0RUNsYXNzLCBBUlRJRkFDVF9fQ09OVEFJTkVEX0FSVElGQUNUKTsKLQotCQlhcnRpZmFjdERlc2NyaXB0aW9uRUNsYXNzID0gY3JlYXRlRUNsYXNzKEFSVElGQUNUX0RFU0NSSVBUSU9OKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShhcnRpZmFjdERlc2NyaXB0aW9uRUNsYXNzLCBBUlRJRkFDVF9ERVNDUklQVElPTl9fQlJJRUZfT1VUTElORSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoYXJ0aWZhY3REZXNjcmlwdGlvbkVDbGFzcywgQVJUSUZBQ1RfREVTQ1JJUFRJT05fX1JFUFJFU0VOVEFUSU9OX09QVElPTlMpOwotCQljcmVhdGVFQXR0cmlidXRlKGFydGlmYWN0RGVzY3JpcHRpb25FQ2xhc3MsIEFSVElGQUNUX0RFU0NSSVBUSU9OX19SRVBSRVNFTlRBVElPTik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoYXJ0aWZhY3REZXNjcmlwdGlvbkVDbGFzcywgQVJUSUZBQ1RfREVTQ1JJUFRJT05fX05PVEFUSU9OKTsKLQotCQlicmVha2Rvd25FbGVtZW50RUNsYXNzID0gY3JlYXRlRUNsYXNzKEJSRUFLRE9XTl9FTEVNRU5UKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShicmVha2Rvd25FbGVtZW50RUNsYXNzLCBCUkVBS0RPV05fRUxFTUVOVF9fUFJFU0VOVEVEX0FGVEVSKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShicmVha2Rvd25FbGVtZW50RUNsYXNzLCBCUkVBS0RPV05fRUxFTUVOVF9fUFJFU0VOVEVEX0JFRk9SRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoYnJlYWtkb3duRWxlbWVudEVDbGFzcywgQlJFQUtET1dOX0VMRU1FTlRfX1BMQU5OSU5HX0RBVEEpOwotCQljcmVhdGVFQXR0cmlidXRlKGJyZWFrZG93bkVsZW1lbnRFQ2xhc3MsIEJSRUFLRE9XTl9FTEVNRU5UX19TVVBFUl9BQ1RJVklUWSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoYnJlYWtkb3duRWxlbWVudEVDbGFzcywgQlJFQUtET1dOX0VMRU1FTlRfX0dST1VQMSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoYnJlYWtkb3duRWxlbWVudEVDbGFzcywgQlJFQUtET1dOX0VMRU1FTlRfX0NIRUNLTElTVCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoYnJlYWtkb3duRWxlbWVudEVDbGFzcywgQlJFQUtET1dOX0VMRU1FTlRfX0NPTkNFUFQpOwotCQljcmVhdGVFQXR0cmlidXRlKGJyZWFrZG93bkVsZW1lbnRFQ2xhc3MsIEJSRUFLRE9XTl9FTEVNRU5UX19FWEFNUExFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShicmVha2Rvd25FbGVtZW50RUNsYXNzLCBCUkVBS0RPV05fRUxFTUVOVF9fR1VJREVMSU5FKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShicmVha2Rvd25FbGVtZW50RUNsYXNzLCBCUkVBS0RPV05fRUxFTUVOVF9fUkVVU0FCTEVfQVNTRVQpOwotCQljcmVhdGVFQXR0cmlidXRlKGJyZWFrZG93bkVsZW1lbnRFQ2xhc3MsIEJSRUFLRE9XTl9FTEVNRU5UX19TVVBQT1JUSU5HX01BVEVSSUFMKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShicmVha2Rvd25FbGVtZW50RUNsYXNzLCBCUkVBS0RPV05fRUxFTUVOVF9fV0hJVEVQQVBFUik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoYnJlYWtkb3duRWxlbWVudEVDbGFzcywgQlJFQUtET1dOX0VMRU1FTlRfX0hBU19NVUxUSVBMRV9PQ0NVUlJFTkNFUyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoYnJlYWtkb3duRWxlbWVudEVDbGFzcywgQlJFQUtET1dOX0VMRU1FTlRfX0lTX09QVElPTkFMKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShicmVha2Rvd25FbGVtZW50RUNsYXNzLCBCUkVBS0RPV05fRUxFTUVOVF9fSVNfUExBTk5FRCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoYnJlYWtkb3duRWxlbWVudEVDbGFzcywgQlJFQUtET1dOX0VMRU1FTlRfX1BSRUZJWCk7Ci0KLQkJYnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uRUNsYXNzID0gY3JlYXRlRUNsYXNzKEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShicmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb25FQ2xhc3MsIEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19VU0FHRV9HVUlEQU5DRSk7Ci0KLQkJY2FwYWJpbGl0eVBhdHRlcm5FQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoQ0FQQUJJTElUWV9QQVRURVJOKTsKLQotCQljaGVja2xpc3RFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoQ0hFQ0tMSVNUKTsKLQotCQljb21wb3NpdGVSb2xlRUNsYXNzID0gY3JlYXRlRUNsYXNzKENPTVBPU0lURV9ST0xFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShjb21wb3NpdGVSb2xlRUNsYXNzLCBDT01QT1NJVEVfUk9MRV9fR1JPVVAyKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShjb21wb3NpdGVSb2xlRUNsYXNzLCBDT01QT1NJVEVfUk9MRV9fQUdHUkVHQVRFRF9ST0xFKTsKLQotCQljb25jZXB0RUNsYXNzID0gY3JlYXRlRUNsYXNzKENPTkNFUFQpOwotCi0JCWNvbnN0cmFpbnRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoQ09OU1RSQUlOVCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoY29uc3RyYWludEVDbGFzcywgQ09OU1RSQUlOVF9fTUFJTl9ERVNDUklQVElPTik7Ci0KLQkJY29udGVudENhdGVnb3J5RUNsYXNzID0gY3JlYXRlRUNsYXNzKENPTlRFTlRfQ0FURUdPUlkpOwotCi0JCWNvbnRlbnRDYXRlZ29yeVBhY2thZ2VFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoQ09OVEVOVF9DQVRFR09SWV9QQUNLQUdFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShjb250ZW50Q2F0ZWdvcnlQYWNrYWdlRUNsYXNzLCBDT05URU5UX0NBVEVHT1JZX1BBQ0tBR0VfX0dST1VQMik7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoY29udGVudENhdGVnb3J5UGFja2FnZUVDbGFzcywgQ09OVEVOVF9DQVRFR09SWV9QQUNLQUdFX19DT05URU5UX0NBVEVHT1JZKTsKLQotCQljb250ZW50RGVzY3JpcHRpb25FQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoQ09OVEVOVF9ERVNDUklQVElPTik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoY29udGVudERlc2NyaXB0aW9uRUNsYXNzLCBDT05URU5UX0RFU0NSSVBUSU9OX19NQUlOX0RFU0NSSVBUSU9OKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShjb250ZW50RGVzY3JpcHRpb25FQ2xhc3MsIENPTlRFTlRfREVTQ1JJUFRJT05fX0tFWV9DT05TSURFUkFUSU9OUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoY29udGVudERlc2NyaXB0aW9uRUNsYXNzLCBDT05URU5UX0RFU0NSSVBUSU9OX19TRUNUSU9OKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShjb250ZW50RGVzY3JpcHRpb25FQ2xhc3MsIENPTlRFTlRfREVTQ1JJUFRJT05fX0VYVEVSTkFMX0lEKTsKLQotCQljb250ZW50RWxlbWVudEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhDT05URU5UX0VMRU1FTlQpOwotCQljcmVhdGVFQXR0cmlidXRlKGNvbnRlbnRFbGVtZW50RUNsYXNzLCBDT05URU5UX0VMRU1FTlRfX0dST1VQMSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoY29udGVudEVsZW1lbnRFQ2xhc3MsIENPTlRFTlRfRUxFTUVOVF9fQ0hFQ0tMSVNUKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShjb250ZW50RWxlbWVudEVDbGFzcywgQ09OVEVOVF9FTEVNRU5UX19DT05DRVBUKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShjb250ZW50RWxlbWVudEVDbGFzcywgQ09OVEVOVF9FTEVNRU5UX19FWEFNUExFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShjb250ZW50RWxlbWVudEVDbGFzcywgQ09OVEVOVF9FTEVNRU5UX19HVUlERUxJTkUpOwotCQljcmVhdGVFQXR0cmlidXRlKGNvbnRlbnRFbGVtZW50RUNsYXNzLCBDT05URU5UX0VMRU1FTlRfX1JFVVNBQkxFX0FTU0VUKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShjb250ZW50RWxlbWVudEVDbGFzcywgQ09OVEVOVF9FTEVNRU5UX19TVVBQT1JUSU5HX01BVEVSSUFMKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShjb250ZW50RWxlbWVudEVDbGFzcywgQ09OVEVOVF9FTEVNRU5UX19XSElURVBBUEVSKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShjb250ZW50RWxlbWVudEVDbGFzcywgQ09OVEVOVF9FTEVNRU5UX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShjb250ZW50RWxlbWVudEVDbGFzcywgQ09OVEVOVF9FTEVNRU5UX19WQVJJQUJJTElUWV9UWVBFKTsKLQotCQljb250ZW50UGFja2FnZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhDT05URU5UX1BBQ0tBR0UpOwotCQljcmVhdGVFQXR0cmlidXRlKGNvbnRlbnRQYWNrYWdlRUNsYXNzLCBDT05URU5UX1BBQ0tBR0VfX0dST1VQMik7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoY29udGVudFBhY2thZ2VFQ2xhc3MsIENPTlRFTlRfUEFDS0FHRV9fQ09OVEVOVF9FTEVNRU5UKTsKLQotCQljdXN0b21DYXRlZ29yeUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhDVVNUT01fQ0FURUdPUlkpOwotCQljcmVhdGVFQXR0cmlidXRlKGN1c3RvbUNhdGVnb3J5RUNsYXNzLCBDVVNUT01fQ0FURUdPUllfX0dST1VQMik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoY3VzdG9tQ2F0ZWdvcnlFQ2xhc3MsIENVU1RPTV9DQVRFR09SWV9fQ0FURUdPUklaRURfRUxFTUVOVCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoY3VzdG9tQ2F0ZWdvcnlFQ2xhc3MsIENVU1RPTV9DQVRFR09SWV9fU1VCX0NBVEVHT1JZKTsKLQotCQlkZWxpdmVyYWJsZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhERUxJVkVSQUJMRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZGVsaXZlcmFibGVFQ2xhc3MsIERFTElWRVJBQkxFX19HUk9VUDMpOwotCQljcmVhdGVFQXR0cmlidXRlKGRlbGl2ZXJhYmxlRUNsYXNzLCBERUxJVkVSQUJMRV9fREVMSVZFUkVEX1dPUktfUFJPRFVDVCk7Ci0KLQkJZGVsaXZlcmFibGVEZXNjcmlwdGlvbkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhERUxJVkVSQUJMRV9ERVNDUklQVElPTik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZGVsaXZlcmFibGVEZXNjcmlwdGlvbkVDbGFzcywgREVMSVZFUkFCTEVfREVTQ1JJUFRJT05fX0VYVEVSTkFMX0RFU0NSSVBUSU9OKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShkZWxpdmVyYWJsZURlc2NyaXB0aW9uRUNsYXNzLCBERUxJVkVSQUJMRV9ERVNDUklQVElPTl9fUEFDS0FHSU5HX0dVSURBTkNFKTsKLQotCQlkZWxpdmVyeVByb2Nlc3NFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoREVMSVZFUllfUFJPQ0VTUyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZGVsaXZlcnlQcm9jZXNzRUNsYXNzLCBERUxJVkVSWV9QUk9DRVNTX19HUk9VUDQpOwotCQljcmVhdGVFQXR0cmlidXRlKGRlbGl2ZXJ5UHJvY2Vzc0VDbGFzcywgREVMSVZFUllfUFJPQ0VTU19fQ09NTVVOSUNBVElPTlNfTUFURVJJQUwpOwotCQljcmVhdGVFQXR0cmlidXRlKGRlbGl2ZXJ5UHJvY2Vzc0VDbGFzcywgREVMSVZFUllfUFJPQ0VTU19fRURVQ0FUSU9OX01BVEVSSUFMKTsKLQotCQlkZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShkZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbkVDbGFzcywgREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fU0NBTEUpOwotCQljcmVhdGVFQXR0cmlidXRlKGRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uRUNsYXNzLCBERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19QUk9KRUNUX0NIQVJBQ1RFUklTVElDUyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25FQ2xhc3MsIERFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1JJU0tfTEVWRUwpOwotCQljcmVhdGVFQXR0cmlidXRlKGRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uRUNsYXNzLCBERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19FU1RJTUFUSU5HX1RFQ0hOSVFVRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25FQ2xhc3MsIERFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1BST0pFQ1RfTUVNQkVSX0VYUEVSVElTRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25FQ2xhc3MsIERFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1RZUEVfT0ZfQ09OVFJBQ1QpOwotCi0JCWRlc2NyaWJhYmxlRWxlbWVudEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhERVNDUklCQUJMRV9FTEVNRU5UKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShkZXNjcmliYWJsZUVsZW1lbnRFQ2xhc3MsIERFU0NSSUJBQkxFX0VMRU1FTlRfX1BSRVNFTlRBVElPTik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZGVzY3JpYmFibGVFbGVtZW50RUNsYXNzLCBERVNDUklCQUJMRV9FTEVNRU5UX19GVUxGSUxMKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShkZXNjcmliYWJsZUVsZW1lbnRFQ2xhc3MsIERFU0NSSUJBQkxFX0VMRU1FTlRfX0lTX0FCU1RSQUNUKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShkZXNjcmliYWJsZUVsZW1lbnRFQ2xhc3MsIERFU0NSSUJBQkxFX0VMRU1FTlRfX05PREVJQ09OKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShkZXNjcmliYWJsZUVsZW1lbnRFQ2xhc3MsIERFU0NSSUJBQkxFX0VMRU1FTlRfX1NIQVBFSUNPTik7Ci0KLQkJZGVzY3JpcHRvckVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhERVNDUklQVE9SKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShkZXNjcmlwdG9yRUNsYXNzLCBERVNDUklQVE9SX19JU19TWU5DSFJPTklaRURfV0lUSF9TT1VSQ0UpOwotCi0JCWRlc2NyaXB0b3JEZXNjcmlwdGlvbkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhERVNDUklQVE9SX0RFU0NSSVBUSU9OKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShkZXNjcmlwdG9yRGVzY3JpcHRpb25FQ2xhc3MsIERFU0NSSVBUT1JfREVTQ1JJUFRJT05fX1JFRklORURfREVTQ1JJUFRJT04pOwotCi0JCWRpc2NpcGxpbmVFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoRElTQ0lQTElORSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZGlzY2lwbGluZUVDbGFzcywgRElTQ0lQTElORV9fR1JPVVAyKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShkaXNjaXBsaW5lRUNsYXNzLCBESVNDSVBMSU5FX19UQVNLKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShkaXNjaXBsaW5lRUNsYXNzLCBESVNDSVBMSU5FX19TVUJfRElTQ0lQTElORSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZGlzY2lwbGluZUVDbGFzcywgRElTQ0lQTElORV9fUkVGRVJFTkNFX1dPUktGTE9XKTsKLQotCQlkaXNjaXBsaW5lR3JvdXBpbmdFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoRElTQ0lQTElORV9HUk9VUElORyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZGlzY2lwbGluZUdyb3VwaW5nRUNsYXNzLCBESVNDSVBMSU5FX0dST1VQSU5HX19HUk9VUDIpOwotCQljcmVhdGVFQXR0cmlidXRlKGRpc2NpcGxpbmVHcm91cGluZ0VDbGFzcywgRElTQ0lQTElORV9HUk9VUElOR19fRElTQ0lQTElORSk7Ci0KLQkJZG9jdW1lbnRSb290RUNsYXNzID0gY3JlYXRlRUNsYXNzKERPQ1VNRU5UX1JPT1QpOwotCQljcmVhdGVFQXR0cmlidXRlKGRvY3VtZW50Um9vdEVDbGFzcywgRE9DVU1FTlRfUk9PVF9fTUlYRUQpOwotCQljcmVhdGVFUmVmZXJlbmNlKGRvY3VtZW50Um9vdEVDbGFzcywgRE9DVU1FTlRfUk9PVF9fWE1MTlNfUFJFRklYX01BUCk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZG9jdW1lbnRSb290RUNsYXNzLCBET0NVTUVOVF9ST09UX19YU0lfU0NIRU1BX0xPQ0FUSU9OKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShkb2N1bWVudFJvb3RFQ2xhc3MsIERPQ1VNRU5UX1JPT1RfX01FVEhPRF9DT05GSUdVUkFUSU9OKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShkb2N1bWVudFJvb3RFQ2xhc3MsIERPQ1VNRU5UX1JPT1RfX01FVEhPRF9MSUJSQVJZKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShkb2N1bWVudFJvb3RFQ2xhc3MsIERPQ1VNRU5UX1JPT1RfX01FVEhPRF9QTFVHSU4pOwotCi0JCWRvbWFpbkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhET01BSU4pOwotCQljcmVhdGVFQXR0cmlidXRlKGRvbWFpbkVDbGFzcywgRE9NQUlOX19HUk9VUDIpOwotCQljcmVhdGVFQXR0cmlidXRlKGRvbWFpbkVDbGFzcywgRE9NQUlOX19XT1JLX1BST0RVQ1QpOwotCQljcmVhdGVFUmVmZXJlbmNlKGRvbWFpbkVDbGFzcywgRE9NQUlOX19TVUJET01BSU4pOwotCi0JCWVsZW1lbnRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoRUxFTUVOVCk7Ci0KLQkJZXN0aW1hdGVFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoRVNUSU1BVEUpOwotCQljcmVhdGVFQXR0cmlidXRlKGVzdGltYXRlRUNsYXNzLCBFU1RJTUFURV9fR1JPVVAyKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShlc3RpbWF0ZUVDbGFzcywgRVNUSU1BVEVfX0VTVElNQVRJT05fTUVUUklDKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShlc3RpbWF0ZUVDbGFzcywgRVNUSU1BVEVfX0VTVElNQVRJT05fQ09OU0lERVJBVElPTlMpOwotCi0JCWVzdGltYXRpbmdNZXRyaWNFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoRVNUSU1BVElOR19NRVRSSUMpOwotCi0JCWVzdGltYXRpb25Db25zaWRlcmF0aW9uc0VDbGFzcyA9IGNyZWF0ZUVDbGFzcyhFU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TKTsKLQotCQlleGFtcGxlRUNsYXNzID0gY3JlYXRlRUNsYXNzKEVYQU1QTEUpOwotCi0JCWd1aWRhbmNlRUNsYXNzID0gY3JlYXRlRUNsYXNzKEdVSURBTkNFKTsKLQotCQlndWlkYW5jZURlc2NyaXB0aW9uRUNsYXNzID0gY3JlYXRlRUNsYXNzKEdVSURBTkNFX0RFU0NSSVBUSU9OKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShndWlkYW5jZURlc2NyaXB0aW9uRUNsYXNzLCBHVUlEQU5DRV9ERVNDUklQVElPTl9fQVRUQUNITUVOVCk7Ci0KLQkJZ3VpZGVsaW5lRUNsYXNzID0gY3JlYXRlRUNsYXNzKEdVSURFTElORSk7Ci0KLQkJaXRlcmF0aW9uRUNsYXNzID0gY3JlYXRlRUNsYXNzKElURVJBVElPTik7Ci0KLQkJa2luZEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhLSU5EKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShraW5kRUNsYXNzLCBLSU5EX19BUFBMSUNBQkxFX01FVEFfQ0xBU1NfSU5GTyk7Ci0KLQkJbWV0aG9kQ29uZmlndXJhdGlvbkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhNRVRIT0RfQ09ORklHVVJBVElPTik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUobWV0aG9kQ29uZmlndXJhdGlvbkVDbGFzcywgTUVUSE9EX0NPTkZJR1VSQVRJT05fX0JBU0VfQ09ORklHVVJBVElPTik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUobWV0aG9kQ29uZmlndXJhdGlvbkVDbGFzcywgTUVUSE9EX0NPTkZJR1VSQVRJT05fX01FVEhPRF9QTFVHSU5fU0VMRUNUSU9OKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShtZXRob2RDb25maWd1cmF0aW9uRUNsYXNzLCBNRVRIT0RfQ09ORklHVVJBVElPTl9fTUVUSE9EX1BBQ0tBR0VfU0VMRUNUSU9OKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShtZXRob2RDb25maWd1cmF0aW9uRUNsYXNzLCBNRVRIT0RfQ09ORklHVVJBVElPTl9fREVGQVVMVF9WSUVXKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShtZXRob2RDb25maWd1cmF0aW9uRUNsYXNzLCBNRVRIT0RfQ09ORklHVVJBVElPTl9fUFJPQ0VTU19WSUVXKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShtZXRob2RDb25maWd1cmF0aW9uRUNsYXNzLCBNRVRIT0RfQ09ORklHVVJBVElPTl9fU1VCVFJBQ1RFRF9DQVRFR09SWSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUobWV0aG9kQ29uZmlndXJhdGlvbkVDbGFzcywgTUVUSE9EX0NPTkZJR1VSQVRJT05fX0FEREVEX0NBVEVHT1JZKTsKLQotCQltZXRob2RFbGVtZW50RUNsYXNzID0gY3JlYXRlRUNsYXNzKE1FVEhPRF9FTEVNRU5UKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShtZXRob2RFbGVtZW50RUNsYXNzLCBNRVRIT0RfRUxFTUVOVF9fR1JPVVApOwotCQljcmVhdGVFUmVmZXJlbmNlKG1ldGhvZEVsZW1lbnRFQ2xhc3MsIE1FVEhPRF9FTEVNRU5UX19PV05FRF9SVUxFKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShtZXRob2RFbGVtZW50RUNsYXNzLCBNRVRIT0RfRUxFTUVOVF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkpOwotCQljcmVhdGVFQXR0cmlidXRlKG1ldGhvZEVsZW1lbnRFQ2xhc3MsIE1FVEhPRF9FTEVNRU5UX19CUklFRl9ERVNDUklQVElPTik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUobWV0aG9kRWxlbWVudEVDbGFzcywgTUVUSE9EX0VMRU1FTlRfX0lEKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShtZXRob2RFbGVtZW50RUNsYXNzLCBNRVRIT0RfRUxFTUVOVF9fT1JERVJJTkdfR1VJREUpOwotCQljcmVhdGVFQXR0cmlidXRlKG1ldGhvZEVsZW1lbnRFQ2xhc3MsIE1FVEhPRF9FTEVNRU5UX19QUkVTRU5UQVRJT05fTkFNRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUobWV0aG9kRWxlbWVudEVDbGFzcywgTUVUSE9EX0VMRU1FTlRfX1NVUFBSRVNTRUQpOwotCi0JCW1ldGhvZEVsZW1lbnRQcm9wZXJ0eUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhNRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUobWV0aG9kRWxlbWVudFByb3BlcnR5RUNsYXNzLCBNRVRIT0RfRUxFTUVOVF9QUk9QRVJUWV9fVkFMVUUpOwotCi0JCW1ldGhvZExpYnJhcnlFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoTUVUSE9EX0xJQlJBUlkpOwotCQljcmVhdGVFUmVmZXJlbmNlKG1ldGhvZExpYnJhcnlFQ2xhc3MsIE1FVEhPRF9MSUJSQVJZX19NRVRIT0RfUExVR0lOKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShtZXRob2RMaWJyYXJ5RUNsYXNzLCBNRVRIT0RfTElCUkFSWV9fTUVUSE9EX0NPTkZJR1VSQVRJT04pOwotCQljcmVhdGVFQXR0cmlidXRlKG1ldGhvZExpYnJhcnlFQ2xhc3MsIE1FVEhPRF9MSUJSQVJZX19UT09MKTsKLQotCQltZXRob2RQYWNrYWdlRUNsYXNzID0gY3JlYXRlRUNsYXNzKE1FVEhPRF9QQUNLQUdFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShtZXRob2RQYWNrYWdlRUNsYXNzLCBNRVRIT0RfUEFDS0FHRV9fR1JPVVAxKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShtZXRob2RQYWNrYWdlRUNsYXNzLCBNRVRIT0RfUEFDS0FHRV9fUkVVU0VEX1BBQ0tBR0UpOwotCQljcmVhdGVFUmVmZXJlbmNlKG1ldGhvZFBhY2thZ2VFQ2xhc3MsIE1FVEhPRF9QQUNLQUdFX19NRVRIT0RfUEFDS0FHRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUobWV0aG9kUGFja2FnZUVDbGFzcywgTUVUSE9EX1BBQ0tBR0VfX0dMT0JBTCk7Ci0KLQkJbWV0aG9kUGx1Z2luRUNsYXNzID0gY3JlYXRlRUNsYXNzKE1FVEhPRF9QTFVHSU4pOwotCQljcmVhdGVFQXR0cmlidXRlKG1ldGhvZFBsdWdpbkVDbGFzcywgTUVUSE9EX1BMVUdJTl9fUkVGRVJFTkNFRF9NRVRIT0RfUExVR0lOKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShtZXRob2RQbHVnaW5FQ2xhc3MsIE1FVEhPRF9QTFVHSU5fX01FVEhPRF9QQUNLQUdFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShtZXRob2RQbHVnaW5FQ2xhc3MsIE1FVEhPRF9QTFVHSU5fX1VTRVJfQ0hBTkdFQUJMRSk7Ci0KLQkJbWV0aG9kVW5pdEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhNRVRIT0RfVU5JVCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUobWV0aG9kVW5pdEVDbGFzcywgTUVUSE9EX1VOSVRfX0NPUFlSSUdIVCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUobWV0aG9kVW5pdEVDbGFzcywgTUVUSE9EX1VOSVRfX0FVVEhPUlMpOwotCQljcmVhdGVFQXR0cmlidXRlKG1ldGhvZFVuaXRFQ2xhc3MsIE1FVEhPRF9VTklUX19DSEFOR0VfREFURSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUobWV0aG9kVW5pdEVDbGFzcywgTUVUSE9EX1VOSVRfX0NIQU5HRV9ERVNDUklQVElPTik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUobWV0aG9kVW5pdEVDbGFzcywgTUVUSE9EX1VOSVRfX1ZFUlNJT04pOwotCi0JCW1pbGVzdG9uZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhNSUxFU1RPTkUpOwotCQljcmVhdGVFQXR0cmlidXRlKG1pbGVzdG9uZUVDbGFzcywgTUlMRVNUT05FX19SRVFVSVJFRF9SRVNVTFQpOwotCi0JCW5hbWVkRWxlbWVudEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhOQU1FRF9FTEVNRU5UKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShuYW1lZEVsZW1lbnRFQ2xhc3MsIE5BTUVEX0VMRU1FTlRfX05BTUUpOwotCi0JCW91dGNvbWVFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoT1VUQ09NRSk7Ci0KLQkJcGFja2FnZWFibGVFbGVtZW50RUNsYXNzID0gY3JlYXRlRUNsYXNzKFBBQ0tBR0VBQkxFX0VMRU1FTlQpOwotCi0JCXBoYXNlRUNsYXNzID0gY3JlYXRlRUNsYXNzKFBIQVNFKTsKLQotCQlwbGFubmluZ0RhdGFFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUExBTk5JTkdfREFUQSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocGxhbm5pbmdEYXRhRUNsYXNzLCBQTEFOTklOR19EQVRBX19GSU5JU0hfREFURSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocGxhbm5pbmdEYXRhRUNsYXNzLCBQTEFOTklOR19EQVRBX19SQU5LKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShwbGFubmluZ0RhdGFFQ2xhc3MsIFBMQU5OSU5HX0RBVEFfX1NUQVJUX0RBVEUpOwotCi0JCXByYWN0aWNlRUNsYXNzID0gY3JlYXRlRUNsYXNzKFBSQUNUSUNFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShwcmFjdGljZUVDbGFzcywgUFJBQ1RJQ0VfX0dST1VQMik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocHJhY3RpY2VFQ2xhc3MsIFBSQUNUSUNFX19BQ1RJVklUWV9SRUZFUkVOQ0UpOwotCQljcmVhdGVFQXR0cmlidXRlKHByYWN0aWNlRUNsYXNzLCBQUkFDVElDRV9fQ09OVEVOVF9SRUZFUkVOQ0UpOwotCQljcmVhdGVFUmVmZXJlbmNlKHByYWN0aWNlRUNsYXNzLCBQUkFDVElDRV9fU1VCX1BSQUNUSUNFKTsKLQotCQlwcmFjdGljZURlc2NyaXB0aW9uRUNsYXNzID0gY3JlYXRlRUNsYXNzKFBSQUNUSUNFX0RFU0NSSVBUSU9OKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShwcmFjdGljZURlc2NyaXB0aW9uRUNsYXNzLCBQUkFDVElDRV9ERVNDUklQVElPTl9fQURESVRJT05BTF9JTkZPKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShwcmFjdGljZURlc2NyaXB0aW9uRUNsYXNzLCBQUkFDVElDRV9ERVNDUklQVElPTl9fQVBQTElDQVRJT04pOwotCQljcmVhdGVFQXR0cmlidXRlKHByYWN0aWNlRGVzY3JpcHRpb25FQ2xhc3MsIFBSQUNUSUNFX0RFU0NSSVBUSU9OX19CQUNLR1JPVU5EKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShwcmFjdGljZURlc2NyaXB0aW9uRUNsYXNzLCBQUkFDVElDRV9ERVNDUklQVElPTl9fR09BTFMpOwotCQljcmVhdGVFQXR0cmlidXRlKHByYWN0aWNlRGVzY3JpcHRpb25FQ2xhc3MsIFBSQUNUSUNFX0RFU0NSSVBUSU9OX19MRVZFTFNfT0ZfQURPUFRJT04pOwotCQljcmVhdGVFQXR0cmlidXRlKHByYWN0aWNlRGVzY3JpcHRpb25FQ2xhc3MsIFBSQUNUSUNFX0RFU0NSSVBUSU9OX19QUk9CTEVNKTsKLQotCQlwcm9jZXNzRUNsYXNzID0gY3JlYXRlRUNsYXNzKFBST0NFU1MpOwotCQljcmVhdGVFQXR0cmlidXRlKHByb2Nlc3NFQ2xhc3MsIFBST0NFU1NfX0lOQ0xVREVTX1BBVFRFUk4pOwotCQljcmVhdGVFQXR0cmlidXRlKHByb2Nlc3NFQ2xhc3MsIFBST0NFU1NfX0RFRkFVTFRfQ09OVEVYVCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocHJvY2Vzc0VDbGFzcywgUFJPQ0VTU19fVkFMSURfQ09OVEVYVCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocHJvY2Vzc0VDbGFzcywgUFJPQ0VTU19fRElBR1JBTV9VUkkpOwotCi0JCXByb2Nlc3NDb21wb25lbnRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUFJPQ0VTU19DT01QT05FTlQpOwotCQljcmVhdGVFQXR0cmlidXRlKHByb2Nlc3NDb21wb25lbnRFQ2xhc3MsIFBST0NFU1NfQ09NUE9ORU5UX19DT1BZUklHSFQpOwotCQljcmVhdGVFUmVmZXJlbmNlKHByb2Nlc3NDb21wb25lbnRFQ2xhc3MsIFBST0NFU1NfQ09NUE9ORU5UX19JTlRFUkZBQ0UpOwotCQljcmVhdGVFUmVmZXJlbmNlKHByb2Nlc3NDb21wb25lbnRFQ2xhc3MsIFBST0NFU1NfQ09NUE9ORU5UX19QUk9DRVNTKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShwcm9jZXNzQ29tcG9uZW50RUNsYXNzLCBQUk9DRVNTX0NPTVBPTkVOVF9fQVVUSE9SUyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocHJvY2Vzc0NvbXBvbmVudEVDbGFzcywgUFJPQ0VTU19DT01QT05FTlRfX0NIQU5HRV9EQVRFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShwcm9jZXNzQ29tcG9uZW50RUNsYXNzLCBQUk9DRVNTX0NPTVBPTkVOVF9fQ0hBTkdFX0RFU0NSSVBUSU9OKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShwcm9jZXNzQ29tcG9uZW50RUNsYXNzLCBQUk9DRVNTX0NPTVBPTkVOVF9fVkVSU0lPTik7Ci0KLQkJcHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhQUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0UpOwotCQljcmVhdGVFQXR0cmlidXRlKHByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VFQ2xhc3MsIFBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRV9fR1JPVVAyKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShwcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlRUNsYXNzLCBQUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfX0lOVEVSRkFDRV9TUEVDSUZJQ0FUSU9OKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShwcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlRUNsYXNzLCBQUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfX0lOVEVSRkFDRV9JTyk7Ci0KLQkJcHJvY2Vzc0Rlc2NyaXB0aW9uRUNsYXNzID0gY3JlYXRlRUNsYXNzKFBST0NFU1NfREVTQ1JJUFRJT04pOwotCQljcmVhdGVFQXR0cmlidXRlKHByb2Nlc3NEZXNjcmlwdGlvbkVDbGFzcywgUFJPQ0VTU19ERVNDUklQVElPTl9fU0NPUEUpOwotCQljcmVhdGVFQXR0cmlidXRlKHByb2Nlc3NEZXNjcmlwdGlvbkVDbGFzcywgUFJPQ0VTU19ERVNDUklQVElPTl9fVVNBR0VfTk9URVMpOwotCi0JCXByb2Nlc3NFbGVtZW50RUNsYXNzID0gY3JlYXRlRUNsYXNzKFBST0NFU1NfRUxFTUVOVCk7Ci0KLQkJcHJvY2Vzc1BhY2thZ2VFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUFJPQ0VTU19QQUNLQUdFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShwcm9jZXNzUGFja2FnZUVDbGFzcywgUFJPQ0VTU19QQUNLQUdFX19HUk9VUDIpOwotCQljcmVhdGVFUmVmZXJlbmNlKHByb2Nlc3NQYWNrYWdlRUNsYXNzLCBQUk9DRVNTX1BBQ0tBR0VfX1BST0NFU1NfRUxFTUVOVCk7Ci0KLQkJcHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGVFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUFJPQ0VTU19QTEFOTklOR19URU1QTEFURSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGVFQ2xhc3MsIFBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX0dST1VQNCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGVFQ2xhc3MsIFBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX0JBU0VfUFJPQ0VTUyk7Ci0KLQkJcmVwb3J0RUNsYXNzID0gY3JlYXRlRUNsYXNzKFJFUE9SVCk7Ci0KLQkJcmV1c2FibGVBc3NldEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhSRVVTQUJMRV9BU1NFVCk7Ci0KLQkJcm9hZG1hcEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhST0FETUFQKTsKLQotCQlyb2xlRUNsYXNzID0gY3JlYXRlRUNsYXNzKFJPTEUpOwotCQljcmVhdGVFQXR0cmlidXRlKHJvbGVFQ2xhc3MsIFJPTEVfX0dST1VQMik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocm9sZUVDbGFzcywgUk9MRV9fUkVTUE9OU0lCTEVfRk9SKTsKLQotCQlyb2xlRGVzY3JpcHRpb25FQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUk9MRV9ERVNDUklQVElPTik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocm9sZURlc2NyaXB0aW9uRUNsYXNzLCBST0xFX0RFU0NSSVBUSU9OX19BU1NJR05NRU5UX0FQUFJPQUNIRVMpOwotCQljcmVhdGVFQXR0cmlidXRlKHJvbGVEZXNjcmlwdGlvbkVDbGFzcywgUk9MRV9ERVNDUklQVElPTl9fU0tJTExTKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShyb2xlRGVzY3JpcHRpb25FQ2xhc3MsIFJPTEVfREVTQ1JJUFRJT05fX1NZTk9OWU1TKTsKLQotCQlyb2xlRGVzY3JpcHRvckVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhST0xFX0RFU0NSSVBUT1IpOwotCQljcmVhdGVFQXR0cmlidXRlKHJvbGVEZXNjcmlwdG9yRUNsYXNzLCBST0xFX0RFU0NSSVBUT1JfX1JPTEUpOwotCQljcmVhdGVFQXR0cmlidXRlKHJvbGVEZXNjcmlwdG9yRUNsYXNzLCBST0xFX0RFU0NSSVBUT1JfX1JFU1BPTlNJQkxFX0ZPUik7Ci0KLQkJcm9sZVNldEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhST0xFX1NFVCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocm9sZVNldEVDbGFzcywgUk9MRV9TRVRfX0dST1VQMik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocm9sZVNldEVDbGFzcywgUk9MRV9TRVRfX1JPTEUpOwotCi0JCXJvbGVTZXRHcm91cGluZ0VDbGFzcyA9IGNyZWF0ZUVDbGFzcyhST0xFX1NFVF9HUk9VUElORyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocm9sZVNldEdyb3VwaW5nRUNsYXNzLCBST0xFX1NFVF9HUk9VUElOR19fR1JPVVAyKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShyb2xlU2V0R3JvdXBpbmdFQ2xhc3MsIFJPTEVfU0VUX0dST1VQSU5HX19ST0xFX1NFVCk7Ci0KLQkJc2VjdGlvbkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhTRUNUSU9OKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShzZWN0aW9uRUNsYXNzLCBTRUNUSU9OX19TVUJfU0VDVElPTik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoc2VjdGlvbkVDbGFzcywgU0VDVElPTl9fUFJFREVDRVNTT1IpOwotCQljcmVhdGVFQXR0cmlidXRlKHNlY3Rpb25FQ2xhc3MsIFNFQ1RJT05fX0RFU0NSSVBUSU9OKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShzZWN0aW9uRUNsYXNzLCBTRUNUSU9OX19TRUNUSU9OX05BTUUpOwotCQljcmVhdGVFQXR0cmlidXRlKHNlY3Rpb25FQ2xhc3MsIFNFQ1RJT05fX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQpOwotCQljcmVhdGVFQXR0cmlidXRlKHNlY3Rpb25FQ2xhc3MsIFNFQ1RJT05fX1ZBUklBQklMSVRZX1RZUEUpOwotCi0JCXN1cHBvcnRpbmdNYXRlcmlhbEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhTVVBQT1JUSU5HX01BVEVSSUFMKTsKLQotCQl0YXNrRUNsYXNzID0gY3JlYXRlRUNsYXNzKFRBU0spOwotCQljcmVhdGVFQXR0cmlidXRlKHRhc2tFQ2xhc3MsIFRBU0tfX1BSRUNPTkRJVElPTik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUodGFza0VDbGFzcywgVEFTS19fUE9TVENPTkRJVElPTik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUodGFza0VDbGFzcywgVEFTS19fUEVSRk9STUVEX0JZKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh0YXNrRUNsYXNzLCBUQVNLX19HUk9VUDIpOwotCQljcmVhdGVFQXR0cmlidXRlKHRhc2tFQ2xhc3MsIFRBU0tfX01BTkRBVE9SWV9JTlBVVCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUodGFza0VDbGFzcywgVEFTS19fT1VUUFVUKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh0YXNrRUNsYXNzLCBUQVNLX19BRERJVElPTkFMTFlfUEVSRk9STUVEX0JZKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh0YXNrRUNsYXNzLCBUQVNLX19PUFRJT05BTF9JTlBVVCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUodGFza0VDbGFzcywgVEFTS19fRVNUSU1BVEUpOwotCQljcmVhdGVFQXR0cmlidXRlKHRhc2tFQ2xhc3MsIFRBU0tfX0VTVElNQVRJT05fQ09OU0lERVJBVElPTlMpOwotCQljcmVhdGVFQXR0cmlidXRlKHRhc2tFQ2xhc3MsIFRBU0tfX1RPT0xfTUVOVE9SKTsKLQotCQl0YXNrRGVzY3JpcHRpb25FQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoVEFTS19ERVNDUklQVElPTik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUodGFza0Rlc2NyaXB0aW9uRUNsYXNzLCBUQVNLX0RFU0NSSVBUSU9OX19BTFRFUk5BVElWRVMpOwotCQljcmVhdGVFQXR0cmlidXRlKHRhc2tEZXNjcmlwdGlvbkVDbGFzcywgVEFTS19ERVNDUklQVElPTl9fUFVSUE9TRSk7Ci0KLQkJdGFza0Rlc2NyaXB0b3JFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoVEFTS19ERVNDUklQVE9SKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh0YXNrRGVzY3JpcHRvckVDbGFzcywgVEFTS19ERVNDUklQVE9SX19UQVNLKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh0YXNrRGVzY3JpcHRvckVDbGFzcywgVEFTS19ERVNDUklQVE9SX19QRVJGT1JNRURfUFJJTUFSSUxZX0JZKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh0YXNrRGVzY3JpcHRvckVDbGFzcywgVEFTS19ERVNDUklQVE9SX19HUk9VUDMpOwotCQljcmVhdGVFQXR0cmlidXRlKHRhc2tEZXNjcmlwdG9yRUNsYXNzLCBUQVNLX0RFU0NSSVBUT1JfX0FERElUSU9OQUxMWV9QRVJGT1JNRURfQlkpOwotCQljcmVhdGVFQXR0cmlidXRlKHRhc2tEZXNjcmlwdG9yRUNsYXNzLCBUQVNLX0RFU0NSSVBUT1JfX0FTU0lTVEVEX0JZKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh0YXNrRGVzY3JpcHRvckVDbGFzcywgVEFTS19ERVNDUklQVE9SX19FWFRFUk5BTF9JTlBVVCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUodGFza0Rlc2NyaXB0b3JFQ2xhc3MsIFRBU0tfREVTQ1JJUFRPUl9fTUFOREFUT1JZX0lOUFVUKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh0YXNrRGVzY3JpcHRvckVDbGFzcywgVEFTS19ERVNDUklQVE9SX19PUFRJT05BTF9JTlBVVCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUodGFza0Rlc2NyaXB0b3JFQ2xhc3MsIFRBU0tfREVTQ1JJUFRPUl9fT1VUUFVUKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh0YXNrRGVzY3JpcHRvckVDbGFzcywgVEFTS19ERVNDUklQVE9SX19TVEVQKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh0YXNrRGVzY3JpcHRvckVDbGFzcywgVEFTS19ERVNDUklQVE9SX19JU19TWU5DSFJPTklaRURfV0lUSF9TT1VSQ0UpOwotCi0JCXRlYW1Qcm9maWxlRUNsYXNzID0gY3JlYXRlRUNsYXNzKFRFQU1fUFJPRklMRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUodGVhbVByb2ZpbGVFQ2xhc3MsIFRFQU1fUFJPRklMRV9fR1JPVVAyKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh0ZWFtUHJvZmlsZUVDbGFzcywgVEVBTV9QUk9GSUxFX19ST0xFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh0ZWFtUHJvZmlsZUVDbGFzcywgVEVBTV9QUk9GSUxFX19TVVBFUl9URUFNKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh0ZWFtUHJvZmlsZUVDbGFzcywgVEVBTV9QUk9GSUxFX19TVUJfVEVBTSk7Ci0KLQkJdGVtcGxhdGVFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoVEVNUExBVEUpOwotCi0JCXRlcm1EZWZpbml0aW9uRUNsYXNzID0gY3JlYXRlRUNsYXNzKFRFUk1fREVGSU5JVElPTik7Ci0KLQkJdG9vbEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhUT09MKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh0b29sRUNsYXNzLCBUT09MX19HUk9VUDIpOwotCQljcmVhdGVFQXR0cmlidXRlKHRvb2xFQ2xhc3MsIFRPT0xfX1RPT0xfTUVOVE9SKTsKLQotCQl0b29sTWVudG9yRUNsYXNzID0gY3JlYXRlRUNsYXNzKFRPT0xfTUVOVE9SKTsKLQotCQl3aGl0ZXBhcGVyRUNsYXNzID0gY3JlYXRlRUNsYXNzKFdISVRFUEFQRVIpOwotCi0JCXdvcmtCcmVha2Rvd25FbGVtZW50RUNsYXNzID0gY3JlYXRlRUNsYXNzKFdPUktfQlJFQUtET1dOX0VMRU1FTlQpOwotCQljcmVhdGVFQXR0cmlidXRlKHdvcmtCcmVha2Rvd25FbGVtZW50RUNsYXNzLCBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19HUk9VUDIpOwotCQljcmVhdGVFUmVmZXJlbmNlKHdvcmtCcmVha2Rvd25FbGVtZW50RUNsYXNzLCBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19QUkVERUNFU1NPUik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUod29ya0JyZWFrZG93bkVsZW1lbnRFQ2xhc3MsIFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0lTX0VWRU5UX0RSSVZFTik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUod29ya0JyZWFrZG93bkVsZW1lbnRFQ2xhc3MsIFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0lTX09OR09JTkcpOwotCQljcmVhdGVFQXR0cmlidXRlKHdvcmtCcmVha2Rvd25FbGVtZW50RUNsYXNzLCBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19JU19SRVBFQVRBQkxFKTsKLQotCQl3b3JrRGVmaW5pdGlvbkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhXT1JLX0RFRklOSVRJT04pOwotCQljcmVhdGVFQXR0cmlidXRlKHdvcmtEZWZpbml0aW9uRUNsYXNzLCBXT1JLX0RFRklOSVRJT05fX1BSRUNPTkRJVElPTik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUod29ya0RlZmluaXRpb25FQ2xhc3MsIFdPUktfREVGSU5JVElPTl9fUE9TVENPTkRJVElPTik7Ci0KLQkJd29ya09yZGVyRUNsYXNzID0gY3JlYXRlRUNsYXNzKFdPUktfT1JERVIpOwotCQljcmVhdGVFQXR0cmlidXRlKHdvcmtPcmRlckVDbGFzcywgV09SS19PUkRFUl9fVkFMVUUpOwotCQljcmVhdGVFQXR0cmlidXRlKHdvcmtPcmRlckVDbGFzcywgV09SS19PUkRFUl9fSUQpOwotCQljcmVhdGVFQXR0cmlidXRlKHdvcmtPcmRlckVDbGFzcywgV09SS19PUkRFUl9fTElOS19UWVBFKTsKLQotCQl3b3JrUHJvZHVjdEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhXT1JLX1BST0RVQ1QpOwotCQljcmVhdGVFQXR0cmlidXRlKHdvcmtQcm9kdWN0RUNsYXNzLCBXT1JLX1BST0RVQ1RfX0dST1VQMik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUod29ya1Byb2R1Y3RFQ2xhc3MsIFdPUktfUFJPRFVDVF9fRVNUSU1BVEUpOwotCQljcmVhdGVFQXR0cmlidXRlKHdvcmtQcm9kdWN0RUNsYXNzLCBXT1JLX1BST0RVQ1RfX0VTVElNQVRJT05fQ09OU0lERVJBVElPTlMpOwotCQljcmVhdGVFQXR0cmlidXRlKHdvcmtQcm9kdWN0RUNsYXNzLCBXT1JLX1BST0RVQ1RfX1JFUE9SVCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUod29ya1Byb2R1Y3RFQ2xhc3MsIFdPUktfUFJPRFVDVF9fVEVNUExBVEUpOwotCQljcmVhdGVFQXR0cmlidXRlKHdvcmtQcm9kdWN0RUNsYXNzLCBXT1JLX1BST0RVQ1RfX1RPT0xfTUVOVE9SKTsKLQotCQl3b3JrUHJvZHVjdERlc2NyaXB0aW9uRUNsYXNzID0gY3JlYXRlRUNsYXNzKFdPUktfUFJPRFVDVF9ERVNDUklQVElPTik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUod29ya1Byb2R1Y3REZXNjcmlwdGlvbkVDbGFzcywgV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19JTVBBQ1RfT0ZfTk9UX0hBVklORyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUod29ya1Byb2R1Y3REZXNjcmlwdGlvbkVDbGFzcywgV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19QVVJQT1NFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh3b3JrUHJvZHVjdERlc2NyaXB0aW9uRUNsYXNzLCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX1JFQVNPTlNfRk9SX05PVF9ORUVESU5HKTsKLQotCQl3b3JrUHJvZHVjdERlc2NyaXB0b3JFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoV09SS19QUk9EVUNUX0RFU0NSSVBUT1IpOwotCQljcmVhdGVFQXR0cmlidXRlKHdvcmtQcm9kdWN0RGVzY3JpcHRvckVDbGFzcywgV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX1dPUktfUFJPRFVDVCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUod29ya1Byb2R1Y3REZXNjcmlwdG9yRUNsYXNzLCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fUkVTUE9OU0lCTEVfUk9MRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUod29ya1Byb2R1Y3REZXNjcmlwdG9yRUNsYXNzLCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fR1JPVVAyKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh3b3JrUHJvZHVjdERlc2NyaXB0b3JFQ2xhc3MsIFdPUktfUFJPRFVDVF9ERVNDUklQVE9SX19FWFRFUk5BTF9JTlBVVF9UTyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUod29ya1Byb2R1Y3REZXNjcmlwdG9yRUNsYXNzLCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fSU1QQUNURURfQlkpOwotCQljcmVhdGVFQXR0cmlidXRlKHdvcmtQcm9kdWN0RGVzY3JpcHRvckVDbGFzcywgV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0lNUEFDVFMpOwotCQljcmVhdGVFQXR0cmlidXRlKHdvcmtQcm9kdWN0RGVzY3JpcHRvckVDbGFzcywgV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX01BTkRBVE9SWV9JTlBVVF9UTyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUod29ya1Byb2R1Y3REZXNjcmlwdG9yRUNsYXNzLCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fT1BUSU9OQUxfSU5QVVRfVE8pOwotCQljcmVhdGVFQXR0cmlidXRlKHdvcmtQcm9kdWN0RGVzY3JpcHRvckVDbGFzcywgV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX09VVFBVVF9GUk9NKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh3b3JrUHJvZHVjdERlc2NyaXB0b3JFQ2xhc3MsIFdPUktfUFJPRFVDVF9ERVNDUklQVE9SX19ERUxJVkVSQUJMRV9QQVJUUyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUod29ya1Byb2R1Y3REZXNjcmlwdG9yRUNsYXNzLCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fQUNUSVZJVFlfRU5UUllfU1RBVEUpOwotCQljcmVhdGVFQXR0cmlidXRlKHdvcmtQcm9kdWN0RGVzY3JpcHRvckVDbGFzcywgV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0FDVElWSVRZX0VYSVRfU1RBVEUpOwotCi0JCXdvcmtQcm9kdWN0VHlwZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhXT1JLX1BST0RVQ1RfVFlQRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUod29ya1Byb2R1Y3RUeXBlRUNsYXNzLCBXT1JLX1BST0RVQ1RfVFlQRV9fR1JPVVAyKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh3b3JrUHJvZHVjdFR5cGVFQ2xhc3MsIFdPUktfUFJPRFVDVF9UWVBFX19XT1JLX1BST0RVQ1QpOwotCi0JCS8vIENyZWF0ZSBlbnVtcwotCQl2YXJpYWJpbGl0eVR5cGVFRW51bSA9IGNyZWF0ZUVFbnVtKFZBUklBQklMSVRZX1RZUEUpOwotCQl3b3JrT3JkZXJUeXBlRUVudW0gPSBjcmVhdGVFRW51bShXT1JLX09SREVSX1RZUEUpOwotCi0JCS8vIENyZWF0ZSBkYXRhIHR5cGVzCi0JCXZhcmlhYmlsaXR5VHlwZU9iamVjdEVEYXRhVHlwZSA9IGNyZWF0ZUVEYXRhVHlwZShWQVJJQUJJTElUWV9UWVBFX09CSkVDVCk7Ci0JCXdvcmtPcmRlclR5cGVPYmplY3RFRGF0YVR5cGUgPSBjcmVhdGVFRGF0YVR5cGUoV09SS19PUkRFUl9UWVBFX09CSkVDVCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzSW5pdGlhbGl6ZWQgPSBmYWxzZTsKLQotCS8qKgotCSAqIENvbXBsZXRlIHRoZSBpbml0aWFsaXphdGlvbiBvZiB0aGUgcGFja2FnZSBhbmQgaXRzIG1ldGEtbW9kZWwuICBUaGlzCi0JICogbWV0aG9kIGlzIGd1YXJkZWQgdG8gaGF2ZSBubyBhZmZlY3Qgb24gYW55IGludm9jYXRpb24gYnV0IGl0cyBmaXJzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCkgewotCQlpZiAoaXNJbml0aWFsaXplZCkgcmV0dXJuOwotCQlpc0luaXRpYWxpemVkID0gdHJ1ZTsKLQotCQkvLyBJbml0aWFsaXplIHBhY2thZ2UKLQkJc2V0TmFtZShlTkFNRSk7Ci0JCXNldE5zUHJlZml4KGVOU19QUkVGSVgpOwotCQlzZXROc1VSSShlTlNfVVJJKTsKLQotCQkvLyBPYnRhaW4gb3RoZXIgZGVwZW5kZW50IHBhY2thZ2VzCi0JCVhNTFR5cGVQYWNrYWdlIHRoZVhNTFR5cGVQYWNrYWdlID0gKFhNTFR5cGVQYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFhNTFR5cGVQYWNrYWdlLmVOU19VUkkpOwotCi0JCS8vIENyZWF0ZSB0eXBlIHBhcmFtZXRlcnMKLQotCQkvLyBTZXQgYm91bmRzIGZvciB0eXBlIHBhcmFtZXRlcnMKLQotCQkvLyBBZGQgc3VwZXJ0eXBlcyB0byBjbGFzc2VzCi0JCWFjdGl2aXR5RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0V29ya0JyZWFrZG93bkVsZW1lbnQoKSk7Ci0JCWFjdGl2aXR5RGVzY3JpcHRpb25FQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24oKSk7Ci0JCWFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0UGFja2FnZWFibGVFbGVtZW50KCkpOwotCQlhcnRpZmFjdEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFdvcmtQcm9kdWN0KCkpOwotCQlhcnRpZmFjdERlc2NyaXB0aW9uRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0V29ya1Byb2R1Y3REZXNjcmlwdGlvbigpKTsKLQkJYnJlYWtkb3duRWxlbWVudEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFByb2Nlc3NFbGVtZW50KCkpOwotCQlicmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb25FQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRDb250ZW50RGVzY3JpcHRpb24oKSk7Ci0JCWNhcGFiaWxpdHlQYXR0ZXJuRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0UHJvY2VzcygpKTsKLQkJY2hlY2tsaXN0RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0R3VpZGFuY2UoKSk7Ci0JCWNvbXBvc2l0ZVJvbGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRSb2xlRGVzY3JpcHRvcigpKTsKLQkJY29uY2VwdEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEd1aWRhbmNlKCkpOwotCQljb25zdHJhaW50RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0TWV0aG9kRWxlbWVudCgpKTsKLQkJY29udGVudENhdGVnb3J5RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0Q29udGVudEVsZW1lbnQoKSk7Ci0JCWNvbnRlbnRDYXRlZ29yeVBhY2thZ2VFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRNZXRob2RQYWNrYWdlKCkpOwotCQljb250ZW50RGVzY3JpcHRpb25FQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRNZXRob2RVbml0KCkpOwotCQljb250ZW50RWxlbWVudEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldERlc2NyaWJhYmxlRWxlbWVudCgpKTsKLQkJY29udGVudFBhY2thZ2VFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRNZXRob2RQYWNrYWdlKCkpOwotCQljdXN0b21DYXRlZ29yeUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldENvbnRlbnRDYXRlZ29yeSgpKTsKLQkJZGVsaXZlcmFibGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRXb3JrUHJvZHVjdCgpKTsKLQkJZGVsaXZlcmFibGVEZXNjcmlwdGlvbkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFdvcmtQcm9kdWN0RGVzY3JpcHRpb24oKSk7Ci0JCWRlbGl2ZXJ5UHJvY2Vzc0VDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFByb2Nlc3MoKSk7Ci0JCWRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0UHJvY2Vzc0Rlc2NyaXB0aW9uKCkpOwotCQlkZXNjcmliYWJsZUVsZW1lbnRFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRNZXRob2RFbGVtZW50KCkpOwotCQlkZXNjcmlwdG9yRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0QnJlYWtkb3duRWxlbWVudCgpKTsKLQkJZGVzY3JpcHRvckRlc2NyaXB0aW9uRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0QnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uKCkpOwotCQlkaXNjaXBsaW5lRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0Q29udGVudENhdGVnb3J5KCkpOwotCQlkaXNjaXBsaW5lR3JvdXBpbmdFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRDb250ZW50Q2F0ZWdvcnkoKSk7Ci0JCWRvbWFpbkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldENvbnRlbnRDYXRlZ29yeSgpKTsKLQkJZXN0aW1hdGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRHdWlkYW5jZSgpKTsKLQkJZXN0aW1hdGluZ01ldHJpY0VDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEd1aWRhbmNlKCkpOwotCQllc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnNFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRHdWlkYW5jZSgpKTsKLQkJZXhhbXBsZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEd1aWRhbmNlKCkpOwotCQlndWlkYW5jZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldENvbnRlbnRFbGVtZW50KCkpOwotCQlndWlkYW5jZURlc2NyaXB0aW9uRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0Q29udGVudERlc2NyaXB0aW9uKCkpOwotCQlndWlkZWxpbmVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRHdWlkYW5jZSgpKTsKLQkJaXRlcmF0aW9uRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0QWN0aXZpdHkoKSk7Ci0JCWtpbmRFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRDb250ZW50RWxlbWVudCgpKTsKLQkJbWV0aG9kQ29uZmlndXJhdGlvbkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldE1ldGhvZFVuaXQoKSk7Ci0JCW1ldGhvZEVsZW1lbnRFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRQYWNrYWdlYWJsZUVsZW1lbnQoKSk7Ci0JCW1ldGhvZEVsZW1lbnRQcm9wZXJ0eUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFBhY2thZ2VhYmxlRWxlbWVudCgpKTsKLQkJbWV0aG9kTGlicmFyeUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldE1ldGhvZFVuaXQoKSk7Ci0JCW1ldGhvZFBhY2thZ2VFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRNZXRob2RFbGVtZW50KCkpOwotCQltZXRob2RQbHVnaW5FQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRNZXRob2RVbml0KCkpOwotCQltZXRob2RVbml0RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0TWV0aG9kRWxlbWVudCgpKTsKLQkJbWlsZXN0b25lRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0V29ya0JyZWFrZG93bkVsZW1lbnQoKSk7Ci0JCW5hbWVkRWxlbWVudEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEVsZW1lbnQoKSk7Ci0JCW91dGNvbWVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRXb3JrUHJvZHVjdCgpKTsKLQkJcGFja2FnZWFibGVFbGVtZW50RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0TmFtZWRFbGVtZW50KCkpOwotCQlwaGFzZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEFjdGl2aXR5KCkpOwotCQlwbGFubmluZ0RhdGFFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRQcm9jZXNzRWxlbWVudCgpKTsKLQkJcHJhY3RpY2VFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRHdWlkYW5jZSgpKTsKLQkJcHJhY3RpY2VEZXNjcmlwdGlvbkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldENvbnRlbnREZXNjcmlwdGlvbigpKTsKLQkJcHJvY2Vzc0VDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEFjdGl2aXR5KCkpOwotCQlwcm9jZXNzQ29tcG9uZW50RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0UHJvY2Vzc1BhY2thZ2UoKSk7Ci0JCXByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRCcmVha2Rvd25FbGVtZW50KCkpOwotCQlwcm9jZXNzRGVzY3JpcHRpb25FQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRBY3Rpdml0eURlc2NyaXB0aW9uKCkpOwotCQlwcm9jZXNzRWxlbWVudEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldERlc2NyaWJhYmxlRWxlbWVudCgpKTsKLQkJcHJvY2Vzc1BhY2thZ2VFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRNZXRob2RQYWNrYWdlKCkpOwotCQlwcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFByb2Nlc3MoKSk7Ci0JCXJlcG9ydEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEd1aWRhbmNlKCkpOwotCQlyZXVzYWJsZUFzc2V0RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0R3VpZGFuY2UoKSk7Ci0JCXJvYWRtYXBFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRHdWlkYW5jZSgpKTsKLQkJcm9sZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldENvbnRlbnRFbGVtZW50KCkpOwotCQlyb2xlRGVzY3JpcHRpb25FQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRDb250ZW50RGVzY3JpcHRpb24oKSk7Ci0JCXJvbGVEZXNjcmlwdG9yRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0RGVzY3JpcHRvcigpKTsKLQkJcm9sZVNldEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldENvbnRlbnRDYXRlZ29yeSgpKTsKLQkJcm9sZVNldEdyb3VwaW5nRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0Q29udGVudENhdGVnb3J5KCkpOwotCQlzZWN0aW9uRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0TWV0aG9kRWxlbWVudCgpKTsKLQkJc3VwcG9ydGluZ01hdGVyaWFsRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0R3VpZGFuY2UoKSk7Ci0JCXRhc2tFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRDb250ZW50RWxlbWVudCgpKTsKLQkJdGFza0Rlc2NyaXB0aW9uRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0Q29udGVudERlc2NyaXB0aW9uKCkpOwotCQl0YXNrRGVzY3JpcHRvckVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFdvcmtCcmVha2Rvd25FbGVtZW50KCkpOwotCQl0ZWFtUHJvZmlsZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEJyZWFrZG93bkVsZW1lbnQoKSk7Ci0JCXRlbXBsYXRlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0R3VpZGFuY2UoKSk7Ci0JCXRlcm1EZWZpbml0aW9uRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0R3VpZGFuY2UoKSk7Ci0JCXRvb2xFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRDb250ZW50Q2F0ZWdvcnkoKSk7Ci0JCXRvb2xNZW50b3JFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRHdWlkYW5jZSgpKTsKLQkJd2hpdGVwYXBlckVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldENvbmNlcHQoKSk7Ci0JCXdvcmtCcmVha2Rvd25FbGVtZW50RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0QnJlYWtkb3duRWxlbWVudCgpKTsKLQkJd29ya0RlZmluaXRpb25FQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRNZXRob2RFbGVtZW50KCkpOwotCQl3b3JrUHJvZHVjdEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldENvbnRlbnRFbGVtZW50KCkpOwotCQl3b3JrUHJvZHVjdERlc2NyaXB0aW9uRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0Q29udGVudERlc2NyaXB0aW9uKCkpOwotCQl3b3JrUHJvZHVjdERlc2NyaXB0b3JFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXREZXNjcmlwdG9yKCkpOwotCQl3b3JrUHJvZHVjdFR5cGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRDb250ZW50Q2F0ZWdvcnkoKSk7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBjbGFzc2VzIGFuZCBmZWF0dXJlczsgYWRkIG9wZXJhdGlvbnMgYW5kIHBhcmFtZXRlcnMKLQkJaW5pdEVDbGFzcyhhY3Rpdml0eUVDbGFzcywgQWN0aXZpdHkuY2xhc3MsICJBY3Rpdml0eSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0QWN0aXZpdHlfUHJlY29uZGl0aW9uKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAicHJlY29uZGl0aW9uIiwgbnVsbCwgMCwgMSwgQWN0aXZpdHkuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEFjdGl2aXR5X1Bvc3Rjb25kaXRpb24oKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJwb3N0Y29uZGl0aW9uIiwgbnVsbCwgMCwgMSwgQWN0aXZpdHkuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEFjdGl2aXR5X0dyb3VwMygpLCBlY29yZVBhY2thZ2UuZ2V0RUZlYXR1cmVNYXBFbnRyeSgpLCAiZ3JvdXAzIiwgbnVsbCwgMCwgLTEsIEFjdGl2aXR5LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0QWN0aXZpdHlfQnJlYWtkb3duRWxlbWVudCgpLCB0aGlzLmdldEJyZWFrZG93bkVsZW1lbnQoKSwgbnVsbCwgImJyZWFrZG93bkVsZW1lbnQiLCBudWxsLCAwLCAtMSwgQWN0aXZpdHkuY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEFjdGl2aXR5X1JvYWRtYXAoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJyb2FkbWFwIiwgbnVsbCwgMCwgLTEsIEFjdGl2aXR5LmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0QWN0aXZpdHlfSXNFbmFjdGFibGUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0Qm9vbGVhbigpLCAiaXNFbmFjdGFibGUiLCBudWxsLCAwLCAxLCBBY3Rpdml0eS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRBY3Rpdml0eV9WYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAidmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCIsIG51bGwsIDAsIDEsIEFjdGl2aXR5LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRBY3Rpdml0eV9WYXJpYWJpbGl0eVR5cGUoKSwgdGhpcy5nZXRWYXJpYWJpbGl0eVR5cGUoKSwgInZhcmlhYmlsaXR5VHlwZSIsICJuYSIsIDAsIDEsIEFjdGl2aXR5LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhhY3Rpdml0eURlc2NyaXB0aW9uRUNsYXNzLCBBY3Rpdml0eURlc2NyaXB0aW9uLmNsYXNzLCAiQWN0aXZpdHlEZXNjcmlwdGlvbiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0QWN0aXZpdHlEZXNjcmlwdGlvbl9BbHRlcm5hdGl2ZXMoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJhbHRlcm5hdGl2ZXMiLCBudWxsLCAwLCAxLCBBY3Rpdml0eURlc2NyaXB0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRBY3Rpdml0eURlc2NyaXB0aW9uX0hvd1RvU3RhZmYoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJob3dUb1N0YWZmIiwgbnVsbCwgMCwgMSwgQWN0aXZpdHlEZXNjcmlwdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0QWN0aXZpdHlEZXNjcmlwdGlvbl9QdXJwb3NlKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAicHVycG9zZSIsIG51bGwsIDAsIDEsIEFjdGl2aXR5RGVzY3JpcHRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhhcHBsaWNhYmxlTWV0YUNsYXNzSW5mb0VDbGFzcywgQXBwbGljYWJsZU1ldGFDbGFzc0luZm8uY2xhc3MsICJBcHBsaWNhYmxlTWV0YUNsYXNzSW5mbyIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0QXBwbGljYWJsZU1ldGFDbGFzc0luZm9fSXNQcmltYXJ5RXh0ZW5zaW9uKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldEJvb2xlYW4oKSwgImlzUHJpbWFyeUV4dGVuc2lvbiIsIG51bGwsIDAsIDEsIEFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhhcnRpZmFjdEVDbGFzcywgQXJ0aWZhY3QuY2xhc3MsICJBcnRpZmFjdCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0QXJ0aWZhY3RfR3JvdXAzKCksIGVjb3JlUGFja2FnZS5nZXRFRmVhdHVyZU1hcEVudHJ5KCksICJncm91cDMiLCBudWxsLCAwLCAtMSwgQXJ0aWZhY3QuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRBcnRpZmFjdF9Db250YWluZWRBcnRpZmFjdCgpLCB0aGlzLmdldEFydGlmYWN0KCksIG51bGwsICJjb250YWluZWRBcnRpZmFjdCIsIG51bGwsIDAsIC0xLCBBcnRpZmFjdC5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKGFydGlmYWN0RGVzY3JpcHRpb25FQ2xhc3MsIEFydGlmYWN0RGVzY3JpcHRpb24uY2xhc3MsICJBcnRpZmFjdERlc2NyaXB0aW9uIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRBcnRpZmFjdERlc2NyaXB0aW9uX0JyaWVmT3V0bGluZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgImJyaWVmT3V0bGluZSIsIG51bGwsIDAsIDEsIEFydGlmYWN0RGVzY3JpcHRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEFydGlmYWN0RGVzY3JpcHRpb25fUmVwcmVzZW50YXRpb25PcHRpb25zKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAicmVwcmVzZW50YXRpb25PcHRpb25zIiwgbnVsbCwgMCwgMSwgQXJ0aWZhY3REZXNjcmlwdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0QXJ0aWZhY3REZXNjcmlwdGlvbl9SZXByZXNlbnRhdGlvbigpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgInJlcHJlc2VudGF0aW9uIiwgbnVsbCwgMCwgMSwgQXJ0aWZhY3REZXNjcmlwdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0QXJ0aWZhY3REZXNjcmlwdGlvbl9Ob3RhdGlvbigpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgIm5vdGF0aW9uIiwgbnVsbCwgMCwgMSwgQXJ0aWZhY3REZXNjcmlwdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKGJyZWFrZG93bkVsZW1lbnRFQ2xhc3MsIEJyZWFrZG93bkVsZW1lbnQuY2xhc3MsICJCcmVha2Rvd25FbGVtZW50IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRCcmVha2Rvd25FbGVtZW50X1ByZXNlbnRlZEFmdGVyKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAicHJlc2VudGVkQWZ0ZXIiLCBudWxsLCAwLCAxLCBCcmVha2Rvd25FbGVtZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRCcmVha2Rvd25FbGVtZW50X1ByZXNlbnRlZEJlZm9yZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgInByZXNlbnRlZEJlZm9yZSIsIG51bGwsIDAsIDEsIEJyZWFrZG93bkVsZW1lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEJyZWFrZG93bkVsZW1lbnRfUGxhbm5pbmdEYXRhKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAicGxhbm5pbmdEYXRhIiwgbnVsbCwgMCwgMSwgQnJlYWtkb3duRWxlbWVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0QnJlYWtkb3duRWxlbWVudF9TdXBlckFjdGl2aXR5KCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAic3VwZXJBY3Rpdml0eSIsIG51bGwsIDAsIDEsIEJyZWFrZG93bkVsZW1lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEJyZWFrZG93bkVsZW1lbnRfR3JvdXAxKCksIGVjb3JlUGFja2FnZS5nZXRFRmVhdHVyZU1hcEVudHJ5KCksICJncm91cDEiLCBudWxsLCAwLCAtMSwgQnJlYWtkb3duRWxlbWVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEJyZWFrZG93bkVsZW1lbnRfQ2hlY2tsaXN0KCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAiY2hlY2tsaXN0IiwgbnVsbCwgMCwgLTEsIEJyZWFrZG93bkVsZW1lbnQuY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRCcmVha2Rvd25FbGVtZW50X0NvbmNlcHQoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJjb25jZXB0IiwgbnVsbCwgMCwgLTEsIEJyZWFrZG93bkVsZW1lbnQuY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRCcmVha2Rvd25FbGVtZW50X0V4YW1wbGUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJleGFtcGxlIiwgbnVsbCwgMCwgLTEsIEJyZWFrZG93bkVsZW1lbnQuY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRCcmVha2Rvd25FbGVtZW50X0d1aWRlbGluZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgImd1aWRlbGluZSIsIG51bGwsIDAsIC0xLCBCcmVha2Rvd25FbGVtZW50LmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0QnJlYWtkb3duRWxlbWVudF9SZXVzYWJsZUFzc2V0KCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAicmV1c2FibGVBc3NldCIsIG51bGwsIDAsIC0xLCBCcmVha2Rvd25FbGVtZW50LmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0QnJlYWtkb3duRWxlbWVudF9TdXBwb3J0aW5nTWF0ZXJpYWwoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJzdXBwb3J0aW5nTWF0ZXJpYWwiLCBudWxsLCAwLCAtMSwgQnJlYWtkb3duRWxlbWVudC5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEJyZWFrZG93bkVsZW1lbnRfV2hpdGVwYXBlcigpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgIndoaXRlcGFwZXIiLCBudWxsLCAwLCAtMSwgQnJlYWtkb3duRWxlbWVudC5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEJyZWFrZG93bkVsZW1lbnRfSGFzTXVsdGlwbGVPY2N1cnJlbmNlcygpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRCb29sZWFuKCksICJoYXNNdWx0aXBsZU9jY3VycmVuY2VzIiwgbnVsbCwgMCwgMSwgQnJlYWtkb3duRWxlbWVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRCcmVha2Rvd25FbGVtZW50X0lzT3B0aW9uYWwoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0Qm9vbGVhbigpLCAiaXNPcHRpb25hbCIsIG51bGwsIDAsIDEsIEJyZWFrZG93bkVsZW1lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0QnJlYWtkb3duRWxlbWVudF9Jc1BsYW5uZWQoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0Qm9vbGVhbigpLCAiaXNQbGFubmVkIiwgbnVsbCwgMCwgMSwgQnJlYWtkb3duRWxlbWVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRCcmVha2Rvd25FbGVtZW50X1ByZWZpeCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgInByZWZpeCIsIG51bGwsIDAsIDEsIEJyZWFrZG93bkVsZW1lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhicmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb25FQ2xhc3MsIEJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbi5jbGFzcywgIkJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0QnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uX1VzYWdlR3VpZGFuY2UoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJ1c2FnZUd1aWRhbmNlIiwgbnVsbCwgMCwgMSwgQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoY2FwYWJpbGl0eVBhdHRlcm5FQ2xhc3MsIENhcGFiaWxpdHlQYXR0ZXJuLmNsYXNzLCAiQ2FwYWJpbGl0eVBhdHRlcm4iLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0KLQkJaW5pdEVDbGFzcyhjaGVja2xpc3RFQ2xhc3MsIENoZWNrbGlzdC5jbGFzcywgIkNoZWNrbGlzdCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQotCQlpbml0RUNsYXNzKGNvbXBvc2l0ZVJvbGVFQ2xhc3MsIENvbXBvc2l0ZVJvbGUuY2xhc3MsICJDb21wb3NpdGVSb2xlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRDb21wb3NpdGVSb2xlX0dyb3VwMigpLCBlY29yZVBhY2thZ2UuZ2V0RUZlYXR1cmVNYXBFbnRyeSgpLCAiZ3JvdXAyIiwgbnVsbCwgMCwgLTEsIENvbXBvc2l0ZVJvbGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRDb21wb3NpdGVSb2xlX0FnZ3JlZ2F0ZWRSb2xlKCksIHRoaXMuZ2V0Um9sZSgpLCBudWxsLCAiYWdncmVnYXRlZFJvbGUiLCBudWxsLCAwLCAtMSwgQ29tcG9zaXRlUm9sZS5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKGNvbmNlcHRFQ2xhc3MsIENvbmNlcHQuY2xhc3MsICJDb25jZXB0IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0JCWluaXRFQ2xhc3MoY29uc3RyYWludEVDbGFzcywgQ29uc3RyYWludC5jbGFzcywgIkNvbnN0cmFpbnQiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldENvbnN0cmFpbnRfTWFpbkRlc2NyaXB0aW9uKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAibWFpbkRlc2NyaXB0aW9uIiwgbnVsbCwgMCwgMSwgQ29uc3RyYWludC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKGNvbnRlbnRDYXRlZ29yeUVDbGFzcywgQ29udGVudENhdGVnb3J5LmNsYXNzLCAiQ29udGVudENhdGVnb3J5IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0JCWluaXRFQ2xhc3MoY29udGVudENhdGVnb3J5UGFja2FnZUVDbGFzcywgQ29udGVudENhdGVnb3J5UGFja2FnZS5jbGFzcywgIkNvbnRlbnRDYXRlZ29yeVBhY2thZ2UiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldENvbnRlbnRDYXRlZ29yeVBhY2thZ2VfR3JvdXAyKCksIGVjb3JlUGFja2FnZS5nZXRFRmVhdHVyZU1hcEVudHJ5KCksICJncm91cDIiLCBudWxsLCAwLCAtMSwgQ29udGVudENhdGVnb3J5UGFja2FnZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldENvbnRlbnRDYXRlZ29yeVBhY2thZ2VfQ29udGVudENhdGVnb3J5KCksIHRoaXMuZ2V0Q29udGVudENhdGVnb3J5KCksIG51bGwsICJjb250ZW50Q2F0ZWdvcnkiLCBudWxsLCAwLCAtMSwgQ29udGVudENhdGVnb3J5UGFja2FnZS5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKGNvbnRlbnREZXNjcmlwdGlvbkVDbGFzcywgQ29udGVudERlc2NyaXB0aW9uLmNsYXNzLCAiQ29udGVudERlc2NyaXB0aW9uIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRDb250ZW50RGVzY3JpcHRpb25fTWFpbkRlc2NyaXB0aW9uKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAibWFpbkRlc2NyaXB0aW9uIiwgbnVsbCwgMCwgMSwgQ29udGVudERlc2NyaXB0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRDb250ZW50RGVzY3JpcHRpb25fS2V5Q29uc2lkZXJhdGlvbnMoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJrZXlDb25zaWRlcmF0aW9ucyIsIG51bGwsIDAsIDEsIENvbnRlbnREZXNjcmlwdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0Q29udGVudERlc2NyaXB0aW9uX1NlY3Rpb24oKSwgdGhpcy5nZXRTZWN0aW9uKCksIG51bGwsICJzZWN0aW9uIiwgbnVsbCwgMCwgLTEsIENvbnRlbnREZXNjcmlwdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0Q29udGVudERlc2NyaXB0aW9uX0V4dGVybmFsSWQoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJleHRlcm5hbElkIiwgbnVsbCwgMCwgMSwgQ29udGVudERlc2NyaXB0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoY29udGVudEVsZW1lbnRFQ2xhc3MsIENvbnRlbnRFbGVtZW50LmNsYXNzLCAiQ29udGVudEVsZW1lbnQiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldENvbnRlbnRFbGVtZW50X0dyb3VwMSgpLCBlY29yZVBhY2thZ2UuZ2V0RUZlYXR1cmVNYXBFbnRyeSgpLCAiZ3JvdXAxIiwgbnVsbCwgMCwgLTEsIENvbnRlbnRFbGVtZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0Q29udGVudEVsZW1lbnRfQ2hlY2tsaXN0KCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAiY2hlY2tsaXN0IiwgbnVsbCwgMCwgLTEsIENvbnRlbnRFbGVtZW50LmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0Q29udGVudEVsZW1lbnRfQ29uY2VwdCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgImNvbmNlcHQiLCBudWxsLCAwLCAtMSwgQ29udGVudEVsZW1lbnQuY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRDb250ZW50RWxlbWVudF9FeGFtcGxlKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAiZXhhbXBsZSIsIG51bGwsIDAsIC0xLCBDb250ZW50RWxlbWVudC5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldENvbnRlbnRFbGVtZW50X0d1aWRlbGluZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgImd1aWRlbGluZSIsIG51bGwsIDAsIC0xLCBDb250ZW50RWxlbWVudC5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldENvbnRlbnRFbGVtZW50X1JldXNhYmxlQXNzZXQoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJyZXVzYWJsZUFzc2V0IiwgbnVsbCwgMCwgLTEsIENvbnRlbnRFbGVtZW50LmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0Q29udGVudEVsZW1lbnRfU3VwcG9ydGluZ01hdGVyaWFsKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAic3VwcG9ydGluZ01hdGVyaWFsIiwgbnVsbCwgMCwgLTEsIENvbnRlbnRFbGVtZW50LmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0Q29udGVudEVsZW1lbnRfV2hpdGVwYXBlcigpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgIndoaXRlcGFwZXIiLCBudWxsLCAwLCAtMSwgQ29udGVudEVsZW1lbnQuY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRDb250ZW50RWxlbWVudF9WYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAidmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCIsIG51bGwsIDAsIDEsIENvbnRlbnRFbGVtZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRDb250ZW50RWxlbWVudF9WYXJpYWJpbGl0eVR5cGUoKSwgdGhpcy5nZXRWYXJpYWJpbGl0eVR5cGUoKSwgInZhcmlhYmlsaXR5VHlwZSIsICJuYSIsIDAsIDEsIENvbnRlbnRFbGVtZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhjb250ZW50UGFja2FnZUVDbGFzcywgQ29udGVudFBhY2thZ2UuY2xhc3MsICJDb250ZW50UGFja2FnZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0Q29udGVudFBhY2thZ2VfR3JvdXAyKCksIGVjb3JlUGFja2FnZS5nZXRFRmVhdHVyZU1hcEVudHJ5KCksICJncm91cDIiLCBudWxsLCAwLCAtMSwgQ29udGVudFBhY2thZ2UuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRDb250ZW50UGFja2FnZV9Db250ZW50RWxlbWVudCgpLCB0aGlzLmdldENvbnRlbnRFbGVtZW50KCksIG51bGwsICJjb250ZW50RWxlbWVudCIsIG51bGwsIDAsIC0xLCBDb250ZW50UGFja2FnZS5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKGN1c3RvbUNhdGVnb3J5RUNsYXNzLCBDdXN0b21DYXRlZ29yeS5jbGFzcywgIkN1c3RvbUNhdGVnb3J5IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRDdXN0b21DYXRlZ29yeV9Hcm91cDIoKSwgZWNvcmVQYWNrYWdlLmdldEVGZWF0dXJlTWFwRW50cnkoKSwgImdyb3VwMiIsIG51bGwsIDAsIC0xLCBDdXN0b21DYXRlZ29yeS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEN1c3RvbUNhdGVnb3J5X0NhdGVnb3JpemVkRWxlbWVudCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgImNhdGVnb3JpemVkRWxlbWVudCIsIG51bGwsIDAsIC0xLCBDdXN0b21DYXRlZ29yeS5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEN1c3RvbUNhdGVnb3J5X1N1YkNhdGVnb3J5KCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAic3ViQ2F0ZWdvcnkiLCBudWxsLCAwLCAtMSwgQ3VzdG9tQ2F0ZWdvcnkuY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoZGVsaXZlcmFibGVFQ2xhc3MsIERlbGl2ZXJhYmxlLmNsYXNzLCAiRGVsaXZlcmFibGUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldERlbGl2ZXJhYmxlX0dyb3VwMygpLCBlY29yZVBhY2thZ2UuZ2V0RUZlYXR1cmVNYXBFbnRyeSgpLCAiZ3JvdXAzIiwgbnVsbCwgMCwgLTEsIERlbGl2ZXJhYmxlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RGVsaXZlcmFibGVfRGVsaXZlcmVkV29ya1Byb2R1Y3QoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJkZWxpdmVyZWRXb3JrUHJvZHVjdCIsIG51bGwsIDAsIC0xLCBEZWxpdmVyYWJsZS5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhkZWxpdmVyYWJsZURlc2NyaXB0aW9uRUNsYXNzLCBEZWxpdmVyYWJsZURlc2NyaXB0aW9uLmNsYXNzLCAiRGVsaXZlcmFibGVEZXNjcmlwdGlvbiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RGVsaXZlcmFibGVEZXNjcmlwdGlvbl9FeHRlcm5hbERlc2NyaXB0aW9uKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAiZXh0ZXJuYWxEZXNjcmlwdGlvbiIsIG51bGwsIDAsIDEsIERlbGl2ZXJhYmxlRGVzY3JpcHRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldERlbGl2ZXJhYmxlRGVzY3JpcHRpb25fUGFja2FnaW5nR3VpZGFuY2UoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJwYWNrYWdpbmdHdWlkYW5jZSIsIG51bGwsIDAsIDEsIERlbGl2ZXJhYmxlRGVzY3JpcHRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhkZWxpdmVyeVByb2Nlc3NFQ2xhc3MsIERlbGl2ZXJ5UHJvY2Vzcy5jbGFzcywgIkRlbGl2ZXJ5UHJvY2VzcyIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RGVsaXZlcnlQcm9jZXNzX0dyb3VwNCgpLCBlY29yZVBhY2thZ2UuZ2V0RUZlYXR1cmVNYXBFbnRyeSgpLCAiZ3JvdXA0IiwgbnVsbCwgMCwgLTEsIERlbGl2ZXJ5UHJvY2Vzcy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldERlbGl2ZXJ5UHJvY2Vzc19Db21tdW5pY2F0aW9uc01hdGVyaWFsKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAiY29tbXVuaWNhdGlvbnNNYXRlcmlhbCIsIG51bGwsIDAsIC0xLCBEZWxpdmVyeVByb2Nlc3MuY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXREZWxpdmVyeVByb2Nlc3NfRWR1Y2F0aW9uTWF0ZXJpYWwoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJlZHVjYXRpb25NYXRlcmlhbCIsIG51bGwsIDAsIC0xLCBEZWxpdmVyeVByb2Nlc3MuY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoZGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25FQ2xhc3MsIERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uLmNsYXNzLCAiRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24iLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX1NjYWxlKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAic2NhbGUiLCBudWxsLCAwLCAxLCBEZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fUHJvamVjdENoYXJhY3RlcmlzdGljcygpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgInByb2plY3RDaGFyYWN0ZXJpc3RpY3MiLCBudWxsLCAwLCAxLCBEZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fUmlza0xldmVsKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAicmlza0xldmVsIiwgbnVsbCwgMCwgMSwgRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX0VzdGltYXRpbmdUZWNobmlxdWUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJlc3RpbWF0aW5nVGVjaG5pcXVlIiwgbnVsbCwgMCwgMSwgRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX1Byb2plY3RNZW1iZXJFeHBlcnRpc2UoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJwcm9qZWN0TWVtYmVyRXhwZXJ0aXNlIiwgbnVsbCwgMCwgMSwgRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX1R5cGVPZkNvbnRyYWN0KCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAidHlwZU9mQ29udHJhY3QiLCBudWxsLCAwLCAxLCBEZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKGRlc2NyaWJhYmxlRWxlbWVudEVDbGFzcywgRGVzY3JpYmFibGVFbGVtZW50LmNsYXNzLCAiRGVzY3JpYmFibGVFbGVtZW50IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RVJlZmVyZW5jZShnZXREZXNjcmliYWJsZUVsZW1lbnRfUHJlc2VudGF0aW9uKCksIHRoaXMuZ2V0Q29udGVudERlc2NyaXB0aW9uKCksIG51bGwsICJwcmVzZW50YXRpb24iLCBudWxsLCAwLCAxLCBEZXNjcmliYWJsZUVsZW1lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldERlc2NyaWJhYmxlRWxlbWVudF9GdWxmaWxsKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAiZnVsZmlsbCIsIG51bGwsIDAsIC0xLCBEZXNjcmliYWJsZUVsZW1lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXREZXNjcmliYWJsZUVsZW1lbnRfSXNBYnN0cmFjdCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRCb29sZWFuKCksICJpc0Fic3RyYWN0IiwgbnVsbCwgMCwgMSwgRGVzY3JpYmFibGVFbGVtZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldERlc2NyaWJhYmxlRWxlbWVudF9Ob2RlaWNvbigpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgIm5vZGVpY29uIiwgbnVsbCwgMCwgMSwgRGVzY3JpYmFibGVFbGVtZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXREZXNjcmliYWJsZUVsZW1lbnRfU2hhcGVpY29uKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAic2hhcGVpY29uIiwgbnVsbCwgMCwgMSwgRGVzY3JpYmFibGVFbGVtZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoZGVzY3JpcHRvckVDbGFzcywgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVzY3JpcHRvci5jbGFzcywgIkRlc2NyaXB0b3IiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldERlc2NyaXB0b3JfSXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldEJvb2xlYW4oKSwgImlzU3luY2hyb25pemVkV2l0aFNvdXJjZSIsIG51bGwsIDAsIDEsIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlc2NyaXB0b3IuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKGRlc2NyaXB0b3JEZXNjcmlwdGlvbkVDbGFzcywgRGVzY3JpcHRvckRlc2NyaXB0aW9uLmNsYXNzLCAiRGVzY3JpcHRvckRlc2NyaXB0aW9uIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXREZXNjcmlwdG9yRGVzY3JpcHRpb25fUmVmaW5lZERlc2NyaXB0aW9uKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAicmVmaW5lZERlc2NyaXB0aW9uIiwgbnVsbCwgMCwgMSwgRGVzY3JpcHRvckRlc2NyaXB0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoZGlzY2lwbGluZUVDbGFzcywgRGlzY2lwbGluZS5jbGFzcywgIkRpc2NpcGxpbmUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldERpc2NpcGxpbmVfR3JvdXAyKCksIGVjb3JlUGFja2FnZS5nZXRFRmVhdHVyZU1hcEVudHJ5KCksICJncm91cDIiLCBudWxsLCAwLCAtMSwgRGlzY2lwbGluZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldERpc2NpcGxpbmVfVGFzaygpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgInRhc2siLCBudWxsLCAwLCAtMSwgRGlzY2lwbGluZS5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldERpc2NpcGxpbmVfU3ViRGlzY2lwbGluZSgpLCB0aGlzLmdldERpc2NpcGxpbmUoKSwgbnVsbCwgInN1YkRpc2NpcGxpbmUiLCBudWxsLCAwLCAtMSwgRGlzY2lwbGluZS5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RGlzY2lwbGluZV9SZWZlcmVuY2VXb3JrZmxvdygpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgInJlZmVyZW5jZVdvcmtmbG93IiwgbnVsbCwgMCwgLTEsIERpc2NpcGxpbmUuY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoZGlzY2lwbGluZUdyb3VwaW5nRUNsYXNzLCBEaXNjaXBsaW5lR3JvdXBpbmcuY2xhc3MsICJEaXNjaXBsaW5lR3JvdXBpbmciLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldERpc2NpcGxpbmVHcm91cGluZ19Hcm91cDIoKSwgZWNvcmVQYWNrYWdlLmdldEVGZWF0dXJlTWFwRW50cnkoKSwgImdyb3VwMiIsIG51bGwsIDAsIC0xLCBEaXNjaXBsaW5lR3JvdXBpbmcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXREaXNjaXBsaW5lR3JvdXBpbmdfRGlzY2lwbGluZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgImRpc2NpcGxpbmUiLCBudWxsLCAwLCAtMSwgRGlzY2lwbGluZUdyb3VwaW5nLmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKGRvY3VtZW50Um9vdEVDbGFzcywgRG9jdW1lbnRSb290LmNsYXNzLCAiRG9jdW1lbnRSb290IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXREb2N1bWVudFJvb3RfTWl4ZWQoKSwgZWNvcmVQYWNrYWdlLmdldEVGZWF0dXJlTWFwRW50cnkoKSwgIm1peGVkIiwgbnVsbCwgMCwgLTEsIG51bGwsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXREb2N1bWVudFJvb3RfWE1MTlNQcmVmaXhNYXAoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmdUb1N0cmluZ01hcEVudHJ5KCksIG51bGwsICJ4TUxOU1ByZWZpeE1hcCIsIG51bGwsIDAsIC0xLCBudWxsLCBJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldERvY3VtZW50Um9vdF9YU0lTY2hlbWFMb2NhdGlvbigpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZ1RvU3RyaW5nTWFwRW50cnkoKSwgbnVsbCwgInhTSVNjaGVtYUxvY2F0aW9uIiwgbnVsbCwgMCwgLTEsIG51bGwsIElTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0RG9jdW1lbnRSb290X01ldGhvZENvbmZpZ3VyYXRpb24oKSwgdGhpcy5nZXRNZXRob2RDb25maWd1cmF0aW9uKCksIG51bGwsICJtZXRob2RDb25maWd1cmF0aW9uIiwgbnVsbCwgMCwgLTIsIG51bGwsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldERvY3VtZW50Um9vdF9NZXRob2RMaWJyYXJ5KCksIHRoaXMuZ2V0TWV0aG9kTGlicmFyeSgpLCBudWxsLCAibWV0aG9kTGlicmFyeSIsIG51bGwsIDAsIC0yLCBudWxsLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXREb2N1bWVudFJvb3RfTWV0aG9kUGx1Z2luKCksIHRoaXMuZ2V0TWV0aG9kUGx1Z2luKCksIG51bGwsICJtZXRob2RQbHVnaW4iLCBudWxsLCAwLCAtMiwgbnVsbCwgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKGRvbWFpbkVDbGFzcywgRG9tYWluLmNsYXNzLCAiRG9tYWluIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXREb21haW5fR3JvdXAyKCksIGVjb3JlUGFja2FnZS5nZXRFRmVhdHVyZU1hcEVudHJ5KCksICJncm91cDIiLCBudWxsLCAwLCAtMSwgRG9tYWluLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RG9tYWluX1dvcmtQcm9kdWN0KCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAid29ya1Byb2R1Y3QiLCBudWxsLCAwLCAtMSwgRG9tYWluLmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0RG9tYWluX1N1YmRvbWFpbigpLCB0aGlzLmdldERvbWFpbigpLCBudWxsLCAic3ViZG9tYWluIiwgbnVsbCwgMCwgLTEsIERvbWFpbi5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKGVsZW1lbnRFQ2xhc3MsIEVsZW1lbnQuY2xhc3MsICJFbGVtZW50IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0JCWluaXRFQ2xhc3MoZXN0aW1hdGVFQ2xhc3MsIEVzdGltYXRlLmNsYXNzLCAiRXN0aW1hdGUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEVzdGltYXRlX0dyb3VwMigpLCBlY29yZVBhY2thZ2UuZ2V0RUZlYXR1cmVNYXBFbnRyeSgpLCAiZ3JvdXAyIiwgbnVsbCwgMCwgLTEsIEVzdGltYXRlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RXN0aW1hdGVfRXN0aW1hdGlvbk1ldHJpYygpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgImVzdGltYXRpb25NZXRyaWMiLCBudWxsLCAwLCAtMSwgRXN0aW1hdGUuY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRFc3RpbWF0ZV9Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJlc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMiLCBudWxsLCAwLCAtMSwgRXN0aW1hdGUuY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoZXN0aW1hdGluZ01ldHJpY0VDbGFzcywgRXN0aW1hdGluZ01ldHJpYy5jbGFzcywgIkVzdGltYXRpbmdNZXRyaWMiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0KLQkJaW5pdEVDbGFzcyhlc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnNFQ2xhc3MsIEVzdGltYXRpb25Db25zaWRlcmF0aW9ucy5jbGFzcywgIkVzdGltYXRpb25Db25zaWRlcmF0aW9ucyIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQotCQlpbml0RUNsYXNzKGV4YW1wbGVFQ2xhc3MsIEV4YW1wbGUuY2xhc3MsICJFeGFtcGxlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0JCWluaXRFQ2xhc3MoZ3VpZGFuY2VFQ2xhc3MsIEd1aWRhbmNlLmNsYXNzLCAiR3VpZGFuY2UiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0KLQkJaW5pdEVDbGFzcyhndWlkYW5jZURlc2NyaXB0aW9uRUNsYXNzLCBHdWlkYW5jZURlc2NyaXB0aW9uLmNsYXNzLCAiR3VpZGFuY2VEZXNjcmlwdGlvbiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0R3VpZGFuY2VEZXNjcmlwdGlvbl9BdHRhY2htZW50KCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAiYXR0YWNobWVudCIsIG51bGwsIDAsIDEsIEd1aWRhbmNlRGVzY3JpcHRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhndWlkZWxpbmVFQ2xhc3MsIEd1aWRlbGluZS5jbGFzcywgIkd1aWRlbGluZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQotCQlpbml0RUNsYXNzKGl0ZXJhdGlvbkVDbGFzcywgSXRlcmF0aW9uLmNsYXNzLCAiSXRlcmF0aW9uIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0JCWluaXRFQ2xhc3Moa2luZEVDbGFzcywgS2luZC5jbGFzcywgIktpbmQiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEtpbmRfQXBwbGljYWJsZU1ldGFDbGFzc0luZm8oKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJhcHBsaWNhYmxlTWV0YUNsYXNzSW5mbyIsIG51bGwsIDAsIC0xLCBLaW5kLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKG1ldGhvZENvbmZpZ3VyYXRpb25FQ2xhc3MsIE1ldGhvZENvbmZpZ3VyYXRpb24uY2xhc3MsICJNZXRob2RDb25maWd1cmF0aW9uIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRNZXRob2RDb25maWd1cmF0aW9uX0Jhc2VDb25maWd1cmF0aW9uKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAiYmFzZUNvbmZpZ3VyYXRpb24iLCBudWxsLCAwLCAtMSwgTWV0aG9kQ29uZmlndXJhdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldE1ldGhvZENvbmZpZ3VyYXRpb25fTWV0aG9kUGx1Z2luU2VsZWN0aW9uKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAibWV0aG9kUGx1Z2luU2VsZWN0aW9uIiwgbnVsbCwgMCwgLTEsIE1ldGhvZENvbmZpZ3VyYXRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRNZXRob2RDb25maWd1cmF0aW9uX01ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJtZXRob2RQYWNrYWdlU2VsZWN0aW9uIiwgbnVsbCwgMCwgLTEsIE1ldGhvZENvbmZpZ3VyYXRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRNZXRob2RDb25maWd1cmF0aW9uX0RlZmF1bHRWaWV3KCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAiZGVmYXVsdFZpZXciLCBudWxsLCAwLCAxLCBNZXRob2RDb25maWd1cmF0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRNZXRob2RDb25maWd1cmF0aW9uX1Byb2Nlc3NWaWV3KCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAicHJvY2Vzc1ZpZXciLCBudWxsLCAwLCAtMSwgTWV0aG9kQ29uZmlndXJhdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldE1ldGhvZENvbmZpZ3VyYXRpb25fU3VidHJhY3RlZENhdGVnb3J5KCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAic3VidHJhY3RlZENhdGVnb3J5IiwgbnVsbCwgMCwgLTEsIE1ldGhvZENvbmZpZ3VyYXRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRNZXRob2RDb25maWd1cmF0aW9uX0FkZGVkQ2F0ZWdvcnkoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJhZGRlZENhdGVnb3J5IiwgbnVsbCwgMCwgLTEsIE1ldGhvZENvbmZpZ3VyYXRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MobWV0aG9kRWxlbWVudEVDbGFzcywgTWV0aG9kRWxlbWVudC5jbGFzcywgIk1ldGhvZEVsZW1lbnQiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldE1ldGhvZEVsZW1lbnRfR3JvdXAoKSwgZWNvcmVQYWNrYWdlLmdldEVGZWF0dXJlTWFwRW50cnkoKSwgImdyb3VwIiwgbnVsbCwgMCwgLTEsIE1ldGhvZEVsZW1lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRNZXRob2RFbGVtZW50X093bmVkUnVsZSgpLCB0aGlzLmdldENvbnN0cmFpbnQoKSwgbnVsbCwgIm93bmVkUnVsZSIsIG51bGwsIDAsIC0xLCBNZXRob2RFbGVtZW50LmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRNZXRob2RFbGVtZW50X01ldGhvZEVsZW1lbnRQcm9wZXJ0eSgpLCB0aGlzLmdldE1ldGhvZEVsZW1lbnRQcm9wZXJ0eSgpLCBudWxsLCAibWV0aG9kRWxlbWVudFByb3BlcnR5IiwgbnVsbCwgMCwgLTEsIE1ldGhvZEVsZW1lbnQuY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldE1ldGhvZEVsZW1lbnRfQnJpZWZEZXNjcmlwdGlvbigpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgImJyaWVmRGVzY3JpcHRpb24iLCBudWxsLCAwLCAxLCBNZXRob2RFbGVtZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRNZXRob2RFbGVtZW50X0lkKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAiaWQiLCBudWxsLCAwLCAxLCBNZXRob2RFbGVtZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRNZXRob2RFbGVtZW50X09yZGVyaW5nR3VpZGUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJvcmRlcmluZ0d1aWRlIiwgbnVsbCwgMCwgMSwgTWV0aG9kRWxlbWVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TWV0aG9kRWxlbWVudF9QcmVzZW50YXRpb25OYW1lKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAicHJlc2VudGF0aW9uTmFtZSIsIG51bGwsIDAsIDEsIE1ldGhvZEVsZW1lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldE1ldGhvZEVsZW1lbnRfU3VwcHJlc3NlZCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRCb29sZWFuKCksICJzdXBwcmVzc2VkIiwgbnVsbCwgMCwgMSwgTWV0aG9kRWxlbWVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MobWV0aG9kRWxlbWVudFByb3BlcnR5RUNsYXNzLCBNZXRob2RFbGVtZW50UHJvcGVydHkuY2xhc3MsICJNZXRob2RFbGVtZW50UHJvcGVydHkiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldE1ldGhvZEVsZW1lbnRQcm9wZXJ0eV9WYWx1ZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgInZhbHVlIiwgbnVsbCwgMCwgMSwgTWV0aG9kRWxlbWVudFByb3BlcnR5LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MobWV0aG9kTGlicmFyeUVDbGFzcywgTWV0aG9kTGlicmFyeS5jbGFzcywgIk1ldGhvZExpYnJhcnkiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldE1ldGhvZExpYnJhcnlfTWV0aG9kUGx1Z2luKCksIHRoaXMuZ2V0TWV0aG9kUGx1Z2luKCksIG51bGwsICJtZXRob2RQbHVnaW4iLCBudWxsLCAwLCAtMSwgTWV0aG9kTGlicmFyeS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0TWV0aG9kTGlicmFyeV9NZXRob2RDb25maWd1cmF0aW9uKCksIHRoaXMuZ2V0TWV0aG9kQ29uZmlndXJhdGlvbigpLCBudWxsLCAibWV0aG9kQ29uZmlndXJhdGlvbiIsIG51bGwsIDAsIC0xLCBNZXRob2RMaWJyYXJ5LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRNZXRob2RMaWJyYXJ5X1Rvb2woKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJ0b29sIiwgbnVsbCwgMCwgMSwgTWV0aG9kTGlicmFyeS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKG1ldGhvZFBhY2thZ2VFQ2xhc3MsIE1ldGhvZFBhY2thZ2UuY2xhc3MsICJNZXRob2RQYWNrYWdlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRNZXRob2RQYWNrYWdlX0dyb3VwMSgpLCBlY29yZVBhY2thZ2UuZ2V0RUZlYXR1cmVNYXBFbnRyeSgpLCAiZ3JvdXAxIiwgbnVsbCwgMCwgLTEsIE1ldGhvZFBhY2thZ2UuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRNZXRob2RQYWNrYWdlX1JldXNlZFBhY2thZ2UoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJyZXVzZWRQYWNrYWdlIiwgbnVsbCwgMCwgLTEsIE1ldGhvZFBhY2thZ2UuY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRNZXRob2RQYWNrYWdlX01ldGhvZFBhY2thZ2UoKSwgdGhpcy5nZXRNZXRob2RQYWNrYWdlKCksIG51bGwsICJtZXRob2RQYWNrYWdlIiwgbnVsbCwgMCwgLTEsIE1ldGhvZFBhY2thZ2UuY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldE1ldGhvZFBhY2thZ2VfR2xvYmFsKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldEJvb2xlYW4oKSwgImdsb2JhbCIsIG51bGwsIDAsIDEsIE1ldGhvZFBhY2thZ2UuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKG1ldGhvZFBsdWdpbkVDbGFzcywgTWV0aG9kUGx1Z2luLmNsYXNzLCAiTWV0aG9kUGx1Z2luIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRNZXRob2RQbHVnaW5fUmVmZXJlbmNlZE1ldGhvZFBsdWdpbigpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgInJlZmVyZW5jZWRNZXRob2RQbHVnaW4iLCBudWxsLCAwLCAtMSwgTWV0aG9kUGx1Z2luLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0TWV0aG9kUGx1Z2luX01ldGhvZFBhY2thZ2UoKSwgdGhpcy5nZXRNZXRob2RQYWNrYWdlKCksIG51bGwsICJtZXRob2RQYWNrYWdlIiwgbnVsbCwgMCwgLTEsIE1ldGhvZFBsdWdpbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TWV0aG9kUGx1Z2luX1VzZXJDaGFuZ2VhYmxlKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldEJvb2xlYW4oKSwgInVzZXJDaGFuZ2VhYmxlIiwgbnVsbCwgMCwgMSwgTWV0aG9kUGx1Z2luLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhtZXRob2RVbml0RUNsYXNzLCBNZXRob2RVbml0LmNsYXNzLCAiTWV0aG9kVW5pdCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TWV0aG9kVW5pdF9Db3B5cmlnaHQoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJjb3B5cmlnaHQiLCBudWxsLCAwLCAxLCBNZXRob2RVbml0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRNZXRob2RVbml0X0F1dGhvcnMoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJhdXRob3JzIiwgbnVsbCwgMCwgMSwgTWV0aG9kVW5pdC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TWV0aG9kVW5pdF9DaGFuZ2VEYXRlKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldERhdGVUaW1lKCksICJjaGFuZ2VEYXRlIiwgbnVsbCwgMCwgMSwgTWV0aG9kVW5pdC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TWV0aG9kVW5pdF9DaGFuZ2VEZXNjcmlwdGlvbigpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgImNoYW5nZURlc2NyaXB0aW9uIiwgbnVsbCwgMCwgMSwgTWV0aG9kVW5pdC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TWV0aG9kVW5pdF9WZXJzaW9uKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAidmVyc2lvbiIsIG51bGwsIDAsIDEsIE1ldGhvZFVuaXQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhtaWxlc3RvbmVFQ2xhc3MsIE1pbGVzdG9uZS5jbGFzcywgIk1pbGVzdG9uZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TWlsZXN0b25lX1JlcXVpcmVkUmVzdWx0KCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAicmVxdWlyZWRSZXN1bHQiLCBudWxsLCAwLCAtMSwgTWlsZXN0b25lLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKG5hbWVkRWxlbWVudEVDbGFzcywgTmFtZWRFbGVtZW50LmNsYXNzLCAiTmFtZWRFbGVtZW50IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXROYW1lZEVsZW1lbnRfTmFtZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgIm5hbWUiLCBudWxsLCAwLCAxLCBOYW1lZEVsZW1lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhvdXRjb21lRUNsYXNzLCBPdXRjb21lLmNsYXNzLCAiT3V0Y29tZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQotCQlpbml0RUNsYXNzKHBhY2thZ2VhYmxlRWxlbWVudEVDbGFzcywgUGFja2FnZWFibGVFbGVtZW50LmNsYXNzLCAiUGFja2FnZWFibGVFbGVtZW50IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0JCWluaXRFQ2xhc3MocGhhc2VFQ2xhc3MsIFBoYXNlLmNsYXNzLCAiUGhhc2UiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0KLQkJaW5pdEVDbGFzcyhwbGFubmluZ0RhdGFFQ2xhc3MsIFBsYW5uaW5nRGF0YS5jbGFzcywgIlBsYW5uaW5nRGF0YSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UGxhbm5pbmdEYXRhX0ZpbmlzaERhdGUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0RGF0ZVRpbWUoKSwgImZpbmlzaERhdGUiLCBudWxsLCAwLCAxLCBQbGFubmluZ0RhdGEuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFBsYW5uaW5nRGF0YV9SYW5rKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAicmFuayIsIG51bGwsIDAsIDEsIFBsYW5uaW5nRGF0YS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UGxhbm5pbmdEYXRhX1N0YXJ0RGF0ZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXREYXRlVGltZSgpLCAic3RhcnREYXRlIiwgbnVsbCwgMCwgMSwgUGxhbm5pbmdEYXRhLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MocHJhY3RpY2VFQ2xhc3MsIFByYWN0aWNlLmNsYXNzLCAiUHJhY3RpY2UiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFByYWN0aWNlX0dyb3VwMigpLCBlY29yZVBhY2thZ2UuZ2V0RUZlYXR1cmVNYXBFbnRyeSgpLCAiZ3JvdXAyIiwgbnVsbCwgMCwgLTEsIFByYWN0aWNlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UHJhY3RpY2VfQWN0aXZpdHlSZWZlcmVuY2UoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJhY3Rpdml0eVJlZmVyZW5jZSIsIG51bGwsIDAsIC0xLCBQcmFjdGljZS5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFByYWN0aWNlX0NvbnRlbnRSZWZlcmVuY2UoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJjb250ZW50UmVmZXJlbmNlIiwgbnVsbCwgMCwgLTEsIFByYWN0aWNlLmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0UHJhY3RpY2VfU3ViUHJhY3RpY2UoKSwgdGhpcy5nZXRQcmFjdGljZSgpLCBudWxsLCAic3ViUHJhY3RpY2UiLCBudWxsLCAwLCAtMSwgUHJhY3RpY2UuY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhwcmFjdGljZURlc2NyaXB0aW9uRUNsYXNzLCBQcmFjdGljZURlc2NyaXB0aW9uLmNsYXNzLCAiUHJhY3RpY2VEZXNjcmlwdGlvbiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UHJhY3RpY2VEZXNjcmlwdGlvbl9BZGRpdGlvbmFsSW5mbygpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgImFkZGl0aW9uYWxJbmZvIiwgbnVsbCwgMCwgMSwgUHJhY3RpY2VEZXNjcmlwdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UHJhY3RpY2VEZXNjcmlwdGlvbl9BcHBsaWNhdGlvbigpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgImFwcGxpY2F0aW9uIiwgbnVsbCwgMCwgMSwgUHJhY3RpY2VEZXNjcmlwdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UHJhY3RpY2VEZXNjcmlwdGlvbl9CYWNrZ3JvdW5kKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAiYmFja2dyb3VuZCIsIG51bGwsIDAsIDEsIFByYWN0aWNlRGVzY3JpcHRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFByYWN0aWNlRGVzY3JpcHRpb25fR29hbHMoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJnb2FscyIsIG51bGwsIDAsIDEsIFByYWN0aWNlRGVzY3JpcHRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFByYWN0aWNlRGVzY3JpcHRpb25fTGV2ZWxzT2ZBZG9wdGlvbigpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgImxldmVsc09mQWRvcHRpb24iLCBudWxsLCAwLCAxLCBQcmFjdGljZURlc2NyaXB0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRQcmFjdGljZURlc2NyaXB0aW9uX1Byb2JsZW0oKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJwcm9ibGVtIiwgbnVsbCwgMCwgMSwgUHJhY3RpY2VEZXNjcmlwdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHByb2Nlc3NFQ2xhc3MsIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3MuY2xhc3MsICJQcm9jZXNzIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRQcm9jZXNzX0luY2x1ZGVzUGF0dGVybigpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgImluY2x1ZGVzUGF0dGVybiIsIG51bGwsIDAsIC0xLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UHJvY2Vzc19EZWZhdWx0Q29udGV4dCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgImRlZmF1bHRDb250ZXh0IiwgbnVsbCwgMCwgMSwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzcy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UHJvY2Vzc19WYWxpZENvbnRleHQoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJ2YWxpZENvbnRleHQiLCBudWxsLCAwLCAtMSwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzcy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFByb2Nlc3NfRGlhZ3JhbVVSSSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgImRpYWdyYW1VUkkiLCBudWxsLCAwLCAxLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MocHJvY2Vzc0NvbXBvbmVudEVDbGFzcywgUHJvY2Vzc0NvbXBvbmVudC5jbGFzcywgIlByb2Nlc3NDb21wb25lbnQiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFByb2Nlc3NDb21wb25lbnRfQ29weXJpZ2h0KCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAiY29weXJpZ2h0IiwgbnVsbCwgMCwgMSwgUHJvY2Vzc0NvbXBvbmVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0UHJvY2Vzc0NvbXBvbmVudF9JbnRlcmZhY2UoKSwgdGhpcy5nZXRQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlKCksIG51bGwsICJpbnRlcmZhY2UiLCBudWxsLCAwLCAxLCBQcm9jZXNzQ29tcG9uZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRQcm9jZXNzQ29tcG9uZW50X1Byb2Nlc3MoKSwgdGhpcy5nZXRQcm9jZXNzKCksIG51bGwsICJwcm9jZXNzIiwgbnVsbCwgMSwgMSwgUHJvY2Vzc0NvbXBvbmVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UHJvY2Vzc0NvbXBvbmVudF9BdXRob3JzKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAiYXV0aG9ycyIsIG51bGwsIDAsIDEsIFByb2Nlc3NDb21wb25lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFByb2Nlc3NDb21wb25lbnRfQ2hhbmdlRGF0ZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXREYXRlVGltZSgpLCAiY2hhbmdlRGF0ZSIsIG51bGwsIDAsIDEsIFByb2Nlc3NDb21wb25lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFByb2Nlc3NDb21wb25lbnRfQ2hhbmdlRGVzY3JpcHRpb24oKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJjaGFuZ2VEZXNjcmlwdGlvbiIsIG51bGwsIDAsIDEsIFByb2Nlc3NDb21wb25lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFByb2Nlc3NDb21wb25lbnRfVmVyc2lvbigpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgInZlcnNpb24iLCBudWxsLCAwLCAxLCBQcm9jZXNzQ29tcG9uZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MocHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZUVDbGFzcywgUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZS5jbGFzcywgIlByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VfR3JvdXAyKCksIGVjb3JlUGFja2FnZS5nZXRFRmVhdHVyZU1hcEVudHJ5KCksICJncm91cDIiLCBudWxsLCAwLCAtMSwgUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VfSW50ZXJmYWNlU3BlY2lmaWNhdGlvbigpLCB0aGlzLmdldFRhc2tEZXNjcmlwdG9yKCksIG51bGwsICJpbnRlcmZhY2VTcGVjaWZpY2F0aW9uIiwgbnVsbCwgMCwgLTEsIFByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UuY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VfSW50ZXJmYWNlSU8oKSwgdGhpcy5nZXRXb3JrUHJvZHVjdERlc2NyaXB0b3IoKSwgbnVsbCwgImludGVyZmFjZUlPIiwgbnVsbCwgMCwgLTEsIFByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UuY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhwcm9jZXNzRGVzY3JpcHRpb25FQ2xhc3MsIFByb2Nlc3NEZXNjcmlwdGlvbi5jbGFzcywgIlByb2Nlc3NEZXNjcmlwdGlvbiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UHJvY2Vzc0Rlc2NyaXB0aW9uX1Njb3BlKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAic2NvcGUiLCBudWxsLCAwLCAxLCBQcm9jZXNzRGVzY3JpcHRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFByb2Nlc3NEZXNjcmlwdGlvbl9Vc2FnZU5vdGVzKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAidXNhZ2VOb3RlcyIsIG51bGwsIDAsIDEsIFByb2Nlc3NEZXNjcmlwdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHByb2Nlc3NFbGVtZW50RUNsYXNzLCBQcm9jZXNzRWxlbWVudC5jbGFzcywgIlByb2Nlc3NFbGVtZW50IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0JCWluaXRFQ2xhc3MocHJvY2Vzc1BhY2thZ2VFQ2xhc3MsIFByb2Nlc3NQYWNrYWdlLmNsYXNzLCAiUHJvY2Vzc1BhY2thZ2UiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFByb2Nlc3NQYWNrYWdlX0dyb3VwMigpLCBlY29yZVBhY2thZ2UuZ2V0RUZlYXR1cmVNYXBFbnRyeSgpLCAiZ3JvdXAyIiwgbnVsbCwgMCwgLTEsIFByb2Nlc3NQYWNrYWdlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0UHJvY2Vzc1BhY2thZ2VfUHJvY2Vzc0VsZW1lbnQoKSwgdGhpcy5nZXRQcm9jZXNzRWxlbWVudCgpLCBudWxsLCAicHJvY2Vzc0VsZW1lbnQiLCBudWxsLCAwLCAtMSwgUHJvY2Vzc1BhY2thZ2UuY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhwcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZUVDbGFzcywgUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUuY2xhc3MsICJQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGVfR3JvdXA0KCksIGVjb3JlUGFja2FnZS5nZXRFRmVhdHVyZU1hcEVudHJ5KCksICJncm91cDQiLCBudWxsLCAwLCAtMSwgUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZV9CYXNlUHJvY2VzcygpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgImJhc2VQcm9jZXNzIiwgbnVsbCwgMCwgLTEsIFByb2Nlc3NQbGFubmluZ1RlbXBsYXRlLmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHJlcG9ydEVDbGFzcywgUmVwb3J0LmNsYXNzLCAiUmVwb3J0IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0JCWluaXRFQ2xhc3MocmV1c2FibGVBc3NldEVDbGFzcywgUmV1c2FibGVBc3NldC5jbGFzcywgIlJldXNhYmxlQXNzZXQiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0KLQkJaW5pdEVDbGFzcyhyb2FkbWFwRUNsYXNzLCBSb2FkbWFwLmNsYXNzLCAiUm9hZG1hcCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQotCQlpbml0RUNsYXNzKHJvbGVFQ2xhc3MsIFJvbGUuY2xhc3MsICJSb2xlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRSb2xlX0dyb3VwMigpLCBlY29yZVBhY2thZ2UuZ2V0RUZlYXR1cmVNYXBFbnRyeSgpLCAiZ3JvdXAyIiwgbnVsbCwgMCwgLTEsIFJvbGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRSb2xlX1Jlc3BvbnNpYmxlRm9yKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAicmVzcG9uc2libGVGb3IiLCBudWxsLCAwLCAtMSwgUm9sZS5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhyb2xlRGVzY3JpcHRpb25FQ2xhc3MsIFJvbGVEZXNjcmlwdGlvbi5jbGFzcywgIlJvbGVEZXNjcmlwdGlvbiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0Um9sZURlc2NyaXB0aW9uX0Fzc2lnbm1lbnRBcHByb2FjaGVzKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAiYXNzaWdubWVudEFwcHJvYWNoZXMiLCBudWxsLCAwLCAxLCBSb2xlRGVzY3JpcHRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFJvbGVEZXNjcmlwdGlvbl9Ta2lsbHMoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJza2lsbHMiLCBudWxsLCAwLCAxLCBSb2xlRGVzY3JpcHRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFJvbGVEZXNjcmlwdGlvbl9TeW5vbnltcygpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgInN5bm9ueW1zIiwgbnVsbCwgMCwgMSwgUm9sZURlc2NyaXB0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3Mocm9sZURlc2NyaXB0b3JFQ2xhc3MsIFJvbGVEZXNjcmlwdG9yLmNsYXNzLCAiUm9sZURlc2NyaXB0b3IiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFJvbGVEZXNjcmlwdG9yX1JvbGUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJyb2xlIiwgbnVsbCwgMCwgMSwgUm9sZURlc2NyaXB0b3IuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFJvbGVEZXNjcmlwdG9yX1Jlc3BvbnNpYmxlRm9yKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAicmVzcG9uc2libGVGb3IiLCBudWxsLCAwLCAtMSwgUm9sZURlc2NyaXB0b3IuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3Mocm9sZVNldEVDbGFzcywgUm9sZVNldC5jbGFzcywgIlJvbGVTZXQiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFJvbGVTZXRfR3JvdXAyKCksIGVjb3JlUGFja2FnZS5nZXRFRmVhdHVyZU1hcEVudHJ5KCksICJncm91cDIiLCBudWxsLCAwLCAtMSwgUm9sZVNldC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFJvbGVTZXRfUm9sZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgInJvbGUiLCBudWxsLCAwLCAtMSwgUm9sZVNldC5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhyb2xlU2V0R3JvdXBpbmdFQ2xhc3MsIFJvbGVTZXRHcm91cGluZy5jbGFzcywgIlJvbGVTZXRHcm91cGluZyIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0Um9sZVNldEdyb3VwaW5nX0dyb3VwMigpLCBlY29yZVBhY2thZ2UuZ2V0RUZlYXR1cmVNYXBFbnRyeSgpLCAiZ3JvdXAyIiwgbnVsbCwgMCwgLTEsIFJvbGVTZXRHcm91cGluZy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFJvbGVTZXRHcm91cGluZ19Sb2xlU2V0KCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAicm9sZVNldCIsIG51bGwsIDAsIC0xLCBSb2xlU2V0R3JvdXBpbmcuY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3Moc2VjdGlvbkVDbGFzcywgU2VjdGlvbi5jbGFzcywgIlNlY3Rpb24iLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFNlY3Rpb25fU3ViU2VjdGlvbigpLCB0aGlzLmdldFNlY3Rpb24oKSwgbnVsbCwgInN1YlNlY3Rpb24iLCBudWxsLCAwLCAxLCBTZWN0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRTZWN0aW9uX1ByZWRlY2Vzc29yKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAicHJlZGVjZXNzb3IiLCBudWxsLCAwLCAxLCBTZWN0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRTZWN0aW9uX0Rlc2NyaXB0aW9uKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAiZGVzY3JpcHRpb24iLCBudWxsLCAwLCAxLCBTZWN0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRTZWN0aW9uX1NlY3Rpb25OYW1lKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAic2VjdGlvbk5hbWUiLCBudWxsLCAwLCAxLCBTZWN0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRTZWN0aW9uX1ZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJ2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50IiwgbnVsbCwgMCwgMSwgU2VjdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0U2VjdGlvbl9WYXJpYWJpbGl0eVR5cGUoKSwgdGhpcy5nZXRWYXJpYWJpbGl0eVR5cGUoKSwgInZhcmlhYmlsaXR5VHlwZSIsICJuYSIsIDAsIDEsIFNlY3Rpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHN1cHBvcnRpbmdNYXRlcmlhbEVDbGFzcywgU3VwcG9ydGluZ01hdGVyaWFsLmNsYXNzLCAiU3VwcG9ydGluZ01hdGVyaWFsIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0JCWluaXRFQ2xhc3ModGFza0VDbGFzcywgVGFzay5jbGFzcywgIlRhc2siLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFRhc2tfUHJlY29uZGl0aW9uKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAicHJlY29uZGl0aW9uIiwgbnVsbCwgMCwgMSwgVGFzay5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0VGFza19Qb3N0Y29uZGl0aW9uKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAicG9zdGNvbmRpdGlvbiIsIG51bGwsIDAsIDEsIFRhc2suY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFRhc2tfUGVyZm9ybWVkQnkoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJwZXJmb3JtZWRCeSIsIG51bGwsIDAsIC0xLCBUYXNrLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0VGFza19Hcm91cDIoKSwgZWNvcmVQYWNrYWdlLmdldEVGZWF0dXJlTWFwRW50cnkoKSwgImdyb3VwMiIsIG51bGwsIDAsIC0xLCBUYXNrLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0VGFza19NYW5kYXRvcnlJbnB1dCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgIm1hbmRhdG9yeUlucHV0IiwgbnVsbCwgMCwgLTEsIFRhc2suY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRUYXNrX091dHB1dCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgIm91dHB1dCIsIG51bGwsIDAsIC0xLCBUYXNrLmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0VGFza19BZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgImFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5IiwgbnVsbCwgMCwgLTEsIFRhc2suY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRUYXNrX09wdGlvbmFsSW5wdXQoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJvcHRpb25hbElucHV0IiwgbnVsbCwgMCwgLTEsIFRhc2suY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRUYXNrX0VzdGltYXRlKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAiZXN0aW1hdGUiLCBudWxsLCAwLCAtMSwgVGFzay5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFRhc2tfRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAiZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIiwgbnVsbCwgMCwgLTEsIFRhc2suY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRUYXNrX1Rvb2xNZW50b3IoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJ0b29sTWVudG9yIiwgbnVsbCwgMCwgLTEsIFRhc2suY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3ModGFza0Rlc2NyaXB0aW9uRUNsYXNzLCBUYXNrRGVzY3JpcHRpb24uY2xhc3MsICJUYXNrRGVzY3JpcHRpb24iLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFRhc2tEZXNjcmlwdGlvbl9BbHRlcm5hdGl2ZXMoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJhbHRlcm5hdGl2ZXMiLCBudWxsLCAwLCAxLCBUYXNrRGVzY3JpcHRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFRhc2tEZXNjcmlwdGlvbl9QdXJwb3NlKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAicHVycG9zZSIsIG51bGwsIDAsIDEsIFRhc2tEZXNjcmlwdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHRhc2tEZXNjcmlwdG9yRUNsYXNzLCBUYXNrRGVzY3JpcHRvci5jbGFzcywgIlRhc2tEZXNjcmlwdG9yIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRUYXNrRGVzY3JpcHRvcl9UYXNrKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAidGFzayIsIG51bGwsIDAsIDEsIFRhc2tEZXNjcmlwdG9yLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRUYXNrRGVzY3JpcHRvcl9QZXJmb3JtZWRQcmltYXJpbHlCeSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgInBlcmZvcm1lZFByaW1hcmlseUJ5IiwgbnVsbCwgMCwgMSwgVGFza0Rlc2NyaXB0b3IuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFRhc2tEZXNjcmlwdG9yX0dyb3VwMygpLCBlY29yZVBhY2thZ2UuZ2V0RUZlYXR1cmVNYXBFbnRyeSgpLCAiZ3JvdXAzIiwgbnVsbCwgMCwgLTEsIFRhc2tEZXNjcmlwdG9yLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0VGFza0Rlc2NyaXB0b3JfQWRkaXRpb25hbGx5UGVyZm9ybWVkQnkoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJhZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSIsIG51bGwsIDAsIC0xLCBUYXNrRGVzY3JpcHRvci5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFRhc2tEZXNjcmlwdG9yX0Fzc2lzdGVkQnkoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJhc3Npc3RlZEJ5IiwgbnVsbCwgMCwgLTEsIFRhc2tEZXNjcmlwdG9yLmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0VGFza0Rlc2NyaXB0b3JfRXh0ZXJuYWxJbnB1dCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgImV4dGVybmFsSW5wdXQiLCBudWxsLCAwLCAtMSwgVGFza0Rlc2NyaXB0b3IuY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRUYXNrRGVzY3JpcHRvcl9NYW5kYXRvcnlJbnB1dCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgIm1hbmRhdG9yeUlucHV0IiwgbnVsbCwgMCwgLTEsIFRhc2tEZXNjcmlwdG9yLmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0VGFza0Rlc2NyaXB0b3JfT3B0aW9uYWxJbnB1dCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgIm9wdGlvbmFsSW5wdXQiLCBudWxsLCAwLCAtMSwgVGFza0Rlc2NyaXB0b3IuY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRUYXNrRGVzY3JpcHRvcl9PdXRwdXQoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJvdXRwdXQiLCBudWxsLCAwLCAtMSwgVGFza0Rlc2NyaXB0b3IuY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRUYXNrRGVzY3JpcHRvcl9TdGVwKCksIHRoaXMuZ2V0U2VjdGlvbigpLCBudWxsLCAic3RlcCIsIG51bGwsIDAsIC0xLCBUYXNrRGVzY3JpcHRvci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0VGFza0Rlc2NyaXB0b3JfSXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldEJvb2xlYW4oKSwgImlzU3luY2hyb25pemVkV2l0aFNvdXJjZSIsIG51bGwsIDAsIDEsIFRhc2tEZXNjcmlwdG9yLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyh0ZWFtUHJvZmlsZUVDbGFzcywgVGVhbVByb2ZpbGUuY2xhc3MsICJUZWFtUHJvZmlsZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0VGVhbVByb2ZpbGVfR3JvdXAyKCksIGVjb3JlUGFja2FnZS5nZXRFRmVhdHVyZU1hcEVudHJ5KCksICJncm91cDIiLCBudWxsLCAwLCAtMSwgVGVhbVByb2ZpbGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRUZWFtUHJvZmlsZV9Sb2xlKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAicm9sZSIsIG51bGwsIDAsIC0xLCBUZWFtUHJvZmlsZS5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFRlYW1Qcm9maWxlX1N1cGVyVGVhbSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgInN1cGVyVGVhbSIsIG51bGwsIDAsIC0xLCBUZWFtUHJvZmlsZS5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFRlYW1Qcm9maWxlX1N1YlRlYW0oKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJzdWJUZWFtIiwgbnVsbCwgMCwgLTEsIFRlYW1Qcm9maWxlLmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHRlbXBsYXRlRUNsYXNzLCBUZW1wbGF0ZS5jbGFzcywgIlRlbXBsYXRlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0JCWluaXRFQ2xhc3ModGVybURlZmluaXRpb25FQ2xhc3MsIFRlcm1EZWZpbml0aW9uLmNsYXNzLCAiVGVybURlZmluaXRpb24iLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0KLQkJaW5pdEVDbGFzcyh0b29sRUNsYXNzLCBUb29sLmNsYXNzLCAiVG9vbCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0VG9vbF9Hcm91cDIoKSwgZWNvcmVQYWNrYWdlLmdldEVGZWF0dXJlTWFwRW50cnkoKSwgImdyb3VwMiIsIG51bGwsIDAsIC0xLCBUb29sLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0VG9vbF9Ub29sTWVudG9yKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAidG9vbE1lbnRvciIsIG51bGwsIDAsIC0xLCBUb29sLmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHRvb2xNZW50b3JFQ2xhc3MsIFRvb2xNZW50b3IuY2xhc3MsICJUb29sTWVudG9yIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0JCWluaXRFQ2xhc3Mod2hpdGVwYXBlckVDbGFzcywgV2hpdGVwYXBlci5jbGFzcywgIldoaXRlcGFwZXIiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0KLQkJaW5pdEVDbGFzcyh3b3JrQnJlYWtkb3duRWxlbWVudEVDbGFzcywgV29ya0JyZWFrZG93bkVsZW1lbnQuY2xhc3MsICJXb3JrQnJlYWtkb3duRWxlbWVudCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0V29ya0JyZWFrZG93bkVsZW1lbnRfR3JvdXAyKCksIGVjb3JlUGFja2FnZS5nZXRFRmVhdHVyZU1hcEVudHJ5KCksICJncm91cDIiLCBudWxsLCAwLCAtMSwgV29ya0JyZWFrZG93bkVsZW1lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRXb3JrQnJlYWtkb3duRWxlbWVudF9QcmVkZWNlc3NvcigpLCB0aGlzLmdldFdvcmtPcmRlcigpLCBudWxsLCAicHJlZGVjZXNzb3IiLCBudWxsLCAwLCAtMSwgV29ya0JyZWFrZG93bkVsZW1lbnQuY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFdvcmtCcmVha2Rvd25FbGVtZW50X0lzRXZlbnREcml2ZW4oKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0Qm9vbGVhbigpLCAiaXNFdmVudERyaXZlbiIsIG51bGwsIDAsIDEsIFdvcmtCcmVha2Rvd25FbGVtZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFdvcmtCcmVha2Rvd25FbGVtZW50X0lzT25nb2luZygpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRCb29sZWFuKCksICJpc09uZ29pbmciLCBudWxsLCAwLCAxLCBXb3JrQnJlYWtkb3duRWxlbWVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRXb3JrQnJlYWtkb3duRWxlbWVudF9Jc1JlcGVhdGFibGUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0Qm9vbGVhbigpLCAiaXNSZXBlYXRhYmxlIiwgbnVsbCwgMCwgMSwgV29ya0JyZWFrZG93bkVsZW1lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHdvcmtEZWZpbml0aW9uRUNsYXNzLCBXb3JrRGVmaW5pdGlvbi5jbGFzcywgIldvcmtEZWZpbml0aW9uIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRXb3JrRGVmaW5pdGlvbl9QcmVjb25kaXRpb24oKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJwcmVjb25kaXRpb24iLCBudWxsLCAwLCAxLCBXb3JrRGVmaW5pdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0V29ya0RlZmluaXRpb25fUG9zdGNvbmRpdGlvbigpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgInBvc3Rjb25kaXRpb24iLCBudWxsLCAwLCAxLCBXb3JrRGVmaW5pdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHdvcmtPcmRlckVDbGFzcywgV29ya09yZGVyLmNsYXNzLCAiV29ya09yZGVyIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRXb3JrT3JkZXJfVmFsdWUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJ2YWx1ZSIsIG51bGwsIDAsIDEsIFdvcmtPcmRlci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0V29ya09yZGVyX0lkKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAiaWQiLCBudWxsLCAwLCAxLCBXb3JrT3JkZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFdvcmtPcmRlcl9MaW5rVHlwZSgpLCB0aGlzLmdldFdvcmtPcmRlclR5cGUoKSwgImxpbmtUeXBlIiwgImZpbmlzaFRvU3RhcnQiLCAwLCAxLCBXb3JrT3JkZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHdvcmtQcm9kdWN0RUNsYXNzLCBXb3JrUHJvZHVjdC5jbGFzcywgIldvcmtQcm9kdWN0IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRXb3JrUHJvZHVjdF9Hcm91cDIoKSwgZWNvcmVQYWNrYWdlLmdldEVGZWF0dXJlTWFwRW50cnkoKSwgImdyb3VwMiIsIG51bGwsIDAsIC0xLCBXb3JrUHJvZHVjdC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFdvcmtQcm9kdWN0X0VzdGltYXRlKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAiZXN0aW1hdGUiLCBudWxsLCAwLCAtMSwgV29ya1Byb2R1Y3QuY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRXb3JrUHJvZHVjdF9Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJlc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMiLCBudWxsLCAwLCAtMSwgV29ya1Byb2R1Y3QuY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRXb3JrUHJvZHVjdF9SZXBvcnQoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJyZXBvcnQiLCBudWxsLCAwLCAtMSwgV29ya1Byb2R1Y3QuY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRXb3JrUHJvZHVjdF9UZW1wbGF0ZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgInRlbXBsYXRlIiwgbnVsbCwgMCwgLTEsIFdvcmtQcm9kdWN0LmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0V29ya1Byb2R1Y3RfVG9vbE1lbnRvcigpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgInRvb2xNZW50b3IiLCBudWxsLCAwLCAtMSwgV29ya1Byb2R1Y3QuY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3Mod29ya1Byb2R1Y3REZXNjcmlwdGlvbkVDbGFzcywgV29ya1Byb2R1Y3REZXNjcmlwdGlvbi5jbGFzcywgIldvcmtQcm9kdWN0RGVzY3JpcHRpb24iLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFdvcmtQcm9kdWN0RGVzY3JpcHRpb25fSW1wYWN0T2ZOb3RIYXZpbmcoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJpbXBhY3RPZk5vdEhhdmluZyIsIG51bGwsIDAsIDEsIFdvcmtQcm9kdWN0RGVzY3JpcHRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFdvcmtQcm9kdWN0RGVzY3JpcHRpb25fUHVycG9zZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgInB1cnBvc2UiLCBudWxsLCAwLCAxLCBXb3JrUHJvZHVjdERlc2NyaXB0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRXb3JrUHJvZHVjdERlc2NyaXB0aW9uX1JlYXNvbnNGb3JOb3ROZWVkaW5nKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAicmVhc29uc0Zvck5vdE5lZWRpbmciLCBudWxsLCAwLCAxLCBXb3JrUHJvZHVjdERlc2NyaXB0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3Mod29ya1Byb2R1Y3REZXNjcmlwdG9yRUNsYXNzLCBXb3JrUHJvZHVjdERlc2NyaXB0b3IuY2xhc3MsICJXb3JrUHJvZHVjdERlc2NyaXB0b3IiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9Xb3JrUHJvZHVjdCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgIndvcmtQcm9kdWN0IiwgbnVsbCwgMCwgMSwgV29ya1Byb2R1Y3REZXNjcmlwdG9yLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JfUmVzcG9uc2libGVSb2xlKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAicmVzcG9uc2libGVSb2xlIiwgbnVsbCwgMCwgMSwgV29ya1Byb2R1Y3REZXNjcmlwdG9yLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JfR3JvdXAyKCksIGVjb3JlUGFja2FnZS5nZXRFRmVhdHVyZU1hcEVudHJ5KCksICJncm91cDIiLCBudWxsLCAwLCAtMSwgV29ya1Byb2R1Y3REZXNjcmlwdG9yLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX0V4dGVybmFsSW5wdXRUbygpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgImV4dGVybmFsSW5wdXRUbyIsIG51bGwsIDAsIC0xLCBXb3JrUHJvZHVjdERlc2NyaXB0b3IuY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JfSW1wYWN0ZWRCeSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgImltcGFjdGVkQnkiLCBudWxsLCAwLCAtMSwgV29ya1Byb2R1Y3REZXNjcmlwdG9yLmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX0ltcGFjdHMoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJpbXBhY3RzIiwgbnVsbCwgMCwgLTEsIFdvcmtQcm9kdWN0RGVzY3JpcHRvci5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9NYW5kYXRvcnlJbnB1dFRvKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAibWFuZGF0b3J5SW5wdXRUbyIsIG51bGwsIDAsIC0xLCBXb3JrUHJvZHVjdERlc2NyaXB0b3IuY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JfT3B0aW9uYWxJbnB1dFRvKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAib3B0aW9uYWxJbnB1dFRvIiwgbnVsbCwgMCwgLTEsIFdvcmtQcm9kdWN0RGVzY3JpcHRvci5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9PdXRwdXRGcm9tKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAib3V0cHV0RnJvbSIsIG51bGwsIDAsIC0xLCBXb3JrUHJvZHVjdERlc2NyaXB0b3IuY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JfRGVsaXZlcmFibGVQYXJ0cygpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgImRlbGl2ZXJhYmxlUGFydHMiLCBudWxsLCAwLCAtMSwgV29ya1Byb2R1Y3REZXNjcmlwdG9yLmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX0FjdGl2aXR5RW50cnlTdGF0ZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgImFjdGl2aXR5RW50cnlTdGF0ZSIsIG51bGwsIDAsIDEsIFdvcmtQcm9kdWN0RGVzY3JpcHRvci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX0FjdGl2aXR5RXhpdFN0YXRlKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAiYWN0aXZpdHlFeGl0U3RhdGUiLCBudWxsLCAwLCAxLCBXb3JrUHJvZHVjdERlc2NyaXB0b3IuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyh3b3JrUHJvZHVjdFR5cGVFQ2xhc3MsIFdvcmtQcm9kdWN0VHlwZS5jbGFzcywgIldvcmtQcm9kdWN0VHlwZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0V29ya1Byb2R1Y3RUeXBlX0dyb3VwMigpLCBlY29yZVBhY2thZ2UuZ2V0RUZlYXR1cmVNYXBFbnRyeSgpLCAiZ3JvdXAyIiwgbnVsbCwgMCwgLTEsIFdvcmtQcm9kdWN0VHlwZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFdvcmtQcm9kdWN0VHlwZV9Xb3JrUHJvZHVjdCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgIndvcmtQcm9kdWN0IiwgbnVsbCwgMCwgLTEsIFdvcmtQcm9kdWN0VHlwZS5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBlbnVtcyBhbmQgYWRkIGVudW0gbGl0ZXJhbHMKLQkJaW5pdEVFbnVtKHZhcmlhYmlsaXR5VHlwZUVFbnVtLCBWYXJpYWJpbGl0eVR5cGUuY2xhc3MsICJWYXJpYWJpbGl0eVR5cGUiKTsKLQkJYWRkRUVudW1MaXRlcmFsKHZhcmlhYmlsaXR5VHlwZUVFbnVtLCBWYXJpYWJpbGl0eVR5cGUuTkEpOwotCQlhZGRFRW51bUxpdGVyYWwodmFyaWFiaWxpdHlUeXBlRUVudW0sIFZhcmlhYmlsaXR5VHlwZS5DT05UUklCVVRFUyk7Ci0JCWFkZEVFbnVtTGl0ZXJhbCh2YXJpYWJpbGl0eVR5cGVFRW51bSwgVmFyaWFiaWxpdHlUeXBlLkVYVEVORFMpOwotCQlhZGRFRW51bUxpdGVyYWwodmFyaWFiaWxpdHlUeXBlRUVudW0sIFZhcmlhYmlsaXR5VHlwZS5SRVBMQUNFUyk7Ci0JCWFkZEVFbnVtTGl0ZXJhbCh2YXJpYWJpbGl0eVR5cGVFRW51bSwgVmFyaWFiaWxpdHlUeXBlLkxPQ0FMX0NPTlRSSUJVVElPTik7Ci0JCWFkZEVFbnVtTGl0ZXJhbCh2YXJpYWJpbGl0eVR5cGVFRW51bSwgVmFyaWFiaWxpdHlUeXBlLkxPQ0FMX1JFUExBQ0VNRU5UKTsKLQkJYWRkRUVudW1MaXRlcmFsKHZhcmlhYmlsaXR5VHlwZUVFbnVtLCBWYXJpYWJpbGl0eVR5cGUuRVhURU5EU19SRVBMQUNFUyk7Ci0KLQkJaW5pdEVFbnVtKHdvcmtPcmRlclR5cGVFRW51bSwgV29ya09yZGVyVHlwZS5jbGFzcywgIldvcmtPcmRlclR5cGUiKTsKLQkJYWRkRUVudW1MaXRlcmFsKHdvcmtPcmRlclR5cGVFRW51bSwgV29ya09yZGVyVHlwZS5GSU5JU0hfVE9fU1RBUlQpOwotCQlhZGRFRW51bUxpdGVyYWwod29ya09yZGVyVHlwZUVFbnVtLCBXb3JrT3JkZXJUeXBlLkZJTklTSF9UT19GSU5JU0gpOwotCQlhZGRFRW51bUxpdGVyYWwod29ya09yZGVyVHlwZUVFbnVtLCBXb3JrT3JkZXJUeXBlLlNUQVJUX1RPX1NUQVJUKTsKLQkJYWRkRUVudW1MaXRlcmFsKHdvcmtPcmRlclR5cGVFRW51bSwgV29ya09yZGVyVHlwZS5TVEFSVF9UT19GSU5JU0gpOwotCi0JCS8vIEluaXRpYWxpemUgZGF0YSB0eXBlcwotCQlpbml0RURhdGFUeXBlKHZhcmlhYmlsaXR5VHlwZU9iamVjdEVEYXRhVHlwZSwgVmFyaWFiaWxpdHlUeXBlLmNsYXNzLCAiVmFyaWFiaWxpdHlUeXBlT2JqZWN0IiwgSVNfU0VSSUFMSVpBQkxFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RURhdGFUeXBlKHdvcmtPcmRlclR5cGVPYmplY3RFRGF0YVR5cGUsIFdvcmtPcmRlclR5cGUuY2xhc3MsICJXb3JrT3JkZXJUeXBlT2JqZWN0IiwgSVNfU0VSSUFMSVpBQkxFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0JCS8vIENyZWF0ZSByZXNvdXJjZQotCQljcmVhdGVSZXNvdXJjZShlTlNfVVJJKTsKLQotCQkvLyBDcmVhdGUgYW5ub3RhdGlvbnMKLQkJLy8gaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhCi0JCWNyZWF0ZUV4dGVuZGVkTWV0YURhdGFBbm5vdGF0aW9ucygpOwotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemVzIHRoZSBhbm5vdGF0aW9ucyBmb3IgPGI+aHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhPC9iPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVFeHRlbmRlZE1ldGFEYXRhQW5ub3RhdGlvbnMoKSB7Ci0JCVN0cmluZyBzb3VyY2UgPSAiaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIjsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChhY3Rpdml0eUVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiQWN0aXZpdHkiLAotCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEFjdGl2aXR5X1ByZWNvbmRpdGlvbigpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJQcmVjb25kaXRpb24iCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0QWN0aXZpdHlfUG9zdGNvbmRpdGlvbigpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJQb3N0Y29uZGl0aW9uIgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEFjdGl2aXR5X0dyb3VwMygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJncm91cCIsCi0JCQkgIm5hbWUiLCAiZ3JvdXA6MzciCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0QWN0aXZpdHlfQnJlYWtkb3duRWxlbWVudCgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJCcmVha2Rvd25FbGVtZW50IiwKLQkJCSAiZ3JvdXAiLCAiI2dyb3VwOjM3IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEFjdGl2aXR5X1JvYWRtYXAoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiUm9hZG1hcCIsCi0JCQkgImdyb3VwIiwgIiNncm91cDozNyIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRBY3Rpdml0eV9Jc0VuYWN0YWJsZSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJhdHRyaWJ1dGUiLAotCQkJICJuYW1lIiwgIklzRW5hY3RhYmxlIgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEFjdGl2aXR5X1ZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiYXR0cmlidXRlIiwKLQkJCSAibmFtZSIsICJ2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEFjdGl2aXR5X1ZhcmlhYmlsaXR5VHlwZSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJhdHRyaWJ1dGUiLAotCQkJICJuYW1lIiwgInZhcmlhYmlsaXR5VHlwZSIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoYWN0aXZpdHlEZXNjcmlwdGlvbkVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiQWN0aXZpdHlEZXNjcmlwdGlvbiIsCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEFjdGl2aXR5RGVzY3JpcHRpb25fQWx0ZXJuYXRpdmVzKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIkFsdGVybmF0aXZlcyIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0QWN0aXZpdHlEZXNjcmlwdGlvbl9Ib3dUb1N0YWZmKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIkhvd1RvU3RhZmYiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEFjdGl2aXR5RGVzY3JpcHRpb25fUHVycG9zZSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJQdXJwb3NlIgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvRUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJBcHBsaWNhYmxlTWV0YUNsYXNzSW5mbyIsCi0JCQkgImtpbmQiLCAiZW1wdHkiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0QXBwbGljYWJsZU1ldGFDbGFzc0luZm9fSXNQcmltYXJ5RXh0ZW5zaW9uKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImF0dHJpYnV0ZSIsCi0JCQkgIm5hbWUiLCAiaXNQcmltYXJ5RXh0ZW5zaW9uIgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChhcnRpZmFjdEVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiQXJ0aWZhY3QiLAotCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEFydGlmYWN0X0dyb3VwMygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJncm91cCIsCi0JCQkgIm5hbWUiLCAiZ3JvdXA6MzAiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0QXJ0aWZhY3RfQ29udGFpbmVkQXJ0aWZhY3QoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiQ29udGFpbmVkQXJ0aWZhY3QiLAotCQkJICJncm91cCIsICIjZ3JvdXA6MzAiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGFydGlmYWN0RGVzY3JpcHRpb25FQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgIkFydGlmYWN0RGVzY3JpcHRpb24iLAotCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRBcnRpZmFjdERlc2NyaXB0aW9uX0JyaWVmT3V0bGluZSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJCcmllZk91dGxpbmUiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEFydGlmYWN0RGVzY3JpcHRpb25fUmVwcmVzZW50YXRpb25PcHRpb25zKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIlJlcHJlc2VudGF0aW9uT3B0aW9ucyIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRBcnRpZmFjdERlc2NyaXB0aW9uX1JlcHJlc2VudGF0aW9uKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIlJlcHJlc2VudGF0aW9uIgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEFydGlmYWN0RGVzY3JpcHRpb25fTm90YXRpb24oKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiTm90YXRpb24iCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGJyZWFrZG93bkVsZW1lbnRFQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgIkJyZWFrZG93bkVsZW1lbnQiLAotCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEJyZWFrZG93bkVsZW1lbnRfUHJlc2VudGVkQWZ0ZXIoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiUHJlc2VudGVkQWZ0ZXIiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0QnJlYWtkb3duRWxlbWVudF9QcmVzZW50ZWRCZWZvcmUoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiUHJlc2VudGVkQmVmb3JlIgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEJyZWFrZG93bkVsZW1lbnRfUGxhbm5pbmdEYXRhKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIlBsYW5uaW5nRGF0YSIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRCcmVha2Rvd25FbGVtZW50X1N1cGVyQWN0aXZpdHkoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiU3VwZXJBY3Rpdml0eSIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRCcmVha2Rvd25FbGVtZW50X0dyb3VwMSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJncm91cCIsCi0JCQkgIm5hbWUiLCAiZ3JvdXA6MTgiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0QnJlYWtkb3duRWxlbWVudF9DaGVja2xpc3QoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiQ2hlY2tsaXN0IiwKLQkJCSAiZ3JvdXAiLCAiI2dyb3VwOjE4IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEJyZWFrZG93bkVsZW1lbnRfQ29uY2VwdCgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJDb25jZXB0IiwKLQkJCSAiZ3JvdXAiLCAiI2dyb3VwOjE4IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEJyZWFrZG93bkVsZW1lbnRfRXhhbXBsZSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJFeGFtcGxlIiwKLQkJCSAiZ3JvdXAiLCAiI2dyb3VwOjE4IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEJyZWFrZG93bkVsZW1lbnRfR3VpZGVsaW5lKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIkd1aWRlbGluZSIsCi0JCQkgImdyb3VwIiwgIiNncm91cDoxOCIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRCcmVha2Rvd25FbGVtZW50X1JldXNhYmxlQXNzZXQoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiUmV1c2FibGVBc3NldCIsCi0JCQkgImdyb3VwIiwgIiNncm91cDoxOCIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRCcmVha2Rvd25FbGVtZW50X1N1cHBvcnRpbmdNYXRlcmlhbCgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJTdXBwb3J0aW5nTWF0ZXJpYWwiLAotCQkJICJncm91cCIsICIjZ3JvdXA6MTgiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0QnJlYWtkb3duRWxlbWVudF9XaGl0ZXBhcGVyKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIldoaXRlcGFwZXIiLAotCQkJICJncm91cCIsICIjZ3JvdXA6MTgiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEJyZWFrZG93bkVsZW1lbnRfSGFzTXVsdGlwbGVPY2N1cnJlbmNlcygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJhdHRyaWJ1dGUiLAotCQkJICJuYW1lIiwgImhhc011bHRpcGxlT2NjdXJyZW5jZXMiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEJyZWFrZG93bkVsZW1lbnRfSXNPcHRpb25hbCgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJhdHRyaWJ1dGUiLAotCQkJICJuYW1lIiwgImlzT3B0aW9uYWwiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEJyZWFrZG93bkVsZW1lbnRfSXNQbGFubmVkKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImF0dHJpYnV0ZSIsCi0JCQkgIm5hbWUiLCAiaXNQbGFubmVkIgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRCcmVha2Rvd25FbGVtZW50X1ByZWZpeCgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJhdHRyaWJ1dGUiLAotCQkJICJuYW1lIiwgInByZWZpeCIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoYnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uRUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24iLAotCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb25fVXNhZ2VHdWlkYW5jZSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJhdHRyaWJ1dGUiLAotCQkJICJuYW1lIiwgInVzYWdlR3VpZGFuY2UiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGNhcGFiaWxpdHlQYXR0ZXJuRUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJDYXBhYmlsaXR5UGF0dGVybiIsCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGNoZWNrbGlzdEVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiQ2hlY2tsaXN0IiwKLQkJCSAia2luZCIsICJlbGVtZW50T25seSIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoY29tcG9zaXRlUm9sZUVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiQ29tcG9zaXRlUm9sZSIsCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0Q29tcG9zaXRlUm9sZV9Hcm91cDIoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZ3JvdXAiLAotCQkJICJuYW1lIiwgImdyb3VwOjMzIgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldENvbXBvc2l0ZVJvbGVfQWdncmVnYXRlZFJvbGUoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiQWdncmVnYXRlZFJvbGUiLAotCQkJICJncm91cCIsICIjZ3JvdXA6MzMiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGNvbmNlcHRFQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgIkNvbmNlcHQiLAotCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChjb25zdHJhaW50RUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJDb25zdHJhaW50IiwKLQkJCSAia2luZCIsICJlbGVtZW50T25seSIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0Q29uc3RyYWludF9NYWluRGVzY3JpcHRpb24oKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiYXR0cmlidXRlIiwKLQkJCSAibmFtZSIsICJtYWluRGVzY3JpcHRpb24iCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGNvbnRlbnRDYXRlZ29yeUVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiQ29udGVudENhdGVnb3J5IiwKLQkJCSAia2luZCIsICJlbGVtZW50T25seSIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoY29udGVudENhdGVnb3J5UGFja2FnZUVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiQ29udGVudENhdGVnb3J5UGFja2FnZSIsCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0Q29udGVudENhdGVnb3J5UGFja2FnZV9Hcm91cDIoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZ3JvdXAiLAotCQkJICJuYW1lIiwgImdyb3VwOjEzIgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldENvbnRlbnRDYXRlZ29yeVBhY2thZ2VfQ29udGVudENhdGVnb3J5KCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIkNvbnRlbnRDYXRlZ29yeSIsCi0JCQkgImdyb3VwIiwgIiNncm91cDoxMyIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoY29udGVudERlc2NyaXB0aW9uRUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJDb250ZW50RGVzY3JpcHRpb24iLAotCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRDb250ZW50RGVzY3JpcHRpb25fTWFpbkRlc2NyaXB0aW9uKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIk1haW5EZXNjcmlwdGlvbiIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0Q29udGVudERlc2NyaXB0aW9uX0tleUNvbnNpZGVyYXRpb25zKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIktleUNvbnNpZGVyYXRpb25zIgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldENvbnRlbnREZXNjcmlwdGlvbl9TZWN0aW9uKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIlNlY3Rpb24iCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldENvbnRlbnREZXNjcmlwdGlvbl9FeHRlcm5hbElkKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImF0dHJpYnV0ZSIsCi0JCQkgIm5hbWUiLCAiZXh0ZXJuYWxJZCIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoY29udGVudEVsZW1lbnRFQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgIkNvbnRlbnRFbGVtZW50IiwKLQkJCSAia2luZCIsICJlbGVtZW50T25seSIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRDb250ZW50RWxlbWVudF9Hcm91cDEoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZ3JvdXAiLAotCQkJICJuYW1lIiwgImdyb3VwOjE0IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldENvbnRlbnRFbGVtZW50X0NoZWNrbGlzdCgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJDaGVja2xpc3QiLAotCQkJICJncm91cCIsICIjZ3JvdXA6MTQiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0Q29udGVudEVsZW1lbnRfQ29uY2VwdCgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJDb25jZXB0IiwKLQkJCSAiZ3JvdXAiLCAiI2dyb3VwOjE0IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldENvbnRlbnRFbGVtZW50X0V4YW1wbGUoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiRXhhbXBsZSIsCi0JCQkgImdyb3VwIiwgIiNncm91cDoxNCIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRDb250ZW50RWxlbWVudF9HdWlkZWxpbmUoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiR3VpZGVsaW5lIiwKLQkJCSAiZ3JvdXAiLCAiI2dyb3VwOjE0IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldENvbnRlbnRFbGVtZW50X1JldXNhYmxlQXNzZXQoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiUmV1c2FibGVBc3NldCIsCi0JCQkgImdyb3VwIiwgIiNncm91cDoxNCIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRDb250ZW50RWxlbWVudF9TdXBwb3J0aW5nTWF0ZXJpYWwoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiU3VwcG9ydGluZ01hdGVyaWFsIiwKLQkJCSAiZ3JvdXAiLCAiI2dyb3VwOjE0IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldENvbnRlbnRFbGVtZW50X1doaXRlcGFwZXIoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiV2hpdGVwYXBlciIsCi0JCQkgImdyb3VwIiwgIiNncm91cDoxNCIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRDb250ZW50RWxlbWVudF9WYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImF0dHJpYnV0ZSIsCi0JCQkgIm5hbWUiLCAidmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRDb250ZW50RWxlbWVudF9WYXJpYWJpbGl0eVR5cGUoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiYXR0cmlidXRlIiwKLQkJCSAibmFtZSIsICJ2YXJpYWJpbGl0eVR5cGUiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGNvbnRlbnRQYWNrYWdlRUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJDb250ZW50UGFja2FnZSIsCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0Q29udGVudFBhY2thZ2VfR3JvdXAyKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImdyb3VwIiwKLQkJCSAibmFtZSIsICJncm91cDoxMyIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRDb250ZW50UGFja2FnZV9Db250ZW50RWxlbWVudCgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJDb250ZW50RWxlbWVudCIsCi0JCQkgImdyb3VwIiwgIiNncm91cDoxMyIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoY3VzdG9tQ2F0ZWdvcnlFQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgIkN1c3RvbUNhdGVnb3J5IiwKLQkJCSAia2luZCIsICJlbGVtZW50T25seSIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRDdXN0b21DYXRlZ29yeV9Hcm91cDIoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZ3JvdXAiLAotCQkJICJuYW1lIiwgImdyb3VwOjI0IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEN1c3RvbUNhdGVnb3J5X0NhdGVnb3JpemVkRWxlbWVudCgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJDYXRlZ29yaXplZEVsZW1lbnQiLAotCQkJICJncm91cCIsICIjZ3JvdXA6MjQiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0Q3VzdG9tQ2F0ZWdvcnlfU3ViQ2F0ZWdvcnkoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiU3ViQ2F0ZWdvcnkiLAotCQkJICJncm91cCIsICIjZ3JvdXA6MjQiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGRlbGl2ZXJhYmxlRUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJEZWxpdmVyYWJsZSIsCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0RGVsaXZlcmFibGVfR3JvdXAzKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImdyb3VwIiwKLQkJCSAibmFtZSIsICJncm91cDozMCIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXREZWxpdmVyYWJsZV9EZWxpdmVyZWRXb3JrUHJvZHVjdCgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJEZWxpdmVyZWRXb3JrUHJvZHVjdCIsCi0JCQkgImdyb3VwIiwgIiNncm91cDozMCIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZGVsaXZlcmFibGVEZXNjcmlwdGlvbkVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiRGVsaXZlcmFibGVEZXNjcmlwdGlvbiIsCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldERlbGl2ZXJhYmxlRGVzY3JpcHRpb25fRXh0ZXJuYWxEZXNjcmlwdGlvbigpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJFeHRlcm5hbERlc2NyaXB0aW9uIgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXREZWxpdmVyYWJsZURlc2NyaXB0aW9uX1BhY2thZ2luZ0d1aWRhbmNlKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIlBhY2thZ2luZ0d1aWRhbmNlIgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChkZWxpdmVyeVByb2Nlc3NFQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgIkRlbGl2ZXJ5UHJvY2VzcyIsCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0RGVsaXZlcnlQcm9jZXNzX0dyb3VwNCgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJncm91cCIsCi0JCQkgIm5hbWUiLCAiZ3JvdXA6NDciCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0RGVsaXZlcnlQcm9jZXNzX0NvbW11bmljYXRpb25zTWF0ZXJpYWwoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiQ29tbXVuaWNhdGlvbnNNYXRlcmlhbCIsCi0JCQkgImdyb3VwIiwgIiNncm91cDo0NyIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXREZWxpdmVyeVByb2Nlc3NfRWR1Y2F0aW9uTWF0ZXJpYWwoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiRWR1Y2F0aW9uTWF0ZXJpYWwiLAotCQkJICJncm91cCIsICIjZ3JvdXA6NDciCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uRUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJEZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbiIsCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX1NjYWxlKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIlNjYWxlIgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXREZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl9Qcm9qZWN0Q2hhcmFjdGVyaXN0aWNzKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIlByb2plY3RDaGFyYWN0ZXJpc3RpY3MiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX1Jpc2tMZXZlbCgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJSaXNrTGV2ZWwiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX0VzdGltYXRpbmdUZWNobmlxdWUoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiRXN0aW1hdGluZ1RlY2huaXF1ZSIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fUHJvamVjdE1lbWJlckV4cGVydGlzZSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJQcm9qZWN0TWVtYmVyRXhwZXJ0aXNlIgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXREZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl9UeXBlT2ZDb250cmFjdCgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJUeXBlT2ZDb250cmFjdCIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZGVzY3JpYmFibGVFbGVtZW50RUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJEZXNjcmliYWJsZUVsZW1lbnQiLAotCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldERlc2NyaWJhYmxlRWxlbWVudF9QcmVzZW50YXRpb24oKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiUHJlc2VudGF0aW9uIgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldERlc2NyaWJhYmxlRWxlbWVudF9GdWxmaWxsKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIkZ1bGZpbGwiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0RGVzY3JpYmFibGVFbGVtZW50X0lzQWJzdHJhY3QoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiYXR0cmlidXRlIiwKLQkJCSAibmFtZSIsICJpc0Fic3RyYWN0IgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXREZXNjcmliYWJsZUVsZW1lbnRfTm9kZWljb24oKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiYXR0cmlidXRlIiwKLQkJCSAibmFtZSIsICJub2RlaWNvbiIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0RGVzY3JpYmFibGVFbGVtZW50X1NoYXBlaWNvbigpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJhdHRyaWJ1dGUiLAotCQkJICJuYW1lIiwgInNoYXBlaWNvbiIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZGVzY3JpcHRvckVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiRGVzY3JpcHRvciIsCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0RGVzY3JpcHRvcl9Jc1N5bmNocm9uaXplZFdpdGhTb3VyY2UoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiYXR0cmlidXRlIiwKLQkJCSAibmFtZSIsICJpc1N5bmNocm9uaXplZFdpdGhTb3VyY2UiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGRlc2NyaXB0b3JEZXNjcmlwdGlvbkVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiRGVzY3JpcHRvckRlc2NyaXB0aW9uIiwKLQkJCSAia2luZCIsICJlbGVtZW50T25seSIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0RGVzY3JpcHRvckRlc2NyaXB0aW9uX1JlZmluZWREZXNjcmlwdGlvbigpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJSZWZpbmVkRGVzY3JpcHRpb24iCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGRpc2NpcGxpbmVFQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgIkRpc2NpcGxpbmUiLAotCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldERpc2NpcGxpbmVfR3JvdXAyKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImdyb3VwIiwKLQkJCSAibmFtZSIsICJncm91cDoyNCIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXREaXNjaXBsaW5lX1Rhc2soKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiVGFzayIsCi0JCQkgImdyb3VwIiwgIiNncm91cDoyNCIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXREaXNjaXBsaW5lX1N1YkRpc2NpcGxpbmUoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiU3ViRGlzY2lwbGluZSIsCi0JCQkgImdyb3VwIiwgIiNncm91cDoyNCIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXREaXNjaXBsaW5lX1JlZmVyZW5jZVdvcmtmbG93KCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIlJlZmVyZW5jZVdvcmtmbG93IiwKLQkJCSAiZ3JvdXAiLCAiI2dyb3VwOjI0IgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChkaXNjaXBsaW5lR3JvdXBpbmdFQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgIkRpc2NpcGxpbmVHcm91cGluZyIsCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0RGlzY2lwbGluZUdyb3VwaW5nX0dyb3VwMigpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJncm91cCIsCi0JCQkgIm5hbWUiLCAiZ3JvdXA6MjQiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0RGlzY2lwbGluZUdyb3VwaW5nX0Rpc2NpcGxpbmUoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiRGlzY2lwbGluZSIsCi0JCQkgImdyb3VwIiwgIiNncm91cDoyNCIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChkb2N1bWVudFJvb3RFQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgIiIsCi0JCQkgImtpbmQiLCAibWl4ZWQiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0RG9jdW1lbnRSb290X01peGVkKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnRXaWxkY2FyZCIsCi0JCQkgIm5hbWUiLCAiOm1peGVkIgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldERvY3VtZW50Um9vdF9YTUxOU1ByZWZpeE1hcCgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJhdHRyaWJ1dGUiLAotCQkJICJuYW1lIiwgInhtbG5zOnByZWZpeCIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXREb2N1bWVudFJvb3RfWFNJU2NoZW1hTG9jYXRpb24oKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiYXR0cmlidXRlIiwKLQkJCSAibmFtZSIsICJ4c2k6c2NoZW1hTG9jYXRpb24iCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldERvY3VtZW50Um9vdF9NZXRob2RDb25maWd1cmF0aW9uKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIk1ldGhvZENvbmZpZ3VyYXRpb24iLAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldERvY3VtZW50Um9vdF9NZXRob2RMaWJyYXJ5KCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIk1ldGhvZExpYnJhcnkiLAotCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldERvY3VtZW50Um9vdF9NZXRob2RQbHVnaW4oKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiTWV0aG9kUGx1Z2luIiwKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChkb21haW5FQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgIkRvbWFpbiIsCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0RG9tYWluX0dyb3VwMigpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJncm91cCIsCi0JCQkgIm5hbWUiLCAiZ3JvdXA6MjQiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0RG9tYWluX1dvcmtQcm9kdWN0KCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIldvcmtQcm9kdWN0IiwKLQkJCSAiZ3JvdXAiLCAiI2dyb3VwOjI0IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldERvbWFpbl9TdWJkb21haW4oKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiU3ViZG9tYWluIiwKLQkJCSAiZ3JvdXAiLCAiI2dyb3VwOjI0IgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChlbGVtZW50RUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJFbGVtZW50IiwKLQkJCSAia2luZCIsICJlbXB0eSIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZXN0aW1hdGVFQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgIkVzdGltYXRlIiwKLQkJCSAia2luZCIsICJlbGVtZW50T25seSIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRFc3RpbWF0ZV9Hcm91cDIoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZ3JvdXAiLAotCQkJICJuYW1lIiwgImdyb3VwOjI0IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEVzdGltYXRlX0VzdGltYXRpb25NZXRyaWMoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiRXN0aW1hdGlvbk1ldHJpYyIsCi0JCQkgImdyb3VwIiwgIiNncm91cDoyNCIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRFc3RpbWF0ZV9Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIiwKLQkJCSAiZ3JvdXAiLCAiI2dyb3VwOjI0IgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChlc3RpbWF0aW5nTWV0cmljRUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJFc3RpbWF0aW5nTWV0cmljIiwKLQkJCSAia2luZCIsICJlbGVtZW50T25seSIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zRUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMiLAotCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChleGFtcGxlRUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJFeGFtcGxlIiwKLQkJCSAia2luZCIsICJlbGVtZW50T25seSIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ3VpZGFuY2VFQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgIkd1aWRhbmNlIiwKLQkJCSAia2luZCIsICJlbGVtZW50T25seSIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ3VpZGFuY2VEZXNjcmlwdGlvbkVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiR3VpZGFuY2VEZXNjcmlwdGlvbiIsCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEd1aWRhbmNlRGVzY3JpcHRpb25fQXR0YWNobWVudCgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJBdHRhY2htZW50IgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChndWlkZWxpbmVFQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgIkd1aWRlbGluZSIsCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGl0ZXJhdGlvbkVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiSXRlcmF0aW9uIiwKLQkJCSAia2luZCIsICJlbGVtZW50T25seSIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChraW5kRUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJLaW5kIiwKLQkJCSAia2luZCIsICJlbGVtZW50T25seSIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRLaW5kX0FwcGxpY2FibGVNZXRhQ2xhc3NJbmZvKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIkFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvIgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChtZXRob2RDb25maWd1cmF0aW9uRUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJNZXRob2RDb25maWd1cmF0aW9uIiwKLQkJCSAia2luZCIsICJlbGVtZW50T25seSIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRNZXRob2RDb25maWd1cmF0aW9uX0Jhc2VDb25maWd1cmF0aW9uKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIkJhc2VDb25maWd1cmF0aW9uIgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldE1ldGhvZENvbmZpZ3VyYXRpb25fTWV0aG9kUGx1Z2luU2VsZWN0aW9uKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIk1ldGhvZFBsdWdpblNlbGVjdGlvbiIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRNZXRob2RDb25maWd1cmF0aW9uX01ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiTWV0aG9kUGFja2FnZVNlbGVjdGlvbiIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRNZXRob2RDb25maWd1cmF0aW9uX0RlZmF1bHRWaWV3KCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIkRlZmF1bHRWaWV3IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldE1ldGhvZENvbmZpZ3VyYXRpb25fUHJvY2Vzc1ZpZXcoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiUHJvY2Vzc1ZpZXciCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0TWV0aG9kQ29uZmlndXJhdGlvbl9TdWJ0cmFjdGVkQ2F0ZWdvcnkoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiU3VidHJhY3RlZENhdGVnb3J5IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldE1ldGhvZENvbmZpZ3VyYXRpb25fQWRkZWRDYXRlZ29yeSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJBZGRlZENhdGVnb3J5IgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChtZXRob2RFbGVtZW50RUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJNZXRob2RFbGVtZW50IiwKLQkJCSAia2luZCIsICJlbGVtZW50T25seSIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRNZXRob2RFbGVtZW50X0dyb3VwKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImdyb3VwIiwKLQkJCSAibmFtZSIsICJncm91cDoxIgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRNZXRob2RFbGVtZW50X093bmVkUnVsZSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJPd25lZFJ1bGUiLAotCQkJICJncm91cCIsICIjZ3JvdXA6MSIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRNZXRob2RFbGVtZW50X01ldGhvZEVsZW1lbnRQcm9wZXJ0eSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJNZXRob2RFbGVtZW50UHJvcGVydHkiLAotCQkJICJncm91cCIsICIjZ3JvdXA6MSIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0TWV0aG9kRWxlbWVudF9CcmllZkRlc2NyaXB0aW9uKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImF0dHJpYnV0ZSIsCi0JCQkgIm5hbWUiLCAiYnJpZWZEZXNjcmlwdGlvbiIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0TWV0aG9kRWxlbWVudF9JZCgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJhdHRyaWJ1dGUiLAotCQkJICJuYW1lIiwgImlkIgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRNZXRob2RFbGVtZW50X09yZGVyaW5nR3VpZGUoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiYXR0cmlidXRlIiwKLQkJCSAibmFtZSIsICJvcmRlcmluZ0d1aWRlIgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRNZXRob2RFbGVtZW50X1ByZXNlbnRhdGlvbk5hbWUoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiYXR0cmlidXRlIiwKLQkJCSAibmFtZSIsICJwcmVzZW50YXRpb25OYW1lIgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRNZXRob2RFbGVtZW50X1N1cHByZXNzZWQoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiYXR0cmlidXRlIiwKLQkJCSAibmFtZSIsICJzdXBwcmVzc2VkIgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKG1ldGhvZEVsZW1lbnRQcm9wZXJ0eUVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiTWV0aG9kRWxlbWVudFByb3BlcnR5IiwKLQkJCSAia2luZCIsICJlbXB0eSIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRNZXRob2RFbGVtZW50UHJvcGVydHlfVmFsdWUoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiYXR0cmlidXRlIiwKLQkJCSAibmFtZSIsICJ2YWx1ZSIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAobWV0aG9kTGlicmFyeUVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiTWV0aG9kTGlicmFyeSIsCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0TWV0aG9kTGlicmFyeV9NZXRob2RQbHVnaW4oKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiTWV0aG9kUGx1Z2luIgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldE1ldGhvZExpYnJhcnlfTWV0aG9kQ29uZmlndXJhdGlvbigpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJNZXRob2RDb25maWd1cmF0aW9uIgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRNZXRob2RMaWJyYXJ5X1Rvb2woKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiYXR0cmlidXRlIiwKLQkJCSAibmFtZSIsICJ0b29sIgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChtZXRob2RQYWNrYWdlRUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJNZXRob2RQYWNrYWdlIiwKLQkJCSAia2luZCIsICJlbGVtZW50T25seSIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRNZXRob2RQYWNrYWdlX0dyb3VwMSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJncm91cCIsCi0JCQkgIm5hbWUiLCAiZ3JvdXA6OSIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRNZXRob2RQYWNrYWdlX1JldXNlZFBhY2thZ2UoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiUmV1c2VkUGFja2FnZSIsCi0JCQkgImdyb3VwIiwgIiNncm91cDo5IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldE1ldGhvZFBhY2thZ2VfTWV0aG9kUGFja2FnZSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJNZXRob2RQYWNrYWdlIiwKLQkJCSAiZ3JvdXAiLCAiI2dyb3VwOjkiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldE1ldGhvZFBhY2thZ2VfR2xvYmFsKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImF0dHJpYnV0ZSIsCi0JCQkgIm5hbWUiLCAiZ2xvYmFsIgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChtZXRob2RQbHVnaW5FQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgIk1ldGhvZFBsdWdpbiIsCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0TWV0aG9kUGx1Z2luX1JlZmVyZW5jZWRNZXRob2RQbHVnaW4oKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiUmVmZXJlbmNlZE1ldGhvZFBsdWdpbiIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRNZXRob2RQbHVnaW5fTWV0aG9kUGFja2FnZSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJNZXRob2RQYWNrYWdlIgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldE1ldGhvZFBsdWdpbl9Vc2VyQ2hhbmdlYWJsZSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJhdHRyaWJ1dGUiLAotCQkJICJuYW1lIiwgInVzZXJDaGFuZ2VhYmxlIgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChtZXRob2RVbml0RUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJNZXRob2RVbml0IiwKLQkJCSAia2luZCIsICJlbGVtZW50T25seSIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRNZXRob2RVbml0X0NvcHlyaWdodCgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJDb3B5cmlnaHQiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldE1ldGhvZFVuaXRfQXV0aG9ycygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJhdHRyaWJ1dGUiLAotCQkJICJuYW1lIiwgImF1dGhvcnMiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldE1ldGhvZFVuaXRfQ2hhbmdlRGF0ZSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJhdHRyaWJ1dGUiLAotCQkJICJuYW1lIiwgImNoYW5nZURhdGUiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldE1ldGhvZFVuaXRfQ2hhbmdlRGVzY3JpcHRpb24oKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiYXR0cmlidXRlIiwKLQkJCSAibmFtZSIsICJjaGFuZ2VEZXNjcmlwdGlvbiIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0TWV0aG9kVW5pdF9WZXJzaW9uKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImF0dHJpYnV0ZSIsCi0JCQkgIm5hbWUiLCAidmVyc2lvbiIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAobWlsZXN0b25lRUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJNaWxlc3RvbmUiLAotCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldE1pbGVzdG9uZV9SZXF1aXJlZFJlc3VsdCgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJSZXF1aXJlZFJlc3VsdCIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAobmFtZWRFbGVtZW50RUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJOYW1lZEVsZW1lbnQiLAotCQkJICJraW5kIiwgImVtcHR5IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldE5hbWVkRWxlbWVudF9OYW1lKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImF0dHJpYnV0ZSIsCi0JCQkgIm5hbWUiLCAibmFtZSIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAob3V0Y29tZUVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiT3V0Y29tZSIsCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKHBhY2thZ2VhYmxlRWxlbWVudEVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiUGFja2FnZWFibGVFbGVtZW50IiwKLQkJCSAia2luZCIsICJlbXB0eSIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAocGhhc2VFQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgIlBoYXNlIiwKLQkJCSAia2luZCIsICJlbGVtZW50T25seSIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAocGxhbm5pbmdEYXRhRUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJQbGFubmluZ0RhdGEiLAotCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRQbGFubmluZ0RhdGFfRmluaXNoRGF0ZSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJhdHRyaWJ1dGUiLAotCQkJICJuYW1lIiwgImZpbmlzaERhdGUiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFBsYW5uaW5nRGF0YV9SYW5rKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImF0dHJpYnV0ZSIsCi0JCQkgIm5hbWUiLCAicmFuayIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0UGxhbm5pbmdEYXRhX1N0YXJ0RGF0ZSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJhdHRyaWJ1dGUiLAotCQkJICJuYW1lIiwgInN0YXJ0RGF0ZSIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAocHJhY3RpY2VFQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgIlByYWN0aWNlIiwKLQkJCSAia2luZCIsICJlbGVtZW50T25seSIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRQcmFjdGljZV9Hcm91cDIoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZ3JvdXAiLAotCQkJICJuYW1lIiwgImdyb3VwOjI0IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFByYWN0aWNlX0FjdGl2aXR5UmVmZXJlbmNlKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIkFjdGl2aXR5UmVmZXJlbmNlIiwKLQkJCSAiZ3JvdXAiLCAiI2dyb3VwOjI0IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFByYWN0aWNlX0NvbnRlbnRSZWZlcmVuY2UoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiQ29udGVudFJlZmVyZW5jZSIsCi0JCQkgImdyb3VwIiwgIiNncm91cDoyNCIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRQcmFjdGljZV9TdWJQcmFjdGljZSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJTdWJQcmFjdGljZSIsCi0JCQkgImdyb3VwIiwgIiNncm91cDoyNCIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAocHJhY3RpY2VEZXNjcmlwdGlvbkVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiUHJhY3RpY2VEZXNjcmlwdGlvbiIsCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFByYWN0aWNlRGVzY3JpcHRpb25fQWRkaXRpb25hbEluZm8oKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiQWRkaXRpb25hbEluZm8iCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFByYWN0aWNlRGVzY3JpcHRpb25fQXBwbGljYXRpb24oKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiQXBwbGljYXRpb24iCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFByYWN0aWNlRGVzY3JpcHRpb25fQmFja2dyb3VuZCgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJCYWNrZ3JvdW5kIgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRQcmFjdGljZURlc2NyaXB0aW9uX0dvYWxzKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIkdvYWxzIgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRQcmFjdGljZURlc2NyaXB0aW9uX0xldmVsc09mQWRvcHRpb24oKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiTGV2ZWxzT2ZBZG9wdGlvbiIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0UHJhY3RpY2VEZXNjcmlwdGlvbl9Qcm9ibGVtKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIlByb2JsZW0iCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKHByb2Nlc3NFQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgIlByb2Nlc3MiLAotCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFByb2Nlc3NfSW5jbHVkZXNQYXR0ZXJuKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIkluY2x1ZGVzUGF0dGVybiIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRQcm9jZXNzX0RlZmF1bHRDb250ZXh0KCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIkRlZmF1bHRDb250ZXh0IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFByb2Nlc3NfVmFsaWRDb250ZXh0KCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIlZhbGlkQ29udGV4dCIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0UHJvY2Vzc19EaWFncmFtVVJJKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImF0dHJpYnV0ZSIsCi0JCQkgIm5hbWUiLCAiZGlhZ3JhbVVSSSIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAocHJvY2Vzc0NvbXBvbmVudEVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiUHJvY2Vzc0NvbXBvbmVudCIsCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0UHJvY2Vzc0NvbXBvbmVudF9Db3B5cmlnaHQoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiQ29weXJpZ2h0IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFByb2Nlc3NDb21wb25lbnRfSW50ZXJmYWNlKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIkludGVyZmFjZSIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRQcm9jZXNzQ29tcG9uZW50X1Byb2Nlc3MoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiUHJvY2VzcyIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0UHJvY2Vzc0NvbXBvbmVudF9BdXRob3JzKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImF0dHJpYnV0ZSIsCi0JCQkgIm5hbWUiLCAiYXV0aG9ycyIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0UHJvY2Vzc0NvbXBvbmVudF9DaGFuZ2VEYXRlKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImF0dHJpYnV0ZSIsCi0JCQkgIm5hbWUiLCAiY2hhbmdlRGF0ZSIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0UHJvY2Vzc0NvbXBvbmVudF9DaGFuZ2VEZXNjcmlwdGlvbigpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJhdHRyaWJ1dGUiLAotCQkJICJuYW1lIiwgImNoYW5nZURlc2NyaXB0aW9uIgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRQcm9jZXNzQ29tcG9uZW50X1ZlcnNpb24oKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiYXR0cmlidXRlIiwKLQkJCSAibmFtZSIsICJ2ZXJzaW9uIgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChwcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlRUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlIiwKLQkJCSAia2luZCIsICJlbGVtZW50T25seSIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlX0dyb3VwMigpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJncm91cCIsCi0JCQkgIm5hbWUiLCAiZ3JvdXA6MzAiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0UHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZV9JbnRlcmZhY2VTcGVjaWZpY2F0aW9uKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIkludGVyZmFjZVNwZWNpZmljYXRpb24iLAotCQkJICJncm91cCIsICIjZ3JvdXA6MzAiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0UHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZV9JbnRlcmZhY2VJTygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJJbnRlcmZhY2VJTyIsCi0JCQkgImdyb3VwIiwgIiNncm91cDozMCIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAocHJvY2Vzc0Rlc2NyaXB0aW9uRUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJQcm9jZXNzRGVzY3JpcHRpb24iLAotCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRQcm9jZXNzRGVzY3JpcHRpb25fU2NvcGUoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiU2NvcGUiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFByb2Nlc3NEZXNjcmlwdGlvbl9Vc2FnZU5vdGVzKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIlVzYWdlTm90ZXMiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKHByb2Nlc3NFbGVtZW50RUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJQcm9jZXNzRWxlbWVudCIsCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKHByb2Nlc3NQYWNrYWdlRUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJQcm9jZXNzUGFja2FnZSIsCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0UHJvY2Vzc1BhY2thZ2VfR3JvdXAyKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImdyb3VwIiwKLQkJCSAibmFtZSIsICJncm91cDoxMyIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRQcm9jZXNzUGFja2FnZV9Qcm9jZXNzRWxlbWVudCgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJQcm9jZXNzRWxlbWVudCIsCi0JCQkgImdyb3VwIiwgIiNncm91cDoxMyIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAocHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGVFQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgIlByb2Nlc3NQbGFubmluZ1RlbXBsYXRlIiwKLQkJCSAia2luZCIsICJlbGVtZW50T25seSIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZV9Hcm91cDQoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZ3JvdXAiLAotCQkJICJuYW1lIiwgImdyb3VwOjQ3IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFByb2Nlc3NQbGFubmluZ1RlbXBsYXRlX0Jhc2VQcm9jZXNzKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIkJhc2VQcm9jZXNzIiwKLQkJCSAiZ3JvdXAiLCAiI2dyb3VwOjQ3IgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChyZXBvcnRFQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgIlJlcG9ydCIsCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKHJldXNhYmxlQXNzZXRFQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgIlJldXNhYmxlQXNzZXQiLAotCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChyb2FkbWFwRUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJSb2FkbWFwIiwKLQkJCSAia2luZCIsICJlbGVtZW50T25seSIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAocm9sZUVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiUm9sZSIsCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0Um9sZV9Hcm91cDIoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZ3JvdXAiLAotCQkJICJuYW1lIiwgImdyb3VwOjI0IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFJvbGVfUmVzcG9uc2libGVGb3IoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiUmVzcG9uc2libGVGb3IiLAotCQkJICJncm91cCIsICIjZ3JvdXA6MjQiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKHJvbGVEZXNjcmlwdGlvbkVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiUm9sZURlc2NyaXB0aW9uIiwKLQkJCSAia2luZCIsICJlbGVtZW50T25seSIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0Um9sZURlc2NyaXB0aW9uX0Fzc2lnbm1lbnRBcHByb2FjaGVzKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIkFzc2lnbm1lbnRBcHByb2FjaGVzIgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRSb2xlRGVzY3JpcHRpb25fU2tpbGxzKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIlNraWxscyIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0Um9sZURlc2NyaXB0aW9uX1N5bm9ueW1zKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIlN5bm9ueW1zIgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChyb2xlRGVzY3JpcHRvckVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiUm9sZURlc2NyaXB0b3IiLAotCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFJvbGVEZXNjcmlwdG9yX1JvbGUoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiUm9sZSIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRSb2xlRGVzY3JpcHRvcl9SZXNwb25zaWJsZUZvcigpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJSZXNwb25zaWJsZUZvciIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAocm9sZVNldEVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiUm9sZVNldCIsCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0Um9sZVNldF9Hcm91cDIoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZ3JvdXAiLAotCQkJICJuYW1lIiwgImdyb3VwOjI0IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFJvbGVTZXRfUm9sZSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJSb2xlIiwKLQkJCSAiZ3JvdXAiLCAiI2dyb3VwOjI0IgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChyb2xlU2V0R3JvdXBpbmdFQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgIlJvbGVTZXRHcm91cGluZyIsCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0Um9sZVNldEdyb3VwaW5nX0dyb3VwMigpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJncm91cCIsCi0JCQkgIm5hbWUiLCAiZ3JvdXA6MjQiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0Um9sZVNldEdyb3VwaW5nX1JvbGVTZXQoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiUm9sZVNldCIsCi0JCQkgImdyb3VwIiwgIiNncm91cDoyNCIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoc2VjdGlvbkVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiU2VjdGlvbiIsCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0U2VjdGlvbl9TdWJTZWN0aW9uKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIlN1YlNlY3Rpb24iCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0U2VjdGlvbl9QcmVkZWNlc3NvcigpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJQcmVkZWNlc3NvciIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0U2VjdGlvbl9EZXNjcmlwdGlvbigpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJEZXNjcmlwdGlvbiIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0U2VjdGlvbl9TZWN0aW9uTmFtZSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJhdHRyaWJ1dGUiLAotCQkJICJuYW1lIiwgInNlY3Rpb25OYW1lIgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFNlY3Rpb25fVmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJhdHRyaWJ1dGUiLAotCQkJICJuYW1lIiwgInZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0U2VjdGlvbl9WYXJpYWJpbGl0eVR5cGUoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiYXR0cmlidXRlIiwKLQkJCSAibmFtZSIsICJ2YXJpYWJpbGl0eVR5cGUiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKHN1cHBvcnRpbmdNYXRlcmlhbEVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiU3VwcG9ydGluZ01hdGVyaWFsIiwKLQkJCSAia2luZCIsICJlbGVtZW50T25seSIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAodGFza0VDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiVGFzayIsCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0VGFza19QcmVjb25kaXRpb24oKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiUHJlY29uZGl0aW9uIgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFRhc2tfUG9zdGNvbmRpdGlvbigpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJQb3N0Y29uZGl0aW9uIgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFRhc2tfUGVyZm9ybWVkQnkoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiUGVyZm9ybWVkQnkiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0VGFza19Hcm91cDIoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZ3JvdXAiLAotCQkJICJuYW1lIiwgImdyb3VwOjI3IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFRhc2tfTWFuZGF0b3J5SW5wdXQoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiTWFuZGF0b3J5SW5wdXQiLAotCQkJICJncm91cCIsICIjZ3JvdXA6MjciCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0VGFza19PdXRwdXQoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiT3V0cHV0IiwKLQkJCSAiZ3JvdXAiLCAiI2dyb3VwOjI3IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFRhc2tfQWRkaXRpb25hbGx5UGVyZm9ybWVkQnkoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiQWRkaXRpb25hbGx5UGVyZm9ybWVkQnkiLAotCQkJICJncm91cCIsICIjZ3JvdXA6MjciCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0VGFza19PcHRpb25hbElucHV0KCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIk9wdGlvbmFsSW5wdXQiLAotCQkJICJncm91cCIsICIjZ3JvdXA6MjciCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0VGFza19Fc3RpbWF0ZSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJFc3RpbWF0ZSIsCi0JCQkgImdyb3VwIiwgIiNncm91cDoyNyIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRUYXNrX0VzdGltYXRpb25Db25zaWRlcmF0aW9ucygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMiLAotCQkJICJncm91cCIsICIjZ3JvdXA6MjciCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0VGFza19Ub29sTWVudG9yKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIlRvb2xNZW50b3IiLAotCQkJICJncm91cCIsICIjZ3JvdXA6MjciCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKHRhc2tEZXNjcmlwdGlvbkVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiVGFza0Rlc2NyaXB0aW9uIiwKLQkJCSAia2luZCIsICJlbGVtZW50T25seSIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0VGFza0Rlc2NyaXB0aW9uX0FsdGVybmF0aXZlcygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJBbHRlcm5hdGl2ZXMiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFRhc2tEZXNjcmlwdGlvbl9QdXJwb3NlKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIlB1cnBvc2UiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKHRhc2tEZXNjcmlwdG9yRUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJUYXNrRGVzY3JpcHRvciIsCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0VGFza0Rlc2NyaXB0b3JfVGFzaygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJUYXNrIgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFRhc2tEZXNjcmlwdG9yX1BlcmZvcm1lZFByaW1hcmlseUJ5KCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIlBlcmZvcm1lZFByaW1hcmlseUJ5IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFRhc2tEZXNjcmlwdG9yX0dyb3VwMygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJncm91cCIsCi0JCQkgIm5hbWUiLCAiZ3JvdXA6MzciCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0VGFza0Rlc2NyaXB0b3JfQWRkaXRpb25hbGx5UGVyZm9ybWVkQnkoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiQWRkaXRpb25hbGx5UGVyZm9ybWVkQnkiLAotCQkJICJncm91cCIsICIjZ3JvdXA6MzciCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0VGFza0Rlc2NyaXB0b3JfQXNzaXN0ZWRCeSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJBc3Npc3RlZEJ5IiwKLQkJCSAiZ3JvdXAiLCAiI2dyb3VwOjM3IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFRhc2tEZXNjcmlwdG9yX0V4dGVybmFsSW5wdXQoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiRXh0ZXJuYWxJbnB1dCIsCi0JCQkgImdyb3VwIiwgIiNncm91cDozNyIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRUYXNrRGVzY3JpcHRvcl9NYW5kYXRvcnlJbnB1dCgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJNYW5kYXRvcnlJbnB1dCIsCi0JCQkgImdyb3VwIiwgIiNncm91cDozNyIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRUYXNrRGVzY3JpcHRvcl9PcHRpb25hbElucHV0KCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIk9wdGlvbmFsSW5wdXQiLAotCQkJICJncm91cCIsICIjZ3JvdXA6MzciCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0VGFza0Rlc2NyaXB0b3JfT3V0cHV0KCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIk91dHB1dCIsCi0JCQkgImdyb3VwIiwgIiNncm91cDozNyIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRUYXNrRGVzY3JpcHRvcl9TdGVwKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIlN0ZXAiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0VGFza0Rlc2NyaXB0b3JfSXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImF0dHJpYnV0ZSIsCi0JCQkgIm5hbWUiLCAiaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlIgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgICh0ZWFtUHJvZmlsZUVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiVGVhbVByb2ZpbGUiLAotCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFRlYW1Qcm9maWxlX0dyb3VwMigpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJncm91cCIsCi0JCQkgIm5hbWUiLCAiZ3JvdXA6MzAiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0VGVhbVByb2ZpbGVfUm9sZSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJSb2xlIiwKLQkJCSAiZ3JvdXAiLCAiI2dyb3VwOjMwIgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFRlYW1Qcm9maWxlX1N1cGVyVGVhbSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJTdXBlclRlYW0iLAotCQkJICJncm91cCIsICIjZ3JvdXA6MzAiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0VGVhbVByb2ZpbGVfU3ViVGVhbSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJTdWJUZWFtIiwKLQkJCSAiZ3JvdXAiLCAiI2dyb3VwOjMwIgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgICh0ZW1wbGF0ZUVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiVGVtcGxhdGUiLAotCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgICh0ZXJtRGVmaW5pdGlvbkVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiVGVybURlZmluaXRpb24iLAotCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgICh0b29sRUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJUb29sIiwKLQkJCSAia2luZCIsICJlbGVtZW50T25seSIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRUb29sX0dyb3VwMigpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJncm91cCIsCi0JCQkgIm5hbWUiLCAiZ3JvdXA6MjQiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0VG9vbF9Ub29sTWVudG9yKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIlRvb2xNZW50b3IiLAotCQkJICJncm91cCIsICIjZ3JvdXA6MjQiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKHRvb2xNZW50b3JFQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgIlRvb2xNZW50b3IiLAotCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgICh2YXJpYWJpbGl0eVR5cGVFRW51bSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiVmFyaWFiaWxpdHlUeXBlIgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKHZhcmlhYmlsaXR5VHlwZU9iamVjdEVEYXRhVHlwZSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiVmFyaWFiaWxpdHlUeXBlOk9iamVjdCIsCi0JCQkgImJhc2VUeXBlIiwgIlZhcmlhYmlsaXR5VHlwZSIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAod2hpdGVwYXBlckVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiV2hpdGVwYXBlciIsCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKHdvcmtCcmVha2Rvd25FbGVtZW50RUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJXb3JrQnJlYWtkb3duRWxlbWVudCIsCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0V29ya0JyZWFrZG93bkVsZW1lbnRfR3JvdXAyKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImdyb3VwIiwKLQkJCSAibmFtZSIsICJncm91cDozMCIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRXb3JrQnJlYWtkb3duRWxlbWVudF9QcmVkZWNlc3NvcigpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJQcmVkZWNlc3NvciIsCi0JCQkgImdyb3VwIiwgIiNncm91cDozMCIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0V29ya0JyZWFrZG93bkVsZW1lbnRfSXNFdmVudERyaXZlbigpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJhdHRyaWJ1dGUiLAotCQkJICJuYW1lIiwgImlzRXZlbnREcml2ZW4iCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFdvcmtCcmVha2Rvd25FbGVtZW50X0lzT25nb2luZygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJhdHRyaWJ1dGUiLAotCQkJICJuYW1lIiwgImlzT25nb2luZyIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0V29ya0JyZWFrZG93bkVsZW1lbnRfSXNSZXBlYXRhYmxlKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImF0dHJpYnV0ZSIsCi0JCQkgIm5hbWUiLCAiaXNSZXBlYXRhYmxlIgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgICh3b3JrRGVmaW5pdGlvbkVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiV29ya0RlZmluaXRpb24iLAotCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFdvcmtEZWZpbml0aW9uX1ByZWNvbmRpdGlvbigpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJQcmVjb25kaXRpb24iCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0V29ya0RlZmluaXRpb25fUG9zdGNvbmRpdGlvbigpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJQb3N0Y29uZGl0aW9uIgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgICh3b3JrT3JkZXJFQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgIldvcmtPcmRlciIsCi0JCQkgImtpbmQiLCAic2ltcGxlIgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFdvcmtPcmRlcl9WYWx1ZSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICI6MCIsCi0JCQkgImtpbmQiLCAic2ltcGxlIgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRXb3JrT3JkZXJfSWQoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiYXR0cmlidXRlIiwKLQkJCSAibmFtZSIsICJpZCIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0V29ya09yZGVyX0xpbmtUeXBlKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImF0dHJpYnV0ZSIsCi0JCQkgIm5hbWUiLCAibGlua1R5cGUiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKHdvcmtPcmRlclR5cGVFRW51bSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiV29ya09yZGVyVHlwZSIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgICh3b3JrT3JkZXJUeXBlT2JqZWN0RURhdGFUeXBlLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJXb3JrT3JkZXJUeXBlOk9iamVjdCIsCi0JCQkgImJhc2VUeXBlIiwgIldvcmtPcmRlclR5cGUiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKHdvcmtQcm9kdWN0RUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJXb3JrUHJvZHVjdCIsCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0V29ya1Byb2R1Y3RfR3JvdXAyKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImdyb3VwIiwKLQkJCSAibmFtZSIsICJncm91cDoyNCIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRXb3JrUHJvZHVjdF9Fc3RpbWF0ZSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJFc3RpbWF0ZSIsCi0JCQkgImdyb3VwIiwgIiNncm91cDoyNCIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRXb3JrUHJvZHVjdF9Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIiwKLQkJCSAiZ3JvdXAiLCAiI2dyb3VwOjI0IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFdvcmtQcm9kdWN0X1JlcG9ydCgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJSZXBvcnQiLAotCQkJICJncm91cCIsICIjZ3JvdXA6MjQiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0V29ya1Byb2R1Y3RfVGVtcGxhdGUoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiVGVtcGxhdGUiLAotCQkJICJncm91cCIsICIjZ3JvdXA6MjQiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0V29ya1Byb2R1Y3RfVG9vbE1lbnRvcigpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJUb29sTWVudG9yIiwKLQkJCSAiZ3JvdXAiLCAiI2dyb3VwOjI0IgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgICh3b3JrUHJvZHVjdERlc2NyaXB0aW9uRUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJXb3JrUHJvZHVjdERlc2NyaXB0aW9uIiwKLQkJCSAia2luZCIsICJlbGVtZW50T25seSIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0V29ya1Byb2R1Y3REZXNjcmlwdGlvbl9JbXBhY3RPZk5vdEhhdmluZygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJJbXBhY3RPZk5vdEhhdmluZyIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0V29ya1Byb2R1Y3REZXNjcmlwdGlvbl9QdXJwb3NlKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIlB1cnBvc2UiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFdvcmtQcm9kdWN0RGVzY3JpcHRpb25fUmVhc29uc0Zvck5vdE5lZWRpbmcoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiUmVhc29uc0Zvck5vdE5lZWRpbmciCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKHdvcmtQcm9kdWN0RGVzY3JpcHRvckVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiV29ya1Byb2R1Y3REZXNjcmlwdG9yIiwKLQkJCSAia2luZCIsICJlbGVtZW50T25seSIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JfV29ya1Byb2R1Y3QoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiV29ya1Byb2R1Y3QiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX1Jlc3BvbnNpYmxlUm9sZSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJSZXNwb25zaWJsZVJvbGUiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX0dyb3VwMigpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJncm91cCIsCi0JCQkgIm5hbWUiLCAiZ3JvdXA6MzMiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX0V4dGVybmFsSW5wdXRUbygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJFeHRlcm5hbElucHV0VG8iLAotCQkJICJncm91cCIsICIjZ3JvdXA6MzMiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX0ltcGFjdGVkQnkoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiSW1wYWN0ZWRCeSIsCi0JCQkgImdyb3VwIiwgIiNncm91cDozMyIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JfSW1wYWN0cygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJJbXBhY3RzIiwKLQkJCSAiZ3JvdXAiLCAiI2dyb3VwOjMzIgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9NYW5kYXRvcnlJbnB1dFRvKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIk1hbmRhdG9yeUlucHV0VG8iLAotCQkJICJncm91cCIsICIjZ3JvdXA6MzMiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX09wdGlvbmFsSW5wdXRUbygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJPcHRpb25hbElucHV0VG8iLAotCQkJICJncm91cCIsICIjZ3JvdXA6MzMiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX091dHB1dEZyb20oKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiT3V0cHV0RnJvbSIsCi0JCQkgImdyb3VwIiwgIiNncm91cDozMyIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JfRGVsaXZlcmFibGVQYXJ0cygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJEZWxpdmVyYWJsZVBhcnRzIiwKLQkJCSAiZ3JvdXAiLCAiI2dyb3VwOjMzIgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JfQWN0aXZpdHlFbnRyeVN0YXRlKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImF0dHJpYnV0ZSIsCi0JCQkgIm5hbWUiLCAiYWN0aXZpdHlFbnRyeVN0YXRlIgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JfQWN0aXZpdHlFeGl0U3RhdGUoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiYXR0cmlidXRlIiwKLQkJCSAibmFtZSIsICJhY3Rpdml0eUV4aXRTdGF0ZSIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAod29ya1Byb2R1Y3RUeXBlRUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJXb3JrUHJvZHVjdFR5cGUiLAotCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFdvcmtQcm9kdWN0VHlwZV9Hcm91cDIoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZ3JvdXAiLAotCQkJICJuYW1lIiwgImdyb3VwOjI0IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFdvcmtQcm9kdWN0VHlwZV9Xb3JrUHJvZHVjdCgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJXb3JrUHJvZHVjdCIsCi0JCQkgImdyb3VwIiwgIiNncm91cDoyNCIKLQkJICAgfSk7Ci0JfQotCi19IC8vVW1hUGFja2FnZUltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1doaXRlcGFwZXJJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9XaGl0ZXBhcGVySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYWUwNzM5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1doaXRlcGFwZXJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFdoaXRlcGFwZXJJbXBsLmphdmEsdiAxLjIgMjAwOC8wMS8zMCAwMDo0MTo0NyBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5XaGl0ZXBhcGVyOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+V2hpdGVwYXBlcjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFdoaXRlcGFwZXJJbXBsIGV4dGVuZHMgQ29uY2VwdEltcGwgaW1wbGVtZW50cyBXaGl0ZXBhcGVyIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgV2hpdGVwYXBlckltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLldISVRFUEFQRVI7Ci0JfQotCi19IC8vV2hpdGVwYXBlckltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9Xb3JrQnJlYWtkb3duRWxlbWVudEltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1dvcmtCcmVha2Rvd25FbGVtZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZDZlYWQwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1dvcmtCcmVha2Rvd25FbGVtZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDU2ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogV29ya0JyZWFrZG93bkVsZW1lbnRJbXBsLmphdmEsdiAxLjIgMjAwOC8wMS8zMCAwMDo0MTo0NyBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuQmFzaWNGZWF0dXJlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtCcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtPcmRlcjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPldvcmsgQnJlYWtkb3duIEVsZW1lbnQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuV29ya0JyZWFrZG93bkVsZW1lbnRJbXBsI2dldEdyb3VwMiA8ZW0+R3JvdXAyPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLldvcmtCcmVha2Rvd25FbGVtZW50SW1wbCNnZXRQcmVkZWNlc3NvciA8ZW0+UHJlZGVjZXNzb3I8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuV29ya0JyZWFrZG93bkVsZW1lbnRJbXBsI2lzSXNFdmVudERyaXZlbiA8ZW0+SXMgRXZlbnQgRHJpdmVuPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLldvcmtCcmVha2Rvd25FbGVtZW50SW1wbCNpc0lzT25nb2luZyA8ZW0+SXMgT25nb2luZzwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Xb3JrQnJlYWtkb3duRWxlbWVudEltcGwjaXNJc1JlcGVhdGFibGUgPGVtPklzIFJlcGVhdGFibGU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBXb3JrQnJlYWtkb3duRWxlbWVudEltcGwgZXh0ZW5kcyBCcmVha2Rvd25FbGVtZW50SW1wbCBpbXBsZW1lbnRzIFdvcmtCcmVha2Rvd25FbGVtZW50IHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRHcm91cDIoKSA8ZW0+R3JvdXAyPC9lbT59JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEdyb3VwMigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEZlYXR1cmVNYXAgZ3JvdXAyOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzSXNFdmVudERyaXZlbigpIDxlbT5JcyBFdmVudCBEcml2ZW48L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzSXNFdmVudERyaXZlbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIElTX0VWRU5UX0RSSVZFTl9FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNJc0V2ZW50RHJpdmVuKCkgPGVtPklzIEV2ZW50IERyaXZlbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNJc0V2ZW50RHJpdmVuKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0V2ZW50RHJpdmVuID0gSVNfRVZFTlRfRFJJVkVOX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBJcyBFdmVudCBEcml2ZW4gYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzRXZlbnREcml2ZW5FU2V0OwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzSXNPbmdvaW5nKCkgPGVtPklzIE9uZ29pbmc8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzSXNPbmdvaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gSVNfT05HT0lOR19FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNJc09uZ29pbmcoKSA8ZW0+SXMgT25nb2luZzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNJc09uZ29pbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzT25nb2luZyA9IElTX09OR09JTkdfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIElzIE9uZ29pbmcgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzT25nb2luZ0VTZXQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNJc1JlcGVhdGFibGUoKSA8ZW0+SXMgUmVwZWF0YWJsZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNJc1JlcGVhdGFibGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBJU19SRVBFQVRBQkxFX0VERUZBVUxUID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0lzUmVwZWF0YWJsZSgpIDxlbT5JcyBSZXBlYXRhYmxlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0lzUmVwZWF0YWJsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNSZXBlYXRhYmxlID0gSVNfUkVQRUFUQUJMRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgSXMgUmVwZWF0YWJsZSBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNSZXBlYXRhYmxlRVNldDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBXb3JrQnJlYWtkb3duRWxlbWVudEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLldPUktfQlJFQUtET1dOX0VMRU1FTlQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEZlYXR1cmVNYXAgZ2V0R3JvdXAyKCkgewotCQlpZiAoZ3JvdXAyID09IG51bGwpIHsKLQkJCWdyb3VwMiA9IG5ldyBCYXNpY0ZlYXR1cmVNYXAodGhpcywgVW1hUGFja2FnZS5XT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19HUk9VUDIpOwotCQl9Ci0JCXJldHVybiBncm91cDI7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFdvcmtPcmRlcj4gZ2V0UHJlZGVjZXNzb3IoKSB7Ci0JCXJldHVybiBnZXRHcm91cDIoKS5saXN0KFVtYVBhY2thZ2UuTGl0ZXJhbHMuV09SS19CUkVBS0RPV05fRUxFTUVOVF9fUFJFREVDRVNTT1IpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzSXNFdmVudERyaXZlbigpIHsKLQkJcmV0dXJuIGlzRXZlbnREcml2ZW47Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SXNFdmVudERyaXZlbihib29sZWFuIG5ld0lzRXZlbnREcml2ZW4pIHsKLQkJYm9vbGVhbiBvbGRJc0V2ZW50RHJpdmVuID0gaXNFdmVudERyaXZlbjsKLQkJaXNFdmVudERyaXZlbiA9IG5ld0lzRXZlbnREcml2ZW47Ci0JCWJvb2xlYW4gb2xkSXNFdmVudERyaXZlbkVTZXQgPSBpc0V2ZW50RHJpdmVuRVNldDsKLQkJaXNFdmVudERyaXZlbkVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLldPUktfQlJFQUtET1dOX0VMRU1FTlRfX0lTX0VWRU5UX0RSSVZFTiwgb2xkSXNFdmVudERyaXZlbiwgaXNFdmVudERyaXZlbiwgIW9sZElzRXZlbnREcml2ZW5FU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRJc0V2ZW50RHJpdmVuKCkgewotCQlib29sZWFuIG9sZElzRXZlbnREcml2ZW4gPSBpc0V2ZW50RHJpdmVuOwotCQlib29sZWFuIG9sZElzRXZlbnREcml2ZW5FU2V0ID0gaXNFdmVudERyaXZlbkVTZXQ7Ci0JCWlzRXZlbnREcml2ZW4gPSBJU19FVkVOVF9EUklWRU5fRURFRkFVTFQ7Ci0JCWlzRXZlbnREcml2ZW5FU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgVW1hUGFja2FnZS5XT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19JU19FVkVOVF9EUklWRU4sIG9sZElzRXZlbnREcml2ZW4sIElTX0VWRU5UX0RSSVZFTl9FREVGQVVMVCwgb2xkSXNFdmVudERyaXZlbkVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldElzRXZlbnREcml2ZW4oKSB7Ci0JCXJldHVybiBpc0V2ZW50RHJpdmVuRVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0lzT25nb2luZygpIHsKLQkJcmV0dXJuIGlzT25nb2luZzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJc09uZ29pbmcoYm9vbGVhbiBuZXdJc09uZ29pbmcpIHsKLQkJYm9vbGVhbiBvbGRJc09uZ29pbmcgPSBpc09uZ29pbmc7Ci0JCWlzT25nb2luZyA9IG5ld0lzT25nb2luZzsKLQkJYm9vbGVhbiBvbGRJc09uZ29pbmdFU2V0ID0gaXNPbmdvaW5nRVNldDsKLQkJaXNPbmdvaW5nRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuV09SS19CUkVBS0RPV05fRUxFTUVOVF9fSVNfT05HT0lORywgb2xkSXNPbmdvaW5nLCBpc09uZ29pbmcsICFvbGRJc09uZ29pbmdFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRJc09uZ29pbmcoKSB7Ci0JCWJvb2xlYW4gb2xkSXNPbmdvaW5nID0gaXNPbmdvaW5nOwotCQlib29sZWFuIG9sZElzT25nb2luZ0VTZXQgPSBpc09uZ29pbmdFU2V0OwotCQlpc09uZ29pbmcgPSBJU19PTkdPSU5HX0VERUZBVUxUOwotCQlpc09uZ29pbmdFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgVW1hUGFja2FnZS5XT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19JU19PTkdPSU5HLCBvbGRJc09uZ29pbmcsIElTX09OR09JTkdfRURFRkFVTFQsIG9sZElzT25nb2luZ0VTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldElzT25nb2luZygpIHsKLQkJcmV0dXJuIGlzT25nb2luZ0VTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNJc1JlcGVhdGFibGUoKSB7Ci0JCXJldHVybiBpc1JlcGVhdGFibGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SXNSZXBlYXRhYmxlKGJvb2xlYW4gbmV3SXNSZXBlYXRhYmxlKSB7Ci0JCWJvb2xlYW4gb2xkSXNSZXBlYXRhYmxlID0gaXNSZXBlYXRhYmxlOwotCQlpc1JlcGVhdGFibGUgPSBuZXdJc1JlcGVhdGFibGU7Ci0JCWJvb2xlYW4gb2xkSXNSZXBlYXRhYmxlRVNldCA9IGlzUmVwZWF0YWJsZUVTZXQ7Ci0JCWlzUmVwZWF0YWJsZUVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLldPUktfQlJFQUtET1dOX0VMRU1FTlRfX0lTX1JFUEVBVEFCTEUsIG9sZElzUmVwZWF0YWJsZSwgaXNSZXBlYXRhYmxlLCAhb2xkSXNSZXBlYXRhYmxlRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0SXNSZXBlYXRhYmxlKCkgewotCQlib29sZWFuIG9sZElzUmVwZWF0YWJsZSA9IGlzUmVwZWF0YWJsZTsKLQkJYm9vbGVhbiBvbGRJc1JlcGVhdGFibGVFU2V0ID0gaXNSZXBlYXRhYmxlRVNldDsKLQkJaXNSZXBlYXRhYmxlID0gSVNfUkVQRUFUQUJMRV9FREVGQVVMVDsKLQkJaXNSZXBlYXRhYmxlRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIFVtYVBhY2thZ2UuV09SS19CUkVBS0RPV05fRUxFTUVOVF9fSVNfUkVQRUFUQUJMRSwgb2xkSXNSZXBlYXRhYmxlLCBJU19SRVBFQVRBQkxFX0VERUZBVUxULCBvbGRJc1JlcGVhdGFibGVFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRJc1JlcGVhdGFibGUoKSB7Ci0JCXJldHVybiBpc1JlcGVhdGFibGVFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19HUk9VUDI6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRHcm91cDIoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfQlJFQUtET1dOX0VMRU1FTlRfX1BSRURFQ0VTU09SOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0UHJlZGVjZXNzb3IoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19CUkVBS0RPV05fRUxFTUVOVF9fR1JPVVAyOgotCQkJCWlmIChjb3JlVHlwZSkgcmV0dXJuIGdldEdyb3VwMigpOwotCQkJCXJldHVybiAoKEZlYXR1cmVNYXAuSW50ZXJuYWwpZ2V0R3JvdXAyKCkpLmdldFdyYXBwZXIoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19QUkVERUNFU1NPUjoKLQkJCQlyZXR1cm4gZ2V0UHJlZGVjZXNzb3IoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19JU19FVkVOVF9EUklWRU46Ci0JCQkJcmV0dXJuIGlzSXNFdmVudERyaXZlbigpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19JU19PTkdPSU5HOgotCQkJCXJldHVybiBpc0lzT25nb2luZygpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19JU19SRVBFQVRBQkxFOgotCQkJCXJldHVybiBpc0lzUmVwZWF0YWJsZSgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19HUk9VUDI6Ci0JCQkJKChGZWF0dXJlTWFwLkludGVybmFsKWdldEdyb3VwMigpKS5zZXQobmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19QUkVERUNFU1NPUjoKLQkJCQlnZXRQcmVkZWNlc3NvcigpLmNsZWFyKCk7Ci0JCQkJZ2V0UHJlZGVjZXNzb3IoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFdvcmtPcmRlcj4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19JU19FVkVOVF9EUklWRU46Ci0JCQkJc2V0SXNFdmVudERyaXZlbigoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19CUkVBS0RPV05fRUxFTUVOVF9fSVNfT05HT0lORzoKLQkJCQlzZXRJc09uZ29pbmcoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfQlJFQUtET1dOX0VMRU1FTlRfX0lTX1JFUEVBVEFCTEU6Ci0JCQkJc2V0SXNSZXBlYXRhYmxlKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19CUkVBS0RPV05fRUxFTUVOVF9fR1JPVVAyOgotCQkJCWdldEdyb3VwMigpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfQlJFQUtET1dOX0VMRU1FTlRfX1BSRURFQ0VTU09SOgotCQkJCWdldFByZWRlY2Vzc29yKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19CUkVBS0RPV05fRUxFTUVOVF9fSVNfRVZFTlRfRFJJVkVOOgotCQkJCXVuc2V0SXNFdmVudERyaXZlbigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19JU19PTkdPSU5HOgotCQkJCXVuc2V0SXNPbmdvaW5nKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfQlJFQUtET1dOX0VMRU1FTlRfX0lTX1JFUEVBVEFCTEU6Ci0JCQkJdW5zZXRJc1JlcGVhdGFibGUoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19HUk9VUDI6Ci0JCQkJcmV0dXJuIGdyb3VwMiAhPSBudWxsICYmICFncm91cDIuaXNFbXB0eSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfQlJFQUtET1dOX0VMRU1FTlRfX1BSRURFQ0VTU09SOgotCQkJCXJldHVybiAhZ2V0UHJlZGVjZXNzb3IoKS5pc0VtcHR5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19CUkVBS0RPV05fRUxFTUVOVF9fSVNfRVZFTlRfRFJJVkVOOgotCQkJCXJldHVybiBpc1NldElzRXZlbnREcml2ZW4oKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19JU19PTkdPSU5HOgotCQkJCXJldHVybiBpc1NldElzT25nb2luZygpOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfQlJFQUtET1dOX0VMRU1FTlRfX0lTX1JFUEVBVEFCTEU6Ci0JCQkJcmV0dXJuIGlzU2V0SXNSZXBlYXRhYmxlKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChncm91cDI6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGdyb3VwMik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgaXNFdmVudERyaXZlbjogIik7Ci0JCWlmIChpc0V2ZW50RHJpdmVuRVNldCkgcmVzdWx0LmFwcGVuZChpc0V2ZW50RHJpdmVuKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgaXNPbmdvaW5nOiAiKTsKLQkJaWYgKGlzT25nb2luZ0VTZXQpIHJlc3VsdC5hcHBlbmQoaXNPbmdvaW5nKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgaXNSZXBlYXRhYmxlOiAiKTsKLQkJaWYgKGlzUmVwZWF0YWJsZUVTZXQpIHJlc3VsdC5hcHBlbmQoaXNSZXBlYXRhYmxlKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL1dvcmtCcmVha2Rvd25FbGVtZW50SW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1dvcmtEZWZpbml0aW9uSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvV29ya0RlZmluaXRpb25JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmOGMxZDMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvV29ya0RlZmluaXRpb25JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTcgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBXb3JrRGVmaW5pdGlvbkltcGwuamF2YSx2IDEuMiAyMDA4LzAxLzMwIDAwOjQxOjQ3IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrRGVmaW5pdGlvbjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPldvcmsgRGVmaW5pdGlvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Xb3JrRGVmaW5pdGlvbkltcGwjZ2V0UHJlY29uZGl0aW9uIDxlbT5QcmVjb25kaXRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuV29ya0RlZmluaXRpb25JbXBsI2dldFBvc3Rjb25kaXRpb24gPGVtPlBvc3Rjb25kaXRpb248L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBXb3JrRGVmaW5pdGlvbkltcGwgZXh0ZW5kcyBNZXRob2RFbGVtZW50SW1wbCBpbXBsZW1lbnRzIFdvcmtEZWZpbml0aW9uIHsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJlY29uZGl0aW9uKCkgPGVtPlByZWNvbmRpdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UHJlY29uZGl0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVDT05ESVRJT05fRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJlY29uZGl0aW9uKCkgPGVtPlByZWNvbmRpdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UHJlY29uZGl0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHByZWNvbmRpdGlvbiA9IFBSRUNPTkRJVElPTl9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQb3N0Y29uZGl0aW9uKCkgPGVtPlBvc3Rjb25kaXRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFBvc3Rjb25kaXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBPU1RDT05ESVRJT05fRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UG9zdGNvbmRpdGlvbigpIDxlbT5Qb3N0Y29uZGl0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQb3N0Y29uZGl0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHBvc3Rjb25kaXRpb24gPSBQT1NUQ09ORElUSU9OX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFdvcmtEZWZpbml0aW9uSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuV09SS19ERUZJTklUSU9OOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UHJlY29uZGl0aW9uKCkgewotCQlyZXR1cm4gcHJlY29uZGl0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFByZWNvbmRpdGlvbihTdHJpbmcgbmV3UHJlY29uZGl0aW9uKSB7Ci0JCVN0cmluZyBvbGRQcmVjb25kaXRpb24gPSBwcmVjb25kaXRpb247Ci0JCXByZWNvbmRpdGlvbiA9IG5ld1ByZWNvbmRpdGlvbjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5XT1JLX0RFRklOSVRJT05fX1BSRUNPTkRJVElPTiwgb2xkUHJlY29uZGl0aW9uLCBwcmVjb25kaXRpb24pKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFBvc3Rjb25kaXRpb24oKSB7Ci0JCXJldHVybiBwb3N0Y29uZGl0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBvc3Rjb25kaXRpb24oU3RyaW5nIG5ld1Bvc3Rjb25kaXRpb24pIHsKLQkJU3RyaW5nIG9sZFBvc3Rjb25kaXRpb24gPSBwb3N0Y29uZGl0aW9uOwotCQlwb3N0Y29uZGl0aW9uID0gbmV3UG9zdGNvbmRpdGlvbjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5XT1JLX0RFRklOSVRJT05fX1BPU1RDT05ESVRJT04sIG9sZFBvc3Rjb25kaXRpb24sIHBvc3Rjb25kaXRpb24pKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19ERUZJTklUSU9OX19QUkVDT05ESVRJT046Ci0JCQkJcmV0dXJuIGdldFByZWNvbmRpdGlvbigpOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfREVGSU5JVElPTl9fUE9TVENPTkRJVElPTjoKLQkJCQlyZXR1cm4gZ2V0UG9zdGNvbmRpdGlvbigpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19ERUZJTklUSU9OX19QUkVDT05ESVRJT046Ci0JCQkJc2V0UHJlY29uZGl0aW9uKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX0RFRklOSVRJT05fX1BPU1RDT05ESVRJT046Ci0JCQkJc2V0UG9zdGNvbmRpdGlvbigoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfREVGSU5JVElPTl9fUFJFQ09ORElUSU9OOgotCQkJCXNldFByZWNvbmRpdGlvbihQUkVDT05ESVRJT05fRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX0RFRklOSVRJT05fX1BPU1RDT05ESVRJT046Ci0JCQkJc2V0UG9zdGNvbmRpdGlvbihQT1NUQ09ORElUSU9OX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX0RFRklOSVRJT05fX1BSRUNPTkRJVElPTjoKLQkJCQlyZXR1cm4gUFJFQ09ORElUSU9OX0VERUZBVUxUID09IG51bGwgPyBwcmVjb25kaXRpb24gIT0gbnVsbCA6ICFQUkVDT05ESVRJT05fRURFRkFVTFQuZXF1YWxzKHByZWNvbmRpdGlvbik7Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19ERUZJTklUSU9OX19QT1NUQ09ORElUSU9OOgotCQkJCXJldHVybiBQT1NUQ09ORElUSU9OX0VERUZBVUxUID09IG51bGwgPyBwb3N0Y29uZGl0aW9uICE9IG51bGwgOiAhUE9TVENPTkRJVElPTl9FREVGQVVMVC5lcXVhbHMocG9zdGNvbmRpdGlvbik7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChwcmVjb25kaXRpb246ICIpOwotCQlyZXN1bHQuYXBwZW5kKHByZWNvbmRpdGlvbik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcG9zdGNvbmRpdGlvbjogIik7Ci0JCXJlc3VsdC5hcHBlbmQocG9zdGNvbmRpdGlvbik7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL1dvcmtEZWZpbml0aW9uSW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1dvcmtPcmRlckltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1dvcmtPcmRlckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzQwZTY2NC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9Xb3JrT3JkZXJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMTEgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBXb3JrT3JkZXJJbXBsLmphdmEsdiAxLjIgMjAwOC8wMS8zMCAwMDo0MTo0NyBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5zZG8uaW1wbC5FRGF0YU9iamVjdEltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtPcmRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrT3JkZXJUeXBlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+V29yayBPcmRlcjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Xb3JrT3JkZXJJbXBsI2dldFZhbHVlIDxlbT5WYWx1ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Xb3JrT3JkZXJJbXBsI2dldElkIDxlbT5JZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Xb3JrT3JkZXJJbXBsI2dldExpbmtUeXBlIDxlbT5MaW5rIFR5cGU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBXb3JrT3JkZXJJbXBsIGV4dGVuZHMgRURhdGFPYmplY3RJbXBsIGltcGxlbWVudHMgV29ya09yZGVyIHsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmFsdWUoKSA8ZW0+VmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFZhbHVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxVRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWYWx1ZSgpIDxlbT5WYWx1ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VmFsdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgdmFsdWUgPSBWQUxVRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJZCgpIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIElEX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElkKCkgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBpZCA9IElEX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldExpbmtUeXBlKCkgPGVtPkxpbmsgVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TGlua1R5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgV29ya09yZGVyVHlwZSBMSU5LX1RZUEVfRURFRkFVTFQgPSBXb3JrT3JkZXJUeXBlLkZJTklTSF9UT19TVEFSVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldExpbmtUeXBlKCkgPGVtPkxpbmsgVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TGlua1R5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBXb3JrT3JkZXJUeXBlIGxpbmtUeXBlID0gTElOS19UWVBFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBMaW5rIFR5cGUgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGxpbmtUeXBlRVNldDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBXb3JrT3JkZXJJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5XT1JLX09SREVSOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKSB7Ci0JCXJldHVybiB2YWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShTdHJpbmcgbmV3VmFsdWUpIHsKLQkJU3RyaW5nIG9sZFZhbHVlID0gdmFsdWU7Ci0JCXZhbHVlID0gbmV3VmFsdWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuV09SS19PUkRFUl9fVkFMVUUsIG9sZFZhbHVlLCB2YWx1ZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCXJldHVybiBpZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJZChTdHJpbmcgbmV3SWQpIHsKLQkJU3RyaW5nIG9sZElkID0gaWQ7Ci0JCWlkID0gbmV3SWQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuV09SS19PUkRFUl9fSUQsIG9sZElkLCBpZCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBXb3JrT3JkZXJUeXBlIGdldExpbmtUeXBlKCkgewotCQlyZXR1cm4gbGlua1R5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGlua1R5cGUoV29ya09yZGVyVHlwZSBuZXdMaW5rVHlwZSkgewotCQlXb3JrT3JkZXJUeXBlIG9sZExpbmtUeXBlID0gbGlua1R5cGU7Ci0JCWxpbmtUeXBlID0gbmV3TGlua1R5cGUgPT0gbnVsbCA/IExJTktfVFlQRV9FREVGQVVMVCA6IG5ld0xpbmtUeXBlOwotCQlib29sZWFuIG9sZExpbmtUeXBlRVNldCA9IGxpbmtUeXBlRVNldDsKLQkJbGlua1R5cGVFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5XT1JLX09SREVSX19MSU5LX1RZUEUsIG9sZExpbmtUeXBlLCBsaW5rVHlwZSwgIW9sZExpbmtUeXBlRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0TGlua1R5cGUoKSB7Ci0JCVdvcmtPcmRlclR5cGUgb2xkTGlua1R5cGUgPSBsaW5rVHlwZTsKLQkJYm9vbGVhbiBvbGRMaW5rVHlwZUVTZXQgPSBsaW5rVHlwZUVTZXQ7Ci0JCWxpbmtUeXBlID0gTElOS19UWVBFX0VERUZBVUxUOwotCQlsaW5rVHlwZUVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBVbWFQYWNrYWdlLldPUktfT1JERVJfX0xJTktfVFlQRSwgb2xkTGlua1R5cGUsIExJTktfVFlQRV9FREVGQVVMVCwgb2xkTGlua1R5cGVFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRMaW5rVHlwZSgpIHsKLQkJcmV0dXJuIGxpbmtUeXBlRVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19PUkRFUl9fVkFMVUU6Ci0JCQkJcmV0dXJuIGdldFZhbHVlKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19PUkRFUl9fSUQ6Ci0JCQkJcmV0dXJuIGdldElkKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19PUkRFUl9fTElOS19UWVBFOgotCQkJCXJldHVybiBnZXRMaW5rVHlwZSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19PUkRFUl9fVkFMVUU6Ci0JCQkJc2V0VmFsdWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfT1JERVJfX0lEOgotCQkJCXNldElkKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX09SREVSX19MSU5LX1RZUEU6Ci0JCQkJc2V0TGlua1R5cGUoKFdvcmtPcmRlclR5cGUpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19PUkRFUl9fVkFMVUU6Ci0JCQkJc2V0VmFsdWUoVkFMVUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX09SREVSX19JRDoKLQkJCQlzZXRJZChJRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfT1JERVJfX0xJTktfVFlQRToKLQkJCQl1bnNldExpbmtUeXBlKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19PUkRFUl9fVkFMVUU6Ci0JCQkJcmV0dXJuIFZBTFVFX0VERUZBVUxUID09IG51bGwgPyB2YWx1ZSAhPSBudWxsIDogIVZBTFVFX0VERUZBVUxULmVxdWFscyh2YWx1ZSk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19PUkRFUl9fSUQ6Ci0JCQkJcmV0dXJuIElEX0VERUZBVUxUID09IG51bGwgPyBpZCAhPSBudWxsIDogIUlEX0VERUZBVUxULmVxdWFscyhpZCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19PUkRFUl9fTElOS19UWVBFOgotCQkJCXJldHVybiBpc1NldExpbmtUeXBlKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiICh2YWx1ZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQodmFsdWUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGlkOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChpZCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgbGlua1R5cGU6ICIpOwotCQlpZiAobGlua1R5cGVFU2V0KSByZXN1bHQuYXBwZW5kKGxpbmtUeXBlKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL1dvcmtPcmRlckltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9Xb3JrUHJvZHVjdERlc2NyaXB0aW9uSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvV29ya1Byb2R1Y3REZXNjcmlwdGlvbkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2EzNGQyMy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9Xb3JrUHJvZHVjdERlc2NyaXB0aW9uSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcxICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogV29ya1Byb2R1Y3REZXNjcmlwdGlvbkltcGwuamF2YSx2IDEuMiAyMDA4LzAxLzMwIDAwOjQxOjQ3IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0aW9uOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+V29yayBQcm9kdWN0IERlc2NyaXB0aW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLldvcmtQcm9kdWN0RGVzY3JpcHRpb25JbXBsI2dldEltcGFjdE9mTm90SGF2aW5nIDxlbT5JbXBhY3QgT2YgTm90IEhhdmluZzwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Xb3JrUHJvZHVjdERlc2NyaXB0aW9uSW1wbCNnZXRQdXJwb3NlIDxlbT5QdXJwb3NlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLldvcmtQcm9kdWN0RGVzY3JpcHRpb25JbXBsI2dldFJlYXNvbnNGb3JOb3ROZWVkaW5nIDxlbT5SZWFzb25zIEZvciBOb3QgTmVlZGluZzwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFdvcmtQcm9kdWN0RGVzY3JpcHRpb25JbXBsIGV4dGVuZHMgQ29udGVudERlc2NyaXB0aW9uSW1wbCBpbXBsZW1lbnRzIFdvcmtQcm9kdWN0RGVzY3JpcHRpb24gewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJbXBhY3RPZk5vdEhhdmluZygpIDxlbT5JbXBhY3QgT2YgTm90IEhhdmluZzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SW1wYWN0T2ZOb3RIYXZpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIElNUEFDVF9PRl9OT1RfSEFWSU5HX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEltcGFjdE9mTm90SGF2aW5nKCkgPGVtPkltcGFjdCBPZiBOb3QgSGF2aW5nPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJbXBhY3RPZk5vdEhhdmluZygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBpbXBhY3RPZk5vdEhhdmluZyA9IElNUEFDVF9PRl9OT1RfSEFWSU5HX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFB1cnBvc2UoKSA8ZW0+UHVycG9zZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UHVycG9zZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFVSUE9TRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQdXJwb3NlKCkgPGVtPlB1cnBvc2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFB1cnBvc2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgcHVycG9zZSA9IFBVUlBPU0VfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVhc29uc0Zvck5vdE5lZWRpbmcoKSA8ZW0+UmVhc29ucyBGb3IgTm90IE5lZWRpbmc8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJlYXNvbnNGb3JOb3ROZWVkaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBSRUFTT05TX0ZPUl9OT1RfTkVFRElOR19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZWFzb25zRm9yTm90TmVlZGluZygpIDxlbT5SZWFzb25zIEZvciBOb3QgTmVlZGluZzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmVhc29uc0Zvck5vdE5lZWRpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgcmVhc29uc0Zvck5vdE5lZWRpbmcgPSBSRUFTT05TX0ZPUl9OT1RfTkVFRElOR19FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBXb3JrUHJvZHVjdERlc2NyaXB0aW9uSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SW1wYWN0T2ZOb3RIYXZpbmcoKSB7Ci0JCXJldHVybiBpbXBhY3RPZk5vdEhhdmluZzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJbXBhY3RPZk5vdEhhdmluZyhTdHJpbmcgbmV3SW1wYWN0T2ZOb3RIYXZpbmcpIHsKLQkJU3RyaW5nIG9sZEltcGFjdE9mTm90SGF2aW5nID0gaW1wYWN0T2ZOb3RIYXZpbmc7Ci0JCWltcGFjdE9mTm90SGF2aW5nID0gbmV3SW1wYWN0T2ZOb3RIYXZpbmc7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19JTVBBQ1RfT0ZfTk9UX0hBVklORywgb2xkSW1wYWN0T2ZOb3RIYXZpbmcsIGltcGFjdE9mTm90SGF2aW5nKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQdXJwb3NlKCkgewotCQlyZXR1cm4gcHVycG9zZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQdXJwb3NlKFN0cmluZyBuZXdQdXJwb3NlKSB7Ci0JCVN0cmluZyBvbGRQdXJwb3NlID0gcHVycG9zZTsKLQkJcHVycG9zZSA9IG5ld1B1cnBvc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19QVVJQT1NFLCBvbGRQdXJwb3NlLCBwdXJwb3NlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRSZWFzb25zRm9yTm90TmVlZGluZygpIHsKLQkJcmV0dXJuIHJlYXNvbnNGb3JOb3ROZWVkaW5nOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlYXNvbnNGb3JOb3ROZWVkaW5nKFN0cmluZyBuZXdSZWFzb25zRm9yTm90TmVlZGluZykgewotCQlTdHJpbmcgb2xkUmVhc29uc0Zvck5vdE5lZWRpbmcgPSByZWFzb25zRm9yTm90TmVlZGluZzsKLQkJcmVhc29uc0Zvck5vdE5lZWRpbmcgPSBuZXdSZWFzb25zRm9yTm90TmVlZGluZzsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX1JFQVNPTlNfRk9SX05PVF9ORUVESU5HLCBvbGRSZWFzb25zRm9yTm90TmVlZGluZywgcmVhc29uc0Zvck5vdE5lZWRpbmcpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19JTVBBQ1RfT0ZfTk9UX0hBVklORzoKLQkJCQlyZXR1cm4gZ2V0SW1wYWN0T2ZOb3RIYXZpbmcoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX1BVUlBPU0U6Ci0JCQkJcmV0dXJuIGdldFB1cnBvc2UoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX1JFQVNPTlNfRk9SX05PVF9ORUVESU5HOgotCQkJCXJldHVybiBnZXRSZWFzb25zRm9yTm90TmVlZGluZygpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19JTVBBQ1RfT0ZfTk9UX0hBVklORzoKLQkJCQlzZXRJbXBhY3RPZk5vdEhhdmluZygoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19QVVJQT1NFOgotCQkJCXNldFB1cnBvc2UoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fUkVBU09OU19GT1JfTk9UX05FRURJTkc6Ci0JCQkJc2V0UmVhc29uc0Zvck5vdE5lZWRpbmcoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX0lNUEFDVF9PRl9OT1RfSEFWSU5HOgotCQkJCXNldEltcGFjdE9mTm90SGF2aW5nKElNUEFDVF9PRl9OT1RfSEFWSU5HX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19QVVJQT1NFOgotCQkJCXNldFB1cnBvc2UoUFVSUE9TRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fUkVBU09OU19GT1JfTk9UX05FRURJTkc6Ci0JCQkJc2V0UmVhc29uc0Zvck5vdE5lZWRpbmcoUkVBU09OU19GT1JfTk9UX05FRURJTkdfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fSU1QQUNUX09GX05PVF9IQVZJTkc6Ci0JCQkJcmV0dXJuIElNUEFDVF9PRl9OT1RfSEFWSU5HX0VERUZBVUxUID09IG51bGwgPyBpbXBhY3RPZk5vdEhhdmluZyAhPSBudWxsIDogIUlNUEFDVF9PRl9OT1RfSEFWSU5HX0VERUZBVUxULmVxdWFscyhpbXBhY3RPZk5vdEhhdmluZyk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19QVVJQT1NFOgotCQkJCXJldHVybiBQVVJQT1NFX0VERUZBVUxUID09IG51bGwgPyBwdXJwb3NlICE9IG51bGwgOiAhUFVSUE9TRV9FREVGQVVMVC5lcXVhbHMocHVycG9zZSk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19SRUFTT05TX0ZPUl9OT1RfTkVFRElORzoKLQkJCQlyZXR1cm4gUkVBU09OU19GT1JfTk9UX05FRURJTkdfRURFRkFVTFQgPT0gbnVsbCA/IHJlYXNvbnNGb3JOb3ROZWVkaW5nICE9IG51bGwgOiAhUkVBU09OU19GT1JfTk9UX05FRURJTkdfRURFRkFVTFQuZXF1YWxzKHJlYXNvbnNGb3JOb3ROZWVkaW5nKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGltcGFjdE9mTm90SGF2aW5nOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChpbXBhY3RPZk5vdEhhdmluZyk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcHVycG9zZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQocHVycG9zZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcmVhc29uc0Zvck5vdE5lZWRpbmc6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHJlYXNvbnNGb3JOb3ROZWVkaW5nKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vV29ya1Byb2R1Y3REZXNjcmlwdGlvbkltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9Xb3JrUHJvZHVjdERlc2NyaXB0b3JJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9Xb3JrUHJvZHVjdERlc2NyaXB0b3JJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwNDE0YTAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvV29ya1Byb2R1Y3REZXNjcmlwdG9ySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTM2ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogV29ya1Byb2R1Y3REZXNjcmlwdG9ySW1wbC5qYXZhLHYgMS4yIDIwMDgvMDEvMzAgMDA6NDE6NDcga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuQmFzaWNGZWF0dXJlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+V29yayBQcm9kdWN0IERlc2NyaXB0b3I8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuV29ya1Byb2R1Y3REZXNjcmlwdG9ySW1wbCNnZXRXb3JrUHJvZHVjdCA8ZW0+V29yayBQcm9kdWN0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLldvcmtQcm9kdWN0RGVzY3JpcHRvckltcGwjZ2V0UmVzcG9uc2libGVSb2xlIDxlbT5SZXNwb25zaWJsZSBSb2xlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLldvcmtQcm9kdWN0RGVzY3JpcHRvckltcGwjZ2V0R3JvdXAyIDxlbT5Hcm91cDI8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuV29ya1Byb2R1Y3REZXNjcmlwdG9ySW1wbCNnZXRFeHRlcm5hbElucHV0VG8gPGVtPkV4dGVybmFsIElucHV0IFRvPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLldvcmtQcm9kdWN0RGVzY3JpcHRvckltcGwjZ2V0SW1wYWN0ZWRCeSA8ZW0+SW1wYWN0ZWQgQnk8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuV29ya1Byb2R1Y3REZXNjcmlwdG9ySW1wbCNnZXRJbXBhY3RzIDxlbT5JbXBhY3RzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLldvcmtQcm9kdWN0RGVzY3JpcHRvckltcGwjZ2V0TWFuZGF0b3J5SW5wdXRUbyA8ZW0+TWFuZGF0b3J5IElucHV0IFRvPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLldvcmtQcm9kdWN0RGVzY3JpcHRvckltcGwjZ2V0T3B0aW9uYWxJbnB1dFRvIDxlbT5PcHRpb25hbCBJbnB1dCBUbzwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Xb3JrUHJvZHVjdERlc2NyaXB0b3JJbXBsI2dldE91dHB1dEZyb20gPGVtPk91dHB1dCBGcm9tPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLldvcmtQcm9kdWN0RGVzY3JpcHRvckltcGwjZ2V0RGVsaXZlcmFibGVQYXJ0cyA8ZW0+RGVsaXZlcmFibGUgUGFydHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuV29ya1Byb2R1Y3REZXNjcmlwdG9ySW1wbCNnZXRBY3Rpdml0eUVudHJ5U3RhdGUgPGVtPkFjdGl2aXR5IEVudHJ5IFN0YXRlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLldvcmtQcm9kdWN0RGVzY3JpcHRvckltcGwjZ2V0QWN0aXZpdHlFeGl0U3RhdGUgPGVtPkFjdGl2aXR5IEV4aXQgU3RhdGU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBXb3JrUHJvZHVjdERlc2NyaXB0b3JJbXBsIGV4dGVuZHMgRGVzY3JpcHRvckltcGwgaW1wbGVtZW50cyBXb3JrUHJvZHVjdERlc2NyaXB0b3IgewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRXb3JrUHJvZHVjdCgpIDxlbT5Xb3JrIFByb2R1Y3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFdvcmtQcm9kdWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBXT1JLX1BST0RVQ1RfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0V29ya1Byb2R1Y3QoKSA8ZW0+V29yayBQcm9kdWN0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRXb3JrUHJvZHVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyB3b3JrUHJvZHVjdCA9IFdPUktfUFJPRFVDVF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZXNwb25zaWJsZVJvbGUoKSA8ZW0+UmVzcG9uc2libGUgUm9sZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmVzcG9uc2libGVSb2xlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBSRVNQT05TSUJMRV9ST0xFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlc3BvbnNpYmxlUm9sZSgpIDxlbT5SZXNwb25zaWJsZSBSb2xlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZXNwb25zaWJsZVJvbGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgcmVzcG9uc2libGVSb2xlID0gUkVTUE9OU0lCTEVfUk9MRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEdyb3VwMigpIDxlbT5Hcm91cDI8L2VtPn0nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0R3JvdXAyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRmVhdHVyZU1hcCBncm91cDI7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QWN0aXZpdHlFbnRyeVN0YXRlKCkgPGVtPkFjdGl2aXR5IEVudHJ5IFN0YXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBY3Rpdml0eUVudHJ5U3RhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElWSVRZX0VOVFJZX1NUQVRFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFjdGl2aXR5RW50cnlTdGF0ZSgpIDxlbT5BY3Rpdml0eSBFbnRyeSBTdGF0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QWN0aXZpdHlFbnRyeVN0YXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGFjdGl2aXR5RW50cnlTdGF0ZSA9IEFDVElWSVRZX0VOVFJZX1NUQVRFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFjdGl2aXR5RXhpdFN0YXRlKCkgPGVtPkFjdGl2aXR5IEV4aXQgU3RhdGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFjdGl2aXR5RXhpdFN0YXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJVklUWV9FWElUX1NUQVRFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFjdGl2aXR5RXhpdFN0YXRlKCkgPGVtPkFjdGl2aXR5IEV4aXQgU3RhdGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFjdGl2aXR5RXhpdFN0YXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGFjdGl2aXR5RXhpdFN0YXRlID0gQUNUSVZJVFlfRVhJVF9TVEFURV9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBXb3JrUHJvZHVjdERlc2NyaXB0b3JJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFdvcmtQcm9kdWN0KCkgewotCQlyZXR1cm4gd29ya1Byb2R1Y3Q7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0V29ya1Byb2R1Y3QoU3RyaW5nIG5ld1dvcmtQcm9kdWN0KSB7Ci0JCVN0cmluZyBvbGRXb3JrUHJvZHVjdCA9IHdvcmtQcm9kdWN0OwotCQl3b3JrUHJvZHVjdCA9IG5ld1dvcmtQcm9kdWN0OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX19XT1JLX1BST0RVQ1QsIG9sZFdvcmtQcm9kdWN0LCB3b3JrUHJvZHVjdCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UmVzcG9uc2libGVSb2xlKCkgewotCQlyZXR1cm4gcmVzcG9uc2libGVSb2xlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlc3BvbnNpYmxlUm9sZShTdHJpbmcgbmV3UmVzcG9uc2libGVSb2xlKSB7Ci0JCVN0cmluZyBvbGRSZXNwb25zaWJsZVJvbGUgPSByZXNwb25zaWJsZVJvbGU7Ci0JCXJlc3BvbnNpYmxlUm9sZSA9IG5ld1Jlc3BvbnNpYmxlUm9sZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fUkVTUE9OU0lCTEVfUk9MRSwgb2xkUmVzcG9uc2libGVSb2xlLCByZXNwb25zaWJsZVJvbGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRmVhdHVyZU1hcCBnZXRHcm91cDIoKSB7Ci0JCWlmIChncm91cDIgPT0gbnVsbCkgewotCQkJZ3JvdXAyID0gbmV3IEJhc2ljRmVhdHVyZU1hcCh0aGlzLCBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX19HUk9VUDIpOwotCQl9Ci0JCXJldHVybiBncm91cDI7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFN0cmluZz4gZ2V0RXh0ZXJuYWxJbnB1dFRvKCkgewotCQlyZXR1cm4gZ2V0R3JvdXAyKCkubGlzdChVbWFQYWNrYWdlLkxpdGVyYWxzLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX19FWFRFUk5BTF9JTlBVVF9UTyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFN0cmluZz4gZ2V0SW1wYWN0ZWRCeSgpIHsKLQkJcmV0dXJuIGdldEdyb3VwMigpLmxpc3QoVW1hUGFja2FnZS5MaXRlcmFscy5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fSU1QQUNURURfQlkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxTdHJpbmc+IGdldEltcGFjdHMoKSB7Ci0JCXJldHVybiBnZXRHcm91cDIoKS5saXN0KFVtYVBhY2thZ2UuTGl0ZXJhbHMuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0lNUEFDVFMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxTdHJpbmc+IGdldE1hbmRhdG9yeUlucHV0VG8oKSB7Ci0JCXJldHVybiBnZXRHcm91cDIoKS5saXN0KFVtYVBhY2thZ2UuTGl0ZXJhbHMuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX01BTkRBVE9SWV9JTlBVVF9UTyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFN0cmluZz4gZ2V0T3B0aW9uYWxJbnB1dFRvKCkgewotCQlyZXR1cm4gZ2V0R3JvdXAyKCkubGlzdChVbWFQYWNrYWdlLkxpdGVyYWxzLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX19PUFRJT05BTF9JTlBVVF9UTyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFN0cmluZz4gZ2V0T3V0cHV0RnJvbSgpIHsKLQkJcmV0dXJuIGdldEdyb3VwMigpLmxpc3QoVW1hUGFja2FnZS5MaXRlcmFscy5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fT1VUUFVUX0ZST00pOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxTdHJpbmc+IGdldERlbGl2ZXJhYmxlUGFydHMoKSB7Ci0JCXJldHVybiBnZXRHcm91cDIoKS5saXN0KFVtYVBhY2thZ2UuTGl0ZXJhbHMuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0RFTElWRVJBQkxFX1BBUlRTKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEFjdGl2aXR5RW50cnlTdGF0ZSgpIHsKLQkJcmV0dXJuIGFjdGl2aXR5RW50cnlTdGF0ZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBY3Rpdml0eUVudHJ5U3RhdGUoU3RyaW5nIG5ld0FjdGl2aXR5RW50cnlTdGF0ZSkgewotCQlTdHJpbmcgb2xkQWN0aXZpdHlFbnRyeVN0YXRlID0gYWN0aXZpdHlFbnRyeVN0YXRlOwotCQlhY3Rpdml0eUVudHJ5U3RhdGUgPSBuZXdBY3Rpdml0eUVudHJ5U3RhdGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0FDVElWSVRZX0VOVFJZX1NUQVRFLCBvbGRBY3Rpdml0eUVudHJ5U3RhdGUsIGFjdGl2aXR5RW50cnlTdGF0ZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0QWN0aXZpdHlFeGl0U3RhdGUoKSB7Ci0JCXJldHVybiBhY3Rpdml0eUV4aXRTdGF0ZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBY3Rpdml0eUV4aXRTdGF0ZShTdHJpbmcgbmV3QWN0aXZpdHlFeGl0U3RhdGUpIHsKLQkJU3RyaW5nIG9sZEFjdGl2aXR5RXhpdFN0YXRlID0gYWN0aXZpdHlFeGl0U3RhdGU7Ci0JCWFjdGl2aXR5RXhpdFN0YXRlID0gbmV3QWN0aXZpdHlFeGl0U3RhdGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0FDVElWSVRZX0VYSVRfU1RBVEUsIG9sZEFjdGl2aXR5RXhpdFN0YXRlLCBhY3Rpdml0eUV4aXRTdGF0ZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fR1JPVVAyOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0R3JvdXAyKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX19XT1JLX1BST0RVQ1Q6Ci0JCQkJcmV0dXJuIGdldFdvcmtQcm9kdWN0KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX1JFU1BPTlNJQkxFX1JPTEU6Ci0JCQkJcmV0dXJuIGdldFJlc3BvbnNpYmxlUm9sZSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX19HUk9VUDI6Ci0JCQkJaWYgKGNvcmVUeXBlKSByZXR1cm4gZ2V0R3JvdXAyKCk7Ci0JCQkJcmV0dXJuICgoRmVhdHVyZU1hcC5JbnRlcm5hbClnZXRHcm91cDIoKSkuZ2V0V3JhcHBlcigpOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX19FWFRFUk5BTF9JTlBVVF9UTzoKLQkJCQlyZXR1cm4gZ2V0RXh0ZXJuYWxJbnB1dFRvKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0lNUEFDVEVEX0JZOgotCQkJCXJldHVybiBnZXRJbXBhY3RlZEJ5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0lNUEFDVFM6Ci0JCQkJcmV0dXJuIGdldEltcGFjdHMoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fTUFOREFUT1JZX0lOUFVUX1RPOgotCQkJCXJldHVybiBnZXRNYW5kYXRvcnlJbnB1dFRvKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX09QVElPTkFMX0lOUFVUX1RPOgotCQkJCXJldHVybiBnZXRPcHRpb25hbElucHV0VG8oKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fT1VUUFVUX0ZST006Ci0JCQkJcmV0dXJuIGdldE91dHB1dEZyb20oKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fREVMSVZFUkFCTEVfUEFSVFM6Ci0JCQkJcmV0dXJuIGdldERlbGl2ZXJhYmxlUGFydHMoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fQUNUSVZJVFlfRU5UUllfU1RBVEU6Ci0JCQkJcmV0dXJuIGdldEFjdGl2aXR5RW50cnlTdGF0ZSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX19BQ1RJVklUWV9FWElUX1NUQVRFOgotCQkJCXJldHVybiBnZXRBY3Rpdml0eUV4aXRTdGF0ZSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX19XT1JLX1BST0RVQ1Q6Ci0JCQkJc2V0V29ya1Byb2R1Y3QoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX19SRVNQT05TSUJMRV9ST0xFOgotCQkJCXNldFJlc3BvbnNpYmxlUm9sZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0dST1VQMjoKLQkJCQkoKEZlYXR1cmVNYXAuSW50ZXJuYWwpZ2V0R3JvdXAyKCkpLnNldChuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX19FWFRFUk5BTF9JTlBVVF9UTzoKLQkJCQlnZXRFeHRlcm5hbElucHV0VG8oKS5jbGVhcigpOwotCQkJCWdldEV4dGVybmFsSW5wdXRUbygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgU3RyaW5nPiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX19JTVBBQ1RFRF9CWToKLQkJCQlnZXRJbXBhY3RlZEJ5KCkuY2xlYXIoKTsKLQkJCQlnZXRJbXBhY3RlZEJ5KCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBTdHJpbmc+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0lNUEFDVFM6Ci0JCQkJZ2V0SW1wYWN0cygpLmNsZWFyKCk7Ci0JCQkJZ2V0SW1wYWN0cygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgU3RyaW5nPiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX19NQU5EQVRPUllfSU5QVVRfVE86Ci0JCQkJZ2V0TWFuZGF0b3J5SW5wdXRUbygpLmNsZWFyKCk7Ci0JCQkJZ2V0TWFuZGF0b3J5SW5wdXRUbygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgU3RyaW5nPiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX19PUFRJT05BTF9JTlBVVF9UTzoKLQkJCQlnZXRPcHRpb25hbElucHV0VG8oKS5jbGVhcigpOwotCQkJCWdldE9wdGlvbmFsSW5wdXRUbygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgU3RyaW5nPiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX19PVVRQVVRfRlJPTToKLQkJCQlnZXRPdXRwdXRGcm9tKCkuY2xlYXIoKTsKLQkJCQlnZXRPdXRwdXRGcm9tKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBTdHJpbmc+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0RFTElWRVJBQkxFX1BBUlRTOgotCQkJCWdldERlbGl2ZXJhYmxlUGFydHMoKS5jbGVhcigpOwotCQkJCWdldERlbGl2ZXJhYmxlUGFydHMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFN0cmluZz4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fQUNUSVZJVFlfRU5UUllfU1RBVEU6Ci0JCQkJc2V0QWN0aXZpdHlFbnRyeVN0YXRlKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fQUNUSVZJVFlfRVhJVF9TVEFURToKLQkJCQlzZXRBY3Rpdml0eUV4aXRTdGF0ZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX19XT1JLX1BST0RVQ1Q6Ci0JCQkJc2V0V29ya1Byb2R1Y3QoV09SS19QUk9EVUNUX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX1JFU1BPTlNJQkxFX1JPTEU6Ci0JCQkJc2V0UmVzcG9uc2libGVSb2xlKFJFU1BPTlNJQkxFX1JPTEVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fR1JPVVAyOgotCQkJCWdldEdyb3VwMigpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX19FWFRFUk5BTF9JTlBVVF9UTzoKLQkJCQlnZXRFeHRlcm5hbElucHV0VG8oKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fSU1QQUNURURfQlk6Ci0JCQkJZ2V0SW1wYWN0ZWRCeSgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX19JTVBBQ1RTOgotCQkJCWdldEltcGFjdHMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fTUFOREFUT1JZX0lOUFVUX1RPOgotCQkJCWdldE1hbmRhdG9yeUlucHV0VG8oKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fT1BUSU9OQUxfSU5QVVRfVE86Ci0JCQkJZ2V0T3B0aW9uYWxJbnB1dFRvKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX09VVFBVVF9GUk9NOgotCQkJCWdldE91dHB1dEZyb20oKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fREVMSVZFUkFCTEVfUEFSVFM6Ci0JCQkJZ2V0RGVsaXZlcmFibGVQYXJ0cygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX19BQ1RJVklUWV9FTlRSWV9TVEFURToKLQkJCQlzZXRBY3Rpdml0eUVudHJ5U3RhdGUoQUNUSVZJVFlfRU5UUllfU1RBVEVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fQUNUSVZJVFlfRVhJVF9TVEFURToKLQkJCQlzZXRBY3Rpdml0eUV4aXRTdGF0ZShBQ1RJVklUWV9FWElUX1NUQVRFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fV09SS19QUk9EVUNUOgotCQkJCXJldHVybiBXT1JLX1BST0RVQ1RfRURFRkFVTFQgPT0gbnVsbCA/IHdvcmtQcm9kdWN0ICE9IG51bGwgOiAhV09SS19QUk9EVUNUX0VERUZBVUxULmVxdWFscyh3b3JrUHJvZHVjdCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX1JFU1BPTlNJQkxFX1JPTEU6Ci0JCQkJcmV0dXJuIFJFU1BPTlNJQkxFX1JPTEVfRURFRkFVTFQgPT0gbnVsbCA/IHJlc3BvbnNpYmxlUm9sZSAhPSBudWxsIDogIVJFU1BPTlNJQkxFX1JPTEVfRURFRkFVTFQuZXF1YWxzKHJlc3BvbnNpYmxlUm9sZSk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0dST1VQMjoKLQkJCQlyZXR1cm4gZ3JvdXAyICE9IG51bGwgJiYgIWdyb3VwMi5pc0VtcHR5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0VYVEVSTkFMX0lOUFVUX1RPOgotCQkJCXJldHVybiAhZ2V0RXh0ZXJuYWxJbnB1dFRvKCkuaXNFbXB0eSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX19JTVBBQ1RFRF9CWToKLQkJCQlyZXR1cm4gIWdldEltcGFjdGVkQnkoKS5pc0VtcHR5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0lNUEFDVFM6Ci0JCQkJcmV0dXJuICFnZXRJbXBhY3RzKCkuaXNFbXB0eSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX19NQU5EQVRPUllfSU5QVVRfVE86Ci0JCQkJcmV0dXJuICFnZXRNYW5kYXRvcnlJbnB1dFRvKCkuaXNFbXB0eSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX19PUFRJT05BTF9JTlBVVF9UTzoKLQkJCQlyZXR1cm4gIWdldE9wdGlvbmFsSW5wdXRUbygpLmlzRW1wdHkoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fT1VUUFVUX0ZST006Ci0JCQkJcmV0dXJuICFnZXRPdXRwdXRGcm9tKCkuaXNFbXB0eSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX19ERUxJVkVSQUJMRV9QQVJUUzoKLQkJCQlyZXR1cm4gIWdldERlbGl2ZXJhYmxlUGFydHMoKS5pc0VtcHR5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0FDVElWSVRZX0VOVFJZX1NUQVRFOgotCQkJCXJldHVybiBBQ1RJVklUWV9FTlRSWV9TVEFURV9FREVGQVVMVCA9PSBudWxsID8gYWN0aXZpdHlFbnRyeVN0YXRlICE9IG51bGwgOiAhQUNUSVZJVFlfRU5UUllfU1RBVEVfRURFRkFVTFQuZXF1YWxzKGFjdGl2aXR5RW50cnlTdGF0ZSk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0FDVElWSVRZX0VYSVRfU1RBVEU6Ci0JCQkJcmV0dXJuIEFDVElWSVRZX0VYSVRfU1RBVEVfRURFRkFVTFQgPT0gbnVsbCA/IGFjdGl2aXR5RXhpdFN0YXRlICE9IG51bGwgOiAhQUNUSVZJVFlfRVhJVF9TVEFURV9FREVGQVVMVC5lcXVhbHMoYWN0aXZpdHlFeGl0U3RhdGUpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAod29ya1Byb2R1Y3Q6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHdvcmtQcm9kdWN0KTsKLQkJcmVzdWx0LmFwcGVuZCgiLCByZXNwb25zaWJsZVJvbGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHJlc3BvbnNpYmxlUm9sZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZ3JvdXAyOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChncm91cDIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGFjdGl2aXR5RW50cnlTdGF0ZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoYWN0aXZpdHlFbnRyeVN0YXRlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBhY3Rpdml0eUV4aXRTdGF0ZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoYWN0aXZpdHlFeGl0U3RhdGUpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9Xb3JrUHJvZHVjdERlc2NyaXB0b3JJbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvV29ya1Byb2R1Y3RJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9Xb3JrUHJvZHVjdEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTFiODYxYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9Xb3JrUHJvZHVjdEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3MSArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFdvcmtQcm9kdWN0SW1wbC5qYXZhLHYgMS4yIDIwMDgvMDEvMzAgMDA6NDE6NDcga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuQmFzaWNGZWF0dXJlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtQcm9kdWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+V29yayBQcm9kdWN0PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLldvcmtQcm9kdWN0SW1wbCNnZXRHcm91cDIgPGVtPkdyb3VwMjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Xb3JrUHJvZHVjdEltcGwjZ2V0RXN0aW1hdGUgPGVtPkVzdGltYXRlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLldvcmtQcm9kdWN0SW1wbCNnZXRFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMgPGVtPkVzdGltYXRpb24gQ29uc2lkZXJhdGlvbnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuV29ya1Byb2R1Y3RJbXBsI2dldFJlcG9ydCA8ZW0+UmVwb3J0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLldvcmtQcm9kdWN0SW1wbCNnZXRUZW1wbGF0ZSA8ZW0+VGVtcGxhdGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuV29ya1Byb2R1Y3RJbXBsI2dldFRvb2xNZW50b3IgPGVtPlRvb2wgTWVudG9yPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgV29ya1Byb2R1Y3RJbXBsIGV4dGVuZHMgQ29udGVudEVsZW1lbnRJbXBsIGltcGxlbWVudHMgV29ya1Byb2R1Y3QgewotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEdyb3VwMigpIDxlbT5Hcm91cDI8L2VtPn0nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0R3JvdXAyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRmVhdHVyZU1hcCBncm91cDI7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgV29ya1Byb2R1Y3RJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5XT1JLX1BST0RVQ1Q7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEZlYXR1cmVNYXAgZ2V0R3JvdXAyKCkgewotCQlpZiAoZ3JvdXAyID09IG51bGwpIHsKLQkJCWdyb3VwMiA9IG5ldyBCYXNpY0ZlYXR1cmVNYXAodGhpcywgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfX0dST1VQMik7Ci0JCX0KLQkJcmV0dXJuIGdyb3VwMjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8U3RyaW5nPiBnZXRFc3RpbWF0ZSgpIHsKLQkJcmV0dXJuIGdldEdyb3VwMigpLmxpc3QoVW1hUGFja2FnZS5MaXRlcmFscy5XT1JLX1BST0RVQ1RfX0VTVElNQVRFKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8U3RyaW5nPiBnZXRFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMoKSB7Ci0JCXJldHVybiBnZXRHcm91cDIoKS5saXN0KFVtYVBhY2thZ2UuTGl0ZXJhbHMuV09SS19QUk9EVUNUX19FU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8U3RyaW5nPiBnZXRSZXBvcnQoKSB7Ci0JCXJldHVybiBnZXRHcm91cDIoKS5saXN0KFVtYVBhY2thZ2UuTGl0ZXJhbHMuV09SS19QUk9EVUNUX19SRVBPUlQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxTdHJpbmc+IGdldFRlbXBsYXRlKCkgewotCQlyZXR1cm4gZ2V0R3JvdXAyKCkubGlzdChVbWFQYWNrYWdlLkxpdGVyYWxzLldPUktfUFJPRFVDVF9fVEVNUExBVEUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxTdHJpbmc+IGdldFRvb2xNZW50b3IoKSB7Ci0JCXJldHVybiBnZXRHcm91cDIoKS5saXN0KFVtYVBhY2thZ2UuTGl0ZXJhbHMuV09SS19QUk9EVUNUX19UT09MX01FTlRPUik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9fR1JPVVAyOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0R3JvdXAyKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9fR1JPVVAyOgotCQkJCWlmIChjb3JlVHlwZSkgcmV0dXJuIGdldEdyb3VwMigpOwotCQkJCXJldHVybiAoKEZlYXR1cmVNYXAuSW50ZXJuYWwpZ2V0R3JvdXAyKCkpLmdldFdyYXBwZXIoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfX0VTVElNQVRFOgotCQkJCXJldHVybiBnZXRFc3RpbWF0ZSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9fRVNUSU1BVElPTl9DT05TSURFUkFUSU9OUzoKLQkJCQlyZXR1cm4gZ2V0RXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX19SRVBPUlQ6Ci0JCQkJcmV0dXJuIGdldFJlcG9ydCgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9fVEVNUExBVEU6Ci0JCQkJcmV0dXJuIGdldFRlbXBsYXRlKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX19UT09MX01FTlRPUjoKLQkJCQlyZXR1cm4gZ2V0VG9vbE1lbnRvcigpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9fR1JPVVAyOgotCQkJCSgoRmVhdHVyZU1hcC5JbnRlcm5hbClnZXRHcm91cDIoKSkuc2V0KG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX19FU1RJTUFURToKLQkJCQlnZXRFc3RpbWF0ZSgpLmNsZWFyKCk7Ci0JCQkJZ2V0RXN0aW1hdGUoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFN0cmluZz4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfX0VTVElNQVRJT05fQ09OU0lERVJBVElPTlM6Ci0JCQkJZ2V0RXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKCkuY2xlYXIoKTsKLQkJCQlnZXRFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFN0cmluZz4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfX1JFUE9SVDoKLQkJCQlnZXRSZXBvcnQoKS5jbGVhcigpOwotCQkJCWdldFJlcG9ydCgpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgU3RyaW5nPiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9fVEVNUExBVEU6Ci0JCQkJZ2V0VGVtcGxhdGUoKS5jbGVhcigpOwotCQkJCWdldFRlbXBsYXRlKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBTdHJpbmc+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX19UT09MX01FTlRPUjoKLQkJCQlnZXRUb29sTWVudG9yKCkuY2xlYXIoKTsKLQkJCQlnZXRUb29sTWVudG9yKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBTdHJpbmc+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9fR1JPVVAyOgotCQkJCWdldEdyb3VwMigpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9fRVNUSU1BVEU6Ci0JCQkJZ2V0RXN0aW1hdGUoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfX0VTVElNQVRJT05fQ09OU0lERVJBVElPTlM6Ci0JCQkJZ2V0RXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX19SRVBPUlQ6Ci0JCQkJZ2V0UmVwb3J0KCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX19URU1QTEFURToKLQkJCQlnZXRUZW1wbGF0ZSgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9fVE9PTF9NRU5UT1I6Ci0JCQkJZ2V0VG9vbE1lbnRvcigpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX19HUk9VUDI6Ci0JCQkJcmV0dXJuIGdyb3VwMiAhPSBudWxsICYmICFncm91cDIuaXNFbXB0eSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9fRVNUSU1BVEU6Ci0JCQkJcmV0dXJuICFnZXRFc3RpbWF0ZSgpLmlzRW1wdHkoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfX0VTVElNQVRJT05fQ09OU0lERVJBVElPTlM6Ci0JCQkJcmV0dXJuICFnZXRFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMoKS5pc0VtcHR5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX19SRVBPUlQ6Ci0JCQkJcmV0dXJuICFnZXRSZXBvcnQoKS5pc0VtcHR5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX19URU1QTEFURToKLQkJCQlyZXR1cm4gIWdldFRlbXBsYXRlKCkuaXNFbXB0eSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9fVE9PTF9NRU5UT1I6Ci0JCQkJcmV0dXJuICFnZXRUb29sTWVudG9yKCkuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoZ3JvdXAyOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChncm91cDIpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9Xb3JrUHJvZHVjdEltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9Xb3JrUHJvZHVjdFR5cGVJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9Xb3JrUHJvZHVjdFR5cGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkMWFlMjIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvV29ya1Byb2R1Y3RUeXBlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg3ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogV29ya1Byb2R1Y3RUeXBlSW1wbC5qYXZhLHYgMS4yIDIwMDgvMDEvMzAgMDA6NDE6NDcga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuQmFzaWNGZWF0dXJlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtQcm9kdWN0VHlwZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPldvcmsgUHJvZHVjdCBUeXBlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLldvcmtQcm9kdWN0VHlwZUltcGwjZ2V0R3JvdXAyIDxlbT5Hcm91cDI8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuV29ya1Byb2R1Y3RUeXBlSW1wbCNnZXRXb3JrUHJvZHVjdCA8ZW0+V29yayBQcm9kdWN0PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgV29ya1Byb2R1Y3RUeXBlSW1wbCBleHRlbmRzIENvbnRlbnRDYXRlZ29yeUltcGwgaW1wbGVtZW50cyBXb3JrUHJvZHVjdFR5cGUgewotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEdyb3VwMigpIDxlbT5Hcm91cDI8L2VtPn0nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0R3JvdXAyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRmVhdHVyZU1hcCBncm91cDI7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgV29ya1Byb2R1Y3RUeXBlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuV09SS19QUk9EVUNUX1RZUEU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEZlYXR1cmVNYXAgZ2V0R3JvdXAyKCkgewotCQlpZiAoZ3JvdXAyID09IG51bGwpIHsKLQkJCWdyb3VwMiA9IG5ldyBCYXNpY0ZlYXR1cmVNYXAodGhpcywgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfVFlQRV9fR1JPVVAyKTsKLQkJfQotCQlyZXR1cm4gZ3JvdXAyOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxTdHJpbmc+IGdldFdvcmtQcm9kdWN0KCkgewotCQlyZXR1cm4gZ2V0R3JvdXAyKCkubGlzdChVbWFQYWNrYWdlLkxpdGVyYWxzLldPUktfUFJPRFVDVF9UWVBFX19XT1JLX1BST0RVQ1QpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfVFlQRV9fR1JPVVAyOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0R3JvdXAyKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9UWVBFX19HUk9VUDI6Ci0JCQkJaWYgKGNvcmVUeXBlKSByZXR1cm4gZ2V0R3JvdXAyKCk7Ci0JCQkJcmV0dXJuICgoRmVhdHVyZU1hcC5JbnRlcm5hbClnZXRHcm91cDIoKSkuZ2V0V3JhcHBlcigpOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9UWVBFX19XT1JLX1BST0RVQ1Q6Ci0JCQkJcmV0dXJuIGdldFdvcmtQcm9kdWN0KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX1RZUEVfX0dST1VQMjoKLQkJCQkoKEZlYXR1cmVNYXAuSW50ZXJuYWwpZ2V0R3JvdXAyKCkpLnNldChuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9UWVBFX19XT1JLX1BST0RVQ1Q6Ci0JCQkJZ2V0V29ya1Byb2R1Y3QoKS5jbGVhcigpOwotCQkJCWdldFdvcmtQcm9kdWN0KCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBTdHJpbmc+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9UWVBFX19HUk9VUDI6Ci0JCQkJZ2V0R3JvdXAyKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX1RZUEVfX1dPUktfUFJPRFVDVDoKLQkJCQlnZXRXb3JrUHJvZHVjdCgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX1RZUEVfX0dST1VQMjoKLQkJCQlyZXR1cm4gZ3JvdXAyICE9IG51bGwgJiYgIWdyb3VwMi5pc0VtcHR5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX1RZUEVfX1dPUktfUFJPRFVDVDoKLQkJCQlyZXR1cm4gIWdldFdvcmtQcm9kdWN0KCkuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoZ3JvdXAyOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChncm91cDIpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9Xb3JrUHJvZHVjdFR5cGVJbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvcGFja2FnZS5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZWUyOGRlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgWE1MIFVNQSBtb2RlbCBvYmplY3RzLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9wYWNrYWdlLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NDZhMTkyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyB0aGUgaW50ZXJmYWNlcyBmb3IgdGhlIFVNQSBYTUwgbW9kZWwgb2JqZWN0cy4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvdXRpbC9VbWFBZGFwdGVyRmFjdG9yeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL3V0aWwvVW1hQWRhcHRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzI5Y2U2OC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvdXRpbC9VbWFBZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc1NSArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFVtYUFkYXB0ZXJGYWN0b3J5LmphdmEsdiAxLjIgMjAwOC8wMS8zMCAwMDo0MTo0OCBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVyRmFjdG9yeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQWN0aXZpdHlEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5BcHBsaWNhYmxlTWV0YUNsYXNzSW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5BcnRpZmFjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5BcnRpZmFjdERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkJyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNhcGFiaWxpdHlQYXR0ZXJuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNoZWNrbGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db21wb3NpdGVSb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbmNlcHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29uc3RyYWludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db250ZW50Q2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudENhdGVnb3J5UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db250ZW50RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ3VzdG9tQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVsaXZlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVsaXZlcmFibGVEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZWxpdmVyeVByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVzY3JpYmFibGVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVzY3JpcHRvckRlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRpc2NpcGxpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGlzY2lwbGluZUdyb3VwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRvY3VtZW50Um9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Eb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Fc3RpbWF0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Fc3RpbWF0aW5nTWV0cmljOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkVzdGltYXRpb25Db25zaWRlcmF0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5FeGFtcGxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkd1aWRhbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkd1aWRhbmNlRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuR3VpZGVsaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkl0ZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5LaW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RFbGVtZW50UHJvcGVydHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1pbGVzdG9uZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5OYW1lZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuT3V0Y29tZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5QYWNrYWdlYWJsZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUGhhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUGxhbm5pbmdEYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByYWN0aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByYWN0aWNlRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc0NvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5SZXBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUmV1c2FibGVBc3NldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Sb2FkbWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUm9sZURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJvbGVEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJvbGVTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUm9sZVNldEdyb3VwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlNlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuU3VwcG9ydGluZ01hdGVyaWFsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRhc2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFza0Rlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRhc2tEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRlYW1Qcm9maWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRlbXBsYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRlcm1EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRvb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVG9vbE1lbnRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldoaXRlcGFwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya0JyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya09yZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtQcm9kdWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtQcm9kdWN0VHlwZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogVGhlIDxiPkFkYXB0ZXIgRmFjdG9yeTwvYj4gZm9yIHRoZSBtb2RlbC4KLSAqIEl0IHByb3ZpZGVzIGFuIGFkYXB0ZXIgPGNvZGU+Y3JlYXRlWFhYPC9jb2RlPiBtZXRob2QgZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFVtYUFkYXB0ZXJGYWN0b3J5IGV4dGVuZHMgQWRhcHRlckZhY3RvcnlJbXBsIHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIG1vZGVsIHBhY2thZ2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBVbWFQYWNrYWdlIG1vZGVsUGFja2FnZTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGFkYXB0ZXIgZmFjdG9yeS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVW1hQWRhcHRlckZhY3RvcnkoKSB7Ci0JCWlmIChtb2RlbFBhY2thZ2UgPT0gbnVsbCkgewotCQkJbW9kZWxQYWNrYWdlID0gVW1hUGFja2FnZS5lSU5TVEFOQ0U7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBmYWN0b3J5IGlzIGFwcGxpY2FibGUgZm9yIHRoZSB0eXBlIG9mIHRoZSBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIG9iamVjdCBpcyBlaXRoZXIgdGhlIG1vZGVsJ3MgcGFja2FnZSBvciBpcyBhbiBpbnN0YW5jZSBvYmplY3Qgb2YgdGhlIG1vZGVsLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGlzIGZhY3RvcnkgaXMgYXBwbGljYWJsZSBmb3IgdGhlIHR5cGUgb2YgdGhlIG9iamVjdC4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gaXNGYWN0b3J5Rm9yVHlwZShPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChvYmplY3QgPT0gbW9kZWxQYWNrYWdlKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgRU9iamVjdCkgewotCQkJcmV0dXJuICgoRU9iamVjdClvYmplY3QpLmVDbGFzcygpLmdldEVQYWNrYWdlKCkgPT0gbW9kZWxQYWNrYWdlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgc3dpdGNoIHRoZSBkZWxlZ2F0ZXMgdG8gdGhlIDxjb2RlPmNyZWF0ZVhYWDwvY29kZT4gbWV0aG9kcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgVW1hU3dpdGNoPEFkYXB0ZXI+IG1vZGVsU3dpdGNoID0KLQkJbmV3IFVtYVN3aXRjaDxBZGFwdGVyPigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEFkYXB0ZXIgY2FzZUFjdGl2aXR5KEFjdGl2aXR5IG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVBY3Rpdml0eUFkYXB0ZXIoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEFkYXB0ZXIgY2FzZUFjdGl2aXR5RGVzY3JpcHRpb24oQWN0aXZpdHlEZXNjcmlwdGlvbiBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlQWN0aXZpdHlEZXNjcmlwdGlvbkFkYXB0ZXIoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEFkYXB0ZXIgY2FzZUFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvKEFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVBcHBsaWNhYmxlTWV0YUNsYXNzSW5mb0FkYXB0ZXIoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEFkYXB0ZXIgY2FzZUFydGlmYWN0KEFydGlmYWN0IG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVBcnRpZmFjdEFkYXB0ZXIoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEFkYXB0ZXIgY2FzZUFydGlmYWN0RGVzY3JpcHRpb24oQXJ0aWZhY3REZXNjcmlwdGlvbiBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlQXJ0aWZhY3REZXNjcmlwdGlvbkFkYXB0ZXIoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEFkYXB0ZXIgY2FzZUJyZWFrZG93bkVsZW1lbnQoQnJlYWtkb3duRWxlbWVudCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlQnJlYWtkb3duRWxlbWVudEFkYXB0ZXIoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEFkYXB0ZXIgY2FzZUJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbihCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24gb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbkFkYXB0ZXIoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEFkYXB0ZXIgY2FzZUNhcGFiaWxpdHlQYXR0ZXJuKENhcGFiaWxpdHlQYXR0ZXJuIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVDYXBhYmlsaXR5UGF0dGVybkFkYXB0ZXIoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEFkYXB0ZXIgY2FzZUNoZWNrbGlzdChDaGVja2xpc3Qgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUNoZWNrbGlzdEFkYXB0ZXIoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEFkYXB0ZXIgY2FzZUNvbXBvc2l0ZVJvbGUoQ29tcG9zaXRlUm9sZSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlQ29tcG9zaXRlUm9sZUFkYXB0ZXIoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEFkYXB0ZXIgY2FzZUNvbmNlcHQoQ29uY2VwdCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlQ29uY2VwdEFkYXB0ZXIoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEFkYXB0ZXIgY2FzZUNvbnN0cmFpbnQoQ29uc3RyYWludCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlQ29uc3RyYWludEFkYXB0ZXIoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEFkYXB0ZXIgY2FzZUNvbnRlbnRDYXRlZ29yeShDb250ZW50Q2F0ZWdvcnkgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUNvbnRlbnRDYXRlZ29yeUFkYXB0ZXIoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEFkYXB0ZXIgY2FzZUNvbnRlbnRDYXRlZ29yeVBhY2thZ2UoQ29udGVudENhdGVnb3J5UGFja2FnZSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlQ29udGVudENhdGVnb3J5UGFja2FnZUFkYXB0ZXIoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEFkYXB0ZXIgY2FzZUNvbnRlbnREZXNjcmlwdGlvbihDb250ZW50RGVzY3JpcHRpb24gb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUNvbnRlbnREZXNjcmlwdGlvbkFkYXB0ZXIoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEFkYXB0ZXIgY2FzZUNvbnRlbnRFbGVtZW50KENvbnRlbnRFbGVtZW50IG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVDb250ZW50RWxlbWVudEFkYXB0ZXIoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEFkYXB0ZXIgY2FzZUNvbnRlbnRQYWNrYWdlKENvbnRlbnRQYWNrYWdlIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVDb250ZW50UGFja2FnZUFkYXB0ZXIoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEFkYXB0ZXIgY2FzZUN1c3RvbUNhdGVnb3J5KEN1c3RvbUNhdGVnb3J5IG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVDdXN0b21DYXRlZ29yeUFkYXB0ZXIoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEFkYXB0ZXIgY2FzZURlbGl2ZXJhYmxlKERlbGl2ZXJhYmxlIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVEZWxpdmVyYWJsZUFkYXB0ZXIoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEFkYXB0ZXIgY2FzZURlbGl2ZXJhYmxlRGVzY3JpcHRpb24oRGVsaXZlcmFibGVEZXNjcmlwdGlvbiBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlRGVsaXZlcmFibGVEZXNjcmlwdGlvbkFkYXB0ZXIoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEFkYXB0ZXIgY2FzZURlbGl2ZXJ5UHJvY2VzcyhEZWxpdmVyeVByb2Nlc3Mgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZURlbGl2ZXJ5UHJvY2Vzc0FkYXB0ZXIoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEFkYXB0ZXIgY2FzZURlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uKERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVEZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbkFkYXB0ZXIoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEFkYXB0ZXIgY2FzZURlc2NyaWJhYmxlRWxlbWVudChEZXNjcmliYWJsZUVsZW1lbnQgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZURlc2NyaWJhYmxlRWxlbWVudEFkYXB0ZXIoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEFkYXB0ZXIgY2FzZURlc2NyaXB0b3IoRGVzY3JpcHRvciBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlRGVzY3JpcHRvckFkYXB0ZXIoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEFkYXB0ZXIgY2FzZURlc2NyaXB0b3JEZXNjcmlwdGlvbihEZXNjcmlwdG9yRGVzY3JpcHRpb24gb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZURlc2NyaXB0b3JEZXNjcmlwdGlvbkFkYXB0ZXIoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEFkYXB0ZXIgY2FzZURpc2NpcGxpbmUoRGlzY2lwbGluZSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlRGlzY2lwbGluZUFkYXB0ZXIoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEFkYXB0ZXIgY2FzZURpc2NpcGxpbmVHcm91cGluZyhEaXNjaXBsaW5lR3JvdXBpbmcgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZURpc2NpcGxpbmVHcm91cGluZ0FkYXB0ZXIoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEFkYXB0ZXIgY2FzZURvY3VtZW50Um9vdChEb2N1bWVudFJvb3Qgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZURvY3VtZW50Um9vdEFkYXB0ZXIoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEFkYXB0ZXIgY2FzZURvbWFpbihEb21haW4gb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZURvbWFpbkFkYXB0ZXIoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEFkYXB0ZXIgY2FzZUVsZW1lbnQoRWxlbWVudCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlRWxlbWVudEFkYXB0ZXIoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEFkYXB0ZXIgY2FzZUVzdGltYXRlKEVzdGltYXRlIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVFc3RpbWF0ZUFkYXB0ZXIoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEFkYXB0ZXIgY2FzZUVzdGltYXRpbmdNZXRyaWMoRXN0aW1hdGluZ01ldHJpYyBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlRXN0aW1hdGluZ01ldHJpY0FkYXB0ZXIoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEFkYXB0ZXIgY2FzZUVzdGltYXRpb25Db25zaWRlcmF0aW9ucyhFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUVzdGltYXRpb25Db25zaWRlcmF0aW9uc0FkYXB0ZXIoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEFkYXB0ZXIgY2FzZUV4YW1wbGUoRXhhbXBsZSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlRXhhbXBsZUFkYXB0ZXIoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEFkYXB0ZXIgY2FzZUd1aWRhbmNlKEd1aWRhbmNlIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVHdWlkYW5jZUFkYXB0ZXIoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEFkYXB0ZXIgY2FzZUd1aWRhbmNlRGVzY3JpcHRpb24oR3VpZGFuY2VEZXNjcmlwdGlvbiBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlR3VpZGFuY2VEZXNjcmlwdGlvbkFkYXB0ZXIoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEFkYXB0ZXIgY2FzZUd1aWRlbGluZShHdWlkZWxpbmUgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUd1aWRlbGluZUFkYXB0ZXIoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEFkYXB0ZXIgY2FzZUl0ZXJhdGlvbihJdGVyYXRpb24gb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUl0ZXJhdGlvbkFkYXB0ZXIoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEFkYXB0ZXIgY2FzZUtpbmQoS2luZCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlS2luZEFkYXB0ZXIoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEFkYXB0ZXIgY2FzZU1ldGhvZENvbmZpZ3VyYXRpb24oTWV0aG9kQ29uZmlndXJhdGlvbiBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlTWV0aG9kQ29uZmlndXJhdGlvbkFkYXB0ZXIoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEFkYXB0ZXIgY2FzZU1ldGhvZEVsZW1lbnQoTWV0aG9kRWxlbWVudCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlTWV0aG9kRWxlbWVudEFkYXB0ZXIoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEFkYXB0ZXIgY2FzZU1ldGhvZEVsZW1lbnRQcm9wZXJ0eShNZXRob2RFbGVtZW50UHJvcGVydHkgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZU1ldGhvZEVsZW1lbnRQcm9wZXJ0eUFkYXB0ZXIoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEFkYXB0ZXIgY2FzZU1ldGhvZExpYnJhcnkoTWV0aG9kTGlicmFyeSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlTWV0aG9kTGlicmFyeUFkYXB0ZXIoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEFkYXB0ZXIgY2FzZU1ldGhvZFBhY2thZ2UoTWV0aG9kUGFja2FnZSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlTWV0aG9kUGFja2FnZUFkYXB0ZXIoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEFkYXB0ZXIgY2FzZU1ldGhvZFBsdWdpbihNZXRob2RQbHVnaW4gb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZU1ldGhvZFBsdWdpbkFkYXB0ZXIoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEFkYXB0ZXIgY2FzZU1ldGhvZFVuaXQoTWV0aG9kVW5pdCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlTWV0aG9kVW5pdEFkYXB0ZXIoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEFkYXB0ZXIgY2FzZU1pbGVzdG9uZShNaWxlc3RvbmUgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZU1pbGVzdG9uZUFkYXB0ZXIoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEFkYXB0ZXIgY2FzZU5hbWVkRWxlbWVudChOYW1lZEVsZW1lbnQgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZU5hbWVkRWxlbWVudEFkYXB0ZXIoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEFkYXB0ZXIgY2FzZU91dGNvbWUoT3V0Y29tZSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlT3V0Y29tZUFkYXB0ZXIoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEFkYXB0ZXIgY2FzZVBhY2thZ2VhYmxlRWxlbWVudChQYWNrYWdlYWJsZUVsZW1lbnQgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVBhY2thZ2VhYmxlRWxlbWVudEFkYXB0ZXIoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEFkYXB0ZXIgY2FzZVBoYXNlKFBoYXNlIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVQaGFzZUFkYXB0ZXIoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEFkYXB0ZXIgY2FzZVBsYW5uaW5nRGF0YShQbGFubmluZ0RhdGEgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVBsYW5uaW5nRGF0YUFkYXB0ZXIoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEFkYXB0ZXIgY2FzZVByYWN0aWNlKFByYWN0aWNlIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVQcmFjdGljZUFkYXB0ZXIoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEFkYXB0ZXIgY2FzZVByYWN0aWNlRGVzY3JpcHRpb24oUHJhY3RpY2VEZXNjcmlwdGlvbiBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlUHJhY3RpY2VEZXNjcmlwdGlvbkFkYXB0ZXIoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEFkYXB0ZXIgY2FzZVByb2Nlc3Mob3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2VzcyBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlUHJvY2Vzc0FkYXB0ZXIoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEFkYXB0ZXIgY2FzZVByb2Nlc3NDb21wb25lbnQoUHJvY2Vzc0NvbXBvbmVudCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlUHJvY2Vzc0NvbXBvbmVudEFkYXB0ZXIoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEFkYXB0ZXIgY2FzZVByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UoUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZUFkYXB0ZXIoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEFkYXB0ZXIgY2FzZVByb2Nlc3NEZXNjcmlwdGlvbihQcm9jZXNzRGVzY3JpcHRpb24gb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVByb2Nlc3NEZXNjcmlwdGlvbkFkYXB0ZXIoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEFkYXB0ZXIgY2FzZVByb2Nlc3NFbGVtZW50KFByb2Nlc3NFbGVtZW50IG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVQcm9jZXNzRWxlbWVudEFkYXB0ZXIoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEFkYXB0ZXIgY2FzZVByb2Nlc3NQYWNrYWdlKFByb2Nlc3NQYWNrYWdlIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVQcm9jZXNzUGFja2FnZUFkYXB0ZXIoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEFkYXB0ZXIgY2FzZVByb2Nlc3NQbGFubmluZ1RlbXBsYXRlKFByb2Nlc3NQbGFubmluZ1RlbXBsYXRlIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZUFkYXB0ZXIoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEFkYXB0ZXIgY2FzZVJlcG9ydChSZXBvcnQgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVJlcG9ydEFkYXB0ZXIoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEFkYXB0ZXIgY2FzZVJldXNhYmxlQXNzZXQoUmV1c2FibGVBc3NldCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlUmV1c2FibGVBc3NldEFkYXB0ZXIoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEFkYXB0ZXIgY2FzZVJvYWRtYXAoUm9hZG1hcCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlUm9hZG1hcEFkYXB0ZXIoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEFkYXB0ZXIgY2FzZVJvbGUoUm9sZSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlUm9sZUFkYXB0ZXIoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEFkYXB0ZXIgY2FzZVJvbGVEZXNjcmlwdGlvbihSb2xlRGVzY3JpcHRpb24gb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVJvbGVEZXNjcmlwdGlvbkFkYXB0ZXIoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEFkYXB0ZXIgY2FzZVJvbGVEZXNjcmlwdG9yKFJvbGVEZXNjcmlwdG9yIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVSb2xlRGVzY3JpcHRvckFkYXB0ZXIoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEFkYXB0ZXIgY2FzZVJvbGVTZXQoUm9sZVNldCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlUm9sZVNldEFkYXB0ZXIoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEFkYXB0ZXIgY2FzZVJvbGVTZXRHcm91cGluZyhSb2xlU2V0R3JvdXBpbmcgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVJvbGVTZXRHcm91cGluZ0FkYXB0ZXIoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEFkYXB0ZXIgY2FzZVNlY3Rpb24oU2VjdGlvbiBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlU2VjdGlvbkFkYXB0ZXIoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEFkYXB0ZXIgY2FzZVN1cHBvcnRpbmdNYXRlcmlhbChTdXBwb3J0aW5nTWF0ZXJpYWwgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVN1cHBvcnRpbmdNYXRlcmlhbEFkYXB0ZXIoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEFkYXB0ZXIgY2FzZVRhc2soVGFzayBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlVGFza0FkYXB0ZXIoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEFkYXB0ZXIgY2FzZVRhc2tEZXNjcmlwdGlvbihUYXNrRGVzY3JpcHRpb24gb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVRhc2tEZXNjcmlwdGlvbkFkYXB0ZXIoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEFkYXB0ZXIgY2FzZVRhc2tEZXNjcmlwdG9yKFRhc2tEZXNjcmlwdG9yIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVUYXNrRGVzY3JpcHRvckFkYXB0ZXIoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEFkYXB0ZXIgY2FzZVRlYW1Qcm9maWxlKFRlYW1Qcm9maWxlIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVUZWFtUHJvZmlsZUFkYXB0ZXIoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEFkYXB0ZXIgY2FzZVRlbXBsYXRlKFRlbXBsYXRlIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVUZW1wbGF0ZUFkYXB0ZXIoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEFkYXB0ZXIgY2FzZVRlcm1EZWZpbml0aW9uKFRlcm1EZWZpbml0aW9uIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVUZXJtRGVmaW5pdGlvbkFkYXB0ZXIoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEFkYXB0ZXIgY2FzZVRvb2woVG9vbCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlVG9vbEFkYXB0ZXIoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEFkYXB0ZXIgY2FzZVRvb2xNZW50b3IoVG9vbE1lbnRvciBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlVG9vbE1lbnRvckFkYXB0ZXIoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEFkYXB0ZXIgY2FzZVdoaXRlcGFwZXIoV2hpdGVwYXBlciBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlV2hpdGVwYXBlckFkYXB0ZXIoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEFkYXB0ZXIgY2FzZVdvcmtCcmVha2Rvd25FbGVtZW50KFdvcmtCcmVha2Rvd25FbGVtZW50IG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVXb3JrQnJlYWtkb3duRWxlbWVudEFkYXB0ZXIoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEFkYXB0ZXIgY2FzZVdvcmtEZWZpbml0aW9uKFdvcmtEZWZpbml0aW9uIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVXb3JrRGVmaW5pdGlvbkFkYXB0ZXIoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEFkYXB0ZXIgY2FzZVdvcmtPcmRlcihXb3JrT3JkZXIgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVdvcmtPcmRlckFkYXB0ZXIoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEFkYXB0ZXIgY2FzZVdvcmtQcm9kdWN0KFdvcmtQcm9kdWN0IG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVXb3JrUHJvZHVjdEFkYXB0ZXIoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEFkYXB0ZXIgY2FzZVdvcmtQcm9kdWN0RGVzY3JpcHRpb24oV29ya1Byb2R1Y3REZXNjcmlwdGlvbiBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlV29ya1Byb2R1Y3REZXNjcmlwdGlvbkFkYXB0ZXIoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEFkYXB0ZXIgY2FzZVdvcmtQcm9kdWN0RGVzY3JpcHRvcihXb3JrUHJvZHVjdERlc2NyaXB0b3Igb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVdvcmtQcm9kdWN0RGVzY3JpcHRvckFkYXB0ZXIoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEFkYXB0ZXIgY2FzZVdvcmtQcm9kdWN0VHlwZShXb3JrUHJvZHVjdFR5cGUgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVdvcmtQcm9kdWN0VHlwZUFkYXB0ZXIoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEFkYXB0ZXIgZGVmYXVsdENhc2UoRU9iamVjdCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlRU9iamVjdEFkYXB0ZXIoKTsKLQkJCX0KLQkJfTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gYWRhcHRlciBmb3IgdGhlIDxjb2RlPnRhcmdldDwvY29kZT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdGFyZ2V0IHRoZSBvYmplY3QgdG8gYWRhcHQuCi0JICogQHJldHVybiB0aGUgYWRhcHRlciBmb3IgdGhlIDxjb2RlPnRhcmdldDwvY29kZT4uCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUFkYXB0ZXIoTm90aWZpZXIgdGFyZ2V0KSB7Ci0JCXJldHVybiBtb2RlbFN3aXRjaC5kb1N3aXRjaCgoRU9iamVjdCl0YXJnZXQpOwotCX0KLQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5BY3Rpdml0eSA8ZW0+QWN0aXZpdHk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQWN0aXZpdHkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQWN0aXZpdHlBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFjdGl2aXR5RGVzY3JpcHRpb24gPGVtPkFjdGl2aXR5IERlc2NyaXB0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFjdGl2aXR5RGVzY3JpcHRpb24KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQWN0aXZpdHlEZXNjcmlwdGlvbkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQXBwbGljYWJsZU1ldGFDbGFzc0luZm8gPGVtPkFwcGxpY2FibGUgTWV0YSBDbGFzcyBJbmZvPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5BcnRpZmFjdCA8ZW0+QXJ0aWZhY3Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQXJ0aWZhY3QKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQXJ0aWZhY3RBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFydGlmYWN0RGVzY3JpcHRpb24gPGVtPkFydGlmYWN0IERlc2NyaXB0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFydGlmYWN0RGVzY3JpcHRpb24KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQXJ0aWZhY3REZXNjcmlwdGlvbkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQnJlYWtkb3duRWxlbWVudCA8ZW0+QnJlYWtkb3duIEVsZW1lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQnJlYWtkb3duRWxlbWVudAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVCcmVha2Rvd25FbGVtZW50QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5CcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24gPGVtPkJyZWFrZG93biBFbGVtZW50IERlc2NyaXB0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb25BZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNhcGFiaWxpdHlQYXR0ZXJuIDxlbT5DYXBhYmlsaXR5IFBhdHRlcm48L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ2FwYWJpbGl0eVBhdHRlcm4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQ2FwYWJpbGl0eVBhdHRlcm5BZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNoZWNrbGlzdCA8ZW0+Q2hlY2tsaXN0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNoZWNrbGlzdAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVDaGVja2xpc3RBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbXBvc2l0ZVJvbGUgPGVtPkNvbXBvc2l0ZSBSb2xlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbXBvc2l0ZVJvbGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQ29tcG9zaXRlUm9sZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29uY2VwdCA8ZW0+Q29uY2VwdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db25jZXB0Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUNvbmNlcHRBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnN0cmFpbnQgPGVtPkNvbnN0cmFpbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29uc3RyYWludAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVDb25zdHJhaW50QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db250ZW50Q2F0ZWdvcnkgPGVtPkNvbnRlbnQgQ2F0ZWdvcnk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudENhdGVnb3J5Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUNvbnRlbnRDYXRlZ29yeUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudENhdGVnb3J5UGFja2FnZSA8ZW0+Q29udGVudCBDYXRlZ29yeSBQYWNrYWdlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnRDYXRlZ29yeVBhY2thZ2UKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQ29udGVudENhdGVnb3J5UGFja2FnZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudERlc2NyaXB0aW9uIDxlbT5Db250ZW50IERlc2NyaXB0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnREZXNjcmlwdGlvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVDb250ZW50RGVzY3JpcHRpb25BZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnRFbGVtZW50IDxlbT5Db250ZW50IEVsZW1lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudEVsZW1lbnQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQ29udGVudEVsZW1lbnRBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnRQYWNrYWdlIDxlbT5Db250ZW50IFBhY2thZ2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudFBhY2thZ2UKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQ29udGVudFBhY2thZ2VBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkN1c3RvbUNhdGVnb3J5IDxlbT5DdXN0b20gQ2F0ZWdvcnk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ3VzdG9tQ2F0ZWdvcnkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQ3VzdG9tQ2F0ZWdvcnlBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlbGl2ZXJhYmxlIDxlbT5EZWxpdmVyYWJsZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZWxpdmVyYWJsZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVEZWxpdmVyYWJsZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVsaXZlcmFibGVEZXNjcmlwdGlvbiA8ZW0+RGVsaXZlcmFibGUgRGVzY3JpcHRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVsaXZlcmFibGVEZXNjcmlwdGlvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVEZWxpdmVyYWJsZURlc2NyaXB0aW9uQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZWxpdmVyeVByb2Nlc3MgPGVtPkRlbGl2ZXJ5IFByb2Nlc3M8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVsaXZlcnlQcm9jZXNzCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZURlbGl2ZXJ5UHJvY2Vzc0FkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24gPGVtPkRlbGl2ZXJ5IFByb2Nlc3MgRGVzY3JpcHRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25BZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlc2NyaWJhYmxlRWxlbWVudCA8ZW0+RGVzY3JpYmFibGUgRWxlbWVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZXNjcmliYWJsZUVsZW1lbnQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRGVzY3JpYmFibGVFbGVtZW50QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZXNjcmlwdG9yIDxlbT5EZXNjcmlwdG9yPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlc2NyaXB0b3IKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRGVzY3JpcHRvckFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVzY3JpcHRvckRlc2NyaXB0aW9uIDxlbT5EZXNjcmlwdG9yIERlc2NyaXB0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlc2NyaXB0b3JEZXNjcmlwdGlvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVEZXNjcmlwdG9yRGVzY3JpcHRpb25BZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRpc2NpcGxpbmUgPGVtPkRpc2NpcGxpbmU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGlzY2lwbGluZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVEaXNjaXBsaW5lQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EaXNjaXBsaW5lR3JvdXBpbmcgPGVtPkRpc2NpcGxpbmUgR3JvdXBpbmc8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGlzY2lwbGluZUdyb3VwaW5nCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZURpc2NpcGxpbmVHcm91cGluZ0FkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRG9jdW1lbnRSb290IDxlbT5Eb2N1bWVudCBSb290PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRvY3VtZW50Um9vdAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVEb2N1bWVudFJvb3RBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRvbWFpbiA8ZW0+RG9tYWluPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRvbWFpbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVEb21haW5BZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkVsZW1lbnQgPGVtPkVsZW1lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRWxlbWVudAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVFbGVtZW50QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Fc3RpbWF0ZSA8ZW0+RXN0aW1hdGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRXN0aW1hdGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRXN0aW1hdGVBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkVzdGltYXRpbmdNZXRyaWMgPGVtPkVzdGltYXRpbmcgTWV0cmljPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkVzdGltYXRpbmdNZXRyaWMKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRXN0aW1hdGluZ01ldHJpY0FkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIDxlbT5Fc3RpbWF0aW9uIENvbnNpZGVyYXRpb25zPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkVzdGltYXRpb25Db25zaWRlcmF0aW9ucwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnNBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkV4YW1wbGUgPGVtPkV4YW1wbGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRXhhbXBsZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVFeGFtcGxlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5HdWlkYW5jZSA8ZW0+R3VpZGFuY2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuR3VpZGFuY2UKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlR3VpZGFuY2VBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkd1aWRhbmNlRGVzY3JpcHRpb24gPGVtPkd1aWRhbmNlIERlc2NyaXB0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkd1aWRhbmNlRGVzY3JpcHRpb24KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlR3VpZGFuY2VEZXNjcmlwdGlvbkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuR3VpZGVsaW5lIDxlbT5HdWlkZWxpbmU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuR3VpZGVsaW5lCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUd1aWRlbGluZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuSXRlcmF0aW9uIDxlbT5JdGVyYXRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuSXRlcmF0aW9uCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUl0ZXJhdGlvbkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuS2luZCA8ZW0+S2luZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5LaW5kCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUtpbmRBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZENvbmZpZ3VyYXRpb24gPGVtPk1ldGhvZCBDb25maWd1cmF0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZENvbmZpZ3VyYXRpb24KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlTWV0aG9kQ29uZmlndXJhdGlvbkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kRWxlbWVudCA8ZW0+TWV0aG9kIEVsZW1lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kRWxlbWVudAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVNZXRob2RFbGVtZW50QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RFbGVtZW50UHJvcGVydHkgPGVtPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZEVsZW1lbnRQcm9wZXJ0eQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVNZXRob2RFbGVtZW50UHJvcGVydHlBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZExpYnJhcnkgPGVtPk1ldGhvZCBMaWJyYXJ5PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZExpYnJhcnkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlTWV0aG9kTGlicmFyeUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kUGFja2FnZSA8ZW0+TWV0aG9kIFBhY2thZ2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kUGFja2FnZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVNZXRob2RQYWNrYWdlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RQbHVnaW4gPGVtPk1ldGhvZCBQbHVnaW48L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kUGx1Z2luCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZU1ldGhvZFBsdWdpbkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kVW5pdCA8ZW0+TWV0aG9kIFVuaXQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kVW5pdAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVNZXRob2RVbml0QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NaWxlc3RvbmUgPGVtPk1pbGVzdG9uZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NaWxlc3RvbmUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlTWlsZXN0b25lQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5OYW1lZEVsZW1lbnQgPGVtPk5hbWVkIEVsZW1lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTmFtZWRFbGVtZW50Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZU5hbWVkRWxlbWVudEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuT3V0Y29tZSA8ZW0+T3V0Y29tZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5PdXRjb21lCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZU91dGNvbWVBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlBhY2thZ2VhYmxlRWxlbWVudCA8ZW0+UGFja2FnZWFibGUgRWxlbWVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5QYWNrYWdlYWJsZUVsZW1lbnQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUGFja2FnZWFibGVFbGVtZW50QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5QaGFzZSA8ZW0+UGhhc2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUGhhc2UKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUGhhc2VBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlBsYW5uaW5nRGF0YSA8ZW0+UGxhbm5pbmcgRGF0YTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5QbGFubmluZ0RhdGEKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUGxhbm5pbmdEYXRhQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5QcmFjdGljZSA8ZW0+UHJhY3RpY2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJhY3RpY2UKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUHJhY3RpY2VBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByYWN0aWNlRGVzY3JpcHRpb24gPGVtPlByYWN0aWNlIERlc2NyaXB0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByYWN0aWNlRGVzY3JpcHRpb24KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUHJhY3RpY2VEZXNjcmlwdGlvbkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2VzcyA8ZW0+UHJvY2VzczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVByb2Nlc3NBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NDb21wb25lbnQgPGVtPlByb2Nlc3MgQ29tcG9uZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NDb21wb25lbnQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUHJvY2Vzc0NvbXBvbmVudEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSA8ZW0+UHJvY2VzcyBDb21wb25lbnQgSW50ZXJmYWNlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc0Rlc2NyaXB0aW9uIDxlbT5Qcm9jZXNzIERlc2NyaXB0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NEZXNjcmlwdGlvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVQcm9jZXNzRGVzY3JpcHRpb25BZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NFbGVtZW50IDxlbT5Qcm9jZXNzIEVsZW1lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc0VsZW1lbnQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUHJvY2Vzc0VsZW1lbnRBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NQYWNrYWdlIDxlbT5Qcm9jZXNzIFBhY2thZ2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc1BhY2thZ2UKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUHJvY2Vzc1BhY2thZ2VBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NQbGFubmluZ1RlbXBsYXRlIDxlbT5Qcm9jZXNzIFBsYW5uaW5nIFRlbXBsYXRlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NQbGFubmluZ1RlbXBsYXRlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVByb2Nlc3NQbGFubmluZ1RlbXBsYXRlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5SZXBvcnQgPGVtPlJlcG9ydDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5SZXBvcnQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUmVwb3J0QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5SZXVzYWJsZUFzc2V0IDxlbT5SZXVzYWJsZSBBc3NldDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5SZXVzYWJsZUFzc2V0Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVJldXNhYmxlQXNzZXRBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJvYWRtYXAgPGVtPlJvYWRtYXA8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUm9hZG1hcAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVSb2FkbWFwQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Sb2xlIDxlbT5Sb2xlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJvbGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUm9sZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUm9sZURlc2NyaXB0aW9uIDxlbT5Sb2xlIERlc2NyaXB0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJvbGVEZXNjcmlwdGlvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVSb2xlRGVzY3JpcHRpb25BZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJvbGVEZXNjcmlwdG9yIDxlbT5Sb2xlIERlc2NyaXB0b3I8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUm9sZURlc2NyaXB0b3IKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUm9sZURlc2NyaXB0b3JBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJvbGVTZXQgPGVtPlJvbGUgU2V0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJvbGVTZXQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUm9sZVNldEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUm9sZVNldEdyb3VwaW5nIDxlbT5Sb2xlIFNldCBHcm91cGluZzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Sb2xlU2V0R3JvdXBpbmcKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUm9sZVNldEdyb3VwaW5nQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5TZWN0aW9uIDxlbT5TZWN0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlNlY3Rpb24KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlU2VjdGlvbkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuU3VwcG9ydGluZ01hdGVyaWFsIDxlbT5TdXBwb3J0aW5nIE1hdGVyaWFsPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlN1cHBvcnRpbmdNYXRlcmlhbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVTdXBwb3J0aW5nTWF0ZXJpYWxBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRhc2sgPGVtPlRhc2s8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFzawotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVUYXNrQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UYXNrRGVzY3JpcHRpb24gPGVtPlRhc2sgRGVzY3JpcHRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFza0Rlc2NyaXB0aW9uCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVRhc2tEZXNjcmlwdGlvbkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFza0Rlc2NyaXB0b3IgPGVtPlRhc2sgRGVzY3JpcHRvcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UYXNrRGVzY3JpcHRvcgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVUYXNrRGVzY3JpcHRvckFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGVhbVByb2ZpbGUgPGVtPlRlYW0gUHJvZmlsZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UZWFtUHJvZmlsZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVUZWFtUHJvZmlsZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGVtcGxhdGUgPGVtPlRlbXBsYXRlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRlbXBsYXRlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVRlbXBsYXRlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UZXJtRGVmaW5pdGlvbiA8ZW0+VGVybSBEZWZpbml0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRlcm1EZWZpbml0aW9uCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVRlcm1EZWZpbml0aW9uQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Ub29sIDxlbT5Ub29sPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRvb2wKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlVG9vbEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVG9vbE1lbnRvciA8ZW0+VG9vbCBNZW50b3I8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVG9vbE1lbnRvcgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVUb29sTWVudG9yQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5XaGl0ZXBhcGVyIDxlbT5XaGl0ZXBhcGVyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldoaXRlcGFwZXIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlV2hpdGVwYXBlckFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya0JyZWFrZG93bkVsZW1lbnQgPGVtPldvcmsgQnJlYWtkb3duIEVsZW1lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya0JyZWFrZG93bkVsZW1lbnQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlV29ya0JyZWFrZG93bkVsZW1lbnRBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtEZWZpbml0aW9uIDxlbT5Xb3JrIERlZmluaXRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya0RlZmluaXRpb24KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlV29ya0RlZmluaXRpb25BZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtPcmRlciA8ZW0+V29yayBPcmRlcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrT3JkZXIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlV29ya09yZGVyQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdCA8ZW0+V29yayBQcm9kdWN0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtQcm9kdWN0Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVdvcmtQcm9kdWN0QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0aW9uIDxlbT5Xb3JrIFByb2R1Y3QgRGVzY3JpcHRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya1Byb2R1Y3REZXNjcmlwdGlvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVXb3JrUHJvZHVjdERlc2NyaXB0aW9uQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3IgPGVtPldvcmsgUHJvZHVjdCBEZXNjcmlwdG9yPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvcgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVXb3JrUHJvZHVjdERlc2NyaXB0b3JBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtQcm9kdWN0VHlwZSA8ZW0+V29yayBQcm9kdWN0IFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya1Byb2R1Y3RUeXBlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVdvcmtQcm9kdWN0VHlwZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgdGhlIGRlZmF1bHQgY2FzZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUVPYmplY3RBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0gLy9VbWFBZGFwdGVyRmFjdG9yeQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL3V0aWwvVW1hUmVzb3VyY2VGYWN0b3J5SW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL3V0aWwvVW1hUmVzb3VyY2VGYWN0b3J5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOTdmZWNkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS91dGlsL1VtYVJlc291cmNlRmFjdG9yeUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogVW1hUmVzb3VyY2VGYWN0b3J5SW1wbC5qYXZhLHYgMS4yIDIwMDgvMDEvMzAgMDA6NDE6NDgga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuaW1wbC5SZXNvdXJjZUZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuWE1MUmVzb3VyY2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIFRoZSA8Yj5SZXNvdXJjZSBGYWN0b3J5PC9iPiBhc3NvY2lhdGVkIHdpdGggdGhlIHBhY2thZ2UuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEudXRpbC5VbWFSZXNvdXJjZUltcGwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFVtYVJlc291cmNlRmFjdG9yeUltcGwgZXh0ZW5kcyBSZXNvdXJjZUZhY3RvcnlJbXBsIHsKLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSByZXNvdXJjZSBmYWN0b3J5LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBVbWFSZXNvdXJjZUZhY3RvcnlJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIHJlc291cmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBSZXNvdXJjZSBjcmVhdGVSZXNvdXJjZShVUkkgdXJpKSB7Ci0JCVhNTFJlc291cmNlIHJlc3VsdCA9IG5ldyBVbWFSZXNvdXJjZUltcGwodXJpKTsKLQkJcmVzdWx0LmdldERlZmF1bHRTYXZlT3B0aW9ucygpLnB1dChYTUxSZXNvdXJjZS5PUFRJT05fRVhURU5ERURfTUVUQV9EQVRBLCBCb29sZWFuLlRSVUUpOwotCQlyZXN1bHQuZ2V0RGVmYXVsdExvYWRPcHRpb25zKCkucHV0KFhNTFJlc291cmNlLk9QVElPTl9FWFRFTkRFRF9NRVRBX0RBVEEsIEJvb2xlYW4uVFJVRSk7Ci0KLQkJcmVzdWx0LmdldERlZmF1bHRTYXZlT3B0aW9ucygpLnB1dChYTUxSZXNvdXJjZS5PUFRJT05fU0NIRU1BX0xPQ0FUSU9OLCBCb29sZWFuLlRSVUUpOwotCi0JCXJlc3VsdC5nZXREZWZhdWx0TG9hZE9wdGlvbnMoKS5wdXQoWE1MUmVzb3VyY2UuT1BUSU9OX1VTRV9FTkNPREVEX0FUVFJJQlVURV9TVFlMRSwgQm9vbGVhbi5UUlVFKTsKLQkJcmVzdWx0LmdldERlZmF1bHRTYXZlT3B0aW9ucygpLnB1dChYTUxSZXNvdXJjZS5PUFRJT05fVVNFX0VOQ09ERURfQVRUUklCVVRFX1NUWUxFLCBCb29sZWFuLlRSVUUpOwotCi0JCXJlc3VsdC5nZXREZWZhdWx0TG9hZE9wdGlvbnMoKS5wdXQoWE1MUmVzb3VyY2UuT1BUSU9OX1VTRV9MRVhJQ0FMX0hBTkRMRVIsIEJvb2xlYW4uVFJVRSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi19IC8vVW1hUmVzb3VyY2VGYWN0b3J5SW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL3V0aWwvVW1hUmVzb3VyY2VJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvdXRpbC9VbWFSZXNvdXJjZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDNkMmQ2NC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvdXRpbC9VbWFSZXNvdXJjZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogVW1hUmVzb3VyY2VJbXBsLmphdmEsdiAxLjIgMjAwOC8wMS8zMCAwMDo0MTo0OCBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEudXRpbDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5YTUxIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5YTUxTYXZlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuaW1wbC5YTUxIZWxwZXJJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuaW1wbC5YTUxSZXNvdXJjZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogVGhlIDxiPlJlc291cmNlIDwvYj4gYXNzb2NpYXRlZCB3aXRoIHRoZSBwYWNrYWdlLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLnV0aWwuVW1hUmVzb3VyY2VGYWN0b3J5SW1wbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgVW1hUmVzb3VyY2VJbXBsIGV4dGVuZHMgWE1MUmVzb3VyY2VJbXBsIHsKLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSByZXNvdXJjZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB1cmkgdGhlIFVSSSBvZiB0aGUgbmV3IHJlc291cmNlLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVW1hUmVzb3VyY2VJbXBsKFVSSSB1cmkpIHsKLQkJc3VwZXIodXJpKTsKLQl9Ci0KLQkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQkvLyBjdXN0b21pemF0aW9uIGhlcmUsIEppbmh1YSBYaSAwNC8yOC8yMDA2Ci0JLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0JCi0JLyoKLQkgKiBKYXZhZG9jIGNvcGllZCBmcm9tIGludGVyZmFjZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzYXZlKE1hcCBvcHRpb25zKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlzdXBlci5zYXZlKG9wdGlvbnMpOwotCX0KLQotCXByb3RlY3RlZCBYTUxTYXZlIGNyZWF0ZVhNTFNhdmUoKSB7Ci0JCS8vIHJldHVybiBzdXBlci5jcmVhdGVYTUxTYXZlKCk7Ci0JCXJldHVybiBuZXcgVW1hWE1MU2F2ZUltcGwoY3JlYXRlWE1MSGVscGVyKCkpOwotCX0KLQkJCi0JcHJvdGVjdGVkIFhNTEhlbHBlciBjcmVhdGVYTUxIZWxwZXIoKSB7Ci0JCVhNTEhlbHBlckltcGwgaGVscGVyID0gbmV3IFhNTEhlbHBlckltcGwodGhpcykgewotCQkJcHVibGljIHZvaWQgYWRkUHJlZml4KFN0cmluZyBwcmVmaXgsIFN0cmluZyB1cmkpIHsKLQkJCQlpZiAocHJlZml4LmVxdWFscygidW1hIikpIHsJCS8vJE5PTi1OTFMtMSQKLQkJCQkJdXJpID0gVW1hUGFja2FnZS5lTlNfVVJJOwotCQkJCX0KLQkJCQlzdXBlci5hZGRQcmVmaXgocHJlZml4LCB1cmkpOwotCQkJfQotCQl9OwotCQlyZXR1cm4gaGVscGVyOwotCX0KLQkKLX0gLy8gVW1hUmVzb3VyY2VJbXBsCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvdXRpbC9VbWFTd2l0Y2guamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS91dGlsL1VtYVN3aXRjaC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZDRjNWY2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS91dGlsL1VtYVN3aXRjaC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjU2MSArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFVtYVN3aXRjaC5qYXZhLHYgMS4yIDIwMDgvMDEvMzAgMDA6NDE6NDgga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQWN0aXZpdHlEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5BcHBsaWNhYmxlTWV0YUNsYXNzSW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5BcnRpZmFjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5BcnRpZmFjdERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkJyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNhcGFiaWxpdHlQYXR0ZXJuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNoZWNrbGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db21wb3NpdGVSb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbmNlcHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29uc3RyYWludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db250ZW50Q2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudENhdGVnb3J5UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db250ZW50RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ3VzdG9tQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVsaXZlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVsaXZlcmFibGVEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZWxpdmVyeVByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVzY3JpYmFibGVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVzY3JpcHRvckRlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRpc2NpcGxpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGlzY2lwbGluZUdyb3VwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRvY3VtZW50Um9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Eb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Fc3RpbWF0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Fc3RpbWF0aW5nTWV0cmljOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkVzdGltYXRpb25Db25zaWRlcmF0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5FeGFtcGxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkd1aWRhbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkd1aWRhbmNlRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuR3VpZGVsaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkl0ZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5LaW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RFbGVtZW50UHJvcGVydHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1pbGVzdG9uZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5OYW1lZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuT3V0Y29tZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5QYWNrYWdlYWJsZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUGhhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUGxhbm5pbmdEYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByYWN0aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByYWN0aWNlRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc0NvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5SZXBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUmV1c2FibGVBc3NldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Sb2FkbWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUm9sZURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJvbGVEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJvbGVTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUm9sZVNldEdyb3VwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlNlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuU3VwcG9ydGluZ01hdGVyaWFsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRhc2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFza0Rlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRhc2tEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRlYW1Qcm9maWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRlbXBsYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRlcm1EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRvb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVG9vbE1lbnRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldoaXRlcGFwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya0JyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya09yZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtQcm9kdWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtQcm9kdWN0VHlwZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogVGhlIDxiPlN3aXRjaDwvYj4gZm9yIHRoZSBtb2RlbCdzIGluaGVyaXRhbmNlIGhpZXJhcmNoeS4KLSAqIEl0IHN1cHBvcnRzIHRoZSBjYWxsIHtAbGluayAjZG9Td2l0Y2goRU9iamVjdCkgZG9Td2l0Y2gob2JqZWN0KX0KLSAqIHRvIGludm9rZSB0aGUgPGNvZGU+Y2FzZVhYWDwvY29kZT4gbWV0aG9kIGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbCwKLSAqIHN0YXJ0aW5nIHdpdGggdGhlIGFjdHVhbCBjbGFzcyBvZiB0aGUgb2JqZWN0Ci0gKiBhbmQgcHJvY2VlZGluZyB1cCB0aGUgaW5oZXJpdGFuY2UgaGllcmFyY2h5Ci0gKiB1bnRpbCBhIG5vbi1udWxsIHJlc3VsdCBpcyByZXR1cm5lZCwKLSAqIHdoaWNoIGlzIHRoZSByZXN1bHQgb2YgdGhlIHN3aXRjaC4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBVbWFTd2l0Y2g8VD4gewotCS8qKgotCSAqIFRoZSBjYWNoZWQgbW9kZWwgcGFja2FnZQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgVW1hUGFja2FnZSBtb2RlbFBhY2thZ2U7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBzd2l0Y2guCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFVtYVN3aXRjaCgpIHsKLQkJaWYgKG1vZGVsUGFja2FnZSA9PSBudWxsKSB7Ci0JCQltb2RlbFBhY2thZ2UgPSBVbWFQYWNrYWdlLmVJTlNUQU5DRTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENhbGxzIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbCB1bnRpbCBvbmUgcmV0dXJucyBhIG5vbiBudWxsIHJlc3VsdDsgaXQgeWllbGRzIHRoYXQgcmVzdWx0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgZmlyc3Qgbm9uLW51bGwgcmVzdWx0IHJldHVybmVkIGJ5IGEgPGNvZGU+Y2FzZVhYWDwvY29kZT4gY2FsbC4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgZG9Td2l0Y2goRU9iamVjdCB0aGVFT2JqZWN0KSB7Ci0JCXJldHVybiBkb1N3aXRjaCh0aGVFT2JqZWN0LmVDbGFzcygpLCB0aGVFT2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBDYWxscyA8Y29kZT5jYXNlWFhYPC9jb2RlPiBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwgdW50aWwgb25lIHJldHVybnMgYSBub24gbnVsbCByZXN1bHQ7IGl0IHlpZWxkcyB0aGF0IHJlc3VsdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIGZpcnN0IG5vbi1udWxsIHJlc3VsdCByZXR1cm5lZCBieSBhIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGNhbGwuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBUIGRvU3dpdGNoKEVDbGFzcyB0aGVFQ2xhc3MsIEVPYmplY3QgdGhlRU9iamVjdCkgewotCQlpZiAodGhlRUNsYXNzLmVDb250YWluZXIoKSA9PSBtb2RlbFBhY2thZ2UpIHsKLQkJCXJldHVybiBkb1N3aXRjaCh0aGVFQ2xhc3MuZ2V0Q2xhc3NpZmllcklEKCksIHRoZUVPYmplY3QpOwotCQl9Ci0JCWVsc2UgewotCQkJTGlzdDxFQ2xhc3M+IGVTdXBlclR5cGVzID0gdGhlRUNsYXNzLmdldEVTdXBlclR5cGVzKCk7Ci0JCQlyZXR1cm4KLQkJCQllU3VwZXJUeXBlcy5pc0VtcHR5KCkgPwotCQkJCQlkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KSA6Ci0JCQkJCWRvU3dpdGNoKGVTdXBlclR5cGVzLmdldCgwKSwgdGhlRU9iamVjdCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDYWxscyA8Y29kZT5jYXNlWFhYPC9jb2RlPiBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwgdW50aWwgb25lIHJldHVybnMgYSBub24gbnVsbCByZXN1bHQ7IGl0IHlpZWxkcyB0aGF0IHJlc3VsdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIGZpcnN0IG5vbi1udWxsIHJlc3VsdCByZXR1cm5lZCBieSBhIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGNhbGwuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBUIGRvU3dpdGNoKGludCBjbGFzc2lmaWVySUQsIEVPYmplY3QgdGhlRU9iamVjdCkgewotCQlzd2l0Y2ggKGNsYXNzaWZpZXJJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZOiB7Ci0JCQkJQWN0aXZpdHkgYWN0aXZpdHkgPSAoQWN0aXZpdHkpdGhlRU9iamVjdDsKLQkJCQlUIHJlc3VsdCA9IGNhc2VBY3Rpdml0eShhY3Rpdml0eSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlV29ya0JyZWFrZG93bkVsZW1lbnQoYWN0aXZpdHkpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUJyZWFrZG93bkVsZW1lbnQoYWN0aXZpdHkpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVByb2Nlc3NFbGVtZW50KGFjdGl2aXR5KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQoYWN0aXZpdHkpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQoYWN0aXZpdHkpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChhY3Rpdml0eSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KGFjdGl2aXR5KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFbGVtZW50KGFjdGl2aXR5KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfREVTQ1JJUFRJT046IHsKLQkJCQlBY3Rpdml0eURlc2NyaXB0aW9uIGFjdGl2aXR5RGVzY3JpcHRpb24gPSAoQWN0aXZpdHlEZXNjcmlwdGlvbil0aGVFT2JqZWN0OwotCQkJCVQgcmVzdWx0ID0gY2FzZUFjdGl2aXR5RGVzY3JpcHRpb24oYWN0aXZpdHlEZXNjcmlwdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uKGFjdGl2aXR5RGVzY3JpcHRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUNvbnRlbnREZXNjcmlwdGlvbihhY3Rpdml0eURlc2NyaXB0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNZXRob2RVbml0KGFjdGl2aXR5RGVzY3JpcHRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQoYWN0aXZpdHlEZXNjcmlwdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KGFjdGl2aXR5RGVzY3JpcHRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChhY3Rpdml0eURlc2NyaXB0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFbGVtZW50KGFjdGl2aXR5RGVzY3JpcHRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgVW1hUGFja2FnZS5BUFBMSUNBQkxFX01FVEFfQ0xBU1NfSU5GTzogewotCQkJCUFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvIGFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvID0gKEFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvKXRoZUVPYmplY3Q7Ci0JCQkJVCByZXN1bHQgPSBjYXNlQXBwbGljYWJsZU1ldGFDbGFzc0luZm8oYXBwbGljYWJsZU1ldGFDbGFzc0luZm8pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChhcHBsaWNhYmxlTWV0YUNsYXNzSW5mbyk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KGFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFbGVtZW50KGFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFVtYVBhY2thZ2UuQVJUSUZBQ1Q6IHsKLQkJCQlBcnRpZmFjdCBhcnRpZmFjdCA9IChBcnRpZmFjdCl0aGVFT2JqZWN0OwotCQkJCVQgcmVzdWx0ID0gY2FzZUFydGlmYWN0KGFydGlmYWN0KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VXb3JrUHJvZHVjdChhcnRpZmFjdCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQ29udGVudEVsZW1lbnQoYXJ0aWZhY3QpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZURlc2NyaWJhYmxlRWxlbWVudChhcnRpZmFjdCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChhcnRpZmFjdCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KGFydGlmYWN0KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQoYXJ0aWZhY3QpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVsZW1lbnQoYXJ0aWZhY3QpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgVW1hUGFja2FnZS5BUlRJRkFDVF9ERVNDUklQVElPTjogewotCQkJCUFydGlmYWN0RGVzY3JpcHRpb24gYXJ0aWZhY3REZXNjcmlwdGlvbiA9IChBcnRpZmFjdERlc2NyaXB0aW9uKXRoZUVPYmplY3Q7Ci0JCQkJVCByZXN1bHQgPSBjYXNlQXJ0aWZhY3REZXNjcmlwdGlvbihhcnRpZmFjdERlc2NyaXB0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VXb3JrUHJvZHVjdERlc2NyaXB0aW9uKGFydGlmYWN0RGVzY3JpcHRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUNvbnRlbnREZXNjcmlwdGlvbihhcnRpZmFjdERlc2NyaXB0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNZXRob2RVbml0KGFydGlmYWN0RGVzY3JpcHRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQoYXJ0aWZhY3REZXNjcmlwdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KGFydGlmYWN0RGVzY3JpcHRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChhcnRpZmFjdERlc2NyaXB0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFbGVtZW50KGFydGlmYWN0RGVzY3JpcHRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVDogewotCQkJCUJyZWFrZG93bkVsZW1lbnQgYnJlYWtkb3duRWxlbWVudCA9IChCcmVha2Rvd25FbGVtZW50KXRoZUVPYmplY3Q7Ci0JCQkJVCByZXN1bHQgPSBjYXNlQnJlYWtkb3duRWxlbWVudChicmVha2Rvd25FbGVtZW50KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VQcm9jZXNzRWxlbWVudChicmVha2Rvd25FbGVtZW50KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQoYnJlYWtkb3duRWxlbWVudCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChicmVha2Rvd25FbGVtZW50KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQoYnJlYWtkb3duRWxlbWVudCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KGJyZWFrZG93bkVsZW1lbnQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVsZW1lbnQoYnJlYWtkb3duRWxlbWVudCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OOiB7Ci0JCQkJQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uIGJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbiA9IChCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24pdGhlRU9iamVjdDsKLQkJCQlUIHJlc3VsdCA9IGNhc2VCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24oYnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VDb250ZW50RGVzY3JpcHRpb24oYnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNZXRob2RVbml0KGJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChicmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChicmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChicmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVsZW1lbnQoYnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ0FQQUJJTElUWV9QQVRURVJOOiB7Ci0JCQkJQ2FwYWJpbGl0eVBhdHRlcm4gY2FwYWJpbGl0eVBhdHRlcm4gPSAoQ2FwYWJpbGl0eVBhdHRlcm4pdGhlRU9iamVjdDsKLQkJCQlUIHJlc3VsdCA9IGNhc2VDYXBhYmlsaXR5UGF0dGVybihjYXBhYmlsaXR5UGF0dGVybik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUHJvY2VzcyhjYXBhYmlsaXR5UGF0dGVybik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQWN0aXZpdHkoY2FwYWJpbGl0eVBhdHRlcm4pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVdvcmtCcmVha2Rvd25FbGVtZW50KGNhcGFiaWxpdHlQYXR0ZXJuKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VCcmVha2Rvd25FbGVtZW50KGNhcGFiaWxpdHlQYXR0ZXJuKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VQcm9jZXNzRWxlbWVudChjYXBhYmlsaXR5UGF0dGVybik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRGVzY3JpYmFibGVFbGVtZW50KGNhcGFiaWxpdHlQYXR0ZXJuKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KGNhcGFiaWxpdHlQYXR0ZXJuKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQoY2FwYWJpbGl0eVBhdHRlcm4pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChjYXBhYmlsaXR5UGF0dGVybik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRWxlbWVudChjYXBhYmlsaXR5UGF0dGVybik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBVbWFQYWNrYWdlLkNIRUNLTElTVDogewotCQkJCUNoZWNrbGlzdCBjaGVja2xpc3QgPSAoQ2hlY2tsaXN0KXRoZUVPYmplY3Q7Ci0JCQkJVCByZXN1bHQgPSBjYXNlQ2hlY2tsaXN0KGNoZWNrbGlzdCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlR3VpZGFuY2UoY2hlY2tsaXN0KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VDb250ZW50RWxlbWVudChjaGVja2xpc3QpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZURlc2NyaWJhYmxlRWxlbWVudChjaGVja2xpc3QpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQoY2hlY2tsaXN0KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQoY2hlY2tsaXN0KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQoY2hlY2tsaXN0KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFbGVtZW50KGNoZWNrbGlzdCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBVbWFQYWNrYWdlLkNPTVBPU0lURV9ST0xFOiB7Ci0JCQkJQ29tcG9zaXRlUm9sZSBjb21wb3NpdGVSb2xlID0gKENvbXBvc2l0ZVJvbGUpdGhlRU9iamVjdDsKLQkJCQlUIHJlc3VsdCA9IGNhc2VDb21wb3NpdGVSb2xlKGNvbXBvc2l0ZVJvbGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVJvbGVEZXNjcmlwdG9yKGNvbXBvc2l0ZVJvbGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZURlc2NyaXB0b3IoY29tcG9zaXRlUm9sZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQnJlYWtkb3duRWxlbWVudChjb21wb3NpdGVSb2xlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VQcm9jZXNzRWxlbWVudChjb21wb3NpdGVSb2xlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQoY29tcG9zaXRlUm9sZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChjb21wb3NpdGVSb2xlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQoY29tcG9zaXRlUm9sZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KGNvbXBvc2l0ZVJvbGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVsZW1lbnQoY29tcG9zaXRlUm9sZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBVbWFQYWNrYWdlLkNPTkNFUFQ6IHsKLQkJCQlDb25jZXB0IGNvbmNlcHQgPSAoQ29uY2VwdCl0aGVFT2JqZWN0OwotCQkJCVQgcmVzdWx0ID0gY2FzZUNvbmNlcHQoY29uY2VwdCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlR3VpZGFuY2UoY29uY2VwdCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQ29udGVudEVsZW1lbnQoY29uY2VwdCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRGVzY3JpYmFibGVFbGVtZW50KGNvbmNlcHQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQoY29uY2VwdCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KGNvbmNlcHQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChjb25jZXB0KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFbGVtZW50KGNvbmNlcHQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgVW1hUGFja2FnZS5DT05TVFJBSU5UOiB7Ci0JCQkJQ29uc3RyYWludCBjb25zdHJhaW50ID0gKENvbnN0cmFpbnQpdGhlRU9iamVjdDsKLQkJCQlUIHJlc3VsdCA9IGNhc2VDb25zdHJhaW50KGNvbnN0cmFpbnQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQoY29uc3RyYWludCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KGNvbnN0cmFpbnQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChjb25zdHJhaW50KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFbGVtZW50KGNvbnN0cmFpbnQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0NBVEVHT1JZOiB7Ci0JCQkJQ29udGVudENhdGVnb3J5IGNvbnRlbnRDYXRlZ29yeSA9IChDb250ZW50Q2F0ZWdvcnkpdGhlRU9iamVjdDsKLQkJCQlUIHJlc3VsdCA9IGNhc2VDb250ZW50Q2F0ZWdvcnkoY29udGVudENhdGVnb3J5KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VDb250ZW50RWxlbWVudChjb250ZW50Q2F0ZWdvcnkpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZURlc2NyaWJhYmxlRWxlbWVudChjb250ZW50Q2F0ZWdvcnkpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQoY29udGVudENhdGVnb3J5KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQoY29udGVudENhdGVnb3J5KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQoY29udGVudENhdGVnb3J5KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFbGVtZW50KGNvbnRlbnRDYXRlZ29yeSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfQ0FURUdPUllfUEFDS0FHRTogewotCQkJCUNvbnRlbnRDYXRlZ29yeVBhY2thZ2UgY29udGVudENhdGVnb3J5UGFja2FnZSA9IChDb250ZW50Q2F0ZWdvcnlQYWNrYWdlKXRoZUVPYmplY3Q7Ci0JCQkJVCByZXN1bHQgPSBjYXNlQ29udGVudENhdGVnb3J5UGFja2FnZShjb250ZW50Q2F0ZWdvcnlQYWNrYWdlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNZXRob2RQYWNrYWdlKGNvbnRlbnRDYXRlZ29yeVBhY2thZ2UpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQoY29udGVudENhdGVnb3J5UGFja2FnZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KGNvbnRlbnRDYXRlZ29yeVBhY2thZ2UpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChjb250ZW50Q2F0ZWdvcnlQYWNrYWdlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFbGVtZW50KGNvbnRlbnRDYXRlZ29yeVBhY2thZ2UpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0RFU0NSSVBUSU9OOiB7Ci0JCQkJQ29udGVudERlc2NyaXB0aW9uIGNvbnRlbnREZXNjcmlwdGlvbiA9IChDb250ZW50RGVzY3JpcHRpb24pdGhlRU9iamVjdDsKLQkJCQlUIHJlc3VsdCA9IGNhc2VDb250ZW50RGVzY3JpcHRpb24oY29udGVudERlc2NyaXB0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNZXRob2RVbml0KGNvbnRlbnREZXNjcmlwdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChjb250ZW50RGVzY3JpcHRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChjb250ZW50RGVzY3JpcHRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChjb250ZW50RGVzY3JpcHRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVsZW1lbnQoY29udGVudERlc2NyaXB0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9FTEVNRU5UOiB7Ci0JCQkJQ29udGVudEVsZW1lbnQgY29udGVudEVsZW1lbnQgPSAoQ29udGVudEVsZW1lbnQpdGhlRU9iamVjdDsKLQkJCQlUIHJlc3VsdCA9IGNhc2VDb250ZW50RWxlbWVudChjb250ZW50RWxlbWVudCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRGVzY3JpYmFibGVFbGVtZW50KGNvbnRlbnRFbGVtZW50KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KGNvbnRlbnRFbGVtZW50KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQoY29udGVudEVsZW1lbnQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChjb250ZW50RWxlbWVudCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRWxlbWVudChjb250ZW50RWxlbWVudCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfUEFDS0FHRTogewotCQkJCUNvbnRlbnRQYWNrYWdlIGNvbnRlbnRQYWNrYWdlID0gKENvbnRlbnRQYWNrYWdlKXRoZUVPYmplY3Q7Ci0JCQkJVCByZXN1bHQgPSBjYXNlQ29udGVudFBhY2thZ2UoY29udGVudFBhY2thZ2UpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1ldGhvZFBhY2thZ2UoY29udGVudFBhY2thZ2UpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQoY29udGVudFBhY2thZ2UpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChjb250ZW50UGFja2FnZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KGNvbnRlbnRQYWNrYWdlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFbGVtZW50KGNvbnRlbnRQYWNrYWdlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ1VTVE9NX0NBVEVHT1JZOiB7Ci0JCQkJQ3VzdG9tQ2F0ZWdvcnkgY3VzdG9tQ2F0ZWdvcnkgPSAoQ3VzdG9tQ2F0ZWdvcnkpdGhlRU9iamVjdDsKLQkJCQlUIHJlc3VsdCA9IGNhc2VDdXN0b21DYXRlZ29yeShjdXN0b21DYXRlZ29yeSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQ29udGVudENhdGVnb3J5KGN1c3RvbUNhdGVnb3J5KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VDb250ZW50RWxlbWVudChjdXN0b21DYXRlZ29yeSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRGVzY3JpYmFibGVFbGVtZW50KGN1c3RvbUNhdGVnb3J5KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KGN1c3RvbUNhdGVnb3J5KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQoY3VzdG9tQ2F0ZWdvcnkpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChjdXN0b21DYXRlZ29yeSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRWxlbWVudChjdXN0b21DYXRlZ29yeSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJBQkxFOiB7Ci0JCQkJRGVsaXZlcmFibGUgZGVsaXZlcmFibGUgPSAoRGVsaXZlcmFibGUpdGhlRU9iamVjdDsKLQkJCQlUIHJlc3VsdCA9IGNhc2VEZWxpdmVyYWJsZShkZWxpdmVyYWJsZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlV29ya1Byb2R1Y3QoZGVsaXZlcmFibGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUNvbnRlbnRFbGVtZW50KGRlbGl2ZXJhYmxlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQoZGVsaXZlcmFibGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQoZGVsaXZlcmFibGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChkZWxpdmVyYWJsZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KGRlbGl2ZXJhYmxlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFbGVtZW50KGRlbGl2ZXJhYmxlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUkFCTEVfREVTQ1JJUFRJT046IHsKLQkJCQlEZWxpdmVyYWJsZURlc2NyaXB0aW9uIGRlbGl2ZXJhYmxlRGVzY3JpcHRpb24gPSAoRGVsaXZlcmFibGVEZXNjcmlwdGlvbil0aGVFT2JqZWN0OwotCQkJCVQgcmVzdWx0ID0gY2FzZURlbGl2ZXJhYmxlRGVzY3JpcHRpb24oZGVsaXZlcmFibGVEZXNjcmlwdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlV29ya1Byb2R1Y3REZXNjcmlwdGlvbihkZWxpdmVyYWJsZURlc2NyaXB0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VDb250ZW50RGVzY3JpcHRpb24oZGVsaXZlcmFibGVEZXNjcmlwdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTWV0aG9kVW5pdChkZWxpdmVyYWJsZURlc2NyaXB0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KGRlbGl2ZXJhYmxlRGVzY3JpcHRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChkZWxpdmVyYWJsZURlc2NyaXB0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQoZGVsaXZlcmFibGVEZXNjcmlwdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRWxlbWVudChkZWxpdmVyYWJsZURlc2NyaXB0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUllfUFJPQ0VTUzogewotCQkJCURlbGl2ZXJ5UHJvY2VzcyBkZWxpdmVyeVByb2Nlc3MgPSAoRGVsaXZlcnlQcm9jZXNzKXRoZUVPYmplY3Q7Ci0JCQkJVCByZXN1bHQgPSBjYXNlRGVsaXZlcnlQcm9jZXNzKGRlbGl2ZXJ5UHJvY2Vzcyk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUHJvY2VzcyhkZWxpdmVyeVByb2Nlc3MpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUFjdGl2aXR5KGRlbGl2ZXJ5UHJvY2Vzcyk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlV29ya0JyZWFrZG93bkVsZW1lbnQoZGVsaXZlcnlQcm9jZXNzKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VCcmVha2Rvd25FbGVtZW50KGRlbGl2ZXJ5UHJvY2Vzcyk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUHJvY2Vzc0VsZW1lbnQoZGVsaXZlcnlQcm9jZXNzKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQoZGVsaXZlcnlQcm9jZXNzKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KGRlbGl2ZXJ5UHJvY2Vzcyk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KGRlbGl2ZXJ5UHJvY2Vzcyk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KGRlbGl2ZXJ5UHJvY2Vzcyk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRWxlbWVudChkZWxpdmVyeVByb2Nlc3MpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OOiB7Ci0JCQkJRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24gZGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24gPSAoRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24pdGhlRU9iamVjdDsKLQkJCQlUIHJlc3VsdCA9IGNhc2VEZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbihkZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUHJvY2Vzc0Rlc2NyaXB0aW9uKGRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VBY3Rpdml0eURlc2NyaXB0aW9uKGRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24oZGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUNvbnRlbnREZXNjcmlwdGlvbihkZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTWV0aG9kVW5pdChkZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChkZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KGRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQoZGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVsZW1lbnQoZGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgVW1hUGFja2FnZS5ERVNDUklCQUJMRV9FTEVNRU5UOiB7Ci0JCQkJRGVzY3JpYmFibGVFbGVtZW50IGRlc2NyaWJhYmxlRWxlbWVudCA9IChEZXNjcmliYWJsZUVsZW1lbnQpdGhlRU9iamVjdDsKLQkJCQlUIHJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQoZGVzY3JpYmFibGVFbGVtZW50KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KGRlc2NyaWJhYmxlRWxlbWVudCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KGRlc2NyaWJhYmxlRWxlbWVudCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KGRlc2NyaWJhYmxlRWxlbWVudCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRWxlbWVudChkZXNjcmliYWJsZUVsZW1lbnQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgVW1hUGFja2FnZS5ERVNDUklQVE9SOiB7Ci0JCQkJRGVzY3JpcHRvciBkZXNjcmlwdG9yID0gKERlc2NyaXB0b3IpdGhlRU9iamVjdDsKLQkJCQlUIHJlc3VsdCA9IGNhc2VEZXNjcmlwdG9yKGRlc2NyaXB0b3IpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUJyZWFrZG93bkVsZW1lbnQoZGVzY3JpcHRvcik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUHJvY2Vzc0VsZW1lbnQoZGVzY3JpcHRvcik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRGVzY3JpYmFibGVFbGVtZW50KGRlc2NyaXB0b3IpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQoZGVzY3JpcHRvcik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KGRlc2NyaXB0b3IpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChkZXNjcmlwdG9yKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFbGVtZW50KGRlc2NyaXB0b3IpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgVW1hUGFja2FnZS5ERVNDUklQVE9SX0RFU0NSSVBUSU9OOiB7Ci0JCQkJRGVzY3JpcHRvckRlc2NyaXB0aW9uIGRlc2NyaXB0b3JEZXNjcmlwdGlvbiA9IChEZXNjcmlwdG9yRGVzY3JpcHRpb24pdGhlRU9iamVjdDsKLQkJCQlUIHJlc3VsdCA9IGNhc2VEZXNjcmlwdG9yRGVzY3JpcHRpb24oZGVzY3JpcHRvckRlc2NyaXB0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24oZGVzY3JpcHRvckRlc2NyaXB0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VDb250ZW50RGVzY3JpcHRpb24oZGVzY3JpcHRvckRlc2NyaXB0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNZXRob2RVbml0KGRlc2NyaXB0b3JEZXNjcmlwdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChkZXNjcmlwdG9yRGVzY3JpcHRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChkZXNjcmlwdG9yRGVzY3JpcHRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChkZXNjcmlwdG9yRGVzY3JpcHRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVsZW1lbnQoZGVzY3JpcHRvckRlc2NyaXB0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFVtYVBhY2thZ2UuRElTQ0lQTElORTogewotCQkJCURpc2NpcGxpbmUgZGlzY2lwbGluZSA9IChEaXNjaXBsaW5lKXRoZUVPYmplY3Q7Ci0JCQkJVCByZXN1bHQgPSBjYXNlRGlzY2lwbGluZShkaXNjaXBsaW5lKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VDb250ZW50Q2F0ZWdvcnkoZGlzY2lwbGluZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQ29udGVudEVsZW1lbnQoZGlzY2lwbGluZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRGVzY3JpYmFibGVFbGVtZW50KGRpc2NpcGxpbmUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQoZGlzY2lwbGluZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KGRpc2NpcGxpbmUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChkaXNjaXBsaW5lKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFbGVtZW50KGRpc2NpcGxpbmUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgVW1hUGFja2FnZS5ESVNDSVBMSU5FX0dST1VQSU5HOiB7Ci0JCQkJRGlzY2lwbGluZUdyb3VwaW5nIGRpc2NpcGxpbmVHcm91cGluZyA9IChEaXNjaXBsaW5lR3JvdXBpbmcpdGhlRU9iamVjdDsKLQkJCQlUIHJlc3VsdCA9IGNhc2VEaXNjaXBsaW5lR3JvdXBpbmcoZGlzY2lwbGluZUdyb3VwaW5nKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VDb250ZW50Q2F0ZWdvcnkoZGlzY2lwbGluZUdyb3VwaW5nKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VDb250ZW50RWxlbWVudChkaXNjaXBsaW5lR3JvdXBpbmcpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZURlc2NyaWJhYmxlRWxlbWVudChkaXNjaXBsaW5lR3JvdXBpbmcpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQoZGlzY2lwbGluZUdyb3VwaW5nKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQoZGlzY2lwbGluZUdyb3VwaW5nKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQoZGlzY2lwbGluZUdyb3VwaW5nKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFbGVtZW50KGRpc2NpcGxpbmVHcm91cGluZyk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBVbWFQYWNrYWdlLkRPQ1VNRU5UX1JPT1Q6IHsKLQkJCQlEb2N1bWVudFJvb3QgZG9jdW1lbnRSb290ID0gKERvY3VtZW50Um9vdCl0aGVFT2JqZWN0OwotCQkJCVQgcmVzdWx0ID0gY2FzZURvY3VtZW50Um9vdChkb2N1bWVudFJvb3QpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgVW1hUGFja2FnZS5ET01BSU46IHsKLQkJCQlEb21haW4gZG9tYWluID0gKERvbWFpbil0aGVFT2JqZWN0OwotCQkJCVQgcmVzdWx0ID0gY2FzZURvbWFpbihkb21haW4pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUNvbnRlbnRDYXRlZ29yeShkb21haW4pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUNvbnRlbnRFbGVtZW50KGRvbWFpbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRGVzY3JpYmFibGVFbGVtZW50KGRvbWFpbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChkb21haW4pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChkb21haW4pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChkb21haW4pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVsZW1lbnQoZG9tYWluKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFVtYVBhY2thZ2UuRUxFTUVOVDogewotCQkJCUVsZW1lbnQgZWxlbWVudCA9IChFbGVtZW50KXRoZUVPYmplY3Q7Ci0JCQkJVCByZXN1bHQgPSBjYXNlRWxlbWVudChlbGVtZW50KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFVtYVBhY2thZ2UuRVNUSU1BVEU6IHsKLQkJCQlFc3RpbWF0ZSBlc3RpbWF0ZSA9IChFc3RpbWF0ZSl0aGVFT2JqZWN0OwotCQkJCVQgcmVzdWx0ID0gY2FzZUVzdGltYXRlKGVzdGltYXRlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VHdWlkYW5jZShlc3RpbWF0ZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQ29udGVudEVsZW1lbnQoZXN0aW1hdGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZURlc2NyaWJhYmxlRWxlbWVudChlc3RpbWF0ZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChlc3RpbWF0ZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KGVzdGltYXRlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQoZXN0aW1hdGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVsZW1lbnQoZXN0aW1hdGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgVW1hUGFja2FnZS5FU1RJTUFUSU5HX01FVFJJQzogewotCQkJCUVzdGltYXRpbmdNZXRyaWMgZXN0aW1hdGluZ01ldHJpYyA9IChFc3RpbWF0aW5nTWV0cmljKXRoZUVPYmplY3Q7Ci0JCQkJVCByZXN1bHQgPSBjYXNlRXN0aW1hdGluZ01ldHJpYyhlc3RpbWF0aW5nTWV0cmljKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VHdWlkYW5jZShlc3RpbWF0aW5nTWV0cmljKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VDb250ZW50RWxlbWVudChlc3RpbWF0aW5nTWV0cmljKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQoZXN0aW1hdGluZ01ldHJpYyk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChlc3RpbWF0aW5nTWV0cmljKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQoZXN0aW1hdGluZ01ldHJpYyk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KGVzdGltYXRpbmdNZXRyaWMpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVsZW1lbnQoZXN0aW1hdGluZ01ldHJpYyk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBVbWFQYWNrYWdlLkVTVElNQVRJT05fQ09OU0lERVJBVElPTlM6IHsKLQkJCQlFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMgZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zID0gKEVzdGltYXRpb25Db25zaWRlcmF0aW9ucyl0aGVFT2JqZWN0OwotCQkJCVQgcmVzdWx0ID0gY2FzZUVzdGltYXRpb25Db25zaWRlcmF0aW9ucyhlc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUd1aWRhbmNlKGVzdGltYXRpb25Db25zaWRlcmF0aW9ucyk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQ29udGVudEVsZW1lbnQoZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQoZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KGVzdGltYXRpb25Db25zaWRlcmF0aW9ucyk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KGVzdGltYXRpb25Db25zaWRlcmF0aW9ucyk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KGVzdGltYXRpb25Db25zaWRlcmF0aW9ucyk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRWxlbWVudChlc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgVW1hUGFja2FnZS5FWEFNUExFOiB7Ci0JCQkJRXhhbXBsZSBleGFtcGxlID0gKEV4YW1wbGUpdGhlRU9iamVjdDsKLQkJCQlUIHJlc3VsdCA9IGNhc2VFeGFtcGxlKGV4YW1wbGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUd1aWRhbmNlKGV4YW1wbGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUNvbnRlbnRFbGVtZW50KGV4YW1wbGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZURlc2NyaWJhYmxlRWxlbWVudChleGFtcGxlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KGV4YW1wbGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChleGFtcGxlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQoZXhhbXBsZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRWxlbWVudChleGFtcGxlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFVtYVBhY2thZ2UuR1VJREFOQ0U6IHsKLQkJCQlHdWlkYW5jZSBndWlkYW5jZSA9IChHdWlkYW5jZSl0aGVFT2JqZWN0OwotCQkJCVQgcmVzdWx0ID0gY2FzZUd1aWRhbmNlKGd1aWRhbmNlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VDb250ZW50RWxlbWVudChndWlkYW5jZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRGVzY3JpYmFibGVFbGVtZW50KGd1aWRhbmNlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KGd1aWRhbmNlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQoZ3VpZGFuY2UpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChndWlkYW5jZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRWxlbWVudChndWlkYW5jZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBVbWFQYWNrYWdlLkdVSURBTkNFX0RFU0NSSVBUSU9OOiB7Ci0JCQkJR3VpZGFuY2VEZXNjcmlwdGlvbiBndWlkYW5jZURlc2NyaXB0aW9uID0gKEd1aWRhbmNlRGVzY3JpcHRpb24pdGhlRU9iamVjdDsKLQkJCQlUIHJlc3VsdCA9IGNhc2VHdWlkYW5jZURlc2NyaXB0aW9uKGd1aWRhbmNlRGVzY3JpcHRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUNvbnRlbnREZXNjcmlwdGlvbihndWlkYW5jZURlc2NyaXB0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNZXRob2RVbml0KGd1aWRhbmNlRGVzY3JpcHRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQoZ3VpZGFuY2VEZXNjcmlwdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KGd1aWRhbmNlRGVzY3JpcHRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChndWlkYW5jZURlc2NyaXB0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFbGVtZW50KGd1aWRhbmNlRGVzY3JpcHRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgVW1hUGFja2FnZS5HVUlERUxJTkU6IHsKLQkJCQlHdWlkZWxpbmUgZ3VpZGVsaW5lID0gKEd1aWRlbGluZSl0aGVFT2JqZWN0OwotCQkJCVQgcmVzdWx0ID0gY2FzZUd1aWRlbGluZShndWlkZWxpbmUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUd1aWRhbmNlKGd1aWRlbGluZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQ29udGVudEVsZW1lbnQoZ3VpZGVsaW5lKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQoZ3VpZGVsaW5lKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KGd1aWRlbGluZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KGd1aWRlbGluZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KGd1aWRlbGluZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRWxlbWVudChndWlkZWxpbmUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgVW1hUGFja2FnZS5JVEVSQVRJT046IHsKLQkJCQlJdGVyYXRpb24gaXRlcmF0aW9uID0gKEl0ZXJhdGlvbil0aGVFT2JqZWN0OwotCQkJCVQgcmVzdWx0ID0gY2FzZUl0ZXJhdGlvbihpdGVyYXRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUFjdGl2aXR5KGl0ZXJhdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlV29ya0JyZWFrZG93bkVsZW1lbnQoaXRlcmF0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VCcmVha2Rvd25FbGVtZW50KGl0ZXJhdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUHJvY2Vzc0VsZW1lbnQoaXRlcmF0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQoaXRlcmF0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KGl0ZXJhdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KGl0ZXJhdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KGl0ZXJhdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRWxlbWVudChpdGVyYXRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgVW1hUGFja2FnZS5LSU5EOiB7Ci0JCQkJS2luZCBraW5kID0gKEtpbmQpdGhlRU9iamVjdDsKLQkJCQlUIHJlc3VsdCA9IGNhc2VLaW5kKGtpbmQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUNvbnRlbnRFbGVtZW50KGtpbmQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZURlc2NyaWJhYmxlRWxlbWVudChraW5kKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KGtpbmQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChraW5kKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQoa2luZCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRWxlbWVudChraW5kKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0NPTkZJR1VSQVRJT046IHsKLQkJCQlNZXRob2RDb25maWd1cmF0aW9uIG1ldGhvZENvbmZpZ3VyYXRpb24gPSAoTWV0aG9kQ29uZmlndXJhdGlvbil0aGVFT2JqZWN0OwotCQkJCVQgcmVzdWx0ID0gY2FzZU1ldGhvZENvbmZpZ3VyYXRpb24obWV0aG9kQ29uZmlndXJhdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTWV0aG9kVW5pdChtZXRob2RDb25maWd1cmF0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KG1ldGhvZENvbmZpZ3VyYXRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChtZXRob2RDb25maWd1cmF0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQobWV0aG9kQ29uZmlndXJhdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRWxlbWVudChtZXRob2RDb25maWd1cmF0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0VMRU1FTlQ6IHsKLQkJCQlNZXRob2RFbGVtZW50IG1ldGhvZEVsZW1lbnQgPSAoTWV0aG9kRWxlbWVudCl0aGVFT2JqZWN0OwotCQkJCVQgcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQobWV0aG9kRWxlbWVudCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KG1ldGhvZEVsZW1lbnQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChtZXRob2RFbGVtZW50KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFbGVtZW50KG1ldGhvZEVsZW1lbnQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTogewotCQkJCU1ldGhvZEVsZW1lbnRQcm9wZXJ0eSBtZXRob2RFbGVtZW50UHJvcGVydHkgPSAoTWV0aG9kRWxlbWVudFByb3BlcnR5KXRoZUVPYmplY3Q7Ci0JCQkJVCByZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudFByb3BlcnR5KG1ldGhvZEVsZW1lbnRQcm9wZXJ0eSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KG1ldGhvZEVsZW1lbnRQcm9wZXJ0eSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KG1ldGhvZEVsZW1lbnRQcm9wZXJ0eSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRWxlbWVudChtZXRob2RFbGVtZW50UHJvcGVydHkpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfTElCUkFSWTogewotCQkJCU1ldGhvZExpYnJhcnkgbWV0aG9kTGlicmFyeSA9IChNZXRob2RMaWJyYXJ5KXRoZUVPYmplY3Q7Ci0JCQkJVCByZXN1bHQgPSBjYXNlTWV0aG9kTGlicmFyeShtZXRob2RMaWJyYXJ5KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNZXRob2RVbml0KG1ldGhvZExpYnJhcnkpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQobWV0aG9kTGlicmFyeSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KG1ldGhvZExpYnJhcnkpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChtZXRob2RMaWJyYXJ5KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFbGVtZW50KG1ldGhvZExpYnJhcnkpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfUEFDS0FHRTogewotCQkJCU1ldGhvZFBhY2thZ2UgbWV0aG9kUGFja2FnZSA9IChNZXRob2RQYWNrYWdlKXRoZUVPYmplY3Q7Ci0JCQkJVCByZXN1bHQgPSBjYXNlTWV0aG9kUGFja2FnZShtZXRob2RQYWNrYWdlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KG1ldGhvZFBhY2thZ2UpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChtZXRob2RQYWNrYWdlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQobWV0aG9kUGFja2FnZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRWxlbWVudChtZXRob2RQYWNrYWdlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1BMVUdJTjogewotCQkJCU1ldGhvZFBsdWdpbiBtZXRob2RQbHVnaW4gPSAoTWV0aG9kUGx1Z2luKXRoZUVPYmplY3Q7Ci0JCQkJVCByZXN1bHQgPSBjYXNlTWV0aG9kUGx1Z2luKG1ldGhvZFBsdWdpbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTWV0aG9kVW5pdChtZXRob2RQbHVnaW4pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQobWV0aG9kUGx1Z2luKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQobWV0aG9kUGx1Z2luKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQobWV0aG9kUGx1Z2luKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFbGVtZW50KG1ldGhvZFBsdWdpbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9VTklUOiB7Ci0JCQkJTWV0aG9kVW5pdCBtZXRob2RVbml0ID0gKE1ldGhvZFVuaXQpdGhlRU9iamVjdDsKLQkJCQlUIHJlc3VsdCA9IGNhc2VNZXRob2RVbml0KG1ldGhvZFVuaXQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQobWV0aG9kVW5pdCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KG1ldGhvZFVuaXQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChtZXRob2RVbml0KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFbGVtZW50KG1ldGhvZFVuaXQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgVW1hUGFja2FnZS5NSUxFU1RPTkU6IHsKLQkJCQlNaWxlc3RvbmUgbWlsZXN0b25lID0gKE1pbGVzdG9uZSl0aGVFT2JqZWN0OwotCQkJCVQgcmVzdWx0ID0gY2FzZU1pbGVzdG9uZShtaWxlc3RvbmUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVdvcmtCcmVha2Rvd25FbGVtZW50KG1pbGVzdG9uZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQnJlYWtkb3duRWxlbWVudChtaWxlc3RvbmUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVByb2Nlc3NFbGVtZW50KG1pbGVzdG9uZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRGVzY3JpYmFibGVFbGVtZW50KG1pbGVzdG9uZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChtaWxlc3RvbmUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChtaWxlc3RvbmUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChtaWxlc3RvbmUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVsZW1lbnQobWlsZXN0b25lKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFVtYVBhY2thZ2UuTkFNRURfRUxFTUVOVDogewotCQkJCU5hbWVkRWxlbWVudCBuYW1lZEVsZW1lbnQgPSAoTmFtZWRFbGVtZW50KXRoZUVPYmplY3Q7Ci0JCQkJVCByZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KG5hbWVkRWxlbWVudCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRWxlbWVudChuYW1lZEVsZW1lbnQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgVW1hUGFja2FnZS5PVVRDT01FOiB7Ci0JCQkJT3V0Y29tZSBvdXRjb21lID0gKE91dGNvbWUpdGhlRU9iamVjdDsKLQkJCQlUIHJlc3VsdCA9IGNhc2VPdXRjb21lKG91dGNvbWUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVdvcmtQcm9kdWN0KG91dGNvbWUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUNvbnRlbnRFbGVtZW50KG91dGNvbWUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZURlc2NyaWJhYmxlRWxlbWVudChvdXRjb21lKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KG91dGNvbWUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChvdXRjb21lKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQob3V0Y29tZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRWxlbWVudChvdXRjb21lKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFVtYVBhY2thZ2UuUEFDS0FHRUFCTEVfRUxFTUVOVDogewotCQkJCVBhY2thZ2VhYmxlRWxlbWVudCBwYWNrYWdlYWJsZUVsZW1lbnQgPSAoUGFja2FnZWFibGVFbGVtZW50KXRoZUVPYmplY3Q7Ci0JCQkJVCByZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KHBhY2thZ2VhYmxlRWxlbWVudCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KHBhY2thZ2VhYmxlRWxlbWVudCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRWxlbWVudChwYWNrYWdlYWJsZUVsZW1lbnQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgVW1hUGFja2FnZS5QSEFTRTogewotCQkJCVBoYXNlIHBoYXNlID0gKFBoYXNlKXRoZUVPYmplY3Q7Ci0JCQkJVCByZXN1bHQgPSBjYXNlUGhhc2UocGhhc2UpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUFjdGl2aXR5KHBoYXNlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VXb3JrQnJlYWtkb3duRWxlbWVudChwaGFzZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQnJlYWtkb3duRWxlbWVudChwaGFzZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUHJvY2Vzc0VsZW1lbnQocGhhc2UpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZURlc2NyaWJhYmxlRWxlbWVudChwaGFzZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChwaGFzZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KHBoYXNlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQocGhhc2UpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVsZW1lbnQocGhhc2UpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgVW1hUGFja2FnZS5QTEFOTklOR19EQVRBOiB7Ci0JCQkJUGxhbm5pbmdEYXRhIHBsYW5uaW5nRGF0YSA9IChQbGFubmluZ0RhdGEpdGhlRU9iamVjdDsKLQkJCQlUIHJlc3VsdCA9IGNhc2VQbGFubmluZ0RhdGEocGxhbm5pbmdEYXRhKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VQcm9jZXNzRWxlbWVudChwbGFubmluZ0RhdGEpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZURlc2NyaWJhYmxlRWxlbWVudChwbGFubmluZ0RhdGEpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQocGxhbm5pbmdEYXRhKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQocGxhbm5pbmdEYXRhKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQocGxhbm5pbmdEYXRhKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFbGVtZW50KHBsYW5uaW5nRGF0YSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBVbWFQYWNrYWdlLlBSQUNUSUNFOiB7Ci0JCQkJUHJhY3RpY2UgcHJhY3RpY2UgPSAoUHJhY3RpY2UpdGhlRU9iamVjdDsKLQkJCQlUIHJlc3VsdCA9IGNhc2VQcmFjdGljZShwcmFjdGljZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlR3VpZGFuY2UocHJhY3RpY2UpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUNvbnRlbnRFbGVtZW50KHByYWN0aWNlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQocHJhY3RpY2UpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQocHJhY3RpY2UpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChwcmFjdGljZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KHByYWN0aWNlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFbGVtZW50KHByYWN0aWNlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJBQ1RJQ0VfREVTQ1JJUFRJT046IHsKLQkJCQlQcmFjdGljZURlc2NyaXB0aW9uIHByYWN0aWNlRGVzY3JpcHRpb24gPSAoUHJhY3RpY2VEZXNjcmlwdGlvbil0aGVFT2JqZWN0OwotCQkJCVQgcmVzdWx0ID0gY2FzZVByYWN0aWNlRGVzY3JpcHRpb24ocHJhY3RpY2VEZXNjcmlwdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQ29udGVudERlc2NyaXB0aW9uKHByYWN0aWNlRGVzY3JpcHRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1ldGhvZFVuaXQocHJhY3RpY2VEZXNjcmlwdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChwcmFjdGljZURlc2NyaXB0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQocHJhY3RpY2VEZXNjcmlwdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KHByYWN0aWNlRGVzY3JpcHRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVsZW1lbnQocHJhY3RpY2VEZXNjcmlwdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1M6IHsKLQkJCQlvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzIHByb2Nlc3MgPSAob3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzcyl0aGVFT2JqZWN0OwotCQkJCVQgcmVzdWx0ID0gY2FzZVByb2Nlc3MocHJvY2Vzcyk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQWN0aXZpdHkocHJvY2Vzcyk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlV29ya0JyZWFrZG93bkVsZW1lbnQocHJvY2Vzcyk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQnJlYWtkb3duRWxlbWVudChwcm9jZXNzKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VQcm9jZXNzRWxlbWVudChwcm9jZXNzKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQocHJvY2Vzcyk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChwcm9jZXNzKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQocHJvY2Vzcyk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KHByb2Nlc3MpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVsZW1lbnQocHJvY2Vzcyk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UOiB7Ci0JCQkJUHJvY2Vzc0NvbXBvbmVudCBwcm9jZXNzQ29tcG9uZW50ID0gKFByb2Nlc3NDb21wb25lbnQpdGhlRU9iamVjdDsKLQkJCQlUIHJlc3VsdCA9IGNhc2VQcm9jZXNzQ29tcG9uZW50KHByb2Nlc3NDb21wb25lbnQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVByb2Nlc3NQYWNrYWdlKHByb2Nlc3NDb21wb25lbnQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1ldGhvZFBhY2thZ2UocHJvY2Vzc0NvbXBvbmVudCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChwcm9jZXNzQ29tcG9uZW50KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQocHJvY2Vzc0NvbXBvbmVudCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KHByb2Nlc3NDb21wb25lbnQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVsZW1lbnQocHJvY2Vzc0NvbXBvbmVudCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRTogewotCQkJCVByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UgcHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSA9IChQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlKXRoZUVPYmplY3Q7Ci0JCQkJVCByZXN1bHQgPSBjYXNlUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZShwcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VCcmVha2Rvd25FbGVtZW50KHByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVByb2Nlc3NFbGVtZW50KHByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZURlc2NyaWJhYmxlRWxlbWVudChwcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KHByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChwcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQocHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRWxlbWVudChwcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19ERVNDUklQVElPTjogewotCQkJCVByb2Nlc3NEZXNjcmlwdGlvbiBwcm9jZXNzRGVzY3JpcHRpb24gPSAoUHJvY2Vzc0Rlc2NyaXB0aW9uKXRoZUVPYmplY3Q7Ci0JCQkJVCByZXN1bHQgPSBjYXNlUHJvY2Vzc0Rlc2NyaXB0aW9uKHByb2Nlc3NEZXNjcmlwdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQWN0aXZpdHlEZXNjcmlwdGlvbihwcm9jZXNzRGVzY3JpcHRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbihwcm9jZXNzRGVzY3JpcHRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUNvbnRlbnREZXNjcmlwdGlvbihwcm9jZXNzRGVzY3JpcHRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1ldGhvZFVuaXQocHJvY2Vzc0Rlc2NyaXB0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KHByb2Nlc3NEZXNjcmlwdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KHByb2Nlc3NEZXNjcmlwdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KHByb2Nlc3NEZXNjcmlwdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRWxlbWVudChwcm9jZXNzRGVzY3JpcHRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0VMRU1FTlQ6IHsKLQkJCQlQcm9jZXNzRWxlbWVudCBwcm9jZXNzRWxlbWVudCA9IChQcm9jZXNzRWxlbWVudCl0aGVFT2JqZWN0OwotCQkJCVQgcmVzdWx0ID0gY2FzZVByb2Nlc3NFbGVtZW50KHByb2Nlc3NFbGVtZW50KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQocHJvY2Vzc0VsZW1lbnQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQocHJvY2Vzc0VsZW1lbnQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChwcm9jZXNzRWxlbWVudCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KHByb2Nlc3NFbGVtZW50KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFbGVtZW50KHByb2Nlc3NFbGVtZW50KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19QQUNLQUdFOiB7Ci0JCQkJUHJvY2Vzc1BhY2thZ2UgcHJvY2Vzc1BhY2thZ2UgPSAoUHJvY2Vzc1BhY2thZ2UpdGhlRU9iamVjdDsKLQkJCQlUIHJlc3VsdCA9IGNhc2VQcm9jZXNzUGFja2FnZShwcm9jZXNzUGFja2FnZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTWV0aG9kUGFja2FnZShwcm9jZXNzUGFja2FnZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChwcm9jZXNzUGFja2FnZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KHByb2Nlc3NQYWNrYWdlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQocHJvY2Vzc1BhY2thZ2UpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVsZW1lbnQocHJvY2Vzc1BhY2thZ2UpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFOiB7Ci0JCQkJUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUgcHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUgPSAoUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUpdGhlRU9iamVjdDsKLQkJCQlUIHJlc3VsdCA9IGNhc2VQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZShwcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUHJvY2Vzcyhwcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQWN0aXZpdHkocHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVdvcmtCcmVha2Rvd25FbGVtZW50KHByb2Nlc3NQbGFubmluZ1RlbXBsYXRlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VCcmVha2Rvd25FbGVtZW50KHByb2Nlc3NQbGFubmluZ1RlbXBsYXRlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VQcm9jZXNzRWxlbWVudChwcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRGVzY3JpYmFibGVFbGVtZW50KHByb2Nlc3NQbGFubmluZ1RlbXBsYXRlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KHByb2Nlc3NQbGFubmluZ1RlbXBsYXRlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQocHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChwcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRWxlbWVudChwcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBVbWFQYWNrYWdlLlJFUE9SVDogewotCQkJCVJlcG9ydCByZXBvcnQgPSAoUmVwb3J0KXRoZUVPYmplY3Q7Ci0JCQkJVCByZXN1bHQgPSBjYXNlUmVwb3J0KHJlcG9ydCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlR3VpZGFuY2UocmVwb3J0KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VDb250ZW50RWxlbWVudChyZXBvcnQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZURlc2NyaWJhYmxlRWxlbWVudChyZXBvcnQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQocmVwb3J0KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQocmVwb3J0KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQocmVwb3J0KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFbGVtZW50KHJlcG9ydCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBVbWFQYWNrYWdlLlJFVVNBQkxFX0FTU0VUOiB7Ci0JCQkJUmV1c2FibGVBc3NldCByZXVzYWJsZUFzc2V0ID0gKFJldXNhYmxlQXNzZXQpdGhlRU9iamVjdDsKLQkJCQlUIHJlc3VsdCA9IGNhc2VSZXVzYWJsZUFzc2V0KHJldXNhYmxlQXNzZXQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUd1aWRhbmNlKHJldXNhYmxlQXNzZXQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUNvbnRlbnRFbGVtZW50KHJldXNhYmxlQXNzZXQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZURlc2NyaWJhYmxlRWxlbWVudChyZXVzYWJsZUFzc2V0KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KHJldXNhYmxlQXNzZXQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChyZXVzYWJsZUFzc2V0KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQocmV1c2FibGVBc3NldCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRWxlbWVudChyZXVzYWJsZUFzc2V0KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFVtYVBhY2thZ2UuUk9BRE1BUDogewotCQkJCVJvYWRtYXAgcm9hZG1hcCA9IChSb2FkbWFwKXRoZUVPYmplY3Q7Ci0JCQkJVCByZXN1bHQgPSBjYXNlUm9hZG1hcChyb2FkbWFwKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VHdWlkYW5jZShyb2FkbWFwKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VDb250ZW50RWxlbWVudChyb2FkbWFwKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQocm9hZG1hcCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChyb2FkbWFwKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQocm9hZG1hcCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KHJvYWRtYXApOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVsZW1lbnQocm9hZG1hcCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBVbWFQYWNrYWdlLlJPTEU6IHsKLQkJCQlSb2xlIHJvbGUgPSAoUm9sZSl0aGVFT2JqZWN0OwotCQkJCVQgcmVzdWx0ID0gY2FzZVJvbGUocm9sZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQ29udGVudEVsZW1lbnQocm9sZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRGVzY3JpYmFibGVFbGVtZW50KHJvbGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQocm9sZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KHJvbGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChyb2xlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFbGVtZW50KHJvbGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgVW1hUGFja2FnZS5ST0xFX0RFU0NSSVBUSU9OOiB7Ci0JCQkJUm9sZURlc2NyaXB0aW9uIHJvbGVEZXNjcmlwdGlvbiA9IChSb2xlRGVzY3JpcHRpb24pdGhlRU9iamVjdDsKLQkJCQlUIHJlc3VsdCA9IGNhc2VSb2xlRGVzY3JpcHRpb24ocm9sZURlc2NyaXB0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VDb250ZW50RGVzY3JpcHRpb24ocm9sZURlc2NyaXB0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNZXRob2RVbml0KHJvbGVEZXNjcmlwdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChyb2xlRGVzY3JpcHRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChyb2xlRGVzY3JpcHRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChyb2xlRGVzY3JpcHRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVsZW1lbnQocm9sZURlc2NyaXB0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9ERVNDUklQVE9SOiB7Ci0JCQkJUm9sZURlc2NyaXB0b3Igcm9sZURlc2NyaXB0b3IgPSAoUm9sZURlc2NyaXB0b3IpdGhlRU9iamVjdDsKLQkJCQlUIHJlc3VsdCA9IGNhc2VSb2xlRGVzY3JpcHRvcihyb2xlRGVzY3JpcHRvcik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRGVzY3JpcHRvcihyb2xlRGVzY3JpcHRvcik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQnJlYWtkb3duRWxlbWVudChyb2xlRGVzY3JpcHRvcik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUHJvY2Vzc0VsZW1lbnQocm9sZURlc2NyaXB0b3IpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZURlc2NyaWJhYmxlRWxlbWVudChyb2xlRGVzY3JpcHRvcik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChyb2xlRGVzY3JpcHRvcik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KHJvbGVEZXNjcmlwdG9yKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQocm9sZURlc2NyaXB0b3IpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVsZW1lbnQocm9sZURlc2NyaXB0b3IpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgVW1hUGFja2FnZS5ST0xFX1NFVDogewotCQkJCVJvbGVTZXQgcm9sZVNldCA9IChSb2xlU2V0KXRoZUVPYmplY3Q7Ci0JCQkJVCByZXN1bHQgPSBjYXNlUm9sZVNldChyb2xlU2V0KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VDb250ZW50Q2F0ZWdvcnkocm9sZVNldCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQ29udGVudEVsZW1lbnQocm9sZVNldCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRGVzY3JpYmFibGVFbGVtZW50KHJvbGVTZXQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQocm9sZVNldCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KHJvbGVTZXQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChyb2xlU2V0KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFbGVtZW50KHJvbGVTZXQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgVW1hUGFja2FnZS5ST0xFX1NFVF9HUk9VUElORzogewotCQkJCVJvbGVTZXRHcm91cGluZyByb2xlU2V0R3JvdXBpbmcgPSAoUm9sZVNldEdyb3VwaW5nKXRoZUVPYmplY3Q7Ci0JCQkJVCByZXN1bHQgPSBjYXNlUm9sZVNldEdyb3VwaW5nKHJvbGVTZXRHcm91cGluZyk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQ29udGVudENhdGVnb3J5KHJvbGVTZXRHcm91cGluZyk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQ29udGVudEVsZW1lbnQocm9sZVNldEdyb3VwaW5nKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQocm9sZVNldEdyb3VwaW5nKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KHJvbGVTZXRHcm91cGluZyk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KHJvbGVTZXRHcm91cGluZyk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KHJvbGVTZXRHcm91cGluZyk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRWxlbWVudChyb2xlU2V0R3JvdXBpbmcpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgVW1hUGFja2FnZS5TRUNUSU9OOiB7Ci0JCQkJU2VjdGlvbiBzZWN0aW9uID0gKFNlY3Rpb24pdGhlRU9iamVjdDsKLQkJCQlUIHJlc3VsdCA9IGNhc2VTZWN0aW9uKHNlY3Rpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQoc2VjdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KHNlY3Rpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChzZWN0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFbGVtZW50KHNlY3Rpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgVW1hUGFja2FnZS5TVVBQT1JUSU5HX01BVEVSSUFMOiB7Ci0JCQkJU3VwcG9ydGluZ01hdGVyaWFsIHN1cHBvcnRpbmdNYXRlcmlhbCA9IChTdXBwb3J0aW5nTWF0ZXJpYWwpdGhlRU9iamVjdDsKLQkJCQlUIHJlc3VsdCA9IGNhc2VTdXBwb3J0aW5nTWF0ZXJpYWwoc3VwcG9ydGluZ01hdGVyaWFsKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VHdWlkYW5jZShzdXBwb3J0aW5nTWF0ZXJpYWwpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUNvbnRlbnRFbGVtZW50KHN1cHBvcnRpbmdNYXRlcmlhbCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRGVzY3JpYmFibGVFbGVtZW50KHN1cHBvcnRpbmdNYXRlcmlhbCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChzdXBwb3J0aW5nTWF0ZXJpYWwpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChzdXBwb3J0aW5nTWF0ZXJpYWwpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChzdXBwb3J0aW5nTWF0ZXJpYWwpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVsZW1lbnQoc3VwcG9ydGluZ01hdGVyaWFsKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTSzogewotCQkJCVRhc2sgdGFzayA9IChUYXNrKXRoZUVPYmplY3Q7Ci0JCQkJVCByZXN1bHQgPSBjYXNlVGFzayh0YXNrKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VDb250ZW50RWxlbWVudCh0YXNrKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQodGFzayk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudCh0YXNrKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQodGFzayk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KHRhc2spOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVsZW1lbnQodGFzayk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRJT046IHsKLQkJCQlUYXNrRGVzY3JpcHRpb24gdGFza0Rlc2NyaXB0aW9uID0gKFRhc2tEZXNjcmlwdGlvbil0aGVFT2JqZWN0OwotCQkJCVQgcmVzdWx0ID0gY2FzZVRhc2tEZXNjcmlwdGlvbih0YXNrRGVzY3JpcHRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUNvbnRlbnREZXNjcmlwdGlvbih0YXNrRGVzY3JpcHRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1ldGhvZFVuaXQodGFza0Rlc2NyaXB0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KHRhc2tEZXNjcmlwdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KHRhc2tEZXNjcmlwdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KHRhc2tEZXNjcmlwdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRWxlbWVudCh0YXNrRGVzY3JpcHRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1I6IHsKLQkJCQlUYXNrRGVzY3JpcHRvciB0YXNrRGVzY3JpcHRvciA9IChUYXNrRGVzY3JpcHRvcil0aGVFT2JqZWN0OwotCQkJCVQgcmVzdWx0ID0gY2FzZVRhc2tEZXNjcmlwdG9yKHRhc2tEZXNjcmlwdG9yKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VXb3JrQnJlYWtkb3duRWxlbWVudCh0YXNrRGVzY3JpcHRvcik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQnJlYWtkb3duRWxlbWVudCh0YXNrRGVzY3JpcHRvcik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUHJvY2Vzc0VsZW1lbnQodGFza0Rlc2NyaXB0b3IpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZURlc2NyaWJhYmxlRWxlbWVudCh0YXNrRGVzY3JpcHRvcik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudCh0YXNrRGVzY3JpcHRvcik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KHRhc2tEZXNjcmlwdG9yKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQodGFza0Rlc2NyaXB0b3IpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVsZW1lbnQodGFza0Rlc2NyaXB0b3IpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgVW1hUGFja2FnZS5URUFNX1BST0ZJTEU6IHsKLQkJCQlUZWFtUHJvZmlsZSB0ZWFtUHJvZmlsZSA9IChUZWFtUHJvZmlsZSl0aGVFT2JqZWN0OwotCQkJCVQgcmVzdWx0ID0gY2FzZVRlYW1Qcm9maWxlKHRlYW1Qcm9maWxlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VCcmVha2Rvd25FbGVtZW50KHRlYW1Qcm9maWxlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VQcm9jZXNzRWxlbWVudCh0ZWFtUHJvZmlsZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRGVzY3JpYmFibGVFbGVtZW50KHRlYW1Qcm9maWxlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KHRlYW1Qcm9maWxlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQodGVhbVByb2ZpbGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudCh0ZWFtUHJvZmlsZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRWxlbWVudCh0ZWFtUHJvZmlsZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBVbWFQYWNrYWdlLlRFTVBMQVRFOiB7Ci0JCQkJVGVtcGxhdGUgdGVtcGxhdGUgPSAoVGVtcGxhdGUpdGhlRU9iamVjdDsKLQkJCQlUIHJlc3VsdCA9IGNhc2VUZW1wbGF0ZSh0ZW1wbGF0ZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlR3VpZGFuY2UodGVtcGxhdGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUNvbnRlbnRFbGVtZW50KHRlbXBsYXRlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQodGVtcGxhdGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQodGVtcGxhdGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudCh0ZW1wbGF0ZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KHRlbXBsYXRlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFbGVtZW50KHRlbXBsYXRlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEVSTV9ERUZJTklUSU9OOiB7Ci0JCQkJVGVybURlZmluaXRpb24gdGVybURlZmluaXRpb24gPSAoVGVybURlZmluaXRpb24pdGhlRU9iamVjdDsKLQkJCQlUIHJlc3VsdCA9IGNhc2VUZXJtRGVmaW5pdGlvbih0ZXJtRGVmaW5pdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlR3VpZGFuY2UodGVybURlZmluaXRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUNvbnRlbnRFbGVtZW50KHRlcm1EZWZpbml0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQodGVybURlZmluaXRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQodGVybURlZmluaXRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudCh0ZXJtRGVmaW5pdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KHRlcm1EZWZpbml0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFbGVtZW50KHRlcm1EZWZpbml0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFVtYVBhY2thZ2UuVE9PTDogewotCQkJCVRvb2wgdG9vbCA9IChUb29sKXRoZUVPYmplY3Q7Ci0JCQkJVCByZXN1bHQgPSBjYXNlVG9vbCh0b29sKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VDb250ZW50Q2F0ZWdvcnkodG9vbCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQ29udGVudEVsZW1lbnQodG9vbCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRGVzY3JpYmFibGVFbGVtZW50KHRvb2wpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQodG9vbCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KHRvb2wpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudCh0b29sKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFbGVtZW50KHRvb2wpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgVW1hUGFja2FnZS5UT09MX01FTlRPUjogewotCQkJCVRvb2xNZW50b3IgdG9vbE1lbnRvciA9IChUb29sTWVudG9yKXRoZUVPYmplY3Q7Ci0JCQkJVCByZXN1bHQgPSBjYXNlVG9vbE1lbnRvcih0b29sTWVudG9yKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VHdWlkYW5jZSh0b29sTWVudG9yKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VDb250ZW50RWxlbWVudCh0b29sTWVudG9yKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQodG9vbE1lbnRvcik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudCh0b29sTWVudG9yKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQodG9vbE1lbnRvcik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KHRvb2xNZW50b3IpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVsZW1lbnQodG9vbE1lbnRvcik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBVbWFQYWNrYWdlLldISVRFUEFQRVI6IHsKLQkJCQlXaGl0ZXBhcGVyIHdoaXRlcGFwZXIgPSAoV2hpdGVwYXBlcil0aGVFT2JqZWN0OwotCQkJCVQgcmVzdWx0ID0gY2FzZVdoaXRlcGFwZXIod2hpdGVwYXBlcik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQ29uY2VwdCh3aGl0ZXBhcGVyKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VHdWlkYW5jZSh3aGl0ZXBhcGVyKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VDb250ZW50RWxlbWVudCh3aGl0ZXBhcGVyKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQod2hpdGVwYXBlcik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudCh3aGl0ZXBhcGVyKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQod2hpdGVwYXBlcik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KHdoaXRlcGFwZXIpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVsZW1lbnQod2hpdGVwYXBlcik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfQlJFQUtET1dOX0VMRU1FTlQ6IHsKLQkJCQlXb3JrQnJlYWtkb3duRWxlbWVudCB3b3JrQnJlYWtkb3duRWxlbWVudCA9IChXb3JrQnJlYWtkb3duRWxlbWVudCl0aGVFT2JqZWN0OwotCQkJCVQgcmVzdWx0ID0gY2FzZVdvcmtCcmVha2Rvd25FbGVtZW50KHdvcmtCcmVha2Rvd25FbGVtZW50KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VCcmVha2Rvd25FbGVtZW50KHdvcmtCcmVha2Rvd25FbGVtZW50KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VQcm9jZXNzRWxlbWVudCh3b3JrQnJlYWtkb3duRWxlbWVudCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRGVzY3JpYmFibGVFbGVtZW50KHdvcmtCcmVha2Rvd25FbGVtZW50KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KHdvcmtCcmVha2Rvd25FbGVtZW50KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQod29ya0JyZWFrZG93bkVsZW1lbnQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudCh3b3JrQnJlYWtkb3duRWxlbWVudCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRWxlbWVudCh3b3JrQnJlYWtkb3duRWxlbWVudCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfREVGSU5JVElPTjogewotCQkJCVdvcmtEZWZpbml0aW9uIHdvcmtEZWZpbml0aW9uID0gKFdvcmtEZWZpbml0aW9uKXRoZUVPYmplY3Q7Ci0JCQkJVCByZXN1bHQgPSBjYXNlV29ya0RlZmluaXRpb24od29ya0RlZmluaXRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQod29ya0RlZmluaXRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudCh3b3JrRGVmaW5pdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KHdvcmtEZWZpbml0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFbGVtZW50KHdvcmtEZWZpbml0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19PUkRFUjogewotCQkJCVdvcmtPcmRlciB3b3JrT3JkZXIgPSAoV29ya09yZGVyKXRoZUVPYmplY3Q7Ci0JCQkJVCByZXN1bHQgPSBjYXNlV29ya09yZGVyKHdvcmtPcmRlcik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVDogewotCQkJCVdvcmtQcm9kdWN0IHdvcmtQcm9kdWN0ID0gKFdvcmtQcm9kdWN0KXRoZUVPYmplY3Q7Ci0JCQkJVCByZXN1bHQgPSBjYXNlV29ya1Byb2R1Y3Qod29ya1Byb2R1Y3QpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUNvbnRlbnRFbGVtZW50KHdvcmtQcm9kdWN0KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQod29ya1Byb2R1Y3QpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQod29ya1Byb2R1Y3QpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudCh3b3JrUHJvZHVjdCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KHdvcmtQcm9kdWN0KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFbGVtZW50KHdvcmtQcm9kdWN0KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OOiB7Ci0JCQkJV29ya1Byb2R1Y3REZXNjcmlwdGlvbiB3b3JrUHJvZHVjdERlc2NyaXB0aW9uID0gKFdvcmtQcm9kdWN0RGVzY3JpcHRpb24pdGhlRU9iamVjdDsKLQkJCQlUIHJlc3VsdCA9IGNhc2VXb3JrUHJvZHVjdERlc2NyaXB0aW9uKHdvcmtQcm9kdWN0RGVzY3JpcHRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUNvbnRlbnREZXNjcmlwdGlvbih3b3JrUHJvZHVjdERlc2NyaXB0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNZXRob2RVbml0KHdvcmtQcm9kdWN0RGVzY3JpcHRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQod29ya1Byb2R1Y3REZXNjcmlwdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KHdvcmtQcm9kdWN0RGVzY3JpcHRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudCh3b3JrUHJvZHVjdERlc2NyaXB0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFbGVtZW50KHdvcmtQcm9kdWN0RGVzY3JpcHRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUjogewotCQkJCVdvcmtQcm9kdWN0RGVzY3JpcHRvciB3b3JrUHJvZHVjdERlc2NyaXB0b3IgPSAoV29ya1Byb2R1Y3REZXNjcmlwdG9yKXRoZUVPYmplY3Q7Ci0JCQkJVCByZXN1bHQgPSBjYXNlV29ya1Byb2R1Y3REZXNjcmlwdG9yKHdvcmtQcm9kdWN0RGVzY3JpcHRvcik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRGVzY3JpcHRvcih3b3JrUHJvZHVjdERlc2NyaXB0b3IpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUJyZWFrZG93bkVsZW1lbnQod29ya1Byb2R1Y3REZXNjcmlwdG9yKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VQcm9jZXNzRWxlbWVudCh3b3JrUHJvZHVjdERlc2NyaXB0b3IpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZURlc2NyaWJhYmxlRWxlbWVudCh3b3JrUHJvZHVjdERlc2NyaXB0b3IpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQod29ya1Byb2R1Y3REZXNjcmlwdG9yKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQod29ya1Byb2R1Y3REZXNjcmlwdG9yKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQod29ya1Byb2R1Y3REZXNjcmlwdG9yKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFbGVtZW50KHdvcmtQcm9kdWN0RGVzY3JpcHRvcik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9UWVBFOiB7Ci0JCQkJV29ya1Byb2R1Y3RUeXBlIHdvcmtQcm9kdWN0VHlwZSA9IChXb3JrUHJvZHVjdFR5cGUpdGhlRU9iamVjdDsKLQkJCQlUIHJlc3VsdCA9IGNhc2VXb3JrUHJvZHVjdFR5cGUod29ya1Byb2R1Y3RUeXBlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VDb250ZW50Q2F0ZWdvcnkod29ya1Byb2R1Y3RUeXBlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VDb250ZW50RWxlbWVudCh3b3JrUHJvZHVjdFR5cGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZURlc2NyaWJhYmxlRWxlbWVudCh3b3JrUHJvZHVjdFR5cGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQod29ya1Byb2R1Y3RUeXBlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQod29ya1Byb2R1Y3RUeXBlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQod29ya1Byb2R1Y3RUeXBlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFbGVtZW50KHdvcmtQcm9kdWN0VHlwZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJZGVmYXVsdDogcmV0dXJuIGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+QWN0aXZpdHk8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5BY3Rpdml0eTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZUFjdGl2aXR5KEFjdGl2aXR5IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5BY3Rpdml0eSBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkFjdGl2aXR5IERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlQWN0aXZpdHlEZXNjcmlwdGlvbihBY3Rpdml0eURlc2NyaXB0aW9uIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5BcHBsaWNhYmxlIE1ldGEgQ2xhc3MgSW5mbzwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkFwcGxpY2FibGUgTWV0YSBDbGFzcyBJbmZvPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlQXBwbGljYWJsZU1ldGFDbGFzc0luZm8oQXBwbGljYWJsZU1ldGFDbGFzc0luZm8gb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkFydGlmYWN0PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+QXJ0aWZhY3Q8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VBcnRpZmFjdChBcnRpZmFjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+QXJ0aWZhY3QgRGVzY3JpcHRpb248L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5BcnRpZmFjdCBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZUFydGlmYWN0RGVzY3JpcHRpb24oQXJ0aWZhY3REZXNjcmlwdGlvbiBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+QnJlYWtkb3duIEVsZW1lbnQ8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5CcmVha2Rvd24gRWxlbWVudDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZUJyZWFrZG93bkVsZW1lbnQoQnJlYWtkb3duRWxlbWVudCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+QnJlYWtkb3duIEVsZW1lbnQgRGVzY3JpcHRpb248L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5CcmVha2Rvd24gRWxlbWVudCBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZUJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbihCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24gb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkNhcGFiaWxpdHkgUGF0dGVybjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkNhcGFiaWxpdHkgUGF0dGVybjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZUNhcGFiaWxpdHlQYXR0ZXJuKENhcGFiaWxpdHlQYXR0ZXJuIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5DaGVja2xpc3Q8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5DaGVja2xpc3Q8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VDaGVja2xpc3QoQ2hlY2tsaXN0IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Db21wb3NpdGUgUm9sZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkNvbXBvc2l0ZSBSb2xlPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlQ29tcG9zaXRlUm9sZShDb21wb3NpdGVSb2xlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Db25jZXB0PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Q29uY2VwdDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZUNvbmNlcHQoQ29uY2VwdCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Q29uc3RyYWludDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkNvbnN0cmFpbnQ8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VDb25zdHJhaW50KENvbnN0cmFpbnQgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkNvbnRlbnQgQ2F0ZWdvcnk8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Db250ZW50IENhdGVnb3J5PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlQ29udGVudENhdGVnb3J5KENvbnRlbnRDYXRlZ29yeSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Q29udGVudCBDYXRlZ29yeSBQYWNrYWdlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Q29udGVudCBDYXRlZ29yeSBQYWNrYWdlPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlQ29udGVudENhdGVnb3J5UGFja2FnZShDb250ZW50Q2F0ZWdvcnlQYWNrYWdlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Db250ZW50IERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Q29udGVudCBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZUNvbnRlbnREZXNjcmlwdGlvbihDb250ZW50RGVzY3JpcHRpb24gb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkNvbnRlbnQgRWxlbWVudDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkNvbnRlbnQgRWxlbWVudDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZUNvbnRlbnRFbGVtZW50KENvbnRlbnRFbGVtZW50IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Db250ZW50IFBhY2thZ2U8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Db250ZW50IFBhY2thZ2U8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VDb250ZW50UGFja2FnZShDb250ZW50UGFja2FnZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Q3VzdG9tIENhdGVnb3J5PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Q3VzdG9tIENhdGVnb3J5PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlQ3VzdG9tQ2F0ZWdvcnkoQ3VzdG9tQ2F0ZWdvcnkgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkRlbGl2ZXJhYmxlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RGVsaXZlcmFibGU8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VEZWxpdmVyYWJsZShEZWxpdmVyYWJsZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RGVsaXZlcmFibGUgRGVzY3JpcHRpb248L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5EZWxpdmVyYWJsZSBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZURlbGl2ZXJhYmxlRGVzY3JpcHRpb24oRGVsaXZlcmFibGVEZXNjcmlwdGlvbiBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RGVsaXZlcnkgUHJvY2VzczwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkRlbGl2ZXJ5IFByb2Nlc3M8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VEZWxpdmVyeVByb2Nlc3MoRGVsaXZlcnlQcm9jZXNzIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5EZWxpdmVyeSBQcm9jZXNzIERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RGVsaXZlcnkgUHJvY2VzcyBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZURlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uKERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5EZXNjcmliYWJsZSBFbGVtZW50PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RGVzY3JpYmFibGUgRWxlbWVudDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZURlc2NyaWJhYmxlRWxlbWVudChEZXNjcmliYWJsZUVsZW1lbnQgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkRlc2NyaXB0b3I8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5EZXNjcmlwdG9yPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlRGVzY3JpcHRvcihEZXNjcmlwdG9yIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5EZXNjcmlwdG9yIERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RGVzY3JpcHRvciBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZURlc2NyaXB0b3JEZXNjcmlwdGlvbihEZXNjcmlwdG9yRGVzY3JpcHRpb24gb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkRpc2NpcGxpbmU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5EaXNjaXBsaW5lPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlRGlzY2lwbGluZShEaXNjaXBsaW5lIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5EaXNjaXBsaW5lIEdyb3VwaW5nPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RGlzY2lwbGluZSBHcm91cGluZzwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZURpc2NpcGxpbmVHcm91cGluZyhEaXNjaXBsaW5lR3JvdXBpbmcgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkRvY3VtZW50IFJvb3Q8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Eb2N1bWVudCBSb290PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlRG9jdW1lbnRSb290KERvY3VtZW50Um9vdCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RG9tYWluPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RG9tYWluPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlRG9tYWluKERvbWFpbiBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RWxlbWVudDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVsZW1lbnQ8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VFbGVtZW50KEVsZW1lbnQgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVzdGltYXRlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RXN0aW1hdGU8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VFc3RpbWF0ZShFc3RpbWF0ZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RXN0aW1hdGluZyBNZXRyaWM8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Fc3RpbWF0aW5nIE1ldHJpYzwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZUVzdGltYXRpbmdNZXRyaWMoRXN0aW1hdGluZ01ldHJpYyBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RXN0aW1hdGlvbiBDb25zaWRlcmF0aW9uczwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVzdGltYXRpb24gQ29uc2lkZXJhdGlvbnM8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMoRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FeGFtcGxlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RXhhbXBsZTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZUV4YW1wbGUoRXhhbXBsZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+R3VpZGFuY2U8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5HdWlkYW5jZTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZUd1aWRhbmNlKEd1aWRhbmNlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5HdWlkYW5jZSBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkd1aWRhbmNlIERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlR3VpZGFuY2VEZXNjcmlwdGlvbihHdWlkYW5jZURlc2NyaXB0aW9uIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5HdWlkZWxpbmU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5HdWlkZWxpbmU8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VHdWlkZWxpbmUoR3VpZGVsaW5lIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5JdGVyYXRpb248L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5JdGVyYXRpb248L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VJdGVyYXRpb24oSXRlcmF0aW9uIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5LaW5kPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+S2luZDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZUtpbmQoS2luZCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TWV0aG9kIENvbmZpZ3VyYXRpb248L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5NZXRob2QgQ29uZmlndXJhdGlvbjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZU1ldGhvZENvbmZpZ3VyYXRpb24oTWV0aG9kQ29uZmlndXJhdGlvbiBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TWV0aG9kIEVsZW1lbnQ8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5NZXRob2QgRWxlbWVudDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZU1ldGhvZEVsZW1lbnQoTWV0aG9kRWxlbWVudCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZU1ldGhvZEVsZW1lbnRQcm9wZXJ0eShNZXRob2RFbGVtZW50UHJvcGVydHkgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk1ldGhvZCBMaWJyYXJ5PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TWV0aG9kIExpYnJhcnk8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VNZXRob2RMaWJyYXJ5KE1ldGhvZExpYnJhcnkgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk1ldGhvZCBQYWNrYWdlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TWV0aG9kIFBhY2thZ2U8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VNZXRob2RQYWNrYWdlKE1ldGhvZFBhY2thZ2Ugb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk1ldGhvZCBQbHVnaW48L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5NZXRob2QgUGx1Z2luPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlTWV0aG9kUGx1Z2luKE1ldGhvZFBsdWdpbiBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TWV0aG9kIFVuaXQ8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5NZXRob2QgVW5pdDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZU1ldGhvZFVuaXQoTWV0aG9kVW5pdCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TWlsZXN0b25lPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TWlsZXN0b25lPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlTWlsZXN0b25lKE1pbGVzdG9uZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TmFtZWQgRWxlbWVudDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk5hbWVkIEVsZW1lbnQ8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VOYW1lZEVsZW1lbnQoTmFtZWRFbGVtZW50IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5PdXRjb21lPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+T3V0Y29tZTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZU91dGNvbWUoT3V0Y29tZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UGFja2FnZWFibGUgRWxlbWVudDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlBhY2thZ2VhYmxlIEVsZW1lbnQ8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQoUGFja2FnZWFibGVFbGVtZW50IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5QaGFzZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlBoYXNlPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlUGhhc2UoUGhhc2Ugb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlBsYW5uaW5nIERhdGE8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5QbGFubmluZyBEYXRhPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlUGxhbm5pbmdEYXRhKFBsYW5uaW5nRGF0YSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UHJhY3RpY2U8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5QcmFjdGljZTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZVByYWN0aWNlKFByYWN0aWNlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5QcmFjdGljZSBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlByYWN0aWNlIERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlUHJhY3RpY2VEZXNjcmlwdGlvbihQcmFjdGljZURlc2NyaXB0aW9uIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Qcm9jZXNzPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UHJvY2VzczwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZVByb2Nlc3Mob3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2VzcyBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UHJvY2VzcyBDb21wb25lbnQ8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Qcm9jZXNzIENvbXBvbmVudDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZVByb2Nlc3NDb21wb25lbnQoUHJvY2Vzc0NvbXBvbmVudCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UHJvY2VzcyBDb21wb25lbnQgSW50ZXJmYWNlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UHJvY2VzcyBDb21wb25lbnQgSW50ZXJmYWNlPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZShQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Qcm9jZXNzIERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UHJvY2VzcyBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZVByb2Nlc3NEZXNjcmlwdGlvbihQcm9jZXNzRGVzY3JpcHRpb24gb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlByb2Nlc3MgRWxlbWVudDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlByb2Nlc3MgRWxlbWVudDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZVByb2Nlc3NFbGVtZW50KFByb2Nlc3NFbGVtZW50IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Qcm9jZXNzIFBhY2thZ2U8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Qcm9jZXNzIFBhY2thZ2U8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VQcm9jZXNzUGFja2FnZShQcm9jZXNzUGFja2FnZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UHJvY2VzcyBQbGFubmluZyBUZW1wbGF0ZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlByb2Nlc3MgUGxhbm5pbmcgVGVtcGxhdGU8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZShQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UmVwb3J0PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UmVwb3J0PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlUmVwb3J0KFJlcG9ydCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UmV1c2FibGUgQXNzZXQ8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5SZXVzYWJsZSBBc3NldDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZVJldXNhYmxlQXNzZXQoUmV1c2FibGVBc3NldCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Um9hZG1hcDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlJvYWRtYXA8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VSb2FkbWFwKFJvYWRtYXAgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlJvbGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Sb2xlPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlUm9sZShSb2xlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Sb2xlIERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Um9sZSBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZVJvbGVEZXNjcmlwdGlvbihSb2xlRGVzY3JpcHRpb24gb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlJvbGUgRGVzY3JpcHRvcjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlJvbGUgRGVzY3JpcHRvcjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZVJvbGVEZXNjcmlwdG9yKFJvbGVEZXNjcmlwdG9yIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Sb2xlIFNldDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlJvbGUgU2V0PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlUm9sZVNldChSb2xlU2V0IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Sb2xlIFNldCBHcm91cGluZzwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlJvbGUgU2V0IEdyb3VwaW5nPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlUm9sZVNldEdyb3VwaW5nKFJvbGVTZXRHcm91cGluZyBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+U2VjdGlvbjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlNlY3Rpb248L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VTZWN0aW9uKFNlY3Rpb24gb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlN1cHBvcnRpbmcgTWF0ZXJpYWw8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5TdXBwb3J0aW5nIE1hdGVyaWFsPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlU3VwcG9ydGluZ01hdGVyaWFsKFN1cHBvcnRpbmdNYXRlcmlhbCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+VGFzazwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlRhc2s8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VUYXNrKFRhc2sgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlRhc2sgRGVzY3JpcHRpb248L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5UYXNrIERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlVGFza0Rlc2NyaXB0aW9uKFRhc2tEZXNjcmlwdGlvbiBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+VGFzayBEZXNjcmlwdG9yPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+VGFzayBEZXNjcmlwdG9yPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlVGFza0Rlc2NyaXB0b3IoVGFza0Rlc2NyaXB0b3Igb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlRlYW0gUHJvZmlsZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlRlYW0gUHJvZmlsZTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZVRlYW1Qcm9maWxlKFRlYW1Qcm9maWxlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5UZW1wbGF0ZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlRlbXBsYXRlPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlVGVtcGxhdGUoVGVtcGxhdGUgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlRlcm0gRGVmaW5pdGlvbjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlRlcm0gRGVmaW5pdGlvbjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZVRlcm1EZWZpbml0aW9uKFRlcm1EZWZpbml0aW9uIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Ub29sPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+VG9vbDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZVRvb2woVG9vbCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+VG9vbCBNZW50b3I8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Ub29sIE1lbnRvcjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZVRvb2xNZW50b3IoVG9vbE1lbnRvciBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+V2hpdGVwYXBlcjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPldoaXRlcGFwZXI8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VXaGl0ZXBhcGVyKFdoaXRlcGFwZXIgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPldvcmsgQnJlYWtkb3duIEVsZW1lbnQ8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Xb3JrIEJyZWFrZG93biBFbGVtZW50PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlV29ya0JyZWFrZG93bkVsZW1lbnQoV29ya0JyZWFrZG93bkVsZW1lbnQgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPldvcmsgRGVmaW5pdGlvbjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPldvcmsgRGVmaW5pdGlvbjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZVdvcmtEZWZpbml0aW9uKFdvcmtEZWZpbml0aW9uIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Xb3JrIE9yZGVyPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+V29yayBPcmRlcjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZVdvcmtPcmRlcihXb3JrT3JkZXIgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPldvcmsgUHJvZHVjdDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPldvcmsgUHJvZHVjdDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZVdvcmtQcm9kdWN0KFdvcmtQcm9kdWN0IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Xb3JrIFByb2R1Y3QgRGVzY3JpcHRpb248L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Xb3JrIFByb2R1Y3QgRGVzY3JpcHRpb248L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VXb3JrUHJvZHVjdERlc2NyaXB0aW9uKFdvcmtQcm9kdWN0RGVzY3JpcHRpb24gb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPldvcmsgUHJvZHVjdCBEZXNjcmlwdG9yPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+V29yayBQcm9kdWN0IERlc2NyaXB0b3I8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VXb3JrUHJvZHVjdERlc2NyaXB0b3IoV29ya1Byb2R1Y3REZXNjcmlwdG9yIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Xb3JrIFByb2R1Y3QgVHlwZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPldvcmsgUHJvZHVjdCBUeXBlPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlV29ya1Byb2R1Y3RUeXBlKFdvcmtQcm9kdWN0VHlwZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RU9iamVjdDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLCBidXQgdGhpcyBpcyB0aGUgbGFzdCBjYXNlIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FT2JqZWN0PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBkZWZhdWx0Q2FzZShFT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0gLy9VbWFTd2l0Y2gKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS91dGlsL1VtYVhNTFByb2Nlc3Nvci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL3V0aWwvVW1hWE1MUHJvY2Vzc29yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzNDA0ZmYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL3V0aWwvVW1hWE1MUHJvY2Vzc29yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFVtYVhNTFByb2Nlc3Nvci5qYXZhLHYgMS4yIDIwMDgvMDEvMzAgMDA6NDE6NDgga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLnV0aWwuWE1MUHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBjb250YWlucyBoZWxwZXIgbWV0aG9kcyB0byBzZXJpYWxpemUgYW5kIGRlc2VyaWFsaXplIFhNTCBkb2N1bWVudHMKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFVtYVhNTFByb2Nlc3NvciBleHRlbmRzIFhNTFByb2Nlc3NvciB7Ci0JLyoqCi0JICogUHVibGljIGNvbnN0cnVjdG9yIHRvIGluc3RhbnRpYXRlIHRoZSBoZWxwZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFVtYVhNTFByb2Nlc3NvcigpIHsKLQkJc3VwZXIoKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFKSk7Ci0JCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmVDbGFzcygpOwotCX0KLQkKLQkvKioKLQkgKiBSZWdpc3RlciBmb3IgIioiIGFuZCAieG1sIiBmaWxlIGV4dGVuc2lvbnMgdGhlIFVtYVJlc291cmNlRmFjdG9yeUltcGwgZmFjdG9yeS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgTWFwPFN0cmluZywgUmVzb3VyY2UuRmFjdG9yeT4gZ2V0UmVnaXN0cmF0aW9ucygpIHsKLQkJaWYgKHJlZ2lzdHJhdGlvbnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UmVnaXN0cmF0aW9ucygpOwotCQkJcmVnaXN0cmF0aW9ucy5wdXQoWE1MX0VYVEVOU0lPTiwgbmV3IFVtYVJlc291cmNlRmFjdG9yeUltcGwoKSk7Ci0JCQlyZWdpc3RyYXRpb25zLnB1dChTVEFSX0VYVEVOU0lPTiwgbmV3IFVtYVJlc291cmNlRmFjdG9yeUltcGwoKSk7Ci0JCX0KLQkJcmV0dXJuIHJlZ2lzdHJhdGlvbnM7Ci0JfQotCi19IC8vVW1hWE1MUHJvY2Vzc29yCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvdXRpbC9VbWFYTUxTYXZlSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL3V0aWwvVW1hWE1MU2F2ZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzJkOTYyZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvdXRpbC9VbWFYTUxTYXZlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLlhNTEhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLmltcGwuWE1MU2F2ZUltcGw7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBjdXN0b21pemUgdGhlIFhNTFNhdmVJbXBsIHRvIHNhdmUgdGhlIHN0cmluZyB0YWdzIGFzIENEQVRBCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKgotICovCi1wdWJsaWMgY2xhc3MgVW1hWE1MU2F2ZUltcGwgZXh0ZW5kcyBYTUxTYXZlSW1wbCB7Ci0KLQlwdWJsaWMgc3RhdGljIExpc3QgY2RhdGFGZWF0dXJlTmFtZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0Jc3RhdGljIHsKLQkJCi0JCWNkYXRhRmVhdHVyZU5hbWVzLmFkZCgiYWx0ZXJuYXRpdmVzIik7Ci0JCWNkYXRhRmVhdHVyZU5hbWVzLmFkZCgibWFpbkRlc2NyaXB0aW9uIik7Ci0JCWNkYXRhRmVhdHVyZU5hbWVzLmFkZCgiaG93VG9TdGFmZiIpOwotCQljZGF0YUZlYXR1cmVOYW1lcy5hZGQoImtleUNvbnNpZGVyYXRpb25zIik7Ci0JCWNkYXRhRmVhdHVyZU5hbWVzLmFkZCgicHVycG9zZSIpOwkKLQkJY2RhdGFGZWF0dXJlTmFtZXMuYWRkKCJzY29wZSIpOwkJCQkJLy8gUHJvY2Vzc0Rlc2NyaXB0aW9uCi0JCWNkYXRhRmVhdHVyZU5hbWVzLmFkZCgidXNhZ2VOb3RlcyIpOwkJCS8vIFByb2Nlc3NEZXNjcmlwdGlvbgotCX0KLQkKLQlwcml2YXRlIGJvb2xlYW4gaXNDREFUQUZlYXR1cmUoRVN0cnVjdHVyYWxGZWF0dXJlIGYsIGJvb2xlYW4gaXNBdHRyaWJ1dGUpIHsKLQkJCi0JCWlmICggaXNBdHRyaWJ1dGUgKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJCi0vLwkJaWYgKCBmID09IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbnRlbnREZXNjcmlwdGlvbl9LZXlDb25zaWRlcmF0aW9ucygpIAotLy8JCQl8fCBmID09IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbnRlbnREZXNjcmlwdGlvbl9NYWluRGVzY3JpcHRpb24oKQotLy8JCQl8fCBmID09IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFNlY3Rpb25fRGVzY3JpcHRpb24oKQotLy8JCSkgewotLy8JCQlTeXN0ZW0ub3V0LnByaW50bG4oInRlc3QiKTsKLS8vCQl9Ci0JCQotCQlyZXR1cm4gY2RhdGFGZWF0dXJlTmFtZXMuY29udGFpbnMoZi5nZXROYW1lKCkpOwotCX0KLQkKLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gaGVscGVyCi0JICovCi0JcHVibGljIFVtYVhNTFNhdmVJbXBsKFhNTEhlbHBlciBoZWxwZXIpIHsKLQkJc3VwZXIoaGVscGVyKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gb3B0aW9ucyBNYXAKLQkgKiBAcGFyYW0gaGVscGVyIFhNTEhlbHBlcgotCSAqIEBwYXJhbSBlbmNvZGluZyBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgVW1hWE1MU2F2ZUltcGwoTWFwIG9wdGlvbnMsIFhNTEhlbHBlciBoZWxwZXIsIFN0cmluZyBlbmNvZGluZykgewotCQlzdXBlcihvcHRpb25zLCBoZWxwZXIsIGVuY29kaW5nKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERhdGF0eXBlVmFsdWUoT2JqZWN0IHZhbHVlLCBFU3RydWN0dXJhbEZlYXR1cmUgZiwKLQkJCWJvb2xlYW4gaXNBdHRyaWJ1dGUpIHsJCi0JCQotCQlpZiAoIHZhbHVlID09IG51bGwgfHwgdmFsdWUudG9TdHJpbmcoKS5lcXVhbHMoIiIpICkgewotCQkJcmV0dXJuICIiOwotCQl9CQkJCQotCQkKLQkJaWYgKCBpc0NEQVRBRmVhdHVyZShmLCBpc0F0dHJpYnV0ZSkgKSB7Ci0JCQlTdHJpbmcgc3RyID0gdmFsdWUudG9TdHJpbmcoKTsKLQkJCVN0cmluZyByZXBsYWNlZCA9ICJdXT4iOwkJCQkJCQkJLy8kTk9OLU5MUy0xJAotCQkJaWYgKHN0ciAhPSBudWxsICYmIHN0ci5pbmRleE9mKHJlcGxhY2VkKSA+PSAwKSB7Ci0JCQkJc3RyID0gc3RyLnJlcGxhY2VBbGwocmVwbGFjZWQsICJdXV1dPjwhW0NEQVRBWz4iICk7CS8vJE5PTi1OTFMtMSQJLy8xNzUzOTUKLQkJCX0KLQkJCXJldHVybiAiPCFbQ0RBVEFbIiArIHN0ciArICJdXT4iOwotCQl9Ci0JCQotCQlyZXR1cm4gc3VwZXIuZ2V0RGF0YXR5cGVWYWx1ZSh2YWx1ZSwgZiwgaXNBdHRyaWJ1dGUpOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS91dGlsL3BhY2thZ2UuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS91dGlsL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmU1OWZjYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvdXRpbC9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyBpbXBsZW1lbnRhdGlvbiBzdXBwb3J0IGZvciBhY2Nlc3NpbmcgdGhlIFhNTCBVTUEgbW9kZWwgb2JqZWN0cy4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi50ZXN0cy8uY2xhc3NwYXRoIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5jb21tb24udGVzdHMvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzUxYzhmMi4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi50ZXN0cy8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5jb21tb24udGVzdHMvLnByb2plY3QgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi50ZXN0cy8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTU0ZTU5ZS4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi50ZXN0cy8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmVwZi5jb21tb24udGVzdHM8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5jb21tb24udGVzdHMvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi50ZXN0cy9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjY0NTg2OS4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi50ZXN0cy9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6IEVQRiBDb21tb24gVGVzdHMgUGx1Zy1pbgotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi50ZXN0cwotQnVuZGxlLVZlcnNpb246IDEuNS4wLnF1YWxpZmllcgotQnVuZGxlLVZlbmRvcjogRWNsaXBzZS5vcmcKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotUmVxdWlyZS1CdW5kbGU6IG9yZy5qdW5pdCwKLSBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnNlcnZpY2UKLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnRlc3RzCmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi50ZXN0cy9idWlsZC5wcm9wZXJ0aWVzIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5jb21tb24udGVzdHMvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzRkMmU0ZC4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi50ZXN0cy9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi1zb3VyY2UuLiA9IHNyYy8KLW91dHB1dC4uID0gYmluLwotYmluLmluY2x1ZGVzID0gTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIC4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3Rlc3RzL0NvbW1vblRlc3RzLmphdmEgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi90ZXN0cy9Db21tb25UZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNzk5NzIwLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3Rlc3RzL0NvbW1vblRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnRlc3RzOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotLyoqCi0gKiBKVW5pdCB0ZXN0IHN1aXRlIGZvciBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIENvbW1vblRlc3RzIHsKLQotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZShDb21tb25UZXN0cy5jbGFzcy5nZXRQYWNrYWdlKCkuZ2V0TmFtZSgpKTsKLQkJLy8kSlVuaXQtQkVHSU4kCi0JCXN1aXRlLmFkZFRlc3RTdWl0ZShTdHJVdGlsVGVzdC5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShYTUxVdGlsVGVzdC5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShWZXJzaW9uVXRpbFRlc3QuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoRVBGVmVyc2lvbnNUZXN0LmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEVQRlZlcnNpb25UZXN0LmNsYXNzKTsKLQkJLy8kSlVuaXQtRU5EJAotCQlyZXR1cm4gc3VpdGU7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi90ZXN0cy9FUEZWZXJzaW9uVGVzdC5qYXZhIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5jb21tb24udGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vdGVzdHMvRVBGVmVyc2lvblRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDI0ZDJhZS4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi90ZXN0cy9FUEZWZXJzaW9uVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnRlc3RzOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5zZXJ2aWNlLnZlcnNpb25pbmcuRVBGVmVyc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnNlcnZpY2UudmVyc2lvbmluZy5FUEZWZXJzaW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnNlcnZpY2UudmVyc2lvbmluZy5WZXJzaW9uVXRpbDsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuVmVyc2lvbjsKLQotcHVibGljIGNsYXNzIEVQRlZlcnNpb25UZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCi0JcHVibGljIEVQRlZlcnNpb25UZXN0KFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRUb29sVmVyc2lvbigpIHsKLQkJRVBGVmVyc2lvbiB2ZXJzaW9uID0gVmVyc2lvblV0aWwuZ2V0VmVyc2lvbnMoRVBGVmVyc2lvbnMuVE9PTF9JRCkuZ2V0Q3VycmVudFZlcnNpb24oKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBWZXJzaW9uKCIxLjIiKSx2ZXJzaW9uLmdldFRvb2xWZXJzaW9uKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRMaWJyYXJ5VmVyc2lvbigpIHsKLQkJRVBGVmVyc2lvbiB2ZXJzaW9uID0gVmVyc2lvblV0aWwuZ2V0VmVyc2lvbnMoRVBGVmVyc2lvbnMuVE9PTF9JRCkuZ2V0Q3VycmVudFZlcnNpb24oKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBWZXJzaW9uKCIxLjAuNC4xIiksdmVyc2lvbi5nZXRMaWJyYXJ5VmVyc2lvbigpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0WE1MU2NoZW1hVmVyc2lvbigpIHsKLQkJRVBGVmVyc2lvbiB2ZXJzaW9uID0gVmVyc2lvblV0aWwuZ2V0VmVyc2lvbnMoRVBGVmVyc2lvbnMuVE9PTF9JRCkuZ2V0Q3VycmVudFZlcnNpb24oKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBWZXJzaW9uKCIxLjAuMSIpLHZlcnNpb24uZ2V0WE1MU2NoZW1hVmVyc2lvbigpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29tcGFyZVRvb2xWZXJzaW9uVG8oKSB7Ci0JCUVQRlZlcnNpb24gdmVyc2lvbiA9IFZlcnNpb25VdGlsLmdldFZlcnNpb25zKEVQRlZlcnNpb25zLlRPT0xfSUQpLmdldEN1cnJlbnRWZXJzaW9uKCk7Ci0JCWFzc2VydFRydWUodmVyc2lvbi5jb21wYXJlVG9vbFZlcnNpb25UbyhuZXcgVmVyc2lvbigiMS4yIikpID09IDApOwotCQlhc3NlcnRUcnVlKHZlcnNpb24uY29tcGFyZVRvb2xWZXJzaW9uVG8obmV3IFZlcnNpb24oIjEuMyIpKSA8IDApOwotCQlhc3NlcnRUcnVlKHZlcnNpb24uY29tcGFyZVRvb2xWZXJzaW9uVG8obmV3IFZlcnNpb24oIjAuOSIpKSA+IDApOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb21wYXJlTGlicmFyeVZlcnNpb25UbygpIHsKLQkJRVBGVmVyc2lvbiB2ZXJzaW9uID0gVmVyc2lvblV0aWwuZ2V0VmVyc2lvbnMoRVBGVmVyc2lvbnMuVE9PTF9JRCkuZ2V0Q3VycmVudFZlcnNpb24oKTsKLQkJYXNzZXJ0VHJ1ZSh2ZXJzaW9uLmNvbXBhcmVMaWJyYXJ5VmVyc2lvblRvKG5ldyBWZXJzaW9uKCIxLjAuNC4xIikpID09IDApOwotCQlhc3NlcnRUcnVlKHZlcnNpb24uY29tcGFyZUxpYnJhcnlWZXJzaW9uVG8obmV3IFZlcnNpb24oIjEuMC40LjIiKSkgPCAwKTsKLQkJYXNzZXJ0VHJ1ZSh2ZXJzaW9uLmNvbXBhcmVMaWJyYXJ5VmVyc2lvblRvKG5ldyBWZXJzaW9uKCIxLjAuMi4wIikpID4gMCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbXBhcmVYTUxTY2hlbWFWZXJzaW9uVG8oKSB7Ci0JCUVQRlZlcnNpb24gdmVyc2lvbiA9IFZlcnNpb25VdGlsLmdldFZlcnNpb25zKEVQRlZlcnNpb25zLlRPT0xfSUQpLmdldEN1cnJlbnRWZXJzaW9uKCk7Ci0JCWFzc2VydFRydWUodmVyc2lvbi5jb21wYXJlWE1MU2NoZW1hVmVyc2lvblRvKG5ldyBWZXJzaW9uKCIxLjAuMSIpKSA9PSAwKTsKLQkJYXNzZXJ0VHJ1ZSh2ZXJzaW9uLmNvbXBhcmVYTUxTY2hlbWFWZXJzaW9uVG8obmV3IFZlcnNpb24oIjEuMC4yIikpIDwgMCk7Ci0JCWFzc2VydFRydWUodmVyc2lvbi5jb21wYXJlWE1MU2NoZW1hVmVyc2lvblRvKG5ldyBWZXJzaW9uKCIwLjkuOSIpKSA+IDApOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5jb21tb24udGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vdGVzdHMvRVBGVmVyc2lvbnNUZXN0LmphdmEgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi90ZXN0cy9FUEZWZXJzaW9uc1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjUyZWZlZi4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi90ZXN0cy9FUEZWZXJzaW9uc1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi50ZXN0czsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnNlcnZpY2UudmVyc2lvbmluZy5FUEZWZXJzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24uc2VydmljZS52ZXJzaW9uaW5nLkVQRlZlcnNpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24uc2VydmljZS52ZXJzaW9uaW5nLlZlcnNpb25VdGlsOwotCi1wdWJsaWMgY2xhc3MgRVBGVmVyc2lvbnNUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCi0JcHVibGljIEVQRlZlcnNpb25zVGVzdChTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0Q3VycmVudFZlcnNpb24oKSB7Ci0JCUVQRlZlcnNpb25zIHZlcnNpb25zID0gKEVQRlZlcnNpb25zKVZlcnNpb25VdGlsLmdldFZlcnNpb25zKEVQRlZlcnNpb25zLlRPT0xfSUQpOwotCQlhc3NlcnRFcXVhbHMobmV3IEVQRlZlcnNpb24oIjEuMiIsIjEuMC40LjEiLCIxLjAuMSIpLCB2ZXJzaW9ucy5nZXRDdXJyZW50VmVyc2lvbigpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0VmVyc2lvbigpIHsKLQkJRVBGVmVyc2lvbnMgdmVyc2lvbnMgPSAoRVBGVmVyc2lvbnMpVmVyc2lvblV0aWwuZ2V0VmVyc2lvbnMoRVBGVmVyc2lvbnMuVE9PTF9JRCk7Ci0JCWFzc2VydEVxdWFscyhuZXcgRVBGVmVyc2lvbigiMS4wIiwiMS4wLjMuMCIsIjEuMC4wIiksIHZlcnNpb25zLmdldFZlcnNpb24oIjEuMCIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0QWxsVmVyc2lvbnMoKSB7Ci0JCUVQRlZlcnNpb25zIHZlcnNpb25zID0gKEVQRlZlcnNpb25zKVZlcnNpb25VdGlsLmdldFZlcnNpb25zKEVQRlZlcnNpb25zLlRPT0xfSUQpOwotCQlMaXN0IGV4cGVjdGVkTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZXhwZWN0ZWRMaXN0LmFkZChuZXcgRVBGVmVyc2lvbigiMS4wIiwiMS4wLjMuMCIsIjEuMC4wIikpOwotCQlleHBlY3RlZExpc3QuYWRkKG5ldyBFUEZWZXJzaW9uKCIxLjEiLCIxLjAuNC4wIiwiMS4wLjAiKSk7Ci0JCWV4cGVjdGVkTGlzdC5hZGQobmV3IEVQRlZlcnNpb24oIjEuMiIsIjEuMC40LjEiLCIxLjAuMSIpKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkTGlzdCwgdmVyc2lvbnMuZ2V0QWxsVmVyc2lvbnMoKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi90ZXN0cy9TdHJVdGlsVGVzdC5qYXZhIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5jb21tb24udGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vdGVzdHMvU3RyVXRpbFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTYwYTQ0ZC4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi90ZXN0cy9TdHJVdGlsVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi50ZXN0czsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuU3RyVXRpbDsKLQotLyoqCi0gKiBKVW5pdCB0ZXN0cyBmb3IgdGhlIG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuU3RyVXRpbCBjbGFzc2VzLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFN0clV0aWxUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFN0clV0aWxUZXN0KFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCS8qKgotCSAqIFRlc3RzIHRoZSBTdHJVdGlsLmlzTnVsbCgpIG1ldGhvZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0SXNOdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JICAgIGFzc2VydFRydWUoU3RyVXRpbC5pc051bGwobnVsbCkpOwotCSAgICBhc3NlcnRUcnVlKFN0clV0aWwuaXNOdWxsKCIiKSk7Ci0JICAgIGFzc2VydEZhbHNlKFN0clV0aWwuaXNOdWxsKCJIZWxsbyIpKTsJICAgIAotCX0KLQkKLQkvKioKLQkgKiBUZXN0cyB0aGUgU3RyVXRpbC5pc0JsYW5rKCkgbWV0aG9kLgotCSAqLwkKLQlwdWJsaWMgdm9pZCB0ZXN0SXNCbGFuaygpIHRocm93cyBFeGNlcHRpb24gewotCSAgICBhc3NlcnRUcnVlKFN0clV0aWwuaXNCbGFuayhudWxsKSk7Ci0JICAgIGFzc2VydFRydWUoU3RyVXRpbC5pc0JsYW5rKCIiKSk7Ci0JICAgIGFzc2VydEZhbHNlKFN0clV0aWwuaXNCbGFuaygiSGVsbG8iKSk7CSAgICAKLQl9CQotCQotfQpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5jb21tb24udGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vdGVzdHMvVmVyc2lvblV0aWxUZXN0LmphdmEgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi90ZXN0cy9WZXJzaW9uVXRpbFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGE5YTAwOC4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi90ZXN0cy9WZXJzaW9uVXRpbFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzOSArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5jb21tb24udGVzdHM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5zZXJ2aWNlLnZlcnNpb25pbmcuRVBGVmVyc2lvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5zZXJ2aWNlLnZlcnNpb25pbmcuVmVyc2lvblV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5GaWxlVXRpbDsKLQotcHVibGljIGNsYXNzIFZlcnNpb25VdGlsVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQotCXB1YmxpYyBWZXJzaW9uVXRpbFRlc3QoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldEFsbFRvb2xJRHMoKSB7Ci0JCVNldCB0b29sSURzID0gVmVyc2lvblV0aWwuZ2V0QWxsVG9vbElEcygpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB0b29sSURzLml0ZXJhdG9yKCk7aXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlTdHJpbmcgdG9vbElEID0gKFN0cmluZylpdGVyLm5leHQoKTsKLQkJCWFzc2VydFRydWUodG9vbElELmVxdWFscygiZXBmIikgfHwgdG9vbElELmVxdWFscygicm1jIikpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldFZlcnNpb25zKCkgewotCQlFUEZWZXJzaW9ucyB2ZXJzaW9ucyA9IFZlcnNpb25VdGlsLmdldFZlcnNpb25zKEVQRlZlcnNpb25zLlRPT0xfSUQpOwotCQlhc3NlcnROb3ROdWxsKHZlcnNpb25zKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SXNWZXJzaW9uQ2hlY2tpbmdEaXNhYmxlZCgpIHsKLQkJYXNzZXJ0RmFsc2UoVmVyc2lvblV0aWwuaXNWZXJzaW9uQ2hlY2tpbmdEaXNhYmxlZCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFJlYWRWZXJzaW9uc0Zyb21GaWxlKCkgewotCQkvLyB0ZXN0IG5vLXZlcnNpb25zLWluLWZpbGUgY2FzZQotCQlGaWxlIHhtaUZpbGUgPSBjcmVhdGVUZXN0WE1JRmlsZSgiIik7Ci0JCWlmICh4bWlGaWxlID09IG51bGwpIHsKLQkJCWZhaWwoKTsKLQkJfQotCQlNYXAgdmVyc2lvbnMgPSBWZXJzaW9uVXRpbC5yZWFkVmVyc2lvbnNGcm9tRmlsZSh4bWlGaWxlKTsKLQkJYXNzZXJ0TnVsbCh2ZXJzaW9ucyk7Ci0JCXhtaUZpbGUuZGVsZXRlKCk7Ci0JCi0JCS8vIHRlc3QgZXBmLW9ubHkgY2FzZQotCQl4bWlGaWxlID0gY3JlYXRlVGVzdFhNSUZpbGUoImVwZjp2ZXJzaW9uPVwiMS4wLjBcIiIpOwotCQlpZiAoeG1pRmlsZSA9PSBudWxsKSB7Ci0JCQlmYWlsKCk7Ci0JCX0KLQkJdmVyc2lvbnMgPSBWZXJzaW9uVXRpbC5yZWFkVmVyc2lvbnNGcm9tRmlsZSh4bWlGaWxlKTsKLQkJU3RyaW5nIGVwZlZlciA9IChTdHJpbmcpdmVyc2lvbnMuZ2V0KCJlcGYiKTsKLQkJYXNzZXJ0VHJ1ZShlcGZWZXIuZXF1YWxzKCIxLjAuMCIpKTsKLQkJeG1pRmlsZS5kZWxldGUoKTsKLQkKLQkJLy8gdGVzdCBtdWx0aXBsZSB2ZXJzaW9ucyBjYXNlCi0JCXhtaUZpbGUgPSBjcmVhdGVUZXN0WE1JRmlsZSgiZXBmOnZlcnNpb249XCIxLjAuMFwiIHJtYzp2ZXJzaW9uPVwiNy4xLjBcIiIpOwotCQlpZiAoeG1pRmlsZSA9PSBudWxsKSB7Ci0JCQlmYWlsKCk7Ci0JCX0KLQkJdmVyc2lvbnMgPSBWZXJzaW9uVXRpbC5yZWFkVmVyc2lvbnNGcm9tRmlsZSh4bWlGaWxlKTsKLQkJZXBmVmVyID0gKFN0cmluZyl2ZXJzaW9ucy5nZXQoImVwZiIpOwotCQlTdHJpbmcgcm1jVmVyID0gKFN0cmluZyl2ZXJzaW9ucy5nZXQoInJtYyIpOwotCQlhc3NlcnRUcnVlKGVwZlZlci5lcXVhbHMoIjEuMC4wIikpOwotCQlhc3NlcnRUcnVlKHJtY1Zlci5lcXVhbHMoIjcuMS4wIikpOwotCQl4bWlGaWxlLmRlbGV0ZSgpOwotCQkKLQkJLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQkJLy8gdGVzdCBYTUwgZmlsZQotCQkvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCQkvLyB0ZXN0IG5vLXZlcnNpb25zLWluLWZpbGUgY2FzZQotCQlGaWxlIHhtbEZpbGUgPSBjcmVhdGVUZXN0WE1MRmlsZSgiIik7Ci0JCWlmICh4bWxGaWxlID09IG51bGwpIHsKLQkJCWZhaWwoKTsKLQkJfQotCQl2ZXJzaW9ucyA9IFZlcnNpb25VdGlsLnJlYWRWZXJzaW9uc0Zyb21GaWxlKHhtbEZpbGUpOwotCQlhc3NlcnROdWxsKHZlcnNpb25zKTsKLQkJeG1sRmlsZS5kZWxldGUoKTsKLQkKLQkJLy8gdGVzdCBlcGYtb25seSBjYXNlCi0JCXhtbEZpbGUgPSBjcmVhdGVUZXN0WE1MRmlsZSgidG9vbD1cImVwZj0xLjAuMFwiIik7Ci0JCWlmICh4bWxGaWxlID09IG51bGwpIHsKLQkJCWZhaWwoKTsKLQkJfQotCQl2ZXJzaW9ucyA9IFZlcnNpb25VdGlsLnJlYWRWZXJzaW9uc0Zyb21GaWxlKHhtbEZpbGUpOwotCQllcGZWZXIgPSAoU3RyaW5nKXZlcnNpb25zLmdldCgiZXBmIik7Ci0JCWFzc2VydFRydWUoZXBmVmVyLmVxdWFscygiMS4wLjAiKSk7Ci0JCXhtbEZpbGUuZGVsZXRlKCk7Ci0JCi0JCS8vIHRlc3QgbXVsdGlwbGUgdmVyc2lvbnMgY2FzZQotCQl4bWxGaWxlID0gY3JlYXRlVGVzdFhNTEZpbGUoInRvb2w9XCJlcGY9MS4wLjA7cm1jPTcuMS4wXCIiKTsKLQkJaWYgKHhtbEZpbGUgPT0gbnVsbCkgewotCQkJZmFpbCgpOwotCQl9Ci0JCXZlcnNpb25zID0gVmVyc2lvblV0aWwucmVhZFZlcnNpb25zRnJvbUZpbGUoeG1sRmlsZSk7Ci0JCWVwZlZlciA9IChTdHJpbmcpdmVyc2lvbnMuZ2V0KCJlcGYiKTsKLQkJcm1jVmVyID0gKFN0cmluZyl2ZXJzaW9ucy5nZXQoInJtYyIpOwotCQlhc3NlcnRUcnVlKGVwZlZlci5lcXVhbHMoIjEuMC4wIikpOwotCQlhc3NlcnRUcnVlKHJtY1Zlci5lcXVhbHMoIjcuMS4wIikpOwotCQl4bWxGaWxlLmRlbGV0ZSgpOwotCX0KLQkKLQlwcml2YXRlIEZpbGUgY3JlYXRlVGVzdFhNSUZpbGUoU3RyaW5nIHZlcnNpb25BdHRyaWJ1dGVzKSB7Ci0JCXRyeSB7Ci0JCQlGaWxlIHhtaUZpbGUgPSBGaWxlLmNyZWF0ZVRlbXBGaWxlKCJFUEZfSlVOSVRfIiwgIi54bWkiKTsKLQkJCVN0cmluZyB4bWlUZXh0ID0gIjw/eG1sIHZlcnNpb249XCIxLjBcIiBlbmNvZGluZz1cIlVURi04XCI/PiIgKwotCQkJICAgICJcbjx4bWk6WE1JIHhtaTp2ZXJzaW9uPVwiMi4wXCIgeG1sbnM6eG1pPVwiaHR0cDovL3d3dy5vbWcub3JnL1hNSVwiIiArCi0JCQkgICAgIiB4bWxuczp4c2k9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZVwiIiArCi0JCQkgICAgIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPVwiaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC4zL3VtYS5lY29yZVwiIiArIAotCQkJICAgICIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYS5yZXNvdXJjZW1hbmFnZXI9XCJodHRwOi8vL29yZy9lY2xpcHNlL2VwZi91bWEvcmVzb3VyY2VtYW5hZ2VyLmVjb3JlXCIgIiArIAotCQkJICAgIHZlcnNpb25BdHRyaWJ1dGVzICsgIj5cbi4uLlxuPC94bWk6WE1JPlxuIjsKLQkJCUZpbGVVdGlsLndyaXRlVVRGOEZpbGUoeG1pRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSwgeG1pVGV4dCk7Ci0JCQlyZXR1cm4geG1pRmlsZTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBGaWxlIGNyZWF0ZVRlc3RYTUxGaWxlKFN0cmluZyB2ZXJzaW9uQXR0cmlidXRlcykgewotCQl0cnkgewotCQkJRmlsZSB4bWxGaWxlID0gRmlsZS5jcmVhdGVUZW1wRmlsZSgiRVBGX0pVTklUXyIsICIueG1sIik7Ci0JCQlTdHJpbmcgeG1sVGV4dCA9ICI8P3htbCB2ZXJzaW9uPVwiMS4wXCIgZW5jb2Rpbmc9XCJVVEYtOFwiPz4iICsKLQkJCQkiXG48dW1hOk1ldGhvZExpYnJhcnkgeG1sbnM6eHNpPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2VcIiIgKwotCQkJCSJ4bWxuczp1bWE9XCJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjNcIiAiICsKLQkJCQl2ZXJzaW9uQXR0cmlidXRlcyArCi0JCQkJIiBuYW1lPVwiYVwiIGJyaWVmRGVzY3JpcHRpb249XCJcIiBpZD1cIl9IVm5HOERMNUVkdTQyTjBYUzdvblVnXCIiICsKLQkJCQkib3JkZXJpbmdHdWlkZT1cIlwiIHN1cHByZXNzZWQ9XCJmYWxzZVwiIGF1dGhvcnM9XCJcIiBjaGFuZ2VEZXNjcmlwdGlvbj1cIlwiIHZlcnNpb249XCJcIj4iICsKLQkJCQkiXG4uLi5cbjwvdW1hOk1ldGhvZExpYnJhcnk+IjsKLQkJCUZpbGVVdGlsLndyaXRlVVRGOEZpbGUoeG1sRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSwgeG1sVGV4dCk7Ci0JCQlyZXR1cm4geG1sRmlsZTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JCi19CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi90ZXN0cy9YTUxVdGlsVGVzdC5qYXZhIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5jb21tb24udGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vdGVzdHMvWE1MVXRpbFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzljZjJjMi4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi90ZXN0cy9YTUxVdGlsVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi50ZXN0czsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuWE1MVXRpbDsKLQotLyoqCi0gKiBKVW5pdCB0ZXN0cyBmb3Igb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5YTUxVdGlsLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFhNTFV0aWxUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFhNTFV0aWxUZXN0KFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQkvKioKLQkgKiBUZXN0cyB0aGUgWE1MVXRpbC5lc2NhcGVBdHRyKCkgbWV0aG9kLgotCSAqLwkKLQlwdWJsaWMgdm9pZCB0ZXN0RXNjYXBlQXR0cigpIHRocm93cyBFeGNlcHRpb24gewotCSAgICBTdHJpbmcgcmVzdWx0ID0gWE1MVXRpbC5lc2NhcGUoIjxiPkhlbGxvPC9iPiIpOwotCSAgICBhc3NlcnRUcnVlKHJlc3VsdC5lcXVhbHMoIiZsdDtiJmd0O0hlbGxvJmx0Oy9iJmd0OyIpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS50ZXN0cy8uY2xhc3NwYXRoIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLnRlc3RzLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1MWM4ZjIuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLnRlc3RzLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0udGVzdHMvLnByb2plY3QgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0udGVzdHMvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiZGI4OTYuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLnRlc3RzLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0udGVzdHM8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLnRlc3RzL01FVEEtSU5GL01BTklGRVNULk1GIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLnRlc3RzL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YTcyZmQwLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS50ZXN0cy9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6IEVQRiBEaWFncmFtIFRlc3RzCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS50ZXN0cwotQnVuZGxlLVZlcnNpb246IDEuNS4wLnF1YWxpZmllcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0udGVzdHMuRGlhZ3JhbVRlc3RQbHVnaW4KLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLnVpLAotIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZSwKLSBvcmcuanVuaXQsCi0gb3JnLmVjbGlwc2UuZXBmLmNvbW1vbiwKLSBvcmcuZWNsaXBzZS5lcGYudW1hLAotIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LAotIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaSwKLSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cywKLSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLAotIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLAotIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLnVpLAotIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWksCi0gb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aQotRWNsaXBzZS1MYXp5U3RhcnQ6IHRydWUKZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS50ZXN0cy9idWlsZC5wcm9wZXJ0aWVzIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLnRlc3RzL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0ZDJlNGQuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLnRlc3RzL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLXNvdXJjZS4uID0gc3JjLwotb3V0cHV0Li4gPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgLgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS90ZXN0cy9EaWFncmFtVGVzdENhc2UuamF2YSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vdGVzdHMvRGlhZ3JhbVRlc3RDYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzNDcxYTMuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS90ZXN0cy9EaWFncmFtVGVzdENhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0udGVzdHM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzLkxpYnJhcnlUZXN0SGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLQotLyoqCi0qIFRoZSBhYnN0cmFjdCBiYXNlIGNsYXNzIGZvciBhbGwgRGlhZ3JhbSBKVW5pdCB0ZXN0IGNhc2VzLgotKiAKLSogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSogQHNpbmNlIDEuMgotKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBEaWFncmFtVGVzdENhc2UgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQlwcm90ZWN0ZWQgTWV0aG9kTGlicmFyeSBsaWJyYXJ5OwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gZGVsZXRlTGlicmFyeU9uRXhpdCA9IGZhbHNlOwotCi0JcHVibGljIERpYWdyYW1UZXN0Q2FzZShTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2Ujc2V0VXAoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCQotCQlMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVUZXN0TWV0aG9kTGlicmFyeSgpOwotCQkKLQkJLy8gYWN0aXZhdGUgdGhlIEF1dGhvcmluZyBwbHVnaW5zIHRvIGluaXRpYWxpemUgc29tZXRoaW5nCi0JCS8vIHRoZSByZWFzb24gdG8gcHV0IGl0IGFmdGVyIHRoZSBsaWJyYXJ5IGlzIGNyZWF0ZWQgaXMgdG8gYXZvaWQgdGhlIE9wZW4gTGlicmFyeSBkaWFsb2cKLQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpOwotCi0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3RlYXJEb3duKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci50ZWFyRG93bigpOwotCQkKLQkJTGlicmFyeVRlc3RIZWxwZXIuY2xvc2VMaWJyYXJ5KCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0udGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3Rlc3RzL0RpYWdyYW1UZXN0UGx1Z2luLmphdmEgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0udGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3Rlc3RzL0RpYWdyYW1UZXN0UGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiZDQ0N2MuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS90ZXN0cy9EaWFncmFtVGVzdFBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy9BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vL2FyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy93aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy9odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vQ29udHJpYnV0b3JzOgotLy9JQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS50ZXN0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udWkuQWJzdHJhY3RQbHVnaW47Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0KLS8qKgotKiBUaGUgVGVzdHMgcGx1Zy1pbiBjbGFzcy4KLSogCi0qIEBhdXRob3IJU2hpbHBhIFRvcmFza2FyCi0qIEBzaW5jZQkxLjIKLSovCi1wdWJsaWMgY2xhc3MgRGlhZ3JhbVRlc3RQbHVnaW4gZXh0ZW5kcyBBYnN0cmFjdFBsdWdpbiB7Ci0KLQkvLyBUaGUgcGx1Zy1pbiBJRC4KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgPSBEaWFncmFtVGVzdFBsdWdpbi5jbGFzcy5nZXROYW1lKCk7Ci0JCi0JLy8gVGhlIHNoYXJlZCBwbHVnLWluIGluc3RhbmNlLgotCXByaXZhdGUgc3RhdGljIERpYWdyYW1UZXN0UGx1Z2luIHBsdWdpbjsKLQkKLQkvKioKLQkgKiBEZWZhdWx0IGNvbnN0cnVjdG9yLgotCSAqLwotCXB1YmxpYyBEaWFncmFtVGVzdFBsdWdpbigpIHsKLQkJc3VwZXIoKTsKLQkJcGx1Z2luID0gdGhpczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgdXBvbiBwbHVnLWluIGFjdGl2YXRpb24uCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmNvcmUucGx1Z2luLkFic3RyYWN0UGx1Z2luI3N0YXJ0KEJ1bmRsZUNvbnRleHQpCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RhcnQoY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoZW4gdGhlIHBsdWctaW4gaXMgc3RvcHBlZC4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuY29yZS5wbHVnaW4uQWJzdHJhY3RQbHVnaW4jc3RhcnQoQnVuZGxlQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0b3AoY29udGV4dCk7Ci0JCXBsdWdpbiA9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2hhcmVkIHBsdWctaW4gaW5zdGFuY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBEaWFncmFtVGVzdFBsdWdpbiBnZXREZWZhdWx0KCkgewotCQlyZXR1cm4gcGx1Z2luOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS90ZXN0cy9EaWFncmFtVGVzdHMuamF2YSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vdGVzdHMvRGlhZ3JhbVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5ODM4Y2MuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS90ZXN0cy9EaWFncmFtVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLnRlc3RzOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotLyoqCi0gKiBKVW5pdCB0ZXN0IHN1aXRlIGZvciBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS4KLSAqIAotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjIKLSAqLwotcHVibGljIGNsYXNzIERpYWdyYW1UZXN0cyB7Ci0KLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoRGlhZ3JhbVRlc3RzLmNsYXNzLmdldFBhY2thZ2UoKS5nZXROYW1lKCkpOwotCQkvLyRKVW5pdC1CRUdJTiQKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKERpYWdyYW1VSVNlcnZpY2VUZXN0LmNsYXNzKTsKLQkJCi0JCS8vJEpVbml0LUVORCQKLQkJcmV0dXJuIHN1aXRlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS90ZXN0cy9EaWFncmFtVUlTZXJ2aWNlVGVzdC5qYXZhIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS90ZXN0cy9EaWFncmFtVUlTZXJ2aWNlVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OTRjZWVkLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vdGVzdHMvRGlhZ3JhbVVJU2VydmljZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS50ZXN0czsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uVHJhbnNhY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5zZXJ2aWNlcy5EaWFncmFtTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS51aS5zZXJ2aWNlLkRpYWdyYW1VSVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0udWkuc2VydmljZS5JRGlhZ3JhbVVJU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy5MaWJyYXJ5VGVzdEhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ2FwYWJpbGl0eVBhdHRlcm47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFzazsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5EaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vZGU7Ci0KLS8qKgotICogSlVuaXQgdGVzdHMgZm9yIHRoZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS51aS5EaWFncmFtVUlTZXJ2aWNlIGNsYXNzZXMuCi0gKiAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4yCi0gKi8KLXB1YmxpYyBjbGFzcyBEaWFncmFtVUlTZXJ2aWNlVGVzdCBleHRlbmRzIERpYWdyYW1UZXN0Q2FzZSB7Ci0KLQlwcml2YXRlIElEaWFncmFtVUlTZXJ2aWNlIGRpYWdyYW1VSVNlcnZpY2UgPSBudWxsOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgRGlhZ3JhbVVJU2VydmljZVRlc3QoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JLyoqCi0JICogVGVzdHMgdGhlIERpYWdhbVVJU2VydmljZS5jcmVhdGVEaWFncmFtIG1ldGhvZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlRGlhZ3JhbSgpIHRocm93cyBFeGNlcHRpb24gewotCi0JCS8vIGNyZWF0ZSBtZXRob2QgcGx1Z2luCi0JCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSBMaWJyYXJ5VGVzdEhlbHBlcgotCQkJCS5jcmVhdGVNZXRob2RQbHVnaW4oIlRlc3QgUGx1Z2luIik7Ci0JCUNvbnRlbnRQYWNrYWdlIHBrZyA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZUNvbnRlbnRQYWNrYWdlKHBsdWdpbiwKLQkJCQkicDEiKTsKLQotCQkvLyBjcmVhdGUgY29uZmlndXJhdGlvbgotCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IExpYnJhcnlUZXN0SGVscGVyCi0JCQkJLmNyZWF0ZUNvbmZpZ3VyYXRpb24oIlRlc3QgQ29uZmlnIik7Ci0KLQkJLy8gY3JlYXRlIHByb2Nlc3MKLQkJQ2FwYWJpbGl0eVBhdHRlcm4gY3AxID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlQ2FwYWJpbGl0eVBhdHRlcm4oCi0JCQkJcGx1Z2luLCAiY3AxIiwgY29uZmlnKTsKLQotCQkvLyB1cGRhdGUgdGhlIGNvbmZpZ3VyYXRpb24KLQkJY29uZmlnLmdldE1ldGhvZFBsdWdpblNlbGVjdGlvbigpLmFkZChwbHVnaW4pOwotCQljb25maWcuZ2V0TWV0aG9kUGFja2FnZVNlbGVjdGlvbigpLmFkZChwa2cpOwotCQljb25maWcuZ2V0TWV0aG9kUGFja2FnZVNlbGVjdGlvbigpLmFkZCgKLQkJCQkoUHJvY2Vzc0NvbXBvbmVudCkgY3AxLmVDb250YWluZXIoKSk7Ci0KLQkJLy8gY3JlYXRlIHRhc2sKLQkJVGFzayB0YXNrMSA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZVRhc2socGtnLCAiVGFzazEiKTsKLQkJVGFzayB0YXNrMiA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZVRhc2socGtnLCAiVGFzazIiKTsKLQkJVGFza1tdIHRhc2tzID0gbmV3IFRhc2tbXSB7IHRhc2sxLCB0YXNrMiB9OwotCi0JCUFjdGl2aXR5IGFjdDEgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVBY3Rpdml0eShwbHVnaW4sIGNwMSwgIkExIiwKLQkJCQl0YXNrcyk7Ci0JCUFjdGl2aXR5IGFjdDIgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVBY3Rpdml0eShwbHVnaW4sIGNwMSwgIkEyIiwKLQkJCQl0YXNrcyk7Ci0KLQkJZGlhZ3JhbVVJU2VydmljZSA9IG5ldyBEaWFncmFtVUlTZXJ2aWNlKCk7Ci0JCURpYWdyYW1NYW5hZ2VyIG1nciA9IERpYWdyYW1NYW5hZ2VyLmdldEluc3RhbmNlKGNwMSwgdGhpcyk7Ci0JCURpYWdyYW0gZGlhZ3JhbSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlUcmFuc2FjdGlvbiB0eCA9ICBtZ3IuZ2V0RWRpdGluZ0RvbWFpbigpLnN0YXJ0VHJhbnNhY3Rpb24oZmFsc2UsCi0JCQkJCUNvbGxlY3Rpb25zLkVNUFRZX01BUCk7Ci0JCQlSZXNvdXJjZSByZXNvdXJjZSA9IG1nci5nZXRSZXNvdXJjZSgpOwotCQotCQkJZGlhZ3JhbSA9IGRpYWdyYW1VSVNlcnZpY2UuY3JlYXRlQWN0aXZpdHlEaWFncmFtKGNwMSk7Ci0JCi0JCQlOb2RlIGFjdDFOb2RlID0gZGlhZ3JhbVVJU2VydmljZS5jcmVhdGVOb2RlKGRpYWdyYW0sICBhY3QxKTsKLQkJCU5vZGUgaW5pdGlhbE5vZGUgPSBkaWFncmFtVUlTZXJ2aWNlLmNyZWF0ZU5vZGUoZGlhZ3JhbSwgSURpYWdyYW1VSVNlcnZpY2UuSU5JVElBTF9OT0RFLCAiaW5pdGlhbCIpOwotCQkJTm9kZSBhY3QyTm9kZSA9IGRpYWdyYW1VSVNlcnZpY2UuY3JlYXRlTm9kZShkaWFncmFtLCBhY3QyKTsKLQkJCU5vZGUgZGVjaXNpb25Ob2RlID0gZGlhZ3JhbVVJU2VydmljZS5jcmVhdGVOb2RlKGRpYWdyYW0sIElEaWFncmFtVUlTZXJ2aWNlLkRFQ0lTSU9OX05PREUsICJkZWNpc2lvbiIpOwotCQkJTm9kZSBlbmROb2RlID0gZGlhZ3JhbVVJU2VydmljZS5jcmVhdGVOb2RlKGRpYWdyYW0sIElEaWFncmFtVUlTZXJ2aWNlLkZJTkFMX05PREUsICJlbmQiKTsKLQkJCQotCQkJZGlhZ3JhbVVJU2VydmljZS5jcmVhdGVFZGdlKGRpYWdyYW0sIGluaXRpYWxOb2RlLCBhY3QxTm9kZSwgImxpbmsxIik7Ci0JCQlkaWFncmFtVUlTZXJ2aWNlLmNyZWF0ZUVkZ2UoZGlhZ3JhbSwgYWN0MU5vZGUsIGRlY2lzaW9uTm9kZSwgImxpbmsyIik7Ci0JCQlkaWFncmFtVUlTZXJ2aWNlLmNyZWF0ZUVkZ2UoZGlhZ3JhbSwgZGVjaXNpb25Ob2RlLCBhY3QyTm9kZSwgImxpbmszIik7Ci0JCQlkaWFncmFtVUlTZXJ2aWNlLmNyZWF0ZUVkZ2UoZGlhZ3JhbSwgYWN0Mk5vZGUsIGVuZE5vZGUsICJsaW5rNCIpOwotCQkJCQkJCi0JCQlMaXN0IG5vZGVzID0gZGlhZ3JhbVVJU2VydmljZS5nZXROb2RlcyhkaWFncmFtLCBjcDEsIElEaWFncmFtVUlTZXJ2aWNlLkFDVElWSVRZX05PREUpOwotCQkJaWYgKCFub2Rlcy5pc0VtcHR5KCkpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIioqKioqKiBBQ1RJVklUWSBOb2RlcyAtICIpOwotCQkJCWZvciAoaW50IGk9MDsgaSA8IG5vZGVzLnNpemUoKTsgaSsrKQotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4obm9kZXMuZ2V0KGkpKTsKLQkJCX0KLQkJCQotCQkJbm9kZXMgPSBkaWFncmFtVUlTZXJ2aWNlLmdldE5vZGVzKGRpYWdyYW0sIGNwMSwgSURpYWdyYW1VSVNlcnZpY2UuSU5JVElBTF9OT0RFKTsKLQkJCWlmICghbm9kZXMuaXNFbXB0eSgpKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCIqKioqKiogSW5pdGlhbCBOb2RlcyAtICIpOwotCQkJCWZvciAoaW50IGk9MDsgaSA8IG5vZGVzLnNpemUoKTsgaSsrKQotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4obm9kZXMuZ2V0KGkpKTsKLQkJCX0KLQkJCQotCQkJbm9kZXMgPSBkaWFncmFtVUlTZXJ2aWNlLmdldE5vZGVzKGRpYWdyYW0sIGNwMSwgSURpYWdyYW1VSVNlcnZpY2UuREVDSVNJT05fTk9ERSk7Ci0JCQlpZiAoIW5vZGVzLmlzRW1wdHkoKSkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiKioqKioqIERlY2lzaW9uIE5vZGVzIC0gIik7Ci0JCQkJZm9yIChpbnQgaT0wOyBpIDwgbm9kZXMuc2l6ZSgpOyBpKyspCi0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbihub2Rlcy5nZXQoaSkpOwotCQkJfQotCQkJCi0JCQlub2RlcyA9IGRpYWdyYW1VSVNlcnZpY2UuZ2V0QWxsTm9kZXMoZGlhZ3JhbSk7Ci0JCQlpZiAoIW5vZGVzLmlzRW1wdHkoKSkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiKioqKioqIEFMTCBOb2RlcyAtICIpOwotCQkJCWZvciAoaW50IGk9MDsgaSA8IG5vZGVzLnNpemUoKTsgaSsrKQotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4obm9kZXMuZ2V0KGkpKTsKLQkJCX0KLQkJCQotCQkJYXNzZXJ0VHJ1ZSghbm9kZXMuaXNFbXB0eSgpKTsKLQkJCQotCQkJTGlzdCBlZGdlcyA9IGRpYWdyYW1VSVNlcnZpY2UuZ2V0RWRnZXMoZGlhZ3JhbSk7Ci0JCQlpZiAoIWVkZ2VzLmlzRW1wdHkoKSkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiKioqKioqIEFMTCBFZGdlcyAtICIpOwotCQkJCWZvciAoaW50IGk9MDsgaSA8IGVkZ2VzLnNpemUoKTsgaSsrKQotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oZWRnZXMuZ2V0KGkpKTsKLQkJCX0KLQkJCQotCQkJYXNzZXJ0VHJ1ZSghZWRnZXMuaXNFbXB0eSgpKTsKLQkJCi0JCQkvLyBzYXZlIGRpYWdyYW0KLQkJCXJlc291cmNlLmdldENvbnRlbnRzKCkuYWRkKGRpYWdyYW0uZ2V0RWxlbWVudCgpKTsKLQkJCXJlc291cmNlLmdldENvbnRlbnRzKCkuYWRkKGRpYWdyYW0pOwotCQkJdHguY29tbWl0KCk7Ci0JCQlyZXNvdXJjZS5zYXZlKG51bGwpOwotCi0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9IGZpbmFsbHkgewotCQkJaWYgKG1nciAhPSBudWxsKSB7Ci0JCQkJbWdyLnJlbW92ZUNvbnN1bWVyKHRoaXMpOwotCQkJfQotCQl9CQkKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy8uY2xhc3NwYXRoIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1MWM4ZjIuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvLnByb2plY3QgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2ZmM5MDIuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHM8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE0Mzg2Ny8xNDM4NjcudGMgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTQzODY3LzE0Mzg2Ny50YwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2I5MzVkOC4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTQzODY3LzE0Mzg2Ny50YworKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08TWV0aG9kTGlicmFyeVRlc3Q+Ci0JCi0JPENvcHlMaWJyYXJ5IGxpYkZvbGRlck5hbWU9IjE0Mzg2N2dvbGRlbiI+Ci0JPC9Db3B5TGlicmFyeT4JCi0JCi0JPE9wZW5MaWJyYXJ5IGxpYkZvbGRlck5hbWU9IjE0Mzg2N2dvbGRlbiI+Ci0JPC9PcGVuTGlicmFyeT4KLQotCTxDb3B5TGlicmFyeSBsaWJGb2xkZXJOYW1lPSIxNDM4NjdtIj4KLQk8L0NvcHlMaWJyYXJ5PgkKLQkKLQk8T3BlbkxpYnJhcnkgbGliRm9sZGVyTmFtZT0iMTQzODY3bSI+Ci0JPC9PcGVuTGlicmFyeT4KLQkKLQk8SW1wb3J0UGx1Z2lucyBpbXBvcnRGb2xkZXJOYW1lPSIxNDM4NjdlIj4KLQk8L0ltcG9ydFBsdWdpbnM+Ci0JCi0JPENvbXBhcmVUb0xpYnJhcnkgCi0JCWdvbGRlbkxpYkZvbGRlck5hbWU9IjE0Mzg2N2dvbGRlbiIgPgkJCi0JPC9Db21wYXJlVG9MaWJyYXJ5PgotCi08L01ldGhvZExpYnJhcnlUZXN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNDM4NjcvMTQzODY3ZS9QbHVnX0EvcGx1Z2luLnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNDM4NjcvMTQzODY3ZS9QbHVnX0EvcGx1Z2luLnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTRiYmRjOS4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTQzODY3LzE0Mzg2N2UvUGx1Z19BL3BsdWdpbi54bWkKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHhtaTpYTUkgeG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjMvdW1hLmVjb3JlIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hLnJlc291cmNlbWFuYWdlcj0iaHR0cDovLy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Jlc291cmNlbWFuYWdlci5lY29yZSIgZXBmOnZlcnNpb249IjEuMC4wIj4KLSAgPG9yZy5lY2xpcHNlLmVwZi51bWEucmVzb3VyY2VtYW5hZ2VyOlJlc291cmNlTWFuYWdlciB4bWk6aWQ9Il96Qk1zRVV6aUVkdXNUTF9JM2pKUXRBIiBndWlkPSJfekJNc0VVemlFZHVzVExfSTNqSlF0QSIvPgotICA8b3JnLmVjbGlwc2UuZXBmLnVtYTpNZXRob2RQbHVnaW4geG1pOmlkPSJfekJHbGNFemlFZHVzVExfSTNqSlF0QSIgbmFtZT0iUGx1Z19BIiBndWlkPSJfekJHbGNFemlFZHVzVExfSTNqSlF0QSI+Ci0gICAgPG1ldGhvZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il96QkdsY1V6aUVkdXNUTF9JM2pKUXRBIiBuYW1lPSJDb250ZW50IiBndWlkPSJfekJHbGNVemlFZHVzVExfSTNqSlF0QSI+Ci0gICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfekJHbGNremlFZHVzVExfSTNqSlF0QSIgbmFtZT0iQ2F0ZWdvcmllcyIgZ3VpZD0iX3pCR2xja3ppRWR1c1RMX0kzakpRdEEiPgotICAgICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfekJHbGMwemlFZHVzVExfSTNqSlF0QSIgbmFtZT0iRG9tYWlucyIgZ3VpZD0iX3pCR2xjMHppRWR1c1RMX0kzakpRdEEiLz4KLSAgICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iX3pCR2xkRXppRWR1c1RMX0kzakpRdEEiIG5hbWU9IkRpc2NpcGxpbmVzIiBndWlkPSJfekJHbGRFemlFZHVzVExfSTNqSlF0QSIvPgotICAgICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfekJHbGRVemlFZHVzVExfSTNqSlF0QSIgbmFtZT0iUm9sZVNldHMiIGd1aWQ9Il96QkdsZFV6aUVkdXNUTF9JM2pKUXRBIi8+Ci0gICAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il96QkdsZGt6aUVkdXNUTF9JM2pKUXRBIiBuYW1lPSJXUCBUeXBlcyIgZ3VpZD0iX3pCR2xka3ppRWR1c1RMX0kzakpRdEEiLz4KLSAgICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iX3pCR2xkMHppRWR1c1RMX0kzakpRdEEiIG5hbWU9IlRvb2xzIiBndWlkPSJfekJHbGQwemlFZHVzVExfSTNqSlF0QSIvPgotICAgICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfekJHbGVFemlFZHVzVExfSTNqSlF0QSIgbmFtZT0iU3RhbmRhcmRDYXRlZ29yaWVzIiBndWlkPSJfekJHbGVFemlFZHVzVExfSTNqSlF0QSIvPgotICAgICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfekJHbGVVemlFZHVzVExfSTNqSlF0QSIgbmFtZT0iQ3VzdG9tQ2F0ZWdvcmllcyIgZ3VpZD0iX3pCR2xlVXppRWR1c1RMX0kzakpRdEEiPgotICAgICAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il96QkdsZWt6aUVkdXNUTF9JM2pKUXRBIiBuYW1lPSJIaWRkZW4iIGd1aWQ9Il96QkdsZWt6aUVkdXNUTF9JM2pKUXRBIj4KLSAgICAgICAgICAgIDxjb250ZW50RWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q3VzdG9tQ2F0ZWdvcnkiIHhtaTppZD0iX3pCR2xlMHppRWR1c1RMX0kzakpRdEEiIG5hbWU9IkN1c3RvbSBDYXRlZ29yaWVzIiBndWlkPSJfekJHbGUwemlFZHVzVExfSTNqSlF0QSIvPgotICAgICAgICAgIDwvY2hpbGRQYWNrYWdlcz4KLSAgICAgICAgPC9jaGlsZFBhY2thZ2VzPgotICAgICAgPC9jaGlsZFBhY2thZ2VzPgotICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iX3pCR2xmRXppRWR1c1RMX0kzakpRdEEiIG5hbWU9IkNvcmVDb250ZW50IiBndWlkPSJfekJHbGZFemlFZHVzVExfSTNqSlF0QSI+Ci0gICAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il8wSFpmSUV6aUVkdXNUTF9JM2pKUXRBIiBuYW1lPSJuZXdfY29udGVudF9wYWNrYWdlIiBndWlkPSJfMEhaZklFemlFZHVzVExfSTNqSlF0QSI+Ci0gICAgICAgICAgPGNvbnRlbnRFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpSb2xlIiB4bWk6aWQ9Il8wc0taRUV6aUVkdXNUTF9JM2pKUXRBIiBuYW1lPSJuZXdfcm9sZSIgZ3VpZD0iXzBzS1pFRXppRWR1c1RMX0kzakpRdEEiIHByZXNlbnRhdGlvbk5hbWU9Ik5ldyBSb2xlIi8+Ci0gICAgICAgIDwvY2hpbGRQYWNrYWdlcz4KLSAgICAgIDwvY2hpbGRQYWNrYWdlcz4KLSAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NQYWNrYWdlIiB4bWk6aWQ9Il96QkdsZlV6aUVkdXNUTF9JM2pKUXRBIiBuYW1lPSJDYXBhYmlsaXR5UGF0dGVybnMiIGd1aWQ9Il96QkdsZlV6aUVkdXNUTF9JM2pKUXRBIi8+Ci0gICAgPC9tZXRob2RQYWNrYWdlcz4KLSAgICA8bWV0aG9kUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc1BhY2thZ2UiIHhtaTppZD0iX3pCR2xma3ppRWR1c1RMX0kzakpRdEEiIG5hbWU9IkRlbGl2ZXJ5UHJvY2Vzc2VzIiBndWlkPSJfekJHbGZremlFZHVzVExfSTNqSlF0QSIvPgotICAgIDxtZXRob2RQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzUGFja2FnZSIgeG1pOmlkPSJfekJHbGYwemlFZHVzVExfSTNqSlF0QSIgbmFtZT0iUHJvY2Vzc0NvbnRyaWJ1dGlvbnMiIGd1aWQ9Il96QkdsZjB6aUVkdXNUTF9JM2pKUXRBIi8+Ci0gIDwvb3JnLmVjbGlwc2UuZXBmLnVtYTpNZXRob2RQbHVnaW4+Ci08L3htaTpYTUk+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTQzODY3LzE0Mzg2N2UvY29uZmlndXJhdGlvbnMvQ29uZmlnX0EueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE0Mzg2Ny8xNDM4NjdlL2NvbmZpZ3VyYXRpb25zL0NvbmZpZ19BLnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTdhNDEzYi4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTQzODY3LzE0Mzg2N2UvY29uZmlndXJhdGlvbnMvQ29uZmlnX0EueG1pCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxvcmcuZWNsaXBzZS5lcGYudW1hOk1ldGhvZENvbmZpZ3VyYXRpb24geG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjMvdW1hLmVjb3JlIiBlcGY6dmVyc2lvbj0iMS4wLjAiIHhtaTppZD0iXzJtT1NBRXppRWR1c1RMX0kzakpRdEEiIG5hbWU9IkNvbmZpZ19BIiBndWlkPSJfMm1PU0FFemlFZHVzVExfSTNqSlF0QSI+Ci0gIDxtZXRob2RQbHVnaW5TZWxlY3Rpb24gaHJlZj0idW1hOi8vX3pCR2xjRXppRWR1c1RMX0kzakpRdEEjX3pCR2xjRXppRWR1c1RMX0kzakpRdEEiLz4KLSAgPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24geHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIGhyZWY9InVtYTovL196QkdsY0V6aUVkdXNUTF9JM2pKUXRBI196QkdsZkV6aUVkdXNUTF9JM2pKUXRBIi8+Ci0gIDxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiBocmVmPSJ1bWE6Ly9fekJHbGNFemlFZHVzVExfSTNqSlF0QSNfekJHbGNVemlFZHVzVExfSTNqSlF0QSIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgaHJlZj0idW1hOi8vX3pCR2xjRXppRWR1c1RMX0kzakpRdEEjX3pCR2xkVXppRWR1c1RMX0kzakpRdEEiLz4KLSAgPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24geHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIGhyZWY9InVtYTovL196QkdsY0V6aUVkdXNUTF9JM2pKUXRBI196QkdsY2t6aUVkdXNUTF9JM2pKUXRBIi8+Ci0gIDxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiBocmVmPSJ1bWE6Ly9fekJHbGNFemlFZHVzVExfSTNqSlF0QSNfekJHbGRFemlFZHVzVExfSTNqSlF0QSIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgaHJlZj0idW1hOi8vX3pCR2xjRXppRWR1c1RMX0kzakpRdEEjX3pCR2xjMHppRWR1c1RMX0kzakpRdEEiLz4KLSAgPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24geHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIGhyZWY9InVtYTovL196QkdsY0V6aUVkdXNUTF9JM2pKUXRBI196QkdsZDB6aUVkdXNUTF9JM2pKUXRBIi8+Ci0gIDxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NQYWNrYWdlIiBocmVmPSJ1bWE6Ly9fekJHbGNFemlFZHVzVExfSTNqSlF0QSNfekJHbGZVemlFZHVzVExfSTNqSlF0QSIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzUGFja2FnZSIgaHJlZj0idW1hOi8vX3pCR2xjRXppRWR1c1RMX0kzakpRdEEjX3pCR2xma3ppRWR1c1RMX0kzakpRdEEiLz4KLSAgPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24geHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIGhyZWY9InVtYTovL196QkdsY0V6aUVkdXNUTF9JM2pKUXRBI196QkdsZGt6aUVkdXNUTF9JM2pKUXRBIi8+Ci0gIDxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NQYWNrYWdlIiBocmVmPSJ1bWE6Ly9fekJHbGNFemlFZHVzVExfSTNqSlF0QSNfekJHbGYwemlFZHVzVExfSTNqSlF0QSIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgaHJlZj0idW1hOi8vX3pCR2xjRXppRWR1c1RMX0kzakpRdEEjX3pCR2xlVXppRWR1c1RMX0kzakpRdEEiLz4KLSAgPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24geHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIGhyZWY9InVtYTovL196QkdsY0V6aUVkdXNUTF9JM2pKUXRBI196QkdsZUV6aUVkdXNUTF9JM2pKUXRBIi8+Ci0gIDxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiBocmVmPSJ1bWE6Ly9fekJHbGNFemlFZHVzVExfSTNqSlF0QSNfekJHbGVremlFZHVzVExfSTNqSlF0QSIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgaHJlZj0idW1hOi8vX3pCR2xjRXppRWR1c1RMX0kzakpRdEEjXzBIWmZJRXppRWR1c1RMX0kzakpRdEEiLz4KLTwvb3JnLmVjbGlwc2UuZXBmLnVtYTpNZXRob2RDb25maWd1cmF0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE0Mzg2Ny8xNDM4NjdlL2V4cG9ydC54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTQzODY3LzE0Mzg2N2UvZXhwb3J0LnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTExMzQwOC4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTQzODY3LzE0Mzg2N2UvZXhwb3J0LnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08eG1pOlhNSSB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuMy91bWEuZWNvcmUiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWEucmVzb3VyY2VtYW5hZ2VyPSJodHRwOi8vL29yZy9lY2xpcHNlL2VwZi91bWEvcmVzb3VyY2VtYW5hZ2VyLmVjb3JlIiBlcGY6dmVyc2lvbj0iMS4yLjAiPgotPG9yZy5lY2xpcHNlLmVwZi51bWEucmVzb3VyY2VtYW5hZ2VyOlJlc291cmNlTWFuYWdlciB4bWk6aWQ9Il94S011TUV6aUVkdXNUTF9JM2pKUXRBIiBndWlkPSJfeEtNdU1FemlFZHVzVExfSTNqSlF0QSI+Ci08c3ViTWFuYWdlcnMgeG1pOmlkPSJfekJNc0VVemlFZHVzVExfSTNqSlF0QSIgaHJlZj0idW1hOi8vX3pCR2xjRXppRWR1c1RMX0kzakpRdEEjX3pCTXNFVXppRWR1c1RMX0kzakpRdEEiPgotPC9zdWJNYW5hZ2Vycz4KLTxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iX3hLUzAwRXppRWR1c1RMX0kzakpRdEEiIGlkPSJfeEtHbmtFemlFZHVzVExfSTNqSlF0QSIgdXJpPSIiPgotPC9yZXNvdXJjZURlc2NyaXB0b3JzPgotPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfekJNc0VremlFZHVzVExfSTNqSlF0QSIgaWQ9Il96Qk1zRVV6aUVkdXNUTF9JM2pKUXRBIiB1cmk9IlBsdWdfQS9wbHVnaW4ueG1pIj4KLTwvcmVzb3VyY2VEZXNjcmlwdG9ycz4KLTxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iX3pCTXNFMHppRWR1c1RMX0kzakpRdEEiIGlkPSJfekJHbGNFemlFZHVzVExfSTNqSlF0QSIgdXJpPSJQbHVnX0EvcGx1Z2luLnhtaSI+Ci08L3Jlc291cmNlRGVzY3JpcHRvcnM+Ci08L29yZy5lY2xpcHNlLmVwZi51bWEucmVzb3VyY2VtYW5hZ2VyOlJlc291cmNlTWFuYWdlcj4KLTxvcmcuZWNsaXBzZS5lcGYudW1hOk1ldGhvZExpYnJhcnkgeG1pOmlkPSJfeEtHbmtFemlFZHVzVExfSTNqSlF0QSIgbmFtZT0iMTQzODY3bSIgZ3VpZD0iX3hLR25rRXppRWR1c1RMX0kzakpRdEEiPgotPG1ldGhvZFBsdWdpbnMgeG1pOmlkPSJfekJHbGNFemlFZHVzVExfSTNqSlF0QSIgaHJlZj0idW1hOi8vX3pCR2xjRXppRWR1c1RMX0kzakpRdEEjX3pCR2xjRXppRWR1c1RMX0kzakpRdEEiPgotPC9tZXRob2RQbHVnaW5zPgotPC9vcmcuZWNsaXBzZS5lcGYudW1hOk1ldGhvZExpYnJhcnk+Ci08L3htaTpYTUk+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTQzODY3LzE0Mzg2N2dvbGRlbi8ucHJvamVjdCBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNDM4NjcvMTQzODY3Z29sZGVuLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYTYyZTdkLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNDM4NjcvMTQzODY3Z29sZGVuLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+MTQzODY3bTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wcm9qZWN0Lk1ldGhvZExpYnJhcnlQcm9qZWN0TmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTQzODY3LzE0Mzg2N2dvbGRlbi9QbHVnX0EvcGx1Z2luLnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNDM4NjcvMTQzODY3Z29sZGVuL1BsdWdfQS9wbHVnaW4ueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMmViM2NkLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNDM4NjcvMTQzODY3Z29sZGVuL1BsdWdfQS9wbHVnaW4ueG1pCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTx4bWk6WE1JIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYS5yZXNvdXJjZW1hbmFnZXI9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZXBmL3VtYS9yZXNvdXJjZW1hbmFnZXIuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCI+Ci0gIDxvcmcuZWNsaXBzZS5lcGYudW1hLnJlc291cmNlbWFuYWdlcjpSZXNvdXJjZU1hbmFnZXIgeG1pOmlkPSJfekJNc0VVemlFZHVzVExfSTNqSlF0QSIgZ3VpZD0iX3pCTXNFVXppRWR1c1RMX0kzakpRdEEiLz4KLSAgPG9yZy5lY2xpcHNlLmVwZi51bWE6TWV0aG9kUGx1Z2luIHhtaTppZD0iX3pCR2xjRXppRWR1c1RMX0kzakpRdEEiIG5hbWU9IlBsdWdfQSIgZ3VpZD0iX3pCR2xjRXppRWR1c1RMX0kzakpRdEEiPgotICAgIDxtZXRob2RQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfekJHbGNVemlFZHVzVExfSTNqSlF0QSIgbmFtZT0iQ29udGVudCIgZ3VpZD0iX3pCR2xjVXppRWR1c1RMX0kzakpRdEEiPgotICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iX3pCR2xja3ppRWR1c1RMX0kzakpRdEEiIG5hbWU9IkNhdGVnb3JpZXMiIGd1aWQ9Il96QkdsY2t6aUVkdXNUTF9JM2pKUXRBIj4KLSAgICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iX3pCR2xjMHppRWR1c1RMX0kzakpRdEEiIG5hbWU9IkRvbWFpbnMiIGd1aWQ9Il96QkdsYzB6aUVkdXNUTF9JM2pKUXRBIi8+Ci0gICAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il96QkdsZEV6aUVkdXNUTF9JM2pKUXRBIiBuYW1lPSJEaXNjaXBsaW5lcyIgZ3VpZD0iX3pCR2xkRXppRWR1c1RMX0kzakpRdEEiLz4KLSAgICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iX3pCR2xkVXppRWR1c1RMX0kzakpRdEEiIG5hbWU9IlJvbGVTZXRzIiBndWlkPSJfekJHbGRVemlFZHVzVExfSTNqSlF0QSIvPgotICAgICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfekJHbGRremlFZHVzVExfSTNqSlF0QSIgbmFtZT0iV1AgVHlwZXMiIGd1aWQ9Il96QkdsZGt6aUVkdXNUTF9JM2pKUXRBIi8+Ci0gICAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il96QkdsZDB6aUVkdXNUTF9JM2pKUXRBIiBuYW1lPSJUb29scyIgZ3VpZD0iX3pCR2xkMHppRWR1c1RMX0kzakpRdEEiLz4KLSAgICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iX3pCR2xlRXppRWR1c1RMX0kzakpRdEEiIG5hbWU9IlN0YW5kYXJkQ2F0ZWdvcmllcyIgZ3VpZD0iX3pCR2xlRXppRWR1c1RMX0kzakpRdEEiLz4KLSAgICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iX3pCR2xlVXppRWR1c1RMX0kzakpRdEEiIG5hbWU9IkN1c3RvbUNhdGVnb3JpZXMiIGd1aWQ9Il96QkdsZVV6aUVkdXNUTF9JM2pKUXRBIj4KLSAgICAgICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfekJHbGVremlFZHVzVExfSTNqSlF0QSIgbmFtZT0iSGlkZGVuIiBndWlkPSJfekJHbGVremlFZHVzVExfSTNqSlF0QSI+Ci0gICAgICAgICAgICA8Y29udGVudEVsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkN1c3RvbUNhdGVnb3J5IiB4bWk6aWQ9Il96QkdsZTB6aUVkdXNUTF9JM2pKUXRBIiBuYW1lPSJDdXN0b20gQ2F0ZWdvcmllcyIgZ3VpZD0iX3pCR2xlMHppRWR1c1RMX0kzakpRdEEiLz4KLSAgICAgICAgICA8L2NoaWxkUGFja2FnZXM+Ci0gICAgICAgIDwvY2hpbGRQYWNrYWdlcz4KLSAgICAgIDwvY2hpbGRQYWNrYWdlcz4KLSAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il96QkdsZkV6aUVkdXNUTF9JM2pKUXRBIiBuYW1lPSJDb3JlQ29udGVudCIgZ3VpZD0iX3pCR2xmRXppRWR1c1RMX0kzakpRdEEiPgotICAgICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfMEhaZklFemlFZHVzVExfSTNqSlF0QSIgbmFtZT0ibmV3X2NvbnRlbnRfcGFja2FnZSIgZ3VpZD0iXzBIWmZJRXppRWR1c1RMX0kzakpRdEEiPgotICAgICAgICAgIDxjb250ZW50RWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Um9sZSIgeG1pOmlkPSJfMHNLWkVFemlFZHVzVExfSTNqSlF0QSIgbmFtZT0ibmV3X3JvbGUiIGd1aWQ9Il8wc0taRUV6aUVkdXNUTF9JM2pKUXRBIiBwcmVzZW50YXRpb25OYW1lPSJOZXcgUm9sZSIvPgotICAgICAgICA8L2NoaWxkUGFja2FnZXM+Ci0gICAgICA8L2NoaWxkUGFja2FnZXM+Ci0gICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzUGFja2FnZSIgeG1pOmlkPSJfekJHbGZVemlFZHVzVExfSTNqSlF0QSIgbmFtZT0iQ2FwYWJpbGl0eVBhdHRlcm5zIiBndWlkPSJfekJHbGZVemlFZHVzVExfSTNqSlF0QSIvPgotICAgIDwvbWV0aG9kUGFja2FnZXM+Ci0gICAgPG1ldGhvZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NQYWNrYWdlIiB4bWk6aWQ9Il96QkdsZmt6aUVkdXNUTF9JM2pKUXRBIiBuYW1lPSJEZWxpdmVyeVByb2Nlc3NlcyIgZ3VpZD0iX3pCR2xma3ppRWR1c1RMX0kzakpRdEEiLz4KLSAgICA8bWV0aG9kUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc1BhY2thZ2UiIHhtaTppZD0iX3pCR2xmMHppRWR1c1RMX0kzakpRdEEiIG5hbWU9IlByb2Nlc3NDb250cmlidXRpb25zIiBndWlkPSJfekJHbGYwemlFZHVzVExfSTNqSlF0QSIvPgotICA8L29yZy5lY2xpcHNlLmVwZi51bWE6TWV0aG9kUGx1Z2luPgotPC94bWk6WE1JPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE0Mzg2Ny8xNDM4Njdnb2xkZW4vUGx1Z19BX3JlbmFtZWQvcGx1Z2luLnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNDM4NjcvMTQzODY3Z29sZGVuL1BsdWdfQV9yZW5hbWVkL3BsdWdpbi54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3Mzk0MTguLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE0Mzg2Ny8xNDM4Njdnb2xkZW4vUGx1Z19BX3JlbmFtZWQvcGx1Z2luLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08eG1pOlhNSSB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWEucmVzb3VyY2VtYW5hZ2VyPSJodHRwOi8vL29yZy9lY2xpcHNlL2VwZi91bWEvcmVzb3VyY2VtYW5hZ2VyLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiPgotICA8b3JnLmVjbGlwc2UuZXBmLnVtYS5yZXNvdXJjZW1hbmFnZXI6UmVzb3VyY2VNYW5hZ2VyIHhtaTppZD0iX0JJOVJBVXpqRWR1c1RMX0kzakpRdEEiIGd1aWQ9Il9CSTlSQVV6akVkdXNUTF9JM2pKUXRBIi8+Ci0gIDxvcmcuZWNsaXBzZS5lcGYudW1hOk1ldGhvZFBsdWdpbiB4bWk6aWQ9Il9CSTlROEV6akVkdXNUTF9JM2pKUXRBIiBuYW1lPSJQbHVnX0FfcmVuYW1lZCIgZ3VpZD0iX0JJOVE4RXpqRWR1c1RMX0kzakpRdEEiPgotICAgIDxtZXRob2RQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfQkk5UThVempFZHVzVExfSTNqSlF0QSIgbmFtZT0iQ29udGVudCIgZ3VpZD0iX0JJOVE4VXpqRWR1c1RMX0kzakpRdEEiPgotICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iX0JJOVE4a3pqRWR1c1RMX0kzakpRdEEiIG5hbWU9IkNhdGVnb3JpZXMiIGd1aWQ9Il9CSTlROGt6akVkdXNUTF9JM2pKUXRBIj4KLSAgICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iX0JJOVE4MHpqRWR1c1RMX0kzakpRdEEiIG5hbWU9IkRvbWFpbnMiIGd1aWQ9Il9CSTlRODB6akVkdXNUTF9JM2pKUXRBIi8+Ci0gICAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il9CSTlROUV6akVkdXNUTF9JM2pKUXRBIiBuYW1lPSJEaXNjaXBsaW5lcyIgZ3VpZD0iX0JJOVE5RXpqRWR1c1RMX0kzakpRdEEiLz4KLSAgICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iX0JJOVE5VXpqRWR1c1RMX0kzakpRdEEiIG5hbWU9IlJvbGVTZXRzIiBndWlkPSJfQkk5UTlVempFZHVzVExfSTNqSlF0QSIvPgotICAgICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfQkk5UTlrempFZHVzVExfSTNqSlF0QSIgbmFtZT0iV1AgVHlwZXMiIGd1aWQ9Il9CSTlROWt6akVkdXNUTF9JM2pKUXRBIi8+Ci0gICAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il9CSTlROTB6akVkdXNUTF9JM2pKUXRBIiBuYW1lPSJUb29scyIgZ3VpZD0iX0JJOVE5MHpqRWR1c1RMX0kzakpRdEEiLz4KLSAgICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iX0JJOVEtRXpqRWR1c1RMX0kzakpRdEEiIG5hbWU9IlN0YW5kYXJkQ2F0ZWdvcmllcyIgZ3VpZD0iX0JJOVEtRXpqRWR1c1RMX0kzakpRdEEiLz4KLSAgICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iX0JJOVEtVXpqRWR1c1RMX0kzakpRdEEiIG5hbWU9IkN1c3RvbUNhdGVnb3JpZXMiIGd1aWQ9Il9CSTlRLVV6akVkdXNUTF9JM2pKUXRBIj4KLSAgICAgICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfQkk5US1rempFZHVzVExfSTNqSlF0QSIgbmFtZT0iSGlkZGVuIiBndWlkPSJfQkk5US1rempFZHVzVExfSTNqSlF0QSI+Ci0gICAgICAgICAgICA8Y29udGVudEVsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkN1c3RvbUNhdGVnb3J5IiB4bWk6aWQ9Il9CSTlRLTB6akVkdXNUTF9JM2pKUXRBIiBuYW1lPSJDdXN0b20gQ2F0ZWdvcmllcyIgZ3VpZD0iX0JJOVEtMHpqRWR1c1RMX0kzakpRdEEiLz4KLSAgICAgICAgICA8L2NoaWxkUGFja2FnZXM+Ci0gICAgICAgIDwvY2hpbGRQYWNrYWdlcz4KLSAgICAgIDwvY2hpbGRQYWNrYWdlcz4KLSAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il9CSTlRX0V6akVkdXNUTF9JM2pKUXRBIiBuYW1lPSJDb3JlQ29udGVudCIgZ3VpZD0iX0JJOVFfRXpqRWR1c1RMX0kzakpRdEEiLz4KLSAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NQYWNrYWdlIiB4bWk6aWQ9Il9CSTlRX1V6akVkdXNUTF9JM2pKUXRBIiBuYW1lPSJDYXBhYmlsaXR5UGF0dGVybnMiIGd1aWQ9Il9CSTlRX1V6akVkdXNUTF9JM2pKUXRBIi8+Ci0gICAgPC9tZXRob2RQYWNrYWdlcz4KLSAgICA8bWV0aG9kUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc1BhY2thZ2UiIHhtaTppZD0iX0JJOVFfa3pqRWR1c1RMX0kzakpRdEEiIG5hbWU9IkRlbGl2ZXJ5UHJvY2Vzc2VzIiBndWlkPSJfQkk5UV9rempFZHVzVExfSTNqSlF0QSIvPgotICAgIDxtZXRob2RQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzUGFja2FnZSIgeG1pOmlkPSJfQkk5UV8wempFZHVzVExfSTNqSlF0QSIgbmFtZT0iUHJvY2Vzc0NvbnRyaWJ1dGlvbnMiIGd1aWQ9Il9CSTlRXzB6akVkdXNUTF9JM2pKUXRBIi8+Ci0gIDwvb3JnLmVjbGlwc2UuZXBmLnVtYTpNZXRob2RQbHVnaW4+Ci08L3htaTpYTUk+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTQzODY3LzE0Mzg2N2dvbGRlbi9jb25maWd1cmF0aW9ucy9Db25maWdfQS54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTQzODY3LzE0Mzg2N2dvbGRlbi9jb25maWd1cmF0aW9ucy9Db25maWdfQS54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwZjdkOTYuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE0Mzg2Ny8xNDM4Njdnb2xkZW4vY29uZmlndXJhdGlvbnMvQ29uZmlnX0EueG1pCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxvcmcuZWNsaXBzZS5lcGYudW1hOk1ldGhvZENvbmZpZ3VyYXRpb24geG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiIHhtaTppZD0iXzJtT1NBRXppRWR1c1RMX0kzakpRdEEiIG5hbWU9IkNvbmZpZ19BIiBndWlkPSJfMm1PU0FFemlFZHVzVExfSTNqSlF0QSI+Ci0gIDxtZXRob2RQbHVnaW5TZWxlY3Rpb24gaHJlZj0idW1hOi8vX3pCR2xjRXppRWR1c1RMX0kzakpRdEEjX3pCR2xjRXppRWR1c1RMX0kzakpRdEEiLz4KLSAgPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24geHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIGhyZWY9InVtYTovL196QkdsY0V6aUVkdXNUTF9JM2pKUXRBI196QkdsZkV6aUVkdXNUTF9JM2pKUXRBIi8+Ci0gIDxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiBocmVmPSJ1bWE6Ly9fekJHbGNFemlFZHVzVExfSTNqSlF0QSNfekJHbGNVemlFZHVzVExfSTNqSlF0QSIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgaHJlZj0idW1hOi8vX3pCR2xjRXppRWR1c1RMX0kzakpRdEEjX3pCR2xkVXppRWR1c1RMX0kzakpRdEEiLz4KLSAgPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24geHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIGhyZWY9InVtYTovL196QkdsY0V6aUVkdXNUTF9JM2pKUXRBI196QkdsY2t6aUVkdXNUTF9JM2pKUXRBIi8+Ci0gIDxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiBocmVmPSJ1bWE6Ly9fekJHbGNFemlFZHVzVExfSTNqSlF0QSNfekJHbGRFemlFZHVzVExfSTNqSlF0QSIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgaHJlZj0idW1hOi8vX3pCR2xjRXppRWR1c1RMX0kzakpRdEEjX3pCR2xjMHppRWR1c1RMX0kzakpRdEEiLz4KLSAgPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24geHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIGhyZWY9InVtYTovL196QkdsY0V6aUVkdXNUTF9JM2pKUXRBI196QkdsZDB6aUVkdXNUTF9JM2pKUXRBIi8+Ci0gIDxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NQYWNrYWdlIiBocmVmPSJ1bWE6Ly9fekJHbGNFemlFZHVzVExfSTNqSlF0QSNfekJHbGZVemlFZHVzVExfSTNqSlF0QSIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzUGFja2FnZSIgaHJlZj0idW1hOi8vX3pCR2xjRXppRWR1c1RMX0kzakpRdEEjX3pCR2xma3ppRWR1c1RMX0kzakpRdEEiLz4KLSAgPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24geHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIGhyZWY9InVtYTovL196QkdsY0V6aUVkdXNUTF9JM2pKUXRBI196QkdsZGt6aUVkdXNUTF9JM2pKUXRBIi8+Ci0gIDxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NQYWNrYWdlIiBocmVmPSJ1bWE6Ly9fekJHbGNFemlFZHVzVExfSTNqSlF0QSNfekJHbGYwemlFZHVzVExfSTNqSlF0QSIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgaHJlZj0idW1hOi8vX3pCR2xjRXppRWR1c1RMX0kzakpRdEEjX3pCR2xlVXppRWR1c1RMX0kzakpRdEEiLz4KLSAgPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24geHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIGhyZWY9InVtYTovL196QkdsY0V6aUVkdXNUTF9JM2pKUXRBI196QkdsZUV6aUVkdXNUTF9JM2pKUXRBIi8+Ci0gIDxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiBocmVmPSJ1bWE6Ly9fekJHbGNFemlFZHVzVExfSTNqSlF0QSNfekJHbGVremlFZHVzVExfSTNqSlF0QSIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgaHJlZj0idW1hOi8vX3pCR2xjRXppRWR1c1RMX0kzakpRdEEjXzBIWmZJRXppRWR1c1RMX0kzakpRdEEiLz4KLTwvb3JnLmVjbGlwc2UuZXBmLnVtYTpNZXRob2RDb25maWd1cmF0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE0Mzg2Ny8xNDM4Njdnb2xkZW4vY29uZmlndXJhdGlvbnMvQ29uZmlnX0FfcmVuYW1lZC54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTQzODY3LzE0Mzg2N2dvbGRlbi9jb25maWd1cmF0aW9ucy9Db25maWdfQV9yZW5hbWVkLnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmEyOGE3MC4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTQzODY3LzE0Mzg2N2dvbGRlbi9jb25maWd1cmF0aW9ucy9Db25maWdfQV9yZW5hbWVkLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxvcmcuZWNsaXBzZS5lcGYudW1hOk1ldGhvZENvbmZpZ3VyYXRpb24geG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiIHhtaTppZD0iX0RIczFrRXpqRWR1c1RMX0kzakpRdEEiIG5hbWU9IkNvbmZpZ19BX3JlbmFtZWQiIGd1aWQ9Il9ESHMxa0V6akVkdXNUTF9JM2pKUXRBIi8+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTQzODY3LzE0Mzg2N2dvbGRlbi9saWJyYXJ5LnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNDM4NjcvMTQzODY3Z29sZGVuL2xpYnJhcnkueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5N2QzYjdhLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNDM4NjcvMTQzODY3Z29sZGVuL2xpYnJhcnkueG1pCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTx4bWk6WE1JIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYS5yZXNvdXJjZW1hbmFnZXI9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZXBmL3VtYS9yZXNvdXJjZW1hbmFnZXIuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCI+Ci0gIDxvcmcuZWNsaXBzZS5lcGYudW1hLnJlc291cmNlbWFuYWdlcjpSZXNvdXJjZU1hbmFnZXIgeG1pOmlkPSJfeEtNdU1FemlFZHVzVExfSTNqSlF0QSIgZ3VpZD0iX3hLTXVNRXppRWR1c1RMX0kzakpRdEEiPgotICAgIDxzdWJNYW5hZ2VycyB4bWk6aWQ9Il9CSTlSQVV6akVkdXNUTF9JM2pKUXRBIiBocmVmPSJ1bWE6Ly9fQkk5UThFempFZHVzVExfSTNqSlF0QSNfQkk5UkFVempFZHVzVExfSTNqSlF0QSIvPgotICAgIDxzdWJNYW5hZ2VycyB4bWk6aWQ9Il96Qk1zRVV6aUVkdXNUTF9JM2pKUXRBIiBocmVmPSJ1bWE6Ly9fekJHbGNFemlFZHVzVExfSTNqSlF0QSNfekJNc0VVemlFZHVzVExfSTNqSlF0QSIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iX3hLUzAwRXppRWR1c1RMX0kzakpRdEEiIGlkPSJfeEtHbmtFemlFZHVzVExfSTNqSlF0QSIgdXJpPSIiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il96Qk1zRWt6aUVkdXNUTF9JM2pKUXRBIiBpZD0iX3pCTXNFVXppRWR1c1RMX0kzakpRdEEiIHVyaT0iUGx1Z19BL3BsdWdpbi54bWkiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il9CSTlSQWt6akVkdXNUTF9JM2pKUXRBIiBpZD0iX0JJOVJBVXpqRWR1c1RMX0kzakpRdEEiIHVyaT0iUGx1Z19BL3BsdWdpbi54bWkiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il9CSTlSQTB6akVkdXNUTF9JM2pKUXRBIiBpZD0iX0JJOVE4RXpqRWR1c1RMX0kzakpRdEEiIHVyaT0iUGx1Z19BX3JlbmFtZWQvcGx1Z2luLnhtaSIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iX3p5M09zTGNfRWR1UTF2TmRKZUppRlEiIGlkPSJfekJHbGNFemlFZHVzVExfSTNqSlF0QSIgdXJpPSJQbHVnX0EvcGx1Z2luLnhtaSIvPgotICA8L29yZy5lY2xpcHNlLmVwZi51bWEucmVzb3VyY2VtYW5hZ2VyOlJlc291cmNlTWFuYWdlcj4KLSAgPG9yZy5lY2xpcHNlLmVwZi51bWE6TWV0aG9kTGlicmFyeSB4bWk6aWQ9Il94S0dua0V6aUVkdXNUTF9JM2pKUXRBIiBuYW1lPSIxNDM4NjdtIiBndWlkPSJfeEtHbmtFemlFZHVzVExfSTNqSlF0QSI+Ci0gICAgPG1ldGhvZFBsdWdpbnMgeG1pOmlkPSJfQkk5UThFempFZHVzVExfSTNqSlF0QSIgaHJlZj0idW1hOi8vX0JJOVE4RXpqRWR1c1RMX0kzakpRdEEjX0JJOVE4RXpqRWR1c1RMX0kzakpRdEEiLz4KLSAgICA8bWV0aG9kUGx1Z2lucyB4bWk6aWQ9Il96QkdsY0V6aUVkdXNUTF9JM2pKUXRBIiBocmVmPSJ1bWE6Ly9fekJHbGNFemlFZHVzVExfSTNqSlF0QSNfekJHbGNFemlFZHVzVExfSTNqSlF0QSIvPgotICA8L29yZy5lY2xpcHNlLmVwZi51bWE6TWV0aG9kTGlicmFyeT4KLTwveG1pOlhNST4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNDM4NjcvMTQzODY3bS8ucHJvamVjdCBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNDM4NjcvMTQzODY3bS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTI0MDI3ZC4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTQzODY3LzE0Mzg2N20vLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT4xNDM4NjdtIDI8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucHJvamVjdC5NZXRob2RMaWJyYXJ5UHJvamVjdE5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE0Mzg2Ny8xNDM4NjdtL1BsdWdfQS9wbHVnaW4ueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE0Mzg2Ny8xNDM4NjdtL1BsdWdfQS9wbHVnaW4ueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzN2MyOTBmLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNDM4NjcvMTQzODY3bS9QbHVnX0EvcGx1Z2luLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08eG1pOlhNSSB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWEucmVzb3VyY2VtYW5hZ2VyPSJodHRwOi8vL29yZy9lY2xpcHNlL2VwZi91bWEvcmVzb3VyY2VtYW5hZ2VyLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiPgotICA8b3JnLmVjbGlwc2UuZXBmLnVtYS5yZXNvdXJjZW1hbmFnZXI6UmVzb3VyY2VNYW5hZ2VyIHhtaTppZD0iX0JJOVJBVXpqRWR1c1RMX0kzakpRdEEiIGd1aWQ9Il9CSTlSQVV6akVkdXNUTF9JM2pKUXRBIi8+Ci0gIDxvcmcuZWNsaXBzZS5lcGYudW1hOk1ldGhvZFBsdWdpbiB4bWk6aWQ9Il9CSTlROEV6akVkdXNUTF9JM2pKUXRBIiBuYW1lPSJQbHVnX0EiIGd1aWQ9Il9CSTlROEV6akVkdXNUTF9JM2pKUXRBIj4KLSAgICA8bWV0aG9kUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iX0JJOVE4VXpqRWR1c1RMX0kzakpRdEEiIG5hbWU9IkNvbnRlbnQiIGd1aWQ9Il9CSTlROFV6akVkdXNUTF9JM2pKUXRBIj4KLSAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il9CSTlROGt6akVkdXNUTF9JM2pKUXRBIiBuYW1lPSJDYXRlZ29yaWVzIiBndWlkPSJfQkk5UThrempFZHVzVExfSTNqSlF0QSI+Ci0gICAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il9CSTlRODB6akVkdXNUTF9JM2pKUXRBIiBuYW1lPSJEb21haW5zIiBndWlkPSJfQkk5UTgwempFZHVzVExfSTNqSlF0QSIvPgotICAgICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfQkk5UTlFempFZHVzVExfSTNqSlF0QSIgbmFtZT0iRGlzY2lwbGluZXMiIGd1aWQ9Il9CSTlROUV6akVkdXNUTF9JM2pKUXRBIi8+Ci0gICAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il9CSTlROVV6akVkdXNUTF9JM2pKUXRBIiBuYW1lPSJSb2xlU2V0cyIgZ3VpZD0iX0JJOVE5VXpqRWR1c1RMX0kzakpRdEEiLz4KLSAgICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iX0JJOVE5a3pqRWR1c1RMX0kzakpRdEEiIG5hbWU9IldQIFR5cGVzIiBndWlkPSJfQkk5UTlrempFZHVzVExfSTNqSlF0QSIvPgotICAgICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfQkk5UTkwempFZHVzVExfSTNqSlF0QSIgbmFtZT0iVG9vbHMiIGd1aWQ9Il9CSTlROTB6akVkdXNUTF9JM2pKUXRBIi8+Ci0gICAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il9CSTlRLUV6akVkdXNUTF9JM2pKUXRBIiBuYW1lPSJTdGFuZGFyZENhdGVnb3JpZXMiIGd1aWQ9Il9CSTlRLUV6akVkdXNUTF9JM2pKUXRBIi8+Ci0gICAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il9CSTlRLVV6akVkdXNUTF9JM2pKUXRBIiBuYW1lPSJDdXN0b21DYXRlZ29yaWVzIiBndWlkPSJfQkk5US1VempFZHVzVExfSTNqSlF0QSI+Ci0gICAgICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iX0JJOVEta3pqRWR1c1RMX0kzakpRdEEiIG5hbWU9IkhpZGRlbiIgZ3VpZD0iX0JJOVEta3pqRWR1c1RMX0kzakpRdEEiPgotICAgICAgICAgICAgPGNvbnRlbnRFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDdXN0b21DYXRlZ29yeSIgeG1pOmlkPSJfQkk5US0wempFZHVzVExfSTNqSlF0QSIgbmFtZT0iQ3VzdG9tIENhdGVnb3JpZXMiIGd1aWQ9Il9CSTlRLTB6akVkdXNUTF9JM2pKUXRBIi8+Ci0gICAgICAgICAgPC9jaGlsZFBhY2thZ2VzPgotICAgICAgICA8L2NoaWxkUGFja2FnZXM+Ci0gICAgICA8L2NoaWxkUGFja2FnZXM+Ci0gICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfQkk5UV9FempFZHVzVExfSTNqSlF0QSIgbmFtZT0iQ29yZUNvbnRlbnQiIGd1aWQ9Il9CSTlRX0V6akVkdXNUTF9JM2pKUXRBIi8+Ci0gICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzUGFja2FnZSIgeG1pOmlkPSJfQkk5UV9VempFZHVzVExfSTNqSlF0QSIgbmFtZT0iQ2FwYWJpbGl0eVBhdHRlcm5zIiBndWlkPSJfQkk5UV9VempFZHVzVExfSTNqSlF0QSIvPgotICAgIDwvbWV0aG9kUGFja2FnZXM+Ci0gICAgPG1ldGhvZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NQYWNrYWdlIiB4bWk6aWQ9Il9CSTlRX2t6akVkdXNUTF9JM2pKUXRBIiBuYW1lPSJEZWxpdmVyeVByb2Nlc3NlcyIgZ3VpZD0iX0JJOVFfa3pqRWR1c1RMX0kzakpRdEEiLz4KLSAgICA8bWV0aG9kUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc1BhY2thZ2UiIHhtaTppZD0iX0JJOVFfMHpqRWR1c1RMX0kzakpRdEEiIG5hbWU9IlByb2Nlc3NDb250cmlidXRpb25zIiBndWlkPSJfQkk5UV8wempFZHVzVExfSTNqSlF0QSIvPgotICA8L29yZy5lY2xpcHNlLmVwZi51bWE6TWV0aG9kUGx1Z2luPgotPC94bWk6WE1JPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE0Mzg2Ny8xNDM4NjdtL2NvbmZpZ3VyYXRpb25zL0NvbmZpZ19BLnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNDM4NjcvMTQzODY3bS9jb25maWd1cmF0aW9ucy9Db25maWdfQS54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhZTRhN2YuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE0Mzg2Ny8xNDM4NjdtL2NvbmZpZ3VyYXRpb25zL0NvbmZpZ19BLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxvcmcuZWNsaXBzZS5lcGYudW1hOk1ldGhvZENvbmZpZ3VyYXRpb24geG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiIHhtaTppZD0iX0RIczFrRXpqRWR1c1RMX0kzakpRdEEiIG5hbWU9IkNvbmZpZ19BIiBndWlkPSJfREhzMWtFempFZHVzVExfSTNqSlF0QSIvPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE0Mzg2Ny8xNDM4NjdtL2xpYnJhcnkueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE0Mzg2Ny8xNDM4NjdtL2xpYnJhcnkueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyN2FlN2Y4Li4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNDM4NjcvMTQzODY3bS9saWJyYXJ5LnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08eG1pOlhNSSB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWEucmVzb3VyY2VtYW5hZ2VyPSJodHRwOi8vL29yZy9lY2xpcHNlL2VwZi91bWEvcmVzb3VyY2VtYW5hZ2VyLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiPgotICA8b3JnLmVjbGlwc2UuZXBmLnVtYS5yZXNvdXJjZW1hbmFnZXI6UmVzb3VyY2VNYW5hZ2VyIHhtaTppZD0iX3hLTXVNRXppRWR1c1RMX0kzakpRdEEiIGd1aWQ9Il94S011TUV6aUVkdXNUTF9JM2pKUXRBIj4KLSAgICA8c3ViTWFuYWdlcnMgeG1pOmlkPSJfQkk5UkFVempFZHVzVExfSTNqSlF0QSIgaHJlZj0idW1hOi8vX0JJOVE4RXpqRWR1c1RMX0kzakpRdEEjX0JJOVJBVXpqRWR1c1RMX0kzakpRdEEiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il94S1MwMEV6aUVkdXNUTF9JM2pKUXRBIiBpZD0iX3hLR25rRXppRWR1c1RMX0kzakpRdEEiIHVyaT0iIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfekJNc0VremlFZHVzVExfSTNqSlF0QSIgaWQ9Il96Qk1zRVV6aUVkdXNUTF9JM2pKUXRBIiB1cmk9IlBsdWdfQS9wbHVnaW4ueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfQkk5UkFrempFZHVzVExfSTNqSlF0QSIgaWQ9Il9CSTlSQVV6akVkdXNUTF9JM2pKUXRBIiB1cmk9IlBsdWdfQS9wbHVnaW4ueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfQkk5UkEwempFZHVzVExfSTNqSlF0QSIgaWQ9Il9CSTlROEV6akVkdXNUTF9JM2pKUXRBIiB1cmk9IlBsdWdfQS9wbHVnaW4ueG1pIi8+Ci0gIDwvb3JnLmVjbGlwc2UuZXBmLnVtYS5yZXNvdXJjZW1hbmFnZXI6UmVzb3VyY2VNYW5hZ2VyPgotICA8b3JnLmVjbGlwc2UuZXBmLnVtYTpNZXRob2RMaWJyYXJ5IHhtaTppZD0iX3hLR25rRXppRWR1c1RMX0kzakpRdEEiIG5hbWU9IjE0Mzg2N20iIGd1aWQ9Il94S0dua0V6aUVkdXNUTF9JM2pKUXRBIj4KLSAgICA8bWV0aG9kUGx1Z2lucyB4bWk6aWQ9Il9CSTlROEV6akVkdXNUTF9JM2pKUXRBIiBocmVmPSJ1bWE6Ly9fQkk5UThFempFZHVzVExfSTNqSlF0QSNfQkk5UThFempFZHVzVExfSTNqSlF0QSIvPgotICA8L29yZy5lY2xpcHNlLmVwZi51bWE6TWV0aG9kTGlicmFyeT4KLTwveG1pOlhNST4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNTA3MDIvMTUwNzAyLnRjIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE1MDcwMi8xNTA3MDIudGMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyNDczYTguLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE1MDcwMi8xNTA3MDIudGMKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPE1ldGhvZExpYnJhcnlUZXN0PgotCQotCTxDb3B5TGlicmFyeSBsaWJGb2xkZXJOYW1lPSIxNTA3MDJnb2xkZW4iPgotCTwvQ29weUxpYnJhcnk+CQotCQotCTxPcGVuTGlicmFyeSBsaWJGb2xkZXJOYW1lPSIxNTA3MDJnb2xkZW4iPgotCTwvT3BlbkxpYnJhcnk+Ci0KLQk8Q29weUxpYnJhcnkgbGliRm9sZGVyTmFtZT0iMTUwNzAybSI+Ci0JPC9Db3B5TGlicmFyeT4JCi0JCi0JPE9wZW5MaWJyYXJ5IGxpYkZvbGRlck5hbWU9IjE1MDcwMm0iPgotCTwvT3BlbkxpYnJhcnk+Ci0JCi0JPEltcG9ydENvbmZpZ3VyYXRpb24gaW1wb3J0Rm9sZGVyTmFtZT0iMTUwNzAyZSI+Ci0JPC9JbXBvcnRDb25maWd1cmF0aW9uPgotCQotCTxDb21wYXJlVG9MaWJyYXJ5IAotCQlnb2xkZW5MaWJGb2xkZXJOYW1lPSIxNTA3MDJnb2xkZW4iID4JCQotCTwvQ29tcGFyZVRvTGlicmFyeT4KLQotPC9NZXRob2RMaWJyYXJ5VGVzdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTUwNzAyLzE1MDcwMmUvLnByb2plY3QgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTUwNzAyLzE1MDcwMmUvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyMzg2NjQuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE1MDcwMi8xNTA3MDJlLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+MTUwNzAyZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wcm9qZWN0Lk1ldGhvZExpYnJhcnlQcm9qZWN0TmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTUwNzAyLzE1MDcwMmUvUGx1Z0EvY2FwYWJpbGl0eXBhdHRlcm5zL2NwL2NvbnRlbnQueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE1MDcwMi8xNTA3MDJlL1BsdWdBL2NhcGFiaWxpdHlwYXR0ZXJucy9jcC9jb250ZW50LnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjMyNDcxYS4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTUwNzAyLzE1MDcwMmUvUGx1Z0EvY2FwYWJpbGl0eXBhdHRlcm5zL2NwL2NvbnRlbnQueG1pCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NEZXNjcmlwdGlvbiB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCIgeG1pOmlkPSItaTVPWUNLeUl0ZVdWMlhIMUR0MnFhZyIgbmFtZT0iY3AsX0pSUlRjVTIxRWR1REE2RG56U3ljS1EiIGd1aWQ9Ii1pNU9ZQ0t5SXRlV1YyWEgxRHQycWFnIj4KLSAgPG1haW5EZXNjcmlwdGlvbj4xPC9tYWluRGVzY3JpcHRpb24+Ci0gIDxrZXlDb25zaWRlcmF0aW9ucz4xPC9rZXlDb25zaWRlcmF0aW9ucz4KLSAgPHB1cnBvc2U+MTwvcHVycG9zZT4KLSAgPGFsdGVybmF0aXZlcz4xPC9hbHRlcm5hdGl2ZXM+Ci0gIDxob3d0b1N0YWZmPjE8L2hvd3RvU3RhZmY+Ci0gIDxleHRlcm5hbElkPjE8L2V4dGVybmFsSWQ+Ci0gIDxzY29wZT4xPC9zY29wZT4KLSAgPHVzYWdlTm90ZXM+MTwvdXNhZ2VOb3Rlcz4KLTwvb3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzRGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTUwNzAyLzE1MDcwMmUvUGx1Z0EvY2FwYWJpbGl0eXBhdHRlcm5zL2NwL21vZGVsLnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNTA3MDIvMTUwNzAyZS9QbHVnQS9jYXBhYmlsaXR5cGF0dGVybnMvY3AvbW9kZWwueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MjNjM2RhLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNTA3MDIvMTUwNzAyZS9QbHVnQS9jYXBhYmlsaXR5cGF0dGVybnMvY3AvbW9kZWwueG1pCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTx4bWk6WE1JIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYS5yZXNvdXJjZW1hbmFnZXI9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZXBmL3VtYS9yZXNvdXJjZW1hbmFnZXIuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCI+Ci0gIDxvcmcuZWNsaXBzZS5lcGYudW1hLnJlc291cmNlbWFuYWdlcjpSZXNvdXJjZU1hbmFnZXIgeG1pOmlkPSJfUldEQ01VMjFFZHVEQTZEbnpTeWNLUSIgZ3VpZD0iX1JXRENNVTIxRWR1REE2RG56U3ljS1EiPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iX1JXRENNazIxRWR1REE2RG56U3ljS1EiIGlkPSItaTVPWUNLeUl0ZVdWMlhIMUR0MnFhZyIgdXJpPSJjb250ZW50LnhtaSIvPgotICA8L29yZy5lY2xpcHNlLmVwZi51bWEucmVzb3VyY2VtYW5hZ2VyOlJlc291cmNlTWFuYWdlcj4KLSAgPG9yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc0NvbXBvbmVudCB4bWk6aWQ9Il9KUlJUY0UyMUVkdURBNkRuelN5Y0tRIiBuYW1lPSJjcCIgZ3VpZD0iX0pSUlRjRTIxRWR1REE2RG56U3ljS1EiPgotICAgIDxwcm9jZXNzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNhcGFiaWxpdHlQYXR0ZXJuIiB4bWk6aWQ9Il9KUlJUY1UyMUVkdURBNkRuelN5Y0tRIiBuYW1lPSJjcCIgZ3VpZD0iX0pSUlRjVTIxRWR1REE2RG56U3ljS1EiIGJyaWVmRGVzY3JpcHRpb249IjEiIHByZXNlbnRhdGlvbk5hbWU9ImNwIj4KLSAgICAgIDxwcmVzZW50YXRpb24geG1pOmlkPSItaTVPWUNLeUl0ZVdWMlhIMUR0MnFhZyIgaHJlZj0idW1hOi8vLWk1T1lDS3lJdGVXVjJYSDFEdDJxYWcjLWk1T1lDS3lJdGVXVjJYSDFEdDJxYWciLz4KLSAgICAgIDxkZWZhdWx0Q29udGV4dCBocmVmPSJ1bWE6Ly9fM09ubVVFMjBFZHVEQTZEbnpTeWNLUSNfOGZkMDRFMjBFZHVEQTZEbnpTeWNLUSIvPgotICAgICAgPHZhbGlkQ29udGV4dCBocmVmPSJ1bWE6Ly9fM09ubVVFMjBFZHVEQTZEbnpTeWNLUSNfOGZkMDRFMjBFZHVEQTZEbnpTeWNLUSIvPgotICAgIDwvcHJvY2Vzcz4KLSAgPC9vcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NDb21wb25lbnQ+Ci08L3htaTpYTUk+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTUwNzAyLzE1MDcwMmUvUGx1Z0EvcGx1Z2luLnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNTA3MDIvMTUwNzAyZS9QbHVnQS9wbHVnaW4ueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOWFjMWQ4Li4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNTA3MDIvMTUwNzAyZS9QbHVnQS9wbHVnaW4ueG1pCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTx4bWk6WE1JIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYS5yZXNvdXJjZW1hbmFnZXI9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZXBmL3VtYS9yZXNvdXJjZW1hbmFnZXIuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCI+Ci0gIDxvcmcuZWNsaXBzZS5lcGYudW1hLnJlc291cmNlbWFuYWdlcjpSZXNvdXJjZU1hbmFnZXIgeG1pOmlkPSJfUlY4N2trMjFFZHVEQTZEbnpTeWNLUSIgZ3VpZD0iX1JWODdrazIxRWR1REE2RG56U3ljS1EiPgotICAgIDxzdWJNYW5hZ2VycyB4bWk6aWQ9Il9SV0RDTVUyMUVkdURBNkRuelN5Y0tRIiBocmVmPSJ1bWE6Ly9fSlJSVGNFMjFFZHVEQTZEbnpTeWNLUSNfUldEQ01VMjFFZHVEQTZEbnpTeWNLUSIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iX1JWODdsVTIxRWR1REE2RG56U3ljS1EiIGlkPSItQlF2QWZ0OEtSbk91SzMyTkl0Wkc0USIgdXJpPSJyb2xlcy9uZXdfcm9sZV8xLnhtaSIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iX1JWODdsazIxRWR1REE2RG56U3ljS1EiIGlkPSItMUNydXFnUGhENmZqbU1sbk5HcXEtUSIgdXJpPSJ0YXNrcy9uZXdfdGFzayUyMDEueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfUldEQ01FMjFFZHVEQTZEbnpTeWNLUSIgaWQ9Il9KUlJUY0UyMUVkdURBNkRuelN5Y0tRIiB1cmk9ImNhcGFiaWxpdHlwYXR0ZXJucy9jcC9tb2RlbC54bWkiLz4KLSAgPC9vcmcuZWNsaXBzZS5lcGYudW1hLnJlc291cmNlbWFuYWdlcjpSZXNvdXJjZU1hbmFnZXI+Ci0gIDxvcmcuZWNsaXBzZS5lcGYudW1hOk1ldGhvZFBsdWdpbiB4bWk6aWQ9Il81YlM1UUUyMEVkdURBNkRuelN5Y0tRIiBuYW1lPSJQbHVnQSIgZ3VpZD0iXzViUzVRRTIwRWR1REE2RG56U3ljS1EiPgotICAgIDxtZXRob2RQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfNWJTNVFVMjBFZHVEQTZEbnpTeWNLUSIgbmFtZT0iQ29udGVudCIgZ3VpZD0iXzViUzVRVTIwRWR1REE2RG56U3ljS1EiPgotICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iXzViUzVRazIwRWR1REE2RG56U3ljS1EiIG5hbWU9IkNhdGVnb3JpZXMiIGd1aWQ9Il81YlM1UWsyMEVkdURBNkRuelN5Y0tRIj4KLSAgICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iXzViUzVRMDIwRWR1REE2RG56U3ljS1EiIG5hbWU9IkRvbWFpbnMiIGd1aWQ9Il81YlM1UTAyMEVkdURBNkRuelN5Y0tRIi8+Ci0gICAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il81YlM1UkUyMEVkdURBNkRuelN5Y0tRIiBuYW1lPSJEaXNjaXBsaW5lcyIgZ3VpZD0iXzViUzVSRTIwRWR1REE2RG56U3ljS1EiLz4KLSAgICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iXzViUzVSVTIwRWR1REE2RG56U3ljS1EiIG5hbWU9IlJvbGVTZXRzIiBndWlkPSJfNWJTNVJVMjBFZHVEQTZEbnpTeWNLUSIvPgotICAgICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfNWJTNVJrMjBFZHVEQTZEbnpTeWNLUSIgbmFtZT0iV1AgVHlwZXMiIGd1aWQ9Il81YlM1UmsyMEVkdURBNkRuelN5Y0tRIi8+Ci0gICAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il81YlM1UjAyMEVkdURBNkRuelN5Y0tRIiBuYW1lPSJUb29scyIgZ3VpZD0iXzViUzVSMDIwRWR1REE2RG56U3ljS1EiLz4KLSAgICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iXzViUzVTRTIwRWR1REE2RG56U3ljS1EiIG5hbWU9IlN0YW5kYXJkQ2F0ZWdvcmllcyIgZ3VpZD0iXzViUzVTRTIwRWR1REE2RG56U3ljS1EiLz4KLSAgICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iXzViUzVTVTIwRWR1REE2RG56U3ljS1EiIG5hbWU9IkN1c3RvbUNhdGVnb3JpZXMiIGd1aWQ9Il81YlM1U1UyMEVkdURBNkRuelN5Y0tRIj4KLSAgICAgICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfNWJTNVNrMjBFZHVEQTZEbnpTeWNLUSIgbmFtZT0iSGlkZGVuIiBndWlkPSJfNWJTNVNrMjBFZHVEQTZEbnpTeWNLUSI+Ci0gICAgICAgICAgICA8Y29udGVudEVsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkN1c3RvbUNhdGVnb3J5IiB4bWk6aWQ9Il81YlM1UzAyMEVkdURBNkRuelN5Y0tRIiBuYW1lPSJDdXN0b20gQ2F0ZWdvcmllcyIgZ3VpZD0iXzViUzVTMDIwRWR1REE2RG56U3ljS1EiLz4KLSAgICAgICAgICA8L2NoaWxkUGFja2FnZXM+Ci0gICAgICAgIDwvY2hpbGRQYWNrYWdlcz4KLSAgICAgIDwvY2hpbGRQYWNrYWdlcz4KLSAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il81YlM1VEUyMEVkdURBNkRuelN5Y0tRIiBuYW1lPSJDb3JlQ29udGVudCIgZ3VpZD0iXzViUzVURTIwRWR1REE2RG56U3ljS1EiPgotICAgICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfX2tTMzBFMjBFZHVEQTZEbnpTeWNLUSIgbmFtZT0iY29udGVudF9wYWNrYWdlXzEiIGd1aWQ9Il9fa1MzMEUyMEVkdURBNkRuelN5Y0tRIiBicmllZkRlc2NyaXB0aW9uPSIxIj4KLSAgICAgICAgICA8Y29udGVudEVsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlJvbGUiIHhtaTppZD0iX0JJWWd3RTIxRWR1REE2RG56U3ljS1EiIG5hbWU9Im5ld19yb2xlXzEiIGd1aWQ9Il9CSVlnd0UyMUVkdURBNkRuelN5Y0tRIiBicmllZkRlc2NyaXB0aW9uPSIxIiBwcmVzZW50YXRpb25OYW1lPSJOZXcgUm9sZSAxIj4KLSAgICAgICAgICAgIDxwcmVzZW50YXRpb24geG1pOmlkPSItQlF2QWZ0OEtSbk91SzMyTkl0Wkc0USIgaHJlZj0idW1hOi8vLUJRdkFmdDhLUm5PdUszMk5JdFpHNFEjLUJRdkFmdDhLUm5PdUszMk5JdFpHNFEiLz4KLSAgICAgICAgICA8L2NvbnRlbnRFbGVtZW50cz4KLSAgICAgICAgICA8Y29udGVudEVsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlRhc2siIHhtaTppZD0iX0dlclFBRTIxRWR1REE2RG56U3ljS1EiIG5hbWU9Im5ld190YXNrIDEiIGd1aWQ9Il9HZXJRQUUyMUVkdURBNkRuelN5Y0tRIiBicmllZkRlc2NyaXB0aW9uPSIxIiBwcmVzZW50YXRpb25OYW1lPSJOZXcgVGFzayAxIj4KLSAgICAgICAgICAgIDxwcmVzZW50YXRpb24geG1pOmlkPSItMUNydXFnUGhENmZqbU1sbk5HcXEtUSIgaHJlZj0idW1hOi8vLTFDcnVxZ1BoRDZmam1NbG5OR3FxLVEjLTFDcnVxZ1BoRDZmam1NbG5OR3FxLVEiLz4KLSAgICAgICAgICA8L2NvbnRlbnRFbGVtZW50cz4KLSAgICAgICAgPC9jaGlsZFBhY2thZ2VzPgotICAgICAgPC9jaGlsZFBhY2thZ2VzPgotICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc1BhY2thZ2UiIHhtaTppZD0iXzViUzVUVTIwRWR1REE2RG56U3ljS1EiIG5hbWU9IkNhcGFiaWxpdHlQYXR0ZXJucyIgZ3VpZD0iXzViUzVUVTIwRWR1REE2RG56U3ljS1EiPgotICAgICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzQ29tcG9uZW50IiB4bWk6aWQ9Il9KUlJUY0UyMUVkdURBNkRuelN5Y0tRIiBocmVmPSJ1bWE6Ly9fSlJSVGNFMjFFZHVEQTZEbnpTeWNLUSNfSlJSVGNFMjFFZHVEQTZEbnpTeWNLUSIvPgotICAgICAgPC9jaGlsZFBhY2thZ2VzPgotICAgIDwvbWV0aG9kUGFja2FnZXM+Ci0gICAgPG1ldGhvZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NQYWNrYWdlIiB4bWk6aWQ9Il81YlM1VGsyMEVkdURBNkRuelN5Y0tRIiBuYW1lPSJEZWxpdmVyeVByb2Nlc3NlcyIgZ3VpZD0iXzViUzVUazIwRWR1REE2RG56U3ljS1EiLz4KLSAgICA8bWV0aG9kUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc1BhY2thZ2UiIHhtaTppZD0iXzViUzVUMDIwRWR1REE2RG56U3ljS1EiIG5hbWU9IlByb2Nlc3NDb250cmlidXRpb25zIiBndWlkPSJfNWJTNVQwMjBFZHVEQTZEbnpTeWNLUSIvPgotICA8L29yZy5lY2xpcHNlLmVwZi51bWE6TWV0aG9kUGx1Z2luPgotPC94bWk6WE1JPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE1MDcwMi8xNTA3MDJlL1BsdWdBL3JvbGVzL25ld19yb2xlXzEueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE1MDcwMi8xNTA3MDJlL1BsdWdBL3JvbGVzL25ld19yb2xlXzEueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOWZhNGNjLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNTA3MDIvMTUwNzAyZS9QbHVnQS9yb2xlcy9uZXdfcm9sZV8xLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxvcmcuZWNsaXBzZS5lcGYudW1hOlJvbGVEZXNjcmlwdGlvbiB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCIgeG1pOmlkPSItQlF2QWZ0OEtSbk91SzMyTkl0Wkc0USIgbmFtZT0ibmV3X3JvbGUsX0JJWWd3RTIxRWR1REE2RG56U3ljS1EiIGd1aWQ9Ii1CUXZBZnQ4S1JuT3VLMzJOSXRaRzRRIiBhdXRob3JzPSIxIiBjaGFuZ2VEYXRlPSIyMDA2LTA5LTI2VDE2OjE2OjQxLjU4MC0wNzAwIiBjaGFuZ2VEZXNjcmlwdGlvbj0iMSI+Ci0gIDxtYWluRGVzY3JpcHRpb24+MTwvbWFpbkRlc2NyaXB0aW9uPgotICA8c2tpbGxzPjE8L3NraWxscz4KLSAgPGFzc2lnbm1lbnRBcHByb2FjaGVzPjE8L2Fzc2lnbm1lbnRBcHByb2FjaGVzPgotICA8c3lub255bXM+MTwvc3lub255bXM+Ci08L29yZy5lY2xpcHNlLmVwZi51bWE6Um9sZURlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE1MDcwMi8xNTA3MDJlL1BsdWdBL3Rhc2tzL25ld190YXNrIDEueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE1MDcwMi8xNTA3MDJlL1BsdWdBL3Rhc2tzL25ld190YXNrIDEueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MzE5NGY3Li4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNTA3MDIvMTUwNzAyZS9QbHVnQS90YXNrcy9uZXdfdGFzayAxLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxvcmcuZWNsaXBzZS5lcGYudW1hOlRhc2tEZXNjcmlwdGlvbiB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCIgeG1pOmlkPSItMUNydXFnUGhENmZqbU1sbk5HcXEtUSIgbmFtZT0iLF9HZXJRQUUyMUVkdURBNkRuelN5Y0tRIiBndWlkPSItMUNydXFnUGhENmZqbU1sbk5HcXEtUSIgY2hhbmdlRGF0ZT0iMjAwNi0wOS0yNlQxNjoxNzowMS45NzktMDcwMCI+Ci0gIDxtYWluRGVzY3JpcHRpb24+MTwvbWFpbkRlc2NyaXB0aW9uPgotICA8a2V5Q29uc2lkZXJhdGlvbnM+MTwva2V5Q29uc2lkZXJhdGlvbnM+Ci0gIDxwdXJwb3NlPjE8L3B1cnBvc2U+Ci0gIDxhbHRlcm5hdGl2ZXM+MTwvYWx0ZXJuYXRpdmVzPgotPC9vcmcuZWNsaXBzZS5lcGYudW1hOlRhc2tEZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNTA3MDIvMTUwNzAyZS9jb25maWd1cmF0aW9ucy9Db25maWdBLnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNTA3MDIvMTUwNzAyZS9jb25maWd1cmF0aW9ucy9Db25maWdBLnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjJiOWJmNS4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTUwNzAyLzE1MDcwMmUvY29uZmlndXJhdGlvbnMvQ29uZmlnQS54bWkKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPG9yZy5lY2xpcHNlLmVwZi51bWE6TWV0aG9kQ29uZmlndXJhdGlvbiB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCIgeG1pOmlkPSJfOGZkMDRFMjBFZHVEQTZEbnpTeWNLUSIgbmFtZT0iQ29uZmlnQSIgZ3VpZD0iXzhmZDA0RTIwRWR1REE2RG56U3ljS1EiPgotICA8bWV0aG9kUGx1Z2luU2VsZWN0aW9uIGhyZWY9InVtYTovL181YlM1UUUyMEVkdURBNkRuelN5Y0tRI181YlM1UUUyMEVkdURBNkRuelN5Y0tRIi8+Ci0gIDxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiBocmVmPSJ1bWE6Ly9fNWJTNVFFMjBFZHVEQTZEbnpTeWNLUSNfNWJTNVRFMjBFZHVEQTZEbnpTeWNLUSIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgaHJlZj0idW1hOi8vXzViUzVRRTIwRWR1REE2RG56U3ljS1EjXzViUzVRVTIwRWR1REE2RG56U3ljS1EiLz4KLSAgPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24geHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIGhyZWY9InVtYTovL181YlM1UUUyMEVkdURBNkRuelN5Y0tRI181YlM1UlUyMEVkdURBNkRuelN5Y0tRIi8+Ci0gIDxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiBocmVmPSJ1bWE6Ly9fNWJTNVFFMjBFZHVEQTZEbnpTeWNLUSNfNWJTNVFrMjBFZHVEQTZEbnpTeWNLUSIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgaHJlZj0idW1hOi8vXzViUzVRRTIwRWR1REE2RG56U3ljS1EjXzViUzVSRTIwRWR1REE2RG56U3ljS1EiLz4KLSAgPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24geHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIGhyZWY9InVtYTovL181YlM1UUUyMEVkdURBNkRuelN5Y0tRI181YlM1UTAyMEVkdURBNkRuelN5Y0tRIi8+Ci0gIDxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiBocmVmPSJ1bWE6Ly9fNWJTNVFFMjBFZHVEQTZEbnpTeWNLUSNfNWJTNVIwMjBFZHVEQTZEbnpTeWNLUSIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzUGFja2FnZSIgaHJlZj0idW1hOi8vXzViUzVRRTIwRWR1REE2RG56U3ljS1EjXzViUzVUVTIwRWR1REE2RG56U3ljS1EiLz4KLSAgPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24geHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc1BhY2thZ2UiIGhyZWY9InVtYTovL181YlM1UUUyMEVkdURBNkRuelN5Y0tRI181YlM1VGsyMEVkdURBNkRuelN5Y0tRIi8+Ci0gIDxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiBocmVmPSJ1bWE6Ly9fNWJTNVFFMjBFZHVEQTZEbnpTeWNLUSNfNWJTNVJrMjBFZHVEQTZEbnpTeWNLUSIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzUGFja2FnZSIgaHJlZj0idW1hOi8vXzViUzVRRTIwRWR1REE2RG56U3ljS1EjXzViUzVUMDIwRWR1REE2RG56U3ljS1EiLz4KLSAgPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24geHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIGhyZWY9InVtYTovL181YlM1UUUyMEVkdURBNkRuelN5Y0tRI181YlM1U1UyMEVkdURBNkRuelN5Y0tRIi8+Ci0gIDxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiBocmVmPSJ1bWE6Ly9fNWJTNVFFMjBFZHVEQTZEbnpTeWNLUSNfNWJTNVNFMjBFZHVEQTZEbnpTeWNLUSIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgaHJlZj0idW1hOi8vXzViUzVRRTIwRWR1REE2RG56U3ljS1EjXzViUzVTazIwRWR1REE2RG56U3ljS1EiLz4KLSAgPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24geHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIGhyZWY9InVtYTovL181YlM1UUUyMEVkdURBNkRuelN5Y0tRI19fa1MzMEUyMEVkdURBNkRuelN5Y0tRIi8+Ci0gIDxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NDb21wb25lbnQiIGhyZWY9InVtYTovL19KUlJUY0UyMUVkdURBNkRuelN5Y0tRI19KUlJUY0UyMUVkdURBNkRuelN5Y0tRIi8+Ci08L29yZy5lY2xpcHNlLmVwZi51bWE6TWV0aG9kQ29uZmlndXJhdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNTA3MDIvMTUwNzAyZS9saWJyYXJ5LnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNTA3MDIvMTUwNzAyZS9saWJyYXJ5LnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWQ3MmNiYS4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTUwNzAyLzE1MDcwMmUvbGlicmFyeS54bWkKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHhtaTpYTUkgeG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hLnJlc291cmNlbWFuYWdlcj0iaHR0cDovLy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Jlc291cmNlbWFuYWdlci5lY29yZSIgeG1sbnM6ZXBmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZiIgZXBmOnZlcnNpb249IjEuMi4wIj4KLSAgPG9yZy5lY2xpcHNlLmVwZi51bWEucmVzb3VyY2VtYW5hZ2VyOlJlc291cmNlTWFuYWdlciB4bWk6aWQ9Il9SVjg3a0UyMUVkdURBNkRuelN5Y0tRIiBndWlkPSJfUlY4N2tFMjFFZHVEQTZEbnpTeWNLUSI+Ci0gICAgPHN1Yk1hbmFnZXJzIHhtaTppZD0iX1JWODdrazIxRWR1REE2RG56U3ljS1EiIGhyZWY9InVtYTovL181YlM1UUUyMEVkdURBNkRuelN5Y0tRI19SVjg3a2syMUVkdURBNkRuelN5Y0tRIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfUlY4N2tVMjFFZHVEQTZEbnpTeWNLUSIgaWQ9Il8zT25tVUUyMEVkdURBNkRuelN5Y0tRIiB1cmk9IiIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iX1JWODdrMDIxRWR1REE2RG56U3ljS1EiIGlkPSJfUlY4N2trMjFFZHVEQTZEbnpTeWNLUSIgdXJpPSJQbHVnQS9wbHVnaW4ueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfUlY4N2xFMjFFZHVEQTZEbnpTeWNLUSIgaWQ9Il81YlM1UUUyMEVkdURBNkRuelN5Y0tRIiB1cmk9IlBsdWdBL3BsdWdpbi54bWkiLz4KLSAgPC9vcmcuZWNsaXBzZS5lcGYudW1hLnJlc291cmNlbWFuYWdlcjpSZXNvdXJjZU1hbmFnZXI+Ci0gIDxvcmcuZWNsaXBzZS5lcGYudW1hOk1ldGhvZExpYnJhcnkgeG1pOmlkPSJfM09ubVVFMjBFZHVEQTZEbnpTeWNLUSIgbmFtZT0iMTUwNzAybSIgZ3VpZD0iXzNPbm1VRTIwRWR1REE2RG56U3ljS1EiPgotICAgIDxtZXRob2RQbHVnaW5zIHhtaTppZD0iXzViUzVRRTIwRWR1REE2RG56U3ljS1EiIGhyZWY9InVtYTovL181YlM1UUUyMEVkdURBNkRuelN5Y0tRI181YlM1UUUyMEVkdURBNkRuelN5Y0tRIi8+Ci0gIDwvb3JnLmVjbGlwc2UuZXBmLnVtYTpNZXRob2RMaWJyYXJ5PgotPC94bWk6WE1JPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE1MDcwMi8xNTA3MDJnb2xkZW4vLnByb2plY3QgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTUwNzAyLzE1MDcwMmdvbGRlbi8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzM5MmU1NC4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTUwNzAyLzE1MDcwMmdvbGRlbi8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPjE1MDcwMm08L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucHJvamVjdC5NZXRob2RMaWJyYXJ5UHJvamVjdE5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE1MDcwMi8xNTA3MDJnb2xkZW4vUGx1Z0EvY2FwYWJpbGl0eXBhdHRlcm5zL2NwL2NvbnRlbnQueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE1MDcwMi8xNTA3MDJnb2xkZW4vUGx1Z0EvY2FwYWJpbGl0eXBhdHRlcm5zL2NwL2NvbnRlbnQueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMzI0NzFhLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNTA3MDIvMTUwNzAyZ29sZGVuL1BsdWdBL2NhcGFiaWxpdHlwYXR0ZXJucy9jcC9jb250ZW50LnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08b3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzRGVzY3JpcHRpb24geG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiIHhtaTppZD0iLWk1T1lDS3lJdGVXVjJYSDFEdDJxYWciIG5hbWU9ImNwLF9KUlJUY1UyMUVkdURBNkRuelN5Y0tRIiBndWlkPSItaTVPWUNLeUl0ZVdWMlhIMUR0MnFhZyI+Ci0gIDxtYWluRGVzY3JpcHRpb24+MTwvbWFpbkRlc2NyaXB0aW9uPgotICA8a2V5Q29uc2lkZXJhdGlvbnM+MTwva2V5Q29uc2lkZXJhdGlvbnM+Ci0gIDxwdXJwb3NlPjE8L3B1cnBvc2U+Ci0gIDxhbHRlcm5hdGl2ZXM+MTwvYWx0ZXJuYXRpdmVzPgotICA8aG93dG9TdGFmZj4xPC9ob3d0b1N0YWZmPgotICA8ZXh0ZXJuYWxJZD4xPC9leHRlcm5hbElkPgotICA8c2NvcGU+MTwvc2NvcGU+Ci0gIDx1c2FnZU5vdGVzPjE8L3VzYWdlTm90ZXM+Ci08L29yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc0Rlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE1MDcwMi8xNTA3MDJnb2xkZW4vUGx1Z0EvY2FwYWJpbGl0eXBhdHRlcm5zL2NwL21vZGVsLnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNTA3MDIvMTUwNzAyZ29sZGVuL1BsdWdBL2NhcGFiaWxpdHlwYXR0ZXJucy9jcC9tb2RlbC54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1NjUxODkuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE1MDcwMi8xNTA3MDJnb2xkZW4vUGx1Z0EvY2FwYWJpbGl0eXBhdHRlcm5zL2NwL21vZGVsLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08eG1pOlhNSSB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWEucmVzb3VyY2VtYW5hZ2VyPSJodHRwOi8vL29yZy9lY2xpcHNlL2VwZi91bWEvcmVzb3VyY2VtYW5hZ2VyLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiPgotICA8b3JnLmVjbGlwc2UuZXBmLnVtYS5yZXNvdXJjZW1hbmFnZXI6UmVzb3VyY2VNYW5hZ2VyIHhtaTppZD0iX0pTT1ZzRTIxRWR1REE2RG56U3ljS1EiIGd1aWQ9Il9KU09Wc0UyMUVkdURBNkRuelN5Y0tRIj4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il9KU09Wc1UyMUVkdURBNkRuelN5Y0tRIiBpZD0iLWk1T1lDS3lJdGVXVjJYSDFEdDJxYWciIHVyaT0iY29udGVudC54bWkiLz4KLSAgPC9vcmcuZWNsaXBzZS5lcGYudW1hLnJlc291cmNlbWFuYWdlcjpSZXNvdXJjZU1hbmFnZXI+Ci0gIDxvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NDb21wb25lbnQgeG1pOmlkPSJfSlJSVGNFMjFFZHVEQTZEbnpTeWNLUSIgbmFtZT0iY3AiIGd1aWQ9Il9KUlJUY0UyMUVkdURBNkRuelN5Y0tRIj4KLSAgICA8cHJvY2VzcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDYXBhYmlsaXR5UGF0dGVybiIgeG1pOmlkPSJfSlJSVGNVMjFFZHVEQTZEbnpTeWNLUSIgbmFtZT0iY3AiIGd1aWQ9Il9KUlJUY1UyMUVkdURBNkRuelN5Y0tRIiBicmllZkRlc2NyaXB0aW9uPSIxIiBwcmVzZW50YXRpb25OYW1lPSJjcCI+Ci0gICAgICA8cHJlc2VudGF0aW9uIHhtaTppZD0iLWk1T1lDS3lJdGVXVjJYSDFEdDJxYWciIGhyZWY9InVtYTovLy1pNU9ZQ0t5SXRlV1YyWEgxRHQycWFnIy1pNU9ZQ0t5SXRlV1YyWEgxRHQycWFnIi8+Ci0gICAgICA8ZGVmYXVsdENvbnRleHQgaHJlZj0idW1hOi8vXzNPbm1VRTIwRWR1REE2RG56U3ljS1EjXzhmZDA0RTIwRWR1REE2RG56U3ljS1EiLz4KLSAgICAgIDx2YWxpZENvbnRleHQgaHJlZj0idW1hOi8vXzNPbm1VRTIwRWR1REE2RG56U3ljS1EjXzhmZDA0RTIwRWR1REE2RG56U3ljS1EiLz4KLSAgICA8L3Byb2Nlc3M+Ci0gIDwvb3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzQ29tcG9uZW50PgotPC94bWk6WE1JPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE1MDcwMi8xNTA3MDJnb2xkZW4vUGx1Z0EvcGx1Z2luLnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNTA3MDIvMTUwNzAyZ29sZGVuL1BsdWdBL3BsdWdpbi54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1ZTcwYWIuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE1MDcwMi8xNTA3MDJnb2xkZW4vUGx1Z0EvcGx1Z2luLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08eG1pOlhNSSB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWEucmVzb3VyY2VtYW5hZ2VyPSJodHRwOi8vL29yZy9lY2xpcHNlL2VwZi91bWEvcmVzb3VyY2VtYW5hZ2VyLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiPgotICA8b3JnLmVjbGlwc2UuZXBmLnVtYS5yZXNvdXJjZW1hbmFnZXI6UmVzb3VyY2VNYW5hZ2VyIHhtaTppZD0iXzViZkdnVTIwRWR1REE2RG56U3ljS1EiIGd1aWQ9Il81YmZHZ1UyMEVkdURBNkRuelN5Y0tRIj4KLSAgICA8c3ViTWFuYWdlcnMgeG1pOmlkPSJfSlNPVnNFMjFFZHVEQTZEbnpTeWNLUSIgaHJlZj0idW1hOi8vX0pSUlRjRTIxRWR1REE2RG56U3ljS1EjX0pTT1ZzRTIxRWR1REE2RG56U3ljS1EiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il9Gd3ZMOFUyMUVkdURBNkRuelN5Y0tRIiBpZD0iLUJRdkFmdDhLUm5PdUszMk5JdFpHNFEiIHVyaT0icm9sZXMvbmV3X3JvbGVfMS54bWkiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il9INHBUb0UyMUVkdURBNkRuelN5Y0tRIiBpZD0iLTFDcnVxZ1BoRDZmam1NbG5OR3FxLVEiIHVyaT0idGFza3MvbmV3X3Rhc2slMjAxLnhtaSIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iX0pSWGFFVTIxRWR1REE2RG56U3ljS1EiIGlkPSJfSlJSVGNFMjFFZHVEQTZEbnpTeWNLUSIgdXJpPSJjYXBhYmlsaXR5cGF0dGVybnMvY3AvbW9kZWwueG1pIi8+Ci0gIDwvb3JnLmVjbGlwc2UuZXBmLnVtYS5yZXNvdXJjZW1hbmFnZXI6UmVzb3VyY2VNYW5hZ2VyPgotICA8b3JnLmVjbGlwc2UuZXBmLnVtYTpNZXRob2RQbHVnaW4geG1pOmlkPSJfNWJTNVFFMjBFZHVEQTZEbnpTeWNLUSIgbmFtZT0iUGx1Z0EiIGd1aWQ9Il81YlM1UUUyMEVkdURBNkRuelN5Y0tRIj4KLSAgICA8bWV0aG9kUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iXzViUzVRVTIwRWR1REE2RG56U3ljS1EiIG5hbWU9IkNvbnRlbnQiIGd1aWQ9Il81YlM1UVUyMEVkdURBNkRuelN5Y0tRIj4KLSAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il81YlM1UWsyMEVkdURBNkRuelN5Y0tRIiBuYW1lPSJDYXRlZ29yaWVzIiBndWlkPSJfNWJTNVFrMjBFZHVEQTZEbnpTeWNLUSI+Ci0gICAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il81YlM1UTAyMEVkdURBNkRuelN5Y0tRIiBuYW1lPSJEb21haW5zIiBndWlkPSJfNWJTNVEwMjBFZHVEQTZEbnpTeWNLUSIvPgotICAgICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfNWJTNVJFMjBFZHVEQTZEbnpTeWNLUSIgbmFtZT0iRGlzY2lwbGluZXMiIGd1aWQ9Il81YlM1UkUyMEVkdURBNkRuelN5Y0tRIi8+Ci0gICAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il81YlM1UlUyMEVkdURBNkRuelN5Y0tRIiBuYW1lPSJSb2xlU2V0cyIgZ3VpZD0iXzViUzVSVTIwRWR1REE2RG56U3ljS1EiLz4KLSAgICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iXzViUzVSazIwRWR1REE2RG56U3ljS1EiIG5hbWU9IldQIFR5cGVzIiBndWlkPSJfNWJTNVJrMjBFZHVEQTZEbnpTeWNLUSIvPgotICAgICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfNWJTNVIwMjBFZHVEQTZEbnpTeWNLUSIgbmFtZT0iVG9vbHMiIGd1aWQ9Il81YlM1UjAyMEVkdURBNkRuelN5Y0tRIi8+Ci0gICAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il81YlM1U0UyMEVkdURBNkRuelN5Y0tRIiBuYW1lPSJTdGFuZGFyZENhdGVnb3JpZXMiIGd1aWQ9Il81YlM1U0UyMEVkdURBNkRuelN5Y0tRIi8+Ci0gICAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il81YlM1U1UyMEVkdURBNkRuelN5Y0tRIiBuYW1lPSJDdXN0b21DYXRlZ29yaWVzIiBndWlkPSJfNWJTNVNVMjBFZHVEQTZEbnpTeWNLUSI+Ci0gICAgICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iXzViUzVTazIwRWR1REE2RG56U3ljS1EiIG5hbWU9IkhpZGRlbiIgZ3VpZD0iXzViUzVTazIwRWR1REE2RG56U3ljS1EiPgotICAgICAgICAgICAgPGNvbnRlbnRFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDdXN0b21DYXRlZ29yeSIgeG1pOmlkPSJfNWJTNVMwMjBFZHVEQTZEbnpTeWNLUSIgbmFtZT0iQ3VzdG9tIENhdGVnb3JpZXMiIGd1aWQ9Il81YlM1UzAyMEVkdURBNkRuelN5Y0tRIi8+Ci0gICAgICAgICAgPC9jaGlsZFBhY2thZ2VzPgotICAgICAgICA8L2NoaWxkUGFja2FnZXM+Ci0gICAgICA8L2NoaWxkUGFja2FnZXM+Ci0gICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfNWJTNVRFMjBFZHVEQTZEbnpTeWNLUSIgbmFtZT0iQ29yZUNvbnRlbnQiIGd1aWQ9Il81YlM1VEUyMEVkdURBNkRuelN5Y0tRIj4KLSAgICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iX19rUzMwRTIwRWR1REE2RG56U3ljS1EiIG5hbWU9ImNvbnRlbnRfcGFja2FnZV8xIiBndWlkPSJfX2tTMzBFMjBFZHVEQTZEbnpTeWNLUSIgYnJpZWZEZXNjcmlwdGlvbj0iMSI+Ci0gICAgICAgICAgPGNvbnRlbnRFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpSb2xlIiB4bWk6aWQ9Il9CSVlnd0UyMUVkdURBNkRuelN5Y0tRIiBuYW1lPSJuZXdfcm9sZV8xIiBndWlkPSJfQklZZ3dFMjFFZHVEQTZEbnpTeWNLUSIgYnJpZWZEZXNjcmlwdGlvbj0iMSIgcHJlc2VudGF0aW9uTmFtZT0iTmV3IFJvbGUgMSI+Ci0gICAgICAgICAgICA8cHJlc2VudGF0aW9uIHhtaTppZD0iLUJRdkFmdDhLUm5PdUszMk5JdFpHNFEiIGhyZWY9InVtYTovLy1CUXZBZnQ4S1JuT3VLMzJOSXRaRzRRIy1CUXZBZnQ4S1JuT3VLMzJOSXRaRzRRIi8+Ci0gICAgICAgICAgPC9jb250ZW50RWxlbWVudHM+Ci0gICAgICAgICAgPGNvbnRlbnRFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpUYXNrIiB4bWk6aWQ9Il9HZXJRQUUyMUVkdURBNkRuelN5Y0tRIiBuYW1lPSJuZXdfdGFzayAxIiBndWlkPSJfR2VyUUFFMjFFZHVEQTZEbnpTeWNLUSIgYnJpZWZEZXNjcmlwdGlvbj0iMSIgcHJlc2VudGF0aW9uTmFtZT0iTmV3IFRhc2sgMSI+Ci0gICAgICAgICAgICA8cHJlc2VudGF0aW9uIHhtaTppZD0iLTFDcnVxZ1BoRDZmam1NbG5OR3FxLVEiIGhyZWY9InVtYTovLy0xQ3J1cWdQaEQ2ZmptTWxuTkdxcS1RIy0xQ3J1cWdQaEQ2ZmptTWxuTkdxcS1RIi8+Ci0gICAgICAgICAgPC9jb250ZW50RWxlbWVudHM+Ci0gICAgICAgIDwvY2hpbGRQYWNrYWdlcz4KLSAgICAgIDwvY2hpbGRQYWNrYWdlcz4KLSAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NQYWNrYWdlIiB4bWk6aWQ9Il81YlM1VFUyMEVkdURBNkRuelN5Y0tRIiBuYW1lPSJDYXBhYmlsaXR5UGF0dGVybnMiIGd1aWQ9Il81YlM1VFUyMEVkdURBNkRuelN5Y0tRIj4KLSAgICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc0NvbXBvbmVudCIgeG1pOmlkPSJfSlJSVGNFMjFFZHVEQTZEbnpTeWNLUSIgaHJlZj0idW1hOi8vX0pSUlRjRTIxRWR1REE2RG56U3ljS1EjX0pSUlRjRTIxRWR1REE2RG56U3ljS1EiLz4KLSAgICAgIDwvY2hpbGRQYWNrYWdlcz4KLSAgICA8L21ldGhvZFBhY2thZ2VzPgotICAgIDxtZXRob2RQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzUGFja2FnZSIgeG1pOmlkPSJfNWJTNVRrMjBFZHVEQTZEbnpTeWNLUSIgbmFtZT0iRGVsaXZlcnlQcm9jZXNzZXMiIGd1aWQ9Il81YlM1VGsyMEVkdURBNkRuelN5Y0tRIi8+Ci0gICAgPG1ldGhvZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NQYWNrYWdlIiB4bWk6aWQ9Il81YlM1VDAyMEVkdURBNkRuelN5Y0tRIiBuYW1lPSJQcm9jZXNzQ29udHJpYnV0aW9ucyIgZ3VpZD0iXzViUzVUMDIwRWR1REE2RG56U3ljS1EiLz4KLSAgPC9vcmcuZWNsaXBzZS5lcGYudW1hOk1ldGhvZFBsdWdpbj4KLTwveG1pOlhNST4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNTA3MDIvMTUwNzAyZ29sZGVuL1BsdWdBL3JvbGVzL25ld19yb2xlXzEueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE1MDcwMi8xNTA3MDJnb2xkZW4vUGx1Z0Evcm9sZXMvbmV3X3JvbGVfMS54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxOGIzMGEuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE1MDcwMi8xNTA3MDJnb2xkZW4vUGx1Z0Evcm9sZXMvbmV3X3JvbGVfMS54bWkKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08b3JnLmVjbGlwc2UuZXBmLnVtYTpSb2xlRGVzY3JpcHRpb24geG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiIHhtaTppZD0iLUJRdkFmdDhLUm5PdUszMk5JdFpHNFEiIG5hbWU9Im5ld19yb2xlXzEsX0JJWWd3RTIxRWR1REE2RG56U3ljS1EiIGd1aWQ9Ii1CUXZBZnQ4S1JuT3VLMzJOSXRaRzRRIiBhdXRob3JzPSIxIiBjaGFuZ2VEYXRlPSIyMDA2LTA5LTI2VDE2OjE2OjQxLjU4MC0wNzAwIiBjaGFuZ2VEZXNjcmlwdGlvbj0iMSI+Ci0gIDxtYWluRGVzY3JpcHRpb24+MTwvbWFpbkRlc2NyaXB0aW9uPgotICA8c2tpbGxzPjE8L3NraWxscz4KLSAgPGFzc2lnbm1lbnRBcHByb2FjaGVzPjE8L2Fzc2lnbm1lbnRBcHByb2FjaGVzPgotICA8c3lub255bXM+MTwvc3lub255bXM+Ci08L29yZy5lY2xpcHNlLmVwZi51bWE6Um9sZURlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE1MDcwMi8xNTA3MDJnb2xkZW4vUGx1Z0EvdGFza3MvbmV3X3Rhc2sgMS54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTUwNzAyLzE1MDcwMmdvbGRlbi9QbHVnQS90YXNrcy9uZXdfdGFzayAxLnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWNhMDBhMS4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTUwNzAyLzE1MDcwMmdvbGRlbi9QbHVnQS90YXNrcy9uZXdfdGFzayAxLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxvcmcuZWNsaXBzZS5lcGYudW1hOlRhc2tEZXNjcmlwdGlvbiB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCIgeG1pOmlkPSItMUNydXFnUGhENmZqbU1sbk5HcXEtUSIgbmFtZT0ibmV3X3Rhc2sgMSxfR2VyUUFFMjFFZHVEQTZEbnpTeWNLUSIgZ3VpZD0iLTFDcnVxZ1BoRDZmam1NbG5OR3FxLVEiIGNoYW5nZURhdGU9IjIwMDYtMDktMjZUMTY6MTc6MDEuOTc5LTA3MDAiPgotICA8bWFpbkRlc2NyaXB0aW9uPjE8L21haW5EZXNjcmlwdGlvbj4KLSAgPGtleUNvbnNpZGVyYXRpb25zPjE8L2tleUNvbnNpZGVyYXRpb25zPgotICA8cHVycG9zZT4xPC9wdXJwb3NlPgotICA8YWx0ZXJuYXRpdmVzPjE8L2FsdGVybmF0aXZlcz4KLTwvb3JnLmVjbGlwc2UuZXBmLnVtYTpUYXNrRGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTUwNzAyLzE1MDcwMmdvbGRlbi9jb25maWd1cmF0aW9ucy9Db25maWdBLnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNTA3MDIvMTUwNzAyZ29sZGVuL2NvbmZpZ3VyYXRpb25zL0NvbmZpZ0EueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MmI5YmY1Li4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNTA3MDIvMTUwNzAyZ29sZGVuL2NvbmZpZ3VyYXRpb25zL0NvbmZpZ0EueG1pCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxvcmcuZWNsaXBzZS5lcGYudW1hOk1ldGhvZENvbmZpZ3VyYXRpb24geG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiIHhtaTppZD0iXzhmZDA0RTIwRWR1REE2RG56U3ljS1EiIG5hbWU9IkNvbmZpZ0EiIGd1aWQ9Il84ZmQwNEUyMEVkdURBNkRuelN5Y0tRIj4KLSAgPG1ldGhvZFBsdWdpblNlbGVjdGlvbiBocmVmPSJ1bWE6Ly9fNWJTNVFFMjBFZHVEQTZEbnpTeWNLUSNfNWJTNVFFMjBFZHVEQTZEbnpTeWNLUSIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgaHJlZj0idW1hOi8vXzViUzVRRTIwRWR1REE2RG56U3ljS1EjXzViUzVURTIwRWR1REE2RG56U3ljS1EiLz4KLSAgPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24geHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIGhyZWY9InVtYTovL181YlM1UUUyMEVkdURBNkRuelN5Y0tRI181YlM1UVUyMEVkdURBNkRuelN5Y0tRIi8+Ci0gIDxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiBocmVmPSJ1bWE6Ly9fNWJTNVFFMjBFZHVEQTZEbnpTeWNLUSNfNWJTNVJVMjBFZHVEQTZEbnpTeWNLUSIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgaHJlZj0idW1hOi8vXzViUzVRRTIwRWR1REE2RG56U3ljS1EjXzViUzVRazIwRWR1REE2RG56U3ljS1EiLz4KLSAgPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24geHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIGhyZWY9InVtYTovL181YlM1UUUyMEVkdURBNkRuelN5Y0tRI181YlM1UkUyMEVkdURBNkRuelN5Y0tRIi8+Ci0gIDxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiBocmVmPSJ1bWE6Ly9fNWJTNVFFMjBFZHVEQTZEbnpTeWNLUSNfNWJTNVEwMjBFZHVEQTZEbnpTeWNLUSIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgaHJlZj0idW1hOi8vXzViUzVRRTIwRWR1REE2RG56U3ljS1EjXzViUzVSMDIwRWR1REE2RG56U3ljS1EiLz4KLSAgPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24geHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc1BhY2thZ2UiIGhyZWY9InVtYTovL181YlM1UUUyMEVkdURBNkRuelN5Y0tRI181YlM1VFUyMEVkdURBNkRuelN5Y0tRIi8+Ci0gIDxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NQYWNrYWdlIiBocmVmPSJ1bWE6Ly9fNWJTNVFFMjBFZHVEQTZEbnpTeWNLUSNfNWJTNVRrMjBFZHVEQTZEbnpTeWNLUSIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgaHJlZj0idW1hOi8vXzViUzVRRTIwRWR1REE2RG56U3ljS1EjXzViUzVSazIwRWR1REE2RG56U3ljS1EiLz4KLSAgPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24geHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc1BhY2thZ2UiIGhyZWY9InVtYTovL181YlM1UUUyMEVkdURBNkRuelN5Y0tRI181YlM1VDAyMEVkdURBNkRuelN5Y0tRIi8+Ci0gIDxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiBocmVmPSJ1bWE6Ly9fNWJTNVFFMjBFZHVEQTZEbnpTeWNLUSNfNWJTNVNVMjBFZHVEQTZEbnpTeWNLUSIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgaHJlZj0idW1hOi8vXzViUzVRRTIwRWR1REE2RG56U3ljS1EjXzViUzVTRTIwRWR1REE2RG56U3ljS1EiLz4KLSAgPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24geHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIGhyZWY9InVtYTovL181YlM1UUUyMEVkdURBNkRuelN5Y0tRI181YlM1U2syMEVkdURBNkRuelN5Y0tRIi8+Ci0gIDxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiBocmVmPSJ1bWE6Ly9fNWJTNVFFMjBFZHVEQTZEbnpTeWNLUSNfX2tTMzBFMjBFZHVEQTZEbnpTeWNLUSIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzQ29tcG9uZW50IiBocmVmPSJ1bWE6Ly9fSlJSVGNFMjFFZHVEQTZEbnpTeWNLUSNfSlJSVGNFMjFFZHVEQTZEbnpTeWNLUSIvPgotPC9vcmcuZWNsaXBzZS5lcGYudW1hOk1ldGhvZENvbmZpZ3VyYXRpb24+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTUwNzAyLzE1MDcwMmdvbGRlbi9saWJyYXJ5LnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNTA3MDIvMTUwNzAyZ29sZGVuL2xpYnJhcnkueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZTdhYmYwLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNTA3MDIvMTUwNzAyZ29sZGVuL2xpYnJhcnkueG1pCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTx4bWk6WE1JIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYS5yZXNvdXJjZW1hbmFnZXI9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZXBmL3VtYS9yZXNvdXJjZW1hbmFnZXIuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCI+Ci0gIDxvcmcuZWNsaXBzZS5lcGYudW1hLnJlc291cmNlbWFuYWdlcjpSZXNvdXJjZU1hbmFnZXIgeG1pOmlkPSJfM090czhFMjBFZHVEQTZEbnpTeWNLUSIgZ3VpZD0iXzNPdHM4RTIwRWR1REE2RG56U3ljS1EiPgotICAgIDxzdWJNYW5hZ2VycyB4bWk6aWQ9Il81YmZHZ1UyMEVkdURBNkRuelN5Y0tRIiBocmVmPSJ1bWE6Ly9fNWJTNVFFMjBFZHVEQTZEbnpTeWNLUSNfNWJmR2dVMjBFZHVEQTZEbnpTeWNLUSIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iXzNPdHM4VTIwRWR1REE2RG56U3ljS1EiIGlkPSJfM09ubVVFMjBFZHVEQTZEbnpTeWNLUSIgdXJpPSIiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il81YmZHZ2syMEVkdURBNkRuelN5Y0tRIiBpZD0iXzViZkdnVTIwRWR1REE2RG56U3ljS1EiIHVyaT0iUGx1Z0EvcGx1Z2luLnhtaSIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iXzVibE5JRTIwRWR1REE2RG56U3ljS1EiIGlkPSJfNWJTNVFFMjBFZHVEQTZEbnpTeWNLUSIgdXJpPSJQbHVnQS9wbHVnaW4ueG1pIi8+Ci0gIDwvb3JnLmVjbGlwc2UuZXBmLnVtYS5yZXNvdXJjZW1hbmFnZXI6UmVzb3VyY2VNYW5hZ2VyPgotICA8b3JnLmVjbGlwc2UuZXBmLnVtYTpNZXRob2RMaWJyYXJ5IHhtaTppZD0iXzNPbm1VRTIwRWR1REE2RG56U3ljS1EiIG5hbWU9IjE1MDcwMm0iIGd1aWQ9Il8zT25tVUUyMEVkdURBNkRuelN5Y0tRIj4KLSAgICA8bWV0aG9kUGx1Z2lucyB4bWk6aWQ9Il81YlM1UUUyMEVkdURBNkRuelN5Y0tRIiBocmVmPSJ1bWE6Ly9fNWJTNVFFMjBFZHVEQTZEbnpTeWNLUSNfNWJTNVFFMjBFZHVEQTZEbnpTeWNLUSIvPgotICA8L29yZy5lY2xpcHNlLmVwZi51bWE6TWV0aG9kTGlicmFyeT4KLTwveG1pOlhNST4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNTA3MDIvMTUwNzAybS8ucHJvamVjdCBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNTA3MDIvMTUwNzAybS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzM5MmU1NC4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTUwNzAyLzE1MDcwMm0vLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT4xNTA3MDJtPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnByb2plY3QuTWV0aG9kTGlicmFyeVByb2plY3ROYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNTA3MDIvMTUwNzAybS9QbHVnQS9jYXBhYmlsaXR5cGF0dGVybnMvY3BtL2NvbnRlbnQueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE1MDcwMi8xNTA3MDJtL1BsdWdBL2NhcGFiaWxpdHlwYXR0ZXJucy9jcG0vY29udGVudC54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5YjI5ZDAuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE1MDcwMi8xNTA3MDJtL1BsdWdBL2NhcGFiaWxpdHlwYXR0ZXJucy9jcG0vY29udGVudC54bWkKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPG9yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc0Rlc2NyaXB0aW9uIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6ZXBmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZiIgZXBmOnZlcnNpb249IjEuMi4wIiB4bWk6aWQ9Ii1pNU9ZQ0t5SXRlV1YyWEgxRHQycWFnIiBuYW1lPSJjcCxfSlJSVGNVMjFFZHVEQTZEbnpTeWNLUSIgZ3VpZD0iLWk1T1lDS3lJdGVXVjJYSDFEdDJxYWciIHZlcnNpb249IjEuMC4wIj4KLSAgPG1haW5EZXNjcmlwdGlvbj4mbHQ7cCZndDsKLSAgICBtCi0mbHQ7L3AmZ3Q7PC9tYWluRGVzY3JpcHRpb24+Ci0gIDxrZXlDb25zaWRlcmF0aW9ucz4mbHQ7cCZndDsKLSAgICBtCi0mbHQ7L3AmZ3Q7PC9rZXlDb25zaWRlcmF0aW9ucz4KLSAgPHB1cnBvc2U+Jmx0O3AmZ3Q7Ci0gICAgbQotJmx0Oy9wJmd0OzwvcHVycG9zZT4KLSAgPGFsdGVybmF0aXZlcz4mbHQ7cCZndDsKLSAgICBtCi0mbHQ7L3AmZ3Q7PC9hbHRlcm5hdGl2ZXM+Ci0gIDxob3d0b1N0YWZmPiZsdDtwJmd0OwotICAgIG0KLSZsdDsvcCZndDs8L2hvd3RvU3RhZmY+Ci0gIDxleHRlcm5hbElkPm08L2V4dGVybmFsSWQ+Ci0gIDxzY29wZT4mbHQ7cCZndDsKLSAgICBtCi0mbHQ7L3AmZ3Q7PC9zY29wZT4KLSAgPHVzYWdlTm90ZXM+Jmx0O3AmZ3Q7Ci0gICAgbQotJmx0Oy9wJmd0OzwvdXNhZ2VOb3Rlcz4KLTwvb3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzRGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTUwNzAyLzE1MDcwMm0vUGx1Z0EvY2FwYWJpbGl0eXBhdHRlcm5zL2NwbS9tb2RlbC54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTUwNzAyLzE1MDcwMm0vUGx1Z0EvY2FwYWJpbGl0eXBhdHRlcm5zL2NwbS9tb2RlbC54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkZjkzMzMuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE1MDcwMi8xNTA3MDJtL1BsdWdBL2NhcGFiaWxpdHlwYXR0ZXJucy9jcG0vbW9kZWwueG1pCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTx4bWk6WE1JIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYS5yZXNvdXJjZW1hbmFnZXI9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZXBmL3VtYS9yZXNvdXJjZW1hbmFnZXIuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCI+Ci0gIDxvcmcuZWNsaXBzZS5lcGYudW1hLnJlc291cmNlbWFuYWdlcjpSZXNvdXJjZU1hbmFnZXIgeG1pOmlkPSJfSlNPVnNFMjFFZHVEQTZEbnpTeWNLUSIgZ3VpZD0iX0pTT1ZzRTIxRWR1REE2RG56U3ljS1EiPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iX0pTT1ZzVTIxRWR1REE2RG56U3ljS1EiIGlkPSItaTVPWUNLeUl0ZVdWMlhIMUR0MnFhZyIgdXJpPSJjb250ZW50LnhtaSIvPgotICA8L29yZy5lY2xpcHNlLmVwZi51bWEucmVzb3VyY2VtYW5hZ2VyOlJlc291cmNlTWFuYWdlcj4KLSAgPG9yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc0NvbXBvbmVudCB4bWk6aWQ9Il9KUlJUY0UyMUVkdURBNkRuelN5Y0tRIiBuYW1lPSJjcG0iIGd1aWQ9Il9KUlJUY0UyMUVkdURBNkRuelN5Y0tRIj4KLSAgICA8cHJvY2VzcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDYXBhYmlsaXR5UGF0dGVybiIgeG1pOmlkPSJfSlJSVGNVMjFFZHVEQTZEbnpTeWNLUSIgbmFtZT0iY3BtIiBndWlkPSJfSlJSVGNVMjFFZHVEQTZEbnpTeWNLUSIgYnJpZWZEZXNjcmlwdGlvbj0ibSIgcHJlc2VudGF0aW9uTmFtZT0iY3BtIj4KLSAgICAgIDxwcmVzZW50YXRpb24geG1pOmlkPSItaTVPWUNLeUl0ZVdWMlhIMUR0MnFhZyIgaHJlZj0idW1hOi8vLWk1T1lDS3lJdGVXVjJYSDFEdDJxYWcjLWk1T1lDS3lJdGVXVjJYSDFEdDJxYWciLz4KLSAgICAgIDxkZWZhdWx0Q29udGV4dCBocmVmPSJ1bWE6Ly9fM09ubVVFMjBFZHVEQTZEbnpTeWNLUSNfOGZkMDRFMjBFZHVEQTZEbnpTeWNLUSIvPgotICAgICAgPHZhbGlkQ29udGV4dCBocmVmPSJ1bWE6Ly9fM09ubVVFMjBFZHVEQTZEbnpTeWNLUSNfOGZkMDRFMjBFZHVEQTZEbnpTeWNLUSIvPgotICAgIDwvcHJvY2Vzcz4KLSAgPC9vcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NDb21wb25lbnQ+Ci08L3htaTpYTUk+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTUwNzAyLzE1MDcwMm0vUGx1Z0EvcGx1Z2luLnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNTA3MDIvMTUwNzAybS9QbHVnQS9wbHVnaW4ueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZTU4Y2YxLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNTA3MDIvMTUwNzAybS9QbHVnQS9wbHVnaW4ueG1pCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTx4bWk6WE1JIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYS5yZXNvdXJjZW1hbmFnZXI9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZXBmL3VtYS9yZXNvdXJjZW1hbmFnZXIuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCI+Ci0gIDxvcmcuZWNsaXBzZS5lcGYudW1hLnJlc291cmNlbWFuYWdlcjpSZXNvdXJjZU1hbmFnZXIgeG1pOmlkPSJfNWJmR2dVMjBFZHVEQTZEbnpTeWNLUSIgZ3VpZD0iXzViZkdnVTIwRWR1REE2RG56U3ljS1EiPgotICAgIDxzdWJNYW5hZ2VycyB4bWk6aWQ9Il9KU09Wc0UyMUVkdURBNkRuelN5Y0tRIiBocmVmPSJ1bWE6Ly9fSlJSVGNFMjFFZHVEQTZEbnpTeWNLUSNfSlNPVnNFMjFFZHVEQTZEbnpTeWNLUSIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iX0Z3dkw4VTIxRWR1REE2RG56U3ljS1EiIGlkPSItQlF2QWZ0OEtSbk91SzMyTkl0Wkc0USIgdXJpPSJyb2xlcy9uZXdfcm9sZV9tLnhtaSIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iX0g0cFRvRTIxRWR1REE2RG56U3ljS1EiIGlkPSItMUNydXFnUGhENmZqbU1sbk5HcXEtUSIgdXJpPSJ0YXNrcy9uZXdfdGFzayUyMG0ueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfSlJYYUVVMjFFZHVEQTZEbnpTeWNLUSIgaWQ9Il9KUlJUY0UyMUVkdURBNkRuelN5Y0tRIiB1cmk9ImNhcGFiaWxpdHlwYXR0ZXJucy9jcG0vbW9kZWwueG1pIi8+Ci0gIDwvb3JnLmVjbGlwc2UuZXBmLnVtYS5yZXNvdXJjZW1hbmFnZXI6UmVzb3VyY2VNYW5hZ2VyPgotICA8b3JnLmVjbGlwc2UuZXBmLnVtYTpNZXRob2RQbHVnaW4geG1pOmlkPSJfNWJTNVFFMjBFZHVEQTZEbnpTeWNLUSIgbmFtZT0iUGx1Z0EiIGd1aWQ9Il81YlM1UUUyMEVkdURBNkRuelN5Y0tRIj4KLSAgICA8bWV0aG9kUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iXzViUzVRVTIwRWR1REE2RG56U3ljS1EiIG5hbWU9IkNvbnRlbnQiIGd1aWQ9Il81YlM1UVUyMEVkdURBNkRuelN5Y0tRIj4KLSAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il81YlM1UWsyMEVkdURBNkRuelN5Y0tRIiBuYW1lPSJDYXRlZ29yaWVzIiBndWlkPSJfNWJTNVFrMjBFZHVEQTZEbnpTeWNLUSI+Ci0gICAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il81YlM1UTAyMEVkdURBNkRuelN5Y0tRIiBuYW1lPSJEb21haW5zIiBndWlkPSJfNWJTNVEwMjBFZHVEQTZEbnpTeWNLUSIvPgotICAgICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfNWJTNVJFMjBFZHVEQTZEbnpTeWNLUSIgbmFtZT0iRGlzY2lwbGluZXMiIGd1aWQ9Il81YlM1UkUyMEVkdURBNkRuelN5Y0tRIi8+Ci0gICAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il81YlM1UlUyMEVkdURBNkRuelN5Y0tRIiBuYW1lPSJSb2xlU2V0cyIgZ3VpZD0iXzViUzVSVTIwRWR1REE2RG56U3ljS1EiLz4KLSAgICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iXzViUzVSazIwRWR1REE2RG56U3ljS1EiIG5hbWU9IldQIFR5cGVzIiBndWlkPSJfNWJTNVJrMjBFZHVEQTZEbnpTeWNLUSIvPgotICAgICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfNWJTNVIwMjBFZHVEQTZEbnpTeWNLUSIgbmFtZT0iVG9vbHMiIGd1aWQ9Il81YlM1UjAyMEVkdURBNkRuelN5Y0tRIi8+Ci0gICAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il81YlM1U0UyMEVkdURBNkRuelN5Y0tRIiBuYW1lPSJTdGFuZGFyZENhdGVnb3JpZXMiIGd1aWQ9Il81YlM1U0UyMEVkdURBNkRuelN5Y0tRIi8+Ci0gICAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il81YlM1U1UyMEVkdURBNkRuelN5Y0tRIiBuYW1lPSJDdXN0b21DYXRlZ29yaWVzIiBndWlkPSJfNWJTNVNVMjBFZHVEQTZEbnpTeWNLUSI+Ci0gICAgICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iXzViUzVTazIwRWR1REE2RG56U3ljS1EiIG5hbWU9IkhpZGRlbiIgZ3VpZD0iXzViUzVTazIwRWR1REE2RG56U3ljS1EiPgotICAgICAgICAgICAgPGNvbnRlbnRFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDdXN0b21DYXRlZ29yeSIgeG1pOmlkPSJfNWJTNVMwMjBFZHVEQTZEbnpTeWNLUSIgbmFtZT0iQ3VzdG9tIENhdGVnb3JpZXMiIGd1aWQ9Il81YlM1UzAyMEVkdURBNkRuelN5Y0tRIi8+Ci0gICAgICAgICAgPC9jaGlsZFBhY2thZ2VzPgotICAgICAgICA8L2NoaWxkUGFja2FnZXM+Ci0gICAgICA8L2NoaWxkUGFja2FnZXM+Ci0gICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfNWJTNVRFMjBFZHVEQTZEbnpTeWNLUSIgbmFtZT0iQ29yZUNvbnRlbnQiIGd1aWQ9Il81YlM1VEUyMEVkdURBNkRuelN5Y0tRIj4KLSAgICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iX19rUzMwRTIwRWR1REE2RG56U3ljS1EiIG5hbWU9ImNvbnRlbnRfcGFja2FnZV8xIiBndWlkPSJfX2tTMzBFMjBFZHVEQTZEbnpTeWNLUSIgYnJpZWZEZXNjcmlwdGlvbj0iMSI+Ci0gICAgICAgICAgPGNvbnRlbnRFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpSb2xlIiB4bWk6aWQ9Il9CSVlnd0UyMUVkdURBNkRuelN5Y0tRIiBuYW1lPSJuZXdfcm9sZV9tIiBndWlkPSJfQklZZ3dFMjFFZHVEQTZEbnpTeWNLUSIgYnJpZWZEZXNjcmlwdGlvbj0ibSIgcHJlc2VudGF0aW9uTmFtZT0iTmV3IFJvbGUgbSI+Ci0gICAgICAgICAgICA8cHJlc2VudGF0aW9uIHhtaTppZD0iLUJRdkFmdDhLUm5PdUszMk5JdFpHNFEiIGhyZWY9InVtYTovLy1CUXZBZnQ4S1JuT3VLMzJOSXRaRzRRIy1CUXZBZnQ4S1JuT3VLMzJOSXRaRzRRIi8+Ci0gICAgICAgICAgPC9jb250ZW50RWxlbWVudHM+Ci0gICAgICAgICAgPGNvbnRlbnRFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpUYXNrIiB4bWk6aWQ9Il9HZXJRQUUyMUVkdURBNkRuelN5Y0tRIiBuYW1lPSJuZXdfdGFzayBtIiBndWlkPSJfR2VyUUFFMjFFZHVEQTZEbnpTeWNLUSIgYnJpZWZEZXNjcmlwdGlvbj0ibSIgcHJlc2VudGF0aW9uTmFtZT0iTmV3IFRhc2sgbSI+Ci0gICAgICAgICAgICA8cHJlc2VudGF0aW9uIHhtaTppZD0iLTFDcnVxZ1BoRDZmam1NbG5OR3FxLVEiIGhyZWY9InVtYTovLy0xQ3J1cWdQaEQ2ZmptTWxuTkdxcS1RIy0xQ3J1cWdQaEQ2ZmptTWxuTkdxcS1RIi8+Ci0gICAgICAgICAgPC9jb250ZW50RWxlbWVudHM+Ci0gICAgICAgIDwvY2hpbGRQYWNrYWdlcz4KLSAgICAgIDwvY2hpbGRQYWNrYWdlcz4KLSAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NQYWNrYWdlIiB4bWk6aWQ9Il81YlM1VFUyMEVkdURBNkRuelN5Y0tRIiBuYW1lPSJDYXBhYmlsaXR5UGF0dGVybnMiIGd1aWQ9Il81YlM1VFUyMEVkdURBNkRuelN5Y0tRIj4KLSAgICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc0NvbXBvbmVudCIgeG1pOmlkPSJfSlJSVGNFMjFFZHVEQTZEbnpTeWNLUSIgaHJlZj0idW1hOi8vX0pSUlRjRTIxRWR1REE2RG56U3ljS1EjX0pSUlRjRTIxRWR1REE2RG56U3ljS1EiLz4KLSAgICAgIDwvY2hpbGRQYWNrYWdlcz4KLSAgICA8L21ldGhvZFBhY2thZ2VzPgotICAgIDxtZXRob2RQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzUGFja2FnZSIgeG1pOmlkPSJfNWJTNVRrMjBFZHVEQTZEbnpTeWNLUSIgbmFtZT0iRGVsaXZlcnlQcm9jZXNzZXMiIGd1aWQ9Il81YlM1VGsyMEVkdURBNkRuelN5Y0tRIi8+Ci0gICAgPG1ldGhvZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NQYWNrYWdlIiB4bWk6aWQ9Il81YlM1VDAyMEVkdURBNkRuelN5Y0tRIiBuYW1lPSJQcm9jZXNzQ29udHJpYnV0aW9ucyIgZ3VpZD0iXzViUzVUMDIwRWR1REE2RG56U3ljS1EiLz4KLSAgPC9vcmcuZWNsaXBzZS5lcGYudW1hOk1ldGhvZFBsdWdpbj4KLTwveG1pOlhNST4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNTA3MDIvMTUwNzAybS9QbHVnQS9yb2xlcy9uZXdfcm9sZV9tLnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNTA3MDIvMTUwNzAybS9QbHVnQS9yb2xlcy9uZXdfcm9sZV9tLnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzhiNTVmOC4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTUwNzAyLzE1MDcwMm0vUGx1Z0Evcm9sZXMvbmV3X3JvbGVfbS54bWkKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPG9yZy5lY2xpcHNlLmVwZi51bWE6Um9sZURlc2NyaXB0aW9uIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6ZXBmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZiIgZXBmOnZlcnNpb249IjEuMi4wIiB4bWk6aWQ9Ii1CUXZBZnQ4S1JuT3VLMzJOSXRaRzRRIiBuYW1lPSJuZXdfcm9sZV9tLF9CSVlnd0UyMUVkdURBNkRuelN5Y0tRIiBndWlkPSItQlF2QWZ0OEtSbk91SzMyTkl0Wkc0USIgYXV0aG9ycz0ibSIgY2hhbmdlRGF0ZT0iMjAwNi0wOS0yNlQxNjoxNjo0MS41ODAtMDcwMCIgY2hhbmdlRGVzY3JpcHRpb249IjEiIHZlcnNpb249IjEuMC4wIj4KLSAgPG1haW5EZXNjcmlwdGlvbj4mbHQ7cCZndDsKLSAgICBtCi0mbHQ7L3AmZ3Q7PC9tYWluRGVzY3JpcHRpb24+Ci0gIDxza2lsbHM+Jmx0O3AmZ3Q7Ci0gICAgbQotJmx0Oy9wJmd0Ozwvc2tpbGxzPgotICA8YXNzaWdubWVudEFwcHJvYWNoZXM+MTwvYXNzaWdubWVudEFwcHJvYWNoZXM+Ci0gIDxzeW5vbnltcz4xPC9zeW5vbnltcz4KLTwvb3JnLmVjbGlwc2UuZXBmLnVtYTpSb2xlRGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTUwNzAyLzE1MDcwMm0vUGx1Z0EvdGFza3MvbmV3X3Rhc2sgbS54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTUwNzAyLzE1MDcwMm0vUGx1Z0EvdGFza3MvbmV3X3Rhc2sgbS54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3NjA0OWQuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE1MDcwMi8xNTA3MDJtL1BsdWdBL3Rhc2tzL25ld190YXNrIG0ueG1pCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxvcmcuZWNsaXBzZS5lcGYudW1hOlRhc2tEZXNjcmlwdGlvbiB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCIgeG1pOmlkPSItMUNydXFnUGhENmZqbU1sbk5HcXEtUSIgbmFtZT0ibmV3X3Rhc2sgbSxfR2VyUUFFMjFFZHVEQTZEbnpTeWNLUSIgZ3VpZD0iLTFDcnVxZ1BoRDZmam1NbG5OR3FxLVEiIGNoYW5nZURhdGU9IjIwMDYtMDktMjZUMTY6MTc6MDEuOTc5LTA3MDAiIHZlcnNpb249IjEuMC4wIj4KLSAgPG1haW5EZXNjcmlwdGlvbj4mbHQ7cCZndDsKLSAgICBtCi0mbHQ7L3AmZ3Q7PC9tYWluRGVzY3JpcHRpb24+Ci0gIDxrZXlDb25zaWRlcmF0aW9ucz4mbHQ7cCZndDsKLSAgICBtCi0mbHQ7L3AmZ3Q7PC9rZXlDb25zaWRlcmF0aW9ucz4KLSAgPHB1cnBvc2U+Jmx0O3AmZ3Q7Ci0gICAgbQotJmx0Oy9wJmd0OzwvcHVycG9zZT4KLSAgPGFsdGVybmF0aXZlcz4mbHQ7cCZndDsKLSAgICBtCi0mbHQ7L3AmZ3Q7PC9hbHRlcm5hdGl2ZXM+Ci08L29yZy5lY2xpcHNlLmVwZi51bWE6VGFza0Rlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE1MDcwMi8xNTA3MDJtL2NvbmZpZ3VyYXRpb25zL0NvbmZpZ0EueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE1MDcwMi8xNTA3MDJtL2NvbmZpZ3VyYXRpb25zL0NvbmZpZ0EueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MmI5YmY1Li4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNTA3MDIvMTUwNzAybS9jb25maWd1cmF0aW9ucy9Db25maWdBLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08b3JnLmVjbGlwc2UuZXBmLnVtYTpNZXRob2RDb25maWd1cmF0aW9uIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6ZXBmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZiIgZXBmOnZlcnNpb249IjEuMi4wIiB4bWk6aWQ9Il84ZmQwNEUyMEVkdURBNkRuelN5Y0tRIiBuYW1lPSJDb25maWdBIiBndWlkPSJfOGZkMDRFMjBFZHVEQTZEbnpTeWNLUSI+Ci0gIDxtZXRob2RQbHVnaW5TZWxlY3Rpb24gaHJlZj0idW1hOi8vXzViUzVRRTIwRWR1REE2RG56U3ljS1EjXzViUzVRRTIwRWR1REE2RG56U3ljS1EiLz4KLSAgPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24geHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIGhyZWY9InVtYTovL181YlM1UUUyMEVkdURBNkRuelN5Y0tRI181YlM1VEUyMEVkdURBNkRuelN5Y0tRIi8+Ci0gIDxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiBocmVmPSJ1bWE6Ly9fNWJTNVFFMjBFZHVEQTZEbnpTeWNLUSNfNWJTNVFVMjBFZHVEQTZEbnpTeWNLUSIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgaHJlZj0idW1hOi8vXzViUzVRRTIwRWR1REE2RG56U3ljS1EjXzViUzVSVTIwRWR1REE2RG56U3ljS1EiLz4KLSAgPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24geHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIGhyZWY9InVtYTovL181YlM1UUUyMEVkdURBNkRuelN5Y0tRI181YlM1UWsyMEVkdURBNkRuelN5Y0tRIi8+Ci0gIDxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiBocmVmPSJ1bWE6Ly9fNWJTNVFFMjBFZHVEQTZEbnpTeWNLUSNfNWJTNVJFMjBFZHVEQTZEbnpTeWNLUSIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgaHJlZj0idW1hOi8vXzViUzVRRTIwRWR1REE2RG56U3ljS1EjXzViUzVRMDIwRWR1REE2RG56U3ljS1EiLz4KLSAgPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24geHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIGhyZWY9InVtYTovL181YlM1UUUyMEVkdURBNkRuelN5Y0tRI181YlM1UjAyMEVkdURBNkRuelN5Y0tRIi8+Ci0gIDxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NQYWNrYWdlIiBocmVmPSJ1bWE6Ly9fNWJTNVFFMjBFZHVEQTZEbnpTeWNLUSNfNWJTNVRVMjBFZHVEQTZEbnpTeWNLUSIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzUGFja2FnZSIgaHJlZj0idW1hOi8vXzViUzVRRTIwRWR1REE2RG56U3ljS1EjXzViUzVUazIwRWR1REE2RG56U3ljS1EiLz4KLSAgPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24geHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIGhyZWY9InVtYTovL181YlM1UUUyMEVkdURBNkRuelN5Y0tRI181YlM1UmsyMEVkdURBNkRuelN5Y0tRIi8+Ci0gIDxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NQYWNrYWdlIiBocmVmPSJ1bWE6Ly9fNWJTNVFFMjBFZHVEQTZEbnpTeWNLUSNfNWJTNVQwMjBFZHVEQTZEbnpTeWNLUSIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgaHJlZj0idW1hOi8vXzViUzVRRTIwRWR1REE2RG56U3ljS1EjXzViUzVTVTIwRWR1REE2RG56U3ljS1EiLz4KLSAgPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24geHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIGhyZWY9InVtYTovL181YlM1UUUyMEVkdURBNkRuelN5Y0tRI181YlM1U0UyMEVkdURBNkRuelN5Y0tRIi8+Ci0gIDxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiBocmVmPSJ1bWE6Ly9fNWJTNVFFMjBFZHVEQTZEbnpTeWNLUSNfNWJTNVNrMjBFZHVEQTZEbnpTeWNLUSIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgaHJlZj0idW1hOi8vXzViUzVRRTIwRWR1REE2RG56U3ljS1EjX19rUzMwRTIwRWR1REE2RG56U3ljS1EiLz4KLSAgPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24geHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc0NvbXBvbmVudCIgaHJlZj0idW1hOi8vX0pSUlRjRTIxRWR1REE2RG56U3ljS1EjX0pSUlRjRTIxRWR1REE2RG56U3ljS1EiLz4KLTwvb3JnLmVjbGlwc2UuZXBmLnVtYTpNZXRob2RDb25maWd1cmF0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE1MDcwMi8xNTA3MDJtL2xpYnJhcnkueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE1MDcwMi8xNTA3MDJtL2xpYnJhcnkueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZTdhYmYwLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNTA3MDIvMTUwNzAybS9saWJyYXJ5LnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08eG1pOlhNSSB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWEucmVzb3VyY2VtYW5hZ2VyPSJodHRwOi8vL29yZy9lY2xpcHNlL2VwZi91bWEvcmVzb3VyY2VtYW5hZ2VyLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiPgotICA8b3JnLmVjbGlwc2UuZXBmLnVtYS5yZXNvdXJjZW1hbmFnZXI6UmVzb3VyY2VNYW5hZ2VyIHhtaTppZD0iXzNPdHM4RTIwRWR1REE2RG56U3ljS1EiIGd1aWQ9Il8zT3RzOEUyMEVkdURBNkRuelN5Y0tRIj4KLSAgICA8c3ViTWFuYWdlcnMgeG1pOmlkPSJfNWJmR2dVMjBFZHVEQTZEbnpTeWNLUSIgaHJlZj0idW1hOi8vXzViUzVRRTIwRWR1REE2RG56U3ljS1EjXzViZkdnVTIwRWR1REE2RG56U3ljS1EiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il8zT3RzOFUyMEVkdURBNkRuelN5Y0tRIiBpZD0iXzNPbm1VRTIwRWR1REE2RG56U3ljS1EiIHVyaT0iIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfNWJmR2drMjBFZHVEQTZEbnpTeWNLUSIgaWQ9Il81YmZHZ1UyMEVkdURBNkRuelN5Y0tRIiB1cmk9IlBsdWdBL3BsdWdpbi54bWkiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il81YmxOSUUyMEVkdURBNkRuelN5Y0tRIiBpZD0iXzViUzVRRTIwRWR1REE2RG56U3ljS1EiIHVyaT0iUGx1Z0EvcGx1Z2luLnhtaSIvPgotICA8L29yZy5lY2xpcHNlLmVwZi51bWEucmVzb3VyY2VtYW5hZ2VyOlJlc291cmNlTWFuYWdlcj4KLSAgPG9yZy5lY2xpcHNlLmVwZi51bWE6TWV0aG9kTGlicmFyeSB4bWk6aWQ9Il8zT25tVUUyMEVkdURBNkRuelN5Y0tRIiBuYW1lPSIxNTA3MDJtIiBndWlkPSJfM09ubVVFMjBFZHVEQTZEbnpTeWNLUSI+Ci0gICAgPG1ldGhvZFBsdWdpbnMgeG1pOmlkPSJfNWJTNVFFMjBFZHVEQTZEbnpTeWNLUSIgaHJlZj0idW1hOi8vXzViUzVRRTIwRWR1REE2RG56U3ljS1EjXzViUzVRRTIwRWR1REE2RG56U3ljS1EiLz4KLSAgPC9vcmcuZWNsaXBzZS5lcGYudW1hOk1ldGhvZExpYnJhcnk+Ci08L3htaTpYTUk+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTU3OTMyLzE1NzkzMi50YyBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNTc5MzIvMTU3OTMyLnRjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YjI3OTU2Li4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNTc5MzIvMTU3OTMyLnRjCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxNZXRob2RMaWJyYXJ5VGVzdD4KLQkKLQk8Q29weUxpYnJhcnkgbGliRm9sZGVyTmFtZT0iMTU3OTMyZ29sZGVuIj4KLQk8L0NvcHlMaWJyYXJ5PgkKLQkKLQk8T3BlbkxpYnJhcnkgbGliRm9sZGVyTmFtZT0iMTU3OTMyZ29sZGVuIj4KLQk8L09wZW5MaWJyYXJ5PgotCi0JPENvcHlMaWJyYXJ5IGxpYkZvbGRlck5hbWU9IjE1NzkzMm0iPgotCTwvQ29weUxpYnJhcnk+CQotCQotCTxPcGVuTGlicmFyeSBsaWJGb2xkZXJOYW1lPSIxNTc5MzJtIj4KLQk8L09wZW5MaWJyYXJ5PgotCQotCTxJbXBvcnRYbWwgaW1wb3J0Rm9sZGVyTmFtZT0iMTU3OTMyZSI+Ci0JPC9JbXBvcnRYbWw+Ci0JCi0JPENvbXBhcmVUb0xpYnJhcnkgCi0JCWdvbGRlbkxpYkZvbGRlck5hbWU9IjE1NzkzMmdvbGRlbiIgCi0JCWRpZmZDb3VudD0iMCIgCi0JCWVsZW1lbnRDb3VudD0iMzMiCi0JCXVzZU5hbWVBc0lkPSJ0cnVlIj4JCQotCTwvQ29tcGFyZVRvTGlicmFyeT4KLQotPC9NZXRob2RMaWJyYXJ5VGVzdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTU3OTMyLzE1NzkzMmUvMTU3OTMyZS54bWwgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTU3OTMyLzE1NzkzMmUvMTU3OTMyZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4NzNlOWYuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE1NzkzMi8xNTc5MzJlLzE1NzkzMmUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHVtYTpNZXRob2RMaWJyYXJ5IHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhtbG5zOnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC4zIiBuYW1lPSIxNTc5MzJtIiBicmllZkRlc2NyaXB0aW9uPSIiIGlkPSJfZUdoMm9FMnJFZHVXSmRmWjlnbjZKUSIgb3JkZXJpbmdHdWlkZT0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIHRvb2w9ImVwZj0xLjIuMCI+Ci0gIDxNZXRob2RQbHVnaW4gbmFtZT0ibmV3X3BsdWctaW4iIGJyaWVmRGVzY3JpcHRpb249IiIgaWQ9Il9mNDhQY0UyckVkdVdKZGZaOWduNkpRIiBvcmRlcmluZ0d1aWRlPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgdXNlckNoYW5nZWFibGU9InRydWUiPgotICAgIDxNZXRob2RQYWNrYWdlIHhzaTp0eXBlPSJ1bWE6Q29udGVudENhdGVnb3J5UGFja2FnZSIgbmFtZT0iQ29udGVudENhdGVnb3JpZXMiIGlkPSJfa0VwYTRFMnJFZHVXSmRmWjlnbjZKUSIvPgotICA8L01ldGhvZFBsdWdpbj4KLTwvdW1hOk1ldGhvZExpYnJhcnk+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTU3OTMyLzE1NzkzMmdvbGRlbi8ucHJvamVjdCBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNTc5MzIvMTU3OTMyZ29sZGVuLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZDM5YThlLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNTc5MzIvMTU3OTMyZ29sZGVuLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+MTU3OTMyZ29sZGVuPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnByb2plY3QuTWV0aG9kTGlicmFyeVByb2plY3ROYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNTc5MzIvMTU3OTMyZ29sZGVuL2xpYnJhcnkueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE1NzkzMi8xNTc5MzJnb2xkZW4vbGlicmFyeS54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmY2I5ZTguLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE1NzkzMi8xNTc5MzJnb2xkZW4vbGlicmFyeS54bWkKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHhtaTpYTUkgeG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hLnJlc291cmNlbWFuYWdlcj0iaHR0cDovLy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Jlc291cmNlbWFuYWdlci5lY29yZSIgeG1sbnM6ZXBmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZiIgZXBmOnZlcnNpb249IjEuMi4wIj4KLSAgPG9yZy5lY2xpcHNlLmVwZi51bWEucmVzb3VyY2VtYW5hZ2VyOlJlc291cmNlTWFuYWdlciB4bWk6aWQ9Il9wb1pYVUUyckVkdWlHNTNOcXZFNEhnIiBndWlkPSJfcG9aWFVFMnJFZHVpRzUzTnF2RTRIZyI+Ci0gICAgPHN1Yk1hbmFnZXJzIHhtaTppZD0iX3FiZm9NRTJyRWR1aUc1M05xdkU0SGciIGhyZWY9InVtYTovL19xYlpoa0UyckVkdWlHNTNOcXZFNEhnI19xYmZvTUUyckVkdWlHNTNOcXZFNEhnIi8+Ci0gICAgPHN1Yk1hbmFnZXJzIHhtaTppZD0iXzIwU0owRTJyRWR1dzBPdWxNYjJKMnciIGhyZWY9InVtYTovL19mNDhQY0UyckVkdVdKZGZaOWduNkpRI18yMFNKMEUyckVkdXcwT3VsTWIySjJ3Ii8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfcG9sa2tFMnJFZHVpRzUzTnF2RTRIZyIgaWQ9Il9wb1RRc0UyckVkdWlHNTNOcXZFNEhnIiB1cmk9IiIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iX3FiZm9NVTJyRWR1aUc1M05xdkU0SGciIGlkPSJfcWJmb01FMnJFZHVpRzUzTnF2RTRIZyIgdXJpPSJuZXdfcGx1Zy1pbi9wbHVnaW4ueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfcWJmb01rMnJFZHVpRzUzTnF2RTRIZyIgaWQ9Il9xYlpoa0UyckVkdWlHNTNOcXZFNEhnIiB1cmk9Im5ld19wbHVnLWluX3JlbmFtZWQvcGx1Z2luLnhtaSIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iXzIwU0owVTJyRWR1dzBPdWxNYjJKMnciIGlkPSJfMjBTSjBFMnJFZHV3ME91bE1iMkoydyIgdXJpPSJuZXdfcGx1Zy1pbi9wbHVnaW4ueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfMjBTSjBrMnJFZHV3ME91bE1iMkoydyIgaWQ9Il9mNDhQY0UyckVkdVdKZGZaOWduNkpRIiB1cmk9Im5ld19wbHVnLWluL3BsdWdpbi54bWkiLz4KLSAgPC9vcmcuZWNsaXBzZS5lcGYudW1hLnJlc291cmNlbWFuYWdlcjpSZXNvdXJjZU1hbmFnZXI+Ci0gIDxvcmcuZWNsaXBzZS5lcGYudW1hOk1ldGhvZExpYnJhcnkgeG1pOmlkPSJfZUdoMm9FMnJFZHVXSmRmWjlnbjZKUSIgbmFtZT0iMTU3OTMybSIgZ3VpZD0iX2VHaDJvRTJyRWR1V0pkZlo5Z242SlEiPgotICAgIDxtZXRob2RQbHVnaW5zIHhtaTppZD0iX3FiWmhrRTJyRWR1aUc1M05xdkU0SGciIGhyZWY9InVtYTovL19xYlpoa0UyckVkdWlHNTNOcXZFNEhnI19xYlpoa0UyckVkdWlHNTNOcXZFNEhnIi8+Ci0gICAgPG1ldGhvZFBsdWdpbnMgeG1pOmlkPSJfZjQ4UGNFMnJFZHVXSmRmWjlnbjZKUSIgaHJlZj0idW1hOi8vX2Y0OFBjRTJyRWR1V0pkZlo5Z242SlEjX2Y0OFBjRTJyRWR1V0pkZlo5Z242SlEiLz4KLSAgPC9vcmcuZWNsaXBzZS5lcGYudW1hOk1ldGhvZExpYnJhcnk+Ci08L3htaTpYTUk+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTU3OTMyLzE1NzkzMmdvbGRlbi9uZXdfcGx1Zy1pbi9wbHVnaW4ueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE1NzkzMi8xNTc5MzJnb2xkZW4vbmV3X3BsdWctaW4vcGx1Z2luLnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWE5Zjk4MS4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTU3OTMyLzE1NzkzMmdvbGRlbi9uZXdfcGx1Zy1pbi9wbHVnaW4ueG1pCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTx4bWk6WE1JIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYS5yZXNvdXJjZW1hbmFnZXI9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZXBmL3VtYS9yZXNvdXJjZW1hbmFnZXIuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCI+Ci0gIDxvcmcuZWNsaXBzZS5lcGYudW1hLnJlc291cmNlbWFuYWdlcjpSZXNvdXJjZU1hbmFnZXIgeG1pOmlkPSJfMjBTSjBFMnJFZHV3ME91bE1iMkoydyIgZ3VpZD0iXzIwU0owRTJyRWR1dzBPdWxNYjJKMnciLz4KLSAgPG9yZy5lY2xpcHNlLmVwZi51bWE6TWV0aG9kUGx1Z2luIHhtaTppZD0iX2Y0OFBjRTJyRWR1V0pkZlo5Z242SlEiIG5hbWU9Im5ld19wbHVnLWluIiBndWlkPSJfZjQ4UGNFMnJFZHVXSmRmWjlnbjZKUSI+Ci0gICAgPG1ldGhvZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il8yejV2VUUyckVkdXcwT3VsTWIySjJ3IiBuYW1lPSJDb250ZW50IiBndWlkPSJfMno1dlVFMnJFZHV3ME91bE1iMkoydyI+Ci0gICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfMno1dlVVMnJFZHV3ME91bE1iMkoydyIgbmFtZT0iQ2F0ZWdvcmllcyIgZ3VpZD0iXzJ6NXZVVTJyRWR1dzBPdWxNYjJKMnciPgotICAgICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfMno1dlVrMnJFZHV3ME91bE1iMkoydyIgbmFtZT0iRG9tYWlucyIgZ3VpZD0iXzJ6NXZVazJyRWR1dzBPdWxNYjJKMnciLz4KLSAgICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iXzJ6NXZVMDJyRWR1dzBPdWxNYjJKMnciIG5hbWU9IkRpc2NpcGxpbmVzIiBndWlkPSJfMno1dlUwMnJFZHV3ME91bE1iMkoydyIvPgotICAgICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfMno1dlZFMnJFZHV3ME91bE1iMkoydyIgbmFtZT0iUm9sZVNldHMiIGd1aWQ9Il8yejV2VkUyckVkdXcwT3VsTWIySjJ3Ii8+Ci0gICAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il8yejV2VlUyckVkdXcwT3VsTWIySjJ3IiBuYW1lPSJXUCBUeXBlcyIgZ3VpZD0iXzJ6NXZWVTJyRWR1dzBPdWxNYjJKMnciLz4KLSAgICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iXzJ6NXZWazJyRWR1dzBPdWxNYjJKMnciIG5hbWU9IlRvb2xzIiBndWlkPSJfMno1dlZrMnJFZHV3ME91bE1iMkoydyIvPgotICAgICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfMno1dlYwMnJFZHV3ME91bE1iMkoydyIgbmFtZT0iU3RhbmRhcmRDYXRlZ29yaWVzIiBndWlkPSJfMno1dlYwMnJFZHV3ME91bE1iMkoydyIvPgotICAgICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfMno1dldFMnJFZHV3ME91bE1iMkoydyIgbmFtZT0iQ3VzdG9tQ2F0ZWdvcmllcyIgZ3VpZD0iXzJ6NXZXRTJyRWR1dzBPdWxNYjJKMnciPgotICAgICAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il8yejV2V1UyckVkdXcwT3VsTWIySjJ3IiBuYW1lPSJIaWRkZW4iIGd1aWQ9Il8yejV2V1UyckVkdXcwT3VsTWIySjJ3Ij4KLSAgICAgICAgICAgIDxjb250ZW50RWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q3VzdG9tQ2F0ZWdvcnkiIHhtaTppZD0iXzJ6NXZXazJyRWR1dzBPdWxNYjJKMnciIG5hbWU9IkN1c3RvbSBDYXRlZ29yaWVzIiBndWlkPSJfMno1dldrMnJFZHV3ME91bE1iMkoydyIgcHJlc2VudGF0aW9uTmFtZT0iQ3VzdG9tIENhdGVnb3JpZXMiLz4KLSAgICAgICAgICA8L2NoaWxkUGFja2FnZXM+Ci0gICAgICAgIDwvY2hpbGRQYWNrYWdlcz4KLSAgICAgIDwvY2hpbGRQYWNrYWdlcz4KLSAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il8yejV2VzAyckVkdXcwT3VsTWIySjJ3IiBuYW1lPSJDb3JlQ29udGVudCIgZ3VpZD0iXzJ6NXZXMDJyRWR1dzBPdWxNYjJKMnciLz4KLSAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NQYWNrYWdlIiB4bWk6aWQ9Il8yejV2WEUyckVkdXcwT3VsTWIySjJ3IiBuYW1lPSJDYXBhYmlsaXR5UGF0dGVybnMiIGd1aWQ9Il8yejV2WEUyckVkdXcwT3VsTWIySjJ3Ii8+Ci0gICAgPC9tZXRob2RQYWNrYWdlcz4KLSAgICA8bWV0aG9kUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc1BhY2thZ2UiIHhtaTppZD0iXzJ6NXZYVTJyRWR1dzBPdWxNYjJKMnciIG5hbWU9IkRlbGl2ZXJ5UHJvY2Vzc2VzIiBndWlkPSJfMno1dlhVMnJFZHV3ME91bE1iMkoydyIvPgotICAgIDxtZXRob2RQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzUGFja2FnZSIgeG1pOmlkPSJfMno1dlhrMnJFZHV3ME91bE1iMkoydyIgbmFtZT0iUHJvY2Vzc0NvbnRyaWJ1dGlvbnMiIGd1aWQ9Il8yejV2WGsyckVkdXcwT3VsTWIySjJ3Ii8+Ci0gIDwvb3JnLmVjbGlwc2UuZXBmLnVtYTpNZXRob2RQbHVnaW4+Ci08L3htaTpYTUk+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTU3OTMyLzE1NzkzMmdvbGRlbi9uZXdfcGx1Zy1pbl9yZW5hbWVkL3BsdWdpbi54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTU3OTMyLzE1NzkzMmdvbGRlbi9uZXdfcGx1Zy1pbl9yZW5hbWVkL3BsdWdpbi54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzODYwY2IuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE1NzkzMi8xNTc5MzJnb2xkZW4vbmV3X3BsdWctaW5fcmVuYW1lZC9wbHVnaW4ueG1pCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTx4bWk6WE1JIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYS5yZXNvdXJjZW1hbmFnZXI9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZXBmL3VtYS9yZXNvdXJjZW1hbmFnZXIuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCI+Ci0gIDxvcmcuZWNsaXBzZS5lcGYudW1hLnJlc291cmNlbWFuYWdlcjpSZXNvdXJjZU1hbmFnZXIgeG1pOmlkPSJfcWJmb01FMnJFZHVpRzUzTnF2RTRIZyIgZ3VpZD0iX3FiZm9NRTJyRWR1aUc1M05xdkU0SGciLz4KLSAgPG9yZy5lY2xpcHNlLmVwZi51bWE6TWV0aG9kUGx1Z2luIHhtaTppZD0iX3FiWmhrRTJyRWR1aUc1M05xdkU0SGciIG5hbWU9Im5ld19wbHVnLWluX3JlbmFtZWQiIGd1aWQ9Il9xYlpoa0UyckVkdWlHNTNOcXZFNEhnIj4KLSAgICA8bWV0aG9kUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iX3FiWmhrVTJyRWR1aUc1M05xdkU0SGciIG5hbWU9IkNvbnRlbnQiIGd1aWQ9Il9xYlpoa1UyckVkdWlHNTNOcXZFNEhnIj4KLSAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il9xYlpoa2syckVkdWlHNTNOcXZFNEhnIiBuYW1lPSJDYXRlZ29yaWVzIiBndWlkPSJfcWJaaGtrMnJFZHVpRzUzTnF2RTRIZyI+Ci0gICAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il9xYlpoazAyckVkdWlHNTNOcXZFNEhnIiBuYW1lPSJEb21haW5zIiBndWlkPSJfcWJaaGswMnJFZHVpRzUzTnF2RTRIZyIvPgotICAgICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfcWJaaGxFMnJFZHVpRzUzTnF2RTRIZyIgbmFtZT0iRGlzY2lwbGluZXMiIGd1aWQ9Il9xYlpobEUyckVkdWlHNTNOcXZFNEhnIi8+Ci0gICAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il9xYlpobFUyckVkdWlHNTNOcXZFNEhnIiBuYW1lPSJSb2xlU2V0cyIgZ3VpZD0iX3FiWmhsVTJyRWR1aUc1M05xdkU0SGciLz4KLSAgICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iX3FiWmhsazJyRWR1aUc1M05xdkU0SGciIG5hbWU9IldQIFR5cGVzIiBndWlkPSJfcWJaaGxrMnJFZHVpRzUzTnF2RTRIZyIvPgotICAgICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfcWJaaGwwMnJFZHVpRzUzTnF2RTRIZyIgbmFtZT0iVG9vbHMiIGd1aWQ9Il9xYlpobDAyckVkdWlHNTNOcXZFNEhnIi8+Ci0gICAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il9xYlpobUUyckVkdWlHNTNOcXZFNEhnIiBuYW1lPSJTdGFuZGFyZENhdGVnb3JpZXMiIGd1aWQ9Il9xYlpobUUyckVkdWlHNTNOcXZFNEhnIi8+Ci0gICAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il9xYlpobVUyckVkdWlHNTNOcXZFNEhnIiBuYW1lPSJDdXN0b21DYXRlZ29yaWVzIiBndWlkPSJfcWJaaG1VMnJFZHVpRzUzTnF2RTRIZyI+Ci0gICAgICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iX3FiWmhtazJyRWR1aUc1M05xdkU0SGciIG5hbWU9IkhpZGRlbiIgZ3VpZD0iX3FiWmhtazJyRWR1aUc1M05xdkU0SGciPgotICAgICAgICAgICAgPGNvbnRlbnRFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDdXN0b21DYXRlZ29yeSIgeG1pOmlkPSJfcWJaaG0wMnJFZHVpRzUzTnF2RTRIZyIgbmFtZT0iQ3VzdG9tIENhdGVnb3JpZXMiIGd1aWQ9Il9xYlpobTAyckVkdWlHNTNOcXZFNEhnIiBwcmVzZW50YXRpb25OYW1lPSJDdXN0b20gQ2F0ZWdvcmllcyIvPgotICAgICAgICAgIDwvY2hpbGRQYWNrYWdlcz4KLSAgICAgICAgPC9jaGlsZFBhY2thZ2VzPgotICAgICAgPC9jaGlsZFBhY2thZ2VzPgotICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iX3FiWmhuRTJyRWR1aUc1M05xdkU0SGciIG5hbWU9IkNvcmVDb250ZW50IiBndWlkPSJfcWJaaG5FMnJFZHVpRzUzTnF2RTRIZyIvPgotICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc1BhY2thZ2UiIHhtaTppZD0iX3FiWmhuVTJyRWR1aUc1M05xdkU0SGciIG5hbWU9IkNhcGFiaWxpdHlQYXR0ZXJucyIgZ3VpZD0iX3FiWmhuVTJyRWR1aUc1M05xdkU0SGciLz4KLSAgICA8L21ldGhvZFBhY2thZ2VzPgotICAgIDxtZXRob2RQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzUGFja2FnZSIgeG1pOmlkPSJfcWJaaG5rMnJFZHVpRzUzTnF2RTRIZyIgbmFtZT0iRGVsaXZlcnlQcm9jZXNzZXMiIGd1aWQ9Il9xYlpobmsyckVkdWlHNTNOcXZFNEhnIi8+Ci0gICAgPG1ldGhvZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NQYWNrYWdlIiB4bWk6aWQ9Il9xYlpobjAyckVkdWlHNTNOcXZFNEhnIiBuYW1lPSJQcm9jZXNzQ29udHJpYnV0aW9ucyIgZ3VpZD0iX3FiWmhuMDJyRWR1aUc1M05xdkU0SGciLz4KLSAgPC9vcmcuZWNsaXBzZS5lcGYudW1hOk1ldGhvZFBsdWdpbj4KLTwveG1pOlhNST4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNTc5MzIvMTU3OTMybS8ucHJvamVjdCBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNTc5MzIvMTU3OTMybS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzcyMmU0YS4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTU3OTMyLzE1NzkzMm0vLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT4xNTc5MzJtPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnByb2plY3QuTWV0aG9kTGlicmFyeVByb2plY3ROYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNTc5MzIvMTU3OTMybS9saWJyYXJ5LnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNTc5MzIvMTU3OTMybS9saWJyYXJ5LnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzNmNDY5Yi4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTU3OTMyLzE1NzkzMm0vbGlicmFyeS54bWkKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHhtaTpYTUkgeG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hLnJlc291cmNlbWFuYWdlcj0iaHR0cDovLy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Jlc291cmNlbWFuYWdlci5lY29yZSIgeG1sbnM6ZXBmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZiIgZXBmOnZlcnNpb249IjEuMi4wIj4KLSAgPG9yZy5lY2xpcHNlLmVwZi51bWEucmVzb3VyY2VtYW5hZ2VyOlJlc291cmNlTWFuYWdlciB4bWk6aWQ9Il9wb1pYVUUyckVkdWlHNTNOcXZFNEhnIiBndWlkPSJfcG9aWFVFMnJFZHVpRzUzTnF2RTRIZyI+Ci0gICAgPHN1Yk1hbmFnZXJzIHhtaTppZD0iX3FiZm9NRTJyRWR1aUc1M05xdkU0SGciIGhyZWY9InVtYTovL19xYlpoa0UyckVkdWlHNTNOcXZFNEhnI19xYmZvTUUyckVkdWlHNTNOcXZFNEhnIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfcG9sa2tFMnJFZHVpRzUzTnF2RTRIZyIgaWQ9Il9wb1RRc0UyckVkdWlHNTNOcXZFNEhnIiB1cmk9IiIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iX3FiZm9NVTJyRWR1aUc1M05xdkU0SGciIGlkPSJfcWJmb01FMnJFZHVpRzUzTnF2RTRIZyIgdXJpPSJuZXdfcGx1Zy1pbi9wbHVnaW4ueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfcWJmb01rMnJFZHVpRzUzTnF2RTRIZyIgaWQ9Il9xYlpoa0UyckVkdWlHNTNOcXZFNEhnIiB1cmk9Im5ld19wbHVnLWluL3BsdWdpbi54bWkiLz4KLSAgPC9vcmcuZWNsaXBzZS5lcGYudW1hLnJlc291cmNlbWFuYWdlcjpSZXNvdXJjZU1hbmFnZXI+Ci0gIDxvcmcuZWNsaXBzZS5lcGYudW1hOk1ldGhvZExpYnJhcnkgeG1pOmlkPSJfcG9UUXNFMnJFZHVpRzUzTnF2RTRIZyIgbmFtZT0iMTU3OTMybSIgZ3VpZD0iX3BvVFFzRTJyRWR1aUc1M05xdkU0SGciPgotICAgIDxtZXRob2RQbHVnaW5zIHhtaTppZD0iX3FiWmhrRTJyRWR1aUc1M05xdkU0SGciIGhyZWY9InVtYTovL19xYlpoa0UyckVkdWlHNTNOcXZFNEhnI19xYlpoa0UyckVkdWlHNTNOcXZFNEhnIi8+Ci0gIDwvb3JnLmVjbGlwc2UuZXBmLnVtYTpNZXRob2RMaWJyYXJ5PgotPC94bWk6WE1JPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE1NzkzMi8xNTc5MzJtL25ld19wbHVnLWluL3BsdWdpbi54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTU3OTMyLzE1NzkzMm0vbmV3X3BsdWctaW4vcGx1Z2luLnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmU2YjU3Yi4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTU3OTMyLzE1NzkzMm0vbmV3X3BsdWctaW4vcGx1Z2luLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08eG1pOlhNSSB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWEucmVzb3VyY2VtYW5hZ2VyPSJodHRwOi8vL29yZy9lY2xpcHNlL2VwZi91bWEvcmVzb3VyY2VtYW5hZ2VyLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiPgotICA8b3JnLmVjbGlwc2UuZXBmLnVtYS5yZXNvdXJjZW1hbmFnZXI6UmVzb3VyY2VNYW5hZ2VyIHhtaTppZD0iX3FiZm9NRTJyRWR1aUc1M05xdkU0SGciIGd1aWQ9Il9xYmZvTUUyckVkdWlHNTNOcXZFNEhnIi8+Ci0gIDxvcmcuZWNsaXBzZS5lcGYudW1hOk1ldGhvZFBsdWdpbiB4bWk6aWQ9Il9xYlpoa0UyckVkdWlHNTNOcXZFNEhnIiBuYW1lPSJuZXdfcGx1Zy1pbiIgZ3VpZD0iX3FiWmhrRTJyRWR1aUc1M05xdkU0SGciPgotICAgIDxtZXRob2RQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfcWJaaGtVMnJFZHVpRzUzTnF2RTRIZyIgbmFtZT0iQ29udGVudCIgZ3VpZD0iX3FiWmhrVTJyRWR1aUc1M05xdkU0SGciPgotICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iX3FiWmhrazJyRWR1aUc1M05xdkU0SGciIG5hbWU9IkNhdGVnb3JpZXMiIGd1aWQ9Il9xYlpoa2syckVkdWlHNTNOcXZFNEhnIj4KLSAgICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iX3FiWmhrMDJyRWR1aUc1M05xdkU0SGciIG5hbWU9IkRvbWFpbnMiIGd1aWQ9Il9xYlpoazAyckVkdWlHNTNOcXZFNEhnIi8+Ci0gICAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il9xYlpobEUyckVkdWlHNTNOcXZFNEhnIiBuYW1lPSJEaXNjaXBsaW5lcyIgZ3VpZD0iX3FiWmhsRTJyRWR1aUc1M05xdkU0SGciLz4KLSAgICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iX3FiWmhsVTJyRWR1aUc1M05xdkU0SGciIG5hbWU9IlJvbGVTZXRzIiBndWlkPSJfcWJaaGxVMnJFZHVpRzUzTnF2RTRIZyIvPgotICAgICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfcWJaaGxrMnJFZHVpRzUzTnF2RTRIZyIgbmFtZT0iV1AgVHlwZXMiIGd1aWQ9Il9xYlpobGsyckVkdWlHNTNOcXZFNEhnIi8+Ci0gICAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il9xYlpobDAyckVkdWlHNTNOcXZFNEhnIiBuYW1lPSJUb29scyIgZ3VpZD0iX3FiWmhsMDJyRWR1aUc1M05xdkU0SGciLz4KLSAgICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iX3FiWmhtRTJyRWR1aUc1M05xdkU0SGciIG5hbWU9IlN0YW5kYXJkQ2F0ZWdvcmllcyIgZ3VpZD0iX3FiWmhtRTJyRWR1aUc1M05xdkU0SGciLz4KLSAgICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iX3FiWmhtVTJyRWR1aUc1M05xdkU0SGciIG5hbWU9IkN1c3RvbUNhdGVnb3JpZXMiIGd1aWQ9Il9xYlpobVUyckVkdWlHNTNOcXZFNEhnIj4KLSAgICAgICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfcWJaaG1rMnJFZHVpRzUzTnF2RTRIZyIgbmFtZT0iSGlkZGVuIiBndWlkPSJfcWJaaG1rMnJFZHVpRzUzTnF2RTRIZyI+Ci0gICAgICAgICAgICA8Y29udGVudEVsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkN1c3RvbUNhdGVnb3J5IiB4bWk6aWQ9Il9xYlpobTAyckVkdWlHNTNOcXZFNEhnIiBuYW1lPSJDdXN0b20gQ2F0ZWdvcmllcyIgZ3VpZD0iX3FiWmhtMDJyRWR1aUc1M05xdkU0SGciLz4KLSAgICAgICAgICA8L2NoaWxkUGFja2FnZXM+Ci0gICAgICAgIDwvY2hpbGRQYWNrYWdlcz4KLSAgICAgIDwvY2hpbGRQYWNrYWdlcz4KLSAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il9xYlpobkUyckVkdWlHNTNOcXZFNEhnIiBuYW1lPSJDb3JlQ29udGVudCIgZ3VpZD0iX3FiWmhuRTJyRWR1aUc1M05xdkU0SGciLz4KLSAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NQYWNrYWdlIiB4bWk6aWQ9Il9xYlpoblUyckVkdWlHNTNOcXZFNEhnIiBuYW1lPSJDYXBhYmlsaXR5UGF0dGVybnMiIGd1aWQ9Il9xYlpoblUyckVkdWlHNTNOcXZFNEhnIi8+Ci0gICAgPC9tZXRob2RQYWNrYWdlcz4KLSAgICA8bWV0aG9kUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc1BhY2thZ2UiIHhtaTppZD0iX3FiWmhuazJyRWR1aUc1M05xdkU0SGciIG5hbWU9IkRlbGl2ZXJ5UHJvY2Vzc2VzIiBndWlkPSJfcWJaaG5rMnJFZHVpRzUzTnF2RTRIZyIvPgotICAgIDxtZXRob2RQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzUGFja2FnZSIgeG1pOmlkPSJfcWJaaG4wMnJFZHVpRzUzTnF2RTRIZyIgbmFtZT0iUHJvY2Vzc0NvbnRyaWJ1dGlvbnMiIGd1aWQ9Il9xYlpobjAyckVkdWlHNTNOcXZFNEhnIi8+Ci0gIDwvb3JnLmVjbGlwc2UuZXBmLnVtYTpNZXRob2RQbHVnaW4+Ci08L3htaTpYTUk+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTU4OTEzbjE1ODkyNS8xNTg5MTNuMTU4OTI1LnRjIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE1ODkxM24xNTg5MjUvMTU4OTEzbjE1ODkyNS50YwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjQ1MzU5MC4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTU4OTEzbjE1ODkyNS8xNTg5MTNuMTU4OTI1LnRjCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxNZXRob2RMaWJyYXJ5VGVzdD4KLQkKLQk8Q29weUxpYnJhcnkgbGliRm9sZGVyTmFtZT0iMTU4OTEzbjE1ODkyNWdvbGRlbiI+Ci0JPC9Db3B5TGlicmFyeT4JCi0JCi0JPE9wZW5MaWJyYXJ5IGxpYkZvbGRlck5hbWU9IjE1ODkxM24xNTg5MjVnb2xkZW4iPgotCTwvT3BlbkxpYnJhcnk+Ci0KLQk8Q29weUxpYnJhcnkgbGliRm9sZGVyTmFtZT0iMTU4OTEzbjE1ODkyNW0iPgotCTwvQ29weUxpYnJhcnk+CQotCQotCTxPcGVuTGlicmFyeSBsaWJGb2xkZXJOYW1lPSIxNTg5MTNuMTU4OTI1bSI+Ci0JPC9PcGVuTGlicmFyeT4KLQkKLQk8SW1wb3J0WG1sIGltcG9ydEZvbGRlck5hbWU9IjE1ODkxM24xNTg5MjVlIj4KLQk8L0ltcG9ydFhtbD4KLQkKLQk8Q29tcGFyZVRvTGlicmFyeSAKLQkJZ29sZGVuTGliRm9sZGVyTmFtZT0iMTU4OTEzbjE1ODkyNWdvbGRlbiIKLQkJZGlmZkNvdW50PSIwIiAKLQkJZWxlbWVudENvdW50PSIyMSIKLQkJdXNlTmFtZUFzSWQ9InRydWUiPgkJCi0JPC9Db21wYXJlVG9MaWJyYXJ5PgotCi08L01ldGhvZExpYnJhcnlUZXN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNTg5MTNuMTU4OTI1LzE1ODkxM24xNTg5MjVlLzE1ODkxM24xNTg5MjVlLnhtbCBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNTg5MTNuMTU4OTI1LzE1ODkxM24xNTg5MjVlLzE1ODkxM24xNTg5MjVlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzNlNmNlMy4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTU4OTEzbjE1ODkyNS8xNTg5MTNuMTU4OTI1ZS8xNTg5MTNuMTU4OTI1ZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHVtYTpNZXRob2RMaWJyYXJ5IHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhtbG5zOnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC4zIiBuYW1lPSIxNTg5MTNuMTU4OTI1bSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBpZD0iXzh5Z3owRTVRRWR1R2txV0d6d3BuN1EiIG9yZGVyaW5nR3VpZGU9IiIgc3VwcHJlc3NlZD0iZmFsc2UiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiB0b29sPSJlcGY9MS4yLjAiPgotICA8TWV0aG9kUGx1Z2luIG5hbWU9Im5ld19wbHVnLWluIiBicmllZkRlc2NyaXB0aW9uPSIiIGlkPSJfLVBERFFFNVFFZHVHa3FXR3p3cG43USIgb3JkZXJpbmdHdWlkZT0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIHVzZXJDaGFuZ2VhYmxlPSJ0cnVlIj4KLSAgICA8TWV0aG9kUGFja2FnZSB4c2k6dHlwZT0idW1hOkNvbnRlbnRDYXRlZ29yeVBhY2thZ2UiIG5hbWU9IkNvbnRlbnRDYXRlZ29yaWVzIiBpZD0iX0dUNjRvRTVSRWR1R2txV0d6d3BuN1EiLz4KLSAgICA8TWV0aG9kUGFja2FnZSB4c2k6dHlwZT0idW1hOkNvbnRlbnRQYWNrYWdlIiBuYW1lPSJuZXdfY29udGVudF9wYWNrYWdlIiBicmllZkRlc2NyaXB0aW9uPSIiIGlkPSJfRDFmSFVFNVJFZHVHa3FXR3p3cG43USIgb3JkZXJpbmdHdWlkZT0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgZ2xvYmFsPSJmYWxzZSIvPgotICAgIDxNZXRob2RQYWNrYWdlIHhzaTp0eXBlPSJ1bWE6UHJvY2Vzc0NvbXBvbmVudCIgbmFtZT0iY3AiIGJyaWVmRGVzY3JpcHRpb249IiIgaWQ9Il9DZUw5TUU1UkVkdUdrcVdHendwbjdRIiBvcmRlcmluZ0d1aWRlPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBnbG9iYWw9ImZhbHNlIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiI+Ci0gICAgICA8UHJvY2VzcyB4c2k6dHlwZT0idW1hOkNhcGFiaWxpdHlQYXR0ZXJuIiBuYW1lPSJjcCIgYnJpZWZEZXNjcmlwdGlvbj0iIiBpZD0iX0NlTDlNVTVSRWR1R2txV0d6d3BuN1EiIG9yZGVyaW5nR3VpZGU9IiIgc3VwcHJlc3NlZD0iZmFsc2UiIHByZXNlbnRhdGlvbk5hbWU9ImNwIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzUGxhbm5lZD0idHJ1ZSIgcHJlZml4PSIiIGlzRXZlbnREcml2ZW49ImZhbHNlIiBpc09uZ29pbmc9ImZhbHNlIiBpc1JlcGVhdGFibGU9ImZhbHNlIiBJc0VuYWN0YWJsZT0iZmFsc2UiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotICAgICAgICA8UHJlc2VudGF0aW9uIHhzaTp0eXBlPSJ1bWE6UHJvY2Vzc0Rlc2NyaXB0aW9uIiBuYW1lPSJjcCxfQ2VMOU1VNVJFZHVHa3FXR3p3cG43USIgYnJpZWZEZXNjcmlwdGlvbj0iIiBpZD0iLXQ3Mkp3YnF2Szl1NHN0ajMxYnFDb2ciIG9yZGVyaW5nR3VpZGU9IiIgc3VwcHJlc3NlZD0iZmFsc2UiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiB1c2FnZUd1aWRhbmNlPSIiIGV4dGVybmFsSWQ9IiI+Ci0gICAgICAgICAgPE1haW5EZXNjcmlwdGlvbj48L01haW5EZXNjcmlwdGlvbj4KLSAgICAgICAgICA8S2V5Q29uc2lkZXJhdGlvbnM+PC9LZXlDb25zaWRlcmF0aW9ucz4KLSAgICAgICAgICA8QWx0ZXJuYXRpdmVzPjwvQWx0ZXJuYXRpdmVzPgotICAgICAgICAgIDxIb3dUb1N0YWZmPjwvSG93VG9TdGFmZj4KLSAgICAgICAgICA8UHVycG9zZT48L1B1cnBvc2U+Ci0gICAgICAgICAgPFNjb3BlPjwvU2NvcGU+Ci0gICAgICAgICAgPFVzYWdlTm90ZXM+PC9Vc2FnZU5vdGVzPgotICAgICAgICA8L1ByZXNlbnRhdGlvbj4KLSAgICAgICAgPERlZmF1bHRDb250ZXh0Pl9BZ0JuWUU1UkVkdUdrcVdHendwbjdRPC9EZWZhdWx0Q29udGV4dD4KLSAgICAgICAgPFZhbGlkQ29udGV4dD5fQWdCbllFNVJFZHVHa3FXR3p3cG43UTwvVmFsaWRDb250ZXh0PgotICAgICAgPC9Qcm9jZXNzPgotICAgIDwvTWV0aG9kUGFja2FnZT4KLSAgPC9NZXRob2RQbHVnaW4+Ci0gIDxNZXRob2RDb25maWd1cmF0aW9uIG5hbWU9ImMiIGJyaWVmRGVzY3JpcHRpb249IiIgaWQ9Il9BZ0JuWUU1UkVkdUdrcVdHendwbjdRIiBvcmRlcmluZ0d1aWRlPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiI+Ci0gICAgPE1ldGhvZFBsdWdpblNlbGVjdGlvbj5fLVBERFFFNVFFZHVHa3FXR3p3cG43UTwvTWV0aG9kUGx1Z2luU2VsZWN0aW9uPgotICAgIDxNZXRob2RQYWNrYWdlU2VsZWN0aW9uPl9DZUw5TUU1UkVkdUdrcVdHendwbjdRPC9NZXRob2RQYWNrYWdlU2VsZWN0aW9uPgotICAgIDxNZXRob2RQYWNrYWdlU2VsZWN0aW9uPl8tUEREVFU1UUVkdUdrcVdHendwbjdRPC9NZXRob2RQYWNrYWdlU2VsZWN0aW9uPgotICAgIDxNZXRob2RQYWNrYWdlU2VsZWN0aW9uPl8tUEREUVU1UUVkdUdrcVdHendwbjdRPC9NZXRob2RQYWNrYWdlU2VsZWN0aW9uPgotICA8L01ldGhvZENvbmZpZ3VyYXRpb24+Ci08L3VtYTpNZXRob2RMaWJyYXJ5PgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE1ODkxM24xNTg5MjUvMTU4OTEzbjE1ODkyNWdvbGRlbi8ucHJvamVjdCBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNTg5MTNuMTU4OTI1LzE1ODkxM24xNTg5MjVnb2xkZW4vLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmOGQ3NmMuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE1ODkxM24xNTg5MjUvMTU4OTEzbjE1ODkyNWdvbGRlbi8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPjE1ODkxM24xNTg5MjVnb2xkZW48L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucHJvamVjdC5NZXRob2RMaWJyYXJ5UHJvamVjdE5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE1ODkxM24xNTg5MjUvMTU4OTEzbjE1ODkyNWdvbGRlbi9jb25maWd1cmF0aW9ucy9jLnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNTg5MTNuMTU4OTI1LzE1ODkxM24xNTg5MjVnb2xkZW4vY29uZmlndXJhdGlvbnMvYy54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhMTMyMGYuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE1ODkxM24xNTg5MjUvMTU4OTEzbjE1ODkyNWdvbGRlbi9jb25maWd1cmF0aW9ucy9jLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08b3JnLmVjbGlwc2UuZXBmLnVtYTpNZXRob2RDb25maWd1cmF0aW9uIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6ZXBmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZiIgZXBmOnZlcnNpb249IjEuMi4wIiB4bWk6aWQ9Il9BZ0JuWUU1UkVkdUdrcVdHendwbjdRIiBuYW1lPSJjIiBndWlkPSJfQWdCbllFNVJFZHVHa3FXR3p3cG43USI+Ci0gIDxtZXRob2RQbHVnaW5TZWxlY3Rpb24gaHJlZj0idW1hOi8vXy1QRERRRTVRRWR1R2txV0d6d3BuN1EjXy1QRERRRTVRRWR1R2txV0d6d3BuN1EiLz4KLSAgPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24geHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc1BhY2thZ2UiIGhyZWY9InVtYTovL18tUEREUUU1UUVkdUdrcVdHendwbjdRI18tUEREVFU1UUVkdUdrcVdHendwbjdRIi8+Ci0gIDxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiBocmVmPSJ1bWE6Ly9fLVBERFFFNVFFZHVHa3FXR3p3cG43USNfLVBERFFVNVFFZHVHa3FXR3p3cG43USIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzQ29tcG9uZW50IiBocmVmPSJ1bWE6Ly9fTGJzcXdFNVJFZHVHa3FXR3p3cG43USNfTGJzcXdFNVJFZHVHa3FXR3p3cG43USIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzQ29tcG9uZW50IiBocmVmPSJ1bWE6Ly9fQ2VMOU1FNVJFZHVHa3FXR3p3cG43USNfQ2VMOU1FNVJFZHVHa3FXR3p3cG43USIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgaHJlZj0idW1hOi8vXy1QRERRRTVRRWR1R2txV0d6d3BuN1EjXy1QRERURTVRRWR1R2txV0d6d3BuN1EiLz4KLSAgPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24geHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIGhyZWY9InVtYTovL18tUEREUUU1UUVkdUdrcVdHendwbjdRI18tUEREUlU1UUVkdUdrcVdHendwbjdRIi8+Ci0gIDxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiBocmVmPSJ1bWE6Ly9fLVBERFFFNVFFZHVHa3FXR3p3cG43USNfLVBERFFrNVFFZHVHa3FXR3p3cG43USIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgaHJlZj0idW1hOi8vXy1QRERRRTVRRWR1R2txV0d6d3BuN1EjXy1QRERSRTVRRWR1R2txV0d6d3BuN1EiLz4KLSAgPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24geHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIGhyZWY9InVtYTovL18tUEREUUU1UUVkdUdrcVdHendwbjdRI18tUEREUTA1UUVkdUdrcVdHendwbjdRIi8+Ci0gIDxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiBocmVmPSJ1bWE6Ly9fLVBERFFFNVFFZHVHa3FXR3p3cG43USNfLVBERFIwNVFFZHVHa3FXR3p3cG43USIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzUGFja2FnZSIgaHJlZj0idW1hOi8vXy1QRERRRTVRRWR1R2txV0d6d3BuN1EjXy1QRERUazVRRWR1R2txV0d6d3BuN1EiLz4KLSAgPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24geHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIGhyZWY9InVtYTovL18tUEREUUU1UUVkdUdrcVdHendwbjdRI18tUEREUms1UUVkdUdrcVdHendwbjdRIi8+Ci0gIDxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NQYWNrYWdlIiBocmVmPSJ1bWE6Ly9fLVBERFFFNVFFZHVHa3FXR3p3cG43USNfLVBERFQwNVFFZHVHa3FXR3p3cG43USIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgaHJlZj0idW1hOi8vXy1QRERRRTVRRWR1R2txV0d6d3BuN1EjXy1QRERTVTVRRWR1R2txV0d6d3BuN1EiLz4KLSAgPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24geHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIGhyZWY9InVtYTovL18tUEREUUU1UUVkdUdrcVdHendwbjdRI18tUEREU0U1UUVkdUdrcVdHendwbjdRIi8+Ci0gIDxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiBocmVmPSJ1bWE6Ly9fLVBERFFFNVFFZHVHa3FXR3p3cG43USNfLVBERFNrNVFFZHVHa3FXR3p3cG43USIvPgotPC9vcmcuZWNsaXBzZS5lcGYudW1hOk1ldGhvZENvbmZpZ3VyYXRpb24+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTU4OTEzbjE1ODkyNS8xNTg5MTNuMTU4OTI1Z29sZGVuL2xpYnJhcnkueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE1ODkxM24xNTg5MjUvMTU4OTEzbjE1ODkyNWdvbGRlbi9saWJyYXJ5LnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmZmNWYwNi4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTU4OTEzbjE1ODkyNS8xNTg5MTNuMTU4OTI1Z29sZGVuL2xpYnJhcnkueG1pCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTx4bWk6WE1JIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYS5yZXNvdXJjZW1hbmFnZXI9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZXBmL3VtYS9yZXNvdXJjZW1hbmFnZXIuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCI+Ci0gIDxvcmcuZWNsaXBzZS5lcGYudW1hLnJlc291cmNlbWFuYWdlcjpSZXNvdXJjZU1hbmFnZXIgeG1pOmlkPSJfOHpGYmtFNVFFZHVHa3FXR3p3cG43USIgZ3VpZD0iXzh6RmJrRTVRRWR1R2txV0d6d3BuN1EiPgotICAgIDxzdWJNYW5hZ2VycyB4bWk6aWQ9Il8tUEpKNFU1UUVkdUdrcVdHendwbjdRIiBocmVmPSJ1bWE6Ly9fLVBERFFFNVFFZHVHa3FXR3p3cG43USNfLVBKSjRVNVFFZHVHa3FXR3p3cG43USIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iXzh6Um8wRTVRRWR1R2txV0d6d3BuN1EiIGlkPSJfOHlnejBFNVFFZHVHa3FXR3p3cG43USIgdXJpPSIiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il8tUEpKNGs1UUVkdUdrcVdHendwbjdRIiBpZD0iXy1QSko0VTVRRWR1R2txV0d6d3BuN1EiIHVyaT0ibmV3X3BsdWctaW4vcGx1Z2luLnhtaSIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iXy1QSko0MDVRRWR1R2txV0d6d3BuN1EiIGlkPSJfLVBERFFFNVFFZHVHa3FXR3p3cG43USIgdXJpPSJuZXdfcGx1Zy1pbi9wbHVnaW4ueG1pIi8+Ci0gIDwvb3JnLmVjbGlwc2UuZXBmLnVtYS5yZXNvdXJjZW1hbmFnZXI6UmVzb3VyY2VNYW5hZ2VyPgotICA8b3JnLmVjbGlwc2UuZXBmLnVtYTpNZXRob2RMaWJyYXJ5IHhtaTppZD0iXzh5Z3owRTVRRWR1R2txV0d6d3BuN1EiIG5hbWU9IjE1ODkxM24xNTg5MjVtIiBndWlkPSJfOHlnejBFNVFFZHVHa3FXR3p3cG43USI+Ci0gICAgPG1ldGhvZFBsdWdpbnMgeG1pOmlkPSJfLVBERFFFNVFFZHVHa3FXR3p3cG43USIgaHJlZj0idW1hOi8vXy1QRERRRTVRRWR1R2txV0d6d3BuN1EjXy1QRERRRTVRRWR1R2txV0d6d3BuN1EiLz4KLSAgPC9vcmcuZWNsaXBzZS5lcGYudW1hOk1ldGhvZExpYnJhcnk+Ci08L3htaTpYTUk+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTU4OTEzbjE1ODkyNS8xNTg5MTNuMTU4OTI1Z29sZGVuL25ld19wbHVnLWluL2NhcGFiaWxpdHlwYXR0ZXJucy9jcC9jb250ZW50LnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNTg5MTNuMTU4OTI1LzE1ODkxM24xNTg5MjVnb2xkZW4vbmV3X3BsdWctaW4vY2FwYWJpbGl0eXBhdHRlcm5zL2NwL2NvbnRlbnQueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZjdmZWJkLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNTg5MTNuMTU4OTI1LzE1ODkxM24xNTg5MjVnb2xkZW4vbmV3X3BsdWctaW4vY2FwYWJpbGl0eXBhdHRlcm5zL2NwL2NvbnRlbnQueG1pCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPG9yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc0Rlc2NyaXB0aW9uIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6ZXBmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZiIgZXBmOnZlcnNpb249IjEuMi4wIiB4bWk6aWQ9Ii10NzJKd2Jxdks5dTRzdGozMWJxQ29nIiBuYW1lPSJjcCxfQ2VMOU1VNVJFZHVHa3FXR3p3cG43USIgZ3VpZD0iLXQ3Mkp3YnF2Szl1NHN0ajMxYnFDb2ciLz4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNTg5MTNuMTU4OTI1LzE1ODkxM24xNTg5MjVnb2xkZW4vbmV3X3BsdWctaW4vY2FwYWJpbGl0eXBhdHRlcm5zL2NwL21vZGVsLnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNTg5MTNuMTU4OTI1LzE1ODkxM24xNTg5MjVnb2xkZW4vbmV3X3BsdWctaW4vY2FwYWJpbGl0eXBhdHRlcm5zL2NwL21vZGVsLnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2U3OTc2Ni4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTU4OTEzbjE1ODkyNS8xNTg5MTNuMTU4OTI1Z29sZGVuL25ld19wbHVnLWluL2NhcGFiaWxpdHlwYXR0ZXJucy9jcC9tb2RlbC54bWkKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHhtaTpYTUkgeG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hLnJlc291cmNlbWFuYWdlcj0iaHR0cDovLy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Jlc291cmNlbWFuYWdlci5lY29yZSIgeG1sbnM6ZXBmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZiIgZXBmOnZlcnNpb249IjEuMi4wIj4KLSAgPG9yZy5lY2xpcHNlLmVwZi51bWEucmVzb3VyY2VtYW5hZ2VyOlJlc291cmNlTWFuYWdlciB4bWk6aWQ9Il9ucTdnb1U1UkVkdU9vcHE1VGV2WWF3IiBndWlkPSJfbnE3Z29VNVJFZHVPb3BxNVRldllhdyI+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfbnE3Z29rNVJFZHVPb3BxNVRldllhdyIgaWQ9Ii10NzJKd2Jxdks5dTRzdGozMWJxQ29nIiB1cmk9ImNvbnRlbnQueG1pIi8+Ci0gIDwvb3JnLmVjbGlwc2UuZXBmLnVtYS5yZXNvdXJjZW1hbmFnZXI6UmVzb3VyY2VNYW5hZ2VyPgotICA8b3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzQ29tcG9uZW50IHhtaTppZD0iX0NlTDlNRTVSRWR1R2txV0d6d3BuN1EiIG5hbWU9ImNwIiBndWlkPSJfQ2VMOU1FNVJFZHVHa3FXR3p3cG43USI+Ci0gICAgPHByb2Nlc3MgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q2FwYWJpbGl0eVBhdHRlcm4iIHhtaTppZD0iX0NlTDlNVTVSRWR1R2txV0d6d3BuN1EiIG5hbWU9ImNwIiBndWlkPSJfQ2VMOU1VNVJFZHVHa3FXR3p3cG43USIgcHJlc2VudGF0aW9uTmFtZT0iY3AiPgotICAgICAgPHByZXNlbnRhdGlvbiB4bWk6aWQ9Ii10NzJKd2Jxdks5dTRzdGozMWJxQ29nIiBocmVmPSJ1bWE6Ly8tdDcySndicXZLOXU0c3RqMzFicUNvZyMtdDcySndicXZLOXU0c3RqMzFicUNvZyIvPgotICAgICAgPGRlZmF1bHRDb250ZXh0IGhyZWY9InVtYTovL184eWd6MEU1UUVkdUdrcVdHendwbjdRI19BZ0JuWUU1UkVkdUdrcVdHendwbjdRIi8+Ci0gICAgICA8dmFsaWRDb250ZXh0IGhyZWY9InVtYTovL184eWd6MEU1UUVkdUdrcVdHendwbjdRI19BZ0JuWUU1UkVkdUdrcVdHendwbjdRIi8+Ci0gICAgPC9wcm9jZXNzPgotICA8L29yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc0NvbXBvbmVudD4KLTwveG1pOlhNST4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNTg5MTNuMTU4OTI1LzE1ODkxM24xNTg5MjVnb2xkZW4vbmV3X3BsdWctaW4vY2FwYWJpbGl0eXBhdHRlcm5zL2NwX3JlbmFtZWQvY29udGVudC54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTU4OTEzbjE1ODkyNS8xNTg5MTNuMTU4OTI1Z29sZGVuL25ld19wbHVnLWluL2NhcGFiaWxpdHlwYXR0ZXJucy9jcF9yZW5hbWVkL2NvbnRlbnQueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YzAwN2IzLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNTg5MTNuMTU4OTI1LzE1ODkxM24xNTg5MjVnb2xkZW4vbmV3X3BsdWctaW4vY2FwYWJpbGl0eXBhdHRlcm5zL2NwX3JlbmFtZWQvY29udGVudC54bWkKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08b3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzRGVzY3JpcHRpb24geG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiIHhtaTppZD0iLXZCZGZ1aWs1dWpoSmVWS3l6VjdfWUEiIG5hbWU9ImNwLF9MYnNxd1U1UkVkdUdrcVdHendwbjdRIiBndWlkPSItdkJkZnVpazV1amhKZVZLeXpWN19ZQSIvPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE1ODkxM24xNTg5MjUvMTU4OTEzbjE1ODkyNWdvbGRlbi9uZXdfcGx1Zy1pbi9jYXBhYmlsaXR5cGF0dGVybnMvY3BfcmVuYW1lZC9tb2RlbC54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTU4OTEzbjE1ODkyNS8xNTg5MTNuMTU4OTI1Z29sZGVuL25ld19wbHVnLWluL2NhcGFiaWxpdHlwYXR0ZXJucy9jcF9yZW5hbWVkL21vZGVsLnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGYzNDkzYi4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTU4OTEzbjE1ODkyNS8xNTg5MTNuMTU4OTI1Z29sZGVuL25ld19wbHVnLWluL2NhcGFiaWxpdHlwYXR0ZXJucy9jcF9yZW5hbWVkL21vZGVsLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08eG1pOlhNSSB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWEucmVzb3VyY2VtYW5hZ2VyPSJodHRwOi8vL29yZy9lY2xpcHNlL2VwZi91bWEvcmVzb3VyY2VtYW5hZ2VyLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiPgotICA8b3JnLmVjbGlwc2UuZXBmLnVtYS5yZXNvdXJjZW1hbmFnZXI6UmVzb3VyY2VNYW5hZ2VyIHhtaTppZD0iX0xjUlNnVTVSRWR1R2txV0d6d3BuN1EiIGd1aWQ9Il9MY1JTZ1U1UkVkdUdrcVdHendwbjdRIj4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il9MY1JTZ2s1UkVkdUdrcVdHendwbjdRIiBpZD0iLXZCZGZ1aWs1dWpoSmVWS3l6VjdfWUEiIHVyaT0iY29udGVudC54bWkiLz4KLSAgPC9vcmcuZWNsaXBzZS5lcGYudW1hLnJlc291cmNlbWFuYWdlcjpSZXNvdXJjZU1hbmFnZXI+Ci0gIDxvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NDb21wb25lbnQgeG1pOmlkPSJfTGJzcXdFNVJFZHVHa3FXR3p3cG43USIgbmFtZT0iY3BfcmVuYW1lZCIgZ3VpZD0iX0xic3F3RTVSRWR1R2txV0d6d3BuN1EiPgotICAgIDxwcm9jZXNzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNhcGFiaWxpdHlQYXR0ZXJuIiB4bWk6aWQ9Il9MYnNxd1U1UkVkdUdrcVdHendwbjdRIiBuYW1lPSJjcF9yZW5hbWVkIiBndWlkPSJfTGJzcXdVNVJFZHVHa3FXR3p3cG43USIgcHJlc2VudGF0aW9uTmFtZT0iY3AiPgotICAgICAgPHByZXNlbnRhdGlvbiB4bWk6aWQ9Ii12QmRmdWlrNXVqaEplVkt5elY3X1lBIiBocmVmPSJ1bWE6Ly8tdkJkZnVpazV1amhKZVZLeXpWN19ZQSMtdkJkZnVpazV1amhKZVZLeXpWN19ZQSIvPgotICAgICAgPGRlZmF1bHRDb250ZXh0IGhyZWY9InVtYTovL184eWd6MEU1UUVkdUdrcVdHendwbjdRI19BZ0JuWUU1UkVkdUdrcVdHendwbjdRIi8+Ci0gICAgICA8dmFsaWRDb250ZXh0IGhyZWY9InVtYTovL184eWd6MEU1UUVkdUdrcVdHendwbjdRI19BZ0JuWUU1UkVkdUdrcVdHendwbjdRIi8+Ci0gICAgPC9wcm9jZXNzPgotICA8L29yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc0NvbXBvbmVudD4KLTwveG1pOlhNST4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNTg5MTNuMTU4OTI1LzE1ODkxM24xNTg5MjVnb2xkZW4vbmV3X3BsdWctaW4vcGx1Z2luLnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNTg5MTNuMTU4OTI1LzE1ODkxM24xNTg5MjVnb2xkZW4vbmV3X3BsdWctaW4vcGx1Z2luLnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGUwYWU3NC4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTU4OTEzbjE1ODkyNS8xNTg5MTNuMTU4OTI1Z29sZGVuL25ld19wbHVnLWluL3BsdWdpbi54bWkKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHhtaTpYTUkgeG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hLnJlc291cmNlbWFuYWdlcj0iaHR0cDovLy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Jlc291cmNlbWFuYWdlci5lY29yZSIgeG1sbnM6ZXBmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZiIgZXBmOnZlcnNpb249IjEuMi4wIj4KLSAgPG9yZy5lY2xpcHNlLmVwZi51bWEucmVzb3VyY2VtYW5hZ2VyOlJlc291cmNlTWFuYWdlciB4bWk6aWQ9Il8tUEpKNFU1UUVkdUdrcVdHendwbjdRIiBndWlkPSJfLVBKSjRVNVFFZHVHa3FXR3p3cG43USI+Ci0gICAgPHN1Yk1hbmFnZXJzIHhtaTppZD0iX0xjUlNnVTVSRWR1R2txV0d6d3BuN1EiIGhyZWY9InVtYTovL19MYnNxd0U1UkVkdUdrcVdHendwbjdRI19MY1JTZ1U1UkVkdUdrcVdHendwbjdRIi8+Ci0gICAgPHN1Yk1hbmFnZXJzIHhtaTppZD0iX25xN2dvVTVSRWR1T29wcTVUZXZZYXciIGhyZWY9InVtYTovL19DZUw5TUU1UkVkdUdrcVdHendwbjdRI19ucTdnb1U1UkVkdU9vcHE1VGV2WWF3Ii8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfTGJ5eFlVNVJFZHVHa3FXR3p3cG43USIgaWQ9Il9MYnNxd0U1UkVkdUdrcVdHendwbjdRIiB1cmk9ImNhcGFiaWxpdHlwYXR0ZXJucy9jcF9yZW5hbWVkL21vZGVsLnhtaSIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iX25xN2dvRTVSRWR1T29wcTVUZXZZYXciIGlkPSJfQ2VMOU1FNVJFZHVHa3FXR3p3cG43USIgdXJpPSJjYXBhYmlsaXR5cGF0dGVybnMvY3AvbW9kZWwueG1pIi8+Ci0gIDwvb3JnLmVjbGlwc2UuZXBmLnVtYS5yZXNvdXJjZW1hbmFnZXI6UmVzb3VyY2VNYW5hZ2VyPgotICA8b3JnLmVjbGlwc2UuZXBmLnVtYTpNZXRob2RQbHVnaW4geG1pOmlkPSJfLVBERFFFNVFFZHVHa3FXR3p3cG43USIgbmFtZT0ibmV3X3BsdWctaW4iIGd1aWQ9Il8tUEREUUU1UUVkdUdrcVdHendwbjdRIj4KLSAgICA8bWV0aG9kUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iXy1QRERRVTVRRWR1R2txV0d6d3BuN1EiIG5hbWU9IkNvbnRlbnQiIGd1aWQ9Il8tUEREUVU1UUVkdUdrcVdHendwbjdRIj4KLSAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il8tUEREUWs1UUVkdUdrcVdHendwbjdRIiBuYW1lPSJDYXRlZ29yaWVzIiBndWlkPSJfLVBERFFrNVFFZHVHa3FXR3p3cG43USI+Ci0gICAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il8tUEREUTA1UUVkdUdrcVdHendwbjdRIiBuYW1lPSJEb21haW5zIiBndWlkPSJfLVBERFEwNVFFZHVHa3FXR3p3cG43USIvPgotICAgICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfLVBERFJFNVFFZHVHa3FXR3p3cG43USIgbmFtZT0iRGlzY2lwbGluZXMiIGd1aWQ9Il8tUEREUkU1UUVkdUdrcVdHendwbjdRIi8+Ci0gICAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il8tUEREUlU1UUVkdUdrcVdHendwbjdRIiBuYW1lPSJSb2xlU2V0cyIgZ3VpZD0iXy1QRERSVTVRRWR1R2txV0d6d3BuN1EiLz4KLSAgICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iXy1QRERSazVRRWR1R2txV0d6d3BuN1EiIG5hbWU9IldQIFR5cGVzIiBndWlkPSJfLVBERFJrNVFFZHVHa3FXR3p3cG43USIvPgotICAgICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfLVBERFIwNVFFZHVHa3FXR3p3cG43USIgbmFtZT0iVG9vbHMiIGd1aWQ9Il8tUEREUjA1UUVkdUdrcVdHendwbjdRIi8+Ci0gICAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il8tUEREU0U1UUVkdUdrcVdHendwbjdRIiBuYW1lPSJTdGFuZGFyZENhdGVnb3JpZXMiIGd1aWQ9Il8tUEREU0U1UUVkdUdrcVdHendwbjdRIi8+Ci0gICAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il8tUEREU1U1UUVkdUdrcVdHendwbjdRIiBuYW1lPSJDdXN0b21DYXRlZ29yaWVzIiBndWlkPSJfLVBERFNVNVFFZHVHa3FXR3p3cG43USI+Ci0gICAgICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iXy1QRERTazVRRWR1R2txV0d6d3BuN1EiIG5hbWU9IkhpZGRlbiIgZ3VpZD0iXy1QRERTazVRRWR1R2txV0d6d3BuN1EiPgotICAgICAgICAgICAgPGNvbnRlbnRFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDdXN0b21DYXRlZ29yeSIgeG1pOmlkPSJfLVBERFMwNVFFZHVHa3FXR3p3cG43USIgbmFtZT0iQ3VzdG9tIENhdGVnb3JpZXMiIGd1aWQ9Il8tUEREUzA1UUVkdUdrcVdHendwbjdRIiBwcmVzZW50YXRpb25OYW1lPSJDdXN0b20gQ2F0ZWdvcmllcyIvPgotICAgICAgICAgIDwvY2hpbGRQYWNrYWdlcz4KLSAgICAgICAgPC9jaGlsZFBhY2thZ2VzPgotICAgICAgPC9jaGlsZFBhY2thZ2VzPgotICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iXy1QRERURTVRRWR1R2txV0d6d3BuN1EiIG5hbWU9IkNvcmVDb250ZW50IiBndWlkPSJfLVBERFRFNVFFZHVHa3FXR3p3cG43USI+Ci0gICAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il9LUnJ1c0U1UkVkdUdrcVdHendwbjdRIiBuYW1lPSJuZXdfY29udGVudF9wYWNrYWdlX3JlbmFtZWQiIGd1aWQ9Il9LUnJ1c0U1UkVkdUdrcVdHendwbjdRIi8+Ci0gICAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il9EMWZIVUU1UkVkdUdrcVdHendwbjdRIiBuYW1lPSJuZXdfY29udGVudF9wYWNrYWdlIiBndWlkPSJfRDFmSFVFNVJFZHVHa3FXR3p3cG43USIvPgotICAgICAgPC9jaGlsZFBhY2thZ2VzPgotICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc1BhY2thZ2UiIHhtaTppZD0iXy1QRERUVTVRRWR1R2txV0d6d3BuN1EiIG5hbWU9IkNhcGFiaWxpdHlQYXR0ZXJucyIgZ3VpZD0iXy1QRERUVTVRRWR1R2txV0d6d3BuN1EiPgotICAgICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzQ29tcG9uZW50IiB4bWk6aWQ9Il9MYnNxd0U1UkVkdUdrcVdHendwbjdRIiBocmVmPSJ1bWE6Ly9fTGJzcXdFNVJFZHVHa3FXR3p3cG43USNfTGJzcXdFNVJFZHVHa3FXR3p3cG43USIvPgotICAgICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzQ29tcG9uZW50IiB4bWk6aWQ9Il9DZUw5TUU1UkVkdUdrcVdHendwbjdRIiBocmVmPSJ1bWE6Ly9fQ2VMOU1FNVJFZHVHa3FXR3p3cG43USNfQ2VMOU1FNVJFZHVHa3FXR3p3cG43USIvPgotICAgICAgPC9jaGlsZFBhY2thZ2VzPgotICAgIDwvbWV0aG9kUGFja2FnZXM+Ci0gICAgPG1ldGhvZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NQYWNrYWdlIiB4bWk6aWQ9Il8tUEREVGs1UUVkdUdrcVdHendwbjdRIiBuYW1lPSJEZWxpdmVyeVByb2Nlc3NlcyIgZ3VpZD0iXy1QRERUazVRRWR1R2txV0d6d3BuN1EiLz4KLSAgICA8bWV0aG9kUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc1BhY2thZ2UiIHhtaTppZD0iXy1QRERUMDVRRWR1R2txV0d6d3BuN1EiIG5hbWU9IlByb2Nlc3NDb250cmlidXRpb25zIiBndWlkPSJfLVBERFQwNVFFZHVHa3FXR3p3cG43USIvPgotICA8L29yZy5lY2xpcHNlLmVwZi51bWE6TWV0aG9kUGx1Z2luPgotPC94bWk6WE1JPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE1ODkxM24xNTg5MjUvMTU4OTEzbjE1ODkyNW0vLnByb2plY3QgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTU4OTEzbjE1ODkyNS8xNTg5MTNuMTU4OTI1bS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDdhMjMyYy4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTU4OTEzbjE1ODkyNS8xNTg5MTNuMTU4OTI1bS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPjE1ODkxM24xNTg5MjVtPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnByb2plY3QuTWV0aG9kTGlicmFyeVByb2plY3ROYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNTg5MTNuMTU4OTI1LzE1ODkxM24xNTg5MjVtL2NvbmZpZ3VyYXRpb25zL2MueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE1ODkxM24xNTg5MjUvMTU4OTEzbjE1ODkyNW0vY29uZmlndXJhdGlvbnMvYy54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwMGFjODIuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE1ODkxM24xNTg5MjUvMTU4OTEzbjE1ODkyNW0vY29uZmlndXJhdGlvbnMvYy54bWkKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08b3JnLmVjbGlwc2UuZXBmLnVtYTpNZXRob2RDb25maWd1cmF0aW9uIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6ZXBmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZiIgZXBmOnZlcnNpb249IjEuMi4wIiB4bWk6aWQ9Il9BZ0JuWUU1UkVkdUdrcVdHendwbjdRIiBuYW1lPSJjIiBndWlkPSJfQWdCbllFNVJFZHVHa3FXR3p3cG43USI+Ci0gIDxtZXRob2RQbHVnaW5TZWxlY3Rpb24gaHJlZj0idW1hOi8vXy1QRERRRTVRRWR1R2txV0d6d3BuN1EjXy1QRERRRTVRRWR1R2txV0d6d3BuN1EiLz4KLSAgPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24geHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc1BhY2thZ2UiIGhyZWY9InVtYTovL18tUEREUUU1UUVkdUdrcVdHendwbjdRI18tUEREVFU1UUVkdUdrcVdHendwbjdRIi8+Ci0gIDxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiBocmVmPSJ1bWE6Ly9fLVBERFFFNVFFZHVHa3FXR3p3cG43USNfLVBERFFVNVFFZHVHa3FXR3p3cG43USIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzQ29tcG9uZW50IiBocmVmPSJ1bWE6Ly9fTGJzcXdFNVJFZHVHa3FXR3p3cG43USNfTGJzcXdFNVJFZHVHa3FXR3p3cG43USIvPgotPC9vcmcuZWNsaXBzZS5lcGYudW1hOk1ldGhvZENvbmZpZ3VyYXRpb24+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTU4OTEzbjE1ODkyNS8xNTg5MTNuMTU4OTI1bS9saWJyYXJ5LnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNTg5MTNuMTU4OTI1LzE1ODkxM24xNTg5MjVtL2xpYnJhcnkueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZmY1ZjA2Li4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNTg5MTNuMTU4OTI1LzE1ODkxM24xNTg5MjVtL2xpYnJhcnkueG1pCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTx4bWk6WE1JIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYS5yZXNvdXJjZW1hbmFnZXI9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZXBmL3VtYS9yZXNvdXJjZW1hbmFnZXIuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCI+Ci0gIDxvcmcuZWNsaXBzZS5lcGYudW1hLnJlc291cmNlbWFuYWdlcjpSZXNvdXJjZU1hbmFnZXIgeG1pOmlkPSJfOHpGYmtFNVFFZHVHa3FXR3p3cG43USIgZ3VpZD0iXzh6RmJrRTVRRWR1R2txV0d6d3BuN1EiPgotICAgIDxzdWJNYW5hZ2VycyB4bWk6aWQ9Il8tUEpKNFU1UUVkdUdrcVdHendwbjdRIiBocmVmPSJ1bWE6Ly9fLVBERFFFNVFFZHVHa3FXR3p3cG43USNfLVBKSjRVNVFFZHVHa3FXR3p3cG43USIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iXzh6Um8wRTVRRWR1R2txV0d6d3BuN1EiIGlkPSJfOHlnejBFNVFFZHVHa3FXR3p3cG43USIgdXJpPSIiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il8tUEpKNGs1UUVkdUdrcVdHendwbjdRIiBpZD0iXy1QSko0VTVRRWR1R2txV0d6d3BuN1EiIHVyaT0ibmV3X3BsdWctaW4vcGx1Z2luLnhtaSIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iXy1QSko0MDVRRWR1R2txV0d6d3BuN1EiIGlkPSJfLVBERFFFNVFFZHVHa3FXR3p3cG43USIgdXJpPSJuZXdfcGx1Zy1pbi9wbHVnaW4ueG1pIi8+Ci0gIDwvb3JnLmVjbGlwc2UuZXBmLnVtYS5yZXNvdXJjZW1hbmFnZXI6UmVzb3VyY2VNYW5hZ2VyPgotICA8b3JnLmVjbGlwc2UuZXBmLnVtYTpNZXRob2RMaWJyYXJ5IHhtaTppZD0iXzh5Z3owRTVRRWR1R2txV0d6d3BuN1EiIG5hbWU9IjE1ODkxM24xNTg5MjVtIiBndWlkPSJfOHlnejBFNVFFZHVHa3FXR3p3cG43USI+Ci0gICAgPG1ldGhvZFBsdWdpbnMgeG1pOmlkPSJfLVBERFFFNVFFZHVHa3FXR3p3cG43USIgaHJlZj0idW1hOi8vXy1QRERRRTVRRWR1R2txV0d6d3BuN1EjXy1QRERRRTVRRWR1R2txV0d6d3BuN1EiLz4KLSAgPC9vcmcuZWNsaXBzZS5lcGYudW1hOk1ldGhvZExpYnJhcnk+Ci08L3htaTpYTUk+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTU4OTEzbjE1ODkyNS8xNTg5MTNuMTU4OTI1bS9uZXdfcGx1Zy1pbi9jYXBhYmlsaXR5cGF0dGVybnMvY3AvY29udGVudC54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTU4OTEzbjE1ODkyNS8xNTg5MTNuMTU4OTI1bS9uZXdfcGx1Zy1pbi9jYXBhYmlsaXR5cGF0dGVybnMvY3AvY29udGVudC54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljMDA3YjMuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE1ODkxM24xNTg5MjUvMTU4OTEzbjE1ODkyNW0vbmV3X3BsdWctaW4vY2FwYWJpbGl0eXBhdHRlcm5zL2NwL2NvbnRlbnQueG1pCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPG9yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc0Rlc2NyaXB0aW9uIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6ZXBmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZiIgZXBmOnZlcnNpb249IjEuMi4wIiB4bWk6aWQ9Ii12QmRmdWlrNXVqaEplVkt5elY3X1lBIiBuYW1lPSJjcCxfTGJzcXdVNVJFZHVHa3FXR3p3cG43USIgZ3VpZD0iLXZCZGZ1aWs1dWpoSmVWS3l6VjdfWUEiLz4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNTg5MTNuMTU4OTI1LzE1ODkxM24xNTg5MjVtL25ld19wbHVnLWluL2NhcGFiaWxpdHlwYXR0ZXJucy9jcC9tb2RlbC54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTU4OTEzbjE1ODkyNS8xNTg5MTNuMTU4OTI1bS9uZXdfcGx1Zy1pbi9jYXBhYmlsaXR5cGF0dGVybnMvY3AvbW9kZWwueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NGFkNjhjLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNTg5MTNuMTU4OTI1LzE1ODkxM24xNTg5MjVtL25ld19wbHVnLWluL2NhcGFiaWxpdHlwYXR0ZXJucy9jcC9tb2RlbC54bWkKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHhtaTpYTUkgeG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hLnJlc291cmNlbWFuYWdlcj0iaHR0cDovLy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Jlc291cmNlbWFuYWdlci5lY29yZSIgeG1sbnM6ZXBmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZiIgZXBmOnZlcnNpb249IjEuMi4wIj4KLSAgPG9yZy5lY2xpcHNlLmVwZi51bWEucmVzb3VyY2VtYW5hZ2VyOlJlc291cmNlTWFuYWdlciB4bWk6aWQ9Il9MY1JTZ1U1UkVkdUdrcVdHendwbjdRIiBndWlkPSJfTGNSU2dVNVJFZHVHa3FXR3p3cG43USI+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfTGNSU2drNVJFZHVHa3FXR3p3cG43USIgaWQ9Ii12QmRmdWlrNXVqaEplVkt5elY3X1lBIiB1cmk9ImNvbnRlbnQueG1pIi8+Ci0gIDwvb3JnLmVjbGlwc2UuZXBmLnVtYS5yZXNvdXJjZW1hbmFnZXI6UmVzb3VyY2VNYW5hZ2VyPgotICA8b3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzQ29tcG9uZW50IHhtaTppZD0iX0xic3F3RTVSRWR1R2txV0d6d3BuN1EiIG5hbWU9ImNwIiBndWlkPSJfTGJzcXdFNVJFZHVHa3FXR3p3cG43USI+Ci0gICAgPHByb2Nlc3MgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q2FwYWJpbGl0eVBhdHRlcm4iIHhtaTppZD0iX0xic3F3VTVSRWR1R2txV0d6d3BuN1EiIG5hbWU9ImNwIiBndWlkPSJfTGJzcXdVNVJFZHVHa3FXR3p3cG43USIgcHJlc2VudGF0aW9uTmFtZT0iY3AiPgotICAgICAgPHByZXNlbnRhdGlvbiB4bWk6aWQ9Ii12QmRmdWlrNXVqaEplVkt5elY3X1lBIiBocmVmPSJ1bWE6Ly8tdkJkZnVpazV1amhKZVZLeXpWN19ZQSMtdkJkZnVpazV1amhKZVZLeXpWN19ZQSIvPgotICAgICAgPGRlZmF1bHRDb250ZXh0IGhyZWY9InVtYTovL184eWd6MEU1UUVkdUdrcVdHendwbjdRI19BZ0JuWUU1UkVkdUdrcVdHendwbjdRIi8+Ci0gICAgICA8dmFsaWRDb250ZXh0IGhyZWY9InVtYTovL184eWd6MEU1UUVkdUdrcVdHendwbjdRI19BZ0JuWUU1UkVkdUdrcVdHendwbjdRIi8+Ci0gICAgPC9wcm9jZXNzPgotICA8L29yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc0NvbXBvbmVudD4KLTwveG1pOlhNST4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNTg5MTNuMTU4OTI1LzE1ODkxM24xNTg5MjVtL25ld19wbHVnLWluL3BsdWdpbi54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTU4OTEzbjE1ODkyNS8xNTg5MTNuMTU4OTI1bS9uZXdfcGx1Zy1pbi9wbHVnaW4ueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YTNmZGVkLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNTg5MTNuMTU4OTI1LzE1ODkxM24xNTg5MjVtL25ld19wbHVnLWluL3BsdWdpbi54bWkKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHhtaTpYTUkgeG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hLnJlc291cmNlbWFuYWdlcj0iaHR0cDovLy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Jlc291cmNlbWFuYWdlci5lY29yZSIgeG1sbnM6ZXBmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZiIgZXBmOnZlcnNpb249IjEuMi4wIj4KLSAgPG9yZy5lY2xpcHNlLmVwZi51bWEucmVzb3VyY2VtYW5hZ2VyOlJlc291cmNlTWFuYWdlciB4bWk6aWQ9Il8tUEpKNFU1UUVkdUdrcVdHendwbjdRIiBndWlkPSJfLVBKSjRVNVFFZHVHa3FXR3p3cG43USI+Ci0gICAgPHN1Yk1hbmFnZXJzIHhtaTppZD0iX0xjUlNnVTVSRWR1R2txV0d6d3BuN1EiIGhyZWY9InVtYTovL19MYnNxd0U1UkVkdUdrcVdHendwbjdRI19MY1JTZ1U1UkVkdUdrcVdHendwbjdRIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfTGJ5eFlVNVJFZHVHa3FXR3p3cG43USIgaWQ9Il9MYnNxd0U1UkVkdUdrcVdHendwbjdRIiB1cmk9ImNhcGFiaWxpdHlwYXR0ZXJucy9jcC9tb2RlbC54bWkiLz4KLSAgPC9vcmcuZWNsaXBzZS5lcGYudW1hLnJlc291cmNlbWFuYWdlcjpSZXNvdXJjZU1hbmFnZXI+Ci0gIDxvcmcuZWNsaXBzZS5lcGYudW1hOk1ldGhvZFBsdWdpbiB4bWk6aWQ9Il8tUEREUUU1UUVkdUdrcVdHendwbjdRIiBuYW1lPSJuZXdfcGx1Zy1pbiIgZ3VpZD0iXy1QRERRRTVRRWR1R2txV0d6d3BuN1EiPgotICAgIDxtZXRob2RQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfLVBERFFVNVFFZHVHa3FXR3p3cG43USIgbmFtZT0iQ29udGVudCIgZ3VpZD0iXy1QRERRVTVRRWR1R2txV0d6d3BuN1EiPgotICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iXy1QRERRazVRRWR1R2txV0d6d3BuN1EiIG5hbWU9IkNhdGVnb3JpZXMiIGd1aWQ9Il8tUEREUWs1UUVkdUdrcVdHendwbjdRIj4KLSAgICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iXy1QRERRMDVRRWR1R2txV0d6d3BuN1EiIG5hbWU9IkRvbWFpbnMiIGd1aWQ9Il8tUEREUTA1UUVkdUdrcVdHendwbjdRIi8+Ci0gICAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il8tUEREUkU1UUVkdUdrcVdHendwbjdRIiBuYW1lPSJEaXNjaXBsaW5lcyIgZ3VpZD0iXy1QRERSRTVRRWR1R2txV0d6d3BuN1EiLz4KLSAgICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iXy1QRERSVTVRRWR1R2txV0d6d3BuN1EiIG5hbWU9IlJvbGVTZXRzIiBndWlkPSJfLVBERFJVNVFFZHVHa3FXR3p3cG43USIvPgotICAgICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfLVBERFJrNVFFZHVHa3FXR3p3cG43USIgbmFtZT0iV1AgVHlwZXMiIGd1aWQ9Il8tUEREUms1UUVkdUdrcVdHendwbjdRIi8+Ci0gICAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il8tUEREUjA1UUVkdUdrcVdHendwbjdRIiBuYW1lPSJUb29scyIgZ3VpZD0iXy1QRERSMDVRRWR1R2txV0d6d3BuN1EiLz4KLSAgICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iXy1QRERTRTVRRWR1R2txV0d6d3BuN1EiIG5hbWU9IlN0YW5kYXJkQ2F0ZWdvcmllcyIgZ3VpZD0iXy1QRERTRTVRRWR1R2txV0d6d3BuN1EiLz4KLSAgICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iXy1QRERTVTVRRWR1R2txV0d6d3BuN1EiIG5hbWU9IkN1c3RvbUNhdGVnb3JpZXMiIGd1aWQ9Il8tUEREU1U1UUVkdUdrcVdHendwbjdRIj4KLSAgICAgICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfLVBERFNrNVFFZHVHa3FXR3p3cG43USIgbmFtZT0iSGlkZGVuIiBndWlkPSJfLVBERFNrNVFFZHVHa3FXR3p3cG43USI+Ci0gICAgICAgICAgICA8Y29udGVudEVsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkN1c3RvbUNhdGVnb3J5IiB4bWk6aWQ9Il8tUEREUzA1UUVkdUdrcVdHendwbjdRIiBuYW1lPSJDdXN0b20gQ2F0ZWdvcmllcyIgZ3VpZD0iXy1QRERTMDVRRWR1R2txV0d6d3BuN1EiLz4KLSAgICAgICAgICA8L2NoaWxkUGFja2FnZXM+Ci0gICAgICAgIDwvY2hpbGRQYWNrYWdlcz4KLSAgICAgIDwvY2hpbGRQYWNrYWdlcz4KLSAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il8tUEREVEU1UUVkdUdrcVdHendwbjdRIiBuYW1lPSJDb3JlQ29udGVudCIgZ3VpZD0iXy1QRERURTVRRWR1R2txV0d6d3BuN1EiPgotICAgICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfS1JydXNFNVJFZHVHa3FXR3p3cG43USIgbmFtZT0ibmV3X2NvbnRlbnRfcGFja2FnZSIgZ3VpZD0iX0tScnVzRTVSRWR1R2txV0d6d3BuN1EiLz4KLSAgICAgIDwvY2hpbGRQYWNrYWdlcz4KLSAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NQYWNrYWdlIiB4bWk6aWQ9Il8tUEREVFU1UUVkdUdrcVdHendwbjdRIiBuYW1lPSJDYXBhYmlsaXR5UGF0dGVybnMiIGd1aWQ9Il8tUEREVFU1UUVkdUdrcVdHendwbjdRIj4KLSAgICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc0NvbXBvbmVudCIgeG1pOmlkPSJfTGJzcXdFNVJFZHVHa3FXR3p3cG43USIgaHJlZj0idW1hOi8vX0xic3F3RTVSRWR1R2txV0d6d3BuN1EjX0xic3F3RTVSRWR1R2txV0d6d3BuN1EiLz4KLSAgICAgIDwvY2hpbGRQYWNrYWdlcz4KLSAgICA8L21ldGhvZFBhY2thZ2VzPgotICAgIDxtZXRob2RQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzUGFja2FnZSIgeG1pOmlkPSJfLVBERFRrNVFFZHVHa3FXR3p3cG43USIgbmFtZT0iRGVsaXZlcnlQcm9jZXNzZXMiIGd1aWQ9Il8tUEREVGs1UUVkdUdrcVdHendwbjdRIi8+Ci0gICAgPG1ldGhvZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NQYWNrYWdlIiB4bWk6aWQ9Il8tUEREVDA1UUVkdUdrcVdHendwbjdRIiBuYW1lPSJQcm9jZXNzQ29udHJpYnV0aW9ucyIgZ3VpZD0iXy1QRERUMDVRRWR1R2txV0d6d3BuN1EiLz4KLSAgPC9vcmcuZWNsaXBzZS5lcGYudW1hOk1ldGhvZFBsdWdpbj4KLTwveG1pOlhNST4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzLy5wcm9qZWN0IGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1ZGIwMWEuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5QYXJpczwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wcm9qZWN0Lk1ldGhvZExpYnJhcnlQcm9qZWN0TmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvY2FwYWJpbGl0eXBhdHRlcm5zL0NQIEExL2NvbnRlbnQueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2NhcGFiaWxpdHlwYXR0ZXJucy9DUCBBMS9jb250ZW50LnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTNkOGJmZS4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvY2FwYWJpbGl0eXBhdHRlcm5zL0NQIEExL2NvbnRlbnQueG1pCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPG9yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc0Rlc2NyaXB0aW9uIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6ZXBmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZiIgZXBmOnZlcnNpb249IjEuMi4wIiB4bWk6aWQ9Ii05OFdUV3VyQk1TaUVoaFpGSXN5a2tBIiBuYW1lPSJDUCBBMSxfZEJodmtVQXZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iLTk4V1RXdXJCTVNpRWhoWkZJc3lra0EiLz4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9jYXBhYmlsaXR5cGF0dGVybnMvQ1AgQTEvZGlhZ3JhbS54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvY2FwYWJpbGl0eXBhdHRlcm5zL0NQIEExL2RpYWdyYW0ueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NDE2ZGIwLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9jYXBhYmlsaXR5cGF0dGVybnMvQ1AgQTEvZGlhZ3JhbS54bWkKKysrIC9kZXYvbnVsbApAQCAtMSwxOTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTx4bWk6WE1JIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6bm90YXRpb249Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZ21mL3J1bnRpbWUvMS4wLjAvbm90YXRpb24iIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi9kaWFncmFtLzEuMC4wL2RpYWdyYW0uZWNvcmUiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiPgotICA8b3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw6QWN0aXZpdHlEZXRhaWxEaWFncmFtIHhtaTppZD0iX0ljVWpRT3g0RWR1Mk9vNnEtbkhXZ2ciPgotICAgIDxsaW5rZWRFbGVtZW50IHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNhcGFiaWxpdHlQYXR0ZXJuIiBocmVmPSJ1bWE6Ly9fZEJodmtFQXZFZHFGcUl1OC1ja29sZyNfZEJodmtVQXZFZHFGcUl1OC1ja29sZyIvPgotICA8L29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOkFjdGl2aXR5RGV0YWlsRGlhZ3JhbT4KLSAgPG5vdGF0aW9uOkRpYWdyYW0geG1pOmlkPSJfSWNValFleDRFZHUyT282cS1uSFdnZyIgdHlwZT0iQUREIiBlbGVtZW50PSJfSWNValFPeDRFZHUyT282cS1uSFdnZyIgbmFtZT0iQ1AgQTEiIG1lYXN1cmVtZW50VW5pdD0iUGl4ZWwiPgotICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOlBhZ2VTdHlsZSIgeG1pOmlkPSJfSWNValF1eDRFZHUyT282cS1uSFdnZyIvPgotICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkd1aWRlU3R5bGUiIHhtaTppZD0iX0ljVWpRLXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpEZXNjcmlwdGlvblN0eWxlIiB4bWk6aWQ9Il9JY1VqUk94NEVkdTJPbzZxLW5IV2dnIi8+Ci0gIDwvbm90YXRpb246RGlhZ3JhbT4KLSAgPG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOkFjdGl2aXR5RGV0YWlsRGlhZ3JhbSB4bWk6aWQ9Il9JY20zT2V4NEVkdTJPbzZxLW5IV2dnIj4KLSAgICA8bGlua2VkRWxlbWVudCB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpBY3Rpdml0eSIgaHJlZj0idW1hOi8vX2RCaHZrRUF2RWRxRnFJdTgtY2tvbGcjX2VhQ2FvRUF2RWRxRnFJdTgtY2tvbGciLz4KLSAgICA8bm9kZXMgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOlJvbGVUYXNrQ29tcG9zaXRlIiB4bWk6aWQ9Il9JY20zT3V4NEVkdTJPbzZxLW5IV2dnIj4KLSAgICAgIDxsaW5rZWRFbGVtZW50IHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlJvbGVEZXNjcmlwdG9yIiBocmVmPSJ1bWE6Ly9fZEJodmtFQXZFZHFGcUl1OC1ja29sZyNfZ0Y3VXNVQXZFZHFGcUl1OC1ja29sZyIvPgotICAgICAgPG5vZGVzIHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDpSb2xlTm9kZSIgeG1pOmlkPSJfSWNtM08teDRFZHUyT282cS1uSFdnZyIgbmFtZT0iUm9sZSBBMSI+Ci0gICAgICAgIDxsaW5rZWRFbGVtZW50IHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlJvbGVEZXNjcmlwdG9yIiBocmVmPSJ1bWE6Ly9fZEJodmtFQXZFZHFGcUl1OC1ja29sZyNfZ0Y3VXNVQXZFZHFGcUl1OC1ja29sZyIvPgotICAgICAgPC9ub2Rlcz4KLSAgICAgIDxub2RlcyB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw6VGFza05vZGUiIHhtaTppZD0iX0ljbTNQT3g0RWR1Mk9vNnEtbkhXZ2ciIGluY29taW5nQ29ubmVjdGlvbnM9Il9JY20zUC14NEVkdTJPbzZxLW5IV2dnIiBuYW1lPSJUYXNrIEExIHByZXNlbnQiPgotICAgICAgICA8bGlua2VkRWxlbWVudCB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpUYXNrRGVzY3JpcHRvciIgaHJlZj0idW1hOi8vX2RCaHZrRUF2RWRxRnFJdTgtY2tvbGcjX2dGN1VzRUF2RWRxRnFJdTgtY2tvbGciLz4KLSAgICAgICAgPG91dGdvaW5nQ29ubmVjdGlvbnMgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOkxpbmsiIHhtaTppZD0iX0ljbTNQZXg0RWR1Mk9vNnEtbkhXZ2ciIHRhcmdldD0iX0ljbTNRdXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDwvbm9kZXM+Ci0gICAgPC9ub2Rlcz4KLSAgICA8bm9kZXMgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOldvcmtQcm9kdWN0Q29tcG9zaXRlIiB4bWk6aWQ9Il9JY20zUHV4NEVkdTJPbzZxLW5IV2dnIiB0eXBlPSIxIj4KLSAgICAgIDxsaW5rZWRFbGVtZW50IHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlRhc2tEZXNjcmlwdG9yIiBocmVmPSJ1bWE6Ly9fZEJodmtFQXZFZHFGcUl1OC1ja29sZyNfZ0Y3VXNFQXZFZHFGcUl1OC1ja29sZyIvPgotICAgICAgPG91dGdvaW5nQ29ubmVjdGlvbnMgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOkxpbmsiIHhtaTppZD0iX0ljbTNQLXg0RWR1Mk9vNnEtbkhXZ2ciIHRhcmdldD0iX0ljbTNQT3g0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxub2RlcyB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw6V29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZSIgeG1pOmlkPSJfSWNtM1FPeDRFZHUyT282cS1uSFdnZyIgbmFtZT0iU3ViX0FydGlmYWN0IEExLjEgcHJlc2VudCI+Ci0gICAgICAgIDxsaW5rZWRFbGVtZW50IHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOldvcmtQcm9kdWN0RGVzY3JpcHRvciIgaHJlZj0idW1hOi8vX2RCaHZrRUF2RWRxRnFJdTgtY2tvbGcjX2dGN1VzMEF2RWRxRnFJdTgtY2tvbGciLz4KLSAgICAgIDwvbm9kZXM+Ci0gICAgICA8bm9kZXMgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOldvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGUiIHhtaTppZD0iX0ljbTNRZXg0RWR1Mk9vNnEtbkhXZ2ciIG5hbWU9IkFydGlmYWN0IEExIHByZXNlbnQiPgotICAgICAgICA8bGlua2VkRWxlbWVudCB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpXb3JrUHJvZHVjdERlc2NyaXB0b3IiIGhyZWY9InVtYTovL19kQmh2a0VBdkVkcUZxSXU4LWNrb2xnI19nR0Vlb0VBdkVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgICA8L25vZGVzPgotICAgIDwvbm9kZXM+Ci0gICAgPG5vZGVzIHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDpXb3JrUHJvZHVjdENvbXBvc2l0ZSIgeG1pOmlkPSJfSWNtM1F1eDRFZHUyT282cS1uSFdnZyIgaW5jb21pbmdDb25uZWN0aW9ucz0iX0ljbTNQZXg0RWR1Mk9vNnEtbkhXZ2ciIHR5cGU9IjIiPgotICAgICAgPGxpbmtlZEVsZW1lbnQgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VGFza0Rlc2NyaXB0b3IiIGhyZWY9InVtYTovL19kQmh2a0VBdkVkcUZxSXU4LWNrb2xnI19nRjdVc0VBdkVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgICA8bm9kZXMgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOldvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGUiIHhtaTppZD0iX0ljbTNRLXg0RWR1Mk9vNnEtbkhXZ2ciIG5hbWU9Ik91dGNvbWUgQTEgcHJlc2VudCI+Ci0gICAgICAgIDxsaW5rZWRFbGVtZW50IHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOldvcmtQcm9kdWN0RGVzY3JpcHRvciIgaHJlZj0idW1hOi8vX2RCaHZrRUF2RWRxRnFJdTgtY2tvbGcjX2dHRWVva0F2RWRxRnFJdTgtY2tvbGciLz4KLSAgICAgIDwvbm9kZXM+Ci0gICAgPC9ub2Rlcz4KLSAgICA8bm9kZXMgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOlJvbGVUYXNrQ29tcG9zaXRlIiB4bWk6aWQ9Il9JY20zUk94NEVkdTJPbzZxLW5IV2dnIj4KLSAgICAgIDxsaW5rZWRFbGVtZW50IHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlJvbGVEZXNjcmlwdG9yIiBocmVmPSJ1bWE6Ly9fZEJodmtFQXZFZHFGcUl1OC1ja29sZyNfanZTQkFFQXZFZHFGcUl1OC1ja29sZyIvPgotICAgICAgPG5vZGVzIHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDpSb2xlTm9kZSIgeG1pOmlkPSJfSWNtM1JleDRFZHUyT282cS1uSFdnZyIgbmFtZT0iUm9sZSBCMSBwcmVzZW50Ij4KLSAgICAgICAgPGxpbmtlZEVsZW1lbnQgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Um9sZURlc2NyaXB0b3IiIGhyZWY9InVtYTovL19kQmh2a0VBdkVkcUZxSXU4LWNrb2xnI19qdlNCQUVBdkVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgICA8L25vZGVzPgotICAgICAgPG5vZGVzIHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDpUYXNrTm9kZSIgeG1pOmlkPSJfSWNtM1J1eDRFZHUyT282cS1uSFdnZyIgaW5jb21pbmdDb25uZWN0aW9ucz0iX0ljbTNTZXg0RWR1Mk9vNnEtbkhXZ2ciIG5hbWU9IlRhc2sgQjEgcHJlc25ldCI+Ci0gICAgICAgIDxsaW5rZWRFbGVtZW50IHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlRhc2tEZXNjcmlwdG9yIiBocmVmPSJ1bWE6Ly9fZEJodmtFQXZFZHFGcUl1OC1ja29sZyNfakJGZVFFQXZFZHFGcUl1OC1ja29sZyIvPgotICAgICAgICA8b3V0Z29pbmdDb25uZWN0aW9ucyB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw6TGluayIgeG1pOmlkPSJfSWNtM1IteDRFZHUyT282cS1uSFdnZyIgdGFyZ2V0PSJfSWNtM1MteDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPC9ub2Rlcz4KLSAgICA8L25vZGVzPgotICAgIDxub2RlcyB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw6V29ya1Byb2R1Y3RDb21wb3NpdGUiIHhtaTppZD0iX0ljbTNTT3g0RWR1Mk9vNnEtbkhXZ2ciIHR5cGU9IjEiPgotICAgICAgPGxpbmtlZEVsZW1lbnQgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VGFza0Rlc2NyaXB0b3IiIGhyZWY9InVtYTovL19kQmh2a0VBdkVkcUZxSXU4LWNrb2xnI19qQkZlUUVBdkVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgICA8b3V0Z29pbmdDb25uZWN0aW9ucyB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw6TGluayIgeG1pOmlkPSJfSWNtM1NleDRFZHUyT282cS1uSFdnZyIgdGFyZ2V0PSJfSWNtM1J1eDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPG5vZGVzIHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDpXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlIiB4bWk6aWQ9Il9JY20zU3V4NEVkdTJPbzZxLW5IV2dnIiBuYW1lPSJBcnRpZmFjdCBCMSBwcmVzZW50Ij4KLSAgICAgICAgPGxpbmtlZEVsZW1lbnQgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6V29ya1Byb2R1Y3REZXNjcmlwdG9yIiBocmVmPSJ1bWE6Ly9fZEJodmtFQXZFZHFGcUl1OC1ja29sZyNfanZTQkFrQXZFZHFGcUl1OC1ja29sZyIvPgotICAgICAgPC9ub2Rlcz4KLSAgICA8L25vZGVzPgotICAgIDxub2RlcyB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw6V29ya1Byb2R1Y3RDb21wb3NpdGUiIHhtaTppZD0iX0ljbTNTLXg0RWR1Mk9vNnEtbkhXZ2ciIGluY29taW5nQ29ubmVjdGlvbnM9Il9JY20zUi14NEVkdTJPbzZxLW5IV2dnIiB0eXBlPSIyIj4KLSAgICAgIDxsaW5rZWRFbGVtZW50IHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlRhc2tEZXNjcmlwdG9yIiBocmVmPSJ1bWE6Ly9fZEJodmtFQXZFZHFGcUl1OC1ja29sZyNfakJGZVFFQXZFZHFGcUl1OC1ja29sZyIvPgotICAgICAgPG5vZGVzIHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDpXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlIiB4bWk6aWQ9Il9JY20zVE94NEVkdTJPbzZxLW5IV2dnIiBuYW1lPSJPdXRjb21lIEIxIHByZXNlbnQiPgotICAgICAgICA8bGlua2VkRWxlbWVudCB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpXb3JrUHJvZHVjdERlc2NyaXB0b3IiIGhyZWY9InVtYTovL19kQmh2a0VBdkVkcUZxSXU4LWNrb2xnI19qdlNCQkVBdkVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgICA8L25vZGVzPgotICAgIDwvbm9kZXM+Ci0gICAgPG5vZGVzIHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDpSb2xlVGFza0NvbXBvc2l0ZSIgeG1pOmlkPSJfSWNtM1RleDRFZHUyT282cS1uSFdnZyI+Ci0gICAgICA8bGlua2VkRWxlbWVudCB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpSb2xlRGVzY3JpcHRvciIgaHJlZj0idW1hOi8vX2RCaHZrRUF2RWRxRnFJdTgtY2tvbGcjX2p2U0JBVUF2RWRxRnFJdTgtY2tvbGciLz4KLSAgICAgIDxub2RlcyB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw6Um9sZU5vZGUiIHhtaTppZD0iX0ljbTNUdXg0RWR1Mk9vNnEtbkhXZ2ciIG5hbWU9IlJvbGUgQjIgcHJlc2VudCI+Ci0gICAgICAgIDxsaW5rZWRFbGVtZW50IHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlJvbGVEZXNjcmlwdG9yIiBocmVmPSJ1bWE6Ly9fZEJodmtFQXZFZHFGcUl1OC1ja29sZyNfanZTQkFVQXZFZHFGcUl1OC1ja29sZyIvPgotICAgICAgPC9ub2Rlcz4KLSAgICAgIDxub2RlcyB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw6VGFza05vZGUiIHhtaTppZD0iX0ljbTNULXg0RWR1Mk9vNnEtbkhXZ2ciIGluY29taW5nQ29ubmVjdGlvbnM9Il9JY20zVXV4NEVkdTJPbzZxLW5IV2dnIiBuYW1lPSJUYXNrIEIyIHByZXNlbnQiPgotICAgICAgICA8bGlua2VkRWxlbWVudCB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpUYXNrRGVzY3JpcHRvciIgaHJlZj0idW1hOi8vX2RCaHZrRUF2RWRxRnFJdTgtY2tvbGcjX2tZam5nRUF2RWRxRnFJdTgtY2tvbGciLz4KLSAgICAgICAgPG91dGdvaW5nQ29ubmVjdGlvbnMgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOkxpbmsiIHhtaTppZD0iX0ljbTNVT3g0RWR1Mk9vNnEtbkhXZ2ciIHRhcmdldD0iX0ljbTNWT3g0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDwvbm9kZXM+Ci0gICAgPC9ub2Rlcz4KLSAgICA8bm9kZXMgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOldvcmtQcm9kdWN0Q29tcG9zaXRlIiB4bWk6aWQ9Il9JY20zVWV4NEVkdTJPbzZxLW5IV2dnIiB0eXBlPSIxIj4KLSAgICAgIDxsaW5rZWRFbGVtZW50IHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlRhc2tEZXNjcmlwdG9yIiBocmVmPSJ1bWE6Ly9fZEJodmtFQXZFZHFGcUl1OC1ja29sZyNfa1lqbmdFQXZFZHFGcUl1OC1ja29sZyIvPgotICAgICAgPG91dGdvaW5nQ29ubmVjdGlvbnMgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOkxpbmsiIHhtaTppZD0iX0ljbTNVdXg0RWR1Mk9vNnEtbkhXZ2ciIHRhcmdldD0iX0ljbTNULXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxub2RlcyB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw6V29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZSIgeG1pOmlkPSJfSWNtM1UteDRFZHUyT282cS1uSFdnZyIgbmFtZT0iQXJ0aWZhY3QgQjIgcHJlc2VudCI+Ci0gICAgICAgIDxsaW5rZWRFbGVtZW50IHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOldvcmtQcm9kdWN0RGVzY3JpcHRvciIgaHJlZj0idW1hOi8vX2RCaHZrRUF2RWRxRnFJdTgtY2tvbGcjX2tZX3NZRUF2RWRxRnFJdTgtY2tvbGciLz4KLSAgICAgIDwvbm9kZXM+Ci0gICAgPC9ub2Rlcz4KLSAgICA8bm9kZXMgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOldvcmtQcm9kdWN0Q29tcG9zaXRlIiB4bWk6aWQ9Il9JY20zVk94NEVkdTJPbzZxLW5IV2dnIiBpbmNvbWluZ0Nvbm5lY3Rpb25zPSJfSWNtM1VPeDRFZHUyT282cS1uSFdnZyIgdHlwZT0iMiI+Ci0gICAgICA8bGlua2VkRWxlbWVudCB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpUYXNrRGVzY3JpcHRvciIgaHJlZj0idW1hOi8vX2RCaHZrRUF2RWRxRnFJdTgtY2tvbGcjX2tZam5nRUF2RWRxRnFJdTgtY2tvbGciLz4KLSAgICAgIDxub2RlcyB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw6V29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZSIgeG1pOmlkPSJfSWNtM1ZleDRFZHUyT282cS1uSFdnZyIgbmFtZT0iT3V0Y29tZSBCMiBwcmVzZW50Ij4KLSAgICAgICAgPGxpbmtlZEVsZW1lbnQgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6V29ya1Byb2R1Y3REZXNjcmlwdG9yIiBocmVmPSJ1bWE6Ly9fZEJodmtFQXZFZHFGcUl1OC1ja29sZyNfa1lfc1lrQXZFZHFGcUl1OC1ja29sZyIvPgotICAgICAgPC9ub2Rlcz4KLSAgICA8L25vZGVzPgotICAgIDxub2RlcyB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw6Um9sZVRhc2tDb21wb3NpdGUiIHhtaTppZD0iX0ljbTNWdXg0RWR1Mk9vNnEtbkhXZ2ciPgotICAgICAgPGxpbmtlZEVsZW1lbnQgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Um9sZURlc2NyaXB0b3IiIGhyZWY9InVtYTovL19kQmh2a0VBdkVkcUZxSXU4LWNrb2xnI19nRjdVc2tBdkVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgPC9ub2Rlcz4KLSAgICA8bm9kZXMgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOldvcmtQcm9kdWN0Q29tcG9zaXRlIiB4bWk6aWQ9Il9JY20zVi14NEVkdTJPbzZxLW5IV2dnIiBpbmNvbWluZ0Nvbm5lY3Rpb25zPSJfSWNtM1dPeDRFZHUyT282cS1uSFdnZyIgdHlwZT0iMSI+Ci0gICAgICA8bGlua2VkRWxlbWVudCB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpUYXNrRGVzY3JpcHRvciIgaHJlZj0idW1hOi8vX2RCaHZrRUF2RWRxRnFJdTgtY2tvbGcjX2EwZ2t3RUEzRWRxRnFJdTgtY2tvbGciLz4KLSAgICAgIDxvdXRnb2luZ0Nvbm5lY3Rpb25zIHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDpMaW5rIiB4bWk6aWQ9Il9JY20zV094NEVkdTJPbzZxLW5IV2dnIiB0YXJnZXQ9Il9JY20zVi14NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8bm9kZXMgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOldvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGUiIHhtaTppZD0iX0ljbTNXZXg0RWR1Mk9vNnEtbkhXZ2ciIG5hbWU9IkFydGlmYWN0IEEyIHByZXNlbnQiPgotICAgICAgICA8bGlua2VkRWxlbWVudCB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpXb3JrUHJvZHVjdERlc2NyaXB0b3IiIGhyZWY9InVtYTovL19kQmh2a0VBdkVkcUZxSXU4LWNrb2xnI19hMXRlb0VBM0VkcUZxSXU4LWNrb2xnIi8+Ci0gICAgICA8L25vZGVzPgotICAgIDwvbm9kZXM+Ci0gICAgPG5vZGVzIHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDpXb3JrUHJvZHVjdENvbXBvc2l0ZSIgeG1pOmlkPSJfSWNtM1d1eDRFZHUyT282cS1uSFdnZyIgdHlwZT0iMiI+Ci0gICAgICA8bGlua2VkRWxlbWVudCB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpUYXNrRGVzY3JpcHRvciIgaHJlZj0idW1hOi8vX2RCaHZrRUF2RWRxRnFJdTgtY2tvbGcjX2EwZ2t3RUEzRWRxRnFJdTgtY2tvbGciLz4KLSAgICAgIDxub2RlcyB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw6V29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZSIgeG1pOmlkPSJfSWNtM1cteDRFZHUyT282cS1uSFdnZyIgbmFtZT0iT3V0Y29tZSBBMiBwcmVzZW50Ij4KLSAgICAgICAgPGxpbmtlZEVsZW1lbnQgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6V29ya1Byb2R1Y3REZXNjcmlwdG9yIiBocmVmPSJ1bWE6Ly9fZEJodmtFQXZFZHFGcUl1OC1ja29sZyNfYTNNc1lFQTNFZHFGcUl1OC1ja29sZyIvPgotICAgICAgPC9ub2Rlcz4KLSAgICA8L25vZGVzPgotICA8L29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOkFjdGl2aXR5RGV0YWlsRGlhZ3JhbT4KLSAgPG5vdGF0aW9uOkRpYWdyYW0geG1pOmlkPSJfSWNtM1hPeDRFZHUyT282cS1uSFdnZyIgdHlwZT0iQUREIiBlbGVtZW50PSJfSWNtM09leDRFZHUyT282cS1uSFdnZyIgbmFtZT0iQWN0MSIgbWVhc3VyZW1lbnRVbml0PSJQaXhlbCI+Ci0gICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il9JY20zWU94NEVkdTJPbzZxLW5IV2dnIiB0eXBlPSIxMDAxIiBlbGVtZW50PSJfSWNtM091eDRFZHUyT282cS1uSFdnZyI+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpGb250U3R5bGUiIHhtaTppZD0iX0ljbTNZZXg0RWR1Mk9vNnEtbkhXZ2ciIGZvbnROYW1lPSJBcmlhbCIgZm9udEhlaWdodD0iOCIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RGVzY3JpcHRpb25TdHlsZSIgeG1pOmlkPSJfSWNtM1l1eDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RmlsbFN0eWxlIiB4bWk6aWQ9Il9JY20zWS14NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpMaW5lU3R5bGUiIHhtaTppZD0iX0ljbTNaT3g0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0ljbTNadXg0RWR1Mk9vNnEtbkhXZ2ciIHg9IjIwIiB5PSIxNjkiIHdpZHRoPSIxNTgiIGhlaWdodD0iNTMiLz4KLSAgICA8L2NoaWxkcmVuPgotICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfSWNtM1oteDRFZHUyT282cS1uSFdnZyIgdHlwZT0iMTAwMiIgZWxlbWVudD0iX0ljbTNQdXg0RWR1Mk9vNnEtbkhXZ2ciPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246Rm9udFN0eWxlIiB4bWk6aWQ9Il9JY20zYU94NEVkdTJPbzZxLW5IV2dnIiBmb250TmFtZT0iQXJpYWwiIGZvbnRIZWlnaHQ9IjgiLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkRlc2NyaXB0aW9uU3R5bGUiIHhtaTppZD0iX0ljbTNhZXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkZpbGxTdHlsZSIgeG1pOmlkPSJfSWNtM2F1eDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246TGluZVN0eWxlIiB4bWk6aWQ9Il9JY20zYS14NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9JY20zYmV4NEVkdTJPbzZxLW5IV2dnIiB4PSI4NiIgeT0iMSIgd2lkdGg9Ijg0IiBoZWlnaHQ9IjE0OCIvPgotICAgIDwvY2hpbGRyZW4+Ci0gICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il9JY20zYnV4NEVkdTJPbzZxLW5IV2dnIiB0eXBlPSIxMDAyIiBlbGVtZW50PSJfSWNtM1F1eDRFZHUyT282cS1uSFdnZyI+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpGb250U3R5bGUiIHhtaTppZD0iX0ljbTNiLXg0RWR1Mk9vNnEtbkhXZ2ciIGZvbnROYW1lPSJBcmlhbCIgZm9udEhlaWdodD0iOCIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RGVzY3JpcHRpb25TdHlsZSIgeG1pOmlkPSJfSWNtM2NPeDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RmlsbFN0eWxlIiB4bWk6aWQ9Il9JY20zY2V4NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpMaW5lU3R5bGUiIHhtaTppZD0iX0ljbTNjdXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0ljbTNkT3g0RWR1Mk9vNnEtbkhXZ2ciIHg9IjkxIiB5PSIyNDIiIHdpZHRoPSI3NCIgaGVpZ2h0PSIxMTEiLz4KLSAgICA8L2NoaWxkcmVuPgotICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfSWNtM2RleDRFZHUyT282cS1uSFdnZyIgdHlwZT0iMTAwMSIgZWxlbWVudD0iX0ljbTNST3g0RWR1Mk9vNnEtbkhXZ2ciPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246Rm9udFN0eWxlIiB4bWk6aWQ9Il9JY20zZHV4NEVkdTJPbzZxLW5IV2dnIiBmb250TmFtZT0iQXJpYWwiIGZvbnRIZWlnaHQ9IjgiLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkRlc2NyaXB0aW9uU3R5bGUiIHhtaTppZD0iX0ljbTNkLXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkZpbGxTdHlsZSIgeG1pOmlkPSJfSWNtM2VPeDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246TGluZVN0eWxlIiB4bWk6aWQ9Il9JY20zZWV4NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9JY20zZS14NEVkdTJPbzZxLW5IV2dnIiB4PSIyMCIgeT0iNzkzIiB3aWR0aD0iMTk2IiBoZWlnaHQ9IjUzIi8+Ci0gICAgPC9jaGlsZHJlbj4KLSAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOk5vZGUiIHhtaTppZD0iX0ljbTNmT3g0RWR1Mk9vNnEtbkhXZ2ciIHR5cGU9IjEwMDIiIGVsZW1lbnQ9Il9JY20zU094NEVkdTJPbzZxLW5IV2dnIj4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkZvbnRTdHlsZSIgeG1pOmlkPSJfSWNtM2ZleDRFZHUyT282cS1uSFdnZyIgZm9udE5hbWU9IkFyaWFsIiBmb250SGVpZ2h0PSI4Ii8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpEZXNjcmlwdGlvblN0eWxlIiB4bWk6aWQ9Il9JY20zZnV4NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpGaWxsU3R5bGUiIHhtaTppZD0iX0ljbTNmLXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkxpbmVTdHlsZSIgeG1pOmlkPSJfSWNtM2dPeDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSWNtM2d1eDRFZHUyT282cS1uSFdnZyIgeD0iMTMwIiB5PSI3MDYiIHdpZHRoPSI3MyIgaGVpZ2h0PSI2NyIvPgotICAgIDwvY2hpbGRyZW4+Ci0gICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il9JY20zZy14NEVkdTJPbzZxLW5IV2dnIiB0eXBlPSIxMDAyIiBlbGVtZW50PSJfSWNtM1MteDRFZHUyT282cS1uSFdnZyI+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpGb250U3R5bGUiIHhtaTppZD0iX0ljbTNoT3g0RWR1Mk9vNnEtbkhXZ2ciIGZvbnROYW1lPSJBcmlhbCIgZm9udEhlaWdodD0iOCIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RGVzY3JpcHRpb25TdHlsZSIgeG1pOmlkPSJfSWNtM2hleDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RmlsbFN0eWxlIiB4bWk6aWQ9Il9JY20zaHV4NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpMaW5lU3R5bGUiIHhtaTppZD0iX0ljbTNoLXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0ljczl3T3g0RWR1Mk9vNnEtbkhXZ2ciIHg9IjEzMCIgeT0iODY2IiB3aWR0aD0iNzMiIGhlaWdodD0iMTExIi8+Ci0gICAgPC9jaGlsZHJlbj4KLSAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOk5vZGUiIHhtaTppZD0iX0ljczl3ZXg0RWR1Mk9vNnEtbkhXZ2ciIHR5cGU9IjEwMDEiIGVsZW1lbnQ9Il9JY20zVGV4NEVkdTJPbzZxLW5IV2dnIj4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkZvbnRTdHlsZSIgeG1pOmlkPSJfSWNzOXd1eDRFZHUyT282cS1uSFdnZyIgZm9udE5hbWU9IkFyaWFsIiBmb250SGVpZ2h0PSI4Ii8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpEZXNjcmlwdGlvblN0eWxlIiB4bWk6aWQ9Il9JY3M5dy14NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpGaWxsU3R5bGUiIHhtaTppZD0iX0ljczl4T3g0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkxpbmVTdHlsZSIgeG1pOmlkPSJfSWNzOXhleDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSWNzOXgteDRFZHUyT282cS1uSFdnZyIgeD0iMjAiIHk9IjExMDUiIHdpZHRoPSIxOTYiIGhlaWdodD0iNTMiLz4KLSAgICA8L2NoaWxkcmVuPgotICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfSWNzOXlPeDRFZHUyT282cS1uSFdnZyIgdHlwZT0iMTAwMiIgZWxlbWVudD0iX0ljbTNVZXg0RWR1Mk9vNnEtbkhXZ2ciPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246Rm9udFN0eWxlIiB4bWk6aWQ9Il9JY3M5eWV4NEVkdTJPbzZxLW5IV2dnIiBmb250TmFtZT0iQXJpYWwiIGZvbnRIZWlnaHQ9IjgiLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkRlc2NyaXB0aW9uU3R5bGUiIHhtaTppZD0iX0ljczl5dXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkZpbGxTdHlsZSIgeG1pOmlkPSJfSWNzOXkteDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246TGluZVN0eWxlIiB4bWk6aWQ9Il9JY3M5ek94NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9JY3M5enV4NEVkdTJPbzZxLW5IV2dnIiB4PSIxMzAiIHk9IjEwMTgiIHdpZHRoPSI3MyIgaGVpZ2h0PSI2NyIvPgotICAgIDwvY2hpbGRyZW4+Ci0gICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il9JY3M5ei14NEVkdTJPbzZxLW5IV2dnIiB0eXBlPSIxMDAyIiBlbGVtZW50PSJfSWNtM1ZPeDRFZHUyT282cS1uSFdnZyI+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpGb250U3R5bGUiIHhtaTppZD0iX0ljczkwT3g0RWR1Mk9vNnEtbkhXZ2ciIGZvbnROYW1lPSJBcmlhbCIgZm9udEhlaWdodD0iOCIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RGVzY3JpcHRpb25TdHlsZSIgeG1pOmlkPSJfSWNzOTBleDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RmlsbFN0eWxlIiB4bWk6aWQ9Il9JY3M5MHV4NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpMaW5lU3R5bGUiIHhtaTppZD0iX0ljczkwLXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0ljczkxZXg0RWR1Mk9vNnEtbkhXZ2ciIHg9IjEzMCIgeT0iMTE3OCIgd2lkdGg9IjczIiBoZWlnaHQ9IjExMSIvPgotICAgIDwvY2hpbGRyZW4+Ci0gICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il9JY3M5MXV4NEVkdTJPbzZxLW5IV2dnIiB0eXBlPSIxMDAxIiBlbGVtZW50PSJfSWNtM1Z1eDRFZHUyT282cS1uSFdnZyI+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpGb250U3R5bGUiIHhtaTppZD0iX0ljczkxLXg0RWR1Mk9vNnEtbkhXZ2ciIGZvbnROYW1lPSJBcmlhbCIgZm9udEhlaWdodD0iOCIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RGVzY3JpcHRpb25TdHlsZSIgeG1pOmlkPSJfSWNzOTJPeDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RmlsbFN0eWxlIiB4bWk6aWQ9Il9JY3M5MmV4NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpMaW5lU3R5bGUiIHhtaTppZD0iX0ljczkydXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0ljczkzT3g0RWR1Mk9vNnEtbkhXZ2ciIHg9IjIwIiB5PSI0ODEiIHdpZHRoPSIxMjQiIGhlaWdodD0iNTMiLz4KLSAgICA8L2NoaWxkcmVuPgotICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfSWNzOTNleDRFZHUyT282cS1uSFdnZyIgdHlwZT0iMTAwMiIgZWxlbWVudD0iX0ljbTNWLXg0RWR1Mk9vNnEtbkhXZ2ciPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246Rm9udFN0eWxlIiB4bWk6aWQ9Il9JY3M5M3V4NEVkdTJPbzZxLW5IV2dnIiBmb250TmFtZT0iQXJpYWwiIGZvbnRIZWlnaHQ9IjgiLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkRlc2NyaXB0aW9uU3R5bGUiIHhtaTppZD0iX0ljczkzLXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkZpbGxTdHlsZSIgeG1pOmlkPSJfSWNzOTRPeDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246TGluZVN0eWxlIiB4bWk6aWQ9Il9JY3M5NGV4NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9JY3M5NC14NEVkdTJPbzZxLW5IV2dnIiB4PSI3NiIgeT0iMzk0IiB3aWR0aD0iNzQiIGhlaWdodD0iNjciLz4KLSAgICA8L2NoaWxkcmVuPgotICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfSWNzOTVPeDRFZHUyT282cS1uSFdnZyIgdHlwZT0iMTAwMiIgZWxlbWVudD0iX0ljbTNXdXg0RWR1Mk9vNnEtbkhXZ2ciPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246Rm9udFN0eWxlIiB4bWk6aWQ9Il9JY3M5NWV4NEVkdTJPbzZxLW5IV2dnIiBmb250TmFtZT0iQXJpYWwiIGZvbnRIZWlnaHQ9IjgiLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkRlc2NyaXB0aW9uU3R5bGUiIHhtaTppZD0iX0ljczk1dXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkZpbGxTdHlsZSIgeG1pOmlkPSJfSWNzOTUteDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246TGluZVN0eWxlIiB4bWk6aWQ9Il9JY3M5Nk94NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9JY3M5NnV4NEVkdTJPbzZxLW5IV2dnIiB4PSI3NiIgeT0iNTU0IiB3aWR0aD0iNzQiIGhlaWdodD0iMTExIi8+Ci0gICAgPC9jaGlsZHJlbj4KLSAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpQYWdlU3R5bGUiIHhtaTppZD0iX0ljbTNYZXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpHdWlkZVN0eWxlIiB4bWk6aWQ9Il9JY20zWHV4NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RGVzY3JpcHRpb25TdHlsZSIgeG1pOmlkPSJfSWNtM1gteDRFZHUyT282cS1uSFdnZyIvPgotICA8L25vdGF0aW9uOkRpYWdyYW0+Ci08L3htaTpYTUk+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvY2FwYWJpbGl0eXBhdHRlcm5zL0NQIEExL21vZGVsLnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9jYXBhYmlsaXR5cGF0dGVybnMvQ1AgQTEvbW9kZWwueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOGUyYWQ2Li4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9jYXBhYmlsaXR5cGF0dGVybnMvQ1AgQTEvbW9kZWwueG1pCisrKyAvZGV2L251bGwKQEAgLTEsMjc3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08eG1pOlhNSSB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWEucmVzb3VyY2VtYW5hZ2VyPSJodHRwOi8vL29yZy9lY2xpcHNlL2VwZi91bWEvcmVzb3VyY2VtYW5hZ2VyLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiPgotICA8b3JnLmVjbGlwc2UuZXBmLnVtYS5yZXNvdXJjZW1hbmFnZXI6UmVzb3VyY2VNYW5hZ2VyIHhtaTppZD0iX2RGMk80RUF2RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il9kRjJPNEVBdkVkcUZxSXU4LWNrb2xnIj4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il9kRjJPNFVBdkVkcUZxSXU4LWNrb2xnIiBpZD0iLTk4V1RXdXJCTVNpRWhoWkZJc3lra0EiIHVyaT0iY29udGVudC54bWkiLz4KLSAgPC9vcmcuZWNsaXBzZS5lcGYudW1hLnJlc291cmNlbWFuYWdlcjpSZXNvdXJjZU1hbmFnZXI+Ci0gIDxvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NDb21wb25lbnQgeG1pOmlkPSJfZEJodmtFQXZFZHFGcUl1OC1ja29sZyIgbmFtZT0iQ1AgQTEiIGd1aWQ9Il9kQmh2a0VBdkVkcUZxSXU4LWNrb2xnIj4KLSAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzUGFja2FnZSIgeG1pOmlkPSJfZVpTendFQXZFZHFGcUl1OC1ja29sZyIgbmFtZT0iQWN0MSIgZ3VpZD0iX2VaU3p3RUF2RWRxRnFJdTgtY2tvbGciPgotICAgICAgPHByb2Nlc3NFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpBY3Rpdml0eSIgeG1pOmlkPSJfZWFDYW9FQXZFZHFGcUl1OC1ja29sZyIgbmFtZT0iQWN0MSIgZ3VpZD0iX2VhQ2FvRUF2RWRxRnFJdTgtY2tvbGciIHByZXNlbnRhdGlvbk5hbWU9IkFjdDEiIHN1cGVyQWN0aXZpdGllcz0iX2RCaHZrVUF2RWRxRnFJdTgtY2tvbGciIGJyZWFrZG93bkVsZW1lbnRzPSJfZ0Y3VXNFQXZFZHFGcUl1OC1ja29sZyBfZ0Y3VXNVQXZFZHFGcUl1OC1ja29sZyBfZ0Y3VXNrQXZFZHFGcUl1OC1ja29sZyBfZ0Y3VXMwQXZFZHFGcUl1OC1ja29sZyBfZ0dFZW9FQXZFZHFGcUl1OC1ja29sZyBfZ0dFZW9VQXZFZHFGcUl1OC1ja29sZyBfZ0dFZW9rQXZFZHFGcUl1OC1ja29sZyBfakJGZVFFQXZFZHFGcUl1OC1ja29sZyBfanZTQkFFQXZFZHFGcUl1OC1ja29sZyBfanZTQkFVQXZFZHFGcUl1OC1ja29sZyBfanZTQkFrQXZFZHFGcUl1OC1ja29sZyBfanZTQkEwQXZFZHFGcUl1OC1ja29sZyBfanZTQkJFQXZFZHFGcUl1OC1ja29sZyBfa1lqbmdFQXZFZHFGcUl1OC1ja29sZyBfa1lfc1lFQXZFZHFGcUl1OC1ja29sZyBfa1lfc1lVQXZFZHFGcUl1OC1ja29sZyBfa1lfc1lrQXZFZHFGcUl1OC1ja29sZyBfYTBna3dFQTNFZHFGcUl1OC1ja29sZyBfYTF0ZW9FQTNFZHFGcUl1OC1ja29sZyBfYTJkRmdFQTNFZHFGcUl1OC1ja29sZyBfYTNNc1lFQTNFZHFGcUl1OC1ja29sZyIvPgotICAgICAgPHByb2Nlc3NFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpUYXNrRGVzY3JpcHRvciIgeG1pOmlkPSJfZ0Y3VXNFQXZFZHFGcUl1OC1ja29sZyIgbmFtZT0idGFza19BMSIgZ3VpZD0iX2dGN1VzRUF2RWRxRnFJdTgtY2tvbGciIGJyaWVmRGVzY3JpcHRpb249IlRhc2sgQTEgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IlRhc2sgQTEgcHJlc2VudCIgc3VwZXJBY3Rpdml0aWVzPSJfZWFDYW9FQXZFZHFGcUl1OC1ja29sZyIgYWRkaXRpb25hbGx5UGVyZm9ybWVkQnk9Il9nRjdVc2tBdkVkcUZxSXU4LWNrb2xnIiBtYW5kYXRvcnlJbnB1dD0iX2dGN1VzMEF2RWRxRnFJdTgtY2tvbGcgX2dHRWVvRUF2RWRxRnFJdTgtY2tvbGciIG9wdGlvbmFsSW5wdXQ9Il9nR0Vlb1VBdkVkcUZxSXU4LWNrb2xnIiBvdXRwdXQ9Il9nR0Vlb2tBdkVkcUZxSXU4LWNrb2xnIiBwZXJmb3JtZWRQcmltYXJpbHlCeT0iX2dGN1VzVUF2RWRxRnFJdTgtY2tvbGciPgotICAgICAgICA8VGFzayBocmVmPSJ1bWE6Ly9feVVlTElBLVBFZHFMMk8xUEpWOWNaQSNfN004bnNBLVBFZHFMMk8xUEpWOWNaQSIvPgotICAgICAgICA8c2VsZWN0ZWRTdGVwcyBocmVmPSJ1bWE6Ly8tUzFpZ0xTaTZBSV92bHV6V09DdTZUdyNfdHZGNE1CQlBFZHFCczdLaGRWTFJMQSIvPgotICAgICAgICA8c2VsZWN0ZWRTdGVwcyBocmVmPSJ1bWE6Ly8tUzFpZ0xTaTZBSV92bHV6V09DdTZUdyNfdHprSWdCQlBFZHFCczdLaGRWTFJMQSIvPgotICAgICAgICA8c2VsZWN0ZWRTdGVwcyBocmVmPSJ1bWE6Ly8tUzFpZ0xTaTZBSV92bHV6V09DdTZUdyNfdUNCYlFCQlBFZHFCczdLaGRWTFJMQSIvPgotICAgICAgPC9wcm9jZXNzRWxlbWVudHM+Ci0gICAgICA8cHJvY2Vzc0VsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlJvbGVEZXNjcmlwdG9yIiB4bWk6aWQ9Il9nRjdVc1VBdkVkcUZxSXU4LWNrb2xnIiBuYW1lPSJyb2xlX0ExIiBndWlkPSJfZ0Y3VXNVQXZFZHFGcUl1OC1ja29sZyIgYnJpZWZEZXNjcmlwdGlvbj0iUm9sZSBBMSBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iUm9sZSBBMSIgc3VwZXJBY3Rpdml0aWVzPSJfZWFDYW9FQXZFZHFGcUl1OC1ja29sZyIgcmVzcG9uc2libGVGb3I9Il9nR0Vlb0VBdkVkcUZxSXU4LWNrb2xnIF9nR0Vlb1VBdkVkcUZxSXU4LWNrb2xnIF9nR0Vlb2tBdkVkcUZxSXU4LWNrb2xnIj4KLSAgICAgICAgPFJvbGUgaHJlZj0idW1hOi8vX3lVZUxJQS1QRWRxTDJPMVBKVjljWkEjXzU1emswQS1QRWRxTDJPMVBKVjljWkEiLz4KLSAgICAgIDwvcHJvY2Vzc0VsZW1lbnRzPgotICAgICAgPHByb2Nlc3NFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpSb2xlRGVzY3JpcHRvciIgeG1pOmlkPSJfZ0Y3VXNrQXZFZHFGcUl1OC1ja29sZyIgbmFtZT0icm9sZV9BMiIgZ3VpZD0iX2dGN1Vza0F2RWRxRnFJdTgtY2tvbGciIGJyaWVmRGVzY3JpcHRpb249IlJvbGUgQTIgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IlJvbGUgQTIgIiBzdXBlckFjdGl2aXRpZXM9Il9lYUNhb0VBdkVkcUZxSXU4LWNrb2xnIj4KLSAgICAgICAgPFJvbGUgaHJlZj0idW1hOi8vX3lVZUxJQS1QRWRxTDJPMVBKVjljWkEjXzZrM1VBQS1QRWRxTDJPMVBKVjljWkEiLz4KLSAgICAgIDwvcHJvY2Vzc0VsZW1lbnRzPgotICAgICAgPHByb2Nlc3NFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpXb3JrUHJvZHVjdERlc2NyaXB0b3IiIHhtaTppZD0iX2dGN1VzMEF2RWRxRnFJdTgtY2tvbGciIG5hbWU9InN1Yl9hcnRpZmFjdF9BMS4xIiBndWlkPSJfZ0Y3VXMwQXZFZHFGcUl1OC1ja29sZyIgYnJpZWZEZXNjcmlwdGlvbj0iU3ViX0FydGlmYWN0IEExLjEgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IlN1Yl9BcnRpZmFjdCBBMS4xIHByZXNlbnQiIHN1cGVyQWN0aXZpdGllcz0iX2VhQ2FvRUF2RWRxRnFJdTgtY2tvbGciPgotICAgICAgICA8V29ya1Byb2R1Y3QgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6QXJ0aWZhY3QiIGhyZWY9InVtYTovL195VWVMSUEtUEVkcUwyTzFQSlY5Y1pBI19GNTF5d0EtUkVkcUwyTzFQSlY5Y1pBIi8+Ci0gICAgICA8L3Byb2Nlc3NFbGVtZW50cz4KLSAgICAgIDxwcm9jZXNzRWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6V29ya1Byb2R1Y3REZXNjcmlwdG9yIiB4bWk6aWQ9Il9nR0Vlb0VBdkVkcUZxSXU4LWNrb2xnIiBuYW1lPSJhcnRpZmFjdF9BMSIgZ3VpZD0iX2dHRWVvRUF2RWRxRnFJdTgtY2tvbGciIGJyaWVmRGVzY3JpcHRpb249IkFydGlmYWN0IEExIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJBcnRpZmFjdCBBMSBwcmVzZW50IiBzdXBlckFjdGl2aXRpZXM9Il9lYUNhb0VBdkVkcUZxSXU4LWNrb2xnIj4KLSAgICAgICAgPFdvcmtQcm9kdWN0IHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkFydGlmYWN0IiBocmVmPSJ1bWE6Ly9feVVlTElBLVBFZHFMMk8xUEpWOWNaQSNfOUt0NzhBLVBFZHFMMk8xUEpWOWNaQSIvPgotICAgICAgPC9wcm9jZXNzRWxlbWVudHM+Ci0gICAgICA8cHJvY2Vzc0VsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOldvcmtQcm9kdWN0RGVzY3JpcHRvciIgeG1pOmlkPSJfZ0dFZW9VQXZFZHFGcUl1OC1ja29sZyIgbmFtZT0iZGVsaXZlcmFibGVfQTEiIGd1aWQ9Il9nR0Vlb1VBdkVkcUZxSXU4LWNrb2xnIiBicmllZkRlc2NyaXB0aW9uPSJEZWxpdmVyYWJsZSBBMSBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iRGVsaXZlcmFibGUgQTEgcHJlc2VudCIgc3VwZXJBY3Rpdml0aWVzPSJfZWFDYW9FQXZFZHFGcUl1OC1ja29sZyIgZGVsaXZlcmFibGVQYXJ0cz0iX2dHRWVvMEF2RWRxRnFJdTgtY2tvbGcgX2dHRWVwRUF2RWRxRnFJdTgtY2tvbGcgX2dHRWVwVUF2RWRxRnFJdTgtY2tvbGciPgotICAgICAgICA8V29ya1Byb2R1Y3QgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6RGVsaXZlcmFibGUiIGhyZWY9InVtYTovL195VWVMSUEtUEVkcUwyTzFQSlY5Y1pBI19JSVNuVUEtUkVkcUwyTzFQSlY5Y1pBIi8+Ci0gICAgICA8L3Byb2Nlc3NFbGVtZW50cz4KLSAgICAgIDxwcm9jZXNzRWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6V29ya1Byb2R1Y3REZXNjcmlwdG9yIiB4bWk6aWQ9Il9nR0Vlb2tBdkVkcUZxSXU4LWNrb2xnIiBuYW1lPSJvdXRjb21lX0ExIiBndWlkPSJfZ0dFZW9rQXZFZHFGcUl1OC1ja29sZyIgYnJpZWZEZXNjcmlwdGlvbj0iT3V0Y29tZSBBMSBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iT3V0Y29tZSBBMSBwcmVzZW50IiBzdXBlckFjdGl2aXRpZXM9Il9lYUNhb0VBdkVkcUZxSXU4LWNrb2xnIj4KLSAgICAgICAgPFdvcmtQcm9kdWN0IHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOk91dGNvbWUiIGhyZWY9InVtYTovL195VWVMSUEtUEVkcUwyTzFQSlY5Y1pBI19LQV8xWUEtUkVkcUwyTzFQSlY5Y1pBIi8+Ci0gICAgICA8L3Byb2Nlc3NFbGVtZW50cz4KLSAgICAgIDxwcm9jZXNzRWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6V29ya1Byb2R1Y3REZXNjcmlwdG9yIiB4bWk6aWQ9Il9nR0VlbzBBdkVkcUZxSXU4LWNrb2xnIiBuYW1lPSJhcnRpZmFjdF9BMSIgZ3VpZD0iX2dHRWVvMEF2RWRxRnFJdTgtY2tvbGciIGJyaWVmRGVzY3JpcHRpb249IkFydGlmYWN0IEExIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJBcnRpZmFjdCBBMSBwcmVzZW50Ij4KLSAgICAgICAgPFdvcmtQcm9kdWN0IHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkFydGlmYWN0IiBocmVmPSJ1bWE6Ly9feVVlTElBLVBFZHFMMk8xUEpWOWNaQSNfOUt0NzhBLVBFZHFMMk8xUEpWOWNaQSIvPgotICAgICAgPC9wcm9jZXNzRWxlbWVudHM+Ci0gICAgICA8cHJvY2Vzc0VsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOldvcmtQcm9kdWN0RGVzY3JpcHRvciIgeG1pOmlkPSJfZ0dFZXBFQXZFZHFGcUl1OC1ja29sZyIgbmFtZT0ic3ViX2FydGlmYWN0X0ExLjEiIGd1aWQ9Il9nR0VlcEVBdkVkcUZxSXU4LWNrb2xnIiBicmllZkRlc2NyaXB0aW9uPSJTdWJfQXJ0aWZhY3QgQTEuMSBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iU3ViX0FydGlmYWN0IEExLjEgcHJlc2VudCI+Ci0gICAgICAgIDxXb3JrUHJvZHVjdCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpBcnRpZmFjdCIgaHJlZj0idW1hOi8vX3lVZUxJQS1QRWRxTDJPMVBKVjljWkEjX0Y1MXl3QS1SRWRxTDJPMVBKVjljWkEiLz4KLSAgICAgIDwvcHJvY2Vzc0VsZW1lbnRzPgotICAgICAgPHByb2Nlc3NFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpXb3JrUHJvZHVjdERlc2NyaXB0b3IiIHhtaTppZD0iX2dHRWVwVUF2RWRxRnFJdTgtY2tvbGciIG5hbWU9Im91dGNvbWVfQTEiIGd1aWQ9Il9nR0VlcFVBdkVkcUZxSXU4LWNrb2xnIiBicmllZkRlc2NyaXB0aW9uPSJPdXRjb21lIEExIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJPdXRjb21lIEExIHByZXNlbnQiPgotICAgICAgICA8V29ya1Byb2R1Y3QgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6T3V0Y29tZSIgaHJlZj0idW1hOi8vX3lVZUxJQS1QRWRxTDJPMVBKVjljWkEjX0tBXzFZQS1SRWRxTDJPMVBKVjljWkEiLz4KLSAgICAgIDwvcHJvY2Vzc0VsZW1lbnRzPgotICAgICAgPHByb2Nlc3NFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpUYXNrRGVzY3JpcHRvciIgeG1pOmlkPSJfakJGZVFFQXZFZHFGcUl1OC1ja29sZyIgbmFtZT0idGFza19CMSIgZ3VpZD0iX2pCRmVRRUF2RWRxRnFJdTgtY2tvbGciIGJyaWVmRGVzY3JpcHRpb249IlRhc2sgQjEgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IlRhc2sgQjEgcHJlc25ldCIgc3VwZXJBY3Rpdml0aWVzPSJfZWFDYW9FQXZFZHFGcUl1OC1ja29sZyIgYWRkaXRpb25hbGx5UGVyZm9ybWVkQnk9Il9qdlNCQVVBdkVkcUZxSXU4LWNrb2xnIiBtYW5kYXRvcnlJbnB1dD0iX2p2U0JBa0F2RWRxRnFJdTgtY2tvbGciIG9wdGlvbmFsSW5wdXQ9Il9qdlNCQTBBdkVkcUZxSXU4LWNrb2xnIiBvdXRwdXQ9Il9qdlNCQkVBdkVkcUZxSXU4LWNrb2xnIiBwZXJmb3JtZWRQcmltYXJpbHlCeT0iX2p2U0JBRUF2RWRxRnFJdTgtY2tvbGciPgotICAgICAgICA8VGFzayBocmVmPSJ1bWE6Ly9fZWN5NXdCTTNFZHFxbmRpLWdEdXhwdyNfWFU2TFVCOFBFZHFzaE1OU0kwN1hPZyIvPgotICAgICAgICA8c2VsZWN0ZWRTdGVwcyBocmVmPSJ1bWE6Ly8tbFlqcjZWaXRMMVZubkZOTzc4WHVZdyNfVDRBcUFCODRFZHFOdmVseWJEWFpGUSIvPgotICAgICAgICA8c2VsZWN0ZWRTdGVwcyBocmVmPSJ1bWE6Ly8tbFlqcjZWaXRMMVZubkZOTzc4WHVZdyNfVDU4anNCODRFZHFOdmVseWJEWFpGUSIvPgotICAgICAgICA8c2VsZWN0ZWRTdGVwcyBocmVmPSJ1bWE6Ly8tbFlqcjZWaXRMMVZubkZOTzc4WHVZdyNfVDhWSlVCODRFZHFOdmVseWJEWFpGUSIvPgotICAgICAgPC9wcm9jZXNzRWxlbWVudHM+Ci0gICAgICA8cHJvY2Vzc0VsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlJvbGVEZXNjcmlwdG9yIiB4bWk6aWQ9Il9qdlNCQUVBdkVkcUZxSXU4LWNrb2xnIiBuYW1lPSJyb2xlX0IxIiBndWlkPSJfanZTQkFFQXZFZHFGcUl1OC1ja29sZyIgYnJpZWZEZXNjcmlwdGlvbj0iUm9sZSBCMSBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iUm9sZSBCMSBwcmVzZW50IiBzdXBlckFjdGl2aXRpZXM9Il9lYUNhb0VBdkVkcUZxSXU4LWNrb2xnIiByZXNwb25zaWJsZUZvcj0iX2p2U0JBa0F2RWRxRnFJdTgtY2tvbGcgX2p2U0JBMEF2RWRxRnFJdTgtY2tvbGciPgotICAgICAgICA8Um9sZSBocmVmPSJ1bWE6Ly9fZWN5NXdCTTNFZHFxbmRpLWdEdXhwdyNfQTlEWWdCOFBFZHFzaE1OU0kwN1hPZyIvPgotICAgICAgPC9wcm9jZXNzRWxlbWVudHM+Ci0gICAgICA8cHJvY2Vzc0VsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlJvbGVEZXNjcmlwdG9yIiB4bWk6aWQ9Il9qdlNCQVVBdkVkcUZxSXU4LWNrb2xnIiBuYW1lPSJyb2xlX0IyIiBndWlkPSJfanZTQkFVQXZFZHFGcUl1OC1ja29sZyIgYnJpZWZEZXNjcmlwdGlvbj0iUm9sZSBCMiBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iUm9sZSBCMiBwcmVzZW50IiBzdXBlckFjdGl2aXRpZXM9Il9lYUNhb0VBdkVkcUZxSXU4LWNrb2xnIj4KLSAgICAgICAgPFJvbGUgaHJlZj0idW1hOi8vX2VjeTV3Qk0zRWRxcW5kaS1nRHV4cHcjX0tDTV9JQjhQRWRxc2hNTlNJMDdYT2ciLz4KLSAgICAgIDwvcHJvY2Vzc0VsZW1lbnRzPgotICAgICAgPHByb2Nlc3NFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpXb3JrUHJvZHVjdERlc2NyaXB0b3IiIHhtaTppZD0iX2p2U0JBa0F2RWRxRnFJdTgtY2tvbGciIG5hbWU9ImFydGlmYWN0X0IxIiBndWlkPSJfanZTQkFrQXZFZHFGcUl1OC1ja29sZyIgYnJpZWZEZXNjcmlwdGlvbj0iQXJ0aWZhY3QgQjEgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IkFydGlmYWN0IEIxIHByZXNlbnQiIHN1cGVyQWN0aXZpdGllcz0iX2VhQ2FvRUF2RWRxRnFJdTgtY2tvbGciPgotICAgICAgICA8V29ya1Byb2R1Y3QgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6QXJ0aWZhY3QiIGhyZWY9InVtYTovL19lY3k1d0JNM0VkcXFuZGktZ0R1eHB3I19tcUozQUI4UEVkcXNoTU5TSTA3WE9nIi8+Ci0gICAgICA8L3Byb2Nlc3NFbGVtZW50cz4KLSAgICAgIDxwcm9jZXNzRWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6V29ya1Byb2R1Y3REZXNjcmlwdG9yIiB4bWk6aWQ9Il9qdlNCQTBBdkVkcUZxSXU4LWNrb2xnIiBuYW1lPSJkZWxpdmVyYWJsZV9CMSIgZ3VpZD0iX2p2U0JBMEF2RWRxRnFJdTgtY2tvbGciIGJyaWVmRGVzY3JpcHRpb249IkRlbGl2ZXJhYmxlIEIxIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJEZWxpdmVyYWJsZSBCMSBwcmVzZW50IiBzdXBlckFjdGl2aXRpZXM9Il9lYUNhb0VBdkVkcUZxSXU4LWNrb2xnIiBkZWxpdmVyYWJsZVBhcnRzPSJfanZiSzhFQXZFZHFGcUl1OC1ja29sZyBfanZiSzhVQXZFZHFGcUl1OC1ja29sZyI+Ci0gICAgICAgIDxXb3JrUHJvZHVjdCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpEZWxpdmVyYWJsZSIgaHJlZj0idW1hOi8vX2VjeTV3Qk0zRWRxcW5kaS1nRHV4cHcjX1pIZjJZQjhuRWRxMU9vLURvd2RwQmciLz4KLSAgICAgIDwvcHJvY2Vzc0VsZW1lbnRzPgotICAgICAgPHByb2Nlc3NFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpXb3JrUHJvZHVjdERlc2NyaXB0b3IiIHhtaTppZD0iX2p2U0JCRUF2RWRxRnFJdTgtY2tvbGciIG5hbWU9Im91dGNvbWVfQjEiIGd1aWQ9Il9qdlNCQkVBdkVkcUZxSXU4LWNrb2xnIiBicmllZkRlc2NyaXB0aW9uPSJPdXRjb21lIEIxIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJPdXRjb21lIEIxIHByZXNlbnQiIHN1cGVyQWN0aXZpdGllcz0iX2VhQ2FvRUF2RWRxRnFJdTgtY2tvbGciPgotICAgICAgICA8V29ya1Byb2R1Y3QgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6T3V0Y29tZSIgaHJlZj0idW1hOi8vX2VjeTV3Qk0zRWRxcW5kaS1nRHV4cHcjX2NYWHJzQjhuRWRxMU9vLURvd2RwQmciLz4KLSAgICAgIDwvcHJvY2Vzc0VsZW1lbnRzPgotICAgICAgPHByb2Nlc3NFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpXb3JrUHJvZHVjdERlc2NyaXB0b3IiIHhtaTppZD0iX2p2Yks4RUF2RWRxRnFJdTgtY2tvbGciIG5hbWU9ImFydGlmYWN0X0IxIiBndWlkPSJfanZiSzhFQXZFZHFGcUl1OC1ja29sZyIgYnJpZWZEZXNjcmlwdGlvbj0iQXJ0aWZhY3QgQjEgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IkFydGlmYWN0IEIxIHByZXNlbnQiPgotICAgICAgICA8V29ya1Byb2R1Y3QgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6QXJ0aWZhY3QiIGhyZWY9InVtYTovL19lY3k1d0JNM0VkcXFuZGktZ0R1eHB3I19tcUozQUI4UEVkcXNoTU5TSTA3WE9nIi8+Ci0gICAgICA8L3Byb2Nlc3NFbGVtZW50cz4KLSAgICAgIDxwcm9jZXNzRWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6V29ya1Byb2R1Y3REZXNjcmlwdG9yIiB4bWk6aWQ9Il9qdmJLOFVBdkVkcUZxSXU4LWNrb2xnIiBuYW1lPSJvdXRjb21lX0IxIiBndWlkPSJfanZiSzhVQXZFZHFGcUl1OC1ja29sZyIgYnJpZWZEZXNjcmlwdGlvbj0iT3V0Y29tZSBCMSBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iT3V0Y29tZSBCMSBwcmVzZW50Ij4KLSAgICAgICAgPFdvcmtQcm9kdWN0IHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOk91dGNvbWUiIGhyZWY9InVtYTovL19lY3k1d0JNM0VkcXFuZGktZ0R1eHB3I19jWFhyc0I4bkVkcTFPby1Eb3dkcEJnIi8+Ci0gICAgICA8L3Byb2Nlc3NFbGVtZW50cz4KLSAgICAgIDxwcm9jZXNzRWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VGFza0Rlc2NyaXB0b3IiIHhtaTppZD0iX2tZam5nRUF2RWRxRnFJdTgtY2tvbGciIG5hbWU9InRhc2tfQjIiIGd1aWQ9Il9rWWpuZ0VBdkVkcUZxSXU4LWNrb2xnIiBicmllZkRlc2NyaXB0aW9uPSJUYXNrIEIyIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJUYXNrIEIyIHByZXNlbnQiIHN1cGVyQWN0aXZpdGllcz0iX2VhQ2FvRUF2RWRxRnFJdTgtY2tvbGciIGFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5PSJfanZTQkFFQXZFZHFGcUl1OC1ja29sZyIgbWFuZGF0b3J5SW5wdXQ9Il9rWV9zWUVBdkVkcUZxSXU4LWNrb2xnIiBvcHRpb25hbElucHV0PSJfa1lfc1lVQXZFZHFGcUl1OC1ja29sZyIgb3V0cHV0PSJfa1lfc1lrQXZFZHFGcUl1OC1ja29sZyIgcGVyZm9ybWVkUHJpbWFyaWx5Qnk9Il9qdlNCQVVBdkVkcUZxSXU4LWNrb2xnIj4KLSAgICAgICAgPFRhc2sgaHJlZj0idW1hOi8vX2VjeTV3Qk0zRWRxcW5kaS1nRHV4cHcjX1pMT01zQjhQRWRxc2hNTlNJMDdYT2ciLz4KLSAgICAgICAgPHNlbGVjdGVkU3RlcHMgaHJlZj0idW1hOi8vLUozejBJR2ZqZWhpdDB1RmJUSmNhN2cjX29xWXN3Qjg0RWRxTnZlbHliRFhaRlEiLz4KLSAgICAgICAgPHNlbGVjdGVkU3RlcHMgaHJlZj0idW1hOi8vLUozejBJR2ZqZWhpdDB1RmJUSmNhN2cjX3F1UXBBQjg0RWRxTnZlbHliRFhaRlEiLz4KLSAgICAgICAgPHNlbGVjdGVkU3RlcHMgaHJlZj0idW1hOi8vLUozejBJR2ZqZWhpdDB1RmJUSmNhN2cjX3F5dTVVQjg0RWRxTnZlbHliRFhaRlEiLz4KLSAgICAgIDwvcHJvY2Vzc0VsZW1lbnRzPgotICAgICAgPHByb2Nlc3NFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpXb3JrUHJvZHVjdERlc2NyaXB0b3IiIHhtaTppZD0iX2tZX3NZRUF2RWRxRnFJdTgtY2tvbGciIG5hbWU9ImFydGlmYWN0X0IyIiBndWlkPSJfa1lfc1lFQXZFZHFGcUl1OC1ja29sZyIgYnJpZWZEZXNjcmlwdGlvbj0iQXJ0aWZhY3QgQjIgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IkFydGlmYWN0IEIyIHByZXNlbnQiIHN1cGVyQWN0aXZpdGllcz0iX2VhQ2FvRUF2RWRxRnFJdTgtY2tvbGciPgotICAgICAgICA8V29ya1Byb2R1Y3QgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6QXJ0aWZhY3QiIGhyZWY9InVtYTovL19lY3k1d0JNM0VkcXFuZGktZ0R1eHB3I19feUc3Y0I4bUVkcTFPby1Eb3dkcEJnIi8+Ci0gICAgICA8L3Byb2Nlc3NFbGVtZW50cz4KLSAgICAgIDxwcm9jZXNzRWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6V29ya1Byb2R1Y3REZXNjcmlwdG9yIiB4bWk6aWQ9Il9rWV9zWVVBdkVkcUZxSXU4LWNrb2xnIiBuYW1lPSJkZWxpdmVyYWJsZV9CMiIgZ3VpZD0iX2tZX3NZVUF2RWRxRnFJdTgtY2tvbGciIGJyaWVmRGVzY3JpcHRpb249IkRlbGl2ZXJhYmxlIEIyIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJEZWxpdmVyYWJsZSBCMiBwcmVzZW50IiBzdXBlckFjdGl2aXRpZXM9Il9lYUNhb0VBdkVkcUZxSXU4LWNrb2xnIiBkZWxpdmVyYWJsZVBhcnRzPSJfa1pKZFlFQXZFZHFGcUl1OC1ja29sZyBfa1pKZFlVQXZFZHFGcUl1OC1ja29sZyI+Ci0gICAgICAgIDxXb3JrUHJvZHVjdCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpEZWxpdmVyYWJsZSIgaHJlZj0idW1hOi8vX2VjeTV3Qk0zRWRxcW5kaS1nRHV4cHcjX25xRldFQjhuRWRxMU9vLURvd2RwQmciLz4KLSAgICAgIDwvcHJvY2Vzc0VsZW1lbnRzPgotICAgICAgPHByb2Nlc3NFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpXb3JrUHJvZHVjdERlc2NyaXB0b3IiIHhtaTppZD0iX2tZX3NZa0F2RWRxRnFJdTgtY2tvbGciIG5hbWU9Im91dGNvbWVfQjIiIGd1aWQ9Il9rWV9zWWtBdkVkcUZxSXU4LWNrb2xnIiBicmllZkRlc2NyaXB0aW9uPSJPdXRjb21lIEIyIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJPdXRjb21lIEIyIHByZXNlbnQiIHN1cGVyQWN0aXZpdGllcz0iX2VhQ2FvRUF2RWRxRnFJdTgtY2tvbGciPgotICAgICAgICA8V29ya1Byb2R1Y3QgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6T3V0Y29tZSIgaHJlZj0idW1hOi8vX2VjeTV3Qk0zRWRxcW5kaS1nRHV4cHcjX2FzRk9rQjhuRWRxMU9vLURvd2RwQmciLz4KLSAgICAgIDwvcHJvY2Vzc0VsZW1lbnRzPgotICAgICAgPHByb2Nlc3NFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpXb3JrUHJvZHVjdERlc2NyaXB0b3IiIHhtaTppZD0iX2taSmRZRUF2RWRxRnFJdTgtY2tvbGciIG5hbWU9ImFydGlmYWN0X0IyIiBndWlkPSJfa1pKZFlFQXZFZHFGcUl1OC1ja29sZyIgYnJpZWZEZXNjcmlwdGlvbj0iQXJ0aWZhY3QgQjIgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IkFydGlmYWN0IEIyIHByZXNlbnQiPgotICAgICAgICA8V29ya1Byb2R1Y3QgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6QXJ0aWZhY3QiIGhyZWY9InVtYTovL19lY3k1d0JNM0VkcXFuZGktZ0R1eHB3I19feUc3Y0I4bUVkcTFPby1Eb3dkcEJnIi8+Ci0gICAgICA8L3Byb2Nlc3NFbGVtZW50cz4KLSAgICAgIDxwcm9jZXNzRWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6V29ya1Byb2R1Y3REZXNjcmlwdG9yIiB4bWk6aWQ9Il9rWkpkWVVBdkVkcUZxSXU4LWNrb2xnIiBuYW1lPSJvdXRjb21lX0IyIiBndWlkPSJfa1pKZFlVQXZFZHFGcUl1OC1ja29sZyIgYnJpZWZEZXNjcmlwdGlvbj0iT3V0Y29tZSBCMiBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iT3V0Y29tZSBCMiBwcmVzZW50Ij4KLSAgICAgICAgPFdvcmtQcm9kdWN0IHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOk91dGNvbWUiIGhyZWY9InVtYTovL19lY3k1d0JNM0VkcXFuZGktZ0R1eHB3I19hc0ZPa0I4bkVkcTFPby1Eb3dkcEJnIi8+Ci0gICAgICA8L3Byb2Nlc3NFbGVtZW50cz4KLSAgICAgIDxwcm9jZXNzRWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VGFza0Rlc2NyaXB0b3IiIHhtaTppZD0iX2EwZ2t3RUEzRWRxRnFJdTgtY2tvbGciIG5hbWU9InRhc2tfQTIiIGd1aWQ9Il9hMGdrd0VBM0VkcUZxSXU4LWNrb2xnIiBicmllZkRlc2NyaXB0aW9uPSJUYXNrIEEyIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJUYXNrIEEyICIgc3VwZXJBY3Rpdml0aWVzPSJfZWFDYW9FQXZFZHFGcUl1OC1ja29sZyIgYWRkaXRpb25hbGx5UGVyZm9ybWVkQnk9Il9nRjdVc1VBdkVkcUZxSXU4LWNrb2xnIiBtYW5kYXRvcnlJbnB1dD0iX2ExdGVvRUEzRWRxRnFJdTgtY2tvbGciIG9wdGlvbmFsSW5wdXQ9Il9hMmRGZ0VBM0VkcUZxSXU4LWNrb2xnIiBvdXRwdXQ9Il9hM01zWUVBM0VkcUZxSXU4LWNrb2xnIiBwZXJmb3JtZWRQcmltYXJpbHlCeT0iX2dGN1Vza0F2RWRxRnFJdTgtY2tvbGciPgotICAgICAgICA8VGFzayBocmVmPSJ1bWE6Ly9feVVlTElBLVBFZHFMMk8xUEpWOWNaQSNfNzVOUXdBLVBFZHFMMk8xUEpWOWNaQSIvPgotICAgICAgICA8c2VsZWN0ZWRTdGVwcyBocmVmPSJ1bWE6Ly8tMTNxOEpKQWEwaXg2ckRNWkFxd3kxdyNfdGkyQllCQk9FZHFCczdLaGRWTFJMQSIvPgotICAgICAgICA8c2VsZWN0ZWRTdGVwcyBocmVmPSJ1bWE6Ly8tMTNxOEpKQWEwaXg2ckRNWkFxd3kxdyNfdGs3c0VCQk9FZHFCczdLaGRWTFJMQSIvPgotICAgICAgICA8c2VsZWN0ZWRTdGVwcyBocmVmPSJ1bWE6Ly8tMTNxOEpKQWEwaXg2ckRNWkFxd3kxdyNfdG5kYm9CQk9FZHFCczdLaGRWTFJMQSIvPgotICAgICAgPC9wcm9jZXNzRWxlbWVudHM+Ci0gICAgICA8cHJvY2Vzc0VsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOldvcmtQcm9kdWN0RGVzY3JpcHRvciIgeG1pOmlkPSJfYTF0ZW9FQTNFZHFGcUl1OC1ja29sZyIgbmFtZT0iYXJ0aWZhY3RfQTIiIGd1aWQ9Il9hMXRlb0VBM0VkcUZxSXU4LWNrb2xnIiBicmllZkRlc2NyaXB0aW9uPSJBcnRpZmFjdCBBMiBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iQXJ0aWZhY3QgQTIgcHJlc2VudCIgc3VwZXJBY3Rpdml0aWVzPSJfZWFDYW9FQXZFZHFGcUl1OC1ja29sZyI+Ci0gICAgICAgIDxXb3JrUHJvZHVjdCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpBcnRpZmFjdCIgaHJlZj0idW1hOi8vX3lVZUxJQS1QRWRxTDJPMVBKVjljWkEjX0U3WjBrQS1SRWRxTDJPMVBKVjljWkEiLz4KLSAgICAgIDwvcHJvY2Vzc0VsZW1lbnRzPgotICAgICAgPHByb2Nlc3NFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpXb3JrUHJvZHVjdERlc2NyaXB0b3IiIHhtaTppZD0iX2EyZEZnRUEzRWRxRnFJdTgtY2tvbGciIG5hbWU9ImRlbGl2ZXJhYmxlX0EyIiBndWlkPSJfYTJkRmdFQTNFZHFGcUl1OC1ja29sZyIgYnJpZWZEZXNjcmlwdGlvbj0iRGVsaXZlcmFibGUgQTIgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IkRlbGl2ZXJhYmxlIEEyIHByZXNlbnQiIHN1cGVyQWN0aXZpdGllcz0iX2VhQ2FvRUF2RWRxRnFJdTgtY2tvbGciIGRlbGl2ZXJhYmxlUGFydHM9Il9hNEdFUUVBM0VkcUZxSXU4LWNrb2xnIF9hNDFySUVBM0VkcUZxSXU4LWNrb2xnIj4KLSAgICAgICAgPFdvcmtQcm9kdWN0IHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkRlbGl2ZXJhYmxlIiBocmVmPSJ1bWE6Ly9feVVlTElBLVBFZHFMMk8xUEpWOWNaQSNfSkJxZlVBLVJFZHFMMk8xUEpWOWNaQSIvPgotICAgICAgPC9wcm9jZXNzRWxlbWVudHM+Ci0gICAgICA8cHJvY2Vzc0VsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOldvcmtQcm9kdWN0RGVzY3JpcHRvciIgeG1pOmlkPSJfYTNNc1lFQTNFZHFGcUl1OC1ja29sZyIgbmFtZT0ib3V0Y29tZV9BMiIgZ3VpZD0iX2EzTXNZRUEzRWRxRnFJdTgtY2tvbGciIGJyaWVmRGVzY3JpcHRpb249Ik91dGNvbWUgQTEgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9Ik91dGNvbWUgQTIgcHJlc2VudCIgc3VwZXJBY3Rpdml0aWVzPSJfZWFDYW9FQXZFZHFGcUl1OC1ja29sZyI+Ci0gICAgICAgIDxXb3JrUHJvZHVjdCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpPdXRjb21lIiBocmVmPSJ1bWE6Ly9feVVlTElBLVBFZHFMMk8xUEpWOWNaQSNfS3ZMeEVBLVJFZHFMMk8xUEpWOWNaQSIvPgotICAgICAgPC9wcm9jZXNzRWxlbWVudHM+Ci0gICAgICA8cHJvY2Vzc0VsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOldvcmtQcm9kdWN0RGVzY3JpcHRvciIgeG1pOmlkPSJfYTRHRVFFQTNFZHFGcUl1OC1ja29sZyIgbmFtZT0iYXJ0aWZhY3RfQTIiIGd1aWQ9Il9hNEdFUUVBM0VkcUZxSXU4LWNrb2xnIiBicmllZkRlc2NyaXB0aW9uPSJBcnRpZmFjdCBBMiBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iQXJ0aWZhY3QgQTIgcHJlc2VudCI+Ci0gICAgICAgIDxXb3JrUHJvZHVjdCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpBcnRpZmFjdCIgaHJlZj0idW1hOi8vX3lVZUxJQS1QRWRxTDJPMVBKVjljWkEjX0U3WjBrQS1SRWRxTDJPMVBKVjljWkEiLz4KLSAgICAgIDwvcHJvY2Vzc0VsZW1lbnRzPgotICAgICAgPHByb2Nlc3NFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpXb3JrUHJvZHVjdERlc2NyaXB0b3IiIHhtaTppZD0iX2E0MXJJRUEzRWRxRnFJdTgtY2tvbGciIG5hbWU9Im91dGNvbWVfQTIiIGd1aWQ9Il9hNDFySUVBM0VkcUZxSXU4LWNrb2xnIiBicmllZkRlc2NyaXB0aW9uPSJPdXRjb21lIEExIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJPdXRjb21lIEEyIHByZXNlbnQiPgotICAgICAgICA8V29ya1Byb2R1Y3QgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6T3V0Y29tZSIgaHJlZj0idW1hOi8vX3lVZUxJQS1QRWRxTDJPMVBKVjljWkEjX0t2THhFQS1SRWRxTDJPMVBKVjljWkEiLz4KLSAgICAgIDwvcHJvY2Vzc0VsZW1lbnRzPgotICAgICAgPGRpYWdyYW1zIHhtaTppZD0iX3dfVEZrRUF2RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il93X1RGa0VBdkVkcUZxSXU4LWNrb2xnIj4KLSAgICAgICAgPGNvbnRhaW5lZCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpHcmFwaE5vZGUiIHhtaTppZD0iX3dfVEZrVUF2RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il93X1RGa1VBdkVkcUZxSXU4LWNrb2xnIj4KLSAgICAgICAgICA8cG9zaXRpb24geG1pOmlkPSJfd19URmtrQXZFZHFGcUl1OC1ja29sZyIgeD0iLTEuMCIgeT0iLTEuMCIvPgotICAgICAgICAgIDxzZW1hbnRpY01vZGVsIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlVNQVNlbWFudGljTW9kZWxCcmlkZ2UiIHhtaTppZD0iX3dfVEZrMEF2RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il93X1RGazBBdkVkcUZxSXU4LWNrb2xnIiBlbGVtZW50PSJfZ0Y3VXNFQXZFZHFGcUl1OC1ja29sZyIvPgotICAgICAgICAgIDxzaXplIHhtaTppZD0iX3dfVEZsRUF2RWRxRnFJdTgtY2tvbGciIHdpZHRoPSItMS4wIiBoZWlnaHQ9Ii0xLjAiLz4KLSAgICAgICAgPC9jb250YWluZWQ+Ci0gICAgICAgIDxjb250YWluZWQgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6R3JhcGhOb2RlIiB4bWk6aWQ9Il93X1RGbFVBdkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfd19URmxVQXZFZHFGcUl1OC1ja29sZyI+Ci0gICAgICAgICAgPHBvc2l0aW9uIHhtaTppZD0iX3dfVEZsa0F2RWRxRnFJdTgtY2tvbGciIHg9IjIwLjAiIHk9IjE2OS4wIi8+Ci0gICAgICAgICAgPHNlbWFudGljTW9kZWwgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VU1BU2VtYW50aWNNb2RlbEJyaWRnZSIgeG1pOmlkPSJfd19URmwwQXZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX3dfVEZsMEF2RWRxRnFJdTgtY2tvbGciIGVsZW1lbnQ9Il9nRjdVc1VBdkVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgICAgICAgPHNpemUgeG1pOmlkPSJfd19URm1FQXZFZHFGcUl1OC1ja29sZyIgd2lkdGg9IjE1OC4wIiBoZWlnaHQ9IjUzLjAiLz4KLSAgICAgICAgPC9jb250YWluZWQ+Ci0gICAgICAgIDxjb250YWluZWQgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6R3JhcGhOb2RlIiB4bWk6aWQ9Il93X1RGbVVBdkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfd19URm1VQXZFZHFGcUl1OC1ja29sZyI+Ci0gICAgICAgICAgPHBvc2l0aW9uIHhtaTppZD0iX3dfVEZta0F2RWRxRnFJdTgtY2tvbGciIHg9IjIwLjAiIHk9IjQ4MS4wIi8+Ci0gICAgICAgICAgPHNlbWFudGljTW9kZWwgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VU1BU2VtYW50aWNNb2RlbEJyaWRnZSIgeG1pOmlkPSJfd19URm0wQXZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX3dfVEZtMEF2RWRxRnFJdTgtY2tvbGciIGVsZW1lbnQ9Il9nRjdVc2tBdkVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgICAgICAgPHNpemUgeG1pOmlkPSJfd19URm5FQXZFZHFGcUl1OC1ja29sZyIgd2lkdGg9IjEyNC4wIiBoZWlnaHQ9IjUzLjAiLz4KLSAgICAgICAgPC9jb250YWluZWQ+Ci0gICAgICAgIDxjb250YWluZWQgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6R3JhcGhOb2RlIiB4bWk6aWQ9Il93X1RGblVBdkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfd19URm5VQXZFZHFGcUl1OC1ja29sZyI+Ci0gICAgICAgICAgPHBvc2l0aW9uIHhtaTppZD0iX3dfVEZua0F2RWRxRnFJdTgtY2tvbGciIHg9Ii0xLjAiIHk9Ii0xLjAiLz4KLSAgICAgICAgICA8c2VtYW50aWNNb2RlbCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpVTUFTZW1hbnRpY01vZGVsQnJpZGdlIiB4bWk6aWQ9Il93X1RGbjBBdkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfd19URm4wQXZFZHFGcUl1OC1ja29sZyIgZWxlbWVudD0iX2dGN1VzMEF2RWRxRnFJdTgtY2tvbGciLz4KLSAgICAgICAgICA8c2l6ZSB4bWk6aWQ9Il93X1RGb0VBdkVkcUZxSXU4LWNrb2xnIiB3aWR0aD0iLTEuMCIgaGVpZ2h0PSItMS4wIi8+Ci0gICAgICAgIDwvY29udGFpbmVkPgotICAgICAgICA8Y29udGFpbmVkIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkdyYXBoTm9kZSIgeG1pOmlkPSJfd19URm9VQXZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX3dfVEZvVUF2RWRxRnFJdTgtY2tvbGciPgotICAgICAgICAgIDxwb3NpdGlvbiB4bWk6aWQ9Il93X1RGb2tBdkVkcUZxSXU4LWNrb2xnIiB4PSItMS4wIiB5PSItMS4wIi8+Ci0gICAgICAgICAgPHNlbWFudGljTW9kZWwgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VU1BU2VtYW50aWNNb2RlbEJyaWRnZSIgeG1pOmlkPSJfd19URm8wQXZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX3dfVEZvMEF2RWRxRnFJdTgtY2tvbGciIGVsZW1lbnQ9Il9nR0Vlb0VBdkVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgICAgICAgPHNpemUgeG1pOmlkPSJfd19URnBFQXZFZHFGcUl1OC1ja29sZyIgd2lkdGg9Ii0xLjAiIGhlaWdodD0iLTEuMCIvPgotICAgICAgICA8L2NvbnRhaW5lZD4KLSAgICAgICAgPGNvbnRhaW5lZCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpHcmFwaE5vZGUiIHhtaTppZD0iX3dfVEZwVUF2RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il93X1RGcFVBdkVkcUZxSXU4LWNrb2xnIj4KLSAgICAgICAgICA8cG9zaXRpb24geG1pOmlkPSJfd19URnBrQXZFZHFGcUl1OC1ja29sZyIgeD0iLTEuMCIgeT0iLTEuMCIvPgotICAgICAgICAgIDxzZW1hbnRpY01vZGVsIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlVNQVNlbWFudGljTW9kZWxCcmlkZ2UiIHhtaTppZD0iX3dfVEZwMEF2RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il93X1RGcDBBdkVkcUZxSXU4LWNrb2xnIiBlbGVtZW50PSJfZ0dFZW9VQXZFZHFGcUl1OC1ja29sZyIvPgotICAgICAgICAgIDxzaXplIHhtaTppZD0iX3dfVEZxRUF2RWRxRnFJdTgtY2tvbGciIHdpZHRoPSItMS4wIiBoZWlnaHQ9Ii0xLjAiLz4KLSAgICAgICAgPC9jb250YWluZWQ+Ci0gICAgICAgIDxjb250YWluZWQgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6R3JhcGhOb2RlIiB4bWk6aWQ9Il93X1RGcVVBdkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfd19URnFVQXZFZHFGcUl1OC1ja29sZyI+Ci0gICAgICAgICAgPHBvc2l0aW9uIHhtaTppZD0iX3dfVEZxa0F2RWRxRnFJdTgtY2tvbGciIHg9Ii0xLjAiIHk9Ii0xLjAiLz4KLSAgICAgICAgICA8c2VtYW50aWNNb2RlbCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpVTUFTZW1hbnRpY01vZGVsQnJpZGdlIiB4bWk6aWQ9Il93X1RGcTBBdkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfd19URnEwQXZFZHFGcUl1OC1ja29sZyIgZWxlbWVudD0iX2dHRWVva0F2RWRxRnFJdTgtY2tvbGciLz4KLSAgICAgICAgICA8c2l6ZSB4bWk6aWQ9Il93X1RGckVBdkVkcUZxSXU4LWNrb2xnIiB3aWR0aD0iLTEuMCIgaGVpZ2h0PSItMS4wIi8+Ci0gICAgICAgIDwvY29udGFpbmVkPgotICAgICAgICA8Y29udGFpbmVkIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkdyYXBoTm9kZSIgeG1pOmlkPSJfd19URnJVQXZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX3dfVEZyVUF2RWRxRnFJdTgtY2tvbGciPgotICAgICAgICAgIDxwb3NpdGlvbiB4bWk6aWQ9Il93X1RGcmtBdkVkcUZxSXU4LWNrb2xnIiB4PSItMS4wIiB5PSItMS4wIi8+Ci0gICAgICAgICAgPHNlbWFudGljTW9kZWwgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VU1BU2VtYW50aWNNb2RlbEJyaWRnZSIgeG1pOmlkPSJfd19URnIwQXZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX3dfVEZyMEF2RWRxRnFJdTgtY2tvbGciIGVsZW1lbnQ9Il9qQkZlUUVBdkVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgICAgICAgPHNpemUgeG1pOmlkPSJfd19URnNFQXZFZHFGcUl1OC1ja29sZyIgd2lkdGg9Ii0xLjAiIGhlaWdodD0iLTEuMCIvPgotICAgICAgICA8L2NvbnRhaW5lZD4KLSAgICAgICAgPGNvbnRhaW5lZCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpHcmFwaE5vZGUiIHhtaTppZD0iX3dfVEZzVUF2RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il93X1RGc1VBdkVkcUZxSXU4LWNrb2xnIj4KLSAgICAgICAgICA8cG9zaXRpb24geG1pOmlkPSJfd19URnNrQXZFZHFGcUl1OC1ja29sZyIgeD0iMjAuMCIgeT0iNzkzLjAiLz4KLSAgICAgICAgICA8c2VtYW50aWNNb2RlbCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpVTUFTZW1hbnRpY01vZGVsQnJpZGdlIiB4bWk6aWQ9Il93X1RGczBBdkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfd19URnMwQXZFZHFGcUl1OC1ja29sZyIgZWxlbWVudD0iX2p2U0JBRUF2RWRxRnFJdTgtY2tvbGciLz4KLSAgICAgICAgICA8c2l6ZSB4bWk6aWQ9Il93X1RGdEVBdkVkcUZxSXU4LWNrb2xnIiB3aWR0aD0iMTk2LjAiIGhlaWdodD0iNTMuMCIvPgotICAgICAgICA8L2NvbnRhaW5lZD4KLSAgICAgICAgPGNvbnRhaW5lZCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpHcmFwaE5vZGUiIHhtaTppZD0iX3dfVEZ0VUF2RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il93X1RGdFVBdkVkcUZxSXU4LWNrb2xnIj4KLSAgICAgICAgICA8cG9zaXRpb24geG1pOmlkPSJfd19URnRrQXZFZHFGcUl1OC1ja29sZyIgeD0iMjAuMCIgeT0iMTEwNS4wIi8+Ci0gICAgICAgICAgPHNlbWFudGljTW9kZWwgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VU1BU2VtYW50aWNNb2RlbEJyaWRnZSIgeG1pOmlkPSJfd19URnQwQXZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX3dfVEZ0MEF2RWRxRnFJdTgtY2tvbGciIGVsZW1lbnQ9Il9qdlNCQVVBdkVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgICAgICAgPHNpemUgeG1pOmlkPSJfd19URnVFQXZFZHFGcUl1OC1ja29sZyIgd2lkdGg9IjE5Ni4wIiBoZWlnaHQ9IjUzLjAiLz4KLSAgICAgICAgPC9jb250YWluZWQ+Ci0gICAgICAgIDxjb250YWluZWQgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6R3JhcGhOb2RlIiB4bWk6aWQ9Il93X1RGdVVBdkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfd19URnVVQXZFZHFGcUl1OC1ja29sZyI+Ci0gICAgICAgICAgPHBvc2l0aW9uIHhtaTppZD0iX3dfVEZ1a0F2RWRxRnFJdTgtY2tvbGciIHg9Ii0xLjAiIHk9Ii0xLjAiLz4KLSAgICAgICAgICA8c2VtYW50aWNNb2RlbCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpVTUFTZW1hbnRpY01vZGVsQnJpZGdlIiB4bWk6aWQ9Il93X1RGdTBBdkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfd19URnUwQXZFZHFGcUl1OC1ja29sZyIgZWxlbWVudD0iX2p2U0JBa0F2RWRxRnFJdTgtY2tvbGciLz4KLSAgICAgICAgICA8c2l6ZSB4bWk6aWQ9Il93X1RGdkVBdkVkcUZxSXU4LWNrb2xnIiB3aWR0aD0iLTEuMCIgaGVpZ2h0PSItMS4wIi8+Ci0gICAgICAgIDwvY29udGFpbmVkPgotICAgICAgICA8Y29udGFpbmVkIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkdyYXBoTm9kZSIgeG1pOmlkPSJfd19URnZVQXZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX3dfVEZ2VUF2RWRxRnFJdTgtY2tvbGciPgotICAgICAgICAgIDxwb3NpdGlvbiB4bWk6aWQ9Il93X1RGdmtBdkVkcUZxSXU4LWNrb2xnIiB4PSItMS4wIiB5PSItMS4wIi8+Ci0gICAgICAgICAgPHNlbWFudGljTW9kZWwgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VU1BU2VtYW50aWNNb2RlbEJyaWRnZSIgeG1pOmlkPSJfd19URnYwQXZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX3dfVEZ2MEF2RWRxRnFJdTgtY2tvbGciIGVsZW1lbnQ9Il9qdlNCQTBBdkVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgICAgICAgPHNpemUgeG1pOmlkPSJfd19URndFQXZFZHFGcUl1OC1ja29sZyIgd2lkdGg9Ii0xLjAiIGhlaWdodD0iLTEuMCIvPgotICAgICAgICA8L2NvbnRhaW5lZD4KLSAgICAgICAgPGNvbnRhaW5lZCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpHcmFwaE5vZGUiIHhtaTppZD0iX3dfVEZ3VUF2RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il93X1RGd1VBdkVkcUZxSXU4LWNrb2xnIj4KLSAgICAgICAgICA8cG9zaXRpb24geG1pOmlkPSJfd19URndrQXZFZHFGcUl1OC1ja29sZyIgeD0iLTEuMCIgeT0iLTEuMCIvPgotICAgICAgICAgIDxzZW1hbnRpY01vZGVsIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlVNQVNlbWFudGljTW9kZWxCcmlkZ2UiIHhtaTppZD0iX3dfVEZ3MEF2RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il93X1RGdzBBdkVkcUZxSXU4LWNrb2xnIiBlbGVtZW50PSJfanZTQkJFQXZFZHFGcUl1OC1ja29sZyIvPgotICAgICAgICAgIDxzaXplIHhtaTppZD0iX3dfVEZ4RUF2RWRxRnFJdTgtY2tvbGciIHdpZHRoPSItMS4wIiBoZWlnaHQ9Ii0xLjAiLz4KLSAgICAgICAgPC9jb250YWluZWQ+Ci0gICAgICAgIDxjb250YWluZWQgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6R3JhcGhOb2RlIiB4bWk6aWQ9Il93X1RGeFVBdkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfd19URnhVQXZFZHFGcUl1OC1ja29sZyI+Ci0gICAgICAgICAgPHBvc2l0aW9uIHhtaTppZD0iX3dfVEZ4a0F2RWRxRnFJdTgtY2tvbGciIHg9Ii0xLjAiIHk9Ii0xLjAiLz4KLSAgICAgICAgICA8c2VtYW50aWNNb2RlbCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpVTUFTZW1hbnRpY01vZGVsQnJpZGdlIiB4bWk6aWQ9Il93X1RGeDBBdkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfd19URngwQXZFZHFGcUl1OC1ja29sZyIgZWxlbWVudD0iX2tZam5nRUF2RWRxRnFJdTgtY2tvbGciLz4KLSAgICAgICAgICA8c2l6ZSB4bWk6aWQ9Il93X1RGeUVBdkVkcUZxSXU4LWNrb2xnIiB3aWR0aD0iLTEuMCIgaGVpZ2h0PSItMS4wIi8+Ci0gICAgICAgIDwvY29udGFpbmVkPgotICAgICAgICA8Y29udGFpbmVkIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkdyYXBoTm9kZSIgeG1pOmlkPSJfd19URnlVQXZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX3dfVEZ5VUF2RWRxRnFJdTgtY2tvbGciPgotICAgICAgICAgIDxwb3NpdGlvbiB4bWk6aWQ9Il93X1RGeWtBdkVkcUZxSXU4LWNrb2xnIiB4PSItMS4wIiB5PSItMS4wIi8+Ci0gICAgICAgICAgPHNlbWFudGljTW9kZWwgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VU1BU2VtYW50aWNNb2RlbEJyaWRnZSIgeG1pOmlkPSJfd19URnkwQXZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX3dfVEZ5MEF2RWRxRnFJdTgtY2tvbGciIGVsZW1lbnQ9Il9rWV9zWUVBdkVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgICAgICAgPHNpemUgeG1pOmlkPSJfd19URnpFQXZFZHFGcUl1OC1ja29sZyIgd2lkdGg9Ii0xLjAiIGhlaWdodD0iLTEuMCIvPgotICAgICAgICA8L2NvbnRhaW5lZD4KLSAgICAgICAgPGNvbnRhaW5lZCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpHcmFwaE5vZGUiIHhtaTppZD0iX3dfVEZ6VUF2RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il93X1RGelVBdkVkcUZxSXU4LWNrb2xnIj4KLSAgICAgICAgICA8cG9zaXRpb24geG1pOmlkPSJfd19URnprQXZFZHFGcUl1OC1ja29sZyIgeD0iLTEuMCIgeT0iLTEuMCIvPgotICAgICAgICAgIDxzZW1hbnRpY01vZGVsIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlVNQVNlbWFudGljTW9kZWxCcmlkZ2UiIHhtaTppZD0iX3dfVEZ6MEF2RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il93X1RGejBBdkVkcUZxSXU4LWNrb2xnIiBlbGVtZW50PSJfa1lfc1lVQXZFZHFGcUl1OC1ja29sZyIvPgotICAgICAgICAgIDxzaXplIHhtaTppZD0iX3dfVEYwRUF2RWRxRnFJdTgtY2tvbGciIHdpZHRoPSItMS4wIiBoZWlnaHQ9Ii0xLjAiLz4KLSAgICAgICAgPC9jb250YWluZWQ+Ci0gICAgICAgIDxjb250YWluZWQgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6R3JhcGhOb2RlIiB4bWk6aWQ9Il93X1RGMFVBdkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfd19URjBVQXZFZHFGcUl1OC1ja29sZyI+Ci0gICAgICAgICAgPHBvc2l0aW9uIHhtaTppZD0iX3dfVEYwa0F2RWRxRnFJdTgtY2tvbGciIHg9Ii0xLjAiIHk9Ii0xLjAiLz4KLSAgICAgICAgICA8c2VtYW50aWNNb2RlbCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpVTUFTZW1hbnRpY01vZGVsQnJpZGdlIiB4bWk6aWQ9Il93X1RGMDBBdkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfd19URjAwQXZFZHFGcUl1OC1ja29sZyIgZWxlbWVudD0iX2tZX3NZa0F2RWRxRnFJdTgtY2tvbGciLz4KLSAgICAgICAgICA8c2l6ZSB4bWk6aWQ9Il93X1RGMUVBdkVkcUZxSXU4LWNrb2xnIiB3aWR0aD0iLTEuMCIgaGVpZ2h0PSItMS4wIi8+Ci0gICAgICAgIDwvY29udGFpbmVkPgotICAgICAgICA8Y29udGFpbmVkIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkdyYXBoTm9kZSIgeG1pOmlkPSJfd19jMmtFQXZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX3dfYzJrRUF2RWRxRnFJdTgtY2tvbGciPgotICAgICAgICAgIDxwcm9wZXJ0eSB4bWk6aWQ9Il93X2Mya1VBdkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfd19jMmtVQXZFZHFGcUl1OC1ja29sZyIga2V5PSJ3cENvbXBvc2l0ZVR5cGUiIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgPHBvc2l0aW9uIHhtaTppZD0iX3dfYzJra0F2RWRxRnFJdTgtY2tvbGciIHg9Ijg2LjAiIHk9IjEuMCIvPgotICAgICAgICAgIDxjb250YWluZWQgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6R3JhcGhFZGdlIiB4bWk6aWQ9Il93X2MybTBBdkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfd19jMm0wQXZFZHFGcUl1OC1ja29sZyIgYW5jaG9yPSJfd19jMm1rQXZFZHFGcUl1OC1ja29sZyIvPgotICAgICAgICAgIDxjb250YWluZWQgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6R3JhcGhFZGdlIiB4bWk6aWQ9Il96VUtyUlVBdkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfelVLclJVQXZFZHFGcUl1OC1ja29sZyIgYW5jaG9yPSJfelVLclJFQXZFZHFGcUl1OC1ja29sZyIvPgotICAgICAgICAgIDxjb250YWluZWQgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6R3JhcGhFZGdlIiB4bWk6aWQ9Il82VjRhY1VBdkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfNlY0YWNVQXZFZHFGcUl1OC1ja29sZyIgYW5jaG9yPSJfNlY0YWNFQXZFZHFGcUl1OC1ja29sZyIvPgotICAgICAgICAgIDxjb250YWluZWQgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6R3JhcGhFZGdlIiB4bWk6aWQ9Il9udWE2b1VBd0VkcUZxSXU4LWNrb2xnIiBndWlkPSJfbnVhNm9VQXdFZHFGcUl1OC1ja29sZyIgYW5jaG9yPSJfbnVhNm9FQXdFZHFGcUl1OC1ja29sZyIvPgotICAgICAgICAgIDxjb250YWluZWQgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6R3JhcGhFZGdlIiB4bWk6aWQ9Il9fb0xaZ0VBNkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfX29MWmdFQTZFZHFGcUl1OC1ja29sZyIgYW5jaG9yPSJfX252VW9FQTZFZHFGcUl1OC1ja29sZyIvPgotICAgICAgICAgIDxhbmNob3JhZ2UgeG1pOmlkPSJfd19jMm1rQXZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX3dfYzJta0F2RWRxRnFJdTgtY2tvbGciIGdyYXBoRWRnZT0iX3dfYzJtMEF2RWRxRnFJdTgtY2tvbGciLz4KLSAgICAgICAgICA8YW5jaG9yYWdlIHhtaTppZD0iX3pVS3JSRUF2RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il96VUtyUkVBdkVkcUZxSXU4LWNrb2xnIiBncmFwaEVkZ2U9Il96VUtyUlVBdkVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgICAgICAgPGFuY2hvcmFnZSB4bWk6aWQ9Il82VjRhY0VBdkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfNlY0YWNFQXZFZHFGcUl1OC1ja29sZyIgZ3JhcGhFZGdlPSJfNlY0YWNVQXZFZHFGcUl1OC1ja29sZyIvPgotICAgICAgICAgIDxhbmNob3JhZ2UgeG1pOmlkPSJfbnVhNm9FQXdFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX251YTZvRUF3RWRxRnFJdTgtY2tvbGciIGdyYXBoRWRnZT0iX251YTZvVUF3RWRxRnFJdTgtY2tvbGciLz4KLSAgICAgICAgICA8YW5jaG9yYWdlIHhtaTppZD0iX19udlVvRUE2RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il9fbnZVb0VBNkVkcUZxSXU4LWNrb2xnIiBncmFwaEVkZ2U9Il9fb0xaZ0VBNkVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgICAgICAgPHNlbWFudGljTW9kZWwgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VU1BU2VtYW50aWNNb2RlbEJyaWRnZSIgeG1pOmlkPSJfd19jMmswQXZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX3dfYzJrMEF2RWRxRnFJdTgtY2tvbGciIGVsZW1lbnQ9Il9nRjdVc0VBdkVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgICAgICAgPHNpemUgeG1pOmlkPSJfd19jMmxFQXZFZHFGcUl1OC1ja29sZyIgd2lkdGg9Ijg0LjAiIGhlaWdodD0iMTQ4LjAiLz4KLSAgICAgICAgPC9jb250YWluZWQ+Ci0gICAgICAgIDxjb250YWluZWQgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6R3JhcGhOb2RlIiB4bWk6aWQ9Il93X2MybFVBdkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfd19jMmxVQXZFZHFGcUl1OC1ja29sZyI+Ci0gICAgICAgICAgPHByb3BlcnR5IHhtaTppZD0iX3dfYzJsa0F2RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il93X2MybGtBdkVkcUZxSXU4LWNrb2xnIiBrZXk9IndwQ29tcG9zaXRlVHlwZSIgdmFsdWU9IjIiLz4KLSAgICAgICAgICA8cG9zaXRpb24geG1pOmlkPSJfd19jMmwwQXZFZHFGcUl1OC1ja29sZyIgeD0iOTEuMCIgeT0iMjQyLjAiLz4KLSAgICAgICAgICA8c2VtYW50aWNNb2RlbCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpVTUFTZW1hbnRpY01vZGVsQnJpZGdlIiB4bWk6aWQ9Il93X2MybUVBdkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfd19jMm1FQXZFZHFGcUl1OC1ja29sZyIgZWxlbWVudD0iX2dGN1VzRUF2RWRxRnFJdTgtY2tvbGciLz4KLSAgICAgICAgICA8c2l6ZSB4bWk6aWQ9Il93X2MybVVBdkVkcUZxSXU4LWNrb2xnIiB3aWR0aD0iNzQuMCIgaGVpZ2h0PSIxMTEuMCIvPgotICAgICAgICA8L2NvbnRhaW5lZD4KLSAgICAgICAgPGNvbnRhaW5lZCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpHcmFwaE5vZGUiIHhtaTppZD0iX3pVS3JNRUF2RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il96VUtyTUVBdkVkcUZxSXU4LWNrb2xnIj4KLSAgICAgICAgICA8cHJvcGVydHkgeG1pOmlkPSJfelVLck1VQXZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX3pVS3JNVUF2RWRxRnFJdTgtY2tvbGciIGtleT0id3BDb21wb3NpdGVUeXBlIiB2YWx1ZT0iMSIvPgotICAgICAgICAgIDxwb3NpdGlvbiB4bWk6aWQ9Il96VUtyTWtBdkVkcUZxSXU4LWNrb2xnIiB4PSIxMzAuMCIgeT0iNzA2LjAiLz4KLSAgICAgICAgICA8Y29udGFpbmVkIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkdyYXBoRWRnZSIgeG1pOmlkPSJfelVLclIwQXZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX3pVS3JSMEF2RWRxRnFJdTgtY2tvbGciIGFuY2hvcj0iX3pVS3JSa0F2RWRxRnFJdTgtY2tvbGciLz4KLSAgICAgICAgICA8Y29udGFpbmVkIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkdyYXBoRWRnZSIgeG1pOmlkPSJfX3BFeFlFQTZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX19wRXhZRUE2RWRxRnFJdTgtY2tvbGciIGFuY2hvcj0iX19vb0ZjRUE2RWRxRnFJdTgtY2tvbGciLz4KLSAgICAgICAgICA8YW5jaG9yYWdlIHhtaTppZD0iX3pVS3JSa0F2RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il96VUtyUmtBdkVkcUZxSXU4LWNrb2xnIiBncmFwaEVkZ2U9Il96VUtyUjBBdkVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgICAgICAgPGFuY2hvcmFnZSB4bWk6aWQ9Il9fb29GY0VBNkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfX29vRmNFQTZFZHFGcUl1OC1ja29sZyIgZ3JhcGhFZGdlPSJfX3BFeFlFQTZFZHFGcUl1OC1ja29sZyIvPgotICAgICAgICAgIDxzZW1hbnRpY01vZGVsIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlVNQVNlbWFudGljTW9kZWxCcmlkZ2UiIHhtaTppZD0iX3pVS3JNMEF2RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il96VUtyTTBBdkVkcUZxSXU4LWNrb2xnIiBlbGVtZW50PSJfakJGZVFFQXZFZHFGcUl1OC1ja29sZyIvPgotICAgICAgICAgIDxzaXplIHhtaTppZD0iX3pVS3JORUF2RWRxRnFJdTgtY2tvbGciIHdpZHRoPSI3My4wIiBoZWlnaHQ9IjY3LjAiLz4KLSAgICAgICAgPC9jb250YWluZWQ+Ci0gICAgICAgIDxjb250YWluZWQgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6R3JhcGhOb2RlIiB4bWk6aWQ9Il96VUtyTlVBdkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfelVLck5VQXZFZHFGcUl1OC1ja29sZyI+Ci0gICAgICAgICAgPHByb3BlcnR5IHhtaTppZD0iX3pVS3JOa0F2RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il96VUtyTmtBdkVkcUZxSXU4LWNrb2xnIiBrZXk9IndwQ29tcG9zaXRlVHlwZSIgdmFsdWU9IjIiLz4KLSAgICAgICAgICA8cG9zaXRpb24geG1pOmlkPSJfelVLck4wQXZFZHFGcUl1OC1ja29sZyIgeD0iMTMwLjAiIHk9Ijg2Ni4wIi8+Ci0gICAgICAgICAgPHNlbWFudGljTW9kZWwgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VU1BU2VtYW50aWNNb2RlbEJyaWRnZSIgeG1pOmlkPSJfelVLck9FQXZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX3pVS3JPRUF2RWRxRnFJdTgtY2tvbGciIGVsZW1lbnQ9Il9qQkZlUUVBdkVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgICAgICAgPHNpemUgeG1pOmlkPSJfelVLck9VQXZFZHFGcUl1OC1ja29sZyIgd2lkdGg9IjczLjAiIGhlaWdodD0iMTExLjAiLz4KLSAgICAgICAgPC9jb250YWluZWQ+Ci0gICAgICAgIDxjb250YWluZWQgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6R3JhcGhOb2RlIiB4bWk6aWQ9Il96VUtyT2tBdkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfelVLck9rQXZFZHFGcUl1OC1ja29sZyI+Ci0gICAgICAgICAgPHByb3BlcnR5IHhtaTppZD0iX3pVS3JPMEF2RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il96VUtyTzBBdkVkcUZxSXU4LWNrb2xnIiBrZXk9IndwQ29tcG9zaXRlVHlwZSIgdmFsdWU9IjEiLz4KLSAgICAgICAgICA8cG9zaXRpb24geG1pOmlkPSJfelVLclBFQXZFZHFGcUl1OC1ja29sZyIgeD0iMTMwLjAiIHk9IjEwMTguMCIvPgotICAgICAgICAgIDxjb250YWluZWQgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6R3JhcGhFZGdlIiB4bWk6aWQ9Il96VUtyU1VBdkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfelVLclNVQXZFZHFGcUl1OC1ja29sZyIgYW5jaG9yPSJfelVLclNFQXZFZHFGcUl1OC1ja29sZyIvPgotICAgICAgICAgIDxjb250YWluZWQgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6R3JhcGhFZGdlIiB4bWk6aWQ9Il9fcDBZUUVBNkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfX3AwWVFFQTZFZHFGcUl1OC1ja29sZyIgYW5jaG9yPSJfX3BoZFVFQTZFZHFGcUl1OC1ja29sZyIvPgotICAgICAgICAgIDxhbmNob3JhZ2UgeG1pOmlkPSJfelVLclNFQXZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX3pVS3JTRUF2RWRxRnFJdTgtY2tvbGciIGdyYXBoRWRnZT0iX3pVS3JTVUF2RWRxRnFJdTgtY2tvbGciLz4KLSAgICAgICAgICA8YW5jaG9yYWdlIHhtaTppZD0iX19waGRVRUE2RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il9fcGhkVUVBNkVkcUZxSXU4LWNrb2xnIiBncmFwaEVkZ2U9Il9fcDBZUUVBNkVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgICAgICAgPHNlbWFudGljTW9kZWwgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VU1BU2VtYW50aWNNb2RlbEJyaWRnZSIgeG1pOmlkPSJfelVLclBVQXZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX3pVS3JQVUF2RWRxRnFJdTgtY2tvbGciIGVsZW1lbnQ9Il9rWWpuZ0VBdkVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgICAgICAgPHNpemUgeG1pOmlkPSJfelVLclBrQXZFZHFGcUl1OC1ja29sZyIgd2lkdGg9IjczLjAiIGhlaWdodD0iNjcuMCIvPgotICAgICAgICA8L2NvbnRhaW5lZD4KLSAgICAgICAgPGNvbnRhaW5lZCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpHcmFwaE5vZGUiIHhtaTppZD0iX3pVS3JQMEF2RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il96VUtyUDBBdkVkcUZxSXU4LWNrb2xnIj4KLSAgICAgICAgICA8cHJvcGVydHkgeG1pOmlkPSJfelVLclFFQXZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX3pVS3JRRUF2RWRxRnFJdTgtY2tvbGciIGtleT0id3BDb21wb3NpdGVUeXBlIiB2YWx1ZT0iMiIvPgotICAgICAgICAgIDxwb3NpdGlvbiB4bWk6aWQ9Il96VUtyUVVBdkVkcUZxSXU4LWNrb2xnIiB4PSIxMzAuMCIgeT0iMTE3OC4wIi8+Ci0gICAgICAgICAgPHNlbWFudGljTW9kZWwgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VU1BU2VtYW50aWNNb2RlbEJyaWRnZSIgeG1pOmlkPSJfelVLclFrQXZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX3pVS3JRa0F2RWRxRnFJdTgtY2tvbGciIGVsZW1lbnQ9Il9rWWpuZ0VBdkVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgICAgICAgPHNpemUgeG1pOmlkPSJfelVLclEwQXZFZHFGcUl1OC1ja29sZyIgd2lkdGg9IjczLjAiIGhlaWdodD0iMTExLjAiLz4KLSAgICAgICAgPC9jb250YWluZWQ+Ci0gICAgICAgIDxjb250YWluZWQgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6R3JhcGhOb2RlIiB4bWk6aWQ9Il9fbTE4d0VBNkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfX20xOHdFQTZFZHFGcUl1OC1ja29sZyI+Ci0gICAgICAgICAgPHByb3BlcnR5IHhtaTppZD0iX19tMTh3VUE2RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il9fbTE4d1VBNkVkcUZxSXU4LWNrb2xnIiBrZXk9IndwQ29tcG9zaXRlVHlwZSIgdmFsdWU9IjEiLz4KLSAgICAgICAgICA8cG9zaXRpb24geG1pOmlkPSJfX20xOHdrQTZFZHFGcUl1OC1ja29sZyIgeD0iNzYuMCIgeT0iMzk0LjAiLz4KLSAgICAgICAgICA8Y29udGFpbmVkIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkdyYXBoRWRnZSIgeG1pOmlkPSJfX3FSRU1VQTZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX19xUkVNVUE2RWRxRnFJdTgtY2tvbGciIGFuY2hvcj0iX19xUkVNRUE2RWRxRnFJdTgtY2tvbGciLz4KLSAgICAgICAgICA8YW5jaG9yYWdlIHhtaTppZD0iX19xUkVNRUE2RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il9fcVJFTUVBNkVkcUZxSXU4LWNrb2xnIiBncmFwaEVkZ2U9Il9fcVJFTVVBNkVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgICAgICAgPHNlbWFudGljTW9kZWwgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VU1BU2VtYW50aWNNb2RlbEJyaWRnZSIgeG1pOmlkPSJfX20xOHcwQTZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX19tMTh3MEE2RWRxRnFJdTgtY2tvbGciIGVsZW1lbnQ9Il9hMGdrd0VBM0VkcUZxSXU4LWNrb2xnIi8+Ci0gICAgICAgICAgPHNpemUgeG1pOmlkPSJfX20xOHhFQTZFZHFGcUl1OC1ja29sZyIgd2lkdGg9Ijc0LjAiIGhlaWdodD0iNjcuMCIvPgotICAgICAgICA8L2NvbnRhaW5lZD4KLSAgICAgICAgPGNvbnRhaW5lZCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpHcmFwaE5vZGUiIHhtaTppZD0iX19uU29zRUE2RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il9fblNvc0VBNkVkcUZxSXU4LWNrb2xnIj4KLSAgICAgICAgICA8cHJvcGVydHkgeG1pOmlkPSJfX25Tb3NVQTZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX19uU29zVUE2RWRxRnFJdTgtY2tvbGciIGtleT0id3BDb21wb3NpdGVUeXBlIiB2YWx1ZT0iMiIvPgotICAgICAgICAgIDxwb3NpdGlvbiB4bWk6aWQ9Il9fblNvc2tBNkVkcUZxSXU4LWNrb2xnIiB4PSI3Ni4wIiB5PSI1NTQuMCIvPgotICAgICAgICAgIDxzZW1hbnRpY01vZGVsIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlVNQVNlbWFudGljTW9kZWxCcmlkZ2UiIHhtaTppZD0iX19uU29zMEE2RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il9fblNvczBBNkVkcUZxSXU4LWNrb2xnIiBlbGVtZW50PSJfYTBna3dFQTNFZHFGcUl1OC1ja29sZyIvPgotICAgICAgICAgIDxzaXplIHhtaTppZD0iX19uU290RUE2RWRxRnFJdTgtY2tvbGciIHdpZHRoPSI3NC4wIiBoZWlnaHQ9IjExMS4wIi8+Ci0gICAgICAgIDwvY29udGFpbmVkPgotICAgICAgICA8c2VtYW50aWNNb2RlbCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpVTUFTZW1hbnRpY01vZGVsQnJpZGdlIiB4bWk6aWQ9Il93X1RGMVVBdkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfd19URjFVQXZFZHFGcUl1OC1ja29sZyIgcHJlc2VudGF0aW9uPSJBY3Rpdml0eSBEZXRhaWwiIGVsZW1lbnQ9Il9lYUNhb0VBdkVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgICA8L2RpYWdyYW1zPgotICAgIDwvY2hpbGRQYWNrYWdlcz4KLSAgICA8ZGlhZ3JhbXMgeG1pOmlkPSJfbm0wZDBFQXdFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX25tMGQwRUF3RWRxRnFJdTgtY2tvbGciPgotICAgICAgPHNlbWFudGljTW9kZWwgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VU1BU2VtYW50aWNNb2RlbEJyaWRnZSIgeG1pOmlkPSJfbm0wZDBVQXdFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX25tMGQwVUF3RWRxRnFJdTgtY2tvbGciIHByZXNlbnRhdGlvbj0iQWN0aXZpdHkgRGV0YWlsIiBlbGVtZW50PSJfZEJodmtVQXZFZHFGcUl1OC1ja29sZyIvPgotICAgIDwvZGlhZ3JhbXM+Ci0gICAgPHByb2Nlc3MgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q2FwYWJpbGl0eVBhdHRlcm4iIHhtaTppZD0iX2RCaHZrVUF2RWRxRnFJdTgtY2tvbGciIG5hbWU9IkNQIEExIiBndWlkPSJfZEJodmtVQXZFZHFGcUl1OC1ja29sZyIgcHJlc2VudGF0aW9uTmFtZT0iQ1AgQTEiIGJyZWFrZG93bkVsZW1lbnRzPSJfZWFDYW9FQXZFZHFGcUl1OC1ja29sZyI+Ci0gICAgICA8cHJlc2VudGF0aW9uIHhtaTppZD0iLTk4V1RXdXJCTVNpRWhoWkZJc3lra0EiIGhyZWY9InVtYTovLy05OFdUV3VyQk1TaUVoaFpGSXN5a2tBIy05OFdUV3VyQk1TaUVoaFpGSXN5a2tBIi8+Ci0gICAgICA8ZGVmYXVsdENvbnRleHQgaHJlZj0idW1hOi8vX3F6d3l3QS1QRWRxTDJPMVBKVjljWkEjX3JybUNJQkFkRWRxN0ZyY195TWhRLUEiLz4KLSAgICAgIDx2YWxpZENvbnRleHQgaHJlZj0idW1hOi8vX3F6d3l3QS1QRWRxTDJPMVBKVjljWkEjX3JybUNJQkFkRWRxN0ZyY195TWhRLUEiLz4KLSAgICA8L3Byb2Nlc3M+Ci0gIDwvb3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzQ29tcG9uZW50PgotPC94bWk6WE1JPgpkaWZmIC0tZ2l0ICJhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9jYXBhYmlsaXR5cGF0dGVybnMvQ1AgZXh0ZW5kaW5nIFwwNDdDUDEgd2l0aCBhbGwgZWxlbWVudHNcMDQ3L2NvbnRlbnQueG1pIiAiYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvY2FwYWJpbGl0eXBhdHRlcm5zL0NQIGV4dGVuZGluZyBcMDQ3Q1AxIHdpdGggYWxsIGVsZW1lbnRzXDA0Ny9jb250ZW50LnhtaSIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyNzMzMzEuLjAwMDAwMDAKLS0tICJhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9jYXBhYmlsaXR5cGF0dGVybnMvQ1AgZXh0ZW5kaW5nIFwwNDdDUDEgd2l0aCBhbGwgZWxlbWVudHNcMDQ3L2NvbnRlbnQueG1pIgorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08b3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzRGVzY3JpcHRpb24geG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiIHhtaTppZD0iLWJxMDBvOHYxMkRYVVZGdENuaUpOY2ciIG5hbWU9IkNhcFBhdCBBMSxfYUhVU1FSQk5FZHFCczdLaGRWTFJMQSIgZ3VpZD0iLWJxMDBvOHYxMkRYVVZGdENuaUpOY2ciPgotICA8bWFpbkRlc2NyaXB0aW9uPkNQIGV4dGVuZGluZyAnQ1AxIHdpdGggYWxsIGVsZW1lbnRzJyBtYWluPC9tYWluRGVzY3JpcHRpb24+Ci0gIDxrZXlDb25zaWRlcmF0aW9ucz5DUCBleHRlbmRpbmcgJ0NQMSB3aXRoIGFsbCBlbGVtZW50cycga2V5IGNvbjwva2V5Q29uc2lkZXJhdGlvbnM+Ci0gIDxwdXJwb3NlPiZsdDtwJmd0OwotICAgIHB1cnBvc2U6IENQIGV4dGVuZGluZyAnQ1AxIHdpdGggYWxsIGVsZW1lbnRzJwotJmx0Oy9wJmd0OzwvcHVycG9zZT4KLSAgPGFsdGVybmF0aXZlcz5DUCBleHRlbmRpbmcgJ0NQMSB3aXRoIGFsbCAmbHQ7c3Ryb25nJmd0O2VsZW1lbnRzJyBhbHRlcm4mbHQ7L3N0cm9uZyZndDs8L2FsdGVybmF0aXZlcz4KLSAgPGhvd3RvU3RhZmY+Q1AgZXh0ZW5kaW5nICdDUDEgd2l0aCBhbGwgZWxlbWVudHMnIHN0YWZmPC9ob3d0b1N0YWZmPgotICA8ZXh0ZXJuYWxJZD5leHRlcm5JRDpDUCBleHRlbmRpbmcgJ0NQMSB3aXRoIGFsbCBlbGVtZW50cyc8L2V4dGVybmFsSWQ+Ci0gIDxzY29wZT5DUCBleHRlbmRpbmcgJ0NQMSB3aXRoIGFsbCBlbGVtZW50cycgc2NvcGU8L3Njb3BlPgotICA8dXNhZ2VOb3Rlcz5DUCBleHRlbmRpbmcgJ0NQMSB3aXRoIGFsbCBlbGVtZW50cyd1c2FnZTwvdXNhZ2VOb3Rlcz4KLTwvb3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzRGVzY3JpcHRpb24+CmRpZmYgLS1naXQgImEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2NhcGFiaWxpdHlwYXR0ZXJucy9DUCBleHRlbmRpbmcgXDA0N0NQMSB3aXRoIGFsbCBlbGVtZW50c1wwNDcvZGlhZ3JhbS54bWkiICJiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9jYXBhYmlsaXR5cGF0dGVybnMvQ1AgZXh0ZW5kaW5nIFwwNDdDUDEgd2l0aCBhbGwgZWxlbWVudHNcMDQ3L2RpYWdyYW0ueG1pIgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTUyMGNhMS4uMDAwMDAwMAotLS0gImEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2NhcGFiaWxpdHlwYXR0ZXJucy9DUCBleHRlbmRpbmcgXDA0N0NQMSB3aXRoIGFsbCBlbGVtZW50c1wwNDcvZGlhZ3JhbS54bWkiCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTx4bWk6WE1JIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6bm90YXRpb249Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZ21mL3J1bnRpbWUvMS4wLjAvbm90YXRpb24iIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi9kaWFncmFtLzEuMC4wL2RpYWdyYW0uZWNvcmUiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiPgotICA8b3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw6QWN0aXZpdHlEZXRhaWxEaWFncmFtIHhtaTppZD0iX0ljT2NvT3g0RWR1Mk9vNnEtbkhXZ2ciPgotICAgIDxsaW5rZWRFbGVtZW50IHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNhcGFiaWxpdHlQYXR0ZXJuIiBocmVmPSJ1bWE6Ly9fYUhVU1FCQk5FZHFCczdLaGRWTFJMQSNfYUhVU1FSQk5FZHFCczdLaGRWTFJMQSIvPgotICA8L29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOkFjdGl2aXR5RGV0YWlsRGlhZ3JhbT4KLSAgPG5vdGF0aW9uOkRpYWdyYW0geG1pOmlkPSJfSWNPY29leDRFZHUyT282cS1uSFdnZyIgdHlwZT0iQUREIiBlbGVtZW50PSJfSWNPY29PeDRFZHUyT282cS1uSFdnZyIgbmFtZT0iQ1AgZXh0ZW5kaW5nICdDUDEgd2l0aCBhbGwgZWxlbWVudHMnIiBtZWFzdXJlbWVudFVuaXQ9IlBpeGVsIj4KLSAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpQYWdlU3R5bGUiIHhtaTppZD0iX0ljT2NvdXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpHdWlkZVN0eWxlIiB4bWk6aWQ9Il9JY09jby14NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RGVzY3JpcHRpb25TdHlsZSIgeG1pOmlkPSJfSWNPY3BPeDRFZHUyT282cS1uSFdnZyIvPgotICA8L25vdGF0aW9uOkRpYWdyYW0+Ci08L3htaTpYTUk+CmRpZmYgLS1naXQgImEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2NhcGFiaWxpdHlwYXR0ZXJucy9DUCBleHRlbmRpbmcgXDA0N0NQMSB3aXRoIGFsbCBlbGVtZW50c1wwNDcvbW9kZWwueG1pIiAiYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvY2FwYWJpbGl0eXBhdHRlcm5zL0NQIGV4dGVuZGluZyBcMDQ3Q1AxIHdpdGggYWxsIGVsZW1lbnRzXDA0Ny9tb2RlbC54bWkiCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMDYyMjUxLi4wMDAwMDAwCi0tLSAiYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvY2FwYWJpbGl0eXBhdHRlcm5zL0NQIGV4dGVuZGluZyBcMDQ3Q1AxIHdpdGggYWxsIGVsZW1lbnRzXDA0Ny9tb2RlbC54bWkiCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTx4bWk6WE1JIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYS5yZXNvdXJjZW1hbmFnZXI9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZXBmL3VtYS9yZXNvdXJjZW1hbmFnZXIuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCI+Ci0gIDxvcmcuZWNsaXBzZS5lcGYudW1hLnJlc291cmNlbWFuYWdlcjpSZXNvdXJjZU1hbmFnZXIgeG1pOmlkPSJfY25XbUVCQk5FZHFCczdLaGRWTFJMQSIgZ3VpZD0iX2NuV21FQkJORWRxQnM3S2hkVkxSTEEiPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iX2NuV21FUkJORWRxQnM3S2hkVkxSTEEiIGlkPSItYnEwMG84djEyRFhVVkZ0Q25pSk5jZyIgdXJpPSJjb250ZW50LnhtaSIvPgotICA8L29yZy5lY2xpcHNlLmVwZi51bWEucmVzb3VyY2VtYW5hZ2VyOlJlc291cmNlTWFuYWdlcj4KLSAgPG9yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc0NvbXBvbmVudCB4bWk6aWQ9Il9hSFVTUUJCTkVkcUJzN0toZFZMUkxBIiBuYW1lPSJDUCBleHRlbmRpbmcgJ0NQMSB3aXRoIGFsbCBlbGVtZW50cyciIGd1aWQ9Il9hSFVTUUJCTkVkcUJzN0toZFZMUkxBIj4KLSAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzUGFja2FnZSIgeG1pOmlkPSJfRVcwOU1EMEtFZHFqQUk3N0RIdkJ3QSIgbmFtZT0iQ1AxIHdpdGggYWxsIGVsZW1lbnRzIiBndWlkPSJfRVcwOU1EMEtFZHFqQUk3N0RIdkJ3QSI+Ci0gICAgICA8cHJvY2Vzc0VsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkFjdGl2aXR5IiB4bWk6aWQ9Il9FWGF6RUQwS0VkcWpBSTc3REh2QndBIiBuYW1lPSJDUDEgd2l0aCBhbGwgZWxlbWVudHMiIGd1aWQ9Il9FWGF6RUQwS0VkcWpBSTc3REh2QndBIiBzdXBlckFjdGl2aXRpZXM9Il9hSFVTUVJCTkVkcUJzN0toZFZMUkxBIiB2YXJpYWJpbGl0eVR5cGU9ImV4dGVuZHMiPgotICAgICAgICA8dmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDYXBhYmlsaXR5UGF0dGVybiIgaHJlZj0idW1hOi8vXzRzQ3RzRHpnRWRxNXlzRk9OcjFCR1EjXzRzQ3RzVHpnRWRxNXlzRk9OcjFCR1EiLz4KLSAgICAgIDwvcHJvY2Vzc0VsZW1lbnRzPgotICAgIDwvY2hpbGRQYWNrYWdlcz4KLSAgICA8ZGlhZ3JhbXMgeG1pOmlkPSJfWnFKTzhFQXRFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX1pxSk84RUF0RWRxRnFJdTgtY2tvbGciPgotICAgICAgPHNlbWFudGljTW9kZWwgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VU1BU2VtYW50aWNNb2RlbEJyaWRnZSIgeG1pOmlkPSJfWnFKTzhVQXRFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX1pxSk84VUF0RWRxRnFJdTgtY2tvbGciIHByZXNlbnRhdGlvbj0iQWN0aXZpdHkgRGV0YWlsIiBlbGVtZW50PSJfYUhVU1FSQk5FZHFCczdLaGRWTFJMQSIvPgotICAgIDwvZGlhZ3JhbXM+Ci0gICAgPHByb2Nlc3MgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q2FwYWJpbGl0eVBhdHRlcm4iIHhtaTppZD0iX2FIVVNRUkJORWRxQnM3S2hkVkxSTEEiIG5hbWU9IkNQIGV4dGVuZGluZyAnQ1AxIHdpdGggYWxsIGVsZW1lbnRzJyIgZ3VpZD0iX2FIVVNRUkJORWRxQnM3S2hkVkxSTEEiIGJyaWVmRGVzY3JpcHRpb249ImJyaWVmQ1AgZXh0ZW5kaW5nICdDUDEgd2l0aCBhbGwgZWxlbWVudHMnIiBwcmVzZW50YXRpb25OYW1lPSJDUCBleHRlbmRpbmcgJ0NQMSB3aXRoIGFsbCBlbGVtZW50cyciIGJyZWFrZG93bkVsZW1lbnRzPSJfRVhhekVEMEtFZHFqQUk3N0RIdkJ3QSI+Ci0gICAgICA8cHJlc2VudGF0aW9uIHhtaTppZD0iLWJxMDBvOHYxMkRYVVZGdENuaUpOY2ciIGhyZWY9InVtYTovLy1icTAwbzh2MTJEWFVWRnRDbmlKTmNnIy1icTAwbzh2MTJEWFVWRnRDbmlKTmNnIi8+Ci0gICAgICA8ZGVmYXVsdENvbnRleHQgaHJlZj0idW1hOi8vX3F6d3l3QS1QRWRxTDJPMVBKVjljWkEjX3JybUNJQkFkRWRxN0ZyY195TWhRLUEiLz4KLSAgICAgIDx2YWxpZENvbnRleHQgaHJlZj0idW1hOi8vX3F6d3l3QS1QRWRxTDJPMVBKVjljWkEjX3JybUNJQkFkRWRxN0ZyY195TWhRLUEiLz4KLSAgICA8L3Byb2Nlc3M+Ci0gIDwvb3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzQ29tcG9uZW50PgotPC94bWk6WE1JPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2NhcGFiaWxpdHlwYXR0ZXJucy9DUDEgd2l0aCBhbGwgZWxlbWVudHMvY29udGVudC54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvY2FwYWJpbGl0eXBhdHRlcm5zL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9jb250ZW50LnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2ZlZmFkMy4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvY2FwYWJpbGl0eXBhdHRlcm5zL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9jb250ZW50LnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDk2NiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHhtaTpYTUkgeG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiPgotICA8b3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzRGVzY3JpcHRpb24geG1pOmlkPSItRS1kNEpjdTI5N3J4VXE4bHRlOHFudyIgbmFtZT0iQ1AxIHdpdGggYWxsIGVsZW1lbnRzLF80c0N0c1R6Z0VkcTV5c0ZPTnIxQkdRIiBndWlkPSItRS1kNEpjdTI5N3J4VXE4bHRlOHFudyI+Ci0gICAgPG1haW5EZXNjcmlwdGlvbj4mbHQ7cCZndDsKLSAgICBUaGUgc3ViY2F0ZWdvcmllcyBvZiBwcm9jZXNzIGFyZSBkZWxpdmVyeSBwcm9jZXNzIGFuZCBjYXBhYmlsaXR5IHBhdHRlcm4uJmFtcDtuYnNwOyBBIGRlbGl2ZXJ5IHByb2Nlc3MgZGVmaW5lcyBhIGNvbXBsZXRlCi0gICAgb3IgZW5kLXRvLWVuZCBwcm9jZXNzLiZhbXA7bmJzcDsgQSBjYXBhYmlsaXR5IHBhdHRlcm4gaXMgYSBwcm9jZXNzIGZyYWdtZW50IHVzZWQgdG8gY29tcG9zZSBhIGRlbGl2ZXJ5IHByb2Nlc3MuCi0mbHQ7L3AmZ3Q7Ci0mbHQ7cCZndDsKLSAgICAmYW1wO25ic3A7Ci0mbHQ7L3AmZ3Q7PC9tYWluRGVzY3JpcHRpb24+Ci0gICAgPGtleUNvbnNpZGVyYXRpb25zPlRoaXMgY2FwYWJpbGl0eSBwYXR0ZXJuIGNhbiBiZSB1c2VkIHRvIHF1aWNrbHkgY29uc3RydWN0IGFuIEluY2VwdGlvbiBwaGFzZSBpdGVyYXRpb24gaW4gYSBkZWxpdmVyeSBwcm9jZXNzLiZhbXA7bmJzcDsgQ29weSBvcgotZXh0ZW5kIHRoZSBwYXR0ZXJuJmFtcDtuYnNwO3JlcGVhdGVkbHkgdG8gY3JlYXRlIGFzIG1hbnkgaXRlcmF0aW9ucyBhcyBuZWNlc3NhcnkgZm9yIHRoZSBwYXJ0aWN1bGFyIGRlbGl2ZXJ5IHByb2Nlc3MuPC9rZXlDb25zaWRlcmF0aW9ucz4KLSAgICA8cHVycG9zZT5UaGlzIGNhcGFiaWxpdHkgcGF0dGVybiBjYW4gYmUgdXNlZCB0byBxdWlja2x5IGNvbnN0cnVjdCBhbiBJbmNlcHRpb24gcGhhc2UgaXRlcmF0aW9uIGluIGEgZGVsaXZlcnkgcHJvY2Vzcy4mYW1wO25ic3A7IENvcHkgb3IKLWV4dGVuZCB0aGUgcGF0dGVybiZhbXA7bmJzcDtyZXBlYXRlZGx5IHRvIGNyZWF0ZSBhcyBtYW55IGl0ZXJhdGlvbnMgYXMgbmVjZXNzYXJ5IGZvciB0aGUgcGFydGljdWxhciBkZWxpdmVyeSBwcm9jZXNzLiAmbHQ7YnIgLyZndDsKLSZsdDticiAvJmd0OzwvcHVycG9zZT4KLSAgICA8YWx0ZXJuYXRpdmVzPiZsdDtwJmd0OwotICAgIFRvIGV4cGxhaW4gdGhlIHdvcmsgaW52b2x2ZWQgaW4gdGhlIEFuYWx5c2lzIGFuZCBEZXNpZ24gZGlzY2lwbGluZSwgdGhlIGFjdGl2aXRpZXMgYW5kIHdvcmsgcHJvZHVjdHMgYXJlIG9yZ2FuaXplZCBpbnRvCi0gICAgYSBjYXBhYmlsaXR5IHBhdHRlcm4gZm9yIHRoZSBkaXNjaXBsaW5lLgotJmx0Oy9wJmd0OwotJmx0O3AmZ3Q7Ci0gICAgSW4gdGhlIEluY2VwdGlvbiBQaGFzZSwgYW5hbHlzaXMgYW5kIGRlc2lnbiBpcyBjb25jZXJuZWQgd2l0aCBlc3RhYmxpc2hpbmcgd2hldGhlciB0aGUgc3lzdGVtIGFzIGVudmlzaW9uZWQgaXMKLSAgICBmZWFzaWJsZSwgYW5kIHdpdGggYXNzZXNzaW5nIHBvdGVudGlhbCB0ZWNobm9sb2dpZXMgZm9yIHRoZSBzb2x1dGlvbiAoaW4gJmx0O2EgaHJlZj0mcXVvdDtyZXNvdXJjZXMvd2ZzX2FyY2hzeW4uaHRtJnF1b3Q7Jmd0OyZsdDtmb250Ci0gICAgY29sb3I9JnF1b3Q7IzAwMDBmZiZxdW90OyZndDtQZXJmb3JtIEFyY2hpdGVjdHVyYWwgU3ludGhlc2lzJmx0Oy9mb250Jmd0OyZsdDsvYSZndDspLiBJZiBpdCBpcyBmZWx0IHRoYXQgbGl0dGxlIHJpc2sgYXR0YWNoZXMgdG8gdGhlIGRldmVsb3BtZW50Ci0gICAgKGJlY2F1c2UsIGZvciBleGFtcGxlLCB0aGUgZG9tYWluIGlzIHdlbGwgdW5kZXJzdG9vZCwgdGhlIHN5c3RlbSBpcyBub3Qgbm92ZWwsIGFuZCBzbyBvbikgdGhlbiB0aGlzIHdvcmtmbG93IGRldGFpbCBtYXkKLSAgICBiZSBvbWl0dGVkLgotJmx0Oy9wJmd0OwotJmx0O3AmZ3Q7Ci0gICAgVGhlIGVhcmx5IEVsYWJvcmF0aW9uIFBoYXNlIGZvY3VzZXMgb24gY3JlYXRpbmcgYW4gaW5pdGlhbCBhcmNoaXRlY3R1cmUgZm9yIHRoZSBzeXN0ZW0gKCAmbHQ7YQotICAgIGhyZWY9JnF1b3Q7cmVzb3VyY2VzL3dmc19hbmQxLmh0bSZxdW90OyZndDsmbHQ7Zm9udCBjb2xvcj0mcXVvdDsjMDAwMGZmJnF1b3Q7Jmd0O0RlZmluZSBhIENhbmRpZGF0ZSBBcmNoaXRlY3R1cmUmbHQ7L2ZvbnQmZ3Q7Jmx0Oy9hJmd0OykgdG8gcHJvdmlkZSBhIHN0YXJ0aW5nCi0gICAgcG9pbnQgZm9yIHRoZSBtYWluIGFuYWx5c2lzIHdvcmsuIElmIHRoZSBhcmNoaXRlY3R1cmUgYWxyZWFkeSBleGlzdHMgKGVpdGhlciBiZWNhdXNlIGl0IHdhcyBwcm9kdWNlZCBpbiBwcmV2aW91cwotICAgIGl0ZXJhdGlvbnMsIGluIHByZXZpb3VzIHByb2plY3RzLCBvciBpcyBvYnRhaW5lZCBmcm9tIGFuIGFwcGxpY2F0aW9uIGZyYW1ld29yayksIHRoZSBmb2N1cyBvZiB0aGUgd29yayBjaGFuZ2VzIHRvCi0gICAgcmVmaW5pbmcgdGhlIGFyY2hpdGVjdHVyZSAoICZsdDthIGhyZWY9JnF1b3Q7cmVzb3VyY2VzL3dmc19hbmQyLmh0bSZxdW90OyZndDsmbHQ7Zm9udCBjb2xvcj0mcXVvdDsjMDAwMGZmJnF1b3Q7Jmd0O1JlZmluZSB0aGUgQXJjaGl0ZWN0dXJlJmx0Oy9mb250Jmd0OyZsdDsvYSZndDspCi0gICAgYW5kIGFuYWx5emluZyBiZWhhdmlvciBhbmQgY3JlYXRpbmcgYW4gaW5pdGlhbCBzZXQgb2YgZWxlbWVudHMgd2hpY2ggcHJvdmlkZSB0aGUgYXBwcm9wcmlhdGUgYmVoYXZpb3IgKCAmbHQ7YQotICAgIGhyZWY9JnF1b3Q7cmVzb3VyY2VzL3dmc19hbmQzLmh0bSZxdW90OyZndDsmbHQ7Zm9udCBjb2xvcj0mcXVvdDsjMDAwMGZmJnF1b3Q7Jmd0O0FuYWx5emUgQmVoYXZpb3ImbHQ7L2ZvbnQmZ3Q7Jmx0Oy9hJmd0OykuCi0mbHQ7L3AmZ3Q7Ci0mbHQ7cCZndDsKLSAgICBBZnRlciB0aGUgaW5pdGlhbCBlbGVtZW50cyBhcmUgaWRlbnRpZmllZCwgdGhleSBhcmUgZnVydGhlciByZWZpbmVkLiAmbHQ7YSBocmVmPSZxdW90O3Jlc291cmNlcy93ZnNfYW5kNC5odG0mcXVvdDsmZ3Q7Jmx0O2ZvbnQKLSAgICBjb2xvcj0mcXVvdDsjMDAwMGZmJnF1b3Q7Jmd0O0Rlc2lnbiBDb21wb25lbnRzJmx0Oy9mb250Jmd0OyZsdDsvYSZndDsgcHJvZHVjZSBhIHNldCBvZiBjb21wb25lbnRzIHdoaWNoIHByb3ZpZGUgdGhlIGFwcHJvcHJpYXRlIGJlaGF2aW9yIHRvCi0gICAgc2F0aXNmeSB0aGUgcmVxdWlyZW1lbnRzIG9uIHRoZSBzeXN0ZW0uIElmIHRoZSBzeXN0ZW0gaW5jbHVkZXMgYSBkYXRhYmFzZSwgdGhlbiAmbHQ7YSBocmVmPSZxdW90O3Jlc291cmNlcy93ZnNfYW5kNy5odG0mcXVvdDsmZ3Q7Jmx0O2ZvbnQKLSAgICBjb2xvcj0mcXVvdDsjMDAwMGZmJnF1b3Q7Jmd0O0Rlc2lnbiB0aGUgRGF0YWJhc2UmbHQ7L2ZvbnQmZ3Q7Jmx0Oy9hJmd0OyBvY2N1cnMgaW4gcGFyYWxsZWwuIFRoZSByZXN1bHQgaXMgYW4gaW5pdGlhbCBzZXQgb2YgY29tcG9uZW50cyB3aGljaCBhcmUKLSAgICBmdXJ0aGVyIHJlZmluZWQgaW4gJmx0O2EgaHJlZj0mcXVvdDtyZXNvdXJjZXMvd2ZkX2ltcC5odG0mcXVvdDsmZ3Q7Jmx0O2ZvbnQgY29sb3I9JnF1b3Q7IzAwMDBmZiZxdW90OyZndDtJbXBsZW1lbnRhdGlvbiZsdDsvZm9udCZndDsmbHQ7L2EmZ3Q7LiZsdDticiAvJmd0OwotJmx0Oy9wJmd0OyZhbXA7bmJzcDsmbHQ7YnIgLyZndDsKLSZsdDticiAvJmd0OzwvYWx0ZXJuYXRpdmVzPgotICAgIDxob3d0b1N0YWZmPiZsdDtwJmd0OwotICAgIFRvIGV4cGxhaW4gdGhlIHdvcmsgaW52b2x2ZWQgaW4gdGhlIEFuYWx5c2lzIGFuZCBEZXNpZ24gZGlzY2lwbGluZSwgdGhlIGFjdGl2aXRpZXMgYW5kIHdvcmsgcHJvZHVjdHMgYXJlIG9yZ2FuaXplZCBpbnRvCi0gICAgYSBjYXBhYmlsaXR5IHBhdHRlcm4gZm9yIHRoZSBkaXNjaXBsaW5lLgotJmx0Oy9wJmd0OwotJmx0O3AmZ3Q7Ci0gICAgSW4gdGhlIEluY2VwdGlvbiBQaGFzZSwgYW5hbHlzaXMgYW5kIGRlc2lnbiBpcyBjb25jZXJuZWQgd2l0aCBlc3RhYmxpc2hpbmcgd2hldGhlciB0aGUgc3lzdGVtIGFzIGVudmlzaW9uZWQgaXMKLSAgICBmZWFzaWJsZSwgYW5kIHdpdGggYXNzZXNzaW5nIHBvdGVudGlhbCB0ZWNobm9sb2dpZXMgZm9yIHRoZSBzb2x1dGlvbiAoaW4gJmx0O2EgaHJlZj0mcXVvdDtyZXNvdXJjZXMvd2ZzX2FyY2hzeW4uaHRtJnF1b3Q7Jmd0OyZsdDtmb250Ci0gICAgY29sb3I9JnF1b3Q7IzAwMDBmZiZxdW90OyZndDtQZXJmb3JtIEFyY2hpdGVjdHVyYWwgU3ludGhlc2lzJmx0Oy9mb250Jmd0OyZsdDsvYSZndDspLiBJZiBpdCBpcyBmZWx0IHRoYXQgbGl0dGxlIHJpc2sgYXR0YWNoZXMgdG8gdGhlIGRldmVsb3BtZW50Ci0gICAgKGJlY2F1c2UsIGZvciBleGFtcGxlLCB0aGUgZG9tYWluIGlzIHdlbGwgdW5kZXJzdG9vZCwgdGhlIHN5c3RlbSBpcyBub3Qgbm92ZWwsIGFuZCBzbyBvbikgdGhlbiB0aGlzIHdvcmtmbG93IGRldGFpbCBtYXkKLSAgICBiZSBvbWl0dGVkLgotJmx0Oy9wJmd0OwotJmx0O3AmZ3Q7Ci0gICAgVGhlIGVhcmx5IEVsYWJvcmF0aW9uIFBoYXNlIGZvY3VzZXMgb24gY3JlYXRpbmcgYW4gaW5pdGlhbCBhcmNoaXRlY3R1cmUgZm9yIHRoZSBzeXN0ZW0gKCAmbHQ7YQotICAgIGhyZWY9JnF1b3Q7cmVzb3VyY2VzL3dmc19hbmQxLmh0bSZxdW90OyZndDsmbHQ7Zm9udCBjb2xvcj0mcXVvdDsjMDAwMGZmJnF1b3Q7Jmd0O0RlZmluZSBhIENhbmRpZGF0ZSBBcmNoaXRlY3R1cmUmbHQ7L2ZvbnQmZ3Q7Jmx0Oy9hJmd0OykgdG8gcHJvdmlkZSBhIHN0YXJ0aW5nCi0gICAgcG9pbnQgZm9yIHRoZSBtYWluIGFuYWx5c2lzIHdvcmsuIElmIHRoZSBhcmNoaXRlY3R1cmUgYWxyZWFkeSBleGlzdHMgKGVpdGhlciBiZWNhdXNlIGl0IHdhcyBwcm9kdWNlZCBpbiBwcmV2aW91cwotICAgIGl0ZXJhdGlvbnMsIGluIHByZXZpb3VzIHByb2plY3RzLCBvciBpcyBvYnRhaW5lZCBmcm9tIGFuIGFwcGxpY2F0aW9uIGZyYW1ld29yayksIHRoZSBmb2N1cyBvZiB0aGUgd29yayBjaGFuZ2VzIHRvCi0gICAgcmVmaW5pbmcgdGhlIGFyY2hpdGVjdHVyZSAoICZsdDthIGhyZWY9JnF1b3Q7cmVzb3VyY2VzL3dmc19hbmQyLmh0bSZxdW90OyZndDsmbHQ7Zm9udCBjb2xvcj0mcXVvdDsjMDAwMGZmJnF1b3Q7Jmd0O1JlZmluZSB0aGUgQXJjaGl0ZWN0dXJlJmx0Oy9mb250Jmd0OyZsdDsvYSZndDspCi0gICAgYW5kIGFuYWx5emluZyBiZWhhdmlvciBhbmQgY3JlYXRpbmcgYW4gaW5pdGlhbCBzZXQgb2YgZWxlbWVudHMgd2hpY2ggcHJvdmlkZSB0aGUgYXBwcm9wcmlhdGUgYmVoYXZpb3IgKCAmbHQ7YQotICAgIGhyZWY9JnF1b3Q7cmVzb3VyY2VzL3dmc19hbmQzLmh0bSZxdW90OyZndDsmbHQ7Zm9udCBjb2xvcj0mcXVvdDsjMDAwMGZmJnF1b3Q7Jmd0O0FuYWx5emUgQmVoYXZpb3ImbHQ7L2ZvbnQmZ3Q7Jmx0Oy9hJmd0OykuCi0mbHQ7L3AmZ3Q7Ci0mbHQ7cCZndDsKLSAgICBBZnRlciB0aGUgaW5pdGlhbCBlbGVtZW50cyBhcmUgaWRlbnRpZmllZCwgdGhleSBhcmUgZnVydGhlciByZWZpbmVkLiAmbHQ7YSBocmVmPSZxdW90O3Jlc291cmNlcy93ZnNfYW5kNC5odG0mcXVvdDsmZ3Q7Jmx0O2ZvbnQKLSAgICBjb2xvcj0mcXVvdDsjMDAwMGZmJnF1b3Q7Jmd0O0Rlc2lnbiBDb21wb25lbnRzJmx0Oy9mb250Jmd0OyZsdDsvYSZndDsgcHJvZHVjZSBhIHNldCBvZiBjb21wb25lbnRzIHdoaWNoIHByb3ZpZGUgdGhlIGFwcHJvcHJpYXRlIGJlaGF2aW9yIHRvCi0gICAgc2F0aXNmeSB0aGUgcmVxdWlyZW1lbnRzIG9uIHRoZSBzeXN0ZW0uIElmIHRoZSBzeXN0ZW0gaW5jbHVkZXMgYSBkYXRhYmFzZSwgdGhlbiAmbHQ7YSBocmVmPSZxdW90O3Jlc291cmNlcy93ZnNfYW5kNy5odG0mcXVvdDsmZ3Q7Jmx0O2ZvbnQKLSAgICBjb2xvcj0mcXVvdDsjMDAwMGZmJnF1b3Q7Jmd0O0Rlc2lnbiB0aGUgRGF0YWJhc2UmbHQ7L2ZvbnQmZ3Q7Jmx0Oy9hJmd0OyBvY2N1cnMgaW4gcGFyYWxsZWwuIFRoZSByZXN1bHQgaXMgYW4gaW5pdGlhbCBzZXQgb2YgY29tcG9uZW50cyB3aGljaCBhcmUKLSAgICBmdXJ0aGVyIHJlZmluZWQgaW4gJmx0O2EgaHJlZj0mcXVvdDtyZXNvdXJjZXMvd2ZkX2ltcC5odG0mcXVvdDsmZ3Q7Jmx0O2ZvbnQgY29sb3I9JnF1b3Q7IzAwMDBmZiZxdW90OyZndDtJbXBsZW1lbnRhdGlvbiZsdDsvZm9udCZndDsmbHQ7L2EmZ3Q7LiZsdDticiAvJmd0OwotJmx0Oy9wJmd0OwotJmFtcDtuYnNwOyZsdDticiAvJmd0OwotJmx0O2JyIC8mZ3Q7PC9ob3d0b1N0YWZmPgotICAgIDxleHRlcm5hbElkPkVYdGVybmFsIElEOkNQMSB3aXRoIGFsbCBlbGVtZW50czwvZXh0ZXJuYWxJZD4KLSAgICA8c2NvcGU+Jmx0O3AmZ3Q7Ci0gICAgVG8gZXhwbGFpbiB0aGUgd29yayBpbnZvbHZlZCBpbiB0aGUgQW5hbHlzaXMgYW5kIERlc2lnbiBkaXNjaXBsaW5lLCB0aGUgYWN0aXZpdGllcyBhbmQgd29yayBwcm9kdWN0cyBhcmUgb3JnYW5pemVkIGludG8KLSAgICBhIGNhcGFiaWxpdHkgcGF0dGVybiBmb3IgdGhlIGRpc2NpcGxpbmUuCi0mbHQ7L3AmZ3Q7Ci0mbHQ7cCZndDsKLSAgICBJbiB0aGUgSW5jZXB0aW9uIFBoYXNlLCBhbmFseXNpcyBhbmQgZGVzaWduIGlzIGNvbmNlcm5lZCB3aXRoIGVzdGFibGlzaGluZyB3aGV0aGVyIHRoZSBzeXN0ZW0gYXMgZW52aXNpb25lZCBpcwotICAgIGZlYXNpYmxlLCBhbmQgd2l0aCBhc3Nlc3NpbmcgcG90ZW50aWFsIHRlY2hub2xvZ2llcyBmb3IgdGhlIHNvbHV0aW9uIChpbiAmbHQ7YSBocmVmPSZxdW90O3Jlc291cmNlcy93ZnNfYXJjaHN5bi5odG0mcXVvdDsmZ3Q7Jmx0O2ZvbnQKLSAgICBjb2xvcj0mcXVvdDsjMDAwMGZmJnF1b3Q7Jmd0O1BlcmZvcm0gQXJjaGl0ZWN0dXJhbCBTeW50aGVzaXMmbHQ7L2ZvbnQmZ3Q7Jmx0Oy9hJmd0OykuIElmIGl0IGlzIGZlbHQgdGhhdCBsaXR0bGUgcmlzayBhdHRhY2hlcyB0byB0aGUgZGV2ZWxvcG1lbnQKLSAgICAoYmVjYXVzZSwgZm9yIGV4YW1wbGUsIHRoZSBkb21haW4gaXMgd2VsbCB1bmRlcnN0b29kLCB0aGUgc3lzdGVtIGlzIG5vdCBub3ZlbCwgYW5kIHNvIG9uKSB0aGVuIHRoaXMgd29ya2Zsb3cgZGV0YWlsIG1heQotICAgIGJlIG9taXR0ZWQuCi0mbHQ7L3AmZ3Q7Ci0mbHQ7cCZndDsKLSAgICBUaGUgZWFybHkgRWxhYm9yYXRpb24gUGhhc2UgZm9jdXNlcyBvbiBjcmVhdGluZyBhbiBpbml0aWFsIGFyY2hpdGVjdHVyZSBmb3IgdGhlIHN5c3RlbSAoICZsdDthCi0gICAgaHJlZj0mcXVvdDtyZXNvdXJjZXMvd2ZzX2FuZDEuaHRtJnF1b3Q7Jmd0OyZsdDtmb250IGNvbG9yPSZxdW90OyMwMDAwZmYmcXVvdDsmZ3Q7RGVmaW5lIGEgQ2FuZGlkYXRlIEFyY2hpdGVjdHVyZSZsdDsvZm9udCZndDsmbHQ7L2EmZ3Q7KSB0byBwcm92aWRlIGEgc3RhcnRpbmcKLSAgICBwb2ludCBmb3IgdGhlIG1haW4gYW5hbHlzaXMgd29yay4gSWYgdGhlIGFyY2hpdGVjdHVyZSBhbHJlYWR5IGV4aXN0cyAoZWl0aGVyIGJlY2F1c2UgaXQgd2FzIHByb2R1Y2VkIGluIHByZXZpb3VzCi0gICAgaXRlcmF0aW9ucywgaW4gcHJldmlvdXMgcHJvamVjdHMsIG9yIGlzIG9idGFpbmVkIGZyb20gYW4gYXBwbGljYXRpb24gZnJhbWV3b3JrKSwgdGhlIGZvY3VzIG9mIHRoZSB3b3JrIGNoYW5nZXMgdG8KLSAgICByZWZpbmluZyB0aGUgYXJjaGl0ZWN0dXJlICggJmx0O2EgaHJlZj0mcXVvdDtyZXNvdXJjZXMvd2ZzX2FuZDIuaHRtJnF1b3Q7Jmd0OyZsdDtmb250IGNvbG9yPSZxdW90OyMwMDAwZmYmcXVvdDsmZ3Q7UmVmaW5lIHRoZSBBcmNoaXRlY3R1cmUmbHQ7L2ZvbnQmZ3Q7Jmx0Oy9hJmd0OykKLSAgICBhbmQgYW5hbHl6aW5nIGJlaGF2aW9yIGFuZCBjcmVhdGluZyBhbiBpbml0aWFsIHNldCBvZiBlbGVtZW50cyB3aGljaCBwcm92aWRlIHRoZSBhcHByb3ByaWF0ZSBiZWhhdmlvciAoICZsdDthCi0gICAgaHJlZj0mcXVvdDtyZXNvdXJjZXMvd2ZzX2FuZDMuaHRtJnF1b3Q7Jmd0OyZsdDtmb250IGNvbG9yPSZxdW90OyMwMDAwZmYmcXVvdDsmZ3Q7QW5hbHl6ZSBCZWhhdmlvciZsdDsvZm9udCZndDsmbHQ7L2EmZ3Q7KS4KLSZsdDsvcCZndDsKLSZsdDtwJmd0OwotICAgIEFmdGVyIHRoZSBpbml0aWFsIGVsZW1lbnRzIGFyZSBpZGVudGlmaWVkLCB0aGV5IGFyZSBmdXJ0aGVyIHJlZmluZWQuICZsdDthIGhyZWY9JnF1b3Q7cmVzb3VyY2VzL3dmc19hbmQ0Lmh0bSZxdW90OyZndDsmbHQ7Zm9udAotICAgIGNvbG9yPSZxdW90OyMwMDAwZmYmcXVvdDsmZ3Q7RGVzaWduIENvbXBvbmVudHMmbHQ7L2ZvbnQmZ3Q7Jmx0Oy9hJmd0OyBwcm9kdWNlIGEgc2V0IG9mIGNvbXBvbmVudHMgd2hpY2ggcHJvdmlkZSB0aGUgYXBwcm9wcmlhdGUgYmVoYXZpb3IgdG8KLSAgICBzYXRpc2Z5IHRoZSByZXF1aXJlbWVudHMgb24gdGhlIHN5c3RlbS4gSWYgdGhlIHN5c3RlbSBpbmNsdWRlcyBhIGRhdGFiYXNlLCB0aGVuICZsdDthIGhyZWY9JnF1b3Q7cmVzb3VyY2VzL3dmc19hbmQ3Lmh0bSZxdW90OyZndDsmbHQ7Zm9udAotICAgIGNvbG9yPSZxdW90OyMwMDAwZmYmcXVvdDsmZ3Q7RGVzaWduIHRoZSBEYXRhYmFzZSZsdDsvZm9udCZndDsmbHQ7L2EmZ3Q7IG9jY3VycyBpbiBwYXJhbGxlbC4gVGhlIHJlc3VsdCBpcyBhbiBpbml0aWFsIHNldCBvZiBjb21wb25lbnRzIHdoaWNoIGFyZQotICAgIGZ1cnRoZXIgcmVmaW5lZCBpbiAmbHQ7YSBocmVmPSZxdW90O3Jlc291cmNlcy93ZmRfaW1wLmh0bSZxdW90OyZndDsmbHQ7Zm9udCBjb2xvcj0mcXVvdDsjMDAwMGZmJnF1b3Q7Jmd0O0ltcGxlbWVudGF0aW9uJmx0Oy9mb250Jmd0OyZsdDsvYSZndDsuJmx0O2JyIC8mZ3Q7Ci0mbHQ7L3AmZ3Q7JmFtcDtuYnNwOyZsdDticiAvJmd0OwotJmx0O2JyIC8mZ3Q7PC9zY29wZT4KLSAgICA8dXNhZ2VOb3Rlcz4mbHQ7cCZndDsKLSAgICBUaGUgc3ViY2F0ZWdvcmllcyBvZiBwcm9jZXNzIGFyZSBkZWxpdmVyeSBwcm9jZXNzIGFuZCBjYXBhYmlsaXR5IHBhdHRlcm4uJmFtcDtuYnNwOyBBIGRlbGl2ZXJ5IHByb2Nlc3MgZGVmaW5lcyBhIGNvbXBsZXRlCi0gICAgb3IgZW5kLXRvLWVuZCBwcm9jZXNzLiZhbXA7bmJzcDsgQSBjYXBhYmlsaXR5IHBhdHRlcm4gaXMgYSBwcm9jZXNzIGZyYWdtZW50IHVzZWQgdG8gY29tcG9zZSBhIGRlbGl2ZXJ5IHByb2Nlc3MuCi0mbHQ7L3AmZ3Q7PC91c2FnZU5vdGVzPgotICA8L29yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc0Rlc2NyaXB0aW9uPgotICA8b3JnLmVjbGlwc2UuZXBmLnVtYTpBY3Rpdml0eURlc2NyaXB0aW9uIHhtaTppZD0iLVlWVFpSRTVveTVvR2N1ZTFYWGgzZFEiIG5hbWU9IkFjdGl2aXR5MSxfRTczcklUemlFZHE1eXNGT05yMUJHUSIgZ3VpZD0iLVlWVFpSRTVveTVvR2N1ZTFYWGgzZFEiPgotICAgIDxtYWluRGVzY3JpcHRpb24+Jmx0O3AmZ3Q7Ci0gICAgVGhpcyBXb3JrZmxvdyBEZXRhaWw6Ci0mbHQ7L3AmZ3Q7Ci0mbHQ7dWwmZ3Q7Ci0gICAgJmx0O2xpJmd0OwotICAgICAgICBQcm92aWRlcyB0aGUgbmF0dXJhbCAmbHQ7YiZndDt0cmFuc2l0aW9uIGZyb20gYW5hbHlzaXMmbHQ7L2ImZ3Q7IGFjdGl2aXRpZXMgJmx0O2ImZ3Q7dG8gZGVzaWduJmx0Oy9iJmd0OyBhY3Rpdml0aWVzLCBpZGVudGlmeWluZzogCi0gICAgICAgICZsdDt1bCZndDsKLSAgICAgICAgICAgICZsdDtsaSZndDsKLSAgICAgICAgICAgICAgICBhcHByb3ByaWF0ZSBkZXNpZ24gZWxlbWVudHMgZnJvbSBhbmFseXNpcyBlbGVtZW50cwotICAgICAgICAgICAgJmx0Oy9saSZndDsKLSAgICAgICAgICAgICZsdDtsaSZndDsKLSAgICAgICAgICAgICAgICBhcHByb3ByaWF0ZSBkZXNpZ24gbWVjaGFuaXNtcyBmcm9tIHJlbGF0ZWQgYW5hbHlzaXMgbWVjaGFuaXNtcwotICAgICAgICAgICAgJmx0Oy9saSZndDsKLSAgICAgICAgJmx0Oy91bCZndDsKLSAgICAmbHQ7L2xpJmd0OwotICAgICZsdDtsaSZndDsKLSAgICAgICAgJmx0O2ImZ3Q7RGVzY3JpYmVzJmx0Oy9iJmd0OyB0aGUgb3JnYW5pemF0aW9uIG9mIHRoZSBzeXN0ZW0ncyAmbHQ7YiZndDtydW4tdGltZSBhbmQgZGVwbG95bWVudCBhcmNoaXRlY3R1cmUmbHQ7L2ImZ3Q7Ci0gICAgJmx0Oy9saSZndDsKLSAgICAmbHQ7bGkmZ3Q7Ci0gICAgICAgICZsdDtiJmd0O09yZ2FuaXplcyB0aGUgaW1wbGVtZW50YXRpb24gbW9kZWwmbHQ7L2ImZ3Q7IHNvIGFzIHRvIG1ha2UgdGhlIHRyYW5zaXRpb24gYmV0d2VlbiBkZXNpZ24gYW5kIGltcGxlbWVudGF0aW9uIHNlYW1sZXNzCi0gICAgJmx0Oy9saSZndDsKLSAgICAmbHQ7bGkmZ3Q7Ci0gICAgICAgICZsdDtiJmd0O01haW50YWlucyB0aGUgY29uc2lzdGVuY3kgYW5kIGludGVncml0eSBvZiB0aGUgYXJjaGl0ZWN0dXJlJmx0Oy9iJmd0OywgZW5zdXJpbmcgdGhhdDogCi0gICAgICAgICZsdDt1bCZndDsKLSAgICAgICAgICAgICZsdDtsaSZndDsKLSAgICAgICAgICAgICAgICBuZXcgZGVzaWduIGVsZW1lbnRzIGlkZW50aWZpZWQgZm9yIHRoZSBjdXJyZW50IGl0ZXJhdGlvbiBhcmUgaW50ZWdyYXRlZCB3aXRoIHByZS1leGlzdGluZyBkZXNpZ24gZWxlbWVudHMuCi0gICAgICAgICAgICAmbHQ7L2xpJmd0OwotICAgICAgICAgICAgJmx0O2xpJmd0OwotICAgICAgICAgICAgICAgIG1heGltYWwgcmUtdXNlIG9mIGF2YWlsYWJsZSBjb21wb25lbnRzIGFuZCBkZXNpZ24gZWxlbWVudHMgaXMgYWNoaWV2ZWQgYXMgZWFybHkgYXMgcG9zc2libGUgaW4gdGhlIGRlc2lnbgotICAgICAgICAgICAgICAgIGVmZm9ydC4KLSAgICAgICAgICAgICZsdDsvbGkmZ3Q7Ci0gICAgICAgICZsdDsvdWwmZ3Q7Ci0gICAgJmx0Oy9saSZndDsKLSZsdDsvdWwmZ3Q7PC9tYWluRGVzY3JpcHRpb24+Ci0gICAgPGtleUNvbnNpZGVyYXRpb25zPiZsdDtwJmd0OwotICAgIEtleSBjb25zaWRlcmF0aW9uczoKLSZsdDsvcCZndDsKLSZsdDt1bCZndDsKLSAgICAmbHQ7bGkmZ3Q7Ci0gICAgICAgIGtleTEKLSAgICAmbHQ7L2xpJmd0OwotICAgICZsdDtsaSZndDsKLSAgICAgICAga2V5MgotICAgICZsdDsvbGkmZ3Q7Ci0gICAgJmx0O2xpJmd0OwotICAgICAgICBrZXkzCi0gICAgJmx0Oy9saSZndDsKLSAgICAmbHQ7bGkmZ3Q7Ci0gICAgICAgIGtleTQKLSAgICAmbHQ7L2xpJmd0OwotICAgICZsdDtsaSZndDsKLSAgICAgICAga2V5NQotICAgICZsdDsvbGkmZ3Q7Ci0gICAgJmx0O2xpJmd0OwotICAgICAgICBrZXk2Ci0gICAgJmx0Oy9saSZndDsKLSAgICAmbHQ7bGkmZ3Q7Ci0gICAgICAgIGtleTcKLSAgICAmbHQ7L2xpJmd0OwotJmx0Oy91bCZndDs8L2tleUNvbnNpZGVyYXRpb25zPgotICAgIDx1c2FnZUd1aWRhbmNlPiZsdDtwJmd0OwotICAgIFRoZSB3b3JrIGlzIGJlc3QgZG9uZSBpbiBzZXZlcmFsIHNlc3Npb25zLCBwZXJoYXBzIHBlcmZvcm1lZCBvdmVyIGEgZmV3IGRheXMgKG9yIHdlZWtzIGFuZCBtb250aHMgZm9yIHZlcnkgbGFyZ2UKLSAgICBzeXN0ZW1zKS4gVGhlIGluaXRpYWwgZm9jdXMgd2lsbCBiZSBvbiB0aGUgYWN0aXZpdGllcyAmbHQ7YSBjbGFzcz0mcXVvdDtlbGVtZW50TGluayZxdW90OwotICAgIGhyZWY9JnF1b3Q7cmVzb3VyY2VzL2lkZW50aWZ5X2Rlc2lnbl9tZWNoYW5pc21zLHtDN0EyNkJENy0zODIwLTQ4RDktODMwRi02ODRDM0FGMTU1Rjl9Lmh0bWwmcXVvdDsKLSAgICBndWlkPSZxdW90O3tDN0EyNkJENy0zODIwLTQ4RDktODMwRi02ODRDM0FGMTU1Rjl9JnF1b3Q7Jmd0O0lkZW50aWZ5IERlc2lnbiBNZWNoYW5pc21zJmx0Oy9hJmd0OyBhbmQgJmx0O2EgY2xhc3M9JnF1b3Q7ZWxlbWVudExpbmsmcXVvdDsKLSAgICBocmVmPSZxdW90O3Jlc291cmNlcy9pZGVudGlmeV9kZXNpZ25fZWxlbWVudHNfcmVhbC10aW1lX2Rlc2lnbix7NTg2OTYzRDAtNjA3RC00RUMyLThENTMtMjkyREFGQUI5QzkyfS5odG1sJnF1b3Q7Ci0gICAgZ3VpZD0mcXVvdDt7NTg2OTYzRDAtNjA3RC00RUMyLThENTMtMjkyREFGQUI5QzkyfSZxdW90OyZndDtpZGVudGlmeV9kZXNpZ25fZWxlbWVudHNfcmVhbC10aW1lX2Rlc2lnbiZsdDsvYSZndDssIHdpdGggYSBncmVhdCBkZWFsIG9mCi0gICAgaXRlcmF0aW9uIHdpdGggdGhlICZsdDthIGNsYXNzPSZxdW90O2VsZW1lbnRMaW5rJnF1b3Q7Ci0gICAgaHJlZj0mcXVvdDtyZXNvdXJjZXMvaW5jb3Jwb3JhdGVfZGVzaWduX2VsZW1lbnRzLHs1QzY0NzE3My00RTMyLTQ1OTQtOTZBOS0yNTQ4QjQ3NzIyRkF9Lmh0bWwmcXVvdDsKLSAgICBndWlkPSZxdW90O3s1QzY0NzE3My00RTMyLTQ1OTQtOTZBOS0yNTQ4QjQ3NzIyRkF9JnF1b3Q7Jmd0O0luY29ycG9yYXRlIEV4aXN0aW5nIERlc2lnbiBFbGVtZW50cyZsdDsvYSZndDsgYWN0aXZpdHkgdG8gbWFrZSBzdXJlIHRoYXQgbmV3Ci0gICAgZWxlbWVudHMgZG8gbm90IGR1cGxpY2F0ZSBmdW5jdGlvbmFsaXR5IG9mIGV4aXN0aW5nIGVsZW1lbnRzLgotJmx0Oy9wJmd0OwotJmx0O3AmZ3Q7Ci0gICAgQXMgdGhlIGRlc2lnbiBlbWVyZ2VzLCBjb25jdXJyZW5jeSBhbmQgZGlzdHJpYnV0aW9uIGlzc3VlcyBhcmUgaW50cm9kdWNlZCBpbiB0aGUgYWN0aXZpdGllcyAmbHQ7YSBjbGFzcz0mcXVvdDtlbGVtZW50TGluayZxdW90OwotICAgIGhyZWY9JnF1b3Q7cmVzb3VyY2VzL2Rlc2NyaWJlX3J1bnRpbWVfYXJjaGl0ZWN0dXJlLHs0RDM1QzAzOC1BMkQwLTQ4QjgtOUVDRC01MjcxN0ZFQUUzM0F9Lmh0bWwmcXVvdDsKLSAgICBndWlkPSZxdW90O3s0RDM1QzAzOC1BMkQwLTQ4QjgtOUVDRC01MjcxN0ZFQUUzM0F9JnF1b3Q7Jmd0O0Rlc2NyaWJlIHRoZSBSdW4tdGltZSBBcmNoaXRlY3R1cmUmbHQ7L2EmZ3Q7IGFuZCAmbHQ7YSBjbGFzcz0mcXVvdDtlbGVtZW50TGluayZxdW90OwotICAgIGhyZWY9JnF1b3Q7cmVzb3VyY2VzL2Rlc2NyaWJlX2Rpc3RyaWJ1dGlvbix7NkExMTI4MDgtMEE5MC00MjdBLUJBQjktRTE0RjNGQkY3MkI1fS5odG1sJnF1b3Q7Ci0gICAgZ3VpZD0mcXVvdDt7NkExMTI4MDgtMEE5MC00MjdBLUJBQjktRTE0RjNGQkY3MkI1fSZxdW90OyZndDtEZXNjcmliZSBEaXN0cmlidXRpb24mbHQ7L2EmZ3Q7LCByZXNwZWN0aXZlbHkuIEFzIHRoZXNlIGlzc3VlcyBhcmUgY29uc2lkZXJlZCwKLSAgICBjaGFuZ2VzIHRvIGRlc2lnbiBlbGVtZW50cyBtYXkgYmUgcmVxdWlyZWQgdG8gc3BsaXQgYmVoYXZpb3IgYWNyb3NzIHByb2Nlc3NlcywgdGhyZWFkcyBvciBub2Rlcy4KLSZsdDsvcCZndDsKLSZsdDtwJmd0OwotICAgIEFzIHRoZSBpbmRpdmlkdWFsIG1vZGVscyBhcmUgcmVmaW5lZCB0byBpbmNvcnBvcmF0ZSB0aGUgYXJjaGl0ZWN0dXJhbCBkZWNpc2lvbnMsIHRoZSByZXN1bHRzIGFyZSBkb2N1bWVudGVkIGluCi0gICAgcmVzcGVjdGl2ZSB2aWV3IHNlY3Rpb25zIGluIHRoZSBTb2Z0d2FyZSBBcmNoaXRlY3R1cmUgRG9jdW1lbnQgKGUuZy4sIGFzIHRoZSBEZXNpZ24gTW9kZWwgaXMgcmVmaW5lZCwgdGhlIExvZ2ljYWwgVmlldwotICAgIG9mIHRoZSBTb2Z0d2FyZSBBcmNoaXRlY3R1cmUgRG9jdW1lbnQgaXMgcmVmaW5lZCwgYXMgd2VsbCkuIFRoZSByZXN1bHRpbmcgYXJjaGl0ZWN0dXJlIGlzIHJldmlld2VkLgotJmx0Oy9wJmd0OwotJmx0O2JyIC8mZ3Q7Ci0mbHQ7YnIgLyZndDs8L3VzYWdlR3VpZGFuY2U+Ci0gICAgPHB1cnBvc2U+Jmx0O3AmZ3Q7Ci0gICAgUHVycG9zZSBvZiB0aGlzIGFjdGl2aXR5IGlzIHRvIGhhdmUgdGFza3MgdGhhdCBhcmUgYXNzb2NpYXRlZCB0byBvdGhlciB0YXNrcy4KLSZsdDsvcCZndDsKLSZsdDtwJmd0OwotICAgICZhbXA7bmJzcDsmbHQ7aW1nIGhlaWdodD0mcXVvdDs3MSZxdW90OyBhbHQ9JnF1b3Q7JnF1b3Q7IHNyYz0mcXVvdDtyZXNvdXJjZXMvcnVwLmpwZyZxdW90OyB3aWR0aD0mcXVvdDsxNzYmcXVvdDsgLyZndDsKLSZsdDsvcCZndDs8L3B1cnBvc2U+Ci0gICAgPGFsdGVybmF0aXZlcz4mbHQ7cCZndDsKLSAgICBBbHRlcmFudGl2ZXM6Ci0mbHQ7L3AmZ3Q7Ci0mbHQ7b2wmZ3Q7Ci0gICAgJmx0O2xpJmd0OwotICAgICAgICBBbHRlcjEKLSAgICAmbHQ7L2xpJmd0OwotICAgICZsdDtsaSZndDsKLSAgICAgICAgQWx0ZXIyCi0gICAgJmx0Oy9saSZndDsKLSAgICAmbHQ7bGkmZ3Q7Ci0gICAgICAgIEFsdGVyMwotICAgICZsdDsvbGkmZ3Q7Ci0mbHQ7L29sJmd0OzwvYWx0ZXJuYXRpdmVzPgotICAgIDxob3d0b1N0YWZmPiZsdDtwJmd0OwotICAgIFRoZXNlIGFjdGl2aXRpZXMgYXJlIGJlc3QgY2FycmllZCBvdXQgYnkgYSBzbWFsbCB0ZWFtIHN0YWZmZWQgYnkgY3Jvc3MtZnVuY3Rpb25hbCB0ZWFtIG1lbWJlcnMuIElzc3VlcyB0aGF0IGFyZQotICAgIHR5cGljYWxseSBhcmNoaXRlY3R1cmFsbHkgc2lnbmlmaWNhbnQgaW5jbHVkZSB1c2FiaWxpdHksIHBlcmZvcm1hbmNlLCBzY2FsaW5nLCBwcm9jZXNzIGFuZCB0aHJlYWQgc3luY2hyb25pemF0aW9uLCBhbmQKLSAgICBkaXN0cmlidXRpb24uIFRoZSB0ZWFtIHNob3VsZCBhbHNvIGluY2x1ZGUgbWVtYmVycyB3aXRoIGRvbWFpbiBleHBlcmllbmNlIHdobyBjYW4gaWRlbnRpZnkga2V5IGFic3RyYWN0aW9ucy4gVGhlIHRlYW0KLSAgICBzaG91bGQgYWxzbyBoYXZlIGV4cGVyaWVuY2Ugd2l0aCBtb2RlbCBvcmdhbml6YXRpb24gYW5kIGxheWVyaW5nLiBUaGUgdGVhbSB3aWxsIG5lZWQgdG8gYmUgYWJsZSB0byBwdWxsIGFsbCB0aGVzZQotICAgIGRpc3BhcmF0ZSB0aHJlYWRzIGludG8gYSBjb2hlc2l2ZSwgY29oZXJlbnQgKGFsYmVpdCBwcmVsaW1pbmFyeSkgYXJjaGl0ZWN0dXJlLgotJmx0Oy9wJmd0OwotJmx0O3AmZ3Q7Ci0gICAgQmVjYXVzZSB0aGUgZm9jdXMgb2YgdGhlIGFyY2hpdGVjdHVyZSBlZmZvcnQgaXMgc2hpZnRpbmcgdG93YXJkIGltcGxlbWVudGF0aW9uIGlzc3VlcywgZ3JlYXRlciBhdHRlbnRpb24gbmVlZHMgdG8gYmUKLSAgICBwYWlkIHRvIHNwZWNpZmljIHRlY2hub2xvZ3kgaXNzdWVzLiBUaGlzIHdpbGwgZm9yY2UgdGhlIGFyY2hpdGVjdHVyZSB0ZWFtIHRvIHNoaWZ0IG1lbWJlcnMgb3IgZXhwYW5kIHRvIGluY2x1ZGUgcGVvcGxlCi0gICAgd2l0aCBkaXN0cmlidXRpb24gYW5kIGRlcGxveW1lbnQgZXhwZXJ0aXNlIChpZiB0aG9zZSBpc3N1ZXMgYXJlIGFyY2hpdGVjdHVyYWxseSBzaWduaWZpY2FudCkuIEluIG9yZGVyIHRvIHVuZGVyc3RhbmQKLSAgICB0aGUgcG90ZW50aWFsIGltcGFjdCBvZiB0aGUgc3RydWN0dXJlIG9uIHRoZSBpbXBsZW1lbnRhdGlvbiBtb2RlbCBvbiB0aGUgZWFzZSBvZiBpbnRlZ3JhdGlvbiwgZXhwZXJ0aXNlIGluIHRoZSBzb2Z0d2FyZQotICAgIGJ1aWxkIG1hbmFnZW1lbnQgcHJvY2VzcyBpcyB1c2VmdWwgdG8gaGF2ZS4KLSZsdDsvcCZndDsKLSZsdDtwJmd0OwotICAgIEF0IHRoZSBzYW1lIHRpbWUsIGl0IGlzIGVzc2VudGlhbCB0aGF0IHRoZSBhcmNoaXRlY3R1cmUgdGVhbSBub3QgYmUgY29tcG9zZWQgb2YgYSBsYXJnZSBleHRlbmRlZCB0ZWFtLiBBIHN0cmF0ZWd5IGZvcgotICAgIGNvdW50ZXJpbmcgdGhpcyB0cmVuZCBpcyB0byByZXRhaW4gYSByZWxhdGl2ZWx5IHNtYWxsIGNvcmUgdGVhbSB3aXRoIGEgc2F0ZWxsaXRlIGdyb3VwIG9mIGV4dGVuZGVkIHRlYW0gbWVtYmVycyB0aGF0Ci0gICAgYXJlIGJyb3VnaHQgaW4gYXMgJnF1b3Q7Y29uc3VsdGFudHMmcXVvdDsgb24ga2V5IGlzc3VlcyZsdDtiJmd0Oy4mbHQ7L2ImZ3Q7IFRoaXMgc3RydWN0dXJlIGFsc28gd29ya3Mgd2VsbCBmb3Igc21hbGxlciBwcm9qZWN0cyB3aGVyZQotICAgIHNwZWNpZmljIGV4cGVydGlzZSBtYXkgYmUgYm9ycm93ZWQgb3IgY29udHJhY3RlZCBmcm9tIG90aGVyIG9yZ2FuaXphdGlvbnM7IHRoZXkgY2FuIGJlIGJyb3VnaHQgaW4gYXMgc3BlY2lmaWMgaXNzdWVzCi0gICAgbmVlZCB0byBiZSBhZGRyZXNzZWQuCi0mbHQ7L3AmZ3Q7PC9ob3d0b1N0YWZmPgotICA8L29yZy5lY2xpcHNlLmVwZi51bWE6QWN0aXZpdHlEZXNjcmlwdGlvbj4KLSAgPG9yZy5lY2xpcHNlLmVwZi51bWE6QWN0aXZpdHlEZXNjcmlwdGlvbiB4bWk6aWQ9Ii1WUlVDU2hBdlhyc0xnczdQWnpIZ1V3IiBuYW1lPSJJdGVyYXRpb24xLF9FRlZyd1R6aUVkcTV5c0ZPTnIxQkdRIiBndWlkPSItVlJVQ1NoQXZYcnNMZ3M3UFp6SGdVdyI+Ci0gICAgPG1haW5EZXNjcmlwdGlvbj4mbHQ7cCZndDsKLSAgICBUaGlzIHdvcmtmbG93IGRldGFpbCBoYXMgdGhlIGZvbGxvd2luZyBnb2FsczoKLSZsdDsvcCZndDsKLSZsdDt1bCZndDsKLSAgICAmbHQ7bGkmZ3Q7Ci0gICAgICAgIENyZWF0ZSBhbiBpbml0aWFsIHNrZXRjaCBvZiB0aGUgYXJjaGl0ZWN0dXJlIG9mIHRoZSBzeXN0ZW0gCi0gICAgICAgICZsdDt1bCZndDsKLSAgICAgICAgICAgICZsdDtsaSZndDsKLSAgICAgICAgICAgICAgICBEZWZpbmUgYW4gaW5pdGlhbCBzZXQgb2YgYXJjaGl0ZWN0dXJhbGx5IHNpZ25pZmljYW50IGVsZW1lbnRzIHRvIHVzZSBhcyB0aGUgYmFzaXMgZm9yIGFuYWx5c2lzCi0gICAgICAgICAgICAmbHQ7L2xpJmd0OwotICAgICAgICAgICAgJmx0O2xpJmd0OwotICAgICAgICAgICAgICAgIERlZmluZSBhbiBpbml0aWFsIHNldCBvZiBhbmFseXNpcyBtZWNoYW5pc21zCi0gICAgICAgICAgICAmbHQ7L2xpJmd0OwotICAgICAgICAgICAgJmx0O2xpJmd0OwotICAgICAgICAgICAgICAgIERlZmluZSB0aGUgaW5pdGlhbCBsYXllcmluZyBhbmQgb3JnYW5pemF0aW9uIG9mIHRoZSBzeXN0ZW0KLSAgICAgICAgICAgICZsdDsvbGkmZ3Q7Ci0gICAgICAgICAgICAmbHQ7bGkmZ3Q7Ci0gICAgICAgICAgICAgICAgRGVmaW5lIHRoZSB1c2UtY2FzZSByZWFsaXphdGlvbnMgdG8gYmUgYWRkcmVzc2VkIGluIHRoZSBjdXJyZW50IGl0ZXJhdGlvbgotICAgICAgICAgICAgJmx0Oy9saSZndDsKLSAgICAgICAgJmx0Oy91bCZndDsKLSAgICAmbHQ7L2xpJmd0OwotICAgICZsdDtsaSZndDsKLSAgICAgICAgSWRlbnRpZnkgYW5hbHlzaXMgY2xhc3NlcyBmcm9tIHRoZSBhcmNoaXRlY3R1cmFsbHkgc2lnbmlmaWNhbnQgdXNlIGNhc2VzCi0gICAgJmx0Oy9saSZndDsKLSAgICAmbHQ7bGkmZ3Q7Ci0gICAgICAgIFVwZGF0ZSB0aGUgdXNlLWNhc2UgcmVhbGl6YXRpb25zIHdpdGggYW5hbHlzaXMgY2xhc3MgaW50ZXJhY3Rpb25zCi0gICAgJmx0Oy9saSZndDsKLSZsdDsvdWwmZ3Q7PC9tYWluRGVzY3JpcHRpb24+Ci0gICAgPGtleUNvbnNpZGVyYXRpb25zPiZsdDtwJmd0OwotICAgIEtleSBjb25zaWRlcmF0aW9uczoKLSZsdDsvcCZndDsKLSZsdDt1bCZndDsKLSAgICAmbHQ7bGkmZ3Q7Ci0gICAgICAgIGtleTExCi0gICAgJmx0Oy9saSZndDsKLSAgICAmbHQ7bGkmZ3Q7Ci0gICAgICAgIGtleTIyCi0gICAgJmx0Oy9saSZndDsKLSAgICAmbHQ7bGkmZ3Q7Ci0gICAgICAgIGtleTMzCi0gICAgJmx0Oy9saSZndDsKLSZsdDsvdWwmZ3Q7PC9rZXlDb25zaWRlcmF0aW9ucz4KLSAgICA8dXNhZ2VHdWlkYW5jZT4mbHQ7cCZndDsKLSAgICBUaGUgd29yayBpcyBiZXN0IGRvbmUgaW4gc2V2ZXJhbCBzZXNzaW9ucywgcGVyaGFwcyBwZXJmb3JtZWQgb3ZlciBhIGZldyBkYXlzIChvciB3ZWVrcyBhbmQgbW9udGhzIGZvciB2ZXJ5IGxhcmdlCi0gICAgc3lzdGVtcyksIHdpdGggaXRlcmF0aW9uIGJldHdlZW4gJmx0O2EgY2xhc3M9JnF1b3Q7ZWxlbWVudExpbmsmcXVvdDsKLSAgICBocmVmPSZxdW90O3Jlc291cmNlcy9hcmNoaXRlY3R1cmFsX2FuYWx5c2lzLHs4Q0I0ODQwMi1ENEM1LTRFMTctQkIzMy01MDczMTVDQjFCQkZ9Lmh0bWwmcXVvdDsKLSAgICBndWlkPSZxdW90O3s4Q0I0ODQwMi1ENEM1LTRFMTctQkIzMy01MDczMTVDQjFCQkZ9JnF1b3Q7Jmd0O0FyY2hpdGVjdHVyYWwgQW5hbHlzaXMmbHQ7L2EmZ3Q7IGFuZCAmbHQ7YSBjbGFzcz0mcXVvdDtlbGVtZW50TGluayZxdW90OwotICAgIGhyZWY9JnF1b3Q7cmVzb3VyY2VzL3VzZV9jYXNlX2FuYWx5c2lzLHsyODAxNDYxNS1BNjJGLTQ1MkQtQjgyMS0zMEM3Q0FCMEVDNDR9Lmh0bWwmcXVvdDsKLSAgICBndWlkPSZxdW90O3syODAxNDYxNS1BNjJGLTQ1MkQtQjgyMS0zMEM3Q0FCMEVDNDR9JnF1b3Q7Jmd0O1VzZS1DYXNlIEFuYWx5c2lzJmx0Oy9hJmd0Oy4gUGVyZm9ybSBhbiBpbml0aWFsIHBhc3MgYXQgdGhlIGFyY2hpdGVjdHVyZSBpbiAmbHQ7YQotICAgIGNsYXNzPSZxdW90O2VsZW1lbnRMaW5rJnF1b3Q7IGhyZWY9JnF1b3Q7cmVzb3VyY2VzL2FyY2hpdGVjdHVyYWxfYW5hbHlzaXMsezhDQjQ4NDAyLUQ0QzUtNEUxNy1CQjMzLTUwNzMxNUNCMUJCRn0uaHRtbCZxdW90OwotICAgIGd1aWQ9JnF1b3Q7ezhDQjQ4NDAyLUQ0QzUtNEUxNy1CQjMzLTUwNzMxNUNCMUJCRn0mcXVvdDsmZ3Q7QXJjaGl0ZWN0dXJhbCBBbmFseXNpcyZsdDsvYSZndDssIHRoZW4gY2hvb3NlIGFyY2hpdGVjdHVyYWxseSBzaWduaWZpY2FudCB1c2UKLSAgICBjYXNlcywgcGVyZm9ybWluZyAmbHQ7YSBjbGFzcz0mcXVvdDtlbGVtZW50TGluayZxdW90OyBocmVmPSZxdW90O3Jlc291cmNlcy91c2VfY2FzZV9hbmFseXNpcyx7MjgwMTQ2MTUtQTYyRi00NTJELUI4MjEtMzBDN0NBQjBFQzQ0fS5odG1sJnF1b3Q7Ci0gICAgZ3VpZD0mcXVvdDt7MjgwMTQ2MTUtQTYyRi00NTJELUI4MjEtMzBDN0NBQjBFQzQ0fSZxdW90OyZndDtVc2UtQ2FzZSBBbmFseXNpcyZsdDsvYSZndDsgb24gZWFjaCBvbmUuIEFmdGVyIChvciBhcykgZWFjaCB1c2UgY2FzZSBpcwotICAgIGFuYWx5emVkLCB1cGRhdGUgdGhlIGFyY2hpdGVjdHVyZSBhcyBuZWVkZWQgdG8gcmVmbGVjdCBhZGFwdGF0aW9ucyByZXF1aXJlZCB0byBhY2NvbW1vZGF0ZSBuZXcgYmVoYXZpb3Igb2YgdGhlIHN5c3RlbQotICAgIGFuZCB0byBhZGRyZXNzIHBvdGVudGlhbCBhcmNoaXRlY3R1cmFsIHByb2JsZW1zIHdoaWNoIGFyZSBpZGVudGlmaWVkLgotJmx0Oy9wJmd0OwotJmx0O3AmZ3Q7Ci0gICAgV2hlcmUgdGhlIGFyY2hpdGVjdHVyZSBhbHJlYWR5IGV4aXN0cyAoZWl0aGVyIGZyb20gYSBwcmlvciBwcm9qZWN0IG9yIGl0ZXJhdGlvbiksIGNoYW5nZSByZXF1ZXN0cyBtYXkgbmVlZCB0byBiZQotICAgIGNyZWF0ZWQgdG8gY2hhbmdlIHRoZSBhcmNoaXRlY3R1cmUgdG8gYWNjb3VudCBmb3IgdGhlIG5ldyBiZWhhdmlvciB0aGUgc3lzdGVtIG11c3Qgc3VwcG9ydC4gVGhlc2UgY2hhbmdlcyBtYXkgYmUgdG8gYW55Ci0gICAgYXJ0aWZhY3QgaW4gdGhlIHByb2Nlc3MsIGRlcGVuZGluZyBvbiB0aGUgc2NvcGUgb2YgdGhlIGNoYW5nZS4KLSZsdDsvcCZndDsKLSZsdDticiAvJmd0OwotJmx0O2JyIC8mZ3Q7PC91c2FnZUd1aWRhbmNlPgotICAgIDxwdXJwb3NlPiZsdDtwJmd0OwotICAgIFB1cnBvc2U6IFRoaXMgaXRlcnRhaW9uIGlzIGNyZWF0ZWQgZm9yIHR3byBhY3Rpdml0aWVzLgotJmx0Oy9wJmd0OwotJmx0O3AmZ3Q7Ci0gICAgJmFtcDtuYnNwOyZsdDtpbWcgaGVpZ2h0PSZxdW90OzQ3NCZxdW90OyBhbHQ9JnF1b3Q7JnF1b3Q7IHNyYz0mcXVvdDtyZXNvdXJjZXMvcnVwX3BsYXRmb3JtLmpwZyZxdW90OyB3aWR0aD0mcXVvdDs1MDQmcXVvdDsgLyZndDsKLSZsdDsvcCZndDs8L3B1cnBvc2U+Ci0gICAgPGFsdGVybmF0aXZlcz4mbHQ7cCZndDsKLSAgICBBbHRlcm5hdGl2ZXM6Ci0mbHQ7L3AmZ3Q7Ci0mbHQ7b2wmZ3Q7Ci0gICAgJmx0O2xpJmd0OwotICAgICAgICAmbHQ7YSBocmVmPSZxdW90Oy4uL3JvbGVzL3JvbGVfQTEueG1pJnF1b3Q7IHRhcmdldD0mcXVvdDtfYmxhbmsmcXVvdDsmZ3Q7cm9sZV9BMS54bWkmbHQ7L2EmZ3Q7Ci0gICAgJmx0Oy9saSZndDsKLSAgICAmbHQ7bGkmZ3Q7Ci0gICAgICAgICZsdDthIGhyZWY9JnF1b3Q7Li4vdGFza3MvdGFza19BMi54bWkmcXVvdDsgdGFyZ2V0PSZxdW90O19ibGFuayZxdW90OyZndDt0YXNrX0EyLnhtaSZsdDsvYSZndDsKLSAgICAmbHQ7L2xpJmd0OwotJmx0Oy9vbCZndDs8L2FsdGVybmF0aXZlcz4KLSAgICA8aG93dG9TdGFmZj4mbHQ7cCZndDsKLSAgICBUaGVzZSBhY3Rpdml0aWVzIGFyZSBiZXN0IGNhcnJpZWQgb3V0IGJ5IGEgc21hbGwgdGVhbSBzdGFmZmVkIGJ5IGNyb3NzLWZ1bmN0aW9uYWwgdGVhbSBtZW1iZXJzLiBJc3N1ZXMgdGhhdCBhcmUKLSAgICB0eXBpY2FsbHkgYXJjaGl0ZWN0dXJhbGx5IHNpZ25pZmljYW50IGluY2x1ZGUgcGVyZm9ybWFuY2UsIHNjYWxpbmcsIHByb2Nlc3MgYW5kIHRocmVhZCBzeW5jaHJvbml6YXRpb24sIGFuZAotICAgIGRpc3RyaWJ1dGlvbi4gVGhlIHRlYW0gc2hvdWxkIGFsc28gaW5jbHVkZSBtZW1iZXJzIHdpdGggZG9tYWluIGV4cGVyaWVuY2Ugd2hvIGNhbiBpZGVudGlmeSBrZXkgYWJzdHJhY3Rpb25zLiBUaGUgdGVhbQotICAgIHNob3VsZCBhbHNvIGhhdmUgZXhwZXJpZW5jZSB3aXRoIG1vZGVsIG9yZ2FuaXphdGlvbiBhbmQgbGF5ZXJpbmcuIFRoZSB0ZWFtIHdpbGwgbmVlZCB0byBiZSBhYmxlIHRvIHB1bGwgYWxsIHRoZXNlCi0gICAgZGlzcGFyYXRlIHRocmVhZHMgaW50byBhIGNvaGVzaXZlLCBjb2hlcmVudCAoYWxiZWl0IHByZWxpbWluYXJ5KSBhcmNoaXRlY3R1cmUuCi0mbHQ7L3AmZ3Q7PC9ob3d0b1N0YWZmPgotICA8L29yZy5lY2xpcHNlLmVwZi51bWE6QWN0aXZpdHlEZXNjcmlwdGlvbj4KLSAgPG9yZy5lY2xpcHNlLmVwZi51bWE6RGVzY3JpcHRvckRlc2NyaXB0aW9uIHhtaTppZD0iLW5VSDB2b0Q3Um9LUWdQVDByYk93UVEiIG5hbWU9InRhc2tfQjIsX01jWUgwRHpsRWRxNXlzRk9OcjFCR1EiIGd1aWQ9Ii1uVUgwdm9EN1JvS1FnUFQwcmJPd1FRIj4KLSAgICA8a2V5Q29uc2lkZXJhdGlvbnM+Jmx0O3AmZ3Q7Ci0gICAga2V5IGNvbnNpZGVyYXRpb25zOgotJmx0Oy9wJmd0OwotJmx0O29sJmd0OwotICAgICZsdDtsaSZndDsKLSAgICAgICAgazEKLSAgICAmbHQ7L2xpJmd0OwotICAgICZsdDtsaSZndDsKLSAgICAgICAgazIKLSAgICAmbHQ7L2xpJmd0OwotICAgICZsdDtsaSZndDsKLSAgICAgICAgazMKLSAgICAmbHQ7L2xpJmd0OwotJmx0Oy9vbCZndDs8L2tleUNvbnNpZGVyYXRpb25zPgotICAgIDx1c2FnZUd1aWRhbmNlPiZsdDtwJmd0OwotICAgIHVzYWdlIGd1aWRhbmNlIGZvciB0YXNrX0IyCi0mbHQ7L3AmZ3Q7Ci0mbHQ7dGFibGUgY2VsbHNwYWNpbmc9JnF1b3Q7MiZxdW90OyBjZWxscGFkZGluZz0mcXVvdDsyJnF1b3Q7IHdpZHRoPSZxdW90OzE4MCZxdW90OyBib3JkZXI9JnF1b3Q7MSZxdW90OyZndDsKLSAgICAmbHQ7dGJvZHkmZ3Q7Ci0gICAgICAgICZsdDt0ciZndDsKLSAgICAgICAgICAgICZsdDt0ZCZndDsKLSAgICAgICAgICAgICZsdDsvdGQmZ3Q7Ci0gICAgICAgICZsdDsvdHImZ3Q7Ci0gICAgJmx0Oy90Ym9keSZndDsKLSZsdDsvdGFibGUmZ3Q7Ci0mbHQ7dGFibGUgY2VsbHNwYWNpbmc9JnF1b3Q7MiZxdW90OyBjZWxscGFkZGluZz0mcXVvdDsyJnF1b3Q7IHdpZHRoPSZxdW90OzE4MCZxdW90OyBib3JkZXI9JnF1b3Q7MSZxdW90OyZndDsKLSAgICAmbHQ7dGJvZHkmZ3Q7Ci0gICAgICAgICZsdDt0ciZndDsKLSAgICAgICAgICAgICZsdDt0aCBzY29wZT0mcXVvdDtjb2wmcXVvdDsmZ3Q7Ci0gICAgICAgICAgICAgICAgcjEKLSAgICAgICAgICAgICZsdDsvdGgmZ3Q7Ci0gICAgICAgICAgICAmbHQ7dGggc2NvcGU9JnF1b3Q7Y29sJnF1b3Q7Jmd0OwotICAgICAgICAgICAgICAgIGMyCi0gICAgICAgICAgICAmbHQ7L3RoJmd0OwotICAgICAgICAgICAgJmx0O3RoIHNjb3BlPSZxdW90O2NvbCZxdW90OyZndDsKLSAgICAgICAgICAgICAgICBjMwotICAgICAgICAgICAgJmx0Oy90aCZndDsKLSAgICAgICAgICAgICZsdDt0aCBzY29wZT0mcXVvdDtjb2wmcXVvdDsmZ3Q7Ci0gICAgICAgICAgICAgICAgYzQKLSAgICAgICAgICAgICZsdDsvdGgmZ3Q7Ci0gICAgICAgICZsdDsvdHImZ3Q7Ci0gICAgICAgICZsdDt0ciZndDsKLSAgICAgICAgICAgICZsdDt0aCBzY29wZT0mcXVvdDtyb3cmcXVvdDsmZ3Q7Ci0gICAgICAgICAgICAgICAgcjIKLSAgICAgICAgICAgICZsdDsvdGgmZ3Q7Ci0gICAgICAgICAgICAmbHQ7dGQmZ3Q7Ci0gICAgICAgICAgICAgICAgYXNkCi0gICAgICAgICAgICAmbHQ7L3RkJmd0OwotICAgICAgICAgICAgJmx0O3RkJmd0OwotICAgICAgICAgICAgICAgIGRzZgotICAgICAgICAgICAgJmx0Oy90ZCZndDsKLSAgICAgICAgICAgICZsdDt0ZCZndDsKLSAgICAgICAgICAgICAgICBkc2YKLSAgICAgICAgICAgICZsdDsvdGQmZ3Q7Ci0gICAgICAgICZsdDsvdHImZ3Q7Ci0gICAgICAgICZsdDt0ciZndDsKLSAgICAgICAgICAgICZsdDt0aCBzY29wZT0mcXVvdDtyb3cmcXVvdDsmZ3Q7Ci0gICAgICAgICAgICAgICAgcjMKLSAgICAgICAgICAgICZsdDsvdGgmZ3Q7Ci0gICAgICAgICAgICAmbHQ7dGQmZ3Q7Ci0gICAgICAgICAgICAgICAgJmx0O2ltZyBoZWlnaHQ9JnF1b3Q7MjgmcXVvdDsgYWx0PSZxdW90OyZxdW90OyBzcmM9JnF1b3Q7cmVzb3VyY2VzL2J1dHRvbnMuanBnJnF1b3Q7IHdpZHRoPSZxdW90OzMzNyZxdW90OyAvJmd0OyAKLSAgICAgICAgICAgICZsdDsvdGQmZ3Q7Ci0gICAgICAgICAgICAmbHQ7dGQmZ3Q7Ci0gICAgICAgICAgICAgICAgZHNmCi0gICAgICAgICAgICAmbHQ7L3RkJmd0OwotICAgICAgICAgICAgJmx0O3RkJmd0OwotICAgICAgICAgICAgJmx0Oy90ZCZndDsKLSAgICAgICAgJmx0Oy90ciZndDsKLSAgICAgICAgJmx0O3RyJmd0OwotICAgICAgICAgICAgJmx0O3RoIHNjb3BlPSZxdW90O3JvdyZxdW90OyZndDsKLSAgICAgICAgICAgICAgICByNAotICAgICAgICAgICAgJmx0Oy90aCZndDsKLSAgICAgICAgICAgICZsdDt0ZCZndDsKLSAgICAgICAgICAgICZsdDsvdGQmZ3Q7Ci0gICAgICAgICAgICAmbHQ7dGQmZ3Q7Ci0gICAgICAgICAgICAmbHQ7L3RkJmd0OwotICAgICAgICAgICAgJmx0O3RkJmd0OwotICAgICAgICAgICAgICAgIHNkZgotICAgICAgICAgICAgJmx0Oy90ZCZndDsKLSAgICAgICAgJmx0Oy90ciZndDsKLSAgICAgICAgJmx0O3RyJmd0OwotICAgICAgICAgICAgJmx0O3RoIHNjb3BlPSZxdW90O3JvdyZxdW90OyZndDsKLSAgICAgICAgICAgICAgICByNQotICAgICAgICAgICAgJmx0Oy90aCZndDsKLSAgICAgICAgICAgICZsdDt0ZCZndDsKLSAgICAgICAgICAgICAgICBkYWYKLSAgICAgICAgICAgICZsdDsvdGQmZ3Q7Ci0gICAgICAgICAgICAmbHQ7dGQmZ3Q7Ci0gICAgICAgICAgICAgICAgc2RmCi0gICAgICAgICAgICAmbHQ7L3RkJmd0OwotICAgICAgICAgICAgJmx0O3RkJmd0OwotICAgICAgICAgICAgICAgICZsdDtpbWcgaGVpZ2h0PSZxdW90OzEyJnF1b3Q7IGFsdD0mcXVvdDsmcXVvdDsgc3JjPSZxdW90O3Jlc291cmNlcy9idWxsZXQxLmdpZiZxdW90OyB3aWR0aD0mcXVvdDsxMiZxdW90OyAvJmd0OyAKLSAgICAgICAgICAgICZsdDsvdGQmZ3Q7Ci0gICAgICAgICZsdDsvdHImZ3Q7Ci0gICAgJmx0Oy90Ym9keSZndDsKLSZsdDsvdGFibGUmZ3Q7Ci0mbHQ7YnIgLyZndDsKLSZsdDticiAvJmd0OwotJmx0O2JyIC8mZ3Q7Ci0mbHQ7YnIgLyZndDs8L3VzYWdlR3VpZGFuY2U+Ci0gICAgPHJlZmluZWREZXNjcmlwdGlvbj4mbHQ7cCZndDsKLSAgICAmbHQ7YSBocmVmPSZxdW90O3Jlc291cmNlcy9wYXBlcnMuaHRtJnF1b3Q7IHRhcmdldD0mcXVvdDtfYmxhbmsmcXVvdDsmZ3Q7cGFwZXJzLmh0bSZsdDsvYSZndDsKLSZsdDsvcCZndDsKLSZsdDtwJmd0OwotICAgIHJlZmluZWQgZGVzY3JpcHRpb246Ci0mbHQ7L3AmZ3Q7PC9yZWZpbmVkRGVzY3JpcHRpb24+Ci0gIDwvb3JnLmVjbGlwc2UuZXBmLnVtYTpEZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci0gIDxvcmcuZWNsaXBzZS5lcGYudW1hOkRlc2NyaXB0b3JEZXNjcmlwdGlvbiB4bWk6aWQ9Ii1hREU0eUZ6RV9tX24yUEl6Y090NHJBIiBuYW1lPSJ0YXNrX0EyLF9KQ3JCRUR6bEVkcTV5c0ZPTnIxQkdRIiBndWlkPSItYURFNHlGekVfbV9uMlBJemNPdDRyQSI+Ci0gICAgPGtleUNvbnNpZGVyYXRpb25zPiZsdDtwJmd0OwotICAgIGtleXM6Ci0mbHQ7L3AmZ3Q7Ci0mbHQ7b2wmZ3Q7Ci0gICAgJmx0O2xpJmd0OwotICAgICAgICBrazEKLSAgICAmbHQ7L2xpJmd0OwotICAgICZsdDtsaSZndDsKLSAgICAgICAga2syCi0gICAgJmx0Oy9saSZndDsKLSAgICAmbHQ7bGkmZ3Q7Ci0gICAgICAgIGtrMwotICAgICZsdDsvbGkmZ3Q7Ci0mbHQ7L29sJmd0Ozwva2V5Q29uc2lkZXJhdGlvbnM+Ci0gICAgPHVzYWdlR3VpZGFuY2U+Jmx0O3AmZ3Q7Ci0gICAgdXNhZ2UgZ3VpZGFuY2UgZm9yIHRhc2tfQjIKLSZsdDsvcCZndDsKLSZsdDt0YWJsZSBjZWxsc3BhY2luZz0mcXVvdDsyJnF1b3Q7IGNlbGxwYWRkaW5nPSZxdW90OzImcXVvdDsgd2lkdGg9JnF1b3Q7MTgwJnF1b3Q7IGJvcmRlcj0mcXVvdDsxJnF1b3Q7Jmd0OwotICAgICZsdDt0Ym9keSZndDsKLSAgICAgICAgJmx0O3RyJmd0OwotICAgICAgICAgICAgJmx0O3RoIHNjb3BlPSZxdW90O2NvbCZxdW90OyZndDsKLSAgICAgICAgICAgICAgICByMQotICAgICAgICAgICAgJmx0Oy90aCZndDsKLSAgICAgICAgICAgICZsdDt0aCBzY29wZT0mcXVvdDtjb2wmcXVvdDsmZ3Q7Ci0gICAgICAgICAgICAgICAgYzIKLSAgICAgICAgICAgICZsdDsvdGgmZ3Q7Ci0gICAgICAgICAgICAmbHQ7dGggc2NvcGU9JnF1b3Q7Y29sJnF1b3Q7Jmd0OwotICAgICAgICAgICAgICAgIGMzCi0gICAgICAgICAgICAmbHQ7L3RoJmd0OwotICAgICAgICAgICAgJmx0O3RoIHNjb3BlPSZxdW90O2NvbCZxdW90OyZndDsKLSAgICAgICAgICAgICAgICBjNAotICAgICAgICAgICAgJmx0Oy90aCZndDsKLSAgICAgICAgJmx0Oy90ciZndDsKLSAgICAgICAgJmx0O3RyJmd0OwotICAgICAgICAgICAgJmx0O3RoIHNjb3BlPSZxdW90O3JvdyZxdW90OyZndDsKLSAgICAgICAgICAgICAgICByMgotICAgICAgICAgICAgJmx0Oy90aCZndDsKLSAgICAgICAgICAgICZsdDt0ZCZndDsKLSAgICAgICAgICAgICAgICBhc2QKLSAgICAgICAgICAgICZsdDsvdGQmZ3Q7Ci0gICAgICAgICAgICAmbHQ7dGQmZ3Q7Ci0gICAgICAgICAgICAgICAgZHNmCi0gICAgICAgICAgICAmbHQ7L3RkJmd0OwotICAgICAgICAgICAgJmx0O3RkJmd0OwotICAgICAgICAgICAgICAgIGRzZgotICAgICAgICAgICAgJmx0Oy90ZCZndDsKLSAgICAgICAgJmx0Oy90ciZndDsKLSAgICAgICAgJmx0O3RyJmd0OwotICAgICAgICAgICAgJmx0O3RoIHNjb3BlPSZxdW90O3JvdyZxdW90OyZndDsKLSAgICAgICAgICAgICAgICByMwotICAgICAgICAgICAgJmx0Oy90aCZndDsKLSAgICAgICAgICAgICZsdDt0ZCZndDsKLSAgICAgICAgICAgICAgICAmbHQ7aW1nIGhlaWdodD0mcXVvdDsyOCZxdW90OyBhbHQ9JnF1b3Q7JnF1b3Q7IHNyYz0mcXVvdDtyZXNvdXJjZXMvYnV0dG9ucy5qcGcmcXVvdDsgd2lkdGg9JnF1b3Q7MzM3JnF1b3Q7IC8mZ3Q7IAotICAgICAgICAgICAgJmx0Oy90ZCZndDsKLSAgICAgICAgICAgICZsdDt0ZCZndDsKLSAgICAgICAgICAgICAgICBkc2YKLSAgICAgICAgICAgICZsdDsvdGQmZ3Q7Ci0gICAgICAgICAgICAmbHQ7dGQmZ3Q7Ci0gICAgICAgICAgICAmbHQ7L3RkJmd0OwotICAgICAgICAmbHQ7L3RyJmd0OwotICAgICAgICAmbHQ7dHImZ3Q7Ci0gICAgICAgICAgICAmbHQ7dGggc2NvcGU9JnF1b3Q7cm93JnF1b3Q7Jmd0OwotICAgICAgICAgICAgICAgIHI0Ci0gICAgICAgICAgICAmbHQ7L3RoJmd0OwotICAgICAgICAgICAgJmx0O3RkJmd0OwotICAgICAgICAgICAgJmx0Oy90ZCZndDsKLSAgICAgICAgICAgICZsdDt0ZCZndDsKLSAgICAgICAgICAgICZsdDsvdGQmZ3Q7Ci0gICAgICAgICAgICAmbHQ7dGQmZ3Q7Ci0gICAgICAgICAgICAgICAgc2RmCi0gICAgICAgICAgICAmbHQ7L3RkJmd0OwotICAgICAgICAmbHQ7L3RyJmd0OwotICAgICAgICAmbHQ7dHImZ3Q7Ci0gICAgICAgICAgICAmbHQ7dGggc2NvcGU9JnF1b3Q7cm93JnF1b3Q7Jmd0OwotICAgICAgICAgICAgICAgIHI1Ci0gICAgICAgICAgICAmbHQ7L3RoJmd0OwotICAgICAgICAgICAgJmx0O3RkJmd0OwotICAgICAgICAgICAgICAgIGRhZgotICAgICAgICAgICAgJmx0Oy90ZCZndDsKLSAgICAgICAgICAgICZsdDt0ZCZndDsKLSAgICAgICAgICAgICAgICBzZGYKLSAgICAgICAgICAgICZsdDsvdGQmZ3Q7Ci0gICAgICAgICAgICAmbHQ7dGQmZ3Q7Ci0gICAgICAgICAgICAgICAgJmx0O2ltZyBoZWlnaHQ9JnF1b3Q7MTImcXVvdDsgYWx0PSZxdW90OyZxdW90OyBzcmM9JnF1b3Q7cmVzb3VyY2VzL2J1bGxldDEuZ2lmJnF1b3Q7IHdpZHRoPSZxdW90OzEyJnF1b3Q7IC8mZ3Q7IAotICAgICAgICAgICAgJmx0Oy90ZCZndDsKLSAgICAgICAgJmx0Oy90ciZndDsKLSAgICAmbHQ7L3Rib2R5Jmd0OwotJmx0Oy90YWJsZSZndDsKLSZsdDticiAvJmd0OwotJmx0O2JyIC8mZ3Q7Ci0mbHQ7YnIgLyZndDsKLSZsdDticiAvJmd0OzwvdXNhZ2VHdWlkYW5jZT4KLSAgICA8cmVmaW5lZERlc2NyaXB0aW9uPlRhc2sgQTIncyByZWZpbmVkIGRlc2NyaXB0aW9uPC9yZWZpbmVkRGVzY3JpcHRpb24+Ci0gIDwvb3JnLmVjbGlwc2UuZXBmLnVtYTpEZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci0gIDxvcmcuZWNsaXBzZS5lcGYudW1hOkRlc2NyaXB0b3JEZXNjcmlwdGlvbiB4bWk6aWQ9Ii01dDhHdG9MNElCb3hmYXpCSV8wY3JBIiBuYW1lPSJ3cERlc2MxLF9TVUdRZ0R6aUVkcTV5c0ZPTnIxQkdRIiBndWlkPSItNXQ4R3RvTDRJQm94ZmF6QklfMGNyQSI+Ci0gICAgPGtleUNvbnNpZGVyYXRpb25zPmtleTp3cERlc2MxPC9rZXlDb25zaWRlcmF0aW9ucz4KLSAgICA8dXNhZ2VHdWlkYW5jZT51c2FnZTp3cERlc2MxPC91c2FnZUd1aWRhbmNlPgotICAgIDxyZWZpbmVkRGVzY3JpcHRpb24+Jmx0O3AmZ3Q7Ci0gICAgcmVmaW5lZDogd3BEZXNjMQotJmx0Oy9wJmd0OzwvcmVmaW5lZERlc2NyaXB0aW9uPgotICA8L29yZy5lY2xpcHNlLmVwZi51bWE6RGVzY3JpcHRvckRlc2NyaXB0aW9uPgotICA8b3JnLmVjbGlwc2UuZXBmLnVtYTpEZXNjcmlwdG9yRGVzY3JpcHRpb24geG1pOmlkPSItaWZtUU5CNXkxUlpLRjFIcm0zQ2RSQSIgbmFtZT0idGFzayBhc3NvY2lhdGVkIHRvIHRhc2tBMSxfRnJ0TW9EemlFZHE1eXNGT05yMUJHUSIgZ3VpZD0iLWlmbVFOQjV5MVJaS0YxSHJtM0NkUkEiPgotICAgIDxrZXlDb25zaWRlcmF0aW9ucz4mbHQ7cCZndDsKLSAgICBrZXlzOgotJmx0Oy9wJmd0OwotJmx0O3AmZ3Q7Ci0gICAga2V5MSxrZXkyCi0mbHQ7L3AmZ3Q7PC9rZXlDb25zaWRlcmF0aW9ucz4KLSAgICA8dXNhZ2VHdWlkYW5jZT4mbHQ7cCZndDsKLSAgICB1c2FnZToKLSZsdDsvcCZndDsKLSZsdDtwJmd0OwotICAgIFRoZSB3b3JrIGlzIGJlc3QgZG9uZSBpbiBzZXZlcmFsIHNlc3Npb25zLCBwZXJoYXBzIHBlcmZvcm1lZCBvdmVyIGEgZmV3IGRheXMgKG9yIHdlZWtzIGFuZCBtb250aHMgZm9yIHZlcnkgbGFyZ2UKLSAgICBzeXN0ZW1zKS4gVGhlIGluaXRpYWwgZm9jdXMgd2lsbCBiZSBvbiB0aGUgYWN0aXZpdGllcyAmbHQ7YSBjbGFzcz0mcXVvdDtlbGVtZW50TGluayZxdW90OwotICAgIGhyZWY9JnF1b3Q7cmVzb3VyY2VzL2lkZW50aWZ5X2Rlc2lnbl9tZWNoYW5pc21zLHtDN0EyNkJENy0zODIwLTQ4RDktODMwRi02ODRDM0FGMTU1Rjl9Lmh0bWwmcXVvdDsKLSAgICBndWlkPSZxdW90O3tDN0EyNkJENy0zODIwLTQ4RDktODMwRi02ODRDM0FGMTU1Rjl9JnF1b3Q7Jmd0O0lkZW50aWZ5IERlc2lnbiBNZWNoYW5pc21zJmx0Oy9hJmd0OyBhbmQgJmx0O2EgY2xhc3M9JnF1b3Q7ZWxlbWVudExpbmsmcXVvdDsKLSAgICBocmVmPSZxdW90O3Jlc291cmNlcy9pZGVudGlmeV9kZXNpZ25fZWxlbWVudHNfcmVhbC10aW1lX2Rlc2lnbix7NTg2OTYzRDAtNjA3RC00RUMyLThENTMtMjkyREFGQUI5QzkyfS5odG1sJnF1b3Q7Ci0gICAgZ3VpZD0mcXVvdDt7NTg2OTYzRDAtNjA3RC00RUMyLThENTMtMjkyREFGQUI5QzkyfSZxdW90OyZndDtpZGVudGlmeV9kZXNpZ25fZWxlbWVudHNfcmVhbC10aW1lX2Rlc2lnbiZsdDsvYSZndDssIHdpdGggYSBncmVhdCBkZWFsIG9mCi0gICAgaXRlcmF0aW9uIHdpdGggdGhlICZsdDthIGNsYXNzPSZxdW90O2VsZW1lbnRMaW5rJnF1b3Q7Ci0gICAgaHJlZj0mcXVvdDtyZXNvdXJjZXMvaW5jb3Jwb3JhdGVfZGVzaWduX2VsZW1lbnRzLHs1QzY0NzE3My00RTMyLTQ1OTQtOTZBOS0yNTQ4QjQ3NzIyRkF9Lmh0bWwmcXVvdDsKLSAgICBndWlkPSZxdW90O3s1QzY0NzE3My00RTMyLTQ1OTQtOTZBOS0yNTQ4QjQ3NzIyRkF9JnF1b3Q7Jmd0O0luY29ycG9yYXRlIEV4aXN0aW5nIERlc2lnbiBFbGVtZW50cyZsdDsvYSZndDsgYWN0aXZpdHkgdG8gbWFrZSBzdXJlIHRoYXQgbmV3Ci0gICAgZWxlbWVudHMgZG8gbm90IGR1cGxpY2F0ZSBmdW5jdGlvbmFsaXR5IG9mIGV4aXN0aW5nIGVsZW1lbnRzLgotJmx0Oy9wJmd0OwotJmx0O3AmZ3Q7Ci0gICAgQXMgdGhlIGRlc2lnbiBlbWVyZ2VzLCBjb25jdXJyZW5jeSBhbmQgZGlzdHJpYnV0aW9uIGlzc3VlcyBhcmUgaW50cm9kdWNlZCBpbiB0aGUgYWN0aXZpdGllcyAmbHQ7YSBjbGFzcz0mcXVvdDtlbGVtZW50TGluayZxdW90OwotICAgIGhyZWY9JnF1b3Q7cmVzb3VyY2VzL2Rlc2NyaWJlX3J1bnRpbWVfYXJjaGl0ZWN0dXJlLHs0RDM1QzAzOC1BMkQwLTQ4QjgtOUVDRC01MjcxN0ZFQUUzM0F9Lmh0bWwmcXVvdDsKLSAgICBndWlkPSZxdW90O3s0RDM1QzAzOC1BMkQwLTQ4QjgtOUVDRC01MjcxN0ZFQUUzM0F9JnF1b3Q7Jmd0O0Rlc2NyaWJlIHRoZSBSdW4tdGltZSBBcmNoaXRlY3R1cmUmbHQ7L2EmZ3Q7IGFuZCAmbHQ7YSBjbGFzcz0mcXVvdDtlbGVtZW50TGluayZxdW90OwotICAgIGhyZWY9JnF1b3Q7cmVzb3VyY2VzL2Rlc2NyaWJlX2Rpc3RyaWJ1dGlvbix7NkExMTI4MDgtMEE5MC00MjdBLUJBQjktRTE0RjNGQkY3MkI1fS5odG1sJnF1b3Q7Ci0gICAgZ3VpZD0mcXVvdDt7NkExMTI4MDgtMEE5MC00MjdBLUJBQjktRTE0RjNGQkY3MkI1fSZxdW90OyZndDtEZXNjcmliZSBEaXN0cmlidXRpb24mbHQ7L2EmZ3Q7LCByZXNwZWN0aXZlbHkuIEFzIHRoZXNlIGlzc3VlcyBhcmUgY29uc2lkZXJlZCwKLSAgICBjaGFuZ2VzIHRvIGRlc2lnbiBlbGVtZW50cyBtYXkgYmUgcmVxdWlyZWQgdG8gc3BsaXQgYmVoYXZpb3IgYWNyb3NzIHByb2Nlc3NlcywgdGhyZWFkcyBvciBub2Rlcy4KLSZsdDsvcCZndDsKLSZsdDtwJmd0OwotICAgIEFzIHRoZSBpbmRpdmlkdWFsIG1vZGVscyBhcmUgcmVmaW5lZCB0byBpbmNvcnBvcmF0ZSB0aGUgYXJjaGl0ZWN0dXJhbCBkZWNpc2lvbnMsIHRoZSByZXN1bHRzIGFyZSBkb2N1bWVudGVkIGluCi0gICAgcmVzcGVjdGl2ZSB2aWV3IHNlY3Rpb25zIGluIHRoZSBTb2Z0d2FyZSBBcmNoaXRlY3R1cmUgRG9jdW1lbnQgKGUuZy4sIGFzIHRoZSBEZXNpZ24gTW9kZWwgaXMgcmVmaW5lZCwgdGhlIExvZ2ljYWwgVmlldwotICAgIG9mIHRoZSBTb2Z0d2FyZSBBcmNoaXRlY3R1cmUgRG9jdW1lbnQgaXMgcmVmaW5lZCwgYXMgd2VsbCkuIFRoZSByZXN1bHRpbmcgYXJjaGl0ZWN0dXJlIGlzIHJldmlld2VkLgotJmx0Oy9wJmd0OwotJmx0O3AmZ3Q7Ci0gICAgJmx0O2JyIC8mZ3Q7Ci0gICAgJmx0O2JyIC8mZ3Q7Ci0gICAgJmFtcDtuYnNwOwotJmx0Oy9wJmd0OzwvdXNhZ2VHdWlkYW5jZT4KLSAgICA8cmVmaW5lZERlc2NyaXB0aW9uPiZsdDtwJmd0OwotICAgIHJlZmluZWQgZGVzY3JpcHRpb24KLSZsdDsvcCZndDsKLSZsdDtwJmd0OwotICAgICZsdDtpbWcgaGVpZ2h0PSZxdW90OzE2JnF1b3Q7IGFsdD0mcXVvdDsmcXVvdDsgc3JjPSZxdW90O3Jlc291cmNlcy9oZWxwYm9vay5naWYmcXVvdDsgd2lkdGg9JnF1b3Q7MTYmcXVvdDsgLyZndDsKLSZsdDsvcCZndDsKLSZsdDtwJmd0OwotICAgICZsdDthIGhyZWY9JnF1b3Q7cmVzb3VyY2VzL3BhcGVycy5odG0mcXVvdDsgdGFyZ2V0PSZxdW90O19ibGFuayZxdW90OyZndDtwYXBlcnMuaHRtJmx0Oy9hJmd0OwotJmx0Oy9wJmd0OzwvcmVmaW5lZERlc2NyaXB0aW9uPgotICA8L29yZy5lY2xpcHNlLmVwZi51bWE6RGVzY3JpcHRvckRlc2NyaXB0aW9uPgotICA8b3JnLmVjbGlwc2UuZXBmLnVtYTpEZXNjcmlwdG9yRGVzY3JpcHRpb24geG1pOmlkPSItcE84TGVjZUdYaktlYXB1TG9GZmt4QSIgbmFtZT0icm9sZURlc2MxLF9QMXNVWUR6aUVkcTV5c0ZPTnIxQkdRIiBndWlkPSItcE84TGVjZUdYaktlYXB1TG9GZmt4QSI+Ci0gICAgPGtleUNvbnNpZGVyYXRpb25zPiZsdDtwJmd0OwotICAgIGtleSBjb25zaWRlcmF0aW9uczoKLSZsdDsvcCZndDsKLSZsdDtwJmd0OwotICAgIGtleTEKLSZsdDsvcCZndDsKLSZsdDtwJmd0OwotICAgIGtleTIKLSZsdDsvcCZndDs8L2tleUNvbnNpZGVyYXRpb25zPgotICAgIDx1c2FnZUd1aWRhbmNlPiZsdDtwJmd0OwotICAgICZsdDtpbWcgaGVpZ2h0PSZxdW90OzQ3NCZxdW90OyBhbHQ9JnF1b3Q7JnF1b3Q7IHNyYz0mcXVvdDtyZXNvdXJjZXMvcnVwX3BsYXRmb3JtLmpwZyZxdW90OyB3aWR0aD0mcXVvdDs1MDQmcXVvdDsgLyZndDt1c2FnZSBmb3Igcm9sZUExJmFtcDtuYnNwOwotJmx0Oy9wJmd0OzwvdXNhZ2VHdWlkYW5jZT4KLSAgICA8cmVmaW5lZERlc2NyaXB0aW9uPnJlZmluZWQgZGVzY3JpcHRpb24gZm9yIHJvbGVEZXNjMTwvcmVmaW5lZERlc2NyaXB0aW9uPgotICA8L29yZy5lY2xpcHNlLmVwZi51bWE6RGVzY3JpcHRvckRlc2NyaXB0aW9uPgotICA8b3JnLmVjbGlwc2UuZXBmLnVtYTpEZXNjcmlwdG9yRGVzY3JpcHRpb24geG1pOmlkPSItX1RoLWp2NWptMGgwZjBtRmhLdHFnUSIgbmFtZT0icm9sZURlc2MyLF9ROTlrQUR6aUVkcTV5c0ZPTnIxQkdRIiBndWlkPSItX1RoLWp2NWptMGgwZjBtRmhLdHFnUSI+Ci0gICAgPGtleUNvbnNpZGVyYXRpb25zPmtleSBjb25zaWRlcmF0aW9uIGZvciByb2xlQTI8L2tleUNvbnNpZGVyYXRpb25zPgotICAgIDx1c2FnZUd1aWRhbmNlPiZsdDtwJmd0OwotICAgICZsdDtpbWcgaGVpZ2h0PSZxdW90OzEyJnF1b3Q7IGFsdD0mcXVvdDsmcXVvdDsgc3JjPSZxdW90O3Jlc291cmNlcy9idWxsZXQxLmdpZiZxdW90OyB3aWR0aD0mcXVvdDsxMiZxdW90OyAvJmd0OwotJmx0Oy9wJmd0OwotJmx0O3AmZ3Q7Ci0gICAgdXNhZ2UgZ3VpZGFuY2UgZm9yIHJvbGVBMgotJmx0Oy9wJmd0OzwvdXNhZ2VHdWlkYW5jZT4KLSAgICA8cmVmaW5lZERlc2NyaXB0aW9uPiZsdDtwJmd0OwotICAgIHJlZmluZWQgZGVzY3JpcHRpb24gZm9yIHJvbGVBMgotJmx0Oy9wJmd0OwotJmx0O3AmZ3Q7Ci0mbHQ7L3AmZ3Q7Ci0mbHQ7cCZndDsKLSAgICByZWZpbmVkIGRlc2NyaXB0aW9uIGZvciByb2xlQTIKLSZsdDsvcCZndDs8L3JlZmluZWREZXNjcmlwdGlvbj4KLSAgPC9vcmcuZWNsaXBzZS5lcGYudW1hOkRlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLSAgPG9yZy5lY2xpcHNlLmVwZi51bWE6RGVzY3JpcHRvckRlc2NyaXB0aW9uIHhtaTppZD0iLUJrdjZWVGRNcGc0YkQwWWtmSFo0ZGciIG5hbWU9InRhc2sgYXNzb2NpYXRlZCB0byB0YXNrQTIsX0x3TFFnRHppRWRxNXlzRk9OcjFCR1EiIGd1aWQ9Ii1Ca3Y2VlRkTXBnNGJEMFlrZkhaNGRnIj4KLSAgICA8a2V5Q29uc2lkZXJhdGlvbnM+a2V5czogdGFzayBhc3NvY2lhdGVkIHRvIHRhc2tBMjwva2V5Q29uc2lkZXJhdGlvbnM+Ci0gICAgPHVzYWdlR3VpZGFuY2U+dXNhZ2U6dGFzayBhc3NvY2lhdGVkIHRvIHRhc2tBMjwvdXNhZ2VHdWlkYW5jZT4KLSAgICA8cmVmaW5lZERlc2NyaXB0aW9uPiZsdDtwJmd0OwotICAgIHJlZmluZWQ6dGFzayBhc3NvY2lhdGVkIHRvIHRhc2tBMgotJmx0Oy9wJmd0OwotJmx0O3RhYmxlIGNlbGxzcGFjaW5nPSZxdW90OzImcXVvdDsgY2VsbHBhZGRpbmc9JnF1b3Q7MiZxdW90OyB3aWR0aD0mcXVvdDsxODAmcXVvdDsgYm9yZGVyPSZxdW90OzEmcXVvdDsmZ3Q7Ci0gICAgJmx0O3Rib2R5Jmd0OwotICAgICAgICAmbHQ7dHImZ3Q7Ci0gICAgICAgICAgICAmbHQ7dGggc2NvcGU9JnF1b3Q7Y29sJnF1b3Q7Jmd0OwotICAgICAgICAgICAgICAgIDEKLSAgICAgICAgICAgICZsdDsvdGgmZ3Q7Ci0gICAgICAgICAgICAmbHQ7dGggc2NvcGU9JnF1b3Q7Y29sJnF1b3Q7Jmd0OwotICAgICAgICAgICAgICAgIHoKLSAgICAgICAgICAgICZsdDsvdGgmZ3Q7Ci0gICAgICAgICAgICAmbHQ7dGggc2NvcGU9JnF1b3Q7Y29sJnF1b3Q7Jmd0OwotICAgICAgICAgICAgICAgIHoKLSAgICAgICAgICAgICZsdDsvdGgmZ3Q7Ci0gICAgICAgICAgICAmbHQ7dGggc2NvcGU9JnF1b3Q7Y29sJnF1b3Q7Jmd0OwotICAgICAgICAgICAgICAgIHoKLSAgICAgICAgICAgICZsdDsvdGgmZ3Q7Ci0gICAgICAgICAgICAmbHQ7dGggc2NvcGU9JnF1b3Q7Y29sJnF1b3Q7Jmd0OwotICAgICAgICAgICAgICAgIHoKLSAgICAgICAgICAgICZsdDsvdGgmZ3Q7Ci0gICAgICAgICAgICAmbHQ7dGggc2NvcGU9JnF1b3Q7Y29sJnF1b3Q7Jmd0OwotICAgICAgICAgICAgICAgIHoKLSAgICAgICAgICAgICZsdDsvdGgmZ3Q7Ci0gICAgICAgICZsdDsvdHImZ3Q7Ci0gICAgICAgICZsdDt0ciZndDsKLSAgICAgICAgICAgICZsdDt0ZCZndDsKLSAgICAgICAgICAgICAgICB6Ci0gICAgICAgICAgICAmbHQ7L3RkJmd0OwotICAgICAgICAgICAgJmx0O3RkJmd0OwotICAgICAgICAgICAgICAgIDIKLSAgICAgICAgICAgICZsdDsvdGQmZ3Q7Ci0gICAgICAgICAgICAmbHQ7dGQmZ3Q7Ci0gICAgICAgICAgICAmbHQ7L3RkJmd0OwotICAgICAgICAgICAgJmx0O3RkJmd0OwotICAgICAgICAgICAgJmx0Oy90ZCZndDsKLSAgICAgICAgICAgICZsdDt0ZCZndDsKLSAgICAgICAgICAgICZsdDsvdGQmZ3Q7Ci0gICAgICAgICAgICAmbHQ7dGQmZ3Q7Ci0gICAgICAgICAgICAmbHQ7L3RkJmd0OwotICAgICAgICAmbHQ7L3RyJmd0OwotICAgICAgICAmbHQ7dHImZ3Q7Ci0gICAgICAgICAgICAmbHQ7dGQmZ3Q7Ci0gICAgICAgICAgICAgICAgegotICAgICAgICAgICAgJmx0Oy90ZCZndDsKLSAgICAgICAgICAgICZsdDt0ZCZndDsKLSAgICAgICAgICAgICZsdDsvdGQmZ3Q7Ci0gICAgICAgICAgICAmbHQ7dGQmZ3Q7Ci0gICAgICAgICAgICAgICAgMwotICAgICAgICAgICAgJmx0Oy90ZCZndDsKLSAgICAgICAgICAgICZsdDt0ZCZndDsKLSAgICAgICAgICAgICZsdDsvdGQmZ3Q7Ci0gICAgICAgICAgICAmbHQ7dGQmZ3Q7Ci0gICAgICAgICAgICAmbHQ7L3RkJmd0OwotICAgICAgICAgICAgJmx0O3RkJmd0OwotICAgICAgICAgICAgJmx0Oy90ZCZndDsKLSAgICAgICAgJmx0Oy90ciZndDsKLSAgICAgICAgJmx0O3RyJmd0OwotICAgICAgICAgICAgJmx0O3RkJmd0OwotICAgICAgICAgICAgICAgIHoKLSAgICAgICAgICAgICZsdDsvdGQmZ3Q7Ci0gICAgICAgICAgICAmbHQ7dGQmZ3Q7Ci0gICAgICAgICAgICAmbHQ7L3RkJmd0OwotICAgICAgICAgICAgJmx0O3RkJmd0OwotICAgICAgICAgICAgJmx0Oy90ZCZndDsKLSAgICAgICAgICAgICZsdDt0ZCZndDsKLSAgICAgICAgICAgICAgICA0Ci0gICAgICAgICAgICAmbHQ7L3RkJmd0OwotICAgICAgICAgICAgJmx0O3RkJmd0OwotICAgICAgICAgICAgJmx0Oy90ZCZndDsKLSAgICAgICAgICAgICZsdDt0ZCZndDsKLSAgICAgICAgICAgICZsdDsvdGQmZ3Q7Ci0gICAgICAgICZsdDsvdHImZ3Q7Ci0gICAgICAgICZsdDt0ciZndDsKLSAgICAgICAgICAgICZsdDt0ZCZndDsKLSAgICAgICAgICAgICAgICB6Ci0gICAgICAgICAgICAmbHQ7L3RkJmd0OwotICAgICAgICAgICAgJmx0O3RkJmd0OwotICAgICAgICAgICAgJmx0Oy90ZCZndDsKLSAgICAgICAgICAgICZsdDt0ZCZndDsKLSAgICAgICAgICAgICZsdDsvdGQmZ3Q7Ci0gICAgICAgICAgICAmbHQ7dGQmZ3Q7Ci0gICAgICAgICAgICAmbHQ7L3RkJmd0OwotICAgICAgICAgICAgJmx0O3RkJmd0OwotICAgICAgICAgICAgICAgIDUKLSAgICAgICAgICAgICZsdDsvdGQmZ3Q7Ci0gICAgICAgICAgICAmbHQ7dGQmZ3Q7Ci0gICAgICAgICAgICAmbHQ7L3RkJmd0OwotICAgICAgICAmbHQ7L3RyJmd0OwotICAgICZsdDsvdGJvZHkmZ3Q7Ci0mbHQ7L3RhYmxlJmd0OzwvcmVmaW5lZERlc2NyaXB0aW9uPgotICA8L29yZy5lY2xpcHNlLmVwZi51bWE6RGVzY3JpcHRvckRlc2NyaXB0aW9uPgotICA8b3JnLmVjbGlwc2UuZXBmLnVtYTpEZXNjcmlwdG9yRGVzY3JpcHRpb24geG1pOmlkPSItVFJ4aHhBczF4T0tOUnJGQ0VQcEFsdyIgbmFtZT0idGFzayB3aXRoIG5vIGxpbmtzLF81akpZQUR6a0VkcTV5c0ZPTnIxQkdRIiBndWlkPSItVFJ4aHhBczF4T0tOUnJGQ0VQcEFsdyI+Ci0gICAgPGtleUNvbnNpZGVyYXRpb25zPmtleTp0YXNrIHdpdGggbm8gbGlua3M8L2tleUNvbnNpZGVyYXRpb25zPgotICAgIDx1c2FnZUd1aWRhbmNlPnVzYWdlOnRhc2sgd2l0aCBubyBsaW5rczwvdXNhZ2VHdWlkYW5jZT4KLSAgICA8cmVmaW5lZERlc2NyaXB0aW9uPiZsdDtwJmd0OwotICAgIHJlZmluZWQ6dGFzayB3aXRoIG5vIGxpbmtzCi0mbHQ7L3AmZ3Q7PC9yZWZpbmVkRGVzY3JpcHRpb24+Ci0gIDwvb3JnLmVjbGlwc2UuZXBmLnVtYTpEZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci0gIDxvcmcuZWNsaXBzZS5lcGYudW1hOkFjdGl2aXR5RGVzY3JpcHRpb24geG1pOmlkPSItQWR3QWpuNXZSQ25FUVFMVWFZSjFkdyIgbmFtZT0iQWN0aXZpdHkyLF9CUzZnRVR6bEVkcTV5c0ZPTnIxQkdRIiBndWlkPSItQWR3QWpuNXZSQ25FUVFMVWFZSjFkdyI+Ci0gICAgPG1haW5EZXNjcmlwdGlvbj4mbHQ7cCZndDsKLSAgICBUaGlzIFdvcmtmbG93IERldGFpbDoKLSZsdDsvcCZndDsKLSZsdDt1bCZndDsKLSAgICAmbHQ7bGkmZ3Q7Ci0gICAgICAgIFByb3ZpZGVzIHRoZSBuYXR1cmFsICZsdDtiJmd0O3RyYW5zaXRpb24gZnJvbSBhbmFseXNpcyZsdDsvYiZndDsgYWN0aXZpdGllcyAmbHQ7YiZndDt0byBkZXNpZ24mbHQ7L2ImZ3Q7IGFjdGl2aXRpZXMsIGlkZW50aWZ5aW5nOiAKLSAgICAgICAgJmx0O3VsJmd0OwotICAgICAgICAgICAgJmx0O2xpJmd0OwotICAgICAgICAgICAgICAgIGFwcHJvcHJpYXRlIGRlc2lnbiBlbGVtZW50cyBmcm9tIGFuYWx5c2lzIGVsZW1lbnRzCi0gICAgICAgICAgICAmbHQ7L2xpJmd0OwotICAgICAgICAgICAgJmx0O2xpJmd0OwotICAgICAgICAgICAgICAgIGFwcHJvcHJpYXRlIGRlc2lnbiBtZWNoYW5pc21zIGZyb20gcmVsYXRlZCBhbmFseXNpcyBtZWNoYW5pc21zCi0gICAgICAgICAgICAmbHQ7L2xpJmd0OwotICAgICAgICAmbHQ7L3VsJmd0OwotICAgICZsdDsvbGkmZ3Q7Ci0gICAgJmx0O2xpJmd0OwotICAgICAgICAmbHQ7YiZndDtEZXNjcmliZXMmbHQ7L2ImZ3Q7IHRoZSBvcmdhbml6YXRpb24gb2YgdGhlIHN5c3RlbSdzICZsdDtiJmd0O3J1bi10aW1lIGFuZCBkZXBsb3ltZW50IGFyY2hpdGVjdHVyZSZsdDsvYiZndDsKLSAgICAmbHQ7L2xpJmd0OwotICAgICZsdDtsaSZndDsKLSAgICAgICAgJmx0O2ImZ3Q7T3JnYW5pemVzIHRoZSBpbXBsZW1lbnRhdGlvbiBtb2RlbCZsdDsvYiZndDsgc28gYXMgdG8gbWFrZSB0aGUgdHJhbnNpdGlvbiBiZXR3ZWVuIGRlc2lnbiBhbmQgaW1wbGVtZW50YXRpb24gc2VhbWxlc3MKLSAgICAmbHQ7L2xpJmd0OwotICAgICZsdDtsaSZndDsKLSAgICAgICAgJmx0O2ImZ3Q7TWFpbnRhaW5zIHRoZSBjb25zaXN0ZW5jeSBhbmQgaW50ZWdyaXR5IG9mIHRoZSBhcmNoaXRlY3R1cmUmbHQ7L2ImZ3Q7LCBlbnN1cmluZyB0aGF0OiAKLSAgICAgICAgJmx0O3VsJmd0OwotICAgICAgICAgICAgJmx0O2xpJmd0OwotICAgICAgICAgICAgICAgIG5ldyBkZXNpZ24gZWxlbWVudHMgaWRlbnRpZmllZCBmb3IgdGhlIGN1cnJlbnQgaXRlcmF0aW9uIGFyZSBpbnRlZ3JhdGVkIHdpdGggcHJlLWV4aXN0aW5nIGRlc2lnbiBlbGVtZW50cy4KLSAgICAgICAgICAgICZsdDsvbGkmZ3Q7Ci0gICAgICAgICAgICAmbHQ7bGkmZ3Q7Ci0gICAgICAgICAgICAgICAgbWF4aW1hbCByZS11c2Ugb2YgYXZhaWxhYmxlIGNvbXBvbmVudHMgYW5kIGRlc2lnbiBlbGVtZW50cyBpcyBhY2hpZXZlZCBhcyBlYXJseSBhcyBwb3NzaWJsZSBpbiB0aGUgZGVzaWduCi0gICAgICAgICAgICAgICAgZWZmb3J0LgotICAgICAgICAgICAgJmx0Oy9saSZndDsKLSAgICAgICAgJmx0Oy91bCZndDsKLSAgICAmbHQ7L2xpJmd0OwotJmx0Oy91bCZndDs8L21haW5EZXNjcmlwdGlvbj4KLSAgICA8a2V5Q29uc2lkZXJhdGlvbnM+Jmx0O3AmZ3Q7Ci0gICAgS2V5IGNvbnNpZGVyYXRpb25zOgotJmx0Oy9wJmd0OwotJmx0O3VsJmd0OwotICAgICZsdDtsaSZndDsKLSAgICAgICAga2V5MQotICAgICZsdDsvbGkmZ3Q7Ci0gICAgJmx0O2xpJmd0OwotICAgICAgICBrZXkyCi0gICAgJmx0Oy9saSZndDsKLSAgICAmbHQ7bGkmZ3Q7Ci0gICAgICAgIGtleTMKLSAgICAmbHQ7L2xpJmd0OwotICAgICZsdDtsaSZndDsKLSAgICAgICAga2V5NAotICAgICZsdDsvbGkmZ3Q7Ci0gICAgJmx0O2xpJmd0OwotICAgICAgICBrZXk1Ci0gICAgJmx0Oy9saSZndDsKLSAgICAmbHQ7bGkmZ3Q7Ci0gICAgICAgIGtleTYKLSAgICAmbHQ7L2xpJmd0OwotICAgICZsdDtsaSZndDsKLSAgICAgICAga2V5NwotICAgICZsdDsvbGkmZ3Q7Ci0mbHQ7L3VsJmd0Ozwva2V5Q29uc2lkZXJhdGlvbnM+Ci0gICAgPHVzYWdlR3VpZGFuY2U+Jmx0O3AmZ3Q7Ci0gICAgVGhlIHdvcmsgaXMgYmVzdCBkb25lIGluIHNldmVyYWwgc2Vzc2lvbnMsIHBlcmhhcHMgcGVyZm9ybWVkIG92ZXIgYSBmZXcgZGF5cyAob3Igd2Vla3MgYW5kIG1vbnRocyBmb3IgdmVyeSBsYXJnZQotICAgIHN5c3RlbXMpLiBUaGUgaW5pdGlhbCBmb2N1cyB3aWxsIGJlIG9uIHRoZSBhY3Rpdml0aWVzICZsdDthIGNsYXNzPSZxdW90O2VsZW1lbnRMaW5rJnF1b3Q7Ci0gICAgaHJlZj0mcXVvdDtyZXNvdXJjZXMvaWRlbnRpZnlfZGVzaWduX21lY2hhbmlzbXMse0M3QTI2QkQ3LTM4MjAtNDhEOS04MzBGLTY4NEMzQUYxNTVGOX0uaHRtbCZxdW90OwotICAgIGd1aWQ9JnF1b3Q7e0M3QTI2QkQ3LTM4MjAtNDhEOS04MzBGLTY4NEMzQUYxNTVGOX0mcXVvdDsmZ3Q7SWRlbnRpZnkgRGVzaWduIE1lY2hhbmlzbXMmbHQ7L2EmZ3Q7IGFuZCAmbHQ7YSBjbGFzcz0mcXVvdDtlbGVtZW50TGluayZxdW90OwotICAgIGhyZWY9JnF1b3Q7cmVzb3VyY2VzL2lkZW50aWZ5X2Rlc2lnbl9lbGVtZW50c19yZWFsLXRpbWVfZGVzaWduLHs1ODY5NjNEMC02MDdELTRFQzItOEQ1My0yOTJEQUZBQjlDOTJ9Lmh0bWwmcXVvdDsKLSAgICBndWlkPSZxdW90O3s1ODY5NjNEMC02MDdELTRFQzItOEQ1My0yOTJEQUZBQjlDOTJ9JnF1b3Q7Jmd0O2lkZW50aWZ5X2Rlc2lnbl9lbGVtZW50c19yZWFsLXRpbWVfZGVzaWduJmx0Oy9hJmd0Oywgd2l0aCBhIGdyZWF0IGRlYWwgb2YKLSAgICBpdGVyYXRpb24gd2l0aCB0aGUgJmx0O2EgY2xhc3M9JnF1b3Q7ZWxlbWVudExpbmsmcXVvdDsKLSAgICBocmVmPSZxdW90O3Jlc291cmNlcy9pbmNvcnBvcmF0ZV9kZXNpZ25fZWxlbWVudHMsezVDNjQ3MTczLTRFMzItNDU5NC05NkE5LTI1NDhCNDc3MjJGQX0uaHRtbCZxdW90OwotICAgIGd1aWQ9JnF1b3Q7ezVDNjQ3MTczLTRFMzItNDU5NC05NkE5LTI1NDhCNDc3MjJGQX0mcXVvdDsmZ3Q7SW5jb3Jwb3JhdGUgRXhpc3RpbmcgRGVzaWduIEVsZW1lbnRzJmx0Oy9hJmd0OyBhY3Rpdml0eSB0byBtYWtlIHN1cmUgdGhhdCBuZXcKLSAgICBlbGVtZW50cyBkbyBub3QgZHVwbGljYXRlIGZ1bmN0aW9uYWxpdHkgb2YgZXhpc3RpbmcgZWxlbWVudHMuCi0mbHQ7L3AmZ3Q7Ci0mbHQ7cCZndDsKLSAgICBBcyB0aGUgZGVzaWduIGVtZXJnZXMsIGNvbmN1cnJlbmN5IGFuZCBkaXN0cmlidXRpb24gaXNzdWVzIGFyZSBpbnRyb2R1Y2VkIGluIHRoZSBhY3Rpdml0aWVzICZsdDthIGNsYXNzPSZxdW90O2VsZW1lbnRMaW5rJnF1b3Q7Ci0gICAgaHJlZj0mcXVvdDtyZXNvdXJjZXMvZGVzY3JpYmVfcnVudGltZV9hcmNoaXRlY3R1cmUsezREMzVDMDM4LUEyRDAtNDhCOC05RUNELTUyNzE3RkVBRTMzQX0uaHRtbCZxdW90OwotICAgIGd1aWQ9JnF1b3Q7ezREMzVDMDM4LUEyRDAtNDhCOC05RUNELTUyNzE3RkVBRTMzQX0mcXVvdDsmZ3Q7RGVzY3JpYmUgdGhlIFJ1bi10aW1lIEFyY2hpdGVjdHVyZSZsdDsvYSZndDsgYW5kICZsdDthIGNsYXNzPSZxdW90O2VsZW1lbnRMaW5rJnF1b3Q7Ci0gICAgaHJlZj0mcXVvdDtyZXNvdXJjZXMvZGVzY3JpYmVfZGlzdHJpYnV0aW9uLHs2QTExMjgwOC0wQTkwLTQyN0EtQkFCOS1FMTRGM0ZCRjcyQjV9Lmh0bWwmcXVvdDsKLSAgICBndWlkPSZxdW90O3s2QTExMjgwOC0wQTkwLTQyN0EtQkFCOS1FMTRGM0ZCRjcyQjV9JnF1b3Q7Jmd0O0Rlc2NyaWJlIERpc3RyaWJ1dGlvbiZsdDsvYSZndDssIHJlc3BlY3RpdmVseS4gQXMgdGhlc2UgaXNzdWVzIGFyZSBjb25zaWRlcmVkLAotICAgIGNoYW5nZXMgdG8gZGVzaWduIGVsZW1lbnRzIG1heSBiZSByZXF1aXJlZCB0byBzcGxpdCBiZWhhdmlvciBhY3Jvc3MgcHJvY2Vzc2VzLCB0aHJlYWRzIG9yIG5vZGVzLgotJmx0Oy9wJmd0OwotJmx0O3AmZ3Q7Ci0gICAgQXMgdGhlIGluZGl2aWR1YWwgbW9kZWxzIGFyZSByZWZpbmVkIHRvIGluY29ycG9yYXRlIHRoZSBhcmNoaXRlY3R1cmFsIGRlY2lzaW9ucywgdGhlIHJlc3VsdHMgYXJlIGRvY3VtZW50ZWQgaW4KLSAgICByZXNwZWN0aXZlIHZpZXcgc2VjdGlvbnMgaW4gdGhlIFNvZnR3YXJlIEFyY2hpdGVjdHVyZSBEb2N1bWVudCAoZS5nLiwgYXMgdGhlIERlc2lnbiBNb2RlbCBpcyByZWZpbmVkLCB0aGUgTG9naWNhbCBWaWV3Ci0gICAgb2YgdGhlIFNvZnR3YXJlIEFyY2hpdGVjdHVyZSBEb2N1bWVudCBpcyByZWZpbmVkLCBhcyB3ZWxsKS4gVGhlIHJlc3VsdGluZyBhcmNoaXRlY3R1cmUgaXMgcmV2aWV3ZWQuCi0mbHQ7L3AmZ3Q7Ci0mbHQ7YnIgLyZndDsKLSZsdDticiAvJmd0OzwvdXNhZ2VHdWlkYW5jZT4KLSAgICA8cHVycG9zZT4mbHQ7cCZndDsKLSAgICBQdXJwb3NlIG9mIHRoaXMgYWN0aXZpdHkgaXMgdG8gaGF2ZSB0YXNrcyB0aGF0IGFyZSBhc3NvY2lhdGVkIHRvIG90aGVyIHRhc2tzLgotJmx0Oy9wJmd0OwotJmx0O3AmZ3Q7Ci0gICAgJmFtcDtuYnNwOyZsdDtpbWcgaGVpZ2h0PSZxdW90OzcxJnF1b3Q7IGFsdD0mcXVvdDsmcXVvdDsgc3JjPSZxdW90O3Jlc291cmNlcy9ydXAuanBnJnF1b3Q7IHdpZHRoPSZxdW90OzE3NiZxdW90OyAvJmd0OwotJmx0Oy9wJmd0OzwvcHVycG9zZT4KLSAgICA8YWx0ZXJuYXRpdmVzPiZsdDtwJmd0OwotICAgIEFsdGVyYW50aXZlczoKLSZsdDsvcCZndDsKLSZsdDtvbCZndDsKLSAgICAmbHQ7bGkmZ3Q7Ci0gICAgICAgIEFsdGVyMQotICAgICZsdDsvbGkmZ3Q7Ci0gICAgJmx0O2xpJmd0OwotICAgICAgICBBbHRlcjIKLSAgICAmbHQ7L2xpJmd0OwotICAgICZsdDtsaSZndDsKLSAgICAgICAgQWx0ZXIzCi0gICAgJmx0Oy9saSZndDsKLSZsdDsvb2wmZ3Q7PC9hbHRlcm5hdGl2ZXM+Ci0gICAgPGhvd3RvU3RhZmY+Jmx0O3AmZ3Q7Ci0gICAgVGhlc2UgYWN0aXZpdGllcyBhcmUgYmVzdCBjYXJyaWVkIG91dCBieSBhIHNtYWxsIHRlYW0gc3RhZmZlZCBieSBjcm9zcy1mdW5jdGlvbmFsIHRlYW0gbWVtYmVycy4gSXNzdWVzIHRoYXQgYXJlCi0gICAgdHlwaWNhbGx5IGFyY2hpdGVjdHVyYWxseSBzaWduaWZpY2FudCBpbmNsdWRlIHVzYWJpbGl0eSwgcGVyZm9ybWFuY2UsIHNjYWxpbmcsIHByb2Nlc3MgYW5kIHRocmVhZCBzeW5jaHJvbml6YXRpb24sIGFuZAotICAgIGRpc3RyaWJ1dGlvbi4gVGhlIHRlYW0gc2hvdWxkIGFsc28gaW5jbHVkZSBtZW1iZXJzIHdpdGggZG9tYWluIGV4cGVyaWVuY2Ugd2hvIGNhbiBpZGVudGlmeSBrZXkgYWJzdHJhY3Rpb25zLiBUaGUgdGVhbQotICAgIHNob3VsZCBhbHNvIGhhdmUgZXhwZXJpZW5jZSB3aXRoIG1vZGVsIG9yZ2FuaXphdGlvbiBhbmQgbGF5ZXJpbmcuIFRoZSB0ZWFtIHdpbGwgbmVlZCB0byBiZSBhYmxlIHRvIHB1bGwgYWxsIHRoZXNlCi0gICAgZGlzcGFyYXRlIHRocmVhZHMgaW50byBhIGNvaGVzaXZlLCBjb2hlcmVudCAoYWxiZWl0IHByZWxpbWluYXJ5KSBhcmNoaXRlY3R1cmUuCi0mbHQ7L3AmZ3Q7Ci0mbHQ7cCZndDsKLSAgICBCZWNhdXNlIHRoZSBmb2N1cyBvZiB0aGUgYXJjaGl0ZWN0dXJlIGVmZm9ydCBpcyBzaGlmdGluZyB0b3dhcmQgaW1wbGVtZW50YXRpb24gaXNzdWVzLCBncmVhdGVyIGF0dGVudGlvbiBuZWVkcyB0byBiZQotICAgIHBhaWQgdG8gc3BlY2lmaWMgdGVjaG5vbG9neSBpc3N1ZXMuIFRoaXMgd2lsbCBmb3JjZSB0aGUgYXJjaGl0ZWN0dXJlIHRlYW0gdG8gc2hpZnQgbWVtYmVycyBvciBleHBhbmQgdG8gaW5jbHVkZSBwZW9wbGUKLSAgICB3aXRoIGRpc3RyaWJ1dGlvbiBhbmQgZGVwbG95bWVudCBleHBlcnRpc2UgKGlmIHRob3NlIGlzc3VlcyBhcmUgYXJjaGl0ZWN0dXJhbGx5IHNpZ25pZmljYW50KS4gSW4gb3JkZXIgdG8gdW5kZXJzdGFuZAotICAgIHRoZSBwb3RlbnRpYWwgaW1wYWN0IG9mIHRoZSBzdHJ1Y3R1cmUgb24gdGhlIGltcGxlbWVudGF0aW9uIG1vZGVsIG9uIHRoZSBlYXNlIG9mIGludGVncmF0aW9uLCBleHBlcnRpc2UgaW4gdGhlIHNvZnR3YXJlCi0gICAgYnVpbGQgbWFuYWdlbWVudCBwcm9jZXNzIGlzIHVzZWZ1bCB0byBoYXZlLgotJmx0Oy9wJmd0OwotJmx0O3AmZ3Q7Ci0gICAgQXQgdGhlIHNhbWUgdGltZSwgaXQgaXMgZXNzZW50aWFsIHRoYXQgdGhlIGFyY2hpdGVjdHVyZSB0ZWFtIG5vdCBiZSBjb21wb3NlZCBvZiBhIGxhcmdlIGV4dGVuZGVkIHRlYW0uIEEgc3RyYXRlZ3kgZm9yCi0gICAgY291bnRlcmluZyB0aGlzIHRyZW5kIGlzIHRvIHJldGFpbiBhIHJlbGF0aXZlbHkgc21hbGwgY29yZSB0ZWFtIHdpdGggYSBzYXRlbGxpdGUgZ3JvdXAgb2YgZXh0ZW5kZWQgdGVhbSBtZW1iZXJzIHRoYXQKLSAgICBhcmUgYnJvdWdodCBpbiBhcyAmcXVvdDtjb25zdWx0YW50cyZxdW90OyBvbiBrZXkgaXNzdWVzJmx0O2ImZ3Q7LiZsdDsvYiZndDsgVGhpcyBzdHJ1Y3R1cmUgYWxzbyB3b3JrcyB3ZWxsIGZvciBzbWFsbGVyIHByb2plY3RzIHdoZXJlCi0gICAgc3BlY2lmaWMgZXhwZXJ0aXNlIG1heSBiZSBib3Jyb3dlZCBvciBjb250cmFjdGVkIGZyb20gb3RoZXIgb3JnYW5pemF0aW9uczsgdGhleSBjYW4gYmUgYnJvdWdodCBpbiBhcyBzcGVjaWZpYyBpc3N1ZXMKLSAgICBuZWVkIHRvIGJlIGFkZHJlc3NlZC4KLSZsdDsvcCZndDs8L2hvd3RvU3RhZmY+Ci0gIDwvb3JnLmVjbGlwc2UuZXBmLnVtYTpBY3Rpdml0eURlc2NyaXB0aW9uPgotICA8b3JnLmVjbGlwc2UuZXBmLnVtYTpEZXNjcmlwdG9yRGVzY3JpcHRpb24geG1pOmlkPSItQllfX3RpandSclY0MVlVclhJdFUwdyIgbmFtZT0icm9sZV9BMixfSkM5OEFEemxFZHE1eXNGT05yMUJHUSIgZ3VpZD0iLUJZX190aWp3UnJWNDFZVXJYSXRVMHciPgotICAgIDxrZXlDb25zaWRlcmF0aW9ucz5rZXlzIGNvbnNpZGVyYXRpb246Um9sZSBBMjwva2V5Q29uc2lkZXJhdGlvbnM+Ci0gICAgPHVzYWdlR3VpZGFuY2U+dXNhZ2U6Um9sZSBBMjwvdXNhZ2VHdWlkYW5jZT4KLSAgICA8cmVmaW5lZERlc2NyaXB0aW9uPiZsdDtwJmd0OwotICAgIHJlZmluZWQgZGVzY3JpcHRpb24gOiBSb2xlIEEyCi0mbHQ7L3AmZ3Q7PC9yZWZpbmVkRGVzY3JpcHRpb24+Ci0gIDwvb3JnLmVjbGlwc2UuZXBmLnVtYTpEZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci0gIDxvcmcuZWNsaXBzZS5lcGYudW1hOkRlc2NyaXB0b3JEZXNjcmlwdGlvbiB4bWk6aWQ9Ii1ET1pyUl9zWnd3cGNVdGNvdS1qSXlRIiBuYW1lPSJyb2xlX0ExLF9KQzk4QVR6bEVkcTV5c0ZPTnIxQkdRIiBndWlkPSItRE9aclJfc1p3d3BjVXRjb3Utakl5USI+Ci0gICAgPGtleUNvbnNpZGVyYXRpb25zPlJvbGUgQTE6a2V5IGNvbnNpZGVyYXRpb248L2tleUNvbnNpZGVyYXRpb25zPgotICAgIDx1c2FnZUd1aWRhbmNlPlJvbGUgQTE6dXNhZ2U8L3VzYWdlR3VpZGFuY2U+Ci0gICAgPHJlZmluZWREZXNjcmlwdGlvbj5Sb2xlIEExOlJlZmluZWQgZGVzY3JpcHRpb248L3JlZmluZWREZXNjcmlwdGlvbj4KLSAgPC9vcmcuZWNsaXBzZS5lcGYudW1hOkRlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLSAgPG9yZy5lY2xpcHNlLmVwZi51bWE6RGVzY3JpcHRvckRlc2NyaXB0aW9uIHhtaTppZD0iLWFyRnJKaXNCeVA5MFlDck1iLWl5amciIG5hbWU9InJvbGVEZXNjIHdpdGggbm8gbGlua3MsXzNfVU53RHprRWRxNXlzRk9OcjFCR1EiIGd1aWQ9Ii1hckZySmlzQnlQOTBZQ3JNYi1peWpnIj4KLSAgICA8a2V5Q29uc2lkZXJhdGlvbnM+a2V5IGNvbnNpZGVyYXRpb246cm9sZURlc2Mgd2l0aCBubyBsaW5rczwva2V5Q29uc2lkZXJhdGlvbnM+Ci0gICAgPHVzYWdlR3VpZGFuY2U+dXNhZ2U6cm9sZURlc2Mgd2l0aCBubyBsaW5rczwvdXNhZ2VHdWlkYW5jZT4KLSAgICA8cmVmaW5lZERlc2NyaXB0aW9uPnJlZmluZWQgZGVzY3JpcHRpb24gOiByb2xlRGVzYyB3aXRoIG5vIGxpbmtzPC9yZWZpbmVkRGVzY3JpcHRpb24+Ci0gIDwvb3JnLmVjbGlwc2UuZXBmLnVtYTpEZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci0gIDxvcmcuZWNsaXBzZS5lcGYudW1hOkRlc2NyaXB0b3JEZXNjcmlwdGlvbiB4bWk6aWQ9Ii01T2VHUEg4SlJ6U1JBRlB6QmdIbkpBIiBuYW1lPSJyb2xlX0IyLF9NYzB6d0R6bEVkcTV5c0ZPTnIxQkdRIiBndWlkPSItNU9lR1BIOEpSelNSQUZQekJnSG5KQSI+Ci0gICAgPGtleUNvbnNpZGVyYXRpb25zPmtleTpSb2xlIEIyPC9rZXlDb25zaWRlcmF0aW9ucz4KLSAgICA8dXNhZ2VHdWlkYW5jZT51c2FnZTpSb2xlIEIyPC91c2FnZUd1aWRhbmNlPgotICAgIDxyZWZpbmVkRGVzY3JpcHRpb24+cmVmaW5lZDpSb2xlIEIyPC9yZWZpbmVkRGVzY3JpcHRpb24+Ci0gIDwvb3JnLmVjbGlwc2UuZXBmLnVtYTpEZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci0gIDxvcmcuZWNsaXBzZS5lcGYudW1hOkRlc2NyaXB0b3JEZXNjcmlwdGlvbiB4bWk6aWQ9Ii1ZZXJJakRySWxld2Q4aURoSVNNZzFnIiBuYW1lPSJyb2xlX0IxLF9NYzB6d1R6bEVkcTV5c0ZPTnIxQkdRIiBndWlkPSItWWVySWpEcklsZXdkOGlEaElTTWcxZyI+Ci0gICAgPGtleUNvbnNpZGVyYXRpb25zPmtleTpSb2xlIEIxPC9rZXlDb25zaWRlcmF0aW9ucz4KLSAgICA8dXNhZ2VHdWlkYW5jZT51c2FnZTpSb2xlIEIxPC91c2FnZUd1aWRhbmNlPgotICAgIDxyZWZpbmVkRGVzY3JpcHRpb24+cmVmaW5lZDogUm9sZSBCMTwvcmVmaW5lZERlc2NyaXB0aW9uPgotICA8L29yZy5lY2xpcHNlLmVwZi51bWE6RGVzY3JpcHRvckRlc2NyaXB0aW9uPgotICA8b3JnLmVjbGlwc2UuZXBmLnVtYTpEZXNjcmlwdG9yRGVzY3JpcHRpb24geG1pOmlkPSItbmNMaFU0dmhnNmRob0VLVFRrS2tEUSIgbmFtZT0id3BEZXNjMixfVEN1NElEemlFZHE1eXNGT05yMUJHUSIgZ3VpZD0iLW5jTGhVNHZoZzZkaG9FS1RUa0trRFEiPgotICAgIDxrZXlDb25zaWRlcmF0aW9ucz5rZXk6d3BkZXNjMjwva2V5Q29uc2lkZXJhdGlvbnM+Ci0gICAgPHVzYWdlR3VpZGFuY2U+dXNhZ2U6d3BkZXNjMjwvdXNhZ2VHdWlkYW5jZT4KLSAgICA8cmVmaW5lZERlc2NyaXB0aW9uPnJlZmluZWQ6IHdwZGVzYzI8L3JlZmluZWREZXNjcmlwdGlvbj4KLSAgPC9vcmcuZWNsaXBzZS5lcGYudW1hOkRlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLSAgPG9yZy5lY2xpcHNlLmVwZi51bWE6RGVzY3JpcHRvckRlc2NyaXB0aW9uIHhtaTppZD0iLXJEWG9XNmJXWl83bWtMX0U5V2N5aGciIG5hbWU9IndwRGVzYzMgd2l0aCBubyBsaW5rcyxfMXg1N0FEemtFZHE1eXNGT05yMUJHUSIgZ3VpZD0iLXJEWG9XNmJXWl83bWtMX0U5V2N5aGciPgotICAgIDxrZXlDb25zaWRlcmF0aW9ucz5rZXk6IHdwRGVzYzMgd2l0aCBubyBsaW5rczwva2V5Q29uc2lkZXJhdGlvbnM+Ci0gICAgPHVzYWdlR3VpZGFuY2U+dXNhZ2U6IHdwRGVzYzMgd2l0aCBubyBsaW5rczwvdXNhZ2VHdWlkYW5jZT4KLSAgICA8cmVmaW5lZERlc2NyaXB0aW9uPnJlZmluZWQ6IHdwRGVzYzMgd2l0aCBubyBsaW5rczwvcmVmaW5lZERlc2NyaXB0aW9uPgotICA8L29yZy5lY2xpcHNlLmVwZi51bWE6RGVzY3JpcHRvckRlc2NyaXB0aW9uPgotICA8b3JnLmVjbGlwc2UuZXBmLnVtYTpEZXNjcmlwdG9yRGVzY3JpcHRpb24geG1pOmlkPSItaG1DQ3ItREtaNnpyOFM2RFhkcWZTQSIgbmFtZT0iYXJ0aWZhY3RfQTIsX0pDOThBanpsRWRxNXlzRk9OcjFCR1EiIGd1aWQ9Ii1obUNDci1ES1o2enI4UzZEWGRxZlNBIj4KLSAgICA8a2V5Q29uc2lkZXJhdGlvbnM+a2V5IDogQXJ0aWZhY3QgQTI8L2tleUNvbnNpZGVyYXRpb25zPgotICAgIDx1c2FnZUd1aWRhbmNlPnVzYWdlOiBBcnRpZmFjdCBBMjwvdXNhZ2VHdWlkYW5jZT4KLSAgICA8cmVmaW5lZERlc2NyaXB0aW9uPnJlZmluZWQ6IEFydGlmYWN0IEEyPC9yZWZpbmVkRGVzY3JpcHRpb24+Ci0gIDwvb3JnLmVjbGlwc2UuZXBmLnVtYTpEZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci0gIDxvcmcuZWNsaXBzZS5lcGYudW1hOkRlc2NyaXB0b3JEZXNjcmlwdGlvbiB4bWk6aWQ9Ii1DREpvX29ZQ2REaTV2cDhJNjl2OU93IiBuYW1lPSJkZWxpdmVyYWJsZV9BMixfSkM5OEF6emxFZHE1eXNGT05yMUJHUSIgZ3VpZD0iLUNESm9fb1lDZERpNXZwOEk2OXY5T3ciPgotICAgIDxrZXlDb25zaWRlcmF0aW9ucz5rZXlzOiBEZWxpdmVyYWJsZSBBMjwva2V5Q29uc2lkZXJhdGlvbnM+Ci0gICAgPHVzYWdlR3VpZGFuY2U+dXNhZ2U6IERlbGl2ZXJhYmxlIEEyPC91c2FnZUd1aWRhbmNlPgotICAgIDxyZWZpbmVkRGVzY3JpcHRpb24+cmVmaW5lZDpEZWxpdmVyYWJsZSBBMjwvcmVmaW5lZERlc2NyaXB0aW9uPgotICA8L29yZy5lY2xpcHNlLmVwZi51bWE6RGVzY3JpcHRvckRlc2NyaXB0aW9uPgotICA8b3JnLmVjbGlwc2UuZXBmLnVtYTpEZXNjcmlwdG9yRGVzY3JpcHRpb24geG1pOmlkPSItUU45UkdMNWNuMFNsYlV3bkdWMkdfQSIgbmFtZT0iYXJ0aWZhY3RfQTIsX0pESHRBRHpsRWRxNXlzRk9OcjFCR1EiIGd1aWQ9Ii1RTjlSR0w1Y24wU2xiVXduR1YyR19BIj4KLSAgICA8a2V5Q29uc2lkZXJhdGlvbnM+a2V5czpBcnRpZmFjdCBBMjwva2V5Q29uc2lkZXJhdGlvbnM+Ci0gICAgPHVzYWdlR3VpZGFuY2U+dXNhZ2U6QXJ0aWZhY3QgQTI8L3VzYWdlR3VpZGFuY2U+Ci0gICAgPHJlZmluZWREZXNjcmlwdGlvbj5yZWZpbmVkOkFydGlmYWN0IEEyPC9yZWZpbmVkRGVzY3JpcHRpb24+Ci0gIDwvb3JnLmVjbGlwc2UuZXBmLnVtYTpEZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci0gIDxvcmcuZWNsaXBzZS5lcGYudW1hOkRlc2NyaXB0b3JEZXNjcmlwdGlvbiB4bWk6aWQ9Ii0xalREcVM0UnZfUEFFSFlGcGVvam1BIiBuYW1lPSJvdXRjb21lX0EyLF9KREh0QVR6bEVkcTV5c0ZPTnIxQkdRIiBndWlkPSItMWpURHFTNFJ2X1BBRUhZRnBlb2ptQSI+Ci0gICAgPGtleUNvbnNpZGVyYXRpb25zPmtleTpPdXRjb21lIEEyPC9rZXlDb25zaWRlcmF0aW9ucz4KLSAgICA8dXNhZ2VHdWlkYW5jZT51c2FnZTpPdXRjb21lIEEyPC91c2FnZUd1aWRhbmNlPgotICAgIDxyZWZpbmVkRGVzY3JpcHRpb24+cmVmaW5lZDpPdXRjb21lIEEyPC9yZWZpbmVkRGVzY3JpcHRpb24+Ci0gIDwvb3JnLmVjbGlwc2UuZXBmLnVtYTpEZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci0gIDxvcmcuZWNsaXBzZS5lcGYudW1hOkRlc2NyaXB0b3JEZXNjcmlwdGlvbiB4bWk6aWQ9Ii1EYWt6bXZBLXFod0dFU0NmWksxMXNRIiBuYW1lPSJhcnRpZmFjdF9CMixfTWRSZnNEemxFZHE1eXNGT05yMUJHUSIgZ3VpZD0iLURha3ptdkEtcWh3R0VTQ2ZaSzExc1EiPgotICAgIDxrZXlDb25zaWRlcmF0aW9ucz5rZXk6QXJ0aWZhY3QgQjI8L2tleUNvbnNpZGVyYXRpb25zPgotICAgIDx1c2FnZUd1aWRhbmNlPnVzYWdlOkFydGlmYWN0IEIyPC91c2FnZUd1aWRhbmNlPgotICAgIDxyZWZpbmVkRGVzY3JpcHRpb24+cmVmaW5lZDpBcnRpZmFjdCBCMjwvcmVmaW5lZERlc2NyaXB0aW9uPgotICA8L29yZy5lY2xpcHNlLmVwZi51bWE6RGVzY3JpcHRvckRlc2NyaXB0aW9uPgotICA8b3JnLmVjbGlwc2UuZXBmLnVtYTpEZXNjcmlwdG9yRGVzY3JpcHRpb24geG1pOmlkPSItTGFEeUF1anhCa1BUaHIyOHQyWGR3ZyIgbmFtZT0iZGVsaXZlcmFibGVfQjIsX01kUmZzVHpsRWRxNXlzRk9OcjFCR1EiIGd1aWQ9Ii1MYUR5QXVqeEJrUFRocjI4dDJYZHdnIj4KLSAgICA8a2V5Q29uc2lkZXJhdGlvbnM+a2V5OkRlbGl2ZXJhYmxlIEIyPC9rZXlDb25zaWRlcmF0aW9ucz4KLSAgICA8dXNhZ2VHdWlkYW5jZT51c2FnZTpEZWxpdmVyYWJsZSBCMjwvdXNhZ2VHdWlkYW5jZT4KLSAgICA8cmVmaW5lZERlc2NyaXB0aW9uPnJlZmluZWQ6RGVsaXZlcmFibGUgQjI8L3JlZmluZWREZXNjcmlwdGlvbj4KLSAgPC9vcmcuZWNsaXBzZS5lcGYudW1hOkRlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLSAgPG9yZy5lY2xpcHNlLmVwZi51bWE6RGVzY3JpcHRvckRlc2NyaXB0aW9uIHhtaTppZD0iLW5UdDZIM3JYeXRVc09xcEpMRVFqZHciIG5hbWU9Im91dGNvbWVfQjIsX01ka2FvVHpsRWRxNXlzRk9OcjFCR1EiIGd1aWQ9Ii1uVHQ2SDNyWHl0VXNPcXBKTEVRamR3Ij4KLSAgICA8dXNhZ2VHdWlkYW5jZT4mYW1wO25ic3A7JmFtcDtuYnNwOyZhbXA7bmJzcDs8L3VzYWdlR3VpZGFuY2U+Ci0gIDwvb3JnLmVjbGlwc2UuZXBmLnVtYTpEZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci0gIDxvcmcuZWNsaXBzZS5lcGYudW1hOkRlc2NyaXB0b3JEZXNjcmlwdGlvbiB4bWk6aWQ9Ii16QkFzMTFSZ0xnX1lTYnM3QmRrU3VRIiBuYW1lPSJ0YXNrX0ExLF8wRFJfUUVERUVkcU85TTNmdWtZQV9BIiBndWlkPSItekJBczExUmdMZ19ZU2JzN0Jka1N1USI+Ci0gICAgPGtleUNvbnNpZGVyYXRpb25zPlRhc2sgQTEmYW1wO25ic3A7IGtleTwva2V5Q29uc2lkZXJhdGlvbnM+Ci0gICAgPHVzYWdlR3VpZGFuY2U+Jmx0O3AmZ3Q7Ci0gICAgVGFzayBBMSZhbXA7bmJzcDsgZ3VpZGFuY2UKLSZsdDsvcCZndDsKLSZsdDtwJmd0OwotICAgICZsdDtpbWcgaGVpZ2h0PSZxdW90OzE2JnF1b3Q7IGFsdD0mcXVvdDsmcXVvdDsKLSAgICBzcmM9JnF1b3Q7ZmlsZTovLy9DOi9Eb2N1bWVudHMlMjBhbmQlMjBTZXR0aW5ncy9BZG1pbmlzdHJhdG9yL0lCTS9NZXRob2RMaWJyYXJpZXMvUGFyaXMvUGFyaXMvUGx1ZyUyMEEvY2FwYWJpbGl0eXBhdHRlcm5zL3Jlc291cmNlcy9zeW5jZWQuZ2lmJnF1b3Q7Ci0gICAgIHdpZHRoPSZxdW90OzE2JnF1b3Q7IC8mZ3Q7Ci0mbHQ7L3AmZ3Q7Ci0mbHQ7cCZndDsKLSAgICAmbHQ7aW1nIGhlaWdodD0mcXVvdDsxNiZxdW90OyBhbHQ9JnF1b3Q7JnF1b3Q7Ci0gICAgc3JjPSZxdW90O2ZpbGU6Ly8vQzovRG9jdW1lbnRzJTIwYW5kJTIwU2V0dGluZ3MvQWRtaW5pc3RyYXRvci9JQk0vTWV0aG9kTGlicmFyaWVzL1BhcmlzL1BhcmlzL1BsdWclMjBBL2NhcGFiaWxpdHlwYXR0ZXJucy9yZXNvdXJjZXMvaGVscGJvb2suZ2lmJnF1b3Q7Ci0gICAgIHdpZHRoPSZxdW90OzE2JnF1b3Q7IC8mZ3Q7Ci0mbHQ7L3AmZ3Q7PC91c2FnZUd1aWRhbmNlPgotICAgIDxyZWZpbmVkRGVzY3JpcHRpb24+VGFzayBBMSZhbXA7bmJzcDsgcmVmaW5lZCBkZXNjcmlwdGlvbjwvcmVmaW5lZERlc2NyaXB0aW9uPgotICA8L29yZy5lY2xpcHNlLmVwZi51bWE6RGVzY3JpcHRvckRlc2NyaXB0aW9uPgotICA8b3JnLmVjbGlwc2UuZXBmLnVtYTpEZXNjcmlwdG9yRGVzY3JpcHRpb24geG1pOmlkPSIteWItTEdpa2NBNU1QZVI4TDNZVzJDQSIgbmFtZT0idGFza19BMixfMjg4N0VFREVFZHFPOU0zZnVrWUFfQSIgZ3VpZD0iLXliLUxHaWtjQTVNUGVSOEwzWVcyQ0EiPgotICAgIDxrZXlDb25zaWRlcmF0aW9ucz5UYXNrIEEyIGtleTwva2V5Q29uc2lkZXJhdGlvbnM+Ci0gICAgPHVzYWdlR3VpZGFuY2U+VGFzayBBMiBndWlkYW5jZTwvdXNhZ2VHdWlkYW5jZT4KLSAgICA8cmVmaW5lZERlc2NyaXB0aW9uPlRhc2sgQTIgcmVmaW5lZCBkZXNjcmlwdGlvbjwvcmVmaW5lZERlc2NyaXB0aW9uPgotICA8L29yZy5lY2xpcHNlLmVwZi51bWE6RGVzY3JpcHRvckRlc2NyaXB0aW9uPgotICA8b3JnLmVjbGlwc2UuZXBmLnVtYTpEZXNjcmlwdG9yRGVzY3JpcHRpb24geG1pOmlkPSItd0JWd25LTkE3dnhQWnBZNWgwbmpCUSIgbmFtZT0icm9sZV9BMSxfMERrNk1FREVFZHFPOU0zZnVrWUFfQSIgZ3VpZD0iLXdCVnduS05BN3Z4UFpwWTVoMG5qQlEiPgotICAgIDxrZXlDb25zaWRlcmF0aW9ucz5Sb2xlIEExIGtleTwva2V5Q29uc2lkZXJhdGlvbnM+Ci0gICAgPHVzYWdlR3VpZGFuY2U+Um9sZSBBMSBndWlkYW5jZTwvdXNhZ2VHdWlkYW5jZT4KLSAgICA8cmVmaW5lZERlc2NyaXB0aW9uPiZsdDtwJmd0OwotICAgIFJvbGUgQTEgcmVmaW5lZCBkZXNjCi0mbHQ7L3AmZ3Q7Ci0mbHQ7cCZndDsKLSAgICAmbHQ7aW1nIGhlaWdodD0mcXVvdDs3MSZxdW90OyBhbHQ9JnF1b3Q7JnF1b3Q7Ci0gICAgc3JjPSZxdW90O2ZpbGU6Ly8vQzovRG9jdW1lbnRzJTIwYW5kJTIwU2V0dGluZ3MvQWRtaW5pc3RyYXRvci9JQk0vTWV0aG9kTGlicmFyaWVzL1BhcmlzL1BhcmlzL1BsdWclMjBBL2NhcGFiaWxpdHlwYXR0ZXJucy9yZXNvdXJjZXMvcnVwLmpwZyZxdW90OwotICAgICB3aWR0aD0mcXVvdDsxNzYmcXVvdDsgLyZndDsKLSZsdDsvcCZndDs8L3JlZmluZWREZXNjcmlwdGlvbj4KLSAgPC9vcmcuZWNsaXBzZS5lcGYudW1hOkRlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLSAgPG9yZy5lY2xpcHNlLmVwZi51bWE6RGVzY3JpcHRvckRlc2NyaXB0aW9uIHhtaTppZD0iLV9qM2Y4ZGp3S3hzS2FDSERuSklxVkEiIG5hbWU9InJvbGVfQTIsXzBEazZNVURFRWRxTzlNM2Z1a1lBX0EiIGd1aWQ9Ii1fajNmOGRqd0t4c0thQ0hEbkpJcVZBIj4KLSAgICA8a2V5Q29uc2lkZXJhdGlvbnM+Jmx0O3AmZ3Q7Ci0gICAgUm9sZSBBMiBrZXkKLSZsdDsvcCZndDsKLSZsdDtwJmd0OwotICAgICZsdDtpbWcgaGVpZ2h0PSZxdW90OzE2NyZxdW90OyBhbHQ9JnF1b3Q7JnF1b3Q7Ci0gICAgc3JjPSZxdW90O2ZpbGU6Ly8vQzovRG9jdW1lbnRzJTIwYW5kJTIwU2V0dGluZ3MvQWRtaW5pc3RyYXRvci9JQk0vTWV0aG9kTGlicmFyaWVzL1BhcmlzL1BhcmlzL1BsdWclMjBBL2NhcGFiaWxpdHlwYXR0ZXJucy9yZXNvdXJjZXMvcnVwMV9hLmdpZiZxdW90OwotICAgICB3aWR0aD0mcXVvdDsyNiZxdW90OyAvJmd0OwotJmx0Oy9wJmd0Ozwva2V5Q29uc2lkZXJhdGlvbnM+Ci0gICAgPHVzYWdlR3VpZGFuY2U+Um9sZSBBMiB1c2FnZTwvdXNhZ2VHdWlkYW5jZT4KLSAgICA8cmVmaW5lZERlc2NyaXB0aW9uPlJvbGUgQTIgcmVmaW5lZCBkZXNjPC9yZWZpbmVkRGVzY3JpcHRpb24+Ci0gIDwvb3JnLmVjbGlwc2UuZXBmLnVtYTpEZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08L3htaTpYTUk+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvY2FwYWJpbGl0eXBhdHRlcm5zL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9kaWFncmFtLnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9jYXBhYmlsaXR5cGF0dGVybnMvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL2RpYWdyYW0ueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYjU4Y2RiLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9jYXBhYmlsaXR5cGF0dGVybnMvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL2RpYWdyYW0ueG1pCisrKyAvZGV2L251bGwKQEAgLTEsMjI2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08eG1pOlhNSSB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOm5vdGF0aW9uPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2dtZi9ydW50aW1lLzEuMC4wL25vdGF0aW9uIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbD0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvZGlhZ3JhbS8xLjAuMC9kaWFncmFtLmVjb3JlIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIj4KLSAgPG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOkFjdGl2aXR5RGV0YWlsRGlhZ3JhbSB4bWk6aWQ9Il9JSGdKME94NEVkdTJPbzZxLW5IV2dnIj4KLSAgICA8bGlua2VkRWxlbWVudCB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDYXBhYmlsaXR5UGF0dGVybiIgaHJlZj0idW1hOi8vXzRzQ3RzRHpnRWRxNXlzRk9OcjFCR1EjXzRzQ3RzVHpnRWRxNXlzRk9OcjFCR1EiLz4KLSAgPC9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDpBY3Rpdml0eURldGFpbERpYWdyYW0+Ci0gIDxub3RhdGlvbjpEaWFncmFtIHhtaTppZD0iX0lIZ0owZXg0RWR1Mk9vNnEtbkhXZ2ciIHR5cGU9IkFERCIgZWxlbWVudD0iX0lIZ0owT3g0RWR1Mk9vNnEtbkhXZ2ciIG5hbWU9IkNQMSB3aXRoIGFsbCBlbGVtZW50cyIgbWVhc3VyZW1lbnRVbml0PSJQaXhlbCI+Ci0gICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246UGFnZVN0eWxlIiB4bWk6aWQ9Il9JSGdKMHV4NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246R3VpZGVTdHlsZSIgeG1pOmlkPSJfSUhnSjAteDRFZHUyT282cS1uSFdnZyIvPgotICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkRlc2NyaXB0aW9uU3R5bGUiIHhtaTppZD0iX0lIZ0oxT3g0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgPC9ub3RhdGlvbjpEaWFncmFtPgotICA8b3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw6QWN0aXZpdHlEZXRhaWxEaWFncmFtIHhtaTppZD0iX0lIc1hFT3g0RWR1Mk9vNnEtbkhXZ2ciPgotICAgIDxsaW5rZWRFbGVtZW50IHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlBoYXNlIiBocmVmPSJ1bWE6Ly9fNHNDdHNEemdFZHE1eXNGT05yMUJHUSNfRGFrUWNEemlFZHE1eXNGT05yMUJHUSIvPgotICA8L29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOkFjdGl2aXR5RGV0YWlsRGlhZ3JhbT4KLSAgPG5vdGF0aW9uOkRpYWdyYW0geG1pOmlkPSJfSUhzWEVleDRFZHUyT282cS1uSFdnZyIgdHlwZT0iQUREIiBlbGVtZW50PSJfSUhzWEVPeDRFZHUyT282cS1uSFdnZyIgbmFtZT0iUGhhc2UxIiBtZWFzdXJlbWVudFVuaXQ9IlBpeGVsIj4KLSAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpQYWdlU3R5bGUiIHhtaTppZD0iX0lIc1hFdXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpHdWlkZVN0eWxlIiB4bWk6aWQ9Il9JSHNYRS14NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RGVzY3JpcHRpb25TdHlsZSIgeG1pOmlkPSJfSUhzWEZPeDRFZHUyT282cS1uSFdnZyIvPgotICA8L25vdGF0aW9uOkRpYWdyYW0+Ci0gIDxvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDpBY3Rpdml0eURldGFpbERpYWdyYW0geG1pOmlkPSJfSUhzWEZleDRFZHUyT282cS1uSFdnZyI+Ci0gICAgPGxpbmtlZEVsZW1lbnQgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6SXRlcmF0aW9uIiBocmVmPSJ1bWE6Ly9fNHNDdHNEemdFZHE1eXNGT05yMUJHUSNfRUZWcndUemlFZHE1eXNGT05yMUJHUSIvPgotICA8L29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOkFjdGl2aXR5RGV0YWlsRGlhZ3JhbT4KLSAgPG5vdGF0aW9uOkRpYWdyYW0geG1pOmlkPSJfSUhzWEZ1eDRFZHUyT282cS1uSFdnZyIgdHlwZT0iQUREIiBlbGVtZW50PSJfSUhzWEZleDRFZHUyT282cS1uSFdnZyIgbmFtZT0iSXRlcmF0aW9uMSIgbWVhc3VyZW1lbnRVbml0PSJQaXhlbCI+Ci0gICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246UGFnZVN0eWxlIiB4bWk6aWQ9Il9JSHNYRi14NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246R3VpZGVTdHlsZSIgeG1pOmlkPSJfSUhzWEdPeDRFZHUyT282cS1uSFdnZyIvPgotICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkRlc2NyaXB0aW9uU3R5bGUiIHhtaTppZD0iX0lIc1hHZXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgPC9ub3RhdGlvbjpEaWFncmFtPgotICA8b3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw6QWN0aXZpdHlEZXRhaWxEaWFncmFtIHhtaTppZD0iX0lNRnU2ZXg0RWR1Mk9vNnEtbkhXZ2ciPgotICAgIDxsaW5rZWRFbGVtZW50IHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkFjdGl2aXR5IiBocmVmPSJ1bWE6Ly9fNHNDdHNEemdFZHE1eXNGT05yMUJHUSNfRTczcklUemlFZHE1eXNGT05yMUJHUSIvPgotICAgIDxub2RlcyB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw6Um9sZVRhc2tDb21wb3NpdGUiIHhtaTppZD0iX0lNRnU2dXg0RWR1Mk9vNnEtbkhXZ2ciPgotICAgICAgPGxpbmtlZEVsZW1lbnQgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Um9sZURlc2NyaXB0b3IiIGhyZWY9InVtYTovL180c0N0c0R6Z0VkcTV5c0ZPTnIxQkdRI19QMXNVWUR6aUVkcTV5c0ZPTnIxQkdRIi8+Ci0gICAgICA8bm9kZXMgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOlJvbGVOb2RlIiB4bWk6aWQ9Il9JTUZ1Ni14NEVkdTJPbzZxLW5IV2dnIiBuYW1lPSJyb2xlRGVzYzEiPgotICAgICAgICA8bGlua2VkRWxlbWVudCB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpSb2xlRGVzY3JpcHRvciIgaHJlZj0idW1hOi8vXzRzQ3RzRHpnRWRxNXlzRk9OcjFCR1EjX1Axc1VZRHppRWRxNXlzRk9OcjFCR1EiLz4KLSAgICAgIDwvbm9kZXM+Ci0gICAgICA8bm9kZXMgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOlRhc2tOb2RlIiB4bWk6aWQ9Il9JTUZ1N094NEVkdTJPbzZxLW5IV2dnIiBpbmNvbWluZ0Nvbm5lY3Rpb25zPSJfSU1GdTcteDRFZHUyT282cS1uSFdnZyIgbmFtZT0iVGFza19MaW5rZWRfVG9fVGFza0ExIj4KLSAgICAgICAgPGxpbmtlZEVsZW1lbnQgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VGFza0Rlc2NyaXB0b3IiIGhyZWY9InVtYTovL180c0N0c0R6Z0VkcTV5c0ZPTnIxQkdRI19GcnRNb0R6aUVkcTV5c0ZPTnIxQkdRIi8+Ci0gICAgICAgIDxvdXRnb2luZ0Nvbm5lY3Rpb25zIHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDpMaW5rIiB4bWk6aWQ9Il9JTUZ1N2V4NEVkdTJPbzZxLW5IV2dnIiB0YXJnZXQ9Il9JTUZ1OGV4NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8L25vZGVzPgotICAgIDwvbm9kZXM+Ci0gICAgPG5vZGVzIHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDpXb3JrUHJvZHVjdENvbXBvc2l0ZSIgeG1pOmlkPSJfSU1GdTd1eDRFZHUyT282cS1uSFdnZyIgdHlwZT0iMSI+Ci0gICAgICA8bGlua2VkRWxlbWVudCB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpUYXNrRGVzY3JpcHRvciIgaHJlZj0idW1hOi8vXzRzQ3RzRHpnRWRxNXlzRk9OcjFCR1EjX0ZydE1vRHppRWRxNXlzRk9OcjFCR1EiLz4KLSAgICAgIDxvdXRnb2luZ0Nvbm5lY3Rpb25zIHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDpMaW5rIiB4bWk6aWQ9Il9JTUZ1Ny14NEVkdTJPbzZxLW5IV2dnIiB0YXJnZXQ9Il9JTUZ1N094NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8bm9kZXMgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOldvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGUiIHhtaTppZD0iX0lNRnU4T3g0RWR1Mk9vNnEtbkhXZ2ciIG5hbWU9IndwRGVzYzEgaXMgbGlua2VkIHRvIGFydGlmYWN0Ij4KLSAgICAgICAgPGxpbmtlZEVsZW1lbnQgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6V29ya1Byb2R1Y3REZXNjcmlwdG9yIiBocmVmPSJ1bWE6Ly9fNHNDdHNEemdFZHE1eXNGT05yMUJHUSNfU1VHUWdEemlFZHE1eXNGT05yMUJHUSIvPgotICAgICAgPC9ub2Rlcz4KLSAgICA8L25vZGVzPgotICAgIDxub2RlcyB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw6V29ya1Byb2R1Y3RDb21wb3NpdGUiIHhtaTppZD0iX0lNRnU4ZXg0RWR1Mk9vNnEtbkhXZ2ciIGluY29taW5nQ29ubmVjdGlvbnM9Il9JTUZ1N2V4NEVkdTJPbzZxLW5IV2dnIiB0eXBlPSIyIj4KLSAgICAgIDxsaW5rZWRFbGVtZW50IHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlRhc2tEZXNjcmlwdG9yIiBocmVmPSJ1bWE6Ly9fNHNDdHNEemdFZHE1eXNGT05yMUJHUSNfRnJ0TW9EemlFZHE1eXNGT05yMUJHUSIvPgotICAgICAgPG5vZGVzIHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDpXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlIiB4bWk6aWQ9Il9JTUZ1OHV4NEVkdTJPbzZxLW5IV2dnIiBuYW1lPSJ3cERlc2MyIGxpbmtlZCB0byBkZWxpdmVyYWJsZSI+Ci0gICAgICAgIDxsaW5rZWRFbGVtZW50IHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOldvcmtQcm9kdWN0RGVzY3JpcHRvciIgaHJlZj0idW1hOi8vXzRzQ3RzRHpnRWRxNXlzRk9OcjFCR1EjX1RDdTRJRHppRWRxNXlzRk9OcjFCR1EiLz4KLSAgICAgIDwvbm9kZXM+Ci0gICAgPC9ub2Rlcz4KLSAgICA8bm9kZXMgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOlJvbGVUYXNrQ29tcG9zaXRlIiB4bWk6aWQ9Il9JTUZ1OC14NEVkdTJPbzZxLW5IV2dnIj4KLSAgICAgIDxsaW5rZWRFbGVtZW50IHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlJvbGVEZXNjcmlwdG9yIiBocmVmPSJ1bWE6Ly9fNHNDdHNEemdFZHE1eXNGT05yMUJHUSNfUTk5a0FEemlFZHE1eXNGT05yMUJHUSIvPgotICAgICAgPG5vZGVzIHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDpSb2xlTm9kZSIgeG1pOmlkPSJfSU1GdTlPeDRFZHUyT282cS1uSFdnZyIgbmFtZT0icm9sZURlc2MyIj4KLSAgICAgICAgPGxpbmtlZEVsZW1lbnQgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Um9sZURlc2NyaXB0b3IiIGhyZWY9InVtYTovL180c0N0c0R6Z0VkcTV5c0ZPTnIxQkdRI19ROTlrQUR6aUVkcTV5c0ZPTnIxQkdRIi8+Ci0gICAgICA8L25vZGVzPgotICAgICAgPG5vZGVzIHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDpUYXNrTm9kZSIgeG1pOmlkPSJfSU1GdTlleDRFZHUyT282cS1uSFdnZyIgaW5jb21pbmdDb25uZWN0aW9ucz0iX0lNRnUtT3g0RWR1Mk9vNnEtbkhXZ2ciIG5hbWU9IlRhc2tfTGlua2VkX1RvX3Rhc2tBMiI+Ci0gICAgICAgIDxsaW5rZWRFbGVtZW50IHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlRhc2tEZXNjcmlwdG9yIiBocmVmPSJ1bWE6Ly9fNHNDdHNEemdFZHE1eXNGT05yMUJHUSNfTHdMUWdEemlFZHE1eXNGT05yMUJHUSIvPgotICAgICAgICA8b3V0Z29pbmdDb25uZWN0aW9ucyB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw6TGluayIgeG1pOmlkPSJfSU1GdTl1eDRFZHUyT282cS1uSFdnZyIgdGFyZ2V0PSJfSU1GdS11eDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPC9ub2Rlcz4KLSAgICA8L25vZGVzPgotICAgIDxub2RlcyB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw6V29ya1Byb2R1Y3RDb21wb3NpdGUiIHhtaTppZD0iX0lNRnU5LXg0RWR1Mk9vNnEtbkhXZ2ciIHR5cGU9IjEiPgotICAgICAgPGxpbmtlZEVsZW1lbnQgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VGFza0Rlc2NyaXB0b3IiIGhyZWY9InVtYTovL180c0N0c0R6Z0VkcTV5c0ZPTnIxQkdRI19Md0xRZ0R6aUVkcTV5c0ZPTnIxQkdRIi8+Ci0gICAgICA8b3V0Z29pbmdDb25uZWN0aW9ucyB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw6TGluayIgeG1pOmlkPSJfSU1GdS1PeDRFZHUyT282cS1uSFdnZyIgdGFyZ2V0PSJfSU1GdTlleDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPG5vZGVzIHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDpXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlIiB4bWk6aWQ9Il9JTUZ1LWV4NEVkdTJPbzZxLW5IV2dnIiBuYW1lPSJ3cERlc2MyIGxpbmtlZCB0byBkZWxpdmVyYWJsZSI+Ci0gICAgICAgIDxsaW5rZWRFbGVtZW50IHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOldvcmtQcm9kdWN0RGVzY3JpcHRvciIgaHJlZj0idW1hOi8vXzRzQ3RzRHpnRWRxNXlzRk9OcjFCR1EjX1RDdTRJRHppRWRxNXlzRk9OcjFCR1EiLz4KLSAgICAgIDwvbm9kZXM+Ci0gICAgPC9ub2Rlcz4KLSAgICA8bm9kZXMgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOldvcmtQcm9kdWN0Q29tcG9zaXRlIiB4bWk6aWQ9Il9JTUZ1LXV4NEVkdTJPbzZxLW5IV2dnIiBpbmNvbWluZ0Nvbm5lY3Rpb25zPSJfSU1GdTl1eDRFZHUyT282cS1uSFdnZyIgdHlwZT0iMiI+Ci0gICAgICA8bGlua2VkRWxlbWVudCB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpUYXNrRGVzY3JpcHRvciIgaHJlZj0idW1hOi8vXzRzQ3RzRHpnRWRxNXlzRk9OcjFCR1EjX0x3TFFnRHppRWRxNXlzRk9OcjFCR1EiLz4KLSAgICAgIDxub2RlcyB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw6V29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZSIgeG1pOmlkPSJfSU1GdS0teDRFZHUyT282cS1uSFdnZyIgbmFtZT0id3BEZXNjMSBpcyBsaW5rZWQgdG8gYXJ0aWZhY3QiPgotICAgICAgICA8bGlua2VkRWxlbWVudCB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpXb3JrUHJvZHVjdERlc2NyaXB0b3IiIGhyZWY9InVtYTovL180c0N0c0R6Z0VkcTV5c0ZPTnIxQkdRI19TVUdRZ0R6aUVkcTV5c0ZPTnIxQkdRIi8+Ci0gICAgICA8L25vZGVzPgotICAgIDwvbm9kZXM+Ci0gIDwvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw6QWN0aXZpdHlEZXRhaWxEaWFncmFtPgotICA8bm90YXRpb246RGlhZ3JhbSB4bWk6aWQ9Il9JTUZ1X094NEVkdTJPbzZxLW5IV2dnIiB0eXBlPSJBREQiIGVsZW1lbnQ9Il9JTUZ1NmV4NEVkdTJPbzZxLW5IV2dnIiBuYW1lPSJBY3Rpdml0eTEiIG1lYXN1cmVtZW50VW5pdD0iUGl4ZWwiPgotICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfSVVaV1VPeDRFZHUyT282cS1uSFdnZyIgdHlwZT0iMTAwMSIgZWxlbWVudD0iX0lNRnU2dXg0RWR1Mk9vNnEtbkhXZ2ciPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246Rm9udFN0eWxlIiB4bWk6aWQ9Il9JVVpXVWV4NEVkdTJPbzZxLW5IV2dnIiBmb250TmFtZT0iQXJpYWwiIGZvbnRIZWlnaHQ9IjgiLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkRlc2NyaXB0aW9uU3R5bGUiIHhtaTppZD0iX0lVWldVdXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkZpbGxTdHlsZSIgeG1pOmlkPSJfSVVaV1UteDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246TGluZVN0eWxlIiB4bWk6aWQ9Il9JVVpXVk94NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9JVkVFc094NEVkdTJPbzZxLW5IV2dnIiB4PSIxMCIgeT0iMTg2Ii8+Ci0gICAgPC9jaGlsZHJlbj4KLSAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOk5vZGUiIHhtaTppZD0iX0lWUVI4T3g0RWR1Mk9vNnEtbkhXZ2ciIHR5cGU9IjEwMDIiIGVsZW1lbnQ9Il9JTUZ1N3V4NEVkdTJPbzZxLW5IV2dnIj4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkZvbnRTdHlsZSIgeG1pOmlkPSJfSVZRUjhleDRFZHUyT282cS1uSFdnZyIgZm9udE5hbWU9IkFyaWFsIiBmb250SGVpZ2h0PSI4Ii8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpEZXNjcmlwdGlvblN0eWxlIiB4bWk6aWQ9Il9JVlFSOHV4NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpGaWxsU3R5bGUiIHhtaTppZD0iX0lWUVI4LXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkxpbmVTdHlsZSIgeG1pOmlkPSJfSVZRUjlPeDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSVZRUjl1eDRFZHUyT282cS1uSFdnZyIgeD0iLTEyIiB5PSI0OSIgd2lkdGg9IjE1MSIvPgotICAgIDwvY2hpbGRyZW4+Ci0gICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il9JVldZa094NEVkdTJPbzZxLW5IV2dnIiB0eXBlPSIxMDAyIiBlbGVtZW50PSJfSU1GdThleDRFZHUyT282cS1uSFdnZyI+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpGb250U3R5bGUiIHhtaTppZD0iX0lWV1lrZXg0RWR1Mk9vNnEtbkhXZ2ciIGZvbnROYW1lPSJBcmlhbCIgZm9udEhlaWdodD0iOCIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RGVzY3JpcHRpb25TdHlsZSIgeG1pOmlkPSJfSVZXWWt1eDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RmlsbFN0eWxlIiB4bWk6aWQ9Il9JVldZay14NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpMaW5lU3R5bGUiIHhtaTppZD0iX0lWV1lsT3g0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0lWV1lsdXg0RWR1Mk9vNnEtbkhXZ2ciIHg9IjY5IiB5PSIyOTciIHdpZHRoPSI5NiIvPgotICAgIDwvY2hpbGRyZW4+Ci0gICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il9JVldZbC14NEVkdTJPbzZxLW5IV2dnIiB0eXBlPSIxMDAxIiBlbGVtZW50PSJfSU1GdTgteDRFZHUyT282cS1uSFdnZyI+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpGb250U3R5bGUiIHhtaTppZD0iX0lWV1ltT3g0RWR1Mk9vNnEtbkhXZ2ciIGZvbnROYW1lPSJBcmlhbCIgZm9udEhlaWdodD0iOCIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RGVzY3JpcHRpb25TdHlsZSIgeG1pOmlkPSJfSVZXWW1leDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RmlsbFN0eWxlIiB4bWk6aWQ9Il9JVldZbXV4NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpMaW5lU3R5bGUiIHhtaTppZD0iX0lWV1ltLXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0lWV1luZXg0RWR1Mk9vNnEtbkhXZ2ciIHg9IjIxMSIgeT0iMTI5IiB3aWR0aD0iMjEwIiBoZWlnaHQ9IjUyIi8+Ci0gICAgPC9jaGlsZHJlbj4KLSAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOk5vZGUiIHhtaTppZD0iX0lWV1ludXg0RWR1Mk9vNnEtbkhXZ2ciIHR5cGU9IjEwMDIiIGVsZW1lbnQ9Il9JTUZ1OS14NEVkdTJPbzZxLW5IV2dnIj4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkZvbnRTdHlsZSIgeG1pOmlkPSJfSVZXWW4teDRFZHUyT282cS1uSFdnZyIgZm9udE5hbWU9IkFyaWFsIiBmb250SGVpZ2h0PSI4Ii8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpEZXNjcmlwdGlvblN0eWxlIiB4bWk6aWQ9Il9JVldZb094NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpGaWxsU3R5bGUiIHhtaTppZD0iX0lWV1lvZXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkxpbmVTdHlsZSIgeG1pOmlkPSJfSVZXWW91eDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSVZXWXBPeDRFZHUyT282cS1uSFdnZyIgeD0iMzQyIiB5PSI1MiIgd2lkdGg9IjYzIiBoZWlnaHQ9IjUyIi8+Ci0gICAgPC9jaGlsZHJlbj4KLSAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOk5vZGUiIHhtaTppZD0iX0lWV1lwZXg0RWR1Mk9vNnEtbkhXZ2ciIHR5cGU9IjEwMDIiIGVsZW1lbnQ9Il9JTUZ1LXV4NEVkdTJPbzZxLW5IV2dnIj4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkZvbnRTdHlsZSIgeG1pOmlkPSJfSVZXWXB1eDRFZHUyT282cS1uSFdnZyIgZm9udE5hbWU9IkFyaWFsIiBmb250SGVpZ2h0PSI4Ii8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpEZXNjcmlwdGlvblN0eWxlIiB4bWk6aWQ9Il9JVldZcC14NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpGaWxsU3R5bGUiIHhtaTppZD0iX0lWV1lxT3g0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkxpbmVTdHlsZSIgeG1pOmlkPSJfSVZXWXFleDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSVZXWXEteDRFZHUyT282cS1uSFdnZyIgeD0iMjc0IiB5PSIyNTUiIHdpZHRoPSIxNTQiIGhlaWdodD0iNTIiLz4KLSAgICA8L2NoaWxkcmVuPgotICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOlBhZ2VTdHlsZSIgeG1pOmlkPSJfSU1GdV9leDRFZHUyT282cS1uSFdnZyIvPgotICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkd1aWRlU3R5bGUiIHhtaTppZD0iX0lNRnVfdXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpEZXNjcmlwdGlvblN0eWxlIiB4bWk6aWQ9Il9JTUZ1Xy14NEVkdTJPbzZxLW5IV2dnIi8+Ci0gIDwvbm90YXRpb246RGlhZ3JhbT4KLSAgPG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOkFjdGl2aXR5RGV0YWlsRGlhZ3JhbSB4bWk6aWQ9Il9JVmlsMnV4NEVkdTJPbzZxLW5IV2dnIj4KLSAgICA8bGlua2VkRWxlbWVudCB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpBY3Rpdml0eSIgaHJlZj0idW1hOi8vXzRzQ3RzRHpnRWRxNXlzRk9OcjFCR1EjX0JTNmdFVHpsRWRxNXlzRk9OcjFCR1EiLz4KLSAgICA8bm9kZXMgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOlJvbGVUYXNrQ29tcG9zaXRlIiB4bWk6aWQ9Il9JVmlsMi14NEVkdTJPbzZxLW5IV2dnIj4KLSAgICAgIDxsaW5rZWRFbGVtZW50IHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlJvbGVEZXNjcmlwdG9yIiBocmVmPSJ1bWE6Ly9fNHNDdHNEemdFZHE1eXNGT05yMUJHUSNfMERrNk1FREVFZHFPOU0zZnVrWUFfQSIvPgotICAgIDwvbm9kZXM+Ci0gICAgPG5vZGVzIHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDpXb3JrUHJvZHVjdENvbXBvc2l0ZSIgeG1pOmlkPSJfSVZpbDNPeDRFZHUyT282cS1uSFdnZyIgaW5jb21pbmdDb25uZWN0aW9ucz0iX0lWaWwzZXg0RWR1Mk9vNnEtbkhXZ2ciIHR5cGU9IjEiPgotICAgICAgPGxpbmtlZEVsZW1lbnQgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VGFza0Rlc2NyaXB0b3IiIGhyZWY9InVtYTovL180c0N0c0R6Z0VkcTV5c0ZPTnIxQkdRI18wRFJfUUVERUVkcU85TTNmdWtZQV9BIi8+Ci0gICAgICA8b3V0Z29pbmdDb25uZWN0aW9ucyB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw6TGluayIgeG1pOmlkPSJfSVZpbDNleDRFZHUyT282cS1uSFdnZyIgdGFyZ2V0PSJfSVZpbDNPeDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPG5vZGVzIHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDpXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlIiB4bWk6aWQ9Il9JVmlsM3V4NEVkdTJPbzZxLW5IV2dnIiBuYW1lPSJTdWJfQXJ0aWZhY3QgQTEuMSBwcmVzZW50Ij4KLSAgICAgICAgPGxpbmtlZEVsZW1lbnQgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6V29ya1Byb2R1Y3REZXNjcmlwdG9yIiBocmVmPSJ1bWE6Ly9fNHNDdHNEemdFZHE1eXNGT05yMUJHUSNfMER1ck1FREVFZHFPOU0zZnVrWUFfQSIvPgotICAgICAgPC9ub2Rlcz4KLSAgICAgIDxub2RlcyB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw6V29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZSIgeG1pOmlkPSJfSVZpbDMteDRFZHUyT282cS1uSFdnZyIgbmFtZT0iQXJ0aWZhY3QgQTEgcHJlc2VudCI+Ci0gICAgICAgIDxsaW5rZWRFbGVtZW50IHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOldvcmtQcm9kdWN0RGVzY3JpcHRvciIgaHJlZj0idW1hOi8vXzRzQ3RzRHpnRWRxNXlzRk9OcjFCR1EjXzBEdXJNVURFRWRxTzlNM2Z1a1lBX0EiLz4KLSAgICAgIDwvbm9kZXM+Ci0gICAgPC9ub2Rlcz4KLSAgICA8bm9kZXMgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOldvcmtQcm9kdWN0Q29tcG9zaXRlIiB4bWk6aWQ9Il9JVmlsNE94NEVkdTJPbzZxLW5IV2dnIiB0eXBlPSIyIj4KLSAgICAgIDxsaW5rZWRFbGVtZW50IHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlRhc2tEZXNjcmlwdG9yIiBocmVmPSJ1bWE6Ly9fNHNDdHNEemdFZHE1eXNGT05yMUJHUSNfMERSX1FFREVFZHFPOU0zZnVrWUFfQSIvPgotICAgICAgPG5vZGVzIHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDpXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlIiB4bWk6aWQ9Il9JVmlsNGV4NEVkdTJPbzZxLW5IV2dnIiBuYW1lPSJPdXRjb21lIEExIHByZXNlbnQiPgotICAgICAgICA8bGlua2VkRWxlbWVudCB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpXb3JrUHJvZHVjdERlc2NyaXB0b3IiIGhyZWY9InVtYTovL180c0N0c0R6Z0VkcTV5c0ZPTnIxQkdRI18wRHVyTTBERUVkcU85TTNmdWtZQV9BIi8+Ci0gICAgICA8L25vZGVzPgotICAgIDwvbm9kZXM+Ci0gICAgPG5vZGVzIHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDpSb2xlVGFza0NvbXBvc2l0ZSIgeG1pOmlkPSJfSVZpbDR1eDRFZHUyT282cS1uSFdnZyI+Ci0gICAgICA8bGlua2VkRWxlbWVudCB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpSb2xlRGVzY3JpcHRvciIgaHJlZj0idW1hOi8vXzRzQ3RzRHpnRWRxNXlzRk9OcjFCR1EjXzBEazZNVURFRWRxTzlNM2Z1a1lBX0EiLz4KLSAgICA8L25vZGVzPgotICAgIDxub2RlcyB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw6V29ya1Byb2R1Y3RDb21wb3NpdGUiIHhtaTppZD0iX0lWaWw0LXg0RWR1Mk9vNnEtbkhXZ2ciIGluY29taW5nQ29ubmVjdGlvbnM9Il9JVmlsNU94NEVkdTJPbzZxLW5IV2dnIiB0eXBlPSIxIj4KLSAgICAgIDxsaW5rZWRFbGVtZW50IHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlRhc2tEZXNjcmlwdG9yIiBocmVmPSJ1bWE6Ly9fNHNDdHNEemdFZHE1eXNGT05yMUJHUSNfMjg4N0VFREVFZHFPOU0zZnVrWUFfQSIvPgotICAgICAgPG91dGdvaW5nQ29ubmVjdGlvbnMgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOkxpbmsiIHhtaTppZD0iX0lWaWw1T3g0RWR1Mk9vNnEtbkhXZ2ciIHRhcmdldD0iX0lWaWw0LXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxub2RlcyB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw6V29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZSIgeG1pOmlkPSJfSVZpbDVleDRFZHUyT282cS1uSFdnZyIgbmFtZT0iQXJ0aWZhY3QgQTIgcHJlc2VudCI+Ci0gICAgICAgIDxsaW5rZWRFbGVtZW50IHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOldvcmtQcm9kdWN0RGVzY3JpcHRvciIgaHJlZj0idW1hOi8vXzRzQ3RzRHpnRWRxNXlzRk9OcjFCR1EjXzI5Wm5BRURFRWRxTzlNM2Z1a1lBX0EiLz4KLSAgICAgIDwvbm9kZXM+Ci0gICAgPC9ub2Rlcz4KLSAgICA8bm9kZXMgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOldvcmtQcm9kdWN0Q29tcG9zaXRlIiB4bWk6aWQ9Il9JVmlsNXV4NEVkdTJPbzZxLW5IV2dnIiB0eXBlPSIyIj4KLSAgICAgIDxsaW5rZWRFbGVtZW50IHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlRhc2tEZXNjcmlwdG9yIiBocmVmPSJ1bWE6Ly9fNHNDdHNEemdFZHE1eXNGT05yMUJHUSNfMjg4N0VFREVFZHFPOU0zZnVrWUFfQSIvPgotICAgICAgPG5vZGVzIHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDpXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlIiB4bWk6aWQ9Il9JVmlsNS14NEVkdTJPbzZxLW5IV2dnIiBuYW1lPSJPdXRjb21lIEEyIHByZXNlbnQiPgotICAgICAgICA8bGlua2VkRWxlbWVudCB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpXb3JrUHJvZHVjdERlc2NyaXB0b3IiIGhyZWY9InVtYTovL180c0N0c0R6Z0VkcTV5c0ZPTnIxQkdRI18yOVpuQWtERUVkcU85TTNmdWtZQV9BIi8+Ci0gICAgICA8L25vZGVzPgotICAgIDwvbm9kZXM+Ci0gIDwvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw6QWN0aXZpdHlEZXRhaWxEaWFncmFtPgotICA8bm90YXRpb246RGlhZ3JhbSB4bWk6aWQ9Il9JVmlsNk94NEVkdTJPbzZxLW5IV2dnIiB0eXBlPSJBREQiIGVsZW1lbnQ9Il9JVmlsMnV4NEVkdTJPbzZxLW5IV2dnIiBuYW1lPSJBY3Rpdml0eTIiIG1lYXN1cmVtZW50VW5pdD0iUGl4ZWwiPgotICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfSVZpbDdPeDRFZHUyT282cS1uSFdnZyIgdHlwZT0iMTAwMSIgZWxlbWVudD0iX0lWaWwyLXg0RWR1Mk9vNnEtbkhXZ2ciPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246Rm9udFN0eWxlIiB4bWk6aWQ9Il9JVmlsN2V4NEVkdTJPbzZxLW5IV2dnIiBmb250TmFtZT0iQXJpYWwiIGZvbnRIZWlnaHQ9IjgiLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkRlc2NyaXB0aW9uU3R5bGUiIHhtaTppZD0iX0lWaWw3dXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkZpbGxTdHlsZSIgeG1pOmlkPSJfSVZpbDcteDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246TGluZVN0eWxlIiB4bWk6aWQ9Il9JVmlsOE94NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9JVmlsOHV4NEVkdTJPbzZxLW5IV2dnIiB4PSItMSIgeT0iLTEiLz4KLSAgICA8L2NoaWxkcmVuPgotICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfSVZpbDgteDRFZHUyT282cS1uSFdnZyIgdHlwZT0iMTAwMiIgZWxlbWVudD0iX0lWaWwzT3g0RWR1Mk9vNnEtbkhXZ2ciPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246Rm9udFN0eWxlIiB4bWk6aWQ9Il9JVmlsOU94NEVkdTJPbzZxLW5IV2dnIiBmb250TmFtZT0iQXJpYWwiIGZvbnRIZWlnaHQ9IjgiLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkRlc2NyaXB0aW9uU3R5bGUiIHhtaTppZD0iX0lWaWw5ZXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkZpbGxTdHlsZSIgeG1pOmlkPSJfSVZpbDl1eDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246TGluZVN0eWxlIiB4bWk6aWQ9Il9JVmlsOS14NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9JVmlsLWV4NEVkdTJPbzZxLW5IV2dnIiB4PSItMSIgeT0iLTEiLz4KLSAgICA8L2NoaWxkcmVuPgotICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfSVZpbC11eDRFZHUyT282cS1uSFdnZyIgdHlwZT0iMTAwMiIgZWxlbWVudD0iX0lWaWw0T3g0RWR1Mk9vNnEtbkhXZ2ciPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246Rm9udFN0eWxlIiB4bWk6aWQ9Il9JVmlsLS14NEVkdTJPbzZxLW5IV2dnIiBmb250TmFtZT0iQXJpYWwiIGZvbnRIZWlnaHQ9IjgiLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkRlc2NyaXB0aW9uU3R5bGUiIHhtaTppZD0iX0lWaWxfT3g0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkZpbGxTdHlsZSIgeG1pOmlkPSJfSVZpbF9leDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246TGluZVN0eWxlIiB4bWk6aWQ9Il9JVmlsX3V4NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9JVmltQU94NEVkdTJPbzZxLW5IV2dnIiB4PSItMSIgeT0iLTEiLz4KLSAgICA8L2NoaWxkcmVuPgotICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfSVZpbUFleDRFZHUyT282cS1uSFdnZyIgdHlwZT0iMTAwMSIgZWxlbWVudD0iX0lWaWw0dXg0RWR1Mk9vNnEtbkhXZ2ciPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246Rm9udFN0eWxlIiB4bWk6aWQ9Il9JVmltQXV4NEVkdTJPbzZxLW5IV2dnIiBmb250TmFtZT0iQXJpYWwiIGZvbnRIZWlnaHQ9IjgiLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkRlc2NyaXB0aW9uU3R5bGUiIHhtaTppZD0iX0lWaW1BLXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkZpbGxTdHlsZSIgeG1pOmlkPSJfSVZpbUJPeDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246TGluZVN0eWxlIiB4bWk6aWQ9Il9JVmltQmV4NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9JVmltQi14NEVkdTJPbzZxLW5IV2dnIiB4PSItMSIgeT0iLTEiLz4KLSAgICA8L2NoaWxkcmVuPgotICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfSVZpbUNPeDRFZHUyT282cS1uSFdnZyIgdHlwZT0iMTAwMiIgZWxlbWVudD0iX0lWaWw0LXg0RWR1Mk9vNnEtbkhXZ2ciPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246Rm9udFN0eWxlIiB4bWk6aWQ9Il9JVmltQ2V4NEVkdTJPbzZxLW5IV2dnIiBmb250TmFtZT0iQXJpYWwiIGZvbnRIZWlnaHQ9IjgiLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkRlc2NyaXB0aW9uU3R5bGUiIHhtaTppZD0iX0lWaW1DdXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkZpbGxTdHlsZSIgeG1pOmlkPSJfSVZpbUMteDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246TGluZVN0eWxlIiB4bWk6aWQ9Il9JVmltRE94NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9JVmltRHV4NEVkdTJPbzZxLW5IV2dnIiB4PSItMSIgeT0iLTEiLz4KLSAgICA8L2NoaWxkcmVuPgotICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfSVZpbUQteDRFZHUyT282cS1uSFdnZyIgdHlwZT0iMTAwMiIgZWxlbWVudD0iX0lWaWw1dXg0RWR1Mk9vNnEtbkhXZ2ciPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246Rm9udFN0eWxlIiB4bWk6aWQ9Il9JVmltRU94NEVkdTJPbzZxLW5IV2dnIiBmb250TmFtZT0iQXJpYWwiIGZvbnRIZWlnaHQ9IjgiLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkRlc2NyaXB0aW9uU3R5bGUiIHhtaTppZD0iX0lWaW1FZXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkZpbGxTdHlsZSIgeG1pOmlkPSJfSVZpbUV1eDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246TGluZVN0eWxlIiB4bWk6aWQ9Il9JVmltRS14NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9JVmltRmV4NEVkdTJPbzZxLW5IV2dnIiB4PSItMSIgeT0iLTEiLz4KLSAgICA8L2NoaWxkcmVuPgotICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOlBhZ2VTdHlsZSIgeG1pOmlkPSJfSVZpbDZleDRFZHUyT282cS1uSFdnZyIvPgotICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkd1aWRlU3R5bGUiIHhtaTppZD0iX0lWaWw2dXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpEZXNjcmlwdGlvblN0eWxlIiB4bWk6aWQ9Il9JVmlsNi14NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgPGVkZ2VzIHhtaTp0eXBlPSJub3RhdGlvbjpFZGdlIiB4bWk6aWQ9Il9JV0hOa094NEVkdTJPbzZxLW5IV2dnIiB0eXBlPSIzMDAxIiBlbGVtZW50PSJfSVZpbDNleDRFZHUyT282cS1uSFdnZyIgc291cmNlPSJfSVZpbDgteDRFZHUyT282cS1uSFdnZyIgdGFyZ2V0PSJfSVZpbDgteDRFZHUyT282cS1uSFdnZyI+Ci0gICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOk5vZGUiIHhtaTppZD0iX0lYY3FVT3g0RWR1Mk9vNnEtbkhXZ2ciIHR5cGU9IjQwMDQiPgotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0lYY3FVZXg0RWR1Mk9vNnEtbkhXZ2ciIHk9IjQwIi8+Ci0gICAgICA8L2NoaWxkcmVuPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246Um91dGluZ1N0eWxlIiB4bWk6aWQ9Il9JV0hOa2V4NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpGb250U3R5bGUiIHhtaTppZD0iX0lXSE5rdXg0RWR1Mk9vNnEtbkhXZ2ciIGZvbnROYW1lPSJBcmlhbCIgZm9udEhlaWdodD0iOCIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246TGluZVN0eWxlIiB4bWk6aWQ9Il9JV0hOay14NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9JYUNFUU94NEVkdTJPbzZxLW5IV2dnIiBwb2ludHM9IlswLCAwLCAwLCAwXSRbMCwgMCwgMCwgMF0iLz4KLSAgICA8L2VkZ2VzPgotICAgIDxlZGdlcyB4bWk6dHlwZT0ibm90YXRpb246RWRnZSIgeG1pOmlkPSJfSWFDRVFleDRFZHUyT282cS1uSFdnZyIgdHlwZT0iMzAwMSIgZWxlbWVudD0iX0lWaWw1T3g0RWR1Mk9vNnEtbkhXZ2ciIHNvdXJjZT0iX0lWaW1DT3g0RWR1Mk9vNnEtbkhXZ2ciIHRhcmdldD0iX0lWaW1DT3g0RWR1Mk9vNnEtbkhXZ2ciPgotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il9JYUlLNE94NEVkdTJPbzZxLW5IV2dnIiB0eXBlPSI0MDA0Ij4KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9JYUlLNGV4NEVkdTJPbzZxLW5IV2dnIiB5PSI0MCIvPgotICAgICAgPC9jaGlsZHJlbj4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOlJvdXRpbmdTdHlsZSIgeG1pOmlkPSJfSWFDRVF1eDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246Rm9udFN0eWxlIiB4bWk6aWQ9Il9JYUNFUS14NEVkdTJPbzZxLW5IV2dnIiBmb250TmFtZT0iQXJpYWwiIGZvbnRIZWlnaHQ9IjgiLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkxpbmVTdHlsZSIgeG1pOmlkPSJfSWFDRVJPeDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSWFJSzR1eDRFZHUyT282cS1uSFdnZyIgcG9pbnRzPSJbMCwgMCwgMCwgMF0kWzAsIDAsIDAsIDBdIi8+Ci0gICAgPC9lZGdlcz4KLSAgPC9ub3RhdGlvbjpEaWFncmFtPgotPC94bWk6WE1JPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2NhcGFiaWxpdHlwYXR0ZXJucy9DUDEgd2l0aCBhbGwgZWxlbWVudHMvbW9kZWwueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2NhcGFiaWxpdHlwYXR0ZXJucy9DUDEgd2l0aCBhbGwgZWxlbWVudHMvbW9kZWwueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Y2JiNGIxLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9jYXBhYmlsaXR5cGF0dGVybnMvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL21vZGVsLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDM4MyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHhtaTpYTUkgeG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hLnJlc291cmNlbWFuYWdlcj0iaHR0cDovLy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Jlc291cmNlbWFuYWdlci5lY29yZSIgeG1sbnM6ZXBmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZiIgZXBmOnZlcnNpb249IjEuMi4wIj4KLSAgPG9yZy5lY2xpcHNlLmVwZi51bWEucmVzb3VyY2VtYW5hZ2VyOlJlc291cmNlTWFuYWdlciB4bWk6aWQ9Il80eWMzc1R6Z0VkcTV5c0ZPTnIxQkdRIiBndWlkPSJfNHljM3NUemdFZHE1eXNGT05yMUJHUSI+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfNHljM3NqemdFZHE1eXNGT05yMUJHUSIgaWQ9Ii1FLWQ0SmN1Mjk3cnhVcThsdGU4cW53IiB1cmk9ImNvbnRlbnQueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfd3lEbndEemlFZHE1eXNGT05yMUJHUSIgaWQ9Ii1ZVlRaUkU1b3k1b0djdWUxWFhoM2RRIiB1cmk9ImNvbnRlbnQueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfUDJXdzBUemtFZHE1eXNGT05yMUJHUSIgaWQ9Ii1WUlVDU2hBdlhyc0xnczdQWnpIZ1V3IiB1cmk9ImNvbnRlbnQueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfTC02VFFEem1FZHE1eXNGT05yMUJHUSIgaWQ9Ii1uVUgwdm9EN1JvS1FnUFQwcmJPd1FRIiB1cmk9ImNvbnRlbnQueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfaW9WLVFEem1FZHE1eXNGT05yMUJHUSIgaWQ9Ii1hREU0eUZ6RV9tX24yUEl6Y090NHJBIiB1cmk9ImNvbnRlbnQueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfNEhONG9EejhFZHFFWnBUSzBXQVVkdyIgaWQ9Ii1pZm1RTkI1eTFSWktGMUhybTNDZFJBIiB1cmk9ImNvbnRlbnQueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfNEkyM1lEejhFZHFFWnBUSzBXQVVkdyIgaWQ9Ii01dDhHdG9MNElCb3hmYXpCSV8wY3JBIiB1cmk9ImNvbnRlbnQueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfbU5mb2tEejlFZHFFWnBUSzBXQVVkdyIgaWQ9Ii1wTzhMZWNlR1hqS2VhcHVMb0Zma3hBIiB1cmk9ImNvbnRlbnQueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfM2pWVEFEejlFZHFFWnBUSzBXQVVkdyIgaWQ9Ii1fVGgtanY1am0waDBmMG1GaEt0cWdRIiB1cmk9ImNvbnRlbnQueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfRmhERHNEMEJFZHFFWnBUSzBXQVVkdyIgaWQ9Ii1Ca3Y2VlRkTXBnNGJEMFlrZkhaNGRnIiB1cmk9ImNvbnRlbnQueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfTFlHOXNEMEJFZHFFWnBUSzBXQVVkdyIgaWQ9Ii1UUnhoeEFzMXhPS05SckZDRVBwQWx3IiB1cmk9ImNvbnRlbnQueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfV2U5cmNEMERFZHFFWnBUSzBXQVVkdyIgaWQ9Ii1BZHdBam41dlJDbkVRUUxVYVlKMWR3IiB1cmk9ImNvbnRlbnQueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfaEZhRnNEMERFZHFFWnBUSzBXQVVkdyIgaWQ9Ii1CWV9fdGlqd1JyVjQxWVVyWEl0VTB3IiB1cmk9ImNvbnRlbnQueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfRVROUU1EMEVFZHFFWnBUSzBXQVVkdyIgaWQ9Ii1ET1pyUl9zWnd3cGNVdGNvdS1qSXlRIiB1cmk9ImNvbnRlbnQueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfU2FFZE1EMEVFZHFFWnBUSzBXQVVkdyIgaWQ9Ii1hckZySmlzQnlQOTBZQ3JNYi1peWpnIiB1cmk9ImNvbnRlbnQueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfSWNfb3NEMEhFZHFqQUk3N0RIdkJ3QSIgaWQ9Ii01T2VHUEg4SlJ6U1JBRlB6QmdIbkpBIiB1cmk9ImNvbnRlbnQueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfSWRJeW9EMEhFZHFqQUk3N0RIdkJ3QSIgaWQ9Ii1ZZXJJakRySWxld2Q4aURoSVNNZzFnIiB1cmk9ImNvbnRlbnQueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfTDR5YUlEMEhFZHFqQUk3N0RIdkJ3QSIgaWQ9Ii1uY0xoVTR2aGc2ZGhvRUtUVGtLa0RRIiB1cmk9ImNvbnRlbnQueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfVURFVDhEMEhFZHFqQUk3N0RIdkJ3QSIgaWQ9Ii1yRFhvVzZiV1pfN21rTF9FOVdjeWhnIiB1cmk9ImNvbnRlbnQueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfYWJaU2dEMElFZHFqQUk3N0RIdkJ3QSIgaWQ9Ii1obUNDci1ES1o2enI4UzZEWGRxZlNBIiB1cmk9ImNvbnRlbnQueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfTUw3R29EMEpFZHFqQUk3N0RIdkJ3QSIgaWQ9Ii1DREpvX29ZQ2REaTV2cDhJNjl2OU93IiB1cmk9ImNvbnRlbnQueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfUWgwdjREMEpFZHFqQUk3N0RIdkJ3QSIgaWQ9Ii1RTjlSR0w1Y24wU2xiVXduR1YyR19BIiB1cmk9ImNvbnRlbnQueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfc1pnQllEMEpFZHFqQUk3N0RIdkJ3QSIgaWQ9Ii0xalREcVM0UnZfUEFFSFlGcGVvam1BIiB1cmk9ImNvbnRlbnQueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfdmZQRFFEMEpFZHFqQUk3N0RIdkJ3QSIgaWQ9Ii1EYWt6bXZBLXFod0dFU0NmWksxMXNRIiB1cmk9ImNvbnRlbnQueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfOGc5TklEMEpFZHFqQUk3N0RIdkJ3QSIgaWQ9Ii1MYUR5QXVqeEJrUFRocjI4dDJYZHdnIiB1cmk9ImNvbnRlbnQueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfcTYwYTREMGZFZHFOTV9ZUDUzSEtCdyIgaWQ9Ii1uVHQ2SDNyWHl0VXNPcXBKTEVRamR3IiB1cmk9ImNvbnRlbnQueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfOEYtRFVFREVFZHFPOU0zZnVrWUFfQSIgaWQ9Ii16QkFzMTFSZ0xnX1lTYnM3QmRrU3VRIiB1cmk9ImNvbnRlbnQueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfX0dNVEVFREVFZHFPOU0zZnVrWUFfQSIgaWQ9Ii15Yi1MR2lrY0E1TVBlUjhMM1lXMkNBIiB1cmk9ImNvbnRlbnQueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfR19XQW9FREZFZHFPOU0zZnVrWUFfQSIgaWQ9Ii13QlZ3bktOQTd2eFBacFk1aDBuakJRIiB1cmk9ImNvbnRlbnQueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfT3JFOVFFREZFZHFPOU0zZnVrWUFfQSIgaWQ9Ii1fajNmOGRqd0t4c0thQ0hEbkpJcVZBIiB1cmk9ImNvbnRlbnQueG1pIi8+Ci0gIDwvb3JnLmVjbGlwc2UuZXBmLnVtYS5yZXNvdXJjZW1hbmFnZXI6UmVzb3VyY2VNYW5hZ2VyPgotICA8b3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzQ29tcG9uZW50IHhtaTppZD0iXzRzQ3RzRHpnRWRxNXlzRk9OcjFCR1EiIG5hbWU9IkNQMSB3aXRoIGFsbCBlbGVtZW50cyIgZ3VpZD0iXzRzQ3RzRHpnRWRxNXlzRk9OcjFCR1EiPgotICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NQYWNrYWdlIiB4bWk6aWQ9Il9EYUhrZ0R6aUVkcTV5c0ZPTnIxQkdRIiBuYW1lPSJQaGFzZTEiIGd1aWQ9Il9EYUhrZ0R6aUVkcTV5c0ZPTnIxQkdRIj4KLSAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NQYWNrYWdlIiB4bWk6aWQ9Il9FRlZyd0R6aUVkcTV5c0ZPTnIxQkdRIiBuYW1lPSJJdGVyYXRpb24xIiBndWlkPSJfRUZWcndEemlFZHE1eXNGT05yMUJHUSI+Ci0gICAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NQYWNrYWdlIiB4bWk6aWQ9Il9FNzNySUR6aUVkcTV5c0ZPTnIxQkdRIiBuYW1lPSJBY3Rpdml0eTEiIGd1aWQ9Il9FNzNySUR6aUVkcTV5c0ZPTnIxQkdRIj4KLSAgICAgICAgICA8cHJvY2Vzc0VsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkFjdGl2aXR5IiB4bWk6aWQ9Il9FNzNySVR6aUVkcTV5c0ZPTnIxQkdRIiBuYW1lPSJBY3Rpdml0eTEiIGd1aWQ9Il9FNzNySVR6aUVkcTV5c0ZPTnIxQkdRIiBicmllZkRlc2NyaXB0aW9uPSJUaGlzIGFjdGl2aXR5IGNvbnRhaW5zIHRhc2tzIHRoYXQgYXJlIGFzc29jaWF0ZWQgdG8gYW5vdGhlciB0YXNrcy5BbHNvIHRoZWlyIHN0ZXBzIGFyZSBhZGRlZC4iIHByZXNlbnRhdGlvbk5hbWU9IkFjdGl2aXR5MSBjb250YWluaW5nIHRhc2tzIGxpbmtlZCB0byBtZXRob2QgZWxlbWVudHMiIHByZWZpeD0iUHJlZml4IiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJ0cnVlIiBzdXBlckFjdGl2aXRpZXM9Il9FRlZyd1R6aUVkcTV5c0ZPTnIxQkdRIiBicmVha2Rvd25FbGVtZW50cz0iX0ZydE1vRHppRWRxNXlzRk9OcjFCR1EgX0x3TFFnRHppRWRxNXlzRk9OcjFCR1EgX1Axc1VZRHppRWRxNXlzRk9OcjFCR1EgX1E5OWtBRHppRWRxNXlzRk9OcjFCR1EgX1NVR1FnRHppRWRxNXlzRk9OcjFCR1EgX1RDdTRJRHppRWRxNXlzRk9OcjFCR1EgXzF4NTdBRHprRWRxNXlzRk9OcjFCR1EgXzNfVU53RHprRWRxNXlzRk9OcjFCR1EgXzVqSllBRHprRWRxNXlzRk9OcjFCR1EiPgotICAgICAgICAgICAgPHByZXNlbnRhdGlvbiB4bWk6aWQ9Ii1ZVlRaUkU1b3k1b0djdWUxWFhoM2RRIiBocmVmPSJ1bWE6Ly8tRS1kNEpjdTI5N3J4VXE4bHRlOHFudyMtWVZUWlJFNW95NW9HY3VlMVhYaDNkUSIvPgotICAgICAgICAgICAgPHJvYWRtYXBzIGhyZWY9InVtYTovL195VWVMSUEtUEVkcUwyTzFQSlY5Y1pBI19aazM5Z0EtU0VkcUwyTzFQSlY5Y1pBIi8+Ci0gICAgICAgICAgICA8c3VwcG9ydGluZ01hdGVyaWFscyBocmVmPSJ1bWE6Ly9feVVlTElBLVBFZHFMMk8xUEpWOWNaQSNfYUZwdlVBLVNFZHFMMk8xUEpWOWNaQSIvPgotICAgICAgICAgICAgPGNoZWNrbGlzdHMgaHJlZj0idW1hOi8vX3lVZUxJQS1QRWRxTDJPMVBKVjljWkEjX0tWNHEwQS1TRWRxTDJPMVBKVjljWkEiLz4KLSAgICAgICAgICAgIDxjb25jZXB0cyBocmVmPSJ1bWE6Ly9feVVlTElBLVBFZHFMMk8xUEpWOWNaQSNfTkRMLWtBLVNFZHFMMk8xUEpWOWNaQSIvPgotICAgICAgICAgICAgPGNvbmNlcHRzIGhyZWY9InVtYTovL195VWVMSUEtUEVkcUwyTzFQSlY5Y1pBI19oOFJHUUEtU0VkcUwyTzFQSlY5Y1pBIi8+Ci0gICAgICAgICAgICA8ZXhhbXBsZXMgaHJlZj0idW1hOi8vX3lVZUxJQS1QRWRxTDJPMVBKVjljWkEjX09CeHR3QS1TRWRxTDJPMVBKVjljWkEiLz4KLSAgICAgICAgICAgIDxndWlkZWxpbmVzIGhyZWY9InVtYTovL195VWVMSUEtUEVkcUwyTzFQSlY5Y1pBI19Pa0N0VUEtU0VkcUwyTzFQSlY5Y1pBIi8+Ci0gICAgICAgICAgICA8cmV1c2FibGVBc3NldHMgaHJlZj0idW1hOi8vX3lVZUxJQS1QRWRxTDJPMVBKVjljWkEjX1RWMGFRQS1TRWRxTDJPMVBKVjljWkEiLz4KLSAgICAgICAgICA8L3Byb2Nlc3NFbGVtZW50cz4KLSAgICAgICAgICA8cHJvY2Vzc0VsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlRhc2tEZXNjcmlwdG9yIiB4bWk6aWQ9Il9GcnRNb0R6aUVkcTV5c0ZPTnIxQkdRIiBuYW1lPSJ0YXNrIGxpbmtlZCB0byB0YXNrQTEiIGd1aWQ9Il9GcnRNb0R6aUVkcTV5c0ZPTnIxQkdRIiBicmllZkRlc2NyaXB0aW9uPSJ0YXNrIGFzc29jaWF0ZWQgdG8gdGFza0ExIiBwcmVzZW50YXRpb25OYW1lPSJUYXNrX0xpbmtlZF9Ub19UYXNrQTEiIHN1cGVyQWN0aXZpdGllcz0iX0U3M3JJVHppRWRxNXlzRk9OcjFCR1EiIGFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5PSJfUTk5a0FEemlFZHE1eXNGT05yMUJHUSIgbWFuZGF0b3J5SW5wdXQ9Il9TVUdRZ0R6aUVkcTV5c0ZPTnIxQkdRIiBvdXRwdXQ9Il9UQ3U0SUR6aUVkcTV5c0ZPTnIxQkdRIiBwZXJmb3JtZWRQcmltYXJpbHlCeT0iX1Axc1VZRHppRWRxNXlzRk9OcjFCR1EiPgotICAgICAgICAgICAgPHByZXNlbnRhdGlvbiB4bWk6aWQ9Ii1pZm1RTkI1eTFSWktGMUhybTNDZFJBIiBocmVmPSJ1bWE6Ly8tRS1kNEpjdTI5N3J4VXE4bHRlOHFudyMtaWZtUU5CNXkxUlpLRjFIcm0zQ2RSQSIvPgotICAgICAgICAgICAgPFRhc2sgaHJlZj0idW1hOi8vX3lVZUxJQS1QRWRxTDJPMVBKVjljWkEjXzdNOG5zQS1QRWRxTDJPMVBKVjljWkEiLz4KLSAgICAgICAgICAgIDxzZWxlY3RlZFN0ZXBzIGhyZWY9InVtYTovLy1TMWlnTFNpNkFJX3ZsdXpXT0N1NlR3I190dkY0TUJCUEVkcUJzN0toZFZMUkxBIi8+Ci0gICAgICAgICAgICA8c2VsZWN0ZWRTdGVwcyBocmVmPSJ1bWE6Ly8tUzFpZ0xTaTZBSV92bHV6V09DdTZUdyNfdHprSWdCQlBFZHFCczdLaGRWTFJMQSIvPgotICAgICAgICAgICAgPHNlbGVjdGVkU3RlcHMgaHJlZj0idW1hOi8vLVMxaWdMU2k2QUlfdmx1eldPQ3U2VHcjX3VDQmJRQkJQRWRxQnM3S2hkVkxSTEEiLz4KLSAgICAgICAgICA8L3Byb2Nlc3NFbGVtZW50cz4KLSAgICAgICAgICA8cHJvY2Vzc0VsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlRhc2tEZXNjcmlwdG9yIiB4bWk6aWQ9Il9Md0xRZ0R6aUVkcTV5c0ZPTnIxQkdRIiBuYW1lPSJ0YXNrIGxpbmtlZCB0byB0YXNrQTIiIGd1aWQ9Il9Md0xRZ0R6aUVkcTV5c0ZPTnIxQkdRIiBicmllZkRlc2NyaXB0aW9uPSJ0YXNrIGxpbmtlZCB0byB0YXNrQTIiIHByZXNlbnRhdGlvbk5hbWU9IlRhc2tfTGlua2VkX1RvX3Rhc2tBMiIgc3VwZXJBY3Rpdml0aWVzPSJfRTczcklUemlFZHE1eXNGT05yMUJHUSIgbWFuZGF0b3J5SW5wdXQ9Il9UQ3U0SUR6aUVkcTV5c0ZPTnIxQkdRIiBvdXRwdXQ9Il9TVUdRZ0R6aUVkcTV5c0ZPTnIxQkdRIiBwZXJmb3JtZWRQcmltYXJpbHlCeT0iX1E5OWtBRHppRWRxNXlzRk9OcjFCR1EiPgotICAgICAgICAgICAgPHByZXNlbnRhdGlvbiB4bWk6aWQ9Ii1Ca3Y2VlRkTXBnNGJEMFlrZkhaNGRnIiBocmVmPSJ1bWE6Ly8tRS1kNEpjdTI5N3J4VXE4bHRlOHFudyMtQmt2NlZUZE1wZzRiRDBZa2ZIWjRkZyIvPgotICAgICAgICAgICAgPFRhc2sgaHJlZj0idW1hOi8vX3lVZUxJQS1QRWRxTDJPMVBKVjljWkEjXzc1TlF3QS1QRWRxTDJPMVBKVjljWkEiLz4KLSAgICAgICAgICAgIDxzZWxlY3RlZFN0ZXBzIGhyZWY9InVtYTovLy0xM3E4SkpBYTBpeDZyRE1aQXF3eTF3I190aTJCWUJCT0VkcUJzN0toZFZMUkxBIi8+Ci0gICAgICAgICAgICA8c2VsZWN0ZWRTdGVwcyBocmVmPSJ1bWE6Ly8tMTNxOEpKQWEwaXg2ckRNWkFxd3kxdyNfdGs3c0VCQk9FZHFCczdLaGRWTFJMQSIvPgotICAgICAgICAgICAgPHNlbGVjdGVkU3RlcHMgaHJlZj0idW1hOi8vLTEzcThKSkFhMGl4NnJETVpBcXd5MXcjX3RuZGJvQkJPRWRxQnM3S2hkVkxSTEEiLz4KLSAgICAgICAgICA8L3Byb2Nlc3NFbGVtZW50cz4KLSAgICAgICAgICA8cHJvY2Vzc0VsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlJvbGVEZXNjcmlwdG9yIiB4bWk6aWQ9Il9QMXNVWUR6aUVkcTV5c0ZPTnIxQkdRIiBuYW1lPSJyb2xlRGVzYzEiIGd1aWQ9Il9QMXNVWUR6aUVkcTV5c0ZPTnIxQkdRIiBicmllZkRlc2NyaXB0aW9uPSJyb2xlRGVzYzEgbGlua2VkIHRvIHJvbGVBMSIgcHJlc2VudGF0aW9uTmFtZT0icm9sZURlc2MxIiBwcmVmaXg9InByZWZpeCIgc3VwZXJBY3Rpdml0aWVzPSJfRTczcklUemlFZHE1eXNGT05yMUJHUSI+Ci0gICAgICAgICAgICA8cHJlc2VudGF0aW9uIHhtaTppZD0iLXBPOExlY2VHWGpLZWFwdUxvRmZreEEiIGhyZWY9InVtYTovLy1FLWQ0SmN1Mjk3cnhVcThsdGU4cW53Iy1wTzhMZWNlR1hqS2VhcHVMb0Zma3hBIi8+Ci0gICAgICAgICAgICA8Um9sZSBocmVmPSJ1bWE6Ly9feVVlTElBLVBFZHFMMk8xUEpWOWNaQSNfNTV6azBBLVBFZHFMMk8xUEpWOWNaQSIvPgotICAgICAgICAgIDwvcHJvY2Vzc0VsZW1lbnRzPgotICAgICAgICAgIDxwcm9jZXNzRWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Um9sZURlc2NyaXB0b3IiIHhtaTppZD0iX1E5OWtBRHppRWRxNXlzRk9OcjFCR1EiIG5hbWU9InJvbGVEZXNjMiIgZ3VpZD0iX1E5OWtBRHppRWRxNXlzRk9OcjFCR1EiIGJyaWVmRGVzY3JpcHRpb249InJvbGVEZXNjMiBsaW5rZWQgdG8gcm9sZUEyIiBwcmVzZW50YXRpb25OYW1lPSJyb2xlRGVzYzIiIHN1cGVyQWN0aXZpdGllcz0iX0U3M3JJVHppRWRxNXlzRk9OcjFCR1EiPgotICAgICAgICAgICAgPHByZXNlbnRhdGlvbiB4bWk6aWQ9Ii1fVGgtanY1am0waDBmMG1GaEt0cWdRIiBocmVmPSJ1bWE6Ly8tRS1kNEpjdTI5N3J4VXE4bHRlOHFudyMtX1RoLWp2NWptMGgwZjBtRmhLdHFnUSIvPgotICAgICAgICAgICAgPFJvbGUgaHJlZj0idW1hOi8vX3lVZUxJQS1QRWRxTDJPMVBKVjljWkEjXzZrM1VBQS1QRWRxTDJPMVBKVjljWkEiLz4KLSAgICAgICAgICA8L3Byb2Nlc3NFbGVtZW50cz4KLSAgICAgICAgICA8cHJvY2Vzc0VsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOldvcmtQcm9kdWN0RGVzY3JpcHRvciIgeG1pOmlkPSJfU1VHUWdEemlFZHE1eXNGT05yMUJHUSIgbmFtZT0id3BEZXNjMSIgZ3VpZD0iX1NVR1FnRHppRWRxNXlzRk9OcjFCR1EiIGJyaWVmRGVzY3JpcHRpb249InRoaXMgd3AgaXMgbGlua2VkIHRvIGFydGlmYWN0IiBwcmVzZW50YXRpb25OYW1lPSJ3cERlc2MxIGlzIGxpbmtlZCB0byBhcnRpZmFjdCIgcHJlZml4PSJwcmVmaXgiIHN1cGVyQWN0aXZpdGllcz0iX0U3M3JJVHppRWRxNXlzRk9OcjFCR1EiPgotICAgICAgICAgICAgPHByZXNlbnRhdGlvbiB4bWk6aWQ9Ii01dDhHdG9MNElCb3hmYXpCSV8wY3JBIiBocmVmPSJ1bWE6Ly8tRS1kNEpjdTI5N3J4VXE4bHRlOHFudyMtNXQ4R3RvTDRJQm94ZmF6QklfMGNyQSIvPgotICAgICAgICAgICAgPFdvcmtQcm9kdWN0IHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkFydGlmYWN0IiBocmVmPSJ1bWE6Ly9feVVlTElBLVBFZHFMMk8xUEpWOWNaQSNfRTdaMGtBLVJFZHFMMk8xUEpWOWNaQSIvPgotICAgICAgICAgIDwvcHJvY2Vzc0VsZW1lbnRzPgotICAgICAgICAgIDxwcm9jZXNzRWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6V29ya1Byb2R1Y3REZXNjcmlwdG9yIiB4bWk6aWQ9Il9UQ3U0SUR6aUVkcTV5c0ZPTnIxQkdRIiBuYW1lPSJ3cERlc2MyIiBndWlkPSJfVEN1NElEemlFZHE1eXNGT05yMUJHUSIgYnJpZWZEZXNjcmlwdGlvbj0id3BkZXNjMiBsaW5rZWQgdG8gZGVsaXZlcmFibGUiIHByZXNlbnRhdGlvbk5hbWU9IndwRGVzYzIgbGlua2VkIHRvIGRlbGl2ZXJhYmxlIiBwcmVmaXg9InByZWZpeCIgc3VwZXJBY3Rpdml0aWVzPSJfRTczcklUemlFZHE1eXNGT05yMUJHUSIgZGVsaXZlcmFibGVQYXJ0cz0iX1dyX3k4RHprRWRxNXlzRk9OcjFCR1EgX1hzWHEwRHprRWRxNXlzRk9OcjFCR1EgX1JNTjdFRHpsRWRxNXlzRk9OcjFCR1EiPgotICAgICAgICAgICAgPHByZXNlbnRhdGlvbiB4bWk6aWQ9Ii1uY0xoVTR2aGc2ZGhvRUtUVGtLa0RRIiBocmVmPSJ1bWE6Ly8tRS1kNEpjdTI5N3J4VXE4bHRlOHFudyMtbmNMaFU0dmhnNmRob0VLVFRrS2tEUSIvPgotICAgICAgICAgICAgPFdvcmtQcm9kdWN0IHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkRlbGl2ZXJhYmxlIiBocmVmPSJ1bWE6Ly9feVVlTElBLVBFZHFMMk8xUEpWOWNaQSNfSkJxZlVBLVJFZHFMMk8xUEpWOWNaQSIvPgotICAgICAgICAgIDwvcHJvY2Vzc0VsZW1lbnRzPgotICAgICAgICAgIDxwcm9jZXNzRWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6V29ya1Byb2R1Y3REZXNjcmlwdG9yIiB4bWk6aWQ9Il9Xcl95OER6a0VkcTV5c0ZPTnIxQkdRIiBuYW1lPSJvdXRjb21lX0ExIiBndWlkPSJfV3JfeThEemtFZHE1eXNGT05yMUJHUSIgYnJpZWZEZXNjcmlwdGlvbj0iT3V0Y29tZSBBMSBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iT3V0Y29tZSBBMSBwcmVzZW50Ij4KLSAgICAgICAgICAgIDxXb3JrUHJvZHVjdCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpPdXRjb21lIiBocmVmPSJ1bWE6Ly9feVVlTElBLVBFZHFMMk8xUEpWOWNaQSNfS0FfMVlBLVJFZHFMMk8xUEpWOWNaQSIvPgotICAgICAgICAgIDwvcHJvY2Vzc0VsZW1lbnRzPgotICAgICAgICAgIDxwcm9jZXNzRWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6V29ya1Byb2R1Y3REZXNjcmlwdG9yIiB4bWk6aWQ9Il9Yc1hxMER6a0VkcTV5c0ZPTnIxQkdRIiBuYW1lPSJhcnRpZmFjdF9BMSIgZ3VpZD0iX1hzWHEwRHprRWRxNXlzRk9OcjFCR1EiIGJyaWVmRGVzY3JpcHRpb249IkFydGlmYWN0IEExIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJBcnRpZmFjdCBBMSBwcmVzZW50Ij4KLSAgICAgICAgICAgIDxXb3JrUHJvZHVjdCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpBcnRpZmFjdCIgaHJlZj0idW1hOi8vX3lVZUxJQS1QRWRxTDJPMVBKVjljWkEjXzlLdDc4QS1QRWRxTDJPMVBKVjljWkEiLz4KLSAgICAgICAgICA8L3Byb2Nlc3NFbGVtZW50cz4KLSAgICAgICAgICA8cHJvY2Vzc0VsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOldvcmtQcm9kdWN0RGVzY3JpcHRvciIgeG1pOmlkPSJfMXg1N0FEemtFZHE1eXNGT05yMUJHUSIgbmFtZT0id3BEZXNjMyB3aXRoIG5vIGxpbmtzIiBndWlkPSJfMXg1N0FEemtFZHE1eXNGT05yMUJHUSIgYnJpZWZEZXNjcmlwdGlvbj0iYnJpZWY6IHdwRGVzYzMgd2l0aCBubyBsaW5rcyIgcHJlc2VudGF0aW9uTmFtZT0id3BEZXNjMyB3aXRoIG5vIGxpbmtzIiBwcmVmaXg9InByZWZpeCIgc3VwZXJBY3Rpdml0aWVzPSJfRTczcklUemlFZHE1eXNGT05yMUJHUSI+Ci0gICAgICAgICAgICA8cHJlc2VudGF0aW9uIHhtaTppZD0iLXJEWG9XNmJXWl83bWtMX0U5V2N5aGciIGhyZWY9InVtYTovLy1FLWQ0SmN1Mjk3cnhVcThsdGU4cW53Iy1yRFhvVzZiV1pfN21rTF9FOVdjeWhnIi8+Ci0gICAgICAgICAgPC9wcm9jZXNzRWxlbWVudHM+Ci0gICAgICAgICAgPHByb2Nlc3NFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpSb2xlRGVzY3JpcHRvciIgeG1pOmlkPSJfM19VTndEemtFZHE1eXNGT05yMUJHUSIgbmFtZT0icm9sZURlc2Mgd2l0aCBubyBsaW5rcyIgZ3VpZD0iXzNfVU53RHprRWRxNXlzRk9OcjFCR1EiIGJyaWVmRGVzY3JpcHRpb249ImJyaWVmOnJvbGVEZXNjIHdpdGggbm8gbGlua3MiIHByZXNlbnRhdGlvbk5hbWU9InJvbGVEZXNjIHdpdGggbm8gbGlua3MiIHN1cGVyQWN0aXZpdGllcz0iX0U3M3JJVHppRWRxNXlzRk9OcjFCR1EiPgotICAgICAgICAgICAgPHByZXNlbnRhdGlvbiB4bWk6aWQ9Ii1hckZySmlzQnlQOTBZQ3JNYi1peWpnIiBocmVmPSJ1bWE6Ly8tRS1kNEpjdTI5N3J4VXE4bHRlOHFudyMtYXJGckppc0J5UDkwWUNyTWItaXlqZyIvPgotICAgICAgICAgIDwvcHJvY2Vzc0VsZW1lbnRzPgotICAgICAgICAgIDxwcm9jZXNzRWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VGFza0Rlc2NyaXB0b3IiIHhtaTppZD0iXzVqSllBRHprRWRxNXlzRk9OcjFCR1EiIG5hbWU9InRhc2sgd2l0aCBubyBsaW5rcyIgZ3VpZD0iXzVqSllBRHprRWRxNXlzRk9OcjFCR1EiIGJyaWVmRGVzY3JpcHRpb249ImJyaWVmOnRhc2sgd2l0aCBubyBsaW5rcyIgcHJlc2VudGF0aW9uTmFtZT0idGFzayB3aXRoIG5vIGxpbmtzIiBzdXBlckFjdGl2aXRpZXM9Il9FNzNySVR6aUVkcTV5c0ZPTnIxQkdRIj4KLSAgICAgICAgICAgIDxwcmVzZW50YXRpb24geG1pOmlkPSItVFJ4aHhBczF4T0tOUnJGQ0VQcEFsdyIgaHJlZj0idW1hOi8vLUUtZDRKY3UyOTdyeFVxOGx0ZThxbncjLVRSeGh4QXMxeE9LTlJyRkNFUHBBbHciLz4KLSAgICAgICAgICA8L3Byb2Nlc3NFbGVtZW50cz4KLSAgICAgICAgICA8cHJvY2Vzc0VsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOldvcmtQcm9kdWN0RGVzY3JpcHRvciIgeG1pOmlkPSJfUk1ON0VEemxFZHE1eXNGT05yMUJHUSIgbmFtZT0ic3ViX2FydGlmYWN0X0ExLjEiIGd1aWQ9Il9STU43RUR6bEVkcTV5c0ZPTnIxQkdRIiBicmllZkRlc2NyaXB0aW9uPSJTdWJfQXJ0aWZhY3QgQTEuMSBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iU3ViX0FydGlmYWN0IEExLjEgcHJlc2VudCI+Ci0gICAgICAgICAgICA8V29ya1Byb2R1Y3QgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6QXJ0aWZhY3QiIGhyZWY9InVtYTovL195VWVMSUEtUEVkcUwyTzFQSlY5Y1pBI19GNTF5d0EtUkVkcUwyTzFQSlY5Y1pBIi8+Ci0gICAgICAgICAgPC9wcm9jZXNzRWxlbWVudHM+Ci0gICAgICAgICAgPGRpYWdyYW1zIHhtaTppZD0iX2Y2cHdVRHpqRWRxNXlzRk9OcjFCR1EiIGd1aWQ9Il9mNnB3VUR6akVkcTV5c0ZPTnIxQkdRIj4KLSAgICAgICAgICAgIDxjb250YWluZWQgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6R3JhcGhOb2RlIiB4bWk6aWQ9Il9mNnB3VVR6akVkcTV5c0ZPTnIxQkdRIiBndWlkPSJfZjZwd1VUempFZHE1eXNGT05yMUJHUSI+Ci0gICAgICAgICAgICAgIDxwb3NpdGlvbiB4bWk6aWQ9Il9mNnB3VWp6akVkcTV5c0ZPTnIxQkdRIiB4PSItMS4wIiB5PSItMS4wIi8+Ci0gICAgICAgICAgICAgIDxzZW1hbnRpY01vZGVsIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlVNQVNlbWFudGljTW9kZWxCcmlkZ2UiIHhtaTppZD0iX2Y2cHdVenpqRWRxNXlzRk9OcjFCR1EiIGd1aWQ9Il9mNnB3VXp6akVkcTV5c0ZPTnIxQkdRIiBlbGVtZW50PSJfRnJ0TW9EemlFZHE1eXNGT05yMUJHUSIvPgotICAgICAgICAgICAgICA8c2l6ZSB4bWk6aWQ9Il9mNnB3VkR6akVkcTV5c0ZPTnIxQkdRIiB3aWR0aD0iLTEuMCIgaGVpZ2h0PSItMS4wIi8+Ci0gICAgICAgICAgICA8L2NvbnRhaW5lZD4KLSAgICAgICAgICAgIDxjb250YWluZWQgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6R3JhcGhOb2RlIiB4bWk6aWQ9Il9mNnB3VlR6akVkcTV5c0ZPTnIxQkdRIiBndWlkPSJfZjZwd1ZUempFZHE1eXNGT05yMUJHUSI+Ci0gICAgICAgICAgICAgIDxwb3NpdGlvbiB4bWk6aWQ9Il9mNnB3Vmp6akVkcTV5c0ZPTnIxQkdRIiB4PSItMS4wIiB5PSItMS4wIi8+Ci0gICAgICAgICAgICAgIDxzZW1hbnRpY01vZGVsIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlVNQVNlbWFudGljTW9kZWxCcmlkZ2UiIHhtaTppZD0iX2Y2cHdWenpqRWRxNXlzRk9OcjFCR1EiIGd1aWQ9Il9mNnB3Vnp6akVkcTV5c0ZPTnIxQkdRIiBlbGVtZW50PSJfTHdMUWdEemlFZHE1eXNGT05yMUJHUSIvPgotICAgICAgICAgICAgICA8c2l6ZSB4bWk6aWQ9Il9mNnB3V0R6akVkcTV5c0ZPTnIxQkdRIiB3aWR0aD0iLTEuMCIgaGVpZ2h0PSItMS4wIi8+Ci0gICAgICAgICAgICA8L2NvbnRhaW5lZD4KLSAgICAgICAgICAgIDxjb250YWluZWQgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6R3JhcGhOb2RlIiB4bWk6aWQ9Il9mNnB3V1R6akVkcTV5c0ZPTnIxQkdRIiBndWlkPSJfZjZwd1dUempFZHE1eXNGT05yMUJHUSI+Ci0gICAgICAgICAgICAgIDxwb3NpdGlvbiB4bWk6aWQ9Il9mNnB3V2p6akVkcTV5c0ZPTnIxQkdRIiB4PSIxMC4wIiB5PSIxODYuMCIvPgotICAgICAgICAgICAgICA8c2VtYW50aWNNb2RlbCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpVTUFTZW1hbnRpY01vZGVsQnJpZGdlIiB4bWk6aWQ9Il9mNnB3V3p6akVkcTV5c0ZPTnIxQkdRIiBndWlkPSJfZjZwd1d6empFZHE1eXNGT05yMUJHUSIgZWxlbWVudD0iX1Axc1VZRHppRWRxNXlzRk9OcjFCR1EiLz4KLSAgICAgICAgICAgICAgPHNpemUgeG1pOmlkPSJfZjZwd1hEempFZHE1eXNGT05yMUJHUSIgd2lkdGg9Ii0xLjAiIGhlaWdodD0iLTEuMCIvPgotICAgICAgICAgICAgPC9jb250YWluZWQ+Ci0gICAgICAgICAgICA8Y29udGFpbmVkIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkdyYXBoTm9kZSIgeG1pOmlkPSJfZjZwd1hUempFZHE1eXNGT05yMUJHUSIgZ3VpZD0iX2Y2cHdYVHpqRWRxNXlzRk9OcjFCR1EiPgotICAgICAgICAgICAgICA8cG9zaXRpb24geG1pOmlkPSJfZjZwd1hqempFZHE1eXNGT05yMUJHUSIgeD0iMjExLjAiIHk9IjEyOS4wIi8+Ci0gICAgICAgICAgICAgIDxzZW1hbnRpY01vZGVsIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlVNQVNlbWFudGljTW9kZWxCcmlkZ2UiIHhtaTppZD0iX2Y2cHdYenpqRWRxNXlzRk9OcjFCR1EiIGd1aWQ9Il9mNnB3WHp6akVkcTV5c0ZPTnIxQkdRIiBlbGVtZW50PSJfUTk5a0FEemlFZHE1eXNGT05yMUJHUSIvPgotICAgICAgICAgICAgICA8c2l6ZSB4bWk6aWQ9Il9mNnB3WUR6akVkcTV5c0ZPTnIxQkdRIiB3aWR0aD0iMjEwLjAiIGhlaWdodD0iNTIuMCIvPgotICAgICAgICAgICAgPC9jb250YWluZWQ+Ci0gICAgICAgICAgICA8Y29udGFpbmVkIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkdyYXBoTm9kZSIgeG1pOmlkPSJfZjZwd1lUempFZHE1eXNGT05yMUJHUSIgZ3VpZD0iX2Y2cHdZVHpqRWRxNXlzRk9OcjFCR1EiPgotICAgICAgICAgICAgICA8cG9zaXRpb24geG1pOmlkPSJfZjZwd1lqempFZHE1eXNGT05yMUJHUSIgeD0iLTEuMCIgeT0iLTEuMCIvPgotICAgICAgICAgICAgICA8c2VtYW50aWNNb2RlbCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpVTUFTZW1hbnRpY01vZGVsQnJpZGdlIiB4bWk6aWQ9Il9mNnB3WXp6akVkcTV5c0ZPTnIxQkdRIiBndWlkPSJfZjZwd1l6empFZHE1eXNGT05yMUJHUSIgZWxlbWVudD0iX1NVR1FnRHppRWRxNXlzRk9OcjFCR1EiLz4KLSAgICAgICAgICAgICAgPHNpemUgeG1pOmlkPSJfZjZwd1pEempFZHE1eXNGT05yMUJHUSIgd2lkdGg9Ii0xLjAiIGhlaWdodD0iLTEuMCIvPgotICAgICAgICAgICAgPC9jb250YWluZWQ+Ci0gICAgICAgICAgICA8Y29udGFpbmVkIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkdyYXBoTm9kZSIgeG1pOmlkPSJfZjZwd1pUempFZHE1eXNGT05yMUJHUSIgZ3VpZD0iX2Y2cHdaVHpqRWRxNXlzRk9OcjFCR1EiPgotICAgICAgICAgICAgICA8cG9zaXRpb24geG1pOmlkPSJfZjZwd1pqempFZHE1eXNGT05yMUJHUSIgeD0iLTEuMCIgeT0iLTEuMCIvPgotICAgICAgICAgICAgICA8c2VtYW50aWNNb2RlbCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpVTUFTZW1hbnRpY01vZGVsQnJpZGdlIiB4bWk6aWQ9Il9mNnB3Wnp6akVkcTV5c0ZPTnIxQkdRIiBndWlkPSJfZjZwd1p6empFZHE1eXNGT05yMUJHUSIgZWxlbWVudD0iX1RDdTRJRHppRWRxNXlzRk9OcjFCR1EiLz4KLSAgICAgICAgICAgICAgPHNpemUgeG1pOmlkPSJfZjZwd2FEempFZHE1eXNGT05yMUJHUSIgd2lkdGg9Ii0xLjAiIGhlaWdodD0iLTEuMCIvPgotICAgICAgICAgICAgPC9jb250YWluZWQ+Ci0gICAgICAgICAgICA8Y29udGFpbmVkIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkdyYXBoTm9kZSIgeG1pOmlkPSJfZjdQbU1EempFZHE1eXNGT05yMUJHUSIgZ3VpZD0iX2Y3UG1NRHpqRWRxNXlzRk9OcjFCR1EiPgotICAgICAgICAgICAgICA8cHJvcGVydHkgeG1pOmlkPSJfZjdQbU1UempFZHE1eXNGT05yMUJHUSIgZ3VpZD0iX2Y3UG1NVHpqRWRxNXlzRk9OcjFCR1EiIGtleT0id3BDb21wb3NpdGVUeXBlIiB2YWx1ZT0iMSIvPgotICAgICAgICAgICAgICA8cG9zaXRpb24geG1pOmlkPSJfZjdQbU1qempFZHE1eXNGT05yMUJHUSIgeD0iLTEyLjAiIHk9IjQ5LjAiLz4KLSAgICAgICAgICAgICAgPGNvbnRhaW5lZCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpHcmFwaEVkZ2UiIHhtaTppZD0iX2Y3aklNVHpqRWRxNXlzRk9OcjFCR1EiIGd1aWQ9Il9mN2pJTVR6akVkcTV5c0ZPTnIxQkdRIiBhbmNob3I9Il9mN2pJTUR6akVkcTV5c0ZPTnIxQkdRIi8+Ci0gICAgICAgICAgICAgIDxjb250YWluZWQgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6R3JhcGhFZGdlIiB4bWk6aWQ9Il9nV1hiOFR6akVkcTV5c0ZPTnIxQkdRIiBndWlkPSJfZ1dYYjhUempFZHE1eXNGT05yMUJHUSIgYW5jaG9yPSJfZ1dYYjhEempFZHE1eXNGT05yMUJHUSIvPgotICAgICAgICAgICAgICA8Y29udGFpbmVkIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkdyYXBoRWRnZSIgeG1pOmlkPSJfc1FvUHNUejlFZHFFWnBUSzBXQVVkdyIgZ3VpZD0iX3NRb1BzVHo5RWRxRVpwVEswV0FVZHciIGFuY2hvcj0iX3NRb1BzRHo5RWRxRVpwVEswV0FVZHciLz4KLSAgICAgICAgICAgICAgPGNvbnRhaW5lZCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpHcmFwaEVkZ2UiIHhtaTppZD0iX3RpbG0wVHo5RWRxRVpwVEswV0FVZHciIGd1aWQ9Il90aWxtMFR6OUVkcUVacFRLMFdBVWR3IiBhbmNob3I9Il90aWxtMER6OUVkcUVacFRLMFdBVWR3Ii8+Ci0gICAgICAgICAgICAgIDxjb250YWluZWQgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6R3JhcGhFZGdlIiB4bWk6aWQ9Il94SDZ1d1R6OUVkcUVacFRLMFdBVWR3IiBndWlkPSJfeEg2dXdUejlFZHFFWnBUSzBXQVVkdyIgYW5jaG9yPSJfeEg2dXdEejlFZHFFWnBUSzBXQVVkdyIvPgotICAgICAgICAgICAgICA8Y29udGFpbmVkIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkdyYXBoRWRnZSIgeG1pOmlkPSJfMFU5U2dUejlFZHFFWnBUSzBXQVVkdyIgZ3VpZD0iXzBVOVNnVHo5RWRxRVpwVEswV0FVZHciIGFuY2hvcj0iXzBVOVNnRHo5RWRxRVpwVEswV0FVZHciLz4KLSAgICAgICAgICAgICAgPGNvbnRhaW5lZCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpHcmFwaEVkZ2UiIHhtaTppZD0iXzhpRWQ2eno5RWRxRVpwVEswV0FVZHciIGd1aWQ9Il84aUVkNnp6OUVkcUVacFRLMFdBVWR3IiBhbmNob3I9Il84aUVkNmp6OUVkcUVacFRLMFdBVWR3Ii8+Ci0gICAgICAgICAgICAgIDxjb250YWluZWQgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6R3JhcGhFZGdlIiB4bWk6aWQ9Il9ZZHJpUVQwQUVkcUVacFRLMFdBVWR3IiBndWlkPSJfWWRyaVFUMEFFZHFFWnBUSzBXQVVkdyIgYW5jaG9yPSJfWWRyaVFEMEFFZHFFWnBUSzBXQVVkdyIvPgotICAgICAgICAgICAgICA8Y29udGFpbmVkIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkdyYXBoRWRnZSIgeG1pOmlkPSJfWXc1Wk1UMEFFZHFFWnBUSzBXQVVkdyIgZ3VpZD0iX1l3NVpNVDBBRWRxRVpwVEswV0FVZHciIGFuY2hvcj0iX1l3NVpNRDBBRWRxRVpwVEswV0FVZHciLz4KLSAgICAgICAgICAgICAgPGNvbnRhaW5lZCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpHcmFwaEVkZ2UiIHhtaTppZD0iX3lLWEFNVDBlRWRxTk1fWVA1M0hLQnciIGd1aWQ9Il95S1hBTVQwZUVkcU5NX1lQNTNIS0J3IiBhbmNob3I9Il95S1hBTUQwZUVkcU5NX1lQNTNIS0J3Ii8+Ci0gICAgICAgICAgICAgIDxjb250YWluZWQgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6R3JhcGhFZGdlIiB4bWk6aWQ9Il95aURIY0QwZUVkcU5NX1lQNTNIS0J3IiBndWlkPSJfeWlESGNEMGVFZHFOTV9ZUDUzSEtCdyIgYW5jaG9yPSJfeWg1OWdEMGVFZHFOTV9ZUDUzSEtCdyIvPgotICAgICAgICAgICAgICA8YW5jaG9yYWdlIHhtaTppZD0iX2Y3aklNRHpqRWRxNXlzRk9OcjFCR1EiIGd1aWQ9Il9mN2pJTUR6akVkcTV5c0ZPTnIxQkdRIiBncmFwaEVkZ2U9Il9mN2pJTVR6akVkcTV5c0ZPTnIxQkdRIi8+Ci0gICAgICAgICAgICAgIDxhbmNob3JhZ2UgeG1pOmlkPSJfZ1dYYjhEempFZHE1eXNGT05yMUJHUSIgZ3VpZD0iX2dXWGI4RHpqRWRxNXlzRk9OcjFCR1EiIGdyYXBoRWRnZT0iX2dXWGI4VHpqRWRxNXlzRk9OcjFCR1EiLz4KLSAgICAgICAgICAgICAgPGFuY2hvcmFnZSB4bWk6aWQ9Il9zUW9Qc0R6OUVkcUVacFRLMFdBVWR3IiBndWlkPSJfc1FvUHNEejlFZHFFWnBUSzBXQVVkdyIgZ3JhcGhFZGdlPSJfc1FvUHNUejlFZHFFWnBUSzBXQVVkdyIvPgotICAgICAgICAgICAgICA8YW5jaG9yYWdlIHhtaTppZD0iX3RpbG0wRHo5RWRxRVpwVEswV0FVZHciIGd1aWQ9Il90aWxtMER6OUVkcUVacFRLMFdBVWR3IiBncmFwaEVkZ2U9Il90aWxtMFR6OUVkcUVacFRLMFdBVWR3Ii8+Ci0gICAgICAgICAgICAgIDxhbmNob3JhZ2UgeG1pOmlkPSJfeEg2dXdEejlFZHFFWnBUSzBXQVVkdyIgZ3VpZD0iX3hINnV3RHo5RWRxRVpwVEswV0FVZHciIGdyYXBoRWRnZT0iX3hINnV3VHo5RWRxRVpwVEswV0FVZHciLz4KLSAgICAgICAgICAgICAgPGFuY2hvcmFnZSB4bWk6aWQ9Il8wVTlTZ0R6OUVkcUVacFRLMFdBVWR3IiBndWlkPSJfMFU5U2dEejlFZHFFWnBUSzBXQVVkdyIgZ3JhcGhFZGdlPSJfMFU5U2dUejlFZHFFWnBUSzBXQVVkdyIvPgotICAgICAgICAgICAgICA8YW5jaG9yYWdlIHhtaTppZD0iXzhpRWQ2ano5RWRxRVpwVEswV0FVZHciIGd1aWQ9Il84aUVkNmp6OUVkcUVacFRLMFdBVWR3IiBncmFwaEVkZ2U9Il84aUVkNnp6OUVkcUVacFRLMFdBVWR3Ii8+Ci0gICAgICAgICAgICAgIDxhbmNob3JhZ2UgeG1pOmlkPSJfWWRyaVFEMEFFZHFFWnBUSzBXQVVkdyIgZ3VpZD0iX1lkcmlRRDBBRWRxRVpwVEswV0FVZHciIGdyYXBoRWRnZT0iX1lkcmlRVDBBRWRxRVpwVEswV0FVZHciLz4KLSAgICAgICAgICAgICAgPGFuY2hvcmFnZSB4bWk6aWQ9Il9ZdzVaTUQwQUVkcUVacFRLMFdBVWR3IiBndWlkPSJfWXc1Wk1EMEFFZHFFWnBUSzBXQVVkdyIgZ3JhcGhFZGdlPSJfWXc1Wk1UMEFFZHFFWnBUSzBXQVVkdyIvPgotICAgICAgICAgICAgICA8YW5jaG9yYWdlIHhtaTppZD0iX3lLWEFNRDBlRWRxTk1fWVA1M0hLQnciIGd1aWQ9Il95S1hBTUQwZUVkcU5NX1lQNTNIS0J3IiBncmFwaEVkZ2U9Il95S1hBTVQwZUVkcU5NX1lQNTNIS0J3Ii8+Ci0gICAgICAgICAgICAgIDxhbmNob3JhZ2UgeG1pOmlkPSJfeWg1OWdEMGVFZHFOTV9ZUDUzSEtCdyIgZ3VpZD0iX3loNTlnRDBlRWRxTk1fWVA1M0hLQnciIGdyYXBoRWRnZT0iX3lpREhjRDBlRWRxTk1fWVA1M0hLQnciLz4KLSAgICAgICAgICAgICAgPHNlbWFudGljTW9kZWwgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VU1BU2VtYW50aWNNb2RlbEJyaWRnZSIgeG1pOmlkPSJfZjdQbU16empFZHE1eXNGT05yMUJHUSIgZ3VpZD0iX2Y3UG1NenpqRWRxNXlzRk9OcjFCR1EiIGVsZW1lbnQ9Il9GcnRNb0R6aUVkcTV5c0ZPTnIxQkdRIi8+Ci0gICAgICAgICAgICAgIDxzaXplIHhtaTppZD0iX2Y3UG1ORHpqRWRxNXlzRk9OcjFCR1EiIHdpZHRoPSIxNTEuMCIgaGVpZ2h0PSItMS4wIi8+Ci0gICAgICAgICAgICA8L2NvbnRhaW5lZD4KLSAgICAgICAgICAgIDxjb250YWluZWQgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6R3JhcGhOb2RlIiB4bWk6aWQ9Il9mN1BtTlR6akVkcTV5c0ZPTnIxQkdRIiBndWlkPSJfZjdQbU5UempFZHE1eXNGT05yMUJHUSI+Ci0gICAgICAgICAgICAgIDxwcm9wZXJ0eSB4bWk6aWQ9Il9mN1BtTmp6akVkcTV5c0ZPTnIxQkdRIiBndWlkPSJfZjdQbU5qempFZHE1eXNGT05yMUJHUSIga2V5PSJ3cENvbXBvc2l0ZVR5cGUiIHZhbHVlPSIyIi8+Ci0gICAgICAgICAgICAgIDxwb3NpdGlvbiB4bWk6aWQ9Il9mN1BtTnp6akVkcTV5c0ZPTnIxQkdRIiB4PSI2OS4wIiB5PSIyOTcuMCIvPgotICAgICAgICAgICAgICA8c2VtYW50aWNNb2RlbCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpVTUFTZW1hbnRpY01vZGVsQnJpZGdlIiB4bWk6aWQ9Il9mN1BtT0R6akVkcTV5c0ZPTnIxQkdRIiBndWlkPSJfZjdQbU9EempFZHE1eXNGT05yMUJHUSIgZWxlbWVudD0iX0ZydE1vRHppRWRxNXlzRk9OcjFCR1EiLz4KLSAgICAgICAgICAgICAgPHNpemUgeG1pOmlkPSJfZjdQbU9UempFZHE1eXNGT05yMUJHUSIgd2lkdGg9Ijk2LjAiIGhlaWdodD0iLTEuMCIvPgotICAgICAgICAgICAgPC9jb250YWluZWQ+Ci0gICAgICAgICAgICA8Y29udGFpbmVkIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkdyYXBoTm9kZSIgeG1pOmlkPSJfOGlFZDREejlFZHFFWnBUSzBXQVVkdyIgZ3VpZD0iXzhpRWQ0RHo5RWRxRVpwVEswV0FVZHciPgotICAgICAgICAgICAgICA8cHJvcGVydHkgeG1pOmlkPSJfOGlFZDRUejlFZHFFWnBUSzBXQVVkdyIgZ3VpZD0iXzhpRWQ0VHo5RWRxRVpwVEswV0FVZHciIGtleT0id3BDb21wb3NpdGVUeXBlIiB2YWx1ZT0iMSIvPgotICAgICAgICAgICAgICA8cG9zaXRpb24geG1pOmlkPSJfOGlFZDRqejlFZHFFWnBUSzBXQVVkdyIgeD0iMzQyLjAiIHk9IjUyLjAiLz4KLSAgICAgICAgICAgICAgPGNvbnRhaW5lZCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpHcmFwaEVkZ2UiIHhtaTppZD0iXzhpRWQ3VHo5RWRxRVpwVEswV0FVZHciIGd1aWQ9Il84aUVkN1R6OUVkcUVacFRLMFdBVWR3IiBhbmNob3I9Il84aUVkN0R6OUVkcUVacFRLMFdBVWR3Ii8+Ci0gICAgICAgICAgICAgIDxjb250YWluZWQgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6R3JhcGhFZGdlIiB4bWk6aWQ9Il9ZZHJpUXowQUVkcUVacFRLMFdBVWR3IiBndWlkPSJfWWRyaVF6MEFFZHFFWnBUSzBXQVVkdyIgYW5jaG9yPSJfWWRyaVFqMEFFZHFFWnBUSzBXQVVkdyIvPgotICAgICAgICAgICAgICA8Y29udGFpbmVkIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkdyYXBoRWRnZSIgeG1pOmlkPSJfWXc1Wk16MEFFZHFFWnBUSzBXQVVkdyIgZ3VpZD0iX1l3NVpNejBBRWRxRVpwVEswV0FVZHciIGFuY2hvcj0iX1l3NVpNajBBRWRxRVpwVEswV0FVZHciLz4KLSAgICAgICAgICAgICAgPGNvbnRhaW5lZCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpHcmFwaEVkZ2UiIHhtaTppZD0iX3lLWEFNejBlRWRxTk1fWVA1M0hLQnciIGd1aWQ9Il95S1hBTXowZUVkcU5NX1lQNTNIS0J3IiBhbmNob3I9Il95S1hBTWowZUVkcU5NX1lQNTNIS0J3Ii8+Ci0gICAgICAgICAgICAgIDxjb250YWluZWQgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6R3JhcGhFZGdlIiB4bWk6aWQ9Il95aURIY2owZUVkcU5NX1lQNTNIS0J3IiBndWlkPSJfeWlESGNqMGVFZHFOTV9ZUDUzSEtCdyIgYW5jaG9yPSJfeWlESGNUMGVFZHFOTV9ZUDUzSEtCdyIvPgotICAgICAgICAgICAgICA8YW5jaG9yYWdlIHhtaTppZD0iXzhpRWQ3RHo5RWRxRVpwVEswV0FVZHciIGd1aWQ9Il84aUVkN0R6OUVkcUVacFRLMFdBVWR3IiBncmFwaEVkZ2U9Il84aUVkN1R6OUVkcUVacFRLMFdBVWR3Ii8+Ci0gICAgICAgICAgICAgIDxhbmNob3JhZ2UgeG1pOmlkPSJfWWRyaVFqMEFFZHFFWnBUSzBXQVVkdyIgZ3VpZD0iX1lkcmlRajBBRWRxRVpwVEswV0FVZHciIGdyYXBoRWRnZT0iX1lkcmlRejBBRWRxRVpwVEswV0FVZHciLz4KLSAgICAgICAgICAgICAgPGFuY2hvcmFnZSB4bWk6aWQ9Il9ZdzVaTWowQUVkcUVacFRLMFdBVWR3IiBndWlkPSJfWXc1Wk1qMEFFZHFFWnBUSzBXQVVkdyIgZ3JhcGhFZGdlPSJfWXc1Wk16MEFFZHFFWnBUSzBXQVVkdyIvPgotICAgICAgICAgICAgICA8YW5jaG9yYWdlIHhtaTppZD0iX3lLWEFNajBlRWRxTk1fWVA1M0hLQnciIGd1aWQ9Il95S1hBTWowZUVkcU5NX1lQNTNIS0J3IiBncmFwaEVkZ2U9Il95S1hBTXowZUVkcU5NX1lQNTNIS0J3Ii8+Ci0gICAgICAgICAgICAgIDxhbmNob3JhZ2UgeG1pOmlkPSJfeWlESGNUMGVFZHFOTV9ZUDUzSEtCdyIgZ3VpZD0iX3lpREhjVDBlRWRxTk1fWVA1M0hLQnciIGdyYXBoRWRnZT0iX3lpREhjajBlRWRxTk1fWVA1M0hLQnciLz4KLSAgICAgICAgICAgICAgPHNlbWFudGljTW9kZWwgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VU1BU2VtYW50aWNNb2RlbEJyaWRnZSIgeG1pOmlkPSJfOGlFZDR6ejlFZHFFWnBUSzBXQVVkdyIgZ3VpZD0iXzhpRWQ0eno5RWRxRVpwVEswV0FVZHciIGVsZW1lbnQ9Il9Md0xRZ0R6aUVkcTV5c0ZPTnIxQkdRIi8+Ci0gICAgICAgICAgICAgIDxzaXplIHhtaTppZD0iXzhpRWQ1RHo5RWRxRVpwVEswV0FVZHciIHdpZHRoPSI2My4wIiBoZWlnaHQ9IjUyLjAiLz4KLSAgICAgICAgICAgIDwvY29udGFpbmVkPgotICAgICAgICAgICAgPGNvbnRhaW5lZCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpHcmFwaE5vZGUiIHhtaTppZD0iXzhpRWQ1VHo5RWRxRVpwVEswV0FVZHciIGd1aWQ9Il84aUVkNVR6OUVkcUVacFRLMFdBVWR3Ij4KLSAgICAgICAgICAgICAgPHByb3BlcnR5IHhtaTppZD0iXzhpRWQ1ano5RWRxRVpwVEswV0FVZHciIGd1aWQ9Il84aUVkNWp6OUVkcUVacFRLMFdBVWR3IiBrZXk9IndwQ29tcG9zaXRlVHlwZSIgdmFsdWU9IjIiLz4KLSAgICAgICAgICAgICAgPHBvc2l0aW9uIHhtaTppZD0iXzhpRWQ1eno5RWRxRVpwVEswV0FVZHciIHg9IjI3NC4wIiB5PSIyNTUuMCIvPgotICAgICAgICAgICAgICA8c2VtYW50aWNNb2RlbCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpVTUFTZW1hbnRpY01vZGVsQnJpZGdlIiB4bWk6aWQ9Il84aUVkNkR6OUVkcUVacFRLMFdBVWR3IiBndWlkPSJfOGlFZDZEejlFZHFFWnBUSzBXQVVkdyIgZWxlbWVudD0iX0x3TFFnRHppRWRxNXlzRk9OcjFCR1EiLz4KLSAgICAgICAgICAgICAgPHNpemUgeG1pOmlkPSJfOGlFZDZUejlFZHFFWnBUSzBXQVVkdyIgd2lkdGg9IjE1NC4wIiBoZWlnaHQ9IjUyLjAiLz4KLSAgICAgICAgICAgIDwvY29udGFpbmVkPgotICAgICAgICAgICAgPHNlbWFudGljTW9kZWwgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VU1BU2VtYW50aWNNb2RlbEJyaWRnZSIgeG1pOmlkPSJfZjZ5NlFEempFZHE1eXNGT05yMUJHUSIgZ3VpZD0iX2Y2eTZRRHpqRWRxNXlzRk9OcjFCR1EiIHByZXNlbnRhdGlvbj0iQWN0aXZpdHkgRGV0YWlsIiBlbGVtZW50PSJfRTczcklUemlFZHE1eXNGT05yMUJHUSIvPgotICAgICAgICAgIDwvZGlhZ3JhbXM+Ci0gICAgICAgIDwvY2hpbGRQYWNrYWdlcz4KLSAgICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc1BhY2thZ2UiIHhtaTppZD0iX0JTNmdFRHpsRWRxNXlzRk9OcjFCR1EiIG5hbWU9IkFjdGl2aXR5MiIgZ3VpZD0iX0JTNmdFRHpsRWRxNXlzRk9OcjFCR1EiPgotICAgICAgICAgIDxwcm9jZXNzRWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6QWN0aXZpdHkiIHhtaTppZD0iX0JTNmdFVHpsRWRxNXlzRk9OcjFCR1EiIG5hbWU9IkFjdGl2aXR5MiIgZ3VpZD0iX0JTNmdFVHpsRWRxNXlzRk9OcjFCR1EiIGJyaWVmRGVzY3JpcHRpb249IkFjdGl2aXR5MiBjb250YWluaW5kIERuRCB0YXNrcyIgcHJlc2VudGF0aW9uTmFtZT0iQWN0aXZpdHkyIGNvbnRhaW5pbmQgRG5EIHRhc2tzIiBwcmVmaXg9IlByZWZpeCIgc3VwZXJBY3Rpdml0aWVzPSJfRUZWcndUemlFZHE1eXNGT05yMUJHUSIgYnJlYWtkb3duRWxlbWVudHM9Il8wRFJfUUVERUVkcU85TTNmdWtZQV9BIF8wRGs2TUVERUVkcU85TTNmdWtZQV9BIF8wRGs2TVVERUVkcU85TTNmdWtZQV9BIF8wRHVyTUVERUVkcU85TTNmdWtZQV9BIF8wRHVyTVVERUVkcU85TTNmdWtZQV9BIF8wRHVyTWtERUVkcU85TTNmdWtZQV9BIF8wRHVyTTBERUVkcU85TTNmdWtZQV9BIF8yODg3RUVERUVkcU85TTNmdWtZQV9BIF8yOVpuQUVERUVkcU85TTNmdWtZQV9BIF8yOVpuQVVERUVkcU85TTNmdWtZQV9BIF8yOVpuQWtERUVkcU85TTNmdWtZQV9BIj4KLSAgICAgICAgICAgIDxwcmVzZW50YXRpb24geG1pOmlkPSItQWR3QWpuNXZSQ25FUVFMVWFZSjFkdyIgaHJlZj0idW1hOi8vLUUtZDRKY3UyOTdyeFVxOGx0ZThxbncjLUFkd0FqbjV2UkNuRVFRTFVhWUoxZHciLz4KLSAgICAgICAgICAgIDxyb2FkbWFwcyBocmVmPSJ1bWE6Ly9fZWN5NXdCTTNFZHFxbmRpLWdEdXhwdyNfOGhXakVCOHJFZHFRdk9qWDhkb0NDdyIvPgotICAgICAgICAgICAgPHN1cHBvcnRpbmdNYXRlcmlhbHMgaHJlZj0idW1hOi8vX2VjeTV3Qk0zRWRxcW5kaS1nRHV4cHcjX19iS28wQjhyRWRxUXZPalg4ZG9DQ3ciLz4KLSAgICAgICAgICAgIDxjaGVja2xpc3RzIGhyZWY9InVtYTovL19lY3k1d0JNM0VkcXFuZGktZ0R1eHB3I191ckxkY0I4ckVkcVF2T2pYOGRvQ0N3Ii8+Ci0gICAgICAgICAgICA8Y29uY2VwdHMgaHJlZj0idW1hOi8vX2VjeTV3Qk0zRWRxcW5kaS1nRHV4cHcjX0l2RDJFQjhzRWRxUXZPalg4ZG9DQ3ciLz4KLSAgICAgICAgICAgIDxjb25jZXB0cyBocmVmPSJ1bWE6Ly9fZWN5NXdCTTNFZHFxbmRpLWdEdXhwdyNfdzZFOThCOHJFZHFRdk9qWDhkb0NDdyIvPgotICAgICAgICAgICAgPGV4YW1wbGVzIGhyZWY9InVtYTovL19lY3k1d0JNM0VkcXFuZGktZ0R1eHB3I195UXpnVUI4ckVkcVF2T2pYOGRvQ0N3Ii8+Ci0gICAgICAgICAgICA8Z3VpZGVsaW5lcyBocmVmPSJ1bWE6Ly9fZWN5NXdCTTNFZHFxbmRpLWdEdXhwdyNfemtaUElCOHJFZHFRdk9qWDhkb0NDdyIvPgotICAgICAgICAgICAgPHJldXNhYmxlQXNzZXRzIGhyZWY9InVtYTovL19lY3k1d0JNM0VkcXFuZGktZ0R1eHB3I182N2s0RUI4ckVkcVF2T2pYOGRvQ0N3Ii8+Ci0gICAgICAgICAgPC9wcm9jZXNzRWxlbWVudHM+Ci0gICAgICAgICAgPHByb2Nlc3NFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpUYXNrRGVzY3JpcHRvciIgeG1pOmlkPSJfMERSX1FFREVFZHFPOU0zZnVrWUFfQSIgbmFtZT0idGFza19BMSIgZ3VpZD0iXzBEUl9RRURFRWRxTzlNM2Z1a1lBX0EiIGJyaWVmRGVzY3JpcHRpb249IlRhc2sgQTEgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IlRhc2sgQTEgIiBzdXBlckFjdGl2aXRpZXM9Il9CUzZnRVR6bEVkcTV5c0ZPTnIxQkdRIiBhZGRpdGlvbmFsbHlQZXJmb3JtZWRCeT0iXzBEazZNVURFRWRxTzlNM2Z1a1lBX0EiIG1hbmRhdG9yeUlucHV0PSJfMER1ck1FREVFZHFPOU0zZnVrWUFfQSBfMER1ck1VREVFZHFPOU0zZnVrWUFfQSIgb3B0aW9uYWxJbnB1dD0iXzBEdXJNa0RFRWRxTzlNM2Z1a1lBX0EiIG91dHB1dD0iXzBEdXJNMERFRWRxTzlNM2Z1a1lBX0EiIHBlcmZvcm1lZFByaW1hcmlseUJ5PSJfMERrNk1FREVFZHFPOU0zZnVrWUFfQSI+Ci0gICAgICAgICAgICA8cHJlc2VudGF0aW9uIHhtaTppZD0iLXpCQXMxMVJnTGdfWVNiczdCZGtTdVEiIGhyZWY9InVtYTovLy1FLWQ0SmN1Mjk3cnhVcThsdGU4cW53Iy16QkFzMTFSZ0xnX1lTYnM3QmRrU3VRIi8+Ci0gICAgICAgICAgICA8VGFzayBocmVmPSJ1bWE6Ly9feVVlTElBLVBFZHFMMk8xUEpWOWNaQSNfN004bnNBLVBFZHFMMk8xUEpWOWNaQSIvPgotICAgICAgICAgICAgPHNlbGVjdGVkU3RlcHMgaHJlZj0idW1hOi8vLVMxaWdMU2k2QUlfdmx1eldPQ3U2VHcjX3R2RjRNQkJQRWRxQnM3S2hkVkxSTEEiLz4KLSAgICAgICAgICAgIDxzZWxlY3RlZFN0ZXBzIGhyZWY9InVtYTovLy1TMWlnTFNpNkFJX3ZsdXpXT0N1NlR3I190emtJZ0JCUEVkcUJzN0toZFZMUkxBIi8+Ci0gICAgICAgICAgICA8c2VsZWN0ZWRTdGVwcyBocmVmPSJ1bWE6Ly8tUzFpZ0xTaTZBSV92bHV6V09DdTZUdyNfdUNCYlFCQlBFZHFCczdLaGRWTFJMQSIvPgotICAgICAgICAgIDwvcHJvY2Vzc0VsZW1lbnRzPgotICAgICAgICAgIDxwcm9jZXNzRWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Um9sZURlc2NyaXB0b3IiIHhtaTppZD0iXzBEazZNRURFRWRxTzlNM2Z1a1lBX0EiIG5hbWU9InJvbGVfQTEiIGd1aWQ9Il8wRGs2TUVERUVkcU85TTNmdWtZQV9BIiBicmllZkRlc2NyaXB0aW9uPSJSb2xlIEExIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJSb2xlIEExIiBzdXBlckFjdGl2aXRpZXM9Il9CUzZnRVR6bEVkcTV5c0ZPTnIxQkdRIiByZXNwb25zaWJsZUZvcj0iXzBEdXJNVURFRWRxTzlNM2Z1a1lBX0EgXzBEdXJNa0RFRWRxTzlNM2Z1a1lBX0EgXzBEdXJNMERFRWRxTzlNM2Z1a1lBX0EiPgotICAgICAgICAgICAgPHByZXNlbnRhdGlvbiB4bWk6aWQ9Ii13QlZ3bktOQTd2eFBacFk1aDBuakJRIiBocmVmPSJ1bWE6Ly8tRS1kNEpjdTI5N3J4VXE4bHRlOHFudyMtd0JWd25LTkE3dnhQWnBZNWgwbmpCUSIvPgotICAgICAgICAgICAgPFJvbGUgaHJlZj0idW1hOi8vX3lVZUxJQS1QRWRxTDJPMVBKVjljWkEjXzU1emswQS1QRWRxTDJPMVBKVjljWkEiLz4KLSAgICAgICAgICA8L3Byb2Nlc3NFbGVtZW50cz4KLSAgICAgICAgICA8cHJvY2Vzc0VsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlJvbGVEZXNjcmlwdG9yIiB4bWk6aWQ9Il8wRGs2TVVERUVkcU85TTNmdWtZQV9BIiBuYW1lPSJyb2xlX0EyIiBndWlkPSJfMERrNk1VREVFZHFPOU0zZnVrWUFfQSIgYnJpZWZEZXNjcmlwdGlvbj0iUm9sZSBBMiBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iUm9sZSBBMiAiIHN1cGVyQWN0aXZpdGllcz0iX0JTNmdFVHpsRWRxNXlzRk9OcjFCR1EiPgotICAgICAgICAgICAgPHByZXNlbnRhdGlvbiB4bWk6aWQ9Ii1fajNmOGRqd0t4c0thQ0hEbkpJcVZBIiBocmVmPSJ1bWE6Ly8tRS1kNEpjdTI5N3J4VXE4bHRlOHFudyMtX2ozZjhkandLeHNLYUNIRG5KSXFWQSIvPgotICAgICAgICAgICAgPFJvbGUgaHJlZj0idW1hOi8vX3lVZUxJQS1QRWRxTDJPMVBKVjljWkEjXzZrM1VBQS1QRWRxTDJPMVBKVjljWkEiLz4KLSAgICAgICAgICA8L3Byb2Nlc3NFbGVtZW50cz4KLSAgICAgICAgICA8cHJvY2Vzc0VsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOldvcmtQcm9kdWN0RGVzY3JpcHRvciIgeG1pOmlkPSJfMER1ck1FREVFZHFPOU0zZnVrWUFfQSIgbmFtZT0ic3ViX2FydGlmYWN0X0ExLjEiIGd1aWQ9Il8wRHVyTUVERUVkcU85TTNmdWtZQV9BIiBicmllZkRlc2NyaXB0aW9uPSJTdWJfQXJ0aWZhY3QgQTEuMSBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iU3ViX0FydGlmYWN0IEExLjEgcHJlc2VudCIgc3VwZXJBY3Rpdml0aWVzPSJfQlM2Z0VUemxFZHE1eXNGT05yMUJHUSI+Ci0gICAgICAgICAgICA8V29ya1Byb2R1Y3QgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6QXJ0aWZhY3QiIGhyZWY9InVtYTovL195VWVMSUEtUEVkcUwyTzFQSlY5Y1pBI19GNTF5d0EtUkVkcUwyTzFQSlY5Y1pBIi8+Ci0gICAgICAgICAgPC9wcm9jZXNzRWxlbWVudHM+Ci0gICAgICAgICAgPHByb2Nlc3NFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpXb3JrUHJvZHVjdERlc2NyaXB0b3IiIHhtaTppZD0iXzBEdXJNVURFRWRxTzlNM2Z1a1lBX0EiIG5hbWU9ImFydGlmYWN0X0ExIiBndWlkPSJfMER1ck1VREVFZHFPOU0zZnVrWUFfQSIgYnJpZWZEZXNjcmlwdGlvbj0iQXJ0aWZhY3QgQTEgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IkFydGlmYWN0IEExIHByZXNlbnQiIHN1cGVyQWN0aXZpdGllcz0iX0JTNmdFVHpsRWRxNXlzRk9OcjFCR1EiPgotICAgICAgICAgICAgPFdvcmtQcm9kdWN0IHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkFydGlmYWN0IiBocmVmPSJ1bWE6Ly9feVVlTElBLVBFZHFMMk8xUEpWOWNaQSNfOUt0NzhBLVBFZHFMMk8xUEpWOWNaQSIvPgotICAgICAgICAgIDwvcHJvY2Vzc0VsZW1lbnRzPgotICAgICAgICAgIDxwcm9jZXNzRWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6V29ya1Byb2R1Y3REZXNjcmlwdG9yIiB4bWk6aWQ9Il8wRHVyTWtERUVkcU85TTNmdWtZQV9BIiBuYW1lPSJkZWxpdmVyYWJsZV9BMSIgZ3VpZD0iXzBEdXJNa0RFRWRxTzlNM2Z1a1lBX0EiIGJyaWVmRGVzY3JpcHRpb249IkRlbGl2ZXJhYmxlIEExIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJEZWxpdmVyYWJsZSBBMSBwcmVzZW50IiBzdXBlckFjdGl2aXRpZXM9Il9CUzZnRVR6bEVkcTV5c0ZPTnIxQkdRIiBkZWxpdmVyYWJsZVBhcnRzPSJfMEVVaEVFREVFZHFPOU0zZnVrWUFfQSBfMEVVaEVVREVFZHFPOU0zZnVrWUFfQSBfMEVVaEVrREVFZHFPOU0zZnVrWUFfQSI+Ci0gICAgICAgICAgICA8V29ya1Byb2R1Y3QgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6RGVsaXZlcmFibGUiIGhyZWY9InVtYTovL195VWVMSUEtUEVkcUwyTzFQSlY5Y1pBI19JSVNuVUEtUkVkcUwyTzFQSlY5Y1pBIi8+Ci0gICAgICAgICAgPC9wcm9jZXNzRWxlbWVudHM+Ci0gICAgICAgICAgPHByb2Nlc3NFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpXb3JrUHJvZHVjdERlc2NyaXB0b3IiIHhtaTppZD0iXzBEdXJNMERFRWRxTzlNM2Z1a1lBX0EiIG5hbWU9Im91dGNvbWVfQTEiIGd1aWQ9Il8wRHVyTTBERUVkcU85TTNmdWtZQV9BIiBicmllZkRlc2NyaXB0aW9uPSJPdXRjb21lIEExIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJPdXRjb21lIEExIHByZXNlbnQiIHN1cGVyQWN0aXZpdGllcz0iX0JTNmdFVHpsRWRxNXlzRk9OcjFCR1EiPgotICAgICAgICAgICAgPFdvcmtQcm9kdWN0IHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOk91dGNvbWUiIGhyZWY9InVtYTovL195VWVMSUEtUEVkcUwyTzFQSlY5Y1pBI19LQV8xWUEtUkVkcUwyTzFQSlY5Y1pBIi8+Ci0gICAgICAgICAgPC9wcm9jZXNzRWxlbWVudHM+Ci0gICAgICAgICAgPHByb2Nlc3NFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpXb3JrUHJvZHVjdERlc2NyaXB0b3IiIHhtaTppZD0iXzBFVWhFRURFRWRxTzlNM2Z1a1lBX0EiIG5hbWU9ImFydGlmYWN0X0ExIiBndWlkPSJfMEVVaEVFREVFZHFPOU0zZnVrWUFfQSIgYnJpZWZEZXNjcmlwdGlvbj0iQXJ0aWZhY3QgQTEgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IkFydGlmYWN0IEExIHByZXNlbnQiPgotICAgICAgICAgICAgPFdvcmtQcm9kdWN0IHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkFydGlmYWN0IiBocmVmPSJ1bWE6Ly9feVVlTElBLVBFZHFMMk8xUEpWOWNaQSNfOUt0NzhBLVBFZHFMMk8xUEpWOWNaQSIvPgotICAgICAgICAgIDwvcHJvY2Vzc0VsZW1lbnRzPgotICAgICAgICAgIDxwcm9jZXNzRWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6V29ya1Byb2R1Y3REZXNjcmlwdG9yIiB4bWk6aWQ9Il8wRVVoRVVERUVkcU85TTNmdWtZQV9BIiBuYW1lPSJzdWJfYXJ0aWZhY3RfQTEuMSIgZ3VpZD0iXzBFVWhFVURFRWRxTzlNM2Z1a1lBX0EiIGJyaWVmRGVzY3JpcHRpb249IlN1Yl9BcnRpZmFjdCBBMS4xIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJTdWJfQXJ0aWZhY3QgQTEuMSBwcmVzZW50Ij4KLSAgICAgICAgICAgIDxXb3JrUHJvZHVjdCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpBcnRpZmFjdCIgaHJlZj0idW1hOi8vX3lVZUxJQS1QRWRxTDJPMVBKVjljWkEjX0Y1MXl3QS1SRWRxTDJPMVBKVjljWkEiLz4KLSAgICAgICAgICA8L3Byb2Nlc3NFbGVtZW50cz4KLSAgICAgICAgICA8cHJvY2Vzc0VsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOldvcmtQcm9kdWN0RGVzY3JpcHRvciIgeG1pOmlkPSJfMEVVaEVrREVFZHFPOU0zZnVrWUFfQSIgbmFtZT0ib3V0Y29tZV9BMSIgZ3VpZD0iXzBFVWhFa0RFRWRxTzlNM2Z1a1lBX0EiIGJyaWVmRGVzY3JpcHRpb249Ik91dGNvbWUgQTEgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9Ik91dGNvbWUgQTEgcHJlc2VudCI+Ci0gICAgICAgICAgICA8V29ya1Byb2R1Y3QgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6T3V0Y29tZSIgaHJlZj0idW1hOi8vX3lVZUxJQS1QRWRxTDJPMVBKVjljWkEjX0tBXzFZQS1SRWRxTDJPMVBKVjljWkEiLz4KLSAgICAgICAgICA8L3Byb2Nlc3NFbGVtZW50cz4KLSAgICAgICAgICA8cHJvY2Vzc0VsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlRhc2tEZXNjcmlwdG9yIiB4bWk6aWQ9Il8yODg3RUVERUVkcU85TTNmdWtZQV9BIiBuYW1lPSJ0YXNrX0EyIiBndWlkPSJfMjg4N0VFREVFZHFPOU0zZnVrWUFfQSIgYnJpZWZEZXNjcmlwdGlvbj0iVGFzayBBMiBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iVGFzayBBMiAiIHByZWZpeD0iUHJlZml4IiBzdXBlckFjdGl2aXRpZXM9Il9CUzZnRVR6bEVkcTV5c0ZPTnIxQkdRIiBhZGRpdGlvbmFsbHlQZXJmb3JtZWRCeT0iXzBEazZNRURFRWRxTzlNM2Z1a1lBX0EiIG1hbmRhdG9yeUlucHV0PSJfMjlabkFFREVFZHFPOU0zZnVrWUFfQSIgb3B0aW9uYWxJbnB1dD0iXzI5Wm5BVURFRWRxTzlNM2Z1a1lBX0EiIG91dHB1dD0iXzI5Wm5Ba0RFRWRxTzlNM2Z1a1lBX0EiIHBlcmZvcm1lZFByaW1hcmlseUJ5PSJfMERrNk1VREVFZHFPOU0zZnVrWUFfQSI+Ci0gICAgICAgICAgICA8cHJlc2VudGF0aW9uIHhtaTppZD0iLXliLUxHaWtjQTVNUGVSOEwzWVcyQ0EiIGhyZWY9InVtYTovLy1FLWQ0SmN1Mjk3cnhVcThsdGU4cW53Iy15Yi1MR2lrY0E1TVBlUjhMM1lXMkNBIi8+Ci0gICAgICAgICAgICA8VGFzayBocmVmPSJ1bWE6Ly9feVVlTElBLVBFZHFMMk8xUEpWOWNaQSNfNzVOUXdBLVBFZHFMMk8xUEpWOWNaQSIvPgotICAgICAgICAgICAgPHNlbGVjdGVkU3RlcHMgaHJlZj0idW1hOi8vLTEzcThKSkFhMGl4NnJETVpBcXd5MXcjX3RpMkJZQkJPRWRxQnM3S2hkVkxSTEEiLz4KLSAgICAgICAgICAgIDxzZWxlY3RlZFN0ZXBzIGhyZWY9InVtYTovLy0xM3E4SkpBYTBpeDZyRE1aQXF3eTF3I190azdzRUJCT0VkcUJzN0toZFZMUkxBIi8+Ci0gICAgICAgICAgICA8c2VsZWN0ZWRTdGVwcyBocmVmPSJ1bWE6Ly8tMTNxOEpKQWEwaXg2ckRNWkFxd3kxdyNfdG5kYm9CQk9FZHFCczdLaGRWTFJMQSIvPgotICAgICAgICAgIDwvcHJvY2Vzc0VsZW1lbnRzPgotICAgICAgICAgIDxwcm9jZXNzRWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6V29ya1Byb2R1Y3REZXNjcmlwdG9yIiB4bWk6aWQ9Il8yOVpuQUVERUVkcU85TTNmdWtZQV9BIiBuYW1lPSJhcnRpZmFjdF9BMiIgZ3VpZD0iXzI5Wm5BRURFRWRxTzlNM2Z1a1lBX0EiIGJyaWVmRGVzY3JpcHRpb249IkFydGlmYWN0IEEyIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJBcnRpZmFjdCBBMiBwcmVzZW50IiBzdXBlckFjdGl2aXRpZXM9Il9CUzZnRVR6bEVkcTV5c0ZPTnIxQkdRIj4KLSAgICAgICAgICAgIDxXb3JrUHJvZHVjdCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpBcnRpZmFjdCIgaHJlZj0idW1hOi8vX3lVZUxJQS1QRWRxTDJPMVBKVjljWkEjX0U3WjBrQS1SRWRxTDJPMVBKVjljWkEiLz4KLSAgICAgICAgICA8L3Byb2Nlc3NFbGVtZW50cz4KLSAgICAgICAgICA8cHJvY2Vzc0VsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOldvcmtQcm9kdWN0RGVzY3JpcHRvciIgeG1pOmlkPSJfMjlabkFVREVFZHFPOU0zZnVrWUFfQSIgbmFtZT0iZGVsaXZlcmFibGVfQTIiIGd1aWQ9Il8yOVpuQVVERUVkcU85TTNmdWtZQV9BIiBicmllZkRlc2NyaXB0aW9uPSJEZWxpdmVyYWJsZSBBMiBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iRGVsaXZlcmFibGUgQTIgcHJlc2VudCIgc3VwZXJBY3Rpdml0aWVzPSJfQlM2Z0VUemxFZHE1eXNGT05yMUJHUSIgZGVsaXZlcmFibGVQYXJ0cz0iXzI5c2g4RURFRWRxTzlNM2Z1a1lBX0EgXzI5c2g4VURFRWRxTzlNM2Z1a1lBX0EiPgotICAgICAgICAgICAgPFdvcmtQcm9kdWN0IHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkRlbGl2ZXJhYmxlIiBocmVmPSJ1bWE6Ly9feVVlTElBLVBFZHFMMk8xUEpWOWNaQSNfSkJxZlVBLVJFZHFMMk8xUEpWOWNaQSIvPgotICAgICAgICAgIDwvcHJvY2Vzc0VsZW1lbnRzPgotICAgICAgICAgIDxwcm9jZXNzRWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6V29ya1Byb2R1Y3REZXNjcmlwdG9yIiB4bWk6aWQ9Il8yOVpuQWtERUVkcU85TTNmdWtZQV9BIiBuYW1lPSJvdXRjb21lX0EyIiBndWlkPSJfMjlabkFrREVFZHFPOU0zZnVrWUFfQSIgYnJpZWZEZXNjcmlwdGlvbj0iT3V0Y29tZSBBMSBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iT3V0Y29tZSBBMiBwcmVzZW50IiBzdXBlckFjdGl2aXRpZXM9Il9CUzZnRVR6bEVkcTV5c0ZPTnIxQkdRIj4KLSAgICAgICAgICAgIDxXb3JrUHJvZHVjdCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpPdXRjb21lIiBocmVmPSJ1bWE6Ly9feVVlTElBLVBFZHFMMk8xUEpWOWNaQSNfS3ZMeEVBLVJFZHFMMk8xUEpWOWNaQSIvPgotICAgICAgICAgIDwvcHJvY2Vzc0VsZW1lbnRzPgotICAgICAgICAgIDxwcm9jZXNzRWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6V29ya1Byb2R1Y3REZXNjcmlwdG9yIiB4bWk6aWQ9Il8yOXNoOEVERUVkcU85TTNmdWtZQV9BIiBuYW1lPSJhcnRpZmFjdF9BMiIgZ3VpZD0iXzI5c2g4RURFRWRxTzlNM2Z1a1lBX0EiIGJyaWVmRGVzY3JpcHRpb249IkFydGlmYWN0IEEyIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJBcnRpZmFjdCBBMiBwcmVzZW50Ij4KLSAgICAgICAgICAgIDxXb3JrUHJvZHVjdCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpBcnRpZmFjdCIgaHJlZj0idW1hOi8vX3lVZUxJQS1QRWRxTDJPMVBKVjljWkEjX0U3WjBrQS1SRWRxTDJPMVBKVjljWkEiLz4KLSAgICAgICAgICA8L3Byb2Nlc3NFbGVtZW50cz4KLSAgICAgICAgICA8cHJvY2Vzc0VsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOldvcmtQcm9kdWN0RGVzY3JpcHRvciIgeG1pOmlkPSJfMjlzaDhVREVFZHFPOU0zZnVrWUFfQSIgbmFtZT0ib3V0Y29tZV9BMiIgZ3VpZD0iXzI5c2g4VURFRWRxTzlNM2Z1a1lBX0EiIGJyaWVmRGVzY3JpcHRpb249Ik91dGNvbWUgQTEgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9Ik91dGNvbWUgQTIgcHJlc2VudCI+Ci0gICAgICAgICAgICA8V29ya1Byb2R1Y3QgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6T3V0Y29tZSIgaHJlZj0idW1hOi8vX3lVZUxJQS1QRWRxTDJPMVBKVjljWkEjX0t2THhFQS1SRWRxTDJPMVBKVjljWkEiLz4KLSAgICAgICAgICA8L3Byb2Nlc3NFbGVtZW50cz4KLSAgICAgICAgICA8ZGlhZ3JhbXMgeG1pOmlkPSJfTmdEODhEem1FZHE1eXNGT05yMUJHUSIgZ3VpZD0iX05nRDg4RHptRWRxNXlzRk9OcjFCR1EiPgotICAgICAgICAgICAgPGNvbnRhaW5lZCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpHcmFwaE5vZGUiIHhtaTppZD0iX05nRDg4VHptRWRxNXlzRk9OcjFCR1EiIGd1aWQ9Il9OZ0Q4OFR6bUVkcTV5c0ZPTnIxQkdRIj4KLSAgICAgICAgICAgICAgPHBvc2l0aW9uIHhtaTppZD0iX05nRDg4anptRWRxNXlzRk9OcjFCR1EiIHg9Ii0xLjAiIHk9Ii0xLjAiLz4KLSAgICAgICAgICAgICAgPHNlbWFudGljTW9kZWwgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VU1BU2VtYW50aWNNb2RlbEJyaWRnZSIgeG1pOmlkPSJfTmdEODh6em1FZHE1eXNGT05yMUJHUSIgZ3VpZD0iX05nRDg4enptRWRxNXlzRk9OcjFCR1EiLz4KLSAgICAgICAgICAgICAgPHNpemUgeG1pOmlkPSJfTmdEODlEem1FZHE1eXNGT05yMUJHUSIgd2lkdGg9Ii0xLjAiIGhlaWdodD0iLTEuMCIvPgotICAgICAgICAgICAgPC9jb250YWluZWQ+Ci0gICAgICAgICAgICA8Y29udGFpbmVkIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkdyYXBoTm9kZSIgeG1pOmlkPSJfTmdEODlUem1FZHE1eXNGT05yMUJHUSIgZ3VpZD0iX05nRDg5VHptRWRxNXlzRk9OcjFCR1EiPgotICAgICAgICAgICAgICA8cG9zaXRpb24geG1pOmlkPSJfTmdEODlqem1FZHE1eXNGT05yMUJHUSIgeD0iMTAuMCIgeT0iMTg2LjAiLz4KLSAgICAgICAgICAgICAgPHNlbWFudGljTW9kZWwgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VU1BU2VtYW50aWNNb2RlbEJyaWRnZSIgeG1pOmlkPSJfTmdEODl6em1FZHE1eXNGT05yMUJHUSIgZ3VpZD0iX05nRDg5enptRWRxNXlzRk9OcjFCR1EiLz4KLSAgICAgICAgICAgICAgPHNpemUgeG1pOmlkPSJfTmdEOC1Eem1FZHE1eXNGT05yMUJHUSIgd2lkdGg9Ii0xLjAiIGhlaWdodD0iLTEuMCIvPgotICAgICAgICAgICAgPC9jb250YWluZWQ+Ci0gICAgICAgICAgICA8Y29udGFpbmVkIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkdyYXBoTm9kZSIgeG1pOmlkPSJfTmdEOC1Uem1FZHE1eXNGT05yMUJHUSIgZ3VpZD0iX05nRDgtVHptRWRxNXlzRk9OcjFCR1EiPgotICAgICAgICAgICAgICA8cG9zaXRpb24geG1pOmlkPSJfTmdEOC1qem1FZHE1eXNGT05yMUJHUSIgeD0iLTEuMCIgeT0iLTEuMCIvPgotICAgICAgICAgICAgICA8c2VtYW50aWNNb2RlbCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpVTUFTZW1hbnRpY01vZGVsQnJpZGdlIiB4bWk6aWQ9Il9OZ0Q4LXp6bUVkcTV5c0ZPTnIxQkdRIiBndWlkPSJfTmdEOC16em1FZHE1eXNGT05yMUJHUSIvPgotICAgICAgICAgICAgICA8c2l6ZSB4bWk6aWQ9Il9OZ0Q4X0R6bUVkcTV5c0ZPTnIxQkdRIiB3aWR0aD0iLTEuMCIgaGVpZ2h0PSItMS4wIi8+Ci0gICAgICAgICAgICA8L2NvbnRhaW5lZD4KLSAgICAgICAgICAgIDxjb250YWluZWQgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6R3JhcGhOb2RlIiB4bWk6aWQ9Il9OZ0Q4X1R6bUVkcTV5c0ZPTnIxQkdRIiBndWlkPSJfTmdEOF9Uem1FZHE1eXNGT05yMUJHUSI+Ci0gICAgICAgICAgICAgIDxwb3NpdGlvbiB4bWk6aWQ9Il9OZ0Q4X2p6bUVkcTV5c0ZPTnIxQkdRIiB4PSItMS4wIiB5PSItMS4wIi8+Ci0gICAgICAgICAgICAgIDxzZW1hbnRpY01vZGVsIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlVNQVNlbWFudGljTW9kZWxCcmlkZ2UiIHhtaTppZD0iX05nRDhfenptRWRxNXlzRk9OcjFCR1EiIGd1aWQ9Il9OZ0Q4X3p6bUVkcTV5c0ZPTnIxQkdRIi8+Ci0gICAgICAgICAgICAgIDxzaXplIHhtaTppZD0iX05nRDlBRHptRWRxNXlzRk9OcjFCR1EiIHdpZHRoPSItMS4wIiBoZWlnaHQ9Ii0xLjAiLz4KLSAgICAgICAgICAgIDwvY29udGFpbmVkPgotICAgICAgICAgICAgPGNvbnRhaW5lZCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpHcmFwaE5vZGUiIHhtaTppZD0iX05nRDlBVHptRWRxNXlzRk9OcjFCR1EiIGd1aWQ9Il9OZ0Q5QVR6bUVkcTV5c0ZPTnIxQkdRIj4KLSAgICAgICAgICAgICAgPHBvc2l0aW9uIHhtaTppZD0iX05nRDlBanptRWRxNXlzRk9OcjFCR1EiIHg9Ii0xLjAiIHk9Ii0xLjAiLz4KLSAgICAgICAgICAgICAgPHNlbWFudGljTW9kZWwgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VU1BU2VtYW50aWNNb2RlbEJyaWRnZSIgeG1pOmlkPSJfTmdEOUF6em1FZHE1eXNGT05yMUJHUSIgZ3VpZD0iX05nRDlBenptRWRxNXlzRk9OcjFCR1EiLz4KLSAgICAgICAgICAgICAgPHNpemUgeG1pOmlkPSJfTmdEOUJEem1FZHE1eXNGT05yMUJHUSIgd2lkdGg9Ii0xLjAiIGhlaWdodD0iLTEuMCIvPgotICAgICAgICAgICAgPC9jb250YWluZWQ+Ci0gICAgICAgICAgICA8Y29udGFpbmVkIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkdyYXBoTm9kZSIgeG1pOmlkPSJfTmdEOUJUem1FZHE1eXNGT05yMUJHUSIgZ3VpZD0iX05nRDlCVHptRWRxNXlzRk9OcjFCR1EiPgotICAgICAgICAgICAgICA8cG9zaXRpb24geG1pOmlkPSJfTmdEOUJqem1FZHE1eXNGT05yMUJHUSIgeD0iLTEuMCIgeT0iLTEuMCIvPgotICAgICAgICAgICAgICA8c2VtYW50aWNNb2RlbCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpVTUFTZW1hbnRpY01vZGVsQnJpZGdlIiB4bWk6aWQ9Il9OZ0Q5Qnp6bUVkcTV5c0ZPTnIxQkdRIiBndWlkPSJfTmdEOUJ6em1FZHE1eXNGT05yMUJHUSIvPgotICAgICAgICAgICAgICA8c2l6ZSB4bWk6aWQ9Il9OZ0Q5Q0R6bUVkcTV5c0ZPTnIxQkdRIiB3aWR0aD0iLTEuMCIgaGVpZ2h0PSItMS4wIi8+Ci0gICAgICAgICAgICA8L2NvbnRhaW5lZD4KLSAgICAgICAgICAgIDxjb250YWluZWQgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6R3JhcGhOb2RlIiB4bWk6aWQ9Il9OZ0Q5Q1R6bUVkcTV5c0ZPTnIxQkdRIiBndWlkPSJfTmdEOUNUem1FZHE1eXNGT05yMUJHUSI+Ci0gICAgICAgICAgICAgIDxwb3NpdGlvbiB4bWk6aWQ9Il9OZ0Q5Q2p6bUVkcTV5c0ZPTnIxQkdRIiB4PSItMS4wIiB5PSItMS4wIi8+Ci0gICAgICAgICAgICAgIDxzZW1hbnRpY01vZGVsIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlVNQVNlbWFudGljTW9kZWxCcmlkZ2UiIHhtaTppZD0iX05nRDlDenptRWRxNXlzRk9OcjFCR1EiIGd1aWQ9Il9OZ0Q5Q3p6bUVkcTV5c0ZPTnIxQkdRIi8+Ci0gICAgICAgICAgICAgIDxzaXplIHhtaTppZD0iX05nRDlERHptRWRxNXlzRk9OcjFCR1EiIHdpZHRoPSItMS4wIiBoZWlnaHQ9Ii0xLjAiLz4KLSAgICAgICAgICAgIDwvY29udGFpbmVkPgotICAgICAgICAgICAgPGNvbnRhaW5lZCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpHcmFwaE5vZGUiIHhtaTppZD0iX05nRDlEVHptRWRxNXlzRk9OcjFCR1EiIGd1aWQ9Il9OZ0Q5RFR6bUVkcTV5c0ZPTnIxQkdRIj4KLSAgICAgICAgICAgICAgPHBvc2l0aW9uIHhtaTppZD0iX05nRDlEanptRWRxNXlzRk9OcjFCR1EiIHg9IjEwLjAiIHk9IjU4NC4wIi8+Ci0gICAgICAgICAgICAgIDxzZW1hbnRpY01vZGVsIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlVNQVNlbWFudGljTW9kZWxCcmlkZ2UiIHhtaTppZD0iX05nRDlEenptRWRxNXlzRk9OcjFCR1EiIGd1aWQ9Il9OZ0Q5RHp6bUVkcTV5c0ZPTnIxQkdRIi8+Ci0gICAgICAgICAgICAgIDxzaXplIHhtaTppZD0iX05nRDlFRHptRWRxNXlzRk9OcjFCR1EiIHdpZHRoPSItMS4wIiBoZWlnaHQ9Ii0xLjAiLz4KLSAgICAgICAgICAgIDwvY29udGFpbmVkPgotICAgICAgICAgICAgPGNvbnRhaW5lZCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpHcmFwaE5vZGUiIHhtaTppZD0iX05nRDlFVHptRWRxNXlzRk9OcjFCR1EiIGd1aWQ9Il9OZ0Q5RVR6bUVkcTV5c0ZPTnIxQkdRIj4KLSAgICAgICAgICAgICAgPHBvc2l0aW9uIHhtaTppZD0iX05nRDlFanptRWRxNXlzRk9OcjFCR1EiIHg9Ii0xLjAiIHk9Ii0xLjAiLz4KLSAgICAgICAgICAgICAgPHNlbWFudGljTW9kZWwgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VU1BU2VtYW50aWNNb2RlbEJyaWRnZSIgeG1pOmlkPSJfTmdEOUV6em1FZHE1eXNGT05yMUJHUSIgZ3VpZD0iX05nRDlFenptRWRxNXlzRk9OcjFCR1EiLz4KLSAgICAgICAgICAgICAgPHNpemUgeG1pOmlkPSJfTmdEOUZEem1FZHE1eXNGT05yMUJHUSIgd2lkdGg9Ii0xLjAiIGhlaWdodD0iLTEuMCIvPgotICAgICAgICAgICAgPC9jb250YWluZWQ+Ci0gICAgICAgICAgICA8Y29udGFpbmVkIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkdyYXBoTm9kZSIgeG1pOmlkPSJfTmdEOUZUem1FZHE1eXNGT05yMUJHUSIgZ3VpZD0iX05nRDlGVHptRWRxNXlzRk9OcjFCR1EiPgotICAgICAgICAgICAgICA8cG9zaXRpb24geG1pOmlkPSJfTmdEOUZqem1FZHE1eXNGT05yMUJHUSIgeD0iLTEuMCIgeT0iLTEuMCIvPgotICAgICAgICAgICAgICA8c2VtYW50aWNNb2RlbCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpVTUFTZW1hbnRpY01vZGVsQnJpZGdlIiB4bWk6aWQ9Il9OZ0Q5Rnp6bUVkcTV5c0ZPTnIxQkdRIiBndWlkPSJfTmdEOUZ6em1FZHE1eXNGT05yMUJHUSIvPgotICAgICAgICAgICAgICA8c2l6ZSB4bWk6aWQ9Il9OZ0Q5R0R6bUVkcTV5c0ZPTnIxQkdRIiB3aWR0aD0iLTEuMCIgaGVpZ2h0PSItMS4wIi8+Ci0gICAgICAgICAgICA8L2NvbnRhaW5lZD4KLSAgICAgICAgICAgIDxjb250YWluZWQgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6R3JhcGhOb2RlIiB4bWk6aWQ9Il9OZ0Q5R1R6bUVkcTV5c0ZPTnIxQkdRIiBndWlkPSJfTmdEOUdUem1FZHE1eXNGT05yMUJHUSI+Ci0gICAgICAgICAgICAgIDxwb3NpdGlvbiB4bWk6aWQ9Il9OZ0Q5R2p6bUVkcTV5c0ZPTnIxQkdRIiB4PSItMS4wIiB5PSItMS4wIi8+Ci0gICAgICAgICAgICAgIDxzZW1hbnRpY01vZGVsIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlVNQVNlbWFudGljTW9kZWxCcmlkZ2UiIHhtaTppZD0iX05nRDlHenptRWRxNXlzRk9OcjFCR1EiIGd1aWQ9Il9OZ0Q5R3p6bUVkcTV5c0ZPTnIxQkdRIi8+Ci0gICAgICAgICAgICAgIDxzaXplIHhtaTppZD0iX05nRDlIRHptRWRxNXlzRk9OcjFCR1EiIHdpZHRoPSItMS4wIiBoZWlnaHQ9Ii0xLjAiLz4KLSAgICAgICAgICAgIDwvY29udGFpbmVkPgotICAgICAgICAgICAgPGNvbnRhaW5lZCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpHcmFwaE5vZGUiIHhtaTppZD0iX05nRDlIVHptRWRxNXlzRk9OcjFCR1EiIGd1aWQ9Il9OZ0Q5SFR6bUVkcTV5c0ZPTnIxQkdRIj4KLSAgICAgICAgICAgICAgPHBvc2l0aW9uIHhtaTppZD0iX05nRDlIanptRWRxNXlzRk9OcjFCR1EiIHg9Ii0xLjAiIHk9Ii0xLjAiLz4KLSAgICAgICAgICAgICAgPHNlbWFudGljTW9kZWwgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VU1BU2VtYW50aWNNb2RlbEJyaWRnZSIgeG1pOmlkPSJfTmdEOUh6em1FZHE1eXNGT05yMUJHUSIgZ3VpZD0iX05nRDlIenptRWRxNXlzRk9OcjFCR1EiLz4KLSAgICAgICAgICAgICAgPHNpemUgeG1pOmlkPSJfTmdEOUlEem1FZHE1eXNGT05yMUJHUSIgd2lkdGg9Ii0xLjAiIGhlaWdodD0iLTEuMCIvPgotICAgICAgICAgICAgPC9jb250YWluZWQ+Ci0gICAgICAgICAgICA8Y29udGFpbmVkIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkdyYXBoTm9kZSIgeG1pOmlkPSJfTmdOdDhEem1FZHE1eXNGT05yMUJHUSIgZ3VpZD0iX05nTnQ4RHptRWRxNXlzRk9OcjFCR1EiPgotICAgICAgICAgICAgICA8cHJvcGVydHkgeG1pOmlkPSJfTmdOdDhUem1FZHE1eXNGT05yMUJHUSIgZ3VpZD0iX05nTnQ4VHptRWRxNXlzRk9OcjFCR1EiIGtleT0id3BDb21wb3NpdGVUeXBlIiB2YWx1ZT0iMSIvPgotICAgICAgICAgICAgICA8cG9zaXRpb24geG1pOmlkPSJfTmdOdDhqem1FZHE1eXNGT05yMUJHUSIgeD0iMTAuMCIgeT0iNjAuMCIvPgotICAgICAgICAgICAgICA8Y29udGFpbmVkIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkdyYXBoRWRnZSIgeG1pOmlkPSJfTmdOdUJUem1FZHE1eXNGT05yMUJHUSIgZ3VpZD0iX05nTnVCVHptRWRxNXlzRk9OcjFCR1EiIGFuY2hvcj0iX05nTnVCRHptRWRxNXlzRk9OcjFCR1EiLz4KLSAgICAgICAgICAgICAgPGNvbnRhaW5lZCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpHcmFwaEVkZ2UiIHhtaTppZD0iX04wN1pzVHptRWRxNXlzRk9OcjFCR1EiIGd1aWQ9Il9OMDdac1R6bUVkcTV5c0ZPTnIxQkdRIiBhbmNob3I9Il9OMDdac0R6bUVkcTV5c0ZPTnIxQkdRIi8+Ci0gICAgICAgICAgICAgIDxhbmNob3JhZ2UgeG1pOmlkPSJfTmdOdUJEem1FZHE1eXNGT05yMUJHUSIgZ3VpZD0iX05nTnVCRHptRWRxNXlzRk9OcjFCR1EiIGdyYXBoRWRnZT0iX05nTnVCVHptRWRxNXlzRk9OcjFCR1EiLz4KLSAgICAgICAgICAgICAgPGFuY2hvcmFnZSB4bWk6aWQ9Il9OMDdac0R6bUVkcTV5c0ZPTnIxQkdRIiBndWlkPSJfTjA3WnNEem1FZHE1eXNGT05yMUJHUSIgZ3JhcGhFZGdlPSJfTjA3WnNUem1FZHE1eXNGT05yMUJHUSIvPgotICAgICAgICAgICAgICA8c2VtYW50aWNNb2RlbCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpVTUFTZW1hbnRpY01vZGVsQnJpZGdlIiB4bWk6aWQ9Il9OZ050OHp6bUVkcTV5c0ZPTnIxQkdRIiBndWlkPSJfTmdOdDh6em1FZHE1eXNGT05yMUJHUSIvPgotICAgICAgICAgICAgICA8c2l6ZSB4bWk6aWQ9Il9OZ050OUR6bUVkcTV5c0ZPTnIxQkdRIiB3aWR0aD0iLTEuMCIgaGVpZ2h0PSItMS4wIi8+Ci0gICAgICAgICAgICA8L2NvbnRhaW5lZD4KLSAgICAgICAgICAgIDxjb250YWluZWQgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6R3JhcGhOb2RlIiB4bWk6aWQ9Il9OZ050OVR6bUVkcTV5c0ZPTnIxQkdRIiBndWlkPSJfTmdOdDlUem1FZHE1eXNGT05yMUJHUSI+Ci0gICAgICAgICAgICAgIDxwcm9wZXJ0eSB4bWk6aWQ9Il9OZ050OWp6bUVkcTV5c0ZPTnIxQkdRIiBndWlkPSJfTmdOdDlqem1FZHE1eXNGT05yMUJHUSIga2V5PSJ3cENvbXBvc2l0ZVR5cGUiIHZhbHVlPSIyIi8+Ci0gICAgICAgICAgICAgIDxwb3NpdGlvbiB4bWk6aWQ9Il9OZ050OXp6bUVkcTV5c0ZPTnIxQkdRIiB4PSIxMC4wIiB5PSIzMTIuMCIvPgotICAgICAgICAgICAgICA8c2VtYW50aWNNb2RlbCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpVTUFTZW1hbnRpY01vZGVsQnJpZGdlIiB4bWk6aWQ9Il9OZ050LUR6bUVkcTV5c0ZPTnIxQkdRIiBndWlkPSJfTmdOdC1Eem1FZHE1eXNGT05yMUJHUSIvPgotICAgICAgICAgICAgICA8c2l6ZSB4bWk6aWQ9Il9OZ050LVR6bUVkcTV5c0ZPTnIxQkdRIiB3aWR0aD0iLTEuMCIgaGVpZ2h0PSItMS4wIi8+Ci0gICAgICAgICAgICA8L2NvbnRhaW5lZD4KLSAgICAgICAgICAgIDxjb250YWluZWQgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6R3JhcGhOb2RlIiB4bWk6aWQ9Il9OZ050LWp6bUVkcTV5c0ZPTnIxQkdRIiBndWlkPSJfTmdOdC1qem1FZHE1eXNGT05yMUJHUSI+Ci0gICAgICAgICAgICAgIDxwcm9wZXJ0eSB4bWk6aWQ9Il9OZ050LXp6bUVkcTV5c0ZPTnIxQkdRIiBndWlkPSJfTmdOdC16em1FZHE1eXNGT05yMUJHUSIga2V5PSJ3cENvbXBvc2l0ZVR5cGUiIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgICAgIDxwb3NpdGlvbiB4bWk6aWQ9Il9OZ050X0R6bUVkcTV5c0ZPTnIxQkdRIiB4PSIxMC4wIiB5PSI0NDguMCIvPgotICAgICAgICAgICAgICA8Y29udGFpbmVkIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkdyYXBoRWRnZSIgeG1pOmlkPSJfTmdOdUJ6em1FZHE1eXNGT05yMUJHUSIgZ3VpZD0iX05nTnVCenptRWRxNXlzRk9OcjFCR1EiIGFuY2hvcj0iX05nTnVCanptRWRxNXlzRk9OcjFCR1EiLz4KLSAgICAgICAgICAgICAgPGNvbnRhaW5lZCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpHcmFwaEVkZ2UiIHhtaTppZD0iX04wN1pzenptRWRxNXlzRk9OcjFCR1EiIGd1aWQ9Il9OMDdac3p6bUVkcTV5c0ZPTnIxQkdRIiBhbmNob3I9Il9OMDdac2p6bUVkcTV5c0ZPTnIxQkdRIi8+Ci0gICAgICAgICAgICAgIDxhbmNob3JhZ2UgeG1pOmlkPSJfTmdOdUJqem1FZHE1eXNGT05yMUJHUSIgZ3VpZD0iX05nTnVCanptRWRxNXlzRk9OcjFCR1EiIGdyYXBoRWRnZT0iX05nTnVCenptRWRxNXlzRk9OcjFCR1EiLz4KLSAgICAgICAgICAgICAgPGFuY2hvcmFnZSB4bWk6aWQ9Il9OMDdac2p6bUVkcTV5c0ZPTnIxQkdRIiBndWlkPSJfTjA3WnNqem1FZHE1eXNGT05yMUJHUSIgZ3JhcGhFZGdlPSJfTjA3WnN6em1FZHE1eXNGT05yMUJHUSIvPgotICAgICAgICAgICAgICA8c2VtYW50aWNNb2RlbCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpVTUFTZW1hbnRpY01vZGVsQnJpZGdlIiB4bWk6aWQ9Il9OZ050X1R6bUVkcTV5c0ZPTnIxQkdRIiBndWlkPSJfTmdOdF9Uem1FZHE1eXNGT05yMUJHUSIvPgotICAgICAgICAgICAgICA8c2l6ZSB4bWk6aWQ9Il9OZ050X2p6bUVkcTV5c0ZPTnIxQkdRIiB3aWR0aD0iLTEuMCIgaGVpZ2h0PSItMS4wIi8+Ci0gICAgICAgICAgICA8L2NvbnRhaW5lZD4KLSAgICAgICAgICAgIDxjb250YWluZWQgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6R3JhcGhOb2RlIiB4bWk6aWQ9Il9OZ050X3p6bUVkcTV5c0ZPTnIxQkdRIiBndWlkPSJfTmdOdF96em1FZHE1eXNGT05yMUJHUSI+Ci0gICAgICAgICAgICAgIDxwcm9wZXJ0eSB4bWk6aWQ9Il9OZ051QUR6bUVkcTV5c0ZPTnIxQkdRIiBndWlkPSJfTmdOdUFEem1FZHE1eXNGT05yMUJHUSIga2V5PSJ3cENvbXBvc2l0ZVR5cGUiIHZhbHVlPSIyIi8+Ci0gICAgICAgICAgICAgIDxwb3NpdGlvbiB4bWk6aWQ9Il9OZ051QVR6bUVkcTV5c0ZPTnIxQkdRIiB4PSIxMC4wIiB5PSI3MjAuMCIvPgotICAgICAgICAgICAgICA8c2VtYW50aWNNb2RlbCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpVTUFTZW1hbnRpY01vZGVsQnJpZGdlIiB4bWk6aWQ9Il9OZ051QWp6bUVkcTV5c0ZPTnIxQkdRIiBndWlkPSJfTmdOdUFqem1FZHE1eXNGT05yMUJHUSIvPgotICAgICAgICAgICAgICA8c2l6ZSB4bWk6aWQ9Il9OZ051QXp6bUVkcTV5c0ZPTnIxQkdRIiB3aWR0aD0iLTEuMCIgaGVpZ2h0PSItMS4wIi8+Ci0gICAgICAgICAgICA8L2NvbnRhaW5lZD4KLSAgICAgICAgICAgIDxzZW1hbnRpY01vZGVsIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlVNQVNlbWFudGljTW9kZWxCcmlkZ2UiIHhtaTppZD0iX05nRDlJVHptRWRxNXlzRk9OcjFCR1EiIGd1aWQ9Il9OZ0Q5SVR6bUVkcTV5c0ZPTnIxQkdRIiBwcmVzZW50YXRpb249IkFjdGl2aXR5IERldGFpbCIgZWxlbWVudD0iX0JTNmdFVHpsRWRxNXlzRk9OcjFCR1EiLz4KLSAgICAgICAgICA8L2RpYWdyYW1zPgotICAgICAgICA8L2NoaWxkUGFja2FnZXM+Ci0gICAgICAgIDxwcm9jZXNzRWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6SXRlcmF0aW9uIiB4bWk6aWQ9Il9FRlZyd1R6aUVkcTV5c0ZPTnIxQkdRIiBuYW1lPSJJdGVyYXRpb24xIiBndWlkPSJfRUZWcndUemlFZHE1eXNGT05yMUJHUSIgYnJpZWZEZXNjcmlwdGlvbj0iVGhpcyBpdGVyYXRpb24gY29udGFpbnMgdHdvIGFjdGl2aXRpZXMiIHByZXNlbnRhdGlvbk5hbWU9Ikl0ZXJhdGlvbjEiIHByZWZpeD0iUHJlZml4IiBzdXBlckFjdGl2aXRpZXM9Il9EYWtRY0R6aUVkcTV5c0ZPTnIxQkdRIiBpc09uZ29pbmc9InRydWUiIGJyZWFrZG93bkVsZW1lbnRzPSJfRTczcklUemlFZHE1eXNGT05yMUJHUSBfQlM2Z0VUemxFZHE1eXNGT05yMUJHUSI+Ci0gICAgICAgICAgPHByZXNlbnRhdGlvbiB4bWk6aWQ9Ii1WUlVDU2hBdlhyc0xnczdQWnpIZ1V3IiBocmVmPSJ1bWE6Ly8tRS1kNEpjdTI5N3J4VXE4bHRlOHFudyMtVlJVQ1NoQXZYcnNMZ3M3UFp6SGdVdyIvPgotICAgICAgICAgIDxyb2FkbWFwcyBocmVmPSJ1bWE6Ly9feVVlTElBLVBFZHFMMk8xUEpWOWNaQSNfWXVrZ1FBLVZFZHFMMk8xUEpWOWNaQSIvPgotICAgICAgICAgIDxzdXBwb3J0aW5nTWF0ZXJpYWxzIGhyZWY9InVtYTovL195VWVMSUEtUEVkcUwyTzFQSlY5Y1pBI19tUHNfY0EtVUVkcUwyTzFQSlY5Y1pBIi8+Ci0gICAgICAgICAgPGNoZWNrbGlzdHMgaHJlZj0idW1hOi8vX3lVZUxJQS1QRWRxTDJPMVBKVjljWkEjX2tyaVRjQS1URWRxTDJPMVBKVjljWkEiLz4KLSAgICAgICAgICA8Y29uY2VwdHMgaHJlZj0idW1hOi8vX3lVZUxJQS1QRWRxTDJPMVBKVjljWkEjXzNYcjBFQS1VRWRxTDJPMVBKVjljWkEiLz4KLSAgICAgICAgICA8Y29uY2VwdHMgaHJlZj0idW1hOi8vX3lVZUxJQS1QRWRxTDJPMVBKVjljWkEjX09WTFZjQS1URWRxTDJPMVBKVjljWkEiLz4KLSAgICAgICAgICA8ZXhhbXBsZXMgaHJlZj0idW1hOi8vX3lVZUxJQS1QRWRxTDJPMVBKVjljWkEjX3VhaldjQS1URWRxTDJPMVBKVjljWkEiLz4KLSAgICAgICAgICA8Z3VpZGVsaW5lcyBocmVmPSJ1bWE6Ly9feVVlTElBLVBFZHFMMk8xUEpWOWNaQSNfNllVd0FBLVRFZHFMMk8xUEpWOWNaQSIvPgotICAgICAgICAgIDxyZXVzYWJsZUFzc2V0cyBocmVmPSJ1bWE6Ly9feVVlTElBLVBFZHFMMk8xUEpWOWNaQSNfU01jM0VBLVZFZHFMMk8xUEpWOWNaQSIvPgotICAgICAgICA8L3Byb2Nlc3NFbGVtZW50cz4KLSAgICAgICAgPGRpYWdyYW1zIHhtaTppZD0iX3JrVzhrRDBlRWRxTk1fWVA1M0hLQnciIGd1aWQ9Il9ya1c4a0QwZUVkcU5NX1lQNTNIS0J3Ij4KLSAgICAgICAgICA8c2VtYW50aWNNb2RlbCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpVTUFTZW1hbnRpY01vZGVsQnJpZGdlIiB4bWk6aWQ9Il9ya1c4a1QwZUVkcU5NX1lQNTNIS0J3IiBndWlkPSJfcmtXOGtUMGVFZHFOTV9ZUDUzSEtCdyIgcHJlc2VudGF0aW9uPSJBY3Rpdml0eSBEZXRhaWwiIGVsZW1lbnQ9Il9FRlZyd1R6aUVkcTV5c0ZPTnIxQkdRIi8+Ci0gICAgICAgIDwvZGlhZ3JhbXM+Ci0gICAgICA8L2NoaWxkUGFja2FnZXM+Ci0gICAgICA8cHJvY2Vzc0VsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlBoYXNlIiB4bWk6aWQ9Il9EYWtRY0R6aUVkcTV5c0ZPTnIxQkdRIiBuYW1lPSJQaGFzZTEiIGd1aWQ9Il9EYWtRY0R6aUVkcTV5c0ZPTnIxQkdRIiBwcmVzZW50YXRpb25OYW1lPSJQaGFzZTEiIHN1cGVyQWN0aXZpdGllcz0iXzRzQ3RzVHpnRWRxNXlzRk9OcjFCR1EiIGJyZWFrZG93bkVsZW1lbnRzPSJfRUZWcndUemlFZHE1eXNGT05yMUJHUSIvPgotICAgICAgPGRpYWdyYW1zIHhtaTppZD0iX2V3bHc4RHpqRWRxNXlzRk9OcjFCR1EiIGd1aWQ9Il9ld2x3OER6akVkcTV5c0ZPTnIxQkdRIj4KLSAgICAgICAgPHNlbWFudGljTW9kZWwgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VU1BU2VtYW50aWNNb2RlbEJyaWRnZSIgeG1pOmlkPSJfZXdsdzhUempFZHE1eXNGT05yMUJHUSIgZ3VpZD0iX2V3bHc4VHpqRWRxNXlzRk9OcjFCR1EiIHByZXNlbnRhdGlvbj0iQWN0aXZpdHkgRGV0YWlsIiBlbGVtZW50PSJfRGFrUWNEemlFZHE1eXNGT05yMUJHUSIvPgotICAgICAgPC9kaWFncmFtcz4KLSAgICA8L2NoaWxkUGFja2FnZXM+Ci0gICAgPGRpYWdyYW1zIHhtaTppZD0iX2Jjc1hRRHpqRWRxNXlzRk9OcjFCR1EiIGd1aWQ9Il9iY3NYUUR6akVkcTV5c0ZPTnIxQkdRIj4KLSAgICAgIDxzZW1hbnRpY01vZGVsIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlVNQVNlbWFudGljTW9kZWxCcmlkZ2UiIHhtaTppZD0iX2Jjc1hRVHpqRWRxNXlzRk9OcjFCR1EiIGd1aWQ9Il9iY3NYUVR6akVkcTV5c0ZPTnIxQkdRIiBwcmVzZW50YXRpb249IkFjdGl2aXR5IERldGFpbCIgZWxlbWVudD0iXzRzQ3RzVHpnRWRxNXlzRk9OcjFCR1EiLz4KLSAgICA8L2RpYWdyYW1zPgotICAgIDxwcm9jZXNzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNhcGFiaWxpdHlQYXR0ZXJuIiB4bWk6aWQ9Il80c0N0c1R6Z0VkcTV5c0ZPTnIxQkdRIiBuYW1lPSJDUDEgd2l0aCBhbGwgZWxlbWVudHMiIGd1aWQ9Il80c0N0c1R6Z0VkcTV5c0ZPTnIxQkdRIiBicmllZkRlc2NyaXB0aW9uPSJCcmllZjpDUDEgd2l0aCBhbGwgZWxlbWVudHMiIHByZXNlbnRhdGlvbk5hbWU9IkNQMSB3aXRoIGFsbCBlbGVtZW50cyIgYnJlYWtkb3duRWxlbWVudHM9Il9EYWtRY0R6aUVkcTV5c0ZPTnIxQkdRIj4KLSAgICAgIDxwcmVzZW50YXRpb24geG1pOmlkPSItRS1kNEpjdTI5N3J4VXE4bHRlOHFudyIgaHJlZj0idW1hOi8vLUUtZDRKY3UyOTdyeFVxOGx0ZThxbncjLUUtZDRKY3UyOTdyeFVxOGx0ZThxbnciLz4KLSAgICAgIDxkZWZhdWx0Q29udGV4dCBocmVmPSJ1bWE6Ly9fcXp3eXdBLVBFZHFMMk8xUEpWOWNaQSNfcnJtQ0lCQWRFZHE3RnJjX3lNaFEtQSIvPgotICAgICAgPHZhbGlkQ29udGV4dCBocmVmPSJ1bWE6Ly9fcXp3eXdBLVBFZHFMMk8xUEpWOWNaQSNfcnJtQ0lCQWRFZHE3RnJjX3lNaFEtQSIvPgotICAgIDwvcHJvY2Vzcz4KLSAgPC9vcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NDb21wb25lbnQ+Ci08L3htaTpYTUk+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvY2FwYWJpbGl0eXBhdHRlcm5zL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2NvbnRlbnQueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2NhcGFiaWxpdHlwYXR0ZXJucy9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9jb250ZW50LnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDY0YzRkOC4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvY2FwYWJpbGl0eXBhdHRlcm5zL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2NvbnRlbnQueG1pCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTx4bWk6WE1JIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6ZXBmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZiIgZXBmOnZlcnNpb249IjEuMi4wIj4KLSAgPG9yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc0Rlc2NyaXB0aW9uIHhtaTppZD0iLWljTzZwSUhkWm05Vnh5Yy1KWjlVeXciIG5hbWU9IkNQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzLF9adFpiTVVERkVkcU85TTNmdWtZQV9BIiBndWlkPSItaWNPNnBJSGRabTlWeHljLUpaOVV5dyI+Ci0gICAgPG1haW5EZXNjcmlwdGlvbj5tYWluOiBDUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50czwvbWFpbkRlc2NyaXB0aW9uPgotICAgIDxrZXlDb25zaWRlcmF0aW9ucz5LZXlzOiBDUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50czwva2V5Q29uc2lkZXJhdGlvbnM+Ci0gICAgPHVzYWdlR3VpZGFuY2U+dXNhZ2U6IENQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzPC91c2FnZUd1aWRhbmNlPgotICAgIDxwdXJwb3NlPlB1cnBvc2U6IENQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzPC9wdXJwb3NlPgotICAgIDxhbHRlcm5hdGl2ZXM+YWx0ZXJuYXRpdmVzOiBDUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50czwvYWx0ZXJuYXRpdmVzPgotICAgIDxob3d0b1N0YWZmPkhvdyB0byBzdGFmZjogQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHM8L2hvd3RvU3RhZmY+Ci0gICAgPGV4dGVybmFsSWQ+RXh0ZXJuYWwgSUQ6IENQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzPC9leHRlcm5hbElkPgotICAgIDxzY29wZT5zY29wZTogQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHM8L3Njb3BlPgotICAgIDx1c2FnZU5vdGVzPnVzYWdlOiBDUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50czwvdXNhZ2VOb3Rlcz4KLSAgPC9vcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NEZXNjcmlwdGlvbj4KLSAgPG9yZy5lY2xpcHNlLmVwZi51bWE6QWN0aXZpdHlEZXNjcmlwdGlvbiB4bWk6aWQ9Ii1TcmNWUy03ZFNZREUyUnBtN1NJa3lBIiBuYW1lPSIsX2xEaGw4RURGRWRxTzlNM2Z1a1lBX0EiIGd1aWQ9Ii1TcmNWUy03ZFNZREUyUnBtN1NJa3lBIj4KLSAgICA8bWFpbkRlc2NyaXB0aW9uPm1haW46IEFjdGl2aXR5IGZvciB2YXJpYWJpbGl0eSBlbGVtZW50czwvbWFpbkRlc2NyaXB0aW9uPgotICAgIDxrZXlDb25zaWRlcmF0aW9ucz5rZXk6IEFjdGl2aXR5IGZvciB2YXJpYWJpbGl0eSBlbGVtZW50czwva2V5Q29uc2lkZXJhdGlvbnM+Ci0gICAgPHVzYWdlR3VpZGFuY2U+dXNhZ2U6IEFjdGl2aXR5IGZvciB2YXJpYWJpbGl0eSBlbGVtZW50czwvdXNhZ2VHdWlkYW5jZT4KLSAgICA8cHVycG9zZT5wdXJwb3NlOiBBY3Rpdml0eSBmb3IgdmFyaWFiaWxpdHkgZWxlbWVudHM8L3B1cnBvc2U+Ci0gICAgPGFsdGVybmF0aXZlcz5hbHRlcm5hdGl2ZXM6IEFjdGl2aXR5IGZvciB2YXJpYWJpbGl0eSBlbGVtZW50czwvYWx0ZXJuYXRpdmVzPgotICAgIDxob3d0b1N0YWZmPmhvdyB0byBzdGFmZjogQWN0aXZpdHkgZm9yIHZhcmlhYmlsaXR5IGVsZW1lbnRzPC9ob3d0b1N0YWZmPgotICA8L29yZy5lY2xpcHNlLmVwZi51bWE6QWN0aXZpdHlEZXNjcmlwdGlvbj4KLTwveG1pOlhNST4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9jYXBhYmlsaXR5cGF0dGVybnMvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvZGlhZ3JhbS54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvY2FwYWJpbGl0eXBhdHRlcm5zL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2RpYWdyYW0ueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MmViMzc3Li4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9jYXBhYmlsaXR5cGF0dGVybnMvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvZGlhZ3JhbS54bWkKKysrIC9kZXYvbnVsbApAQCAtMSwxMTYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTx4bWk6WE1JIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6bm90YXRpb249Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZ21mL3J1bnRpbWUvMS4wLjAvbm90YXRpb24iIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi9kaWFncmFtLzEuMC4wL2RpYWdyYW0uZWNvcmUiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiPgotICA8b3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw6QWN0aXZpdHlEZXRhaWxEaWFncmFtIHhtaTppZD0iX0lheTVSdXg0RWR1Mk9vNnEtbkhXZ2ciPgotICAgIDxsaW5rZWRFbGVtZW50IHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkFjdGl2aXR5IiBocmVmPSJ1bWE6Ly9fWnRaYk1FREZFZHFPOU0zZnVrWUFfQSNfbERobDhFREZFZHFPOU0zZnVrWUFfQSIvPgotICAgIDxub2RlcyB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw6Um9sZVRhc2tDb21wb3NpdGUiIHhtaTppZD0iX0lheTVSLXg0RWR1Mk9vNnEtbkhXZ2ciPgotICAgICAgPGxpbmtlZEVsZW1lbnQgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Um9sZURlc2NyaXB0b3IiIGhyZWY9InVtYTovL19adFpiTUVERkVkcU85TTNmdWtZQV9BI19HcVgxTVVEUUVkcXJoc1poM1FOQU1RIi8+Ci0gICAgICA8bm9kZXMgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOlJvbGVOb2RlIiB4bWk6aWQ9Il9JYXk1U094NEVkdTJPbzZxLW5IV2dnIiBuYW1lPSJSb2xlIEEzIGV4dGVuZHMgUm9sZSBBMiI+Ci0gICAgICAgIDxsaW5rZWRFbGVtZW50IHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlJvbGVEZXNjcmlwdG9yIiBocmVmPSJ1bWE6Ly9fWnRaYk1FREZFZHFPOU0zZnVrWUFfQSNfR3FYMU1VRFFFZHFyaHNaaDNRTkFNUSIvPgotICAgICAgPC9ub2Rlcz4KLSAgICAgIDxub2RlcyB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw6VGFza05vZGUiIHhtaTppZD0iX0lheTVTZXg0RWR1Mk9vNnEtbkhXZ2ciIGluY29taW5nQ29ubmVjdGlvbnM9Il9JYXk1VE94NEVkdTJPbzZxLW5IV2dnIiBuYW1lPSJUYXNrIEEzIGV4dGVuZHMgVGFzayBBMiI+Ci0gICAgICAgIDxsaW5rZWRFbGVtZW50IHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlRhc2tEZXNjcmlwdG9yIiBocmVmPSJ1bWE6Ly9fWnRaYk1FREZFZHFPOU0zZnVrWUFfQSNfR3FYMU1FRFFFZHFyaHNaaDNRTkFNUSIvPgotICAgICAgICA8b3V0Z29pbmdDb25uZWN0aW9ucyB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw6TGluayIgeG1pOmlkPSJfSWF5NVN1eDRFZHUyT282cS1uSFdnZyIgdGFyZ2V0PSJfSWF5NVR1eDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPC9ub2Rlcz4KLSAgICA8L25vZGVzPgotICAgIDxub2RlcyB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw6V29ya1Byb2R1Y3RDb21wb3NpdGUiIHhtaTppZD0iX0lheTVTLXg0RWR1Mk9vNnEtbkhXZ2ciIHR5cGU9IjEiPgotICAgICAgPGxpbmtlZEVsZW1lbnQgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VGFza0Rlc2NyaXB0b3IiIGhyZWY9InVtYTovL19adFpiTUVERkVkcU85TTNmdWtZQV9BI19HcVgxTUVEUUVkcXJoc1poM1FOQU1RIi8+Ci0gICAgICA8b3V0Z29pbmdDb25uZWN0aW9ucyB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw6TGluayIgeG1pOmlkPSJfSWF5NVRPeDRFZHUyT282cS1uSFdnZyIgdGFyZ2V0PSJfSWF5NVNleDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPG5vZGVzIHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDpXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlIiB4bWk6aWQ9Il9JYXk1VGV4NEVkdTJPbzZxLW5IV2dnIiBuYW1lPSJBcnRpZmFjdCBBMiBwcmVzZW50Ij4KLSAgICAgICAgPGxpbmtlZEVsZW1lbnQgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6V29ya1Byb2R1Y3REZXNjcmlwdG9yIiBocmVmPSJ1bWE6Ly9fWnRaYk1FREZFZHFPOU0zZnVrWUFfQSNfR3FobU1rRFFFZHFyaHNaaDNRTkFNUSIvPgotICAgICAgPC9ub2Rlcz4KLSAgICA8L25vZGVzPgotICAgIDxub2RlcyB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw6V29ya1Byb2R1Y3RDb21wb3NpdGUiIHhtaTppZD0iX0lheTVUdXg0RWR1Mk9vNnEtbkhXZ2ciIGluY29taW5nQ29ubmVjdGlvbnM9Il9JYXk1U3V4NEVkdTJPbzZxLW5IV2dnIiB0eXBlPSIyIj4KLSAgICAgIDxsaW5rZWRFbGVtZW50IHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlRhc2tEZXNjcmlwdG9yIiBocmVmPSJ1bWE6Ly9fWnRaYk1FREZFZHFPOU0zZnVrWUFfQSNfR3FYMU1FRFFFZHFyaHNaaDNRTkFNUSIvPgotICAgICAgPG5vZGVzIHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDpXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlIiB4bWk6aWQ9Il9JYXk1VC14NEVkdTJPbzZxLW5IV2dnIiBuYW1lPSJPdXRjb21lIEEyIHByZXNlbnQiPgotICAgICAgICA8bGlua2VkRWxlbWVudCB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpXb3JrUHJvZHVjdERlc2NyaXB0b3IiIGhyZWY9InVtYTovL19adFpiTUVERkVkcU85TTNmdWtZQV9BI19HcWhtTkVEUUVkcXJoc1poM1FOQU1RIi8+Ci0gICAgICA8L25vZGVzPgotICAgIDwvbm9kZXM+Ci0gIDwvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw6QWN0aXZpdHlEZXRhaWxEaWFncmFtPgotICA8bm90YXRpb246RGlhZ3JhbSB4bWk6aWQ9Il9JYXk1VU94NEVkdTJPbzZxLW5IV2dnIiB0eXBlPSJBREQiIGVsZW1lbnQ9Il9JYXk1UnV4NEVkdTJPbzZxLW5IV2dnIiBuYW1lPSJhY3Rpdml0eV9mb3JfdmFyaWFiaWxpdHlfZWxlbWVudHMiIG1lYXN1cmVtZW50VW5pdD0iUGl4ZWwiPgotICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfSWF5NVZPeDRFZHUyT282cS1uSFdnZyIgdHlwZT0iMTAwMSIgZWxlbWVudD0iX0lheTVSLXg0RWR1Mk9vNnEtbkhXZ2ciPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246Rm9udFN0eWxlIiB4bWk6aWQ9Il9JYXk1VmV4NEVkdTJPbzZxLW5IV2dnIiBmb250TmFtZT0iQXJpYWwiIGZvbnRIZWlnaHQ9IjgiLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkRlc2NyaXB0aW9uU3R5bGUiIHhtaTppZD0iX0lheTVWdXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkZpbGxTdHlsZSIgeG1pOmlkPSJfSWF5NVYteDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246TGluZVN0eWxlIiB4bWk6aWQ9Il9JYXk1V094NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9JYXk1V3V4NEVkdTJPbzZxLW5IV2dnIiB4PSIzMCIgeT0iODgiIHdpZHRoPSIyMjgiIGhlaWdodD0iNjciLz4KLSAgICA8L2NoaWxkcmVuPgotICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfSWF5NVcteDRFZHUyT282cS1uSFdnZyIgdHlwZT0iMTAwMiIgZWxlbWVudD0iX0lheTVTLXg0RWR1Mk9vNnEtbkhXZ2ciPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246Rm9udFN0eWxlIiB4bWk6aWQ9Il9JYXk1WE94NEVkdTJPbzZxLW5IV2dnIiBmb250TmFtZT0iQXJpYWwiIGZvbnRIZWlnaHQ9IjgiLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkRlc2NyaXB0aW9uU3R5bGUiIHhtaTppZD0iX0lheTVYZXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkZpbGxTdHlsZSIgeG1pOmlkPSJfSWF5NVh1eDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246TGluZVN0eWxlIiB4bWk6aWQ9Il9JYXk1WC14NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9JYXk1WWV4NEVkdTJPbzZxLW5IV2dnIiB4PSIxNDMiIHk9IjEiIHdpZHRoPSI4NCIgaGVpZ2h0PSI2NyIvPgotICAgIDwvY2hpbGRyZW4+Ci0gICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il9JYXk1WXV4NEVkdTJPbzZxLW5IV2dnIiB0eXBlPSIxMDAyIiBlbGVtZW50PSJfSWF5NVR1eDRFZHUyT282cS1uSFdnZyI+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpGb250U3R5bGUiIHhtaTppZD0iX0lheTVZLXg0RWR1Mk9vNnEtbkhXZ2ciIGZvbnROYW1lPSJBcmlhbCIgZm9udEhlaWdodD0iOCIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RGVzY3JpcHRpb25TdHlsZSIgeG1pOmlkPSJfSWF5NVpPeDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RmlsbFN0eWxlIiB4bWk6aWQ9Il9JYXk1WmV4NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpMaW5lU3R5bGUiIHhtaTppZD0iX0lheTVadXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0lheTVhT3g0RWR1Mk9vNnEtbkhXZ2ciIHg9IjE0MyIgeT0iMTc1IiB3aWR0aD0iODQiIGhlaWdodD0iODMiLz4KLSAgICA8L2NoaWxkcmVuPgotICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOlBhZ2VTdHlsZSIgeG1pOmlkPSJfSWF5NVVleDRFZHUyT282cS1uSFdnZyIvPgotICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkd1aWRlU3R5bGUiIHhtaTppZD0iX0lheTVVdXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpEZXNjcmlwdGlvblN0eWxlIiB4bWk6aWQ9Il9JYXk1VS14NEVkdTJPbzZxLW5IV2dnIi8+Ci0gIDwvbm90YXRpb246RGlhZ3JhbT4KLSAgPG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOkFjdGl2aXR5RGV0YWlsRGlhZ3JhbSB4bWk6aWQ9Il9JYTRfNC14NEVkdTJPbzZxLW5IV2dnIj4KLSAgICA8bGlua2VkRWxlbWVudCB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpBY3Rpdml0eSIgaHJlZj0idW1hOi8vX1p0WmJNRURGRWRxTzlNM2Z1a1lBX0EjX2RZR20wRURQRWRxcmhzWmgzUU5BTVEiLz4KLSAgICA8bm9kZXMgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOlJvbGVUYXNrQ29tcG9zaXRlIiB4bWk6aWQ9Il9JYTRfNU94NEVkdTJPbzZxLW5IV2dnIj4KLSAgICAgIDxsaW5rZWRFbGVtZW50IHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlJvbGVEZXNjcmlwdG9yIiBocmVmPSJ1bWE6Ly9fWnRaYk1FREZFZHFPOU0zZnVrWUFfQSNfbDV5VUFVRFBFZHFyaHNaaDNRTkFNUSIvPgotICAgICAgPG5vZGVzIHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDpSb2xlTm9kZSIgeG1pOmlkPSJfSWE0XzVleDRFZHUyT282cS1uSFdnZyIgbmFtZT0iUm9sZSBCMiBwcmVzZW50Ij4KLSAgICAgICAgPGxpbmtlZEVsZW1lbnQgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Um9sZURlc2NyaXB0b3IiIGhyZWY9InVtYTovL19adFpiTUVERkVkcU85TTNmdWtZQV9BI19sNXlVQVVEUEVkcXJoc1poM1FOQU1RIi8+Ci0gICAgICA8L25vZGVzPgotICAgICAgPG5vZGVzIHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDpUYXNrTm9kZSIgeG1pOmlkPSJfSWE0XzV1eDRFZHUyT282cS1uSFdnZyIgaW5jb21pbmdDb25uZWN0aW9ucz0iX0lhNF82ZXg0RWR1Mk9vNnEtbkhXZ2ciIG5hbWU9IlRhc2sgQjIgZXh0ZW5kcyBUYXNrIEExIj4KLSAgICAgICAgPGxpbmtlZEVsZW1lbnQgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VGFza0Rlc2NyaXB0b3IiIGhyZWY9InVtYTovL19adFpiTUVERkVkcU85TTNmdWtZQV9BI19sNXlVQUVEUEVkcXJoc1poM1FOQU1RIi8+Ci0gICAgICAgIDxvdXRnb2luZ0Nvbm5lY3Rpb25zIHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDpMaW5rIiB4bWk6aWQ9Il9JYTRfNS14NEVkdTJPbzZxLW5IV2dnIiB0YXJnZXQ9Il9JYTRfN2V4NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8L25vZGVzPgotICAgIDwvbm9kZXM+Ci0gICAgPG5vZGVzIHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDpXb3JrUHJvZHVjdENvbXBvc2l0ZSIgeG1pOmlkPSJfSWE0XzZPeDRFZHUyT282cS1uSFdnZyIgdHlwZT0iMSI+Ci0gICAgICA8bGlua2VkRWxlbWVudCB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpUYXNrRGVzY3JpcHRvciIgaHJlZj0idW1hOi8vX1p0WmJNRURGRWRxTzlNM2Z1a1lBX0EjX2w1eVVBRURQRWRxcmhzWmgzUU5BTVEiLz4KLSAgICAgIDxvdXRnb2luZ0Nvbm5lY3Rpb25zIHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDpMaW5rIiB4bWk6aWQ9Il9JYTRfNmV4NEVkdTJPbzZxLW5IV2dnIiB0YXJnZXQ9Il9JYTRfNXV4NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8bm9kZXMgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOldvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGUiIHhtaTppZD0iX0lhNF82dXg0RWR1Mk9vNnEtbkhXZ2ciIG5hbWU9IkFydGlmYWN0IEIyIHByZXNlbnQiPgotICAgICAgICA8bGlua2VkRWxlbWVudCB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpXb3JrUHJvZHVjdERlc2NyaXB0b3IiIGhyZWY9InVtYTovL19adFpiTUVERkVkcU85TTNmdWtZQV9BI19sNXlVQkVEUEVkcXJoc1poM1FOQU1RIi8+Ci0gICAgICA8L25vZGVzPgotICAgICAgPG5vZGVzIHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDpXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlIiB4bWk6aWQ9Il9JYTRfNi14NEVkdTJPbzZxLW5IV2dnIiBuYW1lPSJTdWJfQXJ0aWZhY3QgQTEuMSBwcmVzZW50Ij4KLSAgICAgICAgPGxpbmtlZEVsZW1lbnQgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6V29ya1Byb2R1Y3REZXNjcmlwdG9yIiBocmVmPSJ1bWE6Ly9fWnRaYk1FREZFZHFPOU0zZnVrWUFfQSNfbDV5VUJVRFBFZHFyaHNaaDNRTkFNUSIvPgotICAgICAgPC9ub2Rlcz4KLSAgICAgIDxub2RlcyB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw6V29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZSIgeG1pOmlkPSJfSWE0XzdPeDRFZHUyT282cS1uSFdnZyIgbmFtZT0iQXJ0aWZhY3QgQTEgcHJlc2VudCI+Ci0gICAgICAgIDxsaW5rZWRFbGVtZW50IHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOldvcmtQcm9kdWN0RGVzY3JpcHRvciIgaHJlZj0idW1hOi8vX1p0WmJNRURGRWRxTzlNM2Z1a1lBX0EjX2w1eVVCa0RQRWRxcmhzWmgzUU5BTVEiLz4KLSAgICAgIDwvbm9kZXM+Ci0gICAgPC9ub2Rlcz4KLSAgICA8bm9kZXMgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOldvcmtQcm9kdWN0Q29tcG9zaXRlIiB4bWk6aWQ9Il9JYTRfN2V4NEVkdTJPbzZxLW5IV2dnIiBpbmNvbWluZ0Nvbm5lY3Rpb25zPSJfSWE0XzUteDRFZHUyT282cS1uSFdnZyIgdHlwZT0iMiI+Ci0gICAgICA8bGlua2VkRWxlbWVudCB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpUYXNrRGVzY3JpcHRvciIgaHJlZj0idW1hOi8vX1p0WmJNRURGRWRxTzlNM2Z1a1lBX0EjX2w1eVVBRURQRWRxcmhzWmgzUU5BTVEiLz4KLSAgICAgIDxub2RlcyB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw6V29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZSIgeG1pOmlkPSJfSWE0Xzd1eDRFZHUyT282cS1uSFdnZyIgbmFtZT0iT3V0Y29tZSBCMiBwcmVzZW50Ij4KLSAgICAgICAgPGxpbmtlZEVsZW1lbnQgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6V29ya1Byb2R1Y3REZXNjcmlwdG9yIiBocmVmPSJ1bWE6Ly9fWnRaYk1FREZFZHFPOU0zZnVrWUFfQSNfbDV5VUNVRFBFZHFyaHNaaDNRTkFNUSIvPgotICAgICAgPC9ub2Rlcz4KLSAgICAgIDxub2RlcyB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw6V29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZSIgeG1pOmlkPSJfSWE0XzcteDRFZHUyT282cS1uSFdnZyIgbmFtZT0iT3V0Y29tZSBBMSBwcmVzZW50Ij4KLSAgICAgICAgPGxpbmtlZEVsZW1lbnQgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6V29ya1Byb2R1Y3REZXNjcmlwdG9yIiBocmVmPSJ1bWE6Ly9fWnRaYk1FREZFZHFPOU0zZnVrWUFfQSNfbDV5VUNrRFBFZHFyaHNaaDNRTkFNUSIvPgotICAgICAgPC9ub2Rlcz4KLSAgICA8L25vZGVzPgotICA8L29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOkFjdGl2aXR5RGV0YWlsRGlhZ3JhbT4KLSAgPG5vdGF0aW9uOkRpYWdyYW0geG1pOmlkPSJfSWE0XzhPeDRFZHUyT282cS1uSFdnZyIgdHlwZT0iQUREIiBlbGVtZW50PSJfSWE0XzQteDRFZHUyT282cS1uSFdnZyIgbmFtZT0iQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cyIgbWVhc3VyZW1lbnRVbml0PSJQaXhlbCI+Ci0gICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il9JYTRfOU94NEVkdTJPbzZxLW5IV2dnIiB0eXBlPSIxMDAxIiBlbGVtZW50PSJfSWE0XzVPeDRFZHUyT282cS1uSFdnZyI+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpGb250U3R5bGUiIHhtaTppZD0iX0lhNF85ZXg0RWR1Mk9vNnEtbkhXZ2ciIGZvbnROYW1lPSJBcmlhbCIgZm9udEhlaWdodD0iOCIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RGVzY3JpcHRpb25TdHlsZSIgeG1pOmlkPSJfSWE0Xzl1eDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RmlsbFN0eWxlIiB4bWk6aWQ9Il9JYTRfOS14NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpMaW5lU3R5bGUiIHhtaTppZD0iX0lhNF8tT3g0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0lhNF8tdXg0RWR1Mk9vNnEtbkhXZ2ciIHg9IjMwIiB5PSIyMzYiIHdpZHRoPSIyMjEiIGhlaWdodD0iNjciLz4KLSAgICA8L2NoaWxkcmVuPgotICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfSWE0Xy0teDRFZHUyT282cS1uSFdnZyIgdHlwZT0iMTAwMiIgZWxlbWVudD0iX0lhNF82T3g0RWR1Mk9vNnEtbkhXZ2ciPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246Rm9udFN0eWxlIiB4bWk6aWQ9Il9JYTRfX094NEVkdTJPbzZxLW5IV2dnIiBmb250TmFtZT0iQXJpYWwiIGZvbnRIZWlnaHQ9IjgiLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkRlc2NyaXB0aW9uU3R5bGUiIHhtaTppZD0iX0lhNF9fZXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkZpbGxTdHlsZSIgeG1pOmlkPSJfSWE0X191eDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246TGluZVN0eWxlIiB4bWk6aWQ9Il9JYTRfXy14NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9JYTVBQWV4NEVkdTJPbzZxLW5IV2dnIiB4PSIxMzIiIHk9IjEiIHdpZHRoPSI5NCIgaGVpZ2h0PSIyMTUiLz4KLSAgICA8L2NoaWxkcmVuPgotICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfSWE1QUF1eDRFZHUyT282cS1uSFdnZyIgdHlwZT0iMTAwMiIgZWxlbWVudD0iX0lhNF83ZXg0RWR1Mk9vNnEtbkhXZ2ciPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246Rm9udFN0eWxlIiB4bWk6aWQ9Il9JYTVBQS14NEVkdTJPbzZxLW5IV2dnIiBmb250TmFtZT0iQXJpYWwiIGZvbnRIZWlnaHQ9IjgiLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkRlc2NyaXB0aW9uU3R5bGUiIHhtaTppZD0iX0lhNUFCT3g0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkZpbGxTdHlsZSIgeG1pOmlkPSJfSWE1QUJleDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246TGluZVN0eWxlIiB4bWk6aWQ9Il9JYTVBQnV4NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9JYTVBQ094NEVkdTJPbzZxLW5IV2dnIiB4PSIxMzciIHk9IjMyMyIgd2lkdGg9Ijg0IiBoZWlnaHQ9IjE2NiIvPgotICAgIDwvY2hpbGRyZW4+Ci0gICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246UGFnZVN0eWxlIiB4bWk6aWQ9Il9JYTRfOGV4NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246R3VpZGVTdHlsZSIgeG1pOmlkPSJfSWE0Xzh1eDRFZHUyT282cS1uSFdnZyIvPgotICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkRlc2NyaXB0aW9uU3R5bGUiIHhtaTppZD0iX0lhNF84LXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgPC9ub3RhdGlvbjpEaWFncmFtPgotPC94bWk6WE1JPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2NhcGFiaWxpdHlwYXR0ZXJucy9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9tb2RlbC54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvY2FwYWJpbGl0eXBhdHRlcm5zL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL21vZGVsLnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWNkMzljMC4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvY2FwYWJpbGl0eXBhdHRlcm5zL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL21vZGVsLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDIzMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHhtaTpYTUkgeG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hLnJlc291cmNlbWFuYWdlcj0iaHR0cDovLy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Jlc291cmNlbWFuYWdlci5lY29yZSIgeG1sbnM6ZXBmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZiIgZXBmOnZlcnNpb249IjEuMi4wIj4KLSAgPG9yZy5lY2xpcHNlLmVwZi51bWEucmVzb3VyY2VtYW5hZ2VyOlJlc291cmNlTWFuYWdlciB4bWk6aWQ9Il9aekRYUVVERkVkcU85TTNmdWtZQV9BIiBndWlkPSJfWnpEWFFVREZFZHFPOU0zZnVrWUFfQSI+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfWnpEWFFrREZFZHFPOU0zZnVrWUFfQSIgaWQ9Ii1pY082cElIZFptOVZ4eWMtSlo5VXl3IiB1cmk9ImNvbnRlbnQueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfdEdGNHdVREdFZHFPOU0zZnVrWUFfQSIgaWQ9Ii1TcmNWUy03ZFNZREUyUnBtN1NJa3lBIiB1cmk9ImNvbnRlbnQueG1pIi8+Ci0gIDwvb3JnLmVjbGlwc2UuZXBmLnVtYS5yZXNvdXJjZW1hbmFnZXI6UmVzb3VyY2VNYW5hZ2VyPgotICA8b3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzQ29tcG9uZW50IHhtaTppZD0iX1p0WmJNRURGRWRxTzlNM2Z1a1lBX0EiIG5hbWU9IkNQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzIiBndWlkPSJfWnRaYk1FREZFZHFPOU0zZnVrWUFfQSI+Ci0gICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc1BhY2thZ2UiIHhtaTppZD0iX2xDN3dFRURGRWRxTzlNM2Z1a1lBX0EiIG5hbWU9ImFjdGl2aXR5X2Zvcl92YXJpYWJpbGl0eV9lbGVtZW50cyIgZ3VpZD0iX2xDN3dFRURGRWRxTzlNM2Z1a1lBX0EiPgotICAgICAgPHByb2Nlc3NFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpBY3Rpdml0eSIgeG1pOmlkPSJfbERobDhFREZFZHFPOU0zZnVrWUFfQSIgbmFtZT0iYWN0aXZpdHlfZm9yX3ZhcmlhYmlsaXR5X2VsZW1lbnRzIiBndWlkPSJfbERobDhFREZFZHFPOU0zZnVrWUFfQSIgYnJpZWZEZXNjcmlwdGlvbj0iYnJpZWY6IEFjdGl2aXR5IGZvciB2YXJpYWJpbGl0eSBlbGVtZW50cyIgcHJlc2VudGF0aW9uTmFtZT0iQWN0aXZpdHkgZm9yIHZhcmlhYmlsaXR5IGVsZW1lbnRzIiBwcmVmaXg9IlByZWZpeCIgc3VwZXJBY3Rpdml0aWVzPSJfWnRaYk1VREZFZHFPOU0zZnVrWUFfQSIgYnJlYWtkb3duRWxlbWVudHM9Il9HcVgxTUVEUUVkcXJoc1poM1FOQU1RIF9HcVgxTVVEUUVkcXJoc1poM1FOQU1RIF9HcWhtTUVEUUVkcXJoc1poM1FOQU1RIF9HcWhtTVVEUUVkcXJoc1poM1FOQU1RIF9HcWhtTWtEUUVkcXJoc1poM1FOQU1RIF9HcWhtTTBEUUVkcXJoc1poM1FOQU1RIF9HcWhtTkVEUUVkcXJoc1poM1FOQU1RIj4KLSAgICAgICAgPHByZXNlbnRhdGlvbiB4bWk6aWQ9Ii1TcmNWUy03ZFNZREUyUnBtN1NJa3lBIiBocmVmPSJ1bWE6Ly8taWNPNnBJSGRabTlWeHljLUpaOVV5dyMtU3JjVlMtN2RTWURFMlJwbTdTSWt5QSIvPgotICAgICAgPC9wcm9jZXNzRWxlbWVudHM+Ci0gICAgICA8cHJvY2Vzc0VsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlRhc2tEZXNjcmlwdG9yIiB4bWk6aWQ9Il9HcVgxTUVEUUVkcXJoc1poM1FOQU1RIiBuYW1lPSJ0YXNrX0EzIiBndWlkPSJfR3FYMU1FRFFFZHFyaHNaaDNRTkFNUSIgYnJpZWZEZXNjcmlwdGlvbj0iYnJpZWY6IFRhc2sgQTMiIHByZXNlbnRhdGlvbk5hbWU9IlRhc2sgQTMgZXh0ZW5kcyBUYXNrIEEyIiBzdXBlckFjdGl2aXRpZXM9Il9sRGhsOEVERkVkcU85TTNmdWtZQV9BIiBhZGRpdGlvbmFsbHlQZXJmb3JtZWRCeT0iX0dxaG1NRURRRWRxcmhzWmgzUU5BTVEgX0dxaG1NVURRRWRxcmhzWmgzUU5BTVEiIG1hbmRhdG9yeUlucHV0PSJfR3FobU1rRFFFZHFyaHNaaDNRTkFNUSIgb3B0aW9uYWxJbnB1dD0iX0dxaG1NMERRRWRxcmhzWmgzUU5BTVEiIG91dHB1dD0iX0dxaG1ORURRRWRxcmhzWmgzUU5BTVEiIHBlcmZvcm1lZFByaW1hcmlseUJ5PSJfR3FYMU1VRFFFZHFyaHNaaDNRTkFNUSI+Ci0gICAgICAgIDxUYXNrIGhyZWY9InVtYTovL195VWVMSUEtUEVkcUwyTzFQSlY5Y1pBI19vVWx1RUVERkVkcU85TTNmdWtZQV9BIi8+Ci0gICAgICAgIDxzZWxlY3RlZFN0ZXBzIGhyZWY9InVtYTovLy1iUjlUWDFiWjZXOVJZNUl2SVBHVWpnI19yQ1d3VUVEUEVkcXJoc1poM1FOQU1RIi8+Ci0gICAgICAgIDxzZWxlY3RlZFN0ZXBzIGhyZWY9InVtYTovLy1iUjlUWDFiWjZXOVJZNUl2SVBHVWpnI191bXlnWUVEUEVkcXJoc1poM1FOQU1RIi8+Ci0gICAgICAgIDxzZWxlY3RlZFN0ZXBzIGhyZWY9InVtYTovLy1iUjlUWDFiWjZXOVJZNUl2SVBHVWpnI192eDVCa0VEUEVkcXJoc1poM1FOQU1RIi8+Ci0gICAgICAgIDxzZWxlY3RlZFN0ZXBzIGhyZWY9InVtYTovLy0xM3E4SkpBYTBpeDZyRE1aQXF3eTF3I190aTJCWUJCT0VkcUJzN0toZFZMUkxBIi8+Ci0gICAgICAgIDxzZWxlY3RlZFN0ZXBzIGhyZWY9InVtYTovLy0xM3E4SkpBYTBpeDZyRE1aQXF3eTF3I190azdzRUJCT0VkcUJzN0toZFZMUkxBIi8+Ci0gICAgICAgIDxzZWxlY3RlZFN0ZXBzIGhyZWY9InVtYTovLy0xM3E4SkpBYTBpeDZyRE1aQXF3eTF3I190bmRib0JCT0VkcUJzN0toZFZMUkxBIi8+Ci0gICAgICA8L3Byb2Nlc3NFbGVtZW50cz4KLSAgICAgIDxwcm9jZXNzRWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Um9sZURlc2NyaXB0b3IiIHhtaTppZD0iX0dxWDFNVURRRWRxcmhzWmgzUU5BTVEiIG5hbWU9InJvbGVfQTMiIGd1aWQ9Il9HcVgxTVVEUUVkcXJoc1poM1FOQU1RIiBicmllZkRlc2NyaXB0aW9uPSJicmllZiA6IFJvbGUgQTMiIHByZXNlbnRhdGlvbk5hbWU9IlJvbGUgQTMgZXh0ZW5kcyBSb2xlIEEyIiBzdXBlckFjdGl2aXRpZXM9Il9sRGhsOEVERkVkcU85TTNmdWtZQV9BIj4KLSAgICAgICAgPFJvbGUgaHJlZj0idW1hOi8vX3lVZUxJQS1QRWRxTDJPMVBKVjljWkEjXzhaTjZBRURGRWRxTzlNM2Z1a1lBX0EiLz4KLSAgICAgIDwvcHJvY2Vzc0VsZW1lbnRzPgotICAgICAgPHByb2Nlc3NFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpSb2xlRGVzY3JpcHRvciIgeG1pOmlkPSJfR3FobU1FRFFFZHFyaHNaaDNRTkFNUSIgbmFtZT0icm9sZV9BMiIgZ3VpZD0iX0dxaG1NRURRRWRxcmhzWmgzUU5BTVEiIGJyaWVmRGVzY3JpcHRpb249IlJvbGUgQTIgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IlJvbGUgQTIgZXh0ZW5kZWQgYnkgUm9sZSBBMyIgc3VwZXJBY3Rpdml0aWVzPSJfbERobDhFREZFZHFPOU0zZnVrWUFfQSIgcmVzcG9uc2libGVGb3I9Il9HcWhtTWtEUUVkcXJoc1poM1FOQU1RIF9HcWhtTTBEUUVkcXJoc1poM1FOQU1RIF9HcWhtTkVEUUVkcXJoc1poM1FOQU1RIj4KLSAgICAgICAgPFJvbGUgaHJlZj0idW1hOi8vX3lVZUxJQS1QRWRxTDJPMVBKVjljWkEjXzZrM1VBQS1QRWRxTDJPMVBKVjljWkEiLz4KLSAgICAgIDwvcHJvY2Vzc0VsZW1lbnRzPgotICAgICAgPHByb2Nlc3NFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpSb2xlRGVzY3JpcHRvciIgeG1pOmlkPSJfR3FobU1VRFFFZHFyaHNaaDNRTkFNUSIgbmFtZT0icm9sZV9BMSIgZ3VpZD0iX0dxaG1NVURRRWRxcmhzWmgzUU5BTVEiIGJyaWVmRGVzY3JpcHRpb249IlJvbGUgQTEgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IlJvbGUgQTEiIHN1cGVyQWN0aXZpdGllcz0iX2xEaGw4RURGRWRxTzlNM2Z1a1lBX0EiPgotICAgICAgICA8Um9sZSBocmVmPSJ1bWE6Ly9feVVlTElBLVBFZHFMMk8xUEpWOWNaQSNfNTV6azBBLVBFZHFMMk8xUEpWOWNaQSIvPgotICAgICAgPC9wcm9jZXNzRWxlbWVudHM+Ci0gICAgICA8cHJvY2Vzc0VsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOldvcmtQcm9kdWN0RGVzY3JpcHRvciIgeG1pOmlkPSJfR3FobU1rRFFFZHFyaHNaaDNRTkFNUSIgbmFtZT0iYXJ0aWZhY3RfQTIiIGd1aWQ9Il9HcWhtTWtEUUVkcXJoc1poM1FOQU1RIiBicmllZkRlc2NyaXB0aW9uPSJBcnRpZmFjdCBBMiBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iQXJ0aWZhY3QgQTIgcHJlc2VudCIgc3VwZXJBY3Rpdml0aWVzPSJfbERobDhFREZFZHFPOU0zZnVrWUFfQSI+Ci0gICAgICAgIDxXb3JrUHJvZHVjdCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpBcnRpZmFjdCIgaHJlZj0idW1hOi8vX3lVZUxJQS1QRWRxTDJPMVBKVjljWkEjX0U3WjBrQS1SRWRxTDJPMVBKVjljWkEiLz4KLSAgICAgIDwvcHJvY2Vzc0VsZW1lbnRzPgotICAgICAgPHByb2Nlc3NFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpXb3JrUHJvZHVjdERlc2NyaXB0b3IiIHhtaTppZD0iX0dxaG1NMERRRWRxcmhzWmgzUU5BTVEiIG5hbWU9ImRlbGl2ZXJhYmxlX0EyIiBndWlkPSJfR3FobU0wRFFFZHFyaHNaaDNRTkFNUSIgYnJpZWZEZXNjcmlwdGlvbj0iRGVsaXZlcmFibGUgQTIgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IkRlbGl2ZXJhYmxlIEEyIHByZXNlbnQiIHN1cGVyQWN0aXZpdGllcz0iX2xEaGw4RURGRWRxTzlNM2Z1a1lBX0EiIGRlbGl2ZXJhYmxlUGFydHM9Il9HcXF3SUVEUUVkcXJoc1poM1FOQU1RIF9HcXF3SVVEUUVkcXJoc1poM1FOQU1RIj4KLSAgICAgICAgPFdvcmtQcm9kdWN0IHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkRlbGl2ZXJhYmxlIiBocmVmPSJ1bWE6Ly9feVVlTElBLVBFZHFMMk8xUEpWOWNaQSNfSkJxZlVBLVJFZHFMMk8xUEpWOWNaQSIvPgotICAgICAgPC9wcm9jZXNzRWxlbWVudHM+Ci0gICAgICA8cHJvY2Vzc0VsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOldvcmtQcm9kdWN0RGVzY3JpcHRvciIgeG1pOmlkPSJfR3FobU5FRFFFZHFyaHNaaDNRTkFNUSIgbmFtZT0ib3V0Y29tZV9BMiIgZ3VpZD0iX0dxaG1ORURRRWRxcmhzWmgzUU5BTVEiIGJyaWVmRGVzY3JpcHRpb249Ik91dGNvbWUgQTEgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9Ik91dGNvbWUgQTIgcHJlc2VudCIgc3VwZXJBY3Rpdml0aWVzPSJfbERobDhFREZFZHFPOU0zZnVrWUFfQSI+Ci0gICAgICAgIDxXb3JrUHJvZHVjdCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpPdXRjb21lIiBocmVmPSJ1bWE6Ly9feVVlTElBLVBFZHFMMk8xUEpWOWNaQSNfS3ZMeEVBLVJFZHFMMk8xUEpWOWNaQSIvPgotICAgICAgPC9wcm9jZXNzRWxlbWVudHM+Ci0gICAgICA8cHJvY2Vzc0VsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOldvcmtQcm9kdWN0RGVzY3JpcHRvciIgeG1pOmlkPSJfR3Fxd0lFRFFFZHFyaHNaaDNRTkFNUSIgbmFtZT0iYXJ0aWZhY3RfQTIiIGd1aWQ9Il9HcXF3SUVEUUVkcXJoc1poM1FOQU1RIiBicmllZkRlc2NyaXB0aW9uPSJBcnRpZmFjdCBBMiBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iQXJ0aWZhY3QgQTIgcHJlc2VudCI+Ci0gICAgICAgIDxXb3JrUHJvZHVjdCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpBcnRpZmFjdCIgaHJlZj0idW1hOi8vX3lVZUxJQS1QRWRxTDJPMVBKVjljWkEjX0U3WjBrQS1SRWRxTDJPMVBKVjljWkEiLz4KLSAgICAgIDwvcHJvY2Vzc0VsZW1lbnRzPgotICAgICAgPHByb2Nlc3NFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpXb3JrUHJvZHVjdERlc2NyaXB0b3IiIHhtaTppZD0iX0dxcXdJVURRRWRxcmhzWmgzUU5BTVEiIG5hbWU9Im91dGNvbWVfQTIiIGd1aWQ9Il9HcXF3SVVEUUVkcXJoc1poM1FOQU1RIiBicmllZkRlc2NyaXB0aW9uPSJPdXRjb21lIEExIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJPdXRjb21lIEEyIHByZXNlbnQiPgotICAgICAgICA8V29ya1Byb2R1Y3QgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6T3V0Y29tZSIgaHJlZj0idW1hOi8vX3lVZUxJQS1QRWRxTDJPMVBKVjljWkEjX0t2THhFQS1SRWRxTDJPMVBKVjljWkEiLz4KLSAgICAgIDwvcHJvY2Vzc0VsZW1lbnRzPgotICAgICAgPGRpYWdyYW1zIHhtaTppZD0iX19wbGRrRURRRWRxcmhzWmgzUU5BTVEiIGd1aWQ9Il9fcGxka0VEUUVkcXJoc1poM1FOQU1RIj4KLSAgICAgICAgPGNvbnRhaW5lZCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpHcmFwaE5vZGUiIHhtaTppZD0iX19wbGRrVURRRWRxcmhzWmgzUU5BTVEiIGd1aWQ9Il9fcGxka1VEUUVkcXJoc1poM1FOQU1RIj4KLSAgICAgICAgICA8cG9zaXRpb24geG1pOmlkPSJfX3BsZGtrRFFFZHFyaHNaaDNRTkFNUSIgeD0iLTEuMCIgeT0iLTEuMCIvPgotICAgICAgICAgIDxzZW1hbnRpY01vZGVsIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlVNQVNlbWFudGljTW9kZWxCcmlkZ2UiIHhtaTppZD0iX19wbGRrMERRRWRxcmhzWmgzUU5BTVEiIGd1aWQ9Il9fcGxkazBEUUVkcXJoc1poM1FOQU1RIiBlbGVtZW50PSJfR3FYMU1FRFFFZHFyaHNaaDNRTkFNUSIvPgotICAgICAgICAgIDxzaXplIHhtaTppZD0iX19wbGRsRURRRWRxcmhzWmgzUU5BTVEiIHdpZHRoPSItMS4wIiBoZWlnaHQ9Ii0xLjAiLz4KLSAgICAgICAgPC9jb250YWluZWQ+Ci0gICAgICAgIDxjb250YWluZWQgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6R3JhcGhOb2RlIiB4bWk6aWQ9Il9fcGxkbFVEUUVkcXJoc1poM1FOQU1RIiBndWlkPSJfX3BsZGxVRFFFZHFyaHNaaDNRTkFNUSI+Ci0gICAgICAgICAgPHBvc2l0aW9uIHhtaTppZD0iX19wbGRsa0RRRWRxcmhzWmgzUU5BTVEiIHg9IjMwLjAiIHk9Ijg4LjAiLz4KLSAgICAgICAgICA8c2VtYW50aWNNb2RlbCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpVTUFTZW1hbnRpY01vZGVsQnJpZGdlIiB4bWk6aWQ9Il9fcGxkbDBEUUVkcXJoc1poM1FOQU1RIiBndWlkPSJfX3BsZGwwRFFFZHFyaHNaaDNRTkFNUSIgZWxlbWVudD0iX0dxWDFNVURRRWRxcmhzWmgzUU5BTVEiLz4KLSAgICAgICAgICA8c2l6ZSB4bWk6aWQ9Il9fcGxkbUVEUUVkcXJoc1poM1FOQU1RIiB3aWR0aD0iMjI4LjAiIGhlaWdodD0iNjcuMCIvPgotICAgICAgICA8L2NvbnRhaW5lZD4KLSAgICAgICAgPGNvbnRhaW5lZCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpHcmFwaE5vZGUiIHhtaTppZD0iX19wbGRtVURRRWRxcmhzWmgzUU5BTVEiIGd1aWQ9Il9fcGxkbVVEUUVkcXJoc1poM1FOQU1RIj4KLSAgICAgICAgICA8cG9zaXRpb24geG1pOmlkPSJfX3BsZG1rRFFFZHFyaHNaaDNRTkFNUSIgeD0iLTEuMCIgeT0iLTEuMCIvPgotICAgICAgICAgIDxzZW1hbnRpY01vZGVsIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlVNQVNlbWFudGljTW9kZWxCcmlkZ2UiIHhtaTppZD0iX19wbGRtMERRRWRxcmhzWmgzUU5BTVEiIGd1aWQ9Il9fcGxkbTBEUUVkcXJoc1poM1FOQU1RIiBlbGVtZW50PSJfR3FobU1FRFFFZHFyaHNaaDNRTkFNUSIvPgotICAgICAgICAgIDxzaXplIHhtaTppZD0iX19wbGRuRURRRWRxcmhzWmgzUU5BTVEiIHdpZHRoPSItMS4wIiBoZWlnaHQ9Ii0xLjAiLz4KLSAgICAgICAgPC9jb250YWluZWQ+Ci0gICAgICAgIDxjb250YWluZWQgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6R3JhcGhOb2RlIiB4bWk6aWQ9Il9fcGxkblVEUUVkcXJoc1poM1FOQU1RIiBndWlkPSJfX3BsZG5VRFFFZHFyaHNaaDNRTkFNUSI+Ci0gICAgICAgICAgPHBvc2l0aW9uIHhtaTppZD0iX19wbGRua0RRRWRxcmhzWmgzUU5BTVEiIHg9Ii0xLjAiIHk9Ii0xLjAiLz4KLSAgICAgICAgICA8c2VtYW50aWNNb2RlbCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpVTUFTZW1hbnRpY01vZGVsQnJpZGdlIiB4bWk6aWQ9Il9fcGxkbjBEUUVkcXJoc1poM1FOQU1RIiBndWlkPSJfX3BsZG4wRFFFZHFyaHNaaDNRTkFNUSIgZWxlbWVudD0iX0dxaG1NVURRRWRxcmhzWmgzUU5BTVEiLz4KLSAgICAgICAgICA8c2l6ZSB4bWk6aWQ9Il9fcGxkb0VEUUVkcXJoc1poM1FOQU1RIiB3aWR0aD0iLTEuMCIgaGVpZ2h0PSItMS4wIi8+Ci0gICAgICAgIDwvY29udGFpbmVkPgotICAgICAgICA8Y29udGFpbmVkIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkdyYXBoTm9kZSIgeG1pOmlkPSJfX3BsZG9VRFFFZHFyaHNaaDNRTkFNUSIgZ3VpZD0iX19wbGRvVURRRWRxcmhzWmgzUU5BTVEiPgotICAgICAgICAgIDxwb3NpdGlvbiB4bWk6aWQ9Il9fcGxkb2tEUUVkcXJoc1poM1FOQU1RIiB4PSItMS4wIiB5PSItMS4wIi8+Ci0gICAgICAgICAgPHNlbWFudGljTW9kZWwgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VU1BU2VtYW50aWNNb2RlbEJyaWRnZSIgeG1pOmlkPSJfX3BsZG8wRFFFZHFyaHNaaDNRTkFNUSIgZ3VpZD0iX19wbGRvMERRRWRxcmhzWmgzUU5BTVEiIGVsZW1lbnQ9Il9HcWhtTWtEUUVkcXJoc1poM1FOQU1RIi8+Ci0gICAgICAgICAgPHNpemUgeG1pOmlkPSJfX3BsZHBFRFFFZHFyaHNaaDNRTkFNUSIgd2lkdGg9Ii0xLjAiIGhlaWdodD0iLTEuMCIvPgotICAgICAgICA8L2NvbnRhaW5lZD4KLSAgICAgICAgPGNvbnRhaW5lZCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpHcmFwaE5vZGUiIHhtaTppZD0iX19wbGRwVURRRWRxcmhzWmgzUU5BTVEiIGd1aWQ9Il9fcGxkcFVEUUVkcXJoc1poM1FOQU1RIj4KLSAgICAgICAgICA8cG9zaXRpb24geG1pOmlkPSJfX3BsZHBrRFFFZHFyaHNaaDNRTkFNUSIgeD0iLTEuMCIgeT0iLTEuMCIvPgotICAgICAgICAgIDxzZW1hbnRpY01vZGVsIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlVNQVNlbWFudGljTW9kZWxCcmlkZ2UiIHhtaTppZD0iX19wbGRwMERRRWRxcmhzWmgzUU5BTVEiIGd1aWQ9Il9fcGxkcDBEUUVkcXJoc1poM1FOQU1RIiBlbGVtZW50PSJfR3FobU0wRFFFZHFyaHNaaDNRTkFNUSIvPgotICAgICAgICAgIDxzaXplIHhtaTppZD0iX19wbGRxRURRRWRxcmhzWmgzUU5BTVEiIHdpZHRoPSItMS4wIiBoZWlnaHQ9Ii0xLjAiLz4KLSAgICAgICAgPC9jb250YWluZWQ+Ci0gICAgICAgIDxjb250YWluZWQgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6R3JhcGhOb2RlIiB4bWk6aWQ9Il9fcGxkcVVEUUVkcXJoc1poM1FOQU1RIiBndWlkPSJfX3BsZHFVRFFFZHFyaHNaaDNRTkFNUSI+Ci0gICAgICAgICAgPHBvc2l0aW9uIHhtaTppZD0iX19wbGRxa0RRRWRxcmhzWmgzUU5BTVEiIHg9Ii0xLjAiIHk9Ii0xLjAiLz4KLSAgICAgICAgICA8c2VtYW50aWNNb2RlbCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpVTUFTZW1hbnRpY01vZGVsQnJpZGdlIiB4bWk6aWQ9Il9fcGxkcTBEUUVkcXJoc1poM1FOQU1RIiBndWlkPSJfX3BsZHEwRFFFZHFyaHNaaDNRTkFNUSIgZWxlbWVudD0iX0dxaG1ORURRRWRxcmhzWmgzUU5BTVEiLz4KLSAgICAgICAgICA8c2l6ZSB4bWk6aWQ9Il9fcGxkckVEUUVkcXJoc1poM1FOQU1RIiB3aWR0aD0iLTEuMCIgaGVpZ2h0PSItMS4wIi8+Ci0gICAgICAgIDwvY29udGFpbmVkPgotICAgICAgICA8Y29udGFpbmVkIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkdyYXBoTm9kZSIgeG1pOmlkPSJfX3A0WWdFRFFFZHFyaHNaaDNRTkFNUSIgZ3VpZD0iX19wNFlnRURRRWRxcmhzWmgzUU5BTVEiPgotICAgICAgICAgIDxwcm9wZXJ0eSB4bWk6aWQ9Il9fcDRZZ1VEUUVkcXJoc1poM1FOQU1RIiBndWlkPSJfX3A0WWdVRFFFZHFyaHNaaDNRTkFNUSIga2V5PSJ3cENvbXBvc2l0ZVR5cGUiIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgPHBvc2l0aW9uIHhtaTppZD0iX19wNFlna0RRRWRxcmhzWmgzUU5BTVEiIHg9IjE0My4wIiB5PSIxLjAiLz4KLSAgICAgICAgICA8Y29udGFpbmVkIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkdyYXBoRWRnZSIgeG1pOmlkPSJfX3FDSmdVRFFFZHFyaHNaaDNRTkFNUSIgZ3VpZD0iX19xQ0pnVURRRWRxcmhzWmgzUU5BTVEiIGFuY2hvcj0iX19xQ0pnRURRRWRxcmhzWmgzUU5BTVEiLz4KLSAgICAgICAgICA8YW5jaG9yYWdlIHhtaTppZD0iX19xQ0pnRURRRWRxcmhzWmgzUU5BTVEiIGd1aWQ9Il9fcUNKZ0VEUUVkcXJoc1poM1FOQU1RIiBncmFwaEVkZ2U9Il9fcUNKZ1VEUUVkcXJoc1poM1FOQU1RIi8+Ci0gICAgICAgICAgPHNlbWFudGljTW9kZWwgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VU1BU2VtYW50aWNNb2RlbEJyaWRnZSIgeG1pOmlkPSJfX3A0WWcwRFFFZHFyaHNaaDNRTkFNUSIgZ3VpZD0iX19wNFlnMERRRWRxcmhzWmgzUU5BTVEiIGVsZW1lbnQ9Il9HcVgxTUVEUUVkcXJoc1poM1FOQU1RIi8+Ci0gICAgICAgICAgPHNpemUgeG1pOmlkPSJfX3A0WWhFRFFFZHFyaHNaaDNRTkFNUSIgd2lkdGg9Ijg0LjAiIGhlaWdodD0iNjcuMCIvPgotICAgICAgICA8L2NvbnRhaW5lZD4KLSAgICAgICAgPGNvbnRhaW5lZCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpHcmFwaE5vZGUiIHhtaTppZD0iX19wNFloVURRRWRxcmhzWmgzUU5BTVEiIGd1aWQ9Il9fcDRZaFVEUUVkcXJoc1poM1FOQU1RIj4KLSAgICAgICAgICA8cHJvcGVydHkgeG1pOmlkPSJfX3A0WWhrRFFFZHFyaHNaaDNRTkFNUSIgZ3VpZD0iX19wNFloa0RRRWRxcmhzWmgzUU5BTVEiIGtleT0id3BDb21wb3NpdGVUeXBlIiB2YWx1ZT0iMiIvPgotICAgICAgICAgIDxwb3NpdGlvbiB4bWk6aWQ9Il9fcDRZaDBEUUVkcXJoc1poM1FOQU1RIiB4PSIxNDMuMCIgeT0iMTc1LjAiLz4KLSAgICAgICAgICA8c2VtYW50aWNNb2RlbCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpVTUFTZW1hbnRpY01vZGVsQnJpZGdlIiB4bWk6aWQ9Il9fcDRZaUVEUUVkcXJoc1poM1FOQU1RIiBndWlkPSJfX3A0WWlFRFFFZHFyaHNaaDNRTkFNUSIgZWxlbWVudD0iX0dxWDFNRURRRWRxcmhzWmgzUU5BTVEiLz4KLSAgICAgICAgICA8c2l6ZSB4bWk6aWQ9Il9fcDRZaVVEUUVkcXJoc1poM1FOQU1RIiB3aWR0aD0iODQuMCIgaGVpZ2h0PSI4My4wIi8+Ci0gICAgICAgIDwvY29udGFpbmVkPgotICAgICAgICA8c2VtYW50aWNNb2RlbCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpVTUFTZW1hbnRpY01vZGVsQnJpZGdlIiB4bWk6aWQ9Il9fcGxkclVEUUVkcXJoc1poM1FOQU1RIiBndWlkPSJfX3BsZHJVRFFFZHFyaHNaaDNRTkFNUSIgcHJlc2VudGF0aW9uPSJBY3Rpdml0eSBEZXRhaWwiIGVsZW1lbnQ9Il9sRGhsOEVERkVkcU85TTNmdWtZQV9BIi8+Ci0gICAgICA8L2RpYWdyYW1zPgotICAgIDwvY2hpbGRQYWNrYWdlcz4KLSAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzUGFja2FnZSIgeG1pOmlkPSJfZFhEZDhFRFBFZHFyaHNaaDNRTkFNUSIgbmFtZT0iQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cyIgZ3VpZD0iX2RYRGQ4RURQRWRxcmhzWmgzUU5BTVEiPgotICAgICAgPHByb2Nlc3NFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpBY3Rpdml0eSIgeG1pOmlkPSJfZFlHbTBFRFBFZHFyaHNaaDNRTkFNUSIgbmFtZT0iQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cyIgZ3VpZD0iX2RZR20wRURQRWRxcmhzWmgzUU5BTVEiIHByZXNlbnRhdGlvbk5hbWU9IkFjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMiIHN1cGVyQWN0aXZpdGllcz0iX1p0WmJNVURGRWRxTzlNM2Z1a1lBX0EiIGJyZWFrZG93bkVsZW1lbnRzPSJfbDV5VUFFRFBFZHFyaHNaaDNRTkFNUSBfbDV5VUFVRFBFZHFyaHNaaDNRTkFNUSBfbDV5VUFrRFBFZHFyaHNaaDNRTkFNUSBfbDV5VUEwRFBFZHFyaHNaaDNRTkFNUSBfbDV5VUJFRFBFZHFyaHNaaDNRTkFNUSBfbDV5VUJVRFBFZHFyaHNaaDNRTkFNUSBfbDV5VUJrRFBFZHFyaHNaaDNRTkFNUSBfbDV5VUIwRFBFZHFyaHNaaDNRTkFNUSBfbDV5VUNFRFBFZHFyaHNaaDNRTkFNUSBfbDV5VUNVRFBFZHFyaHNaaDNRTkFNUSBfbDV5VUNrRFBFZHFyaHNaaDNRTkFNUSIvPgotICAgICAgPHByb2Nlc3NFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpUYXNrRGVzY3JpcHRvciIgeG1pOmlkPSJfbDV5VUFFRFBFZHFyaHNaaDNRTkFNUSIgbmFtZT0idGFza19CMiIgZ3VpZD0iX2w1eVVBRURQRWRxcmhzWmgzUU5BTVEiIGJyaWVmRGVzY3JpcHRpb249IlRhc2sgQjIgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IlRhc2sgQjIgZXh0ZW5kcyBUYXNrIEExIiBzdXBlckFjdGl2aXRpZXM9Il9kWUdtMEVEUEVkcXJoc1poM1FOQU1RIiBhZGRpdGlvbmFsbHlQZXJmb3JtZWRCeT0iX2w1eVVBa0RQRWRxcmhzWmgzUU5BTVEgX2w1eVVBMERQRWRxcmhzWmgzUU5BTVEiIG1hbmRhdG9yeUlucHV0PSJfbDV5VUJFRFBFZHFyaHNaaDNRTkFNUSBfbDV5VUJVRFBFZHFyaHNaaDNRTkFNUSBfbDV5VUJrRFBFZHFyaHNaaDNRTkFNUSIgb3B0aW9uYWxJbnB1dD0iX2w1eVVCMERQRWRxcmhzWmgzUU5BTVEgX2w1eVVDRURQRWRxcmhzWmgzUU5BTVEiIG91dHB1dD0iX2w1eVVDVURQRWRxcmhzWmgzUU5BTVEgX2w1eVVDa0RQRWRxcmhzWmgzUU5BTVEiIHBlcmZvcm1lZFByaW1hcmlseUJ5PSJfbDV5VUFVRFBFZHFyaHNaaDNRTkFNUSI+Ci0gICAgICAgIDxUYXNrIGhyZWY9InVtYTovL19lY3k1d0JNM0VkcXFuZGktZ0R1eHB3I19aTE9Nc0I4UEVkcXNoTU5TSTA3WE9nIi8+Ci0gICAgICAgIDxzZWxlY3RlZFN0ZXBzIGhyZWY9InVtYTovLy1KM3owSUdmamVoaXQwdUZiVEpjYTdnI19vcVlzd0I4NEVkcU52ZWx5YkRYWkZRIi8+Ci0gICAgICAgIDxzZWxlY3RlZFN0ZXBzIGhyZWY9InVtYTovLy1KM3owSUdmamVoaXQwdUZiVEpjYTdnI19xdVFwQUI4NEVkcU52ZWx5YkRYWkZRIi8+Ci0gICAgICAgIDxzZWxlY3RlZFN0ZXBzIGhyZWY9InVtYTovLy1KM3owSUdmamVoaXQwdUZiVEpjYTdnI19xeXU1VUI4NEVkcU52ZWx5YkRYWkZRIi8+Ci0gICAgICAgIDxzZWxlY3RlZFN0ZXBzIGhyZWY9InVtYTovLy1TMWlnTFNpNkFJX3ZsdXpXT0N1NlR3I190dkY0TUJCUEVkcUJzN0toZFZMUkxBIi8+Ci0gICAgICAgIDxzZWxlY3RlZFN0ZXBzIGhyZWY9InVtYTovLy1TMWlnTFNpNkFJX3ZsdXpXT0N1NlR3I190emtJZ0JCUEVkcUJzN0toZFZMUkxBIi8+Ci0gICAgICAgIDxzZWxlY3RlZFN0ZXBzIGhyZWY9InVtYTovLy1TMWlnTFNpNkFJX3ZsdXpXT0N1NlR3I191Q0JiUUJCUEVkcUJzN0toZFZMUkxBIi8+Ci0gICAgICA8L3Byb2Nlc3NFbGVtZW50cz4KLSAgICAgIDxwcm9jZXNzRWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Um9sZURlc2NyaXB0b3IiIHhtaTppZD0iX2w1eVVBVURQRWRxcmhzWmgzUU5BTVEiIG5hbWU9InJvbGVfQjIiIGd1aWQ9Il9sNXlVQVVEUEVkcXJoc1poM1FOQU1RIiBicmllZkRlc2NyaXB0aW9uPSJSb2xlIEIyIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJSb2xlIEIyIHByZXNlbnQiIHN1cGVyQWN0aXZpdGllcz0iX2RZR20wRURQRWRxcmhzWmgzUU5BTVEiIHJlc3BvbnNpYmxlRm9yPSJfbDV5VUJFRFBFZHFyaHNaaDNRTkFNUSBfbDV5VUIwRFBFZHFyaHNaaDNRTkFNUSI+Ci0gICAgICAgIDxSb2xlIGhyZWY9InVtYTovL19lY3k1d0JNM0VkcXFuZGktZ0R1eHB3I19LQ01fSUI4UEVkcXNoTU5TSTA3WE9nIi8+Ci0gICAgICA8L3Byb2Nlc3NFbGVtZW50cz4KLSAgICAgIDxwcm9jZXNzRWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Um9sZURlc2NyaXB0b3IiIHhtaTppZD0iX2w1eVVBa0RQRWRxcmhzWmgzUU5BTVEiIG5hbWU9InJvbGVfQjEiIGd1aWQ9Il9sNXlVQWtEUEVkcXJoc1poM1FOQU1RIiBicmllZkRlc2NyaXB0aW9uPSJSb2xlIEIxIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJSb2xlIEIxIHByZXNlbnQiIHN1cGVyQWN0aXZpdGllcz0iX2RZR20wRURQRWRxcmhzWmgzUU5BTVEiPgotICAgICAgICA8Um9sZSBocmVmPSJ1bWE6Ly9fZWN5NXdCTTNFZHFxbmRpLWdEdXhwdyNfQTlEWWdCOFBFZHFzaE1OU0kwN1hPZyIvPgotICAgICAgPC9wcm9jZXNzRWxlbWVudHM+Ci0gICAgICA8cHJvY2Vzc0VsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlJvbGVEZXNjcmlwdG9yIiB4bWk6aWQ9Il9sNXlVQTBEUEVkcXJoc1poM1FOQU1RIiBuYW1lPSJyb2xlX0EyIiBndWlkPSJfbDV5VUEwRFBFZHFyaHNaaDNRTkFNUSIgYnJpZWZEZXNjcmlwdGlvbj0iUm9sZSBBMiBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iUm9sZSBBMiBleHRlbmRlZCBieSBSb2xlIEEzIiBzdXBlckFjdGl2aXRpZXM9Il9kWUdtMEVEUEVkcXJoc1poM1FOQU1RIj4KLSAgICAgICAgPFJvbGUgaHJlZj0idW1hOi8vX3lVZUxJQS1QRWRxTDJPMVBKVjljWkEjXzZrM1VBQS1QRWRxTDJPMVBKVjljWkEiLz4KLSAgICAgIDwvcHJvY2Vzc0VsZW1lbnRzPgotICAgICAgPHByb2Nlc3NFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpXb3JrUHJvZHVjdERlc2NyaXB0b3IiIHhtaTppZD0iX2w1eVVCRURQRWRxcmhzWmgzUU5BTVEiIG5hbWU9ImFydGlmYWN0X0IyIiBndWlkPSJfbDV5VUJFRFBFZHFyaHNaaDNRTkFNUSIgYnJpZWZEZXNjcmlwdGlvbj0iQXJ0aWZhY3QgQjIgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IkFydGlmYWN0IEIyIHByZXNlbnQiIHN1cGVyQWN0aXZpdGllcz0iX2RZR20wRURQRWRxcmhzWmgzUU5BTVEiPgotICAgICAgICA8V29ya1Byb2R1Y3QgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6QXJ0aWZhY3QiIGhyZWY9InVtYTovL19lY3k1d0JNM0VkcXFuZGktZ0R1eHB3I19feUc3Y0I4bUVkcTFPby1Eb3dkcEJnIi8+Ci0gICAgICA8L3Byb2Nlc3NFbGVtZW50cz4KLSAgICAgIDxwcm9jZXNzRWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6V29ya1Byb2R1Y3REZXNjcmlwdG9yIiB4bWk6aWQ9Il9sNXlVQlVEUEVkcXJoc1poM1FOQU1RIiBuYW1lPSJzdWJfYXJ0aWZhY3RfQTEuMSIgZ3VpZD0iX2w1eVVCVURQRWRxcmhzWmgzUU5BTVEiIGJyaWVmRGVzY3JpcHRpb249IlN1Yl9BcnRpZmFjdCBBMS4xIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJTdWJfQXJ0aWZhY3QgQTEuMSBwcmVzZW50IiBzdXBlckFjdGl2aXRpZXM9Il9kWUdtMEVEUEVkcXJoc1poM1FOQU1RIj4KLSAgICAgICAgPFdvcmtQcm9kdWN0IHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkFydGlmYWN0IiBocmVmPSJ1bWE6Ly9feVVlTElBLVBFZHFMMk8xUEpWOWNaQSNfRjUxeXdBLVJFZHFMMk8xUEpWOWNaQSIvPgotICAgICAgPC9wcm9jZXNzRWxlbWVudHM+Ci0gICAgICA8cHJvY2Vzc0VsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOldvcmtQcm9kdWN0RGVzY3JpcHRvciIgeG1pOmlkPSJfbDV5VUJrRFBFZHFyaHNaaDNRTkFNUSIgbmFtZT0iYXJ0aWZhY3RfQTEiIGd1aWQ9Il9sNXlVQmtEUEVkcXJoc1poM1FOQU1RIiBicmllZkRlc2NyaXB0aW9uPSJBcnRpZmFjdCBBMSBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iQXJ0aWZhY3QgQTEgcHJlc2VudCIgc3VwZXJBY3Rpdml0aWVzPSJfZFlHbTBFRFBFZHFyaHNaaDNRTkFNUSI+Ci0gICAgICAgIDxXb3JrUHJvZHVjdCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpBcnRpZmFjdCIgaHJlZj0idW1hOi8vX3lVZUxJQS1QRWRxTDJPMVBKVjljWkEjXzlLdDc4QS1QRWRxTDJPMVBKVjljWkEiLz4KLSAgICAgIDwvcHJvY2Vzc0VsZW1lbnRzPgotICAgICAgPHByb2Nlc3NFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpXb3JrUHJvZHVjdERlc2NyaXB0b3IiIHhtaTppZD0iX2w1eVVCMERQRWRxcmhzWmgzUU5BTVEiIG5hbWU9ImRlbGl2ZXJhYmxlX0IyIiBndWlkPSJfbDV5VUIwRFBFZHFyaHNaaDNRTkFNUSIgYnJpZWZEZXNjcmlwdGlvbj0iRGVsaXZlcmFibGUgQjIgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IkRlbGl2ZXJhYmxlIEIyIHByZXNlbnQiIHN1cGVyQWN0aXZpdGllcz0iX2RZR20wRURQRWRxcmhzWmgzUU5BTVEiIGRlbGl2ZXJhYmxlUGFydHM9Il9sNTdkOEVEUEVkcXJoc1poM1FOQU1RIF9sNTdkOFVEUEVkcXJoc1poM1FOQU1RIj4KLSAgICAgICAgPFdvcmtQcm9kdWN0IHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkRlbGl2ZXJhYmxlIiBocmVmPSJ1bWE6Ly9fZWN5NXdCTTNFZHFxbmRpLWdEdXhwdyNfbnFGV0VCOG5FZHExT28tRG93ZHBCZyIvPgotICAgICAgPC9wcm9jZXNzRWxlbWVudHM+Ci0gICAgICA8cHJvY2Vzc0VsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOldvcmtQcm9kdWN0RGVzY3JpcHRvciIgeG1pOmlkPSJfbDV5VUNFRFBFZHFyaHNaaDNRTkFNUSIgbmFtZT0iZGVsaXZlcmFibGVfQTEiIGd1aWQ9Il9sNXlVQ0VEUEVkcXJoc1poM1FOQU1RIiBicmllZkRlc2NyaXB0aW9uPSJEZWxpdmVyYWJsZSBBMSBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iRGVsaXZlcmFibGUgQTEgcHJlc2VudCIgc3VwZXJBY3Rpdml0aWVzPSJfZFlHbTBFRFBFZHFyaHNaaDNRTkFNUSIgZGVsaXZlcmFibGVQYXJ0cz0iX2w1N2Q4a0RQRWRxcmhzWmgzUU5BTVEgX2w1N2Q4MERQRWRxcmhzWmgzUU5BTVEgX2w1N2Q5RURQRWRxcmhzWmgzUU5BTVEiPgotICAgICAgICA8V29ya1Byb2R1Y3QgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6RGVsaXZlcmFibGUiIGhyZWY9InVtYTovL195VWVMSUEtUEVkcUwyTzFQSlY5Y1pBI19JSVNuVUEtUkVkcUwyTzFQSlY5Y1pBIi8+Ci0gICAgICA8L3Byb2Nlc3NFbGVtZW50cz4KLSAgICAgIDxwcm9jZXNzRWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6V29ya1Byb2R1Y3REZXNjcmlwdG9yIiB4bWk6aWQ9Il9sNXlVQ1VEUEVkcXJoc1poM1FOQU1RIiBuYW1lPSJvdXRjb21lX0IyIiBndWlkPSJfbDV5VUNVRFBFZHFyaHNaaDNRTkFNUSIgYnJpZWZEZXNjcmlwdGlvbj0iT3V0Y29tZSBCMiBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iT3V0Y29tZSBCMiBwcmVzZW50IiBzdXBlckFjdGl2aXRpZXM9Il9kWUdtMEVEUEVkcXJoc1poM1FOQU1RIj4KLSAgICAgICAgPFdvcmtQcm9kdWN0IHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOk91dGNvbWUiIGhyZWY9InVtYTovL19lY3k1d0JNM0VkcXFuZGktZ0R1eHB3I19hc0ZPa0I4bkVkcTFPby1Eb3dkcEJnIi8+Ci0gICAgICA8L3Byb2Nlc3NFbGVtZW50cz4KLSAgICAgIDxwcm9jZXNzRWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6V29ya1Byb2R1Y3REZXNjcmlwdG9yIiB4bWk6aWQ9Il9sNXlVQ2tEUEVkcXJoc1poM1FOQU1RIiBuYW1lPSJvdXRjb21lX0ExIiBndWlkPSJfbDV5VUNrRFBFZHFyaHNaaDNRTkFNUSIgYnJpZWZEZXNjcmlwdGlvbj0iT3V0Y29tZSBBMSBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iT3V0Y29tZSBBMSBwcmVzZW50IiBzdXBlckFjdGl2aXRpZXM9Il9kWUdtMEVEUEVkcXJoc1poM1FOQU1RIj4KLSAgICAgICAgPFdvcmtQcm9kdWN0IHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOk91dGNvbWUiIGhyZWY9InVtYTovL195VWVMSUEtUEVkcUwyTzFQSlY5Y1pBI19LQV8xWUEtUkVkcUwyTzFQSlY5Y1pBIi8+Ci0gICAgICA8L3Byb2Nlc3NFbGVtZW50cz4KLSAgICAgIDxwcm9jZXNzRWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6V29ya1Byb2R1Y3REZXNjcmlwdG9yIiB4bWk6aWQ9Il9sNTdkOEVEUEVkcXJoc1poM1FOQU1RIiBuYW1lPSJhcnRpZmFjdF9CMiIgZ3VpZD0iX2w1N2Q4RURQRWRxcmhzWmgzUU5BTVEiIGJyaWVmRGVzY3JpcHRpb249IkFydGlmYWN0IEIyIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJBcnRpZmFjdCBCMiBwcmVzZW50Ij4KLSAgICAgICAgPFdvcmtQcm9kdWN0IHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkFydGlmYWN0IiBocmVmPSJ1bWE6Ly9fZWN5NXdCTTNFZHFxbmRpLWdEdXhwdyNfX3lHN2NCOG1FZHExT28tRG93ZHBCZyIvPgotICAgICAgPC9wcm9jZXNzRWxlbWVudHM+Ci0gICAgICA8cHJvY2Vzc0VsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOldvcmtQcm9kdWN0RGVzY3JpcHRvciIgeG1pOmlkPSJfbDU3ZDhVRFBFZHFyaHNaaDNRTkFNUSIgbmFtZT0ib3V0Y29tZV9CMiIgZ3VpZD0iX2w1N2Q4VURQRWRxcmhzWmgzUU5BTVEiIGJyaWVmRGVzY3JpcHRpb249Ik91dGNvbWUgQjIgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9Ik91dGNvbWUgQjIgcHJlc2VudCI+Ci0gICAgICAgIDxXb3JrUHJvZHVjdCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpPdXRjb21lIiBocmVmPSJ1bWE6Ly9fZWN5NXdCTTNFZHFxbmRpLWdEdXhwdyNfYXNGT2tCOG5FZHExT28tRG93ZHBCZyIvPgotICAgICAgPC9wcm9jZXNzRWxlbWVudHM+Ci0gICAgICA8cHJvY2Vzc0VsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOldvcmtQcm9kdWN0RGVzY3JpcHRvciIgeG1pOmlkPSJfbDU3ZDhrRFBFZHFyaHNaaDNRTkFNUSIgbmFtZT0iYXJ0aWZhY3RfQTEiIGd1aWQ9Il9sNTdkOGtEUEVkcXJoc1poM1FOQU1RIiBicmllZkRlc2NyaXB0aW9uPSJBcnRpZmFjdCBBMSBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iQXJ0aWZhY3QgQTEgcHJlc2VudCI+Ci0gICAgICAgIDxXb3JrUHJvZHVjdCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpBcnRpZmFjdCIgaHJlZj0idW1hOi8vX3lVZUxJQS1QRWRxTDJPMVBKVjljWkEjXzlLdDc4QS1QRWRxTDJPMVBKVjljWkEiLz4KLSAgICAgIDwvcHJvY2Vzc0VsZW1lbnRzPgotICAgICAgPHByb2Nlc3NFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpXb3JrUHJvZHVjdERlc2NyaXB0b3IiIHhtaTppZD0iX2w1N2Q4MERQRWRxcmhzWmgzUU5BTVEiIG5hbWU9InN1Yl9hcnRpZmFjdF9BMS4xIiBndWlkPSJfbDU3ZDgwRFBFZHFyaHNaaDNRTkFNUSIgYnJpZWZEZXNjcmlwdGlvbj0iU3ViX0FydGlmYWN0IEExLjEgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IlN1Yl9BcnRpZmFjdCBBMS4xIHByZXNlbnQiPgotICAgICAgICA8V29ya1Byb2R1Y3QgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6QXJ0aWZhY3QiIGhyZWY9InVtYTovL195VWVMSUEtUEVkcUwyTzFQSlY5Y1pBI19GNTF5d0EtUkVkcUwyTzFQSlY5Y1pBIi8+Ci0gICAgICA8L3Byb2Nlc3NFbGVtZW50cz4KLSAgICAgIDxwcm9jZXNzRWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6V29ya1Byb2R1Y3REZXNjcmlwdG9yIiB4bWk6aWQ9Il9sNTdkOUVEUEVkcXJoc1poM1FOQU1RIiBuYW1lPSJvdXRjb21lX0ExIiBndWlkPSJfbDU3ZDlFRFBFZHFyaHNaaDNRTkFNUSIgYnJpZWZEZXNjcmlwdGlvbj0iT3V0Y29tZSBBMSBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iT3V0Y29tZSBBMSBwcmVzZW50Ij4KLSAgICAgICAgPFdvcmtQcm9kdWN0IHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOk91dGNvbWUiIGhyZWY9InVtYTovL195VWVMSUEtUEVkcUwyTzFQSlY5Y1pBI19LQV8xWUEtUkVkcUwyTzFQSlY5Y1pBIi8+Ci0gICAgICA8L3Byb2Nlc3NFbGVtZW50cz4KLSAgICAgIDxkaWFncmFtcyB4bWk6aWQ9Il9COUdfWUVEUkVkcXJoc1poM1FOQU1RIiBndWlkPSJfQjlHX1lFRFJFZHFyaHNaaDNRTkFNUSI+Ci0gICAgICAgIDxjb250YWluZWQgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6R3JhcGhOb2RlIiB4bWk6aWQ9Il9COUdfWVVEUkVkcXJoc1poM1FOQU1RIiBndWlkPSJfQjlHX1lVRFJFZHFyaHNaaDNRTkFNUSI+Ci0gICAgICAgICAgPHBvc2l0aW9uIHhtaTppZD0iX0I5R19Za0RSRWRxcmhzWmgzUU5BTVEiIHg9Ii0xLjAiIHk9Ii0xLjAiLz4KLSAgICAgICAgICA8c2VtYW50aWNNb2RlbCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpVTUFTZW1hbnRpY01vZGVsQnJpZGdlIiB4bWk6aWQ9Il9COUdfWTBEUkVkcXJoc1poM1FOQU1RIiBndWlkPSJfQjlHX1kwRFJFZHFyaHNaaDNRTkFNUSIgZWxlbWVudD0iX2w1eVVBRURQRWRxcmhzWmgzUU5BTVEiLz4KLSAgICAgICAgICA8c2l6ZSB4bWk6aWQ9Il9COUdfWkVEUkVkcXJoc1poM1FOQU1RIiB3aWR0aD0iLTEuMCIgaGVpZ2h0PSItMS4wIi8+Ci0gICAgICAgIDwvY29udGFpbmVkPgotICAgICAgICA8Y29udGFpbmVkIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkdyYXBoTm9kZSIgeG1pOmlkPSJfQjlHX1pVRFJFZHFyaHNaaDNRTkFNUSIgZ3VpZD0iX0I5R19aVURSRWRxcmhzWmgzUU5BTVEiPgotICAgICAgICAgIDxwb3NpdGlvbiB4bWk6aWQ9Il9COUdfWmtEUkVkcXJoc1poM1FOQU1RIiB4PSIzMC4wIiB5PSIyMzYuMCIvPgotICAgICAgICAgIDxzZW1hbnRpY01vZGVsIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlVNQVNlbWFudGljTW9kZWxCcmlkZ2UiIHhtaTppZD0iX0I5R19aMERSRWRxcmhzWmgzUU5BTVEiIGd1aWQ9Il9COUdfWjBEUkVkcXJoc1poM1FOQU1RIiBlbGVtZW50PSJfbDV5VUFVRFBFZHFyaHNaaDNRTkFNUSIvPgotICAgICAgICAgIDxzaXplIHhtaTppZD0iX0I5R19hRURSRWRxcmhzWmgzUU5BTVEiIHdpZHRoPSIyMjEuMCIgaGVpZ2h0PSI2Ny4wIi8+Ci0gICAgICAgIDwvY29udGFpbmVkPgotICAgICAgICA8Y29udGFpbmVkIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkdyYXBoTm9kZSIgeG1pOmlkPSJfQjlHX2FVRFJFZHFyaHNaaDNRTkFNUSIgZ3VpZD0iX0I5R19hVURSRWRxcmhzWmgzUU5BTVEiPgotICAgICAgICAgIDxwb3NpdGlvbiB4bWk6aWQ9Il9COUdfYWtEUkVkcXJoc1poM1FOQU1RIiB4PSItMS4wIiB5PSItMS4wIi8+Ci0gICAgICAgICAgPHNlbWFudGljTW9kZWwgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VU1BU2VtYW50aWNNb2RlbEJyaWRnZSIgeG1pOmlkPSJfQjlHX2EwRFJFZHFyaHNaaDNRTkFNUSIgZ3VpZD0iX0I5R19hMERSRWRxcmhzWmgzUU5BTVEiIGVsZW1lbnQ9Il9sNXlVQWtEUEVkcXJoc1poM1FOQU1RIi8+Ci0gICAgICAgICAgPHNpemUgeG1pOmlkPSJfQjlHX2JFRFJFZHFyaHNaaDNRTkFNUSIgd2lkdGg9Ii0xLjAiIGhlaWdodD0iLTEuMCIvPgotICAgICAgICA8L2NvbnRhaW5lZD4KLSAgICAgICAgPGNvbnRhaW5lZCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpHcmFwaE5vZGUiIHhtaTppZD0iX0I5R19iVURSRWRxcmhzWmgzUU5BTVEiIGd1aWQ9Il9COUdfYlVEUkVkcXJoc1poM1FOQU1RIj4KLSAgICAgICAgICA8cG9zaXRpb24geG1pOmlkPSJfQjlHX2JrRFJFZHFyaHNaaDNRTkFNUSIgeD0iLTEuMCIgeT0iLTEuMCIvPgotICAgICAgICAgIDxzZW1hbnRpY01vZGVsIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlVNQVNlbWFudGljTW9kZWxCcmlkZ2UiIHhtaTppZD0iX0I5R19iMERSRWRxcmhzWmgzUU5BTVEiIGd1aWQ9Il9COUdfYjBEUkVkcXJoc1poM1FOQU1RIiBlbGVtZW50PSJfbDV5VUEwRFBFZHFyaHNaaDNRTkFNUSIvPgotICAgICAgICAgIDxzaXplIHhtaTppZD0iX0I5R19jRURSRWRxcmhzWmgzUU5BTVEiIHdpZHRoPSItMS4wIiBoZWlnaHQ9Ii0xLjAiLz4KLSAgICAgICAgPC9jb250YWluZWQ+Ci0gICAgICAgIDxjb250YWluZWQgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6R3JhcGhOb2RlIiB4bWk6aWQ9Il9COUdfY1VEUkVkcXJoc1poM1FOQU1RIiBndWlkPSJfQjlHX2NVRFJFZHFyaHNaaDNRTkFNUSI+Ci0gICAgICAgICAgPHBvc2l0aW9uIHhtaTppZD0iX0I5R19ja0RSRWRxcmhzWmgzUU5BTVEiIHg9Ii0xLjAiIHk9Ii0xLjAiLz4KLSAgICAgICAgICA8c2VtYW50aWNNb2RlbCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpVTUFTZW1hbnRpY01vZGVsQnJpZGdlIiB4bWk6aWQ9Il9COUdfYzBEUkVkcXJoc1poM1FOQU1RIiBndWlkPSJfQjlHX2MwRFJFZHFyaHNaaDNRTkFNUSIgZWxlbWVudD0iX2w1eVVCRURQRWRxcmhzWmgzUU5BTVEiLz4KLSAgICAgICAgICA8c2l6ZSB4bWk6aWQ9Il9COUdfZEVEUkVkcXJoc1poM1FOQU1RIiB3aWR0aD0iLTEuMCIgaGVpZ2h0PSItMS4wIi8+Ci0gICAgICAgIDwvY29udGFpbmVkPgotICAgICAgICA8Y29udGFpbmVkIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkdyYXBoTm9kZSIgeG1pOmlkPSJfQjlHX2RVRFJFZHFyaHNaaDNRTkFNUSIgZ3VpZD0iX0I5R19kVURSRWRxcmhzWmgzUU5BTVEiPgotICAgICAgICAgIDxwb3NpdGlvbiB4bWk6aWQ9Il9COUdfZGtEUkVkcXJoc1poM1FOQU1RIiB4PSItMS4wIiB5PSItMS4wIi8+Ci0gICAgICAgICAgPHNlbWFudGljTW9kZWwgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VU1BU2VtYW50aWNNb2RlbEJyaWRnZSIgeG1pOmlkPSJfQjlHX2QwRFJFZHFyaHNaaDNRTkFNUSIgZ3VpZD0iX0I5R19kMERSRWRxcmhzWmgzUU5BTVEiIGVsZW1lbnQ9Il9sNXlVQlVEUEVkcXJoc1poM1FOQU1RIi8+Ci0gICAgICAgICAgPHNpemUgeG1pOmlkPSJfQjlHX2VFRFJFZHFyaHNaaDNRTkFNUSIgd2lkdGg9Ii0xLjAiIGhlaWdodD0iLTEuMCIvPgotICAgICAgICA8L2NvbnRhaW5lZD4KLSAgICAgICAgPGNvbnRhaW5lZCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpHcmFwaE5vZGUiIHhtaTppZD0iX0I5R19lVURSRWRxcmhzWmgzUU5BTVEiIGd1aWQ9Il9COUdfZVVEUkVkcXJoc1poM1FOQU1RIj4KLSAgICAgICAgICA8cG9zaXRpb24geG1pOmlkPSJfQjlHX2VrRFJFZHFyaHNaaDNRTkFNUSIgeD0iLTEuMCIgeT0iLTEuMCIvPgotICAgICAgICAgIDxzZW1hbnRpY01vZGVsIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlVNQVNlbWFudGljTW9kZWxCcmlkZ2UiIHhtaTppZD0iX0I5R19lMERSRWRxcmhzWmgzUU5BTVEiIGd1aWQ9Il9COUdfZTBEUkVkcXJoc1poM1FOQU1RIiBlbGVtZW50PSJfbDV5VUJrRFBFZHFyaHNaaDNRTkFNUSIvPgotICAgICAgICAgIDxzaXplIHhtaTppZD0iX0I5R19mRURSRWRxcmhzWmgzUU5BTVEiIHdpZHRoPSItMS4wIiBoZWlnaHQ9Ii0xLjAiLz4KLSAgICAgICAgPC9jb250YWluZWQ+Ci0gICAgICAgIDxjb250YWluZWQgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6R3JhcGhOb2RlIiB4bWk6aWQ9Il9COUdfZlVEUkVkcXJoc1poM1FOQU1RIiBndWlkPSJfQjlHX2ZVRFJFZHFyaHNaaDNRTkFNUSI+Ci0gICAgICAgICAgPHBvc2l0aW9uIHhtaTppZD0iX0I5R19ma0RSRWRxcmhzWmgzUU5BTVEiIHg9Ii0xLjAiIHk9Ii0xLjAiLz4KLSAgICAgICAgICA8c2VtYW50aWNNb2RlbCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpVTUFTZW1hbnRpY01vZGVsQnJpZGdlIiB4bWk6aWQ9Il9COUdfZjBEUkVkcXJoc1poM1FOQU1RIiBndWlkPSJfQjlHX2YwRFJFZHFyaHNaaDNRTkFNUSIgZWxlbWVudD0iX2w1eVVCMERQRWRxcmhzWmgzUU5BTVEiLz4KLSAgICAgICAgICA8c2l6ZSB4bWk6aWQ9Il9COUdfZ0VEUkVkcXJoc1poM1FOQU1RIiB3aWR0aD0iLTEuMCIgaGVpZ2h0PSItMS4wIi8+Ci0gICAgICAgIDwvY29udGFpbmVkPgotICAgICAgICA8Y29udGFpbmVkIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkdyYXBoTm9kZSIgeG1pOmlkPSJfQjlHX2dVRFJFZHFyaHNaaDNRTkFNUSIgZ3VpZD0iX0I5R19nVURSRWRxcmhzWmgzUU5BTVEiPgotICAgICAgICAgIDxwb3NpdGlvbiB4bWk6aWQ9Il9COUdfZ2tEUkVkcXJoc1poM1FOQU1RIiB4PSItMS4wIiB5PSItMS4wIi8+Ci0gICAgICAgICAgPHNlbWFudGljTW9kZWwgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VU1BU2VtYW50aWNNb2RlbEJyaWRnZSIgeG1pOmlkPSJfQjlHX2cwRFJFZHFyaHNaaDNRTkFNUSIgZ3VpZD0iX0I5R19nMERSRWRxcmhzWmgzUU5BTVEiIGVsZW1lbnQ9Il9sNXlVQ0VEUEVkcXJoc1poM1FOQU1RIi8+Ci0gICAgICAgICAgPHNpemUgeG1pOmlkPSJfQjlHX2hFRFJFZHFyaHNaaDNRTkFNUSIgd2lkdGg9Ii0xLjAiIGhlaWdodD0iLTEuMCIvPgotICAgICAgICA8L2NvbnRhaW5lZD4KLSAgICAgICAgPGNvbnRhaW5lZCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpHcmFwaE5vZGUiIHhtaTppZD0iX0I5R19oVURSRWRxcmhzWmgzUU5BTVEiIGd1aWQ9Il9COUdfaFVEUkVkcXJoc1poM1FOQU1RIj4KLSAgICAgICAgICA8cG9zaXRpb24geG1pOmlkPSJfQjlHX2hrRFJFZHFyaHNaaDNRTkFNUSIgeD0iLTEuMCIgeT0iLTEuMCIvPgotICAgICAgICAgIDxzZW1hbnRpY01vZGVsIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlVNQVNlbWFudGljTW9kZWxCcmlkZ2UiIHhtaTppZD0iX0I5R19oMERSRWRxcmhzWmgzUU5BTVEiIGd1aWQ9Il9COUdfaDBEUkVkcXJoc1poM1FOQU1RIiBlbGVtZW50PSJfbDV5VUNVRFBFZHFyaHNaaDNRTkFNUSIvPgotICAgICAgICAgIDxzaXplIHhtaTppZD0iX0I5R19pRURSRWRxcmhzWmgzUU5BTVEiIHdpZHRoPSItMS4wIiBoZWlnaHQ9Ii0xLjAiLz4KLSAgICAgICAgPC9jb250YWluZWQ+Ci0gICAgICAgIDxjb250YWluZWQgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6R3JhcGhOb2RlIiB4bWk6aWQ9Il9COUdfaVVEUkVkcXJoc1poM1FOQU1RIiBndWlkPSJfQjlHX2lVRFJFZHFyaHNaaDNRTkFNUSI+Ci0gICAgICAgICAgPHBvc2l0aW9uIHhtaTppZD0iX0I5R19pa0RSRWRxcmhzWmgzUU5BTVEiIHg9Ii0xLjAiIHk9Ii0xLjAiLz4KLSAgICAgICAgICA8c2VtYW50aWNNb2RlbCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpVTUFTZW1hbnRpY01vZGVsQnJpZGdlIiB4bWk6aWQ9Il9COUdfaTBEUkVkcXJoc1poM1FOQU1RIiBndWlkPSJfQjlHX2kwRFJFZHFyaHNaaDNRTkFNUSIgZWxlbWVudD0iX2w1eVVDa0RQRWRxcmhzWmgzUU5BTVEiLz4KLSAgICAgICAgICA8c2l6ZSB4bWk6aWQ9Il9COUdfakVEUkVkcXJoc1poM1FOQU1RIiB3aWR0aD0iLTEuMCIgaGVpZ2h0PSItMS4wIi8+Ci0gICAgICAgIDwvY29udGFpbmVkPgotICAgICAgICA8Y29udGFpbmVkIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkdyYXBoTm9kZSIgeG1pOmlkPSJfQjlHX2prRFJFZHFyaHNaaDNRTkFNUSIgZ3VpZD0iX0I5R19qa0RSRWRxcmhzWmgzUU5BTVEiPgotICAgICAgICAgIDxwcm9wZXJ0eSB4bWk6aWQ9Il9COUdfajBEUkVkcXJoc1poM1FOQU1RIiBndWlkPSJfQjlHX2owRFJFZHFyaHNaaDNRTkFNUSIga2V5PSJ3cENvbXBvc2l0ZVR5cGUiIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgPHBvc2l0aW9uIHhtaTppZD0iX0I5R19rRURSRWRxcmhzWmgzUU5BTVEiIHg9IjEzMi4wIiB5PSIxLjAiLz4KLSAgICAgICAgICA8Y29udGFpbmVkIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkdyYXBoRWRnZSIgeG1pOmlkPSJfQjlHX21VRFJFZHFyaHNaaDNRTkFNUSIgZ3VpZD0iX0I5R19tVURSRWRxcmhzWmgzUU5BTVEiIGFuY2hvcj0iX0I5R19tRURSRWRxcmhzWmgzUU5BTVEiLz4KLSAgICAgICAgICA8YW5jaG9yYWdlIHhtaTppZD0iX0I5R19tRURSRWRxcmhzWmgzUU5BTVEiIGd1aWQ9Il9COUdfbUVEUkVkcXJoc1poM1FOQU1RIiBncmFwaEVkZ2U9Il9COUdfbVVEUkVkcXJoc1poM1FOQU1RIi8+Ci0gICAgICAgICAgPHNlbWFudGljTW9kZWwgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VU1BU2VtYW50aWNNb2RlbEJyaWRnZSIgeG1pOmlkPSJfQjlHX2tVRFJFZHFyaHNaaDNRTkFNUSIgZ3VpZD0iX0I5R19rVURSRWRxcmhzWmgzUU5BTVEiIGVsZW1lbnQ9Il9sNXlVQUVEUEVkcXJoc1poM1FOQU1RIi8+Ci0gICAgICAgICAgPHNpemUgeG1pOmlkPSJfQjlHX2trRFJFZHFyaHNaaDNRTkFNUSIgd2lkdGg9Ijk0LjAiIGhlaWdodD0iMjE1LjAiLz4KLSAgICAgICAgPC9jb250YWluZWQ+Ci0gICAgICAgIDxjb250YWluZWQgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6R3JhcGhOb2RlIiB4bWk6aWQ9Il9COUdfazBEUkVkcXJoc1poM1FOQU1RIiBndWlkPSJfQjlHX2swRFJFZHFyaHNaaDNRTkFNUSI+Ci0gICAgICAgICAgPHByb3BlcnR5IHhtaTppZD0iX0I5R19sRURSRWRxcmhzWmgzUU5BTVEiIGd1aWQ9Il9COUdfbEVEUkVkcXJoc1poM1FOQU1RIiBrZXk9IndwQ29tcG9zaXRlVHlwZSIgdmFsdWU9IjIiLz4KLSAgICAgICAgICA8cG9zaXRpb24geG1pOmlkPSJfQjlHX2xVRFJFZHFyaHNaaDNRTkFNUSIgeD0iMTM3LjAiIHk9IjMyMy4wIi8+Ci0gICAgICAgICAgPHNlbWFudGljTW9kZWwgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VU1BU2VtYW50aWNNb2RlbEJyaWRnZSIgeG1pOmlkPSJfQjlHX2xrRFJFZHFyaHNaaDNRTkFNUSIgZ3VpZD0iX0I5R19sa0RSRWRxcmhzWmgzUU5BTVEiIGVsZW1lbnQ9Il9sNXlVQUVEUEVkcXJoc1poM1FOQU1RIi8+Ci0gICAgICAgICAgPHNpemUgeG1pOmlkPSJfQjlHX2wwRFJFZHFyaHNaaDNRTkFNUSIgd2lkdGg9Ijg0LjAiIGhlaWdodD0iMTY2LjAiLz4KLSAgICAgICAgPC9jb250YWluZWQ+Ci0gICAgICAgIDxzZW1hbnRpY01vZGVsIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlVNQVNlbWFudGljTW9kZWxCcmlkZ2UiIHhtaTppZD0iX0I5R19qVURSRWRxcmhzWmgzUU5BTVEiIGd1aWQ9Il9COUdfalVEUkVkcXJoc1poM1FOQU1RIiBwcmVzZW50YXRpb249IkFjdGl2aXR5IERldGFpbCIgZWxlbWVudD0iX2RZR20wRURQRWRxcmhzWmgzUU5BTVEiLz4KLSAgICAgIDwvZGlhZ3JhbXM+Ci0gICAgPC9jaGlsZFBhY2thZ2VzPgotICAgIDxwcm9jZXNzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNhcGFiaWxpdHlQYXR0ZXJuIiB4bWk6aWQ9Il9adFpiTVVERkVkcU85TTNmdWtZQV9BIiBuYW1lPSJDUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cyIgZ3VpZD0iX1p0WmJNVURGRWRxTzlNM2Z1a1lBX0EiIGJyaWVmRGVzY3JpcHRpb249IkJyaWVmOiBDUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cyIgcHJlc2VudGF0aW9uTmFtZT0iQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMiIGJyZWFrZG93bkVsZW1lbnRzPSJfbERobDhFREZFZHFPOU0zZnVrWUFfQSBfZFlHbTBFRFBFZHFyaHNaaDNRTkFNUSI+Ci0gICAgICA8cHJlc2VudGF0aW9uIHhtaTppZD0iLWljTzZwSUhkWm05Vnh5Yy1KWjlVeXciIGhyZWY9InVtYTovLy1pY082cElIZFptOVZ4eWMtSlo5VXl3Iy1pY082cElIZFptOVZ4eWMtSlo5VXl3Ii8+Ci0gICAgICA8ZGVmYXVsdENvbnRleHQgaHJlZj0idW1hOi8vX3F6d3l3QS1QRWRxTDJPMVBKVjljWkEjX3JybUNJQkFkRWRxN0ZyY195TWhRLUEiLz4KLSAgICAgIDx2YWxpZENvbnRleHQgaHJlZj0idW1hOi8vX3F6d3l3QS1QRWRxTDJPMVBKVjljWkEjX3JybUNJQkFkRWRxN0ZyY195TWhRLUEiLz4KLSAgICA8L3Byb2Nlc3M+Ci0gIDwvb3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzQ29tcG9uZW50PgotPC94bWk6WE1JPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2NhcGFiaWxpdHlwYXR0ZXJucy9yZXNvdXJjZXMvRWRpdG9yTG9hZC5ydGYgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvY2FwYWJpbGl0eXBhdHRlcm5zL3Jlc291cmNlcy9FZGl0b3JMb2FkLnJ0ZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTc5YzEwNS4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvY2FwYWJpbGl0eXBhdHRlcm5zL3Jlc291cmNlcy9FZGl0b3JMb2FkLnJ0ZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9jYXBhYmlsaXR5cGF0dGVybnMvcmVzb3VyY2VzL2FwcGxpZWRpcy5naWYgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvY2FwYWJpbGl0eXBhdHRlcm5zL3Jlc291cmNlcy9hcHBsaWVkaXMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ODVmMWIwLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9jYXBhYmlsaXR5cGF0dGVybnMvcmVzb3VyY2VzL2FwcGxpZWRpcy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvY2FwYWJpbGl0eXBhdHRlcm5zL3Jlc291cmNlcy9idWxsZXQxLmdpZiBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9jYXBhYmlsaXR5cGF0dGVybnMvcmVzb3VyY2VzL2J1bGxldDEuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYzM4YzI0Li4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9jYXBhYmlsaXR5cGF0dGVybnMvcmVzb3VyY2VzL2J1bGxldDEuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2NhcGFiaWxpdHlwYXR0ZXJucy9yZXNvdXJjZXMvYnV0dG9ucy5qcGcgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvY2FwYWJpbGl0eXBhdHRlcm5zL3Jlc291cmNlcy9idXR0b25zLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzk0YjJkMi4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvY2FwYWJpbGl0eXBhdHRlcm5zL3Jlc291cmNlcy9idXR0b25zLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9jYXBhYmlsaXR5cGF0dGVybnMvcmVzb3VyY2VzL2hlbHBib29rLmdpZiBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9jYXBhYmlsaXR5cGF0dGVybnMvcmVzb3VyY2VzL2hlbHBib29rLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjAyZDYyZC4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvY2FwYWJpbGl0eXBhdHRlcm5zL3Jlc291cmNlcy9oZWxwYm9vay5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvY2FwYWJpbGl0eXBhdHRlcm5zL3Jlc291cmNlcy9uaV9nZXRTdGFydGVkLmdpZiBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9jYXBhYmlsaXR5cGF0dGVybnMvcmVzb3VyY2VzL25pX2dldFN0YXJ0ZWQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhN2Q4Y2EwLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9jYXBhYmlsaXR5cGF0dGVybnMvcmVzb3VyY2VzL25pX2dldFN0YXJ0ZWQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2NhcGFiaWxpdHlwYXR0ZXJucy9yZXNvdXJjZXMvcGFwZXJzLmh0bSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9jYXBhYmlsaXR5cGF0dGVybnMvcmVzb3VyY2VzL3BhcGVycy5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjZWQzZDIuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2NhcGFiaWxpdHlwYXR0ZXJucy9yZXNvdXJjZXMvcGFwZXJzLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDIzMSArMCwwIEBACi0gCi0gPGh0bWw+Ci0KLTxoZWFkPjxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04Ij4gPG1ldGEgbmFtZT0iZWxlbWVudF90eXBlIiBjb250ZW50PSJvdGhlciI+ICA8bWV0YSBuYW1lPSJmaWxldHlwZSIgY29udGVudD0iZGVzY3JpcHRpb24iPiAKLTx0aXRsZT5XaGl0ZSBQYXBlcnM8L3RpdGxlPgotPGxpbmsgcmVsPSJTdHlsZVNoZWV0IiBocmVmPSIuLi9yb3AuY3NzIiB0eXBlPSJ0ZXh0L2NzcyI+Ci0KLTxtZXRhIG5hbWU9IkdFTkVSQVRPUiIgY29udGVudD0iTWljcm9zb2Z0IEZyb250UGFnZSA0LjAiPgotPG1ldGEgbmFtZT0iUHJvZ0lkIiBjb250ZW50PSJGcm9udFBhZ2UuRWRpdG9yLkRvY3VtZW50Ij4KLTwvaGVhZD4KLQotPGJvZHk+Ci0KLSAKLTx0YWJsZSBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgd2lkdGg9IjEwMCUiPjx0cj48dGQgdmFsaWduPSJ0b3AiPgotCi08c2NyaXB0IGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij4KLTwhLS0KLQotLy9UZWxsIHRoZSBUcmVlUGF0aCB0byB1cGRhdGUgaXRzZWxmCi12YXIgdGhlUGF0aCA9ICIiOwotdmFyIHR5cGUgPSB0eXBlb2YgcGFyZW50Lm9yeV9idXR0b247Ci1pZiAodHlwZSAhPSAidW5kZWZpbmVkIikgewotCSB0eXBlID0gdHlwZW9mIHBhcmVudC5vcnlfYnV0dG9uLmdldFRyZWVQYXRoKCk7Ci0JIGlmICh0eXBlICE9ICJ1bmRlZmluZWQiKSB7Ci0JIAkgdGhlUGF0aCA9IHBhcmVudC5vcnlfYnV0dG9uLmdldFRyZWVQYXRoKCk7Ci0JIH0KLX0KLWRvY3VtZW50LndyaXRlKHRoZVBhdGgpOwotLS0+Ci08L3NjcmlwdD4KLQotIAotCi0KLQotPGgxIGNsYXNzPSJiYW5uZXIiPjxiPlJhdGlvbmFsIFVuaWZpZWQgUHJvY2VzczombmJzcDtXaGl0ZSBQYXBlcnM8L2I+PC9oMT4KLTxwIGNsYXNzPSJiYW5uZXIiPlRoZSBSVVAgaW5jbHVkZXMgYSBudW1iZXIgb2Ygd2hpdGUgcGFwZXJzLCBsaXN0ZWQgYmVsb3cuPC9wPgotPHVsPgotPGxpPjxhIGhyZWY9Ii4uL2NvbXBvbmVudHMvcGNfZGlzY2lwbGluZXMuaHRtIj5EaXNjaXBsaW5lczwvYT48dWw+Ci08bGk+PGEgaHJlZj0iYXBwcm11Yy5odG0iPkFwcGx5aW5nIFJlcXVpcmVtZW50cyBNYW5hZ2VtZW50IHdpdGggVXNlIENhc2VzPC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0idHJhY2VhYmlsaXR5Lmh0bSI+VHJhY2VhYmlsaXR5IFN0cmF0ZWdpZXMgZm9yIE1hbmFnaW5nIFJlcXVpcmVtZW50cyB3aXRoIFVzZSBDYXNlczwvYT48L2xpPgotPC91bD4KLTwvbGk+Ci08bGk+PGEgaHJlZj0iLi4vY29tcG9uZW50cy9wY19yZXF1aXJlbWVudHMuaHRtIj5SZXF1aXJlbWVudHM8L2E+PHVsPgotPGxpPjxhIGhyZWY9ImFwcHJtdWMuaHRtIj5BcHBseWluZyBSZXF1aXJlbWVudHMgTWFuYWdlbWVudCB3aXRoIFVzZSBDYXNlczwvYT48L2xpPgotPGxpPjxhIGhyZWY9InVzZWNhc2UuaHRtIj5UaGUgRXN0aW1hdGlvbiBvZiBFZmZvcnQgQmFzZWQgb24gVXNlIENhc2VzPC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0idHJhY2VhYmlsaXR5Lmh0bSI+VHJhY2VhYmlsaXR5IFN0cmF0ZWdpZXMgZm9yIE1hbmFnaW5nIFJlcXVpcmVtZW50cyB3aXRoIFVzZSBDYXNlczwvYT48L2xpPgotPGxpPjxhIGhyZWY9InRlbmVzcy5odG0iPlRoZSBUZW4gRXNzZW50aWFscyBvZiBSVVA8L2E+PC9saT4KLTwvdWw+Ci08L2xpPgotPGxpPjxhIGhyZWY9Ii4uL2NvbXBvbmVudHMvcGNfYXJjaGl0ZWN0dXJlLmh0bSI+QXJjaGl0ZWN0dXJlPC9hPjx1bD4KLTxsaT48YSBocmVmPSJsYXllcmluZ19zdHJhdGVnaWVzLmh0bSI+TGF5ZXJpbmcgU3RyYXRlZ2llczwvYT48L2xpPgotPC91bD4KLTwvbGk+Ci08bGk+PGEgaHJlZj0iLi4vY29tcG9uZW50cy9wY19kZXNpZ24uaHRtIj5EZXNpZ248L2E+PHVsPgotPGxpPjxhIGhyZWY9InhwcmVmYWN0Lmh0bSI+UlVQL1hQIEd1aWRlbGluZXM6IFRlc3QtZmlyc3QgRGVzaWduIGFuZCBSZWZhY3RvcmluZzwvYT48L2xpPgotPGxpPjxhIGhyZWY9InNpcy5odG0iPkRldmVsb3BpbmcgTGFyZ2UtU2NhbGUgU3lzdGVtcyB3aXRoIHRoZSBSYXRpb25hbCBVbmlmaWVkIFByb2Nlc3M8L2E+PC9saT4KLTwvdWw+Ci08L2xpPgotPGxpPjxhIGhyZWY9Ii4uL2NvbXBvbmVudHMvcGNfaW1wbGVtZW50YXRpb24uaHRtIj5JbXBsZW1lbnRhdGlvbjwvYT48dWw+Ci08bGk+PGEgaHJlZj0ieHByZWZhY3QuaHRtIj5SVVAvWFAgR3VpZGVsaW5lczogVGVzdC1maXJzdCBEZXNpZ24gYW5kIFJlZmFjdG9yaW5nPC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0ieHBwYWlyLmh0bSI+UlVQL1hQIEd1aWRlbGluZXM6IFBhaXIgUHJvZ3JhbW1pbmc8L2E+PC9saT4KLTwvdWw+Ci08L2xpPgotPGxpPjxhIGhyZWY9Ii4uL2NvbXBvbmVudHMvcGNfYXNzZXNzbWVudC5odG0iPkFzc2Vzc21lbnQ8L2E+PHVsPgotPGxpPjxhIGhyZWY9Ii4uL2NvbXBvbmVudHMvYXNzZXNzbWVudC9wY190ZXN0Lmh0bSI+VGVzdDwvYT48dWw+Ci08bGk+PGEgaHJlZj0icnRfdGVzdC5odG0iPlRlc3RpbmcgRW1iZWRkZWQgU3lzdGVtczwvYT48L2xpPgotPC91bD4KLTwvbGk+Ci08L3VsPgotPC9saT4KLTxsaT48YSBocmVmPSIuLi9jb21wb25lbnRzL3BjX21hbmFnZW1lbnQuaHRtIj5NYW5hZ2VtZW50PC9hPjx1bD4KLTxsaT48YSBocmVmPSIuLi9jb21wb25lbnRzL21hbmFnZW1lbnQvcGNfY2NtLmh0bSI+Q29uZmlndXJhdGlvbiAmIENoYW5nZSBNYW5hZ2VtZW50PC9hPjx1bD4KLTxsaT48YSBocmVmPSJjb250ZW50bWdtdC5odG0iPkNvbnRlbnQgTWFuYWdlbWVudCBVc2luZyB0aGUgUmF0aW9uYWwgVW5pZmllZCBQcm9jZXNzPC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0idGVuZXNzLmh0bSI+VGhlIFRlbiBFc3NlbnRpYWxzIG9mIFJVUDwvYT48L2xpPgotPC91bD4KLTwvbGk+Ci08bGk+PGEgaHJlZj0idGVuZXNzLmh0bSI+VGhlIFRlbiBFc3NlbnRpYWxzIG9mIFJVUDwvYT48L2xpPgotPGxpPjxhIGhyZWY9InRyYW5zd2ZhbGwuaHRtIj5Gcm9tIFdhdGVyZmFsbCB0byBJdGVyYXRpdmUgTGlmZWN5Y2xlPC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0idXNlY2FzZS5odG0iPlRoZSBFc3RpbWF0aW9uIG9mIEVmZm9ydCBCYXNlZCBvbiBVc2UgQ2FzZXM8L2E+PC9saT4KLTxsaT48YSBocmVmPSJydXB4cC5odG0iPkEgQ29tcGFyaXNvbiBvZiBSVVAgYW5kIFhQPC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0ic21wcm9qLmh0bSI+VXNpbmcgdGhlIFJVUCBmb3IgU21hbGwgUHJvamVjdHM6IEV4cGFuZGluZyB1cG9uIGVYdHJlbWUgUHJvZ3JhbW1pbmc8L2E+PC9saT4KLTxsaT48YSBocmVmPSJydXBjbW0uaHRtIj5SZWFjaGluZyBDTU0gTGV2ZWxzIDIgYW5kIDM8L2E+PC9saT4KLTxsaT48YSBocmVmPSJwcm9jZXNzX21hdHVyaXR5Lmh0bSI+QW4gRW5hYmxlciBmb3IgSGlnaGVyIFByb2Nlc3MgTWF0dXJpdHk8L2E+PC9saT4KLTxsaT48YSBocmVmPSJzaXMuaHRtIj5EZXZlbG9waW5nIExhcmdlLVNjYWxlIFN5c3RlbXMgd2l0aCB0aGUgUmF0aW9uYWwgVW5pZmllZCBQcm9jZXNzPC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0idmFyaWFudHMuaHRtIj5TeXN0ZW0gVmFyaWFudHM8L2E+PC9saT4KLTwvdWw+Ci08L2xpPgotPGxpPjxhIGhyZWY9Ii4uL2NvbXBvbmVudHMvcGNfdG9vbHMuaHRtIj5Ub29sczwvYT48dWw+Ci08bGk+PGEgaHJlZj0iLi4vdG9vbG1lbnQveGRlX2VjbGlwc2UvbW9kZWxfc3RydWN0dXJlX2d1aWRlbGluZXMuaHRtIj5Nb2RlbCBTdHJ1Y3R1cmUgR3VpZGVsaW5lcyBmb3IgUmF0aW9uYWwgWERFIERldmVsb3BlciAtIEphdmEgUGxhdGZvcm0gRWRpdGlvbjwvYT48L2xpPgotPGxpPjxhIGhyZWY9Ii4uL3Rvb2xtZW50L3hkZV92c25ldC9tb2RlbF9zdHJ1Y3R1cmVfZ3VpZGVsaW5lcy5odG0iPk1vZGVsIFN0cnVjdHVyZSBHdWlkZWxpbmVzIGZvciBSYXRpb25hbCBYREUgRGV2ZWxvcGVyIC0gLk5FVCBFZGl0aW9uPC9hPjwvbGk+Ci08L3VsPgotPC9saT4KLTwvdWw+Ci0KLTxwPklmIHlvdSBoYXZlIEludGVybmV0IGFjY2VzcywmbmJzcDsgc29tZSBvZiB0aGUgUlVQIHdoaXRlIHBhcGVycyBjYW4gYmUgZG93bmxvYWRlZCAKLSAgZnJvbSZuYnNwO3RoZSA8YSBocmVmPSJodHRwOi8vd3d3LTMwNi5pYm0uY29tL3NvZnR3YXJlL3JhdGlvbmFsL2luZm8vbGl0ZXJhdHVyZS93aGl0ZXBhcGVycy5qc3AiIHRhcmdldD0iX2JsYW5rIj5JQk0gV2ViIHNpdGUuPC9hPjwvcD4KLTxicj48YnI+Ci0KLSAKLTxkaXYgY2xhc3M9Im1hcmdpbnMyMCI+Ci08cD4KLSA8YSBocmVmPSIuLi9jb3B5cml0ZS9jb3B5cml0ZS5odG0iPgotIDxmb250IHNpemU9Ii0yIj4mY29weTsgQ29weXJpZ2h0IElCTSBDb3JwLiAxOTg3LCAyMDA0LiBBbGwgUmlnaHRzIFJlc2VydmVkLjwvZm9udD4KLSA8L2E+Ci08L3A+Ci08L2Rpdj4KLQotCi08L3RkPjx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjI0Ij48L3RkPjx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjElIj4KLTxwPgotPGEgaHJlZj0iLi4vaW5kZXguaHRtIj48L2E+Ci08L3A+Ci0KLTxzY3JpcHQgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPgotPCEtLQotCi1mdW5jdGlvbiBsb2FkVG9wKCkKLXsKLSAgaWYocGFyZW50LmZyYW1lcy5sZW5ndGghPTAgJiYgcGFyZW50LmZyYW1lc1sxXS5uYW1lPT0ib3J5X3RvYyIpCi0gIHsKLQkgdmFyIG1zZyA9ICJUaGUgUmF0aW9uYWwgVW5pZmllZCBQcm9jZXNzIGlzIGFscmVhZHkgZGlzcGxheWVkIHVzaW5nIGZyYW1lcyI7Ci0gICAgIGFsZXJ0KG1zZyk7Ci0gIH0KLSAgZWxzZQotICB7Ci0gICAgdmFyIGV4cGlyZXMgPSBuZXcgRGF0ZSgpOwotICAgIGV4cGlyZXMuc2V0VGltZSAoZXhwaXJlcy5nZXRUaW1lKCkgKyAoMTAwMCAqIDIwKSk7Ci0gICAgZG9jdW1lbnQuY29va2llID0gInJ1cF9vcnlfZG9jPSIgKyBlc2NhcGUgKGRvY3VtZW50LlVSTCkgKwotICAgICI7IGV4cGlyZXM9IiArIGV4cGlyZXMudG9VVENTdHJpbmcoKSArICAiOyBwYXRoPS8iOwotCi0gICAgdmFyIG5ld19vcnlfZG9jX2xvYyA9IG51bGw7Ci0KLSAgICBmb3IoaT1kb2N1bWVudC5saW5rcy5sZW5ndGgtMTtpPj0wO2ktLSkKLSAgICB7Ci0gICAgICAgaWYoZG9jdW1lbnQubGlua3NbaV0uaHJlZi5pbmRleE9mKCJpbmRleC5odG0iKSE9LTEpCi0gICAgICAgewotICAgICAgICAgbmV3X29yeV9kb2NfbG9jID0gZG9jdW1lbnQubGlua3NbaV0uaHJlZjsKLSAgICAgICAgIGJyZWFrOwotICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZihuZXdfb3J5X2RvY19sb2MhPW51bGwpCi0gICAgewotCWlmKCBzZWxmLm5hbWUgPT0gIm9yeV9kb2MiICkKLQl7Ci0JCXdpbmRvdy5jbG9zZSgpOwotCQl3aW5kb3cub3BlbiggbmV3X29yeV9kb2NfbG9jICk7CQkKLQl9Ci0JZWxzZQotCXsKLQkgICAgICAgCXRvcC5sb2NhdGlvbiA9IG5ld19vcnlfZG9jX2xvYzsKLQl9Ci0gICAgfQotICAgfQotfQotLy8gLS0+Ci08L3NjcmlwdD4KLTxzY3JpcHQgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPgotPCEtLQotICBmdW5jdGlvbiBnZXRJbWFnZVVybChpbWFnZSkKLSAgewotICAgIHZhciBuZXdfb3J5X2RvY19sb2M9bnVsbDsKLSAgICBmb3IoaT1kb2N1bWVudC5saW5rcy5sZW5ndGgtMTtpPj0wO2ktLSkKLSAgICB7Ci0gICAgICAgaWYoZG9jdW1lbnQubGlua3NbaV0uaHJlZi5pbmRleE9mKCJpbmRleC5odG0iKSE9LTEpCi0gICAgICAgewotICAgICAgICAgbmV3X29yeV9kb2NfbG9jID0gZG9jdW1lbnQubGlua3NbaV0uaHJlZi5zdWJzdHJpbmcoMCxkb2N1bWVudC5saW5rc1tpXS5ocmVmLmxhc3RJbmRleE9mKCIvIikpOwotICAgICAgICAgbmV3X29yeV9kb2NfbG9jID0gbmV3X29yeV9kb2NfbG9jICsgIiIgKyBpbWFnZTsKLSAgICAgICAgIHJldHVybiBuZXdfb3J5X2RvY19sb2M7Ci0gICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbnVsbDsKLSAgfQotLy8gLS0+Ci08L3NjcmlwdD4KLTxzY3JpcHQKLWxhbmd1YWdlPSJKYXZhU2NyaXB0Ij4KLTwhLS0KLU1TRlBob3ZlciA9Ci0oKChuYXZpZ2F0b3IuYXBwTmFtZSA9PSAiTmV0c2NhcGUiKSAmJgotICAocGFyc2VJbnQobmF2aWdhdG9yLmFwcFZlcnNpb24pID49IDMgKSkgfHwKLSAgKChuYXZpZ2F0b3IuYXBwTmFtZSA9PSAiTWljcm9zb2Z0IEludGVybmV0IEV4cGxvcmVyIikgJiYKLSAgKHBhcnNlSW50KG5hdmlnYXRvci5hcHBWZXJzaW9uKSA+PSA0ICkpKTsKLQotICBmdW5jdGlvbiBNU0ZQcHJlbG9hZChpbWcpCi0gIHsKLSAgICAgdmFyIGE9bmV3IEltYWdlKCk7Ci0gICAgIGEuc3JjPWltZzsKLSAgICAgcmV0dXJuIGE7Ci0gIH0KLS8vIC0tPgotPC9zY3JpcHQ+Ci08c2NyaXB0IGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij4KLTwhLS0KLSAgICBpZihNU0ZQaG92ZXIpCi0gICAgewotICAgICAgICBSdXBHcmF5PU1TRlBwcmVsb2FkKGdldEltYWdlVXJsKCcvaW1hZ2VzL3J1cDEuZ2lmJykpOwotICAgICAgICBSdXBCbHVlPU1TRlBwcmVsb2FkKGdldEltYWdlVXJsKCcvaW1hZ2VzL3J1cDFfYS5naWYnKSk7Ci0gICAgfQotLy8gLS0+Ci0KLS8vZGlzcGxheSB0aGUgbG9hZCBidXR0b24gb3Igbm90Ci12YXIgb3J5X3RvY19leGlzdCA9IHR5cGVvZiBwYXJlbnQub3J5X3RvYzsKLWlmIChvcnlfdG9jX2V4aXN0ID09ICJ1bmRlZmluZWQiKSB7Ci0JLy8gc3BsaXQgYWx0IHRleHQgb3V0IHRvIGFsbG93IHRyYW5zbGF0aW9uCi0JdmFyIGFsdFRleHQgPSAiRGlzcGxheSBSYXRpb25hbCBVbmlmaWVkIFByb2Nlc3MgdXNpbmcgZnJhbWVzIjsKLQlkb2N1bWVudC53cml0ZSgiPGEgaHJlZj1cIkphdmFTY3JpcHQ6bG9hZFRvcCgpO1wiIG9ubW91c2VvdmVyPVwiaWYoTVNGUGhvdmVyKSBkb2N1bWVudFsnSG9tZSddLnNyYz1SdXBCbHVlLnNyYzsgc2VsZi5zdGF0dXM9JyAnOyByZXR1cm4gdHJ1ZVwiIG9ubW91c2VvdXQ9XCJpZihNU0ZQaG92ZXIpIGRvY3VtZW50WydIb21lJ10uc3JjPVJ1cEdyYXkuc3JjOyBzZWxmLnN0YXR1cz0gJyAnO3JldHVybiB0cnVlXCI+IDxicj4gPGltZyBzcmM9XCIuLi9pbWFnZXMvcnVwMS5naWYiKTsKLQlkb2N1bWVudC53cml0ZSgiXCIgIGJvcmRlcj1cIjBcIiBhbHQ9XCIiKTsKLSAgICAgICAgZG9jdW1lbnQud3JpdGUoYWx0VGV4dCk7Ci0gICAgICAgIGRvY3VtZW50LndyaXRlKCJcIiBuYW1lPVwiSG9tZVwiIHdpZHRoPVwiMjZcIiBoZWlnaHQ9XCIxNjdcIj48L2E+Iik7Ci0KLX0KLWVsc2UgewotCXZhciBuYnNwID0gIiZuYnNwOyI7Ci0JZG9jdW1lbnQud3JpdGUobmJzcCk7Ci19Ci08L3NjcmlwdD4KLQotPC90ZD48L3RyPjwvdGFibGU+PHRhYmxlIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiB3aWR0aD0iMTAwJSI+PHRyPjx0ZD4KLTxwIGFsaWduPSJyaWdodCI+PHNtYWxsPjxzbWFsbD5SYXRpb25hbCBVbmlmaWVkIFByb2Nlc3MmbmJzcDsmbmJzcDsgCi08aW1nIGJvcmRlcj0iMCIgYWx0PSIyMDAzLjA2LjE1IiBzcmM9Ii4uL2ltYWdlcy9ydXB2ZXJzaW9uLmdpZiI+Ci08L3NtYWxsPjwvc21hbGw+Ci08L3RkPjwvdHI+PC90YWJsZT4KLQotIAotCi08L2JvZHk+Ci0KLTwvaHRtbD4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9jYXBhYmlsaXR5cGF0dGVybnMvcmVzb3VyY2VzL3J1cC5qcGcgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvY2FwYWJpbGl0eXBhdHRlcm5zL3Jlc291cmNlcy9ydXAuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NDdmNTM2Li4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9jYXBhYmlsaXR5cGF0dGVybnMvcmVzb3VyY2VzL3J1cC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvY2FwYWJpbGl0eXBhdHRlcm5zL3Jlc291cmNlcy9ydXAxX2EuZ2lmIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2NhcGFiaWxpdHlwYXR0ZXJucy9yZXNvdXJjZXMvcnVwMV9hLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmE5NjM4ZC4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvY2FwYWJpbGl0eXBhdHRlcm5zL3Jlc291cmNlcy9ydXAxX2EuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2NhcGFiaWxpdHlwYXR0ZXJucy9yZXNvdXJjZXMvcnVwX3BsYXRmb3JtLmpwZyBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9jYXBhYmlsaXR5cGF0dGVybnMvcmVzb3VyY2VzL3J1cF9wbGF0Zm9ybS5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmMGM3ODAuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2NhcGFiaWxpdHlwYXR0ZXJucy9yZXNvdXJjZXMvcnVwX3BsYXRmb3JtLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9jYXBhYmlsaXR5cGF0dGVybnMvcmVzb3VyY2VzL3N5bmNlZC5naWYgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvY2FwYWJpbGl0eXBhdHRlcm5zL3Jlc291cmNlcy9zeW5jZWQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NzA5MzRiLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9jYXBhYmlsaXR5cGF0dGVybnMvcmVzb3VyY2VzL3N5bmNlZC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvY3VzdG9tY2F0ZWdvcmllcy9jdXN0b21fY2F0ZWdvcnlfQTEueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2N1c3RvbWNhdGVnb3JpZXMvY3VzdG9tX2NhdGVnb3J5X0ExLnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjIxMmFiMy4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvY3VzdG9tY2F0ZWdvcmllcy9jdXN0b21fY2F0ZWdvcnlfQTEueG1pCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPG9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudERlc2NyaXB0aW9uIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6ZXBmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZiIgZXBmOnZlcnNpb249IjEuMi4wIiB4bWk6aWQ9Ii01UlRLMUdPZkJtMmNjT2puMWluZnN3IiBuYW1lPSJjdXN0b21fY2F0ZWdvcnlfQTEsX01LUG5rQS1XRWRxTDJPMVBKVjljWkEiIGd1aWQ9Ii01UlRLMUdPZkJtMmNjT2puMWluZnN3IiBjaGFuZ2VEYXRlPSIyMDA1LTA4LTE4VDE3OjUzOjE1LjgyOC0wNzAwIj4KLSAgPG1haW5EZXNjcmlwdGlvbj5DdXN0b20gQ2F0ZWdvcnkgQTEgbWFpbjwvbWFpbkRlc2NyaXB0aW9uPgotICA8a2V5Q29uc2lkZXJhdGlvbnM+Q3VzdG9tIENhdGVnb3J5IEExIGtleTwva2V5Q29uc2lkZXJhdGlvbnM+Ci08L29yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2N1c3RvbWNhdGVnb3JpZXMvY3VzdG9tX2NhdGVnb3J5X0EyLnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9jdXN0b21jYXRlZ29yaWVzL2N1c3RvbV9jYXRlZ29yeV9BMi54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1MjMzMDEuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2N1c3RvbWNhdGVnb3JpZXMvY3VzdG9tX2NhdGVnb3J5X0EyLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnREZXNjcmlwdGlvbiB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCIgeG1pOmlkPSItVnBoejY1WjFCOS1ySU1KS2pYN2gwQSIgbmFtZT0iY3VzdG9tX2NhdGVnb3J5X0EyLF9PU1NTSUEtV0VkcUwyTzFQSlY5Y1pBIiBndWlkPSItVnBoejY1WjFCOS1ySU1KS2pYN2gwQSIgY2hhbmdlRGF0ZT0iMjAwNS0wOC0xOFQxODowMjowNy4xNzItMDcwMCI+Ci0gIDxtYWluRGVzY3JpcHRpb24+Q3VzdG9tIENhdGVnb3J5IEEyIG1haW48L21haW5EZXNjcmlwdGlvbj4KLSAgPGtleUNvbnNpZGVyYXRpb25zPkN1c3RvbSBDYXRlZ29yeSBBMiBrZXk8L2tleUNvbnNpZGVyYXRpb25zPgotPC9vcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnREZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9jdXN0b21jYXRlZ29yaWVzL3N1Yl9jdXN0b21fY2F0ZWdvcnlfQTEuMS54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvY3VzdG9tY2F0ZWdvcmllcy9zdWJfY3VzdG9tX2NhdGVnb3J5X0ExLjEueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNGQ1MWEyLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9jdXN0b21jYXRlZ29yaWVzL3N1Yl9jdXN0b21fY2F0ZWdvcnlfQTEuMS54bWkKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08b3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50RGVzY3JpcHRpb24geG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiIHhtaTppZD0iLWpxU3JiRlpZOUdiNGpwRGlZU1pjRlEiIG5hbWU9InN1Yl9jdXN0b21fY2F0ZWdvcnlfQTEuMSxfN2RYWVVCQktFZHFCczdLaGRWTFJMQSIgZ3VpZD0iLWpxU3JiRlpZOUdiNGpwRGlZU1pjRlEiIGNoYW5nZURhdGU9IjIwMDUtMDgtMThUMTg6MDE6MjYuODI4LTA3MDAiPgotICA8bWFpbkRlc2NyaXB0aW9uPlN1Yi1DdXN0b20gQ2F0ZWdvcnkgQTEuMSBtYWluPC9tYWluRGVzY3JpcHRpb24+Ci0gIDxrZXlDb25zaWRlcmF0aW9ucz5TdWItQ3VzdG9tIENhdGVnb3J5IEExLjEga2V5PC9rZXlDb25zaWRlcmF0aW9ucz4KLTwvb3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvZGVsaXZlcnlwcm9jZXNzZXMvZGVsUHJvY1Bha19BMS4xL2NvbnRlbnQueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2RlbGl2ZXJ5cHJvY2Vzc2VzL2RlbFByb2NQYWtfQTEuMS9jb250ZW50LnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjFlZWJiOC4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvZGVsaXZlcnlwcm9jZXNzZXMvZGVsUHJvY1Bha19BMS4xL2NvbnRlbnQueG1pCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxvcmcuZWNsaXBzZS5lcGYudW1hOkRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6ZXBmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZiIgZXBmOnZlcnNpb249IjEuMi4wIiB4bWk6aWQ9Ii02M3VzZ1FXRmpWX2dIbVFZTTNSVXl3IiBuYW1lPSJkZWxQcm9jUGFrX0ExLjEsX3VxNUs4Uk0xRWRxcW5kaS1nRHV4cHciIGd1aWQ9Ii02M3VzZ1FXRmpWX2dIbVFZTTNSVXl3Ij4KLSAgPG1haW5EZXNjcmlwdGlvbj5EZWxQcm9jUGFrIEExLjEgbWFpbjwvbWFpbkRlc2NyaXB0aW9uPgotICA8a2V5Q29uc2lkZXJhdGlvbnM+RGVsUHJvY1BhayBBMS4xIGtleTwva2V5Q29uc2lkZXJhdGlvbnM+Ci0gIDxwdXJwb3NlPkRlbFByb2NQYWsgQTEuMSBwb3Jwb2lzZTwvcHVycG9zZT4KLSAgPGFsdGVybmF0aXZlcz5EZWxQcm9jUGFrIEExLjEgYWx0PC9hbHRlcm5hdGl2ZXM+Ci0gIDxob3d0b1N0YWZmPkRlbFByb2NQYWsgQTEuMSBzdGFmZjwvaG93dG9TdGFmZj4KLSAgPGV4dGVybmFsSWQ+RGVsUHJvY1BhayBBMS4xIGV4dGVybklEPC9leHRlcm5hbElkPgotICA8c2NvcGU+RGVsUHJvY1BhayBBMS4xIHNjb3BlPC9zY29wZT4KLSAgPHVzYWdlTm90ZXM+RGVsUHJvY1BhayBBMS4xIHVzYWdlPC91c2FnZU5vdGVzPgotICA8c2NhbGU+RGVsUHJvY1BhayBBMS4xIHNjYWxlPC9zY2FsZT4KLSAgPHByb2plY3RDaGFyYWN0ZXJpc3RpY3M+RGVsUHJvY1BhayBBMS4xIGNoYXI8L3Byb2plY3RDaGFyYWN0ZXJpc3RpY3M+Ci0gIDxyaXNrTGV2ZWw+RGVsUHJvY1BhayBBMS4xIHJpc2s8L3Jpc2tMZXZlbD4KLSAgPGVzdGltYXRpbmdUZWNobmlxdWU+RGVsUHJvY1BhayBBMS4xJmFtcDtuYnNwO2VzdGltYXRpbmcgdGVjaCZsdDshLS1TdGFydEZyYWdtZW50LS0mZ3Q7Jmx0OyEtLUVuZEZyYWdtZW50LS0mZ3Q7PC9lc3RpbWF0aW5nVGVjaG5pcXVlPgotICA8cHJvamVjdE1lbWJlckV4cGVydGlzZT5EZWxQcm9jUGFrIEExLjEgZXhwZXJ0aXNlPC9wcm9qZWN0TWVtYmVyRXhwZXJ0aXNlPgotICA8dHlwZU9mQ29udHJhY3Q+RGVsUHJvY1BhayBBMS4xJmFtcDtuYnNwO2NvbnRyYWN0PC90eXBlT2ZDb250cmFjdD4KLTwvb3JnLmVjbGlwc2UuZXBmLnVtYTpEZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9kZWxpdmVyeXByb2Nlc3Nlcy9kZWxQcm9jUGFrX0ExLjEvbW9kZWwueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2RlbGl2ZXJ5cHJvY2Vzc2VzL2RlbFByb2NQYWtfQTEuMS9tb2RlbC54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4MjIyOTEuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2RlbGl2ZXJ5cHJvY2Vzc2VzL2RlbFByb2NQYWtfQTEuMS9tb2RlbC54bWkKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHhtaTpYTUkgeG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hLnJlc291cmNlbWFuYWdlcj0iaHR0cDovLy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Jlc291cmNlbWFuYWdlci5lY29yZSIgeG1sbnM6ZXBmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZiIgZXBmOnZlcnNpb249IjEuMi4wIj4KLSAgPG9yZy5lY2xpcHNlLmVwZi51bWEucmVzb3VyY2VtYW5hZ2VyOlJlc291cmNlTWFuYWdlciB4bWk6aWQ9Il91dW4wWUJNMUVkcXFuZGktZ0R1eHB3IiBndWlkPSJfdXVuMFlCTTFFZHFxbmRpLWdEdXhwdyI+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfdXVuMFlSTTFFZHFxbmRpLWdEdXhwdyIgaWQ9Ii02M3VzZ1FXRmpWX2dIbVFZTTNSVXl3IiB1cmk9ImNvbnRlbnQueG1pIi8+Ci0gIDwvb3JnLmVjbGlwc2UuZXBmLnVtYS5yZXNvdXJjZW1hbmFnZXI6UmVzb3VyY2VNYW5hZ2VyPgotICA8b3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzQ29tcG9uZW50IHhtaTppZD0iX3VxNUs4Qk0xRWRxcW5kaS1nRHV4cHciIG5hbWU9ImRlbFByb2NQYWtfQTEuMSIgZ3VpZD0iX3VxNUs4Qk0xRWRxcW5kaS1nRHV4cHciPgotICAgIDxwcm9jZXNzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkRlbGl2ZXJ5UHJvY2VzcyIgeG1pOmlkPSJfdXE1SzhSTTFFZHFxbmRpLWdEdXhwdyIgbmFtZT0iZGVsUHJvY1Bha19BMS4xIiBndWlkPSJfdXE1SzhSTTFFZHFxbmRpLWdEdXhwdyIgYnJpZWZEZXNjcmlwdGlvbj0iRGVsUHJvY1BhayBBMS4xIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJEZWxQcm9jUGFrIEExLjEgcHJlc2VudCI+Ci0gICAgICA8cHJlc2VudGF0aW9uIHhtaTppZD0iLTYzdXNnUVdGalZfZ0htUVlNM1JVeXciIGhyZWY9InVtYTovLy02M3VzZ1FXRmpWX2dIbVFZTTNSVXl3Iy02M3VzZ1FXRmpWX2dIbVFZTTNSVXl3Ii8+Ci0gICAgICA8ZGVmYXVsdENvbnRleHQgaHJlZj0idW1hOi8vX3F6d3l3QS1QRWRxTDJPMVBKVjljWkEjX3JybUNJQkFkRWRxN0ZyY195TWhRLUEiLz4KLSAgICAgIDx2YWxpZENvbnRleHQgaHJlZj0idW1hOi8vX3F6d3l3QS1QRWRxTDJPMVBKVjljWkEjX3JybUNJQkFkRWRxN0ZyY195TWhRLUEiLz4KLSAgICA8L3Byb2Nlc3M+Ci0gIDwvb3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzQ29tcG9uZW50PgotPC94bWk6WE1JPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2RlbGl2ZXJ5cHJvY2Vzc2VzL2RlbFByb2NfQTEvY29udGVudC54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvZGVsaXZlcnlwcm9jZXNzZXMvZGVsUHJvY19BMS9jb250ZW50LnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTY5MDdjNy4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvZGVsaXZlcnlwcm9jZXNzZXMvZGVsUHJvY19BMS9jb250ZW50LnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08b3JnLmVjbGlwc2UuZXBmLnVtYTpEZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbiB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCIgeG1pOmlkPSItVThfTEd2TVNvZi1kYjI0YUZBTWI2dyIgbmFtZT0iRGVsUHJvYyBBMSxfVzZhNGNSQk5FZHFCczdLaGRWTFJMQSIgZ3VpZD0iLVU4X0xHdk1Tb2YtZGIyNGFGQU1iNnciPgotICA8bWFpbkRlc2NyaXB0aW9uPkRlbFByb2MgQTEgbWFpbjwvbWFpbkRlc2NyaXB0aW9uPgotICA8a2V5Q29uc2lkZXJhdGlvbnM+RGVsUHJvYyBBMSBrZXkgY29uPC9rZXlDb25zaWRlcmF0aW9ucz4KLSAgPHB1cnBvc2U+RGVsUHJvYyBBMSBwb3Jwb2lzZTwvcHVycG9zZT4KLSAgPGFsdGVybmF0aXZlcz5EZWxQcm9jIEExIGFsdGVybjwvYWx0ZXJuYXRpdmVzPgotICA8aG93dG9TdGFmZj5EZWxQcm9jIEExIHN0YWZmPC9ob3d0b1N0YWZmPgotICA8ZXh0ZXJuYWxJZD5EZWxQcm9jIEExIGV4dGVybklEPC9leHRlcm5hbElkPgotICA8c2NvcGU+RGVsUHJvYyBBMSBzY29wZTwvc2NvcGU+Ci0gIDx1c2FnZU5vdGVzPkRlbFByb2MgQTEgdXNhZ2U8L3VzYWdlTm90ZXM+Ci0gIDxzY2FsZT5EZWxQcm9jIEExIHNjYWxlPC9zY2FsZT4KLSAgPHByb2plY3RDaGFyYWN0ZXJpc3RpY3M+RGVsUHJvYyBBMSBwcm9qIGNoYXI8L3Byb2plY3RDaGFyYWN0ZXJpc3RpY3M+Ci0gIDxyaXNrTGV2ZWw+RGVsUHJvYyBBMSByaXNrPC9yaXNrTGV2ZWw+Ci0gIDxlc3RpbWF0aW5nVGVjaG5pcXVlPkRlbFByb2MgQTEgZXN0IHRlY2g8L2VzdGltYXRpbmdUZWNobmlxdWU+Ci0gIDxwcm9qZWN0TWVtYmVyRXhwZXJ0aXNlPkRlbFByb2MgQTEgZXhwZXJ0aXNlPC9wcm9qZWN0TWVtYmVyRXhwZXJ0aXNlPgotICA8dHlwZU9mQ29udHJhY3Q+RGVsUHJvYyBBMSBjb250eXBlPC90eXBlT2ZDb250cmFjdD4KLTwvb3JnLmVjbGlwc2UuZXBmLnVtYTpEZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9kZWxpdmVyeXByb2Nlc3Nlcy9kZWxQcm9jX0ExL21vZGVsLnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9kZWxpdmVyeXByb2Nlc3Nlcy9kZWxQcm9jX0ExL21vZGVsLnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzg4ZjFlYS4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvZGVsaXZlcnlwcm9jZXNzZXMvZGVsUHJvY19BMS9tb2RlbC54bWkKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHhtaTpYTUkgeG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hLnJlc291cmNlbWFuYWdlcj0iaHR0cDovLy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Jlc291cmNlbWFuYWdlci5lY29yZSIgeG1sbnM6ZXBmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZiIgZXBmOnZlcnNpb249IjEuMi4wIj4KLSAgPG9yZy5lY2xpcHNlLmVwZi51bWEucmVzb3VyY2VtYW5hZ2VyOlJlc291cmNlTWFuYWdlciB4bWk6aWQ9Il9YVlk5TUJCTkVkcUJzN0toZFZMUkxBIiBndWlkPSJfWFZZOU1CQk5FZHFCczdLaGRWTFJMQSI+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfWFZpdU1CQk5FZHFCczdLaGRWTFJMQSIgaWQ9Ii1VOF9MR3ZNU29mLWRiMjRhRkFNYjZ3IiB1cmk9ImNvbnRlbnQueG1pIi8+Ci0gIDwvb3JnLmVjbGlwc2UuZXBmLnVtYS5yZXNvdXJjZW1hbmFnZXI6UmVzb3VyY2VNYW5hZ2VyPgotICA8b3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzQ29tcG9uZW50IHhtaTppZD0iX1c2YTRjQkJORWRxQnM3S2hkVkxSTEEiIG5hbWU9ImRlbFByb2NfQTEiIGd1aWQ9Il9XNmE0Y0JCTkVkcUJzN0toZFZMUkxBIj4KLSAgICA8cHJvY2VzcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpEZWxpdmVyeVByb2Nlc3MiIHhtaTppZD0iX1c2YTRjUkJORWRxQnM3S2hkVkxSTEEiIG5hbWU9ImRlbFByb2NfQTEiIGd1aWQ9Il9XNmE0Y1JCTkVkcUJzN0toZFZMUkxBIiBicmllZkRlc2NyaXB0aW9uPSJEZWxQcm9jIEExIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJEZWxQcm9jIEExIHByZXNlbnQiPgotICAgICAgPHByZXNlbnRhdGlvbiB4bWk6aWQ9Ii1VOF9MR3ZNU29mLWRiMjRhRkFNYjZ3IiBocmVmPSJ1bWE6Ly8tVThfTEd2TVNvZi1kYjI0YUZBTWI2dyMtVThfTEd2TVNvZi1kYjI0YUZBTWI2dyIvPgotICAgICAgPGRlZmF1bHRDb250ZXh0IGhyZWY9InVtYTovL19xend5d0EtUEVkcUwyTzFQSlY5Y1pBI19ycm1DSUJBZEVkcTdGcmNfeU1oUS1BIi8+Ci0gICAgICA8dmFsaWRDb250ZXh0IGhyZWY9InVtYTovL19xend5d0EtUEVkcUwyTzFQSlY5Y1pBI19ycm1DSUJBZEVkcTdGcmNfeU1oUS1BIi8+Ci0gICAgPC9wcm9jZXNzPgotICA8L29yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc0NvbXBvbmVudD4KLTwveG1pOlhNST4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9kaXNjaXBsaW5lZ3JvdXBpbmdzL2Rpc2NpcGxpbmVfZ3JvdXBpbmdfQTEueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2Rpc2NpcGxpbmVncm91cGluZ3MvZGlzY2lwbGluZV9ncm91cGluZ19BMS54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhMTBiNzkuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2Rpc2NpcGxpbmVncm91cGluZ3MvZGlzY2lwbGluZV9ncm91cGluZ19BMS54bWkKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08b3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50RGVzY3JpcHRpb24geG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiIHhtaTppZD0iLW11QWtYREpmb19LYlJGNEtPYm45T1EiIG5hbWU9ImRpc2NpcGxpbmVfZ3JvdXBpbmdfQTEsX0NDVmpjQS1XRWRxTDJPMVBKVjljWkEiIGd1aWQ9Ii1tdUFrWERKZm9fS2JSRjRLT2JuOU9RIiBjaGFuZ2VEYXRlPSIyMDA1LTA4LTE4VDE3OjQyOjM3Ljc4MS0wNzAwIj4KLSAgPG1haW5EZXNjcmlwdGlvbj5EaXNjaXBsaW5lIEdyb3VwaW5nIEExIG1haW48L21haW5EZXNjcmlwdGlvbj4KLSAgPGtleUNvbnNpZGVyYXRpb25zPkRpc2NpcGxpbmUgR3JvdXBpbmcgQTEga2V5PC9rZXlDb25zaWRlcmF0aW9ucz4KLTwvb3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvZGlzY2lwbGluZXMvZGlzY2lwbGluZV9BMS54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvZGlzY2lwbGluZXMvZGlzY2lwbGluZV9BMS54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkM2ZjZWEuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2Rpc2NpcGxpbmVzL2Rpc2NpcGxpbmVfQTEueG1pCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPG9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudERlc2NyaXB0aW9uIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6ZXBmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZiIgZXBmOnZlcnNpb249IjEuMi4wIiB4bWk6aWQ9Ii1HYUdsNWtISjR4S0NfU2hnNloxNlpnIiBuYW1lPSJkaXNjaXBsaW5lX0ExLF9DNWRfd0EtV0VkcUwyTzFQSlY5Y1pBIiBndWlkPSItR2FHbDVrSEo0eEtDX1NoZzZaMTZaZyIgY2hhbmdlRGF0ZT0iMjAwNS0wOC0yMlQxMDo0NTowMi45NjktMDcwMCI+Ci0gIDxtYWluRGVzY3JpcHRpb24+RGlzY2lwbGluZSBBMSBtYWluPC9tYWluRGVzY3JpcHRpb24+Ci0gIDxrZXlDb25zaWRlcmF0aW9ucz5EaXNjaXBsaW5lIEExIGtleTwva2V5Q29uc2lkZXJhdGlvbnM+Ci08L29yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2Rpc2NpcGxpbmVzL2Rpc2NpcGxpbmVfQTIueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2Rpc2NpcGxpbmVzL2Rpc2NpcGxpbmVfQTIueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOWI0NThhLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9kaXNjaXBsaW5lcy9kaXNjaXBsaW5lX0EyLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnREZXNjcmlwdGlvbiB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCIgeG1pOmlkPSItUTBsaWE1eUV5TlhXZC1LTko2Y0dyQSIgbmFtZT0iZGlzY2lwbGluZV9BMixfRHp2UG9BLVdFZHFMMk8xUEpWOWNaQSIgZ3VpZD0iLVEwbGlhNXlFeU5YV2QtS05KNmNHckEiIGNoYW5nZURhdGU9IjIwMDUtMDgtMThUMTc6NDQ6MTQuNzM0LTA3MDAiPgotICA8bWFpbkRlc2NyaXB0aW9uPkRpc2NpcGxpbmUgQTIgbWFpbjwvbWFpbkRlc2NyaXB0aW9uPgotICA8a2V5Q29uc2lkZXJhdGlvbnM+RGlzY2lwbGluZSBBMiBrZXk8L2tleUNvbnNpZGVyYXRpb25zPgotPC9vcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnREZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9kb21haW5zL2RvbWFpbl9BMS54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvZG9tYWlucy9kb21haW5fQTEueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOWY1Zjg1Li4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9kb21haW5zL2RvbWFpbl9BMS54bWkKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08b3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50RGVzY3JpcHRpb24geG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiIHhtaTppZD0iLU8xM1V1SmI4R3FCTFZ0V2FVcWdxUnciIG5hbWU9ImRvbWFpbl9BMSxfRkV6TzRBLVdFZHFMMk8xUEpWOWNaQSIgZ3VpZD0iLU8xM1V1SmI4R3FCTFZ0V2FVcWdxUnciIGNoYW5nZURhdGU9IjIwMDUtMDktMDZUMTk6MTU6MzUuMDMxLTA3MDAiPgotICA8bWFpbkRlc2NyaXB0aW9uPiZsdDtwJmd0OwotICAgIERvbWFpbiBBMSBtYWluCi0mbHQ7L3AmZ3Q7PC9tYWluRGVzY3JpcHRpb24+Ci0gIDxrZXlDb25zaWRlcmF0aW9ucz5Eb21haW4gQTEga2V5PC9rZXlDb25zaWRlcmF0aW9ucz4KLTwvb3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvZG9tYWlucy9kb21haW5fQTIueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2RvbWFpbnMvZG9tYWluX0EyLnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTU1NTZiNS4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvZG9tYWlucy9kb21haW5fQTIueG1pCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPG9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudERlc2NyaXB0aW9uIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6ZXBmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZiIgZXBmOnZlcnNpb249IjEuMi4wIiB4bWk6aWQ9Ii0zaFlKeXIzVHFpTWc2UWR5OUFYSXh3IiBuYW1lPSJkb21haW5fQTIsX0ZxV0w4QS1XRWRxTDJPMVBKVjljWkEiIGd1aWQ9Ii0zaFlKeXIzVHFpTWc2UWR5OUFYSXh3IiBjaGFuZ2VEYXRlPSIyMDA1LTA4LTE4VDE3OjQ3OjI4Ljc2Ni0wNzAwIj4KLSAgPG1haW5EZXNjcmlwdGlvbj5Eb21haW4gQTIgbWFpbjwvbWFpbkRlc2NyaXB0aW9uPgotICA8a2V5Q29uc2lkZXJhdGlvbnM+RG9tYWluIEEyIGtleTwva2V5Q29uc2lkZXJhdGlvbnM+Ci08L29yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2RvbWFpbnMvc3ViX2RvbWFpbl9BMS4xLnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9kb21haW5zL3N1Yl9kb21haW5fQTEuMS54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmYmNhMGEuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2RvbWFpbnMvc3ViX2RvbWFpbl9BMS4xLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnREZXNjcmlwdGlvbiB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCIgeG1pOmlkPSItS0Q3MkVvNWxNTVBwN2JTOG9QQnZQdyIgbmFtZT0ic3ViX2RvbWFpbl9BMS4xLF9HT1o3UUEtV0VkcUwyTzFQSlY5Y1pBIiBndWlkPSItS0Q3MkVvNWxNTVBwN2JTOG9QQnZQdyIgY2hhbmdlRGF0ZT0iMjAwNS0wOC0xOFQxNzo0Njo1My45MjItMDcwMCI+Ci0gIDxtYWluRGVzY3JpcHRpb24+U3ViLURvbWFpbiBBMS4xIG1haW48L21haW5EZXNjcmlwdGlvbj4KLSAgPGtleUNvbnNpZGVyYXRpb25zPlN1Yi1Eb21haW4gQTEuMSBrZXk8L2tleUNvbnNpZGVyYXRpb25zPgotPC9vcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnREZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9ndWlkYW5jZXMvY2hlY2tsaXN0cy9jaGVja2xpc3RfQTEueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2d1aWRhbmNlcy9jaGVja2xpc3RzL2NoZWNrbGlzdF9BMS54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxZmI2YzkuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2d1aWRhbmNlcy9jaGVja2xpc3RzL2NoZWNrbGlzdF9BMS54bWkKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08b3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50RGVzY3JpcHRpb24geG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiIHhtaTppZD0iLW9XbzNVQ2lmWDRJY19WQklDV3dxUnciIG5hbWU9ImNoZWNrbGlzdF9BMSxfS1Y0cTBBLVNFZHFMMk8xUEpWOWNaQSIgZ3VpZD0iLW9XbzNVQ2lmWDRJY19WQklDV3dxUnciIGNoYW5nZURhdGU9IjIwMDUtMDgtMThUMTQ6MzA6MzQuMTI1LTA3MDAiPgotICA8bWFpbkRlc2NyaXB0aW9uPkNoZWNrbGlzdCBBMSBjb250ZW50PC9tYWluRGVzY3JpcHRpb24+Ci08L29yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2d1aWRhbmNlcy9jaGVja2xpc3RzL2NoZWNrbGlzdF9BMi54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvZ3VpZGFuY2VzL2NoZWNrbGlzdHMvY2hlY2tsaXN0X0EyLnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjQ2YzM0ZS4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvZ3VpZGFuY2VzL2NoZWNrbGlzdHMvY2hlY2tsaXN0X0EyLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnREZXNjcmlwdGlvbiB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCIgeG1pOmlkPSItSjlVcjlzbXBRdXZWR3B1RzlpX3drUSIgbmFtZT0iY2hlY2tsaXN0X0EyLF9rcmlUY0EtVEVkcUwyTzFQSlY5Y1pBIiBndWlkPSItSjlVcjlzbXBRdXZWR3B1RzlpX3drUSIgY2hhbmdlRGF0ZT0iMjAwNS0wOC0xOFQxNDozMDozNi4yMTktMDcwMCI+Ci0gIDxtYWluRGVzY3JpcHRpb24+Q2hlY2tsaXN0IEEyIGNvbnRlbnQ8L21haW5EZXNjcmlwdGlvbj4KLTwvb3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvZ3VpZGFuY2VzL2NvbmNlcHRzL2NvbmNlcHRfQTEueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2d1aWRhbmNlcy9jb25jZXB0cy9jb25jZXB0X0ExLnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmYxMjg3OC4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvZ3VpZGFuY2VzL2NvbmNlcHRzL2NvbmNlcHRfQTEueG1pCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnREZXNjcmlwdGlvbiB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCIgeG1pOmlkPSItNnk3YUJRdDNjQ1NCTG84c21NUmVtQSIgbmFtZT0iY29uY2VwdF9BMSxfTkRMLWtBLVNFZHFMMk8xUEpWOWNaQSIgZ3VpZD0iLTZ5N2FCUXQzY0NTQkxvOHNtTVJlbUEiIGNoYW5nZURhdGU9IjIwMDUtMDgtMThUMTQ6MzA6MzAuOTM4LTA3MDAiPgotICA8bWFpbkRlc2NyaXB0aW9uPiZsdDtwJmd0OwotICAgIENvbmNlcHQgQTEgY29udGVudAotJmx0Oy9wJmd0OwotJmx0O3AmZ3Q7Ci0gICAgRmlsZSBsaW5rOiZhbXA7bmJzcDsmbHQ7YSBocmVmPSZxdW90O2ZpbGU6Ly8vcmVzb3VyY2VzL2NvbmNlcHRfQTEueG1pJnF1b3Q7Jmd0O2NvbmNlcHRfQTEueG1pJmx0Oy9hJmd0OwotJmx0Oy9wJmd0OwotJmx0O3AmZ3Q7Ci0gICAgVVJMOiZhbXA7bmJzcDsmbHQ7YSBocmVmPSZxdW90O2h0dHA6Ly93d3cucG9zaXRyb25ncm91cC5jb20mcXVvdDsmZ3Q7aHR0cDovL3d3dy5wb3NpdHJvbmdyb3VwLmNvbSZsdDsvYSZndDsKLSZsdDsvcCZndDsKLSZsdDtwJmd0OwotICAgIEltYWdlOiZhbXA7bmJzcDsmbHQ7aW1nIGhlaWdodD0mcXVvdDszMiZxdW90OyBhbHQ9JnF1b3Q7UCZxdW90OyBzcmM9JnF1b3Q7cmVzb3VyY2VzL3R5cmFubm9zYXVydXMuZ2lmJnF1b3Q7IHdpZHRoPSZxdW90OzMyJnF1b3Q7IC8mZ3Q7Ci0mbHQ7L3AmZ3Q7Ci0mbHQ7cCZndDsKLSAgICBFbGVtZW50IHBsYWluOiZhbXA7bmJzcDsmbHQ7YSBjbGFzcz0mcXVvdDtlbGVtZW50TGluayZxdW90OwotICAgIGhyZWY9JnF1b3Q7Li8uLi8uLi8uLi9QbHVnJTIwQS9ndWlkYW5jZXMvY29uY2VwdHMvY29uY2VwdF9BMixfT1ZMVmNBLVRFZHFMMk8xUEpWOWNaQS5odG1sJnF1b3Q7Ci0gICAgZ3VpZD0mcXVvdDtfT1ZMVmNBLVRFZHFMMk8xUEpWOWNaQSZxdW90OyZndDtDb25jZXB0IEEyIHByZXNlbnQmbHQ7L2EmZ3Q7Ci0mbHQ7L3AmZ3Q7Ci0mbHQ7cCZndDsKLSAgICBFbGVtZW50IHdpdGggdHlwZTomYW1wO25ic3A7Jmx0O2EgY2xhc3M9JnF1b3Q7ZWxlbWVudExpbmtXaXRoVHlwZSZxdW90OwotICAgIGhyZWY9JnF1b3Q7Li8uLi8uLi8uLi9QbHVnJTIwQS9ndWlkYW5jZXMvY29uY2VwdHMvY29uY2VwdF9BMixfT1ZMVmNBLVRFZHFMMk8xUEpWOWNaQS5odG1sJnF1b3Q7Ci0gICAgZ3VpZD0mcXVvdDtfT1ZMVmNBLVRFZHFMMk8xUEpWOWNaQSZxdW90OyZndDtDb25jZXB0OiBDb25jZXB0IEEyIHByZXNlbnQmbHQ7L2EmZ3Q7Ci0mbHQ7L3AmZ3Q7Ci0mbHQ7cCZndDsKLSAgICBFbGVtZW50IHdpdGggdXNlciB0ZXh0OiZhbXA7bmJzcDsgJmx0O2EgY2xhc3M9JnF1b3Q7ZWxlbWVudExpbmtXaXRoVXNlclRleHQmcXVvdDsKLSAgICBocmVmPSZxdW90Oy4vLi4vLi4vLi4vUGx1ZyUyMEEvZ3VpZGFuY2VzL2NvbmNlcHRzL2NvbmNlcHRfQTIsX09WTFZjQS1URWRxTDJPMVBKVjljWkEuaHRtbCZxdW90OwotICAgIGd1aWQ9JnF1b3Q7X09WTFZjQS1URWRxTDJPMVBKVjljWkEmcXVvdDsmZ3Q7Y29uY2VwdF9BMiB1c2VyIHRleHQmbHQ7L2EmZ3Q7Ci0mbHQ7L3AmZ3Q7PC9tYWluRGVzY3JpcHRpb24+Ci08L29yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2d1aWRhbmNlcy9jb25jZXB0cy9jb25jZXB0X0EyLnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9ndWlkYW5jZXMvY29uY2VwdHMvY29uY2VwdF9BMi54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyZDk4ZjQuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2d1aWRhbmNlcy9jb25jZXB0cy9jb25jZXB0X0EyLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnREZXNjcmlwdGlvbiB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCIgeG1pOmlkPSItTFBJYXhPSExYcTlpZEdWNDFpVXI5ZyIgbmFtZT0iY29uY2VwdF9BMixfT1ZMVmNBLVRFZHFMMk8xUEpWOWNaQSIgZ3VpZD0iLUxQSWF4T0hMWHE5aWRHVjQxaVVyOWciIGNoYW5nZURhdGU9IjIwMDUtMDgtMThUMTQ6MzA6MjQuNTc4LTA3MDAiPgotICA8bWFpbkRlc2NyaXB0aW9uPkNvbmNlcHQgQTIgY29udGVudDwvbWFpbkRlc2NyaXB0aW9uPgotPC9vcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnREZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9ndWlkYW5jZXMvY29uY2VwdHMvcmVzb3VyY2VzL2NvbmNlcHRfQTEueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2d1aWRhbmNlcy9jb25jZXB0cy9yZXNvdXJjZXMvY29uY2VwdF9BMS54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlMjY1MjEuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2d1aWRhbmNlcy9jb25jZXB0cy9yZXNvdXJjZXMvY29uY2VwdF9BMS54bWkKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y29tLmlibS51bWE6Q29udGVudERlc2NyaXB0aW9uIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6Y29tLmlibS51bWE9Imh0dHA6Ly93d3cuaWJtLmNvbS91bWEvMS4wLjIvdW1hLmVjb3JlIiB4bWk6aWQ9Ii02eTdhQlF0M2NDU0JMbzhzbU1SZW1BIiBuYW1lPSJjb25jZXB0X0ExLF9OREwta0EtU0VkcUwyTzFQSlY5Y1pBIiBndWlkPSItNnk3YUJRdDNjQ1NCTG84c21NUmVtQSIgY2hhbmdlRGF0ZT0iMjAwNS0wOC0xOFQxNDozMDozMC45MzgtMDcwMCI+Ci0gIDxtYWluRGVzY3JpcHRpb24+Q29uY2VwdCBBMSBjb250ZW50PC9tYWluRGVzY3JpcHRpb24+Ci08L2NvbS5pYm0udW1hOkNvbnRlbnREZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9ndWlkYW5jZXMvY29uY2VwdHMvcmVzb3VyY2VzL3R5cmFubm9zYXVydXMuZ2lmIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2d1aWRhbmNlcy9jb25jZXB0cy9yZXNvdXJjZXMvdHlyYW5ub3NhdXJ1cy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2MmU3YjAuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2d1aWRhbmNlcy9jb25jZXB0cy9yZXNvdXJjZXMvdHlyYW5ub3NhdXJ1cy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvZ3VpZGFuY2VzL2V4YW1wbGVzL2V4YW1wbGVfQTEueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2d1aWRhbmNlcy9leGFtcGxlcy9leGFtcGxlX0ExLnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWI2NDQxZi4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvZ3VpZGFuY2VzL2V4YW1wbGVzL2V4YW1wbGVfQTEueG1pCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPG9yZy5lY2xpcHNlLmVwZi51bWE6R3VpZGFuY2VEZXNjcmlwdGlvbiB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCIgeG1pOmlkPSItQTk0OXdIZFRGcUczV3M2My1xOUIydyIgbmFtZT0iZXhhbXBsZV9BMSxfT0J4dHdBLVNFZHFMMk8xUEpWOWNaQSIgZ3VpZD0iLUE5NDl3SGRURnFHM1dzNjMtcTlCMnciIGNoYW5nZURhdGU9IjIwMDUtMDgtMThUMTQ6MzA6MzguOTY5LTA3MDAiPgotICA8bWFpbkRlc2NyaXB0aW9uPkV4YW1wbGUgQTEgY29udGVudDwvbWFpbkRlc2NyaXB0aW9uPgotPC9vcmcuZWNsaXBzZS5lcGYudW1hOkd1aWRhbmNlRGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvZ3VpZGFuY2VzL2V4YW1wbGVzL2V4YW1wbGVfQTIueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2d1aWRhbmNlcy9leGFtcGxlcy9leGFtcGxlX0EyLnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjU0MTI0NC4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvZ3VpZGFuY2VzL2V4YW1wbGVzL2V4YW1wbGVfQTIueG1pCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPG9yZy5lY2xpcHNlLmVwZi51bWE6R3VpZGFuY2VEZXNjcmlwdGlvbiB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCIgeG1pOmlkPSItcGxEMk0xc2hTRS1MbGJEdzV5WXByZyIgbmFtZT0iZXhhbXBsZV9BMixfdWFqV2NBLVRFZHFMMk8xUEpWOWNaQSIgZ3VpZD0iLXBsRDJNMXNoU0UtTGxiRHc1eVlwcmciIGNoYW5nZURhdGU9IjIwMDUtMDgtMThUMTQ6MzA6NDEuMDE2LTA3MDAiPgotICA8bWFpbkRlc2NyaXB0aW9uPkV4YW1wbGUgQTEgY29udGVudDwvbWFpbkRlc2NyaXB0aW9uPgotPC9vcmcuZWNsaXBzZS5lcGYudW1hOkd1aWRhbmNlRGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvZ3VpZGFuY2VzL2d1aWRlbGluZXMvZ3VpZGVsaW5lX0ExLnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9ndWlkYW5jZXMvZ3VpZGVsaW5lcy9ndWlkZWxpbmVfQTEueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNmNlMDVmLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9ndWlkYW5jZXMvZ3VpZGVsaW5lcy9ndWlkZWxpbmVfQTEueG1pCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPG9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudERlc2NyaXB0aW9uIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6ZXBmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZiIgZXBmOnZlcnNpb249IjEuMi4wIiB4bWk6aWQ9Ii1fMjFfRWlzUVNUSHd0bEpqb0o4YnZ3IiBuYW1lPSJndWlkZWxpbmVfQTEsX09rQ3RVQS1TRWRxTDJPMVBKVjljWkEiIGd1aWQ9Ii1fMjFfRWlzUVNUSHd0bEpqb0o4YnZ3IiBjaGFuZ2VEYXRlPSIyMDA1LTA4LTE4VDE0OjMwOjQzLjMxMi0wNzAwIj4KLSAgPG1haW5EZXNjcmlwdGlvbj5HdWlkZWxpbmUgQTEgY29udGVudDwvbWFpbkRlc2NyaXB0aW9uPgotPC9vcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnREZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9ndWlkYW5jZXMvZ3VpZGVsaW5lcy9ndWlkZWxpbmVfQTIueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2d1aWRhbmNlcy9ndWlkZWxpbmVzL2d1aWRlbGluZV9BMi54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4NGE4Y2MuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2d1aWRhbmNlcy9ndWlkZWxpbmVzL2d1aWRlbGluZV9BMi54bWkKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08b3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50RGVzY3JpcHRpb24geG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiIHhtaTppZD0iLVBjWnR0Vi1zYy1FY1VRd0ItWmhBSXciIG5hbWU9Imd1aWRlbGluZV9BMixfNllVd0FBLVRFZHFMMk8xUEpWOWNaQSIgZ3VpZD0iLVBjWnR0Vi1zYy1FY1VRd0ItWmhBSXciIGNoYW5nZURhdGU9IjIwMDUtMDgtMThUMTQ6MzA6NDUuNzM0LTA3MDAiPgotICA8bWFpbkRlc2NyaXB0aW9uPkd1aWRlbGluZSBBMiBjb250ZW50PC9tYWluRGVzY3JpcHRpb24+Ci08L29yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2d1aWRhbmNlcy9wcmFjdGljZXMvcHJhY3RpY2VfQTEuMS54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvZ3VpZGFuY2VzL3ByYWN0aWNlcy9wcmFjdGljZV9BMS4xLnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjkxN2I1MS4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvZ3VpZGFuY2VzL3ByYWN0aWNlcy9wcmFjdGljZV9BMS4xLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08b3JnLmVjbGlwc2UuZXBmLnVtYTpQcmFjdGljZURlc2NyaXB0aW9uIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6ZXBmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZiIgZXBmOnZlcnNpb249IjEuMi4wIiB4bWk6aWQ9Ii05eFA0ZDdiYTZvc3dHa1BlcFhXa193IiBuYW1lPSJwcmFjdGljZV9BMS4xLF8tRlNVZ0EtVUVkcUwyTzFQSlY5Y1pBIiBndWlkPSItOXhQNGQ3YmE2b3N3R2tQZXBYV2tfdyIgY2hhbmdlRGF0ZT0iMjAwNS0wOC0xOFQxNDozMToyMC43MDMtMDcwMCI+Ci0gIDxtYWluRGVzY3JpcHRpb24+UHJhY3RpY2UgQTEuMSBjb250ZW50PC9tYWluRGVzY3JpcHRpb24+Ci0gIDxhZGRpdGlvbmFsSW5mbz5QcmFjdGljZSBBMS4xIGFkZDwvYWRkaXRpb25hbEluZm8+Ci0gIDxwcm9ibGVtPlByYWN0aWNlIEExLjEgcHJvYmxlbTwvcHJvYmxlbT4KLSAgPGJhY2tncm91bmQ+UHJhY3RpY2UgQTEuMSBiYWNrPC9iYWNrZ3JvdW5kPgotICA8Z29hbHM+UHJhY3RpY2UgQTEuMSBnb2FsPC9nb2Fscz4KLSAgPGFwcGxpY2F0aW9uPlByYWN0aWNlIEExLjEgYXBwPC9hcHBsaWNhdGlvbj4KLSAgPGxldmVsc09mQWRvcHRpb24+UHJhY3RpY2UgQTEuMSBsZXZlbDwvbGV2ZWxzT2ZBZG9wdGlvbj4KLTwvb3JnLmVjbGlwc2UuZXBmLnVtYTpQcmFjdGljZURlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2d1aWRhbmNlcy9wcmFjdGljZXMvcHJhY3RpY2VfQTEueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2d1aWRhbmNlcy9wcmFjdGljZXMvcHJhY3RpY2VfQTEueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZTYzMzJiLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9ndWlkYW5jZXMvcHJhY3RpY2VzL3ByYWN0aWNlX0ExLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08b3JnLmVjbGlwc2UuZXBmLnVtYTpQcmFjdGljZURlc2NyaXB0aW9uIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6ZXBmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZiIgZXBmOnZlcnNpb249IjEuMi4wIiB4bWk6aWQ9Ii1aN2tkSWtDcC1tSFVkYl9Kb1FweldRIiBuYW1lPSJwcmFjdGljZV9BMSxfUDhqWVlBLVNFZHFMMk8xUEpWOWNaQSIgZ3VpZD0iLVo3a2RJa0NwLW1IVWRiX0pvUXB6V1EiIGNoYW5nZURhdGU9IjIwMDUtMDgtMThUMTQ6MzE6MTguMjk3LTA3MDAiPgotICA8bWFpbkRlc2NyaXB0aW9uPlByYWN0aWNlIEExIGNvbnRlbnQ8L21haW5EZXNjcmlwdGlvbj4KLSAgPGFkZGl0aW9uYWxJbmZvPlByYWN0aWNlIEExIGFkZDwvYWRkaXRpb25hbEluZm8+Ci0gIDxwcm9ibGVtPlByYWN0aWNlIEExIHByb2JsZW08L3Byb2JsZW0+Ci0gIDxiYWNrZ3JvdW5kPlByYWN0aWNlIEExIGJhY2s8L2JhY2tncm91bmQ+Ci0gIDxnb2Fscz5QcmFjdGljZSBBMSBnb2FsPC9nb2Fscz4KLSAgPGFwcGxpY2F0aW9uPlByYWN0aWNlIEExIGFwcDwvYXBwbGljYXRpb24+Ci0gIDxsZXZlbHNPZkFkb3B0aW9uPlByYWN0aWNlIEExIGxldmVsPC9sZXZlbHNPZkFkb3B0aW9uPgotPC9vcmcuZWNsaXBzZS5lcGYudW1hOlByYWN0aWNlRGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvZ3VpZGFuY2VzL3ByYWN0aWNlcy9wcmFjdGljZV9BMi4xLnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9ndWlkYW5jZXMvcHJhY3RpY2VzL3ByYWN0aWNlX0EyLjEueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZWJkYmMzLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9ndWlkYW5jZXMvcHJhY3RpY2VzL3ByYWN0aWNlX0EyLjEueG1pCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxvcmcuZWNsaXBzZS5lcGYudW1hOlByYWN0aWNlRGVzY3JpcHRpb24geG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiIHhtaTppZD0iLVI5c1F6b0pqUW00LU5CeFVxYUxXTGciIG5hbWU9InByYWN0aWNlX0EyLjEsX0pyZ3d3QS1WRWRxTDJPMVBKVjljWkEiIGd1aWQ9Ii1SOXNRem9KalFtNC1OQnhVcWFMV0xnIiBjaGFuZ2VEYXRlPSIyMDA1LTA4LTE4VDE0OjMxOjI1LjA5NC0wNzAwIj4KLSAgPG1haW5EZXNjcmlwdGlvbj5QcmFjdGljZSBBMi4xIGNvbnRlbnQ8L21haW5EZXNjcmlwdGlvbj4KLSAgPGFkZGl0aW9uYWxJbmZvPlByYWN0aWNlIEEyLjEgYWRkPC9hZGRpdGlvbmFsSW5mbz4KLSAgPHByb2JsZW0+UHJhY3RpY2UgQTIuMSBwcm9ibGVtPC9wcm9ibGVtPgotICA8YmFja2dyb3VuZD5QcmFjdGljZSBBMi4xIGJhY2s8L2JhY2tncm91bmQ+Ci0gIDxnb2Fscz5QcmFjdGljZSBBMi4xIGdvYWw8L2dvYWxzPgotICA8YXBwbGljYXRpb24+UHJhY3RpY2UgQTIuMSBhcHA8L2FwcGxpY2F0aW9uPgotICA8bGV2ZWxzT2ZBZG9wdGlvbj5QcmFjdGljZSBBMi4xIGxldmVsPC9sZXZlbHNPZkFkb3B0aW9uPgotPC9vcmcuZWNsaXBzZS5lcGYudW1hOlByYWN0aWNlRGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvZ3VpZGFuY2VzL3ByYWN0aWNlcy9wcmFjdGljZV9BMi54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvZ3VpZGFuY2VzL3ByYWN0aWNlcy9wcmFjdGljZV9BMi54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiOGQyZTIuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2d1aWRhbmNlcy9wcmFjdGljZXMvcHJhY3RpY2VfQTIueG1pCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxvcmcuZWNsaXBzZS5lcGYudW1hOlByYWN0aWNlRGVzY3JpcHRpb24geG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiIHhtaTppZD0iLU5jU01UZmhNbHR0UFVLMkY2d1hnRWciIG5hbWU9InByYWN0aWNlX0EyLF9FcGZvWUEtVkVkcUwyTzFQSlY5Y1pBIiBndWlkPSItTmNTTVRmaE1sdHRQVUsyRjZ3WGdFZyIgY2hhbmdlRGF0ZT0iMjAwNS0wOC0xOFQxNDozMToyMy4wOTQtMDcwMCI+Ci0gIDxtYWluRGVzY3JpcHRpb24+UHJhY3RpY2UgQTIgY29udGVudDwvbWFpbkRlc2NyaXB0aW9uPgotICA8YWRkaXRpb25hbEluZm8+UHJhY3RpY2UgQTIgYWRkPC9hZGRpdGlvbmFsSW5mbz4KLSAgPHByb2JsZW0+UHJhY3RpY2UgQTIgcHJvYmxlbTwvcHJvYmxlbT4KLSAgPGJhY2tncm91bmQ+UHJhY3RpY2UgQTIgYmFjazwvYmFja2dyb3VuZD4KLSAgPGdvYWxzPlByYWN0aWNlIEEyIGdvYWw8L2dvYWxzPgotICA8YXBwbGljYXRpb24+UHJhY3RpY2UgQTIgYXBwPC9hcHBsaWNhdGlvbj4KLSAgPGxldmVsc09mQWRvcHRpb24+UHJhY3RpY2UgQTIgbGV2ZWw8L2xldmVsc09mQWRvcHRpb24+Ci08L29yZy5lY2xpcHNlLmVwZi51bWE6UHJhY3RpY2VEZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9ndWlkYW5jZXMvcmVwb3J0cy9yZXBvcnRfQTEueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2d1aWRhbmNlcy9yZXBvcnRzL3JlcG9ydF9BMS54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxMmYwMTAuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2d1aWRhbmNlcy9yZXBvcnRzL3JlcG9ydF9BMS54bWkKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08b3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50RGVzY3JpcHRpb24geG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiIHhtaTppZD0iLVhSZUJMZE40aUxidmFmZkJ3ZWJOQ3ciIG5hbWU9InJlcG9ydF9BMSxfUTVEYzRBLVNFZHFMMk8xUEpWOWNaQSIgZ3VpZD0iLVhSZUJMZE40aUxidmFmZkJ3ZWJOQ3ciIGNoYW5nZURhdGU9IjIwMDUtMDgtMThUMTQ6MzA6NTEuNDIyLTA3MDAiPgotICA8bWFpbkRlc2NyaXB0aW9uPlJlcG9ydCBBMSBjb250ZW50PC9tYWluRGVzY3JpcHRpb24+Ci08L29yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2d1aWRhbmNlcy9yZXBvcnRzL3JlcG9ydF9BMi54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvZ3VpZGFuY2VzL3JlcG9ydHMvcmVwb3J0X0EyLnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2NmM2ZmNC4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvZ3VpZGFuY2VzL3JlcG9ydHMvcmVwb3J0X0EyLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnREZXNjcmlwdGlvbiB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCIgeG1pOmlkPSItNUxuZG1keHhiRzFNMU1mcEFQS3BBUSIgbmFtZT0icmVwb3J0X0EyLF9Hckd3UUEtVUVkcUwyTzFQSlY5Y1pBIiBndWlkPSItNUxuZG1keHhiRzFNMU1mcEFQS3BBUSIgY2hhbmdlRGF0ZT0iMjAwNS0wOC0xOFQxNDozMDo1My45ODQtMDcwMCI+Ci0gIDxtYWluRGVzY3JpcHRpb24+UmVwb3J0IEEyIGNvbnRlbnQ8L21haW5EZXNjcmlwdGlvbj4KLTwvb3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvZ3VpZGFuY2VzL3JldXNhYmxlYXNzZXRzL3JldXNhYmxlX2Fzc2V0X0ExLnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9ndWlkYW5jZXMvcmV1c2FibGVhc3NldHMvcmV1c2FibGVfYXNzZXRfQTEueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZDBmYzRhLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9ndWlkYW5jZXMvcmV1c2FibGVhc3NldHMvcmV1c2FibGVfYXNzZXRfQTEueG1pCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPG9yZy5lY2xpcHNlLmVwZi51bWE6R3VpZGFuY2VEZXNjcmlwdGlvbiB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCIgeG1pOmlkPSItMWhIRU9MOHF5eFRNTVI3NzVVR2ZydyIgbmFtZT0icmV1c2FibGVfYXNzZXRfQTEsX1RWMGFRQS1TRWRxTDJPMVBKVjljWkEiIGd1aWQ9Ii0xaEhFT0w4cXl4VE1NUjc3NVVHZnJ3IiBjaGFuZ2VEYXRlPSIyMDA1LTA4LTE4VDE0OjMxOjI3LjIxOS0wNzAwIj4KLSAgPG1haW5EZXNjcmlwdGlvbj5SZXVzYWJsZSBBc3NldCBBMSBjb250ZW50PC9tYWluRGVzY3JpcHRpb24+Ci08L29yZy5lY2xpcHNlLmVwZi51bWE6R3VpZGFuY2VEZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9ndWlkYW5jZXMvcmV1c2FibGVhc3NldHMvcmV1c2FibGVfYXNzZXRfQTIueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2d1aWRhbmNlcy9yZXVzYWJsZWFzc2V0cy9yZXVzYWJsZV9hc3NldF9BMi54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3ZjdjOTMuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2d1aWRhbmNlcy9yZXVzYWJsZWFzc2V0cy9yZXVzYWJsZV9hc3NldF9BMi54bWkKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08b3JnLmVjbGlwc2UuZXBmLnVtYTpHdWlkYW5jZURlc2NyaXB0aW9uIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6ZXBmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZiIgZXBmOnZlcnNpb249IjEuMi4wIiB4bWk6aWQ9Ii03Z2xHWWlKYXM5aFpHa0o5Y2NRNUtRIiBuYW1lPSJyZXVzYWJsZV9hc3NldF9BMixfU01jM0VBLVZFZHFMMk8xUEpWOWNaQSIgZ3VpZD0iLTdnbEdZaUphczloWkdrSjljY1E1S1EiIGNoYW5nZURhdGU9IjIwMDUtMDgtMThUMTQ6MzE6MjkuNDIyLTA3MDAiPgotICA8bWFpbkRlc2NyaXB0aW9uPlJldXNhYmxlIEFzc2V0IEEyIGNvbnRlbnQ8L21haW5EZXNjcmlwdGlvbj4KLTwvb3JnLmVjbGlwc2UuZXBmLnVtYTpHdWlkYW5jZURlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2d1aWRhbmNlcy9yb2FkbWFwcy9yb2FkbWFwX0ExLnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9ndWlkYW5jZXMvcm9hZG1hcHMvcm9hZG1hcF9BMS54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiYjY2NzguLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2d1aWRhbmNlcy9yb2FkbWFwcy9yb2FkbWFwX0ExLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnREZXNjcmlwdGlvbiB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCIgeG1pOmlkPSIteG9EWmFxcjdKLXdmMmxCN3JTalNadyIgbmFtZT0icm9hZG1hcF9BMSxfWmszOWdBLVNFZHFMMk8xUEpWOWNaQSIgZ3VpZD0iLXhvRFphcXI3Si13ZjJsQjdyU2pTWnciIGNoYW5nZURhdGU9IjIwMDUtMDgtMThUMTQ6MzA6MDQuMDQ3LTA3MDAiPgotICA8bWFpbkRlc2NyaXB0aW9uPlJvYWRtYXAgQTEgY29udGVudDwvbWFpbkRlc2NyaXB0aW9uPgotPC9vcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnREZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9ndWlkYW5jZXMvcm9hZG1hcHMvcm9hZG1hcF9BMi54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvZ3VpZGFuY2VzL3JvYWRtYXBzL3JvYWRtYXBfQTIueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ODNkOWU5Li4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9ndWlkYW5jZXMvcm9hZG1hcHMvcm9hZG1hcF9BMi54bWkKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08b3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50RGVzY3JpcHRpb24geG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiIHhtaTppZD0iLUowc3p3cktiaUwySm0tRmlmUXRJOXciIG5hbWU9InJvYWRtYXBfQTIsX1l1a2dRQS1WRWRxTDJPMVBKVjljWkEiIGd1aWQ9Ii1KMHN6d3JLYmlMMkptLUZpZlF0STl3IiBjaGFuZ2VEYXRlPSIyMDA1LTA4LTE4VDE0OjMwOjA2Ljg1OS0wNzAwIj4KLSAgPG1haW5EZXNjcmlwdGlvbj5Sb2FkbWFwIEEyIGNvbnRlbnQ8L21haW5EZXNjcmlwdGlvbj4KLTwvb3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvZ3VpZGFuY2VzL3N1cHBvcnRpbmdtYXRlcmlhbHMvc3VwcG9ydGluZ19tYXRlcmlhbF9BMS54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvZ3VpZGFuY2VzL3N1cHBvcnRpbmdtYXRlcmlhbHMvc3VwcG9ydGluZ19tYXRlcmlhbF9BMS54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhNDViZjYuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2d1aWRhbmNlcy9zdXBwb3J0aW5nbWF0ZXJpYWxzL3N1cHBvcnRpbmdfbWF0ZXJpYWxfQTEueG1pCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPG9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudERlc2NyaXB0aW9uIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6ZXBmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZiIgZXBmOnZlcnNpb249IjEuMi4wIiB4bWk6aWQ9Ii00NkFKbEF2dDVCRFlmTDlfZy0yUjd3IiBuYW1lPSJzdXBwb3J0aW5nX21hdGVyaWFsX0ExLF9hRnB2VUEtU0VkcUwyTzFQSlY5Y1pBIiBndWlkPSItNDZBSmxBdnQ1QkRZZkw5X2ctMlI3dyIgY2hhbmdlRGF0ZT0iMjAwNS0wOC0xOFQxNDozMTowMS4yODEtMDcwMCI+Ci0gIDxtYWluRGVzY3JpcHRpb24+U3VwcG9ydGluZyBNYXRlcmlhbCBBMSBjb250ZW50PC9tYWluRGVzY3JpcHRpb24+Ci08L29yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2d1aWRhbmNlcy9zdXBwb3J0aW5nbWF0ZXJpYWxzL3N1cHBvcnRpbmdfbWF0ZXJpYWxfQTIueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2d1aWRhbmNlcy9zdXBwb3J0aW5nbWF0ZXJpYWxzL3N1cHBvcnRpbmdfbWF0ZXJpYWxfQTIueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZjJiNjBjLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9ndWlkYW5jZXMvc3VwcG9ydGluZ21hdGVyaWFscy9zdXBwb3J0aW5nX21hdGVyaWFsX0EyLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnREZXNjcmlwdGlvbiB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCIgeG1pOmlkPSItN3c1M2pGT3p3cE5CZ2VDRF9BX3ZZZyIgbmFtZT0ic3VwcG9ydGluZ19tYXRlcmlhbF9BMixfbVBzX2NBLVVFZHFMMk8xUEpWOWNaQSIgZ3VpZD0iLTd3NTNqRk96d3BOQmdlQ0RfQV92WWciIGNoYW5nZURhdGU9IjIwMDUtMDgtMThUMTQ6MzE6MDMuNTE2LTA3MDAiPgotICA8bWFpbkRlc2NyaXB0aW9uPlN1cHBvcnRpbmcgTWF0ZXJpYWwgQTIgY29udGVudDwvbWFpbkRlc2NyaXB0aW9uPgotPC9vcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnREZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9ndWlkYW5jZXMvdGVtcGxhdGVzL3RlbXBsYXRlX0ExLnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9ndWlkYW5jZXMvdGVtcGxhdGVzL3RlbXBsYXRlX0ExLnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWFjNmY2OS4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvZ3VpZGFuY2VzL3RlbXBsYXRlcy90ZW1wbGF0ZV9BMS54bWkKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08b3JnLmVjbGlwc2UuZXBmLnVtYTpHdWlkYW5jZURlc2NyaXB0aW9uIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6ZXBmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZiIgZXBmOnZlcnNpb249IjEuMi4wIiB4bWk6aWQ9Ii1jOXNiOURpNE1ZbVItUm9vRmtQM2p3IiBuYW1lPSJ0ZW1wbGF0ZV9BMSxfYkZJUFVBLVNFZHFMMk8xUEpWOWNaQSIgZ3VpZD0iLWM5c2I5RGk0TVltUi1Sb29Ga1AzanciIGNoYW5nZURhdGU9IjIwMDUtMDgtMThUMTQ6MzA6NTYuNDg0LTA3MDAiPgotICA8bWFpbkRlc2NyaXB0aW9uPlRlbXBsYXRlIEExIGNvbnRlbnQ8L21haW5EZXNjcmlwdGlvbj4KLTwvb3JnLmVjbGlwc2UuZXBmLnVtYTpHdWlkYW5jZURlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2d1aWRhbmNlcy90ZW1wbGF0ZXMvdGVtcGxhdGVfQTIueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2d1aWRhbmNlcy90ZW1wbGF0ZXMvdGVtcGxhdGVfQTIueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYTFmY2EzLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9ndWlkYW5jZXMvdGVtcGxhdGVzL3RlbXBsYXRlX0EyLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxvcmcuZWNsaXBzZS5lcGYudW1hOkd1aWRhbmNlRGVzY3JpcHRpb24geG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiIHhtaTppZD0iLWhMU09Xckc1YmlTWC1QQWtfM0JiOUEiIG5hbWU9InRlbXBsYXRlX0EyLF9aWHE5RUEtVUVkcUwyTzFQSlY5Y1pBIiBndWlkPSItaExTT1dyRzViaVNYLVBBa18zQmI5QSIgY2hhbmdlRGF0ZT0iMjAwNS0wOC0xOFQxNDozMDo1OC45NTMtMDcwMCI+Ci0gIDxtYWluRGVzY3JpcHRpb24+VGVtcGxhdGUgQTIgY29udGVudDwvbWFpbkRlc2NyaXB0aW9uPgotPC9vcmcuZWNsaXBzZS5lcGYudW1hOkd1aWRhbmNlRGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvZ3VpZGFuY2VzL3Rlcm1kZWZpbml0aW9ucy90ZXJtX2RlZmluaXRpb25fQTEueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2d1aWRhbmNlcy90ZXJtZGVmaW5pdGlvbnMvdGVybV9kZWZpbml0aW9uX0ExLnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTIwYjgzYS4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvZ3VpZGFuY2VzL3Rlcm1kZWZpbml0aW9ucy90ZXJtX2RlZmluaXRpb25fQTEueG1pCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPG9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudERlc2NyaXB0aW9uIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6ZXBmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZiIgZXBmOnZlcnNpb249IjEuMi4wIiB4bWk6aWQ9Ii1OdmN0U3VtN21tTzRxXzA4Z0xwRDVBIiBuYW1lPSJ0ZXJtX2RlZmluaXRpb25fQTEsX3NmaUpVQS1WRWRxTDJPMVBKVjljWkEiIGd1aWQ9Ii1OdmN0U3VtN21tTzRxXzA4Z0xwRDVBIiBjaGFuZ2VEYXRlPSIyMDA1LTA4LTE4VDE0OjMwOjEyLjE0MS0wNzAwIj4KLSAgPG1haW5EZXNjcmlwdGlvbj5UZXJtIERlZmluaXRpb24gQTEgY29udGVudDwvbWFpbkRlc2NyaXB0aW9uPgotPC9vcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnREZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9ndWlkYW5jZXMvdGVybWRlZmluaXRpb25zL3Rlcm1fZGVmaW5pdGlvbl9BMi54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvZ3VpZGFuY2VzL3Rlcm1kZWZpbml0aW9ucy90ZXJtX2RlZmluaXRpb25fQTIueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhN2Y5ZDA0Li4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9ndWlkYW5jZXMvdGVybWRlZmluaXRpb25zL3Rlcm1fZGVmaW5pdGlvbl9BMi54bWkKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08b3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50RGVzY3JpcHRpb24geG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiIHhtaTppZD0iLThCUFJJZ19TYkhUd1FBaUFaeTgzUHciIG5hbWU9InRlcm1fZGVmaW5pdGlvbl9BMixfbzhJN0VBLVZFZHFMMk8xUEpWOWNaQSIgZ3VpZD0iLThCUFJJZ19TYkhUd1FBaUFaeTgzUHciIGNoYW5nZURhdGU9IjIwMDUtMDgtMThUMTQ6MzE6NDIuNjU2LTA3MDAiPgotICA8bWFpbkRlc2NyaXB0aW9uPlRlcm0gRGVmaW5pdGlvbiBBMiBjb250ZW50PC9tYWluRGVzY3JpcHRpb24+Ci08L29yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2d1aWRhbmNlcy90b29sbWVudG9ycy90b29sbWVudG9yX0ExLnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9ndWlkYW5jZXMvdG9vbG1lbnRvcnMvdG9vbG1lbnRvcl9BMS54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkYWRjZDIuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2d1aWRhbmNlcy90b29sbWVudG9ycy90b29sbWVudG9yX0ExLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnREZXNjcmlwdGlvbiB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCIgeG1pOmlkPSItcDR4a1FtUHpFcWFuWG4xa1NiV1lBZyIgbmFtZT0idG9vbG1lbnRvcl9BMSxfaEhFam9BLVNFZHFMMk8xUEpWOWNaQSIgZ3VpZD0iLXA0eGtRbVB6RXFhblhuMWtTYldZQWciIGNoYW5nZURhdGU9IjIwMDUtMDgtMThUMTQ6MzE6MDUuODI4LTA3MDAiPgotICA8bWFpbkRlc2NyaXB0aW9uPlRvb2xtZW50b3IgQTEgY29udGVudDwvbWFpbkRlc2NyaXB0aW9uPgotPC9vcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnREZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9ndWlkYW5jZXMvdG9vbG1lbnRvcnMvdG9vbG1lbnRvcl9BMi54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvZ3VpZGFuY2VzL3Rvb2xtZW50b3JzL3Rvb2xtZW50b3JfQTIueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNTUwYzg4Li4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9ndWlkYW5jZXMvdG9vbG1lbnRvcnMvdG9vbG1lbnRvcl9BMi54bWkKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08b3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50RGVzY3JpcHRpb24geG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiIHhtaTppZD0iLXN4VnEtNWFhSWUzenQ1YUV1bjhGQ2ciIG5hbWU9InRvb2xtZW50b3JfQTIsX3Y3SktBQS1VRWRxTDJPMVBKVjljWkEiIGd1aWQ9Ii1zeFZxLTVhYUllM3p0NWFFdW44RkNnIiBjaGFuZ2VEYXRlPSIyMDA1LTA4LTE4VDE0OjMxOjA4LjU5NC0wNzAwIj4KLSAgPG1haW5EZXNjcmlwdGlvbj5Ub29sbWVudG9yIEEyIGNvbnRlbnQ8L21haW5EZXNjcmlwdGlvbj4KLTwvb3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvZ3VpZGFuY2VzL3doaXRlcGFwZXJzL3doaXRlcGFwZXJfQTEueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2d1aWRhbmNlcy93aGl0ZXBhcGVycy93aGl0ZXBhcGVyX0ExLnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2EzNDZhZS4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvZ3VpZGFuY2VzL3doaXRlcGFwZXJzL3doaXRlcGFwZXJfQTEueG1pCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPG9yZy5lY2xpcHNlLmVwZi51bWE6R3VpZGFuY2VEZXNjcmlwdGlvbiB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCIgeG1pOmlkPSItN1BaSExGU0tWTHNZT0FObjBnR3FJdyIgbmFtZT0id2hpdGVwYXBlcl9BMSxfaDhSR1FBLVNFZHFMMk8xUEpWOWNaQSIgZ3VpZD0iLTdQWkhMRlNLVkxzWU9BTm4wZ0dxSXciIGNoYW5nZURhdGU9IjIwMDUtMDgtMThUMTQ6MzE6MTMuMzU5LTA3MDAiPgotICA8bWFpbkRlc2NyaXB0aW9uPldoaXRlcGFwZXIgQTEgY29udGVudDwvbWFpbkRlc2NyaXB0aW9uPgotPC9vcmcuZWNsaXBzZS5lcGYudW1hOkd1aWRhbmNlRGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvZ3VpZGFuY2VzL3doaXRlcGFwZXJzL3doaXRlcGFwZXJfQTIueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2d1aWRhbmNlcy93aGl0ZXBhcGVycy93aGl0ZXBhcGVyX0EyLnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzdkYmFlMi4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvZ3VpZGFuY2VzL3doaXRlcGFwZXJzL3doaXRlcGFwZXJfQTIueG1pCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPG9yZy5lY2xpcHNlLmVwZi51bWE6R3VpZGFuY2VEZXNjcmlwdGlvbiB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCIgeG1pOmlkPSItdEdERmloNVQxbHRWbk1aZWY4QTc2dyIgbmFtZT0id2hpdGVwYXBlcl9BMixfM1hyMEVBLVVFZHFMMk8xUEpWOWNaQSIgZ3VpZD0iLXRHREZpaDVUMWx0Vm5NWmVmOEE3NnciIGNoYW5nZURhdGU9IjIwMDUtMDgtMThUMTQ6MzE6MTUuNTc4LTA3MDAiPgotICA8bWFpbkRlc2NyaXB0aW9uPldoaXRlcGFwZXIgQTIgY29udGVudDwvbWFpbkRlc2NyaXB0aW9uPgotPC9vcmcuZWNsaXBzZS5lcGYudW1hOkd1aWRhbmNlRGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvcGx1Z2luLnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9wbHVnaW4ueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZGIxZmNjLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9wbHVnaW4ueG1pCisrKyAvZGV2L251bGwKQEAgLTEsMzAwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08eG1pOlhNSSB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWEucmVzb3VyY2VtYW5hZ2VyPSJodHRwOi8vL29yZy9lY2xpcHNlL2VwZi91bWEvcmVzb3VyY2VtYW5hZ2VyLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiPgotICA8b3JnLmVjbGlwc2UuZXBmLnVtYS5yZXNvdXJjZW1hbmFnZXI6UmVzb3VyY2VNYW5hZ2VyIHhtaTppZD0iXzZsSzJBQS1QRWRxTDJPMVBKVjljWkEiIGd1aWQ9Il82bEsyQUEtUEVkcUwyTzFQSlY5Y1pBIj4KLSAgICA8c3ViTWFuYWdlcnMgeG1pOmlkPSJfWFZZOU1CQk5FZHFCczdLaGRWTFJMQSIgaHJlZj0idW1hOi8vX1c2YTRjQkJORWRxQnM3S2hkVkxSTEEjX1hWWTlNQkJORWRxQnM3S2hkVkxSTEEiLz4KLSAgICA8c3ViTWFuYWdlcnMgeG1pOmlkPSJfY25XbUVCQk5FZHFCczdLaGRWTFJMQSIgaHJlZj0idW1hOi8vX2FIVVNRQkJORWRxQnM3S2hkVkxSTEEjX2NuV21FQkJORWRxQnM3S2hkVkxSTEEiLz4KLSAgICA8c3ViTWFuYWdlcnMgeG1pOmlkPSJfdXVuMFlCTTFFZHFxbmRpLWdEdXhwdyIgaHJlZj0idW1hOi8vX3VxNUs4Qk0xRWRxcW5kaS1nRHV4cHcjX3V1bjBZQk0xRWRxcW5kaS1nRHV4cHciLz4KLSAgICA8c3ViTWFuYWdlcnMgeG1pOmlkPSJfNHljM3NUemdFZHE1eXNGT05yMUJHUSIgaHJlZj0idW1hOi8vXzRzQ3RzRHpnRWRxNXlzRk9OcjFCR1EjXzR5YzNzVHpnRWRxNXlzRk9OcjFCR1EiLz4KLSAgICA8c3ViTWFuYWdlcnMgeG1pOmlkPSJfZEYyTzRFQXZFZHFGcUl1OC1ja29sZyIgaHJlZj0idW1hOi8vX2RCaHZrRUF2RWRxRnFJdTgtY2tvbGcjX2RGMk80RUF2RWRxRnFJdTgtY2tvbGciLz4KLSAgICA8c3ViTWFuYWdlcnMgeG1pOmlkPSJfWnpEWFFVREZFZHFPOU0zZnVrWUFfQSIgaHJlZj0idW1hOi8vX1p0WmJNRURGRWRxTzlNM2Z1a1lBX0EjX1p6RFhRVURGRWRxTzlNM2Z1a1lBX0EiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il82bEsyQVEtUEVkcUwyTzFQSlY5Y1pBIiBpZD0iLWc3bTk4Smw4YVJiVjZuZk9HVXBHbmciIHVyaT0icm9sZXMvcm9sZV9BMS54bWkiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il83Tl93a0EtUEVkcUwyTzFQSlY5Y1pBIiBpZD0iLUh4a2NWaUh1NTdiREd1bDQyMXJCdmciIHVyaT0icm9sZXMvcm9sZV9BMi54bWkiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il83T0k2Z0EtUEVkcUwyTzFQSlY5Y1pBIiBpZD0iLVMxaWdMU2k2QUlfdmx1eldPQ3U2VHciIHVyaT0idGFza3MvdGFza19BMS54bWkiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il83N1M3Y0EtUEVkcUwyTzFQSlY5Y1pBIiBpZD0iLTEzcThKSkFhMGl4NnJETVpBcXd5MXciIHVyaT0idGFza3MvdGFza19BMi54bWkiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il9FOEFSZ0EtUkVkcUwyTzFQSlY5Y1pBIiBpZD0iLW45VEpRYTBGSnZHX2F2RFhhQVRqSVEiIHVyaT0id29ya3Byb2R1Y3RzL2FydGlmYWN0X0ExLnhtaSIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iX0Y3TFBnQS1SRWRxTDJPMVBKVjljWkEiIGlkPSItSlRXS241ZDRDTGM0S0ZRTURURnBTUSIgdXJpPSJ3b3JrcHJvZHVjdHMvYXJ0aWZhY3RfQTIueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfSEVWM0FBLVJFZHFMMk8xUEpWOWNaQSIgaWQ9Ii05bjFXWDVkN0lGaFZKNHB6SFZfdnJRIiB1cmk9Indvcmtwcm9kdWN0cy9zdWJfYXJ0aWZhY3RfQTEuMS54bWkiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il9JSW1KVUEtUkVkcUwyTzFQSlY5Y1pBIiBpZD0iLVVGUm9lQUtIZFhYMlNTQjFLVVh0WUEiIHVyaT0id29ya3Byb2R1Y3RzL2FydGlmYWN0X0EyLjEueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfSkNITFFBLVJFZHFMMk8xUEpWOWNaQSIgaWQ9Ii1BYlhSZzQ0TDhUeHg0Q2tCMmh4NU5RIiB1cmk9Indvcmtwcm9kdWN0cy9kZWxpdmVyYWJsZV9BMS54bWkiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il9LQnZjUUEtUkVkcUwyTzFQSlY5Y1pBIiBpZD0iLU1kcW9hLW54d0VIZkFKY29BNlhOS1EiIHVyaT0id29ya3Byb2R1Y3RzL2RlbGl2ZXJhYmxlX0EyLnhtaSIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iX0t3MHYwQS1SRWRxTDJPMVBKVjljWkEiIGlkPSItM29keUJ5SWV6UlJYZ1FnZUh1TTZTQSIgdXJpPSJ3b3JrcHJvZHVjdHMvb3V0Y29tZV9BMS54bWkiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il9GYlUxVUEtU0VkcUwyTzFQSlY5Y1pBIiBpZD0iLTRHYkFXR2I4N0Fsei1Hel9HXzlwMWciIHVyaT0id29ya3Byb2R1Y3RzL291dGNvbWVfQTIueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfTkRlNWdBLVNFZHFMMk8xUEpWOWNaQSIgaWQ9Ii1vV28zVUNpZlg0SWNfVkJJQ1d3cVJ3IiB1cmk9Imd1aWRhbmNlcy9jaGVja2xpc3RzL2NoZWNrbGlzdF9BMS54bWkiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il9PQ055b0EtU0VkcUwyTzFQSlY5Y1pBIiBpZD0iLTZ5N2FCUXQzY0NTQkxvOHNtTVJlbUEiIHVyaT0iZ3VpZGFuY2VzL2NvbmNlcHRzL2NvbmNlcHRfQTEueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfT2tWb1FBLVNFZHFMMk8xUEpWOWNaQSIgaWQ9Ii1BOTQ5d0hkVEZxRzNXczYzLXE5QjJ3IiB1cmk9Imd1aWRhbmNlcy9leGFtcGxlcy9leGFtcGxlX0ExLnhtaSIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iX1A4MjZZQS1TRWRxTDJPMVBKVjljWkEiIGlkPSItXzIxX0Vpc1FTVEh3dGxKam9KOGJ2dyIgdXJpPSJndWlkYW5jZXMvZ3VpZGVsaW5lcy9ndWlkZWxpbmVfQTEueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfUTVnSTBBLVNFZHFMMk8xUEpWOWNaQSIgaWQ9Ii1aN2tkSWtDcC1tSFVkYl9Kb1FweldRIiB1cmk9Imd1aWRhbmNlcy9wcmFjdGljZXMvcHJhY3RpY2VfQTEueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfVFdSR01BLVNFZHFMMk8xUEpWOWNaQSIgaWQ9Ii1YUmVCTGRONGlMYnZhZmZCd2ViTkN3IiB1cmk9Imd1aWRhbmNlcy9yZXBvcnRzL3JlcG9ydF9BMS54bWkiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il9abFVDWUEtU0VkcUwyTzFQSlY5Y1pBIiBpZD0iLTFoSEVPTDhxeXhUTU1SNzc1VUdmcnciIHVyaT0iZ3VpZGFuY2VzL3JldXNhYmxlYXNzZXRzL3JldXNhYmxlX2Fzc2V0X0ExLnhtaSIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iX2FHR2JRQS1TRWRxTDJPMVBKVjljWkEiIGlkPSIteG9EWmFxcjdKLXdmMmxCN3JTalNadyIgdXJpPSJndWlkYW5jZXMvcm9hZG1hcHMvcm9hZG1hcF9BMS54bWkiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il9iRms3UUEtU0VkcUwyTzFQSlY5Y1pBIiBpZD0iLTQ2QUpsQXZ0NUJEWWZMOV9nLTJSN3ciIHVyaT0iZ3VpZGFuY2VzL3N1cHBvcnRpbmdtYXRlcmlhbHMvc3VwcG9ydGluZ19tYXRlcmlhbF9BMS54bWkiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il9oSGhQa0EtU0VkcUwyTzFQSlY5Y1pBIiBpZD0iLWM5c2I5RGk0TVltUi1Sb29Ga1AzanciIHVyaT0iZ3VpZGFuY2VzL3RlbXBsYXRlcy90ZW1wbGF0ZV9BMS54bWkiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il9oOHR5TUEtU0VkcUwyTzFQSlY5Y1pBIiBpZD0iLXA0eGtRbVB6RXFhblhuMWtTYldZQWciIHVyaT0iZ3VpZGFuY2VzL3Rvb2xtZW50b3JzL3Rvb2xtZW50b3JfQTEueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfT1dOM1FBLVRFZHFMMk8xUEpWOWNaQSIgaWQ9Ii03UFpITEZTS1ZMc1lPQU5uMGdHcUl3IiB1cmk9Imd1aWRhbmNlcy93aGl0ZXBhcGVycy93aGl0ZXBhcGVyX0ExLnhtaSIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iX2tzSXdZQS1URWRxTDJPMVBKVjljWkEiIGlkPSItTFBJYXhPSExYcTlpZEdWNDFpVXI5ZyIgdXJpPSJndWlkYW5jZXMvY29uY2VwdHMvY29uY2VwdF9BMi54bWkiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il91Ykp6WUEtVEVkcUwyTzFQSlY5Y1pBIiBpZD0iLUo5VXI5c21wUXV2VkdwdUc5aV93a1EiIHVyaT0iZ3VpZGFuY2VzL2NoZWNrbGlzdHMvY2hlY2tsaXN0X0EyLnhtaSIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iXzZZN004QS1URWRxTDJPMVBKVjljWkEiIGlkPSItcGxEMk0xc2hTRS1MbGJEdzV5WXByZyIgdXJpPSJndWlkYW5jZXMvZXhhbXBsZXMvZXhhbXBsZV9BMi54bWkiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il9HcnROTUEtVUVkcUwyTzFQSlY5Y1pBIiBpZD0iLVBjWnR0Vi1zYy1FY1VRd0ItWmhBSXciIHVyaT0iZ3VpZGFuY2VzL2d1aWRlbGluZXMvZ3VpZGVsaW5lX0EyLnhtaSIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iX1F3eFlzQS1VRWRxTDJPMVBKVjljWkEiIGlkPSItNUxuZG1keHhiRzFNMU1mcEFQS3BBUSIgdXJpPSJndWlkYW5jZXMvcmVwb3J0cy9yZXBvcnRfQTIueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfbVFKcllBLVVFZHFMMk8xUEpWOWNaQSIgaWQ9Ii1oTFNPV3JHNWJpU1gtUEFrXzNCYjlBIiB1cmk9Imd1aWRhbmNlcy90ZW1wbGF0ZXMvdGVtcGxhdGVfQTIueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfdG1TTGNBLVVFZHFMMk8xUEpWOWNaQSIgaWQ9Ii03dzUzakZPendwTkJnZUNEX0FfdllnIiB1cmk9Imd1aWRhbmNlcy9zdXBwb3J0aW5nbWF0ZXJpYWxzL3N1cHBvcnRpbmdfbWF0ZXJpYWxfQTIueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfM1lTUkFBLVVFZHFMMk8xUEpWOWNaQSIgaWQ9Ii1zeFZxLTVhYUllM3p0NWFFdW44RkNnIiB1cmk9Imd1aWRhbmNlcy90b29sbWVudG9ycy90b29sbWVudG9yX0EyLnhtaSIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iX0VxX2RNQS1WRWRxTDJPMVBKVjljWkEiIGlkPSItOXhQNGQ3YmE2b3N3R2tQZXBYV2tfdyIgdXJpPSJndWlkYW5jZXMvcHJhY3RpY2VzL3ByYWN0aWNlX0ExLjEueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfRXJTWUlBLVZFZHFMMk8xUEpWOWNaQSIgaWQ9Ii10R0RGaWg1VDFsdFZuTVplZjhBNzZ3IiB1cmk9Imd1aWRhbmNlcy93aGl0ZXBhcGVycy93aGl0ZXBhcGVyX0EyLnhtaSIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iX1NOQ3M4QS1WRWRxTDJPMVBKVjljWkEiIGlkPSItTmNTTVRmaE1sdHRQVUsyRjZ3WGdFZyIgdXJpPSJndWlkYW5jZXMvcHJhY3RpY2VzL3ByYWN0aWNlX0EyLnhtaSIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iX1NOTWQ4QS1WRWRxTDJPMVBKVjljWkEiIGlkPSItUjlzUXpvSmpRbTQtTkJ4VXFhTFdMZyIgdXJpPSJndWlkYW5jZXMvcHJhY3RpY2VzL3ByYWN0aWNlX0EyLjEueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfWXZLOU1BLVZFZHFMMk8xUEpWOWNaQSIgaWQ9Ii03Z2xHWWlKYXM5aFpHa0o5Y2NRNUtRIiB1cmk9Imd1aWRhbmNlcy9yZXVzYWJsZWFzc2V0cy9yZXVzYWJsZV9hc3NldF9BMi54bWkiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il9vSC02UUEtVkVkcUwyTzFQSlY5Y1pBIiBpZD0iLUowc3p3cktiaUwySm0tRmlmUXRJOXciIHVyaT0iZ3VpZGFuY2VzL3JvYWRtYXBzL3JvYWRtYXBfQTIueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfcnlycVlBLVZFZHFMMk8xUEpWOWNaQSIgaWQ9Ii04QlBSSWdfU2JIVHdRQWlBWnk4M1B3IiB1cmk9Imd1aWRhbmNlcy90ZXJtZGVmaW5pdGlvbnMvdGVybV9kZWZpbml0aW9uX0EyLnhtaSIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iXzJhVS1nQS1WRWRxTDJPMVBKVjljWkEiIGlkPSItTnZjdFN1bTdtbU80cV8wOGdMcEQ1QSIgdXJpPSJndWlkYW5jZXMvdGVybWRlZmluaXRpb25zL3Rlcm1fZGVmaW5pdGlvbl9BMS54bWkiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il9DNWRfd1EtV0VkcUwyTzFQSlY5Y1pBIiBpZD0iLW11QWtYREpmb19LYlJGNEtPYm45T1EiIHVyaT0iZGlzY2lwbGluZWdyb3VwaW5ncy9kaXNjaXBsaW5lX2dyb3VwaW5nX0ExLnhtaSIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iX0QxWU9ZQS1XRWRxTDJPMVBKVjljWkEiIGlkPSItR2FHbDVrSEo0eEtDX1NoZzZaMTZaZyIgdXJpPSJkaXNjaXBsaW5lcy9kaXNjaXBsaW5lX0ExLnhtaSIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iX0VaSkN3QS1XRWRxTDJPMVBKVjljWkEiIGlkPSItUTBsaWE1eUV5TlhXZC1LTko2Y0dyQSIgdXJpPSJkaXNjaXBsaW5lcy9kaXNjaXBsaW5lX0EyLnhtaSIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iX0ZxcEc0QS1XRWRxTDJPMVBKVjljWkEiIGlkPSItTzEzVXVKYjhHcUJMVnRXYVVxZ3FSdyIgdXJpPSJkb21haW5zL2RvbWFpbl9BMS54bWkiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il9HT3RkUUEtV0VkcUwyTzFQSlY5Y1pBIiBpZD0iLTNoWUp5cjNUcWlNZzZRZHk5QVhJeHciIHVyaT0iZG9tYWlucy9kb21haW5fQTIueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfRzVCbGtBLVdFZHFMMk8xUEpWOWNaQSIgaWQ9Ii1LRDcyRW81bE1NUHA3YlM4b1BCdlB3IiB1cmk9ImRvbWFpbnMvc3ViX2RvbWFpbl9BMS4xLnhtaSIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iX0lHTnhjQS1XRWRxTDJPMVBKVjljWkEiIGlkPSItVGZSRG9IaXNtc2hqOGNMMmxPUnRjZyIgdXJpPSJ3b3JrcHJvZHVjdHR5cGVzL3dvcmtfcHJvZHVjdF90eXBlX0ExLnhtaSIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iX0pZNnZjQS1XRWRxTDJPMVBKVjljWkEiIGlkPSItY2xmREEwUE02eExJanloU3AxaUxRUSIgdXJpPSJ3b3JrcHJvZHVjdHR5cGVzL3dvcmtfcHJvZHVjdF90eXBlX0EyLnhtaSIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iX0tHendNQS1XRWRxTDJPMVBKVjljWkEiIGlkPSItRlY5OUswVk03ZjRjbEFVa1lib0ZPUSIgdXJpPSJyb2xlc2V0Z3JvdXBpbmdzL3JvbGVfc2V0X2dyb3VwaW5nX0ExLnhtaSIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iX0xoMng0QS1XRWRxTDJPMVBKVjljWkEiIGlkPSIteTA0d1BFMTAtU0I4aUZudTVjWGFNQSIgdXJpPSJ0b29scy90b29sX0ExLnhtaSIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iX01LWXhnQS1XRWRxTDJPMVBKVjljWkEiIGlkPSItenpCUC01NEd1UVdmVlR6NjBTZFFzdyIgdXJpPSJ0b29scy90b29sX0EyLnhtaSIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iX09TbDBJQS1XRWRxTDJPMVBKVjljWkEiIGlkPSItNVJUSzFHT2ZCbTJjY09qbjFpbmZzdyIgdXJpPSJjdXN0b21jYXRlZ29yaWVzL2N1c3RvbV9jYXRlZ29yeV9BMS54bWkiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il9UUXVpRUEtV0VkcUwyTzFQSlY5Y1pBIiBpZD0iLVZwaHo2NVoxQjktcklNSktqWDdoMEEiIHVyaT0iY3VzdG9tY2F0ZWdvcmllcy9jdXN0b21fY2F0ZWdvcnlfQTIueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfOVA4d1FCQktFZHFCczdLaGRWTFJMQSIgaWQ9Ii1qcVNyYkZaWTlHYjRqcERpWVNaY0ZRIiB1cmk9ImN1c3RvbWNhdGVnb3JpZXMvc3ViX2N1c3RvbV9jYXRlZ29yeV9BMS4xLnhtaSIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iXy11NE1ZQkJLRWRxQnM3S2hkVkxSTEEiIGlkPSItV0dhOU5RSi1iTTVVWjBKdVlfQUVQdyIgdXJpPSJyb2xlc2V0cy9yb2xlX3NldF9BMS54bWkiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il9fWGFNQUJCS0VkcUJzN0toZFZMUkxBIiBpZD0iLUxSR2xlSElwTnM1TWI5UUFPR2ZaUXciIHVyaT0icm9sZXNldHMvcm9sZV9zZXRfQTIueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfVzYza1lCQk5FZHFCczdLaGRWTFJMQSIgaWQ9Il9XNmE0Y0JCTkVkcUJzN0toZFZMUkxBIiB1cmk9ImRlbGl2ZXJ5cHJvY2Vzc2VzL2RlbFByb2NfQTEvbW9kZWwueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfYUlmLUFCQk5FZHFCczdLaGRWTFJMQSIgaWQ9Il9hSFVTUUJCTkVkcUJzN0toZFZMUkxBIiB1cmk9ImNhcGFiaWxpdHlwYXR0ZXJucy9DUCUyMGV4dGVuZGluZyUyMCdDUDElMjB3aXRoJTIwYWxsJTIwZWxlbWVudHMnL21vZGVsLnhtaSIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iX3VzaUpzQk0xRWRxcW5kaS1nRHV4cHciIGlkPSJfdXE1SzhCTTFFZHFxbmRpLWdEdXhwdyIgdXJpPSJkZWxpdmVyeXByb2Nlc3Nlcy9kZWxQcm9jUGFrX0ExLjEvbW9kZWwueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfNHRGUGdEemdFZHE1eXNGT05yMUJHUSIgaWQ9Il80c0N0c0R6Z0VkcTV5c0ZPTnIxQkdRIiB1cmk9ImNhcGFiaWxpdHlwYXR0ZXJucy9DUDElMjB3aXRoJTIwYWxsJTIwZWxlbWVudHMvbW9kZWwueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfZER3a01FQXZFZHFGcUl1OC1ja29sZyIgaWQ9Il9kQmh2a0VBdkVkcUZxSXU4LWNrb2xnIiB1cmk9ImNhcGFiaWxpdHlwYXR0ZXJucy9DUCUyMEExL21vZGVsLnhtaSIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iX1p1YjlBRURGRWRxTzlNM2Z1a1lBX0EiIGlkPSJfWnRaYk1FREZFZHFPOU0zZnVrWUFfQSIgdXJpPSJjYXBhYmlsaXR5cGF0dGVybnMvQ1AyJTIwY29udGFpbmluZyUyMHZhcmlhYmlsaXR5JTIwZWxlbWVudHMvbW9kZWwueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfd1dGZlVFREZFZHFPOU0zZnVrWUFfQSIgaWQ9Ii1iUjlUWDFiWjZXOVJZNUl2SVBHVWpnIiB1cmk9InRhc2tzL3Rhc2tfQTMueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfX0NNdWNFREZFZHFPOU0zZnVrWUFfQSIgaWQ9Ii1ZdW1kc1VPSEZWaEdrZXd3SUNOZGd3IiB1cmk9InJvbGVzL3JvbGVfQTMueG1pIi8+Ci0gIDwvb3JnLmVjbGlwc2UuZXBmLnVtYS5yZXNvdXJjZW1hbmFnZXI6UmVzb3VyY2VNYW5hZ2VyPgotICA8b3JnLmVjbGlwc2UuZXBmLnVtYTpNZXRob2RQbHVnaW4geG1pOmlkPSJfeVVlTElBLVBFZHFMMk8xUEpWOWNaQSIgbmFtZT0iUGx1ZyBBIiBndWlkPSJfeVVlTElBLVBFZHFMMk8xUEpWOWNaQSIgYnJpZWZEZXNjcmlwdGlvbj0iUGx1ZyBBIGJyaWVmIiBhdXRob3JzPSJQbHVnIEEgQXJ0aHVyIj4KLSAgICA8bWV0aG9kUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iX3lVZUxJUS1QRWRxTDJPMVBKVjljWkEiIG5hbWU9IkNvbnRlbnQiIGd1aWQ9Il95VWVMSVEtUEVkcUwyTzFQSlY5Y1pBIj4KLSAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il95VWVMSWctUEVkcUwyTzFQSlY5Y1pBIiBuYW1lPSJDYXRlZ29yaWVzIiBndWlkPSJfeVVlTElnLVBFZHFMMk8xUEpWOWNaQSI+Ci0gICAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il95VWVMSXctUEVkcUwyTzFQSlY5Y1pBIiBuYW1lPSJEb21haW5zIiBndWlkPSJfeVVlTEl3LVBFZHFMMk8xUEpWOWNaQSI+Ci0gICAgICAgICAgPGNvbnRlbnRFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpEb21haW4iIHhtaTppZD0iX0ZFek80QS1XRWRxTDJPMVBKVjljWkEiIG5hbWU9ImRvbWFpbl9BMSIgZ3VpZD0iX0ZFek80QS1XRWRxTDJPMVBKVjljWkEiIGJyaWVmRGVzY3JpcHRpb249IkRvbWFpbiBBMSBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iRG9tYWluIEExIHByZXNlbnQiIHN1cHBvcnRpbmdNYXRlcmlhbHM9Il9hRnB2VUEtU0VkcUwyTzFQSlY5Y1pBIiBjb25jZXB0c0FuZFBhcGVycz0iX05ETC1rQS1TRWRxTDJPMVBKVjljWkEgX2g4UkdRQS1TRWRxTDJPMVBKVjljWkEiIGNoZWNrbGlzdHM9Il9LVjRxMEEtU0VkcUwyTzFQSlY5Y1pBIiBndWlkZWxpbmVzPSJfT2tDdFVBLVNFZHFMMk8xUEpWOWNaQSIgZXhhbXBsZXM9Il9PQnh0d0EtU0VkcUwyTzFQSlY5Y1pBIiBhc3NldHM9Il9UVjBhUUEtU0VkcUwyTzFQSlY5Y1pBIiB3b3JrUHJvZHVjdHM9Il9JSVNuVUEtUkVkcUwyTzFQSlY5Y1pBIF9LQV8xWUEtUkVkcUwyTzFQSlY5Y1pBIj4KLSAgICAgICAgICAgIDxwcmVzZW50YXRpb24geG1pOmlkPSItTzEzVXVKYjhHcUJMVnRXYVVxZ3FSdyIgaHJlZj0idW1hOi8vLU8xM1V1SmI4R3FCTFZ0V2FVcWdxUncjLU8xM1V1SmI4R3FCTFZ0V2FVcWdxUnciLz4KLSAgICAgICAgICAgIDxzdWJkb21haW5zIHhtaTppZD0iX0dPWjdRQS1XRWRxTDJPMVBKVjljWkEiIG5hbWU9InN1Yl9kb21haW5fQTEuMSIgZ3VpZD0iX0dPWjdRQS1XRWRxTDJPMVBKVjljWkEiIGJyaWVmRGVzY3JpcHRpb249IlN1Yi1Eb21haW4gQTEuMSBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iU3ViLURvbWFpbiBBMS4xIHByZXNlbnQiIHN1cHBvcnRpbmdNYXRlcmlhbHM9Il9hRnB2VUEtU0VkcUwyTzFQSlY5Y1pBIiBjb25jZXB0c0FuZFBhcGVycz0iX05ETC1rQS1TRWRxTDJPMVBKVjljWkEgX2g4UkdRQS1TRWRxTDJPMVBKVjljWkEiIGNoZWNrbGlzdHM9Il9LVjRxMEEtU0VkcUwyTzFQSlY5Y1pBIiBndWlkZWxpbmVzPSJfT2tDdFVBLVNFZHFMMk8xUEpWOWNaQSIgZXhhbXBsZXM9Il9PQnh0d0EtU0VkcUwyTzFQSlY5Y1pBIiBhc3NldHM9Il9UVjBhUUEtU0VkcUwyTzFQSlY5Y1pBIiB3b3JrUHJvZHVjdHM9Il9GNTF5d0EtUkVkcUwyTzFQSlY5Y1pBIj4KLSAgICAgICAgICAgICAgPHByZXNlbnRhdGlvbiB4bWk6aWQ9Ii1LRDcyRW81bE1NUHA3YlM4b1BCdlB3IiBocmVmPSJ1bWE6Ly8tS0Q3MkVvNWxNTVBwN2JTOG9QQnZQdyMtS0Q3MkVvNWxNTVBwN2JTOG9QQnZQdyIvPgotICAgICAgICAgICAgPC9zdWJkb21haW5zPgotICAgICAgICAgIDwvY29udGVudEVsZW1lbnRzPgotICAgICAgICAgIDxjb250ZW50RWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6RG9tYWluIiB4bWk6aWQ9Il9GcVdMOEEtV0VkcUwyTzFQSlY5Y1pBIiBuYW1lPSJkb21haW5fQTIiIGd1aWQ9Il9GcVdMOEEtV0VkcUwyTzFQSlY5Y1pBIiBicmllZkRlc2NyaXB0aW9uPSJEb21haW4gQTIgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IkRvbWFpbiBBMiBwcmVzZW50IiBzdXBwb3J0aW5nTWF0ZXJpYWxzPSJfbVBzX2NBLVVFZHFMMk8xUEpWOWNaQSIgY29uY2VwdHNBbmRQYXBlcnM9Il9PVkxWY0EtVEVkcUwyTzFQSlY5Y1pBIF8zWHIwRUEtVUVkcUwyTzFQSlY5Y1pBIiBjaGVja2xpc3RzPSJfa3JpVGNBLVRFZHFMMk8xUEpWOWNaQSIgZ3VpZGVsaW5lcz0iXzZZVXdBQS1URWRxTDJPMVBKVjljWkEiIGV4YW1wbGVzPSJfdWFqV2NBLVRFZHFMMk8xUEpWOWNaQSIgYXNzZXRzPSJfU01jM0VBLVZFZHFMMk8xUEpWOWNaQSIgd29ya1Byb2R1Y3RzPSJfOUt0NzhBLVBFZHFMMk8xUEpWOWNaQSBfSEVNdEVBLVJFZHFMMk8xUEpWOWNaQSBfRTdaMGtBLVJFZHFMMk8xUEpWOWNaQSBfSkJxZlVBLVJFZHFMMk8xUEpWOWNaQSBfS3ZMeEVBLVJFZHFMMk8xUEpWOWNaQSI+Ci0gICAgICAgICAgICA8cHJlc2VudGF0aW9uIHhtaTppZD0iLTNoWUp5cjNUcWlNZzZRZHk5QVhJeHciIGhyZWY9InVtYTovLy0zaFlKeXIzVHFpTWc2UWR5OUFYSXh3Iy0zaFlKeXIzVHFpTWc2UWR5OUFYSXh3Ii8+Ci0gICAgICAgICAgPC9jb250ZW50RWxlbWVudHM+Ci0gICAgICAgIDwvY2hpbGRQYWNrYWdlcz4KLSAgICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iX3lVZUxKQS1QRWRxTDJPMVBKVjljWkEiIG5hbWU9IkRpc2NpcGxpbmVzIiBndWlkPSJfeVVlTEpBLVBFZHFMMk8xUEpWOWNaQSI+Ci0gICAgICAgICAgPGNvbnRlbnRFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpEaXNjaXBsaW5lR3JvdXBpbmciIHhtaTppZD0iX0NDVmpjQS1XRWRxTDJPMVBKVjljWkEiIG5hbWU9ImRpc2NpcGxpbmVfZ3JvdXBpbmdfQTEiIGd1aWQ9Il9DQ1ZqY0EtV0VkcUwyTzFQSlY5Y1pBIiBicmllZkRlc2NyaXB0aW9uPSJEaXNjaXBsaW5lIEdyb3VwaW5nIEExIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJEaXNjaXBsaW5lIEdyb3VwaW5nIEExIHByZXNlbnQiIGRpc2NpcGxpbmVzPSJfQzVkX3dBLVdFZHFMMk8xUEpWOWNaQSI+Ci0gICAgICAgICAgICA8cHJlc2VudGF0aW9uIHhtaTppZD0iLW11QWtYREpmb19LYlJGNEtPYm45T1EiIGhyZWY9InVtYTovLy1tdUFrWERKZm9fS2JSRjRLT2JuOU9RIy1tdUFrWERKZm9fS2JSRjRLT2JuOU9RIi8+Ci0gICAgICAgICAgPC9jb250ZW50RWxlbWVudHM+Ci0gICAgICAgICAgPGNvbnRlbnRFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpEaXNjaXBsaW5lIiB4bWk6aWQ9Il9DNWRfd0EtV0VkcUwyTzFQSlY5Y1pBIiBuYW1lPSJkaXNjaXBsaW5lX0ExIiBndWlkPSJfQzVkX3dBLVdFZHFMMk8xUEpWOWNaQSIgYnJpZWZEZXNjcmlwdGlvbj0iRGlzY2lwbGluZSBBMSBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iRGlzY2lwbGluZSBBMSBwcmVzZW50IiBzdXBwb3J0aW5nTWF0ZXJpYWxzPSJfYUZwdlVBLVNFZHFMMk8xUEpWOWNaQSIgY29uY2VwdHNBbmRQYXBlcnM9Il9OREwta0EtU0VkcUwyTzFQSlY5Y1pBIF9oOFJHUUEtU0VkcUwyTzFQSlY5Y1pBIiBjaGVja2xpc3RzPSJfS1Y0cTBBLVNFZHFMMk8xUEpWOWNaQSIgZ3VpZGVsaW5lcz0iX09rQ3RVQS1TRWRxTDJPMVBKVjljWkEiIGV4YW1wbGVzPSJfT0J4dHdBLVNFZHFMMk8xUEpWOWNaQSIgYXNzZXRzPSJfVFYwYVFBLVNFZHFMMk8xUEpWOWNaQSIgdGFza3M9Il83TThuc0EtUEVkcUwyTzFQSlY5Y1pBIj4KLSAgICAgICAgICAgIDxwcmVzZW50YXRpb24geG1pOmlkPSItR2FHbDVrSEo0eEtDX1NoZzZaMTZaZyIgaHJlZj0idW1hOi8vLUdhR2w1a0hKNHhLQ19TaGc2WjE2WmcjLUdhR2w1a0hKNHhLQ19TaGc2WjE2WmciLz4KLSAgICAgICAgICA8L2NvbnRlbnRFbGVtZW50cz4KLSAgICAgICAgICA8Y29udGVudEVsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkRpc2NpcGxpbmUiIHhtaTppZD0iX0R6dlBvQS1XRWRxTDJPMVBKVjljWkEiIG5hbWU9ImRpc2NpcGxpbmVfQTIiIGd1aWQ9Il9EenZQb0EtV0VkcUwyTzFQSlY5Y1pBIiBicmllZkRlc2NyaXB0aW9uPSJEaXNjaXBsaW5lIEEyIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJEaXNjaXBsaW5lIEEyIHByZXNlbnQiIHN1cHBvcnRpbmdNYXRlcmlhbHM9Il9tUHNfY0EtVUVkcUwyTzFQSlY5Y1pBIiBjb25jZXB0c0FuZFBhcGVycz0iX09WTFZjQS1URWRxTDJPMVBKVjljWkEgXzNYcjBFQS1VRWRxTDJPMVBKVjljWkEiIGNoZWNrbGlzdHM9Il9rcmlUY0EtVEVkcUwyTzFQSlY5Y1pBIiBndWlkZWxpbmVzPSJfNllVd0FBLVRFZHFMMk8xUEpWOWNaQSIgZXhhbXBsZXM9Il91YWpXY0EtVEVkcUwyTzFQSlY5Y1pBIiBhc3NldHM9Il9TTWMzRUEtVkVkcUwyTzFQSlY5Y1pBIiB0YXNrcz0iXzc1TlF3QS1QRWRxTDJPMVBKVjljWkEiPgotICAgICAgICAgICAgPHByZXNlbnRhdGlvbiB4bWk6aWQ9Ii1RMGxpYTV5RXlOWFdkLUtOSjZjR3JBIiBocmVmPSJ1bWE6Ly8tUTBsaWE1eUV5TlhXZC1LTko2Y0dyQSMtUTBsaWE1eUV5TlhXZC1LTko2Y0dyQSIvPgotICAgICAgICAgIDwvY29udGVudEVsZW1lbnRzPgotICAgICAgICA8L2NoaWxkUGFja2FnZXM+Ci0gICAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il95VWVMSlEtUEVkcUwyTzFQSlY5Y1pBIiBuYW1lPSJSb2xlU2V0cyIgZ3VpZD0iX3lVZUxKUS1QRWRxTDJPMVBKVjljWkEiPgotICAgICAgICAgIDxjb250ZW50RWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Um9sZVNldEdyb3VwaW5nIiB4bWk6aWQ9Il9KWW4wZ0EtV0VkcUwyTzFQSlY5Y1pBIiBuYW1lPSJyb2xlX3NldF9ncm91cGluZ19BMSIgZ3VpZD0iX0pZbjBnQS1XRWRxTDJPMVBKVjljWkEiIGJyaWVmRGVzY3JpcHRpb249IlJvbGUgU2V0IEdyb3VwaW5nIEExIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJSb2xlIFNldCBHcm91cGluZyBBMSBwcmVzZW50IiByb2xlU2V0cz0iXzlQcDFVQkJLRWRxQnM3S2hkVkxSTEEiPgotICAgICAgICAgICAgPHByZXNlbnRhdGlvbiB4bWk6aWQ9Ii1GVjk5SzBWTTdmNGNsQVVrWWJvRk9RIiBocmVmPSJ1bWE6Ly8tRlY5OUswVk03ZjRjbEFVa1lib0ZPUSMtRlY5OUswVk03ZjRjbEFVa1lib0ZPUSIvPgotICAgICAgICAgIDwvY29udGVudEVsZW1lbnRzPgotICAgICAgICAgIDxjb250ZW50RWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Um9sZVNldCIgeG1pOmlkPSJfOVBwMVVCQktFZHFCczdLaGRWTFJMQSIgbmFtZT0icm9sZV9zZXRfQTEiIGd1aWQ9Il85UHAxVUJCS0VkcUJzN0toZFZMUkxBIiBicmllZkRlc2NyaXB0aW9uPSJSb2xlIFNldCBBMSBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iUm9sZSBTZXQgQTEgcHJlc2VudCIgc3VwcG9ydGluZ01hdGVyaWFscz0iX2FGcHZVQS1TRWRxTDJPMVBKVjljWkEiIGNvbmNlcHRzQW5kUGFwZXJzPSJfTkRMLWtBLVNFZHFMMk8xUEpWOWNaQSBfaDhSR1FBLVNFZHFMMk8xUEpWOWNaQSIgY2hlY2tsaXN0cz0iX0tWNHEwQS1TRWRxTDJPMVBKVjljWkEiIGd1aWRlbGluZXM9Il9Pa0N0VUEtU0VkcUwyTzFQSlY5Y1pBIiBleGFtcGxlcz0iX09CeHR3QS1TRWRxTDJPMVBKVjljWkEiIGFzc2V0cz0iX1RWMGFRQS1TRWRxTDJPMVBKVjljWkEiIHJvbGVzPSJfNTV6azBBLVBFZHFMMk8xUEpWOWNaQSI+Ci0gICAgICAgICAgICA8cHJlc2VudGF0aW9uIHhtaTppZD0iLVdHYTlOUUotYk01VVowSnVZX0FFUHciIGhyZWY9InVtYTovLy1XR2E5TlFKLWJNNVVaMEp1WV9BRVB3Iy1XR2E5TlFKLWJNNVVaMEp1WV9BRVB3Ii8+Ci0gICAgICAgICAgPC9jb250ZW50RWxlbWVudHM+Ci0gICAgICAgICAgPGNvbnRlbnRFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpSb2xlU2V0IiB4bWk6aWQ9Il8tdWJnY0JCS0VkcUJzN0toZFZMUkxBIiBuYW1lPSJyb2xlX3NldF9BMiIgZ3VpZD0iXy11YmdjQkJLRWRxQnM3S2hkVkxSTEEiIGJyaWVmRGVzY3JpcHRpb249IlJvbGUgU2V0IEEyIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJSb2xlIFNldCBBMiBwcmVzZW50IiBzdXBwb3J0aW5nTWF0ZXJpYWxzPSJfbVBzX2NBLVVFZHFMMk8xUEpWOWNaQSIgY29uY2VwdHNBbmRQYXBlcnM9Il9PVkxWY0EtVEVkcUwyTzFQSlY5Y1pBIF8zWHIwRUEtVUVkcUwyTzFQSlY5Y1pBIiBjaGVja2xpc3RzPSJfa3JpVGNBLVRFZHFMMk8xUEpWOWNaQSIgZ3VpZGVsaW5lcz0iXzZZVXdBQS1URWRxTDJPMVBKVjljWkEiIGV4YW1wbGVzPSJfdWFqV2NBLVRFZHFMMk8xUEpWOWNaQSIgYXNzZXRzPSJfU01jM0VBLVZFZHFMMk8xUEpWOWNaQSIgcm9sZXM9Il82azNVQUEtUEVkcUwyTzFQSlY5Y1pBIj4KLSAgICAgICAgICAgIDxwcmVzZW50YXRpb24geG1pOmlkPSItTFJHbGVISXBOczVNYjlRQU9HZlpRdyIgaHJlZj0idW1hOi8vLUxSR2xlSElwTnM1TWI5UUFPR2ZaUXcjLUxSR2xlSElwTnM1TWI5UUFPR2ZaUXciLz4KLSAgICAgICAgICA8L2NvbnRlbnRFbGVtZW50cz4KLSAgICAgICAgPC9jaGlsZFBhY2thZ2VzPgotICAgICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfeVVlTEpnLVBFZHFMMk8xUEpWOWNaQSIgbmFtZT0iV1AgVHlwZXMiIGd1aWQ9Il95VWVMSmctUEVkcUwyTzFQSlY5Y1pBIj4KLSAgICAgICAgICA8Y29udGVudEVsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOldvcmtQcm9kdWN0VHlwZSIgeG1pOmlkPSJfSGdoRFlBLVdFZHFMMk8xUEpWOWNaQSIgbmFtZT0id29ya19wcm9kdWN0X3R5cGVfQTEiIGd1aWQ9Il9IZ2hEWUEtV0VkcUwyTzFQSlY5Y1pBIiBicmllZkRlc2NyaXB0aW9uPSJXb3JrIFByb2R1Y3QgVHlwZSBBMSBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iV29yayBQcm9kdWN0IFR5cGUgQTEgcHJlc2VudCIgc3VwcG9ydGluZ01hdGVyaWFscz0iX2FGcHZVQS1TRWRxTDJPMVBKVjljWkEiIGNvbmNlcHRzQW5kUGFwZXJzPSJfTkRMLWtBLVNFZHFMMk8xUEpWOWNaQSBfaDhSR1FBLVNFZHFMMk8xUEpWOWNaQSIgY2hlY2tsaXN0cz0iX0tWNHEwQS1TRWRxTDJPMVBKVjljWkEiIGd1aWRlbGluZXM9Il9Pa0N0VUEtU0VkcUwyTzFQSlY5Y1pBIiBleGFtcGxlcz0iX09CeHR3QS1TRWRxTDJPMVBKVjljWkEiIGFzc2V0cz0iX1RWMGFRQS1TRWRxTDJPMVBKVjljWkEiIHdvcmtQcm9kdWN0cz0iXzlLdDc4QS1QRWRxTDJPMVBKVjljWkEgX0Y1MXl3QS1SRWRxTDJPMVBKVjljWkEgX0lJU25VQS1SRWRxTDJPMVBKVjljWkEgX0tBXzFZQS1SRWRxTDJPMVBKVjljWkEiPgotICAgICAgICAgICAgPHByZXNlbnRhdGlvbiB4bWk6aWQ9Ii1UZlJEb0hpc21zaGo4Y0wybE9SdGNnIiBocmVmPSJ1bWE6Ly8tVGZSRG9IaXNtc2hqOGNMMmxPUnRjZyMtVGZSRG9IaXNtc2hqOGNMMmxPUnRjZyIvPgotICAgICAgICAgIDwvY29udGVudEVsZW1lbnRzPgotICAgICAgICAgIDxjb250ZW50RWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6V29ya1Byb2R1Y3RUeXBlIiB4bWk6aWQ9Il9JRm5VZ0EtV0VkcUwyTzFQSlY5Y1pBIiBuYW1lPSJ3b3JrX3Byb2R1Y3RfdHlwZV9BMiIgZ3VpZD0iX0lGblVnQS1XRWRxTDJPMVBKVjljWkEiIGJyaWVmRGVzY3JpcHRpb249IldvcmsgUHJvZHVjdCBUeXBlIEExIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJXb3JrIFByb2R1Y3QgVHlwZSBBMiBwcmVzZW50IiBzdXBwb3J0aW5nTWF0ZXJpYWxzPSJfbVBzX2NBLVVFZHFMMk8xUEpWOWNaQSIgY29uY2VwdHNBbmRQYXBlcnM9Il9PVkxWY0EtVEVkcUwyTzFQSlY5Y1pBIF8zWHIwRUEtVUVkcUwyTzFQSlY5Y1pBIiBjaGVja2xpc3RzPSJfa3JpVGNBLVRFZHFMMk8xUEpWOWNaQSIgZ3VpZGVsaW5lcz0iXzZZVXdBQS1URWRxTDJPMVBKVjljWkEiIGV4YW1wbGVzPSJfdWFqV2NBLVRFZHFMMk8xUEpWOWNaQSIgYXNzZXRzPSJfU01jM0VBLVZFZHFMMk8xUEpWOWNaQSIgd29ya1Byb2R1Y3RzPSJfRTdaMGtBLVJFZHFMMk8xUEpWOWNaQSBfSEVNdEVBLVJFZHFMMk8xUEpWOWNaQSBfSkJxZlVBLVJFZHFMMk8xUEpWOWNaQSBfS3ZMeEVBLVJFZHFMMk8xUEpWOWNaQSI+Ci0gICAgICAgICAgICA8cHJlc2VudGF0aW9uIHhtaTppZD0iLWNsZkRBMFBNNnhMSWp5aFNwMWlMUVEiIGhyZWY9InVtYTovLy1jbGZEQTBQTTZ4TElqeWhTcDFpTFFRIy1jbGZEQTBQTTZ4TElqeWhTcDFpTFFRIi8+Ci0gICAgICAgICAgPC9jb250ZW50RWxlbWVudHM+Ci0gICAgICAgIDwvY2hpbGRQYWNrYWdlcz4KLSAgICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iX3lVZUxKdy1QRWRxTDJPMVBKVjljWkEiIG5hbWU9IlRvb2xzIiBndWlkPSJfeVVlTEp3LVBFZHFMMk8xUEpWOWNaQSI+Ci0gICAgICAgICAgPGNvbnRlbnRFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpUb29sIiB4bWk6aWQ9Il9LeGJhZ0EtV0VkcUwyTzFQSlY5Y1pBIiBuYW1lPSJ0b29sX0ExIiBndWlkPSJfS3hiYWdBLVdFZHFMMk8xUEpWOWNaQSIgYnJpZWZEZXNjcmlwdGlvbj0iVG9vbCBBMSBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iVG9vbCBBMSBwcmVzZW50IiBzdXBwb3J0aW5nTWF0ZXJpYWxzPSJfYUZwdlVBLVNFZHFMMk8xUEpWOWNaQSIgY29uY2VwdHNBbmRQYXBlcnM9Il9OREwta0EtU0VkcUwyTzFQSlY5Y1pBIF9oOFJHUUEtU0VkcUwyTzFQSlY5Y1pBIiBjaGVja2xpc3RzPSJfS1Y0cTBBLVNFZHFMMk8xUEpWOWNaQSIgZ3VpZGVsaW5lcz0iX09rQ3RVQS1TRWRxTDJPMVBKVjljWkEiIGV4YW1wbGVzPSJfT0J4dHdBLVNFZHFMMk8xUEpWOWNaQSIgYXNzZXRzPSJfVFYwYVFBLVNFZHFMMk8xUEpWOWNaQSIgdG9vbE1lbnRvcnM9Il9oSEVqb0EtU0VkcUwyTzFQSlY5Y1pBIj4KLSAgICAgICAgICAgIDxwcmVzZW50YXRpb24geG1pOmlkPSIteTA0d1BFMTAtU0I4aUZudTVjWGFNQSIgaHJlZj0idW1hOi8vLXkwNHdQRTEwLVNCOGlGbnU1Y1hhTUEjLXkwNHdQRTEwLVNCOGlGbnU1Y1hhTUEiLz4KLSAgICAgICAgICA8L2NvbnRlbnRFbGVtZW50cz4KLSAgICAgICAgICA8Y29udGVudEVsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlRvb2wiIHhtaTppZD0iX0xoYUY4QS1XRWRxTDJPMVBKVjljWkEiIG5hbWU9InRvb2xfQTIiIGd1aWQ9Il9MaGFGOEEtV0VkcUwyTzFQSlY5Y1pBIiBicmllZkRlc2NyaXB0aW9uPSJUb29sIEEyIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJUb29sIEEyIHByZXNlbnQiIHN1cHBvcnRpbmdNYXRlcmlhbHM9Il9tUHNfY0EtVUVkcUwyTzFQSlY5Y1pBIiBjb25jZXB0c0FuZFBhcGVycz0iX09WTFZjQS1URWRxTDJPMVBKVjljWkEgXzNYcjBFQS1VRWRxTDJPMVBKVjljWkEiIGNoZWNrbGlzdHM9Il9rcmlUY0EtVEVkcUwyTzFQSlY5Y1pBIiBndWlkZWxpbmVzPSJfNllVd0FBLVRFZHFMMk8xUEpWOWNaQSIgZXhhbXBsZXM9Il91YWpXY0EtVEVkcUwyTzFQSlY5Y1pBIiBhc3NldHM9Il9TTWMzRUEtVkVkcUwyTzFQSlY5Y1pBIiB0b29sTWVudG9ycz0iX3Y3SktBQS1VRWRxTDJPMVBKVjljWkEiPgotICAgICAgICAgICAgPHByZXNlbnRhdGlvbiB4bWk6aWQ9Ii16ekJQLTU0R3VRV2ZWVHo2MFNkUXN3IiBocmVmPSJ1bWE6Ly8tenpCUC01NEd1UVdmVlR6NjBTZFFzdyMtenpCUC01NEd1UVdmVlR6NjBTZFFzdyIvPgotICAgICAgICAgIDwvY29udGVudEVsZW1lbnRzPgotICAgICAgICA8L2NoaWxkUGFja2FnZXM+Ci0gICAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il95VWVMS0EtUEVkcUwyTzFQSlY5Y1pBIiBuYW1lPSJTdGFuZGFyZENhdGVnb3JpZXMiIGd1aWQ9Il95VWVMS0EtUEVkcUwyTzFQSlY5Y1pBIi8+Ci0gICAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il95VWVMS1EtUEVkcUwyTzFQSlY5Y1pBIiBuYW1lPSJDdXN0b21DYXRlZ29yaWVzIiBndWlkPSJfeVVlTEtRLVBFZHFMMk8xUEpWOWNaQSI+Ci0gICAgICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iX3lVZUxLZy1QRWRxTDJPMVBKVjljWkEiIG5hbWU9IkhpZGRlbiIgZ3VpZD0iX3lVZUxLZy1QRWRxTDJPMVBKVjljWkEiPgotICAgICAgICAgICAgPGNvbnRlbnRFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDdXN0b21DYXRlZ29yeSIgeG1pOmlkPSJfeVVlTEt3LVBFZHFMMk8xUEpWOWNaQSIgbmFtZT0iQ3VzdG9tIENhdGVnb3JpZXMiIGd1aWQ9Il95VWVMS3ctUEVkcUwyTzFQSlY5Y1pBIiBjYXRlZ29yaXplZEVsZW1lbnRzPSJfTUtQbmtBLVdFZHFMMk8xUEpWOWNaQSBfT1NTU0lBLVdFZHFMMk8xUEpWOWNaQSIvPgotICAgICAgICAgIDwvY2hpbGRQYWNrYWdlcz4KLSAgICAgICAgICA8Y29udGVudEVsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkN1c3RvbUNhdGVnb3J5IiB4bWk6aWQ9Il9NS1Bua0EtV0VkcUwyTzFQSlY5Y1pBIiBuYW1lPSJjdXN0b21fY2F0ZWdvcnlfQTEiIGd1aWQ9Il9NS1Bua0EtV0VkcUwyTzFQSlY5Y1pBIiBicmllZkRlc2NyaXB0aW9uPSJDdXN0b20gQ2F0ZWdvcnkgQTEgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IkN1c3RvbSBDYXRlZ29yeSBBMSBwcmVzZW50Ij4KLSAgICAgICAgICAgIDxwcmVzZW50YXRpb24geG1pOmlkPSItNVJUSzFHT2ZCbTJjY09qbjFpbmZzdyIgaHJlZj0idW1hOi8vLTVSVEsxR09mQm0yY2NPam4xaW5mc3cjLTVSVEsxR09mQm0yY2NPam4xaW5mc3ciLz4KLSAgICAgICAgICAgIDxjYXRlZ29yaXplZEVsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkN1c3RvbUNhdGVnb3J5IiBocmVmPSIjXzdkWFlVQkJLRWRxQnM3S2hkVkxSTEEiLz4KLSAgICAgICAgICAgIDxjYXRlZ29yaXplZEVsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlJvbGUiIGhyZWY9IiNfNTV6azBBLVBFZHFMMk8xUEpWOWNaQSIvPgotICAgICAgICAgICAgPGNhdGVnb3JpemVkRWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VGFzayIgaHJlZj0iI183TThuc0EtUEVkcUwyTzFQSlY5Y1pBIi8+Ci0gICAgICAgICAgICA8Y2F0ZWdvcml6ZWRFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpBcnRpZmFjdCIgaHJlZj0iI185S3Q3OEEtUEVkcUwyTzFQSlY5Y1pBIi8+Ci0gICAgICAgICAgICA8Y2F0ZWdvcml6ZWRFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpEZWxpdmVyYWJsZSIgaHJlZj0iI19JSVNuVUEtUkVkcUwyTzFQSlY5Y1pBIi8+Ci0gICAgICAgICAgICA8Y2F0ZWdvcml6ZWRFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpPdXRjb21lIiBocmVmPSIjX0tBXzFZQS1SRWRxTDJPMVBKVjljWkEiLz4KLSAgICAgICAgICAgIDxjYXRlZ29yaXplZEVsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNhcGFiaWxpdHlQYXR0ZXJuIiBocmVmPSJ1bWE6Ly9fNHNDdHNEemdFZHE1eXNGT05yMUJHUSNfNHNDdHNUemdFZHE1eXNGT05yMUJHUSIvPgotICAgICAgICAgICAgPGNhdGVnb3JpemVkRWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q2FwYWJpbGl0eVBhdHRlcm4iIGhyZWY9InVtYTovL19kQmh2a0VBdkVkcUZxSXU4LWNrb2xnI19kQmh2a1VBdkVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgICAgICAgICA8Y2F0ZWdvcml6ZWRFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDYXBhYmlsaXR5UGF0dGVybiIgaHJlZj0idW1hOi8vX2FIVVNRQkJORWRxQnM3S2hkVkxSTEEjX2FIVVNRUkJORWRxQnM3S2hkVkxSTEEiLz4KLSAgICAgICAgICAgIDxjYXRlZ29yaXplZEVsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkRlbGl2ZXJ5UHJvY2VzcyIgaHJlZj0idW1hOi8vX3VxNUs4Qk0xRWRxcW5kaS1nRHV4cHcjX3VxNUs4Uk0xRWRxcW5kaS1nRHV4cHciLz4KLSAgICAgICAgICA8L2NvbnRlbnRFbGVtZW50cz4KLSAgICAgICAgICA8Y29udGVudEVsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkN1c3RvbUNhdGVnb3J5IiB4bWk6aWQ9Il9PU1NTSUEtV0VkcUwyTzFQSlY5Y1pBIiBuYW1lPSJjdXN0b21fY2F0ZWdvcnlfQTIiIGd1aWQ9Il9PU1NTSUEtV0VkcUwyTzFQSlY5Y1pBIiBicmllZkRlc2NyaXB0aW9uPSJDdXN0b20gQ2F0ZWdvcnkgQTIgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IkN1c3RvbSBDYXRlZ29yeSBBMiBwcmVzZW50IiBjYXRlZ29yaXplZEVsZW1lbnRzPSJfNmszVUFBLVBFZHFMMk8xUEpWOWNaQSBfNzVOUXdBLVBFZHFMMk8xUEpWOWNaQSBfRTdaMGtBLVJFZHFMMk8xUEpWOWNaQSBfSEVNdEVBLVJFZHFMMk8xUEpWOWNaQSBfSkJxZlVBLVJFZHFMMk8xUEpWOWNaQSBfS3ZMeEVBLVJFZHFMMk8xUEpWOWNaQSI+Ci0gICAgICAgICAgICA8cHJlc2VudGF0aW9uIHhtaTppZD0iLVZwaHo2NVoxQjktcklNSktqWDdoMEEiIGhyZWY9InVtYTovLy1WcGh6NjVaMUI5LXJJTUpLalg3aDBBIy1WcGh6NjVaMUI5LXJJTUpLalg3aDBBIi8+Ci0gICAgICAgICAgPC9jb250ZW50RWxlbWVudHM+Ci0gICAgICAgICAgPGNvbnRlbnRFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDdXN0b21DYXRlZ29yeSIgeG1pOmlkPSJfN2RYWVVCQktFZHFCczdLaGRWTFJMQSIgbmFtZT0ic3ViX2N1c3RvbV9jYXRlZ29yeV9BMS4xIiBndWlkPSJfN2RYWVVCQktFZHFCczdLaGRWTFJMQSIgYnJpZWZEZXNjcmlwdGlvbj0iU3ViLUN1c3RvbSBDYXRlZ29yeSBBMS4xIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJTdWItQ3VzdG9tIENhdGVnb3J5IEExLjEgcHJlc2VudCIgY2F0ZWdvcml6ZWRFbGVtZW50cz0iXzU1emswQS1QRWRxTDJPMVBKVjljWkEgX0Y1MXl3QS1SRWRxTDJPMVBKVjljWkEiPgotICAgICAgICAgICAgPHByZXNlbnRhdGlvbiB4bWk6aWQ9Ii1qcVNyYkZaWTlHYjRqcERpWVNaY0ZRIiBocmVmPSJ1bWE6Ly8tanFTcmJGWlk5R2I0anBEaVlTWmNGUSMtanFTcmJGWlk5R2I0anBEaVlTWmNGUSIvPgotICAgICAgICAgIDwvY29udGVudEVsZW1lbnRzPgotICAgICAgICA8L2NoaWxkUGFja2FnZXM+Ci0gICAgICA8L2NoaWxkUGFja2FnZXM+Ci0gICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfeVVlTExBLVBFZHFMMk8xUEpWOWNaQSIgbmFtZT0iQ29yZUNvbnRlbnQiIGd1aWQ9Il95VWVMTEEtUEVkcUwyTzFQSlY5Y1pBIj4KLSAgICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iX3ppX3p3QS1QRWRxTDJPMVBKVjljWkEiIG5hbWU9ImNvbnRlbnRfcGFja2FnZV9BMSIgZ3VpZD0iX3ppX3p3QS1QRWRxTDJPMVBKVjljWkEiIGJyaWVmRGVzY3JpcHRpb249IkNvblBhayBBMSBicmllZiI+Ci0gICAgICAgICAgPGNvbnRlbnRFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpSb2xlIiB4bWk6aWQ9Il81NXprMEEtUEVkcUwyTzFQSlY5Y1pBIiBuYW1lPSJyb2xlX0ExIiBndWlkPSJfNTV6azBBLVBFZHFMMk8xUEpWOWNaQSIgYnJpZWZEZXNjcmlwdGlvbj0iUm9sZSBBMSBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iUm9sZSBBMSIgc3VwcG9ydGluZ01hdGVyaWFscz0iX2FGcHZVQS1TRWRxTDJPMVBKVjljWkEiIGNvbmNlcHRzQW5kUGFwZXJzPSJfTkRMLWtBLVNFZHFMMk8xUEpWOWNaQSBfaDhSR1FBLVNFZHFMMk8xUEpWOWNaQSIgY2hlY2tsaXN0cz0iX0tWNHEwQS1TRWRxTDJPMVBKVjljWkEiIGd1aWRlbGluZXM9Il9Pa0N0VUEtU0VkcUwyTzFQSlY5Y1pBIiBleGFtcGxlcz0iX09CeHR3QS1TRWRxTDJPMVBKVjljWkEiIGFzc2V0cz0iX1RWMGFRQS1TRWRxTDJPMVBKVjljWkEiIHJlc3BvbnNpYmxlRm9yPSJfOUt0NzhBLVBFZHFMMk8xUEpWOWNaQSBfSUlTblVBLVJFZHFMMk8xUEpWOWNaQSBfS0FfMVlBLVJFZHFMMk8xUEpWOWNaQSI+Ci0gICAgICAgICAgICA8cHJlc2VudGF0aW9uIHhtaTppZD0iLWc3bTk4Smw4YVJiVjZuZk9HVXBHbmciIGhyZWY9InVtYTovLy1nN205OEpsOGFSYlY2bmZPR1VwR25nIy1nN205OEpsOGFSYlY2bmZPR1VwR25nIi8+Ci0gICAgICAgICAgPC9jb250ZW50RWxlbWVudHM+Ci0gICAgICAgICAgPGNvbnRlbnRFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpSb2xlIiB4bWk6aWQ9Il82azNVQUEtUEVkcUwyTzFQSlY5Y1pBIiBuYW1lPSJyb2xlX0EyIiBndWlkPSJfNmszVUFBLVBFZHFMMk8xUEpWOWNaQSIgYnJpZWZEZXNjcmlwdGlvbj0iUm9sZSBBMiBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iUm9sZSBBMiBleHRlbmRlZCBieSBSb2xlIEEzIiBzdXBwb3J0aW5nTWF0ZXJpYWxzPSJfbVBzX2NBLVVFZHFMMk8xUEpWOWNaQSIgY29uY2VwdHNBbmRQYXBlcnM9Il9PVkxWY0EtVEVkcUwyTzFQSlY5Y1pBIF8zWHIwRUEtVUVkcUwyTzFQSlY5Y1pBIiBjaGVja2xpc3RzPSJfa3JpVGNBLVRFZHFMMk8xUEpWOWNaQSIgZ3VpZGVsaW5lcz0iXzZZVXdBQS1URWRxTDJPMVBKVjljWkEiIGV4YW1wbGVzPSJfdWFqV2NBLVRFZHFMMk8xUEpWOWNaQSIgYXNzZXRzPSJfU01jM0VBLVZFZHFMMk8xUEpWOWNaQSIgcmVzcG9uc2libGVGb3I9Il9FN1owa0EtUkVkcUwyTzFQSlY5Y1pBIF9KQnFmVUEtUkVkcUwyTzFQSlY5Y1pBIF9Ldkx4RUEtUkVkcUwyTzFQSlY5Y1pBIj4KLSAgICAgICAgICAgIDxwcmVzZW50YXRpb24geG1pOmlkPSItSHhrY1ZpSHU1N2JER3VsNDIxckJ2ZyIgaHJlZj0idW1hOi8vLUh4a2NWaUh1NTdiREd1bDQyMXJCdmcjLUh4a2NWaUh1NTdiREd1bDQyMXJCdmciLz4KLSAgICAgICAgICA8L2NvbnRlbnRFbGVtZW50cz4KLSAgICAgICAgICA8Y29udGVudEVsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlRhc2siIHhtaTppZD0iXzdNOG5zQS1QRWRxTDJPMVBKVjljWkEiIG5hbWU9InRhc2tfQTEiIGd1aWQ9Il83TThuc0EtUEVkcUwyTzFQSlY5Y1pBIiBicmllZkRlc2NyaXB0aW9uPSJUYXNrIEExIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJUYXNrIEExICIgc3VwcG9ydGluZ01hdGVyaWFscz0iX2FGcHZVQS1TRWRxTDJPMVBKVjljWkEiIGNvbmNlcHRzQW5kUGFwZXJzPSJfTkRMLWtBLVNFZHFMMk8xUEpWOWNaQSBfaDhSR1FBLVNFZHFMMk8xUEpWOWNaQSIgY2hlY2tsaXN0cz0iX0tWNHEwQS1TRWRxTDJPMVBKVjljWkEiIGd1aWRlbGluZXM9Il9Pa0N0VUEtU0VkcUwyTzFQSlY5Y1pBIiBleGFtcGxlcz0iX09CeHR3QS1TRWRxTDJPMVBKVjljWkEiIGFzc2V0cz0iX1RWMGFRQS1TRWRxTDJPMVBKVjljWkEiIHBlcmZvcm1lZEJ5PSJfNTV6azBBLVBFZHFMMk8xUEpWOWNaQSIgbWFuZGF0b3J5SW5wdXQ9Il9GNTF5d0EtUkVkcUwyTzFQSlY5Y1pBIF85S3Q3OEEtUEVkcUwyTzFQSlY5Y1pBIiBvdXRwdXQ9Il9LQV8xWUEtUkVkcUwyTzFQSlY5Y1pBIiBhZGRpdGlvbmFsbHlQZXJmb3JtZWRCeT0iXzZrM1VBQS1QRWRxTDJPMVBKVjljWkEiIG9wdGlvbmFsSW5wdXQ9Il9JSVNuVUEtUkVkcUwyTzFQSlY5Y1pBIiB0b29sTWVudG9ycz0iX2hIRWpvQS1TRWRxTDJPMVBKVjljWkEiPgotICAgICAgICAgICAgPHByZXNlbnRhdGlvbiB4bWk6aWQ9Ii1TMWlnTFNpNkFJX3ZsdXpXT0N1NlR3IiBocmVmPSJ1bWE6Ly8tUzFpZ0xTaTZBSV92bHV6V09DdTZUdyMtUzFpZ0xTaTZBSV92bHV6V09DdTZUdyIvPgotICAgICAgICAgIDwvY29udGVudEVsZW1lbnRzPgotICAgICAgICAgIDxjb250ZW50RWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VGFzayIgeG1pOmlkPSJfNzVOUXdBLVBFZHFMMk8xUEpWOWNaQSIgbmFtZT0idGFza19BMiIgZ3VpZD0iXzc1TlF3QS1QRWRxTDJPMVBKVjljWkEiIGJyaWVmRGVzY3JpcHRpb249IlRhc2sgQTIgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IlRhc2sgQTIgKCBleHRlbmRlZCBieSBUYXNrIEEzICkiIHN1cHBvcnRpbmdNYXRlcmlhbHM9Il9tUHNfY0EtVUVkcUwyTzFQSlY5Y1pBIiBjb25jZXB0c0FuZFBhcGVycz0iX09WTFZjQS1URWRxTDJPMVBKVjljWkEgXzNYcjBFQS1VRWRxTDJPMVBKVjljWkEiIGNoZWNrbGlzdHM9Il9rcmlUY0EtVEVkcUwyTzFQSlY5Y1pBIiBndWlkZWxpbmVzPSJfNllVd0FBLVRFZHFMMk8xUEpWOWNaQSIgZXhhbXBsZXM9Il91YWpXY0EtVEVkcUwyTzFQSlY5Y1pBIiBhc3NldHM9Il9TTWMzRUEtVkVkcUwyTzFQSlY5Y1pBIiBwZXJmb3JtZWRCeT0iXzZrM1VBQS1QRWRxTDJPMVBKVjljWkEiIG1hbmRhdG9yeUlucHV0PSJfRTdaMGtBLVJFZHFMMk8xUEpWOWNaQSIgb3V0cHV0PSJfS3ZMeEVBLVJFZHFMMk8xUEpWOWNaQSIgYWRkaXRpb25hbGx5UGVyZm9ybWVkQnk9Il81NXprMEEtUEVkcUwyTzFQSlY5Y1pBIiBvcHRpb25hbElucHV0PSJfSkJxZlVBLVJFZHFMMk8xUEpWOWNaQSIgdG9vbE1lbnRvcnM9Il92N0pLQUEtVUVkcUwyTzFQSlY5Y1pBIj4KLSAgICAgICAgICAgIDxwcmVzZW50YXRpb24geG1pOmlkPSItMTNxOEpKQWEwaXg2ckRNWkFxd3kxdyIgaHJlZj0idW1hOi8vLTEzcThKSkFhMGl4NnJETVpBcXd5MXcjLTEzcThKSkFhMGl4NnJETVpBcXd5MXciLz4KLSAgICAgICAgICA8L2NvbnRlbnRFbGVtZW50cz4KLSAgICAgICAgICA8Y29udGVudEVsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkFydGlmYWN0IiB4bWk6aWQ9Il85S3Q3OEEtUEVkcUwyTzFQSlY5Y1pBIiBuYW1lPSJhcnRpZmFjdF9BMSIgZ3VpZD0iXzlLdDc4QS1QRWRxTDJPMVBKVjljWkEiIGJyaWVmRGVzY3JpcHRpb249IkFydGlmYWN0IEExIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJBcnRpZmFjdCBBMSBwcmVzZW50IiBzdXBwb3J0aW5nTWF0ZXJpYWxzPSJfYUZwdlVBLVNFZHFMMk8xUEpWOWNaQSIgY29uY2VwdHNBbmRQYXBlcnM9Il9OREwta0EtU0VkcUwyTzFQSlY5Y1pBIF9oOFJHUUEtU0VkcUwyTzFQSlY5Y1pBIiBjaGVja2xpc3RzPSJfS1Y0cTBBLVNFZHFMMk8xUEpWOWNaQSIgZ3VpZGVsaW5lcz0iX09rQ3RVQS1TRWRxTDJPMVBKVjljWkEiIGV4YW1wbGVzPSJfT0J4dHdBLVNFZHFMMk8xUEpWOWNaQSIgYXNzZXRzPSJfVFYwYVFBLVNFZHFMMk8xUEpWOWNaQSIgcmVwb3J0cz0iX1E1RGM0QS1TRWRxTDJPMVBKVjljWkEiIHRlbXBsYXRlcz0iX2JGSVBVQS1TRWRxTDJPMVBKVjljWkEiIHRvb2xNZW50b3JzPSJfaEhFam9BLVNFZHFMMk8xUEpWOWNaQSI+Ci0gICAgICAgICAgICA8cHJlc2VudGF0aW9uIHhtaTppZD0iLW45VEpRYTBGSnZHX2F2RFhhQVRqSVEiIGhyZWY9InVtYTovLy1uOVRKUWEwRkp2R19hdkRYYUFUaklRIy1uOVRKUWEwRkp2R19hdkRYYUFUaklRIi8+Ci0gICAgICAgICAgICA8Y29udGFpbmVkQXJ0aWZhY3RzIHhtaTppZD0iX0Y1MXl3QS1SRWRxTDJPMVBKVjljWkEiIG5hbWU9InN1Yl9hcnRpZmFjdF9BMS4xIiBndWlkPSJfRjUxeXdBLVJFZHFMMk8xUEpWOWNaQSIgYnJpZWZEZXNjcmlwdGlvbj0iU3ViX0FydGlmYWN0IEExLjEgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IlN1Yl9BcnRpZmFjdCBBMS4xIHByZXNlbnQiIHN1cHBvcnRpbmdNYXRlcmlhbHM9Il9hRnB2VUEtU0VkcUwyTzFQSlY5Y1pBIiBjb25jZXB0c0FuZFBhcGVycz0iX05ETC1rQS1TRWRxTDJPMVBKVjljWkEgX2g4UkdRQS1TRWRxTDJPMVBKVjljWkEiIGNoZWNrbGlzdHM9Il9LVjRxMEEtU0VkcUwyTzFQSlY5Y1pBIiBndWlkZWxpbmVzPSJfT2tDdFVBLVNFZHFMMk8xUEpWOWNaQSIgZXhhbXBsZXM9Il9PQnh0d0EtU0VkcUwyTzFQSlY5Y1pBIiBhc3NldHM9Il9UVjBhUUEtU0VkcUwyTzFQSlY5Y1pBIiByZXBvcnRzPSJfUTVEYzRBLVNFZHFMMk8xUEpWOWNaQSIgdGVtcGxhdGVzPSJfYkZJUFVBLVNFZHFMMk8xUEpWOWNaQSIgdG9vbE1lbnRvcnM9Il9oSEVqb0EtU0VkcUwyTzFQSlY5Y1pBIj4KLSAgICAgICAgICAgICAgPHByZXNlbnRhdGlvbiB4bWk6aWQ9Ii05bjFXWDVkN0lGaFZKNHB6SFZfdnJRIiBocmVmPSJ1bWE6Ly8tOW4xV1g1ZDdJRmhWSjRwekhWX3ZyUSMtOW4xV1g1ZDdJRmhWSjRwekhWX3ZyUSIvPgotICAgICAgICAgICAgPC9jb250YWluZWRBcnRpZmFjdHM+Ci0gICAgICAgICAgPC9jb250ZW50RWxlbWVudHM+Ci0gICAgICAgICAgPGNvbnRlbnRFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpBcnRpZmFjdCIgeG1pOmlkPSJfRTdaMGtBLVJFZHFMMk8xUEpWOWNaQSIgbmFtZT0iYXJ0aWZhY3RfQTIiIGd1aWQ9Il9FN1owa0EtUkVkcUwyTzFQSlY5Y1pBIiBicmllZkRlc2NyaXB0aW9uPSJBcnRpZmFjdCBBMiBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iQXJ0aWZhY3QgQTIgcHJlc2VudCIgc3VwcG9ydGluZ01hdGVyaWFscz0iX21Qc19jQS1VRWRxTDJPMVBKVjljWkEiIGNvbmNlcHRzQW5kUGFwZXJzPSJfT1ZMVmNBLVRFZHFMMk8xUEpWOWNaQSBfM1hyMEVBLVVFZHFMMk8xUEpWOWNaQSIgY2hlY2tsaXN0cz0iX2tyaVRjQS1URWRxTDJPMVBKVjljWkEiIGd1aWRlbGluZXM9Il82WVV3QUEtVEVkcUwyTzFQSlY5Y1pBIiBleGFtcGxlcz0iX3VhaldjQS1URWRxTDJPMVBKVjljWkEiIGFzc2V0cz0iX1NNYzNFQS1WRWRxTDJPMVBKVjljWkEiIHJlcG9ydHM9Il9Hckd3UUEtVUVkcUwyTzFQSlY5Y1pBIiB0ZW1wbGF0ZXM9Il9aWHE5RUEtVUVkcUwyTzFQSlY5Y1pBIiB0b29sTWVudG9ycz0iX3Y3SktBQS1VRWRxTDJPMVBKVjljWkEiPgotICAgICAgICAgICAgPHByZXNlbnRhdGlvbiB4bWk6aWQ9Ii1KVFdLbjVkNENMYzRLRlFNRFRGcFNRIiBocmVmPSJ1bWE6Ly8tSlRXS241ZDRDTGM0S0ZRTURURnBTUSMtSlRXS241ZDRDTGM0S0ZRTURURnBTUSIvPgotICAgICAgICAgICAgPGNvbnRhaW5lZEFydGlmYWN0cyB4bWk6aWQ9Il9IRU10RUEtUkVkcUwyTzFQSlY5Y1pBIiBuYW1lPSJhcnRpZmFjdF9BMi4xIiBndWlkPSJfSEVNdEVBLVJFZHFMMk8xUEpWOWNaQSIgYnJpZWZEZXNjcmlwdGlvbj0iQXJ0aWZhY3QgQTIuMSBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iQXJ0aWZhY3QgQTIuMSBwcmVzZW50IiBzdXBwb3J0aW5nTWF0ZXJpYWxzPSJfbVBzX2NBLVVFZHFMMk8xUEpWOWNaQSIgY29uY2VwdHNBbmRQYXBlcnM9Il9PVkxWY0EtVEVkcUwyTzFQSlY5Y1pBIF8zWHIwRUEtVUVkcUwyTzFQSlY5Y1pBIiBjaGVja2xpc3RzPSJfa3JpVGNBLVRFZHFMMk8xUEpWOWNaQSIgZ3VpZGVsaW5lcz0iXzZZVXdBQS1URWRxTDJPMVBKVjljWkEiIGV4YW1wbGVzPSJfdWFqV2NBLVRFZHFMMk8xUEpWOWNaQSIgYXNzZXRzPSJfU01jM0VBLVZFZHFMMk8xUEpWOWNaQSIgcmVwb3J0cz0iX0dyR3dRQS1VRWRxTDJPMVBKVjljWkEiIHRlbXBsYXRlcz0iX1pYcTlFQS1VRWRxTDJPMVBKVjljWkEiIHRvb2xNZW50b3JzPSJfdjdKS0FBLVVFZHFMMk8xUEpWOWNaQSI+Ci0gICAgICAgICAgICAgIDxwcmVzZW50YXRpb24geG1pOmlkPSItVUZSb2VBS0hkWFgyU1NCMUtVWHRZQSIgaHJlZj0idW1hOi8vLVVGUm9lQUtIZFhYMlNTQjFLVVh0WUEjLVVGUm9lQUtIZFhYMlNTQjFLVVh0WUEiLz4KLSAgICAgICAgICAgIDwvY29udGFpbmVkQXJ0aWZhY3RzPgotICAgICAgICAgIDwvY29udGVudEVsZW1lbnRzPgotICAgICAgICAgIDxjb250ZW50RWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6RGVsaXZlcmFibGUiIHhtaTppZD0iX0lJU25VQS1SRWRxTDJPMVBKVjljWkEiIG5hbWU9ImRlbGl2ZXJhYmxlX0ExIiBndWlkPSJfSUlTblVBLVJFZHFMMk8xUEpWOWNaQSIgYnJpZWZEZXNjcmlwdGlvbj0iRGVsaXZlcmFibGUgQTEgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IkRlbGl2ZXJhYmxlIEExIHByZXNlbnQiIHN1cHBvcnRpbmdNYXRlcmlhbHM9Il9hRnB2VUEtU0VkcUwyTzFQSlY5Y1pBIiBjb25jZXB0c0FuZFBhcGVycz0iX05ETC1rQS1TRWRxTDJPMVBKVjljWkEgX2g4UkdRQS1TRWRxTDJPMVBKVjljWkEiIGNoZWNrbGlzdHM9Il9LVjRxMEEtU0VkcUwyTzFQSlY5Y1pBIiBndWlkZWxpbmVzPSJfT2tDdFVBLVNFZHFMMk8xUEpWOWNaQSIgZXhhbXBsZXM9Il9PQnh0d0EtU0VkcUwyTzFQSlY5Y1pBIiBhc3NldHM9Il9UVjBhUUEtU0VkcUwyTzFQSlY5Y1pBIiByZXBvcnRzPSJfUTVEYzRBLVNFZHFMMk8xUEpWOWNaQSIgdGVtcGxhdGVzPSJfYkZJUFVBLVNFZHFMMk8xUEpWOWNaQSIgdG9vbE1lbnRvcnM9Il9oSEVqb0EtU0VkcUwyTzFQSlY5Y1pBIiBkZWxpdmVyZWRXb3JrUHJvZHVjdHM9Il85S3Q3OEEtUEVkcUwyTzFQSlY5Y1pBIF9GNTF5d0EtUkVkcUwyTzFQSlY5Y1pBIF9LQV8xWUEtUkVkcUwyTzFQSlY5Y1pBIj4KLSAgICAgICAgICAgIDxwcmVzZW50YXRpb24geG1pOmlkPSItQWJYUmc0NEw4VHh4NENrQjJoeDVOUSIgaHJlZj0idW1hOi8vLUFiWFJnNDRMOFR4eDRDa0IyaHg1TlEjLUFiWFJnNDRMOFR4eDRDa0IyaHg1TlEiLz4KLSAgICAgICAgICA8L2NvbnRlbnRFbGVtZW50cz4KLSAgICAgICAgICA8Y29udGVudEVsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkRlbGl2ZXJhYmxlIiB4bWk6aWQ9Il9KQnFmVUEtUkVkcUwyTzFQSlY5Y1pBIiBuYW1lPSJkZWxpdmVyYWJsZV9BMiIgZ3VpZD0iX0pCcWZVQS1SRWRxTDJPMVBKVjljWkEiIGJyaWVmRGVzY3JpcHRpb249IkRlbGl2ZXJhYmxlIEEyIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJEZWxpdmVyYWJsZSBBMiBwcmVzZW50IiBzdXBwb3J0aW5nTWF0ZXJpYWxzPSJfbVBzX2NBLVVFZHFMMk8xUEpWOWNaQSIgY29uY2VwdHNBbmRQYXBlcnM9Il9PVkxWY0EtVEVkcUwyTzFQSlY5Y1pBIF8zWHIwRUEtVUVkcUwyTzFQSlY5Y1pBIiBjaGVja2xpc3RzPSJfa3JpVGNBLVRFZHFMMk8xUEpWOWNaQSIgZ3VpZGVsaW5lcz0iXzZZVXdBQS1URWRxTDJPMVBKVjljWkEiIGV4YW1wbGVzPSJfdWFqV2NBLVRFZHFMMk8xUEpWOWNaQSIgYXNzZXRzPSJfU01jM0VBLVZFZHFMMk8xUEpWOWNaQSIgcmVwb3J0cz0iX0dyR3dRQS1VRWRxTDJPMVBKVjljWkEiIHRlbXBsYXRlcz0iX1pYcTlFQS1VRWRxTDJPMVBKVjljWkEiIHRvb2xNZW50b3JzPSJfdjdKS0FBLVVFZHFMMk8xUEpWOWNaQSIgZGVsaXZlcmVkV29ya1Byb2R1Y3RzPSJfRTdaMGtBLVJFZHFMMk8xUEpWOWNaQSBfS3ZMeEVBLVJFZHFMMk8xUEpWOWNaQSI+Ci0gICAgICAgICAgICA8cHJlc2VudGF0aW9uIHhtaTppZD0iLU1kcW9hLW54d0VIZkFKY29BNlhOS1EiIGhyZWY9InVtYTovLy1NZHFvYS1ueHdFSGZBSmNvQTZYTktRIy1NZHFvYS1ueHdFSGZBSmNvQTZYTktRIi8+Ci0gICAgICAgICAgPC9jb250ZW50RWxlbWVudHM+Ci0gICAgICAgICAgPGNvbnRlbnRFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpPdXRjb21lIiB4bWk6aWQ9Il9LQV8xWUEtUkVkcUwyTzFQSlY5Y1pBIiBuYW1lPSJvdXRjb21lX0ExIiBndWlkPSJfS0FfMVlBLVJFZHFMMk8xUEpWOWNaQSIgYnJpZWZEZXNjcmlwdGlvbj0iT3V0Y29tZSBBMSBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iT3V0Y29tZSBBMSBwcmVzZW50IiBzdXBwb3J0aW5nTWF0ZXJpYWxzPSJfYUZwdlVBLVNFZHFMMk8xUEpWOWNaQSIgY29uY2VwdHNBbmRQYXBlcnM9Il9OREwta0EtU0VkcUwyTzFQSlY5Y1pBIF9oOFJHUUEtU0VkcUwyTzFQSlY5Y1pBIiBjaGVja2xpc3RzPSJfS1Y0cTBBLVNFZHFMMk8xUEpWOWNaQSIgZ3VpZGVsaW5lcz0iX09rQ3RVQS1TRWRxTDJPMVBKVjljWkEiIGV4YW1wbGVzPSJfT0J4dHdBLVNFZHFMMk8xUEpWOWNaQSIgYXNzZXRzPSJfVFYwYVFBLVNFZHFMMk8xUEpWOWNaQSIgcmVwb3J0cz0iX1E1RGM0QS1TRWRxTDJPMVBKVjljWkEiIHRlbXBsYXRlcz0iX2JGSVBVQS1TRWRxTDJPMVBKVjljWkEiIHRvb2xNZW50b3JzPSJfaEhFam9BLVNFZHFMMk8xUEpWOWNaQSI+Ci0gICAgICAgICAgICA8cHJlc2VudGF0aW9uIHhtaTppZD0iLTNvZHlCeUllelJSWGdRZ2VIdU02U0EiIGhyZWY9InVtYTovLy0zb2R5QnlJZXpSUlhnUWdlSHVNNlNBIy0zb2R5QnlJZXpSUlhnUWdlSHVNNlNBIi8+Ci0gICAgICAgICAgPC9jb250ZW50RWxlbWVudHM+Ci0gICAgICAgICAgPGNvbnRlbnRFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpPdXRjb21lIiB4bWk6aWQ9Il9Ldkx4RUEtUkVkcUwyTzFQSlY5Y1pBIiBuYW1lPSJvdXRjb21lX0EyIiBndWlkPSJfS3ZMeEVBLVJFZHFMMk8xUEpWOWNaQSIgYnJpZWZEZXNjcmlwdGlvbj0iT3V0Y29tZSBBMSBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iT3V0Y29tZSBBMiBwcmVzZW50IiBzdXBwb3J0aW5nTWF0ZXJpYWxzPSJfbVBzX2NBLVVFZHFMMk8xUEpWOWNaQSIgY29uY2VwdHNBbmRQYXBlcnM9Il9PVkxWY0EtVEVkcUwyTzFQSlY5Y1pBIF8zWHIwRUEtVUVkcUwyTzFQSlY5Y1pBIiBjaGVja2xpc3RzPSJfa3JpVGNBLVRFZHFMMk8xUEpWOWNaQSIgZ3VpZGVsaW5lcz0iXzZZVXdBQS1URWRxTDJPMVBKVjljWkEiIGV4YW1wbGVzPSJfdWFqV2NBLVRFZHFMMk8xUEpWOWNaQSIgYXNzZXRzPSJfU01jM0VBLVZFZHFMMk8xUEpWOWNaQSIgcmVwb3J0cz0iX0dyR3dRQS1VRWRxTDJPMVBKVjljWkEiIHRlbXBsYXRlcz0iX1pYcTlFQS1VRWRxTDJPMVBKVjljWkEiIHRvb2xNZW50b3JzPSJfdjdKS0FBLVVFZHFMMk8xUEpWOWNaQSI+Ci0gICAgICAgICAgICA8cHJlc2VudGF0aW9uIHhtaTppZD0iLTRHYkFXR2I4N0Fsei1Hel9HXzlwMWciIGhyZWY9InVtYTovLy00R2JBV0diODdBbHotR3pfR185cDFnIy00R2JBV0diODdBbHotR3pfR185cDFnIi8+Ci0gICAgICAgICAgPC9jb250ZW50RWxlbWVudHM+Ci0gICAgICAgICAgPGNvbnRlbnRFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDaGVja2xpc3QiIHhtaTppZD0iX0tWNHEwQS1TRWRxTDJPMVBKVjljWkEiIG5hbWU9ImNoZWNrbGlzdF9BMSIgZ3VpZD0iX0tWNHEwQS1TRWRxTDJPMVBKVjljWkEiIGJyaWVmRGVzY3JpcHRpb249IkNoZWNrbGlzdCBBMSBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iQ2hlY2tsaXN0IEExIHByZXNlbnQiPgotICAgICAgICAgICAgPHByZXNlbnRhdGlvbiB4bWk6aWQ9Ii1vV28zVUNpZlg0SWNfVkJJQ1d3cVJ3IiBocmVmPSJ1bWE6Ly8tb1dvM1VDaWZYNEljX1ZCSUNXd3FSdyMtb1dvM1VDaWZYNEljX1ZCSUNXd3FSdyIvPgotICAgICAgICAgIDwvY29udGVudEVsZW1lbnRzPgotICAgICAgICAgIDxjb250ZW50RWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29uY2VwdCIgeG1pOmlkPSJfTkRMLWtBLVNFZHFMMk8xUEpWOWNaQSIgbmFtZT0iY29uY2VwdF9BMSIgZ3VpZD0iX05ETC1rQS1TRWRxTDJPMVBKVjljWkEiIGJyaWVmRGVzY3JpcHRpb249IkNvbmNlcHQgQTEgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IkNvbmNlcHQgQTEgcHJlc2VudCIgc2hhcGVpY29uPSJmaWxlOi9DOi9Eb2N1bWVudHMlMjBhbmQlMjBTZXR0aW5ncy90cmFuLWx1dS9JQk0vTWV0aG9kTGlicmFyaWVzL3BhcmlzL1BsdWclMjBBL2d1aWRhbmNlcy9jb25jZXB0cy9yZXNvdXJjZXMvdHlyYW5ub3NhdXJ1cy5naWYiPgotICAgICAgICAgICAgPHByZXNlbnRhdGlvbiB4bWk6aWQ9Ii02eTdhQlF0M2NDU0JMbzhzbU1SZW1BIiBocmVmPSJ1bWE6Ly8tNnk3YUJRdDNjQ1NCTG84c21NUmVtQSMtNnk3YUJRdDNjQ1NCTG84c21NUmVtQSIvPgotICAgICAgICAgIDwvY29udGVudEVsZW1lbnRzPgotICAgICAgICAgIDxjb250ZW50RWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6RXhhbXBsZSIgeG1pOmlkPSJfT0J4dHdBLVNFZHFMMk8xUEpWOWNaQSIgbmFtZT0iZXhhbXBsZV9BMSIgZ3VpZD0iX09CeHR3QS1TRWRxTDJPMVBKVjljWkEiIGJyaWVmRGVzY3JpcHRpb249IkV4YW1wbGUgQTEgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IkV4YW1wbGUgQTEgcHJlc2VudCI+Ci0gICAgICAgICAgICA8cHJlc2VudGF0aW9uIHhtaTppZD0iLUE5NDl3SGRURnFHM1dzNjMtcTlCMnciIGhyZWY9InVtYTovLy1BOTQ5d0hkVEZxRzNXczYzLXE5QjJ3Iy1BOTQ5d0hkVEZxRzNXczYzLXE5QjJ3Ii8+Ci0gICAgICAgICAgPC9jb250ZW50RWxlbWVudHM+Ci0gICAgICAgICAgPGNvbnRlbnRFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpHdWlkZWxpbmUiIHhtaTppZD0iX09rQ3RVQS1TRWRxTDJPMVBKVjljWkEiIG5hbWU9Imd1aWRlbGluZV9BMSIgZ3VpZD0iX09rQ3RVQS1TRWRxTDJPMVBKVjljWkEiIGJyaWVmRGVzY3JpcHRpb249Ikd1aWRlbGluZSBBMSBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iR3VpZGVsaW5lIEExIHByZXNlbnQiPgotICAgICAgICAgICAgPHByZXNlbnRhdGlvbiB4bWk6aWQ9Ii1fMjFfRWlzUVNUSHd0bEpqb0o4YnZ3IiBocmVmPSJ1bWE6Ly8tXzIxX0Vpc1FTVEh3dGxKam9KOGJ2dyMtXzIxX0Vpc1FTVEh3dGxKam9KOGJ2dyIvPgotICAgICAgICAgIDwvY29udGVudEVsZW1lbnRzPgotICAgICAgICAgIDxjb250ZW50RWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6UHJhY3RpY2UiIHhtaTppZD0iX1A4allZQS1TRWRxTDJPMVBKVjljWkEiIG5hbWU9InByYWN0aWNlX0ExIiBndWlkPSJfUDhqWVlBLVNFZHFMMk8xUEpWOWNaQSIgYnJpZWZEZXNjcmlwdGlvbj0iUHJhY3RpY2UgQTEgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IlByYWN0aWNlIEExIHByZXNlbnQiIGNvbnRlbnRSZWZlcmVuY2VzPSJfOUt0NzhBLVBFZHFMMk8xUEpWOWNaQSBfTUtQbmtBLVdFZHFMMk8xUEpWOWNaQSBfQzVkX3dBLVdFZHFMMk8xUEpWOWNaQSBfRkV6TzRBLVdFZHFMMk8xUEpWOWNaQSBfOVBwMVVCQktFZHFCczdLaGRWTFJMQSBfS3hiYWdBLVdFZHFMMk8xUEpWOWNaQSBfSGdoRFlBLVdFZHFMMk8xUEpWOWNaQSBfS1Y0cTBBLVNFZHFMMk8xUEpWOWNaQSBfTkRMLWtBLVNFZHFMMk8xUEpWOWNaQSBfT0J4dHdBLVNFZHFMMk8xUEpWOWNaQSBfT2tDdFVBLVNFZHFMMk8xUEpWOWNaQSBfS0FfMVlBLVJFZHFMMk8xUEpWOWNaQSBfRXBmb1lBLVZFZHFMMk8xUEpWOWNaQSBfUTVEYzRBLVNFZHFMMk8xUEpWOWNaQSBfVFYwYVFBLVNFZHFMMk8xUEpWOWNaQSBfWmszOWdBLVNFZHFMMk8xUEpWOWNaQSBfNTV6azBBLVBFZHFMMk8xUEpWOWNaQSBfYUZwdlVBLVNFZHFMMk8xUEpWOWNaQSBfN004bnNBLVBFZHFMMk8xUEpWOWNaQSBfYkZJUFVBLVNFZHFMMk8xUEpWOWNaQSBfaEhFam9BLVNFZHFMMk8xUEpWOWNaQSBfaDhSR1FBLVNFZHFMMk8xUEpWOWNaQSBfRjUxeXdBLVJFZHFMMk8xUEpWOWNaQSBfSUlTblVBLVJFZHFMMk8xUEpWOWNaQSBfN2RYWVVCQktFZHFCczdLaGRWTFJMQSBfQ0NWamNBLVdFZHFMMk8xUEpWOWNaQSBfR09aN1FBLVdFZHFMMk8xUEpWOWNaQSBfSlluMGdBLVdFZHFMMk8xUEpWOWNaQSI+Ci0gICAgICAgICAgICA8cHJlc2VudGF0aW9uIHhtaTppZD0iLVo3a2RJa0NwLW1IVWRiX0pvUXB6V1EiIGhyZWY9InVtYTovLy1aN2tkSWtDcC1tSFVkYl9Kb1FweldRIy1aN2tkSWtDcC1tSFVkYl9Kb1FweldRIi8+Ci0gICAgICAgICAgICA8c3ViUHJhY3RpY2VzIHhtaTppZD0iXy1GU1VnQS1VRWRxTDJPMVBKVjljWkEiIG5hbWU9InByYWN0aWNlX0ExLjEiIGd1aWQ9Il8tRlNVZ0EtVUVkcUwyTzFQSlY5Y1pBIiBicmllZkRlc2NyaXB0aW9uPSJQcmFjdGljZSBBMS4xIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJQcmFjdGljZSBBMS4xIHByZXNlbnQiPgotICAgICAgICAgICAgICA8cHJlc2VudGF0aW9uIHhtaTppZD0iLTl4UDRkN2JhNm9zd0drUGVwWFdrX3ciIGhyZWY9InVtYTovLy05eFA0ZDdiYTZvc3dHa1BlcFhXa193Iy05eFA0ZDdiYTZvc3dHa1BlcFhXa193Ii8+Ci0gICAgICAgICAgICA8L3N1YlByYWN0aWNlcz4KLSAgICAgICAgICA8L2NvbnRlbnRFbGVtZW50cz4KLSAgICAgICAgICA8Y29udGVudEVsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlJlcG9ydCIgeG1pOmlkPSJfUTVEYzRBLVNFZHFMMk8xUEpWOWNaQSIgbmFtZT0icmVwb3J0X0ExIiBndWlkPSJfUTVEYzRBLVNFZHFMMk8xUEpWOWNaQSIgYnJpZWZEZXNjcmlwdGlvbj0iUmVwb3J0IEExIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJSZXBvcnQgQTEgcHJlc2VudCI+Ci0gICAgICAgICAgICA8cHJlc2VudGF0aW9uIHhtaTppZD0iLVhSZUJMZE40aUxidmFmZkJ3ZWJOQ3ciIGhyZWY9InVtYTovLy1YUmVCTGRONGlMYnZhZmZCd2ViTkN3Iy1YUmVCTGRONGlMYnZhZmZCd2ViTkN3Ii8+Ci0gICAgICAgICAgPC9jb250ZW50RWxlbWVudHM+Ci0gICAgICAgICAgPGNvbnRlbnRFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpSZXVzYWJsZUFzc2V0IiB4bWk6aWQ9Il9UVjBhUUEtU0VkcUwyTzFQSlY5Y1pBIiBuYW1lPSJyZXVzYWJsZV9hc3NldF9BMSIgZ3VpZD0iX1RWMGFRQS1TRWRxTDJPMVBKVjljWkEiIGJyaWVmRGVzY3JpcHRpb249IlJldXNhYmxlIEFzc2V0IEExIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJSZXVzYWJsZSBBc3NldCBBMSBwcmVzZW50Ij4KLSAgICAgICAgICAgIDxwcmVzZW50YXRpb24geG1pOmlkPSItMWhIRU9MOHF5eFRNTVI3NzVVR2ZydyIgaHJlZj0idW1hOi8vLTFoSEVPTDhxeXhUTU1SNzc1VUdmcncjLTFoSEVPTDhxeXhUTU1SNzc1VUdmcnciLz4KLSAgICAgICAgICA8L2NvbnRlbnRFbGVtZW50cz4KLSAgICAgICAgICA8Y29udGVudEVsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlJvYWRtYXAiIHhtaTppZD0iX1prMzlnQS1TRWRxTDJPMVBKVjljWkEiIG5hbWU9InJvYWRtYXBfQTEiIGd1aWQ9Il9aazM5Z0EtU0VkcUwyTzFQSlY5Y1pBIiBicmllZkRlc2NyaXB0aW9uPSJSb2FkbWFwIEExIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJSb2FkbWFwIEExIHByZXNlbnQiPgotICAgICAgICAgICAgPHByZXNlbnRhdGlvbiB4bWk6aWQ9Ii14b0RaYXFyN0otd2YybEI3clNqU1p3IiBocmVmPSJ1bWE6Ly8teG9EWmFxcjdKLXdmMmxCN3JTalNadyMteG9EWmFxcjdKLXdmMmxCN3JTalNadyIvPgotICAgICAgICAgIDwvY29udGVudEVsZW1lbnRzPgotICAgICAgICAgIDxjb250ZW50RWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6U3VwcG9ydGluZ01hdGVyaWFsIiB4bWk6aWQ9Il9hRnB2VUEtU0VkcUwyTzFQSlY5Y1pBIiBuYW1lPSJzdXBwb3J0aW5nX21hdGVyaWFsX0ExIiBndWlkPSJfYUZwdlVBLVNFZHFMMk8xUEpWOWNaQSIgYnJpZWZEZXNjcmlwdGlvbj0iU3VwcG9ydGluZyBNYXRlcmlhbCBBMSBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iU3VwcG9ydGluZyBNYXRlcmlhbCBBMSBwcmVzZW50Ij4KLSAgICAgICAgICAgIDxwcmVzZW50YXRpb24geG1pOmlkPSItNDZBSmxBdnQ1QkRZZkw5X2ctMlI3dyIgaHJlZj0idW1hOi8vLTQ2QUpsQXZ0NUJEWWZMOV9nLTJSN3cjLTQ2QUpsQXZ0NUJEWWZMOV9nLTJSN3ciLz4KLSAgICAgICAgICA8L2NvbnRlbnRFbGVtZW50cz4KLSAgICAgICAgICA8Y29udGVudEVsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlRlbXBsYXRlIiB4bWk6aWQ9Il9iRklQVUEtU0VkcUwyTzFQSlY5Y1pBIiBuYW1lPSJ0ZW1wbGF0ZV9BMSIgZ3VpZD0iX2JGSVBVQS1TRWRxTDJPMVBKVjljWkEiIGJyaWVmRGVzY3JpcHRpb249IlRlbXBsYXRlIEExIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJUZW1wbGF0ZSBBMSBwcmVzZW50Ij4KLSAgICAgICAgICAgIDxwcmVzZW50YXRpb24geG1pOmlkPSItYzlzYjlEaTRNWW1SLVJvb0ZrUDNqdyIgaHJlZj0idW1hOi8vLWM5c2I5RGk0TVltUi1Sb29Ga1AzancjLWM5c2I5RGk0TVltUi1Sb29Ga1AzanciLz4KLSAgICAgICAgICA8L2NvbnRlbnRFbGVtZW50cz4KLSAgICAgICAgICA8Y29udGVudEVsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlRvb2xNZW50b3IiIHhtaTppZD0iX2hIRWpvQS1TRWRxTDJPMVBKVjljWkEiIG5hbWU9InRvb2xtZW50b3JfQTEiIGd1aWQ9Il9oSEVqb0EtU0VkcUwyTzFQSlY5Y1pBIiBicmllZkRlc2NyaXB0aW9uPSJUb29sbWVudG9yIEExIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJUb29sbWVudG9yIEExIHByZXNlbnQiPgotICAgICAgICAgICAgPHByZXNlbnRhdGlvbiB4bWk6aWQ9Ii1wNHhrUW1QekVxYW5YbjFrU2JXWUFnIiBocmVmPSJ1bWE6Ly8tcDR4a1FtUHpFcWFuWG4xa1NiV1lBZyMtcDR4a1FtUHpFcWFuWG4xa1NiV1lBZyIvPgotICAgICAgICAgIDwvY29udGVudEVsZW1lbnRzPgotICAgICAgICAgIDxjb250ZW50RWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6V2hpdGVwYXBlciIgeG1pOmlkPSJfaDhSR1FBLVNFZHFMMk8xUEpWOWNaQSIgbmFtZT0id2hpdGVwYXBlcl9BMSIgZ3VpZD0iX2g4UkdRQS1TRWRxTDJPMVBKVjljWkEiIGJyaWVmRGVzY3JpcHRpb249IldoaXRlcGFwZXIgQTEgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IldoaXRlcGFwZXIgQTEgcHJlc2VudCI+Ci0gICAgICAgICAgICA8cHJlc2VudGF0aW9uIHhtaTppZD0iLTdQWkhMRlNLVkxzWU9BTm4wZ0dxSXciIGhyZWY9InVtYTovLy03UFpITEZTS1ZMc1lPQU5uMGdHcUl3Iy03UFpITEZTS1ZMc1lPQU5uMGdHcUl3Ii8+Ci0gICAgICAgICAgPC9jb250ZW50RWxlbWVudHM+Ci0gICAgICAgICAgPGNvbnRlbnRFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb25jZXB0IiB4bWk6aWQ9Il9PVkxWY0EtVEVkcUwyTzFQSlY5Y1pBIiBuYW1lPSJjb25jZXB0X0EyIiBndWlkPSJfT1ZMVmNBLVRFZHFMMk8xUEpWOWNaQSIgYnJpZWZEZXNjcmlwdGlvbj0iQ29uY2VwdCBBMiBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iQ29uY2VwdCBBMiBwcmVzZW50Ij4KLSAgICAgICAgICAgIDxwcmVzZW50YXRpb24geG1pOmlkPSItTFBJYXhPSExYcTlpZEdWNDFpVXI5ZyIgaHJlZj0idW1hOi8vLUxQSWF4T0hMWHE5aWRHVjQxaVVyOWcjLUxQSWF4T0hMWHE5aWRHVjQxaVVyOWciLz4KLSAgICAgICAgICA8L2NvbnRlbnRFbGVtZW50cz4KLSAgICAgICAgICA8Y29udGVudEVsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNoZWNrbGlzdCIgeG1pOmlkPSJfa3JpVGNBLVRFZHFMMk8xUEpWOWNaQSIgbmFtZT0iY2hlY2tsaXN0X0EyIiBndWlkPSJfa3JpVGNBLVRFZHFMMk8xUEpWOWNaQSIgYnJpZWZEZXNjcmlwdGlvbj0iQ2hlY2tsaXN0IEEyIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJDaGVja2xpc3QgQTIgcHJlc2VudCI+Ci0gICAgICAgICAgICA8cHJlc2VudGF0aW9uIHhtaTppZD0iLUo5VXI5c21wUXV2VkdwdUc5aV93a1EiIGhyZWY9InVtYTovLy1KOVVyOXNtcFF1dlZHcHVHOWlfd2tRIy1KOVVyOXNtcFF1dlZHcHVHOWlfd2tRIi8+Ci0gICAgICAgICAgPC9jb250ZW50RWxlbWVudHM+Ci0gICAgICAgICAgPGNvbnRlbnRFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpFeGFtcGxlIiB4bWk6aWQ9Il91YWpXY0EtVEVkcUwyTzFQSlY5Y1pBIiBuYW1lPSJleGFtcGxlX0EyIiBndWlkPSJfdWFqV2NBLVRFZHFMMk8xUEpWOWNaQSIgYnJpZWZEZXNjcmlwdGlvbj0iRXhhbXBsZSBBMSBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iRXhhbXBsZSBBMSBwcmVzZW50Ij4KLSAgICAgICAgICAgIDxwcmVzZW50YXRpb24geG1pOmlkPSItcGxEMk0xc2hTRS1MbGJEdzV5WXByZyIgaHJlZj0idW1hOi8vLXBsRDJNMXNoU0UtTGxiRHc1eVlwcmcjLXBsRDJNMXNoU0UtTGxiRHc1eVlwcmciLz4KLSAgICAgICAgICA8L2NvbnRlbnRFbGVtZW50cz4KLSAgICAgICAgICA8Y29udGVudEVsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkd1aWRlbGluZSIgeG1pOmlkPSJfNllVd0FBLVRFZHFMMk8xUEpWOWNaQSIgbmFtZT0iZ3VpZGVsaW5lX0EyIiBndWlkPSJfNllVd0FBLVRFZHFMMk8xUEpWOWNaQSIgYnJpZWZEZXNjcmlwdGlvbj0iR3VpZGVsaW5lIEEyIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJHdWlkZWxpbmUgQTIgcHJlc2VudCI+Ci0gICAgICAgICAgICA8cHJlc2VudGF0aW9uIHhtaTppZD0iLVBjWnR0Vi1zYy1FY1VRd0ItWmhBSXciIGhyZWY9InVtYTovLy1QY1p0dFYtc2MtRWNVUXdCLVpoQUl3Iy1QY1p0dFYtc2MtRWNVUXdCLVpoQUl3Ii8+Ci0gICAgICAgICAgPC9jb250ZW50RWxlbWVudHM+Ci0gICAgICAgICAgPGNvbnRlbnRFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpSZXBvcnQiIHhtaTppZD0iX0dyR3dRQS1VRWRxTDJPMVBKVjljWkEiIG5hbWU9InJlcG9ydF9BMiIgZ3VpZD0iX0dyR3dRQS1VRWRxTDJPMVBKVjljWkEiIGJyaWVmRGVzY3JpcHRpb249IlJlcG9ydCBBMiBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iUmVwb3J0IEEyIHByZXNlbnQiPgotICAgICAgICAgICAgPHByZXNlbnRhdGlvbiB4bWk6aWQ9Ii01TG5kbWR4eGJHMU0xTWZwQVBLcEFRIiBocmVmPSJ1bWE6Ly8tNUxuZG1keHhiRzFNMU1mcEFQS3BBUSMtNUxuZG1keHhiRzFNMU1mcEFQS3BBUSIvPgotICAgICAgICAgIDwvY29udGVudEVsZW1lbnRzPgotICAgICAgICAgIDxjb250ZW50RWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VGVtcGxhdGUiIHhtaTppZD0iX1pYcTlFQS1VRWRxTDJPMVBKVjljWkEiIG5hbWU9InRlbXBsYXRlX0EyIiBndWlkPSJfWlhxOUVBLVVFZHFMMk8xUEpWOWNaQSIgYnJpZWZEZXNjcmlwdGlvbj0iVGVtcGxhdGUgQTIgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IlRlbXBsYXRlIEEyIHByZXNlbnQiPgotICAgICAgICAgICAgPHByZXNlbnRhdGlvbiB4bWk6aWQ9Ii1oTFNPV3JHNWJpU1gtUEFrXzNCYjlBIiBocmVmPSJ1bWE6Ly8taExTT1dyRzViaVNYLVBBa18zQmI5QSMtaExTT1dyRzViaVNYLVBBa18zQmI5QSIvPgotICAgICAgICAgIDwvY29udGVudEVsZW1lbnRzPgotICAgICAgICAgIDxjb250ZW50RWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6U3VwcG9ydGluZ01hdGVyaWFsIiB4bWk6aWQ9Il9tUHNfY0EtVUVkcUwyTzFQSlY5Y1pBIiBuYW1lPSJzdXBwb3J0aW5nX21hdGVyaWFsX0EyIiBndWlkPSJfbVBzX2NBLVVFZHFMMk8xUEpWOWNaQSIgYnJpZWZEZXNjcmlwdGlvbj0iU3VwcG9ydGluZyBNYXRlcmlhbCBBMiBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iU3VwcG9ydGluZyBNYXRlcmlhbCBBMiBwcmVzZW50Ij4KLSAgICAgICAgICAgIDxwcmVzZW50YXRpb24geG1pOmlkPSItN3c1M2pGT3p3cE5CZ2VDRF9BX3ZZZyIgaHJlZj0idW1hOi8vLTd3NTNqRk96d3BOQmdlQ0RfQV92WWcjLTd3NTNqRk96d3BOQmdlQ0RfQV92WWciLz4KLSAgICAgICAgICA8L2NvbnRlbnRFbGVtZW50cz4KLSAgICAgICAgICA8Y29udGVudEVsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlRvb2xNZW50b3IiIHhtaTppZD0iX3Y3SktBQS1VRWRxTDJPMVBKVjljWkEiIG5hbWU9InRvb2xtZW50b3JfQTIiIGd1aWQ9Il92N0pLQUEtVUVkcUwyTzFQSlY5Y1pBIiBicmllZkRlc2NyaXB0aW9uPSJUb29sbWVudG9yIEEyIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJUb29sbWVudG9yIEEyIHByZXNlbnQiPgotICAgICAgICAgICAgPHByZXNlbnRhdGlvbiB4bWk6aWQ9Ii1zeFZxLTVhYUllM3p0NWFFdW44RkNnIiBocmVmPSJ1bWE6Ly8tc3hWcS01YWFJZTN6dDVhRXVuOEZDZyMtc3hWcS01YWFJZTN6dDVhRXVuOEZDZyIvPgotICAgICAgICAgIDwvY29udGVudEVsZW1lbnRzPgotICAgICAgICAgIDxjb250ZW50RWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6V2hpdGVwYXBlciIgeG1pOmlkPSJfM1hyMEVBLVVFZHFMMk8xUEpWOWNaQSIgbmFtZT0id2hpdGVwYXBlcl9BMiIgZ3VpZD0iXzNYcjBFQS1VRWRxTDJPMVBKVjljWkEiIGJyaWVmRGVzY3JpcHRpb249IldoaXRlcGFwZXIgQTIgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IldoaXRlcGFwZXIgQTIgcHJlc2VudCI+Ci0gICAgICAgICAgICA8cHJlc2VudGF0aW9uIHhtaTppZD0iLXRHREZpaDVUMWx0Vm5NWmVmOEE3NnciIGhyZWY9InVtYTovLy10R0RGaWg1VDFsdFZuTVplZjhBNzZ3Iy10R0RGaWg1VDFsdFZuTVplZjhBNzZ3Ii8+Ci0gICAgICAgICAgPC9jb250ZW50RWxlbWVudHM+Ci0gICAgICAgICAgPGNvbnRlbnRFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpQcmFjdGljZSIgeG1pOmlkPSJfRXBmb1lBLVZFZHFMMk8xUEpWOWNaQSIgbmFtZT0icHJhY3RpY2VfQTIiIGd1aWQ9Il9FcGZvWUEtVkVkcUwyTzFQSlY5Y1pBIiBicmllZkRlc2NyaXB0aW9uPSJQcmFjdGljZSBBMiBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iUHJhY3RpY2UgQTIgcHJlc2VudCIgY29udGVudFJlZmVyZW5jZXM9Il9FN1owa0EtUkVkcUwyTzFQSlY5Y1pBIF9IRU10RUEtUkVkcUwyTzFQSlY5Y1pBIF9rcmlUY0EtVEVkcUwyTzFQSlY5Y1pBIF9PVkxWY0EtVEVkcUwyTzFQSlY5Y1pBIF9KQnFmVUEtUkVkcUwyTzFQSlY5Y1pBIF91YWpXY0EtVEVkcUwyTzFQSlY5Y1pBIF82WVV3QUEtVEVkcUwyTzFQSlY5Y1pBIF9Ldkx4RUEtUkVkcUwyTzFQSlY5Y1pBIF9QOGpZWUEtU0VkcUwyTzFQSlY5Y1pBIF9Hckd3UUEtVUVkcUwyTzFQSlY5Y1pBIF9TTWMzRUEtVkVkcUwyTzFQSlY5Y1pBIF9ZdWtnUUEtVkVkcUwyTzFQSlY5Y1pBIF82azNVQUEtUEVkcUwyTzFQSlY5Y1pBIF9tUHNfY0EtVUVkcUwyTzFQSlY5Y1pBIF83NU5Rd0EtUEVkcUwyTzFQSlY5Y1pBIF9aWHE5RUEtVUVkcUwyTzFQSlY5Y1pBIF92N0pLQUEtVUVkcUwyTzFQSlY5Y1pBIF8zWHIwRUEtVUVkcUwyTzFQSlY5Y1pBIF9PU1NTSUEtV0VkcUwyTzFQSlY5Y1pBIF9EenZQb0EtV0VkcUwyTzFQSlY5Y1pBIF9GcVdMOEEtV0VkcUwyTzFQSlY5Y1pBIF8tdWJnY0JCS0VkcUJzN0toZFZMUkxBIF9MaGFGOEEtV0VkcUwyTzFQSlY5Y1pBIF9JRm5VZ0EtV0VkcUwyTzFQSlY5Y1pBIj4KLSAgICAgICAgICAgIDxwcmVzZW50YXRpb24geG1pOmlkPSItTmNTTVRmaE1sdHRQVUsyRjZ3WGdFZyIgaHJlZj0idW1hOi8vLU5jU01UZmhNbHR0UFVLMkY2d1hnRWcjLU5jU01UZmhNbHR0UFVLMkY2d1hnRWciLz4KLSAgICAgICAgICAgIDxzdWJQcmFjdGljZXMgeG1pOmlkPSJfSnJnd3dBLVZFZHFMMk8xUEpWOWNaQSIgbmFtZT0icHJhY3RpY2VfQTIuMSIgZ3VpZD0iX0pyZ3d3QS1WRWRxTDJPMVBKVjljWkEiIGJyaWVmRGVzY3JpcHRpb249IlByYWN0aWNlIEEyLjEgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IlByYWN0aWNlIEEyLjEgcHJlc2VudCI+Ci0gICAgICAgICAgICAgIDxwcmVzZW50YXRpb24geG1pOmlkPSItUjlzUXpvSmpRbTQtTkJ4VXFhTFdMZyIgaHJlZj0idW1hOi8vLVI5c1F6b0pqUW00LU5CeFVxYUxXTGcjLVI5c1F6b0pqUW00LU5CeFVxYUxXTGciLz4KLSAgICAgICAgICAgIDwvc3ViUHJhY3RpY2VzPgotICAgICAgICAgIDwvY29udGVudEVsZW1lbnRzPgotICAgICAgICAgIDxjb250ZW50RWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6UmV1c2FibGVBc3NldCIgeG1pOmlkPSJfU01jM0VBLVZFZHFMMk8xUEpWOWNaQSIgbmFtZT0icmV1c2FibGVfYXNzZXRfQTIiIGd1aWQ9Il9TTWMzRUEtVkVkcUwyTzFQSlY5Y1pBIiBicmllZkRlc2NyaXB0aW9uPSJSZXVzYWJsZSBBc3NldCBBMiBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iUmV1c2FibGUgQXNzZXQgQTIgcHJlc2VudCI+Ci0gICAgICAgICAgICA8cHJlc2VudGF0aW9uIHhtaTppZD0iLTdnbEdZaUphczloWkdrSjljY1E1S1EiIGhyZWY9InVtYTovLy03Z2xHWWlKYXM5aFpHa0o5Y2NRNUtRIy03Z2xHWWlKYXM5aFpHa0o5Y2NRNUtRIi8+Ci0gICAgICAgICAgPC9jb250ZW50RWxlbWVudHM+Ci0gICAgICAgICAgPGNvbnRlbnRFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpSb2FkbWFwIiB4bWk6aWQ9Il9ZdWtnUUEtVkVkcUwyTzFQSlY5Y1pBIiBuYW1lPSJyb2FkbWFwX0EyIiBndWlkPSJfWXVrZ1FBLVZFZHFMMk8xUEpWOWNaQSIgYnJpZWZEZXNjcmlwdGlvbj0iUm9hZG1hcCBBMiBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iUm9hZG1hcCBBMiBwcmVzZW50Ij4KLSAgICAgICAgICAgIDxwcmVzZW50YXRpb24geG1pOmlkPSItSjBzendyS2JpTDJKbS1GaWZRdEk5dyIgaHJlZj0idW1hOi8vLUowc3p3cktiaUwySm0tRmlmUXRJOXcjLUowc3p3cktiaUwySm0tRmlmUXRJOXciLz4KLSAgICAgICAgICA8L2NvbnRlbnRFbGVtZW50cz4KLSAgICAgICAgICA8Y29udGVudEVsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlRlcm1EZWZpbml0aW9uIiB4bWk6aWQ9Il9vOEk3RUEtVkVkcUwyTzFQSlY5Y1pBIiBuYW1lPSJ0ZXJtX2RlZmluaXRpb25fQTIiIGd1aWQ9Il9vOEk3RUEtVkVkcUwyTzFQSlY5Y1pBIiBwcmVzZW50YXRpb25OYW1lPSJUZXJtIERlZmluaXRpb24gQTIgcHJlc2VudCI+Ci0gICAgICAgICAgICA8cHJlc2VudGF0aW9uIHhtaTppZD0iLThCUFJJZ19TYkhUd1FBaUFaeTgzUHciIGhyZWY9InVtYTovLy04QlBSSWdfU2JIVHdRQWlBWnk4M1B3Iy04QlBSSWdfU2JIVHdRQWlBWnk4M1B3Ii8+Ci0gICAgICAgICAgPC9jb250ZW50RWxlbWVudHM+Ci0gICAgICAgICAgPGNvbnRlbnRFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpUZXJtRGVmaW5pdGlvbiIgeG1pOmlkPSJfc2ZpSlVBLVZFZHFMMk8xUEpWOWNaQSIgbmFtZT0idGVybV9kZWZpbml0aW9uX0ExIiBndWlkPSJfc2ZpSlVBLVZFZHFMMk8xUEpWOWNaQSIgcHJlc2VudGF0aW9uTmFtZT0iVGVybSBEZWZpbml0aW9uIEExIHByZXNlbnQiPgotICAgICAgICAgICAgPHByZXNlbnRhdGlvbiB4bWk6aWQ9Ii1OdmN0U3VtN21tTzRxXzA4Z0xwRDVBIiBocmVmPSJ1bWE6Ly8tTnZjdFN1bTdtbU80cV8wOGdMcEQ1QSMtTnZjdFN1bTdtbU80cV8wOGdMcEQ1QSIvPgotICAgICAgICAgIDwvY29udGVudEVsZW1lbnRzPgotICAgICAgICAgIDxjb250ZW50RWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VGFzayIgeG1pOmlkPSJfb1VsdUVFREZFZHFPOU0zZnVrWUFfQSIgbmFtZT0idGFza19BMyIgZ3VpZD0iX29VbHVFRURGRWRxTzlNM2Z1a1lBX0EiIGJyaWVmRGVzY3JpcHRpb249ImJyaWVmOiBUYXNrIEEzIiBvcmRlcmluZ0d1aWRlPSImbHQ7P3htbCB2ZXJzaW9uPSZxdW90OzEuMCZxdW90OyBlbmNvZGluZz0mcXVvdDtBU0NJSSZxdW90Oz8mZ3Q7ICZsdDtjb20uaWJtLnVtYS5lZGl0LnRuZy51dGlsLm1vZGVsOk9yZGVySW5mb0NvbGxlY3Rpb24geG1pOnZlcnNpb249JnF1b3Q7Mi4wJnF1b3Q7IHhtbG5zOnhtaT0mcXVvdDtodHRwOi8vd3d3Lm9tZy5vcmcvWE1JJnF1b3Q7IHhtbG5zOmNvbS5pYm0udW1hLmVkaXQudG5nLnV0aWwubW9kZWw9JnF1b3Q7aHR0cDovLy9jb20vaWJtL3VtYS9lZGl0L3RuZy91dGlsL21vZGVsLmVjb3JlJnF1b3Q7Jmd0OyAgICZsdDtvcmRlckluZm9zIG5hbWU9JnF1b3Q7c2VjdGlvbnMmcXVvdDsgdGltZXN0YW1wPSZxdW90OzExMjk3NDcyNjQxMDkmcXVvdDsmZ3Q7ICAgICAmbHQ7Z1VJRHMmZ3Q7X3JDV3dVRURQRWRxcmhzWmgzUU5BTVEmbHQ7L2dVSURzJmd0OyAgICAgJmx0O2dVSURzJmd0O190aTJCWUJCT0VkcUJzN0toZFZMUkxBJmx0Oy9nVUlEcyZndDsgICAgICZsdDtnVUlEcyZndDtfdW15Z1lFRFBFZHFyaHNaaDNRTkFNUSZsdDsvZ1VJRHMmZ3Q7ICAgICAmbHQ7Z1VJRHMmZ3Q7X3RrN3NFQkJPRWRxQnM3S2hkVkxSTEEmbHQ7L2dVSURzJmd0OyAgICAgJmx0O2dVSURzJmd0O192eDVCa0VEUEVkcXJoc1poM1FOQU1RJmx0Oy9nVUlEcyZndDsgICAgICZsdDtnVUlEcyZndDtfdG5kYm9CQk9FZHFCczdLaGRWTFJMQSZsdDsvZ1VJRHMmZ3Q7ICAgJmx0Oy9vcmRlckluZm9zJmd0OyAmbHQ7L2NvbS5pYm0udW1hLmVkaXQudG5nLnV0aWwubW9kZWw6T3JkZXJJbmZvQ29sbGVjdGlvbiZndDsgIiBwcmVzZW50YXRpb25OYW1lPSJUYXNrIEEzIGV4dGVuZHMgVGFzayBBMiIgdmFyaWFiaWxpdHlUeXBlPSJleHRlbmRzIiB2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50PSJfNzVOUXdBLVBFZHFMMk8xUEpWOWNaQSIgcGVyZm9ybWVkQnk9Il84Wk42QUVERkVkcU85TTNmdWtZQV9BIiBhZGRpdGlvbmFsbHlQZXJmb3JtZWRCeT0iXzZrM1VBQS1QRWRxTDJPMVBKVjljWkEiPgotICAgICAgICAgICAgPHByZXNlbnRhdGlvbiB4bWk6aWQ9Ii1iUjlUWDFiWjZXOVJZNUl2SVBHVWpnIiBocmVmPSJ1bWE6Ly8tYlI5VFgxYlo2VzlSWTVJdklQR1VqZyMtYlI5VFgxYlo2VzlSWTVJdklQR1VqZyIvPgotICAgICAgICAgIDwvY29udGVudEVsZW1lbnRzPgotICAgICAgICAgIDxjb250ZW50RWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Um9sZSIgeG1pOmlkPSJfOFpONkFFREZFZHFPOU0zZnVrWUFfQSIgbmFtZT0icm9sZV9BMyIgZ3VpZD0iXzhaTjZBRURGRWRxTzlNM2Z1a1lBX0EiIGJyaWVmRGVzY3JpcHRpb249ImJyaWVmIDogUm9sZSBBMyIgcHJlc2VudGF0aW9uTmFtZT0iUm9sZSBBMyBleHRlbmRzIFJvbGUgQTIiIHZhcmlhYmlsaXR5VHlwZT0iZXh0ZW5kcyIgdmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudD0iXzZrM1VBQS1QRWRxTDJPMVBKVjljWkEiPgotICAgICAgICAgICAgPHByZXNlbnRhdGlvbiB4bWk6aWQ9Ii1ZdW1kc1VPSEZWaEdrZXd3SUNOZGd3IiBocmVmPSJ1bWE6Ly8tWXVtZHNVT0hGVmhHa2V3d0lDTmRndyMtWXVtZHNVT0hGVmhHa2V3d0lDTmRndyIvPgotICAgICAgICAgIDwvY29udGVudEVsZW1lbnRzPgotICAgICAgICA8L2NoaWxkUGFja2FnZXM+Ci0gICAgICA8L2NoaWxkUGFja2FnZXM+Ci0gICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzUGFja2FnZSIgeG1pOmlkPSJfeVVlTExRLVBFZHFMMk8xUEpWOWNaQSIgbmFtZT0iQ2FwYWJpbGl0eVBhdHRlcm5zIiBndWlkPSJfeVVlTExRLVBFZHFMMk8xUEpWOWNaQSI+Ci0gICAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NQYWNrYWdlIiB4bWk6aWQ9Il9UUWJuSUEtV0VkcUwyTzFQSlY5Y1pBIiBuYW1lPSJjYXBQYXRQYWtfQTEiIGd1aWQ9Il9UUWJuSUEtV0VkcUwyTzFQSlY5Y1pBIj4KLSAgICAgICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzQ29tcG9uZW50IiB4bWk6aWQ9Il80c0N0c0R6Z0VkcTV5c0ZPTnIxQkdRIiBocmVmPSJ1bWE6Ly9fNHNDdHNEemdFZHE1eXNGT05yMUJHUSNfNHNDdHNEemdFZHE1eXNGT05yMUJHUSIvPgotICAgICAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NDb21wb25lbnQiIHhtaTppZD0iX1p0WmJNRURGRWRxTzlNM2Z1a1lBX0EiIGhyZWY9InVtYTovL19adFpiTUVERkVkcU85TTNmdWtZQV9BI19adFpiTUVERkVkcU85TTNmdWtZQV9BIi8+Ci0gICAgICAgIDwvY2hpbGRQYWNrYWdlcz4KLSAgICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc0NvbXBvbmVudCIgeG1pOmlkPSJfYUhVU1FCQk5FZHFCczdLaGRWTFJMQSIgaHJlZj0idW1hOi8vX2FIVVNRQkJORWRxQnM3S2hkVkxSTEEjX2FIVVNRQkJORWRxQnM3S2hkVkxSTEEiLz4KLSAgICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc0NvbXBvbmVudCIgeG1pOmlkPSJfZEJodmtFQXZFZHFGcUl1OC1ja29sZyIgaHJlZj0idW1hOi8vX2RCaHZrRUF2RWRxRnFJdTgtY2tvbGcjX2RCaHZrRUF2RWRxRnFJdTgtY2tvbGciLz4KLSAgICAgIDwvY2hpbGRQYWNrYWdlcz4KLSAgICA8L21ldGhvZFBhY2thZ2VzPgotICAgIDxtZXRob2RQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzUGFja2FnZSIgeG1pOmlkPSJfeVVlTExnLVBFZHFMMk8xUEpWOWNaQSIgbmFtZT0iRGVsaXZlcnlQcm9jZXNzZXMiIGd1aWQ9Il95VWVMTGctUEVkcUwyTzFQSlY5Y1pBIj4KLSAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NDb21wb25lbnQiIHhtaTppZD0iX1c2YTRjQkJORWRxQnM3S2hkVkxSTEEiIGhyZWY9InVtYTovL19XNmE0Y0JCTkVkcUJzN0toZFZMUkxBI19XNmE0Y0JCTkVkcUJzN0toZFZMUkxBIi8+Ci0gICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzUGFja2FnZSIgeG1pOmlkPSJfalVOZm9CQk5FZHFCczdLaGRWTFJMQSIgbmFtZT0iZGVsUHJvY1BhayBBMSIgZ3VpZD0iX2pVTmZvQkJORWRxQnM3S2hkVkxSTEEiPgotICAgICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzQ29tcG9uZW50IiB4bWk6aWQ9Il91cTVLOEJNMUVkcXFuZGktZ0R1eHB3IiBocmVmPSJ1bWE6Ly9fdXE1SzhCTTFFZHFxbmRpLWdEdXhwdyNfdXE1SzhCTTFFZHFxbmRpLWdEdXhwdyIvPgotICAgICAgPC9jaGlsZFBhY2thZ2VzPgotICAgIDwvbWV0aG9kUGFja2FnZXM+Ci0gICAgPG1ldGhvZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NQYWNrYWdlIiB4bWk6aWQ9Il95VWVMTHctUEVkcUwyTzFQSlY5Y1pBIiBuYW1lPSJQcm9jZXNzQ29udHJpYnV0aW9ucyIgZ3VpZD0iX3lVZUxMdy1QRWRxTDJPMVBKVjljWkEiLz4KLSAgPC9vcmcuZWNsaXBzZS5lcGYudW1hOk1ldGhvZFBsdWdpbj4KLTwveG1pOlhNST4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9yb2xlcy9yb2xlX0ExLnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9yb2xlcy9yb2xlX0ExLnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzM4Zjk4Zi4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvcm9sZXMvcm9sZV9BMS54bWkKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08b3JnLmVjbGlwc2UuZXBmLnVtYTpSb2xlRGVzY3JpcHRpb24geG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiIHhtaTppZD0iLWc3bTk4Smw4YVJiVjZuZk9HVXBHbmciIG5hbWU9InJvbGVfQTEsXzU1emswQS1QRWRxTDJPMVBKVjljWkEiIGd1aWQ9Ii1nN205OEpsOGFSYlY2bmZPR1VwR25nIiBjaGFuZ2VEYXRlPSIyMDA1LTEwLTE4VDE2OjA0OjEwLjYwOS0wNzAwIj4KLSAgPG1haW5EZXNjcmlwdGlvbj5Sb2xlIEExIG1haW48L21haW5EZXNjcmlwdGlvbj4KLSAgPGtleUNvbnNpZGVyYXRpb25zPlJvbGUgQTEga2V5PC9rZXlDb25zaWRlcmF0aW9ucz4KLSAgPHNraWxscz5Sb2xlIEExIHNraWxsczwvc2tpbGxzPgotICA8YXNzaWdubWVudEFwcHJvYWNoZXM+Um9sZSBBMSBhc3NpZ248L2Fzc2lnbm1lbnRBcHByb2FjaGVzPgotICA8c3lub255bXM+Um9sZSBBMSBzeW48L3N5bm9ueW1zPgotPC9vcmcuZWNsaXBzZS5lcGYudW1hOlJvbGVEZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9yb2xlcy9yb2xlX0EyLnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9yb2xlcy9yb2xlX0EyLnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDExNTFjYi4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvcm9sZXMvcm9sZV9BMi54bWkKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08b3JnLmVjbGlwc2UuZXBmLnVtYTpSb2xlRGVzY3JpcHRpb24geG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiIHhtaTppZD0iLUh4a2NWaUh1NTdiREd1bDQyMXJCdmciIG5hbWU9InJvbGVfQTIsXzZrM1VBQS1QRWRxTDJPMVBKVjljWkEiIGd1aWQ9Ii1IeGtjVmlIdTU3YkRHdWw0MjFyQnZnIiBjaGFuZ2VEYXRlPSIyMDA1LTEwLTE5VDEwOjMyOjM1LjQyMi0wNzAwIj4KLSAgPG1haW5EZXNjcmlwdGlvbj5Sb2xlIEEyIG1haW48L21haW5EZXNjcmlwdGlvbj4KLSAgPGtleUNvbnNpZGVyYXRpb25zPlJvbGUgQTIga2V5PC9rZXlDb25zaWRlcmF0aW9ucz4KLSAgPHNraWxscz5Sb2xlIEEyIHNraWxsczwvc2tpbGxzPgotICA8YXNzaWdubWVudEFwcHJvYWNoZXM+Um9sZSBBMiBhc3NpZ248L2Fzc2lnbm1lbnRBcHByb2FjaGVzPgotICA8c3lub255bXM+Um9sZSBBMiBzeW48L3N5bm9ueW1zPgotPC9vcmcuZWNsaXBzZS5lcGYudW1hOlJvbGVEZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9yb2xlcy9yb2xlX0EzLnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9yb2xlcy9yb2xlX0EzLnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzI2NjMwNi4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvcm9sZXMvcm9sZV9BMy54bWkKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08b3JnLmVjbGlwc2UuZXBmLnVtYTpSb2xlRGVzY3JpcHRpb24geG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiIHhtaTppZD0iLVl1bWRzVU9IRlZoR2tld3dJQ05kZ3ciIG5hbWU9Im5ld19yb2xlLF84Wk42QUVERkVkcU85TTNmdWtZQV9BIiBndWlkPSItWXVtZHNVT0hGVmhHa2V3d0lDTmRndyIgY2hhbmdlRGF0ZT0iMjAwNS0xMC0xOVQxMDoyOTo1OS40NTMtMDcwMCI+Ci0gIDxtYWluRGVzY3JpcHRpb24+bWFpbjogUm9sZSBBMzwvbWFpbkRlc2NyaXB0aW9uPgotICA8a2V5Q29uc2lkZXJhdGlvbnM+a2V5OiBSb2xlIEEzPC9rZXlDb25zaWRlcmF0aW9ucz4KLSAgPHNraWxscz5za2lsbHM6IFJvbGUgQTM8L3NraWxscz4KLSAgPGFzc2lnbm1lbnRBcHByb2FjaGVzPmFzc2lnbm1lbnQ6IFJvbGUgQTM8L2Fzc2lnbm1lbnRBcHByb2FjaGVzPgotICA8c3lub255bXM+c3lub255bW5zIDogUm9sZSBBMzwvc3lub255bXM+Ci08L29yZy5lY2xpcHNlLmVwZi51bWE6Um9sZURlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL3JvbGVzZXRncm91cGluZ3Mvcm9sZV9zZXRfZ3JvdXBpbmdfQTEueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL3JvbGVzZXRncm91cGluZ3Mvcm9sZV9zZXRfZ3JvdXBpbmdfQTEueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NmUwOTFjLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9yb2xlc2V0Z3JvdXBpbmdzL3JvbGVfc2V0X2dyb3VwaW5nX0ExLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnREZXNjcmlwdGlvbiB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCIgeG1pOmlkPSItRlY5OUswVk03ZjRjbEFVa1lib0ZPUSIgbmFtZT0icm9sZV9zZXRfZ3JvdXBpbmdfQTEsX0pZbjBnQS1XRWRxTDJPMVBKVjljWkEiIGd1aWQ9Ii1GVjk5SzBWTTdmNGNsQVVrWWJvRk9RIiBjaGFuZ2VEYXRlPSIyMDA1LTA4LTE4VDE3OjQ5OjMxLjY0MS0wNzAwIj4KLSAgPG1haW5EZXNjcmlwdGlvbj5Sb2xlIFNldCBHcm91cGluZyBBMSBtYWluPC9tYWluRGVzY3JpcHRpb24+Ci0gIDxrZXlDb25zaWRlcmF0aW9ucz5Sb2xlIFNldCBHcm91cGluZyBBMSBrZXk8L2tleUNvbnNpZGVyYXRpb25zPgotPC9vcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnREZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9yb2xlc2V0cy9yb2xlX3NldF9BMS54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvcm9sZXNldHMvcm9sZV9zZXRfQTEueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMWIxYTk0Li4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9yb2xlc2V0cy9yb2xlX3NldF9BMS54bWkKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08b3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50RGVzY3JpcHRpb24geG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiIHhtaTppZD0iLVdHYTlOUUotYk01VVowSnVZX0FFUHciIG5hbWU9InJvbGVfc2V0X0ExLF85UHAxVUJCS0VkcUJzN0toZFZMUkxBIiBndWlkPSItV0dhOU5RSi1iTTVVWjBKdVlfQUVQdyIgY2hhbmdlRGF0ZT0iMjAwNS0wOC0yMlQxMDo0NzoyMy4yNTAtMDcwMCI+Ci0gIDxtYWluRGVzY3JpcHRpb24+Um9sZSBTZXQgQTEgbWFpbjwvbWFpbkRlc2NyaXB0aW9uPgotICA8a2V5Q29uc2lkZXJhdGlvbnM+Um9sZSBTZXQgQTExIGtleTwva2V5Q29uc2lkZXJhdGlvbnM+Ci08L29yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL3JvbGVzZXRzL3JvbGVfc2V0X0EyLnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9yb2xlc2V0cy9yb2xlX3NldF9BMi54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4MDVmMzMuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL3JvbGVzZXRzL3JvbGVfc2V0X0EyLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnREZXNjcmlwdGlvbiB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCIgeG1pOmlkPSItTFJHbGVISXBOczVNYjlRQU9HZlpRdyIgbmFtZT0icm9sZV9zZXRfQTIsXy11YmdjQkJLRWRxQnM3S2hkVkxSTEEiIGd1aWQ9Ii1MUkdsZUhJcE5zNU1iOVFBT0dmWlF3IiBjaGFuZ2VEYXRlPSIyMDA1LTA4LTE4VDE3OjUwOjQwLjMyOC0wNzAwIj4KLSAgPG1haW5EZXNjcmlwdGlvbj5Sb2xlIFNldCBBMiBtYWluPC9tYWluRGVzY3JpcHRpb24+Ci0gIDxrZXlDb25zaWRlcmF0aW9ucz5Sb2xlIFNldCBBMiBrZXk8L2tleUNvbnNpZGVyYXRpb25zPgotPC9vcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnREZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS90YXNrcy90YXNrX0ExLnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS90YXNrcy90YXNrX0ExLnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTdlMTlhNS4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvdGFza3MvdGFza19BMS54bWkKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPG9yZy5lY2xpcHNlLmVwZi51bWE6VGFza0Rlc2NyaXB0aW9uIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6ZXBmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZiIgZXBmOnZlcnNpb249IjEuMi4wIiB4bWk6aWQ9Ii1TMWlnTFNpNkFJX3ZsdXpXT0N1NlR3IiBuYW1lPSJ0YXNrX0ExLF83TThuc0EtUEVkcUwyTzFQSlY5Y1pBIiBndWlkPSItUzFpZ0xTaTZBSV92bHV6V09DdTZUdyIgY2hhbmdlRGF0ZT0iMjAwNS0xMC0xOVQxMDoyODozOS40MjItMDcwMCI+Ci0gIDxtYWluRGVzY3JpcHRpb24+VGFzayBBMSBtYWluPC9tYWluRGVzY3JpcHRpb24+Ci0gIDxzZWN0aW9ucyB4bWk6aWQ9Il90dkY0TUJCUEVkcUJzN0toZFZMUkxBIiBuYW1lPSJTdGVwIEExLjEiIGd1aWQ9Il90dkY0TUJCUEVkcUJzN0toZFZMUkxBIj4KLSAgICA8c2VjdGlvbkRlc2NyaXB0aW9uPmFscGhhPC9zZWN0aW9uRGVzY3JpcHRpb24+Ci0gIDwvc2VjdGlvbnM+Ci0gIDxzZWN0aW9ucyB4bWk6aWQ9Il90emtJZ0JCUEVkcUJzN0toZFZMUkxBIiBuYW1lPSJTdGVwIEExLjIiIGd1aWQ9Il90emtJZ0JCUEVkcUJzN0toZFZMUkxBIj4KLSAgICA8c2VjdGlvbkRlc2NyaXB0aW9uPmJldGE8L3NlY3Rpb25EZXNjcmlwdGlvbj4KLSAgPC9zZWN0aW9ucz4KLSAgPHNlY3Rpb25zIHhtaTppZD0iX3VDQmJRQkJQRWRxQnM3S2hkVkxSTEEiIG5hbWU9IlN0ZXAgQTEuMyIgZ3VpZD0iX3VDQmJRQkJQRWRxQnM3S2hkVkxSTEEiPgotICAgIDxzZWN0aW9uRGVzY3JpcHRpb24+Z2FtbWE8L3NlY3Rpb25EZXNjcmlwdGlvbj4KLSAgPC9zZWN0aW9ucz4KLSAgPGtleUNvbnNpZGVyYXRpb25zPlRhc2sgQTEga2V5PC9rZXlDb25zaWRlcmF0aW9ucz4KLSAgPHB1cnBvc2U+VGFzayBBMSBwdXJwb3NlPC9wdXJwb3NlPgotICA8YWx0ZXJuYXRpdmVzPlRhc2sgQTEgYWx0PC9hbHRlcm5hdGl2ZXM+Ci08L29yZy5lY2xpcHNlLmVwZi51bWE6VGFza0Rlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL3Rhc2tzL3Rhc2tfQTIueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL3Rhc2tzL3Rhc2tfQTIueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NmQ3YjcxLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS90YXNrcy90YXNrX0EyLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08b3JnLmVjbGlwc2UuZXBmLnVtYTpUYXNrRGVzY3JpcHRpb24geG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiIHhtaTppZD0iLTEzcThKSkFhMGl4NnJETVpBcXd5MXciIG5hbWU9InRhc2tfQTIsXzc1TlF3QS1QRWRxTDJPMVBKVjljWkEiIGd1aWQ9Ii0xM3E4SkpBYTBpeDZyRE1aQXF3eTF3IiBjaGFuZ2VEYXRlPSIyMDA1LTEwLTE5VDEwOjI5OjIyLjU0Ny0wNzAwIj4KLSAgPG1haW5EZXNjcmlwdGlvbj5UYXNrIEEyIG1haW48L21haW5EZXNjcmlwdGlvbj4KLSAgPHNlY3Rpb25zIHhtaTppZD0iX3RpMkJZQkJPRWRxQnM3S2hkVkxSTEEiIG5hbWU9IlN0ZXAgQTIuMSIgZ3VpZD0iX3RpMkJZQkJPRWRxQnM3S2hkVkxSTEEiPgotICAgIDxzZWN0aW9uRGVzY3JpcHRpb24+Jmx0O3AmZ3Q7Ci0gICAgcHV0IHlvdXIgcmlnaHQgZm9vdCBpbgotJmx0Oy9wJmd0Ozwvc2VjdGlvbkRlc2NyaXB0aW9uPgotICA8L3NlY3Rpb25zPgotICA8c2VjdGlvbnMgeG1pOmlkPSJfdGs3c0VCQk9FZHFCczdLaGRWTFJMQSIgbmFtZT0iU3RlcCBBMi4yIiBndWlkPSJfdGs3c0VCQk9FZHFCczdLaGRWTFJMQSI+Ci0gICAgPHNlY3Rpb25EZXNjcmlwdGlvbj5wdXQgeW91ciByaWdodCBmb290IG91dDwvc2VjdGlvbkRlc2NyaXB0aW9uPgotICA8L3NlY3Rpb25zPgotICA8c2VjdGlvbnMgeG1pOmlkPSJfdG5kYm9CQk9FZHFCczdLaGRWTFJMQSIgbmFtZT0iU3RlcCBBMi4zIiBndWlkPSJfdG5kYm9CQk9FZHFCczdLaGRWTFJMQSI+Ci0gICAgPHNlY3Rpb25EZXNjcmlwdGlvbj5EbyB0aGUgaG9rZXktcG9rZXk8L3NlY3Rpb25EZXNjcmlwdGlvbj4KLSAgPC9zZWN0aW9ucz4KLSAgPGtleUNvbnNpZGVyYXRpb25zPlRhc2sgQTIga2V5PC9rZXlDb25zaWRlcmF0aW9ucz4KLSAgPHB1cnBvc2U+VGFzayBBMiBwdXJwb3NlPC9wdXJwb3NlPgotICA8YWx0ZXJuYXRpdmVzPlRhc2sgQTIgYWx0PC9hbHRlcm5hdGl2ZXM+Ci08L29yZy5lY2xpcHNlLmVwZi51bWE6VGFza0Rlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL3Rhc2tzL3Rhc2tfQTMueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL3Rhc2tzL3Rhc2tfQTMueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MzNhZjNjLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS90YXNrcy90YXNrX0EzLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08b3JnLmVjbGlwc2UuZXBmLnVtYTpUYXNrRGVzY3JpcHRpb24geG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiIHhtaTppZD0iLWJSOVRYMWJaNlc5Ulk1SXZJUEdVamciIG5hbWU9Iixfb1VsdUVFREZFZHFPOU0zZnVrWUFfQSIgZ3VpZD0iLWJSOVRYMWJaNlc5Ulk1SXZJUEdVamciIGNoYW5nZURhdGU9IjIwMDUtMTAtMTlUMTA6Mjc6NDMuMDAwLTA3MDAiPgotICA8bWFpbkRlc2NyaXB0aW9uPm1haW46IFRhc2sgQTM8L21haW5EZXNjcmlwdGlvbj4KLSAgPHNlY3Rpb25zIHhtaTppZD0iX3JDV3dVRURQRWRxcmhzWmgzUU5BTVEiIG5hbWU9IlN0ZXAgQTMuMSIgZ3VpZD0iX3JDV3dVRURQRWRxcmhzWmgzUU5BTVEiPgotICAgIDxzZWN0aW9uRGVzY3JpcHRpb24+U3RlcCBBMy4xPC9zZWN0aW9uRGVzY3JpcHRpb24+Ci0gIDwvc2VjdGlvbnM+Ci0gIDxzZWN0aW9ucyB4bWk6aWQ9Il91bXlnWUVEUEVkcXJoc1poM1FOQU1RIiBuYW1lPSJTdGVwIEEzLjIiIGd1aWQ9Il91bXlnWUVEUEVkcXJoc1poM1FOQU1RIj4KLSAgICA8c2VjdGlvbkRlc2NyaXB0aW9uPlN0ZXAgQTMuMjwvc2VjdGlvbkRlc2NyaXB0aW9uPgotICA8L3NlY3Rpb25zPgotICA8c2VjdGlvbnMgeG1pOmlkPSJfdng1QmtFRFBFZHFyaHNaaDNRTkFNUSIgbmFtZT0iU3RlcCBBMy4zIiBndWlkPSJfdng1QmtFRFBFZHFyaHNaaDNRTkFNUSI+Ci0gICAgPHNlY3Rpb25EZXNjcmlwdGlvbj5TdGVwIEEzLjM8L3NlY3Rpb25EZXNjcmlwdGlvbj4KLSAgPC9zZWN0aW9ucz4KLSAgPGtleUNvbnNpZGVyYXRpb25zPmtleXM6IFRhc2sgQTM8L2tleUNvbnNpZGVyYXRpb25zPgotICA8cHVycG9zZT5wdXJwb3NlOiBUYXNrIEEzPC9wdXJwb3NlPgotICA8YWx0ZXJuYXRpdmVzPmFsdGVybmF0aXZlczogVGFzayBBMzwvYWx0ZXJuYXRpdmVzPgotPC9vcmcuZWNsaXBzZS5lcGYudW1hOlRhc2tEZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS90b29scy90b29sX0ExLnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS90b29scy90b29sX0ExLnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWY0MjcwMi4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvdG9vbHMvdG9vbF9BMS54bWkKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08b3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50RGVzY3JpcHRpb24geG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiIHhtaTppZD0iLXkwNHdQRTEwLVNCOGlGbnU1Y1hhTUEiIG5hbWU9InRvb2xfQTEsX0t4YmFnQS1XRWRxTDJPMVBKVjljWkEiIGd1aWQ9Ii15MDR3UEUxMC1TQjhpRm51NWNYYU1BIiBjaGFuZ2VEYXRlPSIyMDA1LTA4LTE4VDE3OjUyOjA3LjIwMy0wNzAwIj4KLSAgPG1haW5EZXNjcmlwdGlvbj5Ub29sIEExIG1haW48L21haW5EZXNjcmlwdGlvbj4KLSAgPGtleUNvbnNpZGVyYXRpb25zPlRvb2wgQTEga2V5PC9rZXlDb25zaWRlcmF0aW9ucz4KLTwvb3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvdG9vbHMvdG9vbF9BMi54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvdG9vbHMvdG9vbF9BMi54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzNzNiZjIuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL3Rvb2xzL3Rvb2xfQTIueG1pCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPG9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudERlc2NyaXB0aW9uIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6ZXBmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZiIgZXBmOnZlcnNpb249IjEuMi4wIiB4bWk6aWQ9Ii16ekJQLTU0R3VRV2ZWVHo2MFNkUXN3IiBuYW1lPSJ0b29sX0EyLF9MaGFGOEEtV0VkcUwyTzFQSlY5Y1pBIiBndWlkPSItenpCUC01NEd1UVdmVlR6NjBTZFFzdyIgY2hhbmdlRGF0ZT0iMjAwNS0wOC0xOFQxNzo1MjozNC41NzgtMDcwMCI+Ci0gIDxtYWluRGVzY3JpcHRpb24+VG9vbCBBMiBtYWluPC9tYWluRGVzY3JpcHRpb24+Ci0gIDxrZXlDb25zaWRlcmF0aW9ucz5Ub29sIEEyIGtleTwva2V5Q29uc2lkZXJhdGlvbnM+Ci08L29yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL3dvcmtwcm9kdWN0cy9hcnRpZmFjdF9BMS54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvd29ya3Byb2R1Y3RzL2FydGlmYWN0X0ExLnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGMzMDBiYi4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvd29ya3Byb2R1Y3RzL2FydGlmYWN0X0ExLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08b3JnLmVjbGlwc2UuZXBmLnVtYTpBcnRpZmFjdERlc2NyaXB0aW9uIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6ZXBmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZiIgZXBmOnZlcnNpb249IjEuMi4wIiB4bWk6aWQ9Ii1uOVRKUWEwRkp2R19hdkRYYUFUaklRIiBuYW1lPSJhcnRpZmFjdF9BMSB4LF85S3Q3OEEtUEVkcUwyTzFQSlY5Y1pBIiBndWlkPSItbjlUSlFhMEZKdkdfYXZEWGFBVGpJUSIgY2hhbmdlRGF0ZT0iMjAwNS0wOS0wN1QxNDo1Mjo0NC45ODQtMDcwMCI+Ci0gIDxtYWluRGVzY3JpcHRpb24+QXJ0aWZhY3QgQTEgbWFpbjwvbWFpbkRlc2NyaXB0aW9uPgotICA8a2V5Q29uc2lkZXJhdGlvbnM+QXJ0aWZhY3QgQTEga2V5PC9rZXlDb25zaWRlcmF0aW9ucz4KLSAgPGV4dGVybmFsSWQ+QXJ0aWZhY3QgQTEgdW5pcXVlPC9leHRlcm5hbElkPgotICA8cHVycG9zZT5BcnRpZmFjdCBBMSBwdXJwb3NlPC9wdXJwb3NlPgotICA8aW1wYWN0T2ZOb3RIYXZpbmc+QXJ0aWZhY3QgQTEgaW1wYWN0PC9pbXBhY3RPZk5vdEhhdmluZz4KLSAgPHJlYXNvbnNGb3JOb3ROZWVkaW5nPkFydGlmYWN0IEExIHJlYXNvbjwvcmVhc29uc0Zvck5vdE5lZWRpbmc+Ci0gIDxicmllZk91dGxpbmU+QXJ0aWZhY3QgQTEgYnJpZWY8L2JyaWVmT3V0bGluZT4KLSAgPHJlcHJlc2VudGF0aW9uT3B0aW9ucz5BcnRpZmFjdCBBMSByZXA8L3JlcHJlc2VudGF0aW9uT3B0aW9ucz4KLTwvb3JnLmVjbGlwc2UuZXBmLnVtYTpBcnRpZmFjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL3dvcmtwcm9kdWN0cy9hcnRpZmFjdF9BMi4xLnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS93b3JrcHJvZHVjdHMvYXJ0aWZhY3RfQTIuMS54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1YTkxZjEuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL3dvcmtwcm9kdWN0cy9hcnRpZmFjdF9BMi4xLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08b3JnLmVjbGlwc2UuZXBmLnVtYTpBcnRpZmFjdERlc2NyaXB0aW9uIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6ZXBmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZiIgZXBmOnZlcnNpb249IjEuMi4wIiB4bWk6aWQ9Ii1VRlJvZUFLSGRYWDJTU0IxS1VYdFlBIiBuYW1lPSJhcnRpZmFjdF9BMi4xLF9IRU10RUEtUkVkcUwyTzFQSlY5Y1pBIiBndWlkPSItVUZSb2VBS0hkWFgyU1NCMUtVWHRZQSIgY2hhbmdlRGF0ZT0iMjAwNS0wOC0xN1QxOTo0NDowNy43ODEtMDcwMCI+Ci0gIDxtYWluRGVzY3JpcHRpb24+QXJ0aWZhY3QgQTIuMSBtYWluPC9tYWluRGVzY3JpcHRpb24+Ci0gIDxrZXlDb25zaWRlcmF0aW9ucz5BcnRpZmFjdCBBMi4xIGtleTwva2V5Q29uc2lkZXJhdGlvbnM+Ci0gIDxleHRlcm5hbElkPkFydGlmYWN0IEEyLjEgdW5pcXVlPC9leHRlcm5hbElkPgotICA8cHVycG9zZT5BcnRpZmFjdCBBMi4xIHB1cnBvc2U8L3B1cnBvc2U+Ci0gIDxpbXBhY3RPZk5vdEhhdmluZz5BcnRpZmFjdCBBMi4xIGltcGFjdDwvaW1wYWN0T2ZOb3RIYXZpbmc+Ci0gIDxyZWFzb25zRm9yTm90TmVlZGluZz5BcnRpZmFjdCBBMi4xIHJlYXNvbjwvcmVhc29uc0Zvck5vdE5lZWRpbmc+Ci0gIDxicmllZk91dGxpbmU+QXJ0aWZhY3QgQTIuMSBicmllZjwvYnJpZWZPdXRsaW5lPgotICA8cmVwcmVzZW50YXRpb25PcHRpb25zPkFydGlmYWN0IEEyLjEgcmVwPC9yZXByZXNlbnRhdGlvbk9wdGlvbnM+Ci08L29yZy5lY2xpcHNlLmVwZi51bWE6QXJ0aWZhY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS93b3JrcHJvZHVjdHMvYXJ0aWZhY3RfQTIueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL3dvcmtwcm9kdWN0cy9hcnRpZmFjdF9BMi54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiOWIzYWEuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL3dvcmtwcm9kdWN0cy9hcnRpZmFjdF9BMi54bWkKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPG9yZy5lY2xpcHNlLmVwZi51bWE6QXJ0aWZhY3REZXNjcmlwdGlvbiB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCIgeG1pOmlkPSItSlRXS241ZDRDTGM0S0ZRTURURnBTUSIgbmFtZT0iYXJ0aWZhY3RfQTIsX0U3WjBrQS1SRWRxTDJPMVBKVjljWkEiIGd1aWQ9Ii1KVFdLbjVkNENMYzRLRlFNRFRGcFNRIiBjaGFuZ2VEYXRlPSIyMDA1LTA4LTE3VDE5OjQxOjI0LjM5MS0wNzAwIj4KLSAgPG1haW5EZXNjcmlwdGlvbj5BcnRpZmFjdCBBMiBtYWluPC9tYWluRGVzY3JpcHRpb24+Ci0gIDxrZXlDb25zaWRlcmF0aW9ucz5BcnRpZmFjdCBBMiBrZXk8L2tleUNvbnNpZGVyYXRpb25zPgotICA8ZXh0ZXJuYWxJZD5BcnRpZmFjdCBBMiB1bmlxdWU8L2V4dGVybmFsSWQ+Ci0gIDxwdXJwb3NlPkFydGlmYWN0IEEyIHB1cnBvc2U8L3B1cnBvc2U+Ci0gIDxpbXBhY3RPZk5vdEhhdmluZz5BcnRpZmFjdCBBMiBpbXBhY3Q8L2ltcGFjdE9mTm90SGF2aW5nPgotICA8cmVhc29uc0Zvck5vdE5lZWRpbmc+QXJ0aWZhY3QgQTIgcmVhc29uPC9yZWFzb25zRm9yTm90TmVlZGluZz4KLSAgPGJyaWVmT3V0bGluZT5BcnRpZmFjdCBBMiBicmllZjwvYnJpZWZPdXRsaW5lPgotICA8cmVwcmVzZW50YXRpb25PcHRpb25zPkFydGlmYWN0IEEyIHJlcDwvcmVwcmVzZW50YXRpb25PcHRpb25zPgotPC9vcmcuZWNsaXBzZS5lcGYudW1hOkFydGlmYWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvd29ya3Byb2R1Y3RzL2RlbGl2ZXJhYmxlX0ExLnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS93b3JrcHJvZHVjdHMvZGVsaXZlcmFibGVfQTEueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MDYyYTI1Li4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS93b3JrcHJvZHVjdHMvZGVsaXZlcmFibGVfQTEueG1pCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxvcmcuZWNsaXBzZS5lcGYudW1hOkRlbGl2ZXJhYmxlRGVzY3JpcHRpb24geG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiIHhtaTppZD0iLUFiWFJnNDRMOFR4eDRDa0IyaHg1TlEiIG5hbWU9ImRlbGl2ZXJhYmxlX0ExLF9JSVNuVUEtUkVkcUwyTzFQSlY5Y1pBIiBndWlkPSItQWJYUmc0NEw4VHh4NENrQjJoeDVOUSIgY2hhbmdlRGF0ZT0iMjAwNS0wOC0xOFQxNDoyOTo1OS4zOTEtMDcwMCI+Ci0gIDxtYWluRGVzY3JpcHRpb24+RGVsaXZlcmFibGUgQTEgbWFpbjwvbWFpbkRlc2NyaXB0aW9uPgotICA8a2V5Q29uc2lkZXJhdGlvbnM+RGVsaXZlcmFibGUgQTEga2V5PC9rZXlDb25zaWRlcmF0aW9ucz4KLSAgPGV4dGVybmFsSWQ+RGVsaXZlcmFibGUgQTEgdW5pcXVlPC9leHRlcm5hbElkPgotICA8cHVycG9zZT5EZWxpdmVyYWJsZSBBMSBwb3Jwb2lzZTwvcHVycG9zZT4KLSAgPGltcGFjdE9mTm90SGF2aW5nPkRlbGl2ZXJhYmxlIEExIGltcGFjdDwvaW1wYWN0T2ZOb3RIYXZpbmc+Ci0gIDxyZWFzb25zRm9yTm90TmVlZGluZz5EZWxpdmVyYWJsZSBBMSByZWFzb248L3JlYXNvbnNGb3JOb3ROZWVkaW5nPgotICA8ZXh0ZXJuYWxEZXNjcmlwdGlvbj5EZWxpdmVyYWJsZSBBMSBleHRlcm48L2V4dGVybmFsRGVzY3JpcHRpb24+Ci0gIDxwYWNrYWdpbmdHdWlkYW5jZT5EZWxpdmVyYWJsZSBBMSBwa2c8L3BhY2thZ2luZ0d1aWRhbmNlPgotPC9vcmcuZWNsaXBzZS5lcGYudW1hOkRlbGl2ZXJhYmxlRGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvd29ya3Byb2R1Y3RzL2RlbGl2ZXJhYmxlX0EyLnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS93b3JrcHJvZHVjdHMvZGVsaXZlcmFibGVfQTIueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OWY0N2UzLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS93b3JrcHJvZHVjdHMvZGVsaXZlcmFibGVfQTIueG1pCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxvcmcuZWNsaXBzZS5lcGYudW1hOkRlbGl2ZXJhYmxlRGVzY3JpcHRpb24geG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiIHhtaTppZD0iLU1kcW9hLW54d0VIZkFKY29BNlhOS1EiIG5hbWU9ImRlbGl2ZXJhYmxlX0EyLF9KQnFmVUEtUkVkcUwyTzFQSlY5Y1pBIiBndWlkPSItTWRxb2Etbnh3RUhmQUpjb0E2WE5LUSIgY2hhbmdlRGF0ZT0iMjAwNS0wOC0xOFQxNDozMDoxNS4xNzItMDcwMCI+Ci0gIDxtYWluRGVzY3JpcHRpb24+RGVsaXZlcmFibGUgQTIgbWFpbjwvbWFpbkRlc2NyaXB0aW9uPgotICA8a2V5Q29uc2lkZXJhdGlvbnM+RGVsaXZlcmFibGUgQTIga2V5PC9rZXlDb25zaWRlcmF0aW9ucz4KLSAgPGV4dGVybmFsSWQ+RGVsaXZlcmFibGUgQTIgdW5pcXVlPC9leHRlcm5hbElkPgotICA8cHVycG9zZT5EZWxpdmVyYWJsZSBBMiBwb3Jwb2lzZTwvcHVycG9zZT4KLSAgPGltcGFjdE9mTm90SGF2aW5nPkRlbGl2ZXJhYmxlIEEyJmFtcDtuYnNwO2ltcGFjdDwvaW1wYWN0T2ZOb3RIYXZpbmc+Ci0gIDxyZWFzb25zRm9yTm90TmVlZGluZz5EZWxpdmVyYWJsZSBBMiByZWFzb248L3JlYXNvbnNGb3JOb3ROZWVkaW5nPgotICA8ZXh0ZXJuYWxEZXNjcmlwdGlvbj5EZWxpdmVyYWJsZSBBMiBleHRlcm48L2V4dGVybmFsRGVzY3JpcHRpb24+Ci0gIDxwYWNrYWdpbmdHdWlkYW5jZT5EZWxpdmVyYWJsZSBBMiBwa2c8L3BhY2thZ2luZ0d1aWRhbmNlPgotPC9vcmcuZWNsaXBzZS5lcGYudW1hOkRlbGl2ZXJhYmxlRGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvd29ya3Byb2R1Y3RzL291dGNvbWVfQTEueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL3dvcmtwcm9kdWN0cy9vdXRjb21lX0ExLnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWQ4YjQ2MS4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvd29ya3Byb2R1Y3RzL291dGNvbWVfQTEueG1pCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPG9yZy5lY2xpcHNlLmVwZi51bWE6V29ya1Byb2R1Y3REZXNjcmlwdGlvbiB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCIgeG1pOmlkPSItM29keUJ5SWV6UlJYZ1FnZUh1TTZTQSIgbmFtZT0ib3V0Y29tZV9BMSxfS0FfMVlBLVJFZHFMMk8xUEpWOWNaQSIgZ3VpZD0iLTNvZHlCeUllelJSWGdRZ2VIdU02U0EiIGNoYW5nZURhdGU9IjIwMDUtMDgtMThUMTQ6MzA6MTguMTg4LTA3MDAiIGNoYW5nZURlc2NyaXB0aW9uPSIgT3V0Y29tZSBBMSAiPgotICA8bWFpbkRlc2NyaXB0aW9uPk91dGNvbWUgQTEgbWFpbjwvbWFpbkRlc2NyaXB0aW9uPgotICA8a2V5Q29uc2lkZXJhdGlvbnM+T3V0Y29tZSBBMSBrZXk8L2tleUNvbnNpZGVyYXRpb25zPgotICA8ZXh0ZXJuYWxJZD5PdXRjb21lIEExIHVuaXF1ZTwvZXh0ZXJuYWxJZD4KLSAgPHB1cnBvc2U+T3V0Y29tZSBBMSBwb3Jwb2lzZTwvcHVycG9zZT4KLSAgPGltcGFjdE9mTm90SGF2aW5nPk91dGNvbWUgQTEgaW1wYWN0PC9pbXBhY3RPZk5vdEhhdmluZz4KLSAgPHJlYXNvbnNGb3JOb3ROZWVkaW5nPk91dGNvbWUgQTEgcmVhc29uPC9yZWFzb25zRm9yTm90TmVlZGluZz4KLTwvb3JnLmVjbGlwc2UuZXBmLnVtYTpXb3JrUHJvZHVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL3dvcmtwcm9kdWN0cy9vdXRjb21lX0EyLnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS93b3JrcHJvZHVjdHMvb3V0Y29tZV9BMi54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjYjFlNDMuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL3dvcmtwcm9kdWN0cy9vdXRjb21lX0EyLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxvcmcuZWNsaXBzZS5lcGYudW1hOldvcmtQcm9kdWN0RGVzY3JpcHRpb24geG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiIHhtaTppZD0iLTRHYkFXR2I4N0Fsei1Hel9HXzlwMWciIG5hbWU9Im91dGNvbWVfQTIsX0t2THhFQS1SRWRxTDJPMVBKVjljWkEiIGd1aWQ9Ii00R2JBV0diODdBbHotR3pfR185cDFnIiBjaGFuZ2VEYXRlPSIyMDA1LTA4LTE4VDE0OjMwOjIxLjI4MS0wNzAwIj4KLSAgPG1haW5EZXNjcmlwdGlvbj5PdXRjb21lIEExIG1haW48L21haW5EZXNjcmlwdGlvbj4KLSAgPGtleUNvbnNpZGVyYXRpb25zPk91dGNvbWUgQTEga2V5PC9rZXlDb25zaWRlcmF0aW9ucz4KLSAgPGV4dGVybmFsSWQ+T3V0Y29tZSBBMSB1bmlxdWU8L2V4dGVybmFsSWQ+Ci0gIDxwdXJwb3NlPk91dGNvbWUgQTEgcG9ycG9pc2U8L3B1cnBvc2U+Ci0gIDxpbXBhY3RPZk5vdEhhdmluZz5PdXRjb21lIEExIGltcGFjdDwvaW1wYWN0T2ZOb3RIYXZpbmc+Ci0gIDxyZWFzb25zRm9yTm90TmVlZGluZz5PdXRjb21lIEExIHJlYXNvbjwvcmVhc29uc0Zvck5vdE5lZWRpbmc+Ci08L29yZy5lY2xpcHNlLmVwZi51bWE6V29ya1Byb2R1Y3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS93b3JrcHJvZHVjdHMvc3ViX2FydGlmYWN0X0ExLjEueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL3dvcmtwcm9kdWN0cy9zdWJfYXJ0aWZhY3RfQTEuMS54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiMmE1YzQuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL3dvcmtwcm9kdWN0cy9zdWJfYXJ0aWZhY3RfQTEuMS54bWkKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPG9yZy5lY2xpcHNlLmVwZi51bWE6QXJ0aWZhY3REZXNjcmlwdGlvbiB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCIgeG1pOmlkPSItOW4xV1g1ZDdJRmhWSjRwekhWX3ZyUSIgbmFtZT0ic3ViX2FydGlmYWN0X0ExLjEsX0Y1MXl3QS1SRWRxTDJPMVBKVjljWkEiIGd1aWQ9Ii05bjFXWDVkN0lGaFZKNHB6SFZfdnJRIiBjaGFuZ2VEYXRlPSIyMDA1LTA4LTE4VDE4OjA0OjE5LjMxMi0wNzAwIj4KLSAgPG1haW5EZXNjcmlwdGlvbj5TdWJfQXJ0aWZhY3QgQTEuMSBtYWluPC9tYWluRGVzY3JpcHRpb24+Ci0gIDxrZXlDb25zaWRlcmF0aW9ucz5TdWJfQXJ0aWZhY3QgQTEuMSBrZXk8L2tleUNvbnNpZGVyYXRpb25zPgotICA8ZXh0ZXJuYWxJZD5TdWJfQXJ0aWZhY3QgQTEuMSB1bmlxdWU8L2V4dGVybmFsSWQ+Ci0gIDxwdXJwb3NlPlN1Yl9BcnRpZmFjdCBBMS4xIHB1cnBvc2U8L3B1cnBvc2U+Ci0gIDxpbXBhY3RPZk5vdEhhdmluZz5BcnRpZmFjdCBBMS4xIGltcGFjdDwvaW1wYWN0T2ZOb3RIYXZpbmc+Ci0gIDxyZWFzb25zRm9yTm90TmVlZGluZz5BcnRpZmFjdCBBMS4xIHJlYXNvbjwvcmVhc29uc0Zvck5vdE5lZWRpbmc+Ci0gIDxicmllZk91dGxpbmU+U3ViX0FydGlmYWN0IEExLjEgYnJpZWY8L2JyaWVmT3V0bGluZT4KLSAgPHJlcHJlc2VudGF0aW9uT3B0aW9ucz5TdWJfQXJ0aWZhY3QgQTEuMSByZXA8L3JlcHJlc2VudGF0aW9uT3B0aW9ucz4KLTwvb3JnLmVjbGlwc2UuZXBmLnVtYTpBcnRpZmFjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL3dvcmtwcm9kdWN0dHlwZXMvd29ya19wcm9kdWN0X3R5cGVfQTEueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL3dvcmtwcm9kdWN0dHlwZXMvd29ya19wcm9kdWN0X3R5cGVfQTEueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNjdjOGYzLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS93b3JrcHJvZHVjdHR5cGVzL3dvcmtfcHJvZHVjdF90eXBlX0ExLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnREZXNjcmlwdGlvbiB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCIgeG1pOmlkPSItVGZSRG9IaXNtc2hqOGNMMmxPUnRjZyIgbmFtZT0id29ya19wcm9kdWN0X3R5cGVfQTEsX0hnaERZQS1XRWRxTDJPMVBKVjljWkEiIGd1aWQ9Ii1UZlJEb0hpc21zaGo4Y0wybE9SdGNnIiBjaGFuZ2VEYXRlPSIyMDA1LTA4LTE4VDE4OjAyOjQ0LjEyNS0wNzAwIj4KLSAgPG1haW5EZXNjcmlwdGlvbj5Xb3JrIFByb2R1Y3QgVHlwZSBBMSBtYWluPC9tYWluRGVzY3JpcHRpb24+Ci0gIDxrZXlDb25zaWRlcmF0aW9ucz5Xb3JrIFByb2R1Y3QgVHlwZSBBMSBrZXk8L2tleUNvbnNpZGVyYXRpb25zPgotPC9vcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnREZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS93b3JrcHJvZHVjdHR5cGVzL3dvcmtfcHJvZHVjdF90eXBlX0EyLnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS93b3JrcHJvZHVjdHR5cGVzL3dvcmtfcHJvZHVjdF90eXBlX0EyLnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjM1NDc2NS4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvd29ya3Byb2R1Y3R0eXBlcy93b3JrX3Byb2R1Y3RfdHlwZV9BMi54bWkKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08b3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50RGVzY3JpcHRpb24geG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiIHhtaTppZD0iLWNsZkRBMFBNNnhMSWp5aFNwMWlMUVEiIG5hbWU9IndvcmtfcHJvZHVjdF90eXBlX0EyLF9JRm5VZ0EtV0VkcUwyTzFQSlY5Y1pBIiBndWlkPSItY2xmREEwUE02eExJanloU3AxaUxRUSIgY2hhbmdlRGF0ZT0iMjAwNS0wOC0xOFQxODowMzoxNi4zNDQtMDcwMCI+Ci0gIDxtYWluRGVzY3JpcHRpb24+V29yayBQcm9kdWN0IFR5cGUgQTEgbWFpbjwvbWFpbkRlc2NyaXB0aW9uPgotICA8a2V5Q29uc2lkZXJhdGlvbnM+V29yayBQcm9kdWN0IFR5cGUgQTEga2V5PC9rZXlDb25zaWRlcmF0aW9ucz4KLTwvb3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvY2FwYWJpbGl0eXBhdHRlcm5zL0NQIEIxL2NvbnRlbnQueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL2NhcGFiaWxpdHlwYXR0ZXJucy9DUCBCMS9jb250ZW50LnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTIzZTA4NC4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvY2FwYWJpbGl0eXBhdHRlcm5zL0NQIEIxL2NvbnRlbnQueG1pCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPG9yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc0Rlc2NyaXB0aW9uIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6ZXBmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZiIgZXBmOnZlcnNpb249IjEuMi4wIiB4bWk6aWQ9Ii13eWJIS1VkbFhiREZHMEhPUGhBSjZRIiBuYW1lPSJDUCBBMSxfZEJodmtVQXZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iLXd5YkhLVWRsWGJERkcwSE9QaEFKNlEiLz4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi9jYXBhYmlsaXR5cGF0dGVybnMvQ1AgQjEvZGlhZ3JhbS54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvY2FwYWJpbGl0eXBhdHRlcm5zL0NQIEIxL2RpYWdyYW0ueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYzU1NjlmLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi9jYXBhYmlsaXR5cGF0dGVybnMvQ1AgQjEvZGlhZ3JhbS54bWkKKysrIC9kZXYvbnVsbApAQCAtMSw0MjEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTx4bWk6WE1JIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6ZWNvcmU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUiIHhtbG5zOm5vdGF0aW9uPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2dtZi9ydW50aW1lLzEuMC4wL25vdGF0aW9uIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbD0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvZGlhZ3JhbS8xLjAuMC9kaWFncmFtLmVjb3JlIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczp1bWw9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvdW1sMi8yLjAuMC9VTUwiPgotICA8b3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw6QWN0aXZpdHlEZXRhaWxEaWFncmFtIHhtaTppZD0iX0ljX1JvT3g0RWR1Mk9vNnEtbkhXZ2ciPgotICAgIDxsaW5rZWRFbGVtZW50IHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNhcGFiaWxpdHlQYXR0ZXJuIiBocmVmPSJ1bWE6Ly9fNTZ4blFFQTVFZHFGcUl1OC1ja29sZyNfNTY3WW9rQTVFZHFGcUl1OC1ja29sZyIvPgotICA8L29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOkFjdGl2aXR5RGV0YWlsRGlhZ3JhbT4KLSAgPG5vdGF0aW9uOkRpYWdyYW0geG1pOmlkPSJfSWNfUm9leDRFZHUyT282cS1uSFdnZyIgdHlwZT0iQUREIiBlbGVtZW50PSJfSWNfUm9PeDRFZHUyT282cS1uSFdnZyIgbmFtZT0iQ1AgQjEiIG1lYXN1cmVtZW50VW5pdD0iUGl4ZWwiPgotICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOlBhZ2VTdHlsZSIgeG1pOmlkPSJfSWNfUm91eDRFZHUyT282cS1uSFdnZyIvPgotICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkd1aWRlU3R5bGUiIHhtaTppZD0iX0ljX1JvLXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpEZXNjcmlwdGlvblN0eWxlIiB4bWk6aWQ9Il9JY19ScE94NEVkdTJPbzZxLW5IV2dnIi8+Ci0gIDwvbm90YXRpb246RGlhZ3JhbT4KLSAgPHVtbDpBY3Rpdml0eSB4bWk6aWQ9Il9JZV9jd094NEVkdTJPbzZxLW5IV2dnIiBuYW1lPSJBY3QxIj4KLSAgICA8ZUFubm90YXRpb25zIHhtaTp0eXBlPSJlY29yZTpFQW5ub3RhdGlvbiIgeG1pOmlkPSJfSWVfY3dleDRFZHUyT282cS1uSFdnZyIgc291cmNlPSJ1bWFfZWxlbWVudCI+Ci0gICAgICA8ZGV0YWlscyB4bWk6dHlwZT0iZWNvcmU6RVN0cmluZ1RvU3RyaW5nTWFwRW50cnkiIHhtaTppZD0iX0llX2N3dXg0RWR1Mk9vNnEtbkhXZ2ciIGtleT0idXJpIiB2YWx1ZT0idW1hOi8vXzU2eG5RRUE1RWRxRnFJdTgtY2tvbGcjXzU2N1lRMEE1RWRxRnFJdTgtY2tvbGciLz4KLSAgICAgIDxkZXRhaWxzIHhtaTp0eXBlPSJlY29yZTpFU3RyaW5nVG9TdHJpbmdNYXBFbnRyeSIgeG1pOmlkPSJfSWVfY3cteDRFZHUyT282cS1uSFdnZyIga2V5PSJ0eXBlIiB2YWx1ZT0iQWN0aXZpdHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8bm9kZSB4bWk6dHlwZT0idW1sOkFjdGl2aXR5UGFyYW1ldGVyTm9kZSIgeG1pOmlkPSJfSWdKVFVPeDRFZHUyT282cS1uSFdnZyIgbmFtZT0iVGFzayBBMSBwcmVzZW50Ij4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOnR5cGU9ImVjb3JlOkVBbm5vdGF0aW9uIiB4bWk6aWQ9Il9JZ1Zna094NEVkdTJPbzZxLW5IV2dnIiBzb3VyY2U9InVtYV9lbGVtZW50Ij4KLSAgICAgICAgPGRldGFpbHMgeG1pOnR5cGU9ImVjb3JlOkVTdHJpbmdUb1N0cmluZ01hcEVudHJ5IiB4bWk6aWQ9Il9JZ1Zna2V4NEVkdTJPbzZxLW5IV2dnIiBrZXk9InVyaSIgdmFsdWU9InVtYTovL181NnhuUUVBNUVkcUZxSXU4LWNrb2xnI181NjdZU1VBNUVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTp0eXBlPSJlY29yZTpFU3RyaW5nVG9TdHJpbmdNYXBFbnRyeSIgeG1pOmlkPSJfSWdWZ2t1eDRFZHUyT282cS1uSFdnZyIga2V5PSJ0eXBlIiB2YWx1ZT0iVGFzayIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9ub2RlPgotICAgIDxub2RlIHhtaTp0eXBlPSJ1bWw6QWN0aXZpdHlQYXJhbWV0ZXJOb2RlIiB4bWk6aWQ9Il9JaDNLa3V4NEVkdTJPbzZxLW5IV2dnIiBuYW1lPSJUYXNrIEIxIHByZXNuZXQiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6dHlwZT0iZWNvcmU6RUFubm90YXRpb24iIHhtaTppZD0iX0loM0trLXg0RWR1Mk9vNnEtbkhXZ2ciIHNvdXJjZT0idW1hX2VsZW1lbnQiPgotICAgICAgICA8ZGV0YWlscyB4bWk6dHlwZT0iZWNvcmU6RVN0cmluZ1RvU3RyaW5nTWFwRW50cnkiIHhtaTppZD0iX0loM0tsT3g0RWR1Mk9vNnEtbkhXZ2ciIGtleT0idXJpIiB2YWx1ZT0idW1hOi8vXzU2eG5RRUE1RWRxRnFJdTgtY2tvbGcjXzU2N1lSMEE1RWRxRnFJdTgtY2tvbGciLz4KLSAgICAgICAgPGRldGFpbHMgeG1pOnR5cGU9ImVjb3JlOkVTdHJpbmdUb1N0cmluZ01hcEVudHJ5IiB4bWk6aWQ9Il9JaDNLbGV4NEVkdTJPbzZxLW5IV2dnIiBrZXk9InR5cGUiIHZhbHVlPSJUYXNrIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L25vZGU+Ci0gICAgPG5vZGUgeG1pOnR5cGU9InVtbDpBY3Rpdml0eVBhcmFtZXRlck5vZGUiIHhtaTppZD0iX0loM0tuLXg0RWR1Mk9vNnEtbkhXZ2ciIG5hbWU9IlRhc2sgQjIgcHJlc2VudCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTp0eXBlPSJlY29yZTpFQW5ub3RhdGlvbiIgeG1pOmlkPSJfSWgzS29PeDRFZHUyT282cS1uSFdnZyIgc291cmNlPSJ1bWFfZWxlbWVudCI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTp0eXBlPSJlY29yZTpFU3RyaW5nVG9TdHJpbmdNYXBFbnRyeSIgeG1pOmlkPSJfSWgzS29leDRFZHUyT282cS1uSFdnZyIga2V5PSJ1cmkiIHZhbHVlPSJ1bWE6Ly9fNTZ4blFFQTVFZHFGcUl1OC1ja29sZyNfNTY3WVJFQTVFZHFGcUl1OC1ja29sZyIvPgotICAgICAgICA8ZGV0YWlscyB4bWk6dHlwZT0iZWNvcmU6RVN0cmluZ1RvU3RyaW5nTWFwRW50cnkiIHhtaTppZD0iX0loM0tvdXg0RWR1Mk9vNnEtbkhXZ2ciIGtleT0idHlwZSIgdmFsdWU9IlRhc2siLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvbm9kZT4KLSAgICA8bm9kZSB4bWk6dHlwZT0idW1sOkFjdGl2aXR5UGFyYW1ldGVyTm9kZSIgeG1pOmlkPSJfSWgzS3JPeDRFZHUyT282cS1uSFdnZyIgbmFtZT0iVGFzayBBMiAiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6dHlwZT0iZWNvcmU6RUFubm90YXRpb24iIHhtaTppZD0iX0loM0tyZXg0RWR1Mk9vNnEtbkhXZ2ciIHNvdXJjZT0idW1hX2VsZW1lbnQiPgotICAgICAgICA8ZGV0YWlscyB4bWk6dHlwZT0iZWNvcmU6RVN0cmluZ1RvU3RyaW5nTWFwRW50cnkiIHhtaTppZD0iX0loM0tydXg0RWR1Mk9vNnEtbkhXZ2ciIGtleT0idXJpIiB2YWx1ZT0idW1hOi8vXzU2eG5RRUE1RWRxRnFJdTgtY2tvbGcjXzU2N1lSa0E1RWRxRnFJdTgtY2tvbGciLz4KLSAgICAgICAgPGRldGFpbHMgeG1pOnR5cGU9ImVjb3JlOkVTdHJpbmdUb1N0cmluZ01hcEVudHJ5IiB4bWk6aWQ9Il9JaDNLci14NEVkdTJPbzZxLW5IV2dnIiBrZXk9InR5cGUiIHZhbHVlPSJUYXNrIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L25vZGU+Ci0gIDwvdW1sOkFjdGl2aXR5PgotICA8bm90YXRpb246RGlhZ3JhbSB4bWk6aWQ9Il9JZlJ3b094NEVkdTJPbzZxLW5IV2dnIiB0eXBlPSJBRCIgZWxlbWVudD0iX0llX2N3T3g0RWR1Mk9vNnEtbkhXZ2ciIG5hbWU9IkFjdDEiIG1lYXN1cmVtZW50VW5pdD0iUGl4ZWwiPgotICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfSWhrMnNPeDRFZHUyT282cS1uSFdnZyIgdHlwZT0iMTAwOSIgZWxlbWVudD0iX0lnSlRVT3g0RWR1Mk9vNnEtbkhXZ2ciPgotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il9JaHhEOE94NEVkdTJPbzZxLW5IV2dnIiB0eXBlPSI0MDA4Ii8+Ci0gICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOk5vZGUiIHhtaTppZD0iX0loM0trT3g0RWR1Mk9vNnEtbkhXZ2ciIHR5cGU9IjQwMDgiLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkZvbnRTdHlsZSIgeG1pOmlkPSJfSWhrMnNleDRFZHUyT282cS1uSFdnZyIgZm9udE5hbWU9IkFyaWFsIiBmb250SGVpZ2h0PSI4Ii8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpEZXNjcmlwdGlvblN0eWxlIiB4bWk6aWQ9Il9JaGsyc3V4NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpGaWxsU3R5bGUiIHhtaTppZD0iX0loazJzLXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkxpbmVTdHlsZSIgeG1pOmlkPSJfSWhrMnRPeDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSWgzS2tleDRFZHUyT282cS1uSFdnZyIgeD0iLTEiIHk9Ii0xIi8+Ci0gICAgPC9jaGlsZHJlbj4KLSAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOk5vZGUiIHhtaTppZD0iX0loM0tsdXg0RWR1Mk9vNnEtbkhXZ2ciIHR5cGU9IjEwMDkiIGVsZW1lbnQ9Il9JaDNLa3V4NEVkdTJPbzZxLW5IV2dnIj4KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfSWgzS25PeDRFZHUyT282cS1uSFdnZyIgdHlwZT0iNDAwOCIvPgotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il9JaDNLbmV4NEVkdTJPbzZxLW5IV2dnIiB0eXBlPSI0MDA4Ii8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpGb250U3R5bGUiIHhtaTppZD0iX0loM0tsLXg0RWR1Mk9vNnEtbkhXZ2ciIGZvbnROYW1lPSJBcmlhbCIgZm9udEhlaWdodD0iOCIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RGVzY3JpcHRpb25TdHlsZSIgeG1pOmlkPSJfSWgzS21PeDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RmlsbFN0eWxlIiB4bWk6aWQ9Il9JaDNLbWV4NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpMaW5lU3R5bGUiIHhtaTppZD0iX0loM0ttdXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0loM0tudXg0RWR1Mk9vNnEtbkhXZ2ciIHg9IjEwIiB5PSIxMCIvPgotICAgIDwvY2hpbGRyZW4+Ci0gICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il9JaDNLby14NEVkdTJPbzZxLW5IV2dnIiB0eXBlPSIxMDA5IiBlbGVtZW50PSJfSWgzS24teDRFZHUyT282cS1uSFdnZyI+Ci0gICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOk5vZGUiIHhtaTppZD0iX0loM0txZXg0RWR1Mk9vNnEtbkhXZ2ciIHR5cGU9IjQwMDgiLz4KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfSWgzS3F1eDRFZHUyT282cS1uSFdnZyIgdHlwZT0iNDAwOCIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246Rm9udFN0eWxlIiB4bWk6aWQ9Il9JaDNLcE94NEVkdTJPbzZxLW5IV2dnIiBmb250TmFtZT0iQXJpYWwiIGZvbnRIZWlnaHQ9IjgiLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkRlc2NyaXB0aW9uU3R5bGUiIHhtaTppZD0iX0loM0twZXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkZpbGxTdHlsZSIgeG1pOmlkPSJfSWgzS3B1eDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246TGluZVN0eWxlIiB4bWk6aWQ9Il9JaDNLcC14NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9JaDNLcS14NEVkdTJPbzZxLW5IV2dnIiB4PSIxMjkiIHk9IjEwIi8+Ci0gICAgPC9jaGlsZHJlbj4KLSAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOk5vZGUiIHhtaTppZD0iX0loM0tzT3g0RWR1Mk9vNnEtbkhXZ2ciIHR5cGU9IjEwMDkiIGVsZW1lbnQ9Il9JaDNLck94NEVkdTJPbzZxLW5IV2dnIj4KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfSWg5Uk1PeDRFZHUyT282cS1uSFdnZyIgdHlwZT0iNDAwOCIvPgotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il9JaDlSTWV4NEVkdTJPbzZxLW5IV2dnIiB0eXBlPSI0MDA4Ii8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpGb250U3R5bGUiIHhtaTppZD0iX0loM0tzZXg0RWR1Mk9vNnEtbkhXZ2ciIGZvbnROYW1lPSJBcmlhbCIgZm9udEhlaWdodD0iOCIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RGVzY3JpcHRpb25TdHlsZSIgeG1pOmlkPSJfSWgzS3N1eDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RmlsbFN0eWxlIiB4bWk6aWQ9Il9JaDNLcy14NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpMaW5lU3R5bGUiIHhtaTppZD0iX0loM0t0T3g0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0loOVJNdXg0RWR1Mk9vNnEtbkhXZ2ciIHg9Ii0xIiB5PSItMSIvPgotICAgIDwvY2hpbGRyZW4+Ci0gICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246UGFnZVN0eWxlIiB4bWk6aWQ9Il9JZlJ3b2V4NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246R3VpZGVTdHlsZSIgeG1pOmlkPSJfSWZSd291eDRFZHUyT282cS1uSFdnZyIvPgotICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkRlc2NyaXB0aW9uU3R5bGUiIHhtaTppZD0iX0lmUndvLXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgPC9ub3RhdGlvbjpEaWFncmFtPgotICA8b3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw6QWN0aXZpdHlEZXRhaWxEaWFncmFtIHhtaTppZD0iX0lpVnIwT3g0RWR1Mk9vNnEtbkhXZ2ciPgotICAgIDxsaW5rZWRFbGVtZW50IHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkFjdGl2aXR5IiBocmVmPSJ1bWE6Ly9fNTZ4blFFQTVFZHFGcUl1OC1ja29sZyNfNTY3WVEwQTVFZHFGcUl1OC1ja29sZyIvPgotICAgIDxub2RlcyB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw6Um9sZVRhc2tDb21wb3NpdGUiIHhtaTppZD0iX0lpVnIwZXg0RWR1Mk9vNnEtbkhXZ2ciPgotICAgICAgPGxpbmtlZEVsZW1lbnQgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Um9sZURlc2NyaXB0b3IiIGhyZWY9InVtYTovL181NnhuUUVBNUVkcUZxSXU4LWNrb2xnI181NjdZU0VBNUVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgICA8bm9kZXMgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOlJvbGVOb2RlIiB4bWk6aWQ9Il9JaVZyMHV4NEVkdTJPbzZxLW5IV2dnIiBuYW1lPSJSb2xlIEExIj4KLSAgICAgICAgPGxpbmtlZEVsZW1lbnQgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Um9sZURlc2NyaXB0b3IiIGhyZWY9InVtYTovL181NnhuUUVBNUVkcUZxSXU4LWNrb2xnI181NjdZU0VBNUVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgICA8L25vZGVzPgotICAgICAgPG5vZGVzIHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDpUYXNrTm9kZSIgeG1pOmlkPSJfSWlWcjAteDRFZHUyT282cS1uSFdnZyIgaW5jb21pbmdDb25uZWN0aW9ucz0iX0lpVnIxdXg0RWR1Mk9vNnEtbkhXZ2ciIG5hbWU9IlRhc2sgQTEgcHJlc2VudCI+Ci0gICAgICAgIDxsaW5rZWRFbGVtZW50IHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlRhc2tEZXNjcmlwdG9yIiBocmVmPSJ1bWE6Ly9fNTZ4blFFQTVFZHFGcUl1OC1ja29sZyNfNTY3WVNVQTVFZHFGcUl1OC1ja29sZyIvPgotICAgICAgICA8b3V0Z29pbmdDb25uZWN0aW9ucyB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw6TGluayIgeG1pOmlkPSJfSWlWcjFPeDRFZHUyT282cS1uSFdnZyIgdGFyZ2V0PSJfSWlWcjJleDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPC9ub2Rlcz4KLSAgICA8L25vZGVzPgotICAgIDxub2RlcyB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw6V29ya1Byb2R1Y3RDb21wb3NpdGUiIHhtaTppZD0iX0lpVnIxZXg0RWR1Mk9vNnEtbkhXZ2ciIHR5cGU9IjEiPgotICAgICAgPGxpbmtlZEVsZW1lbnQgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VGFza0Rlc2NyaXB0b3IiIGhyZWY9InVtYTovL181NnhuUUVBNUVkcUZxSXU4LWNrb2xnI181NjdZU1VBNUVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgICA8b3V0Z29pbmdDb25uZWN0aW9ucyB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw6TGluayIgeG1pOmlkPSJfSWlWcjF1eDRFZHUyT282cS1uSFdnZyIgdGFyZ2V0PSJfSWlWcjAteDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPG5vZGVzIHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDpXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlIiB4bWk6aWQ9Il9JaVZyMS14NEVkdTJPbzZxLW5IV2dnIiBuYW1lPSJTdWJfQXJ0aWZhY3QgQTEuMSBwcmVzZW50Ij4KLSAgICAgICAgPGxpbmtlZEVsZW1lbnQgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6V29ya1Byb2R1Y3REZXNjcmlwdG9yIiBocmVmPSJ1bWE6Ly9fNTZ4blFFQTVFZHFGcUl1OC1ja29sZyNfNTY3WW9VQTVFZHFGcUl1OC1ja29sZyIvPgotICAgICAgPC9ub2Rlcz4KLSAgICAgIDxub2RlcyB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw6V29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZSIgeG1pOmlkPSJfSWlWcjJPeDRFZHUyT282cS1uSFdnZyIgbmFtZT0iQXJ0aWZhY3QgQTEgcHJlc2VudCI+Ci0gICAgICAgIDxsaW5rZWRFbGVtZW50IHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOldvcmtQcm9kdWN0RGVzY3JpcHRvciIgaHJlZj0idW1hOi8vXzU2eG5RRUE1RWRxRnFJdTgtY2tvbGcjXzU2N1lua0E1RWRxRnFJdTgtY2tvbGciLz4KLSAgICAgIDwvbm9kZXM+Ci0gICAgPC9ub2Rlcz4KLSAgICA8bm9kZXMgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOldvcmtQcm9kdWN0Q29tcG9zaXRlIiB4bWk6aWQ9Il9JaVZyMmV4NEVkdTJPbzZxLW5IV2dnIiBpbmNvbWluZ0Nvbm5lY3Rpb25zPSJfSWlWcjFPeDRFZHUyT282cS1uSFdnZyIgdHlwZT0iMiI+Ci0gICAgICA8bGlua2VkRWxlbWVudCB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpUYXNrRGVzY3JpcHRvciIgaHJlZj0idW1hOi8vXzU2eG5RRUE1RWRxRnFJdTgtY2tvbGcjXzU2N1lTVUE1RWRxRnFJdTgtY2tvbGciLz4KLSAgICAgIDxub2RlcyB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw6V29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZSIgeG1pOmlkPSJfSWlWcjJ1eDRFZHUyT282cS1uSFdnZyIgbmFtZT0iT3V0Y29tZSBBMSBwcmVzZW50Ij4KLSAgICAgICAgPGxpbmtlZEVsZW1lbnQgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6V29ya1Byb2R1Y3REZXNjcmlwdG9yIiBocmVmPSJ1bWE6Ly9fNTZ4blFFQTVFZHFGcUl1OC1ja29sZyNfNTY3WW4wQTVFZHFGcUl1OC1ja29sZyIvPgotICAgICAgPC9ub2Rlcz4KLSAgICA8L25vZGVzPgotICAgIDxub2RlcyB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw6Um9sZVRhc2tDb21wb3NpdGUiIHhtaTppZD0iX0lpVnIyLXg0RWR1Mk9vNnEtbkhXZ2ciPgotICAgICAgPGxpbmtlZEVsZW1lbnQgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Um9sZURlc2NyaXB0b3IiIGhyZWY9InVtYTovL181NnhuUUVBNUVkcUZxSXU4LWNrb2xnI181NjdZazBBNUVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgICA8bm9kZXMgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOlJvbGVOb2RlIiB4bWk6aWQ9Il9JaVZyM094NEVkdTJPbzZxLW5IV2dnIiBuYW1lPSJSb2xlIEIxIHByZXNlbnQiPgotICAgICAgICA8bGlua2VkRWxlbWVudCB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpSb2xlRGVzY3JpcHRvciIgaHJlZj0idW1hOi8vXzU2eG5RRUE1RWRxRnFJdTgtY2tvbGcjXzU2N1lrMEE1RWRxRnFJdTgtY2tvbGciLz4KLSAgICAgIDwvbm9kZXM+Ci0gICAgICA8bm9kZXMgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOlRhc2tOb2RlIiB4bWk6aWQ9Il9JaVZyM2V4NEVkdTJPbzZxLW5IV2dnIiBpbmNvbWluZ0Nvbm5lY3Rpb25zPSJfSWlWcjRPeDRFZHUyT282cS1uSFdnZyIgbmFtZT0iVGFzayBCMSBwcmVzbmV0Ij4KLSAgICAgICAgPGxpbmtlZEVsZW1lbnQgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VGFza0Rlc2NyaXB0b3IiIGhyZWY9InVtYTovL181NnhuUUVBNUVkcUZxSXU4LWNrb2xnI181NjdZUjBBNUVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgICAgIDxvdXRnb2luZ0Nvbm5lY3Rpb25zIHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDpMaW5rIiB4bWk6aWQ9Il9JaVZyM3V4NEVkdTJPbzZxLW5IV2dnIiB0YXJnZXQ9Il9JaVZyNHV4NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8L25vZGVzPgotICAgIDwvbm9kZXM+Ci0gICAgPG5vZGVzIHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDpXb3JrUHJvZHVjdENvbXBvc2l0ZSIgeG1pOmlkPSJfSWlWcjMteDRFZHUyT282cS1uSFdnZyIgdHlwZT0iMSI+Ci0gICAgICA8bGlua2VkRWxlbWVudCB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpUYXNrRGVzY3JpcHRvciIgaHJlZj0idW1hOi8vXzU2eG5RRUE1RWRxRnFJdTgtY2tvbGcjXzU2N1lSMEE1RWRxRnFJdTgtY2tvbGciLz4KLSAgICAgIDxvdXRnb2luZ0Nvbm5lY3Rpb25zIHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDpMaW5rIiB4bWk6aWQ9Il9JaVZyNE94NEVkdTJPbzZxLW5IV2dnIiB0YXJnZXQ9Il9JaVZyM2V4NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8bm9kZXMgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOldvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGUiIHhtaTppZD0iX0lpVnI0ZXg0RWR1Mk9vNnEtbkhXZ2ciIG5hbWU9IkFydGlmYWN0IEIxIHByZXNlbnQiPgotICAgICAgICA8bGlua2VkRWxlbWVudCB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpXb3JrUHJvZHVjdERlc2NyaXB0b3IiIGhyZWY9InVtYTovL181NnhuUUVBNUVkcUZxSXU4LWNrb2xnI181NjdZblVBNUVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgICA8L25vZGVzPgotICAgIDwvbm9kZXM+Ci0gICAgPG5vZGVzIHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDpXb3JrUHJvZHVjdENvbXBvc2l0ZSIgeG1pOmlkPSJfSWlWcjR1eDRFZHUyT282cS1uSFdnZyIgaW5jb21pbmdDb25uZWN0aW9ucz0iX0lpVnIzdXg0RWR1Mk9vNnEtbkhXZ2ciIHR5cGU9IjIiPgotICAgICAgPGxpbmtlZEVsZW1lbnQgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VGFza0Rlc2NyaXB0b3IiIGhyZWY9InVtYTovL181NnhuUUVBNUVkcUZxSXU4LWNrb2xnI181NjdZUjBBNUVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgICA8bm9kZXMgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOldvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGUiIHhtaTppZD0iX0lpVnI0LXg0RWR1Mk9vNnEtbkhXZ2ciIG5hbWU9Ik91dGNvbWUgQjEgcHJlc2VudCI+Ci0gICAgICAgIDxsaW5rZWRFbGVtZW50IHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOldvcmtQcm9kdWN0RGVzY3JpcHRvciIgaHJlZj0idW1hOi8vXzU2eG5RRUE1RWRxRnFJdTgtY2tvbGcjXzU2N1lsVUE1RWRxRnFJdTgtY2tvbGciLz4KLSAgICAgIDwvbm9kZXM+Ci0gICAgPC9ub2Rlcz4KLSAgICA8bm9kZXMgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOlJvbGVUYXNrQ29tcG9zaXRlIiB4bWk6aWQ9Il9JaVZyNU94NEVkdTJPbzZxLW5IV2dnIj4KLSAgICAgIDxsaW5rZWRFbGVtZW50IHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlJvbGVEZXNjcmlwdG9yIiBocmVmPSJ1bWE6Ly9fNTZ4blFFQTVFZHFGcUl1OC1ja29sZyNfNTY3WWwwQTVFZHFGcUl1OC1ja29sZyIvPgotICAgICAgPG5vZGVzIHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDpSb2xlTm9kZSIgeG1pOmlkPSJfSWlWcjVleDRFZHUyT282cS1uSFdnZyIgbmFtZT0iUm9sZSBCMiBwcmVzZW50Ij4KLSAgICAgICAgPGxpbmtlZEVsZW1lbnQgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Um9sZURlc2NyaXB0b3IiIGhyZWY9InVtYTovL181NnhuUUVBNUVkcUZxSXU4LWNrb2xnI181NjdZbDBBNUVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgICA8L25vZGVzPgotICAgICAgPG5vZGVzIHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDpUYXNrTm9kZSIgeG1pOmlkPSJfSWlWcjV1eDRFZHUyT282cS1uSFdnZyIgaW5jb21pbmdDb25uZWN0aW9ucz0iX0lpVnI2ZXg0RWR1Mk9vNnEtbkhXZ2ciIG5hbWU9IlRhc2sgQjIgcHJlc2VudCI+Ci0gICAgICAgIDxsaW5rZWRFbGVtZW50IHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlRhc2tEZXNjcmlwdG9yIiBocmVmPSJ1bWE6Ly9fNTZ4blFFQTVFZHFGcUl1OC1ja29sZyNfNTY3WVJFQTVFZHFGcUl1OC1ja29sZyIvPgotICAgICAgICA8b3V0Z29pbmdDb25uZWN0aW9ucyB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw6TGluayIgeG1pOmlkPSJfSWlWcjUteDRFZHUyT282cS1uSFdnZyIgdGFyZ2V0PSJfSWlWcjYteDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPC9ub2Rlcz4KLSAgICA8L25vZGVzPgotICAgIDxub2RlcyB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw6V29ya1Byb2R1Y3RDb21wb3NpdGUiIHhtaTppZD0iX0lpVnI2T3g0RWR1Mk9vNnEtbkhXZ2ciIHR5cGU9IjEiPgotICAgICAgPGxpbmtlZEVsZW1lbnQgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VGFza0Rlc2NyaXB0b3IiIGhyZWY9InVtYTovL181NnhuUUVBNUVkcUZxSXU4LWNrb2xnI181NjdZUkVBNUVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgICA8b3V0Z29pbmdDb25uZWN0aW9ucyB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw6TGluayIgeG1pOmlkPSJfSWlWcjZleDRFZHUyT282cS1uSFdnZyIgdGFyZ2V0PSJfSWlWcjV1eDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPG5vZGVzIHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDpXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlIiB4bWk6aWQ9Il9JaVZyNnV4NEVkdTJPbzZxLW5IV2dnIiBuYW1lPSJBcnRpZmFjdCBCMiBwcmVzZW50Ij4KLSAgICAgICAgPGxpbmtlZEVsZW1lbnQgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6V29ya1Byb2R1Y3REZXNjcmlwdG9yIiBocmVmPSJ1bWE6Ly9fNTZ4blFFQTVFZHFGcUl1OC1ja29sZyNfNTY3WVFrQTVFZHFGcUl1OC1ja29sZyIvPgotICAgICAgPC9ub2Rlcz4KLSAgICA8L25vZGVzPgotICAgIDxub2RlcyB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw6V29ya1Byb2R1Y3RDb21wb3NpdGUiIHhtaTppZD0iX0lpVnI2LXg0RWR1Mk9vNnEtbkhXZ2ciIGluY29taW5nQ29ubmVjdGlvbnM9Il9JaVZyNS14NEVkdTJPbzZxLW5IV2dnIiB0eXBlPSIyIj4KLSAgICAgIDxsaW5rZWRFbGVtZW50IHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlRhc2tEZXNjcmlwdG9yIiBocmVmPSJ1bWE6Ly9fNTZ4blFFQTVFZHFGcUl1OC1ja29sZyNfNTY3WVJFQTVFZHFGcUl1OC1ja29sZyIvPgotICAgICAgPG5vZGVzIHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDpXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlIiB4bWk6aWQ9Il9JaVZyN094NEVkdTJPbzZxLW5IV2dnIiBuYW1lPSJPdXRjb21lIEIyIHByZXNlbnQiPgotICAgICAgICA8bGlua2VkRWxlbWVudCB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpXb3JrUHJvZHVjdERlc2NyaXB0b3IiIGhyZWY9InVtYTovL181NnhuUUVBNUVkcUZxSXU4LWNrb2xnI181NjdZbGtBNUVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgICA8L25vZGVzPgotICAgIDwvbm9kZXM+Ci0gICAgPG5vZGVzIHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDpSb2xlVGFza0NvbXBvc2l0ZSIgeG1pOmlkPSJfSWlWcjdleDRFZHUyT282cS1uSFdnZyI+Ci0gICAgICA8bGlua2VkRWxlbWVudCB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpSb2xlRGVzY3JpcHRvciIgaHJlZj0idW1hOi8vXzU2eG5RRUE1RWRxRnFJdTgtY2tvbGcjXzU2N1ltVUE1RWRxRnFJdTgtY2tvbGciLz4KLSAgICAgIDxub2RlcyB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw6Um9sZU5vZGUiIHhtaTppZD0iX0lpVnI3dXg0RWR1Mk9vNnEtbkhXZ2ciIG5hbWU9IlJvbGUgQTIgIj4KLSAgICAgICAgPGxpbmtlZEVsZW1lbnQgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Um9sZURlc2NyaXB0b3IiIGhyZWY9InVtYTovL181NnhuUUVBNUVkcUZxSXU4LWNrb2xnI181NjdZbVVBNUVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgICA8L25vZGVzPgotICAgICAgPG5vZGVzIHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDpUYXNrTm9kZSIgeG1pOmlkPSJfSWlWcjcteDRFZHUyT282cS1uSFdnZyIgaW5jb21pbmdDb25uZWN0aW9ucz0iX0lpVnI4dXg0RWR1Mk9vNnEtbkhXZ2ciIG5hbWU9IlRhc2sgQTIgIj4KLSAgICAgICAgPGxpbmtlZEVsZW1lbnQgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VGFza0Rlc2NyaXB0b3IiIGhyZWY9InVtYTovL181NnhuUUVBNUVkcUZxSXU4LWNrb2xnI181NjdZUmtBNUVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgICAgIDxvdXRnb2luZ0Nvbm5lY3Rpb25zIHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDpMaW5rIiB4bWk6aWQ9Il9JaVZyOE94NEVkdTJPbzZxLW5IV2dnIiB0YXJnZXQ9Il9JaVZyOU94NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8L25vZGVzPgotICAgIDwvbm9kZXM+Ci0gICAgPG5vZGVzIHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDpXb3JrUHJvZHVjdENvbXBvc2l0ZSIgeG1pOmlkPSJfSWlWcjhleDRFZHUyT282cS1uSFdnZyIgdHlwZT0iMSI+Ci0gICAgICA8bGlua2VkRWxlbWVudCB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpUYXNrRGVzY3JpcHRvciIgaHJlZj0idW1hOi8vXzU2eG5RRUE1RWRxRnFJdTgtY2tvbGcjXzU2N1lSa0E1RWRxRnFJdTgtY2tvbGciLz4KLSAgICAgIDxvdXRnb2luZ0Nvbm5lY3Rpb25zIHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDpMaW5rIiB4bWk6aWQ9Il9JaVZyOHV4NEVkdTJPbzZxLW5IV2dnIiB0YXJnZXQ9Il9JaVZyNy14NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8bm9kZXMgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOldvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGUiIHhtaTppZD0iX0lpVnI4LXg0RWR1Mk9vNnEtbkhXZ2ciIG5hbWU9IkFydGlmYWN0IEEyIHByZXNlbnQiPgotICAgICAgICA8bGlua2VkRWxlbWVudCB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpXb3JrUHJvZHVjdERlc2NyaXB0b3IiIGhyZWY9InVtYTovL181NnhuUUVBNUVkcUZxSXU4LWNrb2xnI181NjdZa0VBNUVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgICA8L25vZGVzPgotICAgIDwvbm9kZXM+Ci0gICAgPG5vZGVzIHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDpXb3JrUHJvZHVjdENvbXBvc2l0ZSIgeG1pOmlkPSJfSWlWcjlPeDRFZHUyT282cS1uSFdnZyIgaW5jb21pbmdDb25uZWN0aW9ucz0iX0lpVnI4T3g0RWR1Mk9vNnEtbkhXZ2ciIHR5cGU9IjIiPgotICAgICAgPGxpbmtlZEVsZW1lbnQgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VGFza0Rlc2NyaXB0b3IiIGhyZWY9InVtYTovL181NnhuUUVBNUVkcUZxSXU4LWNrb2xnI181NjdZUmtBNUVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgICA8bm9kZXMgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOldvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGUiIHhtaTppZD0iX0lpVnI5ZXg0RWR1Mk9vNnEtbkhXZ2ciIG5hbWU9Ik91dGNvbWUgQTIgcHJlc2VudCI+Ci0gICAgICAgIDxsaW5rZWRFbGVtZW50IHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOldvcmtQcm9kdWN0RGVzY3JpcHRvciIgaHJlZj0idW1hOi8vXzU2eG5RRUE1RWRxRnFJdTgtY2tvbGcjXzU2N1lqMEE1RWRxRnFJdTgtY2tvbGciLz4KLSAgICAgIDwvbm9kZXM+Ci0gICAgPC9ub2Rlcz4KLSAgPC9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDpBY3Rpdml0eURldGFpbERpYWdyYW0+Ci0gIDxub3RhdGlvbjpEaWFncmFtIHhtaTppZD0iX0lpVnI5dXg0RWR1Mk9vNnEtbkhXZ2ciIHR5cGU9IkFERCIgZWxlbWVudD0iX0lpVnIwT3g0RWR1Mk9vNnEtbkhXZ2ciIG5hbWU9IkFjdDEiIG1lYXN1cmVtZW50VW5pdD0iUGl4ZWwiPgotICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfSWlWci11eDRFZHUyT282cS1uSFdnZyIgdHlwZT0iMTAwMSIgZWxlbWVudD0iX0lpVnIwZXg0RWR1Mk9vNnEtbkhXZ2ciPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246Rm9udFN0eWxlIiB4bWk6aWQ9Il9JaVZyLS14NEVkdTJPbzZxLW5IV2dnIiBmb250TmFtZT0iQXJpYWwiIGZvbnRIZWlnaHQ9IjgiLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkRlc2NyaXB0aW9uU3R5bGUiIHhtaTppZD0iX0lpVnJfT3g0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkZpbGxTdHlsZSIgeG1pOmlkPSJfSWlWcl9leDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246TGluZVN0eWxlIiB4bWk6aWQ9Il9JaVZyX3V4NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9JaVZzQU94NEVkdTJPbzZxLW5IV2dnIiB4PSItMSIgeT0iLTEiLz4KLSAgICA8L2NoaWxkcmVuPgotICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfSWlWc0FleDRFZHUyT282cS1uSFdnZyIgdHlwZT0iMTAwMiIgZWxlbWVudD0iX0lpVnIxZXg0RWR1Mk9vNnEtbkhXZ2ciPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246Rm9udFN0eWxlIiB4bWk6aWQ9Il9JaVZzQXV4NEVkdTJPbzZxLW5IV2dnIiBmb250TmFtZT0iQXJpYWwiIGZvbnRIZWlnaHQ9IjgiLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkRlc2NyaXB0aW9uU3R5bGUiIHhtaTppZD0iX0lpVnNBLXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkZpbGxTdHlsZSIgeG1pOmlkPSJfSWlWc0JPeDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246TGluZVN0eWxlIiB4bWk6aWQ9Il9JaVZzQmV4NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9JaVZzQi14NEVkdTJPbzZxLW5IV2dnIiB4PSItMSIgeT0iLTEiLz4KLSAgICA8L2NoaWxkcmVuPgotICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfSWlWc0NPeDRFZHUyT282cS1uSFdnZyIgdHlwZT0iMTAwMiIgZWxlbWVudD0iX0lpVnIyZXg0RWR1Mk9vNnEtbkhXZ2ciPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246Rm9udFN0eWxlIiB4bWk6aWQ9Il9JaVZzQ2V4NEVkdTJPbzZxLW5IV2dnIiBmb250TmFtZT0iQXJpYWwiIGZvbnRIZWlnaHQ9IjgiLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkRlc2NyaXB0aW9uU3R5bGUiIHhtaTppZD0iX0lpVnNDdXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkZpbGxTdHlsZSIgeG1pOmlkPSJfSWlWc0MteDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246TGluZVN0eWxlIiB4bWk6aWQ9Il9JaVZzRE94NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9JaVZzRHV4NEVkdTJPbzZxLW5IV2dnIiB4PSItMSIgeT0iLTEiLz4KLSAgICA8L2NoaWxkcmVuPgotICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfSWlWc0QteDRFZHUyT282cS1uSFdnZyIgdHlwZT0iMTAwMSIgZWxlbWVudD0iX0lpVnIyLXg0RWR1Mk9vNnEtbkhXZ2ciPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246Rm9udFN0eWxlIiB4bWk6aWQ9Il9JaVZzRU94NEVkdTJPbzZxLW5IV2dnIiBmb250TmFtZT0iQXJpYWwiIGZvbnRIZWlnaHQ9IjgiLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkRlc2NyaXB0aW9uU3R5bGUiIHhtaTppZD0iX0lpVnNFZXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkZpbGxTdHlsZSIgeG1pOmlkPSJfSWlWc0V1eDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246TGluZVN0eWxlIiB4bWk6aWQ9Il9JaVZzRS14NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9JaVZzRmV4NEVkdTJPbzZxLW5IV2dnIiB4PSIyMCIgeT0iODgiIHdpZHRoPSIxOTYiIGhlaWdodD0iNTMiLz4KLSAgICA8L2NoaWxkcmVuPgotICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfSWlWc0Z1eDRFZHUyT282cS1uSFdnZyIgdHlwZT0iMTAwMiIgZWxlbWVudD0iX0lpVnIzLXg0RWR1Mk9vNnEtbkhXZ2ciPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246Rm9udFN0eWxlIiB4bWk6aWQ9Il9JaVZzRi14NEVkdTJPbzZxLW5IV2dnIiBmb250TmFtZT0iQXJpYWwiIGZvbnRIZWlnaHQ9IjgiLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkRlc2NyaXB0aW9uU3R5bGUiIHhtaTppZD0iX0lpVnNHT3g0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkZpbGxTdHlsZSIgeG1pOmlkPSJfSWlWc0dleDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246TGluZVN0eWxlIiB4bWk6aWQ9Il9JaVZzR3V4NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9JaVZzSE94NEVkdTJPbzZxLW5IV2dnIiB4PSIxMzAiIHk9IjEiIHdpZHRoPSI3MyIgaGVpZ2h0PSI2NyIvPgotICAgIDwvY2hpbGRyZW4+Ci0gICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il9JaVZzSGV4NEVkdTJPbzZxLW5IV2dnIiB0eXBlPSIxMDAyIiBlbGVtZW50PSJfSWlWcjR1eDRFZHUyT282cS1uSFdnZyI+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpGb250U3R5bGUiIHhtaTppZD0iX0lpVnNIdXg0RWR1Mk9vNnEtbkhXZ2ciIGZvbnROYW1lPSJBcmlhbCIgZm9udEhlaWdodD0iOCIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RGVzY3JpcHRpb25TdHlsZSIgeG1pOmlkPSJfSWlWc0gteDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RmlsbFN0eWxlIiB4bWk6aWQ9Il9JaVZzSU94NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpMaW5lU3R5bGUiIHhtaTppZD0iX0lpVnNJZXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0lpYnlVT3g0RWR1Mk9vNnEtbkhXZ2ciIHg9IjEzMCIgeT0iMTYxIiB3aWR0aD0iNzMiIGhlaWdodD0iMTExIi8+Ci0gICAgPC9jaGlsZHJlbj4KLSAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOk5vZGUiIHhtaTppZD0iX0lpYnlVZXg0RWR1Mk9vNnEtbkhXZ2ciIHR5cGU9IjEwMDEiIGVsZW1lbnQ9Il9JaVZyNU94NEVkdTJPbzZxLW5IV2dnIj4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkZvbnRTdHlsZSIgeG1pOmlkPSJfSWlieVV1eDRFZHUyT282cS1uSFdnZyIgZm9udE5hbWU9IkFyaWFsIiBmb250SGVpZ2h0PSI4Ii8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpEZXNjcmlwdGlvblN0eWxlIiB4bWk6aWQ9Il9JaWJ5VS14NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpGaWxsU3R5bGUiIHhtaTppZD0iX0lpYnlWT3g0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkxpbmVTdHlsZSIgeG1pOmlkPSJfSWlieVZleDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSWlieVYteDRFZHUyT282cS1uSFdnZyIgeD0iMjAiIHk9IjQwMCIgd2lkdGg9IjE5NiIgaGVpZ2h0PSI1MyIvPgotICAgIDwvY2hpbGRyZW4+Ci0gICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il9JaWJ5V094NEVkdTJPbzZxLW5IV2dnIiB0eXBlPSIxMDAyIiBlbGVtZW50PSJfSWlWcjZPeDRFZHUyT282cS1uSFdnZyI+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpGb250U3R5bGUiIHhtaTppZD0iX0lpYnlXZXg0RWR1Mk9vNnEtbkhXZ2ciIGZvbnROYW1lPSJBcmlhbCIgZm9udEhlaWdodD0iOCIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RGVzY3JpcHRpb25TdHlsZSIgeG1pOmlkPSJfSWlieVd1eDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RmlsbFN0eWxlIiB4bWk6aWQ9Il9JaWJ5Vy14NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpMaW5lU3R5bGUiIHhtaTppZD0iX0lpYnlYT3g0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0lpYnlYdXg0RWR1Mk9vNnEtbkhXZ2ciIHg9IjEzMCIgeT0iMzEzIiB3aWR0aD0iNzMiIGhlaWdodD0iNjciLz4KLSAgICA8L2NoaWxkcmVuPgotICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfSWlieVgteDRFZHUyT282cS1uSFdnZyIgdHlwZT0iMTAwMiIgZWxlbWVudD0iX0lpVnI2LXg0RWR1Mk9vNnEtbkhXZ2ciPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246Rm9udFN0eWxlIiB4bWk6aWQ9Il9JaWJ5WU94NEVkdTJPbzZxLW5IV2dnIiBmb250TmFtZT0iQXJpYWwiIGZvbnRIZWlnaHQ9IjgiLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkRlc2NyaXB0aW9uU3R5bGUiIHhtaTppZD0iX0lpYnlZZXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkZpbGxTdHlsZSIgeG1pOmlkPSJfSWlieVl1eDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246TGluZVN0eWxlIiB4bWk6aWQ9Il9JaWJ5WS14NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9JaWJ5WmV4NEVkdTJPbzZxLW5IV2dnIiB4PSIxMzAiIHk9IjQ3MyIgd2lkdGg9IjczIiBoZWlnaHQ9IjExMSIvPgotICAgIDwvY2hpbGRyZW4+Ci0gICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il9JaWJ5WnV4NEVkdTJPbzZxLW5IV2dnIiB0eXBlPSIxMDAxIiBlbGVtZW50PSJfSWlWcjdleDRFZHUyT282cS1uSFdnZyI+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpGb250U3R5bGUiIHhtaTppZD0iX0lpYnlaLXg0RWR1Mk9vNnEtbkhXZ2ciIGZvbnROYW1lPSJBcmlhbCIgZm9udEhlaWdodD0iOCIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RGVzY3JpcHRpb25TdHlsZSIgeG1pOmlkPSJfSWlieWFPeDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RmlsbFN0eWxlIiB4bWk6aWQ9Il9JaWJ5YWV4NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpMaW5lU3R5bGUiIHhtaTppZD0iX0lpYnlhdXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0lpYnliT3g0RWR1Mk9vNnEtbkhXZ2ciIHg9Ii0xIiB5PSItMSIvPgotICAgIDwvY2hpbGRyZW4+Ci0gICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il9JaWJ5YmV4NEVkdTJPbzZxLW5IV2dnIiB0eXBlPSIxMDAyIiBlbGVtZW50PSJfSWlWcjhleDRFZHUyT282cS1uSFdnZyI+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpGb250U3R5bGUiIHhtaTppZD0iX0lpYnlidXg0RWR1Mk9vNnEtbkhXZ2ciIGZvbnROYW1lPSJBcmlhbCIgZm9udEhlaWdodD0iOCIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RGVzY3JpcHRpb25TdHlsZSIgeG1pOmlkPSJfSWlieWIteDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RmlsbFN0eWxlIiB4bWk6aWQ9Il9JaWJ5Y094NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpMaW5lU3R5bGUiIHhtaTppZD0iX0lpYnljZXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0lpYnljLXg0RWR1Mk9vNnEtbkhXZ2ciIHg9Ii0xIiB5PSItMSIvPgotICAgIDwvY2hpbGRyZW4+Ci0gICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il9JaWJ5ZE94NEVkdTJPbzZxLW5IV2dnIiB0eXBlPSIxMDAyIiBlbGVtZW50PSJfSWlWcjlPeDRFZHUyT282cS1uSFdnZyI+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpGb250U3R5bGUiIHhtaTppZD0iX0lpYnlkZXg0RWR1Mk9vNnEtbkhXZ2ciIGZvbnROYW1lPSJBcmlhbCIgZm9udEhlaWdodD0iOCIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RGVzY3JpcHRpb25TdHlsZSIgeG1pOmlkPSJfSWlieWR1eDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RmlsbFN0eWxlIiB4bWk6aWQ9Il9JaWJ5ZC14NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpMaW5lU3R5bGUiIHhtaTppZD0iX0lpYnllT3g0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0lpYnlldXg0RWR1Mk9vNnEtbkhXZ2ciIHg9Ii0xIiB5PSItMSIvPgotICAgIDwvY2hpbGRyZW4+Ci0gICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246UGFnZVN0eWxlIiB4bWk6aWQ9Il9JaVZyOS14NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246R3VpZGVTdHlsZSIgeG1pOmlkPSJfSWlWci1PeDRFZHUyT282cS1uSFdnZyIvPgotICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkRlc2NyaXB0aW9uU3R5bGUiIHhtaTppZD0iX0lpVnItZXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgPC9ub3RhdGlvbjpEaWFncmFtPgotICA8b3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw6V29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbSB4bWk6aWQ9Il9JalN0OE94NEVkdTJPbzZxLW5IV2dnIj4KLSAgICA8bGlua2VkRWxlbWVudCB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpBY3Rpdml0eSIgaHJlZj0idW1hOi8vXzU2eG5RRUE1RWRxRnFJdTgtY2tvbGcjXzU2N1lRMEE1RWRxRnFJdTgtY2tvbGciLz4KLSAgICA8bm9kZXMgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOldvcmtQcm9kdWN0Tm9kZSIgeG1pOmlkPSJfSWpTdDhleDRFZHUyT282cS1uSFdnZyIgbmFtZT0iQXJ0aWZhY3QgQTEgcHJlc2VudCIgdHlwZT0iMSI+Ci0gICAgICA8bGlua2VkRWxlbWVudCB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpXb3JrUHJvZHVjdERlc2NyaXB0b3IiIGhyZWY9InVtYTovL181NnhuUUVBNUVkcUZxSXU4LWNrb2xnI181NjdZbmtBNUVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgPC9ub2Rlcz4KLSAgICA8bm9kZXMgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOldvcmtQcm9kdWN0Tm9kZSIgeG1pOmlkPSJfSWpTdDh1eDRFZHUyT282cS1uSFdnZyIgbmFtZT0iRGVsaXZlcmFibGUgQTEgcHJlc2VudCIgdHlwZT0iMiI+Ci0gICAgICA8bGlua2VkRWxlbWVudCB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpXb3JrUHJvZHVjdERlc2NyaXB0b3IiIGhyZWY9InVtYTovL181NnhuUUVBNUVkcUZxSXU4LWNrb2xnI181NjdZbUVBNUVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgPC9ub2Rlcz4KLSAgICA8bm9kZXMgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOldvcmtQcm9kdWN0Tm9kZSIgeG1pOmlkPSJfSWpTdDgteDRFZHUyT282cS1uSFdnZyIgbmFtZT0iT3V0Y29tZSBBMSBwcmVzZW50IiB0eXBlPSIzIj4KLSAgICAgIDxsaW5rZWRFbGVtZW50IHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOldvcmtQcm9kdWN0RGVzY3JpcHRvciIgaHJlZj0idW1hOi8vXzU2eG5RRUE1RWRxRnFJdTgtY2tvbGcjXzU2N1luMEE1RWRxRnFJdTgtY2tvbGciLz4KLSAgICA8L25vZGVzPgotICAgIDxub2RlcyB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw6V29ya1Byb2R1Y3ROb2RlIiB4bWk6aWQ9Il9JalN0OU94NEVkdTJPbzZxLW5IV2dnIiBuYW1lPSJBcnRpZmFjdCBCMSBwcmVzZW50IiB0eXBlPSIxIj4KLSAgICAgIDxsaW5rZWRFbGVtZW50IHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOldvcmtQcm9kdWN0RGVzY3JpcHRvciIgaHJlZj0idW1hOi8vXzU2eG5RRUE1RWRxRnFJdTgtY2tvbGcjXzU2N1luVUE1RWRxRnFJdTgtY2tvbGciLz4KLSAgICA8L25vZGVzPgotICAgIDxub2RlcyB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw6V29ya1Byb2R1Y3ROb2RlIiB4bWk6aWQ9Il9JalN0OWV4NEVkdTJPbzZxLW5IV2dnIiBuYW1lPSJEZWxpdmVyYWJsZSBCMSBwcmVzZW50IiB0eXBlPSIyIj4KLSAgICAgIDxsaW5rZWRFbGVtZW50IHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOldvcmtQcm9kdWN0RGVzY3JpcHRvciIgaHJlZj0idW1hOi8vXzU2eG5RRUE1RWRxRnFJdTgtY2tvbGcjXzU2N1lvRUE1RWRxRnFJdTgtY2tvbGciLz4KLSAgICA8L25vZGVzPgotICAgIDxub2RlcyB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw6V29ya1Byb2R1Y3ROb2RlIiB4bWk6aWQ9Il9JalN0OXV4NEVkdTJPbzZxLW5IV2dnIiBuYW1lPSJPdXRjb21lIEIxIHByZXNlbnQiIHR5cGU9IjMiPgotICAgICAgPGxpbmtlZEVsZW1lbnQgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6V29ya1Byb2R1Y3REZXNjcmlwdG9yIiBocmVmPSJ1bWE6Ly9fNTZ4blFFQTVFZHFGcUl1OC1ja29sZyNfNTY3WWxVQTVFZHFGcUl1OC1ja29sZyIvPgotICAgIDwvbm9kZXM+Ci0gICAgPG5vZGVzIHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDpXb3JrUHJvZHVjdE5vZGUiIHhtaTppZD0iX0lqU3Q5LXg0RWR1Mk9vNnEtbkhXZ2ciIG5hbWU9IkFydGlmYWN0IEIyIHByZXNlbnQiIHR5cGU9IjEiPgotICAgICAgPGxpbmtlZEVsZW1lbnQgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6V29ya1Byb2R1Y3REZXNjcmlwdG9yIiBocmVmPSJ1bWE6Ly9fNTZ4blFFQTVFZHFGcUl1OC1ja29sZyNfNTY3WVFrQTVFZHFGcUl1OC1ja29sZyIvPgotICAgIDwvbm9kZXM+Ci0gICAgPG5vZGVzIHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDpXb3JrUHJvZHVjdE5vZGUiIHhtaTppZD0iX0lqU3QtT3g0RWR1Mk9vNnEtbkhXZ2ciIG5hbWU9IkRlbGl2ZXJhYmxlIEIyIHByZXNlbnQiIHR5cGU9IjIiPgotICAgICAgPGxpbmtlZEVsZW1lbnQgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6V29ya1Byb2R1Y3REZXNjcmlwdG9yIiBocmVmPSJ1bWE6Ly9fNTZ4blFFQTVFZHFGcUl1OC1ja29sZyNfNTY3WWxFQTVFZHFGcUl1OC1ja29sZyIvPgotICAgIDwvbm9kZXM+Ci0gICAgPG5vZGVzIHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDpXb3JrUHJvZHVjdE5vZGUiIHhtaTppZD0iX0lqU3QtZXg0RWR1Mk9vNnEtbkhXZ2ciIG5hbWU9Ik91dGNvbWUgQjIgcHJlc2VudCIgdHlwZT0iMyI+Ci0gICAgICA8bGlua2VkRWxlbWVudCB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpXb3JrUHJvZHVjdERlc2NyaXB0b3IiIGhyZWY9InVtYTovL181NnhuUUVBNUVkcUZxSXU4LWNrb2xnI181NjdZbGtBNUVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgPC9ub2Rlcz4KLSAgICA8bm9kZXMgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOldvcmtQcm9kdWN0Tm9kZSIgeG1pOmlkPSJfSWpTdC11eDRFZHUyT282cS1uSFdnZyIgbmFtZT0iQXJ0aWZhY3QgQTIgcHJlc2VudCIgdHlwZT0iMSI+Ci0gICAgICA8bGlua2VkRWxlbWVudCB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpXb3JrUHJvZHVjdERlc2NyaXB0b3IiIGhyZWY9InVtYTovL181NnhuUUVBNUVkcUZxSXU4LWNrb2xnI181NjdZa0VBNUVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgPC9ub2Rlcz4KLSAgICA8bm9kZXMgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOldvcmtQcm9kdWN0Tm9kZSIgeG1pOmlkPSJfSWpTdC0teDRFZHUyT282cS1uSFdnZyIgbmFtZT0iRGVsaXZlcmFibGUgQTIgcHJlc2VudCIgdHlwZT0iMiI+Ci0gICAgICA8bGlua2VkRWxlbWVudCB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpXb3JrUHJvZHVjdERlc2NyaXB0b3IiIGhyZWY9InVtYTovL181NnhuUUVBNUVkcUZxSXU4LWNrb2xnI181NjdZbTBBNUVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgPC9ub2Rlcz4KLSAgICA8bm9kZXMgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOldvcmtQcm9kdWN0Tm9kZSIgeG1pOmlkPSJfSWpTdF9PeDRFZHUyT282cS1uSFdnZyIgbmFtZT0iT3V0Y29tZSBBMiBwcmVzZW50IiB0eXBlPSIzIj4KLSAgICAgIDxsaW5rZWRFbGVtZW50IHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOldvcmtQcm9kdWN0RGVzY3JpcHRvciIgaHJlZj0idW1hOi8vXzU2eG5RRUE1RWRxRnFJdTgtY2tvbGcjXzU2N1lqMEE1RWRxRnFJdTgtY2tvbGciLz4KLSAgICA8L25vZGVzPgotICA8L29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOldvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW0+Ci0gIDxub3RhdGlvbjpEaWFncmFtIHhtaTppZD0iX0lqWTBrT3g0RWR1Mk9vNnEtbkhXZ2ciIHR5cGU9IldQREQiIGVsZW1lbnQ9Il9JalN0OE94NEVkdTJPbzZxLW5IV2dnIiBuYW1lPSJBY3QxIiBtZWFzdXJlbWVudFVuaXQ9IlBpeGVsIj4KLSAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOk5vZGUiIHhtaTppZD0iX0lqZTdNT3g0RWR1Mk9vNnEtbkhXZ2ciIHR5cGU9IjEwMDEiIGVsZW1lbnQ9Il9JalN0OGV4NEVkdTJPbzZxLW5IV2dnIj4KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfSWpsQjBPeDRFZHUyT282cS1uSFdnZyIgdHlwZT0iNDAwMSIvPgotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il9JamxCMGV4NEVkdTJPbzZxLW5IV2dnIiB0eXBlPSI0MDAxIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpGb250U3R5bGUiIHhtaTppZD0iX0lqZTdNZXg0RWR1Mk9vNnEtbkhXZ2ciIGZvbnROYW1lPSJBcmlhbCIgZm9udEhlaWdodD0iOCIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RGVzY3JpcHRpb25TdHlsZSIgeG1pOmlkPSJfSWplN011eDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RmlsbFN0eWxlIiB4bWk6aWQ9Il9JamU3TS14NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpMaW5lU3R5bGUiIHhtaTppZD0iX0lqZTdOT3g0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0lqbEIwdXg0RWR1Mk9vNnEtbkhXZ2ciIHg9Ii0xIiB5PSItMSIvPgotICAgIDwvY2hpbGRyZW4+Ci0gICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il9JamxCMC14NEVkdTJPbzZxLW5IV2dnIiB0eXBlPSIxMDAxIiBlbGVtZW50PSJfSWpTdDh1eDRFZHUyT282cS1uSFdnZyI+Ci0gICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOk5vZGUiIHhtaTppZD0iX0lqbEIyZXg0RWR1Mk9vNnEtbkhXZ2ciIHR5cGU9IjQwMDEiLz4KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfSWpsQjJ1eDRFZHUyT282cS1uSFdnZyIgdHlwZT0iNDAwMSIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246Rm9udFN0eWxlIiB4bWk6aWQ9Il9JamxCMU94NEVkdTJPbzZxLW5IV2dnIiBmb250TmFtZT0iQXJpYWwiIGZvbnRIZWlnaHQ9IjgiLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkRlc2NyaXB0aW9uU3R5bGUiIHhtaTppZD0iX0lqbEIxZXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkZpbGxTdHlsZSIgeG1pOmlkPSJfSWpsQjF1eDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246TGluZVN0eWxlIiB4bWk6aWQ9Il9JamxCMS14NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9JamxCMi14NEVkdTJPbzZxLW5IV2dnIiB4PSItMSIgeT0iLTEiLz4KLSAgICA8L2NoaWxkcmVuPgotICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfSWpsQjNPeDRFZHUyT282cS1uSFdnZyIgdHlwZT0iMTAwMSIgZWxlbWVudD0iX0lqU3Q4LXg0RWR1Mk9vNnEtbkhXZ2ciPgotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il9JamxCNHV4NEVkdTJPbzZxLW5IV2dnIiB0eXBlPSI0MDAxIi8+Ci0gICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOk5vZGUiIHhtaTppZD0iX0lqbEI0LXg0RWR1Mk9vNnEtbkhXZ2ciIHR5cGU9IjQwMDEiLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkZvbnRTdHlsZSIgeG1pOmlkPSJfSWpsQjNleDRFZHUyT282cS1uSFdnZyIgZm9udE5hbWU9IkFyaWFsIiBmb250SGVpZ2h0PSI4Ii8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpEZXNjcmlwdGlvblN0eWxlIiB4bWk6aWQ9Il9JamxCM3V4NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpGaWxsU3R5bGUiIHhtaTppZD0iX0lqbEIzLXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkxpbmVTdHlsZSIgeG1pOmlkPSJfSWpsQjRPeDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSWpsQjVPeDRFZHUyT282cS1uSFdnZyIgeD0iLTEiIHk9Ii0xIi8+Ci0gICAgPC9jaGlsZHJlbj4KLSAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOk5vZGUiIHhtaTppZD0iX0lqbEI1ZXg0RWR1Mk9vNnEtbkhXZ2ciIHR5cGU9IjEwMDEiIGVsZW1lbnQ9Il9JalN0OU94NEVkdTJPbzZxLW5IV2dnIj4KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfSWpySWNPeDRFZHUyT282cS1uSFdnZyIgdHlwZT0iNDAwMSIvPgotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il9JanJJY2V4NEVkdTJPbzZxLW5IV2dnIiB0eXBlPSI0MDAxIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpGb250U3R5bGUiIHhtaTppZD0iX0lqbEI1dXg0RWR1Mk9vNnEtbkhXZ2ciIGZvbnROYW1lPSJBcmlhbCIgZm9udEhlaWdodD0iOCIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RGVzY3JpcHRpb25TdHlsZSIgeG1pOmlkPSJfSWpsQjUteDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RmlsbFN0eWxlIiB4bWk6aWQ9Il9JamxCNk94NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpMaW5lU3R5bGUiIHhtaTppZD0iX0lqbEI2ZXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0lqckljdXg0RWR1Mk9vNnEtbkhXZ2ciIHg9IjEwIiB5PSIxMCIvPgotICAgIDwvY2hpbGRyZW4+Ci0gICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il9JanJJYy14NEVkdTJPbzZxLW5IV2dnIiB0eXBlPSIxMDAxIiBlbGVtZW50PSJfSWpTdDlleDRFZHUyT282cS1uSFdnZyI+Ci0gICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOk5vZGUiIHhtaTppZD0iX0lqckllZXg0RWR1Mk9vNnEtbkhXZ2ciIHR5cGU9IjQwMDEiLz4KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfSWpySWV1eDRFZHUyT282cS1uSFdnZyIgdHlwZT0iNDAwMSIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246Rm9udFN0eWxlIiB4bWk6aWQ9Il9JanJJZE94NEVkdTJPbzZxLW5IV2dnIiBmb250TmFtZT0iQXJpYWwiIGZvbnRIZWlnaHQ9IjgiLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkRlc2NyaXB0aW9uU3R5bGUiIHhtaTppZD0iX0lqcklkZXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkZpbGxTdHlsZSIgeG1pOmlkPSJfSWpySWR1eDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246TGluZVN0eWxlIiB4bWk6aWQ9Il9JanJJZC14NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9JanJJZS14NEVkdTJPbzZxLW5IV2dnIiB4PSIxNDIiIHk9IjEwIi8+Ci0gICAgPC9jaGlsZHJlbj4KLSAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOk5vZGUiIHhtaTppZD0iX0lqcklmT3g0RWR1Mk9vNnEtbkhXZ2ciIHR5cGU9IjEwMDEiIGVsZW1lbnQ9Il9JalN0OXV4NEVkdTJPbzZxLW5IV2dnIj4KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfSWpySWd1eDRFZHUyT282cS1uSFdnZyIgdHlwZT0iNDAwMSIvPgotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il9JanJJZy14NEVkdTJPbzZxLW5IV2dnIiB0eXBlPSI0MDAxIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpGb250U3R5bGUiIHhtaTppZD0iX0lqcklmZXg0RWR1Mk9vNnEtbkhXZ2ciIGZvbnROYW1lPSJBcmlhbCIgZm9udEhlaWdodD0iOCIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RGVzY3JpcHRpb25TdHlsZSIgeG1pOmlkPSJfSWpySWZ1eDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RmlsbFN0eWxlIiB4bWk6aWQ9Il9JanJJZi14NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpMaW5lU3R5bGUiIHhtaTppZD0iX0lqcklnT3g0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0lqckloT3g0RWR1Mk9vNnEtbkhXZ2ciIHg9IjI5MSIgeT0iMTAiLz4KLSAgICA8L2NoaWxkcmVuPgotICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfSWpySWhleDRFZHUyT282cS1uSFdnZyIgdHlwZT0iMTAwMSIgZWxlbWVudD0iX0lqU3Q5LXg0RWR1Mk9vNnEtbkhXZ2ciPgotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il9JanJJaS14NEVkdTJPbzZxLW5IV2dnIiB0eXBlPSI0MDAxIi8+Ci0gICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOk5vZGUiIHhtaTppZD0iX0lqcklqT3g0RWR1Mk9vNnEtbkhXZ2ciIHR5cGU9IjQwMDEiLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkZvbnRTdHlsZSIgeG1pOmlkPSJfSWpySWh1eDRFZHUyT282cS1uSFdnZyIgZm9udE5hbWU9IkFyaWFsIiBmb250SGVpZ2h0PSI4Ii8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpEZXNjcmlwdGlvblN0eWxlIiB4bWk6aWQ9Il9JanJJaC14NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpGaWxsU3R5bGUiIHhtaTppZD0iX0lqcklpT3g0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkxpbmVTdHlsZSIgeG1pOmlkPSJfSWpySWlleDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSWpySWpleDRFZHUyT282cS1uSFdnZyIgeD0iNDMwIiB5PSIxMCIvPgotICAgIDwvY2hpbGRyZW4+Ci0gICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il9JanJJanV4NEVkdTJPbzZxLW5IV2dnIiB0eXBlPSIxMDAxIiBlbGVtZW50PSJfSWpTdC1PeDRFZHUyT282cS1uSFdnZyI+Ci0gICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOk5vZGUiIHhtaTppZD0iX0lqcklsT3g0RWR1Mk9vNnEtbkhXZ2ciIHR5cGU9IjQwMDEiLz4KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfSWpySWxleDRFZHUyT282cS1uSFdnZyIgdHlwZT0iNDAwMSIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246Rm9udFN0eWxlIiB4bWk6aWQ9Il9JanJJai14NEVkdTJPbzZxLW5IV2dnIiBmb250TmFtZT0iQXJpYWwiIGZvbnRIZWlnaHQ9IjgiLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkRlc2NyaXB0aW9uU3R5bGUiIHhtaTppZD0iX0lqcklrT3g0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkZpbGxTdHlsZSIgeG1pOmlkPSJfSWpySWtleDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246TGluZVN0eWxlIiB4bWk6aWQ9Il9JanJJa3V4NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9JanJJbHV4NEVkdTJPbzZxLW5IV2dnIiB4PSI1NjIiIHk9IjEwIi8+Ci0gICAgPC9jaGlsZHJlbj4KLSAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOk5vZGUiIHhtaTppZD0iX0lqcklsLXg0RWR1Mk9vNnEtbkhXZ2ciIHR5cGU9IjEwMDEiIGVsZW1lbnQ9Il9JalN0LWV4NEVkdTJPbzZxLW5IV2dnIj4KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfSWpySW5leDRFZHUyT282cS1uSFdnZyIgdHlwZT0iNDAwMSIvPgotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il9JanJJbnV4NEVkdTJPbzZxLW5IV2dnIiB0eXBlPSI0MDAxIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpGb250U3R5bGUiIHhtaTppZD0iX0lqckltT3g0RWR1Mk9vNnEtbkhXZ2ciIGZvbnROYW1lPSJBcmlhbCIgZm9udEhlaWdodD0iOCIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RGVzY3JpcHRpb25TdHlsZSIgeG1pOmlkPSJfSWpySW1leDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RmlsbFN0eWxlIiB4bWk6aWQ9Il9JanJJbXV4NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpMaW5lU3R5bGUiIHhtaTppZD0iX0lqckltLXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0lqeFBFT3g0RWR1Mk9vNnEtbkhXZ2ciIHg9IjcxMSIgeT0iMTAiLz4KLSAgICA8L2NoaWxkcmVuPgotICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfSWp4UEVleDRFZHUyT282cS1uSFdnZyIgdHlwZT0iMTAwMSIgZWxlbWVudD0iX0lqU3QtdXg0RWR1Mk9vNnEtbkhXZ2ciPgotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il9JanhQRi14NEVkdTJPbzZxLW5IV2dnIiB0eXBlPSI0MDAxIi8+Ci0gICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOk5vZGUiIHhtaTppZD0iX0lqeFBHT3g0RWR1Mk9vNnEtbkhXZ2ciIHR5cGU9IjQwMDEiLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkZvbnRTdHlsZSIgeG1pOmlkPSJfSWp4UEV1eDRFZHUyT282cS1uSFdnZyIgZm9udE5hbWU9IkFyaWFsIiBmb250SGVpZ2h0PSI4Ii8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpEZXNjcmlwdGlvblN0eWxlIiB4bWk6aWQ9Il9JanhQRS14NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpGaWxsU3R5bGUiIHhtaTppZD0iX0lqeFBGT3g0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkxpbmVTdHlsZSIgeG1pOmlkPSJfSWp4UEZleDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSWp4UEdleDRFZHUyT282cS1uSFdnZyIgeD0iLTEiIHk9Ii0xIi8+Ci0gICAgPC9jaGlsZHJlbj4KLSAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOk5vZGUiIHhtaTppZD0iX0lqeFBHdXg0RWR1Mk9vNnEtbkhXZ2ciIHR5cGU9IjEwMDEiIGVsZW1lbnQ9Il9JalN0LS14NEVkdTJPbzZxLW5IV2dnIj4KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfSWp4UElPeDRFZHUyT282cS1uSFdnZyIgdHlwZT0iNDAwMSIvPgotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il9JanhQSWV4NEVkdTJPbzZxLW5IV2dnIiB0eXBlPSI0MDAxIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpGb250U3R5bGUiIHhtaTppZD0iX0lqeFBHLXg0RWR1Mk9vNnEtbkhXZ2ciIGZvbnROYW1lPSJBcmlhbCIgZm9udEhlaWdodD0iOCIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RGVzY3JpcHRpb25TdHlsZSIgeG1pOmlkPSJfSWp4UEhPeDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RmlsbFN0eWxlIiB4bWk6aWQ9Il9JanhQSGV4NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpMaW5lU3R5bGUiIHhtaTppZD0iX0lqeFBIdXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0lqeFBJdXg0RWR1Mk9vNnEtbkhXZ2ciIHg9Ii0xIiB5PSItMSIvPgotICAgIDwvY2hpbGRyZW4+Ci0gICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il9JanhQSS14NEVkdTJPbzZxLW5IV2dnIiB0eXBlPSIxMDAxIiBlbGVtZW50PSJfSWpTdF9PeDRFZHUyT282cS1uSFdnZyI+Ci0gICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOk5vZGUiIHhtaTppZD0iX0lqeFBLZXg0RWR1Mk9vNnEtbkhXZ2ciIHR5cGU9IjQwMDEiLz4KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfSWp4UEt1eDRFZHUyT282cS1uSFdnZyIgdHlwZT0iNDAwMSIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246Rm9udFN0eWxlIiB4bWk6aWQ9Il9JanhQSk94NEVkdTJPbzZxLW5IV2dnIiBmb250TmFtZT0iQXJpYWwiIGZvbnRIZWlnaHQ9IjgiLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkRlc2NyaXB0aW9uU3R5bGUiIHhtaTppZD0iX0lqeFBKZXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkZpbGxTdHlsZSIgeG1pOmlkPSJfSWp4UEp1eDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246TGluZVN0eWxlIiB4bWk6aWQ9Il9JanhQSi14NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9JanhQSy14NEVkdTJPbzZxLW5IV2dnIiB4PSItMSIgeT0iLTEiLz4KLSAgICA8L2NoaWxkcmVuPgotICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOlBhZ2VTdHlsZSIgeG1pOmlkPSJfSWpZMGtleDRFZHUyT282cS1uSFdnZyIvPgotICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkd1aWRlU3R5bGUiIHhtaTppZD0iX0lqWTBrdXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpEZXNjcmlwdGlvblN0eWxlIiB4bWk6aWQ9Il9Jalkway14NEVkdTJPbzZxLW5IV2dnIi8+Ci0gIDwvbm90YXRpb246RGlhZ3JhbT4KLTwveG1pOlhNST4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi9jYXBhYmlsaXR5cGF0dGVybnMvQ1AgQjEvbW9kZWwueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL2NhcGFiaWxpdHlwYXR0ZXJucy9DUCBCMS9tb2RlbC54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjNDQ3MGIuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL2NhcGFiaWxpdHlwYXR0ZXJucy9DUCBCMS9tb2RlbC54bWkKKysrIC9kZXYvbnVsbApAQCAtMSwzMzggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTx4bWk6WE1JIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYS5yZXNvdXJjZW1hbmFnZXI9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZXBmL3VtYS9yZXNvdXJjZW1hbmFnZXIuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCI+Ci0gIDxvcmcuZWNsaXBzZS5lcGYudW1hLnJlc291cmNlbWFuYWdlcjpSZXNvdXJjZU1hbmFnZXIgeG1pOmlkPSJfNTl3Q3dFQTVFZHFGcUl1OC1ja29sZyIgZ3VpZD0iXzU5d0N3RUE1RWRxRnFJdTgtY2tvbGciPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iXzU5d0N3VUE1RWRxRnFJdTgtY2tvbGciIGlkPSItd3liSEtVZGxYYkRGRzBIT1BoQUo2USIgdXJpPSJjb250ZW50LnhtaSIvPgotICA8L29yZy5lY2xpcHNlLmVwZi51bWEucmVzb3VyY2VtYW5hZ2VyOlJlc291cmNlTWFuYWdlcj4KLSAgPG9yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc0NvbXBvbmVudCB4bWk6aWQ9Il81NnhuUUVBNUVkcUZxSXU4LWNrb2xnIiBuYW1lPSJDUCBCMSIgZ3VpZD0iXzU2eG5RRUE1RWRxRnFJdTgtY2tvbGciPgotICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NQYWNrYWdlIiB4bWk6aWQ9Il81NjdZUUVBNUVkcUZxSXU4LWNrb2xnIiBuYW1lPSJBY3QxIiBndWlkPSJfNTY3WVFFQTVFZHFGcUl1OC1ja29sZyI+Ci0gICAgICA8cHJvY2Vzc0VsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkFjdGl2aXR5IiB4bWk6aWQ9Il81NjdZUTBBNUVkcUZxSXU4LWNrb2xnIiBuYW1lPSJBY3QxIiBndWlkPSJfNTY3WVEwQTVFZHFGcUl1OC1ja29sZyIgcHJlc2VudGF0aW9uTmFtZT0iQWN0MSIgc3VwZXJBY3Rpdml0aWVzPSJfNTY3WW9rQTVFZHFGcUl1OC1ja29sZyIgYnJlYWtkb3duRWxlbWVudHM9Il81NjdZU1VBNUVkcUZxSXU4LWNrb2xnIF81NjdZU0VBNUVkcUZxSXU4LWNrb2xnIF81NjdZbVVBNUVkcUZxSXU4LWNrb2xnIF81NjdZb1VBNUVkcUZxSXU4LWNrb2xnIF81NjdZbmtBNUVkcUZxSXU4LWNrb2xnIF81NjdZbUVBNUVkcUZxSXU4LWNrb2xnIF81NjdZbjBBNUVkcUZxSXU4LWNrb2xnIF81NjdZUjBBNUVkcUZxSXU4LWNrb2xnIF81NjdZazBBNUVkcUZxSXU4LWNrb2xnIF81NjdZbDBBNUVkcUZxSXU4LWNrb2xnIF81NjdZblVBNUVkcUZxSXU4LWNrb2xnIF81NjdZb0VBNUVkcUZxSXU4LWNrb2xnIF81NjdZbFVBNUVkcUZxSXU4LWNrb2xnIF81NjdZUkVBNUVkcUZxSXU4LWNrb2xnIF81NjdZUWtBNUVkcUZxSXU4LWNrb2xnIF81NjdZbEVBNUVkcUZxSXU4LWNrb2xnIF81NjdZbGtBNUVkcUZxSXU4LWNrb2xnIF81NjdZUmtBNUVkcUZxSXU4LWNrb2xnIF81NjdZa0VBNUVkcUZxSXU4LWNrb2xnIF81NjdZbTBBNUVkcUZxSXU4LWNrb2xnIF81NjdZajBBNUVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgICA8cHJvY2Vzc0VsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlRhc2tEZXNjcmlwdG9yIiB4bWk6aWQ9Il81NjdZU1VBNUVkcUZxSXU4LWNrb2xnIiBuYW1lPSJ0YXNrX0ExIiBndWlkPSJfNTY3WVNVQTVFZHFGcUl1OC1ja29sZyIgYnJpZWZEZXNjcmlwdGlvbj0iVGFzayBBMSBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iVGFzayBBMSBwcmVzZW50IiBzdXBlckFjdGl2aXRpZXM9Il81NjdZUTBBNUVkcUZxSXU4LWNrb2xnIiBhZGRpdGlvbmFsbHlQZXJmb3JtZWRCeT0iXzU2N1ltVUE1RWRxRnFJdTgtY2tvbGciIG1hbmRhdG9yeUlucHV0PSJfNTY3WW9VQTVFZHFGcUl1OC1ja29sZyBfNTY3WW5rQTVFZHFGcUl1OC1ja29sZyIgb3B0aW9uYWxJbnB1dD0iXzU2N1ltRUE1RWRxRnFJdTgtY2tvbGciIG91dHB1dD0iXzU2N1luMEE1RWRxRnFJdTgtY2tvbGciIHBlcmZvcm1lZFByaW1hcmlseUJ5PSJfNTY3WVNFQTVFZHFGcUl1OC1ja29sZyI+Ci0gICAgICAgIDxUYXNrIGhyZWY9InVtYTovL195VWVMSUEtUEVkcUwyTzFQSlY5Y1pBI183TThuc0EtUEVkcUwyTzFQSlY5Y1pBIi8+Ci0gICAgICAgIDxzZWxlY3RlZFN0ZXBzIGhyZWY9InVtYTovLy1TMWlnTFNpNkFJX3ZsdXpXT0N1NlR3I190dkY0TUJCUEVkcUJzN0toZFZMUkxBIi8+Ci0gICAgICAgIDxzZWxlY3RlZFN0ZXBzIGhyZWY9InVtYTovLy1TMWlnTFNpNkFJX3ZsdXpXT0N1NlR3I190emtJZ0JCUEVkcUJzN0toZFZMUkxBIi8+Ci0gICAgICAgIDxzZWxlY3RlZFN0ZXBzIGhyZWY9InVtYTovLy1TMWlnTFNpNkFJX3ZsdXpXT0N1NlR3I191Q0JiUUJCUEVkcUJzN0toZFZMUkxBIi8+Ci0gICAgICA8L3Byb2Nlc3NFbGVtZW50cz4KLSAgICAgIDxwcm9jZXNzRWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Um9sZURlc2NyaXB0b3IiIHhtaTppZD0iXzU2N1lTRUE1RWRxRnFJdTgtY2tvbGciIG5hbWU9InJvbGVfQTEiIGd1aWQ9Il81NjdZU0VBNUVkcUZxSXU4LWNrb2xnIiBicmllZkRlc2NyaXB0aW9uPSJSb2xlIEExIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJSb2xlIEExIiBzdXBlckFjdGl2aXRpZXM9Il81NjdZUTBBNUVkcUZxSXU4LWNrb2xnIiByZXNwb25zaWJsZUZvcj0iXzU2N1lua0E1RWRxRnFJdTgtY2tvbGcgXzU2N1ltRUE1RWRxRnFJdTgtY2tvbGcgXzU2N1luMEE1RWRxRnFJdTgtY2tvbGciPgotICAgICAgICA8Um9sZSBocmVmPSJ1bWE6Ly9feVVlTElBLVBFZHFMMk8xUEpWOWNaQSNfNTV6azBBLVBFZHFMMk8xUEpWOWNaQSIvPgotICAgICAgPC9wcm9jZXNzRWxlbWVudHM+Ci0gICAgICA8cHJvY2Vzc0VsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlJvbGVEZXNjcmlwdG9yIiB4bWk6aWQ9Il81NjdZbVVBNUVkcUZxSXU4LWNrb2xnIiBuYW1lPSJyb2xlX0EyIiBndWlkPSJfNTY3WW1VQTVFZHFGcUl1OC1ja29sZyIgYnJpZWZEZXNjcmlwdGlvbj0iUm9sZSBBMiBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iUm9sZSBBMiAiIHN1cGVyQWN0aXZpdGllcz0iXzU2N1lRMEE1RWRxRnFJdTgtY2tvbGciPgotICAgICAgICA8Um9sZSBocmVmPSJ1bWE6Ly9feVVlTElBLVBFZHFMMk8xUEpWOWNaQSNfNmszVUFBLVBFZHFMMk8xUEpWOWNaQSIvPgotICAgICAgPC9wcm9jZXNzRWxlbWVudHM+Ci0gICAgICA8cHJvY2Vzc0VsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOldvcmtQcm9kdWN0RGVzY3JpcHRvciIgeG1pOmlkPSJfNTY3WW9VQTVFZHFGcUl1OC1ja29sZyIgbmFtZT0ic3ViX2FydGlmYWN0X0ExLjEiIGd1aWQ9Il81NjdZb1VBNUVkcUZxSXU4LWNrb2xnIiBicmllZkRlc2NyaXB0aW9uPSJTdWJfQXJ0aWZhY3QgQTEuMSBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iU3ViX0FydGlmYWN0IEExLjEgcHJlc2VudCIgc3VwZXJBY3Rpdml0aWVzPSJfNTY3WVEwQTVFZHFGcUl1OC1ja29sZyI+Ci0gICAgICAgIDxXb3JrUHJvZHVjdCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpBcnRpZmFjdCIgaHJlZj0idW1hOi8vX3lVZUxJQS1QRWRxTDJPMVBKVjljWkEjX0Y1MXl3QS1SRWRxTDJPMVBKVjljWkEiLz4KLSAgICAgIDwvcHJvY2Vzc0VsZW1lbnRzPgotICAgICAgPHByb2Nlc3NFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpXb3JrUHJvZHVjdERlc2NyaXB0b3IiIHhtaTppZD0iXzU2N1lua0E1RWRxRnFJdTgtY2tvbGciIG5hbWU9ImFydGlmYWN0X0ExIiBndWlkPSJfNTY3WW5rQTVFZHFGcUl1OC1ja29sZyIgYnJpZWZEZXNjcmlwdGlvbj0iQXJ0aWZhY3QgQTEgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IkFydGlmYWN0IEExIHByZXNlbnQiIHN1cGVyQWN0aXZpdGllcz0iXzU2N1lRMEE1RWRxRnFJdTgtY2tvbGciPgotICAgICAgICA8V29ya1Byb2R1Y3QgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6QXJ0aWZhY3QiIGhyZWY9InVtYTovL195VWVMSUEtUEVkcUwyTzFQSlY5Y1pBI185S3Q3OEEtUEVkcUwyTzFQSlY5Y1pBIi8+Ci0gICAgICA8L3Byb2Nlc3NFbGVtZW50cz4KLSAgICAgIDxwcm9jZXNzRWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6V29ya1Byb2R1Y3REZXNjcmlwdG9yIiB4bWk6aWQ9Il81NjdZbUVBNUVkcUZxSXU4LWNrb2xnIiBuYW1lPSJkZWxpdmVyYWJsZV9BMSIgZ3VpZD0iXzU2N1ltRUE1RWRxRnFJdTgtY2tvbGciIGJyaWVmRGVzY3JpcHRpb249IkRlbGl2ZXJhYmxlIEExIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJEZWxpdmVyYWJsZSBBMSBwcmVzZW50IiBzdXBlckFjdGl2aXRpZXM9Il81NjdZUTBBNUVkcUZxSXU4LWNrb2xnIiBkZWxpdmVyYWJsZVBhcnRzPSJfNTY3WVFVQTVFZHFGcUl1OC1ja29sZyBfNTY3WWtrQTVFZHFGcUl1OC1ja29sZyBfNTY3WW5FQTVFZHFGcUl1OC1ja29sZyI+Ci0gICAgICAgIDxXb3JrUHJvZHVjdCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpEZWxpdmVyYWJsZSIgaHJlZj0idW1hOi8vX3lVZUxJQS1QRWRxTDJPMVBKVjljWkEjX0lJU25VQS1SRWRxTDJPMVBKVjljWkEiLz4KLSAgICAgIDwvcHJvY2Vzc0VsZW1lbnRzPgotICAgICAgPHByb2Nlc3NFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpXb3JrUHJvZHVjdERlc2NyaXB0b3IiIHhtaTppZD0iXzU2N1luMEE1RWRxRnFJdTgtY2tvbGciIG5hbWU9Im91dGNvbWVfQTEiIGd1aWQ9Il81NjdZbjBBNUVkcUZxSXU4LWNrb2xnIiBicmllZkRlc2NyaXB0aW9uPSJPdXRjb21lIEExIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJPdXRjb21lIEExIHByZXNlbnQiIHN1cGVyQWN0aXZpdGllcz0iXzU2N1lRMEE1RWRxRnFJdTgtY2tvbGciPgotICAgICAgICA8V29ya1Byb2R1Y3QgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6T3V0Y29tZSIgaHJlZj0idW1hOi8vX3lVZUxJQS1QRWRxTDJPMVBKVjljWkEjX0tBXzFZQS1SRWRxTDJPMVBKVjljWkEiLz4KLSAgICAgIDwvcHJvY2Vzc0VsZW1lbnRzPgotICAgICAgPHByb2Nlc3NFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpXb3JrUHJvZHVjdERlc2NyaXB0b3IiIHhtaTppZD0iXzU2N1luRUE1RWRxRnFJdTgtY2tvbGciIG5hbWU9ImFydGlmYWN0X0ExIiBndWlkPSJfNTY3WW5FQTVFZHFGcUl1OC1ja29sZyIgYnJpZWZEZXNjcmlwdGlvbj0iQXJ0aWZhY3QgQTEgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IkFydGlmYWN0IEExIHByZXNlbnQiPgotICAgICAgICA8V29ya1Byb2R1Y3QgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6QXJ0aWZhY3QiIGhyZWY9InVtYTovL195VWVMSUEtUEVkcUwyTzFQSlY5Y1pBI185S3Q3OEEtUEVkcUwyTzFQSlY5Y1pBIi8+Ci0gICAgICA8L3Byb2Nlc3NFbGVtZW50cz4KLSAgICAgIDxwcm9jZXNzRWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6V29ya1Byb2R1Y3REZXNjcmlwdG9yIiB4bWk6aWQ9Il81NjdZa2tBNUVkcUZxSXU4LWNrb2xnIiBuYW1lPSJzdWJfYXJ0aWZhY3RfQTEuMSIgZ3VpZD0iXzU2N1lra0E1RWRxRnFJdTgtY2tvbGciIGJyaWVmRGVzY3JpcHRpb249IlN1Yl9BcnRpZmFjdCBBMS4xIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJTdWJfQXJ0aWZhY3QgQTEuMSBwcmVzZW50Ij4KLSAgICAgICAgPFdvcmtQcm9kdWN0IHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkFydGlmYWN0IiBocmVmPSJ1bWE6Ly9feVVlTElBLVBFZHFMMk8xUEpWOWNaQSNfRjUxeXdBLVJFZHFMMk8xUEpWOWNaQSIvPgotICAgICAgPC9wcm9jZXNzRWxlbWVudHM+Ci0gICAgICA8cHJvY2Vzc0VsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOldvcmtQcm9kdWN0RGVzY3JpcHRvciIgeG1pOmlkPSJfNTY3WVFVQTVFZHFGcUl1OC1ja29sZyIgbmFtZT0ib3V0Y29tZV9BMSIgZ3VpZD0iXzU2N1lRVUE1RWRxRnFJdTgtY2tvbGciIGJyaWVmRGVzY3JpcHRpb249Ik91dGNvbWUgQTEgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9Ik91dGNvbWUgQTEgcHJlc2VudCI+Ci0gICAgICAgIDxXb3JrUHJvZHVjdCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpPdXRjb21lIiBocmVmPSJ1bWE6Ly9feVVlTElBLVBFZHFMMk8xUEpWOWNaQSNfS0FfMVlBLVJFZHFMMk8xUEpWOWNaQSIvPgotICAgICAgPC9wcm9jZXNzRWxlbWVudHM+Ci0gICAgICA8cHJvY2Vzc0VsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlRhc2tEZXNjcmlwdG9yIiB4bWk6aWQ9Il81NjdZUjBBNUVkcUZxSXU4LWNrb2xnIiBuYW1lPSJ0YXNrX0IxIiBndWlkPSJfNTY3WVIwQTVFZHFGcUl1OC1ja29sZyIgYnJpZWZEZXNjcmlwdGlvbj0iVGFzayBCMSBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iVGFzayBCMSBwcmVzbmV0IiBzdXBlckFjdGl2aXRpZXM9Il81NjdZUTBBNUVkcUZxSXU4LWNrb2xnIiBhZGRpdGlvbmFsbHlQZXJmb3JtZWRCeT0iXzU2N1lsMEE1RWRxRnFJdTgtY2tvbGciIG1hbmRhdG9yeUlucHV0PSJfNTY3WW5VQTVFZHFGcUl1OC1ja29sZyIgb3B0aW9uYWxJbnB1dD0iXzU2N1lvRUE1RWRxRnFJdTgtY2tvbGciIG91dHB1dD0iXzU2N1lsVUE1RWRxRnFJdTgtY2tvbGciIHBlcmZvcm1lZFByaW1hcmlseUJ5PSJfNTY3WWswQTVFZHFGcUl1OC1ja29sZyI+Ci0gICAgICAgIDxUYXNrIGhyZWY9InVtYTovL19lY3k1d0JNM0VkcXFuZGktZ0R1eHB3I19YVTZMVUI4UEVkcXNoTU5TSTA3WE9nIi8+Ci0gICAgICAgIDxzZWxlY3RlZFN0ZXBzIGhyZWY9InVtYTovLy1sWWpyNlZpdEwxVm5uRk5PNzhYdVl3I19UNEFxQUI4NEVkcU52ZWx5YkRYWkZRIi8+Ci0gICAgICAgIDxzZWxlY3RlZFN0ZXBzIGhyZWY9InVtYTovLy1sWWpyNlZpdEwxVm5uRk5PNzhYdVl3I19UNThqc0I4NEVkcU52ZWx5YkRYWkZRIi8+Ci0gICAgICAgIDxzZWxlY3RlZFN0ZXBzIGhyZWY9InVtYTovLy1sWWpyNlZpdEwxVm5uRk5PNzhYdVl3I19UOFZKVUI4NEVkcU52ZWx5YkRYWkZRIi8+Ci0gICAgICA8L3Byb2Nlc3NFbGVtZW50cz4KLSAgICAgIDxwcm9jZXNzRWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Um9sZURlc2NyaXB0b3IiIHhtaTppZD0iXzU2N1lrMEE1RWRxRnFJdTgtY2tvbGciIG5hbWU9InJvbGVfQjEiIGd1aWQ9Il81NjdZazBBNUVkcUZxSXU4LWNrb2xnIiBicmllZkRlc2NyaXB0aW9uPSJSb2xlIEIxIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJSb2xlIEIxIHByZXNlbnQiIHN1cGVyQWN0aXZpdGllcz0iXzU2N1lRMEE1RWRxRnFJdTgtY2tvbGciIHJlc3BvbnNpYmxlRm9yPSJfNTY3WW5VQTVFZHFGcUl1OC1ja29sZyBfNTY3WW9FQTVFZHFGcUl1OC1ja29sZyI+Ci0gICAgICAgIDxSb2xlIGhyZWY9InVtYTovL19lY3k1d0JNM0VkcXFuZGktZ0R1eHB3I19BOURZZ0I4UEVkcXNoTU5TSTA3WE9nIi8+Ci0gICAgICA8L3Byb2Nlc3NFbGVtZW50cz4KLSAgICAgIDxwcm9jZXNzRWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Um9sZURlc2NyaXB0b3IiIHhtaTppZD0iXzU2N1lsMEE1RWRxRnFJdTgtY2tvbGciIG5hbWU9InJvbGVfQjIiIGd1aWQ9Il81NjdZbDBBNUVkcUZxSXU4LWNrb2xnIiBicmllZkRlc2NyaXB0aW9uPSJSb2xlIEIyIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJSb2xlIEIyIHByZXNlbnQiIHN1cGVyQWN0aXZpdGllcz0iXzU2N1lRMEE1RWRxRnFJdTgtY2tvbGciPgotICAgICAgICA8Um9sZSBocmVmPSJ1bWE6Ly9fZWN5NXdCTTNFZHFxbmRpLWdEdXhwdyNfS0NNX0lCOFBFZHFzaE1OU0kwN1hPZyIvPgotICAgICAgPC9wcm9jZXNzRWxlbWVudHM+Ci0gICAgICA8cHJvY2Vzc0VsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOldvcmtQcm9kdWN0RGVzY3JpcHRvciIgeG1pOmlkPSJfNTY3WW5VQTVFZHFGcUl1OC1ja29sZyIgbmFtZT0iYXJ0aWZhY3RfQjEiIGd1aWQ9Il81NjdZblVBNUVkcUZxSXU4LWNrb2xnIiBicmllZkRlc2NyaXB0aW9uPSJBcnRpZmFjdCBCMSBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iQXJ0aWZhY3QgQjEgcHJlc2VudCIgc3VwZXJBY3Rpdml0aWVzPSJfNTY3WVEwQTVFZHFGcUl1OC1ja29sZyI+Ci0gICAgICAgIDxXb3JrUHJvZHVjdCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpBcnRpZmFjdCIgaHJlZj0idW1hOi8vX2VjeTV3Qk0zRWRxcW5kaS1nRHV4cHcjX21xSjNBQjhQRWRxc2hNTlNJMDdYT2ciLz4KLSAgICAgIDwvcHJvY2Vzc0VsZW1lbnRzPgotICAgICAgPHByb2Nlc3NFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpXb3JrUHJvZHVjdERlc2NyaXB0b3IiIHhtaTppZD0iXzU2N1lvRUE1RWRxRnFJdTgtY2tvbGciIG5hbWU9ImRlbGl2ZXJhYmxlX0IxIiBndWlkPSJfNTY3WW9FQTVFZHFGcUl1OC1ja29sZyIgYnJpZWZEZXNjcmlwdGlvbj0iRGVsaXZlcmFibGUgQjEgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IkRlbGl2ZXJhYmxlIEIxIHByZXNlbnQiIHN1cGVyQWN0aXZpdGllcz0iXzU2N1lRMEE1RWRxRnFJdTgtY2tvbGciIGRlbGl2ZXJhYmxlUGFydHM9Il81NjdZUzBBNUVkcUZxSXU4LWNrb2xnIF81NjdZVEVBNUVkcUZxSXU4LWNrb2xnIj4KLSAgICAgICAgPFdvcmtQcm9kdWN0IHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkRlbGl2ZXJhYmxlIiBocmVmPSJ1bWE6Ly9fZWN5NXdCTTNFZHFxbmRpLWdEdXhwdyNfWkhmMllCOG5FZHExT28tRG93ZHBCZyIvPgotICAgICAgPC9wcm9jZXNzRWxlbWVudHM+Ci0gICAgICA8cHJvY2Vzc0VsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOldvcmtQcm9kdWN0RGVzY3JpcHRvciIgeG1pOmlkPSJfNTY3WWxVQTVFZHFGcUl1OC1ja29sZyIgbmFtZT0ib3V0Y29tZV9CMSIgZ3VpZD0iXzU2N1lsVUE1RWRxRnFJdTgtY2tvbGciIGJyaWVmRGVzY3JpcHRpb249Ik91dGNvbWUgQjEgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9Ik91dGNvbWUgQjEgcHJlc2VudCIgc3VwZXJBY3Rpdml0aWVzPSJfNTY3WVEwQTVFZHFGcUl1OC1ja29sZyI+Ci0gICAgICAgIDxXb3JrUHJvZHVjdCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpPdXRjb21lIiBocmVmPSJ1bWE6Ly9fZWN5NXdCTTNFZHFxbmRpLWdEdXhwdyNfY1hYcnNCOG5FZHExT28tRG93ZHBCZyIvPgotICAgICAgPC9wcm9jZXNzRWxlbWVudHM+Ci0gICAgICA8cHJvY2Vzc0VsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOldvcmtQcm9kdWN0RGVzY3JpcHRvciIgeG1pOmlkPSJfNTY3WVMwQTVFZHFGcUl1OC1ja29sZyIgbmFtZT0iYXJ0aWZhY3RfQjEiIGd1aWQ9Il81NjdZUzBBNUVkcUZxSXU4LWNrb2xnIiBicmllZkRlc2NyaXB0aW9uPSJBcnRpZmFjdCBCMSBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iQXJ0aWZhY3QgQjEgcHJlc2VudCI+Ci0gICAgICAgIDxXb3JrUHJvZHVjdCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpBcnRpZmFjdCIgaHJlZj0idW1hOi8vX2VjeTV3Qk0zRWRxcW5kaS1nRHV4cHcjX21xSjNBQjhQRWRxc2hNTlNJMDdYT2ciLz4KLSAgICAgIDwvcHJvY2Vzc0VsZW1lbnRzPgotICAgICAgPHByb2Nlc3NFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpXb3JrUHJvZHVjdERlc2NyaXB0b3IiIHhtaTppZD0iXzU2N1lURUE1RWRxRnFJdTgtY2tvbGciIG5hbWU9Im91dGNvbWVfQjEiIGd1aWQ9Il81NjdZVEVBNUVkcUZxSXU4LWNrb2xnIiBicmllZkRlc2NyaXB0aW9uPSJPdXRjb21lIEIxIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJPdXRjb21lIEIxIHByZXNlbnQiPgotICAgICAgICA8V29ya1Byb2R1Y3QgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6T3V0Y29tZSIgaHJlZj0idW1hOi8vX2VjeTV3Qk0zRWRxcW5kaS1nRHV4cHcjX2NYWHJzQjhuRWRxMU9vLURvd2RwQmciLz4KLSAgICAgIDwvcHJvY2Vzc0VsZW1lbnRzPgotICAgICAgPHByb2Nlc3NFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpUYXNrRGVzY3JpcHRvciIgeG1pOmlkPSJfNTY3WVJFQTVFZHFGcUl1OC1ja29sZyIgbmFtZT0idGFza19CMiIgZ3VpZD0iXzU2N1lSRUE1RWRxRnFJdTgtY2tvbGciIGJyaWVmRGVzY3JpcHRpb249IlRhc2sgQjIgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IlRhc2sgQjIgcHJlc2VudCIgc3VwZXJBY3Rpdml0aWVzPSJfNTY3WVEwQTVFZHFGcUl1OC1ja29sZyIgYWRkaXRpb25hbGx5UGVyZm9ybWVkQnk9Il81NjdZazBBNUVkcUZxSXU4LWNrb2xnIiBtYW5kYXRvcnlJbnB1dD0iXzU2N1lRa0E1RWRxRnFJdTgtY2tvbGciIG9wdGlvbmFsSW5wdXQ9Il81NjdZbEVBNUVkcUZxSXU4LWNrb2xnIiBvdXRwdXQ9Il81NjdZbGtBNUVkcUZxSXU4LWNrb2xnIiBwZXJmb3JtZWRQcmltYXJpbHlCeT0iXzU2N1lsMEE1RWRxRnFJdTgtY2tvbGciPgotICAgICAgICA8VGFzayBocmVmPSJ1bWE6Ly9fZWN5NXdCTTNFZHFxbmRpLWdEdXhwdyNfWkxPTXNCOFBFZHFzaE1OU0kwN1hPZyIvPgotICAgICAgICA8c2VsZWN0ZWRTdGVwcyBocmVmPSJ1bWE6Ly8tSjN6MElHZmplaGl0MHVGYlRKY2E3ZyNfb3FZc3dCODRFZHFOdmVseWJEWFpGUSIvPgotICAgICAgICA8c2VsZWN0ZWRTdGVwcyBocmVmPSJ1bWE6Ly8tSjN6MElHZmplaGl0MHVGYlRKY2E3ZyNfcXVRcEFCODRFZHFOdmVseWJEWFpGUSIvPgotICAgICAgICA8c2VsZWN0ZWRTdGVwcyBocmVmPSJ1bWE6Ly8tSjN6MElHZmplaGl0MHVGYlRKY2E3ZyNfcXl1NVVCODRFZHFOdmVseWJEWFpGUSIvPgotICAgICAgPC9wcm9jZXNzRWxlbWVudHM+Ci0gICAgICA8cHJvY2Vzc0VsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOldvcmtQcm9kdWN0RGVzY3JpcHRvciIgeG1pOmlkPSJfNTY3WVFrQTVFZHFGcUl1OC1ja29sZyIgbmFtZT0iYXJ0aWZhY3RfQjIiIGd1aWQ9Il81NjdZUWtBNUVkcUZxSXU4LWNrb2xnIiBicmllZkRlc2NyaXB0aW9uPSJBcnRpZmFjdCBCMiBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iQXJ0aWZhY3QgQjIgcHJlc2VudCIgc3VwZXJBY3Rpdml0aWVzPSJfNTY3WVEwQTVFZHFGcUl1OC1ja29sZyI+Ci0gICAgICAgIDxXb3JrUHJvZHVjdCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpBcnRpZmFjdCIgaHJlZj0idW1hOi8vX2VjeTV3Qk0zRWRxcW5kaS1nRHV4cHcjX195RzdjQjhtRWRxMU9vLURvd2RwQmciLz4KLSAgICAgIDwvcHJvY2Vzc0VsZW1lbnRzPgotICAgICAgPHByb2Nlc3NFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpXb3JrUHJvZHVjdERlc2NyaXB0b3IiIHhtaTppZD0iXzU2N1lsRUE1RWRxRnFJdTgtY2tvbGciIG5hbWU9ImRlbGl2ZXJhYmxlX0IyIiBndWlkPSJfNTY3WWxFQTVFZHFGcUl1OC1ja29sZyIgYnJpZWZEZXNjcmlwdGlvbj0iRGVsaXZlcmFibGUgQjIgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IkRlbGl2ZXJhYmxlIEIyIHByZXNlbnQiIHN1cGVyQWN0aXZpdGllcz0iXzU2N1lRMEE1RWRxRnFJdTgtY2tvbGciIGRlbGl2ZXJhYmxlUGFydHM9Il81NjdZa1VBNUVkcUZxSXU4LWNrb2xnIF81NjdZbWtBNUVkcUZxSXU4LWNrb2xnIj4KLSAgICAgICAgPFdvcmtQcm9kdWN0IHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkRlbGl2ZXJhYmxlIiBocmVmPSJ1bWE6Ly9fZWN5NXdCTTNFZHFxbmRpLWdEdXhwdyNfbnFGV0VCOG5FZHExT28tRG93ZHBCZyIvPgotICAgICAgPC9wcm9jZXNzRWxlbWVudHM+Ci0gICAgICA8cHJvY2Vzc0VsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOldvcmtQcm9kdWN0RGVzY3JpcHRvciIgeG1pOmlkPSJfNTY3WWxrQTVFZHFGcUl1OC1ja29sZyIgbmFtZT0ib3V0Y29tZV9CMiIgZ3VpZD0iXzU2N1lsa0E1RWRxRnFJdTgtY2tvbGciIGJyaWVmRGVzY3JpcHRpb249Ik91dGNvbWUgQjIgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9Ik91dGNvbWUgQjIgcHJlc2VudCIgc3VwZXJBY3Rpdml0aWVzPSJfNTY3WVEwQTVFZHFGcUl1OC1ja29sZyI+Ci0gICAgICAgIDxXb3JrUHJvZHVjdCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpPdXRjb21lIiBocmVmPSJ1bWE6Ly9fZWN5NXdCTTNFZHFxbmRpLWdEdXhwdyNfYXNGT2tCOG5FZHExT28tRG93ZHBCZyIvPgotICAgICAgPC9wcm9jZXNzRWxlbWVudHM+Ci0gICAgICA8cHJvY2Vzc0VsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOldvcmtQcm9kdWN0RGVzY3JpcHRvciIgeG1pOmlkPSJfNTY3WW1rQTVFZHFGcUl1OC1ja29sZyIgbmFtZT0iYXJ0aWZhY3RfQjIiIGd1aWQ9Il81NjdZbWtBNUVkcUZxSXU4LWNrb2xnIiBicmllZkRlc2NyaXB0aW9uPSJBcnRpZmFjdCBCMiBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iQXJ0aWZhY3QgQjIgcHJlc2VudCI+Ci0gICAgICAgIDxXb3JrUHJvZHVjdCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpBcnRpZmFjdCIgaHJlZj0idW1hOi8vX2VjeTV3Qk0zRWRxcW5kaS1nRHV4cHcjX195RzdjQjhtRWRxMU9vLURvd2RwQmciLz4KLSAgICAgIDwvcHJvY2Vzc0VsZW1lbnRzPgotICAgICAgPHByb2Nlc3NFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpXb3JrUHJvZHVjdERlc2NyaXB0b3IiIHhtaTppZD0iXzU2N1lrVUE1RWRxRnFJdTgtY2tvbGciIG5hbWU9Im91dGNvbWVfQjIiIGd1aWQ9Il81NjdZa1VBNUVkcUZxSXU4LWNrb2xnIiBicmllZkRlc2NyaXB0aW9uPSJPdXRjb21lIEIyIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJPdXRjb21lIEIyIHByZXNlbnQiPgotICAgICAgICA8V29ya1Byb2R1Y3QgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6T3V0Y29tZSIgaHJlZj0idW1hOi8vX2VjeTV3Qk0zRWRxcW5kaS1nRHV4cHcjX2FzRk9rQjhuRWRxMU9vLURvd2RwQmciLz4KLSAgICAgIDwvcHJvY2Vzc0VsZW1lbnRzPgotICAgICAgPHByb2Nlc3NFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpUYXNrRGVzY3JpcHRvciIgeG1pOmlkPSJfNTY3WVJrQTVFZHFGcUl1OC1ja29sZyIgbmFtZT0idGFza19BMiIgZ3VpZD0iXzU2N1lSa0E1RWRxRnFJdTgtY2tvbGciIGJyaWVmRGVzY3JpcHRpb249IlRhc2sgQTIgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IlRhc2sgQTIgIiBzdXBlckFjdGl2aXRpZXM9Il81NjdZUTBBNUVkcUZxSXU4LWNrb2xnIiBhZGRpdGlvbmFsbHlQZXJmb3JtZWRCeT0iXzU2N1lTRUE1RWRxRnFJdTgtY2tvbGciIG1hbmRhdG9yeUlucHV0PSJfNTY3WWtFQTVFZHFGcUl1OC1ja29sZyIgb3B0aW9uYWxJbnB1dD0iXzU2N1ltMEE1RWRxRnFJdTgtY2tvbGciIG91dHB1dD0iXzU2N1lqMEE1RWRxRnFJdTgtY2tvbGciIHBlcmZvcm1lZFByaW1hcmlseUJ5PSJfNTY3WW1VQTVFZHFGcUl1OC1ja29sZyI+Ci0gICAgICAgIDxUYXNrIGhyZWY9InVtYTovL195VWVMSUEtUEVkcUwyTzFQSlY5Y1pBI183NU5Rd0EtUEVkcUwyTzFQSlY5Y1pBIi8+Ci0gICAgICAgIDxzZWxlY3RlZFN0ZXBzIGhyZWY9InVtYTovLy0xM3E4SkpBYTBpeDZyRE1aQXF3eTF3I190aTJCWUJCT0VkcUJzN0toZFZMUkxBIi8+Ci0gICAgICAgIDxzZWxlY3RlZFN0ZXBzIGhyZWY9InVtYTovLy0xM3E4SkpBYTBpeDZyRE1aQXF3eTF3I190azdzRUJCT0VkcUJzN0toZFZMUkxBIi8+Ci0gICAgICAgIDxzZWxlY3RlZFN0ZXBzIGhyZWY9InVtYTovLy0xM3E4SkpBYTBpeDZyRE1aQXF3eTF3I190bmRib0JCT0VkcUJzN0toZFZMUkxBIi8+Ci0gICAgICA8L3Byb2Nlc3NFbGVtZW50cz4KLSAgICAgIDxwcm9jZXNzRWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6V29ya1Byb2R1Y3REZXNjcmlwdG9yIiB4bWk6aWQ9Il81NjdZa0VBNUVkcUZxSXU4LWNrb2xnIiBuYW1lPSJhcnRpZmFjdF9BMiIgZ3VpZD0iXzU2N1lrRUE1RWRxRnFJdTgtY2tvbGciIGJyaWVmRGVzY3JpcHRpb249IkFydGlmYWN0IEEyIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJBcnRpZmFjdCBBMiBwcmVzZW50IiBzdXBlckFjdGl2aXRpZXM9Il81NjdZUTBBNUVkcUZxSXU4LWNrb2xnIj4KLSAgICAgICAgPFdvcmtQcm9kdWN0IHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkFydGlmYWN0IiBocmVmPSJ1bWE6Ly9feVVlTElBLVBFZHFMMk8xUEpWOWNaQSNfRTdaMGtBLVJFZHFMMk8xUEpWOWNaQSIvPgotICAgICAgPC9wcm9jZXNzRWxlbWVudHM+Ci0gICAgICA8cHJvY2Vzc0VsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOldvcmtQcm9kdWN0RGVzY3JpcHRvciIgeG1pOmlkPSJfNTY3WW0wQTVFZHFGcUl1OC1ja29sZyIgbmFtZT0iZGVsaXZlcmFibGVfQTIiIGd1aWQ9Il81NjdZbTBBNUVkcUZxSXU4LWNrb2xnIiBicmllZkRlc2NyaXB0aW9uPSJEZWxpdmVyYWJsZSBBMiBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iRGVsaXZlcmFibGUgQTIgcHJlc2VudCIgc3VwZXJBY3Rpdml0aWVzPSJfNTY3WVEwQTVFZHFGcUl1OC1ja29sZyIgZGVsaXZlcmFibGVQYXJ0cz0iXzU2N1lSVUE1RWRxRnFJdTgtY2tvbGcgXzU2N1lTa0E1RWRxRnFJdTgtY2tvbGciPgotICAgICAgICA8V29ya1Byb2R1Y3QgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6RGVsaXZlcmFibGUiIGhyZWY9InVtYTovL195VWVMSUEtUEVkcUwyTzFQSlY5Y1pBI19KQnFmVUEtUkVkcUwyTzFQSlY5Y1pBIi8+Ci0gICAgICA8L3Byb2Nlc3NFbGVtZW50cz4KLSAgICAgIDxwcm9jZXNzRWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6V29ya1Byb2R1Y3REZXNjcmlwdG9yIiB4bWk6aWQ9Il81NjdZajBBNUVkcUZxSXU4LWNrb2xnIiBuYW1lPSJvdXRjb21lX0EyIiBndWlkPSJfNTY3WWowQTVFZHFGcUl1OC1ja29sZyIgYnJpZWZEZXNjcmlwdGlvbj0iT3V0Y29tZSBBMSBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iT3V0Y29tZSBBMiBwcmVzZW50IiBzdXBlckFjdGl2aXRpZXM9Il81NjdZUTBBNUVkcUZxSXU4LWNrb2xnIj4KLSAgICAgICAgPFdvcmtQcm9kdWN0IHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOk91dGNvbWUiIGhyZWY9InVtYTovL195VWVMSUEtUEVkcUwyTzFQSlY5Y1pBI19Ldkx4RUEtUkVkcUwyTzFQSlY5Y1pBIi8+Ci0gICAgICA8L3Byb2Nlc3NFbGVtZW50cz4KLSAgICAgIDxwcm9jZXNzRWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6V29ya1Byb2R1Y3REZXNjcmlwdG9yIiB4bWk6aWQ9Il81NjdZU2tBNUVkcUZxSXU4LWNrb2xnIiBuYW1lPSJhcnRpZmFjdF9BMiIgZ3VpZD0iXzU2N1lTa0E1RWRxRnFJdTgtY2tvbGciIGJyaWVmRGVzY3JpcHRpb249IkFydGlmYWN0IEEyIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJBcnRpZmFjdCBBMiBwcmVzZW50Ij4KLSAgICAgICAgPFdvcmtQcm9kdWN0IHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkFydGlmYWN0IiBocmVmPSJ1bWE6Ly9feVVlTElBLVBFZHFMMk8xUEpWOWNaQSNfRTdaMGtBLVJFZHFMMk8xUEpWOWNaQSIvPgotICAgICAgPC9wcm9jZXNzRWxlbWVudHM+Ci0gICAgICA8cHJvY2Vzc0VsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOldvcmtQcm9kdWN0RGVzY3JpcHRvciIgeG1pOmlkPSJfNTY3WVJVQTVFZHFGcUl1OC1ja29sZyIgbmFtZT0ib3V0Y29tZV9BMiIgZ3VpZD0iXzU2N1lSVUE1RWRxRnFJdTgtY2tvbGciIGJyaWVmRGVzY3JpcHRpb249Ik91dGNvbWUgQTEgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9Ik91dGNvbWUgQTIgcHJlc2VudCI+Ci0gICAgICAgIDxXb3JrUHJvZHVjdCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpPdXRjb21lIiBocmVmPSJ1bWE6Ly9feVVlTElBLVBFZHFMMk8xUEpWOWNaQSNfS3ZMeEVBLVJFZHFMMk8xUEpWOWNaQSIvPgotICAgICAgPC9wcm9jZXNzRWxlbWVudHM+Ci0gICAgICA8ZGlhZ3JhbXMgeG1pOmlkPSJfcmF4RkFFQTZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX3JheEZBRUE2RWRxRnFJdTgtY2tvbGciPgotICAgICAgICA8Y29udGFpbmVkIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkdyYXBoTm9kZSIgeG1pOmlkPSJfcmJOSjRFQTZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX3JiTko0RUE2RWRxRnFJdTgtY2tvbGciPgotICAgICAgICAgIDxwb3NpdGlvbiB4bWk6aWQ9Il9yYk5KNFVBNkVkcUZxSXU4LWNrb2xnIiB4PSIxMC4wIiB5PSIxMC4wIi8+Ci0gICAgICAgICAgPHNlbWFudGljTW9kZWwgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VU1BU2VtYW50aWNNb2RlbEJyaWRnZSIgeG1pOmlkPSJfcmJOSjRrQTZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX3JiTko0a0E2RWRxRnFJdTgtY2tvbGciIGVsZW1lbnQ9Il81NjdZUjBBNUVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgICAgICAgPHNpemUgeG1pOmlkPSJfcmJOSjQwQTZFZHFGcUl1OC1ja29sZyIgd2lkdGg9Ii0xLjAiIGhlaWdodD0iLTEuMCIvPgotICAgICAgICA8L2NvbnRhaW5lZD4KLSAgICAgICAgPGNvbnRhaW5lZCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpHcmFwaE5vZGUiIHhtaTppZD0iX3JiTko1RUE2RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il9yYk5KNUVBNkVkcUZxSXU4LWNrb2xnIj4KLSAgICAgICAgICA8cG9zaXRpb24geG1pOmlkPSJfcmJOSjVVQTZFZHFGcUl1OC1ja29sZyIgeD0iMTI5LjAiIHk9IjEwLjAiLz4KLSAgICAgICAgICA8c2VtYW50aWNNb2RlbCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpVTUFTZW1hbnRpY01vZGVsQnJpZGdlIiB4bWk6aWQ9Il9yYk5KNWtBNkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfcmJOSjVrQTZFZHFGcUl1OC1ja29sZyIgZWxlbWVudD0iXzU2N1lSRUE1RWRxRnFJdTgtY2tvbGciLz4KLSAgICAgICAgICA8c2l6ZSB4bWk6aWQ9Il9yYk5KNTBBNkVkcUZxSXU4LWNrb2xnIiB3aWR0aD0iLTEuMCIgaGVpZ2h0PSItMS4wIi8+Ci0gICAgICAgIDwvY29udGFpbmVkPgotICAgICAgICA8c2VtYW50aWNNb2RlbCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpVTUFTZW1hbnRpY01vZGVsQnJpZGdlIiB4bWk6aWQ9Il9yYXhGQVVBNkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfcmF4RkFVQTZFZHFGcUl1OC1ja29sZyIgcHJlc2VudGF0aW9uPSJXb3JrZmxvdyIgZWxlbWVudD0iXzU2N1lRMEE1RWRxRnFJdTgtY2tvbGciLz4KLSAgICAgIDwvZGlhZ3JhbXM+Ci0gICAgICA8ZGlhZ3JhbXMgeG1pOmlkPSJfc0FkekVFQTZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX3NBZHpFRUE2RWRxRnFJdTgtY2tvbGciPgotICAgICAgICA8Y29udGFpbmVkIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkdyYXBoTm9kZSIgeG1pOmlkPSJfc0FkekVVQTZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX3NBZHpFVUE2RWRxRnFJdTgtY2tvbGciPgotICAgICAgICAgIDxwb3NpdGlvbiB4bWk6aWQ9Il9zQWR6RWtBNkVkcUZxSXU4LWNrb2xnIiB4PSItMS4wIiB5PSItMS4wIi8+Ci0gICAgICAgICAgPHNlbWFudGljTW9kZWwgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VU1BU2VtYW50aWNNb2RlbEJyaWRnZSIgeG1pOmlkPSJfc0FkekUwQTZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX3NBZHpFMEE2RWRxRnFJdTgtY2tvbGciIGVsZW1lbnQ9Il81NjdZb1VBNUVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgICAgICAgPHNpemUgeG1pOmlkPSJfc0FkekZFQTZFZHFGcUl1OC1ja29sZyIgd2lkdGg9Ii0xLjAiIGhlaWdodD0iLTEuMCIvPgotICAgICAgICA8L2NvbnRhaW5lZD4KLSAgICAgICAgPGNvbnRhaW5lZCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpHcmFwaE5vZGUiIHhtaTppZD0iX3NBZHpGVUE2RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il9zQWR6RlVBNkVkcUZxSXU4LWNrb2xnIj4KLSAgICAgICAgICA8cG9zaXRpb24geG1pOmlkPSJfc0FkekZrQTZFZHFGcUl1OC1ja29sZyIgeD0iLTEuMCIgeT0iLTEuMCIvPgotICAgICAgICAgIDxzZW1hbnRpY01vZGVsIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlVNQVNlbWFudGljTW9kZWxCcmlkZ2UiIHhtaTppZD0iX3NBZHpGMEE2RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il9zQWR6RjBBNkVkcUZxSXU4LWNrb2xnIiBlbGVtZW50PSJfNTY3WW5rQTVFZHFGcUl1OC1ja29sZyIvPgotICAgICAgICAgIDxzaXplIHhtaTppZD0iX3NBZHpHRUE2RWRxRnFJdTgtY2tvbGciIHdpZHRoPSItMS4wIiBoZWlnaHQ9Ii0xLjAiLz4KLSAgICAgICAgPC9jb250YWluZWQ+Ci0gICAgICAgIDxjb250YWluZWQgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6R3JhcGhOb2RlIiB4bWk6aWQ9Il9zQWR6R1VBNkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfc0FkekdVQTZFZHFGcUl1OC1ja29sZyI+Ci0gICAgICAgICAgPHBvc2l0aW9uIHhtaTppZD0iX3NBZHpHa0E2RWRxRnFJdTgtY2tvbGciIHg9Ii0xLjAiIHk9Ii0xLjAiLz4KLSAgICAgICAgICA8c2VtYW50aWNNb2RlbCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpVTUFTZW1hbnRpY01vZGVsQnJpZGdlIiB4bWk6aWQ9Il9zQWR6RzBBNkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfc0FkekcwQTZFZHFGcUl1OC1ja29sZyIgZWxlbWVudD0iXzU2N1ltRUE1RWRxRnFJdTgtY2tvbGciLz4KLSAgICAgICAgICA8c2l6ZSB4bWk6aWQ9Il9zQWR6SEVBNkVkcUZxSXU4LWNrb2xnIiB3aWR0aD0iLTEuMCIgaGVpZ2h0PSItMS4wIi8+Ci0gICAgICAgIDwvY29udGFpbmVkPgotICAgICAgICA8Y29udGFpbmVkIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkdyYXBoTm9kZSIgeG1pOmlkPSJfc0FkekhVQTZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX3NBZHpIVUE2RWRxRnFJdTgtY2tvbGciPgotICAgICAgICAgIDxwb3NpdGlvbiB4bWk6aWQ9Il9zQWR6SGtBNkVkcUZxSXU4LWNrb2xnIiB4PSItMS4wIiB5PSItMS4wIi8+Ci0gICAgICAgICAgPHNlbWFudGljTW9kZWwgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VU1BU2VtYW50aWNNb2RlbEJyaWRnZSIgeG1pOmlkPSJfc0FkekgwQTZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX3NBZHpIMEE2RWRxRnFJdTgtY2tvbGciIGVsZW1lbnQ9Il81NjdZbjBBNUVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgICAgICAgPHNpemUgeG1pOmlkPSJfc0FkeklFQTZFZHFGcUl1OC1ja29sZyIgd2lkdGg9Ii0xLjAiIGhlaWdodD0iLTEuMCIvPgotICAgICAgICA8L2NvbnRhaW5lZD4KLSAgICAgICAgPGNvbnRhaW5lZCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpHcmFwaE5vZGUiIHhtaTppZD0iX3NBZHpJVUE2RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il9zQWR6SVVBNkVkcUZxSXU4LWNrb2xnIj4KLSAgICAgICAgICA8cG9zaXRpb24geG1pOmlkPSJfc0FkeklrQTZFZHFGcUl1OC1ja29sZyIgeD0iMTAuMCIgeT0iMTAuMCIvPgotICAgICAgICAgIDxzZW1hbnRpY01vZGVsIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlVNQVNlbWFudGljTW9kZWxCcmlkZ2UiIHhtaTppZD0iX3NBZHpJMEE2RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il9zQWR6STBBNkVkcUZxSXU4LWNrb2xnIiBlbGVtZW50PSJfNTY3WW5VQTVFZHFGcUl1OC1ja29sZyIvPgotICAgICAgICAgIDxzaXplIHhtaTppZD0iX3NBZHpKRUE2RWRxRnFJdTgtY2tvbGciIHdpZHRoPSItMS4wIiBoZWlnaHQ9Ii0xLjAiLz4KLSAgICAgICAgPC9jb250YWluZWQ+Ci0gICAgICAgIDxjb250YWluZWQgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6R3JhcGhOb2RlIiB4bWk6aWQ9Il9zQWR6SlVBNkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfc0FkekpVQTZFZHFGcUl1OC1ja29sZyI+Ci0gICAgICAgICAgPHBvc2l0aW9uIHhtaTppZD0iX3NBZHpKa0E2RWRxRnFJdTgtY2tvbGciIHg9IjE0Mi4wIiB5PSIxMC4wIi8+Ci0gICAgICAgICAgPHNlbWFudGljTW9kZWwgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VU1BU2VtYW50aWNNb2RlbEJyaWRnZSIgeG1pOmlkPSJfc0FkekowQTZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX3NBZHpKMEE2RWRxRnFJdTgtY2tvbGciIGVsZW1lbnQ9Il81NjdZb0VBNUVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgICAgICAgPHNpemUgeG1pOmlkPSJfc0FkektFQTZFZHFGcUl1OC1ja29sZyIgd2lkdGg9Ii0xLjAiIGhlaWdodD0iLTEuMCIvPgotICAgICAgICA8L2NvbnRhaW5lZD4KLSAgICAgICAgPGNvbnRhaW5lZCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpHcmFwaE5vZGUiIHhtaTppZD0iX3NBZHpLVUE2RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il9zQWR6S1VBNkVkcUZxSXU4LWNrb2xnIj4KLSAgICAgICAgICA8cG9zaXRpb24geG1pOmlkPSJfc0FkektrQTZFZHFGcUl1OC1ja29sZyIgeD0iMjkxLjAiIHk9IjEwLjAiLz4KLSAgICAgICAgICA8c2VtYW50aWNNb2RlbCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpVTUFTZW1hbnRpY01vZGVsQnJpZGdlIiB4bWk6aWQ9Il9zQWR6SzBBNkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfc0FkekswQTZFZHFGcUl1OC1ja29sZyIgZWxlbWVudD0iXzU2N1lsVUE1RWRxRnFJdTgtY2tvbGciLz4KLSAgICAgICAgICA8c2l6ZSB4bWk6aWQ9Il9zQWR6TEVBNkVkcUZxSXU4LWNrb2xnIiB3aWR0aD0iLTEuMCIgaGVpZ2h0PSItMS4wIi8+Ci0gICAgICAgIDwvY29udGFpbmVkPgotICAgICAgICA8Y29udGFpbmVkIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkdyYXBoTm9kZSIgeG1pOmlkPSJfc0FkekxVQTZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX3NBZHpMVUE2RWRxRnFJdTgtY2tvbGciPgotICAgICAgICAgIDxwb3NpdGlvbiB4bWk6aWQ9Il9zQWR6TGtBNkVkcUZxSXU4LWNrb2xnIiB4PSI0MzAuMCIgeT0iMTAuMCIvPgotICAgICAgICAgIDxzZW1hbnRpY01vZGVsIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlVNQVNlbWFudGljTW9kZWxCcmlkZ2UiIHhtaTppZD0iX3NBZHpMMEE2RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il9zQWR6TDBBNkVkcUZxSXU4LWNrb2xnIiBlbGVtZW50PSJfNTY3WVFrQTVFZHFGcUl1OC1ja29sZyIvPgotICAgICAgICAgIDxzaXplIHhtaTppZD0iX3NBZHpNRUE2RWRxRnFJdTgtY2tvbGciIHdpZHRoPSItMS4wIiBoZWlnaHQ9Ii0xLjAiLz4KLSAgICAgICAgPC9jb250YWluZWQ+Ci0gICAgICAgIDxjb250YWluZWQgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6R3JhcGhOb2RlIiB4bWk6aWQ9Il9zQWR6TVVBNkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfc0Fkek1VQTZFZHFGcUl1OC1ja29sZyI+Ci0gICAgICAgICAgPHBvc2l0aW9uIHhtaTppZD0iX3NBZHpNa0E2RWRxRnFJdTgtY2tvbGciIHg9IjU2Mi4wIiB5PSIxMC4wIi8+Ci0gICAgICAgICAgPHNlbWFudGljTW9kZWwgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VU1BU2VtYW50aWNNb2RlbEJyaWRnZSIgeG1pOmlkPSJfc0Fkek0wQTZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX3NBZHpNMEE2RWRxRnFJdTgtY2tvbGciIGVsZW1lbnQ9Il81NjdZbEVBNUVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgICAgICAgPHNpemUgeG1pOmlkPSJfc0Fkek5FQTZFZHFGcUl1OC1ja29sZyIgd2lkdGg9Ii0xLjAiIGhlaWdodD0iLTEuMCIvPgotICAgICAgICA8L2NvbnRhaW5lZD4KLSAgICAgICAgPGNvbnRhaW5lZCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpHcmFwaE5vZGUiIHhtaTppZD0iX3NBZHpOVUE2RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il9zQWR6TlVBNkVkcUZxSXU4LWNrb2xnIj4KLSAgICAgICAgICA8cG9zaXRpb24geG1pOmlkPSJfc0Fkek5rQTZFZHFGcUl1OC1ja29sZyIgeD0iNzExLjAiIHk9IjEwLjAiLz4KLSAgICAgICAgICA8c2VtYW50aWNNb2RlbCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpVTUFTZW1hbnRpY01vZGVsQnJpZGdlIiB4bWk6aWQ9Il9zQWR6TjBBNkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfc0Fkek4wQTZFZHFGcUl1OC1ja29sZyIgZWxlbWVudD0iXzU2N1lsa0E1RWRxRnFJdTgtY2tvbGciLz4KLSAgICAgICAgICA8c2l6ZSB4bWk6aWQ9Il9zQWR6T0VBNkVkcUZxSXU4LWNrb2xnIiB3aWR0aD0iLTEuMCIgaGVpZ2h0PSItMS4wIi8+Ci0gICAgICAgIDwvY29udGFpbmVkPgotICAgICAgICA8Y29udGFpbmVkIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkdyYXBoTm9kZSIgeG1pOmlkPSJfc0Fkek9VQTZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX3NBZHpPVUE2RWRxRnFJdTgtY2tvbGciPgotICAgICAgICAgIDxwb3NpdGlvbiB4bWk6aWQ9Il9zQWR6T2tBNkVkcUZxSXU4LWNrb2xnIiB4PSItMS4wIiB5PSItMS4wIi8+Ci0gICAgICAgICAgPHNlbWFudGljTW9kZWwgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VU1BU2VtYW50aWNNb2RlbEJyaWRnZSIgeG1pOmlkPSJfc0Fkek8wQTZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX3NBZHpPMEE2RWRxRnFJdTgtY2tvbGciIGVsZW1lbnQ9Il81NjdZa0VBNUVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgICAgICAgPHNpemUgeG1pOmlkPSJfc0FkelBFQTZFZHFGcUl1OC1ja29sZyIgd2lkdGg9Ii0xLjAiIGhlaWdodD0iLTEuMCIvPgotICAgICAgICA8L2NvbnRhaW5lZD4KLSAgICAgICAgPGNvbnRhaW5lZCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpHcmFwaE5vZGUiIHhtaTppZD0iX3NBZHpQVUE2RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il9zQWR6UFVBNkVkcUZxSXU4LWNrb2xnIj4KLSAgICAgICAgICA8cG9zaXRpb24geG1pOmlkPSJfc0FkelBrQTZFZHFGcUl1OC1ja29sZyIgeD0iLTEuMCIgeT0iLTEuMCIvPgotICAgICAgICAgIDxzZW1hbnRpY01vZGVsIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlVNQVNlbWFudGljTW9kZWxCcmlkZ2UiIHhtaTppZD0iX3NBZHpQMEE2RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il9zQWR6UDBBNkVkcUZxSXU4LWNrb2xnIiBlbGVtZW50PSJfNTY3WW0wQTVFZHFGcUl1OC1ja29sZyIvPgotICAgICAgICAgIDxzaXplIHhtaTppZD0iX3NBZHpRRUE2RWRxRnFJdTgtY2tvbGciIHdpZHRoPSItMS4wIiBoZWlnaHQ9Ii0xLjAiLz4KLSAgICAgICAgPC9jb250YWluZWQ+Ci0gICAgICAgIDxjb250YWluZWQgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6R3JhcGhOb2RlIiB4bWk6aWQ9Il9zQWR6UVVBNkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfc0FkelFVQTZFZHFGcUl1OC1ja29sZyI+Ci0gICAgICAgICAgPHBvc2l0aW9uIHhtaTppZD0iX3NBZHpRa0E2RWRxRnFJdTgtY2tvbGciIHg9Ii0xLjAiIHk9Ii0xLjAiLz4KLSAgICAgICAgICA8c2VtYW50aWNNb2RlbCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpVTUFTZW1hbnRpY01vZGVsQnJpZGdlIiB4bWk6aWQ9Il9zQWR6UTBBNkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfc0FkelEwQTZFZHFGcUl1OC1ja29sZyIgZWxlbWVudD0iXzU2N1lqMEE1RWRxRnFJdTgtY2tvbGciLz4KLSAgICAgICAgICA8c2l6ZSB4bWk6aWQ9Il9zQWR6UkVBNkVkcUZxSXU4LWNrb2xnIiB3aWR0aD0iLTEuMCIgaGVpZ2h0PSItMS4wIi8+Ci0gICAgICAgIDwvY29udGFpbmVkPgotICAgICAgICA8c2VtYW50aWNNb2RlbCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpVTUFTZW1hbnRpY01vZGVsQnJpZGdlIiB4bWk6aWQ9Il9zQWR6UlVBNkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfc0FkelJVQTZFZHFGcUl1OC1ja29sZyIgcHJlc2VudGF0aW9uPSJXb3JrIFByb2R1Y3QgRGVwZW5kZW5jeSIgZWxlbWVudD0iXzU2N1lRMEE1RWRxRnFJdTgtY2tvbGciLz4KLSAgICAgIDwvZGlhZ3JhbXM+Ci0gICAgICA8ZGlhZ3JhbXMgeG1pOmlkPSJfdTM1VE1FQTZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX3UzNVRNRUE2RWRxRnFJdTgtY2tvbGciPgotICAgICAgICA8Y29udGFpbmVkIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkdyYXBoTm9kZSIgeG1pOmlkPSJfdTM1VE1VQTZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX3UzNVRNVUE2RWRxRnFJdTgtY2tvbGciPgotICAgICAgICAgIDxwb3NpdGlvbiB4bWk6aWQ9Il91MzVUTWtBNkVkcUZxSXU4LWNrb2xnIiB4PSItMS4wIiB5PSItMS4wIi8+Ci0gICAgICAgICAgPHNlbWFudGljTW9kZWwgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VU1BU2VtYW50aWNNb2RlbEJyaWRnZSIgeG1pOmlkPSJfdTM1VE0wQTZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX3UzNVRNMEE2RWRxRnFJdTgtY2tvbGciIGVsZW1lbnQ9Il81NjdZU1VBNUVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgICAgICAgPHNpemUgeG1pOmlkPSJfdTM1VE5FQTZFZHFGcUl1OC1ja29sZyIgd2lkdGg9Ii0xLjAiIGhlaWdodD0iLTEuMCIvPgotICAgICAgICA8L2NvbnRhaW5lZD4KLSAgICAgICAgPGNvbnRhaW5lZCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpHcmFwaE5vZGUiIHhtaTppZD0iX3UzNVROVUE2RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il91MzVUTlVBNkVkcUZxSXU4LWNrb2xnIj4KLSAgICAgICAgICA8cG9zaXRpb24geG1pOmlkPSJfdTM1VE5rQTZFZHFGcUl1OC1ja29sZyIgeD0iLTEuMCIgeT0iLTEuMCIvPgotICAgICAgICAgIDxzZW1hbnRpY01vZGVsIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlVNQVNlbWFudGljTW9kZWxCcmlkZ2UiIHhtaTppZD0iX3UzNVROMEE2RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il91MzVUTjBBNkVkcUZxSXU4LWNrb2xnIiBlbGVtZW50PSJfNTY3WVNFQTVFZHFGcUl1OC1ja29sZyIvPgotICAgICAgICAgIDxzaXplIHhtaTppZD0iX3UzNVRPRUE2RWRxRnFJdTgtY2tvbGciIHdpZHRoPSItMS4wIiBoZWlnaHQ9Ii0xLjAiLz4KLSAgICAgICAgPC9jb250YWluZWQ+Ci0gICAgICAgIDxjb250YWluZWQgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6R3JhcGhOb2RlIiB4bWk6aWQ9Il91MzVUT1VBNkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfdTM1VE9VQTZFZHFGcUl1OC1ja29sZyI+Ci0gICAgICAgICAgPHBvc2l0aW9uIHhtaTppZD0iX3UzNVRPa0E2RWRxRnFJdTgtY2tvbGciIHg9Ii0xLjAiIHk9Ii0xLjAiLz4KLSAgICAgICAgICA8c2VtYW50aWNNb2RlbCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpVTUFTZW1hbnRpY01vZGVsQnJpZGdlIiB4bWk6aWQ9Il91MzVUTzBBNkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfdTM1VE8wQTZFZHFGcUl1OC1ja29sZyIgZWxlbWVudD0iXzU2N1ltVUE1RWRxRnFJdTgtY2tvbGciLz4KLSAgICAgICAgICA8c2l6ZSB4bWk6aWQ9Il91MzVUUEVBNkVkcUZxSXU4LWNrb2xnIiB3aWR0aD0iLTEuMCIgaGVpZ2h0PSItMS4wIi8+Ci0gICAgICAgIDwvY29udGFpbmVkPgotICAgICAgICA8Y29udGFpbmVkIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkdyYXBoTm9kZSIgeG1pOmlkPSJfdTM1VFBVQTZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX3UzNVRQVUE2RWRxRnFJdTgtY2tvbGciPgotICAgICAgICAgIDxwb3NpdGlvbiB4bWk6aWQ9Il91MzVUUGtBNkVkcUZxSXU4LWNrb2xnIiB4PSItMS4wIiB5PSItMS4wIi8+Ci0gICAgICAgICAgPHNlbWFudGljTW9kZWwgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VU1BU2VtYW50aWNNb2RlbEJyaWRnZSIgeG1pOmlkPSJfdTM1VFAwQTZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX3UzNVRQMEE2RWRxRnFJdTgtY2tvbGciIGVsZW1lbnQ9Il81NjdZb1VBNUVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgICAgICAgPHNpemUgeG1pOmlkPSJfdTM1VFFFQTZFZHFGcUl1OC1ja29sZyIgd2lkdGg9Ii0xLjAiIGhlaWdodD0iLTEuMCIvPgotICAgICAgICA8L2NvbnRhaW5lZD4KLSAgICAgICAgPGNvbnRhaW5lZCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpHcmFwaE5vZGUiIHhtaTppZD0iX3UzNVRRVUE2RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il91MzVUUVVBNkVkcUZxSXU4LWNrb2xnIj4KLSAgICAgICAgICA8cG9zaXRpb24geG1pOmlkPSJfdTM1VFFrQTZFZHFGcUl1OC1ja29sZyIgeD0iLTEuMCIgeT0iLTEuMCIvPgotICAgICAgICAgIDxzZW1hbnRpY01vZGVsIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlVNQVNlbWFudGljTW9kZWxCcmlkZ2UiIHhtaTppZD0iX3UzNVRRMEE2RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il91MzVUUTBBNkVkcUZxSXU4LWNrb2xnIiBlbGVtZW50PSJfNTY3WW5rQTVFZHFGcUl1OC1ja29sZyIvPgotICAgICAgICAgIDxzaXplIHhtaTppZD0iX3UzNVRSRUE2RWRxRnFJdTgtY2tvbGciIHdpZHRoPSItMS4wIiBoZWlnaHQ9Ii0xLjAiLz4KLSAgICAgICAgPC9jb250YWluZWQ+Ci0gICAgICAgIDxjb250YWluZWQgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6R3JhcGhOb2RlIiB4bWk6aWQ9Il91MzVUUlVBNkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfdTM1VFJVQTZFZHFGcUl1OC1ja29sZyI+Ci0gICAgICAgICAgPHBvc2l0aW9uIHhtaTppZD0iX3UzNVRSa0E2RWRxRnFJdTgtY2tvbGciIHg9Ii0xLjAiIHk9Ii0xLjAiLz4KLSAgICAgICAgICA8c2VtYW50aWNNb2RlbCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpVTUFTZW1hbnRpY01vZGVsQnJpZGdlIiB4bWk6aWQ9Il91MzVUUjBBNkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfdTM1VFIwQTZFZHFGcUl1OC1ja29sZyIgZWxlbWVudD0iXzU2N1ltRUE1RWRxRnFJdTgtY2tvbGciLz4KLSAgICAgICAgICA8c2l6ZSB4bWk6aWQ9Il91MzVUU0VBNkVkcUZxSXU4LWNrb2xnIiB3aWR0aD0iLTEuMCIgaGVpZ2h0PSItMS4wIi8+Ci0gICAgICAgIDwvY29udGFpbmVkPgotICAgICAgICA8Y29udGFpbmVkIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkdyYXBoTm9kZSIgeG1pOmlkPSJfdTM1VFNVQTZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX3UzNVRTVUE2RWRxRnFJdTgtY2tvbGciPgotICAgICAgICAgIDxwb3NpdGlvbiB4bWk6aWQ9Il91MzVUU2tBNkVkcUZxSXU4LWNrb2xnIiB4PSItMS4wIiB5PSItMS4wIi8+Ci0gICAgICAgICAgPHNlbWFudGljTW9kZWwgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VU1BU2VtYW50aWNNb2RlbEJyaWRnZSIgeG1pOmlkPSJfdTM1VFMwQTZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX3UzNVRTMEE2RWRxRnFJdTgtY2tvbGciIGVsZW1lbnQ9Il81NjdZbjBBNUVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgICAgICAgPHNpemUgeG1pOmlkPSJfdTM1VFRFQTZFZHFGcUl1OC1ja29sZyIgd2lkdGg9Ii0xLjAiIGhlaWdodD0iLTEuMCIvPgotICAgICAgICA8L2NvbnRhaW5lZD4KLSAgICAgICAgPGNvbnRhaW5lZCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpHcmFwaE5vZGUiIHhtaTppZD0iX3UzNVRUVUE2RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il91MzVUVFVBNkVkcUZxSXU4LWNrb2xnIj4KLSAgICAgICAgICA8cG9zaXRpb24geG1pOmlkPSJfdTM1VFRrQTZFZHFGcUl1OC1ja29sZyIgeD0iLTEuMCIgeT0iLTEuMCIvPgotICAgICAgICAgIDxzZW1hbnRpY01vZGVsIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlVNQVNlbWFudGljTW9kZWxCcmlkZ2UiIHhtaTppZD0iX3UzNVRUMEE2RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il91MzVUVDBBNkVkcUZxSXU4LWNrb2xnIiBlbGVtZW50PSJfNTY3WVIwQTVFZHFGcUl1OC1ja29sZyIvPgotICAgICAgICAgIDxzaXplIHhtaTppZD0iX3UzNVRVRUE2RWRxRnFJdTgtY2tvbGciIHdpZHRoPSItMS4wIiBoZWlnaHQ9Ii0xLjAiLz4KLSAgICAgICAgPC9jb250YWluZWQ+Ci0gICAgICAgIDxjb250YWluZWQgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6R3JhcGhOb2RlIiB4bWk6aWQ9Il91MzVUVVVBNkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfdTM1VFVVQTZFZHFGcUl1OC1ja29sZyI+Ci0gICAgICAgICAgPHBvc2l0aW9uIHhtaTppZD0iX3UzNVRVa0E2RWRxRnFJdTgtY2tvbGciIHg9IjIwLjAiIHk9Ijg4LjAiLz4KLSAgICAgICAgICA8c2VtYW50aWNNb2RlbCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpVTUFTZW1hbnRpY01vZGVsQnJpZGdlIiB4bWk6aWQ9Il91MzVUVTBBNkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfdTM1VFUwQTZFZHFGcUl1OC1ja29sZyIgZWxlbWVudD0iXzU2N1lrMEE1RWRxRnFJdTgtY2tvbGciLz4KLSAgICAgICAgICA8c2l6ZSB4bWk6aWQ9Il91MzVUVkVBNkVkcUZxSXU4LWNrb2xnIiB3aWR0aD0iMTk2LjAiIGhlaWdodD0iNTMuMCIvPgotICAgICAgICA8L2NvbnRhaW5lZD4KLSAgICAgICAgPGNvbnRhaW5lZCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpHcmFwaE5vZGUiIHhtaTppZD0iX3UzNVRWVUE2RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il91MzVUVlVBNkVkcUZxSXU4LWNrb2xnIj4KLSAgICAgICAgICA8cG9zaXRpb24geG1pOmlkPSJfdTM1VFZrQTZFZHFGcUl1OC1ja29sZyIgeD0iMjAuMCIgeT0iNDAwLjAiLz4KLSAgICAgICAgICA8c2VtYW50aWNNb2RlbCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpVTUFTZW1hbnRpY01vZGVsQnJpZGdlIiB4bWk6aWQ9Il91MzVUVjBBNkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfdTM1VFYwQTZFZHFGcUl1OC1ja29sZyIgZWxlbWVudD0iXzU2N1lsMEE1RWRxRnFJdTgtY2tvbGciLz4KLSAgICAgICAgICA8c2l6ZSB4bWk6aWQ9Il91MzVUV0VBNkVkcUZxSXU4LWNrb2xnIiB3aWR0aD0iMTk2LjAiIGhlaWdodD0iNTMuMCIvPgotICAgICAgICA8L2NvbnRhaW5lZD4KLSAgICAgICAgPGNvbnRhaW5lZCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpHcmFwaE5vZGUiIHhtaTppZD0iX3UzNVRXVUE2RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il91MzVUV1VBNkVkcUZxSXU4LWNrb2xnIj4KLSAgICAgICAgICA8cG9zaXRpb24geG1pOmlkPSJfdTM1VFdrQTZFZHFGcUl1OC1ja29sZyIgeD0iLTEuMCIgeT0iLTEuMCIvPgotICAgICAgICAgIDxzZW1hbnRpY01vZGVsIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlVNQVNlbWFudGljTW9kZWxCcmlkZ2UiIHhtaTppZD0iX3UzNVRXMEE2RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il91MzVUVzBBNkVkcUZxSXU4LWNrb2xnIiBlbGVtZW50PSJfNTY3WW5VQTVFZHFGcUl1OC1ja29sZyIvPgotICAgICAgICAgIDxzaXplIHhtaTppZD0iX3UzNVRYRUE2RWRxRnFJdTgtY2tvbGciIHdpZHRoPSItMS4wIiBoZWlnaHQ9Ii0xLjAiLz4KLSAgICAgICAgPC9jb250YWluZWQ+Ci0gICAgICAgIDxjb250YWluZWQgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6R3JhcGhOb2RlIiB4bWk6aWQ9Il91MzVUWFVBNkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfdTM1VFhVQTZFZHFGcUl1OC1ja29sZyI+Ci0gICAgICAgICAgPHBvc2l0aW9uIHhtaTppZD0iX3UzNVRYa0E2RWRxRnFJdTgtY2tvbGciIHg9Ii0xLjAiIHk9Ii0xLjAiLz4KLSAgICAgICAgICA8c2VtYW50aWNNb2RlbCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpVTUFTZW1hbnRpY01vZGVsQnJpZGdlIiB4bWk6aWQ9Il91MzVUWDBBNkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfdTM1VFgwQTZFZHFGcUl1OC1ja29sZyIgZWxlbWVudD0iXzU2N1lvRUE1RWRxRnFJdTgtY2tvbGciLz4KLSAgICAgICAgICA8c2l6ZSB4bWk6aWQ9Il91MzVUWUVBNkVkcUZxSXU4LWNrb2xnIiB3aWR0aD0iLTEuMCIgaGVpZ2h0PSItMS4wIi8+Ci0gICAgICAgIDwvY29udGFpbmVkPgotICAgICAgICA8Y29udGFpbmVkIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkdyYXBoTm9kZSIgeG1pOmlkPSJfdTM1VFlVQTZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX3UzNVRZVUE2RWRxRnFJdTgtY2tvbGciPgotICAgICAgICAgIDxwb3NpdGlvbiB4bWk6aWQ9Il91MzVUWWtBNkVkcUZxSXU4LWNrb2xnIiB4PSItMS4wIiB5PSItMS4wIi8+Ci0gICAgICAgICAgPHNlbWFudGljTW9kZWwgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VU1BU2VtYW50aWNNb2RlbEJyaWRnZSIgeG1pOmlkPSJfdTM1VFkwQTZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX3UzNVRZMEE2RWRxRnFJdTgtY2tvbGciIGVsZW1lbnQ9Il81NjdZbFVBNUVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgICAgICAgPHNpemUgeG1pOmlkPSJfdTM1VFpFQTZFZHFGcUl1OC1ja29sZyIgd2lkdGg9Ii0xLjAiIGhlaWdodD0iLTEuMCIvPgotICAgICAgICA8L2NvbnRhaW5lZD4KLSAgICAgICAgPGNvbnRhaW5lZCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpHcmFwaE5vZGUiIHhtaTppZD0iX3UzNVRaVUE2RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il91MzVUWlVBNkVkcUZxSXU4LWNrb2xnIj4KLSAgICAgICAgICA8cG9zaXRpb24geG1pOmlkPSJfdTM1VFprQTZFZHFGcUl1OC1ja29sZyIgeD0iLTEuMCIgeT0iLTEuMCIvPgotICAgICAgICAgIDxzZW1hbnRpY01vZGVsIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlVNQVNlbWFudGljTW9kZWxCcmlkZ2UiIHhtaTppZD0iX3UzNVRaMEE2RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il91MzVUWjBBNkVkcUZxSXU4LWNrb2xnIiBlbGVtZW50PSJfNTY3WVJFQTVFZHFGcUl1OC1ja29sZyIvPgotICAgICAgICAgIDxzaXplIHhtaTppZD0iX3UzNVRhRUE2RWRxRnFJdTgtY2tvbGciIHdpZHRoPSItMS4wIiBoZWlnaHQ9Ii0xLjAiLz4KLSAgICAgICAgPC9jb250YWluZWQ+Ci0gICAgICAgIDxjb250YWluZWQgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6R3JhcGhOb2RlIiB4bWk6aWQ9Il91MzVUYVVBNkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfdTM1VGFVQTZFZHFGcUl1OC1ja29sZyI+Ci0gICAgICAgICAgPHBvc2l0aW9uIHhtaTppZD0iX3UzNVRha0E2RWRxRnFJdTgtY2tvbGciIHg9Ii0xLjAiIHk9Ii0xLjAiLz4KLSAgICAgICAgICA8c2VtYW50aWNNb2RlbCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpVTUFTZW1hbnRpY01vZGVsQnJpZGdlIiB4bWk6aWQ9Il91MzVUYTBBNkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfdTM1VGEwQTZFZHFGcUl1OC1ja29sZyIgZWxlbWVudD0iXzU2N1lRa0E1RWRxRnFJdTgtY2tvbGciLz4KLSAgICAgICAgICA8c2l6ZSB4bWk6aWQ9Il91MzVUYkVBNkVkcUZxSXU4LWNrb2xnIiB3aWR0aD0iLTEuMCIgaGVpZ2h0PSItMS4wIi8+Ci0gICAgICAgIDwvY29udGFpbmVkPgotICAgICAgICA8Y29udGFpbmVkIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkdyYXBoTm9kZSIgeG1pOmlkPSJfdTM1VGJVQTZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX3UzNVRiVUE2RWRxRnFJdTgtY2tvbGciPgotICAgICAgICAgIDxwb3NpdGlvbiB4bWk6aWQ9Il91MzVUYmtBNkVkcUZxSXU4LWNrb2xnIiB4PSItMS4wIiB5PSItMS4wIi8+Ci0gICAgICAgICAgPHNlbWFudGljTW9kZWwgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VU1BU2VtYW50aWNNb2RlbEJyaWRnZSIgeG1pOmlkPSJfdTM1VGIwQTZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX3UzNVRiMEE2RWRxRnFJdTgtY2tvbGciIGVsZW1lbnQ9Il81NjdZbEVBNUVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgICAgICAgPHNpemUgeG1pOmlkPSJfdTM1VGNFQTZFZHFGcUl1OC1ja29sZyIgd2lkdGg9Ii0xLjAiIGhlaWdodD0iLTEuMCIvPgotICAgICAgICA8L2NvbnRhaW5lZD4KLSAgICAgICAgPGNvbnRhaW5lZCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpHcmFwaE5vZGUiIHhtaTppZD0iX3UzNVRjVUE2RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il91MzVUY1VBNkVkcUZxSXU4LWNrb2xnIj4KLSAgICAgICAgICA8cG9zaXRpb24geG1pOmlkPSJfdTM1VGNrQTZFZHFGcUl1OC1ja29sZyIgeD0iLTEuMCIgeT0iLTEuMCIvPgotICAgICAgICAgIDxzZW1hbnRpY01vZGVsIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlVNQVNlbWFudGljTW9kZWxCcmlkZ2UiIHhtaTppZD0iX3UzNVRjMEE2RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il91MzVUYzBBNkVkcUZxSXU4LWNrb2xnIiBlbGVtZW50PSJfNTY3WWxrQTVFZHFGcUl1OC1ja29sZyIvPgotICAgICAgICAgIDxzaXplIHhtaTppZD0iX3UzNVRkRUE2RWRxRnFJdTgtY2tvbGciIHdpZHRoPSItMS4wIiBoZWlnaHQ9Ii0xLjAiLz4KLSAgICAgICAgPC9jb250YWluZWQ+Ci0gICAgICAgIDxjb250YWluZWQgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6R3JhcGhOb2RlIiB4bWk6aWQ9Il91MzVUZFVBNkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfdTM1VGRVQTZFZHFGcUl1OC1ja29sZyI+Ci0gICAgICAgICAgPHBvc2l0aW9uIHhtaTppZD0iX3UzNVRka0E2RWRxRnFJdTgtY2tvbGciIHg9Ii0xLjAiIHk9Ii0xLjAiLz4KLSAgICAgICAgICA8c2VtYW50aWNNb2RlbCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpVTUFTZW1hbnRpY01vZGVsQnJpZGdlIiB4bWk6aWQ9Il91MzVUZDBBNkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfdTM1VGQwQTZFZHFGcUl1OC1ja29sZyIgZWxlbWVudD0iXzU2N1lSa0E1RWRxRnFJdTgtY2tvbGciLz4KLSAgICAgICAgICA8c2l6ZSB4bWk6aWQ9Il91MzVUZUVBNkVkcUZxSXU4LWNrb2xnIiB3aWR0aD0iLTEuMCIgaGVpZ2h0PSItMS4wIi8+Ci0gICAgICAgIDwvY29udGFpbmVkPgotICAgICAgICA8Y29udGFpbmVkIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkdyYXBoTm9kZSIgeG1pOmlkPSJfdTM1VGVVQTZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX3UzNVRlVUE2RWRxRnFJdTgtY2tvbGciPgotICAgICAgICAgIDxwb3NpdGlvbiB4bWk6aWQ9Il91MzVUZWtBNkVkcUZxSXU4LWNrb2xnIiB4PSItMS4wIiB5PSItMS4wIi8+Ci0gICAgICAgICAgPHNlbWFudGljTW9kZWwgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VU1BU2VtYW50aWNNb2RlbEJyaWRnZSIgeG1pOmlkPSJfdTM1VGUwQTZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX3UzNVRlMEE2RWRxRnFJdTgtY2tvbGciIGVsZW1lbnQ9Il81NjdZa0VBNUVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgICAgICAgPHNpemUgeG1pOmlkPSJfdTM1VGZFQTZFZHFGcUl1OC1ja29sZyIgd2lkdGg9Ii0xLjAiIGhlaWdodD0iLTEuMCIvPgotICAgICAgICA8L2NvbnRhaW5lZD4KLSAgICAgICAgPGNvbnRhaW5lZCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpHcmFwaE5vZGUiIHhtaTppZD0iX3UzNVRmVUE2RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il91MzVUZlVBNkVkcUZxSXU4LWNrb2xnIj4KLSAgICAgICAgICA8cG9zaXRpb24geG1pOmlkPSJfdTM1VGZrQTZFZHFGcUl1OC1ja29sZyIgeD0iLTEuMCIgeT0iLTEuMCIvPgotICAgICAgICAgIDxzZW1hbnRpY01vZGVsIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlVNQVNlbWFudGljTW9kZWxCcmlkZ2UiIHhtaTppZD0iX3UzNVRmMEE2RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il91MzVUZjBBNkVkcUZxSXU4LWNrb2xnIiBlbGVtZW50PSJfNTY3WW0wQTVFZHFGcUl1OC1ja29sZyIvPgotICAgICAgICAgIDxzaXplIHhtaTppZD0iX3UzNVRnRUE2RWRxRnFJdTgtY2tvbGciIHdpZHRoPSItMS4wIiBoZWlnaHQ9Ii0xLjAiLz4KLSAgICAgICAgPC9jb250YWluZWQ+Ci0gICAgICAgIDxjb250YWluZWQgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6R3JhcGhOb2RlIiB4bWk6aWQ9Il91MzVUZ1VBNkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfdTM1VGdVQTZFZHFGcUl1OC1ja29sZyI+Ci0gICAgICAgICAgPHBvc2l0aW9uIHhtaTppZD0iX3UzNVRna0E2RWRxRnFJdTgtY2tvbGciIHg9Ii0xLjAiIHk9Ii0xLjAiLz4KLSAgICAgICAgICA8c2VtYW50aWNNb2RlbCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpVTUFTZW1hbnRpY01vZGVsQnJpZGdlIiB4bWk6aWQ9Il91MzVUZzBBNkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfdTM1VGcwQTZFZHFGcUl1OC1ja29sZyIgZWxlbWVudD0iXzU2N1lqMEE1RWRxRnFJdTgtY2tvbGciLz4KLSAgICAgICAgICA8c2l6ZSB4bWk6aWQ9Il91MzVUaEVBNkVkcUZxSXU4LWNrb2xnIiB3aWR0aD0iLTEuMCIgaGVpZ2h0PSItMS4wIi8+Ci0gICAgICAgIDwvY29udGFpbmVkPgotICAgICAgICA8Y29udGFpbmVkIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkdyYXBoTm9kZSIgeG1pOmlkPSJfdTRWX0lFQTZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX3U0Vl9JRUE2RWRxRnFJdTgtY2tvbGciPgotICAgICAgICAgIDxwcm9wZXJ0eSB4bWk6aWQ9Il91NFZfSVVBNkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfdTRWX0lVQTZFZHFGcUl1OC1ja29sZyIga2V5PSJ3cENvbXBvc2l0ZVR5cGUiIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgPHBvc2l0aW9uIHhtaTppZD0iX3U0Vl9Ja0E2RWRxRnFJdTgtY2tvbGciIHg9IjEzMC4wIiB5PSIxLjAiLz4KLSAgICAgICAgICA8Y29udGFpbmVkIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkdyYXBoRWRnZSIgeG1pOmlkPSJfdTRmd0tVQTZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX3U0ZndLVUE2RWRxRnFJdTgtY2tvbGciIGFuY2hvcj0iX3U0ZndLRUE2RWRxRnFJdTgtY2tvbGciLz4KLSAgICAgICAgICA8YW5jaG9yYWdlIHhtaTppZD0iX3U0ZndLRUE2RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il91NGZ3S0VBNkVkcUZxSXU4LWNrb2xnIiBncmFwaEVkZ2U9Il91NGZ3S1VBNkVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgICAgICAgPHNlbWFudGljTW9kZWwgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VU1BU2VtYW50aWNNb2RlbEJyaWRnZSIgeG1pOmlkPSJfdTRWX0kwQTZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX3U0Vl9JMEE2RWRxRnFJdTgtY2tvbGciIGVsZW1lbnQ9Il81NjdZUjBBNUVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgICAgICAgPHNpemUgeG1pOmlkPSJfdTRWX0pFQTZFZHFGcUl1OC1ja29sZyIgd2lkdGg9IjczLjAiIGhlaWdodD0iNjcuMCIvPgotICAgICAgICA8L2NvbnRhaW5lZD4KLSAgICAgICAgPGNvbnRhaW5lZCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpHcmFwaE5vZGUiIHhtaTppZD0iX3U0Vl9KVUE2RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il91NFZfSlVBNkVkcUZxSXU4LWNrb2xnIj4KLSAgICAgICAgICA8cHJvcGVydHkgeG1pOmlkPSJfdTRWX0prQTZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX3U0Vl9Ka0E2RWRxRnFJdTgtY2tvbGciIGtleT0id3BDb21wb3NpdGVUeXBlIiB2YWx1ZT0iMiIvPgotICAgICAgICAgIDxwb3NpdGlvbiB4bWk6aWQ9Il91NFZfSjBBNkVkcUZxSXU4LWNrb2xnIiB4PSIxMzAuMCIgeT0iMTYxLjAiLz4KLSAgICAgICAgICA8c2VtYW50aWNNb2RlbCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpVTUFTZW1hbnRpY01vZGVsQnJpZGdlIiB4bWk6aWQ9Il91NFZfS0VBNkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfdTRWX0tFQTZFZHFGcUl1OC1ja29sZyIgZWxlbWVudD0iXzU2N1lSMEE1RWRxRnFJdTgtY2tvbGciLz4KLSAgICAgICAgICA8c2l6ZSB4bWk6aWQ9Il91NFZfS1VBNkVkcUZxSXU4LWNrb2xnIiB3aWR0aD0iNzMuMCIgaGVpZ2h0PSIxMTEuMCIvPgotICAgICAgICA8L2NvbnRhaW5lZD4KLSAgICAgICAgPGNvbnRhaW5lZCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpHcmFwaE5vZGUiIHhtaTppZD0iX3U0Vl9La0E2RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il91NFZfS2tBNkVkcUZxSXU4LWNrb2xnIj4KLSAgICAgICAgICA8cHJvcGVydHkgeG1pOmlkPSJfdTRWX0swQTZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX3U0Vl9LMEE2RWRxRnFJdTgtY2tvbGciIGtleT0id3BDb21wb3NpdGVUeXBlIiB2YWx1ZT0iMSIvPgotICAgICAgICAgIDxwb3NpdGlvbiB4bWk6aWQ9Il91NGZ3SUVBNkVkcUZxSXU4LWNrb2xnIiB4PSIxMzAuMCIgeT0iMzEzLjAiLz4KLSAgICAgICAgICA8Y29udGFpbmVkIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkdyYXBoRWRnZSIgeG1pOmlkPSJfdTRmd0swQTZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX3U0ZndLMEE2RWRxRnFJdTgtY2tvbGciIGFuY2hvcj0iX3U0ZndLa0E2RWRxRnFJdTgtY2tvbGciLz4KLSAgICAgICAgICA8YW5jaG9yYWdlIHhtaTppZD0iX3U0ZndLa0E2RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il91NGZ3S2tBNkVkcUZxSXU4LWNrb2xnIiBncmFwaEVkZ2U9Il91NGZ3SzBBNkVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgICAgICAgPHNlbWFudGljTW9kZWwgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VU1BU2VtYW50aWNNb2RlbEJyaWRnZSIgeG1pOmlkPSJfdTRmd0lVQTZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX3U0ZndJVUE2RWRxRnFJdTgtY2tvbGciIGVsZW1lbnQ9Il81NjdZUkVBNUVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgICAgICAgPHNpemUgeG1pOmlkPSJfdTRmd0lrQTZFZHFGcUl1OC1ja29sZyIgd2lkdGg9IjczLjAiIGhlaWdodD0iNjcuMCIvPgotICAgICAgICA8L2NvbnRhaW5lZD4KLSAgICAgICAgPGNvbnRhaW5lZCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpHcmFwaE5vZGUiIHhtaTppZD0iX3U0ZndJMEE2RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il91NGZ3STBBNkVkcUZxSXU4LWNrb2xnIj4KLSAgICAgICAgICA8cHJvcGVydHkgeG1pOmlkPSJfdTRmd0pFQTZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX3U0ZndKRUE2RWRxRnFJdTgtY2tvbGciIGtleT0id3BDb21wb3NpdGVUeXBlIiB2YWx1ZT0iMiIvPgotICAgICAgICAgIDxwb3NpdGlvbiB4bWk6aWQ9Il91NGZ3SlVBNkVkcUZxSXU4LWNrb2xnIiB4PSIxMzAuMCIgeT0iNDczLjAiLz4KLSAgICAgICAgICA8c2VtYW50aWNNb2RlbCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpVTUFTZW1hbnRpY01vZGVsQnJpZGdlIiB4bWk6aWQ9Il91NGZ3SmtBNkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfdTRmd0prQTZFZHFGcUl1OC1ja29sZyIgZWxlbWVudD0iXzU2N1lSRUE1RWRxRnFJdTgtY2tvbGciLz4KLSAgICAgICAgICA8c2l6ZSB4bWk6aWQ9Il91NGZ3SjBBNkVkcUZxSXU4LWNrb2xnIiB3aWR0aD0iNzMuMCIgaGVpZ2h0PSIxMTEuMCIvPgotICAgICAgICA8L2NvbnRhaW5lZD4KLSAgICAgICAgPHNlbWFudGljTW9kZWwgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VU1BU2VtYW50aWNNb2RlbEJyaWRnZSIgeG1pOmlkPSJfdTM1VGhVQTZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX3UzNVRoVUE2RWRxRnFJdTgtY2tvbGciIHByZXNlbnRhdGlvbj0iQWN0aXZpdHkgRGV0YWlsIiBlbGVtZW50PSJfNTY3WVEwQTVFZHFGcUl1OC1ja29sZyIvPgotICAgICAgPC9kaWFncmFtcz4KLSAgICA8L2NoaWxkUGFja2FnZXM+Ci0gICAgPGRpYWdyYW1zIHhtaTppZD0iXzU2eG5RVUE1RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il81NnhuUVVBNUVkcUZxSXU4LWNrb2xnIj4KLSAgICAgIDxzZW1hbnRpY01vZGVsIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlVNQVNlbWFudGljTW9kZWxCcmlkZ2UiIHhtaTppZD0iXzU2eG5Ra0E1RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il81NnhuUWtBNUVkcUZxSXU4LWNrb2xnIiBwcmVzZW50YXRpb249IkFjdGl2aXR5IERldGFpbCIgZWxlbWVudD0iXzU2N1lva0E1RWRxRnFJdTgtY2tvbGciLz4KLSAgICA8L2RpYWdyYW1zPgotICAgIDxwcm9jZXNzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNhcGFiaWxpdHlQYXR0ZXJuIiB4bWk6aWQ9Il81NjdZb2tBNUVkcUZxSXU4LWNrb2xnIiBuYW1lPSJDUCBCMSIgZ3VpZD0iXzU2N1lva0E1RWRxRnFJdTgtY2tvbGciIHByZXNlbnRhdGlvbk5hbWU9IkNQIEIxIiBicmVha2Rvd25FbGVtZW50cz0iXzU2N1lRMEE1RWRxRnFJdTgtY2tvbGciPgotICAgICAgPHByZXNlbnRhdGlvbiB4bWk6aWQ9Ii13eWJIS1VkbFhiREZHMEhPUGhBSjZRIiBocmVmPSJ1bWE6Ly8td3liSEtVZGxYYkRGRzBIT1BoQUo2USMtd3liSEtVZGxYYkRGRzBIT1BoQUo2USIvPgotICAgICAgPGRlZmF1bHRDb250ZXh0IGhyZWY9InVtYTovL19xend5d0EtUEVkcUwyTzFQSlY5Y1pBI19ycm1DSUJBZEVkcTdGcmNfeU1oUS1BIi8+Ci0gICAgICA8dmFsaWRDb250ZXh0IGhyZWY9InVtYTovL19xend5d0EtUEVkcUwyTzFQSlY5Y1pBI19ycm1DSUJBZEVkcTdGcmNfeU1oUS1BIi8+Ci0gICAgPC9wcm9jZXNzPgotICA8L29yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc0NvbXBvbmVudD4KLTwveG1pOlhNST4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi9jYXBhYmlsaXR5cGF0dGVybnMvY2FwUGF0X0IxLjEvY29udGVudC54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvY2FwYWJpbGl0eXBhdHRlcm5zL2NhcFBhdF9CMS4xL2NvbnRlbnQueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZDczMjk5Li4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi9jYXBhYmlsaXR5cGF0dGVybnMvY2FwUGF0X0IxLjEvY29udGVudC54bWkKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08b3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzRGVzY3JpcHRpb24geG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiIHhtaTppZD0iLW9FdU9kZVdKY3RHZlROWVV6ODJabmciIG5hbWU9ImNhcFBhdF9CMS4xLF9JUGRaNFI4MUVkcWdCSVR1SUNMSkV3IiBndWlkPSItb0V1T2RlV0pjdEdmVE5ZVXo4MlpuZyIvPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL2NhcGFiaWxpdHlwYXR0ZXJucy9jYXBQYXRfQjEuMS9tb2RlbC54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvY2FwYWJpbGl0eXBhdHRlcm5zL2NhcFBhdF9CMS4xL21vZGVsLnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjI2YTYzMi4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvY2FwYWJpbGl0eXBhdHRlcm5zL2NhcFBhdF9CMS4xL21vZGVsLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08eG1pOlhNSSB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWEucmVzb3VyY2VtYW5hZ2VyPSJodHRwOi8vL29yZy9lY2xpcHNlL2VwZi91bWEvcmVzb3VyY2VtYW5hZ2VyLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiPgotICA8b3JnLmVjbGlwc2UuZXBmLnVtYS5yZXNvdXJjZW1hbmFnZXI6UmVzb3VyY2VNYW5hZ2VyIHhtaTppZD0iX0lUQ1NVQjgxRWRxZ0JJVHVJQ0xKRXciIGd1aWQ9Il9JVENTVUI4MUVkcWdCSVR1SUNMSkV3Ij4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il9JVENTVVI4MUVkcWdCSVR1SUNMSkV3IiBpZD0iLW9FdU9kZVdKY3RHZlROWVV6ODJabmciIHVyaT0iY29udGVudC54bWkiLz4KLSAgPC9vcmcuZWNsaXBzZS5lcGYudW1hLnJlc291cmNlbWFuYWdlcjpSZXNvdXJjZU1hbmFnZXI+Ci0gIDxvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NDb21wb25lbnQgeG1pOmlkPSJfSVBkWjRCODFFZHFnQklUdUlDTEpFdyIgbmFtZT0iY2FwUGF0X0IxLjEiIGd1aWQ9Il9JUGRaNEI4MUVkcWdCSVR1SUNMSkV3Ij4KLSAgICA8cHJvY2VzcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDYXBhYmlsaXR5UGF0dGVybiIgeG1pOmlkPSJfSVBkWjRSODFFZHFnQklUdUlDTEpFdyIgbmFtZT0iY2FwUGF0X0IxLjEiIGd1aWQ9Il9JUGRaNFI4MUVkcWdCSVR1SUNMSkV3IiBwcmVzZW50YXRpb25OYW1lPSJjYXBQYXRfQjEuMSI+Ci0gICAgICA8cHJlc2VudGF0aW9uIHhtaTppZD0iLW9FdU9kZVdKY3RHZlROWVV6ODJabmciIGhyZWY9InVtYTovLy1vRXVPZGVXSmN0R2ZUTllVejgyWm5nIy1vRXVPZGVXSmN0R2ZUTllVejgyWm5nIi8+Ci0gICAgICA8ZGVmYXVsdENvbnRleHQgaHJlZj0idW1hOi8vX3F6d3l3QS1QRWRxTDJPMVBKVjljWkEjX3JybUNJQkFkRWRxN0ZyY195TWhRLUEiLz4KLSAgICAgIDx2YWxpZENvbnRleHQgaHJlZj0idW1hOi8vX3F6d3l3QS1QRWRxTDJPMVBKVjljWkEjX3JybUNJQkFkRWRxN0ZyY195TWhRLUEiLz4KLSAgICA8L3Byb2Nlc3M+Ci0gIDwvb3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzQ29tcG9uZW50PgotPC94bWk6WE1JPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL2NhcGFiaWxpdHlwYXR0ZXJucy9jYXBQYXRfQjEvY29udGVudC54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvY2FwYWJpbGl0eXBhdHRlcm5zL2NhcFBhdF9CMS9jb250ZW50LnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGU4Y2FjOC4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvY2FwYWJpbGl0eXBhdHRlcm5zL2NhcFBhdF9CMS9jb250ZW50LnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NEZXNjcmlwdGlvbiB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCIgeG1pOmlkPSItWDgzSzFvOWJzcGxOZTFfYV9LVTJGUSIgbmFtZT0iY2FwUGF0X0IxLF9FNkV5Y1I4MUVkcWdCSVR1SUNMSkV3IiBndWlkPSItWDgzSzFvOWJzcGxOZTFfYV9LVTJGUSIvPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL2NhcGFiaWxpdHlwYXR0ZXJucy9jYXBQYXRfQjEvbW9kZWwueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL2NhcGFiaWxpdHlwYXR0ZXJucy9jYXBQYXRfQjEvbW9kZWwueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYjkyODc1Li4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi9jYXBhYmlsaXR5cGF0dGVybnMvY2FwUGF0X0IxL21vZGVsLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08eG1pOlhNSSB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWEucmVzb3VyY2VtYW5hZ2VyPSJodHRwOi8vL29yZy9lY2xpcHNlL2VwZi91bWEvcmVzb3VyY2VtYW5hZ2VyLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiPgotICA8b3JnLmVjbGlwc2UuZXBmLnVtYS5yZXNvdXJjZW1hbmFnZXI6UmVzb3VyY2VNYW5hZ2VyIHhtaTppZD0iX0U4bWlBQjgxRWRxZ0JJVHVJQ0xKRXciIGd1aWQ9Il9FOG1pQUI4MUVkcWdCSVR1SUNMSkV3Ij4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il9FOHdUQUI4MUVkcWdCSVR1SUNMSkV3IiBpZD0iLVg4M0sxbzlic3BsTmUxX2FfS1UyRlEiIHVyaT0iY29udGVudC54bWkiLz4KLSAgPC9vcmcuZWNsaXBzZS5lcGYudW1hLnJlc291cmNlbWFuYWdlcjpSZXNvdXJjZU1hbmFnZXI+Ci0gIDxvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NDb21wb25lbnQgeG1pOmlkPSJfRTZFeWNCODFFZHFnQklUdUlDTEpFdyIgbmFtZT0iY2FwUGF0X0IxIiBndWlkPSJfRTZFeWNCODFFZHFnQklUdUlDTEpFdyI+Ci0gICAgPHByb2Nlc3MgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q2FwYWJpbGl0eVBhdHRlcm4iIHhtaTppZD0iX0U2RXljUjgxRWRxZ0JJVHVJQ0xKRXciIG5hbWU9ImNhcFBhdF9CMSIgZ3VpZD0iX0U2RXljUjgxRWRxZ0JJVHVJQ0xKRXciIHByZXNlbnRhdGlvbk5hbWU9ImNhcFBhdF9CMSI+Ci0gICAgICA8cHJlc2VudGF0aW9uIHhtaTppZD0iLVg4M0sxbzlic3BsTmUxX2FfS1UyRlEiIGhyZWY9InVtYTovLy1YODNLMW85YnNwbE5lMV9hX0tVMkZRIy1YODNLMW85YnNwbE5lMV9hX0tVMkZRIi8+Ci0gICAgICA8ZGVmYXVsdENvbnRleHQgaHJlZj0idW1hOi8vX3F6d3l3QS1QRWRxTDJPMVBKVjljWkEjX3JybUNJQkFkRWRxN0ZyY195TWhRLUEiLz4KLSAgICAgIDx2YWxpZENvbnRleHQgaHJlZj0idW1hOi8vX3F6d3l3QS1QRWRxTDJPMVBKVjljWkEjX3JybUNJQkFkRWRxN0ZyY195TWhRLUEiLz4KLSAgICA8L3Byb2Nlc3M+Ci0gIDwvb3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzQ29tcG9uZW50PgotPC94bWk6WE1JPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL2N1c3RvbWNhdGVnb3JpZXMvY3VzdG9tX2NhdGVnb3J5X0IxLjEueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL2N1c3RvbWNhdGVnb3JpZXMvY3VzdG9tX2NhdGVnb3J5X0IxLjEueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYmRlYTNhLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi9jdXN0b21jYXRlZ29yaWVzL2N1c3RvbV9jYXRlZ29yeV9CMS4xLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnREZXNjcmlwdGlvbiB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCIgeG1pOmlkPSItWXpjS2FUM0dZWlhSa1kzWk1yX21SZyIgbmFtZT0iY3VzdG9tX2NhdGVnb3J5X0IxLjEsX1hmVGRvQjgwRWRxZ0JJVHVJQ0xKRXciIGd1aWQ9Ii1ZemNLYVQzR1laWFJrWTNaTXJfbVJnIiBjaGFuZ2VEYXRlPSIyMDA1LTA5LTA2VDE3OjE0OjQ0LjA3OC0wNzAwIj4KLSAgPG1haW5EZXNjcmlwdGlvbj5DdXN0b20gQ2F0ZWdvcnkgQjEuMSBtYWluPC9tYWluRGVzY3JpcHRpb24+Ci0gIDxrZXlDb25zaWRlcmF0aW9ucz5DdXN0b20gQ2F0ZWdvcnkgQjEuMSBrZXk8L2tleUNvbnNpZGVyYXRpb25zPgotPC9vcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnREZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi9jdXN0b21jYXRlZ29yaWVzL2N1c3RvbV9jYXRlZ29yeV9CMS54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvY3VzdG9tY2F0ZWdvcmllcy9jdXN0b21fY2F0ZWdvcnlfQjEueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YWJkZTM1Li4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi9jdXN0b21jYXRlZ29yaWVzL2N1c3RvbV9jYXRlZ29yeV9CMS54bWkKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08b3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50RGVzY3JpcHRpb24geG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiIHhtaTppZD0iLVdQcWh4VXB4NHVHNld5cjVVamZvaWciIG5hbWU9ImN1c3RvbV9jYXRlZ29yeV9CMSxfM0VTWlFCOHlFZHFnQklUdUlDTEpFdyIgZ3VpZD0iLVdQcWh4VXB4NHVHNld5cjVVamZvaWciIGNoYW5nZURhdGU9IjIwMDUtMDktMDZUMTc6MDU6NDAuNjQxLTA3MDAiPgotICA8bWFpbkRlc2NyaXB0aW9uPkN1c3RvbSBDYXRlZ29yeSBCMSBtYWluPC9tYWluRGVzY3JpcHRpb24+Ci0gIDxrZXlDb25zaWRlcmF0aW9ucz5DdXN0b20gQ2F0ZWdvcnkgQjEga2V5PC9rZXlDb25zaWRlcmF0aW9ucz4KLTwvb3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvY3VzdG9tY2F0ZWdvcmllcy9jdXN0b21fY2F0ZWdvcnlfQjIueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL2N1c3RvbWNhdGVnb3JpZXMvY3VzdG9tX2NhdGVnb3J5X0IyLnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWIxZjJhNy4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvY3VzdG9tY2F0ZWdvcmllcy9jdXN0b21fY2F0ZWdvcnlfQjIueG1pCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPG9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudERlc2NyaXB0aW9uIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6ZXBmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZiIgZXBmOnZlcnNpb249IjEuMi4wIiB4bWk6aWQ9Ii04WGZQbXQ1NUhOQlZVeV9mV1N2TjVRIiBuYW1lPSJjdXN0b21fY2F0ZWdvcnlfQjIsXzNzRXlBQjh5RWRxZ0JJVHVJQ0xKRXciIGd1aWQ9Ii04WGZQbXQ1NUhOQlZVeV9mV1N2TjVRIiBjaGFuZ2VEYXRlPSIyMDA1LTA5LTA2VDE3OjA2OjEyLjgxMi0wNzAwIj4KLSAgPG1haW5EZXNjcmlwdGlvbj5DdXN0b20gQ2F0ZWdvcnkgQjIgbWFpbjwvbWFpbkRlc2NyaXB0aW9uPgotICA8a2V5Q29uc2lkZXJhdGlvbnM+Q3VzdG9tIENhdGVnb3J5IEIyIGtleTwva2V5Q29uc2lkZXJhdGlvbnM+Ci08L29yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL2RlbGl2ZXJ5cHJvY2Vzc2VzL2RlbFByb2NfQjEuMS9jb250ZW50LnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi9kZWxpdmVyeXByb2Nlc3Nlcy9kZWxQcm9jX0IxLjEvY29udGVudC54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2ODQzMzUuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL2RlbGl2ZXJ5cHJvY2Vzc2VzL2RlbFByb2NfQjEuMS9jb250ZW50LnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxvcmcuZWNsaXBzZS5lcGYudW1hOkRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6ZXBmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZiIgZXBmOnZlcnNpb249IjEuMi4wIiB4bWk6aWQ9Ii1WTEFYVmhxRVkydFU3MEVTWlp2N0ZnIiBuYW1lPSJkZWxQcm9jX0IxLjEsX1YwVjdNUjgxRWRxZ0JJVHVJQ0xKRXciIGd1aWQ9Ii1WTEFYVmhxRVkydFU3MEVTWlp2N0ZnIi8+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvZGVsaXZlcnlwcm9jZXNzZXMvZGVsUHJvY19CMS4xL21vZGVsLnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi9kZWxpdmVyeXByb2Nlc3Nlcy9kZWxQcm9jX0IxLjEvbW9kZWwueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZDY5MWEzLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi9kZWxpdmVyeXByb2Nlc3Nlcy9kZWxQcm9jX0IxLjEvbW9kZWwueG1pCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTx4bWk6WE1JIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYS5yZXNvdXJjZW1hbmFnZXI9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZXBmL3VtYS9yZXNvdXJjZW1hbmFnZXIuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCI+Ci0gIDxvcmcuZWNsaXBzZS5lcGYudW1hLnJlc291cmNlbWFuYWdlcjpSZXNvdXJjZU1hbmFnZXIgeG1pOmlkPSJfVjNMTXdCODFFZHFnQklUdUlDTEpFdyIgZ3VpZD0iX1YzTE13QjgxRWRxZ0JJVHVJQ0xKRXciPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iX1YzTE13UjgxRWRxZ0JJVHVJQ0xKRXciIGlkPSItVkxBWFZocUVZMnRVNzBFU1padjdGZyIgdXJpPSJjb250ZW50LnhtaSIvPgotICA8L29yZy5lY2xpcHNlLmVwZi51bWEucmVzb3VyY2VtYW5hZ2VyOlJlc291cmNlTWFuYWdlcj4KLSAgPG9yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc0NvbXBvbmVudCB4bWk6aWQ9Il9WMFY3TUI4MUVkcWdCSVR1SUNMSkV3IiBuYW1lPSJkZWxQcm9jX0IxLjEiIGd1aWQ9Il9WMFY3TUI4MUVkcWdCSVR1SUNMSkV3Ij4KLSAgICA8cHJvY2VzcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpEZWxpdmVyeVByb2Nlc3MiIHhtaTppZD0iX1YwVjdNUjgxRWRxZ0JJVHVJQ0xKRXciIG5hbWU9ImRlbFByb2NfQjEuMSIgZ3VpZD0iX1YwVjdNUjgxRWRxZ0JJVHVJQ0xKRXciIHByZXNlbnRhdGlvbk5hbWU9ImRlbFByb2NfQjEuMSI+Ci0gICAgICA8cHJlc2VudGF0aW9uIHhtaTppZD0iLVZMQVhWaHFFWTJ0VTcwRVNaWnY3RmciIGhyZWY9InVtYTovLy1WTEFYVmhxRVkydFU3MEVTWlp2N0ZnIy1WTEFYVmhxRVkydFU3MEVTWlp2N0ZnIi8+Ci0gICAgICA8ZGVmYXVsdENvbnRleHQgaHJlZj0idW1hOi8vX3F6d3l3QS1QRWRxTDJPMVBKVjljWkEjX3JybUNJQkFkRWRxN0ZyY195TWhRLUEiLz4KLSAgICAgIDx2YWxpZENvbnRleHQgaHJlZj0idW1hOi8vX3F6d3l3QS1QRWRxTDJPMVBKVjljWkEjX3JybUNJQkFkRWRxN0ZyY195TWhRLUEiLz4KLSAgICA8L3Byb2Nlc3M+Ci0gIDwvb3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzQ29tcG9uZW50PgotPC94bWk6WE1JPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL2RlbGl2ZXJ5cHJvY2Vzc2VzL2RlbFByb2NfQjEvY29udGVudC54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvZGVsaXZlcnlwcm9jZXNzZXMvZGVsUHJvY19CMS9jb250ZW50LnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODEyNjE2ZS4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvZGVsaXZlcnlwcm9jZXNzZXMvZGVsUHJvY19CMS9jb250ZW50LnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxvcmcuZWNsaXBzZS5lcGYudW1hOkRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6ZXBmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZiIgZXBmOnZlcnNpb249IjEuMi4wIiB4bWk6aWQ9Ii1jZFJDQ0NGMTFWaDdSSUllSl9rZjR3IiBuYW1lPSJkZWxQcm9jX0IxLF9SZnh1c1I4MUVkcWdCSVR1SUNMSkV3IiBndWlkPSItY2RSQ0NDRjExVmg3UklJZUpfa2Y0dyIvPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL2RlbGl2ZXJ5cHJvY2Vzc2VzL2RlbFByb2NfQjEvbW9kZWwueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL2RlbGl2ZXJ5cHJvY2Vzc2VzL2RlbFByb2NfQjEvbW9kZWwueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZTcwZGZjLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi9kZWxpdmVyeXByb2Nlc3Nlcy9kZWxQcm9jX0IxL21vZGVsLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08eG1pOlhNSSB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWEucmVzb3VyY2VtYW5hZ2VyPSJodHRwOi8vL29yZy9lY2xpcHNlL2VwZi91bWEvcmVzb3VyY2VtYW5hZ2VyLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiPgotICA8b3JnLmVjbGlwc2UuZXBmLnVtYS5yZXNvdXJjZW1hbmFnZXI6UmVzb3VyY2VNYW5hZ2VyIHhtaTppZD0iX1JpS1VVQjgxRWRxZ0JJVHVJQ0xKRXciIGd1aWQ9Il9SaUtVVUI4MUVkcWdCSVR1SUNMSkV3Ij4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il9SaUtVVVI4MUVkcWdCSVR1SUNMSkV3IiBpZD0iLWNkUkNDQ0YxMVZoN1JJSWVKX2tmNHciIHVyaT0iY29udGVudC54bWkiLz4KLSAgPC9vcmcuZWNsaXBzZS5lcGYudW1hLnJlc291cmNlbWFuYWdlcjpSZXNvdXJjZU1hbmFnZXI+Ci0gIDxvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NDb21wb25lbnQgeG1pOmlkPSJfUmZ4dXNCODFFZHFnQklUdUlDTEpFdyIgbmFtZT0iZGVsUHJvY19CMSIgZ3VpZD0iX1JmeHVzQjgxRWRxZ0JJVHVJQ0xKRXciPgotICAgIDxwcm9jZXNzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkRlbGl2ZXJ5UHJvY2VzcyIgeG1pOmlkPSJfUmZ4dXNSODFFZHFnQklUdUlDTEpFdyIgbmFtZT0iZGVsUHJvY19CMSIgZ3VpZD0iX1JmeHVzUjgxRWRxZ0JJVHVJQ0xKRXciIHByZXNlbnRhdGlvbk5hbWU9ImRlbFByb2NfQjEiPgotICAgICAgPHByZXNlbnRhdGlvbiB4bWk6aWQ9Ii1jZFJDQ0NGMTFWaDdSSUllSl9rZjR3IiBocmVmPSJ1bWE6Ly8tY2RSQ0NDRjExVmg3UklJZUpfa2Y0dyMtY2RSQ0NDRjExVmg3UklJZUpfa2Y0dyIvPgotICAgICAgPGRlZmF1bHRDb250ZXh0IGhyZWY9InVtYTovL19xend5d0EtUEVkcUwyTzFQSlY5Y1pBI19ycm1DSUJBZEVkcTdGcmNfeU1oUS1BIi8+Ci0gICAgICA8dmFsaWRDb250ZXh0IGhyZWY9InVtYTovL19xend5d0EtUEVkcUwyTzFQSlY5Y1pBI19ycm1DSUJBZEVkcTdGcmNfeU1oUS1BIi8+Ci0gICAgPC9wcm9jZXNzPgotICA8L29yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc0NvbXBvbmVudD4KLTwveG1pOlhNST4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi9kaXNjaXBsaW5lZ3JvdXBpbmdzL2Rpc2NpcGxpbmVfZ3JvdXBpbmdfQjEueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL2Rpc2NpcGxpbmVncm91cGluZ3MvZGlzY2lwbGluZV9ncm91cGluZ19CMS54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2N2MyYTcuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL2Rpc2NpcGxpbmVncm91cGluZ3MvZGlzY2lwbGluZV9ncm91cGluZ19CMS54bWkKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08b3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50RGVzY3JpcHRpb24geG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiIHhtaTppZD0iLTZydm0zdXZ6cUkweThoLTFQdlZmN0EiIG5hbWU9ImRpc2NpcGxpbmVfZ3JvdXBpbmdfQjEsX1NaTXhZQjh5RWRxZ0JJVHVJQ0xKRXciIGd1aWQ9Ii02cnZtM3V2enFJMHk4aC0xUHZWZjdBIiBjaGFuZ2VEYXRlPSIyMDA1LTA5LTA2VDE3OjAwOjE5LjMxMi0wNzAwIj4KLSAgPG1haW5EZXNjcmlwdGlvbj5EaXNjaXBsaW5lIEdyb3VwaW5nIEIxIG1haW48L21haW5EZXNjcmlwdGlvbj4KLSAgPGtleUNvbnNpZGVyYXRpb25zPkRpc2NpcGxpbmUgR3JvdXBpbmcgQjEga2V5PC9rZXlDb25zaWRlcmF0aW9ucz4KLTwvb3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvZGlzY2lwbGluZXMvZGlzY2lwbGluZV9CMS54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvZGlzY2lwbGluZXMvZGlzY2lwbGluZV9CMS54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExMjY2OTUuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL2Rpc2NpcGxpbmVzL2Rpc2NpcGxpbmVfQjEueG1pCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPG9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudERlc2NyaXB0aW9uIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6ZXBmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZiIgZXBmOnZlcnNpb249IjEuMi4wIiB4bWk6aWQ9Ii1GZWZKbWFCTVVuUEZMWmg5RlN1XzlnIiBuYW1lPSJkaXNjaXBsaW5lX0IxLF9jWTU3d0I4eUVkcWdCSVR1SUNMSkV3IiBndWlkPSItRmVmSm1hQk1VblBGTFpoOUZTdV85ZyIgY2hhbmdlRGF0ZT0iMjAwNS0wOS0wNlQxNzowMDo1Ny43MTktMDcwMCI+Ci0gIDxtYWluRGVzY3JpcHRpb24+RGlzY2lwbGluZSBCMSBtYWluPC9tYWluRGVzY3JpcHRpb24+Ci0gIDxrZXlDb25zaWRlcmF0aW9ucz5EaXNjaXBsaW5lIEIxIGtleTwva2V5Q29uc2lkZXJhdGlvbnM+Ci08L29yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL2Rpc2NpcGxpbmVzL2Rpc2NpcGxpbmVfQjIueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL2Rpc2NpcGxpbmVzL2Rpc2NpcGxpbmVfQjIueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzA0YzE5Li4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi9kaXNjaXBsaW5lcy9kaXNjaXBsaW5lX0IyLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnREZXNjcmlwdGlvbiB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCIgeG1pOmlkPSItaEU1TlZQek1CY2Z2WFZPNHVsbzFyQSIgbmFtZT0iZGlzY2lwbGluZV9CMixfaDlmbHNCOHlFZHFnQklUdUlDTEpFdyIgZ3VpZD0iLWhFNU5WUHpNQmNmdlhWTzR1bG8xckEiIGNoYW5nZURhdGU9IjIwMDUtMDktMDZUMTc6MDE6MzQuMjUwLTA3MDAiPgotICA8bWFpbkRlc2NyaXB0aW9uPiZsdDtwJmd0OwotICAgIERpc2NpcGxpbmUgQjIgbWFpbgotJmx0Oy9wJmd0OzwvbWFpbkRlc2NyaXB0aW9uPgotICA8a2V5Q29uc2lkZXJhdGlvbnM+RGlzY2lwbGluZSBCMiBrZXk8L2tleUNvbnNpZGVyYXRpb25zPgotPC9vcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnREZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi9kb21haW5zL2RvbWFpbl9CMS54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvZG9tYWlucy9kb21haW5fQjEueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YTk3NDhiLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi9kb21haW5zL2RvbWFpbl9CMS54bWkKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08b3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50RGVzY3JpcHRpb24geG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiIHhtaTppZD0iLWtGamt4b2dKNGpBT3otZ1dRUHNxTEEiIG5hbWU9ImRvbWFpbl9CMSxfbWRyellCOHlFZHFnQklUdUlDTEpFdyIgZ3VpZD0iLWtGamt4b2dKNGpBT3otZ1dRUHNxTEEiIGNoYW5nZURhdGU9IjIwMDUtMDktMDZUMTc6MDI6MDQuNzgxLTA3MDAiPgotICA8bWFpbkRlc2NyaXB0aW9uPkRvbWFpbiBCMSBtYWluPC9tYWluRGVzY3JpcHRpb24+Ci0gIDxrZXlDb25zaWRlcmF0aW9ucz5Eb21haW4gQjEga2V5PC9rZXlDb25zaWRlcmF0aW9ucz4KLTwvb3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvZG9tYWlucy9kb21haW5fQjIueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL2RvbWFpbnMvZG9tYWluX0IyLnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODRkYWYxZC4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvZG9tYWlucy9kb21haW5fQjIueG1pCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPG9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudERlc2NyaXB0aW9uIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6ZXBmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZiIgZXBmOnZlcnNpb249IjEuMi4wIiB4bWk6aWQ9Ii1VamFWbzNveWxMdG1PYlcxZTI1dHR3IiBuYW1lPSJkb21haW5fQjIsX3Jhb09nQjh5RWRxZ0JJVHVJQ0xKRXciIGd1aWQ9Ii1VamFWbzNveWxMdG1PYlcxZTI1dHR3IiBjaGFuZ2VEYXRlPSIyMDA1LTA5LTA2VDE3OjAyOjM3Ljc1MC0wNzAwIj4KLSAgPG1haW5EZXNjcmlwdGlvbj5Eb21haW4gQjIgbWFpbjwvbWFpbkRlc2NyaXB0aW9uPgotICA8a2V5Q29uc2lkZXJhdGlvbnM+RG9tYWluIEIyIGtleTwva2V5Q29uc2lkZXJhdGlvbnM+Ci08L29yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL2d1aWRhbmNlcy9jaGVja2xpc3RzL2NoZWNrbGlzdF9CMS54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvZ3VpZGFuY2VzL2NoZWNrbGlzdHMvY2hlY2tsaXN0X0IxLnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGIxMWU2NS4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvZ3VpZGFuY2VzL2NoZWNrbGlzdHMvY2hlY2tsaXN0X0IxLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnREZXNjcmlwdGlvbiB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCIgeG1pOmlkPSItR2FpLTB2Q25xQjBXZ0tjazFibW5wdyIgbmFtZT0iY2hlY2tsaXN0X0IxLF91ckxkY0I4ckVkcVF2T2pYOGRvQ0N3IiBndWlkPSItR2FpLTB2Q25xQjBXZ0tjazFibW5wdyIgY2hhbmdlRGF0ZT0iMjAwNS0wOS0wNlQxNjoyNzoyMi42NTYtMDcwMCI+Ci0gIDxtYWluRGVzY3JpcHRpb24+Q2hlY2tsaXN0IEIxIGNvbnRlbnQ8L21haW5EZXNjcmlwdGlvbj4KLTwvb3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvZ3VpZGFuY2VzL2NoZWNrbGlzdHMvY2hlY2tsaXN0X0IyLnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi9ndWlkYW5jZXMvY2hlY2tsaXN0cy9jaGVja2xpc3RfQjIueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OTEzYmQyLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi9ndWlkYW5jZXMvY2hlY2tsaXN0cy9jaGVja2xpc3RfQjIueG1pCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPG9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudERlc2NyaXB0aW9uIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6ZXBmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZiIgZXBmOnZlcnNpb249IjEuMi4wIiB4bWk6aWQ9Ii1XN3dESFZlSVFFRFA1OWU5RDQxS3V3IiBuYW1lPSJjaGVja2xpc3RfQjIsX3dFdXFVQjhyRWRxUXZPalg4ZG9DQ3ciIGd1aWQ9Ii1XN3dESFZlSVFFRFA1OWU5RDQxS3V3IiBjaGFuZ2VEYXRlPSIyMDA1LTA5LTA2VDE2OjI4OjA0LjI4MS0wNzAwIj4KLSAgPG1haW5EZXNjcmlwdGlvbj5DaGVja2xpc3QgQjIgY29udGVudDwvbWFpbkRlc2NyaXB0aW9uPgotPC9vcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnREZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi9ndWlkYW5jZXMvY29uY2VwdHMvY29uY2VwdF9CMS54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvZ3VpZGFuY2VzL2NvbmNlcHRzL2NvbmNlcHRfQjEueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMzcyZDVlLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi9ndWlkYW5jZXMvY29uY2VwdHMvY29uY2VwdF9CMS54bWkKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08b3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50RGVzY3JpcHRpb24geG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiIHhtaTppZD0iLW4tSFdaaUtmWHE5UlJSS2VGT0IwVUEiIG5hbWU9ImNvbmNlcHRfQjEsX3c2RTk4QjhyRWRxUXZPalg4ZG9DQ3ciIGd1aWQ9Ii1uLUhXWmlLZlhxOVJSUktlRk9CMFVBIiBjaGFuZ2VEYXRlPSIyMDA1LTA5LTA2VDE2OjE2OjAxLjczNC0wNzAwIj4KLSAgPG1haW5EZXNjcmlwdGlvbj5Db25jZXB0IEIxIGNvbnRleHQ8L21haW5EZXNjcmlwdGlvbj4KLTwvb3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvZ3VpZGFuY2VzL2NvbmNlcHRzL2NvbmNlcHRfQjIueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL2d1aWRhbmNlcy9jb25jZXB0cy9jb25jZXB0X0IyLnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDU1YmZmNS4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvZ3VpZGFuY2VzL2NvbmNlcHRzL2NvbmNlcHRfQjIueG1pCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPG9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudERlc2NyaXB0aW9uIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6ZXBmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZiIgZXBmOnZlcnNpb249IjEuMi4wIiB4bWk6aWQ9Ii02THBPZ2ljV1NodzJDZEJoVlpIcTB3IiBuYW1lPSJjb25jZXB0X0IyLF94bkZONEI4ckVkcVF2T2pYOGRvQ0N3IiBndWlkPSItNkxwT2dpY1dTaHcyQ2RCaFZaSHEwdyIgY2hhbmdlRGF0ZT0iMjAwNS0wOS0wNlQxNjoxNjoyNy44MTItMDcwMCI+Ci0gIDxtYWluRGVzY3JpcHRpb24+Q29uY2VwdCBCMiBjb250ZXh0PC9tYWluRGVzY3JpcHRpb24+Ci08L29yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL2d1aWRhbmNlcy9leGFtcGxlcy9leGFtcGxlX0IxLnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi9ndWlkYW5jZXMvZXhhbXBsZXMvZXhhbXBsZV9CMS54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwMDk4MDQuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL2d1aWRhbmNlcy9leGFtcGxlcy9leGFtcGxlX0IxLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxvcmcuZWNsaXBzZS5lcGYudW1hOkd1aWRhbmNlRGVzY3JpcHRpb24geG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiIHhtaTppZD0iLWJELTJpRUdSaGRMN3VoazlWZ1kxaVEiIG5hbWU9ImV4YW1wbGVfQjEsX3lRemdVQjhyRWRxUXZPalg4ZG9DQ3ciIGd1aWQ9Ii1iRC0yaUVHUmhkTDd1aGs5VmdZMWlRIiBjaGFuZ2VEYXRlPSIyMDA1LTA5LTA2VDE2OjI4OjM3LjU3OC0wNzAwIj4KLSAgPG1haW5EZXNjcmlwdGlvbj5FeGFtcGxlIEIxIGNvbnRlbnQ8L21haW5EZXNjcmlwdGlvbj4KLTwvb3JnLmVjbGlwc2UuZXBmLnVtYTpHdWlkYW5jZURlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL2d1aWRhbmNlcy9leGFtcGxlcy9leGFtcGxlX0IyLnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi9ndWlkYW5jZXMvZXhhbXBsZXMvZXhhbXBsZV9CMi54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1MTM0YmMuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL2d1aWRhbmNlcy9leGFtcGxlcy9leGFtcGxlX0IyLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxvcmcuZWNsaXBzZS5lcGYudW1hOkd1aWRhbmNlRGVzY3JpcHRpb24geG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiIHhtaTppZD0iLU9ka1FON2d5VXpkYi1sVjVLSFFzOUEiIG5hbWU9Im5ld19leGFtcGxlX0IyLF96QW9hd0I4ckVkcVF2T2pYOGRvQ0N3IiBndWlkPSItT2RrUU43Z3lVemRiLWxWNUtIUXM5QSIgY2hhbmdlRGF0ZT0iMjAwNS0wOS0wNlQxNjoyOToxOC4wOTQtMDcwMCI+Ci0gIDxtYWluRGVzY3JpcHRpb24+RXhhbXBsZSBCMiBjb250ZW50PC9tYWluRGVzY3JpcHRpb24+Ci08L29yZy5lY2xpcHNlLmVwZi51bWE6R3VpZGFuY2VEZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi9ndWlkYW5jZXMvZ3VpZGVsaW5lcy9ndWlkZWxpbmVfQjEueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL2d1aWRhbmNlcy9ndWlkZWxpbmVzL2d1aWRlbGluZV9CMS54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzNjAyNWEuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL2d1aWRhbmNlcy9ndWlkZWxpbmVzL2d1aWRlbGluZV9CMS54bWkKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08b3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50RGVzY3JpcHRpb24geG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiIHhtaTppZD0iLTBpM0RMQ29hSTR4aFdfczM0THA3SnciIG5hbWU9Imd1aWRlbGluZV9CMSxfemtaUElCOHJFZHFRdk9qWDhkb0NDdyIgZ3VpZD0iLTBpM0RMQ29hSTR4aFdfczM0THA3SnciIGNoYW5nZURhdGU9IjIwMDUtMDktMDZUMTY6Mzc6NTUuMTg4LTA3MDAiPgotICA8bWFpbkRlc2NyaXB0aW9uPkd1aWRlbGluZSBCMSBjb250ZW50PC9tYWluRGVzY3JpcHRpb24+Ci08L29yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL2d1aWRhbmNlcy9ndWlkZWxpbmVzL2d1aWRlbGluZV9CMi54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvZ3VpZGFuY2VzL2d1aWRlbGluZXMvZ3VpZGVsaW5lX0IyLnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmVhZWJmNy4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvZ3VpZGFuY2VzL2d1aWRlbGluZXMvZ3VpZGVsaW5lX0IyLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnREZXNjcmlwdGlvbiB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCIgeG1pOmlkPSItYXhLUkdMR3hidjNGRTJISG1FYnFkdyIgbmFtZT0iZ3VpZGVsaW5lX0IyLF8wUWd1UUI4ckVkcVF2T2pYOGRvQ0N3IiBndWlkPSItYXhLUkdMR3hidjNGRTJISG1FYnFkdyIgY2hhbmdlRGF0ZT0iMjAwNS0wOS0wNlQxNjo0Njo1NC40MzgtMDcwMCI+Ci0gIDxtYWluRGVzY3JpcHRpb24+R3VpZGVsaW5lIEIyIGNvbnRlbnQ8L21haW5EZXNjcmlwdGlvbj4KLTwvb3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvZ3VpZGFuY2VzL3ByYWN0aWNlcy9wcmFjdGljZV9CMS4xLnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi9ndWlkYW5jZXMvcHJhY3RpY2VzL3ByYWN0aWNlX0IxLjEueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMjJkZmY4Li4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi9ndWlkYW5jZXMvcHJhY3RpY2VzL3ByYWN0aWNlX0IxLjEueG1pCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxvcmcuZWNsaXBzZS5lcGYudW1hOlByYWN0aWNlRGVzY3JpcHRpb24geG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiIHhtaTppZD0iLWdWdkIwUHhSSzc1TXhvT2RtOTMwX3ciIG5hbWU9InByYWN0aWNlX0IxLjEsXzJ2TS1RQjhyRWRxUXZPalg4ZG9DQ3ciIGd1aWQ9Ii1nVnZCMFB4Uks3NU14b09kbTkzMF93IiBjaGFuZ2VEYXRlPSIyMDA1LTA5LTA2VDE2OjQzOjQ4LjE3Mi0wNzAwIj4KLSAgPG1haW5EZXNjcmlwdGlvbj5QcmFjdGljZSBCMS4xIGNvbnRlbnQ8L21haW5EZXNjcmlwdGlvbj4KLSAgPGFkZGl0aW9uYWxJbmZvPlByYWN0aWNlIEIxLjEgYWRkPC9hZGRpdGlvbmFsSW5mbz4KLSAgPHByb2JsZW0+UHJhY3RpY2UgQjEuMSBwcm9iPC9wcm9ibGVtPgotICA8YmFja2dyb3VuZD5QcmFjdGljZSBCMS4xIGJhY2s8L2JhY2tncm91bmQ+Ci0gIDxnb2Fscz5QcmFjdGljZSBCMS4xIGdvYWw8L2dvYWxzPgotICA8YXBwbGljYXRpb24+UHJhY3RpY2UgQjEuMSBhcHA8L2FwcGxpY2F0aW9uPgotICA8bGV2ZWxzT2ZBZG9wdGlvbj5QcmFjdGljZSBCMS4xIGxldmVsPC9sZXZlbHNPZkFkb3B0aW9uPgotPC9vcmcuZWNsaXBzZS5lcGYudW1hOlByYWN0aWNlRGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvZ3VpZGFuY2VzL3ByYWN0aWNlcy9wcmFjdGljZV9CMS54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvZ3VpZGFuY2VzL3ByYWN0aWNlcy9wcmFjdGljZV9CMS54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5ZDY2ZDAuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL2d1aWRhbmNlcy9wcmFjdGljZXMvcHJhY3RpY2VfQjEueG1pCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxvcmcuZWNsaXBzZS5lcGYudW1hOlByYWN0aWNlRGVzY3JpcHRpb24geG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiIHhtaTppZD0iLXlOc0t3d1A4QlpmczEyUGJaQTVBZVEiIG5hbWU9InByYWN0aWNlX0IxLF8xSS1uVUI4ckVkcVF2T2pYOGRvQ0N3IiBndWlkPSIteU5zS3d3UDhCWmZzMTJQYlpBNUFlUSIgY2hhbmdlRGF0ZT0iMjAwNS0wOS0wNlQxNjo0MjowMC4wNDctMDcwMCI+Ci0gIDxtYWluRGVzY3JpcHRpb24+UHJhY3RpY2UgQjEgY29udGVudDwvbWFpbkRlc2NyaXB0aW9uPgotICA8YWRkaXRpb25hbEluZm8+UHJhY3RpY2UgQjEgYWRkPC9hZGRpdGlvbmFsSW5mbz4KLSAgPHByb2JsZW0+UHJhY3RpY2UgQjEgcHJvYjwvcHJvYmxlbT4KLSAgPGJhY2tncm91bmQ+UHJhY3RpY2UgQjEgYmFjazwvYmFja2dyb3VuZD4KLSAgPGdvYWxzPlByYWN0aWNlIEIxIGdvYWw8L2dvYWxzPgotICA8YXBwbGljYXRpb24+UHJhY3RpY2UgQjEgYXBwPC9hcHBsaWNhdGlvbj4KLSAgPGxldmVsc09mQWRvcHRpb24+UHJhY3RpY2UgQjEgbGV2ZWw8L2xldmVsc09mQWRvcHRpb24+Ci08L29yZy5lY2xpcHNlLmVwZi51bWE6UHJhY3RpY2VEZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi9ndWlkYW5jZXMvcHJhY3RpY2VzL3ByYWN0aWNlX0IyLnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi9ndWlkYW5jZXMvcHJhY3RpY2VzL3ByYWN0aWNlX0IyLnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmYwYTAyMC4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvZ3VpZGFuY2VzL3ByYWN0aWNlcy9wcmFjdGljZV9CMi54bWkKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPG9yZy5lY2xpcHNlLmVwZi51bWE6UHJhY3RpY2VEZXNjcmlwdGlvbiB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCIgeG1pOmlkPSItRHhsTXR2S2l1Vkh1LWt0WjJVMlpUQSIgbmFtZT0icHJhY3RpY2VfQjIsXzRpMWZFQjhyRWRxUXZPalg4ZG9DQ3ciIGd1aWQ9Ii1EeGxNdHZLaXVWSHUta3RaMlUyWlRBIiBjaGFuZ2VEYXRlPSIyMDA1LTA5LTA2VDE2OjQwOjUwLjczNC0wNzAwIj4KLSAgPG1haW5EZXNjcmlwdGlvbj5QcmFjdGljZSBCMiBjb250ZW50PC9tYWluRGVzY3JpcHRpb24+Ci0gIDxhZGRpdGlvbmFsSW5mbz5QcmFjdGljZSBCMiBhZGQ8L2FkZGl0aW9uYWxJbmZvPgotICA8cHJvYmxlbT5QcmFjdGljZSBCMiBwcm9iPC9wcm9ibGVtPgotICA8YmFja2dyb3VuZD5QcmFjdGljZSBCMiBiYWNrPC9iYWNrZ3JvdW5kPgotICA8Z29hbHM+UHJhY3RpY2UgQjIgZ29hbDwvZ29hbHM+Ci0gIDxhcHBsaWNhdGlvbj5QcmFjdGljZSZhbXA7bmJzcDsgYXBwPC9hcHBsaWNhdGlvbj4KLSAgPGxldmVsc09mQWRvcHRpb24+UHJhY3RpY2UgQjIgbGV2ZWw8L2xldmVsc09mQWRvcHRpb24+Ci08L29yZy5lY2xpcHNlLmVwZi51bWE6UHJhY3RpY2VEZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi9ndWlkYW5jZXMvcmVwb3J0cy9yZXBvcnRfQjEueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL2d1aWRhbmNlcy9yZXBvcnRzL3JlcG9ydF9CMS54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhNmNhZDAuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL2d1aWRhbmNlcy9yZXBvcnRzL3JlcG9ydF9CMS54bWkKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08b3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50RGVzY3JpcHRpb24geG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiIHhtaTppZD0iLTZpTU9YS2poUFRNcXBhZzU0YlEzd3ciIG5hbWU9InJlcG9ydF9CMSxfNWtqYXdCOHJFZHFRdk9qWDhkb0NDdyIgZ3VpZD0iLTZpTU9YS2poUFRNcXBhZzU0YlEzd3ciIGNoYW5nZURhdGU9IjIwMDUtMDktMDZUMTY6Mzg6MzguMzkxLTA3MDAiPgotICA8bWFpbkRlc2NyaXB0aW9uPlJlcG9ydCBCMSBjb250ZW50PC9tYWluRGVzY3JpcHRpb24+Ci08L29yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL2d1aWRhbmNlcy9yZXBvcnRzL3JlcG9ydF9CMi54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvZ3VpZGFuY2VzL3JlcG9ydHMvcmVwb3J0X0IyLnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGQ4M2MzYS4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvZ3VpZGFuY2VzL3JlcG9ydHMvcmVwb3J0X0IyLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnREZXNjcmlwdGlvbiB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCIgeG1pOmlkPSItdTVEYThMeGZRUmhINkxoNWN2X2JaQSIgbmFtZT0icmVwb3J0X0IyLF82T3VaSUI4ckVkcVF2T2pYOGRvQ0N3IiBndWlkPSItdTVEYThMeGZRUmhINkxoNWN2X2JaQSIgY2hhbmdlRGF0ZT0iMjAwNS0wOS0wNlQxNjozOTowNy42NTYtMDcwMCI+Ci0gIDxtYWluRGVzY3JpcHRpb24+UmVwb3J0IEIyIGNvbnRleHQ8L21haW5EZXNjcmlwdGlvbj4KLTwvb3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvZ3VpZGFuY2VzL3JldXNhYmxlYXNzZXRzL3JldXNhYmxlX2Fzc2V0X0IxLnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi9ndWlkYW5jZXMvcmV1c2FibGVhc3NldHMvcmV1c2FibGVfYXNzZXRfQjEueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYjA0NTMyLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi9ndWlkYW5jZXMvcmV1c2FibGVhc3NldHMvcmV1c2FibGVfYXNzZXRfQjEueG1pCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPG9yZy5lY2xpcHNlLmVwZi51bWE6R3VpZGFuY2VEZXNjcmlwdGlvbiB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCIgeG1pOmlkPSItZV9wQkczZDkwOU5CME92bmZRb0o5QSIgbmFtZT0icmV1c2FibGVfYXNzZXRfQjEsXzY3azRFQjhyRWRxUXZPalg4ZG9DQ3ciIGd1aWQ9Ii1lX3BCRzNkOTA5TkIwT3ZuZlFvSjlBIiBjaGFuZ2VEYXRlPSIyMDA1LTA5LTA2VDE2OjQ2OjE5LjI1MC0wNzAwIj4KLSAgPG1haW5EZXNjcmlwdGlvbj5SZXVzYWJsZSBBc3NldCBCMSBjb250ZW50PC9tYWluRGVzY3JpcHRpb24+Ci08L29yZy5lY2xpcHNlLmVwZi51bWE6R3VpZGFuY2VEZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi9ndWlkYW5jZXMvcmV1c2FibGVhc3NldHMvcmV1c2FibGVfYXNzZXRfQjIueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL2d1aWRhbmNlcy9yZXVzYWJsZWFzc2V0cy9yZXVzYWJsZV9hc3NldF9CMi54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjNGQzMmIuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL2d1aWRhbmNlcy9yZXVzYWJsZWFzc2V0cy9yZXVzYWJsZV9hc3NldF9CMi54bWkKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08b3JnLmVjbGlwc2UuZXBmLnVtYTpHdWlkYW5jZURlc2NyaXB0aW9uIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6ZXBmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZiIgZXBmOnZlcnNpb249IjEuMi4wIiB4bWk6aWQ9Ii0wYTIzZy1hUWhjWnJUSDdwMnJ0eUFRIiBuYW1lPSJyZXVzYWJsZV9hc3NldF9CMixfN3hPR29COHJFZHFRdk9qWDhkb0NDdyIgZ3VpZD0iLTBhMjNnLWFRaGNaclRIN3AycnR5QVEiIGNoYW5nZURhdGU9IjIwMDUtMDktMDZUMTY6NDA6MDAuMDAwLTA3MDAiPgotICA8bWFpbkRlc2NyaXB0aW9uPlJldXNhYmxlIEFzc2V0IEIyIGNvbnRlbnQ8L21haW5EZXNjcmlwdGlvbj4KLTwvb3JnLmVjbGlwc2UuZXBmLnVtYTpHdWlkYW5jZURlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL2d1aWRhbmNlcy9yb2FkbWFwcy9yb2FkbWFwX0IxLnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi9ndWlkYW5jZXMvcm9hZG1hcHMvcm9hZG1hcF9CMS54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5NDBhMzYuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL2d1aWRhbmNlcy9yb2FkbWFwcy9yb2FkbWFwX0IxLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnREZXNjcmlwdGlvbiB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCIgeG1pOmlkPSItZWFKWnJXZUZWYzRQRU1BOUt2MTBEQSIgbmFtZT0icm9hZG1hcF9CMSxfOGhXakVCOHJFZHFRdk9qWDhkb0NDdyIgZ3VpZD0iLWVhSlpyV2VGVmM0UEVNQTlLdjEwREEiIGNoYW5nZURhdGU9IjIwMDUtMDktMDZUMTY6MzY6MDIuODEyLTA3MDAiPgotICA8bWFpbkRlc2NyaXB0aW9uPlJvYWRtYXAgQjEgY29udGVudDwvbWFpbkRlc2NyaXB0aW9uPgotPC9vcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnREZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi9ndWlkYW5jZXMvcm9hZG1hcHMvcm9hZG1hcF9CMi54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvZ3VpZGFuY2VzL3JvYWRtYXBzL3JvYWRtYXBfQjIueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMTNiY2QzLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi9ndWlkYW5jZXMvcm9hZG1hcHMvcm9hZG1hcF9CMi54bWkKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08b3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50RGVzY3JpcHRpb24geG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiIHhtaTppZD0iLTNuUTVKZ1BJRTFKbXpRbVRJWmhLdGciIG5hbWU9InJvYWRtYXBfQjIsXy1nd1BBQjhyRWRxUXZPalg4ZG9DQ3ciIGd1aWQ9Ii0zblE1SmdQSUUxSm16UW1USVpoS3RnIiBjaGFuZ2VEYXRlPSIyMDA1LTA5LTA2VDE2OjM1OjM1LjcxOS0wNzAwIj4KLSAgPG1haW5EZXNjcmlwdGlvbj5Sb2FkbWFwIEIyIGNvbnRlbnQ8L21haW5EZXNjcmlwdGlvbj4KLTwvb3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvZ3VpZGFuY2VzL3N1cHBvcnRpbmdtYXRlcmlhbHMvc3VwcG9ydGluZ19tYXRlcmlhbF9CMS54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvZ3VpZGFuY2VzL3N1cHBvcnRpbmdtYXRlcmlhbHMvc3VwcG9ydGluZ19tYXRlcmlhbF9CMS54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5NjEyZDAuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL2d1aWRhbmNlcy9zdXBwb3J0aW5nbWF0ZXJpYWxzL3N1cHBvcnRpbmdfbWF0ZXJpYWxfQjEueG1pCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPG9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudERlc2NyaXB0aW9uIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6ZXBmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZiIgZXBmOnZlcnNpb249IjEuMi4wIiB4bWk6aWQ9Ii1KRmlqeS1FOXZuWjVRSlpKVDFBQTJBIiBuYW1lPSJzdXBwb3J0aW5nX21hdGVyaWFsX0IxLF9fYktvMEI4ckVkcVF2T2pYOGRvQ0N3IiBndWlkPSItSkZpanktRTl2blo1UUpaSlQxQUEyQSIgY2hhbmdlRGF0ZT0iMjAwNS0wOS0wNlQxNjo0NTozMS4yMzQtMDcwMCI+Ci0gIDxtYWluRGVzY3JpcHRpb24+U3VwcG9ydGluZyBNYXRlcmlhbCBCMSBjb250ZW50PC9tYWluRGVzY3JpcHRpb24+Ci08L29yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL2d1aWRhbmNlcy9zdXBwb3J0aW5nbWF0ZXJpYWxzL3N1cHBvcnRpbmdfbWF0ZXJpYWxfQjIueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL2d1aWRhbmNlcy9zdXBwb3J0aW5nbWF0ZXJpYWxzL3N1cHBvcnRpbmdfbWF0ZXJpYWxfQjIueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMTlkZTMwLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi9ndWlkYW5jZXMvc3VwcG9ydGluZ21hdGVyaWFscy9zdXBwb3J0aW5nX21hdGVyaWFsX0IyLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnREZXNjcmlwdGlvbiB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCIgeG1pOmlkPSItaWxiTk9hcTYzNXZKR2ViNnVoQ1BUQSIgbmFtZT0ic3VwcG9ydGluZ19tYXRlcmlhbF9CMixfQk41eHdCOHNFZHFRdk9qWDhkb0NDdyIgZ3VpZD0iLWlsYk5PYXE2MzV2SkdlYjZ1aENQVEEiIGNoYW5nZURhdGU9IjIwMDUtMDktMDZUMTY6NDQ6NTIuMTcyLTA3MDAiPgotICA8bWFpbkRlc2NyaXB0aW9uPlN1cHBvcnRpbmcgTWF0ZXJpYWwgQjIgQ29udGVudDwvbWFpbkRlc2NyaXB0aW9uPgotPC9vcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnREZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi9ndWlkYW5jZXMvdGVtcGxhdGVzL3Jlc291cmNlcy9UZW1wbGF0ZSBmb3IgUGFzdGUgVGVzdCBDYXNlcy5kb2MgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvZ3VpZGFuY2VzL3RlbXBsYXRlcy9yZXNvdXJjZXMvVGVtcGxhdGUgZm9yIFBhc3RlIFRlc3QgQ2FzZXMuZG9jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNmE5MDcyLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi9ndWlkYW5jZXMvdGVtcGxhdGVzL3Jlc291cmNlcy9UZW1wbGF0ZSBmb3IgUGFzdGUgVGVzdCBDYXNlcy5kb2MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvZ3VpZGFuY2VzL3RlbXBsYXRlcy90ZW1wbGF0ZV9CMS54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvZ3VpZGFuY2VzL3RlbXBsYXRlcy90ZW1wbGF0ZV9CMS54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhNDcwYTIuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL2d1aWRhbmNlcy90ZW1wbGF0ZXMvdGVtcGxhdGVfQjEueG1pCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPG9yZy5lY2xpcHNlLmVwZi51bWE6R3VpZGFuY2VEZXNjcmlwdGlvbiB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCIgeG1pOmlkPSItZWE2ZHczQmpfTmZwblRmbDBoXzdIQSIgbmFtZT0idGVtcGxhdGVfQjEsX0M5MFFNQjhzRWRxUXZPalg4ZG9DQ3ciIGd1aWQ9Ii1lYTZkdzNCal9OZnBuVGZsMGhfN0hBIiBjaGFuZ2VEYXRlPSIyMDA1LTA5LTA2VDE2OjM2OjUxLjI4MS0wNzAwIj4KLSAgPG1haW5EZXNjcmlwdGlvbj5UZW1wbGF0ZSBCMSBjb250ZW50PC9tYWluRGVzY3JpcHRpb24+Ci08L29yZy5lY2xpcHNlLmVwZi51bWE6R3VpZGFuY2VEZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi9ndWlkYW5jZXMvdGVtcGxhdGVzL3RlbXBsYXRlX0IyLnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi9ndWlkYW5jZXMvdGVtcGxhdGVzL3RlbXBsYXRlX0IyLnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjI4ZTMxMS4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvZ3VpZGFuY2VzL3RlbXBsYXRlcy90ZW1wbGF0ZV9CMi54bWkKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08b3JnLmVjbGlwc2UuZXBmLnVtYTpHdWlkYW5jZURlc2NyaXB0aW9uIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6ZXBmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZiIgZXBmOnZlcnNpb249IjEuMi4wIiB4bWk6aWQ9Ii1UR2lqZmtLYWw0OGcwNnF0akhWSEpnIiBuYW1lPSJ0ZW1wbGF0ZV9CMixfRC14OThCOHNFZHFRdk9qWDhkb0NDdyIgZ3VpZD0iLVRHaWpma0thbDQ4ZzA2cXRqSFZISmciIGNoYW5nZURhdGU9IjIwMDUtMDktMDZUMTY6MjQ6NTQuNjQxLTA3MDAiPgotICA8bWFpbkRlc2NyaXB0aW9uPlRlbXBsYXRlIEIyIGNvbnRlbnQ8L21haW5EZXNjcmlwdGlvbj4KLSAgPGF0dGFjaG1lbnRzPnJlc291cmNlcy9UZW1wbGF0ZSBmb3IgUGFzdGUgVGVzdCBDYXNlcy5kb2M8L2F0dGFjaG1lbnRzPgotPC9vcmcuZWNsaXBzZS5lcGYudW1hOkd1aWRhbmNlRGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvZ3VpZGFuY2VzL3Rlcm1kZWZpbml0aW9ucy90ZXJtX2RlZmluaXRpb25fQjEueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL2d1aWRhbmNlcy90ZXJtZGVmaW5pdGlvbnMvdGVybV9kZWZpbml0aW9uX0IxLnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjc3N2ZmNy4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvZ3VpZGFuY2VzL3Rlcm1kZWZpbml0aW9ucy90ZXJtX2RlZmluaXRpb25fQjEueG1pCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPG9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudERlc2NyaXB0aW9uIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6ZXBmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZiIgZXBmOnZlcnNpb249IjEuMi4wIiB4bWk6aWQ9Ii1kLTVRUmo3cUptem42MkNFLV9FNlVBIiBuYW1lPSJ0ZXJtX2RlZmluaXRpb25fQjEsX0Vwc2pNQjhzRWRxUXZPalg4ZG9DQ3ciIGd1aWQ9Ii1kLTVRUmo3cUptem42MkNFLV9FNlVBIiBjaGFuZ2VEYXRlPSIyMDA1LTA5LTA2VDE2OjIzOjU1LjQ4NC0wNzAwIj4KLSAgPG1haW5EZXNjcmlwdGlvbj5UZXJtIERlZmluaXRpb24gQjEgY29udGVudDwvbWFpbkRlc2NyaXB0aW9uPgotPC9vcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnREZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi9ndWlkYW5jZXMvdGVybWRlZmluaXRpb25zL3Rlcm1fZGVmaW5pdGlvbl9CMi54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvZ3VpZGFuY2VzL3Rlcm1kZWZpbml0aW9ucy90ZXJtX2RlZmluaXRpb25fQjIueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYjJlNmEyLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi9ndWlkYW5jZXMvdGVybWRlZmluaXRpb25zL3Rlcm1fZGVmaW5pdGlvbl9CMi54bWkKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08b3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50RGVzY3JpcHRpb24geG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiIHhtaTppZD0iLXBTU3h0TU5QNWlzeG9tMUdlOVRCM2ciIG5hbWU9InRlcm1fZGVmaW5pdGlvbl9CMixfR0VTNDhCOHNFZHFRdk9qWDhkb0NDdyIgZ3VpZD0iLXBTU3h0TU5QNWlzeG9tMUdlOVRCM2ciIGNoYW5nZURhdGU9IjIwMDUtMDktMDZUMTY6MjM6MTAuMzU5LTA3MDAiPgotICA8bWFpbkRlc2NyaXB0aW9uPiZsdDtwJmd0OwotICAgIFRlcm0gRGVmaW5pdGlvbiBCMiBjb250ZW50Ci0mbHQ7L3AmZ3Q7PC9tYWluRGVzY3JpcHRpb24+Ci08L29yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL2d1aWRhbmNlcy90b29sbWVudG9ycy90b29sbWVudG9yX0IxLnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi9ndWlkYW5jZXMvdG9vbG1lbnRvcnMvdG9vbG1lbnRvcl9CMS54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzNmRlZjMuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL2d1aWRhbmNlcy90b29sbWVudG9ycy90b29sbWVudG9yX0IxLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnREZXNjcmlwdGlvbiB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCIgeG1pOmlkPSIteWkwbzlna1VVTjA2ek5jQ2Y5dFdKQSIgbmFtZT0idG9vbG1lbnRvcl9CMSxfR29EdFVCOHNFZHFRdk9qWDhkb0NDdyIgZ3VpZD0iLXlpMG85Z2tVVU4wNnpOY0NmOXRXSkEiIGNoYW5nZURhdGU9IjIwMDUtMDktMDZUMTY6MjA6MzQuNTMxLTA3MDAiPgotICA8bWFpbkRlc2NyaXB0aW9uPlRvb2xtZW50b3IgQjEgY29udGV4dDwvbWFpbkRlc2NyaXB0aW9uPgotPC9vcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnREZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi9ndWlkYW5jZXMvdG9vbG1lbnRvcnMvdG9vbG1lbnRvcl9CMi54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvZ3VpZGFuY2VzL3Rvb2xtZW50b3JzL3Rvb2xtZW50b3JfQjIueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NDZhZDZiLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi9ndWlkYW5jZXMvdG9vbG1lbnRvcnMvdG9vbG1lbnRvcl9CMi54bWkKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08b3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50RGVzY3JpcHRpb24geG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiIHhtaTppZD0iLUJ2bkFmR1hEaWJjSk00ZF83cVdYUVEiIG5hbWU9InRvb2xtZW50b3JfQjIsX0g0T1VzQjhzRWRxUXZPalg4ZG9DQ3ciIGd1aWQ9Ii1Cdm5BZkdYRGliY0pNNGRfN3FXWFFRIiBjaGFuZ2VEYXRlPSIyMDA1LTA5LTA2VDE2OjE5OjQ0LjIwMy0wNzAwIj4KLSAgPG1haW5EZXNjcmlwdGlvbj5Ub29sbWVudG9yIEIyIGNvbnRleHQ8L21haW5EZXNjcmlwdGlvbj4KLTwvb3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvZ3VpZGFuY2VzL3doaXRlcGFwZXJzL3doaXRlcGFwZXJfQjEueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL2d1aWRhbmNlcy93aGl0ZXBhcGVycy93aGl0ZXBhcGVyX0IxLnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTAwZjkzNC4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvZ3VpZGFuY2VzL3doaXRlcGFwZXJzL3doaXRlcGFwZXJfQjEueG1pCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPG9yZy5lY2xpcHNlLmVwZi51bWE6R3VpZGFuY2VEZXNjcmlwdGlvbiB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCIgeG1pOmlkPSItNkNkbTRTOEJBNFVfVmE1TlVvWFlzdyIgbmFtZT0id2hpdGVwYXBlcl9CMSxfSXZEMkVCOHNFZHFRdk9qWDhkb0NDdyIgZ3VpZD0iLTZDZG00UzhCQTRVX1ZhNU5Vb1hZc3ciIGNoYW5nZURhdGU9IjIwMDUtMDktMDZUMTY6MTk6MDcuMjgxLTA3MDAiPgotICA8bWFpbkRlc2NyaXB0aW9uPldoaXRlcGFwZXIgQjEgY29udGV4dDwvbWFpbkRlc2NyaXB0aW9uPgotPC9vcmcuZWNsaXBzZS5lcGYudW1hOkd1aWRhbmNlRGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvZ3VpZGFuY2VzL3doaXRlcGFwZXJzL3doaXRlcGFwZXJfQjIueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL2d1aWRhbmNlcy93aGl0ZXBhcGVycy93aGl0ZXBhcGVyX0IyLnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDY2MTYxNi4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvZ3VpZGFuY2VzL3doaXRlcGFwZXJzL3doaXRlcGFwZXJfQjIueG1pCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPG9yZy5lY2xpcHNlLmVwZi51bWE6R3VpZGFuY2VEZXNjcmlwdGlvbiB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCIgeG1pOmlkPSItakk3Tm53R0ZEUy16SlctamtxSmRNQSIgbmFtZT0id2hpdGVwYXBlcl9CMixfSmR0RXdCOHNFZHFRdk9qWDhkb0NDdyIgZ3VpZD0iLWpJN05ud0dGRFMtekpXLWprcUpkTUEiIGNoYW5nZURhdGU9IjIwMDUtMDktMDZUMTY6MTg6MzYuODkxLTA3MDAiPgotICA8bWFpbkRlc2NyaXB0aW9uPldoaXRlcGFwZXIgQjIgY29udGV4dDwvbWFpbkRlc2NyaXB0aW9uPgotPC9vcmcuZWNsaXBzZS5lcGYudW1hOkd1aWRhbmNlRGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvcGx1Z2luLnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi9wbHVnaW4ueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MmIzM2Q5Li4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi9wbHVnaW4ueG1pCisrKyAvZGV2L251bGwKQEAgLTEsMjgwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08eG1pOlhNSSB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWEucmVzb3VyY2VtYW5hZ2VyPSJodHRwOi8vL29yZy9lY2xpcHNlL2VwZi91bWEvcmVzb3VyY2VtYW5hZ2VyLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiPgotICA8b3JnLmVjbGlwc2UuZXBmLnVtYS5yZXNvdXJjZW1hbmFnZXI6UmVzb3VyY2VNYW5hZ2VyIHhtaTppZD0iX0pSNnhzQjhQRWRxc2hNTlNJMDdYT2ciIGd1aWQ9Il9KUjZ4c0I4UEVkcXNoTU5TSTA3WE9nIj4KLSAgICA8c3ViTWFuYWdlcnMgeG1pOmlkPSJfRThtaUFCODFFZHFnQklUdUlDTEpFdyIgaHJlZj0idW1hOi8vX0U2RXljQjgxRWRxZ0JJVHVJQ0xKRXcjX0U4bWlBQjgxRWRxZ0JJVHVJQ0xKRXciLz4KLSAgICA8c3ViTWFuYWdlcnMgeG1pOmlkPSJfSVRDU1VCODFFZHFnQklUdUlDTEpFdyIgaHJlZj0idW1hOi8vX0lQZFo0QjgxRWRxZ0JJVHVJQ0xKRXcjX0lUQ1NVQjgxRWRxZ0JJVHVJQ0xKRXciLz4KLSAgICA8c3ViTWFuYWdlcnMgeG1pOmlkPSJfUmlLVVVCODFFZHFnQklUdUlDTEpFdyIgaHJlZj0idW1hOi8vX1JmeHVzQjgxRWRxZ0JJVHVJQ0xKRXcjX1JpS1VVQjgxRWRxZ0JJVHVJQ0xKRXciLz4KLSAgICA8c3ViTWFuYWdlcnMgeG1pOmlkPSJfVjNMTXdCODFFZHFnQklUdUlDTEpFdyIgaHJlZj0idW1hOi8vX1YwVjdNQjgxRWRxZ0JJVHVJQ0xKRXcjX1YzTE13QjgxRWRxZ0JJVHVJQ0xKRXciLz4KLSAgICA8c3ViTWFuYWdlcnMgeG1pOmlkPSJfNTl3Q3dFQTVFZHFGcUl1OC1ja29sZyIgaHJlZj0idW1hOi8vXzU2eG5RRUE1RWRxRnFJdTgtY2tvbGcjXzU5d0N3RUE1RWRxRnFJdTgtY2tvbGciLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il9KUjZ4c1I4UEVkcXNoTU5TSTA3WE9nIiBpZD0iLUZjMnVZWEFfNDdzN3RSVEJtbUtRdlEiIHVyaT0icm9sZXMvcm9sZV9CMS54bWkiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il9SWGNIVUI4UEVkcXNoTU5TSTA3WE9nIiBpZD0iLUZpZGVEMDFwVURVWE1YRXNWcnMzR1EiIHVyaT0icm9sZXMvcm9sZV9CMi54bWkiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il9YV0dlSUI4UEVkcXNoTU5TSTA3WE9nIiBpZD0iLWxZanI2Vml0TDFWbm5GTk83OFh1WXciIHVyaT0idGFza3MvdGFza19CMS54bWkiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il9aTWtRZ0I4UEVkcXNoTU5TSTA3WE9nIiBpZD0iLUozejBJR2ZqZWhpdDB1RmJUSmNhN2ciIHVyaT0idGFza3MvdGFza19CMi54bWkiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il9fTFhFZ1I4bUVkcTFPby1Eb3dkcEJnIiBpZD0iLS11Z2l2ejExTDZMYmpPdnY1M3JfVGciIHVyaT0id29ya3Byb2R1Y3RzL2FydGlmYWN0X0IxLnhtaSIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iX0tIdUVZQjhuRWRxMU9vLURvd2RwQmciIGlkPSItTWplZWVkX3BfTVF5Z3JXN0RCa0FyZyIgdXJpPSJ3b3JrcHJvZHVjdHMvYXJ0aWZhY3RfQjIueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfYUlVYU1COG5FZHExT28tRG93ZHBCZyIgaWQ9Ii1ndWZ4NFJhRndoaVVoaEJrb3EzdlpnIiB1cmk9Indvcmtwcm9kdWN0cy9kZWxpdmVyYWJsZV9CMS54bWkiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il9iV1o5OEI4bkVkcTFPby1Eb3dkcEJnIiBpZD0iLUhOWExIMUhnZG43MldYRzc3QUhHWkEiIHVyaT0id29ya3Byb2R1Y3RzL291dGNvbWVfQjIueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfbnNVS3NCOG5FZHExT28tRG93ZHBCZyIgaWQ9Ii15YlRQdVZPNFJHd25fd1FsdkFXYWF3IiB1cmk9Indvcmtwcm9kdWN0cy9vdXRjb21lX0IxLnhtaSIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iX1ZrNDEwQjhvRWRxMU9vLURvd2RwQmciIGlkPSItS3hOc0Z3ZzljTjQtMXM1YnMzeFpJZyIgdXJpPSJ3b3JrcHJvZHVjdHMvZGVsaXZlcmFibGVfQjIueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfd0Z4ek1COHJFZHFRdk9qWDhkb0NDdyIgaWQ9Ii1HYWktMHZDbnFCMFdnS2NrMWJtbnB3IiB1cmk9Imd1aWRhbmNlcy9jaGVja2xpc3RzL2NoZWNrbGlzdF9CMS54bWkiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il93N0hmd0I4ckVkcVF2T2pYOGRvQ0N3IiBpZD0iLVc3d0RIVmVJUUVEUDU5ZTlENDFLdXciIHVyaT0iZ3VpZGFuY2VzL2NoZWNrbGlzdHMvY2hlY2tsaXN0X0IyLnhtaSIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iX3hvSHZzQjhyRWRxUXZPalg4ZG9DQ3ciIGlkPSItbi1IV1ppS2ZYcTlSUlJLZUZPQjBVQSIgdXJpPSJndWlkYW5jZXMvY29uY2VwdHMvY29uY2VwdF9CMS54bWkiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il95UlpXTUI4ckVkcVF2T2pYOGRvQ0N3IiBpZD0iLTZMcE9naWNXU2h3MkNkQmhWWkhxMHciIHVyaT0iZ3VpZGFuY2VzL2NvbmNlcHRzL2NvbmNlcHRfQjIueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfekJZb3NCOHJFZHFRdk9qWDhkb0NDdyIgaWQ9Ii1iRC0yaUVHUmhkTDd1aGs5VmdZMWlRIiB1cmk9Imd1aWRhbmNlcy9leGFtcGxlcy9leGFtcGxlX0IxLnhtaSIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iX3psY1lBQjhyRWRxUXZPalg4ZG9DQ3ciIGlkPSItT2RrUU43Z3lVemRiLWxWNUtIUXM5QSIgdXJpPSJndWlkYW5jZXMvZXhhbXBsZXMvZXhhbXBsZV9CMi54bWkiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il8wUkdrSUI4ckVkcVF2T2pYOGRvQ0N3IiBpZD0iLTBpM0RMQ29hSTR4aFdfczM0THA3SnciIHVyaT0iZ3VpZGFuY2VzL2d1aWRlbGluZXMvZ3VpZGVsaW5lX0IxLnhtaSIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iXzFKbEVRQjhyRWRxUXZPalg4ZG9DQ3ciIGlkPSItYXhLUkdMR3hidjNGRTJISG1FYnFkdyIgdXJpPSJndWlkYW5jZXMvZ3VpZGVsaW5lcy9ndWlkZWxpbmVfQjIueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfNGs3SndCOHJFZHFRdk9qWDhkb0NDdyIgaWQ9Ii15TnNLd3dQOEJaZnMxMlBiWkE1QWVRIiB1cmk9Imd1aWRhbmNlcy9wcmFjdGljZXMvcHJhY3RpY2VfQjEueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfNGxFNndCOHJFZHFRdk9qWDhkb0NDdyIgaWQ9Ii1nVnZCMFB4Uks3NU14b09kbTkzMF93IiB1cmk9Imd1aWRhbmNlcy9wcmFjdGljZXMvcHJhY3RpY2VfQjEuMS54bWkiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il81bGN5b0I4ckVkcVF2T2pYOGRvQ0N3IiBpZD0iLUR4bE10dktpdVZIdS1rdFoyVTJaVEEiIHVyaT0iZ3VpZGFuY2VzL3ByYWN0aWNlcy9wcmFjdGljZV9CMi54bWkiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il82UG5KOEI4ckVkcVF2T2pYOGRvQ0N3IiBpZD0iLTZpTU9YS2poUFRNcXBhZzU0YlEzd3ciIHVyaT0iZ3VpZGFuY2VzL3JlcG9ydHMvcmVwb3J0X0IxLnhtaSIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iXzY4S3Q4QjhyRWRxUXZPalg4ZG9DQ3ciIGlkPSItdTVEYThMeGZRUmhINkxoNWN2X2JaQSIgdXJpPSJndWlkYW5jZXMvcmVwb3J0cy9yZXBvcnRfQjIueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfN3h6OGdCOHJFZHFRdk9qWDhkb0NDdyIgaWQ9Ii1lX3BCRzNkOTA5TkIwT3ZuZlFvSjlBIiB1cmk9Imd1aWRhbmNlcy9yZXVzYWJsZWFzc2V0cy9yZXVzYWJsZV9hc3NldF9CMS54bWkiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il84aUdKOEI4ckVkcVF2T2pYOGRvQ0N3IiBpZD0iLTBhMjNnLWFRaGNaclRIN3AycnR5QVEiIHVyaT0iZ3VpZGFuY2VzL3JldXNhYmxlYXNzZXRzL3JldXNhYmxlX2Fzc2V0X0IyLnhtaSIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iXzlHYzBNQjhyRWRxUXZPalg4ZG9DQ3ciIGlkPSItZWFKWnJXZUZWYzRQRU1BOUt2MTBEQSIgdXJpPSJndWlkYW5jZXMvcm9hZG1hcHMvcm9hZG1hcF9CMS54bWkiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il9fYjZQc0I4ckVkcVF2T2pYOGRvQ0N3IiBpZD0iLTNuUTVKZ1BJRTFKbXpRbVRJWmhLdGciIHVyaT0iZ3VpZGFuY2VzL3JvYWRtYXBzL3JvYWRtYXBfQjIueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfQlBpd2dCOHNFZHFRdk9qWDhkb0NDdyIgaWQ9Ii1KRmlqeS1FOXZuWjVRSlpKVDFBQTJBIiB1cmk9Imd1aWRhbmNlcy9zdXBwb3J0aW5nbWF0ZXJpYWxzL3N1cHBvcnRpbmdfbWF0ZXJpYWxfQjEueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfQ19KczhCOHNFZHFRdk9qWDhkb0NDdyIgaWQ9Ii1pbGJOT2FxNjM1dkpHZWI2dWhDUFRBIiB1cmk9Imd1aWRhbmNlcy9zdXBwb3J0aW5nbWF0ZXJpYWxzL3N1cHBvcnRpbmdfbWF0ZXJpYWxfQjIueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfRF9yVjBCOHNFZHFRdk9qWDhkb0NDdyIgaWQ9Ii1lYTZkdzNCal9OZnBuVGZsMGhfN0hBIiB1cmk9Imd1aWRhbmNlcy90ZW1wbGF0ZXMvdGVtcGxhdGVfQjEueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfRXFjS0VCOHNFZHFRdk9qWDhkb0NDdyIgaWQ9Ii1UR2lqZmtLYWw0OGcwNnF0akhWSEpnIiB1cmk9Imd1aWRhbmNlcy90ZW1wbGF0ZXMvdGVtcGxhdGVfQjIueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfR0ZDZjBCOHNFZHFRdk9qWDhkb0NDdyIgaWQ9Ii1kLTVRUmo3cUptem42MkNFLV9FNlVBIiB1cmk9Imd1aWRhbmNlcy90ZXJtZGVmaW5pdGlvbnMvdGVybV9kZWZpbml0aW9uX0IxLnhtaSIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iX0dwR1BJQjhzRWRxUXZPalg4ZG9DQ3ciIGlkPSItcFNTeHRNTlA1aXN4b20xR2U5VEIzZyIgdXJpPSJndWlkYW5jZXMvdGVybWRlZmluaXRpb25zL3Rlcm1fZGVmaW5pdGlvbl9CMi54bWkiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il9INVJka0I4c0VkcVF2T2pYOGRvQ0N3IiBpZD0iLXlpMG85Z2tVVU4wNnpOY0NmOXRXSkEiIHVyaT0iZ3VpZGFuY2VzL3Rvb2xtZW50b3JzL3Rvb2xtZW50b3JfQjEueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfSXdzMDBCOHNFZHFRdk9qWDhkb0NDdyIgaWQ9Ii1Cdm5BZkdYRGliY0pNNGRfN3FXWFFRIiB1cmk9Imd1aWRhbmNlcy90b29sbWVudG9ycy90b29sbWVudG9yX0IyLnhtaSIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iX0plbWNvQjhzRWRxUXZPalg4ZG9DQ3ciIGlkPSItNkNkbTRTOEJBNFVfVmE1TlVvWFlzdyIgdXJpPSJndWlkYW5jZXMvd2hpdGVwYXBlcnMvd2hpdGVwYXBlcl9CMS54bWkiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il9laWFOb0I4c0VkcVF2T2pYOGRvQ0N3IiBpZD0iLWpJN05ud0dGRFMtekpXLWprcUpkTUEiIHVyaT0iZ3VpZGFuY2VzL3doaXRlcGFwZXJzL3doaXRlcGFwZXJfQjIueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfY1o5RW9COHlFZHFnQklUdUlDTEpFdyIgaWQ9Ii02cnZtM3V2enFJMHk4aC0xUHZWZjdBIiB1cmk9ImRpc2NpcGxpbmVncm91cGluZ3MvZGlzY2lwbGluZV9ncm91cGluZ19CMS54bWkiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il9oLUdDb0I4eUVkcWdCSVR1SUNMSkV3IiBpZD0iLUZlZkptYUJNVW5QRkxaaDlGU3VfOWciIHVyaT0iZGlzY2lwbGluZXMvZGlzY2lwbGluZV9CMS54bWkiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il9tZC11VUI4eUVkcWdCSVR1SUNMSkV3IiBpZD0iLWhFNU5WUHpNQmNmdlhWTzR1bG8xckEiIHVyaT0iZGlzY2lwbGluZXMvZGlzY2lwbGluZV9CMi54bWkiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il9yYmhtWUI4eUVkcWdCSVR1SUNMSkV3IiBpZD0iLWtGamt4b2dKNGpBT3otZ1dRUHNxTEEiIHVyaT0iZG9tYWlucy9kb21haW5fQjEueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfdnVtbElCOHlFZHFnQklUdUlDTEpFdyIgaWQ9Ii1VamFWbzNveWxMdG1PYlcxZTI1dHR3IiB1cmk9ImRvbWFpbnMvZG9tYWluX0IyLnhtaSIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iX3lDM0d3Qjh5RWRxZ0JJVHVJQ0xKRXciIGlkPSItZmg4WG85SUlxMkZaeURkcDFlaWRvZyIgdXJpPSJ3b3JrcHJvZHVjdHR5cGVzL3dvcmtfcHJvZHVjdF90eXBlX0IxLnhtaSIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iX3piT240Qjh5RWRxZ0JJVHVJQ0xKRXciIGlkPSItS29VbnUyYkxfRl9PXzMwU2Q1UEo5dyIgdXJpPSJ3b3JrcHJvZHVjdHR5cGVzL3dvcmtfcHJvZHVjdF90eXBlX0IyLnhtaSIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iXzBONWE4Qjh5RWRxZ0JJVHVJQ0xKRXciIGlkPSItZnZzeVg2NVpzZUsyeDhCTmJMYnBsUSIgdXJpPSJyb2xlc2V0Z3JvdXBpbmdzL3JvbGVfc2V0X2dyb3VwaW5nX0IxLnhtaSIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iXzB1WVIwQjh5RWRxZ0JJVHVJQ0xKRXciIGlkPSItWWxqRVlHQjRmUENFNUx2VDREYVB0QSIgdXJpPSJ0b29scy90b29sX0IxLnhtaSIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iXzNGTEtFQjh5RWRxZ0JJVHVJQ0xKRXciIGlkPSItM18tQWF6enNfbDQzSE9PRzhEQXNZdyIgdXJpPSJ0b29scy90b29sX0IyLnhtaSIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iXzNzZzI0Qjh5RWRxZ0JJVHVJQ0xKRXciIGlkPSItV1BxaHhVcHg0dUc2V3lyNVVqZm9pZyIgdXJpPSJjdXN0b21jYXRlZ29yaWVzL2N1c3RvbV9jYXRlZ29yeV9CMS54bWkiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il80dFZhc0I4eUVkcWdCSVR1SUNMSkV3IiBpZD0iLThYZlBtdDU1SE5CVlV5X2ZXU3ZONVEiIHVyaT0iY3VzdG9tY2F0ZWdvcmllcy9jdXN0b21fY2F0ZWdvcnlfQjIueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfZEhVUEFCODBFZHFnQklUdUlDTEpFdyIgaWQ9Ii1ZemNLYVQzR1laWFJrWTNaTXJfbVJnIiB1cmk9ImN1c3RvbWNhdGVnb3JpZXMvY3VzdG9tX2NhdGVnb3J5X0IxLjEueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfRTY5alFCODFFZHFnQklUdUlDTEpFdyIgaWQ9Il9FNkV5Y0I4MUVkcWdCSVR1SUNMSkV3IiB1cmk9ImNhcGFiaWxpdHlwYXR0ZXJucy9jYXBQYXRfQjEvbW9kZWwueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfSVFOQXdCODFFZHFnQklUdUlDTEpFdyIgaWQ9Il9JUGRaNEI4MUVkcWdCSVR1SUNMSkV3IiB1cmk9ImNhcGFiaWxpdHlwYXR0ZXJucy9jYXBQYXRfQjEuMS9tb2RlbC54bWkiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il9SZ2hWa0I4MUVkcWdCSVR1SUNMSkV3IiBpZD0iX1JmeHVzQjgxRWRxZ0JJVHVJQ0xKRXciIHVyaT0iZGVsaXZlcnlwcm9jZXNzZXMvZGVsUHJvY19CMS9tb2RlbC54bWkiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il9WMHluSUI4MUVkcWdCSVR1SUNMSkV3IiBpZD0iX1YwVjdNQjgxRWRxZ0JJVHVJQ0xKRXciIHVyaT0iZGVsaXZlcnlwcm9jZXNzZXMvZGVsUHJvY19CMS4xL21vZGVsLnhtaSIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iXzBadXpVQjg1RWRxTnZlbHliRFhaRlEiIGlkPSItTkx3WnBWZTQzQTNwRXYxTDBubXdtQSIgdXJpPSJyb2xlc2V0cy9yb2xlX3NldF9CMS54bWkiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il82UURHY0I4NUVkcU52ZWx5YkRYWkZRIiBpZD0iLWtIdTNINGVfOElrREUxSWFieTVxZ3ciIHVyaT0icm9sZXNldHMvcm9sZV9zZXRfQjIueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfNTltNDBFQTVFZHFGcUl1OC1ja29sZyIgaWQ9Il81NnhuUUVBNUVkcUZxSXU4LWNrb2xnIiB1cmk9ImNhcGFiaWxpdHlwYXR0ZXJucy9DUCUyMEIxL21vZGVsLnhtaSIvPgotICA8L29yZy5lY2xpcHNlLmVwZi51bWEucmVzb3VyY2VtYW5hZ2VyOlJlc291cmNlTWFuYWdlcj4KLSAgPG9yZy5lY2xpcHNlLmVwZi51bWE6TWV0aG9kUGx1Z2luIHhtaTppZD0iX2VjeTV3Qk0zRWRxcW5kaS1nRHV4cHciIG5hbWU9IlBsdWcgQiIgZ3VpZD0iX2VjeTV3Qk0zRWRxcW5kaS1nRHV4cHciIGJyaWVmRGVzY3JpcHRpb249IlBsdWcgQiBicmllZiIgYXV0aG9ycz0iUGx1ZyBCIGFydGh1ciI+Ci0gICAgPG1ldGhvZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il9lY3k1d1JNM0VkcXFuZGktZ0R1eHB3IiBuYW1lPSJDb250ZW50IiBndWlkPSJfZWN5NXdSTTNFZHFxbmRpLWdEdXhwdyI+Ci0gICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfZWN5NXdoTTNFZHFxbmRpLWdEdXhwdyIgbmFtZT0iQ2F0ZWdvcmllcyIgZ3VpZD0iX2VjeTV3aE0zRWRxcW5kaS1nRHV4cHciPgotICAgICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfZWN5NXd4TTNFZHFxbmRpLWdEdXhwdyIgbmFtZT0iRG9tYWlucyIgZ3VpZD0iX2VjeTV3eE0zRWRxcW5kaS1nRHV4cHciPgotICAgICAgICAgIDxjb250ZW50RWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6RG9tYWluIiB4bWk6aWQ9Il9tZHJ6WUI4eUVkcWdCSVR1SUNMSkV3IiBuYW1lPSJkb21haW5fQjEiIGd1aWQ9Il9tZHJ6WUI4eUVkcWdCSVR1SUNMSkV3IiBicmllZkRlc2NyaXB0aW9uPSJEb21haW4gQjEgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IkRvbWFpbiBCMSBwcmVzZW50IiBzdXBwb3J0aW5nTWF0ZXJpYWxzPSJfX2JLbzBCOHJFZHFRdk9qWDhkb0NDdyIgY29uY2VwdHNBbmRQYXBlcnM9Il93NkU5OEI4ckVkcVF2T2pYOGRvQ0N3IF9JdkQyRUI4c0VkcVF2T2pYOGRvQ0N3IiBjaGVja2xpc3RzPSJfdXJMZGNCOHJFZHFRdk9qWDhkb0NDdyIgZ3VpZGVsaW5lcz0iX3prWlBJQjhyRWRxUXZPalg4ZG9DQ3ciIGV4YW1wbGVzPSJfeVF6Z1VCOHJFZHFRdk9qWDhkb0NDdyIgYXNzZXRzPSJfNjdrNEVCOHJFZHFRdk9qWDhkb0NDdyIgd29ya1Byb2R1Y3RzPSJfbXFKM0FCOFBFZHFzaE1OU0kwN1hPZyBfWkhmMllCOG5FZHExT28tRG93ZHBCZyBfY1hYcnNCOG5FZHExT28tRG93ZHBCZyI+Ci0gICAgICAgICAgICA8cHJlc2VudGF0aW9uIHhtaTppZD0iLWtGamt4b2dKNGpBT3otZ1dRUHNxTEEiIGhyZWY9InVtYTovLy1rRmpreG9nSjRqQU96LWdXUVBzcUxBIy1rRmpreG9nSjRqQU96LWdXUVBzcUxBIi8+Ci0gICAgICAgICAgPC9jb250ZW50RWxlbWVudHM+Ci0gICAgICAgICAgPGNvbnRlbnRFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpEb21haW4iIHhtaTppZD0iX3Jhb09nQjh5RWRxZ0JJVHVJQ0xKRXciIG5hbWU9ImRvbWFpbl9CMiIgZ3VpZD0iX3Jhb09nQjh5RWRxZ0JJVHVJQ0xKRXciIGJyaWVmRGVzY3JpcHRpb249IkRvbWFpbiBCMiBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iRG9tYWluIEIyIHByZXNlbnQiIHN1cHBvcnRpbmdNYXRlcmlhbHM9Il9CTjV4d0I4c0VkcVF2T2pYOGRvQ0N3IiBjb25jZXB0c0FuZFBhcGVycz0iX3huRk40QjhyRWRxUXZPalg4ZG9DQ3cgX0pkdEV3QjhzRWRxUXZPalg4ZG9DQ3ciIGNoZWNrbGlzdHM9Il93RXVxVUI4ckVkcVF2T2pYOGRvQ0N3IiBndWlkZWxpbmVzPSJfMFFndVFCOHJFZHFRdk9qWDhkb0NDdyIgZXhhbXBsZXM9Il96QW9hd0I4ckVkcVF2T2pYOGRvQ0N3IiBhc3NldHM9Il83eE9Hb0I4ckVkcVF2T2pYOGRvQ0N3IiB3b3JrUHJvZHVjdHM9Il9feUc3Y0I4bUVkcTFPby1Eb3dkcEJnIF9hc0ZPa0I4bkVkcTFPby1Eb3dkcEJnIj4KLSAgICAgICAgICAgIDxwcmVzZW50YXRpb24geG1pOmlkPSItVWphVm8zb3lsTHRtT2JXMWUyNXR0dyIgaHJlZj0idW1hOi8vLVVqYVZvM295bEx0bU9iVzFlMjV0dHcjLVVqYVZvM295bEx0bU9iVzFlMjV0dHciLz4KLSAgICAgICAgICA8L2NvbnRlbnRFbGVtZW50cz4KLSAgICAgICAgPC9jaGlsZFBhY2thZ2VzPgotICAgICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfZWN5NXhCTTNFZHFxbmRpLWdEdXhwdyIgbmFtZT0iRGlzY2lwbGluZXMiIGd1aWQ9Il9lY3k1eEJNM0VkcXFuZGktZ0R1eHB3Ij4KLSAgICAgICAgICA8Y29udGVudEVsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkRpc2NpcGxpbmVHcm91cGluZyIgeG1pOmlkPSJfU1pNeFlCOHlFZHFnQklUdUlDTEpFdyIgbmFtZT0iZGlzY2lwbGluZV9ncm91cGluZ19CMSIgZ3VpZD0iX1NaTXhZQjh5RWRxZ0JJVHVJQ0xKRXciIGJyaWVmRGVzY3JpcHRpb249IkRpc2NpcGxpbmUgR3JvdXBpbmcgQjEgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IkRpc2NpcGxpbmUgR3JvdXBpbmcgQjEgcHJlc2VudCIgZGlzY2lwbGluZXM9Il9jWTU3d0I4eUVkcWdCSVR1SUNMSkV3Ij4KLSAgICAgICAgICAgIDxwcmVzZW50YXRpb24geG1pOmlkPSItNnJ2bTN1dnpxSTB5OGgtMVB2VmY3QSIgaHJlZj0idW1hOi8vLTZydm0zdXZ6cUkweThoLTFQdlZmN0EjLTZydm0zdXZ6cUkweThoLTFQdlZmN0EiLz4KLSAgICAgICAgICA8L2NvbnRlbnRFbGVtZW50cz4KLSAgICAgICAgICA8Y29udGVudEVsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkRpc2NpcGxpbmUiIHhtaTppZD0iX2NZNTd3Qjh5RWRxZ0JJVHVJQ0xKRXciIG5hbWU9ImRpc2NpcGxpbmVfQjEiIGd1aWQ9Il9jWTU3d0I4eUVkcWdCSVR1SUNMSkV3IiBicmllZkRlc2NyaXB0aW9uPSJEaXNjaXBsaW5lIEIxIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJEaXNjaXBsaW5lIEIxIHByZXNlbnQiIHN1cHBvcnRpbmdNYXRlcmlhbHM9Il9fYktvMEI4ckVkcVF2T2pYOGRvQ0N3IiBjb25jZXB0c0FuZFBhcGVycz0iX3c2RTk4QjhyRWRxUXZPalg4ZG9DQ3cgX0l2RDJFQjhzRWRxUXZPalg4ZG9DQ3ciIGNoZWNrbGlzdHM9Il91ckxkY0I4ckVkcVF2T2pYOGRvQ0N3IiBndWlkZWxpbmVzPSJfemtaUElCOHJFZHFRdk9qWDhkb0NDdyIgZXhhbXBsZXM9Il95UXpnVUI4ckVkcVF2T2pYOGRvQ0N3IiBhc3NldHM9Il82N2s0RUI4ckVkcVF2T2pYOGRvQ0N3IiB0YXNrcz0iX1hVNkxVQjhQRWRxc2hNTlNJMDdYT2ciPgotICAgICAgICAgICAgPHByZXNlbnRhdGlvbiB4bWk6aWQ9Ii1GZWZKbWFCTVVuUEZMWmg5RlN1XzlnIiBocmVmPSJ1bWE6Ly8tRmVmSm1hQk1VblBGTFpoOUZTdV85ZyMtRmVmSm1hQk1VblBGTFpoOUZTdV85ZyIvPgotICAgICAgICAgICAgPHJlZmVyZW5jZVdvcmtmbG93cyBocmVmPSJ1bWE6Ly9fRTZFeWNCODFFZHFnQklUdUlDTEpFdyNfRTZFeWNSODFFZHFnQklUdUlDTEpFdyIvPgotICAgICAgICAgIDwvY29udGVudEVsZW1lbnRzPgotICAgICAgICAgIDxjb250ZW50RWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6RGlzY2lwbGluZSIgeG1pOmlkPSJfaDlmbHNCOHlFZHFnQklUdUlDTEpFdyIgbmFtZT0iZGlzY2lwbGluZV9CMiIgZ3VpZD0iX2g5ZmxzQjh5RWRxZ0JJVHVJQ0xKRXciIGJyaWVmRGVzY3JpcHRpb249IkRpc2NpcGxpbmUgQjIgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IkRpc2NpcGxpbmUgQjIgcHJlc2VudCIgc3VwcG9ydGluZ01hdGVyaWFscz0iX0JONXh3QjhzRWRxUXZPalg4ZG9DQ3ciIGNvbmNlcHRzQW5kUGFwZXJzPSJfeG5GTjRCOHJFZHFRdk9qWDhkb0NDdyBfSmR0RXdCOHNFZHFRdk9qWDhkb0NDdyIgY2hlY2tsaXN0cz0iX3dFdXFVQjhyRWRxUXZPalg4ZG9DQ3ciIGd1aWRlbGluZXM9Il8wUWd1UUI4ckVkcVF2T2pYOGRvQ0N3IiBleGFtcGxlcz0iX3pBb2F3QjhyRWRxUXZPalg4ZG9DQ3ciIGFzc2V0cz0iXzd4T0dvQjhyRWRxUXZPalg4ZG9DQ3ciIHRhc2tzPSJfWkxPTXNCOFBFZHFzaE1OU0kwN1hPZyI+Ci0gICAgICAgICAgICA8cHJlc2VudGF0aW9uIHhtaTppZD0iLWhFNU5WUHpNQmNmdlhWTzR1bG8xckEiIGhyZWY9InVtYTovLy1oRTVOVlB6TUJjZnZYVk80dWxvMXJBIy1oRTVOVlB6TUJjZnZYVk80dWxvMXJBIi8+Ci0gICAgICAgICAgICA8cmVmZXJlbmNlV29ya2Zsb3dzIGhyZWY9InVtYTovL19JUGRaNEI4MUVkcWdCSVR1SUNMSkV3I19JUGRaNFI4MUVkcWdCSVR1SUNMSkV3Ii8+Ci0gICAgICAgICAgPC9jb250ZW50RWxlbWVudHM+Ci0gICAgICAgIDwvY2hpbGRQYWNrYWdlcz4KLSAgICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iX2VjeTV4Uk0zRWRxcW5kaS1nRHV4cHciIG5hbWU9IlJvbGVTZXRzIiBndWlkPSJfZWN5NXhSTTNFZHFxbmRpLWdEdXhwdyI+Ci0gICAgICAgICAgPGNvbnRlbnRFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpSb2xlU2V0R3JvdXBpbmciIHhtaTppZD0iX3phVlFBQjh5RWRxZ0JJVHVJQ0xKRXciIG5hbWU9InJvbGVfc2V0X2dyb3VwaW5nX0IxIiBndWlkPSJfemFWUUFCOHlFZHFnQklUdUlDTEpFdyIgYnJpZWZEZXNjcmlwdGlvbj0iUm9sZSBTZXQgR3JvdXBpbmcgQjEgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IlJvbGUgU2V0IEdyb3VwaW5nIEIxIHByZXNlbnQiIHJvbGVTZXRzPSJfdVBBV2NCODVFZHFOdmVseWJEWFpGUSI+Ci0gICAgICAgICAgICA8cHJlc2VudGF0aW9uIHhtaTppZD0iLWZ2c3lYNjVac2VLMng4Qk5iTGJwbFEiIGhyZWY9InVtYTovLy1mdnN5WDY1WnNlSzJ4OEJOYkxicGxRIy1mdnN5WDY1WnNlSzJ4OEJOYkxicGxRIi8+Ci0gICAgICAgICAgPC9jb250ZW50RWxlbWVudHM+Ci0gICAgICAgICAgPGNvbnRlbnRFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpSb2xlU2V0IiB4bWk6aWQ9Il91UEFXY0I4NUVkcU52ZWx5YkRYWkZRIiBuYW1lPSJyb2xlX3NldF9CMSIgZ3VpZD0iX3VQQVdjQjg1RWRxTnZlbHliRFhaRlEiIGJyaWVmRGVzY3JpcHRpb249IlJvbGUgU2V0IEIxIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJSb2xlIFNldCBCMSBwcmVzZW50IiBzdXBwb3J0aW5nTWF0ZXJpYWxzPSJfX2JLbzBCOHJFZHFRdk9qWDhkb0NDdyIgY29uY2VwdHNBbmRQYXBlcnM9Il93NkU5OEI4ckVkcVF2T2pYOGRvQ0N3IF9JdkQyRUI4c0VkcVF2T2pYOGRvQ0N3IiBjaGVja2xpc3RzPSJfdXJMZGNCOHJFZHFRdk9qWDhkb0NDdyIgZ3VpZGVsaW5lcz0iX3prWlBJQjhyRWRxUXZPalg4ZG9DQ3ciIGV4YW1wbGVzPSJfeVF6Z1VCOHJFZHFRdk9qWDhkb0NDdyIgYXNzZXRzPSJfNjdrNEVCOHJFZHFRdk9qWDhkb0NDdyIgcm9sZXM9Il9BOURZZ0I4UEVkcXNoTU5TSTA3WE9nIj4KLSAgICAgICAgICAgIDxwcmVzZW50YXRpb24geG1pOmlkPSItTkx3WnBWZTQzQTNwRXYxTDBubXdtQSIgaHJlZj0idW1hOi8vLU5Md1pwVmU0M0EzcEV2MUwwbm13bUEjLU5Md1pwVmU0M0EzcEV2MUwwbm13bUEiLz4KLSAgICAgICAgICA8L2NvbnRlbnRFbGVtZW50cz4KLSAgICAgICAgICA8Y29udGVudEVsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlJvbGVTZXQiIHhtaTppZD0iXzBZX01jQjg1RWRxTnZlbHliRFhaRlEiIG5hbWU9InJvbGVfc2V0X0IyIiBndWlkPSJfMFlfTWNCODVFZHFOdmVseWJEWFpGUSIgYnJpZWZEZXNjcmlwdGlvbj0iUm9sZSBTZXQgQjIgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IlJvbGUgU2V0IEIyIHByZXNlbnQiIHN1cHBvcnRpbmdNYXRlcmlhbHM9Il9CTjV4d0I4c0VkcVF2T2pYOGRvQ0N3IiBjb25jZXB0c0FuZFBhcGVycz0iX3huRk40QjhyRWRxUXZPalg4ZG9DQ3cgX0pkdEV3QjhzRWRxUXZPalg4ZG9DQ3ciIGNoZWNrbGlzdHM9Il93RXVxVUI4ckVkcVF2T2pYOGRvQ0N3IiBndWlkZWxpbmVzPSJfMFFndVFCOHJFZHFRdk9qWDhkb0NDdyIgZXhhbXBsZXM9Il96QW9hd0I4ckVkcVF2T2pYOGRvQ0N3IiBhc3NldHM9Il83eE9Hb0I4ckVkcVF2T2pYOGRvQ0N3IiByb2xlcz0iX0tDTV9JQjhQRWRxc2hNTlNJMDdYT2ciPgotICAgICAgICAgICAgPHByZXNlbnRhdGlvbiB4bWk6aWQ9Ii1rSHUzSDRlXzhJa0RFMUlhYnk1cWd3IiBocmVmPSJ1bWE6Ly8ta0h1M0g0ZV84SWtERTFJYWJ5NXFndyMta0h1M0g0ZV84SWtERTFJYWJ5NXFndyIvPgotICAgICAgICAgIDwvY29udGVudEVsZW1lbnRzPgotICAgICAgICA8L2NoaWxkUGFja2FnZXM+Ci0gICAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il9lY3k1eGhNM0VkcXFuZGktZ0R1eHB3IiBuYW1lPSJXUCBUeXBlcyIgZ3VpZD0iX2VjeTV4aE0zRWRxcW5kaS1nRHV4cHciPgotICAgICAgICAgIDxjb250ZW50RWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6V29ya1Byb2R1Y3RUeXBlIiB4bWk6aWQ9Il94S3NJb0I4eUVkcWdCSVR1SUNMSkV3IiBuYW1lPSJ3b3JrX3Byb2R1Y3RfdHlwZV9CMSIgZ3VpZD0iX3hLc0lvQjh5RWRxZ0JJVHVJQ0xKRXciIGJyaWVmRGVzY3JpcHRpb249IldvcmsgUHJvZHVjdCBUeXBlIEIxIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJXb3JrIFByb2R1Y3QgVHlwZSBCMSBwcmVzZW50IiBzdXBwb3J0aW5nTWF0ZXJpYWxzPSJfX2JLbzBCOHJFZHFRdk9qWDhkb0NDdyIgY29uY2VwdHNBbmRQYXBlcnM9Il93NkU5OEI4ckVkcVF2T2pYOGRvQ0N3IF9JdkQyRUI4c0VkcVF2T2pYOGRvQ0N3IiBjaGVja2xpc3RzPSJfdXJMZGNCOHJFZHFRdk9qWDhkb0NDdyIgZ3VpZGVsaW5lcz0iX3prWlBJQjhyRWRxUXZPalg4ZG9DQ3ciIGV4YW1wbGVzPSJfeVF6Z1VCOHJFZHFRdk9qWDhkb0NDdyIgYXNzZXRzPSJfNjdrNEVCOHJFZHFRdk9qWDhkb0NDdyIgd29ya1Byb2R1Y3RzPSJfbXFKM0FCOFBFZHFzaE1OU0kwN1hPZyBfWkhmMllCOG5FZHExT28tRG93ZHBCZyBfY1hYcnNCOG5FZHExT28tRG93ZHBCZyI+Ci0gICAgICAgICAgICA8cHJlc2VudGF0aW9uIHhtaTppZD0iLWZoOFhvOUlJcTJGWnlEZHAxZWlkb2ciIGhyZWY9InVtYTovLy1maDhYbzlJSXEyRlp5RGRwMWVpZG9nIy1maDhYbzlJSXEyRlp5RGRwMWVpZG9nIi8+Ci0gICAgICAgICAgPC9jb250ZW50RWxlbWVudHM+Ci0gICAgICAgICAgPGNvbnRlbnRFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpXb3JrUHJvZHVjdFR5cGUiIHhtaTppZD0iX3lDa0wwQjh5RWRxZ0JJVHVJQ0xKRXciIG5hbWU9IndvcmtfcHJvZHVjdF90eXBlX0IyIiBndWlkPSJfeUNrTDBCOHlFZHFnQklUdUlDTEpFdyIgYnJpZWZEZXNjcmlwdGlvbj0iV29yayBQcm9kdWN0IFR5cGUgQjIgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IldvcmsgUHJvZHVjdCBUeXBlIEIyIHByZXNlbnQiIHN1cHBvcnRpbmdNYXRlcmlhbHM9Il9CTjV4d0I4c0VkcVF2T2pYOGRvQ0N3IiBjb25jZXB0c0FuZFBhcGVycz0iX3huRk40QjhyRWRxUXZPalg4ZG9DQ3cgX0pkdEV3QjhzRWRxUXZPalg4ZG9DQ3ciIGNoZWNrbGlzdHM9Il93RXVxVUI4ckVkcVF2T2pYOGRvQ0N3IiBndWlkZWxpbmVzPSJfMFFndVFCOHJFZHFRdk9qWDhkb0NDdyIgZXhhbXBsZXM9Il96QW9hd0I4ckVkcVF2T2pYOGRvQ0N3IiBhc3NldHM9Il83eE9Hb0I4ckVkcVF2T2pYOGRvQ0N3IiB3b3JrUHJvZHVjdHM9Il9feUc3Y0I4bUVkcTFPby1Eb3dkcEJnIF9hc0ZPa0I4bkVkcTFPby1Eb3dkcEJnIj4KLSAgICAgICAgICAgIDxwcmVzZW50YXRpb24geG1pOmlkPSItS29VbnUyYkxfRl9PXzMwU2Q1UEo5dyIgaHJlZj0idW1hOi8vLUtvVW51MmJMX0ZfT18zMFNkNVBKOXcjLUtvVW51MmJMX0ZfT18zMFNkNVBKOXciLz4KLSAgICAgICAgICA8L2NvbnRlbnRFbGVtZW50cz4KLSAgICAgICAgPC9jaGlsZFBhY2thZ2VzPgotICAgICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfZWN5NXh4TTNFZHFxbmRpLWdEdXhwdyIgbmFtZT0iVG9vbHMiIGd1aWQ9Il9lY3k1eHhNM0VkcXFuZGktZ0R1eHB3Ij4KLSAgICAgICAgICA8Y29udGVudEVsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlRvb2wiIHhtaTppZD0iXzBOY3ZBQjh5RWRxZ0JJVHVJQ0xKRXciIG5hbWU9InRvb2xfQjEiIGd1aWQ9Il8wTmN2QUI4eUVkcWdCSVR1SUNMSkV3IiBicmllZkRlc2NyaXB0aW9uPSJUb29sIEIxIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJUb29sIEIxIHByZXNlbnQiIHN1cHBvcnRpbmdNYXRlcmlhbHM9Il9fYktvMEI4ckVkcVF2T2pYOGRvQ0N3IiBjb25jZXB0c0FuZFBhcGVycz0iX3c2RTk4QjhyRWRxUXZPalg4ZG9DQ3cgX0l2RDJFQjhzRWRxUXZPalg4ZG9DQ3ciIGNoZWNrbGlzdHM9Il91ckxkY0I4ckVkcVF2T2pYOGRvQ0N3IiBndWlkZWxpbmVzPSJfemtaUElCOHJFZHFRdk9qWDhkb0NDdyIgZXhhbXBsZXM9Il95UXpnVUI4ckVkcVF2T2pYOGRvQ0N3IiBhc3NldHM9Il82N2s0RUI4ckVkcVF2T2pYOGRvQ0N3IiB0b29sTWVudG9ycz0iX0dvRHRVQjhzRWRxUXZPalg4ZG9DQ3ciPgotICAgICAgICAgICAgPHByZXNlbnRhdGlvbiB4bWk6aWQ9Ii1ZbGpFWUdCNGZQQ0U1THZUNERhUHRBIiBocmVmPSJ1bWE6Ly8tWWxqRVlHQjRmUENFNUx2VDREYVB0QSMtWWxqRVlHQjRmUENFNUx2VDREYVB0QSIvPgotICAgICAgICAgIDwvY29udGVudEVsZW1lbnRzPgotICAgICAgICAgIDxjb250ZW50RWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VG9vbCIgeG1pOmlkPSJfMTdIeHdCOHlFZHFnQklUdUlDTEpFdyIgbmFtZT0idG9vbF9CMiIgZ3VpZD0iXzE3SHh3Qjh5RWRxZ0JJVHVJQ0xKRXciIGJyaWVmRGVzY3JpcHRpb249IlRvb2wgQjIgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IlRvb2wgQjIgcHJlc2VudGF0aW9uIiBzdXBwb3J0aW5nTWF0ZXJpYWxzPSJfQk41eHdCOHNFZHFRdk9qWDhkb0NDdyIgY29uY2VwdHNBbmRQYXBlcnM9Il94bkZONEI4ckVkcVF2T2pYOGRvQ0N3IF9KZHRFd0I4c0VkcVF2T2pYOGRvQ0N3IiBjaGVja2xpc3RzPSJfd0V1cVVCOHJFZHFRdk9qWDhkb0NDdyIgZ3VpZGVsaW5lcz0iXzBRZ3VRQjhyRWRxUXZPalg4ZG9DQ3ciIGV4YW1wbGVzPSJfekFvYXdCOHJFZHFRdk9qWDhkb0NDdyIgYXNzZXRzPSJfN3hPR29COHJFZHFRdk9qWDhkb0NDdyIgdG9vbE1lbnRvcnM9Il9INE9Vc0I4c0VkcVF2T2pYOGRvQ0N3Ij4KLSAgICAgICAgICAgIDxwcmVzZW50YXRpb24geG1pOmlkPSItM18tQWF6enNfbDQzSE9PRzhEQXNZdyIgaHJlZj0idW1hOi8vLTNfLUFhenpzX2w0M0hPT0c4REFzWXcjLTNfLUFhenpzX2w0M0hPT0c4REFzWXciLz4KLSAgICAgICAgICA8L2NvbnRlbnRFbGVtZW50cz4KLSAgICAgICAgPC9jaGlsZFBhY2thZ2VzPgotICAgICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfZWN5NXlCTTNFZHFxbmRpLWdEdXhwdyIgbmFtZT0iU3RhbmRhcmRDYXRlZ29yaWVzIiBndWlkPSJfZWN5NXlCTTNFZHFxbmRpLWdEdXhwdyIvPgotICAgICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfZWN5NXlSTTNFZHFxbmRpLWdEdXhwdyIgbmFtZT0iQ3VzdG9tQ2F0ZWdvcmllcyIgZ3VpZD0iX2VjeTV5Uk0zRWRxcW5kaS1nRHV4cHciPgotICAgICAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il9lY3k1eWhNM0VkcXFuZGktZ0R1eHB3IiBuYW1lPSJIaWRkZW4iIGd1aWQ9Il9lY3k1eWhNM0VkcXFuZGktZ0R1eHB3Ij4KLSAgICAgICAgICAgIDxjb250ZW50RWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q3VzdG9tQ2F0ZWdvcnkiIHhtaTppZD0iX2VjeTV5eE0zRWRxcW5kaS1nRHV4cHciIG5hbWU9IkN1c3RvbSBDYXRlZ29yaWVzIiBndWlkPSJfZWN5NXl4TTNFZHFxbmRpLWdEdXhwdyIgY2F0ZWdvcml6ZWRFbGVtZW50cz0iXzNFU1pRQjh5RWRxZ0JJVHVJQ0xKRXcgXzNzRXlBQjh5RWRxZ0JJVHVJQ0xKRXciLz4KLSAgICAgICAgICA8L2NoaWxkUGFja2FnZXM+Ci0gICAgICAgICAgPGNvbnRlbnRFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDdXN0b21DYXRlZ29yeSIgeG1pOmlkPSJfM0VTWlFCOHlFZHFnQklUdUlDTEpFdyIgbmFtZT0iY3VzdG9tX2NhdGVnb3J5X0IxIiBndWlkPSJfM0VTWlFCOHlFZHFnQklUdUlDTEpFdyIgYnJpZWZEZXNjcmlwdGlvbj0iQ3VzdG9tIENhdGVnb3J5IEIxIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJDdXN0b20gQ2F0ZWdvcnkgQjEgcHJlc2VudCI+Ci0gICAgICAgICAgICA8cHJlc2VudGF0aW9uIHhtaTppZD0iLVdQcWh4VXB4NHVHNld5cjVVamZvaWciIGhyZWY9InVtYTovLy1XUHFoeFVweDR1RzZXeXI1VWpmb2lnIy1XUHFoeFVweDR1RzZXeXI1VWpmb2lnIi8+Ci0gICAgICAgICAgICA8Y2F0ZWdvcml6ZWRFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDdXN0b21DYXRlZ29yeSIgaHJlZj0iI19YZlRkb0I4MEVkcWdCSVR1SUNMSkV3Ii8+Ci0gICAgICAgICAgICA8Y2F0ZWdvcml6ZWRFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpUYXNrIiBocmVmPSIjX1hVNkxVQjhQRWRxc2hNTlNJMDdYT2ciLz4KLSAgICAgICAgICAgIDxjYXRlZ29yaXplZEVsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlJvbGUiIGhyZWY9IiNfQTlEWWdCOFBFZHFzaE1OU0kwN1hPZyIvPgotICAgICAgICAgICAgPGNhdGVnb3JpemVkRWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6QXJ0aWZhY3QiIGhyZWY9IiNfbXFKM0FCOFBFZHFzaE1OU0kwN1hPZyIvPgotICAgICAgICAgICAgPGNhdGVnb3JpemVkRWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6RGVsaXZlcmFibGUiIGhyZWY9IiNfWkhmMllCOG5FZHExT28tRG93ZHBCZyIvPgotICAgICAgICAgICAgPGNhdGVnb3JpemVkRWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6T3V0Y29tZSIgaHJlZj0iI19jWFhyc0I4bkVkcTFPby1Eb3dkcEJnIi8+Ci0gICAgICAgICAgICA8Y2F0ZWdvcml6ZWRFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDYXBhYmlsaXR5UGF0dGVybiIgaHJlZj0idW1hOi8vXzRzQ3RzRHpnRWRxNXlzRk9OcjFCR1EjXzRzQ3RzVHpnRWRxNXlzRk9OcjFCR1EiLz4KLSAgICAgICAgICAgIDxjYXRlZ29yaXplZEVsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNhcGFiaWxpdHlQYXR0ZXJuIiBocmVmPSJ1bWE6Ly9fYUhVU1FCQk5FZHFCczdLaGRWTFJMQSNfYUhVU1FSQk5FZHFCczdLaGRWTFJMQSIvPgotICAgICAgICAgICAgPGNhdGVnb3JpemVkRWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q2FwYWJpbGl0eVBhdHRlcm4iIGhyZWY9InVtYTovL181NnhuUUVBNUVkcUZxSXU4LWNrb2xnI181NjdZb2tBNUVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgICAgICAgPC9jb250ZW50RWxlbWVudHM+Ci0gICAgICAgICAgPGNvbnRlbnRFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDdXN0b21DYXRlZ29yeSIgeG1pOmlkPSJfM3NFeUFCOHlFZHFnQklUdUlDTEpFdyIgbmFtZT0iY3VzdG9tX2NhdGVnb3J5X0IyIiBndWlkPSJfM3NFeUFCOHlFZHFnQklUdUlDTEpFdyIgYnJpZWZEZXNjcmlwdGlvbj0iQ3VzdG9tIENhdGVnb3J5IEIyIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJDdXN0b20gQ2F0ZWdvcnkgQjIgcHJlc2VudCIgY2F0ZWdvcml6ZWRFbGVtZW50cz0iX1pMT01zQjhQRWRxc2hNTlNJMDdYT2cgX195RzdjQjhtRWRxMU9vLURvd2RwQmcgX2FzRk9rQjhuRWRxMU9vLURvd2RwQmcgX0tDTV9JQjhQRWRxc2hNTlNJMDdYT2ciPgotICAgICAgICAgICAgPHByZXNlbnRhdGlvbiB4bWk6aWQ9Ii04WGZQbXQ1NUhOQlZVeV9mV1N2TjVRIiBocmVmPSJ1bWE6Ly8tOFhmUG10NTVITkJWVXlfZldTdk41USMtOFhmUG10NTVITkJWVXlfZldTdk41USIvPgotICAgICAgICAgIDwvY29udGVudEVsZW1lbnRzPgotICAgICAgICAgIDxjb250ZW50RWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q3VzdG9tQ2F0ZWdvcnkiIHhtaTppZD0iX1hmVGRvQjgwRWRxZ0JJVHVJQ0xKRXciIG5hbWU9ImN1c3RvbV9jYXRlZ29yeV9CMS4xIiBndWlkPSJfWGZUZG9CODBFZHFnQklUdUlDTEpFdyIgYnJpZWZEZXNjcmlwdGlvbj0iQ3VzdG9tIENhdGVnb3J5IEIxLjEgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IkN1c3RvbSBDYXRlZ29yeSBCMS4xIHByZXNlbnRhdGlvbiI+Ci0gICAgICAgICAgICA8cHJlc2VudGF0aW9uIHhtaTppZD0iLVl6Y0thVDNHWVpYUmtZM1pNcl9tUmciIGhyZWY9InVtYTovLy1ZemNLYVQzR1laWFJrWTNaTXJfbVJnIy1ZemNLYVQzR1laWFJrWTNaTXJfbVJnIi8+Ci0gICAgICAgICAgPC9jb250ZW50RWxlbWVudHM+Ci0gICAgICAgIDwvY2hpbGRQYWNrYWdlcz4KLSAgICAgIDwvY2hpbGRQYWNrYWdlcz4KLSAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il9lY3k1ekJNM0VkcXFuZGktZ0R1eHB3IiBuYW1lPSJDb3JlQ29udGVudCIgZ3VpZD0iX2VjeTV6Qk0zRWRxcW5kaS1nRHV4cHciPgotICAgICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfNW5yR1lCOE9FZHFzaE1OU0kwN1hPZyIgbmFtZT0iY29udGVudF9wYWNrYWdlX0IxIiBndWlkPSJfNW5yR1lCOE9FZHFzaE1OU0kwN1hPZyIgYnJpZWZEZXNjcmlwdGlvbj0iQ29uIFBhayBCMSBicmllZiI+Ci0gICAgICAgICAgPGNvbnRlbnRFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpSb2xlIiB4bWk6aWQ9Il9BOURZZ0I4UEVkcXNoTU5TSTA3WE9nIiBuYW1lPSJyb2xlX0IxIiBndWlkPSJfQTlEWWdCOFBFZHFzaE1OU0kwN1hPZyIgYnJpZWZEZXNjcmlwdGlvbj0iUm9sZSBCMSBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iUm9sZSBCMSBwcmVzZW50IiBzdXBwb3J0aW5nTWF0ZXJpYWxzPSJfX2JLbzBCOHJFZHFRdk9qWDhkb0NDdyIgY29uY2VwdHNBbmRQYXBlcnM9Il93NkU5OEI4ckVkcVF2T2pYOGRvQ0N3IF9JdkQyRUI4c0VkcVF2T2pYOGRvQ0N3IiBjaGVja2xpc3RzPSJfdXJMZGNCOHJFZHFRdk9qWDhkb0NDdyIgZ3VpZGVsaW5lcz0iX3prWlBJQjhyRWRxUXZPalg4ZG9DQ3ciIGV4YW1wbGVzPSJfeVF6Z1VCOHJFZHFRdk9qWDhkb0NDdyIgYXNzZXRzPSJfNjdrNEVCOHJFZHFRdk9qWDhkb0NDdyIgcmVzcG9uc2libGVGb3I9Il9tcUozQUI4UEVkcXNoTU5TSTA3WE9nIF9aSGYyWUI4bkVkcTFPby1Eb3dkcEJnIj4KLSAgICAgICAgICAgIDxwcmVzZW50YXRpb24geG1pOmlkPSItRmMydVlYQV80N3M3dFJUQm1tS1F2USIgaHJlZj0idW1hOi8vLUZjMnVZWEFfNDdzN3RSVEJtbUtRdlEjLUZjMnVZWEFfNDdzN3RSVEJtbUtRdlEiLz4KLSAgICAgICAgICA8L2NvbnRlbnRFbGVtZW50cz4KLSAgICAgICAgICA8Y29udGVudEVsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlJvbGUiIHhtaTppZD0iX0tDTV9JQjhQRWRxc2hNTlNJMDdYT2ciIG5hbWU9InJvbGVfQjIiIGd1aWQ9Il9LQ01fSUI4UEVkcXNoTU5TSTA3WE9nIiBicmllZkRlc2NyaXB0aW9uPSJSb2xlIEIyIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJSb2xlIEIyIHByZXNlbnQiIHN1cHBvcnRpbmdNYXRlcmlhbHM9Il9CTjV4d0I4c0VkcVF2T2pYOGRvQ0N3IiBjb25jZXB0c0FuZFBhcGVycz0iX3huRk40QjhyRWRxUXZPalg4ZG9DQ3cgX0pkdEV3QjhzRWRxUXZPalg4ZG9DQ3ciIGNoZWNrbGlzdHM9Il93RXVxVUI4ckVkcVF2T2pYOGRvQ0N3IiBndWlkZWxpbmVzPSJfMFFndVFCOHJFZHFRdk9qWDhkb0NDdyIgZXhhbXBsZXM9Il96QW9hd0I4ckVkcVF2T2pYOGRvQ0N3IiBhc3NldHM9Il83eE9Hb0I4ckVkcVF2T2pYOGRvQ0N3IiByZXNwb25zaWJsZUZvcj0iX195RzdjQjhtRWRxMU9vLURvd2RwQmcgX25xRldFQjhuRWRxMU9vLURvd2RwQmciPgotICAgICAgICAgICAgPHByZXNlbnRhdGlvbiB4bWk6aWQ9Ii1GaWRlRDAxcFVEVVhNWEVzVnJzM0dRIiBocmVmPSJ1bWE6Ly8tRmlkZUQwMXBVRFVYTVhFc1ZyczNHUSMtRmlkZUQwMXBVRFVYTVhFc1ZyczNHUSIvPgotICAgICAgICAgIDwvY29udGVudEVsZW1lbnRzPgotICAgICAgICAgIDxjb250ZW50RWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VGFzayIgeG1pOmlkPSJfWFU2TFVCOFBFZHFzaE1OU0kwN1hPZyIgbmFtZT0idGFza19CMSIgZ3VpZD0iX1hVNkxVQjhQRWRxc2hNTlNJMDdYT2ciIGJyaWVmRGVzY3JpcHRpb249IlRhc2sgQjEgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IlRhc2sgQjEgcHJlc25ldCIgc3VwcG9ydGluZ01hdGVyaWFscz0iX19iS28wQjhyRWRxUXZPalg4ZG9DQ3ciIGNvbmNlcHRzQW5kUGFwZXJzPSJfdzZFOThCOHJFZHFRdk9qWDhkb0NDdyBfSXZEMkVCOHNFZHFRdk9qWDhkb0NDdyIgY2hlY2tsaXN0cz0iX3VyTGRjQjhyRWRxUXZPalg4ZG9DQ3ciIGd1aWRlbGluZXM9Il96a1pQSUI4ckVkcVF2T2pYOGRvQ0N3IiBleGFtcGxlcz0iX3lRemdVQjhyRWRxUXZPalg4ZG9DQ3ciIGFzc2V0cz0iXzY3azRFQjhyRWRxUXZPalg4ZG9DQ3ciIHBlcmZvcm1lZEJ5PSJfQTlEWWdCOFBFZHFzaE1OU0kwN1hPZyIgbWFuZGF0b3J5SW5wdXQ9Il9tcUozQUI4UEVkcXNoTU5TSTA3WE9nIiBvdXRwdXQ9Il9jWFhyc0I4bkVkcTFPby1Eb3dkcEJnIiBhZGRpdGlvbmFsbHlQZXJmb3JtZWRCeT0iX0tDTV9JQjhQRWRxc2hNTlNJMDdYT2ciIG9wdGlvbmFsSW5wdXQ9Il9aSGYyWUI4bkVkcTFPby1Eb3dkcEJnIiB0b29sTWVudG9ycz0iX0dvRHRVQjhzRWRxUXZPalg4ZG9DQ3ciPgotICAgICAgICAgICAgPHByZXNlbnRhdGlvbiB4bWk6aWQ9Ii1sWWpyNlZpdEwxVm5uRk5PNzhYdVl3IiBocmVmPSJ1bWE6Ly8tbFlqcjZWaXRMMVZubkZOTzc4WHVZdyMtbFlqcjZWaXRMMVZubkZOTzc4WHVZdyIvPgotICAgICAgICAgIDwvY29udGVudEVsZW1lbnRzPgotICAgICAgICAgIDxjb250ZW50RWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VGFzayIgeG1pOmlkPSJfWkxPTXNCOFBFZHFzaE1OU0kwN1hPZyIgbmFtZT0idGFza19CMiIgZ3VpZD0iX1pMT01zQjhQRWRxc2hNTlNJMDdYT2ciIGJyaWVmRGVzY3JpcHRpb249IlRhc2sgQjIgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IlRhc2sgQjIgZXh0ZW5kcyBUYXNrIEExIiB2YXJpYWJpbGl0eVR5cGU9ImV4dGVuZHMiIHN1cHBvcnRpbmdNYXRlcmlhbHM9Il9CTjV4d0I4c0VkcVF2T2pYOGRvQ0N3IiBjb25jZXB0c0FuZFBhcGVycz0iX3huRk40QjhyRWRxUXZPalg4ZG9DQ3cgX0pkdEV3QjhzRWRxUXZPalg4ZG9DQ3ciIGNoZWNrbGlzdHM9Il93RXVxVUI4ckVkcVF2T2pYOGRvQ0N3IiBndWlkZWxpbmVzPSJfMFFndVFCOHJFZHFRdk9qWDhkb0NDdyIgZXhhbXBsZXM9Il96QW9hd0I4ckVkcVF2T2pYOGRvQ0N3IiBhc3NldHM9Il83eE9Hb0I4ckVkcVF2T2pYOGRvQ0N3IiBwZXJmb3JtZWRCeT0iX0tDTV9JQjhQRWRxc2hNTlNJMDdYT2ciIG1hbmRhdG9yeUlucHV0PSJfX3lHN2NCOG1FZHExT28tRG93ZHBCZyIgb3V0cHV0PSJfYXNGT2tCOG5FZHExT28tRG93ZHBCZyIgYWRkaXRpb25hbGx5UGVyZm9ybWVkQnk9Il9BOURZZ0I4UEVkcXNoTU5TSTA3WE9nIiBvcHRpb25hbElucHV0PSJfbnFGV0VCOG5FZHExT28tRG93ZHBCZyIgdG9vbE1lbnRvcnM9Il9INE9Vc0I4c0VkcVF2T2pYOGRvQ0N3Ij4KLSAgICAgICAgICAgIDxwcmVzZW50YXRpb24geG1pOmlkPSItSjN6MElHZmplaGl0MHVGYlRKY2E3ZyIgaHJlZj0idW1hOi8vLUozejBJR2ZqZWhpdDB1RmJUSmNhN2cjLUozejBJR2ZqZWhpdDB1RmJUSmNhN2ciLz4KLSAgICAgICAgICAgIDx2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50IHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlRhc2siIGhyZWY9InVtYTovL195VWVMSUEtUEVkcUwyTzFQSlY5Y1pBI183TThuc0EtUEVkcUwyTzFQSlY5Y1pBIi8+Ci0gICAgICAgICAgPC9jb250ZW50RWxlbWVudHM+Ci0gICAgICAgICAgPGNvbnRlbnRFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpBcnRpZmFjdCIgeG1pOmlkPSJfbXFKM0FCOFBFZHFzaE1OU0kwN1hPZyIgbmFtZT0iYXJ0aWZhY3RfQjEiIGd1aWQ9Il9tcUozQUI4UEVkcXNoTU5TSTA3WE9nIiBicmllZkRlc2NyaXB0aW9uPSJBcnRpZmFjdCBCMSBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iQXJ0aWZhY3QgQjEgcHJlc2VudCIgc3VwcG9ydGluZ01hdGVyaWFscz0iX19iS28wQjhyRWRxUXZPalg4ZG9DQ3ciIGNvbmNlcHRzQW5kUGFwZXJzPSJfdzZFOThCOHJFZHFRdk9qWDhkb0NDdyBfSXZEMkVCOHNFZHFRdk9qWDhkb0NDdyIgY2hlY2tsaXN0cz0iX3VyTGRjQjhyRWRxUXZPalg4ZG9DQ3ciIGd1aWRlbGluZXM9Il96a1pQSUI4ckVkcVF2T2pYOGRvQ0N3IiBleGFtcGxlcz0iX3lRemdVQjhyRWRxUXZPalg4ZG9DQ3ciIGFzc2V0cz0iXzY3azRFQjhyRWRxUXZPalg4ZG9DQ3ciIHJlcG9ydHM9Il81a2phd0I4ckVkcVF2T2pYOGRvQ0N3IiB0ZW1wbGF0ZXM9Il9DOTBRTUI4c0VkcVF2T2pYOGRvQ0N3IiB0b29sTWVudG9ycz0iX0dvRHRVQjhzRWRxUXZPalg4ZG9DQ3ciPgotICAgICAgICAgICAgPHByZXNlbnRhdGlvbiB4bWk6aWQ9Ii0tdWdpdnoxMUw2TGJqT3Z2NTNyX1RnIiBocmVmPSJ1bWE6Ly8tLXVnaXZ6MTFMNkxiak92djUzcl9UZyMtLXVnaXZ6MTFMNkxiak92djUzcl9UZyIvPgotICAgICAgICAgIDwvY29udGVudEVsZW1lbnRzPgotICAgICAgICAgIDxjb250ZW50RWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6QXJ0aWZhY3QiIHhtaTppZD0iX195RzdjQjhtRWRxMU9vLURvd2RwQmciIG5hbWU9ImFydGlmYWN0X0IyIiBndWlkPSJfX3lHN2NCOG1FZHExT28tRG93ZHBCZyIgYnJpZWZEZXNjcmlwdGlvbj0iQXJ0aWZhY3QgQjIgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IkFydGlmYWN0IEIyIHByZXNlbnQiIHN1cHBvcnRpbmdNYXRlcmlhbHM9Il9CTjV4d0I4c0VkcVF2T2pYOGRvQ0N3IiBjb25jZXB0c0FuZFBhcGVycz0iX3huRk40QjhyRWRxUXZPalg4ZG9DQ3cgX0pkdEV3QjhzRWRxUXZPalg4ZG9DQ3ciIGNoZWNrbGlzdHM9Il93RXVxVUI4ckVkcVF2T2pYOGRvQ0N3IiBndWlkZWxpbmVzPSJfMFFndVFCOHJFZHFRdk9qWDhkb0NDdyIgZXhhbXBsZXM9Il96QW9hd0I4ckVkcVF2T2pYOGRvQ0N3IiBhc3NldHM9Il83eE9Hb0I4ckVkcVF2T2pYOGRvQ0N3IiByZXBvcnRzPSJfNk91WklCOHJFZHFRdk9qWDhkb0NDdyIgdGVtcGxhdGVzPSJfRC14OThCOHNFZHFRdk9qWDhkb0NDdyIgdG9vbE1lbnRvcnM9Il9INE9Vc0I4c0VkcVF2T2pYOGRvQ0N3Ij4KLSAgICAgICAgICAgIDxwcmVzZW50YXRpb24geG1pOmlkPSItTWplZWVkX3BfTVF5Z3JXN0RCa0FyZyIgaHJlZj0idW1hOi8vLU1qZWVlZF9wX01ReWdyVzdEQmtBcmcjLU1qZWVlZF9wX01ReWdyVzdEQmtBcmciLz4KLSAgICAgICAgICA8L2NvbnRlbnRFbGVtZW50cz4KLSAgICAgICAgICA8Y29udGVudEVsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkRlbGl2ZXJhYmxlIiB4bWk6aWQ9Il9aSGYyWUI4bkVkcTFPby1Eb3dkcEJnIiBuYW1lPSJkZWxpdmVyYWJsZV9CMSIgZ3VpZD0iX1pIZjJZQjhuRWRxMU9vLURvd2RwQmciIGJyaWVmRGVzY3JpcHRpb249IkRlbGl2ZXJhYmxlIEIxIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJEZWxpdmVyYWJsZSBCMSBwcmVzZW50IiBzdXBwb3J0aW5nTWF0ZXJpYWxzPSJfX2JLbzBCOHJFZHFRdk9qWDhkb0NDdyIgY29uY2VwdHNBbmRQYXBlcnM9Il93NkU5OEI4ckVkcVF2T2pYOGRvQ0N3IF9JdkQyRUI4c0VkcVF2T2pYOGRvQ0N3IiBjaGVja2xpc3RzPSJfdXJMZGNCOHJFZHFRdk9qWDhkb0NDdyIgZ3VpZGVsaW5lcz0iX3prWlBJQjhyRWRxUXZPalg4ZG9DQ3ciIGV4YW1wbGVzPSJfeVF6Z1VCOHJFZHFRdk9qWDhkb0NDdyIgYXNzZXRzPSJfNjdrNEVCOHJFZHFRdk9qWDhkb0NDdyIgcmVwb3J0cz0iXzVramF3QjhyRWRxUXZPalg4ZG9DQ3ciIHRlbXBsYXRlcz0iX0M5MFFNQjhzRWRxUXZPalg4ZG9DQ3ciIHRvb2xNZW50b3JzPSJfR29EdFVCOHNFZHFRdk9qWDhkb0NDdyIgZGVsaXZlcmVkV29ya1Byb2R1Y3RzPSJfbXFKM0FCOFBFZHFzaE1OU0kwN1hPZyBfY1hYcnNCOG5FZHExT28tRG93ZHBCZyI+Ci0gICAgICAgICAgICA8cHJlc2VudGF0aW9uIHhtaTppZD0iLWd1Zng0UmFGd2hpVWhoQmtvcTN2WmciIGhyZWY9InVtYTovLy1ndWZ4NFJhRndoaVVoaEJrb3EzdlpnIy1ndWZ4NFJhRndoaVVoaEJrb3EzdlpnIi8+Ci0gICAgICAgICAgPC9jb250ZW50RWxlbWVudHM+Ci0gICAgICAgICAgPGNvbnRlbnRFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpPdXRjb21lIiB4bWk6aWQ9Il9hc0ZPa0I4bkVkcTFPby1Eb3dkcEJnIiBuYW1lPSJvdXRjb21lX0IyIiBndWlkPSJfYXNGT2tCOG5FZHExT28tRG93ZHBCZyIgYnJpZWZEZXNjcmlwdGlvbj0iT3V0Y29tZSBCMiBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iT3V0Y29tZSBCMiBwcmVzZW50IiBzdXBwb3J0aW5nTWF0ZXJpYWxzPSJfQk41eHdCOHNFZHFRdk9qWDhkb0NDdyIgY29uY2VwdHNBbmRQYXBlcnM9Il94bkZONEI4ckVkcVF2T2pYOGRvQ0N3IF9KZHRFd0I4c0VkcVF2T2pYOGRvQ0N3IiBjaGVja2xpc3RzPSJfd0V1cVVCOHJFZHFRdk9qWDhkb0NDdyIgZ3VpZGVsaW5lcz0iXzBRZ3VRQjhyRWRxUXZPalg4ZG9DQ3ciIGV4YW1wbGVzPSJfekFvYXdCOHJFZHFRdk9qWDhkb0NDdyIgYXNzZXRzPSJfN3hPR29COHJFZHFRdk9qWDhkb0NDdyIgcmVwb3J0cz0iXzZPdVpJQjhyRWRxUXZPalg4ZG9DQ3ciIHRlbXBsYXRlcz0iX0QteDk4QjhzRWRxUXZPalg4ZG9DQ3ciIHRvb2xNZW50b3JzPSJfSDRPVXNCOHNFZHFRdk9qWDhkb0NDdyI+Ci0gICAgICAgICAgICA8cHJlc2VudGF0aW9uIHhtaTppZD0iLUhOWExIMUhnZG43MldYRzc3QUhHWkEiIGhyZWY9InVtYTovLy1ITlhMSDFIZ2RuNzJXWEc3N0FIR1pBIy1ITlhMSDFIZ2RuNzJXWEc3N0FIR1pBIi8+Ci0gICAgICAgICAgPC9jb250ZW50RWxlbWVudHM+Ci0gICAgICAgICAgPGNvbnRlbnRFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpPdXRjb21lIiB4bWk6aWQ9Il9jWFhyc0I4bkVkcTFPby1Eb3dkcEJnIiBuYW1lPSJvdXRjb21lX0IxIiBndWlkPSJfY1hYcnNCOG5FZHExT28tRG93ZHBCZyIgYnJpZWZEZXNjcmlwdGlvbj0iT3V0Y29tZSBCMSBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iT3V0Y29tZSBCMSBwcmVzZW50IiBzdXBwb3J0aW5nTWF0ZXJpYWxzPSJfX2JLbzBCOHJFZHFRdk9qWDhkb0NDdyIgY29uY2VwdHNBbmRQYXBlcnM9Il93NkU5OEI4ckVkcVF2T2pYOGRvQ0N3IF9JdkQyRUI4c0VkcVF2T2pYOGRvQ0N3IiBjaGVja2xpc3RzPSJfdXJMZGNCOHJFZHFRdk9qWDhkb0NDdyIgZ3VpZGVsaW5lcz0iX3prWlBJQjhyRWRxUXZPalg4ZG9DQ3ciIGV4YW1wbGVzPSJfeVF6Z1VCOHJFZHFRdk9qWDhkb0NDdyIgYXNzZXRzPSJfNjdrNEVCOHJFZHFRdk9qWDhkb0NDdyIgcmVwb3J0cz0iXzVramF3QjhyRWRxUXZPalg4ZG9DQ3ciIHRlbXBsYXRlcz0iX0M5MFFNQjhzRWRxUXZPalg4ZG9DQ3ciIHRvb2xNZW50b3JzPSJfR29EdFVCOHNFZHFRdk9qWDhkb0NDdyI+Ci0gICAgICAgICAgICA8cHJlc2VudGF0aW9uIHhtaTppZD0iLXliVFB1Vk80Ukd3bl93UWx2QVdhYXciIGhyZWY9InVtYTovLy15YlRQdVZPNFJHd25fd1FsdkFXYWF3Iy15YlRQdVZPNFJHd25fd1FsdkFXYWF3Ii8+Ci0gICAgICAgICAgPC9jb250ZW50RWxlbWVudHM+Ci0gICAgICAgICAgPGNvbnRlbnRFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpEZWxpdmVyYWJsZSIgeG1pOmlkPSJfbnFGV0VCOG5FZHExT28tRG93ZHBCZyIgbmFtZT0iZGVsaXZlcmFibGVfQjIiIGd1aWQ9Il9ucUZXRUI4bkVkcTFPby1Eb3dkcEJnIiBicmllZkRlc2NyaXB0aW9uPSJEZWxpdmVyYWJsZSBCMiBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iRGVsaXZlcmFibGUgQjIgcHJlc2VudCIgc3VwcG9ydGluZ01hdGVyaWFscz0iX0JONXh3QjhzRWRxUXZPalg4ZG9DQ3ciIGNvbmNlcHRzQW5kUGFwZXJzPSJfeG5GTjRCOHJFZHFRdk9qWDhkb0NDdyBfSmR0RXdCOHNFZHFRdk9qWDhkb0NDdyIgY2hlY2tsaXN0cz0iX3dFdXFVQjhyRWRxUXZPalg4ZG9DQ3ciIGd1aWRlbGluZXM9Il8wUWd1UUI4ckVkcVF2T2pYOGRvQ0N3IiBleGFtcGxlcz0iX3pBb2F3QjhyRWRxUXZPalg4ZG9DQ3ciIGFzc2V0cz0iXzd4T0dvQjhyRWRxUXZPalg4ZG9DQ3ciIHJlcG9ydHM9Il82T3VaSUI4ckVkcVF2T2pYOGRvQ0N3IiB0ZW1wbGF0ZXM9Il9ELXg5OEI4c0VkcVF2T2pYOGRvQ0N3IiB0b29sTWVudG9ycz0iX0g0T1VzQjhzRWRxUXZPalg4ZG9DQ3ciIGRlbGl2ZXJlZFdvcmtQcm9kdWN0cz0iX195RzdjQjhtRWRxMU9vLURvd2RwQmcgX2FzRk9rQjhuRWRxMU9vLURvd2RwQmciPgotICAgICAgICAgICAgPHByZXNlbnRhdGlvbiB4bWk6aWQ9Ii1LeE5zRndnOWNONC0xczViczN4WklnIiBocmVmPSJ1bWE6Ly8tS3hOc0Z3ZzljTjQtMXM1YnMzeFpJZyMtS3hOc0Z3ZzljTjQtMXM1YnMzeFpJZyIvPgotICAgICAgICAgIDwvY29udGVudEVsZW1lbnRzPgotICAgICAgICAgIDxjb250ZW50RWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q2hlY2tsaXN0IiB4bWk6aWQ9Il91ckxkY0I4ckVkcVF2T2pYOGRvQ0N3IiBuYW1lPSJjaGVja2xpc3RfQjEiIGd1aWQ9Il91ckxkY0I4ckVkcVF2T2pYOGRvQ0N3IiBicmllZkRlc2NyaXB0aW9uPSJDaGVja2xpc3QgQjEiIHByZXNlbnRhdGlvbk5hbWU9IkNoZWNrbGlzdCBCMSBwcmVzZW50Ij4KLSAgICAgICAgICAgIDxwcmVzZW50YXRpb24geG1pOmlkPSItR2FpLTB2Q25xQjBXZ0tjazFibW5wdyIgaHJlZj0idW1hOi8vLUdhaS0wdkNucUIwV2dLY2sxYm1ucHcjLUdhaS0wdkNucUIwV2dLY2sxYm1ucHciLz4KLSAgICAgICAgICA8L2NvbnRlbnRFbGVtZW50cz4KLSAgICAgICAgICA8Y29udGVudEVsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNoZWNrbGlzdCIgeG1pOmlkPSJfd0V1cVVCOHJFZHFRdk9qWDhkb0NDdyIgbmFtZT0iY2hlY2tsaXN0X0IyIiBndWlkPSJfd0V1cVVCOHJFZHFRdk9qWDhkb0NDdyIgYnJpZWZEZXNjcmlwdGlvbj0iQ2hlY2tsaXN0IEIyIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJDaGVja2xpc3QgQjIgcHJlc2VudCI+Ci0gICAgICAgICAgICA8cHJlc2VudGF0aW9uIHhtaTppZD0iLVc3d0RIVmVJUUVEUDU5ZTlENDFLdXciIGhyZWY9InVtYTovLy1XN3dESFZlSVFFRFA1OWU5RDQxS3V3Iy1XN3dESFZlSVFFRFA1OWU5RDQxS3V3Ii8+Ci0gICAgICAgICAgPC9jb250ZW50RWxlbWVudHM+Ci0gICAgICAgICAgPGNvbnRlbnRFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb25jZXB0IiB4bWk6aWQ9Il93NkU5OEI4ckVkcVF2T2pYOGRvQ0N3IiBuYW1lPSJjb25jZXB0X0IxIiBndWlkPSJfdzZFOThCOHJFZHFRdk9qWDhkb0NDdyIgYnJpZWZEZXNjcmlwdGlvbj0iQ29uY2VwdCBCMSBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iQ29uY2VwdCBCMSBwcmVzZW50Ij4KLSAgICAgICAgICAgIDxwcmVzZW50YXRpb24geG1pOmlkPSItbi1IV1ppS2ZYcTlSUlJLZUZPQjBVQSIgaHJlZj0idW1hOi8vLW4tSFdaaUtmWHE5UlJSS2VGT0IwVUEjLW4tSFdaaUtmWHE5UlJSS2VGT0IwVUEiLz4KLSAgICAgICAgICA8L2NvbnRlbnRFbGVtZW50cz4KLSAgICAgICAgICA8Y29udGVudEVsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbmNlcHQiIHhtaTppZD0iX3huRk40QjhyRWRxUXZPalg4ZG9DQ3ciIG5hbWU9ImNvbmNlcHRfQjIiIGd1aWQ9Il94bkZONEI4ckVkcVF2T2pYOGRvQ0N3IiBicmllZkRlc2NyaXB0aW9uPSJDb25jZXB0IEIyIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJDb25jZXB0IEIyIHByZXNlbnQiPgotICAgICAgICAgICAgPHByZXNlbnRhdGlvbiB4bWk6aWQ9Ii02THBPZ2ljV1NodzJDZEJoVlpIcTB3IiBocmVmPSJ1bWE6Ly8tNkxwT2dpY1dTaHcyQ2RCaFZaSHEwdyMtNkxwT2dpY1dTaHcyQ2RCaFZaSHEwdyIvPgotICAgICAgICAgIDwvY29udGVudEVsZW1lbnRzPgotICAgICAgICAgIDxjb250ZW50RWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6RXhhbXBsZSIgeG1pOmlkPSJfeVF6Z1VCOHJFZHFRdk9qWDhkb0NDdyIgbmFtZT0iZXhhbXBsZV9CMSIgZ3VpZD0iX3lRemdVQjhyRWRxUXZPalg4ZG9DQ3ciIGJyaWVmRGVzY3JpcHRpb249IkV4YW1wbGUgQjEgcmllZiIgcHJlc2VudGF0aW9uTmFtZT0iRXhhbXBsZSBCMSBwcmVzZW50Ij4KLSAgICAgICAgICAgIDxwcmVzZW50YXRpb24geG1pOmlkPSItYkQtMmlFR1JoZEw3dWhrOVZnWTFpUSIgaHJlZj0idW1hOi8vLWJELTJpRUdSaGRMN3VoazlWZ1kxaVEjLWJELTJpRUdSaGRMN3VoazlWZ1kxaVEiLz4KLSAgICAgICAgICA8L2NvbnRlbnRFbGVtZW50cz4KLSAgICAgICAgICA8Y29udGVudEVsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkV4YW1wbGUiIHhtaTppZD0iX3pBb2F3QjhyRWRxUXZPalg4ZG9DQ3ciIG5hbWU9ImV4YW1wbGVfQjIiIGd1aWQ9Il96QW9hd0I4ckVkcVF2T2pYOGRvQ0N3IiBicmllZkRlc2NyaXB0aW9uPSJFeGFtcGxlIEIyIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJFeGFtcGxlIEIyIHByZXNlbnQiPgotICAgICAgICAgICAgPHByZXNlbnRhdGlvbiB4bWk6aWQ9Ii1PZGtRTjdneVV6ZGItbFY1S0hRczlBIiBocmVmPSJ1bWE6Ly8tT2RrUU43Z3lVemRiLWxWNUtIUXM5QSMtT2RrUU43Z3lVemRiLWxWNUtIUXM5QSIvPgotICAgICAgICAgIDwvY29udGVudEVsZW1lbnRzPgotICAgICAgICAgIDxjb250ZW50RWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6R3VpZGVsaW5lIiB4bWk6aWQ9Il96a1pQSUI4ckVkcVF2T2pYOGRvQ0N3IiBuYW1lPSJndWlkZWxpbmVfQjEiIGd1aWQ9Il96a1pQSUI4ckVkcVF2T2pYOGRvQ0N3IiBicmllZkRlc2NyaXB0aW9uPSJHdWlkZWxpbmUgQjEgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9Ikd1aWRlbGluZSBCMSBwcmVzZW50Ij4KLSAgICAgICAgICAgIDxwcmVzZW50YXRpb24geG1pOmlkPSItMGkzRExDb2FJNHhoV19zMzRMcDdKdyIgaHJlZj0idW1hOi8vLTBpM0RMQ29hSTR4aFdfczM0THA3SncjLTBpM0RMQ29hSTR4aFdfczM0THA3SnciLz4KLSAgICAgICAgICA8L2NvbnRlbnRFbGVtZW50cz4KLSAgICAgICAgICA8Y29udGVudEVsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkd1aWRlbGluZSIgeG1pOmlkPSJfMFFndVFCOHJFZHFRdk9qWDhkb0NDdyIgbmFtZT0iZ3VpZGVsaW5lX0IyIiBndWlkPSJfMFFndVFCOHJFZHFRdk9qWDhkb0NDdyIgYnJpZWZEZXNjcmlwdGlvbj0iR3VpZGVsaW5lIEIyIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJHdWlkZWxpbmUgQjIiPgotICAgICAgICAgICAgPHByZXNlbnRhdGlvbiB4bWk6aWQ9Ii1heEtSR0xHeGJ2M0ZFMkhIbUVicWR3IiBocmVmPSJ1bWE6Ly8tYXhLUkdMR3hidjNGRTJISG1FYnFkdyMtYXhLUkdMR3hidjNGRTJISG1FYnFkdyIvPgotICAgICAgICAgIDwvY29udGVudEVsZW1lbnRzPgotICAgICAgICAgIDxjb250ZW50RWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6UHJhY3RpY2UiIHhtaTppZD0iXzFJLW5VQjhyRWRxUXZPalg4ZG9DQ3ciIG5hbWU9InByYWN0aWNlX0IxIiBndWlkPSJfMUktblVCOHJFZHFRdk9qWDhkb0NDdyIgYnJpZWZEZXNjcmlwdGlvbj0iUHJhY3RpY2UgQjEgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IlByYWN0aWNlIEIxIHByZXNlbnQiIGNvbnRlbnRSZWZlcmVuY2VzPSJfbXFKM0FCOFBFZHFzaE1OU0kwN1hPZyBfM0VTWlFCOHlFZHFnQklUdUlDTEpFdyBfY1k1N3dCOHlFZHFnQklUdUlDTEpFdyBfbWRyellCOHlFZHFnQklUdUlDTEpFdyBfdVBBV2NCODVFZHFOdmVseWJEWFpGUSBfME5jdkFCOHlFZHFnQklUdUlDTEpFdyBfeEtzSW9COHlFZHFnQklUdUlDTEpFdyBfdXJMZGNCOHJFZHFRdk9qWDhkb0NDdyBfdzZFOThCOHJFZHFRdk9qWDhkb0NDdyBfWkhmMllCOG5FZHExT28tRG93ZHBCZyBfeVF6Z1VCOHJFZHFRdk9qWDhkb0NDdyBfemtaUElCOHJFZHFRdk9qWDhkb0NDdyBfY1hYcnNCOG5FZHExT28tRG93ZHBCZyBfNGkxZkVCOHJFZHFRdk9qWDhkb0NDdyBfNWtqYXdCOHJFZHFRdk9qWDhkb0NDdyBfNjdrNEVCOHJFZHFRdk9qWDhkb0NDdyBfOGhXakVCOHJFZHFRdk9qWDhkb0NDdyBfQTlEWWdCOFBFZHFzaE1OU0kwN1hPZyBfX2JLbzBCOHJFZHFRdk9qWDhkb0NDdyBfWFU2TFVCOFBFZHFzaE1OU0kwN1hPZyBfQzkwUU1COHNFZHFRdk9qWDhkb0NDdyBfR29EdFVCOHNFZHFRdk9qWDhkb0NDdyBfSXZEMkVCOHNFZHFRdk9qWDhkb0NDdyBfWGZUZG9CODBFZHFnQklUdUlDTEpFdyI+Ci0gICAgICAgICAgICA8cHJlc2VudGF0aW9uIHhtaTppZD0iLXlOc0t3d1A4QlpmczEyUGJaQTVBZVEiIGhyZWY9InVtYTovLy15TnNLd3dQOEJaZnMxMlBiWkE1QWVRIy15TnNLd3dQOEJaZnMxMlBiWkE1QWVRIi8+Ci0gICAgICAgICAgICA8c3ViUHJhY3RpY2VzIHhtaTppZD0iXzJ2TS1RQjhyRWRxUXZPalg4ZG9DQ3ciIG5hbWU9InByYWN0aWNlX0IxLjEiIGd1aWQ9Il8ydk0tUUI4ckVkcVF2T2pYOGRvQ0N3IiBicmllZkRlc2NyaXB0aW9uPSJQcmFjdGljZSBCMS4xIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJQcmFjdGljZSBCMS4xIHByZXNlbnQiPgotICAgICAgICAgICAgICA8cHJlc2VudGF0aW9uIHhtaTppZD0iLWdWdkIwUHhSSzc1TXhvT2RtOTMwX3ciIGhyZWY9InVtYTovLy1nVnZCMFB4Uks3NU14b09kbTkzMF93Iy1nVnZCMFB4Uks3NU14b09kbTkzMF93Ii8+Ci0gICAgICAgICAgICA8L3N1YlByYWN0aWNlcz4KLSAgICAgICAgICA8L2NvbnRlbnRFbGVtZW50cz4KLSAgICAgICAgICA8Y29udGVudEVsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlByYWN0aWNlIiB4bWk6aWQ9Il80aTFmRUI4ckVkcVF2T2pYOGRvQ0N3IiBuYW1lPSJwcmFjdGljZV9CMiIgZ3VpZD0iXzRpMWZFQjhyRWRxUXZPalg4ZG9DQ3ciIGJyaWVmRGVzY3JpcHRpb249IlByYWN0aWNlIEIyIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJQcmFjdGljZSBCMiBwcmVzZW50IiBjb250ZW50UmVmZXJlbmNlcz0iX195RzdjQjhtRWRxMU9vLURvd2RwQmcgX3dFdXFVQjhyRWRxUXZPalg4ZG9DQ3cgX3huRk40QjhyRWRxUXZPalg4ZG9DQ3cgX25xRldFQjhuRWRxMU9vLURvd2RwQmcgX3pBb2F3QjhyRWRxUXZPalg4ZG9DQ3cgXzBRZ3VRQjhyRWRxUXZPalg4ZG9DQ3cgX2FzRk9rQjhuRWRxMU9vLURvd2RwQmcgXzFJLW5VQjhyRWRxUXZPalg4ZG9DQ3cgXzJ2TS1RQjhyRWRxUXZPalg4ZG9DQ3cgXzZPdVpJQjhyRWRxUXZPalg4ZG9DQ3cgXzd4T0dvQjhyRWRxUXZPalg4ZG9DQ3cgXy1nd1BBQjhyRWRxUXZPalg4ZG9DQ3cgX0tDTV9JQjhQRWRxc2hNTlNJMDdYT2cgX0JONXh3QjhzRWRxUXZPalg4ZG9DQ3cgX1pMT01zQjhQRWRxc2hNTlNJMDdYT2cgX0QteDk4QjhzRWRxUXZPalg4ZG9DQ3cgX0g0T1VzQjhzRWRxUXZPalg4ZG9DQ3cgX0pkdEV3QjhzRWRxUXZPalg4ZG9DQ3cgXzNzRXlBQjh5RWRxZ0JJVHVJQ0xKRXcgX2g5ZmxzQjh5RWRxZ0JJVHVJQ0xKRXcgX3Jhb09nQjh5RWRxZ0JJVHVJQ0xKRXcgXzBZX01jQjg1RWRxTnZlbHliRFhaRlEgXzE3SHh3Qjh5RWRxZ0JJVHVJQ0xKRXcgX3lDa0wwQjh5RWRxZ0JJVHVJQ0xKRXciPgotICAgICAgICAgICAgPHByZXNlbnRhdGlvbiB4bWk6aWQ9Ii1EeGxNdHZLaXVWSHUta3RaMlUyWlRBIiBocmVmPSJ1bWE6Ly8tRHhsTXR2S2l1Vkh1LWt0WjJVMlpUQSMtRHhsTXR2S2l1Vkh1LWt0WjJVMlpUQSIvPgotICAgICAgICAgIDwvY29udGVudEVsZW1lbnRzPgotICAgICAgICAgIDxjb250ZW50RWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6UmVwb3J0IiB4bWk6aWQ9Il81a2phd0I4ckVkcVF2T2pYOGRvQ0N3IiBuYW1lPSJyZXBvcnRfQjEiIGd1aWQ9Il81a2phd0I4ckVkcVF2T2pYOGRvQ0N3IiBicmllZkRlc2NyaXB0aW9uPSJSZXBvcnQgQjEgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IlJlcG9ydCBCMSBwcmVzZW50Ij4KLSAgICAgICAgICAgIDxwcmVzZW50YXRpb24geG1pOmlkPSItNmlNT1hLamhQVE1xcGFnNTRiUTN3dyIgaHJlZj0idW1hOi8vLTZpTU9YS2poUFRNcXBhZzU0YlEzd3cjLTZpTU9YS2poUFRNcXBhZzU0YlEzd3ciLz4KLSAgICAgICAgICA8L2NvbnRlbnRFbGVtZW50cz4KLSAgICAgICAgICA8Y29udGVudEVsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlJlcG9ydCIgeG1pOmlkPSJfNk91WklCOHJFZHFRdk9qWDhkb0NDdyIgbmFtZT0icmVwb3J0X0IyIiBndWlkPSJfNk91WklCOHJFZHFRdk9qWDhkb0NDdyIgYnJpZWZEZXNjcmlwdGlvbj0iUmVwb3J0IEIyIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJSZXBvcnQgQjIgcHJlc2VudCI+Ci0gICAgICAgICAgICA8cHJlc2VudGF0aW9uIHhtaTppZD0iLXU1RGE4THhmUVJoSDZMaDVjdl9iWkEiIGhyZWY9InVtYTovLy11NURhOEx4ZlFSaEg2TGg1Y3ZfYlpBIy11NURhOEx4ZlFSaEg2TGg1Y3ZfYlpBIi8+Ci0gICAgICAgICAgPC9jb250ZW50RWxlbWVudHM+Ci0gICAgICAgICAgPGNvbnRlbnRFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpSZXVzYWJsZUFzc2V0IiB4bWk6aWQ9Il82N2s0RUI4ckVkcVF2T2pYOGRvQ0N3IiBuYW1lPSJyZXVzYWJsZV9hc3NldF9CMSIgZ3VpZD0iXzY3azRFQjhyRWRxUXZPalg4ZG9DQ3ciIGJyaWVmRGVzY3JpcHRpb249IlJldXNhYmxlIEFzc2V0IEIxIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJSZXVzYWJsZSBBc3NldCBCMSBwcmVzZW50Ij4KLSAgICAgICAgICAgIDxwcmVzZW50YXRpb24geG1pOmlkPSItZV9wQkczZDkwOU5CME92bmZRb0o5QSIgaHJlZj0idW1hOi8vLWVfcEJHM2Q5MDlOQjBPdm5mUW9KOUEjLWVfcEJHM2Q5MDlOQjBPdm5mUW9KOUEiLz4KLSAgICAgICAgICA8L2NvbnRlbnRFbGVtZW50cz4KLSAgICAgICAgICA8Y29udGVudEVsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlJldXNhYmxlQXNzZXQiIHhtaTppZD0iXzd4T0dvQjhyRWRxUXZPalg4ZG9DQ3ciIG5hbWU9InJldXNhYmxlX2Fzc2V0X0IyIiBndWlkPSJfN3hPR29COHJFZHFRdk9qWDhkb0NDdyIgYnJpZWZEZXNjcmlwdGlvbj0iUmV1c2FibGUgQXNzZXQgQjIgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IlJldXNhYmxlIEFzc2V0IEIyIHByZXNlbnQiPgotICAgICAgICAgICAgPHByZXNlbnRhdGlvbiB4bWk6aWQ9Ii0wYTIzZy1hUWhjWnJUSDdwMnJ0eUFRIiBocmVmPSJ1bWE6Ly8tMGEyM2ctYVFoY1pyVEg3cDJydHlBUSMtMGEyM2ctYVFoY1pyVEg3cDJydHlBUSIvPgotICAgICAgICAgIDwvY29udGVudEVsZW1lbnRzPgotICAgICAgICAgIDxjb250ZW50RWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Um9hZG1hcCIgeG1pOmlkPSJfOGhXakVCOHJFZHFRdk9qWDhkb0NDdyIgbmFtZT0icm9hZG1hcF9CMSIgZ3VpZD0iXzhoV2pFQjhyRWRxUXZPalg4ZG9DQ3ciIGJyaWVmRGVzY3JpcHRpb249IlJvYWRtYXAgQjEgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IlJvYWRtYXAgQjEgcHJlc2VudCI+Ci0gICAgICAgICAgICA8cHJlc2VudGF0aW9uIHhtaTppZD0iLWVhSlpyV2VGVmM0UEVNQTlLdjEwREEiIGhyZWY9InVtYTovLy1lYUpacldlRlZjNFBFTUE5S3YxMERBIy1lYUpacldlRlZjNFBFTUE5S3YxMERBIi8+Ci0gICAgICAgICAgPC9jb250ZW50RWxlbWVudHM+Ci0gICAgICAgICAgPGNvbnRlbnRFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpSb2FkbWFwIiB4bWk6aWQ9Il8tZ3dQQUI4ckVkcVF2T2pYOGRvQ0N3IiBuYW1lPSJyb2FkbWFwX0IyIiBndWlkPSJfLWd3UEFCOHJFZHFRdk9qWDhkb0NDdyIgYnJpZWZEZXNjcmlwdGlvbj0iUm9hZG1hcCBCMiBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iUm9hZG1hcCBCMiBwcmVzZW50Ij4KLSAgICAgICAgICAgIDxwcmVzZW50YXRpb24geG1pOmlkPSItM25RNUpnUElFMUptelFtVElaaEt0ZyIgaHJlZj0idW1hOi8vLTNuUTVKZ1BJRTFKbXpRbVRJWmhLdGcjLTNuUTVKZ1BJRTFKbXpRbVRJWmhLdGciLz4KLSAgICAgICAgICA8L2NvbnRlbnRFbGVtZW50cz4KLSAgICAgICAgICA8Y29udGVudEVsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlN1cHBvcnRpbmdNYXRlcmlhbCIgeG1pOmlkPSJfX2JLbzBCOHJFZHFRdk9qWDhkb0NDdyIgbmFtZT0ic3VwcG9ydGluZ19tYXRlcmlhbF9CMSIgZ3VpZD0iX19iS28wQjhyRWRxUXZPalg4ZG9DQ3ciIGJyaWVmRGVzY3JpcHRpb249IlN1cHBvcnRpbmcgTWF0ZXJpYWwgQjEgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IlN1cHBvcnRpbmcgTWF0ZXJpYWwgQjEgcHJlc2VudCI+Ci0gICAgICAgICAgICA8cHJlc2VudGF0aW9uIHhtaTppZD0iLUpGaWp5LUU5dm5aNVFKWkpUMUFBMkEiIGhyZWY9InVtYTovLy1KRmlqeS1FOXZuWjVRSlpKVDFBQTJBIy1KRmlqeS1FOXZuWjVRSlpKVDFBQTJBIi8+Ci0gICAgICAgICAgPC9jb250ZW50RWxlbWVudHM+Ci0gICAgICAgICAgPGNvbnRlbnRFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpTdXBwb3J0aW5nTWF0ZXJpYWwiIHhtaTppZD0iX0JONXh3QjhzRWRxUXZPalg4ZG9DQ3ciIG5hbWU9InN1cHBvcnRpbmdfbWF0ZXJpYWxfQjIiIGd1aWQ9Il9CTjV4d0I4c0VkcVF2T2pYOGRvQ0N3IiBicmllZkRlc2NyaXB0aW9uPSJTdXBwb3J0aW5nIE1hdGVyaWFsIEIyIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJTdXBwb3J0aW5nIE1hdGVyaWFsIEIyIHByZXNlbnQiPgotICAgICAgICAgICAgPHByZXNlbnRhdGlvbiB4bWk6aWQ9Ii1pbGJOT2FxNjM1dkpHZWI2dWhDUFRBIiBocmVmPSJ1bWE6Ly8taWxiTk9hcTYzNXZKR2ViNnVoQ1BUQSMtaWxiTk9hcTYzNXZKR2ViNnVoQ1BUQSIvPgotICAgICAgICAgIDwvY29udGVudEVsZW1lbnRzPgotICAgICAgICAgIDxjb250ZW50RWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VGVtcGxhdGUiIHhtaTppZD0iX0M5MFFNQjhzRWRxUXZPalg4ZG9DQ3ciIG5hbWU9InRlbXBsYXRlX0IxIiBndWlkPSJfQzkwUU1COHNFZHFRdk9qWDhkb0NDdyIgYnJpZWZEZXNjcmlwdGlvbj0iVGVtcGxhdGUgQjEgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IlRlbXBsYXRlIEIxIHByZXNlbnQiPgotICAgICAgICAgICAgPHByZXNlbnRhdGlvbiB4bWk6aWQ9Ii1lYTZkdzNCal9OZnBuVGZsMGhfN0hBIiBocmVmPSJ1bWE6Ly8tZWE2ZHczQmpfTmZwblRmbDBoXzdIQSMtZWE2ZHczQmpfTmZwblRmbDBoXzdIQSIvPgotICAgICAgICAgIDwvY29udGVudEVsZW1lbnRzPgotICAgICAgICAgIDxjb250ZW50RWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VGVtcGxhdGUiIHhtaTppZD0iX0QteDk4QjhzRWRxUXZPalg4ZG9DQ3ciIG5hbWU9InRlbXBsYXRlX0IyIiBndWlkPSJfRC14OThCOHNFZHFRdk9qWDhkb0NDdyIgYnJpZWZEZXNjcmlwdGlvbj0iVGVtcGxhdGUgQjIgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IlRlbXBsYXRlIEIyIHByZXNlbnQiPgotICAgICAgICAgICAgPHByZXNlbnRhdGlvbiB4bWk6aWQ9Ii1UR2lqZmtLYWw0OGcwNnF0akhWSEpnIiBocmVmPSJ1bWE6Ly8tVEdpamZrS2FsNDhnMDZxdGpIVkhKZyMtVEdpamZrS2FsNDhnMDZxdGpIVkhKZyIvPgotICAgICAgICAgIDwvY29udGVudEVsZW1lbnRzPgotICAgICAgICAgIDxjb250ZW50RWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VGVybURlZmluaXRpb24iIHhtaTppZD0iX0Vwc2pNQjhzRWRxUXZPalg4ZG9DQ3ciIG5hbWU9InRlcm1fZGVmaW5pdGlvbl9CMSIgZ3VpZD0iX0Vwc2pNQjhzRWRxUXZPalg4ZG9DQ3ciIHByZXNlbnRhdGlvbk5hbWU9IlRlcm0gRGVmaW5pdGlvbiBCMSBwcmVzZW50Ij4KLSAgICAgICAgICAgIDxwcmVzZW50YXRpb24geG1pOmlkPSItZC01UVJqN3FKbXpuNjJDRS1fRTZVQSIgaHJlZj0idW1hOi8vLWQtNVFSajdxSm16bjYyQ0UtX0U2VUEjLWQtNVFSajdxSm16bjYyQ0UtX0U2VUEiLz4KLSAgICAgICAgICA8L2NvbnRlbnRFbGVtZW50cz4KLSAgICAgICAgICA8Y29udGVudEVsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlRlcm1EZWZpbml0aW9uIiB4bWk6aWQ9Il9HRVM0OEI4c0VkcVF2T2pYOGRvQ0N3IiBuYW1lPSJ0ZXJtX2RlZmluaXRpb25fQjIiIGd1aWQ9Il9HRVM0OEI4c0VkcVF2T2pYOGRvQ0N3IiBwcmVzZW50YXRpb25OYW1lPSJUZXJtIERlZmluaXRpb24gQjIgYnJpZWYiPgotICAgICAgICAgICAgPHByZXNlbnRhdGlvbiB4bWk6aWQ9Ii1wU1N4dE1OUDVpc3hvbTFHZTlUQjNnIiBocmVmPSJ1bWE6Ly8tcFNTeHRNTlA1aXN4b20xR2U5VEIzZyMtcFNTeHRNTlA1aXN4b20xR2U5VEIzZyIvPgotICAgICAgICAgIDwvY29udGVudEVsZW1lbnRzPgotICAgICAgICAgIDxjb250ZW50RWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VG9vbE1lbnRvciIgeG1pOmlkPSJfR29EdFVCOHNFZHFRdk9qWDhkb0NDdyIgbmFtZT0idG9vbG1lbnRvcl9CMSIgZ3VpZD0iX0dvRHRVQjhzRWRxUXZPalg4ZG9DQ3ciIGJyaWVmRGVzY3JpcHRpb249IlRvb2xtZW50byBCMSBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iVG9vbG1lbnRvciBCMSBwcmVzZW50Ij4KLSAgICAgICAgICAgIDxwcmVzZW50YXRpb24geG1pOmlkPSIteWkwbzlna1VVTjA2ek5jQ2Y5dFdKQSIgaHJlZj0idW1hOi8vLXlpMG85Z2tVVU4wNnpOY0NmOXRXSkEjLXlpMG85Z2tVVU4wNnpOY0NmOXRXSkEiLz4KLSAgICAgICAgICA8L2NvbnRlbnRFbGVtZW50cz4KLSAgICAgICAgICA8Y29udGVudEVsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlRvb2xNZW50b3IiIHhtaTppZD0iX0g0T1VzQjhzRWRxUXZPalg4ZG9DQ3ciIG5hbWU9InRvb2xtZW50b3JfQjIiIGd1aWQ9Il9INE9Vc0I4c0VkcVF2T2pYOGRvQ0N3IiBicmllZkRlc2NyaXB0aW9uPSJUb29sbWVudG9yIEIyIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJUb29sbWVudG9yIEIyIHByZXNlbnQiPgotICAgICAgICAgICAgPHByZXNlbnRhdGlvbiB4bWk6aWQ9Ii1Cdm5BZkdYRGliY0pNNGRfN3FXWFFRIiBocmVmPSJ1bWE6Ly8tQnZuQWZHWERpYmNKTTRkXzdxV1hRUSMtQnZuQWZHWERpYmNKTTRkXzdxV1hRUSIvPgotICAgICAgICAgIDwvY29udGVudEVsZW1lbnRzPgotICAgICAgICAgIDxjb250ZW50RWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6V2hpdGVwYXBlciIgeG1pOmlkPSJfSXZEMkVCOHNFZHFRdk9qWDhkb0NDdyIgbmFtZT0id2hpdGVwYXBlcl9CMSIgZ3VpZD0iX0l2RDJFQjhzRWRxUXZPalg4ZG9DQ3ciIGJyaWVmRGVzY3JpcHRpb249IldoaXRlcGFwZXIgQjEgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IldoaXRlcGFwZXIgQjEgcHJlc2VudCI+Ci0gICAgICAgICAgICA8cHJlc2VudGF0aW9uIHhtaTppZD0iLTZDZG00UzhCQTRVX1ZhNU5Vb1hZc3ciIGhyZWY9InVtYTovLy02Q2RtNFM4QkE0VV9WYTVOVW9YWXN3Iy02Q2RtNFM4QkE0VV9WYTVOVW9YWXN3Ii8+Ci0gICAgICAgICAgPC9jb250ZW50RWxlbWVudHM+Ci0gICAgICAgICAgPGNvbnRlbnRFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpXaGl0ZXBhcGVyIiB4bWk6aWQ9Il9KZHRFd0I4c0VkcVF2T2pYOGRvQ0N3IiBuYW1lPSJ3aGl0ZXBhcGVyX0IyIiBndWlkPSJfSmR0RXdCOHNFZHFRdk9qWDhkb0NDdyIgYnJpZWZEZXNjcmlwdGlvbj0iV2hpdGVwYXBlciBCMiIgcHJlc2VudGF0aW9uTmFtZT0iV2hpdGVwYXBlciBCMiBwcmVzZW50Ij4KLSAgICAgICAgICAgIDxwcmVzZW50YXRpb24geG1pOmlkPSItakk3Tm53R0ZEUy16SlctamtxSmRNQSIgaHJlZj0idW1hOi8vLWpJN05ud0dGRFMtekpXLWprcUpkTUEjLWpJN05ud0dGRFMtekpXLWprcUpkTUEiLz4KLSAgICAgICAgICA8L2NvbnRlbnRFbGVtZW50cz4KLSAgICAgICAgPC9jaGlsZFBhY2thZ2VzPgotICAgICAgPC9jaGlsZFBhY2thZ2VzPgotICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc1BhY2thZ2UiIHhtaTppZD0iX2VjeTV6Uk0zRWRxcW5kaS1nRHV4cHciIG5hbWU9IkNhcGFiaWxpdHlQYXR0ZXJucyIgZ3VpZD0iX2VjeTV6Uk0zRWRxcW5kaS1nRHV4cHciPgotICAgICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzUGFja2FnZSIgeG1pOmlkPSJfNl91cE1CODBFZHFnQklUdUlDTEpFdyIgbmFtZT0iY2FwUGF0UGFrX0IxIiBndWlkPSJfNl91cE1CODBFZHFnQklUdUlDTEpFdyI+Ci0gICAgICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc1BhY2thZ2UiIHhtaTppZD0iX19VNVNvQjgwRWRxZ0JJVHVJQ0xKRXciIG5hbWU9ImNhcFBhdFBha19CMS4xIiBndWlkPSJfX1U1U29CODBFZHFnQklUdUlDTEpFdyI+Ci0gICAgICAgICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzQ29tcG9uZW50IiB4bWk6aWQ9Il9JUGRaNEI4MUVkcWdCSVR1SUNMSkV3IiBocmVmPSJ1bWE6Ly9fSVBkWjRCODFFZHFnQklUdUlDTEpFdyNfSVBkWjRCODFFZHFnQklUdUlDTEpFdyIvPgotICAgICAgICAgIDwvY2hpbGRQYWNrYWdlcz4KLSAgICAgICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzQ29tcG9uZW50IiB4bWk6aWQ9Il9FNkV5Y0I4MUVkcWdCSVR1SUNMSkV3IiBocmVmPSJ1bWE6Ly9fRTZFeWNCODFFZHFnQklUdUlDTEpFdyNfRTZFeWNCODFFZHFnQklUdUlDTEpFdyIvPgotICAgICAgICA8L2NoaWxkUGFja2FnZXM+Ci0gICAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NDb21wb25lbnQiIHhtaTppZD0iXzU2eG5RRUE1RWRxRnFJdTgtY2tvbGciIGhyZWY9InVtYTovL181NnhuUUVBNUVkcUZxSXU4LWNrb2xnI181NnhuUUVBNUVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgICA8L2NoaWxkUGFja2FnZXM+Ci0gICAgPC9tZXRob2RQYWNrYWdlcz4KLSAgICA8bWV0aG9kUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc1BhY2thZ2UiIHhtaTppZD0iX2VjeTV6aE0zRWRxcW5kaS1nRHV4cHciIG5hbWU9IkRlbGl2ZXJ5UHJvY2Vzc2VzIiBndWlkPSJfZWN5NXpoTTNFZHFxbmRpLWdEdXhwdyI+Ci0gICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzUGFja2FnZSIgeG1pOmlkPSJfTDZKaThCODFFZHFnQklUdUlDTEpFdyIgbmFtZT0iZGVsUHJvY1Bha19CMSIgZ3VpZD0iX0w2Smk4QjgxRWRxZ0JJVHVJQ0xKRXciPgotICAgICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzUGFja2FnZSIgeG1pOmlkPSJfTjBmSXNCODFFZHFnQklUdUlDTEpFdyIgbmFtZT0iZGVsUHJvY1Bha19CMS4xIiBndWlkPSJfTjBmSXNCODFFZHFnQklUdUlDTEpFdyI+Ci0gICAgICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc0NvbXBvbmVudCIgeG1pOmlkPSJfVjBWN01CODFFZHFnQklUdUlDTEpFdyIgaHJlZj0idW1hOi8vX1YwVjdNQjgxRWRxZ0JJVHVJQ0xKRXcjX1YwVjdNQjgxRWRxZ0JJVHVJQ0xKRXciLz4KLSAgICAgICAgPC9jaGlsZFBhY2thZ2VzPgotICAgICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzQ29tcG9uZW50IiB4bWk6aWQ9Il9SZnh1c0I4MUVkcWdCSVR1SUNMSkV3IiBocmVmPSJ1bWE6Ly9fUmZ4dXNCODFFZHFnQklUdUlDTEpFdyNfUmZ4dXNCODFFZHFnQklUdUlDTEpFdyIvPgotICAgICAgPC9jaGlsZFBhY2thZ2VzPgotICAgIDwvbWV0aG9kUGFja2FnZXM+Ci0gICAgPG1ldGhvZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NQYWNrYWdlIiB4bWk6aWQ9Il9lY3k1enhNM0VkcXFuZGktZ0R1eHB3IiBuYW1lPSJQcm9jZXNzQ29udHJpYnV0aW9ucyIgZ3VpZD0iX2VjeTV6eE0zRWRxcW5kaS1nRHV4cHciLz4KLSAgICA8YmFzZXMgaHJlZj0idW1hOi8vX3lVZUxJQS1QRWRxTDJPMVBKVjljWkEjX3lVZUxJQS1QRWRxTDJPMVBKVjljWkEiLz4KLSAgPC9vcmcuZWNsaXBzZS5lcGYudW1hOk1ldGhvZFBsdWdpbj4KLTwveG1pOlhNST4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi9yb2xlcy9yb2xlX0IxLnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi9yb2xlcy9yb2xlX0IxLnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzM3MTIxZi4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvcm9sZXMvcm9sZV9CMS54bWkKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08b3JnLmVjbGlwc2UuZXBmLnVtYTpSb2xlRGVzY3JpcHRpb24geG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiIHhtaTppZD0iLUZjMnVZWEFfNDdzN3RSVEJtbUtRdlEiIG5hbWU9InJvbGVfQjEsX0E5RFlnQjhQRWRxc2hNTlNJMDdYT2ciIGd1aWQ9Ii1GYzJ1WVhBXzQ3czd0UlRCbW1LUXZRIiBjaGFuZ2VEYXRlPSIyMDA1LTA5LTA2VDEyOjQ3OjIzLjE0MS0wNzAwIj4KLSAgPG1haW5EZXNjcmlwdGlvbj5Sb2xlIEIxIG1haW48L21haW5EZXNjcmlwdGlvbj4KLSAgPGtleUNvbnNpZGVyYXRpb25zPlJvbGUgQjEga2V5PC9rZXlDb25zaWRlcmF0aW9ucz4KLSAgPHNraWxscz5Sb2xlIEIxIHNraWxsPC9za2lsbHM+Ci0gIDxhc3NpZ25tZW50QXBwcm9hY2hlcz5Sb2xlIEIxIGFzc2lnbjwvYXNzaWdubWVudEFwcHJvYWNoZXM+Ci0gIDxzeW5vbnltcz5Sb2xlIEIxIHN5bjwvc3lub255bXM+Ci08L29yZy5lY2xpcHNlLmVwZi51bWE6Um9sZURlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL3JvbGVzL3JvbGVfQjIueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL3JvbGVzL3JvbGVfQjIueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4M2E5MjhhLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi9yb2xlcy9yb2xlX0IyLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxvcmcuZWNsaXBzZS5lcGYudW1hOlJvbGVEZXNjcmlwdGlvbiB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCIgeG1pOmlkPSItRmlkZUQwMXBVRFVYTVhFc1ZyczNHUSIgbmFtZT0icm9sZV9CMixfS0NNX0lCOFBFZHFzaE1OU0kwN1hPZyIgZ3VpZD0iLUZpZGVEMDFwVURVWE1YRXNWcnMzR1EiIGNoYW5nZURhdGU9IjIwMDUtMDktMDZUMTI6NDg6MjEuNzM0LTA3MDAiPgotICA8bWFpbkRlc2NyaXB0aW9uPlJvbGUgQjIgbWFpbjwvbWFpbkRlc2NyaXB0aW9uPgotICA8a2V5Q29uc2lkZXJhdGlvbnM+Um9sZSBCMiBrZXk8L2tleUNvbnNpZGVyYXRpb25zPgotICA8c2tpbGxzPlJvbGUgQjIgc2tpbGw8L3NraWxscz4KLSAgPGFzc2lnbm1lbnRBcHByb2FjaGVzPlJvbGUgQjIgYXNzPC9hc3NpZ25tZW50QXBwcm9hY2hlcz4KLSAgPHN5bm9ueW1zPlJvbGUgQjIgc3luPC9zeW5vbnltcz4KLTwvb3JnLmVjbGlwc2UuZXBmLnVtYTpSb2xlRGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvcm9sZXNldGdyb3VwaW5ncy9yb2xlX3NldF9ncm91cGluZ19CMS54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvcm9sZXNldGdyb3VwaW5ncy9yb2xlX3NldF9ncm91cGluZ19CMS54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxYWIzYjQuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL3JvbGVzZXRncm91cGluZ3Mvcm9sZV9zZXRfZ3JvdXBpbmdfQjEueG1pCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPG9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudERlc2NyaXB0aW9uIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6ZXBmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZiIgZXBmOnZlcnNpb249IjEuMi4wIiB4bWk6aWQ9Ii1mdnN5WDY1WnNlSzJ4OEJOYkxicGxRIiBuYW1lPSJyb2xlX3NldF9ncm91cGluZ19CMSxfemFWUUFCOHlFZHFnQklUdUlDTEpFdyIgZ3VpZD0iLWZ2c3lYNjVac2VLMng4Qk5iTGJwbFEiIGNoYW5nZURhdGU9IjIwMDUtMDktMDZUMTc6MTY6MjUuNTAwLTA3MDAiPgotICA8bWFpbkRlc2NyaXB0aW9uPlJvbGUgU2V0IEdyb3VwaW5nIEIxIG1haW48L21haW5EZXNjcmlwdGlvbj4KLSAgPGtleUNvbnNpZGVyYXRpb25zPlJvbGUgU2V0IEdyb3VwaW5nIEIxIGtleTwva2V5Q29uc2lkZXJhdGlvbnM+Ci08L29yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL3JvbGVzZXRzL3JvbGVfc2V0X0IxLnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi9yb2xlc2V0cy9yb2xlX3NldF9CMS54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczMDU0MTcuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL3JvbGVzZXRzL3JvbGVfc2V0X0IxLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnREZXNjcmlwdGlvbiB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCIgeG1pOmlkPSItTkx3WnBWZTQzQTNwRXYxTDBubXdtQSIgbmFtZT0icm9sZV9zZXRfQjEsX3VQQVdjQjg1RWRxTnZlbHliRFhaRlEiIGd1aWQ9Ii1OTHdacFZlNDNBM3BFdjFMMG5td21BIiBjaGFuZ2VEYXRlPSIyMDA1LTA5LTA2VDE3OjUzOjA3LjM3NS0wNzAwIj4KLSAgPG1haW5EZXNjcmlwdGlvbj5Sb2xlIFNldCBCMSBtYWluPC9tYWluRGVzY3JpcHRpb24+Ci0gIDxrZXlDb25zaWRlcmF0aW9ucz5Sb2xlIFNldCBCMSBrZXk8L2tleUNvbnNpZGVyYXRpb25zPgotPC9vcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnREZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi9yb2xlc2V0cy9yb2xlX3NldF9CMi54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvcm9sZXNldHMvcm9sZV9zZXRfQjIueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZTdjYWMzLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi9yb2xlc2V0cy9yb2xlX3NldF9CMi54bWkKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08b3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50RGVzY3JpcHRpb24geG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiIHhtaTppZD0iLWtIdTNINGVfOElrREUxSWFieTVxZ3ciIG5hbWU9InJvbGVfc2V0X0IyLF8wWV9NY0I4NUVkcU52ZWx5YkRYWkZRIiBndWlkPSIta0h1M0g0ZV84SWtERTFJYWJ5NXFndyIgY2hhbmdlRGF0ZT0iMjAwNS0wOS0wNlQxNzo1Mzo0My41NDctMDcwMCI+Ci0gIDxtYWluRGVzY3JpcHRpb24+Jmx0O3AmZ3Q7Ci0gICAgUm9sZSBTZXQgQjIgbWFpbgotJmx0Oy9wJmd0OzwvbWFpbkRlc2NyaXB0aW9uPgotICA8a2V5Q29uc2lkZXJhdGlvbnM+Jmx0O3AmZ3Q7Ci0gICAgUm9sZSBTZXQgQjIga2V5Ci0mbHQ7L3AmZ3Q7PC9rZXlDb25zaWRlcmF0aW9ucz4KLTwvb3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvdGFza3MvdGFza19CMS54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvdGFza3MvdGFza19CMS54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiMjU0NWMuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL3Rhc2tzL3Rhc2tfQjEueG1pCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxvcmcuZWNsaXBzZS5lcGYudW1hOlRhc2tEZXNjcmlwdGlvbiB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCIgeG1pOmlkPSItbFlqcjZWaXRMMVZubkZOTzc4WHVZdyIgbmFtZT0idGFza19CMSxfWFU2TFVCOFBFZHFzaE1OU0kwN1hPZyIgZ3VpZD0iLWxZanI2Vml0TDFWbm5GTk83OFh1WXciIGNoYW5nZURhdGU9IjIwMDUtMDktMDZUMTI6NTA6NDcuMjAzLTA3MDAiPgotICA8bWFpbkRlc2NyaXB0aW9uPiZsdDtwJmd0OwotICAgIFRhc2sgQjEgbWFpbiAmYW1wO2FtcDsgXCBcXCAmcXVvdDsgJyAlICZhbXA7Z3Q7ICZhbXA7bHQ7Ci0mbHQ7L3AmZ3Q7PC9tYWluRGVzY3JpcHRpb24+Ci0gIDxzZWN0aW9ucyB4bWk6aWQ9Il9UNEFxQUI4NEVkcU52ZWx5YkRYWkZRIiBuYW1lPSJTdGVwIEIxLjEiIGd1aWQ9Il9UNEFxQUI4NEVkcU52ZWx5YkRYWkZRIj4KLSAgICA8c2VjdGlvbkRlc2NyaXB0aW9uPnVwPC9zZWN0aW9uRGVzY3JpcHRpb24+Ci0gIDwvc2VjdGlvbnM+Ci0gIDxzZWN0aW9ucyB4bWk6aWQ9Il9UNThqc0I4NEVkcU52ZWx5YkRYWkZRIiBuYW1lPSJTdGVwIEIxLjIiIGd1aWQ9Il9UNThqc0I4NEVkcU52ZWx5YkRYWkZRIj4KLSAgICA8c2VjdGlvbkRlc2NyaXB0aW9uPiZsdDtwJmd0OwotICAgIERvd24KLSZsdDsvcCZndDs8L3NlY3Rpb25EZXNjcmlwdGlvbj4KLSAgPC9zZWN0aW9ucz4KLSAgPHNlY3Rpb25zIHhtaTppZD0iX1Q4VkpVQjg0RWRxTnZlbHliRFhaRlEiIG5hbWU9IlN0ZXAgQjEuMyIgZ3VpZD0iX1Q4VkpVQjg0RWRxTnZlbHliRFhaRlEiPgotICAgIDxzZWN0aW9uRGVzY3JpcHRpb24+T3Zlcjwvc2VjdGlvbkRlc2NyaXB0aW9uPgotICA8L3NlY3Rpb25zPgotICA8a2V5Q29uc2lkZXJhdGlvbnM+VGFzayBCMSBrZXk8L2tleUNvbnNpZGVyYXRpb25zPgotICA8cHVycG9zZT5UYXNrIEIxIHBvcnBvaXNlPC9wdXJwb3NlPgotICA8YWx0ZXJuYXRpdmVzPlRhc2sgQjEgYWx0PC9hbHRlcm5hdGl2ZXM+Ci08L29yZy5lY2xpcHNlLmVwZi51bWE6VGFza0Rlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL3Rhc2tzL3Rhc2tfQjIueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL3Rhc2tzL3Rhc2tfQjIueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOGEwOWFmLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi90YXNrcy90YXNrX0IyLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08b3JnLmVjbGlwc2UuZXBmLnVtYTpUYXNrRGVzY3JpcHRpb24geG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiIHhtaTppZD0iLUozejBJR2ZqZWhpdDB1RmJUSmNhN2ciIG5hbWU9InRhc2tfQjIsX1pMT01zQjhQRWRxc2hNTlNJMDdYT2ciIGd1aWQ9Ii1KM3owSUdmamVoaXQwdUZiVEpjYTdnIiBjaGFuZ2VEYXRlPSIyMDA1LTA5LTA2VDEyOjUwOjA3LjcwMy0wNzAwIj4KLSAgPG1haW5EZXNjcmlwdGlvbj5UYXNrIEIyIG1haW48L21haW5EZXNjcmlwdGlvbj4KLSAgPHNlY3Rpb25zIHhtaTppZD0iX29xWXN3Qjg0RWRxTnZlbHliRFhaRlEiIG5hbWU9IlN0ZXAgQjIuMSIgZ3VpZD0iX29xWXN3Qjg0RWRxTnZlbHliRFhaRlEiPgotICAgIDxzZWN0aW9uRGVzY3JpcHRpb24+RWluPC9zZWN0aW9uRGVzY3JpcHRpb24+Ci0gIDwvc2VjdGlvbnM+Ci0gIDxzZWN0aW9ucyB4bWk6aWQ9Il9xdVFwQUI4NEVkcU52ZWx5YkRYWkZRIiBuYW1lPSJTdGVwIEIyLjIiIGd1aWQ9Il9xdVFwQUI4NEVkcU52ZWx5YkRYWkZRIj4KLSAgICA8c2VjdGlvbkRlc2NyaXB0aW9uPiZsdDtwJmd0OwotICAgIFp3ZWkKLSZsdDsvcCZndDs8L3NlY3Rpb25EZXNjcmlwdGlvbj4KLSAgPC9zZWN0aW9ucz4KLSAgPHNlY3Rpb25zIHhtaTppZD0iX3F5dTVVQjg0RWRxTnZlbHliRFhaRlEiIG5hbWU9IlN0ZXAgQjIuMyIgZ3VpZD0iX3F5dTVVQjg0RWRxTnZlbHliRFhaRlEiPgotICAgIDxzZWN0aW9uRGVzY3JpcHRpb24+Jmx0O3AmZ3Q7Ci0gICAgRHJlaQotJmx0Oy9wJmd0Ozwvc2VjdGlvbkRlc2NyaXB0aW9uPgotICA8L3NlY3Rpb25zPgotICA8a2V5Q29uc2lkZXJhdGlvbnM+VGFzayBCMiBrZXk8L2tleUNvbnNpZGVyYXRpb25zPgotICA8cHVycG9zZT5UYXNrIEIyIHBvcnBvaXNlPC9wdXJwb3NlPgotICA8YWx0ZXJuYXRpdmVzPlRhc2sgQjIgYWx0PC9hbHRlcm5hdGl2ZXM+Ci08L29yZy5lY2xpcHNlLmVwZi51bWE6VGFza0Rlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL3Rvb2xzL3Rvb2xfQjEueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL3Rvb2xzL3Rvb2xfQjEueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZDZjNzk1Li4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi90b29scy90b29sX0IxLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnREZXNjcmlwdGlvbiB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCIgeG1pOmlkPSItWWxqRVlHQjRmUENFNUx2VDREYVB0QSIgbmFtZT0idG9vbF9CMSxfME5jdkFCOHlFZHFnQklUdUlDTEpFdyIgZ3VpZD0iLVlsakVZR0I0ZlBDRTVMdlQ0RGFQdEEiIGNoYW5nZURhdGU9IjIwMDUtMDktMDZUMTc6MTU6MjkuMDAwLTA3MDAiPgotICA8bWFpbkRlc2NyaXB0aW9uPlRvb2wgQjEgbWFpbjwvbWFpbkRlc2NyaXB0aW9uPgotICA8a2V5Q29uc2lkZXJhdGlvbnM+VG9vbCBCMSBrZXk8L2tleUNvbnNpZGVyYXRpb25zPgotPC9vcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnREZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi90b29scy90b29sX0IyLnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi90b29scy90b29sX0IyLnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDA3NDFhNS4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvdG9vbHMvdG9vbF9CMi54bWkKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08b3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50RGVzY3JpcHRpb24geG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiIHhtaTppZD0iLTNfLUFhenpzX2w0M0hPT0c4REFzWXciIG5hbWU9InRvb2xfQjIsXzE3SHh3Qjh5RWRxZ0JJVHVJQ0xKRXciIGd1aWQ9Ii0zXy1BYXp6c19sNDNIT09HOERBc1l3IiBjaGFuZ2VEYXRlPSIyMDA1LTA5LTA2VDE3OjE1OjU4LjcxOS0wNzAwIj4KLSAgPG1haW5EZXNjcmlwdGlvbj5Ub29sIEIyIG1haW48L21haW5EZXNjcmlwdGlvbj4KLSAgPGtleUNvbnNpZGVyYXRpb25zPlRvb2wgQjIga2V5PC9rZXlDb25zaWRlcmF0aW9ucz4KLTwvb3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvd29ya3Byb2R1Y3RzL2FydGlmYWN0X0IxLnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi93b3JrcHJvZHVjdHMvYXJ0aWZhY3RfQjEueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlY2EzMDU1Li4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi93b3JrcHJvZHVjdHMvYXJ0aWZhY3RfQjEueG1pCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxvcmcuZWNsaXBzZS5lcGYudW1hOkFydGlmYWN0RGVzY3JpcHRpb24geG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiIHhtaTppZD0iLS11Z2l2ejExTDZMYmpPdnY1M3JfVGciIG5hbWU9ImFydGlmYWN0X0IxLF9tcUozQUI4UEVkcXNoTU5TSTA3WE9nIiBndWlkPSItLXVnaXZ6MTFMNkxiak92djUzcl9UZyIgY2hhbmdlRGF0ZT0iMjAwNS0wOS0wNlQxNTozNzo0MC4wNzgtMDcwMCI+Ci0gIDxtYWluRGVzY3JpcHRpb24+QXJ0aWZhY3QgQjEgbWFpbjwvbWFpbkRlc2NyaXB0aW9uPgotICA8a2V5Q29uc2lkZXJhdGlvbnM+QXJ0aWZhY3QgQjEga2V5PC9rZXlDb25zaWRlcmF0aW9ucz4KLSAgPGV4dGVybmFsSWQ+QXJ0aWZhY3QgQjEgdW5pcXVlIElEPC9leHRlcm5hbElkPgotICA8cHVycG9zZT5BcnRpZmFjdCBCMSBwb3Jwb2lzZTwvcHVycG9zZT4KLSAgPGltcGFjdE9mTm90SGF2aW5nPkFydGlmYWN0IEIxIGltcGFjdDwvaW1wYWN0T2ZOb3RIYXZpbmc+Ci0gIDxyZWFzb25zRm9yTm90TmVlZGluZz5BcnRpZmFjdCBCMSByZWFzb248L3JlYXNvbnNGb3JOb3ROZWVkaW5nPgotICA8YnJpZWZPdXRsaW5lPkFydGlmYWN0IEIxIG91dGxpbmU8L2JyaWVmT3V0bGluZT4KLSAgPHJlcHJlc2VudGF0aW9uT3B0aW9ucz5BcnRpZmFjdCBCMSByZXA8L3JlcHJlc2VudGF0aW9uT3B0aW9ucz4KLTwvb3JnLmVjbGlwc2UuZXBmLnVtYTpBcnRpZmFjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL3dvcmtwcm9kdWN0cy9hcnRpZmFjdF9CMi54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvd29ya3Byb2R1Y3RzL2FydGlmYWN0X0IyLnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGUwYjNkYi4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvd29ya3Byb2R1Y3RzL2FydGlmYWN0X0IyLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08b3JnLmVjbGlwc2UuZXBmLnVtYTpBcnRpZmFjdERlc2NyaXB0aW9uIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6ZXBmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZiIgZXBmOnZlcnNpb249IjEuMi4wIiB4bWk6aWQ9Ii1NamVlZWRfcF9NUXlnclc3REJrQXJnIiBuYW1lPSJhcnRpZmFjdF9CMixfX3lHN2NCOG1FZHExT28tRG93ZHBCZyIgZ3VpZD0iLU1qZWVlZF9wX01ReWdyVzdEQmtBcmciIGNoYW5nZURhdGU9IjIwMDUtMDktMDZUMTU6Mzk6MDQuOTY5LTA3MDAiPgotICA8bWFpbkRlc2NyaXB0aW9uPkFydGlmYWN0IEIyIG1haW48L21haW5EZXNjcmlwdGlvbj4KLSAgPGtleUNvbnNpZGVyYXRpb25zPkFydGlmYWN0IEIyIGtleTwva2V5Q29uc2lkZXJhdGlvbnM+Ci0gIDxleHRlcm5hbElkPkFydGlmYWN0IEIyIHVuaXF1ZSBJRDwvZXh0ZXJuYWxJZD4KLSAgPHB1cnBvc2U+QXJ0aWZhY3QgQjIgcG9ycG9pc2U8L3B1cnBvc2U+Ci0gIDxpbXBhY3RPZk5vdEhhdmluZz5BcnRpZmFjdCBCMiBpbXBhY3Q8L2ltcGFjdE9mTm90SGF2aW5nPgotICA8cmVhc29uc0Zvck5vdE5lZWRpbmc+QXJ0aWZhY3QgQjIgcmVhc29uPC9yZWFzb25zRm9yTm90TmVlZGluZz4KLSAgPGJyaWVmT3V0bGluZT5BcnRpZmFjdCBCMiBvdXRsaW5lPC9icmllZk91dGxpbmU+Ci0gIDxyZXByZXNlbnRhdGlvbk9wdGlvbnM+QXJ0aWZhY3QgQjIgcmVwPC9yZXByZXNlbnRhdGlvbk9wdGlvbnM+Ci08L29yZy5lY2xpcHNlLmVwZi51bWE6QXJ0aWZhY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi93b3JrcHJvZHVjdHMvZGVsaXZlcmFibGVfQjEueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL3dvcmtwcm9kdWN0cy9kZWxpdmVyYWJsZV9CMS54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViOWI1ZGUuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL3dvcmtwcm9kdWN0cy9kZWxpdmVyYWJsZV9CMS54bWkKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPG9yZy5lY2xpcHNlLmVwZi51bWE6RGVsaXZlcmFibGVEZXNjcmlwdGlvbiB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCIgeG1pOmlkPSItZ3VmeDRSYUZ3aGlVaGhCa29xM3ZaZyIgbmFtZT0iZGVsaXZlcmFibGVfQjEsX1pIZjJZQjhuRWRxMU9vLURvd2RwQmciIGd1aWQ9Ii1ndWZ4NFJhRndoaVVoaEJrb3EzdlpnIiBjaGFuZ2VEYXRlPSIyMDA1LTA5LTA2VDE1OjQyOjE0Ljc4MS0wNzAwIj4KLSAgPG1haW5EZXNjcmlwdGlvbj5EZWxpdmVyYWJsZSBCMSBtYWluPC9tYWluRGVzY3JpcHRpb24+Ci0gIDxrZXlDb25zaWRlcmF0aW9ucz5EZWxpdmVyYWJsZSBCMSBrZXk8L2tleUNvbnNpZGVyYXRpb25zPgotICA8ZXh0ZXJuYWxJZD5EZWxpdmVyYWJsZSBCMSB1bmlxdWUgSUQ8L2V4dGVybmFsSWQ+Ci0gIDxwdXJwb3NlPkRlbGl2ZXJhYmxlIEIxIHBvcnBvaXNlPC9wdXJwb3NlPgotICA8aW1wYWN0T2ZOb3RIYXZpbmc+RGVsaXZlcmFibGUgQjEgaW1wYWN0PC9pbXBhY3RPZk5vdEhhdmluZz4KLSAgPHJlYXNvbnNGb3JOb3ROZWVkaW5nPkRlbGl2ZXJhYmxlIEIxIHJlYXNvbjwvcmVhc29uc0Zvck5vdE5lZWRpbmc+Ci0gIDxleHRlcm5hbERlc2NyaXB0aW9uPkRlbGl2ZXJhYmxlIEIxIGV4dGVybjwvZXh0ZXJuYWxEZXNjcmlwdGlvbj4KLSAgPHBhY2thZ2luZ0d1aWRhbmNlPkRlbGl2ZXJhYmxlIEIxIHBhY2s8L3BhY2thZ2luZ0d1aWRhbmNlPgotPC9vcmcuZWNsaXBzZS5lcGYudW1hOkRlbGl2ZXJhYmxlRGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvd29ya3Byb2R1Y3RzL2RlbGl2ZXJhYmxlX0IyLnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi93b3JrcHJvZHVjdHMvZGVsaXZlcmFibGVfQjIueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMTBkYjQyLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi93b3JrcHJvZHVjdHMvZGVsaXZlcmFibGVfQjIueG1pCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxvcmcuZWNsaXBzZS5lcGYudW1hOkRlbGl2ZXJhYmxlRGVzY3JpcHRpb24geG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiIHhtaTppZD0iLUt4TnNGd2c5Y040LTFzNWJzM3haSWciIG5hbWU9ImRlbGl2ZXJhYmxlX0IyLF9ucUZXRUI4bkVkcTFPby1Eb3dkcEJnIiBndWlkPSItS3hOc0Z3ZzljTjQtMXM1YnMzeFpJZyIgY2hhbmdlRGF0ZT0iMjAwNS0wOS0wNlQxNTo0MzozMC41NjItMDcwMCI+Ci0gIDxtYWluRGVzY3JpcHRpb24+RGVsaXZlcmFibGUgQjIgbWFpbjwvbWFpbkRlc2NyaXB0aW9uPgotICA8a2V5Q29uc2lkZXJhdGlvbnM+RGVsaXZlcmFibGUgQjIga2V5PC9rZXlDb25zaWRlcmF0aW9ucz4KLSAgPGV4dGVybmFsSWQ+RGVsaXZlcmFibGUgQjIgdW5pcXVlIElEPC9leHRlcm5hbElkPgotICA8cHVycG9zZT5EZWxpdmVyYWJsZSBCMiBwb3Jwb2lzZTwvcHVycG9zZT4KLSAgPGltcGFjdE9mTm90SGF2aW5nPkRlbGl2ZXJhYmxlIEIyIGltcGFjdDwvaW1wYWN0T2ZOb3RIYXZpbmc+Ci0gIDxyZWFzb25zRm9yTm90TmVlZGluZz5EZWxpdmVyYWJsZSBCMiByZWFzb248L3JlYXNvbnNGb3JOb3ROZWVkaW5nPgotICA8ZXh0ZXJuYWxEZXNjcmlwdGlvbj5EZWxpdmVyYWJsZSBCMiBleHRlcm48L2V4dGVybmFsRGVzY3JpcHRpb24+Ci0gIDxwYWNrYWdpbmdHdWlkYW5jZT5EZWxpdmVyYWJsZSBCMiBwYWNrPC9wYWNrYWdpbmdHdWlkYW5jZT4KLTwvb3JnLmVjbGlwc2UuZXBmLnVtYTpEZWxpdmVyYWJsZURlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL3dvcmtwcm9kdWN0cy9vdXRjb21lX0IxLnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi93b3JrcHJvZHVjdHMvb3V0Y29tZV9CMS54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2MTU2MTcuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL3dvcmtwcm9kdWN0cy9vdXRjb21lX0IxLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxvcmcuZWNsaXBzZS5lcGYudW1hOldvcmtQcm9kdWN0RGVzY3JpcHRpb24geG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiIHhtaTppZD0iLXliVFB1Vk80Ukd3bl93UWx2QVdhYXciIG5hbWU9Im91dGNvbWVfQjEsX2NYWHJzQjhuRWRxMU9vLURvd2RwQmciIGd1aWQ9Ii15YlRQdVZPNFJHd25fd1FsdkFXYWF3IiBjaGFuZ2VEYXRlPSIyMDA1LTA5LTA2VDE1OjQ3OjM4LjEwOS0wNzAwIj4KLSAgPG1haW5EZXNjcmlwdGlvbj5PdXRjb21lIEIxIG1haW48L21haW5EZXNjcmlwdGlvbj4KLSAgPGtleUNvbnNpZGVyYXRpb25zPk91dGNvbWUgQjEga2V5PC9rZXlDb25zaWRlcmF0aW9ucz4KLSAgPGV4dGVybmFsSWQ+T3V0Y29tZSBCMSB1bmlxdWUgSUQ8L2V4dGVybmFsSWQ+Ci0gIDxwdXJwb3NlPk91dGNvbWUgQjEgcG9ycG9pc2U8L3B1cnBvc2U+Ci0gIDxpbXBhY3RPZk5vdEhhdmluZz5PdXRjb21lIEIxIGltcGFjdDwvaW1wYWN0T2ZOb3RIYXZpbmc+Ci0gIDxyZWFzb25zRm9yTm90TmVlZGluZz5PdXRjb21lIEIxIHJlYXNvbjwvcmVhc29uc0Zvck5vdE5lZWRpbmc+Ci08L29yZy5lY2xpcHNlLmVwZi51bWE6V29ya1Byb2R1Y3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi93b3JrcHJvZHVjdHMvb3V0Y29tZV9CMi54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvd29ya3Byb2R1Y3RzL291dGNvbWVfQjIueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YmFkNDZmLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi93b3JrcHJvZHVjdHMvb3V0Y29tZV9CMi54bWkKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08b3JnLmVjbGlwc2UuZXBmLnVtYTpXb3JrUHJvZHVjdERlc2NyaXB0aW9uIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6ZXBmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZiIgZXBmOnZlcnNpb249IjEuMi4wIiB4bWk6aWQ9Ii1ITlhMSDFIZ2RuNzJXWEc3N0FIR1pBIiBuYW1lPSJvdXRjb21lX0IyLF9hc0ZPa0I4bkVkcTFPby1Eb3dkcEJnIiBndWlkPSItSE5YTEgxSGdkbjcyV1hHNzdBSEdaQSIgY2hhbmdlRGF0ZT0iMjAwNS0wOS0wNlQxNTo0NjowMS4xNTYtMDcwMCI+Ci0gIDxtYWluRGVzY3JpcHRpb24+T3V0Y29tZSBCMiBtYWluPC9tYWluRGVzY3JpcHRpb24+Ci0gIDxrZXlDb25zaWRlcmF0aW9ucz5PdXRjb21lIEIyIGtleTwva2V5Q29uc2lkZXJhdGlvbnM+Ci0gIDxleHRlcm5hbElkPk91dGNvbWUgQjIgdW5pcXVlIElEPC9leHRlcm5hbElkPgotICA8cHVycG9zZT5PdXRjb21lIEIyIHBvcnBvaXNlPC9wdXJwb3NlPgotICA8aW1wYWN0T2ZOb3RIYXZpbmc+T3V0Y29tZSBCMiBpbXBhY3Q8L2ltcGFjdE9mTm90SGF2aW5nPgotICA8cmVhc29uc0Zvck5vdE5lZWRpbmc+T3V0Y29tZSBCMiByZWFzb248L3JlYXNvbnNGb3JOb3ROZWVkaW5nPgotPC9vcmcuZWNsaXBzZS5lcGYudW1hOldvcmtQcm9kdWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvd29ya3Byb2R1Y3R0eXBlcy93b3JrX3Byb2R1Y3RfdHlwZV9CMS54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvd29ya3Byb2R1Y3R0eXBlcy93b3JrX3Byb2R1Y3RfdHlwZV9CMS54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmMTY2MzYuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL3dvcmtwcm9kdWN0dHlwZXMvd29ya19wcm9kdWN0X3R5cGVfQjEueG1pCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPG9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudERlc2NyaXB0aW9uIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6ZXBmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZiIgZXBmOnZlcnNpb249IjEuMi4wIiB4bWk6aWQ9Ii1maDhYbzlJSXEyRlp5RGRwMWVpZG9nIiBuYW1lPSJ3b3JrX3Byb2R1Y3RfdHlwZV9CMSxfeEtzSW9COHlFZHFnQklUdUlDTEpFdyIgZ3VpZD0iLWZoOFhvOUlJcTJGWnlEZHAxZWlkb2ciIGNoYW5nZURhdGU9IjIwMDUtMDktMDZUMTc6MTc6MjguNDg0LTA3MDAiPgotICA8bWFpbkRlc2NyaXB0aW9uPldvcmsgUHJvZHVjdCBUeXBlIEIxIG1haW48L21haW5EZXNjcmlwdGlvbj4KLSAgPGtleUNvbnNpZGVyYXRpb25zPldvcmsgUHJvZHVjdCBUeXBlIEIxIGtleTwva2V5Q29uc2lkZXJhdGlvbnM+Ci08L29yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL3dvcmtwcm9kdWN0dHlwZXMvd29ya19wcm9kdWN0X3R5cGVfQjIueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL3dvcmtwcm9kdWN0dHlwZXMvd29ya19wcm9kdWN0X3R5cGVfQjIueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NGY1YmQxLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi93b3JrcHJvZHVjdHR5cGVzL3dvcmtfcHJvZHVjdF90eXBlX0IyLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnREZXNjcmlwdGlvbiB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCIgeG1pOmlkPSItS29VbnUyYkxfRl9PXzMwU2Q1UEo5dyIgbmFtZT0id29ya19wcm9kdWN0X3R5cGVfQjIsX3lDa0wwQjh5RWRxZ0JJVHVJQ0xKRXciIGd1aWQ9Ii1Lb1VudTJiTF9GX09fMzBTZDVQSjl3IiBjaGFuZ2VEYXRlPSIyMDA1LTA5LTA2VDE3OjA0OjU1Ljc2Ni0wNzAwIj4KLSAgPG1haW5EZXNjcmlwdGlvbj5Xb3JrIFByb2R1Y3QgVHlwZSBCMiBtYWluPC9tYWluRGVzY3JpcHRpb24+Ci0gIDxrZXlDb25zaWRlcmF0aW9ucz5Xb3JrIFByb2R1Y3QgVHlwZSBCMiBrZXk8L2tleUNvbnNpZGVyYXRpb25zPgotPC9vcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnREZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL2NvbmZpZ3VyYXRpb25zL0NvbmZpZyBBLnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL2NvbmZpZ3VyYXRpb25zL0NvbmZpZyBBLnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTM3MmRjZS4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9jb25maWd1cmF0aW9ucy9Db25maWcgQS54bWkKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPG9yZy5lY2xpcHNlLmVwZi51bWE6TWV0aG9kQ29uZmlndXJhdGlvbiB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCIgeG1pOmlkPSJfcnJtQ0lCQWRFZHE3RnJjX3lNaFEtQSIgbmFtZT0iQ29uZmlnIEEiIGd1aWQ9Il9ycm1DSUJBZEVkcTdGcmNfeU1oUS1BIiBicmllZkRlc2NyaXB0aW9uPSJDb25maWcgQSBkZXNjcmlwdGlvbiI+Ci0gIDxtZXRob2RQbHVnaW5TZWxlY3Rpb24gaHJlZj0idW1hOi8vX3lVZUxJQS1QRWRxTDJPMVBKVjljWkEjX3lVZUxJQS1QRWRxTDJPMVBKVjljWkEiLz4KLSAgPG1ldGhvZFBsdWdpblNlbGVjdGlvbiBocmVmPSJ1bWE6Ly9fZWN5NXdCTTNFZHFxbmRpLWdEdXhwdyNfZWN5NXdCTTNFZHFxbmRpLWdEdXhwdyIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgaHJlZj0idW1hOi8vX3lVZUxJQS1QRWRxTDJPMVBKVjljWkEjX3lVZUxMQS1QRWRxTDJPMVBKVjljWkEiLz4KLSAgPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24geHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIGhyZWY9InVtYTovL195VWVMSUEtUEVkcUwyTzFQSlY5Y1pBI195VWVMSVEtUEVkcUwyTzFQSlY5Y1pBIi8+Ci0gIDxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiBocmVmPSJ1bWE6Ly9feVVlTElBLVBFZHFMMk8xUEpWOWNaQSNfemlfendBLVBFZHFMMk8xUEpWOWNaQSIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzUGFja2FnZSIgaHJlZj0idW1hOi8vX3lVZUxJQS1QRWRxTDJPMVBKVjljWkEjX3lVZUxMUS1QRWRxTDJPMVBKVjljWkEiLz4KLSAgPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24geHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc1BhY2thZ2UiIGhyZWY9InVtYTovL195VWVMSUEtUEVkcUwyTzFQSlY5Y1pBI19UUWJuSUEtV0VkcUwyTzFQSlY5Y1pBIi8+Ci0gIDxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NDb21wb25lbnQiIGhyZWY9InVtYTovL180c0N0c0R6Z0VkcTV5c0ZPTnIxQkdRI180c0N0c0R6Z0VkcTV5c0ZPTnIxQkdRIi8+Ci0gIDxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NQYWNrYWdlIiBocmVmPSJ1bWE6Ly9fNHNDdHNEemdFZHE1eXNGT05yMUJHUSNfRGFIa2dEemlFZHE1eXNGT05yMUJHUSIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzUGFja2FnZSIgaHJlZj0idW1hOi8vXzRzQ3RzRHpnRWRxNXlzRk9OcjFCR1EjX0VGVnJ3RHppRWRxNXlzRk9OcjFCR1EiLz4KLSAgPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24geHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc1BhY2thZ2UiIGhyZWY9InVtYTovL180c0N0c0R6Z0VkcTV5c0ZPTnIxQkdRI19FNzNySUR6aUVkcTV5c0ZPTnIxQkdRIi8+Ci0gIDxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NQYWNrYWdlIiBocmVmPSJ1bWE6Ly9fNHNDdHNEemdFZHE1eXNGT05yMUJHUSNfQlM2Z0VEemxFZHE1eXNGT05yMUJHUSIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzQ29tcG9uZW50IiBocmVmPSJ1bWE6Ly9fWnRaYk1FREZFZHFPOU0zZnVrWUFfQSNfWnRaYk1FREZFZHFPOU0zZnVrWUFfQSIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzUGFja2FnZSIgaHJlZj0idW1hOi8vX1p0WmJNRURGRWRxTzlNM2Z1a1lBX0EjX2xDN3dFRURGRWRxTzlNM2Z1a1lBX0EiLz4KLSAgPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24geHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc1BhY2thZ2UiIGhyZWY9InVtYTovL19adFpiTUVERkVkcU85TTNmdWtZQV9BI19kWERkOEVEUEVkcXJoc1poM1FOQU1RIi8+Ci0gIDxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NDb21wb25lbnQiIGhyZWY9InVtYTovL19kQmh2a0VBdkVkcUZxSXU4LWNrb2xnI19kQmh2a0VBdkVkcUZxSXU4LWNrb2xnIi8+Ci0gIDxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NQYWNrYWdlIiBocmVmPSJ1bWE6Ly9fZEJodmtFQXZFZHFGcUl1OC1ja29sZyNfZVpTendFQXZFZHFGcUl1OC1ja29sZyIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzQ29tcG9uZW50IiBocmVmPSJ1bWE6Ly9fYUhVU1FCQk5FZHFCczdLaGRWTFJMQSNfYUhVU1FCQk5FZHFCczdLaGRWTFJMQSIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzUGFja2FnZSIgaHJlZj0idW1hOi8vX2FIVVNRQkJORWRxQnM3S2hkVkxSTEEjX0VXMDlNRDBLRWRxakFJNzdESHZCd0EiLz4KLSAgPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24geHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc1BhY2thZ2UiIGhyZWY9InVtYTovL195VWVMSUEtUEVkcUwyTzFQSlY5Y1pBI195VWVMTGctUEVkcUwyTzFQSlY5Y1pBIi8+Ci0gIDxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NQYWNrYWdlIiBocmVmPSJ1bWE6Ly9feVVlTElBLVBFZHFMMk8xUEpWOWNaQSNfalVOZm9CQk5FZHFCczdLaGRWTFJMQSIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzQ29tcG9uZW50IiBocmVmPSJ1bWE6Ly9fdXE1SzhCTTFFZHFxbmRpLWdEdXhwdyNfdXE1SzhCTTFFZHFxbmRpLWdEdXhwdyIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzQ29tcG9uZW50IiBocmVmPSJ1bWE6Ly9fVzZhNGNCQk5FZHFCczdLaGRWTFJMQSNfVzZhNGNCQk5FZHFCczdLaGRWTFJMQSIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgaHJlZj0idW1hOi8vX2VjeTV3Qk0zRWRxcW5kaS1nRHV4cHcjX2VjeTV6Qk0zRWRxcW5kaS1nRHV4cHciLz4KLSAgPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24geHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIGhyZWY9InVtYTovL19lY3k1d0JNM0VkcXFuZGktZ0R1eHB3I19lY3k1d1JNM0VkcXFuZGktZ0R1eHB3Ii8+Ci0gIDxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiBocmVmPSJ1bWE6Ly9fZWN5NXdCTTNFZHFxbmRpLWdEdXhwdyNfNW5yR1lCOE9FZHFzaE1OU0kwN1hPZyIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzUGFja2FnZSIgaHJlZj0idW1hOi8vX2VjeTV3Qk0zRWRxcW5kaS1nRHV4cHcjX2VjeTV6Uk0zRWRxcW5kaS1nRHV4cHciLz4KLSAgPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24geHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc1BhY2thZ2UiIGhyZWY9InVtYTovL19lY3k1d0JNM0VkcXFuZGktZ0R1eHB3I182X3VwTUI4MEVkcWdCSVR1SUNMSkV3Ii8+Ci0gIDxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NQYWNrYWdlIiBocmVmPSJ1bWE6Ly9fZWN5NXdCTTNFZHFxbmRpLWdEdXhwdyNfX1U1U29CODBFZHFnQklUdUlDTEpFdyIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzQ29tcG9uZW50IiBocmVmPSJ1bWE6Ly9fSVBkWjRCODFFZHFnQklUdUlDTEpFdyNfSVBkWjRCODFFZHFnQklUdUlDTEpFdyIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzQ29tcG9uZW50IiBocmVmPSJ1bWE6Ly9fRTZFeWNCODFFZHFnQklUdUlDTEpFdyNfRTZFeWNCODFFZHFnQklUdUlDTEpFdyIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzQ29tcG9uZW50IiBocmVmPSJ1bWE6Ly9fNTZ4blFFQTVFZHFGcUl1OC1ja29sZyNfNTZ4blFFQTVFZHFGcUl1OC1ja29sZyIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzUGFja2FnZSIgaHJlZj0idW1hOi8vXzU2eG5RRUE1RWRxRnFJdTgtY2tvbGcjXzU2N1lRRUE1RWRxRnFJdTgtY2tvbGciLz4KLSAgPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24geHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc1BhY2thZ2UiIGhyZWY9InVtYTovL19lY3k1d0JNM0VkcXFuZGktZ0R1eHB3I19lY3k1emhNM0VkcXFuZGktZ0R1eHB3Ii8+Ci0gIDxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NQYWNrYWdlIiBocmVmPSJ1bWE6Ly9fZWN5NXdCTTNFZHFxbmRpLWdEdXhwdyNfTDZKaThCODFFZHFnQklUdUlDTEpFdyIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzUGFja2FnZSIgaHJlZj0idW1hOi8vX2VjeTV3Qk0zRWRxcW5kaS1nRHV4cHcjX04wZklzQjgxRWRxZ0JJVHVJQ0xKRXciLz4KLSAgPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24geHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc0NvbXBvbmVudCIgaHJlZj0idW1hOi8vX1YwVjdNQjgxRWRxZ0JJVHVJQ0xKRXcjX1YwVjdNQjgxRWRxZ0JJVHVJQ0xKRXciLz4KLSAgPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24geHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc0NvbXBvbmVudCIgaHJlZj0idW1hOi8vX1JmeHVzQjgxRWRxZ0JJVHVJQ0xKRXcjX1JmeHVzQjgxRWRxZ0JJVHVJQ0xKRXciLz4KLSAgPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24geHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIGhyZWY9InVtYTovL195VWVMSUEtUEVkcUwyTzFQSlY5Y1pBI195VWVMSnctUEVkcUwyTzFQSlY5Y1pBIi8+Ci0gIDxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiBocmVmPSJ1bWE6Ly9feVVlTElBLVBFZHFMMk8xUEpWOWNaQSNfeVVlTElnLVBFZHFMMk8xUEpWOWNaQSIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgaHJlZj0idW1hOi8vX3lVZUxJQS1QRWRxTDJPMVBKVjljWkEjX3lVZUxKZy1QRWRxTDJPMVBKVjljWkEiLz4KLSAgPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24geHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIGhyZWY9InVtYTovL195VWVMSUEtUEVkcUwyTzFQSlY5Y1pBI195VWVMSkEtUEVkcUwyTzFQSlY5Y1pBIi8+Ci0gIDxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiBocmVmPSJ1bWE6Ly9feVVlTElBLVBFZHFMMk8xUEpWOWNaQSNfeVVlTEtRLVBFZHFMMk8xUEpWOWNaQSIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgaHJlZj0idW1hOi8vX3lVZUxJQS1QRWRxTDJPMVBKVjljWkEjX3lVZUxLZy1QRWRxTDJPMVBKVjljWkEiLz4KLSAgPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24geHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIGhyZWY9InVtYTovL195VWVMSUEtUEVkcUwyTzFQSlY5Y1pBI195VWVMSlEtUEVkcUwyTzFQSlY5Y1pBIi8+Ci0gIDxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiBocmVmPSJ1bWE6Ly9feVVlTElBLVBFZHFMMk8xUEpWOWNaQSNfeVVlTEl3LVBFZHFMMk8xUEpWOWNaQSIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgaHJlZj0idW1hOi8vX2VjeTV3Qk0zRWRxcW5kaS1nRHV4cHcjX2VjeTV4aE0zRWRxcW5kaS1nRHV4cHciLz4KLSAgPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24geHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIGhyZWY9InVtYTovL19lY3k1d0JNM0VkcXFuZGktZ0R1eHB3I19lY3k1d2hNM0VkcXFuZGktZ0R1eHB3Ii8+Ci0gIDxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiBocmVmPSJ1bWE6Ly9fZWN5NXdCTTNFZHFxbmRpLWdEdXhwdyNfZWN5NXhCTTNFZHFxbmRpLWdEdXhwdyIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgaHJlZj0idW1hOi8vX2VjeTV3Qk0zRWRxcW5kaS1nRHV4cHcjX2VjeTV4eE0zRWRxcW5kaS1nRHV4cHciLz4KLSAgPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24geHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIGhyZWY9InVtYTovL19lY3k1d0JNM0VkcXFuZGktZ0R1eHB3I19lY3k1d3hNM0VkcXFuZGktZ0R1eHB3Ii8+Ci0gIDxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiBocmVmPSJ1bWE6Ly9fZWN5NXdCTTNFZHFxbmRpLWdEdXhwdyNfZWN5NXlSTTNFZHFxbmRpLWdEdXhwdyIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgaHJlZj0idW1hOi8vX2VjeTV3Qk0zRWRxcW5kaS1nRHV4cHcjX2VjeTV5aE0zRWRxcW5kaS1nRHV4cHciLz4KLSAgPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24geHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIGhyZWY9InVtYTovL19lY3k1d0JNM0VkcXFuZGktZ0R1eHB3I19lY3k1eFJNM0VkcXFuZGktZ0R1eHB3Ii8+Ci0gIDxwcm9jZXNzVmlld3MgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q3VzdG9tQ2F0ZWdvcnkiIGhyZWY9InVtYTovL195VWVMSUEtUEVkcUwyTzFQSlY5Y1pBI19NS1Bua0EtV0VkcUwyTzFQSlY5Y1pBIi8+Ci08L29yZy5lY2xpcHNlLmVwZi51bWE6TWV0aG9kQ29uZmlndXJhdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL2NvbmZpZ3VyYXRpb25zL0NvbmZpZyBCLnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL2NvbmZpZ3VyYXRpb25zL0NvbmZpZyBCLnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWZlN2I1Ny4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9jb25maWd1cmF0aW9ucy9Db25maWcgQi54bWkKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPG9yZy5lY2xpcHNlLmVwZi51bWE6TWV0aG9kQ29uZmlndXJhdGlvbiB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCIgeG1pOmlkPSJfVUxxQklCTTNFZHFxbmRpLWdEdXhwdyIgbmFtZT0iQ29uZmlnIEIiIGd1aWQ9Il9VTHFCSUJNM0VkcXFuZGktZ0R1eHB3Ij4KLSAgPG1ldGhvZFBsdWdpblNlbGVjdGlvbiBocmVmPSJ1bWE6Ly9fZWN5NXdCTTNFZHFxbmRpLWdEdXhwdyNfZWN5NXdCTTNFZHFxbmRpLWdEdXhwdyIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgaHJlZj0idW1hOi8vX2VjeTV3Qk0zRWRxcW5kaS1nRHV4cHcjX2VjeTV6Qk0zRWRxcW5kaS1nRHV4cHciLz4KLSAgPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24geHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIGhyZWY9InVtYTovL19lY3k1d0JNM0VkcXFuZGktZ0R1eHB3I19lY3k1d1JNM0VkcXFuZGktZ0R1eHB3Ii8+Ci0gIDxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiBocmVmPSJ1bWE6Ly9fZWN5NXdCTTNFZHFxbmRpLWdEdXhwdyNfNW5yR1lCOE9FZHFzaE1OU0kwN1hPZyIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzUGFja2FnZSIgaHJlZj0idW1hOi8vX2VjeTV3Qk0zRWRxcW5kaS1nRHV4cHcjX2VjeTV6Uk0zRWRxcW5kaS1nRHV4cHciLz4KLSAgPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24geHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc1BhY2thZ2UiIGhyZWY9InVtYTovL19lY3k1d0JNM0VkcXFuZGktZ0R1eHB3I182X3VwTUI4MEVkcWdCSVR1SUNMSkV3Ii8+Ci0gIDxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NQYWNrYWdlIiBocmVmPSJ1bWE6Ly9fZWN5NXdCTTNFZHFxbmRpLWdEdXhwdyNfX1U1U29CODBFZHFnQklUdUlDTEpFdyIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzQ29tcG9uZW50IiBocmVmPSJ1bWE6Ly9fSVBkWjRCODFFZHFnQklUdUlDTEpFdyNfSVBkWjRCODFFZHFnQklUdUlDTEpFdyIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzQ29tcG9uZW50IiBocmVmPSJ1bWE6Ly9fRTZFeWNCODFFZHFnQklUdUlDTEpFdyNfRTZFeWNCODFFZHFnQklUdUlDTEpFdyIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzQ29tcG9uZW50IiBocmVmPSJ1bWE6Ly9fNTZ4blFFQTVFZHFGcUl1OC1ja29sZyNfNTZ4blFFQTVFZHFGcUl1OC1ja29sZyIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzUGFja2FnZSIgaHJlZj0idW1hOi8vXzU2eG5RRUE1RWRxRnFJdTgtY2tvbGcjXzU2N1lRRUE1RWRxRnFJdTgtY2tvbGciLz4KLSAgPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24geHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc1BhY2thZ2UiIGhyZWY9InVtYTovL19lY3k1d0JNM0VkcXFuZGktZ0R1eHB3I19lY3k1emhNM0VkcXFuZGktZ0R1eHB3Ii8+Ci0gIDxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NQYWNrYWdlIiBocmVmPSJ1bWE6Ly9fZWN5NXdCTTNFZHFxbmRpLWdEdXhwdyNfTDZKaThCODFFZHFnQklUdUlDTEpFdyIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzUGFja2FnZSIgaHJlZj0idW1hOi8vX2VjeTV3Qk0zRWRxcW5kaS1nRHV4cHcjX04wZklzQjgxRWRxZ0JJVHVJQ0xKRXciLz4KLSAgPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24geHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc0NvbXBvbmVudCIgaHJlZj0idW1hOi8vX1YwVjdNQjgxRWRxZ0JJVHVJQ0xKRXcjX1YwVjdNQjgxRWRxZ0JJVHVJQ0xKRXciLz4KLSAgPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24geHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc0NvbXBvbmVudCIgaHJlZj0idW1hOi8vX1JmeHVzQjgxRWRxZ0JJVHVJQ0xKRXcjX1JmeHVzQjgxRWRxZ0JJVHVJQ0xKRXciLz4KLSAgPHByb2Nlc3NWaWV3cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDdXN0b21DYXRlZ29yeSIgaHJlZj0idW1hOi8vX2VjeTV3Qk0zRWRxcW5kaS1nRHV4cHcjXzNFU1pRQjh5RWRxZ0JJVHVJQ0xKRXciLz4KLTwvb3JnLmVjbGlwc2UuZXBmLnVtYTpNZXRob2RDb25maWd1cmF0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvY29uZmlndXJhdGlvbnMvcHJvY19GYW1pbHlfQS54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9jb25maWd1cmF0aW9ucy9wcm9jX0ZhbWlseV9BLnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTcwYjliMS4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9jb25maWd1cmF0aW9ucy9wcm9jX0ZhbWlseV9BLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NGYW1pbHkgeG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiIHhtaTppZD0iX1lVaUFBQjgxRWRxZ0JJVHVJQ0xKRXciIG5hbWU9InByb2NfRmFtaWx5X0EiIGd1aWQ9Il9ZVWlBQUI4MUVkcWdCSVR1SUNMSkV3IiBicmllZkRlc2NyaXB0aW9uPSJwcm9jX0ZhbWlseV9BIGRlc2NyaXB0aW9uIi8+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9saWJyYXJ5LnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL2xpYnJhcnkueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNzRjYjExLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL2xpYnJhcnkueG1pCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTx4bWk6WE1JIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYS5yZXNvdXJjZW1hbmFnZXI9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZXBmL3VtYS9yZXNvdXJjZW1hbmFnZXIuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCI+Ci0gIDxvcmcuZWNsaXBzZS5lcGYudW1hLnJlc291cmNlbWFuYWdlcjpSZXNvdXJjZU1hbmFnZXIgeG1pOmlkPSJfcXp3eXdRLVBFZHFMMk8xUEpWOWNaQSIgZ3VpZD0iX3F6d3l3US1QRWRxTDJPMVBKVjljWkEiPgotICAgIDxzdWJNYW5hZ2VycyB4bWk6aWQ9Il82bEsyQUEtUEVkcUwyTzFQSlY5Y1pBIiBocmVmPSJ1bWE6Ly9feVVlTElBLVBFZHFMMk8xUEpWOWNaQSNfNmxLMkFBLVBFZHFMMk8xUEpWOWNaQSIvPgotICAgIDxzdWJNYW5hZ2VycyB4bWk6aWQ9Il9KUjZ4c0I4UEVkcXNoTU5TSTA3WE9nIiBocmVmPSJ1bWE6Ly9fZWN5NXdCTTNFZHFxbmRpLWdEdXhwdyNfSlI2eHNCOFBFZHFzaE1OU0kwN1hPZyIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iX3F6d3l3Zy1QRWRxTDJPMVBKVjljWkEiIGlkPSJfcXp3eXdBLVBFZHFMMk8xUEpWOWNaQSIgdXJpPSIiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il95VW44SUEtUEVkcUwyTzFQSlY5Y1pBIiBpZD0iX3lVZUxJQS1QRWRxTDJPMVBKVjljWkEiIHVyaT0iUGx1ZyUyMEEvcGx1Z2luLnhtaSIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iX2VkUGxzQk0zRWRxcW5kaS1nRHV4cHciIGlkPSJfZWN5NXdCTTNFZHFxbmRpLWdEdXhwdyIgdXJpPSJQbHVnJTIwQi9wbHVnaW4ueG1pIi8+Ci0gIDwvb3JnLmVjbGlwc2UuZXBmLnVtYS5yZXNvdXJjZW1hbmFnZXI6UmVzb3VyY2VNYW5hZ2VyPgotICA8b3JnLmVjbGlwc2UuZXBmLnVtYTpNZXRob2RMaWJyYXJ5IHhtaTppZD0iX3F6d3l3QS1QRWRxTDJPMVBKVjljWkEiIG5hbWU9IlBhcmlzIiBndWlkPSJfcXp3eXdBLVBFZHFMMk8xUEpWOWNaQSI+Ci0gICAgPG1ldGhvZFBsdWdpbnMgeG1pOmlkPSJfeVVlTElBLVBFZHFMMk8xUEpWOWNaQSIgaHJlZj0idW1hOi8vX3lVZUxJQS1QRWRxTDJPMVBKVjljWkEjX3lVZUxJQS1QRWRxTDJPMVBKVjljWkEiLz4KLSAgICA8bWV0aG9kUGx1Z2lucyB4bWk6aWQ9Il9lY3k1d0JNM0VkcXFuZGktZ0R1eHB3IiBocmVmPSJ1bWE6Ly9fZWN5NXdCTTNFZHFxbmRpLWdEdXhwdyNfZWN5NXdCTTNFZHFxbmRpLWdEdXhwdyIvPgotICA8L29yZy5lY2xpcHNlLmVwZi51bWE6TWV0aG9kTGlicmFyeT4KLTwveG1pOlhNST4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvVENTYW1wbGVDYXNlcy8xc3RUZXN0LnRjIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9UQ1NhbXBsZUNhc2VzLzFzdFRlc3QudGMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzMjljOGYuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9UQ1NhbXBsZUNhc2VzLzFzdFRlc3QudGMKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPE1ldGhvZExpYnJhcnlUZXN0IGRpc2FibGU9ImZhbHNlIj4KLQkKLQk8Q29weUxpYnJhcnkgbGliRm9sZGVyTmFtZT0iLi4vRXhwb3J0SW1wb3J0L1BhcmlzIj4KLQk8L0NvcHlMaWJyYXJ5PgkKLQkKLQk8T3BlbkxpYnJhcnkgbGliRm9sZGVyTmFtZT0iUGFyaXMiPgotCTwvT3BlbkxpYnJhcnk+Ci0JCi0JPEV4cG9ydFBsdWdpbnMgZXhwb3J0Rm9sZGVyTmFtZT0iRXhwb3J0ZWQwMDEiPgotCTwvRXhwb3J0UGx1Z2lucz4KLQkKLQk8T3BlbkxpYnJhcnkgbGliRm9sZGVyTmFtZT0iQmFzZV8xIj4KLQk8L09wZW5MaWJyYXJ5PgotCQotCTxJbXBvcnRQbHVnaW5zIGltcG9ydEZvbGRlck5hbWU9IkV4cG9ydGVkMDAxIj4KLQk8L0ltcG9ydFBsdWdpbnM+Ci0JCi0JPE91dHB1dExpYnJhcnkgZGlzYWJsZT0idHJ1ZSIgLz4KLQkKLQk8T3V0cHV0UGx1Z2luIHBhdGg9IlBsdWcgQSIgcmVjdXJzaXZlPSJmYWxzZSI+Ci0JPC9PdXRwdXRQbHVnaW4+Ci0JCi0JPE91dHB1dENvbmZpZ3VyYXRpb24gcGF0aD0iQ29uZmlnIEEiIHJlY3Vyc2l2ZT0iZmFsc2UiPgotCTwvT3V0cHV0Q29uZmlndXJhdGlvbj4KLQkKLQk8T3V0cHV0TWV0aG9kRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEiIHJlY3Vyc2l2ZT0iZmFsc2UiPgotCTwvT3V0cHV0TWV0aG9kRWxlbWVudD4KLQotCTxPdXRwdXRNZXRob2RFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9yb2xlX0EyIiByZWN1cnNpdmU9InRydWUiPgotCTwvT3V0cHV0TWV0aG9kRWxlbWVudD4KLQotPC9NZXRob2RMaWJyYXJ5VGVzdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL1RDU2FtcGxlQ2FzZXMvMXN0VGVzdC54bWwgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL1RDU2FtcGxlQ2FzZXMvMXN0VGVzdC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzMGMzMDUuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9UQ1NhbXBsZUNhc2VzLzFzdFRlc3QueG1sCisrKyAvZGV2L251bGwKQEAgLTEsODY2OSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPFRlc3Rlck91dHB1dD4KLTxNZXRob2RMaWJyYXJ5IG5hbWU9IkJhc2VfMSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiI+Ci08TWV0aG9kUGx1Z2luIG5hbWU9IlBsdWcgQSIgYnJpZWZEZXNjcmlwdGlvbj0iUGx1ZyBBIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSJQbHVnIEEgQXJ0aHVyIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIHVzZXJDaGFuZ2VhYmxlPSJ0cnVlIj4KLTxDb250ZW50UGFja2FnZSBuYW1lPSJDb250ZW50IiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGdsb2JhbD0iZmFsc2UiPgotPENvbnRlbnRQYWNrYWdlIG5hbWU9IkNhdGVnb3JpZXMiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgZ2xvYmFsPSJmYWxzZSI+Ci08cGFyZW50UGFja2FnZSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXRlZ29yaWVzIj4KLTwvcGFyZW50UGFja2FnZT4KLTxDb250ZW50UGFja2FnZSBuYW1lPSJEb21haW5zIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGdsb2JhbD0iZmFsc2UiPgotPHBhcmVudFBhY2thZ2UgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2F0ZWdvcmllcy9Eb21haW5zIj4KLTwvcGFyZW50UGFja2FnZT4KLTxEb21haW4gbmFtZT0iZG9tYWluX0ExIiBicmllZkRlc2NyaXB0aW9uPSJEb21haW4gQTEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IkRvbWFpbiBBMSBwcmVzZW50IiB2YXJpYWJpbGl0eVR5cGU9Im5hIj4KLTxDb250ZW50RGVzY3JpcHRpb24gbmFtZT0iZG9tYWluX0ExLF9GRXpPNEEtV0VkcUwyTzFQSlY5Y1pBIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iVHVlIFNlcCAwNiAxOToxNTozNSBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iJmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICBEb21haW4gQTEgbWFpbiYjMTM7JiMxMDsmbHQ7L3AmZ3Q7IiBrZXlDb25zaWRlcmF0aW9ucz0iRG9tYWluIEExIGtleSI+Ci08L0NvbnRlbnREZXNjcmlwdGlvbj4KLTxzdXBwb3J0aW5nTWF0ZXJpYWxzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9zdXBwb3J0aW5nX21hdGVyaWFsX0ExIj4KLTwvc3VwcG9ydGluZ01hdGVyaWFscz4KLTxjb25jZXB0c0FuZFBhcGVycyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvY29uY2VwdF9BMSI+Ci08L2NvbmNlcHRzQW5kUGFwZXJzPgotPGNvbmNlcHRzQW5kUGFwZXJzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS93aGl0ZXBhcGVyX0ExIj4KLTwvY29uY2VwdHNBbmRQYXBlcnM+Ci08Y2hlY2tsaXN0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvY2hlY2tsaXN0X0ExIj4KLTwvY2hlY2tsaXN0cz4KLTxndWlkZWxpbmVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9ndWlkZWxpbmVfQTEiPgotPC9ndWlkZWxpbmVzPgotPGV4YW1wbGVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9leGFtcGxlX0ExIj4KLTwvZXhhbXBsZXM+Ci08YXNzZXRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9yZXVzYWJsZV9hc3NldF9BMSI+Ci08L2Fzc2V0cz4KLTx3b3JrUHJvZHVjdHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2RlbGl2ZXJhYmxlX0ExIj4KLTwvd29ya1Byb2R1Y3RzPgotPHdvcmtQcm9kdWN0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvb3V0Y29tZV9BMSI+Ci08L3dvcmtQcm9kdWN0cz4KLTxEb21haW4gbmFtZT0ic3ViX2RvbWFpbl9BMS4xIiBicmllZkRlc2NyaXB0aW9uPSJTdWItRG9tYWluIEExLjEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IlN1Yi1Eb21haW4gQTEuMSBwcmVzZW50IiB2YXJpYWJpbGl0eVR5cGU9Im5hIj4KLTxDb250ZW50RGVzY3JpcHRpb24gbmFtZT0ic3ViX2RvbWFpbl9BMS4xLF9HT1o3UUEtV0VkcUwyTzFQSlY5Y1pBIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iVGh1IEF1ZyAxOCAxNzo0Njo1MyBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iU3ViLURvbWFpbiBBMS4xIG1haW4iIGtleUNvbnNpZGVyYXRpb25zPSJTdWItRG9tYWluIEExLjEga2V5Ij4KLTwvQ29udGVudERlc2NyaXB0aW9uPgotPHN1cHBvcnRpbmdNYXRlcmlhbHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3N1cHBvcnRpbmdfbWF0ZXJpYWxfQTEiPgotPC9zdXBwb3J0aW5nTWF0ZXJpYWxzPgotPGNvbmNlcHRzQW5kUGFwZXJzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9jb25jZXB0X0ExIj4KLTwvY29uY2VwdHNBbmRQYXBlcnM+Ci08Y29uY2VwdHNBbmRQYXBlcnMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3doaXRlcGFwZXJfQTEiPgotPC9jb25jZXB0c0FuZFBhcGVycz4KLTxjaGVja2xpc3RzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9jaGVja2xpc3RfQTEiPgotPC9jaGVja2xpc3RzPgotPGd1aWRlbGluZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2d1aWRlbGluZV9BMSI+Ci08L2d1aWRlbGluZXM+Ci08ZXhhbXBsZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2V4YW1wbGVfQTEiPgotPC9leGFtcGxlcz4KLTxhc3NldHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3JldXNhYmxlX2Fzc2V0X0ExIj4KLTwvYXNzZXRzPgotPHdvcmtQcm9kdWN0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvYXJ0aWZhY3RfQTEvc3ViX2FydGlmYWN0X0ExLjEiPgotPC93b3JrUHJvZHVjdHM+Ci08L0RvbWFpbj4KLTwvRG9tYWluPgotPERvbWFpbiBuYW1lPSJkb21haW5fQTIiIGJyaWVmRGVzY3JpcHRpb249IkRvbWFpbiBBMiBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iRG9tYWluIEEyIHByZXNlbnQiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPENvbnRlbnREZXNjcmlwdGlvbiBuYW1lPSJkb21haW5fQTIsX0ZxV0w4QS1XRWRxTDJPMVBKVjljWkEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJUaHUgQXVnIDE4IDE3OjQ3OjI4IFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSJEb21haW4gQTIgbWFpbiIga2V5Q29uc2lkZXJhdGlvbnM9IkRvbWFpbiBBMiBrZXkiPgotPC9Db250ZW50RGVzY3JpcHRpb24+Ci08c3VwcG9ydGluZ01hdGVyaWFscyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvc3VwcG9ydGluZ19tYXRlcmlhbF9BMiI+Ci08L3N1cHBvcnRpbmdNYXRlcmlhbHM+Ci08Y29uY2VwdHNBbmRQYXBlcnMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2NvbmNlcHRfQTIiPgotPC9jb25jZXB0c0FuZFBhcGVycz4KLTxjb25jZXB0c0FuZFBhcGVycyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvd2hpdGVwYXBlcl9BMiI+Ci08L2NvbmNlcHRzQW5kUGFwZXJzPgotPGNoZWNrbGlzdHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2NoZWNrbGlzdF9BMiI+Ci08L2NoZWNrbGlzdHM+Ci08Z3VpZGVsaW5lcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvZ3VpZGVsaW5lX0EyIj4KLTwvZ3VpZGVsaW5lcz4KLTxleGFtcGxlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvZXhhbXBsZV9BMiI+Ci08L2V4YW1wbGVzPgotPGFzc2V0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvcmV1c2FibGVfYXNzZXRfQTIiPgotPC9hc3NldHM+Ci08d29ya1Byb2R1Y3RzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9hcnRpZmFjdF9BMSI+Ci08L3dvcmtQcm9kdWN0cz4KLTx3b3JrUHJvZHVjdHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2FydGlmYWN0X0EyL2FydGlmYWN0X0EyLjEiPgotPC93b3JrUHJvZHVjdHM+Ci08d29ya1Byb2R1Y3RzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9hcnRpZmFjdF9BMiI+Ci08L3dvcmtQcm9kdWN0cz4KLTx3b3JrUHJvZHVjdHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2RlbGl2ZXJhYmxlX0EyIj4KLTwvd29ya1Byb2R1Y3RzPgotPHdvcmtQcm9kdWN0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvb3V0Y29tZV9BMiI+Ci08L3dvcmtQcm9kdWN0cz4KLTwvRG9tYWluPgotPC9Db250ZW50UGFja2FnZT4KLTxDb250ZW50UGFja2FnZSBuYW1lPSJEaXNjaXBsaW5lcyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBnbG9iYWw9ImZhbHNlIj4KLTxwYXJlbnRQYWNrYWdlIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhdGVnb3JpZXMvRGlzY2lwbGluZXMiPgotPC9wYXJlbnRQYWNrYWdlPgotPERpc2NpcGxpbmVHcm91cGluZyBuYW1lPSJkaXNjaXBsaW5lX2dyb3VwaW5nX0ExIiBicmllZkRlc2NyaXB0aW9uPSJEaXNjaXBsaW5lIEdyb3VwaW5nIEExIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJEaXNjaXBsaW5lIEdyb3VwaW5nIEExIHByZXNlbnQiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPENvbnRlbnREZXNjcmlwdGlvbiBuYW1lPSJkaXNjaXBsaW5lX2dyb3VwaW5nX0ExLF9DQ1ZqY0EtV0VkcUwyTzFQSlY5Y1pBIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iVGh1IEF1ZyAxOCAxNzo0MjozNyBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iRGlzY2lwbGluZSBHcm91cGluZyBBMSBtYWluIiBrZXlDb25zaWRlcmF0aW9ucz0iRGlzY2lwbGluZSBHcm91cGluZyBBMSBrZXkiPgotPC9Db250ZW50RGVzY3JpcHRpb24+Ci08ZGlzY2lwbGluZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2F0ZWdvcmllcy9EaXNjaXBsaW5lcy9kaXNjaXBsaW5lX0ExIj4KLTwvZGlzY2lwbGluZXM+Ci08L0Rpc2NpcGxpbmVHcm91cGluZz4KLTxEaXNjaXBsaW5lIG5hbWU9ImRpc2NpcGxpbmVfQTEiIGJyaWVmRGVzY3JpcHRpb249IkRpc2NpcGxpbmUgQTEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IkRpc2NpcGxpbmUgQTEgcHJlc2VudCIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08Q29udGVudERlc2NyaXB0aW9uIG5hbWU9ImRpc2NpcGxpbmVfQTEsX0M1ZF93QS1XRWRxTDJPMVBKVjljWkEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJNb24gQXVnIDIyIDEwOjQ1OjAyIFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSJEaXNjaXBsaW5lIEExIG1haW4iIGtleUNvbnNpZGVyYXRpb25zPSJEaXNjaXBsaW5lIEExIGtleSI+Ci08L0NvbnRlbnREZXNjcmlwdGlvbj4KLTxzdXBwb3J0aW5nTWF0ZXJpYWxzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9zdXBwb3J0aW5nX21hdGVyaWFsX0ExIj4KLTwvc3VwcG9ydGluZ01hdGVyaWFscz4KLTxjb25jZXB0c0FuZFBhcGVycyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvY29uY2VwdF9BMSI+Ci08L2NvbmNlcHRzQW5kUGFwZXJzPgotPGNvbmNlcHRzQW5kUGFwZXJzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS93aGl0ZXBhcGVyX0ExIj4KLTwvY29uY2VwdHNBbmRQYXBlcnM+Ci08Y2hlY2tsaXN0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvY2hlY2tsaXN0X0ExIj4KLTwvY2hlY2tsaXN0cz4KLTxndWlkZWxpbmVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9ndWlkZWxpbmVfQTEiPgotPC9ndWlkZWxpbmVzPgotPGV4YW1wbGVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9leGFtcGxlX0ExIj4KLTwvZXhhbXBsZXM+Ci08YXNzZXRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9yZXVzYWJsZV9hc3NldF9BMSI+Ci08L2Fzc2V0cz4KLTx0YXNrcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvdGFza19BMSI+Ci08L3Rhc2tzPgotPC9EaXNjaXBsaW5lPgotPERpc2NpcGxpbmUgbmFtZT0iZGlzY2lwbGluZV9BMiIgYnJpZWZEZXNjcmlwdGlvbj0iRGlzY2lwbGluZSBBMiBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iRGlzY2lwbGluZSBBMiBwcmVzZW50IiB2YXJpYWJpbGl0eVR5cGU9Im5hIj4KLTxDb250ZW50RGVzY3JpcHRpb24gbmFtZT0iZGlzY2lwbGluZV9BMixfRHp2UG9BLVdFZHFMMk8xUEpWOWNaQSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURhdGU9IlRodSBBdWcgMTggMTc6NDQ6MTQgUERUIDIwMDUiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249IkRpc2NpcGxpbmUgQTIgbWFpbiIga2V5Q29uc2lkZXJhdGlvbnM9IkRpc2NpcGxpbmUgQTIga2V5Ij4KLTwvQ29udGVudERlc2NyaXB0aW9uPgotPHN1cHBvcnRpbmdNYXRlcmlhbHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3N1cHBvcnRpbmdfbWF0ZXJpYWxfQTIiPgotPC9zdXBwb3J0aW5nTWF0ZXJpYWxzPgotPGNvbmNlcHRzQW5kUGFwZXJzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9jb25jZXB0X0EyIj4KLTwvY29uY2VwdHNBbmRQYXBlcnM+Ci08Y29uY2VwdHNBbmRQYXBlcnMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3doaXRlcGFwZXJfQTIiPgotPC9jb25jZXB0c0FuZFBhcGVycz4KLTxjaGVja2xpc3RzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9jaGVja2xpc3RfQTIiPgotPC9jaGVja2xpc3RzPgotPGd1aWRlbGluZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2d1aWRlbGluZV9BMiI+Ci08L2d1aWRlbGluZXM+Ci08ZXhhbXBsZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2V4YW1wbGVfQTIiPgotPC9leGFtcGxlcz4KLTxhc3NldHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3JldXNhYmxlX2Fzc2V0X0EyIj4KLTwvYXNzZXRzPgotPHRhc2tzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS90YXNrX0EyIj4KLTwvdGFza3M+Ci08L0Rpc2NpcGxpbmU+Ci08L0NvbnRlbnRQYWNrYWdlPgotPENvbnRlbnRQYWNrYWdlIG5hbWU9IlJvbGVTZXRzIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGdsb2JhbD0iZmFsc2UiPgotPHBhcmVudFBhY2thZ2UgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2F0ZWdvcmllcy9Sb2xlU2V0cyI+Ci08L3BhcmVudFBhY2thZ2U+Ci08Um9sZVNldEdyb3VwaW5nIG5hbWU9InJvbGVfc2V0X2dyb3VwaW5nX0ExIiBicmllZkRlc2NyaXB0aW9uPSJSb2xlIFNldCBHcm91cGluZyBBMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iUm9sZSBTZXQgR3JvdXBpbmcgQTEgcHJlc2VudCIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08Q29udGVudERlc2NyaXB0aW9uIG5hbWU9InJvbGVfc2V0X2dyb3VwaW5nX0ExLF9KWW4wZ0EtV0VkcUwyTzFQSlY5Y1pBIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iVGh1IEF1ZyAxOCAxNzo0OTozMSBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iUm9sZSBTZXQgR3JvdXBpbmcgQTEgbWFpbiIga2V5Q29uc2lkZXJhdGlvbnM9IlJvbGUgU2V0IEdyb3VwaW5nIEExIGtleSI+Ci08L0NvbnRlbnREZXNjcmlwdGlvbj4KLTxyb2xlU2V0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXRlZ29yaWVzL1JvbGVTZXRzL3JvbGVfc2V0X0ExIj4KLTwvcm9sZVNldHM+Ci08L1JvbGVTZXRHcm91cGluZz4KLTxSb2xlU2V0IG5hbWU9InJvbGVfc2V0X0ExIiBicmllZkRlc2NyaXB0aW9uPSJSb2xlIFNldCBBMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iUm9sZSBTZXQgQTEgcHJlc2VudCIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08Q29udGVudERlc2NyaXB0aW9uIG5hbWU9InJvbGVfc2V0X0ExLF85UHAxVUJCS0VkcUJzN0toZFZMUkxBIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iTW9uIEF1ZyAyMiAxMDo0NzoyMyBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iUm9sZSBTZXQgQTEgbWFpbiIga2V5Q29uc2lkZXJhdGlvbnM9IlJvbGUgU2V0IEExMSBrZXkiPgotPC9Db250ZW50RGVzY3JpcHRpb24+Ci08c3VwcG9ydGluZ01hdGVyaWFscyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvc3VwcG9ydGluZ19tYXRlcmlhbF9BMSI+Ci08L3N1cHBvcnRpbmdNYXRlcmlhbHM+Ci08Y29uY2VwdHNBbmRQYXBlcnMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2NvbmNlcHRfQTEiPgotPC9jb25jZXB0c0FuZFBhcGVycz4KLTxjb25jZXB0c0FuZFBhcGVycyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvd2hpdGVwYXBlcl9BMSI+Ci08L2NvbmNlcHRzQW5kUGFwZXJzPgotPGNoZWNrbGlzdHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2NoZWNrbGlzdF9BMSI+Ci08L2NoZWNrbGlzdHM+Ci08Z3VpZGVsaW5lcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvZ3VpZGVsaW5lX0ExIj4KLTwvZ3VpZGVsaW5lcz4KLTxleGFtcGxlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvZXhhbXBsZV9BMSI+Ci08L2V4YW1wbGVzPgotPGFzc2V0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvcmV1c2FibGVfYXNzZXRfQTEiPgotPC9hc3NldHM+Ci08cm9sZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3JvbGVfQTEiPgotPC9yb2xlcz4KLTwvUm9sZVNldD4KLTxSb2xlU2V0IG5hbWU9InJvbGVfc2V0X0EyIiBicmllZkRlc2NyaXB0aW9uPSJSb2xlIFNldCBBMiBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iUm9sZSBTZXQgQTIgcHJlc2VudCIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08Q29udGVudERlc2NyaXB0aW9uIG5hbWU9InJvbGVfc2V0X0EyLF8tdWJnY0JCS0VkcUJzN0toZFZMUkxBIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iVGh1IEF1ZyAxOCAxNzo1MDo0MCBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iUm9sZSBTZXQgQTIgbWFpbiIga2V5Q29uc2lkZXJhdGlvbnM9IlJvbGUgU2V0IEEyIGtleSI+Ci08L0NvbnRlbnREZXNjcmlwdGlvbj4KLTxzdXBwb3J0aW5nTWF0ZXJpYWxzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9zdXBwb3J0aW5nX21hdGVyaWFsX0EyIj4KLTwvc3VwcG9ydGluZ01hdGVyaWFscz4KLTxjb25jZXB0c0FuZFBhcGVycyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvY29uY2VwdF9BMiI+Ci08L2NvbmNlcHRzQW5kUGFwZXJzPgotPGNvbmNlcHRzQW5kUGFwZXJzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS93aGl0ZXBhcGVyX0EyIj4KLTwvY29uY2VwdHNBbmRQYXBlcnM+Ci08Y2hlY2tsaXN0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvY2hlY2tsaXN0X0EyIj4KLTwvY2hlY2tsaXN0cz4KLTxndWlkZWxpbmVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9ndWlkZWxpbmVfQTIiPgotPC9ndWlkZWxpbmVzPgotPGV4YW1wbGVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9leGFtcGxlX0EyIj4KLTwvZXhhbXBsZXM+Ci08YXNzZXRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9yZXVzYWJsZV9hc3NldF9BMiI+Ci08L2Fzc2V0cz4KLTxyb2xlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvcm9sZV9BMiI+Ci08L3JvbGVzPgotPC9Sb2xlU2V0PgotPC9Db250ZW50UGFja2FnZT4KLTxDb250ZW50UGFja2FnZSBuYW1lPSJXUCBUeXBlcyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBnbG9iYWw9ImZhbHNlIj4KLTxwYXJlbnRQYWNrYWdlIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhdGVnb3JpZXMvV1AgVHlwZXMiPgotPC9wYXJlbnRQYWNrYWdlPgotPFdvcmtQcm9kdWN0VHlwZSBuYW1lPSJ3b3JrX3Byb2R1Y3RfdHlwZV9BMSIgYnJpZWZEZXNjcmlwdGlvbj0iV29yayBQcm9kdWN0IFR5cGUgQTEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IldvcmsgUHJvZHVjdCBUeXBlIEExIHByZXNlbnQiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPENvbnRlbnREZXNjcmlwdGlvbiBuYW1lPSJ3b3JrX3Byb2R1Y3RfdHlwZV9BMSxfSGdoRFlBLVdFZHFMMk8xUEpWOWNaQSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURhdGU9IlRodSBBdWcgMTggMTg6MDI6NDQgUERUIDIwMDUiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249IldvcmsgUHJvZHVjdCBUeXBlIEExIG1haW4iIGtleUNvbnNpZGVyYXRpb25zPSJXb3JrIFByb2R1Y3QgVHlwZSBBMSBrZXkiPgotPC9Db250ZW50RGVzY3JpcHRpb24+Ci08c3VwcG9ydGluZ01hdGVyaWFscyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvc3VwcG9ydGluZ19tYXRlcmlhbF9BMSI+Ci08L3N1cHBvcnRpbmdNYXRlcmlhbHM+Ci08Y29uY2VwdHNBbmRQYXBlcnMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2NvbmNlcHRfQTEiPgotPC9jb25jZXB0c0FuZFBhcGVycz4KLTxjb25jZXB0c0FuZFBhcGVycyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvd2hpdGVwYXBlcl9BMSI+Ci08L2NvbmNlcHRzQW5kUGFwZXJzPgotPGNoZWNrbGlzdHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2NoZWNrbGlzdF9BMSI+Ci08L2NoZWNrbGlzdHM+Ci08Z3VpZGVsaW5lcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvZ3VpZGVsaW5lX0ExIj4KLTwvZ3VpZGVsaW5lcz4KLTxleGFtcGxlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvZXhhbXBsZV9BMSI+Ci08L2V4YW1wbGVzPgotPGFzc2V0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvcmV1c2FibGVfYXNzZXRfQTEiPgotPC9hc3NldHM+Ci08d29ya1Byb2R1Y3RzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9hcnRpZmFjdF9BMSI+Ci08L3dvcmtQcm9kdWN0cz4KLTx3b3JrUHJvZHVjdHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2FydGlmYWN0X0ExL3N1Yl9hcnRpZmFjdF9BMS4xIj4KLTwvd29ya1Byb2R1Y3RzPgotPHdvcmtQcm9kdWN0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvZGVsaXZlcmFibGVfQTEiPgotPC93b3JrUHJvZHVjdHM+Ci08d29ya1Byb2R1Y3RzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9vdXRjb21lX0ExIj4KLTwvd29ya1Byb2R1Y3RzPgotPC9Xb3JrUHJvZHVjdFR5cGU+Ci08V29ya1Byb2R1Y3RUeXBlIG5hbWU9IndvcmtfcHJvZHVjdF90eXBlX0EyIiBicmllZkRlc2NyaXB0aW9uPSJXb3JrIFByb2R1Y3QgVHlwZSBBMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iV29yayBQcm9kdWN0IFR5cGUgQTIgcHJlc2VudCIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08Q29udGVudERlc2NyaXB0aW9uIG5hbWU9IndvcmtfcHJvZHVjdF90eXBlX0EyLF9JRm5VZ0EtV0VkcUwyTzFQSlY5Y1pBIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iVGh1IEF1ZyAxOCAxODowMzoxNiBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iV29yayBQcm9kdWN0IFR5cGUgQTEgbWFpbiIga2V5Q29uc2lkZXJhdGlvbnM9IldvcmsgUHJvZHVjdCBUeXBlIEExIGtleSI+Ci08L0NvbnRlbnREZXNjcmlwdGlvbj4KLTxzdXBwb3J0aW5nTWF0ZXJpYWxzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9zdXBwb3J0aW5nX21hdGVyaWFsX0EyIj4KLTwvc3VwcG9ydGluZ01hdGVyaWFscz4KLTxjb25jZXB0c0FuZFBhcGVycyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvY29uY2VwdF9BMiI+Ci08L2NvbmNlcHRzQW5kUGFwZXJzPgotPGNvbmNlcHRzQW5kUGFwZXJzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS93aGl0ZXBhcGVyX0EyIj4KLTwvY29uY2VwdHNBbmRQYXBlcnM+Ci08Y2hlY2tsaXN0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvY2hlY2tsaXN0X0EyIj4KLTwvY2hlY2tsaXN0cz4KLTxndWlkZWxpbmVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9ndWlkZWxpbmVfQTIiPgotPC9ndWlkZWxpbmVzPgotPGV4YW1wbGVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9leGFtcGxlX0EyIj4KLTwvZXhhbXBsZXM+Ci08YXNzZXRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9yZXVzYWJsZV9hc3NldF9BMiI+Ci08L2Fzc2V0cz4KLTx3b3JrUHJvZHVjdHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2FydGlmYWN0X0EyIj4KLTwvd29ya1Byb2R1Y3RzPgotPHdvcmtQcm9kdWN0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvYXJ0aWZhY3RfQTIvYXJ0aWZhY3RfQTIuMSI+Ci08L3dvcmtQcm9kdWN0cz4KLTx3b3JrUHJvZHVjdHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2RlbGl2ZXJhYmxlX0EyIj4KLTwvd29ya1Byb2R1Y3RzPgotPHdvcmtQcm9kdWN0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvb3V0Y29tZV9BMiI+Ci08L3dvcmtQcm9kdWN0cz4KLTwvV29ya1Byb2R1Y3RUeXBlPgotPC9Db250ZW50UGFja2FnZT4KLTxDb250ZW50UGFja2FnZSBuYW1lPSJUb29scyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBnbG9iYWw9ImZhbHNlIj4KLTxwYXJlbnRQYWNrYWdlIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhdGVnb3JpZXMvVG9vbHMiPgotPC9wYXJlbnRQYWNrYWdlPgotPFRvb2wgbmFtZT0idG9vbF9BMSIgYnJpZWZEZXNjcmlwdGlvbj0iVG9vbCBBMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iVG9vbCBBMSBwcmVzZW50IiB2YXJpYWJpbGl0eVR5cGU9Im5hIj4KLTxDb250ZW50RGVzY3JpcHRpb24gbmFtZT0idG9vbF9BMSxfS3hiYWdBLVdFZHFMMk8xUEpWOWNaQSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURhdGU9IlRodSBBdWcgMTggMTc6NTI6MDcgUERUIDIwMDUiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249IlRvb2wgQTEgbWFpbiIga2V5Q29uc2lkZXJhdGlvbnM9IlRvb2wgQTEga2V5Ij4KLTwvQ29udGVudERlc2NyaXB0aW9uPgotPHN1cHBvcnRpbmdNYXRlcmlhbHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3N1cHBvcnRpbmdfbWF0ZXJpYWxfQTEiPgotPC9zdXBwb3J0aW5nTWF0ZXJpYWxzPgotPGNvbmNlcHRzQW5kUGFwZXJzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9jb25jZXB0X0ExIj4KLTwvY29uY2VwdHNBbmRQYXBlcnM+Ci08Y29uY2VwdHNBbmRQYXBlcnMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3doaXRlcGFwZXJfQTEiPgotPC9jb25jZXB0c0FuZFBhcGVycz4KLTxjaGVja2xpc3RzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9jaGVja2xpc3RfQTEiPgotPC9jaGVja2xpc3RzPgotPGd1aWRlbGluZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2d1aWRlbGluZV9BMSI+Ci08L2d1aWRlbGluZXM+Ci08ZXhhbXBsZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2V4YW1wbGVfQTEiPgotPC9leGFtcGxlcz4KLTxhc3NldHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3JldXNhYmxlX2Fzc2V0X0ExIj4KLTwvYXNzZXRzPgotPHRvb2xNZW50b3JzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS90b29sbWVudG9yX0ExIj4KLTwvdG9vbE1lbnRvcnM+Ci08L1Rvb2w+Ci08VG9vbCBuYW1lPSJ0b29sX0EyIiBicmllZkRlc2NyaXB0aW9uPSJUb29sIEEyIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJUb29sIEEyIHByZXNlbnQiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPENvbnRlbnREZXNjcmlwdGlvbiBuYW1lPSJ0b29sX0EyLF9MaGFGOEEtV0VkcUwyTzFQSlY5Y1pBIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iVGh1IEF1ZyAxOCAxNzo1MjozNCBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iVG9vbCBBMiBtYWluIiBrZXlDb25zaWRlcmF0aW9ucz0iVG9vbCBBMiBrZXkiPgotPC9Db250ZW50RGVzY3JpcHRpb24+Ci08c3VwcG9ydGluZ01hdGVyaWFscyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvc3VwcG9ydGluZ19tYXRlcmlhbF9BMiI+Ci08L3N1cHBvcnRpbmdNYXRlcmlhbHM+Ci08Y29uY2VwdHNBbmRQYXBlcnMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2NvbmNlcHRfQTIiPgotPC9jb25jZXB0c0FuZFBhcGVycz4KLTxjb25jZXB0c0FuZFBhcGVycyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvd2hpdGVwYXBlcl9BMiI+Ci08L2NvbmNlcHRzQW5kUGFwZXJzPgotPGNoZWNrbGlzdHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2NoZWNrbGlzdF9BMiI+Ci08L2NoZWNrbGlzdHM+Ci08Z3VpZGVsaW5lcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvZ3VpZGVsaW5lX0EyIj4KLTwvZ3VpZGVsaW5lcz4KLTxleGFtcGxlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvZXhhbXBsZV9BMiI+Ci08L2V4YW1wbGVzPgotPGFzc2V0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvcmV1c2FibGVfYXNzZXRfQTIiPgotPC9hc3NldHM+Ci08dG9vbE1lbnRvcnMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3Rvb2xtZW50b3JfQTIiPgotPC90b29sTWVudG9ycz4KLTwvVG9vbD4KLTwvQ29udGVudFBhY2thZ2U+Ci08Q29udGVudFBhY2thZ2UgbmFtZT0iU3RhbmRhcmRDYXRlZ29yaWVzIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGdsb2JhbD0iZmFsc2UiPgotPHBhcmVudFBhY2thZ2UgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2F0ZWdvcmllcy9TdGFuZGFyZENhdGVnb3JpZXMiPgotPC9wYXJlbnRQYWNrYWdlPgotPC9Db250ZW50UGFja2FnZT4KLTxDb250ZW50UGFja2FnZSBuYW1lPSJDdXN0b21DYXRlZ29yaWVzIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGdsb2JhbD0iZmFsc2UiPgotPHBhcmVudFBhY2thZ2UgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2F0ZWdvcmllcy9DdXN0b21DYXRlZ29yaWVzIj4KLTwvcGFyZW50UGFja2FnZT4KLTxDb250ZW50UGFja2FnZSBuYW1lPSJIaWRkZW4iIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgZ2xvYmFsPSJmYWxzZSI+Ci08cGFyZW50UGFja2FnZSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXRlZ29yaWVzL0N1c3RvbUNhdGVnb3JpZXMvSGlkZGVuIj4KLTwvcGFyZW50UGFja2FnZT4KLTxDdXN0b21DYXRlZ29yeSBuYW1lPSJDdXN0b20gQ2F0ZWdvcmllcyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSIiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPENvbnRlbnREZXNjcmlwdGlvbiBuYW1lPSJDdXN0b20gQ2F0ZWdvcmllcyxfeVVlTEt3LVBFZHFMMk8xUEpWOWNaQSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiPgotPC9Db250ZW50RGVzY3JpcHRpb24+Ci08Y2F0ZWdvcml6ZWRFbGVtZW50cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXRlZ29yaWVzL0N1c3RvbUNhdGVnb3JpZXMvY3VzdG9tX2NhdGVnb3J5X0ExIj4KLTwvY2F0ZWdvcml6ZWRFbGVtZW50cz4KLTxjYXRlZ29yaXplZEVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhdGVnb3JpZXMvQ3VzdG9tQ2F0ZWdvcmllcy9jdXN0b21fY2F0ZWdvcnlfQTIiPgotPC9jYXRlZ29yaXplZEVsZW1lbnRzPgotPC9DdXN0b21DYXRlZ29yeT4KLTwvQ29udGVudFBhY2thZ2U+Ci08Q3VzdG9tQ2F0ZWdvcnkgbmFtZT0iY3VzdG9tX2NhdGVnb3J5X0ExIiBicmllZkRlc2NyaXB0aW9uPSJDdXN0b20gQ2F0ZWdvcnkgQTEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IkN1c3RvbSBDYXRlZ29yeSBBMSBwcmVzZW50IiB2YXJpYWJpbGl0eVR5cGU9Im5hIj4KLTxDb250ZW50RGVzY3JpcHRpb24gbmFtZT0iY3VzdG9tX2NhdGVnb3J5X0ExLF9NS1Bua0EtV0VkcUwyTzFQSlY5Y1pBIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iVGh1IEF1ZyAxOCAxNzo1MzoxNSBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iQ3VzdG9tIENhdGVnb3J5IEExIG1haW4iIGtleUNvbnNpZGVyYXRpb25zPSJDdXN0b20gQ2F0ZWdvcnkgQTEga2V5Ij4KLTwvQ29udGVudERlc2NyaXB0aW9uPgotPGNhdGVnb3JpemVkRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2F0ZWdvcmllcy9DdXN0b21DYXRlZ29yaWVzL3N1Yl9jdXN0b21fY2F0ZWdvcnlfQTEuMSI+Ci08L2NhdGVnb3JpemVkRWxlbWVudHM+Ci08Y2F0ZWdvcml6ZWRFbGVtZW50cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvcm9sZV9BMSI+Ci08L2NhdGVnb3JpemVkRWxlbWVudHM+Ci08Y2F0ZWdvcml6ZWRFbGVtZW50cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvdGFza19BMSI+Ci08L2NhdGVnb3JpemVkRWxlbWVudHM+Ci08Y2F0ZWdvcml6ZWRFbGVtZW50cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvYXJ0aWZhY3RfQTEiPgotPC9jYXRlZ29yaXplZEVsZW1lbnRzPgotPGNhdGVnb3JpemVkRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2RlbGl2ZXJhYmxlX0ExIj4KLTwvY2F0ZWdvcml6ZWRFbGVtZW50cz4KLTxjYXRlZ29yaXplZEVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9vdXRjb21lX0ExIj4KLTwvY2F0ZWdvcml6ZWRFbGVtZW50cz4KLTxjYXRlZ29yaXplZEVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL0NQMSB3aXRoIGFsbCBlbGVtZW50cyI+Ci08L2NhdGVnb3JpemVkRWxlbWVudHM+Ci08Y2F0ZWdvcml6ZWRFbGVtZW50cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQ1AgQTEiPgotPC9jYXRlZ29yaXplZEVsZW1lbnRzPgotPGNhdGVnb3JpemVkRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIGV4dGVuZGluZyAmYXBvcztDUDEgd2l0aCBhbGwgZWxlbWVudHMmYXBvczsvQ1AgZXh0ZW5kaW5nICZhcG9zO0NQMSB3aXRoIGFsbCBlbGVtZW50cyZhcG9zOyI+Ci08L2NhdGVnb3JpemVkRWxlbWVudHM+Ci08Y2F0ZWdvcml6ZWRFbGVtZW50cyBwYXRoPSJQbHVnIEEvRGVsaXZlcnlQcm9jZXNzZXMvZGVsUHJvY1BhayBBMS9kZWxQcm9jUGFrX0ExLjEvZGVsUHJvY1Bha19BMS4xIj4KLTwvY2F0ZWdvcml6ZWRFbGVtZW50cz4KLTwvQ3VzdG9tQ2F0ZWdvcnk+Ci08Q3VzdG9tQ2F0ZWdvcnkgbmFtZT0iY3VzdG9tX2NhdGVnb3J5X0EyIiBicmllZkRlc2NyaXB0aW9uPSJDdXN0b20gQ2F0ZWdvcnkgQTIgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IkN1c3RvbSBDYXRlZ29yeSBBMiBwcmVzZW50IiB2YXJpYWJpbGl0eVR5cGU9Im5hIj4KLTxDb250ZW50RGVzY3JpcHRpb24gbmFtZT0iY3VzdG9tX2NhdGVnb3J5X0EyLF9PU1NTSUEtV0VkcUwyTzFQSlY5Y1pBIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iVGh1IEF1ZyAxOCAxODowMjowNyBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iQ3VzdG9tIENhdGVnb3J5IEEyIG1haW4iIGtleUNvbnNpZGVyYXRpb25zPSJDdXN0b20gQ2F0ZWdvcnkgQTIga2V5Ij4KLTwvQ29udGVudERlc2NyaXB0aW9uPgotPGNhdGVnb3JpemVkRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3JvbGVfQTIiPgotPC9jYXRlZ29yaXplZEVsZW1lbnRzPgotPGNhdGVnb3JpemVkRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3Rhc2tfQTIiPgotPC9jYXRlZ29yaXplZEVsZW1lbnRzPgotPGNhdGVnb3JpemVkRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2FydGlmYWN0X0EyIj4KLTwvY2F0ZWdvcml6ZWRFbGVtZW50cz4KLTxjYXRlZ29yaXplZEVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9hcnRpZmFjdF9BMi9hcnRpZmFjdF9BMi4xIj4KLTwvY2F0ZWdvcml6ZWRFbGVtZW50cz4KLTxjYXRlZ29yaXplZEVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9kZWxpdmVyYWJsZV9BMiI+Ci08L2NhdGVnb3JpemVkRWxlbWVudHM+Ci08Y2F0ZWdvcml6ZWRFbGVtZW50cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvb3V0Y29tZV9BMiI+Ci08L2NhdGVnb3JpemVkRWxlbWVudHM+Ci08L0N1c3RvbUNhdGVnb3J5PgotPEN1c3RvbUNhdGVnb3J5IG5hbWU9InN1Yl9jdXN0b21fY2F0ZWdvcnlfQTEuMSIgYnJpZWZEZXNjcmlwdGlvbj0iU3ViLUN1c3RvbSBDYXRlZ29yeSBBMS4xIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJTdWItQ3VzdG9tIENhdGVnb3J5IEExLjEgcHJlc2VudCIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08Q29udGVudERlc2NyaXB0aW9uIG5hbWU9InN1Yl9jdXN0b21fY2F0ZWdvcnlfQTEuMSxfN2RYWVVCQktFZHFCczdLaGRWTFJMQSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURhdGU9IlRodSBBdWcgMTggMTg6MDE6MjYgUERUIDIwMDUiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249IlN1Yi1DdXN0b20gQ2F0ZWdvcnkgQTEuMSBtYWluIiBrZXlDb25zaWRlcmF0aW9ucz0iU3ViLUN1c3RvbSBDYXRlZ29yeSBBMS4xIGtleSI+Ci08L0NvbnRlbnREZXNjcmlwdGlvbj4KLTxjYXRlZ29yaXplZEVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9yb2xlX0ExIj4KLTwvY2F0ZWdvcml6ZWRFbGVtZW50cz4KLTxjYXRlZ29yaXplZEVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9hcnRpZmFjdF9BMS9zdWJfYXJ0aWZhY3RfQTEuMSI+Ci08L2NhdGVnb3JpemVkRWxlbWVudHM+Ci08L0N1c3RvbUNhdGVnb3J5PgotPC9Db250ZW50UGFja2FnZT4KLTwvQ29udGVudFBhY2thZ2U+Ci08Q29udGVudFBhY2thZ2UgbmFtZT0iQ29yZUNvbnRlbnQiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgZ2xvYmFsPSJmYWxzZSI+Ci08cGFyZW50UGFja2FnZSBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudCI+Ci08L3BhcmVudFBhY2thZ2U+Ci08Q29udGVudFBhY2thZ2UgbmFtZT0iY29udGVudF9wYWNrYWdlX0ExIiBicmllZkRlc2NyaXB0aW9uPSJDb25QYWsgQTEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGdsb2JhbD0iZmFsc2UiPgotPHBhcmVudFBhY2thZ2UgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExIj4KLTwvcGFyZW50UGFja2FnZT4KLTxSb2xlIG5hbWU9InJvbGVfQTEiIGJyaWVmRGVzY3JpcHRpb249IlJvbGUgQTEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IlJvbGUgQTEiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPFJvbGVEZXNjcmlwdGlvbiBuYW1lPSJyb2xlX0ExLF81NXprMEEtUEVkcUwyTzFQSlY5Y1pBIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iVHVlIE9jdCAxOCAxNjowNDoxMCBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iUm9sZSBBMSBtYWluIiBrZXlDb25zaWRlcmF0aW9ucz0iUm9sZSBBMSBrZXkiIHNraWxscz0iUm9sZSBBMSBza2lsbHMiIGFzc2lnbm1lbnRBcHByb2FjaGVzPSJSb2xlIEExIGFzc2lnbiIgc3lub255bXM9IlJvbGUgQTEgc3luIj4KLTwvUm9sZURlc2NyaXB0aW9uPgotPHN1cHBvcnRpbmdNYXRlcmlhbHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3N1cHBvcnRpbmdfbWF0ZXJpYWxfQTEiPgotPC9zdXBwb3J0aW5nTWF0ZXJpYWxzPgotPGNvbmNlcHRzQW5kUGFwZXJzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9jb25jZXB0X0ExIj4KLTwvY29uY2VwdHNBbmRQYXBlcnM+Ci08Y29uY2VwdHNBbmRQYXBlcnMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3doaXRlcGFwZXJfQTEiPgotPC9jb25jZXB0c0FuZFBhcGVycz4KLTxjaGVja2xpc3RzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9jaGVja2xpc3RfQTEiPgotPC9jaGVja2xpc3RzPgotPGd1aWRlbGluZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2d1aWRlbGluZV9BMSI+Ci08L2d1aWRlbGluZXM+Ci08ZXhhbXBsZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2V4YW1wbGVfQTEiPgotPC9leGFtcGxlcz4KLTxhc3NldHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3JldXNhYmxlX2Fzc2V0X0ExIj4KLTwvYXNzZXRzPgotPG1vZGlmaWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9vdXRjb21lX0ExIj4KLTwvbW9kaWZpZXM+Ci08cmVzcG9uc2libGVGb3IgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2FydGlmYWN0X0ExIj4KLTwvcmVzcG9uc2libGVGb3I+Ci08cmVzcG9uc2libGVGb3IgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2RlbGl2ZXJhYmxlX0ExIj4KLTwvcmVzcG9uc2libGVGb3I+Ci08cmVzcG9uc2libGVGb3IgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL291dGNvbWVfQTEiPgotPC9yZXNwb25zaWJsZUZvcj4KLTwvUm9sZT4KLTxSb2xlIG5hbWU9InJvbGVfQTIiIGJyaWVmRGVzY3JpcHRpb249IlJvbGUgQTIgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IlJvbGUgQTIgZXh0ZW5kZWQgYnkgUm9sZSBBMyIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08Um9sZURlc2NyaXB0aW9uIG5hbWU9InJvbGVfQTIsXzZrM1VBQS1QRWRxTDJPMVBKVjljWkEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJXZWQgT2N0IDE5IDEwOjMyOjM1IFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSJSb2xlIEEyIG1haW4iIGtleUNvbnNpZGVyYXRpb25zPSJSb2xlIEEyIGtleSIgc2tpbGxzPSJSb2xlIEEyIHNraWxscyIgYXNzaWdubWVudEFwcHJvYWNoZXM9IlJvbGUgQTIgYXNzaWduIiBzeW5vbnltcz0iUm9sZSBBMiBzeW4iPgotPC9Sb2xlRGVzY3JpcHRpb24+Ci08c3VwcG9ydGluZ01hdGVyaWFscyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvc3VwcG9ydGluZ19tYXRlcmlhbF9BMiI+Ci08L3N1cHBvcnRpbmdNYXRlcmlhbHM+Ci08Y29uY2VwdHNBbmRQYXBlcnMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2NvbmNlcHRfQTIiPgotPC9jb25jZXB0c0FuZFBhcGVycz4KLTxjb25jZXB0c0FuZFBhcGVycyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvd2hpdGVwYXBlcl9BMiI+Ci08L2NvbmNlcHRzQW5kUGFwZXJzPgotPGNoZWNrbGlzdHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2NoZWNrbGlzdF9BMiI+Ci08L2NoZWNrbGlzdHM+Ci08Z3VpZGVsaW5lcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvZ3VpZGVsaW5lX0EyIj4KLTwvZ3VpZGVsaW5lcz4KLTxleGFtcGxlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvZXhhbXBsZV9BMiI+Ci08L2V4YW1wbGVzPgotPGFzc2V0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvcmV1c2FibGVfYXNzZXRfQTIiPgotPC9hc3NldHM+Ci08bW9kaWZpZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL291dGNvbWVfQTIiPgotPC9tb2RpZmllcz4KLTxyZXNwb25zaWJsZUZvciBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvYXJ0aWZhY3RfQTIiPgotPC9yZXNwb25zaWJsZUZvcj4KLTxyZXNwb25zaWJsZUZvciBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvZGVsaXZlcmFibGVfQTIiPgotPC9yZXNwb25zaWJsZUZvcj4KLTxyZXNwb25zaWJsZUZvciBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvb3V0Y29tZV9BMiI+Ci08L3Jlc3BvbnNpYmxlRm9yPgotPC9Sb2xlPgotPFRhc2sgbmFtZT0idGFza19BMSIgYnJpZWZEZXNjcmlwdGlvbj0iVGFzayBBMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iVGFzayBBMSAiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPFRhc2tEZXNjcmlwdGlvbiBuYW1lPSJ0YXNrX0ExLF83TThuc0EtUEVkcUwyTzFQSlY5Y1pBIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iV2VkIE9jdCAxOSAxMDoyODozOSBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iVGFzayBBMSBtYWluIiBrZXlDb25zaWRlcmF0aW9ucz0iVGFzayBBMSBrZXkiIHB1cnBvc2U9IlRhc2sgQTEgcHVycG9zZSIgYWx0ZXJuYXRpdmVzPSJUYXNrIEExIGFsdCI+Ci08U2VjdGlvbiBuYW1lPSJTdGVwIEExLjEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgdmFyaWFiaWxpdHlUeXBlPSJuYSIgc2VjdGlvbk5hbWU9IiIgc2VjdGlvbkRlc2NyaXB0aW9uPSJhbHBoYSI+Ci08L1NlY3Rpb24+Ci08U2VjdGlvbiBuYW1lPSJTdGVwIEExLjIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgdmFyaWFiaWxpdHlUeXBlPSJuYSIgc2VjdGlvbk5hbWU9IiIgc2VjdGlvbkRlc2NyaXB0aW9uPSJiZXRhIj4KLTwvU2VjdGlvbj4KLTxTZWN0aW9uIG5hbWU9IlN0ZXAgQTEuMyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiB2YXJpYWJpbGl0eVR5cGU9Im5hIiBzZWN0aW9uTmFtZT0iIiBzZWN0aW9uRGVzY3JpcHRpb249ImdhbW1hIj4KLTwvU2VjdGlvbj4KLTwvVGFza0Rlc2NyaXB0aW9uPgotPHN1cHBvcnRpbmdNYXRlcmlhbHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3N1cHBvcnRpbmdfbWF0ZXJpYWxfQTEiPgotPC9zdXBwb3J0aW5nTWF0ZXJpYWxzPgotPGNvbmNlcHRzQW5kUGFwZXJzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9jb25jZXB0X0ExIj4KLTwvY29uY2VwdHNBbmRQYXBlcnM+Ci08Y29uY2VwdHNBbmRQYXBlcnMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3doaXRlcGFwZXJfQTEiPgotPC9jb25jZXB0c0FuZFBhcGVycz4KLTxjaGVja2xpc3RzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9jaGVja2xpc3RfQTEiPgotPC9jaGVja2xpc3RzPgotPGd1aWRlbGluZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2d1aWRlbGluZV9BMSI+Ci08L2d1aWRlbGluZXM+Ci08ZXhhbXBsZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2V4YW1wbGVfQTEiPgotPC9leGFtcGxlcz4KLTxhc3NldHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3JldXNhYmxlX2Fzc2V0X0ExIj4KLTwvYXNzZXRzPgotPHBlcmZvcm1lZEJ5IHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS90YXNrX0ExIj4KLTwvcGVyZm9ybWVkQnk+Ci08bWFuZGF0b3J5SW5wdXQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2FydGlmYWN0X0ExL3N1Yl9hcnRpZmFjdF9BMS4xIj4KLTwvbWFuZGF0b3J5SW5wdXQ+Ci08bWFuZGF0b3J5SW5wdXQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2FydGlmYWN0X0ExIj4KLTwvbWFuZGF0b3J5SW5wdXQ+Ci08b3V0cHV0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9vdXRjb21lX0ExIj4KLTwvb3V0cHV0PgotPGFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5IHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9yb2xlX0EyIj4KLTwvYWRkaXRpb25hbGx5UGVyZm9ybWVkQnk+Ci08b3B0aW9uYWxJbnB1dCBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvZGVsaXZlcmFibGVfQTEiPgotPC9vcHRpb25hbElucHV0PgotPHN0ZXBzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS90YXNrX0ExL3Rhc2tfQTEsXzdNOG5zQS1QRWRxTDJPMVBKVjljWkEvU3RlcCBBMS4xIj4KLTwvc3RlcHM+Ci08c3RlcHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3Rhc2tfQTEvdGFza19BMSxfN004bnNBLVBFZHFMMk8xUEpWOWNaQS9TdGVwIEExLjIiPgotPC9zdGVwcz4KLTxzdGVwcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvdGFza19BMS90YXNrX0ExLF83TThuc0EtUEVkcUwyTzFQSlY5Y1pBL1N0ZXAgQTEuMyI+Ci08L3N0ZXBzPgotPHRvb2xNZW50b3JzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS90b29sbWVudG9yX0ExIj4KLTwvdG9vbE1lbnRvcnM+Ci08L1Rhc2s+Ci08VGFzayBuYW1lPSJ0YXNrX0EyIiBicmllZkRlc2NyaXB0aW9uPSJUYXNrIEEyIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJUYXNrIEEyICggZXh0ZW5kZWQgYnkgVGFzayBBMyApIiB2YXJpYWJpbGl0eVR5cGU9Im5hIj4KLTxUYXNrRGVzY3JpcHRpb24gbmFtZT0idGFza19BMixfNzVOUXdBLVBFZHFMMk8xUEpWOWNaQSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURhdGU9IldlZCBPY3QgMTkgMTA6Mjk6MjIgUERUIDIwMDUiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249IlRhc2sgQTIgbWFpbiIga2V5Q29uc2lkZXJhdGlvbnM9IlRhc2sgQTIga2V5IiBwdXJwb3NlPSJUYXNrIEEyIHB1cnBvc2UiIGFsdGVybmF0aXZlcz0iVGFzayBBMiBhbHQiPgotPFNlY3Rpb24gbmFtZT0iU3RlcCBBMi4xIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHZhcmlhYmlsaXR5VHlwZT0ibmEiIHNlY3Rpb25OYW1lPSIiIHNlY3Rpb25EZXNjcmlwdGlvbj0iJmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICBwdXQgeW91ciByaWdodCBmb290IGluJiMxMzsmIzEwOyZsdDsvcCZndDsiPgotPC9TZWN0aW9uPgotPFNlY3Rpb24gbmFtZT0iU3RlcCBBMi4yIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHZhcmlhYmlsaXR5VHlwZT0ibmEiIHNlY3Rpb25OYW1lPSIiIHNlY3Rpb25EZXNjcmlwdGlvbj0icHV0IHlvdXIgcmlnaHQgZm9vdCBvdXQiPgotPC9TZWN0aW9uPgotPFNlY3Rpb24gbmFtZT0iU3RlcCBBMi4zIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHZhcmlhYmlsaXR5VHlwZT0ibmEiIHNlY3Rpb25OYW1lPSIiIHNlY3Rpb25EZXNjcmlwdGlvbj0iRG8gdGhlIGhva2V5LXBva2V5Ij4KLTwvU2VjdGlvbj4KLTwvVGFza0Rlc2NyaXB0aW9uPgotPHN1cHBvcnRpbmdNYXRlcmlhbHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3N1cHBvcnRpbmdfbWF0ZXJpYWxfQTIiPgotPC9zdXBwb3J0aW5nTWF0ZXJpYWxzPgotPGNvbmNlcHRzQW5kUGFwZXJzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9jb25jZXB0X0EyIj4KLTwvY29uY2VwdHNBbmRQYXBlcnM+Ci08Y29uY2VwdHNBbmRQYXBlcnMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3doaXRlcGFwZXJfQTIiPgotPC9jb25jZXB0c0FuZFBhcGVycz4KLTxjaGVja2xpc3RzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9jaGVja2xpc3RfQTIiPgotPC9jaGVja2xpc3RzPgotPGd1aWRlbGluZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2d1aWRlbGluZV9BMiI+Ci08L2d1aWRlbGluZXM+Ci08ZXhhbXBsZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2V4YW1wbGVfQTIiPgotPC9leGFtcGxlcz4KLTxhc3NldHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3JldXNhYmxlX2Fzc2V0X0EyIj4KLTwvYXNzZXRzPgotPHBlcmZvcm1lZEJ5IHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS90YXNrX0EyIj4KLTwvcGVyZm9ybWVkQnk+Ci08bWFuZGF0b3J5SW5wdXQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2FydGlmYWN0X0EyIj4KLTwvbWFuZGF0b3J5SW5wdXQ+Ci08b3V0cHV0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9vdXRjb21lX0EyIj4KLTwvb3V0cHV0PgotPGFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5IHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9yb2xlX0ExIj4KLTwvYWRkaXRpb25hbGx5UGVyZm9ybWVkQnk+Ci08b3B0aW9uYWxJbnB1dCBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvZGVsaXZlcmFibGVfQTIiPgotPC9vcHRpb25hbElucHV0PgotPHN0ZXBzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS90YXNrX0EyL3Rhc2tfQTIsXzc1TlF3QS1QRWRxTDJPMVBKVjljWkEvU3RlcCBBMi4xIj4KLTwvc3RlcHM+Ci08c3RlcHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3Rhc2tfQTIvdGFza19BMixfNzVOUXdBLVBFZHFMMk8xUEpWOWNaQS9TdGVwIEEyLjIiPgotPC9zdGVwcz4KLTxzdGVwcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvdGFza19BMi90YXNrX0EyLF83NU5Rd0EtUEVkcUwyTzFQSlY5Y1pBL1N0ZXAgQTIuMyI+Ci08L3N0ZXBzPgotPHRvb2xNZW50b3JzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS90b29sbWVudG9yX0EyIj4KLTwvdG9vbE1lbnRvcnM+Ci08L1Rhc2s+Ci08QXJ0aWZhY3QgbmFtZT0iYXJ0aWZhY3RfQTEiIGJyaWVmRGVzY3JpcHRpb249IkFydGlmYWN0IEExIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJBcnRpZmFjdCBBMSBwcmVzZW50IiB2YXJpYWJpbGl0eVR5cGU9Im5hIj4KLTxBcnRpZmFjdERlc2NyaXB0aW9uIG5hbWU9ImFydGlmYWN0X0ExIHgsXzlLdDc4QS1QRWRxTDJPMVBKVjljWkEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJXZWQgU2VwIDA3IDE0OjUyOjQ0IFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSJBcnRpZmFjdCBBMSBtYWluIiBrZXlDb25zaWRlcmF0aW9ucz0iQXJ0aWZhY3QgQTEga2V5IiBleHRlcm5hbElkPSJBcnRpZmFjdCBBMSB1bmlxdWUiIHB1cnBvc2U9IkFydGlmYWN0IEExIHB1cnBvc2UiIGltcGFjdE9mTm90SGF2aW5nPSJBcnRpZmFjdCBBMSBpbXBhY3QiIHJlYXNvbnNGb3JOb3ROZWVkaW5nPSJBcnRpZmFjdCBBMSByZWFzb24iIGJyaWVmT3V0bGluZT0iQXJ0aWZhY3QgQTEgYnJpZWYiIHJlcHJlc2VudGF0aW9uT3B0aW9ucz0iQXJ0aWZhY3QgQTEgcmVwIj4KLTwvQXJ0aWZhY3REZXNjcmlwdGlvbj4KLTxzdXBwb3J0aW5nTWF0ZXJpYWxzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9zdXBwb3J0aW5nX21hdGVyaWFsX0ExIj4KLTwvc3VwcG9ydGluZ01hdGVyaWFscz4KLTxjb25jZXB0c0FuZFBhcGVycyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvY29uY2VwdF9BMSI+Ci08L2NvbmNlcHRzQW5kUGFwZXJzPgotPGNvbmNlcHRzQW5kUGFwZXJzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS93aGl0ZXBhcGVyX0ExIj4KLTwvY29uY2VwdHNBbmRQYXBlcnM+Ci08Y2hlY2tsaXN0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvY2hlY2tsaXN0X0ExIj4KLTwvY2hlY2tsaXN0cz4KLTxndWlkZWxpbmVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9ndWlkZWxpbmVfQTEiPgotPC9ndWlkZWxpbmVzPgotPGV4YW1wbGVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9leGFtcGxlX0ExIj4KLTwvZXhhbXBsZXM+Ci08YXNzZXRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9yZXVzYWJsZV9hc3NldF9BMSI+Ci08L2Fzc2V0cz4KLTxyZXBvcnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9yZXBvcnRfQTEiPgotPC9yZXBvcnRzPgotPHRlbXBsYXRlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvdGVtcGxhdGVfQTEiPgotPC90ZW1wbGF0ZXM+Ci08dG9vbE1lbnRvcnMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3Rvb2xtZW50b3JfQTEiPgotPC90b29sTWVudG9ycz4KLTxBcnRpZmFjdCBuYW1lPSJzdWJfYXJ0aWZhY3RfQTEuMSIgYnJpZWZEZXNjcmlwdGlvbj0iU3ViX0FydGlmYWN0IEExLjEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IlN1Yl9BcnRpZmFjdCBBMS4xIHByZXNlbnQiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPEFydGlmYWN0RGVzY3JpcHRpb24gbmFtZT0ic3ViX2FydGlmYWN0X0ExLjEsX0Y1MXl3QS1SRWRxTDJPMVBKVjljWkEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJUaHUgQXVnIDE4IDE4OjA0OjE5IFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSJTdWJfQXJ0aWZhY3QgQTEuMSBtYWluIiBrZXlDb25zaWRlcmF0aW9ucz0iU3ViX0FydGlmYWN0IEExLjEga2V5IiBleHRlcm5hbElkPSJTdWJfQXJ0aWZhY3QgQTEuMSB1bmlxdWUiIHB1cnBvc2U9IlN1Yl9BcnRpZmFjdCBBMS4xIHB1cnBvc2UiIGltcGFjdE9mTm90SGF2aW5nPSJBcnRpZmFjdCBBMS4xIGltcGFjdCIgcmVhc29uc0Zvck5vdE5lZWRpbmc9IkFydGlmYWN0IEExLjEgcmVhc29uIiBicmllZk91dGxpbmU9IlN1Yl9BcnRpZmFjdCBBMS4xIGJyaWVmIiByZXByZXNlbnRhdGlvbk9wdGlvbnM9IlN1Yl9BcnRpZmFjdCBBMS4xIHJlcCI+Ci08L0FydGlmYWN0RGVzY3JpcHRpb24+Ci08c3VwcG9ydGluZ01hdGVyaWFscyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvc3VwcG9ydGluZ19tYXRlcmlhbF9BMSI+Ci08L3N1cHBvcnRpbmdNYXRlcmlhbHM+Ci08Y29uY2VwdHNBbmRQYXBlcnMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2NvbmNlcHRfQTEiPgotPC9jb25jZXB0c0FuZFBhcGVycz4KLTxjb25jZXB0c0FuZFBhcGVycyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvd2hpdGVwYXBlcl9BMSI+Ci08L2NvbmNlcHRzQW5kUGFwZXJzPgotPGNoZWNrbGlzdHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2NoZWNrbGlzdF9BMSI+Ci08L2NoZWNrbGlzdHM+Ci08Z3VpZGVsaW5lcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvZ3VpZGVsaW5lX0ExIj4KLTwvZ3VpZGVsaW5lcz4KLTxleGFtcGxlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvZXhhbXBsZV9BMSI+Ci08L2V4YW1wbGVzPgotPGFzc2V0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvcmV1c2FibGVfYXNzZXRfQTEiPgotPC9hc3NldHM+Ci08cmVwb3J0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvcmVwb3J0X0ExIj4KLTwvcmVwb3J0cz4KLTx0ZW1wbGF0ZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3RlbXBsYXRlX0ExIj4KLTwvdGVtcGxhdGVzPgotPHRvb2xNZW50b3JzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS90b29sbWVudG9yX0ExIj4KLTwvdG9vbE1lbnRvcnM+Ci08Y29udGFpbmVyQXJ0aWZhY3QgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2FydGlmYWN0X0ExL3N1Yl9hcnRpZmFjdF9BMS4xIj4KLTwvY29udGFpbmVyQXJ0aWZhY3Q+Ci08L0FydGlmYWN0PgotPC9BcnRpZmFjdD4KLTxBcnRpZmFjdCBuYW1lPSJhcnRpZmFjdF9BMiIgYnJpZWZEZXNjcmlwdGlvbj0iQXJ0aWZhY3QgQTIgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IkFydGlmYWN0IEEyIHByZXNlbnQiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPEFydGlmYWN0RGVzY3JpcHRpb24gbmFtZT0iYXJ0aWZhY3RfQTIsX0U3WjBrQS1SRWRxTDJPMVBKVjljWkEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJXZWQgQXVnIDE3IDE5OjQxOjI0IFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSJBcnRpZmFjdCBBMiBtYWluIiBrZXlDb25zaWRlcmF0aW9ucz0iQXJ0aWZhY3QgQTIga2V5IiBleHRlcm5hbElkPSJBcnRpZmFjdCBBMiB1bmlxdWUiIHB1cnBvc2U9IkFydGlmYWN0IEEyIHB1cnBvc2UiIGltcGFjdE9mTm90SGF2aW5nPSJBcnRpZmFjdCBBMiBpbXBhY3QiIHJlYXNvbnNGb3JOb3ROZWVkaW5nPSJBcnRpZmFjdCBBMiByZWFzb24iIGJyaWVmT3V0bGluZT0iQXJ0aWZhY3QgQTIgYnJpZWYiIHJlcHJlc2VudGF0aW9uT3B0aW9ucz0iQXJ0aWZhY3QgQTIgcmVwIj4KLTwvQXJ0aWZhY3REZXNjcmlwdGlvbj4KLTxzdXBwb3J0aW5nTWF0ZXJpYWxzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9zdXBwb3J0aW5nX21hdGVyaWFsX0EyIj4KLTwvc3VwcG9ydGluZ01hdGVyaWFscz4KLTxjb25jZXB0c0FuZFBhcGVycyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvY29uY2VwdF9BMiI+Ci08L2NvbmNlcHRzQW5kUGFwZXJzPgotPGNvbmNlcHRzQW5kUGFwZXJzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS93aGl0ZXBhcGVyX0EyIj4KLTwvY29uY2VwdHNBbmRQYXBlcnM+Ci08Y2hlY2tsaXN0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvY2hlY2tsaXN0X0EyIj4KLTwvY2hlY2tsaXN0cz4KLTxndWlkZWxpbmVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9ndWlkZWxpbmVfQTIiPgotPC9ndWlkZWxpbmVzPgotPGV4YW1wbGVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9leGFtcGxlX0EyIj4KLTwvZXhhbXBsZXM+Ci08YXNzZXRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9yZXVzYWJsZV9hc3NldF9BMiI+Ci08L2Fzc2V0cz4KLTxyZXBvcnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9yZXBvcnRfQTIiPgotPC9yZXBvcnRzPgotPHRlbXBsYXRlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvdGVtcGxhdGVfQTIiPgotPC90ZW1wbGF0ZXM+Ci08dG9vbE1lbnRvcnMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3Rvb2xtZW50b3JfQTIiPgotPC90b29sTWVudG9ycz4KLTxBcnRpZmFjdCBuYW1lPSJhcnRpZmFjdF9BMi4xIiBicmllZkRlc2NyaXB0aW9uPSJBcnRpZmFjdCBBMi4xIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJBcnRpZmFjdCBBMi4xIHByZXNlbnQiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPEFydGlmYWN0RGVzY3JpcHRpb24gbmFtZT0iYXJ0aWZhY3RfQTIuMSxfSEVNdEVBLVJFZHFMMk8xUEpWOWNaQSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURhdGU9IldlZCBBdWcgMTcgMTk6NDQ6MDcgUERUIDIwMDUiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249IkFydGlmYWN0IEEyLjEgbWFpbiIga2V5Q29uc2lkZXJhdGlvbnM9IkFydGlmYWN0IEEyLjEga2V5IiBleHRlcm5hbElkPSJBcnRpZmFjdCBBMi4xIHVuaXF1ZSIgcHVycG9zZT0iQXJ0aWZhY3QgQTIuMSBwdXJwb3NlIiBpbXBhY3RPZk5vdEhhdmluZz0iQXJ0aWZhY3QgQTIuMSBpbXBhY3QiIHJlYXNvbnNGb3JOb3ROZWVkaW5nPSJBcnRpZmFjdCBBMi4xIHJlYXNvbiIgYnJpZWZPdXRsaW5lPSJBcnRpZmFjdCBBMi4xIGJyaWVmIiByZXByZXNlbnRhdGlvbk9wdGlvbnM9IkFydGlmYWN0IEEyLjEgcmVwIj4KLTwvQXJ0aWZhY3REZXNjcmlwdGlvbj4KLTxzdXBwb3J0aW5nTWF0ZXJpYWxzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9zdXBwb3J0aW5nX21hdGVyaWFsX0EyIj4KLTwvc3VwcG9ydGluZ01hdGVyaWFscz4KLTxjb25jZXB0c0FuZFBhcGVycyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvY29uY2VwdF9BMiI+Ci08L2NvbmNlcHRzQW5kUGFwZXJzPgotPGNvbmNlcHRzQW5kUGFwZXJzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS93aGl0ZXBhcGVyX0EyIj4KLTwvY29uY2VwdHNBbmRQYXBlcnM+Ci08Y2hlY2tsaXN0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvY2hlY2tsaXN0X0EyIj4KLTwvY2hlY2tsaXN0cz4KLTxndWlkZWxpbmVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9ndWlkZWxpbmVfQTIiPgotPC9ndWlkZWxpbmVzPgotPGV4YW1wbGVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9leGFtcGxlX0EyIj4KLTwvZXhhbXBsZXM+Ci08YXNzZXRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9yZXVzYWJsZV9hc3NldF9BMiI+Ci08L2Fzc2V0cz4KLTxyZXBvcnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9yZXBvcnRfQTIiPgotPC9yZXBvcnRzPgotPHRlbXBsYXRlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvdGVtcGxhdGVfQTIiPgotPC90ZW1wbGF0ZXM+Ci08dG9vbE1lbnRvcnMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3Rvb2xtZW50b3JfQTIiPgotPC90b29sTWVudG9ycz4KLTxjb250YWluZXJBcnRpZmFjdCBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvYXJ0aWZhY3RfQTIvYXJ0aWZhY3RfQTIuMSI+Ci08L2NvbnRhaW5lckFydGlmYWN0PgotPC9BcnRpZmFjdD4KLTwvQXJ0aWZhY3Q+Ci08RGVsaXZlcmFibGUgbmFtZT0iZGVsaXZlcmFibGVfQTEiIGJyaWVmRGVzY3JpcHRpb249IkRlbGl2ZXJhYmxlIEExIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJEZWxpdmVyYWJsZSBBMSBwcmVzZW50IiB2YXJpYWJpbGl0eVR5cGU9Im5hIj4KLTxEZWxpdmVyYWJsZURlc2NyaXB0aW9uIG5hbWU9ImRlbGl2ZXJhYmxlX0ExLF9JSVNuVUEtUkVkcUwyTzFQSlY5Y1pBIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iVGh1IEF1ZyAxOCAxNDoyOTo1OSBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iRGVsaXZlcmFibGUgQTEgbWFpbiIga2V5Q29uc2lkZXJhdGlvbnM9IkRlbGl2ZXJhYmxlIEExIGtleSIgZXh0ZXJuYWxJZD0iRGVsaXZlcmFibGUgQTEgdW5pcXVlIiBwdXJwb3NlPSJEZWxpdmVyYWJsZSBBMSBwb3Jwb2lzZSIgaW1wYWN0T2ZOb3RIYXZpbmc9IkRlbGl2ZXJhYmxlIEExIGltcGFjdCIgcmVhc29uc0Zvck5vdE5lZWRpbmc9IkRlbGl2ZXJhYmxlIEExIHJlYXNvbiIgZXh0ZXJuYWxEZXNjcmlwdGlvbj0iRGVsaXZlcmFibGUgQTEgZXh0ZXJuIiBwYWNrYWdpbmdHdWlkYW5jZT0iRGVsaXZlcmFibGUgQTEgcGtnIj4KLTwvRGVsaXZlcmFibGVEZXNjcmlwdGlvbj4KLTxzdXBwb3J0aW5nTWF0ZXJpYWxzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9zdXBwb3J0aW5nX21hdGVyaWFsX0ExIj4KLTwvc3VwcG9ydGluZ01hdGVyaWFscz4KLTxjb25jZXB0c0FuZFBhcGVycyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvY29uY2VwdF9BMSI+Ci08L2NvbmNlcHRzQW5kUGFwZXJzPgotPGNvbmNlcHRzQW5kUGFwZXJzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS93aGl0ZXBhcGVyX0ExIj4KLTwvY29uY2VwdHNBbmRQYXBlcnM+Ci08Y2hlY2tsaXN0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvY2hlY2tsaXN0X0ExIj4KLTwvY2hlY2tsaXN0cz4KLTxndWlkZWxpbmVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9ndWlkZWxpbmVfQTEiPgotPC9ndWlkZWxpbmVzPgotPGV4YW1wbGVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9leGFtcGxlX0ExIj4KLTwvZXhhbXBsZXM+Ci08YXNzZXRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9yZXVzYWJsZV9hc3NldF9BMSI+Ci08L2Fzc2V0cz4KLTxyZXBvcnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9yZXBvcnRfQTEiPgotPC9yZXBvcnRzPgotPHRlbXBsYXRlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvdGVtcGxhdGVfQTEiPgotPC90ZW1wbGF0ZXM+Ci08dG9vbE1lbnRvcnMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3Rvb2xtZW50b3JfQTEiPgotPC90b29sTWVudG9ycz4KLTxkZWxpdmVyZWRXb3JrUHJvZHVjdHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2FydGlmYWN0X0ExIj4KLTwvZGVsaXZlcmVkV29ya1Byb2R1Y3RzPgotPGRlbGl2ZXJlZFdvcmtQcm9kdWN0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvYXJ0aWZhY3RfQTEvc3ViX2FydGlmYWN0X0ExLjEiPgotPC9kZWxpdmVyZWRXb3JrUHJvZHVjdHM+Ci08ZGVsaXZlcmVkV29ya1Byb2R1Y3RzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9vdXRjb21lX0ExIj4KLTwvZGVsaXZlcmVkV29ya1Byb2R1Y3RzPgotPC9EZWxpdmVyYWJsZT4KLTxEZWxpdmVyYWJsZSBuYW1lPSJkZWxpdmVyYWJsZV9BMiIgYnJpZWZEZXNjcmlwdGlvbj0iRGVsaXZlcmFibGUgQTIgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IkRlbGl2ZXJhYmxlIEEyIHByZXNlbnQiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPERlbGl2ZXJhYmxlRGVzY3JpcHRpb24gbmFtZT0iZGVsaXZlcmFibGVfQTIsX0pCcWZVQS1SRWRxTDJPMVBKVjljWkEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJUaHUgQXVnIDE4IDE0OjMwOjE1IFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSJEZWxpdmVyYWJsZSBBMiBtYWluIiBrZXlDb25zaWRlcmF0aW9ucz0iRGVsaXZlcmFibGUgQTIga2V5IiBleHRlcm5hbElkPSJEZWxpdmVyYWJsZSBBMiB1bmlxdWUiIHB1cnBvc2U9IkRlbGl2ZXJhYmxlIEEyIHBvcnBvaXNlIiBpbXBhY3RPZk5vdEhhdmluZz0iRGVsaXZlcmFibGUgQTImYW1wO25ic3A7aW1wYWN0IiByZWFzb25zRm9yTm90TmVlZGluZz0iRGVsaXZlcmFibGUgQTIgcmVhc29uIiBleHRlcm5hbERlc2NyaXB0aW9uPSJEZWxpdmVyYWJsZSBBMiBleHRlcm4iIHBhY2thZ2luZ0d1aWRhbmNlPSJEZWxpdmVyYWJsZSBBMiBwa2ciPgotPC9EZWxpdmVyYWJsZURlc2NyaXB0aW9uPgotPHN1cHBvcnRpbmdNYXRlcmlhbHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3N1cHBvcnRpbmdfbWF0ZXJpYWxfQTIiPgotPC9zdXBwb3J0aW5nTWF0ZXJpYWxzPgotPGNvbmNlcHRzQW5kUGFwZXJzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9jb25jZXB0X0EyIj4KLTwvY29uY2VwdHNBbmRQYXBlcnM+Ci08Y29uY2VwdHNBbmRQYXBlcnMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3doaXRlcGFwZXJfQTIiPgotPC9jb25jZXB0c0FuZFBhcGVycz4KLTxjaGVja2xpc3RzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9jaGVja2xpc3RfQTIiPgotPC9jaGVja2xpc3RzPgotPGd1aWRlbGluZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2d1aWRlbGluZV9BMiI+Ci08L2d1aWRlbGluZXM+Ci08ZXhhbXBsZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2V4YW1wbGVfQTIiPgotPC9leGFtcGxlcz4KLTxhc3NldHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3JldXNhYmxlX2Fzc2V0X0EyIj4KLTwvYXNzZXRzPgotPHJlcG9ydHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3JlcG9ydF9BMiI+Ci08L3JlcG9ydHM+Ci08dGVtcGxhdGVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS90ZW1wbGF0ZV9BMiI+Ci08L3RlbXBsYXRlcz4KLTx0b29sTWVudG9ycyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvdG9vbG1lbnRvcl9BMiI+Ci08L3Rvb2xNZW50b3JzPgotPGRlbGl2ZXJlZFdvcmtQcm9kdWN0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvYXJ0aWZhY3RfQTIiPgotPC9kZWxpdmVyZWRXb3JrUHJvZHVjdHM+Ci08ZGVsaXZlcmVkV29ya1Byb2R1Y3RzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9vdXRjb21lX0EyIj4KLTwvZGVsaXZlcmVkV29ya1Byb2R1Y3RzPgotPC9EZWxpdmVyYWJsZT4KLTxPdXRjb21lIG5hbWU9Im91dGNvbWVfQTEiIGJyaWVmRGVzY3JpcHRpb249Ik91dGNvbWUgQTEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9Ik91dGNvbWUgQTEgcHJlc2VudCIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08V29ya1Byb2R1Y3REZXNjcmlwdGlvbiBuYW1lPSJvdXRjb21lX0ExLF9LQV8xWUEtUkVkcUwyTzFQSlY5Y1pBIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iVGh1IEF1ZyAxOCAxNDozMDoxOCBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiBPdXRjb21lIEExICIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iT3V0Y29tZSBBMSBtYWluIiBrZXlDb25zaWRlcmF0aW9ucz0iT3V0Y29tZSBBMSBrZXkiIGV4dGVybmFsSWQ9Ik91dGNvbWUgQTEgdW5pcXVlIiBwdXJwb3NlPSJPdXRjb21lIEExIHBvcnBvaXNlIiBpbXBhY3RPZk5vdEhhdmluZz0iT3V0Y29tZSBBMSBpbXBhY3QiIHJlYXNvbnNGb3JOb3ROZWVkaW5nPSJPdXRjb21lIEExIHJlYXNvbiI+Ci08L1dvcmtQcm9kdWN0RGVzY3JpcHRpb24+Ci08c3VwcG9ydGluZ01hdGVyaWFscyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvc3VwcG9ydGluZ19tYXRlcmlhbF9BMSI+Ci08L3N1cHBvcnRpbmdNYXRlcmlhbHM+Ci08Y29uY2VwdHNBbmRQYXBlcnMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2NvbmNlcHRfQTEiPgotPC9jb25jZXB0c0FuZFBhcGVycz4KLTxjb25jZXB0c0FuZFBhcGVycyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvd2hpdGVwYXBlcl9BMSI+Ci08L2NvbmNlcHRzQW5kUGFwZXJzPgotPGNoZWNrbGlzdHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2NoZWNrbGlzdF9BMSI+Ci08L2NoZWNrbGlzdHM+Ci08Z3VpZGVsaW5lcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvZ3VpZGVsaW5lX0ExIj4KLTwvZ3VpZGVsaW5lcz4KLTxleGFtcGxlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvZXhhbXBsZV9BMSI+Ci08L2V4YW1wbGVzPgotPGFzc2V0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvcmV1c2FibGVfYXNzZXRfQTEiPgotPC9hc3NldHM+Ci08cmVwb3J0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvcmVwb3J0X0ExIj4KLTwvcmVwb3J0cz4KLTx0ZW1wbGF0ZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3RlbXBsYXRlX0ExIj4KLTwvdGVtcGxhdGVzPgotPHRvb2xNZW50b3JzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS90b29sbWVudG9yX0ExIj4KLTwvdG9vbE1lbnRvcnM+Ci08L091dGNvbWU+Ci08T3V0Y29tZSBuYW1lPSJvdXRjb21lX0EyIiBicmllZkRlc2NyaXB0aW9uPSJPdXRjb21lIEExIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJPdXRjb21lIEEyIHByZXNlbnQiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPFdvcmtQcm9kdWN0RGVzY3JpcHRpb24gbmFtZT0ib3V0Y29tZV9BMixfS3ZMeEVBLVJFZHFMMk8xUEpWOWNaQSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURhdGU9IlRodSBBdWcgMTggMTQ6MzA6MjEgUERUIDIwMDUiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249Ik91dGNvbWUgQTEgbWFpbiIga2V5Q29uc2lkZXJhdGlvbnM9Ik91dGNvbWUgQTEga2V5IiBleHRlcm5hbElkPSJPdXRjb21lIEExIHVuaXF1ZSIgcHVycG9zZT0iT3V0Y29tZSBBMSBwb3Jwb2lzZSIgaW1wYWN0T2ZOb3RIYXZpbmc9Ik91dGNvbWUgQTEgaW1wYWN0IiByZWFzb25zRm9yTm90TmVlZGluZz0iT3V0Y29tZSBBMSByZWFzb24iPgotPC9Xb3JrUHJvZHVjdERlc2NyaXB0aW9uPgotPHN1cHBvcnRpbmdNYXRlcmlhbHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3N1cHBvcnRpbmdfbWF0ZXJpYWxfQTIiPgotPC9zdXBwb3J0aW5nTWF0ZXJpYWxzPgotPGNvbmNlcHRzQW5kUGFwZXJzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9jb25jZXB0X0EyIj4KLTwvY29uY2VwdHNBbmRQYXBlcnM+Ci08Y29uY2VwdHNBbmRQYXBlcnMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3doaXRlcGFwZXJfQTIiPgotPC9jb25jZXB0c0FuZFBhcGVycz4KLTxjaGVja2xpc3RzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9jaGVja2xpc3RfQTIiPgotPC9jaGVja2xpc3RzPgotPGd1aWRlbGluZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2d1aWRlbGluZV9BMiI+Ci08L2d1aWRlbGluZXM+Ci08ZXhhbXBsZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2V4YW1wbGVfQTIiPgotPC9leGFtcGxlcz4KLTxhc3NldHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3JldXNhYmxlX2Fzc2V0X0EyIj4KLTwvYXNzZXRzPgotPHJlcG9ydHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3JlcG9ydF9BMiI+Ci08L3JlcG9ydHM+Ci08dGVtcGxhdGVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS90ZW1wbGF0ZV9BMiI+Ci08L3RlbXBsYXRlcz4KLTx0b29sTWVudG9ycyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvdG9vbG1lbnRvcl9BMiI+Ci08L3Rvb2xNZW50b3JzPgotPC9PdXRjb21lPgotPENoZWNrbGlzdCBuYW1lPSJjaGVja2xpc3RfQTEiIGJyaWVmRGVzY3JpcHRpb249IkNoZWNrbGlzdCBBMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iQ2hlY2tsaXN0IEExIHByZXNlbnQiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPENvbnRlbnREZXNjcmlwdGlvbiBuYW1lPSJjaGVja2xpc3RfQTEsX0tWNHEwQS1TRWRxTDJPMVBKVjljWkEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJUaHUgQXVnIDE4IDE0OjMwOjM0IFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSJDaGVja2xpc3QgQTEgY29udGVudCIga2V5Q29uc2lkZXJhdGlvbnM9IiI+Ci08L0NvbnRlbnREZXNjcmlwdGlvbj4KLTwvQ2hlY2tsaXN0PgotPENvbmNlcHQgbmFtZT0iY29uY2VwdF9BMSIgYnJpZWZEZXNjcmlwdGlvbj0iQ29uY2VwdCBBMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iQ29uY2VwdCBBMSBwcmVzZW50IiBzaGFwZWljb249ImZpbGU6L0M6L0RvY3VtZW50cyUyMGFuZCUyMFNldHRpbmdzL3RyYW4tbHV1L0lCTS9NZXRob2RMaWJyYXJpZXMvcGFyaXMvUGx1ZyUyMEEvZ3VpZGFuY2VzL2NvbmNlcHRzL3Jlc291cmNlcy90eXJhbm5vc2F1cnVzLmdpZiIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08Q29udGVudERlc2NyaXB0aW9uIG5hbWU9ImNvbmNlcHRfQTEsX05ETC1rQS1TRWRxTDJPMVBKVjljWkEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJUaHUgQXVnIDE4IDE0OjMwOjMwIFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSImbHQ7cCZndDsmIzEzOyYjMTA7ICAgIENvbmNlcHQgQTEgY29udGVudCYjMTM7JiMxMDsmbHQ7L3AmZ3Q7JiMxMzsmIzEwOyZsdDtwJmd0OyYjMTM7JiMxMDsgICAgRmlsZSBsaW5rOiZhbXA7bmJzcDsmbHQ7YSBocmVmPSZxdW90O2ZpbGU6Ly8vcmVzb3VyY2VzL2NvbmNlcHRfQTEueG1pJnF1b3Q7Jmd0O2NvbmNlcHRfQTEueG1pJmx0Oy9hJmd0OyYjMTM7JiMxMDsmbHQ7L3AmZ3Q7JiMxMzsmIzEwOyZsdDtwJmd0OyYjMTM7JiMxMDsgICAgVVJMOiZhbXA7bmJzcDsmbHQ7YSBocmVmPSZxdW90O2h0dHA6Ly93d3cucG9zaXRyb25ncm91cC5jb20mcXVvdDsmZ3Q7aHR0cDovL3d3dy5wb3NpdHJvbmdyb3VwLmNvbSZsdDsvYSZndDsmIzEzOyYjMTA7Jmx0Oy9wJmd0OyYjMTM7JiMxMDsmbHQ7cCZndDsmIzEzOyYjMTA7ICAgIEltYWdlOiZhbXA7bmJzcDsmbHQ7aW1nIGhlaWdodD0mcXVvdDszMiZxdW90OyBhbHQ9JnF1b3Q7UCZxdW90OyBzcmM9JnF1b3Q7cmVzb3VyY2VzL3R5cmFubm9zYXVydXMuZ2lmJnF1b3Q7IHdpZHRoPSZxdW90OzMyJnF1b3Q7IC8mZ3Q7JiMxMzsmIzEwOyZsdDsvcCZndDsmIzEzOyYjMTA7Jmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICBFbGVtZW50IHBsYWluOiZhbXA7bmJzcDsmbHQ7YSBjbGFzcz0mcXVvdDtlbGVtZW50TGluayZxdW90OyYjMTM7JiMxMDsgICAgaHJlZj0mcXVvdDsuLy4uLy4uLy4uL1BsdWclMjBBL2d1aWRhbmNlcy9jb25jZXB0cy9jb25jZXB0X0EyLF9PVkxWY0EtVEVkcUwyTzFQSlY5Y1pBLmh0bWwmcXVvdDsmIzEzOyYjMTA7ICAgIGd1aWQ9JnF1b3Q7X09WTFZjQS1URWRxTDJPMVBKVjljWkEmcXVvdDsmZ3Q7Q29uY2VwdCBBMiBwcmVzZW50Jmx0Oy9hJmd0OyYjMTM7JiMxMDsmbHQ7L3AmZ3Q7JiMxMzsmIzEwOyZsdDtwJmd0OyYjMTM7JiMxMDsgICAgRWxlbWVudCB3aXRoIHR5cGU6JmFtcDtuYnNwOyZsdDthIGNsYXNzPSZxdW90O2VsZW1lbnRMaW5rV2l0aFR5cGUmcXVvdDsmIzEzOyYjMTA7ICAgIGhyZWY9JnF1b3Q7Li8uLi8uLi8uLi9QbHVnJTIwQS9ndWlkYW5jZXMvY29uY2VwdHMvY29uY2VwdF9BMixfT1ZMVmNBLVRFZHFMMk8xUEpWOWNaQS5odG1sJnF1b3Q7JiMxMzsmIzEwOyAgICBndWlkPSZxdW90O19PVkxWY0EtVEVkcUwyTzFQSlY5Y1pBJnF1b3Q7Jmd0O0NvbmNlcHQ6IENvbmNlcHQgQTIgcHJlc2VudCZsdDsvYSZndDsmIzEzOyYjMTA7Jmx0Oy9wJmd0OyYjMTM7JiMxMDsmbHQ7cCZndDsmIzEzOyYjMTA7ICAgIEVsZW1lbnQgd2l0aCB1c2VyIHRleHQ6JmFtcDtuYnNwOyAmbHQ7YSBjbGFzcz0mcXVvdDtlbGVtZW50TGlua1dpdGhVc2VyVGV4dCZxdW90OyYjMTM7JiMxMDsgICAgaHJlZj0mcXVvdDsuLy4uLy4uLy4uL1BsdWclMjBBL2d1aWRhbmNlcy9jb25jZXB0cy9jb25jZXB0X0EyLF9PVkxWY0EtVEVkcUwyTzFQSlY5Y1pBLmh0bWwmcXVvdDsmIzEzOyYjMTA7ICAgIGd1aWQ9JnF1b3Q7X09WTFZjQS1URWRxTDJPMVBKVjljWkEmcXVvdDsmZ3Q7Y29uY2VwdF9BMiB1c2VyIHRleHQmbHQ7L2EmZ3Q7JiMxMzsmIzEwOyZsdDsvcCZndDsiIGtleUNvbnNpZGVyYXRpb25zPSIiPgotPC9Db250ZW50RGVzY3JpcHRpb24+Ci08L0NvbmNlcHQ+Ci08RXhhbXBsZSBuYW1lPSJleGFtcGxlX0ExIiBicmllZkRlc2NyaXB0aW9uPSJFeGFtcGxlIEExIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJFeGFtcGxlIEExIHByZXNlbnQiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPENvbnRlbnREZXNjcmlwdGlvbiBuYW1lPSJleGFtcGxlX0ExLF9PQnh0d0EtU0VkcUwyTzFQSlY5Y1pBIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iVGh1IEF1ZyAxOCAxNDozMDozOCBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iRXhhbXBsZSBBMSBjb250ZW50IiBrZXlDb25zaWRlcmF0aW9ucz0iIj4KLTwvQ29udGVudERlc2NyaXB0aW9uPgotPC9FeGFtcGxlPgotPEd1aWRlbGluZSBuYW1lPSJndWlkZWxpbmVfQTEiIGJyaWVmRGVzY3JpcHRpb249Ikd1aWRlbGluZSBBMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iR3VpZGVsaW5lIEExIHByZXNlbnQiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPENvbnRlbnREZXNjcmlwdGlvbiBuYW1lPSJndWlkZWxpbmVfQTEsX09rQ3RVQS1TRWRxTDJPMVBKVjljWkEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJUaHUgQXVnIDE4IDE0OjMwOjQzIFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSJHdWlkZWxpbmUgQTEgY29udGVudCIga2V5Q29uc2lkZXJhdGlvbnM9IiI+Ci08L0NvbnRlbnREZXNjcmlwdGlvbj4KLTwvR3VpZGVsaW5lPgotPFByYWN0aWNlIG5hbWU9InByYWN0aWNlX0ExIiBicmllZkRlc2NyaXB0aW9uPSJQcmFjdGljZSBBMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iUHJhY3RpY2UgQTEgcHJlc2VudCIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08UHJhY3RpY2VEZXNjcmlwdGlvbiBuYW1lPSJwcmFjdGljZV9BMSxfUDhqWVlBLVNFZHFMMk8xUEpWOWNaQSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURhdGU9IlRodSBBdWcgMTggMTQ6MzE6MTggUERUIDIwMDUiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249IlByYWN0aWNlIEExIGNvbnRlbnQiIGtleUNvbnNpZGVyYXRpb25zPSIiIGFkZGl0aW9uYWxJbmZvPSJQcmFjdGljZSBBMSBhZGQiIHByb2JsZW09IlByYWN0aWNlIEExIHByb2JsZW0iIGJhY2tncm91bmQ9IlByYWN0aWNlIEExIGJhY2siIGdvYWxzPSJQcmFjdGljZSBBMSBnb2FsIiBhcHBsaWNhdGlvbj0iUHJhY3RpY2UgQTEgYXBwIiBsZXZlbHNPZkFkb3B0aW9uPSJQcmFjdGljZSBBMSBsZXZlbCI+Ci08L1ByYWN0aWNlRGVzY3JpcHRpb24+Ci08UHJhY3RpY2UgbmFtZT0icHJhY3RpY2VfQTEuMSIgYnJpZWZEZXNjcmlwdGlvbj0iUHJhY3RpY2UgQTEuMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iUHJhY3RpY2UgQTEuMSBwcmVzZW50IiB2YXJpYWJpbGl0eVR5cGU9Im5hIj4KLTxQcmFjdGljZURlc2NyaXB0aW9uIG5hbWU9InByYWN0aWNlX0ExLjEsXy1GU1VnQS1VRWRxTDJPMVBKVjljWkEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJUaHUgQXVnIDE4IDE0OjMxOjIwIFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSJQcmFjdGljZSBBMS4xIGNvbnRlbnQiIGtleUNvbnNpZGVyYXRpb25zPSIiIGFkZGl0aW9uYWxJbmZvPSJQcmFjdGljZSBBMS4xIGFkZCIgcHJvYmxlbT0iUHJhY3RpY2UgQTEuMSBwcm9ibGVtIiBiYWNrZ3JvdW5kPSJQcmFjdGljZSBBMS4xIGJhY2siIGdvYWxzPSJQcmFjdGljZSBBMS4xIGdvYWwiIGFwcGxpY2F0aW9uPSJQcmFjdGljZSBBMS4xIGFwcCIgbGV2ZWxzT2ZBZG9wdGlvbj0iUHJhY3RpY2UgQTEuMSBsZXZlbCI+Ci08L1ByYWN0aWNlRGVzY3JpcHRpb24+Ci08L1ByYWN0aWNlPgotPGNvbnRlbnRSZWZlcmVuY2VzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9hcnRpZmFjdF9BMSI+Ci08L2NvbnRlbnRSZWZlcmVuY2VzPgotPGNvbnRlbnRSZWZlcmVuY2VzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhdGVnb3JpZXMvQ3VzdG9tQ2F0ZWdvcmllcy9jdXN0b21fY2F0ZWdvcnlfQTEiPgotPC9jb250ZW50UmVmZXJlbmNlcz4KLTxjb250ZW50UmVmZXJlbmNlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXRlZ29yaWVzL0Rpc2NpcGxpbmVzL2Rpc2NpcGxpbmVfQTEiPgotPC9jb250ZW50UmVmZXJlbmNlcz4KLTxjb250ZW50UmVmZXJlbmNlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXRlZ29yaWVzL0RvbWFpbnMvZG9tYWluX0ExIj4KLTwvY29udGVudFJlZmVyZW5jZXM+Ci08Y29udGVudFJlZmVyZW5jZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2F0ZWdvcmllcy9Sb2xlU2V0cy9yb2xlX3NldF9BMSI+Ci08L2NvbnRlbnRSZWZlcmVuY2VzPgotPGNvbnRlbnRSZWZlcmVuY2VzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhdGVnb3JpZXMvVG9vbHMvdG9vbF9BMSI+Ci08L2NvbnRlbnRSZWZlcmVuY2VzPgotPGNvbnRlbnRSZWZlcmVuY2VzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhdGVnb3JpZXMvV1AgVHlwZXMvd29ya19wcm9kdWN0X3R5cGVfQTEiPgotPC9jb250ZW50UmVmZXJlbmNlcz4KLTxjb250ZW50UmVmZXJlbmNlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvY2hlY2tsaXN0X0ExIj4KLTwvY29udGVudFJlZmVyZW5jZXM+Ci08Y29udGVudFJlZmVyZW5jZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2NvbmNlcHRfQTEiPgotPC9jb250ZW50UmVmZXJlbmNlcz4KLTxjb250ZW50UmVmZXJlbmNlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvZXhhbXBsZV9BMSI+Ci08L2NvbnRlbnRSZWZlcmVuY2VzPgotPGNvbnRlbnRSZWZlcmVuY2VzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9ndWlkZWxpbmVfQTEiPgotPC9jb250ZW50UmVmZXJlbmNlcz4KLTxjb250ZW50UmVmZXJlbmNlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvb3V0Y29tZV9BMSI+Ci08L2NvbnRlbnRSZWZlcmVuY2VzPgotPGNvbnRlbnRSZWZlcmVuY2VzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9wcmFjdGljZV9BMiI+Ci08L2NvbnRlbnRSZWZlcmVuY2VzPgotPGNvbnRlbnRSZWZlcmVuY2VzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9yZXBvcnRfQTEiPgotPC9jb250ZW50UmVmZXJlbmNlcz4KLTxjb250ZW50UmVmZXJlbmNlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvcmV1c2FibGVfYXNzZXRfQTEiPgotPC9jb250ZW50UmVmZXJlbmNlcz4KLTxjb250ZW50UmVmZXJlbmNlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvcm9hZG1hcF9BMSI+Ci08L2NvbnRlbnRSZWZlcmVuY2VzPgotPGNvbnRlbnRSZWZlcmVuY2VzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9yb2xlX0ExIj4KLTwvY29udGVudFJlZmVyZW5jZXM+Ci08Y29udGVudFJlZmVyZW5jZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3N1cHBvcnRpbmdfbWF0ZXJpYWxfQTEiPgotPC9jb250ZW50UmVmZXJlbmNlcz4KLTxjb250ZW50UmVmZXJlbmNlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvdGFza19BMSI+Ci08L2NvbnRlbnRSZWZlcmVuY2VzPgotPGNvbnRlbnRSZWZlcmVuY2VzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS90ZW1wbGF0ZV9BMSI+Ci08L2NvbnRlbnRSZWZlcmVuY2VzPgotPGNvbnRlbnRSZWZlcmVuY2VzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS90b29sbWVudG9yX0ExIj4KLTwvY29udGVudFJlZmVyZW5jZXM+Ci08Y29udGVudFJlZmVyZW5jZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3doaXRlcGFwZXJfQTEiPgotPC9jb250ZW50UmVmZXJlbmNlcz4KLTxjb250ZW50UmVmZXJlbmNlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvYXJ0aWZhY3RfQTEvc3ViX2FydGlmYWN0X0ExLjEiPgotPC9jb250ZW50UmVmZXJlbmNlcz4KLTxjb250ZW50UmVmZXJlbmNlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvZGVsaXZlcmFibGVfQTEiPgotPC9jb250ZW50UmVmZXJlbmNlcz4KLTxjb250ZW50UmVmZXJlbmNlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXRlZ29yaWVzL0N1c3RvbUNhdGVnb3JpZXMvc3ViX2N1c3RvbV9jYXRlZ29yeV9BMS4xIj4KLTwvY29udGVudFJlZmVyZW5jZXM+Ci08Y29udGVudFJlZmVyZW5jZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2F0ZWdvcmllcy9EaXNjaXBsaW5lcy9kaXNjaXBsaW5lX2dyb3VwaW5nX0ExIj4KLTwvY29udGVudFJlZmVyZW5jZXM+Ci08Y29udGVudFJlZmVyZW5jZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2F0ZWdvcmllcy9Eb21haW5zL2RvbWFpbl9BMS9zdWJfZG9tYWluX0ExLjEiPgotPC9jb250ZW50UmVmZXJlbmNlcz4KLTxjb250ZW50UmVmZXJlbmNlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXRlZ29yaWVzL1JvbGVTZXRzL3JvbGVfc2V0X2dyb3VwaW5nX0ExIj4KLTwvY29udGVudFJlZmVyZW5jZXM+Ci08L1ByYWN0aWNlPgotPFJlcG9ydCBuYW1lPSJyZXBvcnRfQTEiIGJyaWVmRGVzY3JpcHRpb249IlJlcG9ydCBBMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iUmVwb3J0IEExIHByZXNlbnQiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPENvbnRlbnREZXNjcmlwdGlvbiBuYW1lPSJyZXBvcnRfQTEsX1E1RGM0QS1TRWRxTDJPMVBKVjljWkEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJUaHUgQXVnIDE4IDE0OjMwOjUxIFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSJSZXBvcnQgQTEgY29udGVudCIga2V5Q29uc2lkZXJhdGlvbnM9IiI+Ci08L0NvbnRlbnREZXNjcmlwdGlvbj4KLTwvUmVwb3J0PgotPFJldXNhYmxlQXNzZXQgbmFtZT0icmV1c2FibGVfYXNzZXRfQTEiIGJyaWVmRGVzY3JpcHRpb249IlJldXNhYmxlIEFzc2V0IEExIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJSZXVzYWJsZSBBc3NldCBBMSBwcmVzZW50IiB2YXJpYWJpbGl0eVR5cGU9Im5hIj4KLTxDb250ZW50RGVzY3JpcHRpb24gbmFtZT0icmV1c2FibGVfYXNzZXRfQTEsX1RWMGFRQS1TRWRxTDJPMVBKVjljWkEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJUaHUgQXVnIDE4IDE0OjMxOjI3IFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSJSZXVzYWJsZSBBc3NldCBBMSBjb250ZW50IiBrZXlDb25zaWRlcmF0aW9ucz0iIj4KLTwvQ29udGVudERlc2NyaXB0aW9uPgotPC9SZXVzYWJsZUFzc2V0PgotPFJvYWRtYXAgbmFtZT0icm9hZG1hcF9BMSIgYnJpZWZEZXNjcmlwdGlvbj0iUm9hZG1hcCBBMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iUm9hZG1hcCBBMSBwcmVzZW50IiB2YXJpYWJpbGl0eVR5cGU9Im5hIj4KLTxDb250ZW50RGVzY3JpcHRpb24gbmFtZT0icm9hZG1hcF9BMSxfWmszOWdBLVNFZHFMMk8xUEpWOWNaQSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURhdGU9IlRodSBBdWcgMTggMTQ6MzA6MDQgUERUIDIwMDUiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249IlJvYWRtYXAgQTEgY29udGVudCIga2V5Q29uc2lkZXJhdGlvbnM9IiI+Ci08L0NvbnRlbnREZXNjcmlwdGlvbj4KLTwvUm9hZG1hcD4KLTxTdXBwb3J0aW5nTWF0ZXJpYWwgbmFtZT0ic3VwcG9ydGluZ19tYXRlcmlhbF9BMSIgYnJpZWZEZXNjcmlwdGlvbj0iU3VwcG9ydGluZyBNYXRlcmlhbCBBMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iU3VwcG9ydGluZyBNYXRlcmlhbCBBMSBwcmVzZW50IiB2YXJpYWJpbGl0eVR5cGU9Im5hIj4KLTxDb250ZW50RGVzY3JpcHRpb24gbmFtZT0ic3VwcG9ydGluZ19tYXRlcmlhbF9BMSxfYUZwdlVBLVNFZHFMMk8xUEpWOWNaQSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURhdGU9IlRodSBBdWcgMTggMTQ6MzE6MDEgUERUIDIwMDUiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249IlN1cHBvcnRpbmcgTWF0ZXJpYWwgQTEgY29udGVudCIga2V5Q29uc2lkZXJhdGlvbnM9IiI+Ci08L0NvbnRlbnREZXNjcmlwdGlvbj4KLTwvU3VwcG9ydGluZ01hdGVyaWFsPgotPFRlbXBsYXRlIG5hbWU9InRlbXBsYXRlX0ExIiBicmllZkRlc2NyaXB0aW9uPSJUZW1wbGF0ZSBBMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iVGVtcGxhdGUgQTEgcHJlc2VudCIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08R3VpZGFuY2VEZXNjcmlwdGlvbiBuYW1lPSJ0ZW1wbGF0ZV9BMSxfYkZJUFVBLVNFZHFMMk8xUEpWOWNaQSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURhdGU9IlRodSBBdWcgMTggMTQ6MzA6NTYgUERUIDIwMDUiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249IlRlbXBsYXRlIEExIGNvbnRlbnQiIGtleUNvbnNpZGVyYXRpb25zPSIiIGF0dGFjaG1lbnRzPSIiPgotPC9HdWlkYW5jZURlc2NyaXB0aW9uPgotPC9UZW1wbGF0ZT4KLTxUb29sTWVudG9yIG5hbWU9InRvb2xtZW50b3JfQTEiIGJyaWVmRGVzY3JpcHRpb249IlRvb2xtZW50b3IgQTEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IlRvb2xtZW50b3IgQTEgcHJlc2VudCIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08Q29udGVudERlc2NyaXB0aW9uIG5hbWU9InRvb2xtZW50b3JfQTEsX2hIRWpvQS1TRWRxTDJPMVBKVjljWkEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJUaHUgQXVnIDE4IDE0OjMxOjA1IFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSJUb29sbWVudG9yIEExIGNvbnRlbnQiIGtleUNvbnNpZGVyYXRpb25zPSIiPgotPC9Db250ZW50RGVzY3JpcHRpb24+Ci08L1Rvb2xNZW50b3I+Ci08V2hpdGVwYXBlciBuYW1lPSJ3aGl0ZXBhcGVyX0ExIiBicmllZkRlc2NyaXB0aW9uPSJXaGl0ZXBhcGVyIEExIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJXaGl0ZXBhcGVyIEExIHByZXNlbnQiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPENvbnRlbnREZXNjcmlwdGlvbiBuYW1lPSJ3aGl0ZXBhcGVyX0ExLF9oOFJHUUEtU0VkcUwyTzFQSlY5Y1pBIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iVGh1IEF1ZyAxOCAxNDozMToxMyBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iV2hpdGVwYXBlciBBMSBjb250ZW50IiBrZXlDb25zaWRlcmF0aW9ucz0iIj4KLTwvQ29udGVudERlc2NyaXB0aW9uPgotPC9XaGl0ZXBhcGVyPgotPENvbmNlcHQgbmFtZT0iY29uY2VwdF9BMiIgYnJpZWZEZXNjcmlwdGlvbj0iQ29uY2VwdCBBMiBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iQ29uY2VwdCBBMiBwcmVzZW50IiB2YXJpYWJpbGl0eVR5cGU9Im5hIj4KLTxDb250ZW50RGVzY3JpcHRpb24gbmFtZT0iY29uY2VwdF9BMixfT1ZMVmNBLVRFZHFMMk8xUEpWOWNaQSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURhdGU9IlRodSBBdWcgMTggMTQ6MzA6MjQgUERUIDIwMDUiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249IkNvbmNlcHQgQTIgY29udGVudCIga2V5Q29uc2lkZXJhdGlvbnM9IiI+Ci08L0NvbnRlbnREZXNjcmlwdGlvbj4KLTwvQ29uY2VwdD4KLTxDaGVja2xpc3QgbmFtZT0iY2hlY2tsaXN0X0EyIiBicmllZkRlc2NyaXB0aW9uPSJDaGVja2xpc3QgQTIgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IkNoZWNrbGlzdCBBMiBwcmVzZW50IiB2YXJpYWJpbGl0eVR5cGU9Im5hIj4KLTxDb250ZW50RGVzY3JpcHRpb24gbmFtZT0iY2hlY2tsaXN0X0EyLF9rcmlUY0EtVEVkcUwyTzFQSlY5Y1pBIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iVGh1IEF1ZyAxOCAxNDozMDozNiBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iQ2hlY2tsaXN0IEEyIGNvbnRlbnQiIGtleUNvbnNpZGVyYXRpb25zPSIiPgotPC9Db250ZW50RGVzY3JpcHRpb24+Ci08L0NoZWNrbGlzdD4KLTxFeGFtcGxlIG5hbWU9ImV4YW1wbGVfQTIiIGJyaWVmRGVzY3JpcHRpb249IkV4YW1wbGUgQTEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IkV4YW1wbGUgQTEgcHJlc2VudCIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08Q29udGVudERlc2NyaXB0aW9uIG5hbWU9ImV4YW1wbGVfQTIsX3VhaldjQS1URWRxTDJPMVBKVjljWkEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJUaHUgQXVnIDE4IDE0OjMwOjQxIFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSJFeGFtcGxlIEExIGNvbnRlbnQiIGtleUNvbnNpZGVyYXRpb25zPSIiPgotPC9Db250ZW50RGVzY3JpcHRpb24+Ci08L0V4YW1wbGU+Ci08R3VpZGVsaW5lIG5hbWU9Imd1aWRlbGluZV9BMiIgYnJpZWZEZXNjcmlwdGlvbj0iR3VpZGVsaW5lIEEyIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJHdWlkZWxpbmUgQTIgcHJlc2VudCIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08Q29udGVudERlc2NyaXB0aW9uIG5hbWU9Imd1aWRlbGluZV9BMixfNllVd0FBLVRFZHFMMk8xUEpWOWNaQSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURhdGU9IlRodSBBdWcgMTggMTQ6MzA6NDUgUERUIDIwMDUiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249Ikd1aWRlbGluZSBBMiBjb250ZW50IiBrZXlDb25zaWRlcmF0aW9ucz0iIj4KLTwvQ29udGVudERlc2NyaXB0aW9uPgotPC9HdWlkZWxpbmU+Ci08UmVwb3J0IG5hbWU9InJlcG9ydF9BMiIgYnJpZWZEZXNjcmlwdGlvbj0iUmVwb3J0IEEyIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJSZXBvcnQgQTIgcHJlc2VudCIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08Q29udGVudERlc2NyaXB0aW9uIG5hbWU9InJlcG9ydF9BMixfR3JHd1FBLVVFZHFMMk8xUEpWOWNaQSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURhdGU9IlRodSBBdWcgMTggMTQ6MzA6NTMgUERUIDIwMDUiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249IlJlcG9ydCBBMiBjb250ZW50IiBrZXlDb25zaWRlcmF0aW9ucz0iIj4KLTwvQ29udGVudERlc2NyaXB0aW9uPgotPC9SZXBvcnQ+Ci08VGVtcGxhdGUgbmFtZT0idGVtcGxhdGVfQTIiIGJyaWVmRGVzY3JpcHRpb249IlRlbXBsYXRlIEEyIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJUZW1wbGF0ZSBBMiBwcmVzZW50IiB2YXJpYWJpbGl0eVR5cGU9Im5hIj4KLTxHdWlkYW5jZURlc2NyaXB0aW9uIG5hbWU9InRlbXBsYXRlX0EyLF9aWHE5RUEtVUVkcUwyTzFQSlY5Y1pBIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iVGh1IEF1ZyAxOCAxNDozMDo1OCBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iVGVtcGxhdGUgQTIgY29udGVudCIga2V5Q29uc2lkZXJhdGlvbnM9IiIgYXR0YWNobWVudHM9IiI+Ci08L0d1aWRhbmNlRGVzY3JpcHRpb24+Ci08L1RlbXBsYXRlPgotPFN1cHBvcnRpbmdNYXRlcmlhbCBuYW1lPSJzdXBwb3J0aW5nX21hdGVyaWFsX0EyIiBicmllZkRlc2NyaXB0aW9uPSJTdXBwb3J0aW5nIE1hdGVyaWFsIEEyIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJTdXBwb3J0aW5nIE1hdGVyaWFsIEEyIHByZXNlbnQiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPENvbnRlbnREZXNjcmlwdGlvbiBuYW1lPSJzdXBwb3J0aW5nX21hdGVyaWFsX0EyLF9tUHNfY0EtVUVkcUwyTzFQSlY5Y1pBIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iVGh1IEF1ZyAxOCAxNDozMTowMyBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iU3VwcG9ydGluZyBNYXRlcmlhbCBBMiBjb250ZW50IiBrZXlDb25zaWRlcmF0aW9ucz0iIj4KLTwvQ29udGVudERlc2NyaXB0aW9uPgotPC9TdXBwb3J0aW5nTWF0ZXJpYWw+Ci08VG9vbE1lbnRvciBuYW1lPSJ0b29sbWVudG9yX0EyIiBicmllZkRlc2NyaXB0aW9uPSJUb29sbWVudG9yIEEyIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJUb29sbWVudG9yIEEyIHByZXNlbnQiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPENvbnRlbnREZXNjcmlwdGlvbiBuYW1lPSJ0b29sbWVudG9yX0EyLF92N0pLQUEtVUVkcUwyTzFQSlY5Y1pBIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iVGh1IEF1ZyAxOCAxNDozMTowOCBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iVG9vbG1lbnRvciBBMiBjb250ZW50IiBrZXlDb25zaWRlcmF0aW9ucz0iIj4KLTwvQ29udGVudERlc2NyaXB0aW9uPgotPC9Ub29sTWVudG9yPgotPFdoaXRlcGFwZXIgbmFtZT0id2hpdGVwYXBlcl9BMiIgYnJpZWZEZXNjcmlwdGlvbj0iV2hpdGVwYXBlciBBMiBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iV2hpdGVwYXBlciBBMiBwcmVzZW50IiB2YXJpYWJpbGl0eVR5cGU9Im5hIj4KLTxDb250ZW50RGVzY3JpcHRpb24gbmFtZT0id2hpdGVwYXBlcl9BMixfM1hyMEVBLVVFZHFMMk8xUEpWOWNaQSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURhdGU9IlRodSBBdWcgMTggMTQ6MzE6MTUgUERUIDIwMDUiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249IldoaXRlcGFwZXIgQTIgY29udGVudCIga2V5Q29uc2lkZXJhdGlvbnM9IiI+Ci08L0NvbnRlbnREZXNjcmlwdGlvbj4KLTwvV2hpdGVwYXBlcj4KLTxQcmFjdGljZSBuYW1lPSJwcmFjdGljZV9BMiIgYnJpZWZEZXNjcmlwdGlvbj0iUHJhY3RpY2UgQTIgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IlByYWN0aWNlIEEyIHByZXNlbnQiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPFByYWN0aWNlRGVzY3JpcHRpb24gbmFtZT0icHJhY3RpY2VfQTIsX0VwZm9ZQS1WRWRxTDJPMVBKVjljWkEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJUaHUgQXVnIDE4IDE0OjMxOjIzIFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSJQcmFjdGljZSBBMiBjb250ZW50IiBrZXlDb25zaWRlcmF0aW9ucz0iIiBhZGRpdGlvbmFsSW5mbz0iUHJhY3RpY2UgQTIgYWRkIiBwcm9ibGVtPSJQcmFjdGljZSBBMiBwcm9ibGVtIiBiYWNrZ3JvdW5kPSJQcmFjdGljZSBBMiBiYWNrIiBnb2Fscz0iUHJhY3RpY2UgQTIgZ29hbCIgYXBwbGljYXRpb249IlByYWN0aWNlIEEyIGFwcCIgbGV2ZWxzT2ZBZG9wdGlvbj0iUHJhY3RpY2UgQTIgbGV2ZWwiPgotPC9QcmFjdGljZURlc2NyaXB0aW9uPgotPFByYWN0aWNlIG5hbWU9InByYWN0aWNlX0EyLjEiIGJyaWVmRGVzY3JpcHRpb249IlByYWN0aWNlIEEyLjEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IlByYWN0aWNlIEEyLjEgcHJlc2VudCIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08UHJhY3RpY2VEZXNjcmlwdGlvbiBuYW1lPSJwcmFjdGljZV9BMi4xLF9Kcmd3d0EtVkVkcUwyTzFQSlY5Y1pBIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iVGh1IEF1ZyAxOCAxNDozMToyNSBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iUHJhY3RpY2UgQTIuMSBjb250ZW50IiBrZXlDb25zaWRlcmF0aW9ucz0iIiBhZGRpdGlvbmFsSW5mbz0iUHJhY3RpY2UgQTIuMSBhZGQiIHByb2JsZW09IlByYWN0aWNlIEEyLjEgcHJvYmxlbSIgYmFja2dyb3VuZD0iUHJhY3RpY2UgQTIuMSBiYWNrIiBnb2Fscz0iUHJhY3RpY2UgQTIuMSBnb2FsIiBhcHBsaWNhdGlvbj0iUHJhY3RpY2UgQTIuMSBhcHAiIGxldmVsc09mQWRvcHRpb249IlByYWN0aWNlIEEyLjEgbGV2ZWwiPgotPC9QcmFjdGljZURlc2NyaXB0aW9uPgotPC9QcmFjdGljZT4KLTxjb250ZW50UmVmZXJlbmNlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvYXJ0aWZhY3RfQTIiPgotPC9jb250ZW50UmVmZXJlbmNlcz4KLTxjb250ZW50UmVmZXJlbmNlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvYXJ0aWZhY3RfQTIvYXJ0aWZhY3RfQTIuMSI+Ci08L2NvbnRlbnRSZWZlcmVuY2VzPgotPGNvbnRlbnRSZWZlcmVuY2VzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9jaGVja2xpc3RfQTIiPgotPC9jb250ZW50UmVmZXJlbmNlcz4KLTxjb250ZW50UmVmZXJlbmNlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvY29uY2VwdF9BMiI+Ci08L2NvbnRlbnRSZWZlcmVuY2VzPgotPGNvbnRlbnRSZWZlcmVuY2VzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9kZWxpdmVyYWJsZV9BMiI+Ci08L2NvbnRlbnRSZWZlcmVuY2VzPgotPGNvbnRlbnRSZWZlcmVuY2VzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9leGFtcGxlX0EyIj4KLTwvY29udGVudFJlZmVyZW5jZXM+Ci08Y29udGVudFJlZmVyZW5jZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2d1aWRlbGluZV9BMiI+Ci08L2NvbnRlbnRSZWZlcmVuY2VzPgotPGNvbnRlbnRSZWZlcmVuY2VzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9vdXRjb21lX0EyIj4KLTwvY29udGVudFJlZmVyZW5jZXM+Ci08Y29udGVudFJlZmVyZW5jZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3ByYWN0aWNlX0ExIj4KLTwvY29udGVudFJlZmVyZW5jZXM+Ci08Y29udGVudFJlZmVyZW5jZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3JlcG9ydF9BMiI+Ci08L2NvbnRlbnRSZWZlcmVuY2VzPgotPGNvbnRlbnRSZWZlcmVuY2VzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9yZXVzYWJsZV9hc3NldF9BMiI+Ci08L2NvbnRlbnRSZWZlcmVuY2VzPgotPGNvbnRlbnRSZWZlcmVuY2VzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9yb2FkbWFwX0EyIj4KLTwvY29udGVudFJlZmVyZW5jZXM+Ci08Y29udGVudFJlZmVyZW5jZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3JvbGVfQTIiPgotPC9jb250ZW50UmVmZXJlbmNlcz4KLTxjb250ZW50UmVmZXJlbmNlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvc3VwcG9ydGluZ19tYXRlcmlhbF9BMiI+Ci08L2NvbnRlbnRSZWZlcmVuY2VzPgotPGNvbnRlbnRSZWZlcmVuY2VzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS90YXNrX0EyIj4KLTwvY29udGVudFJlZmVyZW5jZXM+Ci08Y29udGVudFJlZmVyZW5jZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3RlbXBsYXRlX0EyIj4KLTwvY29udGVudFJlZmVyZW5jZXM+Ci08Y29udGVudFJlZmVyZW5jZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3Rvb2xtZW50b3JfQTIiPgotPC9jb250ZW50UmVmZXJlbmNlcz4KLTxjb250ZW50UmVmZXJlbmNlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvd2hpdGVwYXBlcl9BMiI+Ci08L2NvbnRlbnRSZWZlcmVuY2VzPgotPGNvbnRlbnRSZWZlcmVuY2VzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhdGVnb3JpZXMvQ3VzdG9tQ2F0ZWdvcmllcy9jdXN0b21fY2F0ZWdvcnlfQTIiPgotPC9jb250ZW50UmVmZXJlbmNlcz4KLTxjb250ZW50UmVmZXJlbmNlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXRlZ29yaWVzL0Rpc2NpcGxpbmVzL2Rpc2NpcGxpbmVfQTIiPgotPC9jb250ZW50UmVmZXJlbmNlcz4KLTxjb250ZW50UmVmZXJlbmNlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXRlZ29yaWVzL0RvbWFpbnMvZG9tYWluX0EyIj4KLTwvY29udGVudFJlZmVyZW5jZXM+Ci08Y29udGVudFJlZmVyZW5jZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2F0ZWdvcmllcy9Sb2xlU2V0cy9yb2xlX3NldF9BMiI+Ci08L2NvbnRlbnRSZWZlcmVuY2VzPgotPGNvbnRlbnRSZWZlcmVuY2VzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhdGVnb3JpZXMvVG9vbHMvdG9vbF9BMiI+Ci08L2NvbnRlbnRSZWZlcmVuY2VzPgotPGNvbnRlbnRSZWZlcmVuY2VzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhdGVnb3JpZXMvV1AgVHlwZXMvd29ya19wcm9kdWN0X3R5cGVfQTIiPgotPC9jb250ZW50UmVmZXJlbmNlcz4KLTwvUHJhY3RpY2U+Ci08UmV1c2FibGVBc3NldCBuYW1lPSJyZXVzYWJsZV9hc3NldF9BMiIgYnJpZWZEZXNjcmlwdGlvbj0iUmV1c2FibGUgQXNzZXQgQTIgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IlJldXNhYmxlIEFzc2V0IEEyIHByZXNlbnQiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPENvbnRlbnREZXNjcmlwdGlvbiBuYW1lPSJyZXVzYWJsZV9hc3NldF9BMixfU01jM0VBLVZFZHFMMk8xUEpWOWNaQSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURhdGU9IlRodSBBdWcgMTggMTQ6MzE6MjkgUERUIDIwMDUiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249IlJldXNhYmxlIEFzc2V0IEEyIGNvbnRlbnQiIGtleUNvbnNpZGVyYXRpb25zPSIiPgotPC9Db250ZW50RGVzY3JpcHRpb24+Ci08L1JldXNhYmxlQXNzZXQ+Ci08Um9hZG1hcCBuYW1lPSJyb2FkbWFwX0EyIiBicmllZkRlc2NyaXB0aW9uPSJSb2FkbWFwIEEyIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJSb2FkbWFwIEEyIHByZXNlbnQiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPENvbnRlbnREZXNjcmlwdGlvbiBuYW1lPSJyb2FkbWFwX0EyLF9ZdWtnUUEtVkVkcUwyTzFQSlY5Y1pBIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iVGh1IEF1ZyAxOCAxNDozMDowNiBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iUm9hZG1hcCBBMiBjb250ZW50IiBrZXlDb25zaWRlcmF0aW9ucz0iIj4KLTwvQ29udGVudERlc2NyaXB0aW9uPgotPC9Sb2FkbWFwPgotPFRlcm1EZWZpbml0aW9uIG5hbWU9InRlcm1fZGVmaW5pdGlvbl9BMiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJUZXJtIERlZmluaXRpb24gQTIgcHJlc2VudCIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08Q29udGVudERlc2NyaXB0aW9uIG5hbWU9InRlcm1fZGVmaW5pdGlvbl9BMixfbzhJN0VBLVZFZHFMMk8xUEpWOWNaQSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURhdGU9IlRodSBBdWcgMTggMTQ6MzE6NDIgUERUIDIwMDUiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249IlRlcm0gRGVmaW5pdGlvbiBBMiBjb250ZW50IiBrZXlDb25zaWRlcmF0aW9ucz0iIj4KLTwvQ29udGVudERlc2NyaXB0aW9uPgotPC9UZXJtRGVmaW5pdGlvbj4KLTxUZXJtRGVmaW5pdGlvbiBuYW1lPSJ0ZXJtX2RlZmluaXRpb25fQTEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iVGVybSBEZWZpbml0aW9uIEExIHByZXNlbnQiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPENvbnRlbnREZXNjcmlwdGlvbiBuYW1lPSJ0ZXJtX2RlZmluaXRpb25fQTEsX3NmaUpVQS1WRWRxTDJPMVBKVjljWkEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJUaHUgQXVnIDE4IDE0OjMwOjEyIFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSJUZXJtIERlZmluaXRpb24gQTEgY29udGVudCIga2V5Q29uc2lkZXJhdGlvbnM9IiI+Ci08L0NvbnRlbnREZXNjcmlwdGlvbj4KLTwvVGVybURlZmluaXRpb24+Ci08VGFzayBuYW1lPSJ0YXNrX0EzIiBicmllZkRlc2NyaXB0aW9uPSJicmllZjogVGFzayBBMyIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiZsdDs/eG1sIHZlcnNpb249JnF1b3Q7MS4wJnF1b3Q7IGVuY29kaW5nPSZxdW90O0FTQ0lJJnF1b3Q7PyZndDsgJmx0O2NvbS5pYm0udW1hLmVkaXQudG5nLnV0aWwubW9kZWw6T3JkZXJJbmZvQ29sbGVjdGlvbiB4bWk6dmVyc2lvbj0mcXVvdDsyLjAmcXVvdDsgeG1sbnM6eG1pPSZxdW90O2h0dHA6Ly93d3cub21nLm9yZy9YTUkmcXVvdDsgeG1sbnM6Y29tLmlibS51bWEuZWRpdC50bmcudXRpbC5tb2RlbD0mcXVvdDtodHRwOi8vL2NvbS9pYm0vdW1hL2VkaXQvdG5nL3V0aWwvbW9kZWwuZWNvcmUmcXVvdDsmZ3Q7ICAgJmx0O29yZGVySW5mb3MgbmFtZT0mcXVvdDtzZWN0aW9ucyZxdW90OyB0aW1lc3RhbXA9JnF1b3Q7MTEyOTc0NzI2NDEwOSZxdW90OyZndDsgICAgICZsdDtnVUlEcyZndDtfckNXd1VFRFBFZHFyaHNaaDNRTkFNUSZsdDsvZ1VJRHMmZ3Q7ICAgICAmbHQ7Z1VJRHMmZ3Q7X3RpMkJZQkJPRWRxQnM3S2hkVkxSTEEmbHQ7L2dVSURzJmd0OyAgICAgJmx0O2dVSURzJmd0O191bXlnWUVEUEVkcXJoc1poM1FOQU1RJmx0Oy9nVUlEcyZndDsgICAgICZsdDtnVUlEcyZndDtfdGs3c0VCQk9FZHFCczdLaGRWTFJMQSZsdDsvZ1VJRHMmZ3Q7ICAgICAmbHQ7Z1VJRHMmZ3Q7X3Z4NUJrRURQRWRxcmhzWmgzUU5BTVEmbHQ7L2dVSURzJmd0OyAgICAgJmx0O2dVSURzJmd0O190bmRib0JCT0VkcUJzN0toZFZMUkxBJmx0Oy9nVUlEcyZndDsgICAmbHQ7L29yZGVySW5mb3MmZ3Q7ICZsdDsvY29tLmlibS51bWEuZWRpdC50bmcudXRpbC5tb2RlbDpPcmRlckluZm9Db2xsZWN0aW9uJmd0OyAiIHByZXNlbnRhdGlvbk5hbWU9IlRhc2sgQTMgZXh0ZW5kcyBUYXNrIEEyIiB2YXJpYWJpbGl0eVR5cGU9ImV4dGVuZHMiPgotPFRhc2tEZXNjcmlwdGlvbiBuYW1lPSIsX29VbHVFRURGRWRxTzlNM2Z1a1lBX0EiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJXZWQgT2N0IDE5IDEwOjI3OjQzIFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSJtYWluOiBUYXNrIEEzIiBrZXlDb25zaWRlcmF0aW9ucz0ia2V5czogVGFzayBBMyIgcHVycG9zZT0icHVycG9zZTogVGFzayBBMyIgYWx0ZXJuYXRpdmVzPSJhbHRlcm5hdGl2ZXM6IFRhc2sgQTMiPgotPFNlY3Rpb24gbmFtZT0iU3RlcCBBMy4xIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHZhcmlhYmlsaXR5VHlwZT0ibmEiIHNlY3Rpb25OYW1lPSIiIHNlY3Rpb25EZXNjcmlwdGlvbj0iU3RlcCBBMy4xIj4KLTwvU2VjdGlvbj4KLTxTZWN0aW9uIG5hbWU9IlN0ZXAgQTMuMiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiB2YXJpYWJpbGl0eVR5cGU9Im5hIiBzZWN0aW9uTmFtZT0iIiBzZWN0aW9uRGVzY3JpcHRpb249IlN0ZXAgQTMuMiI+Ci08L1NlY3Rpb24+Ci08U2VjdGlvbiBuYW1lPSJTdGVwIEEzLjMiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgdmFyaWFiaWxpdHlUeXBlPSJuYSIgc2VjdGlvbk5hbWU9IiIgc2VjdGlvbkRlc2NyaXB0aW9uPSJTdGVwIEEzLjMiPgotPC9TZWN0aW9uPgotPC9UYXNrRGVzY3JpcHRpb24+Ci08dmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvdGFza19BMyI+Ci08L3ZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQ+Ci08cGVyZm9ybWVkQnkgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3Rhc2tfQTMiPgotPC9wZXJmb3JtZWRCeT4KLTxhZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvcm9sZV9BMiI+Ci08L2FkZGl0aW9uYWxseVBlcmZvcm1lZEJ5PgotPHN0ZXBzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS90YXNrX0EzLyxfb1VsdUVFREZFZHFPOU0zZnVrWUFfQS9TdGVwIEEzLjEiPgotPC9zdGVwcz4KLTxzdGVwcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvdGFza19BMy8sX29VbHVFRURGRWRxTzlNM2Z1a1lBX0EvU3RlcCBBMy4yIj4KLTwvc3RlcHM+Ci08c3RlcHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3Rhc2tfQTMvLF9vVWx1RUVERkVkcU85TTNmdWtZQV9BL1N0ZXAgQTMuMyI+Ci08L3N0ZXBzPgotPC9UYXNrPgotPFJvbGUgbmFtZT0icm9sZV9BMyIgYnJpZWZEZXNjcmlwdGlvbj0iYnJpZWYgOiBSb2xlIEEzIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJSb2xlIEEzIGV4dGVuZHMgUm9sZSBBMiIgdmFyaWFiaWxpdHlUeXBlPSJleHRlbmRzIj4KLTxSb2xlRGVzY3JpcHRpb24gbmFtZT0ibmV3X3JvbGUsXzhaTjZBRURGRWRxTzlNM2Z1a1lBX0EiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJXZWQgT2N0IDE5IDEwOjI5OjU5IFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSJtYWluOiBSb2xlIEEzIiBrZXlDb25zaWRlcmF0aW9ucz0ia2V5OiBSb2xlIEEzIiBza2lsbHM9InNraWxsczogUm9sZSBBMyIgYXNzaWdubWVudEFwcHJvYWNoZXM9ImFzc2lnbm1lbnQ6IFJvbGUgQTMiIHN5bm9ueW1zPSJzeW5vbnltbnMgOiBSb2xlIEEzIj4KLTwvUm9sZURlc2NyaXB0aW9uPgotPHZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3JvbGVfQTMiPgotPC92YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50PgotPC9Sb2xlPgotPC9Db250ZW50UGFja2FnZT4KLTwvQ29udGVudFBhY2thZ2U+Ci08UHJvY2Vzc1BhY2thZ2UgbmFtZT0iQ2FwYWJpbGl0eVBhdHRlcm5zIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGdsb2JhbD0iZmFsc2UiPgotPHBhcmVudFBhY2thZ2UgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zIj4KLTwvcGFyZW50UGFja2FnZT4KLTxQcm9jZXNzUGFja2FnZSBuYW1lPSJjYXBQYXRQYWtfQTEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgZ2xvYmFsPSJmYWxzZSI+Ci08cGFyZW50UGFja2FnZSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExIj4KLTwvcGFyZW50UGFja2FnZT4KLTxQcm9jZXNzQ29tcG9uZW50IG5hbWU9IkNQMSB3aXRoIGFsbCBlbGVtZW50cyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBnbG9iYWw9ImZhbHNlIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiI+Ci08cGFyZW50UGFja2FnZSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cyI+Ci08L3BhcmVudFBhY2thZ2U+Ci08UHJvY2Vzc1BhY2thZ2UgbmFtZT0iUGhhc2UxIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGdsb2JhbD0iZmFsc2UiPgotPHBhcmVudFBhY2thZ2UgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxIj4KLTwvcGFyZW50UGFja2FnZT4KLTxQcm9jZXNzUGFja2FnZSBuYW1lPSJJdGVyYXRpb24xIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGdsb2JhbD0iZmFsc2UiPgotPHBhcmVudFBhY2thZ2UgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEiPgotPC9wYXJlbnRQYWNrYWdlPgotPFByb2Nlc3NQYWNrYWdlIG5hbWU9IkFjdGl2aXR5MSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBnbG9iYWw9ImZhbHNlIj4KLTxwYXJlbnRQYWNrYWdlIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L3BhcmVudFBhY2thZ2U+Ci08QWN0aXZpdHkgbmFtZT0iQWN0aXZpdHkxIiBicmllZkRlc2NyaXB0aW9uPSJUaGlzIGFjdGl2aXR5IGNvbnRhaW5zIHRhc2tzIHRoYXQgYXJlIGFzc29jaWF0ZWQgdG8gYW5vdGhlciB0YXNrcy5BbHNvIHRoZWlyIHN0ZXBzIGFyZSBhZGRlZC4iIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IkFjdGl2aXR5MSBjb250YWluaW5nIHRhc2tzIGxpbmtlZCB0byBtZXRob2QgZWxlbWVudHMiIHByZWZpeD0iUHJlZml4IiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9InRydWUiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1JlcGVhdGFibGU9ImZhbHNlIiBpc09uZ29pbmc9ImZhbHNlIiBpc0V2ZW50RHJpdmVuPSJmYWxzZSIgdmFyaWFiaWxpdHlUeXBlPSJuYSIgaXNFbmFjdGFibGU9ImZhbHNlIj4KLTxBY3Rpdml0eURlc2NyaXB0aW9uIG5hbWU9IkFjdGl2aXR5MSxfRTczcklUemlFZHE1eXNGT05yMUJHUSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSImbHQ7cCZndDsmIzEzOyYjMTA7ICAgIFRoaXMgV29ya2Zsb3cgRGV0YWlsOiYjMTM7JiMxMDsmbHQ7L3AmZ3Q7JiMxMzsmIzEwOyZsdDt1bCZndDsmIzEzOyYjMTA7ICAgICZsdDtsaSZndDsmIzEzOyYjMTA7ICAgICAgICBQcm92aWRlcyB0aGUgbmF0dXJhbCAmbHQ7YiZndDt0cmFuc2l0aW9uIGZyb20gYW5hbHlzaXMmbHQ7L2ImZ3Q7IGFjdGl2aXRpZXMgJmx0O2ImZ3Q7dG8gZGVzaWduJmx0Oy9iJmd0OyBhY3Rpdml0aWVzLCBpZGVudGlmeWluZzogJiMxMzsmIzEwOyAgICAgICAgJmx0O3VsJmd0OyYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7bGkmZ3Q7JiMxMzsmIzEwOyAgICAgICAgICAgICAgICBhcHByb3ByaWF0ZSBkZXNpZ24gZWxlbWVudHMgZnJvbSBhbmFseXNpcyBlbGVtZW50cyYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7L2xpJmd0OyYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7bGkmZ3Q7JiMxMzsmIzEwOyAgICAgICAgICAgICAgICBhcHByb3ByaWF0ZSBkZXNpZ24gbWVjaGFuaXNtcyBmcm9tIHJlbGF0ZWQgYW5hbHlzaXMgbWVjaGFuaXNtcyYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7L2xpJmd0OyYjMTM7JiMxMDsgICAgICAgICZsdDsvdWwmZ3Q7JiMxMzsmIzEwOyAgICAmbHQ7L2xpJmd0OyYjMTM7JiMxMDsgICAgJmx0O2xpJmd0OyYjMTM7JiMxMDsgICAgICAgICZsdDtiJmd0O0Rlc2NyaWJlcyZsdDsvYiZndDsgdGhlIG9yZ2FuaXphdGlvbiBvZiB0aGUgc3lzdGVtJmFwb3M7cyAmbHQ7YiZndDtydW4tdGltZSBhbmQgZGVwbG95bWVudCBhcmNoaXRlY3R1cmUmbHQ7L2ImZ3Q7JiMxMzsmIzEwOyAgICAmbHQ7L2xpJmd0OyYjMTM7JiMxMDsgICAgJmx0O2xpJmd0OyYjMTM7JiMxMDsgICAgICAgICZsdDtiJmd0O09yZ2FuaXplcyB0aGUgaW1wbGVtZW50YXRpb24gbW9kZWwmbHQ7L2ImZ3Q7IHNvIGFzIHRvIG1ha2UgdGhlIHRyYW5zaXRpb24gYmV0d2VlbiBkZXNpZ24gYW5kIGltcGxlbWVudGF0aW9uIHNlYW1sZXNzJiMxMzsmIzEwOyAgICAmbHQ7L2xpJmd0OyYjMTM7JiMxMDsgICAgJmx0O2xpJmd0OyYjMTM7JiMxMDsgICAgICAgICZsdDtiJmd0O01haW50YWlucyB0aGUgY29uc2lzdGVuY3kgYW5kIGludGVncml0eSBvZiB0aGUgYXJjaGl0ZWN0dXJlJmx0Oy9iJmd0OywgZW5zdXJpbmcgdGhhdDogJiMxMzsmIzEwOyAgICAgICAgJmx0O3VsJmd0OyYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7bGkmZ3Q7JiMxMzsmIzEwOyAgICAgICAgICAgICAgICBuZXcgZGVzaWduIGVsZW1lbnRzIGlkZW50aWZpZWQgZm9yIHRoZSBjdXJyZW50IGl0ZXJhdGlvbiBhcmUgaW50ZWdyYXRlZCB3aXRoIHByZS1leGlzdGluZyBkZXNpZ24gZWxlbWVudHMuJiMxMzsmIzEwOyAgICAgICAgICAgICZsdDsvbGkmZ3Q7JiMxMzsmIzEwOyAgICAgICAgICAgICZsdDtsaSZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgICAgIG1heGltYWwgcmUtdXNlIG9mIGF2YWlsYWJsZSBjb21wb25lbnRzIGFuZCBkZXNpZ24gZWxlbWVudHMgaXMgYWNoaWV2ZWQgYXMgZWFybHkgYXMgcG9zc2libGUgaW4gdGhlIGRlc2lnbiYjMTM7JiMxMDsgICAgICAgICAgICAgICAgZWZmb3J0LiYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7L2xpJmd0OyYjMTM7JiMxMDsgICAgICAgICZsdDsvdWwmZ3Q7JiMxMzsmIzEwOyAgICAmbHQ7L2xpJmd0OyYjMTM7JiMxMDsmbHQ7L3VsJmd0OyIga2V5Q29uc2lkZXJhdGlvbnM9IiZsdDtwJmd0OyYjMTM7JiMxMDsgICAgS2V5IGNvbnNpZGVyYXRpb25zOiYjMTM7JiMxMDsmbHQ7L3AmZ3Q7JiMxMzsmIzEwOyZsdDt1bCZndDsmIzEzOyYjMTA7ICAgICZsdDtsaSZndDsmIzEzOyYjMTA7ICAgICAgICBrZXkxJiMxMzsmIzEwOyAgICAmbHQ7L2xpJmd0OyYjMTM7JiMxMDsgICAgJmx0O2xpJmd0OyYjMTM7JiMxMDsgICAgICAgIGtleTImIzEzOyYjMTA7ICAgICZsdDsvbGkmZ3Q7JiMxMzsmIzEwOyAgICAmbHQ7bGkmZ3Q7JiMxMzsmIzEwOyAgICAgICAga2V5MyYjMTM7JiMxMDsgICAgJmx0Oy9saSZndDsmIzEzOyYjMTA7ICAgICZsdDtsaSZndDsmIzEzOyYjMTA7ICAgICAgICBrZXk0JiMxMzsmIzEwOyAgICAmbHQ7L2xpJmd0OyYjMTM7JiMxMDsgICAgJmx0O2xpJmd0OyYjMTM7JiMxMDsgICAgICAgIGtleTUmIzEzOyYjMTA7ICAgICZsdDsvbGkmZ3Q7JiMxMzsmIzEwOyAgICAmbHQ7bGkmZ3Q7JiMxMzsmIzEwOyAgICAgICAga2V5NiYjMTM7JiMxMDsgICAgJmx0Oy9saSZndDsmIzEzOyYjMTA7ICAgICZsdDtsaSZndDsmIzEzOyYjMTA7ICAgICAgICBrZXk3JiMxMzsmIzEwOyAgICAmbHQ7L2xpJmd0OyYjMTM7JiMxMDsmbHQ7L3VsJmd0OyIgdXNhZ2VHdWlkYW5jZT0iJmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICBUaGUgd29yayBpcyBiZXN0IGRvbmUgaW4gc2V2ZXJhbCBzZXNzaW9ucywgcGVyaGFwcyBwZXJmb3JtZWQgb3ZlciBhIGZldyBkYXlzIChvciB3ZWVrcyBhbmQgbW9udGhzIGZvciB2ZXJ5IGxhcmdlJiMxMzsmIzEwOyAgICBzeXN0ZW1zKS4gVGhlIGluaXRpYWwgZm9jdXMgd2lsbCBiZSBvbiB0aGUgYWN0aXZpdGllcyAmbHQ7YSBjbGFzcz0mcXVvdDtlbGVtZW50TGluayZxdW90OyYjMTM7JiMxMDsgICAgaHJlZj0mcXVvdDtyZXNvdXJjZXMvaWRlbnRpZnlfZGVzaWduX21lY2hhbmlzbXMse0M3QTI2QkQ3LTM4MjAtNDhEOS04MzBGLTY4NEMzQUYxNTVGOX0uaHRtbCZxdW90OyYjMTM7JiMxMDsgICAgZ3VpZD0mcXVvdDt7QzdBMjZCRDctMzgyMC00OEQ5LTgzMEYtNjg0QzNBRjE1NUY5fSZxdW90OyZndDtJZGVudGlmeSBEZXNpZ24gTWVjaGFuaXNtcyZsdDsvYSZndDsgYW5kICZsdDthIGNsYXNzPSZxdW90O2VsZW1lbnRMaW5rJnF1b3Q7JiMxMzsmIzEwOyAgICBocmVmPSZxdW90O3Jlc291cmNlcy9pZGVudGlmeV9kZXNpZ25fZWxlbWVudHNfcmVhbC10aW1lX2Rlc2lnbix7NTg2OTYzRDAtNjA3RC00RUMyLThENTMtMjkyREFGQUI5QzkyfS5odG1sJnF1b3Q7JiMxMzsmIzEwOyAgICBndWlkPSZxdW90O3s1ODY5NjNEMC02MDdELTRFQzItOEQ1My0yOTJEQUZBQjlDOTJ9JnF1b3Q7Jmd0O2lkZW50aWZ5X2Rlc2lnbl9lbGVtZW50c19yZWFsLXRpbWVfZGVzaWduJmx0Oy9hJmd0Oywgd2l0aCBhIGdyZWF0IGRlYWwgb2YmIzEzOyYjMTA7ICAgIGl0ZXJhdGlvbiB3aXRoIHRoZSAmbHQ7YSBjbGFzcz0mcXVvdDtlbGVtZW50TGluayZxdW90OyYjMTM7JiMxMDsgICAgaHJlZj0mcXVvdDtyZXNvdXJjZXMvaW5jb3Jwb3JhdGVfZGVzaWduX2VsZW1lbnRzLHs1QzY0NzE3My00RTMyLTQ1OTQtOTZBOS0yNTQ4QjQ3NzIyRkF9Lmh0bWwmcXVvdDsmIzEzOyYjMTA7ICAgIGd1aWQ9JnF1b3Q7ezVDNjQ3MTczLTRFMzItNDU5NC05NkE5LTI1NDhCNDc3MjJGQX0mcXVvdDsmZ3Q7SW5jb3Jwb3JhdGUgRXhpc3RpbmcgRGVzaWduIEVsZW1lbnRzJmx0Oy9hJmd0OyBhY3Rpdml0eSB0byBtYWtlIHN1cmUgdGhhdCBuZXcmIzEzOyYjMTA7ICAgIGVsZW1lbnRzIGRvIG5vdCBkdXBsaWNhdGUgZnVuY3Rpb25hbGl0eSBvZiBleGlzdGluZyBlbGVtZW50cy4mIzEzOyYjMTA7Jmx0Oy9wJmd0OyYjMTM7JiMxMDsmbHQ7cCZndDsmIzEzOyYjMTA7ICAgIEFzIHRoZSBkZXNpZ24gZW1lcmdlcywgY29uY3VycmVuY3kgYW5kIGRpc3RyaWJ1dGlvbiBpc3N1ZXMgYXJlIGludHJvZHVjZWQgaW4gdGhlIGFjdGl2aXRpZXMgJmx0O2EgY2xhc3M9JnF1b3Q7ZWxlbWVudExpbmsmcXVvdDsmIzEzOyYjMTA7ICAgIGhyZWY9JnF1b3Q7cmVzb3VyY2VzL2Rlc2NyaWJlX3J1bnRpbWVfYXJjaGl0ZWN0dXJlLHs0RDM1QzAzOC1BMkQwLTQ4QjgtOUVDRC01MjcxN0ZFQUUzM0F9Lmh0bWwmcXVvdDsmIzEzOyYjMTA7ICAgIGd1aWQ9JnF1b3Q7ezREMzVDMDM4LUEyRDAtNDhCOC05RUNELTUyNzE3RkVBRTMzQX0mcXVvdDsmZ3Q7RGVzY3JpYmUgdGhlIFJ1bi10aW1lIEFyY2hpdGVjdHVyZSZsdDsvYSZndDsgYW5kICZsdDthIGNsYXNzPSZxdW90O2VsZW1lbnRMaW5rJnF1b3Q7JiMxMzsmIzEwOyAgICBocmVmPSZxdW90O3Jlc291cmNlcy9kZXNjcmliZV9kaXN0cmlidXRpb24sezZBMTEyODA4LTBBOTAtNDI3QS1CQUI5LUUxNEYzRkJGNzJCNX0uaHRtbCZxdW90OyYjMTM7JiMxMDsgICAgZ3VpZD0mcXVvdDt7NkExMTI4MDgtMEE5MC00MjdBLUJBQjktRTE0RjNGQkY3MkI1fSZxdW90OyZndDtEZXNjcmliZSBEaXN0cmlidXRpb24mbHQ7L2EmZ3Q7LCByZXNwZWN0aXZlbHkuIEFzIHRoZXNlIGlzc3VlcyBhcmUgY29uc2lkZXJlZCwmIzEzOyYjMTA7ICAgIGNoYW5nZXMgdG8gZGVzaWduIGVsZW1lbnRzIG1heSBiZSByZXF1aXJlZCB0byBzcGxpdCBiZWhhdmlvciBhY3Jvc3MgcHJvY2Vzc2VzLCB0aHJlYWRzIG9yIG5vZGVzLiYjMTM7JiMxMDsmbHQ7L3AmZ3Q7JiMxMzsmIzEwOyZsdDtwJmd0OyYjMTM7JiMxMDsgICAgQXMgdGhlIGluZGl2aWR1YWwgbW9kZWxzIGFyZSByZWZpbmVkIHRvIGluY29ycG9yYXRlIHRoZSBhcmNoaXRlY3R1cmFsIGRlY2lzaW9ucywgdGhlIHJlc3VsdHMgYXJlIGRvY3VtZW50ZWQgaW4mIzEzOyYjMTA7ICAgIHJlc3BlY3RpdmUgdmlldyBzZWN0aW9ucyBpbiB0aGUgU29mdHdhcmUgQXJjaGl0ZWN0dXJlIERvY3VtZW50IChlLmcuLCBhcyB0aGUgRGVzaWduIE1vZGVsIGlzIHJlZmluZWQsIHRoZSBMb2dpY2FsIFZpZXcmIzEzOyYjMTA7ICAgIG9mIHRoZSBTb2Z0d2FyZSBBcmNoaXRlY3R1cmUgRG9jdW1lbnQgaXMgcmVmaW5lZCwgYXMgd2VsbCkuIFRoZSByZXN1bHRpbmcgYXJjaGl0ZWN0dXJlIGlzIHJldmlld2VkLiYjMTM7JiMxMDsmbHQ7L3AmZ3Q7JiMxMzsmIzEwOyZsdDticiAvJmd0OyYjMTM7JiMxMDsmbHQ7YnIgLyZndDsiIHB1cnBvc2U9IiZsdDtwJmd0OyYjMTM7JiMxMDsgICAgUHVycG9zZSBvZiB0aGlzIGFjdGl2aXR5IGlzIHRvIGhhdmUgdGFza3MgdGhhdCBhcmUgYXNzb2NpYXRlZCB0byBvdGhlciB0YXNrcy4mIzEzOyYjMTA7Jmx0Oy9wJmd0OyYjMTM7JiMxMDsmbHQ7cCZndDsmIzEzOyYjMTA7ICAgICZhbXA7bmJzcDsmbHQ7aW1nIGhlaWdodD0mcXVvdDs3MSZxdW90OyBhbHQ9JnF1b3Q7JnF1b3Q7IHNyYz0mcXVvdDtyZXNvdXJjZXMvcnVwLmpwZyZxdW90OyB3aWR0aD0mcXVvdDsxNzYmcXVvdDsgLyZndDsmIzEzOyYjMTA7Jmx0Oy9wJmd0OyIgYWx0ZXJuYXRpdmVzPSImbHQ7cCZndDsmIzEzOyYjMTA7ICAgIEFsdGVyYW50aXZlczomIzEzOyYjMTA7Jmx0Oy9wJmd0OyYjMTM7JiMxMDsmbHQ7b2wmZ3Q7JiMxMzsmIzEwOyAgICAmbHQ7bGkmZ3Q7JiMxMzsmIzEwOyAgICAgICAgQWx0ZXIxJiMxMzsmIzEwOyAgICAmbHQ7L2xpJmd0OyYjMTM7JiMxMDsgICAgJmx0O2xpJmd0OyYjMTM7JiMxMDsgICAgICAgIEFsdGVyMiYjMTM7JiMxMDsgICAgJmx0Oy9saSZndDsmIzEzOyYjMTA7ICAgICZsdDtsaSZndDsmIzEzOyYjMTA7ICAgICAgICBBbHRlcjMmIzEzOyYjMTA7ICAgICZsdDsvbGkmZ3Q7JiMxMzsmIzEwOyZsdDsvb2wmZ3Q7IiBob3d0b1N0YWZmPSImbHQ7cCZndDsmIzEzOyYjMTA7ICAgIFRoZXNlIGFjdGl2aXRpZXMgYXJlIGJlc3QgY2FycmllZCBvdXQgYnkgYSBzbWFsbCB0ZWFtIHN0YWZmZWQgYnkgY3Jvc3MtZnVuY3Rpb25hbCB0ZWFtIG1lbWJlcnMuIElzc3VlcyB0aGF0IGFyZSYjMTM7JiMxMDsgICAgdHlwaWNhbGx5IGFyY2hpdGVjdHVyYWxseSBzaWduaWZpY2FudCBpbmNsdWRlIHVzYWJpbGl0eSwgcGVyZm9ybWFuY2UsIHNjYWxpbmcsIHByb2Nlc3MgYW5kIHRocmVhZCBzeW5jaHJvbml6YXRpb24sIGFuZCYjMTM7JiMxMDsgICAgZGlzdHJpYnV0aW9uLiBUaGUgdGVhbSBzaG91bGQgYWxzbyBpbmNsdWRlIG1lbWJlcnMgd2l0aCBkb21haW4gZXhwZXJpZW5jZSB3aG8gY2FuIGlkZW50aWZ5IGtleSBhYnN0cmFjdGlvbnMuIFRoZSB0ZWFtJiMxMzsmIzEwOyAgICBzaG91bGQgYWxzbyBoYXZlIGV4cGVyaWVuY2Ugd2l0aCBtb2RlbCBvcmdhbml6YXRpb24gYW5kIGxheWVyaW5nLiBUaGUgdGVhbSB3aWxsIG5lZWQgdG8gYmUgYWJsZSB0byBwdWxsIGFsbCB0aGVzZSYjMTM7JiMxMDsgICAgZGlzcGFyYXRlIHRocmVhZHMgaW50byBhIGNvaGVzaXZlLCBjb2hlcmVudCAoYWxiZWl0IHByZWxpbWluYXJ5KSBhcmNoaXRlY3R1cmUuJiMxMzsmIzEwOyZsdDsvcCZndDsmIzEzOyYjMTA7Jmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICBCZWNhdXNlIHRoZSBmb2N1cyBvZiB0aGUgYXJjaGl0ZWN0dXJlIGVmZm9ydCBpcyBzaGlmdGluZyB0b3dhcmQgaW1wbGVtZW50YXRpb24gaXNzdWVzLCBncmVhdGVyIGF0dGVudGlvbiBuZWVkcyB0byBiZSYjMTM7JiMxMDsgICAgcGFpZCB0byBzcGVjaWZpYyB0ZWNobm9sb2d5IGlzc3Vlcy4gVGhpcyB3aWxsIGZvcmNlIHRoZSBhcmNoaXRlY3R1cmUgdGVhbSB0byBzaGlmdCBtZW1iZXJzIG9yIGV4cGFuZCB0byBpbmNsdWRlIHBlb3BsZSYjMTM7JiMxMDsgICAgd2l0aCBkaXN0cmlidXRpb24gYW5kIGRlcGxveW1lbnQgZXhwZXJ0aXNlIChpZiB0aG9zZSBpc3N1ZXMgYXJlIGFyY2hpdGVjdHVyYWxseSBzaWduaWZpY2FudCkuIEluIG9yZGVyIHRvIHVuZGVyc3RhbmQmIzEzOyYjMTA7ICAgIHRoZSBwb3RlbnRpYWwgaW1wYWN0IG9mIHRoZSBzdHJ1Y3R1cmUgb24gdGhlIGltcGxlbWVudGF0aW9uIG1vZGVsIG9uIHRoZSBlYXNlIG9mIGludGVncmF0aW9uLCBleHBlcnRpc2UgaW4gdGhlIHNvZnR3YXJlJiMxMzsmIzEwOyAgICBidWlsZCBtYW5hZ2VtZW50IHByb2Nlc3MgaXMgdXNlZnVsIHRvIGhhdmUuJiMxMzsmIzEwOyZsdDsvcCZndDsmIzEzOyYjMTA7Jmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICBBdCB0aGUgc2FtZSB0aW1lLCBpdCBpcyBlc3NlbnRpYWwgdGhhdCB0aGUgYXJjaGl0ZWN0dXJlIHRlYW0gbm90IGJlIGNvbXBvc2VkIG9mIGEgbGFyZ2UgZXh0ZW5kZWQgdGVhbS4gQSBzdHJhdGVneSBmb3ImIzEzOyYjMTA7ICAgIGNvdW50ZXJpbmcgdGhpcyB0cmVuZCBpcyB0byByZXRhaW4gYSByZWxhdGl2ZWx5IHNtYWxsIGNvcmUgdGVhbSB3aXRoIGEgc2F0ZWxsaXRlIGdyb3VwIG9mIGV4dGVuZGVkIHRlYW0gbWVtYmVycyB0aGF0JiMxMzsmIzEwOyAgICBhcmUgYnJvdWdodCBpbiBhcyAmcXVvdDtjb25zdWx0YW50cyZxdW90OyBvbiBrZXkgaXNzdWVzJmx0O2ImZ3Q7LiZsdDsvYiZndDsgVGhpcyBzdHJ1Y3R1cmUgYWxzbyB3b3JrcyB3ZWxsIGZvciBzbWFsbGVyIHByb2plY3RzIHdoZXJlJiMxMzsmIzEwOyAgICBzcGVjaWZpYyBleHBlcnRpc2UgbWF5IGJlIGJvcnJvd2VkIG9yIGNvbnRyYWN0ZWQgZnJvbSBvdGhlciBvcmdhbml6YXRpb25zOyB0aGV5IGNhbiBiZSBicm91Z2h0IGluIGFzIHNwZWNpZmljIGlzc3VlcyYjMTM7JiMxMDsgICAgbmVlZCB0byBiZSBhZGRyZXNzZWQuJiMxMzsmIzEwOyZsdDsvcCZndDsiPgotPC9BY3Rpdml0eURlc2NyaXB0aW9uPgotPHN1cGVyQWN0aXZpdGllcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEvQWN0aXZpdHkxIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPGJyZWFrZG93bkVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MS90YXNrIGxpbmtlZCB0byB0YXNrQTEiPgotPC9icmVha2Rvd25FbGVtZW50cz4KLTxicmVha2Rvd25FbGVtZW50cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEvdGFzayBsaW5rZWQgdG8gdGFza0EyIj4KLTwvYnJlYWtkb3duRWxlbWVudHM+Ci08YnJlYWtkb3duRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxL3JvbGVEZXNjMSI+Ci08L2JyZWFrZG93bkVsZW1lbnRzPgotPGJyZWFrZG93bkVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MS9yb2xlRGVzYzIiPgotPC9icmVha2Rvd25FbGVtZW50cz4KLTxicmVha2Rvd25FbGVtZW50cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEvd3BEZXNjMSI+Ci08L2JyZWFrZG93bkVsZW1lbnRzPgotPGJyZWFrZG93bkVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MS93cERlc2MyIj4KLTwvYnJlYWtkb3duRWxlbWVudHM+Ci08YnJlYWtkb3duRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxL3dwRGVzYzMgd2l0aCBubyBsaW5rcyI+Ci08L2JyZWFrZG93bkVsZW1lbnRzPgotPGJyZWFrZG93bkVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MS9yb2xlRGVzYyB3aXRoIG5vIGxpbmtzIj4KLTwvYnJlYWtkb3duRWxlbWVudHM+Ci08YnJlYWtkb3duRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxL3Rhc2sgd2l0aCBubyBsaW5rcyI+Ci08L2JyZWFrZG93bkVsZW1lbnRzPgotPHJvYWRtYXBzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9yb2FkbWFwX0ExIj4KLTwvcm9hZG1hcHM+Ci08c3VwcG9ydGluZ01hdGVyaWFscyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvc3VwcG9ydGluZ19tYXRlcmlhbF9BMSI+Ci08L3N1cHBvcnRpbmdNYXRlcmlhbHM+Ci08Y2hlY2tsaXN0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvY2hlY2tsaXN0X0ExIj4KLTwvY2hlY2tsaXN0cz4KLTxjb25jZXB0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvY29uY2VwdF9BMSI+Ci08L2NvbmNlcHRzPgotPGNvbmNlcHRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS93aGl0ZXBhcGVyX0ExIj4KLTwvY29uY2VwdHM+Ci08ZXhhbXBsZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2V4YW1wbGVfQTEiPgotPC9leGFtcGxlcz4KLTxndWlkZWxpbmVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9ndWlkZWxpbmVfQTEiPgotPC9ndWlkZWxpbmVzPgotPHJldXNhYmxlQXNzZXRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9yZXVzYWJsZV9hc3NldF9BMSI+Ci08L3JldXNhYmxlQXNzZXRzPgotPC9BY3Rpdml0eT4KLTxUYXNrRGVzY3JpcHRvciBuYW1lPSJ0YXNrIGxpbmtlZCB0byB0YXNrQTEiIGJyaWVmRGVzY3JpcHRpb249InRhc2sgYXNzb2NpYXRlZCB0byB0YXNrQTEiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IlRhc2tfTGlua2VkX1RvX1Rhc2tBMSIgcHJlZml4PSIiIGlzUGxhbm5lZD0iZmFsc2UiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNSZXBlYXRhYmxlPSJmYWxzZSIgaXNPbmdvaW5nPSJmYWxzZSIgaXNFdmVudERyaXZlbj0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9InRhc2sgYXNzb2NpYXRlZCB0byB0YXNrQTEsX0ZydE1vRHppRWRxNXlzRk9OcjFCR1EiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iJmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICBrZXlzOiYjMTM7JiMxMDsmbHQ7L3AmZ3Q7JiMxMzsmIzEwOyZsdDtwJmd0OyYjMTM7JiMxMDsgICAga2V5MSxrZXkyJiMxMzsmIzEwOyZsdDsvcCZndDsiIHVzYWdlR3VpZGFuY2U9IiZsdDtwJmd0OyYjMTM7JiMxMDsgICAgdXNhZ2U6JiMxMzsmIzEwOyZsdDsvcCZndDsmIzEzOyYjMTA7Jmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICBUaGUgd29yayBpcyBiZXN0IGRvbmUgaW4gc2V2ZXJhbCBzZXNzaW9ucywgcGVyaGFwcyBwZXJmb3JtZWQgb3ZlciBhIGZldyBkYXlzIChvciB3ZWVrcyBhbmQgbW9udGhzIGZvciB2ZXJ5IGxhcmdlJiMxMzsmIzEwOyAgICBzeXN0ZW1zKS4gVGhlIGluaXRpYWwgZm9jdXMgd2lsbCBiZSBvbiB0aGUgYWN0aXZpdGllcyAmbHQ7YSBjbGFzcz0mcXVvdDtlbGVtZW50TGluayZxdW90OyYjMTM7JiMxMDsgICAgaHJlZj0mcXVvdDtyZXNvdXJjZXMvaWRlbnRpZnlfZGVzaWduX21lY2hhbmlzbXMse0M3QTI2QkQ3LTM4MjAtNDhEOS04MzBGLTY4NEMzQUYxNTVGOX0uaHRtbCZxdW90OyYjMTM7JiMxMDsgICAgZ3VpZD0mcXVvdDt7QzdBMjZCRDctMzgyMC00OEQ5LTgzMEYtNjg0QzNBRjE1NUY5fSZxdW90OyZndDtJZGVudGlmeSBEZXNpZ24gTWVjaGFuaXNtcyZsdDsvYSZndDsgYW5kICZsdDthIGNsYXNzPSZxdW90O2VsZW1lbnRMaW5rJnF1b3Q7JiMxMzsmIzEwOyAgICBocmVmPSZxdW90O3Jlc291cmNlcy9pZGVudGlmeV9kZXNpZ25fZWxlbWVudHNfcmVhbC10aW1lX2Rlc2lnbix7NTg2OTYzRDAtNjA3RC00RUMyLThENTMtMjkyREFGQUI5QzkyfS5odG1sJnF1b3Q7JiMxMzsmIzEwOyAgICBndWlkPSZxdW90O3s1ODY5NjNEMC02MDdELTRFQzItOEQ1My0yOTJEQUZBQjlDOTJ9JnF1b3Q7Jmd0O2lkZW50aWZ5X2Rlc2lnbl9lbGVtZW50c19yZWFsLXRpbWVfZGVzaWduJmx0Oy9hJmd0Oywgd2l0aCBhIGdyZWF0IGRlYWwgb2YmIzEzOyYjMTA7ICAgIGl0ZXJhdGlvbiB3aXRoIHRoZSAmbHQ7YSBjbGFzcz0mcXVvdDtlbGVtZW50TGluayZxdW90OyYjMTM7JiMxMDsgICAgaHJlZj0mcXVvdDtyZXNvdXJjZXMvaW5jb3Jwb3JhdGVfZGVzaWduX2VsZW1lbnRzLHs1QzY0NzE3My00RTMyLTQ1OTQtOTZBOS0yNTQ4QjQ3NzIyRkF9Lmh0bWwmcXVvdDsmIzEzOyYjMTA7ICAgIGd1aWQ9JnF1b3Q7ezVDNjQ3MTczLTRFMzItNDU5NC05NkE5LTI1NDhCNDc3MjJGQX0mcXVvdDsmZ3Q7SW5jb3Jwb3JhdGUgRXhpc3RpbmcgRGVzaWduIEVsZW1lbnRzJmx0Oy9hJmd0OyBhY3Rpdml0eSB0byBtYWtlIHN1cmUgdGhhdCBuZXcmIzEzOyYjMTA7ICAgIGVsZW1lbnRzIGRvIG5vdCBkdXBsaWNhdGUgZnVuY3Rpb25hbGl0eSBvZiBleGlzdGluZyBlbGVtZW50cy4mIzEzOyYjMTA7Jmx0Oy9wJmd0OyYjMTM7JiMxMDsmbHQ7cCZndDsmIzEzOyYjMTA7ICAgIEFzIHRoZSBkZXNpZ24gZW1lcmdlcywgY29uY3VycmVuY3kgYW5kIGRpc3RyaWJ1dGlvbiBpc3N1ZXMgYXJlIGludHJvZHVjZWQgaW4gdGhlIGFjdGl2aXRpZXMgJmx0O2EgY2xhc3M9JnF1b3Q7ZWxlbWVudExpbmsmcXVvdDsmIzEzOyYjMTA7ICAgIGhyZWY9JnF1b3Q7cmVzb3VyY2VzL2Rlc2NyaWJlX3J1bnRpbWVfYXJjaGl0ZWN0dXJlLHs0RDM1QzAzOC1BMkQwLTQ4QjgtOUVDRC01MjcxN0ZFQUUzM0F9Lmh0bWwmcXVvdDsmIzEzOyYjMTA7ICAgIGd1aWQ9JnF1b3Q7ezREMzVDMDM4LUEyRDAtNDhCOC05RUNELTUyNzE3RkVBRTMzQX0mcXVvdDsmZ3Q7RGVzY3JpYmUgdGhlIFJ1bi10aW1lIEFyY2hpdGVjdHVyZSZsdDsvYSZndDsgYW5kICZsdDthIGNsYXNzPSZxdW90O2VsZW1lbnRMaW5rJnF1b3Q7JiMxMzsmIzEwOyAgICBocmVmPSZxdW90O3Jlc291cmNlcy9kZXNjcmliZV9kaXN0cmlidXRpb24sezZBMTEyODA4LTBBOTAtNDI3QS1CQUI5LUUxNEYzRkJGNzJCNX0uaHRtbCZxdW90OyYjMTM7JiMxMDsgICAgZ3VpZD0mcXVvdDt7NkExMTI4MDgtMEE5MC00MjdBLUJBQjktRTE0RjNGQkY3MkI1fSZxdW90OyZndDtEZXNjcmliZSBEaXN0cmlidXRpb24mbHQ7L2EmZ3Q7LCByZXNwZWN0aXZlbHkuIEFzIHRoZXNlIGlzc3VlcyBhcmUgY29uc2lkZXJlZCwmIzEzOyYjMTA7ICAgIGNoYW5nZXMgdG8gZGVzaWduIGVsZW1lbnRzIG1heSBiZSByZXF1aXJlZCB0byBzcGxpdCBiZWhhdmlvciBhY3Jvc3MgcHJvY2Vzc2VzLCB0aHJlYWRzIG9yIG5vZGVzLiYjMTM7JiMxMDsmbHQ7L3AmZ3Q7JiMxMzsmIzEwOyZsdDtwJmd0OyYjMTM7JiMxMDsgICAgQXMgdGhlIGluZGl2aWR1YWwgbW9kZWxzIGFyZSByZWZpbmVkIHRvIGluY29ycG9yYXRlIHRoZSBhcmNoaXRlY3R1cmFsIGRlY2lzaW9ucywgdGhlIHJlc3VsdHMgYXJlIGRvY3VtZW50ZWQgaW4mIzEzOyYjMTA7ICAgIHJlc3BlY3RpdmUgdmlldyBzZWN0aW9ucyBpbiB0aGUgU29mdHdhcmUgQXJjaGl0ZWN0dXJlIERvY3VtZW50IChlLmcuLCBhcyB0aGUgRGVzaWduIE1vZGVsIGlzIHJlZmluZWQsIHRoZSBMb2dpY2FsIFZpZXcmIzEzOyYjMTA7ICAgIG9mIHRoZSBTb2Z0d2FyZSBBcmNoaXRlY3R1cmUgRG9jdW1lbnQgaXMgcmVmaW5lZCwgYXMgd2VsbCkuIFRoZSByZXN1bHRpbmcgYXJjaGl0ZWN0dXJlIGlzIHJldmlld2VkLiYjMTM7JiMxMDsmbHQ7L3AmZ3Q7JiMxMzsmIzEwOyZsdDtwJmd0OyYjMTM7JiMxMDsgICAgJmx0O2JyIC8mZ3Q7JiMxMzsmIzEwOyAgICAmbHQ7YnIgLyZndDsmIzEzOyYjMTA7ICAgICZhbXA7bmJzcDsmIzEzOyYjMTA7Jmx0Oy9wJmd0OyIgcmVmaW5lZERlc2NyaXB0aW9uPSImbHQ7cCZndDsmIzEzOyYjMTA7ICAgIHJlZmluZWQgZGVzY3JpcHRpb24mIzEzOyYjMTA7Jmx0Oy9wJmd0OyYjMTM7JiMxMDsmbHQ7cCZndDsmIzEzOyYjMTA7ICAgICZsdDtpbWcgaGVpZ2h0PSZxdW90OzE2JnF1b3Q7IGFsdD0mcXVvdDsmcXVvdDsgc3JjPSZxdW90O3Jlc291cmNlcy9oZWxwYm9vay5naWYmcXVvdDsgd2lkdGg9JnF1b3Q7MTYmcXVvdDsgLyZndDsmIzEzOyYjMTA7Jmx0Oy9wJmd0OyYjMTM7JiMxMDsmbHQ7cCZndDsmIzEzOyYjMTA7ICAgICZsdDthIGhyZWY9JnF1b3Q7cmVzb3VyY2VzL3BhcGVycy5odG0mcXVvdDsgdGFyZ2V0PSZxdW90O19ibGFuayZxdW90OyZndDtwYXBlcnMuaHRtJmx0Oy9hJmd0OyYjMTM7JiMxMDsmbHQ7L3AmZ3Q7Ij4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPHN1cGVyQWN0aXZpdGllcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEvdGFzayBsaW5rZWQgdG8gdGFza0ExIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPFRhc2sgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxL3Rhc2sgbGlua2VkIHRvIHRhc2tBMSI+Ci08L1Rhc2s+Ci08YWRkaXRpb25hbGx5UGVyZm9ybWVkQnkgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxL3JvbGVEZXNjMiI+Ci08L2FkZGl0aW9uYWxseVBlcmZvcm1lZEJ5PgotPG1hbmRhdG9yeUlucHV0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MS93cERlc2MxIj4KLTwvbWFuZGF0b3J5SW5wdXQ+Ci08b3V0cHV0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MS93cERlc2MyIj4KLTwvb3V0cHV0PgotPHBlcmZvcm1lZFByaW1hcmlseUJ5IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MS90YXNrIGxpbmtlZCB0byB0YXNrQTEiPgotPC9wZXJmb3JtZWRQcmltYXJpbHlCeT4KLTxzZWxlY3RlZFN0ZXBzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS90YXNrX0ExL3Rhc2tfQTEsXzdNOG5zQS1QRWRxTDJPMVBKVjljWkEvU3RlcCBBMS4xIj4KLTwvc2VsZWN0ZWRTdGVwcz4KLTxzZWxlY3RlZFN0ZXBzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS90YXNrX0ExL3Rhc2tfQTEsXzdNOG5zQS1QRWRxTDJPMVBKVjljWkEvU3RlcCBBMS4yIj4KLTwvc2VsZWN0ZWRTdGVwcz4KLTxzZWxlY3RlZFN0ZXBzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS90YXNrX0ExL3Rhc2tfQTEsXzdNOG5zQS1QRWRxTDJPMVBKVjljWkEvU3RlcCBBMS4zIj4KLTwvc2VsZWN0ZWRTdGVwcz4KLTwvVGFza0Rlc2NyaXB0b3I+Ci08VGFza0Rlc2NyaXB0b3IgbmFtZT0idGFzayBsaW5rZWQgdG8gdGFza0EyIiBicmllZkRlc2NyaXB0aW9uPSJ0YXNrIGxpbmtlZCB0byB0YXNrQTIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IlRhc2tfTGlua2VkX1RvX3Rhc2tBMiIgcHJlZml4PSIiIGlzUGxhbm5lZD0iZmFsc2UiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNSZXBlYXRhYmxlPSJmYWxzZSIgaXNPbmdvaW5nPSJmYWxzZSIgaXNFdmVudERyaXZlbj0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9InRhc2sgYXNzb2NpYXRlZCB0byB0YXNrQTIsX0x3TFFnRHppRWRxNXlzRk9OcjFCR1EiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0ia2V5czogdGFzayBhc3NvY2lhdGVkIHRvIHRhc2tBMiIgdXNhZ2VHdWlkYW5jZT0idXNhZ2U6dGFzayBhc3NvY2lhdGVkIHRvIHRhc2tBMiIgcmVmaW5lZERlc2NyaXB0aW9uPSImbHQ7cCZndDsmIzEzOyYjMTA7ICAgIHJlZmluZWQ6dGFzayBhc3NvY2lhdGVkIHRvIHRhc2tBMiYjMTM7JiMxMDsmbHQ7L3AmZ3Q7JiMxMzsmIzEwOyZsdDt0YWJsZSBjZWxsc3BhY2luZz0mcXVvdDsyJnF1b3Q7IGNlbGxwYWRkaW5nPSZxdW90OzImcXVvdDsgd2lkdGg9JnF1b3Q7MTgwJnF1b3Q7IGJvcmRlcj0mcXVvdDsxJnF1b3Q7Jmd0OyYjMTM7JiMxMDsgICAgJmx0O3Rib2R5Jmd0OyYjMTM7JiMxMDsgICAgICAgICZsdDt0ciZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgJmx0O3RoIHNjb3BlPSZxdW90O2NvbCZxdW90OyZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgICAgIDEmIzEzOyYjMTA7ICAgICAgICAgICAgJmx0Oy90aCZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgJmx0O3RoIHNjb3BlPSZxdW90O2NvbCZxdW90OyZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgICAgIHomIzEzOyYjMTA7ICAgICAgICAgICAgJmx0Oy90aCZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgJmx0O3RoIHNjb3BlPSZxdW90O2NvbCZxdW90OyZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgICAgIHomIzEzOyYjMTA7ICAgICAgICAgICAgJmx0Oy90aCZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgJmx0O3RoIHNjb3BlPSZxdW90O2NvbCZxdW90OyZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgICAgIHomIzEzOyYjMTA7ICAgICAgICAgICAgJmx0Oy90aCZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgJmx0O3RoIHNjb3BlPSZxdW90O2NvbCZxdW90OyZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgICAgIHomIzEzOyYjMTA7ICAgICAgICAgICAgJmx0Oy90aCZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgJmx0O3RoIHNjb3BlPSZxdW90O2NvbCZxdW90OyZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgICAgIHomIzEzOyYjMTA7ICAgICAgICAgICAgJmx0Oy90aCZndDsmIzEzOyYjMTA7ICAgICAgICAmbHQ7L3RyJmd0OyYjMTM7JiMxMDsgICAgICAgICZsdDt0ciZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgJmx0O3RkJmd0OyYjMTM7JiMxMDsgICAgICAgICAgICAgICAgeiYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7L3RkJmd0OyYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7dGQmZ3Q7JiMxMzsmIzEwOyAgICAgICAgICAgICAgICAyJiMxMzsmIzEwOyAgICAgICAgICAgICZsdDsvdGQmZ3Q7JiMxMzsmIzEwOyAgICAgICAgICAgICZsdDt0ZCZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgJmx0Oy90ZCZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgJmx0O3RkJmd0OyYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7L3RkJmd0OyYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7dGQmZ3Q7JiMxMzsmIzEwOyAgICAgICAgICAgICZsdDsvdGQmZ3Q7JiMxMzsmIzEwOyAgICAgICAgICAgICZsdDt0ZCZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgJmx0Oy90ZCZndDsmIzEzOyYjMTA7ICAgICAgICAmbHQ7L3RyJmd0OyYjMTM7JiMxMDsgICAgICAgICZsdDt0ciZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgJmx0O3RkJmd0OyYjMTM7JiMxMDsgICAgICAgICAgICAgICAgeiYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7L3RkJmd0OyYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7dGQmZ3Q7JiMxMzsmIzEwOyAgICAgICAgICAgICZsdDsvdGQmZ3Q7JiMxMzsmIzEwOyAgICAgICAgICAgICZsdDt0ZCZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgICAgIDMmIzEzOyYjMTA7ICAgICAgICAgICAgJmx0Oy90ZCZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgJmx0O3RkJmd0OyYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7L3RkJmd0OyYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7dGQmZ3Q7JiMxMzsmIzEwOyAgICAgICAgICAgICZsdDsvdGQmZ3Q7JiMxMzsmIzEwOyAgICAgICAgICAgICZsdDt0ZCZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgJmx0Oy90ZCZndDsmIzEzOyYjMTA7ICAgICAgICAmbHQ7L3RyJmd0OyYjMTM7JiMxMDsgICAgICAgICZsdDt0ciZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgJmx0O3RkJmd0OyYjMTM7JiMxMDsgICAgICAgICAgICAgICAgeiYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7L3RkJmd0OyYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7dGQmZ3Q7JiMxMzsmIzEwOyAgICAgICAgICAgICZsdDsvdGQmZ3Q7JiMxMzsmIzEwOyAgICAgICAgICAgICZsdDt0ZCZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgJmx0Oy90ZCZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgJmx0O3RkJmd0OyYjMTM7JiMxMDsgICAgICAgICAgICAgICAgNCYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7L3RkJmd0OyYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7dGQmZ3Q7JiMxMzsmIzEwOyAgICAgICAgICAgICZsdDsvdGQmZ3Q7JiMxMzsmIzEwOyAgICAgICAgICAgICZsdDt0ZCZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgJmx0Oy90ZCZndDsmIzEzOyYjMTA7ICAgICAgICAmbHQ7L3RyJmd0OyYjMTM7JiMxMDsgICAgICAgICZsdDt0ciZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgJmx0O3RkJmd0OyYjMTM7JiMxMDsgICAgICAgICAgICAgICAgeiYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7L3RkJmd0OyYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7dGQmZ3Q7JiMxMzsmIzEwOyAgICAgICAgICAgICZsdDsvdGQmZ3Q7JiMxMzsmIzEwOyAgICAgICAgICAgICZsdDt0ZCZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgJmx0Oy90ZCZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgJmx0O3RkJmd0OyYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7L3RkJmd0OyYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7dGQmZ3Q7JiMxMzsmIzEwOyAgICAgICAgICAgICAgICA1JiMxMzsmIzEwOyAgICAgICAgICAgICZsdDsvdGQmZ3Q7JiMxMzsmIzEwOyAgICAgICAgICAgICZsdDt0ZCZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgJmx0Oy90ZCZndDsmIzEzOyYjMTA7ICAgICAgICAmbHQ7L3RyJmd0OyYjMTM7JiMxMDsgICAgJmx0Oy90Ym9keSZndDsmIzEzOyYjMTA7Jmx0Oy90YWJsZSZndDsiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MS90YXNrIGxpbmtlZCB0byB0YXNrQTIiPgotPC9zdXBlckFjdGl2aXRpZXM+Ci08VGFzayBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEvdGFzayBsaW5rZWQgdG8gdGFza0EyIj4KLTwvVGFzaz4KLTxtYW5kYXRvcnlJbnB1dCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEvd3BEZXNjMiI+Ci08L21hbmRhdG9yeUlucHV0PgotPG91dHB1dCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEvd3BEZXNjMSI+Ci08L291dHB1dD4KLTxwZXJmb3JtZWRQcmltYXJpbHlCeSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEvdGFzayBsaW5rZWQgdG8gdGFza0EyIj4KLTwvcGVyZm9ybWVkUHJpbWFyaWx5Qnk+Ci08c2VsZWN0ZWRTdGVwcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvdGFza19BMi90YXNrX0EyLF83NU5Rd0EtUEVkcUwyTzFQSlY5Y1pBL1N0ZXAgQTIuMSI+Ci08L3NlbGVjdGVkU3RlcHM+Ci08c2VsZWN0ZWRTdGVwcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvdGFza19BMi90YXNrX0EyLF83NU5Rd0EtUEVkcUwyTzFQSlY5Y1pBL1N0ZXAgQTIuMiI+Ci08L3NlbGVjdGVkU3RlcHM+Ci08c2VsZWN0ZWRTdGVwcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvdGFza19BMi90YXNrX0EyLF83NU5Rd0EtUEVkcUwyTzFQSlY5Y1pBL1N0ZXAgQTIuMyI+Ci08L3NlbGVjdGVkU3RlcHM+Ci08L1Rhc2tEZXNjcmlwdG9yPgotPFJvbGVEZXNjcmlwdG9yIG5hbWU9InJvbGVEZXNjMSIgYnJpZWZEZXNjcmlwdGlvbj0icm9sZURlc2MxIGxpbmtlZCB0byByb2xlQTEiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9InJvbGVEZXNjMSIgcHJlZml4PSJwcmVmaXgiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJyb2xlRGVzYzEsX1Axc1VZRHppRWRxNXlzRk9OcjFCR1EiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iJmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICBrZXkgY29uc2lkZXJhdGlvbnM6JiMxMzsmIzEwOyZsdDsvcCZndDsmIzEzOyYjMTA7Jmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICBrZXkxJiMxMzsmIzEwOyZsdDsvcCZndDsmIzEzOyYjMTA7Jmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICBrZXkyJiMxMzsmIzEwOyZsdDsvcCZndDsiIHVzYWdlR3VpZGFuY2U9IiZsdDtwJmd0OyYjMTM7JiMxMDsgICAgJmx0O2ltZyBoZWlnaHQ9JnF1b3Q7NDc0JnF1b3Q7IGFsdD0mcXVvdDsmcXVvdDsgc3JjPSZxdW90O3Jlc291cmNlcy9ydXBfcGxhdGZvcm0uanBnJnF1b3Q7IHdpZHRoPSZxdW90OzUwNCZxdW90OyAvJmd0O3VzYWdlIGZvciByb2xlQTEmYW1wO25ic3A7JiMxMzsmIzEwOyZsdDsvcCZndDsiIHJlZmluZWREZXNjcmlwdGlvbj0icmVmaW5lZCBkZXNjcmlwdGlvbiBmb3Igcm9sZURlc2MxIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPHN1cGVyQWN0aXZpdGllcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEvcm9sZURlc2MxIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPFJvbGUgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxL3JvbGVEZXNjMSI+Ci08L1JvbGU+Ci08bW9kaWZpZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxL3dwRGVzYzIiPgotPC9tb2RpZmllcz4KLTwvUm9sZURlc2NyaXB0b3I+Ci08Um9sZURlc2NyaXB0b3IgbmFtZT0icm9sZURlc2MyIiBicmllZkRlc2NyaXB0aW9uPSJyb2xlRGVzYzIgbGlua2VkIHRvIHJvbGVBMiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0icm9sZURlc2MyIiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9InJvbGVEZXNjMixfUTk5a0FEemlFZHE1eXNGT05yMUJHUSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSJrZXkgY29uc2lkZXJhdGlvbiBmb3Igcm9sZUEyIiB1c2FnZUd1aWRhbmNlPSImbHQ7cCZndDsmIzEzOyYjMTA7ICAgICZsdDtpbWcgaGVpZ2h0PSZxdW90OzEyJnF1b3Q7IGFsdD0mcXVvdDsmcXVvdDsgc3JjPSZxdW90O3Jlc291cmNlcy9idWxsZXQxLmdpZiZxdW90OyB3aWR0aD0mcXVvdDsxMiZxdW90OyAvJmd0OyYjMTM7JiMxMDsmbHQ7L3AmZ3Q7JiMxMzsmIzEwOyZsdDtwJmd0OyYjMTM7JiMxMDsgICAgdXNhZ2UgZ3VpZGFuY2UgZm9yIHJvbGVBMiYjMTM7JiMxMDsmbHQ7L3AmZ3Q7IiByZWZpbmVkRGVzY3JpcHRpb249IiZsdDtwJmd0OyYjMTM7JiMxMDsgICAgcmVmaW5lZCBkZXNjcmlwdGlvbiBmb3Igcm9sZUEyJiMxMzsmIzEwOyZsdDsvcCZndDsmIzEzOyYjMTA7Jmx0O3AmZ3Q7JiMxMzsmIzEwOyZsdDsvcCZndDsmIzEzOyYjMTA7Jmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICByZWZpbmVkIGRlc2NyaXB0aW9uIGZvciByb2xlQTImIzEzOyYjMTA7Jmx0Oy9wJmd0OyI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxzdXBlckFjdGl2aXRpZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxL3JvbGVEZXNjMiI+Ci08L3N1cGVyQWN0aXZpdGllcz4KLTxSb2xlIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MS9yb2xlRGVzYzIiPgotPC9Sb2xlPgotPG1vZGlmaWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MS93cERlc2MxIj4KLTwvbW9kaWZpZXM+Ci08L1JvbGVEZXNjcmlwdG9yPgotPFdvcmtQcm9kdWN0RGVzY3JpcHRvciBuYW1lPSJ3cERlc2MxIiBicmllZkRlc2NyaXB0aW9uPSJ0aGlzIHdwIGlzIGxpbmtlZCB0byBhcnRpZmFjdCIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0id3BEZXNjMSBpcyBsaW5rZWQgdG8gYXJ0aWZhY3QiIHByZWZpeD0icHJlZml4IiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIiBhY3Rpdml0eUVudHJ5U3RhdGU9IiIgYWN0aXZpdHlFeGl0U3RhdGU9IiI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9IndwRGVzYzEsX1NVR1FnRHppRWRxNXlzRk9OcjFCR1EiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0ia2V5OndwRGVzYzEiIHVzYWdlR3VpZGFuY2U9InVzYWdlOndwRGVzYzEiIHJlZmluZWREZXNjcmlwdGlvbj0iJmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICByZWZpbmVkOiB3cERlc2MxJiMxMzsmIzEwOyZsdDsvcCZndDsiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MS93cERlc2MxIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPFdvcmtQcm9kdWN0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MS93cERlc2MxIj4KLTwvV29ya1Byb2R1Y3Q+Ci08L1dvcmtQcm9kdWN0RGVzY3JpcHRvcj4KLTxXb3JrUHJvZHVjdERlc2NyaXB0b3IgbmFtZT0id3BEZXNjMiIgYnJpZWZEZXNjcmlwdGlvbj0id3BkZXNjMiBsaW5rZWQgdG8gZGVsaXZlcmFibGUiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IndwRGVzYzIgbGlua2VkIHRvIGRlbGl2ZXJhYmxlIiBwcmVmaXg9InByZWZpeCIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSIgYWN0aXZpdHlFbnRyeVN0YXRlPSIiIGFjdGl2aXR5RXhpdFN0YXRlPSIiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJ3cERlc2MyLF9UQ3U0SUR6aUVkcTV5c0ZPTnIxQkdRIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9ImtleTp3cGRlc2MyIiB1c2FnZUd1aWRhbmNlPSJ1c2FnZTp3cGRlc2MyIiByZWZpbmVkRGVzY3JpcHRpb249InJlZmluZWQ6IHdwZGVzYzIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MS93cERlc2MyIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPFdvcmtQcm9kdWN0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MS93cERlc2MyIj4KLTwvV29ya1Byb2R1Y3Q+Ci08ZGVsaXZlcmFibGVQYXJ0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEvb3V0Y29tZV9BMSI+Ci08L2RlbGl2ZXJhYmxlUGFydHM+Ci08ZGVsaXZlcmFibGVQYXJ0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEvYXJ0aWZhY3RfQTEiPgotPC9kZWxpdmVyYWJsZVBhcnRzPgotPGRlbGl2ZXJhYmxlUGFydHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxL3N1Yl9hcnRpZmFjdF9BMS4xIj4KLTwvZGVsaXZlcmFibGVQYXJ0cz4KLTwvV29ya1Byb2R1Y3REZXNjcmlwdG9yPgotPFdvcmtQcm9kdWN0RGVzY3JpcHRvciBuYW1lPSJvdXRjb21lX0ExIiBicmllZkRlc2NyaXB0aW9uPSJPdXRjb21lIEExIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJPdXRjb21lIEExIHByZXNlbnQiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIiBhY3Rpdml0eUVudHJ5U3RhdGU9IiIgYWN0aXZpdHlFeGl0U3RhdGU9IiI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9Im91dGNvbWVfQTEsX1dyX3k4RHprRWRxNXlzRk9OcjFCR1EiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHJlZmluZWREZXNjcmlwdGlvbj0iIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPFdvcmtQcm9kdWN0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MS9vdXRjb21lX0ExIj4KLTwvV29ya1Byb2R1Y3Q+Ci08L1dvcmtQcm9kdWN0RGVzY3JpcHRvcj4KLTxXb3JrUHJvZHVjdERlc2NyaXB0b3IgbmFtZT0iYXJ0aWZhY3RfQTEiIGJyaWVmRGVzY3JpcHRpb249IkFydGlmYWN0IEExIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJBcnRpZmFjdCBBMSBwcmVzZW50IiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSIgYWN0aXZpdHlFbnRyeVN0YXRlPSIiIGFjdGl2aXR5RXhpdFN0YXRlPSIiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJhcnRpZmFjdF9BMSxfWHNYcTBEemtFZHE1eXNGT05yMUJHUSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08V29ya1Byb2R1Y3QgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxL2FydGlmYWN0X0ExIj4KLTwvV29ya1Byb2R1Y3Q+Ci08L1dvcmtQcm9kdWN0RGVzY3JpcHRvcj4KLTxXb3JrUHJvZHVjdERlc2NyaXB0b3IgbmFtZT0id3BEZXNjMyB3aXRoIG5vIGxpbmtzIiBicmllZkRlc2NyaXB0aW9uPSJicmllZjogd3BEZXNjMyB3aXRoIG5vIGxpbmtzIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJ3cERlc2MzIHdpdGggbm8gbGlua3MiIHByZWZpeD0icHJlZml4IiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIiBhY3Rpdml0eUVudHJ5U3RhdGU9IiIgYWN0aXZpdHlFeGl0U3RhdGU9IiI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9IndwRGVzYzMgd2l0aCBubyBsaW5rcyxfMXg1N0FEemtFZHE1eXNGT05yMUJHUSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSJrZXk6IHdwRGVzYzMgd2l0aCBubyBsaW5rcyIgdXNhZ2VHdWlkYW5jZT0idXNhZ2U6IHdwRGVzYzMgd2l0aCBubyBsaW5rcyIgcmVmaW5lZERlc2NyaXB0aW9uPSJyZWZpbmVkOiB3cERlc2MzIHdpdGggbm8gbGlua3MiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MS93cERlc2MzIHdpdGggbm8gbGlua3MiPgotPC9zdXBlckFjdGl2aXRpZXM+Ci08L1dvcmtQcm9kdWN0RGVzY3JpcHRvcj4KLTxSb2xlRGVzY3JpcHRvciBuYW1lPSJyb2xlRGVzYyB3aXRoIG5vIGxpbmtzIiBicmllZkRlc2NyaXB0aW9uPSJicmllZjpyb2xlRGVzYyB3aXRoIG5vIGxpbmtzIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJyb2xlRGVzYyB3aXRoIG5vIGxpbmtzIiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9InJvbGVEZXNjIHdpdGggbm8gbGlua3MsXzNfVU53RHprRWRxNXlzRk9OcjFCR1EiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0ia2V5IGNvbnNpZGVyYXRpb246cm9sZURlc2Mgd2l0aCBubyBsaW5rcyIgdXNhZ2VHdWlkYW5jZT0idXNhZ2U6cm9sZURlc2Mgd2l0aCBubyBsaW5rcyIgcmVmaW5lZERlc2NyaXB0aW9uPSJyZWZpbmVkIGRlc2NyaXB0aW9uIDogcm9sZURlc2Mgd2l0aCBubyBsaW5rcyI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxzdXBlckFjdGl2aXRpZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxL3JvbGVEZXNjIHdpdGggbm8gbGlua3MiPgotPC9zdXBlckFjdGl2aXRpZXM+Ci08L1JvbGVEZXNjcmlwdG9yPgotPFRhc2tEZXNjcmlwdG9yIG5hbWU9InRhc2sgd2l0aCBubyBsaW5rcyIgYnJpZWZEZXNjcmlwdGlvbj0iYnJpZWY6dGFzayB3aXRoIG5vIGxpbmtzIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJ0YXNrIHdpdGggbm8gbGlua3MiIHByZWZpeD0iIiBpc1BsYW5uZWQ9ImZhbHNlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzUmVwZWF0YWJsZT0iZmFsc2UiIGlzT25nb2luZz0iZmFsc2UiIGlzRXZlbnREcml2ZW49ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJ0YXNrIHdpdGggbm8gbGlua3MsXzVqSllBRHprRWRxNXlzRk9OcjFCR1EiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0ia2V5OnRhc2sgd2l0aCBubyBsaW5rcyIgdXNhZ2VHdWlkYW5jZT0idXNhZ2U6dGFzayB3aXRoIG5vIGxpbmtzIiByZWZpbmVkRGVzY3JpcHRpb249IiZsdDtwJmd0OyYjMTM7JiMxMDsgICAgcmVmaW5lZDp0YXNrIHdpdGggbm8gbGlua3MmIzEzOyYjMTA7Jmx0Oy9wJmd0OyI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxzdXBlckFjdGl2aXRpZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxL3Rhc2sgd2l0aCBubyBsaW5rcyI+Ci08L3N1cGVyQWN0aXZpdGllcz4KLTwvVGFza0Rlc2NyaXB0b3I+Ci08V29ya1Byb2R1Y3REZXNjcmlwdG9yIG5hbWU9InN1Yl9hcnRpZmFjdF9BMS4xIiBicmllZkRlc2NyaXB0aW9uPSJTdWJfQXJ0aWZhY3QgQTEuMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iU3ViX0FydGlmYWN0IEExLjEgcHJlc2VudCIgcHJlZml4PSIiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiIGFjdGl2aXR5RW50cnlTdGF0ZT0iIiBhY3Rpdml0eUV4aXRTdGF0ZT0iIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0ic3ViX2FydGlmYWN0X0ExLjEsX1JNTjdFRHpsRWRxNXlzRk9OcjFCR1EiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHJlZmluZWREZXNjcmlwdGlvbj0iIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPFdvcmtQcm9kdWN0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MS9zdWJfYXJ0aWZhY3RfQTEuMSI+Ci08L1dvcmtQcm9kdWN0PgotPC9Xb3JrUHJvZHVjdERlc2NyaXB0b3I+Ci08RGlhZ3JhbSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxHcmFwaE5vZGUgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2NvbnRhaW5lcj4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvZWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvR3JhcGhOb2RlPgotPEdyYXBoTm9kZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvY29udGFpbmVyPgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSIiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9ncmFwaEVsZW1lbnQ+Ci08ZWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9lbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9HcmFwaE5vZGU+Ci08R3JhcGhOb2RlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9jb250YWluZXI+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IiI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2dyYXBoRWxlbWVudD4KLTxlbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2VsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0dyYXBoTm9kZT4KLTxHcmFwaE5vZGUgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2NvbnRhaW5lcj4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvZWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvR3JhcGhOb2RlPgotPEdyYXBoTm9kZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvY29udGFpbmVyPgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSIiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9ncmFwaEVsZW1lbnQ+Ci08ZWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9lbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9HcmFwaE5vZGU+Ci08R3JhcGhOb2RlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9jb250YWluZXI+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IiI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2dyYXBoRWxlbWVudD4KLTxlbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2VsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0dyYXBoTm9kZT4KLTxHcmFwaE5vZGUgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2NvbnRhaW5lcj4KLTxQcm9wZXJ0eSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBrZXk9IndwQ29tcG9zaXRlVHlwZSIgdmFsdWU9IjEiPgotPC9Qcm9wZXJ0eT4KLTxHcmFwaEVkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2NvbnRhaW5lcj4KLTxhbmNob3IgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvYW5jaG9yPgotPC9HcmFwaEVkZ2U+Ci08R3JhcGhFZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9jb250YWluZXI+Ci08YW5jaG9yIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2FuY2hvcj4KLTwvR3JhcGhFZGdlPgotPEdyYXBoRWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvY29udGFpbmVyPgotPGFuY2hvciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9hbmNob3I+Ci08L0dyYXBoRWRnZT4KLTxHcmFwaEVkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2NvbnRhaW5lcj4KLTxhbmNob3IgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvYW5jaG9yPgotPC9HcmFwaEVkZ2U+Ci08R3JhcGhFZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9jb250YWluZXI+Ci08YW5jaG9yIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2FuY2hvcj4KLTwvR3JhcGhFZGdlPgotPEdyYXBoRWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvY29udGFpbmVyPgotPGFuY2hvciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9hbmNob3I+Ci08L0dyYXBoRWRnZT4KLTxHcmFwaEVkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2NvbnRhaW5lcj4KLTxhbmNob3IgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvYW5jaG9yPgotPC9HcmFwaEVkZ2U+Ci08R3JhcGhFZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9jb250YWluZXI+Ci08YW5jaG9yIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2FuY2hvcj4KLTwvR3JhcGhFZGdlPgotPEdyYXBoRWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvY29udGFpbmVyPgotPGFuY2hvciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9hbmNob3I+Ci08L0dyYXBoRWRnZT4KLTxHcmFwaEVkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2NvbnRhaW5lcj4KLTxhbmNob3IgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvYW5jaG9yPgotPC9HcmFwaEVkZ2U+Ci08R3JhcGhFZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9jb250YWluZXI+Ci08YW5jaG9yIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2FuY2hvcj4KLTwvR3JhcGhFZGdlPgotPEdyYXBoQ29ubmVjdG9yIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9ncmFwaEVsZW1lbnQ+Ci08Z3JhcGhFZGdlIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2dyYXBoRWRnZT4KLTwvR3JhcGhDb25uZWN0b3I+Ci08R3JhcGhDb25uZWN0b3IgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2dyYXBoRWxlbWVudD4KLTxncmFwaEVkZ2UgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvZ3JhcGhFZGdlPgotPC9HcmFwaENvbm5lY3Rvcj4KLTxHcmFwaENvbm5lY3RvciBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGdyYXBoRWRnZSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9ncmFwaEVkZ2U+Ci08L0dyYXBoQ29ubmVjdG9yPgotPEdyYXBoQ29ubmVjdG9yIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9ncmFwaEVsZW1lbnQ+Ci08Z3JhcGhFZGdlIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2dyYXBoRWRnZT4KLTwvR3JhcGhDb25uZWN0b3I+Ci08R3JhcGhDb25uZWN0b3IgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2dyYXBoRWxlbWVudD4KLTxncmFwaEVkZ2UgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvZ3JhcGhFZGdlPgotPC9HcmFwaENvbm5lY3Rvcj4KLTxHcmFwaENvbm5lY3RvciBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGdyYXBoRWRnZSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9ncmFwaEVkZ2U+Ci08L0dyYXBoQ29ubmVjdG9yPgotPEdyYXBoQ29ubmVjdG9yIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9ncmFwaEVsZW1lbnQ+Ci08Z3JhcGhFZGdlIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2dyYXBoRWRnZT4KLTwvR3JhcGhDb25uZWN0b3I+Ci08R3JhcGhDb25uZWN0b3IgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2dyYXBoRWxlbWVudD4KLTxncmFwaEVkZ2UgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvZ3JhcGhFZGdlPgotPC9HcmFwaENvbm5lY3Rvcj4KLTxHcmFwaENvbm5lY3RvciBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGdyYXBoRWRnZSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9ncmFwaEVkZ2U+Ci08L0dyYXBoQ29ubmVjdG9yPgotPEdyYXBoQ29ubmVjdG9yIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9ncmFwaEVsZW1lbnQ+Ci08Z3JhcGhFZGdlIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2dyYXBoRWRnZT4KLTwvR3JhcGhDb25uZWN0b3I+Ci08R3JhcGhDb25uZWN0b3IgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2dyYXBoRWxlbWVudD4KLTxncmFwaEVkZ2UgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvZ3JhcGhFZGdlPgotPC9HcmFwaENvbm5lY3Rvcj4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvZWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvR3JhcGhOb2RlPgotPEdyYXBoTm9kZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvY29udGFpbmVyPgotPFByb3BlcnR5IG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIGtleT0id3BDb21wb3NpdGVUeXBlIiB2YWx1ZT0iMiI+Ci08L1Byb3BlcnR5PgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSIiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9ncmFwaEVsZW1lbnQ+Ci08ZWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9lbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9HcmFwaE5vZGU+Ci08R3JhcGhOb2RlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9jb250YWluZXI+Ci08UHJvcGVydHkgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIga2V5PSJ3cENvbXBvc2l0ZVR5cGUiIHZhbHVlPSIxIj4KLTwvUHJvcGVydHk+Ci08R3JhcGhFZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9jb250YWluZXI+Ci08YW5jaG9yIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2FuY2hvcj4KLTwvR3JhcGhFZGdlPgotPEdyYXBoRWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvY29udGFpbmVyPgotPGFuY2hvciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9hbmNob3I+Ci08L0dyYXBoRWRnZT4KLTxHcmFwaEVkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2NvbnRhaW5lcj4KLTxhbmNob3IgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvYW5jaG9yPgotPC9HcmFwaEVkZ2U+Ci08R3JhcGhFZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9jb250YWluZXI+Ci08YW5jaG9yIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2FuY2hvcj4KLTwvR3JhcGhFZGdlPgotPEdyYXBoRWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvY29udGFpbmVyPgotPGFuY2hvciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9hbmNob3I+Ci08L0dyYXBoRWRnZT4KLTxHcmFwaENvbm5lY3RvciBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGdyYXBoRWRnZSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9ncmFwaEVkZ2U+Ci08L0dyYXBoQ29ubmVjdG9yPgotPEdyYXBoQ29ubmVjdG9yIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9ncmFwaEVsZW1lbnQ+Ci08Z3JhcGhFZGdlIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2dyYXBoRWRnZT4KLTwvR3JhcGhDb25uZWN0b3I+Ci08R3JhcGhDb25uZWN0b3IgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2dyYXBoRWxlbWVudD4KLTxncmFwaEVkZ2UgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvZ3JhcGhFZGdlPgotPC9HcmFwaENvbm5lY3Rvcj4KLTxHcmFwaENvbm5lY3RvciBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGdyYXBoRWRnZSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9ncmFwaEVkZ2U+Ci08L0dyYXBoQ29ubmVjdG9yPgotPEdyYXBoQ29ubmVjdG9yIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9ncmFwaEVsZW1lbnQ+Ci08Z3JhcGhFZGdlIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2dyYXBoRWRnZT4KLTwvR3JhcGhDb25uZWN0b3I+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IiI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2dyYXBoRWxlbWVudD4KLTxlbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2VsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0dyYXBoTm9kZT4KLTxHcmFwaE5vZGUgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2NvbnRhaW5lcj4KLTxQcm9wZXJ0eSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBrZXk9IndwQ29tcG9zaXRlVHlwZSIgdmFsdWU9IjIiPgotPC9Qcm9wZXJ0eT4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvZWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvR3JhcGhOb2RlPgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSJBY3Rpdml0eSBEZXRhaWwiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9ncmFwaEVsZW1lbnQ+Ci08ZWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9lbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9EaWFncmFtPgotPC9Qcm9jZXNzUGFja2FnZT4KLTxQcm9jZXNzUGFja2FnZSBuYW1lPSJBY3Rpdml0eTIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgZ2xvYmFsPSJmYWxzZSI+Ci08cGFyZW50UGFja2FnZSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIiPgotPC9wYXJlbnRQYWNrYWdlPgotPEFjdGl2aXR5IG5hbWU9IkFjdGl2aXR5MiIgYnJpZWZEZXNjcmlwdGlvbj0iQWN0aXZpdHkyIGNvbnRhaW5pbmQgRG5EIHRhc2tzIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJBY3Rpdml0eTIgY29udGFpbmluZCBEbkQgdGFza3MiIHByZWZpeD0iUHJlZml4IiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNSZXBlYXRhYmxlPSJmYWxzZSIgaXNPbmdvaW5nPSJmYWxzZSIgaXNFdmVudERyaXZlbj0iZmFsc2UiIHZhcmlhYmlsaXR5VHlwZT0ibmEiIGlzRW5hY3RhYmxlPSJmYWxzZSI+Ci08QWN0aXZpdHlEZXNjcmlwdGlvbiBuYW1lPSJBY3Rpdml0eTIsX0JTNmdFVHpsRWRxNXlzRk9OcjFCR1EiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iJmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICBUaGlzIFdvcmtmbG93IERldGFpbDomIzEzOyYjMTA7Jmx0Oy9wJmd0OyYjMTM7JiMxMDsmbHQ7dWwmZ3Q7JiMxMzsmIzEwOyAgICAmbHQ7bGkmZ3Q7JiMxMzsmIzEwOyAgICAgICAgUHJvdmlkZXMgdGhlIG5hdHVyYWwgJmx0O2ImZ3Q7dHJhbnNpdGlvbiBmcm9tIGFuYWx5c2lzJmx0Oy9iJmd0OyBhY3Rpdml0aWVzICZsdDtiJmd0O3RvIGRlc2lnbiZsdDsvYiZndDsgYWN0aXZpdGllcywgaWRlbnRpZnlpbmc6ICYjMTM7JiMxMDsgICAgICAgICZsdDt1bCZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgJmx0O2xpJmd0OyYjMTM7JiMxMDsgICAgICAgICAgICAgICAgYXBwcm9wcmlhdGUgZGVzaWduIGVsZW1lbnRzIGZyb20gYW5hbHlzaXMgZWxlbWVudHMmIzEzOyYjMTA7ICAgICAgICAgICAgJmx0Oy9saSZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgJmx0O2xpJmd0OyYjMTM7JiMxMDsgICAgICAgICAgICAgICAgYXBwcm9wcmlhdGUgZGVzaWduIG1lY2hhbmlzbXMgZnJvbSByZWxhdGVkIGFuYWx5c2lzIG1lY2hhbmlzbXMmIzEzOyYjMTA7ICAgICAgICAgICAgJmx0Oy9saSZndDsmIzEzOyYjMTA7ICAgICAgICAmbHQ7L3VsJmd0OyYjMTM7JiMxMDsgICAgJmx0Oy9saSZndDsmIzEzOyYjMTA7ICAgICZsdDtsaSZndDsmIzEzOyYjMTA7ICAgICAgICAmbHQ7YiZndDtEZXNjcmliZXMmbHQ7L2ImZ3Q7IHRoZSBvcmdhbml6YXRpb24gb2YgdGhlIHN5c3RlbSZhcG9zO3MgJmx0O2ImZ3Q7cnVuLXRpbWUgYW5kIGRlcGxveW1lbnQgYXJjaGl0ZWN0dXJlJmx0Oy9iJmd0OyYjMTM7JiMxMDsgICAgJmx0Oy9saSZndDsmIzEzOyYjMTA7ICAgICZsdDtsaSZndDsmIzEzOyYjMTA7ICAgICAgICAmbHQ7YiZndDtPcmdhbml6ZXMgdGhlIGltcGxlbWVudGF0aW9uIG1vZGVsJmx0Oy9iJmd0OyBzbyBhcyB0byBtYWtlIHRoZSB0cmFuc2l0aW9uIGJldHdlZW4gZGVzaWduIGFuZCBpbXBsZW1lbnRhdGlvbiBzZWFtbGVzcyYjMTM7JiMxMDsgICAgJmx0Oy9saSZndDsmIzEzOyYjMTA7ICAgICZsdDtsaSZndDsmIzEzOyYjMTA7ICAgICAgICAmbHQ7YiZndDtNYWludGFpbnMgdGhlIGNvbnNpc3RlbmN5IGFuZCBpbnRlZ3JpdHkgb2YgdGhlIGFyY2hpdGVjdHVyZSZsdDsvYiZndDssIGVuc3VyaW5nIHRoYXQ6ICYjMTM7JiMxMDsgICAgICAgICZsdDt1bCZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgJmx0O2xpJmd0OyYjMTM7JiMxMDsgICAgICAgICAgICAgICAgbmV3IGRlc2lnbiBlbGVtZW50cyBpZGVudGlmaWVkIGZvciB0aGUgY3VycmVudCBpdGVyYXRpb24gYXJlIGludGVncmF0ZWQgd2l0aCBwcmUtZXhpc3RpbmcgZGVzaWduIGVsZW1lbnRzLiYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7L2xpJmd0OyYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7bGkmZ3Q7JiMxMzsmIzEwOyAgICAgICAgICAgICAgICBtYXhpbWFsIHJlLXVzZSBvZiBhdmFpbGFibGUgY29tcG9uZW50cyBhbmQgZGVzaWduIGVsZW1lbnRzIGlzIGFjaGlldmVkIGFzIGVhcmx5IGFzIHBvc3NpYmxlIGluIHRoZSBkZXNpZ24mIzEzOyYjMTA7ICAgICAgICAgICAgICAgIGVmZm9ydC4mIzEzOyYjMTA7ICAgICAgICAgICAgJmx0Oy9saSZndDsmIzEzOyYjMTA7ICAgICAgICAmbHQ7L3VsJmd0OyYjMTM7JiMxMDsgICAgJmx0Oy9saSZndDsmIzEzOyYjMTA7Jmx0Oy91bCZndDsiIGtleUNvbnNpZGVyYXRpb25zPSImbHQ7cCZndDsmIzEzOyYjMTA7ICAgIEtleSBjb25zaWRlcmF0aW9uczomIzEzOyYjMTA7Jmx0Oy9wJmd0OyYjMTM7JiMxMDsmbHQ7dWwmZ3Q7JiMxMzsmIzEwOyAgICAmbHQ7bGkmZ3Q7JiMxMzsmIzEwOyAgICAgICAga2V5MSYjMTM7JiMxMDsgICAgJmx0Oy9saSZndDsmIzEzOyYjMTA7ICAgICZsdDtsaSZndDsmIzEzOyYjMTA7ICAgICAgICBrZXkyJiMxMzsmIzEwOyAgICAmbHQ7L2xpJmd0OyYjMTM7JiMxMDsgICAgJmx0O2xpJmd0OyYjMTM7JiMxMDsgICAgICAgIGtleTMmIzEzOyYjMTA7ICAgICZsdDsvbGkmZ3Q7JiMxMzsmIzEwOyAgICAmbHQ7bGkmZ3Q7JiMxMzsmIzEwOyAgICAgICAga2V5NCYjMTM7JiMxMDsgICAgJmx0Oy9saSZndDsmIzEzOyYjMTA7ICAgICZsdDtsaSZndDsmIzEzOyYjMTA7ICAgICAgICBrZXk1JiMxMzsmIzEwOyAgICAmbHQ7L2xpJmd0OyYjMTM7JiMxMDsgICAgJmx0O2xpJmd0OyYjMTM7JiMxMDsgICAgICAgIGtleTYmIzEzOyYjMTA7ICAgICZsdDsvbGkmZ3Q7JiMxMzsmIzEwOyAgICAmbHQ7bGkmZ3Q7JiMxMzsmIzEwOyAgICAgICAga2V5NyYjMTM7JiMxMDsgICAgJmx0Oy9saSZndDsmIzEzOyYjMTA7Jmx0Oy91bCZndDsiIHVzYWdlR3VpZGFuY2U9IiZsdDtwJmd0OyYjMTM7JiMxMDsgICAgVGhlIHdvcmsgaXMgYmVzdCBkb25lIGluIHNldmVyYWwgc2Vzc2lvbnMsIHBlcmhhcHMgcGVyZm9ybWVkIG92ZXIgYSBmZXcgZGF5cyAob3Igd2Vla3MgYW5kIG1vbnRocyBmb3IgdmVyeSBsYXJnZSYjMTM7JiMxMDsgICAgc3lzdGVtcykuIFRoZSBpbml0aWFsIGZvY3VzIHdpbGwgYmUgb24gdGhlIGFjdGl2aXRpZXMgJmx0O2EgY2xhc3M9JnF1b3Q7ZWxlbWVudExpbmsmcXVvdDsmIzEzOyYjMTA7ICAgIGhyZWY9JnF1b3Q7cmVzb3VyY2VzL2lkZW50aWZ5X2Rlc2lnbl9tZWNoYW5pc21zLHtDN0EyNkJENy0zODIwLTQ4RDktODMwRi02ODRDM0FGMTU1Rjl9Lmh0bWwmcXVvdDsmIzEzOyYjMTA7ICAgIGd1aWQ9JnF1b3Q7e0M3QTI2QkQ3LTM4MjAtNDhEOS04MzBGLTY4NEMzQUYxNTVGOX0mcXVvdDsmZ3Q7SWRlbnRpZnkgRGVzaWduIE1lY2hhbmlzbXMmbHQ7L2EmZ3Q7IGFuZCAmbHQ7YSBjbGFzcz0mcXVvdDtlbGVtZW50TGluayZxdW90OyYjMTM7JiMxMDsgICAgaHJlZj0mcXVvdDtyZXNvdXJjZXMvaWRlbnRpZnlfZGVzaWduX2VsZW1lbnRzX3JlYWwtdGltZV9kZXNpZ24sezU4Njk2M0QwLTYwN0QtNEVDMi04RDUzLTI5MkRBRkFCOUM5Mn0uaHRtbCZxdW90OyYjMTM7JiMxMDsgICAgZ3VpZD0mcXVvdDt7NTg2OTYzRDAtNjA3RC00RUMyLThENTMtMjkyREFGQUI5QzkyfSZxdW90OyZndDtpZGVudGlmeV9kZXNpZ25fZWxlbWVudHNfcmVhbC10aW1lX2Rlc2lnbiZsdDsvYSZndDssIHdpdGggYSBncmVhdCBkZWFsIG9mJiMxMzsmIzEwOyAgICBpdGVyYXRpb24gd2l0aCB0aGUgJmx0O2EgY2xhc3M9JnF1b3Q7ZWxlbWVudExpbmsmcXVvdDsmIzEzOyYjMTA7ICAgIGhyZWY9JnF1b3Q7cmVzb3VyY2VzL2luY29ycG9yYXRlX2Rlc2lnbl9lbGVtZW50cyx7NUM2NDcxNzMtNEUzMi00NTk0LTk2QTktMjU0OEI0NzcyMkZBfS5odG1sJnF1b3Q7JiMxMzsmIzEwOyAgICBndWlkPSZxdW90O3s1QzY0NzE3My00RTMyLTQ1OTQtOTZBOS0yNTQ4QjQ3NzIyRkF9JnF1b3Q7Jmd0O0luY29ycG9yYXRlIEV4aXN0aW5nIERlc2lnbiBFbGVtZW50cyZsdDsvYSZndDsgYWN0aXZpdHkgdG8gbWFrZSBzdXJlIHRoYXQgbmV3JiMxMzsmIzEwOyAgICBlbGVtZW50cyBkbyBub3QgZHVwbGljYXRlIGZ1bmN0aW9uYWxpdHkgb2YgZXhpc3RpbmcgZWxlbWVudHMuJiMxMzsmIzEwOyZsdDsvcCZndDsmIzEzOyYjMTA7Jmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICBBcyB0aGUgZGVzaWduIGVtZXJnZXMsIGNvbmN1cnJlbmN5IGFuZCBkaXN0cmlidXRpb24gaXNzdWVzIGFyZSBpbnRyb2R1Y2VkIGluIHRoZSBhY3Rpdml0aWVzICZsdDthIGNsYXNzPSZxdW90O2VsZW1lbnRMaW5rJnF1b3Q7JiMxMzsmIzEwOyAgICBocmVmPSZxdW90O3Jlc291cmNlcy9kZXNjcmliZV9ydW50aW1lX2FyY2hpdGVjdHVyZSx7NEQzNUMwMzgtQTJEMC00OEI4LTlFQ0QtNTI3MTdGRUFFMzNBfS5odG1sJnF1b3Q7JiMxMzsmIzEwOyAgICBndWlkPSZxdW90O3s0RDM1QzAzOC1BMkQwLTQ4QjgtOUVDRC01MjcxN0ZFQUUzM0F9JnF1b3Q7Jmd0O0Rlc2NyaWJlIHRoZSBSdW4tdGltZSBBcmNoaXRlY3R1cmUmbHQ7L2EmZ3Q7IGFuZCAmbHQ7YSBjbGFzcz0mcXVvdDtlbGVtZW50TGluayZxdW90OyYjMTM7JiMxMDsgICAgaHJlZj0mcXVvdDtyZXNvdXJjZXMvZGVzY3JpYmVfZGlzdHJpYnV0aW9uLHs2QTExMjgwOC0wQTkwLTQyN0EtQkFCOS1FMTRGM0ZCRjcyQjV9Lmh0bWwmcXVvdDsmIzEzOyYjMTA7ICAgIGd1aWQ9JnF1b3Q7ezZBMTEyODA4LTBBOTAtNDI3QS1CQUI5LUUxNEYzRkJGNzJCNX0mcXVvdDsmZ3Q7RGVzY3JpYmUgRGlzdHJpYnV0aW9uJmx0Oy9hJmd0OywgcmVzcGVjdGl2ZWx5LiBBcyB0aGVzZSBpc3N1ZXMgYXJlIGNvbnNpZGVyZWQsJiMxMzsmIzEwOyAgICBjaGFuZ2VzIHRvIGRlc2lnbiBlbGVtZW50cyBtYXkgYmUgcmVxdWlyZWQgdG8gc3BsaXQgYmVoYXZpb3IgYWNyb3NzIHByb2Nlc3NlcywgdGhyZWFkcyBvciBub2Rlcy4mIzEzOyYjMTA7Jmx0Oy9wJmd0OyYjMTM7JiMxMDsmbHQ7cCZndDsmIzEzOyYjMTA7ICAgIEFzIHRoZSBpbmRpdmlkdWFsIG1vZGVscyBhcmUgcmVmaW5lZCB0byBpbmNvcnBvcmF0ZSB0aGUgYXJjaGl0ZWN0dXJhbCBkZWNpc2lvbnMsIHRoZSByZXN1bHRzIGFyZSBkb2N1bWVudGVkIGluJiMxMzsmIzEwOyAgICByZXNwZWN0aXZlIHZpZXcgc2VjdGlvbnMgaW4gdGhlIFNvZnR3YXJlIEFyY2hpdGVjdHVyZSBEb2N1bWVudCAoZS5nLiwgYXMgdGhlIERlc2lnbiBNb2RlbCBpcyByZWZpbmVkLCB0aGUgTG9naWNhbCBWaWV3JiMxMzsmIzEwOyAgICBvZiB0aGUgU29mdHdhcmUgQXJjaGl0ZWN0dXJlIERvY3VtZW50IGlzIHJlZmluZWQsIGFzIHdlbGwpLiBUaGUgcmVzdWx0aW5nIGFyY2hpdGVjdHVyZSBpcyByZXZpZXdlZC4mIzEzOyYjMTA7Jmx0Oy9wJmd0OyYjMTM7JiMxMDsmbHQ7YnIgLyZndDsmIzEzOyYjMTA7Jmx0O2JyIC8mZ3Q7IiBwdXJwb3NlPSImbHQ7cCZndDsmIzEzOyYjMTA7ICAgIFB1cnBvc2Ugb2YgdGhpcyBhY3Rpdml0eSBpcyB0byBoYXZlIHRhc2tzIHRoYXQgYXJlIGFzc29jaWF0ZWQgdG8gb3RoZXIgdGFza3MuJiMxMzsmIzEwOyZsdDsvcCZndDsmIzEzOyYjMTA7Jmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICAmYW1wO25ic3A7Jmx0O2ltZyBoZWlnaHQ9JnF1b3Q7NzEmcXVvdDsgYWx0PSZxdW90OyZxdW90OyBzcmM9JnF1b3Q7cmVzb3VyY2VzL3J1cC5qcGcmcXVvdDsgd2lkdGg9JnF1b3Q7MTc2JnF1b3Q7IC8mZ3Q7JiMxMzsmIzEwOyZsdDsvcCZndDsiIGFsdGVybmF0aXZlcz0iJmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICBBbHRlcmFudGl2ZXM6JiMxMzsmIzEwOyZsdDsvcCZndDsmIzEzOyYjMTA7Jmx0O29sJmd0OyYjMTM7JiMxMDsgICAgJmx0O2xpJmd0OyYjMTM7JiMxMDsgICAgICAgIEFsdGVyMSYjMTM7JiMxMDsgICAgJmx0Oy9saSZndDsmIzEzOyYjMTA7ICAgICZsdDtsaSZndDsmIzEzOyYjMTA7ICAgICAgICBBbHRlcjImIzEzOyYjMTA7ICAgICZsdDsvbGkmZ3Q7JiMxMzsmIzEwOyAgICAmbHQ7bGkmZ3Q7JiMxMzsmIzEwOyAgICAgICAgQWx0ZXIzJiMxMzsmIzEwOyAgICAmbHQ7L2xpJmd0OyYjMTM7JiMxMDsmbHQ7L29sJmd0OyIgaG93dG9TdGFmZj0iJmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICBUaGVzZSBhY3Rpdml0aWVzIGFyZSBiZXN0IGNhcnJpZWQgb3V0IGJ5IGEgc21hbGwgdGVhbSBzdGFmZmVkIGJ5IGNyb3NzLWZ1bmN0aW9uYWwgdGVhbSBtZW1iZXJzLiBJc3N1ZXMgdGhhdCBhcmUmIzEzOyYjMTA7ICAgIHR5cGljYWxseSBhcmNoaXRlY3R1cmFsbHkgc2lnbmlmaWNhbnQgaW5jbHVkZSB1c2FiaWxpdHksIHBlcmZvcm1hbmNlLCBzY2FsaW5nLCBwcm9jZXNzIGFuZCB0aHJlYWQgc3luY2hyb25pemF0aW9uLCBhbmQmIzEzOyYjMTA7ICAgIGRpc3RyaWJ1dGlvbi4gVGhlIHRlYW0gc2hvdWxkIGFsc28gaW5jbHVkZSBtZW1iZXJzIHdpdGggZG9tYWluIGV4cGVyaWVuY2Ugd2hvIGNhbiBpZGVudGlmeSBrZXkgYWJzdHJhY3Rpb25zLiBUaGUgdGVhbSYjMTM7JiMxMDsgICAgc2hvdWxkIGFsc28gaGF2ZSBleHBlcmllbmNlIHdpdGggbW9kZWwgb3JnYW5pemF0aW9uIGFuZCBsYXllcmluZy4gVGhlIHRlYW0gd2lsbCBuZWVkIHRvIGJlIGFibGUgdG8gcHVsbCBhbGwgdGhlc2UmIzEzOyYjMTA7ICAgIGRpc3BhcmF0ZSB0aHJlYWRzIGludG8gYSBjb2hlc2l2ZSwgY29oZXJlbnQgKGFsYmVpdCBwcmVsaW1pbmFyeSkgYXJjaGl0ZWN0dXJlLiYjMTM7JiMxMDsmbHQ7L3AmZ3Q7JiMxMzsmIzEwOyZsdDtwJmd0OyYjMTM7JiMxMDsgICAgQmVjYXVzZSB0aGUgZm9jdXMgb2YgdGhlIGFyY2hpdGVjdHVyZSBlZmZvcnQgaXMgc2hpZnRpbmcgdG93YXJkIGltcGxlbWVudGF0aW9uIGlzc3VlcywgZ3JlYXRlciBhdHRlbnRpb24gbmVlZHMgdG8gYmUmIzEzOyYjMTA7ICAgIHBhaWQgdG8gc3BlY2lmaWMgdGVjaG5vbG9neSBpc3N1ZXMuIFRoaXMgd2lsbCBmb3JjZSB0aGUgYXJjaGl0ZWN0dXJlIHRlYW0gdG8gc2hpZnQgbWVtYmVycyBvciBleHBhbmQgdG8gaW5jbHVkZSBwZW9wbGUmIzEzOyYjMTA7ICAgIHdpdGggZGlzdHJpYnV0aW9uIGFuZCBkZXBsb3ltZW50IGV4cGVydGlzZSAoaWYgdGhvc2UgaXNzdWVzIGFyZSBhcmNoaXRlY3R1cmFsbHkgc2lnbmlmaWNhbnQpLiBJbiBvcmRlciB0byB1bmRlcnN0YW5kJiMxMzsmIzEwOyAgICB0aGUgcG90ZW50aWFsIGltcGFjdCBvZiB0aGUgc3RydWN0dXJlIG9uIHRoZSBpbXBsZW1lbnRhdGlvbiBtb2RlbCBvbiB0aGUgZWFzZSBvZiBpbnRlZ3JhdGlvbiwgZXhwZXJ0aXNlIGluIHRoZSBzb2Z0d2FyZSYjMTM7JiMxMDsgICAgYnVpbGQgbWFuYWdlbWVudCBwcm9jZXNzIGlzIHVzZWZ1bCB0byBoYXZlLiYjMTM7JiMxMDsmbHQ7L3AmZ3Q7JiMxMzsmIzEwOyZsdDtwJmd0OyYjMTM7JiMxMDsgICAgQXQgdGhlIHNhbWUgdGltZSwgaXQgaXMgZXNzZW50aWFsIHRoYXQgdGhlIGFyY2hpdGVjdHVyZSB0ZWFtIG5vdCBiZSBjb21wb3NlZCBvZiBhIGxhcmdlIGV4dGVuZGVkIHRlYW0uIEEgc3RyYXRlZ3kgZm9yJiMxMzsmIzEwOyAgICBjb3VudGVyaW5nIHRoaXMgdHJlbmQgaXMgdG8gcmV0YWluIGEgcmVsYXRpdmVseSBzbWFsbCBjb3JlIHRlYW0gd2l0aCBhIHNhdGVsbGl0ZSBncm91cCBvZiBleHRlbmRlZCB0ZWFtIG1lbWJlcnMgdGhhdCYjMTM7JiMxMDsgICAgYXJlIGJyb3VnaHQgaW4gYXMgJnF1b3Q7Y29uc3VsdGFudHMmcXVvdDsgb24ga2V5IGlzc3VlcyZsdDtiJmd0Oy4mbHQ7L2ImZ3Q7IFRoaXMgc3RydWN0dXJlIGFsc28gd29ya3Mgd2VsbCBmb3Igc21hbGxlciBwcm9qZWN0cyB3aGVyZSYjMTM7JiMxMDsgICAgc3BlY2lmaWMgZXhwZXJ0aXNlIG1heSBiZSBib3Jyb3dlZCBvciBjb250cmFjdGVkIGZyb20gb3RoZXIgb3JnYW5pemF0aW9uczsgdGhleSBjYW4gYmUgYnJvdWdodCBpbiBhcyBzcGVjaWZpYyBpc3N1ZXMmIzEzOyYjMTA7ICAgIG5lZWQgdG8gYmUgYWRkcmVzc2VkLiYjMTM7JiMxMDsmbHQ7L3AmZ3Q7Ij4KLTwvQWN0aXZpdHlEZXNjcmlwdGlvbj4KLTxzdXBlckFjdGl2aXRpZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyL0FjdGl2aXR5MiI+Ci08L3N1cGVyQWN0aXZpdGllcz4KLTxicmVha2Rvd25FbGVtZW50cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIvdGFza19BMSI+Ci08L2JyZWFrZG93bkVsZW1lbnRzPgotPGJyZWFrZG93bkVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5Mi9yb2xlX0ExIj4KLTwvYnJlYWtkb3duRWxlbWVudHM+Ci08YnJlYWtkb3duRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyL3JvbGVfQTIiPgotPC9icmVha2Rvd25FbGVtZW50cz4KLTxicmVha2Rvd25FbGVtZW50cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIvc3ViX2FydGlmYWN0X0ExLjEiPgotPC9icmVha2Rvd25FbGVtZW50cz4KLTxicmVha2Rvd25FbGVtZW50cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIvYXJ0aWZhY3RfQTEiPgotPC9icmVha2Rvd25FbGVtZW50cz4KLTxicmVha2Rvd25FbGVtZW50cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIvZGVsaXZlcmFibGVfQTEiPgotPC9icmVha2Rvd25FbGVtZW50cz4KLTxicmVha2Rvd25FbGVtZW50cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIvb3V0Y29tZV9BMSI+Ci08L2JyZWFrZG93bkVsZW1lbnRzPgotPGJyZWFrZG93bkVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5Mi90YXNrX0EyIj4KLTwvYnJlYWtkb3duRWxlbWVudHM+Ci08YnJlYWtkb3duRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyL2FydGlmYWN0X0EyIj4KLTwvYnJlYWtkb3duRWxlbWVudHM+Ci08YnJlYWtkb3duRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyL2RlbGl2ZXJhYmxlX0EyIj4KLTwvYnJlYWtkb3duRWxlbWVudHM+Ci08YnJlYWtkb3duRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyL291dGNvbWVfQTIiPgotPC9icmVha2Rvd25FbGVtZW50cz4KLTxyb2FkbWFwcyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvcm9hZG1hcF9CMSI+Ci08L3JvYWRtYXBzPgotPHN1cHBvcnRpbmdNYXRlcmlhbHMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL3N1cHBvcnRpbmdfbWF0ZXJpYWxfQjEiPgotPC9zdXBwb3J0aW5nTWF0ZXJpYWxzPgotPGNoZWNrbGlzdHMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL2NoZWNrbGlzdF9CMSI+Ci08L2NoZWNrbGlzdHM+Ci08Y29uY2VwdHMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL3doaXRlcGFwZXJfQjEiPgotPC9jb25jZXB0cz4KLTxjb25jZXB0cyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvY29uY2VwdF9CMSI+Ci08L2NvbmNlcHRzPgotPGV4YW1wbGVzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9leGFtcGxlX0IxIj4KLTwvZXhhbXBsZXM+Ci08Z3VpZGVsaW5lcyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvZ3VpZGVsaW5lX0IxIj4KLTwvZ3VpZGVsaW5lcz4KLTxyZXVzYWJsZUFzc2V0cyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvcmV1c2FibGVfYXNzZXRfQjEiPgotPC9yZXVzYWJsZUFzc2V0cz4KLTwvQWN0aXZpdHk+Ci08VGFza0Rlc2NyaXB0b3IgbmFtZT0idGFza19BMSIgYnJpZWZEZXNjcmlwdGlvbj0iVGFzayBBMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iVGFzayBBMSAiIHByZWZpeD0iIiBpc1BsYW5uZWQ9ImZhbHNlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzUmVwZWF0YWJsZT0iZmFsc2UiIGlzT25nb2luZz0iZmFsc2UiIGlzRXZlbnREcml2ZW49ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJ0YXNrX0ExLF8wRFJfUUVERUVkcU85TTNmdWtZQV9BIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IlRhc2sgQTEmYW1wO25ic3A7IGtleSIgdXNhZ2VHdWlkYW5jZT0iJmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICBUYXNrIEExJmFtcDtuYnNwOyBndWlkYW5jZSYjMTM7JiMxMDsmbHQ7L3AmZ3Q7JiMxMzsmIzEwOyZsdDtwJmd0OyYjMTM7JiMxMDsgICAgJmx0O2ltZyBoZWlnaHQ9JnF1b3Q7MTYmcXVvdDsgYWx0PSZxdW90OyZxdW90OyYjMTM7JiMxMDsgICAgc3JjPSZxdW90O2ZpbGU6Ly8vQzovRG9jdW1lbnRzJTIwYW5kJTIwU2V0dGluZ3MvQWRtaW5pc3RyYXRvci9JQk0vTWV0aG9kTGlicmFyaWVzL1BhcmlzL1BhcmlzL1BsdWclMjBBL2NhcGFiaWxpdHlwYXR0ZXJucy9yZXNvdXJjZXMvc3luY2VkLmdpZiZxdW90OyYjMTM7JiMxMDsgICAgIHdpZHRoPSZxdW90OzE2JnF1b3Q7IC8mZ3Q7JiMxMzsmIzEwOyZsdDsvcCZndDsmIzEzOyYjMTA7Jmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICAmbHQ7aW1nIGhlaWdodD0mcXVvdDsxNiZxdW90OyBhbHQ9JnF1b3Q7JnF1b3Q7JiMxMzsmIzEwOyAgICBzcmM9JnF1b3Q7ZmlsZTovLy9DOi9Eb2N1bWVudHMlMjBhbmQlMjBTZXR0aW5ncy9BZG1pbmlzdHJhdG9yL0lCTS9NZXRob2RMaWJyYXJpZXMvUGFyaXMvUGFyaXMvUGx1ZyUyMEEvY2FwYWJpbGl0eXBhdHRlcm5zL3Jlc291cmNlcy9oZWxwYm9vay5naWYmcXVvdDsmIzEzOyYjMTA7ICAgICB3aWR0aD0mcXVvdDsxNiZxdW90OyAvJmd0OyYjMTM7JiMxMDsmbHQ7L3AmZ3Q7IiByZWZpbmVkRGVzY3JpcHRpb249IlRhc2sgQTEmYW1wO25ic3A7IHJlZmluZWQgZGVzY3JpcHRpb24iPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5Mi90YXNrX0ExIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPFRhc2sgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyL3Rhc2tfQTEiPgotPC9UYXNrPgotPGFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5Mi9yb2xlX0EyIj4KLTwvYWRkaXRpb25hbGx5UGVyZm9ybWVkQnk+Ci08bWFuZGF0b3J5SW5wdXQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyL3N1Yl9hcnRpZmFjdF9BMS4xIj4KLTwvbWFuZGF0b3J5SW5wdXQ+Ci08bWFuZGF0b3J5SW5wdXQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyL2FydGlmYWN0X0ExIj4KLTwvbWFuZGF0b3J5SW5wdXQ+Ci08b3B0aW9uYWxJbnB1dCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIvZGVsaXZlcmFibGVfQTEiPgotPC9vcHRpb25hbElucHV0PgotPG91dHB1dCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIvb3V0Y29tZV9BMSI+Ci08L291dHB1dD4KLTxwZXJmb3JtZWRQcmltYXJpbHlCeSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIvdGFza19BMSI+Ci08L3BlcmZvcm1lZFByaW1hcmlseUJ5PgotPHNlbGVjdGVkU3RlcHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3Rhc2tfQTEvdGFza19BMSxfN004bnNBLVBFZHFMMk8xUEpWOWNaQS9TdGVwIEExLjEiPgotPC9zZWxlY3RlZFN0ZXBzPgotPHNlbGVjdGVkU3RlcHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3Rhc2tfQTEvdGFza19BMSxfN004bnNBLVBFZHFMMk8xUEpWOWNaQS9TdGVwIEExLjIiPgotPC9zZWxlY3RlZFN0ZXBzPgotPHNlbGVjdGVkU3RlcHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3Rhc2tfQTEvdGFza19BMSxfN004bnNBLVBFZHFMMk8xUEpWOWNaQS9TdGVwIEExLjMiPgotPC9zZWxlY3RlZFN0ZXBzPgotPC9UYXNrRGVzY3JpcHRvcj4KLTxSb2xlRGVzY3JpcHRvciBuYW1lPSJyb2xlX0ExIiBicmllZkRlc2NyaXB0aW9uPSJSb2xlIEExIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJSb2xlIEExIiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9InJvbGVfQTEsXzBEazZNRURFRWRxTzlNM2Z1a1lBX0EiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iUm9sZSBBMSBrZXkiIHVzYWdlR3VpZGFuY2U9IlJvbGUgQTEgZ3VpZGFuY2UiIHJlZmluZWREZXNjcmlwdGlvbj0iJmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICBSb2xlIEExIHJlZmluZWQgZGVzYyYjMTM7JiMxMDsmbHQ7L3AmZ3Q7JiMxMzsmIzEwOyZsdDtwJmd0OyYjMTM7JiMxMDsgICAgJmx0O2ltZyBoZWlnaHQ9JnF1b3Q7NzEmcXVvdDsgYWx0PSZxdW90OyZxdW90OyYjMTM7JiMxMDsgICAgc3JjPSZxdW90O2ZpbGU6Ly8vQzovRG9jdW1lbnRzJTIwYW5kJTIwU2V0dGluZ3MvQWRtaW5pc3RyYXRvci9JQk0vTWV0aG9kTGlicmFyaWVzL1BhcmlzL1BhcmlzL1BsdWclMjBBL2NhcGFiaWxpdHlwYXR0ZXJucy9yZXNvdXJjZXMvcnVwLmpwZyZxdW90OyYjMTM7JiMxMDsgICAgIHdpZHRoPSZxdW90OzE3NiZxdW90OyAvJmd0OyYjMTM7JiMxMDsmbHQ7L3AmZ3Q7Ij4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPHN1cGVyQWN0aXZpdGllcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIvcm9sZV9BMSI+Ci08L3N1cGVyQWN0aXZpdGllcz4KLTxSb2xlIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5Mi9yb2xlX0ExIj4KLTwvUm9sZT4KLTxtb2RpZmllcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIvb3V0Y29tZV9BMSI+Ci08L21vZGlmaWVzPgotPHJlc3BvbnNpYmxlRm9yIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5Mi9hcnRpZmFjdF9BMSI+Ci08L3Jlc3BvbnNpYmxlRm9yPgotPHJlc3BvbnNpYmxlRm9yIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5Mi9kZWxpdmVyYWJsZV9BMSI+Ci08L3Jlc3BvbnNpYmxlRm9yPgotPHJlc3BvbnNpYmxlRm9yIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5Mi9vdXRjb21lX0ExIj4KLTwvcmVzcG9uc2libGVGb3I+Ci08L1JvbGVEZXNjcmlwdG9yPgotPFJvbGVEZXNjcmlwdG9yIG5hbWU9InJvbGVfQTIiIGJyaWVmRGVzY3JpcHRpb249IlJvbGUgQTIgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IlJvbGUgQTIgIiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9InJvbGVfQTIsXzBEazZNVURFRWRxTzlNM2Z1a1lBX0EiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iJmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICBSb2xlIEEyIGtleSYjMTM7JiMxMDsmbHQ7L3AmZ3Q7JiMxMzsmIzEwOyZsdDtwJmd0OyYjMTM7JiMxMDsgICAgJmx0O2ltZyBoZWlnaHQ9JnF1b3Q7MTY3JnF1b3Q7IGFsdD0mcXVvdDsmcXVvdDsmIzEzOyYjMTA7ICAgIHNyYz0mcXVvdDtmaWxlOi8vL0M6L0RvY3VtZW50cyUyMGFuZCUyMFNldHRpbmdzL0FkbWluaXN0cmF0b3IvSUJNL01ldGhvZExpYnJhcmllcy9QYXJpcy9QYXJpcy9QbHVnJTIwQS9jYXBhYmlsaXR5cGF0dGVybnMvcmVzb3VyY2VzL3J1cDFfYS5naWYmcXVvdDsmIzEzOyYjMTA7ICAgICB3aWR0aD0mcXVvdDsyNiZxdW90OyAvJmd0OyYjMTM7JiMxMDsmbHQ7L3AmZ3Q7IiB1c2FnZUd1aWRhbmNlPSJSb2xlIEEyIHVzYWdlIiByZWZpbmVkRGVzY3JpcHRpb249IlJvbGUgQTIgcmVmaW5lZCBkZXNjIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPHN1cGVyQWN0aXZpdGllcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIvcm9sZV9BMiI+Ci08L3N1cGVyQWN0aXZpdGllcz4KLTxSb2xlIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5Mi9yb2xlX0EyIj4KLTwvUm9sZT4KLTxtb2RpZmllcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIvb3V0Y29tZV9BMiI+Ci08L21vZGlmaWVzPgotPC9Sb2xlRGVzY3JpcHRvcj4KLTxXb3JrUHJvZHVjdERlc2NyaXB0b3IgbmFtZT0ic3ViX2FydGlmYWN0X0ExLjEiIGJyaWVmRGVzY3JpcHRpb249IlN1Yl9BcnRpZmFjdCBBMS4xIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJTdWJfQXJ0aWZhY3QgQTEuMSBwcmVzZW50IiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSIgYWN0aXZpdHlFbnRyeVN0YXRlPSIiIGFjdGl2aXR5RXhpdFN0YXRlPSIiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJzdWJfYXJ0aWZhY3RfQTEuMSxfMER1ck1FREVFZHFPOU0zZnVrWUFfQSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5Mi9zdWJfYXJ0aWZhY3RfQTEuMSI+Ci08L3N1cGVyQWN0aXZpdGllcz4KLTxXb3JrUHJvZHVjdCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIvc3ViX2FydGlmYWN0X0ExLjEiPgotPC9Xb3JrUHJvZHVjdD4KLTwvV29ya1Byb2R1Y3REZXNjcmlwdG9yPgotPFdvcmtQcm9kdWN0RGVzY3JpcHRvciBuYW1lPSJhcnRpZmFjdF9BMSIgYnJpZWZEZXNjcmlwdGlvbj0iQXJ0aWZhY3QgQTEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IkFydGlmYWN0IEExIHByZXNlbnQiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIiBhY3Rpdml0eUVudHJ5U3RhdGU9IiIgYWN0aXZpdHlFeGl0U3RhdGU9IiI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9ImFydGlmYWN0X0ExLF8wRHVyTVVERUVkcU85TTNmdWtZQV9BIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiByZWZpbmVkRGVzY3JpcHRpb249IiI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxzdXBlckFjdGl2aXRpZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyL2FydGlmYWN0X0ExIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPFdvcmtQcm9kdWN0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5Mi9hcnRpZmFjdF9BMSI+Ci08L1dvcmtQcm9kdWN0PgotPC9Xb3JrUHJvZHVjdERlc2NyaXB0b3I+Ci08V29ya1Byb2R1Y3REZXNjcmlwdG9yIG5hbWU9ImRlbGl2ZXJhYmxlX0ExIiBicmllZkRlc2NyaXB0aW9uPSJEZWxpdmVyYWJsZSBBMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iRGVsaXZlcmFibGUgQTEgcHJlc2VudCIgcHJlZml4PSIiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiIGFjdGl2aXR5RW50cnlTdGF0ZT0iIiBhY3Rpdml0eUV4aXRTdGF0ZT0iIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0iZGVsaXZlcmFibGVfQTEsXzBEdXJNa0RFRWRxTzlNM2Z1a1lBX0EiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHJlZmluZWREZXNjcmlwdGlvbj0iIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPHN1cGVyQWN0aXZpdGllcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIvZGVsaXZlcmFibGVfQTEiPgotPC9zdXBlckFjdGl2aXRpZXM+Ci08V29ya1Byb2R1Y3QgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyL2RlbGl2ZXJhYmxlX0ExIj4KLTwvV29ya1Byb2R1Y3Q+Ci08ZGVsaXZlcmFibGVQYXJ0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIvYXJ0aWZhY3RfQTEiPgotPC9kZWxpdmVyYWJsZVBhcnRzPgotPGRlbGl2ZXJhYmxlUGFydHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyL3N1Yl9hcnRpZmFjdF9BMS4xIj4KLTwvZGVsaXZlcmFibGVQYXJ0cz4KLTxkZWxpdmVyYWJsZVBhcnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5Mi9vdXRjb21lX0ExIj4KLTwvZGVsaXZlcmFibGVQYXJ0cz4KLTwvV29ya1Byb2R1Y3REZXNjcmlwdG9yPgotPFdvcmtQcm9kdWN0RGVzY3JpcHRvciBuYW1lPSJvdXRjb21lX0ExIiBicmllZkRlc2NyaXB0aW9uPSJPdXRjb21lIEExIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJPdXRjb21lIEExIHByZXNlbnQiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIiBhY3Rpdml0eUVudHJ5U3RhdGU9IiIgYWN0aXZpdHlFeGl0U3RhdGU9IiI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9Im91dGNvbWVfQTEsXzBEdXJNMERFRWRxTzlNM2Z1a1lBX0EiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHJlZmluZWREZXNjcmlwdGlvbj0iIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPHN1cGVyQWN0aXZpdGllcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIvb3V0Y29tZV9BMSI+Ci08L3N1cGVyQWN0aXZpdGllcz4KLTxXb3JrUHJvZHVjdCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIvb3V0Y29tZV9BMSI+Ci08L1dvcmtQcm9kdWN0PgotPC9Xb3JrUHJvZHVjdERlc2NyaXB0b3I+Ci08V29ya1Byb2R1Y3REZXNjcmlwdG9yIG5hbWU9ImFydGlmYWN0X0ExIiBicmllZkRlc2NyaXB0aW9uPSJBcnRpZmFjdCBBMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iQXJ0aWZhY3QgQTEgcHJlc2VudCIgcHJlZml4PSIiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiIGFjdGl2aXR5RW50cnlTdGF0ZT0iIiBhY3Rpdml0eUV4aXRTdGF0ZT0iIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0iYXJ0aWZhY3RfQTEsXzBFVWhFRURFRWRxTzlNM2Z1a1lBX0EiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHJlZmluZWREZXNjcmlwdGlvbj0iIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPFdvcmtQcm9kdWN0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5Mi9hcnRpZmFjdF9BMSI+Ci08L1dvcmtQcm9kdWN0PgotPC9Xb3JrUHJvZHVjdERlc2NyaXB0b3I+Ci08V29ya1Byb2R1Y3REZXNjcmlwdG9yIG5hbWU9InN1Yl9hcnRpZmFjdF9BMS4xIiBicmllZkRlc2NyaXB0aW9uPSJTdWJfQXJ0aWZhY3QgQTEuMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iU3ViX0FydGlmYWN0IEExLjEgcHJlc2VudCIgcHJlZml4PSIiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiIGFjdGl2aXR5RW50cnlTdGF0ZT0iIiBhY3Rpdml0eUV4aXRTdGF0ZT0iIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0ic3ViX2FydGlmYWN0X0ExLjEsXzBFVWhFVURFRWRxTzlNM2Z1a1lBX0EiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHJlZmluZWREZXNjcmlwdGlvbj0iIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPFdvcmtQcm9kdWN0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5Mi9zdWJfYXJ0aWZhY3RfQTEuMSI+Ci08L1dvcmtQcm9kdWN0PgotPC9Xb3JrUHJvZHVjdERlc2NyaXB0b3I+Ci08V29ya1Byb2R1Y3REZXNjcmlwdG9yIG5hbWU9Im91dGNvbWVfQTEiIGJyaWVmRGVzY3JpcHRpb249Ik91dGNvbWUgQTEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9Ik91dGNvbWUgQTEgcHJlc2VudCIgcHJlZml4PSIiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiIGFjdGl2aXR5RW50cnlTdGF0ZT0iIiBhY3Rpdml0eUV4aXRTdGF0ZT0iIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0ib3V0Y29tZV9BMSxfMEVVaEVrREVFZHFPOU0zZnVrWUFfQSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08V29ya1Byb2R1Y3QgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyL291dGNvbWVfQTEiPgotPC9Xb3JrUHJvZHVjdD4KLTwvV29ya1Byb2R1Y3REZXNjcmlwdG9yPgotPFRhc2tEZXNjcmlwdG9yIG5hbWU9InRhc2tfQTIiIGJyaWVmRGVzY3JpcHRpb249IlRhc2sgQTIgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IlRhc2sgQTIgIiBwcmVmaXg9IlByZWZpeCIgaXNQbGFubmVkPSJmYWxzZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1JlcGVhdGFibGU9ImZhbHNlIiBpc09uZ29pbmc9ImZhbHNlIiBpc0V2ZW50RHJpdmVuPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0idGFza19BMixfMjg4N0VFREVFZHFPOU0zZnVrWUFfQSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSJUYXNrIEEyIGtleSIgdXNhZ2VHdWlkYW5jZT0iVGFzayBBMiBndWlkYW5jZSIgcmVmaW5lZERlc2NyaXB0aW9uPSJUYXNrIEEyIHJlZmluZWQgZGVzY3JpcHRpb24iPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5Mi90YXNrX0EyIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPFRhc2sgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyL3Rhc2tfQTIiPgotPC9UYXNrPgotPGFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5Mi9yb2xlX0ExIj4KLTwvYWRkaXRpb25hbGx5UGVyZm9ybWVkQnk+Ci08bWFuZGF0b3J5SW5wdXQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyL2FydGlmYWN0X0EyIj4KLTwvbWFuZGF0b3J5SW5wdXQ+Ci08b3B0aW9uYWxJbnB1dCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIvZGVsaXZlcmFibGVfQTIiPgotPC9vcHRpb25hbElucHV0PgotPG91dHB1dCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIvb3V0Y29tZV9BMiI+Ci08L291dHB1dD4KLTxwZXJmb3JtZWRQcmltYXJpbHlCeSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIvdGFza19BMiI+Ci08L3BlcmZvcm1lZFByaW1hcmlseUJ5PgotPHNlbGVjdGVkU3RlcHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3Rhc2tfQTIvdGFza19BMixfNzVOUXdBLVBFZHFMMk8xUEpWOWNaQS9TdGVwIEEyLjEiPgotPC9zZWxlY3RlZFN0ZXBzPgotPHNlbGVjdGVkU3RlcHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3Rhc2tfQTIvdGFza19BMixfNzVOUXdBLVBFZHFMMk8xUEpWOWNaQS9TdGVwIEEyLjIiPgotPC9zZWxlY3RlZFN0ZXBzPgotPHNlbGVjdGVkU3RlcHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3Rhc2tfQTIvdGFza19BMixfNzVOUXdBLVBFZHFMMk8xUEpWOWNaQS9TdGVwIEEyLjMiPgotPC9zZWxlY3RlZFN0ZXBzPgotPC9UYXNrRGVzY3JpcHRvcj4KLTxXb3JrUHJvZHVjdERlc2NyaXB0b3IgbmFtZT0iYXJ0aWZhY3RfQTIiIGJyaWVmRGVzY3JpcHRpb249IkFydGlmYWN0IEEyIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJBcnRpZmFjdCBBMiBwcmVzZW50IiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSIgYWN0aXZpdHlFbnRyeVN0YXRlPSIiIGFjdGl2aXR5RXhpdFN0YXRlPSIiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJhcnRpZmFjdF9BMixfMjlabkFFREVFZHFPOU0zZnVrWUFfQSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5Mi9hcnRpZmFjdF9BMiI+Ci08L3N1cGVyQWN0aXZpdGllcz4KLTxXb3JrUHJvZHVjdCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIvYXJ0aWZhY3RfQTIiPgotPC9Xb3JrUHJvZHVjdD4KLTwvV29ya1Byb2R1Y3REZXNjcmlwdG9yPgotPFdvcmtQcm9kdWN0RGVzY3JpcHRvciBuYW1lPSJkZWxpdmVyYWJsZV9BMiIgYnJpZWZEZXNjcmlwdGlvbj0iRGVsaXZlcmFibGUgQTIgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IkRlbGl2ZXJhYmxlIEEyIHByZXNlbnQiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIiBhY3Rpdml0eUVudHJ5U3RhdGU9IiIgYWN0aXZpdHlFeGl0U3RhdGU9IiI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9ImRlbGl2ZXJhYmxlX0EyLF8yOVpuQVVERUVkcU85TTNmdWtZQV9BIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiByZWZpbmVkRGVzY3JpcHRpb249IiI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxzdXBlckFjdGl2aXRpZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyL2RlbGl2ZXJhYmxlX0EyIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPFdvcmtQcm9kdWN0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5Mi9kZWxpdmVyYWJsZV9BMiI+Ci08L1dvcmtQcm9kdWN0PgotPGRlbGl2ZXJhYmxlUGFydHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyL2FydGlmYWN0X0EyIj4KLTwvZGVsaXZlcmFibGVQYXJ0cz4KLTxkZWxpdmVyYWJsZVBhcnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5Mi9vdXRjb21lX0EyIj4KLTwvZGVsaXZlcmFibGVQYXJ0cz4KLTwvV29ya1Byb2R1Y3REZXNjcmlwdG9yPgotPFdvcmtQcm9kdWN0RGVzY3JpcHRvciBuYW1lPSJvdXRjb21lX0EyIiBicmllZkRlc2NyaXB0aW9uPSJPdXRjb21lIEExIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJPdXRjb21lIEEyIHByZXNlbnQiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIiBhY3Rpdml0eUVudHJ5U3RhdGU9IiIgYWN0aXZpdHlFeGl0U3RhdGU9IiI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9Im91dGNvbWVfQTIsXzI5Wm5Ba0RFRWRxTzlNM2Z1a1lBX0EiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHJlZmluZWREZXNjcmlwdGlvbj0iIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPHN1cGVyQWN0aXZpdGllcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIvb3V0Y29tZV9BMiI+Ci08L3N1cGVyQWN0aXZpdGllcz4KLTxXb3JrUHJvZHVjdCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIvb3V0Y29tZV9BMiI+Ci08L1dvcmtQcm9kdWN0PgotPC9Xb3JrUHJvZHVjdERlc2NyaXB0b3I+Ci08V29ya1Byb2R1Y3REZXNjcmlwdG9yIG5hbWU9ImFydGlmYWN0X0EyIiBicmllZkRlc2NyaXB0aW9uPSJBcnRpZmFjdCBBMiBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iQXJ0aWZhY3QgQTIgcHJlc2VudCIgcHJlZml4PSIiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiIGFjdGl2aXR5RW50cnlTdGF0ZT0iIiBhY3Rpdml0eUV4aXRTdGF0ZT0iIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0iYXJ0aWZhY3RfQTIsXzI5c2g4RURFRWRxTzlNM2Z1a1lBX0EiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHJlZmluZWREZXNjcmlwdGlvbj0iIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPFdvcmtQcm9kdWN0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5Mi9hcnRpZmFjdF9BMiI+Ci08L1dvcmtQcm9kdWN0PgotPC9Xb3JrUHJvZHVjdERlc2NyaXB0b3I+Ci08V29ya1Byb2R1Y3REZXNjcmlwdG9yIG5hbWU9Im91dGNvbWVfQTIiIGJyaWVmRGVzY3JpcHRpb249Ik91dGNvbWUgQTEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9Ik91dGNvbWUgQTIgcHJlc2VudCIgcHJlZml4PSIiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiIGFjdGl2aXR5RW50cnlTdGF0ZT0iIiBhY3Rpdml0eUV4aXRTdGF0ZT0iIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0ib3V0Y29tZV9BMixfMjlzaDhVREVFZHFPOU0zZnVrWUFfQSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08V29ya1Byb2R1Y3QgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyL291dGNvbWVfQTIiPgotPC9Xb3JrUHJvZHVjdD4KLTwvV29ya1Byb2R1Y3REZXNjcmlwdG9yPgotPERpYWdyYW0gbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08R3JhcGhOb2RlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIiPgotPC9jb250YWluZXI+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IiI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MiI+Ci08L2dyYXBoRWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvR3JhcGhOb2RlPgotPEdyYXBoTm9kZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyIj4KLTwvY29udGFpbmVyPgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSIiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIiPgotPC9ncmFwaEVsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0dyYXBoTm9kZT4KLTxHcmFwaE5vZGUgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MiI+Ci08L2NvbnRhaW5lcj4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyIj4KLTwvZ3JhcGhFbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9HcmFwaE5vZGU+Ci08R3JhcGhOb2RlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIiPgotPC9jb250YWluZXI+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IiI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MiI+Ci08L2dyYXBoRWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvR3JhcGhOb2RlPgotPEdyYXBoTm9kZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyIj4KLTwvY29udGFpbmVyPgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSIiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIiPgotPC9ncmFwaEVsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0dyYXBoTm9kZT4KLTxHcmFwaE5vZGUgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MiI+Ci08L2NvbnRhaW5lcj4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyIj4KLTwvZ3JhcGhFbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9HcmFwaE5vZGU+Ci08R3JhcGhOb2RlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIiPgotPC9jb250YWluZXI+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IiI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MiI+Ci08L2dyYXBoRWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvR3JhcGhOb2RlPgotPEdyYXBoTm9kZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyIj4KLTwvY29udGFpbmVyPgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSIiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIiPgotPC9ncmFwaEVsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0dyYXBoTm9kZT4KLTxHcmFwaE5vZGUgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MiI+Ci08L2NvbnRhaW5lcj4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyIj4KLTwvZ3JhcGhFbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9HcmFwaE5vZGU+Ci08R3JhcGhOb2RlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIiPgotPC9jb250YWluZXI+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IiI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MiI+Ci08L2dyYXBoRWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvR3JhcGhOb2RlPgotPEdyYXBoTm9kZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyIj4KLTwvY29udGFpbmVyPgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSIiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIiPgotPC9ncmFwaEVsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0dyYXBoTm9kZT4KLTxHcmFwaE5vZGUgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MiI+Ci08L2NvbnRhaW5lcj4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyIj4KLTwvZ3JhcGhFbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9HcmFwaE5vZGU+Ci08R3JhcGhOb2RlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIiPgotPC9jb250YWluZXI+Ci08UHJvcGVydHkgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIga2V5PSJ3cENvbXBvc2l0ZVR5cGUiIHZhbHVlPSIxIj4KLTwvUHJvcGVydHk+Ci08R3JhcGhFZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIiPgotPC9jb250YWluZXI+Ci08YW5jaG9yIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MiI+Ci08L2FuY2hvcj4KLTwvR3JhcGhFZGdlPgotPEdyYXBoRWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyIj4KLTwvY29udGFpbmVyPgotPGFuY2hvciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIiPgotPC9hbmNob3I+Ci08L0dyYXBoRWRnZT4KLTxHcmFwaENvbm5lY3RvciBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyIj4KLTwvZ3JhcGhFbGVtZW50PgotPGdyYXBoRWRnZSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIiPgotPC9ncmFwaEVkZ2U+Ci08L0dyYXBoQ29ubmVjdG9yPgotPEdyYXBoQ29ubmVjdG9yIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIiPgotPC9ncmFwaEVsZW1lbnQ+Ci08Z3JhcGhFZGdlIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MiI+Ci08L2dyYXBoRWRnZT4KLTwvR3JhcGhDb25uZWN0b3I+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IiI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MiI+Ci08L2dyYXBoRWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvR3JhcGhOb2RlPgotPEdyYXBoTm9kZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyIj4KLTwvY29udGFpbmVyPgotPFByb3BlcnR5IG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIGtleT0id3BDb21wb3NpdGVUeXBlIiB2YWx1ZT0iMiI+Ci08L1Byb3BlcnR5PgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSIiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIiPgotPC9ncmFwaEVsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0dyYXBoTm9kZT4KLTxHcmFwaE5vZGUgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MiI+Ci08L2NvbnRhaW5lcj4KLTxQcm9wZXJ0eSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBrZXk9IndwQ29tcG9zaXRlVHlwZSIgdmFsdWU9IjEiPgotPC9Qcm9wZXJ0eT4KLTxHcmFwaEVkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MiI+Ci08L2NvbnRhaW5lcj4KLTxhbmNob3IgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyIj4KLTwvYW5jaG9yPgotPC9HcmFwaEVkZ2U+Ci08R3JhcGhFZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIiPgotPC9jb250YWluZXI+Ci08YW5jaG9yIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MiI+Ci08L2FuY2hvcj4KLTwvR3JhcGhFZGdlPgotPEdyYXBoQ29ubmVjdG9yIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIiPgotPC9ncmFwaEVsZW1lbnQ+Ci08Z3JhcGhFZGdlIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MiI+Ci08L2dyYXBoRWRnZT4KLTwvR3JhcGhDb25uZWN0b3I+Ci08R3JhcGhDb25uZWN0b3IgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MiI+Ci08L2dyYXBoRWxlbWVudD4KLTxncmFwaEVkZ2UgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyIj4KLTwvZ3JhcGhFZGdlPgotPC9HcmFwaENvbm5lY3Rvcj4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyIj4KLTwvZ3JhcGhFbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9HcmFwaE5vZGU+Ci08R3JhcGhOb2RlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIiPgotPC9jb250YWluZXI+Ci08UHJvcGVydHkgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIga2V5PSJ3cENvbXBvc2l0ZVR5cGUiIHZhbHVlPSIyIj4KLTwvUHJvcGVydHk+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IiI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MiI+Ci08L2dyYXBoRWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvR3JhcGhOb2RlPgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSJBY3Rpdml0eSBEZXRhaWwiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIiPgotPC9ncmFwaEVsZW1lbnQ+Ci08ZWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIiPgotPC9lbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9EaWFncmFtPgotPC9Qcm9jZXNzUGFja2FnZT4KLTxJdGVyYXRpb24gbmFtZT0iSXRlcmF0aW9uMSIgYnJpZWZEZXNjcmlwdGlvbj0iVGhpcyBpdGVyYXRpb24gY29udGFpbnMgdHdvIGFjdGl2aXRpZXMiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9Ikl0ZXJhdGlvbjEiIHByZWZpeD0iUHJlZml4IiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNSZXBlYXRhYmxlPSJmYWxzZSIgaXNPbmdvaW5nPSJ0cnVlIiBpc0V2ZW50RHJpdmVuPSJmYWxzZSIgdmFyaWFiaWxpdHlUeXBlPSJuYSIgaXNFbmFjdGFibGU9ImZhbHNlIj4KLTxBY3Rpdml0eURlc2NyaXB0aW9uIG5hbWU9Ikl0ZXJhdGlvbjEsX0VGVnJ3VHppRWRxNXlzRk9OcjFCR1EiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iJmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICBUaGlzIHdvcmtmbG93IGRldGFpbCBoYXMgdGhlIGZvbGxvd2luZyBnb2FsczomIzEzOyYjMTA7Jmx0Oy9wJmd0OyYjMTM7JiMxMDsmbHQ7dWwmZ3Q7JiMxMzsmIzEwOyAgICAmbHQ7bGkmZ3Q7JiMxMzsmIzEwOyAgICAgICAgQ3JlYXRlIGFuIGluaXRpYWwgc2tldGNoIG9mIHRoZSBhcmNoaXRlY3R1cmUgb2YgdGhlIHN5c3RlbSAmIzEzOyYjMTA7ICAgICAgICAmbHQ7dWwmZ3Q7JiMxMzsmIzEwOyAgICAgICAgICAgICZsdDtsaSZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgICAgIERlZmluZSBhbiBpbml0aWFsIHNldCBvZiBhcmNoaXRlY3R1cmFsbHkgc2lnbmlmaWNhbnQgZWxlbWVudHMgdG8gdXNlIGFzIHRoZSBiYXNpcyBmb3IgYW5hbHlzaXMmIzEzOyYjMTA7ICAgICAgICAgICAgJmx0Oy9saSZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgJmx0O2xpJmd0OyYjMTM7JiMxMDsgICAgICAgICAgICAgICAgRGVmaW5lIGFuIGluaXRpYWwgc2V0IG9mIGFuYWx5c2lzIG1lY2hhbmlzbXMmIzEzOyYjMTA7ICAgICAgICAgICAgJmx0Oy9saSZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgJmx0O2xpJmd0OyYjMTM7JiMxMDsgICAgICAgICAgICAgICAgRGVmaW5lIHRoZSBpbml0aWFsIGxheWVyaW5nIGFuZCBvcmdhbml6YXRpb24gb2YgdGhlIHN5c3RlbSYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7L2xpJmd0OyYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7bGkmZ3Q7JiMxMzsmIzEwOyAgICAgICAgICAgICAgICBEZWZpbmUgdGhlIHVzZS1jYXNlIHJlYWxpemF0aW9ucyB0byBiZSBhZGRyZXNzZWQgaW4gdGhlIGN1cnJlbnQgaXRlcmF0aW9uJiMxMzsmIzEwOyAgICAgICAgICAgICZsdDsvbGkmZ3Q7JiMxMzsmIzEwOyAgICAgICAgJmx0Oy91bCZndDsmIzEzOyYjMTA7ICAgICZsdDsvbGkmZ3Q7JiMxMzsmIzEwOyAgICAmbHQ7bGkmZ3Q7JiMxMzsmIzEwOyAgICAgICAgSWRlbnRpZnkgYW5hbHlzaXMgY2xhc3NlcyBmcm9tIHRoZSBhcmNoaXRlY3R1cmFsbHkgc2lnbmlmaWNhbnQgdXNlIGNhc2VzJiMxMzsmIzEwOyAgICAmbHQ7L2xpJmd0OyYjMTM7JiMxMDsgICAgJmx0O2xpJmd0OyYjMTM7JiMxMDsgICAgICAgIFVwZGF0ZSB0aGUgdXNlLWNhc2UgcmVhbGl6YXRpb25zIHdpdGggYW5hbHlzaXMgY2xhc3MgaW50ZXJhY3Rpb25zJiMxMzsmIzEwOyAgICAmbHQ7L2xpJmd0OyYjMTM7JiMxMDsmbHQ7L3VsJmd0OyIga2V5Q29uc2lkZXJhdGlvbnM9IiZsdDtwJmd0OyYjMTM7JiMxMDsgICAgS2V5IGNvbnNpZGVyYXRpb25zOiYjMTM7JiMxMDsmbHQ7L3AmZ3Q7JiMxMzsmIzEwOyZsdDt1bCZndDsmIzEzOyYjMTA7ICAgICZsdDtsaSZndDsmIzEzOyYjMTA7ICAgICAgICBrZXkxMSYjMTM7JiMxMDsgICAgJmx0Oy9saSZndDsmIzEzOyYjMTA7ICAgICZsdDtsaSZndDsmIzEzOyYjMTA7ICAgICAgICBrZXkyMiYjMTM7JiMxMDsgICAgJmx0Oy9saSZndDsmIzEzOyYjMTA7ICAgICZsdDtsaSZndDsmIzEzOyYjMTA7ICAgICAgICBrZXkzMyYjMTM7JiMxMDsgICAgJmx0Oy9saSZndDsmIzEzOyYjMTA7Jmx0Oy91bCZndDsiIHVzYWdlR3VpZGFuY2U9IiZsdDtwJmd0OyYjMTM7JiMxMDsgICAgVGhlIHdvcmsgaXMgYmVzdCBkb25lIGluIHNldmVyYWwgc2Vzc2lvbnMsIHBlcmhhcHMgcGVyZm9ybWVkIG92ZXIgYSBmZXcgZGF5cyAob3Igd2Vla3MgYW5kIG1vbnRocyBmb3IgdmVyeSBsYXJnZSYjMTM7JiMxMDsgICAgc3lzdGVtcyksIHdpdGggaXRlcmF0aW9uIGJldHdlZW4gJmx0O2EgY2xhc3M9JnF1b3Q7ZWxlbWVudExpbmsmcXVvdDsmIzEzOyYjMTA7ICAgIGhyZWY9JnF1b3Q7cmVzb3VyY2VzL2FyY2hpdGVjdHVyYWxfYW5hbHlzaXMsezhDQjQ4NDAyLUQ0QzUtNEUxNy1CQjMzLTUwNzMxNUNCMUJCRn0uaHRtbCZxdW90OyYjMTM7JiMxMDsgICAgZ3VpZD0mcXVvdDt7OENCNDg0MDItRDRDNS00RTE3LUJCMzMtNTA3MzE1Q0IxQkJGfSZxdW90OyZndDtBcmNoaXRlY3R1cmFsIEFuYWx5c2lzJmx0Oy9hJmd0OyBhbmQgJmx0O2EgY2xhc3M9JnF1b3Q7ZWxlbWVudExpbmsmcXVvdDsmIzEzOyYjMTA7ICAgIGhyZWY9JnF1b3Q7cmVzb3VyY2VzL3VzZV9jYXNlX2FuYWx5c2lzLHsyODAxNDYxNS1BNjJGLTQ1MkQtQjgyMS0zMEM3Q0FCMEVDNDR9Lmh0bWwmcXVvdDsmIzEzOyYjMTA7ICAgIGd1aWQ9JnF1b3Q7ezI4MDE0NjE1LUE2MkYtNDUyRC1CODIxLTMwQzdDQUIwRUM0NH0mcXVvdDsmZ3Q7VXNlLUNhc2UgQW5hbHlzaXMmbHQ7L2EmZ3Q7LiBQZXJmb3JtIGFuIGluaXRpYWwgcGFzcyBhdCB0aGUgYXJjaGl0ZWN0dXJlIGluICZsdDthJiMxMzsmIzEwOyAgICBjbGFzcz0mcXVvdDtlbGVtZW50TGluayZxdW90OyBocmVmPSZxdW90O3Jlc291cmNlcy9hcmNoaXRlY3R1cmFsX2FuYWx5c2lzLHs4Q0I0ODQwMi1ENEM1LTRFMTctQkIzMy01MDczMTVDQjFCQkZ9Lmh0bWwmcXVvdDsmIzEzOyYjMTA7ICAgIGd1aWQ9JnF1b3Q7ezhDQjQ4NDAyLUQ0QzUtNEUxNy1CQjMzLTUwNzMxNUNCMUJCRn0mcXVvdDsmZ3Q7QXJjaGl0ZWN0dXJhbCBBbmFseXNpcyZsdDsvYSZndDssIHRoZW4gY2hvb3NlIGFyY2hpdGVjdHVyYWxseSBzaWduaWZpY2FudCB1c2UmIzEzOyYjMTA7ICAgIGNhc2VzLCBwZXJmb3JtaW5nICZsdDthIGNsYXNzPSZxdW90O2VsZW1lbnRMaW5rJnF1b3Q7IGhyZWY9JnF1b3Q7cmVzb3VyY2VzL3VzZV9jYXNlX2FuYWx5c2lzLHsyODAxNDYxNS1BNjJGLTQ1MkQtQjgyMS0zMEM3Q0FCMEVDNDR9Lmh0bWwmcXVvdDsmIzEzOyYjMTA7ICAgIGd1aWQ9JnF1b3Q7ezI4MDE0NjE1LUE2MkYtNDUyRC1CODIxLTMwQzdDQUIwRUM0NH0mcXVvdDsmZ3Q7VXNlLUNhc2UgQW5hbHlzaXMmbHQ7L2EmZ3Q7IG9uIGVhY2ggb25lLiBBZnRlciAob3IgYXMpIGVhY2ggdXNlIGNhc2UgaXMmIzEzOyYjMTA7ICAgIGFuYWx5emVkLCB1cGRhdGUgdGhlIGFyY2hpdGVjdHVyZSBhcyBuZWVkZWQgdG8gcmVmbGVjdCBhZGFwdGF0aW9ucyByZXF1aXJlZCB0byBhY2NvbW1vZGF0ZSBuZXcgYmVoYXZpb3Igb2YgdGhlIHN5c3RlbSYjMTM7JiMxMDsgICAgYW5kIHRvIGFkZHJlc3MgcG90ZW50aWFsIGFyY2hpdGVjdHVyYWwgcHJvYmxlbXMgd2hpY2ggYXJlIGlkZW50aWZpZWQuJiMxMzsmIzEwOyZsdDsvcCZndDsmIzEzOyYjMTA7Jmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICBXaGVyZSB0aGUgYXJjaGl0ZWN0dXJlIGFscmVhZHkgZXhpc3RzIChlaXRoZXIgZnJvbSBhIHByaW9yIHByb2plY3Qgb3IgaXRlcmF0aW9uKSwgY2hhbmdlIHJlcXVlc3RzIG1heSBuZWVkIHRvIGJlJiMxMzsmIzEwOyAgICBjcmVhdGVkIHRvIGNoYW5nZSB0aGUgYXJjaGl0ZWN0dXJlIHRvIGFjY291bnQgZm9yIHRoZSBuZXcgYmVoYXZpb3IgdGhlIHN5c3RlbSBtdXN0IHN1cHBvcnQuIFRoZXNlIGNoYW5nZXMgbWF5IGJlIHRvIGFueSYjMTM7JiMxMDsgICAgYXJ0aWZhY3QgaW4gdGhlIHByb2Nlc3MsIGRlcGVuZGluZyBvbiB0aGUgc2NvcGUgb2YgdGhlIGNoYW5nZS4mIzEzOyYjMTA7Jmx0Oy9wJmd0OyYjMTM7JiMxMDsmbHQ7YnIgLyZndDsmIzEzOyYjMTA7Jmx0O2JyIC8mZ3Q7IiBwdXJwb3NlPSImbHQ7cCZndDsmIzEzOyYjMTA7ICAgIFB1cnBvc2U6IFRoaXMgaXRlcnRhaW9uIGlzIGNyZWF0ZWQgZm9yIHR3byBhY3Rpdml0aWVzLiYjMTM7JiMxMDsmbHQ7L3AmZ3Q7JiMxMzsmIzEwOyZsdDtwJmd0OyYjMTM7JiMxMDsgICAgJmFtcDtuYnNwOyZsdDtpbWcgaGVpZ2h0PSZxdW90OzQ3NCZxdW90OyBhbHQ9JnF1b3Q7JnF1b3Q7IHNyYz0mcXVvdDtyZXNvdXJjZXMvcnVwX3BsYXRmb3JtLmpwZyZxdW90OyB3aWR0aD0mcXVvdDs1MDQmcXVvdDsgLyZndDsmIzEzOyYjMTA7Jmx0Oy9wJmd0OyIgYWx0ZXJuYXRpdmVzPSImbHQ7cCZndDsmIzEzOyYjMTA7ICAgIEFsdGVybmF0aXZlczomIzEzOyYjMTA7Jmx0Oy9wJmd0OyYjMTM7JiMxMDsmbHQ7b2wmZ3Q7JiMxMzsmIzEwOyAgICAmbHQ7bGkmZ3Q7JiMxMzsmIzEwOyAgICAgICAgJmx0O2EgaHJlZj0mcXVvdDsuLi9yb2xlcy9yb2xlX0ExLnhtaSZxdW90OyB0YXJnZXQ9JnF1b3Q7X2JsYW5rJnF1b3Q7Jmd0O3JvbGVfQTEueG1pJmx0Oy9hJmd0OyYjMTM7JiMxMDsgICAgJmx0Oy9saSZndDsmIzEzOyYjMTA7ICAgICZsdDtsaSZndDsmIzEzOyYjMTA7ICAgICAgICAmbHQ7YSBocmVmPSZxdW90Oy4uL3Rhc2tzL3Rhc2tfQTIueG1pJnF1b3Q7IHRhcmdldD0mcXVvdDtfYmxhbmsmcXVvdDsmZ3Q7dGFza19BMi54bWkmbHQ7L2EmZ3Q7JiMxMzsmIzEwOyAgICAmbHQ7L2xpJmd0OyYjMTM7JiMxMDsmbHQ7L29sJmd0OyIgaG93dG9TdGFmZj0iJmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICBUaGVzZSBhY3Rpdml0aWVzIGFyZSBiZXN0IGNhcnJpZWQgb3V0IGJ5IGEgc21hbGwgdGVhbSBzdGFmZmVkIGJ5IGNyb3NzLWZ1bmN0aW9uYWwgdGVhbSBtZW1iZXJzLiBJc3N1ZXMgdGhhdCBhcmUmIzEzOyYjMTA7ICAgIHR5cGljYWxseSBhcmNoaXRlY3R1cmFsbHkgc2lnbmlmaWNhbnQgaW5jbHVkZSBwZXJmb3JtYW5jZSwgc2NhbGluZywgcHJvY2VzcyBhbmQgdGhyZWFkIHN5bmNocm9uaXphdGlvbiwgYW5kJiMxMzsmIzEwOyAgICBkaXN0cmlidXRpb24uIFRoZSB0ZWFtIHNob3VsZCBhbHNvIGluY2x1ZGUgbWVtYmVycyB3aXRoIGRvbWFpbiBleHBlcmllbmNlIHdobyBjYW4gaWRlbnRpZnkga2V5IGFic3RyYWN0aW9ucy4gVGhlIHRlYW0mIzEzOyYjMTA7ICAgIHNob3VsZCBhbHNvIGhhdmUgZXhwZXJpZW5jZSB3aXRoIG1vZGVsIG9yZ2FuaXphdGlvbiBhbmQgbGF5ZXJpbmcuIFRoZSB0ZWFtIHdpbGwgbmVlZCB0byBiZSBhYmxlIHRvIHB1bGwgYWxsIHRoZXNlJiMxMzsmIzEwOyAgICBkaXNwYXJhdGUgdGhyZWFkcyBpbnRvIGEgY29oZXNpdmUsIGNvaGVyZW50IChhbGJlaXQgcHJlbGltaW5hcnkpIGFyY2hpdGVjdHVyZS4mIzEzOyYjMTA7Jmx0Oy9wJmd0OyI+Ci08L0FjdGl2aXR5RGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0l0ZXJhdGlvbjEiPgotPC9zdXBlckFjdGl2aXRpZXM+Ci08YnJlYWtkb3duRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxL0FjdGl2aXR5MSI+Ci08L2JyZWFrZG93bkVsZW1lbnRzPgotPGJyZWFrZG93bkVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5Mi9BY3Rpdml0eTIiPgotPC9icmVha2Rvd25FbGVtZW50cz4KLTxyb2FkbWFwcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvcm9hZG1hcF9BMiI+Ci08L3JvYWRtYXBzPgotPHN1cHBvcnRpbmdNYXRlcmlhbHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3N1cHBvcnRpbmdfbWF0ZXJpYWxfQTIiPgotPC9zdXBwb3J0aW5nTWF0ZXJpYWxzPgotPGNoZWNrbGlzdHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2NoZWNrbGlzdF9BMiI+Ci08L2NoZWNrbGlzdHM+Ci08Y29uY2VwdHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3doaXRlcGFwZXJfQTIiPgotPC9jb25jZXB0cz4KLTxjb25jZXB0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvY29uY2VwdF9BMiI+Ci08L2NvbmNlcHRzPgotPGV4YW1wbGVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9leGFtcGxlX0EyIj4KLTwvZXhhbXBsZXM+Ci08Z3VpZGVsaW5lcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvZ3VpZGVsaW5lX0EyIj4KLTwvZ3VpZGVsaW5lcz4KLTxyZXVzYWJsZUFzc2V0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvcmV1c2FibGVfYXNzZXRfQTIiPgotPC9yZXVzYWJsZUFzc2V0cz4KLTwvSXRlcmF0aW9uPgotPERpYWdyYW0gbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IkFjdGl2aXR5IERldGFpbCI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xIj4KLTwvZ3JhcGhFbGVtZW50PgotPGVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEiPgotPC9lbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9EaWFncmFtPgotPC9Qcm9jZXNzUGFja2FnZT4KLTxQaGFzZSBuYW1lPSJQaGFzZTEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iUGhhc2UxIiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzUmVwZWF0YWJsZT0iZmFsc2UiIGlzT25nb2luZz0iZmFsc2UiIGlzRXZlbnREcml2ZW49ImZhbHNlIiB2YXJpYWJpbGl0eVR5cGU9Im5hIiBpc0VuYWN0YWJsZT0iZmFsc2UiPgotPEFjdGl2aXR5RGVzY3JpcHRpb24gbmFtZT0iUGhhc2UxLF9EYWtRY0R6aUVkcTV5c0ZPTnIxQkdRIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiBwdXJwb3NlPSIiIGFsdGVybmF0aXZlcz0iIiBob3d0b1N0YWZmPSIiPgotPC9BY3Rpdml0eURlc2NyaXB0aW9uPgotPHN1cGVyQWN0aXZpdGllcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvUGhhc2UxIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPGJyZWFrZG93bkVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0l0ZXJhdGlvbjEiPgotPC9icmVha2Rvd25FbGVtZW50cz4KLTwvUGhhc2U+Ci08RGlhZ3JhbSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iQWN0aXZpdHkgRGV0YWlsIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxIj4KLTwvZWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvRGlhZ3JhbT4KLTwvUHJvY2Vzc1BhY2thZ2U+Ci08RGlhZ3JhbSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iQWN0aXZpdHkgRGV0YWlsIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMiPgotPC9ncmFwaEVsZW1lbnQ+Ci08ZWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cyI+Ci08L2VsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0RpYWdyYW0+Ci08Q2FwYWJpbGl0eVBhdHRlcm4gbmFtZT0iQ1AxIHdpdGggYWxsIGVsZW1lbnRzIiBicmllZkRlc2NyaXB0aW9uPSJCcmllZjpDUDEgd2l0aCBhbGwgZWxlbWVudHMiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IkNQMSB3aXRoIGFsbCBlbGVtZW50cyIgcHJlZml4PSIiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1JlcGVhdGFibGU9ImZhbHNlIiBpc09uZ29pbmc9ImZhbHNlIiBpc0V2ZW50RHJpdmVuPSJmYWxzZSIgdmFyaWFiaWxpdHlUeXBlPSJuYSIgaXNFbmFjdGFibGU9ImZhbHNlIj4KLTxQcm9jZXNzRGVzY3JpcHRpb24gbmFtZT0iQ1AxIHdpdGggYWxsIGVsZW1lbnRzLF80c0N0c1R6Z0VkcTV5c0ZPTnIxQkdRIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiZsdDtwJmd0OyYjMTM7JiMxMDsgICAgVGhlIHN1YmNhdGVnb3JpZXMgb2YgcHJvY2VzcyBhcmUgZGVsaXZlcnkgcHJvY2VzcyBhbmQgY2FwYWJpbGl0eSBwYXR0ZXJuLiZhbXA7bmJzcDsgQSBkZWxpdmVyeSBwcm9jZXNzIGRlZmluZXMgYSBjb21wbGV0ZSYjMTM7JiMxMDsgICAgb3IgZW5kLXRvLWVuZCBwcm9jZXNzLiZhbXA7bmJzcDsgQSBjYXBhYmlsaXR5IHBhdHRlcm4gaXMgYSBwcm9jZXNzIGZyYWdtZW50IHVzZWQgdG8gY29tcG9zZSBhIGRlbGl2ZXJ5IHByb2Nlc3MuJiMxMzsmIzEwOyZsdDsvcCZndDsmIzEzOyYjMTA7Jmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICAmYW1wO25ic3A7JiMxMzsmIzEwOyZsdDsvcCZndDsiIGtleUNvbnNpZGVyYXRpb25zPSJUaGlzIGNhcGFiaWxpdHkgcGF0dGVybiBjYW4gYmUgdXNlZCB0byBxdWlja2x5IGNvbnN0cnVjdCBhbiBJbmNlcHRpb24gcGhhc2UgaXRlcmF0aW9uIGluIGEgZGVsaXZlcnkgcHJvY2Vzcy4mYW1wO25ic3A7IENvcHkgb3ImIzEzOyYjMTA7ZXh0ZW5kIHRoZSBwYXR0ZXJuJmFtcDtuYnNwO3JlcGVhdGVkbHkgdG8gY3JlYXRlIGFzIG1hbnkgaXRlcmF0aW9ucyBhcyBuZWNlc3NhcnkgZm9yIHRoZSBwYXJ0aWN1bGFyIGRlbGl2ZXJ5IHByb2Nlc3MuIiB1c2FnZUd1aWRhbmNlPSIiIHB1cnBvc2U9IlRoaXMgY2FwYWJpbGl0eSBwYXR0ZXJuIGNhbiBiZSB1c2VkIHRvIHF1aWNrbHkgY29uc3RydWN0IGFuIEluY2VwdGlvbiBwaGFzZSBpdGVyYXRpb24gaW4gYSBkZWxpdmVyeSBwcm9jZXNzLiZhbXA7bmJzcDsgQ29weSBvciYjMTM7JiMxMDtleHRlbmQgdGhlIHBhdHRlcm4mYW1wO25ic3A7cmVwZWF0ZWRseSB0byBjcmVhdGUgYXMgbWFueSBpdGVyYXRpb25zIGFzIG5lY2Vzc2FyeSBmb3IgdGhlIHBhcnRpY3VsYXIgZGVsaXZlcnkgcHJvY2Vzcy4gJmx0O2JyIC8mZ3Q7JiMxMzsmIzEwOyZsdDticiAvJmd0OyIgYWx0ZXJuYXRpdmVzPSImbHQ7cCZndDsmIzEzOyYjMTA7ICAgIFRvIGV4cGxhaW4gdGhlIHdvcmsgaW52b2x2ZWQgaW4gdGhlIEFuYWx5c2lzIGFuZCBEZXNpZ24gZGlzY2lwbGluZSwgdGhlIGFjdGl2aXRpZXMgYW5kIHdvcmsgcHJvZHVjdHMgYXJlIG9yZ2FuaXplZCBpbnRvJiMxMzsmIzEwOyAgICBhIGNhcGFiaWxpdHkgcGF0dGVybiBmb3IgdGhlIGRpc2NpcGxpbmUuJiMxMzsmIzEwOyZsdDsvcCZndDsmIzEzOyYjMTA7Jmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICBJbiB0aGUgSW5jZXB0aW9uIFBoYXNlLCBhbmFseXNpcyBhbmQgZGVzaWduIGlzIGNvbmNlcm5lZCB3aXRoIGVzdGFibGlzaGluZyB3aGV0aGVyIHRoZSBzeXN0ZW0gYXMgZW52aXNpb25lZCBpcyYjMTM7JiMxMDsgICAgZmVhc2libGUsIGFuZCB3aXRoIGFzc2Vzc2luZyBwb3RlbnRpYWwgdGVjaG5vbG9naWVzIGZvciB0aGUgc29sdXRpb24gKGluICZsdDthIGhyZWY9JnF1b3Q7cmVzb3VyY2VzL3dmc19hcmNoc3luLmh0bSZxdW90OyZndDsmbHQ7Zm9udCYjMTM7JiMxMDsgICAgY29sb3I9JnF1b3Q7IzAwMDBmZiZxdW90OyZndDtQZXJmb3JtIEFyY2hpdGVjdHVyYWwgU3ludGhlc2lzJmx0Oy9mb250Jmd0OyZsdDsvYSZndDspLiBJZiBpdCBpcyBmZWx0IHRoYXQgbGl0dGxlIHJpc2sgYXR0YWNoZXMgdG8gdGhlIGRldmVsb3BtZW50JiMxMzsmIzEwOyAgICAoYmVjYXVzZSwgZm9yIGV4YW1wbGUsIHRoZSBkb21haW4gaXMgd2VsbCB1bmRlcnN0b29kLCB0aGUgc3lzdGVtIGlzIG5vdCBub3ZlbCwgYW5kIHNvIG9uKSB0aGVuIHRoaXMgd29ya2Zsb3cgZGV0YWlsIG1heSYjMTM7JiMxMDsgICAgYmUgb21pdHRlZC4mIzEzOyYjMTA7Jmx0Oy9wJmd0OyYjMTM7JiMxMDsmbHQ7cCZndDsmIzEzOyYjMTA7ICAgIFRoZSBlYXJseSBFbGFib3JhdGlvbiBQaGFzZSBmb2N1c2VzIG9uIGNyZWF0aW5nIGFuIGluaXRpYWwgYXJjaGl0ZWN0dXJlIGZvciB0aGUgc3lzdGVtICggJmx0O2EmIzEzOyYjMTA7ICAgIGhyZWY9JnF1b3Q7cmVzb3VyY2VzL3dmc19hbmQxLmh0bSZxdW90OyZndDsmbHQ7Zm9udCBjb2xvcj0mcXVvdDsjMDAwMGZmJnF1b3Q7Jmd0O0RlZmluZSBhIENhbmRpZGF0ZSBBcmNoaXRlY3R1cmUmbHQ7L2ZvbnQmZ3Q7Jmx0Oy9hJmd0OykgdG8gcHJvdmlkZSBhIHN0YXJ0aW5nJiMxMzsmIzEwOyAgICBwb2ludCBmb3IgdGhlIG1haW4gYW5hbHlzaXMgd29yay4gSWYgdGhlIGFyY2hpdGVjdHVyZSBhbHJlYWR5IGV4aXN0cyAoZWl0aGVyIGJlY2F1c2UgaXQgd2FzIHByb2R1Y2VkIGluIHByZXZpb3VzJiMxMzsmIzEwOyAgICBpdGVyYXRpb25zLCBpbiBwcmV2aW91cyBwcm9qZWN0cywgb3IgaXMgb2J0YWluZWQgZnJvbSBhbiBhcHBsaWNhdGlvbiBmcmFtZXdvcmspLCB0aGUgZm9jdXMgb2YgdGhlIHdvcmsgY2hhbmdlcyB0byYjMTM7JiMxMDsgICAgcmVmaW5pbmcgdGhlIGFyY2hpdGVjdHVyZSAoICZsdDthIGhyZWY9JnF1b3Q7cmVzb3VyY2VzL3dmc19hbmQyLmh0bSZxdW90OyZndDsmbHQ7Zm9udCBjb2xvcj0mcXVvdDsjMDAwMGZmJnF1b3Q7Jmd0O1JlZmluZSB0aGUgQXJjaGl0ZWN0dXJlJmx0Oy9mb250Jmd0OyZsdDsvYSZndDspJiMxMzsmIzEwOyAgICBhbmQgYW5hbHl6aW5nIGJlaGF2aW9yIGFuZCBjcmVhdGluZyBhbiBpbml0aWFsIHNldCBvZiBlbGVtZW50cyB3aGljaCBwcm92aWRlIHRoZSBhcHByb3ByaWF0ZSBiZWhhdmlvciAoICZsdDthJiMxMzsmIzEwOyAgICBocmVmPSZxdW90O3Jlc291cmNlcy93ZnNfYW5kMy5odG0mcXVvdDsmZ3Q7Jmx0O2ZvbnQgY29sb3I9JnF1b3Q7IzAwMDBmZiZxdW90OyZndDtBbmFseXplIEJlaGF2aW9yJmx0Oy9mb250Jmd0OyZsdDsvYSZndDspLiYjMTM7JiMxMDsmbHQ7L3AmZ3Q7JiMxMzsmIzEwOyZsdDtwJmd0OyYjMTM7JiMxMDsgICAgQWZ0ZXIgdGhlIGluaXRpYWwgZWxlbWVudHMgYXJlIGlkZW50aWZpZWQsIHRoZXkgYXJlIGZ1cnRoZXIgcmVmaW5lZC4gJmx0O2EgaHJlZj0mcXVvdDtyZXNvdXJjZXMvd2ZzX2FuZDQuaHRtJnF1b3Q7Jmd0OyZsdDtmb250JiMxMzsmIzEwOyAgICBjb2xvcj0mcXVvdDsjMDAwMGZmJnF1b3Q7Jmd0O0Rlc2lnbiBDb21wb25lbnRzJmx0Oy9mb250Jmd0OyZsdDsvYSZndDsgcHJvZHVjZSBhIHNldCBvZiBjb21wb25lbnRzIHdoaWNoIHByb3ZpZGUgdGhlIGFwcHJvcHJpYXRlIGJlaGF2aW9yIHRvJiMxMzsmIzEwOyAgICBzYXRpc2Z5IHRoZSByZXF1aXJlbWVudHMgb24gdGhlIHN5c3RlbS4gSWYgdGhlIHN5c3RlbSBpbmNsdWRlcyBhIGRhdGFiYXNlLCB0aGVuICZsdDthIGhyZWY9JnF1b3Q7cmVzb3VyY2VzL3dmc19hbmQ3Lmh0bSZxdW90OyZndDsmbHQ7Zm9udCYjMTM7JiMxMDsgICAgY29sb3I9JnF1b3Q7IzAwMDBmZiZxdW90OyZndDtEZXNpZ24gdGhlIERhdGFiYXNlJmx0Oy9mb250Jmd0OyZsdDsvYSZndDsgb2NjdXJzIGluIHBhcmFsbGVsLiBUaGUgcmVzdWx0IGlzIGFuIGluaXRpYWwgc2V0IG9mIGNvbXBvbmVudHMgd2hpY2ggYXJlJiMxMzsmIzEwOyAgICBmdXJ0aGVyIHJlZmluZWQgaW4gJmx0O2EgaHJlZj0mcXVvdDtyZXNvdXJjZXMvd2ZkX2ltcC5odG0mcXVvdDsmZ3Q7Jmx0O2ZvbnQgY29sb3I9JnF1b3Q7IzAwMDBmZiZxdW90OyZndDtJbXBsZW1lbnRhdGlvbiZsdDsvZm9udCZndDsmbHQ7L2EmZ3Q7LiZsdDticiAvJmd0OyYjMTM7JiMxMDsmbHQ7L3AmZ3Q7JiMxMzsmIzEwOyZhbXA7bmJzcDsmbHQ7YnIgLyZndDsmIzEzOyYjMTA7Jmx0O2JyIC8mZ3Q7IiBob3d0b1N0YWZmPSImbHQ7cCZndDsmIzEzOyYjMTA7ICAgIFRvIGV4cGxhaW4gdGhlIHdvcmsgaW52b2x2ZWQgaW4gdGhlIEFuYWx5c2lzIGFuZCBEZXNpZ24gZGlzY2lwbGluZSwgdGhlIGFjdGl2aXRpZXMgYW5kIHdvcmsgcHJvZHVjdHMgYXJlIG9yZ2FuaXplZCBpbnRvJiMxMzsmIzEwOyAgICBhIGNhcGFiaWxpdHkgcGF0dGVybiBmb3IgdGhlIGRpc2NpcGxpbmUuJiMxMzsmIzEwOyZsdDsvcCZndDsmIzEzOyYjMTA7Jmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICBJbiB0aGUgSW5jZXB0aW9uIFBoYXNlLCBhbmFseXNpcyBhbmQgZGVzaWduIGlzIGNvbmNlcm5lZCB3aXRoIGVzdGFibGlzaGluZyB3aGV0aGVyIHRoZSBzeXN0ZW0gYXMgZW52aXNpb25lZCBpcyYjMTM7JiMxMDsgICAgZmVhc2libGUsIGFuZCB3aXRoIGFzc2Vzc2luZyBwb3RlbnRpYWwgdGVjaG5vbG9naWVzIGZvciB0aGUgc29sdXRpb24gKGluICZsdDthIGhyZWY9JnF1b3Q7cmVzb3VyY2VzL3dmc19hcmNoc3luLmh0bSZxdW90OyZndDsmbHQ7Zm9udCYjMTM7JiMxMDsgICAgY29sb3I9JnF1b3Q7IzAwMDBmZiZxdW90OyZndDtQZXJmb3JtIEFyY2hpdGVjdHVyYWwgU3ludGhlc2lzJmx0Oy9mb250Jmd0OyZsdDsvYSZndDspLiBJZiBpdCBpcyBmZWx0IHRoYXQgbGl0dGxlIHJpc2sgYXR0YWNoZXMgdG8gdGhlIGRldmVsb3BtZW50JiMxMzsmIzEwOyAgICAoYmVjYXVzZSwgZm9yIGV4YW1wbGUsIHRoZSBkb21haW4gaXMgd2VsbCB1bmRlcnN0b29kLCB0aGUgc3lzdGVtIGlzIG5vdCBub3ZlbCwgYW5kIHNvIG9uKSB0aGVuIHRoaXMgd29ya2Zsb3cgZGV0YWlsIG1heSYjMTM7JiMxMDsgICAgYmUgb21pdHRlZC4mIzEzOyYjMTA7Jmx0Oy9wJmd0OyYjMTM7JiMxMDsmbHQ7cCZndDsmIzEzOyYjMTA7ICAgIFRoZSBlYXJseSBFbGFib3JhdGlvbiBQaGFzZSBmb2N1c2VzIG9uIGNyZWF0aW5nIGFuIGluaXRpYWwgYXJjaGl0ZWN0dXJlIGZvciB0aGUgc3lzdGVtICggJmx0O2EmIzEzOyYjMTA7ICAgIGhyZWY9JnF1b3Q7cmVzb3VyY2VzL3dmc19hbmQxLmh0bSZxdW90OyZndDsmbHQ7Zm9udCBjb2xvcj0mcXVvdDsjMDAwMGZmJnF1b3Q7Jmd0O0RlZmluZSBhIENhbmRpZGF0ZSBBcmNoaXRlY3R1cmUmbHQ7L2ZvbnQmZ3Q7Jmx0Oy9hJmd0OykgdG8gcHJvdmlkZSBhIHN0YXJ0aW5nJiMxMzsmIzEwOyAgICBwb2ludCBmb3IgdGhlIG1haW4gYW5hbHlzaXMgd29yay4gSWYgdGhlIGFyY2hpdGVjdHVyZSBhbHJlYWR5IGV4aXN0cyAoZWl0aGVyIGJlY2F1c2UgaXQgd2FzIHByb2R1Y2VkIGluIHByZXZpb3VzJiMxMzsmIzEwOyAgICBpdGVyYXRpb25zLCBpbiBwcmV2aW91cyBwcm9qZWN0cywgb3IgaXMgb2J0YWluZWQgZnJvbSBhbiBhcHBsaWNhdGlvbiBmcmFtZXdvcmspLCB0aGUgZm9jdXMgb2YgdGhlIHdvcmsgY2hhbmdlcyB0byYjMTM7JiMxMDsgICAgcmVmaW5pbmcgdGhlIGFyY2hpdGVjdHVyZSAoICZsdDthIGhyZWY9JnF1b3Q7cmVzb3VyY2VzL3dmc19hbmQyLmh0bSZxdW90OyZndDsmbHQ7Zm9udCBjb2xvcj0mcXVvdDsjMDAwMGZmJnF1b3Q7Jmd0O1JlZmluZSB0aGUgQXJjaGl0ZWN0dXJlJmx0Oy9mb250Jmd0OyZsdDsvYSZndDspJiMxMzsmIzEwOyAgICBhbmQgYW5hbHl6aW5nIGJlaGF2aW9yIGFuZCBjcmVhdGluZyBhbiBpbml0aWFsIHNldCBvZiBlbGVtZW50cyB3aGljaCBwcm92aWRlIHRoZSBhcHByb3ByaWF0ZSBiZWhhdmlvciAoICZsdDthJiMxMzsmIzEwOyAgICBocmVmPSZxdW90O3Jlc291cmNlcy93ZnNfYW5kMy5odG0mcXVvdDsmZ3Q7Jmx0O2ZvbnQgY29sb3I9JnF1b3Q7IzAwMDBmZiZxdW90OyZndDtBbmFseXplIEJlaGF2aW9yJmx0Oy9mb250Jmd0OyZsdDsvYSZndDspLiYjMTM7JiMxMDsmbHQ7L3AmZ3Q7JiMxMzsmIzEwOyZsdDtwJmd0OyYjMTM7JiMxMDsgICAgQWZ0ZXIgdGhlIGluaXRpYWwgZWxlbWVudHMgYXJlIGlkZW50aWZpZWQsIHRoZXkgYXJlIGZ1cnRoZXIgcmVmaW5lZC4gJmx0O2EgaHJlZj0mcXVvdDtyZXNvdXJjZXMvd2ZzX2FuZDQuaHRtJnF1b3Q7Jmd0OyZsdDtmb250JiMxMzsmIzEwOyAgICBjb2xvcj0mcXVvdDsjMDAwMGZmJnF1b3Q7Jmd0O0Rlc2lnbiBDb21wb25lbnRzJmx0Oy9mb250Jmd0OyZsdDsvYSZndDsgcHJvZHVjZSBhIHNldCBvZiBjb21wb25lbnRzIHdoaWNoIHByb3ZpZGUgdGhlIGFwcHJvcHJpYXRlIGJlaGF2aW9yIHRvJiMxMzsmIzEwOyAgICBzYXRpc2Z5IHRoZSByZXF1aXJlbWVudHMgb24gdGhlIHN5c3RlbS4gSWYgdGhlIHN5c3RlbSBpbmNsdWRlcyBhIGRhdGFiYXNlLCB0aGVuICZsdDthIGhyZWY9JnF1b3Q7cmVzb3VyY2VzL3dmc19hbmQ3Lmh0bSZxdW90OyZndDsmbHQ7Zm9udCYjMTM7JiMxMDsgICAgY29sb3I9JnF1b3Q7IzAwMDBmZiZxdW90OyZndDtEZXNpZ24gdGhlIERhdGFiYXNlJmx0Oy9mb250Jmd0OyZsdDsvYSZndDsgb2NjdXJzIGluIHBhcmFsbGVsLiBUaGUgcmVzdWx0IGlzIGFuIGluaXRpYWwgc2V0IG9mIGNvbXBvbmVudHMgd2hpY2ggYXJlJiMxMzsmIzEwOyAgICBmdXJ0aGVyIHJlZmluZWQgaW4gJmx0O2EgaHJlZj0mcXVvdDtyZXNvdXJjZXMvd2ZkX2ltcC5odG0mcXVvdDsmZ3Q7Jmx0O2ZvbnQgY29sb3I9JnF1b3Q7IzAwMDBmZiZxdW90OyZndDtJbXBsZW1lbnRhdGlvbiZsdDsvZm9udCZndDsmbHQ7L2EmZ3Q7LiZsdDticiAvJmd0OyYjMTM7JiMxMDsmbHQ7L3AmZ3Q7JiMxMzsmIzEwOyZhbXA7bmJzcDsmbHQ7YnIgLyZndDsmIzEzOyYjMTA7Jmx0O2JyIC8mZ3Q7IiBleHRlcm5hbElkPSJFWHRlcm5hbCBJRDpDUDEgd2l0aCBhbGwgZWxlbWVudHMiIHNjb3BlPSImbHQ7cCZndDsmIzEzOyYjMTA7ICAgIFRvIGV4cGxhaW4gdGhlIHdvcmsgaW52b2x2ZWQgaW4gdGhlIEFuYWx5c2lzIGFuZCBEZXNpZ24gZGlzY2lwbGluZSwgdGhlIGFjdGl2aXRpZXMgYW5kIHdvcmsgcHJvZHVjdHMgYXJlIG9yZ2FuaXplZCBpbnRvJiMxMzsmIzEwOyAgICBhIGNhcGFiaWxpdHkgcGF0dGVybiBmb3IgdGhlIGRpc2NpcGxpbmUuJiMxMzsmIzEwOyZsdDsvcCZndDsmIzEzOyYjMTA7Jmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICBJbiB0aGUgSW5jZXB0aW9uIFBoYXNlLCBhbmFseXNpcyBhbmQgZGVzaWduIGlzIGNvbmNlcm5lZCB3aXRoIGVzdGFibGlzaGluZyB3aGV0aGVyIHRoZSBzeXN0ZW0gYXMgZW52aXNpb25lZCBpcyYjMTM7JiMxMDsgICAgZmVhc2libGUsIGFuZCB3aXRoIGFzc2Vzc2luZyBwb3RlbnRpYWwgdGVjaG5vbG9naWVzIGZvciB0aGUgc29sdXRpb24gKGluICZsdDthIGhyZWY9JnF1b3Q7cmVzb3VyY2VzL3dmc19hcmNoc3luLmh0bSZxdW90OyZndDsmbHQ7Zm9udCYjMTM7JiMxMDsgICAgY29sb3I9JnF1b3Q7IzAwMDBmZiZxdW90OyZndDtQZXJmb3JtIEFyY2hpdGVjdHVyYWwgU3ludGhlc2lzJmx0Oy9mb250Jmd0OyZsdDsvYSZndDspLiBJZiBpdCBpcyBmZWx0IHRoYXQgbGl0dGxlIHJpc2sgYXR0YWNoZXMgdG8gdGhlIGRldmVsb3BtZW50JiMxMzsmIzEwOyAgICAoYmVjYXVzZSwgZm9yIGV4YW1wbGUsIHRoZSBkb21haW4gaXMgd2VsbCB1bmRlcnN0b29kLCB0aGUgc3lzdGVtIGlzIG5vdCBub3ZlbCwgYW5kIHNvIG9uKSB0aGVuIHRoaXMgd29ya2Zsb3cgZGV0YWlsIG1heSYjMTM7JiMxMDsgICAgYmUgb21pdHRlZC4mIzEzOyYjMTA7Jmx0Oy9wJmd0OyYjMTM7JiMxMDsmbHQ7cCZndDsmIzEzOyYjMTA7ICAgIFRoZSBlYXJseSBFbGFib3JhdGlvbiBQaGFzZSBmb2N1c2VzIG9uIGNyZWF0aW5nIGFuIGluaXRpYWwgYXJjaGl0ZWN0dXJlIGZvciB0aGUgc3lzdGVtICggJmx0O2EmIzEzOyYjMTA7ICAgIGhyZWY9JnF1b3Q7cmVzb3VyY2VzL3dmc19hbmQxLmh0bSZxdW90OyZndDsmbHQ7Zm9udCBjb2xvcj0mcXVvdDsjMDAwMGZmJnF1b3Q7Jmd0O0RlZmluZSBhIENhbmRpZGF0ZSBBcmNoaXRlY3R1cmUmbHQ7L2ZvbnQmZ3Q7Jmx0Oy9hJmd0OykgdG8gcHJvdmlkZSBhIHN0YXJ0aW5nJiMxMzsmIzEwOyAgICBwb2ludCBmb3IgdGhlIG1haW4gYW5hbHlzaXMgd29yay4gSWYgdGhlIGFyY2hpdGVjdHVyZSBhbHJlYWR5IGV4aXN0cyAoZWl0aGVyIGJlY2F1c2UgaXQgd2FzIHByb2R1Y2VkIGluIHByZXZpb3VzJiMxMzsmIzEwOyAgICBpdGVyYXRpb25zLCBpbiBwcmV2aW91cyBwcm9qZWN0cywgb3IgaXMgb2J0YWluZWQgZnJvbSBhbiBhcHBsaWNhdGlvbiBmcmFtZXdvcmspLCB0aGUgZm9jdXMgb2YgdGhlIHdvcmsgY2hhbmdlcyB0byYjMTM7JiMxMDsgICAgcmVmaW5pbmcgdGhlIGFyY2hpdGVjdHVyZSAoICZsdDthIGhyZWY9JnF1b3Q7cmVzb3VyY2VzL3dmc19hbmQyLmh0bSZxdW90OyZndDsmbHQ7Zm9udCBjb2xvcj0mcXVvdDsjMDAwMGZmJnF1b3Q7Jmd0O1JlZmluZSB0aGUgQXJjaGl0ZWN0dXJlJmx0Oy9mb250Jmd0OyZsdDsvYSZndDspJiMxMzsmIzEwOyAgICBhbmQgYW5hbHl6aW5nIGJlaGF2aW9yIGFuZCBjcmVhdGluZyBhbiBpbml0aWFsIHNldCBvZiBlbGVtZW50cyB3aGljaCBwcm92aWRlIHRoZSBhcHByb3ByaWF0ZSBiZWhhdmlvciAoICZsdDthJiMxMzsmIzEwOyAgICBocmVmPSZxdW90O3Jlc291cmNlcy93ZnNfYW5kMy5odG0mcXVvdDsmZ3Q7Jmx0O2ZvbnQgY29sb3I9JnF1b3Q7IzAwMDBmZiZxdW90OyZndDtBbmFseXplIEJlaGF2aW9yJmx0Oy9mb250Jmd0OyZsdDsvYSZndDspLiYjMTM7JiMxMDsmbHQ7L3AmZ3Q7JiMxMzsmIzEwOyZsdDtwJmd0OyYjMTM7JiMxMDsgICAgQWZ0ZXIgdGhlIGluaXRpYWwgZWxlbWVudHMgYXJlIGlkZW50aWZpZWQsIHRoZXkgYXJlIGZ1cnRoZXIgcmVmaW5lZC4gJmx0O2EgaHJlZj0mcXVvdDtyZXNvdXJjZXMvd2ZzX2FuZDQuaHRtJnF1b3Q7Jmd0OyZsdDtmb250JiMxMzsmIzEwOyAgICBjb2xvcj0mcXVvdDsjMDAwMGZmJnF1b3Q7Jmd0O0Rlc2lnbiBDb21wb25lbnRzJmx0Oy9mb250Jmd0OyZsdDsvYSZndDsgcHJvZHVjZSBhIHNldCBvZiBjb21wb25lbnRzIHdoaWNoIHByb3ZpZGUgdGhlIGFwcHJvcHJpYXRlIGJlaGF2aW9yIHRvJiMxMzsmIzEwOyAgICBzYXRpc2Z5IHRoZSByZXF1aXJlbWVudHMgb24gdGhlIHN5c3RlbS4gSWYgdGhlIHN5c3RlbSBpbmNsdWRlcyBhIGRhdGFiYXNlLCB0aGVuICZsdDthIGhyZWY9JnF1b3Q7cmVzb3VyY2VzL3dmc19hbmQ3Lmh0bSZxdW90OyZndDsmbHQ7Zm9udCYjMTM7JiMxMDsgICAgY29sb3I9JnF1b3Q7IzAwMDBmZiZxdW90OyZndDtEZXNpZ24gdGhlIERhdGFiYXNlJmx0Oy9mb250Jmd0OyZsdDsvYSZndDsgb2NjdXJzIGluIHBhcmFsbGVsLiBUaGUgcmVzdWx0IGlzIGFuIGluaXRpYWwgc2V0IG9mIGNvbXBvbmVudHMgd2hpY2ggYXJlJiMxMzsmIzEwOyAgICBmdXJ0aGVyIHJlZmluZWQgaW4gJmx0O2EgaHJlZj0mcXVvdDtyZXNvdXJjZXMvd2ZkX2ltcC5odG0mcXVvdDsmZ3Q7Jmx0O2ZvbnQgY29sb3I9JnF1b3Q7IzAwMDBmZiZxdW90OyZndDtJbXBsZW1lbnRhdGlvbiZsdDsvZm9udCZndDsmbHQ7L2EmZ3Q7LiZsdDticiAvJmd0OyYjMTM7JiMxMDsmbHQ7L3AmZ3Q7JiMxMzsmIzEwOyZhbXA7bmJzcDsmbHQ7YnIgLyZndDsmIzEzOyYjMTA7Jmx0O2JyIC8mZ3Q7IiB1c2FnZU5vdGVzPSImbHQ7cCZndDsmIzEzOyYjMTA7ICAgIFRoZSBzdWJjYXRlZ29yaWVzIG9mIHByb2Nlc3MgYXJlIGRlbGl2ZXJ5IHByb2Nlc3MgYW5kIGNhcGFiaWxpdHkgcGF0dGVybi4mYW1wO25ic3A7IEEgZGVsaXZlcnkgcHJvY2VzcyBkZWZpbmVzIGEgY29tcGxldGUmIzEzOyYjMTA7ICAgIG9yIGVuZC10by1lbmQgcHJvY2Vzcy4mYW1wO25ic3A7IEEgY2FwYWJpbGl0eSBwYXR0ZXJuIGlzIGEgcHJvY2VzcyBmcmFnbWVudCB1c2VkIHRvIGNvbXBvc2UgYSBkZWxpdmVyeSBwcm9jZXNzLiYjMTM7JiMxMDsmbHQ7L3AmZ3Q7Ij4KLTwvUHJvY2Vzc0Rlc2NyaXB0aW9uPgotPGJyZWFrZG93bkVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9QaGFzZTEiPgotPC9icmVha2Rvd25FbGVtZW50cz4KLTxkZWZhdWx0Q29udGV4dCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9DUDEgd2l0aCBhbGwgZWxlbWVudHMiPgotPC9kZWZhdWx0Q29udGV4dD4KLTx2YWxpZENvbnRleHQgcGF0aD0iQ29uZmlnIEEiPgotPC92YWxpZENvbnRleHQ+Ci08L0NhcGFiaWxpdHlQYXR0ZXJuPgotPC9Qcm9jZXNzQ29tcG9uZW50PgotPFByb2Nlc3NDb21wb25lbnQgbmFtZT0iQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgZ2xvYmFsPSJmYWxzZSIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiPgotPHBhcmVudFBhY2thZ2UgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cyI+Ci08L3BhcmVudFBhY2thZ2U+Ci08UHJvY2Vzc1BhY2thZ2UgbmFtZT0iYWN0aXZpdHlfZm9yX3ZhcmlhYmlsaXR5X2VsZW1lbnRzIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGdsb2JhbD0iZmFsc2UiPgotPHBhcmVudFBhY2thZ2UgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9hY3Rpdml0eV9mb3JfdmFyaWFiaWxpdHlfZWxlbWVudHMiPgotPC9wYXJlbnRQYWNrYWdlPgotPEFjdGl2aXR5IG5hbWU9ImFjdGl2aXR5X2Zvcl92YXJpYWJpbGl0eV9lbGVtZW50cyIgYnJpZWZEZXNjcmlwdGlvbj0iYnJpZWY6IEFjdGl2aXR5IGZvciB2YXJpYWJpbGl0eSBlbGVtZW50cyIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iQWN0aXZpdHkgZm9yIHZhcmlhYmlsaXR5IGVsZW1lbnRzIiBwcmVmaXg9IlByZWZpeCIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzUmVwZWF0YWJsZT0iZmFsc2UiIGlzT25nb2luZz0iZmFsc2UiIGlzRXZlbnREcml2ZW49ImZhbHNlIiB2YXJpYWJpbGl0eVR5cGU9Im5hIiBpc0VuYWN0YWJsZT0iZmFsc2UiPgotPEFjdGl2aXR5RGVzY3JpcHRpb24gbmFtZT0iLF9sRGhsOEVERkVkcU85TTNmdWtZQV9BIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249Im1haW46IEFjdGl2aXR5IGZvciB2YXJpYWJpbGl0eSBlbGVtZW50cyIga2V5Q29uc2lkZXJhdGlvbnM9ImtleTogQWN0aXZpdHkgZm9yIHZhcmlhYmlsaXR5IGVsZW1lbnRzIiB1c2FnZUd1aWRhbmNlPSJ1c2FnZTogQWN0aXZpdHkgZm9yIHZhcmlhYmlsaXR5IGVsZW1lbnRzIiBwdXJwb3NlPSJwdXJwb3NlOiBBY3Rpdml0eSBmb3IgdmFyaWFiaWxpdHkgZWxlbWVudHMiIGFsdGVybmF0aXZlcz0iYWx0ZXJuYXRpdmVzOiBBY3Rpdml0eSBmb3IgdmFyaWFiaWxpdHkgZWxlbWVudHMiIGhvd3RvU3RhZmY9ImhvdyB0byBzdGFmZjogQWN0aXZpdHkgZm9yIHZhcmlhYmlsaXR5IGVsZW1lbnRzIj4KLTwvQWN0aXZpdHlEZXNjcmlwdGlvbj4KLTxzdXBlckFjdGl2aXRpZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9hY3Rpdml0eV9mb3JfdmFyaWFiaWxpdHlfZWxlbWVudHMvYWN0aXZpdHlfZm9yX3ZhcmlhYmlsaXR5X2VsZW1lbnRzIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPGJyZWFrZG93bkVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvYWN0aXZpdHlfZm9yX3ZhcmlhYmlsaXR5X2VsZW1lbnRzL3Rhc2tfQTMiPgotPC9icmVha2Rvd25FbGVtZW50cz4KLTxicmVha2Rvd25FbGVtZW50cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FjdGl2aXR5X2Zvcl92YXJpYWJpbGl0eV9lbGVtZW50cy9yb2xlX0EzIj4KLTwvYnJlYWtkb3duRWxlbWVudHM+Ci08YnJlYWtkb3duRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9hY3Rpdml0eV9mb3JfdmFyaWFiaWxpdHlfZWxlbWVudHMvcm9sZV9BMiI+Ci08L2JyZWFrZG93bkVsZW1lbnRzPgotPGJyZWFrZG93bkVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvYWN0aXZpdHlfZm9yX3ZhcmlhYmlsaXR5X2VsZW1lbnRzL3JvbGVfQTEiPgotPC9icmVha2Rvd25FbGVtZW50cz4KLTxicmVha2Rvd25FbGVtZW50cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FjdGl2aXR5X2Zvcl92YXJpYWJpbGl0eV9lbGVtZW50cy9hcnRpZmFjdF9BMiI+Ci08L2JyZWFrZG93bkVsZW1lbnRzPgotPGJyZWFrZG93bkVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvYWN0aXZpdHlfZm9yX3ZhcmlhYmlsaXR5X2VsZW1lbnRzL2RlbGl2ZXJhYmxlX0EyIj4KLTwvYnJlYWtkb3duRWxlbWVudHM+Ci08YnJlYWtkb3duRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9hY3Rpdml0eV9mb3JfdmFyaWFiaWxpdHlfZWxlbWVudHMvb3V0Y29tZV9BMiI+Ci08L2JyZWFrZG93bkVsZW1lbnRzPgotPC9BY3Rpdml0eT4KLTxUYXNrRGVzY3JpcHRvciBuYW1lPSJ0YXNrX0EzIiBicmllZkRlc2NyaXB0aW9uPSJicmllZjogVGFzayBBMyIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iVGFzayBBMyBleHRlbmRzIFRhc2sgQTIiIHByZWZpeD0iIiBpc1BsYW5uZWQ9ImZhbHNlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzUmVwZWF0YWJsZT0iZmFsc2UiIGlzT25nb2luZz0iZmFsc2UiIGlzRXZlbnREcml2ZW49ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJ0YXNrX0EzLF9HcVgxTUVEUUVkcXJoc1poM1FOQU1RIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiByZWZpbmVkRGVzY3JpcHRpb249IiI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxzdXBlckFjdGl2aXRpZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9hY3Rpdml0eV9mb3JfdmFyaWFiaWxpdHlfZWxlbWVudHMvdGFza19BMyI+Ci08L3N1cGVyQWN0aXZpdGllcz4KLTxUYXNrIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvYWN0aXZpdHlfZm9yX3ZhcmlhYmlsaXR5X2VsZW1lbnRzL3Rhc2tfQTMiPgotPC9UYXNrPgotPGFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvYWN0aXZpdHlfZm9yX3ZhcmlhYmlsaXR5X2VsZW1lbnRzL3JvbGVfQTIiPgotPC9hZGRpdGlvbmFsbHlQZXJmb3JtZWRCeT4KLTxhZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FjdGl2aXR5X2Zvcl92YXJpYWJpbGl0eV9lbGVtZW50cy9yb2xlX0ExIj4KLTwvYWRkaXRpb25hbGx5UGVyZm9ybWVkQnk+Ci08bWFuZGF0b3J5SW5wdXQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9hY3Rpdml0eV9mb3JfdmFyaWFiaWxpdHlfZWxlbWVudHMvYXJ0aWZhY3RfQTIiPgotPC9tYW5kYXRvcnlJbnB1dD4KLTxvcHRpb25hbElucHV0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvYWN0aXZpdHlfZm9yX3ZhcmlhYmlsaXR5X2VsZW1lbnRzL2RlbGl2ZXJhYmxlX0EyIj4KLTwvb3B0aW9uYWxJbnB1dD4KLTxvdXRwdXQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9hY3Rpdml0eV9mb3JfdmFyaWFiaWxpdHlfZWxlbWVudHMvb3V0Y29tZV9BMiI+Ci08L291dHB1dD4KLTxwZXJmb3JtZWRQcmltYXJpbHlCeSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FjdGl2aXR5X2Zvcl92YXJpYWJpbGl0eV9lbGVtZW50cy90YXNrX0EzIj4KLTwvcGVyZm9ybWVkUHJpbWFyaWx5Qnk+Ci08c2VsZWN0ZWRTdGVwcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvdGFza19BMy8sX29VbHVFRURGRWRxTzlNM2Z1a1lBX0EvU3RlcCBBMy4xIj4KLTwvc2VsZWN0ZWRTdGVwcz4KLTxzZWxlY3RlZFN0ZXBzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS90YXNrX0EzLyxfb1VsdUVFREZFZHFPOU0zZnVrWUFfQS9TdGVwIEEzLjIiPgotPC9zZWxlY3RlZFN0ZXBzPgotPHNlbGVjdGVkU3RlcHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3Rhc2tfQTMvLF9vVWx1RUVERkVkcU85TTNmdWtZQV9BL1N0ZXAgQTMuMyI+Ci08L3NlbGVjdGVkU3RlcHM+Ci08c2VsZWN0ZWRTdGVwcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvdGFza19BMi90YXNrX0EyLF83NU5Rd0EtUEVkcUwyTzFQSlY5Y1pBL1N0ZXAgQTIuMSI+Ci08L3NlbGVjdGVkU3RlcHM+Ci08c2VsZWN0ZWRTdGVwcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvdGFza19BMi90YXNrX0EyLF83NU5Rd0EtUEVkcUwyTzFQSlY5Y1pBL1N0ZXAgQTIuMiI+Ci08L3NlbGVjdGVkU3RlcHM+Ci08c2VsZWN0ZWRTdGVwcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvdGFza19BMi90YXNrX0EyLF83NU5Rd0EtUEVkcUwyTzFQSlY5Y1pBL1N0ZXAgQTIuMyI+Ci08L3NlbGVjdGVkU3RlcHM+Ci08L1Rhc2tEZXNjcmlwdG9yPgotPFJvbGVEZXNjcmlwdG9yIG5hbWU9InJvbGVfQTMiIGJyaWVmRGVzY3JpcHRpb249ImJyaWVmIDogUm9sZSBBMyIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iUm9sZSBBMyBleHRlbmRzIFJvbGUgQTIiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0icm9sZV9BMyxfR3FYMU1VRFFFZHFyaHNaaDNRTkFNUSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvYWN0aXZpdHlfZm9yX3ZhcmlhYmlsaXR5X2VsZW1lbnRzL3JvbGVfQTMiPgotPC9zdXBlckFjdGl2aXRpZXM+Ci08Um9sZSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FjdGl2aXR5X2Zvcl92YXJpYWJpbGl0eV9lbGVtZW50cy9yb2xlX0EzIj4KLTwvUm9sZT4KLTxtb2RpZmllcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FjdGl2aXR5X2Zvcl92YXJpYWJpbGl0eV9lbGVtZW50cy9vdXRjb21lX0EyIj4KLTwvbW9kaWZpZXM+Ci08L1JvbGVEZXNjcmlwdG9yPgotPFJvbGVEZXNjcmlwdG9yIG5hbWU9InJvbGVfQTIiIGJyaWVmRGVzY3JpcHRpb249IlJvbGUgQTIgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IlJvbGUgQTIgZXh0ZW5kZWQgYnkgUm9sZSBBMyIgcHJlZml4PSIiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJyb2xlX0EyLF9HcWhtTUVEUUVkcXJoc1poM1FOQU1RIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiByZWZpbmVkRGVzY3JpcHRpb249IiI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxzdXBlckFjdGl2aXRpZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9hY3Rpdml0eV9mb3JfdmFyaWFiaWxpdHlfZWxlbWVudHMvcm9sZV9BMiI+Ci08L3N1cGVyQWN0aXZpdGllcz4KLTxSb2xlIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvYWN0aXZpdHlfZm9yX3ZhcmlhYmlsaXR5X2VsZW1lbnRzL3JvbGVfQTIiPgotPC9Sb2xlPgotPHJlc3BvbnNpYmxlRm9yIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvYWN0aXZpdHlfZm9yX3ZhcmlhYmlsaXR5X2VsZW1lbnRzL2FydGlmYWN0X0EyIj4KLTwvcmVzcG9uc2libGVGb3I+Ci08cmVzcG9uc2libGVGb3IgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9hY3Rpdml0eV9mb3JfdmFyaWFiaWxpdHlfZWxlbWVudHMvZGVsaXZlcmFibGVfQTIiPgotPC9yZXNwb25zaWJsZUZvcj4KLTxyZXNwb25zaWJsZUZvciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FjdGl2aXR5X2Zvcl92YXJpYWJpbGl0eV9lbGVtZW50cy9vdXRjb21lX0EyIj4KLTwvcmVzcG9uc2libGVGb3I+Ci08L1JvbGVEZXNjcmlwdG9yPgotPFJvbGVEZXNjcmlwdG9yIG5hbWU9InJvbGVfQTEiIGJyaWVmRGVzY3JpcHRpb249IlJvbGUgQTEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IlJvbGUgQTEiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0icm9sZV9BMSxfR3FobU1VRFFFZHFyaHNaaDNRTkFNUSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvYWN0aXZpdHlfZm9yX3ZhcmlhYmlsaXR5X2VsZW1lbnRzL3JvbGVfQTEiPgotPC9zdXBlckFjdGl2aXRpZXM+Ci08Um9sZSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FjdGl2aXR5X2Zvcl92YXJpYWJpbGl0eV9lbGVtZW50cy9yb2xlX0ExIj4KLTwvUm9sZT4KLTwvUm9sZURlc2NyaXB0b3I+Ci08V29ya1Byb2R1Y3REZXNjcmlwdG9yIG5hbWU9ImFydGlmYWN0X0EyIiBicmllZkRlc2NyaXB0aW9uPSJBcnRpZmFjdCBBMiBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iQXJ0aWZhY3QgQTIgcHJlc2VudCIgcHJlZml4PSIiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiIGFjdGl2aXR5RW50cnlTdGF0ZT0iIiBhY3Rpdml0eUV4aXRTdGF0ZT0iIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0iYXJ0aWZhY3RfQTIsX0dxaG1Na0RRRWRxcmhzWmgzUU5BTVEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHJlZmluZWREZXNjcmlwdGlvbj0iIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPHN1cGVyQWN0aXZpdGllcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FjdGl2aXR5X2Zvcl92YXJpYWJpbGl0eV9lbGVtZW50cy9hcnRpZmFjdF9BMiI+Ci08L3N1cGVyQWN0aXZpdGllcz4KLTxXb3JrUHJvZHVjdCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FjdGl2aXR5X2Zvcl92YXJpYWJpbGl0eV9lbGVtZW50cy9hcnRpZmFjdF9BMiI+Ci08L1dvcmtQcm9kdWN0PgotPC9Xb3JrUHJvZHVjdERlc2NyaXB0b3I+Ci08V29ya1Byb2R1Y3REZXNjcmlwdG9yIG5hbWU9ImRlbGl2ZXJhYmxlX0EyIiBicmllZkRlc2NyaXB0aW9uPSJEZWxpdmVyYWJsZSBBMiBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iRGVsaXZlcmFibGUgQTIgcHJlc2VudCIgcHJlZml4PSIiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiIGFjdGl2aXR5RW50cnlTdGF0ZT0iIiBhY3Rpdml0eUV4aXRTdGF0ZT0iIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0iZGVsaXZlcmFibGVfQTIsX0dxaG1NMERRRWRxcmhzWmgzUU5BTVEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHJlZmluZWREZXNjcmlwdGlvbj0iIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPHN1cGVyQWN0aXZpdGllcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FjdGl2aXR5X2Zvcl92YXJpYWJpbGl0eV9lbGVtZW50cy9kZWxpdmVyYWJsZV9BMiI+Ci08L3N1cGVyQWN0aXZpdGllcz4KLTxXb3JrUHJvZHVjdCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FjdGl2aXR5X2Zvcl92YXJpYWJpbGl0eV9lbGVtZW50cy9kZWxpdmVyYWJsZV9BMiI+Ci08L1dvcmtQcm9kdWN0PgotPGRlbGl2ZXJhYmxlUGFydHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9hY3Rpdml0eV9mb3JfdmFyaWFiaWxpdHlfZWxlbWVudHMvYXJ0aWZhY3RfQTIiPgotPC9kZWxpdmVyYWJsZVBhcnRzPgotPGRlbGl2ZXJhYmxlUGFydHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9hY3Rpdml0eV9mb3JfdmFyaWFiaWxpdHlfZWxlbWVudHMvb3V0Y29tZV9BMiI+Ci08L2RlbGl2ZXJhYmxlUGFydHM+Ci08L1dvcmtQcm9kdWN0RGVzY3JpcHRvcj4KLTxXb3JrUHJvZHVjdERlc2NyaXB0b3IgbmFtZT0ib3V0Y29tZV9BMiIgYnJpZWZEZXNjcmlwdGlvbj0iT3V0Y29tZSBBMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iT3V0Y29tZSBBMiBwcmVzZW50IiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSIgYWN0aXZpdHlFbnRyeVN0YXRlPSIiIGFjdGl2aXR5RXhpdFN0YXRlPSIiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJvdXRjb21lX0EyLF9HcWhtTkVEUUVkcXJoc1poM1FOQU1RIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiByZWZpbmVkRGVzY3JpcHRpb249IiI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxzdXBlckFjdGl2aXRpZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9hY3Rpdml0eV9mb3JfdmFyaWFiaWxpdHlfZWxlbWVudHMvb3V0Y29tZV9BMiI+Ci08L3N1cGVyQWN0aXZpdGllcz4KLTxXb3JrUHJvZHVjdCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FjdGl2aXR5X2Zvcl92YXJpYWJpbGl0eV9lbGVtZW50cy9vdXRjb21lX0EyIj4KLTwvV29ya1Byb2R1Y3Q+Ci08L1dvcmtQcm9kdWN0RGVzY3JpcHRvcj4KLTxXb3JrUHJvZHVjdERlc2NyaXB0b3IgbmFtZT0iYXJ0aWZhY3RfQTIiIGJyaWVmRGVzY3JpcHRpb249IkFydGlmYWN0IEEyIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJBcnRpZmFjdCBBMiBwcmVzZW50IiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSIgYWN0aXZpdHlFbnRyeVN0YXRlPSIiIGFjdGl2aXR5RXhpdFN0YXRlPSIiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJhcnRpZmFjdF9BMixfR3Fxd0lFRFFFZHFyaHNaaDNRTkFNUSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08V29ya1Byb2R1Y3QgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9hY3Rpdml0eV9mb3JfdmFyaWFiaWxpdHlfZWxlbWVudHMvYXJ0aWZhY3RfQTIiPgotPC9Xb3JrUHJvZHVjdD4KLTwvV29ya1Byb2R1Y3REZXNjcmlwdG9yPgotPFdvcmtQcm9kdWN0RGVzY3JpcHRvciBuYW1lPSJvdXRjb21lX0EyIiBicmllZkRlc2NyaXB0aW9uPSJPdXRjb21lIEExIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJPdXRjb21lIEEyIHByZXNlbnQiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIiBhY3Rpdml0eUVudHJ5U3RhdGU9IiIgYWN0aXZpdHlFeGl0U3RhdGU9IiI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9Im91dGNvbWVfQTIsX0dxcXdJVURRRWRxcmhzWmgzUU5BTVEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHJlZmluZWREZXNjcmlwdGlvbj0iIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPFdvcmtQcm9kdWN0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvYWN0aXZpdHlfZm9yX3ZhcmlhYmlsaXR5X2VsZW1lbnRzL291dGNvbWVfQTIiPgotPC9Xb3JrUHJvZHVjdD4KLTwvV29ya1Byb2R1Y3REZXNjcmlwdG9yPgotPERpYWdyYW0gbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08R3JhcGhOb2RlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FjdGl2aXR5X2Zvcl92YXJpYWJpbGl0eV9lbGVtZW50cyI+Ci08L2NvbnRhaW5lcj4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9hY3Rpdml0eV9mb3JfdmFyaWFiaWxpdHlfZWxlbWVudHMiPgotPC9ncmFwaEVsZW1lbnQ+Ci08ZWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FjdGl2aXR5X2Zvcl92YXJpYWJpbGl0eV9lbGVtZW50cyI+Ci08L2VsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0dyYXBoTm9kZT4KLTxHcmFwaE5vZGUgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvYWN0aXZpdHlfZm9yX3ZhcmlhYmlsaXR5X2VsZW1lbnRzIj4KLTwvY29udGFpbmVyPgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSIiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FjdGl2aXR5X2Zvcl92YXJpYWJpbGl0eV9lbGVtZW50cyI+Ci08L2dyYXBoRWxlbWVudD4KLTxlbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvYWN0aXZpdHlfZm9yX3ZhcmlhYmlsaXR5X2VsZW1lbnRzIj4KLTwvZWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvR3JhcGhOb2RlPgotPEdyYXBoTm9kZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9hY3Rpdml0eV9mb3JfdmFyaWFiaWxpdHlfZWxlbWVudHMiPgotPC9jb250YWluZXI+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IiI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvYWN0aXZpdHlfZm9yX3ZhcmlhYmlsaXR5X2VsZW1lbnRzIj4KLTwvZ3JhcGhFbGVtZW50PgotPGVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9hY3Rpdml0eV9mb3JfdmFyaWFiaWxpdHlfZWxlbWVudHMiPgotPC9lbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9HcmFwaE5vZGU+Ci08R3JhcGhOb2RlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FjdGl2aXR5X2Zvcl92YXJpYWJpbGl0eV9lbGVtZW50cyI+Ci08L2NvbnRhaW5lcj4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9hY3Rpdml0eV9mb3JfdmFyaWFiaWxpdHlfZWxlbWVudHMiPgotPC9ncmFwaEVsZW1lbnQ+Ci08ZWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FjdGl2aXR5X2Zvcl92YXJpYWJpbGl0eV9lbGVtZW50cyI+Ci08L2VsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0dyYXBoTm9kZT4KLTxHcmFwaE5vZGUgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvYWN0aXZpdHlfZm9yX3ZhcmlhYmlsaXR5X2VsZW1lbnRzIj4KLTwvY29udGFpbmVyPgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSIiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FjdGl2aXR5X2Zvcl92YXJpYWJpbGl0eV9lbGVtZW50cyI+Ci08L2dyYXBoRWxlbWVudD4KLTxlbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvYWN0aXZpdHlfZm9yX3ZhcmlhYmlsaXR5X2VsZW1lbnRzIj4KLTwvZWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvR3JhcGhOb2RlPgotPEdyYXBoTm9kZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9hY3Rpdml0eV9mb3JfdmFyaWFiaWxpdHlfZWxlbWVudHMiPgotPC9jb250YWluZXI+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IiI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvYWN0aXZpdHlfZm9yX3ZhcmlhYmlsaXR5X2VsZW1lbnRzIj4KLTwvZ3JhcGhFbGVtZW50PgotPGVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9hY3Rpdml0eV9mb3JfdmFyaWFiaWxpdHlfZWxlbWVudHMiPgotPC9lbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9HcmFwaE5vZGU+Ci08R3JhcGhOb2RlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FjdGl2aXR5X2Zvcl92YXJpYWJpbGl0eV9lbGVtZW50cyI+Ci08L2NvbnRhaW5lcj4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9hY3Rpdml0eV9mb3JfdmFyaWFiaWxpdHlfZWxlbWVudHMiPgotPC9ncmFwaEVsZW1lbnQ+Ci08ZWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FjdGl2aXR5X2Zvcl92YXJpYWJpbGl0eV9lbGVtZW50cyI+Ci08L2VsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0dyYXBoTm9kZT4KLTxHcmFwaE5vZGUgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvYWN0aXZpdHlfZm9yX3ZhcmlhYmlsaXR5X2VsZW1lbnRzIj4KLTwvY29udGFpbmVyPgotPFByb3BlcnR5IG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIGtleT0id3BDb21wb3NpdGVUeXBlIiB2YWx1ZT0iMSI+Ci08L1Byb3BlcnR5PgotPEdyYXBoRWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9hY3Rpdml0eV9mb3JfdmFyaWFiaWxpdHlfZWxlbWVudHMiPgotPC9jb250YWluZXI+Ci08YW5jaG9yIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvYWN0aXZpdHlfZm9yX3ZhcmlhYmlsaXR5X2VsZW1lbnRzIj4KLTwvYW5jaG9yPgotPC9HcmFwaEVkZ2U+Ci08R3JhcGhDb25uZWN0b3IgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvYWN0aXZpdHlfZm9yX3ZhcmlhYmlsaXR5X2VsZW1lbnRzIj4KLTwvZ3JhcGhFbGVtZW50PgotPGdyYXBoRWRnZSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FjdGl2aXR5X2Zvcl92YXJpYWJpbGl0eV9lbGVtZW50cyI+Ci08L2dyYXBoRWRnZT4KLTwvR3JhcGhDb25uZWN0b3I+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IiI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvYWN0aXZpdHlfZm9yX3ZhcmlhYmlsaXR5X2VsZW1lbnRzIj4KLTwvZ3JhcGhFbGVtZW50PgotPGVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9hY3Rpdml0eV9mb3JfdmFyaWFiaWxpdHlfZWxlbWVudHMiPgotPC9lbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9HcmFwaE5vZGU+Ci08R3JhcGhOb2RlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FjdGl2aXR5X2Zvcl92YXJpYWJpbGl0eV9lbGVtZW50cyI+Ci08L2NvbnRhaW5lcj4KLTxQcm9wZXJ0eSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBrZXk9IndwQ29tcG9zaXRlVHlwZSIgdmFsdWU9IjIiPgotPC9Qcm9wZXJ0eT4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9hY3Rpdml0eV9mb3JfdmFyaWFiaWxpdHlfZWxlbWVudHMiPgotPC9ncmFwaEVsZW1lbnQ+Ci08ZWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FjdGl2aXR5X2Zvcl92YXJpYWJpbGl0eV9lbGVtZW50cyI+Ci08L2VsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0dyYXBoTm9kZT4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iQWN0aXZpdHkgRGV0YWlsIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9hY3Rpdml0eV9mb3JfdmFyaWFiaWxpdHlfZWxlbWVudHMiPgotPC9ncmFwaEVsZW1lbnQ+Ci08ZWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FjdGl2aXR5X2Zvcl92YXJpYWJpbGl0eV9lbGVtZW50cyI+Ci08L2VsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0RpYWdyYW0+Ci08L1Byb2Nlc3NQYWNrYWdlPgotPFByb2Nlc3NQYWNrYWdlIG5hbWU9IkFjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgZ2xvYmFsPSJmYWxzZSI+Ci08cGFyZW50UGFja2FnZSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMiPgotPC9wYXJlbnRQYWNrYWdlPgotPEFjdGl2aXR5IG5hbWU9IkFjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cyIgcHJlZml4PSIiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1JlcGVhdGFibGU9ImZhbHNlIiBpc09uZ29pbmc9ImZhbHNlIiBpc0V2ZW50RHJpdmVuPSJmYWxzZSIgdmFyaWFiaWxpdHlUeXBlPSJuYSIgaXNFbmFjdGFibGU9ImZhbHNlIj4KLTxBY3Rpdml0eURlc2NyaXB0aW9uIG5hbWU9IkFjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMsX2RZR20wRURQRWRxcmhzWmgzUU5BTVEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHB1cnBvc2U9IiIgYWx0ZXJuYXRpdmVzPSIiIGhvd3RvU3RhZmY9IiI+Ci08L0FjdGl2aXR5RGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPGJyZWFrZG93bkVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cy90YXNrX0IyIj4KLTwvYnJlYWtkb3duRWxlbWVudHM+Ci08YnJlYWtkb3duRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzL3JvbGVfQjIiPgotPC9icmVha2Rvd25FbGVtZW50cz4KLTxicmVha2Rvd25FbGVtZW50cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMvcm9sZV9CMSI+Ci08L2JyZWFrZG93bkVsZW1lbnRzPgotPGJyZWFrZG93bkVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cy9yb2xlX0EyIj4KLTwvYnJlYWtkb3duRWxlbWVudHM+Ci08YnJlYWtkb3duRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FydGlmYWN0X0IyIj4KLTwvYnJlYWtkb3duRWxlbWVudHM+Ci08YnJlYWtkb3duRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzL3N1Yl9hcnRpZmFjdF9BMS4xIj4KLTwvYnJlYWtkb3duRWxlbWVudHM+Ci08YnJlYWtkb3duRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FydGlmYWN0X0ExIj4KLTwvYnJlYWtkb3duRWxlbWVudHM+Ci08YnJlYWtkb3duRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2RlbGl2ZXJhYmxlX0IyIj4KLTwvYnJlYWtkb3duRWxlbWVudHM+Ci08YnJlYWtkb3duRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2RlbGl2ZXJhYmxlX0ExIj4KLTwvYnJlYWtkb3duRWxlbWVudHM+Ci08YnJlYWtkb3duRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzL291dGNvbWVfQjIiPgotPC9icmVha2Rvd25FbGVtZW50cz4KLTxicmVha2Rvd25FbGVtZW50cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMvb3V0Y29tZV9BMSI+Ci08L2JyZWFrZG93bkVsZW1lbnRzPgotPC9BY3Rpdml0eT4KLTxUYXNrRGVzY3JpcHRvciBuYW1lPSJ0YXNrX0IyIiBicmllZkRlc2NyaXB0aW9uPSJUYXNrIEIyIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJUYXNrIEIyIGV4dGVuZHMgVGFzayBBMSIgcHJlZml4PSIiIGlzUGxhbm5lZD0iZmFsc2UiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNSZXBlYXRhYmxlPSJmYWxzZSIgaXNPbmdvaW5nPSJmYWxzZSIgaXNFdmVudERyaXZlbj0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9InRhc2tfQjIsX2w1eVVBRURQRWRxcmhzWmgzUU5BTVEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHJlZmluZWREZXNjcmlwdGlvbj0iIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPHN1cGVyQWN0aXZpdGllcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMvdGFza19CMiI+Ci08L3N1cGVyQWN0aXZpdGllcz4KLTxUYXNrIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cy90YXNrX0IyIj4KLTwvVGFzaz4KLTxhZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMvcm9sZV9CMSI+Ci08L2FkZGl0aW9uYWxseVBlcmZvcm1lZEJ5PgotPGFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cy9yb2xlX0EyIj4KLTwvYWRkaXRpb25hbGx5UGVyZm9ybWVkQnk+Ci08bWFuZGF0b3J5SW5wdXQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FydGlmYWN0X0IyIj4KLTwvbWFuZGF0b3J5SW5wdXQ+Ci08bWFuZGF0b3J5SW5wdXQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzL3N1Yl9hcnRpZmFjdF9BMS4xIj4KLTwvbWFuZGF0b3J5SW5wdXQ+Ci08bWFuZGF0b3J5SW5wdXQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FydGlmYWN0X0ExIj4KLTwvbWFuZGF0b3J5SW5wdXQ+Ci08b3B0aW9uYWxJbnB1dCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMvZGVsaXZlcmFibGVfQjIiPgotPC9vcHRpb25hbElucHV0PgotPG9wdGlvbmFsSW5wdXQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2RlbGl2ZXJhYmxlX0ExIj4KLTwvb3B0aW9uYWxJbnB1dD4KLTxvdXRwdXQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzL291dGNvbWVfQjIiPgotPC9vdXRwdXQ+Ci08b3V0cHV0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cy9vdXRjb21lX0ExIj4KLTwvb3V0cHV0PgotPHBlcmZvcm1lZFByaW1hcmlseUJ5IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cy90YXNrX0IyIj4KLTwvcGVyZm9ybWVkUHJpbWFyaWx5Qnk+Ci08c2VsZWN0ZWRTdGVwcyBwYXRoPSJ0YXNrX0IyLF9aTE9Nc0I4UEVkcXNoTU5TSTA3WE9nL1N0ZXAgQjIuMSI+Ci08L3NlbGVjdGVkU3RlcHM+Ci08c2VsZWN0ZWRTdGVwcyBwYXRoPSJ0YXNrX0IyLF9aTE9Nc0I4UEVkcXNoTU5TSTA3WE9nL1N0ZXAgQjIuMiI+Ci08L3NlbGVjdGVkU3RlcHM+Ci08c2VsZWN0ZWRTdGVwcyBwYXRoPSJ0YXNrX0IyLF9aTE9Nc0I4UEVkcXNoTU5TSTA3WE9nL1N0ZXAgQjIuMyI+Ci08L3NlbGVjdGVkU3RlcHM+Ci08c2VsZWN0ZWRTdGVwcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvdGFza19BMS90YXNrX0ExLF83TThuc0EtUEVkcUwyTzFQSlY5Y1pBL1N0ZXAgQTEuMSI+Ci08L3NlbGVjdGVkU3RlcHM+Ci08c2VsZWN0ZWRTdGVwcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvdGFza19BMS90YXNrX0ExLF83TThuc0EtUEVkcUwyTzFQSlY5Y1pBL1N0ZXAgQTEuMiI+Ci08L3NlbGVjdGVkU3RlcHM+Ci08c2VsZWN0ZWRTdGVwcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvdGFza19BMS90YXNrX0ExLF83TThuc0EtUEVkcUwyTzFQSlY5Y1pBL1N0ZXAgQTEuMyI+Ci08L3NlbGVjdGVkU3RlcHM+Ci08L1Rhc2tEZXNjcmlwdG9yPgotPFJvbGVEZXNjcmlwdG9yIG5hbWU9InJvbGVfQjIiIGJyaWVmRGVzY3JpcHRpb249IlJvbGUgQjIgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IlJvbGUgQjIgcHJlc2VudCIgcHJlZml4PSIiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJyb2xlX0IyLF9sNXlVQVVEUEVkcXJoc1poM1FOQU1RIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiByZWZpbmVkRGVzY3JpcHRpb249IiI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxzdXBlckFjdGl2aXRpZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzL3JvbGVfQjIiPgotPC9zdXBlckFjdGl2aXRpZXM+Ci08Um9sZSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMvcm9sZV9CMiI+Ci08L1JvbGU+Ci08bW9kaWZpZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzL291dGNvbWVfQjIiPgotPC9tb2RpZmllcz4KLTxtb2RpZmllcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMvb3V0Y29tZV9BMSI+Ci08L21vZGlmaWVzPgotPHJlc3BvbnNpYmxlRm9yIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cy9hcnRpZmFjdF9CMiI+Ci08L3Jlc3BvbnNpYmxlRm9yPgotPHJlc3BvbnNpYmxlRm9yIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cy9kZWxpdmVyYWJsZV9CMiI+Ci08L3Jlc3BvbnNpYmxlRm9yPgotPC9Sb2xlRGVzY3JpcHRvcj4KLTxSb2xlRGVzY3JpcHRvciBuYW1lPSJyb2xlX0IxIiBicmllZkRlc2NyaXB0aW9uPSJSb2xlIEIxIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJSb2xlIEIxIHByZXNlbnQiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0icm9sZV9CMSxfbDV5VUFrRFBFZHFyaHNaaDNRTkFNUSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cy9yb2xlX0IxIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPFJvbGUgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzL3JvbGVfQjEiPgotPC9Sb2xlPgotPC9Sb2xlRGVzY3JpcHRvcj4KLTxSb2xlRGVzY3JpcHRvciBuYW1lPSJyb2xlX0EyIiBicmllZkRlc2NyaXB0aW9uPSJSb2xlIEEyIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJSb2xlIEEyIGV4dGVuZGVkIGJ5IFJvbGUgQTMiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0icm9sZV9BMixfbDV5VUEwRFBFZHFyaHNaaDNRTkFNUSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cy9yb2xlX0EyIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPFJvbGUgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzL3JvbGVfQTIiPgotPC9Sb2xlPgotPC9Sb2xlRGVzY3JpcHRvcj4KLTxXb3JrUHJvZHVjdERlc2NyaXB0b3IgbmFtZT0iYXJ0aWZhY3RfQjIiIGJyaWVmRGVzY3JpcHRpb249IkFydGlmYWN0IEIyIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJBcnRpZmFjdCBCMiBwcmVzZW50IiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSIgYWN0aXZpdHlFbnRyeVN0YXRlPSIiIGFjdGl2aXR5RXhpdFN0YXRlPSIiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJhcnRpZmFjdF9CMixfbDV5VUJFRFBFZHFyaHNaaDNRTkFNUSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cy9hcnRpZmFjdF9CMiI+Ci08L3N1cGVyQWN0aXZpdGllcz4KLTxXb3JrUHJvZHVjdCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMvYXJ0aWZhY3RfQjIiPgotPC9Xb3JrUHJvZHVjdD4KLTwvV29ya1Byb2R1Y3REZXNjcmlwdG9yPgotPFdvcmtQcm9kdWN0RGVzY3JpcHRvciBuYW1lPSJzdWJfYXJ0aWZhY3RfQTEuMSIgYnJpZWZEZXNjcmlwdGlvbj0iU3ViX0FydGlmYWN0IEExLjEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IlN1Yl9BcnRpZmFjdCBBMS4xIHByZXNlbnQiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIiBhY3Rpdml0eUVudHJ5U3RhdGU9IiIgYWN0aXZpdHlFeGl0U3RhdGU9IiI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9InN1Yl9hcnRpZmFjdF9BMS4xLF9sNXlVQlVEUEVkcXJoc1poM1FOQU1RIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiByZWZpbmVkRGVzY3JpcHRpb249IiI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxzdXBlckFjdGl2aXRpZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzL3N1Yl9hcnRpZmFjdF9BMS4xIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPFdvcmtQcm9kdWN0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cy9zdWJfYXJ0aWZhY3RfQTEuMSI+Ci08L1dvcmtQcm9kdWN0PgotPC9Xb3JrUHJvZHVjdERlc2NyaXB0b3I+Ci08V29ya1Byb2R1Y3REZXNjcmlwdG9yIG5hbWU9ImFydGlmYWN0X0ExIiBicmllZkRlc2NyaXB0aW9uPSJBcnRpZmFjdCBBMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iQXJ0aWZhY3QgQTEgcHJlc2VudCIgcHJlZml4PSIiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiIGFjdGl2aXR5RW50cnlTdGF0ZT0iIiBhY3Rpdml0eUV4aXRTdGF0ZT0iIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0iYXJ0aWZhY3RfQTEsX2w1eVVCa0RQRWRxcmhzWmgzUU5BTVEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHJlZmluZWREZXNjcmlwdGlvbj0iIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPHN1cGVyQWN0aXZpdGllcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMvYXJ0aWZhY3RfQTEiPgotPC9zdXBlckFjdGl2aXRpZXM+Ci08V29ya1Byb2R1Y3QgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FydGlmYWN0X0ExIj4KLTwvV29ya1Byb2R1Y3Q+Ci08L1dvcmtQcm9kdWN0RGVzY3JpcHRvcj4KLTxXb3JrUHJvZHVjdERlc2NyaXB0b3IgbmFtZT0iZGVsaXZlcmFibGVfQjIiIGJyaWVmRGVzY3JpcHRpb249IkRlbGl2ZXJhYmxlIEIyIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJEZWxpdmVyYWJsZSBCMiBwcmVzZW50IiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSIgYWN0aXZpdHlFbnRyeVN0YXRlPSIiIGFjdGl2aXR5RXhpdFN0YXRlPSIiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJkZWxpdmVyYWJsZV9CMixfbDV5VUIwRFBFZHFyaHNaaDNRTkFNUSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cy9kZWxpdmVyYWJsZV9CMiI+Ci08L3N1cGVyQWN0aXZpdGllcz4KLTxXb3JrUHJvZHVjdCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMvZGVsaXZlcmFibGVfQjIiPgotPC9Xb3JrUHJvZHVjdD4KLTxkZWxpdmVyYWJsZVBhcnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cy9hcnRpZmFjdF9CMiI+Ci08L2RlbGl2ZXJhYmxlUGFydHM+Ci08ZGVsaXZlcmFibGVQYXJ0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMvb3V0Y29tZV9CMiI+Ci08L2RlbGl2ZXJhYmxlUGFydHM+Ci08L1dvcmtQcm9kdWN0RGVzY3JpcHRvcj4KLTxXb3JrUHJvZHVjdERlc2NyaXB0b3IgbmFtZT0iZGVsaXZlcmFibGVfQTEiIGJyaWVmRGVzY3JpcHRpb249IkRlbGl2ZXJhYmxlIEExIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJEZWxpdmVyYWJsZSBBMSBwcmVzZW50IiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSIgYWN0aXZpdHlFbnRyeVN0YXRlPSIiIGFjdGl2aXR5RXhpdFN0YXRlPSIiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJkZWxpdmVyYWJsZV9BMSxfbDV5VUNFRFBFZHFyaHNaaDNRTkFNUSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cy9kZWxpdmVyYWJsZV9BMSI+Ci08L3N1cGVyQWN0aXZpdGllcz4KLTxXb3JrUHJvZHVjdCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMvZGVsaXZlcmFibGVfQTEiPgotPC9Xb3JrUHJvZHVjdD4KLTxkZWxpdmVyYWJsZVBhcnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cy9hcnRpZmFjdF9BMSI+Ci08L2RlbGl2ZXJhYmxlUGFydHM+Ci08ZGVsaXZlcmFibGVQYXJ0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMvc3ViX2FydGlmYWN0X0ExLjEiPgotPC9kZWxpdmVyYWJsZVBhcnRzPgotPGRlbGl2ZXJhYmxlUGFydHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzL291dGNvbWVfQTEiPgotPC9kZWxpdmVyYWJsZVBhcnRzPgotPC9Xb3JrUHJvZHVjdERlc2NyaXB0b3I+Ci08V29ya1Byb2R1Y3REZXNjcmlwdG9yIG5hbWU9Im91dGNvbWVfQjIiIGJyaWVmRGVzY3JpcHRpb249Ik91dGNvbWUgQjIgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9Ik91dGNvbWUgQjIgcHJlc2VudCIgcHJlZml4PSIiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiIGFjdGl2aXR5RW50cnlTdGF0ZT0iIiBhY3Rpdml0eUV4aXRTdGF0ZT0iIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0ib3V0Y29tZV9CMixfbDV5VUNVRFBFZHFyaHNaaDNRTkFNUSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cy9vdXRjb21lX0IyIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPFdvcmtQcm9kdWN0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cy9vdXRjb21lX0IyIj4KLTwvV29ya1Byb2R1Y3Q+Ci08L1dvcmtQcm9kdWN0RGVzY3JpcHRvcj4KLTxXb3JrUHJvZHVjdERlc2NyaXB0b3IgbmFtZT0ib3V0Y29tZV9BMSIgYnJpZWZEZXNjcmlwdGlvbj0iT3V0Y29tZSBBMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iT3V0Y29tZSBBMSBwcmVzZW50IiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSIgYWN0aXZpdHlFbnRyeVN0YXRlPSIiIGFjdGl2aXR5RXhpdFN0YXRlPSIiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJvdXRjb21lX0ExLF9sNXlVQ2tEUEVkcXJoc1poM1FOQU1RIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiByZWZpbmVkRGVzY3JpcHRpb249IiI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxzdXBlckFjdGl2aXRpZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzL291dGNvbWVfQTEiPgotPC9zdXBlckFjdGl2aXRpZXM+Ci08V29ya1Byb2R1Y3QgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzL291dGNvbWVfQTEiPgotPC9Xb3JrUHJvZHVjdD4KLTwvV29ya1Byb2R1Y3REZXNjcmlwdG9yPgotPFdvcmtQcm9kdWN0RGVzY3JpcHRvciBuYW1lPSJhcnRpZmFjdF9CMiIgYnJpZWZEZXNjcmlwdGlvbj0iQXJ0aWZhY3QgQjIgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IkFydGlmYWN0IEIyIHByZXNlbnQiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIiBhY3Rpdml0eUVudHJ5U3RhdGU9IiIgYWN0aXZpdHlFeGl0U3RhdGU9IiI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9ImFydGlmYWN0X0IyLF9sNTdkOEVEUEVkcXJoc1poM1FOQU1RIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiByZWZpbmVkRGVzY3JpcHRpb249IiI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxXb3JrUHJvZHVjdCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMvYXJ0aWZhY3RfQjIiPgotPC9Xb3JrUHJvZHVjdD4KLTwvV29ya1Byb2R1Y3REZXNjcmlwdG9yPgotPFdvcmtQcm9kdWN0RGVzY3JpcHRvciBuYW1lPSJvdXRjb21lX0IyIiBicmllZkRlc2NyaXB0aW9uPSJPdXRjb21lIEIyIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJPdXRjb21lIEIyIHByZXNlbnQiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIiBhY3Rpdml0eUVudHJ5U3RhdGU9IiIgYWN0aXZpdHlFeGl0U3RhdGU9IiI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9Im91dGNvbWVfQjIsX2w1N2Q4VURQRWRxcmhzWmgzUU5BTVEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHJlZmluZWREZXNjcmlwdGlvbj0iIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPFdvcmtQcm9kdWN0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cy9vdXRjb21lX0IyIj4KLTwvV29ya1Byb2R1Y3Q+Ci08L1dvcmtQcm9kdWN0RGVzY3JpcHRvcj4KLTxXb3JrUHJvZHVjdERlc2NyaXB0b3IgbmFtZT0iYXJ0aWZhY3RfQTEiIGJyaWVmRGVzY3JpcHRpb249IkFydGlmYWN0IEExIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJBcnRpZmFjdCBBMSBwcmVzZW50IiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSIgYWN0aXZpdHlFbnRyeVN0YXRlPSIiIGFjdGl2aXR5RXhpdFN0YXRlPSIiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJhcnRpZmFjdF9BMSxfbDU3ZDhrRFBFZHFyaHNaaDNRTkFNUSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08V29ya1Byb2R1Y3QgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FydGlmYWN0X0ExIj4KLTwvV29ya1Byb2R1Y3Q+Ci08L1dvcmtQcm9kdWN0RGVzY3JpcHRvcj4KLTxXb3JrUHJvZHVjdERlc2NyaXB0b3IgbmFtZT0ic3ViX2FydGlmYWN0X0ExLjEiIGJyaWVmRGVzY3JpcHRpb249IlN1Yl9BcnRpZmFjdCBBMS4xIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJTdWJfQXJ0aWZhY3QgQTEuMSBwcmVzZW50IiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSIgYWN0aXZpdHlFbnRyeVN0YXRlPSIiIGFjdGl2aXR5RXhpdFN0YXRlPSIiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJzdWJfYXJ0aWZhY3RfQTEuMSxfbDU3ZDgwRFBFZHFyaHNaaDNRTkFNUSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08V29ya1Byb2R1Y3QgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzL3N1Yl9hcnRpZmFjdF9BMS4xIj4KLTwvV29ya1Byb2R1Y3Q+Ci08L1dvcmtQcm9kdWN0RGVzY3JpcHRvcj4KLTxXb3JrUHJvZHVjdERlc2NyaXB0b3IgbmFtZT0ib3V0Y29tZV9BMSIgYnJpZWZEZXNjcmlwdGlvbj0iT3V0Y29tZSBBMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iT3V0Y29tZSBBMSBwcmVzZW50IiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSIgYWN0aXZpdHlFbnRyeVN0YXRlPSIiIGFjdGl2aXR5RXhpdFN0YXRlPSIiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJvdXRjb21lX0ExLF9sNTdkOUVEUEVkcXJoc1poM1FOQU1RIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiByZWZpbmVkRGVzY3JpcHRpb249IiI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxXb3JrUHJvZHVjdCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMvb3V0Y29tZV9BMSI+Ci08L1dvcmtQcm9kdWN0PgotPC9Xb3JrUHJvZHVjdERlc2NyaXB0b3I+Ci08RGlhZ3JhbSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxHcmFwaE5vZGUgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cyI+Ci08L2NvbnRhaW5lcj4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzIj4KLTwvZ3JhcGhFbGVtZW50PgotPGVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzIj4KLTwvZWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvR3JhcGhOb2RlPgotPEdyYXBoTm9kZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzIj4KLTwvY29udGFpbmVyPgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSIiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMiPgotPC9ncmFwaEVsZW1lbnQ+Ci08ZWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMiPgotPC9lbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9HcmFwaE5vZGU+Ci08R3JhcGhOb2RlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMiPgotPC9jb250YWluZXI+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IiI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cyI+Ci08L2dyYXBoRWxlbWVudD4KLTxlbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cyI+Ci08L2VsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0dyYXBoTm9kZT4KLTxHcmFwaE5vZGUgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cyI+Ci08L2NvbnRhaW5lcj4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzIj4KLTwvZ3JhcGhFbGVtZW50PgotPGVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzIj4KLTwvZWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvR3JhcGhOb2RlPgotPEdyYXBoTm9kZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzIj4KLTwvY29udGFpbmVyPgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSIiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMiPgotPC9ncmFwaEVsZW1lbnQ+Ci08ZWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMiPgotPC9lbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9HcmFwaE5vZGU+Ci08R3JhcGhOb2RlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMiPgotPC9jb250YWluZXI+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IiI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cyI+Ci08L2dyYXBoRWxlbWVudD4KLTxlbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cyI+Ci08L2VsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0dyYXBoTm9kZT4KLTxHcmFwaE5vZGUgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cyI+Ci08L2NvbnRhaW5lcj4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzIj4KLTwvZ3JhcGhFbGVtZW50PgotPGVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzIj4KLTwvZWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvR3JhcGhOb2RlPgotPEdyYXBoTm9kZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzIj4KLTwvY29udGFpbmVyPgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSIiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMiPgotPC9ncmFwaEVsZW1lbnQ+Ci08ZWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMiPgotPC9lbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9HcmFwaE5vZGU+Ci08R3JhcGhOb2RlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMiPgotPC9jb250YWluZXI+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IiI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cyI+Ci08L2dyYXBoRWxlbWVudD4KLTxlbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cyI+Ci08L2VsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0dyYXBoTm9kZT4KLTxHcmFwaE5vZGUgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cyI+Ci08L2NvbnRhaW5lcj4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzIj4KLTwvZ3JhcGhFbGVtZW50PgotPGVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzIj4KLTwvZWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvR3JhcGhOb2RlPgotPEdyYXBoTm9kZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzIj4KLTwvY29udGFpbmVyPgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSIiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMiPgotPC9ncmFwaEVsZW1lbnQ+Ci08ZWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMiPgotPC9lbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9HcmFwaE5vZGU+Ci08R3JhcGhOb2RlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMiPgotPC9jb250YWluZXI+Ci08UHJvcGVydHkgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIga2V5PSJ3cENvbXBvc2l0ZVR5cGUiIHZhbHVlPSIxIj4KLTwvUHJvcGVydHk+Ci08R3JhcGhFZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMiPgotPC9jb250YWluZXI+Ci08YW5jaG9yIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cyI+Ci08L2FuY2hvcj4KLTwvR3JhcGhFZGdlPgotPEdyYXBoQ29ubmVjdG9yIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMiPgotPC9ncmFwaEVsZW1lbnQ+Ci08Z3JhcGhFZGdlIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cyI+Ci08L2dyYXBoRWRnZT4KLTwvR3JhcGhDb25uZWN0b3I+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IiI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cyI+Ci08L2dyYXBoRWxlbWVudD4KLTxlbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cyI+Ci08L2VsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0dyYXBoTm9kZT4KLTxHcmFwaE5vZGUgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cyI+Ci08L2NvbnRhaW5lcj4KLTxQcm9wZXJ0eSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBrZXk9IndwQ29tcG9zaXRlVHlwZSIgdmFsdWU9IjIiPgotPC9Qcm9wZXJ0eT4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzIj4KLTwvZ3JhcGhFbGVtZW50PgotPGVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzIj4KLTwvZWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvR3JhcGhOb2RlPgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSJBY3Rpdml0eSBEZXRhaWwiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMiPgotPC9ncmFwaEVsZW1lbnQ+Ci08ZWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMiPgotPC9lbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9EaWFncmFtPgotPC9Qcm9jZXNzUGFja2FnZT4KLTxDYXBhYmlsaXR5UGF0dGVybiBuYW1lPSJDUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cyIgYnJpZWZEZXNjcmlwdGlvbj0iQnJpZWY6IENQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJDUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cyIgcHJlZml4PSIiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1JlcGVhdGFibGU9ImZhbHNlIiBpc09uZ29pbmc9ImZhbHNlIiBpc0V2ZW50RHJpdmVuPSJmYWxzZSIgdmFyaWFiaWxpdHlUeXBlPSJuYSIgaXNFbmFjdGFibGU9ImZhbHNlIj4KLTxQcm9jZXNzRGVzY3JpcHRpb24gbmFtZT0iQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMsX1p0WmJNVURGRWRxTzlNM2Z1a1lBX0EiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0ibWFpbjogQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMiIGtleUNvbnNpZGVyYXRpb25zPSJLZXlzOiBDUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cyIgdXNhZ2VHdWlkYW5jZT0idXNhZ2U6IENQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzIiBwdXJwb3NlPSJQdXJwb3NlOiBDUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cyIgYWx0ZXJuYXRpdmVzPSJhbHRlcm5hdGl2ZXM6IENQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzIiBob3d0b1N0YWZmPSJIb3cgdG8gc3RhZmY6IENQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzIiBleHRlcm5hbElkPSJFeHRlcm5hbCBJRDogQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMiIHNjb3BlPSJzY29wZTogQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMiIHVzYWdlTm90ZXM9InVzYWdlOiBDUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cyI+Ci08L1Byb2Nlc3NEZXNjcmlwdGlvbj4KLTxicmVha2Rvd25FbGVtZW50cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FjdGl2aXR5X2Zvcl92YXJpYWJpbGl0eV9lbGVtZW50cy9hY3Rpdml0eV9mb3JfdmFyaWFiaWxpdHlfZWxlbWVudHMiPgotPC9icmVha2Rvd25FbGVtZW50cz4KLTxicmVha2Rvd25FbGVtZW50cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cyI+Ci08L2JyZWFrZG93bkVsZW1lbnRzPgotPGRlZmF1bHRDb250ZXh0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMiPgotPC9kZWZhdWx0Q29udGV4dD4KLTx2YWxpZENvbnRleHQgcGF0aD0iQ29uZmlnIEEiPgotPC92YWxpZENvbnRleHQ+Ci08L0NhcGFiaWxpdHlQYXR0ZXJuPgotPC9Qcm9jZXNzQ29tcG9uZW50PgotPC9Qcm9jZXNzUGFja2FnZT4KLTxQcm9jZXNzQ29tcG9uZW50IG5hbWU9IkNQIGV4dGVuZGluZyAmYXBvcztDUDEgd2l0aCBhbGwgZWxlbWVudHMmYXBvczsiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgZ2xvYmFsPSJmYWxzZSIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiPgotPHBhcmVudFBhY2thZ2UgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIGV4dGVuZGluZyAmYXBvcztDUDEgd2l0aCBhbGwgZWxlbWVudHMmYXBvczsiPgotPC9wYXJlbnRQYWNrYWdlPgotPFByb2Nlc3NQYWNrYWdlIG5hbWU9IkNQMSB3aXRoIGFsbCBlbGVtZW50cyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBnbG9iYWw9ImZhbHNlIj4KLTxwYXJlbnRQYWNrYWdlIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBleHRlbmRpbmcgJmFwb3M7Q1AxIHdpdGggYWxsIGVsZW1lbnRzJmFwb3M7L0NQMSB3aXRoIGFsbCBlbGVtZW50cyI+Ci08L3BhcmVudFBhY2thZ2U+Ci08QWN0aXZpdHkgbmFtZT0iQ1AxIHdpdGggYWxsIGVsZW1lbnRzIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IiIgcHJlZml4PSIiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1JlcGVhdGFibGU9ImZhbHNlIiBpc09uZ29pbmc9ImZhbHNlIiBpc0V2ZW50RHJpdmVuPSJmYWxzZSIgdmFyaWFiaWxpdHlUeXBlPSJleHRlbmRzIiBpc0VuYWN0YWJsZT0iZmFsc2UiPgotPEFjdGl2aXR5RGVzY3JpcHRpb24gbmFtZT0iQ1AxIHdpdGggYWxsIGVsZW1lbnRzLF9FWGF6RUQwS0VkcWpBSTc3REh2QndBIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiBwdXJwb3NlPSIiIGFsdGVybmF0aXZlcz0iIiBob3d0b1N0YWZmPSIiPgotPC9BY3Rpdml0eURlc2NyaXB0aW9uPgotPHN1cGVyQWN0aXZpdGllcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgZXh0ZW5kaW5nICZhcG9zO0NQMSB3aXRoIGFsbCBlbGVtZW50cyZhcG9zOy9DUDEgd2l0aCBhbGwgZWxlbWVudHMvQ1AxIHdpdGggYWxsIGVsZW1lbnRzIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPHZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIGV4dGVuZGluZyAmYXBvcztDUDEgd2l0aCBhbGwgZWxlbWVudHMmYXBvczsvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL0NQMSB3aXRoIGFsbCBlbGVtZW50cyI+Ci08L3ZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQ+Ci08L0FjdGl2aXR5PgotPC9Qcm9jZXNzUGFja2FnZT4KLTxEaWFncmFtIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSJBY3Rpdml0eSBEZXRhaWwiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgZXh0ZW5kaW5nICZhcG9zO0NQMSB3aXRoIGFsbCBlbGVtZW50cyZhcG9zOyI+Ci08L2dyYXBoRWxlbWVudD4KLTxlbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBleHRlbmRpbmcgJmFwb3M7Q1AxIHdpdGggYWxsIGVsZW1lbnRzJmFwb3M7Ij4KLTwvZWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvRGlhZ3JhbT4KLTxDYXBhYmlsaXR5UGF0dGVybiBuYW1lPSJDUCBleHRlbmRpbmcgJmFwb3M7Q1AxIHdpdGggYWxsIGVsZW1lbnRzJmFwb3M7IiBicmllZkRlc2NyaXB0aW9uPSJicmllZkNQIGV4dGVuZGluZyAmYXBvcztDUDEgd2l0aCBhbGwgZWxlbWVudHMmYXBvczsiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IkNQIGV4dGVuZGluZyAmYXBvcztDUDEgd2l0aCBhbGwgZWxlbWVudHMmYXBvczsiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNSZXBlYXRhYmxlPSJmYWxzZSIgaXNPbmdvaW5nPSJmYWxzZSIgaXNFdmVudERyaXZlbj0iZmFsc2UiIHZhcmlhYmlsaXR5VHlwZT0ibmEiIGlzRW5hY3RhYmxlPSJmYWxzZSI+Ci08UHJvY2Vzc0Rlc2NyaXB0aW9uIG5hbWU9IkNhcFBhdCBBMSxfYUhVU1FSQk5FZHFCczdLaGRWTFJMQSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249IkNQIGV4dGVuZGluZyAmYXBvcztDUDEgd2l0aCBhbGwgZWxlbWVudHMmYXBvczsgbWFpbiIga2V5Q29uc2lkZXJhdGlvbnM9IkNQIGV4dGVuZGluZyAmYXBvcztDUDEgd2l0aCBhbGwgZWxlbWVudHMmYXBvczsga2V5IGNvbiIgdXNhZ2VHdWlkYW5jZT0iIiBwdXJwb3NlPSImbHQ7cCZndDsmIzEzOyYjMTA7ICAgIHB1cnBvc2U6IENQIGV4dGVuZGluZyAmYXBvcztDUDEgd2l0aCBhbGwgZWxlbWVudHMmYXBvczsmIzEzOyYjMTA7Jmx0Oy9wJmd0OyIgYWx0ZXJuYXRpdmVzPSJDUCBleHRlbmRpbmcgJmFwb3M7Q1AxIHdpdGggYWxsICZsdDtzdHJvbmcmZ3Q7ZWxlbWVudHMmYXBvczsgYWx0ZXJuJmx0Oy9zdHJvbmcmZ3Q7IiBob3d0b1N0YWZmPSJDUCBleHRlbmRpbmcgJmFwb3M7Q1AxIHdpdGggYWxsIGVsZW1lbnRzJmFwb3M7IHN0YWZmIiBleHRlcm5hbElkPSJleHRlcm5JRDpDUCBleHRlbmRpbmcgJmFwb3M7Q1AxIHdpdGggYWxsIGVsZW1lbnRzJmFwb3M7IiBzY29wZT0iQ1AgZXh0ZW5kaW5nICZhcG9zO0NQMSB3aXRoIGFsbCBlbGVtZW50cyZhcG9zOyBzY29wZSIgdXNhZ2VOb3Rlcz0iQ1AgZXh0ZW5kaW5nICZhcG9zO0NQMSB3aXRoIGFsbCBlbGVtZW50cyZhcG9zO3VzYWdlIj4KLTwvUHJvY2Vzc0Rlc2NyaXB0aW9uPgotPGJyZWFrZG93bkVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBleHRlbmRpbmcgJmFwb3M7Q1AxIHdpdGggYWxsIGVsZW1lbnRzJmFwb3M7L0NQMSB3aXRoIGFsbCBlbGVtZW50cy9DUDEgd2l0aCBhbGwgZWxlbWVudHMiPgotPC9icmVha2Rvd25FbGVtZW50cz4KLTxkZWZhdWx0Q29udGV4dCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgZXh0ZW5kaW5nICZhcG9zO0NQMSB3aXRoIGFsbCBlbGVtZW50cyZhcG9zOy9DUCBleHRlbmRpbmcgJmFwb3M7Q1AxIHdpdGggYWxsIGVsZW1lbnRzJmFwb3M7Ij4KLTwvZGVmYXVsdENvbnRleHQ+Ci08dmFsaWRDb250ZXh0IHBhdGg9IkNvbmZpZyBBIj4KLTwvdmFsaWRDb250ZXh0PgotPC9DYXBhYmlsaXR5UGF0dGVybj4KLTwvUHJvY2Vzc0NvbXBvbmVudD4KLTxQcm9jZXNzQ29tcG9uZW50IG5hbWU9IkNQIEExIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGdsb2JhbD0iZmFsc2UiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIj4KLTxwYXJlbnRQYWNrYWdlIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMSI+Ci08L3BhcmVudFBhY2thZ2U+Ci08UHJvY2Vzc1BhY2thZ2UgbmFtZT0iQWN0MSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBnbG9iYWw9ImZhbHNlIj4KLTxwYXJlbnRQYWNrYWdlIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvcGFyZW50UGFja2FnZT4KLTxBY3Rpdml0eSBuYW1lPSJBY3QxIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IkFjdDEiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNSZXBlYXRhYmxlPSJmYWxzZSIgaXNPbmdvaW5nPSJmYWxzZSIgaXNFdmVudERyaXZlbj0iZmFsc2UiIHZhcmlhYmlsaXR5VHlwZT0ibmEiIGlzRW5hY3RhYmxlPSJmYWxzZSI+Ci08QWN0aXZpdHlEZXNjcmlwdGlvbiBuYW1lPSJBY3QxLF9lYUNhb0VBdkVkcUZxSXU4LWNrb2xnIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiBwdXJwb3NlPSIiIGFsdGVybmF0aXZlcz0iIiBob3d0b1N0YWZmPSIiPgotPC9BY3Rpdml0eURlc2NyaXB0aW9uPgotPHN1cGVyQWN0aXZpdGllcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9BY3QxIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPGJyZWFrZG93bkVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL3Rhc2tfQTEiPgotPC9icmVha2Rvd25FbGVtZW50cz4KLTxicmVha2Rvd25FbGVtZW50cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9yb2xlX0ExIj4KLTwvYnJlYWtkb3duRWxlbWVudHM+Ci08YnJlYWtkb3duRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvcm9sZV9BMiI+Ci08L2JyZWFrZG93bkVsZW1lbnRzPgotPGJyZWFrZG93bkVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL3N1Yl9hcnRpZmFjdF9BMS4xIj4KLTwvYnJlYWtkb3duRWxlbWVudHM+Ci08YnJlYWtkb3duRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvYXJ0aWZhY3RfQTEiPgotPC9icmVha2Rvd25FbGVtZW50cz4KLTxicmVha2Rvd25FbGVtZW50cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9kZWxpdmVyYWJsZV9BMSI+Ci08L2JyZWFrZG93bkVsZW1lbnRzPgotPGJyZWFrZG93bkVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL291dGNvbWVfQTEiPgotPC9icmVha2Rvd25FbGVtZW50cz4KLTxicmVha2Rvd25FbGVtZW50cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS90YXNrX0IxIj4KLTwvYnJlYWtkb3duRWxlbWVudHM+Ci08YnJlYWtkb3duRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvcm9sZV9CMSI+Ci08L2JyZWFrZG93bkVsZW1lbnRzPgotPGJyZWFrZG93bkVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL3JvbGVfQjIiPgotPC9icmVha2Rvd25FbGVtZW50cz4KLTxicmVha2Rvd25FbGVtZW50cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9hcnRpZmFjdF9CMSI+Ci08L2JyZWFrZG93bkVsZW1lbnRzPgotPGJyZWFrZG93bkVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL2RlbGl2ZXJhYmxlX0IxIj4KLTwvYnJlYWtkb3duRWxlbWVudHM+Ci08YnJlYWtkb3duRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvb3V0Y29tZV9CMSI+Ci08L2JyZWFrZG93bkVsZW1lbnRzPgotPGJyZWFrZG93bkVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL3Rhc2tfQjIiPgotPC9icmVha2Rvd25FbGVtZW50cz4KLTxicmVha2Rvd25FbGVtZW50cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9hcnRpZmFjdF9CMiI+Ci08L2JyZWFrZG93bkVsZW1lbnRzPgotPGJyZWFrZG93bkVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL2RlbGl2ZXJhYmxlX0IyIj4KLTwvYnJlYWtkb3duRWxlbWVudHM+Ci08YnJlYWtkb3duRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvb3V0Y29tZV9CMiI+Ci08L2JyZWFrZG93bkVsZW1lbnRzPgotPGJyZWFrZG93bkVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL3Rhc2tfQTIiPgotPC9icmVha2Rvd25FbGVtZW50cz4KLTxicmVha2Rvd25FbGVtZW50cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9hcnRpZmFjdF9BMiI+Ci08L2JyZWFrZG93bkVsZW1lbnRzPgotPGJyZWFrZG93bkVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL2RlbGl2ZXJhYmxlX0EyIj4KLTwvYnJlYWtkb3duRWxlbWVudHM+Ci08YnJlYWtkb3duRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvb3V0Y29tZV9BMiI+Ci08L2JyZWFrZG93bkVsZW1lbnRzPgotPC9BY3Rpdml0eT4KLTxUYXNrRGVzY3JpcHRvciBuYW1lPSJ0YXNrX0ExIiBicmllZkRlc2NyaXB0aW9uPSJUYXNrIEExIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJUYXNrIEExIHByZXNlbnQiIHByZWZpeD0iIiBpc1BsYW5uZWQ9ImZhbHNlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzUmVwZWF0YWJsZT0iZmFsc2UiIGlzT25nb2luZz0iZmFsc2UiIGlzRXZlbnREcml2ZW49ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJ0YXNrX0ExLF9nRjdVc0VBdkVkcUZxSXU4LWNrb2xnIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiByZWZpbmVkRGVzY3JpcHRpb249IiI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxzdXBlckFjdGl2aXRpZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvdGFza19BMSI+Ci08L3N1cGVyQWN0aXZpdGllcz4KLTxUYXNrIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL3Rhc2tfQTEiPgotPC9UYXNrPgotPGFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL3JvbGVfQTIiPgotPC9hZGRpdGlvbmFsbHlQZXJmb3JtZWRCeT4KLTxtYW5kYXRvcnlJbnB1dCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9zdWJfYXJ0aWZhY3RfQTEuMSI+Ci08L21hbmRhdG9yeUlucHV0PgotPG1hbmRhdG9yeUlucHV0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL2FydGlmYWN0X0ExIj4KLTwvbWFuZGF0b3J5SW5wdXQ+Ci08b3B0aW9uYWxJbnB1dCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9kZWxpdmVyYWJsZV9BMSI+Ci08L29wdGlvbmFsSW5wdXQ+Ci08b3V0cHV0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL291dGNvbWVfQTEiPgotPC9vdXRwdXQ+Ci08cGVyZm9ybWVkUHJpbWFyaWx5QnkgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvdGFza19BMSI+Ci08L3BlcmZvcm1lZFByaW1hcmlseUJ5PgotPHNlbGVjdGVkU3RlcHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3Rhc2tfQTEvdGFza19BMSxfN004bnNBLVBFZHFMMk8xUEpWOWNaQS9TdGVwIEExLjEiPgotPC9zZWxlY3RlZFN0ZXBzPgotPHNlbGVjdGVkU3RlcHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3Rhc2tfQTEvdGFza19BMSxfN004bnNBLVBFZHFMMk8xUEpWOWNaQS9TdGVwIEExLjIiPgotPC9zZWxlY3RlZFN0ZXBzPgotPHNlbGVjdGVkU3RlcHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3Rhc2tfQTEvdGFza19BMSxfN004bnNBLVBFZHFMMk8xUEpWOWNaQS9TdGVwIEExLjMiPgotPC9zZWxlY3RlZFN0ZXBzPgotPC9UYXNrRGVzY3JpcHRvcj4KLTxSb2xlRGVzY3JpcHRvciBuYW1lPSJyb2xlX0ExIiBicmllZkRlc2NyaXB0aW9uPSJSb2xlIEExIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJSb2xlIEExIiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9InJvbGVfQTEsX2dGN1VzVUF2RWRxRnFJdTgtY2tvbGciIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHJlZmluZWREZXNjcmlwdGlvbj0iIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPHN1cGVyQWN0aXZpdGllcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9yb2xlX0ExIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPFJvbGUgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvcm9sZV9BMSI+Ci08L1JvbGU+Ci08bW9kaWZpZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvb3V0Y29tZV9BMSI+Ci08L21vZGlmaWVzPgotPHJlc3BvbnNpYmxlRm9yIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL2FydGlmYWN0X0ExIj4KLTwvcmVzcG9uc2libGVGb3I+Ci08cmVzcG9uc2libGVGb3IgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvZGVsaXZlcmFibGVfQTEiPgotPC9yZXNwb25zaWJsZUZvcj4KLTxyZXNwb25zaWJsZUZvciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9vdXRjb21lX0ExIj4KLTwvcmVzcG9uc2libGVGb3I+Ci08L1JvbGVEZXNjcmlwdG9yPgotPFJvbGVEZXNjcmlwdG9yIG5hbWU9InJvbGVfQTIiIGJyaWVmRGVzY3JpcHRpb249IlJvbGUgQTIgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IlJvbGUgQTIgIiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9InJvbGVfQTIsX2dGN1Vza0F2RWRxRnFJdTgtY2tvbGciIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHJlZmluZWREZXNjcmlwdGlvbj0iIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPHN1cGVyQWN0aXZpdGllcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9yb2xlX0EyIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPFJvbGUgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvcm9sZV9BMiI+Ci08L1JvbGU+Ci08bW9kaWZpZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvb3V0Y29tZV9BMiI+Ci08L21vZGlmaWVzPgotPC9Sb2xlRGVzY3JpcHRvcj4KLTxXb3JrUHJvZHVjdERlc2NyaXB0b3IgbmFtZT0ic3ViX2FydGlmYWN0X0ExLjEiIGJyaWVmRGVzY3JpcHRpb249IlN1Yl9BcnRpZmFjdCBBMS4xIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJTdWJfQXJ0aWZhY3QgQTEuMSBwcmVzZW50IiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSIgYWN0aXZpdHlFbnRyeVN0YXRlPSIiIGFjdGl2aXR5RXhpdFN0YXRlPSIiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJzdWJfYXJ0aWZhY3RfQTEuMSxfZ0Y3VXMwQXZFZHFGcUl1OC1ja29sZyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL3N1Yl9hcnRpZmFjdF9BMS4xIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPFdvcmtQcm9kdWN0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL3N1Yl9hcnRpZmFjdF9BMS4xIj4KLTwvV29ya1Byb2R1Y3Q+Ci08L1dvcmtQcm9kdWN0RGVzY3JpcHRvcj4KLTxXb3JrUHJvZHVjdERlc2NyaXB0b3IgbmFtZT0iYXJ0aWZhY3RfQTEiIGJyaWVmRGVzY3JpcHRpb249IkFydGlmYWN0IEExIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJBcnRpZmFjdCBBMSBwcmVzZW50IiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSIgYWN0aXZpdHlFbnRyeVN0YXRlPSIiIGFjdGl2aXR5RXhpdFN0YXRlPSIiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJhcnRpZmFjdF9BMSxfZ0dFZW9FQXZFZHFGcUl1OC1ja29sZyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL2FydGlmYWN0X0ExIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPFdvcmtQcm9kdWN0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL2FydGlmYWN0X0ExIj4KLTwvV29ya1Byb2R1Y3Q+Ci08L1dvcmtQcm9kdWN0RGVzY3JpcHRvcj4KLTxXb3JrUHJvZHVjdERlc2NyaXB0b3IgbmFtZT0iZGVsaXZlcmFibGVfQTEiIGJyaWVmRGVzY3JpcHRpb249IkRlbGl2ZXJhYmxlIEExIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJEZWxpdmVyYWJsZSBBMSBwcmVzZW50IiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSIgYWN0aXZpdHlFbnRyeVN0YXRlPSIiIGFjdGl2aXR5RXhpdFN0YXRlPSIiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJkZWxpdmVyYWJsZV9BMSxfZ0dFZW9VQXZFZHFGcUl1OC1ja29sZyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL2RlbGl2ZXJhYmxlX0ExIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPFdvcmtQcm9kdWN0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL2RlbGl2ZXJhYmxlX0ExIj4KLTwvV29ya1Byb2R1Y3Q+Ci08ZGVsaXZlcmFibGVQYXJ0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9hcnRpZmFjdF9BMSI+Ci08L2RlbGl2ZXJhYmxlUGFydHM+Ci08ZGVsaXZlcmFibGVQYXJ0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9zdWJfYXJ0aWZhY3RfQTEuMSI+Ci08L2RlbGl2ZXJhYmxlUGFydHM+Ci08ZGVsaXZlcmFibGVQYXJ0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9vdXRjb21lX0ExIj4KLTwvZGVsaXZlcmFibGVQYXJ0cz4KLTwvV29ya1Byb2R1Y3REZXNjcmlwdG9yPgotPFdvcmtQcm9kdWN0RGVzY3JpcHRvciBuYW1lPSJvdXRjb21lX0ExIiBicmllZkRlc2NyaXB0aW9uPSJPdXRjb21lIEExIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJPdXRjb21lIEExIHByZXNlbnQiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIiBhY3Rpdml0eUVudHJ5U3RhdGU9IiIgYWN0aXZpdHlFeGl0U3RhdGU9IiI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9Im91dGNvbWVfQTEsX2dHRWVva0F2RWRxRnFJdTgtY2tvbGciIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHJlZmluZWREZXNjcmlwdGlvbj0iIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPHN1cGVyQWN0aXZpdGllcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9vdXRjb21lX0ExIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPFdvcmtQcm9kdWN0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL291dGNvbWVfQTEiPgotPC9Xb3JrUHJvZHVjdD4KLTwvV29ya1Byb2R1Y3REZXNjcmlwdG9yPgotPFdvcmtQcm9kdWN0RGVzY3JpcHRvciBuYW1lPSJhcnRpZmFjdF9BMSIgYnJpZWZEZXNjcmlwdGlvbj0iQXJ0aWZhY3QgQTEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IkFydGlmYWN0IEExIHByZXNlbnQiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIiBhY3Rpdml0eUVudHJ5U3RhdGU9IiIgYWN0aXZpdHlFeGl0U3RhdGU9IiI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9ImFydGlmYWN0X0ExLF9nR0VlbzBBdkVkcUZxSXU4LWNrb2xnIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiByZWZpbmVkRGVzY3JpcHRpb249IiI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxXb3JrUHJvZHVjdCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9hcnRpZmFjdF9BMSI+Ci08L1dvcmtQcm9kdWN0PgotPC9Xb3JrUHJvZHVjdERlc2NyaXB0b3I+Ci08V29ya1Byb2R1Y3REZXNjcmlwdG9yIG5hbWU9InN1Yl9hcnRpZmFjdF9BMS4xIiBicmllZkRlc2NyaXB0aW9uPSJTdWJfQXJ0aWZhY3QgQTEuMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iU3ViX0FydGlmYWN0IEExLjEgcHJlc2VudCIgcHJlZml4PSIiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiIGFjdGl2aXR5RW50cnlTdGF0ZT0iIiBhY3Rpdml0eUV4aXRTdGF0ZT0iIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0ic3ViX2FydGlmYWN0X0ExLjEsX2dHRWVwRUF2RWRxRnFJdTgtY2tvbGciIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHJlZmluZWREZXNjcmlwdGlvbj0iIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPFdvcmtQcm9kdWN0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL3N1Yl9hcnRpZmFjdF9BMS4xIj4KLTwvV29ya1Byb2R1Y3Q+Ci08L1dvcmtQcm9kdWN0RGVzY3JpcHRvcj4KLTxXb3JrUHJvZHVjdERlc2NyaXB0b3IgbmFtZT0ib3V0Y29tZV9BMSIgYnJpZWZEZXNjcmlwdGlvbj0iT3V0Y29tZSBBMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iT3V0Y29tZSBBMSBwcmVzZW50IiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSIgYWN0aXZpdHlFbnRyeVN0YXRlPSIiIGFjdGl2aXR5RXhpdFN0YXRlPSIiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJvdXRjb21lX0ExLF9nR0VlcFVBdkVkcUZxSXU4LWNrb2xnIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiByZWZpbmVkRGVzY3JpcHRpb249IiI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxXb3JrUHJvZHVjdCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9vdXRjb21lX0ExIj4KLTwvV29ya1Byb2R1Y3Q+Ci08L1dvcmtQcm9kdWN0RGVzY3JpcHRvcj4KLTxUYXNrRGVzY3JpcHRvciBuYW1lPSJ0YXNrX0IxIiBicmllZkRlc2NyaXB0aW9uPSJUYXNrIEIxIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJUYXNrIEIxIHByZXNuZXQiIHByZWZpeD0iIiBpc1BsYW5uZWQ9ImZhbHNlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzUmVwZWF0YWJsZT0iZmFsc2UiIGlzT25nb2luZz0iZmFsc2UiIGlzRXZlbnREcml2ZW49ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJ0YXNrX0IxLF9qQkZlUUVBdkVkcUZxSXU4LWNrb2xnIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiByZWZpbmVkRGVzY3JpcHRpb249IiI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxzdXBlckFjdGl2aXRpZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvdGFza19CMSI+Ci08L3N1cGVyQWN0aXZpdGllcz4KLTxUYXNrIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL3Rhc2tfQjEiPgotPC9UYXNrPgotPGFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL3JvbGVfQjIiPgotPC9hZGRpdGlvbmFsbHlQZXJmb3JtZWRCeT4KLTxtYW5kYXRvcnlJbnB1dCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9hcnRpZmFjdF9CMSI+Ci08L21hbmRhdG9yeUlucHV0PgotPG9wdGlvbmFsSW5wdXQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvZGVsaXZlcmFibGVfQjEiPgotPC9vcHRpb25hbElucHV0PgotPG91dHB1dCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9vdXRjb21lX0IxIj4KLTwvb3V0cHV0PgotPHBlcmZvcm1lZFByaW1hcmlseUJ5IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL3Rhc2tfQjEiPgotPC9wZXJmb3JtZWRQcmltYXJpbHlCeT4KLTxzZWxlY3RlZFN0ZXBzIHBhdGg9InRhc2tfQjEsX1hVNkxVQjhQRWRxc2hNTlNJMDdYT2cvU3RlcCBCMS4xIj4KLTwvc2VsZWN0ZWRTdGVwcz4KLTxzZWxlY3RlZFN0ZXBzIHBhdGg9InRhc2tfQjEsX1hVNkxVQjhQRWRxc2hNTlNJMDdYT2cvU3RlcCBCMS4yIj4KLTwvc2VsZWN0ZWRTdGVwcz4KLTxzZWxlY3RlZFN0ZXBzIHBhdGg9InRhc2tfQjEsX1hVNkxVQjhQRWRxc2hNTlNJMDdYT2cvU3RlcCBCMS4zIj4KLTwvc2VsZWN0ZWRTdGVwcz4KLTwvVGFza0Rlc2NyaXB0b3I+Ci08Um9sZURlc2NyaXB0b3IgbmFtZT0icm9sZV9CMSIgYnJpZWZEZXNjcmlwdGlvbj0iUm9sZSBCMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iUm9sZSBCMSBwcmVzZW50IiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9InJvbGVfQjEsX2p2U0JBRUF2RWRxRnFJdTgtY2tvbGciIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHJlZmluZWREZXNjcmlwdGlvbj0iIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPHN1cGVyQWN0aXZpdGllcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9yb2xlX0IxIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPFJvbGUgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvcm9sZV9CMSI+Ci08L1JvbGU+Ci08bW9kaWZpZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvb3V0Y29tZV9CMSI+Ci08L21vZGlmaWVzPgotPHJlc3BvbnNpYmxlRm9yIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL2FydGlmYWN0X0IxIj4KLTwvcmVzcG9uc2libGVGb3I+Ci08cmVzcG9uc2libGVGb3IgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvZGVsaXZlcmFibGVfQjEiPgotPC9yZXNwb25zaWJsZUZvcj4KLTwvUm9sZURlc2NyaXB0b3I+Ci08Um9sZURlc2NyaXB0b3IgbmFtZT0icm9sZV9CMiIgYnJpZWZEZXNjcmlwdGlvbj0iUm9sZSBCMiBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iUm9sZSBCMiBwcmVzZW50IiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9InJvbGVfQjIsX2p2U0JBVUF2RWRxRnFJdTgtY2tvbGciIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHJlZmluZWREZXNjcmlwdGlvbj0iIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPHN1cGVyQWN0aXZpdGllcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9yb2xlX0IyIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPFJvbGUgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvcm9sZV9CMiI+Ci08L1JvbGU+Ci08bW9kaWZpZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvb3V0Y29tZV9CMiI+Ci08L21vZGlmaWVzPgotPC9Sb2xlRGVzY3JpcHRvcj4KLTxXb3JrUHJvZHVjdERlc2NyaXB0b3IgbmFtZT0iYXJ0aWZhY3RfQjEiIGJyaWVmRGVzY3JpcHRpb249IkFydGlmYWN0IEIxIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJBcnRpZmFjdCBCMSBwcmVzZW50IiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSIgYWN0aXZpdHlFbnRyeVN0YXRlPSIiIGFjdGl2aXR5RXhpdFN0YXRlPSIiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJhcnRpZmFjdF9CMSxfanZTQkFrQXZFZHFGcUl1OC1ja29sZyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL2FydGlmYWN0X0IxIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPFdvcmtQcm9kdWN0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL2FydGlmYWN0X0IxIj4KLTwvV29ya1Byb2R1Y3Q+Ci08L1dvcmtQcm9kdWN0RGVzY3JpcHRvcj4KLTxXb3JrUHJvZHVjdERlc2NyaXB0b3IgbmFtZT0iZGVsaXZlcmFibGVfQjEiIGJyaWVmRGVzY3JpcHRpb249IkRlbGl2ZXJhYmxlIEIxIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJEZWxpdmVyYWJsZSBCMSBwcmVzZW50IiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSIgYWN0aXZpdHlFbnRyeVN0YXRlPSIiIGFjdGl2aXR5RXhpdFN0YXRlPSIiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJkZWxpdmVyYWJsZV9CMSxfanZTQkEwQXZFZHFGcUl1OC1ja29sZyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL2RlbGl2ZXJhYmxlX0IxIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPFdvcmtQcm9kdWN0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL2RlbGl2ZXJhYmxlX0IxIj4KLTwvV29ya1Byb2R1Y3Q+Ci08ZGVsaXZlcmFibGVQYXJ0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9hcnRpZmFjdF9CMSI+Ci08L2RlbGl2ZXJhYmxlUGFydHM+Ci08ZGVsaXZlcmFibGVQYXJ0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9vdXRjb21lX0IxIj4KLTwvZGVsaXZlcmFibGVQYXJ0cz4KLTwvV29ya1Byb2R1Y3REZXNjcmlwdG9yPgotPFdvcmtQcm9kdWN0RGVzY3JpcHRvciBuYW1lPSJvdXRjb21lX0IxIiBicmllZkRlc2NyaXB0aW9uPSJPdXRjb21lIEIxIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJPdXRjb21lIEIxIHByZXNlbnQiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIiBhY3Rpdml0eUVudHJ5U3RhdGU9IiIgYWN0aXZpdHlFeGl0U3RhdGU9IiI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9Im91dGNvbWVfQjEsX2p2U0JCRUF2RWRxRnFJdTgtY2tvbGciIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHJlZmluZWREZXNjcmlwdGlvbj0iIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPHN1cGVyQWN0aXZpdGllcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9vdXRjb21lX0IxIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPFdvcmtQcm9kdWN0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL291dGNvbWVfQjEiPgotPC9Xb3JrUHJvZHVjdD4KLTwvV29ya1Byb2R1Y3REZXNjcmlwdG9yPgotPFdvcmtQcm9kdWN0RGVzY3JpcHRvciBuYW1lPSJhcnRpZmFjdF9CMSIgYnJpZWZEZXNjcmlwdGlvbj0iQXJ0aWZhY3QgQjEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IkFydGlmYWN0IEIxIHByZXNlbnQiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIiBhY3Rpdml0eUVudHJ5U3RhdGU9IiIgYWN0aXZpdHlFeGl0U3RhdGU9IiI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9ImFydGlmYWN0X0IxLF9qdmJLOEVBdkVkcUZxSXU4LWNrb2xnIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiByZWZpbmVkRGVzY3JpcHRpb249IiI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxXb3JrUHJvZHVjdCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9hcnRpZmFjdF9CMSI+Ci08L1dvcmtQcm9kdWN0PgotPC9Xb3JrUHJvZHVjdERlc2NyaXB0b3I+Ci08V29ya1Byb2R1Y3REZXNjcmlwdG9yIG5hbWU9Im91dGNvbWVfQjEiIGJyaWVmRGVzY3JpcHRpb249Ik91dGNvbWUgQjEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9Ik91dGNvbWUgQjEgcHJlc2VudCIgcHJlZml4PSIiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiIGFjdGl2aXR5RW50cnlTdGF0ZT0iIiBhY3Rpdml0eUV4aXRTdGF0ZT0iIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0ib3V0Y29tZV9CMSxfanZiSzhVQXZFZHFGcUl1OC1ja29sZyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08V29ya1Byb2R1Y3QgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvb3V0Y29tZV9CMSI+Ci08L1dvcmtQcm9kdWN0PgotPC9Xb3JrUHJvZHVjdERlc2NyaXB0b3I+Ci08VGFza0Rlc2NyaXB0b3IgbmFtZT0idGFza19CMiIgYnJpZWZEZXNjcmlwdGlvbj0iVGFzayBCMiBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iVGFzayBCMiBwcmVzZW50IiBwcmVmaXg9IiIgaXNQbGFubmVkPSJmYWxzZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1JlcGVhdGFibGU9ImZhbHNlIiBpc09uZ29pbmc9ImZhbHNlIiBpc0V2ZW50RHJpdmVuPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0idGFza19CMixfa1lqbmdFQXZFZHFGcUl1OC1ja29sZyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL3Rhc2tfQjIiPgotPC9zdXBlckFjdGl2aXRpZXM+Ci08VGFzayBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS90YXNrX0IyIj4KLTwvVGFzaz4KLTxhZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9yb2xlX0IxIj4KLTwvYWRkaXRpb25hbGx5UGVyZm9ybWVkQnk+Ci08bWFuZGF0b3J5SW5wdXQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvYXJ0aWZhY3RfQjIiPgotPC9tYW5kYXRvcnlJbnB1dD4KLTxvcHRpb25hbElucHV0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL2RlbGl2ZXJhYmxlX0IyIj4KLTwvb3B0aW9uYWxJbnB1dD4KLTxvdXRwdXQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvb3V0Y29tZV9CMiI+Ci08L291dHB1dD4KLTxwZXJmb3JtZWRQcmltYXJpbHlCeSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS90YXNrX0IyIj4KLTwvcGVyZm9ybWVkUHJpbWFyaWx5Qnk+Ci08c2VsZWN0ZWRTdGVwcyBwYXRoPSJ0YXNrX0IyLF9aTE9Nc0I4UEVkcXNoTU5TSTA3WE9nL1N0ZXAgQjIuMSI+Ci08L3NlbGVjdGVkU3RlcHM+Ci08c2VsZWN0ZWRTdGVwcyBwYXRoPSJ0YXNrX0IyLF9aTE9Nc0I4UEVkcXNoTU5TSTA3WE9nL1N0ZXAgQjIuMiI+Ci08L3NlbGVjdGVkU3RlcHM+Ci08c2VsZWN0ZWRTdGVwcyBwYXRoPSJ0YXNrX0IyLF9aTE9Nc0I4UEVkcXNoTU5TSTA3WE9nL1N0ZXAgQjIuMyI+Ci08L3NlbGVjdGVkU3RlcHM+Ci08L1Rhc2tEZXNjcmlwdG9yPgotPFdvcmtQcm9kdWN0RGVzY3JpcHRvciBuYW1lPSJhcnRpZmFjdF9CMiIgYnJpZWZEZXNjcmlwdGlvbj0iQXJ0aWZhY3QgQjIgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IkFydGlmYWN0IEIyIHByZXNlbnQiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIiBhY3Rpdml0eUVudHJ5U3RhdGU9IiIgYWN0aXZpdHlFeGl0U3RhdGU9IiI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9ImFydGlmYWN0X0IyLF9rWV9zWUVBdkVkcUZxSXU4LWNrb2xnIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiByZWZpbmVkRGVzY3JpcHRpb249IiI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxzdXBlckFjdGl2aXRpZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvYXJ0aWZhY3RfQjIiPgotPC9zdXBlckFjdGl2aXRpZXM+Ci08V29ya1Byb2R1Y3QgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvYXJ0aWZhY3RfQjIiPgotPC9Xb3JrUHJvZHVjdD4KLTwvV29ya1Byb2R1Y3REZXNjcmlwdG9yPgotPFdvcmtQcm9kdWN0RGVzY3JpcHRvciBuYW1lPSJkZWxpdmVyYWJsZV9CMiIgYnJpZWZEZXNjcmlwdGlvbj0iRGVsaXZlcmFibGUgQjIgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IkRlbGl2ZXJhYmxlIEIyIHByZXNlbnQiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIiBhY3Rpdml0eUVudHJ5U3RhdGU9IiIgYWN0aXZpdHlFeGl0U3RhdGU9IiI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9ImRlbGl2ZXJhYmxlX0IyLF9rWV9zWVVBdkVkcUZxSXU4LWNrb2xnIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiByZWZpbmVkRGVzY3JpcHRpb249IiI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxzdXBlckFjdGl2aXRpZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvZGVsaXZlcmFibGVfQjIiPgotPC9zdXBlckFjdGl2aXRpZXM+Ci08V29ya1Byb2R1Y3QgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvZGVsaXZlcmFibGVfQjIiPgotPC9Xb3JrUHJvZHVjdD4KLTxkZWxpdmVyYWJsZVBhcnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL2FydGlmYWN0X0IyIj4KLTwvZGVsaXZlcmFibGVQYXJ0cz4KLTxkZWxpdmVyYWJsZVBhcnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL291dGNvbWVfQjIiPgotPC9kZWxpdmVyYWJsZVBhcnRzPgotPC9Xb3JrUHJvZHVjdERlc2NyaXB0b3I+Ci08V29ya1Byb2R1Y3REZXNjcmlwdG9yIG5hbWU9Im91dGNvbWVfQjIiIGJyaWVmRGVzY3JpcHRpb249Ik91dGNvbWUgQjIgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9Ik91dGNvbWUgQjIgcHJlc2VudCIgcHJlZml4PSIiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiIGFjdGl2aXR5RW50cnlTdGF0ZT0iIiBhY3Rpdml0eUV4aXRTdGF0ZT0iIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0ib3V0Y29tZV9CMixfa1lfc1lrQXZFZHFGcUl1OC1ja29sZyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL291dGNvbWVfQjIiPgotPC9zdXBlckFjdGl2aXRpZXM+Ci08V29ya1Byb2R1Y3QgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvb3V0Y29tZV9CMiI+Ci08L1dvcmtQcm9kdWN0PgotPC9Xb3JrUHJvZHVjdERlc2NyaXB0b3I+Ci08V29ya1Byb2R1Y3REZXNjcmlwdG9yIG5hbWU9ImFydGlmYWN0X0IyIiBicmllZkRlc2NyaXB0aW9uPSJBcnRpZmFjdCBCMiBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iQXJ0aWZhY3QgQjIgcHJlc2VudCIgcHJlZml4PSIiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiIGFjdGl2aXR5RW50cnlTdGF0ZT0iIiBhY3Rpdml0eUV4aXRTdGF0ZT0iIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0iYXJ0aWZhY3RfQjIsX2taSmRZRUF2RWRxRnFJdTgtY2tvbGciIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHJlZmluZWREZXNjcmlwdGlvbj0iIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPFdvcmtQcm9kdWN0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL2FydGlmYWN0X0IyIj4KLTwvV29ya1Byb2R1Y3Q+Ci08L1dvcmtQcm9kdWN0RGVzY3JpcHRvcj4KLTxXb3JrUHJvZHVjdERlc2NyaXB0b3IgbmFtZT0ib3V0Y29tZV9CMiIgYnJpZWZEZXNjcmlwdGlvbj0iT3V0Y29tZSBCMiBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iT3V0Y29tZSBCMiBwcmVzZW50IiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSIgYWN0aXZpdHlFbnRyeVN0YXRlPSIiIGFjdGl2aXR5RXhpdFN0YXRlPSIiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJvdXRjb21lX0IyLF9rWkpkWVVBdkVkcUZxSXU4LWNrb2xnIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiByZWZpbmVkRGVzY3JpcHRpb249IiI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxXb3JrUHJvZHVjdCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9vdXRjb21lX0IyIj4KLTwvV29ya1Byb2R1Y3Q+Ci08L1dvcmtQcm9kdWN0RGVzY3JpcHRvcj4KLTxUYXNrRGVzY3JpcHRvciBuYW1lPSJ0YXNrX0EyIiBicmllZkRlc2NyaXB0aW9uPSJUYXNrIEEyIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJUYXNrIEEyICIgcHJlZml4PSIiIGlzUGxhbm5lZD0iZmFsc2UiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNSZXBlYXRhYmxlPSJmYWxzZSIgaXNPbmdvaW5nPSJmYWxzZSIgaXNFdmVudERyaXZlbj0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9InRhc2tfQTIsX2EwZ2t3RUEzRWRxRnFJdTgtY2tvbGciIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHJlZmluZWREZXNjcmlwdGlvbj0iIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPHN1cGVyQWN0aXZpdGllcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS90YXNrX0EyIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPFRhc2sgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvdGFza19BMiI+Ci08L1Rhc2s+Ci08YWRkaXRpb25hbGx5UGVyZm9ybWVkQnkgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvcm9sZV9BMSI+Ci08L2FkZGl0aW9uYWxseVBlcmZvcm1lZEJ5PgotPG1hbmRhdG9yeUlucHV0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL2FydGlmYWN0X0EyIj4KLTwvbWFuZGF0b3J5SW5wdXQ+Ci08b3B0aW9uYWxJbnB1dCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9kZWxpdmVyYWJsZV9BMiI+Ci08L29wdGlvbmFsSW5wdXQ+Ci08b3V0cHV0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL291dGNvbWVfQTIiPgotPC9vdXRwdXQ+Ci08cGVyZm9ybWVkUHJpbWFyaWx5QnkgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvdGFza19BMiI+Ci08L3BlcmZvcm1lZFByaW1hcmlseUJ5PgotPHNlbGVjdGVkU3RlcHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3Rhc2tfQTIvdGFza19BMixfNzVOUXdBLVBFZHFMMk8xUEpWOWNaQS9TdGVwIEEyLjEiPgotPC9zZWxlY3RlZFN0ZXBzPgotPHNlbGVjdGVkU3RlcHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3Rhc2tfQTIvdGFza19BMixfNzVOUXdBLVBFZHFMMk8xUEpWOWNaQS9TdGVwIEEyLjIiPgotPC9zZWxlY3RlZFN0ZXBzPgotPHNlbGVjdGVkU3RlcHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3Rhc2tfQTIvdGFza19BMixfNzVOUXdBLVBFZHFMMk8xUEpWOWNaQS9TdGVwIEEyLjMiPgotPC9zZWxlY3RlZFN0ZXBzPgotPC9UYXNrRGVzY3JpcHRvcj4KLTxXb3JrUHJvZHVjdERlc2NyaXB0b3IgbmFtZT0iYXJ0aWZhY3RfQTIiIGJyaWVmRGVzY3JpcHRpb249IkFydGlmYWN0IEEyIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJBcnRpZmFjdCBBMiBwcmVzZW50IiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSIgYWN0aXZpdHlFbnRyeVN0YXRlPSIiIGFjdGl2aXR5RXhpdFN0YXRlPSIiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJhcnRpZmFjdF9BMixfYTF0ZW9FQTNFZHFGcUl1OC1ja29sZyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL2FydGlmYWN0X0EyIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPFdvcmtQcm9kdWN0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL2FydGlmYWN0X0EyIj4KLTwvV29ya1Byb2R1Y3Q+Ci08L1dvcmtQcm9kdWN0RGVzY3JpcHRvcj4KLTxXb3JrUHJvZHVjdERlc2NyaXB0b3IgbmFtZT0iZGVsaXZlcmFibGVfQTIiIGJyaWVmRGVzY3JpcHRpb249IkRlbGl2ZXJhYmxlIEEyIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJEZWxpdmVyYWJsZSBBMiBwcmVzZW50IiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSIgYWN0aXZpdHlFbnRyeVN0YXRlPSIiIGFjdGl2aXR5RXhpdFN0YXRlPSIiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJkZWxpdmVyYWJsZV9BMixfYTJkRmdFQTNFZHFGcUl1OC1ja29sZyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL2RlbGl2ZXJhYmxlX0EyIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPFdvcmtQcm9kdWN0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL2RlbGl2ZXJhYmxlX0EyIj4KLTwvV29ya1Byb2R1Y3Q+Ci08ZGVsaXZlcmFibGVQYXJ0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9hcnRpZmFjdF9BMiI+Ci08L2RlbGl2ZXJhYmxlUGFydHM+Ci08ZGVsaXZlcmFibGVQYXJ0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9vdXRjb21lX0EyIj4KLTwvZGVsaXZlcmFibGVQYXJ0cz4KLTwvV29ya1Byb2R1Y3REZXNjcmlwdG9yPgotPFdvcmtQcm9kdWN0RGVzY3JpcHRvciBuYW1lPSJvdXRjb21lX0EyIiBicmllZkRlc2NyaXB0aW9uPSJPdXRjb21lIEExIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJPdXRjb21lIEEyIHByZXNlbnQiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIiBhY3Rpdml0eUVudHJ5U3RhdGU9IiIgYWN0aXZpdHlFeGl0U3RhdGU9IiI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9Im91dGNvbWVfQTIsX2EzTXNZRUEzRWRxRnFJdTgtY2tvbGciIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHJlZmluZWREZXNjcmlwdGlvbj0iIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPHN1cGVyQWN0aXZpdGllcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9vdXRjb21lX0EyIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPFdvcmtQcm9kdWN0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL291dGNvbWVfQTIiPgotPC9Xb3JrUHJvZHVjdD4KLTwvV29ya1Byb2R1Y3REZXNjcmlwdG9yPgotPFdvcmtQcm9kdWN0RGVzY3JpcHRvciBuYW1lPSJhcnRpZmFjdF9BMiIgYnJpZWZEZXNjcmlwdGlvbj0iQXJ0aWZhY3QgQTIgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IkFydGlmYWN0IEEyIHByZXNlbnQiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIiBhY3Rpdml0eUVudHJ5U3RhdGU9IiIgYWN0aXZpdHlFeGl0U3RhdGU9IiI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9ImFydGlmYWN0X0EyLF9hNEdFUUVBM0VkcUZxSXU4LWNrb2xnIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiByZWZpbmVkRGVzY3JpcHRpb249IiI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxXb3JrUHJvZHVjdCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9hcnRpZmFjdF9BMiI+Ci08L1dvcmtQcm9kdWN0PgotPC9Xb3JrUHJvZHVjdERlc2NyaXB0b3I+Ci08V29ya1Byb2R1Y3REZXNjcmlwdG9yIG5hbWU9Im91dGNvbWVfQTIiIGJyaWVmRGVzY3JpcHRpb249Ik91dGNvbWUgQTEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9Ik91dGNvbWUgQTIgcHJlc2VudCIgcHJlZml4PSIiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiIGFjdGl2aXR5RW50cnlTdGF0ZT0iIiBhY3Rpdml0eUV4aXRTdGF0ZT0iIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0ib3V0Y29tZV9BMixfYTQxcklFQTNFZHFGcUl1OC1ja29sZyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08V29ya1Byb2R1Y3QgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvb3V0Y29tZV9BMiI+Ci08L1dvcmtQcm9kdWN0PgotPC9Xb3JrUHJvZHVjdERlc2NyaXB0b3I+Ci08RGlhZ3JhbSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxHcmFwaE5vZGUgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvY29udGFpbmVyPgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSIiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2dyYXBoRWxlbWVudD4KLTxlbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvZWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvR3JhcGhOb2RlPgotPEdyYXBoTm9kZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9jb250YWluZXI+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IiI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9lbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9HcmFwaE5vZGU+Ci08R3JhcGhOb2RlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2NvbnRhaW5lcj4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9ncmFwaEVsZW1lbnQ+Ci08ZWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2VsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0dyYXBoTm9kZT4KLTxHcmFwaE5vZGUgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvY29udGFpbmVyPgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSIiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2dyYXBoRWxlbWVudD4KLTxlbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvZWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvR3JhcGhOb2RlPgotPEdyYXBoTm9kZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9jb250YWluZXI+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IiI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9lbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9HcmFwaE5vZGU+Ci08R3JhcGhOb2RlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2NvbnRhaW5lcj4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9ncmFwaEVsZW1lbnQ+Ci08ZWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2VsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0dyYXBoTm9kZT4KLTxHcmFwaE5vZGUgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvY29udGFpbmVyPgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSIiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2dyYXBoRWxlbWVudD4KLTxlbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvZWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvR3JhcGhOb2RlPgotPEdyYXBoTm9kZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9jb250YWluZXI+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IiI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9lbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9HcmFwaE5vZGU+Ci08R3JhcGhOb2RlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2NvbnRhaW5lcj4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9ncmFwaEVsZW1lbnQ+Ci08ZWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2VsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0dyYXBoTm9kZT4KLTxHcmFwaE5vZGUgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvY29udGFpbmVyPgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSIiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2dyYXBoRWxlbWVudD4KLTxlbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvZWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvR3JhcGhOb2RlPgotPEdyYXBoTm9kZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9jb250YWluZXI+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IiI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9lbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9HcmFwaE5vZGU+Ci08R3JhcGhOb2RlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2NvbnRhaW5lcj4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9ncmFwaEVsZW1lbnQ+Ci08ZWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2VsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0dyYXBoTm9kZT4KLTxHcmFwaE5vZGUgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvY29udGFpbmVyPgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSIiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2dyYXBoRWxlbWVudD4KLTxlbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvZWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvR3JhcGhOb2RlPgotPEdyYXBoTm9kZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9jb250YWluZXI+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IiI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9lbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9HcmFwaE5vZGU+Ci08R3JhcGhOb2RlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2NvbnRhaW5lcj4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9ncmFwaEVsZW1lbnQ+Ci08ZWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2VsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0dyYXBoTm9kZT4KLTxHcmFwaE5vZGUgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvY29udGFpbmVyPgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSIiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2dyYXBoRWxlbWVudD4KLTxlbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvZWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvR3JhcGhOb2RlPgotPEdyYXBoTm9kZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9jb250YWluZXI+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IiI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9lbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9HcmFwaE5vZGU+Ci08R3JhcGhOb2RlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2NvbnRhaW5lcj4KLTxQcm9wZXJ0eSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBrZXk9IndwQ29tcG9zaXRlVHlwZSIgdmFsdWU9IjEiPgotPC9Qcm9wZXJ0eT4KLTxHcmFwaEVkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvY29udGFpbmVyPgotPGFuY2hvciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2FuY2hvcj4KLTwvR3JhcGhFZGdlPgotPEdyYXBoRWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9jb250YWluZXI+Ci08YW5jaG9yIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvYW5jaG9yPgotPC9HcmFwaEVkZ2U+Ci08R3JhcGhFZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2NvbnRhaW5lcj4KLTxhbmNob3IgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9hbmNob3I+Ci08L0dyYXBoRWRnZT4KLTxHcmFwaEVkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvY29udGFpbmVyPgotPGFuY2hvciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2FuY2hvcj4KLTwvR3JhcGhFZGdlPgotPEdyYXBoRWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9jb250YWluZXI+Ci08YW5jaG9yIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvYW5jaG9yPgotPC9HcmFwaEVkZ2U+Ci08R3JhcGhDb25uZWN0b3IgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGdyYXBoRWRnZSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2dyYXBoRWRnZT4KLTwvR3JhcGhDb25uZWN0b3I+Ci08R3JhcGhDb25uZWN0b3IgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGdyYXBoRWRnZSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2dyYXBoRWRnZT4KLTwvR3JhcGhDb25uZWN0b3I+Ci08R3JhcGhDb25uZWN0b3IgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGdyYXBoRWRnZSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2dyYXBoRWRnZT4KLTwvR3JhcGhDb25uZWN0b3I+Ci08R3JhcGhDb25uZWN0b3IgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGdyYXBoRWRnZSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2dyYXBoRWRnZT4KLTwvR3JhcGhDb25uZWN0b3I+Ci08R3JhcGhDb25uZWN0b3IgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGdyYXBoRWRnZSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2dyYXBoRWRnZT4KLTwvR3JhcGhDb25uZWN0b3I+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IiI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9lbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9HcmFwaE5vZGU+Ci08R3JhcGhOb2RlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2NvbnRhaW5lcj4KLTxQcm9wZXJ0eSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBrZXk9IndwQ29tcG9zaXRlVHlwZSIgdmFsdWU9IjIiPgotPC9Qcm9wZXJ0eT4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9ncmFwaEVsZW1lbnQ+Ci08ZWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2VsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0dyYXBoTm9kZT4KLTxHcmFwaE5vZGUgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvY29udGFpbmVyPgotPFByb3BlcnR5IG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIGtleT0id3BDb21wb3NpdGVUeXBlIiB2YWx1ZT0iMSI+Ci08L1Byb3BlcnR5PgotPEdyYXBoRWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9jb250YWluZXI+Ci08YW5jaG9yIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvYW5jaG9yPgotPC9HcmFwaEVkZ2U+Ci08R3JhcGhFZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2NvbnRhaW5lcj4KLTxhbmNob3IgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9hbmNob3I+Ci08L0dyYXBoRWRnZT4KLTxHcmFwaENvbm5lY3RvciBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9ncmFwaEVsZW1lbnQ+Ci08Z3JhcGhFZGdlIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvZ3JhcGhFZGdlPgotPC9HcmFwaENvbm5lY3Rvcj4KLTxHcmFwaENvbm5lY3RvciBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9ncmFwaEVsZW1lbnQ+Ci08Z3JhcGhFZGdlIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvZ3JhcGhFZGdlPgotPC9HcmFwaENvbm5lY3Rvcj4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9ncmFwaEVsZW1lbnQ+Ci08ZWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2VsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0dyYXBoTm9kZT4KLTxHcmFwaE5vZGUgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvY29udGFpbmVyPgotPFByb3BlcnR5IG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIGtleT0id3BDb21wb3NpdGVUeXBlIiB2YWx1ZT0iMiI+Ci08L1Byb3BlcnR5PgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSIiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2dyYXBoRWxlbWVudD4KLTxlbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvZWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvR3JhcGhOb2RlPgotPEdyYXBoTm9kZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9jb250YWluZXI+Ci08UHJvcGVydHkgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIga2V5PSJ3cENvbXBvc2l0ZVR5cGUiIHZhbHVlPSIxIj4KLTwvUHJvcGVydHk+Ci08R3JhcGhFZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2NvbnRhaW5lcj4KLTxhbmNob3IgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9hbmNob3I+Ci08L0dyYXBoRWRnZT4KLTxHcmFwaEVkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvY29udGFpbmVyPgotPGFuY2hvciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2FuY2hvcj4KLTwvR3JhcGhFZGdlPgotPEdyYXBoQ29ubmVjdG9yIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2dyYXBoRWxlbWVudD4KLTxncmFwaEVkZ2UgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9ncmFwaEVkZ2U+Ci08L0dyYXBoQ29ubmVjdG9yPgotPEdyYXBoQ29ubmVjdG9yIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2dyYXBoRWxlbWVudD4KLTxncmFwaEVkZ2UgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9ncmFwaEVkZ2U+Ci08L0dyYXBoQ29ubmVjdG9yPgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSIiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2dyYXBoRWxlbWVudD4KLTxlbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvZWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvR3JhcGhOb2RlPgotPEdyYXBoTm9kZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9jb250YWluZXI+Ci08UHJvcGVydHkgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIga2V5PSJ3cENvbXBvc2l0ZVR5cGUiIHZhbHVlPSIyIj4KLTwvUHJvcGVydHk+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IiI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9lbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9HcmFwaE5vZGU+Ci08R3JhcGhOb2RlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2NvbnRhaW5lcj4KLTxQcm9wZXJ0eSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBrZXk9IndwQ29tcG9zaXRlVHlwZSIgdmFsdWU9IjEiPgotPC9Qcm9wZXJ0eT4KLTxHcmFwaEVkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvY29udGFpbmVyPgotPGFuY2hvciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2FuY2hvcj4KLTwvR3JhcGhFZGdlPgotPEdyYXBoQ29ubmVjdG9yIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2dyYXBoRWxlbWVudD4KLTxncmFwaEVkZ2UgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9ncmFwaEVkZ2U+Ci08L0dyYXBoQ29ubmVjdG9yPgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSIiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2dyYXBoRWxlbWVudD4KLTxlbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvZWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvR3JhcGhOb2RlPgotPEdyYXBoTm9kZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9jb250YWluZXI+Ci08UHJvcGVydHkgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIga2V5PSJ3cENvbXBvc2l0ZVR5cGUiIHZhbHVlPSIyIj4KLTwvUHJvcGVydHk+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IiI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9lbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9HcmFwaE5vZGU+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IkFjdGl2aXR5IERldGFpbCI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9lbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9EaWFncmFtPgotPC9Qcm9jZXNzUGFja2FnZT4KLTxEaWFncmFtIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSJBY3Rpdml0eSBEZXRhaWwiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEiPgotPC9ncmFwaEVsZW1lbnQ+Ci08ZWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEiPgotPC9lbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9EaWFncmFtPgotPENhcGFiaWxpdHlQYXR0ZXJuIG5hbWU9IkNQIEExIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IkNQIEExIiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzUmVwZWF0YWJsZT0iZmFsc2UiIGlzT25nb2luZz0iZmFsc2UiIGlzRXZlbnREcml2ZW49ImZhbHNlIiB2YXJpYWJpbGl0eVR5cGU9Im5hIiBpc0VuYWN0YWJsZT0iZmFsc2UiPgotPFByb2Nlc3NEZXNjcmlwdGlvbiBuYW1lPSJDUCBBMSxfZEJodmtVQXZFZHFGcUl1OC1ja29sZyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiBwdXJwb3NlPSIiIGFsdGVybmF0aXZlcz0iIiBob3d0b1N0YWZmPSIiIGV4dGVybmFsSWQ9IiIgc2NvcGU9IiIgdXNhZ2VOb3Rlcz0iIj4KLTwvUHJvY2Vzc0Rlc2NyaXB0aW9uPgotPGJyZWFrZG93bkVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL0FjdDEiPgotPC9icmVha2Rvd25FbGVtZW50cz4KLTxkZWZhdWx0Q29udGV4dCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQ1AgQTEiPgotPC9kZWZhdWx0Q29udGV4dD4KLTx2YWxpZENvbnRleHQgcGF0aD0iQ29uZmlnIEEiPgotPC92YWxpZENvbnRleHQ+Ci08L0NhcGFiaWxpdHlQYXR0ZXJuPgotPC9Qcm9jZXNzQ29tcG9uZW50PgotPC9Qcm9jZXNzUGFja2FnZT4KLTwvQ29udGVudFBhY2thZ2U+Ci08UHJvY2Vzc1BhY2thZ2UgbmFtZT0iRGVsaXZlcnlQcm9jZXNzZXMiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgZ2xvYmFsPSJmYWxzZSI+Ci08UHJvY2Vzc0NvbXBvbmVudCBuYW1lPSJkZWxQcm9jX0ExIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGdsb2JhbD0iZmFsc2UiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIj4KLTxwYXJlbnRQYWNrYWdlIHBhdGg9IlBsdWcgQS9EZWxpdmVyeVByb2Nlc3Nlcy9kZWxQcm9jX0ExIj4KLTwvcGFyZW50UGFja2FnZT4KLTxEZWxpdmVyeVByb2Nlc3MgbmFtZT0iZGVsUHJvY19BMSIgYnJpZWZEZXNjcmlwdGlvbj0iRGVsUHJvYyBBMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iRGVsUHJvYyBBMSBwcmVzZW50IiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzUmVwZWF0YWJsZT0iZmFsc2UiIGlzT25nb2luZz0iZmFsc2UiIGlzRXZlbnREcml2ZW49ImZhbHNlIiB2YXJpYWJpbGl0eVR5cGU9Im5hIiBpc0VuYWN0YWJsZT0iZmFsc2UiPgotPERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uIG5hbWU9IkRlbFByb2MgQTEsX1c2YTRjUkJORWRxQnM3S2hkVkxSTEEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSJEZWxQcm9jIEExIG1haW4iIGtleUNvbnNpZGVyYXRpb25zPSJEZWxQcm9jIEExIGtleSBjb24iIHVzYWdlR3VpZGFuY2U9IiIgcHVycG9zZT0iRGVsUHJvYyBBMSBwb3Jwb2lzZSIgYWx0ZXJuYXRpdmVzPSJEZWxQcm9jIEExIGFsdGVybiIgaG93dG9TdGFmZj0iRGVsUHJvYyBBMSBzdGFmZiIgZXh0ZXJuYWxJZD0iRGVsUHJvYyBBMSBleHRlcm5JRCIgc2NvcGU9IkRlbFByb2MgQTEgc2NvcGUiIHVzYWdlTm90ZXM9IkRlbFByb2MgQTEgdXNhZ2UiIHNjYWxlPSJEZWxQcm9jIEExIHNjYWxlIiBwcm9qZWN0Q2hhcmFjdGVyaXN0aWNzPSJEZWxQcm9jIEExIHByb2ogY2hhciIgcmlza0xldmVsPSJEZWxQcm9jIEExIHJpc2siIGVzdGltYXRpbmdUZWNobmlxdWU9IkRlbFByb2MgQTEgZXN0IHRlY2giIHByb2plY3RNZW1iZXJFeHBlcnRpc2U9IkRlbFByb2MgQTEgZXhwZXJ0aXNlIiB0eXBlT2ZDb250cmFjdD0iRGVsUHJvYyBBMSBjb250eXBlIj4KLTwvRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24+Ci08ZGVmYXVsdENvbnRleHQgcGF0aD0iUGx1ZyBBL0RlbGl2ZXJ5UHJvY2Vzc2VzL2RlbFByb2NfQTEvZGVsUHJvY19BMSI+Ci08L2RlZmF1bHRDb250ZXh0PgotPHZhbGlkQ29udGV4dCBwYXRoPSJDb25maWcgQSI+Ci08L3ZhbGlkQ29udGV4dD4KLTwvRGVsaXZlcnlQcm9jZXNzPgotPC9Qcm9jZXNzQ29tcG9uZW50PgotPFByb2Nlc3NQYWNrYWdlIG5hbWU9ImRlbFByb2NQYWsgQTEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgZ2xvYmFsPSJmYWxzZSI+Ci08cGFyZW50UGFja2FnZSBwYXRoPSJQbHVnIEEvRGVsaXZlcnlQcm9jZXNzZXMvZGVsUHJvY1BhayBBMSI+Ci08L3BhcmVudFBhY2thZ2U+Ci08UHJvY2Vzc0NvbXBvbmVudCBuYW1lPSJkZWxQcm9jUGFrX0ExLjEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgZ2xvYmFsPSJmYWxzZSIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiPgotPHBhcmVudFBhY2thZ2UgcGF0aD0iUGx1ZyBBL0RlbGl2ZXJ5UHJvY2Vzc2VzL2RlbFByb2NQYWsgQTEvZGVsUHJvY1Bha19BMS4xIj4KLTwvcGFyZW50UGFja2FnZT4KLTxEZWxpdmVyeVByb2Nlc3MgbmFtZT0iZGVsUHJvY1Bha19BMS4xIiBicmllZkRlc2NyaXB0aW9uPSJEZWxQcm9jUGFrIEExLjEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IkRlbFByb2NQYWsgQTEuMSBwcmVzZW50IiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzUmVwZWF0YWJsZT0iZmFsc2UiIGlzT25nb2luZz0iZmFsc2UiIGlzRXZlbnREcml2ZW49ImZhbHNlIiB2YXJpYWJpbGl0eVR5cGU9Im5hIiBpc0VuYWN0YWJsZT0iZmFsc2UiPgotPERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uIG5hbWU9ImRlbFByb2NQYWtfQTEuMSxfdXE1SzhSTTFFZHFxbmRpLWdEdXhwdyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249IkRlbFByb2NQYWsgQTEuMSBtYWluIiBrZXlDb25zaWRlcmF0aW9ucz0iRGVsUHJvY1BhayBBMS4xIGtleSIgdXNhZ2VHdWlkYW5jZT0iIiBwdXJwb3NlPSJEZWxQcm9jUGFrIEExLjEgcG9ycG9pc2UiIGFsdGVybmF0aXZlcz0iRGVsUHJvY1BhayBBMS4xIGFsdCIgaG93dG9TdGFmZj0iRGVsUHJvY1BhayBBMS4xIHN0YWZmIiBleHRlcm5hbElkPSJEZWxQcm9jUGFrIEExLjEgZXh0ZXJuSUQiIHNjb3BlPSJEZWxQcm9jUGFrIEExLjEgc2NvcGUiIHVzYWdlTm90ZXM9IkRlbFByb2NQYWsgQTEuMSB1c2FnZSIgc2NhbGU9IkRlbFByb2NQYWsgQTEuMSBzY2FsZSIgcHJvamVjdENoYXJhY3RlcmlzdGljcz0iRGVsUHJvY1BhayBBMS4xIGNoYXIiIHJpc2tMZXZlbD0iRGVsUHJvY1BhayBBMS4xIHJpc2siIGVzdGltYXRpbmdUZWNobmlxdWU9IkRlbFByb2NQYWsgQTEuMSZhbXA7bmJzcDtlc3RpbWF0aW5nIHRlY2gmbHQ7IS0tU3RhcnRGcmFnbWVudC0tJmd0OyZsdDshLS1FbmRGcmFnbWVudC0tJmd0OyIgcHJvamVjdE1lbWJlckV4cGVydGlzZT0iRGVsUHJvY1BhayBBMS4xIGV4cGVydGlzZSIgdHlwZU9mQ29udHJhY3Q9IkRlbFByb2NQYWsgQTEuMSZhbXA7bmJzcDtjb250cmFjdCI+Ci08L0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uPgotPGRlZmF1bHRDb250ZXh0IHBhdGg9IlBsdWcgQS9EZWxpdmVyeVByb2Nlc3Nlcy9kZWxQcm9jUGFrIEExL2RlbFByb2NQYWtfQTEuMS9kZWxQcm9jUGFrX0ExLjEiPgotPC9kZWZhdWx0Q29udGV4dD4KLTx2YWxpZENvbnRleHQgcGF0aD0iQ29uZmlnIEEiPgotPC92YWxpZENvbnRleHQ+Ci08L0RlbGl2ZXJ5UHJvY2Vzcz4KLTwvUHJvY2Vzc0NvbXBvbmVudD4KLTwvUHJvY2Vzc1BhY2thZ2U+Ci08L1Byb2Nlc3NQYWNrYWdlPgotPFByb2Nlc3NQYWNrYWdlIG5hbWU9IlByb2Nlc3NDb250cmlidXRpb25zIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGdsb2JhbD0iZmFsc2UiPgotPC9Qcm9jZXNzUGFja2FnZT4KLTwvTWV0aG9kUGx1Z2luPgotPE1ldGhvZFBsdWdpbiBuYW1lPSJQbHVnIEIiIGJyaWVmRGVzY3JpcHRpb249IlBsdWcgQiBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iUGx1ZyBCIGFydGh1ciIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiB1c2VyQ2hhbmdlYWJsZT0idHJ1ZSI+Ci08Q29udGVudFBhY2thZ2UgbmFtZT0iQ29udGVudCIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBnbG9iYWw9ImZhbHNlIj4KLTxDb250ZW50UGFja2FnZSBuYW1lPSJDYXRlZ29yaWVzIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGdsb2JhbD0iZmFsc2UiPgotPHBhcmVudFBhY2thZ2UgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2F0ZWdvcmllcyI+Ci08L3BhcmVudFBhY2thZ2U+Ci08Q29udGVudFBhY2thZ2UgbmFtZT0iRG9tYWlucyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBnbG9iYWw9ImZhbHNlIj4KLTxwYXJlbnRQYWNrYWdlIHBhdGg9IlBsdWcgQi9Db250ZW50L0NhdGVnb3JpZXMvRG9tYWlucyI+Ci08L3BhcmVudFBhY2thZ2U+Ci08RG9tYWluIG5hbWU9ImRvbWFpbl9CMSIgYnJpZWZEZXNjcmlwdGlvbj0iRG9tYWluIEIxIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJEb21haW4gQjEgcHJlc2VudCIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08Q29udGVudERlc2NyaXB0aW9uIG5hbWU9ImRvbWFpbl9CMSxfbWRyellCOHlFZHFnQklUdUlDTEpFdyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURhdGU9IlR1ZSBTZXAgMDYgMTc6MDI6MDQgUERUIDIwMDUiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249IkRvbWFpbiBCMSBtYWluIiBrZXlDb25zaWRlcmF0aW9ucz0iRG9tYWluIEIxIGtleSI+Ci08L0NvbnRlbnREZXNjcmlwdGlvbj4KLTxzdXBwb3J0aW5nTWF0ZXJpYWxzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9zdXBwb3J0aW5nX21hdGVyaWFsX0IxIj4KLTwvc3VwcG9ydGluZ01hdGVyaWFscz4KLTxjb25jZXB0c0FuZFBhcGVycyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvY29uY2VwdF9CMSI+Ci08L2NvbmNlcHRzQW5kUGFwZXJzPgotPGNvbmNlcHRzQW5kUGFwZXJzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS93aGl0ZXBhcGVyX0IxIj4KLTwvY29uY2VwdHNBbmRQYXBlcnM+Ci08Y2hlY2tsaXN0cyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvY2hlY2tsaXN0X0IxIj4KLTwvY2hlY2tsaXN0cz4KLTxndWlkZWxpbmVzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9ndWlkZWxpbmVfQjEiPgotPC9ndWlkZWxpbmVzPgotPGV4YW1wbGVzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9leGFtcGxlX0IxIj4KLTwvZXhhbXBsZXM+Ci08YXNzZXRzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9yZXVzYWJsZV9hc3NldF9CMSI+Ci08L2Fzc2V0cz4KLTx3b3JrUHJvZHVjdHMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL2FydGlmYWN0X0IxIj4KLTwvd29ya1Byb2R1Y3RzPgotPHdvcmtQcm9kdWN0cyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvZGVsaXZlcmFibGVfQjEiPgotPC93b3JrUHJvZHVjdHM+Ci08d29ya1Byb2R1Y3RzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9vdXRjb21lX0IxIj4KLTwvd29ya1Byb2R1Y3RzPgotPC9Eb21haW4+Ci08RG9tYWluIG5hbWU9ImRvbWFpbl9CMiIgYnJpZWZEZXNjcmlwdGlvbj0iRG9tYWluIEIyIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJEb21haW4gQjIgcHJlc2VudCIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08Q29udGVudERlc2NyaXB0aW9uIG5hbWU9ImRvbWFpbl9CMixfcmFvT2dCOHlFZHFnQklUdUlDTEpFdyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURhdGU9IlR1ZSBTZXAgMDYgMTc6MDI6MzcgUERUIDIwMDUiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249IkRvbWFpbiBCMiBtYWluIiBrZXlDb25zaWRlcmF0aW9ucz0iRG9tYWluIEIyIGtleSI+Ci08L0NvbnRlbnREZXNjcmlwdGlvbj4KLTxzdXBwb3J0aW5nTWF0ZXJpYWxzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9zdXBwb3J0aW5nX21hdGVyaWFsX0IyIj4KLTwvc3VwcG9ydGluZ01hdGVyaWFscz4KLTxjb25jZXB0c0FuZFBhcGVycyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvY29uY2VwdF9CMiI+Ci08L2NvbmNlcHRzQW5kUGFwZXJzPgotPGNvbmNlcHRzQW5kUGFwZXJzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS93aGl0ZXBhcGVyX0IyIj4KLTwvY29uY2VwdHNBbmRQYXBlcnM+Ci08Y2hlY2tsaXN0cyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvY2hlY2tsaXN0X0IyIj4KLTwvY2hlY2tsaXN0cz4KLTxndWlkZWxpbmVzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9ndWlkZWxpbmVfQjIiPgotPC9ndWlkZWxpbmVzPgotPGV4YW1wbGVzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9leGFtcGxlX0IyIj4KLTwvZXhhbXBsZXM+Ci08YXNzZXRzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9yZXVzYWJsZV9hc3NldF9CMiI+Ci08L2Fzc2V0cz4KLTx3b3JrUHJvZHVjdHMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL2FydGlmYWN0X0IyIj4KLTwvd29ya1Byb2R1Y3RzPgotPHdvcmtQcm9kdWN0cyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvb3V0Y29tZV9CMiI+Ci08L3dvcmtQcm9kdWN0cz4KLTwvRG9tYWluPgotPC9Db250ZW50UGFja2FnZT4KLTxDb250ZW50UGFja2FnZSBuYW1lPSJEaXNjaXBsaW5lcyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBnbG9iYWw9ImZhbHNlIj4KLTxwYXJlbnRQYWNrYWdlIHBhdGg9IlBsdWcgQi9Db250ZW50L0NhdGVnb3JpZXMvRGlzY2lwbGluZXMiPgotPC9wYXJlbnRQYWNrYWdlPgotPERpc2NpcGxpbmVHcm91cGluZyBuYW1lPSJkaXNjaXBsaW5lX2dyb3VwaW5nX0IxIiBicmllZkRlc2NyaXB0aW9uPSJEaXNjaXBsaW5lIEdyb3VwaW5nIEIxIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJEaXNjaXBsaW5lIEdyb3VwaW5nIEIxIHByZXNlbnQiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPENvbnRlbnREZXNjcmlwdGlvbiBuYW1lPSJkaXNjaXBsaW5lX2dyb3VwaW5nX0IxLF9TWk14WUI4eUVkcWdCSVR1SUNMSkV3IiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iVHVlIFNlcCAwNiAxNzowMDoxOSBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iRGlzY2lwbGluZSBHcm91cGluZyBCMSBtYWluIiBrZXlDb25zaWRlcmF0aW9ucz0iRGlzY2lwbGluZSBHcm91cGluZyBCMSBrZXkiPgotPC9Db250ZW50RGVzY3JpcHRpb24+Ci08ZGlzY2lwbGluZXMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2F0ZWdvcmllcy9EaXNjaXBsaW5lcy9kaXNjaXBsaW5lX0IxIj4KLTwvZGlzY2lwbGluZXM+Ci08L0Rpc2NpcGxpbmVHcm91cGluZz4KLTxEaXNjaXBsaW5lIG5hbWU9ImRpc2NpcGxpbmVfQjEiIGJyaWVmRGVzY3JpcHRpb249IkRpc2NpcGxpbmUgQjEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IkRpc2NpcGxpbmUgQjEgcHJlc2VudCIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08Q29udGVudERlc2NyaXB0aW9uIG5hbWU9ImRpc2NpcGxpbmVfQjEsX2NZNTd3Qjh5RWRxZ0JJVHVJQ0xKRXciIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJUdWUgU2VwIDA2IDE3OjAwOjU3IFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSJEaXNjaXBsaW5lIEIxIG1haW4iIGtleUNvbnNpZGVyYXRpb25zPSJEaXNjaXBsaW5lIEIxIGtleSI+Ci08L0NvbnRlbnREZXNjcmlwdGlvbj4KLTxzdXBwb3J0aW5nTWF0ZXJpYWxzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9zdXBwb3J0aW5nX21hdGVyaWFsX0IxIj4KLTwvc3VwcG9ydGluZ01hdGVyaWFscz4KLTxjb25jZXB0c0FuZFBhcGVycyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvY29uY2VwdF9CMSI+Ci08L2NvbmNlcHRzQW5kUGFwZXJzPgotPGNvbmNlcHRzQW5kUGFwZXJzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS93aGl0ZXBhcGVyX0IxIj4KLTwvY29uY2VwdHNBbmRQYXBlcnM+Ci08Y2hlY2tsaXN0cyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvY2hlY2tsaXN0X0IxIj4KLTwvY2hlY2tsaXN0cz4KLTxndWlkZWxpbmVzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9ndWlkZWxpbmVfQjEiPgotPC9ndWlkZWxpbmVzPgotPGV4YW1wbGVzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9leGFtcGxlX0IxIj4KLTwvZXhhbXBsZXM+Ci08YXNzZXRzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9yZXVzYWJsZV9hc3NldF9CMSI+Ci08L2Fzc2V0cz4KLTx0YXNrcyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvdGFza19CMSI+Ci08L3Rhc2tzPgotPHJlZmVyZW5jZVdvcmtmbG93cyBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0IxL2NhcFBhdF9CMS9jYXBQYXRfQjEiPgotPC9yZWZlcmVuY2VXb3JrZmxvd3M+Ci08L0Rpc2NpcGxpbmU+Ci08RGlzY2lwbGluZSBuYW1lPSJkaXNjaXBsaW5lX0IyIiBicmllZkRlc2NyaXB0aW9uPSJEaXNjaXBsaW5lIEIyIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJEaXNjaXBsaW5lIEIyIHByZXNlbnQiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPENvbnRlbnREZXNjcmlwdGlvbiBuYW1lPSJkaXNjaXBsaW5lX0IyLF9oOWZsc0I4eUVkcWdCSVR1SUNMSkV3IiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iVHVlIFNlcCAwNiAxNzowMTozNCBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iJmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICBEaXNjaXBsaW5lIEIyIG1haW4mIzEzOyYjMTA7Jmx0Oy9wJmd0OyIga2V5Q29uc2lkZXJhdGlvbnM9IkRpc2NpcGxpbmUgQjIga2V5Ij4KLTwvQ29udGVudERlc2NyaXB0aW9uPgotPHN1cHBvcnRpbmdNYXRlcmlhbHMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL3N1cHBvcnRpbmdfbWF0ZXJpYWxfQjIiPgotPC9zdXBwb3J0aW5nTWF0ZXJpYWxzPgotPGNvbmNlcHRzQW5kUGFwZXJzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9jb25jZXB0X0IyIj4KLTwvY29uY2VwdHNBbmRQYXBlcnM+Ci08Y29uY2VwdHNBbmRQYXBlcnMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL3doaXRlcGFwZXJfQjIiPgotPC9jb25jZXB0c0FuZFBhcGVycz4KLTxjaGVja2xpc3RzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9jaGVja2xpc3RfQjIiPgotPC9jaGVja2xpc3RzPgotPGd1aWRlbGluZXMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL2d1aWRlbGluZV9CMiI+Ci08L2d1aWRlbGluZXM+Ci08ZXhhbXBsZXMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL2V4YW1wbGVfQjIiPgotPC9leGFtcGxlcz4KLTxhc3NldHMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL3JldXNhYmxlX2Fzc2V0X0IyIj4KLTwvYXNzZXRzPgotPHRhc2tzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS90YXNrX0IyIj4KLTwvdGFza3M+Ci08cmVmZXJlbmNlV29ya2Zsb3dzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQjEvY2FwUGF0UGFrX0IxLjEvY2FwUGF0X0IxLjEvY2FwUGF0X0IxLjEiPgotPC9yZWZlcmVuY2VXb3JrZmxvd3M+Ci08L0Rpc2NpcGxpbmU+Ci08L0NvbnRlbnRQYWNrYWdlPgotPENvbnRlbnRQYWNrYWdlIG5hbWU9IlJvbGVTZXRzIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGdsb2JhbD0iZmFsc2UiPgotPHBhcmVudFBhY2thZ2UgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2F0ZWdvcmllcy9Sb2xlU2V0cyI+Ci08L3BhcmVudFBhY2thZ2U+Ci08Um9sZVNldEdyb3VwaW5nIG5hbWU9InJvbGVfc2V0X2dyb3VwaW5nX0IxIiBicmllZkRlc2NyaXB0aW9uPSJSb2xlIFNldCBHcm91cGluZyBCMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iUm9sZSBTZXQgR3JvdXBpbmcgQjEgcHJlc2VudCIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08Q29udGVudERlc2NyaXB0aW9uIG5hbWU9InJvbGVfc2V0X2dyb3VwaW5nX0IxLF96YVZRQUI4eUVkcWdCSVR1SUNMSkV3IiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iVHVlIFNlcCAwNiAxNzoxNjoyNSBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iUm9sZSBTZXQgR3JvdXBpbmcgQjEgbWFpbiIga2V5Q29uc2lkZXJhdGlvbnM9IlJvbGUgU2V0IEdyb3VwaW5nIEIxIGtleSI+Ci08L0NvbnRlbnREZXNjcmlwdGlvbj4KLTxyb2xlU2V0cyBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXRlZ29yaWVzL1JvbGVTZXRzL3JvbGVfc2V0X0IxIj4KLTwvcm9sZVNldHM+Ci08L1JvbGVTZXRHcm91cGluZz4KLTxSb2xlU2V0IG5hbWU9InJvbGVfc2V0X0IxIiBicmllZkRlc2NyaXB0aW9uPSJSb2xlIFNldCBCMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iUm9sZSBTZXQgQjEgcHJlc2VudCIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08Q29udGVudERlc2NyaXB0aW9uIG5hbWU9InJvbGVfc2V0X0IxLF91UEFXY0I4NUVkcU52ZWx5YkRYWkZRIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iVHVlIFNlcCAwNiAxNzo1MzowNyBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iUm9sZSBTZXQgQjEgbWFpbiIga2V5Q29uc2lkZXJhdGlvbnM9IlJvbGUgU2V0IEIxIGtleSI+Ci08L0NvbnRlbnREZXNjcmlwdGlvbj4KLTxzdXBwb3J0aW5nTWF0ZXJpYWxzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9zdXBwb3J0aW5nX21hdGVyaWFsX0IxIj4KLTwvc3VwcG9ydGluZ01hdGVyaWFscz4KLTxjb25jZXB0c0FuZFBhcGVycyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvY29uY2VwdF9CMSI+Ci08L2NvbmNlcHRzQW5kUGFwZXJzPgotPGNvbmNlcHRzQW5kUGFwZXJzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS93aGl0ZXBhcGVyX0IxIj4KLTwvY29uY2VwdHNBbmRQYXBlcnM+Ci08Y2hlY2tsaXN0cyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvY2hlY2tsaXN0X0IxIj4KLTwvY2hlY2tsaXN0cz4KLTxndWlkZWxpbmVzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9ndWlkZWxpbmVfQjEiPgotPC9ndWlkZWxpbmVzPgotPGV4YW1wbGVzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9leGFtcGxlX0IxIj4KLTwvZXhhbXBsZXM+Ci08YXNzZXRzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9yZXVzYWJsZV9hc3NldF9CMSI+Ci08L2Fzc2V0cz4KLTxyb2xlcyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvcm9sZV9CMSI+Ci08L3JvbGVzPgotPC9Sb2xlU2V0PgotPFJvbGVTZXQgbmFtZT0icm9sZV9zZXRfQjIiIGJyaWVmRGVzY3JpcHRpb249IlJvbGUgU2V0IEIyIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJSb2xlIFNldCBCMiBwcmVzZW50IiB2YXJpYWJpbGl0eVR5cGU9Im5hIj4KLTxDb250ZW50RGVzY3JpcHRpb24gbmFtZT0icm9sZV9zZXRfQjIsXzBZX01jQjg1RWRxTnZlbHliRFhaRlEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJUdWUgU2VwIDA2IDE3OjUzOjQzIFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSImbHQ7cCZndDsmIzEzOyYjMTA7ICAgIFJvbGUgU2V0IEIyIG1haW4mIzEzOyYjMTA7Jmx0Oy9wJmd0OyIga2V5Q29uc2lkZXJhdGlvbnM9IiZsdDtwJmd0OyYjMTM7JiMxMDsgICAgUm9sZSBTZXQgQjIga2V5JiMxMzsmIzEwOyZsdDsvcCZndDsiPgotPC9Db250ZW50RGVzY3JpcHRpb24+Ci08c3VwcG9ydGluZ01hdGVyaWFscyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvc3VwcG9ydGluZ19tYXRlcmlhbF9CMiI+Ci08L3N1cHBvcnRpbmdNYXRlcmlhbHM+Ci08Y29uY2VwdHNBbmRQYXBlcnMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL2NvbmNlcHRfQjIiPgotPC9jb25jZXB0c0FuZFBhcGVycz4KLTxjb25jZXB0c0FuZFBhcGVycyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvd2hpdGVwYXBlcl9CMiI+Ci08L2NvbmNlcHRzQW5kUGFwZXJzPgotPGNoZWNrbGlzdHMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL2NoZWNrbGlzdF9CMiI+Ci08L2NoZWNrbGlzdHM+Ci08Z3VpZGVsaW5lcyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvZ3VpZGVsaW5lX0IyIj4KLTwvZ3VpZGVsaW5lcz4KLTxleGFtcGxlcyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvZXhhbXBsZV9CMiI+Ci08L2V4YW1wbGVzPgotPGFzc2V0cyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvcmV1c2FibGVfYXNzZXRfQjIiPgotPC9hc3NldHM+Ci08cm9sZXMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL3JvbGVfQjIiPgotPC9yb2xlcz4KLTwvUm9sZVNldD4KLTwvQ29udGVudFBhY2thZ2U+Ci08Q29udGVudFBhY2thZ2UgbmFtZT0iV1AgVHlwZXMiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgZ2xvYmFsPSJmYWxzZSI+Ci08cGFyZW50UGFja2FnZSBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXRlZ29yaWVzL1dQIFR5cGVzIj4KLTwvcGFyZW50UGFja2FnZT4KLTxXb3JrUHJvZHVjdFR5cGUgbmFtZT0id29ya19wcm9kdWN0X3R5cGVfQjEiIGJyaWVmRGVzY3JpcHRpb249IldvcmsgUHJvZHVjdCBUeXBlIEIxIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJXb3JrIFByb2R1Y3QgVHlwZSBCMSBwcmVzZW50IiB2YXJpYWJpbGl0eVR5cGU9Im5hIj4KLTxDb250ZW50RGVzY3JpcHRpb24gbmFtZT0id29ya19wcm9kdWN0X3R5cGVfQjEsX3hLc0lvQjh5RWRxZ0JJVHVJQ0xKRXciIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJUdWUgU2VwIDA2IDE3OjE3OjI4IFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSJXb3JrIFByb2R1Y3QgVHlwZSBCMSBtYWluIiBrZXlDb25zaWRlcmF0aW9ucz0iV29yayBQcm9kdWN0IFR5cGUgQjEga2V5Ij4KLTwvQ29udGVudERlc2NyaXB0aW9uPgotPHN1cHBvcnRpbmdNYXRlcmlhbHMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL3N1cHBvcnRpbmdfbWF0ZXJpYWxfQjEiPgotPC9zdXBwb3J0aW5nTWF0ZXJpYWxzPgotPGNvbmNlcHRzQW5kUGFwZXJzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9jb25jZXB0X0IxIj4KLTwvY29uY2VwdHNBbmRQYXBlcnM+Ci08Y29uY2VwdHNBbmRQYXBlcnMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL3doaXRlcGFwZXJfQjEiPgotPC9jb25jZXB0c0FuZFBhcGVycz4KLTxjaGVja2xpc3RzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9jaGVja2xpc3RfQjEiPgotPC9jaGVja2xpc3RzPgotPGd1aWRlbGluZXMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL2d1aWRlbGluZV9CMSI+Ci08L2d1aWRlbGluZXM+Ci08ZXhhbXBsZXMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL2V4YW1wbGVfQjEiPgotPC9leGFtcGxlcz4KLTxhc3NldHMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL3JldXNhYmxlX2Fzc2V0X0IxIj4KLTwvYXNzZXRzPgotPHdvcmtQcm9kdWN0cyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvYXJ0aWZhY3RfQjEiPgotPC93b3JrUHJvZHVjdHM+Ci08d29ya1Byb2R1Y3RzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9kZWxpdmVyYWJsZV9CMSI+Ci08L3dvcmtQcm9kdWN0cz4KLTx3b3JrUHJvZHVjdHMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL291dGNvbWVfQjEiPgotPC93b3JrUHJvZHVjdHM+Ci08L1dvcmtQcm9kdWN0VHlwZT4KLTxXb3JrUHJvZHVjdFR5cGUgbmFtZT0id29ya19wcm9kdWN0X3R5cGVfQjIiIGJyaWVmRGVzY3JpcHRpb249IldvcmsgUHJvZHVjdCBUeXBlIEIyIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJXb3JrIFByb2R1Y3QgVHlwZSBCMiBwcmVzZW50IiB2YXJpYWJpbGl0eVR5cGU9Im5hIj4KLTxDb250ZW50RGVzY3JpcHRpb24gbmFtZT0id29ya19wcm9kdWN0X3R5cGVfQjIsX3lDa0wwQjh5RWRxZ0JJVHVJQ0xKRXciIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJUdWUgU2VwIDA2IDE3OjA0OjU1IFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSJXb3JrIFByb2R1Y3QgVHlwZSBCMiBtYWluIiBrZXlDb25zaWRlcmF0aW9ucz0iV29yayBQcm9kdWN0IFR5cGUgQjIga2V5Ij4KLTwvQ29udGVudERlc2NyaXB0aW9uPgotPHN1cHBvcnRpbmdNYXRlcmlhbHMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL3N1cHBvcnRpbmdfbWF0ZXJpYWxfQjIiPgotPC9zdXBwb3J0aW5nTWF0ZXJpYWxzPgotPGNvbmNlcHRzQW5kUGFwZXJzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9jb25jZXB0X0IyIj4KLTwvY29uY2VwdHNBbmRQYXBlcnM+Ci08Y29uY2VwdHNBbmRQYXBlcnMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL3doaXRlcGFwZXJfQjIiPgotPC9jb25jZXB0c0FuZFBhcGVycz4KLTxjaGVja2xpc3RzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9jaGVja2xpc3RfQjIiPgotPC9jaGVja2xpc3RzPgotPGd1aWRlbGluZXMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL2d1aWRlbGluZV9CMiI+Ci08L2d1aWRlbGluZXM+Ci08ZXhhbXBsZXMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL2V4YW1wbGVfQjIiPgotPC9leGFtcGxlcz4KLTxhc3NldHMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL3JldXNhYmxlX2Fzc2V0X0IyIj4KLTwvYXNzZXRzPgotPHdvcmtQcm9kdWN0cyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvYXJ0aWZhY3RfQjIiPgotPC93b3JrUHJvZHVjdHM+Ci08d29ya1Byb2R1Y3RzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9vdXRjb21lX0IyIj4KLTwvd29ya1Byb2R1Y3RzPgotPC9Xb3JrUHJvZHVjdFR5cGU+Ci08L0NvbnRlbnRQYWNrYWdlPgotPENvbnRlbnRQYWNrYWdlIG5hbWU9IlRvb2xzIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGdsb2JhbD0iZmFsc2UiPgotPHBhcmVudFBhY2thZ2UgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2F0ZWdvcmllcy9Ub29scyI+Ci08L3BhcmVudFBhY2thZ2U+Ci08VG9vbCBuYW1lPSJ0b29sX0IxIiBicmllZkRlc2NyaXB0aW9uPSJUb29sIEIxIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJUb29sIEIxIHByZXNlbnQiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPENvbnRlbnREZXNjcmlwdGlvbiBuYW1lPSJ0b29sX0IxLF8wTmN2QUI4eUVkcWdCSVR1SUNMSkV3IiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iVHVlIFNlcCAwNiAxNzoxNToyOSBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iVG9vbCBCMSBtYWluIiBrZXlDb25zaWRlcmF0aW9ucz0iVG9vbCBCMSBrZXkiPgotPC9Db250ZW50RGVzY3JpcHRpb24+Ci08c3VwcG9ydGluZ01hdGVyaWFscyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvc3VwcG9ydGluZ19tYXRlcmlhbF9CMSI+Ci08L3N1cHBvcnRpbmdNYXRlcmlhbHM+Ci08Y29uY2VwdHNBbmRQYXBlcnMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL2NvbmNlcHRfQjEiPgotPC9jb25jZXB0c0FuZFBhcGVycz4KLTxjb25jZXB0c0FuZFBhcGVycyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvd2hpdGVwYXBlcl9CMSI+Ci08L2NvbmNlcHRzQW5kUGFwZXJzPgotPGNoZWNrbGlzdHMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL2NoZWNrbGlzdF9CMSI+Ci08L2NoZWNrbGlzdHM+Ci08Z3VpZGVsaW5lcyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvZ3VpZGVsaW5lX0IxIj4KLTwvZ3VpZGVsaW5lcz4KLTxleGFtcGxlcyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvZXhhbXBsZV9CMSI+Ci08L2V4YW1wbGVzPgotPGFzc2V0cyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvcmV1c2FibGVfYXNzZXRfQjEiPgotPC9hc3NldHM+Ci08dG9vbE1lbnRvcnMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL3Rvb2xtZW50b3JfQjEiPgotPC90b29sTWVudG9ycz4KLTwvVG9vbD4KLTxUb29sIG5hbWU9InRvb2xfQjIiIGJyaWVmRGVzY3JpcHRpb249IlRvb2wgQjIgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IlRvb2wgQjIgcHJlc2VudGF0aW9uIiB2YXJpYWJpbGl0eVR5cGU9Im5hIj4KLTxDb250ZW50RGVzY3JpcHRpb24gbmFtZT0idG9vbF9CMixfMTdIeHdCOHlFZHFnQklUdUlDTEpFdyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURhdGU9IlR1ZSBTZXAgMDYgMTc6MTU6NTggUERUIDIwMDUiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249IlRvb2wgQjIgbWFpbiIga2V5Q29uc2lkZXJhdGlvbnM9IlRvb2wgQjIga2V5Ij4KLTwvQ29udGVudERlc2NyaXB0aW9uPgotPHN1cHBvcnRpbmdNYXRlcmlhbHMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL3N1cHBvcnRpbmdfbWF0ZXJpYWxfQjIiPgotPC9zdXBwb3J0aW5nTWF0ZXJpYWxzPgotPGNvbmNlcHRzQW5kUGFwZXJzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9jb25jZXB0X0IyIj4KLTwvY29uY2VwdHNBbmRQYXBlcnM+Ci08Y29uY2VwdHNBbmRQYXBlcnMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL3doaXRlcGFwZXJfQjIiPgotPC9jb25jZXB0c0FuZFBhcGVycz4KLTxjaGVja2xpc3RzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9jaGVja2xpc3RfQjIiPgotPC9jaGVja2xpc3RzPgotPGd1aWRlbGluZXMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL2d1aWRlbGluZV9CMiI+Ci08L2d1aWRlbGluZXM+Ci08ZXhhbXBsZXMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL2V4YW1wbGVfQjIiPgotPC9leGFtcGxlcz4KLTxhc3NldHMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL3JldXNhYmxlX2Fzc2V0X0IyIj4KLTwvYXNzZXRzPgotPHRvb2xNZW50b3JzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS90b29sbWVudG9yX0IyIj4KLTwvdG9vbE1lbnRvcnM+Ci08L1Rvb2w+Ci08L0NvbnRlbnRQYWNrYWdlPgotPENvbnRlbnRQYWNrYWdlIG5hbWU9IlN0YW5kYXJkQ2F0ZWdvcmllcyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBnbG9iYWw9ImZhbHNlIj4KLTxwYXJlbnRQYWNrYWdlIHBhdGg9IlBsdWcgQi9Db250ZW50L0NhdGVnb3JpZXMvU3RhbmRhcmRDYXRlZ29yaWVzIj4KLTwvcGFyZW50UGFja2FnZT4KLTwvQ29udGVudFBhY2thZ2U+Ci08Q29udGVudFBhY2thZ2UgbmFtZT0iQ3VzdG9tQ2F0ZWdvcmllcyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBnbG9iYWw9ImZhbHNlIj4KLTxwYXJlbnRQYWNrYWdlIHBhdGg9IlBsdWcgQi9Db250ZW50L0NhdGVnb3JpZXMvQ3VzdG9tQ2F0ZWdvcmllcyI+Ci08L3BhcmVudFBhY2thZ2U+Ci08Q29udGVudFBhY2thZ2UgbmFtZT0iSGlkZGVuIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGdsb2JhbD0iZmFsc2UiPgotPHBhcmVudFBhY2thZ2UgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2F0ZWdvcmllcy9DdXN0b21DYXRlZ29yaWVzL0hpZGRlbiI+Ci08L3BhcmVudFBhY2thZ2U+Ci08Q3VzdG9tQ2F0ZWdvcnkgbmFtZT0iQ3VzdG9tIENhdGVnb3JpZXMiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iIiB2YXJpYWJpbGl0eVR5cGU9Im5hIj4KLTxDb250ZW50RGVzY3JpcHRpb24gbmFtZT0iQ3VzdG9tIENhdGVnb3JpZXMsX2VjeTV5eE0zRWRxcW5kaS1nRHV4cHciIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIj4KLTwvQ29udGVudERlc2NyaXB0aW9uPgotPGNhdGVnb3JpemVkRWxlbWVudHMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2F0ZWdvcmllcy9DdXN0b21DYXRlZ29yaWVzL2N1c3RvbV9jYXRlZ29yeV9CMSI+Ci08L2NhdGVnb3JpemVkRWxlbWVudHM+Ci08Y2F0ZWdvcml6ZWRFbGVtZW50cyBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXRlZ29yaWVzL0N1c3RvbUNhdGVnb3JpZXMvY3VzdG9tX2NhdGVnb3J5X0IyIj4KLTwvY2F0ZWdvcml6ZWRFbGVtZW50cz4KLTwvQ3VzdG9tQ2F0ZWdvcnk+Ci08L0NvbnRlbnRQYWNrYWdlPgotPEN1c3RvbUNhdGVnb3J5IG5hbWU9ImN1c3RvbV9jYXRlZ29yeV9CMSIgYnJpZWZEZXNjcmlwdGlvbj0iQ3VzdG9tIENhdGVnb3J5IEIxIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJDdXN0b20gQ2F0ZWdvcnkgQjEgcHJlc2VudCIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08Q29udGVudERlc2NyaXB0aW9uIG5hbWU9ImN1c3RvbV9jYXRlZ29yeV9CMSxfM0VTWlFCOHlFZHFnQklUdUlDTEpFdyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURhdGU9IlR1ZSBTZXAgMDYgMTc6MDU6NDAgUERUIDIwMDUiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249IkN1c3RvbSBDYXRlZ29yeSBCMSBtYWluIiBrZXlDb25zaWRlcmF0aW9ucz0iQ3VzdG9tIENhdGVnb3J5IEIxIGtleSI+Ci08L0NvbnRlbnREZXNjcmlwdGlvbj4KLTxjYXRlZ29yaXplZEVsZW1lbnRzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NhdGVnb3JpZXMvQ3VzdG9tQ2F0ZWdvcmllcy9jdXN0b21fY2F0ZWdvcnlfQjEuMSI+Ci08L2NhdGVnb3JpemVkRWxlbWVudHM+Ci08Y2F0ZWdvcml6ZWRFbGVtZW50cyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvdGFza19CMSI+Ci08L2NhdGVnb3JpemVkRWxlbWVudHM+Ci08Y2F0ZWdvcml6ZWRFbGVtZW50cyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvcm9sZV9CMSI+Ci08L2NhdGVnb3JpemVkRWxlbWVudHM+Ci08Y2F0ZWdvcml6ZWRFbGVtZW50cyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvYXJ0aWZhY3RfQjEiPgotPC9jYXRlZ29yaXplZEVsZW1lbnRzPgotPGNhdGVnb3JpemVkRWxlbWVudHMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL2RlbGl2ZXJhYmxlX0IxIj4KLTwvY2F0ZWdvcml6ZWRFbGVtZW50cz4KLTxjYXRlZ29yaXplZEVsZW1lbnRzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9vdXRjb21lX0IxIj4KLTwvY2F0ZWdvcml6ZWRFbGVtZW50cz4KLTxjYXRlZ29yaXplZEVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL0NQMSB3aXRoIGFsbCBlbGVtZW50cyI+Ci08L2NhdGVnb3JpemVkRWxlbWVudHM+Ci08Y2F0ZWdvcml6ZWRFbGVtZW50cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgZXh0ZW5kaW5nICZhcG9zO0NQMSB3aXRoIGFsbCBlbGVtZW50cyZhcG9zOy9DUCBleHRlbmRpbmcgJmFwb3M7Q1AxIHdpdGggYWxsIGVsZW1lbnRzJmFwb3M7Ij4KLTwvY2F0ZWdvcml6ZWRFbGVtZW50cz4KLTxjYXRlZ29yaXplZEVsZW1lbnRzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9DUCBCMSI+Ci08L2NhdGVnb3JpemVkRWxlbWVudHM+Ci08L0N1c3RvbUNhdGVnb3J5PgotPEN1c3RvbUNhdGVnb3J5IG5hbWU9ImN1c3RvbV9jYXRlZ29yeV9CMiIgYnJpZWZEZXNjcmlwdGlvbj0iQ3VzdG9tIENhdGVnb3J5IEIyIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJDdXN0b20gQ2F0ZWdvcnkgQjIgcHJlc2VudCIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08Q29udGVudERlc2NyaXB0aW9uIG5hbWU9ImN1c3RvbV9jYXRlZ29yeV9CMixfM3NFeUFCOHlFZHFnQklUdUlDTEpFdyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURhdGU9IlR1ZSBTZXAgMDYgMTc6MDY6MTIgUERUIDIwMDUiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249IkN1c3RvbSBDYXRlZ29yeSBCMiBtYWluIiBrZXlDb25zaWRlcmF0aW9ucz0iQ3VzdG9tIENhdGVnb3J5IEIyIGtleSI+Ci08L0NvbnRlbnREZXNjcmlwdGlvbj4KLTxjYXRlZ29yaXplZEVsZW1lbnRzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS90YXNrX0IyIj4KLTwvY2F0ZWdvcml6ZWRFbGVtZW50cz4KLTxjYXRlZ29yaXplZEVsZW1lbnRzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9hcnRpZmFjdF9CMiI+Ci08L2NhdGVnb3JpemVkRWxlbWVudHM+Ci08Y2F0ZWdvcml6ZWRFbGVtZW50cyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvb3V0Y29tZV9CMiI+Ci08L2NhdGVnb3JpemVkRWxlbWVudHM+Ci08Y2F0ZWdvcml6ZWRFbGVtZW50cyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvcm9sZV9CMiI+Ci08L2NhdGVnb3JpemVkRWxlbWVudHM+Ci08L0N1c3RvbUNhdGVnb3J5PgotPEN1c3RvbUNhdGVnb3J5IG5hbWU9ImN1c3RvbV9jYXRlZ29yeV9CMS4xIiBicmllZkRlc2NyaXB0aW9uPSJDdXN0b20gQ2F0ZWdvcnkgQjEuMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iQ3VzdG9tIENhdGVnb3J5IEIxLjEgcHJlc2VudGF0aW9uIiB2YXJpYWJpbGl0eVR5cGU9Im5hIj4KLTxDb250ZW50RGVzY3JpcHRpb24gbmFtZT0iY3VzdG9tX2NhdGVnb3J5X0IxLjEsX1hmVGRvQjgwRWRxZ0JJVHVJQ0xKRXciIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJUdWUgU2VwIDA2IDE3OjE0OjQ0IFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSJDdXN0b20gQ2F0ZWdvcnkgQjEuMSBtYWluIiBrZXlDb25zaWRlcmF0aW9ucz0iQ3VzdG9tIENhdGVnb3J5IEIxLjEga2V5Ij4KLTwvQ29udGVudERlc2NyaXB0aW9uPgotPC9DdXN0b21DYXRlZ29yeT4KLTwvQ29udGVudFBhY2thZ2U+Ci08L0NvbnRlbnRQYWNrYWdlPgotPENvbnRlbnRQYWNrYWdlIG5hbWU9IkNvcmVDb250ZW50IiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGdsb2JhbD0iZmFsc2UiPgotPHBhcmVudFBhY2thZ2UgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQiPgotPC9wYXJlbnRQYWNrYWdlPgotPENvbnRlbnRQYWNrYWdlIG5hbWU9ImNvbnRlbnRfcGFja2FnZV9CMSIgYnJpZWZEZXNjcmlwdGlvbj0iQ29uIFBhayBCMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgZ2xvYmFsPSJmYWxzZSI+Ci08cGFyZW50UGFja2FnZSBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEiPgotPC9wYXJlbnRQYWNrYWdlPgotPFJvbGUgbmFtZT0icm9sZV9CMSIgYnJpZWZEZXNjcmlwdGlvbj0iUm9sZSBCMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iUm9sZSBCMSBwcmVzZW50IiB2YXJpYWJpbGl0eVR5cGU9Im5hIj4KLTxSb2xlRGVzY3JpcHRpb24gbmFtZT0icm9sZV9CMSxfQTlEWWdCOFBFZHFzaE1OU0kwN1hPZyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURhdGU9IlR1ZSBTZXAgMDYgMTI6NDc6MjMgUERUIDIwMDUiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249IlJvbGUgQjEgbWFpbiIga2V5Q29uc2lkZXJhdGlvbnM9IlJvbGUgQjEga2V5IiBza2lsbHM9IlJvbGUgQjEgc2tpbGwiIGFzc2lnbm1lbnRBcHByb2FjaGVzPSJSb2xlIEIxIGFzc2lnbiIgc3lub255bXM9IlJvbGUgQjEgc3luIj4KLTwvUm9sZURlc2NyaXB0aW9uPgotPHN1cHBvcnRpbmdNYXRlcmlhbHMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL3N1cHBvcnRpbmdfbWF0ZXJpYWxfQjEiPgotPC9zdXBwb3J0aW5nTWF0ZXJpYWxzPgotPGNvbmNlcHRzQW5kUGFwZXJzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9jb25jZXB0X0IxIj4KLTwvY29uY2VwdHNBbmRQYXBlcnM+Ci08Y29uY2VwdHNBbmRQYXBlcnMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL3doaXRlcGFwZXJfQjEiPgotPC9jb25jZXB0c0FuZFBhcGVycz4KLTxjaGVja2xpc3RzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9jaGVja2xpc3RfQjEiPgotPC9jaGVja2xpc3RzPgotPGd1aWRlbGluZXMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL2d1aWRlbGluZV9CMSI+Ci08L2d1aWRlbGluZXM+Ci08ZXhhbXBsZXMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL2V4YW1wbGVfQjEiPgotPC9leGFtcGxlcz4KLTxhc3NldHMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL3JldXNhYmxlX2Fzc2V0X0IxIj4KLTwvYXNzZXRzPgotPG1vZGlmaWVzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9vdXRjb21lX0IxIj4KLTwvbW9kaWZpZXM+Ci08cmVzcG9uc2libGVGb3IgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL2FydGlmYWN0X0IxIj4KLTwvcmVzcG9uc2libGVGb3I+Ci08cmVzcG9uc2libGVGb3IgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL2RlbGl2ZXJhYmxlX0IxIj4KLTwvcmVzcG9uc2libGVGb3I+Ci08L1JvbGU+Ci08Um9sZSBuYW1lPSJyb2xlX0IyIiBicmllZkRlc2NyaXB0aW9uPSJSb2xlIEIyIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJSb2xlIEIyIHByZXNlbnQiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPFJvbGVEZXNjcmlwdGlvbiBuYW1lPSJyb2xlX0IyLF9LQ01fSUI4UEVkcXNoTU5TSTA3WE9nIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iVHVlIFNlcCAwNiAxMjo0ODoyMSBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iUm9sZSBCMiBtYWluIiBrZXlDb25zaWRlcmF0aW9ucz0iUm9sZSBCMiBrZXkiIHNraWxscz0iUm9sZSBCMiBza2lsbCIgYXNzaWdubWVudEFwcHJvYWNoZXM9IlJvbGUgQjIgYXNzIiBzeW5vbnltcz0iUm9sZSBCMiBzeW4iPgotPC9Sb2xlRGVzY3JpcHRpb24+Ci08c3VwcG9ydGluZ01hdGVyaWFscyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvc3VwcG9ydGluZ19tYXRlcmlhbF9CMiI+Ci08L3N1cHBvcnRpbmdNYXRlcmlhbHM+Ci08Y29uY2VwdHNBbmRQYXBlcnMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL2NvbmNlcHRfQjIiPgotPC9jb25jZXB0c0FuZFBhcGVycz4KLTxjb25jZXB0c0FuZFBhcGVycyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvd2hpdGVwYXBlcl9CMiI+Ci08L2NvbmNlcHRzQW5kUGFwZXJzPgotPGNoZWNrbGlzdHMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL2NoZWNrbGlzdF9CMiI+Ci08L2NoZWNrbGlzdHM+Ci08Z3VpZGVsaW5lcyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvZ3VpZGVsaW5lX0IyIj4KLTwvZ3VpZGVsaW5lcz4KLTxleGFtcGxlcyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvZXhhbXBsZV9CMiI+Ci08L2V4YW1wbGVzPgotPGFzc2V0cyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvcmV1c2FibGVfYXNzZXRfQjIiPgotPC9hc3NldHM+Ci08bW9kaWZpZXMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL291dGNvbWVfQjIiPgotPC9tb2RpZmllcz4KLTxyZXNwb25zaWJsZUZvciBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvYXJ0aWZhY3RfQjIiPgotPC9yZXNwb25zaWJsZUZvcj4KLTxyZXNwb25zaWJsZUZvciBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvZGVsaXZlcmFibGVfQjIiPgotPC9yZXNwb25zaWJsZUZvcj4KLTwvUm9sZT4KLTxUYXNrIG5hbWU9InRhc2tfQjEiIGJyaWVmRGVzY3JpcHRpb249IlRhc2sgQjEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IlRhc2sgQjEgcHJlc25ldCIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08VGFza0Rlc2NyaXB0aW9uIG5hbWU9InRhc2tfQjEsX1hVNkxVQjhQRWRxc2hNTlNJMDdYT2ciIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJUdWUgU2VwIDA2IDEyOjUwOjQ3IFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSImbHQ7cCZndDsmIzEzOyYjMTA7ICAgIFRhc2sgQjEgbWFpbiAmYW1wO2FtcDsgXCBcXCAmcXVvdDsgJmFwb3M7ICUgJmFtcDtndDsgJmFtcDtsdDsmIzEzOyYjMTA7Jmx0Oy9wJmd0OyIga2V5Q29uc2lkZXJhdGlvbnM9IlRhc2sgQjEga2V5IiBwdXJwb3NlPSJUYXNrIEIxIHBvcnBvaXNlIiBhbHRlcm5hdGl2ZXM9IlRhc2sgQjEgYWx0Ij4KLTxTZWN0aW9uIG5hbWU9IlN0ZXAgQjEuMSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiB2YXJpYWJpbGl0eVR5cGU9Im5hIiBzZWN0aW9uTmFtZT0iIiBzZWN0aW9uRGVzY3JpcHRpb249InVwIj4KLTwvU2VjdGlvbj4KLTxTZWN0aW9uIG5hbWU9IlN0ZXAgQjEuMiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiB2YXJpYWJpbGl0eVR5cGU9Im5hIiBzZWN0aW9uTmFtZT0iIiBzZWN0aW9uRGVzY3JpcHRpb249IiZsdDtwJmd0OyYjMTM7JiMxMDsgICAgRG93biYjMTM7JiMxMDsmbHQ7L3AmZ3Q7Ij4KLTwvU2VjdGlvbj4KLTxTZWN0aW9uIG5hbWU9IlN0ZXAgQjEuMyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiB2YXJpYWJpbGl0eVR5cGU9Im5hIiBzZWN0aW9uTmFtZT0iIiBzZWN0aW9uRGVzY3JpcHRpb249Ik92ZXIiPgotPC9TZWN0aW9uPgotPC9UYXNrRGVzY3JpcHRpb24+Ci08c3VwcG9ydGluZ01hdGVyaWFscyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvc3VwcG9ydGluZ19tYXRlcmlhbF9CMSI+Ci08L3N1cHBvcnRpbmdNYXRlcmlhbHM+Ci08Y29uY2VwdHNBbmRQYXBlcnMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL2NvbmNlcHRfQjEiPgotPC9jb25jZXB0c0FuZFBhcGVycz4KLTxjb25jZXB0c0FuZFBhcGVycyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvd2hpdGVwYXBlcl9CMSI+Ci08L2NvbmNlcHRzQW5kUGFwZXJzPgotPGNoZWNrbGlzdHMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL2NoZWNrbGlzdF9CMSI+Ci08L2NoZWNrbGlzdHM+Ci08Z3VpZGVsaW5lcyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvZ3VpZGVsaW5lX0IxIj4KLTwvZ3VpZGVsaW5lcz4KLTxleGFtcGxlcyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvZXhhbXBsZV9CMSI+Ci08L2V4YW1wbGVzPgotPGFzc2V0cyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvcmV1c2FibGVfYXNzZXRfQjEiPgotPC9hc3NldHM+Ci08cGVyZm9ybWVkQnkgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL3Rhc2tfQjEiPgotPC9wZXJmb3JtZWRCeT4KLTxtYW5kYXRvcnlJbnB1dCBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvYXJ0aWZhY3RfQjEiPgotPC9tYW5kYXRvcnlJbnB1dD4KLTxvdXRwdXQgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL291dGNvbWVfQjEiPgotPC9vdXRwdXQ+Ci08YWRkaXRpb25hbGx5UGVyZm9ybWVkQnkgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL3JvbGVfQjIiPgotPC9hZGRpdGlvbmFsbHlQZXJmb3JtZWRCeT4KLTxvcHRpb25hbElucHV0IHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9kZWxpdmVyYWJsZV9CMSI+Ci08L29wdGlvbmFsSW5wdXQ+Ci08c3RlcHMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL3Rhc2tfQjEvdGFza19CMSxfWFU2TFVCOFBFZHFzaE1OU0kwN1hPZy9TdGVwIEIxLjEiPgotPC9zdGVwcz4KLTxzdGVwcyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvdGFza19CMS90YXNrX0IxLF9YVTZMVUI4UEVkcXNoTU5TSTA3WE9nL1N0ZXAgQjEuMiI+Ci08L3N0ZXBzPgotPHN0ZXBzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS90YXNrX0IxL3Rhc2tfQjEsX1hVNkxVQjhQRWRxc2hNTlNJMDdYT2cvU3RlcCBCMS4zIj4KLTwvc3RlcHM+Ci08dG9vbE1lbnRvcnMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL3Rvb2xtZW50b3JfQjEiPgotPC90b29sTWVudG9ycz4KLTwvVGFzaz4KLTxUYXNrIG5hbWU9InRhc2tfQjIiIGJyaWVmRGVzY3JpcHRpb249IlRhc2sgQjIgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IlRhc2sgQjIgZXh0ZW5kcyBUYXNrIEExIiB2YXJpYWJpbGl0eVR5cGU9ImV4dGVuZHMiPgotPFRhc2tEZXNjcmlwdGlvbiBuYW1lPSJ0YXNrX0IyLF9aTE9Nc0I4UEVkcXNoTU5TSTA3WE9nIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iVHVlIFNlcCAwNiAxMjo1MDowNyBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iVGFzayBCMiBtYWluIiBrZXlDb25zaWRlcmF0aW9ucz0iVGFzayBCMiBrZXkiIHB1cnBvc2U9IlRhc2sgQjIgcG9ycG9pc2UiIGFsdGVybmF0aXZlcz0iVGFzayBCMiBhbHQiPgotPFNlY3Rpb24gbmFtZT0iU3RlcCBCMi4xIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHZhcmlhYmlsaXR5VHlwZT0ibmEiIHNlY3Rpb25OYW1lPSIiIHNlY3Rpb25EZXNjcmlwdGlvbj0iRWluIj4KLTwvU2VjdGlvbj4KLTxTZWN0aW9uIG5hbWU9IlN0ZXAgQjIuMiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiB2YXJpYWJpbGl0eVR5cGU9Im5hIiBzZWN0aW9uTmFtZT0iIiBzZWN0aW9uRGVzY3JpcHRpb249IiZsdDtwJmd0OyYjMTM7JiMxMDsgICAgWndlaSYjMTM7JiMxMDsmbHQ7L3AmZ3Q7Ij4KLTwvU2VjdGlvbj4KLTxTZWN0aW9uIG5hbWU9IlN0ZXAgQjIuMyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiB2YXJpYWJpbGl0eVR5cGU9Im5hIiBzZWN0aW9uTmFtZT0iIiBzZWN0aW9uRGVzY3JpcHRpb249IiZsdDtwJmd0OyYjMTM7JiMxMDsgICAgRHJlaSYjMTM7JiMxMDsmbHQ7L3AmZ3Q7Ij4KLTwvU2VjdGlvbj4KLTwvVGFza0Rlc2NyaXB0aW9uPgotPHZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL3Rhc2tfQjIiPgotPC92YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50PgotPHN1cHBvcnRpbmdNYXRlcmlhbHMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL3N1cHBvcnRpbmdfbWF0ZXJpYWxfQjIiPgotPC9zdXBwb3J0aW5nTWF0ZXJpYWxzPgotPGNvbmNlcHRzQW5kUGFwZXJzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9jb25jZXB0X0IyIj4KLTwvY29uY2VwdHNBbmRQYXBlcnM+Ci08Y29uY2VwdHNBbmRQYXBlcnMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL3doaXRlcGFwZXJfQjIiPgotPC9jb25jZXB0c0FuZFBhcGVycz4KLTxjaGVja2xpc3RzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9jaGVja2xpc3RfQjIiPgotPC9jaGVja2xpc3RzPgotPGd1aWRlbGluZXMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL2d1aWRlbGluZV9CMiI+Ci08L2d1aWRlbGluZXM+Ci08ZXhhbXBsZXMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL2V4YW1wbGVfQjIiPgotPC9leGFtcGxlcz4KLTxhc3NldHMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL3JldXNhYmxlX2Fzc2V0X0IyIj4KLTwvYXNzZXRzPgotPHBlcmZvcm1lZEJ5IHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS90YXNrX0IyIj4KLTwvcGVyZm9ybWVkQnk+Ci08bWFuZGF0b3J5SW5wdXQgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL2FydGlmYWN0X0IyIj4KLTwvbWFuZGF0b3J5SW5wdXQ+Ci08b3V0cHV0IHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9vdXRjb21lX0IyIj4KLTwvb3V0cHV0PgotPGFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5IHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9yb2xlX0IxIj4KLTwvYWRkaXRpb25hbGx5UGVyZm9ybWVkQnk+Ci08b3B0aW9uYWxJbnB1dCBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvZGVsaXZlcmFibGVfQjIiPgotPC9vcHRpb25hbElucHV0PgotPHN0ZXBzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS90YXNrX0IyL3Rhc2tfQjIsX1pMT01zQjhQRWRxc2hNTlNJMDdYT2cvU3RlcCBCMi4xIj4KLTwvc3RlcHM+Ci08c3RlcHMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL3Rhc2tfQjIvdGFza19CMixfWkxPTXNCOFBFZHFzaE1OU0kwN1hPZy9TdGVwIEIyLjIiPgotPC9zdGVwcz4KLTxzdGVwcyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvdGFza19CMi90YXNrX0IyLF9aTE9Nc0I4UEVkcXNoTU5TSTA3WE9nL1N0ZXAgQjIuMyI+Ci08L3N0ZXBzPgotPHRvb2xNZW50b3JzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS90b29sbWVudG9yX0IyIj4KLTwvdG9vbE1lbnRvcnM+Ci08L1Rhc2s+Ci08QXJ0aWZhY3QgbmFtZT0iYXJ0aWZhY3RfQjEiIGJyaWVmRGVzY3JpcHRpb249IkFydGlmYWN0IEIxIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJBcnRpZmFjdCBCMSBwcmVzZW50IiB2YXJpYWJpbGl0eVR5cGU9Im5hIj4KLTxBcnRpZmFjdERlc2NyaXB0aW9uIG5hbWU9ImFydGlmYWN0X0IxLF9tcUozQUI4UEVkcXNoTU5TSTA3WE9nIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iVHVlIFNlcCAwNiAxNTozNzo0MCBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iQXJ0aWZhY3QgQjEgbWFpbiIga2V5Q29uc2lkZXJhdGlvbnM9IkFydGlmYWN0IEIxIGtleSIgZXh0ZXJuYWxJZD0iQXJ0aWZhY3QgQjEgdW5pcXVlIElEIiBwdXJwb3NlPSJBcnRpZmFjdCBCMSBwb3Jwb2lzZSIgaW1wYWN0T2ZOb3RIYXZpbmc9IkFydGlmYWN0IEIxIGltcGFjdCIgcmVhc29uc0Zvck5vdE5lZWRpbmc9IkFydGlmYWN0IEIxIHJlYXNvbiIgYnJpZWZPdXRsaW5lPSJBcnRpZmFjdCBCMSBvdXRsaW5lIiByZXByZXNlbnRhdGlvbk9wdGlvbnM9IkFydGlmYWN0IEIxIHJlcCI+Ci08L0FydGlmYWN0RGVzY3JpcHRpb24+Ci08c3VwcG9ydGluZ01hdGVyaWFscyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvc3VwcG9ydGluZ19tYXRlcmlhbF9CMSI+Ci08L3N1cHBvcnRpbmdNYXRlcmlhbHM+Ci08Y29uY2VwdHNBbmRQYXBlcnMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL2NvbmNlcHRfQjEiPgotPC9jb25jZXB0c0FuZFBhcGVycz4KLTxjb25jZXB0c0FuZFBhcGVycyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvd2hpdGVwYXBlcl9CMSI+Ci08L2NvbmNlcHRzQW5kUGFwZXJzPgotPGNoZWNrbGlzdHMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL2NoZWNrbGlzdF9CMSI+Ci08L2NoZWNrbGlzdHM+Ci08Z3VpZGVsaW5lcyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvZ3VpZGVsaW5lX0IxIj4KLTwvZ3VpZGVsaW5lcz4KLTxleGFtcGxlcyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvZXhhbXBsZV9CMSI+Ci08L2V4YW1wbGVzPgotPGFzc2V0cyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvcmV1c2FibGVfYXNzZXRfQjEiPgotPC9hc3NldHM+Ci08cmVwb3J0cyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvcmVwb3J0X0IxIj4KLTwvcmVwb3J0cz4KLTx0ZW1wbGF0ZXMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL3RlbXBsYXRlX0IxIj4KLTwvdGVtcGxhdGVzPgotPHRvb2xNZW50b3JzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS90b29sbWVudG9yX0IxIj4KLTwvdG9vbE1lbnRvcnM+Ci08L0FydGlmYWN0PgotPEFydGlmYWN0IG5hbWU9ImFydGlmYWN0X0IyIiBicmllZkRlc2NyaXB0aW9uPSJBcnRpZmFjdCBCMiBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iQXJ0aWZhY3QgQjIgcHJlc2VudCIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08QXJ0aWZhY3REZXNjcmlwdGlvbiBuYW1lPSJhcnRpZmFjdF9CMixfX3lHN2NCOG1FZHExT28tRG93ZHBCZyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURhdGU9IlR1ZSBTZXAgMDYgMTU6Mzk6MDQgUERUIDIwMDUiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249IkFydGlmYWN0IEIyIG1haW4iIGtleUNvbnNpZGVyYXRpb25zPSJBcnRpZmFjdCBCMiBrZXkiIGV4dGVybmFsSWQ9IkFydGlmYWN0IEIyIHVuaXF1ZSBJRCIgcHVycG9zZT0iQXJ0aWZhY3QgQjIgcG9ycG9pc2UiIGltcGFjdE9mTm90SGF2aW5nPSJBcnRpZmFjdCBCMiBpbXBhY3QiIHJlYXNvbnNGb3JOb3ROZWVkaW5nPSJBcnRpZmFjdCBCMiByZWFzb24iIGJyaWVmT3V0bGluZT0iQXJ0aWZhY3QgQjIgb3V0bGluZSIgcmVwcmVzZW50YXRpb25PcHRpb25zPSJBcnRpZmFjdCBCMiByZXAiPgotPC9BcnRpZmFjdERlc2NyaXB0aW9uPgotPHN1cHBvcnRpbmdNYXRlcmlhbHMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL3N1cHBvcnRpbmdfbWF0ZXJpYWxfQjIiPgotPC9zdXBwb3J0aW5nTWF0ZXJpYWxzPgotPGNvbmNlcHRzQW5kUGFwZXJzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9jb25jZXB0X0IyIj4KLTwvY29uY2VwdHNBbmRQYXBlcnM+Ci08Y29uY2VwdHNBbmRQYXBlcnMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL3doaXRlcGFwZXJfQjIiPgotPC9jb25jZXB0c0FuZFBhcGVycz4KLTxjaGVja2xpc3RzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9jaGVja2xpc3RfQjIiPgotPC9jaGVja2xpc3RzPgotPGd1aWRlbGluZXMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL2d1aWRlbGluZV9CMiI+Ci08L2d1aWRlbGluZXM+Ci08ZXhhbXBsZXMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL2V4YW1wbGVfQjIiPgotPC9leGFtcGxlcz4KLTxhc3NldHMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL3JldXNhYmxlX2Fzc2V0X0IyIj4KLTwvYXNzZXRzPgotPHJlcG9ydHMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL3JlcG9ydF9CMiI+Ci08L3JlcG9ydHM+Ci08dGVtcGxhdGVzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS90ZW1wbGF0ZV9CMiI+Ci08L3RlbXBsYXRlcz4KLTx0b29sTWVudG9ycyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvdG9vbG1lbnRvcl9CMiI+Ci08L3Rvb2xNZW50b3JzPgotPC9BcnRpZmFjdD4KLTxEZWxpdmVyYWJsZSBuYW1lPSJkZWxpdmVyYWJsZV9CMSIgYnJpZWZEZXNjcmlwdGlvbj0iRGVsaXZlcmFibGUgQjEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IkRlbGl2ZXJhYmxlIEIxIHByZXNlbnQiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPERlbGl2ZXJhYmxlRGVzY3JpcHRpb24gbmFtZT0iZGVsaXZlcmFibGVfQjEsX1pIZjJZQjhuRWRxMU9vLURvd2RwQmciIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJUdWUgU2VwIDA2IDE1OjQyOjE0IFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSJEZWxpdmVyYWJsZSBCMSBtYWluIiBrZXlDb25zaWRlcmF0aW9ucz0iRGVsaXZlcmFibGUgQjEga2V5IiBleHRlcm5hbElkPSJEZWxpdmVyYWJsZSBCMSB1bmlxdWUgSUQiIHB1cnBvc2U9IkRlbGl2ZXJhYmxlIEIxIHBvcnBvaXNlIiBpbXBhY3RPZk5vdEhhdmluZz0iRGVsaXZlcmFibGUgQjEgaW1wYWN0IiByZWFzb25zRm9yTm90TmVlZGluZz0iRGVsaXZlcmFibGUgQjEgcmVhc29uIiBleHRlcm5hbERlc2NyaXB0aW9uPSJEZWxpdmVyYWJsZSBCMSBleHRlcm4iIHBhY2thZ2luZ0d1aWRhbmNlPSJEZWxpdmVyYWJsZSBCMSBwYWNrIj4KLTwvRGVsaXZlcmFibGVEZXNjcmlwdGlvbj4KLTxzdXBwb3J0aW5nTWF0ZXJpYWxzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9zdXBwb3J0aW5nX21hdGVyaWFsX0IxIj4KLTwvc3VwcG9ydGluZ01hdGVyaWFscz4KLTxjb25jZXB0c0FuZFBhcGVycyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvY29uY2VwdF9CMSI+Ci08L2NvbmNlcHRzQW5kUGFwZXJzPgotPGNvbmNlcHRzQW5kUGFwZXJzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS93aGl0ZXBhcGVyX0IxIj4KLTwvY29uY2VwdHNBbmRQYXBlcnM+Ci08Y2hlY2tsaXN0cyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvY2hlY2tsaXN0X0IxIj4KLTwvY2hlY2tsaXN0cz4KLTxndWlkZWxpbmVzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9ndWlkZWxpbmVfQjEiPgotPC9ndWlkZWxpbmVzPgotPGV4YW1wbGVzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9leGFtcGxlX0IxIj4KLTwvZXhhbXBsZXM+Ci08YXNzZXRzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9yZXVzYWJsZV9hc3NldF9CMSI+Ci08L2Fzc2V0cz4KLTxyZXBvcnRzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9yZXBvcnRfQjEiPgotPC9yZXBvcnRzPgotPHRlbXBsYXRlcyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvdGVtcGxhdGVfQjEiPgotPC90ZW1wbGF0ZXM+Ci08dG9vbE1lbnRvcnMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL3Rvb2xtZW50b3JfQjEiPgotPC90b29sTWVudG9ycz4KLTxkZWxpdmVyZWRXb3JrUHJvZHVjdHMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL2FydGlmYWN0X0IxIj4KLTwvZGVsaXZlcmVkV29ya1Byb2R1Y3RzPgotPGRlbGl2ZXJlZFdvcmtQcm9kdWN0cyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvb3V0Y29tZV9CMSI+Ci08L2RlbGl2ZXJlZFdvcmtQcm9kdWN0cz4KLTwvRGVsaXZlcmFibGU+Ci08T3V0Y29tZSBuYW1lPSJvdXRjb21lX0IyIiBicmllZkRlc2NyaXB0aW9uPSJPdXRjb21lIEIyIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJPdXRjb21lIEIyIHByZXNlbnQiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPFdvcmtQcm9kdWN0RGVzY3JpcHRpb24gbmFtZT0ib3V0Y29tZV9CMixfYXNGT2tCOG5FZHExT28tRG93ZHBCZyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURhdGU9IlR1ZSBTZXAgMDYgMTU6NDY6MDEgUERUIDIwMDUiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249Ik91dGNvbWUgQjIgbWFpbiIga2V5Q29uc2lkZXJhdGlvbnM9Ik91dGNvbWUgQjIga2V5IiBleHRlcm5hbElkPSJPdXRjb21lIEIyIHVuaXF1ZSBJRCIgcHVycG9zZT0iT3V0Y29tZSBCMiBwb3Jwb2lzZSIgaW1wYWN0T2ZOb3RIYXZpbmc9Ik91dGNvbWUgQjIgaW1wYWN0IiByZWFzb25zRm9yTm90TmVlZGluZz0iT3V0Y29tZSBCMiByZWFzb24iPgotPC9Xb3JrUHJvZHVjdERlc2NyaXB0aW9uPgotPHN1cHBvcnRpbmdNYXRlcmlhbHMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL3N1cHBvcnRpbmdfbWF0ZXJpYWxfQjIiPgotPC9zdXBwb3J0aW5nTWF0ZXJpYWxzPgotPGNvbmNlcHRzQW5kUGFwZXJzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9jb25jZXB0X0IyIj4KLTwvY29uY2VwdHNBbmRQYXBlcnM+Ci08Y29uY2VwdHNBbmRQYXBlcnMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL3doaXRlcGFwZXJfQjIiPgotPC9jb25jZXB0c0FuZFBhcGVycz4KLTxjaGVja2xpc3RzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9jaGVja2xpc3RfQjIiPgotPC9jaGVja2xpc3RzPgotPGd1aWRlbGluZXMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL2d1aWRlbGluZV9CMiI+Ci08L2d1aWRlbGluZXM+Ci08ZXhhbXBsZXMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL2V4YW1wbGVfQjIiPgotPC9leGFtcGxlcz4KLTxhc3NldHMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL3JldXNhYmxlX2Fzc2V0X0IyIj4KLTwvYXNzZXRzPgotPHJlcG9ydHMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL3JlcG9ydF9CMiI+Ci08L3JlcG9ydHM+Ci08dGVtcGxhdGVzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS90ZW1wbGF0ZV9CMiI+Ci08L3RlbXBsYXRlcz4KLTx0b29sTWVudG9ycyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvdG9vbG1lbnRvcl9CMiI+Ci08L3Rvb2xNZW50b3JzPgotPC9PdXRjb21lPgotPE91dGNvbWUgbmFtZT0ib3V0Y29tZV9CMSIgYnJpZWZEZXNjcmlwdGlvbj0iT3V0Y29tZSBCMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iT3V0Y29tZSBCMSBwcmVzZW50IiB2YXJpYWJpbGl0eVR5cGU9Im5hIj4KLTxXb3JrUHJvZHVjdERlc2NyaXB0aW9uIG5hbWU9Im91dGNvbWVfQjEsX2NYWHJzQjhuRWRxMU9vLURvd2RwQmciIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJUdWUgU2VwIDA2IDE1OjQ3OjM4IFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSJPdXRjb21lIEIxIG1haW4iIGtleUNvbnNpZGVyYXRpb25zPSJPdXRjb21lIEIxIGtleSIgZXh0ZXJuYWxJZD0iT3V0Y29tZSBCMSB1bmlxdWUgSUQiIHB1cnBvc2U9Ik91dGNvbWUgQjEgcG9ycG9pc2UiIGltcGFjdE9mTm90SGF2aW5nPSJPdXRjb21lIEIxIGltcGFjdCIgcmVhc29uc0Zvck5vdE5lZWRpbmc9Ik91dGNvbWUgQjEgcmVhc29uIj4KLTwvV29ya1Byb2R1Y3REZXNjcmlwdGlvbj4KLTxzdXBwb3J0aW5nTWF0ZXJpYWxzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9zdXBwb3J0aW5nX21hdGVyaWFsX0IxIj4KLTwvc3VwcG9ydGluZ01hdGVyaWFscz4KLTxjb25jZXB0c0FuZFBhcGVycyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvY29uY2VwdF9CMSI+Ci08L2NvbmNlcHRzQW5kUGFwZXJzPgotPGNvbmNlcHRzQW5kUGFwZXJzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS93aGl0ZXBhcGVyX0IxIj4KLTwvY29uY2VwdHNBbmRQYXBlcnM+Ci08Y2hlY2tsaXN0cyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvY2hlY2tsaXN0X0IxIj4KLTwvY2hlY2tsaXN0cz4KLTxndWlkZWxpbmVzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9ndWlkZWxpbmVfQjEiPgotPC9ndWlkZWxpbmVzPgotPGV4YW1wbGVzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9leGFtcGxlX0IxIj4KLTwvZXhhbXBsZXM+Ci08YXNzZXRzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9yZXVzYWJsZV9hc3NldF9CMSI+Ci08L2Fzc2V0cz4KLTxyZXBvcnRzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9yZXBvcnRfQjEiPgotPC9yZXBvcnRzPgotPHRlbXBsYXRlcyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvdGVtcGxhdGVfQjEiPgotPC90ZW1wbGF0ZXM+Ci08dG9vbE1lbnRvcnMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL3Rvb2xtZW50b3JfQjEiPgotPC90b29sTWVudG9ycz4KLTwvT3V0Y29tZT4KLTxEZWxpdmVyYWJsZSBuYW1lPSJkZWxpdmVyYWJsZV9CMiIgYnJpZWZEZXNjcmlwdGlvbj0iRGVsaXZlcmFibGUgQjIgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IkRlbGl2ZXJhYmxlIEIyIHByZXNlbnQiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPERlbGl2ZXJhYmxlRGVzY3JpcHRpb24gbmFtZT0iZGVsaXZlcmFibGVfQjIsX25xRldFQjhuRWRxMU9vLURvd2RwQmciIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJUdWUgU2VwIDA2IDE1OjQzOjMwIFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSJEZWxpdmVyYWJsZSBCMiBtYWluIiBrZXlDb25zaWRlcmF0aW9ucz0iRGVsaXZlcmFibGUgQjIga2V5IiBleHRlcm5hbElkPSJEZWxpdmVyYWJsZSBCMiB1bmlxdWUgSUQiIHB1cnBvc2U9IkRlbGl2ZXJhYmxlIEIyIHBvcnBvaXNlIiBpbXBhY3RPZk5vdEhhdmluZz0iRGVsaXZlcmFibGUgQjIgaW1wYWN0IiByZWFzb25zRm9yTm90TmVlZGluZz0iRGVsaXZlcmFibGUgQjIgcmVhc29uIiBleHRlcm5hbERlc2NyaXB0aW9uPSJEZWxpdmVyYWJsZSBCMiBleHRlcm4iIHBhY2thZ2luZ0d1aWRhbmNlPSJEZWxpdmVyYWJsZSBCMiBwYWNrIj4KLTwvRGVsaXZlcmFibGVEZXNjcmlwdGlvbj4KLTxzdXBwb3J0aW5nTWF0ZXJpYWxzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9zdXBwb3J0aW5nX21hdGVyaWFsX0IyIj4KLTwvc3VwcG9ydGluZ01hdGVyaWFscz4KLTxjb25jZXB0c0FuZFBhcGVycyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvY29uY2VwdF9CMiI+Ci08L2NvbmNlcHRzQW5kUGFwZXJzPgotPGNvbmNlcHRzQW5kUGFwZXJzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS93aGl0ZXBhcGVyX0IyIj4KLTwvY29uY2VwdHNBbmRQYXBlcnM+Ci08Y2hlY2tsaXN0cyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvY2hlY2tsaXN0X0IyIj4KLTwvY2hlY2tsaXN0cz4KLTxndWlkZWxpbmVzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9ndWlkZWxpbmVfQjIiPgotPC9ndWlkZWxpbmVzPgotPGV4YW1wbGVzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9leGFtcGxlX0IyIj4KLTwvZXhhbXBsZXM+Ci08YXNzZXRzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9yZXVzYWJsZV9hc3NldF9CMiI+Ci08L2Fzc2V0cz4KLTxyZXBvcnRzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9yZXBvcnRfQjIiPgotPC9yZXBvcnRzPgotPHRlbXBsYXRlcyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvdGVtcGxhdGVfQjIiPgotPC90ZW1wbGF0ZXM+Ci08dG9vbE1lbnRvcnMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL3Rvb2xtZW50b3JfQjIiPgotPC90b29sTWVudG9ycz4KLTxkZWxpdmVyZWRXb3JrUHJvZHVjdHMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL2FydGlmYWN0X0IyIj4KLTwvZGVsaXZlcmVkV29ya1Byb2R1Y3RzPgotPGRlbGl2ZXJlZFdvcmtQcm9kdWN0cyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvb3V0Y29tZV9CMiI+Ci08L2RlbGl2ZXJlZFdvcmtQcm9kdWN0cz4KLTwvRGVsaXZlcmFibGU+Ci08Q2hlY2tsaXN0IG5hbWU9ImNoZWNrbGlzdF9CMSIgYnJpZWZEZXNjcmlwdGlvbj0iQ2hlY2tsaXN0IEIxIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJDaGVja2xpc3QgQjEgcHJlc2VudCIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08Q29udGVudERlc2NyaXB0aW9uIG5hbWU9ImNoZWNrbGlzdF9CMSxfdXJMZGNCOHJFZHFRdk9qWDhkb0NDdyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURhdGU9IlR1ZSBTZXAgMDYgMTY6Mjc6MjIgUERUIDIwMDUiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249IkNoZWNrbGlzdCBCMSBjb250ZW50IiBrZXlDb25zaWRlcmF0aW9ucz0iIj4KLTwvQ29udGVudERlc2NyaXB0aW9uPgotPC9DaGVja2xpc3Q+Ci08Q2hlY2tsaXN0IG5hbWU9ImNoZWNrbGlzdF9CMiIgYnJpZWZEZXNjcmlwdGlvbj0iQ2hlY2tsaXN0IEIyIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJDaGVja2xpc3QgQjIgcHJlc2VudCIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08Q29udGVudERlc2NyaXB0aW9uIG5hbWU9ImNoZWNrbGlzdF9CMixfd0V1cVVCOHJFZHFRdk9qWDhkb0NDdyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURhdGU9IlR1ZSBTZXAgMDYgMTY6Mjg6MDQgUERUIDIwMDUiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249IkNoZWNrbGlzdCBCMiBjb250ZW50IiBrZXlDb25zaWRlcmF0aW9ucz0iIj4KLTwvQ29udGVudERlc2NyaXB0aW9uPgotPC9DaGVja2xpc3Q+Ci08Q29uY2VwdCBuYW1lPSJjb25jZXB0X0IxIiBicmllZkRlc2NyaXB0aW9uPSJDb25jZXB0IEIxIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJDb25jZXB0IEIxIHByZXNlbnQiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPENvbnRlbnREZXNjcmlwdGlvbiBuYW1lPSJjb25jZXB0X0IxLF93NkU5OEI4ckVkcVF2T2pYOGRvQ0N3IiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iVHVlIFNlcCAwNiAxNjoxNjowMSBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iQ29uY2VwdCBCMSBjb250ZXh0IiBrZXlDb25zaWRlcmF0aW9ucz0iIj4KLTwvQ29udGVudERlc2NyaXB0aW9uPgotPC9Db25jZXB0PgotPENvbmNlcHQgbmFtZT0iY29uY2VwdF9CMiIgYnJpZWZEZXNjcmlwdGlvbj0iQ29uY2VwdCBCMiBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iQ29uY2VwdCBCMiBwcmVzZW50IiB2YXJpYWJpbGl0eVR5cGU9Im5hIj4KLTxDb250ZW50RGVzY3JpcHRpb24gbmFtZT0iY29uY2VwdF9CMixfeG5GTjRCOHJFZHFRdk9qWDhkb0NDdyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURhdGU9IlR1ZSBTZXAgMDYgMTY6MTY6MjcgUERUIDIwMDUiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249IkNvbmNlcHQgQjIgY29udGV4dCIga2V5Q29uc2lkZXJhdGlvbnM9IiI+Ci08L0NvbnRlbnREZXNjcmlwdGlvbj4KLTwvQ29uY2VwdD4KLTxFeGFtcGxlIG5hbWU9ImV4YW1wbGVfQjEiIGJyaWVmRGVzY3JpcHRpb249IkV4YW1wbGUgQjEgcmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iRXhhbXBsZSBCMSBwcmVzZW50IiB2YXJpYWJpbGl0eVR5cGU9Im5hIj4KLTxDb250ZW50RGVzY3JpcHRpb24gbmFtZT0iZXhhbXBsZV9CMSxfeVF6Z1VCOHJFZHFRdk9qWDhkb0NDdyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURhdGU9IlR1ZSBTZXAgMDYgMTY6Mjg6MzcgUERUIDIwMDUiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249IkV4YW1wbGUgQjEgY29udGVudCIga2V5Q29uc2lkZXJhdGlvbnM9IiI+Ci08L0NvbnRlbnREZXNjcmlwdGlvbj4KLTwvRXhhbXBsZT4KLTxFeGFtcGxlIG5hbWU9ImV4YW1wbGVfQjIiIGJyaWVmRGVzY3JpcHRpb249IkV4YW1wbGUgQjIgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IkV4YW1wbGUgQjIgcHJlc2VudCIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08Q29udGVudERlc2NyaXB0aW9uIG5hbWU9Im5ld19leGFtcGxlX0IyLF96QW9hd0I4ckVkcVF2T2pYOGRvQ0N3IiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iVHVlIFNlcCAwNiAxNjoyOToxOCBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iRXhhbXBsZSBCMiBjb250ZW50IiBrZXlDb25zaWRlcmF0aW9ucz0iIj4KLTwvQ29udGVudERlc2NyaXB0aW9uPgotPC9FeGFtcGxlPgotPEd1aWRlbGluZSBuYW1lPSJndWlkZWxpbmVfQjEiIGJyaWVmRGVzY3JpcHRpb249Ikd1aWRlbGluZSBCMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iR3VpZGVsaW5lIEIxIHByZXNlbnQiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPENvbnRlbnREZXNjcmlwdGlvbiBuYW1lPSJndWlkZWxpbmVfQjEsX3prWlBJQjhyRWRxUXZPalg4ZG9DQ3ciIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJUdWUgU2VwIDA2IDE2OjM3OjU1IFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSJHdWlkZWxpbmUgQjEgY29udGVudCIga2V5Q29uc2lkZXJhdGlvbnM9IiI+Ci08L0NvbnRlbnREZXNjcmlwdGlvbj4KLTwvR3VpZGVsaW5lPgotPEd1aWRlbGluZSBuYW1lPSJndWlkZWxpbmVfQjIiIGJyaWVmRGVzY3JpcHRpb249Ikd1aWRlbGluZSBCMiBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iR3VpZGVsaW5lIEIyIiB2YXJpYWJpbGl0eVR5cGU9Im5hIj4KLTxDb250ZW50RGVzY3JpcHRpb24gbmFtZT0iZ3VpZGVsaW5lX0IyLF8wUWd1UUI4ckVkcVF2T2pYOGRvQ0N3IiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iVHVlIFNlcCAwNiAxNjo0Njo1NCBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iR3VpZGVsaW5lIEIyIGNvbnRlbnQiIGtleUNvbnNpZGVyYXRpb25zPSIiPgotPC9Db250ZW50RGVzY3JpcHRpb24+Ci08L0d1aWRlbGluZT4KLTxQcmFjdGljZSBuYW1lPSJwcmFjdGljZV9CMSIgYnJpZWZEZXNjcmlwdGlvbj0iUHJhY3RpY2UgQjEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IlByYWN0aWNlIEIxIHByZXNlbnQiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPFByYWN0aWNlRGVzY3JpcHRpb24gbmFtZT0icHJhY3RpY2VfQjEsXzFJLW5VQjhyRWRxUXZPalg4ZG9DQ3ciIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJUdWUgU2VwIDA2IDE2OjQyOjAwIFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSJQcmFjdGljZSBCMSBjb250ZW50IiBrZXlDb25zaWRlcmF0aW9ucz0iIiBhZGRpdGlvbmFsSW5mbz0iUHJhY3RpY2UgQjEgYWRkIiBwcm9ibGVtPSJQcmFjdGljZSBCMSBwcm9iIiBiYWNrZ3JvdW5kPSJQcmFjdGljZSBCMSBiYWNrIiBnb2Fscz0iUHJhY3RpY2UgQjEgZ29hbCIgYXBwbGljYXRpb249IlByYWN0aWNlIEIxIGFwcCIgbGV2ZWxzT2ZBZG9wdGlvbj0iUHJhY3RpY2UgQjEgbGV2ZWwiPgotPC9QcmFjdGljZURlc2NyaXB0aW9uPgotPFByYWN0aWNlIG5hbWU9InByYWN0aWNlX0IxLjEiIGJyaWVmRGVzY3JpcHRpb249IlByYWN0aWNlIEIxLjEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IlByYWN0aWNlIEIxLjEgcHJlc2VudCIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08UHJhY3RpY2VEZXNjcmlwdGlvbiBuYW1lPSJwcmFjdGljZV9CMS4xLF8ydk0tUUI4ckVkcVF2T2pYOGRvQ0N3IiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iVHVlIFNlcCAwNiAxNjo0Mzo0OCBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iUHJhY3RpY2UgQjEuMSBjb250ZW50IiBrZXlDb25zaWRlcmF0aW9ucz0iIiBhZGRpdGlvbmFsSW5mbz0iUHJhY3RpY2UgQjEuMSBhZGQiIHByb2JsZW09IlByYWN0aWNlIEIxLjEgcHJvYiIgYmFja2dyb3VuZD0iUHJhY3RpY2UgQjEuMSBiYWNrIiBnb2Fscz0iUHJhY3RpY2UgQjEuMSBnb2FsIiBhcHBsaWNhdGlvbj0iUHJhY3RpY2UgQjEuMSBhcHAiIGxldmVsc09mQWRvcHRpb249IlByYWN0aWNlIEIxLjEgbGV2ZWwiPgotPC9QcmFjdGljZURlc2NyaXB0aW9uPgotPC9QcmFjdGljZT4KLTxjb250ZW50UmVmZXJlbmNlcyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvYXJ0aWZhY3RfQjEiPgotPC9jb250ZW50UmVmZXJlbmNlcz4KLTxjb250ZW50UmVmZXJlbmNlcyBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXRlZ29yaWVzL0N1c3RvbUNhdGVnb3JpZXMvY3VzdG9tX2NhdGVnb3J5X0IxIj4KLTwvY29udGVudFJlZmVyZW5jZXM+Ci08Y29udGVudFJlZmVyZW5jZXMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2F0ZWdvcmllcy9EaXNjaXBsaW5lcy9kaXNjaXBsaW5lX0IxIj4KLTwvY29udGVudFJlZmVyZW5jZXM+Ci08Y29udGVudFJlZmVyZW5jZXMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2F0ZWdvcmllcy9Eb21haW5zL2RvbWFpbl9CMSI+Ci08L2NvbnRlbnRSZWZlcmVuY2VzPgotPGNvbnRlbnRSZWZlcmVuY2VzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NhdGVnb3JpZXMvUm9sZVNldHMvcm9sZV9zZXRfQjEiPgotPC9jb250ZW50UmVmZXJlbmNlcz4KLTxjb250ZW50UmVmZXJlbmNlcyBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXRlZ29yaWVzL1Rvb2xzL3Rvb2xfQjEiPgotPC9jb250ZW50UmVmZXJlbmNlcz4KLTxjb250ZW50UmVmZXJlbmNlcyBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXRlZ29yaWVzL1dQIFR5cGVzL3dvcmtfcHJvZHVjdF90eXBlX0IxIj4KLTwvY29udGVudFJlZmVyZW5jZXM+Ci08Y29udGVudFJlZmVyZW5jZXMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL2NoZWNrbGlzdF9CMSI+Ci08L2NvbnRlbnRSZWZlcmVuY2VzPgotPGNvbnRlbnRSZWZlcmVuY2VzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9jb25jZXB0X0IxIj4KLTwvY29udGVudFJlZmVyZW5jZXM+Ci08Y29udGVudFJlZmVyZW5jZXMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL2RlbGl2ZXJhYmxlX0IxIj4KLTwvY29udGVudFJlZmVyZW5jZXM+Ci08Y29udGVudFJlZmVyZW5jZXMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL2V4YW1wbGVfQjEiPgotPC9jb250ZW50UmVmZXJlbmNlcz4KLTxjb250ZW50UmVmZXJlbmNlcyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvZ3VpZGVsaW5lX0IxIj4KLTwvY29udGVudFJlZmVyZW5jZXM+Ci08Y29udGVudFJlZmVyZW5jZXMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL291dGNvbWVfQjEiPgotPC9jb250ZW50UmVmZXJlbmNlcz4KLTxjb250ZW50UmVmZXJlbmNlcyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvcHJhY3RpY2VfQjIiPgotPC9jb250ZW50UmVmZXJlbmNlcz4KLTxjb250ZW50UmVmZXJlbmNlcyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvcmVwb3J0X0IxIj4KLTwvY29udGVudFJlZmVyZW5jZXM+Ci08Y29udGVudFJlZmVyZW5jZXMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL3JldXNhYmxlX2Fzc2V0X0IxIj4KLTwvY29udGVudFJlZmVyZW5jZXM+Ci08Y29udGVudFJlZmVyZW5jZXMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL3JvYWRtYXBfQjEiPgotPC9jb250ZW50UmVmZXJlbmNlcz4KLTxjb250ZW50UmVmZXJlbmNlcyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvcm9sZV9CMSI+Ci08L2NvbnRlbnRSZWZlcmVuY2VzPgotPGNvbnRlbnRSZWZlcmVuY2VzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9zdXBwb3J0aW5nX21hdGVyaWFsX0IxIj4KLTwvY29udGVudFJlZmVyZW5jZXM+Ci08Y29udGVudFJlZmVyZW5jZXMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL3Rhc2tfQjEiPgotPC9jb250ZW50UmVmZXJlbmNlcz4KLTxjb250ZW50UmVmZXJlbmNlcyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvdGVtcGxhdGVfQjEiPgotPC9jb250ZW50UmVmZXJlbmNlcz4KLTxjb250ZW50UmVmZXJlbmNlcyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvdG9vbG1lbnRvcl9CMSI+Ci08L2NvbnRlbnRSZWZlcmVuY2VzPgotPGNvbnRlbnRSZWZlcmVuY2VzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS93aGl0ZXBhcGVyX0IxIj4KLTwvY29udGVudFJlZmVyZW5jZXM+Ci08Y29udGVudFJlZmVyZW5jZXMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2F0ZWdvcmllcy9DdXN0b21DYXRlZ29yaWVzL2N1c3RvbV9jYXRlZ29yeV9CMS4xIj4KLTwvY29udGVudFJlZmVyZW5jZXM+Ci08L1ByYWN0aWNlPgotPFByYWN0aWNlIG5hbWU9InByYWN0aWNlX0IyIiBicmllZkRlc2NyaXB0aW9uPSJQcmFjdGljZSBCMiBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iUHJhY3RpY2UgQjIgcHJlc2VudCIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08UHJhY3RpY2VEZXNjcmlwdGlvbiBuYW1lPSJwcmFjdGljZV9CMixfNGkxZkVCOHJFZHFRdk9qWDhkb0NDdyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURhdGU9IlR1ZSBTZXAgMDYgMTY6NDA6NTAgUERUIDIwMDUiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249IlByYWN0aWNlIEIyIGNvbnRlbnQiIGtleUNvbnNpZGVyYXRpb25zPSIiIGFkZGl0aW9uYWxJbmZvPSJQcmFjdGljZSBCMiBhZGQiIHByb2JsZW09IlByYWN0aWNlIEIyIHByb2IiIGJhY2tncm91bmQ9IlByYWN0aWNlIEIyIGJhY2siIGdvYWxzPSJQcmFjdGljZSBCMiBnb2FsIiBhcHBsaWNhdGlvbj0iUHJhY3RpY2UmYW1wO25ic3A7IGFwcCIgbGV2ZWxzT2ZBZG9wdGlvbj0iUHJhY3RpY2UgQjIgbGV2ZWwiPgotPC9QcmFjdGljZURlc2NyaXB0aW9uPgotPGNvbnRlbnRSZWZlcmVuY2VzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9hcnRpZmFjdF9CMiI+Ci08L2NvbnRlbnRSZWZlcmVuY2VzPgotPGNvbnRlbnRSZWZlcmVuY2VzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9jaGVja2xpc3RfQjIiPgotPC9jb250ZW50UmVmZXJlbmNlcz4KLTxjb250ZW50UmVmZXJlbmNlcyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvY29uY2VwdF9CMiI+Ci08L2NvbnRlbnRSZWZlcmVuY2VzPgotPGNvbnRlbnRSZWZlcmVuY2VzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9kZWxpdmVyYWJsZV9CMiI+Ci08L2NvbnRlbnRSZWZlcmVuY2VzPgotPGNvbnRlbnRSZWZlcmVuY2VzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9leGFtcGxlX0IyIj4KLTwvY29udGVudFJlZmVyZW5jZXM+Ci08Y29udGVudFJlZmVyZW5jZXMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL2d1aWRlbGluZV9CMiI+Ci08L2NvbnRlbnRSZWZlcmVuY2VzPgotPGNvbnRlbnRSZWZlcmVuY2VzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9vdXRjb21lX0IyIj4KLTwvY29udGVudFJlZmVyZW5jZXM+Ci08Y29udGVudFJlZmVyZW5jZXMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL3ByYWN0aWNlX0IxIj4KLTwvY29udGVudFJlZmVyZW5jZXM+Ci08Y29udGVudFJlZmVyZW5jZXMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL3ByYWN0aWNlX0IxL3ByYWN0aWNlX0IxLjEiPgotPC9jb250ZW50UmVmZXJlbmNlcz4KLTxjb250ZW50UmVmZXJlbmNlcyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvcmVwb3J0X0IyIj4KLTwvY29udGVudFJlZmVyZW5jZXM+Ci08Y29udGVudFJlZmVyZW5jZXMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL3JldXNhYmxlX2Fzc2V0X0IyIj4KLTwvY29udGVudFJlZmVyZW5jZXM+Ci08Y29udGVudFJlZmVyZW5jZXMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL3JvYWRtYXBfQjIiPgotPC9jb250ZW50UmVmZXJlbmNlcz4KLTxjb250ZW50UmVmZXJlbmNlcyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvcm9sZV9CMiI+Ci08L2NvbnRlbnRSZWZlcmVuY2VzPgotPGNvbnRlbnRSZWZlcmVuY2VzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9zdXBwb3J0aW5nX21hdGVyaWFsX0IyIj4KLTwvY29udGVudFJlZmVyZW5jZXM+Ci08Y29udGVudFJlZmVyZW5jZXMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL3Rhc2tfQjIiPgotPC9jb250ZW50UmVmZXJlbmNlcz4KLTxjb250ZW50UmVmZXJlbmNlcyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvdGVtcGxhdGVfQjIiPgotPC9jb250ZW50UmVmZXJlbmNlcz4KLTxjb250ZW50UmVmZXJlbmNlcyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvdG9vbG1lbnRvcl9CMiI+Ci08L2NvbnRlbnRSZWZlcmVuY2VzPgotPGNvbnRlbnRSZWZlcmVuY2VzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS93aGl0ZXBhcGVyX0IyIj4KLTwvY29udGVudFJlZmVyZW5jZXM+Ci08Y29udGVudFJlZmVyZW5jZXMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2F0ZWdvcmllcy9DdXN0b21DYXRlZ29yaWVzL2N1c3RvbV9jYXRlZ29yeV9CMiI+Ci08L2NvbnRlbnRSZWZlcmVuY2VzPgotPGNvbnRlbnRSZWZlcmVuY2VzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NhdGVnb3JpZXMvRGlzY2lwbGluZXMvZGlzY2lwbGluZV9CMiI+Ci08L2NvbnRlbnRSZWZlcmVuY2VzPgotPGNvbnRlbnRSZWZlcmVuY2VzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NhdGVnb3JpZXMvRG9tYWlucy9kb21haW5fQjIiPgotPC9jb250ZW50UmVmZXJlbmNlcz4KLTxjb250ZW50UmVmZXJlbmNlcyBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXRlZ29yaWVzL1JvbGVTZXRzL3JvbGVfc2V0X0IyIj4KLTwvY29udGVudFJlZmVyZW5jZXM+Ci08Y29udGVudFJlZmVyZW5jZXMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2F0ZWdvcmllcy9Ub29scy90b29sX0IyIj4KLTwvY29udGVudFJlZmVyZW5jZXM+Ci08Y29udGVudFJlZmVyZW5jZXMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2F0ZWdvcmllcy9XUCBUeXBlcy93b3JrX3Byb2R1Y3RfdHlwZV9CMiI+Ci08L2NvbnRlbnRSZWZlcmVuY2VzPgotPC9QcmFjdGljZT4KLTxSZXBvcnQgbmFtZT0icmVwb3J0X0IxIiBicmllZkRlc2NyaXB0aW9uPSJSZXBvcnQgQjEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IlJlcG9ydCBCMSBwcmVzZW50IiB2YXJpYWJpbGl0eVR5cGU9Im5hIj4KLTxDb250ZW50RGVzY3JpcHRpb24gbmFtZT0icmVwb3J0X0IxLF81a2phd0I4ckVkcVF2T2pYOGRvQ0N3IiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iVHVlIFNlcCAwNiAxNjozODozOCBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iUmVwb3J0IEIxIGNvbnRlbnQiIGtleUNvbnNpZGVyYXRpb25zPSIiPgotPC9Db250ZW50RGVzY3JpcHRpb24+Ci08L1JlcG9ydD4KLTxSZXBvcnQgbmFtZT0icmVwb3J0X0IyIiBicmllZkRlc2NyaXB0aW9uPSJSZXBvcnQgQjIgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IlJlcG9ydCBCMiBwcmVzZW50IiB2YXJpYWJpbGl0eVR5cGU9Im5hIj4KLTxDb250ZW50RGVzY3JpcHRpb24gbmFtZT0icmVwb3J0X0IyLF82T3VaSUI4ckVkcVF2T2pYOGRvQ0N3IiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iVHVlIFNlcCAwNiAxNjozOTowNyBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iUmVwb3J0IEIyIGNvbnRleHQiIGtleUNvbnNpZGVyYXRpb25zPSIiPgotPC9Db250ZW50RGVzY3JpcHRpb24+Ci08L1JlcG9ydD4KLTxSZXVzYWJsZUFzc2V0IG5hbWU9InJldXNhYmxlX2Fzc2V0X0IxIiBicmllZkRlc2NyaXB0aW9uPSJSZXVzYWJsZSBBc3NldCBCMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iUmV1c2FibGUgQXNzZXQgQjEgcHJlc2VudCIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08Q29udGVudERlc2NyaXB0aW9uIG5hbWU9InJldXNhYmxlX2Fzc2V0X0IxLF82N2s0RUI4ckVkcVF2T2pYOGRvQ0N3IiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iVHVlIFNlcCAwNiAxNjo0NjoxOSBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iUmV1c2FibGUgQXNzZXQgQjEgY29udGVudCIga2V5Q29uc2lkZXJhdGlvbnM9IiI+Ci08L0NvbnRlbnREZXNjcmlwdGlvbj4KLTwvUmV1c2FibGVBc3NldD4KLTxSZXVzYWJsZUFzc2V0IG5hbWU9InJldXNhYmxlX2Fzc2V0X0IyIiBicmllZkRlc2NyaXB0aW9uPSJSZXVzYWJsZSBBc3NldCBCMiBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iUmV1c2FibGUgQXNzZXQgQjIgcHJlc2VudCIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08Q29udGVudERlc2NyaXB0aW9uIG5hbWU9InJldXNhYmxlX2Fzc2V0X0IyLF83eE9Hb0I4ckVkcVF2T2pYOGRvQ0N3IiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iVHVlIFNlcCAwNiAxNjo0MDowMCBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iUmV1c2FibGUgQXNzZXQgQjIgY29udGVudCIga2V5Q29uc2lkZXJhdGlvbnM9IiI+Ci08L0NvbnRlbnREZXNjcmlwdGlvbj4KLTwvUmV1c2FibGVBc3NldD4KLTxSb2FkbWFwIG5hbWU9InJvYWRtYXBfQjEiIGJyaWVmRGVzY3JpcHRpb249IlJvYWRtYXAgQjEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IlJvYWRtYXAgQjEgcHJlc2VudCIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08Q29udGVudERlc2NyaXB0aW9uIG5hbWU9InJvYWRtYXBfQjEsXzhoV2pFQjhyRWRxUXZPalg4ZG9DQ3ciIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJUdWUgU2VwIDA2IDE2OjM2OjAyIFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSJSb2FkbWFwIEIxIGNvbnRlbnQiIGtleUNvbnNpZGVyYXRpb25zPSIiPgotPC9Db250ZW50RGVzY3JpcHRpb24+Ci08L1JvYWRtYXA+Ci08Um9hZG1hcCBuYW1lPSJyb2FkbWFwX0IyIiBicmllZkRlc2NyaXB0aW9uPSJSb2FkbWFwIEIyIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJSb2FkbWFwIEIyIHByZXNlbnQiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPENvbnRlbnREZXNjcmlwdGlvbiBuYW1lPSJyb2FkbWFwX0IyLF8tZ3dQQUI4ckVkcVF2T2pYOGRvQ0N3IiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iVHVlIFNlcCAwNiAxNjozNTozNSBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iUm9hZG1hcCBCMiBjb250ZW50IiBrZXlDb25zaWRlcmF0aW9ucz0iIj4KLTwvQ29udGVudERlc2NyaXB0aW9uPgotPC9Sb2FkbWFwPgotPFN1cHBvcnRpbmdNYXRlcmlhbCBuYW1lPSJzdXBwb3J0aW5nX21hdGVyaWFsX0IxIiBicmllZkRlc2NyaXB0aW9uPSJTdXBwb3J0aW5nIE1hdGVyaWFsIEIxIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJTdXBwb3J0aW5nIE1hdGVyaWFsIEIxIHByZXNlbnQiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPENvbnRlbnREZXNjcmlwdGlvbiBuYW1lPSJzdXBwb3J0aW5nX21hdGVyaWFsX0IxLF9fYktvMEI4ckVkcVF2T2pYOGRvQ0N3IiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iVHVlIFNlcCAwNiAxNjo0NTozMSBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iU3VwcG9ydGluZyBNYXRlcmlhbCBCMSBjb250ZW50IiBrZXlDb25zaWRlcmF0aW9ucz0iIj4KLTwvQ29udGVudERlc2NyaXB0aW9uPgotPC9TdXBwb3J0aW5nTWF0ZXJpYWw+Ci08U3VwcG9ydGluZ01hdGVyaWFsIG5hbWU9InN1cHBvcnRpbmdfbWF0ZXJpYWxfQjIiIGJyaWVmRGVzY3JpcHRpb249IlN1cHBvcnRpbmcgTWF0ZXJpYWwgQjIgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IlN1cHBvcnRpbmcgTWF0ZXJpYWwgQjIgcHJlc2VudCIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08Q29udGVudERlc2NyaXB0aW9uIG5hbWU9InN1cHBvcnRpbmdfbWF0ZXJpYWxfQjIsX0JONXh3QjhzRWRxUXZPalg4ZG9DQ3ciIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJUdWUgU2VwIDA2IDE2OjQ0OjUyIFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSJTdXBwb3J0aW5nIE1hdGVyaWFsIEIyIENvbnRlbnQiIGtleUNvbnNpZGVyYXRpb25zPSIiPgotPC9Db250ZW50RGVzY3JpcHRpb24+Ci08L1N1cHBvcnRpbmdNYXRlcmlhbD4KLTxUZW1wbGF0ZSBuYW1lPSJ0ZW1wbGF0ZV9CMSIgYnJpZWZEZXNjcmlwdGlvbj0iVGVtcGxhdGUgQjEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IlRlbXBsYXRlIEIxIHByZXNlbnQiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPEd1aWRhbmNlRGVzY3JpcHRpb24gbmFtZT0idGVtcGxhdGVfQjEsX0M5MFFNQjhzRWRxUXZPalg4ZG9DQ3ciIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJUdWUgU2VwIDA2IDE2OjM2OjUxIFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSJUZW1wbGF0ZSBCMSBjb250ZW50IiBrZXlDb25zaWRlcmF0aW9ucz0iIiBhdHRhY2htZW50cz0iIj4KLTwvR3VpZGFuY2VEZXNjcmlwdGlvbj4KLTwvVGVtcGxhdGU+Ci08VGVtcGxhdGUgbmFtZT0idGVtcGxhdGVfQjIiIGJyaWVmRGVzY3JpcHRpb249IlRlbXBsYXRlIEIyIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJUZW1wbGF0ZSBCMiBwcmVzZW50IiB2YXJpYWJpbGl0eVR5cGU9Im5hIj4KLTxHdWlkYW5jZURlc2NyaXB0aW9uIG5hbWU9InRlbXBsYXRlX0IyLF9ELXg5OEI4c0VkcVF2T2pYOGRvQ0N3IiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iVHVlIFNlcCAwNiAxNjoyNDo1NCBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iVGVtcGxhdGUgQjIgY29udGVudCIga2V5Q29uc2lkZXJhdGlvbnM9IiIgYXR0YWNobWVudHM9InJlc291cmNlcy9UZW1wbGF0ZSBmb3IgUGFzdGUgVGVzdCBDYXNlcy5kb2MiPgotPC9HdWlkYW5jZURlc2NyaXB0aW9uPgotPC9UZW1wbGF0ZT4KLTxUZXJtRGVmaW5pdGlvbiBuYW1lPSJ0ZXJtX2RlZmluaXRpb25fQjEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iVGVybSBEZWZpbml0aW9uIEIxIHByZXNlbnQiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPENvbnRlbnREZXNjcmlwdGlvbiBuYW1lPSJ0ZXJtX2RlZmluaXRpb25fQjEsX0Vwc2pNQjhzRWRxUXZPalg4ZG9DQ3ciIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJUdWUgU2VwIDA2IDE2OjIzOjU1IFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSJUZXJtIERlZmluaXRpb24gQjEgY29udGVudCIga2V5Q29uc2lkZXJhdGlvbnM9IiI+Ci08L0NvbnRlbnREZXNjcmlwdGlvbj4KLTwvVGVybURlZmluaXRpb24+Ci08VGVybURlZmluaXRpb24gbmFtZT0idGVybV9kZWZpbml0aW9uX0IyIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IlRlcm0gRGVmaW5pdGlvbiBCMiBicmllZiIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08Q29udGVudERlc2NyaXB0aW9uIG5hbWU9InRlcm1fZGVmaW5pdGlvbl9CMixfR0VTNDhCOHNFZHFRdk9qWDhkb0NDdyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURhdGU9IlR1ZSBTZXAgMDYgMTY6MjM6MTAgUERUIDIwMDUiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249IiZsdDtwJmd0OyYjMTM7JiMxMDsgICAgVGVybSBEZWZpbml0aW9uIEIyIGNvbnRlbnQmIzEzOyYjMTA7Jmx0Oy9wJmd0OyIga2V5Q29uc2lkZXJhdGlvbnM9IiI+Ci08L0NvbnRlbnREZXNjcmlwdGlvbj4KLTwvVGVybURlZmluaXRpb24+Ci08VG9vbE1lbnRvciBuYW1lPSJ0b29sbWVudG9yX0IxIiBicmllZkRlc2NyaXB0aW9uPSJUb29sbWVudG8gQjEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IlRvb2xtZW50b3IgQjEgcHJlc2VudCIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08Q29udGVudERlc2NyaXB0aW9uIG5hbWU9InRvb2xtZW50b3JfQjEsX0dvRHRVQjhzRWRxUXZPalg4ZG9DQ3ciIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJUdWUgU2VwIDA2IDE2OjIwOjM0IFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSJUb29sbWVudG9yIEIxIGNvbnRleHQiIGtleUNvbnNpZGVyYXRpb25zPSIiPgotPC9Db250ZW50RGVzY3JpcHRpb24+Ci08L1Rvb2xNZW50b3I+Ci08VG9vbE1lbnRvciBuYW1lPSJ0b29sbWVudG9yX0IyIiBicmllZkRlc2NyaXB0aW9uPSJUb29sbWVudG9yIEIyIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJUb29sbWVudG9yIEIyIHByZXNlbnQiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPENvbnRlbnREZXNjcmlwdGlvbiBuYW1lPSJ0b29sbWVudG9yX0IyLF9INE9Vc0I4c0VkcVF2T2pYOGRvQ0N3IiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iVHVlIFNlcCAwNiAxNjoxOTo0NCBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iVG9vbG1lbnRvciBCMiBjb250ZXh0IiBrZXlDb25zaWRlcmF0aW9ucz0iIj4KLTwvQ29udGVudERlc2NyaXB0aW9uPgotPC9Ub29sTWVudG9yPgotPFdoaXRlcGFwZXIgbmFtZT0id2hpdGVwYXBlcl9CMSIgYnJpZWZEZXNjcmlwdGlvbj0iV2hpdGVwYXBlciBCMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iV2hpdGVwYXBlciBCMSBwcmVzZW50IiB2YXJpYWJpbGl0eVR5cGU9Im5hIj4KLTxDb250ZW50RGVzY3JpcHRpb24gbmFtZT0id2hpdGVwYXBlcl9CMSxfSXZEMkVCOHNFZHFRdk9qWDhkb0NDdyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURhdGU9IlR1ZSBTZXAgMDYgMTY6MTk6MDcgUERUIDIwMDUiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249IldoaXRlcGFwZXIgQjEgY29udGV4dCIga2V5Q29uc2lkZXJhdGlvbnM9IiI+Ci08L0NvbnRlbnREZXNjcmlwdGlvbj4KLTwvV2hpdGVwYXBlcj4KLTxXaGl0ZXBhcGVyIG5hbWU9IndoaXRlcGFwZXJfQjIiIGJyaWVmRGVzY3JpcHRpb249IldoaXRlcGFwZXIgQjIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IldoaXRlcGFwZXIgQjIgcHJlc2VudCIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08Q29udGVudERlc2NyaXB0aW9uIG5hbWU9IndoaXRlcGFwZXJfQjIsX0pkdEV3QjhzRWRxUXZPalg4ZG9DQ3ciIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJUdWUgU2VwIDA2IDE2OjE4OjM2IFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSJXaGl0ZXBhcGVyIEIyIGNvbnRleHQiIGtleUNvbnNpZGVyYXRpb25zPSIiPgotPC9Db250ZW50RGVzY3JpcHRpb24+Ci08L1doaXRlcGFwZXI+Ci08L0NvbnRlbnRQYWNrYWdlPgotPC9Db250ZW50UGFja2FnZT4KLTxQcm9jZXNzUGFja2FnZSBuYW1lPSJDYXBhYmlsaXR5UGF0dGVybnMiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgZ2xvYmFsPSJmYWxzZSI+Ci08cGFyZW50UGFja2FnZSBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMiPgotPC9wYXJlbnRQYWNrYWdlPgotPFByb2Nlc3NQYWNrYWdlIG5hbWU9ImNhcFBhdFBha19CMSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBnbG9iYWw9ImZhbHNlIj4KLTxwYXJlbnRQYWNrYWdlIHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQjEiPgotPC9wYXJlbnRQYWNrYWdlPgotPFByb2Nlc3NQYWNrYWdlIG5hbWU9ImNhcFBhdFBha19CMS4xIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGdsb2JhbD0iZmFsc2UiPgotPHBhcmVudFBhY2thZ2UgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19CMS9jYXBQYXRQYWtfQjEuMSI+Ci08L3BhcmVudFBhY2thZ2U+Ci08UHJvY2Vzc0NvbXBvbmVudCBuYW1lPSJjYXBQYXRfQjEuMSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBnbG9iYWw9ImZhbHNlIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiI+Ci08cGFyZW50UGFja2FnZSBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0IxL2NhcFBhdFBha19CMS4xL2NhcFBhdF9CMS4xIj4KLTwvcGFyZW50UGFja2FnZT4KLTxDYXBhYmlsaXR5UGF0dGVybiBuYW1lPSJjYXBQYXRfQjEuMSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJjYXBQYXRfQjEuMSIgcHJlZml4PSIiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1JlcGVhdGFibGU9ImZhbHNlIiBpc09uZ29pbmc9ImZhbHNlIiBpc0V2ZW50RHJpdmVuPSJmYWxzZSIgdmFyaWFiaWxpdHlUeXBlPSJuYSIgaXNFbmFjdGFibGU9ImZhbHNlIj4KLTxQcm9jZXNzRGVzY3JpcHRpb24gbmFtZT0iY2FwUGF0X0IxLjEsX0lQZFo0UjgxRWRxZ0JJVHVJQ0xKRXciIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcHVycG9zZT0iIiBhbHRlcm5hdGl2ZXM9IiIgaG93dG9TdGFmZj0iIiBleHRlcm5hbElkPSIiIHNjb3BlPSIiIHVzYWdlTm90ZXM9IiI+Ci08L1Byb2Nlc3NEZXNjcmlwdGlvbj4KLTxkZWZhdWx0Q29udGV4dCBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0IxL2NhcFBhdFBha19CMS4xL2NhcFBhdF9CMS4xL2NhcFBhdF9CMS4xIj4KLTwvZGVmYXVsdENvbnRleHQ+Ci08dmFsaWRDb250ZXh0IHBhdGg9IkNvbmZpZyBBIj4KLTwvdmFsaWRDb250ZXh0PgotPC9DYXBhYmlsaXR5UGF0dGVybj4KLTwvUHJvY2Vzc0NvbXBvbmVudD4KLTwvUHJvY2Vzc1BhY2thZ2U+Ci08UHJvY2Vzc0NvbXBvbmVudCBuYW1lPSJjYXBQYXRfQjEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgZ2xvYmFsPSJmYWxzZSIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiPgotPHBhcmVudFBhY2thZ2UgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19CMS9jYXBQYXRfQjEiPgotPC9wYXJlbnRQYWNrYWdlPgotPENhcGFiaWxpdHlQYXR0ZXJuIG5hbWU9ImNhcFBhdF9CMSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJjYXBQYXRfQjEiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNSZXBlYXRhYmxlPSJmYWxzZSIgaXNPbmdvaW5nPSJmYWxzZSIgaXNFdmVudERyaXZlbj0iZmFsc2UiIHZhcmlhYmlsaXR5VHlwZT0ibmEiIGlzRW5hY3RhYmxlPSJmYWxzZSI+Ci08UHJvY2Vzc0Rlc2NyaXB0aW9uIG5hbWU9ImNhcFBhdF9CMSxfRTZFeWNSODFFZHFnQklUdUlDTEpFdyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiBwdXJwb3NlPSIiIGFsdGVybmF0aXZlcz0iIiBob3d0b1N0YWZmPSIiIGV4dGVybmFsSWQ9IiIgc2NvcGU9IiIgdXNhZ2VOb3Rlcz0iIj4KLTwvUHJvY2Vzc0Rlc2NyaXB0aW9uPgotPGRlZmF1bHRDb250ZXh0IHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQjEvY2FwUGF0X0IxL2NhcFBhdF9CMSI+Ci08L2RlZmF1bHRDb250ZXh0PgotPHZhbGlkQ29udGV4dCBwYXRoPSJDb25maWcgQSI+Ci08L3ZhbGlkQ29udGV4dD4KLTwvQ2FwYWJpbGl0eVBhdHRlcm4+Ci08L1Byb2Nlc3NDb21wb25lbnQ+Ci08L1Byb2Nlc3NQYWNrYWdlPgotPFByb2Nlc3NDb21wb25lbnQgbmFtZT0iQ1AgQjEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgZ2xvYmFsPSJmYWxzZSIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiPgotPHBhcmVudFBhY2thZ2UgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxIj4KLTwvcGFyZW50UGFja2FnZT4KLTxQcm9jZXNzUGFja2FnZSBuYW1lPSJBY3QxIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGdsb2JhbD0iZmFsc2UiPgotPHBhcmVudFBhY2thZ2UgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEiPgotPC9wYXJlbnRQYWNrYWdlPgotPEFjdGl2aXR5IG5hbWU9IkFjdDEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iQWN0MSIgcHJlZml4PSIiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1JlcGVhdGFibGU9ImZhbHNlIiBpc09uZ29pbmc9ImZhbHNlIiBpc0V2ZW50RHJpdmVuPSJmYWxzZSIgdmFyaWFiaWxpdHlUeXBlPSJuYSIgaXNFbmFjdGFibGU9ImZhbHNlIj4KLTxBY3Rpdml0eURlc2NyaXB0aW9uIG5hbWU9IkFjdDEsXzU2N1lRMEE1RWRxRnFJdTgtY2tvbGciIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHB1cnBvc2U9IiIgYWx0ZXJuYXRpdmVzPSIiIGhvd3RvU3RhZmY9IiI+Ci08L0FjdGl2aXR5RGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxL0FjdDEiPgotPC9zdXBlckFjdGl2aXRpZXM+Ci08YnJlYWtkb3duRWxlbWVudHMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEvdGFza19BMSI+Ci08L2JyZWFrZG93bkVsZW1lbnRzPgotPGJyZWFrZG93bkVsZW1lbnRzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxL3JvbGVfQTEiPgotPC9icmVha2Rvd25FbGVtZW50cz4KLTxicmVha2Rvd25FbGVtZW50cyBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MS9yb2xlX0EyIj4KLTwvYnJlYWtkb3duRWxlbWVudHM+Ci08YnJlYWtkb3duRWxlbWVudHMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEvc3ViX2FydGlmYWN0X0ExLjEiPgotPC9icmVha2Rvd25FbGVtZW50cz4KLTxicmVha2Rvd25FbGVtZW50cyBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MS9hcnRpZmFjdF9BMSI+Ci08L2JyZWFrZG93bkVsZW1lbnRzPgotPGJyZWFrZG93bkVsZW1lbnRzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxL2RlbGl2ZXJhYmxlX0ExIj4KLTwvYnJlYWtkb3duRWxlbWVudHM+Ci08YnJlYWtkb3duRWxlbWVudHMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEvb3V0Y29tZV9BMSI+Ci08L2JyZWFrZG93bkVsZW1lbnRzPgotPGJyZWFrZG93bkVsZW1lbnRzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxL3Rhc2tfQjEiPgotPC9icmVha2Rvd25FbGVtZW50cz4KLTxicmVha2Rvd25FbGVtZW50cyBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MS9yb2xlX0IxIj4KLTwvYnJlYWtkb3duRWxlbWVudHM+Ci08YnJlYWtkb3duRWxlbWVudHMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEvcm9sZV9CMiI+Ci08L2JyZWFrZG93bkVsZW1lbnRzPgotPGJyZWFrZG93bkVsZW1lbnRzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxL2FydGlmYWN0X0IxIj4KLTwvYnJlYWtkb3duRWxlbWVudHM+Ci08YnJlYWtkb3duRWxlbWVudHMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEvZGVsaXZlcmFibGVfQjEiPgotPC9icmVha2Rvd25FbGVtZW50cz4KLTxicmVha2Rvd25FbGVtZW50cyBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MS9vdXRjb21lX0IxIj4KLTwvYnJlYWtkb3duRWxlbWVudHM+Ci08YnJlYWtkb3duRWxlbWVudHMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEvdGFza19CMiI+Ci08L2JyZWFrZG93bkVsZW1lbnRzPgotPGJyZWFrZG93bkVsZW1lbnRzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxL2FydGlmYWN0X0IyIj4KLTwvYnJlYWtkb3duRWxlbWVudHM+Ci08YnJlYWtkb3duRWxlbWVudHMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEvZGVsaXZlcmFibGVfQjIiPgotPC9icmVha2Rvd25FbGVtZW50cz4KLTxicmVha2Rvd25FbGVtZW50cyBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MS9vdXRjb21lX0IyIj4KLTwvYnJlYWtkb3duRWxlbWVudHM+Ci08YnJlYWtkb3duRWxlbWVudHMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEvdGFza19BMiI+Ci08L2JyZWFrZG93bkVsZW1lbnRzPgotPGJyZWFrZG93bkVsZW1lbnRzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxL2FydGlmYWN0X0EyIj4KLTwvYnJlYWtkb3duRWxlbWVudHM+Ci08YnJlYWtkb3duRWxlbWVudHMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEvZGVsaXZlcmFibGVfQTIiPgotPC9icmVha2Rvd25FbGVtZW50cz4KLTxicmVha2Rvd25FbGVtZW50cyBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MS9vdXRjb21lX0EyIj4KLTwvYnJlYWtkb3duRWxlbWVudHM+Ci08L0FjdGl2aXR5PgotPFRhc2tEZXNjcmlwdG9yIG5hbWU9InRhc2tfQTEiIGJyaWVmRGVzY3JpcHRpb249IlRhc2sgQTEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IlRhc2sgQTEgcHJlc2VudCIgcHJlZml4PSIiIGlzUGxhbm5lZD0iZmFsc2UiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNSZXBlYXRhYmxlPSJmYWxzZSIgaXNPbmdvaW5nPSJmYWxzZSIgaXNFdmVudERyaXZlbj0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9InRhc2tfQTEsXzU2N1lTVUE1RWRxRnFJdTgtY2tvbGciIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHJlZmluZWREZXNjcmlwdGlvbj0iIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPHN1cGVyQWN0aXZpdGllcyBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MS90YXNrX0ExIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPFRhc2sgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEvdGFza19BMSI+Ci08L1Rhc2s+Ci08YWRkaXRpb25hbGx5UGVyZm9ybWVkQnkgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEvcm9sZV9BMiI+Ci08L2FkZGl0aW9uYWxseVBlcmZvcm1lZEJ5PgotPG1hbmRhdG9yeUlucHV0IHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxL3N1Yl9hcnRpZmFjdF9BMS4xIj4KLTwvbWFuZGF0b3J5SW5wdXQ+Ci08bWFuZGF0b3J5SW5wdXQgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEvYXJ0aWZhY3RfQTEiPgotPC9tYW5kYXRvcnlJbnB1dD4KLTxvcHRpb25hbElucHV0IHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxL2RlbGl2ZXJhYmxlX0ExIj4KLTwvb3B0aW9uYWxJbnB1dD4KLTxvdXRwdXQgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEvb3V0Y29tZV9BMSI+Ci08L291dHB1dD4KLTxwZXJmb3JtZWRQcmltYXJpbHlCeSBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MS90YXNrX0ExIj4KLTwvcGVyZm9ybWVkUHJpbWFyaWx5Qnk+Ci08c2VsZWN0ZWRTdGVwcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvdGFza19BMS90YXNrX0ExLF83TThuc0EtUEVkcUwyTzFQSlY5Y1pBL1N0ZXAgQTEuMSI+Ci08L3NlbGVjdGVkU3RlcHM+Ci08c2VsZWN0ZWRTdGVwcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvdGFza19BMS90YXNrX0ExLF83TThuc0EtUEVkcUwyTzFQSlY5Y1pBL1N0ZXAgQTEuMiI+Ci08L3NlbGVjdGVkU3RlcHM+Ci08c2VsZWN0ZWRTdGVwcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvdGFza19BMS90YXNrX0ExLF83TThuc0EtUEVkcUwyTzFQSlY5Y1pBL1N0ZXAgQTEuMyI+Ci08L3NlbGVjdGVkU3RlcHM+Ci08L1Rhc2tEZXNjcmlwdG9yPgotPFJvbGVEZXNjcmlwdG9yIG5hbWU9InJvbGVfQTEiIGJyaWVmRGVzY3JpcHRpb249IlJvbGUgQTEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IlJvbGUgQTEiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0icm9sZV9BMSxfNTY3WVNFQTVFZHFGcUl1OC1ja29sZyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxL3JvbGVfQTEiPgotPC9zdXBlckFjdGl2aXRpZXM+Ci08Um9sZSBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MS9yb2xlX0ExIj4KLTwvUm9sZT4KLTxtb2RpZmllcyBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MS9vdXRjb21lX0ExIj4KLTwvbW9kaWZpZXM+Ci08cmVzcG9uc2libGVGb3IgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEvYXJ0aWZhY3RfQTEiPgotPC9yZXNwb25zaWJsZUZvcj4KLTxyZXNwb25zaWJsZUZvciBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MS9kZWxpdmVyYWJsZV9BMSI+Ci08L3Jlc3BvbnNpYmxlRm9yPgotPHJlc3BvbnNpYmxlRm9yIHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxL291dGNvbWVfQTEiPgotPC9yZXNwb25zaWJsZUZvcj4KLTwvUm9sZURlc2NyaXB0b3I+Ci08Um9sZURlc2NyaXB0b3IgbmFtZT0icm9sZV9BMiIgYnJpZWZEZXNjcmlwdGlvbj0iUm9sZSBBMiBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iUm9sZSBBMiAiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0icm9sZV9BMixfNTY3WW1VQTVFZHFGcUl1OC1ja29sZyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxL3JvbGVfQTIiPgotPC9zdXBlckFjdGl2aXRpZXM+Ci08Um9sZSBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MS9yb2xlX0EyIj4KLTwvUm9sZT4KLTxtb2RpZmllcyBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MS9vdXRjb21lX0EyIj4KLTwvbW9kaWZpZXM+Ci08L1JvbGVEZXNjcmlwdG9yPgotPFdvcmtQcm9kdWN0RGVzY3JpcHRvciBuYW1lPSJzdWJfYXJ0aWZhY3RfQTEuMSIgYnJpZWZEZXNjcmlwdGlvbj0iU3ViX0FydGlmYWN0IEExLjEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IlN1Yl9BcnRpZmFjdCBBMS4xIHByZXNlbnQiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIiBhY3Rpdml0eUVudHJ5U3RhdGU9IiIgYWN0aXZpdHlFeGl0U3RhdGU9IiI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9InN1Yl9hcnRpZmFjdF9BMS4xLF81NjdZb1VBNUVkcUZxSXU4LWNrb2xnIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiByZWZpbmVkRGVzY3JpcHRpb249IiI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxzdXBlckFjdGl2aXRpZXMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEvc3ViX2FydGlmYWN0X0ExLjEiPgotPC9zdXBlckFjdGl2aXRpZXM+Ci08V29ya1Byb2R1Y3QgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEvc3ViX2FydGlmYWN0X0ExLjEiPgotPC9Xb3JrUHJvZHVjdD4KLTwvV29ya1Byb2R1Y3REZXNjcmlwdG9yPgotPFdvcmtQcm9kdWN0RGVzY3JpcHRvciBuYW1lPSJhcnRpZmFjdF9BMSIgYnJpZWZEZXNjcmlwdGlvbj0iQXJ0aWZhY3QgQTEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IkFydGlmYWN0IEExIHByZXNlbnQiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIiBhY3Rpdml0eUVudHJ5U3RhdGU9IiIgYWN0aXZpdHlFeGl0U3RhdGU9IiI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9ImFydGlmYWN0X0ExLF81NjdZbmtBNUVkcUZxSXU4LWNrb2xnIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiByZWZpbmVkRGVzY3JpcHRpb249IiI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxzdXBlckFjdGl2aXRpZXMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEvYXJ0aWZhY3RfQTEiPgotPC9zdXBlckFjdGl2aXRpZXM+Ci08V29ya1Byb2R1Y3QgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEvYXJ0aWZhY3RfQTEiPgotPC9Xb3JrUHJvZHVjdD4KLTwvV29ya1Byb2R1Y3REZXNjcmlwdG9yPgotPFdvcmtQcm9kdWN0RGVzY3JpcHRvciBuYW1lPSJkZWxpdmVyYWJsZV9BMSIgYnJpZWZEZXNjcmlwdGlvbj0iRGVsaXZlcmFibGUgQTEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IkRlbGl2ZXJhYmxlIEExIHByZXNlbnQiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIiBhY3Rpdml0eUVudHJ5U3RhdGU9IiIgYWN0aXZpdHlFeGl0U3RhdGU9IiI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9ImRlbGl2ZXJhYmxlX0ExLF81NjdZbUVBNUVkcUZxSXU4LWNrb2xnIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiByZWZpbmVkRGVzY3JpcHRpb249IiI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxzdXBlckFjdGl2aXRpZXMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEvZGVsaXZlcmFibGVfQTEiPgotPC9zdXBlckFjdGl2aXRpZXM+Ci08V29ya1Byb2R1Y3QgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEvZGVsaXZlcmFibGVfQTEiPgotPC9Xb3JrUHJvZHVjdD4KLTxkZWxpdmVyYWJsZVBhcnRzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxL291dGNvbWVfQTEiPgotPC9kZWxpdmVyYWJsZVBhcnRzPgotPGRlbGl2ZXJhYmxlUGFydHMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEvc3ViX2FydGlmYWN0X0ExLjEiPgotPC9kZWxpdmVyYWJsZVBhcnRzPgotPGRlbGl2ZXJhYmxlUGFydHMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEvYXJ0aWZhY3RfQTEiPgotPC9kZWxpdmVyYWJsZVBhcnRzPgotPC9Xb3JrUHJvZHVjdERlc2NyaXB0b3I+Ci08V29ya1Byb2R1Y3REZXNjcmlwdG9yIG5hbWU9Im91dGNvbWVfQTEiIGJyaWVmRGVzY3JpcHRpb249Ik91dGNvbWUgQTEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9Ik91dGNvbWUgQTEgcHJlc2VudCIgcHJlZml4PSIiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiIGFjdGl2aXR5RW50cnlTdGF0ZT0iIiBhY3Rpdml0eUV4aXRTdGF0ZT0iIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0ib3V0Y29tZV9BMSxfNTY3WW4wQTVFZHFGcUl1OC1ja29sZyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxL291dGNvbWVfQTEiPgotPC9zdXBlckFjdGl2aXRpZXM+Ci08V29ya1Byb2R1Y3QgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEvb3V0Y29tZV9BMSI+Ci08L1dvcmtQcm9kdWN0PgotPC9Xb3JrUHJvZHVjdERlc2NyaXB0b3I+Ci08V29ya1Byb2R1Y3REZXNjcmlwdG9yIG5hbWU9ImFydGlmYWN0X0ExIiBicmllZkRlc2NyaXB0aW9uPSJBcnRpZmFjdCBBMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iQXJ0aWZhY3QgQTEgcHJlc2VudCIgcHJlZml4PSIiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiIGFjdGl2aXR5RW50cnlTdGF0ZT0iIiBhY3Rpdml0eUV4aXRTdGF0ZT0iIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0iYXJ0aWZhY3RfQTEsXzU2N1luRUE1RWRxRnFJdTgtY2tvbGciIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHJlZmluZWREZXNjcmlwdGlvbj0iIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPFdvcmtQcm9kdWN0IHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxL2FydGlmYWN0X0ExIj4KLTwvV29ya1Byb2R1Y3Q+Ci08L1dvcmtQcm9kdWN0RGVzY3JpcHRvcj4KLTxXb3JrUHJvZHVjdERlc2NyaXB0b3IgbmFtZT0ic3ViX2FydGlmYWN0X0ExLjEiIGJyaWVmRGVzY3JpcHRpb249IlN1Yl9BcnRpZmFjdCBBMS4xIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJTdWJfQXJ0aWZhY3QgQTEuMSBwcmVzZW50IiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSIgYWN0aXZpdHlFbnRyeVN0YXRlPSIiIGFjdGl2aXR5RXhpdFN0YXRlPSIiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJzdWJfYXJ0aWZhY3RfQTEuMSxfNTY3WWtrQTVFZHFGcUl1OC1ja29sZyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08V29ya1Byb2R1Y3QgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEvc3ViX2FydGlmYWN0X0ExLjEiPgotPC9Xb3JrUHJvZHVjdD4KLTwvV29ya1Byb2R1Y3REZXNjcmlwdG9yPgotPFdvcmtQcm9kdWN0RGVzY3JpcHRvciBuYW1lPSJvdXRjb21lX0ExIiBicmllZkRlc2NyaXB0aW9uPSJPdXRjb21lIEExIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJPdXRjb21lIEExIHByZXNlbnQiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIiBhY3Rpdml0eUVudHJ5U3RhdGU9IiIgYWN0aXZpdHlFeGl0U3RhdGU9IiI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9Im91dGNvbWVfQTEsXzU2N1lRVUE1RWRxRnFJdTgtY2tvbGciIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHJlZmluZWREZXNjcmlwdGlvbj0iIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPFdvcmtQcm9kdWN0IHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxL291dGNvbWVfQTEiPgotPC9Xb3JrUHJvZHVjdD4KLTwvV29ya1Byb2R1Y3REZXNjcmlwdG9yPgotPFRhc2tEZXNjcmlwdG9yIG5hbWU9InRhc2tfQjEiIGJyaWVmRGVzY3JpcHRpb249IlRhc2sgQjEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IlRhc2sgQjEgcHJlc25ldCIgcHJlZml4PSIiIGlzUGxhbm5lZD0iZmFsc2UiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNSZXBlYXRhYmxlPSJmYWxzZSIgaXNPbmdvaW5nPSJmYWxzZSIgaXNFdmVudERyaXZlbj0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9InRhc2tfQjEsXzU2N1lSMEE1RWRxRnFJdTgtY2tvbGciIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHJlZmluZWREZXNjcmlwdGlvbj0iIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPHN1cGVyQWN0aXZpdGllcyBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MS90YXNrX0IxIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPFRhc2sgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEvdGFza19CMSI+Ci08L1Rhc2s+Ci08YWRkaXRpb25hbGx5UGVyZm9ybWVkQnkgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEvcm9sZV9CMiI+Ci08L2FkZGl0aW9uYWxseVBlcmZvcm1lZEJ5PgotPG1hbmRhdG9yeUlucHV0IHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxL2FydGlmYWN0X0IxIj4KLTwvbWFuZGF0b3J5SW5wdXQ+Ci08b3B0aW9uYWxJbnB1dCBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MS9kZWxpdmVyYWJsZV9CMSI+Ci08L29wdGlvbmFsSW5wdXQ+Ci08b3V0cHV0IHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxL291dGNvbWVfQjEiPgotPC9vdXRwdXQ+Ci08cGVyZm9ybWVkUHJpbWFyaWx5QnkgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEvdGFza19CMSI+Ci08L3BlcmZvcm1lZFByaW1hcmlseUJ5PgotPHNlbGVjdGVkU3RlcHMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL3Rhc2tfQjEvdGFza19CMSxfWFU2TFVCOFBFZHFzaE1OU0kwN1hPZy9TdGVwIEIxLjEiPgotPC9zZWxlY3RlZFN0ZXBzPgotPHNlbGVjdGVkU3RlcHMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL3Rhc2tfQjEvdGFza19CMSxfWFU2TFVCOFBFZHFzaE1OU0kwN1hPZy9TdGVwIEIxLjIiPgotPC9zZWxlY3RlZFN0ZXBzPgotPHNlbGVjdGVkU3RlcHMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL3Rhc2tfQjEvdGFza19CMSxfWFU2TFVCOFBFZHFzaE1OU0kwN1hPZy9TdGVwIEIxLjMiPgotPC9zZWxlY3RlZFN0ZXBzPgotPC9UYXNrRGVzY3JpcHRvcj4KLTxSb2xlRGVzY3JpcHRvciBuYW1lPSJyb2xlX0IxIiBicmllZkRlc2NyaXB0aW9uPSJSb2xlIEIxIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJSb2xlIEIxIHByZXNlbnQiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0icm9sZV9CMSxfNTY3WWswQTVFZHFGcUl1OC1ja29sZyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxL3JvbGVfQjEiPgotPC9zdXBlckFjdGl2aXRpZXM+Ci08Um9sZSBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MS9yb2xlX0IxIj4KLTwvUm9sZT4KLTxtb2RpZmllcyBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MS9vdXRjb21lX0IxIj4KLTwvbW9kaWZpZXM+Ci08cmVzcG9uc2libGVGb3IgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEvYXJ0aWZhY3RfQjEiPgotPC9yZXNwb25zaWJsZUZvcj4KLTxyZXNwb25zaWJsZUZvciBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MS9kZWxpdmVyYWJsZV9CMSI+Ci08L3Jlc3BvbnNpYmxlRm9yPgotPC9Sb2xlRGVzY3JpcHRvcj4KLTxSb2xlRGVzY3JpcHRvciBuYW1lPSJyb2xlX0IyIiBicmllZkRlc2NyaXB0aW9uPSJSb2xlIEIyIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJSb2xlIEIyIHByZXNlbnQiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0icm9sZV9CMixfNTY3WWwwQTVFZHFGcUl1OC1ja29sZyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxL3JvbGVfQjIiPgotPC9zdXBlckFjdGl2aXRpZXM+Ci08Um9sZSBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MS9yb2xlX0IyIj4KLTwvUm9sZT4KLTxtb2RpZmllcyBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MS9vdXRjb21lX0IyIj4KLTwvbW9kaWZpZXM+Ci08L1JvbGVEZXNjcmlwdG9yPgotPFdvcmtQcm9kdWN0RGVzY3JpcHRvciBuYW1lPSJhcnRpZmFjdF9CMSIgYnJpZWZEZXNjcmlwdGlvbj0iQXJ0aWZhY3QgQjEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IkFydGlmYWN0IEIxIHByZXNlbnQiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIiBhY3Rpdml0eUVudHJ5U3RhdGU9IiIgYWN0aXZpdHlFeGl0U3RhdGU9IiI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9ImFydGlmYWN0X0IxLF81NjdZblVBNUVkcUZxSXU4LWNrb2xnIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiByZWZpbmVkRGVzY3JpcHRpb249IiI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxzdXBlckFjdGl2aXRpZXMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEvYXJ0aWZhY3RfQjEiPgotPC9zdXBlckFjdGl2aXRpZXM+Ci08V29ya1Byb2R1Y3QgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEvYXJ0aWZhY3RfQjEiPgotPC9Xb3JrUHJvZHVjdD4KLTwvV29ya1Byb2R1Y3REZXNjcmlwdG9yPgotPFdvcmtQcm9kdWN0RGVzY3JpcHRvciBuYW1lPSJkZWxpdmVyYWJsZV9CMSIgYnJpZWZEZXNjcmlwdGlvbj0iRGVsaXZlcmFibGUgQjEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IkRlbGl2ZXJhYmxlIEIxIHByZXNlbnQiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIiBhY3Rpdml0eUVudHJ5U3RhdGU9IiIgYWN0aXZpdHlFeGl0U3RhdGU9IiI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9ImRlbGl2ZXJhYmxlX0IxLF81NjdZb0VBNUVkcUZxSXU4LWNrb2xnIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiByZWZpbmVkRGVzY3JpcHRpb249IiI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxzdXBlckFjdGl2aXRpZXMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEvZGVsaXZlcmFibGVfQjEiPgotPC9zdXBlckFjdGl2aXRpZXM+Ci08V29ya1Byb2R1Y3QgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEvZGVsaXZlcmFibGVfQjEiPgotPC9Xb3JrUHJvZHVjdD4KLTxkZWxpdmVyYWJsZVBhcnRzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxL2FydGlmYWN0X0IxIj4KLTwvZGVsaXZlcmFibGVQYXJ0cz4KLTxkZWxpdmVyYWJsZVBhcnRzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxL291dGNvbWVfQjEiPgotPC9kZWxpdmVyYWJsZVBhcnRzPgotPC9Xb3JrUHJvZHVjdERlc2NyaXB0b3I+Ci08V29ya1Byb2R1Y3REZXNjcmlwdG9yIG5hbWU9Im91dGNvbWVfQjEiIGJyaWVmRGVzY3JpcHRpb249Ik91dGNvbWUgQjEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9Ik91dGNvbWUgQjEgcHJlc2VudCIgcHJlZml4PSIiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiIGFjdGl2aXR5RW50cnlTdGF0ZT0iIiBhY3Rpdml0eUV4aXRTdGF0ZT0iIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0ib3V0Y29tZV9CMSxfNTY3WWxVQTVFZHFGcUl1OC1ja29sZyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxL291dGNvbWVfQjEiPgotPC9zdXBlckFjdGl2aXRpZXM+Ci08V29ya1Byb2R1Y3QgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEvb3V0Y29tZV9CMSI+Ci08L1dvcmtQcm9kdWN0PgotPC9Xb3JrUHJvZHVjdERlc2NyaXB0b3I+Ci08V29ya1Byb2R1Y3REZXNjcmlwdG9yIG5hbWU9ImFydGlmYWN0X0IxIiBicmllZkRlc2NyaXB0aW9uPSJBcnRpZmFjdCBCMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iQXJ0aWZhY3QgQjEgcHJlc2VudCIgcHJlZml4PSIiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiIGFjdGl2aXR5RW50cnlTdGF0ZT0iIiBhY3Rpdml0eUV4aXRTdGF0ZT0iIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0iYXJ0aWZhY3RfQjEsXzU2N1lTMEE1RWRxRnFJdTgtY2tvbGciIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHJlZmluZWREZXNjcmlwdGlvbj0iIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPFdvcmtQcm9kdWN0IHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxL2FydGlmYWN0X0IxIj4KLTwvV29ya1Byb2R1Y3Q+Ci08L1dvcmtQcm9kdWN0RGVzY3JpcHRvcj4KLTxXb3JrUHJvZHVjdERlc2NyaXB0b3IgbmFtZT0ib3V0Y29tZV9CMSIgYnJpZWZEZXNjcmlwdGlvbj0iT3V0Y29tZSBCMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iT3V0Y29tZSBCMSBwcmVzZW50IiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSIgYWN0aXZpdHlFbnRyeVN0YXRlPSIiIGFjdGl2aXR5RXhpdFN0YXRlPSIiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJvdXRjb21lX0IxLF81NjdZVEVBNUVkcUZxSXU4LWNrb2xnIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiByZWZpbmVkRGVzY3JpcHRpb249IiI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxXb3JrUHJvZHVjdCBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MS9vdXRjb21lX0IxIj4KLTwvV29ya1Byb2R1Y3Q+Ci08L1dvcmtQcm9kdWN0RGVzY3JpcHRvcj4KLTxUYXNrRGVzY3JpcHRvciBuYW1lPSJ0YXNrX0IyIiBicmllZkRlc2NyaXB0aW9uPSJUYXNrIEIyIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJUYXNrIEIyIHByZXNlbnQiIHByZWZpeD0iIiBpc1BsYW5uZWQ9ImZhbHNlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzUmVwZWF0YWJsZT0iZmFsc2UiIGlzT25nb2luZz0iZmFsc2UiIGlzRXZlbnREcml2ZW49ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJ0YXNrX0IyLF81NjdZUkVBNUVkcUZxSXU4LWNrb2xnIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiByZWZpbmVkRGVzY3JpcHRpb249IiI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxzdXBlckFjdGl2aXRpZXMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEvdGFza19CMiI+Ci08L3N1cGVyQWN0aXZpdGllcz4KLTxUYXNrIHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxL3Rhc2tfQjIiPgotPC9UYXNrPgotPGFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5IHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxL3JvbGVfQjEiPgotPC9hZGRpdGlvbmFsbHlQZXJmb3JtZWRCeT4KLTxtYW5kYXRvcnlJbnB1dCBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MS9hcnRpZmFjdF9CMiI+Ci08L21hbmRhdG9yeUlucHV0PgotPG9wdGlvbmFsSW5wdXQgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEvZGVsaXZlcmFibGVfQjIiPgotPC9vcHRpb25hbElucHV0PgotPG91dHB1dCBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MS9vdXRjb21lX0IyIj4KLTwvb3V0cHV0PgotPHBlcmZvcm1lZFByaW1hcmlseUJ5IHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxL3Rhc2tfQjIiPgotPC9wZXJmb3JtZWRQcmltYXJpbHlCeT4KLTxzZWxlY3RlZFN0ZXBzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS90YXNrX0IyL3Rhc2tfQjIsX1pMT01zQjhQRWRxc2hNTlNJMDdYT2cvU3RlcCBCMi4xIj4KLTwvc2VsZWN0ZWRTdGVwcz4KLTxzZWxlY3RlZFN0ZXBzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS90YXNrX0IyL3Rhc2tfQjIsX1pMT01zQjhQRWRxc2hNTlNJMDdYT2cvU3RlcCBCMi4yIj4KLTwvc2VsZWN0ZWRTdGVwcz4KLTxzZWxlY3RlZFN0ZXBzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS90YXNrX0IyL3Rhc2tfQjIsX1pMT01zQjhQRWRxc2hNTlNJMDdYT2cvU3RlcCBCMi4zIj4KLTwvc2VsZWN0ZWRTdGVwcz4KLTwvVGFza0Rlc2NyaXB0b3I+Ci08V29ya1Byb2R1Y3REZXNjcmlwdG9yIG5hbWU9ImFydGlmYWN0X0IyIiBicmllZkRlc2NyaXB0aW9uPSJBcnRpZmFjdCBCMiBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iQXJ0aWZhY3QgQjIgcHJlc2VudCIgcHJlZml4PSIiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiIGFjdGl2aXR5RW50cnlTdGF0ZT0iIiBhY3Rpdml0eUV4aXRTdGF0ZT0iIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0iYXJ0aWZhY3RfQjIsXzU2N1lRa0E1RWRxRnFJdTgtY2tvbGciIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHJlZmluZWREZXNjcmlwdGlvbj0iIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPHN1cGVyQWN0aXZpdGllcyBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MS9hcnRpZmFjdF9CMiI+Ci08L3N1cGVyQWN0aXZpdGllcz4KLTxXb3JrUHJvZHVjdCBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MS9hcnRpZmFjdF9CMiI+Ci08L1dvcmtQcm9kdWN0PgotPC9Xb3JrUHJvZHVjdERlc2NyaXB0b3I+Ci08V29ya1Byb2R1Y3REZXNjcmlwdG9yIG5hbWU9ImRlbGl2ZXJhYmxlX0IyIiBicmllZkRlc2NyaXB0aW9uPSJEZWxpdmVyYWJsZSBCMiBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iRGVsaXZlcmFibGUgQjIgcHJlc2VudCIgcHJlZml4PSIiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiIGFjdGl2aXR5RW50cnlTdGF0ZT0iIiBhY3Rpdml0eUV4aXRTdGF0ZT0iIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0iZGVsaXZlcmFibGVfQjIsXzU2N1lsRUE1RWRxRnFJdTgtY2tvbGciIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHJlZmluZWREZXNjcmlwdGlvbj0iIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPHN1cGVyQWN0aXZpdGllcyBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MS9kZWxpdmVyYWJsZV9CMiI+Ci08L3N1cGVyQWN0aXZpdGllcz4KLTxXb3JrUHJvZHVjdCBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MS9kZWxpdmVyYWJsZV9CMiI+Ci08L1dvcmtQcm9kdWN0PgotPGRlbGl2ZXJhYmxlUGFydHMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEvb3V0Y29tZV9CMiI+Ci08L2RlbGl2ZXJhYmxlUGFydHM+Ci08ZGVsaXZlcmFibGVQYXJ0cyBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MS9hcnRpZmFjdF9CMiI+Ci08L2RlbGl2ZXJhYmxlUGFydHM+Ci08L1dvcmtQcm9kdWN0RGVzY3JpcHRvcj4KLTxXb3JrUHJvZHVjdERlc2NyaXB0b3IgbmFtZT0ib3V0Y29tZV9CMiIgYnJpZWZEZXNjcmlwdGlvbj0iT3V0Y29tZSBCMiBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iT3V0Y29tZSBCMiBwcmVzZW50IiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSIgYWN0aXZpdHlFbnRyeVN0YXRlPSIiIGFjdGl2aXR5RXhpdFN0YXRlPSIiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJvdXRjb21lX0IyLF81NjdZbGtBNUVkcUZxSXU4LWNrb2xnIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiByZWZpbmVkRGVzY3JpcHRpb249IiI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxzdXBlckFjdGl2aXRpZXMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEvb3V0Y29tZV9CMiI+Ci08L3N1cGVyQWN0aXZpdGllcz4KLTxXb3JrUHJvZHVjdCBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MS9vdXRjb21lX0IyIj4KLTwvV29ya1Byb2R1Y3Q+Ci08L1dvcmtQcm9kdWN0RGVzY3JpcHRvcj4KLTxXb3JrUHJvZHVjdERlc2NyaXB0b3IgbmFtZT0iYXJ0aWZhY3RfQjIiIGJyaWVmRGVzY3JpcHRpb249IkFydGlmYWN0IEIyIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJBcnRpZmFjdCBCMiBwcmVzZW50IiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSIgYWN0aXZpdHlFbnRyeVN0YXRlPSIiIGFjdGl2aXR5RXhpdFN0YXRlPSIiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJhcnRpZmFjdF9CMixfNTY3WW1rQTVFZHFGcUl1OC1ja29sZyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08V29ya1Byb2R1Y3QgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEvYXJ0aWZhY3RfQjIiPgotPC9Xb3JrUHJvZHVjdD4KLTwvV29ya1Byb2R1Y3REZXNjcmlwdG9yPgotPFdvcmtQcm9kdWN0RGVzY3JpcHRvciBuYW1lPSJvdXRjb21lX0IyIiBicmllZkRlc2NyaXB0aW9uPSJPdXRjb21lIEIyIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJPdXRjb21lIEIyIHByZXNlbnQiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIiBhY3Rpdml0eUVudHJ5U3RhdGU9IiIgYWN0aXZpdHlFeGl0U3RhdGU9IiI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9Im91dGNvbWVfQjIsXzU2N1lrVUE1RWRxRnFJdTgtY2tvbGciIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHJlZmluZWREZXNjcmlwdGlvbj0iIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPFdvcmtQcm9kdWN0IHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxL291dGNvbWVfQjIiPgotPC9Xb3JrUHJvZHVjdD4KLTwvV29ya1Byb2R1Y3REZXNjcmlwdG9yPgotPFRhc2tEZXNjcmlwdG9yIG5hbWU9InRhc2tfQTIiIGJyaWVmRGVzY3JpcHRpb249IlRhc2sgQTIgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IlRhc2sgQTIgIiBwcmVmaXg9IiIgaXNQbGFubmVkPSJmYWxzZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1JlcGVhdGFibGU9ImZhbHNlIiBpc09uZ29pbmc9ImZhbHNlIiBpc0V2ZW50RHJpdmVuPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0idGFza19BMixfNTY3WVJrQTVFZHFGcUl1OC1ja29sZyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxL3Rhc2tfQTIiPgotPC9zdXBlckFjdGl2aXRpZXM+Ci08VGFzayBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MS90YXNrX0EyIj4KLTwvVGFzaz4KLTxhZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MS9yb2xlX0ExIj4KLTwvYWRkaXRpb25hbGx5UGVyZm9ybWVkQnk+Ci08bWFuZGF0b3J5SW5wdXQgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEvYXJ0aWZhY3RfQTIiPgotPC9tYW5kYXRvcnlJbnB1dD4KLTxvcHRpb25hbElucHV0IHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxL2RlbGl2ZXJhYmxlX0EyIj4KLTwvb3B0aW9uYWxJbnB1dD4KLTxvdXRwdXQgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEvb3V0Y29tZV9BMiI+Ci08L291dHB1dD4KLTxwZXJmb3JtZWRQcmltYXJpbHlCeSBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MS90YXNrX0EyIj4KLTwvcGVyZm9ybWVkUHJpbWFyaWx5Qnk+Ci08c2VsZWN0ZWRTdGVwcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvdGFza19BMi90YXNrX0EyLF83NU5Rd0EtUEVkcUwyTzFQSlY5Y1pBL1N0ZXAgQTIuMSI+Ci08L3NlbGVjdGVkU3RlcHM+Ci08c2VsZWN0ZWRTdGVwcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvdGFza19BMi90YXNrX0EyLF83NU5Rd0EtUEVkcUwyTzFQSlY5Y1pBL1N0ZXAgQTIuMiI+Ci08L3NlbGVjdGVkU3RlcHM+Ci08c2VsZWN0ZWRTdGVwcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvdGFza19BMi90YXNrX0EyLF83NU5Rd0EtUEVkcUwyTzFQSlY5Y1pBL1N0ZXAgQTIuMyI+Ci08L3NlbGVjdGVkU3RlcHM+Ci08L1Rhc2tEZXNjcmlwdG9yPgotPFdvcmtQcm9kdWN0RGVzY3JpcHRvciBuYW1lPSJhcnRpZmFjdF9BMiIgYnJpZWZEZXNjcmlwdGlvbj0iQXJ0aWZhY3QgQTIgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IkFydGlmYWN0IEEyIHByZXNlbnQiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIiBhY3Rpdml0eUVudHJ5U3RhdGU9IiIgYWN0aXZpdHlFeGl0U3RhdGU9IiI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9ImFydGlmYWN0X0EyLF81NjdZa0VBNUVkcUZxSXU4LWNrb2xnIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiByZWZpbmVkRGVzY3JpcHRpb249IiI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxzdXBlckFjdGl2aXRpZXMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEvYXJ0aWZhY3RfQTIiPgotPC9zdXBlckFjdGl2aXRpZXM+Ci08V29ya1Byb2R1Y3QgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEvYXJ0aWZhY3RfQTIiPgotPC9Xb3JrUHJvZHVjdD4KLTwvV29ya1Byb2R1Y3REZXNjcmlwdG9yPgotPFdvcmtQcm9kdWN0RGVzY3JpcHRvciBuYW1lPSJkZWxpdmVyYWJsZV9BMiIgYnJpZWZEZXNjcmlwdGlvbj0iRGVsaXZlcmFibGUgQTIgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IkRlbGl2ZXJhYmxlIEEyIHByZXNlbnQiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIiBhY3Rpdml0eUVudHJ5U3RhdGU9IiIgYWN0aXZpdHlFeGl0U3RhdGU9IiI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9ImRlbGl2ZXJhYmxlX0EyLF81NjdZbTBBNUVkcUZxSXU4LWNrb2xnIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiByZWZpbmVkRGVzY3JpcHRpb249IiI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxzdXBlckFjdGl2aXRpZXMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEvZGVsaXZlcmFibGVfQTIiPgotPC9zdXBlckFjdGl2aXRpZXM+Ci08V29ya1Byb2R1Y3QgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEvZGVsaXZlcmFibGVfQTIiPgotPC9Xb3JrUHJvZHVjdD4KLTxkZWxpdmVyYWJsZVBhcnRzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxL291dGNvbWVfQTIiPgotPC9kZWxpdmVyYWJsZVBhcnRzPgotPGRlbGl2ZXJhYmxlUGFydHMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEvYXJ0aWZhY3RfQTIiPgotPC9kZWxpdmVyYWJsZVBhcnRzPgotPC9Xb3JrUHJvZHVjdERlc2NyaXB0b3I+Ci08V29ya1Byb2R1Y3REZXNjcmlwdG9yIG5hbWU9Im91dGNvbWVfQTIiIGJyaWVmRGVzY3JpcHRpb249Ik91dGNvbWUgQTEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9Ik91dGNvbWUgQTIgcHJlc2VudCIgcHJlZml4PSIiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiIGFjdGl2aXR5RW50cnlTdGF0ZT0iIiBhY3Rpdml0eUV4aXRTdGF0ZT0iIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0ib3V0Y29tZV9BMixfNTY3WWowQTVFZHFGcUl1OC1ja29sZyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxL291dGNvbWVfQTIiPgotPC9zdXBlckFjdGl2aXRpZXM+Ci08V29ya1Byb2R1Y3QgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEvb3V0Y29tZV9BMiI+Ci08L1dvcmtQcm9kdWN0PgotPC9Xb3JrUHJvZHVjdERlc2NyaXB0b3I+Ci08V29ya1Byb2R1Y3REZXNjcmlwdG9yIG5hbWU9ImFydGlmYWN0X0EyIiBicmllZkRlc2NyaXB0aW9uPSJBcnRpZmFjdCBBMiBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iQXJ0aWZhY3QgQTIgcHJlc2VudCIgcHJlZml4PSIiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiIGFjdGl2aXR5RW50cnlTdGF0ZT0iIiBhY3Rpdml0eUV4aXRTdGF0ZT0iIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0iYXJ0aWZhY3RfQTIsXzU2N1lTa0E1RWRxRnFJdTgtY2tvbGciIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHJlZmluZWREZXNjcmlwdGlvbj0iIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPFdvcmtQcm9kdWN0IHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxL2FydGlmYWN0X0EyIj4KLTwvV29ya1Byb2R1Y3Q+Ci08L1dvcmtQcm9kdWN0RGVzY3JpcHRvcj4KLTxXb3JrUHJvZHVjdERlc2NyaXB0b3IgbmFtZT0ib3V0Y29tZV9BMiIgYnJpZWZEZXNjcmlwdGlvbj0iT3V0Y29tZSBBMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iT3V0Y29tZSBBMiBwcmVzZW50IiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSIgYWN0aXZpdHlFbnRyeVN0YXRlPSIiIGFjdGl2aXR5RXhpdFN0YXRlPSIiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJvdXRjb21lX0EyLF81NjdZUlVBNUVkcUZxSXU4LWNrb2xnIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiByZWZpbmVkRGVzY3JpcHRpb249IiI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxXb3JrUHJvZHVjdCBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MS9vdXRjb21lX0EyIj4KLTwvV29ya1Byb2R1Y3Q+Ci08L1dvcmtQcm9kdWN0RGVzY3JpcHRvcj4KLTxEaWFncmFtIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPEdyYXBoTm9kZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEiPgotPC9jb250YWluZXI+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IiI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGVsZW1lbnQgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEiPgotPC9lbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9HcmFwaE5vZGU+Ci08R3JhcGhOb2RlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MSI+Ci08L2NvbnRhaW5lcj4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEiPgotPC9ncmFwaEVsZW1lbnQ+Ci08ZWxlbWVudCBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MSI+Ci08L2VsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0dyYXBoTm9kZT4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iV29ya2Zsb3ciPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MSI+Ci08L2dyYXBoRWxlbWVudD4KLTxlbGVtZW50IHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxIj4KLTwvZWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvRGlhZ3JhbT4KLTxEaWFncmFtIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPEdyYXBoTm9kZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEiPgotPC9jb250YWluZXI+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IiI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGVsZW1lbnQgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEiPgotPC9lbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9HcmFwaE5vZGU+Ci08R3JhcGhOb2RlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MSI+Ci08L2NvbnRhaW5lcj4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEiPgotPC9ncmFwaEVsZW1lbnQ+Ci08ZWxlbWVudCBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MSI+Ci08L2VsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0dyYXBoTm9kZT4KLTxHcmFwaE5vZGUgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxIj4KLTwvY29udGFpbmVyPgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSIiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MSI+Ci08L2dyYXBoRWxlbWVudD4KLTxlbGVtZW50IHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxIj4KLTwvZWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvR3JhcGhOb2RlPgotPEdyYXBoTm9kZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEiPgotPC9jb250YWluZXI+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IiI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGVsZW1lbnQgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEiPgotPC9lbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9HcmFwaE5vZGU+Ci08R3JhcGhOb2RlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MSI+Ci08L2NvbnRhaW5lcj4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEiPgotPC9ncmFwaEVsZW1lbnQ+Ci08ZWxlbWVudCBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MSI+Ci08L2VsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0dyYXBoTm9kZT4KLTxHcmFwaE5vZGUgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxIj4KLTwvY29udGFpbmVyPgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSIiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MSI+Ci08L2dyYXBoRWxlbWVudD4KLTxlbGVtZW50IHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxIj4KLTwvZWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvR3JhcGhOb2RlPgotPEdyYXBoTm9kZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEiPgotPC9jb250YWluZXI+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IiI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGVsZW1lbnQgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEiPgotPC9lbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9HcmFwaE5vZGU+Ci08R3JhcGhOb2RlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MSI+Ci08L2NvbnRhaW5lcj4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEiPgotPC9ncmFwaEVsZW1lbnQ+Ci08ZWxlbWVudCBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MSI+Ci08L2VsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0dyYXBoTm9kZT4KLTxHcmFwaE5vZGUgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxIj4KLTwvY29udGFpbmVyPgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSIiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MSI+Ci08L2dyYXBoRWxlbWVudD4KLTxlbGVtZW50IHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxIj4KLTwvZWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvR3JhcGhOb2RlPgotPEdyYXBoTm9kZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEiPgotPC9jb250YWluZXI+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IiI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGVsZW1lbnQgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEiPgotPC9lbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9HcmFwaE5vZGU+Ci08R3JhcGhOb2RlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MSI+Ci08L2NvbnRhaW5lcj4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEiPgotPC9ncmFwaEVsZW1lbnQ+Ci08ZWxlbWVudCBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MSI+Ci08L2VsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0dyYXBoTm9kZT4KLTxHcmFwaE5vZGUgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxIj4KLTwvY29udGFpbmVyPgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSIiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MSI+Ci08L2dyYXBoRWxlbWVudD4KLTxlbGVtZW50IHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxIj4KLTwvZWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvR3JhcGhOb2RlPgotPEdyYXBoTm9kZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEiPgotPC9jb250YWluZXI+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IiI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGVsZW1lbnQgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEiPgotPC9lbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9HcmFwaE5vZGU+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IldvcmsgUHJvZHVjdCBEZXBlbmRlbmN5Ij4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEiPgotPC9ncmFwaEVsZW1lbnQ+Ci08ZWxlbWVudCBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MSI+Ci08L2VsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0RpYWdyYW0+Ci08RGlhZ3JhbSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxHcmFwaE5vZGUgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxIj4KLTwvY29udGFpbmVyPgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSIiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MSI+Ci08L2dyYXBoRWxlbWVudD4KLTxlbGVtZW50IHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxIj4KLTwvZWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvR3JhcGhOb2RlPgotPEdyYXBoTm9kZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEiPgotPC9jb250YWluZXI+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IiI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGVsZW1lbnQgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEiPgotPC9lbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9HcmFwaE5vZGU+Ci08R3JhcGhOb2RlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MSI+Ci08L2NvbnRhaW5lcj4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEiPgotPC9ncmFwaEVsZW1lbnQ+Ci08ZWxlbWVudCBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MSI+Ci08L2VsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0dyYXBoTm9kZT4KLTxHcmFwaE5vZGUgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxIj4KLTwvY29udGFpbmVyPgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSIiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MSI+Ci08L2dyYXBoRWxlbWVudD4KLTxlbGVtZW50IHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxIj4KLTwvZWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvR3JhcGhOb2RlPgotPEdyYXBoTm9kZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEiPgotPC9jb250YWluZXI+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IiI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGVsZW1lbnQgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEiPgotPC9lbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9HcmFwaE5vZGU+Ci08R3JhcGhOb2RlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MSI+Ci08L2NvbnRhaW5lcj4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEiPgotPC9ncmFwaEVsZW1lbnQ+Ci08ZWxlbWVudCBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MSI+Ci08L2VsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0dyYXBoTm9kZT4KLTxHcmFwaE5vZGUgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxIj4KLTwvY29udGFpbmVyPgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSIiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MSI+Ci08L2dyYXBoRWxlbWVudD4KLTxlbGVtZW50IHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxIj4KLTwvZWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvR3JhcGhOb2RlPgotPEdyYXBoTm9kZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEiPgotPC9jb250YWluZXI+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IiI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGVsZW1lbnQgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEiPgotPC9lbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9HcmFwaE5vZGU+Ci08R3JhcGhOb2RlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MSI+Ci08L2NvbnRhaW5lcj4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEiPgotPC9ncmFwaEVsZW1lbnQ+Ci08ZWxlbWVudCBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MSI+Ci08L2VsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0dyYXBoTm9kZT4KLTxHcmFwaE5vZGUgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxIj4KLTwvY29udGFpbmVyPgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSIiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MSI+Ci08L2dyYXBoRWxlbWVudD4KLTxlbGVtZW50IHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxIj4KLTwvZWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvR3JhcGhOb2RlPgotPEdyYXBoTm9kZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEiPgotPC9jb250YWluZXI+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IiI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGVsZW1lbnQgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEiPgotPC9lbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9HcmFwaE5vZGU+Ci08R3JhcGhOb2RlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MSI+Ci08L2NvbnRhaW5lcj4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEiPgotPC9ncmFwaEVsZW1lbnQ+Ci08ZWxlbWVudCBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MSI+Ci08L2VsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0dyYXBoTm9kZT4KLTxHcmFwaE5vZGUgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxIj4KLTwvY29udGFpbmVyPgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSIiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MSI+Ci08L2dyYXBoRWxlbWVudD4KLTxlbGVtZW50IHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxIj4KLTwvZWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvR3JhcGhOb2RlPgotPEdyYXBoTm9kZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEiPgotPC9jb250YWluZXI+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IiI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGVsZW1lbnQgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEiPgotPC9lbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9HcmFwaE5vZGU+Ci08R3JhcGhOb2RlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MSI+Ci08L2NvbnRhaW5lcj4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEiPgotPC9ncmFwaEVsZW1lbnQ+Ci08ZWxlbWVudCBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MSI+Ci08L2VsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0dyYXBoTm9kZT4KLTxHcmFwaE5vZGUgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxIj4KLTwvY29udGFpbmVyPgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSIiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MSI+Ci08L2dyYXBoRWxlbWVudD4KLTxlbGVtZW50IHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxIj4KLTwvZWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvR3JhcGhOb2RlPgotPEdyYXBoTm9kZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEiPgotPC9jb250YWluZXI+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IiI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGVsZW1lbnQgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEiPgotPC9lbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9HcmFwaE5vZGU+Ci08R3JhcGhOb2RlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MSI+Ci08L2NvbnRhaW5lcj4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEiPgotPC9ncmFwaEVsZW1lbnQ+Ci08ZWxlbWVudCBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MSI+Ci08L2VsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0dyYXBoTm9kZT4KLTxHcmFwaE5vZGUgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxIj4KLTwvY29udGFpbmVyPgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSIiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MSI+Ci08L2dyYXBoRWxlbWVudD4KLTxlbGVtZW50IHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxIj4KLTwvZWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvR3JhcGhOb2RlPgotPEdyYXBoTm9kZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEiPgotPC9jb250YWluZXI+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IiI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGVsZW1lbnQgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEiPgotPC9lbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9HcmFwaE5vZGU+Ci08R3JhcGhOb2RlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MSI+Ci08L2NvbnRhaW5lcj4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEiPgotPC9ncmFwaEVsZW1lbnQ+Ci08ZWxlbWVudCBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MSI+Ci08L2VsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0dyYXBoTm9kZT4KLTxHcmFwaE5vZGUgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxIj4KLTwvY29udGFpbmVyPgotPFByb3BlcnR5IG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIGtleT0id3BDb21wb3NpdGVUeXBlIiB2YWx1ZT0iMSI+Ci08L1Byb3BlcnR5PgotPEdyYXBoRWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEiPgotPC9jb250YWluZXI+Ci08YW5jaG9yIHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxIj4KLTwvYW5jaG9yPgotPC9HcmFwaEVkZ2U+Ci08R3JhcGhDb25uZWN0b3IgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGdyYXBoRWRnZSBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MSI+Ci08L2dyYXBoRWRnZT4KLTwvR3JhcGhDb25uZWN0b3I+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IiI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGVsZW1lbnQgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEiPgotPC9lbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9HcmFwaE5vZGU+Ci08R3JhcGhOb2RlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MSI+Ci08L2NvbnRhaW5lcj4KLTxQcm9wZXJ0eSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBrZXk9IndwQ29tcG9zaXRlVHlwZSIgdmFsdWU9IjIiPgotPC9Qcm9wZXJ0eT4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEiPgotPC9ncmFwaEVsZW1lbnQ+Ci08ZWxlbWVudCBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MSI+Ci08L2VsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0dyYXBoTm9kZT4KLTxHcmFwaE5vZGUgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxIj4KLTwvY29udGFpbmVyPgotPFByb3BlcnR5IG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIGtleT0id3BDb21wb3NpdGVUeXBlIiB2YWx1ZT0iMSI+Ci08L1Byb3BlcnR5PgotPEdyYXBoRWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEiPgotPC9jb250YWluZXI+Ci08YW5jaG9yIHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxIj4KLTwvYW5jaG9yPgotPC9HcmFwaEVkZ2U+Ci08R3JhcGhDb25uZWN0b3IgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGdyYXBoRWRnZSBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MSI+Ci08L2dyYXBoRWRnZT4KLTwvR3JhcGhDb25uZWN0b3I+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IiI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGVsZW1lbnQgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEiPgotPC9lbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9HcmFwaE5vZGU+Ci08R3JhcGhOb2RlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MSI+Ci08L2NvbnRhaW5lcj4KLTxQcm9wZXJ0eSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBrZXk9IndwQ29tcG9zaXRlVHlwZSIgdmFsdWU9IjIiPgotPC9Qcm9wZXJ0eT4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEiPgotPC9ncmFwaEVsZW1lbnQ+Ci08ZWxlbWVudCBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MSI+Ci08L2VsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0dyYXBoTm9kZT4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iQWN0aXZpdHkgRGV0YWlsIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEiPgotPC9ncmFwaEVsZW1lbnQ+Ci08ZWxlbWVudCBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MSI+Ci08L2VsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0RpYWdyYW0+Ci08L1Byb2Nlc3NQYWNrYWdlPgotPERpYWdyYW0gbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IkFjdGl2aXR5IERldGFpbCI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMSI+Ci08L2dyYXBoRWxlbWVudD4KLTxlbGVtZW50IHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMSI+Ci08L2VsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0RpYWdyYW0+Ci08Q2FwYWJpbGl0eVBhdHRlcm4gbmFtZT0iQ1AgQjEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iQ1AgQjEiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNSZXBlYXRhYmxlPSJmYWxzZSIgaXNPbmdvaW5nPSJmYWxzZSIgaXNFdmVudERyaXZlbj0iZmFsc2UiIHZhcmlhYmlsaXR5VHlwZT0ibmEiIGlzRW5hY3RhYmxlPSJmYWxzZSI+Ci08UHJvY2Vzc0Rlc2NyaXB0aW9uIG5hbWU9IkNQIEExLF9kQmh2a1VBdkVkcUZxSXU4LWNrb2xnIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHB1cnBvc2U9IiIgYWx0ZXJuYXRpdmVzPSIiIGhvd3RvU3RhZmY9IiIgZXh0ZXJuYWxJZD0iIiBzY29wZT0iIiB1c2FnZU5vdGVzPSIiPgotPC9Qcm9jZXNzRGVzY3JpcHRpb24+Ci08YnJlYWtkb3duRWxlbWVudHMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEvQWN0MSI+Ci08L2JyZWFrZG93bkVsZW1lbnRzPgotPGRlZmF1bHRDb250ZXh0IHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9DUCBCMSI+Ci08L2RlZmF1bHRDb250ZXh0PgotPHZhbGlkQ29udGV4dCBwYXRoPSJDb25maWcgQSI+Ci08L3ZhbGlkQ29udGV4dD4KLTwvQ2FwYWJpbGl0eVBhdHRlcm4+Ci08L1Byb2Nlc3NDb21wb25lbnQ+Ci08L1Byb2Nlc3NQYWNrYWdlPgotPC9Db250ZW50UGFja2FnZT4KLTxQcm9jZXNzUGFja2FnZSBuYW1lPSJEZWxpdmVyeVByb2Nlc3NlcyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBnbG9iYWw9ImZhbHNlIj4KLTxQcm9jZXNzUGFja2FnZSBuYW1lPSJkZWxQcm9jUGFrX0IxIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGdsb2JhbD0iZmFsc2UiPgotPHBhcmVudFBhY2thZ2UgcGF0aD0iUGx1ZyBCL0RlbGl2ZXJ5UHJvY2Vzc2VzL2RlbFByb2NQYWtfQjEiPgotPC9wYXJlbnRQYWNrYWdlPgotPFByb2Nlc3NQYWNrYWdlIG5hbWU9ImRlbFByb2NQYWtfQjEuMSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBnbG9iYWw9ImZhbHNlIj4KLTxwYXJlbnRQYWNrYWdlIHBhdGg9IlBsdWcgQi9EZWxpdmVyeVByb2Nlc3Nlcy9kZWxQcm9jUGFrX0IxL2RlbFByb2NQYWtfQjEuMSI+Ci08L3BhcmVudFBhY2thZ2U+Ci08UHJvY2Vzc0NvbXBvbmVudCBuYW1lPSJkZWxQcm9jX0IxLjEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgZ2xvYmFsPSJmYWxzZSIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiPgotPHBhcmVudFBhY2thZ2UgcGF0aD0iUGx1ZyBCL0RlbGl2ZXJ5UHJvY2Vzc2VzL2RlbFByb2NQYWtfQjEvZGVsUHJvY1Bha19CMS4xL2RlbFByb2NfQjEuMSI+Ci08L3BhcmVudFBhY2thZ2U+Ci08RGVsaXZlcnlQcm9jZXNzIG5hbWU9ImRlbFByb2NfQjEuMSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJkZWxQcm9jX0IxLjEiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNSZXBlYXRhYmxlPSJmYWxzZSIgaXNPbmdvaW5nPSJmYWxzZSIgaXNFdmVudERyaXZlbj0iZmFsc2UiIHZhcmlhYmlsaXR5VHlwZT0ibmEiIGlzRW5hY3RhYmxlPSJmYWxzZSI+Ci08RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24gbmFtZT0iZGVsUHJvY19CMS4xLF9WMFY3TVI4MUVkcWdCSVR1SUNMSkV3IiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHB1cnBvc2U9IiIgYWx0ZXJuYXRpdmVzPSIiIGhvd3RvU3RhZmY9IiIgZXh0ZXJuYWxJZD0iIiBzY29wZT0iIiB1c2FnZU5vdGVzPSIiIHNjYWxlPSIiIHByb2plY3RDaGFyYWN0ZXJpc3RpY3M9IiIgcmlza0xldmVsPSIiIGVzdGltYXRpbmdUZWNobmlxdWU9IiIgcHJvamVjdE1lbWJlckV4cGVydGlzZT0iIiB0eXBlT2ZDb250cmFjdD0iIj4KLTwvRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24+Ci08ZGVmYXVsdENvbnRleHQgcGF0aD0iUGx1ZyBCL0RlbGl2ZXJ5UHJvY2Vzc2VzL2RlbFByb2NQYWtfQjEvZGVsUHJvY1Bha19CMS4xL2RlbFByb2NfQjEuMS9kZWxQcm9jX0IxLjEiPgotPC9kZWZhdWx0Q29udGV4dD4KLTx2YWxpZENvbnRleHQgcGF0aD0iQ29uZmlnIEEiPgotPC92YWxpZENvbnRleHQ+Ci08L0RlbGl2ZXJ5UHJvY2Vzcz4KLTwvUHJvY2Vzc0NvbXBvbmVudD4KLTwvUHJvY2Vzc1BhY2thZ2U+Ci08UHJvY2Vzc0NvbXBvbmVudCBuYW1lPSJkZWxQcm9jX0IxIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGdsb2JhbD0iZmFsc2UiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIj4KLTxwYXJlbnRQYWNrYWdlIHBhdGg9IlBsdWcgQi9EZWxpdmVyeVByb2Nlc3Nlcy9kZWxQcm9jUGFrX0IxL2RlbFByb2NfQjEiPgotPC9wYXJlbnRQYWNrYWdlPgotPERlbGl2ZXJ5UHJvY2VzcyBuYW1lPSJkZWxQcm9jX0IxIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9ImRlbFByb2NfQjEiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNSZXBlYXRhYmxlPSJmYWxzZSIgaXNPbmdvaW5nPSJmYWxzZSIgaXNFdmVudERyaXZlbj0iZmFsc2UiIHZhcmlhYmlsaXR5VHlwZT0ibmEiIGlzRW5hY3RhYmxlPSJmYWxzZSI+Ci08RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24gbmFtZT0iZGVsUHJvY19CMSxfUmZ4dXNSODFFZHFnQklUdUlDTEpFdyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiBwdXJwb3NlPSIiIGFsdGVybmF0aXZlcz0iIiBob3d0b1N0YWZmPSIiIGV4dGVybmFsSWQ9IiIgc2NvcGU9IiIgdXNhZ2VOb3Rlcz0iIiBzY2FsZT0iIiBwcm9qZWN0Q2hhcmFjdGVyaXN0aWNzPSIiIHJpc2tMZXZlbD0iIiBlc3RpbWF0aW5nVGVjaG5pcXVlPSIiIHByb2plY3RNZW1iZXJFeHBlcnRpc2U9IiIgdHlwZU9mQ29udHJhY3Q9IiI+Ci08L0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uPgotPGRlZmF1bHRDb250ZXh0IHBhdGg9IlBsdWcgQi9EZWxpdmVyeVByb2Nlc3Nlcy9kZWxQcm9jUGFrX0IxL2RlbFByb2NfQjEvZGVsUHJvY19CMSI+Ci08L2RlZmF1bHRDb250ZXh0PgotPHZhbGlkQ29udGV4dCBwYXRoPSJDb25maWcgQSI+Ci08L3ZhbGlkQ29udGV4dD4KLTwvRGVsaXZlcnlQcm9jZXNzPgotPC9Qcm9jZXNzQ29tcG9uZW50PgotPC9Qcm9jZXNzUGFja2FnZT4KLTwvUHJvY2Vzc1BhY2thZ2U+Ci08UHJvY2Vzc1BhY2thZ2UgbmFtZT0iUHJvY2Vzc0NvbnRyaWJ1dGlvbnMiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgZ2xvYmFsPSJmYWxzZSI+Ci08L1Byb2Nlc3NQYWNrYWdlPgotPGJhc2VzIHBhdGg9IlBsdWcgQSI+Ci08L2Jhc2VzPgotPC9NZXRob2RQbHVnaW4+Ci08TWV0aG9kQ29uZmlndXJhdGlvbiBuYW1lPSJDb25maWcgQSIgYnJpZWZEZXNjcmlwdGlvbj0iQ29uZmlnIEEgZGVzY3JpcHRpb24iIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiPgotPG1ldGhvZFBsdWdpblNlbGVjdGlvbiBwYXRoPSJQbHVnIEEiPgotPC9tZXRob2RQbHVnaW5TZWxlY3Rpb24+Ci08bWV0aG9kUGx1Z2luU2VsZWN0aW9uIHBhdGg9IlBsdWcgQiI+Ci08L21ldGhvZFBsdWdpblNlbGVjdGlvbj4KLTxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50Ij4KLTwvbWV0aG9kUGFja2FnZVNlbGVjdGlvbj4KLTxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHBhdGg9IlBsdWcgQS9Db250ZW50Ij4KLTwvbWV0aG9kUGFja2FnZVNlbGVjdGlvbj4KLTxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMSI+Ci08L21ldGhvZFBhY2thZ2VTZWxlY3Rpb24+Ci08bWV0aG9kUGFja2FnZVNlbGVjdGlvbiBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMiPgotPC9tZXRob2RQYWNrYWdlU2VsZWN0aW9uPgotPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24gcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMSI+Ci08L21ldGhvZFBhY2thZ2VTZWxlY3Rpb24+Ci08bWV0aG9kUGFja2FnZVNlbGVjdGlvbiBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cyI+Ci08L21ldGhvZFBhY2thZ2VTZWxlY3Rpb24+Ci08bWV0aG9kUGFja2FnZVNlbGVjdGlvbiBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEiPgotPC9tZXRob2RQYWNrYWdlU2VsZWN0aW9uPgotPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24gcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEiPgotPC9tZXRob2RQYWNrYWdlU2VsZWN0aW9uPgotPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24gcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvbWV0aG9kUGFja2FnZVNlbGVjdGlvbj4KLTxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MiI+Ci08L21ldGhvZFBhY2thZ2VTZWxlY3Rpb24+Ci08bWV0aG9kUGFja2FnZVNlbGVjdGlvbiBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzIj4KLTwvbWV0aG9kUGFja2FnZVNlbGVjdGlvbj4KLTxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvYWN0aXZpdHlfZm9yX3ZhcmlhYmlsaXR5X2VsZW1lbnRzIj4KLTwvbWV0aG9kUGFja2FnZVNlbGVjdGlvbj4KLTxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cyI+Ci08L21ldGhvZFBhY2thZ2VTZWxlY3Rpb24+Ci08bWV0aG9kUGFja2FnZVNlbGVjdGlvbiBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEiPgotPC9tZXRob2RQYWNrYWdlU2VsZWN0aW9uPgotPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24gcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9tZXRob2RQYWNrYWdlU2VsZWN0aW9uPgotPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24gcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIGV4dGVuZGluZyAmYXBvcztDUDEgd2l0aCBhbGwgZWxlbWVudHMmYXBvczsiPgotPC9tZXRob2RQYWNrYWdlU2VsZWN0aW9uPgotPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24gcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIGV4dGVuZGluZyAmYXBvcztDUDEgd2l0aCBhbGwgZWxlbWVudHMmYXBvczsvQ1AxIHdpdGggYWxsIGVsZW1lbnRzIj4KLTwvbWV0aG9kUGFja2FnZVNlbGVjdGlvbj4KLTxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHBhdGg9IlBsdWcgQS9EZWxpdmVyeVByb2Nlc3NlcyI+Ci08L21ldGhvZFBhY2thZ2VTZWxlY3Rpb24+Ci08bWV0aG9kUGFja2FnZVNlbGVjdGlvbiBwYXRoPSJQbHVnIEEvRGVsaXZlcnlQcm9jZXNzZXMvZGVsUHJvY1BhayBBMSI+Ci08L21ldGhvZFBhY2thZ2VTZWxlY3Rpb24+Ci08bWV0aG9kUGFja2FnZVNlbGVjdGlvbiBwYXRoPSJQbHVnIEEvRGVsaXZlcnlQcm9jZXNzZXMvZGVsUHJvY1BhayBBMS9kZWxQcm9jUGFrX0ExLjEiPgotPC9tZXRob2RQYWNrYWdlU2VsZWN0aW9uPgotPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24gcGF0aD0iUGx1ZyBBL0RlbGl2ZXJ5UHJvY2Vzc2VzL2RlbFByb2NfQTEiPgotPC9tZXRob2RQYWNrYWdlU2VsZWN0aW9uPgotPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24gcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQiPgotPC9tZXRob2RQYWNrYWdlU2VsZWN0aW9uPgotPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24gcGF0aD0iUGx1ZyBCL0NvbnRlbnQiPgotPC9tZXRob2RQYWNrYWdlU2VsZWN0aW9uPgotPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24gcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxIj4KLTwvbWV0aG9kUGFja2FnZVNlbGVjdGlvbj4KLTxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucyI+Ci08L21ldGhvZFBhY2thZ2VTZWxlY3Rpb24+Ci08bWV0aG9kUGFja2FnZVNlbGVjdGlvbiBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0IxIj4KLTwvbWV0aG9kUGFja2FnZVNlbGVjdGlvbj4KLTxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQjEvY2FwUGF0UGFrX0IxLjEiPgotPC9tZXRob2RQYWNrYWdlU2VsZWN0aW9uPgotPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24gcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19CMS9jYXBQYXRQYWtfQjEuMS9jYXBQYXRfQjEuMSI+Ci08L21ldGhvZFBhY2thZ2VTZWxlY3Rpb24+Ci08bWV0aG9kUGFja2FnZVNlbGVjdGlvbiBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0IxL2NhcFBhdF9CMSI+Ci08L21ldGhvZFBhY2thZ2VTZWxlY3Rpb24+Ci08bWV0aG9kUGFja2FnZVNlbGVjdGlvbiBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEiPgotPC9tZXRob2RQYWNrYWdlU2VsZWN0aW9uPgotPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24gcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEiPgotPC9tZXRob2RQYWNrYWdlU2VsZWN0aW9uPgotPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24gcGF0aD0iUGx1ZyBCL0RlbGl2ZXJ5UHJvY2Vzc2VzIj4KLTwvbWV0aG9kUGFja2FnZVNlbGVjdGlvbj4KLTxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHBhdGg9IlBsdWcgQi9EZWxpdmVyeVByb2Nlc3Nlcy9kZWxQcm9jUGFrX0IxIj4KLTwvbWV0aG9kUGFja2FnZVNlbGVjdGlvbj4KLTxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHBhdGg9IlBsdWcgQi9EZWxpdmVyeVByb2Nlc3Nlcy9kZWxQcm9jUGFrX0IxL2RlbFByb2NQYWtfQjEuMSI+Ci08L21ldGhvZFBhY2thZ2VTZWxlY3Rpb24+Ci08bWV0aG9kUGFja2FnZVNlbGVjdGlvbiBwYXRoPSJQbHVnIEIvRGVsaXZlcnlQcm9jZXNzZXMvZGVsUHJvY1Bha19CMS9kZWxQcm9jUGFrX0IxLjEvZGVsUHJvY19CMS4xIj4KLTwvbWV0aG9kUGFja2FnZVNlbGVjdGlvbj4KLTxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHBhdGg9IlBsdWcgQi9EZWxpdmVyeVByb2Nlc3Nlcy9kZWxQcm9jUGFrX0IxL2RlbFByb2NfQjEiPgotPC9tZXRob2RQYWNrYWdlU2VsZWN0aW9uPgotPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24gcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2F0ZWdvcmllcy9Ub29scyI+Ci08L21ldGhvZFBhY2thZ2VTZWxlY3Rpb24+Ci08bWV0aG9kUGFja2FnZVNlbGVjdGlvbiBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXRlZ29yaWVzIj4KLTwvbWV0aG9kUGFja2FnZVNlbGVjdGlvbj4KLTxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhdGVnb3JpZXMvV1AgVHlwZXMiPgotPC9tZXRob2RQYWNrYWdlU2VsZWN0aW9uPgotPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24gcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2F0ZWdvcmllcy9EaXNjaXBsaW5lcyI+Ci08L21ldGhvZFBhY2thZ2VTZWxlY3Rpb24+Ci08bWV0aG9kUGFja2FnZVNlbGVjdGlvbiBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXRlZ29yaWVzL0N1c3RvbUNhdGVnb3JpZXMiPgotPC9tZXRob2RQYWNrYWdlU2VsZWN0aW9uPgotPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24gcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2F0ZWdvcmllcy9DdXN0b21DYXRlZ29yaWVzL0hpZGRlbiI+Ci08L21ldGhvZFBhY2thZ2VTZWxlY3Rpb24+Ci08bWV0aG9kUGFja2FnZVNlbGVjdGlvbiBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXRlZ29yaWVzL1JvbGVTZXRzIj4KLTwvbWV0aG9kUGFja2FnZVNlbGVjdGlvbj4KLTxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhdGVnb3JpZXMvRG9tYWlucyI+Ci08L21ldGhvZFBhY2thZ2VTZWxlY3Rpb24+Ci08bWV0aG9kUGFja2FnZVNlbGVjdGlvbiBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXRlZ29yaWVzL1dQIFR5cGVzIj4KLTwvbWV0aG9kUGFja2FnZVNlbGVjdGlvbj4KLTxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHBhdGg9IlBsdWcgQi9Db250ZW50L0NhdGVnb3JpZXMiPgotPC9tZXRob2RQYWNrYWdlU2VsZWN0aW9uPgotPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24gcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2F0ZWdvcmllcy9EaXNjaXBsaW5lcyI+Ci08L21ldGhvZFBhY2thZ2VTZWxlY3Rpb24+Ci08bWV0aG9kUGFja2FnZVNlbGVjdGlvbiBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXRlZ29yaWVzL1Rvb2xzIj4KLTwvbWV0aG9kUGFja2FnZVNlbGVjdGlvbj4KLTxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHBhdGg9IlBsdWcgQi9Db250ZW50L0NhdGVnb3JpZXMvRG9tYWlucyI+Ci08L21ldGhvZFBhY2thZ2VTZWxlY3Rpb24+Ci08bWV0aG9kUGFja2FnZVNlbGVjdGlvbiBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXRlZ29yaWVzL0N1c3RvbUNhdGVnb3JpZXMiPgotPC9tZXRob2RQYWNrYWdlU2VsZWN0aW9uPgotPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24gcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2F0ZWdvcmllcy9DdXN0b21DYXRlZ29yaWVzL0hpZGRlbiI+Ci08L21ldGhvZFBhY2thZ2VTZWxlY3Rpb24+Ci08bWV0aG9kUGFja2FnZVNlbGVjdGlvbiBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXRlZ29yaWVzL1JvbGVTZXRzIj4KLTwvbWV0aG9kUGFja2FnZVNlbGVjdGlvbj4KLTxwcm9jZXNzVmlld3MgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2F0ZWdvcmllcy9DdXN0b21DYXRlZ29yaWVzL2N1c3RvbV9jYXRlZ29yeV9BMSI+Ci08L3Byb2Nlc3NWaWV3cz4KLTwvTWV0aG9kQ29uZmlndXJhdGlvbj4KLTxNZXRob2RDb25maWd1cmF0aW9uIG5hbWU9IkNvbmZpZyBCIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiPgotPG1ldGhvZFBsdWdpblNlbGVjdGlvbiBwYXRoPSJQbHVnIEIiPgotPC9tZXRob2RQbHVnaW5TZWxlY3Rpb24+Ci08bWV0aG9kUGFja2FnZVNlbGVjdGlvbiBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudCI+Ci08L21ldGhvZFBhY2thZ2VTZWxlY3Rpb24+Ci08bWV0aG9kUGFja2FnZVNlbGVjdGlvbiBwYXRoPSJQbHVnIEIvQ29udGVudCI+Ci08L21ldGhvZFBhY2thZ2VTZWxlY3Rpb24+Ci08bWV0aG9kUGFja2FnZVNlbGVjdGlvbiBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEiPgotPC9tZXRob2RQYWNrYWdlU2VsZWN0aW9uPgotPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24gcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zIj4KLTwvbWV0aG9kUGFja2FnZVNlbGVjdGlvbj4KLTxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQjEiPgotPC9tZXRob2RQYWNrYWdlU2VsZWN0aW9uPgotPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24gcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19CMS9jYXBQYXRQYWtfQjEuMSI+Ci08L21ldGhvZFBhY2thZ2VTZWxlY3Rpb24+Ci08bWV0aG9kUGFja2FnZVNlbGVjdGlvbiBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0IxL2NhcFBhdFBha19CMS4xL2NhcFBhdF9CMS4xIj4KLTwvbWV0aG9kUGFja2FnZVNlbGVjdGlvbj4KLTxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQjEvY2FwUGF0X0IxIj4KLTwvbWV0aG9kUGFja2FnZVNlbGVjdGlvbj4KLTxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMSI+Ci08L21ldGhvZFBhY2thZ2VTZWxlY3Rpb24+Ci08bWV0aG9kUGFja2FnZVNlbGVjdGlvbiBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MSI+Ci08L21ldGhvZFBhY2thZ2VTZWxlY3Rpb24+Ci08bWV0aG9kUGFja2FnZVNlbGVjdGlvbiBwYXRoPSJQbHVnIEIvRGVsaXZlcnlQcm9jZXNzZXMiPgotPC9tZXRob2RQYWNrYWdlU2VsZWN0aW9uPgotPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24gcGF0aD0iUGx1ZyBCL0RlbGl2ZXJ5UHJvY2Vzc2VzL2RlbFByb2NQYWtfQjEiPgotPC9tZXRob2RQYWNrYWdlU2VsZWN0aW9uPgotPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24gcGF0aD0iUGx1ZyBCL0RlbGl2ZXJ5UHJvY2Vzc2VzL2RlbFByb2NQYWtfQjEvZGVsUHJvY1Bha19CMS4xIj4KLTwvbWV0aG9kUGFja2FnZVNlbGVjdGlvbj4KLTxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHBhdGg9IlBsdWcgQi9EZWxpdmVyeVByb2Nlc3Nlcy9kZWxQcm9jUGFrX0IxL2RlbFByb2NQYWtfQjEuMS9kZWxQcm9jX0IxLjEiPgotPC9tZXRob2RQYWNrYWdlU2VsZWN0aW9uPgotPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24gcGF0aD0iUGx1ZyBCL0RlbGl2ZXJ5UHJvY2Vzc2VzL2RlbFByb2NQYWtfQjEvZGVsUHJvY19CMSI+Ci08L21ldGhvZFBhY2thZ2VTZWxlY3Rpb24+Ci08cHJvY2Vzc1ZpZXdzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NhdGVnb3JpZXMvQ3VzdG9tQ2F0ZWdvcmllcy9jdXN0b21fY2F0ZWdvcnlfQjEiPgotPC9wcm9jZXNzVmlld3M+Ci08L01ldGhvZENvbmZpZ3VyYXRpb24+Ci08L01ldGhvZExpYnJhcnk+Ci08TWV0aG9kUGx1Z2luIG5hbWU9IlBsdWcgQSIgYnJpZWZEZXNjcmlwdGlvbj0iUGx1ZyBBIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSJQbHVnIEEgQXJ0aHVyIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIHVzZXJDaGFuZ2VhYmxlPSJ0cnVlIj4KLTxDb250ZW50UGFja2FnZSBuYW1lPSJDb250ZW50IiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGdsb2JhbD0iZmFsc2UiPgotPENvbnRlbnRQYWNrYWdlIG5hbWU9IkNhdGVnb3JpZXMiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgZ2xvYmFsPSJmYWxzZSI+Ci08cGFyZW50UGFja2FnZSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXRlZ29yaWVzIj4KLTwvcGFyZW50UGFja2FnZT4KLTxDb250ZW50UGFja2FnZSBuYW1lPSJEb21haW5zIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGdsb2JhbD0iZmFsc2UiPgotPHBhcmVudFBhY2thZ2UgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2F0ZWdvcmllcy9Eb21haW5zIj4KLTwvcGFyZW50UGFja2FnZT4KLTxEb21haW4gbmFtZT0iZG9tYWluX0ExIiBicmllZkRlc2NyaXB0aW9uPSJEb21haW4gQTEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IkRvbWFpbiBBMSBwcmVzZW50IiB2YXJpYWJpbGl0eVR5cGU9Im5hIj4KLTxDb250ZW50RGVzY3JpcHRpb24gbmFtZT0iZG9tYWluX0ExLF9GRXpPNEEtV0VkcUwyTzFQSlY5Y1pBIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iVHVlIFNlcCAwNiAxOToxNTozNSBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iJmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICBEb21haW4gQTEgbWFpbiYjMTM7JiMxMDsmbHQ7L3AmZ3Q7IiBrZXlDb25zaWRlcmF0aW9ucz0iRG9tYWluIEExIGtleSI+Ci08L0NvbnRlbnREZXNjcmlwdGlvbj4KLTxzdXBwb3J0aW5nTWF0ZXJpYWxzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9zdXBwb3J0aW5nX21hdGVyaWFsX0ExIj4KLTwvc3VwcG9ydGluZ01hdGVyaWFscz4KLTxjb25jZXB0c0FuZFBhcGVycyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvY29uY2VwdF9BMSI+Ci08L2NvbmNlcHRzQW5kUGFwZXJzPgotPGNvbmNlcHRzQW5kUGFwZXJzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS93aGl0ZXBhcGVyX0ExIj4KLTwvY29uY2VwdHNBbmRQYXBlcnM+Ci08Y2hlY2tsaXN0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvY2hlY2tsaXN0X0ExIj4KLTwvY2hlY2tsaXN0cz4KLTxndWlkZWxpbmVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9ndWlkZWxpbmVfQTEiPgotPC9ndWlkZWxpbmVzPgotPGV4YW1wbGVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9leGFtcGxlX0ExIj4KLTwvZXhhbXBsZXM+Ci08YXNzZXRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9yZXVzYWJsZV9hc3NldF9BMSI+Ci08L2Fzc2V0cz4KLTx3b3JrUHJvZHVjdHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2RlbGl2ZXJhYmxlX0ExIj4KLTwvd29ya1Byb2R1Y3RzPgotPHdvcmtQcm9kdWN0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvb3V0Y29tZV9BMSI+Ci08L3dvcmtQcm9kdWN0cz4KLTxEb21haW4gbmFtZT0ic3ViX2RvbWFpbl9BMS4xIiBicmllZkRlc2NyaXB0aW9uPSJTdWItRG9tYWluIEExLjEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IlN1Yi1Eb21haW4gQTEuMSBwcmVzZW50IiB2YXJpYWJpbGl0eVR5cGU9Im5hIj4KLTxDb250ZW50RGVzY3JpcHRpb24gbmFtZT0ic3ViX2RvbWFpbl9BMS4xLF9HT1o3UUEtV0VkcUwyTzFQSlY5Y1pBIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iVGh1IEF1ZyAxOCAxNzo0Njo1MyBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iU3ViLURvbWFpbiBBMS4xIG1haW4iIGtleUNvbnNpZGVyYXRpb25zPSJTdWItRG9tYWluIEExLjEga2V5Ij4KLTwvQ29udGVudERlc2NyaXB0aW9uPgotPHN1cHBvcnRpbmdNYXRlcmlhbHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3N1cHBvcnRpbmdfbWF0ZXJpYWxfQTEiPgotPC9zdXBwb3J0aW5nTWF0ZXJpYWxzPgotPGNvbmNlcHRzQW5kUGFwZXJzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9jb25jZXB0X0ExIj4KLTwvY29uY2VwdHNBbmRQYXBlcnM+Ci08Y29uY2VwdHNBbmRQYXBlcnMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3doaXRlcGFwZXJfQTEiPgotPC9jb25jZXB0c0FuZFBhcGVycz4KLTxjaGVja2xpc3RzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9jaGVja2xpc3RfQTEiPgotPC9jaGVja2xpc3RzPgotPGd1aWRlbGluZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2d1aWRlbGluZV9BMSI+Ci08L2d1aWRlbGluZXM+Ci08ZXhhbXBsZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2V4YW1wbGVfQTEiPgotPC9leGFtcGxlcz4KLTxhc3NldHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3JldXNhYmxlX2Fzc2V0X0ExIj4KLTwvYXNzZXRzPgotPHdvcmtQcm9kdWN0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvYXJ0aWZhY3RfQTEvc3ViX2FydGlmYWN0X0ExLjEiPgotPC93b3JrUHJvZHVjdHM+Ci08L0RvbWFpbj4KLTwvRG9tYWluPgotPERvbWFpbiBuYW1lPSJkb21haW5fQTIiIGJyaWVmRGVzY3JpcHRpb249IkRvbWFpbiBBMiBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iRG9tYWluIEEyIHByZXNlbnQiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPENvbnRlbnREZXNjcmlwdGlvbiBuYW1lPSJkb21haW5fQTIsX0ZxV0w4QS1XRWRxTDJPMVBKVjljWkEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJUaHUgQXVnIDE4IDE3OjQ3OjI4IFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSJEb21haW4gQTIgbWFpbiIga2V5Q29uc2lkZXJhdGlvbnM9IkRvbWFpbiBBMiBrZXkiPgotPC9Db250ZW50RGVzY3JpcHRpb24+Ci08c3VwcG9ydGluZ01hdGVyaWFscyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvc3VwcG9ydGluZ19tYXRlcmlhbF9BMiI+Ci08L3N1cHBvcnRpbmdNYXRlcmlhbHM+Ci08Y29uY2VwdHNBbmRQYXBlcnMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2NvbmNlcHRfQTIiPgotPC9jb25jZXB0c0FuZFBhcGVycz4KLTxjb25jZXB0c0FuZFBhcGVycyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvd2hpdGVwYXBlcl9BMiI+Ci08L2NvbmNlcHRzQW5kUGFwZXJzPgotPGNoZWNrbGlzdHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2NoZWNrbGlzdF9BMiI+Ci08L2NoZWNrbGlzdHM+Ci08Z3VpZGVsaW5lcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvZ3VpZGVsaW5lX0EyIj4KLTwvZ3VpZGVsaW5lcz4KLTxleGFtcGxlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvZXhhbXBsZV9BMiI+Ci08L2V4YW1wbGVzPgotPGFzc2V0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvcmV1c2FibGVfYXNzZXRfQTIiPgotPC9hc3NldHM+Ci08d29ya1Byb2R1Y3RzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9hcnRpZmFjdF9BMSI+Ci08L3dvcmtQcm9kdWN0cz4KLTx3b3JrUHJvZHVjdHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2FydGlmYWN0X0EyL2FydGlmYWN0X0EyLjEiPgotPC93b3JrUHJvZHVjdHM+Ci08d29ya1Byb2R1Y3RzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9hcnRpZmFjdF9BMiI+Ci08L3dvcmtQcm9kdWN0cz4KLTx3b3JrUHJvZHVjdHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2RlbGl2ZXJhYmxlX0EyIj4KLTwvd29ya1Byb2R1Y3RzPgotPHdvcmtQcm9kdWN0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvb3V0Y29tZV9BMiI+Ci08L3dvcmtQcm9kdWN0cz4KLTwvRG9tYWluPgotPC9Db250ZW50UGFja2FnZT4KLTxDb250ZW50UGFja2FnZSBuYW1lPSJEaXNjaXBsaW5lcyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBnbG9iYWw9ImZhbHNlIj4KLTxwYXJlbnRQYWNrYWdlIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhdGVnb3JpZXMvRGlzY2lwbGluZXMiPgotPC9wYXJlbnRQYWNrYWdlPgotPERpc2NpcGxpbmVHcm91cGluZyBuYW1lPSJkaXNjaXBsaW5lX2dyb3VwaW5nX0ExIiBicmllZkRlc2NyaXB0aW9uPSJEaXNjaXBsaW5lIEdyb3VwaW5nIEExIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJEaXNjaXBsaW5lIEdyb3VwaW5nIEExIHByZXNlbnQiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPENvbnRlbnREZXNjcmlwdGlvbiBuYW1lPSJkaXNjaXBsaW5lX2dyb3VwaW5nX0ExLF9DQ1ZqY0EtV0VkcUwyTzFQSlY5Y1pBIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iVGh1IEF1ZyAxOCAxNzo0MjozNyBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iRGlzY2lwbGluZSBHcm91cGluZyBBMSBtYWluIiBrZXlDb25zaWRlcmF0aW9ucz0iRGlzY2lwbGluZSBHcm91cGluZyBBMSBrZXkiPgotPC9Db250ZW50RGVzY3JpcHRpb24+Ci08ZGlzY2lwbGluZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2F0ZWdvcmllcy9EaXNjaXBsaW5lcy9kaXNjaXBsaW5lX0ExIj4KLTwvZGlzY2lwbGluZXM+Ci08L0Rpc2NpcGxpbmVHcm91cGluZz4KLTxEaXNjaXBsaW5lIG5hbWU9ImRpc2NpcGxpbmVfQTEiIGJyaWVmRGVzY3JpcHRpb249IkRpc2NpcGxpbmUgQTEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IkRpc2NpcGxpbmUgQTEgcHJlc2VudCIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08Q29udGVudERlc2NyaXB0aW9uIG5hbWU9ImRpc2NpcGxpbmVfQTEsX0M1ZF93QS1XRWRxTDJPMVBKVjljWkEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJNb24gQXVnIDIyIDEwOjQ1OjAyIFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSJEaXNjaXBsaW5lIEExIG1haW4iIGtleUNvbnNpZGVyYXRpb25zPSJEaXNjaXBsaW5lIEExIGtleSI+Ci08L0NvbnRlbnREZXNjcmlwdGlvbj4KLTxzdXBwb3J0aW5nTWF0ZXJpYWxzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9zdXBwb3J0aW5nX21hdGVyaWFsX0ExIj4KLTwvc3VwcG9ydGluZ01hdGVyaWFscz4KLTxjb25jZXB0c0FuZFBhcGVycyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvY29uY2VwdF9BMSI+Ci08L2NvbmNlcHRzQW5kUGFwZXJzPgotPGNvbmNlcHRzQW5kUGFwZXJzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS93aGl0ZXBhcGVyX0ExIj4KLTwvY29uY2VwdHNBbmRQYXBlcnM+Ci08Y2hlY2tsaXN0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvY2hlY2tsaXN0X0ExIj4KLTwvY2hlY2tsaXN0cz4KLTxndWlkZWxpbmVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9ndWlkZWxpbmVfQTEiPgotPC9ndWlkZWxpbmVzPgotPGV4YW1wbGVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9leGFtcGxlX0ExIj4KLTwvZXhhbXBsZXM+Ci08YXNzZXRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9yZXVzYWJsZV9hc3NldF9BMSI+Ci08L2Fzc2V0cz4KLTx0YXNrcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvdGFza19BMSI+Ci08L3Rhc2tzPgotPC9EaXNjaXBsaW5lPgotPERpc2NpcGxpbmUgbmFtZT0iZGlzY2lwbGluZV9BMiIgYnJpZWZEZXNjcmlwdGlvbj0iRGlzY2lwbGluZSBBMiBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iRGlzY2lwbGluZSBBMiBwcmVzZW50IiB2YXJpYWJpbGl0eVR5cGU9Im5hIj4KLTxDb250ZW50RGVzY3JpcHRpb24gbmFtZT0iZGlzY2lwbGluZV9BMixfRHp2UG9BLVdFZHFMMk8xUEpWOWNaQSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURhdGU9IlRodSBBdWcgMTggMTc6NDQ6MTQgUERUIDIwMDUiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249IkRpc2NpcGxpbmUgQTIgbWFpbiIga2V5Q29uc2lkZXJhdGlvbnM9IkRpc2NpcGxpbmUgQTIga2V5Ij4KLTwvQ29udGVudERlc2NyaXB0aW9uPgotPHN1cHBvcnRpbmdNYXRlcmlhbHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3N1cHBvcnRpbmdfbWF0ZXJpYWxfQTIiPgotPC9zdXBwb3J0aW5nTWF0ZXJpYWxzPgotPGNvbmNlcHRzQW5kUGFwZXJzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9jb25jZXB0X0EyIj4KLTwvY29uY2VwdHNBbmRQYXBlcnM+Ci08Y29uY2VwdHNBbmRQYXBlcnMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3doaXRlcGFwZXJfQTIiPgotPC9jb25jZXB0c0FuZFBhcGVycz4KLTxjaGVja2xpc3RzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9jaGVja2xpc3RfQTIiPgotPC9jaGVja2xpc3RzPgotPGd1aWRlbGluZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2d1aWRlbGluZV9BMiI+Ci08L2d1aWRlbGluZXM+Ci08ZXhhbXBsZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2V4YW1wbGVfQTIiPgotPC9leGFtcGxlcz4KLTxhc3NldHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3JldXNhYmxlX2Fzc2V0X0EyIj4KLTwvYXNzZXRzPgotPHRhc2tzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS90YXNrX0EyIj4KLTwvdGFza3M+Ci08L0Rpc2NpcGxpbmU+Ci08L0NvbnRlbnRQYWNrYWdlPgotPENvbnRlbnRQYWNrYWdlIG5hbWU9IlJvbGVTZXRzIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGdsb2JhbD0iZmFsc2UiPgotPHBhcmVudFBhY2thZ2UgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2F0ZWdvcmllcy9Sb2xlU2V0cyI+Ci08L3BhcmVudFBhY2thZ2U+Ci08Um9sZVNldEdyb3VwaW5nIG5hbWU9InJvbGVfc2V0X2dyb3VwaW5nX0ExIiBicmllZkRlc2NyaXB0aW9uPSJSb2xlIFNldCBHcm91cGluZyBBMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iUm9sZSBTZXQgR3JvdXBpbmcgQTEgcHJlc2VudCIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08Q29udGVudERlc2NyaXB0aW9uIG5hbWU9InJvbGVfc2V0X2dyb3VwaW5nX0ExLF9KWW4wZ0EtV0VkcUwyTzFQSlY5Y1pBIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iVGh1IEF1ZyAxOCAxNzo0OTozMSBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iUm9sZSBTZXQgR3JvdXBpbmcgQTEgbWFpbiIga2V5Q29uc2lkZXJhdGlvbnM9IlJvbGUgU2V0IEdyb3VwaW5nIEExIGtleSI+Ci08L0NvbnRlbnREZXNjcmlwdGlvbj4KLTxyb2xlU2V0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXRlZ29yaWVzL1JvbGVTZXRzL3JvbGVfc2V0X0ExIj4KLTwvcm9sZVNldHM+Ci08L1JvbGVTZXRHcm91cGluZz4KLTxSb2xlU2V0IG5hbWU9InJvbGVfc2V0X0ExIiBicmllZkRlc2NyaXB0aW9uPSJSb2xlIFNldCBBMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iUm9sZSBTZXQgQTEgcHJlc2VudCIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08Q29udGVudERlc2NyaXB0aW9uIG5hbWU9InJvbGVfc2V0X0ExLF85UHAxVUJCS0VkcUJzN0toZFZMUkxBIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iTW9uIEF1ZyAyMiAxMDo0NzoyMyBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iUm9sZSBTZXQgQTEgbWFpbiIga2V5Q29uc2lkZXJhdGlvbnM9IlJvbGUgU2V0IEExMSBrZXkiPgotPC9Db250ZW50RGVzY3JpcHRpb24+Ci08c3VwcG9ydGluZ01hdGVyaWFscyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvc3VwcG9ydGluZ19tYXRlcmlhbF9BMSI+Ci08L3N1cHBvcnRpbmdNYXRlcmlhbHM+Ci08Y29uY2VwdHNBbmRQYXBlcnMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2NvbmNlcHRfQTEiPgotPC9jb25jZXB0c0FuZFBhcGVycz4KLTxjb25jZXB0c0FuZFBhcGVycyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvd2hpdGVwYXBlcl9BMSI+Ci08L2NvbmNlcHRzQW5kUGFwZXJzPgotPGNoZWNrbGlzdHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2NoZWNrbGlzdF9BMSI+Ci08L2NoZWNrbGlzdHM+Ci08Z3VpZGVsaW5lcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvZ3VpZGVsaW5lX0ExIj4KLTwvZ3VpZGVsaW5lcz4KLTxleGFtcGxlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvZXhhbXBsZV9BMSI+Ci08L2V4YW1wbGVzPgotPGFzc2V0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvcmV1c2FibGVfYXNzZXRfQTEiPgotPC9hc3NldHM+Ci08cm9sZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3JvbGVfQTEiPgotPC9yb2xlcz4KLTwvUm9sZVNldD4KLTxSb2xlU2V0IG5hbWU9InJvbGVfc2V0X0EyIiBicmllZkRlc2NyaXB0aW9uPSJSb2xlIFNldCBBMiBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iUm9sZSBTZXQgQTIgcHJlc2VudCIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08Q29udGVudERlc2NyaXB0aW9uIG5hbWU9InJvbGVfc2V0X0EyLF8tdWJnY0JCS0VkcUJzN0toZFZMUkxBIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iVGh1IEF1ZyAxOCAxNzo1MDo0MCBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iUm9sZSBTZXQgQTIgbWFpbiIga2V5Q29uc2lkZXJhdGlvbnM9IlJvbGUgU2V0IEEyIGtleSI+Ci08L0NvbnRlbnREZXNjcmlwdGlvbj4KLTxzdXBwb3J0aW5nTWF0ZXJpYWxzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9zdXBwb3J0aW5nX21hdGVyaWFsX0EyIj4KLTwvc3VwcG9ydGluZ01hdGVyaWFscz4KLTxjb25jZXB0c0FuZFBhcGVycyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvY29uY2VwdF9BMiI+Ci08L2NvbmNlcHRzQW5kUGFwZXJzPgotPGNvbmNlcHRzQW5kUGFwZXJzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS93aGl0ZXBhcGVyX0EyIj4KLTwvY29uY2VwdHNBbmRQYXBlcnM+Ci08Y2hlY2tsaXN0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvY2hlY2tsaXN0X0EyIj4KLTwvY2hlY2tsaXN0cz4KLTxndWlkZWxpbmVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9ndWlkZWxpbmVfQTIiPgotPC9ndWlkZWxpbmVzPgotPGV4YW1wbGVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9leGFtcGxlX0EyIj4KLTwvZXhhbXBsZXM+Ci08YXNzZXRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9yZXVzYWJsZV9hc3NldF9BMiI+Ci08L2Fzc2V0cz4KLTxyb2xlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvcm9sZV9BMiI+Ci08L3JvbGVzPgotPC9Sb2xlU2V0PgotPC9Db250ZW50UGFja2FnZT4KLTxDb250ZW50UGFja2FnZSBuYW1lPSJXUCBUeXBlcyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBnbG9iYWw9ImZhbHNlIj4KLTxwYXJlbnRQYWNrYWdlIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhdGVnb3JpZXMvV1AgVHlwZXMiPgotPC9wYXJlbnRQYWNrYWdlPgotPFdvcmtQcm9kdWN0VHlwZSBuYW1lPSJ3b3JrX3Byb2R1Y3RfdHlwZV9BMSIgYnJpZWZEZXNjcmlwdGlvbj0iV29yayBQcm9kdWN0IFR5cGUgQTEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IldvcmsgUHJvZHVjdCBUeXBlIEExIHByZXNlbnQiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPENvbnRlbnREZXNjcmlwdGlvbiBuYW1lPSJ3b3JrX3Byb2R1Y3RfdHlwZV9BMSxfSGdoRFlBLVdFZHFMMk8xUEpWOWNaQSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURhdGU9IlRodSBBdWcgMTggMTg6MDI6NDQgUERUIDIwMDUiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249IldvcmsgUHJvZHVjdCBUeXBlIEExIG1haW4iIGtleUNvbnNpZGVyYXRpb25zPSJXb3JrIFByb2R1Y3QgVHlwZSBBMSBrZXkiPgotPC9Db250ZW50RGVzY3JpcHRpb24+Ci08c3VwcG9ydGluZ01hdGVyaWFscyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvc3VwcG9ydGluZ19tYXRlcmlhbF9BMSI+Ci08L3N1cHBvcnRpbmdNYXRlcmlhbHM+Ci08Y29uY2VwdHNBbmRQYXBlcnMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2NvbmNlcHRfQTEiPgotPC9jb25jZXB0c0FuZFBhcGVycz4KLTxjb25jZXB0c0FuZFBhcGVycyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvd2hpdGVwYXBlcl9BMSI+Ci08L2NvbmNlcHRzQW5kUGFwZXJzPgotPGNoZWNrbGlzdHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2NoZWNrbGlzdF9BMSI+Ci08L2NoZWNrbGlzdHM+Ci08Z3VpZGVsaW5lcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvZ3VpZGVsaW5lX0ExIj4KLTwvZ3VpZGVsaW5lcz4KLTxleGFtcGxlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvZXhhbXBsZV9BMSI+Ci08L2V4YW1wbGVzPgotPGFzc2V0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvcmV1c2FibGVfYXNzZXRfQTEiPgotPC9hc3NldHM+Ci08d29ya1Byb2R1Y3RzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9hcnRpZmFjdF9BMSI+Ci08L3dvcmtQcm9kdWN0cz4KLTx3b3JrUHJvZHVjdHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2FydGlmYWN0X0ExL3N1Yl9hcnRpZmFjdF9BMS4xIj4KLTwvd29ya1Byb2R1Y3RzPgotPHdvcmtQcm9kdWN0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvZGVsaXZlcmFibGVfQTEiPgotPC93b3JrUHJvZHVjdHM+Ci08d29ya1Byb2R1Y3RzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9vdXRjb21lX0ExIj4KLTwvd29ya1Byb2R1Y3RzPgotPC9Xb3JrUHJvZHVjdFR5cGU+Ci08V29ya1Byb2R1Y3RUeXBlIG5hbWU9IndvcmtfcHJvZHVjdF90eXBlX0EyIiBicmllZkRlc2NyaXB0aW9uPSJXb3JrIFByb2R1Y3QgVHlwZSBBMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iV29yayBQcm9kdWN0IFR5cGUgQTIgcHJlc2VudCIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08Q29udGVudERlc2NyaXB0aW9uIG5hbWU9IndvcmtfcHJvZHVjdF90eXBlX0EyLF9JRm5VZ0EtV0VkcUwyTzFQSlY5Y1pBIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iVGh1IEF1ZyAxOCAxODowMzoxNiBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iV29yayBQcm9kdWN0IFR5cGUgQTEgbWFpbiIga2V5Q29uc2lkZXJhdGlvbnM9IldvcmsgUHJvZHVjdCBUeXBlIEExIGtleSI+Ci08L0NvbnRlbnREZXNjcmlwdGlvbj4KLTxzdXBwb3J0aW5nTWF0ZXJpYWxzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9zdXBwb3J0aW5nX21hdGVyaWFsX0EyIj4KLTwvc3VwcG9ydGluZ01hdGVyaWFscz4KLTxjb25jZXB0c0FuZFBhcGVycyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvY29uY2VwdF9BMiI+Ci08L2NvbmNlcHRzQW5kUGFwZXJzPgotPGNvbmNlcHRzQW5kUGFwZXJzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS93aGl0ZXBhcGVyX0EyIj4KLTwvY29uY2VwdHNBbmRQYXBlcnM+Ci08Y2hlY2tsaXN0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvY2hlY2tsaXN0X0EyIj4KLTwvY2hlY2tsaXN0cz4KLTxndWlkZWxpbmVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9ndWlkZWxpbmVfQTIiPgotPC9ndWlkZWxpbmVzPgotPGV4YW1wbGVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9leGFtcGxlX0EyIj4KLTwvZXhhbXBsZXM+Ci08YXNzZXRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9yZXVzYWJsZV9hc3NldF9BMiI+Ci08L2Fzc2V0cz4KLTx3b3JrUHJvZHVjdHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2FydGlmYWN0X0EyIj4KLTwvd29ya1Byb2R1Y3RzPgotPHdvcmtQcm9kdWN0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvYXJ0aWZhY3RfQTIvYXJ0aWZhY3RfQTIuMSI+Ci08L3dvcmtQcm9kdWN0cz4KLTx3b3JrUHJvZHVjdHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2RlbGl2ZXJhYmxlX0EyIj4KLTwvd29ya1Byb2R1Y3RzPgotPHdvcmtQcm9kdWN0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvb3V0Y29tZV9BMiI+Ci08L3dvcmtQcm9kdWN0cz4KLTwvV29ya1Byb2R1Y3RUeXBlPgotPC9Db250ZW50UGFja2FnZT4KLTxDb250ZW50UGFja2FnZSBuYW1lPSJUb29scyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBnbG9iYWw9ImZhbHNlIj4KLTxwYXJlbnRQYWNrYWdlIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhdGVnb3JpZXMvVG9vbHMiPgotPC9wYXJlbnRQYWNrYWdlPgotPFRvb2wgbmFtZT0idG9vbF9BMSIgYnJpZWZEZXNjcmlwdGlvbj0iVG9vbCBBMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iVG9vbCBBMSBwcmVzZW50IiB2YXJpYWJpbGl0eVR5cGU9Im5hIj4KLTxDb250ZW50RGVzY3JpcHRpb24gbmFtZT0idG9vbF9BMSxfS3hiYWdBLVdFZHFMMk8xUEpWOWNaQSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURhdGU9IlRodSBBdWcgMTggMTc6NTI6MDcgUERUIDIwMDUiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249IlRvb2wgQTEgbWFpbiIga2V5Q29uc2lkZXJhdGlvbnM9IlRvb2wgQTEga2V5Ij4KLTwvQ29udGVudERlc2NyaXB0aW9uPgotPHN1cHBvcnRpbmdNYXRlcmlhbHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3N1cHBvcnRpbmdfbWF0ZXJpYWxfQTEiPgotPC9zdXBwb3J0aW5nTWF0ZXJpYWxzPgotPGNvbmNlcHRzQW5kUGFwZXJzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9jb25jZXB0X0ExIj4KLTwvY29uY2VwdHNBbmRQYXBlcnM+Ci08Y29uY2VwdHNBbmRQYXBlcnMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3doaXRlcGFwZXJfQTEiPgotPC9jb25jZXB0c0FuZFBhcGVycz4KLTxjaGVja2xpc3RzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9jaGVja2xpc3RfQTEiPgotPC9jaGVja2xpc3RzPgotPGd1aWRlbGluZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2d1aWRlbGluZV9BMSI+Ci08L2d1aWRlbGluZXM+Ci08ZXhhbXBsZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2V4YW1wbGVfQTEiPgotPC9leGFtcGxlcz4KLTxhc3NldHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3JldXNhYmxlX2Fzc2V0X0ExIj4KLTwvYXNzZXRzPgotPHRvb2xNZW50b3JzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS90b29sbWVudG9yX0ExIj4KLTwvdG9vbE1lbnRvcnM+Ci08L1Rvb2w+Ci08VG9vbCBuYW1lPSJ0b29sX0EyIiBicmllZkRlc2NyaXB0aW9uPSJUb29sIEEyIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJUb29sIEEyIHByZXNlbnQiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPENvbnRlbnREZXNjcmlwdGlvbiBuYW1lPSJ0b29sX0EyLF9MaGFGOEEtV0VkcUwyTzFQSlY5Y1pBIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iVGh1IEF1ZyAxOCAxNzo1MjozNCBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iVG9vbCBBMiBtYWluIiBrZXlDb25zaWRlcmF0aW9ucz0iVG9vbCBBMiBrZXkiPgotPC9Db250ZW50RGVzY3JpcHRpb24+Ci08c3VwcG9ydGluZ01hdGVyaWFscyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvc3VwcG9ydGluZ19tYXRlcmlhbF9BMiI+Ci08L3N1cHBvcnRpbmdNYXRlcmlhbHM+Ci08Y29uY2VwdHNBbmRQYXBlcnMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2NvbmNlcHRfQTIiPgotPC9jb25jZXB0c0FuZFBhcGVycz4KLTxjb25jZXB0c0FuZFBhcGVycyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvd2hpdGVwYXBlcl9BMiI+Ci08L2NvbmNlcHRzQW5kUGFwZXJzPgotPGNoZWNrbGlzdHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2NoZWNrbGlzdF9BMiI+Ci08L2NoZWNrbGlzdHM+Ci08Z3VpZGVsaW5lcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvZ3VpZGVsaW5lX0EyIj4KLTwvZ3VpZGVsaW5lcz4KLTxleGFtcGxlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvZXhhbXBsZV9BMiI+Ci08L2V4YW1wbGVzPgotPGFzc2V0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvcmV1c2FibGVfYXNzZXRfQTIiPgotPC9hc3NldHM+Ci08dG9vbE1lbnRvcnMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3Rvb2xtZW50b3JfQTIiPgotPC90b29sTWVudG9ycz4KLTwvVG9vbD4KLTwvQ29udGVudFBhY2thZ2U+Ci08Q29udGVudFBhY2thZ2UgbmFtZT0iU3RhbmRhcmRDYXRlZ29yaWVzIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGdsb2JhbD0iZmFsc2UiPgotPHBhcmVudFBhY2thZ2UgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2F0ZWdvcmllcy9TdGFuZGFyZENhdGVnb3JpZXMiPgotPC9wYXJlbnRQYWNrYWdlPgotPC9Db250ZW50UGFja2FnZT4KLTxDb250ZW50UGFja2FnZSBuYW1lPSJDdXN0b21DYXRlZ29yaWVzIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGdsb2JhbD0iZmFsc2UiPgotPHBhcmVudFBhY2thZ2UgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2F0ZWdvcmllcy9DdXN0b21DYXRlZ29yaWVzIj4KLTwvcGFyZW50UGFja2FnZT4KLTxDb250ZW50UGFja2FnZSBuYW1lPSJIaWRkZW4iIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgZ2xvYmFsPSJmYWxzZSI+Ci08cGFyZW50UGFja2FnZSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXRlZ29yaWVzL0N1c3RvbUNhdGVnb3JpZXMvSGlkZGVuIj4KLTwvcGFyZW50UGFja2FnZT4KLTxDdXN0b21DYXRlZ29yeSBuYW1lPSJDdXN0b20gQ2F0ZWdvcmllcyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSIiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPENvbnRlbnREZXNjcmlwdGlvbiBuYW1lPSJDdXN0b20gQ2F0ZWdvcmllcyxfeVVlTEt3LVBFZHFMMk8xUEpWOWNaQSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiPgotPC9Db250ZW50RGVzY3JpcHRpb24+Ci08Y2F0ZWdvcml6ZWRFbGVtZW50cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXRlZ29yaWVzL0N1c3RvbUNhdGVnb3JpZXMvY3VzdG9tX2NhdGVnb3J5X0ExIj4KLTwvY2F0ZWdvcml6ZWRFbGVtZW50cz4KLTxjYXRlZ29yaXplZEVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhdGVnb3JpZXMvQ3VzdG9tQ2F0ZWdvcmllcy9jdXN0b21fY2F0ZWdvcnlfQTIiPgotPC9jYXRlZ29yaXplZEVsZW1lbnRzPgotPC9DdXN0b21DYXRlZ29yeT4KLTwvQ29udGVudFBhY2thZ2U+Ci08Q3VzdG9tQ2F0ZWdvcnkgbmFtZT0iY3VzdG9tX2NhdGVnb3J5X0ExIiBicmllZkRlc2NyaXB0aW9uPSJDdXN0b20gQ2F0ZWdvcnkgQTEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IkN1c3RvbSBDYXRlZ29yeSBBMSBwcmVzZW50IiB2YXJpYWJpbGl0eVR5cGU9Im5hIj4KLTxDb250ZW50RGVzY3JpcHRpb24gbmFtZT0iY3VzdG9tX2NhdGVnb3J5X0ExLF9NS1Bua0EtV0VkcUwyTzFQSlY5Y1pBIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iVGh1IEF1ZyAxOCAxNzo1MzoxNSBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iQ3VzdG9tIENhdGVnb3J5IEExIG1haW4iIGtleUNvbnNpZGVyYXRpb25zPSJDdXN0b20gQ2F0ZWdvcnkgQTEga2V5Ij4KLTwvQ29udGVudERlc2NyaXB0aW9uPgotPGNhdGVnb3JpemVkRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2F0ZWdvcmllcy9DdXN0b21DYXRlZ29yaWVzL3N1Yl9jdXN0b21fY2F0ZWdvcnlfQTEuMSI+Ci08L2NhdGVnb3JpemVkRWxlbWVudHM+Ci08Y2F0ZWdvcml6ZWRFbGVtZW50cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvcm9sZV9BMSI+Ci08L2NhdGVnb3JpemVkRWxlbWVudHM+Ci08Y2F0ZWdvcml6ZWRFbGVtZW50cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvdGFza19BMSI+Ci08L2NhdGVnb3JpemVkRWxlbWVudHM+Ci08Y2F0ZWdvcml6ZWRFbGVtZW50cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvYXJ0aWZhY3RfQTEiPgotPC9jYXRlZ29yaXplZEVsZW1lbnRzPgotPGNhdGVnb3JpemVkRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2RlbGl2ZXJhYmxlX0ExIj4KLTwvY2F0ZWdvcml6ZWRFbGVtZW50cz4KLTxjYXRlZ29yaXplZEVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9vdXRjb21lX0ExIj4KLTwvY2F0ZWdvcml6ZWRFbGVtZW50cz4KLTxjYXRlZ29yaXplZEVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL0NQMSB3aXRoIGFsbCBlbGVtZW50cyI+Ci08L2NhdGVnb3JpemVkRWxlbWVudHM+Ci08Y2F0ZWdvcml6ZWRFbGVtZW50cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQ1AgQTEiPgotPC9jYXRlZ29yaXplZEVsZW1lbnRzPgotPGNhdGVnb3JpemVkRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIGV4dGVuZGluZyAmYXBvcztDUDEgd2l0aCBhbGwgZWxlbWVudHMmYXBvczsvQ1AgZXh0ZW5kaW5nICZhcG9zO0NQMSB3aXRoIGFsbCBlbGVtZW50cyZhcG9zOyI+Ci08L2NhdGVnb3JpemVkRWxlbWVudHM+Ci08Y2F0ZWdvcml6ZWRFbGVtZW50cyBwYXRoPSJQbHVnIEEvRGVsaXZlcnlQcm9jZXNzZXMvZGVsUHJvY1BhayBBMS9kZWxQcm9jUGFrX0ExLjEvZGVsUHJvY1Bha19BMS4xIj4KLTwvY2F0ZWdvcml6ZWRFbGVtZW50cz4KLTwvQ3VzdG9tQ2F0ZWdvcnk+Ci08Q3VzdG9tQ2F0ZWdvcnkgbmFtZT0iY3VzdG9tX2NhdGVnb3J5X0EyIiBicmllZkRlc2NyaXB0aW9uPSJDdXN0b20gQ2F0ZWdvcnkgQTIgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IkN1c3RvbSBDYXRlZ29yeSBBMiBwcmVzZW50IiB2YXJpYWJpbGl0eVR5cGU9Im5hIj4KLTxDb250ZW50RGVzY3JpcHRpb24gbmFtZT0iY3VzdG9tX2NhdGVnb3J5X0EyLF9PU1NTSUEtV0VkcUwyTzFQSlY5Y1pBIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iVGh1IEF1ZyAxOCAxODowMjowNyBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iQ3VzdG9tIENhdGVnb3J5IEEyIG1haW4iIGtleUNvbnNpZGVyYXRpb25zPSJDdXN0b20gQ2F0ZWdvcnkgQTIga2V5Ij4KLTwvQ29udGVudERlc2NyaXB0aW9uPgotPGNhdGVnb3JpemVkRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3JvbGVfQTIiPgotPC9jYXRlZ29yaXplZEVsZW1lbnRzPgotPGNhdGVnb3JpemVkRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3Rhc2tfQTIiPgotPC9jYXRlZ29yaXplZEVsZW1lbnRzPgotPGNhdGVnb3JpemVkRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2FydGlmYWN0X0EyIj4KLTwvY2F0ZWdvcml6ZWRFbGVtZW50cz4KLTxjYXRlZ29yaXplZEVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9hcnRpZmFjdF9BMi9hcnRpZmFjdF9BMi4xIj4KLTwvY2F0ZWdvcml6ZWRFbGVtZW50cz4KLTxjYXRlZ29yaXplZEVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9kZWxpdmVyYWJsZV9BMiI+Ci08L2NhdGVnb3JpemVkRWxlbWVudHM+Ci08Y2F0ZWdvcml6ZWRFbGVtZW50cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvb3V0Y29tZV9BMiI+Ci08L2NhdGVnb3JpemVkRWxlbWVudHM+Ci08L0N1c3RvbUNhdGVnb3J5PgotPEN1c3RvbUNhdGVnb3J5IG5hbWU9InN1Yl9jdXN0b21fY2F0ZWdvcnlfQTEuMSIgYnJpZWZEZXNjcmlwdGlvbj0iU3ViLUN1c3RvbSBDYXRlZ29yeSBBMS4xIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJTdWItQ3VzdG9tIENhdGVnb3J5IEExLjEgcHJlc2VudCIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08Q29udGVudERlc2NyaXB0aW9uIG5hbWU9InN1Yl9jdXN0b21fY2F0ZWdvcnlfQTEuMSxfN2RYWVVCQktFZHFCczdLaGRWTFJMQSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURhdGU9IlRodSBBdWcgMTggMTg6MDE6MjYgUERUIDIwMDUiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249IlN1Yi1DdXN0b20gQ2F0ZWdvcnkgQTEuMSBtYWluIiBrZXlDb25zaWRlcmF0aW9ucz0iU3ViLUN1c3RvbSBDYXRlZ29yeSBBMS4xIGtleSI+Ci08L0NvbnRlbnREZXNjcmlwdGlvbj4KLTxjYXRlZ29yaXplZEVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9yb2xlX0ExIj4KLTwvY2F0ZWdvcml6ZWRFbGVtZW50cz4KLTxjYXRlZ29yaXplZEVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9hcnRpZmFjdF9BMS9zdWJfYXJ0aWZhY3RfQTEuMSI+Ci08L2NhdGVnb3JpemVkRWxlbWVudHM+Ci08L0N1c3RvbUNhdGVnb3J5PgotPC9Db250ZW50UGFja2FnZT4KLTwvQ29udGVudFBhY2thZ2U+Ci08Q29udGVudFBhY2thZ2UgbmFtZT0iQ29yZUNvbnRlbnQiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgZ2xvYmFsPSJmYWxzZSI+Ci08cGFyZW50UGFja2FnZSBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudCI+Ci08L3BhcmVudFBhY2thZ2U+Ci08Q29udGVudFBhY2thZ2UgbmFtZT0iY29udGVudF9wYWNrYWdlX0ExIiBicmllZkRlc2NyaXB0aW9uPSJDb25QYWsgQTEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGdsb2JhbD0iZmFsc2UiPgotPHBhcmVudFBhY2thZ2UgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExIj4KLTwvcGFyZW50UGFja2FnZT4KLTxSb2xlIG5hbWU9InJvbGVfQTEiIGJyaWVmRGVzY3JpcHRpb249IlJvbGUgQTEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IlJvbGUgQTEiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPFJvbGVEZXNjcmlwdGlvbiBuYW1lPSJyb2xlX0ExLF81NXprMEEtUEVkcUwyTzFQSlY5Y1pBIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iVHVlIE9jdCAxOCAxNjowNDoxMCBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iUm9sZSBBMSBtYWluIiBrZXlDb25zaWRlcmF0aW9ucz0iUm9sZSBBMSBrZXkiIHNraWxscz0iUm9sZSBBMSBza2lsbHMiIGFzc2lnbm1lbnRBcHByb2FjaGVzPSJSb2xlIEExIGFzc2lnbiIgc3lub255bXM9IlJvbGUgQTEgc3luIj4KLTwvUm9sZURlc2NyaXB0aW9uPgotPHN1cHBvcnRpbmdNYXRlcmlhbHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3N1cHBvcnRpbmdfbWF0ZXJpYWxfQTEiPgotPC9zdXBwb3J0aW5nTWF0ZXJpYWxzPgotPGNvbmNlcHRzQW5kUGFwZXJzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9jb25jZXB0X0ExIj4KLTwvY29uY2VwdHNBbmRQYXBlcnM+Ci08Y29uY2VwdHNBbmRQYXBlcnMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3doaXRlcGFwZXJfQTEiPgotPC9jb25jZXB0c0FuZFBhcGVycz4KLTxjaGVja2xpc3RzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9jaGVja2xpc3RfQTEiPgotPC9jaGVja2xpc3RzPgotPGd1aWRlbGluZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2d1aWRlbGluZV9BMSI+Ci08L2d1aWRlbGluZXM+Ci08ZXhhbXBsZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2V4YW1wbGVfQTEiPgotPC9leGFtcGxlcz4KLTxhc3NldHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3JldXNhYmxlX2Fzc2V0X0ExIj4KLTwvYXNzZXRzPgotPG1vZGlmaWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9vdXRjb21lX0ExIj4KLTwvbW9kaWZpZXM+Ci08cmVzcG9uc2libGVGb3IgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2FydGlmYWN0X0ExIj4KLTwvcmVzcG9uc2libGVGb3I+Ci08cmVzcG9uc2libGVGb3IgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2RlbGl2ZXJhYmxlX0ExIj4KLTwvcmVzcG9uc2libGVGb3I+Ci08cmVzcG9uc2libGVGb3IgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL291dGNvbWVfQTEiPgotPC9yZXNwb25zaWJsZUZvcj4KLTwvUm9sZT4KLTxSb2xlIG5hbWU9InJvbGVfQTIiIGJyaWVmRGVzY3JpcHRpb249IlJvbGUgQTIgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IlJvbGUgQTIgZXh0ZW5kZWQgYnkgUm9sZSBBMyIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08Um9sZURlc2NyaXB0aW9uIG5hbWU9InJvbGVfQTIsXzZrM1VBQS1QRWRxTDJPMVBKVjljWkEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJXZWQgT2N0IDE5IDEwOjMyOjM1IFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSJSb2xlIEEyIG1haW4iIGtleUNvbnNpZGVyYXRpb25zPSJSb2xlIEEyIGtleSIgc2tpbGxzPSJSb2xlIEEyIHNraWxscyIgYXNzaWdubWVudEFwcHJvYWNoZXM9IlJvbGUgQTIgYXNzaWduIiBzeW5vbnltcz0iUm9sZSBBMiBzeW4iPgotPC9Sb2xlRGVzY3JpcHRpb24+Ci08c3VwcG9ydGluZ01hdGVyaWFscyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvc3VwcG9ydGluZ19tYXRlcmlhbF9BMiI+Ci08L3N1cHBvcnRpbmdNYXRlcmlhbHM+Ci08Y29uY2VwdHNBbmRQYXBlcnMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2NvbmNlcHRfQTIiPgotPC9jb25jZXB0c0FuZFBhcGVycz4KLTxjb25jZXB0c0FuZFBhcGVycyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvd2hpdGVwYXBlcl9BMiI+Ci08L2NvbmNlcHRzQW5kUGFwZXJzPgotPGNoZWNrbGlzdHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2NoZWNrbGlzdF9BMiI+Ci08L2NoZWNrbGlzdHM+Ci08Z3VpZGVsaW5lcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvZ3VpZGVsaW5lX0EyIj4KLTwvZ3VpZGVsaW5lcz4KLTxleGFtcGxlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvZXhhbXBsZV9BMiI+Ci08L2V4YW1wbGVzPgotPGFzc2V0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvcmV1c2FibGVfYXNzZXRfQTIiPgotPC9hc3NldHM+Ci08bW9kaWZpZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL291dGNvbWVfQTIiPgotPC9tb2RpZmllcz4KLTxyZXNwb25zaWJsZUZvciBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvYXJ0aWZhY3RfQTIiPgotPC9yZXNwb25zaWJsZUZvcj4KLTxyZXNwb25zaWJsZUZvciBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvZGVsaXZlcmFibGVfQTIiPgotPC9yZXNwb25zaWJsZUZvcj4KLTxyZXNwb25zaWJsZUZvciBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvb3V0Y29tZV9BMiI+Ci08L3Jlc3BvbnNpYmxlRm9yPgotPC9Sb2xlPgotPFRhc2sgbmFtZT0idGFza19BMSIgYnJpZWZEZXNjcmlwdGlvbj0iVGFzayBBMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iVGFzayBBMSAiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPFRhc2tEZXNjcmlwdGlvbiBuYW1lPSJ0YXNrX0ExLF83TThuc0EtUEVkcUwyTzFQSlY5Y1pBIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iV2VkIE9jdCAxOSAxMDoyODozOSBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iVGFzayBBMSBtYWluIiBrZXlDb25zaWRlcmF0aW9ucz0iVGFzayBBMSBrZXkiIHB1cnBvc2U9IlRhc2sgQTEgcHVycG9zZSIgYWx0ZXJuYXRpdmVzPSJUYXNrIEExIGFsdCI+Ci08U2VjdGlvbiBuYW1lPSJTdGVwIEExLjEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgdmFyaWFiaWxpdHlUeXBlPSJuYSIgc2VjdGlvbk5hbWU9IiIgc2VjdGlvbkRlc2NyaXB0aW9uPSJhbHBoYSI+Ci08L1NlY3Rpb24+Ci08U2VjdGlvbiBuYW1lPSJTdGVwIEExLjIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgdmFyaWFiaWxpdHlUeXBlPSJuYSIgc2VjdGlvbk5hbWU9IiIgc2VjdGlvbkRlc2NyaXB0aW9uPSJiZXRhIj4KLTwvU2VjdGlvbj4KLTxTZWN0aW9uIG5hbWU9IlN0ZXAgQTEuMyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiB2YXJpYWJpbGl0eVR5cGU9Im5hIiBzZWN0aW9uTmFtZT0iIiBzZWN0aW9uRGVzY3JpcHRpb249ImdhbW1hIj4KLTwvU2VjdGlvbj4KLTwvVGFza0Rlc2NyaXB0aW9uPgotPHN1cHBvcnRpbmdNYXRlcmlhbHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3N1cHBvcnRpbmdfbWF0ZXJpYWxfQTEiPgotPC9zdXBwb3J0aW5nTWF0ZXJpYWxzPgotPGNvbmNlcHRzQW5kUGFwZXJzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9jb25jZXB0X0ExIj4KLTwvY29uY2VwdHNBbmRQYXBlcnM+Ci08Y29uY2VwdHNBbmRQYXBlcnMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3doaXRlcGFwZXJfQTEiPgotPC9jb25jZXB0c0FuZFBhcGVycz4KLTxjaGVja2xpc3RzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9jaGVja2xpc3RfQTEiPgotPC9jaGVja2xpc3RzPgotPGd1aWRlbGluZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2d1aWRlbGluZV9BMSI+Ci08L2d1aWRlbGluZXM+Ci08ZXhhbXBsZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2V4YW1wbGVfQTEiPgotPC9leGFtcGxlcz4KLTxhc3NldHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3JldXNhYmxlX2Fzc2V0X0ExIj4KLTwvYXNzZXRzPgotPHBlcmZvcm1lZEJ5IHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS90YXNrX0ExIj4KLTwvcGVyZm9ybWVkQnk+Ci08bWFuZGF0b3J5SW5wdXQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2FydGlmYWN0X0ExL3N1Yl9hcnRpZmFjdF9BMS4xIj4KLTwvbWFuZGF0b3J5SW5wdXQ+Ci08bWFuZGF0b3J5SW5wdXQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2FydGlmYWN0X0ExIj4KLTwvbWFuZGF0b3J5SW5wdXQ+Ci08b3V0cHV0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9vdXRjb21lX0ExIj4KLTwvb3V0cHV0PgotPGFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5IHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9yb2xlX0EyIj4KLTwvYWRkaXRpb25hbGx5UGVyZm9ybWVkQnk+Ci08b3B0aW9uYWxJbnB1dCBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvZGVsaXZlcmFibGVfQTEiPgotPC9vcHRpb25hbElucHV0PgotPHN0ZXBzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS90YXNrX0ExL3Rhc2tfQTEsXzdNOG5zQS1QRWRxTDJPMVBKVjljWkEvU3RlcCBBMS4xIj4KLTwvc3RlcHM+Ci08c3RlcHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3Rhc2tfQTEvdGFza19BMSxfN004bnNBLVBFZHFMMk8xUEpWOWNaQS9TdGVwIEExLjIiPgotPC9zdGVwcz4KLTxzdGVwcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvdGFza19BMS90YXNrX0ExLF83TThuc0EtUEVkcUwyTzFQSlY5Y1pBL1N0ZXAgQTEuMyI+Ci08L3N0ZXBzPgotPHRvb2xNZW50b3JzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS90b29sbWVudG9yX0ExIj4KLTwvdG9vbE1lbnRvcnM+Ci08L1Rhc2s+Ci08VGFzayBuYW1lPSJ0YXNrX0EyIiBicmllZkRlc2NyaXB0aW9uPSJUYXNrIEEyIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJUYXNrIEEyICggZXh0ZW5kZWQgYnkgVGFzayBBMyApIiB2YXJpYWJpbGl0eVR5cGU9Im5hIj4KLTxUYXNrRGVzY3JpcHRpb24gbmFtZT0idGFza19BMixfNzVOUXdBLVBFZHFMMk8xUEpWOWNaQSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURhdGU9IldlZCBPY3QgMTkgMTA6Mjk6MjIgUERUIDIwMDUiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249IlRhc2sgQTIgbWFpbiIga2V5Q29uc2lkZXJhdGlvbnM9IlRhc2sgQTIga2V5IiBwdXJwb3NlPSJUYXNrIEEyIHB1cnBvc2UiIGFsdGVybmF0aXZlcz0iVGFzayBBMiBhbHQiPgotPFNlY3Rpb24gbmFtZT0iU3RlcCBBMi4xIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHZhcmlhYmlsaXR5VHlwZT0ibmEiIHNlY3Rpb25OYW1lPSIiIHNlY3Rpb25EZXNjcmlwdGlvbj0iJmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICBwdXQgeW91ciByaWdodCBmb290IGluJiMxMzsmIzEwOyZsdDsvcCZndDsiPgotPC9TZWN0aW9uPgotPFNlY3Rpb24gbmFtZT0iU3RlcCBBMi4yIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHZhcmlhYmlsaXR5VHlwZT0ibmEiIHNlY3Rpb25OYW1lPSIiIHNlY3Rpb25EZXNjcmlwdGlvbj0icHV0IHlvdXIgcmlnaHQgZm9vdCBvdXQiPgotPC9TZWN0aW9uPgotPFNlY3Rpb24gbmFtZT0iU3RlcCBBMi4zIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHZhcmlhYmlsaXR5VHlwZT0ibmEiIHNlY3Rpb25OYW1lPSIiIHNlY3Rpb25EZXNjcmlwdGlvbj0iRG8gdGhlIGhva2V5LXBva2V5Ij4KLTwvU2VjdGlvbj4KLTwvVGFza0Rlc2NyaXB0aW9uPgotPHN1cHBvcnRpbmdNYXRlcmlhbHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3N1cHBvcnRpbmdfbWF0ZXJpYWxfQTIiPgotPC9zdXBwb3J0aW5nTWF0ZXJpYWxzPgotPGNvbmNlcHRzQW5kUGFwZXJzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9jb25jZXB0X0EyIj4KLTwvY29uY2VwdHNBbmRQYXBlcnM+Ci08Y29uY2VwdHNBbmRQYXBlcnMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3doaXRlcGFwZXJfQTIiPgotPC9jb25jZXB0c0FuZFBhcGVycz4KLTxjaGVja2xpc3RzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9jaGVja2xpc3RfQTIiPgotPC9jaGVja2xpc3RzPgotPGd1aWRlbGluZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2d1aWRlbGluZV9BMiI+Ci08L2d1aWRlbGluZXM+Ci08ZXhhbXBsZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2V4YW1wbGVfQTIiPgotPC9leGFtcGxlcz4KLTxhc3NldHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3JldXNhYmxlX2Fzc2V0X0EyIj4KLTwvYXNzZXRzPgotPHBlcmZvcm1lZEJ5IHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS90YXNrX0EyIj4KLTwvcGVyZm9ybWVkQnk+Ci08bWFuZGF0b3J5SW5wdXQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2FydGlmYWN0X0EyIj4KLTwvbWFuZGF0b3J5SW5wdXQ+Ci08b3V0cHV0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9vdXRjb21lX0EyIj4KLTwvb3V0cHV0PgotPGFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5IHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9yb2xlX0ExIj4KLTwvYWRkaXRpb25hbGx5UGVyZm9ybWVkQnk+Ci08b3B0aW9uYWxJbnB1dCBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvZGVsaXZlcmFibGVfQTIiPgotPC9vcHRpb25hbElucHV0PgotPHN0ZXBzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS90YXNrX0EyL3Rhc2tfQTIsXzc1TlF3QS1QRWRxTDJPMVBKVjljWkEvU3RlcCBBMi4xIj4KLTwvc3RlcHM+Ci08c3RlcHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3Rhc2tfQTIvdGFza19BMixfNzVOUXdBLVBFZHFMMk8xUEpWOWNaQS9TdGVwIEEyLjIiPgotPC9zdGVwcz4KLTxzdGVwcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvdGFza19BMi90YXNrX0EyLF83NU5Rd0EtUEVkcUwyTzFQSlY5Y1pBL1N0ZXAgQTIuMyI+Ci08L3N0ZXBzPgotPHRvb2xNZW50b3JzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS90b29sbWVudG9yX0EyIj4KLTwvdG9vbE1lbnRvcnM+Ci08L1Rhc2s+Ci08QXJ0aWZhY3QgbmFtZT0iYXJ0aWZhY3RfQTEiIGJyaWVmRGVzY3JpcHRpb249IkFydGlmYWN0IEExIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJBcnRpZmFjdCBBMSBwcmVzZW50IiB2YXJpYWJpbGl0eVR5cGU9Im5hIj4KLTxBcnRpZmFjdERlc2NyaXB0aW9uIG5hbWU9ImFydGlmYWN0X0ExIHgsXzlLdDc4QS1QRWRxTDJPMVBKVjljWkEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJXZWQgU2VwIDA3IDE0OjUyOjQ0IFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSJBcnRpZmFjdCBBMSBtYWluIiBrZXlDb25zaWRlcmF0aW9ucz0iQXJ0aWZhY3QgQTEga2V5IiBleHRlcm5hbElkPSJBcnRpZmFjdCBBMSB1bmlxdWUiIHB1cnBvc2U9IkFydGlmYWN0IEExIHB1cnBvc2UiIGltcGFjdE9mTm90SGF2aW5nPSJBcnRpZmFjdCBBMSBpbXBhY3QiIHJlYXNvbnNGb3JOb3ROZWVkaW5nPSJBcnRpZmFjdCBBMSByZWFzb24iIGJyaWVmT3V0bGluZT0iQXJ0aWZhY3QgQTEgYnJpZWYiIHJlcHJlc2VudGF0aW9uT3B0aW9ucz0iQXJ0aWZhY3QgQTEgcmVwIj4KLTwvQXJ0aWZhY3REZXNjcmlwdGlvbj4KLTxzdXBwb3J0aW5nTWF0ZXJpYWxzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9zdXBwb3J0aW5nX21hdGVyaWFsX0ExIj4KLTwvc3VwcG9ydGluZ01hdGVyaWFscz4KLTxjb25jZXB0c0FuZFBhcGVycyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvY29uY2VwdF9BMSI+Ci08L2NvbmNlcHRzQW5kUGFwZXJzPgotPGNvbmNlcHRzQW5kUGFwZXJzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS93aGl0ZXBhcGVyX0ExIj4KLTwvY29uY2VwdHNBbmRQYXBlcnM+Ci08Y2hlY2tsaXN0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvY2hlY2tsaXN0X0ExIj4KLTwvY2hlY2tsaXN0cz4KLTxndWlkZWxpbmVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9ndWlkZWxpbmVfQTEiPgotPC9ndWlkZWxpbmVzPgotPGV4YW1wbGVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9leGFtcGxlX0ExIj4KLTwvZXhhbXBsZXM+Ci08YXNzZXRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9yZXVzYWJsZV9hc3NldF9BMSI+Ci08L2Fzc2V0cz4KLTxyZXBvcnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9yZXBvcnRfQTEiPgotPC9yZXBvcnRzPgotPHRlbXBsYXRlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvdGVtcGxhdGVfQTEiPgotPC90ZW1wbGF0ZXM+Ci08dG9vbE1lbnRvcnMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3Rvb2xtZW50b3JfQTEiPgotPC90b29sTWVudG9ycz4KLTxBcnRpZmFjdCBuYW1lPSJzdWJfYXJ0aWZhY3RfQTEuMSIgYnJpZWZEZXNjcmlwdGlvbj0iU3ViX0FydGlmYWN0IEExLjEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IlN1Yl9BcnRpZmFjdCBBMS4xIHByZXNlbnQiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPEFydGlmYWN0RGVzY3JpcHRpb24gbmFtZT0ic3ViX2FydGlmYWN0X0ExLjEsX0Y1MXl3QS1SRWRxTDJPMVBKVjljWkEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJUaHUgQXVnIDE4IDE4OjA0OjE5IFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSJTdWJfQXJ0aWZhY3QgQTEuMSBtYWluIiBrZXlDb25zaWRlcmF0aW9ucz0iU3ViX0FydGlmYWN0IEExLjEga2V5IiBleHRlcm5hbElkPSJTdWJfQXJ0aWZhY3QgQTEuMSB1bmlxdWUiIHB1cnBvc2U9IlN1Yl9BcnRpZmFjdCBBMS4xIHB1cnBvc2UiIGltcGFjdE9mTm90SGF2aW5nPSJBcnRpZmFjdCBBMS4xIGltcGFjdCIgcmVhc29uc0Zvck5vdE5lZWRpbmc9IkFydGlmYWN0IEExLjEgcmVhc29uIiBicmllZk91dGxpbmU9IlN1Yl9BcnRpZmFjdCBBMS4xIGJyaWVmIiByZXByZXNlbnRhdGlvbk9wdGlvbnM9IlN1Yl9BcnRpZmFjdCBBMS4xIHJlcCI+Ci08L0FydGlmYWN0RGVzY3JpcHRpb24+Ci08c3VwcG9ydGluZ01hdGVyaWFscyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvc3VwcG9ydGluZ19tYXRlcmlhbF9BMSI+Ci08L3N1cHBvcnRpbmdNYXRlcmlhbHM+Ci08Y29uY2VwdHNBbmRQYXBlcnMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2NvbmNlcHRfQTEiPgotPC9jb25jZXB0c0FuZFBhcGVycz4KLTxjb25jZXB0c0FuZFBhcGVycyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvd2hpdGVwYXBlcl9BMSI+Ci08L2NvbmNlcHRzQW5kUGFwZXJzPgotPGNoZWNrbGlzdHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2NoZWNrbGlzdF9BMSI+Ci08L2NoZWNrbGlzdHM+Ci08Z3VpZGVsaW5lcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvZ3VpZGVsaW5lX0ExIj4KLTwvZ3VpZGVsaW5lcz4KLTxleGFtcGxlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvZXhhbXBsZV9BMSI+Ci08L2V4YW1wbGVzPgotPGFzc2V0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvcmV1c2FibGVfYXNzZXRfQTEiPgotPC9hc3NldHM+Ci08cmVwb3J0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvcmVwb3J0X0ExIj4KLTwvcmVwb3J0cz4KLTx0ZW1wbGF0ZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3RlbXBsYXRlX0ExIj4KLTwvdGVtcGxhdGVzPgotPHRvb2xNZW50b3JzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS90b29sbWVudG9yX0ExIj4KLTwvdG9vbE1lbnRvcnM+Ci08Y29udGFpbmVyQXJ0aWZhY3QgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2FydGlmYWN0X0ExL3N1Yl9hcnRpZmFjdF9BMS4xIj4KLTwvY29udGFpbmVyQXJ0aWZhY3Q+Ci08L0FydGlmYWN0PgotPC9BcnRpZmFjdD4KLTxBcnRpZmFjdCBuYW1lPSJhcnRpZmFjdF9BMiIgYnJpZWZEZXNjcmlwdGlvbj0iQXJ0aWZhY3QgQTIgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IkFydGlmYWN0IEEyIHByZXNlbnQiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPEFydGlmYWN0RGVzY3JpcHRpb24gbmFtZT0iYXJ0aWZhY3RfQTIsX0U3WjBrQS1SRWRxTDJPMVBKVjljWkEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJXZWQgQXVnIDE3IDE5OjQxOjI0IFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSJBcnRpZmFjdCBBMiBtYWluIiBrZXlDb25zaWRlcmF0aW9ucz0iQXJ0aWZhY3QgQTIga2V5IiBleHRlcm5hbElkPSJBcnRpZmFjdCBBMiB1bmlxdWUiIHB1cnBvc2U9IkFydGlmYWN0IEEyIHB1cnBvc2UiIGltcGFjdE9mTm90SGF2aW5nPSJBcnRpZmFjdCBBMiBpbXBhY3QiIHJlYXNvbnNGb3JOb3ROZWVkaW5nPSJBcnRpZmFjdCBBMiByZWFzb24iIGJyaWVmT3V0bGluZT0iQXJ0aWZhY3QgQTIgYnJpZWYiIHJlcHJlc2VudGF0aW9uT3B0aW9ucz0iQXJ0aWZhY3QgQTIgcmVwIj4KLTwvQXJ0aWZhY3REZXNjcmlwdGlvbj4KLTxzdXBwb3J0aW5nTWF0ZXJpYWxzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9zdXBwb3J0aW5nX21hdGVyaWFsX0EyIj4KLTwvc3VwcG9ydGluZ01hdGVyaWFscz4KLTxjb25jZXB0c0FuZFBhcGVycyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvY29uY2VwdF9BMiI+Ci08L2NvbmNlcHRzQW5kUGFwZXJzPgotPGNvbmNlcHRzQW5kUGFwZXJzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS93aGl0ZXBhcGVyX0EyIj4KLTwvY29uY2VwdHNBbmRQYXBlcnM+Ci08Y2hlY2tsaXN0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvY2hlY2tsaXN0X0EyIj4KLTwvY2hlY2tsaXN0cz4KLTxndWlkZWxpbmVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9ndWlkZWxpbmVfQTIiPgotPC9ndWlkZWxpbmVzPgotPGV4YW1wbGVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9leGFtcGxlX0EyIj4KLTwvZXhhbXBsZXM+Ci08YXNzZXRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9yZXVzYWJsZV9hc3NldF9BMiI+Ci08L2Fzc2V0cz4KLTxyZXBvcnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9yZXBvcnRfQTIiPgotPC9yZXBvcnRzPgotPHRlbXBsYXRlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvdGVtcGxhdGVfQTIiPgotPC90ZW1wbGF0ZXM+Ci08dG9vbE1lbnRvcnMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3Rvb2xtZW50b3JfQTIiPgotPC90b29sTWVudG9ycz4KLTxBcnRpZmFjdCBuYW1lPSJhcnRpZmFjdF9BMi4xIiBicmllZkRlc2NyaXB0aW9uPSJBcnRpZmFjdCBBMi4xIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJBcnRpZmFjdCBBMi4xIHByZXNlbnQiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPEFydGlmYWN0RGVzY3JpcHRpb24gbmFtZT0iYXJ0aWZhY3RfQTIuMSxfSEVNdEVBLVJFZHFMMk8xUEpWOWNaQSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURhdGU9IldlZCBBdWcgMTcgMTk6NDQ6MDcgUERUIDIwMDUiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249IkFydGlmYWN0IEEyLjEgbWFpbiIga2V5Q29uc2lkZXJhdGlvbnM9IkFydGlmYWN0IEEyLjEga2V5IiBleHRlcm5hbElkPSJBcnRpZmFjdCBBMi4xIHVuaXF1ZSIgcHVycG9zZT0iQXJ0aWZhY3QgQTIuMSBwdXJwb3NlIiBpbXBhY3RPZk5vdEhhdmluZz0iQXJ0aWZhY3QgQTIuMSBpbXBhY3QiIHJlYXNvbnNGb3JOb3ROZWVkaW5nPSJBcnRpZmFjdCBBMi4xIHJlYXNvbiIgYnJpZWZPdXRsaW5lPSJBcnRpZmFjdCBBMi4xIGJyaWVmIiByZXByZXNlbnRhdGlvbk9wdGlvbnM9IkFydGlmYWN0IEEyLjEgcmVwIj4KLTwvQXJ0aWZhY3REZXNjcmlwdGlvbj4KLTxzdXBwb3J0aW5nTWF0ZXJpYWxzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9zdXBwb3J0aW5nX21hdGVyaWFsX0EyIj4KLTwvc3VwcG9ydGluZ01hdGVyaWFscz4KLTxjb25jZXB0c0FuZFBhcGVycyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvY29uY2VwdF9BMiI+Ci08L2NvbmNlcHRzQW5kUGFwZXJzPgotPGNvbmNlcHRzQW5kUGFwZXJzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS93aGl0ZXBhcGVyX0EyIj4KLTwvY29uY2VwdHNBbmRQYXBlcnM+Ci08Y2hlY2tsaXN0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvY2hlY2tsaXN0X0EyIj4KLTwvY2hlY2tsaXN0cz4KLTxndWlkZWxpbmVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9ndWlkZWxpbmVfQTIiPgotPC9ndWlkZWxpbmVzPgotPGV4YW1wbGVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9leGFtcGxlX0EyIj4KLTwvZXhhbXBsZXM+Ci08YXNzZXRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9yZXVzYWJsZV9hc3NldF9BMiI+Ci08L2Fzc2V0cz4KLTxyZXBvcnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9yZXBvcnRfQTIiPgotPC9yZXBvcnRzPgotPHRlbXBsYXRlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvdGVtcGxhdGVfQTIiPgotPC90ZW1wbGF0ZXM+Ci08dG9vbE1lbnRvcnMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3Rvb2xtZW50b3JfQTIiPgotPC90b29sTWVudG9ycz4KLTxjb250YWluZXJBcnRpZmFjdCBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvYXJ0aWZhY3RfQTIvYXJ0aWZhY3RfQTIuMSI+Ci08L2NvbnRhaW5lckFydGlmYWN0PgotPC9BcnRpZmFjdD4KLTwvQXJ0aWZhY3Q+Ci08RGVsaXZlcmFibGUgbmFtZT0iZGVsaXZlcmFibGVfQTEiIGJyaWVmRGVzY3JpcHRpb249IkRlbGl2ZXJhYmxlIEExIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJEZWxpdmVyYWJsZSBBMSBwcmVzZW50IiB2YXJpYWJpbGl0eVR5cGU9Im5hIj4KLTxEZWxpdmVyYWJsZURlc2NyaXB0aW9uIG5hbWU9ImRlbGl2ZXJhYmxlX0ExLF9JSVNuVUEtUkVkcUwyTzFQSlY5Y1pBIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iVGh1IEF1ZyAxOCAxNDoyOTo1OSBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iRGVsaXZlcmFibGUgQTEgbWFpbiIga2V5Q29uc2lkZXJhdGlvbnM9IkRlbGl2ZXJhYmxlIEExIGtleSIgZXh0ZXJuYWxJZD0iRGVsaXZlcmFibGUgQTEgdW5pcXVlIiBwdXJwb3NlPSJEZWxpdmVyYWJsZSBBMSBwb3Jwb2lzZSIgaW1wYWN0T2ZOb3RIYXZpbmc9IkRlbGl2ZXJhYmxlIEExIGltcGFjdCIgcmVhc29uc0Zvck5vdE5lZWRpbmc9IkRlbGl2ZXJhYmxlIEExIHJlYXNvbiIgZXh0ZXJuYWxEZXNjcmlwdGlvbj0iRGVsaXZlcmFibGUgQTEgZXh0ZXJuIiBwYWNrYWdpbmdHdWlkYW5jZT0iRGVsaXZlcmFibGUgQTEgcGtnIj4KLTwvRGVsaXZlcmFibGVEZXNjcmlwdGlvbj4KLTxzdXBwb3J0aW5nTWF0ZXJpYWxzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9zdXBwb3J0aW5nX21hdGVyaWFsX0ExIj4KLTwvc3VwcG9ydGluZ01hdGVyaWFscz4KLTxjb25jZXB0c0FuZFBhcGVycyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvY29uY2VwdF9BMSI+Ci08L2NvbmNlcHRzQW5kUGFwZXJzPgotPGNvbmNlcHRzQW5kUGFwZXJzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS93aGl0ZXBhcGVyX0ExIj4KLTwvY29uY2VwdHNBbmRQYXBlcnM+Ci08Y2hlY2tsaXN0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvY2hlY2tsaXN0X0ExIj4KLTwvY2hlY2tsaXN0cz4KLTxndWlkZWxpbmVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9ndWlkZWxpbmVfQTEiPgotPC9ndWlkZWxpbmVzPgotPGV4YW1wbGVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9leGFtcGxlX0ExIj4KLTwvZXhhbXBsZXM+Ci08YXNzZXRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9yZXVzYWJsZV9hc3NldF9BMSI+Ci08L2Fzc2V0cz4KLTxyZXBvcnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9yZXBvcnRfQTEiPgotPC9yZXBvcnRzPgotPHRlbXBsYXRlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvdGVtcGxhdGVfQTEiPgotPC90ZW1wbGF0ZXM+Ci08dG9vbE1lbnRvcnMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3Rvb2xtZW50b3JfQTEiPgotPC90b29sTWVudG9ycz4KLTxkZWxpdmVyZWRXb3JrUHJvZHVjdHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2FydGlmYWN0X0ExIj4KLTwvZGVsaXZlcmVkV29ya1Byb2R1Y3RzPgotPGRlbGl2ZXJlZFdvcmtQcm9kdWN0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvYXJ0aWZhY3RfQTEvc3ViX2FydGlmYWN0X0ExLjEiPgotPC9kZWxpdmVyZWRXb3JrUHJvZHVjdHM+Ci08ZGVsaXZlcmVkV29ya1Byb2R1Y3RzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9vdXRjb21lX0ExIj4KLTwvZGVsaXZlcmVkV29ya1Byb2R1Y3RzPgotPC9EZWxpdmVyYWJsZT4KLTxEZWxpdmVyYWJsZSBuYW1lPSJkZWxpdmVyYWJsZV9BMiIgYnJpZWZEZXNjcmlwdGlvbj0iRGVsaXZlcmFibGUgQTIgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IkRlbGl2ZXJhYmxlIEEyIHByZXNlbnQiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPERlbGl2ZXJhYmxlRGVzY3JpcHRpb24gbmFtZT0iZGVsaXZlcmFibGVfQTIsX0pCcWZVQS1SRWRxTDJPMVBKVjljWkEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJUaHUgQXVnIDE4IDE0OjMwOjE1IFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSJEZWxpdmVyYWJsZSBBMiBtYWluIiBrZXlDb25zaWRlcmF0aW9ucz0iRGVsaXZlcmFibGUgQTIga2V5IiBleHRlcm5hbElkPSJEZWxpdmVyYWJsZSBBMiB1bmlxdWUiIHB1cnBvc2U9IkRlbGl2ZXJhYmxlIEEyIHBvcnBvaXNlIiBpbXBhY3RPZk5vdEhhdmluZz0iRGVsaXZlcmFibGUgQTImYW1wO25ic3A7aW1wYWN0IiByZWFzb25zRm9yTm90TmVlZGluZz0iRGVsaXZlcmFibGUgQTIgcmVhc29uIiBleHRlcm5hbERlc2NyaXB0aW9uPSJEZWxpdmVyYWJsZSBBMiBleHRlcm4iIHBhY2thZ2luZ0d1aWRhbmNlPSJEZWxpdmVyYWJsZSBBMiBwa2ciPgotPC9EZWxpdmVyYWJsZURlc2NyaXB0aW9uPgotPHN1cHBvcnRpbmdNYXRlcmlhbHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3N1cHBvcnRpbmdfbWF0ZXJpYWxfQTIiPgotPC9zdXBwb3J0aW5nTWF0ZXJpYWxzPgotPGNvbmNlcHRzQW5kUGFwZXJzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9jb25jZXB0X0EyIj4KLTwvY29uY2VwdHNBbmRQYXBlcnM+Ci08Y29uY2VwdHNBbmRQYXBlcnMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3doaXRlcGFwZXJfQTIiPgotPC9jb25jZXB0c0FuZFBhcGVycz4KLTxjaGVja2xpc3RzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9jaGVja2xpc3RfQTIiPgotPC9jaGVja2xpc3RzPgotPGd1aWRlbGluZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2d1aWRlbGluZV9BMiI+Ci08L2d1aWRlbGluZXM+Ci08ZXhhbXBsZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2V4YW1wbGVfQTIiPgotPC9leGFtcGxlcz4KLTxhc3NldHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3JldXNhYmxlX2Fzc2V0X0EyIj4KLTwvYXNzZXRzPgotPHJlcG9ydHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3JlcG9ydF9BMiI+Ci08L3JlcG9ydHM+Ci08dGVtcGxhdGVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS90ZW1wbGF0ZV9BMiI+Ci08L3RlbXBsYXRlcz4KLTx0b29sTWVudG9ycyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvdG9vbG1lbnRvcl9BMiI+Ci08L3Rvb2xNZW50b3JzPgotPGRlbGl2ZXJlZFdvcmtQcm9kdWN0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvYXJ0aWZhY3RfQTIiPgotPC9kZWxpdmVyZWRXb3JrUHJvZHVjdHM+Ci08ZGVsaXZlcmVkV29ya1Byb2R1Y3RzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9vdXRjb21lX0EyIj4KLTwvZGVsaXZlcmVkV29ya1Byb2R1Y3RzPgotPC9EZWxpdmVyYWJsZT4KLTxPdXRjb21lIG5hbWU9Im91dGNvbWVfQTEiIGJyaWVmRGVzY3JpcHRpb249Ik91dGNvbWUgQTEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9Ik91dGNvbWUgQTEgcHJlc2VudCIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08V29ya1Byb2R1Y3REZXNjcmlwdGlvbiBuYW1lPSJvdXRjb21lX0ExLF9LQV8xWUEtUkVkcUwyTzFQSlY5Y1pBIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iVGh1IEF1ZyAxOCAxNDozMDoxOCBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiBPdXRjb21lIEExICIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iT3V0Y29tZSBBMSBtYWluIiBrZXlDb25zaWRlcmF0aW9ucz0iT3V0Y29tZSBBMSBrZXkiIGV4dGVybmFsSWQ9Ik91dGNvbWUgQTEgdW5pcXVlIiBwdXJwb3NlPSJPdXRjb21lIEExIHBvcnBvaXNlIiBpbXBhY3RPZk5vdEhhdmluZz0iT3V0Y29tZSBBMSBpbXBhY3QiIHJlYXNvbnNGb3JOb3ROZWVkaW5nPSJPdXRjb21lIEExIHJlYXNvbiI+Ci08L1dvcmtQcm9kdWN0RGVzY3JpcHRpb24+Ci08c3VwcG9ydGluZ01hdGVyaWFscyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvc3VwcG9ydGluZ19tYXRlcmlhbF9BMSI+Ci08L3N1cHBvcnRpbmdNYXRlcmlhbHM+Ci08Y29uY2VwdHNBbmRQYXBlcnMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2NvbmNlcHRfQTEiPgotPC9jb25jZXB0c0FuZFBhcGVycz4KLTxjb25jZXB0c0FuZFBhcGVycyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvd2hpdGVwYXBlcl9BMSI+Ci08L2NvbmNlcHRzQW5kUGFwZXJzPgotPGNoZWNrbGlzdHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2NoZWNrbGlzdF9BMSI+Ci08L2NoZWNrbGlzdHM+Ci08Z3VpZGVsaW5lcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvZ3VpZGVsaW5lX0ExIj4KLTwvZ3VpZGVsaW5lcz4KLTxleGFtcGxlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvZXhhbXBsZV9BMSI+Ci08L2V4YW1wbGVzPgotPGFzc2V0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvcmV1c2FibGVfYXNzZXRfQTEiPgotPC9hc3NldHM+Ci08cmVwb3J0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvcmVwb3J0X0ExIj4KLTwvcmVwb3J0cz4KLTx0ZW1wbGF0ZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3RlbXBsYXRlX0ExIj4KLTwvdGVtcGxhdGVzPgotPHRvb2xNZW50b3JzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS90b29sbWVudG9yX0ExIj4KLTwvdG9vbE1lbnRvcnM+Ci08L091dGNvbWU+Ci08T3V0Y29tZSBuYW1lPSJvdXRjb21lX0EyIiBicmllZkRlc2NyaXB0aW9uPSJPdXRjb21lIEExIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJPdXRjb21lIEEyIHByZXNlbnQiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPFdvcmtQcm9kdWN0RGVzY3JpcHRpb24gbmFtZT0ib3V0Y29tZV9BMixfS3ZMeEVBLVJFZHFMMk8xUEpWOWNaQSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURhdGU9IlRodSBBdWcgMTggMTQ6MzA6MjEgUERUIDIwMDUiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249Ik91dGNvbWUgQTEgbWFpbiIga2V5Q29uc2lkZXJhdGlvbnM9Ik91dGNvbWUgQTEga2V5IiBleHRlcm5hbElkPSJPdXRjb21lIEExIHVuaXF1ZSIgcHVycG9zZT0iT3V0Y29tZSBBMSBwb3Jwb2lzZSIgaW1wYWN0T2ZOb3RIYXZpbmc9Ik91dGNvbWUgQTEgaW1wYWN0IiByZWFzb25zRm9yTm90TmVlZGluZz0iT3V0Y29tZSBBMSByZWFzb24iPgotPC9Xb3JrUHJvZHVjdERlc2NyaXB0aW9uPgotPHN1cHBvcnRpbmdNYXRlcmlhbHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3N1cHBvcnRpbmdfbWF0ZXJpYWxfQTIiPgotPC9zdXBwb3J0aW5nTWF0ZXJpYWxzPgotPGNvbmNlcHRzQW5kUGFwZXJzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9jb25jZXB0X0EyIj4KLTwvY29uY2VwdHNBbmRQYXBlcnM+Ci08Y29uY2VwdHNBbmRQYXBlcnMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3doaXRlcGFwZXJfQTIiPgotPC9jb25jZXB0c0FuZFBhcGVycz4KLTxjaGVja2xpc3RzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9jaGVja2xpc3RfQTIiPgotPC9jaGVja2xpc3RzPgotPGd1aWRlbGluZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2d1aWRlbGluZV9BMiI+Ci08L2d1aWRlbGluZXM+Ci08ZXhhbXBsZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2V4YW1wbGVfQTIiPgotPC9leGFtcGxlcz4KLTxhc3NldHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3JldXNhYmxlX2Fzc2V0X0EyIj4KLTwvYXNzZXRzPgotPHJlcG9ydHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3JlcG9ydF9BMiI+Ci08L3JlcG9ydHM+Ci08dGVtcGxhdGVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS90ZW1wbGF0ZV9BMiI+Ci08L3RlbXBsYXRlcz4KLTx0b29sTWVudG9ycyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvdG9vbG1lbnRvcl9BMiI+Ci08L3Rvb2xNZW50b3JzPgotPC9PdXRjb21lPgotPENoZWNrbGlzdCBuYW1lPSJjaGVja2xpc3RfQTEiIGJyaWVmRGVzY3JpcHRpb249IkNoZWNrbGlzdCBBMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iQ2hlY2tsaXN0IEExIHByZXNlbnQiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPENvbnRlbnREZXNjcmlwdGlvbiBuYW1lPSJjaGVja2xpc3RfQTEsX0tWNHEwQS1TRWRxTDJPMVBKVjljWkEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJUaHUgQXVnIDE4IDE0OjMwOjM0IFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSJDaGVja2xpc3QgQTEgY29udGVudCIga2V5Q29uc2lkZXJhdGlvbnM9IiI+Ci08L0NvbnRlbnREZXNjcmlwdGlvbj4KLTwvQ2hlY2tsaXN0PgotPENvbmNlcHQgbmFtZT0iY29uY2VwdF9BMSIgYnJpZWZEZXNjcmlwdGlvbj0iQ29uY2VwdCBBMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iQ29uY2VwdCBBMSBwcmVzZW50IiBzaGFwZWljb249ImZpbGU6L0M6L0RvY3VtZW50cyUyMGFuZCUyMFNldHRpbmdzL3RyYW4tbHV1L0lCTS9NZXRob2RMaWJyYXJpZXMvcGFyaXMvUGx1ZyUyMEEvZ3VpZGFuY2VzL2NvbmNlcHRzL3Jlc291cmNlcy90eXJhbm5vc2F1cnVzLmdpZiIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08Q29udGVudERlc2NyaXB0aW9uIG5hbWU9ImNvbmNlcHRfQTEsX05ETC1rQS1TRWRxTDJPMVBKVjljWkEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJUaHUgQXVnIDE4IDE0OjMwOjMwIFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSImbHQ7cCZndDsmIzEzOyYjMTA7ICAgIENvbmNlcHQgQTEgY29udGVudCYjMTM7JiMxMDsmbHQ7L3AmZ3Q7JiMxMzsmIzEwOyZsdDtwJmd0OyYjMTM7JiMxMDsgICAgRmlsZSBsaW5rOiZhbXA7bmJzcDsmbHQ7YSBocmVmPSZxdW90O2ZpbGU6Ly8vcmVzb3VyY2VzL2NvbmNlcHRfQTEueG1pJnF1b3Q7Jmd0O2NvbmNlcHRfQTEueG1pJmx0Oy9hJmd0OyYjMTM7JiMxMDsmbHQ7L3AmZ3Q7JiMxMzsmIzEwOyZsdDtwJmd0OyYjMTM7JiMxMDsgICAgVVJMOiZhbXA7bmJzcDsmbHQ7YSBocmVmPSZxdW90O2h0dHA6Ly93d3cucG9zaXRyb25ncm91cC5jb20mcXVvdDsmZ3Q7aHR0cDovL3d3dy5wb3NpdHJvbmdyb3VwLmNvbSZsdDsvYSZndDsmIzEzOyYjMTA7Jmx0Oy9wJmd0OyYjMTM7JiMxMDsmbHQ7cCZndDsmIzEzOyYjMTA7ICAgIEltYWdlOiZhbXA7bmJzcDsmbHQ7aW1nIGhlaWdodD0mcXVvdDszMiZxdW90OyBhbHQ9JnF1b3Q7UCZxdW90OyBzcmM9JnF1b3Q7cmVzb3VyY2VzL3R5cmFubm9zYXVydXMuZ2lmJnF1b3Q7IHdpZHRoPSZxdW90OzMyJnF1b3Q7IC8mZ3Q7JiMxMzsmIzEwOyZsdDsvcCZndDsmIzEzOyYjMTA7Jmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICBFbGVtZW50IHBsYWluOiZhbXA7bmJzcDsmbHQ7YSBjbGFzcz0mcXVvdDtlbGVtZW50TGluayZxdW90OyYjMTM7JiMxMDsgICAgaHJlZj0mcXVvdDsuLy4uLy4uLy4uL1BsdWclMjBBL2d1aWRhbmNlcy9jb25jZXB0cy9jb25jZXB0X0EyLF9PVkxWY0EtVEVkcUwyTzFQSlY5Y1pBLmh0bWwmcXVvdDsmIzEzOyYjMTA7ICAgIGd1aWQ9JnF1b3Q7X09WTFZjQS1URWRxTDJPMVBKVjljWkEmcXVvdDsmZ3Q7Q29uY2VwdCBBMiBwcmVzZW50Jmx0Oy9hJmd0OyYjMTM7JiMxMDsmbHQ7L3AmZ3Q7JiMxMzsmIzEwOyZsdDtwJmd0OyYjMTM7JiMxMDsgICAgRWxlbWVudCB3aXRoIHR5cGU6JmFtcDtuYnNwOyZsdDthIGNsYXNzPSZxdW90O2VsZW1lbnRMaW5rV2l0aFR5cGUmcXVvdDsmIzEzOyYjMTA7ICAgIGhyZWY9JnF1b3Q7Li8uLi8uLi8uLi9QbHVnJTIwQS9ndWlkYW5jZXMvY29uY2VwdHMvY29uY2VwdF9BMixfT1ZMVmNBLVRFZHFMMk8xUEpWOWNaQS5odG1sJnF1b3Q7JiMxMzsmIzEwOyAgICBndWlkPSZxdW90O19PVkxWY0EtVEVkcUwyTzFQSlY5Y1pBJnF1b3Q7Jmd0O0NvbmNlcHQ6IENvbmNlcHQgQTIgcHJlc2VudCZsdDsvYSZndDsmIzEzOyYjMTA7Jmx0Oy9wJmd0OyYjMTM7JiMxMDsmbHQ7cCZndDsmIzEzOyYjMTA7ICAgIEVsZW1lbnQgd2l0aCB1c2VyIHRleHQ6JmFtcDtuYnNwOyAmbHQ7YSBjbGFzcz0mcXVvdDtlbGVtZW50TGlua1dpdGhVc2VyVGV4dCZxdW90OyYjMTM7JiMxMDsgICAgaHJlZj0mcXVvdDsuLy4uLy4uLy4uL1BsdWclMjBBL2d1aWRhbmNlcy9jb25jZXB0cy9jb25jZXB0X0EyLF9PVkxWY0EtVEVkcUwyTzFQSlY5Y1pBLmh0bWwmcXVvdDsmIzEzOyYjMTA7ICAgIGd1aWQ9JnF1b3Q7X09WTFZjQS1URWRxTDJPMVBKVjljWkEmcXVvdDsmZ3Q7Y29uY2VwdF9BMiB1c2VyIHRleHQmbHQ7L2EmZ3Q7JiMxMzsmIzEwOyZsdDsvcCZndDsiIGtleUNvbnNpZGVyYXRpb25zPSIiPgotPC9Db250ZW50RGVzY3JpcHRpb24+Ci08L0NvbmNlcHQ+Ci08RXhhbXBsZSBuYW1lPSJleGFtcGxlX0ExIiBicmllZkRlc2NyaXB0aW9uPSJFeGFtcGxlIEExIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJFeGFtcGxlIEExIHByZXNlbnQiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPENvbnRlbnREZXNjcmlwdGlvbiBuYW1lPSJleGFtcGxlX0ExLF9PQnh0d0EtU0VkcUwyTzFQSlY5Y1pBIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iVGh1IEF1ZyAxOCAxNDozMDozOCBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iRXhhbXBsZSBBMSBjb250ZW50IiBrZXlDb25zaWRlcmF0aW9ucz0iIj4KLTwvQ29udGVudERlc2NyaXB0aW9uPgotPC9FeGFtcGxlPgotPEd1aWRlbGluZSBuYW1lPSJndWlkZWxpbmVfQTEiIGJyaWVmRGVzY3JpcHRpb249Ikd1aWRlbGluZSBBMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iR3VpZGVsaW5lIEExIHByZXNlbnQiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPENvbnRlbnREZXNjcmlwdGlvbiBuYW1lPSJndWlkZWxpbmVfQTEsX09rQ3RVQS1TRWRxTDJPMVBKVjljWkEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJUaHUgQXVnIDE4IDE0OjMwOjQzIFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSJHdWlkZWxpbmUgQTEgY29udGVudCIga2V5Q29uc2lkZXJhdGlvbnM9IiI+Ci08L0NvbnRlbnREZXNjcmlwdGlvbj4KLTwvR3VpZGVsaW5lPgotPFByYWN0aWNlIG5hbWU9InByYWN0aWNlX0ExIiBicmllZkRlc2NyaXB0aW9uPSJQcmFjdGljZSBBMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iUHJhY3RpY2UgQTEgcHJlc2VudCIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08UHJhY3RpY2VEZXNjcmlwdGlvbiBuYW1lPSJwcmFjdGljZV9BMSxfUDhqWVlBLVNFZHFMMk8xUEpWOWNaQSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURhdGU9IlRodSBBdWcgMTggMTQ6MzE6MTggUERUIDIwMDUiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249IlByYWN0aWNlIEExIGNvbnRlbnQiIGtleUNvbnNpZGVyYXRpb25zPSIiIGFkZGl0aW9uYWxJbmZvPSJQcmFjdGljZSBBMSBhZGQiIHByb2JsZW09IlByYWN0aWNlIEExIHByb2JsZW0iIGJhY2tncm91bmQ9IlByYWN0aWNlIEExIGJhY2siIGdvYWxzPSJQcmFjdGljZSBBMSBnb2FsIiBhcHBsaWNhdGlvbj0iUHJhY3RpY2UgQTEgYXBwIiBsZXZlbHNPZkFkb3B0aW9uPSJQcmFjdGljZSBBMSBsZXZlbCI+Ci08L1ByYWN0aWNlRGVzY3JpcHRpb24+Ci08UHJhY3RpY2UgbmFtZT0icHJhY3RpY2VfQTEuMSIgYnJpZWZEZXNjcmlwdGlvbj0iUHJhY3RpY2UgQTEuMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iUHJhY3RpY2UgQTEuMSBwcmVzZW50IiB2YXJpYWJpbGl0eVR5cGU9Im5hIj4KLTxQcmFjdGljZURlc2NyaXB0aW9uIG5hbWU9InByYWN0aWNlX0ExLjEsXy1GU1VnQS1VRWRxTDJPMVBKVjljWkEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJUaHUgQXVnIDE4IDE0OjMxOjIwIFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSJQcmFjdGljZSBBMS4xIGNvbnRlbnQiIGtleUNvbnNpZGVyYXRpb25zPSIiIGFkZGl0aW9uYWxJbmZvPSJQcmFjdGljZSBBMS4xIGFkZCIgcHJvYmxlbT0iUHJhY3RpY2UgQTEuMSBwcm9ibGVtIiBiYWNrZ3JvdW5kPSJQcmFjdGljZSBBMS4xIGJhY2siIGdvYWxzPSJQcmFjdGljZSBBMS4xIGdvYWwiIGFwcGxpY2F0aW9uPSJQcmFjdGljZSBBMS4xIGFwcCIgbGV2ZWxzT2ZBZG9wdGlvbj0iUHJhY3RpY2UgQTEuMSBsZXZlbCI+Ci08L1ByYWN0aWNlRGVzY3JpcHRpb24+Ci08L1ByYWN0aWNlPgotPGNvbnRlbnRSZWZlcmVuY2VzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9hcnRpZmFjdF9BMSI+Ci08L2NvbnRlbnRSZWZlcmVuY2VzPgotPGNvbnRlbnRSZWZlcmVuY2VzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhdGVnb3JpZXMvQ3VzdG9tQ2F0ZWdvcmllcy9jdXN0b21fY2F0ZWdvcnlfQTEiPgotPC9jb250ZW50UmVmZXJlbmNlcz4KLTxjb250ZW50UmVmZXJlbmNlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXRlZ29yaWVzL0Rpc2NpcGxpbmVzL2Rpc2NpcGxpbmVfQTEiPgotPC9jb250ZW50UmVmZXJlbmNlcz4KLTxjb250ZW50UmVmZXJlbmNlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXRlZ29yaWVzL0RvbWFpbnMvZG9tYWluX0ExIj4KLTwvY29udGVudFJlZmVyZW5jZXM+Ci08Y29udGVudFJlZmVyZW5jZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2F0ZWdvcmllcy9Sb2xlU2V0cy9yb2xlX3NldF9BMSI+Ci08L2NvbnRlbnRSZWZlcmVuY2VzPgotPGNvbnRlbnRSZWZlcmVuY2VzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhdGVnb3JpZXMvVG9vbHMvdG9vbF9BMSI+Ci08L2NvbnRlbnRSZWZlcmVuY2VzPgotPGNvbnRlbnRSZWZlcmVuY2VzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhdGVnb3JpZXMvV1AgVHlwZXMvd29ya19wcm9kdWN0X3R5cGVfQTEiPgotPC9jb250ZW50UmVmZXJlbmNlcz4KLTxjb250ZW50UmVmZXJlbmNlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvY2hlY2tsaXN0X0ExIj4KLTwvY29udGVudFJlZmVyZW5jZXM+Ci08Y29udGVudFJlZmVyZW5jZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2NvbmNlcHRfQTEiPgotPC9jb250ZW50UmVmZXJlbmNlcz4KLTxjb250ZW50UmVmZXJlbmNlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvZXhhbXBsZV9BMSI+Ci08L2NvbnRlbnRSZWZlcmVuY2VzPgotPGNvbnRlbnRSZWZlcmVuY2VzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9ndWlkZWxpbmVfQTEiPgotPC9jb250ZW50UmVmZXJlbmNlcz4KLTxjb250ZW50UmVmZXJlbmNlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvb3V0Y29tZV9BMSI+Ci08L2NvbnRlbnRSZWZlcmVuY2VzPgotPGNvbnRlbnRSZWZlcmVuY2VzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9wcmFjdGljZV9BMiI+Ci08L2NvbnRlbnRSZWZlcmVuY2VzPgotPGNvbnRlbnRSZWZlcmVuY2VzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9yZXBvcnRfQTEiPgotPC9jb250ZW50UmVmZXJlbmNlcz4KLTxjb250ZW50UmVmZXJlbmNlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvcmV1c2FibGVfYXNzZXRfQTEiPgotPC9jb250ZW50UmVmZXJlbmNlcz4KLTxjb250ZW50UmVmZXJlbmNlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvcm9hZG1hcF9BMSI+Ci08L2NvbnRlbnRSZWZlcmVuY2VzPgotPGNvbnRlbnRSZWZlcmVuY2VzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9yb2xlX0ExIj4KLTwvY29udGVudFJlZmVyZW5jZXM+Ci08Y29udGVudFJlZmVyZW5jZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3N1cHBvcnRpbmdfbWF0ZXJpYWxfQTEiPgotPC9jb250ZW50UmVmZXJlbmNlcz4KLTxjb250ZW50UmVmZXJlbmNlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvdGFza19BMSI+Ci08L2NvbnRlbnRSZWZlcmVuY2VzPgotPGNvbnRlbnRSZWZlcmVuY2VzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS90ZW1wbGF0ZV9BMSI+Ci08L2NvbnRlbnRSZWZlcmVuY2VzPgotPGNvbnRlbnRSZWZlcmVuY2VzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS90b29sbWVudG9yX0ExIj4KLTwvY29udGVudFJlZmVyZW5jZXM+Ci08Y29udGVudFJlZmVyZW5jZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3doaXRlcGFwZXJfQTEiPgotPC9jb250ZW50UmVmZXJlbmNlcz4KLTxjb250ZW50UmVmZXJlbmNlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvYXJ0aWZhY3RfQTEvc3ViX2FydGlmYWN0X0ExLjEiPgotPC9jb250ZW50UmVmZXJlbmNlcz4KLTxjb250ZW50UmVmZXJlbmNlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvZGVsaXZlcmFibGVfQTEiPgotPC9jb250ZW50UmVmZXJlbmNlcz4KLTxjb250ZW50UmVmZXJlbmNlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXRlZ29yaWVzL0N1c3RvbUNhdGVnb3JpZXMvc3ViX2N1c3RvbV9jYXRlZ29yeV9BMS4xIj4KLTwvY29udGVudFJlZmVyZW5jZXM+Ci08Y29udGVudFJlZmVyZW5jZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2F0ZWdvcmllcy9EaXNjaXBsaW5lcy9kaXNjaXBsaW5lX2dyb3VwaW5nX0ExIj4KLTwvY29udGVudFJlZmVyZW5jZXM+Ci08Y29udGVudFJlZmVyZW5jZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2F0ZWdvcmllcy9Eb21haW5zL2RvbWFpbl9BMS9zdWJfZG9tYWluX0ExLjEiPgotPC9jb250ZW50UmVmZXJlbmNlcz4KLTxjb250ZW50UmVmZXJlbmNlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXRlZ29yaWVzL1JvbGVTZXRzL3JvbGVfc2V0X2dyb3VwaW5nX0ExIj4KLTwvY29udGVudFJlZmVyZW5jZXM+Ci08L1ByYWN0aWNlPgotPFJlcG9ydCBuYW1lPSJyZXBvcnRfQTEiIGJyaWVmRGVzY3JpcHRpb249IlJlcG9ydCBBMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iUmVwb3J0IEExIHByZXNlbnQiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPENvbnRlbnREZXNjcmlwdGlvbiBuYW1lPSJyZXBvcnRfQTEsX1E1RGM0QS1TRWRxTDJPMVBKVjljWkEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJUaHUgQXVnIDE4IDE0OjMwOjUxIFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSJSZXBvcnQgQTEgY29udGVudCIga2V5Q29uc2lkZXJhdGlvbnM9IiI+Ci08L0NvbnRlbnREZXNjcmlwdGlvbj4KLTwvUmVwb3J0PgotPFJldXNhYmxlQXNzZXQgbmFtZT0icmV1c2FibGVfYXNzZXRfQTEiIGJyaWVmRGVzY3JpcHRpb249IlJldXNhYmxlIEFzc2V0IEExIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJSZXVzYWJsZSBBc3NldCBBMSBwcmVzZW50IiB2YXJpYWJpbGl0eVR5cGU9Im5hIj4KLTxDb250ZW50RGVzY3JpcHRpb24gbmFtZT0icmV1c2FibGVfYXNzZXRfQTEsX1RWMGFRQS1TRWRxTDJPMVBKVjljWkEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJUaHUgQXVnIDE4IDE0OjMxOjI3IFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSJSZXVzYWJsZSBBc3NldCBBMSBjb250ZW50IiBrZXlDb25zaWRlcmF0aW9ucz0iIj4KLTwvQ29udGVudERlc2NyaXB0aW9uPgotPC9SZXVzYWJsZUFzc2V0PgotPFJvYWRtYXAgbmFtZT0icm9hZG1hcF9BMSIgYnJpZWZEZXNjcmlwdGlvbj0iUm9hZG1hcCBBMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iUm9hZG1hcCBBMSBwcmVzZW50IiB2YXJpYWJpbGl0eVR5cGU9Im5hIj4KLTxDb250ZW50RGVzY3JpcHRpb24gbmFtZT0icm9hZG1hcF9BMSxfWmszOWdBLVNFZHFMMk8xUEpWOWNaQSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURhdGU9IlRodSBBdWcgMTggMTQ6MzA6MDQgUERUIDIwMDUiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249IlJvYWRtYXAgQTEgY29udGVudCIga2V5Q29uc2lkZXJhdGlvbnM9IiI+Ci08L0NvbnRlbnREZXNjcmlwdGlvbj4KLTwvUm9hZG1hcD4KLTxTdXBwb3J0aW5nTWF0ZXJpYWwgbmFtZT0ic3VwcG9ydGluZ19tYXRlcmlhbF9BMSIgYnJpZWZEZXNjcmlwdGlvbj0iU3VwcG9ydGluZyBNYXRlcmlhbCBBMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iU3VwcG9ydGluZyBNYXRlcmlhbCBBMSBwcmVzZW50IiB2YXJpYWJpbGl0eVR5cGU9Im5hIj4KLTxDb250ZW50RGVzY3JpcHRpb24gbmFtZT0ic3VwcG9ydGluZ19tYXRlcmlhbF9BMSxfYUZwdlVBLVNFZHFMMk8xUEpWOWNaQSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURhdGU9IlRodSBBdWcgMTggMTQ6MzE6MDEgUERUIDIwMDUiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249IlN1cHBvcnRpbmcgTWF0ZXJpYWwgQTEgY29udGVudCIga2V5Q29uc2lkZXJhdGlvbnM9IiI+Ci08L0NvbnRlbnREZXNjcmlwdGlvbj4KLTwvU3VwcG9ydGluZ01hdGVyaWFsPgotPFRlbXBsYXRlIG5hbWU9InRlbXBsYXRlX0ExIiBicmllZkRlc2NyaXB0aW9uPSJUZW1wbGF0ZSBBMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iVGVtcGxhdGUgQTEgcHJlc2VudCIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08R3VpZGFuY2VEZXNjcmlwdGlvbiBuYW1lPSJ0ZW1wbGF0ZV9BMSxfYkZJUFVBLVNFZHFMMk8xUEpWOWNaQSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURhdGU9IlRodSBBdWcgMTggMTQ6MzA6NTYgUERUIDIwMDUiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249IlRlbXBsYXRlIEExIGNvbnRlbnQiIGtleUNvbnNpZGVyYXRpb25zPSIiIGF0dGFjaG1lbnRzPSIiPgotPC9HdWlkYW5jZURlc2NyaXB0aW9uPgotPC9UZW1wbGF0ZT4KLTxUb29sTWVudG9yIG5hbWU9InRvb2xtZW50b3JfQTEiIGJyaWVmRGVzY3JpcHRpb249IlRvb2xtZW50b3IgQTEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IlRvb2xtZW50b3IgQTEgcHJlc2VudCIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08Q29udGVudERlc2NyaXB0aW9uIG5hbWU9InRvb2xtZW50b3JfQTEsX2hIRWpvQS1TRWRxTDJPMVBKVjljWkEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJUaHUgQXVnIDE4IDE0OjMxOjA1IFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSJUb29sbWVudG9yIEExIGNvbnRlbnQiIGtleUNvbnNpZGVyYXRpb25zPSIiPgotPC9Db250ZW50RGVzY3JpcHRpb24+Ci08L1Rvb2xNZW50b3I+Ci08V2hpdGVwYXBlciBuYW1lPSJ3aGl0ZXBhcGVyX0ExIiBicmllZkRlc2NyaXB0aW9uPSJXaGl0ZXBhcGVyIEExIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJXaGl0ZXBhcGVyIEExIHByZXNlbnQiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPENvbnRlbnREZXNjcmlwdGlvbiBuYW1lPSJ3aGl0ZXBhcGVyX0ExLF9oOFJHUUEtU0VkcUwyTzFQSlY5Y1pBIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iVGh1IEF1ZyAxOCAxNDozMToxMyBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iV2hpdGVwYXBlciBBMSBjb250ZW50IiBrZXlDb25zaWRlcmF0aW9ucz0iIj4KLTwvQ29udGVudERlc2NyaXB0aW9uPgotPC9XaGl0ZXBhcGVyPgotPENvbmNlcHQgbmFtZT0iY29uY2VwdF9BMiIgYnJpZWZEZXNjcmlwdGlvbj0iQ29uY2VwdCBBMiBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iQ29uY2VwdCBBMiBwcmVzZW50IiB2YXJpYWJpbGl0eVR5cGU9Im5hIj4KLTxDb250ZW50RGVzY3JpcHRpb24gbmFtZT0iY29uY2VwdF9BMixfT1ZMVmNBLVRFZHFMMk8xUEpWOWNaQSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURhdGU9IlRodSBBdWcgMTggMTQ6MzA6MjQgUERUIDIwMDUiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249IkNvbmNlcHQgQTIgY29udGVudCIga2V5Q29uc2lkZXJhdGlvbnM9IiI+Ci08L0NvbnRlbnREZXNjcmlwdGlvbj4KLTwvQ29uY2VwdD4KLTxDaGVja2xpc3QgbmFtZT0iY2hlY2tsaXN0X0EyIiBicmllZkRlc2NyaXB0aW9uPSJDaGVja2xpc3QgQTIgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IkNoZWNrbGlzdCBBMiBwcmVzZW50IiB2YXJpYWJpbGl0eVR5cGU9Im5hIj4KLTxDb250ZW50RGVzY3JpcHRpb24gbmFtZT0iY2hlY2tsaXN0X0EyLF9rcmlUY0EtVEVkcUwyTzFQSlY5Y1pBIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iVGh1IEF1ZyAxOCAxNDozMDozNiBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iQ2hlY2tsaXN0IEEyIGNvbnRlbnQiIGtleUNvbnNpZGVyYXRpb25zPSIiPgotPC9Db250ZW50RGVzY3JpcHRpb24+Ci08L0NoZWNrbGlzdD4KLTxFeGFtcGxlIG5hbWU9ImV4YW1wbGVfQTIiIGJyaWVmRGVzY3JpcHRpb249IkV4YW1wbGUgQTEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IkV4YW1wbGUgQTEgcHJlc2VudCIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08Q29udGVudERlc2NyaXB0aW9uIG5hbWU9ImV4YW1wbGVfQTIsX3VhaldjQS1URWRxTDJPMVBKVjljWkEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJUaHUgQXVnIDE4IDE0OjMwOjQxIFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSJFeGFtcGxlIEExIGNvbnRlbnQiIGtleUNvbnNpZGVyYXRpb25zPSIiPgotPC9Db250ZW50RGVzY3JpcHRpb24+Ci08L0V4YW1wbGU+Ci08R3VpZGVsaW5lIG5hbWU9Imd1aWRlbGluZV9BMiIgYnJpZWZEZXNjcmlwdGlvbj0iR3VpZGVsaW5lIEEyIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJHdWlkZWxpbmUgQTIgcHJlc2VudCIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08Q29udGVudERlc2NyaXB0aW9uIG5hbWU9Imd1aWRlbGluZV9BMixfNllVd0FBLVRFZHFMMk8xUEpWOWNaQSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURhdGU9IlRodSBBdWcgMTggMTQ6MzA6NDUgUERUIDIwMDUiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249Ikd1aWRlbGluZSBBMiBjb250ZW50IiBrZXlDb25zaWRlcmF0aW9ucz0iIj4KLTwvQ29udGVudERlc2NyaXB0aW9uPgotPC9HdWlkZWxpbmU+Ci08UmVwb3J0IG5hbWU9InJlcG9ydF9BMiIgYnJpZWZEZXNjcmlwdGlvbj0iUmVwb3J0IEEyIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJSZXBvcnQgQTIgcHJlc2VudCIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08Q29udGVudERlc2NyaXB0aW9uIG5hbWU9InJlcG9ydF9BMixfR3JHd1FBLVVFZHFMMk8xUEpWOWNaQSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURhdGU9IlRodSBBdWcgMTggMTQ6MzA6NTMgUERUIDIwMDUiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249IlJlcG9ydCBBMiBjb250ZW50IiBrZXlDb25zaWRlcmF0aW9ucz0iIj4KLTwvQ29udGVudERlc2NyaXB0aW9uPgotPC9SZXBvcnQ+Ci08VGVtcGxhdGUgbmFtZT0idGVtcGxhdGVfQTIiIGJyaWVmRGVzY3JpcHRpb249IlRlbXBsYXRlIEEyIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJUZW1wbGF0ZSBBMiBwcmVzZW50IiB2YXJpYWJpbGl0eVR5cGU9Im5hIj4KLTxHdWlkYW5jZURlc2NyaXB0aW9uIG5hbWU9InRlbXBsYXRlX0EyLF9aWHE5RUEtVUVkcUwyTzFQSlY5Y1pBIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iVGh1IEF1ZyAxOCAxNDozMDo1OCBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iVGVtcGxhdGUgQTIgY29udGVudCIga2V5Q29uc2lkZXJhdGlvbnM9IiIgYXR0YWNobWVudHM9IiI+Ci08L0d1aWRhbmNlRGVzY3JpcHRpb24+Ci08L1RlbXBsYXRlPgotPFN1cHBvcnRpbmdNYXRlcmlhbCBuYW1lPSJzdXBwb3J0aW5nX21hdGVyaWFsX0EyIiBicmllZkRlc2NyaXB0aW9uPSJTdXBwb3J0aW5nIE1hdGVyaWFsIEEyIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJTdXBwb3J0aW5nIE1hdGVyaWFsIEEyIHByZXNlbnQiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPENvbnRlbnREZXNjcmlwdGlvbiBuYW1lPSJzdXBwb3J0aW5nX21hdGVyaWFsX0EyLF9tUHNfY0EtVUVkcUwyTzFQSlY5Y1pBIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iVGh1IEF1ZyAxOCAxNDozMTowMyBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iU3VwcG9ydGluZyBNYXRlcmlhbCBBMiBjb250ZW50IiBrZXlDb25zaWRlcmF0aW9ucz0iIj4KLTwvQ29udGVudERlc2NyaXB0aW9uPgotPC9TdXBwb3J0aW5nTWF0ZXJpYWw+Ci08VG9vbE1lbnRvciBuYW1lPSJ0b29sbWVudG9yX0EyIiBicmllZkRlc2NyaXB0aW9uPSJUb29sbWVudG9yIEEyIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJUb29sbWVudG9yIEEyIHByZXNlbnQiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPENvbnRlbnREZXNjcmlwdGlvbiBuYW1lPSJ0b29sbWVudG9yX0EyLF92N0pLQUEtVUVkcUwyTzFQSlY5Y1pBIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iVGh1IEF1ZyAxOCAxNDozMTowOCBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iVG9vbG1lbnRvciBBMiBjb250ZW50IiBrZXlDb25zaWRlcmF0aW9ucz0iIj4KLTwvQ29udGVudERlc2NyaXB0aW9uPgotPC9Ub29sTWVudG9yPgotPFdoaXRlcGFwZXIgbmFtZT0id2hpdGVwYXBlcl9BMiIgYnJpZWZEZXNjcmlwdGlvbj0iV2hpdGVwYXBlciBBMiBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iV2hpdGVwYXBlciBBMiBwcmVzZW50IiB2YXJpYWJpbGl0eVR5cGU9Im5hIj4KLTxDb250ZW50RGVzY3JpcHRpb24gbmFtZT0id2hpdGVwYXBlcl9BMixfM1hyMEVBLVVFZHFMMk8xUEpWOWNaQSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURhdGU9IlRodSBBdWcgMTggMTQ6MzE6MTUgUERUIDIwMDUiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249IldoaXRlcGFwZXIgQTIgY29udGVudCIga2V5Q29uc2lkZXJhdGlvbnM9IiI+Ci08L0NvbnRlbnREZXNjcmlwdGlvbj4KLTwvV2hpdGVwYXBlcj4KLTxQcmFjdGljZSBuYW1lPSJwcmFjdGljZV9BMiIgYnJpZWZEZXNjcmlwdGlvbj0iUHJhY3RpY2UgQTIgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IlByYWN0aWNlIEEyIHByZXNlbnQiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPFByYWN0aWNlRGVzY3JpcHRpb24gbmFtZT0icHJhY3RpY2VfQTIsX0VwZm9ZQS1WRWRxTDJPMVBKVjljWkEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJUaHUgQXVnIDE4IDE0OjMxOjIzIFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSJQcmFjdGljZSBBMiBjb250ZW50IiBrZXlDb25zaWRlcmF0aW9ucz0iIiBhZGRpdGlvbmFsSW5mbz0iUHJhY3RpY2UgQTIgYWRkIiBwcm9ibGVtPSJQcmFjdGljZSBBMiBwcm9ibGVtIiBiYWNrZ3JvdW5kPSJQcmFjdGljZSBBMiBiYWNrIiBnb2Fscz0iUHJhY3RpY2UgQTIgZ29hbCIgYXBwbGljYXRpb249IlByYWN0aWNlIEEyIGFwcCIgbGV2ZWxzT2ZBZG9wdGlvbj0iUHJhY3RpY2UgQTIgbGV2ZWwiPgotPC9QcmFjdGljZURlc2NyaXB0aW9uPgotPFByYWN0aWNlIG5hbWU9InByYWN0aWNlX0EyLjEiIGJyaWVmRGVzY3JpcHRpb249IlByYWN0aWNlIEEyLjEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IlByYWN0aWNlIEEyLjEgcHJlc2VudCIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08UHJhY3RpY2VEZXNjcmlwdGlvbiBuYW1lPSJwcmFjdGljZV9BMi4xLF9Kcmd3d0EtVkVkcUwyTzFQSlY5Y1pBIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iVGh1IEF1ZyAxOCAxNDozMToyNSBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iUHJhY3RpY2UgQTIuMSBjb250ZW50IiBrZXlDb25zaWRlcmF0aW9ucz0iIiBhZGRpdGlvbmFsSW5mbz0iUHJhY3RpY2UgQTIuMSBhZGQiIHByb2JsZW09IlByYWN0aWNlIEEyLjEgcHJvYmxlbSIgYmFja2dyb3VuZD0iUHJhY3RpY2UgQTIuMSBiYWNrIiBnb2Fscz0iUHJhY3RpY2UgQTIuMSBnb2FsIiBhcHBsaWNhdGlvbj0iUHJhY3RpY2UgQTIuMSBhcHAiIGxldmVsc09mQWRvcHRpb249IlByYWN0aWNlIEEyLjEgbGV2ZWwiPgotPC9QcmFjdGljZURlc2NyaXB0aW9uPgotPC9QcmFjdGljZT4KLTxjb250ZW50UmVmZXJlbmNlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvYXJ0aWZhY3RfQTIiPgotPC9jb250ZW50UmVmZXJlbmNlcz4KLTxjb250ZW50UmVmZXJlbmNlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvYXJ0aWZhY3RfQTIvYXJ0aWZhY3RfQTIuMSI+Ci08L2NvbnRlbnRSZWZlcmVuY2VzPgotPGNvbnRlbnRSZWZlcmVuY2VzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9jaGVja2xpc3RfQTIiPgotPC9jb250ZW50UmVmZXJlbmNlcz4KLTxjb250ZW50UmVmZXJlbmNlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvY29uY2VwdF9BMiI+Ci08L2NvbnRlbnRSZWZlcmVuY2VzPgotPGNvbnRlbnRSZWZlcmVuY2VzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9kZWxpdmVyYWJsZV9BMiI+Ci08L2NvbnRlbnRSZWZlcmVuY2VzPgotPGNvbnRlbnRSZWZlcmVuY2VzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9leGFtcGxlX0EyIj4KLTwvY29udGVudFJlZmVyZW5jZXM+Ci08Y29udGVudFJlZmVyZW5jZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2d1aWRlbGluZV9BMiI+Ci08L2NvbnRlbnRSZWZlcmVuY2VzPgotPGNvbnRlbnRSZWZlcmVuY2VzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9vdXRjb21lX0EyIj4KLTwvY29udGVudFJlZmVyZW5jZXM+Ci08Y29udGVudFJlZmVyZW5jZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3ByYWN0aWNlX0ExIj4KLTwvY29udGVudFJlZmVyZW5jZXM+Ci08Y29udGVudFJlZmVyZW5jZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3JlcG9ydF9BMiI+Ci08L2NvbnRlbnRSZWZlcmVuY2VzPgotPGNvbnRlbnRSZWZlcmVuY2VzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9yZXVzYWJsZV9hc3NldF9BMiI+Ci08L2NvbnRlbnRSZWZlcmVuY2VzPgotPGNvbnRlbnRSZWZlcmVuY2VzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9yb2FkbWFwX0EyIj4KLTwvY29udGVudFJlZmVyZW5jZXM+Ci08Y29udGVudFJlZmVyZW5jZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3JvbGVfQTIiPgotPC9jb250ZW50UmVmZXJlbmNlcz4KLTxjb250ZW50UmVmZXJlbmNlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvc3VwcG9ydGluZ19tYXRlcmlhbF9BMiI+Ci08L2NvbnRlbnRSZWZlcmVuY2VzPgotPGNvbnRlbnRSZWZlcmVuY2VzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS90YXNrX0EyIj4KLTwvY29udGVudFJlZmVyZW5jZXM+Ci08Y29udGVudFJlZmVyZW5jZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3RlbXBsYXRlX0EyIj4KLTwvY29udGVudFJlZmVyZW5jZXM+Ci08Y29udGVudFJlZmVyZW5jZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3Rvb2xtZW50b3JfQTIiPgotPC9jb250ZW50UmVmZXJlbmNlcz4KLTxjb250ZW50UmVmZXJlbmNlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvd2hpdGVwYXBlcl9BMiI+Ci08L2NvbnRlbnRSZWZlcmVuY2VzPgotPGNvbnRlbnRSZWZlcmVuY2VzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhdGVnb3JpZXMvQ3VzdG9tQ2F0ZWdvcmllcy9jdXN0b21fY2F0ZWdvcnlfQTIiPgotPC9jb250ZW50UmVmZXJlbmNlcz4KLTxjb250ZW50UmVmZXJlbmNlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXRlZ29yaWVzL0Rpc2NpcGxpbmVzL2Rpc2NpcGxpbmVfQTIiPgotPC9jb250ZW50UmVmZXJlbmNlcz4KLTxjb250ZW50UmVmZXJlbmNlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXRlZ29yaWVzL0RvbWFpbnMvZG9tYWluX0EyIj4KLTwvY29udGVudFJlZmVyZW5jZXM+Ci08Y29udGVudFJlZmVyZW5jZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2F0ZWdvcmllcy9Sb2xlU2V0cy9yb2xlX3NldF9BMiI+Ci08L2NvbnRlbnRSZWZlcmVuY2VzPgotPGNvbnRlbnRSZWZlcmVuY2VzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhdGVnb3JpZXMvVG9vbHMvdG9vbF9BMiI+Ci08L2NvbnRlbnRSZWZlcmVuY2VzPgotPGNvbnRlbnRSZWZlcmVuY2VzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhdGVnb3JpZXMvV1AgVHlwZXMvd29ya19wcm9kdWN0X3R5cGVfQTIiPgotPC9jb250ZW50UmVmZXJlbmNlcz4KLTwvUHJhY3RpY2U+Ci08UmV1c2FibGVBc3NldCBuYW1lPSJyZXVzYWJsZV9hc3NldF9BMiIgYnJpZWZEZXNjcmlwdGlvbj0iUmV1c2FibGUgQXNzZXQgQTIgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IlJldXNhYmxlIEFzc2V0IEEyIHByZXNlbnQiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPENvbnRlbnREZXNjcmlwdGlvbiBuYW1lPSJyZXVzYWJsZV9hc3NldF9BMixfU01jM0VBLVZFZHFMMk8xUEpWOWNaQSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURhdGU9IlRodSBBdWcgMTggMTQ6MzE6MjkgUERUIDIwMDUiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249IlJldXNhYmxlIEFzc2V0IEEyIGNvbnRlbnQiIGtleUNvbnNpZGVyYXRpb25zPSIiPgotPC9Db250ZW50RGVzY3JpcHRpb24+Ci08L1JldXNhYmxlQXNzZXQ+Ci08Um9hZG1hcCBuYW1lPSJyb2FkbWFwX0EyIiBicmllZkRlc2NyaXB0aW9uPSJSb2FkbWFwIEEyIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJSb2FkbWFwIEEyIHByZXNlbnQiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPENvbnRlbnREZXNjcmlwdGlvbiBuYW1lPSJyb2FkbWFwX0EyLF9ZdWtnUUEtVkVkcUwyTzFQSlY5Y1pBIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iVGh1IEF1ZyAxOCAxNDozMDowNiBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iUm9hZG1hcCBBMiBjb250ZW50IiBrZXlDb25zaWRlcmF0aW9ucz0iIj4KLTwvQ29udGVudERlc2NyaXB0aW9uPgotPC9Sb2FkbWFwPgotPFRlcm1EZWZpbml0aW9uIG5hbWU9InRlcm1fZGVmaW5pdGlvbl9BMiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJUZXJtIERlZmluaXRpb24gQTIgcHJlc2VudCIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08Q29udGVudERlc2NyaXB0aW9uIG5hbWU9InRlcm1fZGVmaW5pdGlvbl9BMixfbzhJN0VBLVZFZHFMMk8xUEpWOWNaQSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURhdGU9IlRodSBBdWcgMTggMTQ6MzE6NDIgUERUIDIwMDUiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249IlRlcm0gRGVmaW5pdGlvbiBBMiBjb250ZW50IiBrZXlDb25zaWRlcmF0aW9ucz0iIj4KLTwvQ29udGVudERlc2NyaXB0aW9uPgotPC9UZXJtRGVmaW5pdGlvbj4KLTxUZXJtRGVmaW5pdGlvbiBuYW1lPSJ0ZXJtX2RlZmluaXRpb25fQTEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iVGVybSBEZWZpbml0aW9uIEExIHByZXNlbnQiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPENvbnRlbnREZXNjcmlwdGlvbiBuYW1lPSJ0ZXJtX2RlZmluaXRpb25fQTEsX3NmaUpVQS1WRWRxTDJPMVBKVjljWkEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJUaHUgQXVnIDE4IDE0OjMwOjEyIFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSJUZXJtIERlZmluaXRpb24gQTEgY29udGVudCIga2V5Q29uc2lkZXJhdGlvbnM9IiI+Ci08L0NvbnRlbnREZXNjcmlwdGlvbj4KLTwvVGVybURlZmluaXRpb24+Ci08VGFzayBuYW1lPSJ0YXNrX0EzIiBicmllZkRlc2NyaXB0aW9uPSJicmllZjogVGFzayBBMyIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiZsdDs/eG1sIHZlcnNpb249JnF1b3Q7MS4wJnF1b3Q7IGVuY29kaW5nPSZxdW90O0FTQ0lJJnF1b3Q7PyZndDsgJmx0O2NvbS5pYm0udW1hLmVkaXQudG5nLnV0aWwubW9kZWw6T3JkZXJJbmZvQ29sbGVjdGlvbiB4bWk6dmVyc2lvbj0mcXVvdDsyLjAmcXVvdDsgeG1sbnM6eG1pPSZxdW90O2h0dHA6Ly93d3cub21nLm9yZy9YTUkmcXVvdDsgeG1sbnM6Y29tLmlibS51bWEuZWRpdC50bmcudXRpbC5tb2RlbD0mcXVvdDtodHRwOi8vL2NvbS9pYm0vdW1hL2VkaXQvdG5nL3V0aWwvbW9kZWwuZWNvcmUmcXVvdDsmZ3Q7ICAgJmx0O29yZGVySW5mb3MgbmFtZT0mcXVvdDtzZWN0aW9ucyZxdW90OyB0aW1lc3RhbXA9JnF1b3Q7MTEyOTc0NzI2NDEwOSZxdW90OyZndDsgICAgICZsdDtnVUlEcyZndDtfckNXd1VFRFBFZHFyaHNaaDNRTkFNUSZsdDsvZ1VJRHMmZ3Q7ICAgICAmbHQ7Z1VJRHMmZ3Q7X3RpMkJZQkJPRWRxQnM3S2hkVkxSTEEmbHQ7L2dVSURzJmd0OyAgICAgJmx0O2dVSURzJmd0O191bXlnWUVEUEVkcXJoc1poM1FOQU1RJmx0Oy9nVUlEcyZndDsgICAgICZsdDtnVUlEcyZndDtfdGs3c0VCQk9FZHFCczdLaGRWTFJMQSZsdDsvZ1VJRHMmZ3Q7ICAgICAmbHQ7Z1VJRHMmZ3Q7X3Z4NUJrRURQRWRxcmhzWmgzUU5BTVEmbHQ7L2dVSURzJmd0OyAgICAgJmx0O2dVSURzJmd0O190bmRib0JCT0VkcUJzN0toZFZMUkxBJmx0Oy9nVUlEcyZndDsgICAmbHQ7L29yZGVySW5mb3MmZ3Q7ICZsdDsvY29tLmlibS51bWEuZWRpdC50bmcudXRpbC5tb2RlbDpPcmRlckluZm9Db2xsZWN0aW9uJmd0OyAiIHByZXNlbnRhdGlvbk5hbWU9IlRhc2sgQTMgZXh0ZW5kcyBUYXNrIEEyIiB2YXJpYWJpbGl0eVR5cGU9ImV4dGVuZHMiPgotPFRhc2tEZXNjcmlwdGlvbiBuYW1lPSIsX29VbHVFRURGRWRxTzlNM2Z1a1lBX0EiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJXZWQgT2N0IDE5IDEwOjI3OjQzIFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSJtYWluOiBUYXNrIEEzIiBrZXlDb25zaWRlcmF0aW9ucz0ia2V5czogVGFzayBBMyIgcHVycG9zZT0icHVycG9zZTogVGFzayBBMyIgYWx0ZXJuYXRpdmVzPSJhbHRlcm5hdGl2ZXM6IFRhc2sgQTMiPgotPFNlY3Rpb24gbmFtZT0iU3RlcCBBMy4xIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHZhcmlhYmlsaXR5VHlwZT0ibmEiIHNlY3Rpb25OYW1lPSIiIHNlY3Rpb25EZXNjcmlwdGlvbj0iU3RlcCBBMy4xIj4KLTwvU2VjdGlvbj4KLTxTZWN0aW9uIG5hbWU9IlN0ZXAgQTMuMiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiB2YXJpYWJpbGl0eVR5cGU9Im5hIiBzZWN0aW9uTmFtZT0iIiBzZWN0aW9uRGVzY3JpcHRpb249IlN0ZXAgQTMuMiI+Ci08L1NlY3Rpb24+Ci08U2VjdGlvbiBuYW1lPSJTdGVwIEEzLjMiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgdmFyaWFiaWxpdHlUeXBlPSJuYSIgc2VjdGlvbk5hbWU9IiIgc2VjdGlvbkRlc2NyaXB0aW9uPSJTdGVwIEEzLjMiPgotPC9TZWN0aW9uPgotPC9UYXNrRGVzY3JpcHRpb24+Ci08dmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvdGFza19BMyI+Ci08L3ZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQ+Ci08cGVyZm9ybWVkQnkgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3Rhc2tfQTMiPgotPC9wZXJmb3JtZWRCeT4KLTxhZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvcm9sZV9BMiI+Ci08L2FkZGl0aW9uYWxseVBlcmZvcm1lZEJ5PgotPHN0ZXBzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS90YXNrX0EzLyxfb1VsdUVFREZFZHFPOU0zZnVrWUFfQS9TdGVwIEEzLjEiPgotPC9zdGVwcz4KLTxzdGVwcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvdGFza19BMy8sX29VbHVFRURGRWRxTzlNM2Z1a1lBX0EvU3RlcCBBMy4yIj4KLTwvc3RlcHM+Ci08c3RlcHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3Rhc2tfQTMvLF9vVWx1RUVERkVkcU85TTNmdWtZQV9BL1N0ZXAgQTMuMyI+Ci08L3N0ZXBzPgotPC9UYXNrPgotPFJvbGUgbmFtZT0icm9sZV9BMyIgYnJpZWZEZXNjcmlwdGlvbj0iYnJpZWYgOiBSb2xlIEEzIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJSb2xlIEEzIGV4dGVuZHMgUm9sZSBBMiIgdmFyaWFiaWxpdHlUeXBlPSJleHRlbmRzIj4KLTxSb2xlRGVzY3JpcHRpb24gbmFtZT0ibmV3X3JvbGUsXzhaTjZBRURGRWRxTzlNM2Z1a1lBX0EiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJXZWQgT2N0IDE5IDEwOjI5OjU5IFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSJtYWluOiBSb2xlIEEzIiBrZXlDb25zaWRlcmF0aW9ucz0ia2V5OiBSb2xlIEEzIiBza2lsbHM9InNraWxsczogUm9sZSBBMyIgYXNzaWdubWVudEFwcHJvYWNoZXM9ImFzc2lnbm1lbnQ6IFJvbGUgQTMiIHN5bm9ueW1zPSJzeW5vbnltbnMgOiBSb2xlIEEzIj4KLTwvUm9sZURlc2NyaXB0aW9uPgotPHZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3JvbGVfQTMiPgotPC92YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50PgotPC9Sb2xlPgotPC9Db250ZW50UGFja2FnZT4KLTwvQ29udGVudFBhY2thZ2U+Ci08UHJvY2Vzc1BhY2thZ2UgbmFtZT0iQ2FwYWJpbGl0eVBhdHRlcm5zIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGdsb2JhbD0iZmFsc2UiPgotPHBhcmVudFBhY2thZ2UgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zIj4KLTwvcGFyZW50UGFja2FnZT4KLTxQcm9jZXNzUGFja2FnZSBuYW1lPSJjYXBQYXRQYWtfQTEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgZ2xvYmFsPSJmYWxzZSI+Ci08cGFyZW50UGFja2FnZSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExIj4KLTwvcGFyZW50UGFja2FnZT4KLTxQcm9jZXNzQ29tcG9uZW50IG5hbWU9IkNQMSB3aXRoIGFsbCBlbGVtZW50cyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBnbG9iYWw9ImZhbHNlIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiI+Ci08cGFyZW50UGFja2FnZSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cyI+Ci08L3BhcmVudFBhY2thZ2U+Ci08UHJvY2Vzc1BhY2thZ2UgbmFtZT0iUGhhc2UxIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGdsb2JhbD0iZmFsc2UiPgotPHBhcmVudFBhY2thZ2UgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxIj4KLTwvcGFyZW50UGFja2FnZT4KLTxQcm9jZXNzUGFja2FnZSBuYW1lPSJJdGVyYXRpb24xIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGdsb2JhbD0iZmFsc2UiPgotPHBhcmVudFBhY2thZ2UgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEiPgotPC9wYXJlbnRQYWNrYWdlPgotPFByb2Nlc3NQYWNrYWdlIG5hbWU9IkFjdGl2aXR5MSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBnbG9iYWw9ImZhbHNlIj4KLTxwYXJlbnRQYWNrYWdlIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L3BhcmVudFBhY2thZ2U+Ci08QWN0aXZpdHkgbmFtZT0iQWN0aXZpdHkxIiBicmllZkRlc2NyaXB0aW9uPSJUaGlzIGFjdGl2aXR5IGNvbnRhaW5zIHRhc2tzIHRoYXQgYXJlIGFzc29jaWF0ZWQgdG8gYW5vdGhlciB0YXNrcy5BbHNvIHRoZWlyIHN0ZXBzIGFyZSBhZGRlZC4iIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IkFjdGl2aXR5MSBjb250YWluaW5nIHRhc2tzIGxpbmtlZCB0byBtZXRob2QgZWxlbWVudHMiIHByZWZpeD0iUHJlZml4IiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9InRydWUiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1JlcGVhdGFibGU9ImZhbHNlIiBpc09uZ29pbmc9ImZhbHNlIiBpc0V2ZW50RHJpdmVuPSJmYWxzZSIgdmFyaWFiaWxpdHlUeXBlPSJuYSIgaXNFbmFjdGFibGU9ImZhbHNlIj4KLTxBY3Rpdml0eURlc2NyaXB0aW9uIG5hbWU9IkFjdGl2aXR5MSxfRTczcklUemlFZHE1eXNGT05yMUJHUSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSImbHQ7cCZndDsmIzEzOyYjMTA7ICAgIFRoaXMgV29ya2Zsb3cgRGV0YWlsOiYjMTM7JiMxMDsmbHQ7L3AmZ3Q7JiMxMzsmIzEwOyZsdDt1bCZndDsmIzEzOyYjMTA7ICAgICZsdDtsaSZndDsmIzEzOyYjMTA7ICAgICAgICBQcm92aWRlcyB0aGUgbmF0dXJhbCAmbHQ7YiZndDt0cmFuc2l0aW9uIGZyb20gYW5hbHlzaXMmbHQ7L2ImZ3Q7IGFjdGl2aXRpZXMgJmx0O2ImZ3Q7dG8gZGVzaWduJmx0Oy9iJmd0OyBhY3Rpdml0aWVzLCBpZGVudGlmeWluZzogJiMxMzsmIzEwOyAgICAgICAgJmx0O3VsJmd0OyYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7bGkmZ3Q7JiMxMzsmIzEwOyAgICAgICAgICAgICAgICBhcHByb3ByaWF0ZSBkZXNpZ24gZWxlbWVudHMgZnJvbSBhbmFseXNpcyBlbGVtZW50cyYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7L2xpJmd0OyYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7bGkmZ3Q7JiMxMzsmIzEwOyAgICAgICAgICAgICAgICBhcHByb3ByaWF0ZSBkZXNpZ24gbWVjaGFuaXNtcyBmcm9tIHJlbGF0ZWQgYW5hbHlzaXMgbWVjaGFuaXNtcyYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7L2xpJmd0OyYjMTM7JiMxMDsgICAgICAgICZsdDsvdWwmZ3Q7JiMxMzsmIzEwOyAgICAmbHQ7L2xpJmd0OyYjMTM7JiMxMDsgICAgJmx0O2xpJmd0OyYjMTM7JiMxMDsgICAgICAgICZsdDtiJmd0O0Rlc2NyaWJlcyZsdDsvYiZndDsgdGhlIG9yZ2FuaXphdGlvbiBvZiB0aGUgc3lzdGVtJmFwb3M7cyAmbHQ7YiZndDtydW4tdGltZSBhbmQgZGVwbG95bWVudCBhcmNoaXRlY3R1cmUmbHQ7L2ImZ3Q7JiMxMzsmIzEwOyAgICAmbHQ7L2xpJmd0OyYjMTM7JiMxMDsgICAgJmx0O2xpJmd0OyYjMTM7JiMxMDsgICAgICAgICZsdDtiJmd0O09yZ2FuaXplcyB0aGUgaW1wbGVtZW50YXRpb24gbW9kZWwmbHQ7L2ImZ3Q7IHNvIGFzIHRvIG1ha2UgdGhlIHRyYW5zaXRpb24gYmV0d2VlbiBkZXNpZ24gYW5kIGltcGxlbWVudGF0aW9uIHNlYW1sZXNzJiMxMzsmIzEwOyAgICAmbHQ7L2xpJmd0OyYjMTM7JiMxMDsgICAgJmx0O2xpJmd0OyYjMTM7JiMxMDsgICAgICAgICZsdDtiJmd0O01haW50YWlucyB0aGUgY29uc2lzdGVuY3kgYW5kIGludGVncml0eSBvZiB0aGUgYXJjaGl0ZWN0dXJlJmx0Oy9iJmd0OywgZW5zdXJpbmcgdGhhdDogJiMxMzsmIzEwOyAgICAgICAgJmx0O3VsJmd0OyYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7bGkmZ3Q7JiMxMzsmIzEwOyAgICAgICAgICAgICAgICBuZXcgZGVzaWduIGVsZW1lbnRzIGlkZW50aWZpZWQgZm9yIHRoZSBjdXJyZW50IGl0ZXJhdGlvbiBhcmUgaW50ZWdyYXRlZCB3aXRoIHByZS1leGlzdGluZyBkZXNpZ24gZWxlbWVudHMuJiMxMzsmIzEwOyAgICAgICAgICAgICZsdDsvbGkmZ3Q7JiMxMzsmIzEwOyAgICAgICAgICAgICZsdDtsaSZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgICAgIG1heGltYWwgcmUtdXNlIG9mIGF2YWlsYWJsZSBjb21wb25lbnRzIGFuZCBkZXNpZ24gZWxlbWVudHMgaXMgYWNoaWV2ZWQgYXMgZWFybHkgYXMgcG9zc2libGUgaW4gdGhlIGRlc2lnbiYjMTM7JiMxMDsgICAgICAgICAgICAgICAgZWZmb3J0LiYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7L2xpJmd0OyYjMTM7JiMxMDsgICAgICAgICZsdDsvdWwmZ3Q7JiMxMzsmIzEwOyAgICAmbHQ7L2xpJmd0OyYjMTM7JiMxMDsmbHQ7L3VsJmd0OyIga2V5Q29uc2lkZXJhdGlvbnM9IiZsdDtwJmd0OyYjMTM7JiMxMDsgICAgS2V5IGNvbnNpZGVyYXRpb25zOiYjMTM7JiMxMDsmbHQ7L3AmZ3Q7JiMxMzsmIzEwOyZsdDt1bCZndDsmIzEzOyYjMTA7ICAgICZsdDtsaSZndDsmIzEzOyYjMTA7ICAgICAgICBrZXkxJiMxMzsmIzEwOyAgICAmbHQ7L2xpJmd0OyYjMTM7JiMxMDsgICAgJmx0O2xpJmd0OyYjMTM7JiMxMDsgICAgICAgIGtleTImIzEzOyYjMTA7ICAgICZsdDsvbGkmZ3Q7JiMxMzsmIzEwOyAgICAmbHQ7bGkmZ3Q7JiMxMzsmIzEwOyAgICAgICAga2V5MyYjMTM7JiMxMDsgICAgJmx0Oy9saSZndDsmIzEzOyYjMTA7ICAgICZsdDtsaSZndDsmIzEzOyYjMTA7ICAgICAgICBrZXk0JiMxMzsmIzEwOyAgICAmbHQ7L2xpJmd0OyYjMTM7JiMxMDsgICAgJmx0O2xpJmd0OyYjMTM7JiMxMDsgICAgICAgIGtleTUmIzEzOyYjMTA7ICAgICZsdDsvbGkmZ3Q7JiMxMzsmIzEwOyAgICAmbHQ7bGkmZ3Q7JiMxMzsmIzEwOyAgICAgICAga2V5NiYjMTM7JiMxMDsgICAgJmx0Oy9saSZndDsmIzEzOyYjMTA7ICAgICZsdDtsaSZndDsmIzEzOyYjMTA7ICAgICAgICBrZXk3JiMxMzsmIzEwOyAgICAmbHQ7L2xpJmd0OyYjMTM7JiMxMDsmbHQ7L3VsJmd0OyIgdXNhZ2VHdWlkYW5jZT0iJmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICBUaGUgd29yayBpcyBiZXN0IGRvbmUgaW4gc2V2ZXJhbCBzZXNzaW9ucywgcGVyaGFwcyBwZXJmb3JtZWQgb3ZlciBhIGZldyBkYXlzIChvciB3ZWVrcyBhbmQgbW9udGhzIGZvciB2ZXJ5IGxhcmdlJiMxMzsmIzEwOyAgICBzeXN0ZW1zKS4gVGhlIGluaXRpYWwgZm9jdXMgd2lsbCBiZSBvbiB0aGUgYWN0aXZpdGllcyAmbHQ7YSBjbGFzcz0mcXVvdDtlbGVtZW50TGluayZxdW90OyYjMTM7JiMxMDsgICAgaHJlZj0mcXVvdDtyZXNvdXJjZXMvaWRlbnRpZnlfZGVzaWduX21lY2hhbmlzbXMse0M3QTI2QkQ3LTM4MjAtNDhEOS04MzBGLTY4NEMzQUYxNTVGOX0uaHRtbCZxdW90OyYjMTM7JiMxMDsgICAgZ3VpZD0mcXVvdDt7QzdBMjZCRDctMzgyMC00OEQ5LTgzMEYtNjg0QzNBRjE1NUY5fSZxdW90OyZndDtJZGVudGlmeSBEZXNpZ24gTWVjaGFuaXNtcyZsdDsvYSZndDsgYW5kICZsdDthIGNsYXNzPSZxdW90O2VsZW1lbnRMaW5rJnF1b3Q7JiMxMzsmIzEwOyAgICBocmVmPSZxdW90O3Jlc291cmNlcy9pZGVudGlmeV9kZXNpZ25fZWxlbWVudHNfcmVhbC10aW1lX2Rlc2lnbix7NTg2OTYzRDAtNjA3RC00RUMyLThENTMtMjkyREFGQUI5QzkyfS5odG1sJnF1b3Q7JiMxMzsmIzEwOyAgICBndWlkPSZxdW90O3s1ODY5NjNEMC02MDdELTRFQzItOEQ1My0yOTJEQUZBQjlDOTJ9JnF1b3Q7Jmd0O2lkZW50aWZ5X2Rlc2lnbl9lbGVtZW50c19yZWFsLXRpbWVfZGVzaWduJmx0Oy9hJmd0Oywgd2l0aCBhIGdyZWF0IGRlYWwgb2YmIzEzOyYjMTA7ICAgIGl0ZXJhdGlvbiB3aXRoIHRoZSAmbHQ7YSBjbGFzcz0mcXVvdDtlbGVtZW50TGluayZxdW90OyYjMTM7JiMxMDsgICAgaHJlZj0mcXVvdDtyZXNvdXJjZXMvaW5jb3Jwb3JhdGVfZGVzaWduX2VsZW1lbnRzLHs1QzY0NzE3My00RTMyLTQ1OTQtOTZBOS0yNTQ4QjQ3NzIyRkF9Lmh0bWwmcXVvdDsmIzEzOyYjMTA7ICAgIGd1aWQ9JnF1b3Q7ezVDNjQ3MTczLTRFMzItNDU5NC05NkE5LTI1NDhCNDc3MjJGQX0mcXVvdDsmZ3Q7SW5jb3Jwb3JhdGUgRXhpc3RpbmcgRGVzaWduIEVsZW1lbnRzJmx0Oy9hJmd0OyBhY3Rpdml0eSB0byBtYWtlIHN1cmUgdGhhdCBuZXcmIzEzOyYjMTA7ICAgIGVsZW1lbnRzIGRvIG5vdCBkdXBsaWNhdGUgZnVuY3Rpb25hbGl0eSBvZiBleGlzdGluZyBlbGVtZW50cy4mIzEzOyYjMTA7Jmx0Oy9wJmd0OyYjMTM7JiMxMDsmbHQ7cCZndDsmIzEzOyYjMTA7ICAgIEFzIHRoZSBkZXNpZ24gZW1lcmdlcywgY29uY3VycmVuY3kgYW5kIGRpc3RyaWJ1dGlvbiBpc3N1ZXMgYXJlIGludHJvZHVjZWQgaW4gdGhlIGFjdGl2aXRpZXMgJmx0O2EgY2xhc3M9JnF1b3Q7ZWxlbWVudExpbmsmcXVvdDsmIzEzOyYjMTA7ICAgIGhyZWY9JnF1b3Q7cmVzb3VyY2VzL2Rlc2NyaWJlX3J1bnRpbWVfYXJjaGl0ZWN0dXJlLHs0RDM1QzAzOC1BMkQwLTQ4QjgtOUVDRC01MjcxN0ZFQUUzM0F9Lmh0bWwmcXVvdDsmIzEzOyYjMTA7ICAgIGd1aWQ9JnF1b3Q7ezREMzVDMDM4LUEyRDAtNDhCOC05RUNELTUyNzE3RkVBRTMzQX0mcXVvdDsmZ3Q7RGVzY3JpYmUgdGhlIFJ1bi10aW1lIEFyY2hpdGVjdHVyZSZsdDsvYSZndDsgYW5kICZsdDthIGNsYXNzPSZxdW90O2VsZW1lbnRMaW5rJnF1b3Q7JiMxMzsmIzEwOyAgICBocmVmPSZxdW90O3Jlc291cmNlcy9kZXNjcmliZV9kaXN0cmlidXRpb24sezZBMTEyODA4LTBBOTAtNDI3QS1CQUI5LUUxNEYzRkJGNzJCNX0uaHRtbCZxdW90OyYjMTM7JiMxMDsgICAgZ3VpZD0mcXVvdDt7NkExMTI4MDgtMEE5MC00MjdBLUJBQjktRTE0RjNGQkY3MkI1fSZxdW90OyZndDtEZXNjcmliZSBEaXN0cmlidXRpb24mbHQ7L2EmZ3Q7LCByZXNwZWN0aXZlbHkuIEFzIHRoZXNlIGlzc3VlcyBhcmUgY29uc2lkZXJlZCwmIzEzOyYjMTA7ICAgIGNoYW5nZXMgdG8gZGVzaWduIGVsZW1lbnRzIG1heSBiZSByZXF1aXJlZCB0byBzcGxpdCBiZWhhdmlvciBhY3Jvc3MgcHJvY2Vzc2VzLCB0aHJlYWRzIG9yIG5vZGVzLiYjMTM7JiMxMDsmbHQ7L3AmZ3Q7JiMxMzsmIzEwOyZsdDtwJmd0OyYjMTM7JiMxMDsgICAgQXMgdGhlIGluZGl2aWR1YWwgbW9kZWxzIGFyZSByZWZpbmVkIHRvIGluY29ycG9yYXRlIHRoZSBhcmNoaXRlY3R1cmFsIGRlY2lzaW9ucywgdGhlIHJlc3VsdHMgYXJlIGRvY3VtZW50ZWQgaW4mIzEzOyYjMTA7ICAgIHJlc3BlY3RpdmUgdmlldyBzZWN0aW9ucyBpbiB0aGUgU29mdHdhcmUgQXJjaGl0ZWN0dXJlIERvY3VtZW50IChlLmcuLCBhcyB0aGUgRGVzaWduIE1vZGVsIGlzIHJlZmluZWQsIHRoZSBMb2dpY2FsIFZpZXcmIzEzOyYjMTA7ICAgIG9mIHRoZSBTb2Z0d2FyZSBBcmNoaXRlY3R1cmUgRG9jdW1lbnQgaXMgcmVmaW5lZCwgYXMgd2VsbCkuIFRoZSByZXN1bHRpbmcgYXJjaGl0ZWN0dXJlIGlzIHJldmlld2VkLiYjMTM7JiMxMDsmbHQ7L3AmZ3Q7JiMxMzsmIzEwOyZsdDticiAvJmd0OyYjMTM7JiMxMDsmbHQ7YnIgLyZndDsiIHB1cnBvc2U9IiZsdDtwJmd0OyYjMTM7JiMxMDsgICAgUHVycG9zZSBvZiB0aGlzIGFjdGl2aXR5IGlzIHRvIGhhdmUgdGFza3MgdGhhdCBhcmUgYXNzb2NpYXRlZCB0byBvdGhlciB0YXNrcy4mIzEzOyYjMTA7Jmx0Oy9wJmd0OyYjMTM7JiMxMDsmbHQ7cCZndDsmIzEzOyYjMTA7ICAgICZhbXA7bmJzcDsmbHQ7aW1nIGhlaWdodD0mcXVvdDs3MSZxdW90OyBhbHQ9JnF1b3Q7JnF1b3Q7IHNyYz0mcXVvdDtyZXNvdXJjZXMvcnVwLmpwZyZxdW90OyB3aWR0aD0mcXVvdDsxNzYmcXVvdDsgLyZndDsmIzEzOyYjMTA7Jmx0Oy9wJmd0OyIgYWx0ZXJuYXRpdmVzPSImbHQ7cCZndDsmIzEzOyYjMTA7ICAgIEFsdGVyYW50aXZlczomIzEzOyYjMTA7Jmx0Oy9wJmd0OyYjMTM7JiMxMDsmbHQ7b2wmZ3Q7JiMxMzsmIzEwOyAgICAmbHQ7bGkmZ3Q7JiMxMzsmIzEwOyAgICAgICAgQWx0ZXIxJiMxMzsmIzEwOyAgICAmbHQ7L2xpJmd0OyYjMTM7JiMxMDsgICAgJmx0O2xpJmd0OyYjMTM7JiMxMDsgICAgICAgIEFsdGVyMiYjMTM7JiMxMDsgICAgJmx0Oy9saSZndDsmIzEzOyYjMTA7ICAgICZsdDtsaSZndDsmIzEzOyYjMTA7ICAgICAgICBBbHRlcjMmIzEzOyYjMTA7ICAgICZsdDsvbGkmZ3Q7JiMxMzsmIzEwOyZsdDsvb2wmZ3Q7IiBob3d0b1N0YWZmPSImbHQ7cCZndDsmIzEzOyYjMTA7ICAgIFRoZXNlIGFjdGl2aXRpZXMgYXJlIGJlc3QgY2FycmllZCBvdXQgYnkgYSBzbWFsbCB0ZWFtIHN0YWZmZWQgYnkgY3Jvc3MtZnVuY3Rpb25hbCB0ZWFtIG1lbWJlcnMuIElzc3VlcyB0aGF0IGFyZSYjMTM7JiMxMDsgICAgdHlwaWNhbGx5IGFyY2hpdGVjdHVyYWxseSBzaWduaWZpY2FudCBpbmNsdWRlIHVzYWJpbGl0eSwgcGVyZm9ybWFuY2UsIHNjYWxpbmcsIHByb2Nlc3MgYW5kIHRocmVhZCBzeW5jaHJvbml6YXRpb24sIGFuZCYjMTM7JiMxMDsgICAgZGlzdHJpYnV0aW9uLiBUaGUgdGVhbSBzaG91bGQgYWxzbyBpbmNsdWRlIG1lbWJlcnMgd2l0aCBkb21haW4gZXhwZXJpZW5jZSB3aG8gY2FuIGlkZW50aWZ5IGtleSBhYnN0cmFjdGlvbnMuIFRoZSB0ZWFtJiMxMzsmIzEwOyAgICBzaG91bGQgYWxzbyBoYXZlIGV4cGVyaWVuY2Ugd2l0aCBtb2RlbCBvcmdhbml6YXRpb24gYW5kIGxheWVyaW5nLiBUaGUgdGVhbSB3aWxsIG5lZWQgdG8gYmUgYWJsZSB0byBwdWxsIGFsbCB0aGVzZSYjMTM7JiMxMDsgICAgZGlzcGFyYXRlIHRocmVhZHMgaW50byBhIGNvaGVzaXZlLCBjb2hlcmVudCAoYWxiZWl0IHByZWxpbWluYXJ5KSBhcmNoaXRlY3R1cmUuJiMxMzsmIzEwOyZsdDsvcCZndDsmIzEzOyYjMTA7Jmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICBCZWNhdXNlIHRoZSBmb2N1cyBvZiB0aGUgYXJjaGl0ZWN0dXJlIGVmZm9ydCBpcyBzaGlmdGluZyB0b3dhcmQgaW1wbGVtZW50YXRpb24gaXNzdWVzLCBncmVhdGVyIGF0dGVudGlvbiBuZWVkcyB0byBiZSYjMTM7JiMxMDsgICAgcGFpZCB0byBzcGVjaWZpYyB0ZWNobm9sb2d5IGlzc3Vlcy4gVGhpcyB3aWxsIGZvcmNlIHRoZSBhcmNoaXRlY3R1cmUgdGVhbSB0byBzaGlmdCBtZW1iZXJzIG9yIGV4cGFuZCB0byBpbmNsdWRlIHBlb3BsZSYjMTM7JiMxMDsgICAgd2l0aCBkaXN0cmlidXRpb24gYW5kIGRlcGxveW1lbnQgZXhwZXJ0aXNlIChpZiB0aG9zZSBpc3N1ZXMgYXJlIGFyY2hpdGVjdHVyYWxseSBzaWduaWZpY2FudCkuIEluIG9yZGVyIHRvIHVuZGVyc3RhbmQmIzEzOyYjMTA7ICAgIHRoZSBwb3RlbnRpYWwgaW1wYWN0IG9mIHRoZSBzdHJ1Y3R1cmUgb24gdGhlIGltcGxlbWVudGF0aW9uIG1vZGVsIG9uIHRoZSBlYXNlIG9mIGludGVncmF0aW9uLCBleHBlcnRpc2UgaW4gdGhlIHNvZnR3YXJlJiMxMzsmIzEwOyAgICBidWlsZCBtYW5hZ2VtZW50IHByb2Nlc3MgaXMgdXNlZnVsIHRvIGhhdmUuJiMxMzsmIzEwOyZsdDsvcCZndDsmIzEzOyYjMTA7Jmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICBBdCB0aGUgc2FtZSB0aW1lLCBpdCBpcyBlc3NlbnRpYWwgdGhhdCB0aGUgYXJjaGl0ZWN0dXJlIHRlYW0gbm90IGJlIGNvbXBvc2VkIG9mIGEgbGFyZ2UgZXh0ZW5kZWQgdGVhbS4gQSBzdHJhdGVneSBmb3ImIzEzOyYjMTA7ICAgIGNvdW50ZXJpbmcgdGhpcyB0cmVuZCBpcyB0byByZXRhaW4gYSByZWxhdGl2ZWx5IHNtYWxsIGNvcmUgdGVhbSB3aXRoIGEgc2F0ZWxsaXRlIGdyb3VwIG9mIGV4dGVuZGVkIHRlYW0gbWVtYmVycyB0aGF0JiMxMzsmIzEwOyAgICBhcmUgYnJvdWdodCBpbiBhcyAmcXVvdDtjb25zdWx0YW50cyZxdW90OyBvbiBrZXkgaXNzdWVzJmx0O2ImZ3Q7LiZsdDsvYiZndDsgVGhpcyBzdHJ1Y3R1cmUgYWxzbyB3b3JrcyB3ZWxsIGZvciBzbWFsbGVyIHByb2plY3RzIHdoZXJlJiMxMzsmIzEwOyAgICBzcGVjaWZpYyBleHBlcnRpc2UgbWF5IGJlIGJvcnJvd2VkIG9yIGNvbnRyYWN0ZWQgZnJvbSBvdGhlciBvcmdhbml6YXRpb25zOyB0aGV5IGNhbiBiZSBicm91Z2h0IGluIGFzIHNwZWNpZmljIGlzc3VlcyYjMTM7JiMxMDsgICAgbmVlZCB0byBiZSBhZGRyZXNzZWQuJiMxMzsmIzEwOyZsdDsvcCZndDsiPgotPC9BY3Rpdml0eURlc2NyaXB0aW9uPgotPHN1cGVyQWN0aXZpdGllcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEvQWN0aXZpdHkxIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPGJyZWFrZG93bkVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MS90YXNrIGxpbmtlZCB0byB0YXNrQTEiPgotPC9icmVha2Rvd25FbGVtZW50cz4KLTxicmVha2Rvd25FbGVtZW50cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEvdGFzayBsaW5rZWQgdG8gdGFza0EyIj4KLTwvYnJlYWtkb3duRWxlbWVudHM+Ci08YnJlYWtkb3duRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxL3JvbGVEZXNjMSI+Ci08L2JyZWFrZG93bkVsZW1lbnRzPgotPGJyZWFrZG93bkVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MS9yb2xlRGVzYzIiPgotPC9icmVha2Rvd25FbGVtZW50cz4KLTxicmVha2Rvd25FbGVtZW50cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEvd3BEZXNjMSI+Ci08L2JyZWFrZG93bkVsZW1lbnRzPgotPGJyZWFrZG93bkVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MS93cERlc2MyIj4KLTwvYnJlYWtkb3duRWxlbWVudHM+Ci08YnJlYWtkb3duRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxL3dwRGVzYzMgd2l0aCBubyBsaW5rcyI+Ci08L2JyZWFrZG93bkVsZW1lbnRzPgotPGJyZWFrZG93bkVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MS9yb2xlRGVzYyB3aXRoIG5vIGxpbmtzIj4KLTwvYnJlYWtkb3duRWxlbWVudHM+Ci08YnJlYWtkb3duRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxL3Rhc2sgd2l0aCBubyBsaW5rcyI+Ci08L2JyZWFrZG93bkVsZW1lbnRzPgotPHJvYWRtYXBzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9yb2FkbWFwX0ExIj4KLTwvcm9hZG1hcHM+Ci08c3VwcG9ydGluZ01hdGVyaWFscyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvc3VwcG9ydGluZ19tYXRlcmlhbF9BMSI+Ci08L3N1cHBvcnRpbmdNYXRlcmlhbHM+Ci08Y2hlY2tsaXN0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvY2hlY2tsaXN0X0ExIj4KLTwvY2hlY2tsaXN0cz4KLTxjb25jZXB0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvY29uY2VwdF9BMSI+Ci08L2NvbmNlcHRzPgotPGNvbmNlcHRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS93aGl0ZXBhcGVyX0ExIj4KLTwvY29uY2VwdHM+Ci08ZXhhbXBsZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2V4YW1wbGVfQTEiPgotPC9leGFtcGxlcz4KLTxndWlkZWxpbmVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9ndWlkZWxpbmVfQTEiPgotPC9ndWlkZWxpbmVzPgotPHJldXNhYmxlQXNzZXRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9yZXVzYWJsZV9hc3NldF9BMSI+Ci08L3JldXNhYmxlQXNzZXRzPgotPC9BY3Rpdml0eT4KLTxUYXNrRGVzY3JpcHRvciBuYW1lPSJ0YXNrIGxpbmtlZCB0byB0YXNrQTEiIGJyaWVmRGVzY3JpcHRpb249InRhc2sgYXNzb2NpYXRlZCB0byB0YXNrQTEiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IlRhc2tfTGlua2VkX1RvX1Rhc2tBMSIgcHJlZml4PSIiIGlzUGxhbm5lZD0iZmFsc2UiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNSZXBlYXRhYmxlPSJmYWxzZSIgaXNPbmdvaW5nPSJmYWxzZSIgaXNFdmVudERyaXZlbj0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9InRhc2sgYXNzb2NpYXRlZCB0byB0YXNrQTEsX0ZydE1vRHppRWRxNXlzRk9OcjFCR1EiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iJmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICBrZXlzOiYjMTM7JiMxMDsmbHQ7L3AmZ3Q7JiMxMzsmIzEwOyZsdDtwJmd0OyYjMTM7JiMxMDsgICAga2V5MSxrZXkyJiMxMzsmIzEwOyZsdDsvcCZndDsiIHVzYWdlR3VpZGFuY2U9IiZsdDtwJmd0OyYjMTM7JiMxMDsgICAgdXNhZ2U6JiMxMzsmIzEwOyZsdDsvcCZndDsmIzEzOyYjMTA7Jmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICBUaGUgd29yayBpcyBiZXN0IGRvbmUgaW4gc2V2ZXJhbCBzZXNzaW9ucywgcGVyaGFwcyBwZXJmb3JtZWQgb3ZlciBhIGZldyBkYXlzIChvciB3ZWVrcyBhbmQgbW9udGhzIGZvciB2ZXJ5IGxhcmdlJiMxMzsmIzEwOyAgICBzeXN0ZW1zKS4gVGhlIGluaXRpYWwgZm9jdXMgd2lsbCBiZSBvbiB0aGUgYWN0aXZpdGllcyAmbHQ7YSBjbGFzcz0mcXVvdDtlbGVtZW50TGluayZxdW90OyYjMTM7JiMxMDsgICAgaHJlZj0mcXVvdDtyZXNvdXJjZXMvaWRlbnRpZnlfZGVzaWduX21lY2hhbmlzbXMse0M3QTI2QkQ3LTM4MjAtNDhEOS04MzBGLTY4NEMzQUYxNTVGOX0uaHRtbCZxdW90OyYjMTM7JiMxMDsgICAgZ3VpZD0mcXVvdDt7QzdBMjZCRDctMzgyMC00OEQ5LTgzMEYtNjg0QzNBRjE1NUY5fSZxdW90OyZndDtJZGVudGlmeSBEZXNpZ24gTWVjaGFuaXNtcyZsdDsvYSZndDsgYW5kICZsdDthIGNsYXNzPSZxdW90O2VsZW1lbnRMaW5rJnF1b3Q7JiMxMzsmIzEwOyAgICBocmVmPSZxdW90O3Jlc291cmNlcy9pZGVudGlmeV9kZXNpZ25fZWxlbWVudHNfcmVhbC10aW1lX2Rlc2lnbix7NTg2OTYzRDAtNjA3RC00RUMyLThENTMtMjkyREFGQUI5QzkyfS5odG1sJnF1b3Q7JiMxMzsmIzEwOyAgICBndWlkPSZxdW90O3s1ODY5NjNEMC02MDdELTRFQzItOEQ1My0yOTJEQUZBQjlDOTJ9JnF1b3Q7Jmd0O2lkZW50aWZ5X2Rlc2lnbl9lbGVtZW50c19yZWFsLXRpbWVfZGVzaWduJmx0Oy9hJmd0Oywgd2l0aCBhIGdyZWF0IGRlYWwgb2YmIzEzOyYjMTA7ICAgIGl0ZXJhdGlvbiB3aXRoIHRoZSAmbHQ7YSBjbGFzcz0mcXVvdDtlbGVtZW50TGluayZxdW90OyYjMTM7JiMxMDsgICAgaHJlZj0mcXVvdDtyZXNvdXJjZXMvaW5jb3Jwb3JhdGVfZGVzaWduX2VsZW1lbnRzLHs1QzY0NzE3My00RTMyLTQ1OTQtOTZBOS0yNTQ4QjQ3NzIyRkF9Lmh0bWwmcXVvdDsmIzEzOyYjMTA7ICAgIGd1aWQ9JnF1b3Q7ezVDNjQ3MTczLTRFMzItNDU5NC05NkE5LTI1NDhCNDc3MjJGQX0mcXVvdDsmZ3Q7SW5jb3Jwb3JhdGUgRXhpc3RpbmcgRGVzaWduIEVsZW1lbnRzJmx0Oy9hJmd0OyBhY3Rpdml0eSB0byBtYWtlIHN1cmUgdGhhdCBuZXcmIzEzOyYjMTA7ICAgIGVsZW1lbnRzIGRvIG5vdCBkdXBsaWNhdGUgZnVuY3Rpb25hbGl0eSBvZiBleGlzdGluZyBlbGVtZW50cy4mIzEzOyYjMTA7Jmx0Oy9wJmd0OyYjMTM7JiMxMDsmbHQ7cCZndDsmIzEzOyYjMTA7ICAgIEFzIHRoZSBkZXNpZ24gZW1lcmdlcywgY29uY3VycmVuY3kgYW5kIGRpc3RyaWJ1dGlvbiBpc3N1ZXMgYXJlIGludHJvZHVjZWQgaW4gdGhlIGFjdGl2aXRpZXMgJmx0O2EgY2xhc3M9JnF1b3Q7ZWxlbWVudExpbmsmcXVvdDsmIzEzOyYjMTA7ICAgIGhyZWY9JnF1b3Q7cmVzb3VyY2VzL2Rlc2NyaWJlX3J1bnRpbWVfYXJjaGl0ZWN0dXJlLHs0RDM1QzAzOC1BMkQwLTQ4QjgtOUVDRC01MjcxN0ZFQUUzM0F9Lmh0bWwmcXVvdDsmIzEzOyYjMTA7ICAgIGd1aWQ9JnF1b3Q7ezREMzVDMDM4LUEyRDAtNDhCOC05RUNELTUyNzE3RkVBRTMzQX0mcXVvdDsmZ3Q7RGVzY3JpYmUgdGhlIFJ1bi10aW1lIEFyY2hpdGVjdHVyZSZsdDsvYSZndDsgYW5kICZsdDthIGNsYXNzPSZxdW90O2VsZW1lbnRMaW5rJnF1b3Q7JiMxMzsmIzEwOyAgICBocmVmPSZxdW90O3Jlc291cmNlcy9kZXNjcmliZV9kaXN0cmlidXRpb24sezZBMTEyODA4LTBBOTAtNDI3QS1CQUI5LUUxNEYzRkJGNzJCNX0uaHRtbCZxdW90OyYjMTM7JiMxMDsgICAgZ3VpZD0mcXVvdDt7NkExMTI4MDgtMEE5MC00MjdBLUJBQjktRTE0RjNGQkY3MkI1fSZxdW90OyZndDtEZXNjcmliZSBEaXN0cmlidXRpb24mbHQ7L2EmZ3Q7LCByZXNwZWN0aXZlbHkuIEFzIHRoZXNlIGlzc3VlcyBhcmUgY29uc2lkZXJlZCwmIzEzOyYjMTA7ICAgIGNoYW5nZXMgdG8gZGVzaWduIGVsZW1lbnRzIG1heSBiZSByZXF1aXJlZCB0byBzcGxpdCBiZWhhdmlvciBhY3Jvc3MgcHJvY2Vzc2VzLCB0aHJlYWRzIG9yIG5vZGVzLiYjMTM7JiMxMDsmbHQ7L3AmZ3Q7JiMxMzsmIzEwOyZsdDtwJmd0OyYjMTM7JiMxMDsgICAgQXMgdGhlIGluZGl2aWR1YWwgbW9kZWxzIGFyZSByZWZpbmVkIHRvIGluY29ycG9yYXRlIHRoZSBhcmNoaXRlY3R1cmFsIGRlY2lzaW9ucywgdGhlIHJlc3VsdHMgYXJlIGRvY3VtZW50ZWQgaW4mIzEzOyYjMTA7ICAgIHJlc3BlY3RpdmUgdmlldyBzZWN0aW9ucyBpbiB0aGUgU29mdHdhcmUgQXJjaGl0ZWN0dXJlIERvY3VtZW50IChlLmcuLCBhcyB0aGUgRGVzaWduIE1vZGVsIGlzIHJlZmluZWQsIHRoZSBMb2dpY2FsIFZpZXcmIzEzOyYjMTA7ICAgIG9mIHRoZSBTb2Z0d2FyZSBBcmNoaXRlY3R1cmUgRG9jdW1lbnQgaXMgcmVmaW5lZCwgYXMgd2VsbCkuIFRoZSByZXN1bHRpbmcgYXJjaGl0ZWN0dXJlIGlzIHJldmlld2VkLiYjMTM7JiMxMDsmbHQ7L3AmZ3Q7JiMxMzsmIzEwOyZsdDtwJmd0OyYjMTM7JiMxMDsgICAgJmx0O2JyIC8mZ3Q7JiMxMzsmIzEwOyAgICAmbHQ7YnIgLyZndDsmIzEzOyYjMTA7ICAgICZhbXA7bmJzcDsmIzEzOyYjMTA7Jmx0Oy9wJmd0OyIgcmVmaW5lZERlc2NyaXB0aW9uPSImbHQ7cCZndDsmIzEzOyYjMTA7ICAgIHJlZmluZWQgZGVzY3JpcHRpb24mIzEzOyYjMTA7Jmx0Oy9wJmd0OyYjMTM7JiMxMDsmbHQ7cCZndDsmIzEzOyYjMTA7ICAgICZsdDtpbWcgaGVpZ2h0PSZxdW90OzE2JnF1b3Q7IGFsdD0mcXVvdDsmcXVvdDsgc3JjPSZxdW90O3Jlc291cmNlcy9oZWxwYm9vay5naWYmcXVvdDsgd2lkdGg9JnF1b3Q7MTYmcXVvdDsgLyZndDsmIzEzOyYjMTA7Jmx0Oy9wJmd0OyYjMTM7JiMxMDsmbHQ7cCZndDsmIzEzOyYjMTA7ICAgICZsdDthIGhyZWY9JnF1b3Q7cmVzb3VyY2VzL3BhcGVycy5odG0mcXVvdDsgdGFyZ2V0PSZxdW90O19ibGFuayZxdW90OyZndDtwYXBlcnMuaHRtJmx0Oy9hJmd0OyYjMTM7JiMxMDsmbHQ7L3AmZ3Q7Ij4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPHN1cGVyQWN0aXZpdGllcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEvdGFzayBsaW5rZWQgdG8gdGFza0ExIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPFRhc2sgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxL3Rhc2sgbGlua2VkIHRvIHRhc2tBMSI+Ci08L1Rhc2s+Ci08YWRkaXRpb25hbGx5UGVyZm9ybWVkQnkgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxL3JvbGVEZXNjMiI+Ci08L2FkZGl0aW9uYWxseVBlcmZvcm1lZEJ5PgotPG1hbmRhdG9yeUlucHV0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MS93cERlc2MxIj4KLTwvbWFuZGF0b3J5SW5wdXQ+Ci08b3V0cHV0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MS93cERlc2MyIj4KLTwvb3V0cHV0PgotPHBlcmZvcm1lZFByaW1hcmlseUJ5IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MS90YXNrIGxpbmtlZCB0byB0YXNrQTEiPgotPC9wZXJmb3JtZWRQcmltYXJpbHlCeT4KLTxzZWxlY3RlZFN0ZXBzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS90YXNrX0ExL3Rhc2tfQTEsXzdNOG5zQS1QRWRxTDJPMVBKVjljWkEvU3RlcCBBMS4xIj4KLTwvc2VsZWN0ZWRTdGVwcz4KLTxzZWxlY3RlZFN0ZXBzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS90YXNrX0ExL3Rhc2tfQTEsXzdNOG5zQS1QRWRxTDJPMVBKVjljWkEvU3RlcCBBMS4yIj4KLTwvc2VsZWN0ZWRTdGVwcz4KLTxzZWxlY3RlZFN0ZXBzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS90YXNrX0ExL3Rhc2tfQTEsXzdNOG5zQS1QRWRxTDJPMVBKVjljWkEvU3RlcCBBMS4zIj4KLTwvc2VsZWN0ZWRTdGVwcz4KLTwvVGFza0Rlc2NyaXB0b3I+Ci08VGFza0Rlc2NyaXB0b3IgbmFtZT0idGFzayBsaW5rZWQgdG8gdGFza0EyIiBicmllZkRlc2NyaXB0aW9uPSJ0YXNrIGxpbmtlZCB0byB0YXNrQTIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IlRhc2tfTGlua2VkX1RvX3Rhc2tBMiIgcHJlZml4PSIiIGlzUGxhbm5lZD0iZmFsc2UiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNSZXBlYXRhYmxlPSJmYWxzZSIgaXNPbmdvaW5nPSJmYWxzZSIgaXNFdmVudERyaXZlbj0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9InRhc2sgYXNzb2NpYXRlZCB0byB0YXNrQTIsX0x3TFFnRHppRWRxNXlzRk9OcjFCR1EiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0ia2V5czogdGFzayBhc3NvY2lhdGVkIHRvIHRhc2tBMiIgdXNhZ2VHdWlkYW5jZT0idXNhZ2U6dGFzayBhc3NvY2lhdGVkIHRvIHRhc2tBMiIgcmVmaW5lZERlc2NyaXB0aW9uPSImbHQ7cCZndDsmIzEzOyYjMTA7ICAgIHJlZmluZWQ6dGFzayBhc3NvY2lhdGVkIHRvIHRhc2tBMiYjMTM7JiMxMDsmbHQ7L3AmZ3Q7JiMxMzsmIzEwOyZsdDt0YWJsZSBjZWxsc3BhY2luZz0mcXVvdDsyJnF1b3Q7IGNlbGxwYWRkaW5nPSZxdW90OzImcXVvdDsgd2lkdGg9JnF1b3Q7MTgwJnF1b3Q7IGJvcmRlcj0mcXVvdDsxJnF1b3Q7Jmd0OyYjMTM7JiMxMDsgICAgJmx0O3Rib2R5Jmd0OyYjMTM7JiMxMDsgICAgICAgICZsdDt0ciZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgJmx0O3RoIHNjb3BlPSZxdW90O2NvbCZxdW90OyZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgICAgIDEmIzEzOyYjMTA7ICAgICAgICAgICAgJmx0Oy90aCZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgJmx0O3RoIHNjb3BlPSZxdW90O2NvbCZxdW90OyZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgICAgIHomIzEzOyYjMTA7ICAgICAgICAgICAgJmx0Oy90aCZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgJmx0O3RoIHNjb3BlPSZxdW90O2NvbCZxdW90OyZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgICAgIHomIzEzOyYjMTA7ICAgICAgICAgICAgJmx0Oy90aCZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgJmx0O3RoIHNjb3BlPSZxdW90O2NvbCZxdW90OyZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgICAgIHomIzEzOyYjMTA7ICAgICAgICAgICAgJmx0Oy90aCZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgJmx0O3RoIHNjb3BlPSZxdW90O2NvbCZxdW90OyZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgICAgIHomIzEzOyYjMTA7ICAgICAgICAgICAgJmx0Oy90aCZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgJmx0O3RoIHNjb3BlPSZxdW90O2NvbCZxdW90OyZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgICAgIHomIzEzOyYjMTA7ICAgICAgICAgICAgJmx0Oy90aCZndDsmIzEzOyYjMTA7ICAgICAgICAmbHQ7L3RyJmd0OyYjMTM7JiMxMDsgICAgICAgICZsdDt0ciZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgJmx0O3RkJmd0OyYjMTM7JiMxMDsgICAgICAgICAgICAgICAgeiYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7L3RkJmd0OyYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7dGQmZ3Q7JiMxMzsmIzEwOyAgICAgICAgICAgICAgICAyJiMxMzsmIzEwOyAgICAgICAgICAgICZsdDsvdGQmZ3Q7JiMxMzsmIzEwOyAgICAgICAgICAgICZsdDt0ZCZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgJmx0Oy90ZCZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgJmx0O3RkJmd0OyYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7L3RkJmd0OyYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7dGQmZ3Q7JiMxMzsmIzEwOyAgICAgICAgICAgICZsdDsvdGQmZ3Q7JiMxMzsmIzEwOyAgICAgICAgICAgICZsdDt0ZCZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgJmx0Oy90ZCZndDsmIzEzOyYjMTA7ICAgICAgICAmbHQ7L3RyJmd0OyYjMTM7JiMxMDsgICAgICAgICZsdDt0ciZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgJmx0O3RkJmd0OyYjMTM7JiMxMDsgICAgICAgICAgICAgICAgeiYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7L3RkJmd0OyYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7dGQmZ3Q7JiMxMzsmIzEwOyAgICAgICAgICAgICZsdDsvdGQmZ3Q7JiMxMzsmIzEwOyAgICAgICAgICAgICZsdDt0ZCZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgICAgIDMmIzEzOyYjMTA7ICAgICAgICAgICAgJmx0Oy90ZCZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgJmx0O3RkJmd0OyYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7L3RkJmd0OyYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7dGQmZ3Q7JiMxMzsmIzEwOyAgICAgICAgICAgICZsdDsvdGQmZ3Q7JiMxMzsmIzEwOyAgICAgICAgICAgICZsdDt0ZCZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgJmx0Oy90ZCZndDsmIzEzOyYjMTA7ICAgICAgICAmbHQ7L3RyJmd0OyYjMTM7JiMxMDsgICAgICAgICZsdDt0ciZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgJmx0O3RkJmd0OyYjMTM7JiMxMDsgICAgICAgICAgICAgICAgeiYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7L3RkJmd0OyYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7dGQmZ3Q7JiMxMzsmIzEwOyAgICAgICAgICAgICZsdDsvdGQmZ3Q7JiMxMzsmIzEwOyAgICAgICAgICAgICZsdDt0ZCZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgJmx0Oy90ZCZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgJmx0O3RkJmd0OyYjMTM7JiMxMDsgICAgICAgICAgICAgICAgNCYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7L3RkJmd0OyYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7dGQmZ3Q7JiMxMzsmIzEwOyAgICAgICAgICAgICZsdDsvdGQmZ3Q7JiMxMzsmIzEwOyAgICAgICAgICAgICZsdDt0ZCZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgJmx0Oy90ZCZndDsmIzEzOyYjMTA7ICAgICAgICAmbHQ7L3RyJmd0OyYjMTM7JiMxMDsgICAgICAgICZsdDt0ciZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgJmx0O3RkJmd0OyYjMTM7JiMxMDsgICAgICAgICAgICAgICAgeiYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7L3RkJmd0OyYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7dGQmZ3Q7JiMxMzsmIzEwOyAgICAgICAgICAgICZsdDsvdGQmZ3Q7JiMxMzsmIzEwOyAgICAgICAgICAgICZsdDt0ZCZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgJmx0Oy90ZCZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgJmx0O3RkJmd0OyYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7L3RkJmd0OyYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7dGQmZ3Q7JiMxMzsmIzEwOyAgICAgICAgICAgICAgICA1JiMxMzsmIzEwOyAgICAgICAgICAgICZsdDsvdGQmZ3Q7JiMxMzsmIzEwOyAgICAgICAgICAgICZsdDt0ZCZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgJmx0Oy90ZCZndDsmIzEzOyYjMTA7ICAgICAgICAmbHQ7L3RyJmd0OyYjMTM7JiMxMDsgICAgJmx0Oy90Ym9keSZndDsmIzEzOyYjMTA7Jmx0Oy90YWJsZSZndDsiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MS90YXNrIGxpbmtlZCB0byB0YXNrQTIiPgotPC9zdXBlckFjdGl2aXRpZXM+Ci08VGFzayBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEvdGFzayBsaW5rZWQgdG8gdGFza0EyIj4KLTwvVGFzaz4KLTxtYW5kYXRvcnlJbnB1dCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEvd3BEZXNjMiI+Ci08L21hbmRhdG9yeUlucHV0PgotPG91dHB1dCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEvd3BEZXNjMSI+Ci08L291dHB1dD4KLTxwZXJmb3JtZWRQcmltYXJpbHlCeSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEvdGFzayBsaW5rZWQgdG8gdGFza0EyIj4KLTwvcGVyZm9ybWVkUHJpbWFyaWx5Qnk+Ci08c2VsZWN0ZWRTdGVwcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvdGFza19BMi90YXNrX0EyLF83NU5Rd0EtUEVkcUwyTzFQSlY5Y1pBL1N0ZXAgQTIuMSI+Ci08L3NlbGVjdGVkU3RlcHM+Ci08c2VsZWN0ZWRTdGVwcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvdGFza19BMi90YXNrX0EyLF83NU5Rd0EtUEVkcUwyTzFQSlY5Y1pBL1N0ZXAgQTIuMiI+Ci08L3NlbGVjdGVkU3RlcHM+Ci08c2VsZWN0ZWRTdGVwcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvdGFza19BMi90YXNrX0EyLF83NU5Rd0EtUEVkcUwyTzFQSlY5Y1pBL1N0ZXAgQTIuMyI+Ci08L3NlbGVjdGVkU3RlcHM+Ci08L1Rhc2tEZXNjcmlwdG9yPgotPFJvbGVEZXNjcmlwdG9yIG5hbWU9InJvbGVEZXNjMSIgYnJpZWZEZXNjcmlwdGlvbj0icm9sZURlc2MxIGxpbmtlZCB0byByb2xlQTEiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9InJvbGVEZXNjMSIgcHJlZml4PSJwcmVmaXgiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJyb2xlRGVzYzEsX1Axc1VZRHppRWRxNXlzRk9OcjFCR1EiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iJmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICBrZXkgY29uc2lkZXJhdGlvbnM6JiMxMzsmIzEwOyZsdDsvcCZndDsmIzEzOyYjMTA7Jmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICBrZXkxJiMxMzsmIzEwOyZsdDsvcCZndDsmIzEzOyYjMTA7Jmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICBrZXkyJiMxMzsmIzEwOyZsdDsvcCZndDsiIHVzYWdlR3VpZGFuY2U9IiZsdDtwJmd0OyYjMTM7JiMxMDsgICAgJmx0O2ltZyBoZWlnaHQ9JnF1b3Q7NDc0JnF1b3Q7IGFsdD0mcXVvdDsmcXVvdDsgc3JjPSZxdW90O3Jlc291cmNlcy9ydXBfcGxhdGZvcm0uanBnJnF1b3Q7IHdpZHRoPSZxdW90OzUwNCZxdW90OyAvJmd0O3VzYWdlIGZvciByb2xlQTEmYW1wO25ic3A7JiMxMzsmIzEwOyZsdDsvcCZndDsiIHJlZmluZWREZXNjcmlwdGlvbj0icmVmaW5lZCBkZXNjcmlwdGlvbiBmb3Igcm9sZURlc2MxIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPHN1cGVyQWN0aXZpdGllcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEvcm9sZURlc2MxIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPFJvbGUgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxL3JvbGVEZXNjMSI+Ci08L1JvbGU+Ci08bW9kaWZpZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxL3dwRGVzYzIiPgotPC9tb2RpZmllcz4KLTwvUm9sZURlc2NyaXB0b3I+Ci08Um9sZURlc2NyaXB0b3IgbmFtZT0icm9sZURlc2MyIiBicmllZkRlc2NyaXB0aW9uPSJyb2xlRGVzYzIgbGlua2VkIHRvIHJvbGVBMiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0icm9sZURlc2MyIiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9InJvbGVEZXNjMixfUTk5a0FEemlFZHE1eXNGT05yMUJHUSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSJrZXkgY29uc2lkZXJhdGlvbiBmb3Igcm9sZUEyIiB1c2FnZUd1aWRhbmNlPSImbHQ7cCZndDsmIzEzOyYjMTA7ICAgICZsdDtpbWcgaGVpZ2h0PSZxdW90OzEyJnF1b3Q7IGFsdD0mcXVvdDsmcXVvdDsgc3JjPSZxdW90O3Jlc291cmNlcy9idWxsZXQxLmdpZiZxdW90OyB3aWR0aD0mcXVvdDsxMiZxdW90OyAvJmd0OyYjMTM7JiMxMDsmbHQ7L3AmZ3Q7JiMxMzsmIzEwOyZsdDtwJmd0OyYjMTM7JiMxMDsgICAgdXNhZ2UgZ3VpZGFuY2UgZm9yIHJvbGVBMiYjMTM7JiMxMDsmbHQ7L3AmZ3Q7IiByZWZpbmVkRGVzY3JpcHRpb249IiZsdDtwJmd0OyYjMTM7JiMxMDsgICAgcmVmaW5lZCBkZXNjcmlwdGlvbiBmb3Igcm9sZUEyJiMxMzsmIzEwOyZsdDsvcCZndDsmIzEzOyYjMTA7Jmx0O3AmZ3Q7JiMxMzsmIzEwOyZsdDsvcCZndDsmIzEzOyYjMTA7Jmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICByZWZpbmVkIGRlc2NyaXB0aW9uIGZvciByb2xlQTImIzEzOyYjMTA7Jmx0Oy9wJmd0OyI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxzdXBlckFjdGl2aXRpZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxL3JvbGVEZXNjMiI+Ci08L3N1cGVyQWN0aXZpdGllcz4KLTxSb2xlIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MS9yb2xlRGVzYzIiPgotPC9Sb2xlPgotPG1vZGlmaWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MS93cERlc2MxIj4KLTwvbW9kaWZpZXM+Ci08L1JvbGVEZXNjcmlwdG9yPgotPFdvcmtQcm9kdWN0RGVzY3JpcHRvciBuYW1lPSJ3cERlc2MxIiBicmllZkRlc2NyaXB0aW9uPSJ0aGlzIHdwIGlzIGxpbmtlZCB0byBhcnRpZmFjdCIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0id3BEZXNjMSBpcyBsaW5rZWQgdG8gYXJ0aWZhY3QiIHByZWZpeD0icHJlZml4IiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIiBhY3Rpdml0eUVudHJ5U3RhdGU9IiIgYWN0aXZpdHlFeGl0U3RhdGU9IiI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9IndwRGVzYzEsX1NVR1FnRHppRWRxNXlzRk9OcjFCR1EiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0ia2V5OndwRGVzYzEiIHVzYWdlR3VpZGFuY2U9InVzYWdlOndwRGVzYzEiIHJlZmluZWREZXNjcmlwdGlvbj0iJmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICByZWZpbmVkOiB3cERlc2MxJiMxMzsmIzEwOyZsdDsvcCZndDsiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MS93cERlc2MxIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPFdvcmtQcm9kdWN0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MS93cERlc2MxIj4KLTwvV29ya1Byb2R1Y3Q+Ci08L1dvcmtQcm9kdWN0RGVzY3JpcHRvcj4KLTxXb3JrUHJvZHVjdERlc2NyaXB0b3IgbmFtZT0id3BEZXNjMiIgYnJpZWZEZXNjcmlwdGlvbj0id3BkZXNjMiBsaW5rZWQgdG8gZGVsaXZlcmFibGUiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IndwRGVzYzIgbGlua2VkIHRvIGRlbGl2ZXJhYmxlIiBwcmVmaXg9InByZWZpeCIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSIgYWN0aXZpdHlFbnRyeVN0YXRlPSIiIGFjdGl2aXR5RXhpdFN0YXRlPSIiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJ3cERlc2MyLF9UQ3U0SUR6aUVkcTV5c0ZPTnIxQkdRIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9ImtleTp3cGRlc2MyIiB1c2FnZUd1aWRhbmNlPSJ1c2FnZTp3cGRlc2MyIiByZWZpbmVkRGVzY3JpcHRpb249InJlZmluZWQ6IHdwZGVzYzIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MS93cERlc2MyIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPFdvcmtQcm9kdWN0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MS93cERlc2MyIj4KLTwvV29ya1Byb2R1Y3Q+Ci08ZGVsaXZlcmFibGVQYXJ0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEvb3V0Y29tZV9BMSI+Ci08L2RlbGl2ZXJhYmxlUGFydHM+Ci08ZGVsaXZlcmFibGVQYXJ0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEvYXJ0aWZhY3RfQTEiPgotPC9kZWxpdmVyYWJsZVBhcnRzPgotPGRlbGl2ZXJhYmxlUGFydHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxL3N1Yl9hcnRpZmFjdF9BMS4xIj4KLTwvZGVsaXZlcmFibGVQYXJ0cz4KLTwvV29ya1Byb2R1Y3REZXNjcmlwdG9yPgotPFdvcmtQcm9kdWN0RGVzY3JpcHRvciBuYW1lPSJvdXRjb21lX0ExIiBicmllZkRlc2NyaXB0aW9uPSJPdXRjb21lIEExIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJPdXRjb21lIEExIHByZXNlbnQiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIiBhY3Rpdml0eUVudHJ5U3RhdGU9IiIgYWN0aXZpdHlFeGl0U3RhdGU9IiI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9Im91dGNvbWVfQTEsX1dyX3k4RHprRWRxNXlzRk9OcjFCR1EiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHJlZmluZWREZXNjcmlwdGlvbj0iIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPFdvcmtQcm9kdWN0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MS9vdXRjb21lX0ExIj4KLTwvV29ya1Byb2R1Y3Q+Ci08L1dvcmtQcm9kdWN0RGVzY3JpcHRvcj4KLTxXb3JrUHJvZHVjdERlc2NyaXB0b3IgbmFtZT0iYXJ0aWZhY3RfQTEiIGJyaWVmRGVzY3JpcHRpb249IkFydGlmYWN0IEExIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJBcnRpZmFjdCBBMSBwcmVzZW50IiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSIgYWN0aXZpdHlFbnRyeVN0YXRlPSIiIGFjdGl2aXR5RXhpdFN0YXRlPSIiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJhcnRpZmFjdF9BMSxfWHNYcTBEemtFZHE1eXNGT05yMUJHUSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08V29ya1Byb2R1Y3QgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxL2FydGlmYWN0X0ExIj4KLTwvV29ya1Byb2R1Y3Q+Ci08L1dvcmtQcm9kdWN0RGVzY3JpcHRvcj4KLTxXb3JrUHJvZHVjdERlc2NyaXB0b3IgbmFtZT0id3BEZXNjMyB3aXRoIG5vIGxpbmtzIiBicmllZkRlc2NyaXB0aW9uPSJicmllZjogd3BEZXNjMyB3aXRoIG5vIGxpbmtzIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJ3cERlc2MzIHdpdGggbm8gbGlua3MiIHByZWZpeD0icHJlZml4IiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIiBhY3Rpdml0eUVudHJ5U3RhdGU9IiIgYWN0aXZpdHlFeGl0U3RhdGU9IiI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9IndwRGVzYzMgd2l0aCBubyBsaW5rcyxfMXg1N0FEemtFZHE1eXNGT05yMUJHUSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSJrZXk6IHdwRGVzYzMgd2l0aCBubyBsaW5rcyIgdXNhZ2VHdWlkYW5jZT0idXNhZ2U6IHdwRGVzYzMgd2l0aCBubyBsaW5rcyIgcmVmaW5lZERlc2NyaXB0aW9uPSJyZWZpbmVkOiB3cERlc2MzIHdpdGggbm8gbGlua3MiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MS93cERlc2MzIHdpdGggbm8gbGlua3MiPgotPC9zdXBlckFjdGl2aXRpZXM+Ci08L1dvcmtQcm9kdWN0RGVzY3JpcHRvcj4KLTxSb2xlRGVzY3JpcHRvciBuYW1lPSJyb2xlRGVzYyB3aXRoIG5vIGxpbmtzIiBicmllZkRlc2NyaXB0aW9uPSJicmllZjpyb2xlRGVzYyB3aXRoIG5vIGxpbmtzIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJyb2xlRGVzYyB3aXRoIG5vIGxpbmtzIiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9InJvbGVEZXNjIHdpdGggbm8gbGlua3MsXzNfVU53RHprRWRxNXlzRk9OcjFCR1EiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0ia2V5IGNvbnNpZGVyYXRpb246cm9sZURlc2Mgd2l0aCBubyBsaW5rcyIgdXNhZ2VHdWlkYW5jZT0idXNhZ2U6cm9sZURlc2Mgd2l0aCBubyBsaW5rcyIgcmVmaW5lZERlc2NyaXB0aW9uPSJyZWZpbmVkIGRlc2NyaXB0aW9uIDogcm9sZURlc2Mgd2l0aCBubyBsaW5rcyI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxzdXBlckFjdGl2aXRpZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxL3JvbGVEZXNjIHdpdGggbm8gbGlua3MiPgotPC9zdXBlckFjdGl2aXRpZXM+Ci08L1JvbGVEZXNjcmlwdG9yPgotPFRhc2tEZXNjcmlwdG9yIG5hbWU9InRhc2sgd2l0aCBubyBsaW5rcyIgYnJpZWZEZXNjcmlwdGlvbj0iYnJpZWY6dGFzayB3aXRoIG5vIGxpbmtzIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJ0YXNrIHdpdGggbm8gbGlua3MiIHByZWZpeD0iIiBpc1BsYW5uZWQ9ImZhbHNlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzUmVwZWF0YWJsZT0iZmFsc2UiIGlzT25nb2luZz0iZmFsc2UiIGlzRXZlbnREcml2ZW49ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJ0YXNrIHdpdGggbm8gbGlua3MsXzVqSllBRHprRWRxNXlzRk9OcjFCR1EiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0ia2V5OnRhc2sgd2l0aCBubyBsaW5rcyIgdXNhZ2VHdWlkYW5jZT0idXNhZ2U6dGFzayB3aXRoIG5vIGxpbmtzIiByZWZpbmVkRGVzY3JpcHRpb249IiZsdDtwJmd0OyYjMTM7JiMxMDsgICAgcmVmaW5lZDp0YXNrIHdpdGggbm8gbGlua3MmIzEzOyYjMTA7Jmx0Oy9wJmd0OyI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxzdXBlckFjdGl2aXRpZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxL3Rhc2sgd2l0aCBubyBsaW5rcyI+Ci08L3N1cGVyQWN0aXZpdGllcz4KLTwvVGFza0Rlc2NyaXB0b3I+Ci08V29ya1Byb2R1Y3REZXNjcmlwdG9yIG5hbWU9InN1Yl9hcnRpZmFjdF9BMS4xIiBicmllZkRlc2NyaXB0aW9uPSJTdWJfQXJ0aWZhY3QgQTEuMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iU3ViX0FydGlmYWN0IEExLjEgcHJlc2VudCIgcHJlZml4PSIiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiIGFjdGl2aXR5RW50cnlTdGF0ZT0iIiBhY3Rpdml0eUV4aXRTdGF0ZT0iIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0ic3ViX2FydGlmYWN0X0ExLjEsX1JNTjdFRHpsRWRxNXlzRk9OcjFCR1EiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHJlZmluZWREZXNjcmlwdGlvbj0iIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPFdvcmtQcm9kdWN0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MS9zdWJfYXJ0aWZhY3RfQTEuMSI+Ci08L1dvcmtQcm9kdWN0PgotPC9Xb3JrUHJvZHVjdERlc2NyaXB0b3I+Ci08RGlhZ3JhbSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxHcmFwaE5vZGUgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2NvbnRhaW5lcj4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvZWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvR3JhcGhOb2RlPgotPEdyYXBoTm9kZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvY29udGFpbmVyPgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSIiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9ncmFwaEVsZW1lbnQ+Ci08ZWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9lbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9HcmFwaE5vZGU+Ci08R3JhcGhOb2RlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9jb250YWluZXI+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IiI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2dyYXBoRWxlbWVudD4KLTxlbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2VsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0dyYXBoTm9kZT4KLTxHcmFwaE5vZGUgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2NvbnRhaW5lcj4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvZWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvR3JhcGhOb2RlPgotPEdyYXBoTm9kZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvY29udGFpbmVyPgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSIiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9ncmFwaEVsZW1lbnQ+Ci08ZWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9lbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9HcmFwaE5vZGU+Ci08R3JhcGhOb2RlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9jb250YWluZXI+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IiI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2dyYXBoRWxlbWVudD4KLTxlbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2VsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0dyYXBoTm9kZT4KLTxHcmFwaE5vZGUgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2NvbnRhaW5lcj4KLTxQcm9wZXJ0eSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBrZXk9IndwQ29tcG9zaXRlVHlwZSIgdmFsdWU9IjEiPgotPC9Qcm9wZXJ0eT4KLTxHcmFwaEVkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2NvbnRhaW5lcj4KLTxhbmNob3IgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvYW5jaG9yPgotPC9HcmFwaEVkZ2U+Ci08R3JhcGhFZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9jb250YWluZXI+Ci08YW5jaG9yIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2FuY2hvcj4KLTwvR3JhcGhFZGdlPgotPEdyYXBoRWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvY29udGFpbmVyPgotPGFuY2hvciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9hbmNob3I+Ci08L0dyYXBoRWRnZT4KLTxHcmFwaEVkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2NvbnRhaW5lcj4KLTxhbmNob3IgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvYW5jaG9yPgotPC9HcmFwaEVkZ2U+Ci08R3JhcGhFZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9jb250YWluZXI+Ci08YW5jaG9yIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2FuY2hvcj4KLTwvR3JhcGhFZGdlPgotPEdyYXBoRWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvY29udGFpbmVyPgotPGFuY2hvciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9hbmNob3I+Ci08L0dyYXBoRWRnZT4KLTxHcmFwaEVkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2NvbnRhaW5lcj4KLTxhbmNob3IgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvYW5jaG9yPgotPC9HcmFwaEVkZ2U+Ci08R3JhcGhFZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9jb250YWluZXI+Ci08YW5jaG9yIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2FuY2hvcj4KLTwvR3JhcGhFZGdlPgotPEdyYXBoRWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvY29udGFpbmVyPgotPGFuY2hvciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9hbmNob3I+Ci08L0dyYXBoRWRnZT4KLTxHcmFwaEVkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2NvbnRhaW5lcj4KLTxhbmNob3IgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvYW5jaG9yPgotPC9HcmFwaEVkZ2U+Ci08R3JhcGhFZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9jb250YWluZXI+Ci08YW5jaG9yIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2FuY2hvcj4KLTwvR3JhcGhFZGdlPgotPEdyYXBoQ29ubmVjdG9yIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9ncmFwaEVsZW1lbnQ+Ci08Z3JhcGhFZGdlIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2dyYXBoRWRnZT4KLTwvR3JhcGhDb25uZWN0b3I+Ci08R3JhcGhDb25uZWN0b3IgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2dyYXBoRWxlbWVudD4KLTxncmFwaEVkZ2UgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvZ3JhcGhFZGdlPgotPC9HcmFwaENvbm5lY3Rvcj4KLTxHcmFwaENvbm5lY3RvciBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGdyYXBoRWRnZSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9ncmFwaEVkZ2U+Ci08L0dyYXBoQ29ubmVjdG9yPgotPEdyYXBoQ29ubmVjdG9yIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9ncmFwaEVsZW1lbnQ+Ci08Z3JhcGhFZGdlIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2dyYXBoRWRnZT4KLTwvR3JhcGhDb25uZWN0b3I+Ci08R3JhcGhDb25uZWN0b3IgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2dyYXBoRWxlbWVudD4KLTxncmFwaEVkZ2UgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvZ3JhcGhFZGdlPgotPC9HcmFwaENvbm5lY3Rvcj4KLTxHcmFwaENvbm5lY3RvciBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGdyYXBoRWRnZSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9ncmFwaEVkZ2U+Ci08L0dyYXBoQ29ubmVjdG9yPgotPEdyYXBoQ29ubmVjdG9yIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9ncmFwaEVsZW1lbnQ+Ci08Z3JhcGhFZGdlIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2dyYXBoRWRnZT4KLTwvR3JhcGhDb25uZWN0b3I+Ci08R3JhcGhDb25uZWN0b3IgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2dyYXBoRWxlbWVudD4KLTxncmFwaEVkZ2UgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvZ3JhcGhFZGdlPgotPC9HcmFwaENvbm5lY3Rvcj4KLTxHcmFwaENvbm5lY3RvciBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGdyYXBoRWRnZSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9ncmFwaEVkZ2U+Ci08L0dyYXBoQ29ubmVjdG9yPgotPEdyYXBoQ29ubmVjdG9yIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9ncmFwaEVsZW1lbnQ+Ci08Z3JhcGhFZGdlIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2dyYXBoRWRnZT4KLTwvR3JhcGhDb25uZWN0b3I+Ci08R3JhcGhDb25uZWN0b3IgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2dyYXBoRWxlbWVudD4KLTxncmFwaEVkZ2UgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvZ3JhcGhFZGdlPgotPC9HcmFwaENvbm5lY3Rvcj4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvZWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvR3JhcGhOb2RlPgotPEdyYXBoTm9kZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvY29udGFpbmVyPgotPFByb3BlcnR5IG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIGtleT0id3BDb21wb3NpdGVUeXBlIiB2YWx1ZT0iMiI+Ci08L1Byb3BlcnR5PgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSIiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9ncmFwaEVsZW1lbnQ+Ci08ZWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9lbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9HcmFwaE5vZGU+Ci08R3JhcGhOb2RlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9jb250YWluZXI+Ci08UHJvcGVydHkgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIga2V5PSJ3cENvbXBvc2l0ZVR5cGUiIHZhbHVlPSIxIj4KLTwvUHJvcGVydHk+Ci08R3JhcGhFZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9jb250YWluZXI+Ci08YW5jaG9yIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2FuY2hvcj4KLTwvR3JhcGhFZGdlPgotPEdyYXBoRWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvY29udGFpbmVyPgotPGFuY2hvciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9hbmNob3I+Ci08L0dyYXBoRWRnZT4KLTxHcmFwaEVkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2NvbnRhaW5lcj4KLTxhbmNob3IgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvYW5jaG9yPgotPC9HcmFwaEVkZ2U+Ci08R3JhcGhFZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9jb250YWluZXI+Ci08YW5jaG9yIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2FuY2hvcj4KLTwvR3JhcGhFZGdlPgotPEdyYXBoRWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvY29udGFpbmVyPgotPGFuY2hvciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9hbmNob3I+Ci08L0dyYXBoRWRnZT4KLTxHcmFwaENvbm5lY3RvciBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGdyYXBoRWRnZSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9ncmFwaEVkZ2U+Ci08L0dyYXBoQ29ubmVjdG9yPgotPEdyYXBoQ29ubmVjdG9yIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9ncmFwaEVsZW1lbnQ+Ci08Z3JhcGhFZGdlIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2dyYXBoRWRnZT4KLTwvR3JhcGhDb25uZWN0b3I+Ci08R3JhcGhDb25uZWN0b3IgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2dyYXBoRWxlbWVudD4KLTxncmFwaEVkZ2UgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvZ3JhcGhFZGdlPgotPC9HcmFwaENvbm5lY3Rvcj4KLTxHcmFwaENvbm5lY3RvciBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGdyYXBoRWRnZSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9ncmFwaEVkZ2U+Ci08L0dyYXBoQ29ubmVjdG9yPgotPEdyYXBoQ29ubmVjdG9yIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9ncmFwaEVsZW1lbnQ+Ci08Z3JhcGhFZGdlIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2dyYXBoRWRnZT4KLTwvR3JhcGhDb25uZWN0b3I+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IiI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2dyYXBoRWxlbWVudD4KLTxlbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2VsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0dyYXBoTm9kZT4KLTxHcmFwaE5vZGUgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2NvbnRhaW5lcj4KLTxQcm9wZXJ0eSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBrZXk9IndwQ29tcG9zaXRlVHlwZSIgdmFsdWU9IjIiPgotPC9Qcm9wZXJ0eT4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvZWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvR3JhcGhOb2RlPgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSJBY3Rpdml0eSBEZXRhaWwiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9ncmFwaEVsZW1lbnQ+Ci08ZWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9lbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9EaWFncmFtPgotPC9Qcm9jZXNzUGFja2FnZT4KLTxQcm9jZXNzUGFja2FnZSBuYW1lPSJBY3Rpdml0eTIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgZ2xvYmFsPSJmYWxzZSI+Ci08cGFyZW50UGFja2FnZSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIiPgotPC9wYXJlbnRQYWNrYWdlPgotPEFjdGl2aXR5IG5hbWU9IkFjdGl2aXR5MiIgYnJpZWZEZXNjcmlwdGlvbj0iQWN0aXZpdHkyIGNvbnRhaW5pbmQgRG5EIHRhc2tzIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJBY3Rpdml0eTIgY29udGFpbmluZCBEbkQgdGFza3MiIHByZWZpeD0iUHJlZml4IiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNSZXBlYXRhYmxlPSJmYWxzZSIgaXNPbmdvaW5nPSJmYWxzZSIgaXNFdmVudERyaXZlbj0iZmFsc2UiIHZhcmlhYmlsaXR5VHlwZT0ibmEiIGlzRW5hY3RhYmxlPSJmYWxzZSI+Ci08QWN0aXZpdHlEZXNjcmlwdGlvbiBuYW1lPSJBY3Rpdml0eTIsX0JTNmdFVHpsRWRxNXlzRk9OcjFCR1EiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iJmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICBUaGlzIFdvcmtmbG93IERldGFpbDomIzEzOyYjMTA7Jmx0Oy9wJmd0OyYjMTM7JiMxMDsmbHQ7dWwmZ3Q7JiMxMzsmIzEwOyAgICAmbHQ7bGkmZ3Q7JiMxMzsmIzEwOyAgICAgICAgUHJvdmlkZXMgdGhlIG5hdHVyYWwgJmx0O2ImZ3Q7dHJhbnNpdGlvbiBmcm9tIGFuYWx5c2lzJmx0Oy9iJmd0OyBhY3Rpdml0aWVzICZsdDtiJmd0O3RvIGRlc2lnbiZsdDsvYiZndDsgYWN0aXZpdGllcywgaWRlbnRpZnlpbmc6ICYjMTM7JiMxMDsgICAgICAgICZsdDt1bCZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgJmx0O2xpJmd0OyYjMTM7JiMxMDsgICAgICAgICAgICAgICAgYXBwcm9wcmlhdGUgZGVzaWduIGVsZW1lbnRzIGZyb20gYW5hbHlzaXMgZWxlbWVudHMmIzEzOyYjMTA7ICAgICAgICAgICAgJmx0Oy9saSZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgJmx0O2xpJmd0OyYjMTM7JiMxMDsgICAgICAgICAgICAgICAgYXBwcm9wcmlhdGUgZGVzaWduIG1lY2hhbmlzbXMgZnJvbSByZWxhdGVkIGFuYWx5c2lzIG1lY2hhbmlzbXMmIzEzOyYjMTA7ICAgICAgICAgICAgJmx0Oy9saSZndDsmIzEzOyYjMTA7ICAgICAgICAmbHQ7L3VsJmd0OyYjMTM7JiMxMDsgICAgJmx0Oy9saSZndDsmIzEzOyYjMTA7ICAgICZsdDtsaSZndDsmIzEzOyYjMTA7ICAgICAgICAmbHQ7YiZndDtEZXNjcmliZXMmbHQ7L2ImZ3Q7IHRoZSBvcmdhbml6YXRpb24gb2YgdGhlIHN5c3RlbSZhcG9zO3MgJmx0O2ImZ3Q7cnVuLXRpbWUgYW5kIGRlcGxveW1lbnQgYXJjaGl0ZWN0dXJlJmx0Oy9iJmd0OyYjMTM7JiMxMDsgICAgJmx0Oy9saSZndDsmIzEzOyYjMTA7ICAgICZsdDtsaSZndDsmIzEzOyYjMTA7ICAgICAgICAmbHQ7YiZndDtPcmdhbml6ZXMgdGhlIGltcGxlbWVudGF0aW9uIG1vZGVsJmx0Oy9iJmd0OyBzbyBhcyB0byBtYWtlIHRoZSB0cmFuc2l0aW9uIGJldHdlZW4gZGVzaWduIGFuZCBpbXBsZW1lbnRhdGlvbiBzZWFtbGVzcyYjMTM7JiMxMDsgICAgJmx0Oy9saSZndDsmIzEzOyYjMTA7ICAgICZsdDtsaSZndDsmIzEzOyYjMTA7ICAgICAgICAmbHQ7YiZndDtNYWludGFpbnMgdGhlIGNvbnNpc3RlbmN5IGFuZCBpbnRlZ3JpdHkgb2YgdGhlIGFyY2hpdGVjdHVyZSZsdDsvYiZndDssIGVuc3VyaW5nIHRoYXQ6ICYjMTM7JiMxMDsgICAgICAgICZsdDt1bCZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgJmx0O2xpJmd0OyYjMTM7JiMxMDsgICAgICAgICAgICAgICAgbmV3IGRlc2lnbiBlbGVtZW50cyBpZGVudGlmaWVkIGZvciB0aGUgY3VycmVudCBpdGVyYXRpb24gYXJlIGludGVncmF0ZWQgd2l0aCBwcmUtZXhpc3RpbmcgZGVzaWduIGVsZW1lbnRzLiYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7L2xpJmd0OyYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7bGkmZ3Q7JiMxMzsmIzEwOyAgICAgICAgICAgICAgICBtYXhpbWFsIHJlLXVzZSBvZiBhdmFpbGFibGUgY29tcG9uZW50cyBhbmQgZGVzaWduIGVsZW1lbnRzIGlzIGFjaGlldmVkIGFzIGVhcmx5IGFzIHBvc3NpYmxlIGluIHRoZSBkZXNpZ24mIzEzOyYjMTA7ICAgICAgICAgICAgICAgIGVmZm9ydC4mIzEzOyYjMTA7ICAgICAgICAgICAgJmx0Oy9saSZndDsmIzEzOyYjMTA7ICAgICAgICAmbHQ7L3VsJmd0OyYjMTM7JiMxMDsgICAgJmx0Oy9saSZndDsmIzEzOyYjMTA7Jmx0Oy91bCZndDsiIGtleUNvbnNpZGVyYXRpb25zPSImbHQ7cCZndDsmIzEzOyYjMTA7ICAgIEtleSBjb25zaWRlcmF0aW9uczomIzEzOyYjMTA7Jmx0Oy9wJmd0OyYjMTM7JiMxMDsmbHQ7dWwmZ3Q7JiMxMzsmIzEwOyAgICAmbHQ7bGkmZ3Q7JiMxMzsmIzEwOyAgICAgICAga2V5MSYjMTM7JiMxMDsgICAgJmx0Oy9saSZndDsmIzEzOyYjMTA7ICAgICZsdDtsaSZndDsmIzEzOyYjMTA7ICAgICAgICBrZXkyJiMxMzsmIzEwOyAgICAmbHQ7L2xpJmd0OyYjMTM7JiMxMDsgICAgJmx0O2xpJmd0OyYjMTM7JiMxMDsgICAgICAgIGtleTMmIzEzOyYjMTA7ICAgICZsdDsvbGkmZ3Q7JiMxMzsmIzEwOyAgICAmbHQ7bGkmZ3Q7JiMxMzsmIzEwOyAgICAgICAga2V5NCYjMTM7JiMxMDsgICAgJmx0Oy9saSZndDsmIzEzOyYjMTA7ICAgICZsdDtsaSZndDsmIzEzOyYjMTA7ICAgICAgICBrZXk1JiMxMzsmIzEwOyAgICAmbHQ7L2xpJmd0OyYjMTM7JiMxMDsgICAgJmx0O2xpJmd0OyYjMTM7JiMxMDsgICAgICAgIGtleTYmIzEzOyYjMTA7ICAgICZsdDsvbGkmZ3Q7JiMxMzsmIzEwOyAgICAmbHQ7bGkmZ3Q7JiMxMzsmIzEwOyAgICAgICAga2V5NyYjMTM7JiMxMDsgICAgJmx0Oy9saSZndDsmIzEzOyYjMTA7Jmx0Oy91bCZndDsiIHVzYWdlR3VpZGFuY2U9IiZsdDtwJmd0OyYjMTM7JiMxMDsgICAgVGhlIHdvcmsgaXMgYmVzdCBkb25lIGluIHNldmVyYWwgc2Vzc2lvbnMsIHBlcmhhcHMgcGVyZm9ybWVkIG92ZXIgYSBmZXcgZGF5cyAob3Igd2Vla3MgYW5kIG1vbnRocyBmb3IgdmVyeSBsYXJnZSYjMTM7JiMxMDsgICAgc3lzdGVtcykuIFRoZSBpbml0aWFsIGZvY3VzIHdpbGwgYmUgb24gdGhlIGFjdGl2aXRpZXMgJmx0O2EgY2xhc3M9JnF1b3Q7ZWxlbWVudExpbmsmcXVvdDsmIzEzOyYjMTA7ICAgIGhyZWY9JnF1b3Q7cmVzb3VyY2VzL2lkZW50aWZ5X2Rlc2lnbl9tZWNoYW5pc21zLHtDN0EyNkJENy0zODIwLTQ4RDktODMwRi02ODRDM0FGMTU1Rjl9Lmh0bWwmcXVvdDsmIzEzOyYjMTA7ICAgIGd1aWQ9JnF1b3Q7e0M3QTI2QkQ3LTM4MjAtNDhEOS04MzBGLTY4NEMzQUYxNTVGOX0mcXVvdDsmZ3Q7SWRlbnRpZnkgRGVzaWduIE1lY2hhbmlzbXMmbHQ7L2EmZ3Q7IGFuZCAmbHQ7YSBjbGFzcz0mcXVvdDtlbGVtZW50TGluayZxdW90OyYjMTM7JiMxMDsgICAgaHJlZj0mcXVvdDtyZXNvdXJjZXMvaWRlbnRpZnlfZGVzaWduX2VsZW1lbnRzX3JlYWwtdGltZV9kZXNpZ24sezU4Njk2M0QwLTYwN0QtNEVDMi04RDUzLTI5MkRBRkFCOUM5Mn0uaHRtbCZxdW90OyYjMTM7JiMxMDsgICAgZ3VpZD0mcXVvdDt7NTg2OTYzRDAtNjA3RC00RUMyLThENTMtMjkyREFGQUI5QzkyfSZxdW90OyZndDtpZGVudGlmeV9kZXNpZ25fZWxlbWVudHNfcmVhbC10aW1lX2Rlc2lnbiZsdDsvYSZndDssIHdpdGggYSBncmVhdCBkZWFsIG9mJiMxMzsmIzEwOyAgICBpdGVyYXRpb24gd2l0aCB0aGUgJmx0O2EgY2xhc3M9JnF1b3Q7ZWxlbWVudExpbmsmcXVvdDsmIzEzOyYjMTA7ICAgIGhyZWY9JnF1b3Q7cmVzb3VyY2VzL2luY29ycG9yYXRlX2Rlc2lnbl9lbGVtZW50cyx7NUM2NDcxNzMtNEUzMi00NTk0LTk2QTktMjU0OEI0NzcyMkZBfS5odG1sJnF1b3Q7JiMxMzsmIzEwOyAgICBndWlkPSZxdW90O3s1QzY0NzE3My00RTMyLTQ1OTQtOTZBOS0yNTQ4QjQ3NzIyRkF9JnF1b3Q7Jmd0O0luY29ycG9yYXRlIEV4aXN0aW5nIERlc2lnbiBFbGVtZW50cyZsdDsvYSZndDsgYWN0aXZpdHkgdG8gbWFrZSBzdXJlIHRoYXQgbmV3JiMxMzsmIzEwOyAgICBlbGVtZW50cyBkbyBub3QgZHVwbGljYXRlIGZ1bmN0aW9uYWxpdHkgb2YgZXhpc3RpbmcgZWxlbWVudHMuJiMxMzsmIzEwOyZsdDsvcCZndDsmIzEzOyYjMTA7Jmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICBBcyB0aGUgZGVzaWduIGVtZXJnZXMsIGNvbmN1cnJlbmN5IGFuZCBkaXN0cmlidXRpb24gaXNzdWVzIGFyZSBpbnRyb2R1Y2VkIGluIHRoZSBhY3Rpdml0aWVzICZsdDthIGNsYXNzPSZxdW90O2VsZW1lbnRMaW5rJnF1b3Q7JiMxMzsmIzEwOyAgICBocmVmPSZxdW90O3Jlc291cmNlcy9kZXNjcmliZV9ydW50aW1lX2FyY2hpdGVjdHVyZSx7NEQzNUMwMzgtQTJEMC00OEI4LTlFQ0QtNTI3MTdGRUFFMzNBfS5odG1sJnF1b3Q7JiMxMzsmIzEwOyAgICBndWlkPSZxdW90O3s0RDM1QzAzOC1BMkQwLTQ4QjgtOUVDRC01MjcxN0ZFQUUzM0F9JnF1b3Q7Jmd0O0Rlc2NyaWJlIHRoZSBSdW4tdGltZSBBcmNoaXRlY3R1cmUmbHQ7L2EmZ3Q7IGFuZCAmbHQ7YSBjbGFzcz0mcXVvdDtlbGVtZW50TGluayZxdW90OyYjMTM7JiMxMDsgICAgaHJlZj0mcXVvdDtyZXNvdXJjZXMvZGVzY3JpYmVfZGlzdHJpYnV0aW9uLHs2QTExMjgwOC0wQTkwLTQyN0EtQkFCOS1FMTRGM0ZCRjcyQjV9Lmh0bWwmcXVvdDsmIzEzOyYjMTA7ICAgIGd1aWQ9JnF1b3Q7ezZBMTEyODA4LTBBOTAtNDI3QS1CQUI5LUUxNEYzRkJGNzJCNX0mcXVvdDsmZ3Q7RGVzY3JpYmUgRGlzdHJpYnV0aW9uJmx0Oy9hJmd0OywgcmVzcGVjdGl2ZWx5LiBBcyB0aGVzZSBpc3N1ZXMgYXJlIGNvbnNpZGVyZWQsJiMxMzsmIzEwOyAgICBjaGFuZ2VzIHRvIGRlc2lnbiBlbGVtZW50cyBtYXkgYmUgcmVxdWlyZWQgdG8gc3BsaXQgYmVoYXZpb3IgYWNyb3NzIHByb2Nlc3NlcywgdGhyZWFkcyBvciBub2Rlcy4mIzEzOyYjMTA7Jmx0Oy9wJmd0OyYjMTM7JiMxMDsmbHQ7cCZndDsmIzEzOyYjMTA7ICAgIEFzIHRoZSBpbmRpdmlkdWFsIG1vZGVscyBhcmUgcmVmaW5lZCB0byBpbmNvcnBvcmF0ZSB0aGUgYXJjaGl0ZWN0dXJhbCBkZWNpc2lvbnMsIHRoZSByZXN1bHRzIGFyZSBkb2N1bWVudGVkIGluJiMxMzsmIzEwOyAgICByZXNwZWN0aXZlIHZpZXcgc2VjdGlvbnMgaW4gdGhlIFNvZnR3YXJlIEFyY2hpdGVjdHVyZSBEb2N1bWVudCAoZS5nLiwgYXMgdGhlIERlc2lnbiBNb2RlbCBpcyByZWZpbmVkLCB0aGUgTG9naWNhbCBWaWV3JiMxMzsmIzEwOyAgICBvZiB0aGUgU29mdHdhcmUgQXJjaGl0ZWN0dXJlIERvY3VtZW50IGlzIHJlZmluZWQsIGFzIHdlbGwpLiBUaGUgcmVzdWx0aW5nIGFyY2hpdGVjdHVyZSBpcyByZXZpZXdlZC4mIzEzOyYjMTA7Jmx0Oy9wJmd0OyYjMTM7JiMxMDsmbHQ7YnIgLyZndDsmIzEzOyYjMTA7Jmx0O2JyIC8mZ3Q7IiBwdXJwb3NlPSImbHQ7cCZndDsmIzEzOyYjMTA7ICAgIFB1cnBvc2Ugb2YgdGhpcyBhY3Rpdml0eSBpcyB0byBoYXZlIHRhc2tzIHRoYXQgYXJlIGFzc29jaWF0ZWQgdG8gb3RoZXIgdGFza3MuJiMxMzsmIzEwOyZsdDsvcCZndDsmIzEzOyYjMTA7Jmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICAmYW1wO25ic3A7Jmx0O2ltZyBoZWlnaHQ9JnF1b3Q7NzEmcXVvdDsgYWx0PSZxdW90OyZxdW90OyBzcmM9JnF1b3Q7cmVzb3VyY2VzL3J1cC5qcGcmcXVvdDsgd2lkdGg9JnF1b3Q7MTc2JnF1b3Q7IC8mZ3Q7JiMxMzsmIzEwOyZsdDsvcCZndDsiIGFsdGVybmF0aXZlcz0iJmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICBBbHRlcmFudGl2ZXM6JiMxMzsmIzEwOyZsdDsvcCZndDsmIzEzOyYjMTA7Jmx0O29sJmd0OyYjMTM7JiMxMDsgICAgJmx0O2xpJmd0OyYjMTM7JiMxMDsgICAgICAgIEFsdGVyMSYjMTM7JiMxMDsgICAgJmx0Oy9saSZndDsmIzEzOyYjMTA7ICAgICZsdDtsaSZndDsmIzEzOyYjMTA7ICAgICAgICBBbHRlcjImIzEzOyYjMTA7ICAgICZsdDsvbGkmZ3Q7JiMxMzsmIzEwOyAgICAmbHQ7bGkmZ3Q7JiMxMzsmIzEwOyAgICAgICAgQWx0ZXIzJiMxMzsmIzEwOyAgICAmbHQ7L2xpJmd0OyYjMTM7JiMxMDsmbHQ7L29sJmd0OyIgaG93dG9TdGFmZj0iJmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICBUaGVzZSBhY3Rpdml0aWVzIGFyZSBiZXN0IGNhcnJpZWQgb3V0IGJ5IGEgc21hbGwgdGVhbSBzdGFmZmVkIGJ5IGNyb3NzLWZ1bmN0aW9uYWwgdGVhbSBtZW1iZXJzLiBJc3N1ZXMgdGhhdCBhcmUmIzEzOyYjMTA7ICAgIHR5cGljYWxseSBhcmNoaXRlY3R1cmFsbHkgc2lnbmlmaWNhbnQgaW5jbHVkZSB1c2FiaWxpdHksIHBlcmZvcm1hbmNlLCBzY2FsaW5nLCBwcm9jZXNzIGFuZCB0aHJlYWQgc3luY2hyb25pemF0aW9uLCBhbmQmIzEzOyYjMTA7ICAgIGRpc3RyaWJ1dGlvbi4gVGhlIHRlYW0gc2hvdWxkIGFsc28gaW5jbHVkZSBtZW1iZXJzIHdpdGggZG9tYWluIGV4cGVyaWVuY2Ugd2hvIGNhbiBpZGVudGlmeSBrZXkgYWJzdHJhY3Rpb25zLiBUaGUgdGVhbSYjMTM7JiMxMDsgICAgc2hvdWxkIGFsc28gaGF2ZSBleHBlcmllbmNlIHdpdGggbW9kZWwgb3JnYW5pemF0aW9uIGFuZCBsYXllcmluZy4gVGhlIHRlYW0gd2lsbCBuZWVkIHRvIGJlIGFibGUgdG8gcHVsbCBhbGwgdGhlc2UmIzEzOyYjMTA7ICAgIGRpc3BhcmF0ZSB0aHJlYWRzIGludG8gYSBjb2hlc2l2ZSwgY29oZXJlbnQgKGFsYmVpdCBwcmVsaW1pbmFyeSkgYXJjaGl0ZWN0dXJlLiYjMTM7JiMxMDsmbHQ7L3AmZ3Q7JiMxMzsmIzEwOyZsdDtwJmd0OyYjMTM7JiMxMDsgICAgQmVjYXVzZSB0aGUgZm9jdXMgb2YgdGhlIGFyY2hpdGVjdHVyZSBlZmZvcnQgaXMgc2hpZnRpbmcgdG93YXJkIGltcGxlbWVudGF0aW9uIGlzc3VlcywgZ3JlYXRlciBhdHRlbnRpb24gbmVlZHMgdG8gYmUmIzEzOyYjMTA7ICAgIHBhaWQgdG8gc3BlY2lmaWMgdGVjaG5vbG9neSBpc3N1ZXMuIFRoaXMgd2lsbCBmb3JjZSB0aGUgYXJjaGl0ZWN0dXJlIHRlYW0gdG8gc2hpZnQgbWVtYmVycyBvciBleHBhbmQgdG8gaW5jbHVkZSBwZW9wbGUmIzEzOyYjMTA7ICAgIHdpdGggZGlzdHJpYnV0aW9uIGFuZCBkZXBsb3ltZW50IGV4cGVydGlzZSAoaWYgdGhvc2UgaXNzdWVzIGFyZSBhcmNoaXRlY3R1cmFsbHkgc2lnbmlmaWNhbnQpLiBJbiBvcmRlciB0byB1bmRlcnN0YW5kJiMxMzsmIzEwOyAgICB0aGUgcG90ZW50aWFsIGltcGFjdCBvZiB0aGUgc3RydWN0dXJlIG9uIHRoZSBpbXBsZW1lbnRhdGlvbiBtb2RlbCBvbiB0aGUgZWFzZSBvZiBpbnRlZ3JhdGlvbiwgZXhwZXJ0aXNlIGluIHRoZSBzb2Z0d2FyZSYjMTM7JiMxMDsgICAgYnVpbGQgbWFuYWdlbWVudCBwcm9jZXNzIGlzIHVzZWZ1bCB0byBoYXZlLiYjMTM7JiMxMDsmbHQ7L3AmZ3Q7JiMxMzsmIzEwOyZsdDtwJmd0OyYjMTM7JiMxMDsgICAgQXQgdGhlIHNhbWUgdGltZSwgaXQgaXMgZXNzZW50aWFsIHRoYXQgdGhlIGFyY2hpdGVjdHVyZSB0ZWFtIG5vdCBiZSBjb21wb3NlZCBvZiBhIGxhcmdlIGV4dGVuZGVkIHRlYW0uIEEgc3RyYXRlZ3kgZm9yJiMxMzsmIzEwOyAgICBjb3VudGVyaW5nIHRoaXMgdHJlbmQgaXMgdG8gcmV0YWluIGEgcmVsYXRpdmVseSBzbWFsbCBjb3JlIHRlYW0gd2l0aCBhIHNhdGVsbGl0ZSBncm91cCBvZiBleHRlbmRlZCB0ZWFtIG1lbWJlcnMgdGhhdCYjMTM7JiMxMDsgICAgYXJlIGJyb3VnaHQgaW4gYXMgJnF1b3Q7Y29uc3VsdGFudHMmcXVvdDsgb24ga2V5IGlzc3VlcyZsdDtiJmd0Oy4mbHQ7L2ImZ3Q7IFRoaXMgc3RydWN0dXJlIGFsc28gd29ya3Mgd2VsbCBmb3Igc21hbGxlciBwcm9qZWN0cyB3aGVyZSYjMTM7JiMxMDsgICAgc3BlY2lmaWMgZXhwZXJ0aXNlIG1heSBiZSBib3Jyb3dlZCBvciBjb250cmFjdGVkIGZyb20gb3RoZXIgb3JnYW5pemF0aW9uczsgdGhleSBjYW4gYmUgYnJvdWdodCBpbiBhcyBzcGVjaWZpYyBpc3N1ZXMmIzEzOyYjMTA7ICAgIG5lZWQgdG8gYmUgYWRkcmVzc2VkLiYjMTM7JiMxMDsmbHQ7L3AmZ3Q7Ij4KLTwvQWN0aXZpdHlEZXNjcmlwdGlvbj4KLTxzdXBlckFjdGl2aXRpZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyL0FjdGl2aXR5MiI+Ci08L3N1cGVyQWN0aXZpdGllcz4KLTxicmVha2Rvd25FbGVtZW50cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIvdGFza19BMSI+Ci08L2JyZWFrZG93bkVsZW1lbnRzPgotPGJyZWFrZG93bkVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5Mi9yb2xlX0ExIj4KLTwvYnJlYWtkb3duRWxlbWVudHM+Ci08YnJlYWtkb3duRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyL3JvbGVfQTIiPgotPC9icmVha2Rvd25FbGVtZW50cz4KLTxicmVha2Rvd25FbGVtZW50cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIvc3ViX2FydGlmYWN0X0ExLjEiPgotPC9icmVha2Rvd25FbGVtZW50cz4KLTxicmVha2Rvd25FbGVtZW50cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIvYXJ0aWZhY3RfQTEiPgotPC9icmVha2Rvd25FbGVtZW50cz4KLTxicmVha2Rvd25FbGVtZW50cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIvZGVsaXZlcmFibGVfQTEiPgotPC9icmVha2Rvd25FbGVtZW50cz4KLTxicmVha2Rvd25FbGVtZW50cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIvb3V0Y29tZV9BMSI+Ci08L2JyZWFrZG93bkVsZW1lbnRzPgotPGJyZWFrZG93bkVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5Mi90YXNrX0EyIj4KLTwvYnJlYWtkb3duRWxlbWVudHM+Ci08YnJlYWtkb3duRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyL2FydGlmYWN0X0EyIj4KLTwvYnJlYWtkb3duRWxlbWVudHM+Ci08YnJlYWtkb3duRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyL2RlbGl2ZXJhYmxlX0EyIj4KLTwvYnJlYWtkb3duRWxlbWVudHM+Ci08YnJlYWtkb3duRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyL291dGNvbWVfQTIiPgotPC9icmVha2Rvd25FbGVtZW50cz4KLTxyb2FkbWFwcyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvcm9hZG1hcF9CMSI+Ci08L3JvYWRtYXBzPgotPHN1cHBvcnRpbmdNYXRlcmlhbHMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL3N1cHBvcnRpbmdfbWF0ZXJpYWxfQjEiPgotPC9zdXBwb3J0aW5nTWF0ZXJpYWxzPgotPGNoZWNrbGlzdHMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL2NoZWNrbGlzdF9CMSI+Ci08L2NoZWNrbGlzdHM+Ci08Y29uY2VwdHMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL3doaXRlcGFwZXJfQjEiPgotPC9jb25jZXB0cz4KLTxjb25jZXB0cyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvY29uY2VwdF9CMSI+Ci08L2NvbmNlcHRzPgotPGV4YW1wbGVzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9leGFtcGxlX0IxIj4KLTwvZXhhbXBsZXM+Ci08Z3VpZGVsaW5lcyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvZ3VpZGVsaW5lX0IxIj4KLTwvZ3VpZGVsaW5lcz4KLTxyZXVzYWJsZUFzc2V0cyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvcmV1c2FibGVfYXNzZXRfQjEiPgotPC9yZXVzYWJsZUFzc2V0cz4KLTwvQWN0aXZpdHk+Ci08VGFza0Rlc2NyaXB0b3IgbmFtZT0idGFza19BMSIgYnJpZWZEZXNjcmlwdGlvbj0iVGFzayBBMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iVGFzayBBMSAiIHByZWZpeD0iIiBpc1BsYW5uZWQ9ImZhbHNlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzUmVwZWF0YWJsZT0iZmFsc2UiIGlzT25nb2luZz0iZmFsc2UiIGlzRXZlbnREcml2ZW49ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJ0YXNrX0ExLF8wRFJfUUVERUVkcU85TTNmdWtZQV9BIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IlRhc2sgQTEmYW1wO25ic3A7IGtleSIgdXNhZ2VHdWlkYW5jZT0iJmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICBUYXNrIEExJmFtcDtuYnNwOyBndWlkYW5jZSYjMTM7JiMxMDsmbHQ7L3AmZ3Q7JiMxMzsmIzEwOyZsdDtwJmd0OyYjMTM7JiMxMDsgICAgJmx0O2ltZyBoZWlnaHQ9JnF1b3Q7MTYmcXVvdDsgYWx0PSZxdW90OyZxdW90OyYjMTM7JiMxMDsgICAgc3JjPSZxdW90O2ZpbGU6Ly8vQzovRG9jdW1lbnRzJTIwYW5kJTIwU2V0dGluZ3MvQWRtaW5pc3RyYXRvci9JQk0vTWV0aG9kTGlicmFyaWVzL1BhcmlzL1BhcmlzL1BsdWclMjBBL2NhcGFiaWxpdHlwYXR0ZXJucy9yZXNvdXJjZXMvc3luY2VkLmdpZiZxdW90OyYjMTM7JiMxMDsgICAgIHdpZHRoPSZxdW90OzE2JnF1b3Q7IC8mZ3Q7JiMxMzsmIzEwOyZsdDsvcCZndDsmIzEzOyYjMTA7Jmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICAmbHQ7aW1nIGhlaWdodD0mcXVvdDsxNiZxdW90OyBhbHQ9JnF1b3Q7JnF1b3Q7JiMxMzsmIzEwOyAgICBzcmM9JnF1b3Q7ZmlsZTovLy9DOi9Eb2N1bWVudHMlMjBhbmQlMjBTZXR0aW5ncy9BZG1pbmlzdHJhdG9yL0lCTS9NZXRob2RMaWJyYXJpZXMvUGFyaXMvUGFyaXMvUGx1ZyUyMEEvY2FwYWJpbGl0eXBhdHRlcm5zL3Jlc291cmNlcy9oZWxwYm9vay5naWYmcXVvdDsmIzEzOyYjMTA7ICAgICB3aWR0aD0mcXVvdDsxNiZxdW90OyAvJmd0OyYjMTM7JiMxMDsmbHQ7L3AmZ3Q7IiByZWZpbmVkRGVzY3JpcHRpb249IlRhc2sgQTEmYW1wO25ic3A7IHJlZmluZWQgZGVzY3JpcHRpb24iPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5Mi90YXNrX0ExIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPFRhc2sgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyL3Rhc2tfQTEiPgotPC9UYXNrPgotPGFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5Mi9yb2xlX0EyIj4KLTwvYWRkaXRpb25hbGx5UGVyZm9ybWVkQnk+Ci08bWFuZGF0b3J5SW5wdXQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyL3N1Yl9hcnRpZmFjdF9BMS4xIj4KLTwvbWFuZGF0b3J5SW5wdXQ+Ci08bWFuZGF0b3J5SW5wdXQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyL2FydGlmYWN0X0ExIj4KLTwvbWFuZGF0b3J5SW5wdXQ+Ci08b3B0aW9uYWxJbnB1dCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIvZGVsaXZlcmFibGVfQTEiPgotPC9vcHRpb25hbElucHV0PgotPG91dHB1dCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIvb3V0Y29tZV9BMSI+Ci08L291dHB1dD4KLTxwZXJmb3JtZWRQcmltYXJpbHlCeSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIvdGFza19BMSI+Ci08L3BlcmZvcm1lZFByaW1hcmlseUJ5PgotPHNlbGVjdGVkU3RlcHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3Rhc2tfQTEvdGFza19BMSxfN004bnNBLVBFZHFMMk8xUEpWOWNaQS9TdGVwIEExLjEiPgotPC9zZWxlY3RlZFN0ZXBzPgotPHNlbGVjdGVkU3RlcHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3Rhc2tfQTEvdGFza19BMSxfN004bnNBLVBFZHFMMk8xUEpWOWNaQS9TdGVwIEExLjIiPgotPC9zZWxlY3RlZFN0ZXBzPgotPHNlbGVjdGVkU3RlcHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3Rhc2tfQTEvdGFza19BMSxfN004bnNBLVBFZHFMMk8xUEpWOWNaQS9TdGVwIEExLjMiPgotPC9zZWxlY3RlZFN0ZXBzPgotPC9UYXNrRGVzY3JpcHRvcj4KLTxSb2xlRGVzY3JpcHRvciBuYW1lPSJyb2xlX0ExIiBicmllZkRlc2NyaXB0aW9uPSJSb2xlIEExIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJSb2xlIEExIiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9InJvbGVfQTEsXzBEazZNRURFRWRxTzlNM2Z1a1lBX0EiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iUm9sZSBBMSBrZXkiIHVzYWdlR3VpZGFuY2U9IlJvbGUgQTEgZ3VpZGFuY2UiIHJlZmluZWREZXNjcmlwdGlvbj0iJmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICBSb2xlIEExIHJlZmluZWQgZGVzYyYjMTM7JiMxMDsmbHQ7L3AmZ3Q7JiMxMzsmIzEwOyZsdDtwJmd0OyYjMTM7JiMxMDsgICAgJmx0O2ltZyBoZWlnaHQ9JnF1b3Q7NzEmcXVvdDsgYWx0PSZxdW90OyZxdW90OyYjMTM7JiMxMDsgICAgc3JjPSZxdW90O2ZpbGU6Ly8vQzovRG9jdW1lbnRzJTIwYW5kJTIwU2V0dGluZ3MvQWRtaW5pc3RyYXRvci9JQk0vTWV0aG9kTGlicmFyaWVzL1BhcmlzL1BhcmlzL1BsdWclMjBBL2NhcGFiaWxpdHlwYXR0ZXJucy9yZXNvdXJjZXMvcnVwLmpwZyZxdW90OyYjMTM7JiMxMDsgICAgIHdpZHRoPSZxdW90OzE3NiZxdW90OyAvJmd0OyYjMTM7JiMxMDsmbHQ7L3AmZ3Q7Ij4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPHN1cGVyQWN0aXZpdGllcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIvcm9sZV9BMSI+Ci08L3N1cGVyQWN0aXZpdGllcz4KLTxSb2xlIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5Mi9yb2xlX0ExIj4KLTwvUm9sZT4KLTxtb2RpZmllcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIvb3V0Y29tZV9BMSI+Ci08L21vZGlmaWVzPgotPHJlc3BvbnNpYmxlRm9yIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5Mi9hcnRpZmFjdF9BMSI+Ci08L3Jlc3BvbnNpYmxlRm9yPgotPHJlc3BvbnNpYmxlRm9yIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5Mi9kZWxpdmVyYWJsZV9BMSI+Ci08L3Jlc3BvbnNpYmxlRm9yPgotPHJlc3BvbnNpYmxlRm9yIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5Mi9vdXRjb21lX0ExIj4KLTwvcmVzcG9uc2libGVGb3I+Ci08L1JvbGVEZXNjcmlwdG9yPgotPFJvbGVEZXNjcmlwdG9yIG5hbWU9InJvbGVfQTIiIGJyaWVmRGVzY3JpcHRpb249IlJvbGUgQTIgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IlJvbGUgQTIgIiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9InJvbGVfQTIsXzBEazZNVURFRWRxTzlNM2Z1a1lBX0EiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iJmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICBSb2xlIEEyIGtleSYjMTM7JiMxMDsmbHQ7L3AmZ3Q7JiMxMzsmIzEwOyZsdDtwJmd0OyYjMTM7JiMxMDsgICAgJmx0O2ltZyBoZWlnaHQ9JnF1b3Q7MTY3JnF1b3Q7IGFsdD0mcXVvdDsmcXVvdDsmIzEzOyYjMTA7ICAgIHNyYz0mcXVvdDtmaWxlOi8vL0M6L0RvY3VtZW50cyUyMGFuZCUyMFNldHRpbmdzL0FkbWluaXN0cmF0b3IvSUJNL01ldGhvZExpYnJhcmllcy9QYXJpcy9QYXJpcy9QbHVnJTIwQS9jYXBhYmlsaXR5cGF0dGVybnMvcmVzb3VyY2VzL3J1cDFfYS5naWYmcXVvdDsmIzEzOyYjMTA7ICAgICB3aWR0aD0mcXVvdDsyNiZxdW90OyAvJmd0OyYjMTM7JiMxMDsmbHQ7L3AmZ3Q7IiB1c2FnZUd1aWRhbmNlPSJSb2xlIEEyIHVzYWdlIiByZWZpbmVkRGVzY3JpcHRpb249IlJvbGUgQTIgcmVmaW5lZCBkZXNjIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPHN1cGVyQWN0aXZpdGllcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIvcm9sZV9BMiI+Ci08L3N1cGVyQWN0aXZpdGllcz4KLTxSb2xlIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5Mi9yb2xlX0EyIj4KLTwvUm9sZT4KLTxtb2RpZmllcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIvb3V0Y29tZV9BMiI+Ci08L21vZGlmaWVzPgotPC9Sb2xlRGVzY3JpcHRvcj4KLTxXb3JrUHJvZHVjdERlc2NyaXB0b3IgbmFtZT0ic3ViX2FydGlmYWN0X0ExLjEiIGJyaWVmRGVzY3JpcHRpb249IlN1Yl9BcnRpZmFjdCBBMS4xIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJTdWJfQXJ0aWZhY3QgQTEuMSBwcmVzZW50IiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSIgYWN0aXZpdHlFbnRyeVN0YXRlPSIiIGFjdGl2aXR5RXhpdFN0YXRlPSIiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJzdWJfYXJ0aWZhY3RfQTEuMSxfMER1ck1FREVFZHFPOU0zZnVrWUFfQSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5Mi9zdWJfYXJ0aWZhY3RfQTEuMSI+Ci08L3N1cGVyQWN0aXZpdGllcz4KLTxXb3JrUHJvZHVjdCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIvc3ViX2FydGlmYWN0X0ExLjEiPgotPC9Xb3JrUHJvZHVjdD4KLTwvV29ya1Byb2R1Y3REZXNjcmlwdG9yPgotPFdvcmtQcm9kdWN0RGVzY3JpcHRvciBuYW1lPSJhcnRpZmFjdF9BMSIgYnJpZWZEZXNjcmlwdGlvbj0iQXJ0aWZhY3QgQTEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IkFydGlmYWN0IEExIHByZXNlbnQiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIiBhY3Rpdml0eUVudHJ5U3RhdGU9IiIgYWN0aXZpdHlFeGl0U3RhdGU9IiI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9ImFydGlmYWN0X0ExLF8wRHVyTVVERUVkcU85TTNmdWtZQV9BIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiByZWZpbmVkRGVzY3JpcHRpb249IiI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxzdXBlckFjdGl2aXRpZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyL2FydGlmYWN0X0ExIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPFdvcmtQcm9kdWN0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5Mi9hcnRpZmFjdF9BMSI+Ci08L1dvcmtQcm9kdWN0PgotPC9Xb3JrUHJvZHVjdERlc2NyaXB0b3I+Ci08V29ya1Byb2R1Y3REZXNjcmlwdG9yIG5hbWU9ImRlbGl2ZXJhYmxlX0ExIiBicmllZkRlc2NyaXB0aW9uPSJEZWxpdmVyYWJsZSBBMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iRGVsaXZlcmFibGUgQTEgcHJlc2VudCIgcHJlZml4PSIiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiIGFjdGl2aXR5RW50cnlTdGF0ZT0iIiBhY3Rpdml0eUV4aXRTdGF0ZT0iIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0iZGVsaXZlcmFibGVfQTEsXzBEdXJNa0RFRWRxTzlNM2Z1a1lBX0EiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHJlZmluZWREZXNjcmlwdGlvbj0iIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPHN1cGVyQWN0aXZpdGllcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIvZGVsaXZlcmFibGVfQTEiPgotPC9zdXBlckFjdGl2aXRpZXM+Ci08V29ya1Byb2R1Y3QgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyL2RlbGl2ZXJhYmxlX0ExIj4KLTwvV29ya1Byb2R1Y3Q+Ci08ZGVsaXZlcmFibGVQYXJ0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIvYXJ0aWZhY3RfQTEiPgotPC9kZWxpdmVyYWJsZVBhcnRzPgotPGRlbGl2ZXJhYmxlUGFydHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyL3N1Yl9hcnRpZmFjdF9BMS4xIj4KLTwvZGVsaXZlcmFibGVQYXJ0cz4KLTxkZWxpdmVyYWJsZVBhcnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5Mi9vdXRjb21lX0ExIj4KLTwvZGVsaXZlcmFibGVQYXJ0cz4KLTwvV29ya1Byb2R1Y3REZXNjcmlwdG9yPgotPFdvcmtQcm9kdWN0RGVzY3JpcHRvciBuYW1lPSJvdXRjb21lX0ExIiBicmllZkRlc2NyaXB0aW9uPSJPdXRjb21lIEExIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJPdXRjb21lIEExIHByZXNlbnQiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIiBhY3Rpdml0eUVudHJ5U3RhdGU9IiIgYWN0aXZpdHlFeGl0U3RhdGU9IiI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9Im91dGNvbWVfQTEsXzBEdXJNMERFRWRxTzlNM2Z1a1lBX0EiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHJlZmluZWREZXNjcmlwdGlvbj0iIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPHN1cGVyQWN0aXZpdGllcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIvb3V0Y29tZV9BMSI+Ci08L3N1cGVyQWN0aXZpdGllcz4KLTxXb3JrUHJvZHVjdCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIvb3V0Y29tZV9BMSI+Ci08L1dvcmtQcm9kdWN0PgotPC9Xb3JrUHJvZHVjdERlc2NyaXB0b3I+Ci08V29ya1Byb2R1Y3REZXNjcmlwdG9yIG5hbWU9ImFydGlmYWN0X0ExIiBicmllZkRlc2NyaXB0aW9uPSJBcnRpZmFjdCBBMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iQXJ0aWZhY3QgQTEgcHJlc2VudCIgcHJlZml4PSIiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiIGFjdGl2aXR5RW50cnlTdGF0ZT0iIiBhY3Rpdml0eUV4aXRTdGF0ZT0iIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0iYXJ0aWZhY3RfQTEsXzBFVWhFRURFRWRxTzlNM2Z1a1lBX0EiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHJlZmluZWREZXNjcmlwdGlvbj0iIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPFdvcmtQcm9kdWN0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5Mi9hcnRpZmFjdF9BMSI+Ci08L1dvcmtQcm9kdWN0PgotPC9Xb3JrUHJvZHVjdERlc2NyaXB0b3I+Ci08V29ya1Byb2R1Y3REZXNjcmlwdG9yIG5hbWU9InN1Yl9hcnRpZmFjdF9BMS4xIiBicmllZkRlc2NyaXB0aW9uPSJTdWJfQXJ0aWZhY3QgQTEuMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iU3ViX0FydGlmYWN0IEExLjEgcHJlc2VudCIgcHJlZml4PSIiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiIGFjdGl2aXR5RW50cnlTdGF0ZT0iIiBhY3Rpdml0eUV4aXRTdGF0ZT0iIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0ic3ViX2FydGlmYWN0X0ExLjEsXzBFVWhFVURFRWRxTzlNM2Z1a1lBX0EiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHJlZmluZWREZXNjcmlwdGlvbj0iIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPFdvcmtQcm9kdWN0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5Mi9zdWJfYXJ0aWZhY3RfQTEuMSI+Ci08L1dvcmtQcm9kdWN0PgotPC9Xb3JrUHJvZHVjdERlc2NyaXB0b3I+Ci08V29ya1Byb2R1Y3REZXNjcmlwdG9yIG5hbWU9Im91dGNvbWVfQTEiIGJyaWVmRGVzY3JpcHRpb249Ik91dGNvbWUgQTEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9Ik91dGNvbWUgQTEgcHJlc2VudCIgcHJlZml4PSIiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiIGFjdGl2aXR5RW50cnlTdGF0ZT0iIiBhY3Rpdml0eUV4aXRTdGF0ZT0iIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0ib3V0Y29tZV9BMSxfMEVVaEVrREVFZHFPOU0zZnVrWUFfQSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08V29ya1Byb2R1Y3QgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyL291dGNvbWVfQTEiPgotPC9Xb3JrUHJvZHVjdD4KLTwvV29ya1Byb2R1Y3REZXNjcmlwdG9yPgotPFRhc2tEZXNjcmlwdG9yIG5hbWU9InRhc2tfQTIiIGJyaWVmRGVzY3JpcHRpb249IlRhc2sgQTIgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IlRhc2sgQTIgIiBwcmVmaXg9IlByZWZpeCIgaXNQbGFubmVkPSJmYWxzZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1JlcGVhdGFibGU9ImZhbHNlIiBpc09uZ29pbmc9ImZhbHNlIiBpc0V2ZW50RHJpdmVuPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0idGFza19BMixfMjg4N0VFREVFZHFPOU0zZnVrWUFfQSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSJUYXNrIEEyIGtleSIgdXNhZ2VHdWlkYW5jZT0iVGFzayBBMiBndWlkYW5jZSIgcmVmaW5lZERlc2NyaXB0aW9uPSJUYXNrIEEyIHJlZmluZWQgZGVzY3JpcHRpb24iPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5Mi90YXNrX0EyIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPFRhc2sgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyL3Rhc2tfQTIiPgotPC9UYXNrPgotPGFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5Mi9yb2xlX0ExIj4KLTwvYWRkaXRpb25hbGx5UGVyZm9ybWVkQnk+Ci08bWFuZGF0b3J5SW5wdXQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyL2FydGlmYWN0X0EyIj4KLTwvbWFuZGF0b3J5SW5wdXQ+Ci08b3B0aW9uYWxJbnB1dCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIvZGVsaXZlcmFibGVfQTIiPgotPC9vcHRpb25hbElucHV0PgotPG91dHB1dCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIvb3V0Y29tZV9BMiI+Ci08L291dHB1dD4KLTxwZXJmb3JtZWRQcmltYXJpbHlCeSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIvdGFza19BMiI+Ci08L3BlcmZvcm1lZFByaW1hcmlseUJ5PgotPHNlbGVjdGVkU3RlcHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3Rhc2tfQTIvdGFza19BMixfNzVOUXdBLVBFZHFMMk8xUEpWOWNaQS9TdGVwIEEyLjEiPgotPC9zZWxlY3RlZFN0ZXBzPgotPHNlbGVjdGVkU3RlcHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3Rhc2tfQTIvdGFza19BMixfNzVOUXdBLVBFZHFMMk8xUEpWOWNaQS9TdGVwIEEyLjIiPgotPC9zZWxlY3RlZFN0ZXBzPgotPHNlbGVjdGVkU3RlcHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3Rhc2tfQTIvdGFza19BMixfNzVOUXdBLVBFZHFMMk8xUEpWOWNaQS9TdGVwIEEyLjMiPgotPC9zZWxlY3RlZFN0ZXBzPgotPC9UYXNrRGVzY3JpcHRvcj4KLTxXb3JrUHJvZHVjdERlc2NyaXB0b3IgbmFtZT0iYXJ0aWZhY3RfQTIiIGJyaWVmRGVzY3JpcHRpb249IkFydGlmYWN0IEEyIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJBcnRpZmFjdCBBMiBwcmVzZW50IiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSIgYWN0aXZpdHlFbnRyeVN0YXRlPSIiIGFjdGl2aXR5RXhpdFN0YXRlPSIiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJhcnRpZmFjdF9BMixfMjlabkFFREVFZHFPOU0zZnVrWUFfQSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5Mi9hcnRpZmFjdF9BMiI+Ci08L3N1cGVyQWN0aXZpdGllcz4KLTxXb3JrUHJvZHVjdCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIvYXJ0aWZhY3RfQTIiPgotPC9Xb3JrUHJvZHVjdD4KLTwvV29ya1Byb2R1Y3REZXNjcmlwdG9yPgotPFdvcmtQcm9kdWN0RGVzY3JpcHRvciBuYW1lPSJkZWxpdmVyYWJsZV9BMiIgYnJpZWZEZXNjcmlwdGlvbj0iRGVsaXZlcmFibGUgQTIgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IkRlbGl2ZXJhYmxlIEEyIHByZXNlbnQiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIiBhY3Rpdml0eUVudHJ5U3RhdGU9IiIgYWN0aXZpdHlFeGl0U3RhdGU9IiI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9ImRlbGl2ZXJhYmxlX0EyLF8yOVpuQVVERUVkcU85TTNmdWtZQV9BIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiByZWZpbmVkRGVzY3JpcHRpb249IiI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxzdXBlckFjdGl2aXRpZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyL2RlbGl2ZXJhYmxlX0EyIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPFdvcmtQcm9kdWN0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5Mi9kZWxpdmVyYWJsZV9BMiI+Ci08L1dvcmtQcm9kdWN0PgotPGRlbGl2ZXJhYmxlUGFydHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyL2FydGlmYWN0X0EyIj4KLTwvZGVsaXZlcmFibGVQYXJ0cz4KLTxkZWxpdmVyYWJsZVBhcnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5Mi9vdXRjb21lX0EyIj4KLTwvZGVsaXZlcmFibGVQYXJ0cz4KLTwvV29ya1Byb2R1Y3REZXNjcmlwdG9yPgotPFdvcmtQcm9kdWN0RGVzY3JpcHRvciBuYW1lPSJvdXRjb21lX0EyIiBicmllZkRlc2NyaXB0aW9uPSJPdXRjb21lIEExIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJPdXRjb21lIEEyIHByZXNlbnQiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIiBhY3Rpdml0eUVudHJ5U3RhdGU9IiIgYWN0aXZpdHlFeGl0U3RhdGU9IiI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9Im91dGNvbWVfQTIsXzI5Wm5Ba0RFRWRxTzlNM2Z1a1lBX0EiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHJlZmluZWREZXNjcmlwdGlvbj0iIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPHN1cGVyQWN0aXZpdGllcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIvb3V0Y29tZV9BMiI+Ci08L3N1cGVyQWN0aXZpdGllcz4KLTxXb3JrUHJvZHVjdCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIvb3V0Y29tZV9BMiI+Ci08L1dvcmtQcm9kdWN0PgotPC9Xb3JrUHJvZHVjdERlc2NyaXB0b3I+Ci08V29ya1Byb2R1Y3REZXNjcmlwdG9yIG5hbWU9ImFydGlmYWN0X0EyIiBicmllZkRlc2NyaXB0aW9uPSJBcnRpZmFjdCBBMiBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iQXJ0aWZhY3QgQTIgcHJlc2VudCIgcHJlZml4PSIiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiIGFjdGl2aXR5RW50cnlTdGF0ZT0iIiBhY3Rpdml0eUV4aXRTdGF0ZT0iIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0iYXJ0aWZhY3RfQTIsXzI5c2g4RURFRWRxTzlNM2Z1a1lBX0EiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHJlZmluZWREZXNjcmlwdGlvbj0iIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPFdvcmtQcm9kdWN0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5Mi9hcnRpZmFjdF9BMiI+Ci08L1dvcmtQcm9kdWN0PgotPC9Xb3JrUHJvZHVjdERlc2NyaXB0b3I+Ci08V29ya1Byb2R1Y3REZXNjcmlwdG9yIG5hbWU9Im91dGNvbWVfQTIiIGJyaWVmRGVzY3JpcHRpb249Ik91dGNvbWUgQTEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9Ik91dGNvbWUgQTIgcHJlc2VudCIgcHJlZml4PSIiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiIGFjdGl2aXR5RW50cnlTdGF0ZT0iIiBhY3Rpdml0eUV4aXRTdGF0ZT0iIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0ib3V0Y29tZV9BMixfMjlzaDhVREVFZHFPOU0zZnVrWUFfQSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08V29ya1Byb2R1Y3QgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyL291dGNvbWVfQTIiPgotPC9Xb3JrUHJvZHVjdD4KLTwvV29ya1Byb2R1Y3REZXNjcmlwdG9yPgotPERpYWdyYW0gbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08R3JhcGhOb2RlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIiPgotPC9jb250YWluZXI+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IiI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MiI+Ci08L2dyYXBoRWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvR3JhcGhOb2RlPgotPEdyYXBoTm9kZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyIj4KLTwvY29udGFpbmVyPgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSIiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIiPgotPC9ncmFwaEVsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0dyYXBoTm9kZT4KLTxHcmFwaE5vZGUgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MiI+Ci08L2NvbnRhaW5lcj4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyIj4KLTwvZ3JhcGhFbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9HcmFwaE5vZGU+Ci08R3JhcGhOb2RlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIiPgotPC9jb250YWluZXI+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IiI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MiI+Ci08L2dyYXBoRWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvR3JhcGhOb2RlPgotPEdyYXBoTm9kZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyIj4KLTwvY29udGFpbmVyPgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSIiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIiPgotPC9ncmFwaEVsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0dyYXBoTm9kZT4KLTxHcmFwaE5vZGUgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MiI+Ci08L2NvbnRhaW5lcj4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyIj4KLTwvZ3JhcGhFbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9HcmFwaE5vZGU+Ci08R3JhcGhOb2RlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIiPgotPC9jb250YWluZXI+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IiI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MiI+Ci08L2dyYXBoRWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvR3JhcGhOb2RlPgotPEdyYXBoTm9kZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyIj4KLTwvY29udGFpbmVyPgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSIiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIiPgotPC9ncmFwaEVsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0dyYXBoTm9kZT4KLTxHcmFwaE5vZGUgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MiI+Ci08L2NvbnRhaW5lcj4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyIj4KLTwvZ3JhcGhFbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9HcmFwaE5vZGU+Ci08R3JhcGhOb2RlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIiPgotPC9jb250YWluZXI+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IiI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MiI+Ci08L2dyYXBoRWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvR3JhcGhOb2RlPgotPEdyYXBoTm9kZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyIj4KLTwvY29udGFpbmVyPgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSIiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIiPgotPC9ncmFwaEVsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0dyYXBoTm9kZT4KLTxHcmFwaE5vZGUgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MiI+Ci08L2NvbnRhaW5lcj4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyIj4KLTwvZ3JhcGhFbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9HcmFwaE5vZGU+Ci08R3JhcGhOb2RlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIiPgotPC9jb250YWluZXI+Ci08UHJvcGVydHkgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIga2V5PSJ3cENvbXBvc2l0ZVR5cGUiIHZhbHVlPSIxIj4KLTwvUHJvcGVydHk+Ci08R3JhcGhFZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIiPgotPC9jb250YWluZXI+Ci08YW5jaG9yIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MiI+Ci08L2FuY2hvcj4KLTwvR3JhcGhFZGdlPgotPEdyYXBoRWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyIj4KLTwvY29udGFpbmVyPgotPGFuY2hvciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIiPgotPC9hbmNob3I+Ci08L0dyYXBoRWRnZT4KLTxHcmFwaENvbm5lY3RvciBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyIj4KLTwvZ3JhcGhFbGVtZW50PgotPGdyYXBoRWRnZSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIiPgotPC9ncmFwaEVkZ2U+Ci08L0dyYXBoQ29ubmVjdG9yPgotPEdyYXBoQ29ubmVjdG9yIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIiPgotPC9ncmFwaEVsZW1lbnQ+Ci08Z3JhcGhFZGdlIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MiI+Ci08L2dyYXBoRWRnZT4KLTwvR3JhcGhDb25uZWN0b3I+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IiI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MiI+Ci08L2dyYXBoRWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvR3JhcGhOb2RlPgotPEdyYXBoTm9kZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyIj4KLTwvY29udGFpbmVyPgotPFByb3BlcnR5IG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIGtleT0id3BDb21wb3NpdGVUeXBlIiB2YWx1ZT0iMiI+Ci08L1Byb3BlcnR5PgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSIiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIiPgotPC9ncmFwaEVsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0dyYXBoTm9kZT4KLTxHcmFwaE5vZGUgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MiI+Ci08L2NvbnRhaW5lcj4KLTxQcm9wZXJ0eSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBrZXk9IndwQ29tcG9zaXRlVHlwZSIgdmFsdWU9IjEiPgotPC9Qcm9wZXJ0eT4KLTxHcmFwaEVkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MiI+Ci08L2NvbnRhaW5lcj4KLTxhbmNob3IgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyIj4KLTwvYW5jaG9yPgotPC9HcmFwaEVkZ2U+Ci08R3JhcGhFZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIiPgotPC9jb250YWluZXI+Ci08YW5jaG9yIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MiI+Ci08L2FuY2hvcj4KLTwvR3JhcGhFZGdlPgotPEdyYXBoQ29ubmVjdG9yIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIiPgotPC9ncmFwaEVsZW1lbnQ+Ci08Z3JhcGhFZGdlIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MiI+Ci08L2dyYXBoRWRnZT4KLTwvR3JhcGhDb25uZWN0b3I+Ci08R3JhcGhDb25uZWN0b3IgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MiI+Ci08L2dyYXBoRWxlbWVudD4KLTxncmFwaEVkZ2UgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyIj4KLTwvZ3JhcGhFZGdlPgotPC9HcmFwaENvbm5lY3Rvcj4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyIj4KLTwvZ3JhcGhFbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9HcmFwaE5vZGU+Ci08R3JhcGhOb2RlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIiPgotPC9jb250YWluZXI+Ci08UHJvcGVydHkgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIga2V5PSJ3cENvbXBvc2l0ZVR5cGUiIHZhbHVlPSIyIj4KLTwvUHJvcGVydHk+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IiI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MiI+Ci08L2dyYXBoRWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvR3JhcGhOb2RlPgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSJBY3Rpdml0eSBEZXRhaWwiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIiPgotPC9ncmFwaEVsZW1lbnQ+Ci08ZWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIiPgotPC9lbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9EaWFncmFtPgotPC9Qcm9jZXNzUGFja2FnZT4KLTxJdGVyYXRpb24gbmFtZT0iSXRlcmF0aW9uMSIgYnJpZWZEZXNjcmlwdGlvbj0iVGhpcyBpdGVyYXRpb24gY29udGFpbnMgdHdvIGFjdGl2aXRpZXMiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9Ikl0ZXJhdGlvbjEiIHByZWZpeD0iUHJlZml4IiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNSZXBlYXRhYmxlPSJmYWxzZSIgaXNPbmdvaW5nPSJ0cnVlIiBpc0V2ZW50RHJpdmVuPSJmYWxzZSIgdmFyaWFiaWxpdHlUeXBlPSJuYSIgaXNFbmFjdGFibGU9ImZhbHNlIj4KLTxBY3Rpdml0eURlc2NyaXB0aW9uIG5hbWU9Ikl0ZXJhdGlvbjEsX0VGVnJ3VHppRWRxNXlzRk9OcjFCR1EiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iJmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICBUaGlzIHdvcmtmbG93IGRldGFpbCBoYXMgdGhlIGZvbGxvd2luZyBnb2FsczomIzEzOyYjMTA7Jmx0Oy9wJmd0OyYjMTM7JiMxMDsmbHQ7dWwmZ3Q7JiMxMzsmIzEwOyAgICAmbHQ7bGkmZ3Q7JiMxMzsmIzEwOyAgICAgICAgQ3JlYXRlIGFuIGluaXRpYWwgc2tldGNoIG9mIHRoZSBhcmNoaXRlY3R1cmUgb2YgdGhlIHN5c3RlbSAmIzEzOyYjMTA7ICAgICAgICAmbHQ7dWwmZ3Q7JiMxMzsmIzEwOyAgICAgICAgICAgICZsdDtsaSZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgICAgIERlZmluZSBhbiBpbml0aWFsIHNldCBvZiBhcmNoaXRlY3R1cmFsbHkgc2lnbmlmaWNhbnQgZWxlbWVudHMgdG8gdXNlIGFzIHRoZSBiYXNpcyBmb3IgYW5hbHlzaXMmIzEzOyYjMTA7ICAgICAgICAgICAgJmx0Oy9saSZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgJmx0O2xpJmd0OyYjMTM7JiMxMDsgICAgICAgICAgICAgICAgRGVmaW5lIGFuIGluaXRpYWwgc2V0IG9mIGFuYWx5c2lzIG1lY2hhbmlzbXMmIzEzOyYjMTA7ICAgICAgICAgICAgJmx0Oy9saSZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgJmx0O2xpJmd0OyYjMTM7JiMxMDsgICAgICAgICAgICAgICAgRGVmaW5lIHRoZSBpbml0aWFsIGxheWVyaW5nIGFuZCBvcmdhbml6YXRpb24gb2YgdGhlIHN5c3RlbSYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7L2xpJmd0OyYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7bGkmZ3Q7JiMxMzsmIzEwOyAgICAgICAgICAgICAgICBEZWZpbmUgdGhlIHVzZS1jYXNlIHJlYWxpemF0aW9ucyB0byBiZSBhZGRyZXNzZWQgaW4gdGhlIGN1cnJlbnQgaXRlcmF0aW9uJiMxMzsmIzEwOyAgICAgICAgICAgICZsdDsvbGkmZ3Q7JiMxMzsmIzEwOyAgICAgICAgJmx0Oy91bCZndDsmIzEzOyYjMTA7ICAgICZsdDsvbGkmZ3Q7JiMxMzsmIzEwOyAgICAmbHQ7bGkmZ3Q7JiMxMzsmIzEwOyAgICAgICAgSWRlbnRpZnkgYW5hbHlzaXMgY2xhc3NlcyBmcm9tIHRoZSBhcmNoaXRlY3R1cmFsbHkgc2lnbmlmaWNhbnQgdXNlIGNhc2VzJiMxMzsmIzEwOyAgICAmbHQ7L2xpJmd0OyYjMTM7JiMxMDsgICAgJmx0O2xpJmd0OyYjMTM7JiMxMDsgICAgICAgIFVwZGF0ZSB0aGUgdXNlLWNhc2UgcmVhbGl6YXRpb25zIHdpdGggYW5hbHlzaXMgY2xhc3MgaW50ZXJhY3Rpb25zJiMxMzsmIzEwOyAgICAmbHQ7L2xpJmd0OyYjMTM7JiMxMDsmbHQ7L3VsJmd0OyIga2V5Q29uc2lkZXJhdGlvbnM9IiZsdDtwJmd0OyYjMTM7JiMxMDsgICAgS2V5IGNvbnNpZGVyYXRpb25zOiYjMTM7JiMxMDsmbHQ7L3AmZ3Q7JiMxMzsmIzEwOyZsdDt1bCZndDsmIzEzOyYjMTA7ICAgICZsdDtsaSZndDsmIzEzOyYjMTA7ICAgICAgICBrZXkxMSYjMTM7JiMxMDsgICAgJmx0Oy9saSZndDsmIzEzOyYjMTA7ICAgICZsdDtsaSZndDsmIzEzOyYjMTA7ICAgICAgICBrZXkyMiYjMTM7JiMxMDsgICAgJmx0Oy9saSZndDsmIzEzOyYjMTA7ICAgICZsdDtsaSZndDsmIzEzOyYjMTA7ICAgICAgICBrZXkzMyYjMTM7JiMxMDsgICAgJmx0Oy9saSZndDsmIzEzOyYjMTA7Jmx0Oy91bCZndDsiIHVzYWdlR3VpZGFuY2U9IiZsdDtwJmd0OyYjMTM7JiMxMDsgICAgVGhlIHdvcmsgaXMgYmVzdCBkb25lIGluIHNldmVyYWwgc2Vzc2lvbnMsIHBlcmhhcHMgcGVyZm9ybWVkIG92ZXIgYSBmZXcgZGF5cyAob3Igd2Vla3MgYW5kIG1vbnRocyBmb3IgdmVyeSBsYXJnZSYjMTM7JiMxMDsgICAgc3lzdGVtcyksIHdpdGggaXRlcmF0aW9uIGJldHdlZW4gJmx0O2EgY2xhc3M9JnF1b3Q7ZWxlbWVudExpbmsmcXVvdDsmIzEzOyYjMTA7ICAgIGhyZWY9JnF1b3Q7cmVzb3VyY2VzL2FyY2hpdGVjdHVyYWxfYW5hbHlzaXMsezhDQjQ4NDAyLUQ0QzUtNEUxNy1CQjMzLTUwNzMxNUNCMUJCRn0uaHRtbCZxdW90OyYjMTM7JiMxMDsgICAgZ3VpZD0mcXVvdDt7OENCNDg0MDItRDRDNS00RTE3LUJCMzMtNTA3MzE1Q0IxQkJGfSZxdW90OyZndDtBcmNoaXRlY3R1cmFsIEFuYWx5c2lzJmx0Oy9hJmd0OyBhbmQgJmx0O2EgY2xhc3M9JnF1b3Q7ZWxlbWVudExpbmsmcXVvdDsmIzEzOyYjMTA7ICAgIGhyZWY9JnF1b3Q7cmVzb3VyY2VzL3VzZV9jYXNlX2FuYWx5c2lzLHsyODAxNDYxNS1BNjJGLTQ1MkQtQjgyMS0zMEM3Q0FCMEVDNDR9Lmh0bWwmcXVvdDsmIzEzOyYjMTA7ICAgIGd1aWQ9JnF1b3Q7ezI4MDE0NjE1LUE2MkYtNDUyRC1CODIxLTMwQzdDQUIwRUM0NH0mcXVvdDsmZ3Q7VXNlLUNhc2UgQW5hbHlzaXMmbHQ7L2EmZ3Q7LiBQZXJmb3JtIGFuIGluaXRpYWwgcGFzcyBhdCB0aGUgYXJjaGl0ZWN0dXJlIGluICZsdDthJiMxMzsmIzEwOyAgICBjbGFzcz0mcXVvdDtlbGVtZW50TGluayZxdW90OyBocmVmPSZxdW90O3Jlc291cmNlcy9hcmNoaXRlY3R1cmFsX2FuYWx5c2lzLHs4Q0I0ODQwMi1ENEM1LTRFMTctQkIzMy01MDczMTVDQjFCQkZ9Lmh0bWwmcXVvdDsmIzEzOyYjMTA7ICAgIGd1aWQ9JnF1b3Q7ezhDQjQ4NDAyLUQ0QzUtNEUxNy1CQjMzLTUwNzMxNUNCMUJCRn0mcXVvdDsmZ3Q7QXJjaGl0ZWN0dXJhbCBBbmFseXNpcyZsdDsvYSZndDssIHRoZW4gY2hvb3NlIGFyY2hpdGVjdHVyYWxseSBzaWduaWZpY2FudCB1c2UmIzEzOyYjMTA7ICAgIGNhc2VzLCBwZXJmb3JtaW5nICZsdDthIGNsYXNzPSZxdW90O2VsZW1lbnRMaW5rJnF1b3Q7IGhyZWY9JnF1b3Q7cmVzb3VyY2VzL3VzZV9jYXNlX2FuYWx5c2lzLHsyODAxNDYxNS1BNjJGLTQ1MkQtQjgyMS0zMEM3Q0FCMEVDNDR9Lmh0bWwmcXVvdDsmIzEzOyYjMTA7ICAgIGd1aWQ9JnF1b3Q7ezI4MDE0NjE1LUE2MkYtNDUyRC1CODIxLTMwQzdDQUIwRUM0NH0mcXVvdDsmZ3Q7VXNlLUNhc2UgQW5hbHlzaXMmbHQ7L2EmZ3Q7IG9uIGVhY2ggb25lLiBBZnRlciAob3IgYXMpIGVhY2ggdXNlIGNhc2UgaXMmIzEzOyYjMTA7ICAgIGFuYWx5emVkLCB1cGRhdGUgdGhlIGFyY2hpdGVjdHVyZSBhcyBuZWVkZWQgdG8gcmVmbGVjdCBhZGFwdGF0aW9ucyByZXF1aXJlZCB0byBhY2NvbW1vZGF0ZSBuZXcgYmVoYXZpb3Igb2YgdGhlIHN5c3RlbSYjMTM7JiMxMDsgICAgYW5kIHRvIGFkZHJlc3MgcG90ZW50aWFsIGFyY2hpdGVjdHVyYWwgcHJvYmxlbXMgd2hpY2ggYXJlIGlkZW50aWZpZWQuJiMxMzsmIzEwOyZsdDsvcCZndDsmIzEzOyYjMTA7Jmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICBXaGVyZSB0aGUgYXJjaGl0ZWN0dXJlIGFscmVhZHkgZXhpc3RzIChlaXRoZXIgZnJvbSBhIHByaW9yIHByb2plY3Qgb3IgaXRlcmF0aW9uKSwgY2hhbmdlIHJlcXVlc3RzIG1heSBuZWVkIHRvIGJlJiMxMzsmIzEwOyAgICBjcmVhdGVkIHRvIGNoYW5nZSB0aGUgYXJjaGl0ZWN0dXJlIHRvIGFjY291bnQgZm9yIHRoZSBuZXcgYmVoYXZpb3IgdGhlIHN5c3RlbSBtdXN0IHN1cHBvcnQuIFRoZXNlIGNoYW5nZXMgbWF5IGJlIHRvIGFueSYjMTM7JiMxMDsgICAgYXJ0aWZhY3QgaW4gdGhlIHByb2Nlc3MsIGRlcGVuZGluZyBvbiB0aGUgc2NvcGUgb2YgdGhlIGNoYW5nZS4mIzEzOyYjMTA7Jmx0Oy9wJmd0OyYjMTM7JiMxMDsmbHQ7YnIgLyZndDsmIzEzOyYjMTA7Jmx0O2JyIC8mZ3Q7IiBwdXJwb3NlPSImbHQ7cCZndDsmIzEzOyYjMTA7ICAgIFB1cnBvc2U6IFRoaXMgaXRlcnRhaW9uIGlzIGNyZWF0ZWQgZm9yIHR3byBhY3Rpdml0aWVzLiYjMTM7JiMxMDsmbHQ7L3AmZ3Q7JiMxMzsmIzEwOyZsdDtwJmd0OyYjMTM7JiMxMDsgICAgJmFtcDtuYnNwOyZsdDtpbWcgaGVpZ2h0PSZxdW90OzQ3NCZxdW90OyBhbHQ9JnF1b3Q7JnF1b3Q7IHNyYz0mcXVvdDtyZXNvdXJjZXMvcnVwX3BsYXRmb3JtLmpwZyZxdW90OyB3aWR0aD0mcXVvdDs1MDQmcXVvdDsgLyZndDsmIzEzOyYjMTA7Jmx0Oy9wJmd0OyIgYWx0ZXJuYXRpdmVzPSImbHQ7cCZndDsmIzEzOyYjMTA7ICAgIEFsdGVybmF0aXZlczomIzEzOyYjMTA7Jmx0Oy9wJmd0OyYjMTM7JiMxMDsmbHQ7b2wmZ3Q7JiMxMzsmIzEwOyAgICAmbHQ7bGkmZ3Q7JiMxMzsmIzEwOyAgICAgICAgJmx0O2EgaHJlZj0mcXVvdDsuLi9yb2xlcy9yb2xlX0ExLnhtaSZxdW90OyB0YXJnZXQ9JnF1b3Q7X2JsYW5rJnF1b3Q7Jmd0O3JvbGVfQTEueG1pJmx0Oy9hJmd0OyYjMTM7JiMxMDsgICAgJmx0Oy9saSZndDsmIzEzOyYjMTA7ICAgICZsdDtsaSZndDsmIzEzOyYjMTA7ICAgICAgICAmbHQ7YSBocmVmPSZxdW90Oy4uL3Rhc2tzL3Rhc2tfQTIueG1pJnF1b3Q7IHRhcmdldD0mcXVvdDtfYmxhbmsmcXVvdDsmZ3Q7dGFza19BMi54bWkmbHQ7L2EmZ3Q7JiMxMzsmIzEwOyAgICAmbHQ7L2xpJmd0OyYjMTM7JiMxMDsmbHQ7L29sJmd0OyIgaG93dG9TdGFmZj0iJmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICBUaGVzZSBhY3Rpdml0aWVzIGFyZSBiZXN0IGNhcnJpZWQgb3V0IGJ5IGEgc21hbGwgdGVhbSBzdGFmZmVkIGJ5IGNyb3NzLWZ1bmN0aW9uYWwgdGVhbSBtZW1iZXJzLiBJc3N1ZXMgdGhhdCBhcmUmIzEzOyYjMTA7ICAgIHR5cGljYWxseSBhcmNoaXRlY3R1cmFsbHkgc2lnbmlmaWNhbnQgaW5jbHVkZSBwZXJmb3JtYW5jZSwgc2NhbGluZywgcHJvY2VzcyBhbmQgdGhyZWFkIHN5bmNocm9uaXphdGlvbiwgYW5kJiMxMzsmIzEwOyAgICBkaXN0cmlidXRpb24uIFRoZSB0ZWFtIHNob3VsZCBhbHNvIGluY2x1ZGUgbWVtYmVycyB3aXRoIGRvbWFpbiBleHBlcmllbmNlIHdobyBjYW4gaWRlbnRpZnkga2V5IGFic3RyYWN0aW9ucy4gVGhlIHRlYW0mIzEzOyYjMTA7ICAgIHNob3VsZCBhbHNvIGhhdmUgZXhwZXJpZW5jZSB3aXRoIG1vZGVsIG9yZ2FuaXphdGlvbiBhbmQgbGF5ZXJpbmcuIFRoZSB0ZWFtIHdpbGwgbmVlZCB0byBiZSBhYmxlIHRvIHB1bGwgYWxsIHRoZXNlJiMxMzsmIzEwOyAgICBkaXNwYXJhdGUgdGhyZWFkcyBpbnRvIGEgY29oZXNpdmUsIGNvaGVyZW50IChhbGJlaXQgcHJlbGltaW5hcnkpIGFyY2hpdGVjdHVyZS4mIzEzOyYjMTA7Jmx0Oy9wJmd0OyI+Ci08L0FjdGl2aXR5RGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0l0ZXJhdGlvbjEiPgotPC9zdXBlckFjdGl2aXRpZXM+Ci08YnJlYWtkb3duRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxL0FjdGl2aXR5MSI+Ci08L2JyZWFrZG93bkVsZW1lbnRzPgotPGJyZWFrZG93bkVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5Mi9BY3Rpdml0eTIiPgotPC9icmVha2Rvd25FbGVtZW50cz4KLTxyb2FkbWFwcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvcm9hZG1hcF9BMiI+Ci08L3JvYWRtYXBzPgotPHN1cHBvcnRpbmdNYXRlcmlhbHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3N1cHBvcnRpbmdfbWF0ZXJpYWxfQTIiPgotPC9zdXBwb3J0aW5nTWF0ZXJpYWxzPgotPGNoZWNrbGlzdHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2NoZWNrbGlzdF9BMiI+Ci08L2NoZWNrbGlzdHM+Ci08Y29uY2VwdHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3doaXRlcGFwZXJfQTIiPgotPC9jb25jZXB0cz4KLTxjb25jZXB0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvY29uY2VwdF9BMiI+Ci08L2NvbmNlcHRzPgotPGV4YW1wbGVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9leGFtcGxlX0EyIj4KLTwvZXhhbXBsZXM+Ci08Z3VpZGVsaW5lcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvZ3VpZGVsaW5lX0EyIj4KLTwvZ3VpZGVsaW5lcz4KLTxyZXVzYWJsZUFzc2V0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvcmV1c2FibGVfYXNzZXRfQTIiPgotPC9yZXVzYWJsZUFzc2V0cz4KLTwvSXRlcmF0aW9uPgotPERpYWdyYW0gbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IkFjdGl2aXR5IERldGFpbCI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xIj4KLTwvZ3JhcGhFbGVtZW50PgotPGVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEiPgotPC9lbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9EaWFncmFtPgotPC9Qcm9jZXNzUGFja2FnZT4KLTxQaGFzZSBuYW1lPSJQaGFzZTEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iUGhhc2UxIiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzUmVwZWF0YWJsZT0iZmFsc2UiIGlzT25nb2luZz0iZmFsc2UiIGlzRXZlbnREcml2ZW49ImZhbHNlIiB2YXJpYWJpbGl0eVR5cGU9Im5hIiBpc0VuYWN0YWJsZT0iZmFsc2UiPgotPEFjdGl2aXR5RGVzY3JpcHRpb24gbmFtZT0iUGhhc2UxLF9EYWtRY0R6aUVkcTV5c0ZPTnIxQkdRIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiBwdXJwb3NlPSIiIGFsdGVybmF0aXZlcz0iIiBob3d0b1N0YWZmPSIiPgotPC9BY3Rpdml0eURlc2NyaXB0aW9uPgotPHN1cGVyQWN0aXZpdGllcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvUGhhc2UxIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPGJyZWFrZG93bkVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0l0ZXJhdGlvbjEiPgotPC9icmVha2Rvd25FbGVtZW50cz4KLTwvUGhhc2U+Ci08RGlhZ3JhbSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iQWN0aXZpdHkgRGV0YWlsIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxIj4KLTwvZWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvRGlhZ3JhbT4KLTwvUHJvY2Vzc1BhY2thZ2U+Ci08RGlhZ3JhbSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iQWN0aXZpdHkgRGV0YWlsIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMiPgotPC9ncmFwaEVsZW1lbnQ+Ci08ZWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cyI+Ci08L2VsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0RpYWdyYW0+Ci08Q2FwYWJpbGl0eVBhdHRlcm4gbmFtZT0iQ1AxIHdpdGggYWxsIGVsZW1lbnRzIiBicmllZkRlc2NyaXB0aW9uPSJCcmllZjpDUDEgd2l0aCBhbGwgZWxlbWVudHMiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IkNQMSB3aXRoIGFsbCBlbGVtZW50cyIgcHJlZml4PSIiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1JlcGVhdGFibGU9ImZhbHNlIiBpc09uZ29pbmc9ImZhbHNlIiBpc0V2ZW50RHJpdmVuPSJmYWxzZSIgdmFyaWFiaWxpdHlUeXBlPSJuYSIgaXNFbmFjdGFibGU9ImZhbHNlIj4KLTxQcm9jZXNzRGVzY3JpcHRpb24gbmFtZT0iQ1AxIHdpdGggYWxsIGVsZW1lbnRzLF80c0N0c1R6Z0VkcTV5c0ZPTnIxQkdRIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiZsdDtwJmd0OyYjMTM7JiMxMDsgICAgVGhlIHN1YmNhdGVnb3JpZXMgb2YgcHJvY2VzcyBhcmUgZGVsaXZlcnkgcHJvY2VzcyBhbmQgY2FwYWJpbGl0eSBwYXR0ZXJuLiZhbXA7bmJzcDsgQSBkZWxpdmVyeSBwcm9jZXNzIGRlZmluZXMgYSBjb21wbGV0ZSYjMTM7JiMxMDsgICAgb3IgZW5kLXRvLWVuZCBwcm9jZXNzLiZhbXA7bmJzcDsgQSBjYXBhYmlsaXR5IHBhdHRlcm4gaXMgYSBwcm9jZXNzIGZyYWdtZW50IHVzZWQgdG8gY29tcG9zZSBhIGRlbGl2ZXJ5IHByb2Nlc3MuJiMxMzsmIzEwOyZsdDsvcCZndDsmIzEzOyYjMTA7Jmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICAmYW1wO25ic3A7JiMxMzsmIzEwOyZsdDsvcCZndDsiIGtleUNvbnNpZGVyYXRpb25zPSJUaGlzIGNhcGFiaWxpdHkgcGF0dGVybiBjYW4gYmUgdXNlZCB0byBxdWlja2x5IGNvbnN0cnVjdCBhbiBJbmNlcHRpb24gcGhhc2UgaXRlcmF0aW9uIGluIGEgZGVsaXZlcnkgcHJvY2Vzcy4mYW1wO25ic3A7IENvcHkgb3ImIzEzOyYjMTA7ZXh0ZW5kIHRoZSBwYXR0ZXJuJmFtcDtuYnNwO3JlcGVhdGVkbHkgdG8gY3JlYXRlIGFzIG1hbnkgaXRlcmF0aW9ucyBhcyBuZWNlc3NhcnkgZm9yIHRoZSBwYXJ0aWN1bGFyIGRlbGl2ZXJ5IHByb2Nlc3MuIiB1c2FnZUd1aWRhbmNlPSIiIHB1cnBvc2U9IlRoaXMgY2FwYWJpbGl0eSBwYXR0ZXJuIGNhbiBiZSB1c2VkIHRvIHF1aWNrbHkgY29uc3RydWN0IGFuIEluY2VwdGlvbiBwaGFzZSBpdGVyYXRpb24gaW4gYSBkZWxpdmVyeSBwcm9jZXNzLiZhbXA7bmJzcDsgQ29weSBvciYjMTM7JiMxMDtleHRlbmQgdGhlIHBhdHRlcm4mYW1wO25ic3A7cmVwZWF0ZWRseSB0byBjcmVhdGUgYXMgbWFueSBpdGVyYXRpb25zIGFzIG5lY2Vzc2FyeSBmb3IgdGhlIHBhcnRpY3VsYXIgZGVsaXZlcnkgcHJvY2Vzcy4gJmx0O2JyIC8mZ3Q7JiMxMzsmIzEwOyZsdDticiAvJmd0OyIgYWx0ZXJuYXRpdmVzPSImbHQ7cCZndDsmIzEzOyYjMTA7ICAgIFRvIGV4cGxhaW4gdGhlIHdvcmsgaW52b2x2ZWQgaW4gdGhlIEFuYWx5c2lzIGFuZCBEZXNpZ24gZGlzY2lwbGluZSwgdGhlIGFjdGl2aXRpZXMgYW5kIHdvcmsgcHJvZHVjdHMgYXJlIG9yZ2FuaXplZCBpbnRvJiMxMzsmIzEwOyAgICBhIGNhcGFiaWxpdHkgcGF0dGVybiBmb3IgdGhlIGRpc2NpcGxpbmUuJiMxMzsmIzEwOyZsdDsvcCZndDsmIzEzOyYjMTA7Jmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICBJbiB0aGUgSW5jZXB0aW9uIFBoYXNlLCBhbmFseXNpcyBhbmQgZGVzaWduIGlzIGNvbmNlcm5lZCB3aXRoIGVzdGFibGlzaGluZyB3aGV0aGVyIHRoZSBzeXN0ZW0gYXMgZW52aXNpb25lZCBpcyYjMTM7JiMxMDsgICAgZmVhc2libGUsIGFuZCB3aXRoIGFzc2Vzc2luZyBwb3RlbnRpYWwgdGVjaG5vbG9naWVzIGZvciB0aGUgc29sdXRpb24gKGluICZsdDthIGhyZWY9JnF1b3Q7cmVzb3VyY2VzL3dmc19hcmNoc3luLmh0bSZxdW90OyZndDsmbHQ7Zm9udCYjMTM7JiMxMDsgICAgY29sb3I9JnF1b3Q7IzAwMDBmZiZxdW90OyZndDtQZXJmb3JtIEFyY2hpdGVjdHVyYWwgU3ludGhlc2lzJmx0Oy9mb250Jmd0OyZsdDsvYSZndDspLiBJZiBpdCBpcyBmZWx0IHRoYXQgbGl0dGxlIHJpc2sgYXR0YWNoZXMgdG8gdGhlIGRldmVsb3BtZW50JiMxMzsmIzEwOyAgICAoYmVjYXVzZSwgZm9yIGV4YW1wbGUsIHRoZSBkb21haW4gaXMgd2VsbCB1bmRlcnN0b29kLCB0aGUgc3lzdGVtIGlzIG5vdCBub3ZlbCwgYW5kIHNvIG9uKSB0aGVuIHRoaXMgd29ya2Zsb3cgZGV0YWlsIG1heSYjMTM7JiMxMDsgICAgYmUgb21pdHRlZC4mIzEzOyYjMTA7Jmx0Oy9wJmd0OyYjMTM7JiMxMDsmbHQ7cCZndDsmIzEzOyYjMTA7ICAgIFRoZSBlYXJseSBFbGFib3JhdGlvbiBQaGFzZSBmb2N1c2VzIG9uIGNyZWF0aW5nIGFuIGluaXRpYWwgYXJjaGl0ZWN0dXJlIGZvciB0aGUgc3lzdGVtICggJmx0O2EmIzEzOyYjMTA7ICAgIGhyZWY9JnF1b3Q7cmVzb3VyY2VzL3dmc19hbmQxLmh0bSZxdW90OyZndDsmbHQ7Zm9udCBjb2xvcj0mcXVvdDsjMDAwMGZmJnF1b3Q7Jmd0O0RlZmluZSBhIENhbmRpZGF0ZSBBcmNoaXRlY3R1cmUmbHQ7L2ZvbnQmZ3Q7Jmx0Oy9hJmd0OykgdG8gcHJvdmlkZSBhIHN0YXJ0aW5nJiMxMzsmIzEwOyAgICBwb2ludCBmb3IgdGhlIG1haW4gYW5hbHlzaXMgd29yay4gSWYgdGhlIGFyY2hpdGVjdHVyZSBhbHJlYWR5IGV4aXN0cyAoZWl0aGVyIGJlY2F1c2UgaXQgd2FzIHByb2R1Y2VkIGluIHByZXZpb3VzJiMxMzsmIzEwOyAgICBpdGVyYXRpb25zLCBpbiBwcmV2aW91cyBwcm9qZWN0cywgb3IgaXMgb2J0YWluZWQgZnJvbSBhbiBhcHBsaWNhdGlvbiBmcmFtZXdvcmspLCB0aGUgZm9jdXMgb2YgdGhlIHdvcmsgY2hhbmdlcyB0byYjMTM7JiMxMDsgICAgcmVmaW5pbmcgdGhlIGFyY2hpdGVjdHVyZSAoICZsdDthIGhyZWY9JnF1b3Q7cmVzb3VyY2VzL3dmc19hbmQyLmh0bSZxdW90OyZndDsmbHQ7Zm9udCBjb2xvcj0mcXVvdDsjMDAwMGZmJnF1b3Q7Jmd0O1JlZmluZSB0aGUgQXJjaGl0ZWN0dXJlJmx0Oy9mb250Jmd0OyZsdDsvYSZndDspJiMxMzsmIzEwOyAgICBhbmQgYW5hbHl6aW5nIGJlaGF2aW9yIGFuZCBjcmVhdGluZyBhbiBpbml0aWFsIHNldCBvZiBlbGVtZW50cyB3aGljaCBwcm92aWRlIHRoZSBhcHByb3ByaWF0ZSBiZWhhdmlvciAoICZsdDthJiMxMzsmIzEwOyAgICBocmVmPSZxdW90O3Jlc291cmNlcy93ZnNfYW5kMy5odG0mcXVvdDsmZ3Q7Jmx0O2ZvbnQgY29sb3I9JnF1b3Q7IzAwMDBmZiZxdW90OyZndDtBbmFseXplIEJlaGF2aW9yJmx0Oy9mb250Jmd0OyZsdDsvYSZndDspLiYjMTM7JiMxMDsmbHQ7L3AmZ3Q7JiMxMzsmIzEwOyZsdDtwJmd0OyYjMTM7JiMxMDsgICAgQWZ0ZXIgdGhlIGluaXRpYWwgZWxlbWVudHMgYXJlIGlkZW50aWZpZWQsIHRoZXkgYXJlIGZ1cnRoZXIgcmVmaW5lZC4gJmx0O2EgaHJlZj0mcXVvdDtyZXNvdXJjZXMvd2ZzX2FuZDQuaHRtJnF1b3Q7Jmd0OyZsdDtmb250JiMxMzsmIzEwOyAgICBjb2xvcj0mcXVvdDsjMDAwMGZmJnF1b3Q7Jmd0O0Rlc2lnbiBDb21wb25lbnRzJmx0Oy9mb250Jmd0OyZsdDsvYSZndDsgcHJvZHVjZSBhIHNldCBvZiBjb21wb25lbnRzIHdoaWNoIHByb3ZpZGUgdGhlIGFwcHJvcHJpYXRlIGJlaGF2aW9yIHRvJiMxMzsmIzEwOyAgICBzYXRpc2Z5IHRoZSByZXF1aXJlbWVudHMgb24gdGhlIHN5c3RlbS4gSWYgdGhlIHN5c3RlbSBpbmNsdWRlcyBhIGRhdGFiYXNlLCB0aGVuICZsdDthIGhyZWY9JnF1b3Q7cmVzb3VyY2VzL3dmc19hbmQ3Lmh0bSZxdW90OyZndDsmbHQ7Zm9udCYjMTM7JiMxMDsgICAgY29sb3I9JnF1b3Q7IzAwMDBmZiZxdW90OyZndDtEZXNpZ24gdGhlIERhdGFiYXNlJmx0Oy9mb250Jmd0OyZsdDsvYSZndDsgb2NjdXJzIGluIHBhcmFsbGVsLiBUaGUgcmVzdWx0IGlzIGFuIGluaXRpYWwgc2V0IG9mIGNvbXBvbmVudHMgd2hpY2ggYXJlJiMxMzsmIzEwOyAgICBmdXJ0aGVyIHJlZmluZWQgaW4gJmx0O2EgaHJlZj0mcXVvdDtyZXNvdXJjZXMvd2ZkX2ltcC5odG0mcXVvdDsmZ3Q7Jmx0O2ZvbnQgY29sb3I9JnF1b3Q7IzAwMDBmZiZxdW90OyZndDtJbXBsZW1lbnRhdGlvbiZsdDsvZm9udCZndDsmbHQ7L2EmZ3Q7LiZsdDticiAvJmd0OyYjMTM7JiMxMDsmbHQ7L3AmZ3Q7JiMxMzsmIzEwOyZhbXA7bmJzcDsmbHQ7YnIgLyZndDsmIzEzOyYjMTA7Jmx0O2JyIC8mZ3Q7IiBob3d0b1N0YWZmPSImbHQ7cCZndDsmIzEzOyYjMTA7ICAgIFRvIGV4cGxhaW4gdGhlIHdvcmsgaW52b2x2ZWQgaW4gdGhlIEFuYWx5c2lzIGFuZCBEZXNpZ24gZGlzY2lwbGluZSwgdGhlIGFjdGl2aXRpZXMgYW5kIHdvcmsgcHJvZHVjdHMgYXJlIG9yZ2FuaXplZCBpbnRvJiMxMzsmIzEwOyAgICBhIGNhcGFiaWxpdHkgcGF0dGVybiBmb3IgdGhlIGRpc2NpcGxpbmUuJiMxMzsmIzEwOyZsdDsvcCZndDsmIzEzOyYjMTA7Jmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICBJbiB0aGUgSW5jZXB0aW9uIFBoYXNlLCBhbmFseXNpcyBhbmQgZGVzaWduIGlzIGNvbmNlcm5lZCB3aXRoIGVzdGFibGlzaGluZyB3aGV0aGVyIHRoZSBzeXN0ZW0gYXMgZW52aXNpb25lZCBpcyYjMTM7JiMxMDsgICAgZmVhc2libGUsIGFuZCB3aXRoIGFzc2Vzc2luZyBwb3RlbnRpYWwgdGVjaG5vbG9naWVzIGZvciB0aGUgc29sdXRpb24gKGluICZsdDthIGhyZWY9JnF1b3Q7cmVzb3VyY2VzL3dmc19hcmNoc3luLmh0bSZxdW90OyZndDsmbHQ7Zm9udCYjMTM7JiMxMDsgICAgY29sb3I9JnF1b3Q7IzAwMDBmZiZxdW90OyZndDtQZXJmb3JtIEFyY2hpdGVjdHVyYWwgU3ludGhlc2lzJmx0Oy9mb250Jmd0OyZsdDsvYSZndDspLiBJZiBpdCBpcyBmZWx0IHRoYXQgbGl0dGxlIHJpc2sgYXR0YWNoZXMgdG8gdGhlIGRldmVsb3BtZW50JiMxMzsmIzEwOyAgICAoYmVjYXVzZSwgZm9yIGV4YW1wbGUsIHRoZSBkb21haW4gaXMgd2VsbCB1bmRlcnN0b29kLCB0aGUgc3lzdGVtIGlzIG5vdCBub3ZlbCwgYW5kIHNvIG9uKSB0aGVuIHRoaXMgd29ya2Zsb3cgZGV0YWlsIG1heSYjMTM7JiMxMDsgICAgYmUgb21pdHRlZC4mIzEzOyYjMTA7Jmx0Oy9wJmd0OyYjMTM7JiMxMDsmbHQ7cCZndDsmIzEzOyYjMTA7ICAgIFRoZSBlYXJseSBFbGFib3JhdGlvbiBQaGFzZSBmb2N1c2VzIG9uIGNyZWF0aW5nIGFuIGluaXRpYWwgYXJjaGl0ZWN0dXJlIGZvciB0aGUgc3lzdGVtICggJmx0O2EmIzEzOyYjMTA7ICAgIGhyZWY9JnF1b3Q7cmVzb3VyY2VzL3dmc19hbmQxLmh0bSZxdW90OyZndDsmbHQ7Zm9udCBjb2xvcj0mcXVvdDsjMDAwMGZmJnF1b3Q7Jmd0O0RlZmluZSBhIENhbmRpZGF0ZSBBcmNoaXRlY3R1cmUmbHQ7L2ZvbnQmZ3Q7Jmx0Oy9hJmd0OykgdG8gcHJvdmlkZSBhIHN0YXJ0aW5nJiMxMzsmIzEwOyAgICBwb2ludCBmb3IgdGhlIG1haW4gYW5hbHlzaXMgd29yay4gSWYgdGhlIGFyY2hpdGVjdHVyZSBhbHJlYWR5IGV4aXN0cyAoZWl0aGVyIGJlY2F1c2UgaXQgd2FzIHByb2R1Y2VkIGluIHByZXZpb3VzJiMxMzsmIzEwOyAgICBpdGVyYXRpb25zLCBpbiBwcmV2aW91cyBwcm9qZWN0cywgb3IgaXMgb2J0YWluZWQgZnJvbSBhbiBhcHBsaWNhdGlvbiBmcmFtZXdvcmspLCB0aGUgZm9jdXMgb2YgdGhlIHdvcmsgY2hhbmdlcyB0byYjMTM7JiMxMDsgICAgcmVmaW5pbmcgdGhlIGFyY2hpdGVjdHVyZSAoICZsdDthIGhyZWY9JnF1b3Q7cmVzb3VyY2VzL3dmc19hbmQyLmh0bSZxdW90OyZndDsmbHQ7Zm9udCBjb2xvcj0mcXVvdDsjMDAwMGZmJnF1b3Q7Jmd0O1JlZmluZSB0aGUgQXJjaGl0ZWN0dXJlJmx0Oy9mb250Jmd0OyZsdDsvYSZndDspJiMxMzsmIzEwOyAgICBhbmQgYW5hbHl6aW5nIGJlaGF2aW9yIGFuZCBjcmVhdGluZyBhbiBpbml0aWFsIHNldCBvZiBlbGVtZW50cyB3aGljaCBwcm92aWRlIHRoZSBhcHByb3ByaWF0ZSBiZWhhdmlvciAoICZsdDthJiMxMzsmIzEwOyAgICBocmVmPSZxdW90O3Jlc291cmNlcy93ZnNfYW5kMy5odG0mcXVvdDsmZ3Q7Jmx0O2ZvbnQgY29sb3I9JnF1b3Q7IzAwMDBmZiZxdW90OyZndDtBbmFseXplIEJlaGF2aW9yJmx0Oy9mb250Jmd0OyZsdDsvYSZndDspLiYjMTM7JiMxMDsmbHQ7L3AmZ3Q7JiMxMzsmIzEwOyZsdDtwJmd0OyYjMTM7JiMxMDsgICAgQWZ0ZXIgdGhlIGluaXRpYWwgZWxlbWVudHMgYXJlIGlkZW50aWZpZWQsIHRoZXkgYXJlIGZ1cnRoZXIgcmVmaW5lZC4gJmx0O2EgaHJlZj0mcXVvdDtyZXNvdXJjZXMvd2ZzX2FuZDQuaHRtJnF1b3Q7Jmd0OyZsdDtmb250JiMxMzsmIzEwOyAgICBjb2xvcj0mcXVvdDsjMDAwMGZmJnF1b3Q7Jmd0O0Rlc2lnbiBDb21wb25lbnRzJmx0Oy9mb250Jmd0OyZsdDsvYSZndDsgcHJvZHVjZSBhIHNldCBvZiBjb21wb25lbnRzIHdoaWNoIHByb3ZpZGUgdGhlIGFwcHJvcHJpYXRlIGJlaGF2aW9yIHRvJiMxMzsmIzEwOyAgICBzYXRpc2Z5IHRoZSByZXF1aXJlbWVudHMgb24gdGhlIHN5c3RlbS4gSWYgdGhlIHN5c3RlbSBpbmNsdWRlcyBhIGRhdGFiYXNlLCB0aGVuICZsdDthIGhyZWY9JnF1b3Q7cmVzb3VyY2VzL3dmc19hbmQ3Lmh0bSZxdW90OyZndDsmbHQ7Zm9udCYjMTM7JiMxMDsgICAgY29sb3I9JnF1b3Q7IzAwMDBmZiZxdW90OyZndDtEZXNpZ24gdGhlIERhdGFiYXNlJmx0Oy9mb250Jmd0OyZsdDsvYSZndDsgb2NjdXJzIGluIHBhcmFsbGVsLiBUaGUgcmVzdWx0IGlzIGFuIGluaXRpYWwgc2V0IG9mIGNvbXBvbmVudHMgd2hpY2ggYXJlJiMxMzsmIzEwOyAgICBmdXJ0aGVyIHJlZmluZWQgaW4gJmx0O2EgaHJlZj0mcXVvdDtyZXNvdXJjZXMvd2ZkX2ltcC5odG0mcXVvdDsmZ3Q7Jmx0O2ZvbnQgY29sb3I9JnF1b3Q7IzAwMDBmZiZxdW90OyZndDtJbXBsZW1lbnRhdGlvbiZsdDsvZm9udCZndDsmbHQ7L2EmZ3Q7LiZsdDticiAvJmd0OyYjMTM7JiMxMDsmbHQ7L3AmZ3Q7JiMxMzsmIzEwOyZhbXA7bmJzcDsmbHQ7YnIgLyZndDsmIzEzOyYjMTA7Jmx0O2JyIC8mZ3Q7IiBleHRlcm5hbElkPSJFWHRlcm5hbCBJRDpDUDEgd2l0aCBhbGwgZWxlbWVudHMiIHNjb3BlPSImbHQ7cCZndDsmIzEzOyYjMTA7ICAgIFRvIGV4cGxhaW4gdGhlIHdvcmsgaW52b2x2ZWQgaW4gdGhlIEFuYWx5c2lzIGFuZCBEZXNpZ24gZGlzY2lwbGluZSwgdGhlIGFjdGl2aXRpZXMgYW5kIHdvcmsgcHJvZHVjdHMgYXJlIG9yZ2FuaXplZCBpbnRvJiMxMzsmIzEwOyAgICBhIGNhcGFiaWxpdHkgcGF0dGVybiBmb3IgdGhlIGRpc2NpcGxpbmUuJiMxMzsmIzEwOyZsdDsvcCZndDsmIzEzOyYjMTA7Jmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICBJbiB0aGUgSW5jZXB0aW9uIFBoYXNlLCBhbmFseXNpcyBhbmQgZGVzaWduIGlzIGNvbmNlcm5lZCB3aXRoIGVzdGFibGlzaGluZyB3aGV0aGVyIHRoZSBzeXN0ZW0gYXMgZW52aXNpb25lZCBpcyYjMTM7JiMxMDsgICAgZmVhc2libGUsIGFuZCB3aXRoIGFzc2Vzc2luZyBwb3RlbnRpYWwgdGVjaG5vbG9naWVzIGZvciB0aGUgc29sdXRpb24gKGluICZsdDthIGhyZWY9JnF1b3Q7cmVzb3VyY2VzL3dmc19hcmNoc3luLmh0bSZxdW90OyZndDsmbHQ7Zm9udCYjMTM7JiMxMDsgICAgY29sb3I9JnF1b3Q7IzAwMDBmZiZxdW90OyZndDtQZXJmb3JtIEFyY2hpdGVjdHVyYWwgU3ludGhlc2lzJmx0Oy9mb250Jmd0OyZsdDsvYSZndDspLiBJZiBpdCBpcyBmZWx0IHRoYXQgbGl0dGxlIHJpc2sgYXR0YWNoZXMgdG8gdGhlIGRldmVsb3BtZW50JiMxMzsmIzEwOyAgICAoYmVjYXVzZSwgZm9yIGV4YW1wbGUsIHRoZSBkb21haW4gaXMgd2VsbCB1bmRlcnN0b29kLCB0aGUgc3lzdGVtIGlzIG5vdCBub3ZlbCwgYW5kIHNvIG9uKSB0aGVuIHRoaXMgd29ya2Zsb3cgZGV0YWlsIG1heSYjMTM7JiMxMDsgICAgYmUgb21pdHRlZC4mIzEzOyYjMTA7Jmx0Oy9wJmd0OyYjMTM7JiMxMDsmbHQ7cCZndDsmIzEzOyYjMTA7ICAgIFRoZSBlYXJseSBFbGFib3JhdGlvbiBQaGFzZSBmb2N1c2VzIG9uIGNyZWF0aW5nIGFuIGluaXRpYWwgYXJjaGl0ZWN0dXJlIGZvciB0aGUgc3lzdGVtICggJmx0O2EmIzEzOyYjMTA7ICAgIGhyZWY9JnF1b3Q7cmVzb3VyY2VzL3dmc19hbmQxLmh0bSZxdW90OyZndDsmbHQ7Zm9udCBjb2xvcj0mcXVvdDsjMDAwMGZmJnF1b3Q7Jmd0O0RlZmluZSBhIENhbmRpZGF0ZSBBcmNoaXRlY3R1cmUmbHQ7L2ZvbnQmZ3Q7Jmx0Oy9hJmd0OykgdG8gcHJvdmlkZSBhIHN0YXJ0aW5nJiMxMzsmIzEwOyAgICBwb2ludCBmb3IgdGhlIG1haW4gYW5hbHlzaXMgd29yay4gSWYgdGhlIGFyY2hpdGVjdHVyZSBhbHJlYWR5IGV4aXN0cyAoZWl0aGVyIGJlY2F1c2UgaXQgd2FzIHByb2R1Y2VkIGluIHByZXZpb3VzJiMxMzsmIzEwOyAgICBpdGVyYXRpb25zLCBpbiBwcmV2aW91cyBwcm9qZWN0cywgb3IgaXMgb2J0YWluZWQgZnJvbSBhbiBhcHBsaWNhdGlvbiBmcmFtZXdvcmspLCB0aGUgZm9jdXMgb2YgdGhlIHdvcmsgY2hhbmdlcyB0byYjMTM7JiMxMDsgICAgcmVmaW5pbmcgdGhlIGFyY2hpdGVjdHVyZSAoICZsdDthIGhyZWY9JnF1b3Q7cmVzb3VyY2VzL3dmc19hbmQyLmh0bSZxdW90OyZndDsmbHQ7Zm9udCBjb2xvcj0mcXVvdDsjMDAwMGZmJnF1b3Q7Jmd0O1JlZmluZSB0aGUgQXJjaGl0ZWN0dXJlJmx0Oy9mb250Jmd0OyZsdDsvYSZndDspJiMxMzsmIzEwOyAgICBhbmQgYW5hbHl6aW5nIGJlaGF2aW9yIGFuZCBjcmVhdGluZyBhbiBpbml0aWFsIHNldCBvZiBlbGVtZW50cyB3aGljaCBwcm92aWRlIHRoZSBhcHByb3ByaWF0ZSBiZWhhdmlvciAoICZsdDthJiMxMzsmIzEwOyAgICBocmVmPSZxdW90O3Jlc291cmNlcy93ZnNfYW5kMy5odG0mcXVvdDsmZ3Q7Jmx0O2ZvbnQgY29sb3I9JnF1b3Q7IzAwMDBmZiZxdW90OyZndDtBbmFseXplIEJlaGF2aW9yJmx0Oy9mb250Jmd0OyZsdDsvYSZndDspLiYjMTM7JiMxMDsmbHQ7L3AmZ3Q7JiMxMzsmIzEwOyZsdDtwJmd0OyYjMTM7JiMxMDsgICAgQWZ0ZXIgdGhlIGluaXRpYWwgZWxlbWVudHMgYXJlIGlkZW50aWZpZWQsIHRoZXkgYXJlIGZ1cnRoZXIgcmVmaW5lZC4gJmx0O2EgaHJlZj0mcXVvdDtyZXNvdXJjZXMvd2ZzX2FuZDQuaHRtJnF1b3Q7Jmd0OyZsdDtmb250JiMxMzsmIzEwOyAgICBjb2xvcj0mcXVvdDsjMDAwMGZmJnF1b3Q7Jmd0O0Rlc2lnbiBDb21wb25lbnRzJmx0Oy9mb250Jmd0OyZsdDsvYSZndDsgcHJvZHVjZSBhIHNldCBvZiBjb21wb25lbnRzIHdoaWNoIHByb3ZpZGUgdGhlIGFwcHJvcHJpYXRlIGJlaGF2aW9yIHRvJiMxMzsmIzEwOyAgICBzYXRpc2Z5IHRoZSByZXF1aXJlbWVudHMgb24gdGhlIHN5c3RlbS4gSWYgdGhlIHN5c3RlbSBpbmNsdWRlcyBhIGRhdGFiYXNlLCB0aGVuICZsdDthIGhyZWY9JnF1b3Q7cmVzb3VyY2VzL3dmc19hbmQ3Lmh0bSZxdW90OyZndDsmbHQ7Zm9udCYjMTM7JiMxMDsgICAgY29sb3I9JnF1b3Q7IzAwMDBmZiZxdW90OyZndDtEZXNpZ24gdGhlIERhdGFiYXNlJmx0Oy9mb250Jmd0OyZsdDsvYSZndDsgb2NjdXJzIGluIHBhcmFsbGVsLiBUaGUgcmVzdWx0IGlzIGFuIGluaXRpYWwgc2V0IG9mIGNvbXBvbmVudHMgd2hpY2ggYXJlJiMxMzsmIzEwOyAgICBmdXJ0aGVyIHJlZmluZWQgaW4gJmx0O2EgaHJlZj0mcXVvdDtyZXNvdXJjZXMvd2ZkX2ltcC5odG0mcXVvdDsmZ3Q7Jmx0O2ZvbnQgY29sb3I9JnF1b3Q7IzAwMDBmZiZxdW90OyZndDtJbXBsZW1lbnRhdGlvbiZsdDsvZm9udCZndDsmbHQ7L2EmZ3Q7LiZsdDticiAvJmd0OyYjMTM7JiMxMDsmbHQ7L3AmZ3Q7JiMxMzsmIzEwOyZhbXA7bmJzcDsmbHQ7YnIgLyZndDsmIzEzOyYjMTA7Jmx0O2JyIC8mZ3Q7IiB1c2FnZU5vdGVzPSImbHQ7cCZndDsmIzEzOyYjMTA7ICAgIFRoZSBzdWJjYXRlZ29yaWVzIG9mIHByb2Nlc3MgYXJlIGRlbGl2ZXJ5IHByb2Nlc3MgYW5kIGNhcGFiaWxpdHkgcGF0dGVybi4mYW1wO25ic3A7IEEgZGVsaXZlcnkgcHJvY2VzcyBkZWZpbmVzIGEgY29tcGxldGUmIzEzOyYjMTA7ICAgIG9yIGVuZC10by1lbmQgcHJvY2Vzcy4mYW1wO25ic3A7IEEgY2FwYWJpbGl0eSBwYXR0ZXJuIGlzIGEgcHJvY2VzcyBmcmFnbWVudCB1c2VkIHRvIGNvbXBvc2UgYSBkZWxpdmVyeSBwcm9jZXNzLiYjMTM7JiMxMDsmbHQ7L3AmZ3Q7Ij4KLTwvUHJvY2Vzc0Rlc2NyaXB0aW9uPgotPGJyZWFrZG93bkVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9QaGFzZTEiPgotPC9icmVha2Rvd25FbGVtZW50cz4KLTxkZWZhdWx0Q29udGV4dCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9DUDEgd2l0aCBhbGwgZWxlbWVudHMiPgotPC9kZWZhdWx0Q29udGV4dD4KLTx2YWxpZENvbnRleHQgcGF0aD0iQ29uZmlnIEEiPgotPC92YWxpZENvbnRleHQ+Ci08L0NhcGFiaWxpdHlQYXR0ZXJuPgotPC9Qcm9jZXNzQ29tcG9uZW50PgotPFByb2Nlc3NDb21wb25lbnQgbmFtZT0iQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgZ2xvYmFsPSJmYWxzZSIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiPgotPHBhcmVudFBhY2thZ2UgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cyI+Ci08L3BhcmVudFBhY2thZ2U+Ci08UHJvY2Vzc1BhY2thZ2UgbmFtZT0iYWN0aXZpdHlfZm9yX3ZhcmlhYmlsaXR5X2VsZW1lbnRzIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGdsb2JhbD0iZmFsc2UiPgotPHBhcmVudFBhY2thZ2UgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9hY3Rpdml0eV9mb3JfdmFyaWFiaWxpdHlfZWxlbWVudHMiPgotPC9wYXJlbnRQYWNrYWdlPgotPEFjdGl2aXR5IG5hbWU9ImFjdGl2aXR5X2Zvcl92YXJpYWJpbGl0eV9lbGVtZW50cyIgYnJpZWZEZXNjcmlwdGlvbj0iYnJpZWY6IEFjdGl2aXR5IGZvciB2YXJpYWJpbGl0eSBlbGVtZW50cyIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iQWN0aXZpdHkgZm9yIHZhcmlhYmlsaXR5IGVsZW1lbnRzIiBwcmVmaXg9IlByZWZpeCIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzUmVwZWF0YWJsZT0iZmFsc2UiIGlzT25nb2luZz0iZmFsc2UiIGlzRXZlbnREcml2ZW49ImZhbHNlIiB2YXJpYWJpbGl0eVR5cGU9Im5hIiBpc0VuYWN0YWJsZT0iZmFsc2UiPgotPEFjdGl2aXR5RGVzY3JpcHRpb24gbmFtZT0iLF9sRGhsOEVERkVkcU85TTNmdWtZQV9BIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249Im1haW46IEFjdGl2aXR5IGZvciB2YXJpYWJpbGl0eSBlbGVtZW50cyIga2V5Q29uc2lkZXJhdGlvbnM9ImtleTogQWN0aXZpdHkgZm9yIHZhcmlhYmlsaXR5IGVsZW1lbnRzIiB1c2FnZUd1aWRhbmNlPSJ1c2FnZTogQWN0aXZpdHkgZm9yIHZhcmlhYmlsaXR5IGVsZW1lbnRzIiBwdXJwb3NlPSJwdXJwb3NlOiBBY3Rpdml0eSBmb3IgdmFyaWFiaWxpdHkgZWxlbWVudHMiIGFsdGVybmF0aXZlcz0iYWx0ZXJuYXRpdmVzOiBBY3Rpdml0eSBmb3IgdmFyaWFiaWxpdHkgZWxlbWVudHMiIGhvd3RvU3RhZmY9ImhvdyB0byBzdGFmZjogQWN0aXZpdHkgZm9yIHZhcmlhYmlsaXR5IGVsZW1lbnRzIj4KLTwvQWN0aXZpdHlEZXNjcmlwdGlvbj4KLTxzdXBlckFjdGl2aXRpZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9hY3Rpdml0eV9mb3JfdmFyaWFiaWxpdHlfZWxlbWVudHMvYWN0aXZpdHlfZm9yX3ZhcmlhYmlsaXR5X2VsZW1lbnRzIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPGJyZWFrZG93bkVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvYWN0aXZpdHlfZm9yX3ZhcmlhYmlsaXR5X2VsZW1lbnRzL3Rhc2tfQTMiPgotPC9icmVha2Rvd25FbGVtZW50cz4KLTxicmVha2Rvd25FbGVtZW50cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FjdGl2aXR5X2Zvcl92YXJpYWJpbGl0eV9lbGVtZW50cy9yb2xlX0EzIj4KLTwvYnJlYWtkb3duRWxlbWVudHM+Ci08YnJlYWtkb3duRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9hY3Rpdml0eV9mb3JfdmFyaWFiaWxpdHlfZWxlbWVudHMvcm9sZV9BMiI+Ci08L2JyZWFrZG93bkVsZW1lbnRzPgotPGJyZWFrZG93bkVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvYWN0aXZpdHlfZm9yX3ZhcmlhYmlsaXR5X2VsZW1lbnRzL3JvbGVfQTEiPgotPC9icmVha2Rvd25FbGVtZW50cz4KLTxicmVha2Rvd25FbGVtZW50cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FjdGl2aXR5X2Zvcl92YXJpYWJpbGl0eV9lbGVtZW50cy9hcnRpZmFjdF9BMiI+Ci08L2JyZWFrZG93bkVsZW1lbnRzPgotPGJyZWFrZG93bkVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvYWN0aXZpdHlfZm9yX3ZhcmlhYmlsaXR5X2VsZW1lbnRzL2RlbGl2ZXJhYmxlX0EyIj4KLTwvYnJlYWtkb3duRWxlbWVudHM+Ci08YnJlYWtkb3duRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9hY3Rpdml0eV9mb3JfdmFyaWFiaWxpdHlfZWxlbWVudHMvb3V0Y29tZV9BMiI+Ci08L2JyZWFrZG93bkVsZW1lbnRzPgotPC9BY3Rpdml0eT4KLTxUYXNrRGVzY3JpcHRvciBuYW1lPSJ0YXNrX0EzIiBicmllZkRlc2NyaXB0aW9uPSJicmllZjogVGFzayBBMyIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iVGFzayBBMyBleHRlbmRzIFRhc2sgQTIiIHByZWZpeD0iIiBpc1BsYW5uZWQ9ImZhbHNlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzUmVwZWF0YWJsZT0iZmFsc2UiIGlzT25nb2luZz0iZmFsc2UiIGlzRXZlbnREcml2ZW49ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJ0YXNrX0EzLF9HcVgxTUVEUUVkcXJoc1poM1FOQU1RIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiByZWZpbmVkRGVzY3JpcHRpb249IiI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxzdXBlckFjdGl2aXRpZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9hY3Rpdml0eV9mb3JfdmFyaWFiaWxpdHlfZWxlbWVudHMvdGFza19BMyI+Ci08L3N1cGVyQWN0aXZpdGllcz4KLTxUYXNrIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvYWN0aXZpdHlfZm9yX3ZhcmlhYmlsaXR5X2VsZW1lbnRzL3Rhc2tfQTMiPgotPC9UYXNrPgotPGFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvYWN0aXZpdHlfZm9yX3ZhcmlhYmlsaXR5X2VsZW1lbnRzL3JvbGVfQTIiPgotPC9hZGRpdGlvbmFsbHlQZXJmb3JtZWRCeT4KLTxhZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FjdGl2aXR5X2Zvcl92YXJpYWJpbGl0eV9lbGVtZW50cy9yb2xlX0ExIj4KLTwvYWRkaXRpb25hbGx5UGVyZm9ybWVkQnk+Ci08bWFuZGF0b3J5SW5wdXQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9hY3Rpdml0eV9mb3JfdmFyaWFiaWxpdHlfZWxlbWVudHMvYXJ0aWZhY3RfQTIiPgotPC9tYW5kYXRvcnlJbnB1dD4KLTxvcHRpb25hbElucHV0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvYWN0aXZpdHlfZm9yX3ZhcmlhYmlsaXR5X2VsZW1lbnRzL2RlbGl2ZXJhYmxlX0EyIj4KLTwvb3B0aW9uYWxJbnB1dD4KLTxvdXRwdXQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9hY3Rpdml0eV9mb3JfdmFyaWFiaWxpdHlfZWxlbWVudHMvb3V0Y29tZV9BMiI+Ci08L291dHB1dD4KLTxwZXJmb3JtZWRQcmltYXJpbHlCeSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FjdGl2aXR5X2Zvcl92YXJpYWJpbGl0eV9lbGVtZW50cy90YXNrX0EzIj4KLTwvcGVyZm9ybWVkUHJpbWFyaWx5Qnk+Ci08c2VsZWN0ZWRTdGVwcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvdGFza19BMy8sX29VbHVFRURGRWRxTzlNM2Z1a1lBX0EvU3RlcCBBMy4xIj4KLTwvc2VsZWN0ZWRTdGVwcz4KLTxzZWxlY3RlZFN0ZXBzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS90YXNrX0EzLyxfb1VsdUVFREZFZHFPOU0zZnVrWUFfQS9TdGVwIEEzLjIiPgotPC9zZWxlY3RlZFN0ZXBzPgotPHNlbGVjdGVkU3RlcHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3Rhc2tfQTMvLF9vVWx1RUVERkVkcU85TTNmdWtZQV9BL1N0ZXAgQTMuMyI+Ci08L3NlbGVjdGVkU3RlcHM+Ci08c2VsZWN0ZWRTdGVwcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvdGFza19BMi90YXNrX0EyLF83NU5Rd0EtUEVkcUwyTzFQSlY5Y1pBL1N0ZXAgQTIuMSI+Ci08L3NlbGVjdGVkU3RlcHM+Ci08c2VsZWN0ZWRTdGVwcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvdGFza19BMi90YXNrX0EyLF83NU5Rd0EtUEVkcUwyTzFQSlY5Y1pBL1N0ZXAgQTIuMiI+Ci08L3NlbGVjdGVkU3RlcHM+Ci08c2VsZWN0ZWRTdGVwcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvdGFza19BMi90YXNrX0EyLF83NU5Rd0EtUEVkcUwyTzFQSlY5Y1pBL1N0ZXAgQTIuMyI+Ci08L3NlbGVjdGVkU3RlcHM+Ci08L1Rhc2tEZXNjcmlwdG9yPgotPFJvbGVEZXNjcmlwdG9yIG5hbWU9InJvbGVfQTMiIGJyaWVmRGVzY3JpcHRpb249ImJyaWVmIDogUm9sZSBBMyIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iUm9sZSBBMyBleHRlbmRzIFJvbGUgQTIiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0icm9sZV9BMyxfR3FYMU1VRFFFZHFyaHNaaDNRTkFNUSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvYWN0aXZpdHlfZm9yX3ZhcmlhYmlsaXR5X2VsZW1lbnRzL3JvbGVfQTMiPgotPC9zdXBlckFjdGl2aXRpZXM+Ci08Um9sZSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FjdGl2aXR5X2Zvcl92YXJpYWJpbGl0eV9lbGVtZW50cy9yb2xlX0EzIj4KLTwvUm9sZT4KLTxtb2RpZmllcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FjdGl2aXR5X2Zvcl92YXJpYWJpbGl0eV9lbGVtZW50cy9vdXRjb21lX0EyIj4KLTwvbW9kaWZpZXM+Ci08L1JvbGVEZXNjcmlwdG9yPgotPFJvbGVEZXNjcmlwdG9yIG5hbWU9InJvbGVfQTIiIGJyaWVmRGVzY3JpcHRpb249IlJvbGUgQTIgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IlJvbGUgQTIgZXh0ZW5kZWQgYnkgUm9sZSBBMyIgcHJlZml4PSIiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJyb2xlX0EyLF9HcWhtTUVEUUVkcXJoc1poM1FOQU1RIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiByZWZpbmVkRGVzY3JpcHRpb249IiI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxzdXBlckFjdGl2aXRpZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9hY3Rpdml0eV9mb3JfdmFyaWFiaWxpdHlfZWxlbWVudHMvcm9sZV9BMiI+Ci08L3N1cGVyQWN0aXZpdGllcz4KLTxSb2xlIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvYWN0aXZpdHlfZm9yX3ZhcmlhYmlsaXR5X2VsZW1lbnRzL3JvbGVfQTIiPgotPC9Sb2xlPgotPHJlc3BvbnNpYmxlRm9yIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvYWN0aXZpdHlfZm9yX3ZhcmlhYmlsaXR5X2VsZW1lbnRzL2FydGlmYWN0X0EyIj4KLTwvcmVzcG9uc2libGVGb3I+Ci08cmVzcG9uc2libGVGb3IgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9hY3Rpdml0eV9mb3JfdmFyaWFiaWxpdHlfZWxlbWVudHMvZGVsaXZlcmFibGVfQTIiPgotPC9yZXNwb25zaWJsZUZvcj4KLTxyZXNwb25zaWJsZUZvciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FjdGl2aXR5X2Zvcl92YXJpYWJpbGl0eV9lbGVtZW50cy9vdXRjb21lX0EyIj4KLTwvcmVzcG9uc2libGVGb3I+Ci08L1JvbGVEZXNjcmlwdG9yPgotPFJvbGVEZXNjcmlwdG9yIG5hbWU9InJvbGVfQTEiIGJyaWVmRGVzY3JpcHRpb249IlJvbGUgQTEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IlJvbGUgQTEiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0icm9sZV9BMSxfR3FobU1VRFFFZHFyaHNaaDNRTkFNUSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvYWN0aXZpdHlfZm9yX3ZhcmlhYmlsaXR5X2VsZW1lbnRzL3JvbGVfQTEiPgotPC9zdXBlckFjdGl2aXRpZXM+Ci08Um9sZSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FjdGl2aXR5X2Zvcl92YXJpYWJpbGl0eV9lbGVtZW50cy9yb2xlX0ExIj4KLTwvUm9sZT4KLTwvUm9sZURlc2NyaXB0b3I+Ci08V29ya1Byb2R1Y3REZXNjcmlwdG9yIG5hbWU9ImFydGlmYWN0X0EyIiBicmllZkRlc2NyaXB0aW9uPSJBcnRpZmFjdCBBMiBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iQXJ0aWZhY3QgQTIgcHJlc2VudCIgcHJlZml4PSIiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiIGFjdGl2aXR5RW50cnlTdGF0ZT0iIiBhY3Rpdml0eUV4aXRTdGF0ZT0iIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0iYXJ0aWZhY3RfQTIsX0dxaG1Na0RRRWRxcmhzWmgzUU5BTVEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHJlZmluZWREZXNjcmlwdGlvbj0iIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPHN1cGVyQWN0aXZpdGllcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FjdGl2aXR5X2Zvcl92YXJpYWJpbGl0eV9lbGVtZW50cy9hcnRpZmFjdF9BMiI+Ci08L3N1cGVyQWN0aXZpdGllcz4KLTxXb3JrUHJvZHVjdCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FjdGl2aXR5X2Zvcl92YXJpYWJpbGl0eV9lbGVtZW50cy9hcnRpZmFjdF9BMiI+Ci08L1dvcmtQcm9kdWN0PgotPC9Xb3JrUHJvZHVjdERlc2NyaXB0b3I+Ci08V29ya1Byb2R1Y3REZXNjcmlwdG9yIG5hbWU9ImRlbGl2ZXJhYmxlX0EyIiBicmllZkRlc2NyaXB0aW9uPSJEZWxpdmVyYWJsZSBBMiBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iRGVsaXZlcmFibGUgQTIgcHJlc2VudCIgcHJlZml4PSIiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiIGFjdGl2aXR5RW50cnlTdGF0ZT0iIiBhY3Rpdml0eUV4aXRTdGF0ZT0iIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0iZGVsaXZlcmFibGVfQTIsX0dxaG1NMERRRWRxcmhzWmgzUU5BTVEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHJlZmluZWREZXNjcmlwdGlvbj0iIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPHN1cGVyQWN0aXZpdGllcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FjdGl2aXR5X2Zvcl92YXJpYWJpbGl0eV9lbGVtZW50cy9kZWxpdmVyYWJsZV9BMiI+Ci08L3N1cGVyQWN0aXZpdGllcz4KLTxXb3JrUHJvZHVjdCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FjdGl2aXR5X2Zvcl92YXJpYWJpbGl0eV9lbGVtZW50cy9kZWxpdmVyYWJsZV9BMiI+Ci08L1dvcmtQcm9kdWN0PgotPGRlbGl2ZXJhYmxlUGFydHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9hY3Rpdml0eV9mb3JfdmFyaWFiaWxpdHlfZWxlbWVudHMvYXJ0aWZhY3RfQTIiPgotPC9kZWxpdmVyYWJsZVBhcnRzPgotPGRlbGl2ZXJhYmxlUGFydHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9hY3Rpdml0eV9mb3JfdmFyaWFiaWxpdHlfZWxlbWVudHMvb3V0Y29tZV9BMiI+Ci08L2RlbGl2ZXJhYmxlUGFydHM+Ci08L1dvcmtQcm9kdWN0RGVzY3JpcHRvcj4KLTxXb3JrUHJvZHVjdERlc2NyaXB0b3IgbmFtZT0ib3V0Y29tZV9BMiIgYnJpZWZEZXNjcmlwdGlvbj0iT3V0Y29tZSBBMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iT3V0Y29tZSBBMiBwcmVzZW50IiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSIgYWN0aXZpdHlFbnRyeVN0YXRlPSIiIGFjdGl2aXR5RXhpdFN0YXRlPSIiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJvdXRjb21lX0EyLF9HcWhtTkVEUUVkcXJoc1poM1FOQU1RIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiByZWZpbmVkRGVzY3JpcHRpb249IiI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxzdXBlckFjdGl2aXRpZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9hY3Rpdml0eV9mb3JfdmFyaWFiaWxpdHlfZWxlbWVudHMvb3V0Y29tZV9BMiI+Ci08L3N1cGVyQWN0aXZpdGllcz4KLTxXb3JrUHJvZHVjdCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FjdGl2aXR5X2Zvcl92YXJpYWJpbGl0eV9lbGVtZW50cy9vdXRjb21lX0EyIj4KLTwvV29ya1Byb2R1Y3Q+Ci08L1dvcmtQcm9kdWN0RGVzY3JpcHRvcj4KLTxXb3JrUHJvZHVjdERlc2NyaXB0b3IgbmFtZT0iYXJ0aWZhY3RfQTIiIGJyaWVmRGVzY3JpcHRpb249IkFydGlmYWN0IEEyIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJBcnRpZmFjdCBBMiBwcmVzZW50IiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSIgYWN0aXZpdHlFbnRyeVN0YXRlPSIiIGFjdGl2aXR5RXhpdFN0YXRlPSIiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJhcnRpZmFjdF9BMixfR3Fxd0lFRFFFZHFyaHNaaDNRTkFNUSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08V29ya1Byb2R1Y3QgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9hY3Rpdml0eV9mb3JfdmFyaWFiaWxpdHlfZWxlbWVudHMvYXJ0aWZhY3RfQTIiPgotPC9Xb3JrUHJvZHVjdD4KLTwvV29ya1Byb2R1Y3REZXNjcmlwdG9yPgotPFdvcmtQcm9kdWN0RGVzY3JpcHRvciBuYW1lPSJvdXRjb21lX0EyIiBicmllZkRlc2NyaXB0aW9uPSJPdXRjb21lIEExIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJPdXRjb21lIEEyIHByZXNlbnQiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIiBhY3Rpdml0eUVudHJ5U3RhdGU9IiIgYWN0aXZpdHlFeGl0U3RhdGU9IiI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9Im91dGNvbWVfQTIsX0dxcXdJVURRRWRxcmhzWmgzUU5BTVEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHJlZmluZWREZXNjcmlwdGlvbj0iIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPFdvcmtQcm9kdWN0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvYWN0aXZpdHlfZm9yX3ZhcmlhYmlsaXR5X2VsZW1lbnRzL291dGNvbWVfQTIiPgotPC9Xb3JrUHJvZHVjdD4KLTwvV29ya1Byb2R1Y3REZXNjcmlwdG9yPgotPERpYWdyYW0gbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08R3JhcGhOb2RlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FjdGl2aXR5X2Zvcl92YXJpYWJpbGl0eV9lbGVtZW50cyI+Ci08L2NvbnRhaW5lcj4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9hY3Rpdml0eV9mb3JfdmFyaWFiaWxpdHlfZWxlbWVudHMiPgotPC9ncmFwaEVsZW1lbnQ+Ci08ZWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FjdGl2aXR5X2Zvcl92YXJpYWJpbGl0eV9lbGVtZW50cyI+Ci08L2VsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0dyYXBoTm9kZT4KLTxHcmFwaE5vZGUgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvYWN0aXZpdHlfZm9yX3ZhcmlhYmlsaXR5X2VsZW1lbnRzIj4KLTwvY29udGFpbmVyPgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSIiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FjdGl2aXR5X2Zvcl92YXJpYWJpbGl0eV9lbGVtZW50cyI+Ci08L2dyYXBoRWxlbWVudD4KLTxlbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvYWN0aXZpdHlfZm9yX3ZhcmlhYmlsaXR5X2VsZW1lbnRzIj4KLTwvZWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvR3JhcGhOb2RlPgotPEdyYXBoTm9kZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9hY3Rpdml0eV9mb3JfdmFyaWFiaWxpdHlfZWxlbWVudHMiPgotPC9jb250YWluZXI+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IiI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvYWN0aXZpdHlfZm9yX3ZhcmlhYmlsaXR5X2VsZW1lbnRzIj4KLTwvZ3JhcGhFbGVtZW50PgotPGVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9hY3Rpdml0eV9mb3JfdmFyaWFiaWxpdHlfZWxlbWVudHMiPgotPC9lbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9HcmFwaE5vZGU+Ci08R3JhcGhOb2RlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FjdGl2aXR5X2Zvcl92YXJpYWJpbGl0eV9lbGVtZW50cyI+Ci08L2NvbnRhaW5lcj4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9hY3Rpdml0eV9mb3JfdmFyaWFiaWxpdHlfZWxlbWVudHMiPgotPC9ncmFwaEVsZW1lbnQ+Ci08ZWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FjdGl2aXR5X2Zvcl92YXJpYWJpbGl0eV9lbGVtZW50cyI+Ci08L2VsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0dyYXBoTm9kZT4KLTxHcmFwaE5vZGUgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvYWN0aXZpdHlfZm9yX3ZhcmlhYmlsaXR5X2VsZW1lbnRzIj4KLTwvY29udGFpbmVyPgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSIiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FjdGl2aXR5X2Zvcl92YXJpYWJpbGl0eV9lbGVtZW50cyI+Ci08L2dyYXBoRWxlbWVudD4KLTxlbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvYWN0aXZpdHlfZm9yX3ZhcmlhYmlsaXR5X2VsZW1lbnRzIj4KLTwvZWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvR3JhcGhOb2RlPgotPEdyYXBoTm9kZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9hY3Rpdml0eV9mb3JfdmFyaWFiaWxpdHlfZWxlbWVudHMiPgotPC9jb250YWluZXI+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IiI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvYWN0aXZpdHlfZm9yX3ZhcmlhYmlsaXR5X2VsZW1lbnRzIj4KLTwvZ3JhcGhFbGVtZW50PgotPGVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9hY3Rpdml0eV9mb3JfdmFyaWFiaWxpdHlfZWxlbWVudHMiPgotPC9lbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9HcmFwaE5vZGU+Ci08R3JhcGhOb2RlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FjdGl2aXR5X2Zvcl92YXJpYWJpbGl0eV9lbGVtZW50cyI+Ci08L2NvbnRhaW5lcj4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9hY3Rpdml0eV9mb3JfdmFyaWFiaWxpdHlfZWxlbWVudHMiPgotPC9ncmFwaEVsZW1lbnQ+Ci08ZWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FjdGl2aXR5X2Zvcl92YXJpYWJpbGl0eV9lbGVtZW50cyI+Ci08L2VsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0dyYXBoTm9kZT4KLTxHcmFwaE5vZGUgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvYWN0aXZpdHlfZm9yX3ZhcmlhYmlsaXR5X2VsZW1lbnRzIj4KLTwvY29udGFpbmVyPgotPFByb3BlcnR5IG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIGtleT0id3BDb21wb3NpdGVUeXBlIiB2YWx1ZT0iMSI+Ci08L1Byb3BlcnR5PgotPEdyYXBoRWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9hY3Rpdml0eV9mb3JfdmFyaWFiaWxpdHlfZWxlbWVudHMiPgotPC9jb250YWluZXI+Ci08YW5jaG9yIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvYWN0aXZpdHlfZm9yX3ZhcmlhYmlsaXR5X2VsZW1lbnRzIj4KLTwvYW5jaG9yPgotPC9HcmFwaEVkZ2U+Ci08R3JhcGhDb25uZWN0b3IgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvYWN0aXZpdHlfZm9yX3ZhcmlhYmlsaXR5X2VsZW1lbnRzIj4KLTwvZ3JhcGhFbGVtZW50PgotPGdyYXBoRWRnZSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FjdGl2aXR5X2Zvcl92YXJpYWJpbGl0eV9lbGVtZW50cyI+Ci08L2dyYXBoRWRnZT4KLTwvR3JhcGhDb25uZWN0b3I+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IiI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvYWN0aXZpdHlfZm9yX3ZhcmlhYmlsaXR5X2VsZW1lbnRzIj4KLTwvZ3JhcGhFbGVtZW50PgotPGVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9hY3Rpdml0eV9mb3JfdmFyaWFiaWxpdHlfZWxlbWVudHMiPgotPC9lbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9HcmFwaE5vZGU+Ci08R3JhcGhOb2RlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FjdGl2aXR5X2Zvcl92YXJpYWJpbGl0eV9lbGVtZW50cyI+Ci08L2NvbnRhaW5lcj4KLTxQcm9wZXJ0eSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBrZXk9IndwQ29tcG9zaXRlVHlwZSIgdmFsdWU9IjIiPgotPC9Qcm9wZXJ0eT4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9hY3Rpdml0eV9mb3JfdmFyaWFiaWxpdHlfZWxlbWVudHMiPgotPC9ncmFwaEVsZW1lbnQ+Ci08ZWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FjdGl2aXR5X2Zvcl92YXJpYWJpbGl0eV9lbGVtZW50cyI+Ci08L2VsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0dyYXBoTm9kZT4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iQWN0aXZpdHkgRGV0YWlsIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9hY3Rpdml0eV9mb3JfdmFyaWFiaWxpdHlfZWxlbWVudHMiPgotPC9ncmFwaEVsZW1lbnQ+Ci08ZWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FjdGl2aXR5X2Zvcl92YXJpYWJpbGl0eV9lbGVtZW50cyI+Ci08L2VsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0RpYWdyYW0+Ci08L1Byb2Nlc3NQYWNrYWdlPgotPFByb2Nlc3NQYWNrYWdlIG5hbWU9IkFjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgZ2xvYmFsPSJmYWxzZSI+Ci08cGFyZW50UGFja2FnZSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMiPgotPC9wYXJlbnRQYWNrYWdlPgotPEFjdGl2aXR5IG5hbWU9IkFjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cyIgcHJlZml4PSIiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1JlcGVhdGFibGU9ImZhbHNlIiBpc09uZ29pbmc9ImZhbHNlIiBpc0V2ZW50RHJpdmVuPSJmYWxzZSIgdmFyaWFiaWxpdHlUeXBlPSJuYSIgaXNFbmFjdGFibGU9ImZhbHNlIj4KLTxBY3Rpdml0eURlc2NyaXB0aW9uIG5hbWU9IkFjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMsX2RZR20wRURQRWRxcmhzWmgzUU5BTVEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHB1cnBvc2U9IiIgYWx0ZXJuYXRpdmVzPSIiIGhvd3RvU3RhZmY9IiI+Ci08L0FjdGl2aXR5RGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPGJyZWFrZG93bkVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cy90YXNrX0IyIj4KLTwvYnJlYWtkb3duRWxlbWVudHM+Ci08YnJlYWtkb3duRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzL3JvbGVfQjIiPgotPC9icmVha2Rvd25FbGVtZW50cz4KLTxicmVha2Rvd25FbGVtZW50cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMvcm9sZV9CMSI+Ci08L2JyZWFrZG93bkVsZW1lbnRzPgotPGJyZWFrZG93bkVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cy9yb2xlX0EyIj4KLTwvYnJlYWtkb3duRWxlbWVudHM+Ci08YnJlYWtkb3duRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FydGlmYWN0X0IyIj4KLTwvYnJlYWtkb3duRWxlbWVudHM+Ci08YnJlYWtkb3duRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzL3N1Yl9hcnRpZmFjdF9BMS4xIj4KLTwvYnJlYWtkb3duRWxlbWVudHM+Ci08YnJlYWtkb3duRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FydGlmYWN0X0ExIj4KLTwvYnJlYWtkb3duRWxlbWVudHM+Ci08YnJlYWtkb3duRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2RlbGl2ZXJhYmxlX0IyIj4KLTwvYnJlYWtkb3duRWxlbWVudHM+Ci08YnJlYWtkb3duRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2RlbGl2ZXJhYmxlX0ExIj4KLTwvYnJlYWtkb3duRWxlbWVudHM+Ci08YnJlYWtkb3duRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzL291dGNvbWVfQjIiPgotPC9icmVha2Rvd25FbGVtZW50cz4KLTxicmVha2Rvd25FbGVtZW50cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMvb3V0Y29tZV9BMSI+Ci08L2JyZWFrZG93bkVsZW1lbnRzPgotPC9BY3Rpdml0eT4KLTxUYXNrRGVzY3JpcHRvciBuYW1lPSJ0YXNrX0IyIiBicmllZkRlc2NyaXB0aW9uPSJUYXNrIEIyIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJUYXNrIEIyIGV4dGVuZHMgVGFzayBBMSIgcHJlZml4PSIiIGlzUGxhbm5lZD0iZmFsc2UiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNSZXBlYXRhYmxlPSJmYWxzZSIgaXNPbmdvaW5nPSJmYWxzZSIgaXNFdmVudERyaXZlbj0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9InRhc2tfQjIsX2w1eVVBRURQRWRxcmhzWmgzUU5BTVEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHJlZmluZWREZXNjcmlwdGlvbj0iIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPHN1cGVyQWN0aXZpdGllcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMvdGFza19CMiI+Ci08L3N1cGVyQWN0aXZpdGllcz4KLTxUYXNrIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cy90YXNrX0IyIj4KLTwvVGFzaz4KLTxhZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMvcm9sZV9CMSI+Ci08L2FkZGl0aW9uYWxseVBlcmZvcm1lZEJ5PgotPGFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cy9yb2xlX0EyIj4KLTwvYWRkaXRpb25hbGx5UGVyZm9ybWVkQnk+Ci08bWFuZGF0b3J5SW5wdXQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FydGlmYWN0X0IyIj4KLTwvbWFuZGF0b3J5SW5wdXQ+Ci08bWFuZGF0b3J5SW5wdXQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzL3N1Yl9hcnRpZmFjdF9BMS4xIj4KLTwvbWFuZGF0b3J5SW5wdXQ+Ci08bWFuZGF0b3J5SW5wdXQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FydGlmYWN0X0ExIj4KLTwvbWFuZGF0b3J5SW5wdXQ+Ci08b3B0aW9uYWxJbnB1dCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMvZGVsaXZlcmFibGVfQjIiPgotPC9vcHRpb25hbElucHV0PgotPG9wdGlvbmFsSW5wdXQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2RlbGl2ZXJhYmxlX0ExIj4KLTwvb3B0aW9uYWxJbnB1dD4KLTxvdXRwdXQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzL291dGNvbWVfQjIiPgotPC9vdXRwdXQ+Ci08b3V0cHV0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cy9vdXRjb21lX0ExIj4KLTwvb3V0cHV0PgotPHBlcmZvcm1lZFByaW1hcmlseUJ5IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cy90YXNrX0IyIj4KLTwvcGVyZm9ybWVkUHJpbWFyaWx5Qnk+Ci08c2VsZWN0ZWRTdGVwcyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvdGFza19CMi90YXNrX0IyLF9aTE9Nc0I4UEVkcXNoTU5TSTA3WE9nL1N0ZXAgQjIuMSI+Ci08L3NlbGVjdGVkU3RlcHM+Ci08c2VsZWN0ZWRTdGVwcyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvdGFza19CMi90YXNrX0IyLF9aTE9Nc0I4UEVkcXNoTU5TSTA3WE9nL1N0ZXAgQjIuMiI+Ci08L3NlbGVjdGVkU3RlcHM+Ci08c2VsZWN0ZWRTdGVwcyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvdGFza19CMi90YXNrX0IyLF9aTE9Nc0I4UEVkcXNoTU5TSTA3WE9nL1N0ZXAgQjIuMyI+Ci08L3NlbGVjdGVkU3RlcHM+Ci08c2VsZWN0ZWRTdGVwcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvdGFza19BMS90YXNrX0ExLF83TThuc0EtUEVkcUwyTzFQSlY5Y1pBL1N0ZXAgQTEuMSI+Ci08L3NlbGVjdGVkU3RlcHM+Ci08c2VsZWN0ZWRTdGVwcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvdGFza19BMS90YXNrX0ExLF83TThuc0EtUEVkcUwyTzFQSlY5Y1pBL1N0ZXAgQTEuMiI+Ci08L3NlbGVjdGVkU3RlcHM+Ci08c2VsZWN0ZWRTdGVwcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvdGFza19BMS90YXNrX0ExLF83TThuc0EtUEVkcUwyTzFQSlY5Y1pBL1N0ZXAgQTEuMyI+Ci08L3NlbGVjdGVkU3RlcHM+Ci08L1Rhc2tEZXNjcmlwdG9yPgotPFJvbGVEZXNjcmlwdG9yIG5hbWU9InJvbGVfQjIiIGJyaWVmRGVzY3JpcHRpb249IlJvbGUgQjIgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IlJvbGUgQjIgcHJlc2VudCIgcHJlZml4PSIiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJyb2xlX0IyLF9sNXlVQVVEUEVkcXJoc1poM1FOQU1RIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiByZWZpbmVkRGVzY3JpcHRpb249IiI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxzdXBlckFjdGl2aXRpZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzL3JvbGVfQjIiPgotPC9zdXBlckFjdGl2aXRpZXM+Ci08Um9sZSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMvcm9sZV9CMiI+Ci08L1JvbGU+Ci08bW9kaWZpZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzL291dGNvbWVfQjIiPgotPC9tb2RpZmllcz4KLTxtb2RpZmllcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMvb3V0Y29tZV9BMSI+Ci08L21vZGlmaWVzPgotPHJlc3BvbnNpYmxlRm9yIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cy9hcnRpZmFjdF9CMiI+Ci08L3Jlc3BvbnNpYmxlRm9yPgotPHJlc3BvbnNpYmxlRm9yIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cy9kZWxpdmVyYWJsZV9CMiI+Ci08L3Jlc3BvbnNpYmxlRm9yPgotPC9Sb2xlRGVzY3JpcHRvcj4KLTxSb2xlRGVzY3JpcHRvciBuYW1lPSJyb2xlX0IxIiBicmllZkRlc2NyaXB0aW9uPSJSb2xlIEIxIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJSb2xlIEIxIHByZXNlbnQiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0icm9sZV9CMSxfbDV5VUFrRFBFZHFyaHNaaDNRTkFNUSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cy9yb2xlX0IxIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPFJvbGUgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzL3JvbGVfQjEiPgotPC9Sb2xlPgotPC9Sb2xlRGVzY3JpcHRvcj4KLTxSb2xlRGVzY3JpcHRvciBuYW1lPSJyb2xlX0EyIiBicmllZkRlc2NyaXB0aW9uPSJSb2xlIEEyIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJSb2xlIEEyIGV4dGVuZGVkIGJ5IFJvbGUgQTMiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0icm9sZV9BMixfbDV5VUEwRFBFZHFyaHNaaDNRTkFNUSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cy9yb2xlX0EyIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPFJvbGUgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzL3JvbGVfQTIiPgotPC9Sb2xlPgotPC9Sb2xlRGVzY3JpcHRvcj4KLTxXb3JrUHJvZHVjdERlc2NyaXB0b3IgbmFtZT0iYXJ0aWZhY3RfQjIiIGJyaWVmRGVzY3JpcHRpb249IkFydGlmYWN0IEIyIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJBcnRpZmFjdCBCMiBwcmVzZW50IiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSIgYWN0aXZpdHlFbnRyeVN0YXRlPSIiIGFjdGl2aXR5RXhpdFN0YXRlPSIiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJhcnRpZmFjdF9CMixfbDV5VUJFRFBFZHFyaHNaaDNRTkFNUSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cy9hcnRpZmFjdF9CMiI+Ci08L3N1cGVyQWN0aXZpdGllcz4KLTxXb3JrUHJvZHVjdCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMvYXJ0aWZhY3RfQjIiPgotPC9Xb3JrUHJvZHVjdD4KLTwvV29ya1Byb2R1Y3REZXNjcmlwdG9yPgotPFdvcmtQcm9kdWN0RGVzY3JpcHRvciBuYW1lPSJzdWJfYXJ0aWZhY3RfQTEuMSIgYnJpZWZEZXNjcmlwdGlvbj0iU3ViX0FydGlmYWN0IEExLjEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IlN1Yl9BcnRpZmFjdCBBMS4xIHByZXNlbnQiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIiBhY3Rpdml0eUVudHJ5U3RhdGU9IiIgYWN0aXZpdHlFeGl0U3RhdGU9IiI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9InN1Yl9hcnRpZmFjdF9BMS4xLF9sNXlVQlVEUEVkcXJoc1poM1FOQU1RIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiByZWZpbmVkRGVzY3JpcHRpb249IiI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxzdXBlckFjdGl2aXRpZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzL3N1Yl9hcnRpZmFjdF9BMS4xIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPFdvcmtQcm9kdWN0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cy9zdWJfYXJ0aWZhY3RfQTEuMSI+Ci08L1dvcmtQcm9kdWN0PgotPC9Xb3JrUHJvZHVjdERlc2NyaXB0b3I+Ci08V29ya1Byb2R1Y3REZXNjcmlwdG9yIG5hbWU9ImFydGlmYWN0X0ExIiBicmllZkRlc2NyaXB0aW9uPSJBcnRpZmFjdCBBMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iQXJ0aWZhY3QgQTEgcHJlc2VudCIgcHJlZml4PSIiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiIGFjdGl2aXR5RW50cnlTdGF0ZT0iIiBhY3Rpdml0eUV4aXRTdGF0ZT0iIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0iYXJ0aWZhY3RfQTEsX2w1eVVCa0RQRWRxcmhzWmgzUU5BTVEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHJlZmluZWREZXNjcmlwdGlvbj0iIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPHN1cGVyQWN0aXZpdGllcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMvYXJ0aWZhY3RfQTEiPgotPC9zdXBlckFjdGl2aXRpZXM+Ci08V29ya1Byb2R1Y3QgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FydGlmYWN0X0ExIj4KLTwvV29ya1Byb2R1Y3Q+Ci08L1dvcmtQcm9kdWN0RGVzY3JpcHRvcj4KLTxXb3JrUHJvZHVjdERlc2NyaXB0b3IgbmFtZT0iZGVsaXZlcmFibGVfQjIiIGJyaWVmRGVzY3JpcHRpb249IkRlbGl2ZXJhYmxlIEIyIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJEZWxpdmVyYWJsZSBCMiBwcmVzZW50IiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSIgYWN0aXZpdHlFbnRyeVN0YXRlPSIiIGFjdGl2aXR5RXhpdFN0YXRlPSIiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJkZWxpdmVyYWJsZV9CMixfbDV5VUIwRFBFZHFyaHNaaDNRTkFNUSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cy9kZWxpdmVyYWJsZV9CMiI+Ci08L3N1cGVyQWN0aXZpdGllcz4KLTxXb3JrUHJvZHVjdCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMvZGVsaXZlcmFibGVfQjIiPgotPC9Xb3JrUHJvZHVjdD4KLTxkZWxpdmVyYWJsZVBhcnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cy9hcnRpZmFjdF9CMiI+Ci08L2RlbGl2ZXJhYmxlUGFydHM+Ci08ZGVsaXZlcmFibGVQYXJ0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMvb3V0Y29tZV9CMiI+Ci08L2RlbGl2ZXJhYmxlUGFydHM+Ci08L1dvcmtQcm9kdWN0RGVzY3JpcHRvcj4KLTxXb3JrUHJvZHVjdERlc2NyaXB0b3IgbmFtZT0iZGVsaXZlcmFibGVfQTEiIGJyaWVmRGVzY3JpcHRpb249IkRlbGl2ZXJhYmxlIEExIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJEZWxpdmVyYWJsZSBBMSBwcmVzZW50IiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSIgYWN0aXZpdHlFbnRyeVN0YXRlPSIiIGFjdGl2aXR5RXhpdFN0YXRlPSIiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJkZWxpdmVyYWJsZV9BMSxfbDV5VUNFRFBFZHFyaHNaaDNRTkFNUSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cy9kZWxpdmVyYWJsZV9BMSI+Ci08L3N1cGVyQWN0aXZpdGllcz4KLTxXb3JrUHJvZHVjdCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMvZGVsaXZlcmFibGVfQTEiPgotPC9Xb3JrUHJvZHVjdD4KLTxkZWxpdmVyYWJsZVBhcnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cy9hcnRpZmFjdF9BMSI+Ci08L2RlbGl2ZXJhYmxlUGFydHM+Ci08ZGVsaXZlcmFibGVQYXJ0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMvc3ViX2FydGlmYWN0X0ExLjEiPgotPC9kZWxpdmVyYWJsZVBhcnRzPgotPGRlbGl2ZXJhYmxlUGFydHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzL291dGNvbWVfQTEiPgotPC9kZWxpdmVyYWJsZVBhcnRzPgotPC9Xb3JrUHJvZHVjdERlc2NyaXB0b3I+Ci08V29ya1Byb2R1Y3REZXNjcmlwdG9yIG5hbWU9Im91dGNvbWVfQjIiIGJyaWVmRGVzY3JpcHRpb249Ik91dGNvbWUgQjIgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9Ik91dGNvbWUgQjIgcHJlc2VudCIgcHJlZml4PSIiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiIGFjdGl2aXR5RW50cnlTdGF0ZT0iIiBhY3Rpdml0eUV4aXRTdGF0ZT0iIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0ib3V0Y29tZV9CMixfbDV5VUNVRFBFZHFyaHNaaDNRTkFNUSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cy9vdXRjb21lX0IyIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPFdvcmtQcm9kdWN0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cy9vdXRjb21lX0IyIj4KLTwvV29ya1Byb2R1Y3Q+Ci08L1dvcmtQcm9kdWN0RGVzY3JpcHRvcj4KLTxXb3JrUHJvZHVjdERlc2NyaXB0b3IgbmFtZT0ib3V0Y29tZV9BMSIgYnJpZWZEZXNjcmlwdGlvbj0iT3V0Y29tZSBBMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iT3V0Y29tZSBBMSBwcmVzZW50IiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSIgYWN0aXZpdHlFbnRyeVN0YXRlPSIiIGFjdGl2aXR5RXhpdFN0YXRlPSIiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJvdXRjb21lX0ExLF9sNXlVQ2tEUEVkcXJoc1poM1FOQU1RIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiByZWZpbmVkRGVzY3JpcHRpb249IiI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxzdXBlckFjdGl2aXRpZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzL291dGNvbWVfQTEiPgotPC9zdXBlckFjdGl2aXRpZXM+Ci08V29ya1Byb2R1Y3QgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzL291dGNvbWVfQTEiPgotPC9Xb3JrUHJvZHVjdD4KLTwvV29ya1Byb2R1Y3REZXNjcmlwdG9yPgotPFdvcmtQcm9kdWN0RGVzY3JpcHRvciBuYW1lPSJhcnRpZmFjdF9CMiIgYnJpZWZEZXNjcmlwdGlvbj0iQXJ0aWZhY3QgQjIgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IkFydGlmYWN0IEIyIHByZXNlbnQiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIiBhY3Rpdml0eUVudHJ5U3RhdGU9IiIgYWN0aXZpdHlFeGl0U3RhdGU9IiI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9ImFydGlmYWN0X0IyLF9sNTdkOEVEUEVkcXJoc1poM1FOQU1RIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiByZWZpbmVkRGVzY3JpcHRpb249IiI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxXb3JrUHJvZHVjdCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMvYXJ0aWZhY3RfQjIiPgotPC9Xb3JrUHJvZHVjdD4KLTwvV29ya1Byb2R1Y3REZXNjcmlwdG9yPgotPFdvcmtQcm9kdWN0RGVzY3JpcHRvciBuYW1lPSJvdXRjb21lX0IyIiBicmllZkRlc2NyaXB0aW9uPSJPdXRjb21lIEIyIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJPdXRjb21lIEIyIHByZXNlbnQiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIiBhY3Rpdml0eUVudHJ5U3RhdGU9IiIgYWN0aXZpdHlFeGl0U3RhdGU9IiI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9Im91dGNvbWVfQjIsX2w1N2Q4VURQRWRxcmhzWmgzUU5BTVEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHJlZmluZWREZXNjcmlwdGlvbj0iIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPFdvcmtQcm9kdWN0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cy9vdXRjb21lX0IyIj4KLTwvV29ya1Byb2R1Y3Q+Ci08L1dvcmtQcm9kdWN0RGVzY3JpcHRvcj4KLTxXb3JrUHJvZHVjdERlc2NyaXB0b3IgbmFtZT0iYXJ0aWZhY3RfQTEiIGJyaWVmRGVzY3JpcHRpb249IkFydGlmYWN0IEExIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJBcnRpZmFjdCBBMSBwcmVzZW50IiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSIgYWN0aXZpdHlFbnRyeVN0YXRlPSIiIGFjdGl2aXR5RXhpdFN0YXRlPSIiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJhcnRpZmFjdF9BMSxfbDU3ZDhrRFBFZHFyaHNaaDNRTkFNUSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08V29ya1Byb2R1Y3QgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FydGlmYWN0X0ExIj4KLTwvV29ya1Byb2R1Y3Q+Ci08L1dvcmtQcm9kdWN0RGVzY3JpcHRvcj4KLTxXb3JrUHJvZHVjdERlc2NyaXB0b3IgbmFtZT0ic3ViX2FydGlmYWN0X0ExLjEiIGJyaWVmRGVzY3JpcHRpb249IlN1Yl9BcnRpZmFjdCBBMS4xIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJTdWJfQXJ0aWZhY3QgQTEuMSBwcmVzZW50IiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSIgYWN0aXZpdHlFbnRyeVN0YXRlPSIiIGFjdGl2aXR5RXhpdFN0YXRlPSIiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJzdWJfYXJ0aWZhY3RfQTEuMSxfbDU3ZDgwRFBFZHFyaHNaaDNRTkFNUSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08V29ya1Byb2R1Y3QgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzL3N1Yl9hcnRpZmFjdF9BMS4xIj4KLTwvV29ya1Byb2R1Y3Q+Ci08L1dvcmtQcm9kdWN0RGVzY3JpcHRvcj4KLTxXb3JrUHJvZHVjdERlc2NyaXB0b3IgbmFtZT0ib3V0Y29tZV9BMSIgYnJpZWZEZXNjcmlwdGlvbj0iT3V0Y29tZSBBMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iT3V0Y29tZSBBMSBwcmVzZW50IiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSIgYWN0aXZpdHlFbnRyeVN0YXRlPSIiIGFjdGl2aXR5RXhpdFN0YXRlPSIiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJvdXRjb21lX0ExLF9sNTdkOUVEUEVkcXJoc1poM1FOQU1RIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiByZWZpbmVkRGVzY3JpcHRpb249IiI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxXb3JrUHJvZHVjdCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMvb3V0Y29tZV9BMSI+Ci08L1dvcmtQcm9kdWN0PgotPC9Xb3JrUHJvZHVjdERlc2NyaXB0b3I+Ci08RGlhZ3JhbSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxHcmFwaE5vZGUgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cyI+Ci08L2NvbnRhaW5lcj4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzIj4KLTwvZ3JhcGhFbGVtZW50PgotPGVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzIj4KLTwvZWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvR3JhcGhOb2RlPgotPEdyYXBoTm9kZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzIj4KLTwvY29udGFpbmVyPgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSIiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMiPgotPC9ncmFwaEVsZW1lbnQ+Ci08ZWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMiPgotPC9lbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9HcmFwaE5vZGU+Ci08R3JhcGhOb2RlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMiPgotPC9jb250YWluZXI+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IiI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cyI+Ci08L2dyYXBoRWxlbWVudD4KLTxlbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cyI+Ci08L2VsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0dyYXBoTm9kZT4KLTxHcmFwaE5vZGUgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cyI+Ci08L2NvbnRhaW5lcj4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzIj4KLTwvZ3JhcGhFbGVtZW50PgotPGVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzIj4KLTwvZWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvR3JhcGhOb2RlPgotPEdyYXBoTm9kZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzIj4KLTwvY29udGFpbmVyPgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSIiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMiPgotPC9ncmFwaEVsZW1lbnQ+Ci08ZWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMiPgotPC9lbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9HcmFwaE5vZGU+Ci08R3JhcGhOb2RlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMiPgotPC9jb250YWluZXI+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IiI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cyI+Ci08L2dyYXBoRWxlbWVudD4KLTxlbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cyI+Ci08L2VsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0dyYXBoTm9kZT4KLTxHcmFwaE5vZGUgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cyI+Ci08L2NvbnRhaW5lcj4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzIj4KLTwvZ3JhcGhFbGVtZW50PgotPGVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzIj4KLTwvZWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvR3JhcGhOb2RlPgotPEdyYXBoTm9kZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzIj4KLTwvY29udGFpbmVyPgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSIiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMiPgotPC9ncmFwaEVsZW1lbnQ+Ci08ZWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMiPgotPC9lbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9HcmFwaE5vZGU+Ci08R3JhcGhOb2RlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMiPgotPC9jb250YWluZXI+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IiI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cyI+Ci08L2dyYXBoRWxlbWVudD4KLTxlbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cyI+Ci08L2VsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0dyYXBoTm9kZT4KLTxHcmFwaE5vZGUgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cyI+Ci08L2NvbnRhaW5lcj4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzIj4KLTwvZ3JhcGhFbGVtZW50PgotPGVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzIj4KLTwvZWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvR3JhcGhOb2RlPgotPEdyYXBoTm9kZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzIj4KLTwvY29udGFpbmVyPgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSIiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMiPgotPC9ncmFwaEVsZW1lbnQ+Ci08ZWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMiPgotPC9lbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9HcmFwaE5vZGU+Ci08R3JhcGhOb2RlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMiPgotPC9jb250YWluZXI+Ci08UHJvcGVydHkgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIga2V5PSJ3cENvbXBvc2l0ZVR5cGUiIHZhbHVlPSIxIj4KLTwvUHJvcGVydHk+Ci08R3JhcGhFZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMiPgotPC9jb250YWluZXI+Ci08YW5jaG9yIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cyI+Ci08L2FuY2hvcj4KLTwvR3JhcGhFZGdlPgotPEdyYXBoQ29ubmVjdG9yIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMiPgotPC9ncmFwaEVsZW1lbnQ+Ci08Z3JhcGhFZGdlIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cyI+Ci08L2dyYXBoRWRnZT4KLTwvR3JhcGhDb25uZWN0b3I+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IiI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cyI+Ci08L2dyYXBoRWxlbWVudD4KLTxlbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cyI+Ci08L2VsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0dyYXBoTm9kZT4KLTxHcmFwaE5vZGUgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cyI+Ci08L2NvbnRhaW5lcj4KLTxQcm9wZXJ0eSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBrZXk9IndwQ29tcG9zaXRlVHlwZSIgdmFsdWU9IjIiPgotPC9Qcm9wZXJ0eT4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzIj4KLTwvZ3JhcGhFbGVtZW50PgotPGVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzIj4KLTwvZWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvR3JhcGhOb2RlPgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSJBY3Rpdml0eSBEZXRhaWwiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMiPgotPC9ncmFwaEVsZW1lbnQ+Ci08ZWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMiPgotPC9lbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9EaWFncmFtPgotPC9Qcm9jZXNzUGFja2FnZT4KLTxDYXBhYmlsaXR5UGF0dGVybiBuYW1lPSJDUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cyIgYnJpZWZEZXNjcmlwdGlvbj0iQnJpZWY6IENQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJDUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cyIgcHJlZml4PSIiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1JlcGVhdGFibGU9ImZhbHNlIiBpc09uZ29pbmc9ImZhbHNlIiBpc0V2ZW50RHJpdmVuPSJmYWxzZSIgdmFyaWFiaWxpdHlUeXBlPSJuYSIgaXNFbmFjdGFibGU9ImZhbHNlIj4KLTxQcm9jZXNzRGVzY3JpcHRpb24gbmFtZT0iQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMsX1p0WmJNVURGRWRxTzlNM2Z1a1lBX0EiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0ibWFpbjogQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMiIGtleUNvbnNpZGVyYXRpb25zPSJLZXlzOiBDUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cyIgdXNhZ2VHdWlkYW5jZT0idXNhZ2U6IENQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzIiBwdXJwb3NlPSJQdXJwb3NlOiBDUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cyIgYWx0ZXJuYXRpdmVzPSJhbHRlcm5hdGl2ZXM6IENQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzIiBob3d0b1N0YWZmPSJIb3cgdG8gc3RhZmY6IENQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzIiBleHRlcm5hbElkPSJFeHRlcm5hbCBJRDogQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMiIHNjb3BlPSJzY29wZTogQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMiIHVzYWdlTm90ZXM9InVzYWdlOiBDUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cyI+Ci08L1Byb2Nlc3NEZXNjcmlwdGlvbj4KLTxicmVha2Rvd25FbGVtZW50cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FjdGl2aXR5X2Zvcl92YXJpYWJpbGl0eV9lbGVtZW50cy9hY3Rpdml0eV9mb3JfdmFyaWFiaWxpdHlfZWxlbWVudHMiPgotPC9icmVha2Rvd25FbGVtZW50cz4KLTxicmVha2Rvd25FbGVtZW50cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cyI+Ci08L2JyZWFrZG93bkVsZW1lbnRzPgotPGRlZmF1bHRDb250ZXh0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMiPgotPC9kZWZhdWx0Q29udGV4dD4KLTx2YWxpZENvbnRleHQgcGF0aD0iQ29uZmlnIEEiPgotPC92YWxpZENvbnRleHQ+Ci08L0NhcGFiaWxpdHlQYXR0ZXJuPgotPC9Qcm9jZXNzQ29tcG9uZW50PgotPC9Qcm9jZXNzUGFja2FnZT4KLTxQcm9jZXNzQ29tcG9uZW50IG5hbWU9IkNQIGV4dGVuZGluZyAmYXBvcztDUDEgd2l0aCBhbGwgZWxlbWVudHMmYXBvczsiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgZ2xvYmFsPSJmYWxzZSIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiPgotPHBhcmVudFBhY2thZ2UgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIGV4dGVuZGluZyAmYXBvcztDUDEgd2l0aCBhbGwgZWxlbWVudHMmYXBvczsiPgotPC9wYXJlbnRQYWNrYWdlPgotPFByb2Nlc3NQYWNrYWdlIG5hbWU9IkNQMSB3aXRoIGFsbCBlbGVtZW50cyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBnbG9iYWw9ImZhbHNlIj4KLTxwYXJlbnRQYWNrYWdlIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBleHRlbmRpbmcgJmFwb3M7Q1AxIHdpdGggYWxsIGVsZW1lbnRzJmFwb3M7L0NQMSB3aXRoIGFsbCBlbGVtZW50cyI+Ci08L3BhcmVudFBhY2thZ2U+Ci08QWN0aXZpdHkgbmFtZT0iQ1AxIHdpdGggYWxsIGVsZW1lbnRzIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IiIgcHJlZml4PSIiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1JlcGVhdGFibGU9ImZhbHNlIiBpc09uZ29pbmc9ImZhbHNlIiBpc0V2ZW50RHJpdmVuPSJmYWxzZSIgdmFyaWFiaWxpdHlUeXBlPSJleHRlbmRzIiBpc0VuYWN0YWJsZT0iZmFsc2UiPgotPEFjdGl2aXR5RGVzY3JpcHRpb24gbmFtZT0iQ1AxIHdpdGggYWxsIGVsZW1lbnRzLF9FWGF6RUQwS0VkcWpBSTc3REh2QndBIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiBwdXJwb3NlPSIiIGFsdGVybmF0aXZlcz0iIiBob3d0b1N0YWZmPSIiPgotPC9BY3Rpdml0eURlc2NyaXB0aW9uPgotPHN1cGVyQWN0aXZpdGllcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgZXh0ZW5kaW5nICZhcG9zO0NQMSB3aXRoIGFsbCBlbGVtZW50cyZhcG9zOy9DUDEgd2l0aCBhbGwgZWxlbWVudHMvQ1AxIHdpdGggYWxsIGVsZW1lbnRzIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPHZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIGV4dGVuZGluZyAmYXBvcztDUDEgd2l0aCBhbGwgZWxlbWVudHMmYXBvczsvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL0NQMSB3aXRoIGFsbCBlbGVtZW50cyI+Ci08L3ZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQ+Ci08L0FjdGl2aXR5PgotPC9Qcm9jZXNzUGFja2FnZT4KLTxEaWFncmFtIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSJBY3Rpdml0eSBEZXRhaWwiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgZXh0ZW5kaW5nICZhcG9zO0NQMSB3aXRoIGFsbCBlbGVtZW50cyZhcG9zOyI+Ci08L2dyYXBoRWxlbWVudD4KLTxlbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBleHRlbmRpbmcgJmFwb3M7Q1AxIHdpdGggYWxsIGVsZW1lbnRzJmFwb3M7Ij4KLTwvZWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvRGlhZ3JhbT4KLTxDYXBhYmlsaXR5UGF0dGVybiBuYW1lPSJDUCBleHRlbmRpbmcgJmFwb3M7Q1AxIHdpdGggYWxsIGVsZW1lbnRzJmFwb3M7IiBicmllZkRlc2NyaXB0aW9uPSJicmllZkNQIGV4dGVuZGluZyAmYXBvcztDUDEgd2l0aCBhbGwgZWxlbWVudHMmYXBvczsiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IkNQIGV4dGVuZGluZyAmYXBvcztDUDEgd2l0aCBhbGwgZWxlbWVudHMmYXBvczsiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNSZXBlYXRhYmxlPSJmYWxzZSIgaXNPbmdvaW5nPSJmYWxzZSIgaXNFdmVudERyaXZlbj0iZmFsc2UiIHZhcmlhYmlsaXR5VHlwZT0ibmEiIGlzRW5hY3RhYmxlPSJmYWxzZSI+Ci08UHJvY2Vzc0Rlc2NyaXB0aW9uIG5hbWU9IkNhcFBhdCBBMSxfYUhVU1FSQk5FZHFCczdLaGRWTFJMQSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249IkNQIGV4dGVuZGluZyAmYXBvcztDUDEgd2l0aCBhbGwgZWxlbWVudHMmYXBvczsgbWFpbiIga2V5Q29uc2lkZXJhdGlvbnM9IkNQIGV4dGVuZGluZyAmYXBvcztDUDEgd2l0aCBhbGwgZWxlbWVudHMmYXBvczsga2V5IGNvbiIgdXNhZ2VHdWlkYW5jZT0iIiBwdXJwb3NlPSImbHQ7cCZndDsmIzEzOyYjMTA7ICAgIHB1cnBvc2U6IENQIGV4dGVuZGluZyAmYXBvcztDUDEgd2l0aCBhbGwgZWxlbWVudHMmYXBvczsmIzEzOyYjMTA7Jmx0Oy9wJmd0OyIgYWx0ZXJuYXRpdmVzPSJDUCBleHRlbmRpbmcgJmFwb3M7Q1AxIHdpdGggYWxsICZsdDtzdHJvbmcmZ3Q7ZWxlbWVudHMmYXBvczsgYWx0ZXJuJmx0Oy9zdHJvbmcmZ3Q7IiBob3d0b1N0YWZmPSJDUCBleHRlbmRpbmcgJmFwb3M7Q1AxIHdpdGggYWxsIGVsZW1lbnRzJmFwb3M7IHN0YWZmIiBleHRlcm5hbElkPSJleHRlcm5JRDpDUCBleHRlbmRpbmcgJmFwb3M7Q1AxIHdpdGggYWxsIGVsZW1lbnRzJmFwb3M7IiBzY29wZT0iQ1AgZXh0ZW5kaW5nICZhcG9zO0NQMSB3aXRoIGFsbCBlbGVtZW50cyZhcG9zOyBzY29wZSIgdXNhZ2VOb3Rlcz0iQ1AgZXh0ZW5kaW5nICZhcG9zO0NQMSB3aXRoIGFsbCBlbGVtZW50cyZhcG9zO3VzYWdlIj4KLTwvUHJvY2Vzc0Rlc2NyaXB0aW9uPgotPGJyZWFrZG93bkVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBleHRlbmRpbmcgJmFwb3M7Q1AxIHdpdGggYWxsIGVsZW1lbnRzJmFwb3M7L0NQMSB3aXRoIGFsbCBlbGVtZW50cy9DUDEgd2l0aCBhbGwgZWxlbWVudHMiPgotPC9icmVha2Rvd25FbGVtZW50cz4KLTxkZWZhdWx0Q29udGV4dCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgZXh0ZW5kaW5nICZhcG9zO0NQMSB3aXRoIGFsbCBlbGVtZW50cyZhcG9zOy9DUCBleHRlbmRpbmcgJmFwb3M7Q1AxIHdpdGggYWxsIGVsZW1lbnRzJmFwb3M7Ij4KLTwvZGVmYXVsdENvbnRleHQ+Ci08dmFsaWRDb250ZXh0IHBhdGg9IkNvbmZpZyBBIj4KLTwvdmFsaWRDb250ZXh0PgotPC9DYXBhYmlsaXR5UGF0dGVybj4KLTwvUHJvY2Vzc0NvbXBvbmVudD4KLTxQcm9jZXNzQ29tcG9uZW50IG5hbWU9IkNQIEExIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGdsb2JhbD0iZmFsc2UiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIj4KLTxwYXJlbnRQYWNrYWdlIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMSI+Ci08L3BhcmVudFBhY2thZ2U+Ci08UHJvY2Vzc1BhY2thZ2UgbmFtZT0iQWN0MSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBnbG9iYWw9ImZhbHNlIj4KLTxwYXJlbnRQYWNrYWdlIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvcGFyZW50UGFja2FnZT4KLTxBY3Rpdml0eSBuYW1lPSJBY3QxIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IkFjdDEiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNSZXBlYXRhYmxlPSJmYWxzZSIgaXNPbmdvaW5nPSJmYWxzZSIgaXNFdmVudERyaXZlbj0iZmFsc2UiIHZhcmlhYmlsaXR5VHlwZT0ibmEiIGlzRW5hY3RhYmxlPSJmYWxzZSI+Ci08QWN0aXZpdHlEZXNjcmlwdGlvbiBuYW1lPSJBY3QxLF9lYUNhb0VBdkVkcUZxSXU4LWNrb2xnIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiBwdXJwb3NlPSIiIGFsdGVybmF0aXZlcz0iIiBob3d0b1N0YWZmPSIiPgotPC9BY3Rpdml0eURlc2NyaXB0aW9uPgotPHN1cGVyQWN0aXZpdGllcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9BY3QxIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPGJyZWFrZG93bkVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL3Rhc2tfQTEiPgotPC9icmVha2Rvd25FbGVtZW50cz4KLTxicmVha2Rvd25FbGVtZW50cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9yb2xlX0ExIj4KLTwvYnJlYWtkb3duRWxlbWVudHM+Ci08YnJlYWtkb3duRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvcm9sZV9BMiI+Ci08L2JyZWFrZG93bkVsZW1lbnRzPgotPGJyZWFrZG93bkVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL3N1Yl9hcnRpZmFjdF9BMS4xIj4KLTwvYnJlYWtkb3duRWxlbWVudHM+Ci08YnJlYWtkb3duRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvYXJ0aWZhY3RfQTEiPgotPC9icmVha2Rvd25FbGVtZW50cz4KLTxicmVha2Rvd25FbGVtZW50cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9kZWxpdmVyYWJsZV9BMSI+Ci08L2JyZWFrZG93bkVsZW1lbnRzPgotPGJyZWFrZG93bkVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL291dGNvbWVfQTEiPgotPC9icmVha2Rvd25FbGVtZW50cz4KLTxicmVha2Rvd25FbGVtZW50cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS90YXNrX0IxIj4KLTwvYnJlYWtkb3duRWxlbWVudHM+Ci08YnJlYWtkb3duRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvcm9sZV9CMSI+Ci08L2JyZWFrZG93bkVsZW1lbnRzPgotPGJyZWFrZG93bkVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL3JvbGVfQjIiPgotPC9icmVha2Rvd25FbGVtZW50cz4KLTxicmVha2Rvd25FbGVtZW50cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9hcnRpZmFjdF9CMSI+Ci08L2JyZWFrZG93bkVsZW1lbnRzPgotPGJyZWFrZG93bkVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL2RlbGl2ZXJhYmxlX0IxIj4KLTwvYnJlYWtkb3duRWxlbWVudHM+Ci08YnJlYWtkb3duRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvb3V0Y29tZV9CMSI+Ci08L2JyZWFrZG93bkVsZW1lbnRzPgotPGJyZWFrZG93bkVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL3Rhc2tfQjIiPgotPC9icmVha2Rvd25FbGVtZW50cz4KLTxicmVha2Rvd25FbGVtZW50cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9hcnRpZmFjdF9CMiI+Ci08L2JyZWFrZG93bkVsZW1lbnRzPgotPGJyZWFrZG93bkVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL2RlbGl2ZXJhYmxlX0IyIj4KLTwvYnJlYWtkb3duRWxlbWVudHM+Ci08YnJlYWtkb3duRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvb3V0Y29tZV9CMiI+Ci08L2JyZWFrZG93bkVsZW1lbnRzPgotPGJyZWFrZG93bkVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL3Rhc2tfQTIiPgotPC9icmVha2Rvd25FbGVtZW50cz4KLTxicmVha2Rvd25FbGVtZW50cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9hcnRpZmFjdF9BMiI+Ci08L2JyZWFrZG93bkVsZW1lbnRzPgotPGJyZWFrZG93bkVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL2RlbGl2ZXJhYmxlX0EyIj4KLTwvYnJlYWtkb3duRWxlbWVudHM+Ci08YnJlYWtkb3duRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvb3V0Y29tZV9BMiI+Ci08L2JyZWFrZG93bkVsZW1lbnRzPgotPC9BY3Rpdml0eT4KLTxUYXNrRGVzY3JpcHRvciBuYW1lPSJ0YXNrX0ExIiBicmllZkRlc2NyaXB0aW9uPSJUYXNrIEExIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJUYXNrIEExIHByZXNlbnQiIHByZWZpeD0iIiBpc1BsYW5uZWQ9ImZhbHNlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzUmVwZWF0YWJsZT0iZmFsc2UiIGlzT25nb2luZz0iZmFsc2UiIGlzRXZlbnREcml2ZW49ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJ0YXNrX0ExLF9nRjdVc0VBdkVkcUZxSXU4LWNrb2xnIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiByZWZpbmVkRGVzY3JpcHRpb249IiI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxzdXBlckFjdGl2aXRpZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvdGFza19BMSI+Ci08L3N1cGVyQWN0aXZpdGllcz4KLTxUYXNrIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL3Rhc2tfQTEiPgotPC9UYXNrPgotPGFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL3JvbGVfQTIiPgotPC9hZGRpdGlvbmFsbHlQZXJmb3JtZWRCeT4KLTxtYW5kYXRvcnlJbnB1dCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9zdWJfYXJ0aWZhY3RfQTEuMSI+Ci08L21hbmRhdG9yeUlucHV0PgotPG1hbmRhdG9yeUlucHV0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL2FydGlmYWN0X0ExIj4KLTwvbWFuZGF0b3J5SW5wdXQ+Ci08b3B0aW9uYWxJbnB1dCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9kZWxpdmVyYWJsZV9BMSI+Ci08L29wdGlvbmFsSW5wdXQ+Ci08b3V0cHV0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL291dGNvbWVfQTEiPgotPC9vdXRwdXQ+Ci08cGVyZm9ybWVkUHJpbWFyaWx5QnkgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvdGFza19BMSI+Ci08L3BlcmZvcm1lZFByaW1hcmlseUJ5PgotPHNlbGVjdGVkU3RlcHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3Rhc2tfQTEvdGFza19BMSxfN004bnNBLVBFZHFMMk8xUEpWOWNaQS9TdGVwIEExLjEiPgotPC9zZWxlY3RlZFN0ZXBzPgotPHNlbGVjdGVkU3RlcHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3Rhc2tfQTEvdGFza19BMSxfN004bnNBLVBFZHFMMk8xUEpWOWNaQS9TdGVwIEExLjIiPgotPC9zZWxlY3RlZFN0ZXBzPgotPHNlbGVjdGVkU3RlcHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3Rhc2tfQTEvdGFza19BMSxfN004bnNBLVBFZHFMMk8xUEpWOWNaQS9TdGVwIEExLjMiPgotPC9zZWxlY3RlZFN0ZXBzPgotPC9UYXNrRGVzY3JpcHRvcj4KLTxSb2xlRGVzY3JpcHRvciBuYW1lPSJyb2xlX0ExIiBicmllZkRlc2NyaXB0aW9uPSJSb2xlIEExIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJSb2xlIEExIiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9InJvbGVfQTEsX2dGN1VzVUF2RWRxRnFJdTgtY2tvbGciIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHJlZmluZWREZXNjcmlwdGlvbj0iIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPHN1cGVyQWN0aXZpdGllcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9yb2xlX0ExIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPFJvbGUgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvcm9sZV9BMSI+Ci08L1JvbGU+Ci08bW9kaWZpZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvb3V0Y29tZV9BMSI+Ci08L21vZGlmaWVzPgotPHJlc3BvbnNpYmxlRm9yIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL2FydGlmYWN0X0ExIj4KLTwvcmVzcG9uc2libGVGb3I+Ci08cmVzcG9uc2libGVGb3IgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvZGVsaXZlcmFibGVfQTEiPgotPC9yZXNwb25zaWJsZUZvcj4KLTxyZXNwb25zaWJsZUZvciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9vdXRjb21lX0ExIj4KLTwvcmVzcG9uc2libGVGb3I+Ci08L1JvbGVEZXNjcmlwdG9yPgotPFJvbGVEZXNjcmlwdG9yIG5hbWU9InJvbGVfQTIiIGJyaWVmRGVzY3JpcHRpb249IlJvbGUgQTIgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IlJvbGUgQTIgIiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9InJvbGVfQTIsX2dGN1Vza0F2RWRxRnFJdTgtY2tvbGciIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHJlZmluZWREZXNjcmlwdGlvbj0iIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPHN1cGVyQWN0aXZpdGllcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9yb2xlX0EyIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPFJvbGUgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvcm9sZV9BMiI+Ci08L1JvbGU+Ci08bW9kaWZpZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvb3V0Y29tZV9BMiI+Ci08L21vZGlmaWVzPgotPC9Sb2xlRGVzY3JpcHRvcj4KLTxXb3JrUHJvZHVjdERlc2NyaXB0b3IgbmFtZT0ic3ViX2FydGlmYWN0X0ExLjEiIGJyaWVmRGVzY3JpcHRpb249IlN1Yl9BcnRpZmFjdCBBMS4xIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJTdWJfQXJ0aWZhY3QgQTEuMSBwcmVzZW50IiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSIgYWN0aXZpdHlFbnRyeVN0YXRlPSIiIGFjdGl2aXR5RXhpdFN0YXRlPSIiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJzdWJfYXJ0aWZhY3RfQTEuMSxfZ0Y3VXMwQXZFZHFGcUl1OC1ja29sZyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL3N1Yl9hcnRpZmFjdF9BMS4xIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPFdvcmtQcm9kdWN0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL3N1Yl9hcnRpZmFjdF9BMS4xIj4KLTwvV29ya1Byb2R1Y3Q+Ci08L1dvcmtQcm9kdWN0RGVzY3JpcHRvcj4KLTxXb3JrUHJvZHVjdERlc2NyaXB0b3IgbmFtZT0iYXJ0aWZhY3RfQTEiIGJyaWVmRGVzY3JpcHRpb249IkFydGlmYWN0IEExIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJBcnRpZmFjdCBBMSBwcmVzZW50IiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSIgYWN0aXZpdHlFbnRyeVN0YXRlPSIiIGFjdGl2aXR5RXhpdFN0YXRlPSIiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJhcnRpZmFjdF9BMSxfZ0dFZW9FQXZFZHFGcUl1OC1ja29sZyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL2FydGlmYWN0X0ExIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPFdvcmtQcm9kdWN0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL2FydGlmYWN0X0ExIj4KLTwvV29ya1Byb2R1Y3Q+Ci08L1dvcmtQcm9kdWN0RGVzY3JpcHRvcj4KLTxXb3JrUHJvZHVjdERlc2NyaXB0b3IgbmFtZT0iZGVsaXZlcmFibGVfQTEiIGJyaWVmRGVzY3JpcHRpb249IkRlbGl2ZXJhYmxlIEExIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJEZWxpdmVyYWJsZSBBMSBwcmVzZW50IiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSIgYWN0aXZpdHlFbnRyeVN0YXRlPSIiIGFjdGl2aXR5RXhpdFN0YXRlPSIiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJkZWxpdmVyYWJsZV9BMSxfZ0dFZW9VQXZFZHFGcUl1OC1ja29sZyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL2RlbGl2ZXJhYmxlX0ExIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPFdvcmtQcm9kdWN0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL2RlbGl2ZXJhYmxlX0ExIj4KLTwvV29ya1Byb2R1Y3Q+Ci08ZGVsaXZlcmFibGVQYXJ0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9hcnRpZmFjdF9BMSI+Ci08L2RlbGl2ZXJhYmxlUGFydHM+Ci08ZGVsaXZlcmFibGVQYXJ0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9zdWJfYXJ0aWZhY3RfQTEuMSI+Ci08L2RlbGl2ZXJhYmxlUGFydHM+Ci08ZGVsaXZlcmFibGVQYXJ0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9vdXRjb21lX0ExIj4KLTwvZGVsaXZlcmFibGVQYXJ0cz4KLTwvV29ya1Byb2R1Y3REZXNjcmlwdG9yPgotPFdvcmtQcm9kdWN0RGVzY3JpcHRvciBuYW1lPSJvdXRjb21lX0ExIiBicmllZkRlc2NyaXB0aW9uPSJPdXRjb21lIEExIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJPdXRjb21lIEExIHByZXNlbnQiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIiBhY3Rpdml0eUVudHJ5U3RhdGU9IiIgYWN0aXZpdHlFeGl0U3RhdGU9IiI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9Im91dGNvbWVfQTEsX2dHRWVva0F2RWRxRnFJdTgtY2tvbGciIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHJlZmluZWREZXNjcmlwdGlvbj0iIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPHN1cGVyQWN0aXZpdGllcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9vdXRjb21lX0ExIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPFdvcmtQcm9kdWN0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL291dGNvbWVfQTEiPgotPC9Xb3JrUHJvZHVjdD4KLTwvV29ya1Byb2R1Y3REZXNjcmlwdG9yPgotPFdvcmtQcm9kdWN0RGVzY3JpcHRvciBuYW1lPSJhcnRpZmFjdF9BMSIgYnJpZWZEZXNjcmlwdGlvbj0iQXJ0aWZhY3QgQTEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IkFydGlmYWN0IEExIHByZXNlbnQiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIiBhY3Rpdml0eUVudHJ5U3RhdGU9IiIgYWN0aXZpdHlFeGl0U3RhdGU9IiI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9ImFydGlmYWN0X0ExLF9nR0VlbzBBdkVkcUZxSXU4LWNrb2xnIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiByZWZpbmVkRGVzY3JpcHRpb249IiI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxXb3JrUHJvZHVjdCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9hcnRpZmFjdF9BMSI+Ci08L1dvcmtQcm9kdWN0PgotPC9Xb3JrUHJvZHVjdERlc2NyaXB0b3I+Ci08V29ya1Byb2R1Y3REZXNjcmlwdG9yIG5hbWU9InN1Yl9hcnRpZmFjdF9BMS4xIiBicmllZkRlc2NyaXB0aW9uPSJTdWJfQXJ0aWZhY3QgQTEuMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iU3ViX0FydGlmYWN0IEExLjEgcHJlc2VudCIgcHJlZml4PSIiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiIGFjdGl2aXR5RW50cnlTdGF0ZT0iIiBhY3Rpdml0eUV4aXRTdGF0ZT0iIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0ic3ViX2FydGlmYWN0X0ExLjEsX2dHRWVwRUF2RWRxRnFJdTgtY2tvbGciIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHJlZmluZWREZXNjcmlwdGlvbj0iIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPFdvcmtQcm9kdWN0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL3N1Yl9hcnRpZmFjdF9BMS4xIj4KLTwvV29ya1Byb2R1Y3Q+Ci08L1dvcmtQcm9kdWN0RGVzY3JpcHRvcj4KLTxXb3JrUHJvZHVjdERlc2NyaXB0b3IgbmFtZT0ib3V0Y29tZV9BMSIgYnJpZWZEZXNjcmlwdGlvbj0iT3V0Y29tZSBBMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iT3V0Y29tZSBBMSBwcmVzZW50IiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSIgYWN0aXZpdHlFbnRyeVN0YXRlPSIiIGFjdGl2aXR5RXhpdFN0YXRlPSIiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJvdXRjb21lX0ExLF9nR0VlcFVBdkVkcUZxSXU4LWNrb2xnIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiByZWZpbmVkRGVzY3JpcHRpb249IiI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxXb3JrUHJvZHVjdCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9vdXRjb21lX0ExIj4KLTwvV29ya1Byb2R1Y3Q+Ci08L1dvcmtQcm9kdWN0RGVzY3JpcHRvcj4KLTxUYXNrRGVzY3JpcHRvciBuYW1lPSJ0YXNrX0IxIiBicmllZkRlc2NyaXB0aW9uPSJUYXNrIEIxIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJUYXNrIEIxIHByZXNuZXQiIHByZWZpeD0iIiBpc1BsYW5uZWQ9ImZhbHNlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzUmVwZWF0YWJsZT0iZmFsc2UiIGlzT25nb2luZz0iZmFsc2UiIGlzRXZlbnREcml2ZW49ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJ0YXNrX0IxLF9qQkZlUUVBdkVkcUZxSXU4LWNrb2xnIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiByZWZpbmVkRGVzY3JpcHRpb249IiI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxzdXBlckFjdGl2aXRpZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvdGFza19CMSI+Ci08L3N1cGVyQWN0aXZpdGllcz4KLTxUYXNrIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL3Rhc2tfQjEiPgotPC9UYXNrPgotPGFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL3JvbGVfQjIiPgotPC9hZGRpdGlvbmFsbHlQZXJmb3JtZWRCeT4KLTxtYW5kYXRvcnlJbnB1dCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9hcnRpZmFjdF9CMSI+Ci08L21hbmRhdG9yeUlucHV0PgotPG9wdGlvbmFsSW5wdXQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvZGVsaXZlcmFibGVfQjEiPgotPC9vcHRpb25hbElucHV0PgotPG91dHB1dCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9vdXRjb21lX0IxIj4KLTwvb3V0cHV0PgotPHBlcmZvcm1lZFByaW1hcmlseUJ5IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL3Rhc2tfQjEiPgotPC9wZXJmb3JtZWRQcmltYXJpbHlCeT4KLTxzZWxlY3RlZFN0ZXBzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS90YXNrX0IxL3Rhc2tfQjEsX1hVNkxVQjhQRWRxc2hNTlNJMDdYT2cvU3RlcCBCMS4xIj4KLTwvc2VsZWN0ZWRTdGVwcz4KLTxzZWxlY3RlZFN0ZXBzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS90YXNrX0IxL3Rhc2tfQjEsX1hVNkxVQjhQRWRxc2hNTlNJMDdYT2cvU3RlcCBCMS4yIj4KLTwvc2VsZWN0ZWRTdGVwcz4KLTxzZWxlY3RlZFN0ZXBzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS90YXNrX0IxL3Rhc2tfQjEsX1hVNkxVQjhQRWRxc2hNTlNJMDdYT2cvU3RlcCBCMS4zIj4KLTwvc2VsZWN0ZWRTdGVwcz4KLTwvVGFza0Rlc2NyaXB0b3I+Ci08Um9sZURlc2NyaXB0b3IgbmFtZT0icm9sZV9CMSIgYnJpZWZEZXNjcmlwdGlvbj0iUm9sZSBCMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iUm9sZSBCMSBwcmVzZW50IiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9InJvbGVfQjEsX2p2U0JBRUF2RWRxRnFJdTgtY2tvbGciIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHJlZmluZWREZXNjcmlwdGlvbj0iIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPHN1cGVyQWN0aXZpdGllcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9yb2xlX0IxIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPFJvbGUgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvcm9sZV9CMSI+Ci08L1JvbGU+Ci08bW9kaWZpZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvb3V0Y29tZV9CMSI+Ci08L21vZGlmaWVzPgotPHJlc3BvbnNpYmxlRm9yIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL2FydGlmYWN0X0IxIj4KLTwvcmVzcG9uc2libGVGb3I+Ci08cmVzcG9uc2libGVGb3IgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvZGVsaXZlcmFibGVfQjEiPgotPC9yZXNwb25zaWJsZUZvcj4KLTwvUm9sZURlc2NyaXB0b3I+Ci08Um9sZURlc2NyaXB0b3IgbmFtZT0icm9sZV9CMiIgYnJpZWZEZXNjcmlwdGlvbj0iUm9sZSBCMiBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iUm9sZSBCMiBwcmVzZW50IiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9InJvbGVfQjIsX2p2U0JBVUF2RWRxRnFJdTgtY2tvbGciIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHJlZmluZWREZXNjcmlwdGlvbj0iIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPHN1cGVyQWN0aXZpdGllcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9yb2xlX0IyIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPFJvbGUgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvcm9sZV9CMiI+Ci08L1JvbGU+Ci08bW9kaWZpZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvb3V0Y29tZV9CMiI+Ci08L21vZGlmaWVzPgotPC9Sb2xlRGVzY3JpcHRvcj4KLTxXb3JrUHJvZHVjdERlc2NyaXB0b3IgbmFtZT0iYXJ0aWZhY3RfQjEiIGJyaWVmRGVzY3JpcHRpb249IkFydGlmYWN0IEIxIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJBcnRpZmFjdCBCMSBwcmVzZW50IiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSIgYWN0aXZpdHlFbnRyeVN0YXRlPSIiIGFjdGl2aXR5RXhpdFN0YXRlPSIiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJhcnRpZmFjdF9CMSxfanZTQkFrQXZFZHFGcUl1OC1ja29sZyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL2FydGlmYWN0X0IxIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPFdvcmtQcm9kdWN0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL2FydGlmYWN0X0IxIj4KLTwvV29ya1Byb2R1Y3Q+Ci08L1dvcmtQcm9kdWN0RGVzY3JpcHRvcj4KLTxXb3JrUHJvZHVjdERlc2NyaXB0b3IgbmFtZT0iZGVsaXZlcmFibGVfQjEiIGJyaWVmRGVzY3JpcHRpb249IkRlbGl2ZXJhYmxlIEIxIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJEZWxpdmVyYWJsZSBCMSBwcmVzZW50IiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSIgYWN0aXZpdHlFbnRyeVN0YXRlPSIiIGFjdGl2aXR5RXhpdFN0YXRlPSIiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJkZWxpdmVyYWJsZV9CMSxfanZTQkEwQXZFZHFGcUl1OC1ja29sZyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL2RlbGl2ZXJhYmxlX0IxIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPFdvcmtQcm9kdWN0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL2RlbGl2ZXJhYmxlX0IxIj4KLTwvV29ya1Byb2R1Y3Q+Ci08ZGVsaXZlcmFibGVQYXJ0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9hcnRpZmFjdF9CMSI+Ci08L2RlbGl2ZXJhYmxlUGFydHM+Ci08ZGVsaXZlcmFibGVQYXJ0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9vdXRjb21lX0IxIj4KLTwvZGVsaXZlcmFibGVQYXJ0cz4KLTwvV29ya1Byb2R1Y3REZXNjcmlwdG9yPgotPFdvcmtQcm9kdWN0RGVzY3JpcHRvciBuYW1lPSJvdXRjb21lX0IxIiBicmllZkRlc2NyaXB0aW9uPSJPdXRjb21lIEIxIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJPdXRjb21lIEIxIHByZXNlbnQiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIiBhY3Rpdml0eUVudHJ5U3RhdGU9IiIgYWN0aXZpdHlFeGl0U3RhdGU9IiI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9Im91dGNvbWVfQjEsX2p2U0JCRUF2RWRxRnFJdTgtY2tvbGciIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHJlZmluZWREZXNjcmlwdGlvbj0iIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPHN1cGVyQWN0aXZpdGllcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9vdXRjb21lX0IxIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPFdvcmtQcm9kdWN0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL291dGNvbWVfQjEiPgotPC9Xb3JrUHJvZHVjdD4KLTwvV29ya1Byb2R1Y3REZXNjcmlwdG9yPgotPFdvcmtQcm9kdWN0RGVzY3JpcHRvciBuYW1lPSJhcnRpZmFjdF9CMSIgYnJpZWZEZXNjcmlwdGlvbj0iQXJ0aWZhY3QgQjEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IkFydGlmYWN0IEIxIHByZXNlbnQiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIiBhY3Rpdml0eUVudHJ5U3RhdGU9IiIgYWN0aXZpdHlFeGl0U3RhdGU9IiI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9ImFydGlmYWN0X0IxLF9qdmJLOEVBdkVkcUZxSXU4LWNrb2xnIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiByZWZpbmVkRGVzY3JpcHRpb249IiI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxXb3JrUHJvZHVjdCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9hcnRpZmFjdF9CMSI+Ci08L1dvcmtQcm9kdWN0PgotPC9Xb3JrUHJvZHVjdERlc2NyaXB0b3I+Ci08V29ya1Byb2R1Y3REZXNjcmlwdG9yIG5hbWU9Im91dGNvbWVfQjEiIGJyaWVmRGVzY3JpcHRpb249Ik91dGNvbWUgQjEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9Ik91dGNvbWUgQjEgcHJlc2VudCIgcHJlZml4PSIiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiIGFjdGl2aXR5RW50cnlTdGF0ZT0iIiBhY3Rpdml0eUV4aXRTdGF0ZT0iIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0ib3V0Y29tZV9CMSxfanZiSzhVQXZFZHFGcUl1OC1ja29sZyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08V29ya1Byb2R1Y3QgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvb3V0Y29tZV9CMSI+Ci08L1dvcmtQcm9kdWN0PgotPC9Xb3JrUHJvZHVjdERlc2NyaXB0b3I+Ci08VGFza0Rlc2NyaXB0b3IgbmFtZT0idGFza19CMiIgYnJpZWZEZXNjcmlwdGlvbj0iVGFzayBCMiBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iVGFzayBCMiBwcmVzZW50IiBwcmVmaXg9IiIgaXNQbGFubmVkPSJmYWxzZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1JlcGVhdGFibGU9ImZhbHNlIiBpc09uZ29pbmc9ImZhbHNlIiBpc0V2ZW50RHJpdmVuPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0idGFza19CMixfa1lqbmdFQXZFZHFGcUl1OC1ja29sZyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL3Rhc2tfQjIiPgotPC9zdXBlckFjdGl2aXRpZXM+Ci08VGFzayBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS90YXNrX0IyIj4KLTwvVGFzaz4KLTxhZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9yb2xlX0IxIj4KLTwvYWRkaXRpb25hbGx5UGVyZm9ybWVkQnk+Ci08bWFuZGF0b3J5SW5wdXQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvYXJ0aWZhY3RfQjIiPgotPC9tYW5kYXRvcnlJbnB1dD4KLTxvcHRpb25hbElucHV0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL2RlbGl2ZXJhYmxlX0IyIj4KLTwvb3B0aW9uYWxJbnB1dD4KLTxvdXRwdXQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvb3V0Y29tZV9CMiI+Ci08L291dHB1dD4KLTxwZXJmb3JtZWRQcmltYXJpbHlCeSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS90YXNrX0IyIj4KLTwvcGVyZm9ybWVkUHJpbWFyaWx5Qnk+Ci08c2VsZWN0ZWRTdGVwcyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvdGFza19CMi90YXNrX0IyLF9aTE9Nc0I4UEVkcXNoTU5TSTA3WE9nL1N0ZXAgQjIuMSI+Ci08L3NlbGVjdGVkU3RlcHM+Ci08c2VsZWN0ZWRTdGVwcyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvdGFza19CMi90YXNrX0IyLF9aTE9Nc0I4UEVkcXNoTU5TSTA3WE9nL1N0ZXAgQjIuMiI+Ci08L3NlbGVjdGVkU3RlcHM+Ci08c2VsZWN0ZWRTdGVwcyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvdGFza19CMi90YXNrX0IyLF9aTE9Nc0I4UEVkcXNoTU5TSTA3WE9nL1N0ZXAgQjIuMyI+Ci08L3NlbGVjdGVkU3RlcHM+Ci08L1Rhc2tEZXNjcmlwdG9yPgotPFdvcmtQcm9kdWN0RGVzY3JpcHRvciBuYW1lPSJhcnRpZmFjdF9CMiIgYnJpZWZEZXNjcmlwdGlvbj0iQXJ0aWZhY3QgQjIgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IkFydGlmYWN0IEIyIHByZXNlbnQiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIiBhY3Rpdml0eUVudHJ5U3RhdGU9IiIgYWN0aXZpdHlFeGl0U3RhdGU9IiI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9ImFydGlmYWN0X0IyLF9rWV9zWUVBdkVkcUZxSXU4LWNrb2xnIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiByZWZpbmVkRGVzY3JpcHRpb249IiI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxzdXBlckFjdGl2aXRpZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvYXJ0aWZhY3RfQjIiPgotPC9zdXBlckFjdGl2aXRpZXM+Ci08V29ya1Byb2R1Y3QgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvYXJ0aWZhY3RfQjIiPgotPC9Xb3JrUHJvZHVjdD4KLTwvV29ya1Byb2R1Y3REZXNjcmlwdG9yPgotPFdvcmtQcm9kdWN0RGVzY3JpcHRvciBuYW1lPSJkZWxpdmVyYWJsZV9CMiIgYnJpZWZEZXNjcmlwdGlvbj0iRGVsaXZlcmFibGUgQjIgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IkRlbGl2ZXJhYmxlIEIyIHByZXNlbnQiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIiBhY3Rpdml0eUVudHJ5U3RhdGU9IiIgYWN0aXZpdHlFeGl0U3RhdGU9IiI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9ImRlbGl2ZXJhYmxlX0IyLF9rWV9zWVVBdkVkcUZxSXU4LWNrb2xnIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiByZWZpbmVkRGVzY3JpcHRpb249IiI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxzdXBlckFjdGl2aXRpZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvZGVsaXZlcmFibGVfQjIiPgotPC9zdXBlckFjdGl2aXRpZXM+Ci08V29ya1Byb2R1Y3QgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvZGVsaXZlcmFibGVfQjIiPgotPC9Xb3JrUHJvZHVjdD4KLTxkZWxpdmVyYWJsZVBhcnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL2FydGlmYWN0X0IyIj4KLTwvZGVsaXZlcmFibGVQYXJ0cz4KLTxkZWxpdmVyYWJsZVBhcnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL291dGNvbWVfQjIiPgotPC9kZWxpdmVyYWJsZVBhcnRzPgotPC9Xb3JrUHJvZHVjdERlc2NyaXB0b3I+Ci08V29ya1Byb2R1Y3REZXNjcmlwdG9yIG5hbWU9Im91dGNvbWVfQjIiIGJyaWVmRGVzY3JpcHRpb249Ik91dGNvbWUgQjIgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9Ik91dGNvbWUgQjIgcHJlc2VudCIgcHJlZml4PSIiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiIGFjdGl2aXR5RW50cnlTdGF0ZT0iIiBhY3Rpdml0eUV4aXRTdGF0ZT0iIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0ib3V0Y29tZV9CMixfa1lfc1lrQXZFZHFGcUl1OC1ja29sZyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL291dGNvbWVfQjIiPgotPC9zdXBlckFjdGl2aXRpZXM+Ci08V29ya1Byb2R1Y3QgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvb3V0Y29tZV9CMiI+Ci08L1dvcmtQcm9kdWN0PgotPC9Xb3JrUHJvZHVjdERlc2NyaXB0b3I+Ci08V29ya1Byb2R1Y3REZXNjcmlwdG9yIG5hbWU9ImFydGlmYWN0X0IyIiBicmllZkRlc2NyaXB0aW9uPSJBcnRpZmFjdCBCMiBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iQXJ0aWZhY3QgQjIgcHJlc2VudCIgcHJlZml4PSIiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiIGFjdGl2aXR5RW50cnlTdGF0ZT0iIiBhY3Rpdml0eUV4aXRTdGF0ZT0iIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0iYXJ0aWZhY3RfQjIsX2taSmRZRUF2RWRxRnFJdTgtY2tvbGciIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHJlZmluZWREZXNjcmlwdGlvbj0iIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPFdvcmtQcm9kdWN0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL2FydGlmYWN0X0IyIj4KLTwvV29ya1Byb2R1Y3Q+Ci08L1dvcmtQcm9kdWN0RGVzY3JpcHRvcj4KLTxXb3JrUHJvZHVjdERlc2NyaXB0b3IgbmFtZT0ib3V0Y29tZV9CMiIgYnJpZWZEZXNjcmlwdGlvbj0iT3V0Y29tZSBCMiBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iT3V0Y29tZSBCMiBwcmVzZW50IiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSIgYWN0aXZpdHlFbnRyeVN0YXRlPSIiIGFjdGl2aXR5RXhpdFN0YXRlPSIiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJvdXRjb21lX0IyLF9rWkpkWVVBdkVkcUZxSXU4LWNrb2xnIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiByZWZpbmVkRGVzY3JpcHRpb249IiI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxXb3JrUHJvZHVjdCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9vdXRjb21lX0IyIj4KLTwvV29ya1Byb2R1Y3Q+Ci08L1dvcmtQcm9kdWN0RGVzY3JpcHRvcj4KLTxUYXNrRGVzY3JpcHRvciBuYW1lPSJ0YXNrX0EyIiBicmllZkRlc2NyaXB0aW9uPSJUYXNrIEEyIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJUYXNrIEEyICIgcHJlZml4PSIiIGlzUGxhbm5lZD0iZmFsc2UiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNSZXBlYXRhYmxlPSJmYWxzZSIgaXNPbmdvaW5nPSJmYWxzZSIgaXNFdmVudERyaXZlbj0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9InRhc2tfQTIsX2EwZ2t3RUEzRWRxRnFJdTgtY2tvbGciIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHJlZmluZWREZXNjcmlwdGlvbj0iIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPHN1cGVyQWN0aXZpdGllcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS90YXNrX0EyIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPFRhc2sgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvdGFza19BMiI+Ci08L1Rhc2s+Ci08YWRkaXRpb25hbGx5UGVyZm9ybWVkQnkgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvcm9sZV9BMSI+Ci08L2FkZGl0aW9uYWxseVBlcmZvcm1lZEJ5PgotPG1hbmRhdG9yeUlucHV0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL2FydGlmYWN0X0EyIj4KLTwvbWFuZGF0b3J5SW5wdXQ+Ci08b3B0aW9uYWxJbnB1dCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9kZWxpdmVyYWJsZV9BMiI+Ci08L29wdGlvbmFsSW5wdXQ+Ci08b3V0cHV0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL291dGNvbWVfQTIiPgotPC9vdXRwdXQ+Ci08cGVyZm9ybWVkUHJpbWFyaWx5QnkgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvdGFza19BMiI+Ci08L3BlcmZvcm1lZFByaW1hcmlseUJ5PgotPHNlbGVjdGVkU3RlcHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3Rhc2tfQTIvdGFza19BMixfNzVOUXdBLVBFZHFMMk8xUEpWOWNaQS9TdGVwIEEyLjEiPgotPC9zZWxlY3RlZFN0ZXBzPgotPHNlbGVjdGVkU3RlcHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3Rhc2tfQTIvdGFza19BMixfNzVOUXdBLVBFZHFMMk8xUEpWOWNaQS9TdGVwIEEyLjIiPgotPC9zZWxlY3RlZFN0ZXBzPgotPHNlbGVjdGVkU3RlcHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3Rhc2tfQTIvdGFza19BMixfNzVOUXdBLVBFZHFMMk8xUEpWOWNaQS9TdGVwIEEyLjMiPgotPC9zZWxlY3RlZFN0ZXBzPgotPC9UYXNrRGVzY3JpcHRvcj4KLTxXb3JrUHJvZHVjdERlc2NyaXB0b3IgbmFtZT0iYXJ0aWZhY3RfQTIiIGJyaWVmRGVzY3JpcHRpb249IkFydGlmYWN0IEEyIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJBcnRpZmFjdCBBMiBwcmVzZW50IiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSIgYWN0aXZpdHlFbnRyeVN0YXRlPSIiIGFjdGl2aXR5RXhpdFN0YXRlPSIiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJhcnRpZmFjdF9BMixfYTF0ZW9FQTNFZHFGcUl1OC1ja29sZyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL2FydGlmYWN0X0EyIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPFdvcmtQcm9kdWN0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL2FydGlmYWN0X0EyIj4KLTwvV29ya1Byb2R1Y3Q+Ci08L1dvcmtQcm9kdWN0RGVzY3JpcHRvcj4KLTxXb3JrUHJvZHVjdERlc2NyaXB0b3IgbmFtZT0iZGVsaXZlcmFibGVfQTIiIGJyaWVmRGVzY3JpcHRpb249IkRlbGl2ZXJhYmxlIEEyIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJEZWxpdmVyYWJsZSBBMiBwcmVzZW50IiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSIgYWN0aXZpdHlFbnRyeVN0YXRlPSIiIGFjdGl2aXR5RXhpdFN0YXRlPSIiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJkZWxpdmVyYWJsZV9BMixfYTJkRmdFQTNFZHFGcUl1OC1ja29sZyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL2RlbGl2ZXJhYmxlX0EyIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPFdvcmtQcm9kdWN0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL2RlbGl2ZXJhYmxlX0EyIj4KLTwvV29ya1Byb2R1Y3Q+Ci08ZGVsaXZlcmFibGVQYXJ0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9hcnRpZmFjdF9BMiI+Ci08L2RlbGl2ZXJhYmxlUGFydHM+Ci08ZGVsaXZlcmFibGVQYXJ0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9vdXRjb21lX0EyIj4KLTwvZGVsaXZlcmFibGVQYXJ0cz4KLTwvV29ya1Byb2R1Y3REZXNjcmlwdG9yPgotPFdvcmtQcm9kdWN0RGVzY3JpcHRvciBuYW1lPSJvdXRjb21lX0EyIiBicmllZkRlc2NyaXB0aW9uPSJPdXRjb21lIEExIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJPdXRjb21lIEEyIHByZXNlbnQiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIiBhY3Rpdml0eUVudHJ5U3RhdGU9IiIgYWN0aXZpdHlFeGl0U3RhdGU9IiI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9Im91dGNvbWVfQTIsX2EzTXNZRUEzRWRxRnFJdTgtY2tvbGciIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHJlZmluZWREZXNjcmlwdGlvbj0iIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPHN1cGVyQWN0aXZpdGllcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9vdXRjb21lX0EyIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPFdvcmtQcm9kdWN0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL291dGNvbWVfQTIiPgotPC9Xb3JrUHJvZHVjdD4KLTwvV29ya1Byb2R1Y3REZXNjcmlwdG9yPgotPFdvcmtQcm9kdWN0RGVzY3JpcHRvciBuYW1lPSJhcnRpZmFjdF9BMiIgYnJpZWZEZXNjcmlwdGlvbj0iQXJ0aWZhY3QgQTIgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IkFydGlmYWN0IEEyIHByZXNlbnQiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIiBhY3Rpdml0eUVudHJ5U3RhdGU9IiIgYWN0aXZpdHlFeGl0U3RhdGU9IiI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9ImFydGlmYWN0X0EyLF9hNEdFUUVBM0VkcUZxSXU4LWNrb2xnIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiByZWZpbmVkRGVzY3JpcHRpb249IiI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxXb3JrUHJvZHVjdCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9hcnRpZmFjdF9BMiI+Ci08L1dvcmtQcm9kdWN0PgotPC9Xb3JrUHJvZHVjdERlc2NyaXB0b3I+Ci08V29ya1Byb2R1Y3REZXNjcmlwdG9yIG5hbWU9Im91dGNvbWVfQTIiIGJyaWVmRGVzY3JpcHRpb249Ik91dGNvbWUgQTEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9Ik91dGNvbWUgQTIgcHJlc2VudCIgcHJlZml4PSIiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiIGFjdGl2aXR5RW50cnlTdGF0ZT0iIiBhY3Rpdml0eUV4aXRTdGF0ZT0iIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0ib3V0Y29tZV9BMixfYTQxcklFQTNFZHFGcUl1OC1ja29sZyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08V29ya1Byb2R1Y3QgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvb3V0Y29tZV9BMiI+Ci08L1dvcmtQcm9kdWN0PgotPC9Xb3JrUHJvZHVjdERlc2NyaXB0b3I+Ci08RGlhZ3JhbSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxHcmFwaE5vZGUgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvY29udGFpbmVyPgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSIiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2dyYXBoRWxlbWVudD4KLTxlbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvZWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvR3JhcGhOb2RlPgotPEdyYXBoTm9kZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9jb250YWluZXI+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IiI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9lbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9HcmFwaE5vZGU+Ci08R3JhcGhOb2RlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2NvbnRhaW5lcj4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9ncmFwaEVsZW1lbnQ+Ci08ZWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2VsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0dyYXBoTm9kZT4KLTxHcmFwaE5vZGUgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvY29udGFpbmVyPgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSIiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2dyYXBoRWxlbWVudD4KLTxlbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvZWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvR3JhcGhOb2RlPgotPEdyYXBoTm9kZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9jb250YWluZXI+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IiI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9lbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9HcmFwaE5vZGU+Ci08R3JhcGhOb2RlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2NvbnRhaW5lcj4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9ncmFwaEVsZW1lbnQ+Ci08ZWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2VsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0dyYXBoTm9kZT4KLTxHcmFwaE5vZGUgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvY29udGFpbmVyPgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSIiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2dyYXBoRWxlbWVudD4KLTxlbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvZWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvR3JhcGhOb2RlPgotPEdyYXBoTm9kZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9jb250YWluZXI+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IiI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9lbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9HcmFwaE5vZGU+Ci08R3JhcGhOb2RlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2NvbnRhaW5lcj4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9ncmFwaEVsZW1lbnQ+Ci08ZWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2VsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0dyYXBoTm9kZT4KLTxHcmFwaE5vZGUgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvY29udGFpbmVyPgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSIiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2dyYXBoRWxlbWVudD4KLTxlbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvZWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvR3JhcGhOb2RlPgotPEdyYXBoTm9kZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9jb250YWluZXI+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IiI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9lbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9HcmFwaE5vZGU+Ci08R3JhcGhOb2RlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2NvbnRhaW5lcj4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9ncmFwaEVsZW1lbnQ+Ci08ZWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2VsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0dyYXBoTm9kZT4KLTxHcmFwaE5vZGUgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvY29udGFpbmVyPgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSIiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2dyYXBoRWxlbWVudD4KLTxlbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvZWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvR3JhcGhOb2RlPgotPEdyYXBoTm9kZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9jb250YWluZXI+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IiI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9lbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9HcmFwaE5vZGU+Ci08R3JhcGhOb2RlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2NvbnRhaW5lcj4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9ncmFwaEVsZW1lbnQ+Ci08ZWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2VsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0dyYXBoTm9kZT4KLTxHcmFwaE5vZGUgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvY29udGFpbmVyPgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSIiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2dyYXBoRWxlbWVudD4KLTxlbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvZWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvR3JhcGhOb2RlPgotPEdyYXBoTm9kZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9jb250YWluZXI+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IiI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9lbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9HcmFwaE5vZGU+Ci08R3JhcGhOb2RlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2NvbnRhaW5lcj4KLTxQcm9wZXJ0eSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBrZXk9IndwQ29tcG9zaXRlVHlwZSIgdmFsdWU9IjEiPgotPC9Qcm9wZXJ0eT4KLTxHcmFwaEVkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvY29udGFpbmVyPgotPGFuY2hvciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2FuY2hvcj4KLTwvR3JhcGhFZGdlPgotPEdyYXBoRWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9jb250YWluZXI+Ci08YW5jaG9yIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvYW5jaG9yPgotPC9HcmFwaEVkZ2U+Ci08R3JhcGhFZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2NvbnRhaW5lcj4KLTxhbmNob3IgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9hbmNob3I+Ci08L0dyYXBoRWRnZT4KLTxHcmFwaEVkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvY29udGFpbmVyPgotPGFuY2hvciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2FuY2hvcj4KLTwvR3JhcGhFZGdlPgotPEdyYXBoRWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9jb250YWluZXI+Ci08YW5jaG9yIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvYW5jaG9yPgotPC9HcmFwaEVkZ2U+Ci08R3JhcGhDb25uZWN0b3IgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGdyYXBoRWRnZSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2dyYXBoRWRnZT4KLTwvR3JhcGhDb25uZWN0b3I+Ci08R3JhcGhDb25uZWN0b3IgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGdyYXBoRWRnZSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2dyYXBoRWRnZT4KLTwvR3JhcGhDb25uZWN0b3I+Ci08R3JhcGhDb25uZWN0b3IgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGdyYXBoRWRnZSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2dyYXBoRWRnZT4KLTwvR3JhcGhDb25uZWN0b3I+Ci08R3JhcGhDb25uZWN0b3IgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGdyYXBoRWRnZSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2dyYXBoRWRnZT4KLTwvR3JhcGhDb25uZWN0b3I+Ci08R3JhcGhDb25uZWN0b3IgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGdyYXBoRWRnZSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2dyYXBoRWRnZT4KLTwvR3JhcGhDb25uZWN0b3I+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IiI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9lbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9HcmFwaE5vZGU+Ci08R3JhcGhOb2RlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2NvbnRhaW5lcj4KLTxQcm9wZXJ0eSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBrZXk9IndwQ29tcG9zaXRlVHlwZSIgdmFsdWU9IjIiPgotPC9Qcm9wZXJ0eT4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9ncmFwaEVsZW1lbnQ+Ci08ZWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2VsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0dyYXBoTm9kZT4KLTxHcmFwaE5vZGUgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvY29udGFpbmVyPgotPFByb3BlcnR5IG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIGtleT0id3BDb21wb3NpdGVUeXBlIiB2YWx1ZT0iMSI+Ci08L1Byb3BlcnR5PgotPEdyYXBoRWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9jb250YWluZXI+Ci08YW5jaG9yIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvYW5jaG9yPgotPC9HcmFwaEVkZ2U+Ci08R3JhcGhFZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2NvbnRhaW5lcj4KLTxhbmNob3IgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9hbmNob3I+Ci08L0dyYXBoRWRnZT4KLTxHcmFwaENvbm5lY3RvciBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9ncmFwaEVsZW1lbnQ+Ci08Z3JhcGhFZGdlIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvZ3JhcGhFZGdlPgotPC9HcmFwaENvbm5lY3Rvcj4KLTxHcmFwaENvbm5lY3RvciBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9ncmFwaEVsZW1lbnQ+Ci08Z3JhcGhFZGdlIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvZ3JhcGhFZGdlPgotPC9HcmFwaENvbm5lY3Rvcj4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9ncmFwaEVsZW1lbnQ+Ci08ZWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2VsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0dyYXBoTm9kZT4KLTxHcmFwaE5vZGUgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvY29udGFpbmVyPgotPFByb3BlcnR5IG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIGtleT0id3BDb21wb3NpdGVUeXBlIiB2YWx1ZT0iMiI+Ci08L1Byb3BlcnR5PgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSIiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2dyYXBoRWxlbWVudD4KLTxlbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvZWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvR3JhcGhOb2RlPgotPEdyYXBoTm9kZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9jb250YWluZXI+Ci08UHJvcGVydHkgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIga2V5PSJ3cENvbXBvc2l0ZVR5cGUiIHZhbHVlPSIxIj4KLTwvUHJvcGVydHk+Ci08R3JhcGhFZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2NvbnRhaW5lcj4KLTxhbmNob3IgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9hbmNob3I+Ci08L0dyYXBoRWRnZT4KLTxHcmFwaEVkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvY29udGFpbmVyPgotPGFuY2hvciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2FuY2hvcj4KLTwvR3JhcGhFZGdlPgotPEdyYXBoQ29ubmVjdG9yIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2dyYXBoRWxlbWVudD4KLTxncmFwaEVkZ2UgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9ncmFwaEVkZ2U+Ci08L0dyYXBoQ29ubmVjdG9yPgotPEdyYXBoQ29ubmVjdG9yIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2dyYXBoRWxlbWVudD4KLTxncmFwaEVkZ2UgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9ncmFwaEVkZ2U+Ci08L0dyYXBoQ29ubmVjdG9yPgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSIiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2dyYXBoRWxlbWVudD4KLTxlbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvZWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvR3JhcGhOb2RlPgotPEdyYXBoTm9kZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9jb250YWluZXI+Ci08UHJvcGVydHkgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIga2V5PSJ3cENvbXBvc2l0ZVR5cGUiIHZhbHVlPSIyIj4KLTwvUHJvcGVydHk+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IiI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9lbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9HcmFwaE5vZGU+Ci08R3JhcGhOb2RlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2NvbnRhaW5lcj4KLTxQcm9wZXJ0eSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBrZXk9IndwQ29tcG9zaXRlVHlwZSIgdmFsdWU9IjEiPgotPC9Qcm9wZXJ0eT4KLTxHcmFwaEVkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvY29udGFpbmVyPgotPGFuY2hvciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2FuY2hvcj4KLTwvR3JhcGhFZGdlPgotPEdyYXBoQ29ubmVjdG9yIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2dyYXBoRWxlbWVudD4KLTxncmFwaEVkZ2UgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9ncmFwaEVkZ2U+Ci08L0dyYXBoQ29ubmVjdG9yPgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSIiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2dyYXBoRWxlbWVudD4KLTxlbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvZWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvR3JhcGhOb2RlPgotPEdyYXBoTm9kZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9jb250YWluZXI+Ci08UHJvcGVydHkgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIga2V5PSJ3cENvbXBvc2l0ZVR5cGUiIHZhbHVlPSIyIj4KLTwvUHJvcGVydHk+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IiI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9lbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9HcmFwaE5vZGU+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IkFjdGl2aXR5IERldGFpbCI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9lbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9EaWFncmFtPgotPC9Qcm9jZXNzUGFja2FnZT4KLTxEaWFncmFtIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSJBY3Rpdml0eSBEZXRhaWwiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEiPgotPC9ncmFwaEVsZW1lbnQ+Ci08ZWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEiPgotPC9lbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9EaWFncmFtPgotPENhcGFiaWxpdHlQYXR0ZXJuIG5hbWU9IkNQIEExIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IkNQIEExIiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzUmVwZWF0YWJsZT0iZmFsc2UiIGlzT25nb2luZz0iZmFsc2UiIGlzRXZlbnREcml2ZW49ImZhbHNlIiB2YXJpYWJpbGl0eVR5cGU9Im5hIiBpc0VuYWN0YWJsZT0iZmFsc2UiPgotPFByb2Nlc3NEZXNjcmlwdGlvbiBuYW1lPSJDUCBBMSxfZEJodmtVQXZFZHFGcUl1OC1ja29sZyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiBwdXJwb3NlPSIiIGFsdGVybmF0aXZlcz0iIiBob3d0b1N0YWZmPSIiIGV4dGVybmFsSWQ9IiIgc2NvcGU9IiIgdXNhZ2VOb3Rlcz0iIj4KLTwvUHJvY2Vzc0Rlc2NyaXB0aW9uPgotPGJyZWFrZG93bkVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL0FjdDEiPgotPC9icmVha2Rvd25FbGVtZW50cz4KLTxkZWZhdWx0Q29udGV4dCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQ1AgQTEiPgotPC9kZWZhdWx0Q29udGV4dD4KLTx2YWxpZENvbnRleHQgcGF0aD0iQ29uZmlnIEEiPgotPC92YWxpZENvbnRleHQ+Ci08L0NhcGFiaWxpdHlQYXR0ZXJuPgotPC9Qcm9jZXNzQ29tcG9uZW50PgotPC9Qcm9jZXNzUGFja2FnZT4KLTwvQ29udGVudFBhY2thZ2U+Ci08UHJvY2Vzc1BhY2thZ2UgbmFtZT0iRGVsaXZlcnlQcm9jZXNzZXMiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgZ2xvYmFsPSJmYWxzZSI+Ci08UHJvY2Vzc0NvbXBvbmVudCBuYW1lPSJkZWxQcm9jX0ExIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGdsb2JhbD0iZmFsc2UiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIj4KLTxwYXJlbnRQYWNrYWdlIHBhdGg9IlBsdWcgQS9EZWxpdmVyeVByb2Nlc3Nlcy9kZWxQcm9jX0ExIj4KLTwvcGFyZW50UGFja2FnZT4KLTxEZWxpdmVyeVByb2Nlc3MgbmFtZT0iZGVsUHJvY19BMSIgYnJpZWZEZXNjcmlwdGlvbj0iRGVsUHJvYyBBMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iRGVsUHJvYyBBMSBwcmVzZW50IiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzUmVwZWF0YWJsZT0iZmFsc2UiIGlzT25nb2luZz0iZmFsc2UiIGlzRXZlbnREcml2ZW49ImZhbHNlIiB2YXJpYWJpbGl0eVR5cGU9Im5hIiBpc0VuYWN0YWJsZT0iZmFsc2UiPgotPERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uIG5hbWU9IkRlbFByb2MgQTEsX1c2YTRjUkJORWRxQnM3S2hkVkxSTEEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSJEZWxQcm9jIEExIG1haW4iIGtleUNvbnNpZGVyYXRpb25zPSJEZWxQcm9jIEExIGtleSBjb24iIHVzYWdlR3VpZGFuY2U9IiIgcHVycG9zZT0iRGVsUHJvYyBBMSBwb3Jwb2lzZSIgYWx0ZXJuYXRpdmVzPSJEZWxQcm9jIEExIGFsdGVybiIgaG93dG9TdGFmZj0iRGVsUHJvYyBBMSBzdGFmZiIgZXh0ZXJuYWxJZD0iRGVsUHJvYyBBMSBleHRlcm5JRCIgc2NvcGU9IkRlbFByb2MgQTEgc2NvcGUiIHVzYWdlTm90ZXM9IkRlbFByb2MgQTEgdXNhZ2UiIHNjYWxlPSJEZWxQcm9jIEExIHNjYWxlIiBwcm9qZWN0Q2hhcmFjdGVyaXN0aWNzPSJEZWxQcm9jIEExIHByb2ogY2hhciIgcmlza0xldmVsPSJEZWxQcm9jIEExIHJpc2siIGVzdGltYXRpbmdUZWNobmlxdWU9IkRlbFByb2MgQTEgZXN0IHRlY2giIHByb2plY3RNZW1iZXJFeHBlcnRpc2U9IkRlbFByb2MgQTEgZXhwZXJ0aXNlIiB0eXBlT2ZDb250cmFjdD0iRGVsUHJvYyBBMSBjb250eXBlIj4KLTwvRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24+Ci08ZGVmYXVsdENvbnRleHQgcGF0aD0iUGx1ZyBBL0RlbGl2ZXJ5UHJvY2Vzc2VzL2RlbFByb2NfQTEvZGVsUHJvY19BMSI+Ci08L2RlZmF1bHRDb250ZXh0PgotPHZhbGlkQ29udGV4dCBwYXRoPSJDb25maWcgQSI+Ci08L3ZhbGlkQ29udGV4dD4KLTwvRGVsaXZlcnlQcm9jZXNzPgotPC9Qcm9jZXNzQ29tcG9uZW50PgotPFByb2Nlc3NQYWNrYWdlIG5hbWU9ImRlbFByb2NQYWsgQTEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgZ2xvYmFsPSJmYWxzZSI+Ci08cGFyZW50UGFja2FnZSBwYXRoPSJQbHVnIEEvRGVsaXZlcnlQcm9jZXNzZXMvZGVsUHJvY1BhayBBMSI+Ci08L3BhcmVudFBhY2thZ2U+Ci08UHJvY2Vzc0NvbXBvbmVudCBuYW1lPSJkZWxQcm9jUGFrX0ExLjEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgZ2xvYmFsPSJmYWxzZSIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiPgotPHBhcmVudFBhY2thZ2UgcGF0aD0iUGx1ZyBBL0RlbGl2ZXJ5UHJvY2Vzc2VzL2RlbFByb2NQYWsgQTEvZGVsUHJvY1Bha19BMS4xIj4KLTwvcGFyZW50UGFja2FnZT4KLTxEZWxpdmVyeVByb2Nlc3MgbmFtZT0iZGVsUHJvY1Bha19BMS4xIiBicmllZkRlc2NyaXB0aW9uPSJEZWxQcm9jUGFrIEExLjEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IkRlbFByb2NQYWsgQTEuMSBwcmVzZW50IiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzUmVwZWF0YWJsZT0iZmFsc2UiIGlzT25nb2luZz0iZmFsc2UiIGlzRXZlbnREcml2ZW49ImZhbHNlIiB2YXJpYWJpbGl0eVR5cGU9Im5hIiBpc0VuYWN0YWJsZT0iZmFsc2UiPgotPERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uIG5hbWU9ImRlbFByb2NQYWtfQTEuMSxfdXE1SzhSTTFFZHFxbmRpLWdEdXhwdyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249IkRlbFByb2NQYWsgQTEuMSBtYWluIiBrZXlDb25zaWRlcmF0aW9ucz0iRGVsUHJvY1BhayBBMS4xIGtleSIgdXNhZ2VHdWlkYW5jZT0iIiBwdXJwb3NlPSJEZWxQcm9jUGFrIEExLjEgcG9ycG9pc2UiIGFsdGVybmF0aXZlcz0iRGVsUHJvY1BhayBBMS4xIGFsdCIgaG93dG9TdGFmZj0iRGVsUHJvY1BhayBBMS4xIHN0YWZmIiBleHRlcm5hbElkPSJEZWxQcm9jUGFrIEExLjEgZXh0ZXJuSUQiIHNjb3BlPSJEZWxQcm9jUGFrIEExLjEgc2NvcGUiIHVzYWdlTm90ZXM9IkRlbFByb2NQYWsgQTEuMSB1c2FnZSIgc2NhbGU9IkRlbFByb2NQYWsgQTEuMSBzY2FsZSIgcHJvamVjdENoYXJhY3RlcmlzdGljcz0iRGVsUHJvY1BhayBBMS4xIGNoYXIiIHJpc2tMZXZlbD0iRGVsUHJvY1BhayBBMS4xIHJpc2siIGVzdGltYXRpbmdUZWNobmlxdWU9IkRlbFByb2NQYWsgQTEuMSZhbXA7bmJzcDtlc3RpbWF0aW5nIHRlY2gmbHQ7IS0tU3RhcnRGcmFnbWVudC0tJmd0OyZsdDshLS1FbmRGcmFnbWVudC0tJmd0OyIgcHJvamVjdE1lbWJlckV4cGVydGlzZT0iRGVsUHJvY1BhayBBMS4xIGV4cGVydGlzZSIgdHlwZU9mQ29udHJhY3Q9IkRlbFByb2NQYWsgQTEuMSZhbXA7bmJzcDtjb250cmFjdCI+Ci08L0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uPgotPGRlZmF1bHRDb250ZXh0IHBhdGg9IlBsdWcgQS9EZWxpdmVyeVByb2Nlc3Nlcy9kZWxQcm9jUGFrIEExL2RlbFByb2NQYWtfQTEuMS9kZWxQcm9jUGFrX0ExLjEiPgotPC9kZWZhdWx0Q29udGV4dD4KLTx2YWxpZENvbnRleHQgcGF0aD0iQ29uZmlnIEEiPgotPC92YWxpZENvbnRleHQ+Ci08L0RlbGl2ZXJ5UHJvY2Vzcz4KLTwvUHJvY2Vzc0NvbXBvbmVudD4KLTwvUHJvY2Vzc1BhY2thZ2U+Ci08L1Byb2Nlc3NQYWNrYWdlPgotPFByb2Nlc3NQYWNrYWdlIG5hbWU9IlByb2Nlc3NDb250cmlidXRpb25zIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGdsb2JhbD0iZmFsc2UiPgotPC9Qcm9jZXNzUGFja2FnZT4KLTwvTWV0aG9kUGx1Z2luPgotPC9UZXN0ZXJPdXRwdXQ+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL1RDU2FtcGxlQ2FzZXMvU3ViRGlyXzEvMm5kVGVzdC50YyBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvVENTYW1wbGVDYXNlcy9TdWJEaXJfMS8ybmRUZXN0LnRjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OTViMWYzLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvVENTYW1wbGVDYXNlcy9TdWJEaXJfMS8ybmRUZXN0LnRjCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxNZXRob2RMaWJyYXJ5VGVzdCBkaXNhYmxlPSJ0cnVlIj4KLQkKLQk8Q29weUxpYnJhcnkgbGliRm9sZGVyTmFtZT0iLi4vLi4vRXhwb3J0SW1wb3J0L1BhcmlzIj4KLQk8L0NvcHlMaWJyYXJ5PgkKLQkKLQk8T3BlbkxpYnJhcnkgbGliRm9sZGVyTmFtZT0iUGFyaXMiPgotCTwvT3BlbkxpYnJhcnk+Ci0JCi0JPEV4cG9ydENvbmZpZ3VyYXRpb24gZXhwb3J0Rm9sZGVyTmFtZT0iRXhwb3J0MDAwMSIgc2VsZWN0ZWRDb25maWdOYW1lPSJDb25maWcgQSI+Ci0JPC9FeHBvcnRDb25maWd1cmF0aW9uPgotCQotCTxPcGVuTGlicmFyeSBsaWJGb2xkZXJOYW1lPSJCYXNlXzEiPgotCTwvT3BlbkxpYnJhcnk+Ci0JCi0JPEltcG9ydENvbmZpZ3VyYXRpb24gaW1wb3J0Rm9sZGVyTmFtZT0iRXhwb3J0MDAwMSI+Ci0JPC9JbXBvcnRDb25maWd1cmF0aW9uPgotCQotCTxDb21wYXJlVG9MaWJyYXJ5IAotCQlnb2xkZW5MaWJGb2xkZXJOYW1lPSJQYXJpcyIgCi0JCWRpZmZDb3VudD0iMCIgCi0JCWVsZW1lbnRDb3VudD0iMCIKLQkJdXNlTmFtZUFzSWQ9ImZhbHNlIj4KLQkJCi0JPC9Db21wYXJlVG9MaWJyYXJ5PgotCi08L01ldGhvZExpYnJhcnlUZXN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvVENTYW1wbGVDYXNlcy9TdWJEaXJfMS9TdWJTdWIvM3JkVGVzdC50YyBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvVENTYW1wbGVDYXNlcy9TdWJEaXJfMS9TdWJTdWIvM3JkVGVzdC50YwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTk4MzgzMC4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL1RDU2FtcGxlQ2FzZXMvU3ViRGlyXzEvU3ViU3ViLzNyZFRlc3QudGMKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPE1ldGhvZExpYnJhcnlUZXN0PgotCQotCTxDb3B5TGlicmFyeSBsaWJGb2xkZXJOYW1lPSIuLi8uLi8uLi9FeHBvcnRJbXBvcnQvUGFyaXMiPgotCTwvQ29weUxpYnJhcnk+CQotCQotCTxPcGVuTGlicmFyeSBsaWJGb2xkZXJOYW1lPSJQYXJpcyI+Ci0JPC9PcGVuTGlicmFyeT4KLQkKLQk8RXhwb3J0WG1sIGV4cG9ydEZvbGRlck5hbWU9IkV4cG9ydDAwMDEiPgotCTwvRXhwb3J0WG1sPgotCQotCTxPcGVuTGlicmFyeSBsaWJGb2xkZXJOYW1lPSJCYXNlXzEiPgotCTwvT3BlbkxpYnJhcnk+Ci0JCi0JPEltcG9ydFhtbCBpbXBvcnRGb2xkZXJOYW1lPSJFeHBvcnQwMDAxIiBtZXJnZT0iZmFsc2UiPgotCTwvSW1wb3J0WG1sPgotCQotCTxDb21wYXJlVG9MaWJyYXJ5IAotCQlnb2xkZW5MaWJGb2xkZXJOYW1lPSJQYXJpcyIgCi0JCWRpZmZDb3VudD0iMjgiIAotCQllbGVtZW50Q291bnQ9IjM3MCIKLQkJdXNlTmFtZUFzSWQ9InRydWUiPgotCQkKLQk8L0NvbXBhcmVUb0xpYnJhcnk+Ci0KLTwvTWV0aG9kTGlicmFyeVRlc3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9UQ1NhbXBsZUNhc2VzL1N1YkRpcl8yLzFzdFRlc3QudGMgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL1RDU2FtcGxlQ2FzZXMvU3ViRGlyXzIvMXN0VGVzdC50YwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjdiMzA4Zi4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL1RDU2FtcGxlQ2FzZXMvU3ViRGlyXzIvMXN0VGVzdC50YworKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08TWV0aG9kTGlicmFyeVRlc3QgZGlzYWJsZT0idHJ1ZSI+Ci0JCi0JPENvcHlMaWJyYXJ5IGxpYkZvbGRlck5hbWU9Ii4uLy4uL0V4cG9ydEltcG9ydC9QYXJpcyI+Ci0JPC9Db3B5TGlicmFyeT4JCi0JCi0JPE9wZW5MaWJyYXJ5IGxpYkZvbGRlck5hbWU9IlBhcmlzIj4KLQk8L09wZW5MaWJyYXJ5PgotCQotCTxFeHBvcnRQbHVnaW5zIGV4cG9ydEZvbGRlck5hbWU9IkV4cG9ydGVkMDAxIj4KLQk8L0V4cG9ydFBsdWdpbnM+Ci0JCi0JPE9wZW5MaWJyYXJ5IGxpYkZvbGRlck5hbWU9IkJhc2VfMSI+Ci0JPC9PcGVuTGlicmFyeT4KLQkKLQk8SW1wb3J0UGx1Z2lucyBpbXBvcnRGb2xkZXJOYW1lPSJFeHBvcnRlZDAwMSI+Ci0JPC9JbXBvcnRQbHVnaW5zPgotCQotCTxDb21wYXJlVG9MaWJyYXJ5IAotCQlnb2xkZW5MaWJGb2xkZXJOYW1lPSJQYXJpcyIgCi0JCWRpZmZDb3VudD0iMCIgCi0JCWVsZW1lbnRDb3VudD0iMCIKLQkJdXNlTmFtZUFzSWQ9ImZhbHNlIj4KLQkJCi0JPC9Db21wYXJlVG9MaWJyYXJ5PgotCi08L01ldGhvZExpYnJhcnlUZXN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvVENTYW1wbGVDYXNlcy9TdWJEaXJfMi8ybmRUZXN0LnRjIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9UQ1NhbXBsZUNhc2VzL1N1YkRpcl8yLzJuZFRlc3QudGMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmNmEyODcuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9UQ1NhbXBsZUNhc2VzL1N1YkRpcl8yLzJuZFRlc3QudGMKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPE1ldGhvZExpYnJhcnlUZXN0PgotCQotCTxDb3B5TGlicmFyeSBsaWJGb2xkZXJOYW1lPSIuLi8uLi9FeHBvcnRJbXBvcnQvUGFyaXMiPgotCTwvQ29weUxpYnJhcnk+CQotCQotCTxPcGVuTGlicmFyeSBsaWJGb2xkZXJOYW1lPSJQYXJpcyI+Ci0JPC9PcGVuTGlicmFyeT4KLQkKLQk8RXhwb3J0Q29uZmlndXJhdGlvbiBleHBvcnRGb2xkZXJOYW1lPSJFeHBvcnQwMDAxIiBzZWxlY3RlZENvbmZpZ05hbWU9IkNvbmZpZyBBIj4KLQk8L0V4cG9ydENvbmZpZ3VyYXRpb24+Ci0JCi0JPE9wZW5MaWJyYXJ5IGxpYkZvbGRlck5hbWU9IkJhc2VfMSI+Ci0JPC9PcGVuTGlicmFyeT4KLQkKLQk8SW1wb3J0Q29uZmlndXJhdGlvbiBpbXBvcnRGb2xkZXJOYW1lPSJFeHBvcnQwMDAxIj4KLQk8L0ltcG9ydENvbmZpZ3VyYXRpb24+Ci0JCi0JPENvbXBhcmVUb0xpYnJhcnkgCi0JCWdvbGRlbkxpYkZvbGRlck5hbWU9IlBhcmlzIiAKLQkJZGlmZkNvdW50PSIwIiAKLQkJZWxlbWVudENvdW50PSIwIgotCQl1c2VOYW1lQXNJZD0iZmFsc2UiPgotCQkKLQk8L0NvbXBhcmVUb0xpYnJhcnk+Ci0KLTwvTWV0aG9kTGlicmFyeVRlc3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9UZXN0Q29tbWFuZHMvZWRpdEFsbEVsZW1lbnRzLnRjIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9UZXN0Q29tbWFuZHMvZWRpdEFsbEVsZW1lbnRzLnRjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMjAyNmNmLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvVGVzdENvbW1hbmRzL2VkaXRBbGxFbGVtZW50cy50YworKysgL2Rldi9udWxsCkBAIC0xLDU1OCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPE1ldGhvZExpYnJhcnlUZXN0IGRpc2FibGU9ImZhbHNlIiB2ZXJib3NlPSJmYWxzZSI+Ci0JCi08IS0tIFRoaXMgY2FzZSBpbmNsdWRlcyBjcmVhdGluZyBhbmQgZWRpdG5nIGFsbW9zdCBldmVyeSB0eXBlIG9mIG1laHRvZCBlbGVtZW50IC0tPgotCQotCTxPcGVuTGlicmFyeSBsaWJGb2xkZXJOYW1lPSJhbGxFbGVtZW50cyI+Ci0JPC9PcGVuTGlicmFyeT4JCi0JCi08IS0tIFBsdWcgQSAtLT4KLQk8TmV3TWV0aG9kRWxlbWVudAotCQl0eXBlPSJNZXRob2RQbHVnaW4iIAotCQluYW1lPSJQbHVnIEEiCi0JCWJyaWVmRGVzY3JpcHRpb249IkJyaWVmIGRlc2NpcHRpb24gb2YgUGx1ZyBBIgotCQlhdXRob3JzPSJQbHVnIEEgQXV0aG9yIgkKLQkJPgkKLQk8L05ld01ldGhvZEVsZW1lbnQ+CQotCi08IS0tIGNvbnRlbnRfcGFja2FnZV9BMSAtLT4KLQk8TmV3TWV0aG9kRWxlbWVudAotCQl0eXBlPSJDb250ZW50UGFja2FnZSIKLQkJbmFtZT0iY29udGVudF9wYWNrYWdlX0ExIgotCQlwYXJlbnRQYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudCIKLQkJYnJpZWZEZXNjcmlwdGlvbj0iQnJpZWYgZGVzY2lwdGlvbiBvZiBjb250ZW50X3BhY2thZ2VfQTEiCi0JCT4JCQkKLQk8L05ld01ldGhvZEVsZW1lbnQ+Ci0JCi08IS0tIENvbmZpZ19BIC0tPgkKLQk8TmV3TWV0aG9kRWxlbWVudCBkaXNhYmxlPSJmYWxzZSIKLQkJdHlwZT0iTWV0aG9kQ29uZmlndXJhdGlvbiIKLQkJbmFtZT0iQ29uZmlnX0EiCi0JCWJyaWVmRGVzY3JpcHRpb249IkJyaWVmIGRlc2NpcHRpb24gb2YgQ29uZmlnX0EiCi0JCT4KLQkgIDxtZXRob2RQbHVnaW5TZWxlY3Rpb24+Ci0JICAJPFZhbHVlPlBsdWcgQTwvVmFsdWU+Ci0gIAkgIDwvbWV0aG9kUGx1Z2luU2VsZWN0aW9uPgotCQkJCQkKLQkgIDxtZXRob2RQYWNrYWdlU2VsZWN0aW9uPgotCSAgCTxWYWx1ZT5QbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTE8L1ZhbHVlPgotICAJICA8L21ldGhvZFBhY2thZ2VTZWxlY3Rpb24+CQkJCQkJCi0JPC9OZXdNZXRob2RFbGVtZW50PgkJCQkKLQkKLTwhLS0gcm9sZV9BMSAtLT4JCi0JPE5ld01ldGhvZEVsZW1lbnQKLQkJdHlwZT0iUm9sZSIKLQkJbmFtZT0icm9sZV9BMSIKLQkJcGFyZW50UGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExIgotCQk+CQotCQk8cHJlc2VudGF0aW9uCi0JCQltYWluRGVzY3JpcHRpb249IlJvbGUgQTEgbWFpbiIKLQkJCWtleUNvbnNpZGVyYXRpb25zPSJSb2xlIEExIGtleSIKLQkJCXNraWxscz0iUm9sZSBBMSBza2lsbHMiCi0JCQlhc3NpZ25tZW50QXBwcm9hY2hlcz0iUm9sZSBBMSBhc3NpZyBBcHAiCi0JCQlzeW5vbnltcz0iUm9sZSBzeW4iCi0JCQk+CQkJCi0JCTwvcHJlc2VudGF0aW9uPgkJCi0JPC9OZXdNZXRob2RFbGVtZW50PgotCQotPCEtLSB0YXNrX0ExIC0tPgkKLQk8TmV3TWV0aG9kRWxlbWVudAotCQl0eXBlPSJUYXNrIgotCQluYW1lPSJ0YXNrX0ExIgotCQlwYXJlbnRQYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEiCi0JCT4JCi0JCTxwcmVzZW50YXRpb24KLQkJCW1haW5EZXNjcmlwdGlvbj0iVGFzayBBMSBtYWluIgotCQkJa2V5Q29uc2lkZXJhdGlvbnM9IlRhc2sgQTEga2V5IgotCQkJc2tpbGxzPSJUYXNrIEExIHNraWxscyIKLQkJCWFzc2lnbm1lbnRBcHByb2FjaGVzPSJUYXNrIEExIGFzc2lnIEFwcCIKLQkJCXN5bm9ueW1zPSJUYXNrIHN5biIKLQkJCT4JCQkKLQkJPC9wcmVzZW50YXRpb24+Ci0JCQkKLQkJPG93bmVkUnVsZXMgYm9keT0iQm9keSAxIiAvPgotCQk8b3duZWRSdWxlcyBib2R5PSJCb2R5IDIiIC8+Ci0JCQkKLQk8L05ld01ldGhvZEVsZW1lbnQ+Ci0JCi08IS0tIGFydGlmYWN0X0ExIC0tPgkKLQk8TmV3TWV0aG9kRWxlbWVudAotCQl0eXBlPSJBcnRpZmFjdCIKLQkJbmFtZT0iYXJ0aWZhY3RfQTEiCi0JCXBhcmVudFBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMSIKLQkJPgkKLQkJPHByZXNlbnRhdGlvbgotCQkJbWFpbkRlc2NyaXB0aW9uPSJBcnRpZmlmYWN0IEExIG1haW4iCi0JCQlrZXlDb25zaWRlcmF0aW9ucz0iQXJ0aWZpZmFjdCBBMSBrZXkiCi0JCQk+CQkJCi0JCTwvcHJlc2VudGF0aW9uPgkJCQkJCQotCTwvTmV3TWV0aG9kRWxlbWVudD4KLQotPCEtLSBkZWxpdmVyYWJsZV9BMSAtLT4JCi0JPE5ld01ldGhvZEVsZW1lbnQKLQkJdHlwZT0iRGVsaXZlcmFibGUiCi0JCW5hbWU9ImRlbGl2ZXJhYmxlX0ExIgotCQlwYXJlbnRQYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEiCi0JCT4JCi0JCTxwcmVzZW50YXRpb24KLQkJCW1haW5EZXNjcmlwdGlvbj0iRGVsaXZlcmFibGUgQTEgbWFpbiIKLQkJCWtleUNvbnNpZGVyYXRpb25zPSJEZWxpdmVyYWJsZSBBMSBrZXkiCi0JCQk+CQkJCi0JCTwvcHJlc2VudGF0aW9uPgkJCQkJCQotCTwvTmV3TWV0aG9kRWxlbWVudD4KLQotPCEtLSBvdXRjb21lX0ExIC0tPgkKLQk8TmV3TWV0aG9kRWxlbWVudAotCQl0eXBlPSJPdXRjb21lIgotCQluYW1lPSJvdXRjb21lX0ExIgotCQlwYXJlbnRQYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEiCi0JCT4JCi0JCTxwcmVzZW50YXRpb24KLQkJCW1haW5EZXNjcmlwdGlvbj0iT3V0Y29tZSBBMSBtYWluIgotCQkJa2V5Q29uc2lkZXJhdGlvbnM9Ik91dGNvbWUgQTEga2V5IgotCQkJPgkJCQotCQk8L3ByZXNlbnRhdGlvbj4JCQkJCQkKLQk8L05ld01ldGhvZEVsZW1lbnQ+CQotCQotPCEtLSBjb25jZXB0X0ExIC0tPgkKLQk8TmV3TWV0aG9kRWxlbWVudAotCQl0eXBlPSJDb25jZXB0IgotCQluYW1lPSJjb25jZXB0X0ExIgotCQlwYXJlbnRQYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEiCi0JCT4JCi0JCTxwcmVzZW50YXRpb24KLQkJCW1haW5EZXNjcmlwdGlvbj0iQ29uY2VwdCBBMSBtYWluIgotCQkJa2V5Q29uc2lkZXJhdGlvbnM9IkNvbmNlcHQgQTEga2V5IgotCQkJPgkJCQotCQk8L3ByZXNlbnRhdGlvbj4JCQkJCQkKLQk8L05ld01ldGhvZEVsZW1lbnQ+Ci0JCi08IS0tIGNoZWNrbGlzdF9BMSAtLT4JCi0JPE5ld01ldGhvZEVsZW1lbnQKLQkJdHlwZT0iQ2hlY2tsaXN0IgotCQluYW1lPSJjaGVja2xpc3RfQTEiCi0JCXBhcmVudFBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMSIKLQkJPgkKLQkJPHByZXNlbnRhdGlvbgotCQkJbWFpbkRlc2NyaXB0aW9uPSJDaGVja2xpc3QgQTEgbWFpbiIKLQkJCWtleUNvbnNpZGVyYXRpb25zPSJDaGVja2xpc3QgQTEga2V5IgotCQkJPgkJCQotCQk8L3ByZXNlbnRhdGlvbj4JCQkJCQkKLQk8L05ld01ldGhvZEVsZW1lbnQ+CQotCQotPCEtLSBleGFtcGxlX0ExIC0tPgkKLQk8TmV3TWV0aG9kRWxlbWVudAotCQl0eXBlPSJFeGFtcGxlIgotCQluYW1lPSJleGFtcGxlX0ExIgotCQlwYXJlbnRQYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEiCi0JCT4JCi0JCTxwcmVzZW50YXRpb24KLQkJCW1haW5EZXNjcmlwdGlvbj0iRXhhbXBsZSBBMSBtYWluIgotCQkJa2V5Q29uc2lkZXJhdGlvbnM9IkV4YW1wbGUgQTEga2V5IgotCQkJPgkJCQotCQk8L3ByZXNlbnRhdGlvbj4JCQkJCQkKLQk8L05ld01ldGhvZEVsZW1lbnQ+CQkKLQkKLTwhLS0gZ3VpZGVsaW5lX0ExIC0tPgkKLQk8TmV3TWV0aG9kRWxlbWVudAotCQl0eXBlPSJHdWlkZWxpbmUiCi0JCW5hbWU9Imd1aWRlbGluZV9BMSIKLQkJcGFyZW50UGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExIgotCQk+CQotCQk8cHJlc2VudGF0aW9uCi0JCQltYWluRGVzY3JpcHRpb249Ikd1aWRlbGluZSBBMSBtYWluIgotCQkJa2V5Q29uc2lkZXJhdGlvbnM9Ikd1aWRlbGluZSBBMSBrZXkiCi0JCQk+CQkJCi0JCTwvcHJlc2VudGF0aW9uPgkJCQkJCQotCTwvTmV3TWV0aG9kRWxlbWVudD4JCQkKLQkJCi08IS0tIHJlcG9ydF9BMSAtLT4JCi0JPE5ld01ldGhvZEVsZW1lbnQKLQkJdHlwZT0iUmVwb3J0IgotCQluYW1lPSJyZXBvcnRfQTEiCi0JCXBhcmVudFBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMSIKLQkJPgkKLQkJPHByZXNlbnRhdGlvbgotCQkJbWFpbkRlc2NyaXB0aW9uPSJSZXBvcnQgQTEgbWFpbiIKLQkJCWtleUNvbnNpZGVyYXRpb25zPSJSZXBvcnQgQTEga2V5IgotCQkJPgkJCQotCQk8L3ByZXNlbnRhdGlvbj4JCQkJCQkKLQk8L05ld01ldGhvZEVsZW1lbnQ+Ci0JCi08IS0tIHRlbXBsYXRlX0ExIC0tPgkKLQk8TmV3TWV0aG9kRWxlbWVudAotCQl0eXBlPSJUZW1wbGF0ZSIKLQkJbmFtZT0idGVtcGxhdGVfQTEiCi0JCXBhcmVudFBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMSIKLQkJPgkKLQkJPHByZXNlbnRhdGlvbgotCQkJbWFpbkRlc2NyaXB0aW9uPSJUZW1wbGF0ZSBBMSBtYWluIgotCQkJa2V5Q29uc2lkZXJhdGlvbnM9IlRlbXBsYXRlIEExIGtleSIKLQkJCT4JCQkKLQkJPC9wcmVzZW50YXRpb24+CQkJCQkJCi0JPC9OZXdNZXRob2RFbGVtZW50PgotCQotPCEtLSBzdXBwb3J0aW5nX21hdGVyaWFsX0ExIC0tPgkKLQk8TmV3TWV0aG9kRWxlbWVudAotCQl0eXBlPSJTdXBwb3J0aW5nTWF0ZXJpYWwiCi0JCW5hbWU9InN1cHBvcnRpbmdfbWF0ZXJpYWxfQTEiCi0JCXBhcmVudFBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMSIKLQkJPgkKLQkJPHByZXNlbnRhdGlvbgotCQkJbWFpbkRlc2NyaXB0aW9uPSJTdXBwb3J0aW5nX21hdGVyaWFsIEExIG1haW4iCi0JCQlrZXlDb25zaWRlcmF0aW9ucz0iU3VwcG9ydGluZ19tYXRlcmlhbCBBMSBrZXkiCi0JCQk+CQkJCi0JCTwvcHJlc2VudGF0aW9uPgkJCQkJCQotCTwvTmV3TWV0aG9kRWxlbWVudD4KLQkKLTwhLS0gdG9vbG1lbnRvcl9BMSAtLT4JCi0JPE5ld01ldGhvZEVsZW1lbnQKLQkJdHlwZT0iVG9vbE1lbnRvciIKLQkJbmFtZT0idG9vbG1lbnRvcl9BMSIKLQkJcGFyZW50UGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExIgotCQk+CQotCQk8cHJlc2VudGF0aW9uCi0JCQltYWluRGVzY3JpcHRpb249IlRvb2xtZW50b3IgQTEgbWFpbiIKLQkJCWtleUNvbnNpZGVyYXRpb25zPSJUb29sbWVudG9yIEExIGtleSIKLQkJCT4JCQkKLQkJPC9wcmVzZW50YXRpb24+CQkJCQkJCi0JPC9OZXdNZXRob2RFbGVtZW50PgkJCQotCi08IS0tIHdoaXRlcGFwZXJfQTEgLS0+CQotCTxOZXdNZXRob2RFbGVtZW50Ci0JCXR5cGU9IldoaXRlcGFwZXIiCi0JCW5hbWU9IndoaXRlcGFwZXJfQTEiCi0JCXBhcmVudFBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMSIKLQkJPgkKLQkJPHByZXNlbnRhdGlvbgotCQkJbWFpbkRlc2NyaXB0aW9uPSJXaGl0ZXBhcGVyIEExIG1haW4iCi0JCQlrZXlDb25zaWRlcmF0aW9ucz0iV2hpdGVwYXBlciBBMSBrZXkiCi0JCQk+CQkJCi0JCTwvcHJlc2VudGF0aW9uPgkJCQkJCQotCTwvTmV3TWV0aG9kRWxlbWVudD4JCi0JCi08IS0tIHByYWN0aWNlX0ExIC0tPgkKLQk8TmV3TWV0aG9kRWxlbWVudAotCQl0eXBlPSJQcmFjdGljZSIKLQkJbmFtZT0icHJhY3RpY2VfQTEiCi0JCXBhcmVudFBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMSIKLQkJPgkKLQkJPHByZXNlbnRhdGlvbgotCQkJbWFpbkRlc2NyaXB0aW9uPSJQcmFjdGljZSBBMSBtYWluIgotCQkJa2V5Q29uc2lkZXJhdGlvbnM9IlByYWN0aWNlIEExIGtleSIKLQkJCT4JCQkKLQkJPC9wcmVzZW50YXRpb24+CQkJCQkJCi0JPC9OZXdNZXRob2RFbGVtZW50PgotCQotPCEtLSByZXVzYWJsZV9BMSAtLT4JCi0JPE5ld01ldGhvZEVsZW1lbnQKLQkJdHlwZT0iUmV1c2FibGVBc3NldCIKLQkJbmFtZT0icmV1c2FibGVfQTEiCi0JCXBhcmVudFBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMSIKLQkJPgkKLQkJPHByZXNlbnRhdGlvbgotCQkJbWFpbkRlc2NyaXB0aW9uPSJSZXVzYWJsZSBBMSBtYWluIgotCQkJa2V5Q29uc2lkZXJhdGlvbnM9IlJldXNhYmxlIEExIGtleSIKLQkJCT4JCQkKLQkJPC9wcmVzZW50YXRpb24+CQkJCQkJCi0JPC9OZXdNZXRob2RFbGVtZW50PgkKLQkKLTwhLS0gcm9hZG1hcF9BMSAtLT4JCi0JPE5ld01ldGhvZEVsZW1lbnQKLQkJdHlwZT0iUm9hZG1hcCIKLQkJbmFtZT0icm9hZG1hcF9BMSIKLQkJcGFyZW50UGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExIgotCQk+CQotCQk8cHJlc2VudGF0aW9uCi0JCQltYWluRGVzY3JpcHRpb249IlJvYWRtYXAgQTEgbWFpbiIKLQkJCWtleUNvbnNpZGVyYXRpb25zPSJSb2FkbWFwIEExIGtleSIKLQkJCT4JCQkKLQkJPC9wcmVzZW50YXRpb24+CQkJCQkJCi0JPC9OZXdNZXRob2RFbGVtZW50PgotCQotPCEtLSB0ZXJtX2RlZmluaXRpb25fQTEgLS0+CQotCTxOZXdNZXRob2RFbGVtZW50Ci0JCXR5cGU9IlRlcm1EZWZpbml0aW9uIgotCQluYW1lPSJ0ZXJtX2RlZmluaXRpb25fQTEiCi0JCXBhcmVudFBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMSIKLQkJPgkKLQkJPHByZXNlbnRhdGlvbgotCQkJbWFpbkRlc2NyaXB0aW9uPSJUZXJtX2RlZmluaXRpb24gQTEgbWFpbiIKLQkJCWtleUNvbnNpZGVyYXRpb25zPSJUZXJtX2RlZmluaXRpb24gQTEga2V5IgotCQkJPgkJCQotCQk8L3ByZXNlbnRhdGlvbj4JCQkJCQkKLQk8L05ld01ldGhvZEVsZW1lbnQ+Ci0JCi08IS0tIGRpc2NpcGxpbmVfQTEgLS0+CQotCTxOZXdNZXRob2RFbGVtZW50Ci0JCXR5cGU9IkRpc2NpcGxpbmUiCi0JCW5hbWU9ImRpc2NpcGxpbmVfQTEiCi0JCXBhcmVudFBhdGg9IlBsdWcgQS9Db250ZW50L0NhdGVnb3JpZXMvRGlzY2lwbGluZXMiCi0JCT4JCi0JCTxwcmVzZW50YXRpb24KLQkJCW1haW5EZXNjcmlwdGlvbj0iRGlzY2lwbGluZSBBMSBtYWluIgotCQkJa2V5Q29uc2lkZXJhdGlvbnM9IkRpc2NpcGxpbmUgQTEga2V5IgotCQkJPgkJCQotCQk8L3ByZXNlbnRhdGlvbj4KLQkJPHRhc2tzPgotCQkJPFZhbHVlPlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS90YXNrX0ExPC9WYWx1ZT4KLQkJPC90YXNrcz4JCQkJCQkKLQk8L05ld01ldGhvZEVsZW1lbnQ+CQotCQotPCEtLSBkaXNjaXBsaW5lX2dyb3VwaW5nX0ExIC0tPgkKLQk8TmV3TWV0aG9kRWxlbWVudAotCQl0eXBlPSJEaXNjaXBsaW5lR3JvdXBpbmciCi0JCW5hbWU9ImRpc2NpcGxpbmVfZ3JvdXBpbmdfQTEiCi0JCXBhcmVudFBhdGg9IlBsdWcgQS9Db250ZW50L0NhdGVnb3JpZXMvRGlzY2lwbGluZXMiCi0JCT4JCQkKLQkJPHByZXNlbnRhdGlvbgotCQkJbWFpbkRlc2NyaXB0aW9uPSJEaXNjaXBsaW5lR3JvdXBpbmcgQTEgbWFpbiIKLQkJCWtleUNvbnNpZGVyYXRpb25zPSJEaXNjaXBsaW5lR3JvdXBpbmcgQTEga2V5IgotCQkJPgkJCQotCQk8L3ByZXNlbnRhdGlvbj4KLQkJPGRpc2NpcGxpbmVzPgotCQkJPFZhbHVlPlBsdWcgQS9Db250ZW50L0NhdGVnb3JpZXMvRGlzY2lwbGluZXMvZGlzY2lwbGluZV9BMTwvVmFsdWU+Ci0JCTwvZGlzY2lwbGluZXM+CQkJCQkKLQk8L05ld01ldGhvZEVsZW1lbnQ+CQotCQotCQotPCEtLSBkaXNjaXBsaW5lX0EyIC0tPgkKLQk8TmV3TWV0aG9kRWxlbWVudAotCQl0eXBlPSJEaXNjaXBsaW5lIgotCQluYW1lPSJkaXNjaXBsaW5lX0EyIgotCQlwYXJlbnRQYXRoPSJQbHVnIEEvQ29udGVudC9DYXRlZ29yaWVzL0Rpc2NpcGxpbmVzIgotCQk+CQotCQk8cHJlc2VudGF0aW9uCi0JCQltYWluRGVzY3JpcHRpb249IkRpc2NpcGxpbmUgQTIgbWFpbiIKLQkJCWtleUNvbnNpZGVyYXRpb25zPSJEaXNjaXBsaW5lIEEyIGtleSIKLQkJCT4JCQkKLQkJPC9wcmVzZW50YXRpb24+CQkJCQkJCi0JPC9OZXdNZXRob2RFbGVtZW50PgkJCQkJCQkJCQkJCQkJCQotCQkKLTwhLS0gZG9tYWluX0ExIC0tPgkKLQk8TmV3TWV0aG9kRWxlbWVudAotCQl0eXBlPSJEb21haW4iCi0JCW5hbWU9ImRvbWFpbl9BMSIKLQkJcGFyZW50UGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2F0ZWdvcmllcy9Eb21haW5zIgotCQk+CQotCQk8cHJlc2VudGF0aW9uCi0JCQltYWluRGVzY3JpcHRpb249IkRvbWFpbiBBMSBtYWluIgotCQkJa2V5Q29uc2lkZXJhdGlvbnM9IkRvbWFpbiBBMSBrZXkiCi0JCQk+CQkJCi0JCTwvcHJlc2VudGF0aW9uPgotCQk8c3ViZG9tYWlucyAKLQkJCW5hbWU9InN1Yl9kb21haW5fQTEiCi0JCQk+Ci0JCQk8cHJlc2VudGF0aW9uCi0JCQkJbWFpbkRlc2NyaXB0aW9uPSJTdWIgRG9tYWluIEExIG1haW4iCi0JCQkJa2V5Q29uc2lkZXJhdGlvbnM9IlN1YiBEb21haW4gQTEga2V5IgotCQkJCT4JCQkKLQkJCTwvcHJlc2VudGF0aW9uPgotCQk8L3N1YmRvbWFpbnM+CQkJCQkJCi0JPC9OZXdNZXRob2RFbGVtZW50PgkJCQotCQkKLTwhLS0gd29ya19wcm9kdWN0X3R5cGVfQTEgLS0+CQotCTxOZXdNZXRob2RFbGVtZW50Ci0JCXR5cGU9IldvcmtQcm9kdWN0VHlwZSIKLQkJbmFtZT0id29ya19wcm9kdWN0X3R5cGVfQTEiCi0JCXBhcmVudFBhdGg9IlBsdWcgQS9Db250ZW50L0NhdGVnb3JpZXMvV1AgVHlwZXMiCi0JCT4JCi0JCTxwcmVzZW50YXRpb24KLQkJCW1haW5EZXNjcmlwdGlvbj0iV29ya1Byb2R1Y3RUeXBlIEExIG1haW4iCi0JCQlrZXlDb25zaWRlcmF0aW9ucz0iV29ya1Byb2R1Y3RUeXBlIEExIGtleSIKLQkJCT4JCQkKLQkJPC9wcmVzZW50YXRpb24+CQkJCQkJCi0JPC9OZXdNZXRob2RFbGVtZW50PgotCQotPCEtLSByb2xlX3NldF9BMSAtLT4JCi0JPE5ld01ldGhvZEVsZW1lbnQKLQkJdHlwZT0iUm9sZVNldCIKLQkJbmFtZT0icm9sZV9zZXRfQTEiCi0JCXBhcmVudFBhdGg9IlBsdWcgQS9Db250ZW50L0NhdGVnb3JpZXMvUm9sZVNldHMiCi0JCT4JCi0JCTxwcmVzZW50YXRpb24KLQkJCW1haW5EZXNjcmlwdGlvbj0iUm9sZVNldCBBMSBtYWluIgotCQkJa2V5Q29uc2lkZXJhdGlvbnM9IlJvbGVTZXQgQTEga2V5IgotCQkJPgkJCQotCQk8L3ByZXNlbnRhdGlvbj4KLQkJPHJvbGVzPgotCQkJPFZhbHVlPlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9yb2xlX0ExPC9WYWx1ZT4KLQkJPC9yb2xlcz4JCQkJCQkKLQk8L05ld01ldGhvZEVsZW1lbnQ+CQotCQotPCEtLSByb2xlX3NldF9ncm91cGluZ19BMSAtLT4JCi0JPE5ld01ldGhvZEVsZW1lbnQKLQkJdHlwZT0iUm9sZVNldEdyb3VwaW5nIgotCQluYW1lPSJyb2xlX3NldF9ncm91cGluZ19BMSIKLQkJcGFyZW50UGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2F0ZWdvcmllcy9Sb2xlU2V0cyIKLQkJPgkJCQotCQk8cHJlc2VudGF0aW9uCi0JCQltYWluRGVzY3JpcHRpb249IlJvbGVTZXRHcm91cGluZyBBMSBtYWluIgotCQkJa2V5Q29uc2lkZXJhdGlvbnM9IlJvbGVTZXRHcm91cGluZyBBMSBrZXkiCi0JCQk+CQkJCi0JCTwvcHJlc2VudGF0aW9uPgotCQk8cm9sZVNldHM+Ci0JCQk8VmFsdWU+UGx1ZyBBL0NvbnRlbnQvQ2F0ZWdvcmllcy9Sb2xlU2V0cy9yb2xlX3NldF9BMTwvVmFsdWU+Ci0JCTwvcm9sZVNldHM+CQkJCQkKLQk8L05ld01ldGhvZEVsZW1lbnQ+CQotCQotCQotPCEtLSByb2xlX3NldF9BMiAtLT4JCi0JPE5ld01ldGhvZEVsZW1lbnQKLQkJdHlwZT0iUm9sZVNldCIKLQkJbmFtZT0icm9sZV9zZXRfQTIiCi0JCXBhcmVudFBhdGg9IlBsdWcgQS9Db250ZW50L0NhdGVnb3JpZXMvUm9sZVNldHMiCi0JCT4JCi0JCTxwcmVzZW50YXRpb24KLQkJCW1haW5EZXNjcmlwdGlvbj0iUm9sZVNldCBBMiBtYWluIgotCQkJa2V5Q29uc2lkZXJhdGlvbnM9IlJvbGVTZXQgQTIga2V5IgotCQkJPgkJCQotCQk8L3ByZXNlbnRhdGlvbj4KLQkJPHJvbGVzPgotCQkJPFZhbHVlPlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9yb2xlX0ExPC9WYWx1ZT4KLQkJPC9yb2xlcz4JCQkJCQkKLQk8L05ld01ldGhvZEVsZW1lbnQ+Ci0JCi0JCi08IS0tIHRvb2xfQTEgLS0+CQotCTxOZXdNZXRob2RFbGVtZW50Ci0JCXR5cGU9IlRvb2wiCi0JCW5hbWU9InRvb2xfQTEiCi0JCXBhcmVudFBhdGg9IlBsdWcgQS9Db250ZW50L0NhdGVnb3JpZXMvVG9vbHMiCi0JCT4JCi0JCTxwcmVzZW50YXRpb24KLQkJCW1haW5EZXNjcmlwdGlvbj0iVG9vbCBBMSBtYWluIgotCQkJa2V5Q29uc2lkZXJhdGlvbnM9IlRvb2wgQTEga2V5IgotCQkJPgkJCQotCQk8L3ByZXNlbnRhdGlvbj4JCQkJCQotCTwvTmV3TWV0aG9kRWxlbWVudD4KLQkKLTwhLS0gc3ViX2N1c3RvbV9jYXRlZ29yeV9BMSAtLT4JCi0JPE5ld01ldGhvZEVsZW1lbnQKLQkJdHlwZT0iQ3VzdG9tQ2F0ZWdvcnkiCi0JCW5hbWU9InN1Yl9jdXN0b21fY2F0ZWdvcnlfQTEiCi0JCXBhcmVudFBhdGg9IlBsdWcgQS9Db250ZW50L0NhdGVnb3JpZXMvQ3VzdG9tQ2F0ZWdvcmllcyIKLQkJPgkKLQkJPHByZXNlbnRhdGlvbgotCQkJbWFpbkRlc2NyaXB0aW9uPSJzdWJfY3VzdG9tX2NhdGVnb3J5X0ExIG1haW4iCi0JCQlrZXlDb25zaWRlcmF0aW9ucz0ic3ViX2N1c3RvbV9jYXRlZ29yeV9BMSBrZXkiCi0JCQk+CQkJCi0JCTwvcHJlc2VudGF0aW9uPgotCQkJCQkJCQotCTwvTmV3TWV0aG9kRWxlbWVudD4KLQkKLTwhLS0gY3VzdG9tX2NhdGVnb3J5X0ExIC0tPgkKLQk8TmV3TWV0aG9kRWxlbWVudAotCQl0eXBlPSJDdXN0b21DYXRlZ29yeSIKLQkJbmFtZT0iY3VzdG9tX2NhdGVnb3J5X0ExIgotCQlwYXJlbnRQYXRoPSJQbHVnIEEvQ29udGVudC9DYXRlZ29yaWVzL0N1c3RvbUNhdGVnb3JpZXMiCi0JCT4JCi0JCTxwcmVzZW50YXRpb24KLQkJCW1haW5EZXNjcmlwdGlvbj0iY3VzdG9tX2NhdGVnb3J5X0ExIG1haW4iCi0JCQlrZXlDb25zaWRlcmF0aW9ucz0iY3VzdG9tX2NhdGVnb3J5X0ExIGtleSIKLQkJCT4JCQkKLQkJPC9wcmVzZW50YXRpb24+Ci0JCTxjYXRlZ29yaXplZEVsZW1lbnRzPgotCQkJPFZhbHVlPlBsdWcgQS9Db250ZW50L0NhdGVnb3JpZXMvQ3VzdG9tQ2F0ZWdvcmllcy9zdWJfY3VzdG9tX2NhdGVnb3J5X0ExPC9WYWx1ZT4KLQkJPC9jYXRlZ29yaXplZEVsZW1lbnRzPgkJCQkJCQotCTwvTmV3TWV0aG9kRWxlbWVudD4KLQkKLQk8IS0tIGN1c3RvbV9jYXRlZ29yeV9BMiAtLT4JCi0JPE5ld01ldGhvZEVsZW1lbnQKLQkJdHlwZT0iQ3VzdG9tQ2F0ZWdvcnkiCi0JCW5hbWU9ImN1c3RvbV9jYXRlZ29yeV9BMiIKLQkJcGFyZW50UGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2F0ZWdvcmllcy9DdXN0b21DYXRlZ29yaWVzIgotCQk+CQotCQk8cHJlc2VudGF0aW9uCi0JCQltYWluRGVzY3JpcHRpb249ImN1c3RvbV9jYXRlZ29yeV9BMiBtYWluIgotCQkJa2V5Q29uc2lkZXJhdGlvbnM9ImN1c3RvbV9jYXRlZ29yeV9BMiBrZXkiCi0JCQk+CQkJCi0JCTwvcHJlc2VudGF0aW9uPgkJCQkJCi0JPC9OZXdNZXRob2RFbGVtZW50PgkKLQkKLQk8RWRpdE1ldGhvZEVsZW1lbnQgZGlzYWJsZT0iZmFsc2UiCi0JCXR5cGU9IkN1c3RvbUNhdGVnb3J5IgotCQlwYXRoPSJQbHVnIEEvQ29udGVudC9DYXRlZ29yaWVzL0N1c3RvbUNhdGVnb3JpZXMvSGlkZGVuL0N1c3RvbSBDYXRlZ29yaWVzIgotCQk+CQotCQk8Y2F0ZWdvcml6ZWRFbGVtZW50cz4KLQkJCTxWYWx1ZT5QbHVnIEEvQ29udGVudC9DYXRlZ29yaWVzL0N1c3RvbUNhdGVnb3JpZXMvY3VzdG9tX2NhdGVnb3J5X0ExPC9WYWx1ZT4KLQkJCTxWYWx1ZT5QbHVnIEEvQ29udGVudC9DYXRlZ29yaWVzL0N1c3RvbUNhdGVnb3JpZXMvY3VzdG9tX2NhdGVnb3J5X0EyPC9WYWx1ZT4JCQkKLQkJPC9jYXRlZ29yaXplZEVsZW1lbnRzPgkJCQkKLQk8L0VkaXRNZXRob2RFbGVtZW50PgkJCQkJCQkJCQkJCQkJCQotCQkKLTwhLS0gY2FwUGF0UGFrX0ExIC0tPgkKLQk8TmV3TWV0aG9kRWxlbWVudAotCQl0eXBlPSJQcm9jZXNzUGFja2FnZSIKLQkJbmFtZT0iY2FwUGF0UGFrX0ExIgotCQlwYXJlbnRQYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMiCi0JCT4JCQkJCQotCTwvTmV3TWV0aG9kRWxlbWVudD4KLQkKLTwhLS0gQ1AxIC0tPgkKLQk8TmV3TWV0aG9kRWxlbWVudAotCQl0eXBlPSJDYXBhYmlsaXR5UGF0dGVybiIKLQkJbmFtZT0iQ1AxIgotCQlwYXJlbnRQYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExIgotCQk+CQotCQk8cHJlc2VudGF0aW9uCi0JCQltYWluRGVzY3JpcHRpb249IkNQMSBtYWluIgotCQkJa2V5Q29uc2lkZXJhdGlvbnM9IkNQMSBrZXkiCi0JCQk+CQkJCi0JCTwvcHJlc2VudGF0aW9uPgotCQk8ZGVmYXVsdENvbnRleHQ+Ci0JCQk8VmFsdWU+Q29uZmlnX0E8L1ZhbHVlPgotCQk8L2RlZmF1bHRDb250ZXh0PgotCQk8dmFsaWRDb250ZXh0PgotCQkJPFZhbHVlPkNvbmZpZ19BPC9WYWx1ZT4KLQkJPC92YWxpZENvbnRleHQ+CQkJCQkJCi0JPC9OZXdNZXRob2RFbGVtZW50PgkJCi0JCi08IS0tIENQMV9BMSAtLT4JCi0JPE5ld01ldGhvZEVsZW1lbnQKLQkJdHlwZT0iQ2FwYWJpbGl0eVBhdHRlcm4iCi0JCW5hbWU9IkNQMV9BMSIKLQkJcGFyZW50UGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zIgotCQk+CQotCQk8cHJlc2VudGF0aW9uCi0JCQltYWluRGVzY3JpcHRpb249IkNQMV9BMSBtYWluIgotCQkJa2V5Q29uc2lkZXJhdGlvbnM9IkNQMV9BMSBrZXkiCi0JCQk+CQkJCi0JCTwvcHJlc2VudGF0aW9uPgotCQk8ZGVmYXVsdENvbnRleHQ+Ci0JCQk8VmFsdWU+Q29uZmlnX0E8L1ZhbHVlPgotCQk8L2RlZmF1bHRDb250ZXh0PgotCQk8dmFsaWRDb250ZXh0PgotCQkJPFZhbHVlPkNvbmZpZ19BPC9WYWx1ZT4KLQkJPC92YWxpZENvbnRleHQ+CQkJCQkJCQkJCi0JPC9OZXdNZXRob2RFbGVtZW50PgkJCi0JCi08IS0tIGRlbFByb2NQYWtfQTEgLS0+CQotCTxOZXdNZXRob2RFbGVtZW50IGRpc2FibGU9ImZhbHNlIgotCQl0eXBlPSJQcm9jZXNzUGFja2FnZSIKLQkJbmFtZT0iZGVsUHJvY1Bha19BMSIKLQkJcGFyZW50UGF0aD0iUGx1ZyBBL0RlbGl2ZXJ5UHJvY2Vzc2VzIgotCQk+CQkJCQkJCi0JPC9OZXdNZXRob2RFbGVtZW50PgkKLQkKLTwhLS0gRFAxIC0tPgkKLQk8TmV3TWV0aG9kRWxlbWVudAotCQl0eXBlPSJEZWxpdmVyeVByb2Nlc3MiCi0JCW5hbWU9IkRQMSIKLQkJcGFyZW50UGF0aD0iUGx1ZyBBL0RlbGl2ZXJ5UHJvY2Vzc2VzL2RlbFByb2NQYWtfQTEiCi0JCT4JCi0JCTxwcmVzZW50YXRpb24KLQkJCW1haW5EZXNjcmlwdGlvbj0iRFAxIG1haW4iCi0JCQlrZXlDb25zaWRlcmF0aW9ucz0iRFAxIGtleSIKLQkJCT4JCQkKLQkJPC9wcmVzZW50YXRpb24+Ci0JCTxkZWZhdWx0Q29udGV4dD4KLQkJCTxWYWx1ZT5Db25maWdfQTwvVmFsdWU+Ci0JCTwvZGVmYXVsdENvbnRleHQ+Ci0JCTx2YWxpZENvbnRleHQ+Ci0JCQk8VmFsdWU+Q29uZmlnX0E8L1ZhbHVlPgotCQk8L3ZhbGlkQ29udGV4dD4JCQkJCQkJCQotCTwvTmV3TWV0aG9kRWxlbWVudD4JCQkJCi0JCQotCTxPdXRwdXRMaWJyYXJ5IG91dHB1dEZpbGVOYW1lPSJ0LnhtbCIvPgkKLQotPC9NZXRob2RMaWJyYXJ5VGVzdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL1Rlc3RDb21tYW5kcy9rZWx2aW5DYXNlLnRjIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9UZXN0Q29tbWFuZHMva2VsdmluQ2FzZS50YwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzM2YTZhNi4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL1Rlc3RDb21tYW5kcy9rZWx2aW5DYXNlLnRjCisrKyAvZGV2L251bGwKQEAgLTEsOTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxNZXRob2RMaWJyYXJ5VGVzdCBkaXNhYmxlPSJmYWxzZSI+Ci0JCi08IS0tIDEuIENyZWF0ZSBhIG5ldyBtZXRob2QgbGlicmFyeSAtLT4JCi0JPE9wZW5MaWJyYXJ5IGxpYkZvbGRlck5hbWU9ImtlbHZpbkNhc2UiPgotCTwvT3BlbkxpYnJhcnk+CQotCQotPCEtLSAyLiBDcmVhdGUgYSBuZXcgcGx1Z2luXzEgLS0+CQotCTxOZXdNZXRob2RFbGVtZW50Ci0JCXR5cGU9Ik1ldGhvZFBsdWdpbiIgCi0JCW5hbWU9InBsdWdpbl8xIgotCQlicmllZkRlc2NyaXB0aW9uPSJCcmllZiBkZXNjaXB0aW9uIG9mIHBsdWdpbl8xIgotCQlhdXRob3JzPSJLZWx2aW4iCQotCQk+CQotCTwvTmV3TWV0aG9kRWxlbWVudD4JCi0JCQotPCEtLSAzLiBDcmVhdGUgYSBuZXcgY29udGVudFBhY2thZ2VfMSAtLT4JCi0JPE5ld01ldGhvZEVsZW1lbnQKLQkJdHlwZT0iQ29udGVudFBhY2thZ2UiCi0JCW5hbWU9ImNvbnRlbnRQYWNrYWdlXzEiCi0JCXBhcmVudFBhdGg9InBsdWdpbl8xL0NvbnRlbnQvQ29yZUNvbnRlbnQiCi0JCT4JCQkKLQk8L05ld01ldGhvZEVsZW1lbnQ+CQotCQotPCEtLSA0LiBDcmVhdGUgYSBuZXcgdGFza18xIC0tPgkKLQk8TmV3TWV0aG9kRWxlbWVudAotCQl0eXBlPSJUYXNrIgotCQluYW1lPSJ0YXNrXzEiCi0JCXBhcmVudFBhdGg9InBsdWdpbl8xL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudFBhY2thZ2VfMSIKLQkJPgkKLQkJPHByZXNlbnRhdGlvbiAKLQkJCW1haW5EZXNjcmlwdGlvbj0iVGhpcyBpcyB0aGUgbWFpbiBkZXNjcmlwdGlvbiBvZiB0YXNrXzEiPgkJCQotCQk8L3ByZXNlbnRhdGlvbj4JCQotCTwvTmV3TWV0aG9kRWxlbWVudD4KLQkKLTwhLS0gNS4gQ3JlYXRlIGEgbmV3IGNvbmZpZ18xIHRoYXQgaW5jbHVkZXMgcGx1Z2luXzEgJiBjb250ZW50UGFja2FnZV8xIC0tPgkKLQk8TmV3TWV0aG9kRWxlbWVudCBkaXNhYmxlPSJmYWxzZSIKLQkJdHlwZT0iTWV0aG9kQ29uZmlndXJhdGlvbiIKLQkJbmFtZT0iY29uZmlnXzEiCi0JCWJyaWVmRGVzY3JpcHRpb249IkJyaWVmIGRlc2NpcHRpb24gb2YgY29uZmlnXzEiCi0JCT4KLQkgIDxtZXRob2RQbHVnaW5TZWxlY3Rpb24+Ci0JICAJPFZhbHVlPnBsdWdpbl8xPC9WYWx1ZT4KLSAgCSAgPC9tZXRob2RQbHVnaW5TZWxlY3Rpb24+Ci0JCQkJCQotCSAgPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24+Ci0JICAJPFZhbHVlPnBsdWdpbl8xL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudFBhY2thZ2VfMTwvVmFsdWU+Ci0gIAkgIDwvbWV0aG9kUGFja2FnZVNlbGVjdGlvbj4JCQkJCQkKLQk8L05ld01ldGhvZEVsZW1lbnQ+CQotCQotPCEtLSA2LiBDcmVhdGUgYSBuZXcgY3BfMSB1c2luZyBjb25maWdfMSAtLT4JCi0JPE5ld01ldGhvZEVsZW1lbnQgCi0JCXR5cGU9IkNhcGFiaWxpdHlQYXR0ZXJuIgotCQlwYXJlbnRQYXRoPSJwbHVnaW5fMS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucyIKLQkJbmFtZT0iY3BfMSIKLQkJYnJpZWZEZXNjcmlwdGlvbj0iQnJpZWYgZGVzY2lwdGlvbiBvZiBjcF8xIgotCQk+CQkKLQkJPGRlZmF1bHRDb250ZXh0PgotCQkJPFZhbHVlPmNvbmZpZ18xPC9WYWx1ZT4KLQkJPC9kZWZhdWx0Q29udGV4dD4KLQkJCQkKLQkJPHByZXNlbnRhdGlvbiAKLQkJCW1haW5EZXNjcmlwdGlvbj0iVGhpcyBpcyB0aGUgbWFpbiBkZXNjcmlwdGlvbiBvZiBjcF8xIj4JCQkKLQkJPC9wcmVzZW50YXRpb24+CQotCTwvTmV3TWV0aG9kRWxlbWVudD4KLQkJCi08IS0tIDYuIEFkZCBhIG5ldyB0ZF8xIHRvIGNwXzEgdGhhdCBpcyBsaW5rZWQgdG8gdGFza18xIC0tPgkJCQotCTxOZXdNZXRob2RFbGVtZW50IAotCQl0eXBlPSJUYXNrRGVzY3JpcHRvciIKLQkJcGFyZW50UGF0aD0icGx1Z2luXzEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY3BfMSIKLQkJbmFtZT0idGRfMSIKLQkJPgotCQk8VGFzaz4KLQkJCTxWYWx1ZT5wbHVnaW5fMS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRQYWNrYWdlXzEvdGFza18xPC9WYWx1ZT4KLQkJPC9UYXNrPgkJCQkKLQotCTwvTmV3TWV0aG9kRWxlbWVudD4KLQkKLTwhLS0gNy4gU3VwcHJlc3MgdGRfMSAtLT4JCQkKLQk8RWRpdE1ldGhvZEVsZW1lbnQgCi0JCXR5cGU9IlRhc2tEZXNjcmlwdG9yIgotCQlwYXRoPSJwbHVnaW5fMS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jcF8xL3RkXzEiCi0JCXN1cHByZXNzZWQ9InRydWUiCi0JCT4JCi0JPC9FZGl0TWV0aG9kRWxlbWVudD4gCQkJCi0JCi0JPE91dHB1dExpYnJhcnkgb3V0cHV0RmlsZU5hbWU9InQueG1sIi8+CQotCQotCTxDb21wYXJlVG9Hb2xkZW5GaWxlICAKLQkJZ29sZGVuRmlsZU5hbWU9ImtlbHZpbkNhc2UueG1sIiAKLQkJZGlmZkNvdW50PSIwIiAKLQkJZWxlbWVudENvdW50PSIzNSIKLQkJPgotCTwvQ29tcGFyZVRvR29sZGVuRmlsZT4KLQkKLQkJCi08L01ldGhvZExpYnJhcnlUZXN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvVGVzdENvbW1hbmRzL2tlbHZpbkNhc2UueG1sIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9UZXN0Q29tbWFuZHMva2VsdmluQ2FzZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmZTM3M2QuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9UZXN0Q29tbWFuZHMva2VsdmluQ2FzZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPFRlc3Rlck91dHB1dD4KLTxNZXRob2RMaWJyYXJ5IGF1dGhvcnM9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiBndWlkPSJfZWI5LWNOQldFZHlTS09jQ0xMdFRaUSIgbmFtZT0ia2VsdmluQ2FzZSIgb3JkZXJpbmdHdWlkZT0iIiBwYXRoPSIiIHByZXNlbnRhdGlvbk5hbWU9IiIgc3VwcHJlc3NlZD0iZmFsc2UiIHZlcnNpb249IiI+Ci08TWV0aG9kUGx1Z2luIGF1dGhvcnM9IktlbHZpbiIgYnJpZWZEZXNjcmlwdGlvbj0iQnJpZWYgZGVzY2lwdGlvbiBvZiBwbHVnaW5fMSIgY2hhbmdlRGVzY3JpcHRpb249IiIgZ3VpZD0iX2VoZi1zTkJXRWR5U0tPY0NMTHRUWlEiIG5hbWU9InBsdWdpbl8xIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IiIgc3VwcHJlc3NlZD0iZmFsc2UiIHVzZXJDaGFuZ2VhYmxlPSJ0cnVlIiB2ZXJzaW9uPSIiPgotPENvbnRlbnRQYWNrYWdlIGJyaWVmRGVzY3JpcHRpb249IiIgZ2xvYmFsPSJmYWxzZSIgZ3VpZD0iX2VoZi1zZEJXRWR5U0tPY0NMTHRUWlEiIG5hbWU9IkNvbnRlbnQiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iIiBzdXBwcmVzc2VkPSJmYWxzZSI+Ci08Q29udGVudFBhY2thZ2UgYnJpZWZEZXNjcmlwdGlvbj0iIiBnbG9iYWw9ImZhbHNlIiBndWlkPSJfZWhmLXN0QldFZHlTS09jQ0xMdFRaUSIgbmFtZT0iQ2F0ZWdvcmllcyIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSIiIHN1cHByZXNzZWQ9ImZhbHNlIj4KLTxDb250ZW50UGFja2FnZSBicmllZkRlc2NyaXB0aW9uPSIiIGdsb2JhbD0iZmFsc2UiIGd1aWQ9Il9laGYtczlCV0VkeVNLT2NDTEx0VFpRIiBuYW1lPSJEb21haW5zIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IiIgc3VwcHJlc3NlZD0iZmFsc2UiPgotPC9Db250ZW50UGFja2FnZT4KLTxDb250ZW50UGFja2FnZSBicmllZkRlc2NyaXB0aW9uPSIiIGdsb2JhbD0iZmFsc2UiIGd1aWQ9Il9laGYtdE5CV0VkeVNLT2NDTEx0VFpRIiBuYW1lPSJEaXNjaXBsaW5lcyIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSIiIHN1cHByZXNzZWQ9ImZhbHNlIj4KLTwvQ29udGVudFBhY2thZ2U+Ci08Q29udGVudFBhY2thZ2UgYnJpZWZEZXNjcmlwdGlvbj0iIiBnbG9iYWw9ImZhbHNlIiBndWlkPSJfZWhmLXRkQldFZHlTS09jQ0xMdFRaUSIgbmFtZT0iUm9sZVNldHMiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iIiBzdXBwcmVzc2VkPSJmYWxzZSI+Ci08L0NvbnRlbnRQYWNrYWdlPgotPENvbnRlbnRQYWNrYWdlIGJyaWVmRGVzY3JpcHRpb249IiIgZ2xvYmFsPSJmYWxzZSIgZ3VpZD0iX2VoZi10dEJXRWR5U0tPY0NMTHRUWlEiIG5hbWU9IldQIFR5cGVzIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IiIgc3VwcHJlc3NlZD0iZmFsc2UiPgotPC9Db250ZW50UGFja2FnZT4KLTxDb250ZW50UGFja2FnZSBicmllZkRlc2NyaXB0aW9uPSIiIGdsb2JhbD0iZmFsc2UiIGd1aWQ9Il9laGYtdDlCV0VkeVNLT2NDTEx0VFpRIiBuYW1lPSJUb29scyIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSIiIHN1cHByZXNzZWQ9ImZhbHNlIj4KLTwvQ29udGVudFBhY2thZ2U+Ci08Q29udGVudFBhY2thZ2UgYnJpZWZEZXNjcmlwdGlvbj0iIiBnbG9iYWw9ImZhbHNlIiBndWlkPSJfZWhmLXVOQldFZHlTS09jQ0xMdFRaUSIgbmFtZT0iU3RhbmRhcmRDYXRlZ29yaWVzIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IiIgc3VwcHJlc3NlZD0iZmFsc2UiPgotPC9Db250ZW50UGFja2FnZT4KLTxDb250ZW50UGFja2FnZSBicmllZkRlc2NyaXB0aW9uPSIiIGdsb2JhbD0iZmFsc2UiIGd1aWQ9Il9laGYtdWRCV0VkeVNLT2NDTEx0VFpRIiBuYW1lPSJDdXN0b21DYXRlZ29yaWVzIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IiIgc3VwcHJlc3NlZD0iZmFsc2UiPgotPENvbnRlbnRQYWNrYWdlIGJyaWVmRGVzY3JpcHRpb249IiIgZ2xvYmFsPSJmYWxzZSIgZ3VpZD0iX2VoZi11dEJXRWR5U0tPY0NMTHRUWlEiIG5hbWU9IkhpZGRlbiIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSIiIHN1cHByZXNzZWQ9ImZhbHNlIj4KLTxDdXN0b21DYXRlZ29yeSBicmllZkRlc2NyaXB0aW9uPSIiIGd1aWQ9Il9laGYtdTlCV0VkeVNLT2NDTEx0VFpRIiBpc0Fic3RyYWN0PSJmYWxzZSIgbmFtZT0iQ3VzdG9tIENhdGVnb3JpZXMiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08Q29udGVudERlc2NyaXB0aW9uIGF1dGhvcnM9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiBleHRlcm5hbElkPSIiIGd1aWQ9Ii1QbENGRTR4bzVvM1hPNWZsRXJZak5RIiBrZXlDb25zaWRlcmF0aW9ucz0iIiBtYWluRGVzY3JpcHRpb249IiIgbmFtZT0iQ3VzdG9tIENhdGVnb3JpZXMsX2VoZi11OUJXRWR5U0tPY0NMTHRUWlEiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgdmVyc2lvbj0iIj4KLTwvQ29udGVudERlc2NyaXB0aW9uPgotPC9DdXN0b21DYXRlZ29yeT4KLTwvQ29udGVudFBhY2thZ2U+Ci08L0NvbnRlbnRQYWNrYWdlPgotPC9Db250ZW50UGFja2FnZT4KLTxDb250ZW50UGFja2FnZSBicmllZkRlc2NyaXB0aW9uPSIiIGdsb2JhbD0iZmFsc2UiIGd1aWQ9Il9laGYtdk5CV0VkeVNLT2NDTEx0VFpRIiBuYW1lPSJDb3JlQ29udGVudCIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSIiIHN1cHByZXNzZWQ9ImZhbHNlIj4KLTxDb250ZW50UGFja2FnZSBicmllZkRlc2NyaXB0aW9uPSIiIGdsb2JhbD0iZmFsc2UiIGd1aWQ9Il9lbWQtUU5CV0VkeVNLT2NDTEx0VFpRIiBuYW1lPSJjb250ZW50UGFja2FnZV8xIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IiIgc3VwcHJlc3NlZD0iZmFsc2UiPgotPFRhc2sgYnJpZWZEZXNjcmlwdGlvbj0iIiBndWlkPSJfZW0yWXdOQldFZHlTS09jQ0xMdFRaUSIgaXNBYnN0cmFjdD0iZmFsc2UiIG5hbWU9InRhc2tfMSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiB2YXJpYWJpbGl0eVR5cGU9Im5hIj4KLTxUYXNrRGVzY3JpcHRpb24gYWx0ZXJuYXRpdmVzPSIiIGF1dGhvcnM9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBjaGFuZ2VEYXRlPSJUaHUgSmFuIDMxIDE1OjQ0OjM1IFBTVCAyMDA4IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiBleHRlcm5hbElkPSIiIGd1aWQ9Ii0tN2tqeVVqUmZtdE9qa1Fwc0N6SFdRIiBrZXlDb25zaWRlcmF0aW9ucz0iIiBtYWluRGVzY3JpcHRpb249IlRoaXMgaXMgdGhlIG1haW4gZGVzY3JpcHRpb24gb2YgdGFza18xIiBuYW1lPSJ0YXNrXzEsX2VtMll3TkJXRWR5U0tPY0NMTHRUWlEiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iIiBwdXJwb3NlPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiB2ZXJzaW9uPSIiPgotPC9UYXNrRGVzY3JpcHRpb24+Ci08L1Rhc2s+Ci08L0NvbnRlbnRQYWNrYWdlPgotPC9Db250ZW50UGFja2FnZT4KLTxQcm9jZXNzUGFja2FnZSBicmllZkRlc2NyaXB0aW9uPSIiIGdsb2JhbD0iZmFsc2UiIGd1aWQ9Il9laGYtdmRCV0VkeVNLT2NDTEx0VFpRIiBuYW1lPSJDYXBhYmlsaXR5UGF0dGVybnMiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iIiBzdXBwcmVzc2VkPSJmYWxzZSI+Ci08UHJvY2Vzc0NvbXBvbmVudCBhdXRob3JzPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgZ2xvYmFsPSJmYWxzZSIgZ3VpZD0iX2VySnA4TkJXRWR5U0tPY0NMTHRUWlEiIG5hbWU9ImNwXzEiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgdmVyc2lvbj0iIj4KLTxQcm9jZXNzUGFja2FnZSBicmllZkRlc2NyaXB0aW9uPSIiIGdsb2JhbD0iZmFsc2UiIGd1aWQ9Il9lc3hha2RCV0VkeVNLT2NDTEx0VFpRIiBuYW1lPSJ0ZF8xIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IiIgc3VwcHJlc3NlZD0iZmFsc2UiPgotPFRhc2tEZXNjcmlwdG9yIGJyaWVmRGVzY3JpcHRpb249IiIgZ3VpZD0iX2VzeGFrTkJXRWR5U0tPY0NMTHRUWlEiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc0Fic3RyYWN0PSJmYWxzZSIgaXNFdmVudERyaXZlbj0iZmFsc2UiIGlzT25nb2luZz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1BsYW5uZWQ9InRydWUiIGlzUmVwZWF0YWJsZT0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSIgbmFtZT0idGRfMSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVmaXg9IiIgcHJlc2VudGF0aW9uTmFtZT0iIiBzdXBwcmVzc2VkPSJ0cnVlIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gYXV0aG9ycz0iIiBicmllZkRlc2NyaXB0aW9uPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIGV4dGVybmFsSWQ9IiIgZ3VpZD0iLUdQWU1uNThYZXphOThlTEFTbkJ3VHciIGtleUNvbnNpZGVyYXRpb25zPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBuYW1lPSJ0ZF8xLF9lc3hha05CV0VkeVNLT2NDTEx0VFpRIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiB1c2FnZUd1aWRhbmNlPSIiIHZlcnNpb249IiI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxzdXBlckFjdGl2aXRpZXMgcGF0aD0icGx1Z2luXzEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY3BfMS9jcF8xIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPFRhc2sgcGF0aD0icGx1Z2luXzEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50UGFja2FnZV8xL3Rhc2tfMSI+Ci08L1Rhc2s+Ci08L1Rhc2tEZXNjcmlwdG9yPgotPC9Qcm9jZXNzUGFja2FnZT4KLTxDYXBhYmlsaXR5UGF0dGVybiBicmllZkRlc2NyaXB0aW9uPSJCcmllZiBkZXNjaXB0aW9uIG9mIGNwXzEiIGd1aWQ9Il9lcTljc2RCV0VkeVNLT2NDTEx0VFpRIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNBYnN0cmFjdD0iZmFsc2UiIGlzRXZlbnREcml2ZW49ImZhbHNlIiBpc09uZ29pbmc9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNQbGFubmVkPSJ0cnVlIiBpc1JlcGVhdGFibGU9ImZhbHNlIiBuYW1lPSJjcF8xIiBvcmRlcmluZ0d1aWRlPSIiIHByZWZpeD0iIiBwcmVzZW50YXRpb25OYW1lPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiB2YXJpYWJpbGl0eVR5cGU9Im5hIj4KLTxQcm9jZXNzRGVzY3JpcHRpb24gYWx0ZXJuYXRpdmVzPSIiIGF1dGhvcnM9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBjaGFuZ2VEYXRlPSJUaHUgSmFuIDMxIDE1OjQ0OjM1IFBTVCAyMDA4IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiBleHRlcm5hbElkPSIiIGd1aWQ9Ii1MSlNXSXBvVEktazhuTmlUa2NwZ3pnIiBob3d0b1N0YWZmPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIG1haW5EZXNjcmlwdGlvbj0iVGhpcyBpcyB0aGUgbWFpbiBkZXNjcmlwdGlvbiBvZiBjcF8xIiBuYW1lPSJjcF8xLF9lcTljc2RCV0VkeVNLT2NDTEx0VFpRIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IiIgcHVycG9zZT0iIiBzY29wZT0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgdXNhZ2VHdWlkYW5jZT0iIiB1c2FnZU5vdGVzPSIiIHZlcnNpb249IiI+Ci08L1Byb2Nlc3NEZXNjcmlwdGlvbj4KLTxicmVha2Rvd25FbGVtZW50cyBwYXRoPSJwbHVnaW5fMS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jcF8xL3RkXzEvdGRfMSI+Ci08L2JyZWFrZG93bkVsZW1lbnRzPgotPGRlZmF1bHRDb250ZXh0IHBhdGg9ImNvbmZpZ18xIj4KLTwvZGVmYXVsdENvbnRleHQ+Ci08L0NhcGFiaWxpdHlQYXR0ZXJuPgotPC9Qcm9jZXNzQ29tcG9uZW50PgotPC9Qcm9jZXNzUGFja2FnZT4KLTwvQ29udGVudFBhY2thZ2U+Ci08UHJvY2Vzc1BhY2thZ2UgYnJpZWZEZXNjcmlwdGlvbj0iIiBnbG9iYWw9ImZhbHNlIiBndWlkPSJfZWhmLXZ0QldFZHlTS09jQ0xMdFRaUSIgbmFtZT0iRGVsaXZlcnlQcm9jZXNzZXMiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iIiBzdXBwcmVzc2VkPSJmYWxzZSI+Ci08L1Byb2Nlc3NQYWNrYWdlPgotPFByb2Nlc3NQYWNrYWdlIGJyaWVmRGVzY3JpcHRpb249IiIgZ2xvYmFsPSJmYWxzZSIgZ3VpZD0iX2VoZi12OUJXRWR5U0tPY0NMTHRUWlEiIG5hbWU9IlByb2Nlc3NDb250cmlidXRpb25zIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IiIgc3VwcHJlc3NlZD0iZmFsc2UiPgotPC9Qcm9jZXNzUGFja2FnZT4KLTwvTWV0aG9kUGx1Z2luPgotPE1ldGhvZENvbmZpZ3VyYXRpb24gYXV0aG9ycz0iIiBicmllZkRlc2NyaXB0aW9uPSJCcmllZiBkZXNjaXB0aW9uIG9mIGNvbmZpZ18xIiBjaGFuZ2VEYXRlPSJUaHUgSmFuIDMxIDE1OjQ0OjM1IFBTVCAyMDA4IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiBndWlkPSJfZXFsQ01OQldFZHlTS09jQ0xMdFRaUSIgbmFtZT0iY29uZmlnXzEiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgdmVyc2lvbj0iIj4KLTxtZXRob2RQbHVnaW5TZWxlY3Rpb24gcGF0aD0icGx1Z2luXzEiPgotPC9tZXRob2RQbHVnaW5TZWxlY3Rpb24+Ci08bWV0aG9kUGFja2FnZVNlbGVjdGlvbiBwYXRoPSJwbHVnaW5fMS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRQYWNrYWdlXzEiPgotPC9tZXRob2RQYWNrYWdlU2VsZWN0aW9uPgotPC9NZXRob2RDb25maWd1cmF0aW9uPgotPC9NZXRob2RMaWJyYXJ5PgotPC9UZXN0ZXJPdXRwdXQ+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL1Rlc3RDb21tYW5kcy9uZXdNZXRob2RFbGVtZW50cy9uZXdBY3Rpdml0aWVzLnRjIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9UZXN0Q29tbWFuZHMvbmV3TWV0aG9kRWxlbWVudHMvbmV3QWN0aXZpdGllcy50YwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjQ1YzUxMy4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL1Rlc3RDb21tYW5kcy9uZXdNZXRob2RFbGVtZW50cy9uZXdBY3Rpdml0aWVzLnRjCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxNZXRob2RMaWJyYXJ5VGVzdCBkaXNhYmxlPSJmYWxzZSI+Ci0JCi0JPE9wZW5MaWJyYXJ5IGxpYkZvbGRlck5hbWU9Im5ld0xpYiI+Ci0JPC9PcGVuTGlicmFyeT4JCi0JCi0JPE5ld01ldGhvZEVsZW1lbnQKLQkJdHlwZT0iTWV0aG9kUGx1Z2luIiAKLQkJbmFtZT0iUGx1Z19BIgotCQlicmllZkRlc2NyaXB0aW9uPSJCcmllZiBkZXNjaXB0aW9uIG9mIFBsdWdfQSIKLQkJYXV0aG9ycz0iU29tZWJvZHkiCQotCQk+CQotCTwvTmV3TWV0aG9kRWxlbWVudD4JCi0JCi0JPE5ld01ldGhvZEVsZW1lbnQgCi0JCXR5cGU9Ik1ldGhvZENvbmZpZ3VyYXRpb24iCi0JCW5hbWU9IkNvbmZpZ19BIgotCQk+CQkJCi0JPC9OZXdNZXRob2RFbGVtZW50PgkJCQkJCQkJCQkKLQkJCi0JPE5ld01ldGhvZEVsZW1lbnQgZGlzYWJsZT0iZmFsc2UiCi0JCXR5cGU9IkNhcGFiaWxpdHlQYXR0ZXJuIgotCQlwYXJlbnRQYXRoPSJQbHVnX0EvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMiCi0JCW5hbWU9ImNwXzEiCi0JCWJyaWVmRGVzY3JpcHRpb249IkJyaWVmIGRlc2NpcHRpb24gb2YgY3BfMSIKLQkJPgkJCi0JCTxkZWZhdWx0Q29udGV4dD4KLQkJCTxWYWx1ZT5Db25maWdfQTwvVmFsdWU+Ci0JCTwvZGVmYXVsdENvbnRleHQ+CQkKLQkJCQkKLQk8L05ld01ldGhvZEVsZW1lbnQ+Ci0JCi0JCi0JPEVkaXRNZXRob2RFbGVtZW50IGRpc2FibGU9ImZhbHNlIgotCQl0eXBlPSJDYXBhYmlsaXR5UGF0dGVybiIKLQkJcGF0aD0iUGx1Z19BL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NwXzEiCQotCQk+CQotCQk8cHJlc2VudGF0aW9uIAotCQkJbWFpbkRlc2NyaXB0aW9uPSJUaGlzIGlzIHRoZSBtYWluIGRlc2NyaXB0aW9uIG9mIGNwXzEiPgkJCQotCQk8L3ByZXNlbnRhdGlvbj4JCi0JPC9FZGl0TWV0aG9kRWxlbWVudD4KLQkKLQkJCQkKLQk8TmV3TWV0aG9kRWxlbWVudCBkaXNhYmxlPSJmYWxzZSIKLQkJdHlwZT0iQWN0aXZpdHkiCi0JCXBhcmVudFBhdGg9IlBsdWdfQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jcF8xIgotCQluYW1lPSJhY3RfMSIKLQkJYnJpZWZEZXNjcmlwdGlvbj0iQnJpZWYgZGVzY2lwdGlvbiBvZiBhY3RfMSIKLQkJPgkJCQkKLQkJCQkKLQk8L05ld01ldGhvZEVsZW1lbnQ+Ci0JCi0JPEVkaXRNZXRob2RFbGVtZW50IGRpc2FibGU9ImZhbHNlIgotCQl0eXBlPSJBY3Rpdml0eSIKLQkJcGF0aD0iUGx1Z19BL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NwXzEvYWN0XzEiCi0JCT4JCQkJCi0JCTxwcmVzZW50YXRpb24gCi0JCQltYWluRGVzY3JpcHRpb249IlRoaXMgaXMgdGhlIG1haW4gZGVzY3JpcHRpb24gb2YgYWN0XzEiPgkJCQotCQk8L3ByZXNlbnRhdGlvbj4JCi0JPC9FZGl0TWV0aG9kRWxlbWVudD4KLQkKLQkKLQk8TmV3TWV0aG9kRWxlbWVudCBkaXNhYmxlPSJmYWxzZSIKLQkJdHlwZT0iUGhhc2UiCi0JCXBhcmVudFBhdGg9IlBsdWdfQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jcF8xL2FjdF8xIgotCQluYW1lPSJwaGFzZV8xIgotCQlicmllZkRlc2NyaXB0aW9uPSJCcmllZiBkZXNjaXB0aW9uIG9mIHBoYXNlXzEiCi0JCT4JCQkJCi0JCQkJCi0JPC9OZXdNZXRob2RFbGVtZW50PgotCQotCQotCQotCTxPdXRwdXRMaWJyYXJ5IC8+CQotCQotCTxDb21wYXJlVG9Hb2xkZW5GaWxlICBkaXNhYmxlPSJmYWxzZSIKLQkJZ29sZGVuRmlsZU5hbWU9Im5ld0FjdGl2aXRpZXMueG1sIiAKLQkJZGlmZkNvdW50PSIwIiAKLQkJZWxlbWVudENvdW50PSIzNCIKLQkJPgotCTwvQ29tcGFyZVRvR29sZGVuRmlsZT4KLQkKLQkJCi08L01ldGhvZExpYnJhcnlUZXN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvVGVzdENvbW1hbmRzL25ld01ldGhvZEVsZW1lbnRzL25ld0FjdGl2aXRpZXMueG1sIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9UZXN0Q29tbWFuZHMvbmV3TWV0aG9kRWxlbWVudHMvbmV3QWN0aXZpdGllcy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExMGEwODAuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9UZXN0Q29tbWFuZHMvbmV3TWV0aG9kRWxlbWVudHMvbmV3QWN0aXZpdGllcy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPFRlc3Rlck91dHB1dD4KLTxNZXRob2RMaWJyYXJ5IGF1dGhvcnM9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiBndWlkPSJfb09zMTBORHdFZHlNN1B5MW1zU2FXZyIgbmFtZT0ibmV3TGliIiBvcmRlcmluZ0d1aWRlPSIiIHBhdGg9IiIgcHJlc2VudGF0aW9uTmFtZT0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgdmVyc2lvbj0iIj4KLTxNZXRob2RQbHVnaW4gYXV0aG9ycz0iU29tZWJvZHkiIGJyaWVmRGVzY3JpcHRpb249IkJyaWVmIGRlc2NpcHRpb24gb2YgUGx1Z19BIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiBndWlkPSJfb1VVOHNORHdFZHlNN1B5MW1zU2FXZyIgbmFtZT0iUGx1Z19BIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IiIgc3VwcHJlc3NlZD0iZmFsc2UiIHVzZXJDaGFuZ2VhYmxlPSJ0cnVlIiB2ZXJzaW9uPSIiPgotPENvbnRlbnRQYWNrYWdlIGJyaWVmRGVzY3JpcHRpb249IiIgZ2xvYmFsPSJmYWxzZSIgZ3VpZD0iX29VVThzZER3RWR5TTdQeTFtc1NhV2ciIG5hbWU9IkNvbnRlbnQiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iIiBzdXBwcmVzc2VkPSJmYWxzZSI+Ci08Q29udGVudFBhY2thZ2UgYnJpZWZEZXNjcmlwdGlvbj0iIiBnbG9iYWw9ImZhbHNlIiBndWlkPSJfb1VVOHN0RHdFZHlNN1B5MW1zU2FXZyIgbmFtZT0iQ2F0ZWdvcmllcyIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSIiIHN1cHByZXNzZWQ9ImZhbHNlIj4KLTxDb250ZW50UGFja2FnZSBicmllZkRlc2NyaXB0aW9uPSIiIGdsb2JhbD0iZmFsc2UiIGd1aWQ9Il9vVVU4czlEd0VkeU03UHkxbXNTYVdnIiBuYW1lPSJEb21haW5zIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IiIgc3VwcHJlc3NlZD0iZmFsc2UiPgotPC9Db250ZW50UGFja2FnZT4KLTxDb250ZW50UGFja2FnZSBicmllZkRlc2NyaXB0aW9uPSIiIGdsb2JhbD0iZmFsc2UiIGd1aWQ9Il9vVVU4dE5Ed0VkeU03UHkxbXNTYVdnIiBuYW1lPSJEaXNjaXBsaW5lcyIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSIiIHN1cHByZXNzZWQ9ImZhbHNlIj4KLTwvQ29udGVudFBhY2thZ2U+Ci08Q29udGVudFBhY2thZ2UgYnJpZWZEZXNjcmlwdGlvbj0iIiBnbG9iYWw9ImZhbHNlIiBndWlkPSJfb1VVOHRkRHdFZHlNN1B5MW1zU2FXZyIgbmFtZT0iUm9sZVNldHMiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iIiBzdXBwcmVzc2VkPSJmYWxzZSI+Ci08L0NvbnRlbnRQYWNrYWdlPgotPENvbnRlbnRQYWNrYWdlIGJyaWVmRGVzY3JpcHRpb249IiIgZ2xvYmFsPSJmYWxzZSIgZ3VpZD0iX29VVTh0dER3RWR5TTdQeTFtc1NhV2ciIG5hbWU9IldQIFR5cGVzIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IiIgc3VwcHJlc3NlZD0iZmFsc2UiPgotPC9Db250ZW50UGFja2FnZT4KLTxDb250ZW50UGFja2FnZSBicmllZkRlc2NyaXB0aW9uPSIiIGdsb2JhbD0iZmFsc2UiIGd1aWQ9Il9vVVU4dDlEd0VkeU03UHkxbXNTYVdnIiBuYW1lPSJUb29scyIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSIiIHN1cHByZXNzZWQ9ImZhbHNlIj4KLTwvQ29udGVudFBhY2thZ2U+Ci08Q29udGVudFBhY2thZ2UgYnJpZWZEZXNjcmlwdGlvbj0iIiBnbG9iYWw9ImZhbHNlIiBndWlkPSJfb1VVOHVORHdFZHlNN1B5MW1zU2FXZyIgbmFtZT0iU3RhbmRhcmRDYXRlZ29yaWVzIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IiIgc3VwcHJlc3NlZD0iZmFsc2UiPgotPC9Db250ZW50UGFja2FnZT4KLTxDb250ZW50UGFja2FnZSBicmllZkRlc2NyaXB0aW9uPSIiIGdsb2JhbD0iZmFsc2UiIGd1aWQ9Il9vVVU4dWREd0VkeU03UHkxbXNTYVdnIiBuYW1lPSJDdXN0b21DYXRlZ29yaWVzIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IiIgc3VwcHJlc3NlZD0iZmFsc2UiPgotPENvbnRlbnRQYWNrYWdlIGJyaWVmRGVzY3JpcHRpb249IiIgZ2xvYmFsPSJmYWxzZSIgZ3VpZD0iX29VVTh1dER3RWR5TTdQeTFtc1NhV2ciIG5hbWU9IkhpZGRlbiIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSIiIHN1cHByZXNzZWQ9ImZhbHNlIj4KLTxDdXN0b21DYXRlZ29yeSBicmllZkRlc2NyaXB0aW9uPSIiIGd1aWQ9Il9vVVU4dTlEd0VkeU03UHkxbXNTYVdnIiBpc0Fic3RyYWN0PSJmYWxzZSIgbmFtZT0iQ3VzdG9tIENhdGVnb3JpZXMiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08Q29udGVudERlc2NyaXB0aW9uIGF1dGhvcnM9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiBleHRlcm5hbElkPSIiIGd1aWQ9Ii1zTVdRYnM2M1FkTTZCQXlFQlhvUGRRIiBrZXlDb25zaWRlcmF0aW9ucz0iIiBtYWluRGVzY3JpcHRpb249IiIgbmFtZT0iQ3VzdG9tIENhdGVnb3JpZXMsX29VVTh1OUR3RWR5TTdQeTFtc1NhV2ciIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgdmVyc2lvbj0iIj4KLTwvQ29udGVudERlc2NyaXB0aW9uPgotPC9DdXN0b21DYXRlZ29yeT4KLTwvQ29udGVudFBhY2thZ2U+Ci08L0NvbnRlbnRQYWNrYWdlPgotPC9Db250ZW50UGFja2FnZT4KLTxDb250ZW50UGFja2FnZSBicmllZkRlc2NyaXB0aW9uPSIiIGdsb2JhbD0iZmFsc2UiIGd1aWQ9Il9vVVU4dk5Ed0VkeU03UHkxbXNTYVdnIiBuYW1lPSJDb3JlQ29udGVudCIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSIiIHN1cHByZXNzZWQ9ImZhbHNlIj4KLTwvQ29udGVudFBhY2thZ2U+Ci08UHJvY2Vzc1BhY2thZ2UgYnJpZWZEZXNjcmlwdGlvbj0iIiBnbG9iYWw9ImZhbHNlIiBndWlkPSJfb1VVOHZkRHdFZHlNN1B5MW1zU2FXZyIgbmFtZT0iQ2FwYWJpbGl0eVBhdHRlcm5zIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IiIgc3VwcHJlc3NlZD0iZmFsc2UiPgotPFByb2Nlc3NDb21wb25lbnQgYXV0aG9ycz0iIiBicmllZkRlc2NyaXB0aW9uPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIGdsb2JhbD0iZmFsc2UiIGd1aWQ9Il9vWHdFSWREd0VkeU03UHkxbXNTYVdnIiBuYW1lPSJjcF8xIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IiIgc3VwcHJlc3NlZD0iZmFsc2UiIHZlcnNpb249IiI+Ci08UHJvY2Vzc1BhY2thZ2UgYnJpZWZEZXNjcmlwdGlvbj0iIiBnbG9iYWw9ImZhbHNlIiBndWlkPSJfb2FJcHdkRHdFZHlNN1B5MW1zU2FXZyIgbmFtZT0iYWN0XzEiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iIiBzdXBwcmVzc2VkPSJmYWxzZSI+Ci08UHJvY2Vzc1BhY2thZ2UgYnJpZWZEZXNjcmlwdGlvbj0iIiBnbG9iYWw9ImZhbHNlIiBndWlkPSJfb2FuSzRkRHdFZHlNN1B5MW1zU2FXZyIgbmFtZT0icGhhc2VfMSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSIiIHN1cHByZXNzZWQ9ImZhbHNlIj4KLTxQaGFzZSBicmllZkRlc2NyaXB0aW9uPSJCcmllZiBkZXNjaXB0aW9uIG9mIHBoYXNlXzEiIGd1aWQ9Il9vYW5LNE5Ed0VkeU03UHkxbXNTYVdnIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNBYnN0cmFjdD0iZmFsc2UiIGlzRXZlbnREcml2ZW49ImZhbHNlIiBpc09uZ29pbmc9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNQbGFubmVkPSJ0cnVlIiBpc1JlcGVhdGFibGU9ImZhbHNlIiBuYW1lPSJwaGFzZV8xIiBvcmRlcmluZ0d1aWRlPSIiIHByZWZpeD0iIiBwcmVzZW50YXRpb25OYW1lPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiB2YXJpYWJpbGl0eVR5cGU9Im5hIj4KLTxBY3Rpdml0eURlc2NyaXB0aW9uIGFsdGVybmF0aXZlcz0iIiBhdXRob3JzPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgZXh0ZXJuYWxJZD0iIiBndWlkPSItTUdGamFLRUp3b3dPdEM2NmJzRDM1dyIgaG93dG9TdGFmZj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiBtYWluRGVzY3JpcHRpb249IiIgbmFtZT0icGhhc2VfMSxfb2FuSzRORHdFZHlNN1B5MW1zU2FXZyIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSIiIHB1cnBvc2U9IiIgc3VwcHJlc3NlZD0iZmFsc2UiIHVzYWdlR3VpZGFuY2U9IiIgdmVyc2lvbj0iIj4KLTwvQWN0aXZpdHlEZXNjcmlwdGlvbj4KLTxzdXBlckFjdGl2aXRpZXMgcGF0aD0iUGx1Z19BL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NwXzEvYWN0XzEvYWN0XzEiPgotPC9zdXBlckFjdGl2aXRpZXM+Ci08L1BoYXNlPgotPC9Qcm9jZXNzUGFja2FnZT4KLTxBY3Rpdml0eSBicmllZkRlc2NyaXB0aW9uPSJCcmllZiBkZXNjaXB0aW9uIG9mIGFjdF8xIiBndWlkPSJfb2FJcHdORHdFZHlNN1B5MW1zU2FXZyIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzQWJzdHJhY3Q9ImZhbHNlIiBpc0V2ZW50RHJpdmVuPSJmYWxzZSIgaXNPbmdvaW5nPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzUGxhbm5lZD0idHJ1ZSIgaXNSZXBlYXRhYmxlPSJmYWxzZSIgbmFtZT0iYWN0XzEiIG9yZGVyaW5nR3VpZGU9IiIgcHJlZml4PSIiIHByZXNlbnRhdGlvbk5hbWU9IiIgc3VwcHJlc3NlZD0iZmFsc2UiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPEFjdGl2aXR5RGVzY3JpcHRpb24gYWx0ZXJuYXRpdmVzPSIiIGF1dGhvcnM9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBjaGFuZ2VEYXRlPSJGcmkgRmViIDAxIDEwOjA4OjAzIFBTVCAyMDA4IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiBleHRlcm5hbElkPSIiIGd1aWQ9Ii1UclZmdHlIUXJHNWc4VE5JVjNoTzJ3IiBob3d0b1N0YWZmPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIG1haW5EZXNjcmlwdGlvbj0iVGhpcyBpcyB0aGUgbWFpbiBkZXNjcmlwdGlvbiBvZiBhY3RfMSIgbmFtZT0iYWN0XzEsX29hSXB3TkR3RWR5TTdQeTFtc1NhV2ciIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iIiBwdXJwb3NlPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiB1c2FnZUd1aWRhbmNlPSIiIHZlcnNpb249IiI+Ci08L0FjdGl2aXR5RGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWdfQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jcF8xL2NwXzEiPgotPC9zdXBlckFjdGl2aXRpZXM+Ci08YnJlYWtkb3duRWxlbWVudHMgcGF0aD0iUGx1Z19BL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NwXzEvYWN0XzEvcGhhc2VfMS9waGFzZV8xIj4KLTwvYnJlYWtkb3duRWxlbWVudHM+Ci08L0FjdGl2aXR5PgotPC9Qcm9jZXNzUGFja2FnZT4KLTxDYXBhYmlsaXR5UGF0dGVybiBicmllZkRlc2NyaXB0aW9uPSJCcmllZiBkZXNjaXB0aW9uIG9mIGNwXzEiIGd1aWQ9Il9vWHdFSU5Ed0VkeU03UHkxbXNTYVdnIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNBYnN0cmFjdD0iZmFsc2UiIGlzRXZlbnREcml2ZW49ImZhbHNlIiBpc09uZ29pbmc9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNQbGFubmVkPSJ0cnVlIiBpc1JlcGVhdGFibGU9ImZhbHNlIiBuYW1lPSJjcF8xIiBvcmRlcmluZ0d1aWRlPSIiIHByZWZpeD0iIiBwcmVzZW50YXRpb25OYW1lPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiB2YXJpYWJpbGl0eVR5cGU9Im5hIj4KLTxQcm9jZXNzRGVzY3JpcHRpb24gYWx0ZXJuYXRpdmVzPSIiIGF1dGhvcnM9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBjaGFuZ2VEYXRlPSJGcmkgRmViIDAxIDEwOjA4OjAzIFBTVCAyMDA4IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiBleHRlcm5hbElkPSIiIGd1aWQ9Ii1fWGE2cTRTZVV0VHI0ZDhQN2VvcUFnIiBob3d0b1N0YWZmPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIG1haW5EZXNjcmlwdGlvbj0iVGhpcyBpcyB0aGUgbWFpbiBkZXNjcmlwdGlvbiBvZiBjcF8xIiBuYW1lPSJjcF8xLF9vWHdFSU5Ed0VkeU03UHkxbXNTYVdnIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IiIgcHVycG9zZT0iIiBzY29wZT0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgdXNhZ2VHdWlkYW5jZT0iIiB1c2FnZU5vdGVzPSIiIHZlcnNpb249IiI+Ci08L1Byb2Nlc3NEZXNjcmlwdGlvbj4KLTxicmVha2Rvd25FbGVtZW50cyBwYXRoPSJQbHVnX0EvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY3BfMS9hY3RfMS9hY3RfMSI+Ci08L2JyZWFrZG93bkVsZW1lbnRzPgotPGRlZmF1bHRDb250ZXh0IHBhdGg9IkNvbmZpZ19BIj4KLTwvZGVmYXVsdENvbnRleHQ+Ci08L0NhcGFiaWxpdHlQYXR0ZXJuPgotPC9Qcm9jZXNzQ29tcG9uZW50PgotPC9Qcm9jZXNzUGFja2FnZT4KLTwvQ29udGVudFBhY2thZ2U+Ci08UHJvY2Vzc1BhY2thZ2UgYnJpZWZEZXNjcmlwdGlvbj0iIiBnbG9iYWw9ImZhbHNlIiBndWlkPSJfb1VVOHZ0RHdFZHlNN1B5MW1zU2FXZyIgbmFtZT0iRGVsaXZlcnlQcm9jZXNzZXMiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iIiBzdXBwcmVzc2VkPSJmYWxzZSI+Ci08L1Byb2Nlc3NQYWNrYWdlPgotPFByb2Nlc3NQYWNrYWdlIGJyaWVmRGVzY3JpcHRpb249IiIgZ2xvYmFsPSJmYWxzZSIgZ3VpZD0iX29VVTh2OUR3RWR5TTdQeTFtc1NhV2ciIG5hbWU9IlByb2Nlc3NDb250cmlidXRpb25zIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IiIgc3VwcHJlc3NlZD0iZmFsc2UiPgotPC9Qcm9jZXNzUGFja2FnZT4KLTwvTWV0aG9kUGx1Z2luPgotPE1ldGhvZENvbmZpZ3VyYXRpb24gYXV0aG9ycz0iIiBicmllZkRlc2NyaXB0aW9uPSIiIGNoYW5nZURhdGU9IkZyaSBGZWIgMDEgMTA6MDg6MDMgUFNUIDIwMDgiIGNoYW5nZURlc2NyaXB0aW9uPSIiIGd1aWQ9Il9vV19QSU5Ed0VkeU03UHkxbXNTYVdnIiBuYW1lPSJDb25maWdfQSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiB2ZXJzaW9uPSIiPgotPC9NZXRob2RDb25maWd1cmF0aW9uPgotPC9NZXRob2RMaWJyYXJ5PgotPC9UZXN0ZXJPdXRwdXQ+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL1Rlc3RDb21tYW5kcy9uZXdNZXRob2RFbGVtZW50cy9uZXdNZXRob2RFbGVtZW50cy50YyBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvVGVzdENvbW1hbmRzL25ld01ldGhvZEVsZW1lbnRzL25ld01ldGhvZEVsZW1lbnRzLnRjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOTI3ZmJiLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvVGVzdENvbW1hbmRzL25ld01ldGhvZEVsZW1lbnRzL25ld01ldGhvZEVsZW1lbnRzLnRjCisrKyAvZGV2L251bGwKQEAgLTEsOTYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxNZXRob2RMaWJyYXJ5VGVzdCBkaXNhYmxlPSJmYWxzZSI+Ci0JCi0JPE9wZW5MaWJyYXJ5IGxpYkZvbGRlck5hbWU9Im5ld0xpYiI+Ci0JPC9PcGVuTGlicmFyeT4JCi0JCi0JPE5ld01ldGhvZEVsZW1lbnQgCi0JCXR5cGU9Ik1ldGhvZFBsdWdpbiIKLQkJbmFtZT0iUGx1Z1Rlc3QiCi0JCT4JCi0JPC9OZXdNZXRob2RFbGVtZW50PgkKLQkKLQk8TmV3TWV0aG9kRWxlbWVudCBkaXNhYmxlPSJmYWxzZSIKLQkJdHlwZT0iTWV0aG9kQ29uZmlndXJhdGlvbiIKLQkJbmFtZT0iQ29uZmlnX1Rlc3QiCi0JCT4JCQkKLQk8L05ld01ldGhvZEVsZW1lbnQ+Ci0JCQotCTxOZXdNZXRob2RFbGVtZW50Ci0JCXR5cGU9Ik1ldGhvZFBsdWdpbiIgIAotCQluYW1lPSJQbHVnX0EiCi0JCWJyaWVmRGVzY3JpcHRpb249IkJyaWVmIGRlc2NpcHRpb24gb2YgUGx1Z19BIgotCQlhdXRob3JzPSJSTUMgdGVhbSBtZW1iZXIgQSIJCi0JCT4JCi0JPC9OZXdNZXRob2RFbGVtZW50PgotCQotCTxOZXdNZXRob2RFbGVtZW50Ci0JCXR5cGU9Ik1ldGhvZFBsdWdpbiIgCi0JCW5hbWU9IlBsdWdfQiIKLQkJYnJpZWZEZXNjcmlwdGlvbj0iQnJpZWYgZGVzY2lwdGlvbiBvZiBQbHVnX0IiCi0JCWF1dGhvcnM9IlJNQyB0ZWFtIG1lbWJlciBCIgkKLQkJPgotCQk8YmFzZXM+Ci0JCQk8VmFsdWU+UGx1Z19BPC9WYWx1ZT4KLQkJPC9iYXNlcz4JCQkKLQk8L05ld01ldGhvZEVsZW1lbnQ+Ci0JCQkKLQk8RWRpdE1ldGhvZEVsZW1lbnQKLQkJdHlwZT0iTWV0aG9kUGx1Z2luIgotCQlwYXRoPSJQbHVnX0IiCi0JCT4KLQkJPGJhc2VzPgotCQkJPFZhbHVlPlBsdWdfQTA8L1ZhbHVlPgotCQk8L2Jhc2VzPgkJCi0JPC9FZGl0TWV0aG9kRWxlbWVudD4KLQkJCQotCQkJCi0JPE5ld01ldGhvZENvbmZpZ3VyYXRpb24gZGlzYWJsZT0iZmFsc2UiCi0JCW5hbWU9IkNvbmZpZ19BIgotCQlicmllZkRlc2NyaXB0aW9uPSJCcmllZiBkZXNjaXB0aW9uIG9mIENvbmZpZ19BIgotCQk+CQkJCi0JPC9OZXdNZXRob2RDb25maWd1cmF0aW9uPgotCQotCTxOZXdNZXRob2RFbGVtZW50Ci0JCXR5cGU9IkNvbnRlbnRQYWNrYWdlIgotCQluYW1lPSJDb250ZW50UGFja2FnZV8xIgotCQlwYXJlbnRQYXRoPSJQbHVnX0EvQ29udGVudC9Db3JlQ29udGVudCIKLQkJPgkJCQotCTwvTmV3TWV0aG9kRWxlbWVudD4JCi0JCi0JPE5ld01ldGhvZEVsZW1lbnQKLQkJdHlwZT0iUm9sZSIKLQkJbmFtZT0icm9sZV8xIgotCQlwYXJlbnRQYXRoPSJQbHVnX0EvQ29udGVudC9Db3JlQ29udGVudC9Db250ZW50UGFja2FnZV8xIgotCQk+CQkJCi0JPC9OZXdNZXRob2RFbGVtZW50PgotCQotCQkKLQk8RWRpdE1ldGhvZEVsZW1lbnQKLQkJdHlwZT0iUm9sZSIKLQkJcGF0aD0iUGx1Z19BL0NvbnRlbnQvQ29yZUNvbnRlbnQvQ29udGVudFBhY2thZ2VfMS9yb2xlXzEiCi0JCXByZXNlbnRhdGlvbk5hbWU9IlJvbGUgMSIKLQkJYnJpZWZEZXNjcmlwdGlvbj0iVGhpcyBpcyBhIGJyaWVmIGRzZXNjcmlwdGlvbiBvZiBSb2xlIDEiCi0JCT4KLQkJPHByZXNlbnRhdGlvbiBtYWluRGVzY3JpcHRpb249IlRoaXMgaXMgdGhlIG1haW4gZGVzY3JpcHRpb24gb2YgUm9sZSAxIj4KLQkJCQotCQk8L3ByZXNlbnRhdGlvbj4JCQkKLQk8L0VkaXRNZXRob2RFbGVtZW50PgkJCi0JCi0JPE91dHB1dExpYnJhcnkgZGlzYWJsZT0iZmFsc2UiIC8+Ci0JCi0JPE91dHB1dFBsdWdpbiBwYXRoPSJQbHVnX0EiIHJlY3Vyc2l2ZT0iZmFsc2UiPgotCTwvT3V0cHV0UGx1Z2luPgotCQotCTxPdXRwdXRDb25maWd1cmF0aW9uIHBhdGg9IkNvbmZpZ19BIiByZWN1cnNpdmU9ImZhbHNlIj4KLQk8L091dHB1dENvbmZpZ3VyYXRpb24+Ci0JCi0JPENvbXBhcmVUb0dvbGRlbkZpbGUgCi0JCWdvbGRlbkZpbGVOYW1lPSJuZXdNZXRob2RFbGVtZW50cy54bWwiIAotCQlkaWZmQ291bnQ9IjAiIAotCQllbGVtZW50Q291bnQ9IjY0IgotCQk+Ci0JPC9Db21wYXJlVG9Hb2xkZW5GaWxlPgotCQotCQkKLTwvTWV0aG9kTGlicmFyeVRlc3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9UZXN0Q29tbWFuZHMvbmV3TWV0aG9kRWxlbWVudHMvbmV3TWV0aG9kRWxlbWVudHMueG1sIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9UZXN0Q29tbWFuZHMvbmV3TWV0aG9kRWxlbWVudHMvbmV3TWV0aG9kRWxlbWVudHMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NTBlMWQ2Li4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvVGVzdENvbW1hbmRzL25ld01ldGhvZEVsZW1lbnRzL25ld01ldGhvZEVsZW1lbnRzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDEyOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPFRlc3Rlck91dHB1dD4KLTxNZXRob2RMaWJyYXJ5IGF1dGhvcnM9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiBndWlkPSJfNUJaYVlOQlZFZHlmYUxhSll2VzRRZyIgbmFtZT0ibmV3TGliIiBvcmRlcmluZ0d1aWRlPSIiIHBhdGg9IiIgcHJlc2VudGF0aW9uTmFtZT0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgdmVyc2lvbj0iIj4KLTxNZXRob2RQbHVnaW4gY2hhbmdlRGVzY3JpcHRpb249IiIgZ3VpZD0iXzVIT1ZrTkJWRWR5ZmFMYUpZdlc0UWciIG5hbWU9IlBsdWdUZXN0IiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IiIgc3VwcHJlc3NlZD0iZmFsc2UiIHVzZXJDaGFuZ2VhYmxlPSJ0cnVlIiB2ZXJzaW9uPSIiPgotPENvbnRlbnRQYWNrYWdlIGJyaWVmRGVzY3JpcHRpb249IiIgZ2xvYmFsPSJmYWxzZSIgZ3VpZD0iXzVIT1ZrZEJWRWR5ZmFMYUpZdlc0UWciIG5hbWU9IkNvbnRlbnQiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iIiBzdXBwcmVzc2VkPSJmYWxzZSI+Ci08Q29udGVudFBhY2thZ2UgYnJpZWZEZXNjcmlwdGlvbj0iIiBnbG9iYWw9ImZhbHNlIiBndWlkPSJfNUhPVmt0QlZFZHlmYUxhSll2VzRRZyIgbmFtZT0iQ2F0ZWdvcmllcyIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSIiIHN1cHByZXNzZWQ9ImZhbHNlIj4KLTxDb250ZW50UGFja2FnZSBicmllZkRlc2NyaXB0aW9uPSIiIGdsb2JhbD0iZmFsc2UiIGd1aWQ9Il81SE9WazlCVkVkeWZhTGFKWXZXNFFnIiBuYW1lPSJEb21haW5zIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IiIgc3VwcHJlc3NlZD0iZmFsc2UiPgotPC9Db250ZW50UGFja2FnZT4KLTxDb250ZW50UGFja2FnZSBicmllZkRlc2NyaXB0aW9uPSIiIGdsb2JhbD0iZmFsc2UiIGd1aWQ9Il81SE9WbE5CVkVkeWZhTGFKWXZXNFFnIiBuYW1lPSJEaXNjaXBsaW5lcyIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSIiIHN1cHByZXNzZWQ9ImZhbHNlIj4KLTwvQ29udGVudFBhY2thZ2U+Ci08Q29udGVudFBhY2thZ2UgYnJpZWZEZXNjcmlwdGlvbj0iIiBnbG9iYWw9ImZhbHNlIiBndWlkPSJfNUhPVmxkQlZFZHlmYUxhSll2VzRRZyIgbmFtZT0iUm9sZVNldHMiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iIiBzdXBwcmVzc2VkPSJmYWxzZSI+Ci08L0NvbnRlbnRQYWNrYWdlPgotPENvbnRlbnRQYWNrYWdlIGJyaWVmRGVzY3JpcHRpb249IiIgZ2xvYmFsPSJmYWxzZSIgZ3VpZD0iXzVIT1ZsdEJWRWR5ZmFMYUpZdlc0UWciIG5hbWU9IldQIFR5cGVzIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IiIgc3VwcHJlc3NlZD0iZmFsc2UiPgotPC9Db250ZW50UGFja2FnZT4KLTxDb250ZW50UGFja2FnZSBicmllZkRlc2NyaXB0aW9uPSIiIGdsb2JhbD0iZmFsc2UiIGd1aWQ9Il81SE9WbDlCVkVkeWZhTGFKWXZXNFFnIiBuYW1lPSJUb29scyIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSIiIHN1cHByZXNzZWQ9ImZhbHNlIj4KLTwvQ29udGVudFBhY2thZ2U+Ci08Q29udGVudFBhY2thZ2UgYnJpZWZEZXNjcmlwdGlvbj0iIiBnbG9iYWw9ImZhbHNlIiBndWlkPSJfNUhPVm1OQlZFZHlmYUxhSll2VzRRZyIgbmFtZT0iU3RhbmRhcmRDYXRlZ29yaWVzIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IiIgc3VwcHJlc3NlZD0iZmFsc2UiPgotPC9Db250ZW50UGFja2FnZT4KLTxDb250ZW50UGFja2FnZSBicmllZkRlc2NyaXB0aW9uPSIiIGdsb2JhbD0iZmFsc2UiIGd1aWQ9Il81SE9WbWRCVkVkeWZhTGFKWXZXNFFnIiBuYW1lPSJDdXN0b21DYXRlZ29yaWVzIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IiIgc3VwcHJlc3NlZD0iZmFsc2UiPgotPENvbnRlbnRQYWNrYWdlIGJyaWVmRGVzY3JpcHRpb249IiIgZ2xvYmFsPSJmYWxzZSIgZ3VpZD0iXzVIT1ZtdEJWRWR5ZmFMYUpZdlc0UWciIG5hbWU9IkhpZGRlbiIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSIiIHN1cHByZXNzZWQ9ImZhbHNlIj4KLTxDdXN0b21DYXRlZ29yeSBicmllZkRlc2NyaXB0aW9uPSIiIGd1aWQ9Il81SE9WbTlCVkVkeWZhTGFKWXZXNFFnIiBpc0Fic3RyYWN0PSJmYWxzZSIgbmFtZT0iQ3VzdG9tIENhdGVnb3JpZXMiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08Q29udGVudERlc2NyaXB0aW9uIGF1dGhvcnM9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiBleHRlcm5hbElkPSIiIGd1aWQ9Ii02SF9jRFFNX1FBYnpHNnlmUElKeFZBIiBrZXlDb25zaWRlcmF0aW9ucz0iIiBtYWluRGVzY3JpcHRpb249IiIgbmFtZT0iQ3VzdG9tIENhdGVnb3JpZXMsXzVIT1ZtOUJWRWR5ZmFMYUpZdlc0UWciIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgdmVyc2lvbj0iIj4KLTwvQ29udGVudERlc2NyaXB0aW9uPgotPC9DdXN0b21DYXRlZ29yeT4KLTwvQ29udGVudFBhY2thZ2U+Ci08L0NvbnRlbnRQYWNrYWdlPgotPC9Db250ZW50UGFja2FnZT4KLTxDb250ZW50UGFja2FnZSBicmllZkRlc2NyaXB0aW9uPSIiIGdsb2JhbD0iZmFsc2UiIGd1aWQ9Il81SE9Wbk5CVkVkeWZhTGFKWXZXNFFnIiBuYW1lPSJDb3JlQ29udGVudCIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSIiIHN1cHByZXNzZWQ9ImZhbHNlIj4KLTwvQ29udGVudFBhY2thZ2U+Ci08UHJvY2Vzc1BhY2thZ2UgYnJpZWZEZXNjcmlwdGlvbj0iIiBnbG9iYWw9ImZhbHNlIiBndWlkPSJfNUhPVm5kQlZFZHlmYUxhSll2VzRRZyIgbmFtZT0iQ2FwYWJpbGl0eVBhdHRlcm5zIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IiIgc3VwcHJlc3NlZD0iZmFsc2UiPgotPC9Qcm9jZXNzUGFja2FnZT4KLTwvQ29udGVudFBhY2thZ2U+Ci08UHJvY2Vzc1BhY2thZ2UgYnJpZWZEZXNjcmlwdGlvbj0iIiBnbG9iYWw9ImZhbHNlIiBndWlkPSJfNUhPVm50QlZFZHlmYUxhSll2VzRRZyIgbmFtZT0iRGVsaXZlcnlQcm9jZXNzZXMiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iIiBzdXBwcmVzc2VkPSJmYWxzZSI+Ci08L1Byb2Nlc3NQYWNrYWdlPgotPFByb2Nlc3NQYWNrYWdlIGJyaWVmRGVzY3JpcHRpb249IiIgZ2xvYmFsPSJmYWxzZSIgZ3VpZD0iXzVIT1ZuOUJWRWR5ZmFMYUpZdlc0UWciIG5hbWU9IlByb2Nlc3NDb250cmlidXRpb25zIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IiIgc3VwcHJlc3NlZD0iZmFsc2UiPgotPC9Qcm9jZXNzUGFja2FnZT4KLTwvTWV0aG9kUGx1Z2luPgotPE1ldGhvZFBsdWdpbiBhdXRob3JzPSJSTUMgdGVhbSBtZW1iZXIgQSIgYnJpZWZEZXNjcmlwdGlvbj0iQnJpZWYgZGVzY2lwdGlvbiBvZiBQbHVnX0EiIGNoYW5nZURlc2NyaXB0aW9uPSIiIGd1aWQ9Il81TzlWUWRCVkVkeWZhTGFKWXZXNFFnIiBuYW1lPSJQbHVnX0EiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgdXNlckNoYW5nZWFibGU9InRydWUiIHZlcnNpb249IiI+Ci08Q29udGVudFBhY2thZ2UgYnJpZWZEZXNjcmlwdGlvbj0iIiBnbG9iYWw9ImZhbHNlIiBndWlkPSJfNU85VlF0QlZFZHlmYUxhSll2VzRRZyIgbmFtZT0iQ29udGVudCIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSIiIHN1cHByZXNzZWQ9ImZhbHNlIj4KLTxDb250ZW50UGFja2FnZSBicmllZkRlc2NyaXB0aW9uPSIiIGdsb2JhbD0iZmFsc2UiIGd1aWQ9Il81TzlWUTlCVkVkeWZhTGFKWXZXNFFnIiBuYW1lPSJDYXRlZ29yaWVzIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IiIgc3VwcHJlc3NlZD0iZmFsc2UiPgotPENvbnRlbnRQYWNrYWdlIGJyaWVmRGVzY3JpcHRpb249IiIgZ2xvYmFsPSJmYWxzZSIgZ3VpZD0iXzVPOVZSTkJWRWR5ZmFMYUpZdlc0UWciIG5hbWU9IkRvbWFpbnMiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iIiBzdXBwcmVzc2VkPSJmYWxzZSI+Ci08L0NvbnRlbnRQYWNrYWdlPgotPENvbnRlbnRQYWNrYWdlIGJyaWVmRGVzY3JpcHRpb249IiIgZ2xvYmFsPSJmYWxzZSIgZ3VpZD0iXzVPOVZSZEJWRWR5ZmFMYUpZdlc0UWciIG5hbWU9IkRpc2NpcGxpbmVzIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IiIgc3VwcHJlc3NlZD0iZmFsc2UiPgotPC9Db250ZW50UGFja2FnZT4KLTxDb250ZW50UGFja2FnZSBicmllZkRlc2NyaXB0aW9uPSIiIGdsb2JhbD0iZmFsc2UiIGd1aWQ9Il81TzlWUnRCVkVkeWZhTGFKWXZXNFFnIiBuYW1lPSJSb2xlU2V0cyIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSIiIHN1cHByZXNzZWQ9ImZhbHNlIj4KLTwvQ29udGVudFBhY2thZ2U+Ci08Q29udGVudFBhY2thZ2UgYnJpZWZEZXNjcmlwdGlvbj0iIiBnbG9iYWw9ImZhbHNlIiBndWlkPSJfNU85VlI5QlZFZHlmYUxhSll2VzRRZyIgbmFtZT0iV1AgVHlwZXMiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iIiBzdXBwcmVzc2VkPSJmYWxzZSI+Ci08L0NvbnRlbnRQYWNrYWdlPgotPENvbnRlbnRQYWNrYWdlIGJyaWVmRGVzY3JpcHRpb249IiIgZ2xvYmFsPSJmYWxzZSIgZ3VpZD0iXzVPOVZTTkJWRWR5ZmFMYUpZdlc0UWciIG5hbWU9IlRvb2xzIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IiIgc3VwcHJlc3NlZD0iZmFsc2UiPgotPC9Db250ZW50UGFja2FnZT4KLTxDb250ZW50UGFja2FnZSBicmllZkRlc2NyaXB0aW9uPSIiIGdsb2JhbD0iZmFsc2UiIGd1aWQ9Il81TzlWU2RCVkVkeWZhTGFKWXZXNFFnIiBuYW1lPSJTdGFuZGFyZENhdGVnb3JpZXMiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iIiBzdXBwcmVzc2VkPSJmYWxzZSI+Ci08L0NvbnRlbnRQYWNrYWdlPgotPENvbnRlbnRQYWNrYWdlIGJyaWVmRGVzY3JpcHRpb249IiIgZ2xvYmFsPSJmYWxzZSIgZ3VpZD0iXzVPOVZTdEJWRWR5ZmFMYUpZdlc0UWciIG5hbWU9IkN1c3RvbUNhdGVnb3JpZXMiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iIiBzdXBwcmVzc2VkPSJmYWxzZSI+Ci08Q29udGVudFBhY2thZ2UgYnJpZWZEZXNjcmlwdGlvbj0iIiBnbG9iYWw9ImZhbHNlIiBndWlkPSJfNU85VlM5QlZFZHlmYUxhSll2VzRRZyIgbmFtZT0iSGlkZGVuIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IiIgc3VwcHJlc3NlZD0iZmFsc2UiPgotPEN1c3RvbUNhdGVnb3J5IGJyaWVmRGVzY3JpcHRpb249IiIgZ3VpZD0iXzVPOVZUTkJWRWR5ZmFMYUpZdlc0UWciIGlzQWJzdHJhY3Q9ImZhbHNlIiBuYW1lPSJDdXN0b20gQ2F0ZWdvcmllcyIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiB2YXJpYWJpbGl0eVR5cGU9Im5hIj4KLTxDb250ZW50RGVzY3JpcHRpb24gYXV0aG9ycz0iIiBicmllZkRlc2NyaXB0aW9uPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIGV4dGVybmFsSWQ9IiIgZ3VpZD0iLWFaQlNQcGFrVUluclc1MHF0R2pIa1EiIGtleUNvbnNpZGVyYXRpb25zPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBuYW1lPSJDdXN0b20gQ2F0ZWdvcmllcyxfNU85VlROQlZFZHlmYUxhSll2VzRRZyIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiB2ZXJzaW9uPSIiPgotPC9Db250ZW50RGVzY3JpcHRpb24+Ci08L0N1c3RvbUNhdGVnb3J5PgotPC9Db250ZW50UGFja2FnZT4KLTwvQ29udGVudFBhY2thZ2U+Ci08L0NvbnRlbnRQYWNrYWdlPgotPENvbnRlbnRQYWNrYWdlIGJyaWVmRGVzY3JpcHRpb249IiIgZ2xvYmFsPSJmYWxzZSIgZ3VpZD0iXzVPOVZUZEJWRWR5ZmFMYUpZdlc0UWciIG5hbWU9IkNvcmVDb250ZW50IiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IiIgc3VwcHJlc3NlZD0iZmFsc2UiPgotPENvbnRlbnRQYWNrYWdlIGJyaWVmRGVzY3JpcHRpb249IiIgZ2xvYmFsPSJmYWxzZSIgZ3VpZD0iXzVUY3pzTkJWRWR5ZmFMYUpZdlc0UWciIG5hbWU9IkNvbnRlbnRQYWNrYWdlXzEiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iIiBzdXBwcmVzc2VkPSJmYWxzZSI+Ci08Um9sZSBicmllZkRlc2NyaXB0aW9uPSJUaGlzIGlzIGEgYnJpZWYgZHNlc2NyaXB0aW9uIG9mIFJvbGUgMSIgZ3VpZD0iXzVUcEE4TkJWRWR5ZmFMYUpZdlc0UWciIGlzQWJzdHJhY3Q9ImZhbHNlIiBuYW1lPSJyb2xlXzEiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iUm9sZSAxIiBzdXBwcmVzc2VkPSJmYWxzZSIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08Um9sZURlc2NyaXB0aW9uIGFzc2lnbm1lbnRBcHByb2FjaGVzPSIiIGF1dGhvcnM9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBjaGFuZ2VEYXRlPSJUaHUgSmFuIDMxIDE1OjQwOjI1IFBTVCAyMDA4IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiBleHRlcm5hbElkPSIiIGd1aWQ9Ii15WlBfcTlSLUhZUjNpX2doQ3JOSWdBIiBrZXlDb25zaWRlcmF0aW9ucz0iIiBtYWluRGVzY3JpcHRpb249IlRoaXMgaXMgdGhlIG1haW4gZGVzY3JpcHRpb24gb2YgUm9sZSAxIiBuYW1lPSJyb2xlXzEsXzVUcEE4TkJWRWR5ZmFMYUpZdlc0UWciIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iIiBza2lsbHM9IiIgc3VwcHJlc3NlZD0iZmFsc2UiIHN5bm9ueW1zPSIiIHZlcnNpb249IiI+Ci08L1JvbGVEZXNjcmlwdGlvbj4KLTwvUm9sZT4KLTwvQ29udGVudFBhY2thZ2U+Ci08L0NvbnRlbnRQYWNrYWdlPgotPFByb2Nlc3NQYWNrYWdlIGJyaWVmRGVzY3JpcHRpb249IiIgZ2xvYmFsPSJmYWxzZSIgZ3VpZD0iXzVPOVZUdEJWRWR5ZmFMYUpZdlc0UWciIG5hbWU9IkNhcGFiaWxpdHlQYXR0ZXJucyIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSIiIHN1cHByZXNzZWQ9ImZhbHNlIj4KLTwvUHJvY2Vzc1BhY2thZ2U+Ci08L0NvbnRlbnRQYWNrYWdlPgotPFByb2Nlc3NQYWNrYWdlIGJyaWVmRGVzY3JpcHRpb249IiIgZ2xvYmFsPSJmYWxzZSIgZ3VpZD0iXzVPOVZUOUJWRWR5ZmFMYUpZdlc0UWciIG5hbWU9IkRlbGl2ZXJ5UHJvY2Vzc2VzIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IiIgc3VwcHJlc3NlZD0iZmFsc2UiPgotPC9Qcm9jZXNzUGFja2FnZT4KLTxQcm9jZXNzUGFja2FnZSBicmllZkRlc2NyaXB0aW9uPSIiIGdsb2JhbD0iZmFsc2UiIGd1aWQ9Il81TzlWVU5CVkVkeWZhTGFKWXZXNFFnIiBuYW1lPSJQcm9jZXNzQ29udHJpYnV0aW9ucyIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSIiIHN1cHByZXNzZWQ9ImZhbHNlIj4KLTwvUHJvY2Vzc1BhY2thZ2U+Ci08L01ldGhvZFBsdWdpbj4KLTxNZXRob2RQbHVnaW4gYXV0aG9ycz0iUk1DIHRlYW0gbWVtYmVyIEIiIGJyaWVmRGVzY3JpcHRpb249IkJyaWVmIGRlc2NpcHRpb24gb2YgUGx1Z19CIiBjaGFuZ2VEYXRlPSJUaHUgSmFuIDMxIDE1OjQwOjI0IFBTVCAyMDA4IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiBndWlkPSJfNVBWdndOQlZFZHlmYUxhSll2VzRRZyIgbmFtZT0iUGx1Z19CIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IiIgc3VwcHJlc3NlZD0iZmFsc2UiIHVzZXJDaGFuZ2VhYmxlPSJ0cnVlIiB2ZXJzaW9uPSIiPgotPENvbnRlbnRQYWNrYWdlIGJyaWVmRGVzY3JpcHRpb249IiIgZ2xvYmFsPSJmYWxzZSIgZ3VpZD0iXzVQVnZ3ZEJWRWR5ZmFMYUpZdlc0UWciIG5hbWU9IkNvbnRlbnQiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iIiBzdXBwcmVzc2VkPSJmYWxzZSI+Ci08Q29udGVudFBhY2thZ2UgYnJpZWZEZXNjcmlwdGlvbj0iIiBnbG9iYWw9ImZhbHNlIiBndWlkPSJfNVBWdnd0QlZFZHlmYUxhSll2VzRRZyIgbmFtZT0iQ2F0ZWdvcmllcyIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSIiIHN1cHByZXNzZWQ9ImZhbHNlIj4KLTxDb250ZW50UGFja2FnZSBicmllZkRlc2NyaXB0aW9uPSIiIGdsb2JhbD0iZmFsc2UiIGd1aWQ9Il81UFZ2dzlCVkVkeWZhTGFKWXZXNFFnIiBuYW1lPSJEb21haW5zIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IiIgc3VwcHJlc3NlZD0iZmFsc2UiPgotPC9Db250ZW50UGFja2FnZT4KLTxDb250ZW50UGFja2FnZSBicmllZkRlc2NyaXB0aW9uPSIiIGdsb2JhbD0iZmFsc2UiIGd1aWQ9Il81UFZ2eE5CVkVkeWZhTGFKWXZXNFFnIiBuYW1lPSJEaXNjaXBsaW5lcyIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSIiIHN1cHByZXNzZWQ9ImZhbHNlIj4KLTwvQ29udGVudFBhY2thZ2U+Ci08Q29udGVudFBhY2thZ2UgYnJpZWZEZXNjcmlwdGlvbj0iIiBnbG9iYWw9ImZhbHNlIiBndWlkPSJfNVBWdnhkQlZFZHlmYUxhSll2VzRRZyIgbmFtZT0iUm9sZVNldHMiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iIiBzdXBwcmVzc2VkPSJmYWxzZSI+Ci08L0NvbnRlbnRQYWNrYWdlPgotPENvbnRlbnRQYWNrYWdlIGJyaWVmRGVzY3JpcHRpb249IiIgZ2xvYmFsPSJmYWxzZSIgZ3VpZD0iXzVQVnZ4dEJWRWR5ZmFMYUpZdlc0UWciIG5hbWU9IldQIFR5cGVzIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IiIgc3VwcHJlc3NlZD0iZmFsc2UiPgotPC9Db250ZW50UGFja2FnZT4KLTxDb250ZW50UGFja2FnZSBicmllZkRlc2NyaXB0aW9uPSIiIGdsb2JhbD0iZmFsc2UiIGd1aWQ9Il81UFZ2eDlCVkVkeWZhTGFKWXZXNFFnIiBuYW1lPSJUb29scyIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSIiIHN1cHByZXNzZWQ9ImZhbHNlIj4KLTwvQ29udGVudFBhY2thZ2U+Ci08Q29udGVudFBhY2thZ2UgYnJpZWZEZXNjcmlwdGlvbj0iIiBnbG9iYWw9ImZhbHNlIiBndWlkPSJfNVBWdnlOQlZFZHlmYUxhSll2VzRRZyIgbmFtZT0iU3RhbmRhcmRDYXRlZ29yaWVzIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IiIgc3VwcHJlc3NlZD0iZmFsc2UiPgotPC9Db250ZW50UGFja2FnZT4KLTxDb250ZW50UGFja2FnZSBicmllZkRlc2NyaXB0aW9uPSIiIGdsb2JhbD0iZmFsc2UiIGd1aWQ9Il81UFZ2eWRCVkVkeWZhTGFKWXZXNFFnIiBuYW1lPSJDdXN0b21DYXRlZ29yaWVzIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IiIgc3VwcHJlc3NlZD0iZmFsc2UiPgotPENvbnRlbnRQYWNrYWdlIGJyaWVmRGVzY3JpcHRpb249IiIgZ2xvYmFsPSJmYWxzZSIgZ3VpZD0iXzVQVnZ5dEJWRWR5ZmFMYUpZdlc0UWciIG5hbWU9IkhpZGRlbiIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSIiIHN1cHByZXNzZWQ9ImZhbHNlIj4KLTxDdXN0b21DYXRlZ29yeSBicmllZkRlc2NyaXB0aW9uPSIiIGd1aWQ9Il81UFZ2eTlCVkVkeWZhTGFKWXZXNFFnIiBpc0Fic3RyYWN0PSJmYWxzZSIgbmFtZT0iQ3VzdG9tIENhdGVnb3JpZXMiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08Q29udGVudERlc2NyaXB0aW9uIGF1dGhvcnM9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiBleHRlcm5hbElkPSIiIGd1aWQ9Ii1xc1FKLS1ySk9hVklhOVBjNm1kNmpBIiBrZXlDb25zaWRlcmF0aW9ucz0iIiBtYWluRGVzY3JpcHRpb249IiIgbmFtZT0iQ3VzdG9tIENhdGVnb3JpZXMsXzVQVnZ5OUJWRWR5ZmFMYUpZdlc0UWciIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgdmVyc2lvbj0iIj4KLTwvQ29udGVudERlc2NyaXB0aW9uPgotPC9DdXN0b21DYXRlZ29yeT4KLTwvQ29udGVudFBhY2thZ2U+Ci08L0NvbnRlbnRQYWNrYWdlPgotPC9Db250ZW50UGFja2FnZT4KLTxDb250ZW50UGFja2FnZSBicmllZkRlc2NyaXB0aW9uPSIiIGdsb2JhbD0iZmFsc2UiIGd1aWQ9Il81UFZ2ek5CVkVkeWZhTGFKWXZXNFFnIiBuYW1lPSJDb3JlQ29udGVudCIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSIiIHN1cHByZXNzZWQ9ImZhbHNlIj4KLTwvQ29udGVudFBhY2thZ2U+Ci08UHJvY2Vzc1BhY2thZ2UgYnJpZWZEZXNjcmlwdGlvbj0iIiBnbG9iYWw9ImZhbHNlIiBndWlkPSJfNVBWdnpkQlZFZHlmYUxhSll2VzRRZyIgbmFtZT0iQ2FwYWJpbGl0eVBhdHRlcm5zIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IiIgc3VwcHJlc3NlZD0iZmFsc2UiPgotPC9Qcm9jZXNzUGFja2FnZT4KLTwvQ29udGVudFBhY2thZ2U+Ci08UHJvY2Vzc1BhY2thZ2UgYnJpZWZEZXNjcmlwdGlvbj0iIiBnbG9iYWw9ImZhbHNlIiBndWlkPSJfNVBWdnp0QlZFZHlmYUxhSll2VzRRZyIgbmFtZT0iRGVsaXZlcnlQcm9jZXNzZXMiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iIiBzdXBwcmVzc2VkPSJmYWxzZSI+Ci08L1Byb2Nlc3NQYWNrYWdlPgotPFByb2Nlc3NQYWNrYWdlIGJyaWVmRGVzY3JpcHRpb249IiIgZ2xvYmFsPSJmYWxzZSIgZ3VpZD0iXzVQVnZ6OUJWRWR5ZmFMYUpZdlc0UWciIG5hbWU9IlByb2Nlc3NDb250cmlidXRpb25zIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IiIgc3VwcHJlc3NlZD0iZmFsc2UiPgotPC9Qcm9jZXNzUGFja2FnZT4KLTxiYXNlcyBwYXRoPSJQbHVnX0EiPgotPC9iYXNlcz4KLTwvTWV0aG9kUGx1Z2luPgotPE1ldGhvZENvbmZpZ3VyYXRpb24gYXV0aG9ycz0iIiBicmllZkRlc2NyaXB0aW9uPSIiIGNoYW5nZURhdGU9IlRodSBKYW4gMzEgMTU6NDA6MjQgUFNUIDIwMDgiIGNoYW5nZURlc2NyaXB0aW9uPSIiIGd1aWQ9Il81T2UwSU5CVkVkeWZhTGFKWXZXNFFnIiBuYW1lPSJDb25maWdfVGVzdCIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiB2ZXJzaW9uPSIiPgotPC9NZXRob2RDb25maWd1cmF0aW9uPgotPE1ldGhvZENvbmZpZ3VyYXRpb24gYXV0aG9ycz0iIiBicmllZkRlc2NyaXB0aW9uPSJCcmllZiBkZXNjaXB0aW9uIG9mIENvbmZpZ19BIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiBndWlkPSJfNVAwUTROQlZFZHlmYUxhSll2VzRRZyIgbmFtZT0iQ29uZmlnX0EiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgdmVyc2lvbj0iIj4KLTwvTWV0aG9kQ29uZmlndXJhdGlvbj4KLTwvTWV0aG9kTGlicmFyeT4KLTxNZXRob2RQbHVnaW4gYXV0aG9ycz0iUk1DIHRlYW0gbWVtYmVyIEEiIGJyaWVmRGVzY3JpcHRpb249IkJyaWVmIGRlc2NpcHRpb24gb2YgUGx1Z19BIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiBndWlkPSJfNU85VlFkQlZFZHlmYUxhSll2VzRRZyIgbmFtZT0iUGx1Z19BIiBvcmRlcmluZ0d1aWRlPSIiIHBhdGg9IlBsdWdfQSIgcHJlc2VudGF0aW9uTmFtZT0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgdXNlckNoYW5nZWFibGU9InRydWUiIHZlcnNpb249IiI+Ci08Q29udGVudFBhY2thZ2UgYnJpZWZEZXNjcmlwdGlvbj0iIiBnbG9iYWw9ImZhbHNlIiBndWlkPSJfNU85VlF0QlZFZHlmYUxhSll2VzRRZyIgbmFtZT0iQ29udGVudCIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSIiIHN1cHByZXNzZWQ9ImZhbHNlIj4KLTwvQ29udGVudFBhY2thZ2U+Ci08UHJvY2Vzc1BhY2thZ2UgYnJpZWZEZXNjcmlwdGlvbj0iIiBnbG9iYWw9ImZhbHNlIiBndWlkPSJfNU85VlQ5QlZFZHlmYUxhSll2VzRRZyIgbmFtZT0iRGVsaXZlcnlQcm9jZXNzZXMiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iIiBzdXBwcmVzc2VkPSJmYWxzZSI+Ci08L1Byb2Nlc3NQYWNrYWdlPgotPFByb2Nlc3NQYWNrYWdlIGJyaWVmRGVzY3JpcHRpb249IiIgZ2xvYmFsPSJmYWxzZSIgZ3VpZD0iXzVPOVZVTkJWRWR5ZmFMYUpZdlc0UWciIG5hbWU9IlByb2Nlc3NDb250cmlidXRpb25zIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IiIgc3VwcHJlc3NlZD0iZmFsc2UiPgotPC9Qcm9jZXNzUGFja2FnZT4KLTwvTWV0aG9kUGx1Z2luPgotPE1ldGhvZENvbmZpZ3VyYXRpb24gYXV0aG9ycz0iIiBicmllZkRlc2NyaXB0aW9uPSJCcmllZiBkZXNjaXB0aW9uIG9mIENvbmZpZ19BIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiBndWlkPSJfNVAwUTROQlZFZHlmYUxhSll2VzRRZyIgbmFtZT0iQ29uZmlnX0EiIG9yZGVyaW5nR3VpZGU9IiIgcGF0aD0iQ29uZmlnX0EiIHByZXNlbnRhdGlvbk5hbWU9IiIgc3VwcHJlc3NlZD0iZmFsc2UiIHZlcnNpb249IiI+Ci08L01ldGhvZENvbmZpZ3VyYXRpb24+Ci08L1Rlc3Rlck91dHB1dD4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvVGVzdENvbW1hbmRzL25ld01ldGhvZFBsdWdpbi9uZXdNZXRob2RQbHVnaW4udGMgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL1Rlc3RDb21tYW5kcy9uZXdNZXRob2RQbHVnaW4vbmV3TWV0aG9kUGx1Z2luLnRjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMmVjMTA1Li4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvVGVzdENvbW1hbmRzL25ld01ldGhvZFBsdWdpbi9uZXdNZXRob2RQbHVnaW4udGMKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPE1ldGhvZExpYnJhcnlUZXN0IGRpc2FibGU9ImZhbHNlIj4KLQkKLQk8T3BlbkxpYnJhcnkgbGliRm9sZGVyTmFtZT0ibmV3TGliIj4KLQk8L09wZW5MaWJyYXJ5PgotCQotCTxOZXdNZXRob2RQbHVnaW4gCi0JCW5hbWU9Ik15IDFzdCBwbHVnaW4iCi0JCWJyaWVmRGVzY3JpcHRpb249IkJyaWVmIGRlc2NpcHRpb24gYWJveXQgdGhlIDFzdCBwbHVnaW4iCi0JCWF1dGhvcnM9Im5hbWUgMSwgbmFtZTIsIG5hbWUzIGV0YyIJCi0JCT4JCi0JPC9OZXdNZXRob2RQbHVnaW4+Ci0JCi0JPE5ld01ldGhvZFBsdWdpbiBkaXNhYmxlPSJmYWxzZSIKLQkJbmFtZT0iTXkgMm5kIHBsdWdpbiIKLQkJYnJpZWZEZXNjcmlwdGlvbj0iQnJpZWYgZGVzY2lwdGlvbiBhYm95dCB0aGUgMm5kIHBsdWdpbiIKLQkJYXV0aG9ycz0ibmFtZSAxMSwgbmFtZTIyLCBuYW1lMzMgZXRjIgkKLQkJPgotCQk8YmFzZXM+Ci0JCQk8VmFsdWU+TXkgMXN0IHBsdWdpbjwvVmFsdWU+Ci0JCTwvYmFzZXM+CQkJCi0JPC9OZXdNZXRob2RQbHVnaW4+Ci0JCi0JPENvcHlMaWJyYXJ5IGxpYkZvbGRlck5hbWU9Im5ld01ldGhvZFBsdWdpbiI+Ci0JPC9Db3B5TGlicmFyeT4KLQkKLQk8Q29tcGFyZVRvTGlicmFyeSAKLQkJZ29sZGVuTGliRm9sZGVyTmFtZT0ibmV3TWV0aG9kUGx1Z2luIiAKLQkJZGlmZkNvdW50PSIwIiAKLQkJZWxlbWVudENvdW50PSIzMyIKLQkJdXNlTmFtZUFzSWQ9InRydWUiCi0JCT4JCQotCTwvQ29tcGFyZVRvTGlicmFyeT4JCi08L01ldGhvZExpYnJhcnlUZXN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvVGVzdENvbW1hbmRzL25ld01ldGhvZFBsdWdpbi9uZXdNZXRob2RQbHVnaW4vTXkgMXN0IHBsdWdpbi9wbHVnaW4ueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9UZXN0Q29tbWFuZHMvbmV3TWV0aG9kUGx1Z2luL25ld01ldGhvZFBsdWdpbi9NeSAxc3QgcGx1Z2luL3BsdWdpbi54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxZGNiZmMuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9UZXN0Q29tbWFuZHMvbmV3TWV0aG9kUGx1Z2luL25ld01ldGhvZFBsdWdpbi9NeSAxc3QgcGx1Z2luL3BsdWdpbi54bWkKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHhtaTpYTUkgeG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjMvdW1hLmVjb3JlIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hLnJlc291cmNlbWFuYWdlcj0iaHR0cDovLy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Jlc291cmNlbWFuYWdlci5lY29yZSIgcm1jOnZlcnNpb249IjcuMS4wIiBlcGY6dmVyc2lvbj0iMS4wLjAiPgotICA8b3JnLmVjbGlwc2UuZXBmLnVtYS5yZXNvdXJjZW1hbmFnZXI6UmVzb3VyY2VNYW5hZ2VyIHhtaTppZD0iX2VVN05VRnUwRWR1c3FPY1VqeGNSMXciIGd1aWQ9Il9lVTdOVUZ1MEVkdXNxT2NVanhjUjF3Ii8+Ci0gIDxvcmcuZWNsaXBzZS5lcGYudW1hOk1ldGhvZFBsdWdpbiB4bWk6aWQ9Il9lVTFHc0Z1MEVkdXNxT2NVanhjUjF3IiBuYW1lPSJNeSAxc3QgcGx1Z2luIiBndWlkPSJfZVUxR3NGdTBFZHVzcU9jVWp4Y1IxdyIgYnJpZWZEZXNjcmlwdGlvbj0iQnJpZWYgZGVzY2lwdGlvbiBhYm95dCB0aGUgMXN0IHBsdWdpbiIgYXV0aG9ycz0ibmFtZSAxLCBuYW1lMiwgbmFtZTMgZXRjIj4KLSAgICA8bWV0aG9kUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iX2VVMUdzVnUwRWR1c3FPY1VqeGNSMXciIG5hbWU9IkNvbnRlbnQiIGd1aWQ9Il9lVTFHc1Z1MEVkdXNxT2NVanhjUjF3Ij4KLSAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il9lVTFHc2x1MEVkdXNxT2NVanhjUjF3IiBuYW1lPSJDYXRlZ29yaWVzIiBndWlkPSJfZVUxR3NsdTBFZHVzcU9jVWp4Y1IxdyI+Ci0gICAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il9lVTFHczF1MEVkdXNxT2NVanhjUjF3IiBuYW1lPSJEb21haW5zIiBndWlkPSJfZVUxR3MxdTBFZHVzcU9jVWp4Y1IxdyIvPgotICAgICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfZVUxR3RGdTBFZHVzcU9jVWp4Y1IxdyIgbmFtZT0iRGlzY2lwbGluZXMiIGd1aWQ9Il9lVTFHdEZ1MEVkdXNxT2NVanhjUjF3Ii8+Ci0gICAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il9lVTFHdFZ1MEVkdXNxT2NVanhjUjF3IiBuYW1lPSJSb2xlU2V0cyIgZ3VpZD0iX2VVMUd0VnUwRWR1c3FPY1VqeGNSMXciLz4KLSAgICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iX2VVMUd0bHUwRWR1c3FPY1VqeGNSMXciIG5hbWU9IldQIFR5cGVzIiBndWlkPSJfZVUxR3RsdTBFZHVzcU9jVWp4Y1IxdyIvPgotICAgICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfZVUxR3QxdTBFZHVzcU9jVWp4Y1IxdyIgbmFtZT0iVG9vbHMiIGd1aWQ9Il9lVTFHdDF1MEVkdXNxT2NVanhjUjF3Ii8+Ci0gICAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il9lVTFHdUZ1MEVkdXNxT2NVanhjUjF3IiBuYW1lPSJTdGFuZGFyZENhdGVnb3JpZXMiIGd1aWQ9Il9lVTFHdUZ1MEVkdXNxT2NVanhjUjF3Ii8+Ci0gICAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il9lVTFHdVZ1MEVkdXNxT2NVanhjUjF3IiBuYW1lPSJDdXN0b21DYXRlZ29yaWVzIiBndWlkPSJfZVUxR3VWdTBFZHVzcU9jVWp4Y1IxdyI+Ci0gICAgICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iX2VVMUd1bHUwRWR1c3FPY1VqeGNSMXciIG5hbWU9IkhpZGRlbiIgZ3VpZD0iX2VVMUd1bHUwRWR1c3FPY1VqeGNSMXciPgotICAgICAgICAgICAgPGNvbnRlbnRFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDdXN0b21DYXRlZ29yeSIgeG1pOmlkPSJfZVUxR3UxdTBFZHVzcU9jVWp4Y1IxdyIgbmFtZT0iQ3VzdG9tIENhdGVnb3JpZXMiIGd1aWQ9Il9lVTFHdTF1MEVkdXNxT2NVanhjUjF3Ii8+Ci0gICAgICAgICAgPC9jaGlsZFBhY2thZ2VzPgotICAgICAgICA8L2NoaWxkUGFja2FnZXM+Ci0gICAgICA8L2NoaWxkUGFja2FnZXM+Ci0gICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfZVUxR3ZGdTBFZHVzcU9jVWp4Y1IxdyIgbmFtZT0iQ29yZUNvbnRlbnQiIGd1aWQ9Il9lVTFHdkZ1MEVkdXNxT2NVanhjUjF3Ii8+Ci0gICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzUGFja2FnZSIgeG1pOmlkPSJfZVUxR3ZWdTBFZHVzcU9jVWp4Y1IxdyIgbmFtZT0iQ2FwYWJpbGl0eVBhdHRlcm5zIiBndWlkPSJfZVUxR3ZWdTBFZHVzcU9jVWp4Y1IxdyIvPgotICAgIDwvbWV0aG9kUGFja2FnZXM+Ci0gICAgPG1ldGhvZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NQYWNrYWdlIiB4bWk6aWQ9Il9lVTFHdmx1MEVkdXNxT2NVanhjUjF3IiBuYW1lPSJEZWxpdmVyeVByb2Nlc3NlcyIgZ3VpZD0iX2VVMUd2bHUwRWR1c3FPY1VqeGNSMXciLz4KLSAgICA8bWV0aG9kUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc1BhY2thZ2UiIHhtaTppZD0iX2VVMUd2MXUwRWR1c3FPY1VqeGNSMXciIG5hbWU9IlByb2Nlc3NDb250cmlidXRpb25zIiBndWlkPSJfZVUxR3YxdTBFZHVzcU9jVWp4Y1IxdyIvPgotICA8L29yZy5lY2xpcHNlLmVwZi51bWE6TWV0aG9kUGx1Z2luPgotPC94bWk6WE1JPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9UZXN0Q29tbWFuZHMvbmV3TWV0aG9kUGx1Z2luL25ld01ldGhvZFBsdWdpbi9NeSAybmQgcGx1Z2luL3BsdWdpbi54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL1Rlc3RDb21tYW5kcy9uZXdNZXRob2RQbHVnaW4vbmV3TWV0aG9kUGx1Z2luL015IDJuZCBwbHVnaW4vcGx1Z2luLnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGNlMDVhZi4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL1Rlc3RDb21tYW5kcy9uZXdNZXRob2RQbHVnaW4vbmV3TWV0aG9kUGx1Z2luL015IDJuZCBwbHVnaW4vcGx1Z2luLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08eG1pOlhNSSB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuMy91bWEuZWNvcmUiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWEucmVzb3VyY2VtYW5hZ2VyPSJodHRwOi8vL29yZy9lY2xpcHNlL2VwZi91bWEvcmVzb3VyY2VtYW5hZ2VyLmVjb3JlIiBybWM6dmVyc2lvbj0iNy4xLjAiIGVwZjp2ZXJzaW9uPSIxLjAuMCI+Ci0gIDxvcmcuZWNsaXBzZS5lcGYudW1hLnJlc291cmNlbWFuYWdlcjpSZXNvdXJjZU1hbmFnZXIgeG1pOmlkPSJfZVZOaE1GdTBFZHVzcU9jVWp4Y1IxdyIgZ3VpZD0iX2VWTmhNRnUwRWR1c3FPY1VqeGNSMXciLz4KLSAgPG9yZy5lY2xpcHNlLmVwZi51bWE6TWV0aG9kUGx1Z2luIHhtaTppZD0iX2VWSGFrRnUwRWR1c3FPY1VqeGNSMXciIG5hbWU9Ik15IDJuZCBwbHVnaW4iIGd1aWQ9Il9lVkhha0Z1MEVkdXNxT2NVanhjUjF3IiBicmllZkRlc2NyaXB0aW9uPSJCcmllZiBkZXNjaXB0aW9uIGFib3l0IHRoZSAybmQgcGx1Z2luIiBhdXRob3JzPSJuYW1lIDExLCBuYW1lMjIsIG5hbWUzMyBldGMiPgotICAgIDxtZXRob2RQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfZVZIYWtWdTBFZHVzcU9jVWp4Y1IxdyIgbmFtZT0iQ29udGVudCIgZ3VpZD0iX2VWSGFrVnUwRWR1c3FPY1VqeGNSMXciPgotICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iX2VWSGFrbHUwRWR1c3FPY1VqeGNSMXciIG5hbWU9IkNhdGVnb3JpZXMiIGd1aWQ9Il9lVkhha2x1MEVkdXNxT2NVanhjUjF3Ij4KLSAgICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iX2VWSGFrMXUwRWR1c3FPY1VqeGNSMXciIG5hbWU9IkRvbWFpbnMiIGd1aWQ9Il9lVkhhazF1MEVkdXNxT2NVanhjUjF3Ii8+Ci0gICAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il9lVkhhbEZ1MEVkdXNxT2NVanhjUjF3IiBuYW1lPSJEaXNjaXBsaW5lcyIgZ3VpZD0iX2VWSGFsRnUwRWR1c3FPY1VqeGNSMXciLz4KLSAgICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iX2VWSGFsVnUwRWR1c3FPY1VqeGNSMXciIG5hbWU9IlJvbGVTZXRzIiBndWlkPSJfZVZIYWxWdTBFZHVzcU9jVWp4Y1IxdyIvPgotICAgICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfZVZIYWxsdTBFZHVzcU9jVWp4Y1IxdyIgbmFtZT0iV1AgVHlwZXMiIGd1aWQ9Il9lVkhhbGx1MEVkdXNxT2NVanhjUjF3Ii8+Ci0gICAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il9lVkhhbDF1MEVkdXNxT2NVanhjUjF3IiBuYW1lPSJUb29scyIgZ3VpZD0iX2VWSGFsMXUwRWR1c3FPY1VqeGNSMXciLz4KLSAgICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iX2VWSGFtRnUwRWR1c3FPY1VqeGNSMXciIG5hbWU9IlN0YW5kYXJkQ2F0ZWdvcmllcyIgZ3VpZD0iX2VWSGFtRnUwRWR1c3FPY1VqeGNSMXciLz4KLSAgICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iX2VWSGFtVnUwRWR1c3FPY1VqeGNSMXciIG5hbWU9IkN1c3RvbUNhdGVnb3JpZXMiIGd1aWQ9Il9lVkhhbVZ1MEVkdXNxT2NVanhjUjF3Ij4KLSAgICAgICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfZVZIYW1sdTBFZHVzcU9jVWp4Y1IxdyIgbmFtZT0iSGlkZGVuIiBndWlkPSJfZVZIYW1sdTBFZHVzcU9jVWp4Y1IxdyI+Ci0gICAgICAgICAgICA8Y29udGVudEVsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkN1c3RvbUNhdGVnb3J5IiB4bWk6aWQ9Il9lVkhhbTF1MEVkdXNxT2NVanhjUjF3IiBuYW1lPSJDdXN0b20gQ2F0ZWdvcmllcyIgZ3VpZD0iX2VWSGFtMXUwRWR1c3FPY1VqeGNSMXciLz4KLSAgICAgICAgICA8L2NoaWxkUGFja2FnZXM+Ci0gICAgICAgIDwvY2hpbGRQYWNrYWdlcz4KLSAgICAgIDwvY2hpbGRQYWNrYWdlcz4KLSAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il9lVkhhbkZ1MEVkdXNxT2NVanhjUjF3IiBuYW1lPSJDb3JlQ29udGVudCIgZ3VpZD0iX2VWSGFuRnUwRWR1c3FPY1VqeGNSMXciLz4KLSAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NQYWNrYWdlIiB4bWk6aWQ9Il9lVkhhblZ1MEVkdXNxT2NVanhjUjF3IiBuYW1lPSJDYXBhYmlsaXR5UGF0dGVybnMiIGd1aWQ9Il9lVkhhblZ1MEVkdXNxT2NVanhjUjF3Ii8+Ci0gICAgPC9tZXRob2RQYWNrYWdlcz4KLSAgICA8bWV0aG9kUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc1BhY2thZ2UiIHhtaTppZD0iX2VWSGFubHUwRWR1c3FPY1VqeGNSMXciIG5hbWU9IkRlbGl2ZXJ5UHJvY2Vzc2VzIiBndWlkPSJfZVZIYW5sdTBFZHVzcU9jVWp4Y1IxdyIvPgotICAgIDxtZXRob2RQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzUGFja2FnZSIgeG1pOmlkPSJfZVZIYW4xdTBFZHVzcU9jVWp4Y1IxdyIgbmFtZT0iUHJvY2Vzc0NvbnRyaWJ1dGlvbnMiIGd1aWQ9Il9lVkhhbjF1MEVkdXNxT2NVanhjUjF3Ii8+Ci0gICAgPGJhc2VzIGhyZWY9InVtYTovL19lVTFHc0Z1MEVkdXNxT2NVanhjUjF3I19lVTFHc0Z1MEVkdXNxT2NVanhjUjF3Ii8+Ci0gIDwvb3JnLmVjbGlwc2UuZXBmLnVtYTpNZXRob2RQbHVnaW4+Ci08L3htaTpYTUk+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL1Rlc3RDb21tYW5kcy9uZXdNZXRob2RQbHVnaW4vbmV3TWV0aG9kUGx1Z2luL2xpYnJhcnkueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9UZXN0Q29tbWFuZHMvbmV3TWV0aG9kUGx1Z2luL25ld01ldGhvZFBsdWdpbi9saWJyYXJ5LnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjRmMDkzNC4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL1Rlc3RDb21tYW5kcy9uZXdNZXRob2RQbHVnaW4vbmV3TWV0aG9kUGx1Z2luL2xpYnJhcnkueG1pCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTx4bWk6WE1JIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC4zL3VtYS5lY29yZSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYS5yZXNvdXJjZW1hbmFnZXI9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZXBmL3VtYS9yZXNvdXJjZW1hbmFnZXIuZWNvcmUiIHJtYzp2ZXJzaW9uPSI3LjEuMCIgZXBmOnZlcnNpb249IjEuMC4wIj4KLSAgPG9yZy5lY2xpcHNlLmVwZi51bWEucmVzb3VyY2VtYW5hZ2VyOlJlc291cmNlTWFuYWdlciB4bWk6aWQ9Il9lUDNISUZ1MEVkdXNxT2NVanhjUjF3IiBndWlkPSJfZVAzSElGdTBFZHVzcU9jVWp4Y1IxdyI+Ci0gICAgPHN1Yk1hbmFnZXJzIHhtaTppZD0iX2VVN05VRnUwRWR1c3FPY1VqeGNSMXciIGhyZWY9InVtYTovL19lVTFHc0Z1MEVkdXNxT2NVanhjUjF3I19lVTdOVUZ1MEVkdXNxT2NVanhjUjF3Ii8+Ci0gICAgPHN1Yk1hbmFnZXJzIHhtaTppZD0iX2VWTmhNRnUwRWR1c3FPY1VqeGNSMXciIGhyZWY9InVtYTovL19lVkhha0Z1MEVkdXNxT2NVanhjUjF3I19lVk5oTUZ1MEVkdXNxT2NVanhjUjF3Ii8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfZVAzSElWdTBFZHVzcU9jVWp4Y1IxdyIgaWQ9Il9lUHhBZ0Z1MEVkdXNxT2NVanhjUjF3IiB1cmk9IiIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iX2VVN05VVnUwRWR1c3FPY1VqeGNSMXciIGlkPSJfZVU3TlVGdTBFZHVzcU9jVWp4Y1IxdyIgdXJpPSJNeSUyMDFzdCUyMHBsdWdpbi9wbHVnaW4ueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfZVU3TlVsdTBFZHVzcU9jVWp4Y1IxdyIgaWQ9Il9lVTFHc0Z1MEVkdXNxT2NVanhjUjF3IiB1cmk9Ik15JTIwMXN0JTIwcGx1Z2luL3BsdWdpbi54bWkiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il9lVk5oTVZ1MEVkdXNxT2NVanhjUjF3IiBpZD0iX2VWTmhNRnUwRWR1c3FPY1VqeGNSMXciIHVyaT0iTXklMjAybmQlMjBwbHVnaW4vcGx1Z2luLnhtaSIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iX2VWTmhNbHUwRWR1c3FPY1VqeGNSMXciIGlkPSJfZVZIYWtGdTBFZHVzcU9jVWp4Y1IxdyIgdXJpPSJNeSUyMDJuZCUyMHBsdWdpbi9wbHVnaW4ueG1pIi8+Ci0gIDwvb3JnLmVjbGlwc2UuZXBmLnVtYS5yZXNvdXJjZW1hbmFnZXI6UmVzb3VyY2VNYW5hZ2VyPgotICA8b3JnLmVjbGlwc2UuZXBmLnVtYTpNZXRob2RMaWJyYXJ5IHhtaTppZD0iX2VQeEFnRnUwRWR1c3FPY1VqeGNSMXciIG5hbWU9Im5ld0xpYiIgZ3VpZD0iX2VQeEFnRnUwRWR1c3FPY1VqeGNSMXciPgotICAgIDxtZXRob2RQbHVnaW5zIHhtaTppZD0iX2VVMUdzRnUwRWR1c3FPY1VqeGNSMXciIGhyZWY9InVtYTovL19lVTFHc0Z1MEVkdXNxT2NVanhjUjF3I19lVTFHc0Z1MEVkdXNxT2NVanhjUjF3Ii8+Ci0gICAgPG1ldGhvZFBsdWdpbnMgeG1pOmlkPSJfZVZIYWtGdTBFZHVzcU9jVWp4Y1IxdyIgaHJlZj0idW1hOi8vX2VWSGFrRnUwRWR1c3FPY1VqeGNSMXcjX2VWSGFrRnUwRWR1c3FPY1VqeGNSMXciLz4KLSAgPC9vcmcuZWNsaXBzZS5lcGYudW1hOk1ldGhvZExpYnJhcnk+Ci08L3htaTpYTUk+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL1ZhbGlkYXRpb24vQnVncy8xNjIxNDgudGMgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL1ZhbGlkYXRpb24vQnVncy8xNjIxNDgudGMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzMGI0OGEuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9WYWxpZGF0aW9uL0J1Z3MvMTYyMTQ4LnRjCisrKyAvZGV2L251bGwKQEAgLTEsMTIzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08TWV0aG9kTGlicmFyeVRlc3QgZGlzYWJsZT0iZmFsc2UiIHZlcmJvc2U9InRydWUiPgotCQotCTxPcGVuTGlicmFyeSBsaWJGb2xkZXJOYW1lPSIxNjIxNDgiPgotCTwvT3BlbkxpYnJhcnk+CQotCQotCTxOZXdNZXRob2RFbGVtZW50Ci0JCXR5cGU9Ik1ldGhvZFBsdWdpbiIgCi0JCW5hbWU9IlBsdWdfQSIKLQkJYnJpZWZEZXNjcmlwdGlvbj0iQnJpZWYgZGVzY2lwdGlvbiBvZiBQbHVnX0EiCi0JCWF1dGhvcnM9IlNvbWVib2R5IgkKLQkJPgkKLQk8L05ld01ldGhvZEVsZW1lbnQ+CQotCQotCTxOZXdNZXRob2RFbGVtZW50IAotCQl0eXBlPSJNZXRob2RDb25maWd1cmF0aW9uIgotCQluYW1lPSJDb25maWdfQSIKLQkJPgkJCQotCTwvTmV3TWV0aG9kRWxlbWVudD4JCQkJCQkJCQkJCi0JCQotCTxOZXdNZXRob2RFbGVtZW50IGRpc2FibGU9ImZhbHNlIgotCQl0eXBlPSJDYXBhYmlsaXR5UGF0dGVybiIKLQkJcGFyZW50UGF0aD0iUGx1Z19BL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zIgotCQluYW1lPSJCIgotCQlwcmVzZW50YXRpb25OYW1lPSJCIgotCQlicmllZkRlc2NyaXB0aW9uPSJCcmllZiBkZXNjaXB0aW9uIG9mIEIiCi0JCT4JCQotCQk8ZGVmYXVsdENvbnRleHQ+Ci0JCQk8VmFsdWU+Q29uZmlnX0E8L1ZhbHVlPgotCQk8L2RlZmF1bHRDb250ZXh0PgkJCi0JCQkJCi0JPC9OZXdNZXRob2RFbGVtZW50PgotCQkJCQotCTxOZXdNZXRob2RFbGVtZW50IGRpc2FibGU9ImZhbHNlIiAKLQkJdHlwZT0iQWN0aXZpdHkiCi0JCXBhcmVudFBhdGg9IlBsdWdfQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9CIgotCQluYW1lPSJCMSIKLQkJcHJlc2VudGF0aW9uTmFtZT0iQjEiCi0JCT4JCQkJCQkJCQotCTwvTmV3TWV0aG9kRWxlbWVudD4KLQotCTxOZXdNZXRob2RFbGVtZW50IGRpc2FibGU9ImZhbHNlIiAKLQkJdHlwZT0iQWN0aXZpdHkiCi0JCXBhcmVudFBhdGg9IlBsdWdfQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9CL0IxIgotCQluYW1lPSJCMiIKLQkJcHJlc2VudGF0aW9uTmFtZT0iQjIiCi0JCT4JCQkJCQkJCQotCTwvTmV3TWV0aG9kRWxlbWVudD4JCQkJCi0KLQk8TmV3TWV0aG9kRWxlbWVudCBkaXNhYmxlPSJmYWxzZSIKLQkJdHlwZT0iQ2FwYWJpbGl0eVBhdHRlcm4iCi0JCXBhcmVudFBhdGg9IlBsdWdfQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucyIKLQkJbmFtZT0iQSIKLQkJcHJlc2VudGF0aW9uTmFtZT0iQSIKLQkJYnJpZWZEZXNjcmlwdGlvbj0iQnJpZWYgZGVzY2lwdGlvbiBvZiBBIgotCQk+CQkKLQkJPGRlZmF1bHRDb250ZXh0PgotCQkJPFZhbHVlPkNvbmZpZ19BPC9WYWx1ZT4KLQkJPC9kZWZhdWx0Q29udGV4dD4JCQotCQkJCQotCTwvTmV3TWV0aG9kRWxlbWVudD4KLQotCTxOZXdNZXRob2RFbGVtZW50IGRpc2FibGU9ImZhbHNlIgotCQl0eXBlPSJDYXBhYmlsaXR5UGF0dGVybiIKLQkJcGFyZW50UGF0aD0iUGx1Z19BL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zIgotCQluYW1lPSJDIgotCQlwcmVzZW50YXRpb25OYW1lPSJDIgotCQlicmllZkRlc2NyaXB0aW9uPSJCcmllZiBkZXNjaXB0aW9uIG9mIEMiCi0JCT4JCQotCQk8ZGVmYXVsdENvbnRleHQ+Ci0JCQk8VmFsdWU+Q29uZmlnX0E8L1ZhbHVlPgotCQk8L2RlZmF1bHRDb250ZXh0PgkJCi0JCQkJCi0JPC9OZXdNZXRob2RFbGVtZW50PgotCQotCTxFZGl0TWV0aG9kRWxlbWVudCBkaXNhYmxlPSJmYWxzZSIKLQkJdHlwZT0iQWN0aXZpdHkiCi0JCXBhdGg9IlBsdWdfQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9CIgotCQl2YXJpYWJpbGl0eVR5cGU9ImNvbnRyaWJ1dGVzIgotCQk+CQkJCQotCQk8cHJlc2VudGF0aW9uIAotCQkJbWFpbkRlc2NyaXB0aW9uPSJUaGlzIGlzIHRoZSBtYWluIGRlc2NyaXB0aW9uIG9mIEIiPgkJCQotCQk8L3ByZXNlbnRhdGlvbj4KLQkJPHZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQ+Ci0JCQk8VmFsdWU+UGx1Z19BL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0E8L1ZhbHVlPgotCQk8L3ZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQ+CQkKLQk8L0VkaXRNZXRob2RFbGVtZW50PgotCQotCTxFZGl0TWV0aG9kRWxlbWVudCBkaXNhYmxlPSJmYWxzZSIKLQkJdHlwZT0iQWN0aXZpdHkiCi0JCXBhdGg9IlBsdWdfQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DIgotCQl2YXJpYWJpbGl0eVR5cGU9ImV4dGVuZHMiCi0JCT4JCQkJCi0JCTxwcmVzZW50YXRpb24gCi0JCQltYWluRGVzY3JpcHRpb249IlRoaXMgaXMgdGhlIG1haW4gZGVzY3JpcHRpb24gb2YgQyI+CQkJCi0JCTwvcHJlc2VudGF0aW9uPgotCQk8dmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudD4KLQkJCTxWYWx1ZT5QbHVnX0EvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQTwvVmFsdWU+Ci0JCTwvdmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudD4JCQotCTwvRWRpdE1ldGhvZEVsZW1lbnQ+Ci0JCi0JPEVkaXRNZXRob2RFbGVtZW50IGRpc2FibGU9ImZhbHNlIgotCQl0eXBlPSJBY3Rpdml0eSIKLQkJcGF0aD0iUGx1Z19BL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0IvQjEvQjIiCi0JCXZhcmlhYmlsaXR5VHlwZT0iZXh0ZW5kcyIKLQkJPgkJCQkKLQkJPHByZXNlbnRhdGlvbiAKLQkJCW1haW5EZXNjcmlwdGlvbj0iVGhpcyBpcyB0aGUgbWFpbiBkZXNjcmlwdGlvbiBvZiBCMiI+CQkJCi0JCTwvcHJlc2VudGF0aW9uPgotCQk8dmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudD4KLQkJCTxWYWx1ZT5QbHVnX0EvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQzwvVmFsdWU+Ci0JCTwvdmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudD4JCQotCTwvRWRpdE1ldGhvZEVsZW1lbnQ+Ci0JCQotCTxDaXJjdWxhckRlcGVuZGVuY3lDaGVjayBkaXNhYmxlPSJmYWxzZSIgCi0JCWVycm9yQ291bnQ9IjEiCi0JCWNpcmN1bGFyRWxlbWVudENvdW50PSI1IgotCQk+Ci0JPC9DaXJjdWxhckRlcGVuZGVuY3lDaGVjaz4JCi0JCi0JCi0JCQotPC9NZXRob2RMaWJyYXJ5VGVzdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL1ZhbGlkYXRpb24vQnVncy8xNjk1MDEudGMgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL1ZhbGlkYXRpb24vQnVncy8xNjk1MDEudGMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0MTA0ZmIuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9WYWxpZGF0aW9uL0J1Z3MvMTY5NTAxLnRjCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxNZXRob2RMaWJyYXJ5VGVzdCBkaXNhYmxlPSJmYWxzZSIgdmVyYm9zZT0idHJ1ZSI+Ci0JCi0JPE9wZW5MaWJyYXJ5IGxpYkZvbGRlck5hbWU9IjE2OTUwMSI+Ci0JPC9PcGVuTGlicmFyeT4JCi0JCi0JPE5ld01ldGhvZEVsZW1lbnQKLQkJdHlwZT0iTWV0aG9kUGx1Z2luIiAKLQkJbmFtZT0iUGx1Z19BIgotCQlicmllZkRlc2NyaXB0aW9uPSJCcmllZiBkZXNjaXB0aW9uIG9mIFBsdWdfQSIKLQkJYXV0aG9ycz0iU29tZWJvZHkiCQotCQk+CQotCTwvTmV3TWV0aG9kRWxlbWVudD4JCi0JCi0JPE5ld01ldGhvZEVsZW1lbnQgCi0JCXR5cGU9Ik1ldGhvZENvbmZpZ3VyYXRpb24iCi0JCW5hbWU9IkNvbmZpZ19BIgotCQk+CQkJCi0JPC9OZXdNZXRob2RFbGVtZW50PgkJCQkJCQkJCQkKLQkJCi0JPE5ld01ldGhvZEVsZW1lbnQgZGlzYWJsZT0iZmFsc2UiCi0JCXR5cGU9IkNhcGFiaWxpdHlQYXR0ZXJuIgotCQlwYXJlbnRQYXRoPSJQbHVnX0EvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMiCi0JCW5hbWU9ImNwMSIKLQkJcHJlc2VudGF0aW9uTmFtZT0iY3AxIgotCQlicmllZkRlc2NyaXB0aW9uPSJCcmllZiBkZXNjaXB0aW9uIG9mIGNwMSIKLQkJPgkJCi0JCTxkZWZhdWx0Q29udGV4dD4KLQkJCTxWYWx1ZT5Db25maWdfQTwvVmFsdWU+Ci0JCTwvZGVmYXVsdENvbnRleHQ+CQkKLQkJCQkKLQk8L05ld01ldGhvZEVsZW1lbnQ+Ci0JCQkJCi0JPE5ld01ldGhvZEVsZW1lbnQgZGlzYWJsZT0iZmFsc2UiIAotCQl0eXBlPSJBY3Rpdml0eSIKLQkJcGFyZW50UGF0aD0iUGx1Z19BL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NwMSIKLQkJbmFtZT0iYTEiCi0JCXByZXNlbnRhdGlvbk5hbWU9ImExIgotCQk+CQkJCQkJCQkKLQk8L05ld01ldGhvZEVsZW1lbnQ+Ci0JCi0JPE5ld01ldGhvZEVsZW1lbnQgZGlzYWJsZT0iZmFsc2UiCi0JCXR5cGU9IkNhcGFiaWxpdHlQYXR0ZXJuIgotCQlwYXJlbnRQYXRoPSJQbHVnX0EvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMiCi0JCW5hbWU9ImNwMiIKLQkJcHJlc2VudGF0aW9uTmFtZT0iY3AyIgotCQk+CQkKLQkJPGRlZmF1bHRDb250ZXh0PgotCQkJPFZhbHVlPkNvbmZpZ19BPC9WYWx1ZT4KLQkJPC9kZWZhdWx0Q29udGV4dD4JCQotCQkJCQotCTwvTmV3TWV0aG9kRWxlbWVudD4KLQkJCQkKLQk8TmV3TWV0aG9kRWxlbWVudCBkaXNhYmxlPSJmYWxzZSIKLQkJdHlwZT0iQWN0aXZpdHkiCi0JCXBhcmVudFBhdGg9IlBsdWdfQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jcDIiCi0JCW5hbWU9ImEyIgotCQlwcmVzZW50YXRpb25OYW1lPSJhMiIKLQkJPgkJCQkJCQkJCi0JPC9OZXdNZXRob2RFbGVtZW50PgkKLQkKLQk8RWRpdE1ldGhvZEVsZW1lbnQgZGlzYWJsZT0iZmFsc2UiCi0JCXR5cGU9IkFjdGl2aXR5IgotCQlwYXRoPSJQbHVnX0EvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY3AxL2ExIgotCQl2YXJpYWJpbGl0eVR5cGU9ImNvbnRyaWJ1dGVzIgotCQk+CQkJCQotCQk8cHJlc2VudGF0aW9uIAotCQkJbWFpbkRlc2NyaXB0aW9uPSJUaGlzIGlzIHRoZSBtYWluIGRlc2NyaXB0aW9uIG9mIGExIj4JCQkKLQkJPC9wcmVzZW50YXRpb24+Ci0JCTx2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50PgotCQkJPFZhbHVlPlBsdWdfQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jcDIvYTI8L1ZhbHVlPgotCQk8L3ZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQ+CQkKLQk8L0VkaXRNZXRob2RFbGVtZW50PgotCQkKLQk8Q2lyY3VsYXJEZXBlbmRlbmN5Q2hlY2sgZGlzYWJsZT0iZmFsc2UiIGVycm9yQ291bnQ9IjAiPgotCTwvQ2lyY3VsYXJEZXBlbmRlbmN5Q2hlY2s+CQotCQotCQotCQkKLTwvTWV0aG9kTGlicmFyeVRlc3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9WYWxpZGF0aW9uL0J1Z3MvMTcwMjk0LnRjIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9WYWxpZGF0aW9uL0J1Z3MvMTcwMjk0LnRjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOWY2ZjU5Li4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvVmFsaWRhdGlvbi9CdWdzLzE3MDI5NC50YworKysgL2Rldi9udWxsCkBAIC0xLDExOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPE1ldGhvZExpYnJhcnlUZXN0IGRpc2FibGU9ImZhbHNlIiB2ZXJib3NlPSJmYWxzZSI+Ci0JCi0JPE9wZW5MaWJyYXJ5IGxpYkZvbGRlck5hbWU9IjE3MDI5NCI+Ci0JPC9PcGVuTGlicmFyeT4JCi0JCi0JPE5ld01ldGhvZEVsZW1lbnQKLQkJdHlwZT0iTWV0aG9kUGx1Z2luIiAKLQkJbmFtZT0iUGx1Z19BIgotCQlicmllZkRlc2NyaXB0aW9uPSJCcmllZiBkZXNjaXB0aW9uIG9mIFBsdWdfQSIKLQkJYXV0aG9ycz0iU29tZWJvZHkiCQotCQk+CQotCTwvTmV3TWV0aG9kRWxlbWVudD4JCi0JCi0JPE5ld01ldGhvZEVsZW1lbnQgCi0JCXR5cGU9Ik1ldGhvZENvbmZpZ3VyYXRpb24iCi0JCW5hbWU9IkNvbmZpZ19BIgotCQk+CQkJCQkJCQkKLQk8L05ld01ldGhvZEVsZW1lbnQ+CQkJCQkJCQkJCQotCQkKLQk8TmV3TWV0aG9kRWxlbWVudCBkaXNhYmxlPSJmYWxzZSIKLQkJdHlwZT0iQ2FwYWJpbGl0eVBhdHRlcm4iCi0JCXBhcmVudFBhdGg9IlBsdWdfQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucyIKLQkJbmFtZT0iQ1BhIgotCQlwcmVzZW50YXRpb25OYW1lPSJDUGEiCi0JCT4JCQotCQk8ZGVmYXVsdENvbnRleHQ+Ci0JCQk8VmFsdWU+Q29uZmlnX0E8L1ZhbHVlPgotCQk8L2RlZmF1bHRDb250ZXh0PgkJCQkJCQotCTwvTmV3TWV0aG9kRWxlbWVudD4KLQkJCQkKLQk8TmV3TWV0aG9kRWxlbWVudCBkaXNhYmxlPSJmYWxzZSIgCi0JCXR5cGU9IkFjdGl2aXR5IgotCQlwYXJlbnRQYXRoPSJQbHVnX0EvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1BhIgotCQluYW1lPSJhMSIKLQkJcHJlc2VudGF0aW9uTmFtZT0iYTEiCi0JCT4JCQkJCQkJCQotCTwvTmV3TWV0aG9kRWxlbWVudD4KLQkKLQk8TmV3TWV0aG9kRWxlbWVudCBkaXNhYmxlPSJmYWxzZSIgCi0JCXR5cGU9IkFjdGl2aXR5IgotCQlwYXJlbnRQYXRoPSJQbHVnX0EvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1BhL2ExIgotCQluYW1lPSJhMTEiCi0JCXByZXNlbnRhdGlvbk5hbWU9ImExMSIKLQkJPgkJCQkJCQkJCi0JPC9OZXdNZXRob2RFbGVtZW50PgotCQotCTxOZXdNZXRob2RFbGVtZW50IGRpc2FibGU9ImZhbHNlIiAKLQkJdHlwZT0iQWN0aXZpdHkiCi0JCXBhcmVudFBhdGg9IlBsdWdfQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUGEvYTEvYTExIgotCQluYW1lPSJhMTExIgotCQlwcmVzZW50YXRpb25OYW1lPSJhMTExIgotCQk+CQkJCQkJCQkKLQk8L05ld01ldGhvZEVsZW1lbnQ+Ci0JCi0JPE5ld01ldGhvZEVsZW1lbnQgZGlzYWJsZT0iZmFsc2UiCi0JCXR5cGU9IkNhcGFiaWxpdHlQYXR0ZXJuIgotCQlwYXJlbnRQYXRoPSJQbHVnX0EvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMiCi0JCW5hbWU9IkNQYiIKLQkJcHJlc2VudGF0aW9uTmFtZT0iQ1BiIgotCQk+CQkKLQkJPGRlZmF1bHRDb250ZXh0PgotCQkJPFZhbHVlPkNvbmZpZ19BPC9WYWx1ZT4KLQkJPC9kZWZhdWx0Q29udGV4dD4JCQkJCQkKLQk8L05ld01ldGhvZEVsZW1lbnQ+Ci0JCQkJCi0JPE5ld01ldGhvZEVsZW1lbnQgZGlzYWJsZT0iZmFsc2UiIAotCQl0eXBlPSJBY3Rpdml0eSIKLQkJcGFyZW50UGF0aD0iUGx1Z19BL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQYiIKLQkJbmFtZT0iYjEiCi0JCXByZXNlbnRhdGlvbk5hbWU9ImIxIgotCQk+CQkJCQkJCQkKLQk8L05ld01ldGhvZEVsZW1lbnQ+Ci0JCi0JPE5ld01ldGhvZEVsZW1lbnQgZGlzYWJsZT0iZmFsc2UiIAotCQl0eXBlPSJBY3Rpdml0eSIKLQkJcGFyZW50UGF0aD0iUGx1Z19BL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQYi9iMSIKLQkJbmFtZT0iYjExIgotCQlwcmVzZW50YXRpb25OYW1lPSJiMTEiCi0JCT4JCQkJCQkJCQotCTwvTmV3TWV0aG9kRWxlbWVudD4KLQkKLQk8TmV3TWV0aG9kRWxlbWVudCBkaXNhYmxlPSJmYWxzZSIgCi0JCXR5cGU9IkFjdGl2aXR5IgotCQlwYXJlbnRQYXRoPSJQbHVnX0EvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1BiL2IxL2IxMSIKLQkJbmFtZT0iYjExMSIKLQkJcHJlc2VudGF0aW9uTmFtZT0iYjExMSIKLQkJPgkJCQkJCQkJCi0JPC9OZXdNZXRob2RFbGVtZW50PgotCQotCTxFZGl0TWV0aG9kRWxlbWVudCBkaXNhYmxlPSJmYWxzZSIKLQkJdHlwZT0iQWN0aXZpdHkiCi0JCXBhdGg9IlBsdWdfQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUGEvYTEiCi0JCXZhcmlhYmlsaXR5VHlwZT0iY29udHJpYnV0ZXMiCi0JCT4JCQkJCi0JCTx2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50PgotCQkJPFZhbHVlPlBsdWdfQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUGIvYjE8L1ZhbHVlPgotCQk8L3ZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQ+CQkKLQk8L0VkaXRNZXRob2RFbGVtZW50PgotCQotCTxFZGl0TWV0aG9kRWxlbWVudCBkaXNhYmxlPSJmYWxzZSIKLQkJdHlwZT0iQWN0aXZpdHkiCi0JCXBhdGg9IlBsdWdfQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUGEvYTEvYTExL2ExMTEiCi0JCXZhcmlhYmlsaXR5VHlwZT0iZXh0ZW5kcyIKLQkJPgkJCQkKLQkJPHZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQ+Ci0JCQk8VmFsdWU+UGx1Z19BL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQYi9iMTwvVmFsdWU+Ci0JCTwvdmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudD4JCQotCTwvRWRpdE1ldGhvZEVsZW1lbnQ+Ci0JCQotCTxDaXJjdWxhckRlcGVuZGVuY3lDaGVjayBkaXNhYmxlPSJmYWxzZSIgCi0JCWVycm9yQ291bnQ9IjIiCi0JCWNpcmN1bGFyRWxlbWVudENvdW50PSI5IgotCQk+Ci0JPC9DaXJjdWxhckRlcGVuZGVuY3lDaGVjaz4JCi0JCi0JCi0JCQotPC9NZXRob2RMaWJyYXJ5VGVzdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL1ZhbGlkYXRpb24vQnVncy8xNzA1OTcudGMgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL1ZhbGlkYXRpb24vQnVncy8xNzA1OTcudGMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5YWYyNDUuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9WYWxpZGF0aW9uL0J1Z3MvMTcwNTk3LnRjCisrKyAvZGV2L251bGwKQEAgLTEsMTI3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08TWV0aG9kTGlicmFyeVRlc3QgZGlzYWJsZT0iZmFsc2UiIHZlcmJvc2U9ImZhbHNlIj4KLQkKLQk8T3BlbkxpYnJhcnkgbGliRm9sZGVyTmFtZT0iMTcwNTk3Ij4KLQk8L09wZW5MaWJyYXJ5PgkKLQkKLQk8TmV3TWV0aG9kRWxlbWVudAotCQl0eXBlPSJNZXRob2RQbHVnaW4iIAotCQluYW1lPSJQbHVnX0EiCi0JCWJyaWVmRGVzY3JpcHRpb249IkJyaWVmIGRlc2NpcHRpb24gb2YgUGx1Z19BIgotCQlhdXRob3JzPSJTb21lYm9keSIJCi0JCT4JCi0JPC9OZXdNZXRob2RFbGVtZW50PgkKLQkKLQk8TmV3TWV0aG9kRWxlbWVudCAKLQkJdHlwZT0iTWV0aG9kQ29uZmlndXJhdGlvbiIKLQkJbmFtZT0iQ29uZmlnX0EiCi0JCT4JCQkJCQkJCQotCTwvTmV3TWV0aG9kRWxlbWVudD4JCQkJCQkJCQkJCi0JCQotCTxOZXdNZXRob2RFbGVtZW50IGRpc2FibGU9ImZhbHNlIgotCQl0eXBlPSJDYXBhYmlsaXR5UGF0dGVybiIKLQkJcGFyZW50UGF0aD0iUGx1Z19BL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zIgotCQluYW1lPSJDUDEiCi0JCXByZXNlbnRhdGlvbk5hbWU9IkNQMSIKLQkJPgkJCi0JCTxkZWZhdWx0Q29udGV4dD4KLQkJCTxWYWx1ZT5Db25maWdfQTwvVmFsdWU+Ci0JCTwvZGVmYXVsdENvbnRleHQ+CQkJCQkJCi0JPC9OZXdNZXRob2RFbGVtZW50PgotCi0JCi0JPE5ld01ldGhvZEVsZW1lbnQgZGlzYWJsZT0iZmFsc2UiCi0JCXR5cGU9IkNhcGFiaWxpdHlQYXR0ZXJuIgotCQlwYXJlbnRQYXRoPSJQbHVnX0EvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMiCi0JCW5hbWU9IkNQMiIKLQkJcHJlc2VudGF0aW9uTmFtZT0iQ1AyIgotCQk+CQkKLQkJPGRlZmF1bHRDb250ZXh0PgotCQkJPFZhbHVlPkNvbmZpZ19BPC9WYWx1ZT4KLQkJPC9kZWZhdWx0Q29udGV4dD4JCQkJCQkKLQk8L05ld01ldGhvZEVsZW1lbnQ+Ci0JCQkJCi0KLQk8TmV3TWV0aG9kRWxlbWVudCBkaXNhYmxlPSJmYWxzZSIKLQkJdHlwZT0iQ2FwYWJpbGl0eVBhdHRlcm4iCi0JCXBhcmVudFBhdGg9IlBsdWdfQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucyIKLQkJbmFtZT0iQ1AzIgotCQlwcmVzZW50YXRpb25OYW1lPSJDUDMiCi0JCT4JCQotCQk8ZGVmYXVsdENvbnRleHQ+Ci0JCQk8VmFsdWU+Q29uZmlnX0E8L1ZhbHVlPgotCQk8L2RlZmF1bHRDb250ZXh0PgkJCQkJCQotCTwvTmV3TWV0aG9kRWxlbWVudD4KLQkJCQkJCQkJCQkJCQkJCQkJCQotCQkJCQkJCQkJCQkJCi0JPE5ld01ldGhvZEVsZW1lbnQgZGlzYWJsZT0iZmFsc2UiCi0JCXR5cGU9IkFjdGl2aXR5IgotCQlwYXJlbnRQYXRoPSJQbHVnX0EvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AxIgotCQluYW1lPSJDUDIiCi0JCXByZXNlbnRhdGlvbk5hbWU9IkNQMiIKLQkJPgkJCQkJCQkJCi0JPC9OZXdNZXRob2RFbGVtZW50PgotCi0JCi0JPE5ld01ldGhvZEVsZW1lbnQgZGlzYWJsZT0iZmFsc2UiCi0JCXR5cGU9IkFjdGl2aXR5IgotCQlwYXJlbnRQYXRoPSJQbHVnX0EvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AyIgotCQluYW1lPSJDUDMiCi0JCXByZXNlbnRhdGlvbk5hbWU9IkNQMyIKLQkJPgkJCQkJCQkKLQk8L05ld01ldGhvZEVsZW1lbnQ+Ci0JCQkJCi0KLQk8TmV3TWV0aG9kRWxlbWVudCBkaXNhYmxlPSJmYWxzZSIKLQkJdHlwZT0iQWN0aXZpdHkiCi0JCXBhcmVudFBhdGg9IlBsdWdfQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUDMiCi0JCW5hbWU9IkNQMSIKLQkJcHJlc2VudGF0aW9uTmFtZT0iQ1AxIgotCQk+CQkKLQkJPGRlZmF1bHRDb250ZXh0PgotCQkJPFZhbHVlPkNvbmZpZ19BPC9WYWx1ZT4KLQkJPC9kZWZhdWx0Q29udGV4dD4JCQkJCQkKLQk8L05ld01ldGhvZEVsZW1lbnQ+Ci0KLQotCTxFZGl0TWV0aG9kRWxlbWVudCBkaXNhYmxlPSJmYWxzZSIKLQkJdHlwZT0iQWN0aXZpdHkiCi0JCXBhdGg9IlBsdWdfQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUDEvQ1AyIgotCQl2YXJpYWJpbGl0eVR5cGU9ImV4dGVuZHMiCi0JCT4JCQkJCi0JCTx2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50PgotCQkJPFZhbHVlPlBsdWdfQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUDI8L1ZhbHVlPgotCQk8L3ZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQ+CQkKLQk8L0VkaXRNZXRob2RFbGVtZW50PgkKLQotCTxFZGl0TWV0aG9kRWxlbWVudCBkaXNhYmxlPSJmYWxzZSIKLQkJdHlwZT0iQWN0aXZpdHkiCi0JCXBhdGg9IlBsdWdfQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUDIvQ1AzIgotCQl2YXJpYWJpbGl0eVR5cGU9ImV4dGVuZHMiCi0JCT4JCQkJCi0JCTx2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50PgotCQkJPFZhbHVlPlBsdWdfQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUDM8L1ZhbHVlPgotCQk8L3ZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQ+CQkKLQk8L0VkaXRNZXRob2RFbGVtZW50PgotCQotCQotCTxFZGl0TWV0aG9kRWxlbWVudCBkaXNhYmxlPSJmYWxzZSIKLQkJdHlwZT0iQWN0aXZpdHkiCi0JCXBhdGg9IlBsdWdfQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUDMvQ1AxIgotCQl2YXJpYWJpbGl0eVR5cGU9ImV4dGVuZHMiCi0JCT4JCQkJCi0JCTx2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50PgotCQkJPFZhbHVlPlBsdWdfQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUDE8L1ZhbHVlPgotCQk8L3ZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQ+CQkKLQk8L0VkaXRNZXRob2RFbGVtZW50PgotCQotCQkKLQk8Q2lyY3VsYXJEZXBlbmRlbmN5Q2hlY2sgZGlzYWJsZT0iZmFsc2UiIAotCQllcnJvckNvdW50PSIxIgotCQljaXJjdWxhckVsZW1lbnRDb3VudD0iNiIKLQkJPgotCTwvQ2lyY3VsYXJEZXBlbmRlbmN5Q2hlY2s+CQotCQotCQotCQkKLTwvTWV0aG9kTGlicmFyeVRlc3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9WYWxpZGF0aW9uL0J1Z3MvMTcxMDI4LnRjIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9WYWxpZGF0aW9uL0J1Z3MvMTcxMDI4LnRjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NDQ0ZDc0Li4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvVmFsaWRhdGlvbi9CdWdzLzE3MTAyOC50YworKysgL2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPE1ldGhvZExpYnJhcnlUZXN0IGRpc2FibGU9ImZhbHNlIiB2ZXJib3NlPSJmYWxzZSI+Ci0JCi0JPE9wZW5MaWJyYXJ5IGxpYkZvbGRlck5hbWU9IjE3MTAyOCI+Ci0JPC9PcGVuTGlicmFyeT4JCi0JCi0JPE5ld01ldGhvZEVsZW1lbnQKLQkJdHlwZT0iTWV0aG9kUGx1Z2luIiAKLQkJbmFtZT0iUGx1Z19BIgotCQlicmllZkRlc2NyaXB0aW9uPSJCcmllZiBkZXNjaXB0aW9uIG9mIFBsdWdfQSIKLQkJYXV0aG9ycz0iU29tZWJvZHkiCQotCQk+CQotCTwvTmV3TWV0aG9kRWxlbWVudD4JCi0JCi0JPE5ld01ldGhvZEVsZW1lbnQgCi0JCXR5cGU9Ik1ldGhvZENvbmZpZ3VyYXRpb24iCi0JCW5hbWU9IkNvbmZpZ19BIgotCQk+CQkKLQkJCQkJCQotCTwvTmV3TWV0aG9kRWxlbWVudD4JCQkJCQkJCQkJCi0JCQotCTxOZXdNZXRob2RFbGVtZW50IGRpc2FibGU9ImZhbHNlIgotCQl0eXBlPSJDYXBhYmlsaXR5UGF0dGVybiIKLQkJcGFyZW50UGF0aD0iUGx1Z19BL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zIgotCQluYW1lPSJDUGEiCi0JCXByZXNlbnRhdGlvbk5hbWU9IkNQYSIKLQkJPgkJCi0JCTxkZWZhdWx0Q29udGV4dD4KLQkJCTxWYWx1ZT5Db25maWdfQTwvVmFsdWU+Ci0JCTwvZGVmYXVsdENvbnRleHQ+CQkKLQkJCQkKLQk8L05ld01ldGhvZEVsZW1lbnQ+Ci0JCQkJCi0JPE5ld01ldGhvZEVsZW1lbnQgZGlzYWJsZT0iZmFsc2UiIAotCQl0eXBlPSJBY3Rpdml0eSIKLQkJcGFyZW50UGF0aD0iUGx1Z19BL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQYSIKLQkJbmFtZT0iQTEiCi0JCXByZXNlbnRhdGlvbk5hbWU9IkExIgotCQk+CQkJCQkJCQkKLQk8L05ld01ldGhvZEVsZW1lbnQ+Ci0JCi0JPE5ld01ldGhvZEVsZW1lbnQgZGlzYWJsZT0iZmFsc2UiIAotCQl0eXBlPSJBY3Rpdml0eSIKLQkJcGFyZW50UGF0aD0iUGx1Z19BL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQYS9BMSIKLQkJbmFtZT0iQTExIgotCQlwcmVzZW50YXRpb25OYW1lPSJBMTEiCi0JCT4JCQkJCQkJCQotCTwvTmV3TWV0aG9kRWxlbWVudD4KLQkKLQk8TmV3TWV0aG9kRWxlbWVudCBkaXNhYmxlPSJmYWxzZSIKLQkJdHlwZT0iQ2FwYWJpbGl0eVBhdHRlcm4iCi0JCXBhcmVudFBhdGg9IlBsdWdfQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucyIKLQkJbmFtZT0iQ1BiIgotCQlwcmVzZW50YXRpb25OYW1lPSJDUGIiCi0JCT4JCQotCQk8ZGVmYXVsdENvbnRleHQ+Ci0JCQk8VmFsdWU+Q29uZmlnX0E8L1ZhbHVlPgotCQk8L2RlZmF1bHRDb250ZXh0PgkJCi0JCQkJCi0JPC9OZXdNZXRob2RFbGVtZW50PgotCQkJCQotCTxOZXdNZXRob2RFbGVtZW50IGRpc2FibGU9ImZhbHNlIgotCQl0eXBlPSJBY3Rpdml0eSIKLQkJcGFyZW50UGF0aD0iUGx1Z19BL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQYiIKLQkJbmFtZT0iQjEiCi0JCXByZXNlbnRhdGlvbk5hbWU9IkIxIgotCQk+CQkJCQkJCQkKLQk8L05ld01ldGhvZEVsZW1lbnQ+CQotCQotCTxOZXdNZXRob2RFbGVtZW50IGRpc2FibGU9ImZhbHNlIgotCQl0eXBlPSJBY3Rpdml0eSIKLQkJcGFyZW50UGF0aD0iUGx1Z19BL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQYi9CMSIKLQkJbmFtZT0iQjExIgotCQlwcmVzZW50YXRpb25OYW1lPSJCMTEiCi0JCT4JCQkJCQkJCQotCTwvTmV3TWV0aG9kRWxlbWVudD4JCi0JCi0JPEVkaXRNZXRob2RFbGVtZW50IGRpc2FibGU9ImZhbHNlIgotCQl0eXBlPSJBY3Rpdml0eSIKLQkJcGF0aD0iUGx1Z19BL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQYS9BMS9BMTEiCi0JCXZhcmlhYmlsaXR5VHlwZT0iZXh0ZW5kcyIKLQkJPgkJCQkKLQkJPHZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQ+Ci0JCQk8VmFsdWU+UGx1Z19BL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQYi9CMS9CMTE8L1ZhbHVlPgotCQk8L3ZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQ+CQkKLQk8L0VkaXRNZXRob2RFbGVtZW50PgotCQotCTxFZGl0TWV0aG9kRWxlbWVudCBkaXNhYmxlPSJmYWxzZSIKLQkJdHlwZT0iQWN0aXZpdHkiCi0JCXBhdGg9IlBsdWdfQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUGIvQjEvQjExIgotCQl2YXJpYWJpbGl0eVR5cGU9ImV4dGVuZHMiCi0JCT4JCQkJCi0JCTxwcmVzZW50YXRpb24gCi0JCQltYWluRGVzY3JpcHRpb249IlRoaXMgaXMgdGhlIG1haW4gZGVzY3JpcHRpb24gb2YgQjExIj4JCQkKLQkJPC9wcmVzZW50YXRpb24+Ci0JCTx2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50PgotCQkJPFZhbHVlPlBsdWdfQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUGEvQTE8L1ZhbHVlPgotCQk8L3ZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQ+CQkKLQk8L0VkaXRNZXRob2RFbGVtZW50PgotCQkKLQk8Q2lyY3VsYXJEZXBlbmRlbmN5Q2hlY2sgZGlzYWJsZT0iZmFsc2UiIAotCQllcnJvckNvdW50PSIxIgotCQljaXJjdWxhckVsZW1lbnRDb3VudD0iMyIKLQkJPgotCTwvQ2lyY3VsYXJEZXBlbmRlbmN5Q2hlY2s+CQotCQotCQotCQkKLTwvTWV0aG9kTGlicmFyeVRlc3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL01FVEEtSU5GL01BTklGRVNULk1GIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNmRiODQ3Li4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6IExpYnJhcnkgVGVzdHMgUGx1Zy1pbgotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMKLUJ1bmRsZS1WZXJzaW9uOiAxLjUuMC5xdWFsaWZpZXIKLUJ1bmRsZS1WZW5kb3I6IEVjbGlwc2Uub3JnCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLAotIG9yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2UsCi0gb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnksCi0gb3JnLmp1bml0LAotIG9yZy5lY2xpcHNlLmVwZi5leHBvcnQsCi0gb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pLAotIG9yZy5lY2xpcHNlLmVwZi5pbXBvcnQsCi0gb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwsCi0gb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwsCi0gb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aQotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RlciwKLSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXIuaWZhY2UsCi0gb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzLlRlc3RzUGx1Z2luCi1FY2xpcHNlLUxhenlTdGFydDogdHJ1ZQpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL2J1aWxkLnByb3BlcnRpZXMgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTY5YzUxMC4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotc291cmNlLi4gPSBzcmMvCi1vdXRwdXQuLiA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICAuLFwKLSAgICAgICAgICAgICAgIExpYnJhcmllcy8KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdGVyL0xpYnJhcnlEaWZmQW5hbHl6b3IuamF2YSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdGVyL0xpYnJhcnlEaWZmQW5hbHl6b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjNhNDFmOC4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3Rlci9MaWJyYXJ5RGlmZkFuYWx5em9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OTAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgamF2YS51dGlsLnJlZ2V4Lk1hdGNoZXI7Ci1pbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5zZG8uRVByb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcuc2VydmljZXMuUmVzb3VyY2VTY2FubmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5pZmFjZS5UZXN0VHJhY2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuTGlicmFyeVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQYWNrYWdlOwotCi0vKioKLSAqIENsYXNzIHRvIGFuYWx5emUgdGhlIGRpZmZlcm5lY2VzIGJldHdlZW4gdHdvIG1ldGhvZCBsaWJyYXJpZXMKLSAqIAotICogQGF1dGhvciBXZWlwaW5nIEx1Ci0gKiBAc2luY2UgMS4wCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIExpYnJhcnlEaWZmQW5hbHl6b3IgewotCQotCXByaXZhdGUgZmluYWwgYm9vbGVhbiBsb2NhbERlYnVnID0gZmFsc2U7Ci0JcHJpdmF0ZSBUZXN0VHJhY2VyIHRyYWNlcjsKLQlwcml2YXRlIE1ldGhvZExpYnJhcnkgbGliMTsKLQlwcml2YXRlIE1ldGhvZExpYnJhcnkgbGJpMjsKLQlwcml2YXRlIGJvb2xlYW4gZ3JlZWR5ID0gdHJ1ZTsKLQlwcml2YXRlIGludCBjb21wYXJlT3B0aW9uID0gMTsJCS8vMDogZWxlbWVudDEgYW5kIGVsZW1lbnQyIGFyZSBvbiBlcXVhbCBmb290aW5nLCAvLzE6IGVsZW1lbnQxIGlzIGEgc3VwZXIgc2V0IG9mIGVsZW1lbnQyCi0JcHJpdmF0ZSBib29sZWFuIG5lZWRUb0FuYWx5emUgPSB0cnVlOwotCXByaXZhdGUgYm9vbGVhbiBjb21wYXJlUmVzdWx0ID0gZmFsc2U7Ci0JcHJpdmF0ZSBpbnQgZGlmZkNvdW50ID0gMDsKLQlwcml2YXRlIGludCBlbGVtQ29tcGFyZWRDb3VudCA9IDA7Ci0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGVtcHR5U3RyaW5nID0gIiI7CQotCXB1YmxpYyBzdGF0aWMgZmluYWwgUGF0dGVybiBlbXB0eUxpbmUgPSBQYXR0ZXJuLmNvbXBpbGUoIlxccyIsIFBhdHRlcm4uQ0FTRV9JTlNFTlNJVElWRSB8IFBhdHRlcm4uRE9UQUxMKTsgLy8kTk9OLU5MUy0xJAotCQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gdHJpbSA9IGZhbHNlOwotCXByaXZhdGUgc3RhdGljICBib29sZWFuIHNraXBSZWYgPSB0cnVlOwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gdXNlTmFtZUFzMm5kSWQgPSBmYWxzZTsKLQlwcml2YXRlIHN0YXRpYyBTZXQgc2tpcEZlYXR1cmVTZXQgPSBuZXcgSGFzaFNldCgpOwotCi0JcHVibGljIExpYnJhcnlEaWZmQW5hbHl6b3IoVGVzdFRyYWNlciB0LCBNZXRob2RMaWJyYXJ5IGwxLCBNZXRob2RMaWJyYXJ5IGwyKSB7Ci0JCXRyYWNlciA9IHQ7Ci0JCWxpYjEgPSBsMTsKLQkJbGJpMiA9IGwyOwotCQlMaWJyYXJ5VXRpbC5sb2FkQWxsKChNZXRob2RMaWJyYXJ5KSBsaWIxKTsKLQkJTGlicmFyeVV0aWwubG9hZEFsbCgoTWV0aG9kTGlicmFyeSkgbGJpMik7Ci0JfQkKLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0VHJpbShib29sZWFuIGIpIHsKLQkJdHJpbSA9IGI7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRTa2lwUmVmKGJvb2xlYW4gYikgewotCQlza2lwUmVmID0gYjsKLQl9Ci0JCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBhZGRFeGNsdWRlZEZlYXR1cmUoU3RyaW5nIGZlYXR1cmVOYW1lKSB7Ci0JCXNraXBGZWF0dXJlU2V0LmFkZChmZWF0dXJlTmFtZSk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBhbmFseXplKCkgewotCQlpZiAoISBuZWVkVG9BbmFseXplKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJY29tcGFyZVJlc3VsdCA9IGVsZW1lbnRFcXVhbHMobGliMSwgbGJpMik7Ci0JCW5lZWRUb0FuYWx5emUgPSBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjb21wYXJlKCkgewotCQlhbmFseXplKCk7Ci0JCXJldHVybiBjb21wYXJlUmVzdWx0OwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRHcmVlZHkoYm9vbGVhbiBiKSB7Ci0JCWlmIChncmVlZHkgIT0gYikgewotCQkJbmVlZFRvQW5hbHl6ZSA9IHRydWU7Ci0JCX0KLQkJZ3JlZWR5ID0gYjsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0Q29tcGFyZU9wdGlvbihpbnQgaXgpIHsKLQkJaWYgKGNvbXBhcmVPcHRpb24gIT0gaXgpIHsKLQkJCW5lZWRUb0FuYWx5emUgPSB0cnVlOwotCQl9Ci0JCWNvbXBhcmVPcHRpb24gPSBpeDsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldFVzZU5hbWVBczJuZElkKGJvb2xlYW4gYikgewotCQl1c2VOYW1lQXMybmRJZCA9IGI7Ci0JfQotCQkKLQlwdWJsaWMgdm9pZCB0cmFjZShTdHJpbmcgbGluZSkgewotCQlpZiAodHJhY2VyID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQl0cmFjZXIudHJhY2UobGluZSk7Ci0JCWlmIChsb2NhbERlYnVnKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4obGluZSk7Ci0JCX0KLQl9Ci0JCi0JLy9Ub3AgZW50cnkgZm9yIGNvbXBhcml6b24KLQlwdWJsaWMgYm9vbGVhbiBlbGVtZW50RXF1YWxzKE1ldGhvZEVsZW1lbnQgZWxlbTEsICBNZXRob2RFbGVtZW50IGVsZW0yKSB7Ci0JCWRpZmZDb3VudCA9IDA7Ci0JCWVsZW1Db21wYXJlZENvdW50ID0gMDsKLQkJdHJhY2UoIiIpOwotCQl0cmFjZSgiZWxlbWVudEVxdWFscyAtPiAiKTsKLQkJdHJhY2UoImVsZW0xOiAiICsgZWxlbTEpOwotCQl0cmFjZSgiZWxlbTI6ICIgKyBlbGVtMiArICJcbiIpOwotCQljb21wYXJlKG5ldyBBcnJheUxpc3QoKSwgZWxlbTEsIGVsZW0yLCBuZXcgSGFzaE1hcCgpKTsKLQkJdHJhY2UoImVsZW1lbnRFcXVhbHMgPC0gZGlmZnM6ICIgKyBkaWZmQ291bnQgKyAiLCBlbGVtZW50czogIiArIGVsZW1Db21wYXJlZENvdW50ICsgIlxuIik7Ci0JCXJldHVybiBkaWZmQ291bnQgPT0gMDsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNvbXBhcmUoTGlzdCBwYXRoLCBNZXRob2RFbGVtZW50IGVsZW0xLCAgTWV0aG9kRWxlbWVudCBlbGVtMiwgTWFwIGNvbXBhcmVkRWxlbU1hcCkgewotCQlwYXRoLmFkZChlbGVtMSk7Ci0JCWVsZW1Db21wYXJlZENvdW50Kys7Ci0JCWNvbXBhcmVfKHBhdGgsIGVsZW0xLCBlbGVtMiwgY29tcGFyZWRFbGVtTWFwKTsKLQkJcGF0aC5yZW1vdmUocGF0aC5zaXplKCkgLSAxKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNvbXBhcmVfKExpc3QgcGF0aCwgTWV0aG9kRWxlbWVudCBlbGVtMSwgIE1ldGhvZEVsZW1lbnQgZWxlbTIsIE1hcCBjb21wYXJlZEVsZW1NYXApIHsKLQkJaWYgKGxvY2FsRGVidWcpIHsKLQkJCXRyYWNlKCJwYXRoOiAiICsgcGF0aFRvU3RyaW5nKHBhdGgpKTsKLQkJfQkJCQkKLQkJCi0JCWJvb2xlYW4gdG9wTGV2ZWwgPSBlbGVtMSA9PSBsaWIxICYmIGVsZW0yID09IGxiaTI7Ci0JCWJvb2xlYW4gY2hlY2tFcXVhbFNpemUgPSBjb21wYXJlT3B0aW9uID09IDAgJiYgIXRvcExldmVsOwotCQkKLQkJTGlzdCBjb250ZW50TGlzdDEgPSBlbGVtMS5lQ29udGVudHMoKTsKLQkJTGlzdCBjb250ZW50TGlzdDIgPSBlbGVtMi5lQ29udGVudHMoKTsKLQkJaW50IHN6MSA9IGNvbnRlbnRMaXN0MS5zaXplKCk7Ci0JCWludCBzejIgPSBjb250ZW50TGlzdDIuc2l6ZSgpOwotCQkKLQkJaWYgKCBjaGVja0VxdWFsU2l6ZSAmJiBzejEgIT0gc3oyKSB7Ci0JCQlTdHJpbmcgbXNnID0gInN6MSAhPSBzejI6ICIgKyBzejEgKyAiICE9ICIgKyBzejI7Ci0JCQlsb2dXYXJuaW5nKG1zZywgcGF0aCwgZWxlbTEsIGVsZW0yKTsJCQotCQl9CQkKLQkJCi0JCWludCBlbGVtQ291bnQxID0gMDsKLQkJSGFzaE1hcCBlbGVtZW50TWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJSGFzaE1hcCBlbGVtZW50TmFtZU1hcCA9IHVzZU5hbWVBczJuZElkID8gbmV3IEhhc2hNYXAoKSA6IG51bGw7Ci0JCUhhc2hNYXAgZWxlbWVudENoaWxkTWFwID0gdXNlTmFtZUFzMm5kSWQgPyBuZXcgSGFzaE1hcCgpIDogbnVsbDsKLQkJZm9yIChpbnQgaT0wOyBpIDwgc3oxOyBpKyspIHsKLQkJCU9iamVjdCBvYmogPSBjb250ZW50TGlzdDEuZ2V0KGkpOwotCQkJaWYgKHRvQ2hlY2tPYmplY3Qob2JqKSkgewotCQkJCWVsZW1Db3VudDErKzsKLQkJCQlTdHJpbmcgZ3VpZCA9ICgoTWV0aG9kRWxlbWVudCkgb2JqKS5nZXRHdWlkKCk7Ci0JCQkJU3RyaW5nIG5hbWUgPSAoKE1ldGhvZEVsZW1lbnQpIG9iaikuZ2V0TmFtZSgpOwotCQkJCWlmICghIGNvbXBhcmVkRWxlbU1hcC5jb250YWluc0tleShndWlkKSkgewotCQkJCQllbGVtZW50TWFwLnB1dChndWlkLCBvYmopOwotCQkJCQlpZiAodXNlTmFtZUFzMm5kSWQpIHsKLQkJCQkJCU9iamVjdCBvYmpJbk1hcCA9IGVsZW1lbnROYW1lTWFwLmdldChuYW1lKTsKLQkJCQkJCWlmIChvYmpJbk1hcCA9PSBudWxsKSB7Ci0JCQkJCQkJZWxlbWVudE5hbWVNYXAucHV0KG5hbWUsIG9iaik7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCUxpc3QgbGlzdCA9IG51bGw7Ci0JCQkJCQkJaWYgKG9iakluTWFwIGluc3RhbmNlb2YgTGlzdCkgewotCQkJCQkJCQlsaXN0ID0gKExpc3QpIG9iakluTWFwOwotCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCWxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCQkJCWxpc3QuYWRkKG9iakluTWFwKTsKLQkJCQkJCQl9Ci0JCQkJCQkJbGlzdC5hZGQob2JqKTsKLQkJCQkJCX0KLQkJCQkJCQotCQkJCQkJTGlzdCBjaGlsZExpc3QgPSBudWxsOwotCQkJCQkJaWYgKG9iaiBpbnN0YW5jZW9mIE1ldGhvZFBhY2thZ2UpIHsKLQkJCQkJCQljaGlsZExpc3QgPSAoKE1ldGhvZFBhY2thZ2UpIG9iaikuZUNvbnRlbnRzKCk7Ci0JCQkJCQl9Ci0JCQkJCQlpZiAoY2hpbGRMaXN0ICE9IG51bGwgJiYgISBjaGlsZExpc3QuaXNFbXB0eSgpKSB7Ci0JCQkJCQkJTWV0aG9kRWxlbWVudCBjaDAgPSAoTWV0aG9kRWxlbWVudCkgY2hpbGRMaXN0LmdldCgwKTsKLQkJCQkJCQllbGVtZW50Q2hpbGRNYXAucHV0KGNoMC5nZXRHdWlkKCksIG9iaik7Ci0JCQkJCQl9CQkJCQkJCi0JCQkJCX0KLQkJCQkJCi0JCQkJCWNvbXBhcmVkRWxlbU1hcC5wdXQoZ3VpZCwgb2JqKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaW50IGVsZW1Db3VudDIgPSAwOwotCQlmb3IgKGludCBpPTA7IGkgPCBzejI7IGkrKykgewotCQkJT2JqZWN0IG9iaiA9IGNvbnRlbnRMaXN0Mi5nZXQoaSk7Ci0JCQlpZiAodG9DaGVja09iamVjdChvYmopKSB7Ci0JCQkJZWxlbUNvdW50MisrOwotCQkJfQotCQl9Ci0JCWlmIChlbGVtQ291bnQxIDwgZWxlbUNvdW50MiB8fCBlbGVtQ291bnQxID4gZWxlbUNvdW50MiAmJiBjaGVja0VxdWFsU2l6ZSkgewotCQkJU3RyaW5nIG1zZyA9ICJlbGVtQ291bnQxICE9IGVsZW1Db3VudDI6ICIgKyBlbGVtQ291bnQxICsgIiAhPSAiICsgZWxlbUNvdW50MjsKLQkJCWxvZ0RpZmYobXNnLCBwYXRoLCBlbGVtMSwgZWxlbTIpOwotCQkJaWYgKCFncmVlZHkpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJCQkKLQkJaWYgKCEgKGVsZW0xIGluc3RhbmNlb2YgTWV0aG9kTGlicmFyeSkpIHsKLQkJCUxpc3QgcHJvcGVydGllcyA9IGVsZW0xLmdldEluc3RhbmNlUHJvcGVydGllcygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9wZXJ0aWVzLnNpemUoKTsgaSsrKSB7Ci0JCQkJRVByb3BlcnR5IGVwID0gKEVQcm9wZXJ0eSkgcHJvcGVydGllcy5nZXQoaSk7Ci0JCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBlcC5nZXRFU3RydWN0dXJhbEZlYXR1cmUoKTsKLQkJCQlpZiAoc2tpcEZlYXR1cmVTZXQuY29udGFpbnMoZmVhdHVyZS5nZXROYW1lKCkpKSB7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCQlPYmplY3QgdmFsMSA9ICIxIC4uLiA/IjsKLQkJCQlPYmplY3QgdmFsMiA9ICIyIC4uLiA/IjsKLQkJCQl0cnkgewotCQkJCQl2YWwxID0gZWxlbTEuZUdldChmZWF0dXJlKTsKLQkJCQkJdmFsMiA9IGVsZW0yLmVHZXQoZmVhdHVyZSk7Ci0JCQkJfSBjYXRjaCAoVGhyb3dhYmxlIGUpIHsJCQkJCQotCQkJCX0KLQkJCQlpZiAoISBmZWF0dXJlVmFsdWVFcXVhbHModmFsMSwgdmFsMikpIHsKLQkJCQkJaWYgKGZlYXR1cmUuZ2V0TmFtZSgpICE9ICJndWlkIiB8fCAhdXNlTmFtZUFzMm5kSWQpIHsKLQkJCQkJCVN0cmluZyBtc2cgPSAiRGlmZiB2YWx1ZXMgaW4gZmVhdHVyZTogIiArIGZlYXR1cmUuZ2V0TmFtZSgpOwotCQkJCQkJbG9nRGlmZihtc2csIHBhdGgsIGVsZW0xLCBlbGVtMiwgdmFsMSwgdmFsMik7Ci0JCQkJCQlpZiAoIWdyZWVkeSkgewotCQkJCQkJCXJldHVybjsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQkJCQotCQkvL0NvbXBhcmUgZm9yIGNvbnRhaW5lZCBlbGVtZW50cwkJCi0JCWZvciAoaW50IGk9MDsgaSA8IHN6MjsgaSsrKSB7Ci0JCQlPYmplY3Qgb2JqID0gY29udGVudExpc3QyLmdldChpKTsKLQkJCWlmICghIHRvQ2hlY2tPYmplY3Qob2JqKSkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJCi0JCQlNZXRob2RFbGVtZW50IHN1YkVsZW0yID0gKE1ldGhvZEVsZW1lbnQpIG9iajsKLQkJCU1ldGhvZEVsZW1lbnQgc3ViRWxlbTEgPSAoTWV0aG9kRWxlbWVudCkgZWxlbWVudE1hcC5nZXQoc3ViRWxlbTIuZ2V0R3VpZCgpKTsKLQkJCWlmICh1c2VOYW1lQXMybmRJZCAmJiBzdWJFbGVtMSA9PSBudWxsKSB7Ci0JCQkJT2JqZWN0IHN1Yk9iajEgPSBlbGVtZW50TmFtZU1hcC5nZXQoc3ViRWxlbTIuZ2V0TmFtZSgpKTsKLQkJCQlpZiAoc3ViT2JqMSBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCQkJc3ViRWxlbTEgPSAoTWV0aG9kRWxlbWVudCkgIHN1Yk9iajE7Ci0JCQkJfSBlbHNlIGlmIChzdWJPYmoxIGluc3RhbmNlb2YgTGlzdCkgewotCQkJCQlsb2dXYXJuaW5nKCJzdWJPYmoxIGlzIGxpc3Q6ICIgKyBzdWJPYmoxLnRvU3RyaW5nKCksIHBhdGgsIHN1YkVsZW0xLCBzdWJFbGVtMik7CQkJCi0JCQkJfQotCQkJCWlmIChzdWJFbGVtMSA9PSBudWxsICYmIHN1YkVsZW0yIGluc3RhbmNlb2YgTWV0aG9kUGFja2FnZSkgewotCQkJCQlMaXN0IGNoaWxkTGlzdCA9ICgoTWV0aG9kUGFja2FnZSkgc3ViRWxlbTIpLmVDb250ZW50cygpOwotCQkJCQlpZiAoY2hpbGRMaXN0ICE9IG51bGwgJiYgISBjaGlsZExpc3QuaXNFbXB0eSgpKSB7Ci0JCQkJCQlNZXRob2RFbGVtZW50IGNoMCA9IChNZXRob2RFbGVtZW50KSBjaGlsZExpc3QuZ2V0KDApOwotCQkJCQkJc3ViRWxlbTEgPSAgKE1ldGhvZEVsZW1lbnQpIGVsZW1lbnRDaGlsZE1hcC5nZXQoY2gwLmdldEd1aWQoKSk7Ci0JCQkJCX0JCi0JCQkJfQotCQkJfQotCQkJaWYgKHN1YkVsZW0xID09IG51bGwpIHsKLQkJCQlsb2dEaWZmKCJzdWJFbGVtMSA9PSBudWxsIiAsIHBhdGgsIHN1YkVsZW0xLCBzdWJFbGVtMik7CQkJCi0JCQkJaWYgKCFncmVlZHkpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQljb250aW51ZTsKLQkJCX0JCQkKLQkJCWNvbXBhcmUocGF0aCwgc3ViRWxlbTEsIHN1YkVsZW0yLCBjb21wYXJlZEVsZW1NYXApOwkJCQotCQkJaWYgKGRpZmZDb3VudCA+IDAgJiYgIWdyZWVkeSkgewotCQkJCXJldHVybjsKLQkJCX0KLQkJfQkJCQkJCi0JfQotCQotCXByaXZhdGUgYm9vbGVhbiBmZWF0dXJlVmFsdWVFcXVhbHMoT2JqZWN0IHZhbDEsIE9iamVjdCB2YWwyKSB7Ci0JCWlmICh2YWwxID09IG51bGwpIHsKLQkJCXJldHVybiB2YWwyID09IG51bGw7Ci0JCX0KLQkJCi0JCWlmICh2YWwyID09IG51bGwpIHsKLQkJCXJldHVybiB2YWwxID09IG51bGw7Ci0JCX0KLQkJCi0JCWlmICh2YWwxIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJaWYgKCEgKHZhbDEgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCWJvb2xlYW4gYiAgPSAoKE1ldGhvZEVsZW1lbnQpIHZhbDEpLmdldEd1aWQoKS5lcXVhbHMoKChNZXRob2RFbGVtZW50KSB2YWwxKS5nZXRHdWlkKCkpOwotCQkJaWYgKCFiICYmIHVzZU5hbWVBczJuZElkKSB7Ci0JCQkJYiA9ICgoTWV0aG9kRWxlbWVudCkgdmFsMSkuZ2V0TmFtZSgpLmVxdWFscygoKE1ldGhvZEVsZW1lbnQpIHZhbDEpLmdldE5hbWUoKSk7Ci0JCQl9Ci0JCQlyZXR1cm4gYjsKLQkJfQkJCQkKLQkJCi0JCWludCBvcHRpb24gPSAwOyAJLy8wOiBub3QgdG8gY29tcGFyZSBsaXN0IHZhbHVlcwotCQkJCQkJCS8vMTogICAgICAgIGNvbXBhcmUgbGlzdCB2YWx1ZXMKLQkJCQkJCQkvLzI6CQljb21wYXJlIHNpemUgc3RyaWN0bHkKLQkJaWYgKG9wdGlvbiA+IDAgJiYgdmFsMSBpbnN0YW5jZW9mIExpc3QpIHsJCQkKLQkJCWlmICghICh2YWwyIGluc3RhbmNlb2YgTGlzdCkpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQlMaXN0IGwxID0gKExpc3QpIHZhbDE7Ci0JCQlMaXN0IGwyID0gKExpc3QpIHZhbDI7Ci0JCQlpZiAobDEuc2l6ZSgpIDwgbDIuc2l6ZSgpKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJCi0JCQlpZiAob3B0aW9uID4gMSAmJiBsMS5zaXplKCkgPiBsMi5zaXplKCkpIHsJCQotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQotCQkJYm9vbGVhbiBtZSA9IGwxLnNpemUoKSA9PSAwID8gZmFsc2UgOiBsMS5nZXQoMCkgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50OwotCQkJaWYgKG1lKSB7Ci0JCQkJTWFwIG1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCQkJTWFwIG5hbWVNYXAgPSB1c2VOYW1lQXMybmRJZCA/IG5ldyBIYXNoTWFwKCkgOiBudWxsOwotCQkJCWZvciAoaW50IGk9MDsgaTxsMS5zaXplKCk7IGkrKykgewotCQkJCQlNZXRob2RFbGVtZW50IGUxID0gKE1ldGhvZEVsZW1lbnQpIGwxLmdldChpKTsKLQkJCQkJbWFwLnB1dChlMS5nZXRHdWlkKCksIGUxKTsKLQkJCQkJaWYgKHVzZU5hbWVBczJuZElkKSB7Ci0JCQkJCQluYW1lTWFwLnB1dChlMS5nZXROYW1lKCksIGUxKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlmb3IgKGludCBpPTA7IGk8bDIuc2l6ZSgpOyBpKyspIHsKLQkJCQkJTWV0aG9kRWxlbWVudCBlMiA9IChNZXRob2RFbGVtZW50KSBsMi5nZXQoaSk7Ci0JCQkJCWJvb2xlYW4gZm91bmQgPSBtYXAuY29udGFpbnNLZXkoZTIuZ2V0R3VpZCgpKSB8fCAKLQkJCQkJCQl1c2VOYW1lQXMybmRJZCAmJiBuYW1lTWFwLmNvbnRhaW5zS2V5KGUyLmdldE5hbWUoKSk7Ci0JCQkJCWlmICghZm91bmQpIHsKLQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJfQotCQkJCX0JCQkJCQotCQkJfSBlbHNlIHsKLQkJCQlmb3IgKGludCBpPTA7IGk8bDEuc2l6ZSgpOyBpKyspIHsKLQkJCQkJaWYgKCEgKGZlYXR1cmVWYWx1ZUVxdWFscyhsMS5nZXQoaSksIGwyLmdldChpKSkpKSAgewotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQkJCi0JCWlmICh2YWwxIGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0JCQlpZiAoISh2YWwyIGluc3RhbmNlb2YgU3RyaW5nKSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCVN0cmluZyBzdHIxID0gKFN0cmluZykgdmFsMTsKLQkJCVN0cmluZyBzdHIyID0gKFN0cmluZykgdmFsMjsKLQkJCWlmIChza2lwUmVmKSB7Ci0JCQkJc3RyMSA9IHJlcGxhY2VSZWZXaXRoRHVtbXkoc3RyMSk7Ci0JCQkJc3RyMiA9IHJlcGxhY2VSZWZXaXRoRHVtbXkoc3RyMik7Ci0JCQl9Ci0JCQkKLQkJCWlmICh0cmltKSB7Ci0JCQkJc3RyMSA9IHN0cjEudHJpbSgpOwotCQkJCXN0cjIgPSBzdHIyLnRyaW0oKTsKLQkJCQlpZiAodXNlTmFtZUFzMm5kSWQgJiYgc3RyMS5sZW5ndGgoKSA+IDI1MCAmJiBzdHIyLmxlbmd0aCgpID4gMjUwKSB7Ci0JCQkJCXN0cjEgPSBzdHIxLnN1YnN0cmluZygwLCAyNTApOwotCQkJCQlzdHIyID0gc3RyMi5zdWJzdHJpbmcoMCwgMjUwKTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gc3RyMS5lcXVhbHMoc3RyMik7Ci0JCX0KLQkJCi0JCXJldHVybiB0cnVlOwotCX0KLQkKLQlwcml2YXRlIGludCBpbmNEaWZmQ291bnQoKSB7Ci0JCXJldHVybiArK2RpZmZDb3VudDsKLQl9Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0RGlmZlByb21wdCgpIHsKLQkJcmV0dXJuICJEXyIgKyBkaWZmQ291bnQgKyAiPiAiOwkKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGxvZ1dhcm5pbmcoU3RyaW5nIG1zZywgTGlzdCBwYXRoLCBNZXRob2RFbGVtZW50IGVsZW0xLCBNZXRob2RFbGVtZW50IGVsZW0yKSB7Ci0JCWxvZyhtc2csIHBhdGgsIGVsZW0xLCBlbGVtMiwgZmFsc2UpOwotCQl0cmFjZSgiIik7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBsb2dEaWZmKFN0cmluZyBtc2csIExpc3QgcGF0aCwgTWV0aG9kRWxlbWVudCBlbGVtMSwgTWV0aG9kRWxlbWVudCBlbGVtMikgewotCQlsb2cobXNnLCBwYXRoLCBlbGVtMSwgZWxlbTIsIHRydWUpOwotCQl0cmFjZSgiIik7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBsb2coU3RyaW5nIG1zZywgTGlzdCBwYXRoLCBNZXRob2RFbGVtZW50IGVsZW0xLCBNZXRob2RFbGVtZW50IGVsZW0yLCBib29sZWFuIGRpZmYpIHsKLQkJaWYgKGRpZmYpIHsKLQkJCWluY0RpZmZDb3VudCgpOwotCQl9Ci0JCVN0cmluZyBwcm9tcHQgPSBkaWZmID8gZ2V0RGlmZlByb21wdCgpIDogIldhcm5pbmc+ICI7Ci0JCXRyYWNlKHByb21wdCArICJwYXRoOiAiICsgcGF0aFRvU3RyaW5nKHBhdGgpKTsKLQkJdHJhY2UocHJvbXB0ICsgIm1zZzogIiArIG1zZyk7Ci0JCU1ldGhvZEVsZW1lbnQgZWxlbTAgPSAoTWV0aG9kRWxlbWVudCkgcGF0aC5nZXQocGF0aC5zaXplKCkgLSAxKTsKLQkJaWYgKGVsZW0wICE9IGVsZW0xKSB7Ci0JCQl0cmFjZShwcm9tcHQgKyBnZXRFbGVtU3RyaW5nKGVsZW0wLCAiZWxlbTAiKSk7Ci0JCX0KLQkJdHJhY2UocHJvbXB0ICsgZ2V0RWxlbVN0cmluZyhlbGVtMSwgImVsZW0xIikpOwotCQl0cmFjZShwcm9tcHQgKyBnZXRFbGVtU3RyaW5nKGVsZW0yLCAiZWxlbTIiKSk7Ci0JfQotCQotCXByaXZhdGUgU3RyaW5nIGdldEVsZW1TdHJpbmcoTWV0aG9kRWxlbWVudCBlbGVtLCBTdHJpbmcgbGFiZWwpIHsKLQkJU3RyaW5nIHN0ciA9IGxhYmVsOwotCQlpZiAoZWxlbSA9PSBudWxsKSB7Ci0JCQlzdHIgKz0gIiAtPiBudWxsIjsKLQkJfSBlbHNlIHsJCQotCQkJc3RyICs9ICIgLT4gdHlwZTogIiArIGdldENsYXNzTGFzdE5hbWUoZWxlbSkgKyAiLCBuYW1lOiAiICsgZWxlbS5nZXROYW1lKCkgKyAiLCBndWlkOiAiICsgZWxlbS5nZXRHdWlkKCk7Ci0JCX0KLQkJcmV0dXJuIHN0cjsKLQl9Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0Q2xhc3NMYXN0TmFtZShPYmplY3Qgb2JqKSB7Ci0JCVN0cmluZyBzdHIgPSBvYmouZ2V0Q2xhc3MoKS5nZXROYW1lKCk7Ci0JCWludCBpeCA9IHN0ci5sYXN0SW5kZXhPZigiLiIpICsgMTsKLQkJcmV0dXJuIHN0ci5zdWJzdHJpbmcoaXgpOwkJCi0JfQotCQotCXByaXZhdGUgdm9pZCBsb2dEaWZmKFN0cmluZyBtc2csIExpc3QgcGF0aCwgTWV0aG9kRWxlbWVudCBlbGVtMSwgTWV0aG9kRWxlbWVudCBlbGVtMiwgT2JqZWN0IHZhbDEsIE9iamVjdCB2YWwyKSB7Ci0JCWxvZyhtc2csIHBhdGgsIGVsZW0xLCBlbGVtMiwgdHJ1ZSk7Ci0JCVN0cmluZyBwcm9tcHQgPSBnZXREaWZmUHJvbXB0KCk7Ci0JCXRyYWNlKHByb21wdCArICJ2YWwxOiAiICsgdmFsMSk7Ci0JCXRyYWNlKHByb21wdCArICJ2YWwyOiAiICsgdmFsMik7CQotCQl0cmFjZSgiIik7Ci0JfQkKLQkKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgcGF0aFRvU3RyaW5nKExpc3QgcGF0aCkgewotCQlTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlmb3IgKGludCBpPTA7IGk8cGF0aC5zaXplKCk7IGkrKykgewotCQkJTWV0aG9kRWxlbWVudCBlbGVtID0gKE1ldGhvZEVsZW1lbnQpIHBhdGguZ2V0KGkpOwotCQkJaWYgKGVsZW0gaW5zdGFuY2VvZiBNZXRob2RMaWJyYXJ5KSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlpZiAoYnVmLmxlbmd0aCgpID4gMCkgewotCQkJCWJ1Zi5hcHBlbmQoIjoiKTsKLQkJCX0KLQkJCWJ1Zi5hcHBlbmQoZWxlbS5nZXROYW1lKCkpOwotCQl9Ci0JCXJldHVybiBidWYudG9TdHJpbmcoKTsKLQl9Ci0JCi0JcHVibGljIGludCBnZXREaWZmQ291bnQoKSB7Ci0JCXJldHVybiBkaWZmQ291bnQ7Ci0JfQotCQotCXB1YmxpYyBpbnQgZ2V0RWxlbUNvbXBhcmVkQ291bnQoKSB7Ci0JCXJldHVybiBlbGVtQ29tcGFyZWRDb3VudDsKLQl9Ci0JCi0JcHJpdmF0ZSBib29sZWFuIHRvQ2hlY2tPYmplY3QoT2JqZWN0IG9iaikgewotCQlpZiAoISAob2JqIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQkKLQkJaWYgKHVzZU5hbWVBczJuZElkICYmIG9iaiBpbnN0YW5jZW9mIERpYWdyYW0pIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQkKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIEdyYXBoTm9kZSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCQotCXByaXZhdGUgU3RyaW5nIHJlcGxhY2VSZWZXaXRoRHVtbXkoU3RyaW5nIHNvdXJjZSkgewkJCi0JCVN0cmluZyByZXQgPSByZXBsYWNlUmVmV2l0aER1bW15KHNvdXJjZSwgUmVzb3VyY2VTY2FubmVyLnBfc3JjX3JlZiwgZW1wdHlTdHJpbmcpOwotCQlyZXQgPSByZXBsYWNlUmVmV2l0aER1bW15KHJldCwgUmVzb3VyY2VTY2FubmVyLnBfaHJlZl9yZWYsIGVtcHR5U3RyaW5nKTsKLQkJcmV0ID0gcmVwbGFjZVJlZldpdGhEdW1teShyZXQsIGVtcHR5TGluZSwgZW1wdHlTdHJpbmcpOwotCQlpZiAoZmFsc2UgJiYgIXNvdXJjZS5lcXVhbHMocmV0KSkgewotCQkJdHJhY2UoIkxEPiBzb3VyY2U6ICIgKyBzb3VyY2UpOwotCQkJdHJhY2UoIkxEPiByZXQ6ICAgICIgKyByZXQpOwotCQl9Ci0JCXJldHVybiByZXQ7Ci0JfQotCQotCXByaXZhdGUgU3RyaW5nIHJlcGxhY2VSZWZXaXRoRHVtbXkoU3RyaW5nIHNvdXJjZSwgUGF0dGVybiBwYXR0ZXJuLCBTdHJpbmcgcmVwbGFjZSkgewotCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCU1hdGNoZXIgbSA9IHBhdHRlcm4ubWF0Y2hlcihzb3VyY2UpOwotCQotCQl3aGlsZSAobS5maW5kKCkpIHsKLQkJCVN0cmluZyB0ZXh0ID0gbS5ncm91cCgpOwkJCQkJCQotCQkJbS5hcHBlbmRSZXBsYWNlbWVudChzYiwgcmVwbGFjZSk7CQotCQl9Ci0KLQkJbS5hcHBlbmRUYWlsKHNiKTsKLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0ZXIvTGlicmFyeUp1bml0VGVzdFNlcnZpY2UuamF2YSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdGVyL0xpYnJhcnlKdW5pdFRlc3RTZXJ2aWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2YzYzYTcuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0ZXIvTGlicmFyeUp1bml0VGVzdFNlcnZpY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXI7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5pZmFjZS5MaWJyYXJ5SnVuaXRUZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5pZmFjZS5MaWJyYXJ5VGVzdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5pZmFjZS5UZXN0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXIuaWZhY2UuVGVzdFRyYWNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy5UZXN0c1BsdWdpbjsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIHByb3ZpZGVzIExpYnJhcnlUZXN0ZXIgc2VydmljZSBhbmQgaXMgdXNlZCBpbiBMaWJyYXJ5SnVuaXRUZXN0LiAgCi0gKiAKLSAqIEBhdXRob3IgV2VpcGluZyBMdQotICogQHNpbmNlIDEuMAotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBMaWJyYXJ5SnVuaXRUZXN0U2VydmljZSBleHRlbmRzIFRlc3RGb2xkZXJTZXR1cCBpbXBsZW1lbnRzIFRlc3RUcmFjZXIgewotCQotCXByaXZhdGUgc3RhdGljIFN0cmluZyB0ZXN0R3JvdXBOYW1lID0gIkp1bml0VGVzdHMiOwotCXByaXZhdGUgc3RhdGljIEZpbGUgdGVzdEdyb3VwOwotCQkKLQlwcml2YXRlIExpYnJhcnlUZXN0ZXIgdGVzdGVyOwotCQotCXByaXZhdGUgc3RhdGljIE1hcCBpbnN0YW5jZXMgPSBuZXcgSGFzaE1hcCgpOwotCXByaXZhdGUgRmlsZSB0b3BDbGVhblVwRm9sZGVyOwotCQotCXByaXZhdGUgTGlicmFyeUp1bml0VGVzdFNlcnZpY2UgKCkgewotCQl0ZXN0ZXIgPSBMaWJyYXJ5VGVzdGVyRmFjdG9yeS5uZXdUZXN0ZXIoZmFsc2UpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIExpYnJhcnlKdW5pdFRlc3RTZXJ2aWNlIGdldEluc3RhbmNlKExpYnJhcnlKdW5pdFRlc3QgdGVzdENhc2UpIHsKLQkJQ2xhc3MgdGVzdENsYXNzID0gdGVzdENhc2UuZ2V0Q2xhc3MoKTsgCi0JCUxpYnJhcnlKdW5pdFRlc3RTZXJ2aWNlIGluc3RhbmNlID0gKExpYnJhcnlKdW5pdFRlc3RTZXJ2aWNlKSBpbnN0YW5jZXMuZ2V0KHRlc3RDbGFzcyk7Ci0JCWlmIChpbnN0YW5jZSA9PSBudWxsKSB7Ci0JCQlpbnN0YW5jZSA9IG5ldyBMaWJyYXJ5SnVuaXRUZXN0U2VydmljZSgpOwotCQkJaW5zdGFuY2VzLnB1dCh0ZXN0Q2xhc3MsIGluc3RhbmNlKTsKLQkJfQotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotCQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgRmlsZSBnZXRUZXN0R3JvdXAoKSB7Ci0JCWlmICh0ZXN0R3JvdXAgPT0gbnVsbCkgewotCQkJU3RyaW5nIHBhdGggPSBnZXRUZXN0SG9tZSgpLmdldEFic29sdXRlUGF0aCgpICsgRmlsZS5zZXBhcmF0b3IgKyB0ZXN0R3JvdXBOYW1lOwotCQkJdGVzdEdyb3VwID0gbmV3IEZpbGUocGF0aCk7Ci0JCX0KLQkJcmV0dXJuIHRlc3RHcm91cDsKLQl9Ci0JCi0JLyoqCi0JICogQ2FsbGVkIGZyb20gTGlicmFyeUp1bml0VGVzdCdzIHNldFVwIG1ldGhvZCB0byB1cGRhdGUgdGVzdGVyJ3MKLQkgKiBmb2xkZXIgc2V0dXAuCi0JICovCi0JcHVibGljIHZvaWQgc2V0VXAoRmlsZSB0ZXN0Um9vdFNvdXJjZSwgRmlsZSB0ZXN0Um9vdFdvcmtpbmcsIEZpbGUgdGVzdERpciwgTGlicmFyeUp1bml0VGVzdCB0ZXN0Q2FzZSkgewotCQl0ZXN0ZXIuc2V0VGVzdFJvb3RTb3VyY2UodGVzdFJvb3RTb3VyY2UpOwotCQl0ZXN0ZXIuc2V0VGVzdFJvb3RXb3JraW5nKHRlc3RSb290V29ya2luZyk7Ci0JCUZpbGUgcGFyZW50ID0gdGVzdFJvb3RXb3JraW5nLmdldFBhcmVudEZpbGUoKTsKLQkJaWYgKHRvcENsZWFuVXBGb2xkZXIgPT0gbnVsbCkgewotCQkJdG9wQ2xlYW5VcEZvbGRlciA9IHBhcmVudDsKLQkJfSBlbHNlIGlmICghIHRvcENsZWFuVXBGb2xkZXIuZXF1YWxzKHBhcmVudCkpewotCQkJLy9Xb24ndCBoYXBwZW4gZm9yIG5vdwotCQl9Ci0JCXRlc3Rlci5vcGVuQ3VyclRlc3REaXIodGVzdERpcik7Ci0JfQkKLQkKLQkvKioKLQkgKiBDYWxsZWQgZnJvbSBMaWJyYXJ5SnVuaXRUZXN0J3MgdGVhckRvd24gbWV0aG9kIHRvIGNsZWFyIHNvbWUKLQkgKiByZXNvdXJjZXMgaW4gdGVzdGVyLgotCSAqLwotCXB1YmxpYyB2b2lkIHRlYXJEb3duKExpYnJhcnlKdW5pdFRlc3QgdGVzdENhc2UpIHsKLQkJdGVzdGVyLmNsb3NlQ3VyclRlc3REaXIoKTsKLQkJaWYgKHRlc3Rlci5pbmNFeGVjdXRlZFRlc3RDb3VudCgpID09IHRlc3RDYXNlLm51bVRlc3RDYXNlcygpKSB7Ci0JCQl0ZXN0ZXIuZG9uZVdpdGhBbGxUZXN0cyhnZXRUZXN0R3JvdXAoKSk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlIGEgdGVzdCBjb21tYW5kIGluc3RhbmNlIG9mIHRoZSB0cHllICJjbHMiLgotCSAqLwotCXB1YmxpYyBUZXN0Q29tbWFuZCBuZXdUZXN0Q29tbWFuZChDbGFzcyBjbHMpIHsKLQkJcmV0dXJuIHRlc3RlciA9PSBudWxsID8gbnVsbCA6IHRlc3Rlci5uZXdUZXN0Q29tbWFuZChjbHMpOwotCX0KLQkKLQkvKioKLQkgKiBUcmFjaW5nIG1ldGhvZCB0aGF0IGNhbiBiZSBjYWxsZWQgYnkgaW4gTGlicmFyeUp1bml0VGVzdCdzIGNvZGUuCi0JICovCi0JcHVibGljIHZvaWQgdHJhY2UoU3RyaW5nIGxpbmUpIHsKLQkJaWYgKHRlc3RlciAhPSBudWxsKSB7Ci0JCQl0ZXN0ZXIudHJhY2UobGluZSk7Ci0JCX0KLQl9Ci0JCi19CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3Rlci9MaWJyYXJ5VGVzdFNlcnZpY2UuamF2YSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdGVyL0xpYnJhcnlUZXN0U2VydmljZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMGJhZTBiLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdGVyL0xpYnJhcnlUZXN0U2VydmljZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RlcjsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5GaWxlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wcm9qZWN0Lk1ldGhvZExpYnJhcnlQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnNlcnZpY2VzLlNhZmVVcGRhdGVDb250cm9sbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuTGlicmFyeVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLQotLyoqCi0gKiBVdGlsaXR5IGNsYXNzIHVzZWQgaW4gSlVuaXQgdGVzdHMgZm9yIGxpYnJhcnkgZXhwb3J0L2ltcG9ydAotICogCi0gKiBAYXV0aG9yIFdlaXBpbmcgTHUKLSAqIEBzaW5jZSAxLjAKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgTGlicmFyeVRlc3RTZXJ2aWNlIHsJCi0JCi0JcHJpdmF0ZSBzdGF0aWMgTGlicmFyeVRlc3RTZXJ2aWNlIGluc3RhbmNlID0gbmV3IExpYnJhcnlUZXN0U2VydmljZSgpOwkKLQkJCi0JcHJpdmF0ZSBMaWJyYXJ5VGVzdFNlcnZpY2UoKSB7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgTGlicmFyeVRlc3RTZXJ2aWNlIGdldEluc3RhbmNlKCkgewotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQkKLQkJCQotCXB1YmxpYyBNZXRob2RMaWJyYXJ5IGNyZWF0ZUxpYnJhcnkoU3RyaW5nIHBhdGgsIFN0cmluZyBsaWJOYW1lKSB7Ci0JCXRyeSB7Ci0JCQlNYXAgcGFyYW1zID0gbmV3IEhhc2hNYXAoKTsKLQkJCXBhcmFtcy5wdXQoImxpYnJhcnkucGF0aCIsIHBhdGgpOyAvLyROT04tTkxTLTEkCi0JCQlNZXRob2RMaWJyYXJ5IGxpYiA9IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLQkJCQkJLmNyZWF0ZU1ldGhvZExpYnJhcnkobGliTmFtZSwgInhtaSIsIHBhcmFtcyk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5zZXRDdXJyZW50TWV0aG9kTGlicmFyeShsaWIpOwotCQkJcmV0dXJuIGxpYjsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQlleC5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogY2xvc2UgdGhlIHRlbXAgbGlicmFyeSBhbmQgZGVsZXRlIHRoZSBsaWJyYXJ5IHJlc291cmNlIGZpbGVzCi0JICoKLQkgKi8KLQlwdWJsaWMgdm9pZCBjbG9zZUxpYnJhcnkoTWV0aG9kTGlicmFyeSBsaWIpIHsKLQkJaWYgKGxpYiA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJdHJ5IHsKLQkJCWlmIChsaWIgIT0gb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpKSB7Ci0JCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JCQl9Ci0JCQkKLQkJCUZpbGUgbGliRm9sZGVyID0gbmV3IEZpbGUobGliLmVSZXNvdXJjZSgpLmdldFVSSSgpLnRvRmlsZVN0cmluZygpKS5nZXRQYXJlbnRGaWxlKCk7Ci0JCQkKLQkJCW9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLQkJCQkuY2xvc2VDdXJyZW50TWV0aG9kTGlicmFyeSgpOwkJCi0JCQkKLQkJCU1ldGhvZExpYnJhcnlQcm9qZWN0LmNsb3NlUHJvamVjdChsaWJGb2xkZXIuZ2V0QWJzb2x1dGVQYXRoKCksIG51bGwpOwotCQkJCi0JCX0gY2F0Y2goRXhjZXB0aW9uIGV4KSB7Ci0JCQlleC5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgTWV0aG9kTGlicmFyeSBsb2FkTGlicmFyeShmaW5hbCBTdHJpbmcgcGF0aCkgewotCQlmaW5hbCBNZXRob2RMaWJyYXJ5W10gbGliID0gbmV3IE1ldGhvZExpYnJhcnlbMV07Ci0JCWxpYlswXSA9IG51bGw7Ci0JCQotCQlTYWZlVXBkYXRlQ29udHJvbGxlci5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJTWV0aG9kTGlicmFyeVByb2plY3Qub3BlblByb2plY3QocGF0aCwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCQkJCWxpYlswXSA9IExpYnJhcnlVdGlsLmxvYWRMaWJyYXJ5KHBhdGggKyBGaWxlLnNlcGFyYXRvciArICJsaWJyYXJ5LnhtaSIpOwotCQkJCQlNZXRob2RMaWJyYXJ5UHJvamVjdC5jbG9zZVByb2plY3QocGF0aCwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JCXJldHVybiBsaWJbMF07Ci0JfQkJCi0JCi0JcHVibGljIHZvaWQgZGVsZXRlRm9sZGVyKEZpbGUgZm9sZGVyKSB7Ci0JCWlmIChmb2xkZXIgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCUZpbGVVdGlsLmRlbGV0ZUFsbEZpbGVzKGZvbGRlci5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0JCWZvbGRlci5kZWxldGUoKTsKLQl9CQkJCi0JCi0JcHVibGljIHN0YXRpYyBNZXRob2RFbGVtZW50IGdldEVsZW1lbnQoTGlzdCBlbGVtZW50cywgU3RyaW5nIG5hbWUpIHsKLQkJaW50IHN6ID0gZWxlbWVudHMgPT0gbnVsbCA/IDAgOiBlbGVtZW50cy5zaXplKCk7Ci0JCWlmIChzeiA9PSAwKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlmb3IgKGludCBpPTA7IGk8c3o7IGkrKykgewotCQkJT2JqZWN0IG9iaiA9IGVsZW1lbnRzLmdldChpKTsKLQkJCU1ldGhvZEVsZW1lbnQgZWxlbSA9IG9iaiBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQgPyAoTWV0aG9kRWxlbWVudCkgb2JqIDogbnVsbDsKLQkJCWlmIChlbGVtICE9IG51bGwgJiYgZWxlbS5nZXROYW1lKCkuZXF1YWxzKG5hbWUpKSB7Ci0JCQkJcmV0dXJuIGVsZW07Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdGVyL0xpYnJhcnlUZXN0ZXJGYWN0b3J5LmphdmEgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3Rlci9MaWJyYXJ5VGVzdGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNGJkMWRjLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdGVyL0xpYnJhcnlUZXN0ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXIuaWZhY2UuTGlicmFyeVRlc3RlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXIuaW1wbC5MaWJyYXJ5VGVzdGVySW1wbDsKLQotLyoqCi0gKiBDbGFzcyBmYWN0b3J5IGZvciBMaWJyYXJ5VGVzZXIgaW5zdGFuY2VzCi0gKiAKLSAqIEBhdXRob3IgV2VpcGluZyBMdQotICogQHNpbmNlIDEuMAotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBMaWJyYXJ5VGVzdGVyRmFjdG9yeSB7CQotCQotCXB1YmxpYyBzdGF0aWMgTGlicmFyeVRlc3RlciBuZXdUZXN0ZXIoYm9vbGVhbiB0cmFjZSkgewkJCQotCQlyZXR1cm4gbmV3IExpYnJhcnlUZXN0ZXJJbXBsKHRyYWNlKTsKLQl9Ci0JCQkKLX0KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdGVyL091dHB1dERpZmZBbmFseXpvci5qYXZhIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0ZXIvT3V0cHV0RGlmZkFuYWx5em9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzMjJiZGQuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0ZXIvT3V0cHV0RGlmZkFuYWx5em9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMDAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmEudXRpbC5TdGFjazsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuWE1MVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXIuaWZhY2UuVGVzdFRyYWNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLQotLyoqCi0gKiBDbGFzcyB0byBhbmFseXplIHRoZSBkaWZmZXJuZWNlcyBiZXR3ZWVuIHR3byBsaWJyYXJ5IHRlc3RlciBvdXRwdXRzCi0gKiAKLSAqIEBhdXRob3IgV2VpcGluZyBMdQotICogQHNpbmNlIDEuMAotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBPdXRwdXREaWZmQW5hbHl6b3IgewotCQotCXByaXZhdGUgYm9vbGVhbiBsb2NhbERlYnVnID0gZmFsc2U7Ci0JcHJpdmF0ZSBUZXN0VHJhY2VyIHRyYWNlcjsKLQlwcml2YXRlIGJvb2xlYW4gbmVlZFRvQW5hbHl6ZSA9IHRydWU7IAotCXByaXZhdGUgRmlsZSBmMTsKLQlwcml2YXRlIEZpbGUgZjI7Ci0JcHJpdmF0ZSBEb2N1bWVudCBkMTsKLQlwcml2YXRlIERvY3VtZW50IGQyOwotCXByaXZhdGUgaW50IGRpZmZDb3VudCA9IDA7Ci0JcHJpdmF0ZSBpbnQgZWxlbUNvbXBhcmVkQ291bnQgPSAwOwotCQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gZXhjbHVkZUd1aWRGcm9tTmFtZSA9IHRydWU7Ci0JLy9NYXkgd2FudCB0byB1c2UgZmVhdHVyZSBjbGFzc2VzIGRpcmVjdGx5IGluc3RlYWQgb2YgbmFtZXMgbGF0ZXIKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmdbXSBleGNsdWRlZEZlYXR1cmVzID0gewotCQkiZ3VpZCIsCi0JCSJjaGFuZ2VEYXRlIgotCX07Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgU2V0IGV4Y2x1ZGVkRmVhdHVyZVNldCA9IG5ldyBIYXNoU2V0KCk7Ci0JCi0Jc3RhdGljIHsKLQkJZm9yIChpbnQgaT0wOyBpPGV4Y2x1ZGVkRmVhdHVyZXMubGVuZ3RoOyBpKyspIHsKLQkJCWV4Y2x1ZGVkRmVhdHVyZVNldC5hZGQoZXhjbHVkZWRGZWF0dXJlc1tpXSk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIE91dHB1dERpZmZBbmFseXpvcihUZXN0VHJhY2VyIHQsIERvY3VtZW50IGQxLCBEb2N1bWVudCBkMiwgRmlsZSBmMSwgRmlsZSBmMikgewotCQl0cmFjZXIgPSB0OwotCQl0aGlzLmYxID0gZjE7Ci0JCXRoaXMuZjIgPSBmMjsKLQkJdGhpcy5kMSA9IGQxID09IG51bGwgPyBnZXREb2N1bWVudChmMSkgOiBkMTsKLQkJdGhpcy5kMiA9IGQyID09IG51bGwgPyBnZXREb2N1bWVudChmMikgOiBkMjsKLQl9CQkKLQkKLQlwcml2YXRlIERvY3VtZW50IGdldERvY3VtZW50KEZpbGUgZmlsZSkgewotCQlpZiAoZmlsZS5leGlzdHMoKSkgewotCQkJdHJ5IHsKLQkJCQlyZXR1cm4gWE1MVXRpbC5sb2FkWG1sKGZpbGUpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgdHJhY2UoU3RyaW5nIGxpbmUpIHsKLQkJdHJhY2VyLnRyYWNlKGxpbmUpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgYW5hbHl6ZSgpIHsKLQkJdHJhY2UoIk91dHB1dERpZmZBbmFseXpvci5hbmFseXplIC0+Iik7Ci0JCXRyYWNlKCJmMTogIiArIGYxLmdldEFic29sdXRlUGF0aCgpKTsKLQkJdHJhY2UoImYyOiAiICsgZjIuZ2V0QWJzb2x1dGVQYXRoKCkpOwotCQl0cmFjZSgiIik7CQkKLQkJYW5hbHl6ZV8oKTsKLQkJdHJhY2UoIk91dHB1dERpZmZBbmFseXpvci5hbmFseXplIDwtIik7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBhbmFseXplXygpIHsKLQkJaWYgKCEgbmVlZFRvQW5hbHl6ZSkgewotCQkJdHJhY2UoIm5vIG5lZWQgdG8gYW5hbHlzZSIpOwotCQkJcmV0dXJuOwotCQl9Ci0JCWNvbXBhcmVSb290KGQxLmdldERvY3VtZW50RWxlbWVudCgpLCBkMi5nZXREb2N1bWVudEVsZW1lbnQoKSk7Ci0JCW5lZWRUb0FuYWx5emUgPSBmYWxzZTsKLQl9Ci0JCi0vLwlUb3AgZW50cnkgZm9yIG1ldGhvZCBlbGVtZW50IGNvbXBhcmlzb24KLQlwdWJsaWMgdm9pZCBjb21wYXJlUm9vdChFbGVtZW50IHJvb3QxLCAgRWxlbWVudCByb290MikgewkJCi0JCWRpZmZDb3VudCA9IDA7Ci0JCWVsZW1Db21wYXJlZENvdW50ID0gMTsJCQotCQl0cmFjZSgiIik7Ci0JCXRyYWNlKCJjb21wYXJlUm9vdCAtPiAiKTsKLQkKLQkJTGlzdCBlbGVtZW50TGlzdDEgPSBjb2xsZWN0RWxlbWVudHMocm9vdDEuZ2V0Q2hpbGROb2RlcygpKTsKLQkJTGlzdCBlbGVtZW50TGlzdDIgPSBjb2xsZWN0RWxlbWVudHMocm9vdDIuZ2V0Q2hpbGROb2RlcygpKTsJCQotCQlpbnQgc3oxID0gZWxlbWVudExpc3QxLnNpemUoKTsKLQkJaW50IHN6MiA9IGVsZW1lbnRMaXN0Mi5zaXplKCk7Ci0KLQkJaWYgKHN6MSAhPSBzejIpIHsKLQkJCVN0cmluZyBtc2cgPSAicm9vdCBjaGlsZCBlbGVtZW50czogc3oxICE9IHN6MiAtPiAiICsgSW50ZWdlci50b1N0cmluZyhzejEpICsgIiAhPSAiICsgSW50ZWdlci50b1N0cmluZyhzejIpOwotCQkJbG9nRGlmZihtc2csIHJvb3QxLCByb290Mik7Ci0JCX0KLQkJCi0JCWludCBzeiA9IHN6MSA8IHN6MiA/IHN6MSA6IHN6MjsKLQkJZm9yIChpbnQgaT0wOyBpPHN6OyBpKyspIHsKLQkJCWNvbXBhcmUoKEVsZW1lbnQpIGVsZW1lbnRMaXN0MS5nZXQoaSksIChFbGVtZW50KSBlbGVtZW50TGlzdDIuZ2V0KGkpKTsKLQkJfQotCQkKLQkJdHJhY2UoImNvbXBhcmVSb290IDwtIGRpZmZzOiAiICsgZGlmZkNvdW50ICsgIiwgZWxlbWVudHM6ICIgKyBlbGVtQ29tcGFyZWRDb3VudCArICJcbiIpOwotCX0KLQkKLQlwcml2YXRlIExpc3QgY29sbGVjdEVsZW1lbnRzKE5vZGVMaXN0IG5vZGVMaXN0KSB7Ci0JCUxpc3QgZWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoaW50IGk9MDsgaTxub2RlTGlzdC5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCQlOb2RlIG5vZGUgPSBub2RlTGlzdC5pdGVtKGkpOwotCQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBFbGVtZW50KSB7Ci0JCQkJZWxlbWVudHMuYWRkKG5vZGUpOwotCQkJfQotCQl9CQkKLQkJcmV0dXJuIGVsZW1lbnRzOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgY29tcGFyZShFbGVtZW50IG5vZGUxLCAgRWxlbWVudCBub2RlMikgewotCQl0cmFjZSgiY29tcGFyZSAtPiAiKTsKLQkJY29tcGFyZUlubmVyKG5vZGUxLCBub2RlMik7Ci0JCXRyYWNlKCJjb21wYXJlIDwtICIpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgY29tcGFyZUlubmVyKEVsZW1lbnQgbm9kZTEsICBFbGVtZW50IG5vZGUyKSB7Ci0JCWVsZW1Db21wYXJlZENvdW50Kys7Ci0JCWlmIChsb2NhbERlYnVnKSB7Ci0JCQl0cmFjZSgiY29tcGFyZUlubmVyLCBub2RlMTogIiArIG91dHB1dFN0cmluZyhub2RlMSkpOwotCQkJdHJhY2UoImNvbXBhcmVJbm5lciwgbm9kZTI6ICIgKyBvdXRwdXRTdHJpbmcobm9kZTEpKTsKLQkJCXRyYWNlKCIiKTsKLQkJfQotCQkKLQkJYXR0cmlidXRlRXF1YWxzKG5vZGUxLCBub2RlMik7Ci0JCQkKLQkJTGlzdCBlbGVtZW50TGlzdDEgPSBjb2xsZWN0RWxlbWVudHMobm9kZTEuZ2V0Q2hpbGROb2RlcygpKTsKLQkJTGlzdCBlbGVtZW50TGlzdDIgPSBjb2xsZWN0RWxlbWVudHMobm9kZTIuZ2V0Q2hpbGROb2RlcygpKTsJCQotCQlpbnQgc3oxID0gZWxlbWVudExpc3QxLnNpemUoKTsKLQkJaW50IHN6MiA9IGVsZW1lbnRMaXN0Mi5zaXplKCk7Ci0KLQkJaWYgKHN6MSAhPSBzejIpIHsKLQkJCVN0cmluZyBtc2cgPSAiQ2hpbGQgZWxlbWVudHM6IHN6MSAhPSBzejIgLT4gIiArIEludGVnZXIudG9TdHJpbmcoc3oxKSArICIgIT0gIiArIEludGVnZXIudG9TdHJpbmcoc3oyKTsKLQkJCWxvZ0RpZmYobXNnLCBub2RlMSwgbm9kZTIpOwotCQl9Ci0JCQotCQlpbnQgc3ogPSBzejEgPCBzejIgPyBzejEgOiBzejI7Ci0JCWZvciAoaW50IGk9MDsgaTxzejsgaSsrKSB7Ci0JCQljb21wYXJlSW5uZXIoKEVsZW1lbnQpIGVsZW1lbnRMaXN0MS5nZXQoaSksIChFbGVtZW50KSBlbGVtZW50TGlzdDIuZ2V0KGkpKTsKLQkJfQotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBhdHRyaWJ1dGVFcXVhbHMoRWxlbWVudCBub2RlMSwgRWxlbWVudCBub2RlMikgewotCQlib29sZWFuIHJldCA9IHRydWU7Ci0JCQotCQlOYW1lZE5vZGVNYXAgYXR0czEgPSBub2RlMS5nZXRBdHRyaWJ1dGVzKCk7Ci0JCU5hbWVkTm9kZU1hcCBhdHRzMiA9IG5vZGUyLmdldEF0dHJpYnV0ZXMoKTsKLQkJaW50IHN6MSA9IGF0dHMxLmdldExlbmd0aCgpOwotCQlpbnQgc3oyID0gYXR0czIuZ2V0TGVuZ3RoKCk7Ci0JCWlmIChzejEgIT0gc3oyKSB7Ci0JCQlsb2dEaWZmKCJBdHRyaWJ1dGVzOiBzejEgIT0gc3oyIiwgbm9kZTEsIG5vZGUyKTsKLQkJCXJldCA9IGZhbHNlOwotCQl9Ci0JCWludCBzeiA9IHN6MSA8IHN6MiA/IHN6MSA6IHN6MjsJCQotCQlmb3IgKGludCBpPTA7IGk8c3o7IGkrKykgewotCQkJU3RyaW5nIGF0dE5hbWUgPSBhdHRzMS5pdGVtKGkpLmdldE5vZGVOYW1lKCk7Ci0JCQlpZiAoZXhjbHVkZWRGZWF0dXJlU2V0LmNvbnRhaW5zKGF0dE5hbWUpKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlTdHJpbmcgdmFsMSA9IG5vZGUxLmdldEF0dHJpYnV0ZShhdHROYW1lKTsKLQkJCVN0cmluZyB2YWwyID0gbm9kZTIuZ2V0QXR0cmlidXRlKGF0dE5hbWUpOwotCQkJaWYgKGF0dE5hbWUuZXF1YWxzKCJuYW1lIikgJiYgZXhjbHVkZUd1aWRGcm9tTmFtZSkgewotCQkJCWludCBpeCA9IHZhbDEuaW5kZXhPZigiLCIpOwotCQkJCWlmIChpeCA+IDApIHsKLQkJCQkJdmFsMSA9IHZhbDEuc3Vic3RyaW5nKDAsIGl4KTsKLQkJCQl9Ci0JCQkJaXggPSB2YWwyLmluZGV4T2YoIiwiKTsKLQkJCQlpZiAoaXggPiAwKSB7Ci0JCQkJCXZhbDIgPSB2YWwyLnN1YnN0cmluZygwLCBpeCk7Ci0JCQkJfQotCQkJfQotCQkJaWYgKCEgdmFsdWVFcXVhbHModmFsMSwgdmFsMikpIHsKLQkJCQlTdHJpbmcgbXNnID0gYXR0TmFtZSArICIgdmFsdWVzIG5vdCB0aGUgc2FtZSEiOwotCQkJCWxvZ0RpZmYobXNnLCBub2RlMSwgbm9kZTIsIHZhbDEsIHZhbDIpOwotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gcmV0OwotCX0KLQkKLQlwcml2YXRlIGJvb2xlYW4gdmFsdWVFcXVhbHMoT2JqZWN0IHZhbDEsIE9iamVjdCB2YWwyKSB7Ci0JCWlmICh2YWwxID09IG51bGwpIHsKLQkJCXZhbDEgPSAiIjsKLQkJfQotCQkKLQkJaWYgKHZhbDIgPT0gbnVsbCkgewotCQkJdmFsMiA9ICIiOwotCQl9Ci0JCQotCQlpZiAodmFsMSBpbnN0YW5jZW9mIFN0cmluZykgewotCQkJU3RyaW5nIHN0cjEgPSAoU3RyaW5nKSB2YWwxOwotCQkJU3RyaW5nIHN0cjIgPSAoU3RyaW5nKSB2YWwyOwotCQkJcmV0dXJuIHN0cjEuZXF1YWxzKHN0cjIpOwotCQl9Ci0JCQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCQotCXByaXZhdGUgdm9pZCBsb2dEaWZmKFN0cmluZyBtc2csIEVsZW1lbnQgbm9kZTEsIEVsZW1lbnQgbm9kZTIsIE9iamVjdCB2YWwxLCBPYmplY3QgdmFsMikgewotCQlsb2cobXNnLCBub2RlMSwgbm9kZTIsIHRydWUpOwotCQlTdHJpbmcgcHJvbXB0ID0gZ2V0RGlmZlByb21wdCgpOwotCQl0cmFjZShwcm9tcHQgKyAidmFsMTogIiArIHZhbDEpOwotCQl0cmFjZShwcm9tcHQgKyAidmFsMjogIiArIHZhbDIpOwkKLQkJdHJhY2UoIiIpOwotCX0JCi0JCQotCXByaXZhdGUgaW50IGluY0RpZmZDb3VudCgpIHsKLQkJcmV0dXJuICsrZGlmZkNvdW50OwotCX0KLQkKLQlwcml2YXRlIFN0cmluZyBnZXREaWZmUHJvbXB0KCkgewotCQlyZXR1cm4gIkRfIiArIGRpZmZDb3VudCArICI+ICI7CQotCX0JCi0JCi0JcHJpdmF0ZSB2b2lkIGxvZ0RpZmYoU3RyaW5nIG1zZywgRWxlbWVudCBub2RlMSwgRWxlbWVudCBub2RlMikgewotCQlsb2cobXNnLCBub2RlMSwgbm9kZTIsIHRydWUpOwotCQl0cmFjZSgiIik7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBsb2coU3RyaW5nIG1zZywgRWxlbWVudCBub2RlMSwgRWxlbWVudCBub2RlMiwgYm9vbGVhbiBkaWZmKSB7Ci0JCWlmIChkaWZmKSB7Ci0JCQlpbmNEaWZmQ291bnQoKTsKLQkJfQotCQlTdHJpbmcgcHJvbXB0ID0gZGlmZiA/IGdldERpZmZQcm9tcHQoKSA6ICJXYXJuaW5nPiAiOwotCQkvL3RyYWNlKHByb21wdCArICJwYXRoOiAiICsgcGF0aFN0cmluZyhub2RlMSkpOwotCQl0cmFjZShwcm9tcHQgKyAibXNnOiAiICsgbXNnKTsKLQkJdHJhY2UocHJvbXB0ICsgIm5vZGUxOiAiICsgb3V0cHV0U3RyaW5nKG5vZGUxKSk7Ci0JCXRyYWNlKHByb21wdCArICJub2RlMjogIiArIG91dHB1dFN0cmluZyhub2RlMikpOwotCX0KLQkKLQlwcml2YXRlIFN0cmluZyBwYXRoU3RyaW5nKEVsZW1lbnQgbm9kZSkgewotCQlTdGFjayBwYXRocyA9IG5ldyBTdGFjaygpOwotCQlOb2RlIGN1cnJOb2RlID0gbm9kZTsKLQkJd2hpbGUgKGN1cnJOb2RlICE9IG51bGwgJiYgY3Vyck5vZGUgaW5zdGFuY2VvZiBFbGVtZW50KSB7Ci0JCQlTdHJpbmcgbmFtZSA9ICgoRWxlbWVudCkgY3Vyck5vZGUpLmdldEF0dHJpYnV0ZSgibmFtZSIpOwotCQkJcGF0aHMucHVzaChuYW1lKTsKLQkJCWN1cnJOb2RlID0gY3Vyck5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCQl9Ci0JCVN0cmluZyByZXQgPSAiIjsKLQkJd2hpbGUoISBwYXRocy5pc0VtcHR5KCkpIHsKLQkJCXJldCArPSAiLyIgKyBwYXRocy5wb3AoKTsKLQkJfQkJCi0JCXJldHVybiByZXQ7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGNvbXBhcmUoKSB7Ci0JCWFuYWx5emUoKTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCXByaXZhdGUgU3RyaW5nIG91dHB1dFN0cmluZyhFbGVtZW50IG5vZGUpIHsKLQkJaWYgKG5vZGUgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0JCQkKLQkJU3RyaW5nIHR5cGUgPSBub2RlLmdldEF0dHJpYnV0ZSgidHlwZSIpOwotCQlyZXR1cm4gdHlwZSArICI6ICIgKyBwYXRoU3RyaW5nKG5vZGUpOwotCX0KLQkKLQlwdWJsaWMgaW50IGdldERpZmZDb3VudCgpIHsKLQkJcmV0dXJuIGRpZmZDb3VudDsKLQl9Ci0JCi0JcHVibGljIGludCBnZXRFbGVtQ29tcGFyZWRDb3VudCgpIHsKLQkJcmV0dXJuIGVsZW1Db21wYXJlZENvdW50OwotCX0KLQkKLQotfQpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0ZXIvUWFUZXN0U2VydmljZS5qYXZhIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0ZXIvUWFUZXN0U2VydmljZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZTcwZjUwLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdGVyL1FhVGVzdFNlcnZpY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXI7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlRmlsdGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmlmYWNlLklUZXN0Rm9sZGVyU2V0dXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmlmYWNlLkxpYnJhcnlUZXN0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmlmYWNlLlRDRXhlUmVwbHlMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5pZmFjZS5UZXN0Q29tbWFuZDsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIHByb3ZpZGVzIExpYnJhcnlUZXN0ZXIgc2VydmljZSB0byBydW4gdGVzdCBjb21tYW5kIGZpbGVzLgotICogCi0gKiBAYXV0aG9yIFdlaXBpbmcgTHUKLSAqIEBzaW5jZSAxLjAKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgUWFUZXN0U2VydmljZSBpbXBsZW1lbnRzIElUZXN0Rm9sZGVyU2V0dXAgewotCQotCXByaXZhdGUgc3RhdGljIFN0cmluZyB0ZXN0R3JvdXBOYW1lID0gIlRlc3RDb21tYW5kRmlsZVRlc3RzIjsKLQlwcml2YXRlIHN0YXRpYyBGaWxlIHRlc3RHcm91cDsJCQotCQotCXByaXZhdGUgTGlicmFyeVRlc3RlciB0ZXN0ZXI7Ci0JcHJpdmF0ZSBJVGVzdEZvbGRlclNldHVwIHRlc3RGb2xkZXJTZXR1cDsKLQkKLQlwdWJsaWMgc3RhdGljIEZpbGVGaWx0ZXIgdGNGaWx0ZXIgPSBuZXcgRmlsZUZpbHRlcigpIHsKLQkJcHVibGljIGJvb2xlYW4gYWNjZXB0KEZpbGUgcGF0aG5hbWUpIHsKLQkJCXJldHVybiBwYXRobmFtZS5nZXROYW1lKCkuZW5kc1dpdGgoVGVzdENvbW1hbmQuVGVzdE5hbWVFeHQpOwotCQl9OwkJCQotCX07Ci0JCi0JcHVibGljIHN0YXRpYyBGaWxlRmlsdGVyIGRpckZpbHRlciA9IG5ldyBGaWxlRmlsdGVyKCkgewotCQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoRmlsZSBwYXRobmFtZSkgewotCQkJcmV0dXJuIHBhdGhuYW1lLmlzRGlyZWN0b3J5KCk7Ci0JCX07CQkJCi0JfTsKLQkKLQlwdWJsaWMgUWFUZXN0U2VydmljZShJVGVzdEZvbGRlclNldHVwIHRlc3RGb2xkZXJTZXR1cCwgYm9vbGVhbiB0cmFjZSkgewotCQl0aGlzLnRlc3RGb2xkZXJTZXR1cCA9IHRlc3RGb2xkZXJTZXR1cDsKLQkJdGVzdGVyID0gTGlicmFyeVRlc3RlckZhY3RvcnkubmV3VGVzdGVyKHRyYWNlKTsKLQl9Ci0JCi0JCi0JLyoqCi0JICogUmV0dXJuIHRvcCB0ZXN0IHJvb3Qgc291cmNlIGZvbGRlciBmaWxlCi0JICovCi0JcHVibGljIEZpbGUgZ2V0VG9wVGVzdFJvb3RTb3VyY2UoKSB7Ci0JCXJldHVybiB0ZXN0Rm9sZGVyU2V0dXAuZ2V0VG9wVGVzdFJvb3RTb3VyY2UoKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRlc3QgaG9tZSBmb2xkZXIgZmlsZQotCSAqLwotCXB1YmxpYyBGaWxlIGdldFRlc3RIb21lKCkgewotCQlyZXR1cm4gdGVzdEZvbGRlclNldHVwLmdldFRlc3RIb21lKCk7Ci0JfQkKLQkKLQlwdWJsaWMgc3luY2hyb25pemVkIEZpbGUgZ2V0VGVzdEdyb3VwKCkgewotCQlpZiAodGVzdEdyb3VwID09IG51bGwpIHsKLQkJCVN0cmluZyBwYXRoID0gZ2V0VGVzdEhvbWUoKS5nZXRBYnNvbHV0ZVBhdGgoKSArIEZpbGUuc2VwYXJhdG9yICsgdGVzdEdyb3VwTmFtZTsKLQkJCXRlc3RHcm91cCA9IG5ldyBGaWxlKHBhdGgpOwotCQl9Ci0JCXJldHVybiB0ZXN0R3JvdXA7Ci0JfQotCQotCS8qKgotCSAqIFBpY2tzIHVwIGFuZCBydW5zIGFsbCB0ZXN0IGNvbW1hbmQgZmlsZXMgdW5kZXIgInN0YXJ0aW5nVGVzdFJvb3RTb3VyY2UiCi0JICogZm9sZGVyIHJlY3Vyc2l2ZWx5LiBUZXN0IHdvcmtpbmcgbG9jYXRpb24gc3RhcnRzIGZyb20gInN0YXJ0aW5nVGVzdFJvb3RXb3JraW5nIi4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHJ1bkFsbENhc2VzKEZpbGUgc3RhcnRpbmdUZXN0Um9vdFNvdXJjZSwgRmlsZSBzdGFydGluZ1Rlc3RSb290V29ya2luZykgewkKLQkJU3RyaW5nQnVmZmVyIGVycm9yTXNnQnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQl0cmF2ZXJzZUZvbGRlcihzdGFydGluZ1Rlc3RSb290U291cmNlLCBzdGFydGluZ1Rlc3RSb290V29ya2luZywgZXJyb3JNc2dCdWYsIHRydWUpOwotCQl0ZXN0ZXIuY2xvc2VDdXJyVGVzdERpcigpOwotCQl0ZXN0ZXIuZG9uZVdpdGhBbGxUZXN0cyhnZXRUZXN0R3JvdXAoKSk7Ci0JCXJldHVybiBlcnJvck1zZ0J1Zi50b1N0cmluZygpOwotCX0KLQkKLQkvKioKLQkgKiBQaWNrcyB1cCBhbmQgcnVucyBhbGwgbG9jYWwgdGVzdCBjb21tYW5kIGZpbGVzIHVuZGVyICJ0ZXN0Um9vdFNvdXJjZSIKLQkgKiBmb2xkZXIuIFRlc3Qgd29ya2luZyBsb2NhdGlvbiBpcyBnaXZlbiBieSAidGVzdFJvb3RXb3JraW5nIi4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHJ1bkxvY2FsQ2FzZXMoRmlsZSB0ZXN0Um9vdFNvdXJjZSwgRmlsZSB0ZXN0Um9vdFdvcmtpbmcpIHsJCi0JCVN0cmluZ0J1ZmZlciBlcnJvck1zZ0J1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJdHJhdmVyc2VGb2xkZXIodGVzdFJvb3RTb3VyY2UsIHRlc3RSb290V29ya2luZywgZXJyb3JNc2dCdWYsIGZhbHNlKTsKLQkJcmV0dXJuIGVycm9yTXNnQnVmLnRvU3RyaW5nKCk7Ci0JfQotCQotCS8qKgotCSAqIFJ1bnMgdGhlIHRlc3QgY29tbWFuZCBmaWxlICJ0Y0ZpbGUiIHdpdGggdGVzdCByb290IHNvdXJjZSBmb2xkZXIKLQkgKiBnaXZlbiBieSAidGVzdFJvb3RTb3VyY2UiIGFuZCB0ZXN0IHJvb3Qgd29ya2luZyBmb2xkZXIgZ2l2ZW4gYnkKLQkgKiAidGVzdFJvb3RXb3JraW5nIi4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHJ1bkNhc2UoRmlsZSB0ZXN0Um9vdFNvdXJjZSwgRmlsZSB0ZXN0Um9vdFdvcmtpbmcsIEZpbGUgdGNGaWxlKSB7CQotCQl0ZXN0ZXIuc2V0VGVzdFJvb3RTb3VyY2UodGVzdFJvb3RTb3VyY2UpOwotCQl0ZXN0ZXIuc2V0VGVzdFJvb3RXb3JraW5nKHRlc3RSb290V29ya2luZyk7Ci0JCQotCQlTdHJpbmdCdWZmZXIgZXJyb3JNc2dCdWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCXJ1bkNhc2UoZXJyb3JNc2dCdWYsIHRjRmlsZSk7Ci0JCXJldHVybiBlcnJvck1zZ0J1Zi50b1N0cmluZygpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgdHJhdmVyc2VGb2xkZXIoRmlsZSB0ZXN0Um9vdFNvdXJjZSwgRmlsZSB0ZXN0Um9vdFdvcmtpbmcsIAotCQkJU3RyaW5nQnVmZmVyIGVycm9yTXNnQnVmLCBib29sZWFuIHJlY3Vyc3V2ZWx5KSB7CQkKLQkJCQkJCi0JCUZpbGUgZmlsZXNbXSA9IHRlc3RSb290U291cmNlLmxpc3RGaWxlcyh0Y0ZpbHRlcik7Ci0JCWV4ZWN1dGVUQ0ZpbGVzKHRlc3RSb290U291cmNlLCB0ZXN0Um9vdFdvcmtpbmcsICBmaWxlcywgZXJyb3JNc2dCdWYpOwotCQlpZiAoISByZWN1cnN1dmVseSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCQkKLQkJRmlsZSBkaXJzW10gPSB0ZXN0Um9vdFNvdXJjZS5saXN0RmlsZXMoZGlyRmlsdGVyKTsKLQkJaW50IHN6ID0gZGlycyA9PSBudWxsID8gMCA6IGRpcnMubGVuZ3RoOwotCQlpZiAoc3ogPT0gMCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWZvciAoaW50IGk9MDsgaTxzejsgaSsrKSB7Ci0JCQlGaWxlIGRpciA9IGRpcnNbaV07Ci0JCQlTdHJpbmcgcGF0aCA9IHRlc3RSb290V29ya2luZy5nZXRBYnNvbHV0ZVBhdGgoKSArIEZpbGUuc2VwYXJhdG9yICsgZGlyLmdldE5hbWUoKSAKLQkJCQkJCQkJKyBGaWxlLnNlcGFyYXRvcjsKLQkJCXRyYXZlcnNlRm9sZGVyKGRpciwgbmV3IEZpbGUocGF0aCksIGVycm9yTXNnQnVmLCByZWN1cnN1dmVseSk7Ci0JCX0KLQl9Ci0JCQotCXByaXZhdGUgdm9pZCBleGVjdXRlVENGaWxlcyhGaWxlIHRlc3RSb290U291cmNlLCBGaWxlIHRlc3RSb290V29ya2luZywgRmlsZSB0Y0ZpbGVzW10sIFN0cmluZ0J1ZmZlciBlcnJvck1zZ0J1ZikgewotCQlpbnQgc3ogPSB0Y0ZpbGVzID09IG51bGwgPyAwIDogdGNGaWxlcy5sZW5ndGg7Ci0JCWlmIChzeiA9PSAwKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCQkKLQkJdGVzdGVyLnNldFRlc3RSb290U291cmNlKHRlc3RSb290U291cmNlKTsKLQkJdGVzdGVyLnNldFRlc3RSb290V29ya2luZyh0ZXN0Um9vdFdvcmtpbmcpOwotCQkKLQkJZm9yIChpbnQgaT0wOyBpPHN6OyBpKyspIHsKLQkJCUZpbGUgdGNGaWxlID0gdGNGaWxlc1tpXTsKLQkJCXJ1bkNhc2UoZXJyb3JNc2dCdWYsIHRjRmlsZSk7CQkJCi0JCX0JCQkJCi0JfQotCi0JcHJpdmF0ZSB2b2lkIHJ1bkNhc2UoU3RyaW5nQnVmZmVyIGVycm9yTXNnQnVmLCBGaWxlIHRjRmlsZSkgewkKLQkJdGVzdGVyLnNldFRlc3QodGNGaWxlKTsKLQkJVENFeGVSZXBseUxpc3QgcmVzdWx0ID0gdGVzdGVyLmV4ZWN1dGUoKTsKLQkJaWYgKCEgcmVzdWx0LnBhc3NpbmcoKSkgewotCQkJU3RyaW5nIG1zZyA9IHJlc3VsdC5nZXRTdW1tYXJ5UmVwbHkoKTsKLQkJCWVycm9yTXNnQnVmLmFwcGVuZCgiXG4iICsgbXNnKTsKLQkJCXRlc3Rlci50cmFjZShtc2cpOwotCQl9Ci0JfQotCQotCi0JCi0JCi0JCi19CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3Rlci9UZXN0Q29tbWFuZEZpbGVUZXN0LmphdmEgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3Rlci9UZXN0Q29tbWFuZEZpbGVUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5NjAxOGEuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0ZXIvVGVzdENvbW1hbmRGaWxlVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi0vKioKLSAqIEpVTklUIHRlc3Qgb24gcnVuaW5nIGEgdGVzdCBjb21tYW5kIGZpbGUgaW4gdHJhY2UgbW9kZQotICogZm9yIGRlYnVnIHB1cnBvc2UuCi0gKiBUaGUgbG9jYXRpb24gb2YgdGVzdCBmaWxlIGlzIGhhcmQgY29kZWQgZm9yIG5vdy4KLSAqIAotICogQGF1dGhvciBXZWlwaW5nIEx1Ci0gKiBAc2luY2UgMS4wCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFRlc3RDb21tYW5kRmlsZVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JCi0JLyoqCi0JICogVGVzdCBmaWxlIHBhdGggcmVsYXRpdmUgdG8gdG9wVGVzdFJvb3RTb3VyY2UKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgdGNGaWxlUGF0aEZyb21Ub3BSb290U291cmNlW10gPSB7Ci0vKgkJIlRlc3RDb21tYW5kcyIsCi0JCSJuZXdNZXRob2RQbHVnaW4iLAotCQkibmV3TWV0aG9kUGx1Z2luLnRjIiovCi0vKgkJCi0JCSJFeHBvcnRJbXBvcnQiLAotCQkiQnVnc18xIiwKLQkJIjE1MDcwMiIsCi0JCSIxNTA3MDIudGMiKi8JCQotCQkKLQkJIlRlc3RDb21tYW5kcyIsCi0JCSJuZXdNZXRob2RFbGVtZW50cyIsCi0JCSJuZXdNZXRob2RFbGVtZW50cy50YyIKLQkJCi0vKgkJIlRlc3RDb21tYW5kcyIsCi0JCSJrZWx2aW5DYXNlLnRjIiovCi0JCQotLyoJCSJWYWxpZGF0aW9uIiwKLQkJIkJ1Z3MiLAotCQkiMTcxMDI4LnRjIiovCi0JfTsKLQkJCi0JcHJpdmF0ZSBRYVRlc3RTZXJ2aWNlIHNlcnZpY2UgPSBuZXcJUWFUZXN0U2VydmljZShuZXcgVGVzdEZvbGRlclNldHVwKCksIHRydWUpOwotCQotCXB1YmxpYyBUZXN0Q29tbWFuZEZpbGVUZXN0KFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQkvKioKLQkgKiBUaGlzIHRlc3QgcnVucyB0aGUgZ2l2ZW4gdGVzdCBjb21tYW5kIGZpbGUuCi0JICovIAotCXB1YmxpYyB2b2lkIHRlc3RPbmVDYXNlKCkgewotCQlydW5UZXN0T25lQ2FzZShzZXJ2aWNlLCB0Y0ZpbGVQYXRoRnJvbVRvcFJvb3RTb3VyY2UpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgcnVuVGVzdE9uZUNhc2UoUWFUZXN0U2VydmljZSBzZXJ2aWNlLCBTdHJpbmcgdGNGaWxlUGF0aEZyb21Ub3BSb290U291cmNlW10pIHsKLQkJU3RyaW5nIHBhdGggPSBzZXJ2aWNlLmdldFRlc3RHcm91cCgpLmdldEFic29sdXRlUGF0aCgpOwotCQkvL3BhdGggKz0gRmlsZS5zZXBhcmF0b3IgKyBMb25nLnRvSGV4U3RyaW5nKENhbGVuZGFyLmdldEluc3RhbmNlKCkuZ2V0VGltZUluTWlsbGlzKCkpICsgRmlsZS5zZXBhcmF0b3I7CQkKLQkJRmlsZSB0ZXN0Um9vdFdvcmtpbmcgPSBuZXcgRmlsZShwYXRoKTsKLQkJTGlicmFyeVRlc3RTZXJ2aWNlLmdldEluc3RhbmNlKCkuZGVsZXRlRm9sZGVyKHRlc3RSb290V29ya2luZyk7Ci0JCQotCQlGaWxlIHRvcFRlc3RSb290U291cmNlID0gc2VydmljZS5nZXRUb3BUZXN0Um9vdFNvdXJjZSgpOwotCQkKLQkJcGF0aCA9IHRvcFRlc3RSb290U291cmNlLmdldEFic29sdXRlUGF0aCgpOwotCQlmb3IgKGludCBpPTA7IGk8dGNGaWxlUGF0aEZyb21Ub3BSb290U291cmNlLmxlbmd0aDsgaSsrKSB7Ci0JCQlwYXRoICs9IEZpbGUuc2VwYXJhdG9yICsgdGNGaWxlUGF0aEZyb21Ub3BSb290U291cmNlW2ldOwotCQl9Ci0JCUZpbGUgdGNGaWxlID0gbmV3IEZpbGUocGF0aCk7CQkKLQkJCi0JCVN0cmluZyBlcnJvck1zZyA9IHNlcnZpY2UucnVuQ2FzZSh0Y0ZpbGUuZ2V0UGFyZW50RmlsZSgpLCB0ZXN0Um9vdFdvcmtpbmcsIHRjRmlsZSk7Ci0JCWFzc2VydFRydWUoZXJyb3JNc2csIGVycm9yTXNnLmxlbmd0aCgpID09IDApOwotCX0KLQkJCi19CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3Rlci9UZXN0Q29tbWFuZEZpbGVUZXN0cy5qYXZhIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0ZXIvVGVzdENvbW1hbmRGaWxlVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGU0NDFjYS4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3Rlci9UZXN0Q29tbWFuZEZpbGVUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5EYXRlOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgY29tLmlibS5pY3UudGV4dC5TaW1wbGVEYXRlRm9ybWF0OwotaW1wb3J0IGNvbS5pYm0uaWN1LnV0aWwuQ2FsZW5kYXI7Ci0KLS8qKgotICogSlVOSVQgdGVzdCBvbiB0ZXN0IGNvbW1hbmQgZmlsZXMKLSAqIAotICogQGF1dGhvciBXZWlwaW5nIEx1Ci0gKiBAc2luY2UgMS4wCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFRlc3RDb21tYW5kRmlsZVRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCQotCXByaXZhdGUgUWFUZXN0U2VydmljZSBzZXJ2aWNlID0gbmV3CVFhVGVzdFNlcnZpY2UobmV3IFRlc3RGb2xkZXJTZXR1cCgpLCBmYWxzZSk7Ci0JCi0JcHVibGljIFRlc3RDb21tYW5kRmlsZVRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0JCQkJCQkKLQkJCQotCS8qKgotCSAqIFRoaXMgdGVzdCBwaWNrcyB1cCBhbmQgcnVucyBhbGwgdGVzdCBjb21tYW5kIGZpbGVzIHVuZGVyIHRoZQotCSAqIGZvbGRlciBzZXJ2aWNlLmdldFRvcFRlc3RSb290U291cmNlKCkgcmVjdXJzaXZlbHkuIAotCSAqLyAKLQlwdWJsaWMgdm9pZCB0ZXN0QWxsQ2FzZXMoKSB7Ci0JCXJ1blRlc3RBbGxDYXNlcyhzZXJ2aWNlKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIHJ1blRlc3RBbGxDYXNlcyhRYVRlc3RTZXJ2aWNlIHNlcnZpY2UpIHsKLQkJU3RyaW5nIHBhdGggPSBzZXJ2aWNlLmdldFRlc3RHcm91cCgpLmdldEFic29sdXRlUGF0aCgpOwotCQkKLQkJU2ltcGxlRGF0ZUZvcm1hdCBzZGYgPSBuZXcgU2ltcGxlRGF0ZUZvcm1hdCgieXl5eS1NTS1kZCBoaDptbTpzczpTU1MiKTsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgZHRTdHIgPSBzZGYuZm9ybWF0KG5ldyBEYXRlKCkpOwotCQlkdFN0ciA9IGR0U3RyLnJlcGxhY2UoJyAnLCAnXycpOwotCQlkdFN0ciA9IGR0U3RyLnJlcGxhY2UoJzonLCAnLScpOwotCQkKLQkJcGF0aCArPSBGaWxlLnNlcGFyYXRvciArIGR0U3RyICsgRmlsZS5zZXBhcmF0b3I7Ci0JCVN0cmluZyBlcnJvck1zZyA9IHNlcnZpY2UucnVuQWxsQ2FzZXMoc2VydmljZS5nZXRUb3BUZXN0Um9vdFNvdXJjZSgpLCBuZXcgRmlsZShwYXRoKSk7Ci0JCWFzc2VydFRydWUoZXJyb3JNc2csIGVycm9yTXNnLmxlbmd0aCgpID09IDApOwotCX0KLQkJCi19CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3Rlci9UZXN0Rm9sZGVyU2V0dXAuamF2YSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdGVyL1Rlc3RGb2xkZXJTZXR1cC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYjc5MzQ2Li4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdGVyL1Rlc3RGb2xkZXJTZXR1cC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmlmYWNlLklUZXN0Rm9sZGVyU2V0dXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMuVGVzdHNQbHVnaW47Ci0KLS8qKgotICogVGhpcyBjbGFzcyBzZXRzIHRoZSB0b3AgZm9sZGVyIGxvY2F0aW9ucyBmb3IgTGlicmFyeVRlc3RlciAKLSAqIAotICogQGF1dGhvciBXZWlwaW5nIEx1Ci0gKiBAc2luY2UgMS4wCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFRlc3RGb2xkZXJTZXR1cCBpbXBsZW1lbnRzIElUZXN0Rm9sZGVyU2V0dXAgewotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIEZpbGUgdG9wVGVzdFJvb3RTb3VyY2UgPSBuZXcgRmlsZSAoVGVzdHNQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEluc3RhbGxQYXRoKCkgKyAgCi0JCQkiTGlicmFyaWVzIiArIEZpbGUuc2VwYXJhdG9yICsgIjEuMC4wIiArIEZpbGUuc2VwYXJhdG9yKSA7Ci0JCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIEZpbGUgdGVzdEhvbWUgPSBuZXcgRmlsZSAoU3lzdGVtLmdldFByb3BlcnR5KCJ1c2VyLmhvbWUiKSArIEZpbGUuc2VwYXJhdG9yIC8vJE5PTi1OTFMtMiQKLQkJCSsgIkVQRiIgKyBGaWxlLnNlcGFyYXRvciArICJ0ZXN0IiArIEZpbGUuc2VwYXJhdG9yKTsKLQkKLQkvKioKLQkgKiBSZXR1cm4gdG9wIHRlc3Qgcm9vdCBzb3VyY2UgZm9sZGVyIGZpbGUKLQkgKi8KLQlwdWJsaWMgRmlsZSBnZXRUb3BUZXN0Um9vdFNvdXJjZSgpIHsKLQkJcmV0dXJuIHRvcFRlc3RSb290U291cmNlOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdGVzdCBob21lIGZvbGRlciBmaWxlCi0JICovCi0JcHVibGljIEZpbGUgZ2V0VGVzdEhvbWUoKSB7Ci0JCXJldHVybiB0ZXN0SG9tZTsKLQl9CQotCi19CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3Rlci9UZXN0ZXJPdXRwdXRVdGlsLmphdmEgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3Rlci9UZXN0ZXJPdXRwdXRVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4YTkyZTQuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0ZXIvVGVzdGVyT3V0cHV0VXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RlcjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU3RhY2s7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXIuaWZhY2UuVGVzdFRyYWNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NQYWNrYWdlOwotCi0vKioKLSAqIFV0aWxpdHkgY2xhc3MgZm9yIHRlc3RlciBvdXRwdXQgbWFuaXB1bGF0aW9ucwotICogCi0gKiBAYXV0aG9yIFdlaXBpbmcgTHUKLSAqIEBzaW5jZSAxLjAKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgVGVzdGVyT3V0cHV0VXRpbCB7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgVGVzdFRyYWNlciB0cmFjZXI7Ci0JcHVibGljIHN0YXRpYyB2b2lkIHNldFRyYWNlcihUZXN0VHJhY2VyIHQpIHsKLQkJdHJhY2VyID0gdDsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIHRyYWNlKFN0cmluZyBsaW5lKSB7Ci0JCWlmICh0cmFjZXIgPT0gbnVsbCkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKGxpbmUpOwotCQl9IGVsc2UgewotCQkJdHJhY2VyLnRyYWNlKGxpbmUpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gbG9jYWxEZWJ1ZyA9IGZhbHNlOwotCQotCXB1YmxpYyBzdGF0aWMgTWV0aG9kUGx1Z2luIGdldE1ldGhvZFBsdWdpbihNZXRob2RMaWJyYXJ5IGxpYiwgU3RyaW5nIG5hbWUpIHsKLQkJTWFwIG5hbWVNYXAgPSBnZXRNZXRob2RFbGVtZW50TmFtZU1hcChsaWIuZ2V0TWV0aG9kUGx1Z2lucygpKTsKLQkJcmV0dXJuIChNZXRob2RQbHVnaW4pIG5hbWVNYXAuZ2V0KG5hbWUpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIE1ldGhvZENvbmZpZ3VyYXRpb24gZ2V0TWV0aG9kQ29uZmlndXJhdGlvbihNZXRob2RMaWJyYXJ5IGxpYiwgU3RyaW5nIG5hbWUpIHsKLQkJTWFwIG5hbWVNYXAgPSBnZXRNZXRob2RFbGVtZW50TmFtZU1hcChsaWIuZ2V0UHJlZGVmaW5lZENvbmZpZ3VyYXRpb25zKCkpOwotCQlyZXR1cm4gKE1ldGhvZENvbmZpZ3VyYXRpb24pIG5hbWVNYXAuZ2V0KG5hbWUpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIE1ldGhvZEVsZW1lbnQgZ2V0TWV0aG9kRWxlbWVudChNZXRob2RMaWJyYXJ5IGxpYiwgU3RyaW5nIHBhdGgpIHsKLQkJcmV0dXJuIGdldE1ldGhvZEVsZW1lbnRfKGxpYiwgcGF0aCx0cnVlKTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgTWV0aG9kRWxlbWVudCBnZXRNZXRob2RFbGVtZW50XyhNZXRob2RMaWJyYXJ5IGxpYiwgU3RyaW5nIHBhdGgsIGJvb2xlYW4gcmVzb2x2ZVByb2Nlc3NFbGVtZW50KSB7Ci0JCU1ldGhvZEVsZW1lbnQgZWxlbWVudCA9IGdldE1ldGhvZEVsZW1lbnRfKGxpYiwgcGF0aCk7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgUHJvY2Vzc1BhY2thZ2UgJiYgcmVzb2x2ZVByb2Nlc3NFbGVtZW50KSB7Ci0JCQlQcm9jZXNzUGFja2FnZSBwa2cgPSAoUHJvY2Vzc1BhY2thZ2UpIGVsZW1lbnQ7Ci0JCQlMaXN0IGNoaWxkcmVuID0gcGtnLmdldFByb2Nlc3NFbGVtZW50cygpOwotCQkJaWYgKGNoaWxkcmVuLnNpemUoKSA9PSAxICYmIAotCQkJCQkoKFByb2Nlc3NFbGVtZW50KSBjaGlsZHJlbi5nZXQoMCkpLmdldE5hbWUoKS5lcXVhbHMocGtnLmdldE5hbWUoKSkpIHsKLQkJCQlyZXR1cm4gKE1ldGhvZEVsZW1lbnQpIGNoaWxkcmVuLmdldCgwKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZWxlbWVudDsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgTWV0aG9kRWxlbWVudCBnZXRNZXRob2RFbGVtZW50XyhNZXRob2RMaWJyYXJ5IGxpYiwgU3RyaW5nIHBhdGgpIHsKLQkJaWYgKHBhdGggPT0gbnVsbCB8fCBwYXRoLmxlbmd0aCgpID09IDApIHsKLQkJCXJldHVybiBsaWI7Ci0JCX0KLQkJTGlzdCBwYXRocyA9IHBhcnNlTWV0aG9kRWxlbWVudFBhdGgocGF0aCk7Ci0JCWludCBzeiA9IHBhdGhzLnNpemUoKTsKLQkJaWYgKHN6ID09IDApIHsKLQkJCXJldHVybiBudWxsOwotCQl9CQkKLQkJTWV0aG9kRWxlbWVudCBtZSA9IGdldEZpcnN0TWV0aG9kRWxlbWVudChsaWIsIChTdHJpbmcpIHBhdGhzLmdldCgwKSk7Ci0JCWlmIChtZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlmb3IgKGludCBpPTE7IGk8c3o7IGkrKykgewotCQkJTWFwIG5hbWVNYXAgPSBnZXRNZXRob2RFbGVtZW50TmFtZU1hcChtZS5lQ29udGVudHMoKSk7Ci0JCQltZSA9IChNZXRob2RFbGVtZW50KSBuYW1lTWFwLmdldChwYXRocy5nZXQoaSkpOwotCQkJaWYgKG1lID09IG51bGwpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJfQkJCi0JCXJldHVybiBtZTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgTWV0aG9kRWxlbWVudCBnZXRGaXJzdE1ldGhvZEVsZW1lbnQoTWV0aG9kTGlicmFyeSBsaWIsIFN0cmluZyBmaXJzdFBhdGgpIHsKLQkJTWV0aG9kRWxlbWVudCBtZSA9IGdldE1ldGhvZFBsdWdpbihsaWIsIGZpcnN0UGF0aCk7Ci0JCWlmIChtZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gbWU7Ci0JCX0KLQkJcmV0dXJuIGdldE1ldGhvZENvbmZpZ3VyYXRpb24obGliLCBmaXJzdFBhdGgpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFByb2Nlc3NFbGVtZW50IGdldFByb2Nlc3NFbGVtZW50KE1ldGhvZExpYnJhcnkgbGliLCBTdHJpbmcgcGF0aCkgewotCQlpbnQgaXggPSBwYXRoLmxhc3RJbmRleE9mKCIvIik7Ci0JCVN0cmluZyBwYXJlbnRQYXRoID0gcGF0aC5zdWJzdHJpbmcoMCwgaXgpOwotCQlTdHJpbmcgbmFtZSA9IHBhdGguc3Vic3RyaW5nKGl4ICsgMSk7Ci0JCQotCQlQcm9jZXNzUGFja2FnZSBvdXRlclBhcmVudCA9IGdldFByb2Nlc3NFbGVtZW50UGFyZW50KGxpYiwgcGFyZW50UGF0aCk7Ci0JCQotCQlNYXAgbmFtZU1hcCA9IGdldE1ldGhvZEVsZW1lbnROYW1lTWFwKG91dGVyUGFyZW50LmdldENoaWxkUGFja2FnZXMoKSk7Ci0JCVByb2Nlc3NQYWNrYWdlIGlubmVyUGFyZW50ID0gKFByb2Nlc3NQYWNrYWdlKSBuYW1lTWFwLmdldChuYW1lKTsKLQkJaWYgKGlubmVyUGFyZW50IGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkgewotCQkJcmV0dXJuICgoUHJvY2Vzc0NvbXBvbmVudCkgaW5uZXJQYXJlbnQpLmdldFByb2Nlc3MoKTsKLQkJfQotCQlMaXN0IHBlcyA9IGlubmVyUGFyZW50LmdldFByb2Nlc3NFbGVtZW50cygpOwotCQlpZiAocGVzLnNpemUoKSAhPSAxKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxEPiBwZXMuc2l6ZSgpID09ICIgKyBwZXMuc2l6ZSgpICsgIiAhPSAxIik7Ci0JCX0KLQkJCi0JCXJldHVybiAoUHJvY2Vzc0VsZW1lbnQpIHBlcy5nZXQoMCk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgUHJvY2Vzc1BhY2thZ2UgZ2V0UHJvY2Vzc0VsZW1lbnRQYXJlbnQoTWV0aG9kTGlicmFyeSBsaWIsIFN0cmluZyBwYXJlbnRQYXRoKSB7Ci0JCQlyZXR1cm4gKFByb2Nlc3NQYWNrYWdlKSBnZXRNZXRob2RFbGVtZW50XyhsaWIsIHBhcmVudFBhdGgsIGZhbHNlKTsJCi0JfQotCQotCXB1YmxpYyBzdGF0aWMgTGlzdCBwYXJzZU1ldGhvZEVsZW1lbnRQYXRoKFN0cmluZyBwYXRoKSB7Ci0JCUxpc3QgcmV0ID0gbmV3IEFycmF5TGlzdCgpOwkJCi0JCVN0cmluZyBuYW1lID0gcGF0aDsKLQkJd2hpbGUgKHRydWUpIHsKLQkJCWludCBpeCA9IHBhdGguaW5kZXhPZigiLyIpOwotCQkJaWYgKGl4IDwgMCkgewotCQkJCXJldC5hZGQocGF0aCk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlyZXQuYWRkKHBhdGguc3Vic3RyaW5nKDAsIGl4KSk7Ci0JCQlwYXRoID0gcGF0aC5zdWJzdHJpbmcoaXggKyAxKTsKLQkJfQkKLQkJcmV0dXJuIHJldDsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgTWFwIGdldE1ldGhvZEVsZW1lbnROYW1lTWFwKExpc3QgY29udGVudHMpIHsKLQkJTWFwIG5hbWVNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQlmb3IgKGludCBpPTA7IGk8Y29udGVudHMuc2l6ZSgpOyBpKyspIHsKLQkJCU9iamVjdCBvYmogPSBjb250ZW50cy5nZXQoaSk7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJCU1ldGhvZEVsZW1lbnQgZWxlbSA9IChNZXRob2RFbGVtZW50KSBvYmo7Ci0JCQkJbmFtZU1hcC5wdXQoZWxlbS5nZXROYW1lKCksIGVsZW0pOwotCQkJfQotCQl9Ci0JCXJldHVybiBuYW1lTWFwOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRPdXRwdXRQYXRoKE1ldGhvZEVsZW1lbnQgbWUpIHsKLQkJaWYgKG1lIGluc3RhbmNlb2YgTWV0aG9kTGlicmFyeSkgewotCQkJcmV0dXJuICIiOwotCQl9Ci0JCWlmIChtZSBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbiB8fCBtZSBpbnN0YW5jZW9mIE1ldGhvZENvbmZpZ3VyYXRpb24pIHsKLQkJCXJldHVybiBtZS5nZXROYW1lKCk7Ci0JCX0KLQkJU3RhY2sgc3RhY2sgPSBuZXcgU3RhY2soKTsKLQkJTWV0aG9kRWxlbWVudCBjdXJyTWUgPSBtZTsKLQkJd2hpbGUgKCEgKGN1cnJNZSBpbnN0YW5jZW9mIE1ldGhvZExpYnJhcnkpKSB7Ci0JCQlTdHJpbmcgbmFtZSA9IGN1cnJNZS5nZXROYW1lKCk7Ci0JCQlpZiAobmFtZSAhPSBudWxsICYmIG5hbWUubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJc3RhY2sucHVzaChuYW1lKTsKLQkJCX0KLQkJCU1ldGhvZEVsZW1lbnQgb2xkTWUgPSBjdXJyTWU7Ci0JCQljdXJyTWUgPSAoTWV0aG9kRWxlbWVudCkgY3Vyck1lLmVDb250YWluZXIoKTsKLQkJCWlmIChjdXJyTWUgPT0gbnVsbCApIHsKLQkJCQlpZiAobG9jYWxEZWJ1ZykgewotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxEPiBjdXJyTWUgPT0gbnVsbCwgb2xkTWU6ICIgKyBvbGRNZSk7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCVN0cmluZyBwYXRoID0gIiI7Ci0JCXdoaWxlICghIHN0YWNrLmlzRW1wdHkoKSkgewotCQkJcGF0aCArPSAoU3RyaW5nKSBzdGFjay5wb3AoKSArICIvIjsJCQkKLQkJfQotCQlpbnQgaXggPSBwYXRoLmxlbmd0aCgpIC0gMTsKLQkJcmV0dXJuIHBhdGguc3Vic3RyaW5nKDAsIGl4KTsKLQl9Ci0JCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBzaG93KFN0cmluZyBtc2csIExpc3QgbGlzdCkgewotCQl0cmFjZShtc2cpOwotCQlmb3IgKGludCBpPTA7IGk8bGlzdC5zaXplKCk7IGkrKykgewotCQkJdHJhY2UoImxpc3RbIiArIGkgKyAiXSIgKyBsaXN0LmdldChpKSk7Ci0JCX0KLQkJdHJhY2UoIiIpOwotCX0KLQkJCi19Ci0KLQpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0ZXIvaWZhY2UvSVRlc3RGb2xkZXJTZXR1cC5qYXZhIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0ZXIvaWZhY2UvSVRlc3RGb2xkZXJTZXR1cC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNGVhMWMwLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdGVyL2lmYWNlL0lUZXN0Rm9sZGVyU2V0dXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmlmYWNlOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi1wdWJsaWMgaW50ZXJmYWNlIElUZXN0Rm9sZGVyU2V0dXAgewotCi0JLyoqCi0JICogUmV0dXJuIHRvcCB0ZXN0IHJvb3Qgc291cmNlIGZvbGRlciBmaWxlCi0JICovCi0JRmlsZSBnZXRUb3BUZXN0Um9vdFNvdXJjZSgpOwotCQotCS8qKgotCSAqIFJldHVybiB0ZXN0IGhvbWUgZm9sZGVyIGZpbGUKLQkgKi8KLQlGaWxlIGdldFRlc3RIb21lKCk7CQotCQotfQpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0ZXIvaWZhY2UvTGlicmFyeUp1bml0VGVzdC5qYXZhIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0ZXIvaWZhY2UvTGlicmFyeUp1bml0VGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYjkzZDIyLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdGVyL2lmYWNlL0xpYnJhcnlKdW5pdFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5pZmFjZTsKLQotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIHNob3VsZCBiZSBpbXBsZW1lbnRlZCBieSBhbGwgVGVzdENhc2UKLSAqIGNsYXNzZXMgdGhhdCB3YW50IHRvIHVzZSBMaWJyYXJ5SnVuaXRUZXN0U2VydmljZS4gCi0gKiAKLSAqIEBhdXRob3IgV2VpcGluZyBMdQotICogQHNpbmNlIDEuMAotICogCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgTGlicmFyeUp1bml0VGVzdCB7Ci0JCi0JLyoKLQkgKiBOdW1iZXIgb2YgdGVzdCBjYXNlcyBpbiB0aGUgaW1wbGVtZW50aW5nCi0JICogVGVzdENhc2UgY2xhc3MuIEl0IGlzIHVzZWQgYnkgTGlicmFyeUp1bml0VGVzdFNlcnZpY2UKLQkgKiB0byBkZXRlcm1pbmUgd2hlbiB0byBjbGVhciB1cCBzb21lIHRlc3RlciByZXNvdXJjZXMuCi0JICovCi0JaW50IG51bVRlc3RDYXNlcygpOwotCQotCS8qCi0JICogTmFtZSBvZiB0aGUgdGVzdCBjbGFzcyBpbnN0YW5jZQotCSAqLwotCVN0cmluZyBnZXROYW1lKCk7Ci0JCi19CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3Rlci9pZmFjZS9MaWJyYXJ5VGVzdGVyLmphdmEgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3Rlci9pZmFjZS9MaWJyYXJ5VGVzdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3YjE0MjIuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0ZXIvaWZhY2UvTGlicmFyeVRlc3Rlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmlmYWNlOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLkxpYnJhcnlUZXN0U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci0KLS8qKgotICogVXNlZCBpbiBKVW5pdCB0ZXN0cyAKLSAqIAotICogQGF1dGhvciBXZWlwaW5nIEx1Ci0gKiBAc2luY2UgMS4wCi0gKiAKLSAqLwotcHVibGljIGludGVyZmFjZSBMaWJyYXJ5VGVzdGVyIGV4dGVuZHMgVGVzdFRyYWNlciB7CQotCQotCVRlc3RDb21tYW5kIG5ld1Rlc3RDb21tYW5kKENsYXNzIGNscyk7CQotCQotCXZvaWQgc2V0VGVzdFJvb3RTb3VyY2UoRmlsZSBkaXJGaWxlKTsKLQkKLQl2b2lkIHNldFRlc3RSb290V29ya2luZyhGaWxlIGRpckZpbGUpOwotCQotCXZvaWQgb3BlbkN1cnJUZXN0RGlyKEZpbGUgZGlyRmlsZSk7Ci0JCi0Jdm9pZCBjbG9zZUN1cnJUZXN0RGlyKCk7Ci0JCi0Jdm9pZCBkb25lV2l0aEFsbFRlc3RzKEZpbGUgdG9wQ2xlYW5VcEZvbGRlcik7CQotCQkKLQl2b2lkIHNldFRlc3QoRmlsZSB0ZXN0RmlsZSk7CQkJCi0JCi0JaW50IGluY0V4ZWN1dGVkVGVzdENvdW50KCk7Ci0JCi0Jdm9pZCB0cmFjZShTdHJpbmcgbGluZSk7Ci0JCi0JVENFeGVSZXBseUxpc3QgZXhlY3V0ZSgpOwotCQotfQpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0ZXIvaWZhY2UvVENFeGVSZXBseS5qYXZhIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0ZXIvaWZhY2UvVENFeGVSZXBseS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZGE5M2Q3Li4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdGVyL2lmYWNlL1RDRXhlUmVwbHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5pZmFjZTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIEludGVyZmFjZSByZXByZXNlbnRpbmcgcmVwbHkgZnJvbSBhIHRlc3QgY29tbWFuZCBleGVjdXRpb24gCi0gKiAKLSAqIEBhdXRob3IgV2VpcGluZyBMdQotICogQHNpbmNlIDEuMAotICogCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgVENFeGVSZXBseSB7Ci0JU3RyaW5nIGdldExhc3RNc2coKTsKLQlMaXN0IGdldE1zZ3MoKTsKLQlib29sZWFuIHBhc3NpbmcoKTsJCi19CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3Rlci9pZmFjZS9UQ0V4ZVJlcGx5TGlzdC5qYXZhIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0ZXIvaWZhY2UvVENFeGVSZXBseUxpc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDM4MDc5ZC4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3Rlci9pZmFjZS9UQ0V4ZVJlcGx5TGlzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmlmYWNlOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogSW50ZXJmYWNlIHJlcHJlc2VudGluZyByZXBseSBmcm9tIGEgdGVzdCBjb21tYW5kIGV4ZWN1dGlvbiAKLSAqIAotICogQGF1dGhvciBXZWlwaW5nIEx1Ci0gKiBAc2luY2UgMS4wCi0gKiAKLSAqLwotcHVibGljIGludGVyZmFjZSBUQ0V4ZVJlcGx5TGlzdCB7Ci0JaW50IHNpemUoKTsKLQlUQ0V4ZVJlcGx5IGl0ZW0oaW50IGkpOwotCVN0cmluZyBnZXRTdW1tYXJ5UmVwbHkoKTsKLQlib29sZWFuIHBhc3NpbmcoKTsJCi19CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3Rlci9pZmFjZS9UZXN0Q29tbWFuZC5qYXZhIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0ZXIvaWZhY2UvVGVzdENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2JjZWNkMS4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3Rlci9pZmFjZS9UZXN0Q29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmlmYWNlOwotCi1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotLyoqCi0gKiBVc2VkIGluIEpVbml0IHRlc3RzIAotICogCi0gKiBAYXV0aG9yIFdlaXBpbmcgTHUKLSAqIEBzaW5jZSAxLjAKLSAqIAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFRlc3RDb21tYW5kIHsJCQkJCi0JCi0JU3RyaW5nIFRlc3ROYW1lRXh0ID0gIi50YyI7Ci0JCi0JLy9BbGwgdGhlIHRhZ3Mgd2lsbCBiZSBmb3JtYWxseSBzcGVjaWZpZWQgYW5kIHJlYWQgZnJvbQotCS8vYSBzY2hlbWEgbGF0ZXIuCi0JCi0JLy9BdHRyaWJ1dGUgdGFncwotCVN0cmluZyBBVF9FeHRJZCA9ICJleHRJZCI7Ci0JU3RyaW5nIEFUX0Rpc2FibGUgPSAiZGlzYWJsZSI7Ci0JU3RyaW5nIEFUX0xpYkZvbGRlck5hbWUgPSAibGliRm9sZGVyTmFtZSI7Ci0JU3RyaW5nIEFUX0V4cG9ydEZvbGRlck5hbWUgPSAiZXhwb3J0Rm9sZGVyTmFtZSI7Ci0JU3RyaW5nIEFUX0ltcG9ydEZvbGRlck5hbWUgPSAiaW1wb3J0Rm9sZGVyTmFtZSI7Ci0JU3RyaW5nIEFUX0dvbGRlbkxpYkZvbGRlck5hbWUgPSAiZ29sZGVuTGliRm9sZGVyTmFtZSI7Ci0JU3RyaW5nIEFUX1NlbGVjdGVkQ29uZmlnTmFtZSA9ICJzZWxlY3RlZENvbmZpZ05hbWUiOwotCVN0cmluZyBBVF9EaWZmQ291bnQgPSAiZGlmZkNvdW50IjsKLQlTdHJpbmcgQVRfRWxlbWVudENvdW50ID0gImVsZW1lbnRDb3VudCI7Ci0JU3RyaW5nIEFUX1VzZU5hbWVBc0lkPSAidXNlTmFtZUFzSWQiOwotCVN0cmluZyBBVF9NZXJnZSA9ICJtZXJnZSI7Ci0JU3RyaW5nIEFUX05hbWUgPSAibmFtZSI7Ci0JU3RyaW5nIEFUX1R5cGUgPSAidHlwZSI7Ci0JU3RyaW5nIEFUX0JyaWVmRGVzY3JpcHRpb24gPSAiYnJpZWZEZXNjcmlwdGlvbiI7Ci0JU3RyaW5nIEFUX0F1dGhvcnMgPSAiYXV0aG9ycyI7Ci0JU3RyaW5nIEFUX1BhcmVudFBhdGg9InBhcmVudFBhdGgiOwotCVN0cmluZyBBVF9QYXJlbnRFeHRJZD0icGFyZW50RXh0SWQiOwotCVN0cmluZyBBVF9QYXRoPSJwYXRoIjsKLQlTdHJpbmcgQVRfUmVjdXJzaXZlPSJyZWN1cnNpdmUiOwotCVN0cmluZyBBVF9Hb2xkZW5GaWxlTmFtZSA9ICJnb2xkZW5GaWxlTmFtZSI7Ci0JU3RyaW5nIEFUX091dHB1dEZpbGVOYW1lID0gIm91dHB1dEZpbGVOYW1lIjsKLQlTdHJpbmcgQVRfRXJyb3JDb3VudCA9ICJlcnJvckNvdW50IjsKLQlTdHJpbmcgQVRfQ2lyY3VsYXJFbGVtZW50Q291bnQgPSAiY2lyY3VsYXJFbGVtZW50Q291bnQiOwotCVN0cmluZyBBVF9WZXJib3NlID0gInZlcmJvc2UiOwotCQkKLQkvL1ZhbHVlIGVsZW1lbnQgdGFncwotCVN0cmluZyBWVF9iYXNlcyA9ICJiYXNlcyI7Ci0JU3RyaW5nIFZUX1ZhbHVlID0gIlZhbHVlIjsKLQkJCQkKLQlTdHJpbmcgdGFnTmFtZSgpOwotCS8vTGlicmFyeVRlc3RlciBnZXRUZXN0ZXIoKTsJCi0Jdm9pZCBzZXRBdHRyaWJ1dGUoU3RyaW5nIGF0dE5hbWUsIFN0cmluZyBhdHRWYWx1ZSk7Ci0JU3RyaW5nIGdldEF0dHJpYnV0ZShTdHJpbmcgYXR0TmFtZSk7Ci0Jdm9pZCBwYXJzZShFbGVtZW50IGVsZW1lbnQpOwotCVRDRXhlUmVwbHkgZXhlY3V0ZSgpOwotfQpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0ZXIvaWZhY2UvVGVzdFRyYWNlci5qYXZhIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0ZXIvaWZhY2UvVGVzdFRyYWNlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNDgyY2Y3Li4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdGVyL2lmYWNlL1Rlc3RUcmFjZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5pZmFjZTsKLQotLyoqCi0gKiBVc2VkIGluIEpVbml0IHRlc3RzIAotICogCi0gKiBAYXV0aG9yIFdlaXBpbmcgTHUKLSAqIEBzaW5jZSAxLjAKLSAqIAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFRlc3RUcmFjZXIgewotCXZvaWQgdHJhY2UoU3RyaW5nIGxpbmUpOwotfQpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0ZXIvaW1wbC9FeHBvcnRJbXBvcnRUZXN0SW1wbC5qYXZhIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0ZXIvaW1wbC9FeHBvcnRJbXBvcnRUZXN0SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNGY4M2M1Li4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdGVyL2ltcGwvRXhwb3J0SW1wb3J0VGVzdEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5pbXBsOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5EYXRlOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy5UZXN0c1BsdWdpbjsKLQotaW1wb3J0IGNvbS5pYm0uaWN1LnRleHQuU2ltcGxlRGF0ZUZvcm1hdDsKLWltcG9ydCBjb20uaWJtLmljdS51dGlsLkNhbGVuZGFyOwotCi0vKioKLSAqIEpVbml0IHRlc3RzIGZvciBwbHVnaW4gZXhwb3J0L2ltcG9ydAotICogCi0gKiBAYXV0aG9yIFdlaXBpbmcgTHUKLSAqIEBzaW5jZSAxLjAKLSAqIAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgRXhwb3J0SW1wb3J0VGVzdEltcGwgZXh0ZW5kcyBMaWJyYXJ5SnVuaXRUZXN0SW1wbCB7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIHNvdXJjZUZvbGRlck5hbWUgPSAiRXhwb3J0SW1wb3J0IjsKLQlwcml2YXRlIHN0YXRpYyAgRmlsZSB0ZXN0Um9vdFNvdXJjZTsKLQotCXByaXZhdGUgc3RhdGljIE1hcCB0ZXN0Um9vdFdvcmtpbmdNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQotCXByaXZhdGUgRmlsZSBkZWZhdWx0VGVzdERpcjsgCi0JCi0JcHVibGljIEV4cG9ydEltcG9ydFRlc3RJbXBsKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3luY2hyb25pemVkIEZpbGUgZ2V0VGVzdFJvb3RTb3VyY2UoKSB7Ci0JCWlmICh0ZXN0Um9vdFNvdXJjZSA9PSBudWxsKSB7Ci0JCQlTdHJpbmcgcGF0aCA9IGdldFNlcnZpY2UoKS5nZXRUb3BUZXN0Um9vdFNvdXJjZSgpLmdldEFic29sdXRlUGF0aCgpOwotCQkJcGF0aCArPSBGaWxlLnNlcGFyYXRvciArIHNvdXJjZUZvbGRlck5hbWUgKyAgRmlsZS5zZXBhcmF0b3I7Ci0JCQl0ZXN0Um9vdFNvdXJjZSA9IG5ldyBGaWxlKHBhdGgpOwotCQl9Ci0JCXJldHVybiB0ZXN0Um9vdFNvdXJjZTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN5bmNocm9uaXplZCBGaWxlIGdldFRlc3RSb290V29ya2luZygpIHsKLQkJRmlsZSB0ZXN0Um9vdFdvcmtpbmcgPSAoRmlsZSkgdGVzdFJvb3RXb3JraW5nTWFwLmdldChnZXRDbGFzcygpKTsKLQkJaWYgKHRlc3RSb290V29ya2luZyA9PSBudWxsKSB7Ci0JCQlDbGFzcyBjbHMgPSBnZXRDbGFzcygpOwotCQkJU3RyaW5nIHBhY2thZ2VOYW1lID0gY2xzLmdldFBhY2thZ2UoKS5nZXROYW1lKCk7Ci0JCQkKLQkJCVNpbXBsZURhdGVGb3JtYXQgc2RmID0gbmV3IFNpbXBsZURhdGVGb3JtYXQoInl5eXktTU0tZGQgaGg6bW06c3M6U1NTIik7IC8vJE5PTi1OTFMtMSQKLQkJCVN0cmluZyBkdFN0ciA9IHNkZi5mb3JtYXQobmV3IERhdGUoKSk7Ci0JCQlkdFN0ciA9IGR0U3RyLnJlcGxhY2UoJyAnLCAnXycpOwotCQkJZHRTdHIgPSBkdFN0ci5yZXBsYWNlKCc6JywgJy0nKTsKLQkJCQotCQkJU3RyaW5nIHBhdGggPSBnZXRTZXJ2aWNlKCkuZ2V0VGVzdEdyb3VwKCkuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0JCQlwYXRoICs9IEZpbGUuc2VwYXJhdG9yICsgY2xzLmdldE5hbWUoKS5zdWJzdHJpbmcocGFja2FnZU5hbWUubGVuZ3RoKCkgKyAxKTsKLQkJCXBhdGggKz0gIl8iICsgZHRTdHIgKyBGaWxlLnNlcGFyYXRvcjsKLQkJCXRlc3RSb290V29ya2luZyA9IG5ldyBGaWxlKHBhdGgpOwotCQkJdGVzdFJvb3RXb3JraW5nTWFwLnB1dChnZXRDbGFzcygpLCB0ZXN0Um9vdFdvcmtpbmcpOwotCQl9Ci0JCXJldHVybiB0ZXN0Um9vdFdvcmtpbmc7Ci0JfQotCQotCXByb3RlY3RlZCBGaWxlIGdldERlZmF1bHRUZXN0RGlyKCkgewotCQlpZiAoZGVmYXVsdFRlc3REaXIgPT0gbnVsbCkgewotCQkJU3RyaW5nIHBhdGggPSBnZXRUZXN0Um9vdFdvcmtpbmcoKS5nZXRBYnNvbHV0ZVBhdGgoKSArIEZpbGUuc2VwYXJhdG9yICsgZ2V0TmFtZSgpOyAKLQkJCWRlZmF1bHRUZXN0RGlyID0gbmV3IEZpbGUocGF0aCk7Ci0JCX0KLQkJCi0JCXJldHVybiBkZWZhdWx0VGVzdERpcjsKLQl9Ci0JCQotfQpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0ZXIvaW1wbC9MaWJyYXJ5SnVuaXRUZXN0SW1wbC5qYXZhIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0ZXIvaW1wbC9MaWJyYXJ5SnVuaXRUZXN0SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ODExNzBlLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdGVyL2ltcGwvTGlicmFyeUp1bml0VGVzdEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5pbXBsOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLkxpYnJhcnlKdW5pdFRlc3RTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5MaWJyYXJ5VGVzdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXIuaWZhY2UuTGlicmFyeUp1bml0VGVzdDsKLQotLyoqCi0gKiBMaWJyYXJ5IGp1bml0IHRlc3QgYmFzZSBjbGFzcwotICogCi0gKiBAYXV0aG9yIFdlaXBpbmcgTHUKLSAqIEBzaW5jZSAxLjAKLSAqIAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgTGlicmFyeUp1bml0VGVzdEltcGwgZXh0ZW5kcyBUZXN0Q2FzZSBpbXBsZW1lbnRzIExpYnJhcnlKdW5pdFRlc3QgewotCi0JcHJpdmF0ZSBMaWJyYXJ5SnVuaXRUZXN0U2VydmljZSBzZXJ2aWNlOwkKLQkKLQlwdWJsaWMgTGlicmFyeUp1bml0VGVzdEltcGwoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JCXNlcnZpY2UgPSBMaWJyYXJ5SnVuaXRUZXN0U2VydmljZS5nZXRJbnN0YW5jZSh0aGlzKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIGFic3RyYWN0IEZpbGUgZ2V0VGVzdFJvb3RTb3VyY2UoKTsKLQkKLQlwcm90ZWN0ZWQgYWJzdHJhY3QgRmlsZSBnZXRUZXN0Um9vdFdvcmtpbmcoKTsKLQkKLQlwcm90ZWN0ZWQgYWJzdHJhY3QgRmlsZSBnZXREZWZhdWx0VGVzdERpcigpOwotCQotCQotCXB1YmxpYyBMaWJyYXJ5SnVuaXRUZXN0U2VydmljZSBnZXRTZXJ2aWNlKCkgewotCQlyZXR1cm4gc2VydmljZTsKLQl9CQotCQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCXNlcnZpY2Uuc2V0VXAoZ2V0VGVzdFJvb3RTb3VyY2UoKSwgZ2V0VGVzdFJvb3RXb3JraW5nKCksIGdldERlZmF1bHRUZXN0RGlyKCksIHRoaXMpOwotCX0JCi0JCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIudGVhckRvd24oKTsKLQkJc2VydmljZS50ZWFyRG93bih0aGlzKTsKLQl9CQkKLQkKLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBlbmRTZXRVcCgpIHsKLQkJc2VydmljZS50cmFjZSgiZW5kU2V0VXA6ICIgKyBnZXROYW1lKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBlbmRUZWFyRG93bigpIHsJCQotCQlzZXJ2aWNlLnRyYWNlKCJlbmRUZWFyRG93bjogIiArIGdldE5hbWUoKSk7Ci0JCXNlcnZpY2UudHJhY2UoIiIpOwkKLQl9CQkKLQkKLQlwdWJsaWMgaW50IG51bVRlc3RDYXNlcygpIHsKLQkJcmV0dXJuIDA7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0ZXIvaW1wbC9MaWJyYXJ5VGVzdGVySW1wbC5qYXZhIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0ZXIvaW1wbC9MaWJyYXJ5VGVzdGVySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YWNjOTZlLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdGVyL2ltcGwvTGlicmFyeVRlc3RlckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5pbXBsOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmlmYWNlLkxpYnJhcnlUZXN0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmlmYWNlLlRDRXhlUmVwbHlMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5pZmFjZS5UZXN0Q29tbWFuZDsKLQotLyoqCi0gKiBVc2VkIGluIEpVbml0IHRlc3RzIAotICogCi0gKiBAYXV0aG9yIFdlaXBpbmcgTHUKLSAqIEBzaW5jZSAxLjAKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgTGlicmFyeVRlc3RlckltcGwgaW1wbGVtZW50cyBMaWJyYXJ5VGVzdGVyIHsKLQkKLQlwcml2YXRlIFRlc3RDb21tYW5kTWdyIHRlc3RDb21tYW5kTWdyOwotCQotCXB1YmxpYyBMaWJyYXJ5VGVzdGVySW1wbChib29sZWFuIHRyYWNlKSB7Ci0JCXRlc3RDb21tYW5kTWdyID0gbmV3IFRlc3RDb21tYW5kTWdyKHRyYWNlKTsKLQl9CQkJCi0JCi0JcHVibGljIHZvaWQgc2V0VGVzdFJvb3RTb3VyY2UoRmlsZSBkaXJGaWxlKSB7Ci0JCXRlc3RDb21tYW5kTWdyLnNldFRlc3RSb290U291cmNlKGRpckZpbGUpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRUZXN0Um9vdFdvcmtpbmcoRmlsZSBkaXJGaWxlKSB7Ci0JCXRlc3RDb21tYW5kTWdyLnNldFRlc3RSb290V29ya2luZyhkaXJGaWxlKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgb3BlbkN1cnJUZXN0RGlyKEZpbGUgZGlyRmlsZSkgewotCQl0ZXN0Q29tbWFuZE1nci5vcGVuQ3VyclRlc3REaXIoZGlyRmlsZSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGNsb3NlQ3VyclRlc3REaXIoKSB7Ci0JCXRlc3RDb21tYW5kTWdyLmNsb3NlQ3VyclRlc3REaXIoKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgZG9uZVdpdGhBbGxUZXN0cyhGaWxlIHRvcENsZWFuVXBGb2xkZXIpIHsKLQkJdGVzdENvbW1hbmRNZ3IuZG9uZVdpdGhBbGxUZXN0cyh0b3BDbGVhblVwRm9sZGVyKTsKLQl9Ci0JCi0JcHVibGljIEZpbGUgZ2V0Q3VyclRlc3REaXIoKSB7Ci0JCXJldHVybiB0ZXN0Q29tbWFuZE1nci5nZXRDdXJyVGVzdERpcigpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRUZXN0KEZpbGUgdGVzdEZpbGUpIHsKLQkJdGVzdENvbW1hbmRNZ3Iuc2V0VGVzdCh0ZXN0RmlsZSk7Ci0JfQkJCi0JCi0JcHVibGljIFRDRXhlUmVwbHlMaXN0IGV4ZWN1dGUoKSB7Ci0JCXJldHVybiB0ZXN0Q29tbWFuZE1nci5leGVjdXRlKCk7Ci0JfQkKLQkKLQlwdWJsaWMgdm9pZCB0cmFjZShTdHJpbmcgbGluZSkgewotCQl0ZXN0Q29tbWFuZE1nci50cmFjZShsaW5lKTsKLQl9CQotCQotCXB1YmxpYyBUZXN0Q29tbWFuZCBuZXdUZXN0Q29tbWFuZChDbGFzcyBjbHMpIHsKLQkJcmV0dXJuIHRlc3RDb21tYW5kTWdyLm5ld1Rlc3RDb21tYW5kKGNscyk7Ci0JfQkJCi0JCi0JcHVibGljIGludCBpbmNFeGVjdXRlZFRlc3RDb3VudCgpIHsKLQkJcmV0dXJuIHRlc3RDb21tYW5kTWdyLmluY0V4ZWN1dGVkVGVzdENvdW50KCk7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0ZXIvaW1wbC9UZXN0Q29tbWFuZEltcGwuamF2YSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdGVyL2ltcGwvVGVzdENvbW1hbmRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhMjRjZjQuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0ZXIvaW1wbC9UZXN0Q29tbWFuZEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXIuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRIYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5pZmFjZS5UQ0V4ZVJlcGx5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5pZmFjZS5UZXN0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXIuaW1wbC50ZXN0Y29tbWFuZHMuVENOZXdNZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0vKioKLSAqIFVzZWQgaW4gSlVuaXQgdGVzdHMgCi0gKiAKLSAqIEBhdXRob3IgV2VpcGluZyBMdQotICogQHNpbmNlIDEuMAotICogCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBUZXN0Q29tbWFuZEltcGwgaW1wbGVtZW50cyBUZXN0Q29tbWFuZCB7Ci0KLQlwcml2YXRlIHN0YXRpYyBUQ05ld01ldGhvZEVsZW1lbnQgbmV3TWV0aG9kRWxlbWVudCA9IG5ldyBUQ05ld01ldGhvZEVsZW1lbnQoKTsgCi0JCi0JcHJpdmF0ZSBib29sZWFuIHZlcmJvc2UgPSBmYWxzZTsKLQlwcml2YXRlIEVsZW1lbnQgZWxlbWVudDsKLQlwcm90ZWN0ZWQgc3RhdGljIGJvb2xlYW4gbG9jYWxEZWJ1ZyA9IGZhbHNlOwotCXByaXZhdGUgVGVzdENvbW1hbmRNZ3Igb3duZXI7Ci0JcHJpdmF0ZSBNYXAgYXR0dGlidXRlTWFwID0gbmV3IExpbmtlZEhhc2hNYXAoKTsKLQkKLQlwdWJsaWMgdm9pZCBzZXRPd25lcihUZXN0Q29tbWFuZE1nciBtZ3IpIHsKLQkJb3duZXIgPSBtZ3I7Ci0JfQotCQotCXByb3RlY3RlZCBNYXAgZ2V0QXR0cmlidXRlTWFwKCkgewotCQlyZXR1cm4gYXR0dGlidXRlTWFwOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRBdHRyaWJ1dGUoU3RyaW5nIGF0dE5hbWUsIFN0cmluZyBhdHRWYWx1ZSkgewotCQlpZiAoYXR0VmFsdWUgIT0gbnVsbCAmJiBhdHRWYWx1ZS5sZW5ndGgoKSA+IDApIHsKLQkJCWF0dHRpYnV0ZU1hcC5wdXQoYXR0TmFtZSwgYXR0VmFsdWUpOwotCQl9Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgcmVtb3ZlQXR0cmlidXRlKFN0cmluZyBhdHROYW1lKSB7Ci0JCXJldHVybiAoU3RyaW5nKSBhdHR0aWJ1dGVNYXAucmVtb3ZlKGF0dE5hbWUpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJpYnV0ZShTdHJpbmcgYXR0TmFtZSkgewotCQlyZXR1cm4gKFN0cmluZykgYXR0dGlidXRlTWFwLmdldChhdHROYW1lKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcGFyc2UoRWxlbWVudCBlbGVtZW50KSB7Ci0JCXRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7Ci0JCXNldEF0dHJpYnV0ZShBVF9WZXJib3NlLCBlbGVtZW50LmdldEF0dHJpYnV0ZShBVF9WZXJib3NlKSk7Ci0JCXZlcmJvc2UgPSBwYXJzZUJvb2xlYW4oQVRfVmVyYm9zZSwgdmVyYm9zZSk7Ci0JfQotCQotCXByb3RlY3RlZCBib29sZWFuIGdldFZlcmJvc2UoKSB7Ci0JCXJldHVybiB2ZXJib3NlOwotCX0KLQkKLQlwcm90ZWN0ZWQgRWxlbWVudCBnZXRFbGVtZW50KCkgewotCQlyZXR1cm4gZWxlbWVudDsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgcGFyc2VDaGlsZHJlbihFbGVtZW50IGVsZW1lbnQpIHsKLQl9Ci0JCi0JcHJvdGVjdGVkIFRlc3RDb21tYW5kTWdyIGdldE93bmVyKCkgewotCQlyZXR1cm4gb3duZXI7Ci0JfQotCQotCXB1YmxpYyBhYnN0cmFjdCBUQ0V4ZVJlcGx5IGV4ZWN1dGUoKTsKLQkKLQlwdWJsaWMgU3RyaW5nIHRhZ05hbWUoKSB7Ci0JCXJldHVybiBvd25lciA9PSBudWxsID8gbnVsbCA6IG93bmVyLmdldFRhZ05hbWUodGhpcyk7Ci0JfQotCQotCXByb3RlY3RlZCBib29sZWFuIHBhcnNlQm9vbGVhbihTdHJpbmcgYXR0LCBib29sZWFuIGRlZmF1bHRWYWx1ZSkgewotCQlTdHJpbmcgdG9DaGVja1N0ciA9IGRlZmF1bHRWYWx1ZSA/ICJmYWxzZSIgOiAidHJ1ZSI7Ci0JCVN0cmluZyBzdHIgPSBnZXRBdHRyaWJ1dGUoYXR0KTsKLQkJaWYgKHN0ciAhPSBudWxsICYmIHN0ci5lcXVhbHNJZ25vcmVDYXNlKHRvQ2hlY2tTdHIpKSB7Ci0JCQlyZXR1cm4gIWRlZmF1bHRWYWx1ZTsKLQkJfQotCQlyZXR1cm4gZGVmYXVsdFZhbHVlOwotCX0KLQotCXByb3RlY3RlZCBpbnQgcGFyc2VJbnRlZ2VyKFN0cmluZyBhdHQsIGludCBkZWZhdWx0VmFsdWUpIHsKLQkJaWYgKGF0dCAhPSBudWxsICYmIGF0dC5sZW5ndGgoKSA+IDApIHsKLQkJCXJldHVybiBJbnRlZ2VyLnBhcnNlSW50KGF0dCk7Ci0JCX0KLQkJcmV0dXJuIGRlZmF1bHRWYWx1ZTsKLQl9Ci0JCi0JcHVibGljIEVDbGFzcyBnZXRFQ2xhc3MoU3RyaW5nIHR5cGUpIHsKLQkJcmV0dXJuIG5ld01ldGhvZEVsZW1lbnQuZ2V0RUNsYXNzKHR5cGUpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzYXZlKE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgewotCQluZXdNZXRob2RFbGVtZW50LnNhdmUoZWxlbWVudCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgbG9nKFN0cmluZyBsaW5lKSB7Ci0JCWdldE93bmVyKCkubG9nKGxpbmUpOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdGVyL2ltcGwvVGVzdENvbW1hbmRNZ3IuamF2YSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdGVyL2ltcGwvVGVzdENvbW1hbmRNZ3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWI2MzVkOC4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3Rlci9pbXBsL1Rlc3RDb21tYW5kTWdyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MTYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmltcGw7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uUHJpbnRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZEhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuWE1MVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLnNlcnZpY2VzLlBsdWdpbkltcG9ydGluZ1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucHJvamVjdC5NZXRob2RMaWJyYXJ5UHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXIuTGlicmFyeURpZmZBbmFseXpvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXIuTGlicmFyeVRlc3RTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5pZmFjZS5MaWJyYXJ5SnVuaXRUZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5pZmFjZS5UQ0V4ZVJlcGx5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5pZmFjZS5UQ0V4ZVJlcGx5TGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXIuaWZhY2UuVGVzdENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmlmYWNlLlRlc3RUcmFjZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmltcGwudGVzdGNvbW1hbmRzLlRDQ2lyY3VsYXJEZXBlbmRlbmN5Q2hlY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmltcGwudGVzdGNvbW1hbmRzLlRDQ29tcGFyZVRvR29sZGVuRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXIuaW1wbC50ZXN0Y29tbWFuZHMuVENDb21wYXJlVG9MaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5pbXBsLnRlc3Rjb21tYW5kcy5UQ0NvcHlMaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5pbXBsLnRlc3Rjb21tYW5kcy5UQ0VkaXRNZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5pbXBsLnRlc3Rjb21tYW5kcy5UQ0V4ZVJlcGx5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXIuaW1wbC50ZXN0Y29tbWFuZHMuVENFeGVSZXBseUxpc3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5pbXBsLnRlc3Rjb21tYW5kcy5UQ0V4cG9ydENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmltcGwudGVzdGNvbW1hbmRzLlRDRXhwb3J0UGx1Z2luczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXIuaW1wbC50ZXN0Y29tbWFuZHMuVENFeHBvcnRYbWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmltcGwudGVzdGNvbW1hbmRzLlRDSW1wb3J0Q29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXIuaW1wbC50ZXN0Y29tbWFuZHMuVENJbXBvcnRQbHVnaW5zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5pbXBsLnRlc3Rjb21tYW5kcy5UQ0ltcG9ydFhtbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXIuaW1wbC50ZXN0Y29tbWFuZHMuVENOZXdNZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5pbXBsLnRlc3Rjb21tYW5kcy5UQ05ld01ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmltcGwudGVzdGNvbW1hbmRzLlRDTmV3TWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5pbXBsLnRlc3Rjb21tYW5kcy5UQ09wZW5MaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5pbXBsLnRlc3Rjb21tYW5kcy5UQ091dHB1dE1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMuTGlicmFyeVRlc3RIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5MaWJyYXJ5VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkuWE1JTGlicmFyeVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DYXBhYmlsaXR5UGF0dGVybjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLQotLyoqCi0gKiBVc2VkIGluIEpVbml0IHRlc3RzIAotICogCi0gKiBAYXV0aG9yIFdlaXBpbmcgTHUKLSAqIEBzaW5jZSAxLjAKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgVGVzdENvbW1hbmRNZ3IgaW1wbGVtZW50cyBUZXN0VHJhY2VyIHsJCi0JCi0JLy9BbGwgdGhlIHRhZ3Mgd2lsbCBiZSBmb3JtYWxseSBzcGVjaWZpZWQgYW5kIHJlYWQgZnJvbQotCS8vYSBzY2hlbWEgbGF0ZXIuCQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBUQ0NvcHlMaWJyYXJ5ID0gIkNvcHlMaWJyYXJ5IjsKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgVENPcGVuTGlicmFyeSA9ICJPcGVuTGlicmFyeSI7Ci0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIFRDRXhwb3J0UGx1Z2lucyA9ICJFeHBvcnRQbHVnaW5zIjsKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgVENJbXBvcnRQbHVnaW5zID0gIkltcG9ydFBsdWdpbnMiOwkKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgVENFeHBvcnRDb25maWd1cmF0aW9uID0gIkV4cG9ydENvbmZpZ3VyYXRpb24iOwotCXByaXZhdGUgc3RhdGljIFN0cmluZyBUQ0ltcG9ydENvbmZpZ3VyYXRpb24gPSAiSW1wb3J0Q29uZmlndXJhdGlvbiI7Ci0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIFRDRXhwb3J0WG1sID0gIkV4cG9ydFhtbCI7Ci0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIFRDSW1wb3J0WG1sID0gIkltcG9ydFhtbCI7Ci0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIFRDQ29tcGFyZVRvTGlicmFyeSA9ICJDb21wYXJlVG9MaWJyYXJ5IjsKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgVENDb21wYXJlVG9Hb2xkZW5GaWxlID0gIkNvbXBhcmVUb0dvbGRlbkZpbGUiOwotCXByaXZhdGUgc3RhdGljIFN0cmluZyBUQ05ld01ldGhvZFBsdWdpbiA9ICJOZXdNZXRob2RQbHVnaW4iOwotCXByaXZhdGUgc3RhdGljIFN0cmluZyBUQ05ld01ldGhvZENvbmZpZ3VyYXRpb24gPSAiTmV3TWV0aG9kQ29uZmlndXJhdGlvbiI7Ci0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIFRDTmV3TWV0aG9kRWxlbWVudCA9ICJOZXdNZXRob2RFbGVtZW50IjsKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgVENFZGl0TWV0aG9kRWxlbWVudCA9ICJFZGl0TWV0aG9kRWxlbWVudCI7Ci0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIFRDQ2lyY3VsYXJEZXBlbmRlbmN5Q2hlY2sgPSAiQ2lyY3VsYXJEZXBlbmRlbmN5Q2hlY2siOwotCXByaXZhdGUgc3RhdGljIFN0cmluZyBUQ0VuZCA9ICJFbmQiOwotCQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBUQ0VkaXRQbHVnaW49IkVkaXRQbHVnaW4iOwotCXByaXZhdGUgc3RhdGljIFN0cmluZyBUQ0VkaXRDb25maWd1cmF0aW9uPSJFZGl0Q29uZmlndXJhdGlvbiI7Ci0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIFRDRWRpdENvbnRlbnRQYWNrYWdlPSJFZGl0Q29udGVudFBhY2thZ2UiOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRDT3V0cHV0TGlicmFyeT0iT3V0cHV0TGlicmFyeSI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVENPdXRwdXRQbHVnaW49Ik91dHB1dFBsdWdpbiI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVENPdXRwdXRDb25maWd1cmF0aW9uPSJPdXRwdXRDb25maWd1cmF0aW9uIjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUQ091dHB1dE1ldGhvZEVsZW1lbnQ9Ik91dHB1dE1ldGhvZEVsZW1lbnQiOwotCQkKLQlwcml2YXRlIGJvb2xlYW4gdHJhY2UgPSBmYWxzZTsKLQlwcml2YXRlIGJvb2xlYW4gcmVtb3ZlRmlsZXMgPSB0cnVlOwotCQotCXByaXZhdGUgRmlsZSB0ZXN0Um9vdFNvdXJjZTsKLQlwcml2YXRlIEZpbGUgdGVzdFJvb3RXb3JraW5nOwotCXByaXZhdGUgRmlsZSBjdXJyVGVzdERpcjsKLQlwcml2YXRlIFN0cmluZyBvdXRwdXRQYXRoOwotCXByaXZhdGUgRG9jdW1lbnQgb3V0cHV0RG9jdW1lbnQ7Ci0JcHJpdmF0ZSBQcmludFN0cmVhbSB0ZXN0Um9vdE91dDsKLQlwcml2YXRlIFByaW50U3RyZWFtIGN1cnJUZXN0T3V0OwotCXByaXZhdGUgaW50IGV4ZWN1dGVkVGVzdENvdW50ID0gMDsJCi0JCQotCXByaXZhdGUgc3RhdGljIExpYnJhcnlUZXN0U2VydmljZSBzZXJ2aWNlID0gTGlicmFyeVRlc3RTZXJ2aWNlLmdldEluc3RhbmNlKCk7Ci0JcHJpdmF0ZSBGaWxlIHRlc3RGaWxlOwotCXByaXZhdGUgTGlzdCB0ZXN0Q29tbWFuZExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JcHJpdmF0ZSBMaWJyYXJ5SnVuaXRUZXN0IGp1bml0VGVzdENhc2U7Ci0JCi0JcHJpdmF0ZSBNZXRob2RMaWJyYXJ5IGN1cnJlbnRCYXNlTGliOwotCXByaXZhdGUgTWFwIGFsbExpYnMgPSBuZXcgTGlua2VkSGFzaE1hcCgpOwotCXByaXZhdGUgTWFwIGFsbEV4cG9ydHMgPSBuZXcgTGlua2VkSGFzaE1hcCgpOwkKLQkKLQlwcml2YXRlIHN0YXRpYyBNYXAgdGNDbGFzc01hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JcHJpdmF0ZSBzdGF0aWMgTWFwIHRjVGFnTmFtZU1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCi0JcHJpdmF0ZSBQcmludFN0cmVhbSBsb2dQUyA9IFN5c3RlbS5vdXQ7Ci0JCi0Jc3RhdGljIHsKLQkJYWRkVG9UY0NsYXNzTWFwKFRDQ29weUxpYnJhcnksIFRDQ29weUxpYnJhcnkuY2xhc3MpOwotCQlhZGRUb1RjQ2xhc3NNYXAoVENPcGVuTGlicmFyeSwgVENPcGVuTGlicmFyeS5jbGFzcyk7Ci0JCWFkZFRvVGNDbGFzc01hcChUQ0V4cG9ydFBsdWdpbnMsIFRDRXhwb3J0UGx1Z2lucy5jbGFzcyk7Ci0JCWFkZFRvVGNDbGFzc01hcChUQ0ltcG9ydFBsdWdpbnMsIFRDSW1wb3J0UGx1Z2lucy5jbGFzcyk7CQkKLQkJYWRkVG9UY0NsYXNzTWFwKFRDRXhwb3J0Q29uZmlndXJhdGlvbiwgVENFeHBvcnRDb25maWd1cmF0aW9uLmNsYXNzKTsKLQkJYWRkVG9UY0NsYXNzTWFwKFRDSW1wb3J0Q29uZmlndXJhdGlvbiwgVENJbXBvcnRDb25maWd1cmF0aW9uLmNsYXNzKTsKLQkJYWRkVG9UY0NsYXNzTWFwKFRDRXhwb3J0WG1sLCBUQ0V4cG9ydFhtbC5jbGFzcyk7Ci0JCWFkZFRvVGNDbGFzc01hcChUQ0ltcG9ydFhtbCwgVENJbXBvcnRYbWwuY2xhc3MpOwkJCi0JCWFkZFRvVGNDbGFzc01hcChUQ0NvbXBhcmVUb0xpYnJhcnksIFRDQ29tcGFyZVRvTGlicmFyeS5jbGFzcyk7Ci0JCWFkZFRvVGNDbGFzc01hcChUQ0NvbXBhcmVUb0dvbGRlbkZpbGUsIFRDQ29tcGFyZVRvR29sZGVuRmlsZS5jbGFzcyk7Ci0JCQotCQlhZGRUb1RjQ2xhc3NNYXAoVENOZXdNZXRob2RQbHVnaW4sIFRDTmV3TWV0aG9kUGx1Z2luLmNsYXNzKTsKLQkJYWRkVG9UY0NsYXNzTWFwKFRDTmV3TWV0aG9kQ29uZmlndXJhdGlvbiwgVENOZXdNZXRob2RDb25maWd1cmF0aW9uLmNsYXNzKTsJCQotCQlhZGRUb1RjQ2xhc3NNYXAoVENOZXdNZXRob2RFbGVtZW50LCBUQ05ld01ldGhvZEVsZW1lbnQuY2xhc3MpOwotCQlhZGRUb1RjQ2xhc3NNYXAoVENFZGl0TWV0aG9kRWxlbWVudCwgVENFZGl0TWV0aG9kRWxlbWVudC5jbGFzcyk7Ci0JCQotCQlhZGRUb1RjQ2xhc3NNYXAoVENFZGl0UGx1Z2luLCBUQ0VkaXRNZXRob2RFbGVtZW50LmNsYXNzKTsKLQkJYWRkVG9UY0NsYXNzTWFwKFRDRWRpdENvbmZpZ3VyYXRpb24sIFRDRWRpdE1ldGhvZEVsZW1lbnQuY2xhc3MpOwotCQlhZGRUb1RjQ2xhc3NNYXAoVENFZGl0Q29udGVudFBhY2thZ2UsIFRDRWRpdE1ldGhvZEVsZW1lbnQuY2xhc3MpOwotCQkKLQkJYWRkVG9UY0NsYXNzTWFwKFRDT3V0cHV0TGlicmFyeSwgVENPdXRwdXRNZXRob2RFbGVtZW50LmNsYXNzKTsKLQkJYWRkVG9UY0NsYXNzTWFwKFRDT3V0cHV0UGx1Z2luLCBUQ091dHB1dE1ldGhvZEVsZW1lbnQuY2xhc3MpOwotCQlhZGRUb1RjQ2xhc3NNYXAoVENPdXRwdXRDb25maWd1cmF0aW9uLCBUQ091dHB1dE1ldGhvZEVsZW1lbnQuY2xhc3MpOwotCQlhZGRUb1RjQ2xhc3NNYXAoVENPdXRwdXRNZXRob2RFbGVtZW50LCBUQ091dHB1dE1ldGhvZEVsZW1lbnQuY2xhc3MpOwotCQlhZGRUb1RjQ2xhc3NNYXAoVENDaXJjdWxhckRlcGVuZGVuY3lDaGVjaywgVENDaXJjdWxhckRlcGVuZGVuY3lDaGVjay5jbGFzcyk7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIHZvaWQgYWRkVG9UY0NsYXNzTWFwKFN0cmluZyBlbGVtZW50TmFtZSwgQ2xhc3MgY2xzKSB7Ci0JCU9iamVjdCBpbnN0YW5jZSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlpbnN0YW5jZSA9IGNscy5uZXdJbnN0YW5jZSgpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSl7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JCWlmIChpbnN0YW5jZSBpbnN0YW5jZW9mIFRlc3RDb21tYW5kKSB7Ci0JCQl0Y0NsYXNzTWFwLnB1dChlbGVtZW50TmFtZSwgaW5zdGFuY2UpOwotCQkJdGNUYWdOYW1lTWFwLnB1dChjbHMsIGVsZW1lbnROYW1lKTsKLQkJfQkJCi0JfQotCi0JcHVibGljIFRlc3RDb21tYW5kTWdyKGJvb2xlYW4gdHJhY2UpIHsKLQkJaWYgKHRyYWNlKSB7Ci0JCQl0aGlzLnRyYWNlID0gdHJhY2U7Ci0JCQl0aGlzLnJlbW92ZUZpbGVzID0gIXRyYWNlOwotCQl9Ci0JfQkKLQkKLQlwdWJsaWMgU3RyaW5nIGdldFRhZ05hbWUoVGVzdENvbW1hbmQgdGNJbnN0YW5jZSkgewotCQlyZXR1cm4gKFN0cmluZykgdGNUYWdOYW1lTWFwLmdldCh0Y0luc3RhbmNlLmdldENsYXNzKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRUZXN0Um9vdFNvdXJjZShGaWxlIGRpckZpbGUpIHsKLQkJdGVzdFJvb3RTb3VyY2UgPSBkaXJGaWxlOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRUZXN0Um9vdFdvcmtpbmcoRmlsZSBkaXJGaWxlKSB7Ci0JCWJvb2xlYW4gbmVlZFRvQ3JlYXRlT3V0cHV0RmlsZSA9IHRlc3RSb290V29ya2luZyA9PSBudWxsIHx8Ci0JCQkJCQkJCSEgdGVzdFJvb3RXb3JraW5nLmVxdWFscyhkaXJGaWxlKTsKLQkJCi0JCXRlc3RSb290V29ya2luZyA9IGRpckZpbGU7Ci0JCQotCQlpZiAodHJhY2UgJiYgbmVlZFRvQ3JlYXRlT3V0cHV0RmlsZSkgewotCQkJdHJ5IHsKLQkJCQlpZiAoISB0ZXN0Um9vdFdvcmtpbmcuZXhpc3RzKCkpIHsJCQkJCQotCQkJCQlpZiAoISBta0Rpcih0ZXN0Um9vdFdvcmtpbmcpKSB7Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKHRlc3RSb290T3V0ICE9IG51bGwpIHsKLQkJCQkJdGVzdFJvb3RPdXQuY2xvc2UoKTsKLQkJCQl9Ci0JCQkJU3RyaW5nIHBhdGggPSB0ZXN0Um9vdFdvcmtpbmcuZ2V0QWJzb2x1dGVQYXRoKCkgKyBGaWxlLnNlcGFyYXRvciArICJ0cmFjZXMub3V0IjsKLQkJCQl0ZXN0Um9vdE91dCA9IG5ldyBQcmludFN0cmVhbShuZXcgRmlsZU91dHB1dFN0cmVhbShwYXRoKSk7Ci0KLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CQotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBib29sZWFuIG1rRGlyKEZpbGUgZmlsZSkgewotCQlGaWxlIHBGaWxlID0gZmlsZS5nZXRQYXJlbnRGaWxlKCk7CQkKLQkJaWYgKCEgcEZpbGUuZXhpc3RzKCkpIHsJCQkJCQotCQkJaWYgKCEgbWtEaXIocEZpbGUpKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmaWxlLm1rZGlyKCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIG9wZW5DdXJyVGVzdERpcihGaWxlIGRpckZpbGUpIHsKLQkJY3VyclRlc3REaXIgPSBkaXJGaWxlOwotCQkKLQkJdHJ5IHsKLQkJCWlmICghIGN1cnJUZXN0RGlyLmV4aXN0cygpKSB7Ci0JCQkJY3VyclRlc3REaXIubWtkaXIoKTsKLQkJCX0KLQkJCVN0cmluZyBwYXRoID0gY3VyclRlc3REaXIuZ2V0QWJzb2x1dGVQYXRoKCkgKyBGaWxlLnNlcGFyYXRvcjsKLQkJCWlmICh0cmFjZSkgewotCQkJCWN1cnJUZXN0T3V0ID0gbmV3IFByaW50U3RyZWFtKG5ldyBGaWxlT3V0cHV0U3RyZWFtKHBhdGggKyAidHJhY2Uub3V0IikpOwotCQkJfQotCQkJb3V0cHV0UGF0aCA9IHBhdGggKyAib3V0cHV0LnhtbCI7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CQotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCBjbG9zZUN1cnJUZXN0RGlyKCkgewotCQljbG9zZUxpYnJhcnkoZ2V0Q3VycmVudEJhc2VMaWIoKSk7Ci0JCWlmIChjdXJyVGVzdE91dCAhPSBudWxsKSB7Ci0JCQljdXJyVGVzdE91dC5jbG9zZSgpOwotCQkJY3VyclRlc3RPdXQgPSBudWxsOwotCQl9Ci0JCWNsZWFyT3V0cHV0RG9jdW1lbnQoKTsKLQkJYWxsTGlicyA9IG5ldyBMaW5rZWRIYXNoTWFwKCk7Ci0JCWFsbEV4cG9ydHMgPSBuZXcgTGlua2VkSGFzaE1hcCgpOwotCQljbG9zZUZvbGRlcihjdXJyVGVzdERpcik7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGRvbmVXaXRoQWxsVGVzdHMoRmlsZSB0b3BDbGVhblVwRm9sZGVyKSB7Ci0JCWNsb3NlQWxsRXhwb3J0UHJvamVjdHMoKTsKLQkJaWYgKHRlc3RSb290T3V0ICE9IG51bGwpIHsKLQkJCXRlc3RSb290T3V0LmNsb3NlKCk7Ci0JCX0KLQkJY2xvc2VGb2xkZXIodG9wQ2xlYW5VcEZvbGRlcik7Ci0JfQotCQotCXB1YmxpYyBGaWxlIGdldEN1cnJUZXN0RGlyKCkgewotCQlyZXR1cm4gY3VyclRlc3REaXI7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFRlc3QoRmlsZSB0ZXN0RmlsZSkgewotCQl0aGlzLnRlc3RGaWxlID0gdGVzdEZpbGU7CQkKLQl9CQotCQotCXB1YmxpYyBGaWxlIGdldFRlc3RGaWxlKCkgewotCQlyZXR1cm4gdGVzdEZpbGU7CQkKLQl9CQotCQotCQotCXB1YmxpYyBMaWJyYXJ5VGVzdFNlcnZpY2UgZ2V0U2VydmljZSgpIHsKLQkJcmV0dXJuIHNlcnZpY2U7Ci0JfQotCQotCXB1YmxpYyBUQ0V4ZVJlcGx5TGlzdCBleGVjdXRlKCkgewotCQl0cmFjZSgiQmVnaW4gZXhlY3V0aW5nOiAiICsgdGVzdEZpbGUpOwotCi0JCVRDRXhlUmVwbHlMaXN0IHJlc3VsdCA9IG51bGw7Ci0JCWJvb2xlYW4gbG9hZGVkID0gZmFsc2U7Ci0JCUV4Y2VwdGlvbiBsb2FkRXhjZXB0aW9uID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWxvYWRlZCA9IGxvYWRUZXN0KCk7CQkJCi0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlsb2FkRXhjZXB0aW9uID0gZTsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQkJCi0JCWlmIChsb2FkZWQpIHsJCQkKLQkJCVN0cmluZyBwYXRoID0gdGVzdFJvb3RXb3JraW5nLmdldEFic29sdXRlUGF0aCgpICsgRmlsZS5zZXBhcmF0b3IgKyB0ZXN0RmlsZS5nZXROYW1lKCkgKyAiLmRpciI7Ci0JCQlvcGVuQ3VyclRlc3REaXIobmV3IEZpbGUgKHBhdGgpKTsKLQkJCXJlc3VsdCA9IGV4ZWN1dGVDb21tYW5kcygpOwkJCi0JCQljbG9zZUN1cnJUZXN0RGlyKCk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXN1bHQgPSBuZXcgVENFeGVSZXBseUxpc3RJbXBsKCk7Ci0JCQlpZiAobG9hZEV4Y2VwdGlvbiAhPSBudWxsKSB7Ci0JCQkJU3RyaW5nIG1zZyA9ICJUZXN0IGxvYWQgZmFpbGVkOiAiICsgbG9hZEV4Y2VwdGlvbi5nZXRNZXNzYWdlKCk7Ci0JCQkJKChUQ0V4ZVJlcGx5TGlzdEltcGwpIHJlc3VsdCkuYWRkKG5ldyBUQ0V4ZVJlcGx5SW1wbChtc2csIGZhbHNlKSk7Ci0JCQkJdHJhY2UobXNnKTsKLQkJCX0gZWxzZSB7CQkJCi0JCQkJdHJhY2UoIlRlc3QgZGlzYWJsZWQiKTsKLQkJCX0KLQkJfQotCQkKLQkJdHJhY2UoIkVuZCBleGVjdXRpbmcgIDogIiArIHRlc3RGaWxlKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi0JcHJpdmF0ZSBib29sZWFuIGxvYWRUZXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRlc3RDb21tYW5kTGlzdC5jbGVhcigpOwotCQlEb2N1bWVudCBkb2N1bWVudCA9IFhNTFV0aWwubG9hZFhtbCh0ZXN0RmlsZSk7CQotCQlFbGVtZW50IHJvb3QgPSBkb2N1bWVudC5nZXREb2N1bWVudEVsZW1lbnQoKTsKLQkJaWYgKHJvb3QuZ2V0QXR0cmlidXRlKFRlc3RDb21tYW5kLkFUX0Rpc2FibGUpLmVxdWFscygidHJ1ZSIpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7CQkJCQotCQl9Ci0JCWJvb2xlYW4gdmVyYm9zZSA9IHJvb3QuZ2V0QXR0cmlidXRlKFRlc3RDb21tYW5kLkFUX1ZlcmJvc2UpLmVxdWFsc0lnbm9yZUNhc2UoInRydWUiKTsKLQkJTm9kZUxpc3Qgbm9kZXMgPSByb290LmdldENoaWxkTm9kZXMoKTsKLQkJaW50IHN6ID0gbm9kZXMgPT0gbnVsbCA/IDAgOiBub2Rlcy5nZXRMZW5ndGgoKTsKLQkJZm9yIChpbnQgaT0wOyBpPHN6OyBpKyspIHsKLQkJCU5vZGUgbm9kZSA9IG5vZGVzLml0ZW0oaSk7Ci0JCQlpZiAobm9kZSBpbnN0YW5jZW9mIEVsZW1lbnQpIHsKLQkJCQlFbGVtZW50IGVsZW1lbnQgPSAoRWxlbWVudCkgbm9kZTsKLQkJCQlpZiAodmVyYm9zZSkgewotCQkJCQllbGVtZW50LnNldEF0dHJpYnV0ZShUZXN0Q29tbWFuZC5BVF9WZXJib3NlLCAidHJ1ZSIpOwotCQkJCX0KLQkJCQlpZiAoZWxlbWVudC5nZXRUYWdOYW1lKCkuZXF1YWxzSWdub3JlQ2FzZShUQ0VuZCkpIHsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWFkZENvbW1hbmQobm9kZSk7Ci0JCQl9Ci0JCX0JCQkKLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCXB1YmxpYyBUQ0V4ZVJlcGx5TGlzdCBleGVjdXRlQ29tbWFuZHMoKSB7Ci0JCVRDRXhlUmVwbHlMaXN0SW1wbCByZXN1bHQgPSBuZXcgVENFeGVSZXBseUxpc3RJbXBsKCk7Ci0JCWZvciAoaW50IGk9MDsgaTx0ZXN0Q29tbWFuZExpc3Quc2l6ZSgpOyBpKyspIHsKLQkJCVRlc3RDb21tYW5kSW1wbCBjb21tYW5kID0gKFRlc3RDb21tYW5kSW1wbCkgdGVzdENvbW1hbmRMaXN0LmdldChpKTsKLQkJCVRDRXhlUmVwbHkgcmVwbHkgPSBudWxsOwotCQkJdHJ5IHsKLQkJCQlyZXBseSA9IGNvbW1hbmQuZXhlY3V0ZSgpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCXJlcGx5ID0gbmV3IFRDRXhlUmVwbHlJbXBsKGUuZ2V0TWVzc2FnZSgpLCBmYWxzZSk7Ci0JCQl9Ci0JCQlpZiAocmVwbHkgIT0gbnVsbCkgewotCQkJCXJlc3VsdC5hZGQocmVwbHkpOwotCQkJCWlmICghcmVwbHkucGFzc2luZygpKSB7Ci0JCQkJCWxvZygiXG5UaGUgZm9sbG93aW5nIGNvbW1hbmQgaXMgbm90IHBhc3Npbmc6IFxuIiArICBjb21tYW5kLmdldEVsZW1lbnQoKSArICJcbiIpOwotCQkJCX0KLQkJCX0KLQkJfQkJCQotCQkKLQkJU3RyaW5nIGxpbmUgPSB0ZXN0RmlsZS5nZXROYW1lKCkgKyAiIGlzICI7Ci0JCVN0cmluZyBkaXJTdHIgPSAidGVzdFJvb3RTb3VyY2U6ICIgKyB0ZXN0Um9vdFNvdXJjZSAKLQkJCQkJCSsgIiwgdGVzdFJvb3RXb3JraW5nOiAiICsgdGVzdFJvb3RXb3JraW5nOwotCQlpZiAocmVzdWx0LnBhc3NpbmcoKSkgewotCQkJbGluZSArPSAicGFzc2luZy4gIiArIGRpclN0cjsKLQkJfSBlbHNlIHsKLQkJCWxpbmUgKz0gImZhaWxpbmchICIgKyBkaXJTdHI7Ci0JCX0KLQkJcmVzdWx0LnNldFN1bW1hcnlSZXBseShsaW5lKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdHJhY2UoU3RyaW5nIGxpbmUpIHsKLQkJaWYgKHRlc3RSb290T3V0ICE9IG51bGwpIHsKLQkJCXRlc3RSb290T3V0LnByaW50bG4obGluZSk7Ci0JCX0KLQkJCi0JCWlmIChjdXJyVGVzdE91dCAhPSBudWxsKSB7Ci0JCQljdXJyVGVzdE91dC5wcmludGxuKGxpbmUpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCBhZGRDb21tYW5kKE5vZGUgbm9kZSkgewotCQlpZiAoICEobm9kZSBpbnN0YW5jZW9mIEVsZW1lbnQpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJRWxlbWVudCBlbGVtZW50ID0gKEVsZW1lbnQpIG5vZGU7Ci0JCWlmICghIGVsZW1lbnQuZ2V0QXR0cmlidXRlKFRlc3RDb21tYW5kLkFUX0Rpc2FibGUpLmVxdWFscygidHJ1ZSIpKSB7Ci0JCQlUZXN0Q29tbWFuZCBjb21tYW5kID0gbmV3VGVzdENvbW1hbmQoZWxlbWVudC5nZXRUYWdOYW1lKCkpOwotCQkJaWYgKGNvbW1hbmQgIT0gbnVsbCkgewotCQkJCWNvbW1hbmQucGFyc2UoZWxlbWVudCk7Ci0JCQkJdGVzdENvbW1hbmRMaXN0LmFkZChjb21tYW5kKTsKLQkJCX0KLQkJfQotCX0JCi0JCi0JcHJpdmF0ZSBUZXN0Q29tbWFuZCBuZXdUZXN0Q29tbWFuZChTdHJpbmcgY29tYW5kTmFtZSkgewotCQlPYmplY3Qgb2JqID0gdGNDbGFzc01hcC5nZXQoY29tYW5kTmFtZSk7Ci0JCXJldHVybiBvYmogPT0gbnVsbCA/IG51bGwgOiBuZXdUZXN0Q29tbWFuZChvYmouZ2V0Q2xhc3MoKSk7Ci0JfQotCQotCXB1YmxpYyBUZXN0Q29tbWFuZCBuZXdUZXN0Q29tbWFuZChDbGFzcyBjbHMpIHsKLQkJVGVzdENvbW1hbmQgcmV0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXJldCA9IChUZXN0Q29tbWFuZCkgY2xzLm5ld0luc3RhbmNlKCk7Ci0JCQkoKFRlc3RDb21tYW5kSW1wbCkgcmV0KS5zZXRPd25lcih0aGlzKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQkJcmV0dXJuIHJldDsKLQl9Ci0JCQotCXByaXZhdGUgTWV0aG9kTGlicmFyeSBsb2FkQmFzZUxpYihTdHJpbmcgbmFtZSwgYm9vbGVhbiBpZk5ld1RoZW5CdWlsZERlYWZhdWx0TGliKSB7Ci0JCWlmIChjdXJyZW50QmFzZUxpYiAhPSBudWxsKSB7Ci0JCQlGaWxlIGZpbGUgPSBuZXcgRmlsZShjdXJyZW50QmFzZUxpYi5lUmVzb3VyY2UoKS5nZXRVUkkoKS50b0ZpbGVTdHJpbmcoKSkuZ2V0UGFyZW50RmlsZSgpOwotCQkJaWYgKGZpbGUuZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSkgewkJCQotCQkJCXJldHVybiBjdXJyZW50QmFzZUxpYjsKLQkJCX0KLQkJfQotCQkKLQkJaWYgKGFsbEV4cG9ydHMuY29udGFpbnNLZXkobmFtZSkpIHsKLQkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCQl9Ci0JCQotCQlzZXJ2aWNlLmNsb3NlTGlicmFyeShjdXJyZW50QmFzZUxpYik7Ci0JCQotCQljdXJyZW50QmFzZUxpYiA9IG51bGw7Ci0JCVN0cmluZyBsaWJQYXRoID0gKFN0cmluZykgYWxsTGlicy5nZXQobmFtZSk7Ci0JCWlmIChsaWJQYXRoID09IG51bGwpIHsKLQkJCWxpYlBhdGggPSBjdXJyVGVzdERpci5nZXRBYnNvbHV0ZVBhdGgoKSArIEZpbGUuc2VwYXJhdG9yICsgbmFtZTsJCi0JCQl0cnkgewotCQkJCWN1cnJlbnRCYXNlTGliID0gY29weUZyb21UZXN0TGlicyhsaWJQYXRoLCBuYW1lKSA/ICAKLQkJCQkJCQkJWE1JTGlicmFyeVV0aWwub3Blbk1ldGhvZExpYnJhcnkobGliUGF0aCkgOiBudWxsOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsJCQkJCi0JCQl9Ci0JCQlpZiAoY3VycmVudEJhc2VMaWIgPT0gbnVsbCkgewotCQkJCWN1cnJlbnRCYXNlTGliID0gc2VydmljZS5jcmVhdGVMaWJyYXJ5KGxpYlBhdGgsIG5hbWUpOwotCQkJCWlmIChpZk5ld1RoZW5CdWlsZERlYWZhdWx0TGliKSB7Ci0JCQkJCWJ1aWxkRGVmYXVsdExpYnJhcnkoKTsKLQkJCQl9Ci0JCQkJdHJhY2UoIkJhc2UgbGliIFwiIiArIG5hbWUgKyAiXCIgaXMgY3JlYXRlZC4iKTsKLQkJCX0gZWxzZSB7Ci0JCQkJdHJhY2UoIkJhc2UgbGliIFwiIiArIG5hbWUgKyAiXCIgaXMgY29waWVkIGZyb20gdGVzdExpYnMgYW5kIGxhb2RlZC4iKTsKLQkJCX0KLQkJCWFsbExpYnMucHV0KG5hbWUsIGxpYlBhdGgpOwotCQl9IGVsc2UgewotCQkJdHJ5IHsKLQkJCQljdXJyZW50QmFzZUxpYiA9IFhNSUxpYnJhcnlVdGlsLm9wZW5NZXRob2RMaWJyYXJ5KGxpYlBhdGgpOwotCQkJCXRyYWNlKCJCYXNlIGxpYiBcIiIgKyBuYW1lICsgIlwiIGlzIGxvYWRlZC4iKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CQkJCQotCQkJfQotCQl9Ci0JCXJldHVybiBjdXJyZW50QmFzZUxpYjsKLQl9CQkJCi0JCi0JcHVibGljIE1ldGhvZExpYnJhcnkgbG9hZE5vbkJhc2VMaWIoU3RyaW5nIG5hbWUpIHsKLQkJU3RyaW5nIGxpYlBhdGggPSAoU3RyaW5nKSBhbGxMaWJzLmdldChuYW1lKTsKLQkJaWYgKGxpYlBhdGggPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JCX0KLQkJcmV0dXJuIHNlcnZpY2UubG9hZExpYnJhcnkobGliUGF0aCk7Ci0JfQkJCQotCQotCXB1YmxpYyBNZXRob2RMaWJyYXJ5IGdldEN1cnJlbnRCYXNlTGliKCkgewotCQlyZXR1cm4gY3VycmVudEJhc2VMaWI7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldEN1cnJlbnRCYXNlTGliKE1ldGhvZExpYnJhcnkgbGliKSB7Ci0JCWN1cnJlbnRCYXNlTGliID0gbGliOwotCX0KLQkKLQlwdWJsaWMgTWV0aG9kTGlicmFyeSBsb2FkQmFzZUxpYihTdHJpbmcgbmFtZSkgewotCQlyZXR1cm4gbG9hZEJhc2VMaWIobmFtZSwgZmFsc2UpOwotCX0KLQkKLQlwdWJsaWMgTWV0aG9kTGlicmFyeSBsb2FkQmFzZUxpYk9yQnVpbGRCYXNlV2l0aERlZmF1bHQoU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIGxvYWRCYXNlTGliKG5hbWUsIHRydWUpOwotCX0KLQkKLQlwdWJsaWMgRmlsZSBnZXRJbXBvcnRGaWxlKFN0cmluZyBpbXBvcnRGb2xkZXJOYW1lKSB7Ci0JCUZpbGUgZmlsZSA9IChGaWxlKSBhbGxFeHBvcnRzLmdldChpbXBvcnRGb2xkZXJOYW1lKTsKLQkJaWYgKGZpbGUgPT0gbnVsbCkgewotCQkJZmlsZSA9IG5ldyBGaWxlKHRlc3RSb290U291cmNlLmdldEFic29sdXRlUGF0aCgpICsgRmlsZS5zZXBhcmF0b3IgKyBpbXBvcnRGb2xkZXJOYW1lKTsKLQkJCWlmIChmaWxlLmV4aXN0cygpICYmIGZpbGUuaXNEaXJlY3RvcnkoKSkgewotCQkJCXJldHVybiBmaWxlOwotCQkJfQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIGZpbGU7Ci0JfQotCQotCXB1YmxpYyBGaWxlIHJlZ2lzdGVyRXhwb3J0RGVzdGluYXRpb24oU3RyaW5nIG5hbWUsIGJvb2xlYW4gaXNYTUwpIHsKLQkJaWYgKGFsbExpYnMuY29udGFpbnNLZXkobmFtZSkpIHsKLQkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCQl9Ci0JCUZpbGUgZmlsZSA9IChGaWxlKSBhbGxFeHBvcnRzLmdldChuYW1lKTsKLQkJaWYgKGZpbGUgPT0gbnVsbCkgewotCQkJU3RyaW5nIHBhdGggPSBjdXJyVGVzdERpci5nZXRBYnNvbHV0ZVBhdGgoKSArIEZpbGUuc2VwYXJhdG9yICsgbmFtZTsKLQkJCWlmIChpc1hNTCkgewotCQkJCXBhdGggKz0gRmlsZS5zZXBhcmF0b3IgKyBuYW1lICsgIi54bWwiOwotCQkJfQotCQkJZmlsZSA9ICBuZXcgRmlsZShwYXRoKTsKLQkJCWFsbEV4cG9ydHMucHV0KG5hbWUsIGZpbGUpOwotCQl9Ci0JCXJldHVybiBmaWxlOwotCX0JCi0JCi0JcHVibGljIHZvaWQgY2xvc2VMaWJyYXJ5KE1ldGhvZExpYnJhcnkgbGliKSB7Ci0JCXNlcnZpY2UuY2xvc2VMaWJyYXJ5KGxpYik7Ci0JCXNldEN1cnJlbnRCYXNlTGliKG51bGwpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBjbG9zZUZvbGRlcihGaWxlIGZvbGRlcikgewotCQlpZiAocmVtb3ZlRmlsZXMpIHsKLQkJCXNlcnZpY2UuZGVsZXRlRm9sZGVyKGZvbGRlcik7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIGludCBpbmNFeGVjdXRlZFRlc3RDb3VudCgpIHsKLQkJcmV0dXJuICsrZXhlY3V0ZWRUZXN0Q291bnQ7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGNsb3NlQWxsRXhwb3J0UHJvamVjdHMoKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSBhbGxFeHBvcnRzLnZhbHVlcygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCUZpbGUgZmlsZSA9IChGaWxlKSBpdC5uZXh0KCk7Ci0JCQl0cnkgewotCQkJCU1ldGhvZExpYnJhcnlQcm9qZWN0LmNsb3NlUHJvamVjdChmaWxlLmdldEFic29sdXRlUGF0aCgpLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJCX0gY2F0Y2ggKFRocm93YWJsZSBlKXsJCQkJCQotCQkJfQotCQl9CQotCX0JCi0JCi0JcHVibGljIGJvb2xlYW4gY29tcGFyZUxpYnMoTWV0aG9kTGlicmFyeSBsaWIxLCAgTWV0aG9kTGlicmFyeSBsaWIyKSB7Ci0JCXJldHVybiBjb21wYXJlTGlicyhsaWIxLCBsaWIyLCBmYWxzZSk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGNvbXBhcmVMaWJzKE1ldGhvZExpYnJhcnkgbGliMSwgIE1ldGhvZExpYnJhcnkgbGliMiwgYm9vbGVhbiB1c2VOYW1lQXMybmRJZCkgewotCQlMaWJyYXJ5RGlmZkFuYWx5em9yIGFuYWx5em9yID0gbmV3IExpYnJhcnlEaWZmQW5hbHl6b3IodGhpcywgbGliMSwgbGliMik7Ci0JCWFuYWx5em9yLnNldEdyZWVkeSh0cmFjZSk7Ci0JCWFuYWx5em9yLnNldFVzZU5hbWVBczJuZElkKHVzZU5hbWVBczJuZElkKTsKLQkJcmV0dXJuIGFuYWx5em9yLmNvbXBhcmUoKTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gY29tcGFyZUxpYnMoTWV0aG9kTGlicmFyeSBsaWIxLCAgTWV0aG9kTGlicmFyeSBsaWIyLCBpbnQgZGlmZkNvdW50LCBpbnQgZWxlbUNvbXBhcmVkQ291bnQsIGJvb2xlYW4gdXNlTmFtZUFzMm5kSWQpIHsKLQkJaWYgKGRpZmZDb3VudCA9PSAwICYmIGVsZW1Db21wYXJlZENvdW50ID09IDApIHsKLQkJCXJldHVybiBjb21wYXJlTGlicyhsaWIxLCBsaWIyLCB1c2VOYW1lQXMybmRJZCk7Ci0JCX0KLQkJTGlicmFyeURpZmZBbmFseXpvciBhbmFseXpvciA9IG5ldyBMaWJyYXJ5RGlmZkFuYWx5em9yKHRoaXMsIGxpYjEsIGxpYjIpOwotCQlhbmFseXpvci5zZXRHcmVlZHkodHJ1ZSk7Ci0JCWFuYWx5em9yLnNldFVzZU5hbWVBczJuZElkKHVzZU5hbWVBczJuZElkKTsKLQkJYW5hbHl6b3IuY29tcGFyZSgpOwotCQlyZXR1cm4gCWFuYWx5em9yLmdldERpZmZDb3VudCgpID09IGRpZmZDb3VudCAmJgotCQkJIAlhbmFseXpvci5nZXRFbGVtQ29tcGFyZWRDb3VudCgpID09IGVsZW1Db21wYXJlZENvdW50OwotCX0KLQkKLQlwdWJsaWMgdm9pZCBidWlsZERlZmF1bHRMaWJyYXJ5KCkgewkJCi0JCXRyYWNlKCJidWlsZERlZmF1bHRMaWJyYXJ5IC0+Iik7Ci0JCQotCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlTWV0aG9kUGx1Z2luKCJQbHVnX0EiKTsKLQkJQ29udGVudFBhY2thZ2UgcGtnID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlQ29udGVudFBhY2thZ2UocGx1Z2luLCAicDEiKTsJCQotCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZUNvbmZpZ3VyYXRpb24oIkNvbmZpZ19BIik7Ci0JCUNhcGFiaWxpdHlQYXR0ZXJuIGNwMSA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZUNhcGFiaWxpdHlQYXR0ZXJuKHBsdWdpbiwgIkNQMSIsIGNvbmZpZyk7Ci0JCUNhcGFiaWxpdHlQYXR0ZXJuIGNwMiA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZUNhcGFiaWxpdHlQYXR0ZXJuKHBsdWdpbiwgIkNQMiIsIGNvbmZpZyk7CQkKLQkJTGlicmFyeVRlc3RIZWxwZXIuc2V0Q29udHJpYnV0ZXMoY3AyLCBjcDEpOwotCQkKLQkJLy8gdXBkYXRlIHRoZSBjb25maWd1cmF0aW9uCi0JCWNvbmZpZy5nZXRNZXRob2RQbHVnaW5TZWxlY3Rpb24oKS5hZGQocGx1Z2luKTsKLQkJY29uZmlnLmdldE1ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKS5hZGQocGtnKTsKLQkJY29uZmlnLmdldE1ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKS5hZGQoKFByb2Nlc3NDb21wb25lbnQpY3AxLmVDb250YWluZXIoKSk7Ci0JCWNvbmZpZy5nZXRNZXRob2RQYWNrYWdlU2VsZWN0aW9uKCkuYWRkKChQcm9jZXNzQ29tcG9uZW50KWNwMi5lQ29udGFpbmVyKCkpOwotCQkKLQkJTGlicmFyeVV0aWwudmFsaWRhdGVNZXRob2RDb25maWd1cmF0aW9uKGNvbmZpZyk7CQotCQkKLQkJZmluYWwgU3RyaW5nIGNwMV90ZXh0ID0gImNwMSBtYWluIGRlc2MiOwotCQlmaW5hbCBTdHJpbmcgY3AyX3RleHQgPSAiY3AyIG1haW4gZGVzYyI7Ci0JCQkKLQkJY3AxLmdldFByZXNlbnRhdGlvbigpLnNldE1haW5EZXNjcmlwdGlvbihjcDFfdGV4dCk7Ci0JCWNwMi5nZXRQcmVzZW50YXRpb24oKS5zZXRNYWluRGVzY3JpcHRpb24oY3AyX3RleHQpOwotCi0JCXRyYWNlKCJidWlsZERlZmF1bHRMaWJyYXJ5IDwtIik7Ci0KLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gY29weUZyb21UZXN0TGlicyhTdHJpbmcgbGliUGF0aCwgU3RyaW5nIHJlbExpYk5hbWVQYXRoKSB7Ci0JCUZpbGUgc291cmNlID0gbmV3IEZpbGUodGVzdFJvb3RTb3VyY2UuZ2V0QWJzb2x1dGVQYXRoKCkgKyBGaWxlLnNlcGFyYXRvciArIHJlbExpYk5hbWVQYXRoKTsKLQkJU3RyaW5nIGxpYk5hbWUgPSBzb3VyY2UuZ2V0TmFtZSgpOwotCQlGaWxlIGxpYkxpc3RbXSA9IHNvdXJjZS5nZXRQYXJlbnRGaWxlKCkubGlzdEZpbGVzKCk7Ci0JCWZvciAoaW50IGk9MDsgaTxsaWJMaXN0Lmxlbmd0aDsgaSsrKSB7Ci0JCQlGaWxlIGZpbGUgPSBsaWJMaXN0W2ldOwotCQkJaWYgKGxpYk5hbWUuZXF1YWxzKGZpbGUuZ2V0TmFtZSgpKSkgewotCQkJCUZpbGUgdGFyZ2V0ID0gbmV3IEZpbGUobGliUGF0aCk7Ci0JCQkJUGx1Z2luSW1wb3J0aW5nU2VydmljZS5jb3B5RGlyKHNvdXJjZSwgdGFyZ2V0KTsKLQkJCQlhbGxMaWJzLnB1dChsaWJOYW1lLCBsaWJQYXRoKTsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCXB1YmxpYyBEb2N1bWVudCBnZXRPdXRwdXREb2N1bWVudCgpIHsKLQkJaWYgKG91dHB1dERvY3VtZW50ID09IG51bGwpIHsJCQkKLQkJCXRyeSB7Ci0JCQkJb3V0cHV0RG9jdW1lbnQgPSBYTUxVdGlsLmNyZWF0ZURvY3VtZW50KCk7Ci0JCSAgICAgICAgRWxlbWVudCByb290ID0gb3V0cHV0RG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiVGVzdGVyT3V0cHV0Iik7Ci0JCSAgICAgICAgb3V0cHV0RG9jdW1lbnQuYXBwZW5kQ2hpbGQocm9vdCk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG91dHB1dERvY3VtZW50OwotCX0KLQkKLQlwcml2YXRlIHZvaWQgY2xlYXJPdXRwdXREb2N1bWVudCgpIHsKLQkJb3V0cHV0RG9jdW1lbnQgPSBudWxsOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldE91dHB1dFBhdGgoKSB7Ci0JCXJldHVybiBvdXRwdXRQYXRoOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBsb2coU3RyaW5nIGxpbmUpIHsKLQkJbG9nUFMucHJpbnRsbihsaW5lKTsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3Rlci9pbXBsL3Rlc3Rjb21tYW5kcy9UQ0NpcmN1bGFyRGVwZW5kZW5jeUNoZWNrLmphdmEgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3Rlci9pbXBsL3Rlc3Rjb21tYW5kcy9UQ0NpcmN1bGFyRGVwZW5kZW5jeUNoZWNrLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkMmMzY2UuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0ZXIvaW1wbC90ZXN0Y29tbWFuZHMvVENDaXJjdWxhckRlcGVuZGVuY3lDaGVjay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmltcGwudGVzdGNvbW1hbmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLkRlcGVuZGVuY3lJbmZvTWdyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbi5UcmFjZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmlmYWNlLlRDRXhlUmVwbHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmltcGwuVGVzdENvbW1hbmRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5pbXBsLlRlc3RDb21tYW5kTWdyOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLS8qKgotICogQSB0ZXN0IGNvbW1hbmQgY2xhc3MKLSAqIAotICogQGF1dGhvciBXZWlwaW5nIEx1Ci0gKiBAc2luY2UgMS4wCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFRDQ2lyY3VsYXJEZXBlbmRlbmN5Q2hlY2sgZXh0ZW5kcyBUZXN0Q29tbWFuZEltcGwgewkJCQkJCi0JCi0JcHVibGljIHZvaWQgcGFyc2UoRWxlbWVudCBlbGVtZW50KSB7Ci0JCXN1cGVyLnBhcnNlKGVsZW1lbnQpOwotCQlzZXRBdHRyaWJ1dGUoQVRfRXJyb3JDb3VudCwgZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRfRXJyb3JDb3VudCkpOwotCQlzZXRBdHRyaWJ1dGUoQVRfQ2lyY3VsYXJFbGVtZW50Q291bnQsIGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUX0NpcmN1bGFyRWxlbWVudENvdW50KSk7Ci0JfQkKLQkKLQlwdWJsaWMgVENFeGVSZXBseSBleGVjdXRlKCkgewotCQlpbnQgZXJyb3JDb3VudCA9IHBhcnNlSW50ZWdlcihnZXRBdHRyaWJ1dGUoQVRfRXJyb3JDb3VudCksIDApOwotCQlpbnQgY2lyY3VsYXJFbGVtZW50Q291bnQgPSBwYXJzZUludGVnZXIoZ2V0QXR0cmlidXRlKEFUX0NpcmN1bGFyRWxlbWVudENvdW50KSwgMCk7Ci0JCWZpbmFsIFRlc3RDb21tYW5kTWdyIG93bmVyID0gZ2V0T3duZXIoKTsKLQkJCi0JCVRyYWNlciB0cmFjZXIgPSBuZXcgVHJhY2VyKCkgewotCQkJcHVibGljIHZvaWQgdHJhY2UoU3RyaW5nIGxpbmUpIHsKLQkJCQlvd25lci50cmFjZShsaW5lKTsKLQkJCX0KLQkJfTsKLQkJCi0JCURlcGVuZGVuY3lJbmZvTWdyIGluZm9NZ3IgPSBuZXcgRGVwZW5kZW5jeUluZm9NZ3Iob3duZXIuZ2V0Q3VycmVudEJhc2VMaWIoKSk7Ci0JCURlcGVuZGVuY3lJbmZvTWdyLkNoZWNrUmVzdWx0IGNoZWNrUmVzdWx0ID0gaW5mb01nci5jaGVja0NpcmN1bGFyRGVwZW5kbmVjeSh0cmFjZXIpOwotCQkKLQkJaWYgKGNoZWNrUmVzdWx0LmdldEVycm9yQ291bnQoKSAhPSBlcnJvckNvdW50IHx8IAotCQkJCWNoZWNrUmVzdWx0LmdldENpcmN1bGFyRWxlbWVudENvdW50KCkgIT0gY2lyY3VsYXJFbGVtZW50Q291bnQpIHsKLQkJCVN0cmluZyBtc2cgPSAiY2hlY2tSZXN1bHQuZ2V0RXJyb3JDb3VudCgpID0gIiArIGNoZWNrUmVzdWx0LmdldEVycm9yQ291bnQoKSArICJcbiI7Ci0JCQltc2cgKz0gImNoZWNrUmVzdWx0LmdldENpcmN1bGFyRWxlbWVudENvdW50KCkgPSAiICsgY2hlY2tSZXN1bHQuZ2V0Q2lyY3VsYXJFbGVtZW50Q291bnQoKTsKLQkJCW93bmVyLnRyYWNlKG1zZyk7Ci0JCQlyZXR1cm4gbmV3IFRDRXhlUmVwbHlJbXBsKG1zZywgZmFsc2UpOwotCQl9Ci0JCQotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3Rlci9pbXBsL3Rlc3Rjb21tYW5kcy9UQ0NvbXBhcmVUb0dvbGRlbkZpbGUuamF2YSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdGVyL2ltcGwvdGVzdGNvbW1hbmRzL1RDQ29tcGFyZVRvR29sZGVuRmlsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZjM2MGZhLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdGVyL2ltcGwvdGVzdGNvbW1hbmRzL1RDQ29tcGFyZVRvR29sZGVuRmlsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmltcGwudGVzdGNvbW1hbmRzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5YTUxVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5PdXRwdXREaWZmQW5hbHl6b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmlmYWNlLlRDRXhlUmVwbHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmltcGwuVGVzdENvbW1hbmRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5pbXBsLlRlc3RDb21tYW5kTWdyOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLS8qKgotICogQSB0ZXN0IGNvbW1hbmQgY2xhc3MKLSAqIAotICogQGF1dGhvciBXZWlwaW5nIEx1Ci0gKiBAc2luY2UgMS4wCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFRDQ29tcGFyZVRvR29sZGVuRmlsZSBleHRlbmRzIFRlc3RDb21tYW5kSW1wbCB7CQkJCQkKLQkKLQlwdWJsaWMgdm9pZCBwYXJzZShFbGVtZW50IGVsZW1lbnQpIHsKLQkJc3VwZXIucGFyc2UoZWxlbWVudCk7Ci0JCXNldEF0dHJpYnV0ZShBVF9Hb2xkZW5GaWxlTmFtZSwgZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRfR29sZGVuRmlsZU5hbWUpKTsKLQkJc2V0QXR0cmlidXRlKEFUX0RpZmZDb3VudCwgZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRfRGlmZkNvdW50KSk7Ci0JCXNldEF0dHJpYnV0ZShBVF9FbGVtZW50Q291bnQsIGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUX0VsZW1lbnRDb3VudCkpOwotCX0JCi0JCi0JcHVibGljIFRDRXhlUmVwbHkgZXhlY3V0ZSgpIHsKLQkJU3RyaW5nIGdvbGRlbkZpbGVOYW1lID0gZ2V0QXR0cmlidXRlKEFUX0dvbGRlbkZpbGVOYW1lKTsKLQkJaW50IGRpZmZDb3VudCA9IHBhcnNlSW50ZWdlcihnZXRBdHRyaWJ1dGUoQVRfRGlmZkNvdW50KSwgMCk7Ci0JCWludCBlbGVtZW50Q291bnQgPSBwYXJzZUludGVnZXIoZ2V0QXR0cmlidXRlKEFUX0VsZW1lbnRDb3VudCksIDApOwkKLQkJVGVzdENvbW1hbmRNZ3Igb3duZXIgPSBnZXRPd25lcigpOwotCQkKLQkJRG9jdW1lbnQgb3V0cHV0RG9jdW1lbnQgPSBvd25lci5nZXRPdXRwdXREb2N1bWVudCgpOwotCQlpZiAob3V0cHV0RG9jdW1lbnQgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJCi0JCVN0cmluZyBvdXRwdXRQYXRoID0gb3duZXIuZ2V0T3V0cHV0UGF0aCgpOwotCQl0cnkgewotCQkJWE1MVXRpbC5zYXZlRG9jdW1lbnQob3V0cHV0RG9jdW1lbnQsIG91dHB1dFBhdGgpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSl7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JCVN0cmluZyBwYXRoID0gb3duZXIuZ2V0VGVzdEZpbGUoKS5nZXRBYnNvbHV0ZVBhdGgoKTsKLQkJaW50IGl4ID0gcGF0aC5sYXN0SW5kZXhPZigiLiIpOwotCQlwYXRoID0gcGF0aC5zdWJzdHJpbmcoMCwgaXgpICsgIi54bWwiOwotCQlGaWxlIGdvbGRlbk91dHB1dCA9IG5ldyBGaWxlKHBhdGgpOwotCQlpZiAoZ29sZGVuT3V0cHV0LmV4aXN0cygpKSB7Ci0JCQlPdXRwdXREaWZmQW5hbHl6b3IgYW5hbHlzb3IgPSBuZXcgT3V0cHV0RGlmZkFuYWx5em9yKG93bmVyLCBudWxsLCBvdXRwdXREb2N1bWVudCwKLQkJCQkJZ29sZGVuT3V0cHV0LCBuZXcgRmlsZShvdXRwdXRQYXRoKSk7Ci0JCQlhbmFseXNvci5jb21wYXJlKCk7Ci0JCQlpZiAoYW5hbHlzb3IuZ2V0RGlmZkNvdW50KCkgIT0gZGlmZkNvdW50IHx8Ci0JCQkJCWVsZW1lbnRDb3VudCAhPSAwICYmIGFuYWx5c29yLmdldEVsZW1Db21wYXJlZENvdW50KCkgIT0gZWxlbWVudENvdW50KSB7CQkJCQotCQkJCVN0cmluZyBtc2cgPSAiT3VwdHV0IGFuZCBnb2xkZW4gZmlsZSBjb21wYXJpc29uIGZhaWxzISAiOwotCQkJCW93bmVyLnRyYWNlKG1zZyk7Ci0JCQkJcmV0dXJuIG5ldyBUQ0V4ZVJlcGx5SW1wbChtc2csIGZhbHNlKTsKLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0ZXIvaW1wbC90ZXN0Y29tbWFuZHMvVENDb21wYXJlVG9MaWJyYXJ5LmphdmEgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3Rlci9pbXBsL3Rlc3Rjb21tYW5kcy9UQ0NvbXBhcmVUb0xpYnJhcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmExZTM1ZC4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3Rlci9pbXBsL3Rlc3Rjb21tYW5kcy9UQ0NvbXBhcmVUb0xpYnJhcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5pbXBsLnRlc3Rjb21tYW5kczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcuc2VydmljZXMuQ29uZmlndXJhdGlvbkltcG9ydFNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmlmYWNlLlRDRXhlUmVwbHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmltcGwuVGVzdENvbW1hbmRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5pbXBsLlRlc3RDb21tYW5kTWdyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0vKioKLSAqIEEgdGVzdCBjb21tYW5kIGNsYXNzCi0gKiAKLSAqIEBhdXRob3IgV2VpcGluZyBMdQotICogQHNpbmNlIDEuMAotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBUQ0NvbXBhcmVUb0xpYnJhcnkgZXh0ZW5kcyBUZXN0Q29tbWFuZEltcGwgewkJCQkJCi0JCi0JcHVibGljIHZvaWQgcGFyc2UoRWxlbWVudCBlbGVtZW50KSB7Ci0JCXN1cGVyLnBhcnNlKGVsZW1lbnQpOwotCQlzZXRBdHRyaWJ1dGUoQVRfR29sZGVuTGliRm9sZGVyTmFtZSwgZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRfR29sZGVuTGliRm9sZGVyTmFtZSkpOwotCQlzZXRBdHRyaWJ1dGUoQVRfRGlmZkNvdW50LCBlbGVtZW50LmdldEF0dHJpYnV0ZShBVF9EaWZmQ291bnQpKTsKLQkJc2V0QXR0cmlidXRlKEFUX0VsZW1lbnRDb3VudCwgZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRfRWxlbWVudENvdW50KSk7Ci0JCXNldEF0dHJpYnV0ZShBVF9Vc2VOYW1lQXNJZCwgZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRfVXNlTmFtZUFzSWQpKTsKLQl9CQotCQotCXB1YmxpYyBUQ0V4ZVJlcGx5IGV4ZWN1dGUoKSB7Ci0JCVN0cmluZyBnb2xkZW5MaWJGb2xkZXJOYW1lID0gZ2V0QXR0cmlidXRlKEFUX0dvbGRlbkxpYkZvbGRlck5hbWUpOwotCQlpbnQgZGlmZkNvdW50ID0gMDsKLQkJaW50IGVsZW1lbnRDb3VudCA9IDA7Ci0JCWJvb2xlYW4gdXNlTmFtZUFzSWQgPSBmYWxzZTsKLQkJCi0JCVN0cmluZyBzdHIgPSBnZXRBdHRyaWJ1dGUoQVRfRGlmZkNvdW50KTsKLQkJaWYgKHN0ciAhPSBudWxsICYmIHN0ci5sZW5ndGgoKSA+IDApIHsKLQkJCWRpZmZDb3VudCA9IEludGVnZXIucGFyc2VJbnQoc3RyKTsKLQkJfQotCQlzdHIgPSBnZXRBdHRyaWJ1dGUoQVRfRWxlbWVudENvdW50KTsKLQkJaWYgKHN0ciAhPSBudWxsICYmIHN0ci5sZW5ndGgoKSA+IDApIHsKLQkJCWVsZW1lbnRDb3VudCA9IEludGVnZXIucGFyc2VJbnQoc3RyKTsKLQkJfQkJCi0JCXN0ciA9IGdldEF0dHJpYnV0ZShBVF9Vc2VOYW1lQXNJZCk7Ci0JCWlmIChzdHIgIT0gbnVsbCAmJiBzdHIubGVuZ3RoKCkgPiAwKSB7Ci0JCQl1c2VOYW1lQXNJZCA9IHN0ci5lcXVhbHNJZ25vcmVDYXNlKCJ0cnVlIik7Ci0JCX0JCi0JCQotCQlUZXN0Q29tbWFuZE1nciBvd25lciA9IGdldE93bmVyKCk7Ci0JCU1ldGhvZExpYnJhcnkgZ29sZGVuTGliICA9IG93bmVyLmxvYWROb25CYXNlTGliKGdvbGRlbkxpYkZvbGRlck5hbWUpOwotCQlNZXRob2RMaWJyYXJ5IGN1ckxpYiAgPSBvd25lci5nZXRDdXJyZW50QmFzZUxpYigpOwkKLQkJaWYgKHVzZU5hbWVBc0lkKSB7Ci0JCQlDb25maWd1cmF0aW9uSW1wb3J0U2VydmljZS5maXhJbXBvcnRMaWJyYXJ5U3lzdGVtUGFja2FnZUdVSURzKGdvbGRlbkxpYiwgY3VyTGliKTsKLQkJfQotCQlib29sZWFuIHJlc3VsdCA9IG93bmVyLmNvbXBhcmVMaWJzKGdvbGRlbkxpYiwgY3VyTGliLCBkaWZmQ291bnQsIGVsZW1lbnRDb3VudCwgdXNlTmFtZUFzSWQpOwotCQlyZXR1cm4gbmV3IFRDRXhlUmVwbHlJbXBsKCIiLCByZXN1bHQpOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdGVyL2ltcGwvdGVzdGNvbW1hbmRzL1RDQ29weUxpYnJhcnkuamF2YSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdGVyL2ltcGwvdGVzdGNvbW1hbmRzL1RDQ29weUxpYnJhcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzhkYTFjZC4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3Rlci9pbXBsL3Rlc3Rjb21tYW5kcy9UQ0NvcHlMaWJyYXJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXIuaW1wbC50ZXN0Y29tbWFuZHM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXIuaWZhY2UuVENFeGVSZXBseTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXIuaW1wbC5UZXN0Q29tbWFuZEltcGw7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotLyoqCi0gKiBBIHRlc3QgY29tbWFuZCBjbGFzcwotICogCi0gKiBAYXV0aG9yIFdlaXBpbmcgTHUKLSAqIEBzaW5jZSAxLjAKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgVENDb3B5TGlicmFyeSBleHRlbmRzIFRlc3RDb21tYW5kSW1wbCB7CQotCQotCXB1YmxpYyB2b2lkIHBhcnNlKEVsZW1lbnQgZWxlbWVudCkgewotCQlzdXBlci5wYXJzZShlbGVtZW50KTsKLQkJc2V0QXR0cmlidXRlKEFUX0xpYkZvbGRlck5hbWUsIGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUX0xpYkZvbGRlck5hbWUpKTsKLQl9Ci0JCi0JcHVibGljIFRDRXhlUmVwbHkgZXhlY3V0ZSgpIHsKLQkJU3RyaW5nIHJlbExpYk5hbWVQYXRoID0gZ2V0QXR0cmlidXRlKEFUX0xpYkZvbGRlck5hbWUpOwotCQlpbnQgaXggPSByZWxMaWJOYW1lUGF0aC5sYXN0SW5kZXhPZigiLyIpOwkJCi0JCVN0cmluZyBsaWJGb2xkZXJOYW1lID0gaXggPCAwID8gcmVsTGliTmFtZVBhdGggOiByZWxMaWJOYW1lUGF0aC5zdWJzdHJpbmcoaXggKyAxKTsKLQkJU3RyaW5nIGxpYlBhdGggPSBnZXRPd25lcigpLmdldEN1cnJUZXN0RGlyKCkuZ2V0QWJzb2x1dGVQYXRoKCkgKyBGaWxlLnNlcGFyYXRvciArIGxpYkZvbGRlck5hbWU7CQotCQlnZXRPd25lcigpLmNvcHlGcm9tVGVzdExpYnMobGliUGF0aCwgcmVsTGliTmFtZVBhdGgpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3Rlci9pbXBsL3Rlc3Rjb21tYW5kcy9UQ0VkaXRNZXRob2RFbGVtZW50LmphdmEgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3Rlci9pbXBsL3Rlc3Rjb21tYW5kcy9UQ0VkaXRNZXRob2RFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlMzg5MjQuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0ZXIvaW1wbC90ZXN0Y29tbWFuZHMvVENFZGl0TWV0aG9kRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmltcGwudGVzdGNvbW1hbmRzOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLlRlc3Rlck91dHB1dFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmlmYWNlLlRDRXhlUmVwbHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmlmYWNlLlRlc3RDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5pbXBsLlRlc3RDb21tYW5kSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLS8qKgotICogQSB0ZXN0IGNvbW1hbmQgY2xhc3MKLSAqIAotICogQGF1dGhvciBXZWlwaW5nIEx1Ci0gKiBAc2luY2UgMS4wCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFRDRWRpdE1ldGhvZEVsZW1lbnQgZXh0ZW5kcyBUQ0VkaXRNZXRob2RFbGVtZW50QmFzZSB7CQkJCQkKLQkKLQlwdWJsaWMgdm9pZCBwYXJzZShFbGVtZW50IGVsZW1lbnQpIHsKLQkJc3VwZXIucGFyc2UoZWxlbWVudCk7Ci0JfQkKLQkKLQlwdWJsaWMgVENFeGVSZXBseSBleGVjdXRlKCkgewotCQlyZXR1cm4gc3VwZXIuZXhlY3V0ZSgpOwotCX0KLQotCQotfQotCi0KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdGVyL2ltcGwvdGVzdGNvbW1hbmRzL1RDRWRpdE1ldGhvZEVsZW1lbnRCYXNlLmphdmEgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3Rlci9pbXBsL3Rlc3Rjb21tYW5kcy9UQ0VkaXRNZXRob2RFbGVtZW50QmFzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyODg2Y2NlLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdGVyL2ltcGwvdGVzdGNvbW1hbmRzL1RDRWRpdE1ldGhvZEVsZW1lbnRCYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOTQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmltcGwudGVzdGNvbW1hbmRzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZEhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzc2lmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXIuVGVzdGVyT3V0cHV0VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXIuaWZhY2UuVENFeGVSZXBseTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXIuaWZhY2UuVGVzdENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmltcGwuVGVzdENvbW1hbmRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0VsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlUeXBlOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci0KLWltcG9ydCBjb20uaWJtLmljdS50ZXh0LlNpbXBsZURhdGVGb3JtYXQ7Ci0KLS8qKgotICogQSB0ZXN0IGNvbW1hbmQgY2xhc3MKLSAqIAotICogQGF1dGhvciBXZWlwaW5nIEx1Ci0gKiBAc2luY2UgMS4wCi0gKiAKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFRDRWRpdE1ldGhvZEVsZW1lbnRCYXNlIGV4dGVuZHMgVGVzdENvbW1hbmRJbXBsIHsJCQkJCQotCQotCXN0YXRpYyBjbGFzcyBUYWdEYXRhIHsKLQkJcHVibGljIE1hcCBhdHRNYXAgPSBuZXcgTGlua2VkSGFzaE1hcCgpOwotCQlwdWJsaWMgTWFwIHJlZk1hcCA9IG5ldyBMaW5rZWRIYXNoTWFwKCk7Ci0JfQotCQotCXByaXZhdGUgRUNsYXNzIGVjbGFzczsKLQlwcml2YXRlIFRhZ0RhdGEgdGFnRGF0YTsKLQlwcml2YXRlIE1ldGhvZEVsZW1lbnQgbWV0aG9kRWxlbWVudDsKLQlwcml2YXRlIE1hcCByZWZWYWx1ZU1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JcHJpdmF0ZSBzdGF0aWMgTWFwIGVjbGFzc0RhdGFNYXAgPSBuZXcgSGFzaE1hcCgpOwotCXByaXZhdGUgTGlzdCBjaGlsZENvbW1hbmRzID0gbmV3IEFycmF5TGlzdCgpOwotCXByaXZhdGUgYm9vbGVhbiBpc0NoaWxkQ29tbWFuZCA9IGZhbHNlOwotCQotCXByb3RlY3RlZCBUZXN0Q29tbWFuZCBuZXdDaGlsZENvbW1hbmQoQ2xhc3MgdHlwZSkgewotCQl0cnkgewotCQkJVENFZGl0TWV0aG9kRWxlbWVudEJhc2UgY29tbWFuZCA9IChUQ0VkaXRNZXRob2RFbGVtZW50QmFzZSkgdHlwZS5uZXdJbnN0YW5jZSgpOwotCQkJY29tbWFuZC5zZXRPd25lcihnZXRPd25lcigpKTsKLQkJCWNvbW1hbmQuc2V0SXNDaGlsZENvbW1hbmQodHJ1ZSk7Ci0JCQlpZiAobG9jYWxEZWJ1ZykgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTEQ+IG5ld0NoaWxkQ29tbWFuZDogIiArIHR5cGUpOwotCQkJfQotCQkJcmV0dXJuIGNvbW1hbmQ7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKXsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHBhcnNlKEVsZW1lbnQgZWxlbWVudCkgewotCQlzdXBlci5wYXJzZShlbGVtZW50KTsKLQkJaW5pdChlbGVtZW50KTsKLQkJcGFyc2VBdHRyaWJ1dGVzKCk7CQkKLQkJcGFyc2VWYWx1ZUNoaWxkcmVuKCk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBpbml0KEVsZW1lbnQgZWxlbWVudCkgewotCQlTdHJpbmcgdHlwZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUX1R5cGUpOwotCQllY2xhc3MgPSBtZXRob2RFbGVtZW50ID09IG51bGwgPyBnZXRFQ2xhc3ModHlwZSkgOiBtZXRob2RFbGVtZW50LmVDbGFzcygpOwotCQlpZiAoZWNsYXNzID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQl0YWdEYXRhID0gKFRhZ0RhdGEpIGVjbGFzc0RhdGFNYXAuZ2V0KGVjbGFzcyk7Ci0JCWlmICh0YWdEYXRhICE9IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQkJCi0JCXRhZ0RhdGEgPSBuZXcgVGFnRGF0YSgpOwotCQllY2xhc3NEYXRhTWFwLnB1dChlY2xhc3MsIHRhZ0RhdGEpOwotCQkKLQkJaWYgKGxvY2FsRGVidWcpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTEQ+IGVjbGFzczogIiArIGVjbGFzcy5nZXROYW1lKCkpOwotCQkJVGVzdGVyT3V0cHV0VXRpbC5zaG93KCJlY2xhc3MuZ2V0RUFsbEF0dHJpYnV0ZXMoKSIsIGVjbGFzcy5nZXRFQWxsQXR0cmlidXRlcygpKTsKLQkJCVRlc3Rlck91dHB1dFV0aWwuc2hvdygiZWNsYXNzLmdldEVBbGxSZWZlcmVuY2VzKCkiLCBlY2xhc3MuZ2V0RUFsbFJlZmVyZW5jZXMoKSk7Ci0JCX0KLQkJCi0JCWFkZFRvRWNsYXNzRGF0YU1hcChlY2xhc3MuZ2V0RUFsbEF0dHJpYnV0ZXMoKSwgdGFnRGF0YS5hdHRNYXApOwotCQlhZGRUb0VjbGFzc0RhdGFNYXAoZWNsYXNzLmdldEVBbGxSZWZlcmVuY2VzKCksIHRhZ0RhdGEucmVmTWFwKTsKLQkJCi0JfQotCQotCXByaXZhdGUgdm9pZCBhZGRUb0VjbGFzc0RhdGFNYXAoTGlzdCBmZWF0dXJlcywgTWFwIGZlYU1hcCkgewotCQlib29sZWFuIHZlcmJvc2UgPSBnZXRWZXJib3NlKCk7Ci0JCWJvb2xlYW4gaXNSZWYgPSBmYWxzZTsKLQkJaWYgKHZlcmJvc2UpIHsKLQkJCWlmIChmZWFNYXAgPT0gdGFnRGF0YS5hdHRNYXApIHsKLQkJCQlsb2coIlxuQXR0cmlidXRlIGZlYXR1ZXMgZm9yICIgKyAiXCIiICsgZWNsYXNzLmdldE5hbWUoKSArICJcIjogIik7Ci0JCQl9IGVsc2UgaWYgKGZlYU1hcCA9PSB0YWdEYXRhLnJlZk1hcCkgewotCQkJCWxvZygiXG5SZWZlcmVuY2UgZmVhdHVlcyBmb3IgIiArICJcIiIgKyBlY2xhc3MuZ2V0TmFtZSgpICsgIlwiOiAiKTsKLQkJCQlpc1JlZiA9IHRydWU7Ci0JCQl9Ci0JCX0KLQkJZm9yIChpbnQgaT0wOyBpPGZlYXR1cmVzLnNpemUoKTsgaSsrKSB7Ci0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IChFU3RydWN0dXJhbEZlYXR1cmUpIGZlYXR1cmVzLmdldChpKTsJCQkKLQkJCWZlYU1hcC5wdXQoZmVhdHVyZS5nZXROYW1lKCksIGZlYXR1cmUpOwotCQkJaWYgKHZlcmJvc2UpIHsKLQkJCQlTdHJpbmcgbGluZSA9ICIiOwotCQkJCWlmIChpc1JlZikgewotCQkJCQlsaW5lICs9ICgoRVJlZmVyZW5jZSkgZmVhdHVyZSkuaXNDb250YWlubWVudCgpID8KLQkJCQkJCQkiY29udGFpbmVkLCAiIDogInJlZmVycmVkICwgIjsKLQkJCQkJbGluZSArPSAoKEVSZWZlcmVuY2UpIGZlYXR1cmUpLmlzTWFueSgpID8KLQkJCQkJCQkibWFueSAgIC0+ICIgOiAic2luZ2xlIC0+ICI7Ci0JCQkJfQotCQkJCWxpbmUgKz0gZmVhdHVyZS5nZXROYW1lKCkgKyAiOiAiOwotCQkJCWxpbmUgKz0gaXNSZWYgPyAoKEVSZWZlcmVuY2UpIGZlYXR1cmUpLmdldEVSZWZlcmVuY2VUeXBlKCkuZ2V0SW5zdGFuY2VDbGFzc05hbWUoKQotCQkJCQkJCTogKChFQXR0cmlidXRlKSBmZWF0dXJlKS5nZXRFQXR0cmlidXRlVHlwZSgpLmdldEluc3RhbmNlQ2xhc3NOYW1lKCk7Ci0JCQkJbG9nKGxpbmUpOwotCQkJfQotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHBhcnNlQXR0cmlidXRlcygpIHsKLQkJc2V0QXR0cmlidXRlKEFUX1R5cGUsIGdldEVsZW1lbnQoKS5nZXRBdHRyaWJ1dGUoQVRfVHlwZSkpOwotCQlzZXRBdHRyaWJ1dGUoQVRfUGF0aCwgZ2V0RWxlbWVudCgpLmdldEF0dHJpYnV0ZShBVF9QYXRoKSk7Ci0JCQotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gdGFnRGF0YS5hdHRNYXAuZW50cnlTZXQoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBpdC5uZXh0KCk7Ci0JCQlTdHJpbmcgYXRfdGFnID0gKFN0cmluZykgZW50cnkuZ2V0S2V5KCk7Ci0JCQlzZXRBdHRyaWJ1dGUoYXRfdGFnLCBnZXRFbGVtZW50KCkuZ2V0QXR0cmlidXRlKGF0X3RhZykpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHBhcnNlVmFsdWVDaGlsZHJlbigpIHsKLQkJZm9yIChJdGVyYXRvciBpdCA9IHRhZ0RhdGEucmVmTWFwLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSkgaXQubmV4dCgpOwotCQkJU3RyaW5nIGNoaWxkVGFnID0gKFN0cmluZykgZW50cnkuZ2V0S2V5KCk7Ci0JCQlzZXRBdHRyaWJ1dGUoY2hpbGRUYWcsIGdldEVsZW1lbnQoKS5nZXRBdHRyaWJ1dGUoY2hpbGRUYWcpKTsKLQkJCXBhcnNlQ2hpbGRUYWdBc1ZhbHVlKGNoaWxkVGFnKTsJCQkJCQkJCQkKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBwYXJzZUNoaWxkVGFnQXNWYWx1ZShTdHJpbmcgY2hpbGRUYWcpIHsKLQkJTm9kZUxpc3QgY25vZGVzID0gZ2V0RWxlbWVudCgpLmdldEVsZW1lbnRzQnlUYWdOYW1lKGNoaWxkVGFnKTsKLQkJaWYgKGNub2RlcyA9PSBudWxsIHx8IGNub2Rlcy5nZXRMZW5ndGgoKSA9PSAwKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJRWxlbWVudCBjRWxlbWVudCA9IChFbGVtZW50KSBjbm9kZXMuaXRlbSgwKTsKLQkJY25vZGVzID0gY0VsZW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoVlRfVmFsdWUpOwkKLQkJaWYgKGNub2RlcyA9PSBudWxsIHx8IGNub2Rlcy5nZXRMZW5ndGgoKSA9PSAwKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJTGlzdCB2YWx1ZUxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoaW50IGk9MDsgaTxjbm9kZXMuZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJRWxlbWVudCB2RWxlbSA9IChFbGVtZW50KSBjbm9kZXMuaXRlbShpKTsKLQkJCVN0cmluZyB2YWx1ZSA9IHZFbGVtLmdldEZpcnN0Q2hpbGQoKS5nZXROb2RlVmFsdWUoKTsKLQkJCXZhbHVlTGlzdC5hZGQodmFsdWUpOwotCQl9Ci0JCXJlZlZhbHVlTWFwLnB1dChjaGlsZFRhZywgdmFsdWVMaXN0KTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHNldE1ldGhvZEVsZW1lbnQoTWV0aG9kRWxlbWVudCBlKSB7Ci0JCW1ldGhvZEVsZW1lbnQgPSBlOwotCX0KLQkKLQlwcm90ZWN0ZWQgTWV0aG9kRWxlbWVudCBnZXRNZXRob2RFbGVtZW50KCkgewotCQlyZXR1cm4gbWV0aG9kRWxlbWVudDsKLQl9CQotCQotCXByb3RlY3RlZCBUYWdEYXRhIGdldFRhZ0RhdGEoKSB7Ci0JCXJldHVybiB0YWdEYXRhOwotCX0KLQkKLQlwcml2YXRlIGJvb2xlYW4gcGFyc2VDaGlsZFRhZ0FzQ29tbWFuZChFbGVtZW50IGNFbGVtZW50LCBTdHJpbmcgY2hpbGRUYWcpIHsKLQkJRVJlZmVyZW5jZSBmZWF0dXJlID0gKEVSZWZlcmVuY2UpIHRhZ0RhdGEucmVmTWFwLmdldChjaGlsZFRhZyk7Ci0JCWlmICghIGZlYXR1cmUuaXNDb250YWlubWVudCgpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJVENFZGl0TWV0aG9kRWxlbWVudEJhc2UgY2hpbGRDb21tYW5kID0gKFRDRWRpdE1ldGhvZEVsZW1lbnRCYXNlKSBuZXdDaGlsZENvbW1hbmQoVENFZGl0TWV0aG9kRWxlbWVudC5jbGFzcyk7Ci0JCU9iamVjdCBmZWF0dXJlT2JqID0gbWV0aG9kRWxlbWVudC5lR2V0KGZlYXR1cmUpOwotCQlpZiAoZmVhdHVyZS5pc01hbnkoKSkgewotCQkJTGlzdCBvd25lckxpc3QgPSAoTGlzdCkgZmVhdHVyZU9iajsKLQkJCWZlYXR1cmVPYmogPSBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGUoZmVhdHVyZS5nZXRFUmVmZXJlbmNlVHlwZSgpKTsKLQkJCW93bmVyTGlzdC5hZGQoZmVhdHVyZU9iaik7Ci0JCX0gCi0JCWNoaWxkQ29tbWFuZC5zZXRNZXRob2RFbGVtZW50KChNZXRob2RFbGVtZW50KSBmZWF0dXJlT2JqKTsKLQkJaWYgKGdldFZlcmJvc2UoKSkgewotCQkJY0VsZW1lbnQuc2V0QXR0cmlidXRlKEFUX1ZlcmJvc2UsICJ0cnVlIik7Ci0JCX0KLQkJY2hpbGRDb21tYW5kLnBhcnNlKGNFbGVtZW50KTsKLQkJYWRkVG9DaGlsZENvbW1hbmRzKGNoaWxkQ29tbWFuZCk7Ci0JCXJldHVybiB0cnVlOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgcGFyc2VDb21tYW5kQ2hpbGRyZW4oKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSB0YWdEYXRhLnJlZk1hcC5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCU1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIGl0Lm5leHQoKTsKLQkJCVN0cmluZyBjaGlsZFRhZyA9IChTdHJpbmcpIGVudHJ5LmdldEtleSgpOwotCQkJTm9kZUxpc3QgY25vZGVzID0gZ2V0RWxlbWVudCgpLmdldEVsZW1lbnRzQnlUYWdOYW1lKGNoaWxkVGFnKTsKLQkJCWlmIChjbm9kZXMgPT0gbnVsbCB8fCBjbm9kZXMuZ2V0TGVuZ3RoKCkgPT0gMCkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJZm9yIChpbnQgaT0wOyBpPGNub2Rlcy5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCQkJRWxlbWVudCBjRWxlbWVudCA9IChFbGVtZW50KSBjbm9kZXMuaXRlbShpKTsKLQkJCQlwYXJzZUNoaWxkVGFnQXNDb21tYW5kKGNFbGVtZW50LCBjaGlsZFRhZyk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBUQ0V4ZVJlcGx5IGV4ZWN1dGVDaGlsZENvbW1hbmRzKCkgewotCQlmb3IgKGludCBpPTA7IGk8Y2hpbGRDb21tYW5kcy5zaXplKCk7IGkrKykgewotCQkJVGVzdENvbW1hbmQgY29tbWFuZCA9IChUZXN0Q29tbWFuZCkgY2hpbGRDb21tYW5kcy5nZXQoaSk7Ci0JCQlUQ0V4ZVJlcGx5IHJlc3VsdCA9IGNvbW1hbmQuZXhlY3V0ZSgpOwotCQkJaWYgKHJlc3VsdCAhPSBudWxsICYmICFyZXN1bHQucGFzc2luZygpKSB7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIFRDRXhlUmVwbHkgZXhlY3V0ZSgpIHsJCQotCQlNZXRob2RMaWJyYXJ5IGN1cnJMaWIgPSBnZXRPd25lcigpLmdldEN1cnJlbnRCYXNlTGliKCk7CQkKLQkJU3RyaW5nIHBhdGggPSBnZXRBdHRyaWJ1dGUoQVRfUGF0aCk7Ci0JCWlmIChtZXRob2RFbGVtZW50ID09IG51bGwpIHsKLQkJCWlmIChVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGUoZWNsYXNzKSBpbnN0YW5jZW9mIFByb2Nlc3NFbGVtZW50KSB7Ci0JCQkJbWV0aG9kRWxlbWVudCA9IFRlc3Rlck91dHB1dFV0aWwuZ2V0UHJvY2Vzc0VsZW1lbnQoY3VyckxpYiwgcGF0aCk7Ci0JCQl9IGVsc2UgewotCQkJCW1ldGhvZEVsZW1lbnQgPSBUZXN0ZXJPdXRwdXRVdGlsLmdldE1ldGhvZEVsZW1lbnQoY3VyckxpYiwgcGF0aCk7Ci0JCQl9Ci0JCX0KLQkJaWYgKG1ldGhvZEVsZW1lbnQgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcGFyc2VDb21tYW5kQ2hpbGRyZW4oKTsKLQkJCi0JCWVTZXRCeUF0dHJpYnV0ZXMoKTsKLQkJZVNldEJ5VmFsdWVDaGlsZHJlbigpOwotCQkKLQkJZXhlY3V0ZUNoaWxkQ29tbWFuZHMoKTsKLQkJCi0JCWlmICghIGdldElzQ2hpbGRDb21tYW5kKCkpIHsKLQkJCXNhdmUobWV0aG9kRWxlbWVudCk7Ci0JCQkvL3NhdmUoKE1ldGhvZEVsZW1lbnQpIG1ldGhvZEVsZW1lbnQuZUNvbnRhaW5lcigpKTsKLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgdm9pZCBlU2V0QnlBdHRyaWJ1dGVzKCkgewotCQlNYXAgYXR0TWFwID0gZ2V0VGFnRGF0YSgpLmF0dE1hcDsKLQkJTWFwIGF0dHJpYnV0ZU1hcCA9IGdldEF0dHJpYnV0ZU1hcCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gYXR0TWFwLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSkgaXQubmV4dCgpOwotCQkJU3RyaW5nIGF0X3RhZyA9IChTdHJpbmcpIGVudHJ5LmdldEtleSgpOwotCQkJRUF0dHJpYnV0ZSBlYXR0ID0gKEVBdHRyaWJ1dGUpIGVudHJ5LmdldFZhbHVlKCk7Ci0JCQlFRGF0YVR5cGUgZGF0YVR5cGUgPSBlYXR0LmdldEVBdHRyaWJ1dGVUeXBlKCk7Ci0JCQlTdHJpbmcgYXRfdmFsID0gKFN0cmluZykgYXR0cmlidXRlTWFwLmdldChhdF90YWcpOwotCQkJaWYgKGxvY2FsRGVidWcpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxEPiBhdF90YWc6ICIgKyBhdF90YWcpOwotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTEQ+IGF0X3ZhbDogIiArIGF0X3ZhbCk7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJMRD4gZWF0dDogIiArIGVhdHQpOwotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTEQ+IGRhdGFUeXBlOiAiICsgZGF0YVR5cGUpOwotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiIik7Ci0JCQl9CQkJCi0JCQlpZiAoYXRfdmFsID09IG51bGwgfHwgYXRfdmFsLmxlbmd0aCgpID09IDApIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCU9iamVjdCBuZXdWYWx1ZSA9IGdldEVTZXRWYWx1ZShkYXRhVHlwZSwgYXRfdmFsKTsKLQkJCQotCQkJaWYgKG5ld1ZhbHVlICE9IG51bGwpIHsKLQkJCQltZXRob2RFbGVtZW50LmVTZXQoZWF0dCwgbmV3VmFsdWUpOwotCQkJfSBlbHNlIHsKLQkJCQlsb2coIlxuV2FybmluZzogbm90IGhhbmRsZWQgZGF0YVR5cGU6ICIgKyBkYXRhVHlwZS5nZXRJbnN0YW5jZUNsYXNzTmFtZSgpKTsKLQkJCX0KLQkJfQotCQlFQXR0cmlidXRlIGRhdGVBdHQgPSAoRUF0dHJpYnV0ZSkgYXR0TWFwLmdldCgiY2hhbmdlRGF0ZSIpOwotCQlpZiAoZGF0ZUF0dCAhPSBudWxsKSB7Ci0JCQltZXRob2RFbGVtZW50LmVTZXQoZGF0ZUF0dCwgbmV3IERhdGUoKSk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBPYmplY3QgZ2V0RVNldFZhbHVlKEVEYXRhVHlwZSBkYXRhVHlwZSwgU3RyaW5nIHN0clZhbCkgewotCQlDbGFzcyBjbHMgPSBkYXRhVHlwZS5nZXRJbnN0YW5jZUNsYXNzKCk7CQkKLQkJaWYgKGNscy5lcXVhbHMoU3RyaW5nLmNsYXNzKSkgewotCQkJcmV0dXJuIHN0clZhbDsKLQkJfQotCQlpZiAoY2xzLmVxdWFscyhCb29sZWFuLmNsYXNzKSkgewotCQkJYm9vbGVhbiBiID0gc3RyVmFsLmVxdWFsc0lnbm9yZUNhc2UoInRydWUiKTsKLQkJCWlmICghYiAmJiAhc3RyVmFsLmVxdWFsc0lnbm9yZUNhc2UoImZhbHNlIikpIHsKLQkJCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQkJCX0KLQkJCXJldHVybiBuZXcgQm9vbGVhbihiKTsKLQkJfQotCQlpZiAoY2xzLmVxdWFscyhEYXRlLmNsYXNzKSkgewotCQkJU2ltcGxlRGF0ZUZvcm1hdCBzZGYgPSBuZXcgU2ltcGxlRGF0ZUZvcm1hdCgieXl5eS1NTS1kZCIpOwotCQkJRGF0ZSBkYXRlID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJZGF0ZSA9IHNkZi5wYXJzZShzdHJWYWwpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpewotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9Ci0JCQlyZXR1cm4gZGF0ZTsKLQkJfQotCQlpZiAoY2xzLmVxdWFscyhWYXJpYWJpbGl0eVR5cGUuY2xhc3MpKSB7Ci0JCQlpZiAoc3RyVmFsLmVxdWFscygiY29udHJpYnV0ZXMiKSkgewotCQkJCXJldHVybiBWYXJpYWJpbGl0eVR5cGUuQ09OVFJJQlVURVM7Ci0JCQl9Ci0JCQlpZiAoc3RyVmFsLmVxdWFscygiZXh0ZW5kcyIpKSB7Ci0JCQkJcmV0dXJuIFZhcmlhYmlsaXR5VHlwZS5FWFRFTkRTOwotCQkJfQotCQkJaWYgKHN0clZhbC5lcXVhbHMoInJlcGxhY2VzIikpIHsKLQkJCQlyZXR1cm4gVmFyaWFiaWxpdHlUeXBlLlJFUExBQ0VTOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgZVNldEJ5VmFsdWVDaGlsZHJlbigpIHsKLQkJTWV0aG9kTGlicmFyeSBjdXJyTGliID0gZ2V0T3duZXIoKS5nZXRDdXJyZW50QmFzZUxpYigpOwkKLQkJTWFwIHJlZk1hcCA9IGdldFRhZ0RhdGEoKS5yZWZNYXA7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSByZWZNYXAuZW50cnlTZXQoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBpdC5uZXh0KCk7Ci0JCQlTdHJpbmcgcmVmX3RhZyA9IChTdHJpbmcpIGVudHJ5LmdldEtleSgpOwotCQkJRVJlZmVyZW5jZSBlcmVmID0gKEVSZWZlcmVuY2UpIGVudHJ5LmdldFZhbHVlKCk7Ci0JCQlFQ2xhc3NpZmllciBlVHlwZSA9IGVyZWYuZ2V0RVR5cGUoKTsKLQkJCUxpc3QgdmFsdWVMaXN0ID0gKExpc3QpIHJlZlZhbHVlTWFwLmdldChyZWZfdGFnKTsKLQkJCWlmIChsb2NhbERlYnVnKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJMRD4gcmVmX3RhZzogIiArIHJlZl90YWcpOwotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTEQ+IHZhbHVlTGlzdDogIiArIHZhbHVlTGlzdCk7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJMRD4gZXJlZjogIiArIGVyZWYpOwotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTEQ+IGVUeXBlOiAiICsgZVR5cGUpOwotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiIik7Ci0JCQl9Ci0JCQkKLQkJCWludCBzeiA9IHZhbHVlTGlzdCA9PSBudWxsID8gMCA6IHZhbHVlTGlzdC5zaXplKCk7Ci0JCQlpZiAoc3ogPT0gMCkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJaWYgKGVyZWYuaXNNYW55KCkpIHsKLQkJCQlMaXN0IG93bmVyTGlzdCA9IChMaXN0KSBtZXRob2RFbGVtZW50LmVHZXQoZXJlZik7Ci0JCQkJZm9yIChpbnQgaT0wOyBpPHN6OyBpKyspIHsKLQkJCQkJU3RyaW5nIHJlZlBhdGggPSAoU3RyaW5nKSB2YWx1ZUxpc3QuZ2V0KGkpOwotCQkJCQlNZXRob2RFbGVtZW50IHJlZkVsZW1lbnQgPSBUZXN0ZXJPdXRwdXRVdGlsLmdldE1ldGhvZEVsZW1lbnQoY3VyckxpYiwgcmVmUGF0aCk7Ci0JCQkJCWlmIChyZWZFbGVtZW50ICE9IG51bGwpIHsKLQkJCQkJCW93bmVyTGlzdC5hZGQocmVmRWxlbWVudCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKHN6ID09IDEpewotCQkJCVN0cmluZyByZWZQYXRoID0gKFN0cmluZykgdmFsdWVMaXN0LmdldCgwKTsKLQkJCQlNZXRob2RFbGVtZW50IHJlZkVsZW1lbnQgPSBUZXN0ZXJPdXRwdXRVdGlsLmdldE1ldGhvZEVsZW1lbnQoY3VyckxpYiwgcmVmUGF0aCk7Ci0JCQkJaWYgKGVyZWYuZ2V0TmFtZSgpLmVxdWFscygidmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCIpIAotCQkJCQkJJiYgcmVmRWxlbWVudCBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpIHsKLQkJCQkJcmVmRWxlbWVudCA9ICgoUHJvY2Vzc0NvbXBvbmVudClyZWZFbGVtZW50KS5nZXRQcm9jZXNzKCk7Ci0JCQkJfQotCQkJCW1ldGhvZEVsZW1lbnQuZVNldChlcmVmLCByZWZFbGVtZW50KTsKLQkJCX0gZWxzZSB7Ci0JCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JCQl9Ci0JCQkKLQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0SXNDaGlsZENvbW1hbmQoYm9vbGVhbiBiKSB7Ci0JCWlzQ2hpbGRDb21tYW5kID0gYjsKLQl9Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gZ2V0SXNDaGlsZENvbW1hbmQoKSB7Ci0JCXJldHVybiBpc0NoaWxkQ29tbWFuZDsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgYWRkVG9DaGlsZENvbW1hbmRzKFRlc3RDb21tYW5kIGNvbW1hbmQpIHsKLQkJY2hpbGRDb21tYW5kcy5hZGQoY29tbWFuZCk7Ci0JfQotfQotCi0KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdGVyL2ltcGwvdGVzdGNvbW1hbmRzL1RDRXhlUmVwbHlJbXBsLmphdmEgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3Rlci9pbXBsL3Rlc3Rjb21tYW5kcy9UQ0V4ZVJlcGx5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MTdkNjJlLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdGVyL2ltcGwvdGVzdGNvbW1hbmRzL1RDRXhlUmVwbHlJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXIuaW1wbC50ZXN0Y29tbWFuZHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmlmYWNlLlRDRXhlUmVwbHk7Ci0KLS8qKgotICogSW1wbGVtZW50aW5nIFRDRXhlUmVwbHkKLSAqIAotICogQGF1dGhvciBXZWlwaW5nIEx1Ci0gKiBAc2luY2UgMS4wCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFRDRXhlUmVwbHlJbXBsIGltcGxlbWVudHMgVENFeGVSZXBseSB7Ci0JCi0JcHJpdmF0ZSBib29sZWFuIHBhc3NpbmcgPSB0cnVlOwotCXByaXZhdGUgTGlzdCBtc2dzOwotCQotCXB1YmxpYyBUQ0V4ZVJlcGx5SW1wbChTdHJpbmcgbXNnLCBib29sZWFuIHBhc3NpbmcpIHsKLQkJYWRkTXNnKG1zZyk7Ci0JCXNldFBhc3NpbmcocGFzc2luZyk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0TGFzdE1zZygpIHsKLQkJaW50IHN6ID0gbXNncyA9PSBudWxsID8gMCA6IG1zZ3Muc2l6ZSgpOwkJCQotCQlyZXR1cm4gc3ogPT0gMCA/IG51bGwgOiAoU3RyaW5nKSBtc2dzLmdldChzeiAtIDEpOwotCX0KLQkKLQlwdWJsaWMgTGlzdCBnZXRNc2dzKCkgewotCQlyZXR1cm4gbXNnczsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gcGFzc2luZygpIHsKLQkJcmV0dXJuIHBhc3Npbmc7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGFkZE1zZyhTdHJpbmcgbXNnKSB7Ci0JCWlmIChtc2cgPT0gbnVsbCB8fCBtc2cubGVuZ3RoKCkgPT0gMCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWlmIChtc2dzID09IG51bGwpIHsKLQkJCW1zZ3MgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCX0KLQkJbXNncy5hZGQobXNnKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0UGFzc2luZyhib29sZWFuIGIpIHsKLQkJcGFzc2luZyA9IGI7Ci0JfQotfQotCmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3Rlci9pbXBsL3Rlc3Rjb21tYW5kcy9UQ0V4ZVJlcGx5TGlzdEltcGwuamF2YSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdGVyL2ltcGwvdGVzdGNvbW1hbmRzL1RDRXhlUmVwbHlMaXN0SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZWMwNmMwLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdGVyL2ltcGwvdGVzdGNvbW1hbmRzL1RDRXhlUmVwbHlMaXN0SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmltcGwudGVzdGNvbW1hbmRzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5pZmFjZS5UQ0V4ZVJlcGx5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5pZmFjZS5UQ0V4ZVJlcGx5TGlzdDsKLQotLyoqCi0gKiBJbXBsZW1lbnRpbmcgQ0V4ZVJlcGx5TGlzdAotICogCi0gKiBAYXV0aG9yIFdlaXBpbmcgTHUKLSAqIEBzaW5jZSAxLjAKLSAqIAotICovCi0KLXB1YmxpYyBjbGFzcyBUQ0V4ZVJlcGx5TGlzdEltcGwgaW1wbGVtZW50cyBUQ0V4ZVJlcGx5TGlzdCB7Ci0JTGlzdCByZXBseUxpc3QgPSBudWxsOwotCVN0cmluZyAJc3VtbWFyeVJlcGx5OwotCQotCXB1YmxpYyBpbnQgc2l6ZSgpIHsKLQkJcmV0dXJuIHJlcGx5TGlzdCA9PSBudWxsID8gMCA6IHJlcGx5TGlzdC5zaXplKCk7Ci0JfQotCi0JcHVibGljIFRDRXhlUmVwbHkgaXRlbShpbnQgaSkgewotCQlyZXR1cm4gKFRDRXhlUmVwbHkpIHJlcGx5TGlzdC5nZXQoaSk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIHBhc3NpbmcoKSB7CQotCQlmb3IgKGludCBpPTA7IGk8c2l6ZSgpOyBpKyspIHsKLQkJCWlmICghIGl0ZW0oaSkucGFzc2luZygpKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9CQkKLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGFkZChUQ0V4ZVJlcGx5IHJlcGx5KSB7Ci0JCWlmIChyZXBseUxpc3QgPT0gbnVsbCkgewotCQkJcmVwbHlMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQl9Ci0JCXJlcGx5TGlzdC5hZGQocmVwbHkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRTdW1tYXJ5UmVwbHkoU3RyaW5nIHN0cikgewotCQlzdW1tYXJ5UmVwbHkgPSBzdHI7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0U3VtbWFyeVJlcGx5KCkgewotCQlyZXR1cm4gc3VtbWFyeVJlcGx5OwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0ZXIvaW1wbC90ZXN0Y29tbWFuZHMvVENFeHBvcnRDb25maWd1cmF0aW9uLmphdmEgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3Rlci9pbXBsL3Rlc3Rjb21tYW5kcy9UQ0V4cG9ydENvbmZpZ3VyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGRjY2NkOC4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3Rlci9pbXBsL3Rlc3Rjb21tYW5kcy9UQ0V4cG9ydENvbmZpZ3VyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5pbXBsLnRlc3Rjb21tYW5kczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5zZXJ2aWNlcy5Db25maWd1cmF0aW9uRXhwb3J0RGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnNlcnZpY2VzLkNvbmZpZ3VyYXRpb25FeHBvcnRTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnNlcnZpY2VzLlNhZmVVcGRhdGVDb250cm9sbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5MaWJyYXJ5VGVzdFNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmlmYWNlLlRDRXhlUmVwbHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmltcGwuVGVzdENvbW1hbmRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5pbXBsLlRlc3RDb21tYW5kTWdyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotLyoqCi0gKiBBIHRlc3QgY29tbWFuZCBjbGFzcwotICogCi0gKiBAYXV0aG9yIFdlaXBpbmcgTHUKLSAqIEBzaW5jZSAxLjAKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgVENFeHBvcnRDb25maWd1cmF0aW9uIGV4dGVuZHMgVGVzdENvbW1hbmRJbXBsIHsJCQkJCi0JCi0JcHVibGljIHZvaWQgcGFyc2UoRWxlbWVudCBlbGVtZW50KSB7Ci0JCXN1cGVyLnBhcnNlKGVsZW1lbnQpOwotCQlzZXRBdHRyaWJ1dGUoQVRfRXhwb3J0Rm9sZGVyTmFtZSwgZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRfRXhwb3J0Rm9sZGVyTmFtZSkpOwotCQlzZXRBdHRyaWJ1dGUoQVRfU2VsZWN0ZWRDb25maWdOYW1lLCBlbGVtZW50LmdldEF0dHJpYnV0ZShBVF9TZWxlY3RlZENvbmZpZ05hbWUpKTsKLQl9CQotCQotCXB1YmxpYyBUQ0V4ZVJlcGx5IGV4ZWN1dGUoKSB7Ci0JCVRlc3RDb21tYW5kTWdyIG93bmVyID0gZ2V0T3duZXIoKTsKLQkJTWV0aG9kTGlicmFyeSBjdXJyTGliID0gb3duZXIuZ2V0Q3VycmVudEJhc2VMaWIoKTsKLQkJaWYgKGN1cnJMaWIgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJCi0JCVN0cmluZyBleHBvcnRGb2xkZXJOYW1lID0gZ2V0QXR0cmlidXRlKEFUX0V4cG9ydEZvbGRlck5hbWUpOwkJCi0JCVN0cmluZyBzZWxlY3RlZENvbmZpZ05hbWUgPSBnZXRBdHRyaWJ1dGUoQVRfU2VsZWN0ZWRDb25maWdOYW1lKTsKLQkJCi0JCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gKE1ldGhvZENvbmZpZ3VyYXRpb24pIExpYnJhcnlUZXN0U2VydmljZS5nZXRFbGVtZW50Ci0JCQkJCQkoY3VyckxpYi5nZXRQcmVkZWZpbmVkQ29uZmlndXJhdGlvbnMoKSwgc2VsZWN0ZWRDb25maWdOYW1lKTsKLQkJaWYgKGNvbmZpZyA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQkKLQkJRmlsZSBleHBvcnRGb2xkZXIgPSBvd25lci5yZWdpc3RlckV4cG9ydERlc3RpbmF0aW9uKGV4cG9ydEZvbGRlck5hbWUsIGZhbHNlKTsJCQkJCi0JCWZpbmFsIENvbmZpZ3VyYXRpb25FeHBvcnREYXRhIGRhdGEgPSBuZXcgQ29uZmlndXJhdGlvbkV4cG9ydERhdGEoKTsKLQkJZGF0YS5sbERhdGEuc2V0TGliTmFtZShjdXJyTGliLmdldE5hbWUoKSk7Ci0JCWRhdGEubGxEYXRhLnNldFBhcmVudEZvbGRlcihleHBvcnRGb2xkZXIuZ2V0QWJzb2x1dGVQYXRoKCkpOwotCQlkYXRhLmV4cG9ydE9uZUNvbmZpZyA9IHRydWU7Ci0JCWRhdGEuZXhwb3J0Q29uZmlnU3BlY3MgPSBmYWxzZTsKLQkJZGF0YS5zZWxlY3RlZENvbmZpZ3MgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWRhdGEuc2VsZWN0ZWRDb25maWdzLmFkZChjb25maWcpOwotCQkKLQkJU2FmZVVwZGF0ZUNvbnRyb2xsZXIuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCShuZXcgQ29uZmlndXJhdGlvbkV4cG9ydFNlcnZpY2UoZGF0YSkpLnJ1bihuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3Rlci9pbXBsL3Rlc3Rjb21tYW5kcy9UQ0V4cG9ydFBsdWdpbnMuamF2YSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdGVyL2ltcGwvdGVzdGNvbW1hbmRzL1RDRXhwb3J0UGx1Z2lucy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNzI2NmVjLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdGVyL2ltcGwvdGVzdGNvbW1hbmRzL1RDRXhwb3J0UGx1Z2lucy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmltcGwudGVzdGNvbW1hbmRzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnNlcnZpY2VzLlBsdWdpbkV4cG9ydERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5zZXJ2aWNlcy5QbHVnaW5FeHBvcnRTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnNlcnZpY2VzLlNhZmVVcGRhdGVDb250cm9sbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5pZmFjZS5UQ0V4ZVJlcGx5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5pbXBsLlRlc3RDb21tYW5kSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0vKioKLSAqIEEgdGVzdCBjb21tYW5kIGNsYXNzCi0gKiAKLSAqIEBhdXRob3IgV2VpcGluZyBMdQotICogQHNpbmNlIDEuMAotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBUQ0V4cG9ydFBsdWdpbnMgZXh0ZW5kcyBUZXN0Q29tbWFuZEltcGwgewkJCQkJCi0JCi0JcHVibGljIHZvaWQgcGFyc2UoRWxlbWVudCBlbGVtZW50KSB7Ci0JCXN1cGVyLnBhcnNlKGVsZW1lbnQpOwotCQlzZXRBdHRyaWJ1dGUoQVRfRXhwb3J0Rm9sZGVyTmFtZSwgZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRfRXhwb3J0Rm9sZGVyTmFtZSkpOwotCX0JCi0JCi0JcHVibGljIFRDRXhlUmVwbHkgZXhlY3V0ZSgpIHsKLQkJTGlzdCBzZWxlY3RlZFBsdWdpbnMgPSBuZXcgQXJyYXlMaXN0KGdldE93bmVyKCkuZ2V0Q3VycmVudEJhc2VMaWIoKS5nZXRNZXRob2RQbHVnaW5zKCkpOwkKLQkJCi0JCWludCBzeiA9IHNlbGVjdGVkUGx1Z2lucyA9PSBudWxsID8gMCA6IHNlbGVjdGVkUGx1Z2lucy5zaXplKCk7Ci0JCWlmIChzeiA9PSAwKSB7Ci0JCQlyZXR1cm4gbnVsbDsgCi0JCX0KLQkJCi0JCVN0cmluZyBleHBvcnRGb2xkZXJOYW1lID0gZ2V0QXR0cmlidXRlKEFUX0V4cG9ydEZvbGRlck5hbWUpOwotCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gKE1ldGhvZFBsdWdpbikgc2VsZWN0ZWRQbHVnaW5zLmdldCgwKTsKLQkJRmlsZSBmaWxlID0gbmV3IEZpbGUocGx1Z2luLmVSZXNvdXJjZSgpLmdldFVSSSgpLnRvRmlsZVN0cmluZygpKTsKLQkJZmlsZSA9IGZpbGUuZ2V0UGFyZW50RmlsZSgpLmdldFBhcmVudEZpbGUoKTsKLQkJRmlsZSBleHBvcnRGb2xkZXIgPSBnZXRPd25lcigpLnJlZ2lzdGVyRXhwb3J0RGVzdGluYXRpb24oZXhwb3J0Rm9sZGVyTmFtZSwgZmFsc2UpOwotCQkKLQkJZmluYWwgUGx1Z2luRXhwb3J0RGF0YSBkYXRhID0gbmV3IFBsdWdpbkV4cG9ydERhdGEoKTsKLQkJZGF0YS5sbERhdGEuc2V0TGliTmFtZShmaWxlLmdldE5hbWUoKSk7Ci0JCWRhdGEubGxEYXRhLnNldFBhcmVudEZvbGRlcihleHBvcnRGb2xkZXIuZ2V0QWJzb2x1dGVQYXRoKCkpOwotCQlkYXRhLnNldFNlbGVjdGVkUGx1Z2lucyhzZWxlY3RlZFBsdWdpbnMpOwotCQlkYXRhLmJ1aWxkQXNzb2NpYXRlZENvbmZpZ01hcCgpOwotCi0JCVNhZmVVcGRhdGVDb250cm9sbGVyLnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkobmV3IFBsdWdpbkV4cG9ydFNlcnZpY2UoZGF0YSkpLnJ1bihuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQlyZXR1cm4gbnVsbDsKLQl9Ci19Ci0KLQpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0ZXIvaW1wbC90ZXN0Y29tbWFuZHMvVENFeHBvcnRYbWwuamF2YSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdGVyL2ltcGwvdGVzdGNvbW1hbmRzL1RDRXhwb3J0WG1sLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3YTdkZWQuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0ZXIvaW1wbC90ZXN0Y29tbWFuZHMvVENFeHBvcnRYbWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5pbXBsLnRlc3Rjb21tYW5kczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sLnNlcnZpY2VzLkV4cG9ydFhNTERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwuc2VydmljZXMuRXhwb3J0WE1MU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5zZXJ2aWNlcy5TYWZlVXBkYXRlQ29udHJvbGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXIuaWZhY2UuVENFeGVSZXBseTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXIuaW1wbC5UZXN0Q29tbWFuZEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmltcGwuVGVzdENvbW1hbmRNZ3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLS8qKgotICogQSB0ZXN0IGNvbW1hbmQgY2xhc3MKLSAqIAotICogQGF1dGhvciBXZWlwaW5nIEx1Ci0gKiBAc2luY2UgMS4wCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFRDRXhwb3J0WG1sIGV4dGVuZHMgVGVzdENvbW1hbmRJbXBsIHsJCQkJCi0JCi0JcHVibGljIHZvaWQgcGFyc2UoRWxlbWVudCBlbGVtZW50KSB7Ci0JCXN1cGVyLnBhcnNlKGVsZW1lbnQpOwotCQlzZXRBdHRyaWJ1dGUoQVRfRXhwb3J0Rm9sZGVyTmFtZSwgZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRfRXhwb3J0Rm9sZGVyTmFtZSkpOwotCX0JCi0JCi0JcHVibGljIFRDRXhlUmVwbHkgZXhlY3V0ZSgpIHsKLQkJVGVzdENvbW1hbmRNZ3Igb3duZXIgPSBnZXRPd25lcigpOwotCQlTdHJpbmcgZXhwb3J0Rm9sZGVyTmFtZSA9IGdldEF0dHJpYnV0ZShBVF9FeHBvcnRGb2xkZXJOYW1lKTsKLQkJCi0JCU1ldGhvZExpYnJhcnkgbGliID0gb3duZXIuZ2V0Q3VycmVudEJhc2VMaWIoKTsKLQkJRmlsZSBmaWxlID0gbmV3IEZpbGUobGliLmVSZXNvdXJjZSgpLmdldFVSSSgpLnRvRmlsZVN0cmluZygpKTsKLQkJZmlsZSA9IGZpbGUuZ2V0UGFyZW50RmlsZSgpLmdldFBhcmVudEZpbGUoKTsKLQkJRmlsZSBleHBvcnRGaWxlID0gb3duZXIucmVnaXN0ZXJFeHBvcnREZXN0aW5hdGlvbihleHBvcnRGb2xkZXJOYW1lLCB0cnVlKTsJCQotCQkKLQkJZmluYWwgRXhwb3J0WE1MRGF0YSBkYXRhID0gbmV3IEV4cG9ydFhNTERhdGEoKTsKLQkJZGF0YS5zZXRFeHBvcnRUeXBlKEV4cG9ydFhNTERhdGEuRVhQT1JUX01FVEhPRF9MSUJSQVJZKTsKLQkJZGF0YS5zZXRYTUxGaWxlKGV4cG9ydEZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOwotCQkKLQkJU2FmZVVwZGF0ZUNvbnRyb2xsZXIuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCShuZXcgRXhwb3J0WE1MU2VydmljZShkYXRhKSkuZG9FeHBvcnQobmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0ZXIvaW1wbC90ZXN0Y29tbWFuZHMvVENJbXBvcnRDb25maWd1cmF0aW9uLmphdmEgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3Rlci9pbXBsL3Rlc3Rjb21tYW5kcy9UQ0ltcG9ydENvbmZpZ3VyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAzNmUxMC4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3Rlci9pbXBsL3Rlc3Rjb21tYW5kcy9UQ0ltcG9ydENvbmZpZ3VyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXIuaW1wbC50ZXN0Y29tbWFuZHM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcuc2VydmljZXMuQ29uZmlndXJhdGlvbkltcG9ydERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy5zZXJ2aWNlcy5Db25maWd1cmF0aW9uSW1wb3J0U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLnNlcnZpY2VzLkVsZW1lbnREaWZmVHJlZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5zZXJ2aWNlcy5TYWZlVXBkYXRlQ29udHJvbGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXIuaWZhY2UuVENFeGVSZXBseTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXIuaW1wbC5UZXN0Q29tbWFuZEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmltcGwuVGVzdENvbW1hbmRNZ3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLS8qKgotICogQSB0ZXN0IGNvbW1hbmQgY2xhc3MKLSAqIAotICogQGF1dGhvciBXZWlwaW5nIEx1Ci0gKiBAc2luY2UgMS4wCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFRDSW1wb3J0Q29uZmlndXJhdGlvbiBleHRlbmRzIFRlc3RDb21tYW5kSW1wbCB7CQkJCQotCi0JcHVibGljIHZvaWQgcGFyc2UoRWxlbWVudCBlbGVtZW50KSB7Ci0JCXN1cGVyLnBhcnNlKGVsZW1lbnQpOwotCQlzZXRBdHRyaWJ1dGUoQVRfSW1wb3J0Rm9sZGVyTmFtZSwgZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRfSW1wb3J0Rm9sZGVyTmFtZSkpOwotCX0JCi0JCi0JcHVibGljIFRDRXhlUmVwbHkgZXhlY3V0ZSgpIHsKLQkJZmluYWwgVGVzdENvbW1hbmRNZ3Igb3duZXIgPSBnZXRPd25lcigpOwotCQlTdHJpbmcgaW1wb3J0Rm9sZGVyTmFtZSA9IGdldEF0dHJpYnV0ZShBVF9JbXBvcnRGb2xkZXJOYW1lKTsKLQkJCi0JCUZpbGUgZmlsZSA9IG93bmVyLmdldEltcG9ydEZpbGUoaW1wb3J0Rm9sZGVyTmFtZSk7Ci0JCWlmIChmaWxlID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCQotCQlDb25maWd1cmF0aW9uSW1wb3J0RGF0YSBkYXRhID0gbmV3IENvbmZpZ3VyYXRpb25JbXBvcnREYXRhKCk7Ci0JCWRhdGEubGxEYXRhLnNldExpYk5hbWUoaW1wb3J0Rm9sZGVyTmFtZSk7Ci0JCWRhdGEubGxEYXRhLnNldFBhcmVudEZvbGRlcihmaWxlLmdldEFic29sdXRlUGF0aCgpKTsJCi0KLQkJZmluYWwgQ29uZmlndXJhdGlvbkltcG9ydFNlcnZpY2UgaW1wb3J0U2VydmljZSA9IG5ldyBDb25maWd1cmF0aW9uSW1wb3J0U2VydmljZShkYXRhKTsKLQkJaW1wb3J0U2VydmljZS5hbmFseXplKG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCi0JCU9iamVjdFtdIGVsZW1lbnRzID0gZ2V0RWxlbWVudHMoaW1wb3J0U2VydmljZS5nZXREaWZmVHJlZSgpKTsKLQkJZGF0YS5pbXBvcnRMaXN0LmNsZWFyKCk7Ci0JCWZvciAoIGludCBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrICkgewotCQkJZGF0YS5pbXBvcnRMaXN0LmFkZChlbGVtZW50c1tpXSk7Ci0JCX0KLQkJCi0JCVNhZmVVcGRhdGVDb250cm9sbGVyLnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQl0cnkgewotCQkJCQlpbXBvcnRTZXJ2aWNlLnBlcmZvcm1JbXBvcnQobmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCQkJCU1ldGhvZExpYnJhcnkgbGliICA9IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKTsKLQkJCQkJb3duZXIuc2V0Q3VycmVudEJhc2VMaWIobGliKTsKLQkJCQl9IGNhdGNoIChUaHJvd2FibGUgZSkgewotCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JCQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHJpdmF0ZSBib29sZWFuIHNlbGVjdGFibGUoRWxlbWVudERpZmZUcmVlIG5vZGUpIHsKLQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50KSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJaWYgKG5vZGUuaXNPbGRPbmx5KCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlNZXRob2RFbGVtZW50IGJhc2UgPSBub2RlLmdldEJhc2VFbGVtZW50KCk7Ci0JCWlmICggKGJhc2UgaW5zdGFuY2VvZiBNZXRob2RQYWNrYWdlKSAKLQkJCQkmJiBUbmdVdGlsLmlzUm9vdEN1dG9tQ2F0ZWdvcnlQYWNrYWdlKChNZXRob2RQYWNrYWdlKWJhc2UpICkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgc2VsZWN0Tm9kZXMoRWxlbWVudERpZmZUcmVlIG5vZGUsIEFycmF5TGlzdCBzZWxlY3RlZE5vZGVzKSB7Ci0JCWlmICghIHNlbGVjdGFibGUobm9kZSkpIHsKLQkJCXJldHVybjsKLQkJfQotCQlzZWxlY3RlZE5vZGVzLmFkZChub2RlKTsKLQkJTGlzdCBjbm9kZXMgPSBub2RlLmdldENoaWxkcmVuKCk7Ci0JCWludCBzeiA9IGNub2RlcyA9PSBudWxsID8gMCA6IGNub2Rlcy5zaXplKCk7Ci0JCWZvciAoaW50IGk9MDsgaTxzejsgaSsrKSB7Ci0JCQlFbGVtZW50RGlmZlRyZWUgY25vZGUgPSAoRWxlbWVudERpZmZUcmVlKSBjbm9kZXMuZ2V0KGkpOwotCQkJc2VsZWN0Tm9kZXMoY25vZGUsIHNlbGVjdGVkTm9kZXMpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgT2JqZWN0W10gZ2V0RWxlbWVudHMoRWxlbWVudERpZmZUcmVlIHJvb3QpIHsKLQkJQXJyYXlMaXN0IHNlbGVjdGVkTm9kZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXNlbGVjdE5vZGVzKHJvb3QsIHNlbGVjdGVkTm9kZXMpOwotCQlyZXR1cm4gc2VsZWN0ZWROb2Rlcy50b0FycmF5KCk7Ci0JfQotCQotfQotCi0KLQpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0ZXIvaW1wbC90ZXN0Y29tbWFuZHMvVENJbXBvcnRQbHVnaW5zLmphdmEgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3Rlci9pbXBsL3Rlc3Rjb21tYW5kcy9UQ0ltcG9ydFBsdWdpbnMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGE3Yjg1ZS4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3Rlci9pbXBsL3Rlc3Rjb21tYW5kcy9UQ0ltcG9ydFBsdWdpbnMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5pbXBsLnRlc3Rjb21tYW5kczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcuc2VydmljZXMuUGx1Z2luSW1wb3J0RGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLnNlcnZpY2VzLlBsdWdpbkltcG9ydGluZ1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy5zZXJ2aWNlcy5QbHVnaW5JbXBvcnREYXRhLlBsdWdpbkluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuc2VydmljZXMuU2FmZVVwZGF0ZUNvbnRyb2xsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmlmYWNlLlRDRXhlUmVwbHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmltcGwuVGVzdENvbW1hbmRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0vKioKLSAqIEEgdGVzdCBjb21tYW5kIGNsYXNzCi0gKiAKLSAqIEBhdXRob3IgV2VpcGluZyBMdQotICogQHNpbmNlIDEuMAotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBUQ0ltcG9ydFBsdWdpbnMgZXh0ZW5kcyBUZXN0Q29tbWFuZEltcGwgewkJCQkJCi0JCi0JcHVibGljIHZvaWQgcGFyc2UoRWxlbWVudCBlbGVtZW50KSB7Ci0JCXN1cGVyLnBhcnNlKGVsZW1lbnQpOwotCQlzZXRBdHRyaWJ1dGUoQVRfSW1wb3J0Rm9sZGVyTmFtZSwgZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRfSW1wb3J0Rm9sZGVyTmFtZSkpOwotCX0JCi0JCi0JcHVibGljIFRDRXhlUmVwbHkgZXhlY3V0ZSgpIHsKLQkJU3RyaW5nIGltcG9ydEZvbGRlck5hbWUgPSBnZXRBdHRyaWJ1dGUoQVRfSW1wb3J0Rm9sZGVyTmFtZSk7Ci0JCQotCQlGaWxlIGZpbGUgPSBnZXRPd25lcigpLmdldEltcG9ydEZpbGUoaW1wb3J0Rm9sZGVyTmFtZSk7Ci0JCWlmIChmaWxlID09IG51bGwpIHsKLQkJCXJldHVybiBuZXcgVENFeGVSZXBseUltcGwoIkNhbiBub3QgbG9jYXRlIGltcG9ydEZvbGRlck5hbWU6ICIgKyBpbXBvcnRGb2xkZXJOYW1lLCBmYWxzZSk7Ci0JCX0KLQkJCi0JCVBsdWdpbkltcG9ydERhdGEgZGF0YSA9IG5ldyBQbHVnaW5JbXBvcnREYXRhKCk7Ci0JCWRhdGEubGxEYXRhLnNldExpYk5hbWUoaW1wb3J0Rm9sZGVyTmFtZSk7Ci0JCWRhdGEubGxEYXRhLnNldFBhcmVudEZvbGRlcihmaWxlLmdldEFic29sdXRlUGF0aCgpKTsJCQotCQlmaW5hbCBQbHVnaW5JbXBvcnRpbmdTZXJ2aWNlIGltcG9ydFNlcnZpY2UgPSBuZXcgUGx1Z2luSW1wb3J0aW5nU2VydmljZShkYXRhKTsKLQkJaW1wb3J0U2VydmljZS52YWxpZGF0ZShudWxsKTsKLQkJTGlzdCBpbXBvcnRQbHVnaW5zID0gZGF0YS5nZXRQbHVnaW5zKCk7Ci0JCWZvciAoaW50IGk9MDsgaSA8IGltcG9ydFBsdWdpbnMuc2l6ZSgpOyBpKyspIHsKLQkJCVBsdWdpbkluZm8gaW5mbyA9IChQbHVnaW5JbmZvKSBpbXBvcnRQbHVnaW5zLmdldChpKTsKLQkJCWluZm8uc2VsZWN0ZWQgPSB0cnVlOwotCQl9Ci0JCQotCQlTYWZlVXBkYXRlQ29udHJvbGxlci5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJaW1wb3J0U2VydmljZS5wZXJmb3JtSW1wb3J0KG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQkJCQlNZXRob2RMaWJyYXJ5IGxpYiAgPSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCk7Ci0JCQkJCWdldE93bmVyKCkuc2V0Q3VycmVudEJhc2VMaWIobGliKTsKLQkJCQl9IGNhdGNoIChUaHJvd2FibGUgZSkgewotCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JCQotCQlyZXR1cm4gbnVsbDsKLQl9Ci19Ci0KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdGVyL2ltcGwvdGVzdGNvbW1hbmRzL1RDSW1wb3J0WG1sLmphdmEgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3Rlci9pbXBsL3Rlc3Rjb21tYW5kcy9UQ0ltcG9ydFhtbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZTI1MjIxLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdGVyL2ltcGwvdGVzdGNvbW1hbmRzL1RDSW1wb3J0WG1sLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXIuaW1wbC50ZXN0Y29tbWFuZHM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLnhtbC5zZXJ2aWNlcy5JbXBvcnRYTUxTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnNlcnZpY2VzLlNhZmVVcGRhdGVDb250cm9sbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5pZmFjZS5UQ0V4ZVJlcGx5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5pbXBsLlRlc3RDb21tYW5kSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXIuaW1wbC5UZXN0Q29tbWFuZE1ncjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotLyoqCi0gKiBBIHRlc3QgY29tbWFuZCBjbGFzcwotICogCi0gKiBAYXV0aG9yIFdlaXBpbmcgTHUKLSAqIEBzaW5jZSAxLjAKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgVENJbXBvcnRYbWwgZXh0ZW5kcyBUZXN0Q29tbWFuZEltcGwgewkJCQkJCi0JCi0JcHVibGljIHZvaWQgcGFyc2UoRWxlbWVudCBlbGVtZW50KSB7Ci0JCXN1cGVyLnBhcnNlKGVsZW1lbnQpOwotCQlzZXRBdHRyaWJ1dGUoQVRfSW1wb3J0Rm9sZGVyTmFtZSwgZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRfSW1wb3J0Rm9sZGVyTmFtZSkpOwotCQlzZXRBdHRyaWJ1dGUoQVRfTWVyZ2UsIGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUX01lcmdlKSk7Ci0JfQkKLQkKLQlwdWJsaWMgVENFeGVSZXBseSBleGVjdXRlKCkgewotCQlmaW5hbCBUZXN0Q29tbWFuZE1nciBvd25lciA9IGdldE93bmVyKCk7Ci0JCVN0cmluZyBpbXBvcnRGb2xkZXJOYW1lID0gZ2V0QXR0cmlidXRlKEFUX0ltcG9ydEZvbGRlck5hbWUpOwotCQlib29sZWFuIG1lcmdlID0gZmFsc2U7Ci0JCVN0cmluZyBzdHIgPSBnZXRBdHRyaWJ1dGUoQVRfTWVyZ2UpOwotCQlpZiAoc3RyICE9IG51bGwgJiYgc3RyLmVxdWFsc0lnbm9yZUNhc2UoInRydWUiKSkgewotCQkJbWVyZ2UgPSBmYWxzZTsKLQkJfQotCQkKLQkJRmlsZSBmaWxlMCA9IG93bmVyLmdldEltcG9ydEZpbGUoaW1wb3J0Rm9sZGVyTmFtZSk7Ci0JCWlmIChmaWxlMC5pc0RpcmVjdG9yeSgpKSB7Ci0JCQlTdHJpbmcgcGF0aCA9IGZpbGUwLmdldEFic29sdXRlUGF0aCgpICsgRmlsZS5zZXBhcmF0b3IgKyBmaWxlMC5nZXROYW1lKCkgKyAiLnhtbCI7Ci0JCQlmaWxlMCA9IG5ldyBGaWxlKHBhdGgpOwotCQl9Ci0JCQotCQlmaW5hbCBGaWxlIGZpbGUgPSBmaWxlMDsKLQkJaWYgKGZpbGUgPT0gbnVsbCB8fCAhIGZpbGUuZXhpc3RzKCkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9CQkKLQkJCi0JCWZpbmFsIGJvb2xlYW4gb3ZlcndyaXRlID0gISBtZXJnZTsKLQkJU2FmZVVwZGF0ZUNvbnRyb2xsZXIuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCXRyeSB7Ci0JCQkJCUltcG9ydFhNTFNlcnZpY2UgaW1wb3J0U2VydmljZSA9IG5ldyBJbXBvcnRYTUxTZXJ2aWNlKCk7Ci0JCQkJCWltcG9ydFNlcnZpY2Uuc2V0T3ZlcndyaXRlKG92ZXJ3cml0ZSk7Ci0JCQkJCWltcG9ydFNlcnZpY2UubG9hZFhtbChmaWxlLmdldEFic29sdXRlUGF0aCgpKTsJCQkJCQotCQkJCQlpbXBvcnRTZXJ2aWNlLmRvSW1wb3J0KG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQkJCQlNZXRob2RMaWJyYXJ5IGxpYiAgPSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCk7Ci0JCQkJCW93bmVyLnNldEN1cnJlbnRCYXNlTGliKGxpYik7Ci0JCQkJfSBjYXRjaCAoVGhyb3dhYmxlIGUpIHsKLQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCQkKLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0ZXIvaW1wbC90ZXN0Y29tbWFuZHMvVENOZXdNZXRob2RDb25maWd1cmF0aW9uLmphdmEgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3Rlci9pbXBsL3Rlc3Rjb21tYW5kcy9UQ05ld01ldGhvZENvbmZpZ3VyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTQ5ZjMzNy4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3Rlci9pbXBsL3Rlc3Rjb21tYW5kcy9UQ05ld01ldGhvZENvbmZpZ3VyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5pbXBsLnRlc3Rjb21tYW5kczsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5QZXJzcGVjdGl2ZUxpc3RVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuVUlBY3Rpb25EaXNwYXRjaGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXIuaWZhY2UuVENFeGVSZXBseTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXIuaW1wbC5UZXN0Q29tbWFuZEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzLklMaWJyYXJ5UGVyc2lzdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0vKioKLSAqIEEgdGVzdCBjb21tYW5kIGNsYXNzCi0gKiAKLSAqIEBhdXRob3IgV2VpcGluZyBMdQotICogQHNpbmNlIDEuMAotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBUQ05ld01ldGhvZENvbmZpZ3VyYXRpb24gZXh0ZW5kcyBUZXN0Q29tbWFuZEltcGwgewkJCQkKLQkKLQlwcml2YXRlIExpc3QgcmVmZXJlbmNlZFBsdWdpbnM7Ci0JCi0JcHVibGljIHZvaWQgcGFyc2UoRWxlbWVudCBlbGVtZW50KSB7Ci0JCXN1cGVyLnBhcnNlKGVsZW1lbnQpOwotCQlzZXRBdHRyaWJ1dGUoQVRfTmFtZSwgZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRfTmFtZSkpOwotCQlzZXRBdHRyaWJ1dGUoQVRfQnJpZWZEZXNjcmlwdGlvbiwgZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRfQnJpZWZEZXNjcmlwdGlvbikpOwotCX0JCi0JCi0JcHVibGljIFRDRXhlUmVwbHkgZXhlY3V0ZSgpIHsKLQkJCi0JCVN0cmluZyBuYW1lID0gZ2V0QXR0cmlidXRlKEFUX05hbWUpOwotCQlTdHJpbmcgYnJpZWZEZXNjcmlwdGlvbiA9IGdldEF0dHJpYnV0ZShBVF9CcmllZkRlc2NyaXB0aW9uKTsKLQkJCi0JCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gbnVsbDsKLQkJCi0JCW5hbWUgPSBuYW1lLnRyaW0oKTsKLQkJaWYgKG5hbWUgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQljb25maWcgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJCQkuY3JlYXRlTWV0aG9kQ29uZmlndXJhdGlvbigKLQkJCQkJCQkJbmFtZSwKLQkJCQkJCQkJTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKQotCQkJCQkJCQkJCS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpKTsKLQkJCQljb25maWcuc2V0QnJpZWZEZXNjcmlwdGlvbihicmllZkRlc2NyaXB0aW9uKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQkJfQotCi0JCWlmICghUGVyc3BlY3RpdmVMaXN0VXRpbC5pc0F1dGhvcmluZ1BlcnNwZWN0aXZlKCkpIHsKLQkJCVVJQWN0aW9uRGlzcGF0Y2hlci5vcGVuQXV0aG9yaW5nUGVyc3BlY3RpdmUoKTsKLQkJfQotCQlJTGlicmFyeVBlcnNpc3Rlci5GYWlsU2FmZU1ldGhvZExpYnJhcnlQZXJzaXN0ZXIgcGVyc2lzdGVyID0gTGlicmFyeVNlcnZpY2VVdGlsLmdldEN1cnJlbnRQZXJzaXN0ZXIoKS5nZXRGYWlsU2FmZVBlcnNpc3RlcigpOwotCQl0cnkgewotCQkJcGVyc2lzdGVyLnNhdmUoY29uZmlnKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0JCQotCQkKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdGVyL2ltcGwvdGVzdGNvbW1hbmRzL1RDTmV3TWV0aG9kRWxlbWVudC5qYXZhIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0ZXIvaW1wbC90ZXN0Y29tbWFuZHMvVENOZXdNZXRob2RFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjZDNlMzAuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0ZXIvaW1wbC90ZXN0Y29tbWFuZHMvVENOZXdNZXRob2RFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmltcGwudGVzdGNvbW1hbmRzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQWJzdHJhY3RPdmVycmlkZWFibGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXIuVGVzdGVyT3V0cHV0VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXIuaWZhY2UuVENFeGVSZXBseTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXIuaW1wbC5UZXN0Q29tbWFuZEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzLklMaWJyYXJ5UGVyc2lzdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ2FwYWJpbGl0eVBhdHRlcm47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcnlQcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0vKioKLSAqIEEgdGVzdCBjb21tYW5kIGNsYXNzCi0gKiAKLSAqIEBhdXRob3IgV2VpcGluZyBMdQotICogQHNpbmNlIDEuMAotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBUQ05ld01ldGhvZEVsZW1lbnQgZXh0ZW5kcyBUZXN0Q29tbWFuZEltcGwgewkJCQkKLQkKLQlwcml2YXRlIHN0YXRpYyBNYXAgdHlwZUNsYXNzTWFwID0gbmV3IEhhc2hNYXAoKTsJCi0Jc3RhdGljIHsKLQkJVW1hRmFjdG9yeSB1ZiA9IFVtYUZhY3RvcnkuZUlOU1RBTkNFOwotCQl0eXBlQ2xhc3NNYXAucHV0KCJNZXRob2RQbHVnaW4iLCB1Zi5jcmVhdGVNZXRob2RQbHVnaW4oKS5lQ2xhc3MoKSk7Ci0JCXR5cGVDbGFzc01hcC5wdXQoIk1ldGhvZENvbmZpZ3VyYXRpb24iLCB1Zi5jcmVhdGVNZXRob2RDb25maWd1cmF0aW9uKCkuZUNsYXNzKCkpOwotCQl0eXBlQ2xhc3NNYXAucHV0KCJDb250ZW50UGFja2FnZSIsIHVmLmNyZWF0ZUNvbnRlbnRQYWNrYWdlKCkuZUNsYXNzKCkpOwotCQl0eXBlQ2xhc3NNYXAucHV0KCJSb2xlIiwgdWYuY3JlYXRlUm9sZSgpLmVDbGFzcygpKTsKLQkJdHlwZUNsYXNzTWFwLnB1dCgiVGFzayIsIHVmLmNyZWF0ZVRhc2soKS5lQ2xhc3MoKSk7Ci0JCXR5cGVDbGFzc01hcC5wdXQoIkFydGlmYWN0IiwgdWYuY3JlYXRlQXJ0aWZhY3QoKS5lQ2xhc3MoKSk7Ci0JCXR5cGVDbGFzc01hcC5wdXQoIkRlbGl2ZXJhYmxlIiwgdWYuY3JlYXRlRGVsaXZlcmFibGUoKS5lQ2xhc3MoKSk7Ci0JCXR5cGVDbGFzc01hcC5wdXQoIk91dGNvbWUiLCB1Zi5jcmVhdGVPdXRjb21lKCkuZUNsYXNzKCkpOwotCQl0eXBlQ2xhc3NNYXAucHV0KCJDb25jZXB0IiwgdWYuY3JlYXRlQ29uY2VwdCgpLmVDbGFzcygpKTsKLQkJdHlwZUNsYXNzTWFwLnB1dCgiQ2hlY2tsaXN0IiwgdWYuY3JlYXRlQ2hlY2tsaXN0KCkuZUNsYXNzKCkpOwotCQl0eXBlQ2xhc3NNYXAucHV0KCJFeGFtcGxlIiwgdWYuY3JlYXRlRXhhbXBsZSgpLmVDbGFzcygpKTsKLQkJdHlwZUNsYXNzTWFwLnB1dCgiR3VpZGVsaW5lIiwgdWYuY3JlYXRlR3VpZGVsaW5lKCkuZUNsYXNzKCkpOwotCQl0eXBlQ2xhc3NNYXAucHV0KCJSZXBvcnQiLCB1Zi5jcmVhdGVSZXBvcnQoKS5lQ2xhc3MoKSk7Ci0JCXR5cGVDbGFzc01hcC5wdXQoIlRlbXBsYXRlIiwgdWYuY3JlYXRlVGVtcGxhdGUoKS5lQ2xhc3MoKSk7Ci0JCXR5cGVDbGFzc01hcC5wdXQoIlN1cHBvcnRpbmdNYXRlcmlhbCIsIHVmLmNyZWF0ZVN1cHBvcnRpbmdNYXRlcmlhbCgpLmVDbGFzcygpKTsKLQkJdHlwZUNsYXNzTWFwLnB1dCgiVG9vbE1lbnRvciIsIHVmLmNyZWF0ZVRvb2xNZW50b3IoKS5lQ2xhc3MoKSk7Ci0JCXR5cGVDbGFzc01hcC5wdXQoIldoaXRlcGFwZXIiLCB1Zi5jcmVhdGVXaGl0ZXBhcGVyKCkuZUNsYXNzKCkpOwotCQl0eXBlQ2xhc3NNYXAucHV0KCJQcmFjdGljZSIsIHVmLmNyZWF0ZVByYWN0aWNlKCkuZUNsYXNzKCkpOwotCQl0eXBlQ2xhc3NNYXAucHV0KCJSZXVzYWJsZUFzc2V0IiwgdWYuY3JlYXRlUmV1c2FibGVBc3NldCgpLmVDbGFzcygpKTsKLQkJdHlwZUNsYXNzTWFwLnB1dCgiUm9hZG1hcCIsIHVmLmNyZWF0ZVJvYWRtYXAoKS5lQ2xhc3MoKSk7Ci0JCXR5cGVDbGFzc01hcC5wdXQoIlRlcm1EZWZpbml0aW9uIiwgdWYuY3JlYXRlVGVybURlZmluaXRpb24oKS5lQ2xhc3MoKSk7Ci0JCQkJCi0JCXR5cGVDbGFzc01hcC5wdXQoIkRpc2NpcGxpbmUiLCB1Zi5jcmVhdGVEaXNjaXBsaW5lKCkuZUNsYXNzKCkpOwotCQl0eXBlQ2xhc3NNYXAucHV0KCJEaXNjaXBsaW5lR3JvdXBpbmciLCB1Zi5jcmVhdGVEaXNjaXBsaW5lR3JvdXBpbmcoKS5lQ2xhc3MoKSk7Ci0JCXR5cGVDbGFzc01hcC5wdXQoIkRvbWFpbiIsIHVmLmNyZWF0ZURvbWFpbigpLmVDbGFzcygpKTsJCQotCQl0eXBlQ2xhc3NNYXAucHV0KCJXb3JrUHJvZHVjdFR5cGUiLCB1Zi5jcmVhdGVXb3JrUHJvZHVjdFR5cGUoKS5lQ2xhc3MoKSk7CQkKLQkJdHlwZUNsYXNzTWFwLnB1dCgiUm9sZVNldCIsIHVmLmNyZWF0ZVJvbGVTZXQoKS5lQ2xhc3MoKSk7Ci0JCXR5cGVDbGFzc01hcC5wdXQoIlJvbGVTZXRHcm91cGluZyIsIHVmLmNyZWF0ZVJvbGVTZXRHcm91cGluZygpLmVDbGFzcygpKTsKLQkJdHlwZUNsYXNzTWFwLnB1dCgiVG9vbCIsIHVmLmNyZWF0ZVRvb2woKS5lQ2xhc3MoKSk7Ci0JCXR5cGVDbGFzc01hcC5wdXQoIkN1c3RvbUNhdGVnb3J5IiwgdWYuY3JlYXRlQ3VzdG9tQ2F0ZWdvcnkoKS5lQ2xhc3MoKSk7Ci0JCQotCQl0eXBlQ2xhc3NNYXAucHV0KCJQcm9jZXNzUGFja2FnZSIsIHVmLmNyZWF0ZVByb2Nlc3NQYWNrYWdlKCkuZUNsYXNzKCkpOwotCQl0eXBlQ2xhc3NNYXAucHV0KCJBY3Rpdml0eSIsIHVmLmNyZWF0ZUFjdGl2aXR5KCkuZUNsYXNzKCkpOwotCQl0eXBlQ2xhc3NNYXAucHV0KCJQaGFzZSIsIHVmLmNyZWF0ZVBoYXNlKCkuZUNsYXNzKCkpOwotCQl0eXBlQ2xhc3NNYXAucHV0KCJJdGVyYXRpb24iLCB1Zi5jcmVhdGVJdGVyYXRpb24oKS5lQ2xhc3MoKSk7CQkKLQkJdHlwZUNsYXNzTWFwLnB1dCgiQ2FwYWJpbGl0eVBhdHRlcm4iLCB1Zi5jcmVhdGVDYXBhYmlsaXR5UGF0dGVybigpLmVDbGFzcygpKTsKLQkJdHlwZUNsYXNzTWFwLnB1dCgiRGVsaXZlcnlQcm9jZXNzIiwgdWYuY3JlYXRlRGVsaXZlcnlQcm9jZXNzKCkuZUNsYXNzKCkpOwotCQl0eXBlQ2xhc3NNYXAucHV0KCJUYXNrRGVzY3JpcHRvciIsIHVmLmNyZWF0ZVRhc2tEZXNjcmlwdG9yKCkuZUNsYXNzKCkpOwotCQkKLQl9Ci0JCi0JcHJpdmF0ZSBUZXN0Q29tbWFuZEltcGwgZGVsZWdhdGU7Ci0JCQotCXB1YmxpYyB2b2lkIHBhcnNlKEVsZW1lbnQgZWxlbWVudCkgewotCQlzdXBlci5wYXJzZShlbGVtZW50KTsKLQkJaWYgKGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJ0eXBlIikuZXF1YWxzKCJNZXRob2RQbHVnaW4iKSkgewotCQkJZGVsZWdhdGUgPSBuZXcgVENOZXdNZXRob2RQbHVnaW4oKTsKLQkJCWRlbGVnYXRlLnNldE93bmVyKGdldE93bmVyKCkpOwotCQkJZGVsZWdhdGUucGFyc2UoZWxlbWVudCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCXN1cGVyLnBhcnNlKGVsZW1lbnQpOwotCQlzZXRBdHRyaWJ1dGUoQVRfVHlwZSwgZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRfVHlwZSkpOwotCQlzZXRBdHRyaWJ1dGUoQVRfTmFtZSwgZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRfTmFtZSkpOwotCQlzZXRBdHRyaWJ1dGUoQVRfUGFyZW50UGF0aCwgZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRfUGFyZW50UGF0aCkpOwotCX0JCi0JCi0JcHVibGljIFRDRXhlUmVwbHkgZXhlY3V0ZSgpIHsKLQkJaWYgKGRlbGVnYXRlICE9IG51bGwpIHsKLQkJCXJldHVybiBkZWxlZ2F0ZS5leGVjdXRlKCk7Ci0JCX0KLQotCQlTdHJpbmcgdHlwZSA9IGdldEF0dHJpYnV0ZShBVF9UeXBlKTsKLQkJU3RyaW5nIG5hbWUgPSBnZXRBdHRyaWJ1dGUoQVRfTmFtZSk7Ci0JCVN0cmluZyBwYXJlbnRQYXRoID0gZ2V0QXR0cmlidXRlKEFUX1BhcmVudFBhdGgpOwotCQkKLQkJRUNsYXNzIGVDbGFzcyA9IGdldEVDbGFzcyh0eXBlKTsKLQkJTWV0aG9kRWxlbWVudCBtZSA9IChNZXRob2RFbGVtZW50KSBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGUoZUNsYXNzKTsKLQkJbWUuc2V0TmFtZShuYW1lKTsKLQkJbWUuc2V0R3VpZChFY29yZVV0aWwuZ2VuZXJhdGVVVUlEKCkpOwotCQlUQ0V4ZVJlcGx5IHJlcGx5ID0gYWRkVG9MaWIocGFyZW50UGF0aCwgbWUpOwotCQlpZiAocmVwbHkgIT0gbnVsbCAmJiAhcmVwbHkucGFzc2luZygpKSB7Ci0JCQlyZXR1cm4gcmVwbHk7Ci0JCX0KLQkJcmV0dXJuIGV4ZWN1dGVFZGl0KG5hbWUsIHBhcmVudFBhdGgpOwotCX0KLQotCXByaXZhdGUgVENFeGVSZXBseSBleGVjdXRlRWRpdChTdHJpbmcgbmFtZSwgU3RyaW5nIHBhcmVudFBhdGgpIHsJCQotCQkvL1RvIGRvOiBjaGVjayB0byBzZWUgaWYgZWRpdCBpcyBuZWVkZWQuIFJldHVybiBpZiBub3QgbmVlZGVkLgotCQkKLQkJVGVzdENvbW1hbmRJbXBsIGVkaXQgPSBuZXcgVENFZGl0TWV0aG9kRWxlbWVudCgpOwotCQllZGl0LnNldE93bmVyKGdldE93bmVyKCkpOwotCQllZGl0LnBhcnNlKGdldEVsZW1lbnQoKSk7Ci0JCVN0cmluZyBwYXRoID0gcGFyZW50UGF0aCA9PSBudWxsIHx8IHBhcmVudFBhdGgubGVuZ3RoKCkgPT0gMCA/IG5hbWUgIDogcGFyZW50UGF0aCArICIvIiArIG5hbWU7CQkKLQkJZWRpdC5yZW1vdmVBdHRyaWJ1dGUoQVRfTmFtZSk7Ci0JCWVkaXQucmVtb3ZlQXR0cmlidXRlKEFUX1BhcmVudFBhdGgpOwotCQllZGl0LnNldEF0dHJpYnV0ZShBVF9QYXRoLCBwYXRoKTsKLQkJCi0JCXJldHVybiBlZGl0LmV4ZWN1dGUoKTsKLQl9Ci0KLQlwcml2YXRlIFRDRXhlUmVwbHkgYWRkVG9MaWIoU3RyaW5nIHBhcmVudFBhdGgsIE1ldGhvZEVsZW1lbnQgbWUpIHsKLQkJaWYgKG1lIGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudCkgewotCQkJcmV0dXJuIGFkZFByb2Nlc3NFbGVtZW50VG9MaWIocGFyZW50UGF0aCwgKFByb2Nlc3NFbGVtZW50KSBtZSk7Ci0JCX0KLQkJTWV0aG9kTGlicmFyeSBjdXJyTGliID0gZ2V0T3duZXIoKS5nZXRDdXJyZW50QmFzZUxpYigpOwotCQlNZXRob2RFbGVtZW50IHBhcmVudE1lID0gVGVzdGVyT3V0cHV0VXRpbC5nZXRNZXRob2RFbGVtZW50KGN1cnJMaWIsIHBhcmVudFBhdGgpOwotCQlpZiAocGFyZW50TWUgPT0gbnVsbCkgewotCQkJcmV0dXJuIG5ldyBUQ0V4ZVJlcGx5SW1wbCgicGFyZW50TWUgPT0gbnVsbCIsIGZhbHNlKTsKLQkJfQkJCi0JCWFkZFRvUGFyZW50KG1lLCBwYXJlbnRNZSk7Ci0KLQkJc2F2ZShtZSk7Ci0JCS8vc2F2ZShwYXJlbnRNZSk7Ci0JCQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHJpdmF0ZSBUQ0V4ZVJlcGx5IGFkZFByb2Nlc3NFbGVtZW50VG9MaWIoU3RyaW5nIHBhcmVudFBhdGgsIFByb2Nlc3NFbGVtZW50IHBlKSB7Ci0JCU1ldGhvZExpYnJhcnkgY3VyckxpYiA9IGdldE93bmVyKCkuZ2V0Q3VycmVudEJhc2VMaWIoKTsKLQkJUHJvY2Vzc1BhY2thZ2UgcGFyZW50TWUgPSBUZXN0ZXJPdXRwdXRVdGlsLmdldFByb2Nlc3NFbGVtZW50UGFyZW50KGN1cnJMaWIsIHBhcmVudFBhdGgpOwotCQlpZiAocGFyZW50TWUgPT0gbnVsbCkgewotCQkJcmV0dXJuIG5ldyBUQ0V4ZVJlcGx5SW1wbCgicGFyZW50TWUgPT0gbnVsbCIsIGZhbHNlKTsKLQkJfQotCQlpZiAocGUgaW5zdGFuY2VvZiBDYXBhYmlsaXR5UGF0dGVybiB8fCBwZSBpbnN0YW5jZW9mIERlbGl2ZXJ5UHJvY2VzcykgewkJCQotCi0JCQlQcm9jZXNzQ29tcG9uZW50IHBjID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUHJvY2Vzc0NvbXBvbmVudCgpOwotCQkJcGMuc2V0R3VpZChFY29yZVV0aWwuZ2VuZXJhdGVVVUlEKCkpOwotCQkJcGMuc2V0TmFtZShwZS5nZXROYW1lKCkpOwotCQkJcGFyZW50TWUuZ2V0Q2hpbGRQYWNrYWdlcygpLmFkZChwYyk7Ci0JCQlwYy5zZXRQcm9jZXNzKChvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3MpIHBlKTsJCQkKLQkJCWFkZFRvUGFyZW50KHBlLCBwYyk7Ci0JCQkKLQkJfSBlbHNlIGlmIChwZSBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnQpIHsKLQkJCUJyZWFrZG93bkVsZW1lbnQgYmUgPSAoQnJlYWtkb3duRWxlbWVudCkgcGU7Ci0JCQlQcm9jZXNzUGFja2FnZSBwa2cgPSBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQcm9jZXNzUGFja2FnZSgpOwotCQkJcGtnLnNldE5hbWUocGUuZ2V0TmFtZSgpKTsKLQkJCXBhcmVudE1lLmdldENoaWxkUGFja2FnZXMoKS5hZGQocGtnKTs7Ci0JCQlhZGRUb1BhcmVudChwZSwgcGtnKTsKLQkJCQotCQkJQWN0aXZpdHkgcGFyZW50QWN0ID0gcGFyZW50TWUgaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50ID8gCi0JCQkJCSgoUHJvY2Vzc0NvbXBvbmVudCkgcGFyZW50TWUpLmdldFByb2Nlc3MoKSA6Ci0JCQkJCShBY3Rpdml0eSkgcGFyZW50TWUuZ2V0UHJvY2Vzc0VsZW1lbnRzKCkuZ2V0KDApOwotCQkJcGFyZW50QWN0LmdldEJyZWFrZG93bkVsZW1lbnRzKCkuYWRkKGJlKTsKLQkJfQotCi0JCXNhdmUocGFyZW50TWUpOwotCQkKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQkKLQotCXByaXZhdGUgdm9pZCBhZGRUb1BhcmVudChNZXRob2RFbGVtZW50IG1lLCBNZXRob2RFbGVtZW50IHBhcmVudE1lKSB7Ci0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gZ2V0Q29udGFpbm1lbnRGZWF0dXJlKHBhcmVudE1lLCBtZSk7Ci0JCWlmIChmZWF0dXJlID09IG51bGwpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiXG5XYXJuaW5nOiBjb250YWlubWVudCBmZWF0dXJlIG5vdCByZWdpc3RlcmVkISIpOwotCQkJU3lzdGVtLm91dC5wcmludGxuKCAgIldhcm5pbmc6IHBhcmVudE1lOiAiICsgcGFyZW50TWUpOwotCQkJU3lzdGVtLm91dC5wcmludGxuKCAgIldhcm5pbmc6ICAgICAgIG1lOiAiICsgbWUpOwotCQl9IGVsc2UgaWYgKGZlYXR1cmUuaXNNYW55KCkpIHsKLQkJCUVMaXN0IGVsaXN0ID0gQWJzdHJhY3RPdmVycmlkZWFibGVDb21tYW5kLmdldE93bmVyTGlzdChwYXJlbnRNZSwgZmVhdHVyZSk7IAotCQkJTGlzdCBjID0gbmV3IEFycmF5TGlzdCgpOwotCQkJYy5hZGQobWUpOwkJCi0JCQllbGlzdC5hZGRBbGwoYyk7Ci0JCX0gZWxzZSB7Ci0JCQlwYXJlbnRNZS5lU2V0KGZlYXR1cmUsIG1lKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgRUNsYXNzIGdldEVDbGFzcyhTdHJpbmcgdHlwZSkgewotCQlFQ2xhc3MgcmV0ID0gKEVDbGFzcykgdHlwZUNsYXNzTWFwLmdldCh0eXBlKTsKLQkJaWYgKHJldCA9PSBudWxsKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIlxuV2FybmluZzogXCIiICsgdHlwZSArIAotCQkJCQkiXCIgaXMgbm90IHJlZ2lzdGVyZWQgaW4gXCJ0eXBlQ2xhc3NNYXBcIiEiKTsKLQkJfQotCQlyZXR1cm4gcmV0OwkJCi0JfQotCQotCXByaXZhdGUgRVN0cnVjdHVyYWxGZWF0dXJlIGdldENvbnRhaW5tZW50RmVhdHVyZShFT2JqZWN0IG93bmVyLCBFT2JqZWN0IGVvYmopIHsKLQkJVW1hUGFja2FnZSB1cCA9IFVtYVBhY2thZ2UuZUlOU1RBTkNFOwotCQkKLQkJaWYgKG93bmVyIGluc3RhbmNlb2YgTWV0aG9kTGlicmFyeSkgewotCQkJaWYgKGVvYmogaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pIHsKLQkJCQlyZXR1cm4gdXAuZ2V0TWV0aG9kTGlicmFyeV9NZXRob2RQbHVnaW5zKCk7Ci0JCQl9Ci0JCQlpZiAoZW9iaiBpbnN0YW5jZW9mIE1ldGhvZENvbmZpZ3VyYXRpb24pIHsKLQkJCQlyZXR1cm4gdXAuZ2V0TWV0aG9kTGlicmFyeV9QcmVkZWZpbmVkQ29uZmlndXJhdGlvbnMoKTsKLQkJCX0KLQkJfQkJCi0JCQotCQlpZiAob3duZXIgaW5zdGFuY2VvZiBDb250ZW50UGFja2FnZSkgewotCQkJaWYgKGVvYmogaW5zdGFuY2VvZiBDb250ZW50RWxlbWVudCkgewotCQkJCXJldHVybiB1cC5nZXRDb250ZW50UGFja2FnZV9Db250ZW50RWxlbWVudHMoKTsKLQkJCX0KLQkJfQotCQkKLQkJaWYgKG93bmVyIGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkgewotCQkJaWYgKGVvYmogaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3MpIHsKLQkJCQlyZXR1cm4gdXAuZ2V0UHJvY2Vzc0NvbXBvbmVudF9Qcm9jZXNzKCk7Ci0JCQl9Ci0JCX0KLQkJCQkKLQkJaWYgKG93bmVyIGluc3RhbmNlb2YgUHJvY2Vzc1BhY2thZ2UpIHsKLQkJCWlmIChlb2JqIGluc3RhbmNlb2YgUHJvY2Vzc0VsZW1lbnQpIHsKLQkJCQlyZXR1cm4gdXAuZ2V0UHJvY2Vzc1BhY2thZ2VfUHJvY2Vzc0VsZW1lbnRzKCk7Ci0JCQl9Ci0JCX0KLQkJCi0JCWlmIChvd25lciBpbnN0YW5jZW9mIE1ldGhvZFBhY2thZ2UpIHsKLQkJCWlmIChlb2JqIGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UgfHwKLQkJCQllb2JqIGluc3RhbmNlb2YgUHJvY2Vzc1BhY2thZ2UJKSB7Ci0JCQkJcmV0dXJuIHVwLmdldE1ldGhvZFBhY2thZ2VfQ2hpbGRQYWNrYWdlcygpOwotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2F2ZShNZXRob2RFbGVtZW50IGVsZW1lbnQpIHsKLQkJZmluYWwgSUxpYnJhcnlQZXJzaXN0ZXIuRmFpbFNhZmVNZXRob2RMaWJyYXJ5UGVyc2lzdGVyIHBlcnNpc3RlciA9IExpYnJhcnlTZXJ2aWNlVXRpbAotCQkJCS5nZXRQZXJzaXN0ZXJGb3IoZWxlbWVudC5lUmVzb3VyY2UoKSkuZ2V0RmFpbFNhZmVQZXJzaXN0ZXIoKTsKLQkJZmluYWwgUmVzb3VyY2UgcmVzID0gZWxlbWVudC5lUmVzb3VyY2UoKTsKLQkJRGlzcGxheS5nZXREZWZhdWx0KCkuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCXRyeSB7Ci0JCQkJCXBlcnNpc3Rlci5zYXZlKHJlcyk7Ci0JCQkJCXBlcnNpc3Rlci5jb21taXQoKTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JfQotCQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdGVyL2ltcGwvdGVzdGNvbW1hbmRzL1RDTmV3TWV0aG9kUGx1Z2luLmphdmEgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3Rlci9pbXBsL3Rlc3Rjb21tYW5kcy9UQ05ld01ldGhvZFBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNWZhNzk2Li4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdGVyL2ltcGwvdGVzdGNvbW1hbmRzL1RDTmV3TWV0aG9kUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmltcGwudGVzdGNvbW1hbmRzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuU3RyVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5JTGlicmFyeU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLkxpYnJhcnlUZXN0U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXIuaWZhY2UuVENFeGVSZXBseTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXIuaW1wbC5UZXN0Q29tbWFuZEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5MaWJyYXJ5VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLk1vZGVsU3RvcmFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hRmFjdG9yeTsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotCi0vKioKLSAqIEEgdGVzdCBjb21tYW5kIGNsYXNzCi0gKiAKLSAqIEBhdXRob3IgV2VpcGluZyBMdQotICogQHNpbmNlIDEuMAotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBUQ05ld01ldGhvZFBsdWdpbiBleHRlbmRzIFRlc3RDb21tYW5kSW1wbCB7CQkJCQotCQotCXByaXZhdGUgTGlzdCByZWZlcmVuY2VkUGx1Z2luczsKLQkKLQlwdWJsaWMgdm9pZCBwYXJzZShFbGVtZW50IGVsZW1lbnQpIHsKLQkJc3VwZXIucGFyc2UoZWxlbWVudCk7Ci0JCXNldEF0dHJpYnV0ZShBVF9OYW1lLCBlbGVtZW50LmdldEF0dHJpYnV0ZShBVF9OYW1lKSk7Ci0JCXNldEF0dHJpYnV0ZShBVF9CcmllZkRlc2NyaXB0aW9uLCBlbGVtZW50LmdldEF0dHJpYnV0ZShBVF9CcmllZkRlc2NyaXB0aW9uKSk7Ci0JCXNldEF0dHJpYnV0ZShBVF9BdXRob3JzLCBlbGVtZW50LmdldEF0dHJpYnV0ZShBVF9BdXRob3JzKSk7Ci0JCXBhcnNlQ2hpbGRyZW4oZWxlbWVudCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHBhcnNlQ2hpbGRyZW4oRWxlbWVudCBlbGVtZW50KSB7Ci0JCU5vZGVMaXN0IGNub2RlcyA9IGVsZW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoVlRfYmFzZXMpOwotCQlpZiAoY25vZGVzID09IG51bGwgfHwgY25vZGVzLmdldExlbmd0aCgpID09IDApIHsKLQkJCXJldHVybjsKLQkJfQotCQlFbGVtZW50IGNFbGVtZW50ID0gKEVsZW1lbnQpIGNub2Rlcy5pdGVtKDApOwotCQljbm9kZXMgPSBjRWxlbWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZShWVF9WYWx1ZSk7CQotCQlpZiAoY25vZGVzID09IG51bGwgfHwgY25vZGVzLmdldExlbmd0aCgpID09IDApIHsKLQkJCXJldHVybjsKLQkJfQotCQlyZWZlcmVuY2VkUGx1Z2lucyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChpbnQgaT0wOyBpPGNub2Rlcy5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCQlFbGVtZW50IHZFbGVtID0gKEVsZW1lbnQpIGNub2Rlcy5pdGVtKGkpOwotCQkJU3RyaW5nIHZhbHVlID0gdkVsZW0uZ2V0Rmlyc3RDaGlsZCgpLmdldE5vZGVWYWx1ZSgpOwotCQkJcmVmZXJlbmNlZFBsdWdpbnMuYWRkKHZhbHVlKTsKLQkJfQkJCi0JfQotCQotCXB1YmxpYyBUQ0V4ZVJlcGx5IGV4ZWN1dGUoKSB7Ci0JCQotCQlTdHJpbmcgbmFtZSA9IGdldEF0dHJpYnV0ZShBVF9OYW1lKTsKLQkJU3RyaW5nIGJyaWVmRGVzY3JpcHRpb24gPSBnZXRBdHRyaWJ1dGUoQVRfQnJpZWZEZXNjcmlwdGlvbik7Ci0JCVN0cmluZyBhdXRob3JzID0gZ2V0QXR0cmlidXRlKEFUX0F1dGhvcnMpOwotCQkKLQkJaWYgKG5hbWUgPT0gbnVsbCB8fCBuYW1lLmxlbmd0aCgpID09IDApIHsKLQkJCXJldHVybiBuZXcgVENFeGVSZXBseUltcGwoIkVtcHR5IHBsdWdpbiBuYW1lIiwgZmFsc2UpOwotCQl9Ci0JCVN0cmluZyBtc2cgPSBMaWJyYXJ5VXRpbC5jaGVja1BsdWdpbk5hbWUobnVsbCwgbmFtZSk7Ci0JCWlmIChtc2cgIT0gbnVsbCkgewotCQkJcmV0dXJuIG5ldyBUQ0V4ZVJlcGx5SW1wbChtc2csIGZhbHNlKTsKLQkJfQotCQkJCQotCQl0cnkgewotCQkJTWV0aG9kTGlicmFyeSBjdXJyTGliID0gZ2V0T3duZXIoKS5nZXRDdXJyZW50QmFzZUxpYigpOwotCQkJTGlzdCBwbHVnaW5zID0gY3VyckxpYi5nZXRNZXRob2RQbHVnaW5zKCk7Ci0JCQkKLQkJCS8vIENyZWF0ZSB0aGUgbWV0aG9kIHBsdWctaW4gYW5kIGFkZCBpdCB0byB0aGUgY3VycmVudCBtZXRob2QKLQkJCS8vIGxpYnJhcnkuCi0JCQlmaW5hbCBNZXRob2RQbHVnaW4gbmV3UGx1Z2luID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlTWV0aG9kUGx1Z2luKCk7Ci0JCQluZXdQbHVnaW4uc2V0TmFtZShTdHJVdGlsLm1ha2VWYWxpZEZpbGVOYW1lKG5hbWUpKTsKLQkJCW5ld1BsdWdpbi5zZXRCcmllZkRlc2NyaXB0aW9uKGJyaWVmRGVzY3JpcHRpb24pOwotCQkJbmV3UGx1Z2luLnNldEF1dGhvcnMoYXV0aG9ycyk7Ci0JCQkKLQkJCWludCBzeiA9IHJlZmVyZW5jZWRQbHVnaW5zID09IG51bGwgPyAwIDogcmVmZXJlbmNlZFBsdWdpbnMuc2l6ZSgpOwotCQkJaWYgKHN6ID4gMCAmJiAhIHBsdWdpbnMuaXNFbXB0eSgpKSB7Ci0JCQkJZm9yIChpbnQgaT0wOyBpPHN6OyBpKyspIHsKLQkJCQkJU3RyaW5nIHJlZmVyZWROYW1lID0gKFN0cmluZykgcmVmZXJlbmNlZFBsdWdpbnMuZ2V0KGkpOwotCQkJCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gKE1ldGhvZFBsdWdpbikgTGlicmFyeVRlc3RTZXJ2aWNlLmdldEVsZW1lbnQKLQkJCQkJCShwbHVnaW5zLCByZWZlcmVkTmFtZSk7Ci0JCQkJCWlmIChwbHVnaW4gIT0gbnVsbCkgewotCQkJCQkJbmV3UGx1Z2luLmdldEJhc2VzKCkuYWRkKHBsdWdpbik7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCUlMaWJyYXJ5TWFuYWdlciBtYW5hZ2VyID0gKElMaWJyYXJ5TWFuYWdlcikgTGlicmFyeVNlcnZpY2UKLQkJCQkJLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudExpYnJhcnlNYW5hZ2VyKCk7Ci0JCQlpZiAobWFuYWdlciAhPSBudWxsKSB7Ci0JCQkJbWFuYWdlci5hZGRNZXRob2RQbHVnaW4oTW9kZWxTdG9yYWdlLmluaXRpYWxpemUobmV3UGx1Z2luKSk7Ci0JCQl9Ci0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0ZXIvaW1wbC90ZXN0Y29tbWFuZHMvVENPcGVuTGlicmFyeS5qYXZhIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0ZXIvaW1wbC90ZXN0Y29tbWFuZHMvVENPcGVuTGlicmFyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMDc1NjYzLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdGVyL2ltcGwvdGVzdGNvbW1hbmRzL1RDT3BlbkxpYnJhcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5pbXBsLnRlc3Rjb21tYW5kczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5pZmFjZS5UQ0V4ZVJlcGx5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5pbXBsLlRlc3RDb21tYW5kSW1wbDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0vKioKLSAqIEEgdGVzdCBjb21tYW5kIGNsYXNzCi0gKiAKLSAqIEBhdXRob3IgV2VpcGluZyBMdQotICogQHNpbmNlIDEuMAotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBUQ09wZW5MaWJyYXJ5IGV4dGVuZHMgVGVzdENvbW1hbmRJbXBsIHsJCQkJCi0JCi0JcHVibGljIHZvaWQgcGFyc2UoRWxlbWVudCBlbGVtZW50KSB7Ci0JCXN1cGVyLnBhcnNlKGVsZW1lbnQpOwotCQlzZXRBdHRyaWJ1dGUoQVRfTGliRm9sZGVyTmFtZSwgZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRfTGliRm9sZGVyTmFtZSkpOwotCX0JCi0JCi0JcHVibGljIFRDRXhlUmVwbHkgZXhlY3V0ZSgpIHsKLQkJU3RyaW5nIGxpYkZvbGRlck5hbWUgPSBnZXRBdHRyaWJ1dGUoQVRfTGliRm9sZGVyTmFtZSk7CQotCQlnZXRPd25lcigpLmxvYWRCYXNlTGliKGxpYkZvbGRlck5hbWUpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0ZXIvaW1wbC90ZXN0Y29tbWFuZHMvVENPdXRwdXRNZXRob2RFbGVtZW50LmphdmEgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3Rlci9pbXBsL3Rlc3Rjb21tYW5kcy9UQ091dHB1dE1ldGhvZEVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWIzMjE3Ni4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3Rlci9pbXBsL3Rlc3Rjb21tYW5kcy9UQ091dHB1dE1ldGhvZEVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxMiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXIuaW1wbC50ZXN0Y29tbWFuZHM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuc2RvLkVQcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLlhNTFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLlRlc3Rlck91dHB1dFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmlmYWNlLlRDRXhlUmVwbHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmltcGwuVGVzdENvbW1hbmRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5pbXBsLlRlc3RDb21tYW5kTWdyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLS8qKgotICogQSB0ZXN0IGNvbW1hbmQgY2xhc3MKLSAqIAotICogQGF1dGhvciBXZWlwaW5nIEx1Ci0gKiBAc2luY2UgMS4wCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFRDT3V0cHV0TWV0aG9kRWxlbWVudCBleHRlbmRzIFRlc3RDb21tYW5kSW1wbCB7Ci0KLQkvL01heSB3YW50IHRvIHVzZSBmZWF0dXJlIGNsYXNzZXMgZGlyZWN0bHkgaW5zdGVhZCBvZiBuYW1lcyBsYXRlcgotCXByaXZhdGUgc3RhdGljIFN0cmluZ1tdIGV4Y2x1ZGVkRmVhdHVyZXMgPSB7Ci0JCS8vImd1aWQiLAotCQkvLyJnVUlEcyIKLQl9OwotCQotCXByaXZhdGUgc3RhdGljIFNldCBleGNsdWRlZEZlYXR1cmVTZXQgPSBuZXcgSGFzaFNldCgpOwotCQotCXN0YXRpYyB7Ci0JCWZvciAoaW50IGk9MDsgaTxleGNsdWRlZEZlYXR1cmVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlleGNsdWRlZEZlYXR1cmVTZXQuYWRkKGV4Y2x1ZGVkRmVhdHVyZXNbaV0pOwotCQl9Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gbG9jYWxEZWJ1ZyA9IGZhbHNlOwotCVN0cmluZyBwYXRoOwotCXByaXZhdGUgRG9jdW1lbnQgZG9jOwotCXByaXZhdGUgTWFwIHN5c3RlbVBrZ01hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JcHJpdmF0ZSBFbGVtZW50IHJvb3Q7Ci0JcHJpdmF0ZSBib29sZWFuIHJlY3Vyc2l2ZSA9IHRydWU7Ci0JcHJpdmF0ZSBTdHJpbmcgdGFnTmFtZTsKLQkKLQlwdWJsaWMgdm9pZCBwYXJzZShFbGVtZW50IGVsZW1lbnQpIHsKLQkJc3VwZXIucGFyc2UoZWxlbWVudCk7Ci0JCWRvYyA9IGdldE93bmVyKCkuZ2V0T3V0cHV0RG9jdW1lbnQoKTsKLQkJLy9TdHJpbmcgdGFnTmFtZSA9IHRhZ05hbWUoKTsgbmVlZCB0byBmaXggdGFnTmFtZSgpIG1laHRvZAotCQl0YWdOYW1lID0gZWxlbWVudC5nZXRUYWdOYW1lKCk7Ci0JCQotCQlzZXRBdHRyaWJ1dGUoQVRfUGF0aCwgZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRfUGF0aCkpOwotCQlzZXRBdHRyaWJ1dGUoQVRfUmVjdXJzaXZlLCBlbGVtZW50LmdldEF0dHJpYnV0ZShBVF9SZWN1cnNpdmUpKTsKLQkJc2V0QXR0cmlidXRlKEFUX091dHB1dEZpbGVOYW1lLCBlbGVtZW50LmdldEF0dHJpYnV0ZShBVF9PdXRwdXRGaWxlTmFtZSkpOwkKLQl9CQkKLQkKLQlwdWJsaWMgVENFeGVSZXBseSBleGVjdXRlKCkgewkKLQkJcGF0aCA9IGdldEF0dHJpYnV0ZShBVF9QYXRoKTsKLQkJcmVjdXJzaXZlID0gcGFyc2VCb29sZWFuKEFUX1JlY3Vyc2l2ZSwgcmVjdXJzaXZlKTsKLQkJCi0JCU1ldGhvZExpYnJhcnkgbGliID0gZ2V0T3duZXIoKS5nZXRDdXJyZW50QmFzZUxpYigpOwotCQlyb290ID0gZG9jLmdldERvY3VtZW50RWxlbWVudCgpOwotCQkJCQotCQlpZiAodGFnTmFtZS5lcXVhbHMoVGVzdENvbW1hbmRNZ3IuVENPdXRwdXRMaWJyYXJ5KSkgewotCQkJb3V0cHV0TWV0aG9kRWxlbWVudChsaWIsIHJvb3QpOwotCQl9IGVsc2UgaWYgKHRhZ05hbWUuZXF1YWxzKFRlc3RDb21tYW5kTWdyLlRDT3V0cHV0UGx1Z2luKSkgewotCQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IFRlc3Rlck91dHB1dFV0aWwuZ2V0TWV0aG9kUGx1Z2luKGxpYiwgcGF0aCk7Ci0JCQlvdXRwdXRNZXRob2RFbGVtZW50KHBsdWdpbiwgcm9vdCk7Ci0JCX0gZWxzZSBpZiAodGFnTmFtZS5lcXVhbHMoVGVzdENvbW1hbmRNZ3IuVENPdXRwdXRDb25maWd1cmF0aW9uKSkgewotCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSBUZXN0ZXJPdXRwdXRVdGlsLmdldE1ldGhvZENvbmZpZ3VyYXRpb24obGliLCBwYXRoKTsKLQkJCW91dHB1dE1ldGhvZEVsZW1lbnQoY29uZmlnLCByb290KTsKLQkJfSBlbHNlIGlmICh0YWdOYW1lLmVxdWFscyhUZXN0Q29tbWFuZE1nci5UQ091dHB1dE1ldGhvZEVsZW1lbnQpKSB7Ci0JCQlNZXRob2RFbGVtZW50IG1lID0gVGVzdGVyT3V0cHV0VXRpbC5nZXRNZXRob2RFbGVtZW50KGxpYiwgcGF0aCk7Ci0JCQlvdXRwdXRNZXRob2RFbGVtZW50KG1lLCByb290KTsKLQkJfSBlbHNlIHsKLQkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCQl9Ci0KLQkJb3V0cHV0VG9GaWxlKCk7CQkKLQkJCi0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgdm9pZCBvdXRwdXRUb0ZpbGUoKSB7Ci0JCVN0cmluZyBvdXRwdXRGaWxlTmFtZSA9IGdldEF0dHJpYnV0ZShBVF9PdXRwdXRGaWxlTmFtZSk7Ci0JCWlmIChvdXRwdXRGaWxlTmFtZSA9PSBudWxsIHx8IG91dHB1dEZpbGVOYW1lLmxlbmd0aCgpID09IDApIHsKLQkJCXJldHVybjsKLQkJfQotCQlTdHJpbmcgb3V0cHV0UGF0aCA9IGdldE93bmVyKCkuZ2V0T3V0cHV0UGF0aCgpOwotCQlGaWxlIGZpbGUgPSBuZXcgRmlsZShvdXRwdXRQYXRoKS5nZXRQYXJlbnRGaWxlKCk7Ci0JCW91dHB1dFBhdGggPSBmaWxlLmdldEFic29sdXRlUGF0aCgpICsgRmlsZS5zZXBhcmF0b3IgKyBvdXRwdXRGaWxlTmFtZTsKLQkJCi0JCURvY3VtZW50IG91dHB1dERvY3VtZW50ID0gZ2V0T3duZXIoKS5nZXRPdXRwdXREb2N1bWVudCgpOwotCQl0cnkgewotCQkJWE1MVXRpbC5zYXZlRG9jdW1lbnQob3V0cHV0RG9jdW1lbnQsIG91dHB1dFBhdGgpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSl7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCBvdXRwdXRNZXRob2RFbGVtZW50KE1ldGhvZEVsZW1lbnQgZWxlbWVudCwgRWxlbWVudCBwYXJlbnROb2RlKSB7CQotCQlFbGVtZW50IG5vZGUgPSBkb2MuY3JlYXRlRWxlbWVudChnZXRUeXBlKGVsZW1lbnQpKTsJCQotCQlwYXJlbnROb2RlLmFwcGVuZENoaWxkKG5vZGUpOwotCQlpZiAocGFyZW50Tm9kZSA9PSByb290KSB7Ci0JCQlub2RlLnNldEF0dHJpYnV0ZSgicGF0aCIsIHBhdGgpOwotCQl9Ci0JCW91dHB1dEZlYXR1cmVzKGVsZW1lbnQsIG5vZGUpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgb3V0cHV0UmVmZXJlbmNlKEVSZWZlcmVuY2UgZmVhdHVyZSwgTWV0aG9kRWxlbWVudCBlbGVtZW50LCBFbGVtZW50IHBhcmVudE5vZGUpIHsKLQkJRWxlbWVudCBub2RlID0gZG9jLmNyZWF0ZUVsZW1lbnQoZmVhdHVyZS5nZXROYW1lKCkpOwotCQlwYXJlbnROb2RlLmFwcGVuZENoaWxkKG5vZGUpOwotCQlub2RlLnNldEF0dHJpYnV0ZSgicGF0aCIsIFRlc3Rlck91dHB1dFV0aWwuZ2V0T3V0cHV0UGF0aChlbGVtZW50KSk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBvdXRwdXRGZWF0dXJlcyhNZXRob2RFbGVtZW50IGVsZW1lbnQsIEVsZW1lbnQgbm9kZSkgewotCQlMaXN0IHByb3BlcnRpZXMgPSBlbGVtZW50LmdldEluc3RhbmNlUHJvcGVydGllcygpOwkJCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgcHJvcGVydGllcy5zaXplKCk7IGkrKykgewotCQkJRVByb3BlcnR5IGVwID0gKEVQcm9wZXJ0eSkgcHJvcGVydGllcy5nZXQoaSk7Ci0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IGVwLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZSgpOwotCQkJaWYgKGV4Y2x1ZGVkRmVhdHVyZVNldC5jb250YWlucyhmZWF0dXJlLmdldE5hbWUoKSkpIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCU9iamVjdCB2YWx1ZSA9IGVsZW1lbnQuZUdldChmZWF0dXJlKTsKLQkJCWlmICh2YWx1ZSA9PSBudWxsKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlpZiAoZmVhdHVyZSBpbnN0YW5jZW9mIEVSZWZlcmVuY2UpIHsKLQkJCQlpZiAoISByZWN1cnNpdmUgJiYgbm9kZS5nZXRQYXJlbnROb2RlKCkgIT0gcm9vdCkgewotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJRVJlZmVyZW5jZSByZWZGZWF0dXJlID0gKEVSZWZlcmVuY2UpIGZlYXR1cmU7Ci0JCQkJaWYgKHZhbHVlIGluc3RhbmNlb2YgTGlzdCkgewotCQkJCQlvdXRwdXRMaXN0RmVhdHVyZShyZWZGZWF0dXJlLCAoTGlzdCkgdmFsdWUsIG5vZGUpOwotCQkJCX0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQkJCWlmIChyZWZGZWF0dXJlLmlzQ29udGFpbm1lbnQoKSkgewotCQkJCQkJb3V0cHV0TWV0aG9kRWxlbWVudCgoTWV0aG9kRWxlbWVudCkgdmFsdWUsIG5vZGUpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJb3V0cHV0UmVmZXJlbmNlKHJlZkZlYXR1cmUsIChNZXRob2RFbGVtZW50KSB2YWx1ZSwgbm9kZSk7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgaWYgKGxvY2FsRGVidWcpewotCQkJCQlnZXRPd25lcigpLnRyYWNlKCJXYXJuaW5nPiB2YWx1ZSBpcyBvZiBub24tb3V0cHV0IHR5cGU6ICIgKyB2YWx1ZS5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0JCQkJfQotCQkJfSBlbHNlIGlmIChmZWF0dXJlIGluc3RhbmNlb2YgRUF0dHJpYnV0ZSkgewotCQkJCW5vZGUuc2V0QXR0cmlidXRlKGZlYXR1cmUuZ2V0TmFtZSgpLCB2YWx1ZS50b1N0cmluZygpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JCQl9Ci0JCQkKLQkJfQkJCQotCX0KLQkKLQlwcml2YXRlIHZvaWQgb3V0cHV0TGlzdEZlYXR1cmUoRVJlZmVyZW5jZSBmZWF0dXJlLCBMaXN0IGxpc3QsIEVsZW1lbnQgcGFyZW50Tm9kZSkgewotCQlpbnQgc3ogPSBsaXN0ID09IG51bGwgPyAwIDogbGlzdC5zaXplKCk7Ci0JCWlmIChzeiA9PSAwKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKCEgKGxpc3QuZ2V0KDApIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkpIHsKLQkJCWdldE93bmVyKCkudHJhY2UoIldhcm5pbmc+IGxpc3QuZ2V0KDApIGlzIG9mIHR5cGU6ICIgKyBsaXN0LmdldCgwKS5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJYm9vbGVhbiBjb250YWlubWVudCA9IGZlYXR1cmUuaXNDb250YWlubWVudCgpOwotCQlmb3IgKGludCBpPTA7IGk8c3o7IGkrKykgewotCQkJTWV0aG9kRWxlbWVudCBlbGVtZW50ID0gKE1ldGhvZEVsZW1lbnQpIGxpc3QuZ2V0KGkpOwotCQkJaWYgKGVsZW1lbnQgPT0gbnVsbCkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJaWYgKGNvbnRhaW5tZW50KSB7Ci0JCQkJb3V0cHV0TWV0aG9kRWxlbWVudChlbGVtZW50LCBwYXJlbnROb2RlKTsKLQkJCX0gZWxzZSB7Ci0JCQkJb3V0cHV0UmVmZXJlbmNlKGZlYXR1cmUsIGVsZW1lbnQsIHBhcmVudE5vZGUpOwotCQkJfQotCQl9Ci0JfQkKLQkKLQlwcml2YXRlIFN0cmluZyBnZXRUeXBlKE9iamVjdCBvYmopIHsKLQkJU3RyaW5nIGNsc05hbWUgPSBvYmouZ2V0Q2xhc3MoKS5nZXROYW1lKCk7Ci0JCWludCBpeCA9IGNsc05hbWUubGFzdEluZGV4T2YoIi4iKSArIDE7Ci0JCVN0cmluZyB0eXBlID0gY2xzTmFtZS5zdWJzdHJpbmcoaXgpOwotCQlpeCA9IHR5cGUubGFzdEluZGV4T2YoIkltcGwiKTsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQgJiYgaXggKyA0ID09ICB0eXBlLmxlbmd0aCgpKSB7Ci0JCQl0eXBlID0gdHlwZS5zdWJzdHJpbmcoMCwgaXgpOwotCQl9Ci0JCXJldHVybiB0eXBlOwotCX0JCi0JCi0JCi0JCi19Ci0KLQpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0cy9BYnN0cmFjdExpYnJhcnlUZXN0Q2FzZS5qYXZhIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0cy9BYnN0cmFjdExpYnJhcnlUZXN0Q2FzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MTc1ODNjLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdHMvQWJzdHJhY3RMaWJyYXJ5VGVzdENhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2VFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pLlhNSUxpYnJhcnlVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5NdWx0aUZpbGVTYXZlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci0KLS8qKgotICogVGhlIGFic3RyYWN0IGJhc2UgY2xhc3MgZm9yIGFsbCBKVW5pdCB0ZXN0IGNhc2VzIHRoYXQgbmVlZHMgdG8gb3BlbiBhIG1ldGhvZCBsaWJyYXJ5Ci0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdExpYnJhcnlUZXN0Q2FzZSBleHRlbmRzIFRlc3RDYXNlIHsKLQotCXByb3RlY3RlZCBNZXRob2RMaWJyYXJ5IGxpYnJhcnk7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBkZWxldGVMaWJyYXJ5T25FeGl0ID0gZmFsc2U7Ci0KLQlwdWJsaWMgQWJzdHJhY3RMaWJyYXJ5VGVzdENhc2UoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2Ujc2V0VXAoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCQotCQlvcGVuTGlicmFyeSgpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3RlYXJEb3duKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlpZiAoZGVsZXRlTGlicmFyeU9uRXhpdCkgewotCQkJTGlicmFyeVRlc3RIZWxwZXIuY2xvc2VMaWJyYXJ5KCk7Ci0JCX0gZWxzZSB7Ci0JCQlMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmNsb3NlQ3VycmVudE1ldGhvZExpYnJhcnkoKTsKLQkJfQotCQlzdXBlci50ZWFyRG93bigpOwotCX0KLQotCXByb3RlY3RlZCBNZXRob2RMaWJyYXJ5IG9wZW5MaWJyYXJ5KCkgdGhyb3dzIExpYnJhcnlTZXJ2aWNlRXhjZXB0aW9uIHsKLQkJU3RyaW5nIGxpYlBhdGggPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImVwZi5saWJyYXJ5Iik7Ci0JCWlmKGxpYlBhdGggPT0gbnVsbCkgewotCQkJU3RyaW5nIHBhdGggPSBUZXN0c1BsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW5zdGFsbFBhdGgoKSArIEZpbGUuc2VwYXJhdG9yICsgIkxpYnJhcmllcyIgKyBGaWxlLnNlcGFyYXRvciArICJPcGVuVVAiOwotCQkJaWYobmV3IEZpbGUocGF0aCwgTXVsdGlGaWxlU2F2ZVV0aWwuREVGQVVMVF9MSUJSQVJZX01PREVMX0ZJTEVOQU1FKS5leGlzdHMoKSkgewotCQkJCWxpYlBhdGggPSBwYXRoOwotCQkJfQotCQl9Ci0JCWlmIChsaWJQYXRoICE9IG51bGwpIHsKLQkJCWxpYnJhcnkgPSBYTUlMaWJyYXJ5VXRpbC5vcGVuTWV0aG9kTGlicmFyeShsaWJQYXRoKTsKLQkJCUxpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuc2V0Q3VycmVudE1ldGhvZExpYnJhcnkobGlicmFyeSk7Ci0JCX0gZWxzZSB7Ci0JCQlsaWJyYXJ5ID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlVGVzdE1ldGhvZExpYnJhcnkoKTsKLQkJCWRlbGV0ZUxpYnJhcnlPbkV4aXQgPSB0cnVlOwotCQl9Ci0JCXJldHVybiBsaWJyYXJ5OwotCX0KLQotCXByb3RlY3RlZCBNZXRob2RMaWJyYXJ5IHJlb3BlbkxpYnJhcnkoKSB0aHJvd3MgTGlicmFyeVNlcnZpY2VFeGNlcHRpb24gewotCQlyZXR1cm4gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5yZW9wZW5DdXJyZW50TWV0aG9kTGlicmFyeSgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0cy9EZXBlbmRlbmN5Q2hlY2tlclRlc3QuamF2YSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdHMvRGVwZW5kZW5jeUNoZWNrZXJUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhYTE3OWYuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0cy9EZXBlbmRlbmN5Q2hlY2tlclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLkRlcGVuZGVuY3lDaGVja2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRGVwZW5kZW5jeUNoZWNrZXJUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCi0JLyoqCi0JICogQHBhcmFtIG5hbWUKLQkgKi8KLQlwdWJsaWMgRGVwZW5kZW5jeUNoZWNrZXJUZXN0KFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSNzZXRVcCgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UjdGVhckRvd24oKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JfQotCi0JLyoqCi0JICogVGVzdCBtZXRob2QgZm9yIHtAbGluayBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb24uRGVwZW5kZW5jeUNoZWNrZXIjY2hlY2tDaXJjdWxhckRlcGVuZGVuY3kob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QsIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmUsIGphdmEubGFuZy5PYmplY3QpfS4KLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0Q2hlY2tDaXJjdWxhckRlcGVuZGVuY3koKSB7Ci0JCS8qCi0JCXBsdWdpbjEgPC0gcGx1Z2luMiA8LSBwbHVnaW4zIAotCQkJCQl8Ci0JCSAgICAgICAgICAgIHYKLQkJICAgICAgICAgICBwbHVnaW40IC0+IHBsdWdpbjUJCSAgICAgICAgICAgCi0JCSovCi0JCU1ldGhvZExpYnJhcnkgbGliID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlTWV0aG9kTGlicmFyeSgpOwotCQkKLQkJTWV0aG9kUGx1Z2luIHBsdWdpbjEgPSBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVNZXRob2RQbHVnaW4oKTsKLQkJcGx1Z2luMS5zZXROYW1lKCJwbHVnaW4xIik7Ci0JCWxpYi5nZXRNZXRob2RQbHVnaW5zKCkuYWRkKHBsdWdpbjEpOwotCQkKLQkJTWV0aG9kUGx1Z2luIHBsdWdpbjIgPSBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVNZXRob2RQbHVnaW4oKTsKLQkJcGx1Z2luMi5zZXROYW1lKCJwbHVnaW4yIik7Ci0JCXBsdWdpbjIuZ2V0QmFzZXMoKS5hZGQocGx1Z2luMSk7Ci0JCWxpYi5nZXRNZXRob2RQbHVnaW5zKCkuYWRkKHBsdWdpbjIpOwotCi0JCU1ldGhvZFBsdWdpbiBwbHVnaW4zID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlTWV0aG9kUGx1Z2luKCk7Ci0JCXBsdWdpbjMuc2V0TmFtZSgicGx1Z2luMyIpOwotCQlwbHVnaW4zLmdldEJhc2VzKCkuYWRkKHBsdWdpbjIpOwotCQlsaWIuZ2V0TWV0aG9kUGx1Z2lucygpLmFkZChwbHVnaW4zKTsKLQkJCi0JCU1ldGhvZFBsdWdpbiBwbHVnaW40ID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlTWV0aG9kUGx1Z2luKCk7Ci0JCXBsdWdpbjQuc2V0TmFtZSgicGx1Z2luNCIpOwotCQlsaWIuZ2V0TWV0aG9kUGx1Z2lucygpLmFkZChwbHVnaW40KTsKLQkJCi0JCU1ldGhvZFBsdWdpbiBwbHVnaW41ID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlTWV0aG9kUGx1Z2luKCk7Ci0JCXBsdWdpbjUuc2V0TmFtZSgicGx1Z2luNSIpOwotCQlsaWIuZ2V0TWV0aG9kUGx1Z2lucygpLmFkZChwbHVnaW41KTsKLQotCQlwbHVnaW4yLmdldEJhc2VzKCkuYWRkKHBsdWdpbjQpOwotCQlwbHVnaW40LmdldEJhc2VzKCkuYWRkKHBsdWdpbjUpOwotCi0KLQkJYXNzZXJ0RmFsc2UoRGVwZW5kZW5jeUNoZWNrZXIuY2hlY2tDaXJjdWxhckRlcGVuZGVuY3kocGx1Z2luMSwgVW1hUGFja2FnZS5MaXRlcmFscy5NRVRIT0RfUExVR0lOX19CQVNFUywgcGx1Z2luMykuaXNPSygpKTsKLQkJYXNzZXJ0RmFsc2UoRGVwZW5kZW5jeUNoZWNrZXIuY2hlY2tDaXJjdWxhckRlcGVuZGVuY3kocGx1Z2luNSwgVW1hUGFja2FnZS5MaXRlcmFscy5NRVRIT0RfUExVR0lOX19CQVNFUywgcGx1Z2luMykuaXNPSygpKTsKLQkJYXNzZXJ0VHJ1ZShEZXBlbmRlbmN5Q2hlY2tlci5jaGVja0NpcmN1bGFyRGVwZW5kZW5jeShwbHVnaW41LCBVbWFQYWNrYWdlLkxpdGVyYWxzLk1FVEhPRF9QTFVHSU5fX0JBU0VTLCBwbHVnaW4xKS5pc09LKCkpOwotCQkJCi0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3RzL0xpYnJhcnlTZXJ2aWNlVGVzdC5qYXZhIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0cy9MaWJyYXJ5U2VydmljZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGRiOTIxYy4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3RzL0xpYnJhcnlTZXJ2aWNlVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5JTGlicmFyeU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5Nb2RlbFN0b3JhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotCi0vKioKLSAqIEpVbml0IHRlc3RzIGZvciB0aGUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkgcGx1Zy1pbi4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBMaWJyYXJ5U2VydmljZVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTElCUkFSWV9YTUkgPSAibGlicmFyeS54bWkiOyAvLyROT04tTkxTLTEkCQotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9YTUkgPSAicGx1Z2luLnhtaSI7IC8vJE5PTi1OTFMtMSQJCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9MSUJSQVJZXzEgPSAibGlicmFyeV8xIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfUExVR0lOXzEgPSAicGx1Z2luXzEiOyAvLyROT04tTkxTLTEkCQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgTGlicmFyeVNlcnZpY2VUZXN0KFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCS8qKgotCSAqIFRlc3RzIHRoZSBjcmVhdGlvbiBvZiBhIG1ldGhvZCBsaWJyYXJ5LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCB0ZXN0Q3JlYXRlTWV0aG9kTGlicmFyeSgpIHsKLQkJdHJ5IHsKLQkJCUxpYnJhcnlUZXN0SGVscGVyCi0JCQkJCS5jcmVhdGVUZXN0TWV0aG9kTGlicmFyeShMaWJyYXJ5VGVzdEhlbHBlci5URU1QX1RFU1RfRElSCi0JCQkJCQkJKyBGaWxlLnNlcGFyYXRvciArIFRFU1RfTElCUkFSWV8xKTsKLQkJCUZpbGUgbGliRmlsZSA9IG5ldyBGaWxlKExpYnJhcnlUZXN0SGVscGVyLlRFTVBfVEVTVF9ESVIKLQkJCQkJKyBGaWxlLnNlcGFyYXRvciArIFRFU1RfTElCUkFSWV8xICsgRmlsZS5zZXBhcmF0b3IKLQkJCQkJKyBMSUJSQVJZX1hNSSk7Ci0JCQlhc3NlcnRUcnVlKGxpYkZpbGUuZXhpc3RzKCkpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJZmFpbCgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVGVzdHMgdGhlIGNyZWF0aW9uIG9mIGEgbWV0aG9kIHBsdWctaW4uCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHRlc3RDcmVhdGVNZXRob2RQbHVnaW4oKSB7Ci0JCXRyeSB7Ci0JCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlTWV0aG9kUGx1Z2luKCk7Ci0JCQlwbHVnaW4uc2V0TmFtZShURVNUX1BMVUdJTl8xKTsKLQotCQkJSUxpYnJhcnlNYW5hZ2VyIG1hbmFnZXIgPSAoSUxpYnJhcnlNYW5hZ2VyKSBMaWJyYXJ5U2VydmljZQotCQkJCQkuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TGlicmFyeU1hbmFnZXIoKTsKLQkJCWlmIChtYW5hZ2VyICE9IG51bGwpIHsKLQkJCQltYW5hZ2VyLmFkZE1ldGhvZFBsdWdpbihNb2RlbFN0b3JhZ2UuaW5pdGlhbGl6ZShwbHVnaW4pKTsKLQkJCX0KLQotCQkJRmlsZSBwbHVnaW5GaWxlID0gbmV3IEZpbGUoTGlicmFyeVRlc3RIZWxwZXIuVEVNUF9URVNUX0RJUgotCQkJCQkrIEZpbGUuc2VwYXJhdG9yICsgVEVTVF9MSUJSQVJZXzEgKyBGaWxlLnNlcGFyYXRvcgotCQkJCQkrIFRFU1RfUExVR0lOXzEgKyBGaWxlLnNlcGFyYXRvciArIFBMVUdJTl9YTUkpOwotCQkJYXNzZXJ0VHJ1ZShwbHVnaW5GaWxlLmV4aXN0cygpKTsKLQotCQkJTGlicmFyeVRlc3RIZWxwZXIuY2xvc2VMaWJyYXJ5KCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3RzL0xpYnJhcnlUZXN0SGVscGVyLmphdmEgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3RzL0xpYnJhcnlUZXN0SGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1Mjk0NTUuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0cy9MaWJyYXJ5VGVzdEhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzM2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5GaWxlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlLmltcG9ydGluZy5MaWJyYXJ5U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlLmltcG9ydGluZy5QbHVnaW5TZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuTGlicmFyeVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFydGlmYWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ2FwYWJpbGl0eVBhdHRlcm47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DaGVja2xpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkN1c3RvbUNhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGlzY2lwbGluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkd1aWRhbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5TZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuU3VwcG9ydGluZ01hdGVyaWFsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFzazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdFR5cGU7Ci0KLWltcG9ydCBjb20uaWJtLmljdS51dGlsLkNhbGVuZGFyOwotCi0vKioKLSAqIEhlbHBlciBjbGFzcyB0byBtYW5pcHVsYXRlIGEgdGVzdCBtZXRob2QgbGlicmFyeS4KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIExpYnJhcnlUZXN0SGVscGVyIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFTVBfVEVTVF9ESVIgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoInVzZXIuaG9tZSIpICsgRmlsZS5zZXBhcmF0b3IgLy8kTk9OLU5MUy0yJAotCQkJKyAiRVBGIiArIEZpbGUuc2VwYXJhdG9yICsgInRlc3QiICsgRmlsZS5zZXBhcmF0b3I7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMSUJSQVJZX1hNSSA9ICJsaWJyYXJ5LnhtaSI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1JX1RZUEUgPSAieG1pIjsgLy8kTk9OLU5MUy0xJAkJCi0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IHRlc3QgbWV0aG9kIGxpYnJhcnkuCi0JICovCi0JcHVibGljIHN0YXRpYyBNZXRob2RMaWJyYXJ5IGNyZWF0ZVRlc3RNZXRob2RMaWJyYXJ5KCkKLQkJCXRocm93cyBMaWJyYXJ5U2VydmljZUV4Y2VwdGlvbiB7Ci0JCVN0cmluZyBwYXRoID0gVEVNUF9URVNUX0RJUgotCQkJCSsgTG9uZy50b0hleFN0cmluZyhDYWxlbmRhci5nZXRJbnN0YW5jZSgpLmdldFRpbWVJbk1pbGxpcygpKQotCQkJCSsgRmlsZS5zZXBhcmF0b3I7Ci0JCQotCQlvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJLmNsb3NlQ3VycmVudE1ldGhvZExpYnJhcnkoKTsKLQkJTWFwIHBhcmFtcyA9IG5ldyBIYXNoTWFwKCk7Ci0JCXBhcmFtcy5wdXQoImxpYnJhcnkucGF0aCIsIHBhdGgpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJLmNyZWF0ZU1ldGhvZExpYnJhcnkoTElCUkFSWV9YTUksIFhNSV9UWVBFLCBwYXJhbXMpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSB0ZXN0IG1ldGhvZCBsaWJyYXJ5IG9uIGEgZ2l2ZW4gcGF0aC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1ldGhvZExpYnJhcnkgY3JlYXRlVGVzdE1ldGhvZExpYnJhcnkoU3RyaW5nIHBhdGgpCi0JCQl0aHJvd3MgTGlicmFyeVNlcnZpY2VFeGNlcHRpb24gewotCQlpZiAocGF0aCA9PSBudWxsKSB7Ci0JCQlwYXRoID0gVEVNUF9URVNUX0RJUgotCQkJCQkrIExvbmcKLQkJCQkJCQkudG9IZXhTdHJpbmcoQ2FsZW5kYXIuZ2V0SW5zdGFuY2UoKQotCQkJCQkJCQkJLmdldFRpbWVJbk1pbGxpcygpKSArIEZpbGUuc2VwYXJhdG9yOwotCQl9Ci0JCQotCQkvLyBJZiB0aGUgbGlicmFyeSBwYXRoIGFscmVhZHkgZXhpc3RzLCBkZWxldGUgaXQuCi0JCUZpbGUgbGlicmFyeVBhdGggPSBuZXcgRmlsZShwYXRoKTsKLQkJaWYgKGxpYnJhcnlQYXRoLmV4aXN0cygpKSB7Ci0JCQlGaWxlVXRpbC5kZWxldGVBbGxGaWxlcyhsaWJyYXJ5UGF0aC5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0JCQlsaWJyYXJ5UGF0aC5kZWxldGUoKTsJCQkKLQkJfQotCQkKLQkJb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKQotCQkJCS5jbG9zZUN1cnJlbnRNZXRob2RMaWJyYXJ5KCk7Ci0JCU1hcCBwYXJhbXMgPSBuZXcgSGFzaE1hcCgpOwotCQlwYXJhbXMucHV0KCJsaWJyYXJ5LnBhdGgiLCBwYXRoKTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKQotCQkJCS5jcmVhdGVNZXRob2RMaWJyYXJ5KExJQlJBUllfWE1JLCBYTUlfVFlQRSwgcGFyYW1zKTsKLQl9Ci0KLQkvKioKLQkgKiBDbG9zZXMgdGhlIGN1cnJlbnQgbWV0aG9kIGxpYnJhcnkgYW5kIGRlbGV0ZSB0aGUgbGlicmFyeSByZXNvdXJjZSBmaWxlcy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgY2xvc2VMaWJyYXJ5KCkgewotCQl0cnkgewotCQkJRmlsZSBwYXRoID0gbmV3IEZpbGUob3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2UKLQkJCQkJLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnlMb2NhdGlvbigpKTsKLQkJCW9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLQkJCQkJLmNsb3NlQ3VycmVudE1ldGhvZExpYnJhcnkoKTsKLQotCQkJLy8gRGVsZXRlIHRoZSBsaWJyYXJ5IGZvbGRlciBhbmQgZmlsZXMuCi0JCQlGaWxlVXRpbC5kZWxldGVBbGxGaWxlcyhwYXRoLmdldEFic29sdXRlUGF0aCgpKTsKLQkJCXBhdGguZGVsZXRlKCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJZXgucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2F2ZUxpYnJhcnkoKSB7Ci0JCXRyeSB7Ci0JCQlvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJCS5zYXZlQ3VycmVudE1ldGhvZExpYnJhcnkoKTsKLQkJfSBjYXRjaCAoTGlicmFyeVNlcnZpY2VFeGNlcHRpb24gZSkgewotCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jawotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgTWV0aG9kQ29uZmlndXJhdGlvbiBjcmVhdGVDb25maWd1cmF0aW9uKFN0cmluZyBuYW1lKSB7Ci0JCXJldHVybiBMaWJyYXJ5U2VydmljZS5JTlNUQU5DRS5jcmVhdGVDb25maWd1cmF0aW9uKG5hbWUsIEVjb3JlVXRpbAotCQkJCS5nZW5lcmF0ZVVVSUQoKSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBNZXRob2RQbHVnaW4gY3JlYXRlTWV0aG9kUGx1Z2luKFN0cmluZyBuYW1lKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gTGlicmFyeVNlcnZpY2UuSU5TVEFOQ0UuY3JlYXRlUGx1Z2luKG5hbWUsIEVjb3JlVXRpbAotCQkJCQkuZ2VuZXJhdGVVVUlEKCkpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCWV4LnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBEaXNjaXBsaW5lIGNyZWF0ZURpc2NpcGxpbmUoTWV0aG9kUGx1Z2luIHBsdWdpbiwgU3RyaW5nIG5hbWUpIHsKLQkJRGlzY2lwbGluZSBlbGVtZW50ID0gTGlicmFyeVNlcnZpY2UuSU5TVEFOQ0UKLQkJCQkuY3JlYXRlUGx1Z2luU2VydmljZShwbHVnaW4pLmNyZWF0ZURpc2NpcGxpbmUoKTsKLQkJZWxlbWVudC5zZXROYW1lKG5hbWUpOwotCQllbGVtZW50LnNldEd1aWQoRWNvcmVVdGlsLmdlbmVyYXRlVVVJRCgpKTsKLQotCQlyZXR1cm4gZWxlbWVudDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFJvbGVTZXQgY3JlYXRlUm9sZVNldChNZXRob2RQbHVnaW4gcGx1Z2luLCBTdHJpbmcgbmFtZSkgewotCQlSb2xlU2V0IGVsZW1lbnQgPSBMaWJyYXJ5U2VydmljZS5JTlNUQU5DRS5jcmVhdGVQbHVnaW5TZXJ2aWNlKHBsdWdpbikKLQkJCQkuY3JlYXRlUm9sZVNldCgpOwotCQllbGVtZW50LnNldE5hbWUobmFtZSk7Ci0JCWVsZW1lbnQuc2V0R3VpZChFY29yZVV0aWwuZ2VuZXJhdGVVVUlEKCkpOwotCi0JCXJldHVybiBlbGVtZW50OwotCX0KLQotCXB1YmxpYyBzdGF0aWMgRG9tYWluIGNyZWF0ZURvbWFpbihNZXRob2RQbHVnaW4gcGx1Z2luLCBTdHJpbmcgbmFtZSkgewotCQlEb21haW4gZWxlbWVudCA9IExpYnJhcnlTZXJ2aWNlLklOU1RBTkNFLmNyZWF0ZVBsdWdpblNlcnZpY2UocGx1Z2luKQotCQkJCS5jcmVhdGVEb21haW4oKTsKLQkJZWxlbWVudC5zZXROYW1lKG5hbWUpOwotCQllbGVtZW50LnNldEd1aWQoRWNvcmVVdGlsLmdlbmVyYXRlVVVJRCgpKTsKLQotCQlyZXR1cm4gZWxlbWVudDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFdvcmtQcm9kdWN0VHlwZSBjcmVhdGVXb3JrUHJvZHVjdFR5cGUoTWV0aG9kUGx1Z2luIHBsdWdpbiwKLQkJCVN0cmluZyBuYW1lKSB7Ci0JCVdvcmtQcm9kdWN0VHlwZSBlbGVtZW50ID0gTGlicmFyeVNlcnZpY2UuSU5TVEFOQ0UuY3JlYXRlUGx1Z2luU2VydmljZSgKLQkJCQlwbHVnaW4pLmNyZWF0ZVdvcmtQcm9kdWN0VHlwZSgpOwotCQllbGVtZW50LnNldE5hbWUobmFtZSk7Ci0JCWVsZW1lbnQuc2V0R3VpZChFY29yZVV0aWwuZ2VuZXJhdGVVVUlEKCkpOwotCi0JCXJldHVybiBlbGVtZW50OwotCX0KLQotCXB1YmxpYyBzdGF0aWMgQ3VzdG9tQ2F0ZWdvcnkgY3JlYXRlQ3VzdG9tQ2F0ZWdvcnkoTWV0aG9kUGx1Z2luIHBsdWdpbiwKLQkJCUN1c3RvbUNhdGVnb3J5IHBhcmVudCwgU3RyaW5nIG5hbWUpIHsKLQkJQ3VzdG9tQ2F0ZWdvcnkgZWxlbWVudCA9IExpYnJhcnlTZXJ2aWNlLklOU1RBTkNFLmNyZWF0ZVBsdWdpblNlcnZpY2UoCi0JCQkJcGx1Z2luKS5jcmVhdGVDdXN0b21DYXRlZ29yeShwYXJlbnQpOwotCQllbGVtZW50LnNldE5hbWUobmFtZSk7Ci0JCWVsZW1lbnQuc2V0R3VpZChFY29yZVV0aWwuZ2VuZXJhdGVVVUlEKCkpOwotCi0JCXJldHVybiBlbGVtZW50OwotCX0KLQotCXB1YmxpYyBzdGF0aWMgQ29udGVudFBhY2thZ2UgY3JlYXRlQ29udGVudFBhY2thZ2UoU3RyaW5nIG5hbWUpIHsKLQotCQlyZXR1cm4gY3JlYXRlQ29udGVudFBhY2thZ2UobnVsbCwgbmFtZSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBDb250ZW50UGFja2FnZSBjcmVhdGVDb250ZW50UGFja2FnZShNZXRob2RQbHVnaW4gcGx1Z2luLAotCQkJU3RyaW5nIG5hbWUpIHsKLQkJaWYgKHBsdWdpbiA9PSBudWxsKSB7Ci0JCQlwbHVnaW4gPSBjcmVhdGVNZXRob2RQbHVnaW4oInRlc3QgcGx1Z2luIik7Ci0JCX0KLQkJQ29udGVudFBhY2thZ2UgZWxlbWVudCA9IExpYnJhcnlTZXJ2aWNlLklOU1RBTkNFLmNyZWF0ZVBsdWdpblNlcnZpY2UoCi0JCQkJcGx1Z2luKS5jcmVhdGVDb250ZW50UGFja2FnZShudWxsKTsKLQkJZWxlbWVudC5zZXROYW1lKG5hbWUpOwotCQllbGVtZW50LnNldEd1aWQoRWNvcmVVdGlsLmdlbmVyYXRlVVVJRCgpKTsKLQotCQlyZXR1cm4gZWxlbWVudDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFRhc2sgY3JlYXRlVGFzayhDb250ZW50UGFja2FnZSBwa2csIFN0cmluZyBuYW1lKSB7Ci0JCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSBMaWJyYXJ5VXRpbC5nZXRNZXRob2RQbHVnaW4ocGtnKTsKLQkJVGFzayBlbGVtZW50ID0gTGlicmFyeVNlcnZpY2UuSU5TVEFOQ0UuY3JlYXRlUGx1Z2luU2VydmljZShwbHVnaW4pCi0JCQkJLmNyZWF0ZVRhc2socGtnKTsKLQkJZWxlbWVudC5zZXROYW1lKG5hbWUpOwotCQllbGVtZW50LnNldEd1aWQoRWNvcmVVdGlsLmdlbmVyYXRlVVVJRCgpKTsKLQotCQlyZXR1cm4gZWxlbWVudDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFJvbGUgY3JlYXRlUm9sZShDb250ZW50UGFja2FnZSBwa2csIFN0cmluZyBuYW1lKSB7Ci0JCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSBMaWJyYXJ5VXRpbC5nZXRNZXRob2RQbHVnaW4ocGtnKTsKLQkJUm9sZSBlbGVtZW50ID0gTGlicmFyeVNlcnZpY2UuSU5TVEFOQ0UuY3JlYXRlUGx1Z2luU2VydmljZShwbHVnaW4pCi0JCQkJLmNyZWF0ZVJvbGUocGtnKTsKLQkJZWxlbWVudC5zZXROYW1lKG5hbWUpOwotCQllbGVtZW50LnNldEd1aWQoRWNvcmVVdGlsLmdlbmVyYXRlVVVJRCgpKTsKLQotCQlyZXR1cm4gZWxlbWVudDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIEFydGlmYWN0IGNyZWF0ZUFydGlmYWN0KENvbnRlbnRQYWNrYWdlIHBrZywgU3RyaW5nIG5hbWUpIHsKLQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IExpYnJhcnlVdGlsLmdldE1ldGhvZFBsdWdpbihwa2cpOwotCQlBcnRpZmFjdCBlbGVtZW50ID0gTGlicmFyeVNlcnZpY2UuSU5TVEFOQ0UuY3JlYXRlUGx1Z2luU2VydmljZShwbHVnaW4pCi0JCQkJLmNyZWF0ZUFydGlmYWN0KHBrZyk7Ci0JCWVsZW1lbnQuc2V0TmFtZShuYW1lKTsKLQkJZWxlbWVudC5zZXRHdWlkKEVjb3JlVXRpbC5nZW5lcmF0ZVVVSUQoKSk7Ci0KLQkJcmV0dXJuIGVsZW1lbnQ7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBHdWlkYW5jZSBjcmVhdGVHdWlkYW5jZShDb250ZW50UGFja2FnZSBwa2csIFN0cmluZyBuYW1lKSB7Ci0JCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSBMaWJyYXJ5VXRpbC5nZXRNZXRob2RQbHVnaW4ocGtnKTsKLQkJR3VpZGFuY2UgZWxlbWVudCA9IExpYnJhcnlTZXJ2aWNlLklOU1RBTkNFLmNyZWF0ZVBsdWdpblNlcnZpY2UocGx1Z2luKQotCQkJCS5jcmVhdGVHdWlkYW5jZShwa2cpOwotCQllbGVtZW50LnNldE5hbWUobmFtZSk7Ci0JCWVsZW1lbnQuc2V0R3VpZChFY29yZVV0aWwuZ2VuZXJhdGVVVUlEKCkpOwotCi0JCXJldHVybiBlbGVtZW50OwotCX0KLQotCXB1YmxpYyBzdGF0aWMgQ2hlY2tsaXN0IGNyZWF0ZUNoZWNrbGlzdChDb250ZW50UGFja2FnZSBwa2csIFN0cmluZyBuYW1lKSB7Ci0JCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSBMaWJyYXJ5VXRpbC5nZXRNZXRob2RQbHVnaW4ocGtnKTsKLQkJQ2hlY2tsaXN0IGVsZW1lbnQgPSBMaWJyYXJ5U2VydmljZS5JTlNUQU5DRS5jcmVhdGVQbHVnaW5TZXJ2aWNlKHBsdWdpbikKLQkJCQkuY3JlYXRlQ2hlY2tsaXN0KHBrZyk7Ci0JCWVsZW1lbnQuc2V0TmFtZShuYW1lKTsKLQkJZWxlbWVudC5zZXRHdWlkKEVjb3JlVXRpbC5nZW5lcmF0ZVVVSUQoKSk7Ci0KLQkJcmV0dXJuIGVsZW1lbnQ7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdXBwb3J0aW5nTWF0ZXJpYWwgY3JlYXRlU3VwcG9ydGluZ01hdGVyaWFsKAotCQkJQ29udGVudFBhY2thZ2UgcGtnLCBTdHJpbmcgbmFtZSkgewotCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gTGlicmFyeVV0aWwuZ2V0TWV0aG9kUGx1Z2luKHBrZyk7Ci0JCVN1cHBvcnRpbmdNYXRlcmlhbCBlbGVtZW50ID0gTGlicmFyeVNlcnZpY2UuSU5TVEFOQ0UKLQkJCQkuY3JlYXRlUGx1Z2luU2VydmljZShwbHVnaW4pLmNyZWF0ZVN1cHBvcnRpbmdNYXRlcmlhbChwa2cpOwotCQllbGVtZW50LnNldE5hbWUobmFtZSk7Ci0JCWVsZW1lbnQuc2V0R3VpZChFY29yZVV0aWwuZ2VuZXJhdGVVVUlEKCkpOwotCi0JCXJldHVybiBlbGVtZW50OwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU2VjdGlvbiBjcmVhdGVTZWN0aW9uKENvbnRlbnREZXNjcmlwdGlvbiBkZXNjLCBTdHJpbmcgbmFtZSwKLQkJCVN0cmluZyBjb250ZW50KSB7Ci0JCVNlY3Rpb24gZSA9IFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVNlY3Rpb24oKTsKLQkJZS5zZXRTZWN0aW9uTmFtZShuYW1lKTsKLQkJZS5zZXRTZWN0aW9uRGVzY3JpcHRpb24oY29udGVudCk7Ci0JCWUuc2V0R3VpZChFY29yZVV0aWwuZ2VuZXJhdGVVVUlEKCkpOwotCi0JCWRlc2MuZ2V0U2VjdGlvbnMoKS5hZGQoZSk7Ci0KLQkJcmV0dXJuIGU7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBDYXBhYmlsaXR5UGF0dGVybiBjcmVhdGVDYXBhYmlsaXR5UGF0dGVybigKLQkJCU1ldGhvZFBsdWdpbiBwbHVnaW4sIFN0cmluZyBuYW1lLCBNZXRob2RDb25maWd1cmF0aW9uIGRlZmF1bHRDb25maWcpIHsKLQkJQ2FwYWJpbGl0eVBhdHRlcm4gY3AgPSBMaWJyYXJ5U2VydmljZS5JTlNUQU5DRS5jcmVhdGVQbHVnaW5TZXJ2aWNlKAotCQkJCXBsdWdpbikuY3JlYXRlQ2FwYWJpbGl0eVBhdHRlcm4oZGVmYXVsdENvbmZpZyk7Ci0JCWNwLnNldE5hbWUobmFtZSk7Ci0JCSgoUHJvY2Vzc0NvbXBvbmVudCkgY3AuZUNvbnRhaW5lcigpKS5zZXROYW1lKG5hbWUpOwotCi0JCXNhdmVMaWJyYXJ5KCk7Ci0KLQkJcmV0dXJuIGNwOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgQWN0aXZpdHkgY3JlYXRlQWN0aXZpdHkoTWV0aG9kUGx1Z2luIHBsdWdpbiwKLQkJCUFjdGl2aXR5IHN1cGVyQWN0aXZpdHksIFN0cmluZyBuYW1lLCBUYXNrW10gdGFza3MpIHsKLQkJUGx1Z2luU2VydmljZSBzdmMgPSBMaWJyYXJ5U2VydmljZS5JTlNUQU5DRS5jcmVhdGVQbHVnaW5TZXJ2aWNlKHBsdWdpbik7Ci0JCUFjdGl2aXR5IGFjdCA9IHN2Yy5jcmVhdGVBY3Rpdml0eShzdXBlckFjdGl2aXR5KTsKLQkJYWN0LnNldE5hbWUobmFtZSk7Ci0JCXNhdmVMaWJyYXJ5KCk7Ci0KLQkJaWYgKHRhc2tzICE9IG51bGwgJiYgdGFza3MubGVuZ3RoID4gMCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0YXNrcy5sZW5ndGg7IGkrKykgewotCQkJCXN2Yy5hZGRUYXNrVG9BY3Rpdml0eShhY3QsIHRhc2tzW2ldKTsKLQkJCX0KLQkJCXNhdmVMaWJyYXJ5KCk7Ci0JCX0KLQotCQlyZXR1cm4gYWN0OwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRFeHRlbmRzKFZhcmlhYmlsaXR5RWxlbWVudCBlbGVtZW50LAotCQkJVmFyaWFiaWxpdHlFbGVtZW50IGJhc2UpIHsKLQkJZWxlbWVudC5zZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KGJhc2UpOwotCQllbGVtZW50LnNldFZhcmlhYmlsaXR5VHlwZShWYXJpYWJpbGl0eVR5cGUuRVhURU5EUyk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldENvbnRyaWJ1dGVzKFZhcmlhYmlsaXR5RWxlbWVudCBlbGVtZW50LAotCQkJVmFyaWFiaWxpdHlFbGVtZW50IGJhc2UpIHsKLQkJZWxlbWVudC5zZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KGJhc2UpOwotCQllbGVtZW50LnNldFZhcmlhYmlsaXR5VHlwZShWYXJpYWJpbGl0eVR5cGUuQ09OVFJJQlVURVMpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRSZXBsYWNlcyhWYXJpYWJpbGl0eUVsZW1lbnQgZWxlbWVudCwKLQkJCVZhcmlhYmlsaXR5RWxlbWVudCBiYXNlKSB7Ci0JCWVsZW1lbnQuc2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudChiYXNlKTsKLQkJZWxlbWVudC5zZXRWYXJpYWJpbGl0eVR5cGUoVmFyaWFiaWxpdHlUeXBlLlJFUExBQ0VTKTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3RzL0xpYnJhcnlUZXN0cy5qYXZhIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0cy9MaWJyYXJ5VGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTJiNzc1YS4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3RzL0xpYnJhcnlUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLlRlc3RDb21tYW5kRmlsZVRlc3RzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzLmV4cG9ydGltcG9ydC5Db25maWdFeHBvcnRJbXBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMuZXhwb3J0aW1wb3J0LlBsdWdpbkV4cG9ydEltcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy5leHBvcnRpbXBvcnQuWG1sRXhwb3J0SW1wb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzLnZhcmlhYmlsaXR5LkFjdGl2aXR5VmFyaWFiaWxpdHlUZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzLnZhcmlhYmlsaXR5LkF0dHJpYnV0ZUZlYXR1cmVUZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzLnZhcmlhYmlsaXR5LkNvcHlyaWdodFRlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMudmFyaWFiaWxpdHkuSW5jb21pbmcwMUZlYXR1cmVUZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzLnZhcmlhYmlsaXR5LkluY29taW5nMG5GZWF0dXJlVGVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy52YXJpYWJpbGl0eS5PdXRnb2luZzAxRmVhdHVyZVRlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMudmFyaWFiaWxpdHkuT3V0Z29pbmcwbkZlYXR1cmVUZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzLnZhcmlhYmlsaXR5LlJlZ3Jlc3Npb25UZXN0OwotCi0vKioKLSAqIEpVbml0IHRlc3RzIGZvciB0aGUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkgY2xhc3MuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTGlicmFyeVRlc3RzIHsKLQotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZShMaWJyYXJ5VGVzdHMuY2xhc3MuZ2V0UGFja2FnZSgpLmdldE5hbWUoKSk7Ci0JCS8vJEpVbml0LUJFR0lOJAotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoTGlicmFyeVNlcnZpY2VUZXN0LmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKE91dGdvaW5nMDFGZWF0dXJlVGVzdC5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShPdXRnb2luZzBuRmVhdHVyZVRlc3QuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoSW5jb21pbmcwMUZlYXR1cmVUZXN0LmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEluY29taW5nMG5GZWF0dXJlVGVzdC5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShBdHRyaWJ1dGVGZWF0dXJlVGVzdC5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShDb3B5cmlnaHRUZXN0LmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFJlZ3Jlc3Npb25UZXN0LmNsYXNzKTsJCi0JCXN1aXRlLmFkZFRlc3RTdWl0ZShBY3Rpdml0eVZhcmlhYmlsaXR5VGVzdC5jbGFzcyk7CQotCQkKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFRlc3RDb21tYW5kRmlsZVRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFBsdWdpbkV4cG9ydEltcG9ydC5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShDb25maWdFeHBvcnRJbXBvcnQuY2xhc3MpOwkKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFhtbEV4cG9ydEltcG9ydC5jbGFzcyk7Ci0JCQotCQkvLyRKVW5pdC1FTkQkCi0JCXJldHVybiBzdWl0ZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdHMvVGVzdHNQbHVnaW4uamF2YSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdHMvVGVzdHNQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzE2YWQyMy4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3RzL1Rlc3RzUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy9Db3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vL0FsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vL3doaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vL2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy9Db250cmlidXRvcnM6Ci0vL0lCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS5BYnN0cmFjdFBsdWdpbjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotLyoqCi0qIFRoZSBUZXN0cyBwbHVnLWluIGNsYXNzLgotKiAKLSogQGF1dGhvcglXZWlwaW5nIEx1Ci0qIEBzaW5jZQkxLjAKLSovCi1wdWJsaWMgY2xhc3MgVGVzdHNQbHVnaW4gZXh0ZW5kcyBBYnN0cmFjdFBsdWdpbiB7Ci0KLQkvLyBUaGUgcGx1Zy1pbiBJRC4KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgPSBUZXN0c1BsdWdpbi5jbGFzcy5nZXROYW1lKCk7Ci0JCi0JLy8gVGhlIHNoYXJlZCBwbHVnLWluIGluc3RhbmNlLgotCXByaXZhdGUgc3RhdGljIFRlc3RzUGx1Z2luIHBsdWdpbjsKLQkKLQkvKioKLQkgKiBEZWZhdWx0IGNvbnN0cnVjdG9yLgotCSAqLwotCXB1YmxpYyBUZXN0c1BsdWdpbigpIHsKLQkJc3VwZXIoKTsKLQkJcGx1Z2luID0gdGhpczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgdXBvbiBwbHVnLWluIGFjdGl2YXRpb24uCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmNvcmUucGx1Z2luLkFic3RyYWN0UGx1Z2luI3N0YXJ0KEJ1bmRsZUNvbnRleHQpCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RhcnQoY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoZW4gdGhlIHBsdWctaW4gaXMgc3RvcHBlZC4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuY29yZS5wbHVnaW4uQWJzdHJhY3RQbHVnaW4jc3RhcnQoQnVuZGxlQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0b3AoY29udGV4dCk7Ci0JCXBsdWdpbiA9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2hhcmVkIHBsdWctaW4gaW5zdGFuY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBUZXN0c1BsdWdpbiBnZXREZWZhdWx0KCkgewotCQlyZXR1cm4gcGx1Z2luOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0cy9leHBvcnRpbXBvcnQvQ29uZmlnRXhwb3J0SW1wb3J0LmphdmEgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3RzL2V4cG9ydGltcG9ydC9Db25maWdFeHBvcnRJbXBvcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTRmMjI5OS4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3RzL2V4cG9ydGltcG9ydC9Db25maWdFeHBvcnRJbXBvcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzLmV4cG9ydGltcG9ydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5pbXBsLkV4cG9ydEltcG9ydFRlc3RJbXBsOwotCi0vKioKLSAqIEpVbml0IHRlc3RzIGZvciBwbHVnaW4gZXhwb3J0L2ltcG9ydAotICogCi0gKiBAYXV0aG9yIFdlaXBpbmcgTHUKLSAqIEBzaW5jZSAxLjAKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgQ29uZmlnRXhwb3J0SW1wb3J0IGV4dGVuZHMgRXhwb3J0SW1wb3J0VGVzdEltcGwgewotCi0JcHVibGljIENvbmZpZ0V4cG9ydEltcG9ydChTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9CQotCQkKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwkJCi0JCWVuZFNldFVwKCk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSN0ZWFyRG93bigpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIudGVhckRvd24oKTsKLQkJZW5kVGVhckRvd24oKTsKLQl9CQotCQotCXB1YmxpYyBpbnQgbnVtVGVzdENhc2VzKCkgewotCQlyZXR1cm4gMTsKLQl9CQkJCi0JCQkKLQlwdWJsaWMgdm9pZCB0ZXN0MDAwMV8xKCkgewotCQlnZXRTZXJ2aWNlKCkudHJhY2UoIkJlZ2luIC0+IHRlc3QwMDAxXzEiKTsKLQkJbmV3IENvbmZpZ0V4cG9ydEltcG9ydFRlc3QwMDAxKHRoaXMpLmV4ZWN1dGUoInRlc3QwMDAxXzEiKTsKLQkJZ2V0U2VydmljZSgpLnRyYWNlKCJFbmQgICAtPiB0ZXN0MDAwMV8xIik7Ci0JfQkJCQotCQkJCQotfQpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0cy9leHBvcnRpbXBvcnQvQ29uZmlnRXhwb3J0SW1wb3J0VGVzdDAwMDEuamF2YSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdHMvZXhwb3J0aW1wb3J0L0NvbmZpZ0V4cG9ydEltcG9ydFRlc3QwMDAxLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5M2FjZDguLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0cy9leHBvcnRpbXBvcnQvQ29uZmlnRXhwb3J0SW1wb3J0VGVzdDAwMDEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzLmV4cG9ydGltcG9ydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5MaWJyYXJ5SnVuaXRUZXN0U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXIuaWZhY2UuVENFeGVSZXBseTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXIuaWZhY2UuVGVzdENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmltcGwuRXhwb3J0SW1wb3J0VGVzdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmltcGwudGVzdGNvbW1hbmRzLlRDQ29tcGFyZVRvTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXIuaW1wbC50ZXN0Y29tbWFuZHMuVENDb3B5TGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXIuaW1wbC50ZXN0Y29tbWFuZHMuVENFeHBvcnRDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5pbXBsLnRlc3Rjb21tYW5kcy5UQ0ltcG9ydENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmltcGwudGVzdGNvbW1hbmRzLlRDT3BlbkxpYnJhcnk7Ci0KLS8qKgotICogSlVuaXQgdGVzdHMgZm9yIHBsdWdpbiBleHBvcnQvaW1wb3J0Ci0gKiAKLSAqIEBhdXRob3IgV2VpcGluZyBMdQotICogQHNpbmNlIDEuMAotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBDb25maWdFeHBvcnRJbXBvcnRUZXN0MDAwMSBleHRlbmRzIEV4cG9ydEltcG9ydFRlc3RNZXRob2RCYXNlIHsKLQkKLQlwdWJsaWMgQ29uZmlnRXhwb3J0SW1wb3J0VGVzdDAwMDEoRXhwb3J0SW1wb3J0VGVzdEltcGwgb3duZXIpIHsKLQkJc3VwZXIob3duZXIpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBleGVjdXRlKFN0cmluZyB0ZXN0TmFtZSkgewotCQlMaWJyYXJ5SnVuaXRUZXN0U2VydmljZSBzZXJ2aWNlID0gZ2V0T3duZXIoKS5nZXRTZXJ2aWNlKCk7Ci0JCQotCQlUZXN0Q29tbWFuZCB0Y3NbXSA9IG5ldyBUZXN0Q29tbWFuZFs2XTsKLQkJCi0JCXRjc1swXSA9IHNlcnZpY2UubmV3VGVzdENvbW1hbmQoVENDb3B5TGlicmFyeS5jbGFzcyk7Ci0JCXRjc1swXS5zZXRBdHRyaWJ1dGUoVGVzdENvbW1hbmQuQVRfTGliRm9sZGVyTmFtZSwgIlBhcmlzIik7Ci0JCQotCQl0Y3NbMV0gPSBzZXJ2aWNlLm5ld1Rlc3RDb21tYW5kKFRDT3BlbkxpYnJhcnkuY2xhc3MpOwotCQl0Y3NbMV0uc2V0QXR0cmlidXRlKFRlc3RDb21tYW5kLkFUX0xpYkZvbGRlck5hbWUsICJQYXJpcyIpOwotCQkKLQkJdGNzWzJdID0gc2VydmljZS5uZXdUZXN0Q29tbWFuZChUQ0V4cG9ydENvbmZpZ3VyYXRpb24uY2xhc3MpOwotCQl0Y3NbMl0uc2V0QXR0cmlidXRlKFRlc3RDb21tYW5kLkFUX0V4cG9ydEZvbGRlck5hbWUsICJFeHBvcnQwMDAxIik7Ci0JCXRjc1syXS5zZXRBdHRyaWJ1dGUoVGVzdENvbW1hbmQuQVRfU2VsZWN0ZWRDb25maWdOYW1lLCAiQ29uZmlnIEEiKTsKLQotCQl0Y3NbM10gPSBzZXJ2aWNlLm5ld1Rlc3RDb21tYW5kKFRDT3BlbkxpYnJhcnkuY2xhc3MpOwotCQl0Y3NbM10uc2V0QXR0cmlidXRlKFRlc3RDb21tYW5kLkFUX0xpYkZvbGRlck5hbWUsICJCYXNlXzEiKTsKLQkJCi0JCXRjc1s0XSA9IHNlcnZpY2UubmV3VGVzdENvbW1hbmQoVENJbXBvcnRDb25maWd1cmF0aW9uLmNsYXNzKTsKLQkJdGNzWzRdLnNldEF0dHJpYnV0ZShUZXN0Q29tbWFuZC5BVF9JbXBvcnRGb2xkZXJOYW1lLCAiRXhwb3J0MDAwMSIpOwotCQkKLQkJdGNzWzVdID0gc2VydmljZS5uZXdUZXN0Q29tbWFuZChUQ0NvbXBhcmVUb0xpYnJhcnkuY2xhc3MpOwotCQl0Y3NbNV0uc2V0QXR0cmlidXRlKFRlc3RDb21tYW5kLkFUX0dvbGRlbkxpYkZvbGRlck5hbWUsICJQYXJpcyIpOwotCQkKLQkJYm9vbGVhbiBwYXNzaW5nID0gdHJ1ZTsKLQkJZm9yIChpbnQgaT0wOyBpPHRjcy5sZW5ndGg7IGkrKykgewotCQkJVENFeGVSZXBseSByZXBseSA9IHRjc1tpXS5leGVjdXRlKCk7Ci0JCQlpZiAocmVwbHkgIT0gbnVsbCAmJiAhIHJlcGx5LnBhc3NpbmcoKSkgewotCQkJCXBhc3NpbmcgPSBmYWxzZTsKLQkJCX0JCQkJCi0JCX0KLQkJZ2V0T3duZXIoKS5hc3NlcnRUcnVlKHBhc3NpbmcpOwotCQkKLQkJcmV0dXJuIHBhc3Npbmc7Ci0JCQkKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3RzL2V4cG9ydGltcG9ydC9FeHBvcnRJbXBvcnQuamF2YSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdHMvZXhwb3J0aW1wb3J0L0V4cG9ydEltcG9ydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNDVkMmRhLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdHMvZXhwb3J0aW1wb3J0L0V4cG9ydEltcG9ydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMuZXhwb3J0aW1wb3J0OwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZUZpbHRlcjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5RYVRlc3RTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5UZXN0Rm9sZGVyU2V0dXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMuVGVzdHNQbHVnaW47Ci0KLS8qKgotICogSlVuaXQgdGVzdHMgZm9yIGV4cG9ydC9pbXBvcnQKLSAqIAotICogQGF1dGhvciBXZWlwaW5nIEx1Ci0gKiBAc2luY2UgMS4wCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIEV4cG9ydEltcG9ydCBleHRlbmRzIFRlc3RDYXNlIHsKLQotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIEZpbGUgdGVzdFJvb3RTb3VyY2UgPSBuZXcgRmlsZSAoVGVzdHNQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEluc3RhbGxQYXRoKCkgKyAgCi0JCSJMaWJyYXJpZXMiICsgRmlsZS5zZXBhcmF0b3IgKyAiMS4wLjAiICsgRmlsZS5zZXBhcmF0b3IgKyAiRXhwb3J0SW1wb3J0Iik7Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgdGVzdFJvb3RQYXJlbnQgPSAgU3lzdGVtLmdldFByb3BlcnR5KCJ1c2VyLmhvbWUiKSArIEZpbGUuc2VwYXJhdG9yIAotCQkJCQkJCQkJKyAiRVBGIiArIEZpbGUuc2VwYXJhdG9yICsgInRlc3QiICsgRmlsZS5zZXBhcmF0b3I7Ci0KLQkKLQkKLQlwcml2YXRlIFFhVGVzdFNlcnZpY2Ugc2VydmljZSA9IG5ldwlRYVRlc3RTZXJ2aWNlKG5ldyBUZXN0Rm9sZGVyU2V0dXAoKSwgdHJ1ZSk7Ci0JCi0JcHVibGljIEV4cG9ydEltcG9ydChTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdENhc2UoKSB7CQkKLQkJZmluYWwgU3RyaW5nIGZpbGVOYW1lID0gIjFzdFRlc3QudGMiOwotCQlGaWxlRmlsdGVyIGZpbHRlciA9IG5ldyBGaWxlRmlsdGVyKCkgewotCQkJcHVibGljIGJvb2xlYW4gYWNjZXB0KEZpbGUgcGF0aG5hbWUpIHsKLQkJCQlyZXR1cm4gcGF0aG5hbWUuZ2V0TmFtZSgpLmVxdWFsc0lnbm9yZUNhc2UoZmlsZU5hbWUpOwotCQkJfTsJCQkKLQkJfTsKLQkJCi0JCUZpbGUgZmlsZXNbXSA9IHRlc3RSb290U291cmNlLmxpc3RGaWxlcyhmaWx0ZXIpOwotCQlpZiAoZmlsZXMgPT0gbnVsbCB8fCBmaWxlcy5sZW5ndGggPT0gMCkgewotCQkJYXNzZXJ0VHJ1ZShmaWxlTmFtZSArICIgY2Fubm90IGJlIGZvdW5kISIsIGZhbHNlKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCUZpbGUgdGVzdFJvb3RXb3JraW5nID0gbmV3IEZpbGUodGVzdFJvb3RQYXJlbnQgKyAiRXhwb3J0SW1wb3J0T25lQ2FzZSIpOwotCQlTdHJpbmcgZXJyb3JNc2cgPSBzZXJ2aWNlLnJ1bkNhc2UodGVzdFJvb3RTb3VyY2UsIHRlc3RSb290V29ya2luZywgZmlsZXNbMF0pOwotCQlhc3NlcnRUcnVlKGVycm9yTXNnLCBlcnJvck1zZy5sZW5ndGgoKSA9PSAwKTsKLQl9CQotCQkJCi0JcHVibGljIHZvaWQgdGVzdExvY2FsQ2FzZXMoKSB7Ci0JCUZpbGUgdGVzdFJvb3RXb3JraW5nID0gbmV3IEZpbGUodGVzdFJvb3RQYXJlbnQgKyAiRXhwb3J0SW1wb3J0Iik7CQkKLQkJU3RyaW5nIGVycm9yTXNnID0gc2VydmljZS5ydW5Mb2NhbENhc2VzKHRlc3RSb290U291cmNlLCB0ZXN0Um9vdFdvcmtpbmcpOwotCQlhc3NlcnRUcnVlKGVycm9yTXNnLCBlcnJvck1zZy5sZW5ndGgoKSA9PSAwKTsKLQl9CQotCQkJCQotCQkJCQotfQpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0cy9leHBvcnRpbXBvcnQvRXhwb3J0SW1wb3J0VGVzdE1ldGhvZEJhc2UuamF2YSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdHMvZXhwb3J0aW1wb3J0L0V4cG9ydEltcG9ydFRlc3RNZXRob2RCYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmNzc1YzcuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0cy9leHBvcnRpbXBvcnQvRXhwb3J0SW1wb3J0VGVzdE1ldGhvZEJhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzLmV4cG9ydGltcG9ydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5MaWJyYXJ5VGVzdFNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmltcGwuRXhwb3J0SW1wb3J0VGVzdEltcGw7Ci0KLS8qKgotICogSlVuaXQgdGVzdHMgZm9yIHBsdWdpbiBleHBvcnQvaW1wb3J0Ci0gKiAKLSAqIEBhdXRob3IgV2VpcGluZyBMdQotICogQHNpbmNlIDEuMAotICogCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBFeHBvcnRJbXBvcnRUZXN0TWV0aG9kQmFzZSB7Ci0JcHJpdmF0ZSBFeHBvcnRJbXBvcnRUZXN0SW1wbCBvd25lcjsKLQkKLQlwdWJsaWMgRXhwb3J0SW1wb3J0VGVzdE1ldGhvZEJhc2UoRXhwb3J0SW1wb3J0VGVzdEltcGwgb3duZXIpIHsKLQkJdGhpcy5vd25lciA9IG93bmVyOwotCX0KLQkKLQlwcm90ZWN0ZWQgRXhwb3J0SW1wb3J0VGVzdEltcGwgZ2V0T3duZXIoKSB7Ci0JCXJldHVybiBvd25lcjsKLQl9CQotCQotCWFic3RyYWN0IHB1YmxpYyBib29sZWFuIGV4ZWN1dGUoU3RyaW5nIHRlc3ROYW1lKTsKLQkKLX0KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdHMvZXhwb3J0aW1wb3J0L1BsdWdpbkV4cG9ydEltcG9ydC5qYXZhIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0cy9leHBvcnRpbXBvcnQvUGx1Z2luRXhwb3J0SW1wb3J0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhYjRmMmMuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0cy9leHBvcnRpbXBvcnQvUGx1Z2luRXhwb3J0SW1wb3J0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy5leHBvcnRpbXBvcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXIuaW1wbC5FeHBvcnRJbXBvcnRUZXN0SW1wbDsKLQotLyoqCi0gKiBKVW5pdCB0ZXN0cyBmb3IgcGx1Z2luIGV4cG9ydC9pbXBvcnQKLSAqIAotICogQGF1dGhvciBXZWlwaW5nIEx1Ci0gKiBAc2luY2UgMS4wCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFBsdWdpbkV4cG9ydEltcG9ydCBleHRlbmRzIEV4cG9ydEltcG9ydFRlc3RJbXBsIHsKLQotCXB1YmxpYyBQbHVnaW5FeHBvcnRJbXBvcnQoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQkKLQkJCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsJCQotCQllbmRTZXRVcCgpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UjdGVhckRvd24oKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JCWVuZFRlYXJEb3duKCk7Ci0JfQkKLQkKLQlwdWJsaWMgaW50IG51bVRlc3RDYXNlcygpIHsKLQkJcmV0dXJuIDE7Ci0JfQkKLQkKLQlwdWJsaWMgdm9pZCB0ZXN0MDAwMV8xKCkgewotCQlnZXRTZXJ2aWNlKCkudHJhY2UoIkJlZ2luIC0+IHRlc3QwMDAxXzEiKTsKLQkJbmV3IFBsdWdpbkV4cG9ydEltcG9ydFRlc3QwMDAxKHRoaXMpLmV4ZWN1dGUoInRlc3QwMDAxXzEiKTsKLQkJZ2V0U2VydmljZSgpLnRyYWNlKCJFbmQgICAtPiB0ZXN0MDAwMV8xIik7Ci0JfQkKLQkKLX0KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdHMvZXhwb3J0aW1wb3J0L1BsdWdpbkV4cG9ydEltcG9ydFRlc3QwMDAxLmphdmEgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3RzL2V4cG9ydGltcG9ydC9QbHVnaW5FeHBvcnRJbXBvcnRUZXN0MDAwMS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhODAyZWQ1Li4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdHMvZXhwb3J0aW1wb3J0L1BsdWdpbkV4cG9ydEltcG9ydFRlc3QwMDAxLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy5leHBvcnRpbXBvcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXIuTGlicmFyeUp1bml0VGVzdFNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmlmYWNlLlRDRXhlUmVwbHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmlmYWNlLlRlc3RDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5pbXBsLkV4cG9ydEltcG9ydFRlc3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5pbXBsLnRlc3Rjb21tYW5kcy5UQ0NvbXBhcmVUb0xpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmltcGwudGVzdGNvbW1hbmRzLlRDQ29weUxpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmltcGwudGVzdGNvbW1hbmRzLlRDRXhwb3J0UGx1Z2luczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXIuaW1wbC50ZXN0Y29tbWFuZHMuVENJbXBvcnRQbHVnaW5zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5pbXBsLnRlc3Rjb21tYW5kcy5UQ09wZW5MaWJyYXJ5OwotCi0vKioKLSAqIEpVbml0IHRlc3RzIGZvciBwbHVnaW4gZXhwb3J0L2ltcG9ydAotICogCi0gKiBAYXV0aG9yIFdlaXBpbmcgTHUKLSAqIEBzaW5jZSAxLjAKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgUGx1Z2luRXhwb3J0SW1wb3J0VGVzdDAwMDEgZXh0ZW5kcyBFeHBvcnRJbXBvcnRUZXN0TWV0aG9kQmFzZSB7Ci0JCi0JcHVibGljIFBsdWdpbkV4cG9ydEltcG9ydFRlc3QwMDAxKEV4cG9ydEltcG9ydFRlc3RJbXBsIG93bmVyKSB7Ci0JCXN1cGVyKG93bmVyKTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gZXhlY3V0ZShTdHJpbmcgdGVzdE5hbWUpIHsJCQotCQlMaWJyYXJ5SnVuaXRUZXN0U2VydmljZSBzZXJ2aWNlID0gZ2V0T3duZXIoKS5nZXRTZXJ2aWNlKCk7Ci0JCQotCQlUZXN0Q29tbWFuZCB0Y3NbXSA9IG5ldyBUZXN0Q29tbWFuZFs2XTsKLQkJCi0JCXRjc1swXSA9IHNlcnZpY2UubmV3VGVzdENvbW1hbmQoVENDb3B5TGlicmFyeS5jbGFzcyk7Ci0JCXRjc1swXS5zZXRBdHRyaWJ1dGUoVGVzdENvbW1hbmQuQVRfTGliRm9sZGVyTmFtZSwgIlBhcmlzIik7Ci0JCQotCQl0Y3NbMV0gPSBzZXJ2aWNlLm5ld1Rlc3RDb21tYW5kKFRDT3BlbkxpYnJhcnkuY2xhc3MpOwotCQl0Y3NbMV0uc2V0QXR0cmlidXRlKFRlc3RDb21tYW5kLkFUX0xpYkZvbGRlck5hbWUsICJQYXJpcyIpOwotCQkKLQkJdGNzWzJdID0gc2VydmljZS5uZXdUZXN0Q29tbWFuZChUQ0V4cG9ydFBsdWdpbnMuY2xhc3MpOwotCQl0Y3NbMl0uc2V0QXR0cmlidXRlKFRlc3RDb21tYW5kLkFUX0V4cG9ydEZvbGRlck5hbWUsICJFeHBvcnQwMDAxIik7Ci0JCQotCQl0Y3NbM10gPSBzZXJ2aWNlLm5ld1Rlc3RDb21tYW5kKFRDT3BlbkxpYnJhcnkuY2xhc3MpOwotCQl0Y3NbM10uc2V0QXR0cmlidXRlKFRlc3RDb21tYW5kLkFUX0xpYkZvbGRlck5hbWUsICJCYXNlXzEiKTsKLQkJCi0JCXRjc1s0XSA9IHNlcnZpY2UubmV3VGVzdENvbW1hbmQoVENJbXBvcnRQbHVnaW5zLmNsYXNzKTsKLQkJdGNzWzRdLnNldEF0dHJpYnV0ZShUZXN0Q29tbWFuZC5BVF9JbXBvcnRGb2xkZXJOYW1lLCAiRXhwb3J0MDAwMSIpOwotCQkKLQkJdGNzWzVdID0gc2VydmljZS5uZXdUZXN0Q29tbWFuZChUQ0NvbXBhcmVUb0xpYnJhcnkuY2xhc3MpOwotCQl0Y3NbNV0uc2V0QXR0cmlidXRlKFRlc3RDb21tYW5kLkFUX0dvbGRlbkxpYkZvbGRlck5hbWUsICJQYXJpcyIpOwotCQkKLQkJYm9vbGVhbiBwYXNzaW5nID0gdHJ1ZTsKLQkJZm9yIChpbnQgaT0wOyBpPHRjcy5sZW5ndGg7IGkrKykgewotCQkJVENFeGVSZXBseSByZXBseSA9IHRjc1tpXS5leGVjdXRlKCk7Ci0JCQlpZiAocmVwbHkgIT0gbnVsbCAmJiAhIHJlcGx5LnBhc3NpbmcoKSkgewotCQkJCXBhc3NpbmcgPSBmYWxzZTsKLQkJCX0JCQkJCi0JCX0KLQkJZ2V0T3duZXIoKS5hc3NlcnRUcnVlKHBhc3NpbmcpOwotCQkKLQkJcmV0dXJuIHBhc3Npbmc7Ci0JfQkKLQkKLX0KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdHMvZXhwb3J0aW1wb3J0L1N0YW5kQWxvbmVUZXN0LmphdmEgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3RzL2V4cG9ydGltcG9ydC9TdGFuZEFsb25lVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNDVhMGY1Li4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdHMvZXhwb3J0aW1wb3J0L1N0YW5kQWxvbmVUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy5leHBvcnRpbXBvcnQ7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLnNlcnZpY2VzLkNvbmZpZ3VyYXRpb25JbXBvcnRTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5MaWJyYXJ5VGVzdFNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmltcGwuVGVzdENvbW1hbmRNZ3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotCi0vKioKLSAqIEpVbml0IHRlc3RzIGZvciBwbHVnaW4gZXhwb3J0L2ltcG9ydAotICogCi0gKiBAYXV0aG9yIFdlaXBpbmcgTHUKLSAqIEBzaW5jZSAxLjAKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgU3RhbmRBbG9uZVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQlwcml2YXRlIExpYnJhcnlUZXN0U2VydmljZSBzZXJ2aWNlID0gTGlicmFyeVRlc3RTZXJ2aWNlLmdldEluc3RhbmNlKCk7Ci0JCi0JcHVibGljIFN0YW5kQWxvbmVUZXN0KCkgewotCX0JCi0JCi0JcHVibGljIHZvaWQgdGVzdDAwMDEoKSB7Ci0KLSAJCS8vTGlicmFyeURpZmZBbmFseXpvci5zZXRUcmltKHRydWUpOwotCQkvL0xpYnJhcnlEaWZmQW5hbHl6b3Iuc2V0VXNlTmFtZUFzMm5kSWQodHJ1ZSk7Ci0JCS8vTGlicmFyeURpZmZBbmFseXpvci5hZGRFeGNsdWRlZEZlYXR1cmUoInZlcnNpb24iKTsKLQkJLy9MaWJyYXJ5RGlmZkFuYWx5em9yLmFkZEV4Y2x1ZGVkRmVhdHVyZSgibmFtZSIpOwotCQkvL0xpYnJhcnlEaWZmQW5hbHl6b3IuYWRkRXhjbHVkZWRGZWF0dXJlKCJwcmVzZW50YXRpb25OYW1lIik7Ci0JCS8vTGlicmFyeURpZmZBbmFseXpvci5hZGRFeGNsdWRlZEZlYXR1cmUoIm1haW5EZXNjcmlwdGlvbiIpOwotCQkvL0xpYnJhcnlEaWZmQW5hbHl6b3IuYWRkRXhjbHVkZWRGZWF0dXJlKCJzZWN0aW9uRGVzY3JpcHRpb24iKTsJCi0JCQotCQlUZXN0Q29tbWFuZE1nciB0Y01nciA9IG5ldyBUZXN0Q29tbWFuZE1ncih0cnVlKTsKLQkJRmlsZSBmaWxlID0gbmV3IEZpbGUoIkM6XFxMaWJzXFw3MlxcIik7Ci0JCXRjTWdyLm9wZW5DdXJyVGVzdERpcihmaWxlKTsKLQkJCi0JCVN0cmluZyBsaWIxUGF0aCA9ICJDOlxcTGlic1xcNzJcXE9wZW5VcDcyIjsKLQkJU3RyaW5nIGxpYjJQYXRoID0gIkM6XFxMaWJzXFw3MlxcYSI7CQkKLQkJTWV0aG9kTGlicmFyeSBsaWIxID0gc2VydmljZS5sb2FkTGlicmFyeShsaWIxUGF0aCk7Ci0JCU1ldGhvZExpYnJhcnkgbGliMiA9IHNlcnZpY2UubG9hZExpYnJhcnkobGliMlBhdGgpOwotCQlDb25maWd1cmF0aW9uSW1wb3J0U2VydmljZS5maXhJbXBvcnRMaWJyYXJ5U3lzdGVtUGFja2FnZUdVSURzKGxpYjEsIGxpYjIpOwotCQl0Y01nci50cmFjZSgiQ29tcGFyaW5nIGxpYnJhcmllcyAtPiBCZWdpbiIpOwotCQl0Y01nci50cmFjZSgibGliMTogIiArIGxpYjFQYXRoKTsKLQkJdGNNZ3IudHJhY2UoImxpYjI6ICIgKyBsaWIyUGF0aCk7Ci0KLQkJYm9vbGVhbiByZXN1bHQgPSB0Y01nci5jb21wYXJlTGlicyhsaWIxLCBsaWIyLCAwLCAwLCB0cnVlKTsKLQkJYXNzZXJ0VHJ1ZShyZXN1bHQpOwotCQl0Y01nci50cmFjZSgiQ29tcGFyaW5nIGxpYnJhcmllcyA8LSBFbmQgIik7Ci0JfQkJCi0JCQkKLQkKLX0KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdHMvZXhwb3J0aW1wb3J0L1htbEV4cG9ydEltcG9ydC5qYXZhIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0cy9leHBvcnRpbXBvcnQvWG1sRXhwb3J0SW1wb3J0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmYmQ5NGYuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0cy9leHBvcnRpbXBvcnQvWG1sRXhwb3J0SW1wb3J0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy5leHBvcnRpbXBvcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXIuaW1wbC5FeHBvcnRJbXBvcnRUZXN0SW1wbDsKLQotCi0vKioKLSAqIEpVbml0IHRlc3RzIGZvciBwbHVnaW4gZXhwb3J0L2ltcG9ydAotICogCi0gKiBAYXV0aG9yIFdlaXBpbmcgTHUKLSAqIEBzaW5jZSAxLjAKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgWG1sRXhwb3J0SW1wb3J0IGV4dGVuZHMgRXhwb3J0SW1wb3J0VGVzdEltcGwgewotCi0JcHVibGljIFhtbEV4cG9ydEltcG9ydChTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9CQotCQkKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwkJCi0JCWVuZFNldFVwKCk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSN0ZWFyRG93bigpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIudGVhckRvd24oKTsKLQkJZW5kVGVhckRvd24oKTsKLQl9CQotCQotCXB1YmxpYyBpbnQgbnVtVGVzdENhc2VzKCkgewotCQlyZXR1cm4gMTsKLQl9CQkKLQkKLQlwdWJsaWMgdm9pZCB0ZXN0MDAwMV8xKCkgewotCQlnZXRTZXJ2aWNlKCkudHJhY2UoIkJlZ2luIC0+IHRlc3QwMDAxXzEiKTsKLQkJbmV3IFhtbEV4cG9ydEltcG9ydFRlc3QwMDAxKHRoaXMpLmV4ZWN1dGUoInRlc3QwMDAxXzEiKTsKLQkJZ2V0U2VydmljZSgpLnRyYWNlKCJFbmQgICAtPiB0ZXN0MDAwMV8xIik7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0cy9leHBvcnRpbXBvcnQvWG1sRXhwb3J0SW1wb3J0VGVzdDAwMDEuamF2YSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdHMvZXhwb3J0aW1wb3J0L1htbEV4cG9ydEltcG9ydFRlc3QwMDAxLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxNDE1MjcuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0cy9leHBvcnRpbXBvcnQvWG1sRXhwb3J0SW1wb3J0VGVzdDAwMDEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzLmV4cG9ydGltcG9ydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5MaWJyYXJ5SnVuaXRUZXN0U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXIuaWZhY2UuVENFeGVSZXBseTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXIuaWZhY2UuVGVzdENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmltcGwuRXhwb3J0SW1wb3J0VGVzdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmltcGwudGVzdGNvbW1hbmRzLlRDQ29tcGFyZVRvTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXIuaW1wbC50ZXN0Y29tbWFuZHMuVENDb3B5TGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXIuaW1wbC50ZXN0Y29tbWFuZHMuVENFeHBvcnRYbWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmltcGwudGVzdGNvbW1hbmRzLlRDSW1wb3J0WG1sOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5pbXBsLnRlc3Rjb21tYW5kcy5UQ09wZW5MaWJyYXJ5OwotCi0vKioKLSAqIEpVbml0IHRlc3RzIGZvciBwbHVnaW4gZXhwb3J0L2ltcG9ydAotICogCi0gKiBAYXV0aG9yIFdlaXBpbmcgTHUKLSAqIEBzaW5jZSAxLjAKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgWG1sRXhwb3J0SW1wb3J0VGVzdDAwMDEgZXh0ZW5kcyBFeHBvcnRJbXBvcnRUZXN0TWV0aG9kQmFzZSB7Ci0JCi0JcHVibGljIFhtbEV4cG9ydEltcG9ydFRlc3QwMDAxKEV4cG9ydEltcG9ydFRlc3RJbXBsIG93bmVyKSB7Ci0JCXN1cGVyKG93bmVyKTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gZXhlY3V0ZShTdHJpbmcgdGVzdE5hbWUpIHsKLQkJTGlicmFyeUp1bml0VGVzdFNlcnZpY2Ugc2VydmljZSA9IGdldE93bmVyKCkuZ2V0U2VydmljZSgpOwotCQkKLQkJVGVzdENvbW1hbmQgdGNzW10gPSBuZXcgVGVzdENvbW1hbmRbNl07Ci0JCQotCQl0Y3NbMF0gPSBzZXJ2aWNlLm5ld1Rlc3RDb21tYW5kKFRDQ29weUxpYnJhcnkuY2xhc3MpOwotCQl0Y3NbMF0uc2V0QXR0cmlidXRlKFRlc3RDb21tYW5kLkFUX0xpYkZvbGRlck5hbWUsICJQYXJpcyIpOwotCQkKLQkJdGNzWzFdID0gc2VydmljZS5uZXdUZXN0Q29tbWFuZChUQ09wZW5MaWJyYXJ5LmNsYXNzKTsKLQkJdGNzWzFdLnNldEF0dHJpYnV0ZShUZXN0Q29tbWFuZC5BVF9MaWJGb2xkZXJOYW1lLCAiUGFyaXMiKTsKLQkJCi0JCXRjc1syXSA9IHNlcnZpY2UubmV3VGVzdENvbW1hbmQoVENFeHBvcnRYbWwuY2xhc3MpOwotCQl0Y3NbMl0uc2V0QXR0cmlidXRlKFRlc3RDb21tYW5kLkFUX0V4cG9ydEZvbGRlck5hbWUsICJFeHBvcnQwMDAxIik7Ci0JCQotCQl0Y3NbM10gPSBzZXJ2aWNlLm5ld1Rlc3RDb21tYW5kKFRDT3BlbkxpYnJhcnkuY2xhc3MpOwotCQl0Y3NbM10uc2V0QXR0cmlidXRlKFRlc3RDb21tYW5kLkFUX0xpYkZvbGRlck5hbWUsICJCYXNlXzEiKTsKLQkJCi0JCXRjc1s0XSA9IHNlcnZpY2UubmV3VGVzdENvbW1hbmQoVENJbXBvcnRYbWwuY2xhc3MpOwotCQl0Y3NbNF0uc2V0QXR0cmlidXRlKFRlc3RDb21tYW5kLkFUX0ltcG9ydEZvbGRlck5hbWUsICJFeHBvcnQwMDAxIik7Ci0JCQotCQl0Y3NbNV0gPSBzZXJ2aWNlLm5ld1Rlc3RDb21tYW5kKFRDQ29tcGFyZVRvTGlicmFyeS5jbGFzcyk7Ci0JCXRjc1s1XS5zZXRBdHRyaWJ1dGUoVGVzdENvbW1hbmQuQVRfR29sZGVuTGliRm9sZGVyTmFtZSwgIlBhcmlzIik7CQkKLQkJdGNzWzVdLnNldEF0dHJpYnV0ZShUZXN0Q29tbWFuZC5BVF9EaWZmQ291bnQsICIyOCIpOwotCQl0Y3NbNV0uc2V0QXR0cmlidXRlKFRlc3RDb21tYW5kLkFUX0VsZW1lbnRDb3VudCwgIjM3MCIpOwotCQl0Y3NbNV0uc2V0QXR0cmlidXRlKFRlc3RDb21tYW5kLkFUX1VzZU5hbWVBc0lkLCAidHJ1ZSIpOwotCQkKLQkJYm9vbGVhbiBwYXNzaW5nID0gdHJ1ZTsKLQkJZm9yIChpbnQgaT0wOyBpPHRjcy5sZW5ndGg7IGkrKykgewotCQkJVENFeGVSZXBseSByZXBseSA9IHRjc1tpXS5leGVjdXRlKCk7Ci0JCQlpZiAocmVwbHkgIT0gbnVsbCAmJiAhIHJlcGx5LnBhc3NpbmcoKSkgewotCQkJCXBhc3NpbmcgPSBmYWxzZTsKLQkJCX0JCQkJCi0JCX0KLQkJZ2V0T3duZXIoKS5hc3NlcnRUcnVlKHBhc3NpbmcpOwotCQkKLQkJcmV0dXJuIHBhc3Npbmc7Ci0JfQkJCQotCQotfQpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0cy92YWxpZGF0aW9uL0NpcmN1bGFyRGVwZW5kZW5jeUNoZWNrLmphdmEgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3RzL3ZhbGlkYXRpb24vQ2lyY3VsYXJEZXBlbmRlbmN5Q2hlY2suamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2Y3NThjZi4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3RzL3ZhbGlkYXRpb24vQ2lyY3VsYXJEZXBlbmRlbmN5Q2hlY2suamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzLnZhbGlkYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXIuTGlicmFyeUp1bml0VGVzdFNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmlmYWNlLlRDRXhlUmVwbHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmlmYWNlLlRlc3RDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5pbXBsLkV4cG9ydEltcG9ydFRlc3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5pbXBsLnRlc3Rjb21tYW5kcy5UQ05ld01ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmltcGwudGVzdGNvbW1hbmRzLlRDT3BlbkxpYnJhcnk7Ci0KLS8qKgotICogSlVuaXQgdGVzdHMgZm9yIHBsdWdpbiBleHBvcnQvaW1wb3J0Ci0gKiAKLSAqIEBhdXRob3IgV2VpcGluZyBMdQotICogQHNpbmNlIDEuMAotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBDaXJjdWxhckRlcGVuZGVuY3lDaGVjayBleHRlbmRzIEV4cG9ydEltcG9ydFRlc3RJbXBsIHsKLQotCXB1YmxpYyBDaXJjdWxhckRlcGVuZGVuY3lDaGVjayhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9CQotCQkKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwkJCi0JCWVuZFNldFVwKCk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSN0ZWFyRG93bigpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIudGVhckRvd24oKTsKLQkJZW5kVGVhckRvd24oKTsKLQl9CQotCQotCXB1YmxpYyBpbnQgbnVtVGVzdENhc2VzKCkgewotCQlyZXR1cm4gMTsKLQl9CQotCQotCXB1YmxpYyB2b2lkIHRlc3QwMDAxXzE2OTUwMSgpIHsKLQkJTGlicmFyeUp1bml0VGVzdFNlcnZpY2Ugc2VydmljZSA9IGdldFNlcnZpY2UoKTsKLQkJCi0JCVRlc3RDb21tYW5kIHRjc1tdID0gbmV3IFRlc3RDb21tYW5kWzhdOwotCQkKLQkJdGNzWzBdID0gc2VydmljZS5uZXdUZXN0Q29tbWFuZChUQ09wZW5MaWJyYXJ5LmNsYXNzKTsKLQkJdGNzWzBdLnNldEF0dHJpYnV0ZShUZXN0Q29tbWFuZC5BVF9MaWJGb2xkZXJOYW1lLCAiMTY5NTAxIik7Ci0JCQotLyoJCXRjc1sxXSA9IHNlcnZpY2UubmV3VGVzdENvbW1hbmQoVENOZXdNZXRob2RFbGVtZW50LmNsYXNzKTsKLQkJdGNzWzFdLnNldEF0dHJpYnV0ZShUZXN0Q29tbWFuZC5BVF9UeXBlLCAiTWV0aG9kUGx1Z2luIik7Ci0JCXRjc1sxXS5zZXRBdHRyaWJ1dGUoVGVzdENvbW1hbmQuQVRfTmFtZSwgIlBsdWcgQSIpOwkqLwkJCQkJCQkJCQkJCi0JCQotCQlib29sZWFuIHBhc3NpbmcgPSB0cnVlOwotCQlmb3IgKGludCBpPTA7IGk8dGNzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAodGNzW2ldICE9IG51bGwpIHsKLQkJCQlUQ0V4ZVJlcGx5IHJlcGx5ID0gdGNzW2ldLmV4ZWN1dGUoKTsKLQkJCQlpZiAocmVwbHkgIT0gbnVsbCAmJiAhIHJlcGx5LnBhc3NpbmcoKSkgewotCQkJCQlwYXNzaW5nID0gZmFsc2U7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWFzc2VydFRydWUocGFzc2luZyk7Ci0JfQkKLQkKLX0KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdHMvdmFsaWRhdGlvbi9WYWxpZGF0aW9uVGVzdEltcGwuamF2YSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdHMvdmFsaWRhdGlvbi9WYWxpZGF0aW9uVGVzdEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDNiNzNmNy4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3RzL3ZhbGlkYXRpb24vVmFsaWRhdGlvblRlc3RJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy52YWxpZGF0aW9uOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5EYXRlOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXIuaW1wbC5MaWJyYXJ5SnVuaXRUZXN0SW1wbDsKLQotaW1wb3J0IGNvbS5pYm0uaWN1LnRleHQuU2ltcGxlRGF0ZUZvcm1hdDsKLQotLyoqCi0gKiBKVW5pdCB0ZXN0cyBmb3IgcGx1Z2luIGV4cG9ydC9pbXBvcnQKLSAqIAotICogQGF1dGhvciBXZWlwaW5nIEx1Ci0gKiBAc2luY2UgMS4wCi0gKiAKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFZhbGlkYXRpb25UZXN0SW1wbCBleHRlbmRzIExpYnJhcnlKdW5pdFRlc3RJbXBsIHsKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgc291cmNlRm9sZGVyTmFtZSA9ICJWYWxpZGF0aW9uIjsKLQlwcml2YXRlIHN0YXRpYyAgRmlsZSB0ZXN0Um9vdFNvdXJjZTsKLQotCXByaXZhdGUgc3RhdGljIE1hcCB0ZXN0Um9vdFdvcmtpbmdNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQotCXByaXZhdGUgRmlsZSBkZWZhdWx0VGVzdERpcjsgCi0JCi0JcHVibGljIFZhbGlkYXRpb25UZXN0SW1wbChTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN5bmNocm9uaXplZCBGaWxlIGdldFRlc3RSb290U291cmNlKCkgewotCQlpZiAodGVzdFJvb3RTb3VyY2UgPT0gbnVsbCkgewotCQkJU3RyaW5nIHBhdGggPSBnZXRTZXJ2aWNlKCkuZ2V0VG9wVGVzdFJvb3RTb3VyY2UoKS5nZXRBYnNvbHV0ZVBhdGgoKTsKLQkJCXBhdGggKz0gRmlsZS5zZXBhcmF0b3IgKyBzb3VyY2VGb2xkZXJOYW1lICsgIEZpbGUuc2VwYXJhdG9yOwotCQkJdGVzdFJvb3RTb3VyY2UgPSBuZXcgRmlsZShwYXRoKTsKLQkJfQotCQlyZXR1cm4gdGVzdFJvb3RTb3VyY2U7Ci0JfQotCQotCXByb3RlY3RlZCBzeW5jaHJvbml6ZWQgRmlsZSBnZXRUZXN0Um9vdFdvcmtpbmcoKSB7Ci0JCUZpbGUgdGVzdFJvb3RXb3JraW5nID0gKEZpbGUpIHRlc3RSb290V29ya2luZ01hcC5nZXQoZ2V0Q2xhc3MoKSk7Ci0JCWlmICh0ZXN0Um9vdFdvcmtpbmcgPT0gbnVsbCkgewotCQkJQ2xhc3MgY2xzID0gZ2V0Q2xhc3MoKTsKLQkJCVN0cmluZyBwYWNrYWdlTmFtZSA9IGNscy5nZXRQYWNrYWdlKCkuZ2V0TmFtZSgpOwotCQkJCi0JCQlTaW1wbGVEYXRlRm9ybWF0IHNkZiA9IG5ldyBTaW1wbGVEYXRlRm9ybWF0KCJ5eXl5LU1NLWRkIGhoOm1tOnNzOlNTUyIpOyAvLyROT04tTkxTLTEkCi0JCQlTdHJpbmcgZHRTdHIgPSBzZGYuZm9ybWF0KG5ldyBEYXRlKCkpOwotCQkJZHRTdHIgPSBkdFN0ci5yZXBsYWNlKCcgJywgJ18nKTsKLQkJCWR0U3RyID0gZHRTdHIucmVwbGFjZSgnOicsICctJyk7Ci0JCQkKLQkJCVN0cmluZyBwYXRoID0gZ2V0U2VydmljZSgpLmdldFRlc3RHcm91cCgpLmdldEFic29sdXRlUGF0aCgpOwotCQkJcGF0aCArPSBGaWxlLnNlcGFyYXRvciArIGNscy5nZXROYW1lKCkuc3Vic3RyaW5nKHBhY2thZ2VOYW1lLmxlbmd0aCgpICsgMSk7Ci0JCQlwYXRoICs9ICJfIiArIGR0U3RyICsgRmlsZS5zZXBhcmF0b3I7Ci0JCQl0ZXN0Um9vdFdvcmtpbmcgPSBuZXcgRmlsZShwYXRoKTsKLQkJCXRlc3RSb290V29ya2luZ01hcC5wdXQoZ2V0Q2xhc3MoKSwgdGVzdFJvb3RXb3JraW5nKTsKLQkJfQotCQlyZXR1cm4gdGVzdFJvb3RXb3JraW5nOwotCX0KLQkKLQlwcm90ZWN0ZWQgRmlsZSBnZXREZWZhdWx0VGVzdERpcigpIHsKLQkJaWYgKGRlZmF1bHRUZXN0RGlyID09IG51bGwpIHsKLQkJCVN0cmluZyBwYXRoID0gZ2V0VGVzdFJvb3RXb3JraW5nKCkuZ2V0QWJzb2x1dGVQYXRoKCkgKyBGaWxlLnNlcGFyYXRvciArIGdldE5hbWUoKTsgCi0JCQlkZWZhdWx0VGVzdERpciA9IG5ldyBGaWxlKHBhdGgpOwotCQl9Ci0JCQotCQlyZXR1cm4gZGVmYXVsdFRlc3REaXI7Ci0JfQotCQkKLX0KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdHMvdmFyaWFiaWxpdHkvQWN0aXZpdHlWYXJpYWJpbGl0eVRlc3QuamF2YSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdHMvdmFyaWFiaWxpdHkvQWN0aXZpdHlWYXJpYWJpbGl0eVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTI3YjYxOS4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3RzL3ZhcmlhYmlsaXR5L0FjdGl2aXR5VmFyaWFiaWxpdHlUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMudmFyaWFiaWxpdHk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uRGVmYXVsdEVsZW1lbnRSZWFsaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLkVsZW1lbnRSZWFsaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy5MaWJyYXJ5VGVzdEhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLkxpYnJhcnlVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BcnRpZmFjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNhcGFiaWxpdHlQYXR0ZXJuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ2hlY2tsaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiBUZXN0IGNhc2UgZm9yIGFjdGl2aXR5IHZhcmFpYmlsaXR5LgotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZpdHlWYXJpYWJpbGl0eVRlc3QgZXh0ZW5kcyBWYXJpYWJsaXR5QmFzZVRlc3RDYXNlIHsKLQotCS8qKgotCSAqIEBwYXJhbSBuYW1lCi0JICovCi0JcHVibGljIEFjdGl2aXR5VmFyaWFiaWxpdHlUZXN0KFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0X2NwX2NvbnRyaWJ1dGlvbl9mb3JfYXR0cmlidXRlcygpIHsKLQkJCi0JCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVNZXRob2RQbHVnaW4oInBsdWdpbiAxIik7Ci0JCUNvbnRlbnRQYWNrYWdlIHBrZyA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZUNvbnRlbnRQYWNrYWdlKHBsdWdpbiwgInAxIik7Ci0JCQotCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZUNvbmZpZ3VyYXRpb24oImNvbmZpZyAxIik7Ci0KLQkJLy8gbm93IGNyZWF0ZSBhIGNhcGFiaWxpdHkgcGF0dGVybgotCQlDYXBhYmlsaXR5UGF0dGVybiBjcDEgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVDYXBhYmlsaXR5UGF0dGVybihwbHVnaW4sICJDUDEiLCBjb25maWcpOwotCQkKLQkJLy8gbm93IGNyZWF0ZSBhIGNvbnRyaWJ1dGluZyBjYXBhYmlsaXR5IHBhdHRlcm4KLQkJQ2FwYWJpbGl0eVBhdHRlcm4gY3AyID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlQ2FwYWJpbGl0eVBhdHRlcm4ocGx1Z2luLCAiQ1AyIiwgY29uZmlnKTsKLQkJCi0JCUxpYnJhcnlUZXN0SGVscGVyLnNldENvbnRyaWJ1dGVzKGNwMiwgY3AxKTsKLQkJCi0JCS8vIHVwZGF0ZSB0aGUgY29uZmlndXJhdGlvbgotCQljb25maWcuZ2V0TWV0aG9kUGx1Z2luU2VsZWN0aW9uKCkuYWRkKHBsdWdpbik7Ci0JCWNvbmZpZy5nZXRNZXRob2RQYWNrYWdlU2VsZWN0aW9uKCkuYWRkKHBrZyk7Ci0JCWNvbmZpZy5nZXRNZXRob2RQYWNrYWdlU2VsZWN0aW9uKCkuYWRkKChQcm9jZXNzQ29tcG9uZW50KWNwMS5lQ29udGFpbmVyKCkpOwotCQljb25maWcuZ2V0TWV0aG9kUGFja2FnZVNlbGVjdGlvbigpLmFkZCgoUHJvY2Vzc0NvbXBvbmVudCljcDIuZUNvbnRhaW5lcigpKTsKLQkJCi0JCUxpYnJhcnlVdGlsLnZhbGlkYXRlTWV0aG9kQ29uZmlndXJhdGlvbihjb25maWcpOwkKLQkJCi0JCWZpbmFsIFN0cmluZyBjcDFfdGV4dCA9ICJjcDEgbWFpbiBkZXNjIjsKLQkJZmluYWwgU3RyaW5nIGNwMl90ZXh0ID0gImNwMiBtYWluIGRlc2MiOwotCQkJCi0JCWNwMS5nZXRQcmVzZW50YXRpb24oKS5zZXRNYWluRGVzY3JpcHRpb24oY3AxX3RleHQpOwotCQljcDIuZ2V0UHJlc2VudGF0aW9uKCkuc2V0TWFpbkRlc2NyaXB0aW9uKGNwMl90ZXh0KTsKLQkJCi0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29udGVudERlc2NyaXB0aW9uX01haW5EZXNjcmlwdGlvbigpOwotCQlTdHJpbmcgIHRleHQgPSAoU3RyaW5nKUNvbmZpZ3VyYXRpb25IZWxwZXIuY2FsY0F0dHJpYnV0ZUZlYXR1cmVWYWx1ZShjcDEuZ2V0UHJlc2VudGF0aW9uKCksIGNwMSwgZmVhdHVyZSwgY29uZmlnKTsKLQkJaW50IGkxID0gdGV4dC5pbmRleE9mKGNwMV90ZXh0KTsKLQkJaW50IGkyID0gdGV4dC5pbmRleE9mKGNwMl90ZXh0KTsKLQkJYXNzZXJ0VHJ1ZShpMSA+PSAwICk7Ci0JCWFzc2VydFRydWUoaTIgPiBpMSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RfY3BfY29udHJpYnV0aW9uX2Zvcl9ndWlkYW5jZXMoKSB7Ci0JCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVNZXRob2RQbHVnaW4oInBsdWdpbiAxIik7Ci0JCUNvbnRlbnRQYWNrYWdlIHBrZyA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZUNvbnRlbnRQYWNrYWdlKHBsdWdpbiwgInAxIik7Ci0JCUNoZWNrbGlzdCBjazEgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVDaGVja2xpc3QocGtnLCAiY2sxIik7Ci0JCUNoZWNrbGlzdCBjazIgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVDaGVja2xpc3QocGtnLCAiY2syIik7Ci0KLQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVDb25maWd1cmF0aW9uKCJjb25maWcgMSIpOwotCi0JCS8vIG5vdyBjcmVhdGUgYSBjYXBhYmlsaXR5IHBhdHRlcm4KLQkJQ2FwYWJpbGl0eVBhdHRlcm4gY3AxID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlQ2FwYWJpbGl0eVBhdHRlcm4ocGx1Z2luLCAiQ1AxIiwgY29uZmlnKTsKLQkJY3AxLmdldENoZWNrbGlzdHMoKS5hZGQoY2sxKTsKLQkJCi0JCS8vIG5vdyBjcmVhdGUgYSBjb250cmlidXRpbmcgY2FwYWJpbGl0eSBwYXR0ZXJuCi0JCUNhcGFiaWxpdHlQYXR0ZXJuIGNwMiA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZUNhcGFiaWxpdHlQYXR0ZXJuKHBsdWdpbiwgIkNQMiIsIGNvbmZpZyk7Ci0JCWNwMi5nZXRDaGVja2xpc3RzKCkuYWRkKGNrMik7Ci0JCQotCQlMaWJyYXJ5VGVzdEhlbHBlci5zZXRDb250cmlidXRlcyhjcDIsIGNwMSk7Ci0JCQotCQkvLyB1cGRhdGUgdGhlIGNvbmZpZ3VyYXRpb24KLQkJY29uZmlnLmdldE1ldGhvZFBsdWdpblNlbGVjdGlvbigpLmFkZChwbHVnaW4pOwotCQljb25maWcuZ2V0TWV0aG9kUGFja2FnZVNlbGVjdGlvbigpLmFkZChwa2cpOwotCQljb25maWcuZ2V0TWV0aG9kUGFja2FnZVNlbGVjdGlvbigpLmFkZCgoUHJvY2Vzc0NvbXBvbmVudCljcDEuZUNvbnRhaW5lcigpKTsKLQkJY29uZmlnLmdldE1ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKS5hZGQoKFByb2Nlc3NDb21wb25lbnQpY3AyLmVDb250YWluZXIoKSk7Ci0JCQotCQlMaWJyYXJ5VXRpbC52YWxpZGF0ZU1ldGhvZENvbmZpZ3VyYXRpb24oY29uZmlnKTsJCi0JCUVsZW1lbnRSZWFsaXplciByZWFsaXplciA9IERlZmF1bHRFbGVtZW50UmVhbGl6ZXIubmV3RWxlbWVudFJlYWxpemVyKGNvbmZpZyk7Ci0JCQotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEJyZWFrZG93bkVsZW1lbnRfQ2hlY2tsaXN0cygpOwotCQlMaXN0IGl0ZW1zID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMG5GZWF0dXJlVmFsdWUoY3AxLCBmZWF0dXJlLCByZWFsaXplcik7Ci0JCWFzc2VydEVxdWFscygyLCBpdGVtcy5zaXplKCkpOwkJCi0JCWFzc2VydFRydWUoaXRlbXMuY29udGFpbnMoY2sxKSk7Ci0JCWFzc2VydFRydWUoaXRlbXMuY29udGFpbnMoY2syKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RfY3BfY29udHJpYnV0aW9uX2Zvcl9icmVha2Rvd25FbGVtZW50cygpIHsKLQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZU1ldGhvZFBsdWdpbigicGx1Z2luIDEiKTsKLQkJQ29udGVudFBhY2thZ2UgcGtnID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlQ29udGVudFBhY2thZ2UocGx1Z2luLCAicDEiKTsKLQkJCi0JCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlQ29uZmlndXJhdGlvbigiY29uZmlnIDEiKTsKLQotCQkvLyBub3cgY3JlYXRlIGEgY2FwYWJpbGl0eSBwYXR0ZXJuCi0JCUNhcGFiaWxpdHlQYXR0ZXJuIGNwMSA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZUNhcGFiaWxpdHlQYXR0ZXJuKHBsdWdpbiwgIkNQMSIsIGNvbmZpZyk7Ci0JCUFjdGl2aXR5IGFjdDEgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVBY3Rpdml0eShwbHVnaW4sIGNwMSwgImFjdDEiLCBudWxsKTsKLQkJCi0JCS8vIG5vdyBjcmVhdGUgYSBjb250cmlidXRpbmcgY2FwYWJpbGl0eSBwYXR0ZXJuCi0JCUNhcGFiaWxpdHlQYXR0ZXJuIGNwMiA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZUNhcGFiaWxpdHlQYXR0ZXJuKHBsdWdpbiwgIkNQMiIsIGNvbmZpZyk7Ci0JCUFjdGl2aXR5IGFjdDIgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVBY3Rpdml0eShwbHVnaW4sIGNwMiwgImFjdDIiLCBudWxsKTsKLQkJCi0JCUxpYnJhcnlUZXN0SGVscGVyLnNldENvbnRyaWJ1dGVzKGNwMiwgY3AxKTsKLQkJCi0JCS8vIHVwZGF0ZSB0aGUgY29uZmlndXJhdGlvbgotCQljb25maWcuZ2V0TWV0aG9kUGx1Z2luU2VsZWN0aW9uKCkuYWRkKHBsdWdpbik7Ci0JCWNvbmZpZy5nZXRNZXRob2RQYWNrYWdlU2VsZWN0aW9uKCkuYWRkKHBrZyk7Ci0JCWNvbmZpZy5nZXRNZXRob2RQYWNrYWdlU2VsZWN0aW9uKCkuYWRkKChQcm9jZXNzQ29tcG9uZW50KWNwMS5lQ29udGFpbmVyKCkpOwotCQljb25maWcuZ2V0TWV0aG9kUGFja2FnZVNlbGVjdGlvbigpLmFkZCgoUHJvY2Vzc0NvbXBvbmVudCljcDIuZUNvbnRhaW5lcigpKTsKLQkJCi0JCUxpYnJhcnlVdGlsLnZhbGlkYXRlTWV0aG9kQ29uZmlndXJhdGlvbihjb25maWcpOwkKLQkJRWxlbWVudFJlYWxpemVyIHJlYWxpemVyID0gRGVmYXVsdEVsZW1lbnRSZWFsaXplci5uZXdFbGVtZW50UmVhbGl6ZXIoY29uZmlnKTsKLQkJCi0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QWN0aXZpdHlfQnJlYWtkb3duRWxlbWVudHMoKTsKLQkJTGlzdCBpdGVtcyA9IENvbmZpZ3VyYXRpb25IZWxwZXIuY2FsYzBuRmVhdHVyZVZhbHVlKGNwMSwgZmVhdHVyZSwgcmVhbGl6ZXIpOwotCQlhc3NlcnRFcXVhbHMoMiwgaXRlbXMuc2l6ZSgpKTsJCQotCQlhc3NlcnRUcnVlKGl0ZW1zLmNvbnRhaW5zKGFjdDEpKTsKLQkJYXNzZXJ0VHJ1ZShpdGVtcy5jb250YWlucyhhY3QyKSk7Ci0JfQotCQotCQotCXB1YmxpYyB2b2lkIHRlc3RfYWN0aXZpdHlfYnJlYWtkb3duRWxlbWVudHNfd2l0aF9jb250cmlidXRvcigpIHsKLQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZU1ldGhvZFBsdWdpbigicGx1Z2luIDEiKTsKLQkJQ29udGVudFBhY2thZ2UgcGtnID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlQ29udGVudFBhY2thZ2UocGx1Z2luLCAicDEiKTsKLQkJCi0JCS8vIGZpcnN0IHNldCBvZiB0YXNrLCByb2xlLCB3cHMKLQkJVGFzayB0MSA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZVRhc2socGtnLCAidDEiKTsKLQkJUm9sZSByMSA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZVJvbGUocGtnLCAidDEiKTsKLQkJQXJ0aWZhY3QgYTFfMSA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZUFydGlmYWN0KHBrZywgImExMSIpOwotCQlBcnRpZmFjdCBhMV8yID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlQXJ0aWZhY3QocGtnLCAiYTEyIik7Ci0JCXQxLmdldFBlcmZvcm1lZEJ5KCkuYWRkKHIxKTsKLQkJdDEuZ2V0TWFuZGF0b3J5SW5wdXQoKS5hZGQoYTFfMSk7Ci0JCXQxLmdldE1hbmRhdG9yeUlucHV0KCkuYWRkKGExXzIpOwotCQl0MS5nZXRPdXRwdXQoKS5hZGQoYTFfMik7Ci0JCXIxLmdldFJlc3BvbnNpYmxlRm9yKCkuYWRkKGExXzEpOwotCQkKLQkJLy8gc2Vjb25kIHNldCBvZiB0YXNrLCByb2xlLCB3cHMKLQkJVGFzayB0MiA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZVRhc2socGtnLCAidDIiKTsKLQkJUm9sZSByMiA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZVJvbGUocGtnLCAidDIiKTsKLQkJQXJ0aWZhY3QgYTJfMSA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZUFydGlmYWN0KHBrZywgImEyMSIpOwotCQlBcnRpZmFjdCBhMl8yID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlQXJ0aWZhY3QocGtnLCAiYTIyIik7Ci0JCXQyLmdldFBlcmZvcm1lZEJ5KCkuYWRkKHIyKTsKLQkJdDIuZ2V0TWFuZGF0b3J5SW5wdXQoKS5hZGQoYTJfMSk7Ci0JCXQyLmdldE1hbmRhdG9yeUlucHV0KCkuYWRkKGEyXzIpOwotCQl0Mi5nZXRPdXRwdXQoKS5hZGQoYTJfMik7Ci0JCXIyLmdldFJlc3BvbnNpYmxlRm9yKCkuYWRkKGEyXzEpOwotCi0JCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlQ29uZmlndXJhdGlvbigiY29uZmlnIDEiKTsKLQotCQkvLyBub3cgY3JlYXRlIGEgY2FwYWJpbGl0eSBwYXR0ZXJuCi0JCUNhcGFiaWxpdHlQYXR0ZXJuIGNwMSA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZUNhcGFiaWxpdHlQYXR0ZXJuKHBsdWdpbiwgIkNQMSIsIGNvbmZpZyk7Ci0JCUFjdGl2aXR5IGFjdDEgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVBY3Rpdml0eShwbHVnaW4sIGNwMSwgImFjdDEiLCBuZXcgVGFza1tde3QxfSk7Ci0JCQotCQkvLyBub3cgY3JlYXRlIGEgY29udHJpYnV0aW5nIGNhcGFiaWxpdHkgcGF0dGVybgotCQlDYXBhYmlsaXR5UGF0dGVybiBjcDIgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVDYXBhYmlsaXR5UGF0dGVybihwbHVnaW4sICJDUDIiLCBjb25maWcpOwotCQlBY3Rpdml0eSBhY3QyID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlQWN0aXZpdHkocGx1Z2luLCBjcDEsICJhY3QyIiwgbmV3IFRhc2tbXXt0Mn0pOwotCQkKLQkJTGlicmFyeVRlc3RIZWxwZXIuc2V0Q29udHJpYnV0ZXMoY3AyLCBjcDEpOwotCQkKLQkJLy8gdXBkYXRlIHRoZSBjb25maWd1cmF0aW9uCi0JCWNvbmZpZy5nZXRNZXRob2RQbHVnaW5TZWxlY3Rpb24oKS5hZGQocGx1Z2luKTsKLQkJY29uZmlnLmdldE1ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKS5hZGQocGtnKTsKLQkJY29uZmlnLmdldE1ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKS5hZGQoKFByb2Nlc3NDb21wb25lbnQpY3AxLmVDb250YWluZXIoKSk7Ci0JCWNvbmZpZy5nZXRNZXRob2RQYWNrYWdlU2VsZWN0aW9uKCkuYWRkKChQcm9jZXNzQ29tcG9uZW50KWNwMi5lQ29udGFpbmVyKCkpOwotCQlMaWJyYXJ5VXRpbC52YWxpZGF0ZU1ldGhvZENvbmZpZ3VyYXRpb24oY29uZmlnKTsJCi0JCUVsZW1lbnRSZWFsaXplciByZWFsaXplciA9IERlZmF1bHRFbGVtZW50UmVhbGl6ZXIubmV3RWxlbWVudFJlYWxpemVyKGNvbmZpZyk7Ci0JCQotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEFjdGl2aXR5X0JyZWFrZG93bkVsZW1lbnRzKCk7Ci0JCUxpc3QgaXRlbXMgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwbkZlYXR1cmVWYWx1ZShjcDEsIGZlYXR1cmUsIHJlYWxpemVyKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGl0ZW1zLnNpemUoKSk7CQkKLQkJYXNzZXJ0VHJ1ZShpdGVtcy5jb250YWlucyhhY3QxKSk7Ci0JCWFzc2VydFRydWUoaXRlbXMuY29udGFpbnMoYWN0MikpOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdHMvdmFyaWFiaWxpdHkvQXR0cmlidXRlRmVhdHVyZVRlc3QuamF2YSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdHMvdmFyaWFiaWxpdHkvQXR0cmlidXRlRmVhdHVyZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmUzMzg4NS4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3RzL3ZhcmlhYmlsaXR5L0F0dHJpYnV0ZUZlYXR1cmVUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMudmFyaWFiaWxpdHk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLkRlZmF1bHRFbGVtZW50UmVhbGl6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5FbGVtZW50UmVhbGl6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMuTGlicmFyeVRlc3RIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5MaWJyYXJ5VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIFRlc3QgY2FzZSBmb3IgYXR0cmlidXRlIGZlYXR1cmUgdmFyYWliaWxpdHkuCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBBdHRyaWJ1dGVGZWF0dXJlVGVzdCBleHRlbmRzIFZhcmlhYmxpdHlCYXNlVGVzdENhc2UgewotCi0JLyoqCi0JICogQHBhcmFtIG5hbWUKLQkgKi8KLQlwdWJsaWMgQXR0cmlidXRlRmVhdHVyZVRlc3QoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdF90YXNrX21haW5EZXNjcmlwdGlvbl93aXRoX2NvbnRyaWJ1dG9ycygpIHsKLQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZU1ldGhvZFBsdWdpbigicGx1Z2luIDEiKTsKLQkJQ29udGVudFBhY2thZ2UgcGtnID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlQ29udGVudFBhY2thZ2UocGx1Z2luLCAicDEiKTsKLQkJVGFzayB0MSA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZVRhc2socGtnLCAidDEiKTsKLQkJVGFzayB0MiA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZVRhc2socGtnLCAidDIiKTsKLQkJVGFzayB0MyA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZVRhc2socGtnLCAidDMiKTsKLQkJCQkKLQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVDb25maWd1cmF0aW9uKCJjb25maWcgMSIpOwotCQljb25maWcuZ2V0TWV0aG9kUGx1Z2luU2VsZWN0aW9uKCkuYWRkKHBsdWdpbik7Ci0JCWNvbmZpZy5nZXRNZXRob2RQYWNrYWdlU2VsZWN0aW9uKCkuYWRkKHBrZyk7Ci0JCUxpYnJhcnlVdGlsLnZhbGlkYXRlTWV0aG9kQ29uZmlndXJhdGlvbihjb25maWcpOwkKLQkJCi0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29udGVudERlc2NyaXB0aW9uX01haW5EZXNjcmlwdGlvbigpOwotCQlTdHJpbmcgdGV4dDsKLQkJCi0JCWZpbmFsIFN0cmluZyB0MXRleHQgPSAiLS10MSB0ZXh0LS0iOwotCQlmaW5hbCBTdHJpbmcgdDJ0ZXh0ID0gIi0tdDIgdGV4dC0tIjsKLQkJZmluYWwgU3RyaW5nIHQzdGV4dCA9ICItLXQzIHRleHQtLSI7Ci0JCQotCQl0MS5nZXRQcmVzZW50YXRpb24oKS5zZXRNYWluRGVzY3JpcHRpb24odDF0ZXh0KTsKLQkJdDIuZ2V0UHJlc2VudGF0aW9uKCkuc2V0TWFpbkRlc2NyaXB0aW9uKHQydGV4dCk7Ci0JCXQzLmdldFByZXNlbnRhdGlvbigpLnNldE1haW5EZXNjcmlwdGlvbih0M3RleHQpOwotCQkKLQkJdGV4dCA9IChTdHJpbmcpQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjQXR0cmlidXRlRmVhdHVyZVZhbHVlKHQxLmdldFByZXNlbnRhdGlvbigpLCB0MSwgZmVhdHVyZSwgY29uZmlnKTsKLQkJYXNzZXJ0RXF1YWxzKHQxdGV4dCwgdGV4dCk7Ci0JCQotCQlMaWJyYXJ5VGVzdEhlbHBlci5zZXRDb250cmlidXRlcyh0MiwgdDEpOwotCQl0ZXh0ID0gKFN0cmluZylDb25maWd1cmF0aW9uSGVscGVyLmNhbGNBdHRyaWJ1dGVGZWF0dXJlVmFsdWUodDEuZ2V0UHJlc2VudGF0aW9uKCksIHQxLCBmZWF0dXJlLCBjb25maWcpOwotCQlhc3NlcnRUcnVlKHRleHQgIT0gbnVsbCAKLQkJCQkmJiB0ZXh0LmluZGV4T2YodDF0ZXh0KSA+PSAwIAotCQkJCSYmIHRleHQuaW5kZXhPZih0MnRleHQpID49IDAgKTsKLQkJCi0JCUxpYnJhcnlUZXN0SGVscGVyLnNldENvbnRyaWJ1dGVzKHQzLCB0MSk7Ci0JCXRleHQgPSAoU3RyaW5nKUNvbmZpZ3VyYXRpb25IZWxwZXIuY2FsY0F0dHJpYnV0ZUZlYXR1cmVWYWx1ZSh0MS5nZXRQcmVzZW50YXRpb24oKSwgdDEsIGZlYXR1cmUsIGNvbmZpZyk7Ci0JCWFzc2VydFRydWUodGV4dCAhPSBudWxsIAotCQkJCSYmIHRleHQuaW5kZXhPZih0MXRleHQpID49IDAgCi0JCQkJJiYgdGV4dC5pbmRleE9mKHQydGV4dCkgPj0gMCAKLQkJCQkmJiB0ZXh0LmluZGV4T2YodDN0ZXh0KSA+PSAwICk7Ci0KLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdF90YXNrX21haW5EZXNjcmlwdGlvbl93aXRoX3JlcGxhY2VycygpIHsKLQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZU1ldGhvZFBsdWdpbigicGx1Z2luIDEiKTsKLQkJQ29udGVudFBhY2thZ2UgcGtnID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlQ29udGVudFBhY2thZ2UocGx1Z2luLCAicDEiKTsKLQkJVGFzayB0MSA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZVRhc2socGtnLCAidDEiKTsKLQkJVGFzayB0MiA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZVRhc2socGtnLCAidDIiKTsKLQkJVGFzayB0MyA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZVRhc2socGtnLCAidDMiKTsKLQkJCQkKLQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVDb25maWd1cmF0aW9uKCJjb25maWcgMSIpOwotCQljb25maWcuZ2V0TWV0aG9kUGx1Z2luU2VsZWN0aW9uKCkuYWRkKHBsdWdpbik7Ci0JCWNvbmZpZy5nZXRNZXRob2RQYWNrYWdlU2VsZWN0aW9uKCkuYWRkKHBrZyk7Ci0JCUxpYnJhcnlVdGlsLnZhbGlkYXRlTWV0aG9kQ29uZmlndXJhdGlvbihjb25maWcpOwkKLQkJRWxlbWVudFJlYWxpemVyIHJlYWxpemVyID0gRGVmYXVsdEVsZW1lbnRSZWFsaXplci5uZXdFbGVtZW50UmVhbGl6ZXIoY29uZmlnKTsKLQotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbnRlbnREZXNjcmlwdGlvbl9NYWluRGVzY3JpcHRpb24oKTsKLQkJU3RyaW5nIHRleHQ7Ci0JCVRhc2sgdDsKLQkJCi0JCWZpbmFsIFN0cmluZyB0MXRleHQgPSAiLS10MSB0ZXh0LS0iOwotCQlmaW5hbCBTdHJpbmcgdDJ0ZXh0ID0gIi0tdDIgdGV4dC0tIjsKLQkJZmluYWwgU3RyaW5nIHQzdGV4dCA9ICItLXQzIHRleHQtLSI7Ci0JCQotCQl0MS5nZXRQcmVzZW50YXRpb24oKS5zZXRNYWluRGVzY3JpcHRpb24odDF0ZXh0KTsKLQkJdDIuZ2V0UHJlc2VudGF0aW9uKCkuc2V0TWFpbkRlc2NyaXB0aW9uKHQydGV4dCk7Ci0JCXQzLmdldFByZXNlbnRhdGlvbigpLnNldE1haW5EZXNjcmlwdGlvbih0M3RleHQpOwotCQkKLQkJLy8gMQotCQlMaWJyYXJ5VGVzdEhlbHBlci5zZXRSZXBsYWNlcyh0MiwgdDEpOwotCQl0ID0gKFRhc2spQ29uZmlndXJhdGlvbkhlbHBlci5nZXRDYWxjdWxhdGVkRWxlbWVudCh0MSwgcmVhbGl6ZXIpOwotCQlhc3NlcnRFcXVhbHModDIsIHQpOyAgLy8gaWYgdGhpcyBmYWlsLCB0aGUgcmVtYWluaW5nIGNvZGUgd2lsbCBub3QgYmUgZXhlY3V0ZWQKLQotCQl0ZXh0ID0gKFN0cmluZylDb25maWd1cmF0aW9uSGVscGVyLmNhbGNBdHRyaWJ1dGVGZWF0dXJlVmFsdWUodC5nZXRQcmVzZW50YXRpb24oKSwgdCwgZmVhdHVyZSwgY29uZmlnKTsKLQkJYXNzZXJ0RXF1YWxzKHQydGV4dCwgdGV4dCk7Ci0JCQotCQkvLyAyCi0JCUxpYnJhcnlUZXN0SGVscGVyLnNldFJlcGxhY2VzKHQzLCB0Mik7Ci0JCXQgPSAoVGFzaylDb25maWd1cmF0aW9uSGVscGVyLmdldENhbGN1bGF0ZWRFbGVtZW50KHQxLCByZWFsaXplcik7Ci0JCWFzc2VydEVxdWFscyh0MywgdCk7ICAvLyBpZiB0aGlzIGZhaWwsIHRoZSByZW1haW5pbmcgY29kZSB3aWxsIG5vdCBiZSBleGVjdXRlZAotCi0JCXRleHQgPSAoU3RyaW5nKUNvbmZpZ3VyYXRpb25IZWxwZXIuY2FsY0F0dHJpYnV0ZUZlYXR1cmVWYWx1ZSh0LmdldFByZXNlbnRhdGlvbigpLCB0LCBmZWF0dXJlLCBjb25maWcpOwotCQlhc3NlcnRFcXVhbHModDN0ZXh0LCB0ZXh0KTsKLQotCQkvLyAzCi0JCUxpYnJhcnlUZXN0SGVscGVyLnNldFJlcGxhY2VzKHQzLCB0MSk7Ci0JCXQgPSAoVGFzaylDb25maWd1cmF0aW9uSGVscGVyLmdldENhbGN1bGF0ZWRFbGVtZW50KHQxLCByZWFsaXplcik7Ci0JCWFzc2VydEVxdWFscyh0MSwgdCk7ICAvLyBpZiB0aGlzIGZhaWwsIHRoZSByZW1haW5pbmcgY29kZSB3aWxsIG5vdCBiZSBleGVjdXRlZAotCi0JCXRleHQgPSAoU3RyaW5nKUNvbmZpZ3VyYXRpb25IZWxwZXIuY2FsY0F0dHJpYnV0ZUZlYXR1cmVWYWx1ZSh0LmdldFByZXNlbnRhdGlvbigpLCB0LCBmZWF0dXJlLCBjb25maWcpOwotCQlhc3NlcnRFcXVhbHModDF0ZXh0LCB0ZXh0KTsKLQotCX0KLQkKLQkKLQlwdWJsaWMgdm9pZCB0ZXN0X3Rhc2tfbWFpbkRlc2NyaXB0aW9uX3dpdGhfZXh0ZW5kZXJzKCkgewotCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlTWV0aG9kUGx1Z2luKCJwbHVnaW4gMSIpOwotCQlDb250ZW50UGFja2FnZSBwa2cgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVDb250ZW50UGFja2FnZShwbHVnaW4sICJwMSIpOwotCQlUYXNrIHQxID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlVGFzayhwa2csICJ0MSIpOwotCQlUYXNrIHQyID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlVGFzayhwa2csICJ0MiIpOwotCQlUYXNrIHQzID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlVGFzayhwa2csICJ0MyIpOwotCQkJCQotCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZUNvbmZpZ3VyYXRpb24oImNvbmZpZyAxIik7Ci0JCWNvbmZpZy5nZXRNZXRob2RQbHVnaW5TZWxlY3Rpb24oKS5hZGQocGx1Z2luKTsKLQkJY29uZmlnLmdldE1ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKS5hZGQocGtnKTsKLQkJTGlicmFyeVV0aWwudmFsaWRhdGVNZXRob2RDb25maWd1cmF0aW9uKGNvbmZpZyk7CQotCQkKLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb250ZW50RGVzY3JpcHRpb25fTWFpbkRlc2NyaXB0aW9uKCk7Ci0JCVN0cmluZyB0ZXh0OwotCQkKLQkJZmluYWwgU3RyaW5nIHQxdGV4dCA9ICItLXQxIHRleHQtLSI7Ci0JCWZpbmFsIFN0cmluZyB0MnRleHQgPSAiLS10MiB0ZXh0LS0iOwotCQlmaW5hbCBTdHJpbmcgdDN0ZXh0ID0gIi0tdDMgdGV4dC0tIjsKLQkJCi0JCXQxLmdldFByZXNlbnRhdGlvbigpLnNldE1haW5EZXNjcmlwdGlvbih0MXRleHQpOwotCQl0My5nZXRQcmVzZW50YXRpb24oKS5zZXRNYWluRGVzY3JpcHRpb24odDN0ZXh0KTsKLQkKLQkJdGV4dCA9IChTdHJpbmcpQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjQXR0cmlidXRlRmVhdHVyZVZhbHVlKHQyLmdldFByZXNlbnRhdGlvbigpLCB0MiwgZmVhdHVyZSwgY29uZmlnKTsKLQkJYXNzZXJ0VHJ1ZSh0ZXh0PT1udWxsIHx8IHRleHQuZXF1YWxzKCIiKSk7Ci0JCQotCQlMaWJyYXJ5VGVzdEhlbHBlci5zZXRFeHRlbmRzKHQyLCB0MSk7Ci0JCXRleHQgPSAoU3RyaW5nKUNvbmZpZ3VyYXRpb25IZWxwZXIuY2FsY0F0dHJpYnV0ZUZlYXR1cmVWYWx1ZSh0Mi5nZXRQcmVzZW50YXRpb24oKSwgdDIsIGZlYXR1cmUsIGNvbmZpZyk7Ci0JCWFzc2VydEVxdWFscyh0MXRleHQsIHRleHQpOwotCQkKLQkJTGlicmFyeVRlc3RIZWxwZXIuc2V0RXh0ZW5kcyh0MywgdDEpOwotCQl0ZXh0ID0gKFN0cmluZylDb25maWd1cmF0aW9uSGVscGVyLmNhbGNBdHRyaWJ1dGVGZWF0dXJlVmFsdWUodDMuZ2V0UHJlc2VudGF0aW9uKCksIHQzLCBmZWF0dXJlLCBjb25maWcpOwotCQlhc3NlcnRFcXVhbHModDN0ZXh0LCB0ZXh0KTsKLQotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0X3Rhc2tfbWFpbkRlc2NyaXB0aW9uX3dpdGhfcmVwbGFjZXJfY29udHJpYnV0b3JfZXh0ZW5kZXIoKSB7Ci0JCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVNZXRob2RQbHVnaW4oInBsdWdpbiAxIik7Ci0JCUNvbnRlbnRQYWNrYWdlIHBrZyA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZUNvbnRlbnRQYWNrYWdlKHBsdWdpbiwgInAxIik7Ci0JCVRhc2sgdDEgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVUYXNrKHBrZywgInQxIik7Ci0JCVRhc2sgdDIgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVUYXNrKHBrZywgInQyIik7Ci0JCVRhc2sgdDMgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVUYXNrKHBrZywgInQzIik7Ci0JCVRhc2sgdDQgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVUYXNrKHBrZywgInQ0Iik7Ci0JCQkJCi0JCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlQ29uZmlndXJhdGlvbigiY29uZmlnIDEiKTsKLQkJY29uZmlnLmdldE1ldGhvZFBsdWdpblNlbGVjdGlvbigpLmFkZChwbHVnaW4pOwotCQljb25maWcuZ2V0TWV0aG9kUGFja2FnZVNlbGVjdGlvbigpLmFkZChwa2cpOwotCQlMaWJyYXJ5VXRpbC52YWxpZGF0ZU1ldGhvZENvbmZpZ3VyYXRpb24oY29uZmlnKTsJCi0JCUVsZW1lbnRSZWFsaXplciByZWFsaXplciA9IERlZmF1bHRFbGVtZW50UmVhbGl6ZXIubmV3RWxlbWVudFJlYWxpemVyKGNvbmZpZyk7Ci0KLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb250ZW50RGVzY3JpcHRpb25fTWFpbkRlc2NyaXB0aW9uKCk7Ci0JCVN0cmluZyB0ZXh0OwotCQlUYXNrIHQ7Ci0JCQotCQlmaW5hbCBTdHJpbmcgdDF0ZXh0ID0gIi0tdDEgdGV4dC0tIjsKLQkJZmluYWwgU3RyaW5nIHQydGV4dCA9ICItLXQyIHRleHQtLSI7Ci0JCWZpbmFsIFN0cmluZyB0M3RleHQgPSAiLS10MyB0ZXh0LS0iOwotCQlmaW5hbCBTdHJpbmcgdDR0ZXh0ID0gIi0tdDQgdGV4dC0tIjsKLQkJCi0JCXQxLmdldFByZXNlbnRhdGlvbigpLnNldE1haW5EZXNjcmlwdGlvbih0MXRleHQpOwotCQl0Mi5nZXRQcmVzZW50YXRpb24oKS5zZXRNYWluRGVzY3JpcHRpb24odDJ0ZXh0KTsKLQkJdDMuZ2V0UHJlc2VudGF0aW9uKCkuc2V0TWFpbkRlc2NyaXB0aW9uKHQzdGV4dCk7Ci0JCS8vdDQuZ2V0UHJlc2VudGF0aW9uKCkuc2V0TWFpbkRlc2NyaXB0aW9uKHQ0dGV4dCk7Ci0JCQotCQkvLyAxCi0JCUxpYnJhcnlUZXN0SGVscGVyLnNldFJlcGxhY2VzKHQyLCB0MSk7Ci0JCUxpYnJhcnlUZXN0SGVscGVyLnNldENvbnRyaWJ1dGVzKHQzLCB0MSk7Ci0JCUxpYnJhcnlUZXN0SGVscGVyLnNldEV4dGVuZHModDQsIHQxKTsKLQotCQl0ZXh0ID0gKFN0cmluZylDb25maWd1cmF0aW9uSGVscGVyLmNhbGNBdHRyaWJ1dGVGZWF0dXJlVmFsdWUodDQuZ2V0UHJlc2VudGF0aW9uKCksIHQ0LCBmZWF0dXJlLCBjb25maWcpOwotCQlhc3NlcnRFcXVhbHModDJ0ZXh0LCB0ZXh0KTsKLQkJCi0JCS8vIDIKLQkJTGlicmFyeVRlc3RIZWxwZXIuc2V0Q29udHJpYnV0ZXModDMsIHQyKTsKLQkJdGV4dCA9IChTdHJpbmcpQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjQXR0cmlidXRlRmVhdHVyZVZhbHVlKHQ0LmdldFByZXNlbnRhdGlvbigpLCB0NCwgZmVhdHVyZSwgY29uZmlnKTsKLQkJYXNzZXJ0VHJ1ZSh0ZXh0ICE9IG51bGwgCi0JCQkJJiYgdGV4dC5pbmRleE9mKHQydGV4dCkgPj0gMCAKLQkJCQkmJiB0ZXh0LmluZGV4T2YodDN0ZXh0KSA+PSAwICk7Ci0KLQkJLy8gMyBzaW5jZSB0MyBjb250cmlidXRlcyB0byB0NCwgdGhlIGF0dHJpYnV0ZSB2YWx1ZSBmcm9tIGJhc2UgaXMgbm90IGluaGVyaXRlZC4KLQkJTGlicmFyeVRlc3RIZWxwZXIuc2V0Q29udHJpYnV0ZXModDMsIHQ0KTsKLQkJdGV4dCA9IChTdHJpbmcpQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjQXR0cmlidXRlRmVhdHVyZVZhbHVlKHQ0LmdldFByZXNlbnRhdGlvbigpLCB0NCwgZmVhdHVyZSwgY29uZmlnKTsKLQkJYXNzZXJ0VHJ1ZSh0ZXh0ICE9IG51bGwgCi0JCQkJJiYgdGV4dC5pbmRleE9mKHQzdGV4dCkgPj0gMCApOwotCi0JfQotCQotfQpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0cy92YXJpYWJpbGl0eS9Db3B5cmlnaHRUZXN0LmphdmEgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3RzL3ZhcmlhYmlsaXR5L0NvcHlyaWdodFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjhmN2ZkNi4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3RzL3ZhcmlhYmlsaXR5L0NvcHlyaWdodFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxMyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy52YXJpYWJpbGl0eTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy5MaWJyYXJ5VGVzdEhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLkxpYnJhcnlVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuU3VwcG9ydGluZ01hdGVyaWFsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFzazsKLQotLyoqCi0gKiB0ZXN0IGNhc2UgZm9yIGNvcHlyaWdodCB0ZXh0IHJlYWxpemF0aW9uCi0gKiAKLSAqIFdoZW4gYSBjb250cmlidXRpbmcgZWxlbWVudCBoYXMgYSBjb3B5cmlnaHQsIAotICogaXQgc2hvdWxkIGJlIGFwcGVuZGVkIHRvIHRoZSBjb3B5cmlnaHQgb2YgdGhlIHBhcmVudCBlbGVtZW50IG9uIHRoZSBmaW5hbCBwdWJsaXNoZWQgcGFnZS4KLQotCUFsc28sIHdoZW4gYW4gZXh0ZW5kaW5nIGVsZW1lbnQgaGFzIGEgY29weXJpZ2h0LCAKLQl0aGUgcHVibGlzaGVkIHBhZ2UgZm9yIHRoZSBleHRlbmRpbmcgZWxlbWVudCBzaG91bGQgCi0JaGF2ZSB0aGUgcGFyZW50IGVsZW1lbnQncyBjb3B5cmlnaHQgZm9sbG93ZWQgYnkgdGhlIGV4dGVuZGluZyBlbGVtZW50cyBjb3B5cmlnaHQuCi0KLQlGb3IgcmVwbGFjZXMsIHRoZSByZXBsYWNpbmcgY29weXJpZ2h0IHNob3VsZCBiZSBwcmVzZW50LgotCQotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBDb3B5cmlnaHRUZXN0IGV4dGVuZHMgVmFyaWFibGl0eUJhc2VUZXN0Q2FzZSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29weXJpZ2h0X3RleHRfMSA9ICI9PT09PT09PT09PT09PT09IFRoaXMgaXMgY29weXJpZ2h0IHRleHQgMSA9PT09PT09PT09PT09PT09PT09IjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29weXJpZ2h0X3RleHRfMiA9ICI9PT09PT09PT09PT09PT09IFRoaXMgaXMgY29weXJpZ2h0IHRleHQgMiA9PT09PT09PT09PT09PT09PT09IjsKLQkKLQlwdWJsaWMgQ29weXJpZ2h0VGVzdChTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdENvcHlyaWdodCgpIHsKLQkJCQkKLQkJTWV0aG9kUGx1Z2luIHBsdWdpbjEgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVNZXRob2RQbHVnaW4oInBsdWdpbiAxIik7Ci0JCUNvbnRlbnRQYWNrYWdlIHBrZzEgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVDb250ZW50UGFja2FnZShwbHVnaW4xLCAicDEiKTsKLQkJU3VwcG9ydGluZ01hdGVyaWFsIGNvcHlyaWdodF8xID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlU3VwcG9ydGluZ01hdGVyaWFsKHBrZzEsICJjb3B5cmlnaHQgMSIpOwotCQljb3B5cmlnaHRfMS5nZXRQcmVzZW50YXRpb24oKS5zZXRNYWluRGVzY3JpcHRpb24oY29weXJpZ2h0X3RleHRfMSk7Ci0JCXBsdWdpbjEuc2V0Q29weXJpZ2h0U3RhdGVtZW50KGNvcHlyaWdodF8xKTsKLQkJCi0JCU1ldGhvZFBsdWdpbiBwbHVnaW4yID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlTWV0aG9kUGx1Z2luKCJwbHVnaW4gMiIpOwotCQlDb250ZW50UGFja2FnZSBwa2cyID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlQ29udGVudFBhY2thZ2UocGx1Z2luMiwgInAyIik7Ci0JCVN1cHBvcnRpbmdNYXRlcmlhbCBjb3B5cmlnaHRfMiA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZVN1cHBvcnRpbmdNYXRlcmlhbChwa2cyLCAiY29weXJpZ2h0IDIiKTsKLQkJY29weXJpZ2h0XzIuZ2V0UHJlc2VudGF0aW9uKCkuc2V0TWFpbkRlc2NyaXB0aW9uKGNvcHlyaWdodF90ZXh0XzIpOwotCQlwbHVnaW4yLnNldENvcHlyaWdodFN0YXRlbWVudChjb3B5cmlnaHRfMik7Ci0JCXBsdWdpbjIuZ2V0QmFzZXMoKS5hZGQocGx1Z2luMSk7Ci0JCQotCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZUNvbmZpZ3VyYXRpb24oImNvbmZpZyAxIik7Ci0JCWNvbmZpZy5nZXRNZXRob2RQbHVnaW5TZWxlY3Rpb24oKS5hZGQocGx1Z2luMSk7Ci0JCWNvbmZpZy5nZXRNZXRob2RQYWNrYWdlU2VsZWN0aW9uKCkuYWRkKHBrZzEpOwotCQljb25maWcuZ2V0TWV0aG9kUGx1Z2luU2VsZWN0aW9uKCkuYWRkKHBsdWdpbjIpOwotCQljb25maWcuZ2V0TWV0aG9kUGFja2FnZVNlbGVjdGlvbigpLmFkZChwa2cyKTsKLQkJTGlicmFyeVV0aWwudmFsaWRhdGVNZXRob2RDb25maWd1cmF0aW9uKGNvbmZpZyk7CQotCQkKLQkJVGFzayB0MSA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZVRhc2socGtnMSwgInQxIik7Ci0JCVRhc2sgdDIgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVUYXNrKHBrZzIsICJ0MiIpOwotCi0JCVN0cmluZyB0ZXh0ID0gQ29uZmlndXJhdGlvbkhlbHBlci5nZXRDb3B5cmlnaHRUZXh0KHQxLCBjb25maWcpOwotCQlpbnQgaW5kZXgxID0gdGV4dC5pbmRleE9mKGNvcHlyaWdodF90ZXh0XzEpOwotCQlhc3NlcnRUcnVlKGluZGV4MT49MCk7Ci0JCQotCQl0ZXh0ID0gQ29uZmlndXJhdGlvbkhlbHBlci5nZXRDb3B5cmlnaHRUZXh0KHQyLCBjb25maWcpOwotCQlpbnQgaW5kZXgyID0gdGV4dC5pbmRleE9mKGNvcHlyaWdodF90ZXh0XzIpOwotCQlhc3NlcnRUcnVlKGluZGV4Mj49MCk7Ci0JCi0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RDb3B5cmlnaHRfd2l0aF9jb250cmlidXRvcnMoKSB7Ci0JCU1ldGhvZFBsdWdpbiBwbHVnaW4xID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlTWV0aG9kUGx1Z2luKCJwbHVnaW4gMSIpOwotCQlDb250ZW50UGFja2FnZSBwa2cxID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlQ29udGVudFBhY2thZ2UocGx1Z2luMSwgInAxIik7Ci0JCVN1cHBvcnRpbmdNYXRlcmlhbCBjb3B5cmlnaHRfMSA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZVN1cHBvcnRpbmdNYXRlcmlhbChwa2cxLCAiY29weXJpZ2h0IDEiKTsKLQkJY29weXJpZ2h0XzEuZ2V0UHJlc2VudGF0aW9uKCkuc2V0TWFpbkRlc2NyaXB0aW9uKGNvcHlyaWdodF90ZXh0XzEpOwotCQlwbHVnaW4xLnNldENvcHlyaWdodFN0YXRlbWVudChjb3B5cmlnaHRfMSk7Ci0JCQotCQlNZXRob2RQbHVnaW4gcGx1Z2luMiA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZU1ldGhvZFBsdWdpbigicGx1Z2luIDIiKTsKLQkJQ29udGVudFBhY2thZ2UgcGtnMiA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZUNvbnRlbnRQYWNrYWdlKHBsdWdpbjIsICJwMiIpOwotCQlTdXBwb3J0aW5nTWF0ZXJpYWwgY29weXJpZ2h0XzIgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVTdXBwb3J0aW5nTWF0ZXJpYWwocGtnMiwgImNvcHlyaWdodCAyIik7Ci0JCWNvcHlyaWdodF8yLmdldFByZXNlbnRhdGlvbigpLnNldE1haW5EZXNjcmlwdGlvbihjb3B5cmlnaHRfdGV4dF8yKTsKLQkJcGx1Z2luMi5zZXRDb3B5cmlnaHRTdGF0ZW1lbnQoY29weXJpZ2h0XzIpOwotCQlwbHVnaW4yLmdldEJhc2VzKCkuYWRkKHBsdWdpbjEpOwotCi0JCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlQ29uZmlndXJhdGlvbigiY29uZmlnIDEiKTsKLQkJY29uZmlnLmdldE1ldGhvZFBsdWdpblNlbGVjdGlvbigpLmFkZChwbHVnaW4xKTsKLQkJY29uZmlnLmdldE1ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKS5hZGQocGtnMSk7Ci0JCWNvbmZpZy5nZXRNZXRob2RQbHVnaW5TZWxlY3Rpb24oKS5hZGQocGx1Z2luMik7Ci0JCWNvbmZpZy5nZXRNZXRob2RQYWNrYWdlU2VsZWN0aW9uKCkuYWRkKHBrZzIpOwotCQlMaWJyYXJ5VXRpbC52YWxpZGF0ZU1ldGhvZENvbmZpZ3VyYXRpb24oY29uZmlnKTsJCi0JCQotCQlUYXNrIHQxID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlVGFzayhwa2cxLCAidDEiKTsKLQkJVGFzayB0MiA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZVRhc2socGtnMiwgInQyIik7Ci0JCVRhc2sgdDMgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVUYXNrKHBrZzIsICJ0MyIpOwotCi0JCUxpYnJhcnlUZXN0SGVscGVyLnNldENvbnRyaWJ1dGVzKHQyLCB0MSk7Ci0JCUxpYnJhcnlUZXN0SGVscGVyLnNldENvbnRyaWJ1dGVzKHQzLCB0MSk7Ci0JCQotCQlTdHJpbmcgdGV4dCA9IENvbmZpZ3VyYXRpb25IZWxwZXIuZ2V0Q29weXJpZ2h0VGV4dCh0MSwgY29uZmlnKTsKLQkJaW50IGluZGV4MSA9IHRleHQuaW5kZXhPZihjb3B5cmlnaHRfdGV4dF8xKTsJCQotCQlpbnQgaW5kZXgyID0gdGV4dC5pbmRleE9mKGNvcHlyaWdodF90ZXh0XzIpOwotCQlpbnQgaW5kZXgzID0gdGV4dC5pbmRleE9mKGNvcHlyaWdodF90ZXh0XzIsIGluZGV4MiArIGNvcHlyaWdodF90ZXh0XzIubGVuZ3RoKCkpOwotCQlhc3NlcnRUcnVlKGluZGV4MT49MCk7Ci0JCWFzc2VydFRydWUoaW5kZXgyPj0wKTsKLQkJYXNzZXJ0VHJ1ZShpbmRleDM8MCk7IC8vIHQyIGFuZCB0MyBoYXMgdGhlIHNhbWUgY29weXJpZ2h0LCBzaG91bGQgb25seSBzaG93IG9uY2UKLQkJCi0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RDb3B5cmlnaHRfd2l0aF9yZXBsYWNlcigpIHsKLQkJTWV0aG9kUGx1Z2luIHBsdWdpbjEgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVNZXRob2RQbHVnaW4oInBsdWdpbiAxIik7Ci0JCUNvbnRlbnRQYWNrYWdlIHBrZzEgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVDb250ZW50UGFja2FnZShwbHVnaW4xLCAicDEiKTsKLQkJU3VwcG9ydGluZ01hdGVyaWFsIGNvcHlyaWdodF8xID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlU3VwcG9ydGluZ01hdGVyaWFsKHBrZzEsICJjb3B5cmlnaHQgMSIpOwotCQljb3B5cmlnaHRfMS5nZXRQcmVzZW50YXRpb24oKS5zZXRNYWluRGVzY3JpcHRpb24oY29weXJpZ2h0X3RleHRfMSk7Ci0JCXBsdWdpbjEuc2V0Q29weXJpZ2h0U3RhdGVtZW50KGNvcHlyaWdodF8xKTsKLQkJCi0JCU1ldGhvZFBsdWdpbiBwbHVnaW4yID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlTWV0aG9kUGx1Z2luKCJwbHVnaW4gMiIpOwotCQlDb250ZW50UGFja2FnZSBwa2cyID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlQ29udGVudFBhY2thZ2UocGx1Z2luMiwgInAyIik7Ci0JCVN1cHBvcnRpbmdNYXRlcmlhbCBjb3B5cmlnaHRfMiA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZVN1cHBvcnRpbmdNYXRlcmlhbChwa2cyLCAiY29weXJpZ2h0IDIiKTsKLQkJY29weXJpZ2h0XzIuZ2V0UHJlc2VudGF0aW9uKCkuc2V0TWFpbkRlc2NyaXB0aW9uKGNvcHlyaWdodF90ZXh0XzIpOwotCQlwbHVnaW4yLnNldENvcHlyaWdodFN0YXRlbWVudChjb3B5cmlnaHRfMik7Ci0JCXBsdWdpbjIuZ2V0QmFzZXMoKS5hZGQocGx1Z2luMSk7Ci0KLQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVDb25maWd1cmF0aW9uKCJjb25maWcgMSIpOwotCQljb25maWcuZ2V0TWV0aG9kUGx1Z2luU2VsZWN0aW9uKCkuYWRkKHBsdWdpbjEpOwotCQljb25maWcuZ2V0TWV0aG9kUGFja2FnZVNlbGVjdGlvbigpLmFkZChwa2cxKTsKLQkJY29uZmlnLmdldE1ldGhvZFBsdWdpblNlbGVjdGlvbigpLmFkZChwbHVnaW4yKTsKLQkJY29uZmlnLmdldE1ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKS5hZGQocGtnMik7Ci0JCUxpYnJhcnlVdGlsLnZhbGlkYXRlTWV0aG9kQ29uZmlndXJhdGlvbihjb25maWcpOwkKLQkJCi0JCVRhc2sgdDEgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVUYXNrKHBrZzEsICJ0MSIpOwotCQlUYXNrIHQyID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlVGFzayhwa2cyLCAidDIiKTsKLQotCQlMaWJyYXJ5VGVzdEhlbHBlci5zZXRSZXBsYWNlcyh0MiwgdDEpOwotCQkKLQkJU3RyaW5nIHRleHQgPSBDb25maWd1cmF0aW9uSGVscGVyLmdldENvcHlyaWdodFRleHQodDIsIGNvbmZpZyk7Ci0JCWludCBpbmRleDEgPSB0ZXh0LmluZGV4T2YoY29weXJpZ2h0X3RleHRfMSk7CQkKLQkJaW50IGluZGV4MiA9IHRleHQuaW5kZXhPZihjb3B5cmlnaHRfdGV4dF8yKTsKLQkJYXNzZXJ0VHJ1ZShpbmRleDEgPCAwKTsKLQkJYXNzZXJ0VHJ1ZShpbmRleDIgPj0gMCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RDb3B5cmlnaHRfd2l0aF9leHRlbmRlcnMoKSB7Ci0JCU1ldGhvZFBsdWdpbiBwbHVnaW4xID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlTWV0aG9kUGx1Z2luKCJwbHVnaW4gMSIpOwotCQlDb250ZW50UGFja2FnZSBwa2cxID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlQ29udGVudFBhY2thZ2UocGx1Z2luMSwgInAxIik7Ci0JCVN1cHBvcnRpbmdNYXRlcmlhbCBjb3B5cmlnaHRfMSA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZVN1cHBvcnRpbmdNYXRlcmlhbChwa2cxLCAiY29weXJpZ2h0IDEiKTsKLQkJY29weXJpZ2h0XzEuZ2V0UHJlc2VudGF0aW9uKCkuc2V0TWFpbkRlc2NyaXB0aW9uKGNvcHlyaWdodF90ZXh0XzEpOwotCQlwbHVnaW4xLnNldENvcHlyaWdodFN0YXRlbWVudChjb3B5cmlnaHRfMSk7Ci0JCQotCQlNZXRob2RQbHVnaW4gcGx1Z2luMiA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZU1ldGhvZFBsdWdpbigicGx1Z2luIDIiKTsKLQkJQ29udGVudFBhY2thZ2UgcGtnMiA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZUNvbnRlbnRQYWNrYWdlKHBsdWdpbjIsICJwMiIpOwotCQlTdXBwb3J0aW5nTWF0ZXJpYWwgY29weXJpZ2h0XzIgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVTdXBwb3J0aW5nTWF0ZXJpYWwocGtnMiwgImNvcHlyaWdodCAyIik7Ci0JCWNvcHlyaWdodF8yLmdldFByZXNlbnRhdGlvbigpLnNldE1haW5EZXNjcmlwdGlvbihjb3B5cmlnaHRfdGV4dF8yKTsKLQkJcGx1Z2luMi5zZXRDb3B5cmlnaHRTdGF0ZW1lbnQoY29weXJpZ2h0XzIpOwotCQlwbHVnaW4yLmdldEJhc2VzKCkuYWRkKHBsdWdpbjEpOwotCi0JCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlQ29uZmlndXJhdGlvbigiY29uZmlnIDEiKTsKLQkJY29uZmlnLmdldE1ldGhvZFBsdWdpblNlbGVjdGlvbigpLmFkZChwbHVnaW4xKTsKLQkJY29uZmlnLmdldE1ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKS5hZGQocGtnMSk7Ci0JCWNvbmZpZy5nZXRNZXRob2RQbHVnaW5TZWxlY3Rpb24oKS5hZGQocGx1Z2luMik7Ci0JCWNvbmZpZy5nZXRNZXRob2RQYWNrYWdlU2VsZWN0aW9uKCkuYWRkKHBrZzIpOwotCQlMaWJyYXJ5VXRpbC52YWxpZGF0ZU1ldGhvZENvbmZpZ3VyYXRpb24oY29uZmlnKTsJCi0JCQotCQlUYXNrIHQxID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlVGFzayhwa2cxLCAidDEiKTsKLQkJVGFzayB0MiA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZVRhc2socGtnMiwgInQyIik7Ci0JCVRhc2sgdDMgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVUYXNrKHBrZzIsICJ0MyIpOwotCi0JCUxpYnJhcnlUZXN0SGVscGVyLnNldEV4dGVuZHModDIsIHQxKTsKLQkJTGlicmFyeVRlc3RIZWxwZXIuc2V0RXh0ZW5kcyh0MywgdDIpOwotCQkKLQkJaW50IGluZGV4MSwgaW5kZXgyLCBpbmRleDM7Ci0JCQotCQlTdHJpbmcgdGV4dCA9IENvbmZpZ3VyYXRpb25IZWxwZXIuZ2V0Q29weXJpZ2h0VGV4dCh0MSwgY29uZmlnKTsKLQkJaW5kZXgxID0gdGV4dC5pbmRleE9mKGNvcHlyaWdodF90ZXh0XzEpOwkKLQkJYXNzZXJ0VHJ1ZShpbmRleDE+PTApOwotCQkKLQkJdGV4dCA9IENvbmZpZ3VyYXRpb25IZWxwZXIuZ2V0Q29weXJpZ2h0VGV4dCh0MiwgY29uZmlnKTsJCi0JCWluZGV4MSA9IHRleHQuaW5kZXhPZihjb3B5cmlnaHRfdGV4dF8xKTsJCi0JCWluZGV4MiA9IHRleHQuaW5kZXhPZihjb3B5cmlnaHRfdGV4dF8yKTsKLQkJYXNzZXJ0VHJ1ZShpbmRleDEgPj0gMCk7Ci0JCWFzc2VydFRydWUoaW5kZXgyID4gaW5kZXgxKTsgLy8gYmFzZSBjb3B5cmlnaHQgY29tZXMgZmlyc3QKLQotCQlTdHJpbmcgdGV4dDMgPSBDb25maWd1cmF0aW9uSGVscGVyLmdldENvcHlyaWdodFRleHQodDMsIGNvbmZpZyk7CQotCQlhc3NlcnRFcXVhbHModGV4dCwgdGV4dDMpOyAvLyB0MiBhbmQgdDMgaGFzIHRoZSBzYW1lIGNvcHlyaWdodCwgc2hvdWxkIG9ubHkgc2hvdyBvbmNlLCBzbyBzYW1lIGFzIGFib3ZlCQkKLQl9Ci0JCi0JLyoqCi0JICogUjAwMzgzODU1IC0gU2FtZSBjb3B5cmlnaHQgbWVzc2FnZSBnZXRzIHJlYWxpemVkIHR3aWNlCi0JICogU3RlcHMgdG8gcmVwcm9kdWNlOgotCQkwLiBDcmVhdGUgYSBjb25maWcgaW5jbHVkZSBwbHVnaW4gWCBhbmQgWS4KLQkJMS4gQXNzaWduIGNvcHlyaWdodCBBIHRvIHBsdWdpbiBYLgotCQkyLiBBc3NpZ24gY29weXJpZ2h0IEEgdG8gcGx1Z2luIFkuCi0JCTMuIEhhdmUgYSB0YXNrIE0gaW4gcGx1Z2luIFkgdG8gY29udHJpYnV0ZSB0YXNrIE4gaW4gcGx1Z2luIFguCi0JCTQuIHByZXZpZXcgdGFzayBOIGFuZCB5b3Ugd2lsbCBiZSB0aGUgY29weXJpZ2h0IGRpc3BsYWVkIHR3aWNlIGF0IHRoZSBib3R0b20uCi0JICoKLQkgKi8KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0X1IwMDM4Mzg1NSgpIHsKLQkJCi0JCS8vIHNhbWUgYXMgdGhlIGxhc3QgcGFydCBvZiB0ZXN0Q29weXJpZ2h0X3dpdGhfY29udHJpYnV0b3JzKCkKLQkJdGVzdENvcHlyaWdodF93aXRoX2NvbnRyaWJ1dG9ycygpOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdHMvdmFyaWFiaWxpdHkvRnVsZmlsbG1lbnRUZXN0LmphdmEgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3RzL3ZhcmlhYmlsaXR5L0Z1bGZpbGxtZW50VGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNTEyODYxLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdHMvdmFyaWFiaWxpdHkvRnVsZmlsbG1lbnRUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMudmFyaWFiaWxpdHk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uRGVmYXVsdEVsZW1lbnRSZWFsaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLkVsZW1lbnRSZWFsaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy5MaWJyYXJ5VGVzdEhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLkxpYnJhcnlVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQXJ0aWZhY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFzazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS51dGlsLk9wcG9zaXRlRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQXNzb2NpYXRpb25IZWxwZXI7Ci0KLS8qKgotICogVGVzdCBjYXNlIGZvciBmdWxmaWxsbWVudCByZWFsaXphdGlvbgotICogCi0gKiBAYXV0aG9yIFdlaXBpbmcgTHUKLSAqIEBzaW5jZSAxLjUKLSAqLwotcHVibGljIGNsYXNzIEZ1bGZpbGxtZW50VGVzdCBleHRlbmRzIFZhcmlhYmxpdHlCYXNlVGVzdENhc2UgewotCi0JLyoqCi0JICogQHBhcmFtIG5hbWUKLQkgKi8KLQlwdWJsaWMgRnVsZmlsbG1lbnRUZXN0KFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3QwMSgpIHsKLQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZU1ldGhvZFBsdWdpbigicGx1Z2luIDEiKTsKLQkJQ29udGVudFBhY2thZ2UgcGtnID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlQ29udGVudFBhY2thZ2UocGx1Z2luLCAicDEiKTsKLQkJUm9sZSByMSA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZVJvbGUocGtnLCAicjEiKTsKLQkJUm9sZSByMiA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZVJvbGUocGtnLCAicjIiKTsKLQkJCi0JCVRhc2sgdDEgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVUYXNrKHBrZywgInQxIik7Ci0JCVRhc2sgdDIgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVUYXNrKHBrZywgInQyIik7Ci0JCQotCQlBcnRpZmFjdCBzbG90MSA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZUFydGlmYWN0KHBrZywgInNsb3QxIik7Ci0JCUFydGlmYWN0IHNsb3QyID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlQXJ0aWZhY3QocGtnLCAic2xvdDIiKTsKLQkJc2xvdDEuc2V0SXNBYnN0cmFjdCh0cnVlKTsKLQkJc2xvdDIuc2V0SXNBYnN0cmFjdCh0cnVlKTsKLQkJc2xvdDEuc2V0UHJlc2VudGF0aW9uTmFtZSgiYl9zbG90Iik7Ci0JCXNsb3QyLnNldFByZXNlbnRhdGlvbk5hbWUoImFfc2xvdCIpOwotCQkKLQkJQXJ0aWZhY3QgYTEgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVBcnRpZmFjdChwa2csICJhMSIpOwotCQlhMS5nZXRGdWxmaWxscygpLmFkZChzbG90MSk7Ci0JCWExLmdldEZ1bGZpbGxzKCkuYWRkKHNsb3QyKTsKLQkJCi0JCUFydGlmYWN0IGEyID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlQXJ0aWZhY3QocGtnLCAiYTIiKTsKLQkJYTIuZ2V0RnVsZmlsbHMoKS5hZGQoc2xvdDEpOwotCQlhMi5nZXRGdWxmaWxscygpLmFkZChzbG90Mik7Ci0JCQotCQlhMS5zZXRQcmVzZW50YXRpb25OYW1lKCJiX2ExIik7Ci0JCWEyLnNldFByZXNlbnRhdGlvbk5hbWUoImFfYTIiKTsKLQkJCi0JCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlQ29uZmlndXJhdGlvbigiY29uZmlnIik7Ci0JCWNvbmZpZy5nZXRNZXRob2RQbHVnaW5TZWxlY3Rpb24oKS5hZGQocGx1Z2luKTsKLQkJY29uZmlnLmdldE1ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKS5hZGQocGtnKTsKLQkJTGlicmFyeVV0aWwudmFsaWRhdGVNZXRob2RDb25maWd1cmF0aW9uKGNvbmZpZyk7Ci0JCQotCQlFbGVtZW50UmVhbGl6ZXIgcmVhbGl6ZXIgPSBEZWZhdWx0RWxlbWVudFJlYWxpemVyLm5ld0VsZW1lbnRSZWFsaXplcihjb25maWcpOwotCQkKLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmU7Ci0JCU9wcG9zaXRlRmVhdHVyZSBvZmVhdHVyZTsKLQkJTGlzdCBpdGVtczsKLQkJCi0JCXIxLmdldFJlc3BvbnNpYmxlRm9yKCkuYWRkKHNsb3QxKTsKLQkJcjIuZ2V0UmVzcG9uc2libGVGb3IoKS5hZGQoc2xvdDIpOwotCQkKLQkJdDEuZ2V0UGVyZm9ybWVkQnkoKS5hZGQocjEpOwotCQl0Mi5nZXRQZXJmb3JtZWRCeSgpLmFkZChyMik7Ci0JCQotCQlvZmVhdHVyZSA9IEFzc29jaWF0aW9uSGVscGVyLldvcmtQcm9kdWN0X1Jlc3BvbnNpYmxlUm9sZXM7Ci0JCWl0ZW1zID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMG5GZWF0dXJlVmFsdWUoYTEsIG9mZWF0dXJlLCByZWFsaXplcik7Ci0JCWFzc2VydEVxdWFscygyLCBpdGVtcy5zaXplKCkpOwotCQkKLQkJaXRlbXMgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGNGdWxmaWxsYWJsZUVsZW1lbnRfRnVsZmlsbHMoYTEsIGNvbmZpZyk7Ci0JCWFzc2VydEVxdWFscyhzbG90MiwgaXRlbXMuZ2V0KDApKTsKLQkJYXNzZXJ0RXF1YWxzKHNsb3QxLCBpdGVtcy5nZXQoMSkpOwotCQkKLQkJb2ZlYXR1cmUgPSBBc3NvY2lhdGlvbkhlbHBlci5GdWxGaWxsc19GdWxsRmlsbGFibGVFbGVtZW50czsKLQkJaXRlbXMgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGNGdWxmaWxsc19GdWxmaWxsYWJsZUVsZW1lbnQoc2xvdDEsIGNvbmZpZyk7Ci0JCWFzc2VydEVxdWFscygyLCBpdGVtcy5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoYTIsIGl0ZW1zLmdldCgwKSk7Ci0JCWFzc2VydEVxdWFscyhhMSwgaXRlbXMuZ2V0KDEpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3RzL3ZhcmlhYmlsaXR5L0luY29taW5nMDFGZWF0dXJlVGVzdC5qYXZhIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0cy92YXJpYWJpbGl0eS9JbmNvbWluZzAxRmVhdHVyZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTUwNmU3ZS4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3RzL3ZhcmlhYmlsaXR5L0luY29taW5nMDFGZWF0dXJlVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzLnZhcmlhYmlsaXR5OwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5EZWZhdWx0RWxlbWVudFJlYWxpemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uRWxlbWVudFJlYWxpemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzLkxpYnJhcnlUZXN0SGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuTGlicmFyeVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BcnRpZmFjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLnV0aWwuT3Bwb3NpdGVGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5Bc3NvY2lhdGlvbkhlbHBlcjsKLQotLyoqCi0gKiBUZXN0IGNhc2UgZm9yIGluY29taW5nIDAuLjEgZmVhdHVyZSB2YXJhaWJpbGl0eS4KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEluY29taW5nMDFGZWF0dXJlVGVzdCBleHRlbmRzIFZhcmlhYmxpdHlCYXNlVGVzdENhc2UgewotCi0JLyoqCi0JICogQHBhcmFtIG5hbWUKLQkgKi8KLQlwdWJsaWMgSW5jb21pbmcwMUZlYXR1cmVUZXN0KFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3Rfd29ya1Byb2R1Y3RfRG9tYWluKCkgewotCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlTWV0aG9kUGx1Z2luKCJwbHVnaW4gMSIpOwotCQlDb250ZW50UGFja2FnZSBwa2cgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVDb250ZW50UGFja2FnZShwbHVnaW4sICJwMSIpOwotCQlEb21haW4gZDEgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVEb21haW4ocGx1Z2luLCAiZDEiKTsKLQkJRG9tYWluIGQyID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlRG9tYWluKHBsdWdpbiwgImQyIik7Ci0JCUFydGlmYWN0IGExID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlQXJ0aWZhY3QocGtnLCAiYTEiKTsKLQkJQXJ0aWZhY3QgYTIgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVBcnRpZmFjdChwa2csICJhMiIpOwotCQkJCQotCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZUNvbmZpZ3VyYXRpb24oImNvbmZpZyAxIik7Ci0JCWNvbmZpZy5nZXRNZXRob2RQbHVnaW5TZWxlY3Rpb24oKS5hZGQocGx1Z2luKTsKLQkJY29uZmlnLmdldE1ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKS5hZGQocGtnKTsKLQkJTGlicmFyeVV0aWwudmFsaWRhdGVNZXRob2RDb25maWd1cmF0aW9uKGNvbmZpZyk7CQotCQlFbGVtZW50UmVhbGl6ZXIgcmVhbGl6ZXIgPSBEZWZhdWx0RWxlbWVudFJlYWxpemVyLm5ld0VsZW1lbnRSZWFsaXplcihjb25maWcpOwotCQkKLQkJT3Bwb3NpdGVGZWF0dXJlIG9mZWF0dXJlID0gQXNzb2NpYXRpb25IZWxwZXIuV29ya1Byb2R1Y3RfRG9tYWluczsKLQkJCi0JCS8vIHNpbmNlIDEuMiwgdGhpcyBpcyBhIHRvLW1hbnkgZmVhdHVyZSwgbm90IHRvLW9uZQotCQkvLyBjYXNlIDEKLQkJZDEuZ2V0V29ya1Byb2R1Y3RzKCkuYWRkKGExKTsKLQkJZDIuZ2V0V29ya1Byb2R1Y3RzKCkuYWRkKGEyKTsKLQkJTGlzdCBpdGVtcyA9IENvbmZpZ3VyYXRpb25IZWxwZXIuY2FsYzBuRmVhdHVyZVZhbHVlKGExLCBvZmVhdHVyZSwgcmVhbGl6ZXIpOwotCQlhc3NlcnRFcXVhbHMoMSwgaXRlbXMuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGQxLCBpdGVtcy5nZXQoMCkpOwotCQkKLQkJaXRlbXMgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwbkZlYXR1cmVWYWx1ZShhMiwgb2ZlYXR1cmUsIHJlYWxpemVyKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGl0ZW1zLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhkMiwgaXRlbXMuZ2V0KDApKTsKLQkJCi0JCS8vIGNhc2UgMjogCi0JCUxpYnJhcnlUZXN0SGVscGVyLnNldENvbnRyaWJ1dGVzKGQyLCBkMSk7Ci0JCWl0ZW1zID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMG5GZWF0dXJlVmFsdWUoYTEsIG9mZWF0dXJlLCByZWFsaXplcik7Ci0JCWFzc2VydEVxdWFscygxLCBpdGVtcy5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoZDEsIGl0ZW1zLmdldCgwKSk7Ci0JCQotCQlpdGVtcyA9IENvbmZpZ3VyYXRpb25IZWxwZXIuY2FsYzBuRmVhdHVyZVZhbHVlKGEyLCBvZmVhdHVyZSwgcmVhbGl6ZXIpOwotCQlhc3NlcnRFcXVhbHMoMSwgaXRlbXMuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGQxLCBpdGVtcy5nZXQoMCkpOwotCQkKLQkJLy8gY2FzZSAzOiAKLQkJLy8gaWYgZDIgcmVwbGFjZXMgZDEsIGl0J3Mgb3V0Z29pbmcgdG8tbWFueSBhc3NvY2lhdGlvbiBpcyByZXBhbGNlZCwgCi0JCS8vIGkuZSB0aGUgZW5kIHJlc3VsdCBpcyBkMiAtPiBhMiwgYnV0IGExIGRvZXMgbm90IGhhdmUgYSBkb21haW4KLQkJTGlicmFyeVRlc3RIZWxwZXIuc2V0UmVwbGFjZXMoZDIsIGQxKTsKLQkJaXRlbXMgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwbkZlYXR1cmVWYWx1ZShhMSwgb2ZlYXR1cmUsIHJlYWxpemVyKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGl0ZW1zLnNpemUoKSk7Ci0JCQotCQlpdGVtcyA9IENvbmZpZ3VyYXRpb25IZWxwZXIuY2FsYzBuRmVhdHVyZVZhbHVlKGEyLCBvZmVhdHVyZSwgcmVhbGl6ZXIpOwotCQlhc3NlcnRFcXVhbHMoMSwgaXRlbXMuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGQyLCBpdGVtcy5nZXQoMCkpOwotCQkKLQkJLy8gY2FzZSA0OiAKLQkJTGlicmFyeVRlc3RIZWxwZXIuc2V0RXh0ZW5kcyhkMiwgZDEpOwotCQlpdGVtcyA9IENvbmZpZ3VyYXRpb25IZWxwZXIuY2FsYzBuRmVhdHVyZVZhbHVlKGExLCBvZmVhdHVyZSwgcmVhbGl6ZXIpOwotCQlhc3NlcnRFcXVhbHMoMiwgaXRlbXMuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGQxLCBpdGVtcy5nZXQoMCkpOwotCQlhc3NlcnRFcXVhbHMoZDIsIGl0ZW1zLmdldCgxKSk7Ci0JCQotCQlpdGVtcyA9IENvbmZpZ3VyYXRpb25IZWxwZXIuY2FsYzBuRmVhdHVyZVZhbHVlKGEyLCBvZmVhdHVyZSwgcmVhbGl6ZXIpOwotCQlhc3NlcnRFcXVhbHMoMSwgaXRlbXMuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGQyLCBpdGVtcy5nZXQoMCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0X3dvcmtQcm9kdWN0X0RvbWFpbl93aXRoX2NvbnRyaWJ1dG9ycygpIHsKLQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZU1ldGhvZFBsdWdpbigicGx1Z2luIDEiKTsKLQkJQ29udGVudFBhY2thZ2UgcGtnID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlQ29udGVudFBhY2thZ2UocGx1Z2luLCAicDEiKTsKLQkJRG9tYWluIGQxID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlRG9tYWluKHBsdWdpbiwgImQxIik7Ci0JCURvbWFpbiBkMiA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZURvbWFpbihwbHVnaW4sICJkMiIpOwotCQlEb21haW4gZDMgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVEb21haW4ocGx1Z2luLCAiZDMiKTsKLQkJQXJ0aWZhY3QgYTEgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVBcnRpZmFjdChwa2csICJhMSIpOwotCQlBcnRpZmFjdCBhMiA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZUFydGlmYWN0KHBrZywgImEyIik7Ci0JCUFydGlmYWN0IGEzID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlQXJ0aWZhY3QocGtnLCAiYTMiKTsKLQkJCQkKLQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVDb25maWd1cmF0aW9uKCJjb25maWcgMSIpOwotCQljb25maWcuZ2V0TWV0aG9kUGx1Z2luU2VsZWN0aW9uKCkuYWRkKHBsdWdpbik7Ci0JCWNvbmZpZy5nZXRNZXRob2RQYWNrYWdlU2VsZWN0aW9uKCkuYWRkKHBrZyk7Ci0JCUxpYnJhcnlVdGlsLnZhbGlkYXRlTWV0aG9kQ29uZmlndXJhdGlvbihjb25maWcpOwkKLQkJRWxlbWVudFJlYWxpemVyIHJlYWxpemVyID0gRGVmYXVsdEVsZW1lbnRSZWFsaXplci5uZXdFbGVtZW50UmVhbGl6ZXIoY29uZmlnKTsKLQkJCi0JCU9wcG9zaXRlRmVhdHVyZSBvZmVhdHVyZSA9IEFzc29jaWF0aW9uSGVscGVyLldvcmtQcm9kdWN0X0RvbWFpbnM7Ci0JCQotCQkvLyBjYXNlIDEKLQkJZDIuZ2V0V29ya1Byb2R1Y3RzKCkuYWRkKGEyKTsKLQkJTGlicmFyeVRlc3RIZWxwZXIuc2V0Q29udHJpYnV0ZXMoYTIsIGExKTsKLQkJTGlzdCBpdGVtcyA9IENvbmZpZ3VyYXRpb25IZWxwZXIuY2FsYzBuRmVhdHVyZVZhbHVlKGExLCBvZmVhdHVyZSwgcmVhbGl6ZXIpOwotCQlhc3NlcnRFcXVhbHMoMSwgaXRlbXMuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGQyLCBpdGVtcy5nZXQoMCkpOwotCQkKLQkJLy8gY2FzZSAyOiAKLQkJZDEuZ2V0V29ya1Byb2R1Y3RzKCkuYWRkKGExKTsKLQkJZDIuZ2V0V29ya1Byb2R1Y3RzKCkuYWRkKGEyKTsKLQkJTGlicmFyeVRlc3RIZWxwZXIuc2V0Q29udHJpYnV0ZXMoYTIsIGExKTsKLQkJaXRlbXMgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwbkZlYXR1cmVWYWx1ZShhMSwgb2ZlYXR1cmUsIHJlYWxpemVyKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGl0ZW1zLnNpemUoKSk7Ci0JCWFzc2VydFRydWUoaXRlbXMuY29udGFpbnMoZDEpKTsKLQkJYXNzZXJ0VHJ1ZShpdGVtcy5jb250YWlucyhkMikpOwotCQkJCQotCQkvLyBjYXNlIDM6IG1vcmUgdGhhbiBjb250cmlidXRvcnMsIHJldHVybiBudWxsCi0JCWQxLmdldFdvcmtQcm9kdWN0cygpLnJlbW92ZShhMSk7Ci0JCWQyLmdldFdvcmtQcm9kdWN0cygpLmFkZChhMik7Ci0JCWQzLmdldFdvcmtQcm9kdWN0cygpLmFkZChhMyk7Ci0JCUxpYnJhcnlUZXN0SGVscGVyLnNldENvbnRyaWJ1dGVzKGEzLCBhMSk7Ci0JCWl0ZW1zID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMG5GZWF0dXJlVmFsdWUoYTEsIG9mZWF0dXJlLCByZWFsaXplcik7Ci0JCWFzc2VydEVxdWFscygyLCBpdGVtcy5zaXplKCkpOwotCQlhc3NlcnRUcnVlKGl0ZW1zLmNvbnRhaW5zKGQyKSk7Ci0JCWFzc2VydFRydWUoaXRlbXMuY29udGFpbnMoZDMpKTsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3RzL3ZhcmlhYmlsaXR5L0luY29taW5nMG5GZWF0dXJlVGVzdC5qYXZhIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0cy92YXJpYWJpbGl0eS9JbmNvbWluZzBuRmVhdHVyZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTcwNmJmYy4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3RzL3ZhcmlhYmlsaXR5L0luY29taW5nMG5GZWF0dXJlVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzLnZhcmlhYmlsaXR5OwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5EZWZhdWx0RWxlbWVudFJlYWxpemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uRWxlbWVudFJlYWxpemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzLkxpYnJhcnlUZXN0SGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuTGlicmFyeVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BcnRpZmFjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS51dGlsLk9wcG9zaXRlRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQXNzb2NpYXRpb25IZWxwZXI7Ci0KLS8qKgotICogVGVzdCBjYXNlIGZvciBpbmNvbWluZyAwLi5uIGZlYXR1cmUgdmFyYWliaWxpdHkuCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBJbmNvbWluZzBuRmVhdHVyZVRlc3QgZXh0ZW5kcyBWYXJpYWJsaXR5QmFzZVRlc3RDYXNlIHsKLQotCS8qKgotCSAqIEBwYXJhbSBuYW1lCi0JICovCi0JcHVibGljIEluY29taW5nMG5GZWF0dXJlVGVzdChTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQotCS8qKgotCSAqIHNpbmNlIDEuMG00LCBhIHdvcmsgcHJvZHVjdCBjYW4gaGF2ZSBtdWx0aXBsZSByb2xlcwotCSAqCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF93b3JrUHJvZHVjdF9SZXNwb25zaWJsZVJvbGVzKCkgewotCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlTWV0aG9kUGx1Z2luKCJwbHVnaW4gMSIpOwotCQlDb250ZW50UGFja2FnZSBwa2cgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVDb250ZW50UGFja2FnZShwbHVnaW4sICJwMSIpOwotCQlSb2xlIHIxID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlUm9sZShwa2csICJyMSIpOwotCQlSb2xlIHIyID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlUm9sZShwa2csICJyMiIpOwotCQlBcnRpZmFjdCBhMSA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZUFydGlmYWN0KHBrZywgImExIik7Ci0JCUFydGlmYWN0IGEyID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlQXJ0aWZhY3QocGtnLCAiYTIiKTsKLQkJCQkKLQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVDb25maWd1cmF0aW9uKCJjb25maWcgMSIpOwotCQljb25maWcuZ2V0TWV0aG9kUGx1Z2luU2VsZWN0aW9uKCkuYWRkKHBsdWdpbik7Ci0JCWNvbmZpZy5nZXRNZXRob2RQYWNrYWdlU2VsZWN0aW9uKCkuYWRkKHBrZyk7Ci0JCUxpYnJhcnlVdGlsLnZhbGlkYXRlTWV0aG9kQ29uZmlndXJhdGlvbihjb25maWcpOwkKLQkJRWxlbWVudFJlYWxpemVyIHJlYWxpemVyID0gRGVmYXVsdEVsZW1lbnRSZWFsaXplci5uZXdFbGVtZW50UmVhbGl6ZXIoY29uZmlnKTsKLQkJCi0JCU9wcG9zaXRlRmVhdHVyZSBvZmVhdHVyZSA9IEFzc29jaWF0aW9uSGVscGVyLldvcmtQcm9kdWN0X1Jlc3BvbnNpYmxlUm9sZXM7Ci0JCUxpc3QgaXRlbXM7Ci0JCQotCQlMaXN0IGxpc3QgPSByMS5nZXRSZXNwb25zaWJsZUZvcigpOwotCQlsaXN0LmFkZChhMSk7Ci0JCWxpc3QuYWRkKGExKTsKLQkJCi0JCS8vIGNhc2UgMQotCQlyMS5nZXRSZXNwb25zaWJsZUZvcigpLmFkZChhMSk7Ci0JCXIyLmdldFJlc3BvbnNpYmxlRm9yKCkuYWRkKGEyKTsKLQkJaXRlbXMgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwbkZlYXR1cmVWYWx1ZShhMSwgb2ZlYXR1cmUsIHJlYWxpemVyKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGl0ZW1zLnNpemUoKSk7Ci0JCWFzc2VydFRydWUoaXRlbXMuY29udGFpbnMocjEpKTsKLQkJCi0JCWl0ZW1zID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMG5GZWF0dXJlVmFsdWUoYTIsIG9mZWF0dXJlLCByZWFsaXplcik7Ci0JCWFzc2VydEVxdWFscygxLCBpdGVtcy5zaXplKCkpOwotCQlhc3NlcnRUcnVlKGl0ZW1zLmNvbnRhaW5zKHIyKSk7Ci0JCQotCQkvLyBjYXNlIDI6IAotCQlyMS5nZXRSZXNwb25zaWJsZUZvcigpLmFkZChhMSk7Ci0JCXIyLmdldFJlc3BvbnNpYmxlRm9yKCkuYWRkKGEyKTsKLQkJTGlicmFyeVRlc3RIZWxwZXIuc2V0Q29udHJpYnV0ZXMocjIsIHIxKTsKLQkJaXRlbXMgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwbkZlYXR1cmVWYWx1ZShhMSwgb2ZlYXR1cmUsIHJlYWxpemVyKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGl0ZW1zLnNpemUoKSk7Ci0JCWFzc2VydFRydWUoaXRlbXMuY29udGFpbnMocjEpKTsKLQkJCi0JCWl0ZW1zID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMG5GZWF0dXJlVmFsdWUoYTIsIG9mZWF0dXJlLCByZWFsaXplcik7Ci0JCWFzc2VydEVxdWFscygxLCBpdGVtcy5zaXplKCkpOwotCQlhc3NlcnRUcnVlKGl0ZW1zLmNvbnRhaW5zKHIxKSk7Ci0JCQotCQkvLyBjYXNlIDM6IAotCQkvLyBzaW5jZSByMiByZXBsYWNlcyByMSwgdGhlIGVuZCByZXN1bHQgaXMgcjIgLT4gYTIsIAotCQkvLyByMSBkb2VzIG5vdCBleGlzdCBhbnkgbW9yZSwgc28gYTEgaGFzIG5vIHJlc3BvbnNpYmxlIHJvbGUKLQkJcjEuZ2V0UmVzcG9uc2libGVGb3IoKS5hZGQoYTEpOwotCQlyMi5nZXRSZXNwb25zaWJsZUZvcigpLmFkZChhMik7Ci0JCUxpYnJhcnlUZXN0SGVscGVyLnNldFJlcGxhY2VzKHIyLCByMSk7Ci0JCWl0ZW1zID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMG5GZWF0dXJlVmFsdWUoYTEsIG9mZWF0dXJlLCByZWFsaXplcik7Ci0JCWFzc2VydEVxdWFscygwLCBpdGVtcy5zaXplKCkpOwotCQkKLQkJaXRlbXMgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwbkZlYXR1cmVWYWx1ZShhMiwgb2ZlYXR1cmUsIHJlYWxpemVyKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGl0ZW1zLnNpemUoKSk7Ci0JCWFzc2VydFRydWUoaXRlbXMuY29udGFpbnMocjIpKTsKLQkJCi0JCS8vIGNhc2UgNDogCi0JCXIxLmdldFJlc3BvbnNpYmxlRm9yKCkuYWRkKGExKTsKLQkJcjIuZ2V0UmVzcG9uc2libGVGb3IoKS5hZGQoYTIpOwotCQlMaWJyYXJ5VGVzdEhlbHBlci5zZXRFeHRlbmRzKHIyLCByMSk7Ci0JCWl0ZW1zID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMG5GZWF0dXJlVmFsdWUoYTEsIG9mZWF0dXJlLCByZWFsaXplcik7Ci0JCWFzc2VydEVxdWFscygyLCBpdGVtcy5zaXplKCkpOwotCQlhc3NlcnRUcnVlKGl0ZW1zLmNvbnRhaW5zKHIxKSk7Ci0JCWFzc2VydFRydWUoaXRlbXMuY29udGFpbnMocjIpKTsKLQkJCi0JCWl0ZW1zID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMG5GZWF0dXJlVmFsdWUoYTIsIG9mZWF0dXJlLCByZWFsaXplcik7Ci0JCWFzc2VydEVxdWFscygxLCBpdGVtcy5zaXplKCkpOwotCQlhc3NlcnRUcnVlKGl0ZW1zLmNvbnRhaW5zKHIyKSk7Ci0JCQotCQkvLyBjYXNlIDU6IGJvdGggcjEgYW5kIHIyIHJlc3BvbnNpYmxlIGZvciBhMQotCQlyMS5nZXRSZXNwb25zaWJsZUZvcigpLmNsZWFyKCk7Ci0JCXIyLmdldFJlc3BvbnNpYmxlRm9yKCkuY2xlYXIoKTsKLQkJcjEuZ2V0UmVzcG9uc2libGVGb3IoKS5hZGQoYTEpOwotCQlyMi5nZXRSZXNwb25zaWJsZUZvcigpLmFkZChhMSk7Ci0JCUxpYnJhcnlUZXN0SGVscGVyLnNldEV4dGVuZHMocjIsIHIxKTsKLQkJaXRlbXMgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwbkZlYXR1cmVWYWx1ZShhMSwgb2ZlYXR1cmUsIHJlYWxpemVyKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGl0ZW1zLnNpemUoKSk7IC8vIHRoaXMgbmVlZCB0byB3YWl0IHRpbGwgdGhlIG9wcG9zaXRlIGZlYXR1cmUgY2hhbmdlIGZyb20gcGhvbmcgaXMgZGVsaXZlcmVkCi0JCWFzc2VydFRydWUoaXRlbXMuY29udGFpbnMocjEpKTsKLQkJYXNzZXJ0VHJ1ZShpdGVtcy5jb250YWlucyhyMikpOwotCQkKLQkJaXRlbXMgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwbkZlYXR1cmVWYWx1ZShhMiwgb2ZlYXR1cmUsIHJlYWxpemVyKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGl0ZW1zLnNpemUoKSk7Ci0JCQotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0X3dvcmtQcm9kdWN0X1Jlc3BvbnNpYmxlUm9sZXNfd2l0aF9jb250cmlidXRvcnMoKSB7Ci0JCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVNZXRob2RQbHVnaW4oInBsdWdpbiAxIik7Ci0JCUNvbnRlbnRQYWNrYWdlIHBrZyA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZUNvbnRlbnRQYWNrYWdlKHBsdWdpbiwgInAxIik7Ci0JCVJvbGUgcjEgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVSb2xlKHBrZywgInIxIik7Ci0JCVJvbGUgcjIgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVSb2xlKHBrZywgInIyIik7Ci0JCVJvbGUgcjMgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVSb2xlKHBrZywgInIzIik7Ci0JCUFydGlmYWN0IGExID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlQXJ0aWZhY3QocGtnLCAiYTEiKTsKLQkJQXJ0aWZhY3QgYTIgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVBcnRpZmFjdChwa2csICJhMiIpOwotCQlBcnRpZmFjdCBhMyA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZUFydGlmYWN0KHBrZywgImEzIik7Ci0JCQkJCi0JCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlQ29uZmlndXJhdGlvbigiY29uZmlnIDEiKTsKLQkJY29uZmlnLmdldE1ldGhvZFBsdWdpblNlbGVjdGlvbigpLmFkZChwbHVnaW4pOwotCQljb25maWcuZ2V0TWV0aG9kUGFja2FnZVNlbGVjdGlvbigpLmFkZChwa2cpOwotCQlMaWJyYXJ5VXRpbC52YWxpZGF0ZU1ldGhvZENvbmZpZ3VyYXRpb24oY29uZmlnKTsJCi0JCUVsZW1lbnRSZWFsaXplciByZWFsaXplciA9IERlZmF1bHRFbGVtZW50UmVhbGl6ZXIubmV3RWxlbWVudFJlYWxpemVyKGNvbmZpZyk7Ci0JCQotCQlPcHBvc2l0ZUZlYXR1cmUgb2ZlYXR1cmUgPSBBc3NvY2lhdGlvbkhlbHBlci5Xb3JrUHJvZHVjdF9SZXNwb25zaWJsZVJvbGVzOwotCQlMaXN0IGl0ZW1zOwotCQkKLQkJLy8gY2FzZSAxCi0JCXIyLmdldFJlc3BvbnNpYmxlRm9yKCkuYWRkKGEyKTsKLQkJTGlicmFyeVRlc3RIZWxwZXIuc2V0Q29udHJpYnV0ZXMoYTIsIGExKTsKLQkJaXRlbXMgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwbkZlYXR1cmVWYWx1ZShhMSwgb2ZlYXR1cmUsIHJlYWxpemVyKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGl0ZW1zLnNpemUoKSk7Ci0JCWFzc2VydFRydWUoaXRlbXMuY29udGFpbnMocjIpKTsKLQkJCi0JCS8vIGNhc2UgMjogCi0JCXIxLmdldFJlc3BvbnNpYmxlRm9yKCkuYWRkKGExKTsKLQkJcjIuZ2V0UmVzcG9uc2libGVGb3IoKS5hZGQoYTIpOwotCQlMaWJyYXJ5VGVzdEhlbHBlci5zZXRDb250cmlidXRlcyhhMiwgYTEpOwotCQlpdGVtcyA9IENvbmZpZ3VyYXRpb25IZWxwZXIuY2FsYzBuRmVhdHVyZVZhbHVlKGExLCBvZmVhdHVyZSwgcmVhbGl6ZXIpOwotCQlhc3NlcnRFcXVhbHMoMiwgaXRlbXMuc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShpdGVtcy5jb250YWlucyhyMSkpOwotCQlhc3NlcnRUcnVlKGl0ZW1zLmNvbnRhaW5zKHIyKSk7Ci0JCQkJCi0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3Rfd29ya1Byb2R1Y3RfUmVzcG9uc2libGVSb2xlc193aXRoX3JlcGxhY2VyKCkgewotCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlTWV0aG9kUGx1Z2luKCJwbHVnaW4gMSIpOwotCQlDb250ZW50UGFja2FnZSBwa2cgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVDb250ZW50UGFja2FnZShwbHVnaW4sICJwMSIpOwotCQlSb2xlIHIxID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlUm9sZShwa2csICJyMSIpOwotCQlSb2xlIHIyID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlUm9sZShwa2csICJyMiIpOwotLy8JCVJvbGUgcjMgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVSb2xlKHBrZywgInIzIik7Ci0JCUFydGlmYWN0IGExID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlQXJ0aWZhY3QocGtnLCAiYTEiKTsKLQkJQXJ0aWZhY3QgYTIgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVBcnRpZmFjdChwa2csICJhMiIpOwotLy8JCUFydGlmYWN0IGEzID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlQXJ0aWZhY3QocGtnLCAiYTMiKTsKLQkJCQkKLQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVDb25maWd1cmF0aW9uKCJjb25maWcgMSIpOwotCQljb25maWcuZ2V0TWV0aG9kUGx1Z2luU2VsZWN0aW9uKCkuYWRkKHBsdWdpbik7Ci0JCWNvbmZpZy5nZXRNZXRob2RQYWNrYWdlU2VsZWN0aW9uKCkuYWRkKHBrZyk7Ci0JCUxpYnJhcnlVdGlsLnZhbGlkYXRlTWV0aG9kQ29uZmlndXJhdGlvbihjb25maWcpOwkKLQkJRWxlbWVudFJlYWxpemVyIHJlYWxpemVyID0gRGVmYXVsdEVsZW1lbnRSZWFsaXplci5uZXdFbGVtZW50UmVhbGl6ZXIoY29uZmlnKTsKLQkJCi0JCU9wcG9zaXRlRmVhdHVyZSBvZmVhdHVyZSA9IEFzc29jaWF0aW9uSGVscGVyLldvcmtQcm9kdWN0X1Jlc3BvbnNpYmxlUm9sZXM7Ci0JCUxpc3QgaXRlbXM7Ci0JCQotCQkvLyBjYXNlIDEKLQkJcjEuZ2V0UmVzcG9uc2libGVGb3IoKS5hZGQoYTEpOwotCQlyMi5nZXRSZXNwb25zaWJsZUZvcigpLmFkZChhMik7Ci0JCUxpYnJhcnlUZXN0SGVscGVyLnNldFJlcGxhY2VzKGEyLCBhMSk7Ci0JCWl0ZW1zID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMG5GZWF0dXJlVmFsdWUoYTIsIG9mZWF0dXJlLCByZWFsaXplcik7Ci0JCWFzc2VydEVxdWFscygyLCBpdGVtcy5zaXplKCkpOwotCQlhc3NlcnRUcnVlKGl0ZW1zLmNvbnRhaW5zKHIxKSk7Ci0JCWFzc2VydFRydWUoaXRlbXMuY29udGFpbnMocjIpKTsKLQkJCi0JfQotCQotfQpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0cy92YXJpYWJpbGl0eS9PdXRnb2luZzAxRmVhdHVyZVRlc3QuamF2YSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdHMvdmFyaWFiaWxpdHkvT3V0Z29pbmcwMUZlYXR1cmVUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2MTcxYzEuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0cy92YXJpYWJpbGl0eS9PdXRnb2luZzAxRmVhdHVyZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxOCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy52YXJpYWJpbGl0eTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5EZWZhdWx0RWxlbWVudFJlYWxpemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uRWxlbWVudFJlYWxpemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzLkxpYnJhcnlUZXN0SGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuTGlicmFyeVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIFRlc3QgY2FzZSBmb3IgMC4uMSBmZWF0dXJlIHZhcmFpYmlsaXR5LgotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgT3V0Z29pbmcwMUZlYXR1cmVUZXN0IGV4dGVuZHMgVmFyaWFibGl0eUJhc2VUZXN0Q2FzZSB7Ci0KLQkvKioKLQkgKiBAcGFyYW0gbmFtZQotCSAqLwotCXB1YmxpYyBPdXRnb2luZzAxRmVhdHVyZVRlc3QoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0KLQlwdWJsaWMgdm9pZCB0ZXN0X3Rhc2tfcGVyZm9ybWVkQnkoKSB7Ci0JCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVNZXRob2RQbHVnaW4oInBsdWdpbiAxIik7Ci0JCUNvbnRlbnRQYWNrYWdlIHBrZyA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZUNvbnRlbnRQYWNrYWdlKHBsdWdpbiwgInAxIik7Ci0JCVRhc2sgdDEgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVUYXNrKHBrZywgInQxIik7Ci0JCVJvbGUgcjEgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVSb2xlKHBrZywgInIxIik7Ci0JCQotCQl0MS5nZXRQZXJmb3JtZWRCeSgpLmFkZChyMSk7Ci0JCQotCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZUNvbmZpZ3VyYXRpb24oImNvbmZpZyAxIik7Ci0JCWNvbmZpZy5nZXRNZXRob2RQbHVnaW5TZWxlY3Rpb24oKS5hZGQocGx1Z2luKTsKLQkJY29uZmlnLmdldE1ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKS5hZGQocGtnKTsKLQkJTGlicmFyeVV0aWwudmFsaWRhdGVNZXRob2RDb25maWd1cmF0aW9uKGNvbmZpZyk7CQotCQlFbGVtZW50UmVhbGl6ZXIgcmVhbGl6ZXIgPSBEZWZhdWx0RWxlbWVudFJlYWxpemVyLm5ld0VsZW1lbnRSZWFsaXplcihjb25maWcpOwotCQkKLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrX1BlcmZvcm1lZEJ5KCk7Ci0JCS8vTWV0aG9kRWxlbWVudCByID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMDFGZWF0dXJlVmFsdWUodDEsIGZlYXR1cmUsIHJlYWxpemVyKTsKLQkJTGlzdDxNZXRob2RFbGVtZW50PiBsaXN0ID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMG5GZWF0dXJlVmFsdWUodDEsIGZlYXR1cmUsIHJlYWxpemVyKTsKLQkJYXNzZXJ0RXF1YWxzKHIxLCBsaXN0LmdldCgwKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RfdGFza19wZXJmb3JtZWRCeV93aXRoX2NvbnRyaWJ1dG9yKCkgewotCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlTWV0aG9kUGx1Z2luKCJwbHVnaW4gMSIpOwotCQlDb250ZW50UGFja2FnZSBwa2cgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVDb250ZW50UGFja2FnZShwbHVnaW4sICJwMSIpOwotCQlUYXNrIHQxID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlVGFzayhwa2csICJ0MSIpOwotCQlSb2xlIHIxID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlUm9sZShwa2csICJyMSIpOwotCQlUYXNrIHQyID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlVGFzayhwa2csICJ0MiIpOwotCQlSb2xlIHIyID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlUm9sZShwa2csICJyMiIpOwotCQkKLQkJdDEuZ2V0UGVyZm9ybWVkQnkoKS5hZGQocjEpOwotCQl0Mi5nZXRQZXJmb3JtZWRCeSgpLmFkZChyMik7Ci0JCQotCQkvLyB0MiBjb250cmlidXRlcyB0byB0MSwgc2luY2UgdDEgYWxyZWFkeSBoYXMgYSB0by1vbmUgYXNzb2NpYXRpb24sIAotCQkvLyB0aGUgb25lIGZyb20gdGhlIGNvbnRyaWJ1dG9yIGlzIGlnbm9yZWQKLQkJTGlicmFyeVRlc3RIZWxwZXIuc2V0Q29udHJpYnV0ZXModDIsIHQxKTsKLQkJCi0JCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlQ29uZmlndXJhdGlvbigiY29uZmlnIDEiKTsKLQkJY29uZmlnLmdldE1ldGhvZFBsdWdpblNlbGVjdGlvbigpLmFkZChwbHVnaW4pOwotCQljb25maWcuZ2V0TWV0aG9kUGFja2FnZVNlbGVjdGlvbigpLmFkZChwa2cpOwotCQlMaWJyYXJ5VXRpbC52YWxpZGF0ZU1ldGhvZENvbmZpZ3VyYXRpb24oY29uZmlnKTsJCi0JCUVsZW1lbnRSZWFsaXplciByZWFsaXplciA9IERlZmF1bHRFbGVtZW50UmVhbGl6ZXIubmV3RWxlbWVudFJlYWxpemVyKGNvbmZpZyk7Ci0JCQotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tfUGVyZm9ybWVkQnkoKTsKLQkJLy9NZXRob2RFbGVtZW50IHIgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwMUZlYXR1cmVWYWx1ZSh0MSwgZmVhdHVyZSwgcmVhbGl6ZXIpOwotCQkvL2Fzc2VydEVxdWFscyhyMSwgcik7Ci0JCUxpc3Q8TWV0aG9kRWxlbWVudD4gbGlzdCA9IENvbmZpZ3VyYXRpb25IZWxwZXIuY2FsYzBuRmVhdHVyZVZhbHVlKHQxLCBmZWF0dXJlLCByZWFsaXplcik7Ci0JCWFzc2VydEVxdWFscyhyMSwgbGlzdC5nZXQoMCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0X3Rhc2tfcGVyZm9ybWVkQnlfZnJvbV9jb250cmlidXRvcigpIHsKLQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZU1ldGhvZFBsdWdpbigicGx1Z2luIDEiKTsKLQkJQ29udGVudFBhY2thZ2UgcGtnID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlQ29udGVudFBhY2thZ2UocGx1Z2luLCAicDEiKTsKLQkJVGFzayB0MSA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZVRhc2socGtnLCAidDEiKTsKLS8vCQlSb2xlIHIxID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlUm9sZShwa2csICJyMSIpOwotCQlUYXNrIHQyID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlVGFzayhwa2csICJ0MiIpOwotCQlSb2xlIHIyID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlUm9sZShwa2csICJyMiIpOwotCQkKLQkJLy8gZG9uJ3Qgc2V0IHBlcmZvcm1lciBpbiB0MSwgc28gaXQgd2lsbCBnZXQgZnJvbSB0aGUgY29udHJpYnV0b3IKLQkJLy90MS5zZXRQZXJmb3JtZWRCeShyMSk7Ci0JCXQyLmdldFBlcmZvcm1lZEJ5KCkuYWRkKHIyKTsKLQkJCi0JCS8vIHQyIGNvbnRyaWJ1dGVzIHRvIHQxLCBzaW5jZSB0MSBkb2VzIG5vdCBoYXZlIGEgdG8tb25lIGFzc29jaWF0aW9uLCAKLQkJLy8gdGhlIG9uZSBmcm9tIHRoZSBjb250cmlidXRvciBpcyB1c2VkCi0JCUxpYnJhcnlUZXN0SGVscGVyLnNldENvbnRyaWJ1dGVzKHQyLCB0MSk7Ci0JCQotCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZUNvbmZpZ3VyYXRpb24oImNvbmZpZyAxIik7Ci0JCWNvbmZpZy5nZXRNZXRob2RQbHVnaW5TZWxlY3Rpb24oKS5hZGQocGx1Z2luKTsKLQkJY29uZmlnLmdldE1ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKS5hZGQocGtnKTsKLQkJTGlicmFyeVV0aWwudmFsaWRhdGVNZXRob2RDb25maWd1cmF0aW9uKGNvbmZpZyk7CQotCQlFbGVtZW50UmVhbGl6ZXIgcmVhbGl6ZXIgPSBEZWZhdWx0RWxlbWVudFJlYWxpemVyLm5ld0VsZW1lbnRSZWFsaXplcihjb25maWcpOwotCQkKLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrX1BlcmZvcm1lZEJ5KCk7Ci0JCS8vTWV0aG9kRWxlbWVudCByID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMDFGZWF0dXJlVmFsdWUodDEsIGZlYXR1cmUsIHJlYWxpemVyKTsKLQkJLy9hc3NlcnRFcXVhbHMocjIsIHIpOwotCQlMaXN0PE1ldGhvZEVsZW1lbnQ+IGxpc3QgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwbkZlYXR1cmVWYWx1ZSh0MSwgZmVhdHVyZSwgcmVhbGl6ZXIpOwotCQlhc3NlcnRFcXVhbHMocjIsIGxpc3QuZ2V0KDApKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdF90YXNrX3BlcmZvcm1lZEJ5X3dpdGhfY29udHJpYnV0b3JzKCkgewotCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlTWV0aG9kUGx1Z2luKCJwbHVnaW4gMSIpOwotCQlDb250ZW50UGFja2FnZSBwa2cgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVDb250ZW50UGFja2FnZShwbHVnaW4sICJwMSIpOwotCQlUYXNrIHQxID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlVGFzayhwa2csICJ0MSIpOwotLy8JCVJvbGUgcjEgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVSb2xlKHBrZywgInIxIik7Ci0JCVRhc2sgdDIgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVUYXNrKHBrZywgInQyIik7Ci0JCVJvbGUgcjIgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVSb2xlKHBrZywgInIyIik7Ci0KLQkJVGFzayB0MyA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZVRhc2socGtnLCAidDMiKTsKLQkJUm9sZSByMyA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZVJvbGUocGtnLCAicjMiKTsKLQotCQkvLyBkb24ndCBzZXQgcGVyZm9ybWVyIGluIHQxLCBzbyBpdCB3aWxsIGdldCBmcm9tIHRoZSBjb250cmlidXRvcgotCQl0Mi5nZXRQZXJmb3JtZWRCeSgpLmFkZChyMik7Ci0JCXQzLmdldFBlcmZvcm1lZEJ5KCkuYWRkKHIzKTsKLQkJCi0JCS8vIHQyIGFuZCB0MyBib3RoIGNvbnRyaWJ1dGUgdG8gdDEsIGV2ZW4gdGhvdWdoIHQxIGRvZXMgbm90IGhhdmUgYSB0by1vbmUgYXNzb2NpYXRpb24sIAotCQkvLyB0aGUgb25lcyBmcm9tIHRoZSBjb250cmlidXRvcnMgYXJlIGlnbm9yZWQgc2luY2UgdGhlcmUgYXJlIG1vcmUgdGhhbiBvbmUKLQkJTGlicmFyeVRlc3RIZWxwZXIuc2V0Q29udHJpYnV0ZXModDIsIHQxKTsKLQkJTGlicmFyeVRlc3RIZWxwZXIuc2V0Q29udHJpYnV0ZXModDMsIHQxKTsKLQkJCi0JCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlQ29uZmlndXJhdGlvbigiY29uZmlnIDEiKTsKLQkJY29uZmlnLmdldE1ldGhvZFBsdWdpblNlbGVjdGlvbigpLmFkZChwbHVnaW4pOwotCQljb25maWcuZ2V0TWV0aG9kUGFja2FnZVNlbGVjdGlvbigpLmFkZChwa2cpOwotCQlMaWJyYXJ5VXRpbC52YWxpZGF0ZU1ldGhvZENvbmZpZ3VyYXRpb24oY29uZmlnKTsJCi0JCUVsZW1lbnRSZWFsaXplciByZWFsaXplciA9IERlZmF1bHRFbGVtZW50UmVhbGl6ZXIubmV3RWxlbWVudFJlYWxpemVyKGNvbmZpZyk7Ci0JCQotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tfUGVyZm9ybWVkQnkoKTsKLQkJTWV0aG9kRWxlbWVudCByID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMDFGZWF0dXJlVmFsdWUodDEsIGZlYXR1cmUsIHJlYWxpemVyKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHIpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0X3Rhc2tfcGVyZm9ybWVkQnlfd2l0aF9yZXBsYWNlcigpIHsKLQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZU1ldGhvZFBsdWdpbigicGx1Z2luIDEiKTsKLQkJQ29udGVudFBhY2thZ2UgcGtnID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlQ29udGVudFBhY2thZ2UocGx1Z2luLCAicDEiKTsKLQkJVGFzayB0MSA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZVRhc2socGtnLCAidDEiKTsKLQkJUm9sZSByMSA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZVJvbGUocGtnLCAicjEiKTsKLQkJVGFzayB0MiA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZVRhc2socGtnLCAidDIiKTsKLQkJUm9sZSByMiA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZVJvbGUocGtnLCAicjIiKTsKLQkJCi0JCXQxLmdldFBlcmZvcm1lZEJ5KCkuYWRkKHIxKTsKLQkJdDIuZ2V0UGVyZm9ybWVkQnkoKS5hZGQocjIpOwotCQkKLQkJTGlicmFyeVRlc3RIZWxwZXIuc2V0UmVwbGFjZXModDIsIHQxKTsKLQkJCi0JCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlQ29uZmlndXJhdGlvbigiY29uZmlnIDEiKTsKLQkJY29uZmlnLmdldE1ldGhvZFBsdWdpblNlbGVjdGlvbigpLmFkZChwbHVnaW4pOwotCQljb25maWcuZ2V0TWV0aG9kUGFja2FnZVNlbGVjdGlvbigpLmFkZChwa2cpOwotCQlMaWJyYXJ5VXRpbC52YWxpZGF0ZU1ldGhvZENvbmZpZ3VyYXRpb24oY29uZmlnKTsJCi0JCUVsZW1lbnRSZWFsaXplciByZWFsaXplciA9IERlZmF1bHRFbGVtZW50UmVhbGl6ZXIubmV3RWxlbWVudFJlYWxpemVyKGNvbmZpZyk7Ci0JCQotCQlNZXRob2RFbGVtZW50IHQgPSBDb25maWd1cmF0aW9uSGVscGVyLmdldENhbGN1bGF0ZWRFbGVtZW50KHQxLCByZWFsaXplcik7Ci0JCWFzc2VydEVxdWFscyh0MiwgdCk7ICAvLyBpZiB0aGlzIGZhaWwsIHRoZSByZW1haW5pbmcgY29kZSB3aWxsIG5vdCBiZSBleGVjdXRlZAotCQkKLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrX1BlcmZvcm1lZEJ5KCk7Ci0JCS8vTWV0aG9kRWxlbWVudCByID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMDFGZWF0dXJlVmFsdWUodCwgZmVhdHVyZSwgcmVhbGl6ZXIpOwotCQkvL2Fzc2VydEVxdWFscyhyMiwgcik7Ci0JCUxpc3Q8TWV0aG9kRWxlbWVudD4gbGlzdCA9IENvbmZpZ3VyYXRpb25IZWxwZXIuY2FsYzBuRmVhdHVyZVZhbHVlKHQxLCBmZWF0dXJlLCByZWFsaXplcik7Ci0JCWFzc2VydEVxdWFscyhyMSwgbGlzdC5nZXQoMCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0X3Rhc2tfcGVyZm9ybWVkQnlfd2l0aF9yZXBsYWNlcl9ub19wZXJmb3JtZXIoKSB7Ci0JCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVNZXRob2RQbHVnaW4oInBsdWdpbiAxIik7Ci0JCUNvbnRlbnRQYWNrYWdlIHBrZyA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZUNvbnRlbnRQYWNrYWdlKHBsdWdpbiwgInAxIik7Ci0JCVRhc2sgdDEgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVUYXNrKHBrZywgInQxIik7Ci0JCVJvbGUgcjEgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVSb2xlKHBrZywgInIxIik7Ci0JCVRhc2sgdDIgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVUYXNrKHBrZywgInQyIik7Ci0JCVJvbGUgcjIgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVSb2xlKHBrZywgInIyIik7Ci0JCQotCQl0MS5nZXRQZXJmb3JtZWRCeSgpLmFkZChyMSk7Ci0JCQotCQkvLyB0MiBoYXMgbm8gcHJpbWFyeSBwZXJmb3JtZXIKLS8vCQl0Mi5zZXRQZXJmb3JtZWRCeShyMik7Ci0JCQotCQlMaWJyYXJ5VGVzdEhlbHBlci5zZXRSZXBsYWNlcyh0MiwgdDEpOwotCQkKLQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVDb25maWd1cmF0aW9uKCJjb25maWcgMSIpOwotCQljb25maWcuZ2V0TWV0aG9kUGx1Z2luU2VsZWN0aW9uKCkuYWRkKHBsdWdpbik7Ci0JCWNvbmZpZy5nZXRNZXRob2RQYWNrYWdlU2VsZWN0aW9uKCkuYWRkKHBrZyk7Ci0JCUxpYnJhcnlVdGlsLnZhbGlkYXRlTWV0aG9kQ29uZmlndXJhdGlvbihjb25maWcpOwkKLQkJRWxlbWVudFJlYWxpemVyIHJlYWxpemVyID0gRGVmYXVsdEVsZW1lbnRSZWFsaXplci5uZXdFbGVtZW50UmVhbGl6ZXIoY29uZmlnKTsKLQkJCi0JCU1ldGhvZEVsZW1lbnQgdCA9IENvbmZpZ3VyYXRpb25IZWxwZXIuZ2V0Q2FsY3VsYXRlZEVsZW1lbnQodDEsIHJlYWxpemVyKTsKLQkJYXNzZXJ0RXF1YWxzKHQyLCB0KTsgIC8vIGlmIHRoaXMgZmFpbCwgdGhlIHJlbWFpbmluZyBjb2RlIHdpbGwgbm90IGJlIGV4ZWN1dGVkCi0JCQotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tfUGVyZm9ybWVkQnkoKTsKLQkJTWV0aG9kRWxlbWVudCByID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMDFGZWF0dXJlVmFsdWUodCwgZmVhdHVyZSwgcmVhbGl6ZXIpOwotCQkKLQkJaWYgKEVsZW1lbnRSZWFsaXplci5pc0V4dGVuZFJlcGxhY2VFbmFibGVkKCkgKSB7Ci0JCQlhc3NlcnRFcXVhbHMocjEsIHIpOyAgCi0JCX0gZWxzZSB7Ci0JCQlhc3NlcnRFcXVhbHMobnVsbCwgcik7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdF90YXNrX3BlcmZvcm1lZEJ5X3dpdGhfcmVwbGFjZXJzKCkgewotCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlTWV0aG9kUGx1Z2luKCJwbHVnaW4gMSIpOwotCQlDb250ZW50UGFja2FnZSBwa2cgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVDb250ZW50UGFja2FnZShwbHVnaW4sICJwMSIpOwotCQlUYXNrIHQxID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlVGFzayhwa2csICJ0MSIpOwotCQlSb2xlIHIxID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlUm9sZShwa2csICJyMSIpOwotCQlUYXNrIHQyID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlVGFzayhwa2csICJ0MiIpOwotCQlSb2xlIHIyID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlUm9sZShwa2csICJyMiIpOwotCQlUYXNrIHQzID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlVGFzayhwa2csICJ0MyIpOwotCQlSb2xlIHIzID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlUm9sZShwa2csICJyMyIpOwotCQkKLQkJdDEuZ2V0UGVyZm9ybWVkQnkoKS5hZGQocjEpOwotCQl0Mi5nZXRQZXJmb3JtZWRCeSgpLmFkZChyMik7Ci0JCXQzLmdldFBlcmZvcm1lZEJ5KCkuYWRkKHIzKTsKLQkJCi0JCUxpYnJhcnlUZXN0SGVscGVyLnNldFJlcGxhY2VzKHQyLCB0MSk7Ci0JCUxpYnJhcnlUZXN0SGVscGVyLnNldFJlcGxhY2VzKHQzLCB0MSk7Ci0JCQotCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZUNvbmZpZ3VyYXRpb24oImNvbmZpZyAxIik7Ci0JCWNvbmZpZy5nZXRNZXRob2RQbHVnaW5TZWxlY3Rpb24oKS5hZGQocGx1Z2luKTsKLQkJY29uZmlnLmdldE1ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKS5hZGQocGtnKTsKLQkJTGlicmFyeVV0aWwudmFsaWRhdGVNZXRob2RDb25maWd1cmF0aW9uKGNvbmZpZyk7CQotCQlFbGVtZW50UmVhbGl6ZXIgcmVhbGl6ZXIgPSBEZWZhdWx0RWxlbWVudFJlYWxpemVyLm5ld0VsZW1lbnRSZWFsaXplcihjb25maWcpOwotCQkKLQkJLy8gaWYgbW9yZSB0aGFuIG9uZSByZXBsYWNlciwgYWxsIHJlcGxhY2VycyBhcmUgaWdub3JlZAotCQlNZXRob2RFbGVtZW50IHQgPSBDb25maWd1cmF0aW9uSGVscGVyLmdldENhbGN1bGF0ZWRFbGVtZW50KHQxLCByZWFsaXplcik7Ci0JCWFzc2VydEVxdWFscyh0MSwgdCk7IAotCQkKLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrX1BlcmZvcm1lZEJ5KCk7Ci0JCS8vTWV0aG9kRWxlbWVudCByID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMDFGZWF0dXJlVmFsdWUodCwgZmVhdHVyZSwgcmVhbGl6ZXIpOwotCQkvL2Fzc2VydEVxdWFscyhyMSwgcik7Ci0JCUxpc3Q8TWV0aG9kRWxlbWVudD4gbGlzdCA9IENvbmZpZ3VyYXRpb25IZWxwZXIuY2FsYzBuRmVhdHVyZVZhbHVlKHQxLCBmZWF0dXJlLCByZWFsaXplcik7Ci0JCWFzc2VydEVxdWFscyhyMSwgbGlzdC5nZXQoMCkpOwotCX0KLQkKLQkKLQlwdWJsaWMgdm9pZCB0ZXN0X3Rhc2tfcGVyZm9ybWVkQnlfd2l0aF9leHRlbmRlcnMoKSB7Ci0JCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVNZXRob2RQbHVnaW4oInBsdWdpbiAxIik7Ci0JCUNvbnRlbnRQYWNrYWdlIHBrZyA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZUNvbnRlbnRQYWNrYWdlKHBsdWdpbiwgInAxIik7Ci0JCVRhc2sgdDEgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVUYXNrKHBrZywgInQxIik7Ci0JCVJvbGUgcjEgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVSb2xlKHBrZywgInIxIik7Ci0JCVRhc2sgdDIgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVUYXNrKHBrZywgInQyIik7Ci0JCVJvbGUgcjIgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVSb2xlKHBrZywgInIyIik7Ci0vLwkJVGFzayB0MyA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZVRhc2socGtnLCAidDMiKTsKLS8vCQlSb2xlIHIzID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlUm9sZShwa2csICJyMyIpOwotCQkKLQkJTGlicmFyeVRlc3RIZWxwZXIuc2V0RXh0ZW5kcyh0MiwgdDEpOwotCQkKLQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVDb25maWd1cmF0aW9uKCJjb25maWcgMSIpOwotCQljb25maWcuZ2V0TWV0aG9kUGx1Z2luU2VsZWN0aW9uKCkuYWRkKHBsdWdpbik7Ci0JCWNvbmZpZy5nZXRNZXRob2RQYWNrYWdlU2VsZWN0aW9uKCkuYWRkKHBrZyk7Ci0JCUxpYnJhcnlVdGlsLnZhbGlkYXRlTWV0aG9kQ29uZmlndXJhdGlvbihjb25maWcpOwkKLQkJRWxlbWVudFJlYWxpemVyIHJlYWxpemVyID0gRGVmYXVsdEVsZW1lbnRSZWFsaXplci5uZXdFbGVtZW50UmVhbGl6ZXIoY29uZmlnKTsKLQkJCi0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza19QZXJmb3JtZWRCeSgpOwotCQlNZXRob2RFbGVtZW50IHI7Ci0JCQotCQkvLyBjYXNlIDE6Ci0JCS8vdDEuZ2V0UGVyZm9ybWVkQnkoKS5hZGQobnVsbCk7Ci0JCXQyLmdldFBlcmZvcm1lZEJ5KCkuYWRkKHIyKTsJCQotCQkvL3IgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwMUZlYXR1cmVWYWx1ZSh0MSwgZmVhdHVyZSwgcmVhbGl6ZXIpOwotCQkvL2Fzc2VydEVxdWFscyhudWxsLCByKTsKLQkJTGlzdDxNZXRob2RFbGVtZW50PiBsaXN0ID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMG5GZWF0dXJlVmFsdWUodDEsIGZlYXR1cmUsIHJlYWxpemVyKTsKLQkJYXNzZXJ0VHJ1ZShsaXN0LmlzRW1wdHkoKSk7Ci0JCQotCQkvL3IgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwMUZlYXR1cmVWYWx1ZSh0MiwgZmVhdHVyZSwgcmVhbGl6ZXIpOwotCQkvL2Fzc2VydEVxdWFscyhyMiwgcik7Ci0JCWxpc3QgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwbkZlYXR1cmVWYWx1ZSh0MiwgZmVhdHVyZSwgcmVhbGl6ZXIpOwotCQlhc3NlcnRFcXVhbHMocjIsIGxpc3QuZ2V0KDApKTsKLQkJCi0JCS8vIGNhc2UgMjoKLQkJdDEuZ2V0UGVyZm9ybWVkQnkoKS5hZGQocjEpOwotCQl0Mi5nZXRQZXJmb3JtZWRCeSgpLmFkZChyMSk7Ci0KLQkJLy9yID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMDFGZWF0dXJlVmFsdWUodDEsIGZlYXR1cmUsIHJlYWxpemVyKTsKLQkJLy9hc3NlcnRFcXVhbHMocjEsIHIpOwotCQlsaXN0ID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMG5GZWF0dXJlVmFsdWUodDEsIGZlYXR1cmUsIHJlYWxpemVyKTsKLQkJYXNzZXJ0RXF1YWxzKHIxLCBsaXN0LmdldCgwKSk7Ci0JCQotCQkvL3IgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwMUZlYXR1cmVWYWx1ZSh0MiwgZmVhdHVyZSwgcmVhbGl6ZXIpOwotCQkvL2Fzc2VydEVxdWFscyhyMiwgcik7Ci0JCWxpc3QgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwbkZlYXR1cmVWYWx1ZSh0MiwgZmVhdHVyZSwgcmVhbGl6ZXIpOwotCQlhc3NlcnRUcnVlKGxpc3Quc2l6ZSgpID09IDIpOwotCQlhc3NlcnRFcXVhbHMocjIsIGxpc3QuZ2V0KDApKTsKLQkJYXNzZXJ0RXF1YWxzKHIxLCBsaXN0LmdldCgxKSk7Ci0JCQotCQkvLyBjYXNlIDM6Ci0JCXQxLmdldFBlcmZvcm1lZEJ5KCkuY2xlYXIoKTsKLQkJdDIuZ2V0UGVyZm9ybWVkQnkoKS5jbGVhcigpOwotCQl0MS5nZXRQZXJmb3JtZWRCeSgpLmFkZChyMSk7Ci0JCS8vdDIuZ2V0UGVyZm9ybWVkQnkoKS5hZGQobnVsbCk7Ci0KLQkJLy9yID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMDFGZWF0dXJlVmFsdWUodDEsIGZlYXR1cmUsIHJlYWxpemVyKTsKLQkJLy9hc3NlcnRFcXVhbHMocjEsIHIpOwotCQlsaXN0ID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMG5GZWF0dXJlVmFsdWUodDEsIGZlYXR1cmUsIHJlYWxpemVyKTsKLQkJYXNzZXJ0RXF1YWxzKHIxLCBsaXN0LmdldCgwKSk7Ci0JCQotCQkvL3IgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwMUZlYXR1cmVWYWx1ZSh0MiwgZmVhdHVyZSwgcmVhbGl6ZXIpOwotCQkvL2Fzc2VydEVxdWFscyhyMSwgcik7Ci0JCWxpc3QgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwbkZlYXR1cmVWYWx1ZSh0MiwgZmVhdHVyZSwgcmVhbGl6ZXIpOwotCQlhc3NlcnRFcXVhbHMocjEsIGxpc3QuZ2V0KDApKTsKLQkJCi0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0cy92YXJpYWJpbGl0eS9PdXRnb2luZzBuRmVhdHVyZVRlc3QuamF2YSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdHMvdmFyaWFiaWxpdHkvT3V0Z29pbmcwbkZlYXR1cmVUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1ZWM5N2QuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0cy92YXJpYWJpbGl0eS9PdXRnb2luZzBuRmVhdHVyZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy52YXJpYWJpbGl0eTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5EZWZhdWx0RWxlbWVudFJlYWxpemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uRWxlbWVudFJlYWxpemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzLkxpYnJhcnlUZXN0SGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuTGlicmFyeVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BcnRpZmFjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5TZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFzazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogVGVzdCBjYXNlIGZvciAwLi5uIGZlYXR1cmUgdmFyYWliaWxpdHkuCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBPdXRnb2luZzBuRmVhdHVyZVRlc3QgZXh0ZW5kcyBWYXJpYWJsaXR5QmFzZVRlc3RDYXNlIHsKLQotCS8qKgotCSAqIEBwYXJhbSBuYW1lCi0JICovCi0JcHVibGljIE91dGdvaW5nMG5GZWF0dXJlVGVzdChTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0X3Rhc2tfTWFuZGF0b3J5SW5wdXQoKSB7Ci0JCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVNZXRob2RQbHVnaW4oInBsdWdpbiAxIik7Ci0JCUNvbnRlbnRQYWNrYWdlIHBrZyA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZUNvbnRlbnRQYWNrYWdlKHBsdWdpbiwgInAxIik7Ci0JCVRhc2sgdDEgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVUYXNrKHBrZywgInQxIik7Ci0JCUFydGlmYWN0IGExID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlQXJ0aWZhY3QocGtnLCAiYTEiKTsKLQkJQXJ0aWZhY3QgYTIgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVBcnRpZmFjdChwa2csICJhMiIpOwotCQkKLQkJdDEuZ2V0TWFuZGF0b3J5SW5wdXQoKS5hZGQoYTEpOwotCQl0MS5nZXRNYW5kYXRvcnlJbnB1dCgpLmFkZChhMik7Ci0JCQotCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZUNvbmZpZ3VyYXRpb24oImNvbmZpZyAxIik7Ci0JCWNvbmZpZy5nZXRNZXRob2RQbHVnaW5TZWxlY3Rpb24oKS5hZGQocGx1Z2luKTsKLQkJY29uZmlnLmdldE1ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKS5hZGQocGtnKTsKLQkJTGlicmFyeVV0aWwudmFsaWRhdGVNZXRob2RDb25maWd1cmF0aW9uKGNvbmZpZyk7CQotCQlFbGVtZW50UmVhbGl6ZXIgcmVhbGl6ZXIgPSBEZWZhdWx0RWxlbWVudFJlYWxpemVyLm5ld0VsZW1lbnRSZWFsaXplcihjb25maWcpOwotCQkKLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrX01hbmRhdG9yeUlucHV0KCk7Ci0JCUxpc3QgaXRlbXMgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwbkZlYXR1cmVWYWx1ZSh0MSwgZmVhdHVyZSwgcmVhbGl6ZXIpOwotCQlhc3NlcnRFcXVhbHMoMiwgaXRlbXMuc2l6ZSgpKTsJCQotCQlhc3NlcnRUcnVlKGl0ZW1zLmNvbnRhaW5zKGExKSk7Ci0JCWFzc2VydFRydWUoaXRlbXMuY29udGFpbnMoYTIpKTsKLQkJCi0JCS8vIGhvdyBhYm91dCBhMiBjb250cmlidXRlcyB0byBhMQotCQlMaWJyYXJ5VGVzdEhlbHBlci5zZXRDb250cmlidXRlcyhhMiwgYTEpOwotCQlpdGVtcyA9IENvbmZpZ3VyYXRpb25IZWxwZXIuY2FsYzBuRmVhdHVyZVZhbHVlKHQxLCBmZWF0dXJlLCByZWFsaXplcik7Ci0JCWFzc2VydEVxdWFscygxLCBpdGVtcy5zaXplKCkpOwkJCi0JCWFzc2VydFRydWUoaXRlbXMuY29udGFpbnMoYTEpKTsKLQkJCi0JCS8vIGhvdyBhYm91dCBhMiByZXBsYWNlcyBhMQotCQlMaWJyYXJ5VGVzdEhlbHBlci5zZXRSZXBsYWNlcyhhMiwgYTEpOwotCQlpdGVtcyA9IENvbmZpZ3VyYXRpb25IZWxwZXIuY2FsYzBuRmVhdHVyZVZhbHVlKHQxLCBmZWF0dXJlLCByZWFsaXplcik7Ci0JCWFzc2VydEVxdWFscygxLCBpdGVtcy5zaXplKCkpOwkJCi0JCWFzc2VydFRydWUoaXRlbXMuY29udGFpbnMoYTIpKTsKLQkJCi0JCS8vIGhvdyBhYm91dCBhMiBleHRlbmRzIGExCi0JCUxpYnJhcnlUZXN0SGVscGVyLnNldEV4dGVuZHMoYTIsIGExKTsKLQkJaXRlbXMgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwbkZlYXR1cmVWYWx1ZSh0MSwgZmVhdHVyZSwgcmVhbGl6ZXIpOwotCQlhc3NlcnRFcXVhbHMoMiwgaXRlbXMuc2l6ZSgpKTsJCQotCQlhc3NlcnRUcnVlKGl0ZW1zLmNvbnRhaW5zKGExKSk7Ci0JCWFzc2VydFRydWUoaXRlbXMuY29udGFpbnMoYTIpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdF90YXNrX01hbmRhdG9yeUlucHV0X3dpdGhfY29udHJpYnV0b3IoKSB7Ci0JCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVNZXRob2RQbHVnaW4oInBsdWdpbiAxIik7Ci0JCUNvbnRlbnRQYWNrYWdlIHBrZyA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZUNvbnRlbnRQYWNrYWdlKHBsdWdpbiwgInAxIik7Ci0JCVRhc2sgdDEgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVUYXNrKHBrZywgInQxIik7Ci0JCUFydGlmYWN0IGExID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlQXJ0aWZhY3QocGtnLCAiYTEiKTsKLQkJQXJ0aWZhY3QgYTIgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVBcnRpZmFjdChwa2csICJhMiIpOwkKLQkJdDEuZ2V0TWFuZGF0b3J5SW5wdXQoKS5hZGQoYTEpOwotCQl0MS5nZXRNYW5kYXRvcnlJbnB1dCgpLmFkZChhMik7Ci0JCQotCQlUYXNrIHQyID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlVGFzayhwa2csICJ0MiIpOwotCQlBcnRpZmFjdCBhMyA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZUFydGlmYWN0KHBrZywgImEzIik7Ci0JCUFydGlmYWN0IGE0ID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlQXJ0aWZhY3QocGtnLCAiYTQiKTsJCi0JCXQyLmdldE1hbmRhdG9yeUlucHV0KCkuYWRkKGEzKTsKLQkJdDIuZ2V0TWFuZGF0b3J5SW5wdXQoKS5hZGQoYTQpOwotCQkKLQkJTGlicmFyeVRlc3RIZWxwZXIuc2V0Q29udHJpYnV0ZXModDIsIHQxKTsKLQkJCi0JCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlQ29uZmlndXJhdGlvbigiY29uZmlnIDEiKTsKLQkJY29uZmlnLmdldE1ldGhvZFBsdWdpblNlbGVjdGlvbigpLmFkZChwbHVnaW4pOwotCQljb25maWcuZ2V0TWV0aG9kUGFja2FnZVNlbGVjdGlvbigpLmFkZChwa2cpOwotCQlMaWJyYXJ5VXRpbC52YWxpZGF0ZU1ldGhvZENvbmZpZ3VyYXRpb24oY29uZmlnKTsJCi0JCUVsZW1lbnRSZWFsaXplciByZWFsaXplciA9IERlZmF1bHRFbGVtZW50UmVhbGl6ZXIubmV3RWxlbWVudFJlYWxpemVyKGNvbmZpZyk7Ci0JCQotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tfTWFuZGF0b3J5SW5wdXQoKTsKLQkJTGlzdCBpdGVtcyA9IENvbmZpZ3VyYXRpb25IZWxwZXIuY2FsYzBuRmVhdHVyZVZhbHVlKHQxLCBmZWF0dXJlLCByZWFsaXplcik7Ci0JCWFzc2VydEVxdWFscyg0LCBpdGVtcy5zaXplKCkpOwkJCi0JCWFzc2VydFRydWUoaXRlbXMuY29udGFpbnMoYTEpKTsKLQkJYXNzZXJ0VHJ1ZShpdGVtcy5jb250YWlucyhhMikpOwotCQlhc3NlcnRUcnVlKGl0ZW1zLmNvbnRhaW5zKGEzKSk7Ci0JCWFzc2VydFRydWUoaXRlbXMuY29udGFpbnMoYTQpKTsKLQkJCi0JCS8vIGhvdyBhYm91dCBhMiBjb250cmlidXRlcyB0byBhMQotCQlMaWJyYXJ5VGVzdEhlbHBlci5zZXRDb250cmlidXRlcyhhMiwgYTEpOwotCQlpdGVtcyA9IENvbmZpZ3VyYXRpb25IZWxwZXIuY2FsYzBuRmVhdHVyZVZhbHVlKHQxLCBmZWF0dXJlLCByZWFsaXplcik7Ci0JCWFzc2VydEVxdWFscygzLCBpdGVtcy5zaXplKCkpOwkJCi0JCWFzc2VydFRydWUoaXRlbXMuY29udGFpbnMoYTEpKTsKLQkJYXNzZXJ0VHJ1ZShpdGVtcy5jb250YWlucyhhMykpOwotCQlhc3NlcnRUcnVlKGl0ZW1zLmNvbnRhaW5zKGE0KSk7Ci0JCQotCQkvLyBob3cgYWJvdXQgYTMgcmVwbGFjZXMgYTEKLQkJTGlicmFyeVRlc3RIZWxwZXIuc2V0UmVwbGFjZXMoYTMsIGExKTsKLQkJaXRlbXMgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwbkZlYXR1cmVWYWx1ZSh0MSwgZmVhdHVyZSwgcmVhbGl6ZXIpOwotCQlhc3NlcnRFcXVhbHMoMiwgaXRlbXMuc2l6ZSgpKTsJCQotCQlhc3NlcnRUcnVlKGl0ZW1zLmNvbnRhaW5zKGEzKSk7Ci0JCWFzc2VydFRydWUoaXRlbXMuY29udGFpbnMoYTQpKTsKLQkJCi0JCS8vIGhvdyBhYm91dCBhNCByZXBsYWNlcyBhMSB0b286IGEzIGFuZCBhMyB3aWxsIGJlIGlnbm9yZWQsIGEyIGlzIHJlc3VsdGluZyB0byBhMSwgc28gb25seSBnZXQgYTEKLQkJTGlicmFyeVRlc3RIZWxwZXIuc2V0UmVwbGFjZXMoYTQsIGExKTsKLQkJaXRlbXMgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwbkZlYXR1cmVWYWx1ZSh0MSwgZmVhdHVyZSwgcmVhbGl6ZXIpOwotCQlhc3NlcnRFcXVhbHMoMSwgaXRlbXMuc2l6ZSgpKTsJCQotCQlhc3NlcnRUcnVlKGl0ZW1zLmNvbnRhaW5zKGExKSk7Ci0JfQotCQotCQotCXB1YmxpYyB2b2lkIHRlc3RfdGFza19NYW5kYXRvcnlJbnB1dF93aXRoX2NvbnRyaWJ1dG9ycygpIHsKLQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZU1ldGhvZFBsdWdpbigicGx1Z2luIDEiKTsKLQkJQ29udGVudFBhY2thZ2UgcGtnID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlQ29udGVudFBhY2thZ2UocGx1Z2luLCAicDEiKTsKLQkJVGFzayB0MSA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZVRhc2socGtnLCAidDEiKTsKLQkJQXJ0aWZhY3QgYTEgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVBcnRpZmFjdChwa2csICJhMSIpOwotCQlBcnRpZmFjdCBhMiA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZUFydGlmYWN0KHBrZywgImEyIik7CQotCQl0MS5nZXRNYW5kYXRvcnlJbnB1dCgpLmFkZChhMSk7Ci0JCXQxLmdldE1hbmRhdG9yeUlucHV0KCkuYWRkKGEyKTsKLQkJCi0JCVRhc2sgdDIgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVUYXNrKHBrZywgInQyIik7Ci0JCUFydGlmYWN0IGEzID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlQXJ0aWZhY3QocGtnLCAiYTMiKTsKLQkJQXJ0aWZhY3QgYTQgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVBcnRpZmFjdChwa2csICJhNCIpOwkKLQkJdDIuZ2V0TWFuZGF0b3J5SW5wdXQoKS5hZGQoYTMpOwotCQl0Mi5nZXRNYW5kYXRvcnlJbnB1dCgpLmFkZChhNCk7Ci0KLQkJVGFzayB0MyA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZVRhc2socGtnLCAidDMiKTsKLQkJQXJ0aWZhY3QgYTUgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVBcnRpZmFjdChwa2csICJhNSIpOwotCQl0My5nZXRNYW5kYXRvcnlJbnB1dCgpLmFkZChhNSk7Ci0JCi0JCUxpYnJhcnlUZXN0SGVscGVyLnNldENvbnRyaWJ1dGVzKHQyLCB0MSk7Ci0JCUxpYnJhcnlUZXN0SGVscGVyLnNldENvbnRyaWJ1dGVzKHQzLCB0MSk7Ci0JCQotCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZUNvbmZpZ3VyYXRpb24oImNvbmZpZyAxIik7Ci0JCWNvbmZpZy5nZXRNZXRob2RQbHVnaW5TZWxlY3Rpb24oKS5hZGQocGx1Z2luKTsKLQkJY29uZmlnLmdldE1ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKS5hZGQocGtnKTsKLQkJTGlicmFyeVV0aWwudmFsaWRhdGVNZXRob2RDb25maWd1cmF0aW9uKGNvbmZpZyk7CQotCQlFbGVtZW50UmVhbGl6ZXIgcmVhbGl6ZXIgPSBEZWZhdWx0RWxlbWVudFJlYWxpemVyLm5ld0VsZW1lbnRSZWFsaXplcihjb25maWcpOwotCQkKLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrX01hbmRhdG9yeUlucHV0KCk7Ci0JCUxpc3QgaXRlbXMgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwbkZlYXR1cmVWYWx1ZSh0MSwgZmVhdHVyZSwgcmVhbGl6ZXIpOwotCQlhc3NlcnRFcXVhbHMoNSwgaXRlbXMuc2l6ZSgpKTsJCQotCQlhc3NlcnRUcnVlKGl0ZW1zLmNvbnRhaW5zKGExKSk7Ci0JCWFzc2VydFRydWUoaXRlbXMuY29udGFpbnMoYTIpKTsKLQkJYXNzZXJ0VHJ1ZShpdGVtcy5jb250YWlucyhhMykpOwotCQlhc3NlcnRUcnVlKGl0ZW1zLmNvbnRhaW5zKGE0KSk7Ci0JCWFzc2VydFRydWUoaXRlbXMuY29udGFpbnMoYTUpKTsKLQkJCi0JCS8vIGhvdyBhYm91dCB0MyBjb250cmlidXRlcyB0byB0Miwgc2FtZSByZXN1bHQKLQkJTGlicmFyeVRlc3RIZWxwZXIuc2V0Q29udHJpYnV0ZXModDMsIHQyKTsKLQkJaXRlbXMgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwbkZlYXR1cmVWYWx1ZSh0MSwgZmVhdHVyZSwgcmVhbGl6ZXIpOwotCQlhc3NlcnRFcXVhbHMoNSwgaXRlbXMuc2l6ZSgpKTsJCQotCQlhc3NlcnRUcnVlKGl0ZW1zLmNvbnRhaW5zKGExKSk7Ci0JCWFzc2VydFRydWUoaXRlbXMuY29udGFpbnMoYTIpKTsKLQkJYXNzZXJ0VHJ1ZShpdGVtcy5jb250YWlucyhhMykpOwotCQlhc3NlcnRUcnVlKGl0ZW1zLmNvbnRhaW5zKGE0KSk7Ci0JCWFzc2VydFRydWUoaXRlbXMuY29udGFpbnMoYTUpKTsKLQkJCi0JfQotCQotCQotCXB1YmxpYyB2b2lkIHRlc3RfdGFza19NYW5kYXRvcnlJbnB1dF93aXRoX3JlcGxhY2VycygpIHsKLQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZU1ldGhvZFBsdWdpbigicGx1Z2luIDEiKTsKLQkJQ29udGVudFBhY2thZ2UgcGtnID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlQ29udGVudFBhY2thZ2UocGx1Z2luLCAicDEiKTsKLQkJVGFzayB0MSA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZVRhc2socGtnLCAidDEiKTsKLQkJQXJ0aWZhY3QgYTEgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVBcnRpZmFjdChwa2csICJhMSIpOwotCQlBcnRpZmFjdCBhMiA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZUFydGlmYWN0KHBrZywgImEyIik7CQotCQl0MS5nZXRNYW5kYXRvcnlJbnB1dCgpLmFkZChhMSk7Ci0JCXQxLmdldE1hbmRhdG9yeUlucHV0KCkuYWRkKGEyKTsKLQkJCi0JCVRhc2sgdDIgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVUYXNrKHBrZywgInQyIik7Ci0JCUFydGlmYWN0IGEzID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlQXJ0aWZhY3QocGtnLCAiYTMiKTsKLQkJQXJ0aWZhY3QgYTQgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVBcnRpZmFjdChwa2csICJhNCIpOwkKLQkJdDIuZ2V0TWFuZGF0b3J5SW5wdXQoKS5hZGQoYTMpOwotCQl0Mi5nZXRNYW5kYXRvcnlJbnB1dCgpLmFkZChhNCk7Ci0JCi0JCVRhc2sgdDMgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVUYXNrKHBrZywgInQzIik7Ci0JCUFydGlmYWN0IGE1ID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlQXJ0aWZhY3QocGtnLCAiYTUiKTsKLQkJdDMuZ2V0TWFuZGF0b3J5SW5wdXQoKS5hZGQoYTUpOwotCi0JCUxpYnJhcnlUZXN0SGVscGVyLnNldFJlcGxhY2VzKHQyLCB0MSk7Ci0JCQotCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZUNvbmZpZ3VyYXRpb24oImNvbmZpZyAxIik7Ci0JCWNvbmZpZy5nZXRNZXRob2RQbHVnaW5TZWxlY3Rpb24oKS5hZGQocGx1Z2luKTsKLQkJY29uZmlnLmdldE1ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKS5hZGQocGtnKTsKLQkJTGlicmFyeVV0aWwudmFsaWRhdGVNZXRob2RDb25maWd1cmF0aW9uKGNvbmZpZyk7CQotCQlFbGVtZW50UmVhbGl6ZXIgcmVhbGl6ZXIgPSBEZWZhdWx0RWxlbWVudFJlYWxpemVyLm5ld0VsZW1lbnRSZWFsaXplcihjb25maWcpOwotCQkKLQkJTWV0aG9kRWxlbWVudCB0ID0gQ29uZmlndXJhdGlvbkhlbHBlci5nZXRDYWxjdWxhdGVkRWxlbWVudCh0MSwgcmVhbGl6ZXIpOwotCQlhc3NlcnRFcXVhbHModDIsIHQpOwotCQkKLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrX01hbmRhdG9yeUlucHV0KCk7Ci0JCUxpc3QgaXRlbXMgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwbkZlYXR1cmVWYWx1ZSh0LCBmZWF0dXJlLCByZWFsaXplcik7Ci0JCWFzc2VydEVxdWFscygyLCBpdGVtcy5zaXplKCkpOwkJCi0JCWFzc2VydFRydWUoaXRlbXMuY29udGFpbnMoYTMpKTsKLQkJYXNzZXJ0VHJ1ZShpdGVtcy5jb250YWlucyhhNCkpOwotCQkKLQkJLy8gaG93IGFib3V0IHQzIHJlcGxhY2VzIHRvIHQyCi0JCUxpYnJhcnlUZXN0SGVscGVyLnNldFJlcGxhY2VzKHQzLCB0Mik7Ci0JCQotCQl0ID0gQ29uZmlndXJhdGlvbkhlbHBlci5nZXRDYWxjdWxhdGVkRWxlbWVudCh0MSwgcmVhbGl6ZXIpOwotCQlhc3NlcnRFcXVhbHModDMsIHQpOwotCQkKLQkJaXRlbXMgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwbkZlYXR1cmVWYWx1ZSh0LCBmZWF0dXJlLCByZWFsaXplcik7Ci0JCWFzc2VydEVxdWFscygxLCBpdGVtcy5zaXplKCkpOwkJCi0JCWFzc2VydFRydWUoaXRlbXMuY29udGFpbnMoYTUpKTsKLQotCQkvLyBob3cgYWJvdXQgdDMgcmVwbGFjZXMgdG8gdDEsIHNvIHQyIGFuZCB0MyBib3RoIHJlcGxhY2VzIHQxLCB0aCBlcmVwbGFjZXIgaXMgaWdub3JlZAotCQlMaWJyYXJ5VGVzdEhlbHBlci5zZXRSZXBsYWNlcyh0MywgdDEpOwotCQkKLQkJdCA9IENvbmZpZ3VyYXRpb25IZWxwZXIuZ2V0Q2FsY3VsYXRlZEVsZW1lbnQodDEsIHJlYWxpemVyKTsKLQkJYXNzZXJ0RXF1YWxzKHQxLCB0KTsKLQkJCi0JCWl0ZW1zID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMG5GZWF0dXJlVmFsdWUodCwgZmVhdHVyZSwgcmVhbGl6ZXIpOwotCQlhc3NlcnRFcXVhbHMoMiwgaXRlbXMuc2l6ZSgpKTsJCQotCQlhc3NlcnRUcnVlKGl0ZW1zLmNvbnRhaW5zKGExKSk7Ci0JCWFzc2VydFRydWUoaXRlbXMuY29udGFpbnMoYTIpKTsKLQotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0X3Rhc2tfTWFuZGF0b3J5SW5wdXRfd2l0aF9leHRlbmRlcnMoKSB7Ci0JCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVNZXRob2RQbHVnaW4oInBsdWdpbiAxIik7Ci0JCUNvbnRlbnRQYWNrYWdlIHBrZyA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZUNvbnRlbnRQYWNrYWdlKHBsdWdpbiwgInAxIik7Ci0JCVRhc2sgdDEgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVUYXNrKHBrZywgInQxIik7Ci0JCUFydGlmYWN0IGExID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlQXJ0aWZhY3QocGtnLCAiYTEiKTsKLQkJQXJ0aWZhY3QgYTIgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVBcnRpZmFjdChwa2csICJhMiIpOwkKLQkJdDEuZ2V0TWFuZGF0b3J5SW5wdXQoKS5hZGQoYTEpOwotCQl0MS5nZXRNYW5kYXRvcnlJbnB1dCgpLmFkZChhMik7Ci0JCQotCQlUYXNrIHQyID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlVGFzayhwa2csICJ0MiIpOwotCQlBcnRpZmFjdCBhMyA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZUFydGlmYWN0KHBrZywgImEzIik7Ci0JCUFydGlmYWN0IGE0ID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlQXJ0aWZhY3QocGtnLCAiYTQiKTsJCi0JCXQyLmdldE1hbmRhdG9yeUlucHV0KCkuYWRkKGEzKTsKLQkJdDIuZ2V0TWFuZGF0b3J5SW5wdXQoKS5hZGQoYTQpOwotCi0JCVRhc2sgdDMgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVUYXNrKHBrZywgInQzIik7Ci0JCUFydGlmYWN0IGE1ID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlQXJ0aWZhY3QocGtnLCAiYTUiKTsKLQkJdDMuZ2V0TWFuZGF0b3J5SW5wdXQoKS5hZGQoYTUpOwotCQotCQlMaWJyYXJ5VGVzdEhlbHBlci5zZXRFeHRlbmRzKHQyLCB0MSk7Ci0JCUxpYnJhcnlUZXN0SGVscGVyLnNldEV4dGVuZHModDMsIHQxKTsKLQkJCi0JCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlQ29uZmlndXJhdGlvbigiY29uZmlnIDEiKTsKLQkJY29uZmlnLmdldE1ldGhvZFBsdWdpblNlbGVjdGlvbigpLmFkZChwbHVnaW4pOwotCQljb25maWcuZ2V0TWV0aG9kUGFja2FnZVNlbGVjdGlvbigpLmFkZChwa2cpOwotCQlMaWJyYXJ5VXRpbC52YWxpZGF0ZU1ldGhvZENvbmZpZ3VyYXRpb24oY29uZmlnKTsJCi0JCUVsZW1lbnRSZWFsaXplciByZWFsaXplciA9IERlZmF1bHRFbGVtZW50UmVhbGl6ZXIubmV3RWxlbWVudFJlYWxpemVyKGNvbmZpZyk7Ci0JCQotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tfTWFuZGF0b3J5SW5wdXQoKTsKLQkJTGlzdCBpdGVtcyA9IENvbmZpZ3VyYXRpb25IZWxwZXIuY2FsYzBuRmVhdHVyZVZhbHVlKHQxLCBmZWF0dXJlLCByZWFsaXplcik7Ci0JCWFzc2VydEVxdWFscygyLCBpdGVtcy5zaXplKCkpOwkJCi0JCWFzc2VydFRydWUoaXRlbXMuY29udGFpbnMoYTEpKTsKLQkJYXNzZXJ0VHJ1ZShpdGVtcy5jb250YWlucyhhMikpOwotCi0JCWl0ZW1zID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMG5GZWF0dXJlVmFsdWUodDIsIGZlYXR1cmUsIHJlYWxpemVyKTsKLQkJYXNzZXJ0RXF1YWxzKDQsIGl0ZW1zLnNpemUoKSk7CQkKLQkJYXNzZXJ0VHJ1ZShpdGVtcy5jb250YWlucyhhMSkpOwotCQlhc3NlcnRUcnVlKGl0ZW1zLmNvbnRhaW5zKGEyKSk7Ci0JCWFzc2VydFRydWUoaXRlbXMuY29udGFpbnMoYTMpKTsKLQkJYXNzZXJ0VHJ1ZShpdGVtcy5jb250YWlucyhhNCkpOwotCQkKLQkJaXRlbXMgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwbkZlYXR1cmVWYWx1ZSh0MywgZmVhdHVyZSwgcmVhbGl6ZXIpOwotCQlhc3NlcnRFcXVhbHMoMywgaXRlbXMuc2l6ZSgpKTsJCQotCQlhc3NlcnRUcnVlKGl0ZW1zLmNvbnRhaW5zKGExKSk7Ci0JCWFzc2VydFRydWUoaXRlbXMuY29udGFpbnMoYTIpKTsKLQkJYXNzZXJ0VHJ1ZShpdGVtcy5jb250YWlucyhhNSkpOwotCQkKLQkJLy8gaG93IGFib3V0IHQzIGV4dGVuZHMgdDIKLQkJTGlicmFyeVRlc3RIZWxwZXIuc2V0RXh0ZW5kcyh0MywgdDIpOwotCQlpdGVtcyA9IENvbmZpZ3VyYXRpb25IZWxwZXIuY2FsYzBuRmVhdHVyZVZhbHVlKHQxLCBmZWF0dXJlLCByZWFsaXplcik7Ci0JCWFzc2VydEVxdWFscygyLCBpdGVtcy5zaXplKCkpOwkJCi0JCWFzc2VydFRydWUoaXRlbXMuY29udGFpbnMoYTEpKTsKLQkJYXNzZXJ0VHJ1ZShpdGVtcy5jb250YWlucyhhMikpOwotCQkKLQkJaXRlbXMgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwbkZlYXR1cmVWYWx1ZSh0MiwgZmVhdHVyZSwgcmVhbGl6ZXIpOwotCQlhc3NlcnRFcXVhbHMoNCwgaXRlbXMuc2l6ZSgpKTsJCQotCQlhc3NlcnRUcnVlKGl0ZW1zLmNvbnRhaW5zKGExKSk7Ci0JCWFzc2VydFRydWUoaXRlbXMuY29udGFpbnMoYTIpKTsKLQkJYXNzZXJ0VHJ1ZShpdGVtcy5jb250YWlucyhhMykpOwotCQlhc3NlcnRUcnVlKGl0ZW1zLmNvbnRhaW5zKGE0KSk7Ci0JCQotCQlpdGVtcyA9IENvbmZpZ3VyYXRpb25IZWxwZXIuY2FsYzBuRmVhdHVyZVZhbHVlKHQzLCBmZWF0dXJlLCByZWFsaXplcik7Ci0JCWFzc2VydEVxdWFscyg1LCBpdGVtcy5zaXplKCkpOwkJCi0JCWFzc2VydFRydWUoaXRlbXMuY29udGFpbnMoYTEpKTsKLQkJYXNzZXJ0VHJ1ZShpdGVtcy5jb250YWlucyhhMikpOwotCQlhc3NlcnRUcnVlKGl0ZW1zLmNvbnRhaW5zKGEzKSk7Ci0JCWFzc2VydFRydWUoaXRlbXMuY29udGFpbnMoYTQpKTsKLQkJYXNzZXJ0VHJ1ZShpdGVtcy5jb250YWlucyhhNSkpOwotCi0JfQotCQotCS8vIHRlc3QgdGhlIHNlY3Rpb25zCi0JcHVibGljIHZvaWQgdGVzdF90YXNrX3N0ZXBzX3dpdGhfY29udHJpYnV0b3JzKCkgewotCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlTWV0aG9kUGx1Z2luKCJwbHVnaW4gMSIpOwotCQlDb250ZW50UGFja2FnZSBwa2cgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVDb250ZW50UGFja2FnZShwbHVnaW4sICJwMSIpOwotCQlUYXNrIHQxID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlVGFzayhwa2csICJ0MSIpOwotCQlUYXNrIHQyID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlVGFzayhwa2csICJ0MiIpOwotCQlUYXNrIHQzID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlVGFzayhwa2csICJ0MyIpOwotCQkJCi0JCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlQ29uZmlndXJhdGlvbigiY29uZmlnIDEiKTsKLQkJY29uZmlnLmdldE1ldGhvZFBsdWdpblNlbGVjdGlvbigpLmFkZChwbHVnaW4pOwotCQljb25maWcuZ2V0TWV0aG9kUGFja2FnZVNlbGVjdGlvbigpLmFkZChwa2cpOwotCQlMaWJyYXJ5VXRpbC52YWxpZGF0ZU1ldGhvZENvbmZpZ3VyYXRpb24oY29uZmlnKTsJCi0JCUVsZW1lbnRSZWFsaXplciByZWFsaXplciA9IERlZmF1bHRFbGVtZW50UmVhbGl6ZXIubmV3RWxlbWVudFJlYWxpemVyKGNvbmZpZyk7Ci0JCi0JCS8vIHRoZXNlIHR3byBzaG91bGQgZ2VuZXJhdGUgdGhlIHNhbWUgcmVzdWx0Ci0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29udGVudERlc2NyaXB0aW9uX1NlY3Rpb25zKCk7Ci0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlMiA9IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tfU3RlcHMoKTsKLQkJTGlzdCBpdGVtczsKLQkJCQkKLQkJU2VjdGlvbiBzMV8xID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlU2VjdGlvbih0MS5nZXRQcmVzZW50YXRpb24oKSwgInQxczEiLCAidDFzMSIpOwotCQlTZWN0aW9uIHMxXzIgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVTZWN0aW9uKHQxLmdldFByZXNlbnRhdGlvbigpLCAidDFzMiIsICJ0MXMyIik7Ci0KLQkJU2VjdGlvbiBzMl8xID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlU2VjdGlvbih0Mi5nZXRQcmVzZW50YXRpb24oKSwgInQyczEiLCAidDJzMSIpOwotCQlTZWN0aW9uIHMyXzIgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVTZWN0aW9uKHQyLmdldFByZXNlbnRhdGlvbigpLCAidDJzMiIsICJ0MnMyIik7Ci0KLQkJU2VjdGlvbiBzM18xID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlU2VjdGlvbih0My5nZXRQcmVzZW50YXRpb24oKSwgInQzczEiLCAidDNzMSIpOwotCQlTZWN0aW9uIHMzXzIgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVTZWN0aW9uKHQzLmdldFByZXNlbnRhdGlvbigpLCAidDNzMiIsICJ0M3MyIik7Ci0JCQotCQkvLyBjYXNlIDEKLQkJaXRlbXMgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwbkZlYXR1cmVWYWx1ZSh0MS5nZXRQcmVzZW50YXRpb24oKSwgdDEsIGZlYXR1cmUsIHJlYWxpemVyKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGl0ZW1zLnNpemUoKSk7Ci0JCWFzc2VydFRydWUoaXRlbXMuY29udGFpbnMoczFfMSkpOwotCQlhc3NlcnRUcnVlKGl0ZW1zLmNvbnRhaW5zKHMxXzIpKTsKLQotCQlpdGVtcyA9IENvbmZpZ3VyYXRpb25IZWxwZXIuY2FsYzBuRmVhdHVyZVZhbHVlKHQxLCBmZWF0dXJlMiwgcmVhbGl6ZXIpOwotCQlhc3NlcnRFcXVhbHMoMiwgaXRlbXMuc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShpdGVtcy5jb250YWlucyhzMV8xKSk7Ci0JCWFzc2VydFRydWUoaXRlbXMuY29udGFpbnMoczFfMikpOwotCi0JCS8vIGNhc2UgMgotCQlMaWJyYXJ5VGVzdEhlbHBlci5zZXRDb250cmlidXRlcyh0MiwgdDEpOwotCQlpdGVtcyA9IENvbmZpZ3VyYXRpb25IZWxwZXIuY2FsYzBuRmVhdHVyZVZhbHVlKHQxLmdldFByZXNlbnRhdGlvbigpLCB0MSwgZmVhdHVyZSwgcmVhbGl6ZXIpOwotCQlhc3NlcnRFcXVhbHMoNCwgaXRlbXMuc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShpdGVtcy5jb250YWlucyhzMV8xKSk7Ci0JCWFzc2VydFRydWUoaXRlbXMuY29udGFpbnMoczFfMikpOwotCQlhc3NlcnRUcnVlKGl0ZW1zLmNvbnRhaW5zKHMyXzEpKTsKLQkJYXNzZXJ0VHJ1ZShpdGVtcy5jb250YWlucyhzMl8yKSk7Ci0KLQkJaXRlbXMgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwbkZlYXR1cmVWYWx1ZSh0MSwgZmVhdHVyZTIsIHJlYWxpemVyKTsKLQkJYXNzZXJ0RXF1YWxzKDQsIGl0ZW1zLnNpemUoKSk7Ci0JCWFzc2VydFRydWUoaXRlbXMuY29udGFpbnMoczFfMSkpOwotCQlhc3NlcnRUcnVlKGl0ZW1zLmNvbnRhaW5zKHMxXzIpKTsKLQkJYXNzZXJ0VHJ1ZShpdGVtcy5jb250YWlucyhzMl8xKSk7Ci0JCWFzc2VydFRydWUoaXRlbXMuY29udGFpbnMoczJfMikpOwotCi0JfQotCQotCS8vIHRlc3QgdGhlIHNlY3Rpb25zIGZvciByZXBsYWNlcnMKLQlwdWJsaWMgdm9pZCB0ZXN0X3Rhc2tfc3RlcHNfd2l0aF9yZXBsYWNlcnMoKSB7Ci0JCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVNZXRob2RQbHVnaW4oInBsdWdpbiAxIik7Ci0JCUNvbnRlbnRQYWNrYWdlIHBrZyA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZUNvbnRlbnRQYWNrYWdlKHBsdWdpbiwgInAxIik7Ci0JCVRhc2sgdDEgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVUYXNrKHBrZywgInQxIik7Ci0JCVRhc2sgdDIgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVUYXNrKHBrZywgInQyIik7Ci0JCVRhc2sgdDMgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVUYXNrKHBrZywgInQzIik7Ci0JCQkKLQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVDb25maWd1cmF0aW9uKCJjb25maWcgMSIpOwotCQljb25maWcuZ2V0TWV0aG9kUGx1Z2luU2VsZWN0aW9uKCkuYWRkKHBsdWdpbik7Ci0JCWNvbmZpZy5nZXRNZXRob2RQYWNrYWdlU2VsZWN0aW9uKCkuYWRkKHBrZyk7Ci0JCUxpYnJhcnlVdGlsLnZhbGlkYXRlTWV0aG9kQ29uZmlndXJhdGlvbihjb25maWcpOwkKLQkJRWxlbWVudFJlYWxpemVyIHJlYWxpemVyID0gRGVmYXVsdEVsZW1lbnRSZWFsaXplci5uZXdFbGVtZW50UmVhbGl6ZXIoY29uZmlnKTsKLQkKLQkJLy8gdGhlc2UgdHdvIHNob3VsZCBnZW5lcmF0ZSB0aGUgc2FtZSByZXN1bHQKLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb250ZW50RGVzY3JpcHRpb25fU2VjdGlvbnMoKTsKLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUyID0gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza19TdGVwcygpOwotCQlMaXN0IGl0ZW1zOwotCQlUYXNrIHQ7Ci0JCQotCQlTZWN0aW9uIHMxXzEgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVTZWN0aW9uKHQxLmdldFByZXNlbnRhdGlvbigpLCAidDFzMSIsICJ0MXMxIik7Ci0JCVNlY3Rpb24gczFfMiA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZVNlY3Rpb24odDEuZ2V0UHJlc2VudGF0aW9uKCksICJ0MXMyIiwgInQxczIiKTsKLQotCQlTZWN0aW9uIHMyXzEgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVTZWN0aW9uKHQyLmdldFByZXNlbnRhdGlvbigpLCAidDJzMSIsICJ0MnMxIik7Ci0JCVNlY3Rpb24gczJfMiA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZVNlY3Rpb24odDIuZ2V0UHJlc2VudGF0aW9uKCksICJ0MnMyIiwgInQyczIiKTsKLQotCQlTZWN0aW9uIHMzXzEgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVTZWN0aW9uKHQzLmdldFByZXNlbnRhdGlvbigpLCAidDNzMSIsICJ0M3MxIik7Ci0JCVNlY3Rpb24gczNfMiA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZVNlY3Rpb24odDMuZ2V0UHJlc2VudGF0aW9uKCksICJ0M3MyIiwgInQzczIiKTsKLQkJCi0KLQkJTGlicmFyeVRlc3RIZWxwZXIuc2V0UmVwbGFjZXModDIsIHQxKTsKLQkJdCA9IChUYXNrKUNvbmZpZ3VyYXRpb25IZWxwZXIuZ2V0Q2FsY3VsYXRlZEVsZW1lbnQodDEsIHJlYWxpemVyKTsKLQkJYXNzZXJ0RXF1YWxzKHQyLCB0KTsgIAotCi0JCWl0ZW1zID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMG5GZWF0dXJlVmFsdWUodC5nZXRQcmVzZW50YXRpb24oKSwgdCwgZmVhdHVyZSwgcmVhbGl6ZXIpOwotCQlhc3NlcnRFcXVhbHMoMiwgaXRlbXMuc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShpdGVtcy5jb250YWlucyhzMl8xKSk7Ci0JCWFzc2VydFRydWUoaXRlbXMuY29udGFpbnMoczJfMikpOwotCi0JCWl0ZW1zID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMG5GZWF0dXJlVmFsdWUodCwgZmVhdHVyZTIsIHJlYWxpemVyKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGl0ZW1zLnNpemUoKSk7Ci0JCWFzc2VydFRydWUoaXRlbXMuY29udGFpbnMoczJfMSkpOwotCQlhc3NlcnRUcnVlKGl0ZW1zLmNvbnRhaW5zKHMyXzIpKTsKLQotCX0KLQkKLQkvLyB0ZXN0IHRoZSBzZWN0aW9ucwotCXB1YmxpYyB2b2lkIHRlc3RfdGFza19zdGVwc193aXRoX2V4dGVuZGVycygpIHsKLQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZU1ldGhvZFBsdWdpbigicGx1Z2luIDEiKTsKLQkJQ29udGVudFBhY2thZ2UgcGtnID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlQ29udGVudFBhY2thZ2UocGx1Z2luLCAicDEiKTsKLQkJVGFzayB0MSA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZVRhc2socGtnLCAidDEiKTsKLQkJVGFzayB0MiA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZVRhc2socGtnLCAidDIiKTsKLQkJVGFzayB0MyA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZVRhc2socGtnLCAidDMiKTsKLQkJCQotCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZUNvbmZpZ3VyYXRpb24oImNvbmZpZyAxIik7Ci0JCWNvbmZpZy5nZXRNZXRob2RQbHVnaW5TZWxlY3Rpb24oKS5hZGQocGx1Z2luKTsKLQkJY29uZmlnLmdldE1ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKS5hZGQocGtnKTsKLQkJTGlicmFyeVV0aWwudmFsaWRhdGVNZXRob2RDb25maWd1cmF0aW9uKGNvbmZpZyk7CQotCQlFbGVtZW50UmVhbGl6ZXIgcmVhbGl6ZXIgPSBEZWZhdWx0RWxlbWVudFJlYWxpemVyLm5ld0VsZW1lbnRSZWFsaXplcihjb25maWcpOwotCQotCQkvLyB0aGVzZSB0d28gc2hvdWxkIGdlbmVyYXRlIHRoZSBzYW1lIHJlc3VsdAotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbnRlbnREZXNjcmlwdGlvbl9TZWN0aW9ucygpOwotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZTIgPSBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrX1N0ZXBzKCk7Ci0JCUxpc3QgaXRlbXM7Ci0JCQkJCi0JCVNlY3Rpb24gczFfMSA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZVNlY3Rpb24odDEuZ2V0UHJlc2VudGF0aW9uKCksICJ0MXMxIiwgInQxczEiKTsKLQkJU2VjdGlvbiBzMV8yID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlU2VjdGlvbih0MS5nZXRQcmVzZW50YXRpb24oKSwgInQxczIiLCAidDFzMiIpOwotCi0JCVNlY3Rpb24gczJfMSA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZVNlY3Rpb24odDIuZ2V0UHJlc2VudGF0aW9uKCksICJ0MnMxIiwgInQyczEiKTsKLQkJU2VjdGlvbiBzMl8yID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlU2VjdGlvbih0Mi5nZXRQcmVzZW50YXRpb24oKSwgInQyczIiLCAidDJzMiIpOwotCi0vLwkJU2VjdGlvbiBzM18xID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlU2VjdGlvbih0My5nZXRQcmVzZW50YXRpb24oKSwgInQzczEiLCAidDNzMSIpOwotLy8JCVNlY3Rpb24gczNfMiA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZVNlY3Rpb24odDMuZ2V0UHJlc2VudGF0aW9uKCksICJ0M3MyIiwgInQzczIiKTsKLQkJCi0JCUxpYnJhcnlUZXN0SGVscGVyLnNldEV4dGVuZHModDIsIHQxKTsKLQkJTGlicmFyeVRlc3RIZWxwZXIuc2V0RXh0ZW5kcyh0MywgdDEpOwotCi0JCS8vIGNhc2UgMQotCQlpdGVtcyA9IENvbmZpZ3VyYXRpb25IZWxwZXIuY2FsYzBuRmVhdHVyZVZhbHVlKHQyLmdldFByZXNlbnRhdGlvbigpLCB0MiwgZmVhdHVyZSwgcmVhbGl6ZXIpOwotCQlhc3NlcnRFcXVhbHMoNCwgaXRlbXMuc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShpdGVtcy5jb250YWlucyhzMV8xKSk7Ci0JCWFzc2VydFRydWUoaXRlbXMuY29udGFpbnMoczFfMikpOwotCQlhc3NlcnRUcnVlKGl0ZW1zLmNvbnRhaW5zKHMyXzEpKTsKLQkJYXNzZXJ0VHJ1ZShpdGVtcy5jb250YWlucyhzMl8yKSk7Ci0KLQkJaXRlbXMgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwbkZlYXR1cmVWYWx1ZSh0MiwgZmVhdHVyZTIsIHJlYWxpemVyKTsKLQkJYXNzZXJ0RXF1YWxzKDQsIGl0ZW1zLnNpemUoKSk7Ci0JCWFzc2VydFRydWUoaXRlbXMuY29udGFpbnMoczFfMSkpOwotCQlhc3NlcnRUcnVlKGl0ZW1zLmNvbnRhaW5zKHMxXzIpKTsKLQkJYXNzZXJ0VHJ1ZShpdGVtcy5jb250YWlucyhzMl8xKSk7Ci0JCWFzc2VydFRydWUoaXRlbXMuY29udGFpbnMoczJfMikpOwotCi0JCS8vIGNhc2UgMiwgdDMgaGFzIG5vIHN0ZXBzLCB0aGlzIHdhcyBvbmNlIGEgYnVnIHNpbmNlIHRoZSBjb250ZW50RGVzY3JpcHRpb24gb2JqZWN0IGlzIG5vdCBjcmVhdGVkCi0JCS8vIGFuZCB0aGUgcmVhbGl6YXRpb24gZmFpbGVkCi0JCWl0ZW1zID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMG5GZWF0dXJlVmFsdWUodDMuZ2V0UHJlc2VudGF0aW9uKCksIHQzLCBmZWF0dXJlLCByZWFsaXplcik7Ci0JCWFzc2VydEVxdWFscygyLCBpdGVtcy5zaXplKCkpOwotCQlhc3NlcnRUcnVlKGl0ZW1zLmNvbnRhaW5zKHMxXzEpKTsKLQkJYXNzZXJ0VHJ1ZShpdGVtcy5jb250YWlucyhzMV8yKSk7Ci0KLQkJaXRlbXMgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwbkZlYXR1cmVWYWx1ZSh0MywgZmVhdHVyZTIsIHJlYWxpemVyKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGl0ZW1zLnNpemUoKSk7Ci0JCWFzc2VydFRydWUoaXRlbXMuY29udGFpbnMoczFfMSkpOwotCQlhc3NlcnRUcnVlKGl0ZW1zLmNvbnRhaW5zKHMxXzIpKTsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3RzL3ZhcmlhYmlsaXR5L1JlZ3Jlc3Npb25UZXN0LmphdmEgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3RzL3ZhcmlhYmlsaXR5L1JlZ3Jlc3Npb25UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjOGZhOTIuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0cy92YXJpYWJpbGl0eS9SZWdyZXNzaW9uVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjE1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzLnZhcmlhYmlsaXR5OwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLkRlZmF1bHRFbGVtZW50UmVhbGl6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5FbGVtZW50UmVhbGl6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMuTGlicmFyeVRlc3RIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5MaWJyYXJ5VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFydGlmYWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ2hlY2tsaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuU2VjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUudXRpbC5PcHBvc2l0ZUZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkFzc29jaWF0aW9uSGVscGVyOwotCi0vKioKLSAqIHJlY29yZCBhbGwgYnVncyByZWxhdGluZyB0byByYXJpYWJpbGl0eSBzbyB0aGF0IHdlIGNhbiBkbyByZWdyZXNzaW9uIHRlc3Qgb24gdGhvc2UgaXNzdWVzLgotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICoKLSAqLwotcHVibGljIGNsYXNzIFJlZ3Jlc3Npb25UZXN0IGV4dGVuZHMgVmFyaWFibGl0eUJhc2VUZXN0Q2FzZSB7Ci0KLQlwdWJsaWMgUmVncmVzc2lvblRlc3QoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCS8qKgotCSAqIAkxNDA4NzVJbmFiaWxpdHkgdG8gYWRkIHJlc3BvbnNpYmxlIGZvciByZWxhdGlvbnNoaXAgdG8gYSB3b3JrIHByb2R1Y3QKLQkgKiAKLQkgCUlmIEkgbWFrZSBhIHJvbGUsIFIyLCBpbiBhIHBsdWctaW4sIFAyLCByZXNwb25zaWJsZSBmb3IgYSB3b3JrIHByb2R1Y3QsIFdQMiwKLQkJdGhhdCBjb250cmlidXRlcyB0byBhIHdvcmsgcHJvZHVjdCwgV1AxLCBpbiBhbm90aGVyIHBsdWctaW4sIFAxLCB0aGF0Ci0JCXJlc3BvbnNpYmlsaXR5IGRvZXMgbm90IGFwcGVhciB0byBiZSBhZGRlZC4gIFNwZWNpZmljYWxseSwgdGhlIGZhY3QgdGhhdCBSMiBpcwotCQlyZXNwb25zaWJpbGUgZm9yIFdQMSBpcyBub3QgZGlzcGxheWVkIGluIHRoZSBCcm93c2UgcGVyc3BlY3RpdmUgZm9yIGEKLQkJY29uZmlndXJhdGlvbiB0aGF0IGNvbnRhaW5zIGJvdGggcGx1Zy1pbnMuICBBbHNvLCB0aGUgZmFjdCB0aGF0IFIyIGlzCi0JCXJlc3BvbnNpYmxlIGZvciBXUDIgaXMgbm90IGRpc3BsYXllZCBpbiB0aGUgUHJldmlldyB0YWIgZm9yIFIyIG9yIFdQMgotCQkKLQkJSWYgdGhlIGJhc2UgZG9lcyBub3QgaGF2ZSBhbiBpbmNvbWluZyByZWxhdGlvbnNoaXAsIHRoZW4gaXQgc2hvdWxkIGJlIGFibGUgdG8KLQkJYmUgY29udHJpYnV0ZWQuICBJbiB0aGlzIGV4YW1wbGUsIFdQMSBkaWQgbm90IGhhdmUgYSByZXNwb25zaWJsZSByb2xlCi0JCXJlbGF0aW9uc2hpcC4KLQkgKgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RfMTQwODc1KCkgewotCQkvLyB0aGlzIHNob3VsZCBub3QgYmUgYW4gaXNzdWUgYW55IG1vcmUgc2luY2UgMS4wbTQuCi0JCS8vIFdQIC0tPiBSb2xlIGlzIHRvIG1hbnkgYXNzb2NpYXRpb24gbm93LgotCQkKLQkJTWV0aG9kUGx1Z2luIHBsdWdpbjEgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVNZXRob2RQbHVnaW4oInBsdWdpbiAxIik7Ci0JCUNvbnRlbnRQYWNrYWdlIHBrZzEgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVDb250ZW50UGFja2FnZShwbHVnaW4xLCAicDEiKTsKLQotCQlNZXRob2RQbHVnaW4gcGx1Z2luMiA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZU1ldGhvZFBsdWdpbigicGx1Z2luIDIiKTsKLQkJQ29udGVudFBhY2thZ2UgcGtnMiA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZUNvbnRlbnRQYWNrYWdlKHBsdWdpbjIsICJwMiIpOwotCi0JCXBsdWdpbjIuZ2V0QmFzZXMoKS5hZGQocGx1Z2luMSk7Ci0JCQotLy8JCVJvbGUgcjEgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVSb2xlKHBrZzEsICJyMSIpOwotCQlBcnRpZmFjdCB3cDEgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVBcnRpZmFjdChwa2cxLCAid3AxIik7Ci0JCQotCQlSb2xlIHIyID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlUm9sZShwa2cyLCAicjIiKTsKLQkJQXJ0aWZhY3Qgd3AyID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlQXJ0aWZhY3QocGtnMiwgIndwMiIpOwotCQkKLQkJcjIuZ2V0UmVzcG9uc2libGVGb3IoKS5hZGQod3AyKTsKLQkJTGlicmFyeVRlc3RIZWxwZXIuc2V0Q29udHJpYnV0ZXMod3AyLCB3cDEpOwotCQkKLQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVDb25maWd1cmF0aW9uKCJjb25maWcgMSIpOwotCQljb25maWcuZ2V0TWV0aG9kUGx1Z2luU2VsZWN0aW9uKCkuYWRkKHBsdWdpbjEpOwotCQljb25maWcuZ2V0TWV0aG9kUGFja2FnZVNlbGVjdGlvbigpLmFkZChwa2cxKTsKLQkJY29uZmlnLmdldE1ldGhvZFBsdWdpblNlbGVjdGlvbigpLmFkZChwbHVnaW4yKTsKLQkJY29uZmlnLmdldE1ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKS5hZGQocGtnMik7Ci0JCUxpYnJhcnlVdGlsLnZhbGlkYXRlTWV0aG9kQ29uZmlndXJhdGlvbihjb25maWcpOwkKLQkJRWxlbWVudFJlYWxpemVyIHJlYWxpemVyID0gRGVmYXVsdEVsZW1lbnRSZWFsaXplci5uZXdFbGVtZW50UmVhbGl6ZXIoY29uZmlnKTsKLQkJCi0JCUxpc3QgaXRlbXM7Ci0JCQotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFJvbGVfUmVzcG9uc2libGVGb3IoKTsKLQkJaXRlbXMgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwbkZlYXR1cmVWYWx1ZShyMiwgZmVhdHVyZSwgcmVhbGl6ZXIpOwotCQlhc3NlcnRFcXVhbHMoMSwgaXRlbXMuc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShpdGVtcy5jb250YWlucyh3cDEpKTsKLQkJCi0JCU9wcG9zaXRlRmVhdHVyZSBvZmVhdHVyZSA9IEFzc29jaWF0aW9uSGVscGVyLldvcmtQcm9kdWN0X1Jlc3BvbnNpYmxlUm9sZXM7Ci0JCWl0ZW1zID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMG5GZWF0dXJlVmFsdWUod3AyLCBvZmVhdHVyZSwgcmVhbGl6ZXIpOwotCQlhc3NlcnRFcXVhbHMoMSwgaXRlbXMuc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShpdGVtcy5jb250YWlucyhyMikpOwotCi0JfQotCQotCS8qKgotCSAqIDE0Mzg3MSAtIEFuIGV4dGVuZGluZyBjaGVja2xpc3Qgd2l0aCBubyBpdGVtcyBkb2VzIG5vdCByZWFsaXplIHRoZSBiYXNlIGNoZWNrbGlzdCBpdGVtcwotCSAqIAotCQlIYXZlIGEgYmFzZSB0YXNrLCBUYXNrIEEsIHdpdGggc29tZSBzdGVwcy4KLQkJRXh0ZW5kIGl0IHdpdGggYSBuZXcgVGFzayBCLCB3aGljaCBoYXMgbm8gc3RlcHMuCi0JCQotCQlCcm93c2luZyBUYXNrIEIgc2hvdWxkIHNob3cgdGhlIHN0ZXBzIG9mIFRhc2sgQSwgYnV0IGl0IGRvZXMgbm90LgotCQlJZiBUYXNrIEIgaXMgc3Vic2VxdWVudGx5IGFzc2lnbmVkIHNvbWUgc3RlcHMsIHRoZW4gYWxsIHdpbGwgYmUgcmVhbGl6ZWQgaW4gdGhlCi0JCWJyb3dzZXIuICBGdXJ0aGVyLCBpZiB0aGUgVGFzayBCJ3Mgc3RlcHMgYXJlIHRoZW4gZGVsZXRlZCwgdGhlIHJlYWxpemF0aW9uIHdpbGwKLQkJc3RpbGwgc2hvdyBUYXNrIEEncyBzdGVwcy4KLQkJCi0JCVRoZSBkZXNjcmlwdGlvbiBhcHBsaWVzIHRvIGNoZWNrbGlzdHMsIGFuZCBzaG91bGQgcmVhZDoKLQkJSGF2ZSBhIGJhc2UgY2hlY2tsaXN0LCBDaGVja2xpc3QgQSwgd2l0aCBzb21lIGNoZWNrbGlzdCBpdGVtcy4KLQkJRXh0ZW5kIGl0IHdpdGggYSBuZXcgQ2hlY2tsaXN0IEIsIHdoaWNoIGhhcyBubyBpdGVtcy4KLQkJCi0JCUJyb3dzaW5nIENoZWNrbGlzdCBCIHNob3VsZCBzaG93IHRoZSBzdGVwcyBvZiBDaGVja2xpc3QgQSwgYnV0IGl0IGRvZXMgbm90LgotCQlJZiBDaGVja2xpc3QgQiBpcyBzdWJzZXF1ZW50bHkgYXNzaWduZWQgc29tZSBpdGVtcywgdGhlbiBhbGwgd2lsbCBiZSByZWFsaXplZAotCQlpbiB0aGUgYnJvd3Nlci4gIEZ1cnRoZXIsIGlmIHRoZSBDaGVja2xpc3QgQidzIGl0ZW1zIGFyZSB0aGVuIGRlbGV0ZWQsIHRoZQotCQlyZWFsaXphdGlvbiB3aWxsIHN0aWxsIHNob3cgQ2hlY2tsaXN0IEEncyBpdGVtcy4KLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0XzE0Mzg3MV90YXNrX3N0ZXBzKCkgewkKLQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZU1ldGhvZFBsdWdpbigicGx1Z2luIDEiKTsKLQkJQ29udGVudFBhY2thZ2UgcGtnID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlQ29udGVudFBhY2thZ2UocGx1Z2luLCAicDEiKTsKLQkJVGFzayB0MSA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZVRhc2socGtnLCAidDEiKTsKLQkJVGFzayB0MiA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZVRhc2socGtnLCAidDIiKTsKLQkJCQotCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZUNvbmZpZ3VyYXRpb24oImNvbmZpZyAxIik7Ci0JCWNvbmZpZy5nZXRNZXRob2RQbHVnaW5TZWxlY3Rpb24oKS5hZGQocGx1Z2luKTsKLQkJY29uZmlnLmdldE1ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKS5hZGQocGtnKTsKLQkJTGlicmFyeVV0aWwudmFsaWRhdGVNZXRob2RDb25maWd1cmF0aW9uKGNvbmZpZyk7CQotCQlFbGVtZW50UmVhbGl6ZXIgcmVhbGl6ZXIgPSBEZWZhdWx0RWxlbWVudFJlYWxpemVyLm5ld0VsZW1lbnRSZWFsaXplcihjb25maWcpOwotCQotCQkvLyB0aGVzZSB0d28gc2hvdWxkIGdlbmVyYXRlIHRoZSBzYW1lIHJlc3VsdAotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbnRlbnREZXNjcmlwdGlvbl9TZWN0aW9ucygpOwotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZTIgPSBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrX1N0ZXBzKCk7Ci0JCUxpc3QgaXRlbXM7Ci0JCQkJCi0JCVNlY3Rpb24gczFfMSA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZVNlY3Rpb24odDEuZ2V0UHJlc2VudGF0aW9uKCksICJ0MXMxIiwgInQxczEiKTsKLQkJU2VjdGlvbiBzMV8yID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlU2VjdGlvbih0MS5nZXRQcmVzZW50YXRpb24oKSwgInQxczIiLCAidDFzMiIpOwotCQkKLQotCQlMaWJyYXJ5VGVzdEhlbHBlci5zZXRFeHRlbmRzKHQyLCB0MSk7Ci0JCQotCQlpdGVtcyA9IENvbmZpZ3VyYXRpb25IZWxwZXIuY2FsYzBuRmVhdHVyZVZhbHVlKHQyLmdldFByZXNlbnRhdGlvbigpLCB0MiwgZmVhdHVyZSwgcmVhbGl6ZXIpOwotCQlhc3NlcnRFcXVhbHMoMiwgaXRlbXMuc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShpdGVtcy5jb250YWlucyhzMV8xKSk7Ci0JCWFzc2VydFRydWUoaXRlbXMuY29udGFpbnMoczFfMikpOwotCi0JCWl0ZW1zID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMG5GZWF0dXJlVmFsdWUodDIsIGZlYXR1cmUyLCByZWFsaXplcik7Ci0JCWFzc2VydEVxdWFscygyLCBpdGVtcy5zaXplKCkpOwotCQlhc3NlcnRUcnVlKGl0ZW1zLmNvbnRhaW5zKHMxXzEpKTsKLQkJYXNzZXJ0VHJ1ZShpdGVtcy5jb250YWlucyhzMV8yKSk7Ci0KLQkJLy8gdGhlbiBzZXQgdGhlIHNlY3Rpb25zIGZvciB0YXNrIDIKLQkJU2VjdGlvbiBzMl8xID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlU2VjdGlvbih0Mi5nZXRQcmVzZW50YXRpb24oKSwgInQyczEiLCAidDJzMSIpOwotCQlTZWN0aW9uIHMyXzIgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVTZWN0aW9uKHQyLmdldFByZXNlbnRhdGlvbigpLCAidDJzMiIsICJ0MnMyIik7Ci0KLQkJaXRlbXMgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwbkZlYXR1cmVWYWx1ZSh0Mi5nZXRQcmVzZW50YXRpb24oKSwgdDIsIGZlYXR1cmUsIHJlYWxpemVyKTsKLQkJYXNzZXJ0RXF1YWxzKDQsIGl0ZW1zLnNpemUoKSk7Ci0JCWFzc2VydFRydWUoaXRlbXMuY29udGFpbnMoczFfMSkpOwotCQlhc3NlcnRUcnVlKGl0ZW1zLmNvbnRhaW5zKHMxXzIpKTsKLQkJYXNzZXJ0VHJ1ZShpdGVtcy5jb250YWlucyhzMl8xKSk7Ci0JCWFzc2VydFRydWUoaXRlbXMuY29udGFpbnMoczJfMikpOwotCi0JCWl0ZW1zID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMG5GZWF0dXJlVmFsdWUodDIsIGZlYXR1cmUyLCByZWFsaXplcik7Ci0JCWFzc2VydEVxdWFscyg0LCBpdGVtcy5zaXplKCkpOwotCQlhc3NlcnRUcnVlKGl0ZW1zLmNvbnRhaW5zKHMxXzEpKTsKLQkJYXNzZXJ0VHJ1ZShpdGVtcy5jb250YWlucyhzMV8yKSk7Ci0JCWFzc2VydFRydWUoaXRlbXMuY29udGFpbnMoczJfMSkpOwotCQlhc3NlcnRUcnVlKGl0ZW1zLmNvbnRhaW5zKHMyXzIpKTsKLQotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0XzE0Mzg3MV9jaGVja2xpc3RfaXRlbXMoKSB7CQotCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlTWV0aG9kUGx1Z2luKCJwbHVnaW4gMSIpOwotCQlDb250ZW50UGFja2FnZSBwa2cgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVDb250ZW50UGFja2FnZShwbHVnaW4sICJwMSIpOwotCQlDaGVja2xpc3QgYzEgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVDaGVja2xpc3QocGtnLCAiYzEiKTsKLQkJQ2hlY2tsaXN0IGMyID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlQ2hlY2tsaXN0KHBrZywgImMyIik7Ci0JCQkKLQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVDb25maWd1cmF0aW9uKCJjb25maWcgMSIpOwotCQljb25maWcuZ2V0TWV0aG9kUGx1Z2luU2VsZWN0aW9uKCkuYWRkKHBsdWdpbik7Ci0JCWNvbmZpZy5nZXRNZXRob2RQYWNrYWdlU2VsZWN0aW9uKCkuYWRkKHBrZyk7Ci0JCUxpYnJhcnlVdGlsLnZhbGlkYXRlTWV0aG9kQ29uZmlndXJhdGlvbihjb25maWcpOwkKLQkJRWxlbWVudFJlYWxpemVyIHJlYWxpemVyID0gRGVmYXVsdEVsZW1lbnRSZWFsaXplci5uZXdFbGVtZW50UmVhbGl6ZXIoY29uZmlnKTsKLQkKLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb250ZW50RGVzY3JpcHRpb25fU2VjdGlvbnMoKTsKLQkJTGlzdCBpdGVtczsKLQkJCQkKLQkJU2VjdGlvbiBzMV8xID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlU2VjdGlvbihjMS5nZXRQcmVzZW50YXRpb24oKSwgImMxczEiLCAiYzFzMSIpOwotCQlTZWN0aW9uIHMxXzIgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVTZWN0aW9uKGMxLmdldFByZXNlbnRhdGlvbigpLCAiYzFzMiIsICJjMXMyIik7Ci0JCQotCQlMaWJyYXJ5VGVzdEhlbHBlci5zZXRFeHRlbmRzKGMyLCBjMSk7Ci0JCQotCQlpdGVtcyA9IENvbmZpZ3VyYXRpb25IZWxwZXIuY2FsYzBuRmVhdHVyZVZhbHVlKGMyLmdldFByZXNlbnRhdGlvbigpLCBjMiwgZmVhdHVyZSwgcmVhbGl6ZXIpOwotCQlhc3NlcnRFcXVhbHMoMiwgaXRlbXMuc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShpdGVtcy5jb250YWlucyhzMV8xKSk7Ci0JCWFzc2VydFRydWUoaXRlbXMuY29udGFpbnMoczFfMikpOwotCi0JCS8vIHRoZW4gc2V0IHRoZSBzZWN0aW9ucyBmb3IgY2hlY2tsaXN0IDIKLQkJU2VjdGlvbiBzMl8xID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlU2VjdGlvbihjMi5nZXRQcmVzZW50YXRpb24oKSwgImMyczEiLCAiYzJzMSIpOwotCQlTZWN0aW9uIHMyXzIgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVTZWN0aW9uKGMyLmdldFByZXNlbnRhdGlvbigpLCAiYzJzMiIsICJjMnMyIik7Ci0KLQkJaXRlbXMgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwbkZlYXR1cmVWYWx1ZShjMi5nZXRQcmVzZW50YXRpb24oKSwgYzIsIGZlYXR1cmUsIHJlYWxpemVyKTsKLQkJYXNzZXJ0RXF1YWxzKDQsIGl0ZW1zLnNpemUoKSk7Ci0JCWFzc2VydFRydWUoaXRlbXMuY29udGFpbnMoczFfMSkpOwotCQlhc3NlcnRUcnVlKGl0ZW1zLmNvbnRhaW5zKHMxXzIpKTsKLQkJYXNzZXJ0VHJ1ZShpdGVtcy5jb250YWlucyhzMl8xKSk7Ci0JCWFzc2VydFRydWUoaXRlbXMuY29udGFpbnMoczJfMikpOwotCi0JfQotCQotCS8qKgotCSAqIDE0NjE1MyAtIFZhcmlhYmlsaXR5OiBJbmNvbWluZyB0by1tYW55IGFzc29jaWF0aW9ucyBhcmUgbm90IHByZXNlcnZlZCBpbiB0aGUgY2FzZSBvZiByb2xlIHJlcGxhY2VtZW50IGFuZCBleHRlbnNpb24KLQkgKiAKLQkJU1RFUFM6Ci0JCTEuIGNyZWF0ZSByb2xlQSBhbmQgcm9sZUIuIEFzc2lnbiB0aGVtIHRvIHJvbGVzZXRBIGFuZCByb2xlc2V0QiByZXNwZWN0aXZlbHkKLQkJMi4gc2V0IHJvbGVBIHRvIHJlcGxhY2Ugcm9sZUIgYW5kIGJyb3dzZQotCQlyZXN1bHRzPT4gYnJvd3Npbmcgc2hvd3Mgcm9sZUEgaW4gcm9sZXNldEEgb25seS4gCi0JCWV4cGVjdCByZXN1bHRzPT4gcm9sZUEgc2hvdWxkIGJlIGluIHJvbGVzZXRBIGFuZCByb2xlc2V0QgotCQkKLQkJU2ltaWxhciBpc3N1ZSB3aGVuIHJvbGVBIGlzIGV4dGVuZGluZyByb2xlQgotCi0JICoKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0XzE0NjE1M193aXRoX3JlcGxhY2VyKCkgewotCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlTWV0aG9kUGx1Z2luKCJwbHVnaW4gMSIpOwotCQlDb250ZW50UGFja2FnZSBwa2cgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVDb250ZW50UGFja2FnZShwbHVnaW4sICJwMSIpOwotCQlSb2xlIHIxID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlUm9sZShwa2csICJyMSIpOwotCQlSb2xlIHIyID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlUm9sZShwa2csICJyMiIpOwotCQlSb2xlU2V0IHJzMSA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZVJvbGVTZXQocGx1Z2luLCAicnMxIik7Ci0JCVJvbGVTZXQgcnMyID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlUm9sZVNldChwbHVnaW4sICJyczIiKTsKLQkJCQkKLQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVDb25maWd1cmF0aW9uKCJjb25maWcgMSIpOwotCQljb25maWcuZ2V0TWV0aG9kUGx1Z2luU2VsZWN0aW9uKCkuYWRkKHBsdWdpbik7Ci0JCWNvbmZpZy5nZXRNZXRob2RQYWNrYWdlU2VsZWN0aW9uKCkuYWRkKHBrZyk7Ci0JCUxpYnJhcnlVdGlsLnZhbGlkYXRlTWV0aG9kQ29uZmlndXJhdGlvbihjb25maWcpOwkKLQkJRWxlbWVudFJlYWxpemVyIHJlYWxpemVyID0gRGVmYXVsdEVsZW1lbnRSZWFsaXplci5uZXdFbGVtZW50UmVhbGl6ZXIoY29uZmlnKTsKLQkJCi0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Um9sZVNldF9Sb2xlcygpOwotCQlPcHBvc2l0ZUZlYXR1cmUgb2ZlYXR1cmUgPSBBc3NvY2lhdGlvbkhlbHBlci5Sb2xlX1JvbGVTZXRzOwotCQlMaXN0IGl0ZW1zOwotCQkKLQkJcnMxLmdldFJvbGVzKCkuYWRkKHIxKTsKLQkJcnMyLmdldFJvbGVzKCkuYWRkKHIyKTsKLQkJCi0JCUxpYnJhcnlUZXN0SGVscGVyLnNldFJlcGxhY2VzKHIyLCByMSk7Ci0JCQotCQlpdGVtcyA9IENvbmZpZ3VyYXRpb25IZWxwZXIuY2FsYzBuRmVhdHVyZVZhbHVlKHJzMSwgZmVhdHVyZSwgcmVhbGl6ZXIpOwotCQlhc3NlcnRFcXVhbHMoMSwgaXRlbXMuc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShpdGVtcy5jb250YWlucyhyMikpOwotCi0JCWl0ZW1zID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMG5GZWF0dXJlVmFsdWUocnMyLCBmZWF0dXJlLCByZWFsaXplcik7Ci0JCWFzc2VydEVxdWFscygxLCBpdGVtcy5zaXplKCkpOwotCQlhc3NlcnRUcnVlKGl0ZW1zLmNvbnRhaW5zKHIyKSk7Ci0JCQotCQlpdGVtcyA9IENvbmZpZ3VyYXRpb25IZWxwZXIuY2FsYzBuRmVhdHVyZVZhbHVlKHIyLCBvZmVhdHVyZSwgcmVhbGl6ZXIpOwotCQlhc3NlcnRFcXVhbHMoMiwgaXRlbXMuc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShpdGVtcy5jb250YWlucyhyczEpKTsKLQkJYXNzZXJ0VHJ1ZShpdGVtcy5jb250YWlucyhyczIpKTsKLQkJCi0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RfMTQ2MTUzX3dpdGhfY29udHJpYnV0b3IoKSB7Ci0JCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVNZXRob2RQbHVnaW4oInBsdWdpbiAxIik7Ci0JCUNvbnRlbnRQYWNrYWdlIHBrZyA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZUNvbnRlbnRQYWNrYWdlKHBsdWdpbiwgInAxIik7Ci0JCVJvbGUgcjEgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVSb2xlKHBrZywgInIxIik7Ci0JCVJvbGUgcjIgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVSb2xlKHBrZywgInIyIik7Ci0JCVJvbGVTZXQgcnMxID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlUm9sZVNldChwbHVnaW4sICJyczEiKTsKLQkJUm9sZVNldCByczIgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVSb2xlU2V0KHBsdWdpbiwgInJzMiIpOwotCQkJCQotCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZUNvbmZpZ3VyYXRpb24oImNvbmZpZyAxIik7Ci0JCWNvbmZpZy5nZXRNZXRob2RQbHVnaW5TZWxlY3Rpb24oKS5hZGQocGx1Z2luKTsKLQkJY29uZmlnLmdldE1ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKS5hZGQocGtnKTsKLQkJTGlicmFyeVV0aWwudmFsaWRhdGVNZXRob2RDb25maWd1cmF0aW9uKGNvbmZpZyk7CQotCQlFbGVtZW50UmVhbGl6ZXIgcmVhbGl6ZXIgPSBEZWZhdWx0RWxlbWVudFJlYWxpemVyLm5ld0VsZW1lbnRSZWFsaXplcihjb25maWcpOwotCQkKLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRSb2xlU2V0X1JvbGVzKCk7Ci0JCU9wcG9zaXRlRmVhdHVyZSBvZmVhdHVyZSA9IEFzc29jaWF0aW9uSGVscGVyLlJvbGVfUm9sZVNldHM7Ci0JCUxpc3QgaXRlbXM7Ci0JCQotCQlyczEuZ2V0Um9sZXMoKS5hZGQocjEpOwotCQlyczIuZ2V0Um9sZXMoKS5hZGQocjIpOwotCQkKLQkJTGlicmFyeVRlc3RIZWxwZXIuc2V0Q29udHJpYnV0ZXMocjIsIHIxKTsKLQkJCi0JCWl0ZW1zID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMG5GZWF0dXJlVmFsdWUocnMxLCBmZWF0dXJlLCByZWFsaXplcik7Ci0JCWFzc2VydEVxdWFscygxLCBpdGVtcy5zaXplKCkpOwotCQlhc3NlcnRUcnVlKGl0ZW1zLmNvbnRhaW5zKHIxKSk7Ci0KLQkJaXRlbXMgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwbkZlYXR1cmVWYWx1ZShyczIsIGZlYXR1cmUsIHJlYWxpemVyKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGl0ZW1zLnNpemUoKSk7Ci0JCWFzc2VydFRydWUoaXRlbXMuY29udGFpbnMocjEpKTsKLQkJCi0JCWl0ZW1zID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMG5GZWF0dXJlVmFsdWUocjEsIG9mZWF0dXJlLCByZWFsaXplcik7Ci0JCWFzc2VydEVxdWFscygyLCBpdGVtcy5zaXplKCkpOwotCQlhc3NlcnRUcnVlKGl0ZW1zLmNvbnRhaW5zKHJzMSkpOwotCQlhc3NlcnRUcnVlKGl0ZW1zLmNvbnRhaW5zKHJzMikpOwotCQkKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdF8xNDYxNTNfd2l0aF9leHRlbmRlcigpIHsKLQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZU1ldGhvZFBsdWdpbigicGx1Z2luIDEiKTsKLQkJQ29udGVudFBhY2thZ2UgcGtnID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlQ29udGVudFBhY2thZ2UocGx1Z2luLCAicDEiKTsKLQkJUm9sZSByMSA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZVJvbGUocGtnLCAicjEiKTsKLQkJUm9sZSByMiA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZVJvbGUocGtnLCAicjIiKTsKLQkJUm9sZVNldCByczEgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVSb2xlU2V0KHBsdWdpbiwgInJzMSIpOwotCQlSb2xlU2V0IHJzMiA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZVJvbGVTZXQocGx1Z2luLCAicnMyIik7Ci0JCQkJCi0JCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlQ29uZmlndXJhdGlvbigiY29uZmlnIDEiKTsKLQkJY29uZmlnLmdldE1ldGhvZFBsdWdpblNlbGVjdGlvbigpLmFkZChwbHVnaW4pOwotCQljb25maWcuZ2V0TWV0aG9kUGFja2FnZVNlbGVjdGlvbigpLmFkZChwa2cpOwotCQlMaWJyYXJ5VXRpbC52YWxpZGF0ZU1ldGhvZENvbmZpZ3VyYXRpb24oY29uZmlnKTsJCi0JCUVsZW1lbnRSZWFsaXplciByZWFsaXplciA9IERlZmF1bHRFbGVtZW50UmVhbGl6ZXIubmV3RWxlbWVudFJlYWxpemVyKGNvbmZpZyk7Ci0JCQotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFJvbGVTZXRfUm9sZXMoKTsKLQkJT3Bwb3NpdGVGZWF0dXJlIG9mZWF0dXJlID0gQXNzb2NpYXRpb25IZWxwZXIuUm9sZV9Sb2xlU2V0czsKLQkJTGlzdCBpdGVtczsKLQkJCi0JCXJzMS5nZXRSb2xlcygpLmFkZChyMSk7Ci0JCXJzMi5nZXRSb2xlcygpLmFkZChyMik7Ci0JCQotCQlMaWJyYXJ5VGVzdEhlbHBlci5zZXRFeHRlbmRzKHIyLCByMSk7Ci0JCQotCQlpdGVtcyA9IENvbmZpZ3VyYXRpb25IZWxwZXIuY2FsYzBuRmVhdHVyZVZhbHVlKHJzMSwgZmVhdHVyZSwgcmVhbGl6ZXIpOwotCQlhc3NlcnRFcXVhbHMoMSwgaXRlbXMuc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShpdGVtcy5jb250YWlucyhyMSkpOwotCi0JCWl0ZW1zID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMG5GZWF0dXJlVmFsdWUocnMyLCBmZWF0dXJlLCByZWFsaXplcik7Ci0JCWFzc2VydEVxdWFscygxLCBpdGVtcy5zaXplKCkpOwotCQlhc3NlcnRUcnVlKGl0ZW1zLmNvbnRhaW5zKHIyKSk7Ci0JCQotCQlpdGVtcyA9IENvbmZpZ3VyYXRpb25IZWxwZXIuY2FsYzBuRmVhdHVyZVZhbHVlKHIxLCBvZmVhdHVyZSwgcmVhbGl6ZXIpOwotCQlhc3NlcnRFcXVhbHMoMSwgaXRlbXMuc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShpdGVtcy5jb250YWlucyhyczEpKTsKLQkJCi0JCWl0ZW1zID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMG5GZWF0dXJlVmFsdWUocjIsIG9mZWF0dXJlLCByZWFsaXplcik7Ci0JCWFzc2VydEVxdWFscygxLCBpdGVtcy5zaXplKCkpOwotCQlhc3NlcnRUcnVlKGl0ZW1zLmNvbnRhaW5zKHJzMikpOwotCX0KLQkKLQkvKioKLQkgKiBSMDAzODIxMjAgLSBBdXRob3Jpbmc6ICBFeHRlbmRpbmcgYSBiYXNlIHRoYXQgaGFzIGJlZW4gcmVwbGFjZWQsIGRvZXMgbm90IGV4dGVuZCB0aGUgcmVwbGFjZW1lbnQKLQkgKiBMZXQgQSwgQiwgYW5kIEMgYmUgZWxlbWVudHMgb3IgY2F0ZWdvcmllcy4KLQkJMS4gIExldCBBIGV4dGVuZCBCLgotCQkyLiAgTGV0IEMgcmVwbGFjZSBCLiAgICAgICAgICAob3JkZXIgZG9lcyBub3QgbWF0dGVyKQotCQkKLQkJUmVzdWx0OgotCQkKLQkJQSBleHRlbmRzIHRoZSBhc3NvY2lhdGlvbnMgb2YgQiwgZXZlbiB0aG91Z2ggQiBpcyBiZWluZyByZXBsYWNlZC4KLQkJCi0JCVNob3VsZCBiZToKLQkJCi0JCUEgZXh0ZW5kcyB0aGUgYXNzb2NpYXRpb25zIG9mIHRoZSByZXBsYWNlbWVudCwgQy4KLQkgKgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RfUjAwMzgyMTIwX3Rhc2tfTWFuZGF0b3J5SW5wdXRfd2l0aF9yZXBsYWNlcnMoKSB7Ci0JCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVNZXRob2RQbHVnaW4oInBsdWdpbiAxIik7Ci0JCUNvbnRlbnRQYWNrYWdlIHBrZyA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZUNvbnRlbnRQYWNrYWdlKHBsdWdpbiwgInAxIik7Ci0JCVRhc2sgdEEgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVUYXNrKHBrZywgInQxIik7Ci0JCUFydGlmYWN0IGExID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlQXJ0aWZhY3QocGtnLCAiYTEiKTsKLQkJQXJ0aWZhY3QgYTIgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVBcnRpZmFjdChwa2csICJhMiIpOwkKLQkJdEEuZ2V0TWFuZGF0b3J5SW5wdXQoKS5hZGQoYTEpOwotCQl0QS5nZXRNYW5kYXRvcnlJbnB1dCgpLmFkZChhMik7Ci0JCQotCQlUYXNrIHRCID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlVGFzayhwa2csICJ0MiIpOwotCQlBcnRpZmFjdCBhMyA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZUFydGlmYWN0KHBrZywgImEzIik7Ci0JCUFydGlmYWN0IGE0ID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlQXJ0aWZhY3QocGtnLCAiYTQiKTsJCi0JCXRCLmdldE1hbmRhdG9yeUlucHV0KCkuYWRkKGEzKTsKLQkJdEIuZ2V0TWFuZGF0b3J5SW5wdXQoKS5hZGQoYTQpOwotCQotCQlUYXNrIHRDID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlVGFzayhwa2csICJ0MyIpOwotCQlBcnRpZmFjdCBhNSA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZUFydGlmYWN0KHBrZywgImE1Iik7Ci0JCXRDLmdldE1hbmRhdG9yeUlucHV0KCkuYWRkKGE1KTsKLQotCQlMaWJyYXJ5VGVzdEhlbHBlci5zZXRFeHRlbmRzKHRBLCB0Qik7Ci0JCUxpYnJhcnlUZXN0SGVscGVyLnNldFJlcGxhY2VzKHRDLCB0Qik7Ci0JCQotCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZUNvbmZpZ3VyYXRpb24oImNvbmZpZyAxIik7Ci0JCWNvbmZpZy5nZXRNZXRob2RQbHVnaW5TZWxlY3Rpb24oKS5hZGQocGx1Z2luKTsKLQkJY29uZmlnLmdldE1ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKS5hZGQocGtnKTsKLQkJTGlicmFyeVV0aWwudmFsaWRhdGVNZXRob2RDb25maWd1cmF0aW9uKGNvbmZpZyk7CQotCQlFbGVtZW50UmVhbGl6ZXIgcmVhbGl6ZXIgPSBEZWZhdWx0RWxlbWVudFJlYWxpemVyLm5ld0VsZW1lbnRSZWFsaXplcihjb25maWcpOwotCQkKLQkJCi0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza19NYW5kYXRvcnlJbnB1dCgpOwotCQlMaXN0IGl0ZW1zID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMG5GZWF0dXJlVmFsdWUodEEsIGZlYXR1cmUsIHJlYWxpemVyKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGl0ZW1zLnNpemUoKSk7CQkKLQkJYXNzZXJ0VHJ1ZShpdGVtcy5jb250YWlucyhhMSkpOwotCQlhc3NlcnRUcnVlKGl0ZW1zLmNvbnRhaW5zKGEyKSk7Ci0JCWFzc2VydFRydWUoaXRlbXMuY29udGFpbnMoYTUpKTsKLQotCX0KLQkKLQkvKioKLQkgKiBSMDAzODIzMjcgLSByZXBsYWNlZCBlbGVtZW50IGRvZXMgbm90IHNob3cgaW5jb21pbmcgcmVsYXRpb25zaGlwcwotCSAqIGUuZy4gcmVwbGFjZSBhIHdvcmsgcHJvZHVjdDogdGhlIHB1Ymxpc2hlZCBwYWdlIGRvZXMgbm90IHNob3cgdGhlIFRhc2tzIAotCSAqIHRoZSB3b3JrcHJvZHVjdCBpcyBpbnB1dC9vdXRwdXQgdG8uICAKLQkgKiBJdCBzaG91bGQgbGlzdCBhbGwgdGhlIFRhc2tzIGZyb20gdGhlIHJlcGxhY2VkIGVsZW1lbnQuCi0JICoKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0X1IwMDM4MjMyN190YXNrX01hbmRhdG9yeUlucHV0X3dpdGhfcmVwbGFjZXJzKCkgewotCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlTWV0aG9kUGx1Z2luKCJwbHVnaW4gMSIpOwotCQlDb250ZW50UGFja2FnZSBwa2cgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVDb250ZW50UGFja2FnZShwbHVnaW4sICJwMSIpOwotCQlUYXNrIHQxID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlVGFzayhwa2csICJ0MSIpOwotCQlUYXNrIHQyID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlVGFzayhwa2csICJ0MiIpOwotCQlUYXNrIHQzID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlVGFzayhwa2csICJ0MyIpOwkJCi0JCUFydGlmYWN0IGExID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlQXJ0aWZhY3QocGtnLCAiYTEiKTsKLQkJQXJ0aWZhY3QgYTIgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVBcnRpZmFjdChwa2csICJhMiIpOwkKLQkJCi0JCS8vIHQxLCB0MyAtPiBhMSwgdDItPmEyLCBhMiAtcmVwbGFjZS0+YTEKLQkJLy8gYTEncyB0YXNrcyBzaG91bGQgYmUgdDEsIHQyLHQzCi0JCXQxLmdldE1hbmRhdG9yeUlucHV0KCkuYWRkKGExKTsKLQkJdDMuZ2V0TWFuZGF0b3J5SW5wdXQoKS5hZGQoYTEpOwotCQl0Mi5nZXRNYW5kYXRvcnlJbnB1dCgpLmFkZChhMik7Ci0JCQotCQlMaWJyYXJ5VGVzdEhlbHBlci5zZXRSZXBsYWNlcyhhMiwgYTEpOwotCQkKLQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVDb25maWd1cmF0aW9uKCJjb25maWcgMSIpOwotCQljb25maWcuZ2V0TWV0aG9kUGx1Z2luU2VsZWN0aW9uKCkuYWRkKHBsdWdpbik7Ci0JCWNvbmZpZy5nZXRNZXRob2RQYWNrYWdlU2VsZWN0aW9uKCkuYWRkKHBrZyk7Ci0JCUxpYnJhcnlVdGlsLnZhbGlkYXRlTWV0aG9kQ29uZmlndXJhdGlvbihjb25maWcpOwkKLQkJRWxlbWVudFJlYWxpemVyIHJlYWxpemVyID0gRGVmYXVsdEVsZW1lbnRSZWFsaXplci5uZXdFbGVtZW50UmVhbGl6ZXIoY29uZmlnKTsKLQkJCi0JCQotCQlPcHBvc2l0ZUZlYXR1cmUgb2ZlYXR1cmUgPSBBc3NvY2lhdGlvbkhlbHBlci5Xb3JrUHJvZHVjdF9NYW5kYXRvcnlJbnB1dFRvX1Rhc2tzOwotCQlMaXN0IGl0ZW1zID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMG5GZWF0dXJlVmFsdWUoYTIsIG9mZWF0dXJlLCByZWFsaXplcik7Ci0JCWFzc2VydEVxdWFscygzLCBpdGVtcy5zaXplKCkpOwkJCi0JCWFzc2VydFRydWUoaXRlbXMuY29udGFpbnModDEpKTsKLQkJYXNzZXJ0VHJ1ZShpdGVtcy5jb250YWlucyh0MikpOwotCQlhc3NlcnRUcnVlKGl0ZW1zLmNvbnRhaW5zKHQzKSk7Ci0KLQl9Ci0JCi0JLyoqCi0JICogUjAwMzgyOTcyIC0gQXV0aG9yaW5nOiBXaGVuIHN1Yi1hcnRpZmFjdCBleHRlbmRzIHBhcmVudCBhcnRpZmFjdCwKLQkgKiB0aGF0IHN1YiBhcnRpZmFjdCBoYXMgaW5maW5pdGUgbG9vcCBpbiBjb25maWd1cmF0aW9uIGV4cGxvcmVyIHRyZWUuCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF9SMDAzODI5NzJfYXJ0aWZhY3RfU3ViQXJ0aWZhY3RzKCkgewotCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlTWV0aG9kUGx1Z2luKCJwbHVnaW4gMSIpOwotCQlDb250ZW50UGFja2FnZSBwa2cgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVDb250ZW50UGFja2FnZShwbHVnaW4sICJwMSIpOwotCQlBcnRpZmFjdCBhMSA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZUFydGlmYWN0KHBrZywgImExIik7Ci0JCUFydGlmYWN0IGEyID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlQXJ0aWZhY3QocGtnLCAiYTIiKTsJCi0JCQotCQkvLyBhMSBjb250YWlucyBhMiwgYTIgZXh0ZW5kcyBhMQotCQkvLyB3aGF0J3MgYTEncyBjaGlsZHJlcz8gYTIKLQkJLy8gd2hhdCdzIGEyJ3MgY2hpbGRyZW4/IGEyPyBOT09PTyEKLQkJCi0JCWExLmdldENvbnRhaW5lZEFydGlmYWN0cygpLmFkZChhMik7Ci0JCUxpYnJhcnlUZXN0SGVscGVyLnNldEV4dGVuZHMoYTIsIGExKTsKLQkJCQotCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZUNvbmZpZ3VyYXRpb24oImNvbmZpZyAxIik7Ci0JCWNvbmZpZy5nZXRNZXRob2RQbHVnaW5TZWxlY3Rpb24oKS5hZGQocGx1Z2luKTsKLQkJY29uZmlnLmdldE1ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKS5hZGQocGtnKTsKLQkJTGlicmFyeVV0aWwudmFsaWRhdGVNZXRob2RDb25maWd1cmF0aW9uKGNvbmZpZyk7CQotCQlFbGVtZW50UmVhbGl6ZXIgcmVhbGl6ZXIgPSBEZWZhdWx0RWxlbWVudFJlYWxpemVyLm5ld0VsZW1lbnRSZWFsaXplcihjb25maWcpOwotCQkKLQkJCi0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QXJ0aWZhY3RfQ29udGFpbmVkQXJ0aWZhY3RzKCk7Ci0JCUxpc3QgaXRlbXMgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwbkZlYXR1cmVWYWx1ZShhMSwgZmVhdHVyZSwgcmVhbGl6ZXIpOwotCQlhc3NlcnRFcXVhbHMoMSwgaXRlbXMuc2l6ZSgpKTsJCQotCQlhc3NlcnRUcnVlKGl0ZW1zLmNvbnRhaW5zKGEyKSk7Ci0JCQotCQkvLyBhMidzIGNvbnRhaW5lZCBhcmZpZmFjdHMgc2hvdWxkIGNvbnRhaW4gdGhlIG9uZXMgZnJvbSB0aGUgYmFzZSwgd2hpY2ggaW5jbHVkZSBpdHNlbGYKLQkJLy8gc2hvdWxkIG5vdCBjb250YWluIGl0c2VsZgotCQlpdGVtcyA9IENvbmZpZ3VyYXRpb25IZWxwZXIuY2FsYzBuRmVhdHVyZVZhbHVlKGEyLCBmZWF0dXJlLCByZWFsaXplcik7Ci0JCWFzc2VydEVxdWFscygwLCBpdGVtcy5zaXplKCkpOwkJCi0JCQotCX0KLQkKLQkvKiogCi0JICogUjAwMzgzNTI4IC0gQnJvd3Npbmc6ICBBIHJlcGxhY2luZyByb2xlIGRvZXMgbm90IHBpY2sgdXAgdGhlIHRhc2socykgZm9yIHdoaWNoIHRoZSByZXBsYWNlZCByb2xlIHdhcyBwcmltYXJ5IHBlcmZvcm1lcgotCSAqIAotCSAqCUxldCBSb2xlIEEgYmUgcHJpbWFyeSBwZXJmb3JtZXIgZm9yIFRhc2sgQSwKLSAgIAkJUm9sZSBCIGJlIHByaW1hcnkgcGVyZm9ybWVyIGZvciBUYXNrIEIuCi0KLQkJTm93IGhhdmUgUm9sZSBCIHJlcGxhY2UgUm9sZSBBLgotCQkKLQkJQnJvd3NlIFJvbGUgQiBhbmQgc2hvdWxkIGV4cGVjdCBpdCB0byBiZSB0aGUgcHJpbWFyeSBwZXJmb3JtZXIgZm9yIFRhc2sgQSBhcyB3ZWxsIGFzIFRhc2sgQi4KLQkJSXQgb25seSBzaG93cyBUYXNrIEIuCi0JCQotCQlCcm93c2UgVGFzayBBIGFuZCBpdCBjb3JyZWN0bHkgc2hvd3MgdGhhdCBSb2xlIEIgaXMgdGhlIHByaW1hcnkgcGVyZm9ybWVyLgotCSAqLwotCXB1YmxpYyB2b2lkIFIwMDM4MzUyOF9yb2xlX3Rhc2tzX3dpdGhfcmVwYWxjZXIoKSB7Ci0JCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVNZXRob2RQbHVnaW4oInBsdWdpbiAxIik7Ci0JCUNvbnRlbnRQYWNrYWdlIHBrZyA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZUNvbnRlbnRQYWNrYWdlKHBsdWdpbiwgInAxIik7Ci0JCVRhc2sgdEEgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVUYXNrKHBrZywgInQxIik7Ci0JCVJvbGUgckEgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVSb2xlKHBrZywgInIxIik7Ci0JCVRhc2sgdEIgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVUYXNrKHBrZywgInQyIik7Ci0JCVJvbGUgckIgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVSb2xlKHBrZywgInIyIik7Ci0JCQotCQl0QS5nZXRQZXJmb3JtZWRCeSgpLmFkZChyQSk7Ci0JCXRCLmdldFBlcmZvcm1lZEJ5KCkuYWRkKHJCKTsKLQkJCi0JCUxpYnJhcnlUZXN0SGVscGVyLnNldFJlcGxhY2VzKHJCLCByQSk7Ci0JCQotCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZUNvbmZpZ3VyYXRpb24oImNvbmZpZyAxIik7Ci0JCWNvbmZpZy5nZXRNZXRob2RQbHVnaW5TZWxlY3Rpb24oKS5hZGQocGx1Z2luKTsKLQkJY29uZmlnLmdldE1ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKS5hZGQocGtnKTsKLQkJTGlicmFyeVV0aWwudmFsaWRhdGVNZXRob2RDb25maWd1cmF0aW9uKGNvbmZpZyk7CQotCQlFbGVtZW50UmVhbGl6ZXIgcmVhbGl6ZXIgPSBEZWZhdWx0RWxlbWVudFJlYWxpemVyLm5ld0VsZW1lbnRSZWFsaXplcihjb25maWcpOwotCQkJCi0JCS8vIG91dGdvaW5nIGZlYXR1cmUKLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrX1BlcmZvcm1lZEJ5KCk7Ci0JCU1ldGhvZEVsZW1lbnQgciA9IENvbmZpZ3VyYXRpb25IZWxwZXIuY2FsYzAxRmVhdHVyZVZhbHVlKHRBLCBmZWF0dXJlLCByZWFsaXplcik7Ci0JCWFzc2VydEVxdWFscyhyQiwgcik7CQotCQkKLQkJciA9IENvbmZpZ3VyYXRpb25IZWxwZXIuY2FsYzAxRmVhdHVyZVZhbHVlKHRCLCBmZWF0dXJlLCByZWFsaXplcik7Ci0JCWFzc2VydEVxdWFscyhyQiwgcik7CQotCQkKLQkJLy8gaW5jb21pbmcgZmVhdHVyZQotCQlPcHBvc2l0ZUZlYXR1cmUgb2ZlYXR1cmUgPSBBc3NvY2lhdGlvbkhlbHBlci5Sb2xlX1ByaW1hcnlfVGFza3M7Ci0JCUxpc3QgaXRlbXMgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwbkZlYXR1cmVWYWx1ZShyQiwgZmVhdHVyZSwgcmVhbGl6ZXIpOwotCQlhc3NlcnRFcXVhbHMoMiwgaXRlbXMuc2l6ZSgpKTsJCQotCQlhc3NlcnRUcnVlKGl0ZW1zLmNvbnRhaW5zKHRBKSk7Ci0JCWFzc2VydFRydWUoaXRlbXMuY29udGFpbnModEIpKTsKLQotCX0KLQkKLQkvKioKLQkgKiAxNDYxNTMgLSBWYXJpYWJpbGl0eTogSW5jb21pbmcgdG8tbWFueSBhc3NvY2lhdGlvbnMgYXJlIG5vdCBwcmVzZXJ2ZWQgaW4gdGhlIGNhc2Ugb2Ygcm9sZSByZXBsYWNlbWVudAotCSAqIAotCSAqIFNURVBTOgotCQkxLiBjcmVhdGUgcm9sZUEgYW5kIHJvbGVCLiBBc3NpZ24gdGhlbSB0byByb2xlc2V0QSBhbmQgcm9sZXNldEIgcmVzcGVjdGl2ZWx5Ci0JCTIuIHNldCByb2xlQSB0byByZXBsYWNlIHJvbGVCIGFuZCBicm93c2UKLQkJcmVzdWx0cz0+IGJyb3dzaW5nIHNob3dzIHJvbGVBIGluIHJvbGVzZXRBIG9ubHkuIAotCQlleHBlY3QgcmVzdWx0cz0+IHJvbGVBIHNob3VsZCBiZSBpbiByb2xlc2V0QSBhbmQgcm9sZXNldEIKLQkgKgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RfMTQ2MTUzX3JvbGVfcm9sZXNldF93aXRoX3JlcGxhY2VyKCkgewotCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlTWV0aG9kUGx1Z2luKCJwbHVnaW4gMSIpOwotCQlDb250ZW50UGFja2FnZSBwa2cgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVDb250ZW50UGFja2FnZShwbHVnaW4sICJwMSIpOwotCQlSb2xlIHIxID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlUm9sZShwa2csICJyMSIpOwotCQlSb2xlIHIyID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlUm9sZShwa2csICJyMiIpOwotCQlSb2xlU2V0IHJzMSA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZVJvbGVTZXQocGx1Z2luLCAicnMxIik7Ci0JCVJvbGVTZXQgcnMyID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlUm9sZVNldChwbHVnaW4sICJyczIiKTsKLQkJCQkKLQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVDb25maWd1cmF0aW9uKCJjb25maWcgMSIpOwotCQljb25maWcuZ2V0TWV0aG9kUGx1Z2luU2VsZWN0aW9uKCkuYWRkKHBsdWdpbik7Ci0JCWNvbmZpZy5nZXRNZXRob2RQYWNrYWdlU2VsZWN0aW9uKCkuYWRkKHBrZyk7Ci0JCUxpYnJhcnlVdGlsLnZhbGlkYXRlTWV0aG9kQ29uZmlndXJhdGlvbihjb25maWcpOwkKLQkJRWxlbWVudFJlYWxpemVyIHJlYWxpemVyID0gRGVmYXVsdEVsZW1lbnRSZWFsaXplci5uZXdFbGVtZW50UmVhbGl6ZXIoY29uZmlnKTsKLQkJCi0JCU9wcG9zaXRlRmVhdHVyZSBvZmVhdHVyZSA9IEFzc29jaWF0aW9uSGVscGVyLlJvbGVfUm9sZVNldHM7Ci0JCUxpc3QgaXRlbXM7Ci0JCQotCQkvLyBjYXNlIDEKLQkJcnMxLmdldFJvbGVzKCkuYWRkKHIxKTsKLQkJcnMyLmdldFJvbGVzKCkuYWRkKHIyKTsKLQkJTGlicmFyeVRlc3RIZWxwZXIuc2V0UmVwbGFjZXMocjIsIHIxKTsKLQkJaXRlbXMgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwbkZlYXR1cmVWYWx1ZShyMiwgb2ZlYXR1cmUsIHJlYWxpemVyKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGl0ZW1zLnNpemUoKSk7Ci0JCWFzc2VydFRydWUoaXRlbXMuY29udGFpbnMocnMxKSk7Ci0JCWFzc2VydFRydWUoaXRlbXMuY29udGFpbnMocnMyKSk7Ci0JCQotCX0KLQkKLQkvKioKLQkgKiAxNTIyMzAgLSBCcm93c2luZzogUm9sZTwtLT5XUCByZWxhdGlvbnNoaXAgc2hvd3MgaW5jb25zaXN0YW5jeQotCSAqIAkxLiBjcmVhdGUgcm9sZTEgcmVzcG9uc2libGUgZm9yIHdwMQotCQkyLiBjcmVhdGUgcm9sZTIgcmVzcG9uc2libGUgZm9yIHdwMgotCQkzLiBoYXMgd3AyIHJlcGxhY3Mgd3AxLCBhbmQgd3AxIGNvbnRyaWJ1dGUgdG8gd3AKLQkJNC4gYnJvd3Npbmcgc2hvd3MgdGhhdAotCQkKLQkJaW4gd3AsIGl0IHNob3dzIHRoYXQgYm90aCByb2xlMSBhbmQgcm9sZTIgYXJlIHJlc3BvbnNpYmxlCi0JCWluIHJvbGUxLCB0aGUgcmVsYXRpb25zaGlwIHNob3dzIGl0IGlzIHJlc3BvbnNpYmxlIGZvciB3cAotCQlidXQgaW4gcm9sZTIsIHRoZSByZWxhdGlvbnNoaXAgc2hvd3Mgbm8gd3AKLQkJCi0JCVRvIGJlIGNvbnNpc3RhbnQsIHdwIHNob3VsZCBiZSBzaG93aW5nIGluIHJvbGUyJ3MgcmVsYXRpb25zaGlwIGRpYWdyYW0uCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF8xNTIyMzBfcm9sZV93cCgpIHsKLQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZU1ldGhvZFBsdWdpbigicGx1Z2luIDEiKTsKLQkJQ29udGVudFBhY2thZ2UgcGtnID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlQ29udGVudFBhY2thZ2UocGx1Z2luLCAicDEiKTsKLQkJUm9sZSByMSA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZVJvbGUocGtnLCAicjEiKTsKLQkJUm9sZSByMiA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZVJvbGUocGtnLCAicjIiKTsKLQkJQXJ0aWZhY3Qgd3AxID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlQXJ0aWZhY3QocGtnLCAid3AxIik7Ci0JCUFydGlmYWN0IHdwMiA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZUFydGlmYWN0KHBrZywgIndwMiIpOwotCQlBcnRpZmFjdCB3cCA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZUFydGlmYWN0KHBrZywgIndwIik7Ci0JCQkJCi0JCXIxLmdldFJlc3BvbnNpYmxlRm9yKCkuYWRkKHdwMSk7Ci0JCXIyLmdldFJlc3BvbnNpYmxlRm9yKCkuYWRkKHdwMik7Ci0JCUxpYnJhcnlUZXN0SGVscGVyLnNldENvbnRyaWJ1dGVzKHdwMSwgd3ApOwotCQlMaWJyYXJ5VGVzdEhlbHBlci5zZXRSZXBsYWNlcyh3cDIsIHdwMSk7Ci0JCQotCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZUNvbmZpZ3VyYXRpb24oImNvbmZpZyAxIik7Ci0JCWNvbmZpZy5nZXRNZXRob2RQbHVnaW5TZWxlY3Rpb24oKS5hZGQocGx1Z2luKTsKLQkJY29uZmlnLmdldE1ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKS5hZGQocGtnKTsKLQkJTGlicmFyeVV0aWwudmFsaWRhdGVNZXRob2RDb25maWd1cmF0aW9uKGNvbmZpZyk7CQotCQlFbGVtZW50UmVhbGl6ZXIgcmVhbGl6ZXIgPSBEZWZhdWx0RWxlbWVudFJlYWxpemVyLm5ld0VsZW1lbnRSZWFsaXplcihjb25maWcpOwotCQkKLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRSb2xlX1Jlc3BvbnNpYmxlRm9yKCk7Ci0JCU9wcG9zaXRlRmVhdHVyZSBvZmVhdHVyZSA9IEFzc29jaWF0aW9uSGVscGVyLldvcmtQcm9kdWN0X1Jlc3BvbnNpYmxlUm9sZXM7Ci0JCUxpc3QgaXRlbXM7Ci0JCQotCQkvLyBib3RoIHIxIGFuZCByMiByZXNwb25zaWJsZSBmb3Igd3AKLQkJaXRlbXMgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwbkZlYXR1cmVWYWx1ZShyMSwgZmVhdHVyZSwgcmVhbGl6ZXIpOwotCQlhc3NlcnRFcXVhbHMoMSwgaXRlbXMuc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShpdGVtcy5jb250YWlucyh3cCkpOwotCQkKLQkJaXRlbXMgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwbkZlYXR1cmVWYWx1ZShyMiwgZmVhdHVyZSwgcmVhbGl6ZXIpOwotCQlhc3NlcnRFcXVhbHMoMSwgaXRlbXMuc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShpdGVtcy5jb250YWlucyh3cCkpOwotCQkKLQkJaXRlbXMgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwbkZlYXR1cmVWYWx1ZSh3cCwgb2ZlYXR1cmUsIHJlYWxpemVyKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGl0ZW1zLnNpemUoKSk7Ci0JCWFzc2VydFRydWUoaXRlbXMuY29udGFpbnMocjEpKTsKLQkJYXNzZXJ0VHJ1ZShpdGVtcy5jb250YWlucyhyMikpOwotCQkKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3RzL3ZhcmlhYmlsaXR5L1ZhcmlhYmxpdHlCYXNlVGVzdENhc2UuamF2YSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdHMvdmFyaWFiaWxpdHkvVmFyaWFibGl0eUJhc2VUZXN0Q2FzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOWRkNGQzLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdHMvdmFyaWFiaWxpdHkvVmFyaWFibGl0eUJhc2VUZXN0Q2FzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMudmFyaWFiaWxpdHk7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzLkxpYnJhcnlUZXN0SGVscGVyOwotCi0vKioKLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBWYXJpYWJsaXR5QmFzZVRlc3RDYXNlIGV4dGVuZHMgVGVzdENhc2UgewotCi0JcHVibGljIFZhcmlhYmxpdHlCYXNlVGVzdENhc2UoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSNzZXRVcCgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJCi0JCUxpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZVRlc3RNZXRob2RMaWJyYXJ5KCk7Ci0JCQotCQkvLyBhY3RpdmF0ZSB0aGUgQXV0aG9yaW5nIHBsdWdpbnMgdG8gaW5pdGlhbGl6ZSBzb21ldGhpbmcKLQkJLy8gdGhlIHJlYXNvbiB0byBwdXQgaXQgYWZ0ZXIgdGhlIGxpYnJhcnkgaXMgY3JlYXRlZCBpcyB0byBhdm9pZCB0aGUgT3BlbiBMaWJyYXJ5IGRpYWxvZwotCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCk7Ci0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UjdGVhckRvd24oKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JCQotCQlMaWJyYXJ5VGVzdEhlbHBlci5jbG9zZUxpYnJhcnkoKTsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LnRlc3RzLy5jbGFzc3BhdGggYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LnRlc3RzLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1MWM4ZjIuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC50ZXN0cy8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC50ZXN0cy8ucHJvamVjdCBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQudGVzdHMvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0NTZkNjYuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC50ZXN0cy8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC50ZXN0czwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LnRlc3RzL01FVEEtSU5GL01BTklGRVNULk1GIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC50ZXN0cy9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjgwMDllMC4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LnRlc3RzL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogRVBGIFJpY2hUZXh0IFRlc3RzIFBsdWctaW4KLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC50ZXN0czsgc2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS41LjAucXVhbGlmaWVyCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQudGVzdHMuUmljaFRleHRUZXN0c1BsdWdpbgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLAotIG9yZy5lY2xpcHNlLmVwZi5jb21tb24sCi0gb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LAotIG9yZy5lY2xpcHNlLnVpLAotIG9yZy5qdW5pdCwKLSBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpCi1FY2xpcHNlLUxhenlTdGFydDogdHJ1ZQotQnVuZGxlLVZlbmRvcjogRWNsaXBzZS5vcmcKZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQudGVzdHMvYnVpbGQucHJvcGVydGllcyBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQudGVzdHMvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGQzZDNhNy4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LnRlc3RzL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLXNvdXJjZS4uID0gc3JjLwotb3V0cHV0Li4gPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICAuLFwKLSAgICAgICAgICAgICAgIGljb25zLwpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC50ZXN0cy9pY29ucy9zYW1wbGUuZ2lmIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC50ZXN0cy9pY29ucy9zYW1wbGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNGZiM2M5Li4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQudGVzdHMvaWNvbnMvc2FtcGxlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQudGVzdHMvcGx1Z2luLnhtbCBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQudGVzdHMvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmJmM2I2NS4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LnRlc3RzL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMiI/PgotPHBsdWdpbj4KLQotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnZpZXdzIj4KLSAgICAgIDxjYXRlZ29yeQotICAgICAgICAgICAgbmFtZT0iRVBGIFRlc3RzIENhdGVnb3J5IgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC50ZXN0cyI+Ci0gICAgICA8L2NhdGVnb3J5PgotICAgICAgPHZpZXcKLSAgICAgICAgICAgIG5hbWU9IlJpY2ggVGV4dCBUZXN0IFZpZXciCi0gICAgICAgICAgICBpY29uPSJpY29ucy9zYW1wbGUuZ2lmIgotICAgICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC50ZXN0cyIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYucmljaHRleHQudGVzdHMudmlld3MuUmljaFRleHRUZXN0VmlldyIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYucmljaHRleHQudGVzdHMudmlld3MuUmljaFRleHRUZXN0VmlldyI+Ci0gICAgICA8L3ZpZXc+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIAotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnBlcnNwZWN0aXZlRXh0ZW5zaW9ucyI+Ci0gICAgICA8cGVyc3BlY3RpdmVFeHRlbnNpb24KLSAgICAgICAgICAgIHRhcmdldElEPSJvcmcuZWNsaXBzZS51aS5yZXNvdXJjZVBlcnNwZWN0aXZlIj4KLSAgICAgICAgIDx2aWV3Ci0gICAgICAgICAgICAgICByYXRpbz0iMC41IgotICAgICAgICAgICAgICAgcmVsYXRpdmU9Im9yZy5lY2xpcHNlLnVpLnZpZXdzLlRhc2tMaXN0IgotICAgICAgICAgICAgICAgcmVsYXRpb25zaGlwPSJyaWdodCIKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYucmljaHRleHQudGVzdHMudmlld3MuUmljaFRleHRUZXN0VmlldyI+Ci0gICAgICAgICA8L3ZpZXc+Ci0gICAgICA8L3BlcnNwZWN0aXZlRXh0ZW5zaW9uPgotICAgPC9leHRlbnNpb24+Ci0gICAKLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5lZGl0b3JzIj4KLSAgICAgIDxlZGl0b3IKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYucmljaHRleHQudGVzdHMuZWRpdG9ycy5IVE1MRWRpdG9yIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC50ZXN0cy5lZGl0b3JzLkhUTUxFZGl0b3IiCi0gICAgICAgICAgICBjb250cmlidXRvckNsYXNzPSJvcmcuZWNsaXBzZS5lcGYucmljaHRleHQudGVzdHMuZWRpdG9ycy5IVE1MRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3IiICAgICAgICAgICAgCi0gICAgICAgICAgICBuYW1lPSJIVE1MIEVkaXRvciIKLSAgICAgICAgICAgIGV4dGVuc2lvbnM9Imh0bWwiCi0gICAgICAgICAgICBpY29uPSJpY29ucy9zYW1wbGUuZ2lmIj4KLSAgICAgIDwvZWRpdG9yPgotICAgICAgPGVkaXRvcgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC50ZXN0cy5lZGl0b3JzLk11bHRpUGFnZUhUTUxFZGl0b3IiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LnRlc3RzLmVkaXRvcnMuTXVsdGlQYWdlSFRNTEVkaXRvciIgICAgICAgICAgIAotICAgICAgICAgICAgbmFtZT0iTXVsdGktcGFnZSBIVE1MIEVkaXRvciIKLSAgICAgICAgICAgIGV4dGVuc2lvbnM9Imh0bWwiCi0gICAgICAgICAgICBpY29uPSJpY29ucy9zYW1wbGUuZ2lmIj4KLSAgICAgIDwvZWRpdG9yPgotICAgPC9leHRlbnNpb24+ICAgICAgCi0KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L3Rlc3RzL1JpY2hUZXh0VGVzdC5qYXZhIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L3Rlc3RzL1JpY2hUZXh0VGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MGQwYWMxLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC90ZXN0cy9SaWNoVGV4dFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC50ZXN0czsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuU3RyVXRpbDsKLQotLyoqCi0gKiBKVW5pdCB0ZXN0cyBmb3IgdGhlIG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dCBjbGFzc2VzLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFJpY2hUZXh0VGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQkKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBSaWNoVGV4dFRlc3QoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JLyoqCi0JICogVGVzdHMgdGhlIFN0clV0aWwuaXNOdWxsKCkgbWV0aG9kLgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RJc051bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkgICAgYXNzZXJ0VHJ1ZShTdHJVdGlsLmlzTnVsbChudWxsKSk7Ci0JICAgIGFzc2VydFRydWUoU3RyVXRpbC5pc051bGwoIiIpKTsKLQkgICAgYXNzZXJ0RmFsc2UoU3RyVXRpbC5pc051bGwoIkhlbGxvIikpOwkgICAgCi0JfQotCQotfQpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L3Rlc3RzL1JpY2hUZXh0VGVzdHMuamF2YSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC90ZXN0cy9SaWNoVGV4dFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwMjdiMjcuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L3Rlc3RzL1JpY2hUZXh0VGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC50ZXN0czsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLS8qKgotICogSlVuaXQgdGVzdCBzdWl0ZSBmb3Igb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBSaWNoVGV4dFRlc3RzIHsKLQotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZShSaWNoVGV4dFRlc3RzLmNsYXNzLmdldFBhY2thZ2UoKS5nZXROYW1lKCkpOwotCQkvLyRKVW5pdC1CRUdJTiQKLQkJLy9zdWl0ZS5hZGRUZXN0U3VpdGUoU3RyVXRpbFRlc3QuY2xhc3MpOwotCQkvLyRKVW5pdC1FTkQkCi0JCXJldHVybiBzdWl0ZTsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvdGVzdHMvUmljaFRleHRUZXN0c1BsdWdpbi5qYXZhIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L3Rlc3RzL1JpY2hUZXh0VGVzdHNQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjZmZDUxZC4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvdGVzdHMvUmljaFRleHRUZXN0c1BsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LnRlc3RzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS5BYnN0cmFjdFBsdWdpbjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotLyoqCi0gKiBUaGUgUmljaFRleHQgVGVzdHMgcGx1Zy1pbiBjbGFzcy4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBSaWNoVGV4dFRlc3RzUGx1Z2luIGV4dGVuZHMgQWJzdHJhY3RQbHVnaW4gewotCi0JLy8gVGhlIHNoYXJlZCBwbHVnLWluIGluc3RhbmNlLgotCXByaXZhdGUgc3RhdGljIFJpY2hUZXh0VGVzdHNQbHVnaW4gcGx1Z2luOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgUmljaFRleHRUZXN0c1BsdWdpbigpIHsKLQkJc3VwZXIoKTsKLQkJcGx1Z2luID0gdGhpczsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIEFic3RyYWN0UGx1Z2luI3N0YXJ0KEJ1bmRsZUNvbnRleHQpCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RhcnQoY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBBYnN0cmFjdFBsdWdpbiNzdG9wKEJ1bmRsZUNvbnRleHQpCi0JICovCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdG9wKGNvbnRleHQpOwotCQlwbHVnaW4gPSBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNoYXJlZCBwbHVnLWluIGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgUmljaFRleHRUZXN0c1BsdWdpbiBnZXREZWZhdWx0KCkgewotCQlyZXR1cm4gcGx1Z2luOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC90ZXN0cy9hY3Rpb25zL0Jsb2NrVGFnQ29udHJpYnV0aW9uLmphdmEgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvdGVzdHMvYWN0aW9ucy9CbG9ja1RhZ0NvbnRyaWJ1dGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YjI0NGM0Li4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC90ZXN0cy9hY3Rpb25zL0Jsb2NrVGFnQ29udHJpYnV0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LnRlc3RzLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuSVJpY2hUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0Lmh0bWwuQmxvY2tUYWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkNvbnRyb2xDb250cmlidXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLQotLyoqCi0gKiBDb250cmlidXRlcyBhIGNvbWJvIGNvbnRhaW5pbmcgSFRNTCBibG9jayB0YWdzIHRvIGEgdG9vbCBiYXIuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQmxvY2tUYWdDb250cmlidXRpb24gZXh0ZW5kcyBDb250cm9sQ29udHJpYnV0aW9uIHsKLQotCS8qKgotCSAqIFRoZSBDb250cmlidXRpb24gSUQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVFJJQlVUSU9OX0lEID0gQmxvY2tUYWdDb250cmlidXRpb24uY2xhc3MKLQkJCS5nZXROYW1lKCk7Ci0KLQkvLyBUaGUgcmljaCB0ZXh0IGNvbnRyb2wuCi0JcHJpdmF0ZSBJUmljaFRleHQgcmljaFRleHQ7Ci0KLQkvLyBUaGUgYmxvY2sgdGFnIGNvbWJvLgotCXByaXZhdGUgc3RhdGljIENvbWJvIGJsb2NrVGFnQ29tYm87Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqIAotCSAqIEBwYXJhbSByaWNoVGV4dAotCSAqICAgICAgICAgICAgVGhlIHJpY2ggdGV4dCBjb250cm9sLgotCSAqLwotCXB1YmxpYyBCbG9ja1RhZ0NvbnRyaWJ1dGlvbihJUmljaFRleHQgcmljaFRleHQpIHsKLQkJc3VwZXIoQ09OVFJJQlVUSU9OX0lEKTsKLQkJdGhpcy5yaWNoVGV4dCA9IHJpY2hUZXh0OwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkNvbnRyb2xDb250cmlidXRpb24jY3JlYXRlQ29udHJvbChvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCi0JICovCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCWJsb2NrVGFnQ29tYm8gPSBuZXcgQ29tYm8ocGFyZW50LCBTV1QuUkVBRF9PTkxZIHwgU1dULkZMQVQpOwotCQlibG9ja1RhZ0NvbWJvLmFkZChCbG9ja1RhZy5QQVJBR1JBUEguZ2V0TmFtZSgpKTsKLQkJYmxvY2tUYWdDb21iby5hZGQoQmxvY2tUYWcuSEVBRElOR18xLmdldE5hbWUoKSk7Ci0JCWJsb2NrVGFnQ29tYm8uYWRkKEJsb2NrVGFnLkhFQURJTkdfMi5nZXROYW1lKCkpOwotCQlibG9ja1RhZ0NvbWJvLmFkZChCbG9ja1RhZy5IRUFESU5HXzMuZ2V0TmFtZSgpKTsKLQkJYmxvY2tUYWdDb21iby5hZGQoQmxvY2tUYWcuSEVBRElOR180LmdldE5hbWUoKSk7Ci0JCWJsb2NrVGFnQ29tYm8uYWRkKEJsb2NrVGFnLkhFQURJTkdfNS5nZXROYW1lKCkpOwotCQlibG9ja1RhZ0NvbWJvLmFkZChCbG9ja1RhZy5IRUFESU5HXzYuZ2V0TmFtZSgpKTsKLQkJYmxvY2tUYWdDb21iby5hZGQoQmxvY2tUYWcuQUREUkVTUy5nZXROYW1lKCkpOwotCQlibG9ja1RhZ0NvbWJvLmFkZChCbG9ja1RhZy5QUkVGT1JNQVRURURfVEVYVC5nZXROYW1lKCkpOwotCQlibG9ja1RhZ0NvbWJvLnNldFZpc2libGVJdGVtQ291bnQoYmxvY2tUYWdDb21iby5nZXRJdGVtQ291bnQoKSk7Ci0JCWJsb2NrVGFnQ29tYm8uc2VsZWN0KDApOwotCQlpZiAocmljaFRleHQgIT0gbnVsbCkgewotCQkJYmxvY2tUYWdDb21iby5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCQlPYmplY3QgZXZlbnRTcmMgPSBldmVudC5nZXRTb3VyY2UoKTsKLQkJCQkJaWYgKGV2ZW50U3JjIGluc3RhbmNlb2YgQ29tYm8pIHsKLQkJCQkJCUNvbWJvIGNvbWJvID0gKENvbWJvKSBldmVudFNyYzsKLQkJCQkJCWludCBpbmRleCA9IGNvbWJvLmdldFNlbGVjdGlvbkluZGV4KCk7Ci0JCQkJCQlTdHJpbmcgdmFsdWUgPSBCbG9ja1RhZy5nZXRCbG9ja1RhZyhpbmRleCkuZ2V0VmFsdWUoKTsKLQkJCQkJCXJpY2hUZXh0LmV4ZWN1dGVDb21tYW5kKFJpY2hUZXh0Q29tbWFuZC5GT1JNQVRfQkxPQ0ssCi0JCQkJCQkJCXZhbHVlKTsKLQkJCQkJfQotCQkJCX07Ci0JCQl9KTsKLQkJfQotCi0JCXJldHVybiBibG9ja1RhZ0NvbWJvOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC90ZXN0cy9hY3Rpb25zL0JvbGRBY3Rpb24uamF2YSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC90ZXN0cy9hY3Rpb25zL0JvbGRBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDA5YWViNC4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvdGVzdHMvYWN0aW9ucy9Cb2xkQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC50ZXN0cy5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRJbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0UmVzb3VyY2VzOwotCi0vKioKLSAqIFRvZ2dsZXMgdGhlICdib2xkJyBhdHRyaWJ1dGUgb2YgdGhlIHNlbGVjdGVkIHRleHQuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlICAxLjAKLSAqLwotcHVibGljIGNsYXNzIEJvbGRBY3Rpb24gZXh0ZW5kcyBSaWNoVGV4dEFjdGlvbiB7Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgQm9sZEFjdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JLyoqCi0JICogSW5pdGlhbGl6ZXMgdGhlIGFjdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KCkgewotCQlzZXRJbWFnZURlc2NyaXB0b3IoUmljaFRleHRJbWFnZXMuSU1HX0RFU0NfQk9MRCk7Ci0JCXNldFRvb2xUaXBUZXh0KFJpY2hUZXh0UmVzb3VyY2VzLmJvbGRBY3Rpb25fdG9vbFRpcFRleHQpOwkKLQl9Ci0JCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQlpZiAoZWRpdG9yICE9IG51bGwpIHsKLQkJCWVkaXRvci5leGVjdXRlQ29tbWFuZChSaWNoVGV4dENvbW1hbmQuQk9MRCwgbnVsbCk7CQkJCi0JCX0KLQkJCi0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvdGVzdHMvYWN0aW9ucy9Gb250TmFtZUNvbnRyaWJ1dGlvbi5qYXZhIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L3Rlc3RzL2FjdGlvbnMvRm9udE5hbWVDb250cmlidXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTZhZDNiZS4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvdGVzdHMvYWN0aW9ucy9Gb250TmFtZUNvbnRyaWJ1dGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LnRlc3RzLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuSVJpY2hUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0Lmh0bWwuRm9udE5hbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkNvbnRyb2xDb250cmlidXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLQotLyoqCi0gKiBDb250cmlidXRlcyBhIGNvbWJvIGNvbnRhaW5pbmcgSFRNTCBmb250IG5hbWVzIHRvIGEgdG9vbCBiYXIuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlICAxLjAKLSAqLwotcHVibGljIGNsYXNzIEZvbnROYW1lQ29udHJpYnV0aW9uIGV4dGVuZHMgQ29udHJvbENvbnRyaWJ1dGlvbiB7Ci0JCi0JLyoqCi0JICogVGhlIENvbnRyaWJ1dGlvbiBJRC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05UUklCVVRJT05fSUQgPSBGb250TmFtZUNvbnRyaWJ1dGlvbi5jbGFzcy5nZXROYW1lKCk7Ci0JCi0JLy8gVGhlIHJpY2ggdGV4dCBjb250cm9sLgotCXByaXZhdGUgSVJpY2hUZXh0IHJpY2hUZXh0OwotCQotCS8vIFRoZSBmb250IG5hbWUgY29tYm8uCi0JcHJpdmF0ZSBzdGF0aWMgQ29tYm8gZm9udE5hbWVDb21ibzsKLQkKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqIAotCSAqIEBwYXJhbQlyaWNoVGV4dAlUaGUgcmljaCB0ZXh0IGNvbnRyb2wuCi0JICovCi0JcHVibGljIEZvbnROYW1lQ29udHJpYnV0aW9uKElSaWNoVGV4dCByaWNoVGV4dCkgewotCQlzdXBlcihDT05UUklCVVRJT05fSUQpOwotCQl0aGlzLnJpY2hUZXh0ID0gcmljaFRleHQ7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkNvbnRyb2xDb250cmlidXRpb24jY3JlYXRlQ29udHJvbChvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCi0JICovCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCWZvbnROYW1lQ29tYm8gPSBuZXcgQ29tYm8ocGFyZW50LCBTV1QuUkVBRF9PTkxZIHwgU1dULkZMQVQpOwotCQlmb250TmFtZUNvbWJvLmFkZChGb250TmFtZS5ERUZBVUxULmdldE5hbWUoKSk7Ci0JCWZvbnROYW1lQ29tYm8uYWRkKEZvbnROYW1lLkFSSUFMLmdldE5hbWUoKSk7Ci0JCWZvbnROYW1lQ29tYm8uYWRkKEZvbnROYW1lLkNPVVJJRVJfTkVXLmdldE5hbWUoKSk7Ci0JCWZvbnROYW1lQ29tYm8uYWRkKEZvbnROYW1lLlRJTUVTX05FV19ST01BTi5nZXROYW1lKCkpOwotCQlmb250TmFtZUNvbWJvLmFkZChGb250TmFtZS5WRVJEQU5BLmdldE5hbWUoKSk7Ci0JCWZvbnROYW1lQ29tYm8uc2V0VmlzaWJsZUl0ZW1Db3VudChmb250TmFtZUNvbWJvLmdldEl0ZW1Db3VudCgpKTsJCQotCQlmb250TmFtZUNvbWJvLnNlbGVjdCgwKTsKLQkJaWYgKHJpY2hUZXh0ICE9IG51bGwpIHsKLQkJCWZvbnROYW1lQ29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQkJT2JqZWN0IGV2ZW50U3JjID0gZXZlbnQuZ2V0U291cmNlKCk7Ci0JCQkJCWlmIChldmVudFNyYyBpbnN0YW5jZW9mIENvbWJvKSB7Ci0JCQkJCQlDb21ibyBjb21ibyA9IChDb21ibylldmVudFNyYzsKLQkJCQkJCWludCBpbmRleCA9IGNvbWJvLmdldFNlbGVjdGlvbkluZGV4KCk7Ci0JCQkJCQlTdHJpbmcgdmFsdWUgPSBGb250TmFtZS5nZXRGb250TmFtZShpbmRleCkuZ2V0VmFsdWUoKTsKLQkJCQkJCXJpY2hUZXh0LmV4ZWN1dGVDb21tYW5kKFJpY2hUZXh0Q29tbWFuZC5TRVRfRk9OVF9OQU1FLCB2YWx1ZSk7Ci0JCQkJCX0KLQkJCQl9OwotCQkJfSk7Ci0JCX0KLQkJCi0JCXJldHVybiBmb250TmFtZUNvbWJvOwotCX0KLQkKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvdGVzdHMvYWN0aW9ucy9Gb250U2l6ZUNvbnRyaWJ1dGlvbi5qYXZhIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L3Rlc3RzL2FjdGlvbnMvRm9udFNpemVDb250cmlidXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDVkYzg4NC4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvdGVzdHMvYWN0aW9ucy9Gb250U2l6ZUNvbnRyaWJ1dGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQudGVzdHMuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5JUmljaFRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQ29udHJvbENvbnRyaWJ1dGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotCi0vKioKLSAqIENvbnRyaWJ1dGVzIGEgY29tYm8gY29udGFpbmluZyBIVE1MIGZvbnQgc2l6ZXMgdG8gYSB0b29sIGJhci4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRm9udFNpemVDb250cmlidXRpb24gZXh0ZW5kcyBDb250cm9sQ29udHJpYnV0aW9uIHsKLQkKLQkvKioKLQkgKiBUaGUgQ29udHJpYnV0aW9uIElELgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlRSSUJVVElPTl9JRCA9IEZvbnRTaXplQ29udHJpYnV0aW9uLmNsYXNzLmdldE5hbWUoKTsKLQkKLQkvLyBUaGUgcmljaCB0ZXh0IGNvbnRyb2wuCi0JcHJpdmF0ZSBJUmljaFRleHQgcmljaFRleHQ7Ci0JCi0JLy8gVGhlIGZvbnQgc2l6ZSBjb21iby4KLQlwcml2YXRlIHN0YXRpYyBDb21ibyBmb250U2l6ZUNvbWJvOwotCQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICogCi0JICogQHBhcmFtCXJpY2hUZXh0CVRoZSByaWNoIHRleHQgY29udHJvbC4KLQkgKi8KLQlwdWJsaWMgRm9udFNpemVDb250cmlidXRpb24oSVJpY2hUZXh0IHJpY2hUZXh0KSB7Ci0JCXN1cGVyKENPTlRSSUJVVElPTl9JRCk7Ci0JCXRoaXMucmljaFRleHQgPSByaWNoVGV4dDsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQ29udHJvbENvbnRyaWJ1dGlvbiNjcmVhdGVDb250cm9sKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKLQkgKi8KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJZm9udFNpemVDb21ibyA9IG5ldyBDb21ibyhwYXJlbnQsIFNXVC5SRUFEX09OTFkgfCBTV1QuRkxBVCk7Ci0JCWZvbnRTaXplQ29tYm8uYWRkKCIxIik7IC8vJE5PTi1OTFMtMSQKLQkJZm9udFNpemVDb21iby5hZGQoIjIiKTsgLy8kTk9OLU5MUy0xJAotCQlmb250U2l6ZUNvbWJvLmFkZCgiMyIpOyAvLyROT04tTkxTLTEkCi0JCWZvbnRTaXplQ29tYm8uYWRkKCI0Iik7IC8vJE5PTi1OTFMtMSQKLQkJZm9udFNpemVDb21iby5hZGQoIjUiKTsgLy8kTk9OLU5MUy0xJAotCQlmb250U2l6ZUNvbWJvLmFkZCgiNiIpOyAvLyROT04tTkxTLTEkCi0JCWZvbnRTaXplQ29tYm8uYWRkKCI3Iik7IC8vJE5PTi1OTFMtMSQJCQotCQlmb250U2l6ZUNvbWJvLnNldFZpc2libGVJdGVtQ291bnQoZm9udFNpemVDb21iby5nZXRJdGVtQ291bnQoKSk7Ci0JCWZvbnRTaXplQ29tYm8uc2VsZWN0KDIpOwotCQlpZiAocmljaFRleHQgIT0gbnVsbCkgewotCQkJZm9udFNpemVDb21iby5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCQlPYmplY3QgZXZlbnRTcmMgPSBldmVudC5nZXRTb3VyY2UoKTsKLQkJCQkJaWYgKGV2ZW50U3JjIGluc3RhbmNlb2YgQ29tYm8pIHsKLQkJCQkJCUNvbWJvIGNvbWJvID0gKENvbWJvKWV2ZW50U3JjOwotCQkJCQkJaW50IGZvbnRTaXplID0gY29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKSArIDE7Ci0JCQkJCQlyaWNoVGV4dC5leGVjdXRlQ29tbWFuZChSaWNoVGV4dENvbW1hbmQuU0VUX0ZPTlRfU0laRSwgIiIgKyBmb250U2l6ZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCX07Ci0JCQl9KTsKLQkJfQotCQkKLQkJcmV0dXJuIGZvbnRTaXplQ29tYm87Ci0JfQotCQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC90ZXN0cy9hY3Rpb25zL0l0YWxpY0FjdGlvbi5qYXZhIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L3Rlc3RzL2FjdGlvbnMvSXRhbGljQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzZWU2M2UuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L3Rlc3RzL2FjdGlvbnMvSXRhbGljQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQudGVzdHMuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0SW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dFJlc291cmNlczsKLQotLyoqCi0gKiBUb2dnbGVzIHRoZSAnaXRhbGljJyBhdHRyaWJ1dGUgb2YgdGhlIHNlbGVjdGVkIHRleHQuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgSXRhbGljQWN0aW9uIGV4dGVuZHMgUmljaFRleHRBY3Rpb24gewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgSXRhbGljQWN0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemVzIHRoZSBhY3Rpb24uCi0JICovCi0JcHVibGljIHZvaWQgaW5pdCgpIHsKLQkJc2V0SW1hZ2VEZXNjcmlwdG9yKFJpY2hUZXh0SW1hZ2VzLklNR19ERVNDX0lUQUxJQyk7Ci0JCXNldFRvb2xUaXBUZXh0KFJpY2hUZXh0UmVzb3VyY2VzLml0YWxpY0FjdGlvbl90b29sVGlwVGV4dCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQlpZiAoZWRpdG9yICE9IG51bGwpIHsKLQkJCWVkaXRvci5leGVjdXRlQ29tbWFuZChSaWNoVGV4dENvbW1hbmQuSVRBTElDLCBudWxsKTsKLQkJfQotCi0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvdGVzdHMvYWN0aW9ucy9SaWNoVGV4dEFjdGlvbi5qYXZhIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L3Rlc3RzL2FjdGlvbnMvUmljaFRleHRBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzZhMzJmMC4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvdGVzdHMvYWN0aW9ucy9SaWNoVGV4dEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQudGVzdHMuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC50ZXN0cy5lZGl0b3JzLkhUTUxFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLQotLyoqCi0gKiBUaGUgYWJzdHJhY3QgY2xhc3MgZm9yIGFsbCByaWNoIHRleHQgYWN0aW9ucy4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBSaWNoVGV4dEFjdGlvbiBleHRlbmRzIEFjdGlvbiB7Ci0KLQlwcm90ZWN0ZWQgSFRNTEVkaXRvciBlZGl0b3IgPSBudWxsOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgUmljaFRleHRBY3Rpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JCWluaXQoKTsKLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplcyB0aGUgYWN0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoKSB7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgYWN0aXZlIGVkaXRvci4KLQkgKiAKLQkgKiBAcGFyYW0gYWN0aXZlRWRpdG9yCi0JICogICAgICAgICAgICB0aGUgYWN0aXZlIGVkaXRvcgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFjdGl2ZUVkaXRvcihJRWRpdG9yUGFydCBhY3RpdmVFZGl0b3IpIHsKLQkJaWYgKGFjdGl2ZUVkaXRvciBpbnN0YW5jZW9mIEhUTUxFZGl0b3IpIHsKLQkJCWVkaXRvciA9IChIVE1MRWRpdG9yKSBhY3RpdmVFZGl0b3I7Ci0JCX0KLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvdGVzdHMvYWN0aW9ucy9TdWJzY3JpcHRBY3Rpb24uamF2YSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC90ZXN0cy9hY3Rpb25zL1N1YnNjcmlwdEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNGFiNmEyLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC90ZXN0cy9hY3Rpb25zL1N1YnNjcmlwdEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LnRlc3RzLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dEltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRSZXNvdXJjZXM7Ci0KLS8qKgotICogVG9nZ2xlcyB0aGUgJ2JvbGQnIGF0dHJpYnV0ZSBvZiB0aGUgc2VsZWN0ZWQgdGV4dC4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBTdWJzY3JpcHRBY3Rpb24gZXh0ZW5kcyBSaWNoVGV4dEFjdGlvbiB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBTdWJzY3JpcHRBY3Rpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZXMgdGhlIGFjdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KCkgewotCQlzZXRJbWFnZURlc2NyaXB0b3IoUmljaFRleHRJbWFnZXMuSU1HX0RFU0NfQk9MRCk7Ci0JCXNldFRvb2xUaXBUZXh0KFJpY2hUZXh0UmVzb3VyY2VzLmJvbGRBY3Rpb25fdG9vbFRpcFRleHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJaWYgKGVkaXRvciAhPSBudWxsKSB7Ci0JCQllZGl0b3IuZXhlY3V0ZUNvbW1hbmQoUmljaFRleHRDb21tYW5kLkJPTEQsIG51bGwpOwotCQl9Ci0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC90ZXN0cy9hY3Rpb25zL1VuZGVybGluZUFjdGlvbi5qYXZhIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L3Rlc3RzL2FjdGlvbnMvVW5kZXJsaW5lQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiMGEyNTguLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L3Rlc3RzL2FjdGlvbnMvVW5kZXJsaW5lQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQudGVzdHMuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0SW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dFJlc291cmNlczsKLQotLyoqCi0gKiBUb2dnbGVzIHRoZSAndW5kZXJsaW5lJyBhdHRyaWJ1dGUgb2YgdGhlIHNlbGVjdGVkIHRleHQuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgVW5kZXJsaW5lQWN0aW9uIGV4dGVuZHMgUmljaFRleHRBY3Rpb24gewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgVW5kZXJsaW5lQWN0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemVzIHRoZSBhY3Rpb24uCi0JICovCi0JcHVibGljIHZvaWQgaW5pdCgpIHsKLQkJc2V0SW1hZ2VEZXNjcmlwdG9yKFJpY2hUZXh0SW1hZ2VzLklNR19ERVNDX1VOREVSTElORSk7Ci0JCXNldFRvb2xUaXBUZXh0KFJpY2hUZXh0UmVzb3VyY2VzLnVuZGVybGluZUFjdGlvbl90b29sVGlwVGV4dCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQlpZiAoZWRpdG9yICE9IG51bGwpIHsKLQkJCWVkaXRvci5leGVjdXRlQ29tbWFuZChSaWNoVGV4dENvbW1hbmQuVU5ERVJMSU5FLCBudWxsKTsKLQkJfQotCi0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvdGVzdHMvZWRpdG9ycy9IVE1MRWRpdG9yLmphdmEgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvdGVzdHMvZWRpdG9ycy9IVE1MRWRpdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlMDc1YjkuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L3Rlc3RzL2VkaXRvcnMvSFRNTEVkaXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQudGVzdHMuZWRpdG9yczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5JUmljaFRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LkVkaXRvclBhcnQ7Ci0KLS8qKgotICogQSBIVE1MIGVkaXRvciBidWlsdCB3aXRoIGEgcmljaCB0ZXh0LgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEhUTUxFZGl0b3IgZXh0ZW5kcyBFZGl0b3JQYXJ0IHsKLQotCS8vIFRoZSBSaWNoIFRleHQgY29udHJvbC4KLQlwcml2YXRlIElSaWNoVGV4dCByaWNoVGV4dDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIEhUTUxFZGl0b3IoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5wYXJ0LkVkaXRvclBhcnQjaW5pdChJRWRpdG9yU2l0ZSwgSUVkaXRvcklucHV0KQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSUVkaXRvclNpdGUgc2l0ZSwgSUVkaXRvcklucHV0IGlucHV0KQotCQkJdGhyb3dzIFBhcnRJbml0RXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCXNldFNpdGUoc2l0ZSk7Ci0JCQlzZXRJbnB1dChpbnB1dCk7Ci0JCQlzZXRQYXJ0TmFtZShpbnB1dC5nZXROYW1lKCkpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCi0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5wYXJ0LkVkaXRvclBhcnQjY3JlYXRlUGFydENvbnRyb2woQ29tcG9zaXRlKQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZVBhcnRDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJdHJ5IHsKLQkJCXJpY2hUZXh0ID0gbmV3IFJpY2hUZXh0KHBhcmVudCwgU1dULk5PTkUpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJcmljaFRleHQgPSBudWxsOwotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQjc2V0Rm9jdXMoKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZvY3VzKCkgewotCQlpZiAocmljaFRleHQgIT0gbnVsbCkgewotCQkJcmljaFRleHQuc2V0Rm9jdXMoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGFydC5FZGl0b3JQYXJ0I2Rpc0RpcnR5KCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0RpcnR5KCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5wYXJ0LkVkaXRvclBhcnQjaXNTYXZlQXNBbGxvd2VkKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NhdmVBc0FsbG93ZWQoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBhcnQuRWRpdG9yUGFydCNkb1NhdmUoSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBkb1NhdmUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5wYXJ0LkVkaXRvclBhcnQjZG9TYXZlQXMoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRvU2F2ZUFzKCkgewotCX0KLQotCS8qKgotCSAqIEV4ZWN1dGVzIGEgcmljaCB0ZXh0IGNvbW1hbmQuCi0JICogCi0JICogQHBhcmFtIGNvbW1hbmQKLQkgKiAgICAgICAgICAgIGEgcmljaCB0ZXh0IGNvbW1hbmQgc3RyaW5nCi0JICogQHBhcmFtIHBhcmFtcwotCSAqICAgICAgICAgICAgYSBjb21tYS1kZWxpbWl0ZWQgY29tbWFuZHMgYXNzY2lhdGVkIHdpdGggdGhlIGNvbW1hbmQKLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlQ29tbWFuZChTdHJpbmcgY29tbWFuZCwgU3RyaW5nIHBhcmFtcykgewotCQlpZiAocmljaFRleHQgIT0gbnVsbCkgewotCQkJcmljaFRleHQuZXhlY3V0ZUNvbW1hbmQoY29tbWFuZCwgcGFyYW1zKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L3Rlc3RzL2VkaXRvcnMvSFRNTEVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yLmphdmEgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvdGVzdHMvZWRpdG9ycy9IVE1MRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjE4Y2Q4Mi4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvdGVzdHMvZWRpdG9ycy9IVE1MRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC50ZXN0cy5lZGl0b3JzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LnRlc3RzLmFjdGlvbnMuQm9sZEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQudGVzdHMuYWN0aW9ucy5JdGFsaWNBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LnRlc3RzLmFjdGlvbnMuVW5kZXJsaW5lQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JVG9vbEJhck1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLlNlcGFyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JQWN0aW9uQmFyczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LkVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yOwotCi0vKioKLSAqIEEgSFRNTCBlZGl0b3IgYWN0aW9uIGJhciBjb250cmlidXRvci4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBIVE1MRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3IgZXh0ZW5kcyBFZGl0b3JBY3Rpb25CYXJDb250cmlidXRvciB7Ci0JCi0JcHJpdmF0ZSBJRWRpdG9yUGFydCBlZGl0b3I7Ci0JcHJpdmF0ZSBCb2xkQWN0aW9uIGJvbGRBY3Rpb247Ci0JcHJpdmF0ZSBJdGFsaWNBY3Rpb24gaXRhbGljQWN0aW9uOwotCXByaXZhdGUgVW5kZXJsaW5lQWN0aW9uIHVuZGVybGluZUFjdGlvbjsKLQkKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBIVE1MRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3IoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yI2luaXQoSUFjdGlvbkJhcnMsIElXb3JrYmVuY2hQYWdlKQotCSAqLwotICAgIHB1YmxpYyB2b2lkIGluaXQoSUFjdGlvbkJhcnMgYmFycywgSVdvcmtiZW5jaFBhZ2UgcGFnZSkgewotICAgIAlzdXBlci5pbml0KGJhcnMsIHBhZ2UpOwotICAgIAlib2xkQWN0aW9uID0gbmV3IEJvbGRBY3Rpb24oKTsKLSAgICAJaXRhbGljQWN0aW9uID0gbmV3IEl0YWxpY0FjdGlvbigpOwotICAgIAl1bmRlcmxpbmVBY3Rpb24gPSBuZXcgVW5kZXJsaW5lQWN0aW9uKCk7Ci0gICAgCQotICAgIAlJVG9vbEJhck1hbmFnZXIgdG9vbEJhciA9IGJhcnMuZ2V0VG9vbEJhck1hbmFnZXIoKTsKLSAgICAJCi0gICAgCXRvb2xCYXIuYWRkKGJvbGRBY3Rpb24pOwotICAgIAl0b29sQmFyLmFkZChpdGFsaWNBY3Rpb24pOwotICAgIAl0b29sQmFyLmFkZCh1bmRlcmxpbmVBY3Rpb24pOwotICAgIAl0b29sQmFyLmFkZChuZXcgU2VwYXJhdG9yKCkpOwotICAgIAkKLSAgICB9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklFZGl0b3JBY3Rpb25CYXJDb250cmlidXRvciNzZXRBY3RpdmVFZGl0b3IoSUVkaXRvclBhcnQpCi0JICovCi0gICAgcHVibGljIHZvaWQgc2V0QWN0aXZlRWRpdG9yKElFZGl0b3JQYXJ0IGFjdGl2ZUVkaXRvcikgewotICAgIAllZGl0b3IgPSBhY3RpdmVFZGl0b3I7Ci0gICAgCWJvbGRBY3Rpb24uc2V0QWN0aXZlRWRpdG9yKGVkaXRvcik7Ci0gICAgCWl0YWxpY0FjdGlvbi5zZXRBY3RpdmVFZGl0b3IoZWRpdG9yKTsKLSAgICAJdW5kZXJsaW5lQWN0aW9uLnNldEFjdGl2ZUVkaXRvcihlZGl0b3IpOwotICAgIH0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yI3NldEFjdGl2ZUVkaXRvcihJRWRpdG9yUGFydCkKLQkgKi8KLSAgICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L3Rlc3RzL2VkaXRvcnMvTXVsdGlQYWdlSFRNTEVkaXRvci5qYXZhIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L3Rlc3RzL2VkaXRvcnMvTXVsdGlQYWdlSFRNTEVkaXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNzIwOWM1Li4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC90ZXN0cy9lZGl0b3JzL011bHRpUGFnZUhUTUxFZGl0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExOSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LnRlc3RzLmVkaXRvcnM7Ci0KLS8qKgotICogQSBtdWx0aS1wYWdlIEhUTUwgZWRpdG9yIGJ1aWx0IHdpdGggYSByaWNoIHRleHQgY29udHJvbC4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuSVJpY2hUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBhcnRJbml0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuTXVsdGlQYWdlRWRpdG9yUGFydDsKLQotcHVibGljIGNsYXNzIE11bHRpUGFnZUhUTUxFZGl0b3IgZXh0ZW5kcyBNdWx0aVBhZ2VFZGl0b3JQYXJ0IHsKLQkKLQkvLyBUaGUgUmljaCBUZXh0IGVkaXRvci4KLQlwcml2YXRlIElSaWNoVGV4dCByaWNoVGV4dEVkaXRvcjsKLQkKLQkvLyBUaGUgSFRNTCBzb3VyY2UgZWRpdG9yLgotCXByaXZhdGUgVGV4dCBodG1sRWRpdG9yOwotCQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIE11bHRpUGFnZUhUTUxFZGl0b3IoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGFydC5FZGl0b3JQYXJ0I2luaXQoSUVkaXRvclNpdGUsIElFZGl0b3JJbnB1dCkKLQkgKi8KLSAgICBwdWJsaWMgdm9pZCBpbml0KElFZGl0b3JTaXRlIHNpdGUsIElFZGl0b3JJbnB1dCBpbnB1dCkgdGhyb3dzIFBhcnRJbml0RXhjZXB0aW9uIHsKLSAgICAJc3VwZXIuaW5pdChzaXRlLCBpbnB1dCk7Ci0JICAgIHNldFBhcnROYW1lKGlucHV0LmdldE5hbWUoKSk7CQotICAgIH0KLSAgICAKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBhcnQuTXVsdGlQYWdlRWRpdG9yUGFydCNjcmVhdGVQYWdlKCkKLQkgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVQYWdlcygpIHsKLSAgICAJY3JlYXRlUmljaFRleHRQYWdlKCk7Ci0gICAgCWNyZWF0ZVNvdXJjZVBhZ2UoKTsKLQl9Ci0JCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyB0aGUgUmljaCBUZXh0IHBhZ2UuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlUmljaFRleHRQYWdlKCkgewotCQlyaWNoVGV4dEVkaXRvciA9IG5ldyBSaWNoVGV4dChnZXRDb250YWluZXIoKSwgU1dULk5PTkUpOwotCQlpbnQgaW5kZXggPSBhZGRQYWdlKHJpY2hUZXh0RWRpdG9yLmdldENvbnRyb2woKSk7Ci0JCXNldFBhZ2VUZXh0KGluZGV4LCAiUmljaCBUZXh0Iik7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIENyZWF0ZXMgdGhlIEhUTUwgU291cmNlIHBhZ2UuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlU291cmNlUGFnZSgpIHsKLSAgICAJaHRtbEVkaXRvciA9IG5ldyBUZXh0KGdldENvbnRhaW5lcigpLCBTV1QuTVVMVEkgfCBTV1QuV1JBUCB8IFNXVC5WX1NDUk9MTCk7Ci0JCWludCBpbmRleCA9IGFkZFBhZ2UoaHRtbEVkaXRvcik7Ci0JCXNldFBhZ2VUZXh0KGluZGV4LCAiSFRNTCIpOwotICAgIH0gICAgCi0gICAgCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5wYXJ0Lk11bHRpUGFnZUVkaXRvclBhcnQjcGFnZUNoYW5nZShpbnQpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcGFnZUNoYW5nZShpbnQgbmV3UGFnZUluZGV4KSB7Ci0JCXN1cGVyLnBhZ2VDaGFuZ2UobmV3UGFnZUluZGV4KTsKLQkJc3dpdGNoIChuZXdQYWdlSW5kZXgpIHsKLQkJCWNhc2UgMDoKLQkJCQlyaWNoVGV4dEVkaXRvci5zZXRUZXh0KGh0bWxFZGl0b3IuZ2V0VGV4dCgpKTsJCQkKLQkJCQlicmVhazsKLQkJCWNhc2UgMToKLQkJCQlodG1sRWRpdG9yLnNldFRleHQocmljaFRleHRFZGl0b3IuZ2V0VGV4dCgpKTsJCQkKLQkJCQlicmVhazsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBhcnQuRWRpdG9yUGFydCNkaXNEaXJ0eSgpCi0JICovICAgIAotICAgIHB1YmxpYyBib29sZWFuIGlzRGlydHkoKSB7Ci0gICAgCXJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5wYXJ0LkVkaXRvclBhcnQjaXNTYXZlQXNBbGxvd2VkKCkKLQkgKi8gIAotICAgIHB1YmxpYyBib29sZWFuIGlzU2F2ZUFzQWxsb3dlZCgpIHsKLSAgICAJcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICAKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBhcnQuRWRpdG9yUGFydCNkb1NhdmUoSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLSAgICBwdWJsaWMgdm9pZCBkb1NhdmUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0gICAgfQotICAgIAotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGFydC5FZGl0b3JQYXJ0I2RvU2F2ZUFzKCkKLQkgKi8gICAgCi0gICAgcHVibGljIHZvaWQgZG9TYXZlQXMoKSB7Ci0gICAgfQotICAgIAotfQpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L3Rlc3RzL2VkaXRvcnMvUmljaFRleHRUZXN0RWRpdG9yLmphdmEgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvdGVzdHMvZWRpdG9ycy9SaWNoVGV4dFRlc3RFZGl0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzM0MDk3Ny4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvdGVzdHMvZWRpdG9ycy9SaWNoVGV4dFRlc3RFZGl0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC50ZXN0cy5lZGl0b3JzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LklSaWNoVGV4dFRvb2xCYXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5hY3Rpb25zLkFkZEltYWdlQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5hY3Rpb25zLkFkZExpbmVBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmFjdGlvbnMuQWRkTGlua0FjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuYWN0aW9ucy5BZGRPcmRlcmVkTGlzdEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuYWN0aW9ucy5BZGRUYWJsZUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuYWN0aW9ucy5BZGRVbm9yZGVyZWRMaXN0QWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5hY3Rpb25zLkJsb2NrVGFnQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5hY3Rpb25zLkJvbGRBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmFjdGlvbnMuQ29weUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuYWN0aW9ucy5DdXRBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmFjdGlvbnMuRm9udE5hbWVBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmFjdGlvbnMuRm9udFNpemVBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmFjdGlvbnMuRm9udFN0eWxlQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5hY3Rpb25zLkluZGVudEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuYWN0aW9ucy5JdGFsaWNBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmFjdGlvbnMuSnVzdGlmeUNlbnRlckFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuYWN0aW9ucy5KdXN0aWZ5RnVsbEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuYWN0aW9ucy5KdXN0aWZ5TGVmdEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuYWN0aW9ucy5KdXN0aWZ5UmlnaHRBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmFjdGlvbnMuT3V0ZGVudEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuYWN0aW9ucy5QYXN0ZUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuYWN0aW9ucy5TdWJzY3JpcHRBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmFjdGlvbnMuU3VwZXJzY3JpcHRBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmFjdGlvbnMuVGlkeUFjdGlvbkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5hY3Rpb25zLlVuZGVybGluZUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGU7Ci0KLS8qKgotICogRXh0ZW5kcyB0aGUgYmFzZSByaWNoIHRleHQgZWRpdG9yIGFuZCBwb3B1bGF0ZXMgaXRzIHRvb2wgYmFyIHdpdGggc29tZSB1c2VmdWwKLSAqIGFjdGlvbiBpdGVtcy4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAYXV0aG9yIEplZmYgSGFyZHkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFJpY2hUZXh0VGVzdEVkaXRvciBleHRlbmRzIFJpY2hUZXh0RWRpdG9yIHsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb21wb3NpdGUuCi0JICogQHBhcmFtIHN0eWxlCi0JICogICAgICAgICAgICBUaGUgc3R5bGUgZm9yIHRoZSBjb250cm9sLgotCSAqIEBwYXJhbSBiYXNlUGF0aAotCSAqICAgICAgICAgICAgVGhlIGJhc2UgcGF0aCB1c2VkIGZvciByZXNvbHZpbmcgaHlwZXJsaW5rcyBpbiB0aGUgZWRpdG9yCi0JICogICAgICAgICAgICBjb250ZW50LgotCSAqLwotCXB1YmxpYyBSaWNoVGV4dFRlc3RFZGl0b3IoQ29tcG9zaXRlIHBhcmVudCwgaW50IHN0eWxlLCBJRWRpdG9yU2l0ZSBlZGl0b3JTaXRlKSB7Ci0JCXN1cGVyKHBhcmVudCwgc3R5bGUsIGVkaXRvclNpdGUpOwotCX0KLQotCS8qKgotCSAqIEZpbGxzIHRoZSBSaWNoIFRleHQgZWRpdG9yIHRvb2wgYmFyIHdpdGggYWN0aW9uIGl0ZW1zLgotCSAqIAotCSAqIEBwYXJhbSB0b29sQmFyCi0JICogICAgICAgICAgICBUaGUgUmljaCB0ZXh0IGVkaXRvciB0b29sIGJhci4KLQkgKi8KLQlwdWJsaWMgdm9pZCBmaWxsVG9vbEJhcihJUmljaFRleHRUb29sQmFyIHRvb2xCYXIpIHsKLS8qCQl0b29sQmFyLmFkZEFjdGlvbihuZXcgRm9udFN0eWxlQWN0aW9uKHRoaXMpKTsKLQkJdG9vbEJhci5hZGRBY3Rpb24obmV3IEJsb2NrVGFnQWN0aW9uKCkpOwotCQl0b29sQmFyLmFkZEFjdGlvbihuZXcgRm9udE5hbWVBY3Rpb24odGhpcykpOwotCQl0b29sQmFyLmFkZEFjdGlvbihuZXcgRm9udFNpemVBY3Rpb24odGhpcykpOwotCQl0b29sQmFyLmFkZEFjdGlvbihuZXcgQ3V0QWN0aW9uKHRoaXMpKTsKLQkJdG9vbEJhci5hZGRBY3Rpb24obmV3IENvcHlBY3Rpb24odGhpcykpOwotCQl0b29sQmFyLmFkZEFjdGlvbihuZXcgUGFzdGVBY3Rpb24odGhpcykpOwotCQl0b29sQmFyLmFkZFNlcGFyYXRvcigpOwotCQl0b29sQmFyLmFkZEFjdGlvbihuZXcgQm9sZEFjdGlvbih0aGlzKSk7Ci0JCXRvb2xCYXIuYWRkQWN0aW9uKG5ldyBJdGFsaWNBY3Rpb24odGhpcykpOwotCQl0b29sQmFyLmFkZEFjdGlvbihuZXcgVW5kZXJsaW5lQWN0aW9uKHRoaXMpKTsKLQkJdG9vbEJhci5hZGRTZXBhcmF0b3IoKTsKLQkJdG9vbEJhci5hZGRBY3Rpb24obmV3IFN1YnNjcmlwdEFjdGlvbih0aGlzKSk7Ci0JCXRvb2xCYXIuYWRkQWN0aW9uKG5ldyBTdXBlcnNjcmlwdEFjdGlvbih0aGlzKSk7Ci0JCXRvb2xCYXIuYWRkU2VwYXJhdG9yKCk7Ci0JCXRvb2xCYXIuYWRkQWN0aW9uKG5ldyBUaWR5QWN0aW9uR3JvdXAodGhpcykpOwotCQl0b29sQmFyLmFkZFNlcGFyYXRvcigpOwotCQl0b29sQmFyLmFkZEFjdGlvbihuZXcgSnVzdGlmeUxlZnRBY3Rpb24odGhpcykpOwotCQl0b29sQmFyLmFkZEFjdGlvbihuZXcgSnVzdGlmeUNlbnRlckFjdGlvbih0aGlzKSk7Ci0JCXRvb2xCYXIuYWRkQWN0aW9uKG5ldyBKdXN0aWZ5UmlnaHRBY3Rpb24odGhpcykpOwotCQl0b29sQmFyLmFkZEFjdGlvbihuZXcgSnVzdGlmeUZ1bGxBY3Rpb24odGhpcykpOwotCQl0b29sQmFyLmFkZFNlcGFyYXRvcigpOwotCQl0b29sQmFyLmFkZEFjdGlvbihuZXcgQWRkT3JkZXJlZExpc3RBY3Rpb24odGhpcykpOwotCQl0b29sQmFyLmFkZEFjdGlvbihuZXcgQWRkVW5vcmRlcmVkTGlzdEFjdGlvbih0aGlzKSk7Ci0JCXRvb2xCYXIuYWRkU2VwYXJhdG9yKCk7Ci0JCXRvb2xCYXIuYWRkQWN0aW9uKG5ldyBPdXRkZW50QWN0aW9uKHRoaXMpKTsKLQkJdG9vbEJhci5hZGRBY3Rpb24obmV3IEluZGVudEFjdGlvbih0aGlzKSk7Ci0JCXRvb2xCYXIuYWRkU2VwYXJhdG9yKCk7Ci0JCWlmIChyaWNoVGV4dC5nZXRGaW5kUmVwbGFjZUFjdGlvbigpICE9IG51bGwpCi0JCQl0b29sQmFyLmFkZEFjdGlvbihyaWNoVGV4dC5nZXRGaW5kUmVwbGFjZUFjdGlvbigpKTsKLQkJdG9vbEJhci5hZGRTZXBhcmF0b3IoKTsKLQkJdG9vbEJhci5hZGRBY3Rpb24obmV3IEFkZExpbmVBY3Rpb24odGhpcykpOwotCQl0b29sQmFyLmFkZEFjdGlvbihuZXcgQWRkTGlua0FjdGlvbih0aGlzKSk7Ci0JCXRvb2xCYXIuYWRkQWN0aW9uKG5ldyBBZGRJbWFnZUFjdGlvbih0aGlzKSk7Ci0JCXRvb2xCYXIuYWRkQWN0aW9uKG5ldyBBZGRUYWJsZUFjdGlvbih0aGlzKSk7Ki8KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC90ZXN0cy92aWV3cy9SaWNoVGV4dFRlc3RWaWV3LmphdmEgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvdGVzdHMvdmlld3MvUmljaFRleHRUZXN0Vmlldy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MGY3NzgyLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC90ZXN0cy92aWV3cy9SaWNoVGV4dFRlc3RWaWV3LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LnRlc3RzLnZpZXdzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LklSaWNoVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRJbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmRpYWxvZ3MuQWRkSW1hZ2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmRpYWxvZ3MuQWRkTGlua0RpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuZGlhbG9ncy5BZGRUYWJsZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuaHRtbC5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuaHRtbC5MaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5odG1sLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC50ZXN0cy5hY3Rpb25zLkJsb2NrVGFnQ29udHJpYnV0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC50ZXN0cy5hY3Rpb25zLkZvbnROYW1lQ29udHJpYnV0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC50ZXN0cy5hY3Rpb25zLkZvbnRTaXplQ29udHJpYnV0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklUb29sQmFyTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uU2VwYXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5GaWxsTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklBY3Rpb25CYXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuVmlld1BhcnQ7Ci0KLS8qKgotICogQSB0ZXN0IHZpZXcgY29udGFpbmluZyBhIHJpY2ggdGV4dCBjb250cm9sLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBSaWNoVGV4dFRlc3RWaWV3IGV4dGVuZHMgVmlld1BhcnQgewotCQotCXByaXZhdGUgSVJpY2hUZXh0IHJpY2hUZXh0OwotCQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFJpY2hUZXh0VGVzdFZpZXcoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGFydC5Xb3JrYmVuY2hQYXJ0I2NyZWF0ZVBhcnRDb250cm9sKENvbXBvc2l0ZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVQYXJ0Q29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCQkKLQkJcmljaFRleHQgPSBuZXcgUmljaFRleHQoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWlmIChyaWNoVGV4dCA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCXJpY2hUZXh0LnNldFRleHQoIjxoMz5IZWxsbyBXb3JsZDwvaDM+Iik7Ci0JCQotCQlBY3Rpb24gYm9sZEFjdGlvbiA9IG5ldyBBY3Rpb24oKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJcmljaFRleHQuZXhlY3V0ZUNvbW1hbmQoUmljaFRleHRDb21tYW5kLkJPTEQpOwotCQkJfQotCQl9OwotCQlib2xkQWN0aW9uLnNldEltYWdlRGVzY3JpcHRvcihSaWNoVGV4dEltYWdlcy5JTUdfREVTQ19CT0xEKTsKLQkJCi0JCUFjdGlvbiBpdGFsaWNBY3Rpb24gPSBuZXcgQWN0aW9uKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCXJpY2hUZXh0LmV4ZWN1dGVDb21tYW5kKFJpY2hUZXh0Q29tbWFuZC5JVEFMSUMpOwotCQkJfQotCQl9OwotCQlpdGFsaWNBY3Rpb24uc2V0SW1hZ2VEZXNjcmlwdG9yKFJpY2hUZXh0SW1hZ2VzLklNR19ERVNDX0lUQUxJQyk7CQkKLQkJCi0JCUFjdGlvbiB1bmRlcmxpbmVBY3Rpb24gPSBuZXcgQWN0aW9uKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCXJpY2hUZXh0LmV4ZWN1dGVDb21tYW5kKFJpY2hUZXh0Q29tbWFuZC5VTkRFUkxJTkUpOwotCQkJfQotCQl9OwotCQl1bmRlcmxpbmVBY3Rpb24uc2V0SW1hZ2VEZXNjcmlwdG9yKFJpY2hUZXh0SW1hZ2VzLklNR19ERVNDX1VOREVSTElORSk7Ci0JCQotCQlBY3Rpb24gc3Vic2NyaXB0QWN0aW9uID0gbmV3IEFjdGlvbigpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlyaWNoVGV4dC5leGVjdXRlQ29tbWFuZChSaWNoVGV4dENvbW1hbmQuU1VCU0NSSVBUKTsKLQkJCX0KLQkJfTsKLQkJc3Vic2NyaXB0QWN0aW9uLnNldEltYWdlRGVzY3JpcHRvcihSaWNoVGV4dEltYWdlcy5JTUdfREVTQ19TVUJTQ1JJUFQpOwotCQkKLQkJQWN0aW9uIHN1cGVyc2NyaXB0QWN0aW9uID0gbmV3IEFjdGlvbigpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlyaWNoVGV4dC5leGVjdXRlQ29tbWFuZChSaWNoVGV4dENvbW1hbmQuU1VQRVJTQ1JJUFQpOwotCQkJfQotCQl9OwotCQlzdXBlcnNjcmlwdEFjdGlvbi5zZXRJbWFnZURlc2NyaXB0b3IoUmljaFRleHRJbWFnZXMuSU1HX0RFU0NfU1VQRVJTQ1JJUFQpOwotCQkKLQkJQWN0aW9uIGp1c3RpZnlMZWZ0QWN0aW9uID0gbmV3IEFjdGlvbigpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlyaWNoVGV4dC5leGVjdXRlQ29tbWFuZChSaWNoVGV4dENvbW1hbmQuSlVTVElGWV9MRUZUKTsKLQkJCX0KLQkJfTsKLQkJanVzdGlmeUxlZnRBY3Rpb24uc2V0SW1hZ2VEZXNjcmlwdG9yKFJpY2hUZXh0SW1hZ2VzLklNR19ERVNDX0pVU1RJRllfTEVGVCk7Ci0JCQotCQlBY3Rpb24ganVzdGlmeUNlbnRlckFjdGlvbiA9IG5ldyBBY3Rpb24oKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJcmljaFRleHQuZXhlY3V0ZUNvbW1hbmQoUmljaFRleHRDb21tYW5kLkpVU1RJRllfQ0VOVEVSKTsKLQkJCX0KLQkJfTsKLQkJanVzdGlmeUNlbnRlckFjdGlvbi5zZXRJbWFnZURlc2NyaXB0b3IoUmljaFRleHRJbWFnZXMuSU1HX0RFU0NfSlVTVElGWV9DRU5URVIpOwotCQkKLQkJQWN0aW9uIGp1c3RpZnlSaWdodEFjdGlvbiA9IG5ldyBBY3Rpb24oKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJcmljaFRleHQuZXhlY3V0ZUNvbW1hbmQoUmljaFRleHRDb21tYW5kLkpVU1RJRllfUklHSFQpOwotCQkJfQotCQl9OwotCQlqdXN0aWZ5UmlnaHRBY3Rpb24uc2V0SW1hZ2VEZXNjcmlwdG9yKFJpY2hUZXh0SW1hZ2VzLklNR19ERVNDX0pVU1RJRllfUklHSFQpOwotCQkKLQkJQWN0aW9uIGp1c3RpZnlGdWxsQWN0aW9uID0gbmV3IEFjdGlvbigpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlyaWNoVGV4dC5leGVjdXRlQ29tbWFuZChSaWNoVGV4dENvbW1hbmQuSlVTVElGWV9GVUxMKTsKLQkJCX0KLQkJfTsKLQkJanVzdGlmeUZ1bGxBY3Rpb24uc2V0SW1hZ2VEZXNjcmlwdG9yKFJpY2hUZXh0SW1hZ2VzLklNR19ERVNDX0pVU1RJRllfRlVMTCk7CQkKLQkJCi0JCUFjdGlvbiBhZGRPcmRlcmVkTGlzdEFjdGlvbiA9IG5ldyBBY3Rpb24oKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJcmljaFRleHQuZXhlY3V0ZUNvbW1hbmQoUmljaFRleHRDb21tYW5kLkFERF9PUkRFUkVEX0xJU1QpOwotCQkJfQotCQl9OwotCQlhZGRPcmRlcmVkTGlzdEFjdGlvbi5zZXRJbWFnZURlc2NyaXB0b3IoUmljaFRleHRJbWFnZXMuSU1HX0RFU0NfQUREX09SREVSRURfTElTVCk7Ci0JCQotCQlBY3Rpb24gYWRkVW5vcmRlcmVkTGlzdEFjdGlvbiA9IG5ldyBBY3Rpb24oKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJcmljaFRleHQuZXhlY3V0ZUNvbW1hbmQoUmljaFRleHRDb21tYW5kLkFERF9VTk9SREVSRURfTElTVCk7Ci0JCQl9Ci0JCX07Ci0JCWFkZFVub3JkZXJlZExpc3RBY3Rpb24uc2V0SW1hZ2VEZXNjcmlwdG9yKFJpY2hUZXh0SW1hZ2VzLklNR19ERVNDX0FERF9VTk9SREVSRURfTElTVCk7Ci0JCQotCQlBY3Rpb24gb3V0ZGVudEFjdGlvbiA9IG5ldyBBY3Rpb24oKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJcmljaFRleHQuZXhlY3V0ZUNvbW1hbmQoUmljaFRleHRDb21tYW5kLk9VVERFTlQpOwotCQkJfQotCQl9OwotCQlvdXRkZW50QWN0aW9uLnNldEltYWdlRGVzY3JpcHRvcihSaWNoVGV4dEltYWdlcy5JTUdfREVTQ19PVVRERU5UKTsKLQkJCi0JCUFjdGlvbiBpbmRlbnRBY3Rpb24gPSBuZXcgQWN0aW9uKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCXJpY2hUZXh0LmV4ZWN1dGVDb21tYW5kKFJpY2hUZXh0Q29tbWFuZC5JTkRFTlQpOwotCQkJfQotCQl9OwotCQlpbmRlbnRBY3Rpb24uc2V0SW1hZ2VEZXNjcmlwdG9yKFJpY2hUZXh0SW1hZ2VzLklNR19ERVNDX0lOREVOVCk7Ci0JCQotCQlBY3Rpb24gYWRkTGluZUFjdGlvbiA9IG5ldyBBY3Rpb24oKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJcmljaFRleHQuZXhlY3V0ZUNvbW1hbmQoUmljaFRleHRDb21tYW5kLkFERF9MSU5FKTsKLQkJCX0KLQkJfTsKLQkJYWRkTGluZUFjdGlvbi5zZXRJbWFnZURlc2NyaXB0b3IoUmljaFRleHRJbWFnZXMuSU1HX0RFU0NfQUREX0xJTkUpOwkJCi0JCQotCQlBY3Rpb24gYWRkTGlua0FjdGlvbiA9IG5ldyBBY3Rpb24oKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJQWRkTGlua0RpYWxvZyBkaWFsb2cgPSBuZXcgQWRkTGlua0RpYWxvZyhEaXNwbGF5LmdldEN1cnJlbnQoKS5nZXRBY3RpdmVTaGVsbCgpLCBudWxsKTsKLQkJCQlkaWFsb2cub3BlbigpOwotCQkJCUxpbmsgbGluayA9IGRpYWxvZy5nZXRMaW5rKCk7Ci0JCQkJaWYgKGxpbmsuZ2V0VVJMKCkubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJCXJpY2hUZXh0LmV4ZWN1dGVDb21tYW5kKFJpY2hUZXh0Q29tbWFuZC5BRERfTElOSywgbGluay5nZXRVUkwoKSk7Ci0JCQkJfQotCQkJfQotCQl9OwotCQlhZGRMaW5rQWN0aW9uLnNldEltYWdlRGVzY3JpcHRvcihSaWNoVGV4dEltYWdlcy5JTUdfREVTQ19BRERfTElOSyk7Ci0JCQotCQlBY3Rpb24gYWRkSW1hZ2VBY3Rpb24gPSBuZXcgQWN0aW9uKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCUFkZEltYWdlRGlhbG9nIGRpYWxvZyA9IG5ldyBBZGRJbWFnZURpYWxvZyhEaXNwbGF5LmdldEN1cnJlbnQoKS5nZXRBY3RpdmVTaGVsbCgpKTsKLQkJCQlkaWFsb2cub3BlbigpOwotCQkJCUltYWdlIGltYWdlID0gZGlhbG9nLmdldEltYWdlKCk7Ci0JCQkJaWYgKGltYWdlLmdldFVSTCgpLmxlbmd0aCgpID4gMCkgewotCQkJCQlyaWNoVGV4dC5leGVjdXRlQ29tbWFuZChSaWNoVGV4dENvbW1hbmQuQUREX0lNQUdFLCBpbWFnZS5nZXRVUkwoKSk7Ci0JCQkJfQotCQkJfQotCQl9OwotCQlhZGRJbWFnZUFjdGlvbi5zZXRJbWFnZURlc2NyaXB0b3IoUmljaFRleHRJbWFnZXMuSU1HX0RFU0NfQUREX0lNQUdFKTsKLQkJCi0JCUFjdGlvbiBhZGRUYWJsZUFjdGlvbiA9IG5ldyBBY3Rpb24oKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJQWRkVGFibGVEaWFsb2cgZGlhbG9nID0gbmV3IEFkZFRhYmxlRGlhbG9nKERpc3BsYXkuZ2V0Q3VycmVudCgpLmdldEFjdGl2ZVNoZWxsKCkpOwotCQkJCWRpYWxvZy5vcGVuKCk7Ci0JCQkJVGFibGUgdGFibGUgPSBkaWFsb2cuZ2V0VGFibGUoKTsKLQkJCQlpbnQgcm93cyA9IHRhYmxlLmdldFJvd3MoKTsKLQkJCQlpbnQgY29scyA9IHRhYmxlLmdldENvbHVtbnMoKTsKLQkJCQlTdHJpbmcgd2lkdGggPSB0YWJsZS5nZXRXaWR0aCgpOwotCQkJCWlmIChyb3dzID4gMCAmJiBjb2xzID4gMCkgewotCQkJCQlyaWNoVGV4dC5leGVjdXRlQ29tbWFuZChSaWNoVGV4dENvbW1hbmQuQUREX1RBQkxFLCByb3dzICsgIicsICciICsgY29scyArICInLCAnIiArIHdpZHRoKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJfQotCQkJfQotCQl9OwotCQlhZGRUYWJsZUFjdGlvbi5zZXRJbWFnZURlc2NyaXB0b3IoUmljaFRleHRJbWFnZXMuSU1HX0RFU0NfQUREX1RBQkxFKTsKLQkJCi0JCUlBY3Rpb25CYXJzIGJhcnMgPSBnZXRWaWV3U2l0ZSgpLmdldEFjdGlvbkJhcnMoKTsKLQkJSVRvb2xCYXJNYW5hZ2VyIHRvb2xCYXJNZ3IgPSBiYXJzLmdldFRvb2xCYXJNYW5hZ2VyKCk7Ci0JCQotCQl0b29sQmFyTWdyLmFkZChuZXcgQmxvY2tUYWdDb250cmlidXRpb24ocmljaFRleHQpKTsJCQotCQl0b29sQmFyTWdyLmFkZChuZXcgRm9udE5hbWVDb250cmlidXRpb24ocmljaFRleHQpKTsKLQkJdG9vbEJhck1nci5hZGQobmV3IEZvbnRTaXplQ29udHJpYnV0aW9uKHJpY2hUZXh0KSk7CQkKLQkJCi0JCXRvb2xCYXJNZ3IuYWRkKGJvbGRBY3Rpb24pOwotCQl0b29sQmFyTWdyLmFkZChpdGFsaWNBY3Rpb24pOwotCQl0b29sQmFyTWdyLmFkZCh1bmRlcmxpbmVBY3Rpb24pOwotCQl0b29sQmFyTWdyLmFkZChuZXcgU2VwYXJhdG9yKCkpOwotCQl0b29sQmFyTWdyLmFkZChzdWJzY3JpcHRBY3Rpb24pOwkJCi0JCXRvb2xCYXJNZ3IuYWRkKHN1cGVyc2NyaXB0QWN0aW9uKTsKLQkJdG9vbEJhck1nci5hZGQobmV3IFNlcGFyYXRvcigpKTsKLQkJdG9vbEJhck1nci5hZGQoanVzdGlmeUxlZnRBY3Rpb24pOwotCQl0b29sQmFyTWdyLmFkZChqdXN0aWZ5Q2VudGVyQWN0aW9uKTsKLQkJdG9vbEJhck1nci5hZGQoanVzdGlmeVJpZ2h0QWN0aW9uKTsKLQkJdG9vbEJhck1nci5hZGQoanVzdGlmeUZ1bGxBY3Rpb24pOwotCQl0b29sQmFyTWdyLmFkZChuZXcgU2VwYXJhdG9yKCkpOwkJCi0JCXRvb2xCYXJNZ3IuYWRkKGFkZE9yZGVyZWRMaXN0QWN0aW9uKTsKLQkJdG9vbEJhck1nci5hZGQoYWRkVW5vcmRlcmVkTGlzdEFjdGlvbik7Ci0JCXRvb2xCYXJNZ3IuYWRkKG5ldyBTZXBhcmF0b3IoKSk7CQkKLQkJdG9vbEJhck1nci5hZGQob3V0ZGVudEFjdGlvbik7Ci0JCXRvb2xCYXJNZ3IuYWRkKGluZGVudEFjdGlvbik7Ci0JCXRvb2xCYXJNZ3IuYWRkKG5ldyBTZXBhcmF0b3IoKSk7Ci0JCXRvb2xCYXJNZ3IuYWRkKGFkZExpbmVBY3Rpb24pOwkJCi0JCXRvb2xCYXJNZ3IuYWRkKGFkZExpbmtBY3Rpb24pOwotCQl0b29sQmFyTWdyLmFkZChhZGRJbWFnZUFjdGlvbik7Ci0JCXRvb2xCYXJNZ3IuYWRkKGFkZFRhYmxlQWN0aW9uKTsKLQkJdG9vbEJhck1nci5hZGQobmV3IFNlcGFyYXRvcigpKTsJCQotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBhcnQuV29ya2JlbmNoUGFydCNzZXRGb2N1cygpCi0JICovCi0JcHVibGljIHZvaWQgc2V0Rm9jdXMoKSB7Ci0JCWlmIChyaWNoVGV4dCAhPSBudWxsKSB7Ci0JCQlyaWNoVGV4dC5zZXRGb2N1cygpOwotCQl9Ci0JfQotCQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYudGVzdHMuZmVhdHVyZS8ucHJvamVjdCBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYudGVzdHMuZmVhdHVyZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGY0M2M0Yi4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLnRlc3RzLmZlYXR1cmUvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5lcGYudGVzdHMuZmVhdHVyZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVOYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYudGVzdHMuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi50ZXN0cy5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxNGY2ZjEuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi50ZXN0cy5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1iaW4uaW5jbHVkZXMgPQpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi50ZXN0cy5mZWF0dXJlL2ZlYXR1cmUueG1sIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi50ZXN0cy5mZWF0dXJlL2ZlYXR1cmUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYzY0YTM2Li4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYudGVzdHMuZmVhdHVyZS9mZWF0dXJlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZmVhdHVyZQotICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi50ZXN0cy5mZWF0dXJlIgotICAgICAgbGFiZWw9IkVQRiBUZXN0cyBGZWF0dXJlIgotICAgICAgdmVyc2lvbj0iMS41LjAiPgotCi0gICA8ZGVzY3JpcHRpb24gdXJsPSJodHRwOi8vd3d3LmV4YW1wbGUuY29tL2Rlc2NyaXB0aW9uIj4KLSAgICAgIFtFbnRlciBGZWF0dXJlIERlc2NyaXB0aW9uIGhlcmUuXQotICAgPC9kZXNjcmlwdGlvbj4KLQotICAgPGNvcHlyaWdodCB1cmw9Imh0dHA6Ly93d3cuZXhhbXBsZS5jb20vY29weXJpZ2h0Ij4KLSAgICAgIFtFbnRlciBDb3B5cmlnaHQgRGVzY3JpcHRpb24gaGVyZS5dCi0gICA8L2NvcHlyaWdodD4KLQotICAgPGxpY2Vuc2UgdXJsPSJodHRwOi8vd3d3LmV4YW1wbGUuY29tL2xpY2Vuc2UiPgotICAgICAgW0VudGVyIExpY2Vuc2UgRGVzY3JpcHRpb24gaGVyZS5dCi0gICA8L2xpY2Vuc2U+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnRlc3RzIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0udGVzdHMiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC50ZXN0cyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi50ZXN0cyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi08L2ZlYXR1cmU+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLnRlc3RzLy5jbGFzc3BhdGggYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLnRlc3RzLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1MWM4ZjIuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi50ZXN0cy8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi50ZXN0cy8ucHJvamVjdCBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYudGVzdHMvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlMTE2OGQuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi50ZXN0cy8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmVwZi50ZXN0czwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLnRlc3RzL01FVEEtSU5GL01BTklGRVNULk1GIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi50ZXN0cy9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzg4ZmYzOS4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLnRlc3RzL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogRVBGIFRlc3RzIFBsdWctaW4KLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmVwZi50ZXN0cwotQnVuZGxlLVZlcnNpb246IDEuNS4wCi1CdW5kbGUtVmVuZG9yOiBFY2xpcHNlLm9yZwotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmp1bml0LAotIG9yZy5lY2xpcHNlLmVwZi5jb21tb24udGVzdHMsCi0gb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMsCi0gb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aQpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi50ZXN0cy9idWlsZC5wcm9wZXJ0aWVzIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi50ZXN0cy9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OTFjZThjLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYudGVzdHMvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotc291cmNlLmVwZnRlc3RzLmphciA9IHNyYy8KLW91dHB1dC5lcGZ0ZXN0cy5qYXIgPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgZXBmdGVzdHMuamFyCmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvdGVzdHMvQWxsVGVzdHMuamF2YSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi90ZXN0cy9BbGxUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MzE1ZWY3Li4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi90ZXN0cy9BbGxUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnRlc3RzOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udGVzdHMuQ29tbW9uVGVzdHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMuTGlicmFyeVRlc3RzOwotCi0vKioKLSAqIEpVbml0IFRlc3RzIGZvciBFUEYgQ29tcG9zZXIuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQWxsVGVzdHMgewotCi0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKEFsbFRlc3RzLmNsYXNzLmdldFBhY2thZ2UoKS5nZXROYW1lKCkpOwotCQkvLyRKVW5pdC1CRUdJTiQJCQotCQlzdWl0ZS5hZGRUZXN0KENvbW1vblRlc3RzLnN1aXRlKCkpOwotCQlzdWl0ZS5hZGRUZXN0KExpYnJhcnlUZXN0cy5zdWl0ZSgpKTsJCQotCQkvLyRKVW5pdC1FTkQkCQkKLQkJcmV0dXJuIHN1aXRlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL3Rlc3RzL3VpL1VzZXJJbnRlcmFjdGlvbkhhbmRsZXJUZXN0LmphdmEgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvdGVzdHMvdWkvVXNlckludGVyYWN0aW9uSGFuZGxlclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGQ5M2Q1Yy4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvdGVzdHMvdWkvVXNlckludGVyYWN0aW9uSGFuZGxlclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudGVzdHMudWk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5NdWx0aVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JVXNlckludGVyYWN0aW9uSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuVXNlcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JVXNlckludGVyYWN0aW9uSGFuZGxlci5JTWVzc2VuZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5FeHRlbnNpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5JdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy5UZXN0c1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkVycm9yRGlhbG9nOwotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlIC0gT2N0IDI3LCAyMDA2Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBVc2VySW50ZXJhY3Rpb25IYW5kbGVyVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQotCS8qKgotCSAqIFRlc3QgbWV0aG9kIGZvcgotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnMuVXNlckludGVyYWN0aW9uSGFuZGxlciNzZWxlY3QoamF2YS51dGlsLkxpc3QsIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXIsIGJvb2xlYW4sIGphdmEudXRpbC5MaXN0LCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nKX0uCi0JICovCi0JcHVibGljIHZvaWQgdGVzdFNlbGVjdCgpIHsKLQkJZmFpbCgiTm90IHlldCBpbXBsZW1lbnRlZCIpOwotCX0KLQotCS8qKgotCSAqIFRlc3QgbWV0aG9kIGZvcgotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnMuVXNlckludGVyYWN0aW9uSGFuZGxlciNzZWxlY3RPbmUoaW50W10sIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcsIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzKX0uCi0JICovCi0JcHVibGljIHZvaWQgdGVzdFNlbGVjdE9uZSgpIHsKLQkJZmFpbCgiTm90IHlldCBpbXBsZW1lbnRlZCIpOwotCX0KLQotCS8qKgotCSAqIFRlc3QgbWV0aG9kIGZvcgotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnMuVXNlckludGVyYWN0aW9uSGFuZGxlciNyZXF1ZXN0SW5wdXQoamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZywgamF2YS51dGlsLkxpc3QpfS4KLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0UmVxdWVzdElucHV0KCkgewotCQlMaXN0IGlucHV0cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yKGludCBpPTA7IGk8MjsgaSsrKXsKLQkJCUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWxpc3QuYWRkKCJJdGVtMSIpOwotCQkJbGlzdC5hZGQoIkl0ZW0yIik7Ci0JCQlVc2VySW5wdXQgaW5wdXQgPSBuZXcgVXNlcklucHV0KCJMYWJlbCBOYW1lIitpLCBpLCB0cnVlLCBsaXN0LAotCQkJCQkJCW5ldyBJdGVtTGFiZWxQcm92aWRlcigpLCBudWxsLCBudWxsKTsKLQkJCWlucHV0cy5hZGQoaW5wdXQpOwotCQl9Ci0JCQotCQlJVXNlckludGVyYWN0aW9uSGFuZGxlciB1aUhhbmRsZXIgPSBFeHRlbnNpb25NYW5hZ2VyCi0JCS5nZXREZWZhdWx0VXNlckludGVyYWN0aW9uSGFuZGxlcigpOwotCQl1aUhhbmRsZXIucmVxdWVzdElucHV0KCJUZXN0aW5nIFRpdGxlIiwgIk5pY2UgbWVzc2FnZSIsIGlucHV0cyk7Ci0JCQotCQlmb3IoSXRlcmF0b3IgaXQgPSBpbnB1dHMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOyl7Ci0JCQlPYmplY3Qgb3ggPSBpdC5uZXh0KCk7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oInByaW50IDogIisgKChVc2VySW5wdXQpb3gpLmdldElucHV0KCkpOwotCQl9Ci0JCS8vZmFpbCgiTm90IHlldCBpbXBsZW1lbnRlZCIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNZXNzZW5nZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSVVzZXJJbnRlcmFjdGlvbkhhbmRsZXIgdWlIYW5kbGVyID0gRXh0ZW5zaW9uTWFuYWdlcgotCQkJCS5nZXREZWZhdWx0VXNlckludGVyYWN0aW9uSGFuZGxlcigpOwotCi0JCUlNZXNzZW5nZXIgbWVzc2VuZ2VyID0gdWlIYW5kbGVyLmdldE1lc3NlbmdlcigpOwotCi0JCS8vIFdlIGFyZSB0ZXN0aW5nIG1lc3NhZ2UgZGlhbG9ncyBidXQgRXJyb3JEaWFsb2cuQVVUT01BVEVEX01PREUgaXMgc2V0Ci0JCS8vIHRvIHRydWUgYnkgRWNsaXBzZSB3aGlsZSBydW5uaW5nIEpVbml0IHRlc3QuIFNvIHdlIHNldCB0aGlzIGZsYWcKLQkJLy8gYmFjayB0byBmYWxzZS4KLQkJLy8KLQkJRXJyb3JEaWFsb2cuQVVUT01BVEVEX01PREUgPSBmYWxzZTsKLQotCQkvLyB0ZXN0IHNob3dFcnJvcihTdHJpbmcgdGl0bGUsIFN0cmluZyBtc2cpOwotCQkvLwotCQltZXNzZW5nZXIuc2hvd0Vycm9yKCJ0aXRsZSIsICJtZXNzYWdlIik7Ci0JCW1lc3Nlbmdlci5zaG93RXJyb3IobnVsbCwgIk5VTEwgdGl0bGUiKTsKLQkJbWVzc2VuZ2VyLnNob3dFcnJvcihudWxsLCBudWxsKTsKLQotCQkvLyB0ZXN0IHNob3dFcnJvcihTdHJpbmcgdGl0bGUsIFN0cmluZyBtc2csIElTdGF0dXMgc3RhdHVzKQotCQkvLwotCQltZXNzZW5nZXIuc2hvd0Vycm9yKCJ0aXRsZSIsICJOVUwgc3RhdHVzIiwgbnVsbCk7Ci0JCVN0cmluZyBwbHVnaW5JRCA9IFRlc3RzUGx1Z2luLlBMVUdJTl9JRDsKLQkJbWVzc2VuZ2VyLnNob3dFcnJvcigidGl0bGUiLCAibWVzc2FnZSIsIG5ldyBTdGF0dXMoSVN0YXR1cy5PSywKLQkJCQlwbHVnaW5JRCwgMCwgIk9LIHN0YXR1cyIsIG51bGwpKTsKLQkJbWVzc2VuZ2VyLnNob3dFcnJvcigidGl0bGUiLCAibWVzc2FnZSIsIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwKLQkJCQlwbHVnaW5JRCwgMCwgIkVSUk9SIHN0YXR1cyIsIG5ldyBSdW50aW1lRXhjZXB0aW9uKAotCQkJCQkJInJ1bnRpbWUgZXhjZXB0aW9uIikpKTsKLQkJTXVsdGlTdGF0dXMgc3RhdHVzID0gbmV3IE11bHRpU3RhdHVzKHBsdWdpbklELCAwLCAiIiwgbnVsbCk7Ci0JCXN0YXR1cy5hZGQobmV3IFN0YXR1cyhJU3RhdHVzLk9LLCBwbHVnaW5JRCwgMCwgIk9LIHN0YXR1cyIsIG51bGwpKTsKLQkJc3RhdHVzLmFkZChuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIHBsdWdpbklELCAwLCAiRVJST1Igc3RhdHVzIiwKLQkJCQluZXcgUnVudGltZUV4Y2VwdGlvbigicnVudGltZSBleGNlcHRpb24iKSkpOwotCQltZXNzZW5nZXIuc2hvd0Vycm9yKCJ0aXRsZSIsICJtZXNzYWdlIiwgc3RhdHVzKTsKLQl9Ci19Cg==